ZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmFzZS90b2tlbnMuaCBiL3NyYy9jb2JhbHQvYmFzZS90b2tlbnMuaAppbmRleCA5NDczZTM2Li44OTFjNGE2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jhc2UvdG9rZW5zLmgKKysrIGIvc3JjL2NvYmFsdC9iYXNlL3Rva2Vucy5oCkBAIC00Myw2ICs0Myw3IEBACiAgICAgTWFjcm9PcFdpdGhOYW1lT25seShhbmltYXRpb25lbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgTWFjcm9PcFdpdGhOYW1lT25seShhc3NlcnRpdmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgTWFjcm9PcFdpdGhOYW1lT25seShhdHRyaWJ1dGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTWFjcm9PcFdpdGhOYW1lT25seShiZWZvcmV1bmxvYWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgTWFjcm9PcFdpdGhOYW1lT25seShibHVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgTWFjcm9PcFdpdGhOYW1lT25seShib3VuZGFyeSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgTWFjcm9PcFdpdGhOYW1lT25seShjYW5wbGF5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvYXBwbGljYXRpb24uY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvYXBwbGljYXRpb24uY2MKaW5kZXggOWY4NTVjYS4uMmFjNTUwNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL2FwcGxpY2F0aW9uLmNjCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9hcHBsaWNhdGlvbi5jYwpAQCAtOTMsMTYgKzkzLDE2IEBACiAjZW5kaWYgIC8vIEVOQUJMRV9SRU1PVEVfREVCVUdHSU5HCiAKICNpZiBkZWZpbmVkKEVOQUJMRV9XRUJEUklWRVIpCi0jaWYgZGVmaW5lZChFTkFCTEVfREVCVUdfQ09NTUFORF9MSU5FX1NXSVRDSEVTKQogaW50IEdldFdlYkRyaXZlclBvcnQoKSB7CiAgIC8vIFRoZSBkZWZhdWx0IHBvcnQgb24gd2hpY2ggdGhlIHdlYmRyaXZlciBzZXJ2ZXIgc2hvdWxkIGxpc3RlbiBmb3IgaW5jb21pbmcKICAgLy8gY29ubmVjdGlvbnMuCiAjaWYgZGVmaW5lZChTQl9PVkVSUklERV9ERUZBVUxUX1dFQkRSSVZFUl9QT1JUKQogICBjb25zdCBpbnQga0RlZmF1bHRXZWJEcml2ZXJQb3J0ID0gU0JfT1ZFUlJJREVfREVGQVVMVF9XRUJEUklWRVJfUE9SVDsKICNlbHNlCi0gIGNvbnN0IGludCBrRGVmYXVsdFdlYkRyaXZlclBvcnQgPSA5NTE1OworICBjb25zdCBpbnQga0RlZmF1bHRXZWJEcml2ZXJQb3J0ID0gNDQ0NDsKICNlbmRpZiAgLy8gZGVmaW5lZChTQl9PVkVSUklERV9ERUZBVUxUX1dFQkRSSVZFUl9QT1JUKQogICBpbnQgd2ViZHJpdmVyX3BvcnQgPSBrRGVmYXVsdFdlYkRyaXZlclBvcnQ7CisjaWYgZGVmaW5lZChFTkFCTEVfREVCVUdfQ09NTUFORF9MSU5FX1NXSVRDSEVTKQogICBDb21tYW5kTGluZSogY29tbWFuZF9saW5lID0gQ29tbWFuZExpbmU6OkZvckN1cnJlbnRQcm9jZXNzKCk7CiAgIGlmIChjb21tYW5kX2xpbmUtPkhhc1N3aXRjaChzd2l0Y2hlczo6a1dlYkRyaXZlclBvcnQpKSB7CiAgICAgaWYgKCFiYXNlOjpTdHJpbmdUb0ludCgKQEAgLTExNCwyMiArMTE0LDI0IEBACiAgICAgICB3ZWJkcml2ZXJfcG9ydCA9IGtEZWZhdWx0V2ViRHJpdmVyUG9ydDsKICAgICB9CiAgIH0KKyNlbmRpZiAgLy8gRU5BQkxFX0RFQlVHX0NPTU1BTkRfTElORV9TV0lUQ0hFUwogICByZXR1cm4gd2ViZHJpdmVyX3BvcnQ7CiB9CiAKIHN0ZDo6c3RyaW5nIEdldFdlYkRyaXZlckxpc3RlbklwKCkgewotICAvLyBUaGUgZGVmYXVsdCBwb3J0IG9uIHdoaWNoIHRoZSB3ZWJkcml2ZXIgc2VydmVyIHNob3VsZCBsaXN0ZW4gZm9yIGluY29taW5nCisgIC8vIFRoZSBkZWZhdWx0IElQIG9uIHdoaWNoIHRoZSB3ZWJkcml2ZXIgc2VydmVyIHNob3VsZCBsaXN0ZW4gZm9yIGluY29taW5nCiAgIC8vIGNvbm5lY3Rpb25zLgogICBzdGQ6OnN0cmluZyB3ZWJkcml2ZXJfbGlzdGVuX2lwID0KICAgICAgIHdlYmRyaXZlcjo6V2ViRHJpdmVyTW9kdWxlOjprRGVmYXVsdExpc3RlbklwOworI2lmIGRlZmluZWQoRU5BQkxFX0RFQlVHX0NPTU1BTkRfTElORV9TV0lUQ0hFUykKICAgQ29tbWFuZExpbmUqIGNvbW1hbmRfbGluZSA9IENvbW1hbmRMaW5lOjpGb3JDdXJyZW50UHJvY2VzcygpOwogICBpZiAoY29tbWFuZF9saW5lLT5IYXNTd2l0Y2goc3dpdGNoZXM6OmtXZWJEcml2ZXJMaXN0ZW5JcCkpIHsKICAgICB3ZWJkcml2ZXJfbGlzdGVuX2lwID0KICAgICAgICAgY29tbWFuZF9saW5lLT5HZXRTd2l0Y2hWYWx1ZUFTQ0lJKHN3aXRjaGVzOjprV2ViRHJpdmVyTGlzdGVuSXApOwogICB9CisjZW5kaWYgIC8vIEVOQUJMRV9ERUJVR19DT01NQU5EX0xJTkVfU1dJVENIRVMKICAgcmV0dXJuIHdlYmRyaXZlcl9saXN0ZW5faXA7CiB9Ci0jZW5kaWYgIC8vIEVOQUJMRV9ERUJVR19DT01NQU5EX0xJTkVfU1dJVENIRVMKICNlbmRpZiAgLy8gRU5BQkxFX1dFQkRSSVZFUgogCiBHVVJMIEdldEluaXRpYWxVUkwoKSB7CkBAIC02MjUsNyArNjI3LDEyIEBACiAKICNpZiBkZWZpbmVkKEVOQUJMRV9XRUJEUklWRVIpCiAjaWYgZGVmaW5lZChFTkFCTEVfREVCVUdfQ09NTUFORF9MSU5FX1NXSVRDSEVTKQotICBpZiAoY29tbWFuZF9saW5lLT5IYXNTd2l0Y2goc3dpdGNoZXM6OmtFbmFibGVXZWJEcml2ZXIpKSB7CisgIGJvb2wgY3JlYXRlX3dlYmRyaXZlcl9tb2R1bGUgPQorICAgICAgIWNvbW1hbmRfbGluZS0+SGFzU3dpdGNoKHN3aXRjaGVzOjprRGlzYWJsZVdlYkRyaXZlcik7CisjZWxzZQorICBib29sIGNyZWF0ZV93ZWJkcml2ZXJfbW9kdWxlID0gdHJ1ZTsKKyNlbmRpZiAgLy8gRU5BQkxFX0RFQlVHX0NPTU1BTkRfTElORV9TV0lUQ0hFUworICBpZiAoY3JlYXRlX3dlYmRyaXZlcl9tb2R1bGUpIHsKICAgICB3ZWJfZHJpdmVyX21vZHVsZV8ucmVzZXQobmV3IHdlYmRyaXZlcjo6V2ViRHJpdmVyTW9kdWxlKAogICAgICAgICBHZXRXZWJEcml2ZXJQb3J0KCksIEdldFdlYkRyaXZlckxpc3RlbklwKCksCiAgICAgICAgIGJhc2U6OkJpbmQoJkJyb3dzZXJNb2R1bGU6OkNyZWF0ZVNlc3Npb25Ecml2ZXIsCkBAIC02MzYsNyArNjQzLDYgQEAKICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKGJyb3dzZXJfbW9kdWxlXy5nZXQoKSkpLAogICAgICAgICBiYXNlOjpCaW5kKCZBcHBsaWNhdGlvbjo6UXVpdCwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpKTsKICAgfQotI2VuZGlmICAvLyBFTkFCTEVfREVCVUdfQ09NTUFORF9MSU5FX1NXSVRDSEVTCiAjZW5kaWYgIC8vIEVOQUJMRV9XRUJEUklWRVIKIAogI2lmIGRlZmluZWQoRU5BQkxFX1JFTU9URV9ERUJVR0dJTkcpCkBAIC03MjQsNiArNzMwLDkgQEAKICAgICBjYXNlIGtTYkV2ZW50VHlwZVVucGF1c2U6CiAgICAgY2FzZSBrU2JFdmVudFR5cGVTdXNwZW5kOgogICAgIGNhc2Uga1NiRXZlbnRUeXBlUmVzdW1lOgorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0xPV19NRU1PUllfRVZFTlRfQVBJX1ZFUlNJT04KKyAgICBjYXNlIGtTYkV2ZW50VHlwZUxvd01lbW9yeToKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfTE9XX01FTU9SWV9FVkVOVF9BUElfVkVSU0lPTgogICAgICAgT25BcHBsaWNhdGlvbkV2ZW50KHN0YXJib2FyZF9ldmVudC0+dHlwZSk7CiAgICAgICBicmVhazsKICAgICBjYXNlIGtTYkV2ZW50VHlwZU5ldHdvcmtDb25uZWN0OgpAQCAtNzM5LDExICs3NDgsOSBAQAogICAgICAgRGlzcGF0Y2hFdmVudEludGVybmFsKG5ldyBiYXNlOjpEZWVwTGlua0V2ZW50KGxpbmspKTsKICAgICAgIGJyZWFrOwogICAgIH0KLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAgICAgY2FzZSBrU2JFdmVudFR5cGVBY2Nlc3NpYmxpdHlTZXR0aW5nc0NoYW5nZWQ6CiAgICAgICBEaXNwYXRjaEV2ZW50SW50ZXJuYWwobmV3IGJhc2U6OkFjY2Vzc2liaWxpdHlTZXR0aW5nc0NoYW5nZWRFdmVudCgpKTsKICAgICAgIGJyZWFrOwotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiAgICAgZGVmYXVsdDoKICAgICAgIERMT0coV0FSTklORykgPDwgIlVuaGFuZGxlZCBTdGFyYm9hcmQgZXZlbnQgb2YgdHlwZTogIgogICAgICAgICAgICAgICAgICAgICA8PCBzdGFyYm9hcmRfZXZlbnQtPnR5cGU7CkBAIC04MTUsNiArODIyLDEzIEBACiAgICAgICBicm93c2VyX21vZHVsZV8tPlJlc3VtZSgpOwogICAgICAgRExPRyhJTkZPKSA8PCAiRmluaXNoZWQgcmVzdW1pbmcuIjsKICAgICAgIGJyZWFrOworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0xPV19NRU1PUllfRVZFTlRfQVBJX1ZFUlNJT04KKyAgICBjYXNlIGtTYkV2ZW50VHlwZUxvd01lbW9yeToKKyAgICAgIERMT0coSU5GTykgPDwgIkdvdCBsb3cgbWVtb3J5IGV2ZW50LiI7CisgICAgICBicm93c2VyX21vZHVsZV8tPlJlZHVjZU1lbW9yeSgpOworICAgICAgRExPRyhJTkZPKSA8PCAiRmluaXNoZWQgcmVkdWNpbmcgbWVtb3J5IHVzYWdlLiI7CisgICAgICBicmVhazsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfTE9XX01FTU9SWV9FVkVOVF9BUElfVkVSU0lPTgogICAgIGRlZmF1bHQ6CiAgICAgICBOT1RSRUFDSEVEKCkgPDwgIlVuZXhwZWN0ZWQgZXZlbnQgdHlwZTogIiA8PCBldmVudF90eXBlOwogICAgICAgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfYmluZGluZ3NfZ2VuLmd5cCBiL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyX2JpbmRpbmdzX2dlbi5neXAKaW5kZXggY2YyYmE3Mi4uNDFmNDkzNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfYmluZGluZ3NfZ2VuLmd5cAorKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9iaW5kaW5nc19nZW4uZ3lwCkBAIC02NSw2ICs2NSw3IEBACiAgICAgICAgICcuLi9kb20vY29tbWVudC5pZGwnLAogICAgICAgICAnLi4vZG9tL2NvbnNvbGUuaWRsJywKICAgICAgICAgJy4uL2RvbS9jcnlwdG8uaWRsJywKKyAgICAgICAgJy4uL2RvbS9jdXN0b21fZXZlbnQuaWRsJywKICAgICAgICAgJy4uL2RvbS9kYXRhX3ZpZXcuaWRsJywKICAgICAgICAgJy4uL2RvbS9kZXZpY2Vfb3JpZW50YXRpb25fZXZlbnQuaWRsJywKICAgICAgICAgJy4uL2RvbS9kb2N1bWVudC5pZGwnLApAQCAtNzksNiArODAsNyBAQAogICAgICAgICAnLi4vZG9tL2RvbV9zdHJpbmdfbWFwLmlkbCcsCiAgICAgICAgICcuLi9kb20vZG9tX3Rva2VuX2xpc3QuaWRsJywKICAgICAgICAgJy4uL2RvbS9lbGVtZW50LmlkbCcsCisgICAgICAgICcuLi9kb20vZXJyb3JfZXZlbnQuaWRsJywKICAgICAgICAgJy4uL2RvbS9ldmVudC5pZGwnLAogICAgICAgICAnLi4vZG9tL2V2ZW50X2xpc3RlbmVyLmlkbCcsCiAgICAgICAgICcuLi9kb20vZXZlbnRfdGFyZ2V0LmlkbCcsCkBAIC0yMTksOSArMjIxLDExIEBACiAgICAgICAgICcuLi9hdWRpby9hdWRpb19ub2RlX2NoYW5uZWxfY291bnRfbW9kZS5pZGwnLAogICAgICAgICAnLi4vYXVkaW8vYXVkaW9fbm9kZV9jaGFubmVsX2ludGVycHJldGF0aW9uLmlkbCcsCiAgICAgICAgICcuLi9kb20vYmxvYl9wcm9wZXJ0eV9iYWcuaWRsJywKKyAgICAgICAgJy4uL2RvbS9jdXN0b21fZXZlbnRfaW5pdC5pZGwnLAogICAgICAgICAnLi4vZG9tL2RldmljZV9vcmllbnRhdGlvbl9ldmVudF9pbml0LmlkbCcsCiAgICAgICAgICcuLi9kb20vZG9jdW1lbnRfcmVhZHlfc3RhdGUuaWRsJywKICAgICAgICAgJy4uL2RvbS9kb21fcGFyc2VyX3N1cHBvcnRlZF90eXBlLmlkbCcsCisgICAgICAgICcuLi9kb20vZXJyb3JfZXZlbnRfaW5pdC5pZGwnLAogICAgICAgICAnLi4vZG9tL2V2ZW50X2luaXQuaWRsJywKICAgICAgICAgJy4uL2RvbS9ldmVudF9tb2RpZmllcl9pbml0LmlkbCcsCiAgICAgICAgICcuLi9kb20vZm9jdXNfZXZlbnRfaW5pdC5pZGwnLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfbW9kdWxlLmNjIGIvc3JjL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfbW9kdWxlLmNjCmluZGV4IGE5ZWI1MjAuLmNmYzRhNDUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyX21vZHVsZS5jYworKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9tb2R1bGUuY2MKQEAgLTExMSw4ICsxMTEsMTMgQEAKIAogLy8gVE9ETzogU3Vic2NyaWJlIHRvIHZpZXdwb3J0IHNpemUgY2hhbmdlcy4KIAorY29uc3QgaW50IGtNYWluV2ViTW9kdWxlWkluZGV4ID0gMTsKK2NvbnN0IGludCBrU3BsYXNoU2NyZWVuWkluZGV4ID0gMjsKKwogI2lmIGRlZmluZWQoRU5BQkxFX0RFQlVHX0NPTlNPTEUpCiAKK2NvbnN0IGludCBrRGVidWdDb25zb2xlWkluZGV4ID0gMzsKKwogY29uc3QgY2hhciBrRnV6emVyVG9nZ2xlQ29tbWFuZFtdID0gImZ1enplcl90b2dnbGUiOwogY29uc3QgY2hhciBrRnV6emVyVG9nZ2xlQ29tbWFuZFNob3J0SGVscFtdID0gIlRvZ2dsZXMgdGhlIGlucHV0IGZ1enplciBvbi9vZmYuIjsKIGNvbnN0IGNoYXIga0Z1enplclRvZ2dsZUNvbW1hbmRMb25nSGVscFtdID0KQEAgLTIxMSw5ICsyMTYsNyBAQAogICAgICAgc3RvcmFnZV9tYW5hZ2VyXyhtYWtlX3Njb3BlZF9wdHIobmV3IFN0b3JhZ2VVcGdyYWRlSGFuZGxlcih1cmwpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLlBhc3NBczxzdG9yYWdlOjpTdG9yYWdlTWFuYWdlcjo6VXBncmFkZUhhbmRsZXI+KCksCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNfLnN0b3JhZ2VfbWFuYWdlcl9vcHRpb25zKSwKLSNpZiBkZWZpbmVkKE9TX1NUQVJCT0FSRCkKICAgICAgIGlzX3JlbmRlcmVkXyhmYWxzZSksCi0jZW5kaWYgIC8vIE9TX1NUQVJCT0FSRAogI2lmIGRlZmluZWQoRU5BQkxFX0dQVV9BUlJBWV9CVUZGRVJfQUxMT0NBVE9SKQogICAgICAgYXJyYXlfYnVmZmVyX2FsbG9jYXRvcl8oCiAgICAgICAgICAgbmV3IFJlc291cmNlUHJvdmlkZXJBcnJheUJ1ZmZlckFsbG9jYXRvcihHZXRSZXNvdXJjZVByb3ZpZGVyKCkpKSwKQEAgLTI1MSw3ICsyNTQsOCBAQAogI2VuZGlmCiAgICAgICB3aWxsX3F1aXRfKGZhbHNlKSwKICAgICAgIGFwcGxpY2F0aW9uX3N0YXRlXyhpbml0aWFsX2FwcGxpY2F0aW9uX3N0YXRlKSwKLSAgICAgIHNwbGFzaF9zY3JlZW5fY2FjaGVfKG5ldyBTcGxhc2hTY3JlZW5DYWNoZSgpKSB7CisgICAgICBzcGxhc2hfc2NyZWVuX2NhY2hlXyhuZXcgU3BsYXNoU2NyZWVuQ2FjaGUoKSksCisgICAgICBwcm9kdWNlZF9yZW5kZXJfdHJlZV8oZmFsc2UpIHsKICNpZiBTQl9IQVMoQ09SRV9EVU1QX0hBTkRMRVJfU1VQUE9SVCkKICAgU2JDb3JlRHVtcFJlZ2lzdGVySGFuZGxlcihCcm93c2VyTW9kdWxlOjpDb3JlRHVtcEhhbmRsZXIsIHRoaXMpOwogICBvbl9lcnJvcl90cmlnZ2VyZWRfY291bnRfID0gMDsKQEAgLTI5Niw5ICszMDAsNyBAQAogICAgIE9uRnV6emVyVG9nZ2xlKHN0ZDo6c3RyaW5nKCkpOwogICB9CiAgIGlmIChjb21tYW5kX2xpbmUtPkhhc1N3aXRjaChzd2l0Y2hlczo6a1N1c3BlbmRGdXp6ZXIpKSB7Ci0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICAgIHN1c3BlbmRfZnV6emVyXy5lbXBsYWNlKCk7Ci0jZW5kaWYKICAgfQogI2VuZGlmICAvLyBFTkFCTEVfREVCVUdfQ09OU09MRSAmJiBFTkFCTEVfREVCVUdfQ09NTUFORF9MSU5FX1NXSVRDSEVTCiAKQEAgLTQwMywxMyArNDA1LDE4IEBACiAgIGJhc2U6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBrZXkgPSBTcGxhc2hTY3JlZW5DYWNoZTo6R2V0S2V5Rm9yU3RhcnRVcmwodXJsKTsKICAgaWYgKGZhbGxiYWNrX3NwbGFzaF9zY3JlZW5fdXJsXyB8fAogICAgICAgKGtleSAmJiBzcGxhc2hfc2NyZWVuX2NhY2hlXy0+SXNTcGxhc2hTY3JlZW5DYWNoZWQoKmtleSkpKSB7CisgICAgLy8gQ3JlYXRlIHRoZSBzcGxhc2ggc2NyZWVuIGxheWVyLgorICAgIHNwbGFzaF9zY3JlZW5fbGF5ZXJfID0KKyAgICAgICAgcmVuZGVyX3RyZWVfY29tYmluZXJfLT5DcmVhdGVMYXllcihrU3BsYXNoU2NyZWVuWkluZGV4KTsKKwogICAgIHNwbGFzaF9zY3JlZW5fLnJlc2V0KG5ldyBTcGxhc2hTY3JlZW4oCiAgICAgICAgIGFwcGxpY2F0aW9uX3N0YXRlXywKLSAgICAgICAgYmFzZTo6QmluZCgmQnJvd3Nlck1vZHVsZTo6UXVldWVPblJlbmRlclRyZWVQcm9kdWNlZCwKKyAgICAgICAgYmFzZTo6QmluZCgmQnJvd3Nlck1vZHVsZTo6UXVldWVPblNwbGFzaFNjcmVlblJlbmRlclRyZWVQcm9kdWNlZCwKICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSwKICAgICAgICAgJm5ldHdvcmtfbW9kdWxlXywgdmlld3BvcnRfc2l6ZSwgR2V0UmVzb3VyY2VQcm92aWRlcigpLAogICAgICAgICBrTGF5b3V0TWF4UmVmcmVzaEZyZXF1ZW5jeUluSHosICpmYWxsYmFja19zcGxhc2hfc2NyZWVuX3VybF8sIHVybCwKLSAgICAgICAgc3BsYXNoX3NjcmVlbl9jYWNoZV8uZ2V0KCkpKTsKKyAgICAgICAgc3BsYXNoX3NjcmVlbl9jYWNoZV8uZ2V0KCksCisgICAgICAgIGJhc2U6OkJpbmQoJkJyb3dzZXJNb2R1bGU6OkRlc3Ryb3lTcGxhc2hTY3JlZW4sIHdlYWtfdGhpc18pKSk7CiAgICAgbGlmZWN5Y2xlX29ic2VydmVyc18uQWRkT2JzZXJ2ZXIoc3BsYXNoX3NjcmVlbl8uZ2V0KCkpOwogICB9CiAKQEAgLTQ3Myw4ICs0ODAsNiBAQAogICAgIHJldHVybjsKICAgfQogCi0gIERlc3Ryb3lTcGxhc2hTY3JlZW4oKTsKLQogICAvLyBUaGlzIGxvZyBpcyByZWxpZWQgb24gYnkgdGhlIHdlYmRyaXZlciBiZW5jaG1hcmsgdGVzdHMsIHNvIGl0IHNob3VsZG4ndCBiZQogICAvLyBjaGFuZ2VkIHVubGVzcyB0aGUgY29ycmVzcG9uZGluZyBiZW5jaG1hcmsgbG9naWMgaXMgY2hhbmdlZCBhcyB3ZWxsLgogICBMT0coSU5GTykgPDwgIkxvYWRlZCBXZWJNb2R1bGUiOwpAQCAtNTE5LDI2ICs1MjQsNjcgQEAKICAgICAgIGJhc2U6OkJpbmQoJkJyb3dzZXJNb2R1bGU6OlByb2Nlc3NSZW5kZXJUcmVlU3VibWlzc2lvblF1ZXVlLCB3ZWFrX3RoaXNfKSk7CiB9CiAKK3ZvaWQgQnJvd3Nlck1vZHVsZTo6UXVldWVPblNwbGFzaFNjcmVlblJlbmRlclRyZWVQcm9kdWNlZCgKKyAgICBjb25zdCBicm93c2VyOjpXZWJNb2R1bGU6OkxheW91dFJlc3VsdHMmIGxheW91dF9yZXN1bHRzKSB7CisgIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojpicm93c2VyIiwKKyAgICAgICAgICAgICAgICJCcm93c2VyTW9kdWxlOjpRdWV1ZU9uU3BsYXNoU2NyZWVuUmVuZGVyVHJlZVByb2R1Y2VkKCkiKTsKKyAgcmVuZGVyX3RyZWVfc3VibWlzc2lvbl9xdWV1ZV8uQWRkTWVzc2FnZSgKKyAgICAgIGJhc2U6OkJpbmQoJkJyb3dzZXJNb2R1bGU6Ok9uU3BsYXNoU2NyZWVuUmVuZGVyVHJlZVByb2R1Y2VkLAorICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLCBsYXlvdXRfcmVzdWx0cykpOworICBzZWxmX21lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKAorICAgICAgRlJPTV9IRVJFLAorICAgICAgYmFzZTo6QmluZCgmQnJvd3Nlck1vZHVsZTo6UHJvY2Vzc1JlbmRlclRyZWVTdWJtaXNzaW9uUXVldWUsIHdlYWtfdGhpc18pKTsKK30KKwogdm9pZCBCcm93c2VyTW9kdWxlOjpPblJlbmRlclRyZWVQcm9kdWNlZCgKICAgICBjb25zdCBicm93c2VyOjpXZWJNb2R1bGU6OkxheW91dFJlc3VsdHMmIGxheW91dF9yZXN1bHRzKSB7CiAgIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojpicm93c2VyIiwgIkJyb3dzZXJNb2R1bGU6Ok9uUmVuZGVyVHJlZVByb2R1Y2VkKCkiKTsKICAgRENIRUNLX0VRKE1lc3NhZ2VMb29wOjpjdXJyZW50KCksIHNlbGZfbWVzc2FnZV9sb29wXyk7CisKKyAgaWYgKHNwbGFzaF9zY3JlZW5fICYmICFwcm9kdWNlZF9yZW5kZXJfdHJlZV8pIHsKKyAgICBzcGxhc2hfc2NyZWVuXy0+U2h1dGRvd24oKTsKKyAgfQorICBwcm9kdWNlZF9yZW5kZXJfdHJlZV8gPSB0cnVlOworCiAgIGlmIChhcHBsaWNhdGlvbl9zdGF0ZV8gPT0gYmFzZTo6a0FwcGxpY2F0aW9uU3RhdGVQcmVsb2FkaW5nIHx8Ci0gICAgICAhcmVuZGVyX3RyZWVfY29tYmluZXJfKSB7CisgICAgICAhcmVuZGVyX3RyZWVfY29tYmluZXJfIHx8ICFtYWluX3dlYl9tb2R1bGVfbGF5ZXJfKSB7CisgICAgcmV0dXJuOworICB9CisgIHJlbmRlcmVyOjpTdWJtaXNzaW9uIHJlbmRlcmVyX3N1Ym1pc3Npb24obGF5b3V0X3Jlc3VsdHMucmVuZGVyX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0X3Jlc3VsdHMubGF5b3V0X3RpbWUpOworICByZW5kZXJlcl9zdWJtaXNzaW9uLm9uX3Jhc3Rlcml6ZWRfY2FsbGJhY2sgPSBiYXNlOjpCaW5kKAorICAgICAgJkJyb3dzZXJNb2R1bGU6Ok9uUmVuZGVyZXJTdWJtaXNzaW9uUmFzdGVyaXplZCwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSk7CisgIG1haW5fd2ViX21vZHVsZV9sYXllcl8tPlN1Ym1pdChyZW5kZXJlcl9zdWJtaXNzaW9uLCB0cnVlIC8qIHJlY2VpdmVfdGltZSAqLyk7CisKKyNpZiBkZWZpbmVkKEVOQUJMRV9TQ1JFRU5TSE9UKQorICBzY3JlZW5fc2hvdF93cml0ZXJfLT5TZXRMYXN0UGlwZWxpbmVTdWJtaXNzaW9uKHJlbmRlcmVyOjpTdWJtaXNzaW9uKAorICAgICAgbGF5b3V0X3Jlc3VsdHMucmVuZGVyX3RyZWUsIGxheW91dF9yZXN1bHRzLmxheW91dF90aW1lKSk7CisjZW5kaWYKK30KKwordm9pZCBCcm93c2VyTW9kdWxlOjpPblNwbGFzaFNjcmVlblJlbmRlclRyZWVQcm9kdWNlZCgKKyAgICBjb25zdCBicm93c2VyOjpXZWJNb2R1bGU6OkxheW91dFJlc3VsdHMmIGxheW91dF9yZXN1bHRzKSB7CisgIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojpicm93c2VyIiwKKyAgICAgICAgICAgICAgICJCcm93c2VyTW9kdWxlOjpPblNwbGFzaFNjcmVlblJlbmRlclRyZWVQcm9kdWNlZCgpIik7CisgIERDSEVDS19FUShNZXNzYWdlTG9vcDo6Y3VycmVudCgpLCBzZWxmX21lc3NhZ2VfbG9vcF8pOworCisgIGlmIChhcHBsaWNhdGlvbl9zdGF0ZV8gPT0gYmFzZTo6a0FwcGxpY2F0aW9uU3RhdGVQcmVsb2FkaW5nIHx8CisgICAgICAhcmVuZGVyX3RyZWVfY29tYmluZXJfIHx8ICFzcGxhc2hfc2NyZWVuX2xheWVyXykgewogICAgIHJldHVybjsKICAgfQogCiAgIHJlbmRlcmVyOjpTdWJtaXNzaW9uIHJlbmRlcmVyX3N1Ym1pc3Npb24obGF5b3V0X3Jlc3VsdHMucmVuZGVyX3RyZWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0X3Jlc3VsdHMubGF5b3V0X3RpbWUpOwotI2lmIGRlZmluZWQoT1NfU1RBUkJPQVJEKQogICByZW5kZXJlcl9zdWJtaXNzaW9uLm9uX3Jhc3Rlcml6ZWRfY2FsbGJhY2sgPSBiYXNlOjpCaW5kKAogICAgICAgJkJyb3dzZXJNb2R1bGU6Ok9uUmVuZGVyZXJTdWJtaXNzaW9uUmFzdGVyaXplZCwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSk7Ci0jZW5kaWYgIC8vIE9TX1NUQVJCT0FSRAotICByZW5kZXJfdHJlZV9jb21iaW5lcl8tPlVwZGF0ZU1haW5SZW5kZXJUcmVlKHJlbmRlcmVyX3N1Ym1pc3Npb24pOworICBzcGxhc2hfc2NyZWVuX2xheWVyXy0+U3VibWl0KHJlbmRlcmVyX3N1Ym1pc3Npb24sIGZhbHNlIC8qIHJlY2VpdmVfdGltZSAqLyk7CiAKICNpZiBkZWZpbmVkKEVOQUJMRV9TQ1JFRU5TSE9UKQotICBzY3JlZW5fc2hvdF93cml0ZXJfLT5TZXRMYXN0UGlwZWxpbmVTdWJtaXNzaW9uKHJlbmRlcmVyOjpTdWJtaXNzaW9uKAotICAgICAgbGF5b3V0X3Jlc3VsdHMucmVuZGVyX3RyZWUsIGxheW91dF9yZXN1bHRzLmxheW91dF90aW1lKSk7CisvLyBUT0RPOiB3cml0ZSBzY3JlZW4gc2hvdCB1c2luZyByZW5kZXJfdHJlZV9jb21iaW5kZXJfICh0byBjb21iaW5lCisvLyBzcGxhc2ggc2NyZWVuIGFuZCBtYWluIHdlYl9tb2R1bGUpLiBDb25zaWRlciB3aGVuIHRoZSBzcGxhc2gKKy8vIHNjcmVlbiBpcyBvdmVybGFpZCBvbiB0b3Agb2YgdGhlIG1haW4gd2ViIG1vZHVsZSByZW5kZXIgdHJlZSwgYW5kCisvLyBhIHNjcmVlbnNob3QgaXMgdGFrZW4gOiB0aGVyZSB3aWxsIGJlIGEgcmFjZSBjb25kaXRpb24gb24gd2hpY2gKKy8vIHdlYiBtb2R1bGUgdXBkYXRlIHRoZWlyIHJlbmRlciB0cmVlIGxhc3QuCiAjZW5kaWYKIH0KIApAQCAtNTQ5LDExICs1OTUsNyBAQAogICB9CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoT1NfU1RBUkJPQVJEKQogICBTYlN5c3RlbVJlcXVlc3RTdG9wKDApOwotI2Vsc2UKLSAgTE9HKFdBUk5JTkcpIDw8ICJ3aW5kb3cuY2xvc2UoKSBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0uIjsKLSNlbmRpZgogfQogCiB2b2lkIEJyb3dzZXJNb2R1bGU6Ok9uV2luZG93TWluaW1pemUoKSB7CkBAIC01NjMsMTEgKzYwNSw3IEBACiAgIH0KICNlbmRpZgogCi0jaWYgZGVmaW5lZChPU19TVEFSQk9BUkQpICYmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgU2JTeXN0ZW1SZXF1ZXN0U3VzcGVuZCgpOwotI2Vsc2UKLSAgTE9HKFdBUk5JTkcpIDw8ICJ3aW5kb3cubWluaW1pemUoKSBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0uIjsKLSNlbmRpZgogfQogCiAjaWYgZGVmaW5lZChFTkFCTEVfREVCVUdfQ09OU09MRSkKQEAgLTYzMiwxNiArNjcwLDE2IEBACiAgICAgICAgICAgICAgICAiQnJvd3Nlck1vZHVsZTo6T25EZWJ1Z0NvbnNvbGVSZW5kZXJUcmVlUHJvZHVjZWQoKSIpOwogICBEQ0hFQ0tfRVEoTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSwgc2VsZl9tZXNzYWdlX2xvb3BfKTsKICAgaWYgKGFwcGxpY2F0aW9uX3N0YXRlXyA9PSBiYXNlOjprQXBwbGljYXRpb25TdGF0ZVByZWxvYWRpbmcgfHwKLSAgICAgICFyZW5kZXJfdHJlZV9jb21iaW5lcl8pIHsKKyAgICAgICFyZW5kZXJfdHJlZV9jb21iaW5lcl8gfHwgIWRlYnVnX2NvbnNvbGVfbGF5ZXJfKSB7CiAgICAgcmV0dXJuOwogICB9CiAKICAgaWYgKGRlYnVnX2NvbnNvbGVfLT5HZXRNb2RlKCkgPT0gZGVidWc6OkRlYnVnSHViOjprRGVidWdDb25zb2xlT2ZmKSB7Ci0gICAgcmVuZGVyX3RyZWVfY29tYmluZXJfLT5VcGRhdGVEZWJ1Z0NvbnNvbGVSZW5kZXJUcmVlKGJhc2U6Om51bGxvcHQpOworICAgIGRlYnVnX2NvbnNvbGVfbGF5ZXJfLT5TdWJtaXQoYmFzZTo6bnVsbG9wdCk7CiAgICAgcmV0dXJuOwogICB9CiAKLSAgcmVuZGVyX3RyZWVfY29tYmluZXJfLT5VcGRhdGVEZWJ1Z0NvbnNvbGVSZW5kZXJUcmVlKHJlbmRlcmVyOjpTdWJtaXNzaW9uKAorICBkZWJ1Z19jb25zb2xlX2xheWVyXy0+U3VibWl0KHJlbmRlcmVyOjpTdWJtaXNzaW9uKAogICAgICAgbGF5b3V0X3Jlc3VsdHMucmVuZGVyX3RyZWUsIGxheW91dF9yZXN1bHRzLmxheW91dF90aW1lKSk7CiB9CiAKQEAgLTgwNCw5ICs4NDIsMTUgQEAKIAogdm9pZCBCcm93c2VyTW9kdWxlOjpEZXN0cm95U3BsYXNoU2NyZWVuKCkgewogICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6YnJvd3NlciIsICJCcm93c2VyTW9kdWxlOjpEZXN0cm95U3BsYXNoU2NyZWVuKCkiKTsKKyAgaWYgKE1lc3NhZ2VMb29wOjpjdXJyZW50KCkgIT0gc2VsZl9tZXNzYWdlX2xvb3BfKSB7CisgICAgc2VsZl9tZXNzYWdlX2xvb3BfLT5Qb3N0VGFzaygKKyAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZCcm93c2VyTW9kdWxlOjpEZXN0cm95U3BsYXNoU2NyZWVuLCB3ZWFrX3RoaXNfKSk7CisgICAgcmV0dXJuOworICB9CiAgIGlmIChzcGxhc2hfc2NyZWVuXykgewogICAgIGxpZmVjeWNsZV9vYnNlcnZlcnNfLlJlbW92ZU9ic2VydmVyKHNwbGFzaF9zY3JlZW5fLmdldCgpKTsKICAgfQorICBzcGxhc2hfc2NyZWVuX2xheWVyXy5yZXNldChOVUxMKTsKICAgc3BsYXNoX3NjcmVlbl8ucmVzZXQoTlVMTCk7CiB9CiAKQEAgLTkxMiw2ICs5NTYsMjIgQEAKICAgYXBwbGljYXRpb25fc3RhdGVfID0gYmFzZTo6a0FwcGxpY2F0aW9uU3RhdGVQYXVzZWQ7CiB9CiAKK3ZvaWQgQnJvd3Nlck1vZHVsZTo6UmVkdWNlTWVtb3J5KCkgeworICBpZiAoc3BsYXNoX3NjcmVlbl8pIHsKKyAgICBzcGxhc2hfc2NyZWVuXy0+UmVkdWNlTWVtb3J5KCk7CisgIH0KKworI2lmIGRlZmluZWQoRU5BQkxFX0RFQlVHX0NPTlNPTEUpCisgIGlmIChkZWJ1Z19jb25zb2xlXykgeworICAgIGRlYnVnX2NvbnNvbGVfLT5SZWR1Y2VNZW1vcnkoKTsKKyAgfQorI2VuZGlmICAvLyBkZWZpbmVkKEVOQUJMRV9ERUJVR19DT05TT0xFKQorCisgIGlmICh3ZWJfbW9kdWxlXykgeworICAgIHdlYl9tb2R1bGVfLT5SZWR1Y2VNZW1vcnkoKTsKKyAgfQorfQorCiB2b2lkIEJyb3dzZXJNb2R1bGU6OkNoZWNrTWVtb3J5KAogICAgIGNvbnN0IGludDY0X3QmIHVzZWRfY3B1X21lbW9yeSwKICAgICBjb25zdCBiYXNlOjpvcHRpb25hbDxpbnQ2NF90PiYgdXNlZF9ncHVfbWVtb3J5KSB7CkBAIC05MjMsNyArOTgzLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkX2dwdV9tZW1vcnkpOwogfQogCi0jaWYgZGVmaW5lZChPU19TVEFSQk9BUkQpCiB2b2lkIEJyb3dzZXJNb2R1bGU6Ok9uUmVuZGVyZXJTdWJtaXNzaW9uUmFzdGVyaXplZCgpIHsKICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OmJyb3dzZXIiLAogICAgICAgICAgICAgICAgIkJyb3dzZXJNb2R1bGU6Ok9uUmVuZGVyZXJTdWJtaXNzaW9uUmFzdGVyaXplZCgpIik7CkBAIC05MzMsNyArOTkyLDYgQEAKICAgICBTYlN5c3RlbUhpZGVTcGxhc2hTY3JlZW4oKTsKICAgfQogfQotI2VuZGlmICAvLyBPU19TVEFSQk9BUkQKIAogI2lmIGRlZmluZWQoQ09CQUxUX0NIRUNLX1JFTkRFUl9USU1FT1VUKQogdm9pZCBCcm93c2VyTW9kdWxlOjpPblBvbGxGb3JSZW5kZXJUaW1lb3V0KGNvbnN0IEdVUkwmIHVybCkgewpAQCAtMTAyMSwxMSArMTA3OSwxNCBAQAogCiAgIHJlbmRlcl90cmVlX2NvbWJpbmVyXy5yZXNldCgKICAgICAgIG5ldyBSZW5kZXJUcmVlQ29tYmluZXIocmVuZGVyZXJfbW9kdWxlXy5nZXQoKSwgR2V0Vmlld3BvcnRTaXplKCkpKTsKLQotICAvLyBBbHdheXMgcmVuZGVyIHRoZSBkZWJ1ZyBjb25zb2xlLiBJdCB3aWxsIGRyYXcgbm90aGluZyBpZiBkaXNhYmxlZC4KLSAgLy8gVGhpcyBzZXR0aW5nIGlzIGlnbm9yZWQgaWYgRU5BQkxFX0RFQlVHX0NPTlNPTEUgaXMgbm90IGRlZmluZWQuCi0gIC8vIFRPRE86IFJlbmRlciB0cmVlIGNvbWJpbmVyIHNob3VsZCBwcm9iYWJseSBiZSByZWZhY3RvcmVkLgotICByZW5kZXJfdHJlZV9jb21iaW5lcl8tPnNldF9yZW5kZXJfZGVidWdfY29uc29sZSh0cnVlKTsKKyAgLy8gQ3JlYXRlIHRoZSBtYWluIHdlYiBtb2R1bGUgbGF5ZXIuCisgIG1haW5fd2ViX21vZHVsZV9sYXllcl8gPQorICAgICAgcmVuZGVyX3RyZWVfY29tYmluZXJfLT5DcmVhdGVMYXllcihrTWFpbldlYk1vZHVsZVpJbmRleCk7CisvLyBDcmVhdGUgdGhlIGRlYnVnIGNvbnNvbGUgbGF5ZXIuCisjaWYgZGVmaW5lZChFTkFCTEVfREVCVUdfQ09OU09MRSkKKyAgZGVidWdfY29uc29sZV9sYXllcl8gPQorICAgICAgcmVuZGVyX3RyZWVfY29tYmluZXJfLT5DcmVhdGVMYXllcihrRGVidWdDb25zb2xlWkluZGV4KTsKKyNlbmRpZgogCiAjaWYgZGVmaW5lZChFTkFCTEVfU0NSRUVOU0hPVCkKICAgc2NyZWVuX3Nob3Rfd3JpdGVyXy5yZXNldChuZXcgU2NyZWVuU2hvdFdyaXRlcihyZW5kZXJlcl9tb2R1bGVfLT5waXBlbGluZSgpKSk7CkBAIC0xMDg1LDggKzExNDYsMTQgQEAKIAogICAvLyBDbGVhciBvdXQgdGhlIHJlbmRlciB0cmVlIGNvbWJpbmVyIHNvIHRoYXQgaXQgZG9lc24ndCBob2xkIG9uIHRvIGFueQogICAvLyByZW5kZXIgdHJlZSByZXNvdXJjZXMgZWl0aGVyLgotICBpZiAocmVuZGVyX3RyZWVfY29tYmluZXJfKSB7Ci0gICAgcmVuZGVyX3RyZWVfY29tYmluZXJfLT5SZXNldCgpOworICBpZiAobWFpbl93ZWJfbW9kdWxlX2xheWVyXykgeworICAgIG1haW5fd2ViX21vZHVsZV9sYXllcl8tPlJlc2V0KCk7CisgIH0KKyAgaWYgKHNwbGFzaF9zY3JlZW5fbGF5ZXJfKSB7CisgICAgc3BsYXNoX3NjcmVlbl9sYXllcl8tPlJlc2V0KCk7CisgIH0KKyAgaWYgKGRlYnVnX2NvbnNvbGVfbGF5ZXJfKSB7CisgICAgZGVidWdfY29uc29sZV9sYXllcl8tPlJlc2V0KCk7CiAgIH0KIAogI2lmIGRlZmluZWQoRU5BQkxFX0dQVV9BUlJBWV9CVUZGRVJfQUxMT0NBVE9SKQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfbW9kdWxlLmggYi9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9tb2R1bGUuaAppbmRleCBiYTM4NjFkLi4zODZlYjBlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9tb2R1bGUuaAorKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9tb2R1bGUuaApAQCAtMTQyLDYgKzE0MiwxMCBAQAogICB2b2lkIFN1c3BlbmQoKTsKICAgdm9pZCBSZXN1bWUoKTsKIAorICAvLyBBdHRlbXB0IHRvIHJlZHVjZSBvdmVyYWxsIG1lbW9yeSBjb25zdW1wdGlvbi4gQ2FsbGVkIGluIHJlc3BvbnNlIHRvIGEKKyAgLy8gc3lzdGVtIGluZGljYXRpb24gdGhhdCBtZW1vcnkgdXNhZ2UgaXMgbmVhcmluZyBhIGNyaXRpY2FsIGxldmVsLgorICB2b2lkIFJlZHVjZU1lbW9yeSgpOworCiAgIHZvaWQgQ2hlY2tNZW1vcnkoY29uc3QgaW50NjRfdCYgdXNlZF9jcHVfbWVtb3J5LAogICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6Om9wdGlvbmFsPGludDY0X3Q+JiB1c2VkX2dwdV9tZW1vcnkpOwogCkBAIC0xNzMsNiArMTc3LDEzIEBACiAgIHZvaWQgT25SZW5kZXJUcmVlUHJvZHVjZWQoCiAgICAgICBjb25zdCBicm93c2VyOjpXZWJNb2R1bGU6OkxheW91dFJlc3VsdHMmIGxheW91dF9yZXN1bHRzKTsKIAorICAvLyBHbHVlIGZ1bmN0aW9uIHRvIGRlYWwgd2l0aCB0aGUgcHJvZHVjdGlvbiBvZiB0aGUgc3BsYXNoIHNjcmVlbiByZW5kZXIgdHJlZSwKKyAgLy8gYW5kIHdpbGwgbWFuYWdlIGhhbmRpbmcgaXQgb2ZmIHRvIHRoZSByZW5kZXJlci4KKyAgdm9pZCBRdWV1ZU9uU3BsYXNoU2NyZWVuUmVuZGVyVHJlZVByb2R1Y2VkKAorICAgICAgY29uc3QgYnJvd3Nlcjo6V2ViTW9kdWxlOjpMYXlvdXRSZXN1bHRzJiBsYXlvdXRfcmVzdWx0cyk7CisgIHZvaWQgT25TcGxhc2hTY3JlZW5SZW5kZXJUcmVlUHJvZHVjZWQoCisgICAgICBjb25zdCBicm93c2VyOjpXZWJNb2R1bGU6OkxheW91dFJlc3VsdHMmIGxheW91dF9yZXN1bHRzKTsKKwogICAvLyBTYXZlcy9sb2FkcyB0aGUgZGVidWcgY29uc29sZSBtb2RlIHRvL2Zyb20gbG9jYWwgc3RvcmFnZSBzbyB3ZSBjYW4KICAgLy8gcGVyc2lzdCB0aGUgdXNlcidzIHByZWZlcmVuY2UuCiAgIHZvaWQgU2F2ZURlYnVnQ29uc29sZU1vZGUoKTsKQEAgLTM1Nyw4ICszNjgsMTEgQEAKICAgLy8gU2V0cyB1cCB0aGUgbmV0d29yayBjb21wb25lbnQgZm9yIHJlcXVlc3RpbmcgaW50ZXJuZXQgcmVzb3VyY2VzLgogICBuZXR3b3JrOjpOZXR3b3JrTW9kdWxlIG5ldHdvcmtfbW9kdWxlXzsKIAotICAvLyBNYW5hZ2VzIHRoZSB0d28gcmVuZGVyIHRyZWVzLCBjb21iaW5lcyBhbmQgcmVuZGVycyB0aGVtLgorICAvLyBNYW5hZ2VzIHRoZSB0aHJlZSByZW5kZXIgdHJlZXMsIGNvbWJpbmVzIGFuZCByZW5kZXJzIHRoZW0uCiAgIHNjb3BlZF9wdHI8UmVuZGVyVHJlZUNvbWJpbmVyPiByZW5kZXJfdHJlZV9jb21iaW5lcl87CisgIHNjb3BlZF9wdHI8UmVuZGVyVHJlZUNvbWJpbmVyOjpMYXllcj4gbWFpbl93ZWJfbW9kdWxlX2xheWVyXzsKKyAgc2NvcGVkX3B0cjxSZW5kZXJUcmVlQ29tYmluZXI6OkxheWVyPiBkZWJ1Z19jb25zb2xlX2xheWVyXzsKKyAgc2NvcGVkX3B0cjxSZW5kZXJUcmVlQ29tYmluZXI6OkxheWVyPiBzcGxhc2hfc2NyZWVuX2xheWVyXzsKIAogI2lmIGRlZmluZWQoRU5BQkxFX1NDUkVFTlNIT1QpCiAgIC8vIEhlbHBlciBvYmplY3QgdG8gY3JlYXRlIHNjcmVlbiBzaG90cyBvZiB0aGUgbGFzdCBsYXlvdXQgdHJlZS4KQEAgLTQ1OSw2ICs0NzMsOSBAQAogCiAgIC8vIFRoZSBzcGxhc2ggc2NyZWVuIGNhY2hlLgogICBzY29wZWRfcHRyPFNwbGFzaFNjcmVlbkNhY2hlPiBzcGxhc2hfc2NyZWVuX2NhY2hlXzsKKworICAvLyBXaGV0aGVyIG9yIG5vdCB0aGUgbWFpbiBXZWJNb2R1bGUgaGFzIHByb2R1Y2VkIGFueSByZW5kZXIgdHJlZXMgeWV0LgorICBib29sIHByb2R1Y2VkX3JlbmRlcl90cmVlXzsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBicm93c2VyCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvZGVidWdfY29uc29sZS5oIGIvc3JjL2NvYmFsdC9icm93c2VyL2RlYnVnX2NvbnNvbGUuaAppbmRleCA5ZWNiZWY1Li42ZWQyOTFkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvZGVidWdfY29uc29sZS5oCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9kZWJ1Z19jb25zb2xlLmgKQEAgLTc5LDYgKzc5LDggQEAKICAgICB3ZWJfbW9kdWxlXy0+UmVzdW1lKHJlc291cmNlX3Byb3ZpZGVyKTsKICAgfQogCisgIHZvaWQgUmVkdWNlTWVtb3J5KCkgeyB3ZWJfbW9kdWxlXy0+UmVkdWNlTWVtb3J5KCk7IH0KKwogIHByaXZhdGU6CiAgIHZvaWQgT25FcnJvcihjb25zdCBHVVJMJiAvKiB1cmwgKi8sIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcikgewogICAgIExPRyhFUlJPUikgPDwgZXJyb3I7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvZGVidWdfY29uc29sZS9jb25zb2xlX3ZhbHVlcy5qcyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9kZWJ1Z19jb25zb2xlL2NvbnNvbGVfdmFsdWVzLmpzCmluZGV4IDJlZDIzMmUuLjQ0NGNhNDggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9kZWJ1Z19jb25zb2xlL2NvbnNvbGVfdmFsdWVzLmpzCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9kZWJ1Z19jb25zb2xlL2NvbnNvbGVfdmFsdWVzLmpzCkBAIC0yMCw4ICsyMCw5IEBACiAgIHRoaXMuREVGQVVMVF9LRVkgPSAnZGVmYXVsdCc7CiAgIC8vIFJlZHVjZWQgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgQ1ZhbCBwcmVmaXhlcyB0byBkaXNwbGF5IGF0IHN0YXJ0LXVwLgogICB0aGlzLkRFRkFVTFRfQUNUSVZFX1NFVCA9Ci0gICAgICAnQ29iYWx0IERldlRvb2xzIE1lbW9yeS5DUFUgTWVtb3J5Lk1haW5XZWJNb2R1bGUgTWVtb3J5LkpTIE1lbW9yeS5Gb250ICcgKwotICAgICAgJ0V2ZW50LkR1cmF0aW9uLk1haW5XZWJNb2R1bGUuS2V5RG93biBSZW5kZXJlci5SYXN0ZXJpemUuRHVyYXRpb24nOworICAgICAgJ0NvYmFsdCBEZXZUb29scyBXZWJEcml2ZXIgTWVtb3J5LkNQVSBNZW1vcnkuTWFpbldlYk1vZHVsZSBNZW1vcnkuSlMgJyArCisgICAgICAnTWVtb3J5LkZvbnQgRXZlbnQuRHVyYXRpb24uTWFpbldlYk1vZHVsZS5LZXlEb3duICcgKworICAgICAgJ1JlbmRlcmVyLlJhc3Rlcml6ZS5EdXJhdGlvbic7CiAKICAgdmFyIG5hbWVzID0gd2luZG93LmRlYnVnSHViLmdldENvbnNvbGVWYWx1ZU5hbWVzKCk7CiAgIHRoaXMuYWxsQ1ZhbHMgPSBuYW1lcy5zcGxpdCgnICcpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL21lbW9yeV90cmFja2VyL3Rvb2wvdG9vbF9pbXBsLmNjIGIvc3JjL2NvYmFsdC9icm93c2VyL21lbW9yeV90cmFja2VyL3Rvb2wvdG9vbF9pbXBsLmNjCmluZGV4IGYyYTkyYmIuLjY1ZGUwNmYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9tZW1vcnlfdHJhY2tlci90b29sL3Rvb2xfaW1wbC5jYworKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvbWVtb3J5X3RyYWNrZXIvdG9vbC90b29sX2ltcGwuY2MKQEAgLTMwLDcgKzMwLDYgQEAKICNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9tZW1vcnlfdHJhY2tlci90b29sL3BhcmFtcy5oIgogI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL21lbW9yeV90cmFja2VyL3Rvb2wvdG9vbF90aHJlYWQuaCIKICNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9tZW1vcnlfdHJhY2tlci90b29sL3V0aWwuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3V0aWwvc3RhY2tfdHJhY2VfaGVscGVycy5oIgogI2luY2x1ZGUgIm5iL2FuYWx5dGljcy9tZW1vcnlfdHJhY2tlci5oIgogI2luY2x1ZGUgIm5iL2FuYWx5dGljcy9tZW1vcnlfdHJhY2tlcl9oZWxwZXJzLmgiCiAjaW5jbHVkZSAibmIvY29uY3VycmVudF9tYXAuaCIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9yZW5kZXJfdHJlZV9jb21iaW5lci5jYyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9yZW5kZXJfdHJlZV9jb21iaW5lci5jYwppbmRleCAxNzFmYmMzLi43OGZlNGJlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvcmVuZGVyX3RyZWVfY29tYmluZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3JlbmRlcl90cmVlX2NvbWJpbmVyLmNjCkBAIC0xNCw5OSArMTQsOTcgQEAKIAogI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL3JlbmRlcl90cmVlX2NvbWJpbmVyLmgiCiAKKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCisjaW5jbHVkZSAiYmFzZS9vcHRpb25hbC5oIgorI2luY2x1ZGUgImJhc2UvdGltZS5oIgogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJfdHJlZS9jb21wb3NpdGlvbl9ub2RlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcl90cmVlL3JlY3Rfbm9kZS5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yZW5kZXJlcl9tb2R1bGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvc3VibWlzc2lvbi5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBicm93c2VyIHsKIAotI2lmIGRlZmluZWQoRU5BQkxFX0RFQlVHX0NPTlNPTEUpCitSZW5kZXJUcmVlQ29tYmluZXI6OkxheWVyOjpMYXllcihSZW5kZXJUcmVlQ29tYmluZXIqIHJlbmRlcl90cmVlX2NvbWJpbmVyKQorICAgIDogcmVuZGVyX3RyZWVfY29tYmluZXJfKHJlbmRlcl90cmVlX2NvbWJpbmVyKSwKKyAgICAgIHJlbmRlcl90cmVlXyhiYXNlOjpudWxsb3B0KSwKKyAgICAgIHJlY2VpcHRfdGltZV8oYmFzZTo6bnVsbG9wdCkge30KKworUmVuZGVyVHJlZUNvbWJpbmVyOjpMYXllcjo6fkxheWVyKCkgeworICBEQ0hFQ0socmVuZGVyX3RyZWVfY29tYmluZXJfKTsKKyAgcmVuZGVyX3RyZWVfY29tYmluZXJfLT5SZW1vdmVMYXllcih0aGlzKTsKK30KKwordm9pZCBSZW5kZXJUcmVlQ29tYmluZXI6OkxheWVyOjpTdWJtaXQoCisgICAgY29uc3QgYmFzZTo6b3B0aW9uYWw8cmVuZGVyZXI6OlN1Ym1pc3Npb24+JiByZW5kZXJfdHJlZV9zdWJtaXNzaW9uLAorICAgIGJvb2wgcmVjZWl2ZV90aW1lKSB7CisgIHJlbmRlcl90cmVlXyA9IHJlbmRlcl90cmVlX3N1Ym1pc3Npb247CisgIGlmIChyZWNlaXZlX3RpbWUpIHsKKyAgICByZWNlaXB0X3RpbWVfID0gYmFzZTo6VGltZVRpY2tzOjpIaWdoUmVzTm93KCk7CisgIH0gZWxzZSB7CisgICAgcmVjZWlwdF90aW1lXyA9IGJhc2U6Om51bGxvcHQ7CisgIH0KKyAgRENIRUNLKHJlbmRlcl90cmVlX2NvbWJpbmVyXyk7CisgIHJlbmRlcl90cmVlX2NvbWJpbmVyXy0+U3VibWl0VG9SZW5kZXJlcigpOworfQorCiBSZW5kZXJUcmVlQ29tYmluZXI6OlJlbmRlclRyZWVDb21iaW5lcigKICAgICByZW5kZXJlcjo6UmVuZGVyZXJNb2R1bGUqIHJlbmRlcmVyX21vZHVsZSwgY29uc3QgbWF0aDo6U2l6ZSYgdmlld3BvcnRfc2l6ZSkKLSAgICA6IHJlbmRlcl9kZWJ1Z19jb25zb2xlXyh0cnVlKSwKLSAgICAgIHJlbmRlcmVyX21vZHVsZV8ocmVuZGVyZXJfbW9kdWxlKSwKLSAgICAgIHZpZXdwb3J0X3NpemVfKHZpZXdwb3J0X3NpemUpIHt9CisgICAgOiByZW5kZXJlcl9tb2R1bGVfKHJlbmRlcmVyX21vZHVsZSksIHZpZXdwb3J0X3NpemVfKHZpZXdwb3J0X3NpemUpIHt9CiAKLVJlbmRlclRyZWVDb21iaW5lcjo6flJlbmRlclRyZWVDb21iaW5lcigpIHt9CitzY29wZWRfcHRyPFJlbmRlclRyZWVDb21iaW5lcjo6TGF5ZXI+IFJlbmRlclRyZWVDb21iaW5lcjo6Q3JlYXRlTGF5ZXIoCisgICAgaW50IHpfaW5kZXgpIHsKKyAgaWYgKGxheWVyc18uY291bnQoel9pbmRleCkgPiAwKSB7CisgICAgcmV0dXJuIHNjb3BlZF9wdHI8UmVuZGVyVHJlZUNvbWJpbmVyOjpMYXllcj4oTlVMTCk7CisgIH0KKyAgUmVuZGVyVHJlZUNvbWJpbmVyOjpMYXllciogbGF5ZXIgPSBuZXcgTGF5ZXIodGhpcyk7CisgIGxheWVyc19bel9pbmRleF0gPSBsYXllcjsKIAotdm9pZCBSZW5kZXJUcmVlQ29tYmluZXI6OlJlc2V0KCkgewotICBtYWluX3JlbmRlcl90cmVlXyA9IGJhc2U6Om51bGxvcHQ7Ci0gIGRlYnVnX2NvbnNvbGVfcmVuZGVyX3RyZWVfID0gYmFzZTo6bnVsbG9wdDsKLSAgbWFpbl9yZW5kZXJfdHJlZV9yZWNlaXB0X3RpbWVfID0gYmFzZTo6bnVsbG9wdDsKKyAgcmV0dXJuIHNjb3BlZF9wdHI8UmVuZGVyVHJlZUNvbWJpbmVyOjpMYXllcj4obGF5ZXJzX1t6X2luZGV4XSk7CiB9CiAKLXZvaWQgUmVuZGVyVHJlZUNvbWJpbmVyOjpVcGRhdGVNYWluUmVuZGVyVHJlZSgKLSAgICBjb25zdCByZW5kZXJlcjo6U3VibWlzc2lvbiYgcmVuZGVyX3RyZWVfc3VibWlzc2lvbikgewotICBtYWluX3JlbmRlcl90cmVlXyA9IHJlbmRlcl90cmVlX3N1Ym1pc3Npb247Ci0gIG1haW5fcmVuZGVyX3RyZWVfcmVjZWlwdF90aW1lXyA9IGJhc2U6OlRpbWVUaWNrczo6SGlnaFJlc05vdygpOwotICBTdWJtaXRUb1JlbmRlcmVyKCk7Ci19Ci0KLXZvaWQgUmVuZGVyVHJlZUNvbWJpbmVyOjpVcGRhdGVEZWJ1Z0NvbnNvbGVSZW5kZXJUcmVlKAotICAgIGNvbnN0IGJhc2U6Om9wdGlvbmFsPHJlbmRlcmVyOjpTdWJtaXNzaW9uPiYgcmVuZGVyX3RyZWVfc3VibWlzc2lvbikgewotICBkZWJ1Z19jb25zb2xlX3JlbmRlcl90cmVlXyA9IHJlbmRlcl90cmVlX3N1Ym1pc3Npb247Ci0gIFN1Ym1pdFRvUmVuZGVyZXIoKTsKK3ZvaWQgUmVuZGVyVHJlZUNvbWJpbmVyOjpSZW1vdmVMYXllcihjb25zdCBMYXllciogbGF5ZXIpIHsKKyAgZm9yIChhdXRvIGl0ID0gbGF5ZXJzXy5iZWdpbigpOyBpdCAhPSBsYXllcnNfLmVuZCgpOyAvKiBubyBpbmNyZW1lbnQgKi8pIHsKKyAgICBpZiAoaXQtPnNlY29uZCA9PSBsYXllcikgeworICAgICAgaXQgPSBsYXllcnNfLmVyYXNlKGl0KTsKKyAgICB9IGVsc2UgeworICAgICAgKytpdDsKKyAgICB9CisgIH0KIH0KIAogdm9pZCBSZW5kZXJUcmVlQ29tYmluZXI6OlN1Ym1pdFRvUmVuZGVyZXIoKSB7Ci0gIGlmIChyZW5kZXJfZGVidWdfY29uc29sZV8gJiYgZGVidWdfY29uc29sZV9yZW5kZXJfdHJlZV8pIHsKLSAgICBpZiAobWFpbl9yZW5kZXJfdHJlZV8pIHsKLSAgICAgIHJlbmRlcl90cmVlOjpDb21wb3NpdGlvbk5vZGU6OkJ1aWxkZXIgYnVpbGRlcjsKLSAgICAgIGJ1aWxkZXIuQWRkQ2hpbGQobWFpbl9yZW5kZXJfdHJlZV8tPnJlbmRlcl90cmVlKTsKLSAgICAgIGJ1aWxkZXIuQWRkQ2hpbGQoZGVidWdfY29uc29sZV9yZW5kZXJfdHJlZV8tPnJlbmRlcl90cmVlKTsKLSAgICAgIHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6Ok5vZGU+IGNvbWJpbmVkX3RyZWUgPQotICAgICAgICAgIG5ldyByZW5kZXJfdHJlZTo6Q29tcG9zaXRpb25Ob2RlKGJ1aWxkZXIpOworICByZW5kZXJfdHJlZTo6Q29tcG9zaXRpb25Ob2RlOjpCdWlsZGVyIGJ1aWxkZXI7CiAKLSAgICAgIC8vIFNldHVwIHRpbWUgdG8gYmUgYmFzZWQgb2ZmIG9mIHRoZSBtYWluIHN1Ym1pdHRlZCB0cmVlIG9ubHkuCi0gICAgICAvLyBUT0RPOiBTZXR1cCBhICJsYXllcnMiIGludGVyZmFjZSBvbiB0aGUgUGlwZWxpbmUgc28gdGhhdAotICAgICAgLy8gdHJlZXMgY2FuIGJlIGNvbWJpbmVkIGFuZCBhbmltYXRlZCB0aGVyZSwgcHJvcGVybHkuCi0gICAgICByZW5kZXJlcjo6U3VibWlzc2lvbiBjb21iaW5lZF9zdWJtaXNzaW9uKCptYWluX3JlbmRlcl90cmVlXyk7Ci0gICAgICBjb21iaW5lZF9zdWJtaXNzaW9uLnJlbmRlcl90cmVlID0gY29tYmluZWRfdHJlZTsKLSAgICAgIGNvbWJpbmVkX3N1Ym1pc3Npb24udGltZV9vZmZzZXQgPQotICAgICAgICAgIG1haW5fcmVuZGVyX3RyZWVfLT50aW1lX29mZnNldCArCi0gICAgICAgICAgKGJhc2U6OlRpbWVUaWNrczo6SGlnaFJlc05vdygpIC0gKm1haW5fcmVuZGVyX3RyZWVfcmVjZWlwdF90aW1lXyk7Ci0KLSAgICAgIHJlbmRlcmVyX21vZHVsZV8tPnBpcGVsaW5lKCktPlN1Ym1pdChjb21iaW5lZF9zdWJtaXNzaW9uKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gSWYgd2UgYXJlIHJlbmRlcmluZyB0aGUgZGVidWcgY29uc29sZSBieSBpdHNlbGYsIGdpdmUgaXQgYSBzb2xpZCBibGFjawotICAgICAgLy8gYmFja2dyb3VuZCB0byBpdC4KLSAgICAgIHJlbmRlcl90cmVlOjpDb21wb3NpdGlvbk5vZGU6OkJ1aWxkZXIgYnVpbGRlcjsKLSAgICAgIGJ1aWxkZXIuQWRkQ2hpbGQobmV3IHJlbmRlcl90cmVlOjpSZWN0Tm9kZSgKLSAgICAgICAgICBtYXRoOjpSZWN0Rih2aWV3cG9ydF9zaXplXyksCi0gICAgICAgICAgc2NvcGVkX3B0cjxyZW5kZXJfdHJlZTo6QnJ1c2g+KG5ldyByZW5kZXJfdHJlZTo6U29saWRDb2xvckJydXNoKAotICAgICAgICAgICAgICByZW5kZXJfdHJlZTo6Q29sb3JSR0JBKDAuMGYsIDAuMGYsIDAuMGYsIDEuMGYpKSkpKTsKLSAgICAgIGJ1aWxkZXIuQWRkQ2hpbGQoZGVidWdfY29uc29sZV9yZW5kZXJfdHJlZV8tPnJlbmRlcl90cmVlKTsKLQotICAgICAgcmVuZGVyZXI6OlN1Ym1pc3Npb24gY29tYmluZWRfc3VibWlzc2lvbigqZGVidWdfY29uc29sZV9yZW5kZXJfdHJlZV8pOwotICAgICAgY29tYmluZWRfc3VibWlzc2lvbi5yZW5kZXJfdHJlZSA9Ci0gICAgICAgICAgbmV3IHJlbmRlcl90cmVlOjpDb21wb3NpdGlvbk5vZGUoYnVpbGRlcik7Ci0gICAgICByZW5kZXJlcl9tb2R1bGVfLT5waXBlbGluZSgpLT5TdWJtaXQoY29tYmluZWRfc3VibWlzc2lvbik7CisgIC8vIEFkZCBjaGlsZHJlbiBmb3IgYWxsIGxheWVycyBpbiBvcmRlci4KKyAgYmFzZTo6b3B0aW9uYWw8cmVuZGVyZXI6OlN1Ym1pc3Npb24+IGZpcnN0X3RyZWUgPSBiYXNlOjpudWxsb3B0OworICBiYXNlOjpvcHRpb25hbDxyZW5kZXJlcjo6U3VibWlzc2lvbj4gY29tYmluZWRfc3VibWlzc2lvbiA9IGJhc2U6Om51bGxvcHQ7CisgIGZvciAoYXV0byBpdCA9IGxheWVyc18uYmVnaW4oKTsgaXQgIT0gbGF5ZXJzXy5lbmQoKTsgKytpdCkgeworICAgIFJlbmRlclRyZWVDb21iaW5lcjo6TGF5ZXIqIGxheWVyID0gaXQtPnNlY29uZDsKKyAgICBpZiAobGF5ZXItPnJlbmRlcl90cmVlXykgeworICAgICAgYnVpbGRlci5BZGRDaGlsZChsYXllci0+cmVuZGVyX3RyZWVfLT5yZW5kZXJfdHJlZSk7CisgICAgICBmaXJzdF90cmVlID0gbGF5ZXItPnJlbmRlcl90cmVlXzsKKyAgICAgIC8vIE1ha2UgdGhlIGNvbWJpbmVkIHN1Ym1pc3Npb24gd2l0aCB0aGUgZmlyc3QgcmVjZWlwdF90aW1lXyB3ZSBmaW5kLgorICAgICAgaWYgKCFjb21iaW5lZF9zdWJtaXNzaW9uICYmIGxheWVyLT5yZWNlaXB0X3RpbWVfKSB7CisgICAgICAgIGNvbWJpbmVkX3N1Ym1pc3Npb24gPSByZW5kZXJlcjo6U3VibWlzc2lvbigqbGF5ZXItPnJlbmRlcl90cmVlXyk7CisgICAgICAgIGNvbWJpbmVkX3N1Ym1pc3Npb24tPnRpbWVfb2Zmc2V0ID0KKyAgICAgICAgICAgIGxheWVyLT5yZW5kZXJfdHJlZV8tPnRpbWVfb2Zmc2V0ICsKKyAgICAgICAgICAgIChiYXNlOjpUaW1lVGlja3M6OkhpZ2hSZXNOb3coKSAtICpsYXllci0+cmVjZWlwdF90aW1lXyk7CisgICAgICB9CiAgICAgfQotICB9IGVsc2UgaWYgKG1haW5fcmVuZGVyX3RyZWVfKSB7Ci0gICAgcmVuZGVyZXJfbW9kdWxlXy0+cGlwZWxpbmUoKS0+U3VibWl0KCptYWluX3JlbmRlcl90cmVlXyk7CiAgIH0KKyAgaWYgKCFmaXJzdF90cmVlKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmICghY29tYmluZWRfc3VibWlzc2lvbikgeworICAgIC8vIE5vbmUgb2YgdGhlIGxheWVycyBzdG9yZSB0aGUgdGltZS4KKyAgICBjb21iaW5lZF9zdWJtaXNzaW9uID0gcmVuZGVyZXI6OlN1Ym1pc3Npb24oKmZpcnN0X3RyZWUpOworICB9CisKKyAgY29tYmluZWRfc3VibWlzc2lvbi0+cmVuZGVyX3RyZWUgPSBuZXcgcmVuZGVyX3RyZWU6OkNvbXBvc2l0aW9uTm9kZShidWlsZGVyKTsKKyAgcmVuZGVyZXJfbW9kdWxlXy0+cGlwZWxpbmUoKS0+U3VibWl0KCpjb21iaW5lZF9zdWJtaXNzaW9uKTsKIH0KLSNlbHNlICAgLy8gRU5BQkxFX0RFQlVHX0NPTlNPTEUKLVJlbmRlclRyZWVDb21iaW5lcjo6UmVuZGVyVHJlZUNvbWJpbmVyKAotICAgIHJlbmRlcmVyOjpSZW5kZXJlck1vZHVsZSogcmVuZGVyZXJfbW9kdWxlLCBjb25zdCBtYXRoOjpTaXplJiB2aWV3cG9ydF9zaXplKQotICAgIDogcmVuZGVyZXJfbW9kdWxlXyhyZW5kZXJlcl9tb2R1bGUpIHsKLSAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUih2aWV3cG9ydF9zaXplKTsKLX0KLQotUmVuZGVyVHJlZUNvbWJpbmVyOjp+UmVuZGVyVHJlZUNvbWJpbmVyKCkge30KLQotdm9pZCBSZW5kZXJUcmVlQ29tYmluZXI6OlJlc2V0KCkge30KLQotdm9pZCBSZW5kZXJUcmVlQ29tYmluZXI6OlVwZGF0ZU1haW5SZW5kZXJUcmVlKAotICAgIGNvbnN0IHJlbmRlcmVyOjpTdWJtaXNzaW9uJiByZW5kZXJfdHJlZV9zdWJtaXNzaW9uKSB7Ci0gIHJlbmRlcmVyX21vZHVsZV8tPnBpcGVsaW5lKCktPlN1Ym1pdChyZW5kZXJfdHJlZV9zdWJtaXNzaW9uKTsKLX0KLQotdm9pZCBSZW5kZXJUcmVlQ29tYmluZXI6OlVwZGF0ZURlYnVnQ29uc29sZVJlbmRlclRyZWUoCi0gICAgY29uc3QgYmFzZTo6b3B0aW9uYWw8cmVuZGVyZXI6OlN1Ym1pc3Npb24+JiByZW5kZXJfdHJlZV9zdWJtaXNzaW9uKSB7Ci0gIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIocmVuZGVyX3RyZWVfc3VibWlzc2lvbik7Ci19Ci0jZW5kaWYgIC8vIEVOQUJMRV9ERUJVR19DT05TT0xFCi0KIH0gIC8vIG5hbWVzcGFjZSBicm93c2VyCiB9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvcmVuZGVyX3RyZWVfY29tYmluZXIuaCBiL3NyYy9jb2JhbHQvYnJvd3Nlci9yZW5kZXJfdHJlZV9jb21iaW5lci5oCmluZGV4IDc2YjFhMjIuLjY1ZjMxMjcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9yZW5kZXJfdHJlZV9jb21iaW5lci5oCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9yZW5kZXJfdHJlZV9jb21iaW5lci5oCkBAIC0xNSw0OSArMTUsNzIgQEAKICNpZm5kZWYgQ09CQUxUX0JST1dTRVJfUkVOREVSX1RSRUVfQ09NQklORVJfSF8KICNkZWZpbmUgQ09CQUxUX0JST1dTRVJfUkVOREVSX1RSRUVfQ09NQklORVJfSF8KIAorI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKKyNpbmNsdWRlICJiYXNlL29wdGlvbmFsLmgiCisjaW5jbHVkZSAiYmFzZS90aW1lLmgiCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZS5oIgogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9zdWJtaXNzaW9uLmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIGJyb3dzZXIgewogCi0vLyBDb21iaW5lcyB0aGUgbWFpbiBhbmQgZGVidWcgY29uc29sZSByZW5kZXIgdHJlZXMuIENhY2hlcyB0aGUgaW5kaXZpZHVhbAotLy8gdHJlZXMgYXMgdGhleSBhcmUgcHJvZHVjZWQuIFJlLXJlbmRlcnMgd2hlbiBlaXRoZXIgdHJlZSBjaGFuZ2VzLgotLy8gVGhpcyBjbGFzcyBpcyBvbmx5IGZ1bGx5IGltcGxlbWVudGVkIHdoZW4gRU5BQkxFX0RFQlVHX0NPTlNPTEUgaXMgZGVmaW5lZCwKLS8vIG90aGVyd2lzZSAoZS5nLiBpbiByZWxlYXNlIGJ1aWxkcykgYSBzdHViIGltcGxlbWVudGF0aW9uIGlzIHVzZWQuCisvLyBDb21iaW5lcyByZW5kZXJpbmcgbGF5ZXJzIChzdWNoIGFzIHRoZSBtYWluLCBzcGxhc2ggc2NyZWVuLCBhbmQKKy8vIGRlYnVnIGNvbnNvbGUpLiBDYWNoZXMgdGhlIGluZGl2aWR1YWwgdHJlZXMgYXMgdGhleSBhcmUgcHJvZHVjZWQuCisvLyBSZS1yZW5kZXJzIHdoZW4gYW55IHRyZWUgY2hhbmdlcy4KIGNsYXNzIFJlbmRlclRyZWVDb21iaW5lciB7CiAgcHVibGljOgorICAvLyBMYXllciByZXByZXNlbnRzIHRoZSByZW5kZXIgbGF5ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgbWFpbiB3ZWIKKyAgLy8gbW9kdWxlLCB0aGUgc3BsYXNoIHNjcmVlbiwgb3IgdGhlIGRlYnVnIGNvbnNvbGUgYW5kIGFyZSB1c2VkIHRvCisgIC8vIGNyZWF0ZSBhbmQgc3VibWl0IGEgY29tYmluZWQgdHJlZSB0byB0aGUgUmVuZGVyZXJNb2R1bGUncworICAvLyBwaXBlbGluZS4gTGF5ZXJzIGFyZSBjb21iaW5lZCBpbiBvcmRlciBvZiB0aGUgfHpfaW5kZXh8IHNwZWNpZmVkCisgIC8vIGF0IHRoZSBMYXllcnMnIGNyZWF0aW9uLiBUaGUgUmVuZGVyVHJlZUNvbWJpbmVyIHN0b3JlcyBwb2ludGVycworICAvLyB0byBMYXllcnMuIFRoZSBMYXllcnMgYXJlIG93bmVkIGJ5IHRoZSBjYWxsZXIgb2YKKyAgLy8gUmVuZGVyVHJlZUNvbWJpbmVyOjpDcmVhdGVMYXllci4KKyAgY2xhc3MgTGF5ZXIgeworICAgcHVibGljOgorICAgIH5MYXllcigpOworCisgICAgdm9pZCBSZXNldCgpIHsKKyAgICAgIHJlbmRlcl90cmVlXyA9IGJhc2U6Om51bGxvcHQ7CisgICAgICByZWNlaXB0X3RpbWVfID0gYmFzZTo6bnVsbG9wdDsKKyAgICB9CisKKyAgICAvLyBTdWJtaXQgcmVuZGVyIHRyZWUgdG8gdGhlIGxheWVyLCBhbmQgc3BlY2lmeSB3aGV0aGVyIHRoZSB0aW1lCisgICAgLy8gcmVjZWl2ZWQgc2hvdWxkIGJlIHN0b3JlZC4KKyAgICB2b2lkIFN1Ym1pdCgKKyAgICAgICAgY29uc3QgYmFzZTo6b3B0aW9uYWw8cmVuZGVyZXI6OlN1Ym1pc3Npb24+JiByZW5kZXJfdHJlZV9zdWJtaXNzaW9uLAorICAgICAgICBib29sIHJlY2VpdmVfdGltZSA9IGZhbHNlKTsKKworICAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUmVuZGVyVHJlZUNvbWJpbmVyOworCisgICAgZXhwbGljaXQgTGF5ZXIoUmVuZGVyVHJlZUNvbWJpbmVyKiByZW5kZXJfdHJlZV9jb21iaW5lciA9IE5VTEwpOworCisgICAgUmVuZGVyVHJlZUNvbWJpbmVyKiByZW5kZXJfdHJlZV9jb21iaW5lcl87CisKKyAgICBiYXNlOjpvcHRpb25hbDxyZW5kZXJlcjo6U3VibWlzc2lvbj4gcmVuZGVyX3RyZWVfOworICAgIGJhc2U6Om9wdGlvbmFsPGJhc2U6OlRpbWVUaWNrcz4gcmVjZWlwdF90aW1lXzsKKyAgfTsKKwogICBleHBsaWNpdCBSZW5kZXJUcmVlQ29tYmluZXIocmVuZGVyZXI6OlJlbmRlcmVyTW9kdWxlKiByZW5kZXJlcl9tb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRoOjpTaXplJiB2aWV3cG9ydF9zaXplKTsKLSAgflJlbmRlclRyZWVDb21iaW5lcigpOworICB+UmVuZGVyVHJlZUNvbWJpbmVyKCkge30KIAotICB2b2lkIFJlc2V0KCk7Ci0KLSAgLy8gVXBkYXRlIHRoZSBtYWluIHdlYiBtb2R1bGUgcmVuZGVyIHRyZWUuCi0gIHZvaWQgVXBkYXRlTWFpblJlbmRlclRyZWUoY29uc3QgcmVuZGVyZXI6OlN1Ym1pc3Npb24mIHJlbmRlcl90cmVlX3N1Ym1pc3Npb24pOwotCi0gIC8vIFVwZGF0ZSB0aGUgZGVidWcgY29uc29sZSByZW5kZXIgdHJlZS4KLSAgdm9pZCBVcGRhdGVEZWJ1Z0NvbnNvbGVSZW5kZXJUcmVlKAotICAgICAgY29uc3QgYmFzZTo6b3B0aW9uYWw8cmVuZGVyZXI6OlN1Ym1pc3Npb24+JiByZW5kZXJfdHJlZV9zdWJtaXNzaW9uKTsKLQotI2lmIGRlZmluZWQoRU5BQkxFX0RFQlVHX0NPTlNPTEUpCi0gIGJvb2wgcmVuZGVyX2RlYnVnX2NvbnNvbGUoKSBjb25zdCB7IHJldHVybiByZW5kZXJfZGVidWdfY29uc29sZV87IH0KLSAgdm9pZCBzZXRfcmVuZGVyX2RlYnVnX2NvbnNvbGUoYm9vbCByZW5kZXJfZGVidWdfY29uc29sZSkgewotICAgIHJlbmRlcl9kZWJ1Z19jb25zb2xlXyA9IHJlbmRlcl9kZWJ1Z19jb25zb2xlOwotICB9Ci0jZWxzZSAgIC8vIEVOQUJMRV9ERUJVR19DT05TT0xFCi0gIGJvb2wgcmVuZGVyX2RlYnVnX2NvbnNvbGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2b2lkIHNldF9yZW5kZXJfZGVidWdfY29uc29sZShib29sIHJlbmRlcl9kZWJ1Z19jb25zb2xlKSB7Ci0gICAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihyZW5kZXJfZGVidWdfY29uc29sZSk7Ci0gIH0KLSNlbmRpZiAgLy8gRU5BQkxFX0RFQlVHX0NPTlNPTEUKKyAgLy8gQ3JlYXRlIGEgTGF5ZXIgd2l0aCBhIGdpdmVuIHx6X2luZGV4fC4gSWYgYSBMYXllciBhbHJlYWR5IGV4aXN0cworICAvLyBhdCB8el9pbmRleHwsIHJldHVybiBOVUxMLCBhbmQgbm8gTGF5ZXIgaXMgY3JlYXRlZC4KKyAgc2NvcGVkX3B0cjxMYXllcj4gQ3JlYXRlTGF5ZXIoaW50IHpfaW5kZXgpOwogCiAgcHJpdmF0ZToKLSNpZiBkZWZpbmVkKEVOQUJMRV9ERUJVR19DT05TT0xFKQotICAvLyBDb21iaW5lcyB0aGUgdHdvIGNhY2hlZCByZW5kZXIgdHJlZXMgKG1haW4vZGVidWcpIGFuZCByZW5kZXJzIHRoZSByZXN1bHQuCi0gIHZvaWQgU3VibWl0VG9SZW5kZXJlcigpOworICAvLyBUaGUgbGF5ZXJzIGtleWVkIG9uIHRoZWlyIHpfaW5kZXguCisgIHN0ZDo6bWFwPGludCwgTGF5ZXIqPiBsYXllcnNfOwogCi0gIGJvb2wgcmVuZGVyX2RlYnVnX2NvbnNvbGVfOworICAvLyBSZW1vdmVzIGEgbGF5ZXIgZnJvbSB8bGF5ZXJzX3wuIENhbGxlZCBieSB0aGUgTGF5ZXIgZGVzdHJ1Y3Rvci4KKyAgdm9pZCBSZW1vdmVMYXllcihjb25zdCBMYXllciogbGF5ZXIpOworCisgIC8vIENvbWJpbmVzIHRoZSBjYWNoZWQgcmVuZGVyIHRyZWVzIGFuZCByZW5kZXJzIHRoZSByZXN1bHQuCisgIHZvaWQgU3VibWl0VG9SZW5kZXJlcigpOwogCiAgIC8vIExvY2FsIHJlZmVyZW5jZSB0byB0aGUgcmVuZGVyIHBpcGVsaW5lLCBzbyB3ZSBjYW4gc3VibWl0IHRoZSBjb21iaW5lZCB0cmVlLgogICAvLyBSZWZlcmVuY2UgY291bnRlZCBwb2ludGVyIG5vdCBuZWNlc3NhcnkgaGVyZS4KQEAgLTY1LDIyICs4OCw2IEBACiAKICAgLy8gVGhlIHNpemUgb2YgdGhlIG91dHB1dCB2aWV3cG9ydC4KICAgbWF0aDo6U2l6ZSB2aWV3cG9ydF9zaXplXzsKLQotICAvLyBMb2NhbCByZWZlcmVuY2VzIHRvIHRoZSBtYWluIGFuZCBkZWJ1ZyBjb25zb2xlIHJlbmRlciB0cmVlcy9hbmltYXRpb24gbWFwcwotICAvLyBzbyB3ZSBjYW4gY29tYmluZSB0aGVtLgotICBiYXNlOjpvcHRpb25hbDxyZW5kZXJlcjo6U3VibWlzc2lvbj4gbWFpbl9yZW5kZXJfdHJlZV87Ci0KLSAgLy8gVGhpcyBpcyB0aGUgdGltZSB0aGF0IHdlIHJlY2VpdmVkIHRoZSBsYXN0IG1haW4gcmVuZGVyIHRyZWUgc3VibWlzc2lvbi4KLSAgLy8gdXNlZCBzbyB0aGF0IHdlIGtub3cgd2hhdCB0aW1lIHRvIGZvcndhcmQgdGhlIHN1Ym1pc3Npb24gdG8gdGhlIHBpcGVsaW5lCi0gIC8vIHdpdGguCi0gIGJhc2U6Om9wdGlvbmFsPGJhc2U6OlRpbWVUaWNrcz4gbWFpbl9yZW5kZXJfdHJlZV9yZWNlaXB0X3RpbWVfOwotCi0gIC8vIFRoZSBkZWJ1ZyBjb25zb2xlIHJlbmRlciB0cmVlIHN1Ym1pc3Npb24uCi0gIGJhc2U6Om9wdGlvbmFsPHJlbmRlcmVyOjpTdWJtaXNzaW9uPiBkZWJ1Z19jb25zb2xlX3JlbmRlcl90cmVlXzsKLSNlbHNlICAgLy8gRU5BQkxFX0RFQlVHX0NPTlNPTEUKLSAgLy8gVXNlIHRoaXMgbG9jYWwgcmVmZXJlbmNlIGV2ZW4gaW4gcmVsZWFzZSBidWlsZHMgdG8gc3VibWl0IHRoZSBtYWluIHRyZWUuCi0gIHJlbmRlcmVyOjpSZW5kZXJlck1vZHVsZSogcmVuZGVyZXJfbW9kdWxlXzsKLSNlbmRpZiAgLy8gRU5BQkxFX0RFQlVHX0NPTlNPTEUKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBicm93c2VyCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvc3BsYXNoX3NjcmVlbi5jYyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9zcGxhc2hfc2NyZWVuLmNjCmluZGV4IDhjNzhjZTIuLjI5OTliNDEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9zcGxhc2hfc2NyZWVuLmNjCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9zcGxhc2hfc2NyZWVuLmNjCkBAIC0xNywyNSArMTcsNTEgQEAKICNpbmNsdWRlIDxzdHJpbmc+CiAKICNpbmNsdWRlICJiYXNlL2JpbmQuaCIKKyNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCisjaW5jbHVkZSAiYmFzZS9jYW5jZWxhYmxlX2NhbGxiYWNrLmgiCiAjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvcGxhdGZvcm1fdGhyZWFkLmgiCisjaW5jbHVkZSAiYmFzZS90aW1lLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Jyb3dzZXIvc3BsYXNoX3NjcmVlbl9jYWNoZS5oIgogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvY2FjaGVfZmV0Y2hlci5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBicm93c2VyIHsKK25hbWVzcGFjZSB7CiAKLVNwbGFzaFNjcmVlbjo6U3BsYXNoU2NyZWVuKGJhc2U6OkFwcGxpY2F0aW9uU3RhdGUgaW5pdGlhbF9hcHBsaWNhdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYk1vZHVsZTo6T25SZW5kZXJUcmVlUHJvZHVjZWRDYWxsYmFjayYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJfdHJlZV9wcm9kdWNlZF9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcms6Ok5ldHdvcmtNb2R1bGUqIG5ldHdvcmtfbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0aDo6U2l6ZSYgd2luZG93X2RpbWVuc2lvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlciogcmVzb3VyY2VfcHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsYXlvdXRfcmVmcmVzaF9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1VSTCYgZmFsbGJhY2tfc3BsYXNoX3NjcmVlbl91cmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVVJMJiBpbml0aWFsX21haW5fd2ViX21vZHVsZV91cmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTcGxhc2hTY3JlZW5DYWNoZSogc3BsYXNoX3NjcmVlbl9jYWNoZSkKK2NvbnN0IGludCBrU3BsYXNoU2h1dGRvd25TZWNvbmRzID0gMjsKKwordm9pZCBQb3N0Q2FsbGJhY2tUb01lc3NhZ2VMb29wKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMb29wKiBtZXNzYWdlX2xvb3ApIHsKKyAgRENIRUNLKG1lc3NhZ2VfbG9vcCk7CisgIG1lc3NhZ2VfbG9vcC0+UG9zdFRhc2soRlJPTV9IRVJFLCBjYWxsYmFjayk7Cit9CisKKy8vIFRPRE86IGNvbnNvbGlkYXRlIGRlZmluaXRpb25zIG9mIEJpbmRUb0xvb3AgLyBCaW5kVG9DdXJyZW50TG9vcAorLy8gZnJvbSBoZXJlIGFuZCBtZWRpYSBpbiBiYXNlLgorYmFzZTo6Q2xvc3VyZSBCaW5kVG9Mb29wKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMb29wKiBtZXNzYWdlX2xvb3ApIHsKKyAgcmV0dXJuIGJhc2U6OkJpbmQoJlBvc3RDYWxsYmFja1RvTWVzc2FnZUxvb3AsIGNhbGxiYWNrLCBtZXNzYWdlX2xvb3ApOworfQorCit2b2lkIE9uRXJyb3IoY29uc3QgR1VSTCYgLyogdXJsICovLCBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3IpIHsKKyAgTE9HKEVSUk9SKSA8PCBlcnJvcjsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK1NwbGFzaFNjcmVlbjo6U3BsYXNoU2NyZWVuKAorICAgIGJhc2U6OkFwcGxpY2F0aW9uU3RhdGUgaW5pdGlhbF9hcHBsaWNhdGlvbl9zdGF0ZSwKKyAgICBjb25zdCBXZWJNb2R1bGU6Ok9uUmVuZGVyVHJlZVByb2R1Y2VkQ2FsbGJhY2smCisgICAgICAgIHJlbmRlcl90cmVlX3Byb2R1Y2VkX2NhbGxiYWNrLAorICAgIG5ldHdvcms6Ok5ldHdvcmtNb2R1bGUqIG5ldHdvcmtfbW9kdWxlLCBjb25zdCBtYXRoOjpTaXplJiB3aW5kb3dfZGltZW5zaW9ucywKKyAgICByZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlciogcmVzb3VyY2VfcHJvdmlkZXIsIGZsb2F0IGxheW91dF9yZWZyZXNoX3JhdGUsCisgICAgY29uc3QgR1VSTCYgZmFsbGJhY2tfc3BsYXNoX3NjcmVlbl91cmwsCisgICAgY29uc3QgR1VSTCYgaW5pdGlhbF9tYWluX3dlYl9tb2R1bGVfdXJsLAorICAgIFNwbGFzaFNjcmVlbkNhY2hlKiBzcGxhc2hfc2NyZWVuX2NhY2hlLAorICAgIGNvbnN0IGJhc2U6OkNhbGxiYWNrPHZvaWQoKT4mIG9uX3NwbGFzaF9zY3JlZW5fc2h1dGRvd25fY29tcGxldGUpCiAgICAgOiByZW5kZXJfdHJlZV9wcm9kdWNlZF9jYWxsYmFja18ocmVuZGVyX3RyZWVfcHJvZHVjZWRfY2FsbGJhY2spLAotICAgICAgaXNfcmVhZHlfKHRydWUsIGZhbHNlKSB7CisgICAgICBzZWxmX21lc3NhZ2VfbG9vcF8oTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSksCisgICAgICBvbl9zcGxhc2hfc2NyZWVuX3NodXRkb3duX2NvbXBsZXRlXyhvbl9zcGxhc2hfc2NyZWVuX3NodXRkb3duX2NvbXBsZXRlKSB7CiAgIFdlYk1vZHVsZTo6T3B0aW9ucyB3ZWJfbW9kdWxlX29wdGlvbnM7CiAgIHdlYl9tb2R1bGVfb3B0aW9ucy5uYW1lID0gIlNwbGFzaFNjcmVlbldlYk1vZHVsZSI7CiAKQEAgLTU3LDExICs4MywxNCBAQAogICAgIHdlYl9tb2R1bGVfb3B0aW9ucy5zcGxhc2hfc2NyZWVuX2NhY2hlID0gc3BsYXNoX3NjcmVlbl9jYWNoZTsKICAgfQogCisgIGJhc2U6OkNhbGxiYWNrPHZvaWQoKT4gb25fd2luZG93X2Nsb3NlKAorICAgICAgQmluZFRvTG9vcChvbl9zcGxhc2hfc2NyZWVuX3NodXRkb3duX2NvbXBsZXRlLCBzZWxmX21lc3NhZ2VfbG9vcF8pKTsKKworICB3ZWJfbW9kdWxlX29wdGlvbnMub25fYmVmb3JlX3VubG9hZF9maXJlZF9idXRfbm90X2hhbmRsZWQgPSBvbl93aW5kb3dfY2xvc2U7CisKICAgd2ViX21vZHVsZV8ucmVzZXQobmV3IFdlYk1vZHVsZSgKLSAgICAgIHVybF90b19wYXNzLCBpbml0aWFsX2FwcGxpY2F0aW9uX3N0YXRlLAotICAgICAgYmFzZTo6QmluZCgmU3BsYXNoU2NyZWVuOjpPblJlbmRlclRyZWVQcm9kdWNlZCwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICBiYXNlOjpCaW5kKCZTcGxhc2hTY3JlZW46Ok9uRXJyb3IsIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAotICAgICAgYmFzZTo6QmluZCgmU3BsYXNoU2NyZWVuOjpPbldpbmRvd0Nsb3NlZCwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCisgICAgICB1cmxfdG9fcGFzcywgaW5pdGlhbF9hcHBsaWNhdGlvbl9zdGF0ZSwgcmVuZGVyX3RyZWVfcHJvZHVjZWRfY2FsbGJhY2tfLAorICAgICAgYmFzZTo6QmluZCgmT25FcnJvciksIG9uX3dpbmRvd19jbG9zZSwKICAgICAgIGJhc2U6OkNsb3N1cmUoKSwgIC8vIHdpbmRvd19taW5pbWl6ZV9jYWxsYmFjawogICAgICAgJnN0dWJfbWVkaWFfbW9kdWxlXywgbmV0d29ya19tb2R1bGUsIHdpbmRvd19kaW1lbnNpb25zLAogICAgICAgMS5mIC8qdmlkZW9fcGl4ZWxfcmF0aW8qLywgcmVzb3VyY2VfcHJvdmlkZXIsIGxheW91dF9yZWZyZXNoX3JhdGUsCkBAIC02OSwyMyArOTgsMjMgQEAKIH0KIAogU3BsYXNoU2NyZWVuOjp+U3BsYXNoU2NyZWVuKCkgeworICBEQ0hFQ0tfRVEoTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSwgc2VsZl9tZXNzYWdlX2xvb3BfKTsKICAgLy8gRGVzdHJveSB0aGUgd2ViIG1vZHVsZSBmaXJzdCB0byBwcmV2ZW50IG91ciBjYWxsYmFja3MgZnJvbSBiZWluZyBjYWxsZWQKICAgLy8gKGZyb20gYW5vdGhlciB0aHJlYWQpIHdoaWxlIG1lbWJlciBvYmplY3RzIGFyZSBiZWluZyBkZXN0cm95ZWQuCiAgIHdlYl9tb2R1bGVfLnJlc2V0KCk7CisgIC8vIENhbmNlbCBhbnkgcGVuZGluZyBydW4gb2YgdGhlIHNwbGFzaCBzY3JlZW4gc2h1dGRvd24gY2FsbGJhY2suCisgIG9uX3NwbGFzaF9zY3JlZW5fc2h1dGRvd25fY29tcGxldGVfLkNhbmNlbCgpOwogfQogCi12b2lkIFNwbGFzaFNjcmVlbjo6V2FpdFVudGlsUmVhZHkoKSB7Ci0gIGlzX3JlYWR5Xy5XYWl0KCk7Ci19Ci0KLXZvaWQgU3BsYXNoU2NyZWVuOjpPblJlbmRlclRyZWVQcm9kdWNlZCgKLSAgICBjb25zdCBicm93c2VyOjpXZWJNb2R1bGU6OkxheW91dFJlc3VsdHMmIGxheW91dF9yZXN1bHRzKSB7Ci0gIGlzX3JlYWR5Xy5TaWduYWwoKTsKLSAgcmVuZGVyX3RyZWVfcHJvZHVjZWRfY2FsbGJhY2tfLlJ1bihsYXlvdXRfcmVzdWx0cyk7Ci19Ci0KLXZvaWQgU3BsYXNoU2NyZWVuOjpPbldpbmRvd0Nsb3NlZCgpIHsKLSAgaXNfcmVhZHlfLlNpZ25hbCgpOwordm9pZCBTcGxhc2hTY3JlZW46OlNodXRkb3duKCkgeworICBEQ0hFQ0tfRVEoTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSwgc2VsZl9tZXNzYWdlX2xvb3BfKTsKKyAgRENIRUNLKHdlYl9tb2R1bGVfKTsKKyAgaWYgKCFvbl9zcGxhc2hfc2NyZWVuX3NodXRkb3duX2NvbXBsZXRlXy5jYWxsYmFjaygpLmlzX251bGwoKSkgeworICAgIE1lc3NhZ2VMb29wOjpjdXJyZW50KCktPlBvc3REZWxheWVkVGFzaygKKyAgICAgICAgRlJPTV9IRVJFLCBvbl9zcGxhc2hfc2NyZWVuX3NodXRkb3duX2NvbXBsZXRlXy5jYWxsYmFjaygpLAorICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKGtTcGxhc2hTaHV0ZG93blNlY29uZHMpKTsKKyAgfQorICB3ZWJfbW9kdWxlXy0+SW5qZWN0QmVmb3JlVW5sb2FkRXZlbnQoKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGJyb3dzZXIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9zcGxhc2hfc2NyZWVuLmggYi9zcmMvY29iYWx0L2Jyb3dzZXIvc3BsYXNoX3NjcmVlbi5oCmluZGV4IDBlMDc5MTUuLjczZGIwNjIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9zcGxhc2hfc2NyZWVuLmgKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3NwbGFzaF9zY3JlZW4uaApAQCAtMzMsMTYgKzMzLDE3IEBACiAvLwogY2xhc3MgU3BsYXNoU2NyZWVuIDogcHVibGljIExpZmVjeWNsZU9ic2VydmVyIHsKICBwdWJsaWM6Ci0gIFNwbGFzaFNjcmVlbihiYXNlOjpBcHBsaWNhdGlvblN0YXRlIGluaXRpYWxfYXBwbGljYXRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICBjb25zdCBXZWJNb2R1bGU6Ok9uUmVuZGVyVHJlZVByb2R1Y2VkQ2FsbGJhY2smCi0gICAgICAgICAgICAgICAgICAgcmVuZGVyX3RyZWVfcHJvZHVjZWRfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICBuZXR3b3JrOjpOZXR3b3JrTW9kdWxlKiBuZXR3b3JrX21vZHVsZSwKLSAgICAgICAgICAgICAgIGNvbnN0IG1hdGg6OlNpemUmIHdpbmRvd19kaW1lbnNpb25zLAotICAgICAgICAgICAgICAgcmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyLAotICAgICAgICAgICAgICAgZmxvYXQgbGF5b3V0X3JlZnJlc2hfcmF0ZSwKLSAgICAgICAgICAgICAgIGNvbnN0IEdVUkwmIGZhbGxiYWNrX3NwbGFzaF9zY3JlZW5fdXJsLAotICAgICAgICAgICAgICAgY29uc3QgR1VSTCYgaW5pdGlhbF9tYWluX3dlYl9tb2R1bGVfdXJsLAotICAgICAgICAgICAgICAgY29iYWx0Ojpicm93c2VyOjpTcGxhc2hTY3JlZW5DYWNoZSogc3BsYXNoX3NjcmVlbl9jYWNoZSk7CisgIFNwbGFzaFNjcmVlbigKKyAgICAgIGJhc2U6OkFwcGxpY2F0aW9uU3RhdGUgaW5pdGlhbF9hcHBsaWNhdGlvbl9zdGF0ZSwKKyAgICAgIGNvbnN0IFdlYk1vZHVsZTo6T25SZW5kZXJUcmVlUHJvZHVjZWRDYWxsYmFjayYKKyAgICAgICAgICByZW5kZXJfdHJlZV9wcm9kdWNlZF9jYWxsYmFjaywKKyAgICAgIG5ldHdvcms6Ok5ldHdvcmtNb2R1bGUqIG5ldHdvcmtfbW9kdWxlLAorICAgICAgY29uc3QgbWF0aDo6U2l6ZSYgd2luZG93X2RpbWVuc2lvbnMsCisgICAgICByZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlciogcmVzb3VyY2VfcHJvdmlkZXIsCisgICAgICBmbG9hdCBsYXlvdXRfcmVmcmVzaF9yYXRlLCBjb25zdCBHVVJMJiBmYWxsYmFja19zcGxhc2hfc2NyZWVuX3VybCwKKyAgICAgIGNvbnN0IEdVUkwmIGluaXRpYWxfbWFpbl93ZWJfbW9kdWxlX3VybCwKKyAgICAgIGNvYmFsdDo6YnJvd3Nlcjo6U3BsYXNoU2NyZWVuQ2FjaGUqIHNwbGFzaF9zY3JlZW5fY2FjaGUsCisgICAgICBjb25zdCBiYXNlOjpDYWxsYmFjazx2b2lkKCk+JiBvbl9zcGxhc2hfc2NyZWVuX3NodXRkb3duX2NvbXBsZXRlKTsKICAgflNwbGFzaFNjcmVlbigpOwogCiAgIHZvaWQgU2V0U2l6ZShjb25zdCBtYXRoOjpTaXplJiB3aW5kb3dfZGltZW5zaW9ucywgZmxvYXQgdmlkZW9fcGl4ZWxfcmF0aW8pIHsKQEAgLTYxLDI5ICs2MiwzMiBAQAogICAgIHdlYl9tb2R1bGVfLT5SZXN1bWUocmVzb3VyY2VfcHJvdmlkZXIpOwogICB9CiAKLSAgLy8gQmxvY2sgdGhlIGNhbGxlciB1bnRpbCB0aGUgc3BsYXNoIHNjcmVlbiBpcyByZWFkeSB0byBiZSByZW5kZXJlZC4KLSAgdm9pZCBXYWl0VW50aWxSZWFkeSgpOworICB2b2lkIFJlZHVjZU1lbW9yeSgpIHsgd2ViX21vZHVsZV8tPlJlZHVjZU1lbW9yeSgpOyB9CisKKyAgLy8gVGhpcyBkaXNwYXRjaGVzIGV2ZW50IGJlZm9yZXVubG9hZCBpbiB0aGUgV2ViTW9kdWxlLiBJZgorICAvLyBiZWZvcmV1bmxvYWQgaGFzIGFueSBoYW5kbGVycyBvciBsaXN0ZW5lcnMsIFNodXRkb3duIHdhaXRzIGZvcgorICAvLyB3aW5kb3cuY2xvc2UgdG8gYmUgY2FsbGVkIG9yIGEgbWF4aW11bSBvZiBrU3BsYXNoU2h1dGRvd25TZWNvbmRzCisgIC8vIGJlZm9yZSBydW5uaW5nIHxvbl9zcGxhc2hfc2NyZWVuX3NodXRkb3duX2NvbXBsZXRlX3wuIElmIGJlZm9yZXVubG9hZCBoYXMKKyAgLy8gbm8gaGFuZGxlcnMsIHxvbl9zcGxhc2hfc2NyZWVuX3NodXRkb3duX2NvbXBsZXRlX3wgaXMgcnVuIGltbWVkaWF0ZWx5LgorICB2b2lkIFNodXRkb3duKCk7CiAKICBwcml2YXRlOgotICB2b2lkIE9uUmVuZGVyVHJlZVByb2R1Y2VkKAotICAgICAgY29uc3QgYnJvd3Nlcjo6V2ViTW9kdWxlOjpMYXlvdXRSZXN1bHRzJiBsYXlvdXRfcmVzdWx0cyk7Ci0KLSAgdm9pZCBPbkVycm9yKGNvbnN0IEdVUkwmIC8qIHVybCAqLywgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yKSB7Ci0gICAgaXNfcmVhZHlfLlNpZ25hbCgpOwotICAgIExPRyhFUlJPUikgPDwgZXJyb3I7Ci0gIH0KLQorICAvLyBSdW4gd2hlbiB3aW5kb3cuY2xvc2UoKSBpcyBjYWxsZWQgYnkgdGhlIFdlYk1vZHVsZS4KICAgdm9pZCBPbldpbmRvd0Nsb3NlZCgpOworICB2b2lkIE9uV2luZG93Q2xvc2VkSW50ZXJuYWwoKTsKIAogICBtZWRpYTo6TWVkaWFNb2R1bGVTdHViIHN0dWJfbWVkaWFfbW9kdWxlXzsKIAogICBXZWJNb2R1bGU6Ok9uUmVuZGVyVHJlZVByb2R1Y2VkQ2FsbGJhY2sgcmVuZGVyX3RyZWVfcHJvZHVjZWRfY2FsbGJhY2tfOwogCi0gIC8vIFNpZ25hbGxlZCBvbmNlIHRoZSBzcGxhc2ggc2NyZWVuIGhhcyBwcm9kdWNlZCBpdHMgZmlyc3QgcmVuZGVyIHRyZWUgb3IKLSAgLy8gYW4gZXJyb3Igb2NjdXJyZWQuCi0gIGJhc2U6OldhaXRhYmxlRXZlbnQgaXNfcmVhZHlfOwotCiAgIHNjb3BlZF9wdHI8V2ViTW9kdWxlPiB3ZWJfbW9kdWxlXzsKKworICAvLyBUaGUgc3BsYXNoIHNjcmVlbiBydW5zIG9uIHRoaXMgbWVzc2FnZSBsb29wLgorICBNZXNzYWdlTG9vcCogY29uc3Qgc2VsZl9tZXNzYWdlX2xvb3BfOworCisgIC8vIFRoaXMgaXMgY2FsbGVkIGJ5IFNodXRkb3duICh2aWEgd2luZG93LmNsb3NlKSBvciBhZnRlcgorICAvLyB0aGUgdGltZSBsaW1pdCBoYXMgYmVlbiBleGNlZWRlZC4KKyAgYmFzZTo6Q2FuY2VsYWJsZUNsb3N1cmUgb25fc3BsYXNoX3NjcmVlbl9zaHV0ZG93bl9jb21wbGV0ZV87CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYnJvd3NlcgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL3N1c3BlbmRfZnV6emVyLmNjIGIvc3JjL2NvYmFsdC9icm93c2VyL3N1c3BlbmRfZnV6emVyLmNjCmluZGV4IGI5NDE1OGIuLjUxYTcyNjUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9zdXNwZW5kX2Z1enplci5jYworKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvc3VzcGVuZF9mdXp6ZXIuY2MKQEAgLTQzLDIwICs0MywxMyBAQAogCiB2b2lkIFN1c3BlbmRGdXp6ZXI6OkRvU3RlcCgpIHsKICAgRENIRUNLKE1lc3NhZ2VMb29wOjpjdXJyZW50KCkgPT0gdGhyZWFkXy5tZXNzYWdlX2xvb3AoKSk7Ci0jaWYgU0JfQVBJX1ZFUlNJT04gPCA0Ci0gIE5PVFJFQUNIRUQoKSA8PCAiQ2Fubm90IHJ1biBzdXNwZW5kX2Z1enplciBvbiBTQl9BUElfVkVSU0lPTiA8IDQuIjsKLSNlbmRpZgogICBpZiAoc3RlcF90eXBlXyA9PSBrU2hvdWxkUmVxdWVzdFN1c3BlbmQpIHsKICAgICBTQl9ETE9HKElORk8pIDw8ICJzdXNwZW5kX2Z1enplcjogUmVxdWVzdGluZyBzdXNwZW5kLiI7Ci0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICAgIFNiU3lzdGVtUmVxdWVzdFN1c3BlbmQoKTsKLSNlbmRpZgogICAgIHN0ZXBfdHlwZV8gPSBrU2hvdWxkUmVxdWVzdFVucGF1c2U7CiAgIH0gZWxzZSBpZiAoc3RlcF90eXBlXyA9PSBrU2hvdWxkUmVxdWVzdFVucGF1c2UpIHsKICAgICBTQl9ETE9HKElORk8pIDw8ICJzdXNwZW5kX2Z1enplcjogUmVxdWVzdGluZyB1bnBhdXNlLiI7Ci0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICAgIFNiU3lzdGVtUmVxdWVzdFVucGF1c2UoKTsKLSNlbmRpZgogICAgIHN0ZXBfdHlwZV8gPSBrU2hvdWxkUmVxdWVzdFN1c3BlbmQ7CiAgIH0gZWxzZSB7CiAgICAgTk9UUkVBQ0hFRCgpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL3N1c3BlbmRfZnV6emVyLmggYi9zcmMvY29iYWx0L2Jyb3dzZXIvc3VzcGVuZF9mdXp6ZXIuaAppbmRleCA0YWE5N2NjLi5kMTY4MWNmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvc3VzcGVuZF9mdXp6ZXIuaAorKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvc3VzcGVuZF9mdXp6ZXIuaApAQCAtMjIsNyArMjIsNyBAQAogbmFtZXNwYWNlIGJyb3dzZXIgewogCiAvLyBSZXBlYXRlZGx5IHN3aXRjaCBvZmYgYmV0d2VlbiBjYWxsaW5nIHxTYlN5c3RlbVJlcXVlc3RTdXNwZW5kfCBhbmQKLS8vIHxTYlN5c3RlbVJlcXVlc3RVbnBhdXNlfCwgb3IganVzdCBuby1vcCBpZiBvbiBhbiBTQl9BUElfVkVSU0lPTiA8IDQuCisvLyB8U2JTeXN0ZW1SZXF1ZXN0VW5wYXVzZXwuCiBjbGFzcyBTdXNwZW5kRnV6emVyIHsKICBwdWJsaWM6CiAgIFN1c3BlbmRGdXp6ZXIoKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9zd2l0Y2hlcy5jYyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9zd2l0Y2hlcy5jYwppbmRleCAyYzM5ZWVkLi4xMWU5OGMzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvc3dpdGNoZXMuY2MKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3N3aXRjaGVzLmNjCkBAIC0zNCwxMiArMzQsMTIgQEAKIC8vIFN3aXRjaGVzIGRpZmZlcmVudCBkZWJ1ZyBjb25zb2xlIG1vZGVzOiBvbiB8IGh1ZCB8IG9mZgogY29uc3QgY2hhciBrRGVidWdDb25zb2xlTW9kZVtdID0gImRlYnVnX2NvbnNvbGUiOwogCisvLyBEbyBub3QgY3JlYXRlIHRoZSBXZWJEcml2ZXIgc2VydmVyLgorY29uc3QgY2hhciBrRGlzYWJsZVdlYkRyaXZlcltdID0gImRpc2FibGVfd2ViZHJpdmVyIjsKKwogLy8gRGlzYWJsZSB3ZWJtL3ZwOS4KIGNvbnN0IGNoYXIga0Rpc2FibGVXZWJtVnA5W10gPSAiZGlzYWJsZV93ZWJtX3ZwOSI7CiAKLS8vIENyZWF0ZSBXZWJEcml2ZXIgc2VydmVyLgotY29uc3QgY2hhciBrRW5hYmxlV2ViRHJpdmVyW10gPSAiZW5hYmxlX3dlYmRyaXZlciI7Ci0KIC8vIEFkZGl0aW9uYWwgYmFzZSBkaXJlY3RvcnkgZm9yIGFjY2Vzc2luZyB3ZWIgZmlsZXMgdmlhIGZpbGU6Ly8uCiBjb25zdCBjaGFyIGtFeHRyYVdlYkZpbGVEaXJbXSA9ICJ3ZWJfZmlsZV9wYXRoIjsKIApAQCAtODMsOCArODMsNyBAQAogY29uc3QgY2hhciBrU3R1YkltYWdlRGVjb2RlcltdID0gInN0dWJfaW1hZ2VfZGVjb2RlciI7CiAKIC8vIElmIHRoaXMgZmxhZyBpcyBzZXQsIGFsdGVybmF0aW5nIGNhbGxzIHRvIHxTYlN5c3RlbVJlcXVlc3RTdXNwZW5kfCBhbmQKLS8vIHxTYlN5c3RlbVJlcXVlc3RVbnBhdXNlfCB3aWxsIGJlIG1hZGUgcGVyaW9kaWNhbGx5LiBSZXF1aXJlcwotLy8gU0JfQVBJX1ZFUlNJT04gPj0gNCwgYW5kIHdpbGwgb3RoZXJ3aXNlIGp1c3Qgbm8tb3AuCisvLyB8U2JTeXN0ZW1SZXF1ZXN0VW5wYXVzZXwgd2lsbCBiZSBtYWRlIHBlcmlvZGljYWxseS4KIGNvbnN0IGNoYXIga1N1c3BlbmRGdXp6ZXJbXSA9ICJzdXNwZW5kX2Z1enplciI7CiAKIC8vIElmIHRoaXMgaXMgc2V0LCB0aGVuIGEgdHJhY2UgKHNlZSBiYXNlL2RlYnVnL3RyYWNlX2V2ZW50aC5oKSBpcyBzdGFydGVkIG9uCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvc3dpdGNoZXMuaCBiL3NyYy9jb2JhbHQvYnJvd3Nlci9zd2l0Y2hlcy5oCmluZGV4IDQ0NzBjNGUuLjRkYzAyZWYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9zd2l0Y2hlcy5oCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9zd2l0Y2hlcy5oCkBAIC0yNCw4ICsyNCw4IEBACiBleHRlcm4gY29uc3QgY2hhciBrQXVkaW9EZWNvZGVyU3R1YltdOwogZXh0ZXJuIGNvbnN0IGNoYXIga0NzcE1vZGVbXTsKIGV4dGVybiBjb25zdCBjaGFyIGtEZWJ1Z0NvbnNvbGVNb2RlW107CitleHRlcm4gY29uc3QgY2hhciBrRGlzYWJsZVdlYkRyaXZlcltdOwogZXh0ZXJuIGNvbnN0IGNoYXIga0Rpc2FibGVXZWJtVnA5W107Ci1leHRlcm4gY29uc3QgY2hhciBrRW5hYmxlV2ViRHJpdmVyW107CiBleHRlcm4gY29uc3QgY2hhciBrRXh0cmFXZWJGaWxlRGlyW107CiBleHRlcm4gY29uc3QgY2hhciBrRmFrZU1pY3JvcGhvbmVbXTsKIGV4dGVybiBjb25zdCBjaGFyIGtJZ25vcmVDZXJ0aWZpY2F0ZUVycm9yc1tdOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL3Rlc3RkYXRhL3NwbGFzaF9zY3JlZW4vYmVmb3JldW5sb2FkLmh0bWwgYi9zcmMvY29iYWx0L2Jyb3dzZXIvdGVzdGRhdGEvc3BsYXNoX3NjcmVlbi9iZWZvcmV1bmxvYWQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjZlY2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3Rlc3RkYXRhL3NwbGFzaF9zY3JlZW4vYmVmb3JldW5sb2FkLmh0bWwKQEAgLTAsMCArMSw5MSBAQAorPCFET0NUWVBFIGh0bWw+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHN0eWxlPgorLmJveCB7CisgICAgd2lkdGg6IDEwMHB4OworICAgIGhlaWdodDogMTAwcHg7CisgICAgYmFja2dyb3VuZC1jb2xvcjogcmVkOworICAgIGNvbG9yIDogeWVsbG93OworICAgIGZvbnQtc2l6ZTogMjBweDsKKyAgICBsZWZ0OiAwcHg7CisgICAgdG9wOiAwcHg7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgLjI1czsKKyAgICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTsKK30KKy5ib3gxeworICAgIHdpZHRoOiAxMDBweDsKKyAgICBoZWlnaHQ6IDEwMHB4OworICAgIGJhY2tncm91bmQtY29sb3I6IGJsdWU7CisgICAgY29sb3I6IHllbGxvdzsKKyAgICBmb250LXNpemU6IDIwcHg7CisgICAgbGVmdDogMHB4OworICAgIHRvcDogMHB4OworICAgIHBvc2l0aW9uOmFic29sdXRlOworICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgLjI1czsKKyAgICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTsKK30KKyAgICA8L3N0eWxlPgorICA8L2hlYWQ+Cis8Ym9keSBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogIzFmNTJhNTsiPgorPGRpdiBjbGFzcz0iYm94IiBpZD0iYm94Ij5TYW1wbGU8L2Rpdj4KKzxkaXYgaWQ9ImltbWVkaWF0ZWx5IiBzdHlsZT0iZGlzcGxheTpibG9jazsiPgorVEhJUyBTSE9XUyBJTU1FRElBVEVMWQorPC9kaXY+CisKKzxkaXYgaWQ9ImJlZm9yZVVubG9hZCIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgorVEhJUyBTSE9XUyBBVCBCRUZPUkVVTkxPQUQKKzwvZGl2PgorCis8ZGl2IGlkPSJ0cmFuc2l0aW9uRW5kIiBzdHlsZT0iZGlzcGxheTpub25lOyI+CitUSElTIFNIT1dTIEFUIFRSQU5TSVRJT05FTkQKKzwvZGl2PgorCisKKzxzY3JpcHQ+CisgIGNvbnNvbGUubG9nKCdSdW5uaW5nIHRoZSBzY3JpcHQgaW4gYmVmb3JldW5sb2FkLmh0bWwnKTsKKworICBmdW5jdGlvbiB1cGRhdGVUcmFuc2l0aW9uKCkgeworICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJib3giKTsKKyAgICBpZiAoZWwuY2xhc3NOYW1lID09ICJib3giKSB7CisgICAgICBlbC5jbGFzc05hbWUgPSAiYm94MSI7CisgICAgfSBlbHNlIHsKKyAgICAgIGVsLmNsYXNzTmFtZSA9ICJib3giOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHRyYW5zaXRpb25FbmRGdW5jdGlvbigpIHsKKyAgICBjb25zb2xlLmxvZygidHJhbnNpdGlvbmVuZCBldmVudCIpOworICAgIC8vIFNldCB0aGlzIHRvIHRydWUgdG8gc2ltdWxhdGUgYW4gdW5yZXNwb25zaXZlIHNwbGFzaCBzY3JlZW4gd2hpY2ggZG9lcworICAgIC8vIG5vdCBjYWxsIHdpbmRvdy5jbG9zZSgpLgorICAgIHZhciB1bnJlc3BvbnNpdmUgPSB0cnVlOworICAgIC8vIFRoaXMgc3R5bGUgY2hhbmdlIGlzIG9ubHkgc2hvd24gaWYgdW5yZXNwb25zaXZlLgorICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0cmFuc2l0aW9uRW5kIikuc3R5bGUuZGlzcGxheT0iYmxvY2siOworICAgIC8vIENvbW1lbnQgdGhpcyBvdXQgdG8gdGVzdCBvdXQgYW4gdW5yZXNwb25zaXZlCisgICAgLy8gd2luZG93Lm9udHJhbnNpdGlvbmVuZCBmdW5jdGlvbi4KKyAgICBpZiAoIXVucmVzcG9uc2l2ZSkgeworICAgICAgd2luZG93LmNsb3NlKCk7CisgICAgfQorICB9CisgIC8vIEVpdGhlciBldmVudCBoYW5kbGVyIG9yIGV2ZW50IGxpc3RlbmVycyBzaG91bGQgd29yay4KKyAgd2luZG93Lm9udHJhbnNpdGlvbmVuZCA9IHRyYW5zaXRpb25FbmRGdW5jdGlvbjsKKyAgLy93aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidHJhbnNpdGlvbmVuZCIsIHRyYW5zaXRpb25FbmRGdW5jdGlvbiwgdHJ1ZSk7CisKKyAgZnVuY3Rpb24gYmVmb3JlVW5sb2FkRnVuY3Rpb24oKSB7CisgICAgY29uc29sZS5sb2coImJlZm9yZXVubG9hZCBldmVudCIpOworICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJpbW1lZGlhdGVseSIpLnN0eWxlLmRpc3BsYXk9Im5vbmUiOworICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJiZWZvcmVVbmxvYWQiKS5zdHlsZS5kaXNwbGF5PSJibG9jayI7CisgICAgd2luZG93LnVwZGF0ZVRyYW5zaXRpb24oKTsKKyAgICAvLyBSZXR1cm5pbmcgYSBzdHJpbmcgc2hvd3MgYSBjb25maXJtYXRpb24gZGlhbG9nIGluIENocm9tZS4KKyAgICByZXR1cm4gInJldHVybmluZyB0ZXh0IGlzIGZ1dGlsZSI7CisgIH07CisgIC8vIEVpdGhlciBldmVudCBoYW5kbGVyIG9yIGV2ZW50IGxpc3RlbmVycyBzaG91bGQgd29yay4KKyAgLy8gd2luZG93Lm9uYmVmb3JldW5sb2FkID0gYmVmb3JlVW5sb2FkRnVuY3Rpb247CisgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLCBiZWZvcmVVbmxvYWRGdW5jdGlvbiwgdHJ1ZSk7CisKKyAgY29uc29sZS5sb2coIlJhbiB0aGUgc2NyaXB0IGluIGJlZm9yZXVubG9hZC5odG1sIik7Cis8L3NjcmlwdD4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL3Rlc3RkYXRhL3NwbGFzaF9zY3JlZW4vYmxvY2tfcmVuZGVyX3RyZWVfaGVhZF9ib2R5X2Rpc3BsYXlfbm9uZS5odG1sIGIvc3JjL2NvYmFsdC9icm93c2VyL3Rlc3RkYXRhL3NwbGFzaF9zY3JlZW4vYmxvY2tfcmVuZGVyX3RyZWVfaGVhZF9ib2R5X2Rpc3BsYXlfbm9uZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ODFjNGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvdGVzdGRhdGEvc3BsYXNoX3NjcmVlbi9ibG9ja19yZW5kZXJfdHJlZV9oZWFkX2JvZHlfZGlzcGxheV9ub25lLmh0bWwKQEAgLTAsMCArMSw0NDEgQEAKKzwhRE9DVFlQRSBodG1sPgorPGh0bWw+CisKKzxoZWFkIHN0eWxlPSJkaXNwbGF5IDogbm9uZSI+CisgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2VjdXJpdHktUG9saWN5IiBjb250ZW50PSIKKyAgICBkZWZhdWx0LXNyYyAndW5zYWZlLWlubGluZSc7CisgICAgc3R5bGUtc3JjICd1bnNhZmUtaW5saW5lJzsKKyAgICBzY3JpcHQtc3JjICd1bnNhZmUtaW5saW5lJzsiPgorPC9oZWFkPgorCis8c2NyaXB0PgorICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKKyAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYm9keScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOworICB9LCA1MDAwKTsKKzwvc2NyaXB0PgorCis8Ym9keSBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogIzFmNTJhNTsgZGlzcGxheTogbm9uZSI+Cis8aDE+SGVhZGluZzwvaDE+CisKKzxwPkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nIGVsaXQuIFZpdmFtdXMKK2ludGVyZHVtIG1heGltdXMgZmluaWJ1cy4gVXQgZmVybWVudHVtIG1hbGVzdWFkYSBjb21tb2RvLiBTZWQKK2ZhdWNpYnVzLCBzYXBpZW4gYSBtYXR0aXMgbG9ib3J0aXMsIG1hZ25hIGFudGUgZWZmaWNpdHVyIG1hdXJpcywgcXVpcworc29kYWxlcyBuaWJoIGRpYW0gbmVjIHF1YW0uIFZlc3RpYnVsdW0gbWFnbmEgbGliZXJvLCB0aW5jaWR1bnQgbm9uCitlcmF0IHNlZCwgbW9sZXN0aWUgcHVsdmluYXIgZXguIE1hZWNlbmFzIHNlbXBlciBibGFuZGl0IGVsaXQsIGlkCitzdXNjaXBpdCBudWxsYSB2ZW5lbmF0aXMgcHJldGl1bS4gSW50ZWdlciBhY2N1bXNhbiBwb3J0YSBmZWxpcywgdml0YWUKK3BsYWNlcmF0IHVybmEgYWNjdW1zYW4gdmVsLiBBbGlxdWFtIGV1IGFsaXF1ZXQgbWkuIEFlbmVhbiB0aW5jaWR1bnQKK2Vyb3MgbGVjdHVzLCBzaXQgYW1ldCBlZmZpY2l0dXIgb3JjaSB1bHRyaWNlcyBhdC4gTW9yYmkgbG9ib3J0aXMgZXgKK3F1aXMgbHVjdHVzIHJ1dHJ1bS4gSW4gbnVsbGEgdmVsaXQsIGVsZW1lbnR1bSB2aXRhZSB0dXJwaXMgdml0YWUsCitmaW5pYnVzIHZhcml1cyBtYXNzYS4gTW9yYmkgaWQgbGliZXJvIGZhdWNpYnVzLCB0ZW1wdXMgZXJvcyBldCwKK3VsbGFtY29ycGVyIGlwc3VtLiBTZWQgZWxlaWZlbmQgZmluaWJ1cyBiaWJlbmR1bS4gTnVsbGFtIHV0IG51bmMgbmVjCitsYWN1cyBwb3N1ZXJlIGRpZ25pc3NpbS4gTnVuYyBzb2xsaWNpdHVkaW4gdml0YWUgYXVndWUgaWQKK3Z1bHB1dGF0ZS4gVXQgYWMgbmliaCBncmF2aWRhLCB2b2x1dHBhdCBlc3QgYWMsIGZhY2lsaXNpcyBuZXF1ZS48L3A+CisKKzxwPk5hbSBkaWN0dW0gbGVvIG1hc3NhLCBub24gcG9zdWVyZSBkdWkgYmliZW5kdW0gaWQuIE1vcmJpIHNhZ2l0dGlzIGVzdAorbm9uIGVzdCBsYW9yZWV0LCBhIHNvbGxpY2l0dWRpbiBmZWxpcyBhbGlxdWV0LiBVdCBjdXJzdXMgdmVsIGxlbyBhCitlZmZpY2l0dXIuIFByb2luIHV0IHBlbGxlbnRlc3F1ZSBzYXBpZW4sIHZlbCBtYXhpbXVzIGR1aS4gU3VzcGVuZGlzc2UKK2V1IGZlbGlzIGVnZXQgbGVvIGVsZW1lbnR1bSBlZmZpY2l0dXIuIENsYXNzIGFwdGVudCB0YWNpdGkgc29jaW9zcXUgYWQKK2xpdG9yYSB0b3JxdWVudCBwZXIgY29udWJpYSBub3N0cmEsIHBlciBpbmNlcHRvcyBoaW1lbmFlb3MuIEZ1c2NlCitsb2JvcnRpcyB2ZWxpdCBpbiBlbGl0IHBlbGxlbnRlc3F1ZSwgdXQgYXVjdG9yIGlwc3VtIGRpZ25pc3NpbS4gU2VkCithbGlxdWV0IGVsZWlmZW5kIGNvbnZhbGxpcy4gRHVpcyBtb2xsaXMsIGRvbG9yIHNlZCBydXRydW0gbW9sbGlzLAorYXVndWUgZXJvcyBkaWduaXNzaW0gZXJhdCwgZXUgZGFwaWJ1cyBhdWd1ZSB0dXJwaXMgYWMgc2FwaWVuLiBNb3JiaSBhdAordm9sdXRwYXQgb2RpbywgYXQgbW9sZXN0aWUgcmlzdXMuIE51bGxhIHF1aXMgbnVsbGEgZXQgbWFnbmEgdmVzdGlidWx1bQorZXVpc21vZC4gUHJhZXNlbnQgc3VzY2lwaXQgcXVhbSBlbGl0LCBub24gbHVjdHVzIHR1cnBpcyBydXRydW0KK2ZhdWNpYnVzLjwvcD4KKworPHA+TW9yYmkgZmV1Z2lhdCBsYWN1cyByaG9uY3VzLCBkaWduaXNzaW0gdmVsaXQgbmVjLCBkaWduaXNzaW0KK2xvcmVtLiBBbGlxdWFtIGVyYXQgdm9sdXRwYXQuIE1hdXJpcyBzZW1wZXIgZGljdHVtIHRlbXB1cy4gTnVsbGEgZXgKK2xpZ3VsYSwgbWFsZXN1YWRhIGluIG9ybmFyZSBzZWQsIGV1aXNtb2Qgdml0YWUgbWFzc2EuIEV0aWFtIHF1aXMgZXJhdAorcXVpcyBuaXNsIGZhY2lsaXNpcyBzdXNjaXBpdC4gTWF1cmlzIHBsYWNlcmF0IGFudGUgZXQgYXVjdG9yCitmZXJtZW50dW0uIERvbmVjIHRpbmNpZHVudCBqdXN0byBzZW0sIHVsbGFtY29ycGVyIHZ1bHB1dGF0ZSBuaXNsCitjb21tb2RvIGEuIFZlc3RpYnVsdW0gcXVpcyBleCBub24gZWxpdCBwb3J0dGl0b3Igc2VtcGVyIGVnZXQgcXVpcwordG9ydG9yLiBTdXNwZW5kaXNzZSBtYXR0aXMgbmVxdWUgbm9uIGVsZW1lbnR1bSBzY2VsZXJpc3F1ZS4gTnVsbGEKK2ZhY2lsaXNpLiBOdWxsYSBub24gZmVsaXMgZXQganVzdG8gZmV1Z2lhdCBlbGVtZW50dW0uIEFlbmVhbiBzb2RhbGVzCit0dXJwaXMgYXQgZXJhdCBlbGVpZmVuZCBsYWNpbmlhLiBQcm9pbiBlbGVpZmVuZCB2b2x1dHBhdCBwdXJ1cyBpZAorbW9sbGlzLiBQcm9pbiB2ZWwgdGVsbHVzIGZhdWNpYnVzLCBzYWdpdHRpcyBsaWJlcm8gYXQsIGxvYm9ydGlzCitvZGlvLiBQcmFlc2VudCBxdWFtIG1hdXJpcywgYXVjdG9yIHZlbCB2ZWxpdCBldSwgY29udmFsbGlzIG1vbGVzdGllCituaXNpLiBQZWxsZW50ZXNxdWUgaW4gbnVuYyBhdCBvcmNpIHVsdHJpY2VzIHZlaGljdWxhLjwvcD4KKworPHA+UHJhZXNlbnQgbmliaCBsZWN0dXMsIGVmZmljaXR1ciBzZWQgcmlzdXMgaW4sIHJ1dHJ1bSB0cmlzdGlxdWUKK2FyY3UuIEN1cmFiaXR1ciBub24gZWZmaWNpdHVyIGVsaXQuIFBoYXNlbGx1cyBlZ2V0IG9kaW8gaWFjdWxpcywKK21vbGVzdGllIGR1aSBlZ2V0LCB2ZW5lbmF0aXMgZXJhdC4gTnVsbGEgbHVjdHVzIGZhY2lsaXNpcyBsZWN0dXMsIG5lYworZGFwaWJ1cyB0b3J0b3IgcmhvbmN1cyB2ZWwuIERvbmVjIG5lYyBhcmN1IGVsaXQuIE51bGxhbSB1dCBmYXVjaWJ1cworcHVydXMsIHNlZCB1bHRyaWNpZXMgZGlhbS4gUGVsbGVudGVzcXVlIGF0IGZpbmlidXMgaXBzdW0uIFZlc3RpYnVsdW0KK2VnZXN0YXMgZGlnbmlzc2ltIG5pc2wsIGFjIHJob25jdXMgcmlzdXMgZmluaWJ1cyBzaXQgYW1ldC4gRG9uZWMgbm9uCitmZXVnaWF0IGFudGUuIERvbmVjIHZlaGljdWxhIGR1aSBhIGxvcmVtIGltcGVyZGlldCwgYSB0ZW1wdXMgZGlhbQorcHVsdmluYXIuIE51bGxhbSBjb25ndWUgZWZmaWNpdHVyIGp1c3RvLCBub24gcG9zdWVyZSBsaWd1bGEgc29kYWxlcworaW4uIFV0IGEgdXJuYSBvcm5hcmUsIHVsdHJpY2VzIHZlbGl0IGluLCBwZWxsZW50ZXNxdWUKK2xvcmVtLiBWZXN0aWJ1bHVtIGFudGUgaXBzdW0gcHJpbWlzIGluIGZhdWNpYnVzIG9yY2kgbHVjdHVzIGV0Cit1bHRyaWNlcyBwb3N1ZXJlIGN1YmlsaWEgQ3VyYWU7PC9wPgorCis8cD5PcmNpIHZhcml1cyBuYXRvcXVlIHBlbmF0aWJ1cyBldCBtYWduaXMgZGlzIHBhcnR1cmllbnQgbW9udGVzLAorbmFzY2V0dXIgcmlkaWN1bHVzIG11cy4gTW9yYmkgbWF4aW11cyBxdWlzIG1hZ25hIGV0IGFsaXF1ZXQuIE5hbQorYmliZW5kdW0gZmVybWVudHVtIHRlbXB1cy4gUHJhZXNlbnQgaWFjdWxpcyB0b3J0b3IgbWV0dXMsIGF0Cit2ZXN0aWJ1bHVtIGlwc3VtIGhlbmRyZXJpdCBtYXR0aXMuIFByb2luIGZyaW5naWxsYSBuaXNsIHNpdCBhbWV0Cit0aW5jaWR1bnQgYmxhbmRpdC4gSW50ZXJkdW0gZXQgbWFsZXN1YWRhIGZhbWVzIGFjIGFudGUgaXBzdW0gcHJpbWlzIGluCitmYXVjaWJ1cy4gUGhhc2VsbHVzIHZlbCBsZWN0dXMgbGVvLiBDdXJhYml0dXIgZnJpbmdpbGxhLCBhcmN1IG5vbgorcG9zdWVyZSB2aXZlcnJhLCB1cm5hIG1ldHVzIGJsYW5kaXQgYXVndWUsIGNvbnZhbGxpcyBtYXR0aXMgdG9ydG9yIGR1aQordmVsIGFyY3UuIEluIHNpdCBhbWV0IG1ldHVzIHZpdGFlIGV4IHJob25jdXMgaGVuZHJlcml0LjwvcD4KKworPHA+TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gVml2YW11cworaW50ZXJkdW0gbWF4aW11cyBmaW5pYnVzLiBVdCBmZXJtZW50dW0gbWFsZXN1YWRhIGNvbW1vZG8uIFNlZAorZmF1Y2lidXMsIHNhcGllbiBhIG1hdHRpcyBsb2JvcnRpcywgbWFnbmEgYW50ZSBlZmZpY2l0dXIgbWF1cmlzLCBxdWlzCitzb2RhbGVzIG5pYmggZGlhbSBuZWMgcXVhbS4gVmVzdGlidWx1bSBtYWduYSBsaWJlcm8sIHRpbmNpZHVudCBub24KK2VyYXQgc2VkLCBtb2xlc3RpZSBwdWx2aW5hciBleC4gTWFlY2VuYXMgc2VtcGVyIGJsYW5kaXQgZWxpdCwgaWQKK3N1c2NpcGl0IG51bGxhIHZlbmVuYXRpcyBwcmV0aXVtLiBJbnRlZ2VyIGFjY3Vtc2FuIHBvcnRhIGZlbGlzLCB2aXRhZQorcGxhY2VyYXQgdXJuYSBhY2N1bXNhbiB2ZWwuIEFsaXF1YW0gZXUgYWxpcXVldCBtaS4gQWVuZWFuIHRpbmNpZHVudAorZXJvcyBsZWN0dXMsIHNpdCBhbWV0IGVmZmljaXR1ciBvcmNpIHVsdHJpY2VzIGF0LiBNb3JiaSBsb2JvcnRpcyBleAorcXVpcyBsdWN0dXMgcnV0cnVtLiBJbiBudWxsYSB2ZWxpdCwgZWxlbWVudHVtIHZpdGFlIHR1cnBpcyB2aXRhZSwKK2ZpbmlidXMgdmFyaXVzIG1hc3NhLiBNb3JiaSBpZCBsaWJlcm8gZmF1Y2lidXMsIHRlbXB1cyBlcm9zIGV0LAordWxsYW1jb3JwZXIgaXBzdW0uIFNlZCBlbGVpZmVuZCBmaW5pYnVzIGJpYmVuZHVtLiBOdWxsYW0gdXQgbnVuYyBuZWMKK2xhY3VzIHBvc3VlcmUgZGlnbmlzc2ltLiBOdW5jIHNvbGxpY2l0dWRpbiB2aXRhZSBhdWd1ZSBpZAordnVscHV0YXRlLiBVdCBhYyBuaWJoIGdyYXZpZGEsIHZvbHV0cGF0IGVzdCBhYywgZmFjaWxpc2lzIG5lcXVlLjwvcD4KKworPHA+TmFtIGRpY3R1bSBsZW8gbWFzc2EsIG5vbiBwb3N1ZXJlIGR1aSBiaWJlbmR1bSBpZC4gTW9yYmkgc2FnaXR0aXMgZXN0Citub24gZXN0IGxhb3JlZXQsIGEgc29sbGljaXR1ZGluIGZlbGlzIGFsaXF1ZXQuIFV0IGN1cnN1cyB2ZWwgbGVvIGEKK2VmZmljaXR1ci4gUHJvaW4gdXQgcGVsbGVudGVzcXVlIHNhcGllbiwgdmVsIG1heGltdXMgZHVpLiBTdXNwZW5kaXNzZQorZXUgZmVsaXMgZWdldCBsZW8gZWxlbWVudHVtIGVmZmljaXR1ci4gQ2xhc3MgYXB0ZW50IHRhY2l0aSBzb2Npb3NxdSBhZAorbGl0b3JhIHRvcnF1ZW50IHBlciBjb251YmlhIG5vc3RyYSwgcGVyIGluY2VwdG9zIGhpbWVuYWVvcy4gRnVzY2UKK2xvYm9ydGlzIHZlbGl0IGluIGVsaXQgcGVsbGVudGVzcXVlLCB1dCBhdWN0b3IgaXBzdW0gZGlnbmlzc2ltLiBTZWQKK2FsaXF1ZXQgZWxlaWZlbmQgY29udmFsbGlzLiBEdWlzIG1vbGxpcywgZG9sb3Igc2VkIHJ1dHJ1bSBtb2xsaXMsCithdWd1ZSBlcm9zIGRpZ25pc3NpbSBlcmF0LCBldSBkYXBpYnVzIGF1Z3VlIHR1cnBpcyBhYyBzYXBpZW4uIE1vcmJpIGF0Cit2b2x1dHBhdCBvZGlvLCBhdCBtb2xlc3RpZSByaXN1cy4gTnVsbGEgcXVpcyBudWxsYSBldCBtYWduYSB2ZXN0aWJ1bHVtCitldWlzbW9kLiBQcmFlc2VudCBzdXNjaXBpdCBxdWFtIGVsaXQsIG5vbiBsdWN0dXMgdHVycGlzIHJ1dHJ1bQorZmF1Y2lidXMuPC9wPgorCis8cD5Nb3JiaSBmZXVnaWF0IGxhY3VzIHJob25jdXMsIGRpZ25pc3NpbSB2ZWxpdCBuZWMsIGRpZ25pc3NpbQorbG9yZW0uIEFsaXF1YW0gZXJhdCB2b2x1dHBhdC4gTWF1cmlzIHNlbXBlciBkaWN0dW0gdGVtcHVzLiBOdWxsYSBleAorbGlndWxhLCBtYWxlc3VhZGEgaW4gb3JuYXJlIHNlZCwgZXVpc21vZCB2aXRhZSBtYXNzYS4gRXRpYW0gcXVpcyBlcmF0CitxdWlzIG5pc2wgZmFjaWxpc2lzIHN1c2NpcGl0LiBNYXVyaXMgcGxhY2VyYXQgYW50ZSBldCBhdWN0b3IKK2Zlcm1lbnR1bS4gRG9uZWMgdGluY2lkdW50IGp1c3RvIHNlbSwgdWxsYW1jb3JwZXIgdnVscHV0YXRlIG5pc2wKK2NvbW1vZG8gYS4gVmVzdGlidWx1bSBxdWlzIGV4IG5vbiBlbGl0IHBvcnR0aXRvciBzZW1wZXIgZWdldCBxdWlzCit0b3J0b3IuIFN1c3BlbmRpc3NlIG1hdHRpcyBuZXF1ZSBub24gZWxlbWVudHVtIHNjZWxlcmlzcXVlLiBOdWxsYQorZmFjaWxpc2kuIE51bGxhIG5vbiBmZWxpcyBldCBqdXN0byBmZXVnaWF0IGVsZW1lbnR1bS4gQWVuZWFuIHNvZGFsZXMKK3R1cnBpcyBhdCBlcmF0IGVsZWlmZW5kIGxhY2luaWEuIFByb2luIGVsZWlmZW5kIHZvbHV0cGF0IHB1cnVzIGlkCittb2xsaXMuIFByb2luIHZlbCB0ZWxsdXMgZmF1Y2lidXMsIHNhZ2l0dGlzIGxpYmVybyBhdCwgbG9ib3J0aXMKK29kaW8uIFByYWVzZW50IHF1YW0gbWF1cmlzLCBhdWN0b3IgdmVsIHZlbGl0IGV1LCBjb252YWxsaXMgbW9sZXN0aWUKK25pc2kuIFBlbGxlbnRlc3F1ZSBpbiBudW5jIGF0IG9yY2kgdWx0cmljZXMgdmVoaWN1bGEuPC9wPgorCis8cD5QcmFlc2VudCBuaWJoIGxlY3R1cywgZWZmaWNpdHVyIHNlZCByaXN1cyBpbiwgcnV0cnVtIHRyaXN0aXF1ZQorYXJjdS4gQ3VyYWJpdHVyIG5vbiBlZmZpY2l0dXIgZWxpdC4gUGhhc2VsbHVzIGVnZXQgb2RpbyBpYWN1bGlzLAorbW9sZXN0aWUgZHVpIGVnZXQsIHZlbmVuYXRpcyBlcmF0LiBOdWxsYSBsdWN0dXMgZmFjaWxpc2lzIGxlY3R1cywgbmVjCitkYXBpYnVzIHRvcnRvciByaG9uY3VzIHZlbC4gRG9uZWMgbmVjIGFyY3UgZWxpdC4gTnVsbGFtIHV0IGZhdWNpYnVzCitwdXJ1cywgc2VkIHVsdHJpY2llcyBkaWFtLiBQZWxsZW50ZXNxdWUgYXQgZmluaWJ1cyBpcHN1bS4gVmVzdGlidWx1bQorZWdlc3RhcyBkaWduaXNzaW0gbmlzbCwgYWMgcmhvbmN1cyByaXN1cyBmaW5pYnVzIHNpdCBhbWV0LiBEb25lYyBub24KK2ZldWdpYXQgYW50ZS4gRG9uZWMgdmVoaWN1bGEgZHVpIGEgbG9yZW0gaW1wZXJkaWV0LCBhIHRlbXB1cyBkaWFtCitwdWx2aW5hci4gTnVsbGFtIGNvbmd1ZSBlZmZpY2l0dXIganVzdG8sIG5vbiBwb3N1ZXJlIGxpZ3VsYSBzb2RhbGVzCitpbi4gVXQgYSB1cm5hIG9ybmFyZSwgdWx0cmljZXMgdmVsaXQgaW4sIHBlbGxlbnRlc3F1ZQorbG9yZW0uIFZlc3RpYnVsdW0gYW50ZSBpcHN1bSBwcmltaXMgaW4gZmF1Y2lidXMgb3JjaSBsdWN0dXMgZXQKK3VsdHJpY2VzIHBvc3VlcmUgY3ViaWxpYSBDdXJhZTs8L3A+CisKKzxwPk9yY2kgdmFyaXVzIG5hdG9xdWUgcGVuYXRpYnVzIGV0IG1hZ25pcyBkaXMgcGFydHVyaWVudCBtb250ZXMsCituYXNjZXR1ciByaWRpY3VsdXMgbXVzLiBNb3JiaSBtYXhpbXVzIHF1aXMgbWFnbmEgZXQgYWxpcXVldC4gTmFtCitiaWJlbmR1bSBmZXJtZW50dW0gdGVtcHVzLiBQcmFlc2VudCBpYWN1bGlzIHRvcnRvciBtZXR1cywgYXQKK3Zlc3RpYnVsdW0gaXBzdW0gaGVuZHJlcml0IG1hdHRpcy4gUHJvaW4gZnJpbmdpbGxhIG5pc2wgc2l0IGFtZXQKK3RpbmNpZHVudCBibGFuZGl0LiBJbnRlcmR1bSBldCBtYWxlc3VhZGEgZmFtZXMgYWMgYW50ZSBpcHN1bSBwcmltaXMgaW4KK2ZhdWNpYnVzLiBQaGFzZWxsdXMgdmVsIGxlY3R1cyBsZW8uIEN1cmFiaXR1ciBmcmluZ2lsbGEsIGFyY3Ugbm9uCitwb3N1ZXJlIHZpdmVycmEsIHVybmEgbWV0dXMgYmxhbmRpdCBhdWd1ZSwgY29udmFsbGlzIG1hdHRpcyB0b3J0b3IgZHVpCit2ZWwgYXJjdS4gSW4gc2l0IGFtZXQgbWV0dXMgdml0YWUgZXggcmhvbmN1cyBoZW5kcmVyaXQuPC9wPgorCis8cD5Mb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LiBWaXZhbXVzCitpbnRlcmR1bSBtYXhpbXVzIGZpbmlidXMuIFV0IGZlcm1lbnR1bSBtYWxlc3VhZGEgY29tbW9kby4gU2VkCitmYXVjaWJ1cywgc2FwaWVuIGEgbWF0dGlzIGxvYm9ydGlzLCBtYWduYSBhbnRlIGVmZmljaXR1ciBtYXVyaXMsIHF1aXMKK3NvZGFsZXMgbmliaCBkaWFtIG5lYyBxdWFtLiBWZXN0aWJ1bHVtIG1hZ25hIGxpYmVybywgdGluY2lkdW50IG5vbgorZXJhdCBzZWQsIG1vbGVzdGllIHB1bHZpbmFyIGV4LiBNYWVjZW5hcyBzZW1wZXIgYmxhbmRpdCBlbGl0LCBpZAorc3VzY2lwaXQgbnVsbGEgdmVuZW5hdGlzIHByZXRpdW0uIEludGVnZXIgYWNjdW1zYW4gcG9ydGEgZmVsaXMsIHZpdGFlCitwbGFjZXJhdCB1cm5hIGFjY3Vtc2FuIHZlbC4gQWxpcXVhbSBldSBhbGlxdWV0IG1pLiBBZW5lYW4gdGluY2lkdW50Citlcm9zIGxlY3R1cywgc2l0IGFtZXQgZWZmaWNpdHVyIG9yY2kgdWx0cmljZXMgYXQuIE1vcmJpIGxvYm9ydGlzIGV4CitxdWlzIGx1Y3R1cyBydXRydW0uIEluIG51bGxhIHZlbGl0LCBlbGVtZW50dW0gdml0YWUgdHVycGlzIHZpdGFlLAorZmluaWJ1cyB2YXJpdXMgbWFzc2EuIE1vcmJpIGlkIGxpYmVybyBmYXVjaWJ1cywgdGVtcHVzIGVyb3MgZXQsCit1bGxhbWNvcnBlciBpcHN1bS4gU2VkIGVsZWlmZW5kIGZpbmlidXMgYmliZW5kdW0uIE51bGxhbSB1dCBudW5jIG5lYworbGFjdXMgcG9zdWVyZSBkaWduaXNzaW0uIE51bmMgc29sbGljaXR1ZGluIHZpdGFlIGF1Z3VlIGlkCit2dWxwdXRhdGUuIFV0IGFjIG5pYmggZ3JhdmlkYSwgdm9sdXRwYXQgZXN0IGFjLCBmYWNpbGlzaXMgbmVxdWUuPC9wPgorCis8cD5OYW0gZGljdHVtIGxlbyBtYXNzYSwgbm9uIHBvc3VlcmUgZHVpIGJpYmVuZHVtIGlkLiBNb3JiaSBzYWdpdHRpcyBlc3QKK25vbiBlc3QgbGFvcmVldCwgYSBzb2xsaWNpdHVkaW4gZmVsaXMgYWxpcXVldC4gVXQgY3Vyc3VzIHZlbCBsZW8gYQorZWZmaWNpdHVyLiBQcm9pbiB1dCBwZWxsZW50ZXNxdWUgc2FwaWVuLCB2ZWwgbWF4aW11cyBkdWkuIFN1c3BlbmRpc3NlCitldSBmZWxpcyBlZ2V0IGxlbyBlbGVtZW50dW0gZWZmaWNpdHVyLiBDbGFzcyBhcHRlbnQgdGFjaXRpIHNvY2lvc3F1IGFkCitsaXRvcmEgdG9ycXVlbnQgcGVyIGNvbnViaWEgbm9zdHJhLCBwZXIgaW5jZXB0b3MgaGltZW5hZW9zLiBGdXNjZQorbG9ib3J0aXMgdmVsaXQgaW4gZWxpdCBwZWxsZW50ZXNxdWUsIHV0IGF1Y3RvciBpcHN1bSBkaWduaXNzaW0uIFNlZAorYWxpcXVldCBlbGVpZmVuZCBjb252YWxsaXMuIER1aXMgbW9sbGlzLCBkb2xvciBzZWQgcnV0cnVtIG1vbGxpcywKK2F1Z3VlIGVyb3MgZGlnbmlzc2ltIGVyYXQsIGV1IGRhcGlidXMgYXVndWUgdHVycGlzIGFjIHNhcGllbi4gTW9yYmkgYXQKK3ZvbHV0cGF0IG9kaW8sIGF0IG1vbGVzdGllIHJpc3VzLiBOdWxsYSBxdWlzIG51bGxhIGV0IG1hZ25hIHZlc3RpYnVsdW0KK2V1aXNtb2QuIFByYWVzZW50IHN1c2NpcGl0IHF1YW0gZWxpdCwgbm9uIGx1Y3R1cyB0dXJwaXMgcnV0cnVtCitmYXVjaWJ1cy48L3A+CisKKzxwPk1vcmJpIGZldWdpYXQgbGFjdXMgcmhvbmN1cywgZGlnbmlzc2ltIHZlbGl0IG5lYywgZGlnbmlzc2ltCitsb3JlbS4gQWxpcXVhbSBlcmF0IHZvbHV0cGF0LiBNYXVyaXMgc2VtcGVyIGRpY3R1bSB0ZW1wdXMuIE51bGxhIGV4CitsaWd1bGEsIG1hbGVzdWFkYSBpbiBvcm5hcmUgc2VkLCBldWlzbW9kIHZpdGFlIG1hc3NhLiBFdGlhbSBxdWlzIGVyYXQKK3F1aXMgbmlzbCBmYWNpbGlzaXMgc3VzY2lwaXQuIE1hdXJpcyBwbGFjZXJhdCBhbnRlIGV0IGF1Y3RvcgorZmVybWVudHVtLiBEb25lYyB0aW5jaWR1bnQganVzdG8gc2VtLCB1bGxhbWNvcnBlciB2dWxwdXRhdGUgbmlzbAorY29tbW9kbyBhLiBWZXN0aWJ1bHVtIHF1aXMgZXggbm9uIGVsaXQgcG9ydHRpdG9yIHNlbXBlciBlZ2V0IHF1aXMKK3RvcnRvci4gU3VzcGVuZGlzc2UgbWF0dGlzIG5lcXVlIG5vbiBlbGVtZW50dW0gc2NlbGVyaXNxdWUuIE51bGxhCitmYWNpbGlzaS4gTnVsbGEgbm9uIGZlbGlzIGV0IGp1c3RvIGZldWdpYXQgZWxlbWVudHVtLiBBZW5lYW4gc29kYWxlcwordHVycGlzIGF0IGVyYXQgZWxlaWZlbmQgbGFjaW5pYS4gUHJvaW4gZWxlaWZlbmQgdm9sdXRwYXQgcHVydXMgaWQKK21vbGxpcy4gUHJvaW4gdmVsIHRlbGx1cyBmYXVjaWJ1cywgc2FnaXR0aXMgbGliZXJvIGF0LCBsb2JvcnRpcworb2Rpby4gUHJhZXNlbnQgcXVhbSBtYXVyaXMsIGF1Y3RvciB2ZWwgdmVsaXQgZXUsIGNvbnZhbGxpcyBtb2xlc3RpZQorbmlzaS4gUGVsbGVudGVzcXVlIGluIG51bmMgYXQgb3JjaSB1bHRyaWNlcyB2ZWhpY3VsYS48L3A+CisKKzxwPlByYWVzZW50IG5pYmggbGVjdHVzLCBlZmZpY2l0dXIgc2VkIHJpc3VzIGluLCBydXRydW0gdHJpc3RpcXVlCithcmN1LiBDdXJhYml0dXIgbm9uIGVmZmljaXR1ciBlbGl0LiBQaGFzZWxsdXMgZWdldCBvZGlvIGlhY3VsaXMsCittb2xlc3RpZSBkdWkgZWdldCwgdmVuZW5hdGlzIGVyYXQuIE51bGxhIGx1Y3R1cyBmYWNpbGlzaXMgbGVjdHVzLCBuZWMKK2RhcGlidXMgdG9ydG9yIHJob25jdXMgdmVsLiBEb25lYyBuZWMgYXJjdSBlbGl0LiBOdWxsYW0gdXQgZmF1Y2lidXMKK3B1cnVzLCBzZWQgdWx0cmljaWVzIGRpYW0uIFBlbGxlbnRlc3F1ZSBhdCBmaW5pYnVzIGlwc3VtLiBWZXN0aWJ1bHVtCitlZ2VzdGFzIGRpZ25pc3NpbSBuaXNsLCBhYyByaG9uY3VzIHJpc3VzIGZpbmlidXMgc2l0IGFtZXQuIERvbmVjIG5vbgorZmV1Z2lhdCBhbnRlLiBEb25lYyB2ZWhpY3VsYSBkdWkgYSBsb3JlbSBpbXBlcmRpZXQsIGEgdGVtcHVzIGRpYW0KK3B1bHZpbmFyLiBOdWxsYW0gY29uZ3VlIGVmZmljaXR1ciBqdXN0bywgbm9uIHBvc3VlcmUgbGlndWxhIHNvZGFsZXMKK2luLiBVdCBhIHVybmEgb3JuYXJlLCB1bHRyaWNlcyB2ZWxpdCBpbiwgcGVsbGVudGVzcXVlCitsb3JlbS4gVmVzdGlidWx1bSBhbnRlIGlwc3VtIHByaW1pcyBpbiBmYXVjaWJ1cyBvcmNpIGx1Y3R1cyBldAordWx0cmljZXMgcG9zdWVyZSBjdWJpbGlhIEN1cmFlOzwvcD4KKworPHA+T3JjaSB2YXJpdXMgbmF0b3F1ZSBwZW5hdGlidXMgZXQgbWFnbmlzIGRpcyBwYXJ0dXJpZW50IG1vbnRlcywKK25hc2NldHVyIHJpZGljdWx1cyBtdXMuIE1vcmJpIG1heGltdXMgcXVpcyBtYWduYSBldCBhbGlxdWV0LiBOYW0KK2JpYmVuZHVtIGZlcm1lbnR1bSB0ZW1wdXMuIFByYWVzZW50IGlhY3VsaXMgdG9ydG9yIG1ldHVzLCBhdAordmVzdGlidWx1bSBpcHN1bSBoZW5kcmVyaXQgbWF0dGlzLiBQcm9pbiBmcmluZ2lsbGEgbmlzbCBzaXQgYW1ldAordGluY2lkdW50IGJsYW5kaXQuIEludGVyZHVtIGV0IG1hbGVzdWFkYSBmYW1lcyBhYyBhbnRlIGlwc3VtIHByaW1pcyBpbgorZmF1Y2lidXMuIFBoYXNlbGx1cyB2ZWwgbGVjdHVzIGxlby4gQ3VyYWJpdHVyIGZyaW5naWxsYSwgYXJjdSBub24KK3Bvc3VlcmUgdml2ZXJyYSwgdXJuYSBtZXR1cyBibGFuZGl0IGF1Z3VlLCBjb252YWxsaXMgbWF0dGlzIHRvcnRvciBkdWkKK3ZlbCBhcmN1LiBJbiBzaXQgYW1ldCBtZXR1cyB2aXRhZSBleCByaG9uY3VzIGhlbmRyZXJpdC48L3A+CisKKzxwPkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nIGVsaXQuIFZpdmFtdXMKK2ludGVyZHVtIG1heGltdXMgZmluaWJ1cy4gVXQgZmVybWVudHVtIG1hbGVzdWFkYSBjb21tb2RvLiBTZWQKK2ZhdWNpYnVzLCBzYXBpZW4gYSBtYXR0aXMgbG9ib3J0aXMsIG1hZ25hIGFudGUgZWZmaWNpdHVyIG1hdXJpcywgcXVpcworc29kYWxlcyBuaWJoIGRpYW0gbmVjIHF1YW0uIFZlc3RpYnVsdW0gbWFnbmEgbGliZXJvLCB0aW5jaWR1bnQgbm9uCitlcmF0IHNlZCwgbW9sZXN0aWUgcHVsdmluYXIgZXguIE1hZWNlbmFzIHNlbXBlciBibGFuZGl0IGVsaXQsIGlkCitzdXNjaXBpdCBudWxsYSB2ZW5lbmF0aXMgcHJldGl1bS4gSW50ZWdlciBhY2N1bXNhbiBwb3J0YSBmZWxpcywgdml0YWUKK3BsYWNlcmF0IHVybmEgYWNjdW1zYW4gdmVsLiBBbGlxdWFtIGV1IGFsaXF1ZXQgbWkuIEFlbmVhbiB0aW5jaWR1bnQKK2Vyb3MgbGVjdHVzLCBzaXQgYW1ldCBlZmZpY2l0dXIgb3JjaSB1bHRyaWNlcyBhdC4gTW9yYmkgbG9ib3J0aXMgZXgKK3F1aXMgbHVjdHVzIHJ1dHJ1bS4gSW4gbnVsbGEgdmVsaXQsIGVsZW1lbnR1bSB2aXRhZSB0dXJwaXMgdml0YWUsCitmaW5pYnVzIHZhcml1cyBtYXNzYS4gTW9yYmkgaWQgbGliZXJvIGZhdWNpYnVzLCB0ZW1wdXMgZXJvcyBldCwKK3VsbGFtY29ycGVyIGlwc3VtLiBTZWQgZWxlaWZlbmQgZmluaWJ1cyBiaWJlbmR1bS4gTnVsbGFtIHV0IG51bmMgbmVjCitsYWN1cyBwb3N1ZXJlIGRpZ25pc3NpbS4gTnVuYyBzb2xsaWNpdHVkaW4gdml0YWUgYXVndWUgaWQKK3Z1bHB1dGF0ZS4gVXQgYWMgbmliaCBncmF2aWRhLCB2b2x1dHBhdCBlc3QgYWMsIGZhY2lsaXNpcyBuZXF1ZS48L3A+CisKKzxwPk5hbSBkaWN0dW0gbGVvIG1hc3NhLCBub24gcG9zdWVyZSBkdWkgYmliZW5kdW0gaWQuIE1vcmJpIHNhZ2l0dGlzIGVzdAorbm9uIGVzdCBsYW9yZWV0LCBhIHNvbGxpY2l0dWRpbiBmZWxpcyBhbGlxdWV0LiBVdCBjdXJzdXMgdmVsIGxlbyBhCitlZmZpY2l0dXIuIFByb2luIHV0IHBlbGxlbnRlc3F1ZSBzYXBpZW4sIHZlbCBtYXhpbXVzIGR1aS4gU3VzcGVuZGlzc2UKK2V1IGZlbGlzIGVnZXQgbGVvIGVsZW1lbnR1bSBlZmZpY2l0dXIuIENsYXNzIGFwdGVudCB0YWNpdGkgc29jaW9zcXUgYWQKK2xpdG9yYSB0b3JxdWVudCBwZXIgY29udWJpYSBub3N0cmEsIHBlciBpbmNlcHRvcyBoaW1lbmFlb3MuIEZ1c2NlCitsb2JvcnRpcyB2ZWxpdCBpbiBlbGl0IHBlbGxlbnRlc3F1ZSwgdXQgYXVjdG9yIGlwc3VtIGRpZ25pc3NpbS4gU2VkCithbGlxdWV0IGVsZWlmZW5kIGNvbnZhbGxpcy4gRHVpcyBtb2xsaXMsIGRvbG9yIHNlZCBydXRydW0gbW9sbGlzLAorYXVndWUgZXJvcyBkaWduaXNzaW0gZXJhdCwgZXUgZGFwaWJ1cyBhdWd1ZSB0dXJwaXMgYWMgc2FwaWVuLiBNb3JiaSBhdAordm9sdXRwYXQgb2RpbywgYXQgbW9sZXN0aWUgcmlzdXMuIE51bGxhIHF1aXMgbnVsbGEgZXQgbWFnbmEgdmVzdGlidWx1bQorZXVpc21vZC4gUHJhZXNlbnQgc3VzY2lwaXQgcXVhbSBlbGl0LCBub24gbHVjdHVzIHR1cnBpcyBydXRydW0KK2ZhdWNpYnVzLjwvcD4KKworPHA+TW9yYmkgZmV1Z2lhdCBsYWN1cyByaG9uY3VzLCBkaWduaXNzaW0gdmVsaXQgbmVjLCBkaWduaXNzaW0KK2xvcmVtLiBBbGlxdWFtIGVyYXQgdm9sdXRwYXQuIE1hdXJpcyBzZW1wZXIgZGljdHVtIHRlbXB1cy4gTnVsbGEgZXgKK2xpZ3VsYSwgbWFsZXN1YWRhIGluIG9ybmFyZSBzZWQsIGV1aXNtb2Qgdml0YWUgbWFzc2EuIEV0aWFtIHF1aXMgZXJhdAorcXVpcyBuaXNsIGZhY2lsaXNpcyBzdXNjaXBpdC4gTWF1cmlzIHBsYWNlcmF0IGFudGUgZXQgYXVjdG9yCitmZXJtZW50dW0uIERvbmVjIHRpbmNpZHVudCBqdXN0byBzZW0sIHVsbGFtY29ycGVyIHZ1bHB1dGF0ZSBuaXNsCitjb21tb2RvIGEuIFZlc3RpYnVsdW0gcXVpcyBleCBub24gZWxpdCBwb3J0dGl0b3Igc2VtcGVyIGVnZXQgcXVpcwordG9ydG9yLiBTdXNwZW5kaXNzZSBtYXR0aXMgbmVxdWUgbm9uIGVsZW1lbnR1bSBzY2VsZXJpc3F1ZS4gTnVsbGEKK2ZhY2lsaXNpLiBOdWxsYSBub24gZmVsaXMgZXQganVzdG8gZmV1Z2lhdCBlbGVtZW50dW0uIEFlbmVhbiBzb2RhbGVzCit0dXJwaXMgYXQgZXJhdCBlbGVpZmVuZCBsYWNpbmlhLiBQcm9pbiBlbGVpZmVuZCB2b2x1dHBhdCBwdXJ1cyBpZAorbW9sbGlzLiBQcm9pbiB2ZWwgdGVsbHVzIGZhdWNpYnVzLCBzYWdpdHRpcyBsaWJlcm8gYXQsIGxvYm9ydGlzCitvZGlvLiBQcmFlc2VudCBxdWFtIG1hdXJpcywgYXVjdG9yIHZlbCB2ZWxpdCBldSwgY29udmFsbGlzIG1vbGVzdGllCituaXNpLiBQZWxsZW50ZXNxdWUgaW4gbnVuYyBhdCBvcmNpIHVsdHJpY2VzIHZlaGljdWxhLjwvcD4KKworPHA+UHJhZXNlbnQgbmliaCBsZWN0dXMsIGVmZmljaXR1ciBzZWQgcmlzdXMgaW4sIHJ1dHJ1bSB0cmlzdGlxdWUKK2FyY3UuIEN1cmFiaXR1ciBub24gZWZmaWNpdHVyIGVsaXQuIFBoYXNlbGx1cyBlZ2V0IG9kaW8gaWFjdWxpcywKK21vbGVzdGllIGR1aSBlZ2V0LCB2ZW5lbmF0aXMgZXJhdC4gTnVsbGEgbHVjdHVzIGZhY2lsaXNpcyBsZWN0dXMsIG5lYworZGFwaWJ1cyB0b3J0b3IgcmhvbmN1cyB2ZWwuIERvbmVjIG5lYyBhcmN1IGVsaXQuIE51bGxhbSB1dCBmYXVjaWJ1cworcHVydXMsIHNlZCB1bHRyaWNpZXMgZGlhbS4gUGVsbGVudGVzcXVlIGF0IGZpbmlidXMgaXBzdW0uIFZlc3RpYnVsdW0KK2VnZXN0YXMgZGlnbmlzc2ltIG5pc2wsIGFjIHJob25jdXMgcmlzdXMgZmluaWJ1cyBzaXQgYW1ldC4gRG9uZWMgbm9uCitmZXVnaWF0IGFudGUuIERvbmVjIHZlaGljdWxhIGR1aSBhIGxvcmVtIGltcGVyZGlldCwgYSB0ZW1wdXMgZGlhbQorcHVsdmluYXIuIE51bGxhbSBjb25ndWUgZWZmaWNpdHVyIGp1c3RvLCBub24gcG9zdWVyZSBsaWd1bGEgc29kYWxlcworaW4uIFV0IGEgdXJuYSBvcm5hcmUsIHVsdHJpY2VzIHZlbGl0IGluLCBwZWxsZW50ZXNxdWUKK2xvcmVtLiBWZXN0aWJ1bHVtIGFudGUgaXBzdW0gcHJpbWlzIGluIGZhdWNpYnVzIG9yY2kgbHVjdHVzIGV0Cit1bHRyaWNlcyBwb3N1ZXJlIGN1YmlsaWEgQ3VyYWU7PC9wPgorCis8cD5PcmNpIHZhcml1cyBuYXRvcXVlIHBlbmF0aWJ1cyBldCBtYWduaXMgZGlzIHBhcnR1cmllbnQgbW9udGVzLAorbmFzY2V0dXIgcmlkaWN1bHVzIG11cy4gTW9yYmkgbWF4aW11cyBxdWlzIG1hZ25hIGV0IGFsaXF1ZXQuIE5hbQorYmliZW5kdW0gZmVybWVudHVtIHRlbXB1cy4gUHJhZXNlbnQgaWFjdWxpcyB0b3J0b3IgbWV0dXMsIGF0Cit2ZXN0aWJ1bHVtIGlwc3VtIGhlbmRyZXJpdCBtYXR0aXMuIFByb2luIGZyaW5naWxsYSBuaXNsIHNpdCBhbWV0Cit0aW5jaWR1bnQgYmxhbmRpdC4gSW50ZXJkdW0gZXQgbWFsZXN1YWRhIGZhbWVzIGFjIGFudGUgaXBzdW0gcHJpbWlzIGluCitmYXVjaWJ1cy4gUGhhc2VsbHVzIHZlbCBsZWN0dXMgbGVvLiBDdXJhYml0dXIgZnJpbmdpbGxhLCBhcmN1IG5vbgorcG9zdWVyZSB2aXZlcnJhLCB1cm5hIG1ldHVzIGJsYW5kaXQgYXVndWUsIGNvbnZhbGxpcyBtYXR0aXMgdG9ydG9yIGR1aQordmVsIGFyY3UuIEluIHNpdCBhbWV0IG1ldHVzIHZpdGFlIGV4IHJob25jdXMgaGVuZHJlcml0LjwvcD4KKworPHA+TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gVml2YW11cworaW50ZXJkdW0gbWF4aW11cyBmaW5pYnVzLiBVdCBmZXJtZW50dW0gbWFsZXN1YWRhIGNvbW1vZG8uIFNlZAorZmF1Y2lidXMsIHNhcGllbiBhIG1hdHRpcyBsb2JvcnRpcywgbWFnbmEgYW50ZSBlZmZpY2l0dXIgbWF1cmlzLCBxdWlzCitzb2RhbGVzIG5pYmggZGlhbSBuZWMgcXVhbS4gVmVzdGlidWx1bSBtYWduYSBsaWJlcm8sIHRpbmNpZHVudCBub24KK2VyYXQgc2VkLCBtb2xlc3RpZSBwdWx2aW5hciBleC4gTWFlY2VuYXMgc2VtcGVyIGJsYW5kaXQgZWxpdCwgaWQKK3N1c2NpcGl0IG51bGxhIHZlbmVuYXRpcyBwcmV0aXVtLiBJbnRlZ2VyIGFjY3Vtc2FuIHBvcnRhIGZlbGlzLCB2aXRhZQorcGxhY2VyYXQgdXJuYSBhY2N1bXNhbiB2ZWwuIEFsaXF1YW0gZXUgYWxpcXVldCBtaS4gQWVuZWFuIHRpbmNpZHVudAorZXJvcyBsZWN0dXMsIHNpdCBhbWV0IGVmZmljaXR1ciBvcmNpIHVsdHJpY2VzIGF0LiBNb3JiaSBsb2JvcnRpcyBleAorcXVpcyBsdWN0dXMgcnV0cnVtLiBJbiBudWxsYSB2ZWxpdCwgZWxlbWVudHVtIHZpdGFlIHR1cnBpcyB2aXRhZSwKK2ZpbmlidXMgdmFyaXVzIG1hc3NhLiBNb3JiaSBpZCBsaWJlcm8gZmF1Y2lidXMsIHRlbXB1cyBlcm9zIGV0LAordWxsYW1jb3JwZXIgaXBzdW0uIFNlZCBlbGVpZmVuZCBmaW5pYnVzIGJpYmVuZHVtLiBOdWxsYW0gdXQgbnVuYyBuZWMKK2xhY3VzIHBvc3VlcmUgZGlnbmlzc2ltLiBOdW5jIHNvbGxpY2l0dWRpbiB2aXRhZSBhdWd1ZSBpZAordnVscHV0YXRlLiBVdCBhYyBuaWJoIGdyYXZpZGEsIHZvbHV0cGF0IGVzdCBhYywgZmFjaWxpc2lzIG5lcXVlLjwvcD4KKworPHA+TmFtIGRpY3R1bSBsZW8gbWFzc2EsIG5vbiBwb3N1ZXJlIGR1aSBiaWJlbmR1bSBpZC4gTW9yYmkgc2FnaXR0aXMgZXN0Citub24gZXN0IGxhb3JlZXQsIGEgc29sbGljaXR1ZGluIGZlbGlzIGFsaXF1ZXQuIFV0IGN1cnN1cyB2ZWwgbGVvIGEKK2VmZmljaXR1ci4gUHJvaW4gdXQgcGVsbGVudGVzcXVlIHNhcGllbiwgdmVsIG1heGltdXMgZHVpLiBTdXNwZW5kaXNzZQorZXUgZmVsaXMgZWdldCBsZW8gZWxlbWVudHVtIGVmZmljaXR1ci4gQ2xhc3MgYXB0ZW50IHRhY2l0aSBzb2Npb3NxdSBhZAorbGl0b3JhIHRvcnF1ZW50IHBlciBjb251YmlhIG5vc3RyYSwgcGVyIGluY2VwdG9zIGhpbWVuYWVvcy4gRnVzY2UKK2xvYm9ydGlzIHZlbGl0IGluIGVsaXQgcGVsbGVudGVzcXVlLCB1dCBhdWN0b3IgaXBzdW0gZGlnbmlzc2ltLiBTZWQKK2FsaXF1ZXQgZWxlaWZlbmQgY29udmFsbGlzLiBEdWlzIG1vbGxpcywgZG9sb3Igc2VkIHJ1dHJ1bSBtb2xsaXMsCithdWd1ZSBlcm9zIGRpZ25pc3NpbSBlcmF0LCBldSBkYXBpYnVzIGF1Z3VlIHR1cnBpcyBhYyBzYXBpZW4uIE1vcmJpIGF0Cit2b2x1dHBhdCBvZGlvLCBhdCBtb2xlc3RpZSByaXN1cy4gTnVsbGEgcXVpcyBudWxsYSBldCBtYWduYSB2ZXN0aWJ1bHVtCitldWlzbW9kLiBQcmFlc2VudCBzdXNjaXBpdCBxdWFtIGVsaXQsIG5vbiBsdWN0dXMgdHVycGlzIHJ1dHJ1bQorZmF1Y2lidXMuPC9wPgorCis8cD5Nb3JiaSBmZXVnaWF0IGxhY3VzIHJob25jdXMsIGRpZ25pc3NpbSB2ZWxpdCBuZWMsIGRpZ25pc3NpbQorbG9yZW0uIEFsaXF1YW0gZXJhdCB2b2x1dHBhdC4gTWF1cmlzIHNlbXBlciBkaWN0dW0gdGVtcHVzLiBOdWxsYSBleAorbGlndWxhLCBtYWxlc3VhZGEgaW4gb3JuYXJlIHNlZCwgZXVpc21vZCB2aXRhZSBtYXNzYS4gRXRpYW0gcXVpcyBlcmF0CitxdWlzIG5pc2wgZmFjaWxpc2lzIHN1c2NpcGl0LiBNYXVyaXMgcGxhY2VyYXQgYW50ZSBldCBhdWN0b3IKK2Zlcm1lbnR1bS4gRG9uZWMgdGluY2lkdW50IGp1c3RvIHNlbSwgdWxsYW1jb3JwZXIgdnVscHV0YXRlIG5pc2wKK2NvbW1vZG8gYS4gVmVzdGlidWx1bSBxdWlzIGV4IG5vbiBlbGl0IHBvcnR0aXRvciBzZW1wZXIgZWdldCBxdWlzCit0b3J0b3IuIFN1c3BlbmRpc3NlIG1hdHRpcyBuZXF1ZSBub24gZWxlbWVudHVtIHNjZWxlcmlzcXVlLiBOdWxsYQorZmFjaWxpc2kuIE51bGxhIG5vbiBmZWxpcyBldCBqdXN0byBmZXVnaWF0IGVsZW1lbnR1bS4gQWVuZWFuIHNvZGFsZXMKK3R1cnBpcyBhdCBlcmF0IGVsZWlmZW5kIGxhY2luaWEuIFByb2luIGVsZWlmZW5kIHZvbHV0cGF0IHB1cnVzIGlkCittb2xsaXMuIFByb2luIHZlbCB0ZWxsdXMgZmF1Y2lidXMsIHNhZ2l0dGlzIGxpYmVybyBhdCwgbG9ib3J0aXMKK29kaW8uIFByYWVzZW50IHF1YW0gbWF1cmlzLCBhdWN0b3IgdmVsIHZlbGl0IGV1LCBjb252YWxsaXMgbW9sZXN0aWUKK25pc2kuIFBlbGxlbnRlc3F1ZSBpbiBudW5jIGF0IG9yY2kgdWx0cmljZXMgdmVoaWN1bGEuPC9wPgorCis8cD5QcmFlc2VudCBuaWJoIGxlY3R1cywgZWZmaWNpdHVyIHNlZCByaXN1cyBpbiwgcnV0cnVtIHRyaXN0aXF1ZQorYXJjdS4gQ3VyYWJpdHVyIG5vbiBlZmZpY2l0dXIgZWxpdC4gUGhhc2VsbHVzIGVnZXQgb2RpbyBpYWN1bGlzLAorbW9sZXN0aWUgZHVpIGVnZXQsIHZlbmVuYXRpcyBlcmF0LiBOdWxsYSBsdWN0dXMgZmFjaWxpc2lzIGxlY3R1cywgbmVjCitkYXBpYnVzIHRvcnRvciByaG9uY3VzIHZlbC4gRG9uZWMgbmVjIGFyY3UgZWxpdC4gTnVsbGFtIHV0IGZhdWNpYnVzCitwdXJ1cywgc2VkIHVsdHJpY2llcyBkaWFtLiBQZWxsZW50ZXNxdWUgYXQgZmluaWJ1cyBpcHN1bS4gVmVzdGlidWx1bQorZWdlc3RhcyBkaWduaXNzaW0gbmlzbCwgYWMgcmhvbmN1cyByaXN1cyBmaW5pYnVzIHNpdCBhbWV0LiBEb25lYyBub24KK2ZldWdpYXQgYW50ZS4gRG9uZWMgdmVoaWN1bGEgZHVpIGEgbG9yZW0gaW1wZXJkaWV0LCBhIHRlbXB1cyBkaWFtCitwdWx2aW5hci4gTnVsbGFtIGNvbmd1ZSBlZmZpY2l0dXIganVzdG8sIG5vbiBwb3N1ZXJlIGxpZ3VsYSBzb2RhbGVzCitpbi4gVXQgYSB1cm5hIG9ybmFyZSwgdWx0cmljZXMgdmVsaXQgaW4sIHBlbGxlbnRlc3F1ZQorbG9yZW0uIFZlc3RpYnVsdW0gYW50ZSBpcHN1bSBwcmltaXMgaW4gZmF1Y2lidXMgb3JjaSBsdWN0dXMgZXQKK3VsdHJpY2VzIHBvc3VlcmUgY3ViaWxpYSBDdXJhZTs8L3A+CisKKzxwPk9yY2kgdmFyaXVzIG5hdG9xdWUgcGVuYXRpYnVzIGV0IG1hZ25pcyBkaXMgcGFydHVyaWVudCBtb250ZXMsCituYXNjZXR1ciByaWRpY3VsdXMgbXVzLiBNb3JiaSBtYXhpbXVzIHF1aXMgbWFnbmEgZXQgYWxpcXVldC4gTmFtCitiaWJlbmR1bSBmZXJtZW50dW0gdGVtcHVzLiBQcmFlc2VudCBpYWN1bGlzIHRvcnRvciBtZXR1cywgYXQKK3Zlc3RpYnVsdW0gaXBzdW0gaGVuZHJlcml0IG1hdHRpcy4gUHJvaW4gZnJpbmdpbGxhIG5pc2wgc2l0IGFtZXQKK3RpbmNpZHVudCBibGFuZGl0LiBJbnRlcmR1bSBldCBtYWxlc3VhZGEgZmFtZXMgYWMgYW50ZSBpcHN1bSBwcmltaXMgaW4KK2ZhdWNpYnVzLiBQaGFzZWxsdXMgdmVsIGxlY3R1cyBsZW8uIEN1cmFiaXR1ciBmcmluZ2lsbGEsIGFyY3Ugbm9uCitwb3N1ZXJlIHZpdmVycmEsIHVybmEgbWV0dXMgYmxhbmRpdCBhdWd1ZSwgY29udmFsbGlzIG1hdHRpcyB0b3J0b3IgZHVpCit2ZWwgYXJjdS4gSW4gc2l0IGFtZXQgbWV0dXMgdml0YWUgZXggcmhvbmN1cyBoZW5kcmVyaXQuPC9wPgorCis8cD5Mb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LiBWaXZhbXVzCitpbnRlcmR1bSBtYXhpbXVzIGZpbmlidXMuIFV0IGZlcm1lbnR1bSBtYWxlc3VhZGEgY29tbW9kby4gU2VkCitmYXVjaWJ1cywgc2FwaWVuIGEgbWF0dGlzIGxvYm9ydGlzLCBtYWduYSBhbnRlIGVmZmljaXR1ciBtYXVyaXMsIHF1aXMKK3NvZGFsZXMgbmliaCBkaWFtIG5lYyBxdWFtLiBWZXN0aWJ1bHVtIG1hZ25hIGxpYmVybywgdGluY2lkdW50IG5vbgorZXJhdCBzZWQsIG1vbGVzdGllIHB1bHZpbmFyIGV4LiBNYWVjZW5hcyBzZW1wZXIgYmxhbmRpdCBlbGl0LCBpZAorc3VzY2lwaXQgbnVsbGEgdmVuZW5hdGlzIHByZXRpdW0uIEludGVnZXIgYWNjdW1zYW4gcG9ydGEgZmVsaXMsIHZpdGFlCitwbGFjZXJhdCB1cm5hIGFjY3Vtc2FuIHZlbC4gQWxpcXVhbSBldSBhbGlxdWV0IG1pLiBBZW5lYW4gdGluY2lkdW50Citlcm9zIGxlY3R1cywgc2l0IGFtZXQgZWZmaWNpdHVyIG9yY2kgdWx0cmljZXMgYXQuIE1vcmJpIGxvYm9ydGlzIGV4CitxdWlzIGx1Y3R1cyBydXRydW0uIEluIG51bGxhIHZlbGl0LCBlbGVtZW50dW0gdml0YWUgdHVycGlzIHZpdGFlLAorZmluaWJ1cyB2YXJpdXMgbWFzc2EuIE1vcmJpIGlkIGxpYmVybyBmYXVjaWJ1cywgdGVtcHVzIGVyb3MgZXQsCit1bGxhbWNvcnBlciBpcHN1bS4gU2VkIGVsZWlmZW5kIGZpbmlidXMgYmliZW5kdW0uIE51bGxhbSB1dCBudW5jIG5lYworbGFjdXMgcG9zdWVyZSBkaWduaXNzaW0uIE51bmMgc29sbGljaXR1ZGluIHZpdGFlIGF1Z3VlIGlkCit2dWxwdXRhdGUuIFV0IGFjIG5pYmggZ3JhdmlkYSwgdm9sdXRwYXQgZXN0IGFjLCBmYWNpbGlzaXMgbmVxdWUuPC9wPgorCis8cD5OYW0gZGljdHVtIGxlbyBtYXNzYSwgbm9uIHBvc3VlcmUgZHVpIGJpYmVuZHVtIGlkLiBNb3JiaSBzYWdpdHRpcyBlc3QKK25vbiBlc3QgbGFvcmVldCwgYSBzb2xsaWNpdHVkaW4gZmVsaXMgYWxpcXVldC4gVXQgY3Vyc3VzIHZlbCBsZW8gYQorZWZmaWNpdHVyLiBQcm9pbiB1dCBwZWxsZW50ZXNxdWUgc2FwaWVuLCB2ZWwgbWF4aW11cyBkdWkuIFN1c3BlbmRpc3NlCitldSBmZWxpcyBlZ2V0IGxlbyBlbGVtZW50dW0gZWZmaWNpdHVyLiBDbGFzcyBhcHRlbnQgdGFjaXRpIHNvY2lvc3F1IGFkCitsaXRvcmEgdG9ycXVlbnQgcGVyIGNvbnViaWEgbm9zdHJhLCBwZXIgaW5jZXB0b3MgaGltZW5hZW9zLiBGdXNjZQorbG9ib3J0aXMgdmVsaXQgaW4gZWxpdCBwZWxsZW50ZXNxdWUsIHV0IGF1Y3RvciBpcHN1bSBkaWduaXNzaW0uIFNlZAorYWxpcXVldCBlbGVpZmVuZCBjb252YWxsaXMuIER1aXMgbW9sbGlzLCBkb2xvciBzZWQgcnV0cnVtIG1vbGxpcywKK2F1Z3VlIGVyb3MgZGlnbmlzc2ltIGVyYXQsIGV1IGRhcGlidXMgYXVndWUgdHVycGlzIGFjIHNhcGllbi4gTW9yYmkgYXQKK3ZvbHV0cGF0IG9kaW8sIGF0IG1vbGVzdGllIHJpc3VzLiBOdWxsYSBxdWlzIG51bGxhIGV0IG1hZ25hIHZlc3RpYnVsdW0KK2V1aXNtb2QuIFByYWVzZW50IHN1c2NpcGl0IHF1YW0gZWxpdCwgbm9uIGx1Y3R1cyB0dXJwaXMgcnV0cnVtCitmYXVjaWJ1cy48L3A+CisKKzxwPk1vcmJpIGZldWdpYXQgbGFjdXMgcmhvbmN1cywgZGlnbmlzc2ltIHZlbGl0IG5lYywgZGlnbmlzc2ltCitsb3JlbS4gQWxpcXVhbSBlcmF0IHZvbHV0cGF0LiBNYXVyaXMgc2VtcGVyIGRpY3R1bSB0ZW1wdXMuIE51bGxhIGV4CitsaWd1bGEsIG1hbGVzdWFkYSBpbiBvcm5hcmUgc2VkLCBldWlzbW9kIHZpdGFlIG1hc3NhLiBFdGlhbSBxdWlzIGVyYXQKK3F1aXMgbmlzbCBmYWNpbGlzaXMgc3VzY2lwaXQuIE1hdXJpcyBwbGFjZXJhdCBhbnRlIGV0IGF1Y3RvcgorZmVybWVudHVtLiBEb25lYyB0aW5jaWR1bnQganVzdG8gc2VtLCB1bGxhbWNvcnBlciB2dWxwdXRhdGUgbmlzbAorY29tbW9kbyBhLiBWZXN0aWJ1bHVtIHF1aXMgZXggbm9uIGVsaXQgcG9ydHRpdG9yIHNlbXBlciBlZ2V0IHF1aXMKK3RvcnRvci4gU3VzcGVuZGlzc2UgbWF0dGlzIG5lcXVlIG5vbiBlbGVtZW50dW0gc2NlbGVyaXNxdWUuIE51bGxhCitmYWNpbGlzaS4gTnVsbGEgbm9uIGZlbGlzIGV0IGp1c3RvIGZldWdpYXQgZWxlbWVudHVtLiBBZW5lYW4gc29kYWxlcwordHVycGlzIGF0IGVyYXQgZWxlaWZlbmQgbGFjaW5pYS4gUHJvaW4gZWxlaWZlbmQgdm9sdXRwYXQgcHVydXMgaWQKK21vbGxpcy4gUHJvaW4gdmVsIHRlbGx1cyBmYXVjaWJ1cywgc2FnaXR0aXMgbGliZXJvIGF0LCBsb2JvcnRpcworb2Rpby4gUHJhZXNlbnQgcXVhbSBtYXVyaXMsIGF1Y3RvciB2ZWwgdmVsaXQgZXUsIGNvbnZhbGxpcyBtb2xlc3RpZQorbmlzaS4gUGVsbGVudGVzcXVlIGluIG51bmMgYXQgb3JjaSB1bHRyaWNlcyB2ZWhpY3VsYS48L3A+CisKKzxwPlByYWVzZW50IG5pYmggbGVjdHVzLCBlZmZpY2l0dXIgc2VkIHJpc3VzIGluLCBydXRydW0gdHJpc3RpcXVlCithcmN1LiBDdXJhYml0dXIgbm9uIGVmZmljaXR1ciBlbGl0LiBQaGFzZWxsdXMgZWdldCBvZGlvIGlhY3VsaXMsCittb2xlc3RpZSBkdWkgZWdldCwgdmVuZW5hdGlzIGVyYXQuIE51bGxhIGx1Y3R1cyBmYWNpbGlzaXMgbGVjdHVzLCBuZWMKK2RhcGlidXMgdG9ydG9yIHJob25jdXMgdmVsLiBEb25lYyBuZWMgYXJjdSBlbGl0LiBOdWxsYW0gdXQgZmF1Y2lidXMKK3B1cnVzLCBzZWQgdWx0cmljaWVzIGRpYW0uIFBlbGxlbnRlc3F1ZSBhdCBmaW5pYnVzIGlwc3VtLiBWZXN0aWJ1bHVtCitlZ2VzdGFzIGRpZ25pc3NpbSBuaXNsLCBhYyByaG9uY3VzIHJpc3VzIGZpbmlidXMgc2l0IGFtZXQuIERvbmVjIG5vbgorZmV1Z2lhdCBhbnRlLiBEb25lYyB2ZWhpY3VsYSBkdWkgYSBsb3JlbSBpbXBlcmRpZXQsIGEgdGVtcHVzIGRpYW0KK3B1bHZpbmFyLiBOdWxsYW0gY29uZ3VlIGVmZmljaXR1ciBqdXN0bywgbm9uIHBvc3VlcmUgbGlndWxhIHNvZGFsZXMKK2luLiBVdCBhIHVybmEgb3JuYXJlLCB1bHRyaWNlcyB2ZWxpdCBpbiwgcGVsbGVudGVzcXVlCitsb3JlbS4gVmVzdGlidWx1bSBhbnRlIGlwc3VtIHByaW1pcyBpbiBmYXVjaWJ1cyBvcmNpIGx1Y3R1cyBldAordWx0cmljZXMgcG9zdWVyZSBjdWJpbGlhIEN1cmFlOzwvcD4KKworPHA+T3JjaSB2YXJpdXMgbmF0b3F1ZSBwZW5hdGlidXMgZXQgbWFnbmlzIGRpcyBwYXJ0dXJpZW50IG1vbnRlcywKK25hc2NldHVyIHJpZGljdWx1cyBtdXMuIE1vcmJpIG1heGltdXMgcXVpcyBtYWduYSBldCBhbGlxdWV0LiBOYW0KK2JpYmVuZHVtIGZlcm1lbnR1bSB0ZW1wdXMuIFByYWVzZW50IGlhY3VsaXMgdG9ydG9yIG1ldHVzLCBhdAordmVzdGlidWx1bSBpcHN1bSBoZW5kcmVyaXQgbWF0dGlzLiBQcm9pbiBmcmluZ2lsbGEgbmlzbCBzaXQgYW1ldAordGluY2lkdW50IGJsYW5kaXQuIEludGVyZHVtIGV0IG1hbGVzdWFkYSBmYW1lcyBhYyBhbnRlIGlwc3VtIHByaW1pcyBpbgorZmF1Y2lidXMuIFBoYXNlbGx1cyB2ZWwgbGVjdHVzIGxlby4gQ3VyYWJpdHVyIGZyaW5naWxsYSwgYXJjdSBub24KK3Bvc3VlcmUgdml2ZXJyYSwgdXJuYSBtZXR1cyBibGFuZGl0IGF1Z3VlLCBjb252YWxsaXMgbWF0dGlzIHRvcnRvciBkdWkKK3ZlbCBhcmN1LiBJbiBzaXQgYW1ldCBtZXR1cyB2aXRhZSBleCByaG9uY3VzIGhlbmRyZXJpdC48L3A+CisKKzxwPkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nIGVsaXQuIFZpdmFtdXMKK2ludGVyZHVtIG1heGltdXMgZmluaWJ1cy4gVXQgZmVybWVudHVtIG1hbGVzdWFkYSBjb21tb2RvLiBTZWQKK2ZhdWNpYnVzLCBzYXBpZW4gYSBtYXR0aXMgbG9ib3J0aXMsIG1hZ25hIGFudGUgZWZmaWNpdHVyIG1hdXJpcywgcXVpcworc29kYWxlcyBuaWJoIGRpYW0gbmVjIHF1YW0uIFZlc3RpYnVsdW0gbWFnbmEgbGliZXJvLCB0aW5jaWR1bnQgbm9uCitlcmF0IHNlZCwgbW9sZXN0aWUgcHVsdmluYXIgZXguIE1hZWNlbmFzIHNlbXBlciBibGFuZGl0IGVsaXQsIGlkCitzdXNjaXBpdCBudWxsYSB2ZW5lbmF0aXMgcHJldGl1bS4gSW50ZWdlciBhY2N1bXNhbiBwb3J0YSBmZWxpcywgdml0YWUKK3BsYWNlcmF0IHVybmEgYWNjdW1zYW4gdmVsLiBBbGlxdWFtIGV1IGFsaXF1ZXQgbWkuIEFlbmVhbiB0aW5jaWR1bnQKK2Vyb3MgbGVjdHVzLCBzaXQgYW1ldCBlZmZpY2l0dXIgb3JjaSB1bHRyaWNlcyBhdC4gTW9yYmkgbG9ib3J0aXMgZXgKK3F1aXMgbHVjdHVzIHJ1dHJ1bS4gSW4gbnVsbGEgdmVsaXQsIGVsZW1lbnR1bSB2aXRhZSB0dXJwaXMgdml0YWUsCitmaW5pYnVzIHZhcml1cyBtYXNzYS4gTW9yYmkgaWQgbGliZXJvIGZhdWNpYnVzLCB0ZW1wdXMgZXJvcyBldCwKK3VsbGFtY29ycGVyIGlwc3VtLiBTZWQgZWxlaWZlbmQgZmluaWJ1cyBiaWJlbmR1bS4gTnVsbGFtIHV0IG51bmMgbmVjCitsYWN1cyBwb3N1ZXJlIGRpZ25pc3NpbS4gTnVuYyBzb2xsaWNpdHVkaW4gdml0YWUgYXVndWUgaWQKK3Z1bHB1dGF0ZS4gVXQgYWMgbmliaCBncmF2aWRhLCB2b2x1dHBhdCBlc3QgYWMsIGZhY2lsaXNpcyBuZXF1ZS48L3A+CisKKzxwPk5hbSBkaWN0dW0gbGVvIG1hc3NhLCBub24gcG9zdWVyZSBkdWkgYmliZW5kdW0gaWQuIE1vcmJpIHNhZ2l0dGlzIGVzdAorbm9uIGVzdCBsYW9yZWV0LCBhIHNvbGxpY2l0dWRpbiBmZWxpcyBhbGlxdWV0LiBVdCBjdXJzdXMgdmVsIGxlbyBhCitlZmZpY2l0dXIuIFByb2luIHV0IHBlbGxlbnRlc3F1ZSBzYXBpZW4sIHZlbCBtYXhpbXVzIGR1aS4gU3VzcGVuZGlzc2UKK2V1IGZlbGlzIGVnZXQgbGVvIGVsZW1lbnR1bSBlZmZpY2l0dXIuIENsYXNzIGFwdGVudCB0YWNpdGkgc29jaW9zcXUgYWQKK2xpdG9yYSB0b3JxdWVudCBwZXIgY29udWJpYSBub3N0cmEsIHBlciBpbmNlcHRvcyBoaW1lbmFlb3MuIEZ1c2NlCitsb2JvcnRpcyB2ZWxpdCBpbiBlbGl0IHBlbGxlbnRlc3F1ZSwgdXQgYXVjdG9yIGlwc3VtIGRpZ25pc3NpbS4gU2VkCithbGlxdWV0IGVsZWlmZW5kIGNvbnZhbGxpcy4gRHVpcyBtb2xsaXMsIGRvbG9yIHNlZCBydXRydW0gbW9sbGlzLAorYXVndWUgZXJvcyBkaWduaXNzaW0gZXJhdCwgZXUgZGFwaWJ1cyBhdWd1ZSB0dXJwaXMgYWMgc2FwaWVuLiBNb3JiaSBhdAordm9sdXRwYXQgb2RpbywgYXQgbW9sZXN0aWUgcmlzdXMuIE51bGxhIHF1aXMgbnVsbGEgZXQgbWFnbmEgdmVzdGlidWx1bQorZXVpc21vZC4gUHJhZXNlbnQgc3VzY2lwaXQgcXVhbSBlbGl0LCBub24gbHVjdHVzIHR1cnBpcyBydXRydW0KK2ZhdWNpYnVzLjwvcD4KKworPHA+TW9yYmkgZmV1Z2lhdCBsYWN1cyByaG9uY3VzLCBkaWduaXNzaW0gdmVsaXQgbmVjLCBkaWduaXNzaW0KK2xvcmVtLiBBbGlxdWFtIGVyYXQgdm9sdXRwYXQuIE1hdXJpcyBzZW1wZXIgZGljdHVtIHRlbXB1cy4gTnVsbGEgZXgKK2xpZ3VsYSwgbWFsZXN1YWRhIGluIG9ybmFyZSBzZWQsIGV1aXNtb2Qgdml0YWUgbWFzc2EuIEV0aWFtIHF1aXMgZXJhdAorcXVpcyBuaXNsIGZhY2lsaXNpcyBzdXNjaXBpdC4gTWF1cmlzIHBsYWNlcmF0IGFudGUgZXQgYXVjdG9yCitmZXJtZW50dW0uIERvbmVjIHRpbmNpZHVudCBqdXN0byBzZW0sIHVsbGFtY29ycGVyIHZ1bHB1dGF0ZSBuaXNsCitjb21tb2RvIGEuIFZlc3RpYnVsdW0gcXVpcyBleCBub24gZWxpdCBwb3J0dGl0b3Igc2VtcGVyIGVnZXQgcXVpcwordG9ydG9yLiBTdXNwZW5kaXNzZSBtYXR0aXMgbmVxdWUgbm9uIGVsZW1lbnR1bSBzY2VsZXJpc3F1ZS4gTnVsbGEKK2ZhY2lsaXNpLiBOdWxsYSBub24gZmVsaXMgZXQganVzdG8gZmV1Z2lhdCBlbGVtZW50dW0uIEFlbmVhbiBzb2RhbGVzCit0dXJwaXMgYXQgZXJhdCBlbGVpZmVuZCBsYWNpbmlhLiBQcm9pbiBlbGVpZmVuZCB2b2x1dHBhdCBwdXJ1cyBpZAorbW9sbGlzLiBQcm9pbiB2ZWwgdGVsbHVzIGZhdWNpYnVzLCBzYWdpdHRpcyBsaWJlcm8gYXQsIGxvYm9ydGlzCitvZGlvLiBQcmFlc2VudCBxdWFtIG1hdXJpcywgYXVjdG9yIHZlbCB2ZWxpdCBldSwgY29udmFsbGlzIG1vbGVzdGllCituaXNpLiBQZWxsZW50ZXNxdWUgaW4gbnVuYyBhdCBvcmNpIHVsdHJpY2VzIHZlaGljdWxhLjwvcD4KKworPHA+UHJhZXNlbnQgbmliaCBsZWN0dXMsIGVmZmljaXR1ciBzZWQgcmlzdXMgaW4sIHJ1dHJ1bSB0cmlzdGlxdWUKK2FyY3UuIEN1cmFiaXR1ciBub24gZWZmaWNpdHVyIGVsaXQuIFBoYXNlbGx1cyBlZ2V0IG9kaW8gaWFjdWxpcywKK21vbGVzdGllIGR1aSBlZ2V0LCB2ZW5lbmF0aXMgZXJhdC4gTnVsbGEgbHVjdHVzIGZhY2lsaXNpcyBsZWN0dXMsIG5lYworZGFwaWJ1cyB0b3J0b3IgcmhvbmN1cyB2ZWwuIERvbmVjIG5lYyBhcmN1IGVsaXQuIE51bGxhbSB1dCBmYXVjaWJ1cworcHVydXMsIHNlZCB1bHRyaWNpZXMgZGlhbS4gUGVsbGVudGVzcXVlIGF0IGZpbmlidXMgaXBzdW0uIFZlc3RpYnVsdW0KK2VnZXN0YXMgZGlnbmlzc2ltIG5pc2wsIGFjIHJob25jdXMgcmlzdXMgZmluaWJ1cyBzaXQgYW1ldC4gRG9uZWMgbm9uCitmZXVnaWF0IGFudGUuIERvbmVjIHZlaGljdWxhIGR1aSBhIGxvcmVtIGltcGVyZGlldCwgYSB0ZW1wdXMgZGlhbQorcHVsdmluYXIuIE51bGxhbSBjb25ndWUgZWZmaWNpdHVyIGp1c3RvLCBub24gcG9zdWVyZSBsaWd1bGEgc29kYWxlcworaW4uIFV0IGEgdXJuYSBvcm5hcmUsIHVsdHJpY2VzIHZlbGl0IGluLCBwZWxsZW50ZXNxdWUKK2xvcmVtLiBWZXN0aWJ1bHVtIGFudGUgaXBzdW0gcHJpbWlzIGluIGZhdWNpYnVzIG9yY2kgbHVjdHVzIGV0Cit1bHRyaWNlcyBwb3N1ZXJlIGN1YmlsaWEgQ3VyYWU7PC9wPgorCis8cD5PcmNpIHZhcml1cyBuYXRvcXVlIHBlbmF0aWJ1cyBldCBtYWduaXMgZGlzIHBhcnR1cmllbnQgbW9udGVzLAorbmFzY2V0dXIgcmlkaWN1bHVzIG11cy4gTW9yYmkgbWF4aW11cyBxdWlzIG1hZ25hIGV0IGFsaXF1ZXQuIE5hbQorYmliZW5kdW0gZmVybWVudHVtIHRlbXB1cy4gUHJhZXNlbnQgaWFjdWxpcyB0b3J0b3IgbWV0dXMsIGF0Cit2ZXN0aWJ1bHVtIGlwc3VtIGhlbmRyZXJpdCBtYXR0aXMuIFByb2luIGZyaW5naWxsYSBuaXNsIHNpdCBhbWV0Cit0aW5jaWR1bnQgYmxhbmRpdC4gSW50ZXJkdW0gZXQgbWFsZXN1YWRhIGZhbWVzIGFjIGFudGUgaXBzdW0gcHJpbWlzIGluCitmYXVjaWJ1cy4gUGhhc2VsbHVzIHZlbCBsZWN0dXMgbGVvLiBDdXJhYml0dXIgZnJpbmdpbGxhLCBhcmN1IG5vbgorcG9zdWVyZSB2aXZlcnJhLCB1cm5hIG1ldHVzIGJsYW5kaXQgYXVndWUsIGNvbnZhbGxpcyBtYXR0aXMgdG9ydG9yIGR1aQordmVsIGFyY3UuIEluIHNpdCBhbWV0IG1ldHVzIHZpdGFlIGV4IHJob25jdXMgaGVuZHJlcml0LjwvcD4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL3Rlc3RkYXRhL3NwbGFzaF9zY3JlZW4vYmxvY2tfcmVuZGVyX3RyZWVfaHRtbF9kaXNwbGF5X25vbmUuaHRtbCBiL3NyYy9jb2JhbHQvYnJvd3Nlci90ZXN0ZGF0YS9zcGxhc2hfc2NyZWVuL2Jsb2NrX3JlbmRlcl90cmVlX2h0bWxfZGlzcGxheV9ub25lLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVmNDU1MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci90ZXN0ZGF0YS9zcGxhc2hfc2NyZWVuL2Jsb2NrX3JlbmRlcl90cmVlX2h0bWxfZGlzcGxheV9ub25lLmh0bWwKQEAgLTAsMCArMSw0NDAgQEAKKzwhRE9DVFlQRSBodG1sPgorPGh0bWwgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPgorCis8aGVhZD4KKyAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TZWN1cml0eS1Qb2xpY3kiIGNvbnRlbnQ9IgorICAgIGRlZmF1bHQtc3JjICd1bnNhZmUtaW5saW5lJzsKKyAgICBzdHlsZS1zcmMgJ3Vuc2FmZS1pbmxpbmUnOworICAgIHNjcmlwdC1zcmMgJ3Vuc2FmZS1pbmxpbmUnOyI+Cis8L2hlYWQ+CisKKzxzY3JpcHQ+CisgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeworICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdodG1sJylbMF0uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CisgIH0sIDUwMDApOworPC9zY3JpcHQ+Cis8Ym9keSBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogIzFmNTJhNTsiPgorPGgxPkhlYWRpbmc8L2gxPgorCis8cD5Mb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LiBWaXZhbXVzCitpbnRlcmR1bSBtYXhpbXVzIGZpbmlidXMuIFV0IGZlcm1lbnR1bSBtYWxlc3VhZGEgY29tbW9kby4gU2VkCitmYXVjaWJ1cywgc2FwaWVuIGEgbWF0dGlzIGxvYm9ydGlzLCBtYWduYSBhbnRlIGVmZmljaXR1ciBtYXVyaXMsIHF1aXMKK3NvZGFsZXMgbmliaCBkaWFtIG5lYyBxdWFtLiBWZXN0aWJ1bHVtIG1hZ25hIGxpYmVybywgdGluY2lkdW50IG5vbgorZXJhdCBzZWQsIG1vbGVzdGllIHB1bHZpbmFyIGV4LiBNYWVjZW5hcyBzZW1wZXIgYmxhbmRpdCBlbGl0LCBpZAorc3VzY2lwaXQgbnVsbGEgdmVuZW5hdGlzIHByZXRpdW0uIEludGVnZXIgYWNjdW1zYW4gcG9ydGEgZmVsaXMsIHZpdGFlCitwbGFjZXJhdCB1cm5hIGFjY3Vtc2FuIHZlbC4gQWxpcXVhbSBldSBhbGlxdWV0IG1pLiBBZW5lYW4gdGluY2lkdW50Citlcm9zIGxlY3R1cywgc2l0IGFtZXQgZWZmaWNpdHVyIG9yY2kgdWx0cmljZXMgYXQuIE1vcmJpIGxvYm9ydGlzIGV4CitxdWlzIGx1Y3R1cyBydXRydW0uIEluIG51bGxhIHZlbGl0LCBlbGVtZW50dW0gdml0YWUgdHVycGlzIHZpdGFlLAorZmluaWJ1cyB2YXJpdXMgbWFzc2EuIE1vcmJpIGlkIGxpYmVybyBmYXVjaWJ1cywgdGVtcHVzIGVyb3MgZXQsCit1bGxhbWNvcnBlciBpcHN1bS4gU2VkIGVsZWlmZW5kIGZpbmlidXMgYmliZW5kdW0uIE51bGxhbSB1dCBudW5jIG5lYworbGFjdXMgcG9zdWVyZSBkaWduaXNzaW0uIE51bmMgc29sbGljaXR1ZGluIHZpdGFlIGF1Z3VlIGlkCit2dWxwdXRhdGUuIFV0IGFjIG5pYmggZ3JhdmlkYSwgdm9sdXRwYXQgZXN0IGFjLCBmYWNpbGlzaXMgbmVxdWUuPC9wPgorCis8cD5OYW0gZGljdHVtIGxlbyBtYXNzYSwgbm9uIHBvc3VlcmUgZHVpIGJpYmVuZHVtIGlkLiBNb3JiaSBzYWdpdHRpcyBlc3QKK25vbiBlc3QgbGFvcmVldCwgYSBzb2xsaWNpdHVkaW4gZmVsaXMgYWxpcXVldC4gVXQgY3Vyc3VzIHZlbCBsZW8gYQorZWZmaWNpdHVyLiBQcm9pbiB1dCBwZWxsZW50ZXNxdWUgc2FwaWVuLCB2ZWwgbWF4aW11cyBkdWkuIFN1c3BlbmRpc3NlCitldSBmZWxpcyBlZ2V0IGxlbyBlbGVtZW50dW0gZWZmaWNpdHVyLiBDbGFzcyBhcHRlbnQgdGFjaXRpIHNvY2lvc3F1IGFkCitsaXRvcmEgdG9ycXVlbnQgcGVyIGNvbnViaWEgbm9zdHJhLCBwZXIgaW5jZXB0b3MgaGltZW5hZW9zLiBGdXNjZQorbG9ib3J0aXMgdmVsaXQgaW4gZWxpdCBwZWxsZW50ZXNxdWUsIHV0IGF1Y3RvciBpcHN1bSBkaWduaXNzaW0uIFNlZAorYWxpcXVldCBlbGVpZmVuZCBjb252YWxsaXMuIER1aXMgbW9sbGlzLCBkb2xvciBzZWQgcnV0cnVtIG1vbGxpcywKK2F1Z3VlIGVyb3MgZGlnbmlzc2ltIGVyYXQsIGV1IGRhcGlidXMgYXVndWUgdHVycGlzIGFjIHNhcGllbi4gTW9yYmkgYXQKK3ZvbHV0cGF0IG9kaW8sIGF0IG1vbGVzdGllIHJpc3VzLiBOdWxsYSBxdWlzIG51bGxhIGV0IG1hZ25hIHZlc3RpYnVsdW0KK2V1aXNtb2QuIFByYWVzZW50IHN1c2NpcGl0IHF1YW0gZWxpdCwgbm9uIGx1Y3R1cyB0dXJwaXMgcnV0cnVtCitmYXVjaWJ1cy48L3A+CisKKzxwPk1vcmJpIGZldWdpYXQgbGFjdXMgcmhvbmN1cywgZGlnbmlzc2ltIHZlbGl0IG5lYywgZGlnbmlzc2ltCitsb3JlbS4gQWxpcXVhbSBlcmF0IHZvbHV0cGF0LiBNYXVyaXMgc2VtcGVyIGRpY3R1bSB0ZW1wdXMuIE51bGxhIGV4CitsaWd1bGEsIG1hbGVzdWFkYSBpbiBvcm5hcmUgc2VkLCBldWlzbW9kIHZpdGFlIG1hc3NhLiBFdGlhbSBxdWlzIGVyYXQKK3F1aXMgbmlzbCBmYWNpbGlzaXMgc3VzY2lwaXQuIE1hdXJpcyBwbGFjZXJhdCBhbnRlIGV0IGF1Y3RvcgorZmVybWVudHVtLiBEb25lYyB0aW5jaWR1bnQganVzdG8gc2VtLCB1bGxhbWNvcnBlciB2dWxwdXRhdGUgbmlzbAorY29tbW9kbyBhLiBWZXN0aWJ1bHVtIHF1aXMgZXggbm9uIGVsaXQgcG9ydHRpdG9yIHNlbXBlciBlZ2V0IHF1aXMKK3RvcnRvci4gU3VzcGVuZGlzc2UgbWF0dGlzIG5lcXVlIG5vbiBlbGVtZW50dW0gc2NlbGVyaXNxdWUuIE51bGxhCitmYWNpbGlzaS4gTnVsbGEgbm9uIGZlbGlzIGV0IGp1c3RvIGZldWdpYXQgZWxlbWVudHVtLiBBZW5lYW4gc29kYWxlcwordHVycGlzIGF0IGVyYXQgZWxlaWZlbmQgbGFjaW5pYS4gUHJvaW4gZWxlaWZlbmQgdm9sdXRwYXQgcHVydXMgaWQKK21vbGxpcy4gUHJvaW4gdmVsIHRlbGx1cyBmYXVjaWJ1cywgc2FnaXR0aXMgbGliZXJvIGF0LCBsb2JvcnRpcworb2Rpby4gUHJhZXNlbnQgcXVhbSBtYXVyaXMsIGF1Y3RvciB2ZWwgdmVsaXQgZXUsIGNvbnZhbGxpcyBtb2xlc3RpZQorbmlzaS4gUGVsbGVudGVzcXVlIGluIG51bmMgYXQgb3JjaSB1bHRyaWNlcyB2ZWhpY3VsYS48L3A+CisKKzxwPlByYWVzZW50IG5pYmggbGVjdHVzLCBlZmZpY2l0dXIgc2VkIHJpc3VzIGluLCBydXRydW0gdHJpc3RpcXVlCithcmN1LiBDdXJhYml0dXIgbm9uIGVmZmljaXR1ciBlbGl0LiBQaGFzZWxsdXMgZWdldCBvZGlvIGlhY3VsaXMsCittb2xlc3RpZSBkdWkgZWdldCwgdmVuZW5hdGlzIGVyYXQuIE51bGxhIGx1Y3R1cyBmYWNpbGlzaXMgbGVjdHVzLCBuZWMKK2RhcGlidXMgdG9ydG9yIHJob25jdXMgdmVsLiBEb25lYyBuZWMgYXJjdSBlbGl0LiBOdWxsYW0gdXQgZmF1Y2lidXMKK3B1cnVzLCBzZWQgdWx0cmljaWVzIGRpYW0uIFBlbGxlbnRlc3F1ZSBhdCBmaW5pYnVzIGlwc3VtLiBWZXN0aWJ1bHVtCitlZ2VzdGFzIGRpZ25pc3NpbSBuaXNsLCBhYyByaG9uY3VzIHJpc3VzIGZpbmlidXMgc2l0IGFtZXQuIERvbmVjIG5vbgorZmV1Z2lhdCBhbnRlLiBEb25lYyB2ZWhpY3VsYSBkdWkgYSBsb3JlbSBpbXBlcmRpZXQsIGEgdGVtcHVzIGRpYW0KK3B1bHZpbmFyLiBOdWxsYW0gY29uZ3VlIGVmZmljaXR1ciBqdXN0bywgbm9uIHBvc3VlcmUgbGlndWxhIHNvZGFsZXMKK2luLiBVdCBhIHVybmEgb3JuYXJlLCB1bHRyaWNlcyB2ZWxpdCBpbiwgcGVsbGVudGVzcXVlCitsb3JlbS4gVmVzdGlidWx1bSBhbnRlIGlwc3VtIHByaW1pcyBpbiBmYXVjaWJ1cyBvcmNpIGx1Y3R1cyBldAordWx0cmljZXMgcG9zdWVyZSBjdWJpbGlhIEN1cmFlOzwvcD4KKworPHA+T3JjaSB2YXJpdXMgbmF0b3F1ZSBwZW5hdGlidXMgZXQgbWFnbmlzIGRpcyBwYXJ0dXJpZW50IG1vbnRlcywKK25hc2NldHVyIHJpZGljdWx1cyBtdXMuIE1vcmJpIG1heGltdXMgcXVpcyBtYWduYSBldCBhbGlxdWV0LiBOYW0KK2JpYmVuZHVtIGZlcm1lbnR1bSB0ZW1wdXMuIFByYWVzZW50IGlhY3VsaXMgdG9ydG9yIG1ldHVzLCBhdAordmVzdGlidWx1bSBpcHN1bSBoZW5kcmVyaXQgbWF0dGlzLiBQcm9pbiBmcmluZ2lsbGEgbmlzbCBzaXQgYW1ldAordGluY2lkdW50IGJsYW5kaXQuIEludGVyZHVtIGV0IG1hbGVzdWFkYSBmYW1lcyBhYyBhbnRlIGlwc3VtIHByaW1pcyBpbgorZmF1Y2lidXMuIFBoYXNlbGx1cyB2ZWwgbGVjdHVzIGxlby4gQ3VyYWJpdHVyIGZyaW5naWxsYSwgYXJjdSBub24KK3Bvc3VlcmUgdml2ZXJyYSwgdXJuYSBtZXR1cyBibGFuZGl0IGF1Z3VlLCBjb252YWxsaXMgbWF0dGlzIHRvcnRvciBkdWkKK3ZlbCBhcmN1LiBJbiBzaXQgYW1ldCBtZXR1cyB2aXRhZSBleCByaG9uY3VzIGhlbmRyZXJpdC48L3A+CisKKzxwPkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nIGVsaXQuIFZpdmFtdXMKK2ludGVyZHVtIG1heGltdXMgZmluaWJ1cy4gVXQgZmVybWVudHVtIG1hbGVzdWFkYSBjb21tb2RvLiBTZWQKK2ZhdWNpYnVzLCBzYXBpZW4gYSBtYXR0aXMgbG9ib3J0aXMsIG1hZ25hIGFudGUgZWZmaWNpdHVyIG1hdXJpcywgcXVpcworc29kYWxlcyBuaWJoIGRpYW0gbmVjIHF1YW0uIFZlc3RpYnVsdW0gbWFnbmEgbGliZXJvLCB0aW5jaWR1bnQgbm9uCitlcmF0IHNlZCwgbW9sZXN0aWUgcHVsdmluYXIgZXguIE1hZWNlbmFzIHNlbXBlciBibGFuZGl0IGVsaXQsIGlkCitzdXNjaXBpdCBudWxsYSB2ZW5lbmF0aXMgcHJldGl1bS4gSW50ZWdlciBhY2N1bXNhbiBwb3J0YSBmZWxpcywgdml0YWUKK3BsYWNlcmF0IHVybmEgYWNjdW1zYW4gdmVsLiBBbGlxdWFtIGV1IGFsaXF1ZXQgbWkuIEFlbmVhbiB0aW5jaWR1bnQKK2Vyb3MgbGVjdHVzLCBzaXQgYW1ldCBlZmZpY2l0dXIgb3JjaSB1bHRyaWNlcyBhdC4gTW9yYmkgbG9ib3J0aXMgZXgKK3F1aXMgbHVjdHVzIHJ1dHJ1bS4gSW4gbnVsbGEgdmVsaXQsIGVsZW1lbnR1bSB2aXRhZSB0dXJwaXMgdml0YWUsCitmaW5pYnVzIHZhcml1cyBtYXNzYS4gTW9yYmkgaWQgbGliZXJvIGZhdWNpYnVzLCB0ZW1wdXMgZXJvcyBldCwKK3VsbGFtY29ycGVyIGlwc3VtLiBTZWQgZWxlaWZlbmQgZmluaWJ1cyBiaWJlbmR1bS4gTnVsbGFtIHV0IG51bmMgbmVjCitsYWN1cyBwb3N1ZXJlIGRpZ25pc3NpbS4gTnVuYyBzb2xsaWNpdHVkaW4gdml0YWUgYXVndWUgaWQKK3Z1bHB1dGF0ZS4gVXQgYWMgbmliaCBncmF2aWRhLCB2b2x1dHBhdCBlc3QgYWMsIGZhY2lsaXNpcyBuZXF1ZS48L3A+CisKKzxwPk5hbSBkaWN0dW0gbGVvIG1hc3NhLCBub24gcG9zdWVyZSBkdWkgYmliZW5kdW0gaWQuIE1vcmJpIHNhZ2l0dGlzIGVzdAorbm9uIGVzdCBsYW9yZWV0LCBhIHNvbGxpY2l0dWRpbiBmZWxpcyBhbGlxdWV0LiBVdCBjdXJzdXMgdmVsIGxlbyBhCitlZmZpY2l0dXIuIFByb2luIHV0IHBlbGxlbnRlc3F1ZSBzYXBpZW4sIHZlbCBtYXhpbXVzIGR1aS4gU3VzcGVuZGlzc2UKK2V1IGZlbGlzIGVnZXQgbGVvIGVsZW1lbnR1bSBlZmZpY2l0dXIuIENsYXNzIGFwdGVudCB0YWNpdGkgc29jaW9zcXUgYWQKK2xpdG9yYSB0b3JxdWVudCBwZXIgY29udWJpYSBub3N0cmEsIHBlciBpbmNlcHRvcyBoaW1lbmFlb3MuIEZ1c2NlCitsb2JvcnRpcyB2ZWxpdCBpbiBlbGl0IHBlbGxlbnRlc3F1ZSwgdXQgYXVjdG9yIGlwc3VtIGRpZ25pc3NpbS4gU2VkCithbGlxdWV0IGVsZWlmZW5kIGNvbnZhbGxpcy4gRHVpcyBtb2xsaXMsIGRvbG9yIHNlZCBydXRydW0gbW9sbGlzLAorYXVndWUgZXJvcyBkaWduaXNzaW0gZXJhdCwgZXUgZGFwaWJ1cyBhdWd1ZSB0dXJwaXMgYWMgc2FwaWVuLiBNb3JiaSBhdAordm9sdXRwYXQgb2RpbywgYXQgbW9sZXN0aWUgcmlzdXMuIE51bGxhIHF1aXMgbnVsbGEgZXQgbWFnbmEgdmVzdGlidWx1bQorZXVpc21vZC4gUHJhZXNlbnQgc3VzY2lwaXQgcXVhbSBlbGl0LCBub24gbHVjdHVzIHR1cnBpcyBydXRydW0KK2ZhdWNpYnVzLjwvcD4KKworPHA+TW9yYmkgZmV1Z2lhdCBsYWN1cyByaG9uY3VzLCBkaWduaXNzaW0gdmVsaXQgbmVjLCBkaWduaXNzaW0KK2xvcmVtLiBBbGlxdWFtIGVyYXQgdm9sdXRwYXQuIE1hdXJpcyBzZW1wZXIgZGljdHVtIHRlbXB1cy4gTnVsbGEgZXgKK2xpZ3VsYSwgbWFsZXN1YWRhIGluIG9ybmFyZSBzZWQsIGV1aXNtb2Qgdml0YWUgbWFzc2EuIEV0aWFtIHF1aXMgZXJhdAorcXVpcyBuaXNsIGZhY2lsaXNpcyBzdXNjaXBpdC4gTWF1cmlzIHBsYWNlcmF0IGFudGUgZXQgYXVjdG9yCitmZXJtZW50dW0uIERvbmVjIHRpbmNpZHVudCBqdXN0byBzZW0sIHVsbGFtY29ycGVyIHZ1bHB1dGF0ZSBuaXNsCitjb21tb2RvIGEuIFZlc3RpYnVsdW0gcXVpcyBleCBub24gZWxpdCBwb3J0dGl0b3Igc2VtcGVyIGVnZXQgcXVpcwordG9ydG9yLiBTdXNwZW5kaXNzZSBtYXR0aXMgbmVxdWUgbm9uIGVsZW1lbnR1bSBzY2VsZXJpc3F1ZS4gTnVsbGEKK2ZhY2lsaXNpLiBOdWxsYSBub24gZmVsaXMgZXQganVzdG8gZmV1Z2lhdCBlbGVtZW50dW0uIEFlbmVhbiBzb2RhbGVzCit0dXJwaXMgYXQgZXJhdCBlbGVpZmVuZCBsYWNpbmlhLiBQcm9pbiBlbGVpZmVuZCB2b2x1dHBhdCBwdXJ1cyBpZAorbW9sbGlzLiBQcm9pbiB2ZWwgdGVsbHVzIGZhdWNpYnVzLCBzYWdpdHRpcyBsaWJlcm8gYXQsIGxvYm9ydGlzCitvZGlvLiBQcmFlc2VudCBxdWFtIG1hdXJpcywgYXVjdG9yIHZlbCB2ZWxpdCBldSwgY29udmFsbGlzIG1vbGVzdGllCituaXNpLiBQZWxsZW50ZXNxdWUgaW4gbnVuYyBhdCBvcmNpIHVsdHJpY2VzIHZlaGljdWxhLjwvcD4KKworPHA+UHJhZXNlbnQgbmliaCBsZWN0dXMsIGVmZmljaXR1ciBzZWQgcmlzdXMgaW4sIHJ1dHJ1bSB0cmlzdGlxdWUKK2FyY3UuIEN1cmFiaXR1ciBub24gZWZmaWNpdHVyIGVsaXQuIFBoYXNlbGx1cyBlZ2V0IG9kaW8gaWFjdWxpcywKK21vbGVzdGllIGR1aSBlZ2V0LCB2ZW5lbmF0aXMgZXJhdC4gTnVsbGEgbHVjdHVzIGZhY2lsaXNpcyBsZWN0dXMsIG5lYworZGFwaWJ1cyB0b3J0b3IgcmhvbmN1cyB2ZWwuIERvbmVjIG5lYyBhcmN1IGVsaXQuIE51bGxhbSB1dCBmYXVjaWJ1cworcHVydXMsIHNlZCB1bHRyaWNpZXMgZGlhbS4gUGVsbGVudGVzcXVlIGF0IGZpbmlidXMgaXBzdW0uIFZlc3RpYnVsdW0KK2VnZXN0YXMgZGlnbmlzc2ltIG5pc2wsIGFjIHJob25jdXMgcmlzdXMgZmluaWJ1cyBzaXQgYW1ldC4gRG9uZWMgbm9uCitmZXVnaWF0IGFudGUuIERvbmVjIHZlaGljdWxhIGR1aSBhIGxvcmVtIGltcGVyZGlldCwgYSB0ZW1wdXMgZGlhbQorcHVsdmluYXIuIE51bGxhbSBjb25ndWUgZWZmaWNpdHVyIGp1c3RvLCBub24gcG9zdWVyZSBsaWd1bGEgc29kYWxlcworaW4uIFV0IGEgdXJuYSBvcm5hcmUsIHVsdHJpY2VzIHZlbGl0IGluLCBwZWxsZW50ZXNxdWUKK2xvcmVtLiBWZXN0aWJ1bHVtIGFudGUgaXBzdW0gcHJpbWlzIGluIGZhdWNpYnVzIG9yY2kgbHVjdHVzIGV0Cit1bHRyaWNlcyBwb3N1ZXJlIGN1YmlsaWEgQ3VyYWU7PC9wPgorCis8cD5PcmNpIHZhcml1cyBuYXRvcXVlIHBlbmF0aWJ1cyBldCBtYWduaXMgZGlzIHBhcnR1cmllbnQgbW9udGVzLAorbmFzY2V0dXIgcmlkaWN1bHVzIG11cy4gTW9yYmkgbWF4aW11cyBxdWlzIG1hZ25hIGV0IGFsaXF1ZXQuIE5hbQorYmliZW5kdW0gZmVybWVudHVtIHRlbXB1cy4gUHJhZXNlbnQgaWFjdWxpcyB0b3J0b3IgbWV0dXMsIGF0Cit2ZXN0aWJ1bHVtIGlwc3VtIGhlbmRyZXJpdCBtYXR0aXMuIFByb2luIGZyaW5naWxsYSBuaXNsIHNpdCBhbWV0Cit0aW5jaWR1bnQgYmxhbmRpdC4gSW50ZXJkdW0gZXQgbWFsZXN1YWRhIGZhbWVzIGFjIGFudGUgaXBzdW0gcHJpbWlzIGluCitmYXVjaWJ1cy4gUGhhc2VsbHVzIHZlbCBsZWN0dXMgbGVvLiBDdXJhYml0dXIgZnJpbmdpbGxhLCBhcmN1IG5vbgorcG9zdWVyZSB2aXZlcnJhLCB1cm5hIG1ldHVzIGJsYW5kaXQgYXVndWUsIGNvbnZhbGxpcyBtYXR0aXMgdG9ydG9yIGR1aQordmVsIGFyY3UuIEluIHNpdCBhbWV0IG1ldHVzIHZpdGFlIGV4IHJob25jdXMgaGVuZHJlcml0LjwvcD4KKworPHA+TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gVml2YW11cworaW50ZXJkdW0gbWF4aW11cyBmaW5pYnVzLiBVdCBmZXJtZW50dW0gbWFsZXN1YWRhIGNvbW1vZG8uIFNlZAorZmF1Y2lidXMsIHNhcGllbiBhIG1hdHRpcyBsb2JvcnRpcywgbWFnbmEgYW50ZSBlZmZpY2l0dXIgbWF1cmlzLCBxdWlzCitzb2RhbGVzIG5pYmggZGlhbSBuZWMgcXVhbS4gVmVzdGlidWx1bSBtYWduYSBsaWJlcm8sIHRpbmNpZHVudCBub24KK2VyYXQgc2VkLCBtb2xlc3RpZSBwdWx2aW5hciBleC4gTWFlY2VuYXMgc2VtcGVyIGJsYW5kaXQgZWxpdCwgaWQKK3N1c2NpcGl0IG51bGxhIHZlbmVuYXRpcyBwcmV0aXVtLiBJbnRlZ2VyIGFjY3Vtc2FuIHBvcnRhIGZlbGlzLCB2aXRhZQorcGxhY2VyYXQgdXJuYSBhY2N1bXNhbiB2ZWwuIEFsaXF1YW0gZXUgYWxpcXVldCBtaS4gQWVuZWFuIHRpbmNpZHVudAorZXJvcyBsZWN0dXMsIHNpdCBhbWV0IGVmZmljaXR1ciBvcmNpIHVsdHJpY2VzIGF0LiBNb3JiaSBsb2JvcnRpcyBleAorcXVpcyBsdWN0dXMgcnV0cnVtLiBJbiBudWxsYSB2ZWxpdCwgZWxlbWVudHVtIHZpdGFlIHR1cnBpcyB2aXRhZSwKK2ZpbmlidXMgdmFyaXVzIG1hc3NhLiBNb3JiaSBpZCBsaWJlcm8gZmF1Y2lidXMsIHRlbXB1cyBlcm9zIGV0LAordWxsYW1jb3JwZXIgaXBzdW0uIFNlZCBlbGVpZmVuZCBmaW5pYnVzIGJpYmVuZHVtLiBOdWxsYW0gdXQgbnVuYyBuZWMKK2xhY3VzIHBvc3VlcmUgZGlnbmlzc2ltLiBOdW5jIHNvbGxpY2l0dWRpbiB2aXRhZSBhdWd1ZSBpZAordnVscHV0YXRlLiBVdCBhYyBuaWJoIGdyYXZpZGEsIHZvbHV0cGF0IGVzdCBhYywgZmFjaWxpc2lzIG5lcXVlLjwvcD4KKworPHA+TmFtIGRpY3R1bSBsZW8gbWFzc2EsIG5vbiBwb3N1ZXJlIGR1aSBiaWJlbmR1bSBpZC4gTW9yYmkgc2FnaXR0aXMgZXN0Citub24gZXN0IGxhb3JlZXQsIGEgc29sbGljaXR1ZGluIGZlbGlzIGFsaXF1ZXQuIFV0IGN1cnN1cyB2ZWwgbGVvIGEKK2VmZmljaXR1ci4gUHJvaW4gdXQgcGVsbGVudGVzcXVlIHNhcGllbiwgdmVsIG1heGltdXMgZHVpLiBTdXNwZW5kaXNzZQorZXUgZmVsaXMgZWdldCBsZW8gZWxlbWVudHVtIGVmZmljaXR1ci4gQ2xhc3MgYXB0ZW50IHRhY2l0aSBzb2Npb3NxdSBhZAorbGl0b3JhIHRvcnF1ZW50IHBlciBjb251YmlhIG5vc3RyYSwgcGVyIGluY2VwdG9zIGhpbWVuYWVvcy4gRnVzY2UKK2xvYm9ydGlzIHZlbGl0IGluIGVsaXQgcGVsbGVudGVzcXVlLCB1dCBhdWN0b3IgaXBzdW0gZGlnbmlzc2ltLiBTZWQKK2FsaXF1ZXQgZWxlaWZlbmQgY29udmFsbGlzLiBEdWlzIG1vbGxpcywgZG9sb3Igc2VkIHJ1dHJ1bSBtb2xsaXMsCithdWd1ZSBlcm9zIGRpZ25pc3NpbSBlcmF0LCBldSBkYXBpYnVzIGF1Z3VlIHR1cnBpcyBhYyBzYXBpZW4uIE1vcmJpIGF0Cit2b2x1dHBhdCBvZGlvLCBhdCBtb2xlc3RpZSByaXN1cy4gTnVsbGEgcXVpcyBudWxsYSBldCBtYWduYSB2ZXN0aWJ1bHVtCitldWlzbW9kLiBQcmFlc2VudCBzdXNjaXBpdCBxdWFtIGVsaXQsIG5vbiBsdWN0dXMgdHVycGlzIHJ1dHJ1bQorZmF1Y2lidXMuPC9wPgorCis8cD5Nb3JiaSBmZXVnaWF0IGxhY3VzIHJob25jdXMsIGRpZ25pc3NpbSB2ZWxpdCBuZWMsIGRpZ25pc3NpbQorbG9yZW0uIEFsaXF1YW0gZXJhdCB2b2x1dHBhdC4gTWF1cmlzIHNlbXBlciBkaWN0dW0gdGVtcHVzLiBOdWxsYSBleAorbGlndWxhLCBtYWxlc3VhZGEgaW4gb3JuYXJlIHNlZCwgZXVpc21vZCB2aXRhZSBtYXNzYS4gRXRpYW0gcXVpcyBlcmF0CitxdWlzIG5pc2wgZmFjaWxpc2lzIHN1c2NpcGl0LiBNYXVyaXMgcGxhY2VyYXQgYW50ZSBldCBhdWN0b3IKK2Zlcm1lbnR1bS4gRG9uZWMgdGluY2lkdW50IGp1c3RvIHNlbSwgdWxsYW1jb3JwZXIgdnVscHV0YXRlIG5pc2wKK2NvbW1vZG8gYS4gVmVzdGlidWx1bSBxdWlzIGV4IG5vbiBlbGl0IHBvcnR0aXRvciBzZW1wZXIgZWdldCBxdWlzCit0b3J0b3IuIFN1c3BlbmRpc3NlIG1hdHRpcyBuZXF1ZSBub24gZWxlbWVudHVtIHNjZWxlcmlzcXVlLiBOdWxsYQorZmFjaWxpc2kuIE51bGxhIG5vbiBmZWxpcyBldCBqdXN0byBmZXVnaWF0IGVsZW1lbnR1bS4gQWVuZWFuIHNvZGFsZXMKK3R1cnBpcyBhdCBlcmF0IGVsZWlmZW5kIGxhY2luaWEuIFByb2luIGVsZWlmZW5kIHZvbHV0cGF0IHB1cnVzIGlkCittb2xsaXMuIFByb2luIHZlbCB0ZWxsdXMgZmF1Y2lidXMsIHNhZ2l0dGlzIGxpYmVybyBhdCwgbG9ib3J0aXMKK29kaW8uIFByYWVzZW50IHF1YW0gbWF1cmlzLCBhdWN0b3IgdmVsIHZlbGl0IGV1LCBjb252YWxsaXMgbW9sZXN0aWUKK25pc2kuIFBlbGxlbnRlc3F1ZSBpbiBudW5jIGF0IG9yY2kgdWx0cmljZXMgdmVoaWN1bGEuPC9wPgorCis8cD5QcmFlc2VudCBuaWJoIGxlY3R1cywgZWZmaWNpdHVyIHNlZCByaXN1cyBpbiwgcnV0cnVtIHRyaXN0aXF1ZQorYXJjdS4gQ3VyYWJpdHVyIG5vbiBlZmZpY2l0dXIgZWxpdC4gUGhhc2VsbHVzIGVnZXQgb2RpbyBpYWN1bGlzLAorbW9sZXN0aWUgZHVpIGVnZXQsIHZlbmVuYXRpcyBlcmF0LiBOdWxsYSBsdWN0dXMgZmFjaWxpc2lzIGxlY3R1cywgbmVjCitkYXBpYnVzIHRvcnRvciByaG9uY3VzIHZlbC4gRG9uZWMgbmVjIGFyY3UgZWxpdC4gTnVsbGFtIHV0IGZhdWNpYnVzCitwdXJ1cywgc2VkIHVsdHJpY2llcyBkaWFtLiBQZWxsZW50ZXNxdWUgYXQgZmluaWJ1cyBpcHN1bS4gVmVzdGlidWx1bQorZWdlc3RhcyBkaWduaXNzaW0gbmlzbCwgYWMgcmhvbmN1cyByaXN1cyBmaW5pYnVzIHNpdCBhbWV0LiBEb25lYyBub24KK2ZldWdpYXQgYW50ZS4gRG9uZWMgdmVoaWN1bGEgZHVpIGEgbG9yZW0gaW1wZXJkaWV0LCBhIHRlbXB1cyBkaWFtCitwdWx2aW5hci4gTnVsbGFtIGNvbmd1ZSBlZmZpY2l0dXIganVzdG8sIG5vbiBwb3N1ZXJlIGxpZ3VsYSBzb2RhbGVzCitpbi4gVXQgYSB1cm5hIG9ybmFyZSwgdWx0cmljZXMgdmVsaXQgaW4sIHBlbGxlbnRlc3F1ZQorbG9yZW0uIFZlc3RpYnVsdW0gYW50ZSBpcHN1bSBwcmltaXMgaW4gZmF1Y2lidXMgb3JjaSBsdWN0dXMgZXQKK3VsdHJpY2VzIHBvc3VlcmUgY3ViaWxpYSBDdXJhZTs8L3A+CisKKzxwPk9yY2kgdmFyaXVzIG5hdG9xdWUgcGVuYXRpYnVzIGV0IG1hZ25pcyBkaXMgcGFydHVyaWVudCBtb250ZXMsCituYXNjZXR1ciByaWRpY3VsdXMgbXVzLiBNb3JiaSBtYXhpbXVzIHF1aXMgbWFnbmEgZXQgYWxpcXVldC4gTmFtCitiaWJlbmR1bSBmZXJtZW50dW0gdGVtcHVzLiBQcmFlc2VudCBpYWN1bGlzIHRvcnRvciBtZXR1cywgYXQKK3Zlc3RpYnVsdW0gaXBzdW0gaGVuZHJlcml0IG1hdHRpcy4gUHJvaW4gZnJpbmdpbGxhIG5pc2wgc2l0IGFtZXQKK3RpbmNpZHVudCBibGFuZGl0LiBJbnRlcmR1bSBldCBtYWxlc3VhZGEgZmFtZXMgYWMgYW50ZSBpcHN1bSBwcmltaXMgaW4KK2ZhdWNpYnVzLiBQaGFzZWxsdXMgdmVsIGxlY3R1cyBsZW8uIEN1cmFiaXR1ciBmcmluZ2lsbGEsIGFyY3Ugbm9uCitwb3N1ZXJlIHZpdmVycmEsIHVybmEgbWV0dXMgYmxhbmRpdCBhdWd1ZSwgY29udmFsbGlzIG1hdHRpcyB0b3J0b3IgZHVpCit2ZWwgYXJjdS4gSW4gc2l0IGFtZXQgbWV0dXMgdml0YWUgZXggcmhvbmN1cyBoZW5kcmVyaXQuPC9wPgorCis8cD5Mb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LiBWaXZhbXVzCitpbnRlcmR1bSBtYXhpbXVzIGZpbmlidXMuIFV0IGZlcm1lbnR1bSBtYWxlc3VhZGEgY29tbW9kby4gU2VkCitmYXVjaWJ1cywgc2FwaWVuIGEgbWF0dGlzIGxvYm9ydGlzLCBtYWduYSBhbnRlIGVmZmljaXR1ciBtYXVyaXMsIHF1aXMKK3NvZGFsZXMgbmliaCBkaWFtIG5lYyBxdWFtLiBWZXN0aWJ1bHVtIG1hZ25hIGxpYmVybywgdGluY2lkdW50IG5vbgorZXJhdCBzZWQsIG1vbGVzdGllIHB1bHZpbmFyIGV4LiBNYWVjZW5hcyBzZW1wZXIgYmxhbmRpdCBlbGl0LCBpZAorc3VzY2lwaXQgbnVsbGEgdmVuZW5hdGlzIHByZXRpdW0uIEludGVnZXIgYWNjdW1zYW4gcG9ydGEgZmVsaXMsIHZpdGFlCitwbGFjZXJhdCB1cm5hIGFjY3Vtc2FuIHZlbC4gQWxpcXVhbSBldSBhbGlxdWV0IG1pLiBBZW5lYW4gdGluY2lkdW50Citlcm9zIGxlY3R1cywgc2l0IGFtZXQgZWZmaWNpdHVyIG9yY2kgdWx0cmljZXMgYXQuIE1vcmJpIGxvYm9ydGlzIGV4CitxdWlzIGx1Y3R1cyBydXRydW0uIEluIG51bGxhIHZlbGl0LCBlbGVtZW50dW0gdml0YWUgdHVycGlzIHZpdGFlLAorZmluaWJ1cyB2YXJpdXMgbWFzc2EuIE1vcmJpIGlkIGxpYmVybyBmYXVjaWJ1cywgdGVtcHVzIGVyb3MgZXQsCit1bGxhbWNvcnBlciBpcHN1bS4gU2VkIGVsZWlmZW5kIGZpbmlidXMgYmliZW5kdW0uIE51bGxhbSB1dCBudW5jIG5lYworbGFjdXMgcG9zdWVyZSBkaWduaXNzaW0uIE51bmMgc29sbGljaXR1ZGluIHZpdGFlIGF1Z3VlIGlkCit2dWxwdXRhdGUuIFV0IGFjIG5pYmggZ3JhdmlkYSwgdm9sdXRwYXQgZXN0IGFjLCBmYWNpbGlzaXMgbmVxdWUuPC9wPgorCis8cD5OYW0gZGljdHVtIGxlbyBtYXNzYSwgbm9uIHBvc3VlcmUgZHVpIGJpYmVuZHVtIGlkLiBNb3JiaSBzYWdpdHRpcyBlc3QKK25vbiBlc3QgbGFvcmVldCwgYSBzb2xsaWNpdHVkaW4gZmVsaXMgYWxpcXVldC4gVXQgY3Vyc3VzIHZlbCBsZW8gYQorZWZmaWNpdHVyLiBQcm9pbiB1dCBwZWxsZW50ZXNxdWUgc2FwaWVuLCB2ZWwgbWF4aW11cyBkdWkuIFN1c3BlbmRpc3NlCitldSBmZWxpcyBlZ2V0IGxlbyBlbGVtZW50dW0gZWZmaWNpdHVyLiBDbGFzcyBhcHRlbnQgdGFjaXRpIHNvY2lvc3F1IGFkCitsaXRvcmEgdG9ycXVlbnQgcGVyIGNvbnViaWEgbm9zdHJhLCBwZXIgaW5jZXB0b3MgaGltZW5hZW9zLiBGdXNjZQorbG9ib3J0aXMgdmVsaXQgaW4gZWxpdCBwZWxsZW50ZXNxdWUsIHV0IGF1Y3RvciBpcHN1bSBkaWduaXNzaW0uIFNlZAorYWxpcXVldCBlbGVpZmVuZCBjb252YWxsaXMuIER1aXMgbW9sbGlzLCBkb2xvciBzZWQgcnV0cnVtIG1vbGxpcywKK2F1Z3VlIGVyb3MgZGlnbmlzc2ltIGVyYXQsIGV1IGRhcGlidXMgYXVndWUgdHVycGlzIGFjIHNhcGllbi4gTW9yYmkgYXQKK3ZvbHV0cGF0IG9kaW8sIGF0IG1vbGVzdGllIHJpc3VzLiBOdWxsYSBxdWlzIG51bGxhIGV0IG1hZ25hIHZlc3RpYnVsdW0KK2V1aXNtb2QuIFByYWVzZW50IHN1c2NpcGl0IHF1YW0gZWxpdCwgbm9uIGx1Y3R1cyB0dXJwaXMgcnV0cnVtCitmYXVjaWJ1cy48L3A+CisKKzxwPk1vcmJpIGZldWdpYXQgbGFjdXMgcmhvbmN1cywgZGlnbmlzc2ltIHZlbGl0IG5lYywgZGlnbmlzc2ltCitsb3JlbS4gQWxpcXVhbSBlcmF0IHZvbHV0cGF0LiBNYXVyaXMgc2VtcGVyIGRpY3R1bSB0ZW1wdXMuIE51bGxhIGV4CitsaWd1bGEsIG1hbGVzdWFkYSBpbiBvcm5hcmUgc2VkLCBldWlzbW9kIHZpdGFlIG1hc3NhLiBFdGlhbSBxdWlzIGVyYXQKK3F1aXMgbmlzbCBmYWNpbGlzaXMgc3VzY2lwaXQuIE1hdXJpcyBwbGFjZXJhdCBhbnRlIGV0IGF1Y3RvcgorZmVybWVudHVtLiBEb25lYyB0aW5jaWR1bnQganVzdG8gc2VtLCB1bGxhbWNvcnBlciB2dWxwdXRhdGUgbmlzbAorY29tbW9kbyBhLiBWZXN0aWJ1bHVtIHF1aXMgZXggbm9uIGVsaXQgcG9ydHRpdG9yIHNlbXBlciBlZ2V0IHF1aXMKK3RvcnRvci4gU3VzcGVuZGlzc2UgbWF0dGlzIG5lcXVlIG5vbiBlbGVtZW50dW0gc2NlbGVyaXNxdWUuIE51bGxhCitmYWNpbGlzaS4gTnVsbGEgbm9uIGZlbGlzIGV0IGp1c3RvIGZldWdpYXQgZWxlbWVudHVtLiBBZW5lYW4gc29kYWxlcwordHVycGlzIGF0IGVyYXQgZWxlaWZlbmQgbGFjaW5pYS4gUHJvaW4gZWxlaWZlbmQgdm9sdXRwYXQgcHVydXMgaWQKK21vbGxpcy4gUHJvaW4gdmVsIHRlbGx1cyBmYXVjaWJ1cywgc2FnaXR0aXMgbGliZXJvIGF0LCBsb2JvcnRpcworb2Rpby4gUHJhZXNlbnQgcXVhbSBtYXVyaXMsIGF1Y3RvciB2ZWwgdmVsaXQgZXUsIGNvbnZhbGxpcyBtb2xlc3RpZQorbmlzaS4gUGVsbGVudGVzcXVlIGluIG51bmMgYXQgb3JjaSB1bHRyaWNlcyB2ZWhpY3VsYS48L3A+CisKKzxwPlByYWVzZW50IG5pYmggbGVjdHVzLCBlZmZpY2l0dXIgc2VkIHJpc3VzIGluLCBydXRydW0gdHJpc3RpcXVlCithcmN1LiBDdXJhYml0dXIgbm9uIGVmZmljaXR1ciBlbGl0LiBQaGFzZWxsdXMgZWdldCBvZGlvIGlhY3VsaXMsCittb2xlc3RpZSBkdWkgZWdldCwgdmVuZW5hdGlzIGVyYXQuIE51bGxhIGx1Y3R1cyBmYWNpbGlzaXMgbGVjdHVzLCBuZWMKK2RhcGlidXMgdG9ydG9yIHJob25jdXMgdmVsLiBEb25lYyBuZWMgYXJjdSBlbGl0LiBOdWxsYW0gdXQgZmF1Y2lidXMKK3B1cnVzLCBzZWQgdWx0cmljaWVzIGRpYW0uIFBlbGxlbnRlc3F1ZSBhdCBmaW5pYnVzIGlwc3VtLiBWZXN0aWJ1bHVtCitlZ2VzdGFzIGRpZ25pc3NpbSBuaXNsLCBhYyByaG9uY3VzIHJpc3VzIGZpbmlidXMgc2l0IGFtZXQuIERvbmVjIG5vbgorZmV1Z2lhdCBhbnRlLiBEb25lYyB2ZWhpY3VsYSBkdWkgYSBsb3JlbSBpbXBlcmRpZXQsIGEgdGVtcHVzIGRpYW0KK3B1bHZpbmFyLiBOdWxsYW0gY29uZ3VlIGVmZmljaXR1ciBqdXN0bywgbm9uIHBvc3VlcmUgbGlndWxhIHNvZGFsZXMKK2luLiBVdCBhIHVybmEgb3JuYXJlLCB1bHRyaWNlcyB2ZWxpdCBpbiwgcGVsbGVudGVzcXVlCitsb3JlbS4gVmVzdGlidWx1bSBhbnRlIGlwc3VtIHByaW1pcyBpbiBmYXVjaWJ1cyBvcmNpIGx1Y3R1cyBldAordWx0cmljZXMgcG9zdWVyZSBjdWJpbGlhIEN1cmFlOzwvcD4KKworPHA+T3JjaSB2YXJpdXMgbmF0b3F1ZSBwZW5hdGlidXMgZXQgbWFnbmlzIGRpcyBwYXJ0dXJpZW50IG1vbnRlcywKK25hc2NldHVyIHJpZGljdWx1cyBtdXMuIE1vcmJpIG1heGltdXMgcXVpcyBtYWduYSBldCBhbGlxdWV0LiBOYW0KK2JpYmVuZHVtIGZlcm1lbnR1bSB0ZW1wdXMuIFByYWVzZW50IGlhY3VsaXMgdG9ydG9yIG1ldHVzLCBhdAordmVzdGlidWx1bSBpcHN1bSBoZW5kcmVyaXQgbWF0dGlzLiBQcm9pbiBmcmluZ2lsbGEgbmlzbCBzaXQgYW1ldAordGluY2lkdW50IGJsYW5kaXQuIEludGVyZHVtIGV0IG1hbGVzdWFkYSBmYW1lcyBhYyBhbnRlIGlwc3VtIHByaW1pcyBpbgorZmF1Y2lidXMuIFBoYXNlbGx1cyB2ZWwgbGVjdHVzIGxlby4gQ3VyYWJpdHVyIGZyaW5naWxsYSwgYXJjdSBub24KK3Bvc3VlcmUgdml2ZXJyYSwgdXJuYSBtZXR1cyBibGFuZGl0IGF1Z3VlLCBjb252YWxsaXMgbWF0dGlzIHRvcnRvciBkdWkKK3ZlbCBhcmN1LiBJbiBzaXQgYW1ldCBtZXR1cyB2aXRhZSBleCByaG9uY3VzIGhlbmRyZXJpdC48L3A+CisKKzxwPkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nIGVsaXQuIFZpdmFtdXMKK2ludGVyZHVtIG1heGltdXMgZmluaWJ1cy4gVXQgZmVybWVudHVtIG1hbGVzdWFkYSBjb21tb2RvLiBTZWQKK2ZhdWNpYnVzLCBzYXBpZW4gYSBtYXR0aXMgbG9ib3J0aXMsIG1hZ25hIGFudGUgZWZmaWNpdHVyIG1hdXJpcywgcXVpcworc29kYWxlcyBuaWJoIGRpYW0gbmVjIHF1YW0uIFZlc3RpYnVsdW0gbWFnbmEgbGliZXJvLCB0aW5jaWR1bnQgbm9uCitlcmF0IHNlZCwgbW9sZXN0aWUgcHVsdmluYXIgZXguIE1hZWNlbmFzIHNlbXBlciBibGFuZGl0IGVsaXQsIGlkCitzdXNjaXBpdCBudWxsYSB2ZW5lbmF0aXMgcHJldGl1bS4gSW50ZWdlciBhY2N1bXNhbiBwb3J0YSBmZWxpcywgdml0YWUKK3BsYWNlcmF0IHVybmEgYWNjdW1zYW4gdmVsLiBBbGlxdWFtIGV1IGFsaXF1ZXQgbWkuIEFlbmVhbiB0aW5jaWR1bnQKK2Vyb3MgbGVjdHVzLCBzaXQgYW1ldCBlZmZpY2l0dXIgb3JjaSB1bHRyaWNlcyBhdC4gTW9yYmkgbG9ib3J0aXMgZXgKK3F1aXMgbHVjdHVzIHJ1dHJ1bS4gSW4gbnVsbGEgdmVsaXQsIGVsZW1lbnR1bSB2aXRhZSB0dXJwaXMgdml0YWUsCitmaW5pYnVzIHZhcml1cyBtYXNzYS4gTW9yYmkgaWQgbGliZXJvIGZhdWNpYnVzLCB0ZW1wdXMgZXJvcyBldCwKK3VsbGFtY29ycGVyIGlwc3VtLiBTZWQgZWxlaWZlbmQgZmluaWJ1cyBiaWJlbmR1bS4gTnVsbGFtIHV0IG51bmMgbmVjCitsYWN1cyBwb3N1ZXJlIGRpZ25pc3NpbS4gTnVuYyBzb2xsaWNpdHVkaW4gdml0YWUgYXVndWUgaWQKK3Z1bHB1dGF0ZS4gVXQgYWMgbmliaCBncmF2aWRhLCB2b2x1dHBhdCBlc3QgYWMsIGZhY2lsaXNpcyBuZXF1ZS48L3A+CisKKzxwPk5hbSBkaWN0dW0gbGVvIG1hc3NhLCBub24gcG9zdWVyZSBkdWkgYmliZW5kdW0gaWQuIE1vcmJpIHNhZ2l0dGlzIGVzdAorbm9uIGVzdCBsYW9yZWV0LCBhIHNvbGxpY2l0dWRpbiBmZWxpcyBhbGlxdWV0LiBVdCBjdXJzdXMgdmVsIGxlbyBhCitlZmZpY2l0dXIuIFByb2luIHV0IHBlbGxlbnRlc3F1ZSBzYXBpZW4sIHZlbCBtYXhpbXVzIGR1aS4gU3VzcGVuZGlzc2UKK2V1IGZlbGlzIGVnZXQgbGVvIGVsZW1lbnR1bSBlZmZpY2l0dXIuIENsYXNzIGFwdGVudCB0YWNpdGkgc29jaW9zcXUgYWQKK2xpdG9yYSB0b3JxdWVudCBwZXIgY29udWJpYSBub3N0cmEsIHBlciBpbmNlcHRvcyBoaW1lbmFlb3MuIEZ1c2NlCitsb2JvcnRpcyB2ZWxpdCBpbiBlbGl0IHBlbGxlbnRlc3F1ZSwgdXQgYXVjdG9yIGlwc3VtIGRpZ25pc3NpbS4gU2VkCithbGlxdWV0IGVsZWlmZW5kIGNvbnZhbGxpcy4gRHVpcyBtb2xsaXMsIGRvbG9yIHNlZCBydXRydW0gbW9sbGlzLAorYXVndWUgZXJvcyBkaWduaXNzaW0gZXJhdCwgZXUgZGFwaWJ1cyBhdWd1ZSB0dXJwaXMgYWMgc2FwaWVuLiBNb3JiaSBhdAordm9sdXRwYXQgb2RpbywgYXQgbW9sZXN0aWUgcmlzdXMuIE51bGxhIHF1aXMgbnVsbGEgZXQgbWFnbmEgdmVzdGlidWx1bQorZXVpc21vZC4gUHJhZXNlbnQgc3VzY2lwaXQgcXVhbSBlbGl0LCBub24gbHVjdHVzIHR1cnBpcyBydXRydW0KK2ZhdWNpYnVzLjwvcD4KKworPHA+TW9yYmkgZmV1Z2lhdCBsYWN1cyByaG9uY3VzLCBkaWduaXNzaW0gdmVsaXQgbmVjLCBkaWduaXNzaW0KK2xvcmVtLiBBbGlxdWFtIGVyYXQgdm9sdXRwYXQuIE1hdXJpcyBzZW1wZXIgZGljdHVtIHRlbXB1cy4gTnVsbGEgZXgKK2xpZ3VsYSwgbWFsZXN1YWRhIGluIG9ybmFyZSBzZWQsIGV1aXNtb2Qgdml0YWUgbWFzc2EuIEV0aWFtIHF1aXMgZXJhdAorcXVpcyBuaXNsIGZhY2lsaXNpcyBzdXNjaXBpdC4gTWF1cmlzIHBsYWNlcmF0IGFudGUgZXQgYXVjdG9yCitmZXJtZW50dW0uIERvbmVjIHRpbmNpZHVudCBqdXN0byBzZW0sIHVsbGFtY29ycGVyIHZ1bHB1dGF0ZSBuaXNsCitjb21tb2RvIGEuIFZlc3RpYnVsdW0gcXVpcyBleCBub24gZWxpdCBwb3J0dGl0b3Igc2VtcGVyIGVnZXQgcXVpcwordG9ydG9yLiBTdXNwZW5kaXNzZSBtYXR0aXMgbmVxdWUgbm9uIGVsZW1lbnR1bSBzY2VsZXJpc3F1ZS4gTnVsbGEKK2ZhY2lsaXNpLiBOdWxsYSBub24gZmVsaXMgZXQganVzdG8gZmV1Z2lhdCBlbGVtZW50dW0uIEFlbmVhbiBzb2RhbGVzCit0dXJwaXMgYXQgZXJhdCBlbGVpZmVuZCBsYWNpbmlhLiBQcm9pbiBlbGVpZmVuZCB2b2x1dHBhdCBwdXJ1cyBpZAorbW9sbGlzLiBQcm9pbiB2ZWwgdGVsbHVzIGZhdWNpYnVzLCBzYWdpdHRpcyBsaWJlcm8gYXQsIGxvYm9ydGlzCitvZGlvLiBQcmFlc2VudCBxdWFtIG1hdXJpcywgYXVjdG9yIHZlbCB2ZWxpdCBldSwgY29udmFsbGlzIG1vbGVzdGllCituaXNpLiBQZWxsZW50ZXNxdWUgaW4gbnVuYyBhdCBvcmNpIHVsdHJpY2VzIHZlaGljdWxhLjwvcD4KKworPHA+UHJhZXNlbnQgbmliaCBsZWN0dXMsIGVmZmljaXR1ciBzZWQgcmlzdXMgaW4sIHJ1dHJ1bSB0cmlzdGlxdWUKK2FyY3UuIEN1cmFiaXR1ciBub24gZWZmaWNpdHVyIGVsaXQuIFBoYXNlbGx1cyBlZ2V0IG9kaW8gaWFjdWxpcywKK21vbGVzdGllIGR1aSBlZ2V0LCB2ZW5lbmF0aXMgZXJhdC4gTnVsbGEgbHVjdHVzIGZhY2lsaXNpcyBsZWN0dXMsIG5lYworZGFwaWJ1cyB0b3J0b3IgcmhvbmN1cyB2ZWwuIERvbmVjIG5lYyBhcmN1IGVsaXQuIE51bGxhbSB1dCBmYXVjaWJ1cworcHVydXMsIHNlZCB1bHRyaWNpZXMgZGlhbS4gUGVsbGVudGVzcXVlIGF0IGZpbmlidXMgaXBzdW0uIFZlc3RpYnVsdW0KK2VnZXN0YXMgZGlnbmlzc2ltIG5pc2wsIGFjIHJob25jdXMgcmlzdXMgZmluaWJ1cyBzaXQgYW1ldC4gRG9uZWMgbm9uCitmZXVnaWF0IGFudGUuIERvbmVjIHZlaGljdWxhIGR1aSBhIGxvcmVtIGltcGVyZGlldCwgYSB0ZW1wdXMgZGlhbQorcHVsdmluYXIuIE51bGxhbSBjb25ndWUgZWZmaWNpdHVyIGp1c3RvLCBub24gcG9zdWVyZSBsaWd1bGEgc29kYWxlcworaW4uIFV0IGEgdXJuYSBvcm5hcmUsIHVsdHJpY2VzIHZlbGl0IGluLCBwZWxsZW50ZXNxdWUKK2xvcmVtLiBWZXN0aWJ1bHVtIGFudGUgaXBzdW0gcHJpbWlzIGluIGZhdWNpYnVzIG9yY2kgbHVjdHVzIGV0Cit1bHRyaWNlcyBwb3N1ZXJlIGN1YmlsaWEgQ3VyYWU7PC9wPgorCis8cD5PcmNpIHZhcml1cyBuYXRvcXVlIHBlbmF0aWJ1cyBldCBtYWduaXMgZGlzIHBhcnR1cmllbnQgbW9udGVzLAorbmFzY2V0dXIgcmlkaWN1bHVzIG11cy4gTW9yYmkgbWF4aW11cyBxdWlzIG1hZ25hIGV0IGFsaXF1ZXQuIE5hbQorYmliZW5kdW0gZmVybWVudHVtIHRlbXB1cy4gUHJhZXNlbnQgaWFjdWxpcyB0b3J0b3IgbWV0dXMsIGF0Cit2ZXN0aWJ1bHVtIGlwc3VtIGhlbmRyZXJpdCBtYXR0aXMuIFByb2luIGZyaW5naWxsYSBuaXNsIHNpdCBhbWV0Cit0aW5jaWR1bnQgYmxhbmRpdC4gSW50ZXJkdW0gZXQgbWFsZXN1YWRhIGZhbWVzIGFjIGFudGUgaXBzdW0gcHJpbWlzIGluCitmYXVjaWJ1cy4gUGhhc2VsbHVzIHZlbCBsZWN0dXMgbGVvLiBDdXJhYml0dXIgZnJpbmdpbGxhLCBhcmN1IG5vbgorcG9zdWVyZSB2aXZlcnJhLCB1cm5hIG1ldHVzIGJsYW5kaXQgYXVndWUsIGNvbnZhbGxpcyBtYXR0aXMgdG9ydG9yIGR1aQordmVsIGFyY3UuIEluIHNpdCBhbWV0IG1ldHVzIHZpdGFlIGV4IHJob25jdXMgaGVuZHJlcml0LjwvcD4KKworPHA+TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gVml2YW11cworaW50ZXJkdW0gbWF4aW11cyBmaW5pYnVzLiBVdCBmZXJtZW50dW0gbWFsZXN1YWRhIGNvbW1vZG8uIFNlZAorZmF1Y2lidXMsIHNhcGllbiBhIG1hdHRpcyBsb2JvcnRpcywgbWFnbmEgYW50ZSBlZmZpY2l0dXIgbWF1cmlzLCBxdWlzCitzb2RhbGVzIG5pYmggZGlhbSBuZWMgcXVhbS4gVmVzdGlidWx1bSBtYWduYSBsaWJlcm8sIHRpbmNpZHVudCBub24KK2VyYXQgc2VkLCBtb2xlc3RpZSBwdWx2aW5hciBleC4gTWFlY2VuYXMgc2VtcGVyIGJsYW5kaXQgZWxpdCwgaWQKK3N1c2NpcGl0IG51bGxhIHZlbmVuYXRpcyBwcmV0aXVtLiBJbnRlZ2VyIGFjY3Vtc2FuIHBvcnRhIGZlbGlzLCB2aXRhZQorcGxhY2VyYXQgdXJuYSBhY2N1bXNhbiB2ZWwuIEFsaXF1YW0gZXUgYWxpcXVldCBtaS4gQWVuZWFuIHRpbmNpZHVudAorZXJvcyBsZWN0dXMsIHNpdCBhbWV0IGVmZmljaXR1ciBvcmNpIHVsdHJpY2VzIGF0LiBNb3JiaSBsb2JvcnRpcyBleAorcXVpcyBsdWN0dXMgcnV0cnVtLiBJbiBudWxsYSB2ZWxpdCwgZWxlbWVudHVtIHZpdGFlIHR1cnBpcyB2aXRhZSwKK2ZpbmlidXMgdmFyaXVzIG1hc3NhLiBNb3JiaSBpZCBsaWJlcm8gZmF1Y2lidXMsIHRlbXB1cyBlcm9zIGV0LAordWxsYW1jb3JwZXIgaXBzdW0uIFNlZCBlbGVpZmVuZCBmaW5pYnVzIGJpYmVuZHVtLiBOdWxsYW0gdXQgbnVuYyBuZWMKK2xhY3VzIHBvc3VlcmUgZGlnbmlzc2ltLiBOdW5jIHNvbGxpY2l0dWRpbiB2aXRhZSBhdWd1ZSBpZAordnVscHV0YXRlLiBVdCBhYyBuaWJoIGdyYXZpZGEsIHZvbHV0cGF0IGVzdCBhYywgZmFjaWxpc2lzIG5lcXVlLjwvcD4KKworPHA+TmFtIGRpY3R1bSBsZW8gbWFzc2EsIG5vbiBwb3N1ZXJlIGR1aSBiaWJlbmR1bSBpZC4gTW9yYmkgc2FnaXR0aXMgZXN0Citub24gZXN0IGxhb3JlZXQsIGEgc29sbGljaXR1ZGluIGZlbGlzIGFsaXF1ZXQuIFV0IGN1cnN1cyB2ZWwgbGVvIGEKK2VmZmljaXR1ci4gUHJvaW4gdXQgcGVsbGVudGVzcXVlIHNhcGllbiwgdmVsIG1heGltdXMgZHVpLiBTdXNwZW5kaXNzZQorZXUgZmVsaXMgZWdldCBsZW8gZWxlbWVudHVtIGVmZmljaXR1ci4gQ2xhc3MgYXB0ZW50IHRhY2l0aSBzb2Npb3NxdSBhZAorbGl0b3JhIHRvcnF1ZW50IHBlciBjb251YmlhIG5vc3RyYSwgcGVyIGluY2VwdG9zIGhpbWVuYWVvcy4gRnVzY2UKK2xvYm9ydGlzIHZlbGl0IGluIGVsaXQgcGVsbGVudGVzcXVlLCB1dCBhdWN0b3IgaXBzdW0gZGlnbmlzc2ltLiBTZWQKK2FsaXF1ZXQgZWxlaWZlbmQgY29udmFsbGlzLiBEdWlzIG1vbGxpcywgZG9sb3Igc2VkIHJ1dHJ1bSBtb2xsaXMsCithdWd1ZSBlcm9zIGRpZ25pc3NpbSBlcmF0LCBldSBkYXBpYnVzIGF1Z3VlIHR1cnBpcyBhYyBzYXBpZW4uIE1vcmJpIGF0Cit2b2x1dHBhdCBvZGlvLCBhdCBtb2xlc3RpZSByaXN1cy4gTnVsbGEgcXVpcyBudWxsYSBldCBtYWduYSB2ZXN0aWJ1bHVtCitldWlzbW9kLiBQcmFlc2VudCBzdXNjaXBpdCBxdWFtIGVsaXQsIG5vbiBsdWN0dXMgdHVycGlzIHJ1dHJ1bQorZmF1Y2lidXMuPC9wPgorCis8cD5Nb3JiaSBmZXVnaWF0IGxhY3VzIHJob25jdXMsIGRpZ25pc3NpbSB2ZWxpdCBuZWMsIGRpZ25pc3NpbQorbG9yZW0uIEFsaXF1YW0gZXJhdCB2b2x1dHBhdC4gTWF1cmlzIHNlbXBlciBkaWN0dW0gdGVtcHVzLiBOdWxsYSBleAorbGlndWxhLCBtYWxlc3VhZGEgaW4gb3JuYXJlIHNlZCwgZXVpc21vZCB2aXRhZSBtYXNzYS4gRXRpYW0gcXVpcyBlcmF0CitxdWlzIG5pc2wgZmFjaWxpc2lzIHN1c2NpcGl0LiBNYXVyaXMgcGxhY2VyYXQgYW50ZSBldCBhdWN0b3IKK2Zlcm1lbnR1bS4gRG9uZWMgdGluY2lkdW50IGp1c3RvIHNlbSwgdWxsYW1jb3JwZXIgdnVscHV0YXRlIG5pc2wKK2NvbW1vZG8gYS4gVmVzdGlidWx1bSBxdWlzIGV4IG5vbiBlbGl0IHBvcnR0aXRvciBzZW1wZXIgZWdldCBxdWlzCit0b3J0b3IuIFN1c3BlbmRpc3NlIG1hdHRpcyBuZXF1ZSBub24gZWxlbWVudHVtIHNjZWxlcmlzcXVlLiBOdWxsYQorZmFjaWxpc2kuIE51bGxhIG5vbiBmZWxpcyBldCBqdXN0byBmZXVnaWF0IGVsZW1lbnR1bS4gQWVuZWFuIHNvZGFsZXMKK3R1cnBpcyBhdCBlcmF0IGVsZWlmZW5kIGxhY2luaWEuIFByb2luIGVsZWlmZW5kIHZvbHV0cGF0IHB1cnVzIGlkCittb2xsaXMuIFByb2luIHZlbCB0ZWxsdXMgZmF1Y2lidXMsIHNhZ2l0dGlzIGxpYmVybyBhdCwgbG9ib3J0aXMKK29kaW8uIFByYWVzZW50IHF1YW0gbWF1cmlzLCBhdWN0b3IgdmVsIHZlbGl0IGV1LCBjb252YWxsaXMgbW9sZXN0aWUKK25pc2kuIFBlbGxlbnRlc3F1ZSBpbiBudW5jIGF0IG9yY2kgdWx0cmljZXMgdmVoaWN1bGEuPC9wPgorCis8cD5QcmFlc2VudCBuaWJoIGxlY3R1cywgZWZmaWNpdHVyIHNlZCByaXN1cyBpbiwgcnV0cnVtIHRyaXN0aXF1ZQorYXJjdS4gQ3VyYWJpdHVyIG5vbiBlZmZpY2l0dXIgZWxpdC4gUGhhc2VsbHVzIGVnZXQgb2RpbyBpYWN1bGlzLAorbW9sZXN0aWUgZHVpIGVnZXQsIHZlbmVuYXRpcyBlcmF0LiBOdWxsYSBsdWN0dXMgZmFjaWxpc2lzIGxlY3R1cywgbmVjCitkYXBpYnVzIHRvcnRvciByaG9uY3VzIHZlbC4gRG9uZWMgbmVjIGFyY3UgZWxpdC4gTnVsbGFtIHV0IGZhdWNpYnVzCitwdXJ1cywgc2VkIHVsdHJpY2llcyBkaWFtLiBQZWxsZW50ZXNxdWUgYXQgZmluaWJ1cyBpcHN1bS4gVmVzdGlidWx1bQorZWdlc3RhcyBkaWduaXNzaW0gbmlzbCwgYWMgcmhvbmN1cyByaXN1cyBmaW5pYnVzIHNpdCBhbWV0LiBEb25lYyBub24KK2ZldWdpYXQgYW50ZS4gRG9uZWMgdmVoaWN1bGEgZHVpIGEgbG9yZW0gaW1wZXJkaWV0LCBhIHRlbXB1cyBkaWFtCitwdWx2aW5hci4gTnVsbGFtIGNvbmd1ZSBlZmZpY2l0dXIganVzdG8sIG5vbiBwb3N1ZXJlIGxpZ3VsYSBzb2RhbGVzCitpbi4gVXQgYSB1cm5hIG9ybmFyZSwgdWx0cmljZXMgdmVsaXQgaW4sIHBlbGxlbnRlc3F1ZQorbG9yZW0uIFZlc3RpYnVsdW0gYW50ZSBpcHN1bSBwcmltaXMgaW4gZmF1Y2lidXMgb3JjaSBsdWN0dXMgZXQKK3VsdHJpY2VzIHBvc3VlcmUgY3ViaWxpYSBDdXJhZTs8L3A+CisKKzxwPk9yY2kgdmFyaXVzIG5hdG9xdWUgcGVuYXRpYnVzIGV0IG1hZ25pcyBkaXMgcGFydHVyaWVudCBtb250ZXMsCituYXNjZXR1ciByaWRpY3VsdXMgbXVzLiBNb3JiaSBtYXhpbXVzIHF1aXMgbWFnbmEgZXQgYWxpcXVldC4gTmFtCitiaWJlbmR1bSBmZXJtZW50dW0gdGVtcHVzLiBQcmFlc2VudCBpYWN1bGlzIHRvcnRvciBtZXR1cywgYXQKK3Zlc3RpYnVsdW0gaXBzdW0gaGVuZHJlcml0IG1hdHRpcy4gUHJvaW4gZnJpbmdpbGxhIG5pc2wgc2l0IGFtZXQKK3RpbmNpZHVudCBibGFuZGl0LiBJbnRlcmR1bSBldCBtYWxlc3VhZGEgZmFtZXMgYWMgYW50ZSBpcHN1bSBwcmltaXMgaW4KK2ZhdWNpYnVzLiBQaGFzZWxsdXMgdmVsIGxlY3R1cyBsZW8uIEN1cmFiaXR1ciBmcmluZ2lsbGEsIGFyY3Ugbm9uCitwb3N1ZXJlIHZpdmVycmEsIHVybmEgbWV0dXMgYmxhbmRpdCBhdWd1ZSwgY29udmFsbGlzIG1hdHRpcyB0b3J0b3IgZHVpCit2ZWwgYXJjdS4gSW4gc2l0IGFtZXQgbWV0dXMgdml0YWUgZXggcmhvbmN1cyBoZW5kcmVyaXQuPC9wPgorCis8cD5Mb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LiBWaXZhbXVzCitpbnRlcmR1bSBtYXhpbXVzIGZpbmlidXMuIFV0IGZlcm1lbnR1bSBtYWxlc3VhZGEgY29tbW9kby4gU2VkCitmYXVjaWJ1cywgc2FwaWVuIGEgbWF0dGlzIGxvYm9ydGlzLCBtYWduYSBhbnRlIGVmZmljaXR1ciBtYXVyaXMsIHF1aXMKK3NvZGFsZXMgbmliaCBkaWFtIG5lYyBxdWFtLiBWZXN0aWJ1bHVtIG1hZ25hIGxpYmVybywgdGluY2lkdW50IG5vbgorZXJhdCBzZWQsIG1vbGVzdGllIHB1bHZpbmFyIGV4LiBNYWVjZW5hcyBzZW1wZXIgYmxhbmRpdCBlbGl0LCBpZAorc3VzY2lwaXQgbnVsbGEgdmVuZW5hdGlzIHByZXRpdW0uIEludGVnZXIgYWNjdW1zYW4gcG9ydGEgZmVsaXMsIHZpdGFlCitwbGFjZXJhdCB1cm5hIGFjY3Vtc2FuIHZlbC4gQWxpcXVhbSBldSBhbGlxdWV0IG1pLiBBZW5lYW4gdGluY2lkdW50Citlcm9zIGxlY3R1cywgc2l0IGFtZXQgZWZmaWNpdHVyIG9yY2kgdWx0cmljZXMgYXQuIE1vcmJpIGxvYm9ydGlzIGV4CitxdWlzIGx1Y3R1cyBydXRydW0uIEluIG51bGxhIHZlbGl0LCBlbGVtZW50dW0gdml0YWUgdHVycGlzIHZpdGFlLAorZmluaWJ1cyB2YXJpdXMgbWFzc2EuIE1vcmJpIGlkIGxpYmVybyBmYXVjaWJ1cywgdGVtcHVzIGVyb3MgZXQsCit1bGxhbWNvcnBlciBpcHN1bS4gU2VkIGVsZWlmZW5kIGZpbmlidXMgYmliZW5kdW0uIE51bGxhbSB1dCBudW5jIG5lYworbGFjdXMgcG9zdWVyZSBkaWduaXNzaW0uIE51bmMgc29sbGljaXR1ZGluIHZpdGFlIGF1Z3VlIGlkCit2dWxwdXRhdGUuIFV0IGFjIG5pYmggZ3JhdmlkYSwgdm9sdXRwYXQgZXN0IGFjLCBmYWNpbGlzaXMgbmVxdWUuPC9wPgorCis8cD5OYW0gZGljdHVtIGxlbyBtYXNzYSwgbm9uIHBvc3VlcmUgZHVpIGJpYmVuZHVtIGlkLiBNb3JiaSBzYWdpdHRpcyBlc3QKK25vbiBlc3QgbGFvcmVldCwgYSBzb2xsaWNpdHVkaW4gZmVsaXMgYWxpcXVldC4gVXQgY3Vyc3VzIHZlbCBsZW8gYQorZWZmaWNpdHVyLiBQcm9pbiB1dCBwZWxsZW50ZXNxdWUgc2FwaWVuLCB2ZWwgbWF4aW11cyBkdWkuIFN1c3BlbmRpc3NlCitldSBmZWxpcyBlZ2V0IGxlbyBlbGVtZW50dW0gZWZmaWNpdHVyLiBDbGFzcyBhcHRlbnQgdGFjaXRpIHNvY2lvc3F1IGFkCitsaXRvcmEgdG9ycXVlbnQgcGVyIGNvbnViaWEgbm9zdHJhLCBwZXIgaW5jZXB0b3MgaGltZW5hZW9zLiBGdXNjZQorbG9ib3J0aXMgdmVsaXQgaW4gZWxpdCBwZWxsZW50ZXNxdWUsIHV0IGF1Y3RvciBpcHN1bSBkaWduaXNzaW0uIFNlZAorYWxpcXVldCBlbGVpZmVuZCBjb252YWxsaXMuIER1aXMgbW9sbGlzLCBkb2xvciBzZWQgcnV0cnVtIG1vbGxpcywKK2F1Z3VlIGVyb3MgZGlnbmlzc2ltIGVyYXQsIGV1IGRhcGlidXMgYXVndWUgdHVycGlzIGFjIHNhcGllbi4gTW9yYmkgYXQKK3ZvbHV0cGF0IG9kaW8sIGF0IG1vbGVzdGllIHJpc3VzLiBOdWxsYSBxdWlzIG51bGxhIGV0IG1hZ25hIHZlc3RpYnVsdW0KK2V1aXNtb2QuIFByYWVzZW50IHN1c2NpcGl0IHF1YW0gZWxpdCwgbm9uIGx1Y3R1cyB0dXJwaXMgcnV0cnVtCitmYXVjaWJ1cy48L3A+CisKKzxwPk1vcmJpIGZldWdpYXQgbGFjdXMgcmhvbmN1cywgZGlnbmlzc2ltIHZlbGl0IG5lYywgZGlnbmlzc2ltCitsb3JlbS4gQWxpcXVhbSBlcmF0IHZvbHV0cGF0LiBNYXVyaXMgc2VtcGVyIGRpY3R1bSB0ZW1wdXMuIE51bGxhIGV4CitsaWd1bGEsIG1hbGVzdWFkYSBpbiBvcm5hcmUgc2VkLCBldWlzbW9kIHZpdGFlIG1hc3NhLiBFdGlhbSBxdWlzIGVyYXQKK3F1aXMgbmlzbCBmYWNpbGlzaXMgc3VzY2lwaXQuIE1hdXJpcyBwbGFjZXJhdCBhbnRlIGV0IGF1Y3RvcgorZmVybWVudHVtLiBEb25lYyB0aW5jaWR1bnQganVzdG8gc2VtLCB1bGxhbWNvcnBlciB2dWxwdXRhdGUgbmlzbAorY29tbW9kbyBhLiBWZXN0aWJ1bHVtIHF1aXMgZXggbm9uIGVsaXQgcG9ydHRpdG9yIHNlbXBlciBlZ2V0IHF1aXMKK3RvcnRvci4gU3VzcGVuZGlzc2UgbWF0dGlzIG5lcXVlIG5vbiBlbGVtZW50dW0gc2NlbGVyaXNxdWUuIE51bGxhCitmYWNpbGlzaS4gTnVsbGEgbm9uIGZlbGlzIGV0IGp1c3RvIGZldWdpYXQgZWxlbWVudHVtLiBBZW5lYW4gc29kYWxlcwordHVycGlzIGF0IGVyYXQgZWxlaWZlbmQgbGFjaW5pYS4gUHJvaW4gZWxlaWZlbmQgdm9sdXRwYXQgcHVydXMgaWQKK21vbGxpcy4gUHJvaW4gdmVsIHRlbGx1cyBmYXVjaWJ1cywgc2FnaXR0aXMgbGliZXJvIGF0LCBsb2JvcnRpcworb2Rpby4gUHJhZXNlbnQgcXVhbSBtYXVyaXMsIGF1Y3RvciB2ZWwgdmVsaXQgZXUsIGNvbnZhbGxpcyBtb2xlc3RpZQorbmlzaS4gUGVsbGVudGVzcXVlIGluIG51bmMgYXQgb3JjaSB1bHRyaWNlcyB2ZWhpY3VsYS48L3A+CisKKzxwPlByYWVzZW50IG5pYmggbGVjdHVzLCBlZmZpY2l0dXIgc2VkIHJpc3VzIGluLCBydXRydW0gdHJpc3RpcXVlCithcmN1LiBDdXJhYml0dXIgbm9uIGVmZmljaXR1ciBlbGl0LiBQaGFzZWxsdXMgZWdldCBvZGlvIGlhY3VsaXMsCittb2xlc3RpZSBkdWkgZWdldCwgdmVuZW5hdGlzIGVyYXQuIE51bGxhIGx1Y3R1cyBmYWNpbGlzaXMgbGVjdHVzLCBuZWMKK2RhcGlidXMgdG9ydG9yIHJob25jdXMgdmVsLiBEb25lYyBuZWMgYXJjdSBlbGl0LiBOdWxsYW0gdXQgZmF1Y2lidXMKK3B1cnVzLCBzZWQgdWx0cmljaWVzIGRpYW0uIFBlbGxlbnRlc3F1ZSBhdCBmaW5pYnVzIGlwc3VtLiBWZXN0aWJ1bHVtCitlZ2VzdGFzIGRpZ25pc3NpbSBuaXNsLCBhYyByaG9uY3VzIHJpc3VzIGZpbmlidXMgc2l0IGFtZXQuIERvbmVjIG5vbgorZmV1Z2lhdCBhbnRlLiBEb25lYyB2ZWhpY3VsYSBkdWkgYSBsb3JlbSBpbXBlcmRpZXQsIGEgdGVtcHVzIGRpYW0KK3B1bHZpbmFyLiBOdWxsYW0gY29uZ3VlIGVmZmljaXR1ciBqdXN0bywgbm9uIHBvc3VlcmUgbGlndWxhIHNvZGFsZXMKK2luLiBVdCBhIHVybmEgb3JuYXJlLCB1bHRyaWNlcyB2ZWxpdCBpbiwgcGVsbGVudGVzcXVlCitsb3JlbS4gVmVzdGlidWx1bSBhbnRlIGlwc3VtIHByaW1pcyBpbiBmYXVjaWJ1cyBvcmNpIGx1Y3R1cyBldAordWx0cmljZXMgcG9zdWVyZSBjdWJpbGlhIEN1cmFlOzwvcD4KKworPHA+T3JjaSB2YXJpdXMgbmF0b3F1ZSBwZW5hdGlidXMgZXQgbWFnbmlzIGRpcyBwYXJ0dXJpZW50IG1vbnRlcywKK25hc2NldHVyIHJpZGljdWx1cyBtdXMuIE1vcmJpIG1heGltdXMgcXVpcyBtYWduYSBldCBhbGlxdWV0LiBOYW0KK2JpYmVuZHVtIGZlcm1lbnR1bSB0ZW1wdXMuIFByYWVzZW50IGlhY3VsaXMgdG9ydG9yIG1ldHVzLCBhdAordmVzdGlidWx1bSBpcHN1bSBoZW5kcmVyaXQgbWF0dGlzLiBQcm9pbiBmcmluZ2lsbGEgbmlzbCBzaXQgYW1ldAordGluY2lkdW50IGJsYW5kaXQuIEludGVyZHVtIGV0IG1hbGVzdWFkYSBmYW1lcyBhYyBhbnRlIGlwc3VtIHByaW1pcyBpbgorZmF1Y2lidXMuIFBoYXNlbGx1cyB2ZWwgbGVjdHVzIGxlby4gQ3VyYWJpdHVyIGZyaW5naWxsYSwgYXJjdSBub24KK3Bvc3VlcmUgdml2ZXJyYSwgdXJuYSBtZXR1cyBibGFuZGl0IGF1Z3VlLCBjb252YWxsaXMgbWF0dGlzIHRvcnRvciBkdWkKK3ZlbCBhcmN1LiBJbiBzaXQgYW1ldCBtZXR1cyB2aXRhZSBleCByaG9uY3VzIGhlbmRyZXJpdC48L3A+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci93ZWJfbW9kdWxlLmNjIGIvc3JjL2NvYmFsdC9icm93c2VyL3dlYl9tb2R1bGUuY2MKaW5kZXggODdmYzlmMi4uNzI5Njk3ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL3dlYl9tb2R1bGUuY2MKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3dlYl9tb2R1bGUuY2MKQEAgLTU0LDYgKzU0LDcgQEAKICNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2ltYWdlL2FuaW1hdGVkX2ltYWdlX3RyYWNrZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uX2NsaWVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9wYWdlX3Zpc2liaWxpdHkvdmlzaWJpbGl0eV9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXJyb3JfcmVwb3J0LmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9qYXZhc2NyaXB0X2VuZ2luZS5oIgogI2luY2x1ZGUgImNvYmFsdC9zdG9yYWdlL3N0b3JhZ2VfbWFuYWdlci5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9hY2Nlc3NpYmlsaXR5LmgiCkBAIC0xNDMsNiArMTQ0LDEyIEBACiAgIHZvaWQgSW5qZWN0V2hlZWxFdmVudChzY29wZWRfcmVmcHRyPGRvbTo6RWxlbWVudD4gZWxlbWVudCwgYmFzZTo6VG9rZW4gdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvbTo6V2hlZWxFdmVudEluaXQmIGV2ZW50KTsKIAorICAvLyBDYWxsZWQgdG8gaW5qZWN0IGEgYmVmb3JldW5sb2FkIGV2ZW50IGludG8gdGhlIHdlYiBtb2R1bGUuIElmCisgIC8vIHRoaXMgZXZlbnQgaXMgbm90IGhhbmRsZWQgYnkgdGhlIHdlYiBhcHBsaWNhdGlvbiwKKyAgLy8gb25fYmVmb3JlX3VubG9hZF9maXJlZF9idXRfbm90X2hhbmRsZWQgd2lsbCBiZSBjYWxsZWQuIFRoZSBldmVudAorICAvLyBpcyBub3QgZGlyZWN0ZWQgYXQgYSBzcGVjaWZpYyBlbGVtZW50LgorICB2b2lkIEluamVjdEJlZm9yZVVubG9hZEV2ZW50KCk7CisKICAgLy8gQ2FsbGVkIHRvIGV4ZWN1dGUgSmF2YVNjcmlwdCBpbiB0aGlzIFdlYk1vZHVsZS4gU2V0cyB0aGUgfHJlc3VsdHwKICAgLy8gb3V0cHV0IHBhcmFtZXRlciBhbmQgc2lnbmFscyB8Z290X3Jlc3VsdHwuCiAgIHZvaWQgRXhlY3V0ZUphdmFzY3JpcHQoY29uc3Qgc3RkOjpzdHJpbmcmIHNjcmlwdF91dGY4LApAQCAtMTk3LDggKzIwNCwxMCBAQAogICB2b2lkIFVucGF1c2UoKTsKICAgdm9pZCBSZXN1bWUocmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyKTsKIAotICB2b2lkIFJlcG9ydFNjcmlwdEVycm9yKGNvbnN0IGJhc2U6OlNvdXJjZUxvY2F0aW9uJiBzb3VyY2VfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yX21lc3NhZ2UpOworICB2b2lkIFJlZHVjZU1lbW9yeSgpOworCisgIHZvaWQgTG9nU2NyaXB0RXJyb3IoY29uc3QgYmFzZTo6U291cmNlTG9jYXRpb24mIHNvdXJjZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3JfbWVzc2FnZSk7CiAKICBwcml2YXRlOgogICBjbGFzcyBEb2N1bWVudExvYWRlZE9ic2VydmVyOwpAQCAtMjMzLDYgKzI0MiwxMCBAQAogICAgIGVycm9yX2NhbGxiYWNrXy5SdW4od2luZG93Xy0+bG9jYXRpb24oKS0+dXJsKCksIGVycm9yKTsKICAgfQogCisgIC8vIFJlcG9ydCBhbiBlcnJvciBlbmNvdW50ZXJlZCB3aGlsZSBydW5uaW5nIEpTLgorICAvLyBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBlcnJvciB3YXMgaGFuZGxlZC4KKyAgYm9vbCBSZXBvcnRTY3JpcHRFcnJvcihjb25zdCBzY3JpcHQ6OkVycm9yUmVwb3J0JiBlcnJvcl9yZXBvcnQpOworCiAgIC8vIEluamVjdCB0aGUgRE9NIGV2ZW50IG9iamVjdCBpbnRvIHRoZSB3aW5kb3cgb3IgdGhlIGVsZW1lbnQuCiAgIHZvaWQgSW5qZWN0SW5wdXRFdmVudChzY29wZWRfcmVmcHRyPGRvbTo6RWxlbWVudD4gZWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8ZG9tOjpFdmVudD4mIGV2ZW50KTsKQEAgLTM1OCw2ICszNzEsOCBAQAogICBzY29wZWRfcHRyPG1lZGlhX3Nlc3Npb246Ok1lZGlhU2Vzc2lvbkNsaWVudD4gbWVkaWFfc2Vzc2lvbl9jbGllbnRfOwogCiAgIHNjb3BlZF9wdHI8bGF5b3V0OjpUb3Btb3N0RXZlbnRUYXJnZXQ+IHRvcG1vc3RfZXZlbnRfdGFyZ2V0XzsKKworICBiYXNlOjpDbG9zdXJlIG9uX2JlZm9yZV91bmxvYWRfZmlyZWRfYnV0X25vdF9oYW5kbGVkOwogfTsKIAogY2xhc3MgV2ViTW9kdWxlOjpJbXBsOjpEb2N1bWVudExvYWRlZE9ic2VydmVyIDogcHVibGljIGRvbTo6RG9jdW1lbnRPYnNlcnZlciB7CkBAIC00MjIsNiArNDM3LDkgQEAKICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKGRhdGEub3B0aW9ucy5zcGxhc2hfc2NyZWVuX2NhY2hlKSk7CiAgIH0KIAorICBvbl9iZWZvcmVfdW5sb2FkX2ZpcmVkX2J1dF9ub3RfaGFuZGxlZCA9CisgICAgICBkYXRhLm9wdGlvbnMub25fYmVmb3JlX3VubG9hZF9maXJlZF9idXRfbm90X2hhbmRsZWQ7CisKICAgZmV0Y2hlcl9mYWN0b3J5Xy5yZXNldChuZXcgbG9hZGVyOjpGZXRjaGVyRmFjdG9yeSgKICAgICAgIGRhdGEubmV0d29ya19tb2R1bGUsIGRhdGEub3B0aW9ucy5leHRyYV93ZWJfZmlsZV9kaXIsCiAgICAgICBkb206OlVSTDo6TWFrZUJsb2JSZXNvbHZlckNhbGxiYWNrKGJsb2JfcmVnaXN0cnlfLmdldCgpKSwKQEAgLTQ3NSw3ICs0OTMsNyBAQAogCiAjaWYgZGVmaW5lZChDT0JBTFRfRU5BQkxFX0pBVkFTQ1JJUFRfRVJST1JfTE9HR0lORykKICAgc2NyaXB0OjpKYXZhU2NyaXB0RW5naW5lOjpFcnJvckhhbmRsZXIgZXJyb3JfaGFuZGxlciA9Ci0gICAgICBiYXNlOjpCaW5kKCZXZWJNb2R1bGU6OkltcGw6OlJlcG9ydFNjcmlwdEVycm9yLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKTsKKyAgICAgIGJhc2U6OkJpbmQoJldlYk1vZHVsZTo6SW1wbDo6TG9nU2NyaXB0RXJyb3IsIGJhc2U6OlVucmV0YWluZWQodGhpcykpOwogICBqYXZhc2NyaXB0X2VuZ2luZV8tPlJlZ2lzdGVyRXJyb3JIYW5kbGVyKGVycm9yX2hhbmRsZXIpOwogI2VuZGlmCiAKQEAgLTU3OCw2ICs1OTYsOSBAQAogICAgICAgYmFzZTo6QmluZCgmZG9tOjpDc3BEZWxlZ2F0ZTo6UmVwb3J0RXZhbCwKICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh3aW5kb3dfLT5kb2N1bWVudCgpLT5jc3BfZGVsZWdhdGUoKSkpKTsKIAorICBnbG9iYWxfZW52aXJvbm1lbnRfLT5TZXRSZXBvcnRFcnJvckNhbGxiYWNrKAorICAgICAgYmFzZTo6QmluZCgmV2ViTW9kdWxlOjpJbXBsOjpSZXBvcnRTY3JpcHRFcnJvciwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOworCiAgIEluamVjdEN1c3RvbVdpbmRvd0F0dHJpYnV0ZXMoZGF0YS5vcHRpb25zLmluamVjdGVkX3dpbmRvd19hdHRyaWJ1dGVzKTsKIAogICBpZiAoIWRhdGEub3B0aW9ucy5sb2FkZWRfY2FsbGJhY2tzLmVtcHR5KCkpIHsKQEAgLTU5NCw2ICs2MTUsOCBAQAogICBEQ0hFQ0soaXNfcnVubmluZ18pOwogICBpc19ydW5uaW5nXyA9IGZhbHNlOwogICBnbG9iYWxfZW52aXJvbm1lbnRfLT5TZXRSZXBvcnRFdmFsQ2FsbGJhY2soYmFzZTo6Q2xvc3VyZSgpKTsKKyAgZ2xvYmFsX2Vudmlyb25tZW50Xy0+U2V0UmVwb3J0RXJyb3JDYWxsYmFjaygKKyAgICAgIHNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ6OlJlcG9ydEVycm9yQ2FsbGJhY2soKSk7CiAgIHdpbmRvd18tPkRpc3BhdGNoRXZlbnQobmV3IGRvbTo6RXZlbnQoYmFzZTo6VG9rZW5zOjp1bmxvYWQoKSkpOwogICBkb2N1bWVudF9sb2FkX29ic2VydmVyXy5yZXNldCgpOwogICBtZWRpYV9zZXNzaW9uX2NsaWVudF8ucmVzZXQoKTsKQEAgLTc1MCw2ICs3NzMsMTQgQEAKICAgfQogfQogCitib29sIFdlYk1vZHVsZTo6SW1wbDo6UmVwb3J0U2NyaXB0RXJyb3IoCisgICAgY29uc3Qgc2NyaXB0OjpFcnJvclJlcG9ydCYgZXJyb3JfcmVwb3J0KSB7CisgIERDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKKyAgRENIRUNLKGlzX3J1bm5pbmdfKTsKKyAgRENIRUNLKHdpbmRvd18pOworICByZXR1cm4gd2luZG93Xy0+UmVwb3J0U2NyaXB0RXJyb3IoZXJyb3JfcmVwb3J0KTsKK30KKwogI2lmIGRlZmluZWQoRU5BQkxFX1dFQkRSSVZFUikKIHZvaWQgV2ViTW9kdWxlOjpJbXBsOjpDcmVhdGVXaW5kb3dEcml2ZXIoCiAgICAgY29uc3Qgd2ViZHJpdmVyOjpwcm90b2NvbDo6V2luZG93SWQmIHdpbmRvd19pZCwKQEAgLTkyNSw3ICs5NTYsMjMgQEAKICAgU2V0QXBwbGljYXRpb25TdGF0ZShiYXNlOjprQXBwbGljYXRpb25TdGF0ZVBhdXNlZCk7CiB9CiAKLXZvaWQgV2ViTW9kdWxlOjpJbXBsOjpSZXBvcnRTY3JpcHRFcnJvcigKK3ZvaWQgV2ViTW9kdWxlOjpJbXBsOjpSZWR1Y2VNZW1vcnkoKSB7CisgIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojpicm93c2VyIiwgIldlYk1vZHVsZTo6SW1wbDo6UmVkdWNlTWVtb3J5KCkiKTsKKyAgRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOworICBpZiAoIWlzX3J1bm5pbmdfKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgUHVyZ2VSZXNvdXJjZUNhY2hlcygpOworICB3aW5kb3dfLT5kb2N1bWVudCgpLT5QdXJnZUNhY2hlZFJlc291cmNlcygpOworCisgIC8vIEZvcmNlIGdhcmJhZ2UgY29sbGVjdGlvbiBpbiB8amF2YXNjcmlwdF9lbmdpbmVffC4KKyAgaWYgKGphdmFzY3JpcHRfZW5naW5lXykgeworICAgIGphdmFzY3JpcHRfZW5naW5lXy0+Q29sbGVjdEdhcmJhZ2UoKTsKKyAgfQorfQorCit2b2lkIFdlYk1vZHVsZTo6SW1wbDo6TG9nU2NyaXB0RXJyb3IoCiAgICAgY29uc3QgYmFzZTo6U291cmNlTG9jYXRpb24mIHNvdXJjZV9sb2NhdGlvbiwKICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3JfbWVzc2FnZSkgewogICBzdGQ6OnN0cmluZyBmaWxlX25hbWUgPQpAQCAtOTQ0LDYgKzk5MSwxNSBAQAogICBTYkxvZ1Jhdyhzcy5zdHIoKS5jX3N0cigpKTsKIH0KIAordm9pZCBXZWJNb2R1bGU6OkltcGw6OkluamVjdEJlZm9yZVVubG9hZEV2ZW50KCkgeworICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CisgIGlmICh3aW5kb3dfICYmIHdpbmRvd18tPkhhc0V2ZW50TGlzdGVuZXIoYmFzZTo6VG9rZW5zOjpiZWZvcmV1bmxvYWQoKSkpIHsKKyAgICB3aW5kb3dfLT5EaXNwYXRjaEV2ZW50KG5ldyBkb206OkV2ZW50KGJhc2U6OlRva2Vuczo6YmVmb3JldW5sb2FkKCkpKTsKKyAgfSBlbHNlIGlmICghb25fYmVmb3JlX3VubG9hZF9maXJlZF9idXRfbm90X2hhbmRsZWQuaXNfbnVsbCgpKSB7CisgICAgb25fYmVmb3JlX3VubG9hZF9maXJlZF9idXRfbm90X2hhbmRsZWQuUnVuKCk7CisgIH0KK30KKwogdm9pZCBXZWJNb2R1bGU6OkltcGw6OlB1cmdlUmVzb3VyY2VDYWNoZXMoKSB7CiAgIGltYWdlX2NhY2hlXy0+UHVyZ2UoKTsKICAgcmVtb3RlX3R5cGVmYWNlX2NhY2hlXy0+UHVyZ2UoKTsKQEAgLTEwOTcsNiArMTE1MywxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9yZWZwdHI8ZG9tOjpFbGVtZW50PigpLCB0eXBlLCBldmVudCkpOwogfQogCit2b2lkIFdlYk1vZHVsZTo6SW5qZWN0QmVmb3JlVW5sb2FkRXZlbnQoKSB7CisgIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojpicm93c2VyIiwgIldlYk1vZHVsZTo6SW5qZWN0QmVmb3JlVW5sb2FkRXZlbnQoKSIpOworICBEQ0hFQ0sobWVzc2FnZV9sb29wKCkpOworICBEQ0hFQ0soaW1wbF8pOworICBtZXNzYWdlX2xvb3AoKS0+UG9zdFRhc2soRlJPTV9IRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmV2ViTW9kdWxlOjpJbXBsOjpJbmplY3RCZWZvcmVVbmxvYWRFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChpbXBsXy5nZXQoKSkpKTsKK30KKwogc3RkOjpzdHJpbmcgV2ViTW9kdWxlOjpFeGVjdXRlSmF2YXNjcmlwdCgKICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2NyaXB0X3V0ZjgsCiAgICAgY29uc3QgYmFzZTo6U291cmNlTG9jYXRpb24mIHNjcmlwdF9sb2NhdGlvbiwKQEAgLTEyODcsNiArMTM1MiwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoaW1wbF8uZ2V0KCkpLCByZXNvdXJjZV9wcm92aWRlcikpOwogfQogCit2b2lkIFdlYk1vZHVsZTo6UmVkdWNlTWVtb3J5KCkgeworICAvLyBNdXN0IG9ubHkgYmUgY2FsbGVkIGJ5IGEgdGhyZWFkIGV4dGVybmFsIGZyb20gdGhlIFdlYk1vZHVsZSB0aHJlYWQuCisgIERDSEVDS19ORShNZXNzYWdlTG9vcDo6Y3VycmVudCgpLCBtZXNzYWdlX2xvb3AoKSk7CisKKyAgLy8gV2UgYmxvY2sgaGVyZSBzbyB0aGF0IHdlIGJsb2NrIHRoZSBMb3cgTWVtb3J5IGV2ZW50IGhhbmRsZXIgdW50aWwgd2UgaGF2ZQorICAvLyByZWR1Y2VkIG91ciBtZW1vcnkgY29uc3VtcHRpb24uCisgIG1lc3NhZ2VfbG9vcCgpLT5Qb3N0QmxvY2tpbmdUYXNrKAorICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZXZWJNb2R1bGU6OkltcGw6OlJlZHVjZU1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKGltcGxfLmdldCgpKSkpOworfQorCiB2b2lkIFdlYk1vZHVsZTo6SW1wbDo6SGFuZGxlUG9pbnRlckV2ZW50cygpIHsKICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OmJyb3dzZXIiLCAiV2ViTW9kdWxlOjpJbXBsOjpIYW5kbGVQb2ludGVyRXZlbnRzIik7CiAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8ZG9tOjpEb2N1bWVudD4mIGRvY3VtZW50ID0gd2luZG93Xy0+ZG9jdW1lbnQoKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci93ZWJfbW9kdWxlLmggYi9zcmMvY29iYWx0L2Jyb3dzZXIvd2ViX21vZHVsZS5oCmluZGV4IGIyOTZkNmYuLmJhMjM3MDcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci93ZWJfbW9kdWxlLmgKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3dlYl9tb2R1bGUuaApAQCAtMTg1LDYgKzE4NSwxNCBAQAogICAgIC8vIFRoZSBzcGxhc2ggc2NyZWVuIGNhY2hlIG9iamVjdCwgb3duZWQgYnkgdGhlIEJyb3dzZXJNb2R1bGUuCiAgICAgU3BsYXNoU2NyZWVuQ2FjaGUqIHNwbGFzaF9zY3JlZW5fY2FjaGU7CiAKKyAgICAvLyBUaGUgYmVmb3JldW5sb2FkIGV2ZW50IGNhbiBnaXZlIGEgd2ViIHBhZ2UgYSBjaGFuY2UgdG8gc2h1dAorICAgIC8vIGl0c2VsZiBkb3duIHNvZnRseSBhbmQgdWx0aW1hdGVseSBjYWxsIHdpbmRvdy5jbG9zZSgpLCBob3dldmVyCisgICAgLy8gaWYgaXQgaXMgbm90IGhhbmRsZWQgYnkgdGhlIHdlYiBhcHBsaWNhdGlvbiwgd2UgaW5kaWNhdGUgdGhpcworICAgIC8vIHNpdHVhdGlvbiBleHRlcm5hbGx5IGJ5IGNhbGxpbmcgdGhpcyBjYWxsYmFjaywgc28gdGhhdCBpZiB0aGUKKyAgICAvLyBiZWZvcmV1bmxvYWQgZXZlbnQgd2FzIGdlbmVyYXRlZCBpdCBjYW4gYmUga25vd24gdGhhdCB0aGVyZSBpcworICAgIC8vIG5vIHdpbmRvdy5jbG9zZSgpIGNhbGwgcGVuZGluZy4KKyAgICBiYXNlOjpDbG9zdXJlIG9uX2JlZm9yZV91bmxvYWRfZmlyZWRfYnV0X25vdF9oYW5kbGVkOworCiAgICAgLy8gV2hldGhlciBvciBub3QgdGhlIFdlYk1vZHVsZSBpcyBhbGxvd2VkIHRvIGZldGNoIGZyb20gY2FjaGUgdmlhCiAgICAgLy8gaDV2Y2MtY2FjaGU6Ly8uCiAgICAgYm9vbCBjYW5fZmV0Y2hfY2FjaGU7CkBAIC0yMjIsNiArMjMwLDExIEBACiAgIC8vIHJlcHJlc2VudHMgdGhlIGV2ZW50IG5hbWUsIGZvciBleGFtcGxlICd3aGVlbCcuCiAgIHZvaWQgSW5qZWN0V2hlZWxFdmVudChiYXNlOjpUb2tlbiB0eXBlLCBjb25zdCBkb206OldoZWVsRXZlbnRJbml0JiBldmVudCk7CiAKKyAgLy8gQ2FsbCB0aGlzIHRvIGluamVjdCBhIGJlZm9yZXVubG9hZCBldmVudCBpbnRvIHRoZSB3ZWIgbW9kdWxlLiBJZgorICAvLyB0aGlzIGV2ZW50IGlzIG5vdCBoYW5kbGVkIGJ5IHRoZSB3ZWIgYXBwbGljYXRpb24sCisgIC8vIG9uX2JlZm9yZV91bmxvYWRfZmlyZWRfYnV0X25vdF9oYW5kbGVkIHdpbGwgYmUgY2FsbGVkLgorICB2b2lkIEluamVjdEJlZm9yZVVubG9hZEV2ZW50KCk7CisKICAgLy8gQ2FsbCB0aGlzIHRvIGV4ZWN1dGUgSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgd2ViIG1vZHVsZS4gIFRoZSBjYWxsaW5nCiAgIC8vIHRocmVhZCB3aWxsIGJsb2NrIHVudGlsIHRoZSBKYXZhU2NyaXB0IGhhcyBleGVjdXRlZCBhbmQgdGhlIG91dHB1dCByZXN1bHRzCiAgIC8vIGFyZSBhdmFpbGFibGUuCkBAIC0yNjIsNiArMjc1LDEwIEBACiAgIHZvaWQgU3VzcGVuZCgpIE9WRVJSSURFOwogICB2b2lkIFJlc3VtZShyZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlciogcmVzb3VyY2VfcHJvdmlkZXIpIE9WRVJSSURFOwogCisgIC8vIEF0dGVtcHQgdG8gcmVkdWNlIG92ZXJhbGwgbWVtb3J5IGNvbnN1bXB0aW9uLiBDYWxsZWQgaW4gcmVzcG9uc2UgdG8gYQorICAvLyBzeXN0ZW0gaW5kaWNhdGlvbiB0aGF0IG1lbW9yeSB1c2FnZSBpcyBuZWFyaW5nIGEgY3JpdGljYWwgbGV2ZWwuCisgIHZvaWQgUmVkdWNlTWVtb3J5KCk7CisKICBwcml2YXRlOgogICAvLyBEYXRhIHJlcXVpcmVkIHRvIGNvbnN0cnVjdCBhIFdlYk1vZHVsZSwgaW5pdGlhbGl6ZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGFuZAogICAvLyBwYXNzZWQgdG8gfEluaXRpYWxpemV8LgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9idWlsZC9idWlsZC5pZCBiL3NyYy9jb2JhbHQvYnVpbGQvYnVpbGQuaWQKaW5kZXggM2M1NGM4NS4uMjQ4YmM3MCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9idWlsZC9idWlsZC5pZAorKysgYi9zcmMvY29iYWx0L2J1aWxkL2J1aWxkLmlkCkBAIC0xICsxIEBACi05MDc5MApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzkzODMwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9idWlsZC9jb25maWcvYmFzZS5neXBpIGIvc3JjL2NvYmFsdC9idWlsZC9jb25maWcvYmFzZS5neXBpCmluZGV4IGEzMjQzYzEuLjAyYzVlYzIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnVpbGQvY29uZmlnL2Jhc2UuZ3lwaQorKysgYi9zcmMvY29iYWx0L2J1aWxkL2NvbmZpZy9iYXNlLmd5cGkKQEAgLTc5MCwxMCArNzkwLDkgQEAKICAgIyBDbGllbnRzIG11c3QgY29weSBvdmVyIGFsbCBjb250ZW50OyB0byBhdm9pZCBoYXZpbmcgdG8gY29weSBvdmVyIGV4dHJhIGRhdGEsIHdlCiAgICMgb21pdCB0aGUgdGVzdCBkYXRhCiAgICdjb25kaXRpb25zJzogWwotICAgIFsnY29iYWx0X2NvbmZpZyAhPSAiZ29sZCIgYW5kIGNvYmFsdF9lbmFibGVfbGliID09IDAnLCB7CisgICAgWydjb2JhbHRfY29uZmlnICE9ICJnb2xkIicsIHsKICAgICAgICd2YXJpYWJsZXMnIDogewogICAgICAgICAnY29iYWx0X2NvcHlfZGVidWdfY29uc29sZSc6IDEsCi0gICAgICAgICdjb2JhbHRfY29weV90ZXN0X2RhdGEnOiAxLAogICAgICAgICAnZW5hYmxlX2Fib3V0X3NjaGVtZSc6IDEsCiAgICAgICAgICdlbmFibGVfZmFrZV9taWNyb3Bob25lJzogMSwKICAgICAgICAgJ2VuYWJsZV9maWxlX3NjaGVtZSc6IDEsCkBAIC04MDcsNyArODA2LDYgQEAKICAgICB7CiAgICAgICAndmFyaWFibGVzJyA6IHsKICAgICAgICAgJ2NvYmFsdF9jb3B5X2RlYnVnX2NvbnNvbGUnOiAwLAotICAgICAgICAnY29iYWx0X2NvcHlfdGVzdF9kYXRhJzogMCwKICAgICAgICAgJ2VuYWJsZV9hYm91dF9zY2hlbWUnOiAwLAogICAgICAgICAnZW5hYmxlX2Zha2VfbWljcm9waG9uZSc6IDAsCiAgICAgICAgICdlbmFibGVfZmlsZV9zY2hlbWUnOiAwLApAQCAtODE4LDUgKzgxNiwxNSBAQAogICAgICAgICAnc2JfYWxsb3dzX21lbW9yeV90cmFja2luZyc6IDAsCiAgICAgICB9LAogICAgIH1dLAorICAgIFsnY29iYWx0X2NvbmZpZyAhPSAiZ29sZCIgYW5kIGNvYmFsdF9lbmFibGVfbGliID09IDAnLCB7CisgICAgICAndmFyaWFibGVzJyA6IHsKKyAgICAgICAgJ2NvYmFsdF9jb3B5X3Rlc3RfZGF0YSc6IDEsCisgICAgICB9LAorICAgIH0sCisgICAgeworICAgICAgJ3ZhcmlhYmxlcycgOiB7CisgICAgICAgICdjb2JhbHRfY29weV90ZXN0X2RhdGEnOiAwLAorICAgICAgfSwKKyAgICB9XSwKICAgXSwKIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnVpbGQvY29uZmlnL3N0YXJib2FyZC5weSBiL3NyYy9jb2JhbHQvYnVpbGQvY29uZmlnL3N0YXJib2FyZC5weQppbmRleCBlY2JhNDQxLi4yYWY1MGNkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2J1aWxkL2NvbmZpZy9zdGFyYm9hcmQucHkKKysrIGIvc3JjL2NvYmFsdC9idWlsZC9jb25maWcvc3RhcmJvYXJkLnB5CkBAIC04MSw5ICs4MSw2IEBACiAgICAgICAgICMgQ29iYWx0IHVzZXMgT3BlblNTTCBvbiBhbGwgcGxhdGZvcm1zLgogICAgICAgICAndXNlX29wZW5zc2wnOiAxLAogICAgICAgICAnY2xhbmcnOiB1c2VfY2xhbmcsCi0gICAgICAgICMgQ29iYWx0IHJlbGllcyBvbiB0aGUgU3RhcmJvYXJkIGltcGxlbWVudGF0aW9uIGZvciBEUk0gb24gYWxsIFN0YXJib2FyZAotICAgICAgICAjIHBsYXRmb3Jtcy4KLSAgICAgICAgJ3VzZV93aWRldmluZSc6IDAsCiAgICAgICAgICMgV2hldGhlciB0byBidWlsZCB3aXRoIGNsYW5nJ3MgQWRkcmVzcyBTYW5pdGl6ZXIgaW5zdHJ1bWVudGF0aW9uLgogICAgICAgICAndXNlX2FzYW4nOiB1c2VfYXNhbiwKICAgICAgICAgIyBXaGV0aGVyIHRvIGJ1aWxkIHdpdGggY2xhbmcncyBUaHJlYWQgU2FuaXRpemVyIGluc3RydW1lbnRhdGlvbi4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvZGVidWdfd2ViX3NlcnZlci5jYyBiL3NyYy9jb2JhbHQvZGVidWcvZGVidWdfd2ViX3NlcnZlci5jYwppbmRleCA2ZmZkMTUyLi5iYWEwZmI5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RlYnVnL2RlYnVnX3dlYl9zZXJ2ZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9kZWJ1Z193ZWJfc2VydmVyLmNjCkBAIC0zMCwxMiArMzAsNyBAQAogI2luY2x1ZGUgIm5ldC9iYXNlL25ldF9lcnJvcnMuaCIKICNpbmNsdWRlICJuZXQvYmFzZS90Y3BfbGlzdGVuX3NvY2tldC5oIgogI2luY2x1ZGUgIm5ldC9zZXJ2ZXIvaHR0cF9zZXJ2ZXJfcmVxdWVzdF9pbmZvLmgiCi0KLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykKLSNpbmNsdWRlICJsYl9uZXR3b3JrX2hlbHBlcnMuaCIgIC8vIE5PTElOVFtidWlsZC9pbmNsdWRlXQotI2VsaWYgZGVmaW5lZChPU19TVEFSQk9BUkQpCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NvY2tldC5oIgotI2VuZGlmCiAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIGRlYnVnIHsKQEAgLTg0LDcgKzc5LDYgQEAKICAgbmV0OjpJUEVuZFBvaW50IGlwX2FkZHI7CiAgIFNiU29ja2V0QWRkcmVzcyBsb2NhbF9pcDsKICAgU2JNZW1vcnlTZXQoJmxvY2FsX2lwLCAwLCBzaXplb2YobG9jYWxfaXApKTsKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CiAKICAgLy8gUHJlZmVyIElQdjQgYWRkcmVzc2VzLCBhcyB0aGV5J3JlIGVhc2llciB0byB0eXBlIGZvciBkZWJ1Z2dpbmcuCkBAIC0xMDksMTkgKzEwMyw2IEBACiAgICAgRExPRyhXQVJOSU5HKSA8PCAiVW5hYmxlIHRvIGdldCBhIGxvY2FsIGludGVyZmFjZSBhZGRyZXNzLiI7CiAgICAgcmV0dXJuIGJhc2U6Om51bGxvcHQ7CiAgIH0KLSNlbHNlCi0gIGJvb2wgcmVzdWx0ID0gU2JTb2NrZXRHZXRMb2NhbEludGVyZmFjZUFkZHJlc3MoJmxvY2FsX2lwKTsKLSAgaWYgKCFyZXN1bHQpIHsKLSAgICBETE9HKFdBUk5JTkcpIDw8ICJVbmFibGUgdG8gZ2V0IGEgbG9jYWwgaW50ZXJmYWNlIGFkZHJlc3MuIjsKLSAgICByZXR1cm4gYmFzZTo6bnVsbG9wdDsKLSAgfQotCi0gIHJlc3VsdCA9IGlwX2FkZHIuRnJvbVNiU29ja2V0QWRkcmVzcygmbG9jYWxfaXApOwotICBpZiAoIXJlc3VsdCkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiR290IGludmFsaWQgbG9jYWwgaW50ZXJmYWNlIGFkZHJlc3MuIjsKLSAgICByZXR1cm4gYmFzZTo6bnVsbG9wdDsKLSAgfQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiAKICAgcmV0dXJuIGlwX2FkZHIuVG9TdHJpbmdXaXRob3V0UG9ydCgpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vY3VzdG9tX2V2ZW50LmggYi9zcmMvY29iYWx0L2RvbS9jdXN0b21fZXZlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTVlYjZhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vY3VzdG9tX2V2ZW50LmgKQEAgLTAsMCArMSw3NiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfRE9NX0NVU1RPTV9FVkVOVF9IXworI2RlZmluZSBDT0JBTFRfRE9NX0NVU1RPTV9FVkVOVF9IXworCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiY29iYWx0L2RvbS9jdXN0b21fZXZlbnRfaW5pdC5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3ZhbHVlX2hhbmRsZS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBkb20geworCisvLyBFdmVudHMgdXNpbmcgdGhlIEN1c3RvbUV2ZW50IGludGVyZmFjZSBjYW4gYmUgdXNlZCB0byBjYXJyeSBjdXN0b20gZGF0YS4KKy8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTUvUkVDLWRvbS0yMDE1MTExOS8jY3VzdG9tZXZlbnQKK2NsYXNzIEN1c3RvbUV2ZW50IDogcHVibGljIEV2ZW50IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEN1c3RvbUV2ZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlKSA6IEV2ZW50KHR5cGUpIHt9CisgIEN1c3RvbUV2ZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLCBjb25zdCBDdXN0b21FdmVudEluaXQmIGluaXRfZGljdCkKKyAgICAgIDogRXZlbnQodHlwZSwgaW5pdF9kaWN0KSB7CisgICAgc2V0X2RldGFpbChpbml0X2RpY3QuZGV0YWlsKCkpOworICB9CisKKyAgLy8gQ3JlYXRlcyBhbiBldmVudCB3aXRoIGl0cyAiaW5pdGlhbGl6ZWQgZmxhZyIgdW5zZXQuCisgIGV4cGxpY2l0IEN1c3RvbUV2ZW50KFVuaW5pdGlhbGl6ZWRGbGFnIHVuaW5pdGlhbGl6ZWRfZmxhZykKKyAgICAgIDogRXZlbnQodW5pbml0aWFsaXplZF9mbGFnKSB7fQorCisgIC8vIFdlYiBBUEk6IEN1c3RvbUV2ZW50CisgIC8vCisgIHZvaWQgSW5pdEN1c3RvbUV2ZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLCBib29sIGJ1YmJsZXMsIGJvb2wgY2FuY2VsYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0OjpWYWx1ZUhhbmRsZUhvbGRlciYgZGV0YWlsKSB7CisgICAgSW5pdEV2ZW50KHR5cGUsIGJ1YmJsZXMsIGNhbmNlbGFibGUpOworICAgIHNldF9kZXRhaWwoJmRldGFpbCk7CisgIH0KKworICB2b2lkIHNldF9kZXRhaWwoY29uc3Qgc2NyaXB0OjpWYWx1ZUhhbmRsZUhvbGRlciogZGV0YWlsKSB7CisgICAgaWYgKGRldGFpbCkgeworICAgICAgZGV0YWlsXy5yZXNldChuZXcgc2NyaXB0OjpWYWx1ZUhhbmRsZUhvbGRlcjo6UmVmZXJlbmNlKHRoaXMsICpkZXRhaWwpKTsKKyAgICB9IGVsc2UgeworICAgICAgZGV0YWlsXy5yZXNldCgpOworICAgIH0KKyAgfQorCisgIGNvbnN0IHNjcmlwdDo6VmFsdWVIYW5kbGVIb2xkZXIqIGRldGFpbCgpIGNvbnN0IHsKKyAgICBpZiAoIWRldGFpbF8pIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiAmKGRldGFpbF8tPnJlZmVyZW5jZWRfdmFsdWUoKSk7CisgIH0KKworICBERUZJTkVfV1JBUFBBQkxFX1RZUEUoQ3VzdG9tRXZlbnQpOworCisgcHJvdGVjdGVkOgorICB+Q3VzdG9tRXZlbnQoKSBPVkVSUklERSB7fQorCisgIHNjb3BlZF9wdHI8c2NyaXB0OjpWYWx1ZUhhbmRsZUhvbGRlcjo6UmVmZXJlbmNlPiBkZXRhaWxfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGRvbQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9ET01fQ1VTVE9NX0VWRU5UX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9jdXN0b21fZXZlbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vY3VzdG9tX2V2ZW50LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDRmNTU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vY3VzdG9tX2V2ZW50LmlkbApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNS9SRUMtZG9tLTIwMTUxMTE5LyNjdXN0b21ldmVudAorW0NvbnN0cnVjdG9yKERPTVN0cmluZyB0eXBlLCBvcHRpb25hbCBDdXN0b21FdmVudEluaXQgZXZlbnRJbml0RGljdCldCitpbnRlcmZhY2UgQ3VzdG9tRXZlbnQgOiBFdmVudCB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBhbnkgZGV0YWlsOworCisgIHZvaWQgaW5pdEN1c3RvbUV2ZW50KERPTVN0cmluZyB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGJ1YmJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gY2FuY2VsYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYW55IGRldGFpbCk7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vY3VzdG9tX2V2ZW50X2luaXQuaWRsIGIvc3JjL2NvYmFsdC9kb20vY3VzdG9tX2V2ZW50X2luaXQuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NjcwNzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9jdXN0b21fZXZlbnRfaW5pdC5pZGwKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2RvbS8jY3VzdG9tZXZlbnRpbml0CisKK2RpY3Rpb25hcnkgQ3VzdG9tRXZlbnRJbml0IDogRXZlbnRJbml0IHsKKyAgYW55IGRldGFpbCA9IG51bGw7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vY3VzdG9tX2V2ZW50X3Rlc3QuY2MgYi9zcmMvY29iYWx0L2RvbS9jdXN0b21fZXZlbnRfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGI0YzQyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vY3VzdG9tX2V2ZW50X3Rlc3QuY2MKQEAgLTAsMCArMSwxOTggQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2N1c3RvbV9ldmVudC5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiYmFzZS9iaW5kLmgiCisjaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKKyNpbmNsdWRlICJjb2JhbHQvY3NzX3BhcnNlci9wYXJzZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2N1c3RvbV9ldmVudF9pbml0LmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9sb2NhbF9zdG9yYWdlX2RhdGFiYXNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS90ZXN0aW5nL2d0ZXN0X3dvcmthcm91bmRzLmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS93aW5kb3cuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tX3BhcnNlci9wYXJzZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2ZldGNoZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9tZWRpYV9tb2R1bGVfc3R1Yi5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYV9zZXNzaW9uL21lZGlhX3Nlc3Npb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvbmV0d29yay9uZXR3b3JrX21vZHVsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9qYXZhc2NyaXB0X2VuZ2luZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc291cmNlX2NvZGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Rlc3RpbmcvZmFrZV9zY3JpcHRfdmFsdWUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3ZhbHVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisjaW5jbHVkZSAibmIvcG9pbnRlcl9hcml0aG1ldGljLmgiCisjaW5jbHVkZSAidGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGRvbSB7CisKK3VzaW5nIDo6Y29iYWx0OjpzY3JpcHQ6OnRlc3Rpbmc6OkZha2VTY3JpcHRWYWx1ZTsKKworY2xhc3MgTW9ja0Vycm9yQ2FsbGJhY2sgOiBwdWJsaWMgYmFzZTo6Q2FsbGJhY2s8dm9pZChjb25zdCBzdGQ6OnN0cmluZyYpPiB7CisgcHVibGljOgorICBNT0NLX01FVEhPRDEoUnVuLCB2b2lkKGNvbnN0IHN0ZDo6c3RyaW5nJikpOworfTsKKworbmFtZXNwYWNlIHsKK2NsYXNzIEN1c3RvbUV2ZW50VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgQ3VzdG9tRXZlbnRUZXN0KCkKKyAgICAgIDogZW52aXJvbm1lbnRfc2V0dGluZ3NfKG5ldyBzY3JpcHQ6OkVudmlyb25tZW50U2V0dGluZ3MpLAorICAgICAgICBtZXNzYWdlX2xvb3BfKE1lc3NhZ2VMb29wOjpUWVBFX0RFRkFVTFQpLAorICAgICAgICBjc3NfcGFyc2VyXyhjc3NfcGFyc2VyOjpQYXJzZXI6OkNyZWF0ZSgpKSwKKyAgICAgICAgZG9tX3BhcnNlcl8obmV3IGRvbV9wYXJzZXI6OlBhcnNlcihtb2NrX2Vycm9yX2NhbGxiYWNrXykpLAorICAgICAgICBmZXRjaGVyX2ZhY3RvcnlfKG5ldyBsb2FkZXI6OkZldGNoZXJGYWN0b3J5KCZuZXR3b3JrX21vZHVsZV8pKSwKKyAgICAgICAgbG9jYWxfc3RvcmFnZV9kYXRhYmFzZV8oTlVMTCksCisgICAgICAgIHN0dWJfbWVkaWFfbW9kdWxlXyhuZXcgbWVkaWE6Ok1lZGlhTW9kdWxlU3R1YigpKSwKKyAgICAgICAgdXJsXygiYWJvdXQ6YmxhbmsiKSwKKyAgICAgICAgd2luZG93XyhuZXcgV2luZG93KAorICAgICAgICAgICAgMTkyMCwgMTA4MCwgMS5mLCBiYXNlOjprQXBwbGljYXRpb25TdGF0ZVN0YXJ0ZWQsIGNzc19wYXJzZXJfLmdldCgpLAorICAgICAgICAgICAgZG9tX3BhcnNlcl8uZ2V0KCksIGZldGNoZXJfZmFjdG9yeV8uZ2V0KCksIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICBOVUxMLCBOVUxMLCAmbG9jYWxfc3RvcmFnZV9kYXRhYmFzZV8sIHN0dWJfbWVkaWFfbW9kdWxlXy5nZXQoKSwKKyAgICAgICAgICAgIHN0dWJfbWVkaWFfbW9kdWxlXy5nZXQoKSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgdXJsXywgIiIsCisgICAgICAgICAgICAiZW4tVVMiLCBiYXNlOjpDYWxsYmFjazx2b2lkKGNvbnN0IEdVUkwmKT4oKSwKKyAgICAgICAgICAgIGJhc2U6OkJpbmQoJk1vY2tFcnJvckNhbGxiYWNrOjpSdW4sCisgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoJm1vY2tfZXJyb3JfY2FsbGJhY2tfKSksCisgICAgICAgICAgICBOVUxMLCBuZXR3b3JrX2JyaWRnZTo6UG9zdFNlbmRlcigpLAorICAgICAgICAgICAgc3RkOjpzdHJpbmcoKSAvKiBkZWZhdWx0IHNlY3VyaXR5IHBvbGljeSAqLywga0NzcEVuZm9yY2VtZW50RW5hYmxlLAorICAgICAgICAgICAgYmFzZTo6Q2xvc3VyZSgpIC8qIGNzcF9wb2xpY3lfY2hhbmdlZCAqLywKKyAgICAgICAgICAgIGJhc2U6OkNsb3N1cmUoKSAvKiByYW5fYW5pbWF0aW9uX2ZyYW1lX2NhbGxiYWNrcyAqLywKKyAgICAgICAgICAgIGJhc2U6OkNsb3N1cmUoKSAvKiB3aW5kb3dfY2xvc2UgKi8sCisgICAgICAgICAgICBiYXNlOjpDbG9zdXJlKCkgLyogd2luZG93X21pbmltaXplICovLCBOVUxMLCBOVUxMKSkgeworICAgIGVuZ2luZV8gPSBzY3JpcHQ6OkphdmFTY3JpcHRFbmdpbmU6OkNyZWF0ZUVuZ2luZSgKKyAgICAgICAgc2NyaXB0OjpKYXZhU2NyaXB0RW5naW5lOjpPcHRpb25zKCkpOworICAgIGdsb2JhbF9lbnZpcm9ubWVudF8gPSBlbmdpbmVfLT5DcmVhdGVHbG9iYWxFbnZpcm9ubWVudCgpOworICAgIGdsb2JhbF9lbnZpcm9ubWVudF8tPkNyZWF0ZUdsb2JhbE9iamVjdCh3aW5kb3dfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudF9zZXR0aW5nc18uZ2V0KCkpOworICB9CisKKyAgYm9vbCBFdmFsdWF0ZVNjcmlwdChjb25zdCBzdGQ6OnN0cmluZyYganNfY29kZSwgc3RkOjpzdHJpbmcqIHJlc3VsdCk7CisKKyBwcml2YXRlOgorICBzY29wZWRfcHRyPHNjcmlwdDo6SmF2YVNjcmlwdEVuZ2luZT4gZW5naW5lXzsKKyAgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50PiBnbG9iYWxfZW52aXJvbm1lbnRfOworCisgIGNvbnN0IHNjb3BlZF9wdHI8c2NyaXB0OjpFbnZpcm9ubWVudFNldHRpbmdzPiBlbnZpcm9ubWVudF9zZXR0aW5nc187CisgIE1lc3NhZ2VMb29wIG1lc3NhZ2VfbG9vcF87CisgIE1vY2tFcnJvckNhbGxiYWNrIG1vY2tfZXJyb3JfY2FsbGJhY2tfOworICBzY29wZWRfcHRyPGNzc19wYXJzZXI6OlBhcnNlcj4gY3NzX3BhcnNlcl87CisgIHNjb3BlZF9wdHI8ZG9tX3BhcnNlcjo6UGFyc2VyPiBkb21fcGFyc2VyXzsKKyAgbmV0d29yazo6TmV0d29ya01vZHVsZSBuZXR3b3JrX21vZHVsZV87CisgIHNjb3BlZF9wdHI8bG9hZGVyOjpGZXRjaGVyRmFjdG9yeT4gZmV0Y2hlcl9mYWN0b3J5XzsKKyAgZG9tOjpMb2NhbFN0b3JhZ2VEYXRhYmFzZSBsb2NhbF9zdG9yYWdlX2RhdGFiYXNlXzsKKyAgc2NvcGVkX3B0cjxtZWRpYTo6TWVkaWFNb2R1bGU+IHN0dWJfbWVkaWFfbW9kdWxlXzsKKyAgR1VSTCB1cmxfOworICBjb25zdCBzY29wZWRfcmVmcHRyPFdpbmRvdz4gd2luZG93XzsKK307CisKK2Jvb2wgQ3VzdG9tRXZlbnRUZXN0OjpFdmFsdWF0ZVNjcmlwdChjb25zdCBzdGQ6OnN0cmluZyYganNfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogcmVzdWx0KSB7CisgIERDSEVDSyhnbG9iYWxfZW52aXJvbm1lbnRfKTsKKyAgRENIRUNLKHJlc3VsdCk7CisgIHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpTb3VyY2VDb2RlPiBzb3VyY2VfY29kZSA9CisgICAgICBzY3JpcHQ6OlNvdXJjZUNvZGU6OkNyZWF0ZVNvdXJjZUNvZGUoCisgICAgICAgICAganNfY29kZSwgYmFzZTo6U291cmNlTG9jYXRpb24oX19GSUxFX18sIF9fTElORV9fLCAxKSk7CisKKyAgZ2xvYmFsX2Vudmlyb25tZW50Xy0+RW5hYmxlRXZhbCgpOworICBnbG9iYWxfZW52aXJvbm1lbnRfLT5TZXRSZXBvcnRFdmFsQ2FsbGJhY2soYmFzZTo6Q2xvc3VyZSgpKTsKKyAgYm9vbCBzdWNjZWVkZWQgPSBnbG9iYWxfZW52aXJvbm1lbnRfLT5FdmFsdWF0ZVNjcmlwdChzb3VyY2VfY29kZSwgcmVzdWx0KTsKKyAgcmV0dXJuIHN1Y2NlZWRlZDsKK30KK30gIC8vIG5hbWVzcGFjZQorCitURVNUX0YoQ3VzdG9tRXZlbnRUZXN0LCBDb25zdHJ1Y3RvcldpdGhFdmVudFR5cGVTdHJpbmcpIHsKKyAgc2NvcGVkX3JlZnB0cjxDdXN0b21FdmVudD4gZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoIm15dGVzdGV2ZW50Iik7CisKKyAgRVhQRUNUX0VRKCJteXRlc3RldmVudCIsIGV2ZW50LT50eXBlKCkpOworICBFWFBFQ1RfRVEoTlVMTCwgZXZlbnQtPnRhcmdldCgpKTsKKyAgRVhQRUNUX0VRKE5VTEwsIGV2ZW50LT5jdXJyZW50X3RhcmdldCgpKTsKKyAgRVhQRUNUX0VRKEV2ZW50OjprTm9uZSwgZXZlbnQtPmV2ZW50X3BoYXNlKCkpOworICBFWFBFQ1RfRkFMU0UoZXZlbnQtPmJ1YmJsZXMoKSk7CisgIEVYUEVDVF9GQUxTRShldmVudC0+Y2FuY2VsYWJsZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKGV2ZW50LT5kZWZhdWx0X3ByZXZlbnRlZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKGV2ZW50LT5Jc0JlaW5nRGlzcGF0Y2hlZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKGV2ZW50LT5wcm9wYWdhdGlvbl9zdG9wcGVkKCkpOworICBFWFBFQ1RfRkFMU0UoZXZlbnQtPmltbWVkaWF0ZV9wcm9wYWdhdGlvbl9zdG9wcGVkKCkpOworICBFWFBFQ1RfRVEoTlVMTCwgZXZlbnQtPmRldGFpbCgpKTsKK30KKworVEVTVF9GKEN1c3RvbUV2ZW50VGVzdCwgQ29uc3RydWN0b3JXaXRoRXZlbnRUeXBlQW5kRGVmYXVsdEluaXREaWN0KSB7CisgIEN1c3RvbUV2ZW50SW5pdCBpbml0OworICBzY29wZWRfcmVmcHRyPEN1c3RvbUV2ZW50PiBldmVudCA9IG5ldyBDdXN0b21FdmVudCgibXl0ZXN0ZXZlbnQiLCBpbml0KTsKKworICBFWFBFQ1RfRVEoIm15dGVzdGV2ZW50IiwgZXZlbnQtPnR5cGUoKSk7CisgIEVYUEVDVF9FUShOVUxMLCBldmVudC0+dGFyZ2V0KCkpOworICBFWFBFQ1RfRVEoTlVMTCwgZXZlbnQtPmN1cnJlbnRfdGFyZ2V0KCkpOworICBFWFBFQ1RfRVEoRXZlbnQ6OmtOb25lLCBldmVudC0+ZXZlbnRfcGhhc2UoKSk7CisgIEVYUEVDVF9GQUxTRShldmVudC0+YnViYmxlcygpKTsKKyAgRVhQRUNUX0ZBTFNFKGV2ZW50LT5jYW5jZWxhYmxlKCkpOworICBFWFBFQ1RfRkFMU0UoZXZlbnQtPmRlZmF1bHRfcHJldmVudGVkKCkpOworICBFWFBFQ1RfRkFMU0UoZXZlbnQtPklzQmVpbmdEaXNwYXRjaGVkKCkpOworICBFWFBFQ1RfRkFMU0UoZXZlbnQtPnByb3BhZ2F0aW9uX3N0b3BwZWQoKSk7CisgIEVYUEVDVF9GQUxTRShldmVudC0+aW1tZWRpYXRlX3Byb3BhZ2F0aW9uX3N0b3BwZWQoKSk7CisgIEVYUEVDVF9FUShOVUxMLCBldmVudC0+ZGV0YWlsKCkpOworfQorCitURVNUX0YoQ3VzdG9tRXZlbnRUZXN0LCBDb25zdHJ1Y3RvcldpdGhFdmVudFR5cGVBbmRDdXN0b21Jbml0RGljdCkgeworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIGJvb2wgc3VjY2VzcyA9IEV2YWx1YXRlU2NyaXB0KAorICAgICAgInZhciBldmVudCA9IG5ldyBDdXN0b21FdmVudCgnZG9nJywgIgorICAgICAgIiAgICB7J2J1YmJsZXMnOnRydWUsICIKKyAgICAgICIgICAgICdjYW5jZWxhYmxlJzp0cnVlLCAiCisgICAgICAiICAgICAnZGV0YWlsJzp7J2NvYmFsdCc6J3J1bGV6J319KTsiCisgICAgICAiaWYgKGV2ZW50LnR5cGUgPT0gJ2RvZycgJiYiCisgICAgICAiICAgIGV2ZW50LmJ1YmJsZXMgPT0gdHJ1ZSAmJiIKKyAgICAgICIgICAgZXZlbnQuY2FuY2VsYWJsZSA9PSB0cnVlKSAiCisgICAgICAiICAgIGV2ZW50LmRldGFpbC5jb2JhbHQ7IiwKKyAgICAgICZyZXN1bHQpOworICBFWFBFQ1RfRVEoInJ1bGV6IiwgcmVzdWx0KTsKKworICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICBETE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGV2YWx1YXRlIHRlc3Q6ICIKKyAgICAgICAgICAgICAgICA8PCAiXCIiIDw8IHJlc3VsdCA8PCAiXCIiOworICB9IGVsc2UgeworICAgIExPRyhJTkZPKSA8PCAiVGVzdCByZXN1bHQgOiAiCisgICAgICAgICAgICAgIDw8ICJcIiIgPDwgcmVzdWx0IDw8ICJcIiI7CisgIH0KK30KKworVEVTVF9GKEN1c3RvbUV2ZW50VGVzdCwgSW5pdEN1c3RvbUV2ZW50KSB7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgYm9vbCBzdWNjZXNzID0gRXZhbHVhdGVTY3JpcHQoCisgICAgICAidmFyIGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdjYXQnKTtcbiIKKyAgICAgICJldmVudC5pbml0Q3VzdG9tRXZlbnQoJ2RvZycsIHRydWUsIHRydWUsIHtjb2JhbHQ6J3J1bGV6J30pOyIKKyAgICAgICJpZiAoZXZlbnQudHlwZSA9PSAnZG9nJyAmJiIKKyAgICAgICIgICAgZXZlbnQuZGV0YWlsICYmIgorICAgICAgIiAgICBldmVudC5idWJibGVzID09IHRydWUgJiYiCisgICAgICAiICAgIGV2ZW50LmNhbmNlbGFibGUgPT0gdHJ1ZSkgIgorICAgICAgIiAgICBldmVudC5kZXRhaWwuY29iYWx0OyIsCisgICAgICAmcmVzdWx0KTsKKyAgRVhQRUNUX0VRKCJydWxleiIsIHJlc3VsdCk7CisKKyAgaWYgKCFzdWNjZXNzKSB7CisgICAgRExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBldmFsdWF0ZSB0ZXN0OiAiCisgICAgICAgICAgICAgICAgPDwgIlwiIiA8PCByZXN1bHQgPDwgIlwiIjsKKyAgfSBlbHNlIHsKKyAgICBMT0coSU5GTykgPDwgIlRlc3QgcmVzdWx0IDogIgorICAgICAgICAgICAgICA8PCAiXCIiIDw8IHJlc3VsdCA8PCAiXCIiOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBkb20KK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2RvY3VtZW50LmNjIGIvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnQuY2MKaW5kZXggZmYyNjJjNi4uZWM0MmY0MyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnQuY2MKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2NvbW1lbnQuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2NzcF9kZWxlZ2F0ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vY3NwX2RlbGVnYXRlX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2N1c3RvbV9ldmVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX2V4Y2VwdGlvbi5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX2ltcGxlbWVudGF0aW9uLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9lbGVtZW50LmgiCkBAIC0yNDAsNiArMjQxLDggQEAKICAgfSBlbHNlIGlmIChiYXNlOjpzdHJjYXNlY21wKGludGVyZmFjZV9uYW1lLmNfc3RyKCksICJ1aWV2ZW50IikgPT0gMCB8fAogICAgICAgICAgICAgIGJhc2U6OnN0cmNhc2VjbXAoaW50ZXJmYWNlX25hbWUuY19zdHIoKSwgInVpZXZlbnRzIikgPT0gMCkgewogICAgIHJldHVybiBuZXcgVUlFdmVudChFdmVudDo6VW5pbml0aWFsaXplZCk7CisgIH0gZWxzZSBpZiAoYmFzZTo6c3RyY2FzZWNtcChpbnRlcmZhY2VfbmFtZS5jX3N0cigpLCAiY3VzdG9tZXZlbnQiKSA9PSAwKSB7CisgICAgcmV0dXJuIG5ldyBDdXN0b21FdmVudChFdmVudDo6VW5pbml0aWFsaXplZCk7CiAgIH0KIAogICBET01FeGNlcHRpb246OlJhaXNlKApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnRfdGVzdC5jYyBiL3NyYy9jb2JhbHQvZG9tL2RvY3VtZW50X3Rlc3QuY2MKaW5kZXggMmE0ZWUwNi4uN2U0YzM5MSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnRfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9kb2N1bWVudF90ZXN0LmNjCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2Nzc19zdHlsZV9zaGVldC5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vYXR0ci5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vY29tbWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vY3VzdG9tX2V2ZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9kb21fZXhjZXB0aW9uLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9kb21faW1wbGVtZW50YXRpb24uaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2RvbV9zdGF0X3RyYWNrZXIuaCIKQEAgLTE3Miw2ICsxNzMsMTkgQEAKICAgRVhQRUNUX0ZBTFNFKGV2ZW50LT5pbml0aWFsaXplZF9mbGFnKCkpOwogfQogCitURVNUX0YoRG9jdW1lbnRUZXN0LCBDcmVhdGVFdmVudEN1c3RvbUV2ZW50KSB7CisgIFN0cmljdE1vY2s8TW9ja0V4Y2VwdGlvblN0YXRlPiBleGNlcHRpb25fc3RhdGU7CisgIHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpTY3JpcHRFeGNlcHRpb24+IGV4Y2VwdGlvbjsKKyAgc2NvcGVkX3JlZnB0cjxEb2N1bWVudD4gZG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQoJmh0bWxfZWxlbWVudF9jb250ZXh0Xyk7CisKKyAgLy8gQ3JlYXRlIGFuIEV2ZW50LCB0aGUgbmFtZSBpcyBjYXNlIGluc2Vuc2l0aXZlLgorICBzY29wZWRfcmVmcHRyPEV2ZW50PiBldmVudCA9CisgICAgICBkb2N1bWVudC0+Q3JlYXRlRXZlbnQoIkN1U3RPbUV2RW5UIiwgJmV4Y2VwdGlvbl9zdGF0ZSk7CisgIEVYUEVDVF9UUlVFKGV2ZW50KTsKKyAgRVhQRUNUX0ZBTFNFKGV2ZW50LT5pbml0aWFsaXplZF9mbGFnKCkpOworICBFWFBFQ1RfVFJVRShiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxDdXN0b21FdmVudCo+KGV2ZW50LmdldCgpKSk7Cit9CisKIFRFU1RfRihEb2N1bWVudFRlc3QsIENyZWF0ZUV2ZW50VUlFdmVudCkgewogICBTdHJpY3RNb2NrPE1vY2tFeGNlcHRpb25TdGF0ZT4gZXhjZXB0aW9uX3N0YXRlOwogICBzY29wZWRfcmVmcHRyPHNjcmlwdDo6U2NyaXB0RXhjZXB0aW9uPiBleGNlcHRpb247CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9kb20uZ3lwIGIvc3JjL2NvYmFsdC9kb20vZG9tLmd5cAppbmRleCA4OGVmMjNkLi4yN2E4ZjI5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9kb20uZ3lwCisrKyBiL3NyYy9jb2JhbHQvZG9tL2RvbS5neXAKQEAgLTYyLDYgKzYyLDcgQEAKICAgICAgICAgJ2Nzc19hbmltYXRpb25zX2FkYXB0ZXIuaCcsCiAgICAgICAgICdjc3NfdHJhbnNpdGlvbnNfYWRhcHRlci5jYycsCiAgICAgICAgICdjc3NfdHJhbnNpdGlvbnNfYWRhcHRlci5oJywKKyAgICAgICAgJ2N1c3RvbV9ldmVudC5oJywKICAgICAgICAgJ2RhdGFfdmlldy5jYycsCiAgICAgICAgICdkYXRhX3ZpZXcuaCcsCiAgICAgICAgICdkZXZpY2Vfb3JpZW50YXRpb25fZXZlbnQuY2MnLApAQCAtOTMsOCArOTQsMTAgQEAKICAgICAgICAgJ2RvbV90b2tlbl9saXN0LmgnLAogICAgICAgICAnZWxlbWVudC5jYycsCiAgICAgICAgICdlbGVtZW50LmgnLAorICAgICAgICAnZXJyb3JfZXZlbnQuaCcsCiAgICAgICAgICdldmVudC5jYycsCiAgICAgICAgICdldmVudC5oJywKKyAgICAgICAgJ2V2ZW50X2luaXQuaCcsCiAgICAgICAgICdldmVudF9saXN0ZW5lci5jYycsCiAgICAgICAgICdldmVudF9saXN0ZW5lci5oJywKICAgICAgICAgJ2V2ZW50X3F1ZXVlLmNjJywKQEAgLTEwNSw2ICsxMDgsNyBAQAogICAgICAgICAnZmxvYXQ2NF9hcnJheS5oJywKICAgICAgICAgJ2ZvY3VzX2V2ZW50LmNjJywKICAgICAgICAgJ2ZvY3VzX2V2ZW50LmgnLAorICAgICAgICAnZm9jdXNfZXZlbnRfaW5pdC5oJywKICAgICAgICAgJ2ZvbnRfY2FjaGUuY2MnLAogICAgICAgICAnZm9udF9jYWNoZS5oJywKICAgICAgICAgJ2ZvbnRfZmFjZS5jYycsCkBAIC0xNjQsNiArMTY4LDcgQEAKICAgICAgICAgJ2luaXRpYWxfY29tcHV0ZWRfc3R5bGUuaCcsCiAgICAgICAgICdrZXlib2FyZF9ldmVudC5jYycsCiAgICAgICAgICdrZXlib2FyZF9ldmVudC5oJywKKyAgICAgICAgJ2tleWJvYXJkX2V2ZW50X2luaXQuaCcsCiAgICAgICAgICdrZXljb2RlLmgnLAogICAgICAgICAna2V5ZnJhbWVzX21hcF91cGRhdGVyLmNjJywKICAgICAgICAgJ2tleWZyYW1lc19tYXBfdXBkYXRlci5oJywKQEAgLTE4Miw2ICsxODcsNyBAQAogICAgICAgICAnbWltZV90eXBlX2FycmF5LmgnLAogICAgICAgICAnbW91c2VfZXZlbnQuY2MnLAogICAgICAgICAnbW91c2VfZXZlbnQuaCcsCisgICAgICAgICdtb3VzZV9ldmVudF9pbml0LmgnLAogICAgICAgICAnbXV0YXRpb25fb2JzZXJ2ZXIuY2MnLAogICAgICAgICAnbXV0YXRpb25fb2JzZXJ2ZXIuaCcsCiAgICAgICAgICdtdXRhdGlvbl9vYnNlcnZlcl9pbml0LmgnLApAQCAtMjEyLDYgKzIxOCw3IEBACiAgICAgICAgICdwbHVnaW5fYXJyYXkuaCcsCiAgICAgICAgICdwb2ludGVyX2V2ZW50LmNjJywKICAgICAgICAgJ3BvaW50ZXJfZXZlbnQuaCcsCisgICAgICAgICdwb2ludGVyX2V2ZW50X2luaXQuaCcsCiAgICAgICAgICdwb2ludGVyX3N0YXRlLmNjJywKICAgICAgICAgJ3BvaW50ZXJfc3RhdGUuaCcsCiAgICAgICAgICdwcm9ncmVzc19ldmVudC5jYycsCkBAIC0yNDgsNiArMjU1LDcgQEAKICAgICAgICAgJ3R5cGVkX2FycmF5LmgnLAogICAgICAgICAndWlfZXZlbnQuY2MnLAogICAgICAgICAndWlfZXZlbnQuaCcsCisgICAgICAgICd1aV9ldmVudF9pbml0LmgnLAogICAgICAgICAndWlfZXZlbnRfd2l0aF9rZXlfc3RhdGUuY2MnLAogICAgICAgICAndWlfZXZlbnRfd2l0aF9rZXlfc3RhdGUuaCcsCiAgICAgICAgICd1aW50OF9hcnJheS5oJywKQEAgLTI2MCw2ICsyNjgsNyBAQAogICAgICAgICAndmlkZW9fdHJhY2tfbGlzdC5oJywKICAgICAgICAgJ3doZWVsX2V2ZW50LmNjJywKICAgICAgICAgJ3doZWVsX2V2ZW50LmgnLAorICAgICAgICAnd2hlZWxfZXZlbnRfaW5pdC5oJywKICAgICAgICAgJ3dpbmRvdy5jYycsCiAgICAgICAgICd3aW5kb3cuaCcsCiAgICAgICAgICd3aW5kb3dfdGltZXJzLmNjJywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2RvbV90ZXN0Lmd5cCBiL3NyYy9jb2JhbHQvZG9tL2RvbV90ZXN0Lmd5cAppbmRleCAyYzQxYjgzLi44Y2YyNjZhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9kb21fdGVzdC5neXAKKysrIGIvc3JjL2NvYmFsdC9kb20vZG9tX3Rlc3QuZ3lwCkBAIC0yOCw2ICsyOCw3IEBACiAgICAgICAgICdjb21tZW50X3Rlc3QuY2MnLAogICAgICAgICAnY3J5cHRvX3Rlc3QuY2MnLAogICAgICAgICAnY3NwX2RlbGVnYXRlX3Rlc3QuY2MnLAorICAgICAgICAnY3VzdG9tX2V2ZW50X3Rlc3QuY2MnLAogICAgICAgICAnZGF0YV92aWV3X3Rlc3QuY2MnLAogICAgICAgICAnZG9jdW1lbnRfdGVzdC5jYycsCiAgICAgICAgICdkb2N1bWVudF90eXBlX3Rlc3QuY2MnLApAQCAtMzcsNiArMzgsNyBAQAogICAgICAgICAnZG9tX3N0cmluZ19tYXBfdGVzdC5jYycsCiAgICAgICAgICdkb21fdG9rZW5fbGlzdF90ZXN0LmNjJywKICAgICAgICAgJ2VsZW1lbnRfdGVzdC5jYycsCisgICAgICAgICdlcnJvcl9ldmVudF90ZXN0LmNjJywKICAgICAgICAgJ2V2ZW50X3F1ZXVlX3Rlc3QuY2MnLAogICAgICAgICAnZXZlbnRfdGFyZ2V0X3Rlc3QuY2MnLAogICAgICAgICAnZXZlbnRfdGVzdC5jYycsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9lcnJvcl9ldmVudC5oIGIvc3JjL2NvYmFsdC9kb20vZXJyb3JfZXZlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2IzYjcxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vZXJyb3JfZXZlbnQuaApAQCAtMCwwICsxLDkwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIENPQkFMVF9ET01fRVJST1JfRVZFTlRfSF8KKyNkZWZpbmUgQ09CQUxUX0RPTV9FUlJPUl9FVkVOVF9IXworCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZXJyb3JfZXZlbnRfaW5pdC5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3ZhbHVlX2hhbmRsZS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBkb20geworCisvLyBXaGVuZXZlciBhbiB1bmNhdWdodCBydW50aW1lIHNjcmlwdCBlcnJvciBvY2N1cnMgaW4gb25lIG9mIHRoZSBzY3JpcHRzCisvLyBhc3NvY2lhdGVkIHdpdGggYSBEb2N1bWVudCwgdGhlIHVzZXIgYWdlbnQgbXVzdCByZXBvcnQgdGhlIGVycm9yIGZvciB0aGUKKy8vIHJlbGV2YW50IHNjcmlwdC4KKy8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3dlYmFwcGFwaXMuaHRtbCNlcnJvcmV2ZW50CitjbGFzcyBFcnJvckV2ZW50IDogcHVibGljIEV2ZW50IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEVycm9yRXZlbnQoY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUpCisgICAgICA6IEV2ZW50KHR5cGUpLCBsaW5lbm9fKDApLCBjb2xub18oMCkge30KKyAgRXJyb3JFdmVudChjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwgY29uc3QgRXJyb3JFdmVudEluaXQmIGluaXRfZGljdCkKKyAgICAgIDogRXZlbnQodHlwZSwgaW5pdF9kaWN0KSwKKyAgICAgICAgbWVzc2FnZV8oaW5pdF9kaWN0Lm1lc3NhZ2UoKSksCisgICAgICAgIGZpbGVuYW1lXyhpbml0X2RpY3QuZmlsZW5hbWUoKSksCisgICAgICAgIGxpbmVub18oaW5pdF9kaWN0LmxpbmVubygpKSwKKyAgICAgICAgY29sbm9fKGluaXRfZGljdC5jb2xubygpKSB7CisgICAgSW5pdEVycm9yKGluaXRfZGljdCk7CisgIH0KKyAgRXJyb3JFdmVudChiYXNlOjpUb2tlbiB0eXBlLCBjb25zdCBFcnJvckV2ZW50SW5pdCYgaW5pdF9kaWN0KQorICAgICAgOiBFdmVudCh0eXBlLCBpbml0X2RpY3QpLAorICAgICAgICBtZXNzYWdlXyhpbml0X2RpY3QubWVzc2FnZSgpKSwKKyAgICAgICAgZmlsZW5hbWVfKGluaXRfZGljdC5maWxlbmFtZSgpKSwKKyAgICAgICAgbGluZW5vXyhpbml0X2RpY3QubGluZW5vKCkpLAorICAgICAgICBjb2xub18oaW5pdF9kaWN0LmNvbG5vKCkpIHsKKyAgICBJbml0RXJyb3IoaW5pdF9kaWN0KTsKKyAgfQorCisgIC8vIFdlYiBBUEk6IEVycm9yRXZlbnQKKyAgLy8KKyAgc3RkOjpzdHJpbmcgbWVzc2FnZSgpIGNvbnN0IHsgcmV0dXJuIG1lc3NhZ2VfOyB9CisgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lKCkgY29uc3QgeyByZXR1cm4gZmlsZW5hbWVfOyB9CisgIHVpbnQzMiBsaW5lbm8oKSBjb25zdCB7IHJldHVybiBsaW5lbm9fOyB9CisgIHVpbnQzMiBjb2xubygpIGNvbnN0IHsgcmV0dXJuIGNvbG5vXzsgfQorCisgIGNvbnN0IHNjcmlwdDo6VmFsdWVIYW5kbGVIb2xkZXIqIGVycm9yKCkgY29uc3QgeworICAgIGlmICghZXJyb3JfKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuICYoZXJyb3JfLT5yZWZlcmVuY2VkX3ZhbHVlKCkpOworICB9CisKKyAgREVGSU5FX1dSQVBQQUJMRV9UWVBFKEVycm9yRXZlbnQpOworCisgcHJvdGVjdGVkOgorICB+RXJyb3JFdmVudCgpIE9WRVJSSURFIHt9CisKKyBwcml2YXRlOgorICB2b2lkIEluaXRFcnJvcihjb25zdCBFcnJvckV2ZW50SW5pdCYgaW5pdF9kaWN0KSB7CisgICAgY29uc3Qgc2NyaXB0OjpWYWx1ZUhhbmRsZUhvbGRlciogZXJyb3IgPSBpbml0X2RpY3QuZXJyb3IoKTsKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgIGVycm9yXy5yZXNldChuZXcgc2NyaXB0OjpWYWx1ZUhhbmRsZUhvbGRlcjo6UmVmZXJlbmNlKHRoaXMsICplcnJvcikpOworICAgIH0KKyAgfQorCisgIHN0ZDo6c3RyaW5nIG1lc3NhZ2VfOworICBzdGQ6OnN0cmluZyBmaWxlbmFtZV87CisgIHVpbnQzMiBsaW5lbm9fOworICB1aW50MzIgY29sbm9fOworICBzY29wZWRfcHRyPHNjcmlwdDo6VmFsdWVIYW5kbGVIb2xkZXI6OlJlZmVyZW5jZT4gZXJyb3JfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGRvbQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9ET01fRVJST1JfRVZFTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2Vycm9yX2V2ZW50LmlkbCBiL3NyYy9jb2JhbHQvZG9tL2Vycm9yX2V2ZW50LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGM0Njk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vZXJyb3JfZXZlbnQuaWRsCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS93ZWJhcHBhcGlzLmh0bWwjZXJyb3JldmVudAorCitbQ29uc3RydWN0b3IoRE9NU3RyaW5nIHR5cGUsIG9wdGlvbmFsIEVycm9yRXZlbnRJbml0IGV2ZW50SW5pdERpY3QpXQoraW50ZXJmYWNlIEVycm9yRXZlbnQgOiBFdmVudCB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgbWVzc2FnZTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBmaWxlbmFtZTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbGluZW5vOworICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBjb2xubzsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIGFueSBlcnJvcjsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9lcnJvcl9ldmVudF9pbml0LmlkbCBiL3NyYy9jb2JhbHQvZG9tL2Vycm9yX2V2ZW50X2luaXQuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZTgwYzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9lcnJvcl9ldmVudF9pbml0LmlkbApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvd2ViYXBwYXBpcy5odG1sI2Vycm9yZXZlbnRpbml0CisKK2RpY3Rpb25hcnkgRXJyb3JFdmVudEluaXQgOiBFdmVudEluaXQgeworICBET01TdHJpbmcgbWVzc2FnZSA9ICIiOworICBET01TdHJpbmcgZmlsZW5hbWUgPSAiIjsKKyAgdW5zaWduZWQgbG9uZyBsaW5lbm8gPSAwOworICB1bnNpZ25lZCBsb25nIGNvbG5vID0gMDsKKyAgYW55IGVycm9yID0gbnVsbDsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9lcnJvcl9ldmVudF90ZXN0LmNjIGIvc3JjL2NvYmFsdC9kb20vZXJyb3JfZXZlbnRfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGVhZDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vZXJyb3JfZXZlbnRfdGVzdC5jYwpAQCAtMCwwICsxLDE5MSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImNvYmFsdC9kb20vZXJyb3JfZXZlbnQuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImJhc2UvYmluZC5oIgorI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Nzc19wYXJzZXIvcGFyc2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9lcnJvcl9ldmVudF9pbml0LmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9sb2NhbF9zdG9yYWdlX2RhdGFiYXNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS90ZXN0aW5nL2d0ZXN0X3dvcmthcm91bmRzLmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS93aW5kb3cuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tX3BhcnNlci9wYXJzZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2ZldGNoZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9tZWRpYV9tb2R1bGVfc3R1Yi5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYV9zZXNzaW9uL21lZGlhX3Nlc3Npb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvbmV0d29yay9uZXR3b3JrX21vZHVsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9qYXZhc2NyaXB0X2VuZ2luZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc291cmNlX2NvZGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Rlc3RpbmcvZmFrZV9zY3JpcHRfdmFsdWUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3ZhbHVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisjaW5jbHVkZSAibmIvcG9pbnRlcl9hcml0aG1ldGljLmgiCisjaW5jbHVkZSAidGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGRvbSB7CisKK3VzaW5nIDo6Y29iYWx0OjpzY3JpcHQ6OnRlc3Rpbmc6OkZha2VTY3JpcHRWYWx1ZTsKKworY2xhc3MgTW9ja0Vycm9yQ2FsbGJhY2sgOiBwdWJsaWMgYmFzZTo6Q2FsbGJhY2s8dm9pZChjb25zdCBzdGQ6OnN0cmluZyYpPiB7CisgcHVibGljOgorICBNT0NLX01FVEhPRDEoUnVuLCB2b2lkKGNvbnN0IHN0ZDo6c3RyaW5nJikpOworfTsKKworbmFtZXNwYWNlIHsKK2NsYXNzIEVycm9yRXZlbnRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICBFcnJvckV2ZW50VGVzdCgpCisgICAgICA6IGVudmlyb25tZW50X3NldHRpbmdzXyhuZXcgc2NyaXB0OjpFbnZpcm9ubWVudFNldHRpbmdzKSwKKyAgICAgICAgbWVzc2FnZV9sb29wXyhNZXNzYWdlTG9vcDo6VFlQRV9ERUZBVUxUKSwKKyAgICAgICAgY3NzX3BhcnNlcl8oY3NzX3BhcnNlcjo6UGFyc2VyOjpDcmVhdGUoKSksCisgICAgICAgIGRvbV9wYXJzZXJfKG5ldyBkb21fcGFyc2VyOjpQYXJzZXIobW9ja19lcnJvcl9jYWxsYmFja18pKSwKKyAgICAgICAgZmV0Y2hlcl9mYWN0b3J5XyhuZXcgbG9hZGVyOjpGZXRjaGVyRmFjdG9yeSgmbmV0d29ya19tb2R1bGVfKSksCisgICAgICAgIGxvY2FsX3N0b3JhZ2VfZGF0YWJhc2VfKE5VTEwpLAorICAgICAgICBzdHViX21lZGlhX21vZHVsZV8obmV3IG1lZGlhOjpNZWRpYU1vZHVsZVN0dWIoKSksCisgICAgICAgIHVybF8oImFib3V0OmJsYW5rIiksCisgICAgICAgIHdpbmRvd18obmV3IFdpbmRvdygKKyAgICAgICAgICAgIDE5MjAsIDEwODAsIDEuZiwgYmFzZTo6a0FwcGxpY2F0aW9uU3RhdGVTdGFydGVkLCBjc3NfcGFyc2VyXy5nZXQoKSwKKyAgICAgICAgICAgIGRvbV9wYXJzZXJfLmdldCgpLCBmZXRjaGVyX2ZhY3RvcnlfLmdldCgpLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgTlVMTCwgTlVMTCwgJmxvY2FsX3N0b3JhZ2VfZGF0YWJhc2VfLCBzdHViX21lZGlhX21vZHVsZV8uZ2V0KCksCisgICAgICAgICAgICBzdHViX21lZGlhX21vZHVsZV8uZ2V0KCksIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIHVybF8sICIiLAorICAgICAgICAgICAgImVuLVVTIiwgYmFzZTo6Q2FsbGJhY2s8dm9pZChjb25zdCBHVVJMJik+KCksCisgICAgICAgICAgICBiYXNlOjpCaW5kKCZNb2NrRXJyb3JDYWxsYmFjazo6UnVuLAorICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKCZtb2NrX2Vycm9yX2NhbGxiYWNrXykpLAorICAgICAgICAgICAgTlVMTCwgbmV0d29ya19icmlkZ2U6OlBvc3RTZW5kZXIoKSwKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCkgLyogZGVmYXVsdCBzZWN1cml0eSBwb2xpY3kgKi8sIGtDc3BFbmZvcmNlbWVudEVuYWJsZSwKKyAgICAgICAgICAgIGJhc2U6OkNsb3N1cmUoKSAvKiBjc3BfcG9saWN5X2NoYW5nZWQgKi8sCisgICAgICAgICAgICBiYXNlOjpDbG9zdXJlKCkgLyogcmFuX2FuaW1hdGlvbl9mcmFtZV9jYWxsYmFja3MgKi8sCisgICAgICAgICAgICBiYXNlOjpDbG9zdXJlKCkgLyogd2luZG93X2Nsb3NlICovLAorICAgICAgICAgICAgYmFzZTo6Q2xvc3VyZSgpIC8qIHdpbmRvd19taW5pbWl6ZSAqLywgTlVMTCwgTlVMTCkpIHsKKyAgICBlbmdpbmVfID0gc2NyaXB0OjpKYXZhU2NyaXB0RW5naW5lOjpDcmVhdGVFbmdpbmUoCisgICAgICAgIHNjcmlwdDo6SmF2YVNjcmlwdEVuZ2luZTo6T3B0aW9ucygpKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnRfID0gZW5naW5lXy0+Q3JlYXRlR2xvYmFsRW52aXJvbm1lbnQoKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnRfLT5DcmVhdGVHbG9iYWxPYmplY3Qod2luZG93XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRfc2V0dGluZ3NfLmdldCgpKTsKKyAgfQorCisgIGJvb2wgRXZhbHVhdGVTY3JpcHQoY29uc3Qgc3RkOjpzdHJpbmcmIGpzX2NvZGUsIHN0ZDo6c3RyaW5nKiByZXN1bHQpOworCisgcHJpdmF0ZToKKyAgc2NvcGVkX3B0cjxzY3JpcHQ6OkphdmFTY3JpcHRFbmdpbmU+IGVuZ2luZV87CisgIHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudD4gZ2xvYmFsX2Vudmlyb25tZW50XzsKKworICBjb25zdCBzY29wZWRfcHRyPHNjcmlwdDo6RW52aXJvbm1lbnRTZXR0aW5ncz4gZW52aXJvbm1lbnRfc2V0dGluZ3NfOworICBNZXNzYWdlTG9vcCBtZXNzYWdlX2xvb3BfOworICBNb2NrRXJyb3JDYWxsYmFjayBtb2NrX2Vycm9yX2NhbGxiYWNrXzsKKyAgc2NvcGVkX3B0cjxjc3NfcGFyc2VyOjpQYXJzZXI+IGNzc19wYXJzZXJfOworICBzY29wZWRfcHRyPGRvbV9wYXJzZXI6OlBhcnNlcj4gZG9tX3BhcnNlcl87CisgIG5ldHdvcms6Ok5ldHdvcmtNb2R1bGUgbmV0d29ya19tb2R1bGVfOworICBzY29wZWRfcHRyPGxvYWRlcjo6RmV0Y2hlckZhY3Rvcnk+IGZldGNoZXJfZmFjdG9yeV87CisgIGRvbTo6TG9jYWxTdG9yYWdlRGF0YWJhc2UgbG9jYWxfc3RvcmFnZV9kYXRhYmFzZV87CisgIHNjb3BlZF9wdHI8bWVkaWE6Ok1lZGlhTW9kdWxlPiBzdHViX21lZGlhX21vZHVsZV87CisgIEdVUkwgdXJsXzsKKyAgY29uc3Qgc2NvcGVkX3JlZnB0cjxXaW5kb3c+IHdpbmRvd187Cit9OworCitib29sIEVycm9yRXZlbnRUZXN0OjpFdmFsdWF0ZVNjcmlwdChjb25zdCBzdGQ6OnN0cmluZyYganNfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiByZXN1bHQpIHsKKyAgRENIRUNLKGdsb2JhbF9lbnZpcm9ubWVudF8pOworICBEQ0hFQ0socmVzdWx0KTsKKyAgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OlNvdXJjZUNvZGU+IHNvdXJjZV9jb2RlID0KKyAgICAgIHNjcmlwdDo6U291cmNlQ29kZTo6Q3JlYXRlU291cmNlQ29kZSgKKyAgICAgICAgICBqc19jb2RlLCBiYXNlOjpTb3VyY2VMb2NhdGlvbihfX0ZJTEVfXywgX19MSU5FX18sIDEpKTsKKworICBnbG9iYWxfZW52aXJvbm1lbnRfLT5FbmFibGVFdmFsKCk7CisgIGdsb2JhbF9lbnZpcm9ubWVudF8tPlNldFJlcG9ydEV2YWxDYWxsYmFjayhiYXNlOjpDbG9zdXJlKCkpOworICBib29sIHN1Y2NlZWRlZCA9IGdsb2JhbF9lbnZpcm9ubWVudF8tPkV2YWx1YXRlU2NyaXB0KHNvdXJjZV9jb2RlLCByZXN1bHQpOworICByZXR1cm4gc3VjY2VlZGVkOworfQorfSAgLy8gbmFtZXNwYWNlCisKK1RFU1RfRihFcnJvckV2ZW50VGVzdCwgQ29uc3RydWN0b3JXaXRoRXZlbnRUeXBlU3RyaW5nKSB7CisgIHNjb3BlZF9yZWZwdHI8RXJyb3JFdmVudD4gZXZlbnQgPSBuZXcgRXJyb3JFdmVudCgibXl0ZXN0ZXZlbnQiKTsKKworICBFWFBFQ1RfRVEoIm15dGVzdGV2ZW50IiwgZXZlbnQtPnR5cGUoKSk7CisgIEVYUEVDVF9FUShOVUxMLCBldmVudC0+dGFyZ2V0KCkpOworICBFWFBFQ1RfRVEoTlVMTCwgZXZlbnQtPmN1cnJlbnRfdGFyZ2V0KCkpOworICBFWFBFQ1RfRVEoRXZlbnQ6OmtOb25lLCBldmVudC0+ZXZlbnRfcGhhc2UoKSk7CisgIEVYUEVDVF9GQUxTRShldmVudC0+YnViYmxlcygpKTsKKyAgRVhQRUNUX0ZBTFNFKGV2ZW50LT5jYW5jZWxhYmxlKCkpOworICBFWFBFQ1RfRkFMU0UoZXZlbnQtPmRlZmF1bHRfcHJldmVudGVkKCkpOworICBFWFBFQ1RfRkFMU0UoZXZlbnQtPklzQmVpbmdEaXNwYXRjaGVkKCkpOworICBFWFBFQ1RfRkFMU0UoZXZlbnQtPnByb3BhZ2F0aW9uX3N0b3BwZWQoKSk7CisgIEVYUEVDVF9GQUxTRShldmVudC0+aW1tZWRpYXRlX3Byb3BhZ2F0aW9uX3N0b3BwZWQoKSk7CisgIEVYUEVDVF9FUSgiIiwgZXZlbnQtPm1lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSgiIiwgZXZlbnQtPmZpbGVuYW1lKCkpOworICBFWFBFQ1RfRVEoMCwgZXZlbnQtPmxpbmVubygpKTsKKyAgRVhQRUNUX0VRKDAsIGV2ZW50LT5jb2xubygpKTsKKyAgRVhQRUNUX0VRKE5VTEwsIGV2ZW50LT5lcnJvcigpKTsKK30KKworVEVTVF9GKEVycm9yRXZlbnRUZXN0LCBDb25zdHJ1Y3RvcldpdGhFdmVudFR5cGVBbmREZWZhdWx0SW5pdERpY3QpIHsKKyAgRXJyb3JFdmVudEluaXQgaW5pdDsKKyAgc2NvcGVkX3JlZnB0cjxFcnJvckV2ZW50PiBldmVudCA9IG5ldyBFcnJvckV2ZW50KCJteXRlc3RldmVudCIsIGluaXQpOworCisgIEVYUEVDVF9FUSgibXl0ZXN0ZXZlbnQiLCBldmVudC0+dHlwZSgpKTsKKyAgRVhQRUNUX0VRKE5VTEwsIGV2ZW50LT50YXJnZXQoKSk7CisgIEVYUEVDVF9FUShOVUxMLCBldmVudC0+Y3VycmVudF90YXJnZXQoKSk7CisgIEVYUEVDVF9FUShFdmVudDo6a05vbmUsIGV2ZW50LT5ldmVudF9waGFzZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKGV2ZW50LT5idWJibGVzKCkpOworICBFWFBFQ1RfRkFMU0UoZXZlbnQtPmNhbmNlbGFibGUoKSk7CisgIEVYUEVDVF9GQUxTRShldmVudC0+ZGVmYXVsdF9wcmV2ZW50ZWQoKSk7CisgIEVYUEVDVF9GQUxTRShldmVudC0+SXNCZWluZ0Rpc3BhdGNoZWQoKSk7CisgIEVYUEVDVF9GQUxTRShldmVudC0+cHJvcGFnYXRpb25fc3RvcHBlZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKGV2ZW50LT5pbW1lZGlhdGVfcHJvcGFnYXRpb25fc3RvcHBlZCgpKTsKKyAgRVhQRUNUX0VRKCIiLCBldmVudC0+bWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKCIiLCBldmVudC0+ZmlsZW5hbWUoKSk7CisgIEVYUEVDVF9FUSgwLCBldmVudC0+bGluZW5vKCkpOworICBFWFBFQ1RfRVEoMCwgZXZlbnQtPmNvbG5vKCkpOworICBFWFBFQ1RfRVEoTlVMTCwgZXZlbnQtPmVycm9yKCkpOworfQorCitURVNUX0YoRXJyb3JFdmVudFRlc3QsIENvbnN0cnVjdG9yV2l0aEV2ZW50VHlwZUFuZEVycm9ySW5pdERpY3QpIHsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworICBib29sIHN1Y2Nlc3MgPSBFdmFsdWF0ZVNjcmlwdCgKKyAgICAgICJ2YXIgZXZlbnQgPSBuZXcgRXJyb3JFdmVudCgnZG9nJywgIgorICAgICAgIiAgICB7J2NhbmNlbGFibGUnOnRydWUsICIKKyAgICAgICIgICAgICdtZXNzYWdlJzonZXJyb3JfbWVzc2FnZScsICIKKyAgICAgICIgICAgICdmaWxlbmFtZSc6J2Vycm9yX2ZpbGVuYW1lJywgIgorICAgICAgIiAgICAgJ2xpbmVubyc6MTAwLCAiCisgICAgICAiICAgICAnY29sbm8nOjUwLCAiCisgICAgICAiICAgICAnZXJyb3InOnsnY29iYWx0JzoncnVsZXonfX0pOyIKKyAgICAgICJpZiAoZXZlbnQudHlwZSA9PSAnZG9nJyAmJiIKKyAgICAgICIgICAgZXZlbnQuYnViYmxlcyA9PSBmYWxzZSAmJiIKKyAgICAgICIgICAgZXZlbnQuY2FuY2VsYWJsZSA9PSB0cnVlICYmIgorICAgICAgIiAgICBldmVudC5tZXNzYWdlID09ICdlcnJvcl9tZXNzYWdlJyAmJiIKKyAgICAgICIgICAgZXZlbnQuZmlsZW5hbWUgPT0gJ2Vycm9yX2ZpbGVuYW1lJyAmJiIKKyAgICAgICIgICAgZXZlbnQubGluZW5vID09IDEwMCAmJiIKKyAgICAgICIgICAgZXZlbnQuY29sbm8gPT0gNTApICIKKyAgICAgICIgICAgZXZlbnQuZXJyb3IuY29iYWx0OyIsCisgICAgICAmcmVzdWx0KTsKKyAgRVhQRUNUX0VRKCJydWxleiIsIHJlc3VsdCk7CisKKyAgaWYgKCFzdWNjZXNzKSB7CisgICAgRExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBldmFsdWF0ZSB0ZXN0OiAiCisgICAgICAgICAgICAgICAgPDwgIlwiIiA8PCByZXN1bHQgPDwgIlwiIjsKKyAgfSBlbHNlIHsKKyAgICBMT0coSU5GTykgPDwgIlRlc3QgcmVzdWx0IDogIgorICAgICAgICAgICAgICA8PCAiXCIiIDw8IHJlc3VsdCA8PCAiXCIiOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBkb20KK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2V2ZW50X3RhcmdldC5jYyBiL3NyYy9jb2JhbHQvZG9tL2V2ZW50X3RhcmdldC5jYwppbmRleCBjYTY1OTNjLi5iNmEzYThjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9ldmVudF90YXJnZXQuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vZXZlbnRfdGFyZ2V0LmNjCkBAIC03OCw3ICs3OCw2IEBACiAgIERDSEVDSyhldmVudC0+aW5pdGlhbGl6ZWRfZmxhZygpKTsKICAgVFJBQ0VfRVZFTlQxKCJjb2JhbHQ6OmRvbSIsICJFdmVudFRhcmdldDo6RGlzcGF0Y2hFdmVudCIsICJldmVudCIsCiAgICAgICAgICAgICAgICBldmVudC0+dHlwZSgpLmNfc3RyKCkpOwotCiAgIGlmICghZXZlbnQgfHwgZXZlbnQtPklzQmVpbmdEaXNwYXRjaGVkKCkgfHwgIWV2ZW50LT5pbml0aWFsaXplZF9mbGFnKCkpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KQEAgLTIyMyw2ICsyMjIsMTggQEAKICAgICAgIG5ldyBFdmVudExpc3RlbmVySW5mbyh0eXBlLCB0aGlzLCBsaXN0ZW5lciwgdXNlX2NhcHR1cmUsIGxpc3RlbmVyX3R5cGUpKTsKIH0KIAorYm9vbCBFdmVudFRhcmdldDo6SGFzRXZlbnRMaXN0ZW5lcihiYXNlOjpUb2tlbiB0eXBlKSB7CisgIFRSQUNLX01FTU9SWV9TQ09QRSgiRE9NIik7CisKKyAgZm9yIChFdmVudExpc3RlbmVySW5mb3M6Oml0ZXJhdG9yIGl0ZXIgPSBldmVudF9saXN0ZW5lcl9pbmZvc18uYmVnaW4oKTsKKyAgICAgICBpdGVyICE9IGV2ZW50X2xpc3RlbmVyX2luZm9zXy5lbmQoKTsgKytpdGVyKSB7CisgICAgaWYgKCgqaXRlciktPnR5cGUgPT0gdHlwZSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKwogRXZlbnRUYXJnZXQ6OkV2ZW50TGlzdGVuZXJJbmZvOjpFdmVudExpc3RlbmVySW5mbygKICAgICBiYXNlOjpUb2tlbiB0eXBlLCBFdmVudFRhcmdldCogY29uc3QgZXZlbnRfdGFyZ2V0LAogICAgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSYgbGlzdGVuZXIsIGJvb2wgdXNlX2NhcHR1cmUsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9ldmVudF90YXJnZXQuaCBiL3NyYy9jb2JhbHQvZG9tL2V2ZW50X3RhcmdldC5oCmluZGV4IDg5NjY2N2MuLjRlMjY5ZjMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2V2ZW50X3RhcmdldC5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2V2ZW50X3RhcmdldC5oCkBAIC03OCw2ICs3OCw5IEBACiAgICAgICBjb25zdCB0cmFja2VkX29iamVjdHM6OkxvY2F0aW9uJiBsb2NhdGlvbiwgYmFzZTo6VG9rZW4gZXZlbnRfbmFtZSwKICAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIGRpc3BhdGNoZWRfY2FsbGJhY2spOwogCisgIC8vIENoZWNrIGlmIHRhcmdldCBoYXMgZXZlbnQgbGlzdGVuZXIgKGF0cnRpYnV0ZSBvciBub3QgYXR0cmlidXRlKS4KKyAgYm9vbCBIYXNFdmVudExpc3RlbmVyKGJhc2U6OlRva2VuIHR5cGUpOworCiAgIC8vIFdlYiBBUEk6IEdsb2JhbEV2ZW50SGFuZGxlcnMgKGltcGxlbWVudHMpCiAgIC8vIE1hbnkgb2JqZWN0cyBjYW4gaGF2ZSBldmVudCBoYW5kbGVycyBzcGVjaWZpZWQuIFRoZXNlIGFjdCBhcyBub24tY2FwdHVyZQogICAvLyBldmVudCBsaXN0ZW5lcnMgZm9yIHRoZSBvYmplY3Qgb24gd2hpY2ggdGhleSBhcmUgc3BlY2lmaWVkLgpAQCAtMzM4LDYgKzM0MSwyMCBAQAogICAgIFNldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoYmFzZTo6VG9rZW5zOjp0aW1ldXBkYXRlKCksIGV2ZW50X2xpc3RlbmVyKTsKICAgfQogCisgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSogb25iZWZvcmV1bmxvYWQoKSB7CisgICAgcmV0dXJuIEdldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoYmFzZTo6VG9rZW5zOjpiZWZvcmV1bmxvYWQoKSk7CisgIH0KKyAgdm9pZCBzZXRfb25iZWZvcmV1bmxvYWQoY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlJiBldmVudF9saXN0ZW5lcikgeworICAgIFNldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoYmFzZTo6VG9rZW5zOjpiZWZvcmV1bmxvYWQoKSwgZXZlbnRfbGlzdGVuZXIpOworICB9CisKKyAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlKiBvbnRyYW5zaXRpb25lbmQoKSB7CisgICAgcmV0dXJuIEdldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoYmFzZTo6VG9rZW5zOjp0cmFuc2l0aW9uZW5kKCkpOworICB9CisgIHZvaWQgc2V0X29udHJhbnNpdGlvbmVuZChjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUmIGV2ZW50X2xpc3RlbmVyKSB7CisgICAgU2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihiYXNlOjpUb2tlbnM6OnRyYW5zaXRpb25lbmQoKSwgZXZlbnRfbGlzdGVuZXIpOworICB9CisKICAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlKiBvbnVubG9hZCgpIHsKICAgICByZXR1cm4gR2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihiYXNlOjpUb2tlbnM6OnVubG9hZCgpKTsKICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZ2xvYmFsX2V2ZW50X2hhbmRsZXJzLmlkbCBiL3NyYy9jb2JhbHQvZG9tL2dsb2JhbF9ldmVudF9oYW5kbGVycy5pZGwKaW5kZXggMzcyZjJmNy4uZGY4NTJmYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZ2xvYmFsX2V2ZW50X2hhbmRsZXJzLmlkbAorKysgYi9zcmMvY29iYWx0L2RvbS9nbG9iYWxfZXZlbnRfaGFuZGxlcnMuaWRsCkBAIC00NCw2ICs0NCw4IEBACiAKICAgYXR0cmlidXRlIEV2ZW50SGFuZGxlciBvbnJlc2l6ZTsKIAorICBhdHRyaWJ1dGUgRXZlbnRIYW5kbGVyIG9udHJhbnNpdGlvbmVuZDsKKwogICAvLyBFeHRlbnNpb25zIGZvciB0aGUgUG9pbnRlciBFdmVudHMgcmVjb21tZW5kYXRpb24uCiAgIC8vICBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNS9SRUMtcG9pbnRlcmV2ZW50cy0yMDE1MDIyNC8jZXh0ZW5zaW9ucy10by10aGUtZ2xvYmFsZXZlbnRoYW5kbGVycy1pbnRlcmZhY2UKICAgYXR0cmlidXRlIEV2ZW50SGFuZGxlciBvbmdvdHBvaW50ZXJjYXB0dXJlOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50LmggYi9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnQuaAppbmRleCBlNjJjMzM1Li41ODA2Y2ZjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnQuaAorKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnQuaApAQCAtMjcyLDYgKzI3MiwxMCBAQAogICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9pbnRlcmFjdC5odG1sI1BvaW50ZXJFdmVudHNQcm9wZXJ0eQogICBib29sIENhbmJlRGVzaWduYXRlZEJ5UG9pbnRlcklmRGlzcGxheWVkKCkgY29uc3Q7CiAKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgbm9kZSBhbmQgYWxsIG9mIGl0cyBhbmNlc3RvcnMgZG8gTk9UIGhhdmUgZGlzcGxheSBzZXQKKyAgLy8gdG8gJ25vbmUnLgorICBib29sIElzRGlzcGxheWVkKCkgY29uc3Q7CisKICAgREVGSU5FX1dSQVBQQUJMRV9UWVBFKEhUTUxFbGVtZW50KTsKIAogIHByb3RlY3RlZDoKQEAgLTMzMCwxMCArMzM0LDYgQEAKICAgLy8gUHVyZ2UgdGhlIGNhY2hlZCBiYWNrZ3JvdW5kIGltYWdlcyBvbiBvbmx5IHRoaXMgbm9kZS4KICAgdm9pZCBQdXJnZUNhY2hlZEJhY2tncm91bmRJbWFnZXMoKTsKIAotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBub2RlIGFuZCBhbGwgb2YgaXRzIGFuY2VzdG9ycyBkbyBOT1QgaGF2ZSBkaXNwbGF5IHNldAotICAvLyB0byAnbm9uZScuCi0gIGJvb2wgSXNEaXNwbGF5ZWQoKSBjb25zdDsKLQogICBib29sIGxvY2tlZF9mb3JfZm9jdXNfOwogCiAgIC8vIFRoZSBkaXJlY3Rpb25hbGl0eSBvZiB0aGUgaHRtbCBlbGVtZW50IGlzIGRldGVybWluZWQgYnkgdGhlICdkaXInCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX21lZGlhX2VsZW1lbnQuY2MgYi9zcmMvY29iYWx0L2RvbS9odG1sX21lZGlhX2VsZW1lbnQuY2MKaW5kZXggMGE0YTNhNy4uNTEyMDBiYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vaHRtbF9tZWRpYV9lbGVtZW50LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfbWVkaWFfZWxlbWVudC5jYwpAQCAtMjA3LDYgKzIwNywxMiBAQAogCiBzdGQ6OnN0cmluZyBIVE1MTWVkaWFFbGVtZW50OjpDYW5QbGF5VHlwZShjb25zdCBzdGQ6OnN0cmluZyYgbWltZV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0pIHsKKyAgaWYgKCFodG1sX2VsZW1lbnRfY29udGV4dCgpLT5jYW5fcGxheV90eXBlX2hhbmRsZXIoKSkgeworICAgIERMT0coRVJST1IpIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCIgPDwgbWltZV90eXBlIDw8ICIsICIgPDwga2V5X3N5c3RlbQorICAgICAgICAgICAgICAgIDw8ICIpOiBNZWRpYSBwbGF5YmFjayBpbiBQUkVMT0FESU5HIGlzIG5vdCBzdXBwb3J0ZWQuIjsKKyAgICByZXR1cm4gIiI7CisgIH0KKwogI2lmIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQogICBETE9HX0lGKEVSUk9SLCAha2V5X3N5c3RlbS5lbXB0eSgpKQogICAgICAgPDwgIkNhblBsYXlUeXBlKCkgb25seSBhY2NlcHRzIG9uZSBwYXJhbWV0ZXIgYnV0ICgiIDw8IGtleV9zeXN0ZW0KQEAgLTczMiw2ICs3MzgsMTEgQEAKICAgICB9CiAgIH0KIAorICBpZiAoIWh0bWxfZWxlbWVudF9jb250ZXh0KCktPndlYl9tZWRpYV9wbGF5ZXJfZmFjdG9yeSgpKSB7CisgICAgRExPRyhFUlJPUikgPDwgIk1lZGlhIHBsYXliYWNrIGluIFBSRUxPQURJTkcgaXMgbm90IHN1cHBvcnRlZC4iOworICAgIHJldHVybjsKKyAgfQorCiAgIHBsYXllcl8gPQogICAgICAgaHRtbF9lbGVtZW50X2NvbnRleHQoKS0+d2ViX21lZGlhX3BsYXllcl9mYWN0b3J5KCktPkNyZWF0ZVdlYk1lZGlhUGxheWVyKAogICAgICAgICAgIHRoaXMpOwpAQCAtMTUxNyw3ICsxNTI4LDcgQEAKICAgRW5kUHJvY2Vzc2luZ01lZGlhUGxheWVyQ2FsbGJhY2soKTsKIH0KIAotdm9pZCBIVE1MTWVkaWFFbGVtZW50OjpUaW1lQ2hhbmdlZCgpIHsKK3ZvaWQgSFRNTE1lZGlhRWxlbWVudDo6VGltZUNoYW5nZWQoYm9vbCBlb3NfcGxheWVkKSB7CiAgIERDSEVDSyhwbGF5ZXJfKTsKICAgaWYgKCFwbGF5ZXJfKSB7CiAgICAgcmV0dXJuOwpAQCAtMTU0Myw4ICsxNTU0LDkgQEAKICAgLy8gV2hlbiB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbiByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIG1lZGlhIHJlc291cmNlCiAgIC8vIHdoZW4gdGhlIGRpcmVjdGlvbiBvZiBwbGF5YmFjayBpcyBmb3J3YXJkcywgdGhlbiB0aGUgdXNlciBhZ2VudCBtdXN0IGZvbGxvdwogICAvLyB0aGVzZSBzdGVwczoKLSAgaWYgKCFTYkRvdWJsZUlzTmFuKGR1cikgJiYgKDAuMGYgIT0gZHVyKSAmJiBub3cgPj0gZHVyICYmCi0gICAgICBwbGF5YmFja19yYXRlXyA+IDApIHsKKyAgZW9zX3BsYXllZCB8PQorICAgICAgIVNiRG91YmxlSXNOYW4oZHVyKSAmJiAoMC4wZiAhPSBkdXIpICYmIG5vdyA+PSBkdXIgJiYgcGxheWJhY2tfcmF0ZV8gPiAwOworICBpZiAoZW9zX3BsYXllZCkgewogICAgIC8vIElmIHRoZSBtZWRpYSBlbGVtZW50IGhhcyBhIGxvb3AgYXR0cmlidXRlIHNwZWNpZmllZCBhbmQgZG9lcyBub3QgaGF2ZSBhCiAgICAgLy8gY3VycmVudCBtZWRpYSBjb250cm9sbGVyLAogICAgIGlmIChsb29wKCkpIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfbWVkaWFfZWxlbWVudC5oIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9tZWRpYV9lbGVtZW50LmgKaW5kZXggYjNkMWYwZC4uMzEzMTRlMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vaHRtbF9tZWRpYV9lbGVtZW50LmgKKysrIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9tZWRpYV9lbGVtZW50LmgKQEAgLTIzMSw3ICsyMzEsNyBAQAogICAvLyBXZWJNZWRpYVBsYXllckNsaWVudCBtZXRob2RzCiAgIHZvaWQgTmV0d29ya1N0YXRlQ2hhbmdlZCgpIE9WRVJSSURFOwogICB2b2lkIFJlYWR5U3RhdGVDaGFuZ2VkKCkgT1ZFUlJJREU7Ci0gIHZvaWQgVGltZUNoYW5nZWQoKSBPVkVSUklERTsKKyAgdm9pZCBUaW1lQ2hhbmdlZChib29sIGVvc19wbGF5ZWQpIE9WRVJSSURFOwogICB2b2lkIER1cmF0aW9uQ2hhbmdlZCgpIE9WRVJSSURFOwogICB2b2lkIE91dHB1dE1vZGVDaGFuZ2VkKCkgT1ZFUlJJREU7CiAgIHZvaWQgUGxheWJhY2tTdGF0ZUNoYW5nZWQoKSBPVkVSUklERTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3dpbmRvdy5jYyBiL3NyYy9jb2JhbHQvZG9tL3dpbmRvdy5jYwppbmRleCAwZDRlNjJlLi5mYWI1YzhjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS93aW5kb3cuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vd2luZG93LmNjCkBAIC0yOCw2ICsyOCw4IEBACiAjaW5jbHVkZSAiY29iYWx0L2RvbS9kb2N1bWVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX3NldHRpbmdzLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9lbGVtZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9lcnJvcl9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZXJyb3JfZXZlbnRfaW5pdC5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vZXZlbnQuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2hpc3RvcnkuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2h0bWxfZWxlbWVudC5oIgpAQCAtMTExLDYgKzExMyw3IEBACiAgICAgICBoZWlnaHRfKGhlaWdodCksCiAgICAgICBkZXZpY2VfcGl4ZWxfcmF0aW9fKGRldmljZV9waXhlbF9yYXRpbyksCiAgICAgICBpc19yZXNpemVfZXZlbnRfcGVuZGluZ18oZmFsc2UpLAorICAgICAgaXNfcmVwb3J0aW5nX3NjcmlwdF9lcnJvcl8oZmFsc2UpLAogI2lmIGRlZmluZWQoRU5BQkxFX1RFU1RfUlVOTkVSKQogICAgICAgdGVzdF9ydW5uZXJfKG5ldyBUZXN0UnVubmVyKCkpLAogI2VuZGlmICAvLyBFTkFCTEVfVEVTVF9SVU5ORVIKQEAgLTQzMCw2ICs0MzMsNjUgQEAKICAgaHRtbF9lbGVtZW50X2NvbnRleHRfLT5wYWdlX3Zpc2liaWxpdHlfc3RhdGUoKS0+U2V0QXBwbGljYXRpb25TdGF0ZShzdGF0ZSk7CiB9CiAKK2Jvb2wgV2luZG93OjpSZXBvcnRTY3JpcHRFcnJvcihjb25zdCBzY3JpcHQ6OkVycm9yUmVwb3J0JiBlcnJvcl9yZXBvcnQpIHsKKyAgLy8gUnVudGltZSBzY3JpcHQgZXJyb3JzOiB3aGVuIHRoZSB1c2VyIGFnZW50IGlzIHJlcXVpcmVkIHRvIHJlcG9ydCBhbiBlcnJvcgorICAvLyBmb3IgYSBwYXJ0aWN1bGFyIHNjcmlwdCwgaXQgbXVzdCBydW4gdGhlc2Ugc3RlcHMsIGFmdGVyIHdoaWNoIHRoZSBlcnJvciBpcworICAvLyBlaXRoZXIgaGFuZGxlZCBvciBub3QgaGFuZGxlZDoKKyAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvd2ViYXBwYXBpcy5odG1sI3J1bnRpbWUtc2NyaXB0LWVycm9ycworCisgIC8vIDEuIElmIHRhcmdldCBpcyBpbiBlcnJvciByZXBvcnRpbmcgbW9kZSwgdGhlbiBhYm9ydCB0aGVzZSBzdGVwczsgdGhlIGVycm9yCisgIC8vICAgIGlzIG5vdCBoYW5kbGVkLgorICBpZiAoaXNfcmVwb3J0aW5nX3NjcmlwdF9lcnJvcl8pIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyAyLiBMZXQgdGFyZ2V0IGJlIGluIGVycm9yIHJlcG9ydGluZyBtb2RlLgorICBpc19yZXBvcnRpbmdfc2NyaXB0X2Vycm9yXyA9IHRydWU7CisKKyAgLy8gNy4gTGV0IGV2ZW50IGJlIGEgbmV3IHRydXN0ZWQgRXJyb3JFdmVudCBvYmplY3QgdGhhdCBkb2VzIG5vdCBidWJibGUgYnV0IGlzCisgIC8vICAgIGNhbmNlbGFibGUsIGFuZCB3aGljaCBoYXMgdGhlIGV2ZW50IG5hbWUgZXJyb3IuCisgIC8vIE5PVEU6IENvYmFsdCBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydCB0cnVzdGVkIGV2ZW50cy4KKyAgRXJyb3JFdmVudEluaXQgZXJyb3JfZXZlbnRfaW5pdDsKKyAgZXJyb3JfZXZlbnRfaW5pdC5zZXRfYnViYmxlcyhmYWxzZSk7CisgIGVycm9yX2V2ZW50X2luaXQuc2V0X2NhbmNlbGFibGUodHJ1ZSk7CisKKyAgaWYgKGVycm9yX3JlcG9ydC5pc19tdXRlZCkgeworICAgIC8vIDYuIElmIHNjcmlwdCBoYXMgbXV0ZWQgZXJyb3JzLCB0aGVuIHNldCBtZXNzYWdlIHRvICJTY3JpcHQgZXJyb3IuIiwgc2V0CisgICAgLy8gICAgbG9jYXRpb24gdG8gdGhlIGVtcHR5IHN0cmluZywgc2V0IGxpbmUgYW5kIGNvbCB0byAwLCBhbmQgc2V0IGVycm9yCisgICAgLy8gICAgb2JqZWN0IHRvIG51bGwuCisgICAgZXJyb3JfZXZlbnRfaW5pdC5zZXRfbWVzc2FnZSgiU2NyaXB0IGVycm9yLiIpOworICAgIGVycm9yX2V2ZW50X2luaXQuc2V0X2ZpbGVuYW1lKCIiKTsKKyAgICBlcnJvcl9ldmVudF9pbml0LnNldF9saW5lbm8oMCk7CisgICAgZXJyb3JfZXZlbnRfaW5pdC5zZXRfY29sbm8oMCk7CisgICAgZXJyb3JfZXZlbnRfaW5pdC5zZXRfZXJyb3IoTlVMTCk7CisgIH0gZWxzZSB7CisgICAgLy8gOC4gSW5pdGlhbGl6ZSBldmVudCdzIG1lc3NhZ2UgYXR0cmlidXRlIHRvIG1lc3NhZ2UuCisgICAgZXJyb3JfZXZlbnRfaW5pdC5zZXRfbWVzc2FnZShlcnJvcl9yZXBvcnQubWVzc2FnZSk7CisgICAgLy8gOS4gSW5pdGlhbGl6ZSBldmVudCdzIGZpbGVuYW1lIGF0dHJpYnV0ZSB0byBsb2NhdGlvbi4KKyAgICBlcnJvcl9ldmVudF9pbml0LnNldF9maWxlbmFtZShlcnJvcl9yZXBvcnQuZmlsZW5hbWUpOworICAgIC8vIDEwLiBJbml0aWFsaXplIGV2ZW50J3MgbGluZW5vIGF0dHJpYnV0ZSB0byBsaW5lLgorICAgIGVycm9yX2V2ZW50X2luaXQuc2V0X2xpbmVubyhlcnJvcl9yZXBvcnQubGluZV9udW1iZXIpOworICAgIC8vIDExLiBJbml0aWFsaXplIGV2ZW50J3MgY29sbm8gYXR0cmlidXRlIHRvIGNvbC4KKyAgICBlcnJvcl9ldmVudF9pbml0LnNldF9jb2xubyhlcnJvcl9yZXBvcnQuY29sdW1uX251bWJlcik7CisgICAgLy8gMTIuIEluaXRpYWxpemUgZXZlbnQncyBlcnJvciBhdHRyaWJ1dGUgdG8gZXJyb3Igb2JqZWN0LgorICAgIGVycm9yX2V2ZW50X2luaXQuc2V0X2Vycm9yKGVycm9yX3JlcG9ydC5lcnJvciA/IGVycm9yX3JlcG9ydC5lcnJvci5nZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEwpOworICB9CisKKyAgc2NvcGVkX3JlZnB0cjxFcnJvckV2ZW50PiBlcnJvcl9ldmVudCgKKyAgICAgIG5ldyBFcnJvckV2ZW50KGJhc2U6OlRva2Vuczo6ZXJyb3IoKSwgZXJyb3JfZXZlbnRfaW5pdCkpOworCisgIC8vIDEzLiBEaXNwYXRjaCBldmVudCBhdCB0YXJnZXQuCisgIERpc3BhdGNoRXZlbnQoZXJyb3JfZXZlbnQpOworCisgIC8vIDE0LiBMZXQgdGFyZ2V0IG5vIGxvbmdlciBiZSBpbiBlcnJvciByZXBvcnRpbmcgbW9kZS4KKyAgaXNfcmVwb3J0aW5nX3NjcmlwdF9lcnJvcl8gPSBmYWxzZTsKKworICAvLyAxNS4gSWYgZXZlbnQgd2FzIGNhbmNlbGVkLCB0aGVuIHRoZSBlcnJvciBpcyBoYW5kbGVkLiBPdGhlcndpc2UsIHRoZSBlcnJvcgorICAvLyAgICAgaXMgbm90IGhhbmRsZWQuCisgIHJldHVybiBlcnJvcl9ldmVudC0+ZGVmYXVsdF9wcmV2ZW50ZWQoKTsKK30KKwogdm9pZCBXaW5kb3c6OlNldFN5bmNocm9ub3VzTGF5b3V0Q2FsbGJhY2soCiAgICAgY29uc3QgYmFzZTo6Q2xvc3VyZSYgc3luY2hyb25vdXNfbGF5b3V0X2NhbGxiYWNrKSB7CiAgIGRvY3VtZW50Xy0+c2V0X3N5bmNocm9ub3VzX2xheW91dF9jYWxsYmFjayhzeW5jaHJvbm91c19sYXlvdXRfY2FsbGJhY2spOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vd2luZG93LmggYi9zcmMvY29iYWx0L2RvbS93aW5kb3cuaAppbmRleCBlM2EzZjgzLi45Y2Q0Y2I2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS93aW5kb3cuaAorKysgYi9zcmMvY29iYWx0L2RvbS93aW5kb3cuaApAQCAtNTMsNiArNTMsNyBAQAogI2luY2x1ZGUgImNvYmFsdC9wYWdlX3Zpc2liaWxpdHkvcGFnZV92aXNpYmlsaXR5X3N0YXRlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9jYWxsYmFja19mdW5jdGlvbi5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZW52aXJvbm1lbnRfc2V0dGluZ3MuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2Vycm9yX3JlcG9ydC5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhlY3V0aW9uX3N0YXRlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfcnVubmVyLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWVfZmFjdG9yeS5oIgpAQCAtMzEwLDYgKzMxMSwxMSBAQAogICAvLyBwcmVjaXBpdGF0ZSBldmVudHMgdG8gYmUgZGlzcGF0Y2hlZC4KICAgdm9pZCBTZXRBcHBsaWNhdGlvblN0YXRlKGJhc2U6OkFwcGxpY2F0aW9uU3RhdGUgc3RhdGUpOwogCisgIC8vIFBlcmZvcm1zIHRoZSBzdGVwcyBzcGVjaWZpZWQgZm9yIHJ1bnRpbWUgc2NyaXB0IGVycm9yczoKKyAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvd2ViYXBwYXBpcy5odG1sI3J1bnRpbWUtc2NyaXB0LWVycm9ycworICAvLyBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBzY3JpcHQgd2FzIGhhbmRsZWQuCisgIGJvb2wgUmVwb3J0U2NyaXB0RXJyb3IoY29uc3Qgc2NyaXB0OjpFcnJvclJlcG9ydCYgZXJyb3JfcmVwb3J0KTsKKwogICAvLyBwYWdlX3Zpc2liaWxpdHk6OlBhZ2VWaXNpYmlsaXR5U3RhdGU6Ok9ic2VydmVyIGltcGxlbWVudGF0aW9uLgogICB2b2lkIE9uV2luZG93Rm9jdXNDaGFuZ2VkKGJvb2wgaGFzX2ZvY3VzKSBPVkVSUklERTsKICAgdm9pZCBPblZpc2liaWxpdHlTdGF0ZUNoYW5nZWQoCkBAIC0zNDcsNiArMzUzLDExIEBACiAgIC8vIHZpc2liaWxpdHkgc3RhdGUgY2hhbmdlcyB0byB2aXNpYmxlLgogICBib29sIGlzX3Jlc2l6ZV9ldmVudF9wZW5kaW5nXzsKIAorICAvLyBXaGV0aGVyIG9yIG5vdCB0aGUgd2luZG93IGlzIGN1cnJlbnRseSByZXBvcnRpbmcgYSBzY3JpcHQgZXJyb3IuIFRoaXMgaXMKKyAgLy8gdXNlZCB0byBwcmV2ZW50IGluZmluaXRlIHJlY3Vyc2lvbiwgYmVjYXVzZSByZXBvcnRpbmcgdGhlIGVycm9yIGNhdXNlcyBhbgorICAvLyBldmVudCB0byBiZSBkaXNwYXRjaGVkLCB3aGljaCBjYW4gZ2VuZXJhdGUgYSBuZXcgc2NyaXB0IGVycm9yLgorICBib29sIGlzX3JlcG9ydGluZ19zY3JpcHRfZXJyb3JfOworCiAjaWYgZGVmaW5lZChFTkFCTEVfVEVTVF9SVU5ORVIpCiAgIHNjb3BlZF9yZWZwdHI8VGVzdFJ1bm5lcj4gdGVzdF9ydW5uZXJfOwogI2VuZGlmICAvLyBFTkFCTEVfVEVTVF9SVU5ORVIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3dpbmRvd19ldmVudF9oYW5kbGVycy5pZGwgYi9zcmMvY29iYWx0L2RvbS93aW5kb3dfZXZlbnRfaGFuZGxlcnMuaWRsCmluZGV4IDJjZGEzNDQuLmJjMmJiNDIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3dpbmRvd19ldmVudF9oYW5kbGVycy5pZGwKKysrIGIvc3JjL2NvYmFsdC9kb20vd2luZG93X2V2ZW50X2hhbmRsZXJzLmlkbApAQCAtMTcsNCArMTcsNSBAQAogW05vSW50ZXJmYWNlT2JqZWN0XQogaW50ZXJmYWNlIFdpbmRvd0V2ZW50SGFuZGxlcnMgewogICBhdHRyaWJ1dGUgRXZlbnRIYW5kbGVyIG9udW5sb2FkOworICBhdHRyaWJ1dGUgRXZlbnRIYW5kbGVyIG9uYmVmb3JldW5sb2FkOwogfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfYWNjZXNzaWJpbGl0eS5jYyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfYWNjZXNzaWJpbGl0eS5jYwppbmRleCAyZjlkZGI3Li43YWI1MTY0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2FjY2Vzc2liaWxpdHkuY2MKKysrIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19hY2Nlc3NpYmlsaXR5LmNjCkBAIC00Miw3ICs0Miw2IEBACiAKICNpZiBTQl9IQVMoU1BFRUNIX1NZTlRIRVNJUykKIGJvb2wgSXNUZXh0VG9TcGVlY2hFbmFibGVkKCkgewotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgLy8gQ2hlY2sgaWYgdGhlIHR0cyBmZWF0dXJlIGlzIGVuYWJsZWQgaW4gU3RhcmJvYXJkLgogICBTYkFjY2Vzc2liaWxpdHlUZXh0VG9TcGVlY2hTZXR0aW5ncyB0dHNfc2V0dGluZ3MgPSB7MH07CiAgIC8vIENoZWNrIHBsYXRmb3JtIHNldHRpbmdzLgpAQCAtNTAsNyArNDksNyBAQAogICAgIHJldHVybiB0dHNfc2V0dGluZ3MuaGFzX3RleHRfdG9fc3BlZWNoX3NldHRpbmcgJiYKICAgICAgICAgICAgdHRzX3NldHRpbmdzLmlzX3RleHRfdG9fc3BlZWNoX2VuYWJsZWQ7CiAgIH0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAorCiAgIHJldHVybiBmYWxzZTsKIH0KICNlbmRpZiAgLy8gU0JfSEFTKFNQRUVDSF9TWU5USEVTSVMpCkBAIC0xMDIsNyArMTAxLDYgQEAKIH0KIAogYm9vbCBINXZjY0FjY2Vzc2liaWxpdHk6OmhpZ2hfY29udHJhc3RfdGV4dCgpIGNvbnN0IHsKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAgIFNiQWNjZXNzaWJpbGl0eURpc3BsYXlTZXR0aW5ncyBzZXR0aW5nczsKICAgU2JNZW1vcnlTZXQoJnNldHRpbmdzLCAwLCBzaXplb2Yoc2V0dGluZ3MpKTsKIApAQCAtMTExLDEzICsxMDksOSBAQAogICB9CiAKICAgcmV0dXJuIHNldHRpbmdzLmlzX2hpZ2hfY29udHJhc3RfdGV4dF9lbmFibGVkOwotI2Vsc2UgICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0Ci0gIHJldHVybiAgZmFsc2U7Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKIH0KIAogYm9vbCBINXZjY0FjY2Vzc2liaWxpdHk6OnRleHRfdG9fc3BlZWNoKCkgY29uc3QgewotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgU2JBY2Nlc3NpYmlsaXR5VGV4dFRvU3BlZWNoU2V0dGluZ3Mgc2V0dGluZ3M7CiAgIFNiTWVtb3J5U2V0KCZzZXR0aW5ncywgMCwgc2l6ZW9mKHNldHRpbmdzKSk7CiAKQEAgLTEyNyw5ICsxMjEsNiBAQAogCiAgIHJldHVybiBzZXR0aW5ncy5oYXNfdGV4dF90b19zcGVlY2hfc2V0dGluZyAmJgogICAgICAgc2V0dGluZ3MuaXNfdGV4dF90b19zcGVlY2hfZW5hYmxlZDsKLSNlbHNlICAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAotICByZXR1cm4gIGZhbHNlOwotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiB9CiAKIHZvaWQgSDV2Y2NBY2Nlc3NpYmlsaXR5OjpBZGRIaWdoQ29udHJhc3RUZXh0TGlzdGVuZXIoCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dC9ib3guY2MgYi9zcmMvY29iYWx0L2xheW91dC9ib3guY2MKaW5kZXggYjFlNmI3MC4uMzRhMzg1MyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvYm94LmNjCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0L2JveC5jYwpAQCAtNjUwLDEwICs2NTAsMTAgQEAKICAgICAgICAgICBSZW5kZXJBbmRBbmltYXRlT3ZlcmZsb3cocGFkZGluZ19yb3VuZGVkX2Nvcm5lcnMsIGJvcmRlcl9ub2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYW5pbWF0ZV9ub2RlX2J1aWxkZXIsIGJvcmRlcl9ib3hfb2Zmc2V0KTsKICAgICB9Ci0gICAgYm9yZGVyX25vZGUgPSBSZW5kZXJBbmRBbmltYXRlT3BhY2l0eShib3JkZXJfbm9kZSwgJmFuaW1hdGVfbm9kZV9idWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eSwgb3BhY2l0eV9hbmltYXRlZCk7CiAgICAgYm9yZGVyX25vZGUgPSBSZW5kZXJBbmRBbmltYXRlVHJhbnNmb3JtKGJvcmRlcl9ub2RlLCAmYW5pbWF0ZV9ub2RlX2J1aWxkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcl9ib3hfb2Zmc2V0KTsKKyAgICBib3JkZXJfbm9kZSA9IFJlbmRlckFuZEFuaW1hdGVPcGFjaXR5KGJvcmRlcl9ub2RlLCAmYW5pbWF0ZV9ub2RlX2J1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5LCBvcGFjaXR5X2FuaW1hdGVkKTsKIAogICAgIGNhY2hlZF9yZW5kZXJfdHJlZV9ub2RlX2luZm9fLT5ub2RlXyA9CiAgICAgICAgIGFuaW1hdGVfbm9kZV9idWlsZGVyLmVtcHR5KCkKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L2JveF9nZW5lcmF0b3IuY2MgYi9zcmMvY29iYWx0L2xheW91dC9ib3hfZ2VuZXJhdG9yLmNjCmluZGV4IDVmOWM1MzYuLmRjMDAzNDQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0L2JveF9nZW5lcmF0b3IuY2MKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvYm94X2dlbmVyYXRvci5jYwpAQCAtNjQsNyArNjQsNiBAQAogc2NvcGVkX3JlZnB0cjxyZW5kZXJfdHJlZTo6SW1hZ2U+IEdldFZpZGVvRnJhbWUoCiAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxTaGVsbFZpZGVvRnJhbWVQcm92aWRlcj4mIGZyYW1lX3Byb3ZpZGVyLAogICAgIHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyKiByZXNvdXJjZV9wcm92aWRlcikgewotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgU2JEZWNvZGVUYXJnZXQgZGVjb2RlX3RhcmdldCA9IGZyYW1lX3Byb3ZpZGVyLT5HZXRDdXJyZW50U2JEZWNvZGVUYXJnZXQoKTsKICAgaWYgKFNiRGVjb2RlVGFyZ2V0SXNWYWxpZChkZWNvZGVfdGFyZ2V0KSkgewogI2lmIFNCX0hBUyhHUkFQSElDUykKQEAgLTcyLDEyICs3MSw4IEBACiAjZWxzZSAgLy8gU0JfSEFTKEdSQVBISUNTKQogICAgIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIocmVzb3VyY2VfcHJvdmlkZXIpOwogICAgIHJldHVybiBOVUxMOwotI2VuZGlmCisjZW5kaWYgIC8vIFNCX0hBUyhHUkFQSElDUykKICAgfSBlbHNlIHsKLSNlbHNlICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0Ci0gIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIocmVzb3VyY2VfcHJvdmlkZXIpOwotICB7Ci0jZW5kaWYKICAgICBEQ0hFQ0soZnJhbWVfcHJvdmlkZXIpOwogICAgIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gdmlkZW9fZnJhbWUgPSBmcmFtZV9wcm92aWRlci0+R2V0Q3VycmVudEZyYW1lKCk7CiAgICAgaWYgKHZpZGVvX2ZyYW1lICYmIHZpZGVvX2ZyYW1lLT50ZXh0dXJlX2lkKCkpIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L2xheW91dF9tYW5hZ2VyLmNjIGIvc3JjL2NvYmFsdC9sYXlvdXQvbGF5b3V0X21hbmFnZXIuY2MKaW5kZXggZTliODMxOS4uN2YwY2M2NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvbGF5b3V0X21hbmFnZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvbGF5b3V0X21hbmFnZXIuY2MKQEAgLTI0LDcgKzI0LDkgQEAKICNpbmNsdWRlICJiYXNlL3RpbWVyLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2Nhc2NhZGVfcHJlY2VkZW5jZS5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vY2FtZXJhXzNkLmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9odG1sX2JvZHlfZWxlbWVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vaHRtbF9lbGVtZW50X2NvbnRleHQuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2h0bWxfaGVhZF9lbGVtZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9odG1sX2h0bWxfZWxlbWVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9sYXlvdXQvYmVuY2htYXJrX3N0YXRfbmFtZXMuaCIKICNpbmNsdWRlICJjb2JhbHQvbGF5b3V0L2Jsb2NrX2Zvcm1hdHRpbmdfYmxvY2tfY29udGFpbmVyX2JveC5oIgpAQCAtNzcsNiArNzksOCBAQAogICBjb25zdCBPbkxheW91dENhbGxiYWNrIG9uX2xheW91dF9jYWxsYmFja187CiAgIGNvbnN0IExheW91dFRyaWdnZXIgbGF5b3V0X3RyaWdnZXJfOwogCisgIGJvb2wgcHJvZHVjZWRfcmVuZGVyX3RyZWVfOworCiAgIC8vIFNldHRpbmcgdGhlc2UgZmxhZ3MgdHJpZ2dlcnMgYW4gdXBkYXRlIG9mIHRoZSBsYXlvdXQgYm94IHRyZWUgYW5kIHRoZQogICAvLyBnZW5lcmF0aW9uIG9mIGEgbmV3IHJlbmRlciB0cmVlIGF0IGEgcmVndWxhciBpbnRlcnZhbCAoZS5nLiA2MEh6KS4gRXZlbnRzCiAgIC8vIHN1Y2ggYXMgRE9NIG11dGF0aW9ucyBjYXVzZSB0aGVtIHRvIGJlIHNldCB0byB0cnVlLiBXaGlsZSB0aGUgcmVuZGVyIHRyZWUKQEAgLTE2Nyw2ICsxNzEsNyBAQAogICAgICAgb25fcmVuZGVyX3RyZWVfcHJvZHVjZWRfY2FsbGJhY2tfKG9uX3JlbmRlcl90cmVlX3Byb2R1Y2VkKSwKICAgICAgIG9uX2xheW91dF9jYWxsYmFja18ob25fbGF5b3V0KSwKICAgICAgIGxheW91dF90cmlnZ2VyXyhsYXlvdXRfdHJpZ2dlciksCisgICAgICBwcm9kdWNlZF9yZW5kZXJfdHJlZV8oZmFsc2UpLAogICAgICAgYXJlX2NvbXB1dGVkX3N0eWxlc19hbmRfYm94X3RyZWVfZGlydHlfKHRydWUpLAogICAgICAgaXNfcmVuZGVyX3RyZWVfcGVuZGluZ18oCiAgICAgICAgICAgU3RyaW5nUHJpbnRmKCIlcy5MYXlvdXQuSXNSZW5kZXJUcmVlUGVuZGluZyIsIG5hbWUuY19zdHIoKSksIHRydWUsCkBAIC0zNjYsMTEgKzM3MSwzMiBAQAogICAgICAgYXJlX2NvbXB1dGVkX3N0eWxlc19hbmRfYm94X3RyZWVfZGlydHlfID0gZmFsc2U7CiAgICAgfQogCisgICAgLy8gSWYgbm8gcmVuZGVyIHRyZWUgaGFzIGJlZW4gcHJvZHVjZWQgeWV0LCBjaGVjayBpZiBodG1sLCBoZWFkLCBhbmQKKyAgICAvLyBib2R5IGRpc3BsYXkgc2hvdWxkIGJsb2NrIHRoZSBmaXJzdCByZW5kZXIgdHJlZS4KKyAgICBpZiAoIXByb2R1Y2VkX3JlbmRlcl90cmVlXykgeworICAgICAgYm9vbCBkaXNwbGF5ZWRfaHRtbCA9IGRvY3VtZW50LT5odG1sKCktPklzRGlzcGxheWVkKCk7CisgICAgICBpZiAoIWRpc3BsYXllZF9odG1sKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGJvb2wgZGlzcGxheWVkX2hlYWQgPSB0cnVlOworICAgICAgaWYgKGRvY3VtZW50LT5oZWFkKCkpIHsKKyAgICAgICAgZGlzcGxheWVkX2hlYWQgPSBkb2N1bWVudC0+aGVhZCgpOworICAgICAgfQorICAgICAgYm9vbCBkaXNwbGF5ZWRfYm9keSA9IHRydWU7CisgICAgICBpZiAoZG9jdW1lbnQtPmJvZHkoKSkgeworICAgICAgICBkaXNwbGF5ZWRfYm9keSA9IGRvY3VtZW50LT5ib2R5KCk7CisgICAgICB9CisgICAgICBpZiAoIWRpc3BsYXllZF9oZWFkICYmICFkaXNwbGF5ZWRfYm9keSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorCiAgICAgc2NvcGVkX3JlZnB0cjxyZW5kZXJfdHJlZTo6Tm9kZT4gcmVuZGVyX3RyZWVfcm9vdCA9CiAgICAgICAgIGxheW91dDo6R2VuZXJhdGVSZW5kZXJUcmVlRnJvbUJveFRyZWUodXNlZF9zdHlsZV9wcm92aWRlcl8uZ2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0X3N0YXRfdHJhY2tlcl8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluaXRpYWxfY29udGFpbmluZ19ibG9ja18pOwogICAgIGJvb2wgcnVuX29uX3JlbmRlcl90cmVlX3Byb2R1Y2VkX2NhbGxiYWNrID0gdHJ1ZTsKKyAgICBwcm9kdWNlZF9yZW5kZXJfdHJlZV8gPSB0cnVlOwogI2lmIGRlZmluZWQoRU5BQkxFX1RFU1RfUlVOTkVSKQogICAgIGlmIChsYXlvdXRfdHJpZ2dlcl8gPT0ga1Rlc3RSdW5uZXJNb2RlICYmCiAgICAgICAgIHdpbmRvd18tPnRlc3RfcnVubmVyKCktPnNob3VsZF93YWl0KCkpIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL2NvYmFsdC9kaXNwbGF5X25vbmVfc2V0X3RvX2FsbF9lbGVtZW50cy1leHBlY3RlZC5wbmcgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jb2JhbHQvZGlzcGxheV9ub25lX3NldF90b19hbGxfZWxlbWVudHMtZXhwZWN0ZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTZiNDFhLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL2NvYmFsdC9kaXNwbGF5X25vbmVfc2V0X3RvX2FsbF9lbGVtZW50cy1leHBlY3RlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jb2JhbHQvZGlzcGxheV9ub25lX3NldF90b19hbGxfZWxlbWVudHMuaHRtbCBiL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL2NvYmFsdC9kaXNwbGF5X25vbmVfc2V0X3RvX2FsbF9lbGVtZW50cy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDljYzM1Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL2NvYmFsdC9kaXNwbGF5X25vbmVfc2V0X3RvX2FsbF9lbGVtZW50cy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPCEtLQotIHwgQXBwbHlpbmcgZGlzcGxheTogbm9uZSB0byBhbGwgZWxlbWVudHMuCi0gLS0+Ci08aHRtbD4KLTxoZWFkPjwvaGVhZD4KLTxib2R5PjwvYm9keT4KLTxzdHlsZT4KLSogewotICBkaXNwbGF5OiBub25lOwotfQotPC9zdHlsZT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdGRhdGEvY29iYWx0L2xheW91dF90ZXN0cy50eHQgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jb2JhbHQvbGF5b3V0X3Rlc3RzLnR4dAppbmRleCAwMzI5MmEwLi45NTA5OTMzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jb2JhbHQvbGF5b3V0X3Rlc3RzLnR4dAorKysgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jb2JhbHQvbGF5b3V0X3Rlc3RzLnR4dApAQCAtNCw3ICs0LDYgQEAKIGNoYW5naW5nLWNzcy10ZXh0LXRyaWdnZXJzLWxheW91dAogY29iYWx0LW94aWRlLCBmaWxlOi8vL2NvYmFsdC9icm93c2VyL3Rlc3RkYXRhL2NvYmFsdC1veGlkZS9jb2JhbHQtb3hpZGUuaHRtbAogY29uc29sZS10cmFjZS1zaG91bGQtbm90LWNyYXNoCi1kaXNwbGF5X25vbmVfc2V0X3RvX2FsbF9lbGVtZW50cwogZGl2cy13aXRoLWJhY2tncm91bmQtY29sb3ItYW5kLXRleHQKIGZpeGVkLXdpZHRoLWRpdnMtd2l0aC1iYWNrZ3JvdW5kLWNvbG9yCiBmb250LXdlaWdodApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdGRhdGEvd2ViLXBsYXRmb3JtLXRlc3RzL1hNTEh0dHBSZXF1ZXN0L3dlYl9wbGF0Zm9ybV90ZXN0cy50eHQgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS93ZWItcGxhdGZvcm0tdGVzdHMvWE1MSHR0cFJlcXVlc3Qvd2ViX3BsYXRmb3JtX3Rlc3RzLnR4dAppbmRleCAxM2E0NjI2Li44N2RhYjc4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS93ZWItcGxhdGZvcm0tdGVzdHMvWE1MSHR0cFJlcXVlc3Qvd2ViX3BsYXRmb3JtX3Rlc3RzLnR4dAorKysgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS93ZWItcGxhdGZvcm0tdGVzdHMvWE1MSHR0cFJlcXVlc3Qvd2ViX3BsYXRmb3JtX3Rlc3RzLnR4dApAQCAtMTcwLDcgKzE3MCw3IEBACiBzZW5kLXJlZGlyZWN0LWluZmluaXRlLmh0bSxQQVNTCiBzZW5kLXJlZGlyZWN0LWluZmluaXRlLXN5bmMuaHRtLEZBSUwKIHNlbmQtcmVkaXJlY3Qtbm8tbG9jYXRpb24uaHRtLEZBSUwKLXNlbmQtcmVkaXJlY3QtdG8tY29ycy5odG0sRElTQUJMRQorc2VuZC1yZWRpcmVjdC10by1jb3JzLmh0bSxQQVNTCiBzZW5kLXJlZGlyZWN0LXRvLW5vbi1jb3JzLmh0bSxGQUlMCiBzZW5kLXJlc3BvbnNlLWV2ZW50LW9yZGVyLmh0bSxGQUlMCiBzZW5kLXJlc3BvbnNlLXVwbG9hZC1ldmVudC1sb2FkZW5kLmh0bSxQQVNTCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9lcnJvcl9mZXRjaGVyLmNjIGIvc3JjL2NvYmFsdC9sb2FkZXIvZXJyb3JfZmV0Y2hlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWYwMGUyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvZXJyb3JfZmV0Y2hlci5jYwpAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9lcnJvcl9mZXRjaGVyLmgiCisKKyNpbmNsdWRlICJiYXNlL2JpbmQuaCIKKyNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBsb2FkZXIgeworCitFcnJvckZldGNoZXI6OkVycm9yRmV0Y2hlcihIYW5kbGVyKiBoYW5kbGVyLCBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3JfbWVzc2FnZSkKKyAgICA6IEZldGNoZXIoaGFuZGxlciksCisgICAgICBlcnJvcl9tZXNzYWdlXyhlcnJvcl9tZXNzYWdlKSwKKyAgICAgIEFMTE9XX1RISVNfSU5fSU5JVElBTElaRVJfTElTVCh3ZWFrX3B0cl9mYWN0b3J5Xyh0aGlzKSkgeworICBNZXNzYWdlTG9vcDo6Y3VycmVudCgpLT5Qb3N0VGFzaygKKyAgICAgIEZST01fSEVSRSwKKyAgICAgIGJhc2U6OkJpbmQoJkVycm9yRmV0Y2hlcjo6RmV0Y2gsIHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKSkpOworfQorCit2b2lkIEVycm9yRmV0Y2hlcjo6RmV0Y2goKSB7CisgIGhhbmRsZXIoKS0+T25FcnJvcih0aGlzLCBlcnJvcl9tZXNzYWdlXyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBsb2FkZXIKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2Vycm9yX2ZldGNoZXIuaCBiL3NyYy9jb2JhbHQvbG9hZGVyL2Vycm9yX2ZldGNoZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Zjc3MzhlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvZXJyb3JfZmV0Y2hlci5oCkBAIC0wLDAgKzEsNDEgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX0xPQURFUl9FUlJPUl9GRVRDSEVSX0hfCisjZGVmaW5lIENPQkFMVF9MT0FERVJfRVJST1JfRkVUQ0hFUl9IXworCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvd2Vha19wdHIuaCIKKyNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2ZldGNoZXIuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgbG9hZGVyIHsKKworLy8gQWx3YXlzIHJldHVybnMgYW4gZXJyb3IuCitjbGFzcyBFcnJvckZldGNoZXIgOiBwdWJsaWMgRmV0Y2hlciB7CisgcHVibGljOgorICBFcnJvckZldGNoZXIoSGFuZGxlciogaGFuZGxlciwgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yX21lc3NhZ2VfKTsKKworIHByaXZhdGU6CisgIHZvaWQgRmV0Y2goKTsKKworICBzdGQ6OnN0cmluZyBlcnJvcl9tZXNzYWdlXzsKKyAgYmFzZTo6V2Vha1B0ckZhY3Rvcnk8RXJyb3JGZXRjaGVyPiB3ZWFrX3B0cl9mYWN0b3J5XzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBsb2FkZXIKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBDT0JBTFRfTE9BREVSX0VSUk9SX0ZFVENIRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2ZldGNoZXJfZmFjdG9yeS5jYyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ZldGNoZXJfZmFjdG9yeS5jYwppbmRleCAxZTcwY2Y0Li45Nzc2MzY1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9mZXRjaGVyX2ZhY3RvcnkuY2MKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvZmV0Y2hlcl9mYWN0b3J5LmNjCkBAIC0xNCw2ICsxNCw3IEBACiAKICNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2ZldGNoZXJfZmFjdG9yeS5oIgogCisjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDxzdHJpbmc+CiAKICNpbmNsdWRlICJiYXNlL2JpbmQuaCIKQEAgLTI1LDYgKzI2LDcgQEAKICNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2Jsb2JfZmV0Y2hlci5oIgogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvY2FjaGVfZmV0Y2hlci5oIgogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvZW1iZWRkZWRfZmV0Y2hlci5oIgorI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvZXJyb3JfZmV0Y2hlci5oIgogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvZmlsZV9mZXRjaGVyLmgiCiAjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9uZXRfZmV0Y2hlci5oIgogI2luY2x1ZGUgImNvYmFsdC9uZXR3b3JrL25ldHdvcmtfbW9kdWxlLmgiCkBAIC0zNyw2ICszOSw3IEBACiBjb25zdCBjaGFyIGtBYm91dFNjaGVtZVtdID0gImFib3V0IjsKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT0JBTFRfRU5BQkxFX0ZJTEVfU0NIRU1FKQogYm9vbCBGaWxlVVJMVG9GaWxlUGF0aChjb25zdCBHVVJMJiB1cmwsIEZpbGVQYXRoKiBmaWxlX3BhdGgpIHsKICAgRENIRUNLKHVybC5pc192YWxpZCgpICYmIHVybC5TY2hlbWVJc0ZpbGUoKSk7CiAgIHN0ZDo6c3RyaW5nIHBhdGggPSB1cmwucGF0aCgpOwpAQCAtNDUsNiArNDgsNyBAQAogICAqZmlsZV9wYXRoID0gRmlsZVBhdGgocGF0aCk7CiAgIHJldHVybiAhZmlsZV9wYXRoLT5lbXB0eSgpOwogfQorI2VuZGlmCiAKIHN0ZDo6c3RyaW5nIENsaXBVcmwoY29uc3QgR1VSTCYgdXJsLCBzaXplX3QgbGVuZ3RoKSB7CiAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzcGVjID0gdXJsLnBvc3NpYmx5X2ludmFsaWRfc3BlYygpOwpAQCAtOTQsNTkgKzk4LDY3IEBACiBzY29wZWRfcHRyPEZldGNoZXI+IEZldGNoZXJGYWN0b3J5OjpDcmVhdGVTZWN1cmVGZXRjaGVyKAogICAgIGNvbnN0IEdVUkwmIHVybCwgY29uc3QgY3NwOjpTZWN1cml0eUNhbGxiYWNrJiB1cmxfc2VjdXJpdHlfY2FsbGJhY2ssCiAgICAgRmV0Y2hlcjo6SGFuZGxlciogaGFuZGxlcikgeworICBETE9HKElORk8pIDw8ICJGZXRjaGluZzogIiA8PCBDbGlwVXJsKHVybCwgNjApOworCiAgIGlmICghdXJsLmlzX3ZhbGlkKCkpIHsKLSAgICBMT0coRVJST1IpIDw8ICJVUkwgaXMgaW52YWxpZDogIiA8PCB1cmw7Ci0gICAgcmV0dXJuIHNjb3BlZF9wdHI8RmV0Y2hlcj4oTlVMTCk7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3JfbWVzc2FnZTsKKyAgICBlcnJvcl9tZXNzYWdlIDw8ICJVUkwgaXMgaW52YWxpZDogIiA8PCB1cmw7CisgICAgcmV0dXJuIHNjb3BlZF9wdHI8RmV0Y2hlcj4obmV3IEVycm9yRmV0Y2hlcihoYW5kbGVyLCBlcnJvcl9tZXNzYWdlLnN0cigpKSk7CiAgIH0KIAotICBETE9HKElORk8pIDw8ICJGZXRjaGluZzogIiA8PCBDbGlwVXJsKHVybCwgNjApOwotICBzY29wZWRfcHRyPEZldGNoZXI+IGZldGNoZXI7CisgIGlmICgodXJsLlNjaGVtZUlzKCJodHRwcyIpIHx8IHVybC5TY2hlbWVJcygiaHR0cCIpIHx8CisgICAgICAgdXJsLlNjaGVtZUlzKCJkYXRhIikpICYmCisgICAgICBuZXR3b3JrX21vZHVsZV8pIHsKKyAgICBOZXRGZXRjaGVyOjpPcHRpb25zIG9wdGlvbnM7CisgICAgcmV0dXJuIHNjb3BlZF9wdHI8RmV0Y2hlcj4obmV3IE5ldEZldGNoZXIodXJsLCB1cmxfc2VjdXJpdHlfY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciwgbmV0d29ya19tb2R1bGVfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMpKTsKKyAgfQorCisgIGlmICh1cmwuU2NoZW1lSXMoImJsb2IiKSAmJiAhYmxvYl9yZXNvbHZlcl8uaXNfbnVsbCgpKSB7CisgICAgcmV0dXJuIHNjb3BlZF9wdHI8RmV0Y2hlcj4obmV3IEJsb2JGZXRjaGVyKHVybCwgaGFuZGxlciwgYmxvYl9yZXNvbHZlcl8pKTsKKyAgfQorCiAgIGlmICh1cmwuU2NoZW1lSXMoa0VtYmVkZGVkU2NoZW1lKSkgewogICAgIEVtYmVkZGVkRmV0Y2hlcjo6T3B0aW9ucyBvcHRpb25zOwotICAgIGZldGNoZXIucmVzZXQoCi0gICAgICAgIG5ldyBFbWJlZGRlZEZldGNoZXIodXJsLCB1cmxfc2VjdXJpdHlfY2FsbGJhY2ssIGhhbmRsZXIsIG9wdGlvbnMpKTsKLSAgfSBlbHNlIGlmICh1cmwuU2NoZW1lSXNGaWxlKCkpIHsKKyAgICByZXR1cm4gc2NvcGVkX3B0cjxGZXRjaGVyPihuZXcgRW1iZWRkZWRGZXRjaGVyKHVybCwgdXJsX3NlY3VyaXR5X2NhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciwgb3B0aW9ucykpOworICB9CisKKyAgLy8gaDV2Y2MtY2FjaGU6IHNjaGVtZSByZXF1aXJlcyByZWFkX2NhY2hlX2NhbGxiYWNrXyB3aGljaCBpcyBub3QgYXZhaWxhYmxlCisgIC8vIGluIHRoZSBtYWluIFdlYk1vZHVsZS4KKyAgaWYgKHVybC5TY2hlbWVJcyhrQ2FjaGVTY2hlbWUpICYmICFyZWFkX2NhY2hlX2NhbGxiYWNrXy5pc19udWxsKCkpIHsKKyAgICByZXR1cm4gc2NvcGVkX3B0cjxGZXRjaGVyPihuZXcgQ2FjaGVGZXRjaGVyKHVybCwgdXJsX3NlY3VyaXR5X2NhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfY2FjaGVfY2FsbGJhY2tfKSk7CisgIH0KKworI2lmIGRlZmluZWQoQ09CQUxUX0VOQUJMRV9GSUxFX1NDSEVNRSkKKyAgaWYgKHVybC5TY2hlbWVJc0ZpbGUoKSkgewogICAgIEZpbGVQYXRoIGZpbGVfcGF0aDsKLSAgICBpZiAoRmlsZVVSTFRvRmlsZVBhdGgodXJsLCAmZmlsZV9wYXRoKSkgewotICAgICAgRmlsZUZldGNoZXI6Ok9wdGlvbnMgb3B0aW9uczsKLSAgICAgIG9wdGlvbnMubWVzc2FnZV9sb29wX3Byb3h5ID0gZmlsZV90aHJlYWRfLm1lc3NhZ2VfbG9vcF9wcm94eSgpOwotICAgICAgb3B0aW9ucy5leHRyYV9zZWFyY2hfZGlyID0gZXh0cmFfc2VhcmNoX2Rpcl87Ci0gICAgICBmZXRjaGVyLnJlc2V0KG5ldyBGaWxlRmV0Y2hlcihmaWxlX3BhdGgsIGhhbmRsZXIsIG9wdGlvbnMpKTsKLSAgICB9IGVsc2UgewotICAgICAgTE9HKEVSUk9SKSA8PCAiRmlsZSBVUkwgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBmaWxlIHBhdGg6ICIgPDwgdXJsOwotICAgIH0KLSAgfQotI2lmIGRlZmluZWQoRU5BQkxFX0FCT1VUX1NDSEVNRSkKLSAgZWxzZSBpZiAodXJsLlNjaGVtZUlzKGtBYm91dFNjaGVtZSkpIHsgIC8vIE5PTElOVChyZWFkYWJpbGl0eS9icmFjZXMpCi0gICAgZmV0Y2hlci5yZXNldChuZXcgQWJvdXRGZXRjaGVyKGhhbmRsZXIpKTsKLSAgfQotI2VuZGlmCi0gIGVsc2UgaWYgKHVybC5TY2hlbWVJcygiYmxvYiIpKSB7ICAvLyBOT0xJTlQocmVhZGFiaWxpdHkvYnJhY2VzKQotICAgIGlmICghYmxvYl9yZXNvbHZlcl8uaXNfbnVsbCgpKSB7Ci0gICAgICBmZXRjaGVyLnJlc2V0KG5ldyBCbG9iRmV0Y2hlcih1cmwsIGhhbmRsZXIsIGJsb2JfcmVzb2x2ZXJfKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIkZldGNoZXIgZmFjdG9yeSBub3QgcHJvdmlkZWQgdGhlIGJsb2IgcmVnaXN0cnksICIKLSAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBmZXRjaCB0aGUgVVJMOiAiCi0gICAgICAgICAgICAgICAgIDw8IHVybDsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodXJsLlNjaGVtZUlzKGtDYWNoZVNjaGVtZSkpIHsKLSAgICBpZiAocmVhZF9jYWNoZV9jYWxsYmFja18uaXNfbnVsbCgpKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJyZWFkX2NhY2hlX2NhbGxiYWNrXyBtdXN0IGJlIHByb3ZpZGVkIHRvIENhY2hlRmV0Y2hlciBmb3IgIgotICAgICAgICAgICAgICAgICAgICAiYWNjZXNzaW5nIGg1dmNjLWNhY2hlOi8vIC4gVGhpcyBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSAiCi0gICAgICAgICAgICAgICAgICAgICJtYWluIFdlYk1vZHVsZS4iOwotICAgICAgRENIRUNLKCFyZWFkX2NhY2hlX2NhbGxiYWNrXy5pc19udWxsKCkpOwotICAgICAgcmV0dXJuIGZldGNoZXIuUGFzcygpOworICAgIGlmICghRmlsZVVSTFRvRmlsZVBhdGgodXJsLCAmZmlsZV9wYXRoKSkgeworICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3JfbWVzc2FnZTsKKyAgICAgIGVycm9yX21lc3NhZ2UgPDwgIkZpbGUgVVJMIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gZmlsZSBwYXRoOiAiIDw8IHVybDsKKyAgICAgIHJldHVybiBzY29wZWRfcHRyPEZldGNoZXI+KG5ldyBFcnJvckZldGNoZXIoaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZS5zdHIoKSkpOwogICAgIH0KIAotICAgIGZldGNoZXIucmVzZXQobmV3IENhY2hlRmV0Y2hlcih1cmwsIHVybF9zZWN1cml0eV9jYWxsYmFjaywgaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9jYWNoZV9jYWxsYmFja18pKTsKLSAgfSBlbHNlIHsgIC8vIE5PTElOVChyZWFkYWJpbGl0eS9icmFjZXMpCi0gICAgRENIRUNLKG5ldHdvcmtfbW9kdWxlXykgPDwgIk5ldHdvcmsgbW9kdWxlIHJlcXVpcmVkLiI7Ci0gICAgTmV0RmV0Y2hlcjo6T3B0aW9ucyBvcHRpb25zOwotICAgIGZldGNoZXIucmVzZXQobmV3IE5ldEZldGNoZXIodXJsLCB1cmxfc2VjdXJpdHlfY2FsbGJhY2ssIGhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrX21vZHVsZV8sIG9wdGlvbnMpKTsKKyAgICBGaWxlRmV0Y2hlcjo6T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMubWVzc2FnZV9sb29wX3Byb3h5ID0gZmlsZV90aHJlYWRfLm1lc3NhZ2VfbG9vcF9wcm94eSgpOworICAgIG9wdGlvbnMuZXh0cmFfc2VhcmNoX2RpciA9IGV4dHJhX3NlYXJjaF9kaXJfOworICAgIHJldHVybiBzY29wZWRfcHRyPEZldGNoZXI+KG5ldyBGaWxlRmV0Y2hlcihmaWxlX3BhdGgsIGhhbmRsZXIsIG9wdGlvbnMpKTsKICAgfQotICByZXR1cm4gZmV0Y2hlci5QYXNzKCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoRU5BQkxFX0FCT1VUX1NDSEVNRSkKKyAgaWYgKHVybC5TY2hlbWVJcyhrQWJvdXRTY2hlbWUpKSB7CisgICAgcmV0dXJuIHNjb3BlZF9wdHI8RmV0Y2hlcj4obmV3IEFib3V0RmV0Y2hlcihoYW5kbGVyKSk7CisgIH0KKyNlbmRpZgorCisgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yX21lc3NhZ2U7CisgIGVycm9yX21lc3NhZ2UgPDwgIlNjaGVtZSAiIDw8IHVybC5zY2hlbWUoKSA8PCAiOiBpcyBub3Qgc3VwcG9ydGVkIjsKKyAgcmV0dXJuIHNjb3BlZF9wdHI8RmV0Y2hlcj4obmV3IEVycm9yRmV0Y2hlcihoYW5kbGVyLCBlcnJvcl9tZXNzYWdlLnN0cigpKSk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBsb2FkZXIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2ZldGNoZXJfZmFjdG9yeV90ZXN0LmNjIGIvc3JjL2NvYmFsdC9sb2FkZXIvZmV0Y2hlcl9mYWN0b3J5X3Rlc3QuY2MKaW5kZXggN2U1MjVlMS4uZTM5ZDBhNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvZmV0Y2hlcl9mYWN0b3J5X3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvZmV0Y2hlcl9mYWN0b3J5X3Rlc3QuY2MKQEAgLTE0LDYgKzE0LDcgQEAKIAogI2luY2x1ZGUgPHN0cmluZz4KIAorI2luY2x1ZGUgImJhc2Uvb3B0aW9uYWwuaCIKICNpbmNsdWRlICJiYXNlL3J1bl9sb29wLmgiCiAjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9mZXRjaGVyX2ZhY3RvcnkuaCIKICNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2ZpbGVfZmV0Y2hlci5oIgpAQCAtMjYsMzIgKzI3LDMyIEBACiBjbGFzcyBTdHViRmV0Y2hlckhhbmRsZXIgOiBwdWJsaWMgRmV0Y2hlcjo6SGFuZGxlciB7CiAgcHVibGljOgogICBleHBsaWNpdCBTdHViRmV0Y2hlckhhbmRsZXIoYmFzZTo6UnVuTG9vcCogcnVuX2xvb3ApCi0gICAgICA6IGZldGNoZXJfKE5VTEwpLCBydW5fbG9vcF8ocnVuX2xvb3ApIHt9CisgICAgICA6IHJ1bl9sb29wXyhydW5fbG9vcCksIGZldGNoZXJfKE5VTEwpIHt9CiAKICAgLy8gRnJvbSBGZXRjaGVyOjpIYW5kbGVyLgogICB2b2lkIE9uUmVjZWl2ZWQoRmV0Y2hlciogZmV0Y2hlciwgY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIE9WRVJSSURFIHsKICAgICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKGRhdGEpOwogICAgIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIoc2l6ZSk7Ci0gICAgQ2hlY2tGZXRjaGVyKGZldGNoZXIpOworICAgIENoZWNrU2FtZUZldGNoZXIoZmV0Y2hlcik7CiAgIH0KICAgdm9pZCBPbkRvbmUoRmV0Y2hlciogZmV0Y2hlcikgT1ZFUlJJREUgewotICAgIENoZWNrRmV0Y2hlcihmZXRjaGVyKTsKLSAgICBpZiAocnVuX2xvb3BfKSB7Ci0gICAgICBNZXNzYWdlTG9vcDo6Y3VycmVudCgpLT5Qb3N0VGFzayhGUk9NX0hFUkUsIHJ1bl9sb29wXy0+UXVpdENsb3N1cmUoKSk7Ci0gICAgfQorICAgIENoZWNrU2FtZUZldGNoZXIoZmV0Y2hlcik7CisgICAgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKS0+UG9zdFRhc2soRlJPTV9IRVJFLCBydW5fbG9vcF8tPlF1aXRDbG9zdXJlKCkpOwogICB9Ci0gIHZvaWQgT25FcnJvcihGZXRjaGVyKiBmZXRjaGVyLCBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3IpIE9WRVJSSURFIHsKLSAgICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKGVycm9yKTsKLSAgICBDaGVja0ZldGNoZXIoZmV0Y2hlcik7Ci0gICAgaWYgKHJ1bl9sb29wXykgewotICAgICAgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKS0+UG9zdFRhc2soRlJPTV9IRVJFLCBydW5fbG9vcF8tPlF1aXRDbG9zdXJlKCkpOwotICAgIH0KKyAgdm9pZCBPbkVycm9yKEZldGNoZXIqIGZldGNoZXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcl9tZXNzYWdlKSBPVkVSUklERSB7CisgICAgQ2hlY2tTYW1lRmV0Y2hlcihmZXRjaGVyKTsKKyAgICBlcnJvcl9tZXNzYWdlXyA9IGVycm9yX21lc3NhZ2U7CisgICAgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKS0+UG9zdFRhc2soRlJPTV9IRVJFLCBydW5fbG9vcF8tPlF1aXRDbG9zdXJlKCkpOwogICB9CiAKICAgRmV0Y2hlciogZmV0Y2hlcigpIGNvbnN0IHsgcmV0dXJuIGZldGNoZXJfOyB9CiAKKyAgY29uc3QgYmFzZTo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+JiBlcnJvcl9tZXNzYWdlKCkgY29uc3QgeworICAgIHJldHVybiBlcnJvcl9tZXNzYWdlXzsKKyAgfQorCiAgcHJpdmF0ZToKLSAgdm9pZCBDaGVja0ZldGNoZXIoRmV0Y2hlciogZmV0Y2hlcikgeworICB2b2lkIENoZWNrU2FtZUZldGNoZXIoRmV0Y2hlciogZmV0Y2hlcikgewogICAgIEVYUEVDVF9UUlVFKGZldGNoZXIpOwogICAgIGlmIChmZXRjaGVyXyA9PSBOVUxMKSB7CiAgICAgICBmZXRjaGVyXyA9IGZldGNoZXI7CkBAIC02MCw4ICs2MSw5IEBACiAgICAgRVhQRUNUX0VRKGZldGNoZXJfLCBmZXRjaGVyKTsKICAgfQogCi0gIEZldGNoZXIqIGZldGNoZXJfOwogICBiYXNlOjpSdW5Mb29wKiBydW5fbG9vcF87CisgIEZldGNoZXIqIGZldGNoZXJfOworICBiYXNlOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gZXJyb3JfbWVzc2FnZV87CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UKQEAgLTc5LDI3ICs4MSw0MiBAQAogfTsKIAogVEVTVF9GKEZldGNoZXJGYWN0b3J5VGVzdCwgSW52YWxpZFVSTCkgewotICBTdHViRmV0Y2hlckhhbmRsZXIgc3R1Yl9mZXRjaGVyX2hhbmRsZXIoTlVMTCk7CisgIGJhc2U6OlJ1bkxvb3AgcnVuX2xvb3A7CisgIFN0dWJGZXRjaGVySGFuZGxlciBzdHViX2ZldGNoZXJfaGFuZGxlcigmcnVuX2xvb3ApOworCiAgIGZldGNoZXJfID0gZmV0Y2hlcl9mYWN0b3J5Xy5DcmVhdGVGZXRjaGVyKEdVUkwoImludmFsaWQtdXJsIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHViX2ZldGNoZXJfaGFuZGxlcik7Ci0gIEVYUEVDVF9GQUxTRShmZXRjaGVyXy5nZXQoKSk7Ci0gIEVYUEVDVF9GQUxTRShzdHViX2ZldGNoZXJfaGFuZGxlci5mZXRjaGVyKCkpOworICBFWFBFQ1RfVFJVRShmZXRjaGVyXyk7CisKKyAgcnVuX2xvb3AuUnVuKCk7CisgIEVYUEVDVF9FUShmZXRjaGVyXy5nZXQoKSwgc3R1Yl9mZXRjaGVyX2hhbmRsZXIuZmV0Y2hlcigpKTsKKyAgRVhQRUNUX1RSVUUoc3R1Yl9mZXRjaGVyX2hhbmRsZXIuZXJyb3JfbWVzc2FnZSgpLmhhc19lbmdhZ2VkKCkpOwogfQogCiBURVNUX0YoRmV0Y2hlckZhY3RvcnlUZXN0LCBFbXB0eUZpbGVVUkwpIHsKLSAgU3R1YkZldGNoZXJIYW5kbGVyIHN0dWJfZmV0Y2hlcl9oYW5kbGVyKE5VTEwpOworICBiYXNlOjpSdW5Mb29wIHJ1bl9sb29wOworICBTdHViRmV0Y2hlckhhbmRsZXIgc3R1Yl9mZXRjaGVyX2hhbmRsZXIoJnJ1bl9sb29wKTsKKwogICBmZXRjaGVyXyA9CiAgICAgICBmZXRjaGVyX2ZhY3RvcnlfLkNyZWF0ZUZldGNoZXIoR1VSTCgiZmlsZTovLy8iKSwgJnN0dWJfZmV0Y2hlcl9oYW5kbGVyKTsKLSAgRVhQRUNUX0ZBTFNFKGZldGNoZXJfLmdldCgpKTsKLSAgRVhQRUNUX0ZBTFNFKHN0dWJfZmV0Y2hlcl9oYW5kbGVyLmZldGNoZXIoKSk7CisgIEVYUEVDVF9UUlVFKGZldGNoZXJfKTsKKworICBydW5fbG9vcC5SdW4oKTsKKyAgRVhQRUNUX0VRKGZldGNoZXJfLmdldCgpLCBzdHViX2ZldGNoZXJfaGFuZGxlci5mZXRjaGVyKCkpOworICBFWFBFQ1RfVFJVRShzdHViX2ZldGNoZXJfaGFuZGxlci5lcnJvcl9tZXNzYWdlKCkuaGFzX2VuZ2FnZWQoKSk7CiB9CiAKIFRFU1RfRihGZXRjaGVyRmFjdG9yeVRlc3QsIEZpbGVVUkxDYW5ub3RDb252ZXJ0VG9GaWxlUGF0aCkgewotICBTdHViRmV0Y2hlckhhbmRsZXIgc3R1Yl9mZXRjaGVyX2hhbmRsZXIoTlVMTCk7CisgIGJhc2U6OlJ1bkxvb3AgcnVuX2xvb3A7CisgIFN0dWJGZXRjaGVySGFuZGxlciBzdHViX2ZldGNoZXJfaGFuZGxlcigmcnVuX2xvb3ApOworCiAgIGZldGNoZXJfID0gZmV0Y2hlcl9mYWN0b3J5Xy5DcmVhdGVGZXRjaGVyKEdVUkwoImZpbGU6Ly9maWxlLnR4dCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3R1Yl9mZXRjaGVyX2hhbmRsZXIpOwotICBFWFBFQ1RfRkFMU0UoZmV0Y2hlcl8uZ2V0KCkpOwotICBFWFBFQ1RfRkFMU0Uoc3R1Yl9mZXRjaGVyX2hhbmRsZXIuZmV0Y2hlcigpKTsKKyAgRVhQRUNUX1RSVUUoZmV0Y2hlcl8pOworCisgIHJ1bl9sb29wLlJ1bigpOworICBFWFBFQ1RfRVEoZmV0Y2hlcl8uZ2V0KCksIHN0dWJfZmV0Y2hlcl9oYW5kbGVyLmZldGNoZXIoKSk7CisgIEVYUEVDVF9UUlVFKHN0dWJfZmV0Y2hlcl9oYW5kbGVyLmVycm9yX21lc3NhZ2UoKS5oYXNfZW5nYWdlZCgpKTsKIH0KIAogVEVTVF9GKEZldGNoZXJGYWN0b3J5VGVzdCwgTXVsdGlwbGVDcmVhdGlvbnMpIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RhdGFfZGVjb2Rlci5oIGIvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGF0YV9kZWNvZGVyLmgKaW5kZXggMmQ2NDhiNS4uNDMyOTQyYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGF0YV9kZWNvZGVyLmgKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGF0YV9kZWNvZGVyLmgKQEAgLTQ2LDcgKzQ2LDcgQEAKICAgfQogCiAjaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gMyAmJiBTQl9IQVMoR1JBUEhJQ1MpCisjaWYgU0JfSEFTKEdSQVBISUNTKQogICAvLyBTdGFyYm9hcmQgdmVyc2lvbiAzIGFkZHMgc3VwcG9ydCBmb3IgaGFyZHdhcmUgYWNjZWxlcmF0ZWQgaW1hZ2UgZGVjb2RpbmcuCiAgIC8vIEluIG9yZGVyIHRvIG1ha2UgdXNlIG9mIHRoaXMgZmVhdHVyZSwgc3ViY2xhc3NlcyBvZiBJbWFnZURhdGFEZWNvZGVyIG1heQogICAvLyBvdmVycmlkZSB0aGlzIG1ldGhvZCBpbiBvcmRlciB0byByZXR1cm4gYW4gU2JEZWNvZGVUYXJnZXQsIHJhdGhlciB0aGFuIGEKQEAgLTU5LDcgKzU5LDcgQEAKICAgdmlydHVhbCBTYkRlY29kZVRhcmdldCBSZXRyaWV2ZVNiRGVjb2RlVGFyZ2V0KCkgewogICAgIHJldHVybiBrU2JEZWNvZGVUYXJnZXRJbnZhbGlkOwogICB9Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDMgJiYgU0JfSEFTKEdSQVBISUNTKQorI2VuZGlmICAvLyBTQl9IQVMoR1JBUEhJQ1MpCiAjZW5kaWYgIC8vIGRlZmluZWQoU1RBUkJPQVJEKQogCiAgIHZvaWQgRGVjb2RlQ2h1bmsoY29uc3QgdWludDgqIGRhdGEsIHNpemVfdCBzaXplKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RlY29kZXIuY2MgYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9kZWNvZGVyLmNjCmluZGV4IDczOWM1MjMuLjUwZjE2OTkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RlY29kZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGVjb2Rlci5jYwpAQCAtMjksOSArMjksNyBAQAogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvaW1hZ2Uvd2VicF9pbWFnZV9kZWNvZGVyLmgiCiAjaW5jbHVkZSAibmV0L2Jhc2UvbWltZV91dGlsLmgiCiAjaW5jbHVkZSAibmV0L2h0dHAvaHR0cF9zdGF0dXNfY29kZS5oIgotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQogI2luY2x1ZGUgInN0YXJib2FyZC9pbWFnZS5oIgotI2VuZGlmCiAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIGxvYWRlciB7CkBAIC0xNjEsMTUgKzE1OSwxMyBAQAogICAgICAgRENIRUNLKGRlY29kZXJfKTsKICAgICAgIGlmIChkZWNvZGVyXy0+RmluaXNoV2l0aFN1Y2Nlc3MoKSkgewogICAgICAgICBpZiAoIWRlY29kZXJfLT5oYXNfYW5pbWF0aW9uKCkpIHsKLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSAzICYmIFNCX0hBUyhHUkFQSElDUykKKyNpZiBTQl9IQVMoR1JBUEhJQ1MpCiAgICAgICAgICAgU2JEZWNvZGVUYXJnZXQgdGFyZ2V0ID0gZGVjb2Rlcl8tPlJldHJpZXZlU2JEZWNvZGVUYXJnZXQoKTsKICAgICAgICAgICBpZiAoU2JEZWNvZGVUYXJnZXRJc1ZhbGlkKHRhcmdldCkpIHsKICAgICAgICAgICAgIHN1Y2Nlc3NfY2FsbGJhY2tfLlJ1bihuZXcgU3RhdGljSW1hZ2UoCiAgICAgICAgICAgICAgICAgcmVzb3VyY2VfcHJvdmlkZXJfLT5DcmVhdGVJbWFnZUZyb21TYkRlY29kZVRhcmdldCh0YXJnZXQpKSk7CiAgICAgICAgICAgfSBlbHNlICAvLyBOT0xJTlQKICNlbmRpZgotI2VuZGlmCiAgICAgICAgICAgewogICAgICAgICAgICAgc2NvcGVkX3B0cjxyZW5kZXJfdHJlZTo6SW1hZ2VEYXRhPiBpbWFnZV9kYXRhID0KICAgICAgICAgICAgICAgICBkZWNvZGVyXy0+UmV0cmlldmVJbWFnZURhdGEoKTsKQEAgLTI3MSw4ICsyNjcsNyBAQAogfQogCiBuYW1lc3BhY2UgewotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2lmIFNCX0FQSV9WRVJTSU9OID49IDMgJiYgU0JfSEFTKEdSQVBISUNTKQorI2lmIFNCX0hBUyhHUkFQSElDUykKIGNvbnN0IGNoYXIqIEdldE1pbWVUeXBlRnJvbUltYWdlVHlwZShJbWFnZURlY29kZXI6OkltYWdlVHlwZSBpbWFnZV90eXBlKSB7CiAgIHN3aXRjaCAoaW1hZ2VfdHlwZSkgewogICAgIGNhc2UgSW1hZ2VEZWNvZGVyOjprSW1hZ2VUeXBlSlBFRzoKQEAgLTMzMSw4ICszMjYsNyBAQAogICB9CiAgIHJldHVybiBzY29wZWRfcHRyPEltYWdlRGF0YURlY29kZXI+KCk7CiB9Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDMgJiYgU0JfSEFTKEdSQVBISUNTKQotI2VuZGlmICAvLyBkZWZpbmVkKFNUQVJCT0FSRCkKKyNlbmRpZiAgLy8gU0JfSEFTKEdSQVBISUNTKQogCiBzY29wZWRfcHRyPEltYWdlRGF0YURlY29kZXI+IENyZWF0ZUltYWdlRGVjb2RlckZyb21JbWFnZVR5cGUoCiAgICAgSW1hZ2VEZWNvZGVyOjpJbWFnZVR5cGUgaW1hZ2VfdHlwZSwKQEAgLTM4MywxMiArMzc3LDEwIEBACiAgICAgaW1hZ2VfdHlwZV8gPSBEZXRlcm1pbmVJbWFnZVR5cGUoc2lnbmF0dXJlX2NhY2hlXy5kYXRhKTsKICAgfQogCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gMyAmJiBTQl9IQVMoR1JBUEhJQ1MpCisjaWYgU0JfSEFTKEdSQVBISUNTKQogICBkZWNvZGVyXyA9CiAgICAgICBNYXliZUNyZWF0ZVN0YXJib2FyZERlY29kZXIobWltZV90eXBlXywgaW1hZ2VfdHlwZV8sIHJlc291cmNlX3Byb3ZpZGVyXyk7Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDMgJiYgU0JfSEFTKEdSQVBISUNTKQotI2VuZGlmICAvLyBkZWZpbmVkKFNUQVJCT0FSRCkKKyNlbmRpZiAgLy8gU0JfSEFTKEdSQVBISUNTKQogCiAgIGlmICghZGVjb2Rlcl8pIHsKICAgICBkZWNvZGVyXyA9IENyZWF0ZUltYWdlRGVjb2RlckZyb21JbWFnZVR5cGUoaW1hZ2VfdHlwZV8sIHJlc291cmNlX3Byb3ZpZGVyXyk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9kZWNvZGVyX3N0YXJib2FyZC5jYyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RlY29kZXJfc3RhcmJvYXJkLmNjCmluZGV4IGEwNTE4YzAuLjExODNlZWEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RlY29kZXJfc3RhcmJvYXJkLmNjCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RlY29kZXJfc3RhcmJvYXJkLmNjCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL2RlY29kZV90YXJnZXQuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvaW1hZ2UuaCIKIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDMgJiYgU0JfSEFTKEdSQVBISUNTKQorI2lmIFNCX1RSVUUgJiYgU0JfSEFTKEdSQVBISUNTKQogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBsb2FkZXIgewpAQCAtMzUsMTEgKzM1LDExIEBACiAgICAgOiBJbWFnZURhdGFEZWNvZGVyKHJlc291cmNlX3Byb3ZpZGVyKSwKICAgICAgIG1pbWVfdHlwZV8obWltZV90eXBlKSwKICAgICAgIGZvcm1hdF8oZm9ybWF0KSwKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CisjaWYgU0JfVFJVRQogICAgICAgcHJvdmlkZXJfKHJlc291cmNlX3Byb3ZpZGVyLT5HZXRTYkRlY29kZVRhcmdldEdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKCkpLAotI2Vsc2UgICAvLyAjaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAorI2Vsc2UgICAvLyAjaWYgU0JfVFJVRQogICAgICAgcHJvdmlkZXJfKHJlc291cmNlX3Byb3ZpZGVyLT5HZXRTYkRlY29kZVRhcmdldFByb3ZpZGVyKCkpLAotI2VuZGlmICAvLyAjaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAorI2VuZGlmICAvLyAjaWYgU0JfVFJVRQogICAgICAgdGFyZ2V0XyhrU2JEZWNvZGVUYXJnZXRJbnZhbGlkKSB7CiAgIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojpsb2FkZXI6OmltYWdlIiwKICAgICAgICAgICAgICAgICJJbWFnZURlY29kZXJTdGFyYm9hcmQ6OkltYWdlRGVjb2RlclN0YXJib2FyZCgpIik7CkBAIC03NSw2ICs3NSw2IEBACiB9ICAvLyBuYW1lc3BhY2UgbG9hZGVyCiB9ICAvLyBuYW1lc3BhY2UgY29iYWx0CiAKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gMyAmJiBTQl9IQVMoR1JBUEhJQ1MpCisjZW5kaWYgIC8vIFNCX1RSVUUgJiYgU0JfSEFTKEdSQVBISUNTKQogCiAjZW5kaWYgIC8vICNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RlY29kZXJfc3RhcmJvYXJkLmggYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9kZWNvZGVyX3N0YXJib2FyZC5oCmluZGV4IDM5YjZjYmUuLjE0ZTM4NmQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RlY29kZXJfc3RhcmJvYXJkLmgKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGVjb2Rlcl9zdGFyYm9hcmQuaApAQCAtMTUsOCArMTUsNiBAQAogI2lmbmRlZiBDT0JBTFRfTE9BREVSX0lNQUdFX0lNQUdFX0RFQ09ERVJfU1RBUkJPQVJEX0hfCiAjZGVmaW5lIENPQkFMVF9MT0FERVJfSU1BR0VfSU1BR0VfREVDT0RFUl9TVEFSQk9BUkRfSF8KIAotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotCiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KIApAQCAtMjUsNyArMjMsNyBAQAogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGF0YV9kZWNvZGVyLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL2RlY29kZV90YXJnZXQuaCIKIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDMgJiYgU0JfSEFTKEdSQVBISUNTKQorI2lmIFNCX0hBUyhHUkFQSElDUykKIAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2UgbG9hZGVyIHsKQEAgLTUxLDExICs0OSw3IEBACiAgIGNvbnN0IGNoYXIqIG1pbWVfdHlwZV87CiAgIFNiRGVjb2RlVGFyZ2V0Rm9ybWF0IGZvcm1hdF87CiAgIHN0ZDo6dmVjdG9yPHVpbnQ4PiBidWZmZXJfOwotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgU2JEZWNvZGVUYXJnZXRHcmFwaGljc0NvbnRleHRQcm92aWRlciogcHJvdmlkZXJfOwotI2Vsc2UgICAvLyAjaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAotICBTYkRlY29kZVRhcmdldFByb3ZpZGVyKiBwcm92aWRlcl87Ci0jZW5kaWYgIC8vICNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAgIFNiRGVjb2RlVGFyZ2V0IHRhcmdldF87CiB9OwogCkBAIC02Myw4ICs1Nyw2IEBACiB9ICAvLyBuYW1lc3BhY2UgbG9hZGVyCiB9ICAvLyBuYW1lc3BhY2UgY29iYWx0CiAKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gMyAmJiBTQl9IQVMoR1JBUEhJQ1MpCi0KLSNlbmRpZiAgLy8gZGVmaW5lZChTVEFSQk9BUkQpCisjZW5kaWYgIC8vIFNCX0hBUyhHUkFQSElDUykKIAogI2VuZGlmICAvLyBDT0JBTFRfTE9BREVSX0lNQUdFX0lNQUdFX0RFQ09ERVJfU1RBUkJPQVJEX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXIuZ3lwIGIvc3JjL2NvYmFsdC9sb2FkZXIvbG9hZGVyLmd5cAppbmRleCAyZmFkMmVjLi42YTA3ZjAxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXIuZ3lwCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL2xvYWRlci5neXAKQEAgLTI4LDI5ICsyOCwzMSBAQAogICAgICAgICAnZGVjb2Rlci5oJywKICAgICAgICAgJ2VtYmVkZGVkX2ZldGNoZXIuY2MnLAogICAgICAgICAnZW1iZWRkZWRfZmV0Y2hlci5oJywKLSAgICAgICAgJ2ZldGNoZXIuY2MnLAotICAgICAgICAnZmV0Y2hlci5oJywKKyAgICAgICAgJ2Vycm9yX2ZldGNoZXIuY2MnLAorICAgICAgICAnZXJyb3JfZmV0Y2hlci5oJywKICAgICAgICAgJ2ZldGNoZXJfZmFjdG9yeS5jYycsCiAgICAgICAgICdmZXRjaGVyX2ZhY3RvcnkuaCcsCisgICAgICAgICdmZXRjaGVyLmNjJywKKyAgICAgICAgJ2ZldGNoZXIuaCcsCiAgICAgICAgICdmaWxlX2ZldGNoZXIuY2MnLAogICAgICAgICAnZmlsZV9mZXRjaGVyLmgnLAogICAgICAgICAnZm9udC9yZW1vdGVfdHlwZWZhY2VfY2FjaGUuaCcsCiAgICAgICAgICdmb250L3R5cGVmYWNlX2RlY29kZXIuY2MnLAogICAgICAgICAnZm9udC90eXBlZmFjZV9kZWNvZGVyLmgnLAorICAgICAgICAnaW1hZ2UvYW5pbWF0ZWRfaW1hZ2VfdHJhY2tlci5jYycsCisgICAgICAgICdpbWFnZS9hbmltYXRlZF9pbWFnZV90cmFja2VyLmgnLAogICAgICAgICAnaW1hZ2UvYW5pbWF0ZWRfd2VicF9pbWFnZS5jYycsCiAgICAgICAgICdpbWFnZS9hbmltYXRlZF93ZWJwX2ltYWdlLmgnLAogICAgICAgICAnaW1hZ2UvZHVtbXlfZ2lmX2ltYWdlX2RlY29kZXIuY2MnLAogICAgICAgICAnaW1hZ2UvZHVtbXlfZ2lmX2ltYWdlX2RlY29kZXIuaCcsCi0gICAgICAgICdpbWFnZS9pbWFnZS5oJywKICAgICAgICAgJ2ltYWdlL2ltYWdlX2NhY2hlLmgnLAogICAgICAgICAnaW1hZ2UvaW1hZ2VfZGF0YV9kZWNvZGVyLmNjJywKICAgICAgICAgJ2ltYWdlL2ltYWdlX2RhdGFfZGVjb2Rlci5oJywKLSAgICAgICAgJ2ltYWdlL2ltYWdlX2RlY29kZXIuY2MnLAotICAgICAgICAnaW1hZ2UvaW1hZ2VfZGVjb2Rlci5oJywKICAgICAgICAgJ2ltYWdlL2ltYWdlX2RlY29kZXJfc3RhcmJvYXJkLmNjJywKICAgICAgICAgJ2ltYWdlL2ltYWdlX2RlY29kZXJfc3RhcmJvYXJkLmgnLAotICAgICAgICAnaW1hZ2UvYW5pbWF0ZWRfaW1hZ2VfdHJhY2tlci5jYycsCi0gICAgICAgICdpbWFnZS9hbmltYXRlZF9pbWFnZV90cmFja2VyLmgnLAorICAgICAgICAnaW1hZ2UvaW1hZ2VfZGVjb2Rlci5jYycsCisgICAgICAgICdpbWFnZS9pbWFnZV9kZWNvZGVyLmgnLAorICAgICAgICAnaW1hZ2UvaW1hZ2UuaCcsCiAgICAgICAgICdpbWFnZS9qcGVnX2ltYWdlX2RlY29kZXIuY2MnLAogICAgICAgICAnaW1hZ2UvanBlZ19pbWFnZV9kZWNvZGVyLmgnLAogICAgICAgICAnaW1hZ2UvcG5nX2ltYWdlX2RlY29kZXIuY2MnLApAQCAtNjAsMTEgKzYyLDExIEBACiAgICAgICAgICdpbWFnZS90aHJlYWRlZF9pbWFnZV9kZWNvZGVyX3Byb3h5LmgnLAogICAgICAgICAnaW1hZ2Uvd2VicF9pbWFnZV9kZWNvZGVyLmNjJywKICAgICAgICAgJ2ltYWdlL3dlYnBfaW1hZ2VfZGVjb2Rlci5oJywKLSAgICAgICAgJ2xvYWRlci5jYycsCi0gICAgICAgICdsb2FkZXIuaCcsCiAgICAgICAgICdsb2FkZXJfZmFjdG9yeS5jYycsCiAgICAgICAgICdsb2FkZXJfZmFjdG9yeS5oJywKICAgICAgICAgJ2xvYWRlcl90eXBlcy5oJywKKyAgICAgICAgJ2xvYWRlci5jYycsCisgICAgICAgICdsb2FkZXIuaCcsCiAgICAgICAgICdtZXNoL21lc2hfY2FjaGUuaCcsCiAgICAgICAgICdtZXNoL21lc2hfZGVjb2Rlci5jYycsCiAgICAgICAgICdtZXNoL21lc2hfZGVjb2Rlci5oJywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9kcm1fc3lzdGVtLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZHJtX3N5c3RlbS5oCmluZGV4IDAwZGZhNGEuLmIwYTI2ZmYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9kcm1fc3lzdGVtLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2RybV9zeXN0ZW0uaApAQCAtMjYsMTAgKzI2LDYgQEAKICNpbmNsdWRlICJiYXNlL29wdGlvbmFsLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL2RybS5oIgogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPCA0Ci0jZXJyb3IgIkNvYmFsdCBtZWRpYSBzdGFjayByZXF1aXJlcyBTdGFyYm9hcmQgNCBvciBhYm92ZS4iCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgNAotCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBtZWRpYSB7CiAKQEAgLTk3LDcgKzkzLDcgQEAKICAgICAgICAgICAgICwKICAgICAgICAgICAgIFNlc3Npb25VcGRhdGVLZXlTdGF0dXNlc0NhbGxiYWNrIHVwZGF0ZV9rZXlfc3RhdHVzZXNfY2FsbGJhY2sKICNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRFJNX0tFWV9TVEFUVVNFU19VUERBVEVfU1VQUE9SVF9BUElfVkVSU0lPTgotICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICk7ICAvLyBOT0xJTlQod2hpdGVzcGFjZS9wYXJlbnMpCiAgICAgdm9pZCBzZXRfaWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkKSB7IGlkXyA9IGlkOyB9CiAgICAgY29uc3QgU2Vzc2lvblVwZGF0ZVJlcXVlc3RHZW5lcmF0ZWRDYWxsYmFjayYKICAgICB1cGRhdGVfcmVxdWVzdF9nZW5lcmF0ZWRfY2FsbGJhY2soKSBjb25zdCB7CkBAIC0xMzMsNyArMTI5LDcgQEAKICNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9EUk1fS0VZX1NUQVRVU0VTX1VQREFURV9TVVBQT1JUX0FQSV9WRVJTSU9OCiAgICAgICBTZXNzaW9uVXBkYXRlS2V5U3RhdHVzZXNDYWxsYmFjayBzZXNzaW9uX3VwZGF0ZV9rZXlfc3RhdHVzZXNfY2FsbGJhY2sKICNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRFJNX0tFWV9TVEFUVVNFU19VUERBVEVfU1VQUE9SVF9BUElfVkVSU0lPTgotICAgICAgKTsKKyAgICAgICk7ICAvLyBOT0xJTlQod2hpdGVzcGFjZS9wYXJlbnMpCiAKICBwcml2YXRlOgogICAvLyBTdG9yZXMgY29udGV4dCBvZiB8R2VuZXJhdGVTZXNzaW9uVXBkYXRlUmVxdWVzdHwuCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc2hlbGxfbWVkaWFfcGxhdGZvcm0uaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zaGVsbF9tZWRpYV9wbGF0Zm9ybS5oCmluZGV4IDczNTEwZmQuLjFlNmM3MTEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zaGVsbF9tZWRpYV9wbGF0Zm9ybS5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zaGVsbF9tZWRpYV9wbGF0Zm9ybS5oCkBAIC02MywxNCArNjMsMTAgQEAKICAgICByZXR1cm4gTlVMTDsKICAgfQogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICB2aXJ0dWFsIFNiRGVjb2RlVGFyZ2V0R3JhcGhpY3NDb250ZXh0UHJvdmlkZXIqCiAgIEdldFNiRGVjb2RlVGFyZ2V0R3JhcGhpY3NDb250ZXh0UHJvdmlkZXIoKSB7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KLSNlbGlmIFNCX0FQSV9WRVJTSU9OID49IDMKLSAgdmlydHVhbCBTYkRlY29kZVRhcmdldFByb3ZpZGVyKiBHZXRTYkRlY29kZVRhcmdldFByb3ZpZGVyKCkgeyByZXR1cm4gTlVMTDsgfQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSAzCiAKICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIHRoZSBkZWNvZGVyIGJ1ZmZlciBsZWF2ZXMgdGhlIGRlbXV4ZXIgYW5kCiAgIC8vIGlzIGJlaW5nIHNlbnQgdG8gdGhlIG1lZGlhIHBpcGVsaW5lIGZvciBkZWNyeXB0aW5nIGFuZCBkZWNvZGluZy4gVGhlCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc2hlbGxfdmlkZW9fZnJhbWVfcHJvdmlkZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zaGVsbF92aWRlb19mcmFtZV9wcm92aWRlci5oCmluZGV4IGE1YmQ5NjkuLmUyYjE1NjkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zaGVsbF92aWRlb19mcmFtZV9wcm92aWRlci5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zaGVsbF92aWRlb19mcmFtZV9wcm92aWRlci5oCkBAIC00OSw5ICs0OSw3IEBACiAKICAgU2hlbGxWaWRlb0ZyYW1lUHJvdmlkZXIoKSA6IG91dHB1dF9tb2RlXyhrT3V0cHV0TW9kZUludmFsaWQpIHt9CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAgIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8U2JEZWNvZGVUYXJnZXQoKT4gR2V0Q3VycmVudFNiRGVjb2RlVGFyZ2V0RnVuY3Rpb247Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKIAogICBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IEdldEN1cnJlbnRGcmFtZSgpIHsgcmV0dXJuIE5VTEw7IH0KIApAQCAtNjUsNyArNjMsNiBAQAogICAgIHJldHVybiBvdXRwdXRfbW9kZV87CiAgIH0KIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgLy8gRm9yIFN0YXJib2FyZCBwbGF0Zm9ybXMgdGhhdCBoYXZlIGEgZGVjb2RlLXRvLXRleHR1cmUgcGxheWVyLCB3ZSBlbmFibGUKICAgLy8gdGhpcyBTaGVsbFZpZGVvRnJhbWVQcm92aWRlciB0byBhY3QgYXMgYSBicmlkZ2UgZm9yIENvYmFsdCBjb2RlIHRvIHF1ZXJ5CiAgIC8vIGZvciB0aGUgY3VycmVudCBTYkRlY29kZVRhcmdldC4gIEluIGVmZmVjdCwgd2UgYnlwYXNzIGFsbCBvZgpAQCAtOTEsMTUgKzg4LDEyIEBACiAgICAgICByZXR1cm4gZ2V0X2N1cnJlbnRfc2JfZGVjb2RlX3RhcmdldF9mdW5jdGlvbl8uUnVuKCk7CiAgICAgfQogICB9Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKIAogIHByaXZhdGU6CiAgIG11dGFibGUgYmFzZTo6TG9jayBsb2NrXzsKIAogICBPdXRwdXRNb2RlIG91dHB1dF9tb2RlXzsKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAgIEdldEN1cnJlbnRTYkRlY29kZVRhcmdldEZ1bmN0aW9uIGdldF9jdXJyZW50X3NiX2RlY29kZV90YXJnZXRfZnVuY3Rpb25fOwotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiAKICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNoZWxsVmlkZW9GcmFtZVByb3ZpZGVyKTsKIH07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc3RhcmJvYXJkX3BsYXllci5jYyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zdGFyYm9hcmRfcGxheWVyLmNjCmluZGV4IGNiODc0OWMuLjljZjM4MmEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zdGFyYm9hcmRfcGxheWVyLmNjCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zdGFyYm9hcmRfcGxheWVyLmNjCkBAIC05NiwxMSArOTYsOSBAQAogICBEQ0hFQ0soaG9zdF8pOwogICBEQ0hFQ0soc2V0X2JvdW5kc19oZWxwZXJfKTsKIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgb3V0cHV0X21vZGVfID0gQ29tcHV0ZVNiUGxheWVyT3V0cHV0TW9kZSgKICAgICAgIE1lZGlhVmlkZW9Db2RlY1RvU2JNZWRpYVZpZGVvQ29kZWModmlkZW9fY29uZmlnLmNvZGVjKCkpLCBkcm1fc3lzdGVtLAogICAgICAgcHJlZmVyX2RlY29kZV90b190ZXh0dXJlKTsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogCiAgIENyZWF0ZVBsYXllcigpOwogCkBAIC0xMTgsMTEgKzExNiw5IEBACiAKICAgU2hlbGxNZWRpYVBsYXRmb3JtOjpJbnN0YW5jZSgpLT5HZXRWaWRlb0ZyYW1lUHJvdmlkZXIoKS0+U2V0T3V0cHV0TW9kZSgKICAgICAgIFNoZWxsVmlkZW9GcmFtZVByb3ZpZGVyOjprT3V0cHV0TW9kZUludmFsaWQpOwotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgU2hlbGxNZWRpYVBsYXRmb3JtOjpJbnN0YW5jZSgpCiAgICAgICAtPkdldFZpZGVvRnJhbWVQcm92aWRlcigpCiAgICAgICAtPlJlc2V0R2V0Q3VycmVudFNiRGVjb2RlVGFyZ2V0RnVuY3Rpb24oKTsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogCiAgIGlmIChTYlBsYXllcklzVmFsaWQocGxheWVyXykpIHsKICAgICBTYlBsYXllckRlc3Ryb3kocGxheWVyXyk7CkBAIC0yMTEsMTMgKzIwNyw5IEBACiAgIH0KIAogICBEQ0hFQ0soU2JQbGF5ZXJJc1ZhbGlkKHBsYXllcl8pKTsKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAgIGNvbnN0IGludCBrWkluZGV4ID0gMDsKICAgU2JQbGF5ZXJTZXRCb3VuZHMocGxheWVyXywga1pJbmRleCwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksCiAgICAgICAgICAgICAgICAgICAgIHJlY3QuaGVpZ2h0KCkpOwotI2Vsc2UgICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0Ci0gIFNiUGxheWVyU2V0Qm91bmRzKHBsYXllcl8sIHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogfQogCiB2b2lkIFN0YXJib2FyZFBsYXllcjo6UHJlcGFyZUZvclNlZWsoKSB7CkBAIC0yMzEsMTEgKzIyMyw3IEBACiAgIH0KIAogICArK3RpY2tldF87Ci0jaWYgU0JfQVBJX1ZFUlNJT04gPCA0Ci0gIFNiUGxheWVyU2V0UGF1c2UocGxheWVyXywgdHJ1ZSk7Ci0jZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OIDwgNAogICBTYlBsYXllclNldFBsYXliYWNrUmF0ZShwbGF5ZXJfLCAwLmYpOwotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IDQKIH0KIAogdm9pZCBTdGFyYm9hcmRQbGF5ZXI6OlNlZWsoYmFzZTo6VGltZURlbHRhIHRpbWUpIHsKQEAgLTI2MCwxMSArMjQ4LDcgQEAKICAgKyt0aWNrZXRfOwogICBTYlBsYXllclNlZWsocGxheWVyXywgVGltZURlbHRhVG9TYk1lZGlhVGltZSh0aW1lKSwgdGlja2V0Xyk7CiAgIHNlZWtfcGVuZGluZ18gPSBmYWxzZTsKLSNpZiBTQl9BUElfVkVSU0lPTiA8IDQKLSAgU2JQbGF5ZXJTZXRQYXVzZShwbGF5ZXJfLCBwbGF5YmFja19yYXRlXyA9PSAwLjApOwotI2Vsc2UgIC8vIFNCX0FQSV9WRVJTSU9OIDwgNAogICBTYlBsYXllclNldFBsYXliYWNrUmF0ZShwbGF5ZXJfLCBwbGF5YmFja19yYXRlXyk7Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgNAogfQogCiB2b2lkIFN0YXJib2FyZFBsYXllcjo6U2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSkgewpAQCAtMjk1LDExICsyNzksNyBAQAogICAgIHJldHVybjsKICAgfQogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPCA0Ci0gIFNiUGxheWVyU2V0UGF1c2UocGxheWVyXywgcGxheWJhY2tfcmF0ZSA9PSAwLjApOwotI2Vsc2UgICAvLyBTQl9BUElfVkVSU0lPTiA8IDQKICAgU2JQbGF5ZXJTZXRQbGF5YmFja1JhdGUocGxheWVyXywgcGxheWJhY2tfcmF0ZSk7Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgNAogfQogCiB2b2lkIFN0YXJib2FyZFBsYXllcjo6R2V0SW5mbyh1aW50MzIqIHZpZGVvX2ZyYW1lc19kZWNvZGVkLApAQCAtMzQ5LDExICszMjksNyBAQAogCiAgIERDSEVDSyhTYlBsYXllcklzVmFsaWQocGxheWVyXykpOwogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPCA0Ci0gIFNiUGxheWVyU2V0UGF1c2UocGxheWVyXywgdHJ1ZSk7Ci0jZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OIDwgNAogICBTYlBsYXllclNldFBsYXliYWNrUmF0ZShwbGF5ZXJfLCAwLjApOwotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IDQKIAogICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwogCkBAIC0zOTEsNyArMzY3LDYgQEAKIH0KIAogbmFtZXNwYWNlIHsKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiBTaGVsbFZpZGVvRnJhbWVQcm92aWRlcjo6T3V0cHV0TW9kZSBUb1ZpZGVvRnJhbWVQcm92aWRlck91dHB1dE1vZGUoCiAgICAgU2JQbGF5ZXJPdXRwdXRNb2RlIG91dHB1dF9tb2RlKSB7CiAgIHN3aXRjaCAob3V0cHV0X21vZGUpIHsKQEAgLTQwNiw3ICszODEsNiBAQAogICBOT1RSRUFDSEVEKCk7CiAgIHJldHVybiBTaGVsbFZpZGVvRnJhbWVQcm92aWRlcjo6a091dHB1dE1vZGVJbnZhbGlkOwogfQotI2VuZGlmICAvLyAjaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogfSAgLy8gbmFtZXNwYWNlCiAKIHZvaWQgU3RhcmJvYXJkUGxheWVyOjpDcmVhdGVQbGF5ZXIoKSB7CkBAIC00NDYsMjYgKzQyMCwxNyBAQAogICBTYk1lZGlhVmlkZW9Db2RlYyB2aWRlb19jb2RlYyA9CiAgICAgICBNZWRpYVZpZGVvQ29kZWNUb1NiTWVkaWFWaWRlb0NvZGVjKHZpZGVvX2NvbmZpZ18uY29kZWMoKSk7CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAgIERDSEVDSyhTYlBsYXllck91dHB1dE1vZGVTdXBwb3J0ZWQob3V0cHV0X21vZGVfLCB2aWRlb19jb2RlYywgZHJtX3N5c3RlbV8pKTsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogCi0gIHBsYXllcl8gPSBTYlBsYXllckNyZWF0ZSgKLSAgICAgIHdpbmRvd18sIHZpZGVvX2NvZGVjLCBhdWRpb19jb2RlYywgU0JfUExBWUVSX05PX0RVUkFUSU9OLCBkcm1fc3lzdGVtXywKLSAgICAgICZhdWRpb19oZWFkZXIsICZTdGFyYm9hcmRQbGF5ZXI6OkRlYWxsb2NhdGVTYW1wbGVDQiwKLSAgICAgICZTdGFyYm9hcmRQbGF5ZXI6OkRlY29kZXJTdGF0dXNDQiwgJlN0YXJib2FyZFBsYXllcjo6UGxheWVyU3RhdHVzQ0IsIHRoaXMKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0Ci0gICAgICAsCi0gICAgICBvdXRwdXRfbW9kZV8sCi0gICAgICBTaGVsbE1lZGlhUGxhdGZvcm06Okluc3RhbmNlKCktPkdldFNiRGVjb2RlVGFyZ2V0R3JhcGhpY3NDb250ZXh0UHJvdmlkZXIoKQotI2VsaWYgU0JfQVBJX1ZFUlNJT04gPj0gMwotICAgICAgLAotICAgICAgU2hlbGxNZWRpYVBsYXRmb3JtOjpJbnN0YW5jZSgpLT5HZXRTYkRlY29kZVRhcmdldFByb3ZpZGVyKCkgIC8vIHByb3ZpZGVyCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDMKLSAgICAgICAgICApOworICBwbGF5ZXJfID0gU2JQbGF5ZXJDcmVhdGUod2luZG93XywgdmlkZW9fY29kZWMsIGF1ZGlvX2NvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JfUExBWUVSX05PX0RVUkFUSU9OLCBkcm1fc3lzdGVtXywgJmF1ZGlvX2hlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdGFyYm9hcmRQbGF5ZXI6OkRlYWxsb2NhdGVTYW1wbGVDQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdGFyYm9hcmRQbGF5ZXI6OkRlY29kZXJTdGF0dXNDQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdGFyYm9hcmRQbGF5ZXI6OlBsYXllclN0YXR1c0NCLCB0aGlzLCBvdXRwdXRfbW9kZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTaGVsbE1lZGlhUGxhdGZvcm06Okluc3RhbmNlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldFNiRGVjb2RlVGFyZ2V0R3JhcGhpY3NDb250ZXh0UHJvdmlkZXIoKSk7CiAgIERDSEVDSyhTYlBsYXllcklzVmFsaWQocGxheWVyXykpOwogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICBpZiAob3V0cHV0X21vZGVfID09IGtTYlBsYXllck91dHB1dE1vZGVEZWNvZGVUb1RleHR1cmUpIHsKICAgICAvLyBJZiB0aGUgcGxheWVyIGlzIHNldHVwIHRvIGRlY29kZSB0byB0ZXh0dXJlLCB0aGVuIHByb3ZpZGUgQ29iYWx0IHdpdGgKICAgICAvLyBhIG1ldGhvZCBvZiBxdWVyeWluZyB0aGF0IHRleHR1cmUuCkBAIC00NzcsMTAgKzQ0Miw2IEBACiAgIH0KICAgU2hlbGxNZWRpYVBsYXRmb3JtOjpJbnN0YW5jZSgpLT5HZXRWaWRlb0ZyYW1lUHJvdmlkZXIoKS0+U2V0T3V0cHV0TW9kZSgKICAgICAgIFRvVmlkZW9GcmFtZVByb3ZpZGVyT3V0cHV0TW9kZShvdXRwdXRfbW9kZV8pKTsKLSNlbHNlICAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAotICBTaGVsbE1lZGlhUGxhdGZvcm06Okluc3RhbmNlKCktPkdldFZpZGVvRnJhbWVQcm92aWRlcigpLT5TZXRPdXRwdXRNb2RlKAotICAgICAgU2hlbGxWaWRlb0ZyYW1lUHJvdmlkZXI6OmtPdXRwdXRNb2RlUHVuY2hPdXQpOwotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiAKICAgc2V0X2JvdW5kc19oZWxwZXJfLT5TZXRQbGF5ZXIodGhpcyk7CiAKQEAgLTQ5MCwxNCArNDUxLDEzIEBACiAgIH0KIH0KIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKIFNiRGVjb2RlVGFyZ2V0IFN0YXJib2FyZFBsYXllcjo6R2V0Q3VycmVudFNiRGVjb2RlVGFyZ2V0KCkgewogICByZXR1cm4gU2JQbGF5ZXJHZXRDdXJyZW50RnJhbWUocGxheWVyXyk7CiB9CisKIFNiUGxheWVyT3V0cHV0TW9kZSBTdGFyYm9hcmRQbGF5ZXI6OkdldFNiUGxheWVyT3V0cHV0TW9kZSgpIHsKICAgcmV0dXJuIG91dHB1dF9tb2RlXzsKIH0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogCiB2b2lkIFN0YXJib2FyZFBsYXllcjo6Q2xlYXJEZWNvZGVyQnVmZmVyQ2FjaGUoKSB7CiAgIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwpAQCAtNTcyLDExICs1MzIsNyBAQAogICAgIH0KICAgICBTYlBsYXllclNlZWsocGxheWVyXywgVGltZURlbHRhVG9TYk1lZGlhVGltZShwcmVyb2xsX3RpbWVzdGFtcF8pLCB0aWNrZXRfKTsKICAgICBTZXRWb2x1bWUodm9sdW1lXyk7Ci0jaWYgU0JfQVBJX1ZFUlNJT04gPCA0Ci0gICAgU2JQbGF5ZXJTZXRQYXVzZShwbGF5ZXJfLCBwbGF5YmFja19yYXRlXyA9PSAwLjApOwotI2Vsc2UgIC8vIFNCX0FQSV9WRVJTSU9OIDwgNAogICAgIFNiUGxheWVyU2V0UGxheWJhY2tSYXRlKHBsYXllcl8sIHBsYXliYWNrX3JhdGVfKTsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCA0CiAgICAgcmV0dXJuOwogICB9CiAgIGhvc3RfLT5PblBsYXllclN0YXR1cyhzdGF0ZSk7CkBAIC02MjgsNyArNTg0LDYgQEAKICAgICAgICAgICAgICAgICAgaGVscGVyLT5jYWxsYmFja19oZWxwZXJfLCBzYW1wbGVfYnVmZmVyKSk7CiB9CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAvLyBzdGF0aWMKIFNiUGxheWVyT3V0cHV0TW9kZSBTdGFyYm9hcmRQbGF5ZXI6OkNvbXB1dGVTYlBsYXllck91dHB1dE1vZGUoCiAgICAgU2JNZWRpYVZpZGVvQ29kZWMgY29kZWMsIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0sCkBAIC02NTgsNyArNjEzLDYgQEAKIAogICByZXR1cm4gb3V0cHV0X21vZGU7CiB9Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKIAogfSAgLy8gbmFtZXNwYWNlIG1lZGlhCiB9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc3RhcmJvYXJkX3BsYXllci5oIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3N0YXJib2FyZF9wbGF5ZXIuaAppbmRleCBkMmMwMmYxLi5hZDFhMzFhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc3RhcmJvYXJkX3BsYXllci5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zdGFyYm9hcmRfcGxheWVyLmgKQEAgLTczLDEwICs3Myw4IEBACiAgIHZvaWQgU3VzcGVuZCgpOwogICB2b2lkIFJlc3VtZSgpOwogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICBTYkRlY29kZVRhcmdldCBHZXRDdXJyZW50U2JEZWNvZGVUYXJnZXQoKTsKICAgU2JQbGF5ZXJPdXRwdXRNb2RlIEdldFNiUGxheWVyT3V0cHV0TW9kZSgpOwotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiAKICBwcml2YXRlOgogICBlbnVtIFN0YXRlIHsKQEAgLTEyNywxMyArMTI1LDExIEBACiAgIHN0YXRpYyB2b2lkIERlYWxsb2NhdGVTYW1wbGVDQihTYlBsYXllciBwbGF5ZXIsIHZvaWQqIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBzYW1wbGVfYnVmZmVyKTsKIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgLy8gUmV0dXJucyB0aGUgb3V0cHV0IG1vZGUgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgYSB2aWRlbyB3aXRoIHRoZSBnaXZlbgogICAvLyBzcGVjaWZpY2F0aW9ucy4KICAgc3RhdGljIFNiUGxheWVyT3V0cHV0TW9kZSBDb21wdXRlU2JQbGF5ZXJPdXRwdXRNb2RlKAogICAgICAgU2JNZWRpYVZpZGVvQ29kZWMgY29kZWMsIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0sCiAgICAgICBib29sIHByZWZlcl9kZWNvZGVfdG9fdGV4dHVyZSk7Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKIAogICAvLyBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBhcmUgaW5pdGlhbGl6ZWQgaW4gdGhlIGN0b3IgYW5kIG5ldmVyIGNoYW5nZWQuCiAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4gbWVzc2FnZV9sb29wXzsKQEAgLTE3MSwxMCArMTY3LDggQEAKICAgdWludDMyIGNhY2hlZF92aWRlb19mcmFtZXNfZHJvcHBlZF87CiAgIGJhc2U6OlRpbWVEZWx0YSBwcmVyb2xsX3RpbWVzdGFtcF87CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIG91dHB1dCBtb2RlIHdlIGFyZSBzdXBwb3NlZCB0byBvdXRwdXQgdG8uCiAgIFNiUGxheWVyT3V0cHV0TW9kZSBvdXRwdXRfbW9kZV87Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3N0YXJib2FyZF91dGlscy5jYyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zdGFyYm9hcmRfdXRpbHMuY2MKaW5kZXggNzJjNGM3Mi4uYmM2OTA1YSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3N0YXJib2FyZF91dGlscy5jYworKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc3RhcmJvYXJkX3V0aWxzLmNjCkBAIC0xMjgsNyArMTI4LDYgQEAKICAgfQogfQogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogLy8gRW5zdXJlIHRoYXQgdGhlIGVudW1zIGluIHN0YXJib2FyZC9tZWRpYS5oIG1hdGNoIGVudW1zIGluIGdmeDo6Q29sb3JTcGFjZS4KICNkZWZpbmUgRU5VTV9FUShhLCBiKSBcCiAgIENPTVBJTEVfQVNTRVJUKHN0YXRpY19jYXN0PGludD4oYSkgPT0gc3RhdGljX2Nhc3Q8aW50PihiKSwgbWlzbWF0Y2hpbmdfZW51bXMpCkBAIC0yNzksNyArMjc4LDYgQEAKIAogICByZXR1cm4gc2JfbWVkaWFfY29sb3JfbWV0YWRhdGE7CiB9Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDMKIAogfSAgLy8gbmFtZXNwYWNlIG1lZGlhCiB9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc3RhcmJvYXJkX3V0aWxzLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc3RhcmJvYXJkX3V0aWxzLmgKaW5kZXggMGNiNDNjMS4uMDQxOTZiNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3N0YXJib2FyZF91dGlscy5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zdGFyYm9hcmRfdXRpbHMuaApAQCAtMzksMTAgKzM5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgU2JEcm1TYW1wbGVJbmZvKiBkcm1faW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgU2JEcm1TdWJTYW1wbGVNYXBwaW5nKiBzdWJzYW1wbGVfbWFwcGluZyk7CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiBTYk1lZGlhQ29sb3JNZXRhZGF0YSBNZWRpYVRvU2JNZWRpYUNvbG9yTWV0YWRhdGEoCiAgICAgY29uc3QgV2ViTUNvbG9yTWV0YWRhdGEmIHdlYm1fY29sb3JfbWV0YWRhdGEpOwotI2VuZGlmCiAKIH0gIC8vIG5hbWVzcGFjZSBtZWRpYQogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllci5oIGIvc3JjL2NvYmFsdC9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllci5oCmluZGV4IGIzYjVjYjYuLmJlZWUyYWEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXIuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyLmgKQEAgLTE5NCw3ICsxOTQsNyBAQAogIHB1YmxpYzoKICAgdmlydHVhbCB2b2lkIE5ldHdvcmtTdGF0ZUNoYW5nZWQoKSA9IDA7CiAgIHZpcnR1YWwgdm9pZCBSZWFkeVN0YXRlQ2hhbmdlZCgpID0gMDsKLSAgdmlydHVhbCB2b2lkIFRpbWVDaGFuZ2VkKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgVGltZUNoYW5nZWQoYm9vbCBlb3NfcGxheWVkKSA9IDA7CiAgIHZpcnR1YWwgdm9pZCBEdXJhdGlvbkNoYW5nZWQoKSA9IDA7CiAgIHZpcnR1YWwgdm9pZCBPdXRwdXRNb2RlQ2hhbmdlZCgpID0gMDsKICAgdmlydHVhbCB2b2lkIFBsYXliYWNrU3RhdGVDaGFuZ2VkKCkgPSAwOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9pbXBsLmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9pbXBsLmNjCmluZGV4IGJkMGQxNGIuLmM4Y2Y4MGEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfaW1wbC5jYworKysgYi9zcmMvY29iYWx0L21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyX2ltcGwuY2MKQEAgLTU5MCw3ICs1OTAsOCBAQAogICAvLyBVcGRhdGUgb3VyIHBhdXNlZCB0aW1lLgogICBpZiAoc3RhdGVfLnBhdXNlZCkgc3RhdGVfLnBhdXNlZF90aW1lID0gcGlwZWxpbmVfLT5HZXRNZWRpYVRpbWUoKTsKIAotICBHZXRDbGllbnQoKS0+VGltZUNoYW5nZWQoKTsKKyAgY29uc3QgYm9vbCBlb3NfcGxheWVkID0gZmFsc2U7CisgIEdldENsaWVudCgpLT5UaW1lQ2hhbmdlZChlb3NfcGxheWVkKTsKIH0KIAogdm9pZCBXZWJNZWRpYVBsYXllckltcGw6Ok9uUGlwZWxpbmVFbmRlZChQaXBlbGluZVN0YXR1cyBzdGF0dXMpIHsKQEAgLTU5OSw3ICs2MDAsOSBAQAogICAgIE9uUGlwZWxpbmVFcnJvcihzdGF0dXMpOwogICAgIHJldHVybjsKICAgfQotICBHZXRDbGllbnQoKS0+VGltZUNoYW5nZWQoKTsKKworICBjb25zdCBib29sIGVvc19wbGF5ZWQgPSB0cnVlOworICBHZXRDbGllbnQoKS0+VGltZUNoYW5nZWQoZW9zX3BsYXllZCk7CiB9CiAKIHZvaWQgV2ViTWVkaWFQbGF5ZXJJbXBsOjpPblBpcGVsaW5lRXJyb3IoUGlwZWxpbmVTdGF0dXMgZXJyb3IpIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC93ZWJfbWVkaWFfcGxheWVyX2hlbHBlci5jYyBiL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC93ZWJfbWVkaWFfcGxheWVyX2hlbHBlci5jYwppbmRleCA1ODYxOGEyLi4xOTA5YTVjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvd2ViX21lZGlhX3BsYXllcl9oZWxwZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L3dlYl9tZWRpYV9wbGF5ZXJfaGVscGVyLmNjCkBAIC0zNSw3ICszNSw3IEBACiAgIC8vIFdlYk1lZGlhUGxheWVyQ2xpZW50IG1ldGhvZHMKICAgdm9pZCBOZXR3b3JrU3RhdGVDaGFuZ2VkKCkgT1ZFUlJJREUge30KICAgdm9pZCBSZWFkeVN0YXRlQ2hhbmdlZCgpIE9WRVJSSURFIHt9Ci0gIHZvaWQgVGltZUNoYW5nZWQoKSBPVkVSUklERSB7fQorICB2b2lkIFRpbWVDaGFuZ2VkKGJvb2wpIE9WRVJSSURFIHt9CiAgIHZvaWQgRHVyYXRpb25DaGFuZ2VkKCkgT1ZFUlJJREUge30KICAgdm9pZCBPdXRwdXRNb2RlQ2hhbmdlZCgpIE9WRVJSSURFIHt9CiAgIHZvaWQgUGxheWJhY2tTdGF0ZUNoYW5nZWQoKSBPVkVSUklERSB7fQpAQCAtNDgsOSArNDgsOCBAQAogI2VuZGlmICAvLyBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKICAgc3RkOjpzdHJpbmcgU291cmNlVVJMKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gIiI7IH0KICNpZiBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKLSAgdm9pZCBFbmNyeXB0ZWRNZWRpYUluaXREYXRhRW5jb3VudGVyZWQoRW1lSW5pdERhdGFUeXBlIGluaXRfZGF0YV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbml0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGluaXRfZGF0YV9sZW5ndGgpIE9WRVJSSURFIHt9CisgIHZvaWQgRW5jcnlwdGVkTWVkaWFJbml0RGF0YUVuY291bnRlcmVkKEVtZUluaXREYXRhVHlwZSwgY29uc3QgdW5zaWduZWQgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkKSBPVkVSUklERSB7fQogI2VuZGlmICAvLyBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKIH07CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvc2hlbGxfbWVkaWFfcGxhdGZvcm1fc3RhcmJvYXJkLmggYi9zcmMvY29iYWx0L21lZGlhL3NoZWxsX21lZGlhX3BsYXRmb3JtX3N0YXJib2FyZC5oCmluZGV4IDAxMTkyOTMuLjhiYjVjNGMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvc2hlbGxfbWVkaWFfcGxhdGZvcm1fc3RhcmJvYXJkLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9zaGVsbF9tZWRpYV9wbGF0Zm9ybV9zdGFyYm9hcmQuaApAQCAtNDQsNyArNDQsNiBAQAogICAgIHJldHVybiB2aWRlb19mcmFtZV9wcm92aWRlcl87CiAgIH0KIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgU2JEZWNvZGVUYXJnZXRHcmFwaGljc0NvbnRleHRQcm92aWRlcioKICAgR2V0U2JEZWNvZGVUYXJnZXRHcmFwaGljc0NvbnRleHRQcm92aWRlcigpIE9WRVJSSURFIHsKICNpZiBTQl9IQVMoR1JBUEhJQ1MpCkBAIC01MywxNSArNTIsNiBAQAogICAgIHJldHVybiBOVUxMOwogI2VuZGlmICAvLyBTQl9IQVMoR1JBUEhJQ1MpCiAgIH0KLSNlbGlmIFNCX0FQSV9WRVJTSU9OID49IDMKLSAgU2JEZWNvZGVUYXJnZXRQcm92aWRlciogR2V0U2JEZWNvZGVUYXJnZXRQcm92aWRlcigpIE9WRVJSSURFIHsKLSNpZiBTQl9IQVMoR1JBUEhJQ1MpCi0gICAgcmV0dXJuIHJlc291cmNlX3Byb3ZpZGVyXy0+R2V0U2JEZWNvZGVUYXJnZXRQcm92aWRlcigpOwotI2Vsc2UgICAvLyBTQl9IQVMoR1JBUEhJQ1MpCi0gICAgcmV0dXJuIE5VTEw7Ci0jZW5kaWYgIC8vIFNCX0hBUyhHUkFQSElDUykKLSAgfQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiAKICAgdm9pZCBTdXNwZW5kKCkgT1ZFUlJJREUgeyByZXNvdXJjZV9wcm92aWRlcl8gPSBOVUxMOyB9CiAgIHZvaWQgUmVzdW1lKHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyKiByZXNvdXJjZV9wcm92aWRlcikgT1ZFUlJJREUgewpAQCAtMTM0LDcgKzEyNCw2IEBACiAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBidWZmZXIpIE9WRVJSSURFOwogICBib29sIElzT3V0cHV0UHJvdGVjdGVkKCkgT1ZFUlJJREU7CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAgIFNiRGVjb2RlVGFyZ2V0R3JhcGhpY3NDb250ZXh0UHJvdmlkZXIqCiAgIEdldFNiRGVjb2RlVGFyZ2V0R3JhcGhpY3NDb250ZXh0UHJvdmlkZXIoKSBPVkVSUklERSB7CiAjaWYgU0JfSEFTKEdSQVBISUNTKQpAQCAtMTQzLDE1ICsxMzIsNiBAQAogICAgIHJldHVybiBOVUxMOwogI2VuZGlmICAvLyBTQl9IQVMoR1JBUEhJQ1MpCiAgIH0KLSNlbGlmIFNCX0FQSV9WRVJTSU9OID49IDMKLSAgdmlydHVhbCBTYkRlY29kZVRhcmdldFByb3ZpZGVyKiBHZXRTYkRlY29kZVRhcmdldFByb3ZpZGVyKCkgewotI2lmIFNCX0hBUyhHUkFQSElDUykKLSAgICByZXR1cm4gcmVzb3VyY2VfcHJvdmlkZXJfLT5HZXRTYkRlY29kZVRhcmdldFByb3ZpZGVyKCk7Ci0jZWxzZSAgIC8vIFNCX0hBUyhHUkFQSElDUykKLSAgICByZXR1cm4gTlVMTDsKLSNlbmRpZiAgLy8gU0JfSEFTKEdSQVBISUNTKQotICB9Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKIAogICB2b2lkIFN1c3BlbmQoKSBPVkVSUklERSB7IHJlc291cmNlX3Byb3ZpZGVyXyA9IE5VTEw7IH0KICAgdm9pZCBSZXN1bWUoCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L25ldHdvcmsvbG9jYWxfbmV0d29yay5jYyBiL3NyYy9jb2JhbHQvbmV0d29yay9sb2NhbF9uZXR3b3JrLmNjCmluZGV4IDcyNWYzZTQuLjk2NGE1NGUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbmV0d29yay9sb2NhbF9uZXR3b3JrLmNjCisrKyBiL3NyYy9jb2JhbHQvbmV0d29yay9sb2NhbF9uZXR3b3JrLmNjCkBAIC0yMyw3ICsyMyw2IEBACiAKIG5hbWVzcGFjZSB7CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiBib29sIENvbXBhcmVOQnl0ZXNPZkFkZHJlc3MoY29uc3QgU2JTb2NrZXRBZGRyZXNzJiBpcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTYlNvY2tldEFkZHJlc3MmIHNvdXJjZV9hZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNiU29ja2V0QWRkcmVzcyYgbmV0bWFzaywKQEAgLTU3LDIyICs1NiwxNSBAQAogICB9CiB9CiAKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAotCiB9ICAvLyBuYW1lc3BhY2UKIAogYm9vbCBJc0lQSW5Mb2NhbE5ldHdvcmsoY29uc3QgU2JTb2NrZXRBZGRyZXNzJiBkZXN0aW5hdGlvbikgewotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgU2JTb2NrZXRBZGRyZXNzIHNvdXJjZV9hZGRyZXNzOwogICBTYlNvY2tldEFkZHJlc3MgbmV0bWFzazsKICAgaWYgKCEoU2JTb2NrZXRHZXRJbnRlcmZhY2VBZGRyZXNzKCZkZXN0aW5hdGlvbiwgJnNvdXJjZV9hZGRyZXNzLCAmbmV0bWFzaykpKSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAgIHJldHVybiBJc0xvY2FsSVAoZGVzdGluYXRpb24sIHNvdXJjZV9hZGRyZXNzLCBuZXRtYXNrKTsKLSNlbHNlCi0gIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIoZGVzdGluYXRpb24pOwotICByZXR1cm4gZmFsc2U7Ci0jZW5kaWYKIH0KIAogYm9vbCBJc0lQSW5Qcml2YXRlUmFuZ2UoY29uc3QgU2JTb2NrZXRBZGRyZXNzJiBpcCkgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9uZXR3b3JrL3N0YXJib2FyZC91c2VyX2FnZW50X3N0cmluZ19mYWN0b3J5X3N0YXJib2FyZC5jYyBiL3NyYy9jb2JhbHQvbmV0d29yay9zdGFyYm9hcmQvdXNlcl9hZ2VudF9zdHJpbmdfZmFjdG9yeV9zdGFyYm9hcmQuY2MKaW5kZXggYzgyYjE5ZC4uMzQ4N2RkNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9uZXR3b3JrL3N0YXJib2FyZC91c2VyX2FnZW50X3N0cmluZ19mYWN0b3J5X3N0YXJib2FyZC5jYworKysgYi9zcmMvY29iYWx0L25ldHdvcmsvc3RhcmJvYXJkL3VzZXJfYWdlbnRfc3RyaW5nX2ZhY3Rvcnlfc3RhcmJvYXJkLmNjCkBAIC00MSw5ICs0MSw3IEBACiAgICAgY2FzZSBrU2JTeXN0ZW1EZXZpY2VUeXBlT3ZlclRoZVRvcEJveDoKICAgICBjYXNlIGtTYlN5c3RlbURldmljZVR5cGVTZXRUb3BCb3g6CiAgICAgY2FzZSBrU2JTeXN0ZW1EZXZpY2VUeXBlVFY6Ci0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICAgIGNhc2Uga1NiU3lzdGVtRGV2aWNlVHlwZUFuZHJvaWRUVjoKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogICAgICAgcmV0dXJuIHRydWU7CiAgICAgY2FzZSBrU2JTeXN0ZW1EZXZpY2VUeXBlRGVza3RvcFBDOgogICAgIGNhc2Uga1NiU3lzdGVtRGV2aWNlVHlwZVVua25vd246CkBAIC0xMDcsMTEgKzEwNSw5IEBACiAgICAgICBjYXNlIGtTYlN5c3RlbURldmljZVR5cGVUVjoKICAgICAgICAgeW91dHViZV90dl9pbmZvXy0+ZGV2aWNlX3R5cGUgPSBZb3VUdWJlVFZJbmZvOjprVFY7CiAgICAgICAgIGJyZWFrOwotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgICAgIGNhc2Uga1NiU3lzdGVtRGV2aWNlVHlwZUFuZHJvaWRUVjoKICAgICAgICAgeW91dHViZV90dl9pbmZvXy0+ZGV2aWNlX3R5cGUgPSBZb3VUdWJlVFZJbmZvOjprQW5kcm9pZFRWOwogICAgICAgICBicmVhazsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogICAgICAgY2FzZSBrU2JTeXN0ZW1EZXZpY2VUeXBlRGVza3RvcFBDOgogICAgICAgZGVmYXVsdDoKICAgICAgICAgeW91dHViZV90dl9pbmZvXy0+ZGV2aWNlX3R5cGUgPSBZb3VUdWJlVFZJbmZvOjprSW52YWxpZERldmljZVR5cGU7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L25ldHdvcmsvdXNlcl9hZ2VudF9zdHJpbmdfZmFjdG9yeS5jYyBiL3NyYy9jb2JhbHQvbmV0d29yay91c2VyX2FnZW50X3N0cmluZ19mYWN0b3J5LmNjCmluZGV4IDdhZDMxMGIuLjhiZDc4MTUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbmV0d29yay91c2VyX2FnZW50X3N0cmluZ19mYWN0b3J5LmNjCisrKyBiL3NyYy9jb2JhbHQvbmV0d29yay91c2VyX2FnZW50X3N0cmluZ19mYWN0b3J5LmNjCkBAIC0zOSw2ICszOSwyOCBAQAogI2Vycm9yIFVua25vd24gYnVpbGQgY29uZmlndXJhdGlvbi4KICNlbmRpZgogCitzdHJ1Y3QgU2FuaXRpemVSZXBsYWNlbWVudHMgeworICBjb25zdCBjaGFyKiByZXBsYWNlX2NoYXJzOworICBjb25zdCBjaGFyKiByZXBsYWNlX3dpdGg7Cit9IGtTYW5pdGl6ZVJlcGxhY2VtZW50c1tdID0geworICB7ICIsIiwgdTgiXHVGRjBDIiB9LCAgLy8gZnVsbHdpZHRoIGNvbW1hCisgIHsgIl8iLCB1OCJcdTJFMEYiIH0sICAvLyBwYXJhZ3JhcGhvcworICB7ICIvIiwgdTgiXHUyMjE1IiB9LCAgLy8gZGl2aXNpb24gc2xhc2gKKyAgeyAiKCIsIHU4Ilx1RkYwOCIgfSwgIC8vIGZ1bGx3aWR0aCBsZWZ0IHBhcmVuCisgIHsgIikiLCB1OCJcdUZGMDkiIH0sICAvLyBmdWxsd2lkdGggcmlnaHQgcGFyZW4KK307CisKKy8vIFJlcGxhY2UgcmVzZXJ2ZWQgY2hhcmFjdGVycyB3aXRoIFVuaWNvZGUgaG9tb2dseXBocworc3RkOjpzdHJpbmcgU2FuaXRpemUoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICBzdGQ6OnN0cmluZyBjbGVhbihzdHIpOworICBmb3IgKHNpemVfdCBpPTA7IGkgPCBhcnJheXNpemUoa1Nhbml0aXplUmVwbGFjZW1lbnRzKTsgaSsrKSB7CisgICAgY29uc3QgU2FuaXRpemVSZXBsYWNlbWVudHMqIHJlcGxhY2VtZW50ID0ga1Nhbml0aXplUmVwbGFjZW1lbnRzICsgaTsKKyAgICBSZXBsYWNlQ2hhcnMoCisgICAgICAgIGNsZWFuLCByZXBsYWNlbWVudC0+cmVwbGFjZV9jaGFycywgcmVwbGFjZW1lbnQtPnJlcGxhY2Vfd2l0aCwgJmNsZWFuKTsKKyAgfQorICByZXR1cm4gY2xlYW47Cit9CisKIH0gIC8vIG5hbWVzcGFjZQogCiBzdGQ6OnN0cmluZyBVc2VyQWdlbnRTdHJpbmdGYWN0b3J5OjpDcmVhdGVVc2VyQWdlbnRTdHJpbmcoKSB7CkBAIC02NiwxMSArODgsMTIgQEAKICAgaWYgKHlvdXR1YmVfdHZfaW5mb18pIHsKICAgICBiYXNlOjpTdHJpbmdBcHBlbmRGKAogICAgICAgICAmdXNlcl9hZ2VudCwgIiwgJXNfJXNfJXMvJXMgKCVzLCAlcywgJXMpIiwKLSAgICAgICAgeW91dHViZV90dl9pbmZvXy0+bmV0d29ya19vcGVyYXRvci52YWx1ZV9vcigiIikuY19zdHIoKSwKKyAgICAgICAgU2FuaXRpemUoeW91dHViZV90dl9pbmZvXy0+bmV0d29ya19vcGVyYXRvci52YWx1ZV9vcigiIikpLmNfc3RyKCksCiAgICAgICAgIENyZWF0ZURldmljZVR5cGVTdHJpbmcoKS5jX3N0cigpLAotICAgICAgICB5b3V0dWJlX3R2X2luZm9fLT5jaGlwc2V0X21vZGVsX251bWJlci52YWx1ZV9vcigiIikuY19zdHIoKSwKLSAgICAgICAgeW91dHViZV90dl9pbmZvXy0+ZmlybXdhcmVfdmVyc2lvbi52YWx1ZV9vcigiIikuY19zdHIoKSwKLSAgICAgICAgeW91dHViZV90dl9pbmZvXy0+YnJhbmQuY19zdHIoKSwgeW91dHViZV90dl9pbmZvXy0+bW9kZWwuY19zdHIoKSwKKyAgICAgICAgU2FuaXRpemUoeW91dHViZV90dl9pbmZvXy0+Y2hpcHNldF9tb2RlbF9udW1iZXIudmFsdWVfb3IoIiIpKS5jX3N0cigpLAorICAgICAgICBTYW5pdGl6ZSh5b3V0dWJlX3R2X2luZm9fLT5maXJtd2FyZV92ZXJzaW9uLnZhbHVlX29yKCIiKSkuY19zdHIoKSwKKyAgICAgICAgU2FuaXRpemUoeW91dHViZV90dl9pbmZvXy0+YnJhbmQpLmNfc3RyKCksCisgICAgICAgIFNhbml0aXplKHlvdXR1YmVfdHZfaW5mb18tPm1vZGVsKS5jX3N0cigpLAogICAgICAgICBDcmVhdGVDb25uZWN0aW9uVHlwZVN0cmluZygpLmNfc3RyKCkpOwogICB9CiAKQEAgLTExMiwxMCArMTM1LDggQEAKICAgICAgIHJldHVybiAiU1RCIjsKICAgICBjYXNlIFlvdVR1YmVUVkluZm86OmtUVjoKICAgICAgIHJldHVybiAiVFYiOwotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgICBjYXNlIFlvdVR1YmVUVkluZm86OmtBbmRyb2lkVFY6CiAgICAgICByZXR1cm4gIkFUViI7Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKICAgICBjYXNlIFlvdVR1YmVUVkluZm86OmtJbnZhbGlkRGV2aWNlVHlwZToKICAgICBkZWZhdWx0OgogICAgICAgTk9UUkVBQ0hFRCgpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9uZXR3b3JrL3VzZXJfYWdlbnRfc3RyaW5nX2ZhY3RvcnkuaCBiL3NyYy9jb2JhbHQvbmV0d29yay91c2VyX2FnZW50X3N0cmluZ19mYWN0b3J5LmgKaW5kZXggNTg2OTg1NS4uN2Y3Njg2ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9uZXR3b3JrL3VzZXJfYWdlbnRfc3RyaW5nX2ZhY3RvcnkuaAorKysgYi9zcmMvY29iYWx0L25ldHdvcmsvdXNlcl9hZ2VudF9zdHJpbmdfZmFjdG9yeS5oCkBAIC00Nyw5ICs0Nyw3IEBACiAgIHN0cnVjdCBZb3VUdWJlVFZJbmZvIHsKICAgICBlbnVtIERldmljZVR5cGUgewogICAgICAga0ludmFsaWREZXZpY2VUeXBlLAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgICAgIGtBbmRyb2lkVFYsCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKICAgICAgIGtCbHVlUmF5RGlza1BsYXllciwKICAgICAgIGtHYW1lQ29uc29sZSwKICAgICAgIGtPdmVyVGhlVG9wQm94LApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9uZXR3b3JrL3VzZXJfYWdlbnRfc3RyaW5nX2ZhY3RvcnlfdGVzdC5jYyBiL3NyYy9jb2JhbHQvbmV0d29yay91c2VyX2FnZW50X3N0cmluZ19mYWN0b3J5X3Rlc3QuY2MKaW5kZXggNmUzYTY2OS4uODAxNzFiOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9uZXR3b3JrL3VzZXJfYWdlbnRfc3RyaW5nX2ZhY3RvcnlfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L25ldHdvcmsvdXNlcl9hZ2VudF9zdHJpbmdfZmFjdG9yeV90ZXN0LmNjCkBAIC04MiwyMyArODIsMzUgQEAKIGNsYXNzIFVzZXJBZ2VudFN0cmluZ0ZhY3RvcnlXaXRoWW91VHViZVRWSW5mbyA6IHB1YmxpYyBVc2VyQWdlbnRTdHJpbmdGYWN0b3J5IHsKICBwdWJsaWM6CiAgIFVzZXJBZ2VudFN0cmluZ0ZhY3RvcnlXaXRoWW91VHViZVRWSW5mbygpIHsKKyAgICAvLyBUaGVyZSBhcmUgZGVsaWJlcmF0ZWx5IGEgdmFyaWV0eSBvZiB1bmRlcnNjb3JlcywgY29tbWFzLCBzbGFzaGVzLCBhbmQKKyAgICAvLyBwYXJlbnRoZXNlcyBpbiB0aGUgc3RyaW5ncyBiZWxvdyB0byBlbnN1cmUgdGhleSBnZXQgc2FuaXRpemVkLgogICAgIG9zX25hbWVfYW5kX3ZlcnNpb25fID0gIkdMYURPUyAzLjExIjsKICAgICB5b3V0dWJlX3R2X2luZm9fID0gWW91VHViZVRWSW5mbygpOwotICAgIHlvdXR1YmVfdHZfaW5mb18tPm5ldHdvcmtfb3BlcmF0b3IgPSAiQXBlcnR1cmVMYWJvcmF0b3JpZXMiOworICAgIHlvdXR1YmVfdHZfaW5mb18tPm5ldHdvcmtfb3BlcmF0b3IgPSAiQXBlcnR1cmVfU2NpZW5jZV9Jbm5vdmF0b3JzIjsKICAgICB5b3V0dWJlX3R2X2luZm9fLT5kZXZpY2VfdHlwZSA9IFlvdVR1YmVUVkluZm86OmtPdmVyVGhlVG9wQm94OwotICAgIHlvdXR1YmVfdHZfaW5mb18tPmNoaXBzZXRfbW9kZWxfbnVtYmVyID0gIldoZWF0bGV5IjsKLSAgICB5b3V0dWJlX3R2X2luZm9fLT5maXJtd2FyZV92ZXJzaW9uID0gIjAuMDEiOwotICAgIHlvdXR1YmVfdHZfaW5mb18tPmJyYW5kID0gIkFwZXJ0dXJlIFNjaWVuY2UiOworICAgIHlvdXR1YmVfdHZfaW5mb18tPmNoaXBzZXRfbW9kZWxfbnVtYmVyID0gIlAtYm9keS9PcmFuZ2VfQXRsYXMvQmx1ZSI7CisgICAgeW91dHViZV90dl9pbmZvXy0+ZmlybXdhcmVfdmVyc2lvbiA9ICIwLDAxIjsKKyAgICB5b3V0dWJlX3R2X2luZm9fLT5icmFuZCA9ICJBcGVydHVyZSBTY2llbmNlIChMYWJzKSI7CiAgICAgeW91dHViZV90dl9pbmZvXy0+bW9kZWwgPSAiR0xhRE9TIjsKICAgfQogfTsKIAorLy8gTG9vay1hbGlrZSByZXBsYWNlbWVudHMgZXhwZWN0ZWQgZnJvbSBzYW5pdGl6aW5nIGZpZWxkcworI2RlZmluZSBDT01NQSAgdTgiXHVGRjBDIiAgLy8gZnVsbHdpZHRoIGNvbW1hCisjZGVmaW5lIFVOREVSICB1OCJcdTJFMEYiICAvLyBwYXJhZ3JhcGhvcworI2RlZmluZSBTTEFTSCAgdTgiXHUyMjE1IiAgLy8gZGl2aXNpb24gc2xhc2gKKyNkZWZpbmUgTFBBUkVOIHU4Ilx1RkYwOCIgIC8vIGZ1bGx3aWR0aCBsZWZ0IHBhcmVuCisjZGVmaW5lIFJQQVJFTiB1OCJcdUZGMDkiICAvLyBmdWxsd2lkdGggcmlnaHQgcGFyZW4KKwogVEVTVChVc2VyQWdlbnRTdHJpbmdGYWN0b3J5VGVzdCwgV2l0aFlvdVR1YmVUVkluZm8pIHsKICAgc3RkOjpzdHJpbmcgdXNlcl9hZ2VudF9zdHJpbmcgPQogICAgICAgVXNlckFnZW50U3RyaW5nRmFjdG9yeVdpdGhZb3VUdWJlVFZJbmZvKCkuQ3JlYXRlVXNlckFnZW50U3RyaW5nKCk7Ci0gIEVYUEVDVF9ORShzdGQ6OnN0cmluZzo6bnBvcywKLSAgICAgICAgICAgIHVzZXJfYWdlbnRfc3RyaW5nLmZpbmQoIkFwZXJ0dXJlTGFib3JhdG9yaWVzX09UVF9XaGVhdGxleS8wLjAxICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihBcGVydHVyZSBTY2llbmNlLCBHTGFET1MsICkiKSk7CisgIGNvbnN0IGNoYXIqIHR2X2luZm9fc3RyID0KKyAgICAgICJBcGVydHVyZSIgVU5ERVIgIlNjaWVuY2UiIFVOREVSICJJbm5vdmF0b3JzIgorICAgICAgIl9PVFRfIgorICAgICAgIlAtYm9keSIgU0xBU0ggIk9yYW5nZSIgVU5ERVIgIkF0bGFzIiBTTEFTSCAiQmx1ZSIKKyAgICAgICIvMCIgQ09NTUEgIjAxIChBcGVydHVyZSBTY2llbmNlICIgTFBBUkVOICJMYWJzIiBSUEFSRU4gIiwgR0xhRE9TLCApIjsKKyAgRVhQRUNUX05FKHN0ZDo6c3RyaW5nOjpucG9zLCB1c2VyX2FnZW50X3N0cmluZy5maW5kKHR2X2luZm9fc3RyKSk7CiB9CiAKIGNsYXNzIFVzZXJBZ2VudFN0cmluZ0ZhY3RvcnlXaXRoV2lyZWRDb25uZWN0aW9uCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL21vY2tfcmVzb3VyY2VfcHJvdmlkZXIuaCBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvbW9ja19yZXNvdXJjZV9wcm92aWRlci5oCmluZGV4IDFkMTNiNmMuLmQzMGI5ZmMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvbW9ja19yZXNvdXJjZV9wcm92aWRlci5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvbW9ja19yZXNvdXJjZV9wcm92aWRlci5oCkBAIC05NCwyMyArOTQsMTcgQEAKIAogI2lmIFNCX0hBUyhHUkFQSElDUykKIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDMKICAgc2NvcGVkX3JlZnB0cjxJbWFnZT4gQ3JlYXRlSW1hZ2VGcm9tU2JEZWNvZGVUYXJnZXQoU2JEZWNvZGVUYXJnZXQgdGFyZ2V0KSB7CiAgICAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUih0YXJnZXQpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKICAgYm9vbCBTdXBwb3J0c1NiRGVjb2RlVGFyZ2V0KCkgeyByZXR1cm4gZmFsc2U7IH0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gMwogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICBTYkRlY29kZVRhcmdldEdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKgogICBHZXRTYkRlY29kZVRhcmdldEdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKCkgewogICAgIHJldHVybiBOVUxMOwogICB9Ci0jZWxpZiBTQl9BUElfVkVSU0lPTiA+PSAzCi0gIFNiRGVjb2RlVGFyZ2V0UHJvdmlkZXIqIEdldFNiRGVjb2RlVGFyZ2V0UHJvdmlkZXIoKSB7IHJldHVybiBOVUxMOyB9Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKIAogI2VuZGlmICAvLyBTQl9IQVMoR1JBUEhJQ1MpCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcmVzb3VyY2VfcHJvdmlkZXIuaCBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcmVzb3VyY2VfcHJvdmlkZXIuaAppbmRleCA0YTY0OGQxLi5hY2JiYjIxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL3Jlc291cmNlX3Byb3ZpZGVyLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9yZXNvdXJjZV9wcm92aWRlci5oCkBAIC0yNyw5ICsyNyw3IEBACiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcl90cmVlL21lc2guaCIKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyX3RyZWUvbm9kZS5oIgogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJfdHJlZS90eXBlZmFjZS5oIgotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQogI2luY2x1ZGUgInN0YXJib2FyZC9kZWNvZGVfdGFyZ2V0LmgiCi0jZW5kaWYgIC8vIGRlZmluZWQoU1RBUkJPQVJEKQogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSByZW5kZXJfdHJlZSB7CkBAIC03Niw3ICs3NCw2IEBACiAgICAgICBzY29wZWRfcHRyPEltYWdlRGF0YT4gcGl4ZWxfZGF0YSkgPSAwOwogCiAjaWYgU0JfSEFTKEdSQVBISUNTKQotI2lmIFNCX0FQSV9WRVJTSU9OID49IDMKICAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGNvbnN1bWUgYW4gU2JEZWNvZGVUYXJnZXQgb2JqZWN0IHByb2R1Y2VkIGJ5CiAgIC8vIFNiRGVjb2RlVGFyZ2V0Q3JlYXRlKCksIHdyYXAgaXQgaW4gYSByZW5kZXJfdHJlZTo6SW1hZ2UgdGhhdCBjYW4gYmUgdXNlZAogICAvLyBpbiBhIHJlbmRlciB0cmVlLCBhbmQgcmV0dXJuIGl0IHRvIHRoZSBjYWxsZXIuCkBAIC04NSwxOSArODIsMTIgQEAKIAogICAvLyBXaGV0aGVyIFNiRGVjb2RlVGFyZ2V0SXNTdXBwb3J0ZWQgb3Igbm90LgogICB2aXJ0dWFsIGJvb2wgU3VwcG9ydHNTYkRlY29kZVRhcmdldCgpID0gMDsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gMwogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICAvLyBSZXR1cm4gdGhlIFNiRGVjb2RlVGFyZ2V0R3JhcGhpY3NDb250ZXh0UHJvdmlkZXIgYXNzb2NpYXRlZCB3aXRoIHRoZQogICAvLyBSZXNvdXJjZVByb3ZpZGVyLCBpZiBpdCBleGlzdHMuICBSZXR1cm5zIE5VTEwgaWYgU2JEZWNvZGVUYXJnZXQgaXMgbm90CiAgIC8vIHN1cHBvcnRlZC4KICAgdmlydHVhbCBTYkRlY29kZVRhcmdldEdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKgogICBHZXRTYkRlY29kZVRhcmdldEdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKCkgPSAwOwotI2VsaWYgU0JfQVBJX1ZFUlNJT04gPj0gMwotICAvLyBSZXR1cm4gdGhlIGFzc29jaWF0ZWQgU2JEZWNvZGVUYXJnZXRQcm92aWRlciB3aXRoIHRoZSBSZXNvdXJjZVByb3ZpZGVyLAotICAvLyBpZiBpdCBleGlzdHMuICBSZXR1cm5zIE5VTEwgaWYgU2JEZWNvZGVUYXJnZXQgaXMgbm90IHN1cHBvcnRlZC4KLSAgdmlydHVhbCBTYkRlY29kZVRhcmdldFByb3ZpZGVyKiBHZXRTYkRlY29kZVRhcmdldFByb3ZpZGVyKCkgPSAwOwotI2VuZGlmICAvLyBTQl9fQVBJX1ZFUlNJT04gPj0gNAogI2VuZGlmICAvLyBTQl9IQVMoR1JBUEhJQ1MpCiAKICAgLy8gUmV0dXJucyBhIHJhdyBjaHVuayBvZiBtZW1vcnkgdGhhdCBjYW4gbGF0ZXIgYmUgcGFzc2VkIGludG8gYSBmdW5jdGlvbiBsaWtlCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL3Jlc291cmNlX3Byb3ZpZGVyX3N0dWIuaCBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcmVzb3VyY2VfcHJvdmlkZXJfc3R1Yi5oCmluZGV4IGFlZTNmNjkuLjM5N2Q4Y2IgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcmVzb3VyY2VfcHJvdmlkZXJfc3R1Yi5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcmVzb3VyY2VfcHJvdmlkZXJfc3R1Yi5oCkBAIC0yNDcsMzAgKzI0NywyMiBAQAogICAgIHJldHVybiBtYWtlX3Njb3BlZF9yZWZwdHIobmV3IEltYWdlU3R1Yihza2lhX3NvdXJjZV9kYXRhLlBhc3MoKSkpOwogICB9CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSAzICYmIFNCX0hBUyhHUkFQSElDUykKKyNpZiBTQl9IQVMoR1JBUEhJQ1MpCiAgIHNjb3BlZF9yZWZwdHI8SW1hZ2U+IENyZWF0ZUltYWdlRnJvbVNiRGVjb2RlVGFyZ2V0KAogICAgICAgU2JEZWNvZGVUYXJnZXQgZGVjb2RlX3RhcmdldCkgT1ZFUlJJREUgewogICAgIE5PVFJFQUNIRUQoKTsKLSNpZiBTQl9BUElfVkVSU0lPTiA8IDQKLSAgICBTYkRlY29kZVRhcmdldERlc3Ryb3koZGVjb2RlX3RhcmdldCk7Ci0jZWxzZSAgIC8vIDQKICAgICBTYkRlY29kZVRhcmdldFJlbGVhc2UoZGVjb2RlX3RhcmdldCk7Ci0jZW5kaWYgIC8vIDQKICAgICByZXR1cm4gTlVMTDsKICAgfQogCiAgIGJvb2wgU3VwcG9ydHNTYkRlY29kZVRhcmdldCgpIE9WRVJSSURFIHsgcmV0dXJuIGZhbHNlOyB9Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDMgJiYgU0JfSEFTKEdSQVBISUNTKQorI2VuZGlmICAvLyBTQl9IQVMoR1JBUEhJQ1MpCiAKICNpZiBTQl9IQVMoR1JBUEhJQ1MpCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICBTYkRlY29kZVRhcmdldEdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKgogICBHZXRTYkRlY29kZVRhcmdldEdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKCkgT1ZFUlJJREUgewogICAgIHJldHVybiBOVUxMOwogICB9Ci0jZWxpZiBTQl9BUElfVkVSU0lPTiA+PSAzCi0gIFNiRGVjb2RlVGFyZ2V0UHJvdmlkZXIqIEdldFNiRGVjb2RlVGFyZ2V0UHJvdmlkZXIoKSBPVkVSUklERSB7IHJldHVybiBOVUxMOyB9Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKICNlbmRpZiAgLy8gU0JfSEFTKEdSQVBISUNTKQogCiAgIHNjb3BlZF9wdHI8UmF3SW1hZ2VNZW1vcnk+IEFsbG9jYXRlUmF3SW1hZ2VNZW1vcnkoc2l6ZV90IHNpemVfaW5fYnl0ZXMsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL3JvdW5kZWRfY29ybmVycy5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcm91bmRlZF9jb3JuZXJzLmNjCmluZGV4IGIwYTMzMzEuLjdlYWNiMTkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcm91bmRlZF9jb3JuZXJzLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcm91bmRlZF9jb3JuZXJzLmNjCkBAIC0xNyw2ICsxNywxNyBAQAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2UgcmVuZGVyX3RyZWUgewogCitSb3VuZGVkQ29ybmVycyBSb3VuZGVkQ29ybmVyczo6U2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5KSBjb25zdCB7CisgIHJldHVybiBSb3VuZGVkQ29ybmVycyhSb3VuZGVkQ29ybmVyKHRvcF9sZWZ0Lmhvcml6b250YWwgKiBzeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wX2xlZnQudmVydGljYWwgKiBzeSksCisgICAgICAgICAgICAgICAgICAgICAgICBSb3VuZGVkQ29ybmVyKHRvcF9yaWdodC5ob3Jpem9udGFsICogc3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcF9yaWdodC52ZXJ0aWNhbCAqIHN5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJvdW5kZWRDb3JuZXIoYm90dG9tX3JpZ2h0Lmhvcml6b250YWwgKiBzeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tX3JpZ2h0LnZlcnRpY2FsICogc3kpLAorICAgICAgICAgICAgICAgICAgICAgICAgUm91bmRlZENvcm5lcihib3R0b21fbGVmdC5ob3Jpem9udGFsICogc3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbV9sZWZ0LnZlcnRpY2FsICogc3kpKTsKK30KKwogUm91bmRlZENvcm5lcnMgUm91bmRlZENvcm5lcnM6Ok5vcm1hbGl6ZShjb25zdCBtYXRoOjpSZWN0RiYgcmVjdCkgY29uc3QgewogICBmbG9hdCBzY2FsZSA9IDEuMGY7CiAgIGZsb2F0IHNpemU7CkBAIC00OCwxNCArNTksNyBAQAogICAgIHNjYWxlID0gc3RkOjptaW4ocmVjdC5oZWlnaHQoKSAvIHNpemUsIHNjYWxlKTsKICAgfQogCi0gIHJldHVybiBSb3VuZGVkQ29ybmVycyhSb3VuZGVkQ29ybmVyKHRvcF9sZWZ0Lmhvcml6b250YWwgKiBzY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wX2xlZnQudmVydGljYWwgKiBzY2FsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBSb3VuZGVkQ29ybmVyKHRvcF9yaWdodC5ob3Jpem9udGFsICogc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcF9yaWdodC52ZXJ0aWNhbCAqIHNjYWxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFJvdW5kZWRDb3JuZXIoYm90dG9tX3JpZ2h0Lmhvcml6b250YWwgKiBzY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tX3JpZ2h0LnZlcnRpY2FsICogc2NhbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgUm91bmRlZENvcm5lcihib3R0b21fbGVmdC5ob3Jpem9udGFsICogc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbV9sZWZ0LnZlcnRpY2FsICogc2NhbGUpKTsKKyAgcmV0dXJuIFNjYWxlKHNjYWxlLCBzY2FsZSk7CiB9CiAKIGJvb2wgUm91bmRlZENvcm5lcnM6OklzTm9ybWFsaXplZChjb25zdCBtYXRoOjpSZWN0RiYgcmVjdCkgY29uc3QgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9yb3VuZGVkX2Nvcm5lcnMuaCBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcm91bmRlZF9jb3JuZXJzLmgKaW5kZXggY2YxZDAzZS4uNzY0NmY2NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9yb3VuZGVkX2Nvcm5lcnMuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL3JvdW5kZWRfY29ybmVycy5oCkBAIC05MSw2ICs5MSw4IEBACiAgICAgcmV0dXJuIEluc2V0KGluc2V0cy5sZWZ0KCksIGluc2V0cy50b3AoKSwgaW5zZXRzLnJpZ2h0KCksIGluc2V0cy5ib3R0b20oKSk7CiAgIH0KIAorICBSb3VuZGVkQ29ybmVycyBTY2FsZShmbG9hdCBzeCwgZmxvYXQgc3kpIGNvbnN0OworCiAgIC8vIEVuc3VyZSB0aGUgcm91bmRlZCBjb3JuZXJzJyByYWRpaSBkbyBub3QgZXhjZWVkIHRoZSBsZW5ndGggb2YgdGhlCiAgIC8vIGNvcnJlc3BvbmRpbmcgZWRnZSBvZiB0aGUgZ2l2ZW4gcmVjdC4KICAgUm91bmRlZENvcm5lcnMgTm9ybWFsaXplKGNvbnN0IG1hdGg6OlJlY3RGJiByZWN0KSBjb25zdDsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvZ2xpbXBfc2hhZGVycy9nbHNsL2ZyYWdtZW50X3NraWFfdGV4dHVyZV9tYXNrZWRfdGV4dHVyZV9kb21haW4uZ2xzbCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvZ2xpbXBfc2hhZGVycy9nbHNsL2ZyYWdtZW50X3NraWFfdGV4dHVyZV9tYXNrZWRfdGV4dHVyZV9kb21haW4uZ2xzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjhkZjI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9nbGltcF9zaGFkZXJzL2dsc2wvZnJhZ21lbnRfc2tpYV90ZXh0dXJlX21hc2tlZF90ZXh0dXJlX2RvbWFpbi5nbHNsCkBAIC0wLDAgKzEsMzMgQEAKKyN2ZXJzaW9uIDEwMA0KK3ByZWNpc2lvbiBtZWRpdW1wIGZsb2F0Ow0KK3VuaWZvcm0gc2FtcGxlcjJEIHVTYW1wbGVyMF9TdGFnZTA7DQordW5pZm9ybSBzYW1wbGVyMkQgdVNhbXBsZXIwX1N0YWdlMTsNCit1bmlmb3JtIHZlYzQgdVRleERvbV9TdGFnZTE7DQordmFyeWluZyB2ZWM0IHZDb2xvcjsNCit2YXJ5aW5nIHZlYzIgdk1hdHJpeENvb3JkX1N0YWdlMDsNCit2YXJ5aW5nIHZlYzIgdk1hdHJpeENvb3JkX1N0YWdlMTsNCisNCit2b2lkIG1haW4oKSANCit7DQorICB2ZWM0IG91dHB1dF9TdGFnZTA7DQorICB7DQorICAgIC8vIFN0YWdlIDA6IFRleHR1cmUNCisgICAgb3V0cHV0X1N0YWdlMCA9DQorICAgICAgICAodkNvbG9yICogdGV4dHVyZTJEKHVTYW1wbGVyMF9TdGFnZTAsIHZNYXRyaXhDb29yZF9TdGFnZTApLmFhYWEpOw0KKyAgfQ0KKyAgdmVjNCBvdXRwdXRfU3RhZ2UxOw0KKyAgew0KKyAgICAvLyBTdGFnZSAxOiBUZXh0dXJlRG9tYWluDQorICAgIHsNCisgICAgICBidmVjNCBvdXRzaWRlOw0KKyAgICAgIG91dHNpZGUueHkgPSBsZXNzVGhhbih2TWF0cml4Q29vcmRfU3RhZ2UxLCB1VGV4RG9tX1N0YWdlMS54eSk7DQorICAgICAgb3V0c2lkZS56dyA9IGdyZWF0ZXJUaGFuKHZNYXRyaXhDb29yZF9TdGFnZTEsIHVUZXhEb21fU3RhZ2UxLnp3KTsNCisgICAgICBvdXRwdXRfU3RhZ2UxID0NCisgICAgICAgICAgYW55KG91dHNpZGUpID8NCisgICAgICAgICAgICAgIHZlYzQoMC4wLCAwLjAsIDAuMCwgMC4wKSA6DQorICAgICAgICAgICAgICAob3V0cHV0X1N0YWdlMCAqIHRleHR1cmUyRCh1U2FtcGxlcjBfU3RhZ2UxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdk1hdHJpeENvb3JkX1N0YWdlMSkpOw0KKyAgICB9DQorICB9DQorICBnbF9GcmFnQ29sb3IgPSBvdXRwdXRfU3RhZ2UxOw0KK30NCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL2dsaW1wX3NoYWRlcnMvZ2xzbC9zaGFkZXJzLmd5cGkgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2dsaW1wX3NoYWRlcnMvZ2xzbC9zaGFkZXJzLmd5cGkKaW5kZXggMTk5N2QwNi4uZDM4NTg4YyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9nbGltcF9zaGFkZXJzL2dsc2wvc2hhZGVycy5neXBpCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvZ2xpbXBfc2hhZGVycy9nbHNsL3NoYWRlcnMuZ3lwaQpAQCAtNzgsNiArNzgsNyBAQAogICAgICAgJ2ZyYWdtZW50X3NraWFfdGV4dHVyZV9kb21haW4uZ2xzbCcsCiAgICAgICAnZnJhZ21lbnRfc2tpYV90ZXh0dXJlX2RvbWFpbl9tYXNrZWRfdGV4dHVyZV9kb21haW4uZ2xzbCcsCiAgICAgICAnZnJhZ21lbnRfc2tpYV90ZXh0dXJlX21hc2tlZF90ZXh0dXJlLmdsc2wnLAorICAgICAgJ2ZyYWdtZW50X3NraWFfdGV4dHVyZV9tYXNrZWRfdGV4dHVyZV9kb21haW4uZ2xzbCcsCiAgICAgICAnZnJhZ21lbnRfc2tpYV95dXYuZ2xzbCcsCiAgICAgICAnZnJhZ21lbnRfdGV4dHVyZWRfdmJvX3JnYmEuZ2xzbCcsCiAgICAgICAnZnJhZ21lbnRfdGV4dHVyZWRfdmJvX3V5dnlfMXBsYW5lLmdsc2wnLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvcmVzb3VyY2VfcHJvdmlkZXIuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9yZXNvdXJjZV9wcm92aWRlci5jYwppbmRleCAxZGEzYzllLi5lNjZmNmU1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9yZXNvdXJjZV9wcm92aWRlci5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9yZXNvdXJjZV9wcm92aWRlci5jYwpAQCAtNDEsOSArNDEsNyBAQAogICAgIDogZGV2aWNlXyhkZXZpY2UpLAogICAgICAgc2tpYV9yZXNvdXJjZV9wcm92aWRlcl8oc2tpYV9yZXNvdXJjZV9wcm92aWRlciksCiAgICAgICBzdWJtaXRfb2Zmc2NyZWVuX2NhbGxiYWNrXyhzdWJtaXRfb2Zmc2NyZWVuX2NhbGxiYWNrKSB7Ci0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICBkZWNvZGVfdGFyZ2V0X2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLmRldmljZSA9IGRldmljZTsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogfQogCiBib29sIFJlc291cmNlUHJvdmlkZXI6OlBpeGVsRm9ybWF0U3VwcG9ydGVkKFBpeGVsRm9ybWF0IHBpeGVsX2Zvcm1hdCkgewpAQCAtODMsMjUgKzgxLDEwIEBACiAgIHJldHVybiBtYWtlX3Njb3BlZF9yZWZwdHIobmV3IFNpbmdsZVBsYW5lSW1hZ2UoYmxpdHRlcl9zb3VyY2VfZGF0YS5QYXNzKCkpKTsKIH0KIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDMgJiYgU0JfSEFTKEdSQVBISUNTKQorI2lmIFNCX0hBUyhHUkFQSElDUykKIAogc2NvcGVkX3JlZnB0cjxyZW5kZXJfdHJlZTo6SW1hZ2U+CiBSZXNvdXJjZVByb3ZpZGVyOjpDcmVhdGVJbWFnZUZyb21TYkRlY29kZVRhcmdldChTYkRlY29kZVRhcmdldCBkZWNvZGVfdGFyZ2V0KSB7Ci0jaWYgU0JfQVBJX1ZFUlNJT04gPCA0Ci0gIFNiRGVjb2RlVGFyZ2V0Rm9ybWF0IGZvcm1hdCA9IFNiRGVjb2RlVGFyZ2V0R2V0Rm9ybWF0KGRlY29kZV90YXJnZXQpOwotICBpZiAoZm9ybWF0ID09IGtTYkRlY29kZVRhcmdldEZvcm1hdDFQbGFuZVJHQkEpIHsKLSAgICBTYkJsaXR0ZXJTdXJmYWNlIHN1cmZhY2UgPQotICAgICAgICBTYkRlY29kZVRhcmdldEdldFBsYW5lKGRlY29kZV90YXJnZXQsIGtTYkRlY29kZVRhcmdldFBsYW5lUkdCQSk7Ci0gICAgRENIRUNLKFNiQmxpdHRlcklzU3VyZmFjZVZhbGlkKHN1cmZhY2UpKTsKLSAgICBib29sIGlzX29wYXF1ZSA9IFNiRGVjb2RlVGFyZ2V0SXNPcGFxdWUoZGVjb2RlX3RhcmdldCk7Ci0KLSAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIHRoZSBzdXJmYWNlIGl0IGNvbnRhaW5lZCwgd2UgYXJlIGZyZWUgdG8gZGVsZXRlCi0gICAgLy8gfGRlY29kZV90YXJnZXR8LgotICAgIFNiRGVjb2RlVGFyZ2V0RGVzdHJveShkZWNvZGVfdGFyZ2V0KTsKLSAgICByZXR1cm4gbWFrZV9zY29wZWRfcmVmcHRyKAotICAgICAgICBuZXcgU2luZ2xlUGxhbmVJbWFnZShzdXJmYWNlLCBpc19vcGFxdWUsIGJhc2U6OkNsb3N1cmUoKSkpOwotICB9Ci0jZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OIDwgNAogICBTYkRlY29kZVRhcmdldEluZm8gaW5mbzsKICAgU2JNZW1vcnlTZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CiAgIENIRUNLKFNiRGVjb2RlVGFyZ2V0R2V0SW5mbyhkZWNvZGVfdGFyZ2V0LCAmaW5mbykpOwpAQCAtMTIxLDE5ICsxMDQsMTQgQEAKICAgICAgICAgcGxhbmUuc3VyZmFjZSwgaW5mby5pc19vcGFxdWUsCiAgICAgICAgIGJhc2U6OkJpbmQoJlNiRGVjb2RlVGFyZ2V0UmVsZWFzZSwgZGVjb2RlX3RhcmdldCkpKTsKICAgfQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IDQKIAogICBOT1RSRUFDSEVEKCkKICAgICAgIDw8ICJPbmx5IGZvcm1hdCBrU2JEZWNvZGVUYXJnZXRGb3JtYXQxUGxhbmVSR0JBIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuIjsKLSNpZiBTQl9BUElfVkVSU0lPTiA8IDQKLSAgU2JEZWNvZGVUYXJnZXREZXN0cm95KGRlY29kZV90YXJnZXQpOwotI2Vsc2UgICAvLyBTQl9BUElfVkVSU0lPTiA8IDQKICAgU2JEZWNvZGVUYXJnZXRSZWxlYXNlKGRlY29kZV90YXJnZXQpOwotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IDQKICAgcmV0dXJuIE5VTEw7CiB9CiAKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gMyAmJiBTQl9IQVMoR1JBUEhJQ1MpCisjZW5kaWYgIC8vIFNCX0hBUyhHUkFQSElDUykKIAogc2NvcGVkX3B0cjxyZW5kZXJfdHJlZTo6UmF3SW1hZ2VNZW1vcnk+CiBSZXNvdXJjZVByb3ZpZGVyOjpBbGxvY2F0ZVJhd0ltYWdlTWVtb3J5KHNpemVfdCBzaXplX2luX2J5dGVzLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvcmVzb3VyY2VfcHJvdmlkZXIuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3Jlc291cmNlX3Byb3ZpZGVyLmgKaW5kZXggM2YwMWM2NC4uOTIzMTVmZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvcmVzb3VyY2VfcHJvdmlkZXIuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9yZXNvdXJjZV9wcm92aWRlci5oCkBAIC00MywyMSArNDMsMTUgQEAKIAogICB2b2lkIEZpbmlzaCgpIE9WRVJSSURFIHt9CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSAzCiAgIHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6OkltYWdlPiBDcmVhdGVJbWFnZUZyb21TYkRlY29kZVRhcmdldCgKICAgICAgIFNiRGVjb2RlVGFyZ2V0IGRlY29kZV90YXJnZXQpIE9WRVJSSURFOwogCiAgIGJvb2wgU3VwcG9ydHNTYkRlY29kZVRhcmdldCgpIE9WRVJSSURFIHsgcmV0dXJuIHRydWU7IH0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gMwogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICBTYkRlY29kZVRhcmdldEdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKgogICBHZXRTYkRlY29kZVRhcmdldEdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKCkgT1ZFUlJJREUgewogICAgIHJldHVybiAmZGVjb2RlX3RhcmdldF9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXzsKICAgfQotI2VsaWYgU0JfQVBJX1ZFUlNJT04gPj0gMwotICBTYkRlY29kZVRhcmdldFByb3ZpZGVyKiBHZXRTYkRlY29kZVRhcmdldFByb3ZpZGVyKCkgT1ZFUlJJREUgeyByZXR1cm4gTlVMTDsgfQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiAKICAgYm9vbCBQaXhlbEZvcm1hdFN1cHBvcnRlZChyZW5kZXJfdHJlZTo6UGl4ZWxGb3JtYXQgcGl4ZWxfZm9ybWF0KSBPVkVSUklERTsKICAgYm9vbCBBbHBoYUZvcm1hdFN1cHBvcnRlZChyZW5kZXJfdHJlZTo6QWxwaGFGb3JtYXQgYWxwaGFfZm9ybWF0KSBPVkVSUklERTsKQEAgLTEyMywxMCArMTE3LDggQEAKIAogICBTdWJtaXRPZmZzY3JlZW5DYWxsYmFjayBzdWJtaXRfb2Zmc2NyZWVuX2NhbGxiYWNrXzsKIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgU2JEZWNvZGVUYXJnZXRHcmFwaGljc0NvbnRleHRQcm92aWRlcgogICAgICAgZGVjb2RlX3RhcmdldF9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXzsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGJsaXR0ZXIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19vYmplY3QuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2RyYXdfb2JqZWN0LmNjCmluZGV4IGMyMDg0Y2YuLjI0ZWM1ZDAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19vYmplY3QuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9kcmF3X29iamVjdC5jYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxsaW1pdHM+CiAKKyNpbmNsdWRlICJjb2JhbHQvbWF0aC90cmFuc2Zvcm1fMmQuaCIKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdXRpbHMuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CkBAIC0yNCw2ICsyNSwzNCBAQAogbmFtZXNwYWNlIHJhc3Rlcml6ZXIgewogbmFtZXNwYWNlIGVnbCB7CiAKK25hbWVzcGFjZSB7CisvLyBUbyBhY2NvbW1vZGF0ZSBsYXJnZSByYWRpdXMgdmFsdWVzIGZvciByb3VuZGVkIGNvcm5lcnMgd2hpbGUgdXNpbmcgbWVkaXVtcAorLy8gZmxvYXRzIGluIHRoZSBmcmFnbWVudCBzaGFkZXIsIHNjYWxlIDEgLyByYWRpdXMueHkgYnkga1JDb3JuZXJHcmFkaWVudFNjYWxlLgorLy8gVGhlIGZyYWdtZW50IHNoYWRlciB3aWxsIHRha2UgdGhpcyBpbnRvIGFjY291bnQuCitjb25zdCBmbG9hdCBrUkNvcm5lckdyYWRpZW50U2NhbGUgPSAxNi4wZjsKKworLy8gR2V0IHRoZSBtaWRwb2ludCBvZiB0aGUgZ2l2ZW4gcm91bmRlZCByZWN0LiBBIG5vcm1hbGl6ZWQgcm91bmRlZCByZWN0CisvLyBzaG91bGQgaGF2ZSBhdCBsZWFzdCBvbmUgcG9pbnQgd2hpY2ggdGhlIGNvcm5lcnMgZG8gbm90IGNyb3NzLgorbWF0aDo6UG9pbnRGIEdldFJSZWN0Q2VudGVyKGNvbnN0IG1hdGg6OlJlY3RGJiByZWN0LAorICAgIGNvbnN0IHJlbmRlcl90cmVlOjpSb3VuZGVkQ29ybmVycyYgY29ybmVycykgeworICByZXR1cm4gbWF0aDo6UG9pbnRGKAorICAgICAgMC41ZiAqIChyZWN0LngoKSArIHN0ZDo6bWF4KGNvcm5lcnMudG9wX2xlZnQuaG9yaXpvbnRhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JuZXJzLmJvdHRvbV9sZWZ0Lmhvcml6b250YWwpICsKKyAgICAgICAgICAgICAgcmVjdC5yaWdodCgpIC0gc3RkOjptYXgoY29ybmVycy50b3BfcmlnaHQuaG9yaXpvbnRhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ybmVycy5ib3R0b21fcmlnaHQuaG9yaXpvbnRhbCkpLAorICAgICAgMC41ZiAqIChyZWN0LnkoKSArIHN0ZDo6bWF4KGNvcm5lcnMudG9wX2xlZnQudmVydGljYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ybmVycy50b3BfcmlnaHQudmVydGljYWwpICsKKyAgICAgICAgICAgICAgcmVjdC5ib3R0b20oKSAtIHN0ZDo6bWF4KGNvcm5lcnMuYm90dG9tX2xlZnQudmVydGljYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JuZXJzLmJvdHRvbV9yaWdodC52ZXJ0aWNhbCkpKTsKK30KKworbWF0aDo6UG9pbnRGIENsYW1wVG9Cb3VuZHMoY29uc3QgbWF0aDo6UmVjdEYmIGJvdW5kcywgZmxvYXQgeCwgZmxvYXQgeSkgeworICByZXR1cm4gbWF0aDo6UG9pbnRGKAorICAgICAgc3RkOjptaW4oc3RkOjptYXgoYm91bmRzLngoKSwgeCksIGJvdW5kcy5yaWdodCgpKSwKKyAgICAgIHN0ZDo6bWluKHN0ZDo6bWF4KGJvdW5kcy55KCksIHkpLCBib3VuZHMuYm90dG9tKCkpKTsKK30KK30gIC8vIG5hbWVzcGFjZQorCiBEcmF3T2JqZWN0OjpCYXNlU3RhdGU6OkJhc2VTdGF0ZSgpCiAgICAgOiB0cmFuc2Zvcm0obWF0aDo6TWF0cml4M0Y6OklkZW50aXR5KCkpLAogICAgICAgc2Npc3NvcigwLCAwLApAQCAtMzgsOSArNjcsMzUgQEAKICAgICAgIHJvdW5kZWRfc2Npc3Nvcl9jb3JuZXJzKG90aGVyLnJvdW5kZWRfc2Npc3Nvcl9jb3JuZXJzKSwKICAgICAgIG9wYWNpdHkob3RoZXIub3BhY2l0eSkge30KIAorRHJhd09iamVjdDo6UkNvcm5lcjo6UkNvcm5lcihjb25zdCBmbG9hdCAoJnBvc2l0aW9uKVsyXSwgY29uc3QgUkNvcm5lciYgaW5pdCkKKyAgICA6IHgoKHBvc2l0aW9uWzBdIC0gaW5pdC54KSAqIGluaXQucngpLAorICAgICAgeSgocG9zaXRpb25bMV0gLSBpbml0LnkpICogaW5pdC5yeSksCisgICAgICByeChpbml0LnJ4ICoga1JDb3JuZXJHcmFkaWVudFNjYWxlKSwKKyAgICAgIHJ5KGluaXQucnkgKiBrUkNvcm5lckdyYWRpZW50U2NhbGUpIHt9CisKIERyYXdPYmplY3Q6OkRyYXdPYmplY3QoY29uc3QgQmFzZVN0YXRlJiBiYXNlX3N0YXRlKQogICAgIDogYmFzZV9zdGF0ZV8oYmFzZV9zdGF0ZSkge30KIAorbWF0aDo6VmVjdG9yMmRGIERyYXdPYmplY3Q6OkdldFNjYWxlKCkgY29uc3QgeworICBmbG9hdCBtMDAgPSBiYXNlX3N0YXRlXy50cmFuc2Zvcm0oMCwgMCk7CisgIGZsb2F0IG0wMSA9IGJhc2Vfc3RhdGVfLnRyYW5zZm9ybSgwLCAxKTsKKyAgZmxvYXQgbTEwID0gYmFzZV9zdGF0ZV8udHJhbnNmb3JtKDEsIDApOworICBmbG9hdCBtMTEgPSBiYXNlX3N0YXRlXy50cmFuc2Zvcm0oMSwgMSk7CisgIHJldHVybiBtYXRoOjpWZWN0b3IyZEYoc3RkOjpzcXJ0KG0wMCAqIG0wMCArIG0xMCAqIG0xMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzcXJ0KG0wMSAqIG0wMSArIG0xMSAqIG0xMSkpOworfQorCittYXRoOjpWZWN0b3IyZEYgRHJhd09iamVjdDo6UmVtb3ZlU2NhbGVGcm9tVHJhbnNmb3JtKCkgeworICAvLyBBdm9pZCBkaXZpc2lvbiBieSB6ZXJvLgorICBjb25zdCBmbG9hdCBrRXBzaWxvbiA9IDAuMDAwMDFmOworCisgIG1hdGg6OlZlY3RvcjJkRiBzY2FsZSA9IEdldFNjYWxlKCk7CisgIGJhc2Vfc3RhdGVfLnRyYW5zZm9ybSA9IGJhc2Vfc3RhdGVfLnRyYW5zZm9ybSAqCisgICAgICBtYXRoOjpTY2FsZU1hdHJpeCgxLjBmIC8gc3RkOjptYXgoc2NhbGUueCgpLCBrRXBzaWxvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAxLjBmIC8gc3RkOjptYXgoc2NhbGUueSgpLCBrRXBzaWxvbikpOworICByZXR1cm4gc2NhbGU7Cit9CisKIC8vIHN0YXRpYwogdWludDMyX3QgRHJhd09iamVjdDo6R2V0R0xSR0JBKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpIHsKICAgLy8gRW5zdXJlIGNvbG9yIGJ5dGVzIHJlcHJlc2VudCBSR0JBLCByZWdhcmRsZXNzIG9mIGVuZGlhbm5lc3MuCkBAIC01Niw3NCArMTExLDEzMCBAQAogfQogCiAvLyBzdGF0aWMKLXZvaWQgRHJhd09iamVjdDo6U2V0UlJlY3RVbmlmb3JtcyhHTGludCByZWN0X3VuaWZvcm0sIEdMaW50IGNvcm5lcnNfdW5pZm9ybSwKLSAgICBjb25zdCBtYXRoOjpSZWN0RiYgcmVjdCwgY29uc3QgcmVuZGVyX3RyZWU6OlJvdW5kZWRDb3JuZXJzJiBjb3JuZXJzLAotICAgIGZsb2F0IGluc2V0KSB7Ci0gIG1hdGg6OlJlY3RGIGluc2V0X3JlY3QocmVjdCk7Ci0gIGluc2V0X3JlY3QuSW5zZXQoaW5zZXQsIGluc2V0KTsKLSAgcmVuZGVyX3RyZWU6OlJvdW5kZWRDb3JuZXJzIGluc2V0X2Nvcm5lcnMgPQotICAgICAgY29ybmVycy5JbnNldChpbnNldCwgaW5zZXQsIGluc2V0LCBpbnNldCk7Cit2b2lkIERyYXdPYmplY3Q6OkdldFJSZWN0QXR0cmlidXRlcyhjb25zdCBtYXRoOjpSZWN0RiYgYm91bmRzLAorICAgIG1hdGg6OlJlY3RGIHJlY3QsIHJlbmRlcl90cmVlOjpSb3VuZGVkQ29ybmVycyBjb3JuZXJzLAorICAgIFJSZWN0QXR0cmlidXRlcyAoJm91dF9hdHRyaWJ1dGVzKVs0XSkgeworICBHZXRSQ29ybmVyVmFsdWVzKCZyZWN0LCAmY29ybmVycywgb3V0X2F0dHJpYnV0ZXMpOwogCi0gIC8vIFR3ZWFrIGNvcm5lcnMgdGhhdCBhcmUgc3F1YXJlLWlzaCBzbyB0aGV5IGhhdmUgdmFsdWVzIHRoYXQgcGxheQotICAvLyBuaWNlbHkgd2l0aCB0aGUgc2hhZGVyLiBJbnRlcnBvbGF0aW5nIHheMiAvIGFeMiArIHleMiAvIGJeMiBkb2VzIG5vdAotICAvLyB3b3JrIHdlbGwgd2hlbiB8YXwgb3IgfGJ8IGFyZSB2ZXJ5IHNtYWxsLgotICBpZiAoaW5zZXRfY29ybmVycy50b3BfbGVmdC5ob3Jpem9udGFsIDw9IDAuNWYgfHwKLSAgICAgIGluc2V0X2Nvcm5lcnMudG9wX2xlZnQudmVydGljYWwgPD0gMC41ZikgewotICAgIGluc2V0X2Nvcm5lcnMudG9wX2xlZnQuaG9yaXpvbnRhbCA9IDAuMGY7Ci0gICAgaW5zZXRfY29ybmVycy50b3BfbGVmdC52ZXJ0aWNhbCA9IDAuMGY7Ci0gIH0KLSAgaWYgKGluc2V0X2Nvcm5lcnMudG9wX3JpZ2h0Lmhvcml6b250YWwgPD0gMC41ZiB8fAotICAgICAgaW5zZXRfY29ybmVycy50b3BfcmlnaHQudmVydGljYWwgPD0gMC41ZikgewotICAgIGluc2V0X2Nvcm5lcnMudG9wX3JpZ2h0Lmhvcml6b250YWwgPSAwLjBmOwotICAgIGluc2V0X2Nvcm5lcnMudG9wX3JpZ2h0LnZlcnRpY2FsID0gMC4wZjsKLSAgfQotICBpZiAoaW5zZXRfY29ybmVycy5ib3R0b21fbGVmdC5ob3Jpem9udGFsIDw9IDAuNWYgfHwKLSAgICAgIGluc2V0X2Nvcm5lcnMuYm90dG9tX2xlZnQudmVydGljYWwgPD0gMC41ZikgewotICAgIGluc2V0X2Nvcm5lcnMuYm90dG9tX2xlZnQuaG9yaXpvbnRhbCA9IDAuMGY7Ci0gICAgaW5zZXRfY29ybmVycy5ib3R0b21fbGVmdC52ZXJ0aWNhbCA9IDAuMGY7Ci0gIH0KLSAgaWYgKGluc2V0X2Nvcm5lcnMuYm90dG9tX3JpZ2h0Lmhvcml6b250YWwgPD0gMC41ZiB8fAotICAgICAgaW5zZXRfY29ybmVycy5ib3R0b21fcmlnaHQudmVydGljYWwgPD0gMC41ZikgewotICAgIGluc2V0X2Nvcm5lcnMuYm90dG9tX3JpZ2h0Lmhvcml6b250YWwgPSAwLjBmOwotICAgIGluc2V0X2Nvcm5lcnMuYm90dG9tX3JpZ2h0LnZlcnRpY2FsID0gMC4wZjsKLSAgfQorICAvLyBDYWxjdWxhdGUgdGhlIGJvdW5kcyBmb3IgZWFjaCBwYXRjaC4gRm91ciBwYXRjaGVzIHdpbGwgYmUgdXNlZCB0byBjb3ZlcgorICAvLyB0aGUgZW50aXJlIGJvdW5kZWQgYXJlYS4KKyAgbWF0aDo6UG9pbnRGIGNlbnRlciA9IEdldFJSZWN0Q2VudGVyKHJlY3QsIGNvcm5lcnMpOworICBjZW50ZXIgPSBDbGFtcFRvQm91bmRzKGJvdW5kcywgY2VudGVyLngoKSwgY2VudGVyLnkoKSk7CiAKKyAgb3V0X2F0dHJpYnV0ZXNbMF0uYm91bmRzLlNldFJlY3QoYm91bmRzLngoKSwgYm91bmRzLnkoKSwKKyAgICAgIGNlbnRlci54KCkgLSBib3VuZHMueCgpLCBjZW50ZXIueSgpIC0gYm91bmRzLnkoKSk7CisgIG91dF9hdHRyaWJ1dGVzWzFdLmJvdW5kcy5TZXRSZWN0KGNlbnRlci54KCksIGJvdW5kcy55KCksCisgICAgICBib3VuZHMucmlnaHQoKSAtIGNlbnRlci54KCksIGNlbnRlci55KCkgLSBib3VuZHMueSgpKTsKKyAgb3V0X2F0dHJpYnV0ZXNbMl0uYm91bmRzLlNldFJlY3QoYm91bmRzLngoKSwgY2VudGVyLnkoKSwKKyAgICAgIGNlbnRlci54KCkgLSBib3VuZHMueCgpLCBib3VuZHMuYm90dG9tKCkgLSBjZW50ZXIueSgpKTsKKyAgb3V0X2F0dHJpYnV0ZXNbM10uYm91bmRzLlNldFJlY3QoY2VudGVyLngoKSwgY2VudGVyLnkoKSwKKyAgICAgIGJvdW5kcy5yaWdodCgpIC0gY2VudGVyLngoKSwgYm91bmRzLmJvdHRvbSgpIC0gY2VudGVyLnkoKSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBEcmF3T2JqZWN0OjpHZXRSUmVjdEF0dHJpYnV0ZXMoY29uc3QgbWF0aDo6UmVjdEYmIGJvdW5kcywKKyAgICBtYXRoOjpSZWN0RiByZWN0LCByZW5kZXJfdHJlZTo6Um91bmRlZENvcm5lcnMgY29ybmVycywKKyAgICBSUmVjdEF0dHJpYnV0ZXMgKCZvdXRfYXR0cmlidXRlcylbOF0pIHsKKyAgR2V0UkNvcm5lclZhbHVlcygmcmVjdCwgJmNvcm5lcnMsIG91dF9hdHRyaWJ1dGVzKTsKKyAgb3V0X2F0dHJpYnV0ZXNbNF0ucmNvcm5lciA9IG91dF9hdHRyaWJ1dGVzWzBdLnJjb3JuZXI7CisgIG91dF9hdHRyaWJ1dGVzWzVdLnJjb3JuZXIgPSBvdXRfYXR0cmlidXRlc1sxXS5yY29ybmVyOworICBvdXRfYXR0cmlidXRlc1s2XS5yY29ybmVyID0gb3V0X2F0dHJpYnV0ZXNbMl0ucmNvcm5lcjsKKyAgb3V0X2F0dHJpYnV0ZXNbN10ucmNvcm5lciA9IG91dF9hdHRyaWJ1dGVzWzNdLnJjb3JuZXI7CisKKyAgLy8gR2l2ZW4gYW4gZWxsaXBzZSB3aXRoIHJhZGlpIEEgYW5kIEIsIHRoZSBsYXJnZXN0IGluc2NyaWJlZCByZWN0YW5nbGUgaGFzCisgIC8vIGRpbWVuc2lvbnMgc3FydCgyKSAqIEEgYW5kIHNxcnQoMikgKiBCLiBUbyBhY2NvbW1vZGF0ZSB0aGUgYW50aWFsaWFzZWQKKyAgLy8gZWRnZSwgaW5zZXQgdGhlIGluc2NyaWJlZCByZWN0IGJ5IGEgcGl4ZWwgb24gZWFjaCBzaWRlLgorICBjb25zdCBmbG9hdCBrSW5zZXRTY2FsZSA9IDAuMjkyOWY7ICAgIC8vIDEgLSBzcXJ0KDIpIC8gMgorCisgIC8vIENhbGN1bGF0ZSB0aGUgYm91bmRzIGZvciBlYWNoIHBhdGNoLiBFaWdodCBwYXRjaGVzIHdpbGwgYmUgdXNlZCB0byBleGNsdWRlCisgIC8vIHRoZSBpbnNjcmliZWQgcmVjdDoKKyAgLy8gICArLS0tKy0tLS0tKy0tLS0tKy0tLSsKKyAgLy8gICB8ICAgfCAgNCAgfCAgNSAgfCAgIHwKKyAgLy8gICB8IDAgKy0tLS0tKy0tLS0tKyAxIHwKKyAgLy8gICB8ICAgfCAgICAgICAgICAgfCAgIHwKKyAgLy8gICArLS0tKyAgICAgQyAgICAgKy0tLSsgICAgQyA9IGNlbnRlciBwb2ludAorICAvLyAgIHwgICB8ICAgICAgICAgICB8ICAgfAorICAvLyAgIHwgMiArLS0tLS0rLS0tLS0rIDMgfAorICAvLyAgIHwgICB8ICA2ICB8ICA3ICB8ICAgfAorICAvLyAgICstLS0rLS0tLS0rLS0tLS0rLS0tKworICBtYXRoOjpQb2ludEYgY2VudGVyID0gR2V0UlJlY3RDZW50ZXIocmVjdCwgY29ybmVycyk7CisgIGNlbnRlciA9IENsYW1wVG9Cb3VuZHMoYm91bmRzLCBjZW50ZXIueCgpLCBjZW50ZXIueSgpKTsKKyAgbWF0aDo6UG9pbnRGIGluc2V0MCA9IENsYW1wVG9Cb3VuZHMoYm91bmRzLAorICAgICAgcmVjdC54KCkgKyBrSW5zZXRTY2FsZSAqIGNvcm5lcnMudG9wX2xlZnQuaG9yaXpvbnRhbCArIDEuMGYsCisgICAgICByZWN0LnkoKSArIGtJbnNldFNjYWxlICogY29ybmVycy50b3BfbGVmdC52ZXJ0aWNhbCArIDEuMGYpOworICBtYXRoOjpQb2ludEYgaW5zZXQxID0gQ2xhbXBUb0JvdW5kcyhib3VuZHMsCisgICAgICByZWN0LnJpZ2h0KCkgLSBrSW5zZXRTY2FsZSAqIGNvcm5lcnMudG9wX3JpZ2h0Lmhvcml6b250YWwgLSAxLjBmLAorICAgICAgcmVjdC55KCkgKyBrSW5zZXRTY2FsZSAqIGNvcm5lcnMudG9wX3JpZ2h0LnZlcnRpY2FsICsgMS4wZik7CisgIG1hdGg6OlBvaW50RiBpbnNldDIgPSBDbGFtcFRvQm91bmRzKGJvdW5kcywKKyAgICAgIHJlY3QueCgpICsga0luc2V0U2NhbGUgKiBjb3JuZXJzLmJvdHRvbV9sZWZ0Lmhvcml6b250YWwgKyAxLjBmLAorICAgICAgcmVjdC5ib3R0b20oKSAtIGtJbnNldFNjYWxlICogY29ybmVycy5ib3R0b21fbGVmdC52ZXJ0aWNhbCAtIDEuMGYpOworICBtYXRoOjpQb2ludEYgaW5zZXQzID0gQ2xhbXBUb0JvdW5kcyhib3VuZHMsCisgICAgICByZWN0LnJpZ2h0KCkgLSBrSW5zZXRTY2FsZSAqIGNvcm5lcnMuYm90dG9tX3JpZ2h0Lmhvcml6b250YWwgLSAxLjBmLAorICAgICAgcmVjdC5ib3R0b20oKSAtIGtJbnNldFNjYWxlICogY29ybmVycy5ib3R0b21fcmlnaHQudmVydGljYWwgLSAxLjBmKTsKKworICBvdXRfYXR0cmlidXRlc1swXS5ib3VuZHMuU2V0UmVjdChib3VuZHMueCgpLCBib3VuZHMueSgpLAorICAgICAgaW5zZXQwLngoKSAtIGJvdW5kcy54KCksIGNlbnRlci55KCkgLSBib3VuZHMueSgpKTsKKyAgb3V0X2F0dHJpYnV0ZXNbMV0uYm91bmRzLlNldFJlY3QoaW5zZXQxLngoKSwgYm91bmRzLnkoKSwKKyAgICAgIGJvdW5kcy5yaWdodCgpIC0gaW5zZXQxLngoKSwgY2VudGVyLnkoKSAtIGJvdW5kcy55KCkpOworICBvdXRfYXR0cmlidXRlc1syXS5ib3VuZHMuU2V0UmVjdChib3VuZHMueCgpLCBjZW50ZXIueSgpLAorICAgICAgaW5zZXQyLngoKSAtIGJvdW5kcy54KCksIGJvdW5kcy5ib3R0b20oKSAtIGNlbnRlci55KCkpOworICBvdXRfYXR0cmlidXRlc1szXS5ib3VuZHMuU2V0UmVjdChpbnNldDMueCgpLCBjZW50ZXIueSgpLAorICAgICAgYm91bmRzLnJpZ2h0KCkgLSBpbnNldDMueCgpLCBib3VuZHMuYm90dG9tKCkgLSBjZW50ZXIueSgpKTsKKyAgb3V0X2F0dHJpYnV0ZXNbNF0uYm91bmRzLlNldFJlY3QoaW5zZXQwLngoKSwgYm91bmRzLnkoKSwKKyAgICAgIGNlbnRlci54KCkgLSBpbnNldDAueCgpLCBpbnNldDAueSgpIC0gYm91bmRzLnkoKSk7CisgIG91dF9hdHRyaWJ1dGVzWzVdLmJvdW5kcy5TZXRSZWN0KGNlbnRlci54KCksIGJvdW5kcy55KCksCisgICAgICBpbnNldDEueCgpIC0gY2VudGVyLngoKSwgaW5zZXQxLnkoKSAtIGJvdW5kcy55KCkpOworICBvdXRfYXR0cmlidXRlc1s2XS5ib3VuZHMuU2V0UmVjdChpbnNldDIueCgpLCBpbnNldDIueSgpLAorICAgICAgY2VudGVyLngoKSAtIGluc2V0Mi54KCksIGJvdW5kcy5ib3R0b20oKSAtIGluc2V0Mi55KCkpOworICBvdXRfYXR0cmlidXRlc1s3XS5ib3VuZHMuU2V0UmVjdChjZW50ZXIueCgpLCBpbnNldDMueSgpLAorICAgICAgaW5zZXQzLngoKSAtIGNlbnRlci54KCksIGJvdW5kcy5ib3R0b20oKSAtIGluc2V0My55KCkpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgRHJhd09iamVjdDo6R2V0UkNvcm5lclZhbHVlcyhtYXRoOjpSZWN0RiogcmVjdCwKKyAgICByZW5kZXJfdHJlZTo6Um91bmRlZENvcm5lcnMqIGNvcm5lcnMsIFJSZWN0QXR0cmlidXRlcyBvdXRfcmNvcm5lcnNbNF0pIHsKICAgLy8gRW5zdXJlIGNvcm5lciBzaXplcyBhcmUgbm9uLXplcm8gdG8gYWxsb3cgZ2VuZXJpYyBoYW5kbGluZyBvZiBzcXVhcmUgYW5kCi0gIC8vIHJvdW5kZWQgY29ybmVycy4KLSAgY29uc3QgZmxvYXQga01pbkNvcm5lclNpemUgPSAwLjAxZjsKLSAgaW5zZXRfcmVjdC5PdXRzZXQoa01pbkNvcm5lclNpemUsIGtNaW5Db3JuZXJTaXplKTsKLSAgaW5zZXRfY29ybmVycyA9IGluc2V0X2Nvcm5lcnMuSW5zZXQoLWtNaW5Db3JuZXJTaXplLCAta01pbkNvcm5lclNpemUsCi0gICAgICAta01pbkNvcm5lclNpemUsIC1rTWluQ29ybmVyU2l6ZSk7Ci0gIGluc2V0X2Nvcm5lcnMgPSBpbnNldF9jb3JuZXJzLk5vcm1hbGl6ZShpbnNldF9yZWN0KTsKKyAgLy8gcm91bmRlZCBjb3JuZXJzLiBDb3JuZXIgcmFkaWkgbXVzdCBiZSBhdCBsZWFzdCAxIHBpeGVsIGZvciBhbnRpYWxpYXNpbmcKKyAgLy8gdG8gd29yayB3ZWxsLgorICBjb25zdCBmbG9hdCBrTWluQ29ybmVyU2l6ZSA9IDEuMGY7CiAKLSAgLy8gVGhlIHJlY3QgZGF0YSBpcyBhIHZlYzQgcmVwcmVzZW50aW5nIChtaW4ueHksIG1heC54eSkuCi0gIGZsb2F0IHJlY3RfZGF0YVs0XSA9IHsKLSAgICBpbnNldF9yZWN0LngoKSwgaW5zZXRfcmVjdC55KCksIGluc2V0X3JlY3QucmlnaHQoKSwgaW5zZXRfcmVjdC5ib3R0b20oKSwKLSAgfTsKLSAgR0xfQ0FMTChnbFVuaWZvcm00ZnYocmVjdF91bmlmb3JtLCAxLCByZWN0X2RhdGEpKTsKKyAgLy8gRmlyc3QgaW5zZXQgdG8gbWFrZSByb29tIGZvciB0aGUgbWluaW11bSBjb3JuZXIgc2l6ZS4gVGhlbiBvdXRzZXQgdG8KKyAgLy8gZW5mb3JjZSB0aGUgbWluaW11bSBjb3JuZXIgc2l6ZS4gQmUgY2FyZWZ1bCBub3QgdG8gaW5zZXQgbW9yZSB0aGFuIHRoZQorICAvLyByZWN0IHNpemUsIG90aGVyd2lzZSB0aGUgb3V0c2V0IHJlY3Qgd2lsbCBiZSBvZmYtY2VudGVyZWQuCisgIHJlY3QtPkluc2V0KHN0ZDo6bWluKHJlY3QtPndpZHRoKCkgKiAwLjVmLCBrTWluQ29ybmVyU2l6ZSksCisgICAgICAgICAgICAgIHN0ZDo6bWluKHJlY3QtPmhlaWdodCgpICogMC41Ziwga01pbkNvcm5lclNpemUpKTsKKyAgKmNvcm5lcnMgPSBjb3JuZXJzLT5JbnNldChrTWluQ29ybmVyU2l6ZSwga01pbkNvcm5lclNpemUsIGtNaW5Db3JuZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtNaW5Db3JuZXJTaXplKTsKKyAgKmNvcm5lcnMgPSBjb3JuZXJzLT5Ob3JtYWxpemUoKnJlY3QpOworICByZWN0LT5PdXRzZXQoa01pbkNvcm5lclNpemUsIGtNaW5Db3JuZXJTaXplKTsKKyAgKmNvcm5lcnMgPSBjb3JuZXJzLT5JbnNldCgta01pbkNvcm5lclNpemUsIC1rTWluQ29ybmVyU2l6ZSwgLWtNaW5Db3JuZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1rTWluQ29ybmVyU2l6ZSk7CiAKLSAgLy8gVGhlIGNvcm5lcnMgZGF0YSBpcyBhIG1hdDQgd2l0aCBlYWNoIHZlY3RvciByZXByZXNlbnRpbmcgYSBjb3JuZXIKLSAgLy8gKG9yZGVyZWQgdG9wIGxlZnQsIHRvcCByaWdodCwgYm90dG9tIGxlZnQsIGJvdHRvbSByaWdodCkuIEVhY2ggY29ybmVyCi0gIC8vIHZlYzQgcmVwcmVzZW50cyAoc3RhcnQueHksIHJhZGl1cy54eSkuCi0gIGZsb2F0IGNvcm5lcnNfZGF0YVsxNl0gPSB7Ci0gICAgaW5zZXRfcmVjdC54KCkgKyBpbnNldF9jb3JuZXJzLnRvcF9sZWZ0Lmhvcml6b250YWwsCi0gICAgaW5zZXRfcmVjdC55KCkgKyBpbnNldF9jb3JuZXJzLnRvcF9sZWZ0LnZlcnRpY2FsLAotICAgIGluc2V0X2Nvcm5lcnMudG9wX2xlZnQuaG9yaXpvbnRhbCwKLSAgICBpbnNldF9jb3JuZXJzLnRvcF9sZWZ0LnZlcnRpY2FsLAotICAgIGluc2V0X3JlY3QucmlnaHQoKSAtIGluc2V0X2Nvcm5lcnMudG9wX3JpZ2h0Lmhvcml6b250YWwsCi0gICAgaW5zZXRfcmVjdC55KCkgKyBpbnNldF9jb3JuZXJzLnRvcF9yaWdodC52ZXJ0aWNhbCwKLSAgICBpbnNldF9jb3JuZXJzLnRvcF9yaWdodC5ob3Jpem9udGFsLAotICAgIGluc2V0X2Nvcm5lcnMudG9wX3JpZ2h0LnZlcnRpY2FsLAotICAgIGluc2V0X3JlY3QueCgpICsgaW5zZXRfY29ybmVycy5ib3R0b21fbGVmdC5ob3Jpem9udGFsLAotICAgIGluc2V0X3JlY3QuYm90dG9tKCkgLSBpbnNldF9jb3JuZXJzLmJvdHRvbV9sZWZ0LnZlcnRpY2FsLAotICAgIGluc2V0X2Nvcm5lcnMuYm90dG9tX2xlZnQuaG9yaXpvbnRhbCwKLSAgICBpbnNldF9jb3JuZXJzLmJvdHRvbV9sZWZ0LnZlcnRpY2FsLAotICAgIGluc2V0X3JlY3QucmlnaHQoKSAtIGluc2V0X2Nvcm5lcnMuYm90dG9tX3JpZ2h0Lmhvcml6b250YWwsCi0gICAgaW5zZXRfcmVjdC5ib3R0b20oKSAtIGluc2V0X2Nvcm5lcnMuYm90dG9tX3JpZ2h0LnZlcnRpY2FsLAotICAgIGluc2V0X2Nvcm5lcnMuYm90dG9tX3JpZ2h0Lmhvcml6b250YWwsCi0gICAgaW5zZXRfY29ybmVycy5ib3R0b21fcmlnaHQudmVydGljYWwsCi0gIH07Ci0gIEdMX0NBTEwoZ2xVbmlmb3JtTWF0cml4NGZ2KGNvcm5lcnNfdW5pZm9ybSwgMSwgZmFsc2UsIGNvcm5lcnNfZGF0YSkpOworICAvLyB8cmNvcm5lcnwgZGVzY3JpYmVzIChzdGFydC54eSwgMSAvIHJhZGl1cy54eSkgZm9yIHRoZSByZWxldmFudCBjb3JuZXIuCisgIC8vIFRoZSBzaWduIG9mIHRoZSByYWRpdXMgY29tcG9uZW50IGlzIHVzZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY2FsY3VsYXRpb246CisgIC8vICAgdmVjMiBzY2FsZWRfb2Zmc2V0ID0gKHBvc2l0aW9uIC0gY29ybmVyLnh5KSAqIGNvcm5lci56dworICAvLyBTdWNoIHRoYXQgfHNjYWxlZF9vZmZzZXR8IGlzIGluIHRoZSBmaXJzdCBxdWFkcmFudCB3aGVuIHRoZSBwaXhlbCBpcworICAvLyBpbiB0aGUgZ2l2ZW4gcm91bmRlZCBjb3JuZXIuCisgIENPTVBJTEVfQVNTRVJUKHNpemVvZihSQ29ybmVyKSA9PSBzaXplb2YoZmxvYXQpICogNCwgc3RydWN0X3Nob3VsZF9iZV92ZWM0KTsKKyAgb3V0X3Jjb3JuZXJzWzBdLnJjb3JuZXIueCA9IHJlY3QtPngoKSArIGNvcm5lcnMtPnRvcF9sZWZ0Lmhvcml6b250YWw7CisgIG91dF9yY29ybmVyc1swXS5yY29ybmVyLnkgPSByZWN0LT55KCkgKyBjb3JuZXJzLT50b3BfbGVmdC52ZXJ0aWNhbDsKKyAgb3V0X3Jjb3JuZXJzWzBdLnJjb3JuZXIucnggPSAtMS4wZiAvIGNvcm5lcnMtPnRvcF9sZWZ0Lmhvcml6b250YWw7CisgIG91dF9yY29ybmVyc1swXS5yY29ybmVyLnJ5ID0gLTEuMGYgLyBjb3JuZXJzLT50b3BfbGVmdC52ZXJ0aWNhbDsKKworICBvdXRfcmNvcm5lcnNbMV0ucmNvcm5lci54ID0gcmVjdC0+cmlnaHQoKSAtIGNvcm5lcnMtPnRvcF9yaWdodC5ob3Jpem9udGFsOworICBvdXRfcmNvcm5lcnNbMV0ucmNvcm5lci55ID0gcmVjdC0+eSgpICsgY29ybmVycy0+dG9wX3JpZ2h0LnZlcnRpY2FsOworICBvdXRfcmNvcm5lcnNbMV0ucmNvcm5lci5yeCA9IDEuMGYgLyBjb3JuZXJzLT50b3BfcmlnaHQuaG9yaXpvbnRhbDsKKyAgb3V0X3Jjb3JuZXJzWzFdLnJjb3JuZXIucnkgPSAtMS4wZiAvIGNvcm5lcnMtPnRvcF9yaWdodC52ZXJ0aWNhbDsKKworICBvdXRfcmNvcm5lcnNbMl0ucmNvcm5lci54ID0gcmVjdC0+eCgpICsgY29ybmVycy0+Ym90dG9tX2xlZnQuaG9yaXpvbnRhbDsKKyAgb3V0X3Jjb3JuZXJzWzJdLnJjb3JuZXIueSA9IHJlY3QtPmJvdHRvbSgpIC0gY29ybmVycy0+Ym90dG9tX2xlZnQudmVydGljYWw7CisgIG91dF9yY29ybmVyc1syXS5yY29ybmVyLnJ4ID0gLTEuMGYgLyBjb3JuZXJzLT5ib3R0b21fbGVmdC5ob3Jpem9udGFsOworICBvdXRfcmNvcm5lcnNbMl0ucmNvcm5lci5yeSA9IDEuMGYgLyBjb3JuZXJzLT5ib3R0b21fbGVmdC52ZXJ0aWNhbDsKKworICBvdXRfcmNvcm5lcnNbM10ucmNvcm5lci54ID0gcmVjdC0+cmlnaHQoKSAtIGNvcm5lcnMtPmJvdHRvbV9yaWdodC5ob3Jpem9udGFsOworICBvdXRfcmNvcm5lcnNbM10ucmNvcm5lci55ID0gcmVjdC0+Ym90dG9tKCkgLSBjb3JuZXJzLT5ib3R0b21fcmlnaHQudmVydGljYWw7CisgIG91dF9yY29ybmVyc1szXS5yY29ybmVyLnJ4ID0gMS4wZiAvIGNvcm5lcnMtPmJvdHRvbV9yaWdodC5ob3Jpem9udGFsOworICBvdXRfcmNvcm5lcnNbM10ucmNvcm5lci5yeSA9IDEuMGYgLyBjb3JuZXJzLT5ib3R0b21fcmlnaHQudmVydGljYWw7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBlZ2wKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19vYmplY3QuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19vYmplY3QuaAppbmRleCAxZTJmYjEyLi4xOWFmNDU0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2RyYXdfb2JqZWN0LmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9kcmF3X29iamVjdC5oCkBAIC05MCw5ICs5MCwzMiBAQAogICB2aXJ0dWFsIGJhc2U6OlR5cGVJZCBHZXRUeXBlSWQoKSBjb25zdCA9IDA7CiAKICBwcm90ZWN0ZWQ6CisgIC8vIFN0cnVjdHVyZXMgZGVzY3JpYmluZyB2ZXJ0ZXggZGF0YSBmb3IgcmVuZGVyaW5nIHJvdW5kZWQgcmVjdGFuZ2xlcy4KKyAgc3RydWN0IFJDb3JuZXIgeworICAgIC8vIENvbnN0cnVjdG9yIHRvIHRyYW5zZm9ybSBhIFJDb3JuZXIgdmFsdWUgaW50byBhIGZvcm1hdCB3aGljaCB0aGUKKyAgICAvLyBzaGFkZXIgZnVuY3Rpb24gSXNPdXRzaWRlUkNvcm5lcigpIGV4cGVjdHMuIFRoaXMgZXhwcmVzc2VzIHRoZSBjdXJyZW50CisgICAgLy8gdmVydGV4IHBvc2l0aW9uIGFzIGEgc2NhbGVkIG9mZnNldCByZWxldmFudCBmb3IgdGhlIGNvcm5lciwgYW5kIHByb3ZpZGVzCisgICAgLy8gc2NhbGFycyB0byBhc3Npc3QgaW4gY2FsY3VsYXRpbmcgdGhlIGFudGlhbGlhc2VkIGVkZ2UuIEZvciBtb3JlIGRldGFpbHMsCisgICAgLy8gc2VlIGZ1bmN0aW9uX2lzX291dHNpZGVfcmNvcm5lci5pbmMuCisgICAgUkNvcm5lcihjb25zdCBmbG9hdCAoJnBvc2l0aW9uKVsyXSwgY29uc3QgUkNvcm5lciYgaW5pdCk7CisgICAgUkNvcm5lcigpIHt9CisgICAgZmxvYXQgeCwgeTsKKyAgICBmbG9hdCByeCwgcnk7CisgIH07CisgIHN0cnVjdCBSUmVjdEF0dHJpYnV0ZXMgeworICAgIG1hdGg6OlJlY3RGIGJvdW5kczsgICAvLyBUaGUgcmVnaW9uIGluIHdoaWNoIHRvIHVzZSB0aGUgcmNvcm5lciBkYXRhLgorICAgIFJDb3JuZXIgcmNvcm5lcjsKKyAgfTsKKwogICBEcmF3T2JqZWN0KCkge30KICAgZXhwbGljaXQgRHJhd09iamVjdChjb25zdCBCYXNlU3RhdGUmIGJhc2Vfc3RhdGUpOwogCisgIC8vIEV4dHJhY3QgdGhlIHNjYWxlIHZlY3RvciBmcm9tIHRoaXMgb2JqZWN0J3MgdHJhbnNmb3JtLgorICBtYXRoOjpWZWN0b3IyZEYgR2V0U2NhbGUoKSBjb25zdDsKKworICAvLyBSZW1vdmUgc2NhbGUgZnJvbSB0aGUgdHJhbnNmb3JtLCBhbmQgcmV0dXJuIHRoZSBzY2FsZSB2ZWN0b3IuCisgIG1hdGg6OlZlY3RvcjJkRiBSZW1vdmVTY2FsZUZyb21UcmFuc2Zvcm0oKTsKKwogICAvLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIGdldCB0aGUgcmVuZGVyIGNvbG9yIGZvciB0aGUgYmxlbmQgbW9kZXMgdGhhdCB3aWxsCiAgIC8vIGJlIHVzZWQuIFRoZXNlIG1vZGVzIGV4cGVjdCBhbHBoYSB0byBiZSBwcmUtbXVsdGlwbGllZC4KICAgc3RhdGljIHJlbmRlcl90cmVlOjpDb2xvclJHQkEgR2V0RHJhd0NvbG9yKApAQCAtMTA4LDE0ICsxMzEsMjggQEAKICAgICByZXR1cm4gR2V0R0xSR0JBKGNvbG9yLnIoKSwgY29sb3IuZygpLCBjb2xvci5iKCksIGNvbG9yLmEoKSk7CiAgIH0KIAotICAvLyBTZXQgc2hhZGVyIHVuaWZvcm1zIGZvciBhIHJvdW5kZWQgcmVjdC4gU3BlY2lmeSBhIG5vbi16ZXJvIGluc2V0IGlmCi0gIC8vIHRoZSByZWN0IHdpbGwgYmUgdXNlZCB3aXRoIGFudGktYWxpYXNpbmcgKGUuZy4gMC41IGluc2V0IGZvciBhIDEtcGl4ZWwKLSAgLy8gYW50aS1hbGlhc2luZyBib3JkZXIpLgotICBzdGF0aWMgdm9pZCBTZXRSUmVjdFVuaWZvcm1zKEdMaW50IHJlY3RfdW5pZm9ybSwgR0xpbnQgY29ybmVyc191bmlmb3JtLAotICAgICAgY29uc3QgbWF0aDo6UmVjdEYmIHJlY3QsIGNvbnN0IHJlbmRlcl90cmVlOjpSb3VuZGVkQ29ybmVycyYgY29ybmVycywKLSAgICAgIGZsb2F0IGluc2V0KTsKKyAgLy8gR2V0IHRoZSB2ZXJ0ZXggYXR0cmlidXRlcyB0byB1c2UgdG8gZHJhdyB0aGUgZ2l2ZW4gcm91bmRlZCByZWN0LiBFYWNoCisgIC8vIGNvcm5lciB1c2VzIGEgZGlmZmVyZW50IGF0dHJpYnV0ZS4gVGhlc2UgUkNvcm5lciB2YWx1ZXMgbXVzdCBiZSB0cmFuc2Zvcm1lZAorICAvLyBiZWZvcmUgYmVpbmcgcGFzc2VkIHRvIHRoZSBzaGFkZXIuIChTZWUgUkNvcm5lciBjb25zdHJ1Y3Rvci4pCisgIHN0YXRpYyB2b2lkIEdldFJSZWN0QXR0cmlidXRlcyhjb25zdCBtYXRoOjpSZWN0RiYgYm91bmRzLAorICAgICAgbWF0aDo6UmVjdEYgcmVjdCwgcmVuZGVyX3RyZWU6OlJvdW5kZWRDb3JuZXJzIGNvcm5lcnMsCisgICAgICBSUmVjdEF0dHJpYnV0ZXMgKCZvdXRfYXR0cmlidXRlcylbNF0pOworCisgIC8vIEdldCB0aGUgdmVydGV4IGF0dHJpYnV0ZXMgdG8gZHJhdyB0aGUgZ2l2ZW4gcm91bmRlZCByZWN0IGV4Y2x1ZGluZyB0aGUKKyAgLy8gaW5zY3JpYmVkIHJlY3QuIFRoZXNlIFJDb3JuZXIgdmFsdWVzIG11c3QgYmUgdHJhbnNmb3JtZWQgYmVmb3JlIGJlaW5nCisgIC8vIHBhc3NlZCB0byB0aGUgc2hhZGVyLiAoU2VlIFJDb3JuZXIgY29uc3RydWN0b3IuKQorICBzdGF0aWMgdm9pZCBHZXRSUmVjdEF0dHJpYnV0ZXMoY29uc3QgbWF0aDo6UmVjdEYmIGJvdW5kcywKKyAgICAgIG1hdGg6OlJlY3RGIHJlY3QsIHJlbmRlcl90cmVlOjpSb3VuZGVkQ29ybmVycyBjb3JuZXJzLAorICAgICAgUlJlY3RBdHRyaWJ1dGVzICgmb3V0X2F0dHJpYnV0ZXMpWzhdKTsKIAogICBCYXNlU3RhdGUgYmFzZV9zdGF0ZV87CisKKyBwcml2YXRlOgorICAvLyBSZXR1cm4gdGhlIFJDb3JuZXIgdmFsdWVzIGZvciB0aGUgZ2l2ZW4gcm91bmRlZCByZWN0LCBhbmQgdGhlIG5vcm1hbGl6ZWQKKyAgLy8gcmVjdCBhbmQgY29ybmVyIHZhbHVlcyB1c2VkLgorICBzdGF0aWMgdm9pZCBHZXRSQ29ybmVyVmFsdWVzKG1hdGg6OlJlY3RGKiByZWN0LAorICAgICAgcmVuZGVyX3RyZWU6OlJvdW5kZWRDb3JuZXJzKiBjb3JuZXJzLAorICAgICAgUlJlY3RBdHRyaWJ1dGVzIG91dF9yY29ybmVyc1s0XSk7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgZWdsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2RyYXdfcmVjdF9ib3JkZXIuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2RyYXdfcmVjdF9ib3JkZXIuY2MKaW5kZXggY2RjMWQ4OC4uODI5ZWYzMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9kcmF3X3JlY3RfYm9yZGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19yZWN0X2JvcmRlci5jYwpAQCAtMTIxLDI2ICsxMjEsMTggQEAKICAgICBjb25zdCBtYXRoOjpSZWN0RiYgYm9yZGVyX3JlY3QsIGNvbnN0IG1hdGg6OlJlY3RGJiBjb250ZW50X3JlY3QsCiAgICAgY29uc3QgcmVuZGVyX3RyZWU6OkNvbG9yUkdCQSYgYm9yZGVyX2NvbG9yLAogICAgIGNvbnN0IHJlbmRlcl90cmVlOjpDb2xvclJHQkEmIGNvbnRlbnRfY29sb3IpIHsKLSAgLy8gRXh0cmFjdCBzY2FsZSBmcm9tIHRoZSB0cmFuc2Zvcm0gbWF0cml4LiBUaGlzIGNhbiBiZSByZWxpYWJseSBkb25lIGlmIG5vCi0gIC8vIHJvdGF0aW9ucyBhcmUgaW52b2x2ZWQuCi0gIGNvbnN0IGZsb2F0IGtFcHNpbG9uID0gMC4wMDAxZjsKLSAgaWYgKHN0ZDo6YWJzKGJhc2Vfc3RhdGVfLnRyYW5zZm9ybSgwLCAxKSkgPj0ga0Vwc2lsb24gfHwKLSAgICAgIHN0ZDo6YWJzKGJhc2Vfc3RhdGVfLnRyYW5zZm9ybSgxLCAwKSkgPj0ga0Vwc2lsb24pIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBJZiB0aGUgc2NhbGUgaXMgMCBpbiBlaXRoZXIgZGlyZWN0aW9uLCB0aGVuIHRoZXJlJ3Mgbm90aGluZyB0byByZW5kZXIuCi0gIGZsb2F0IHNjYWxlX3ggPSBzdGQ6OmFicyhiYXNlX3N0YXRlXy50cmFuc2Zvcm0oMCwgMCkpOwotICBmbG9hdCBzY2FsZV95ID0gc3RkOjphYnMoYmFzZV9zdGF0ZV8udHJhbnNmb3JtKDEsIDEpKTsKLSAgaWYgKHNjYWxlX3ggPD0ga0Vwc2lsb24gfHwgc2NhbGVfeSA8PSBrRXBzaWxvbikgeworICAvLyBJZiB0aGUgc2NhbGVkIGJvcmRlciByZWN0IGlzIHRvbyBzbWFsbCwgdGhlbiBkb24ndCBib3RoZXIgcmVuZGVyaW5nLgorICBtYXRoOjpWZWN0b3IyZEYgc2NhbGUgPSBHZXRTY2FsZSgpOworICBpZiAoYm9yZGVyX3JlY3Qud2lkdGgoKSAqIHNjYWxlLngoKSA8IDEuMGYgfHwKKyAgICAgIGJvcmRlcl9yZWN0LmhlaWdodCgpICogc2NhbGUueSgpIDwgMS4wZikgewogICAgIHJldHVybiB0cnVlOwogICB9CiAKICAgLy8gQW50aWFsaWFzZWQgc3VicGl4ZWwgYm9yZGVycyBhcmUgbm90IHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUuIEl0IGNhbiBiZQogICAvLyBkb25lIGJ5IGF0dGVudWF0aW5nIHRoZSBhbHBoYSwgYnV0IHRoaXMgY2FuIGdldCBjb21wbGljYXRlZCBpZiB0aGUgYm9yZGVycwogICAvLyBhcmUgb2YgZGlmZmVyZW50IHdpZHRocy4KLSAgZmxvYXQgcGl4ZWxfc2l6ZV94ID0gMS4wZiAvIHNjYWxlX3g7Ci0gIGZsb2F0IHBpeGVsX3NpemVfeSA9IDEuMGYgLyBzY2FsZV95OworICBmbG9hdCBwaXhlbF9zaXplX3ggPSAxLjBmIC8gc2NhbGUueCgpOworICBmbG9hdCBwaXhlbF9zaXplX3kgPSAxLjBmIC8gc2NhbGUueSgpOwogICBpZiAoYm9yZGVyLmxlZnQud2lkdGggPCBwaXhlbF9zaXplX3ggfHwgYm9yZGVyLnJpZ2h0LndpZHRoIDwgcGl4ZWxfc2l6ZV94IHx8CiAgICAgICBib3JkZXIudG9wLndpZHRoIDwgcGl4ZWxfc2l6ZV95IHx8IGJvcmRlci5ib3R0b20ud2lkdGggPCBwaXhlbF9zaXplX3kpIHsKICAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2RyYXdfcmVjdF9zaGFkb3dfYmx1ci5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19yZWN0X3NoYWRvd19ibHVyLmNjCmluZGV4IDEzNDAxYzkuLmZjYWJkMmQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19yZWN0X3NoYWRvd19ibHVyLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19yZWN0X3NoYWRvd19ibHVyLmNjCkBAIC04MCwxMjggKzgwLDM0MCBAQAogfQogfSAgLy8gbmFtZXNwYWNlCiAKK0RyYXdSZWN0U2hhZG93Qmx1cjo6VmVydGV4QXR0cmlidXRlc1NxdWFyZTo6VmVydGV4QXR0cmlidXRlc1NxdWFyZSgKKyAgICBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCBvZmZzZXRfc2NhbGUpIHsKKyAgcG9zaXRpb25bMF0gPSB4OworICBwb3NpdGlvblsxXSA9IHk7CisgIG9mZnNldFswXSA9IHggKiBvZmZzZXRfc2NhbGU7CisgIG9mZnNldFsxXSA9IHkgKiBvZmZzZXRfc2NhbGU7Cit9CisKK0RyYXdSZWN0U2hhZG93Qmx1cjo6VmVydGV4QXR0cmlidXRlc1JvdW5kOjpWZXJ0ZXhBdHRyaWJ1dGVzUm91bmQoCisgICAgZmxvYXQgeCwgZmxvYXQgeSwgY29uc3QgUkNvcm5lciYgaW5pdCkgeworICBwb3NpdGlvblswXSA9IHg7CisgIHBvc2l0aW9uWzFdID0geTsKKyAgcmNvcm5lcl9zY2lzc29yID0gUkNvcm5lcihwb3NpdGlvbiwgaW5pdCk7Cit9CisKIERyYXdSZWN0U2hhZG93Qmx1cjo6RHJhd1JlY3RTaGFkb3dCbHVyKEdyYXBoaWNzU3RhdGUqIGdyYXBoaWNzX3N0YXRlLAogICAgIGNvbnN0IEJhc2VTdGF0ZSYgYmFzZV9zdGF0ZSwgY29uc3QgbWF0aDo6UmVjdEYmIGJhc2VfcmVjdCwKICAgICBjb25zdCBPcHRpb25hbFJvdW5kZWRDb3JuZXJzJiBiYXNlX2Nvcm5lcnMsIGNvbnN0IG1hdGg6OlJlY3RGJiBzcHJlYWRfcmVjdCwKICAgICBjb25zdCBPcHRpb25hbFJvdW5kZWRDb3JuZXJzJiBzcHJlYWRfY29ybmVycywKICAgICBjb25zdCByZW5kZXJfdHJlZTo6Q29sb3JSR0JBJiBjb2xvciwgZmxvYXQgYmx1cl9zaWdtYSwgYm9vbCBpbnNldCkKLSAgICA6IERyYXdSZWN0U2hhZG93U3ByZWFkKGdyYXBoaWNzX3N0YXRlLCBiYXNlX3N0YXRlKSwKKyAgICA6IERyYXdPYmplY3QoYmFzZV9zdGF0ZSksCiAgICAgICBzcHJlYWRfcmVjdF8oc3ByZWFkX3JlY3QpLAogICAgICAgc3ByZWFkX2Nvcm5lcnNfKHNwcmVhZF9jb3JuZXJzKSwKICAgICAgIGJsdXJfc2lnbWFfKGJsdXJfc2lnbWEpLAotICAgICAgaXNfaW5zZXRfKGluc2V0KSB7Ci0gIGNvbnN0IGZsb2F0IGtCbHVyRXh0ZW50SW5QaXhlbHMgPSBrQmx1ckV4dGVudEluU2lnbWFzICogYmx1cl9zaWdtYTsKKyAgICAgIGlzX2luc2V0XyhpbnNldCksCisgICAgICB2ZXJ0ZXhfYnVmZmVyXyhudWxscHRyKSwKKyAgICAgIGluZGV4X2J1ZmZlcl8obnVsbHB0cikgeworICBjb2xvcl8gPSBHZXREcmF3Q29sb3IoY29sb3IpICogYmFzZV9zdGF0ZV8ub3BhY2l0eTsKIAotICBpZiAoaW5zZXQpIHsKLSAgICBvdXRlcl9yZWN0XyA9IGJhc2VfcmVjdDsKLSAgICBvdXRlcl9jb3JuZXJzXyA9IGJhc2VfY29ybmVyczsKLSAgICBpbm5lcl9yZWN0XyA9IHNwcmVhZF9yZWN0OwotICAgIGlubmVyX3JlY3RfLkluc2V0KGtCbHVyRXh0ZW50SW5QaXhlbHMsIGtCbHVyRXh0ZW50SW5QaXhlbHMpOwotICAgIGlmIChpbm5lcl9yZWN0Xy5Jc0VtcHR5KCkpIHsKLSAgICAgIGlubmVyX3JlY3RfLnNldF9vcmlnaW4oc3ByZWFkX3JlY3QuQ2VudGVyUG9pbnQoKSk7Ci0gICAgfQotICAgIGlmIChzcHJlYWRfY29ybmVycykgewotICAgICAgaW5uZXJfY29ybmVyc18gPSBzcHJlYWRfY29ybmVycy0+SW5zZXQoa0JsdXJFeHRlbnRJblBpeGVscywKLSAgICAgICAgICBrQmx1ckV4dGVudEluUGl4ZWxzLCBrQmx1ckV4dGVudEluUGl4ZWxzLCBrQmx1ckV4dGVudEluUGl4ZWxzKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaW5uZXJfcmVjdF8gPSBiYXNlX3JlY3Q7Ci0gICAgaW5uZXJfY29ybmVyc18gPSBiYXNlX2Nvcm5lcnM7Ci0gICAgb3V0ZXJfcmVjdF8gPSBzcHJlYWRfcmVjdDsKLSAgICBvdXRlcl9yZWN0Xy5PdXRzZXQoa0JsdXJFeHRlbnRJblBpeGVscywga0JsdXJFeHRlbnRJblBpeGVscyk7Ci0gICAgaWYgKHNwcmVhZF9jb3JuZXJzKSB7Ci0gICAgICBvdXRlcl9jb3JuZXJzXyA9IHNwcmVhZF9jb3JuZXJzLT5JbnNldCgta0JsdXJFeHRlbnRJblBpeGVscywKLSAgICAgICAgICAta0JsdXJFeHRlbnRJblBpeGVscywgLWtCbHVyRXh0ZW50SW5QaXhlbHMsIC1rQmx1ckV4dGVudEluUGl4ZWxzKTsKLSAgICB9CisgIC8vIEV4dHJhY3Qgc2NhbGUgZnJvbSB0aGUgdHJhbnNmb3JtIGFuZCBtb3ZlIGl0IGludG8gdGhlIHZlcnRleCBhdHRyaWJ1dGVzCisgIC8vIHNvIHRoYXQgdGhlIGFudGktYWxpYXNlZCBlZGdlcyByZW1haW4gMSBwaXhlbCB3aWRlLgorICBtYXRoOjpWZWN0b3IyZEYgc2NhbGUgPSBSZW1vdmVTY2FsZUZyb21UcmFuc2Zvcm0oKTsKKyAgbWF0aDo6UmVjdEYgc2NhbGVkX2Jhc2VfcmVjdChiYXNlX3JlY3QpOworICBzY2FsZWRfYmFzZV9yZWN0LlNjYWxlKHNjYWxlLngoKSwgc2NhbGUueSgpKTsKKyAgT3B0aW9uYWxSb3VuZGVkQ29ybmVycyBzY2FsZWRfYmFzZV9jb3JuZXJzKGJhc2VfY29ybmVycyk7CisgIGlmIChzY2FsZWRfYmFzZV9jb3JuZXJzKSB7CisgICAgc2NhbGVkX2Jhc2VfY29ybmVycyA9IHNjYWxlZF9iYXNlX2Nvcm5lcnMtPlNjYWxlKHNjYWxlLngoKSwgc2NhbGUueSgpKTsKKyAgICBzY2FsZWRfYmFzZV9jb3JuZXJzID0gc2NhbGVkX2Jhc2VfY29ybmVycy0+Tm9ybWFsaXplKHNjYWxlZF9iYXNlX3JlY3QpOworICB9CisgIHNwcmVhZF9yZWN0Xy5TY2FsZShzY2FsZS54KCksIHNjYWxlLnkoKSk7CisgIGlmIChzcHJlYWRfY29ybmVyc18pIHsKKyAgICBzcHJlYWRfY29ybmVyc18gPSBzcHJlYWRfY29ybmVyc18tPlNjYWxlKHNjYWxlLngoKSwgc2NhbGUueSgpKTsKKyAgICBzcHJlYWRfY29ybmVyc18gPSBzcHJlYWRfY29ybmVyc18tPk5vcm1hbGl6ZShzcHJlYWRfcmVjdF8pOwogICB9CiAKLSAgaWYgKGJhc2VfY29ybmVycyB8fCBzcHJlYWRfY29ybmVycykgewotICAgIC8vIElmIHJvdW5kZWQgcmVjdHMgYXJlIHNwZWNpZmllZCwgdGhlbiBib3RoIHRoZSBiYXNlIGFuZCBzcHJlYWQgcmVjdHMKLSAgICAvLyBtdXN0IGhhdmUgcm91bmRlZCBjb3JuZXJzLgotICAgIERDSEVDSyhpbm5lcl9jb3JuZXJzXyk7Ci0gICAgRENIRUNLKG91dGVyX2Nvcm5lcnNfKTsKLSAgICBEQ0hFQ0soc3ByZWFkX2Nvcm5lcnNfKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBOb24tcm91bmRlZCByZWN0cyBzcGVjaWZ5IHZlcnRleCBvZmZzZXQgaW4gdGVybXMgb2Ygc2lnbWEgZnJvbSB0aGUKLSAgICAvLyBjZW50ZXIgb2YgdGhlIHNwcmVhZCByZWN0LgotICAgIG9mZnNldF9zY2FsZV8gPSBrQmx1ckRpc3RhbmNlIC8ga0JsdXJFeHRlbnRJblBpeGVsczsKLSAgICBvZmZzZXRfY2VudGVyXyA9IHNwcmVhZF9yZWN0Xy5DZW50ZXJQb2ludCgpOwotICB9CisgIC8vIFRoZSBibHVyIGFsZ29yaXRobXMgdXNlZCBieSB0aGUgc2hhZGVycyBkbyBub3QgcHJvZHVjZSBnb29kIHJlc3VsdHMgd2l0aAorICAvLyBzZXBhcmF0ZSB4IGFuZCB5IGJsdXIgc2lnbWFzLiBTZWxlY3QgYSBzaW5nbGUgYmx1ciBzaWdtYSB0byBhcHByb3hpbWF0ZQorICAvLyB0aGUgZGVzaXJlZCBibHVyLgorICBibHVyX3NpZ21hXyAqPSBzdGQ6OnNxcnQoc2NhbGUueCgpICogc2NhbGUueSgpKTsKIAotICBjb2xvcl8gPSBHZXRHTFJHQkEoR2V0RHJhd0NvbG9yKGNvbG9yKSAqIGJhc2Vfc3RhdGVfLm9wYWNpdHkpOworICBTZXRHZW9tZXRyeShncmFwaGljc19zdGF0ZSwgc2NhbGVkX2Jhc2VfcmVjdCwgc2NhbGVkX2Jhc2VfY29ybmVycyk7Cit9CisKK3ZvaWQgRHJhd1JlY3RTaGFkb3dCbHVyOjpFeGVjdXRlVXBkYXRlVmVydGV4QnVmZmVyKAorICAgIEdyYXBoaWNzU3RhdGUqIGdyYXBoaWNzX3N0YXRlLAorICAgIFNoYWRlclByb2dyYW1NYW5hZ2VyKiBwcm9ncmFtX21hbmFnZXIpIHsKKyAgaWYgKGF0dHJpYnV0ZXNfc3F1YXJlXy5zaXplKCkgPiAwKSB7CisgICAgdmVydGV4X2J1ZmZlcl8gPSBncmFwaGljc19zdGF0ZS0+QWxsb2NhdGVWZXJ0ZXhEYXRhKAorICAgICAgICBhdHRyaWJ1dGVzX3NxdWFyZV8uc2l6ZSgpICogc2l6ZW9mKGF0dHJpYnV0ZXNfc3F1YXJlX1swXSkpOworICAgIFNiTWVtb3J5Q29weSh2ZXJ0ZXhfYnVmZmVyXywgJmF0dHJpYnV0ZXNfc3F1YXJlX1swXSwKKyAgICAgICAgYXR0cmlidXRlc19zcXVhcmVfLnNpemUoKSAqIHNpemVvZihhdHRyaWJ1dGVzX3NxdWFyZV9bMF0pKTsKKyAgfSBlbHNlIGlmIChhdHRyaWJ1dGVzX3JvdW5kXy5zaXplKCkgPiAwKSB7CisgICAgdmVydGV4X2J1ZmZlcl8gPSBncmFwaGljc19zdGF0ZS0+QWxsb2NhdGVWZXJ0ZXhEYXRhKAorICAgICAgICBhdHRyaWJ1dGVzX3JvdW5kXy5zaXplKCkgKiBzaXplb2YoYXR0cmlidXRlc19yb3VuZF9bMF0pKTsKKyAgICBTYk1lbW9yeUNvcHkodmVydGV4X2J1ZmZlcl8sICZhdHRyaWJ1dGVzX3JvdW5kX1swXSwKKyAgICAgICAgYXR0cmlidXRlc19yb3VuZF8uc2l6ZSgpICogc2l6ZW9mKGF0dHJpYnV0ZXNfcm91bmRfWzBdKSk7CisgICAgaW5kZXhfYnVmZmVyXyA9IGdyYXBoaWNzX3N0YXRlLT5BbGxvY2F0ZVZlcnRleEluZGljZXMoaW5kaWNlc18uc2l6ZSgpKTsKKyAgICBTYk1lbW9yeUNvcHkoaW5kZXhfYnVmZmVyXywgJmluZGljZXNfWzBdLAorICAgICAgICBpbmRpY2VzXy5zaXplKCkgKiBzaXplb2YoaW5kaWNlc19bMF0pKTsKKyAgfQogfQogCiB2b2lkIERyYXdSZWN0U2hhZG93Qmx1cjo6RXhlY3V0ZVJhc3Rlcml6ZSgKICAgICBHcmFwaGljc1N0YXRlKiBncmFwaGljc19zdGF0ZSwKICAgICBTaGFkZXJQcm9ncmFtTWFuYWdlciogcHJvZ3JhbV9tYW5hZ2VyKSB7CisgIGlmICh2ZXJ0ZXhfYnVmZmVyXyA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuOworICB9CisKICAgLy8gRHJhdyB0aGUgYmx1cnJlZCBzaGFkb3cuCi0gIGlmIChpbm5lcl9jb3JuZXJzXykgewotICAgIFNoYWRlclByb2dyYW08Q29tbW9uVmVydGV4U2hhZGVyLAorICBpZiAoc3ByZWFkX2Nvcm5lcnNfKSB7CisgICAgU2hhZGVyUHJvZ3JhbTxTaGFkZXJWZXJ0ZXhPZmZzZXRSY29ybmVyLAogICAgICAgICAgICAgICAgICAgU2hhZGVyRnJhZ21lbnRDb2xvckJsdXJScmVjdHM+KiBwcm9ncmFtOwogICAgIHByb2dyYW1fbWFuYWdlci0+R2V0UHJvZ3JhbSgmcHJvZ3JhbSk7CiAgICAgZ3JhcGhpY3Nfc3RhdGUtPlVzZVByb2dyYW0ocHJvZ3JhbS0+R2V0SGFuZGxlKCkpOwotICAgIFNldHVwU2hhZGVyKHByb2dyYW0tPkdldFZlcnRleFNoYWRlcigpLCBncmFwaGljc19zdGF0ZSk7Ci0KKyAgICBTZXR1cFZlcnRleFNoYWRlcihncmFwaGljc19zdGF0ZSwgcHJvZ3JhbS0+R2V0VmVydGV4U2hhZGVyKCkpOworICAgIFNldEZyYWdtZW50VW5pZm9ybXMocHJvZ3JhbS0+R2V0RnJhZ21lbnRTaGFkZXIoKS51X2NvbG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtLT5HZXRGcmFnbWVudFNoYWRlcigpLnVfc2NhbGVfYWRkKCkpOwogICAgIGZsb2F0IHNpZ21hX3NjYWxlID0ga0JsdXJEaXN0YW5jZSAvIChrQmx1ckV4dGVudEluU2lnbWFzICogYmx1cl9zaWdtYV8pOwogICAgIEdMX0NBTEwoZ2xVbmlmb3JtMmYocHJvZ3JhbS0+R2V0RnJhZ21lbnRTaGFkZXIoKS51X3NpZ21hX3NjYWxlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICBzaWdtYV9zY2FsZSwgc2lnbWFfc2NhbGUpKTsKLQogICAgIC8vIFByZS1jYWxjdWxhdGUgdGhlIHNjYWxlIHZhbHVlcyB0byBjYWxjdWxhdGUgdGhlIG5vcm1hbGl6ZWQgZ2F1c3NpYW4uCiAgICAgR0xfQ0FMTChnbFVuaWZvcm0yZihwcm9ncmFtLT5HZXRGcmFnbWVudFNoYWRlcigpLnVfZ2F1c3NpYW5fc2NhbGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjBmIC8gKDIuMGYgKiBibHVyX3NpZ21hXyAqIGJsdXJfc2lnbWFfKSwKICAgICAgICAgICAgICAgICAgICAgICAgIDEuMGYgLyAoa1NxcnQyICoga1NxcnRQaSAqIGJsdXJfc2lnbWFfKSkpOwotICAgIGlmIChpc19pbnNldF8pIHsKLSAgICAgIC8vIFNldCB0aGUgb3V0ZXIgcmVjdCB0byBiZSBhbiBpbmNsdXNpdmUgc2Npc3NvciwgYW5kIGludmVydCB0aGUgc2hhZG93LgotICAgICAgU2V0UlJlY3RVbmlmb3Jtcyhwcm9ncmFtLT5HZXRGcmFnbWVudFNoYWRlcigpLnVfc2Npc3Nvcl9yZWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0tPkdldEZyYWdtZW50U2hhZGVyKCkudV9zY2lzc29yX2Nvcm5lcnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXJfcmVjdF8sICpvdXRlcl9jb3JuZXJzXywgMC41Zik7Ci0gICAgICBHTF9DQUxMKGdsVW5pZm9ybTJmKHByb2dyYW0tPkdldEZyYWdtZW50U2hhZGVyKCkudV9zY2FsZV9hZGQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMGYsIDEuMGYpKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gU2V0IHRoZSBpbm5lciByZWN0IHRvIGJlIGFuIGV4Y2x1c2l2ZSBzY2lzc29yLgotICAgICAgU2V0UlJlY3RVbmlmb3Jtcyhwcm9ncmFtLT5HZXRGcmFnbWVudFNoYWRlcigpLnVfc2Npc3Nvcl9yZWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0tPkdldEZyYWdtZW50U2hhZGVyKCkudV9zY2lzc29yX2Nvcm5lcnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJfcmVjdF8sICppbm5lcl9jb3JuZXJzXywgMC41Zik7Ci0gICAgICBHTF9DQUxMKGdsVW5pZm9ybTJmKHByb2dyYW0tPkdldEZyYWdtZW50U2hhZGVyKCkudV9zY2FsZV9hZGQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wZiwgMC4wZikpOwotICAgIH0KICAgICBTZXRCbHVyUlJlY3RVbmlmb3Jtcyhwcm9ncmFtLT5HZXRGcmFnbWVudFNoYWRlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmVhZF9yZWN0XywgKnNwcmVhZF9jb3JuZXJzXywgYmx1cl9zaWdtYV8pOworICAgIEdMX0NBTEwoZ2xEcmF3RWxlbWVudHMoR0xfVFJJQU5HTEVTLCBpbmRpY2VzXy5zaXplKCksIEdMX1VOU0lHTkVEX1NIT1JULAorICAgICAgICBncmFwaGljc19zdGF0ZS0+R2V0VmVydGV4SW5kZXhQb2ludGVyKGluZGV4X2J1ZmZlcl8pKSk7CiAgIH0gZWxzZSB7Ci0gICAgU2hhZGVyUHJvZ3JhbTxDb21tb25WZXJ0ZXhTaGFkZXIsCisgICAgU2hhZGVyUHJvZ3JhbTxTaGFkZXJWZXJ0ZXhPZmZzZXQsCiAgICAgICAgICAgICAgICAgICBTaGFkZXJGcmFnbWVudENvbG9yQmx1cj4qIHByb2dyYW07CiAgICAgcHJvZ3JhbV9tYW5hZ2VyLT5HZXRQcm9ncmFtKCZwcm9ncmFtKTsKICAgICBncmFwaGljc19zdGF0ZS0+VXNlUHJvZ3JhbShwcm9ncmFtLT5HZXRIYW5kbGUoKSk7Ci0gICAgU2V0dXBTaGFkZXIocHJvZ3JhbS0+R2V0VmVydGV4U2hhZGVyKCksIGdyYXBoaWNzX3N0YXRlKTsKLSAgICBpZiAoaXNfaW5zZXRfKSB7Ci0gICAgICAvLyBJbnZlcnQgdGhlIHNoYWRvdy4KLSAgICAgIEdMX0NBTEwoZ2xVbmlmb3JtMmYocHJvZ3JhbS0+R2V0RnJhZ21lbnRTaGFkZXIoKS51X3NjYWxlX2FkZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4wZiwgMS4wZikpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBLZWVwIHRoZSBub3JtYWwgKG91dHNldCkgc2hhZG93LgotICAgICAgR0xfQ0FMTChnbFVuaWZvcm0yZihwcm9ncmFtLT5HZXRGcmFnbWVudFNoYWRlcigpLnVfc2NhbGVfYWRkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDEuMGYsIDAuMGYpKTsKLSAgICB9CisgICAgU2V0dXBWZXJ0ZXhTaGFkZXIoZ3JhcGhpY3Nfc3RhdGUsIHByb2dyYW0tPkdldFZlcnRleFNoYWRlcigpKTsKKyAgICBTZXRGcmFnbWVudFVuaWZvcm1zKHByb2dyYW0tPkdldEZyYWdtZW50U2hhZGVyKCkudV9jb2xvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbS0+R2V0RnJhZ21lbnRTaGFkZXIoKS51X3NjYWxlX2FkZCgpKTsKICAgICBHTF9DQUxMKGdsVW5pZm9ybTRmKHByb2dyYW0tPkdldEZyYWdtZW50U2hhZGVyKCkudV9ibHVyX3JlY3QoKSwKLSAgICAgICAgKHNwcmVhZF9yZWN0Xy54KCkgLSBvZmZzZXRfY2VudGVyXy54KCkpICogb2Zmc2V0X3NjYWxlXywKLSAgICAgICAgKHNwcmVhZF9yZWN0Xy55KCkgLSBvZmZzZXRfY2VudGVyXy55KCkpICogb2Zmc2V0X3NjYWxlXywKLSAgICAgICAgKHNwcmVhZF9yZWN0Xy5yaWdodCgpIC0gb2Zmc2V0X2NlbnRlcl8ueCgpKSAqIG9mZnNldF9zY2FsZV8sCi0gICAgICAgIChzcHJlYWRfcmVjdF8uYm90dG9tKCkgLSBvZmZzZXRfY2VudGVyXy55KCkpICogb2Zmc2V0X3NjYWxlXykpOworICAgICAgICAgICAgICAgICAgICAgICAgc3ByZWFkX3JlY3RfLngoKSwgc3ByZWFkX3JlY3RfLnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwcmVhZF9yZWN0Xy5yaWdodCgpLCBzcHJlYWRfcmVjdF8uYm90dG9tKCkpKTsKKyAgICBHTF9DQUxMKGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9TVFJJUCwgMCwgYXR0cmlidXRlc19zcXVhcmVfLnNpemUoKSkpOwogICB9Ci0KLSAgR0xfQ0FMTChnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfU1RSSVAsIDAsIHZlcnRleF9jb3VudF8pKTsKIH0KIAogYmFzZTo6VHlwZUlkIERyYXdSZWN0U2hhZG93Qmx1cjo6R2V0VHlwZUlkKCkgY29uc3QgewotICBpZiAoaW5uZXJfY29ybmVyc18pIHsKLSAgICByZXR1cm4gU2hhZGVyUHJvZ3JhbTxDb21tb25WZXJ0ZXhTaGFkZXIsCisgIGlmIChzcHJlYWRfY29ybmVyc18pIHsKKyAgICByZXR1cm4gU2hhZGVyUHJvZ3JhbTxTaGFkZXJWZXJ0ZXhPZmZzZXRSY29ybmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgIFNoYWRlckZyYWdtZW50Q29sb3JCbHVyUnJlY3RzPjo6R2V0VHlwZUlkKCk7CiAgIH0gZWxzZSB7Ci0gICAgcmV0dXJuIFNoYWRlclByb2dyYW08Q29tbW9uVmVydGV4U2hhZGVyLAorICAgIHJldHVybiBTaGFkZXJQcm9ncmFtPFNoYWRlclZlcnRleE9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICBTaGFkZXJGcmFnbWVudENvbG9yQmx1cj46OkdldFR5cGVJZCgpOwogICB9CiB9CiAKK3ZvaWQgRHJhd1JlY3RTaGFkb3dCbHVyOjpTZXR1cFZlcnRleFNoYWRlcihHcmFwaGljc1N0YXRlKiBncmFwaGljc19zdGF0ZSwKKyAgICBjb25zdCBTaGFkZXJWZXJ0ZXhPZmZzZXQmIHNoYWRlcikgeworICBncmFwaGljc19zdGF0ZS0+VXBkYXRlQ2xpcEFkanVzdG1lbnQoc2hhZGVyLnVfY2xpcF9hZGp1c3RtZW50KCkpOworICBncmFwaGljc19zdGF0ZS0+VXBkYXRlVHJhbnNmb3JtTWF0cml4KHNoYWRlci51X3ZpZXdfbWF0cml4KCksCisgICAgICBiYXNlX3N0YXRlXy50cmFuc2Zvcm0pOworICBncmFwaGljc19zdGF0ZS0+U2Npc3NvcihiYXNlX3N0YXRlXy5zY2lzc29yLngoKSwgYmFzZV9zdGF0ZV8uc2Npc3Nvci55KCksCisgICAgICBiYXNlX3N0YXRlXy5zY2lzc29yLndpZHRoKCksIGJhc2Vfc3RhdGVfLnNjaXNzb3IuaGVpZ2h0KCkpOworICBncmFwaGljc19zdGF0ZS0+VmVydGV4QXR0cmliUG9pbnRlcigKKyAgICAgIHNoYWRlci5hX3Bvc2l0aW9uKCksIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwKKyAgICAgIHNpemVvZihWZXJ0ZXhBdHRyaWJ1dGVzU3F1YXJlKSwgdmVydGV4X2J1ZmZlcl8gKworICAgICAgb2Zmc2V0b2YoVmVydGV4QXR0cmlidXRlc1NxdWFyZSwgcG9zaXRpb24pKTsKKyAgZ3JhcGhpY3Nfc3RhdGUtPlZlcnRleEF0dHJpYlBvaW50ZXIoCisgICAgICBzaGFkZXIuYV9vZmZzZXQoKSwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLAorICAgICAgc2l6ZW9mKFZlcnRleEF0dHJpYnV0ZXNTcXVhcmUpLCB2ZXJ0ZXhfYnVmZmVyXyArCisgICAgICBvZmZzZXRvZihWZXJ0ZXhBdHRyaWJ1dGVzU3F1YXJlLCBvZmZzZXQpKTsKKyAgZ3JhcGhpY3Nfc3RhdGUtPlZlcnRleEF0dHJpYkZpbmlzaCgpOworfQorCit2b2lkIERyYXdSZWN0U2hhZG93Qmx1cjo6U2V0dXBWZXJ0ZXhTaGFkZXIoR3JhcGhpY3NTdGF0ZSogZ3JhcGhpY3Nfc3RhdGUsCisgICAgY29uc3QgU2hhZGVyVmVydGV4T2Zmc2V0UmNvcm5lciYgc2hhZGVyKSB7CisgIGdyYXBoaWNzX3N0YXRlLT5VcGRhdGVDbGlwQWRqdXN0bWVudChzaGFkZXIudV9jbGlwX2FkanVzdG1lbnQoKSk7CisgIGdyYXBoaWNzX3N0YXRlLT5VcGRhdGVUcmFuc2Zvcm1NYXRyaXgoc2hhZGVyLnVfdmlld19tYXRyaXgoKSwKKyAgICAgIGJhc2Vfc3RhdGVfLnRyYW5zZm9ybSk7CisgIGdyYXBoaWNzX3N0YXRlLT5TY2lzc29yKGJhc2Vfc3RhdGVfLnNjaXNzb3IueCgpLCBiYXNlX3N0YXRlXy5zY2lzc29yLnkoKSwKKyAgICAgIGJhc2Vfc3RhdGVfLnNjaXNzb3Iud2lkdGgoKSwgYmFzZV9zdGF0ZV8uc2Npc3Nvci5oZWlnaHQoKSk7CisgIGdyYXBoaWNzX3N0YXRlLT5WZXJ0ZXhBdHRyaWJQb2ludGVyKAorICAgICAgc2hhZGVyLmFfcG9zaXRpb24oKSwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLAorICAgICAgc2l6ZW9mKFZlcnRleEF0dHJpYnV0ZXNSb3VuZCksIHZlcnRleF9idWZmZXJfICsKKyAgICAgIG9mZnNldG9mKFZlcnRleEF0dHJpYnV0ZXNSb3VuZCwgcG9zaXRpb24pKTsKKyAgZ3JhcGhpY3Nfc3RhdGUtPlZlcnRleEF0dHJpYlBvaW50ZXIoCisgICAgICBzaGFkZXIuYV9yY29ybmVyKCksIDQsIEdMX0ZMT0FULCBHTF9GQUxTRSwKKyAgICAgIHNpemVvZihWZXJ0ZXhBdHRyaWJ1dGVzUm91bmQpLCB2ZXJ0ZXhfYnVmZmVyXyArCisgICAgICBvZmZzZXRvZihWZXJ0ZXhBdHRyaWJ1dGVzUm91bmQsIHJjb3JuZXJfc2Npc3NvcikpOworICBncmFwaGljc19zdGF0ZS0+VmVydGV4QXR0cmliRmluaXNoKCk7Cit9CisKK3ZvaWQgRHJhd1JlY3RTaGFkb3dCbHVyOjpTZXRGcmFnbWVudFVuaWZvcm1zKAorICAgIEdMaW50IGNvbG9yX3VuaWZvcm0sIEdMaW50IHNjYWxlX2FkZF91bmlmb3JtKSB7CisgIEdMX0NBTEwoZ2xVbmlmb3JtNGYoY29sb3JfdW5pZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICBjb2xvcl8ucigpLCBjb2xvcl8uZygpLCBjb2xvcl8uYigpLCBjb2xvcl8uYSgpKSk7CisgIGlmIChpc19pbnNldF8pIHsKKyAgICAvLyBJbnZlcnQgdGhlIHNoYWRvdy4KKyAgICBHTF9DQUxMKGdsVW5pZm9ybTJmKHNjYWxlX2FkZF91bmlmb3JtLCAtMS4wZiwgMS4wZikpOworICB9IGVsc2UgeworICAgIC8vIEtlZXAgdGhlIG5vcm1hbCAob3V0c2V0KSBzaGFkb3cuCisgICAgR0xfQ0FMTChnbFVuaWZvcm0yZihzY2FsZV9hZGRfdW5pZm9ybSwgMS4wZiwgMC4wZikpOworICB9Cit9CisKK3ZvaWQgRHJhd1JlY3RTaGFkb3dCbHVyOjpTZXRHZW9tZXRyeShHcmFwaGljc1N0YXRlKiBncmFwaGljc19zdGF0ZSwKKyAgICBjb25zdCBtYXRoOjpSZWN0RiYgYmFzZV9yZWN0LCBjb25zdCBPcHRpb25hbFJvdW5kZWRDb3JuZXJzJiBiYXNlX2Nvcm5lcnMpIHsKKyAgY29uc3QgZmxvYXQga0JsdXJFeHRlbnRJblBpeGVscyA9IGtCbHVyRXh0ZW50SW5TaWdtYXMgKiBibHVyX3NpZ21hXzsKKworICBpZiAoYmFzZV9jb3JuZXJzIHx8IHNwcmVhZF9jb3JuZXJzXykgeworICAgIC8vIElmIHJvdW5kZWQgcmVjdHMgYXJlIHNwZWNpZmllZCwgdGhlbiBib3RoIHRoZSBiYXNlIGFuZCBzcHJlYWQgcmVjdHMKKyAgICAvLyBtdXN0IGhhdmUgcm91bmRlZCBjb3JuZXJzLgorICAgIERDSEVDSyhiYXNlX2Nvcm5lcnMpOworICAgIERDSEVDSyhzcHJlYWRfY29ybmVyc18pOworCisgICAgaWYgKGlzX2luc2V0XykgeworICAgICAgLy8gRXh0ZW5kIHRoZSBvdXRlciByZWN0IHRvIGluY2x1ZGUgdGhlIGFudGlhbGlhc2VkIGVkZ2UuCisgICAgICBtYXRoOjpSZWN0RiBvdXRlcl9yZWN0KGJhc2VfcmVjdCk7CisgICAgICBvdXRlcl9yZWN0Lk91dHNldCgxLjBmLCAxLjBmKTsKKyAgICAgIFJSZWN0QXR0cmlidXRlcyBycmVjdF9vdXRlcls0XTsKKyAgICAgIEdldFJSZWN0QXR0cmlidXRlcyhvdXRlcl9yZWN0LCBiYXNlX3JlY3QsICpiYXNlX2Nvcm5lcnMsIHJyZWN0X291dGVyKTsKKyAgICAgIC8vIEluc2V0IHRoZSBzcHJlYWQgcmVjdCBieSB0aGUgYmx1ciBleHRlbnQuIFVzZSB0aGF0IGFzIHRoZSBpbm5lciBib3VuZHMuCisgICAgICBSUmVjdEF0dHJpYnV0ZXMgcnJlY3RfaW5uZXJbOF07CisgICAgICBtYXRoOjpSZWN0RiBpbm5lcl9yZWN0KHNwcmVhZF9yZWN0Xyk7CisgICAgICBpbm5lcl9yZWN0Lkluc2V0KGtCbHVyRXh0ZW50SW5QaXhlbHMsIGtCbHVyRXh0ZW50SW5QaXhlbHMpOworICAgICAgaWYgKCFpbm5lcl9yZWN0LklzRW1wdHkoKSkgeworICAgICAgICAvLyBHZXQgdGhlIGlubmVyIGJvdW5kcyBleGNsdWRpbmcgdGhlIGluc2NyaWJlZCByZWN0LgorICAgICAgICByZW5kZXJfdHJlZTo6Um91bmRlZENvcm5lcnMgaW5uZXJfY29ybmVycyA9IHNwcmVhZF9jb3JuZXJzXy0+SW5zZXQoCisgICAgICAgICAgICBrQmx1ckV4dGVudEluUGl4ZWxzLCBrQmx1ckV4dGVudEluUGl4ZWxzLCBrQmx1ckV4dGVudEluUGl4ZWxzLAorICAgICAgICAgICAga0JsdXJFeHRlbnRJblBpeGVscyk7CisgICAgICAgIGlubmVyX2Nvcm5lcnMgPSBpbm5lcl9jb3JuZXJzLk5vcm1hbGl6ZShpbm5lcl9yZWN0KTsKKyAgICAgICAgR2V0UlJlY3RBdHRyaWJ1dGVzKG91dGVyX3JlY3QsIGlubmVyX3JlY3QsIGlubmVyX2Nvcm5lcnMsIHJyZWN0X2lubmVyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRoZSBibHVyIGNvdmVycyBldmVyeXRoaW5nIGluc2lkZSB0aGUgb3V0ZXIgcmVjdC4KKyAgICAgICAgcnJlY3RfaW5uZXJbMF0uYm91bmRzID0gb3V0ZXJfcmVjdDsKKyAgICAgIH0KKyAgICAgIFNldEdlb21ldHJ5KGdyYXBoaWNzX3N0YXRlLCBycmVjdF9vdXRlciwgcnJlY3RfaW5uZXIpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBFeHRlbmQgdGhlIG91dGVyIHJlY3QgdG8gaW5jbHVkZSB0aGUgYmx1ci4KKyAgICAgIG1hdGg6OlJlY3RGIG91dGVyX3JlY3Qoc3ByZWFkX3JlY3RfKTsKKyAgICAgIG91dGVyX3JlY3QuT3V0c2V0KGtCbHVyRXh0ZW50SW5QaXhlbHMsIGtCbHVyRXh0ZW50SW5QaXhlbHMpOworICAgICAgLy8gRXhjbHVkZSB0aGUgaW5zY3JpYmVkIHJlY3Qgb2YgdGhlIGJhc2Ugcm91bmRlZCByZWN0LgorICAgICAgUlJlY3RBdHRyaWJ1dGVzIHJyZWN0WzhdOworICAgICAgR2V0UlJlY3RBdHRyaWJ1dGVzKG91dGVyX3JlY3QsIGJhc2VfcmVjdCwgKmJhc2VfY29ybmVycywgcnJlY3QpOworICAgICAgU2V0R2VvbWV0cnkoZ3JhcGhpY3Nfc3RhdGUsIHJyZWN0KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gSGFuZGxlIGJveCBzaGFkb3cgd2l0aCBzcXVhcmUgY29ybmVycy4KKyAgICBpZiAoaXNfaW5zZXRfKSB7CisgICAgICBtYXRoOjpSZWN0RiBpbm5lcl9yZWN0KHNwcmVhZF9yZWN0Xyk7CisgICAgICBpbm5lcl9yZWN0Lkluc2V0KGtCbHVyRXh0ZW50SW5QaXhlbHMsIGtCbHVyRXh0ZW50SW5QaXhlbHMpOworICAgICAgU2V0R2VvbWV0cnkoZ3JhcGhpY3Nfc3RhdGUsIGlubmVyX3JlY3QsIGJhc2VfcmVjdCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1hdGg6OlJlY3RGIG91dGVyX3JlY3Qoc3ByZWFkX3JlY3RfKTsKKyAgICAgIG91dGVyX3JlY3QuT3V0c2V0KGtCbHVyRXh0ZW50SW5QaXhlbHMsIGtCbHVyRXh0ZW50SW5QaXhlbHMpOworICAgICAgU2V0R2VvbWV0cnkoZ3JhcGhpY3Nfc3RhdGUsIGJhc2VfcmVjdCwgb3V0ZXJfcmVjdCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgRHJhd1JlY3RTaGFkb3dCbHVyOjpTZXRHZW9tZXRyeShHcmFwaGljc1N0YXRlKiBncmFwaGljc19zdGF0ZSwKKyAgICBjb25zdCBtYXRoOjpSZWN0RiYgaW5uZXJfcmVjdCwgY29uc3QgbWF0aDo6UmVjdEYmIG91dGVyX3JlY3QpIHsKKyAgLy8gRXhwcmVzcyBvZmZzZXQgaW4gdGVybXMgb2YgYmx1ciBzaWdtYSBmb3IgdGhlIHNoYWRlci4KKyAgZmxvYXQgb2Zmc2V0X3NjYWxlID0ga0JsdXJEaXN0YW5jZSAvIChrQmx1ckV4dGVudEluU2lnbWFzICogYmx1cl9zaWdtYV8pOworCisgIC8vIFRoZSBzcHJlYWQgcmVjdCBzaG91bGQgYWxzbyBiZSBleHByZXNzZWQgaW4gdGVybXMgb2Ygc2lnbWEuCisgIHNwcmVhZF9yZWN0Xy5TY2FsZShvZmZzZXRfc2NhbGUsIG9mZnNldF9zY2FsZSk7CisKKyAgLy8gVGhlIGJveCBzaGFkb3cgaXMgYSB0cmlhbmdsZSBzdHJpcCBjb3ZlcmluZyB0aGUgYXJlYSBiZXR3ZWVuIG91dGVyIHJlY3QKKyAgLy8gYW5kIGlubmVyIHJlY3QuCisgIGlmIChpbm5lcl9yZWN0LklzRW1wdHkoKSkgeworICAgIGF0dHJpYnV0ZXNfc3F1YXJlXy5yZXNlcnZlKDQpOworICAgIGF0dHJpYnV0ZXNfc3F1YXJlXy5lbXBsYWNlX2JhY2soCisgICAgICAgIG91dGVyX3JlY3QueCgpLCBvdXRlcl9yZWN0LnkoKSwgb2Zmc2V0X3NjYWxlKTsKKyAgICBhdHRyaWJ1dGVzX3NxdWFyZV8uZW1wbGFjZV9iYWNrKAorICAgICAgICBvdXRlcl9yZWN0LnJpZ2h0KCksIG91dGVyX3JlY3QueSgpLCBvZmZzZXRfc2NhbGUpOworICAgIGF0dHJpYnV0ZXNfc3F1YXJlXy5lbXBsYWNlX2JhY2soCisgICAgICAgIG91dGVyX3JlY3QueCgpLCBvdXRlcl9yZWN0LmJvdHRvbSgpLCBvZmZzZXRfc2NhbGUpOworICAgIGF0dHJpYnV0ZXNfc3F1YXJlXy5lbXBsYWNlX2JhY2soCisgICAgICAgIG91dGVyX3JlY3QucmlnaHQoKSwgb3V0ZXJfcmVjdC5ib3R0b20oKSwgb2Zmc2V0X3NjYWxlKTsKKyAgfSBlbHNlIHsKKyAgICBtYXRoOjpSZWN0RiBpbnNpZGVfcmVjdChpbm5lcl9yZWN0KTsKKyAgICBpbnNpZGVfcmVjdC5JbnRlcnNlY3Qob3V0ZXJfcmVjdCk7CisgICAgYXR0cmlidXRlc19zcXVhcmVfLnJlc2VydmUoMTApOworICAgIGF0dHJpYnV0ZXNfc3F1YXJlXy5lbXBsYWNlX2JhY2soCisgICAgICAgIG91dGVyX3JlY3QueCgpLCBvdXRlcl9yZWN0LnkoKSwgb2Zmc2V0X3NjYWxlKTsKKyAgICBhdHRyaWJ1dGVzX3NxdWFyZV8uZW1wbGFjZV9iYWNrKAorICAgICAgICBpbnNpZGVfcmVjdC54KCksIGluc2lkZV9yZWN0LnkoKSwgb2Zmc2V0X3NjYWxlKTsKKyAgICBhdHRyaWJ1dGVzX3NxdWFyZV8uZW1wbGFjZV9iYWNrKAorICAgICAgICBvdXRlcl9yZWN0LnJpZ2h0KCksIG91dGVyX3JlY3QueSgpLCBvZmZzZXRfc2NhbGUpOworICAgIGF0dHJpYnV0ZXNfc3F1YXJlXy5lbXBsYWNlX2JhY2soCisgICAgICAgIGluc2lkZV9yZWN0LnJpZ2h0KCksIGluc2lkZV9yZWN0LnkoKSwgb2Zmc2V0X3NjYWxlKTsKKyAgICBhdHRyaWJ1dGVzX3NxdWFyZV8uZW1wbGFjZV9iYWNrKAorICAgICAgICBvdXRlcl9yZWN0LnJpZ2h0KCksIG91dGVyX3JlY3QuYm90dG9tKCksIG9mZnNldF9zY2FsZSk7CisgICAgYXR0cmlidXRlc19zcXVhcmVfLmVtcGxhY2VfYmFjaygKKyAgICAgICAgaW5zaWRlX3JlY3QucmlnaHQoKSwgaW5zaWRlX3JlY3QuYm90dG9tKCksIG9mZnNldF9zY2FsZSk7CisgICAgYXR0cmlidXRlc19zcXVhcmVfLmVtcGxhY2VfYmFjaygKKyAgICAgICAgb3V0ZXJfcmVjdC54KCksIG91dGVyX3JlY3QuYm90dG9tKCksIG9mZnNldF9zY2FsZSk7CisgICAgYXR0cmlidXRlc19zcXVhcmVfLmVtcGxhY2VfYmFjaygKKyAgICAgICAgaW5zaWRlX3JlY3QueCgpLCBpbnNpZGVfcmVjdC5ib3R0b20oKSwgb2Zmc2V0X3NjYWxlKTsKKyAgICBhdHRyaWJ1dGVzX3NxdWFyZV8uZW1wbGFjZV9iYWNrKAorICAgICAgICBvdXRlcl9yZWN0LngoKSwgb3V0ZXJfcmVjdC55KCksIG9mZnNldF9zY2FsZSk7CisgICAgYXR0cmlidXRlc19zcXVhcmVfLmVtcGxhY2VfYmFjaygKKyAgICAgICAgaW5zaWRlX3JlY3QueCgpLCBpbnNpZGVfcmVjdC55KCksIG9mZnNldF9zY2FsZSk7CisgIH0KKworICBncmFwaGljc19zdGF0ZS0+UmVzZXJ2ZVZlcnRleERhdGEoCisgICAgICBhdHRyaWJ1dGVzX3NxdWFyZV8uc2l6ZSgpICogc2l6ZW9mKGF0dHJpYnV0ZXNfc3F1YXJlX1swXSkpOworfQorCit2b2lkIERyYXdSZWN0U2hhZG93Qmx1cjo6U2V0R2VvbWV0cnkoR3JhcGhpY3NTdGF0ZSogZ3JhcGhpY3Nfc3RhdGUsCisgICAgY29uc3QgUlJlY3RBdHRyaWJ1dGVzICgmcnJlY3QpWzhdKSB7CisgIC8vIFRoZSBzaGFkb3dlZCBhcmVhIGlzIGFscmVhZHkgc3BsaXQgaW50byBxdWFkcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheXNpemUocnJlY3QpOyArK2kpIHsKKyAgICB1aW50MTZfdCB2ZXJ0ID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGF0dHJpYnV0ZXNfcm91bmRfLnNpemUoKSk7CisgICAgY29uc3QgbWF0aDo6UmVjdEYmIGJvdW5kcyA9IHJyZWN0W2ldLmJvdW5kczsKKyAgICBjb25zdCBSQ29ybmVyJiByY29ybmVyID0gcnJlY3RbaV0ucmNvcm5lcjsKKyAgICBhdHRyaWJ1dGVzX3JvdW5kXy5lbXBsYWNlX2JhY2soYm91bmRzLngoKSwgYm91bmRzLnkoKSwgcmNvcm5lcik7CisgICAgYXR0cmlidXRlc19yb3VuZF8uZW1wbGFjZV9iYWNrKGJvdW5kcy5yaWdodCgpLCBib3VuZHMueSgpLCByY29ybmVyKTsKKyAgICBhdHRyaWJ1dGVzX3JvdW5kXy5lbXBsYWNlX2JhY2soYm91bmRzLngoKSwgYm91bmRzLmJvdHRvbSgpLCByY29ybmVyKTsKKyAgICBhdHRyaWJ1dGVzX3JvdW5kXy5lbXBsYWNlX2JhY2soYm91bmRzLnJpZ2h0KCksIGJvdW5kcy5ib3R0b20oKSwgcmNvcm5lcik7CisgICAgaW5kaWNlc18uZW1wbGFjZV9iYWNrKHZlcnQpOworICAgIGluZGljZXNfLmVtcGxhY2VfYmFjayh2ZXJ0ICsgMSk7CisgICAgaW5kaWNlc18uZW1wbGFjZV9iYWNrKHZlcnQgKyAyKTsKKyAgICBpbmRpY2VzXy5lbXBsYWNlX2JhY2sodmVydCArIDEpOworICAgIGluZGljZXNfLmVtcGxhY2VfYmFjayh2ZXJ0ICsgMik7CisgICAgaW5kaWNlc18uZW1wbGFjZV9iYWNrKHZlcnQgKyAzKTsKKyAgfQorCisgIGdyYXBoaWNzX3N0YXRlLT5SZXNlcnZlVmVydGV4RGF0YSgKKyAgICAgIGF0dHJpYnV0ZXNfcm91bmRfLnNpemUoKSAqIHNpemVvZihhdHRyaWJ1dGVzX3JvdW5kX1swXSkpOworICBncmFwaGljc19zdGF0ZS0+UmVzZXJ2ZVZlcnRleEluZGljZXMoaW5kaWNlc18uc2l6ZSgpKTsKK30KKwordm9pZCBEcmF3UmVjdFNoYWRvd0JsdXI6OlNldEdlb21ldHJ5KEdyYXBoaWNzU3RhdGUqIGdyYXBoaWNzX3N0YXRlLAorICAgIGNvbnN0IFJSZWN0QXR0cmlidXRlcyAoJnJyZWN0X291dGVyKVs0XSwKKyAgICBjb25zdCBSUmVjdEF0dHJpYnV0ZXMgKCZycmVjdF9pbm5lcilbOF0pIHsKKyAgLy8gRHJhdyB0aGUgYXJlYSBiZXR3ZWVuIHRoZSBpbm5lciByZWN0IGFuZCBvdXRlciByZWN0IHVzaW5nIHRoZSBvdXRlciByZWN0J3MKKyAgLy8gcm91bmRlZCBjb3JuZXJzLiBUaGUgaW5uZXIgcXVhZHMgYWxyZWFkeSBleGNsdWRlIHRoZSBpbnNjcmliZWQgcmVjdGFuZ2xlLgorICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5c2l6ZShycmVjdF9pbm5lcik7ICsraSkgeworICAgIGZvciAoaW50IG8gPSAwOyBvIDwgYXJyYXlzaXplKHJyZWN0X291dGVyKTsgKytvKSB7CisgICAgICBtYXRoOjpSZWN0RiByZWN0ID0gbWF0aDo6SW50ZXJzZWN0UmVjdHMoCisgICAgICAgICAgcnJlY3RfaW5uZXJbaV0uYm91bmRzLCBycmVjdF9vdXRlcltvXS5ib3VuZHMpOworICAgICAgaWYgKCFyZWN0LklzRW1wdHkoKSkgeworICAgICAgICAvLyBVc2UgdHdvIHRyaWFuZ2xlcyB0byBkcmF3IHRoZSBpbnRlcnNlY3Rpb24uCisgICAgICAgIGNvbnN0IFJDb3JuZXImIHJjb3JuZXIgPSBycmVjdF9vdXRlcltvXS5yY29ybmVyOworICAgICAgICB1aW50MTZfdCB2ZXJ0ID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGF0dHJpYnV0ZXNfcm91bmRfLnNpemUoKSk7CisgICAgICAgIGF0dHJpYnV0ZXNfcm91bmRfLmVtcGxhY2VfYmFjayhyZWN0LngoKSwgcmVjdC55KCksIHJjb3JuZXIpOworICAgICAgICBhdHRyaWJ1dGVzX3JvdW5kXy5lbXBsYWNlX2JhY2socmVjdC5yaWdodCgpLCByZWN0LnkoKSwgcmNvcm5lcik7CisgICAgICAgIGF0dHJpYnV0ZXNfcm91bmRfLmVtcGxhY2VfYmFjayhyZWN0LngoKSwgcmVjdC5ib3R0b20oKSwgcmNvcm5lcik7CisgICAgICAgIGF0dHJpYnV0ZXNfcm91bmRfLmVtcGxhY2VfYmFjayhyZWN0LnJpZ2h0KCksIHJlY3QuYm90dG9tKCksIHJjb3JuZXIpOworICAgICAgICBpbmRpY2VzXy5lbXBsYWNlX2JhY2sodmVydCk7CisgICAgICAgIGluZGljZXNfLmVtcGxhY2VfYmFjayh2ZXJ0ICsgMSk7CisgICAgICAgIGluZGljZXNfLmVtcGxhY2VfYmFjayh2ZXJ0ICsgMik7CisgICAgICAgIGluZGljZXNfLmVtcGxhY2VfYmFjayh2ZXJ0ICsgMSk7CisgICAgICAgIGluZGljZXNfLmVtcGxhY2VfYmFjayh2ZXJ0ICsgMik7CisgICAgICAgIGluZGljZXNfLmVtcGxhY2VfYmFjayh2ZXJ0ICsgMyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZ3JhcGhpY3Nfc3RhdGUtPlJlc2VydmVWZXJ0ZXhEYXRhKAorICAgICAgYXR0cmlidXRlc19yb3VuZF8uc2l6ZSgpICogc2l6ZW9mKGF0dHJpYnV0ZXNfcm91bmRfWzBdKSk7CisgIGdyYXBoaWNzX3N0YXRlLT5SZXNlcnZlVmVydGV4SW5kaWNlcyhpbmRpY2VzXy5zaXplKCkpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgZWdsCiB9ICAvLyBuYW1lc3BhY2UgcmFzdGVyaXplcgogfSAgLy8gbmFtZXNwYWNlIHJlbmRlcmVyCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2RyYXdfcmVjdF9zaGFkb3dfYmx1ci5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9kcmF3X3JlY3Rfc2hhZG93X2JsdXIuaAppbmRleCA4ZDM2NzIyLi4xMDdhZjg1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2RyYXdfcmVjdF9zaGFkb3dfYmx1ci5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19yZWN0X3NoYWRvd19ibHVyLmgKQEAgLTE1LDcgKzE1LDEyIEBACiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX0VHTF9EUkFXX1JFQ1RfU0hBRE9XX0JMVVJfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfRUdMX0RSQVdfUkVDVF9TSEFET1dfQkxVUl9IXwogCi0jaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2RyYXdfcmVjdF9zaGFkb3dfc3ByZWFkLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29iYWx0L21hdGgvcmVjdF9mLmgiCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcl90cmVlL2NvbG9yX3JnYmEuaCIKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19vYmplY3QuaCIKKyNpbmNsdWRlICJlZ2wvZ2VuZXJhdGVkX3NoYWRlcl9pbXBsLmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIHJlbmRlcmVyIHsKQEAgLTQwLDEyICs0NSw3IEBACiAKIC8vIEhhbmRsZXMgZHJhd2luZyBhIGJveCBzaGFkb3cgd2l0aCBibHVyLiBUaGlzIHVzZXMgYSBnYXVzc2lhbiBrZXJuZWwgdG8gZmFkZQogLy8gdGhlICJibHVyIiByZWdpb24uCi0vLwotLy8gVGhpcyB1c2VzIGEgc2hhZGVyIHRvIG1pbWljIHNraWEncyBTa0JsdXJNYXNrLmNwcC4KLS8vIFNlZSBhbHNvIGh0dHA6Ly9zdGVyZW9wc2lzLmNvbS9zaGFkb3dyZWN0LyBhcyByZWZlcmVuY2UgZm9yIHRoZSBmb3JtdWxhCi0vLyB1c2VkIHRvIGFwcHJveGltYXRlIHRoZSBnYXVzc2lhbiBpbnRlZ3JhbCAod2hpY2ggY29udHJvbHMgdGhlIG9wYWNpdHkgb2YKLS8vIHRoZSBzaGFkb3cpLgotY2xhc3MgRHJhd1JlY3RTaGFkb3dCbHVyIDogcHVibGljIERyYXdSZWN0U2hhZG93U3ByZWFkIHsKK2NsYXNzIERyYXdSZWN0U2hhZG93Qmx1ciA6IHB1YmxpYyBEcmF3T2JqZWN0IHsKICBwdWJsaWM6CiAgIC8vIERyYXcgYSBibHVycmVkIGJveCBzaGFkb3cuCiAgIC8vIFRoZSBib3ggc2hhZG93IGV4aXN0cyBpbiB0aGUgYXJlYSBiZXR3ZWVuIHxiYXNlX3JlY3R8IGFuZCB8c3ByZWFkX3JlY3R8CkBAIC01OSwxNiArNTksNTUgQEAKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbmRlcl90cmVlOjpDb2xvclJHQkEmIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYmx1cl9zaWdtYSwgYm9vbCBpbnNldCk7CiAKKyAgdm9pZCBFeGVjdXRlVXBkYXRlVmVydGV4QnVmZmVyKEdyYXBoaWNzU3RhdGUqIGdyYXBoaWNzX3N0YXRlLAorICAgICAgU2hhZGVyUHJvZ3JhbU1hbmFnZXIqIHByb2dyYW1fbWFuYWdlcikgT1ZFUlJJREU7CiAgIHZvaWQgRXhlY3V0ZVJhc3Rlcml6ZShHcmFwaGljc1N0YXRlKiBncmFwaGljc19zdGF0ZSwKICAgICAgIFNoYWRlclByb2dyYW1NYW5hZ2VyKiBwcm9ncmFtX21hbmFnZXIpIE9WRVJSSURFOwogICBiYXNlOjpUeXBlSWQgR2V0VHlwZUlkKCkgY29uc3QgT1ZFUlJJREU7CiAKICBwcml2YXRlOgorICBzdHJ1Y3QgVmVydGV4QXR0cmlidXRlc1NxdWFyZSB7CisgICAgVmVydGV4QXR0cmlidXRlc1NxdWFyZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCBvZmZzZXRfc2NhbGUpOworICAgIGZsb2F0IHBvc2l0aW9uWzJdOworICAgIGZsb2F0IG9mZnNldFsyXTsKKyAgfTsKKworICBzdHJ1Y3QgVmVydGV4QXR0cmlidXRlc1JvdW5kIHsKKyAgICBWZXJ0ZXhBdHRyaWJ1dGVzUm91bmQoZmxvYXQgeCwgZmxvYXQgeSwgY29uc3QgUkNvcm5lciYgaW5pdCk7CisgICAgZmxvYXQgcG9zaXRpb25bMl07CisgICAgUkNvcm5lciByY29ybmVyX3NjaXNzb3I7CisgIH07CisKKyAgdm9pZCBTZXR1cFZlcnRleFNoYWRlcihHcmFwaGljc1N0YXRlKiBncmFwaGljc19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTaGFkZXJWZXJ0ZXhPZmZzZXQmIHNoYWRlcik7CisgIHZvaWQgU2V0dXBWZXJ0ZXhTaGFkZXIoR3JhcGhpY3NTdGF0ZSogZ3JhcGhpY3Nfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2hhZGVyVmVydGV4T2Zmc2V0UmNvcm5lciYgc2hhZGVyKTsKKyAgdm9pZCBTZXRGcmFnbWVudFVuaWZvcm1zKEdMaW50IGNvbG9yX3VuaWZvcm0sIEdMaW50IHNjYWxlX2FkZF91bmlmb3JtKTsKKworICB2b2lkIFNldEdlb21ldHJ5KEdyYXBoaWNzU3RhdGUqIGdyYXBoaWNzX3N0YXRlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGg6OlJlY3RGJiBiYXNlX3JlY3QsCisgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9uYWxSb3VuZGVkQ29ybmVycyYgYmFzZV9jb3JuZXJzKTsKKyAgdm9pZCBTZXRHZW9tZXRyeShHcmFwaGljc1N0YXRlKiBncmFwaGljc19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRoOjpSZWN0RiYgaW5uZXJfcmVjdCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRoOjpSZWN0RiYgb3V0ZXJfcmVjdCk7CisgIHZvaWQgU2V0R2VvbWV0cnkoR3JhcGhpY3NTdGF0ZSogZ3JhcGhpY3Nfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUlJlY3RBdHRyaWJ1dGVzICgmcnJlY3QpWzhdKTsKKyAgdm9pZCBTZXRHZW9tZXRyeShHcmFwaGljc1N0YXRlKiBncmFwaGljc19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBSUmVjdEF0dHJpYnV0ZXMgKCZycmVjdF9vdXRlcilbNF0sCisgICAgICAgICAgICAgICAgICAgY29uc3QgUlJlY3RBdHRyaWJ1dGVzICgmcnJlY3RfaW5uZXIpWzhdKTsKKwogICBtYXRoOjpSZWN0RiBzcHJlYWRfcmVjdF87CiAgIE9wdGlvbmFsUm91bmRlZENvcm5lcnMgc3ByZWFkX2Nvcm5lcnNfOwotCisgIHJlbmRlcl90cmVlOjpDb2xvclJHQkEgY29sb3JfOwogICBmbG9hdCBibHVyX3NpZ21hXzsKICAgYm9vbCBpc19pbnNldF87CisKKyAgc3RkOjp2ZWN0b3I8VmVydGV4QXR0cmlidXRlc1NxdWFyZT4gYXR0cmlidXRlc19zcXVhcmVfOworICBzdGQ6OnZlY3RvcjxWZXJ0ZXhBdHRyaWJ1dGVzUm91bmQ+IGF0dHJpYnV0ZXNfcm91bmRfOworICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gaW5kaWNlc187CisKKyAgdWludDhfdCogdmVydGV4X2J1ZmZlcl87CisgIHVpbnQxNl90KiBpbmRleF9idWZmZXJfOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGVnbApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9kcmF3X3JlY3Rfc2hhZG93X3NwcmVhZC5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19yZWN0X3NoYWRvd19zcHJlYWQuY2MKaW5kZXggOWRiYTBkMy4uZmFhNzI4NiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9kcmF3X3JlY3Rfc2hhZG93X3NwcmVhZC5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2RyYXdfcmVjdF9zaGFkb3dfc3ByZWFkLmNjCkBAIC0yNiw4ICsyNiwxOSBAQAogbmFtZXNwYWNlIHJhc3Rlcml6ZXIgewogbmFtZXNwYWNlIGVnbCB7CiAKLW5hbWVzcGFjZSB7Ci1jb25zdCBpbnQga1ZlcnRleENvdW50ID0gMTA7CitEcmF3UmVjdFNoYWRvd1NwcmVhZDo6VmVydGV4QXR0cmlidXRlc1NxdWFyZTo6VmVydGV4QXR0cmlidXRlc1NxdWFyZSgKKyAgICBmbG9hdCB4LCBmbG9hdCB5LCB1aW50MzJfdCBpbl9jb2xvcikgeworICBwb3NpdGlvblswXSA9IHg7CisgIHBvc2l0aW9uWzFdID0geTsKKyAgY29sb3IgPSBpbl9jb2xvcjsKK30KKworRHJhd1JlY3RTaGFkb3dTcHJlYWQ6OlZlcnRleEF0dHJpYnV0ZXNSb3VuZDo6VmVydGV4QXR0cmlidXRlc1JvdW5kKAorICAgIGZsb2F0IHgsIGZsb2F0IHksIGNvbnN0IFJDb3JuZXImIGlubmVyLCBjb25zdCBSQ29ybmVyJiBvdXRlcikgeworICBwb3NpdGlvblswXSA9IHg7CisgIHBvc2l0aW9uWzFdID0geTsKKyAgcmNvcm5lcl9pbm5lciA9IFJDb3JuZXIocG9zaXRpb24sIGlubmVyKTsKKyAgcmNvcm5lcl9vdXRlciA9IFJDb3JuZXIocG9zaXRpb24sIG91dGVyKTsKIH0KIAogRHJhd1JlY3RTaGFkb3dTcHJlYWQ6OkRyYXdSZWN0U2hhZG93U3ByZWFkKEdyYXBoaWNzU3RhdGUqIGdyYXBoaWNzX3N0YXRlLApAQCAtMzYsMTIxICs0Nyw5NCBAQAogICAgIGNvbnN0IE9wdGlvbmFsUm91bmRlZENvcm5lcnMmIG91dGVyX2Nvcm5lcnMsCiAgICAgY29uc3QgcmVuZGVyX3RyZWU6OkNvbG9yUkdCQSYgY29sb3IpCiAgICAgOiBEcmF3T2JqZWN0KGJhc2Vfc3RhdGUpLAotICAgICAgaW5uZXJfcmVjdF8oaW5uZXJfcmVjdCksCi0gICAgICBvdXRlcl9yZWN0XyhvdXRlcl9yZWN0KSwKLSAgICAgIGlubmVyX2Nvcm5lcnNfKGlubmVyX2Nvcm5lcnMpLAotICAgICAgb3V0ZXJfY29ybmVyc18ob3V0ZXJfY29ybmVycyksCi0gICAgICBvZmZzZXRfc2NhbGVfKDEuMGYpLAogICAgICAgdmVydGV4X2J1ZmZlcl8obnVsbHB0ciksCi0gICAgICB2ZXJ0ZXhfY291bnRfKDApIHsKLSAgY29sb3JfID0gR2V0R0xSR0JBKEdldERyYXdDb2xvcihjb2xvcikgKiBiYXNlX3N0YXRlXy5vcGFjaXR5KTsKLSAgaWYgKGlubmVyX2Nvcm5lcnNfIHx8IG91dGVyX2Nvcm5lcnNfKSB7CisgICAgICBpbmRleF9idWZmZXJfKG51bGxwdHIpIHsKKyAgY29sb3JfID0gR2V0RHJhd0NvbG9yKGNvbG9yKSAqIGJhc2Vfc3RhdGVfLm9wYWNpdHk7CisKKyAgLy8gRXh0cmFjdCBzY2FsZSBmcm9tIHRoZSB0cmFuc2Zvcm0gYW5kIG1vdmUgaXQgaW50byB0aGUgdmVydGV4IGF0dHJpYnV0ZXMKKyAgLy8gc28gdGhhdCB0aGUgYW50aS1hbGlhc2VkIGVkZ2VzIHJlbWFpbiAxIHBpeGVsIHdpZGUuCisgIG1hdGg6OlZlY3RvcjJkRiBzY2FsZSA9IFJlbW92ZVNjYWxlRnJvbVRyYW5zZm9ybSgpOworICBtYXRoOjpSZWN0RiBpbnNpZGVfcmVjdChpbm5lcl9yZWN0KTsKKyAgbWF0aDo6UmVjdEYgb3V0c2lkZV9yZWN0KG91dGVyX3JlY3QpOworICBpbnNpZGVfcmVjdC5TY2FsZShzY2FsZS54KCksIHNjYWxlLnkoKSk7CisgIG91dHNpZGVfcmVjdC5TY2FsZShzY2FsZS54KCksIHNjYWxlLnkoKSk7CisKKyAgaWYgKGlubmVyX2Nvcm5lcnMgfHwgb3V0ZXJfY29ybmVycykgewogICAgIC8vIElmIHVzaW5nIHJvdW5kZWQgY29ybmVycywgdGhlbiBib3RoIGlubmVyIGFuZCBvdXRlciByZWN0cyBtdXN0IGhhdmUKICAgICAvLyByb3VuZGVkIGNvcm5lciBkZWZpbml0aW9ucy4KLSAgICBEQ0hFQ0soaW5uZXJfY29ybmVyc18pOwotICAgIERDSEVDSyhvdXRlcl9jb3JuZXJzXyk7CisgICAgRENIRUNLKGlubmVyX2Nvcm5lcnMpOworICAgIERDSEVDSyhvdXRlcl9jb3JuZXJzKTsKKyAgICByZW5kZXJfdHJlZTo6Um91bmRlZENvcm5lcnMgaW5zaWRlX2Nvcm5lcnMgPQorICAgICAgICBpbm5lcl9jb3JuZXJzLT5TY2FsZShzY2FsZS54KCksIHNjYWxlLnkoKSk7CisgICAgcmVuZGVyX3RyZWU6OlJvdW5kZWRDb3JuZXJzIG91dHNpZGVfY29ybmVycyA9CisgICAgICAgIG91dGVyX2Nvcm5lcnMtPlNjYWxlKHNjYWxlLngoKSwgc2NhbGUueSgpKTsKKyAgICBTZXRHZW9tZXRyeShncmFwaGljc19zdGF0ZSwKKyAgICAgICAgICAgICAgICBpbnNpZGVfcmVjdCwgaW5zaWRlX2Nvcm5lcnMsCisgICAgICAgICAgICAgICAgb3V0c2lkZV9yZWN0LCBvdXRzaWRlX2Nvcm5lcnMpOworICB9IGVsc2UgeworICAgIFNldEdlb21ldHJ5KGdyYXBoaWNzX3N0YXRlLCBpbnNpZGVfcmVjdCwgb3V0c2lkZV9yZWN0KTsKICAgfQotICBncmFwaGljc19zdGF0ZS0+UmVzZXJ2ZVZlcnRleERhdGEoa1ZlcnRleENvdW50ICogc2l6ZW9mKFZlcnRleEF0dHJpYnV0ZXMpKTsKLX0KLQotRHJhd1JlY3RTaGFkb3dTcHJlYWQ6OkRyYXdSZWN0U2hhZG93U3ByZWFkKEdyYXBoaWNzU3RhdGUqIGdyYXBoaWNzX3N0YXRlLAotICAgIGNvbnN0IEJhc2VTdGF0ZSYgYmFzZV9zdGF0ZSkKLSAgICA6IERyYXdPYmplY3QoYmFzZV9zdGF0ZSksCi0gICAgICBvZmZzZXRfc2NhbGVfKDEuMGYpLAotICAgICAgdmVydGV4X2J1ZmZlcl8obnVsbHB0ciksCi0gICAgICB2ZXJ0ZXhfY291bnRfKDApIHsKLSAgZ3JhcGhpY3Nfc3RhdGUtPlJlc2VydmVWZXJ0ZXhEYXRhKGtWZXJ0ZXhDb3VudCAqIHNpemVvZihWZXJ0ZXhBdHRyaWJ1dGVzKSk7CiB9CiAKIHZvaWQgRHJhd1JlY3RTaGFkb3dTcHJlYWQ6OkV4ZWN1dGVVcGRhdGVWZXJ0ZXhCdWZmZXIoCiAgICAgR3JhcGhpY3NTdGF0ZSogZ3JhcGhpY3Nfc3RhdGUsCiAgICAgU2hhZGVyUHJvZ3JhbU1hbmFnZXIqIHByb2dyYW1fbWFuYWdlcikgewotICAvLyBEcmF3IHRoZSBib3ggc2hhZG93J3Mgc3ByZWFkLiBUaGlzIGlzIGEgdHJpYW5nbGUgc3RyaXAgY292ZXJpbmcgdGhlIGFyZWEKLSAgLy8gYmV0d2VlbiBvdXRlciByZWN0IGFuZCBpbm5lciByZWN0LgotICBtYXRoOjpSZWN0RiBpbnNpZGVfcmVjdChpbm5lcl9yZWN0Xyk7Ci0gIG1hdGg6OlJlY3RGIG91dHNpZGVfcmVjdChvdXRlcl9yZWN0Xyk7Ci0gIFZlcnRleEF0dHJpYnV0ZXMgYXR0cmlidXRlc1trVmVydGV4Q291bnRdOwotCi0gIGlmIChpbm5lcl9jb3JuZXJzXykgewotICAgIC8vIEluc2V0IHRoZSBpbnNpZGUgcmVjdCB0byBpbmNsdWRlIHRoZSByb3VuZGVkIGNvcm5lcnMuCi0gICAgaW5zaWRlX3JlY3QuSW5zZXQoCi0gICAgICAgIHN0ZDo6bWF4KGlubmVyX2Nvcm5lcnNfLT5ib3R0b21fbGVmdC5ob3Jpem9udGFsLAotICAgICAgICAgICAgICAgICBpbm5lcl9jb3JuZXJzXy0+dG9wX2xlZnQuaG9yaXpvbnRhbCksCi0gICAgICAgIHN0ZDo6bWF4KGlubmVyX2Nvcm5lcnNfLT50b3BfbGVmdC52ZXJ0aWNhbCwKLSAgICAgICAgICAgICAgICAgaW5uZXJfY29ybmVyc18tPnRvcF9yaWdodC52ZXJ0aWNhbCksCi0gICAgICAgIHN0ZDo6bWF4KGlubmVyX2Nvcm5lcnNfLT50b3BfcmlnaHQuaG9yaXpvbnRhbCwKLSAgICAgICAgICAgICAgICAgaW5uZXJfY29ybmVyc18tPmJvdHRvbV9yaWdodC5ob3Jpem9udGFsKSwKLSAgICAgICAgc3RkOjptYXgoaW5uZXJfY29ybmVyc18tPmJvdHRvbV9yaWdodC52ZXJ0aWNhbCwKLSAgICAgICAgICAgICAgICAgaW5uZXJfY29ybmVyc18tPmJvdHRvbV9sZWZ0LnZlcnRpY2FsKSk7Ci0KLSAgICAvLyBBZGQgYSAxIHBpeGVsIGJvcmRlciB0byB0aGUgb3V0ZXIgcmVjdCBmb3IgYW50aS1hbGlhc2luZy4KLSAgICBvdXRzaWRlX3JlY3QuT3V0c2V0KDEuMGYsIDEuMGYpOworICBpZiAoYXR0cmlidXRlc19zcXVhcmVfLnNpemUoKSA+IDApIHsKKyAgICB2ZXJ0ZXhfYnVmZmVyXyA9IGdyYXBoaWNzX3N0YXRlLT5BbGxvY2F0ZVZlcnRleERhdGEoCisgICAgICAgIGF0dHJpYnV0ZXNfc3F1YXJlXy5zaXplKCkgKiBzaXplb2YoYXR0cmlidXRlc19zcXVhcmVfWzBdKSk7CisgICAgU2JNZW1vcnlDb3B5KHZlcnRleF9idWZmZXJfLCAmYXR0cmlidXRlc19zcXVhcmVfWzBdLAorICAgICAgICBhdHRyaWJ1dGVzX3NxdWFyZV8uc2l6ZSgpICogc2l6ZW9mKGF0dHJpYnV0ZXNfc3F1YXJlX1swXSkpOworICB9IGVsc2UgaWYgKGF0dHJpYnV0ZXNfcm91bmRfLnNpemUoKSA+IDApIHsKKyAgICB2ZXJ0ZXhfYnVmZmVyXyA9IGdyYXBoaWNzX3N0YXRlLT5BbGxvY2F0ZVZlcnRleERhdGEoCisgICAgICAgIGF0dHJpYnV0ZXNfcm91bmRfLnNpemUoKSAqIHNpemVvZihhdHRyaWJ1dGVzX3JvdW5kX1swXSkpOworICAgIFNiTWVtb3J5Q29weSh2ZXJ0ZXhfYnVmZmVyXywgJmF0dHJpYnV0ZXNfcm91bmRfWzBdLAorICAgICAgICBhdHRyaWJ1dGVzX3JvdW5kXy5zaXplKCkgKiBzaXplb2YoYXR0cmlidXRlc19yb3VuZF9bMF0pKTsKKyAgICBpbmRleF9idWZmZXJfID0gZ3JhcGhpY3Nfc3RhdGUtPkFsbG9jYXRlVmVydGV4SW5kaWNlcyhpbmRpY2VzXy5zaXplKCkpOworICAgIFNiTWVtb3J5Q29weShpbmRleF9idWZmZXJfLCAmaW5kaWNlc19bMF0sCisgICAgICAgIGluZGljZXNfLnNpemUoKSAqIHNpemVvZihpbmRpY2VzX1swXSkpOwogICB9Ci0KLSAgLy8gT25seSBwaXhlbHMgaW5zaWRlIHRoZSBvdXRlciByZWN0IHNob3VsZCBiZSB0b3VjaGVkLgotICBpZiAoaW5zaWRlX3JlY3QuSXNFbXB0eSgpKSB7Ci0gICAgdmVydGV4X2NvdW50XyA9IDQ7Ci0gICAgU2V0VmVydGV4KCZhdHRyaWJ1dGVzWzBdLCBvdXRzaWRlX3JlY3QueCgpLCBvdXRzaWRlX3JlY3QueSgpKTsKLSAgICBTZXRWZXJ0ZXgoJmF0dHJpYnV0ZXNbMV0sIG91dHNpZGVfcmVjdC5yaWdodCgpLCBvdXRzaWRlX3JlY3QueSgpKTsKLSAgICBTZXRWZXJ0ZXgoJmF0dHJpYnV0ZXNbMl0sIG91dHNpZGVfcmVjdC54KCksIG91dHNpZGVfcmVjdC5ib3R0b20oKSk7Ci0gICAgU2V0VmVydGV4KCZhdHRyaWJ1dGVzWzNdLCBvdXRzaWRlX3JlY3QucmlnaHQoKSwgb3V0c2lkZV9yZWN0LmJvdHRvbSgpKTsKLSAgfSBlbHNlIHsKLSAgICBpbnNpZGVfcmVjdC5JbnRlcnNlY3Qob3V0c2lkZV9yZWN0KTsKLSAgICB2ZXJ0ZXhfY291bnRfID0gMTA7Ci0gICAgU2V0VmVydGV4KCZhdHRyaWJ1dGVzWzBdLCBvdXRzaWRlX3JlY3QueCgpLCBvdXRzaWRlX3JlY3QueSgpKTsKLSAgICBTZXRWZXJ0ZXgoJmF0dHJpYnV0ZXNbMV0sIGluc2lkZV9yZWN0LngoKSwgaW5zaWRlX3JlY3QueSgpKTsKLSAgICBTZXRWZXJ0ZXgoJmF0dHJpYnV0ZXNbMl0sIG91dHNpZGVfcmVjdC5yaWdodCgpLCBvdXRzaWRlX3JlY3QueSgpKTsKLSAgICBTZXRWZXJ0ZXgoJmF0dHJpYnV0ZXNbM10sIGluc2lkZV9yZWN0LnJpZ2h0KCksIGluc2lkZV9yZWN0LnkoKSk7Ci0gICAgU2V0VmVydGV4KCZhdHRyaWJ1dGVzWzRdLCBvdXRzaWRlX3JlY3QucmlnaHQoKSwgb3V0c2lkZV9yZWN0LmJvdHRvbSgpKTsKLSAgICBTZXRWZXJ0ZXgoJmF0dHJpYnV0ZXNbNV0sIGluc2lkZV9yZWN0LnJpZ2h0KCksIGluc2lkZV9yZWN0LmJvdHRvbSgpKTsKLSAgICBTZXRWZXJ0ZXgoJmF0dHJpYnV0ZXNbNl0sIG91dHNpZGVfcmVjdC54KCksIG91dHNpZGVfcmVjdC5ib3R0b20oKSk7Ci0gICAgU2V0VmVydGV4KCZhdHRyaWJ1dGVzWzddLCBpbnNpZGVfcmVjdC54KCksIGluc2lkZV9yZWN0LmJvdHRvbSgpKTsKLSAgICBTZXRWZXJ0ZXgoJmF0dHJpYnV0ZXNbOF0sIG91dHNpZGVfcmVjdC54KCksIG91dHNpZGVfcmVjdC55KCkpOwotICAgIFNldFZlcnRleCgmYXR0cmlidXRlc1s5XSwgaW5zaWRlX3JlY3QueCgpLCBpbnNpZGVfcmVjdC55KCkpOwotICB9Ci0KLSAgdmVydGV4X2J1ZmZlcl8gPSBncmFwaGljc19zdGF0ZS0+QWxsb2NhdGVWZXJ0ZXhEYXRhKAotICAgICAgdmVydGV4X2NvdW50XyAqIHNpemVvZihWZXJ0ZXhBdHRyaWJ1dGVzKSk7Ci0gIFNiTWVtb3J5Q29weSh2ZXJ0ZXhfYnVmZmVyXywgYXR0cmlidXRlcywKLSAgICAgIHZlcnRleF9jb3VudF8gKiBzaXplb2YoVmVydGV4QXR0cmlidXRlcykpOwogfQogCiB2b2lkIERyYXdSZWN0U2hhZG93U3ByZWFkOjpFeGVjdXRlUmFzdGVyaXplKAogICAgIEdyYXBoaWNzU3RhdGUqIGdyYXBoaWNzX3N0YXRlLAogICAgIFNoYWRlclByb2dyYW1NYW5hZ2VyKiBwcm9ncmFtX21hbmFnZXIpIHsKLSAgaWYgKGlubmVyX2Nvcm5lcnNfKSB7Ci0gICAgU2hhZGVyUHJvZ3JhbTxDb21tb25WZXJ0ZXhTaGFkZXIsCi0gICAgICAgICAgICAgICAgICBTaGFkZXJGcmFnbWVudENvbG9yQmV0d2VlblJyZWN0cz4qIHByb2dyYW07Ci0gICAgcHJvZ3JhbV9tYW5hZ2VyLT5HZXRQcm9ncmFtKCZwcm9ncmFtKTsKLSAgICBncmFwaGljc19zdGF0ZS0+VXNlUHJvZ3JhbShwcm9ncmFtLT5HZXRIYW5kbGUoKSk7Ci0gICAgU2V0dXBTaGFkZXIocHJvZ3JhbS0+R2V0VmVydGV4U2hhZGVyKCksIGdyYXBoaWNzX3N0YXRlKTsKLQotICAgIFNldFJSZWN0VW5pZm9ybXMocHJvZ3JhbS0+R2V0RnJhZ21lbnRTaGFkZXIoKS51X2lubmVyX3JlY3QoKSwKLSAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0tPkdldEZyYWdtZW50U2hhZGVyKCkudV9pbm5lcl9jb3JuZXJzKCksCi0gICAgICAgICAgICAgICAgICAgICBpbm5lcl9yZWN0XywgKmlubmVyX2Nvcm5lcnNfLCAwLjVmKTsKLSAgICBTZXRSUmVjdFVuaWZvcm1zKHByb2dyYW0tPkdldEZyYWdtZW50U2hhZGVyKCkudV9vdXRlcl9yZWN0KCksCi0gICAgICAgICAgICAgICAgICAgICBwcm9ncmFtLT5HZXRGcmFnbWVudFNoYWRlcigpLnVfb3V0ZXJfY29ybmVycygpLAotICAgICAgICAgICAgICAgICAgICAgb3V0ZXJfcmVjdF8sICpvdXRlcl9jb3JuZXJzXywgMC41Zik7Ci0gIH0gZWxzZSB7Ci0gICAgU2hhZGVyUHJvZ3JhbTxDb21tb25WZXJ0ZXhTaGFkZXIsIFNoYWRlckZyYWdtZW50Q29sb3JJbmNsdWRlPiogcHJvZ3JhbTsKLSAgICBwcm9ncmFtX21hbmFnZXItPkdldFByb2dyYW0oJnByb2dyYW0pOwotICAgIGdyYXBoaWNzX3N0YXRlLT5Vc2VQcm9ncmFtKHByb2dyYW0tPkdldEhhbmRsZSgpKTsKLSAgICBTZXR1cFNoYWRlcihwcm9ncmFtLT5HZXRWZXJ0ZXhTaGFkZXIoKSwgZ3JhcGhpY3Nfc3RhdGUpOwotCi0gICAgZmxvYXQgaW5jbHVkZVs0XSA9IHsKLSAgICAgIG91dGVyX3JlY3RfLngoKSwKLSAgICAgIG91dGVyX3JlY3RfLnkoKSwKLSAgICAgIG91dGVyX3JlY3RfLnJpZ2h0KCksCi0gICAgICBvdXRlcl9yZWN0Xy5ib3R0b20oKQotICAgIH07Ci0gICAgR0xfQ0FMTChnbFVuaWZvcm00ZnYocHJvZ3JhbS0+R2V0RnJhZ21lbnRTaGFkZXIoKS51X2luY2x1ZGUoKSwgMSwgaW5jbHVkZSkpOworICBpZiAodmVydGV4X2J1ZmZlcl8gPT0gbnVsbHB0cikgeworICAgIHJldHVybjsKICAgfQogCi0gIEdMX0NBTEwoZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX1NUUklQLCAwLCB2ZXJ0ZXhfY291bnRfKSk7CisgIC8vIERyYXcgdGhlIGJveCBzaGFkb3cuCisgIGlmIChhdHRyaWJ1dGVzX3NxdWFyZV8uc2l6ZSgpID4gMCkgeworICAgIFNoYWRlclByb2dyYW08U2hhZGVyVmVydGV4Q29sb3IsCisgICAgICAgICAgICAgICAgICBTaGFkZXJGcmFnbWVudENvbG9yPiogcHJvZ3JhbTsKKyAgICBwcm9ncmFtX21hbmFnZXItPkdldFByb2dyYW0oJnByb2dyYW0pOworICAgIGdyYXBoaWNzX3N0YXRlLT5Vc2VQcm9ncmFtKHByb2dyYW0tPkdldEhhbmRsZSgpKTsKKyAgICBTZXR1cFZlcnRleFNoYWRlcihncmFwaGljc19zdGF0ZSwgcHJvZ3JhbS0+R2V0VmVydGV4U2hhZGVyKCkpOworICAgIEdMX0NBTEwoZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX1NUUklQLCAwLCBhdHRyaWJ1dGVzX3NxdWFyZV8uc2l6ZSgpKSk7CisgIH0gZWxzZSB7CisgICAgU2hhZGVyUHJvZ3JhbTxTaGFkZXJWZXJ0ZXhSY29ybmVyMiwKKyAgICAgICAgICAgICAgICAgIFNoYWRlckZyYWdtZW50UmNvcm5lcjJDb2xvcj4qIHByb2dyYW07CisgICAgcHJvZ3JhbV9tYW5hZ2VyLT5HZXRQcm9ncmFtKCZwcm9ncmFtKTsKKyAgICBncmFwaGljc19zdGF0ZS0+VXNlUHJvZ3JhbShwcm9ncmFtLT5HZXRIYW5kbGUoKSk7CisgICAgU2V0dXBWZXJ0ZXhTaGFkZXIoZ3JhcGhpY3Nfc3RhdGUsIHByb2dyYW0tPkdldFZlcnRleFNoYWRlcigpKTsKKyAgICBHTF9DQUxMKGdsVW5pZm9ybTRmKHByb2dyYW0tPkdldEZyYWdtZW50U2hhZGVyKCkudV9jb2xvcigpLAorICAgICAgICBjb2xvcl8ucigpLCBjb2xvcl8uZygpLCBjb2xvcl8uYigpLCBjb2xvcl8uYSgpKSk7CisgICAgR0xfQ0FMTChnbERyYXdFbGVtZW50cyhHTF9UUklBTkdMRVMsIGluZGljZXNfLnNpemUoKSwgR0xfVU5TSUdORURfU0hPUlQsCisgICAgICAgIGdyYXBoaWNzX3N0YXRlLT5HZXRWZXJ0ZXhJbmRleFBvaW50ZXIoaW5kZXhfYnVmZmVyXykpKTsKKyAgfQogfQogCi12b2lkIERyYXdSZWN0U2hhZG93U3ByZWFkOjpTZXR1cFNoYWRlcihjb25zdCBDb21tb25WZXJ0ZXhTaGFkZXImIHNoYWRlciwKLSAgICBHcmFwaGljc1N0YXRlKiBncmFwaGljc19zdGF0ZSkgeworYmFzZTo6VHlwZUlkIERyYXdSZWN0U2hhZG93U3ByZWFkOjpHZXRUeXBlSWQoKSBjb25zdCB7CisgIGlmIChhdHRyaWJ1dGVzX3NxdWFyZV8uc2l6ZSgpID4gMCkgeworICAgIHJldHVybiBTaGFkZXJQcm9ncmFtPFNoYWRlclZlcnRleENvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNoYWRlckZyYWdtZW50Q29sb3I+OjpHZXRUeXBlSWQoKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gU2hhZGVyUHJvZ3JhbTxTaGFkZXJWZXJ0ZXhSY29ybmVyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTaGFkZXJGcmFnbWVudFJjb3JuZXIyQ29sb3I+OjpHZXRUeXBlSWQoKTsKKyAgfQorfQorCit2b2lkIERyYXdSZWN0U2hhZG93U3ByZWFkOjpTZXR1cFZlcnRleFNoYWRlcihHcmFwaGljc1N0YXRlKiBncmFwaGljc19zdGF0ZSwKKyAgICBjb25zdCBTaGFkZXJWZXJ0ZXhDb2xvciYgc2hhZGVyKSB7CiAgIGdyYXBoaWNzX3N0YXRlLT5VcGRhdGVDbGlwQWRqdXN0bWVudChzaGFkZXIudV9jbGlwX2FkanVzdG1lbnQoKSk7CiAgIGdyYXBoaWNzX3N0YXRlLT5VcGRhdGVUcmFuc2Zvcm1NYXRyaXgoc2hhZGVyLnVfdmlld19tYXRyaXgoKSwKICAgICAgIGJhc2Vfc3RhdGVfLnRyYW5zZm9ybSk7CkBAIC0xNTgsMzYgKzE0MiwxMzQgQEAKICAgICAgIGJhc2Vfc3RhdGVfLnNjaXNzb3Iud2lkdGgoKSwgYmFzZV9zdGF0ZV8uc2Npc3Nvci5oZWlnaHQoKSk7CiAgIGdyYXBoaWNzX3N0YXRlLT5WZXJ0ZXhBdHRyaWJQb2ludGVyKAogICAgICAgc2hhZGVyLmFfcG9zaXRpb24oKSwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLAotICAgICAgc2l6ZW9mKFZlcnRleEF0dHJpYnV0ZXMpLCB2ZXJ0ZXhfYnVmZmVyXyArCi0gICAgICBvZmZzZXRvZihWZXJ0ZXhBdHRyaWJ1dGVzLCBwb3NpdGlvbikpOworICAgICAgc2l6ZW9mKFZlcnRleEF0dHJpYnV0ZXNTcXVhcmUpLCB2ZXJ0ZXhfYnVmZmVyXyArCisgICAgICBvZmZzZXRvZihWZXJ0ZXhBdHRyaWJ1dGVzU3F1YXJlLCBwb3NpdGlvbikpOwogICBncmFwaGljc19zdGF0ZS0+VmVydGV4QXR0cmliUG9pbnRlcigKICAgICAgIHNoYWRlci5hX2NvbG9yKCksIDQsIEdMX1VOU0lHTkVEX0JZVEUsIEdMX1RSVUUsCi0gICAgICBzaXplb2YoVmVydGV4QXR0cmlidXRlcyksIHZlcnRleF9idWZmZXJfICsKLSAgICAgIG9mZnNldG9mKFZlcnRleEF0dHJpYnV0ZXMsIGNvbG9yKSk7Ci0gIGdyYXBoaWNzX3N0YXRlLT5WZXJ0ZXhBdHRyaWJQb2ludGVyKAotICAgICAgc2hhZGVyLmFfb2Zmc2V0KCksIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwKLSAgICAgIHNpemVvZihWZXJ0ZXhBdHRyaWJ1dGVzKSwgdmVydGV4X2J1ZmZlcl8gKwotICAgICAgb2Zmc2V0b2YoVmVydGV4QXR0cmlidXRlcywgb2Zmc2V0KSk7CisgICAgICBzaXplb2YoVmVydGV4QXR0cmlidXRlc1NxdWFyZSksIHZlcnRleF9idWZmZXJfICsKKyAgICAgIG9mZnNldG9mKFZlcnRleEF0dHJpYnV0ZXNTcXVhcmUsIGNvbG9yKSk7CiAgIGdyYXBoaWNzX3N0YXRlLT5WZXJ0ZXhBdHRyaWJGaW5pc2goKTsKIH0KIAotYmFzZTo6VHlwZUlkIERyYXdSZWN0U2hhZG93U3ByZWFkOjpHZXRUeXBlSWQoKSBjb25zdCB7Ci0gIGlmIChpbm5lcl9jb3JuZXJzXykgewotICAgIHJldHVybiBTaGFkZXJQcm9ncmFtPENvbW1vblZlcnRleFNoYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBTaGFkZXJGcmFnbWVudENvbG9yQmV0d2VlblJyZWN0cz46OkdldFR5cGVJZCgpOwotICB9IGVsc2UgewotICAgIHJldHVybiBTaGFkZXJQcm9ncmFtPENvbW1vblZlcnRleFNoYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBTaGFkZXJGcmFnbWVudENvbG9ySW5jbHVkZT46OkdldFR5cGVJZCgpOwotICB9Cit2b2lkIERyYXdSZWN0U2hhZG93U3ByZWFkOjpTZXR1cFZlcnRleFNoYWRlcihHcmFwaGljc1N0YXRlKiBncmFwaGljc19zdGF0ZSwKKyAgICBjb25zdCBTaGFkZXJWZXJ0ZXhSY29ybmVyMiYgc2hhZGVyKSB7CisgIGdyYXBoaWNzX3N0YXRlLT5VcGRhdGVDbGlwQWRqdXN0bWVudChzaGFkZXIudV9jbGlwX2FkanVzdG1lbnQoKSk7CisgIGdyYXBoaWNzX3N0YXRlLT5VcGRhdGVUcmFuc2Zvcm1NYXRyaXgoc2hhZGVyLnVfdmlld19tYXRyaXgoKSwKKyAgICAgIGJhc2Vfc3RhdGVfLnRyYW5zZm9ybSk7CisgIGdyYXBoaWNzX3N0YXRlLT5TY2lzc29yKGJhc2Vfc3RhdGVfLnNjaXNzb3IueCgpLCBiYXNlX3N0YXRlXy5zY2lzc29yLnkoKSwKKyAgICAgIGJhc2Vfc3RhdGVfLnNjaXNzb3Iud2lkdGgoKSwgYmFzZV9zdGF0ZV8uc2Npc3Nvci5oZWlnaHQoKSk7CisgIGdyYXBoaWNzX3N0YXRlLT5WZXJ0ZXhBdHRyaWJQb2ludGVyKAorICAgICAgc2hhZGVyLmFfcG9zaXRpb24oKSwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLAorICAgICAgc2l6ZW9mKFZlcnRleEF0dHJpYnV0ZXNSb3VuZCksIHZlcnRleF9idWZmZXJfICsKKyAgICAgIG9mZnNldG9mKFZlcnRleEF0dHJpYnV0ZXNSb3VuZCwgcG9zaXRpb24pKTsKKyAgZ3JhcGhpY3Nfc3RhdGUtPlZlcnRleEF0dHJpYlBvaW50ZXIoCisgICAgICBzaGFkZXIuYV9yY29ybmVyX2lubmVyKCksIDQsIEdMX0ZMT0FULCBHTF9GQUxTRSwKKyAgICAgIHNpemVvZihWZXJ0ZXhBdHRyaWJ1dGVzUm91bmQpLCB2ZXJ0ZXhfYnVmZmVyXyArCisgICAgICBvZmZzZXRvZihWZXJ0ZXhBdHRyaWJ1dGVzUm91bmQsIHJjb3JuZXJfaW5uZXIpKTsKKyAgZ3JhcGhpY3Nfc3RhdGUtPlZlcnRleEF0dHJpYlBvaW50ZXIoCisgICAgICBzaGFkZXIuYV9yY29ybmVyX291dGVyKCksIDQsIEdMX0ZMT0FULCBHTF9GQUxTRSwKKyAgICAgIHNpemVvZihWZXJ0ZXhBdHRyaWJ1dGVzUm91bmQpLCB2ZXJ0ZXhfYnVmZmVyXyArCisgICAgICBvZmZzZXRvZihWZXJ0ZXhBdHRyaWJ1dGVzUm91bmQsIHJjb3JuZXJfb3V0ZXIpKTsKKyAgZ3JhcGhpY3Nfc3RhdGUtPlZlcnRleEF0dHJpYkZpbmlzaCgpOwogfQogCi12b2lkIERyYXdSZWN0U2hhZG93U3ByZWFkOjpTZXRWZXJ0ZXgoVmVydGV4QXR0cmlidXRlcyogdmVydGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHkpIHsKLSAgdmVydGV4LT5wb3NpdGlvblswXSA9IHg7Ci0gIHZlcnRleC0+cG9zaXRpb25bMV0gPSB5OwotICB2ZXJ0ZXgtPm9mZnNldFswXSA9ICh4IC0gb2Zmc2V0X2NlbnRlcl8ueCgpKSAqIG9mZnNldF9zY2FsZV87Ci0gIHZlcnRleC0+b2Zmc2V0WzFdID0gKHkgLSBvZmZzZXRfY2VudGVyXy55KCkpICogb2Zmc2V0X3NjYWxlXzsKLSAgdmVydGV4LT5jb2xvciA9IGNvbG9yXzsKK3ZvaWQgRHJhd1JlY3RTaGFkb3dTcHJlYWQ6OlNldEdlb21ldHJ5KEdyYXBoaWNzU3RhdGUqIGdyYXBoaWNzX3N0YXRlLAorICAgIGNvbnN0IG1hdGg6OlJlY3RGJiBpbm5lcl9yZWN0LCBjb25zdCBtYXRoOjpSZWN0RiYgb3V0ZXJfcmVjdCkgeworICAvLyBEcmF3IHRoZSBib3ggc2hhZG93J3Mgc3ByZWFkLiBUaGlzIGlzIGEgdHJpYW5nbGUgc3RyaXAgY292ZXJpbmcgdGhlIGFyZWEKKyAgLy8gYmV0d2VlbiBvdXRlciByZWN0IGFuZCBpbm5lciByZWN0LgorICB1aW50MzJfdCBjb2xvciA9IEdldEdMUkdCQShjb2xvcl8pOworCisgIGlmIChpbm5lcl9yZWN0LklzRW1wdHkoKSkgeworICAgIGF0dHJpYnV0ZXNfc3F1YXJlXy5yZXNlcnZlKDQpOworICAgIGF0dHJpYnV0ZXNfc3F1YXJlXy5lbXBsYWNlX2JhY2soCisgICAgICAgIG91dGVyX3JlY3QueCgpLCBvdXRlcl9yZWN0LnkoKSwgY29sb3IpOworICAgIGF0dHJpYnV0ZXNfc3F1YXJlXy5lbXBsYWNlX2JhY2soCisgICAgICAgIG91dGVyX3JlY3QucmlnaHQoKSwgb3V0ZXJfcmVjdC55KCksIGNvbG9yKTsKKyAgICBhdHRyaWJ1dGVzX3NxdWFyZV8uZW1wbGFjZV9iYWNrKAorICAgICAgICBvdXRlcl9yZWN0LngoKSwgb3V0ZXJfcmVjdC5ib3R0b20oKSwgY29sb3IpOworICAgIGF0dHJpYnV0ZXNfc3F1YXJlXy5lbXBsYWNlX2JhY2soCisgICAgICAgIG91dGVyX3JlY3QucmlnaHQoKSwgb3V0ZXJfcmVjdC5ib3R0b20oKSwgY29sb3IpOworICB9IGVsc2UgeworICAgIG1hdGg6OlJlY3RGIGluc2lkZV9yZWN0KGlubmVyX3JlY3QpOworICAgIGluc2lkZV9yZWN0LkludGVyc2VjdChvdXRlcl9yZWN0KTsKKyAgICBhdHRyaWJ1dGVzX3NxdWFyZV8ucmVzZXJ2ZSgxMCk7CisgICAgYXR0cmlidXRlc19zcXVhcmVfLmVtcGxhY2VfYmFjaygKKyAgICAgICAgb3V0ZXJfcmVjdC54KCksIG91dGVyX3JlY3QueSgpLCBjb2xvcik7CisgICAgYXR0cmlidXRlc19zcXVhcmVfLmVtcGxhY2VfYmFjaygKKyAgICAgICAgaW5zaWRlX3JlY3QueCgpLCBpbnNpZGVfcmVjdC55KCksIGNvbG9yKTsKKyAgICBhdHRyaWJ1dGVzX3NxdWFyZV8uZW1wbGFjZV9iYWNrKAorICAgICAgICBvdXRlcl9yZWN0LnJpZ2h0KCksIG91dGVyX3JlY3QueSgpLCBjb2xvcik7CisgICAgYXR0cmlidXRlc19zcXVhcmVfLmVtcGxhY2VfYmFjaygKKyAgICAgICAgaW5zaWRlX3JlY3QucmlnaHQoKSwgaW5zaWRlX3JlY3QueSgpLCBjb2xvcik7CisgICAgYXR0cmlidXRlc19zcXVhcmVfLmVtcGxhY2VfYmFjaygKKyAgICAgICAgb3V0ZXJfcmVjdC5yaWdodCgpLCBvdXRlcl9yZWN0LmJvdHRvbSgpLCBjb2xvcik7CisgICAgYXR0cmlidXRlc19zcXVhcmVfLmVtcGxhY2VfYmFjaygKKyAgICAgICAgaW5zaWRlX3JlY3QucmlnaHQoKSwgaW5zaWRlX3JlY3QuYm90dG9tKCksIGNvbG9yKTsKKyAgICBhdHRyaWJ1dGVzX3NxdWFyZV8uZW1wbGFjZV9iYWNrKAorICAgICAgICBvdXRlcl9yZWN0LngoKSwgb3V0ZXJfcmVjdC5ib3R0b20oKSwgY29sb3IpOworICAgIGF0dHJpYnV0ZXNfc3F1YXJlXy5lbXBsYWNlX2JhY2soCisgICAgICAgIGluc2lkZV9yZWN0LngoKSwgaW5zaWRlX3JlY3QuYm90dG9tKCksIGNvbG9yKTsKKyAgICBhdHRyaWJ1dGVzX3NxdWFyZV8uZW1wbGFjZV9iYWNrKAorICAgICAgICBvdXRlcl9yZWN0LngoKSwgb3V0ZXJfcmVjdC55KCksIGNvbG9yKTsKKyAgICBhdHRyaWJ1dGVzX3NxdWFyZV8uZW1wbGFjZV9iYWNrKAorICAgICAgICBpbnNpZGVfcmVjdC54KCksIGluc2lkZV9yZWN0LnkoKSwgY29sb3IpOworICB9CisKKyAgZ3JhcGhpY3Nfc3RhdGUtPlJlc2VydmVWZXJ0ZXhEYXRhKAorICAgICAgYXR0cmlidXRlc19zcXVhcmVfLnNpemUoKSAqIHNpemVvZihhdHRyaWJ1dGVzX3NxdWFyZV9bMF0pKTsKK30KKwordm9pZCBEcmF3UmVjdFNoYWRvd1NwcmVhZDo6U2V0R2VvbWV0cnkoCisgICAgR3JhcGhpY3NTdGF0ZSogZ3JhcGhpY3Nfc3RhdGUsCisgICAgY29uc3QgbWF0aDo6UmVjdEYmIGlubmVyX3JlY3QsCisgICAgY29uc3QgcmVuZGVyX3RyZWU6OlJvdW5kZWRDb3JuZXJzJiBpbm5lcl9jb3JuZXJzLAorICAgIGNvbnN0IG1hdGg6OlJlY3RGJiBvdXRlcl9yZWN0LAorICAgIGNvbnN0IHJlbmRlcl90cmVlOjpSb3VuZGVkQ29ybmVycyYgb3V0ZXJfY29ybmVycykgeworICAvLyBEcmF3IHRoZSBhcmVhIGJldHdlZW4gdGhlIGlubmVyIHJvdW5kZWQgcmVjdCBhbmQgb3V0ZXIgcm91bmRlZCByZWN0LiBBZGQKKyAgLy8gYSAxLXBpeGVsIGJvcmRlciB0byBpbmNsdWRlIGFudGlhbGlhc2luZy4KKyAgbWF0aDo6UmVjdEYgYm91bmRzKG91dGVyX3JlY3QpOworICBib3VuZHMuT3V0c2V0KDEuMGYsIDEuMGYpOworCisgIC8vIEdldCB0aGUgcmVuZGVyIHF1YWRzIGZvciB0aGUgaW5uZXIgcm91bmRlZCByZWN0IGV4Y2x1ZGluZyBpdHMgaW5zY3JpYmVkCisgIC8vIHJlY3RhbmdsZS4KKyAgUlJlY3RBdHRyaWJ1dGVzIHJyZWN0X2lubmVyWzhdOworICBHZXRSUmVjdEF0dHJpYnV0ZXMoYm91bmRzLCBpbm5lcl9yZWN0LCBpbm5lcl9jb3JuZXJzLCBycmVjdF9pbm5lcik7CisKKyAgLy8gR2V0IHRoZSByZW5kZXIgcXVhZHMgZm9yIHRoZSBvdXRlciByb3VuZGVkIHJlY3QuCisgIFJSZWN0QXR0cmlidXRlcyBycmVjdF9vdXRlcls0XTsKKyAgR2V0UlJlY3RBdHRyaWJ1dGVzKGJvdW5kcywgb3V0ZXJfcmVjdCwgb3V0ZXJfY29ybmVycywgcnJlY3Rfb3V0ZXIpOworCisgIC8vIEFkZCBnZW9tZXRyeSB0byBkcmF3IHRoZSBhcmVhIGJldHdlZW4gdGhlIGlubmVyIHJyZWN0IGFuZCBvdXRlciBycmVjdC4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheXNpemUocnJlY3RfaW5uZXIpOyArK2kpIHsKKyAgICBmb3IgKGludCBvID0gMDsgbyA8IGFycmF5c2l6ZShycmVjdF9vdXRlcik7ICsrbykgeworICAgICAgbWF0aDo6UmVjdEYgaW50ZXJzZWN0aW9uID0gbWF0aDo6SW50ZXJzZWN0UmVjdHMoCisgICAgICAgICAgcnJlY3RfaW5uZXJbaV0uYm91bmRzLCBycmVjdF9vdXRlcltvXS5ib3VuZHMpOworICAgICAgaWYgKCFpbnRlcnNlY3Rpb24uSXNFbXB0eSgpKSB7CisgICAgICAgIC8vIFVzZSB0d28gdHJpYW5nbGVzIHRvIGRyYXcgdGhlIGludGVyc2VjdGlvbi4KKyAgICAgICAgY29uc3QgUkNvcm5lciYgaW5uZXIgPSBycmVjdF9pbm5lcltpXS5yY29ybmVyOworICAgICAgICBjb25zdCBSQ29ybmVyJiBvdXRlciA9IHJyZWN0X291dGVyW29dLnJjb3JuZXI7CisgICAgICAgIHVpbnQxNl90IHZlcnQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oYXR0cmlidXRlc19yb3VuZF8uc2l6ZSgpKTsKKyAgICAgICAgYXR0cmlidXRlc19yb3VuZF8uZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgaW50ZXJzZWN0aW9uLngoKSwgaW50ZXJzZWN0aW9uLnkoKSwgaW5uZXIsIG91dGVyKTsKKyAgICAgICAgYXR0cmlidXRlc19yb3VuZF8uZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgaW50ZXJzZWN0aW9uLnJpZ2h0KCksIGludGVyc2VjdGlvbi55KCksIGlubmVyLCBvdXRlcik7CisgICAgICAgIGF0dHJpYnV0ZXNfcm91bmRfLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgIGludGVyc2VjdGlvbi54KCksIGludGVyc2VjdGlvbi5ib3R0b20oKSwgaW5uZXIsIG91dGVyKTsKKyAgICAgICAgYXR0cmlidXRlc19yb3VuZF8uZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgaW50ZXJzZWN0aW9uLnJpZ2h0KCksIGludGVyc2VjdGlvbi5ib3R0b20oKSwgaW5uZXIsIG91dGVyKTsKKyAgICAgICAgaW5kaWNlc18uZW1wbGFjZV9iYWNrKHZlcnQpOworICAgICAgICBpbmRpY2VzXy5lbXBsYWNlX2JhY2sodmVydCArIDEpOworICAgICAgICBpbmRpY2VzXy5lbXBsYWNlX2JhY2sodmVydCArIDIpOworICAgICAgICBpbmRpY2VzXy5lbXBsYWNlX2JhY2sodmVydCArIDEpOworICAgICAgICBpbmRpY2VzXy5lbXBsYWNlX2JhY2sodmVydCArIDIpOworICAgICAgICBpbmRpY2VzXy5lbXBsYWNlX2JhY2sodmVydCArIDMpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGdyYXBoaWNzX3N0YXRlLT5SZXNlcnZlVmVydGV4RGF0YSgKKyAgICAgIGF0dHJpYnV0ZXNfcm91bmRfLnNpemUoKSAqIHNpemVvZihhdHRyaWJ1dGVzX3JvdW5kX1swXSkpOworICBncmFwaGljc19zdGF0ZS0+UmVzZXJ2ZVZlcnRleEluZGljZXMoaW5kaWNlc18uc2l6ZSgpKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGVnbApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9kcmF3X3JlY3Rfc2hhZG93X3NwcmVhZC5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9kcmF3X3JlY3Rfc2hhZG93X3NwcmVhZC5oCmluZGV4IDFlNGQ1OTAuLjZkZjc5Y2EgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19yZWN0X3NoYWRvd19zcHJlYWQuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2RyYXdfcmVjdF9zaGFkb3dfc3ByZWFkLmgKQEAgLTE1LDYgKzE1LDggQEAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfRUdMX0RSQVdfUkVDVF9TSEFET1dfU1BSRUFEX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX0VHTF9EUkFXX1JFQ1RfU0hBRE9XX1NQUkVBRF9IXwogCisjaW5jbHVkZSA8dmVjdG9yPgorCiAjaW5jbHVkZSAiY29iYWx0L21hdGgvcmVjdF9mLmgiCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcl90cmVlL2NvbG9yX3JnYmEuaCIKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19vYmplY3QuaCIKQEAgLTU4LDMxICs2MCw0MyBAQAogICAgICAgU2hhZGVyUHJvZ3JhbU1hbmFnZXIqIHByb2dyYW1fbWFuYWdlcikgT1ZFUlJJREU7CiAgIGJhc2U6OlR5cGVJZCBHZXRUeXBlSWQoKSBjb25zdCBPVkVSUklERTsKIAotIHByb3RlY3RlZDoKLSAgdHlwZWRlZiBTaGFkZXJWZXJ0ZXhDb2xvck9mZnNldCBDb21tb25WZXJ0ZXhTaGFkZXI7Ci0KLSAgc3RydWN0IFZlcnRleEF0dHJpYnV0ZXMgeworIHByaXZhdGU6CisgIHN0cnVjdCBWZXJ0ZXhBdHRyaWJ1dGVzU3F1YXJlIHsKKyAgICBWZXJ0ZXhBdHRyaWJ1dGVzU3F1YXJlKGZsb2F0IHgsIGZsb2F0IHksIHVpbnQzMl90IGNvbG9yKTsKICAgICBmbG9hdCBwb3NpdGlvblsyXTsKLSAgICBmbG9hdCBvZmZzZXRbMl07CiAgICAgdWludDMyX3QgY29sb3I7CiAgIH07CiAKLSAgRHJhd1JlY3RTaGFkb3dTcHJlYWQoR3JhcGhpY3NTdGF0ZSogZ3JhcGhpY3Nfc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJhc2VTdGF0ZSYgYmFzZV9zdGF0ZSk7Ci0gIHZvaWQgU2V0dXBTaGFkZXIoY29uc3QgQ29tbW9uVmVydGV4U2hhZGVyJiBzaGFkZXIsCi0gICAgICAgICAgICAgICAgICAgR3JhcGhpY3NTdGF0ZSogZ3JhcGhpY3Nfc3RhdGUpOwotICB2b2lkIFNldFZlcnRleChWZXJ0ZXhBdHRyaWJ1dGVzKiB2ZXJ0ZXgsIGZsb2F0IHgsIGZsb2F0IHkpOworICBzdHJ1Y3QgVmVydGV4QXR0cmlidXRlc1JvdW5kIHsKKyAgICBWZXJ0ZXhBdHRyaWJ1dGVzUm91bmQoZmxvYXQgeCwgZmxvYXQgeSwKKyAgICAgICAgY29uc3QgUkNvcm5lciYgaW5uZXIsIGNvbnN0IFJDb3JuZXImIG91dGVyKTsKKyAgICBmbG9hdCBwb3NpdGlvblsyXTsKKyAgICBSQ29ybmVyIHJjb3JuZXJfaW5uZXI7CisgICAgUkNvcm5lciByY29ybmVyX291dGVyOworICB9OwogCi0gIG1hdGg6OlJlY3RGIGlubmVyX3JlY3RfOwotICBtYXRoOjpSZWN0RiBvdXRlcl9yZWN0XzsKLSAgT3B0aW9uYWxSb3VuZGVkQ29ybmVycyBpbm5lcl9jb3JuZXJzXzsKLSAgT3B0aW9uYWxSb3VuZGVkQ29ybmVycyBvdXRlcl9jb3JuZXJzXzsKLSAgbWF0aDo6UG9pbnRGIG9mZnNldF9jZW50ZXJfOwotICBmbG9hdCBvZmZzZXRfc2NhbGVfOwotICB1aW50MzJfdCBjb2xvcl87CisgIHZvaWQgU2V0dXBWZXJ0ZXhTaGFkZXIoR3JhcGhpY3NTdGF0ZSogZ3JhcGhpY3Nfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2hhZGVyVmVydGV4Q29sb3ImIHNoYWRlcik7CisgIHZvaWQgU2V0dXBWZXJ0ZXhTaGFkZXIoR3JhcGhpY3NTdGF0ZSogZ3JhcGhpY3Nfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2hhZGVyVmVydGV4UmNvcm5lcjImIHNoYWRlcik7CisKKyAgdm9pZCBTZXRHZW9tZXRyeShHcmFwaGljc1N0YXRlKiBncmFwaGljc19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRoOjpSZWN0RiYgaW5uZXJfcmVjdCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRoOjpSZWN0RiYgb3V0ZXJfcmVjdCk7CisgIHZvaWQgU2V0R2VvbWV0cnkoR3JhcGhpY3NTdGF0ZSogZ3JhcGhpY3Nfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0aDo6UmVjdEYmIGlubmVyX3JlY3QsCisgICAgICAgICAgICAgICAgICAgY29uc3QgcmVuZGVyX3RyZWU6OlJvdW5kZWRDb3JuZXJzJiBpbm5lcl9jb3JuZXJzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGg6OlJlY3RGJiBvdXRlcl9yZWN0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbmRlcl90cmVlOjpSb3VuZGVkQ29ybmVycyYgb3V0ZXJfY29ybmVycyk7CisKKyAgcmVuZGVyX3RyZWU6OkNvbG9yUkdCQSBjb2xvcl87CisKKyAgc3RkOjp2ZWN0b3I8VmVydGV4QXR0cmlidXRlc1NxdWFyZT4gYXR0cmlidXRlc19zcXVhcmVfOworICBzdGQ6OnZlY3RvcjxWZXJ0ZXhBdHRyaWJ1dGVzUm91bmQ+IGF0dHJpYnV0ZXNfcm91bmRfOworICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gaW5kaWNlc187CiAKICAgdWludDhfdCogdmVydGV4X2J1ZmZlcl87Ci0gIGludCB2ZXJ0ZXhfY291bnRfOworICB1aW50MTZfdCogaW5kZXhfYnVmZmVyXzsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBlZ2wKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19ycmVjdF9jb2xvci5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19ycmVjdF9jb2xvci5jYwppbmRleCBmMTJlN2VkLi4yNDQzYmJlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2RyYXdfcnJlY3RfY29sb3IuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9kcmF3X3JyZWN0X2NvbG9yLmNjCkBAIC0yNiwyMSArMjYsNyBAQAogbmFtZXNwYWNlIGVnbCB7CiAKIG5hbWVzcGFjZSB7Ci1jb25zdCBpbnQga1ZlcnRleENvdW50ID0gNDsKLQotc3RydWN0IFZlcnRleEF0dHJpYnV0ZXMgewotICBmbG9hdCBwb3NpdGlvblsyXTsKLSAgZmxvYXQgb2Zmc2V0WzJdOwotICB1aW50MzJfdCBjb2xvcjsKLX07Ci0KLXZvaWQgU2V0VmVydGV4KFZlcnRleEF0dHJpYnV0ZXMqIHZlcnRleCwgZmxvYXQgeCwgZmxvYXQgeSwgdWludDMyX3QgY29sb3IpIHsKLSAgdmVydGV4LT5wb3NpdGlvblswXSA9IHg7Ci0gIHZlcnRleC0+cG9zaXRpb25bMV0gPSB5OwotICB2ZXJ0ZXgtPm9mZnNldFswXSA9IHg7Ci0gIHZlcnRleC0+b2Zmc2V0WzFdID0geTsKLSAgdmVydGV4LT5jb2xvciA9IGNvbG9yOwotfQorY29uc3QgaW50IGtWZXJ0ZXhDb3VudCA9IDQgKiA2OwogfSAgLy8gbmFtZXNwYWNlCiAKIERyYXdSUmVjdENvbG9yOjpEcmF3UlJlY3RDb2xvcihHcmFwaGljc1N0YXRlKiBncmFwaGljc19zdGF0ZSwKQEAgLTUxLDggKzM3LDE0IEBACiAgICAgICByZWN0XyhyZWN0KSwKICAgICAgIGNvcm5lcnNfKGNvcm5lcnMpLAogICAgICAgdmVydGV4X2J1ZmZlcl8oTlVMTCkgewotICBjb2xvcl8gPSBHZXRHTFJHQkEoR2V0RHJhd0NvbG9yKGNvbG9yKSAqIGJhc2Vfc3RhdGVfLm9wYWNpdHkpOworICBjb2xvcl8gPSBHZXREcmF3Q29sb3IoY29sb3IpICogYmFzZV9zdGF0ZV8ub3BhY2l0eTsKICAgZ3JhcGhpY3Nfc3RhdGUtPlJlc2VydmVWZXJ0ZXhEYXRhKGtWZXJ0ZXhDb3VudCAqIHNpemVvZihWZXJ0ZXhBdHRyaWJ1dGVzKSk7CisKKyAgLy8gRXh0cmFjdCBzY2FsZSBmcm9tIHRoZSB0cmFuc2Zvcm0gYW5kIG1vdmUgaXQgaW50byB0aGUgdmVydGV4IGF0dHJpYnV0ZXMKKyAgLy8gc28gdGhhdCB0aGUgYW50aS1hbGlhc2VkIGVkZ2VzIHJlbWFpbiAxIHBpeGVsIHdpZGUuCisgIG1hdGg6OlZlY3RvcjJkRiBzY2FsZSA9IFJlbW92ZVNjYWxlRnJvbVRyYW5zZm9ybSgpOworICByZWN0Xy5TY2FsZShzY2FsZS54KCksIHNjYWxlLnkoKSk7CisgIGNvcm5lcnNfID0gY29ybmVyc18uU2NhbGUoc2NhbGUueCgpLCBzY2FsZS55KCkpOwogfQogCiB2b2lkIERyYXdSUmVjdENvbG9yOjpFeGVjdXRlVXBkYXRlVmVydGV4QnVmZmVyKApAQCAtNjMsMTAgKzU1LDMxIEBACiAgIFZlcnRleEF0dHJpYnV0ZXMgYXR0cmlidXRlc1trVmVydGV4Q291bnRdOwogICBtYXRoOjpSZWN0RiBvdXRlcl9yZWN0KHJlY3RfKTsKICAgb3V0ZXJfcmVjdC5PdXRzZXQoMS4wZiwgMS4wZik7Ci0gIFNldFZlcnRleCgmYXR0cmlidXRlc1swXSwgb3V0ZXJfcmVjdC54KCksIG91dGVyX3JlY3QueSgpLCBjb2xvcl8pOwotICBTZXRWZXJ0ZXgoJmF0dHJpYnV0ZXNbMV0sIG91dGVyX3JlY3QucmlnaHQoKSwgb3V0ZXJfcmVjdC55KCksIGNvbG9yXyk7Ci0gIFNldFZlcnRleCgmYXR0cmlidXRlc1syXSwgb3V0ZXJfcmVjdC5yaWdodCgpLCBvdXRlcl9yZWN0LmJvdHRvbSgpLCBjb2xvcl8pOwotICBTZXRWZXJ0ZXgoJmF0dHJpYnV0ZXNbM10sIG91dGVyX3JlY3QueCgpLCBvdXRlcl9yZWN0LmJvdHRvbSgpLCBjb2xvcl8pOworCisgIFJSZWN0QXR0cmlidXRlcyBycmVjdFs0XTsKKyAgR2V0UlJlY3RBdHRyaWJ1dGVzKG91dGVyX3JlY3QsIHJlY3RfLCBjb3JuZXJzXywgcnJlY3QpOworICBmb3IgKGludCByID0gMCwgdiA9IDA7IHIgPCBhcnJheXNpemUocnJlY3QpOyArK3IpIHsKKyAgICBhdHRyaWJ1dGVzW3YgIF0ucG9zaXRpb25bMF0gPSBycmVjdFtyXS5ib3VuZHMueCgpOworICAgIGF0dHJpYnV0ZXNbdiAgXS5wb3NpdGlvblsxXSA9IHJyZWN0W3JdLmJvdW5kcy55KCk7CisgICAgYXR0cmlidXRlc1t2ICBdLnJjb3JuZXIgPQorICAgICAgICBSQ29ybmVyKGF0dHJpYnV0ZXNbdiAgXS5wb3NpdGlvbiwgcnJlY3Rbcl0ucmNvcm5lcik7CisgICAgYXR0cmlidXRlc1t2KzFdLnBvc2l0aW9uWzBdID0gcnJlY3Rbcl0uYm91bmRzLnJpZ2h0KCk7CisgICAgYXR0cmlidXRlc1t2KzFdLnBvc2l0aW9uWzFdID0gcnJlY3Rbcl0uYm91bmRzLnkoKTsKKyAgICBhdHRyaWJ1dGVzW3YrMV0ucmNvcm5lciA9CisgICAgICAgIFJDb3JuZXIoYXR0cmlidXRlc1t2KzFdLnBvc2l0aW9uLCBycmVjdFtyXS5yY29ybmVyKTsKKyAgICBhdHRyaWJ1dGVzW3YrMl0ucG9zaXRpb25bMF0gPSBycmVjdFtyXS5ib3VuZHMueCgpOworICAgIGF0dHJpYnV0ZXNbdisyXS5wb3NpdGlvblsxXSA9IHJyZWN0W3JdLmJvdW5kcy5ib3R0b20oKTsKKyAgICBhdHRyaWJ1dGVzW3YrMl0ucmNvcm5lciA9CisgICAgICAgIFJDb3JuZXIoYXR0cmlidXRlc1t2KzJdLnBvc2l0aW9uLCBycmVjdFtyXS5yY29ybmVyKTsKKyAgICBhdHRyaWJ1dGVzW3YrM10ucG9zaXRpb25bMF0gPSBycmVjdFtyXS5ib3VuZHMucmlnaHQoKTsKKyAgICBhdHRyaWJ1dGVzW3YrM10ucG9zaXRpb25bMV0gPSBycmVjdFtyXS5ib3VuZHMuYm90dG9tKCk7CisgICAgYXR0cmlidXRlc1t2KzNdLnJjb3JuZXIgPQorICAgICAgICBSQ29ybmVyKGF0dHJpYnV0ZXNbdiszXS5wb3NpdGlvbiwgcnJlY3Rbcl0ucmNvcm5lcik7CisgICAgYXR0cmlidXRlc1t2KzRdID0gYXR0cmlidXRlc1t2KzFdOworICAgIGF0dHJpYnV0ZXNbdis1XSA9IGF0dHJpYnV0ZXNbdisyXTsKKyAgICB2ICs9IDY7CisgIH0KKwogICB2ZXJ0ZXhfYnVmZmVyXyA9IGdyYXBoaWNzX3N0YXRlLT5BbGxvY2F0ZVZlcnRleERhdGEoc2l6ZW9mKGF0dHJpYnV0ZXMpKTsKICAgU2JNZW1vcnlDb3B5KHZlcnRleF9idWZmZXJfLCBhdHRyaWJ1dGVzLCBzaXplb2YoYXR0cmlidXRlcykpOwogfQpAQCAtNzQsOCArODcsOCBAQAogdm9pZCBEcmF3UlJlY3RDb2xvcjo6RXhlY3V0ZVJhc3Rlcml6ZSgKICAgICBHcmFwaGljc1N0YXRlKiBncmFwaGljc19zdGF0ZSwKICAgICBTaGFkZXJQcm9ncmFtTWFuYWdlciogcHJvZ3JhbV9tYW5hZ2VyKSB7Ci0gIFNoYWRlclByb2dyYW08U2hhZGVyVmVydGV4Q29sb3JPZmZzZXQsCi0gICAgICAgICAgICAgICAgU2hhZGVyRnJhZ21lbnRDb2xvclJyZWN0PiogcHJvZ3JhbTsKKyAgU2hhZGVyUHJvZ3JhbTxTaGFkZXJWZXJ0ZXhSY29ybmVyLAorICAgICAgICAgICAgICAgIFNoYWRlckZyYWdtZW50UmNvcm5lckNvbG9yPiogcHJvZ3JhbTsKICAgcHJvZ3JhbV9tYW5hZ2VyLT5HZXRQcm9ncmFtKCZwcm9ncmFtKTsKICAgZ3JhcGhpY3Nfc3RhdGUtPlVzZVByb2dyYW0ocHJvZ3JhbS0+R2V0SGFuZGxlKCkpOwogICBncmFwaGljc19zdGF0ZS0+VXBkYXRlQ2xpcEFkanVzdG1lbnQoCkBAIC05MCwyMyArMTAzLDE5IEBACiAgICAgICBzaXplb2YoVmVydGV4QXR0cmlidXRlcyksIHZlcnRleF9idWZmZXJfICsKICAgICAgIG9mZnNldG9mKFZlcnRleEF0dHJpYnV0ZXMsIHBvc2l0aW9uKSk7CiAgIGdyYXBoaWNzX3N0YXRlLT5WZXJ0ZXhBdHRyaWJQb2ludGVyKAotICAgICAgcHJvZ3JhbS0+R2V0VmVydGV4U2hhZGVyKCkuYV9jb2xvcigpLCA0LCBHTF9VTlNJR05FRF9CWVRFLCBHTF9UUlVFLAorICAgICAgcHJvZ3JhbS0+R2V0VmVydGV4U2hhZGVyKCkuYV9yY29ybmVyKCksIDQsIEdMX0ZMT0FULCBHTF9GQUxTRSwKICAgICAgIHNpemVvZihWZXJ0ZXhBdHRyaWJ1dGVzKSwgdmVydGV4X2J1ZmZlcl8gKwotICAgICAgb2Zmc2V0b2YoVmVydGV4QXR0cmlidXRlcywgY29sb3IpKTsKLSAgZ3JhcGhpY3Nfc3RhdGUtPlZlcnRleEF0dHJpYlBvaW50ZXIoCi0gICAgICBwcm9ncmFtLT5HZXRWZXJ0ZXhTaGFkZXIoKS5hX29mZnNldCgpLCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsCi0gICAgICBzaXplb2YoVmVydGV4QXR0cmlidXRlcyksIHZlcnRleF9idWZmZXJfICsKLSAgICAgIG9mZnNldG9mKFZlcnRleEF0dHJpYnV0ZXMsIG9mZnNldCkpOworICAgICAgb2Zmc2V0b2YoVmVydGV4QXR0cmlidXRlcywgcmNvcm5lcikpOwogICBncmFwaGljc19zdGF0ZS0+VmVydGV4QXR0cmliRmluaXNoKCk7Ci0gIFNldFJSZWN0VW5pZm9ybXMocHJvZ3JhbS0+R2V0RnJhZ21lbnRTaGFkZXIoKS51X3JlY3QoKSwKLSAgICAgICAgICAgICAgICAgICBwcm9ncmFtLT5HZXRGcmFnbWVudFNoYWRlcigpLnVfY29ybmVycygpLAotICAgICAgICAgICAgICAgICAgIHJlY3RfLCBjb3JuZXJzXywgMC41Zik7Ci0gIEdMX0NBTEwoZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwga1ZlcnRleENvdW50KSk7CisKKyAgR0xfQ0FMTChnbFVuaWZvcm00Zihwcm9ncmFtLT5HZXRGcmFnbWVudFNoYWRlcigpLnVfY29sb3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICBjb2xvcl8ucigpLCBjb2xvcl8uZygpLCBjb2xvcl8uYigpLCBjb2xvcl8uYSgpKSk7CisgIEdMX0NBTEwoZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFUywgMCwga1ZlcnRleENvdW50KSk7CiB9CiAKIGJhc2U6OlR5cGVJZCBEcmF3UlJlY3RDb2xvcjo6R2V0VHlwZUlkKCkgY29uc3QgewotICByZXR1cm4gU2hhZGVyUHJvZ3JhbTxTaGFkZXJWZXJ0ZXhDb2xvck9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgU2hhZGVyRnJhZ21lbnRDb2xvclJyZWN0Pjo6R2V0VHlwZUlkKCk7CisgIHJldHVybiBTaGFkZXJQcm9ncmFtPFNoYWRlclZlcnRleFJjb3JuZXIsCisgICAgICAgICAgICAgICAgICAgICAgIFNoYWRlckZyYWdtZW50UmNvcm5lckNvbG9yPjo6R2V0VHlwZUlkKCk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBlZ2wKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19ycmVjdF9jb2xvci5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9kcmF3X3JyZWN0X2NvbG9yLmgKaW5kZXggYzVjZDA1NS4uZGU3MWU5ZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9kcmF3X3JyZWN0X2NvbG9yLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9kcmF3X3JyZWN0X2NvbG9yLmgKQEAgLTQxLDkgKzQxLDE0IEBACiAgIGJhc2U6OlR5cGVJZCBHZXRUeXBlSWQoKSBjb25zdCBPVkVSUklERTsKIAogIHByaXZhdGU6CisgIHN0cnVjdCBWZXJ0ZXhBdHRyaWJ1dGVzIHsKKyAgICBmbG9hdCBwb3NpdGlvblsyXTsKKyAgICBSQ29ybmVyIHJjb3JuZXI7CisgIH07CisKICAgbWF0aDo6UmVjdEYgcmVjdF87CiAgIHJlbmRlcl90cmVlOjpSb3VuZGVkQ29ybmVycyBjb3JuZXJzXzsKLSAgdWludDMyX3QgY29sb3JfOworICByZW5kZXJfdHJlZTo6Q29sb3JSR0JBIGNvbG9yXzsKIAogICB1aW50OF90KiB2ZXJ0ZXhfYnVmZmVyXzsKIH07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2RyYXdfcnJlY3RfY29sb3JfdGV4dHVyZS5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19ycmVjdF9jb2xvcl90ZXh0dXJlLmNjCmluZGV4IDdlYzQyMmIuLmRiY2JlYzEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19ycmVjdF9jb2xvcl90ZXh0dXJlLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19ycmVjdF9jb2xvcl90ZXh0dXJlLmNjCkBAIC0yNywyMiArMjcsNyBAQAogbmFtZXNwYWNlIGVnbCB7CiAKIG5hbWVzcGFjZSB7Ci1jb25zdCBpbnQga1ZlcnRleENvdW50ID0gNDsKLQotc3RydWN0IFZlcnRleEF0dHJpYnV0ZXMgewotICBmbG9hdCBwb3NpdGlvblsyXTsKLSAgZmxvYXQgb2Zmc2V0WzJdOwotICBmbG9hdCB0ZXhjb29yZFsyXTsKLX07Ci0KLXZvaWQgU2V0VmVydGV4KFZlcnRleEF0dHJpYnV0ZXMqIHZlcnRleCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgdSwgZmxvYXQgdikgewotICB2ZXJ0ZXgtPnBvc2l0aW9uWzBdID0geDsKLSAgdmVydGV4LT5wb3NpdGlvblsxXSA9IHk7Ci0gIHZlcnRleC0+b2Zmc2V0WzBdID0geDsKLSAgdmVydGV4LT5vZmZzZXRbMV0gPSB5OwotICB2ZXJ0ZXgtPnRleGNvb3JkWzBdID0gdTsKLSAgdmVydGV4LT50ZXhjb29yZFsxXSA9IHY7Ci19Citjb25zdCBpbnQga1ZlcnRleENvdW50ID0gNCAqIDY7CiB9ICAvLyBuYW1lc3BhY2UKIAogRHJhd1JSZWN0Q29sb3JUZXh0dXJlOjpEcmF3UlJlY3RDb2xvclRleHR1cmUoR3JhcGhpY3NTdGF0ZSogZ3JhcGhpY3Nfc3RhdGUsCkBAIC02MCwyNSArNDUsNTggQEAKICAgRENIRUNLKGJhc2Vfc3RhdGVfLnJvdW5kZWRfc2Npc3Nvcl9jb3JuZXJzKTsKICAgY29sb3JfID0gR2V0RHJhd0NvbG9yKGNvbG9yKSAqIGJhc2Vfc3RhdGVfLm9wYWNpdHk7CiAgIGdyYXBoaWNzX3N0YXRlLT5SZXNlcnZlVmVydGV4RGF0YShrVmVydGV4Q291bnQgKiBzaXplb2YoVmVydGV4QXR0cmlidXRlcykpOworCisgIC8vIEV4dHJhY3Qgc2NhbGUgZnJvbSB0aGUgdHJhbnNmb3JtIGFuZCBtb3ZlIGl0IGludG8gdGhlIHZlcnRleCBhdHRyaWJ1dGVzCisgIC8vIHNvIHRoYXQgdGhlIGFudGktYWxpYXNlZCBlZGdlcyByZW1haW4gMSBwaXhlbCB3aWRlLgorICBtYXRoOjpWZWN0b3IyZEYgc2NhbGUgPSBSZW1vdmVTY2FsZUZyb21UcmFuc2Zvcm0oKTsKKyAgcmVjdF8uU2NhbGUoc2NhbGUueCgpLCBzY2FsZS55KCkpOworICBiYXNlX3N0YXRlXy5yb3VuZGVkX3NjaXNzb3JfcmVjdC5TY2FsZShzY2FsZS54KCksIHNjYWxlLnkoKSk7CisgIGJhc2Vfc3RhdGVfLnJvdW5kZWRfc2Npc3Nvcl9jb3JuZXJzID0KKyAgICAgIGJhc2Vfc3RhdGVfLnJvdW5kZWRfc2Npc3Nvcl9jb3JuZXJzLT5TY2FsZShzY2FsZS54KCksIHNjYWxlLnkoKSk7CiB9CiAKIHZvaWQgRHJhd1JSZWN0Q29sb3JUZXh0dXJlOjpFeGVjdXRlVXBkYXRlVmVydGV4QnVmZmVyKAogICAgIEdyYXBoaWNzU3RhdGUqIGdyYXBoaWNzX3N0YXRlLAogICAgIFNoYWRlclByb2dyYW1NYW5hZ2VyKiBwcm9ncmFtX21hbmFnZXIpIHsKKyAgY29uc3QgZmxvYXQga1dpZHRoU2NhbGUgPSAxLjBmIC8gcmVjdF8ud2lkdGgoKTsKKyAgY29uc3QgZmxvYXQga0hlaWdodFNjYWxlID0gMS4wZiAvIHJlY3RfLmhlaWdodCgpOworCiAgIFZlcnRleEF0dHJpYnV0ZXMgYXR0cmlidXRlc1trVmVydGV4Q291bnRdOwotICBTZXRWZXJ0ZXgoJmF0dHJpYnV0ZXNbMF0sIHJlY3RfLngoKSwgcmVjdF8ueSgpLAotICAgICAgdGV4Y29vcmRfdHJhbnNmb3JtXygwLCAyKSwgdGV4Y29vcmRfdHJhbnNmb3JtXygxLCAyKSk7ICAgIC8vIHV2ID0gKDAsMCkKLSAgU2V0VmVydGV4KCZhdHRyaWJ1dGVzWzFdLCByZWN0Xy5yaWdodCgpLCByZWN0Xy55KCksCi0gICAgICB0ZXhjb29yZF90cmFuc2Zvcm1fKDAsIDApICsgdGV4Y29vcmRfdHJhbnNmb3JtXygwLCAyKSwgICAgLy8gdXYgPSAoMSwwKQotICAgICAgdGV4Y29vcmRfdHJhbnNmb3JtXygxLCAwKSArIHRleGNvb3JkX3RyYW5zZm9ybV8oMSwgMikpOwotICBTZXRWZXJ0ZXgoJmF0dHJpYnV0ZXNbMl0sIHJlY3RfLnJpZ2h0KCksIHJlY3RfLmJvdHRvbSgpLAotICAgICAgdGV4Y29vcmRfdHJhbnNmb3JtXygwLCAwKSArIHRleGNvb3JkX3RyYW5zZm9ybV8oMCwgMSkgKyAgIC8vIHV2ID0gKDEsMSkKLSAgICAgICAgICB0ZXhjb29yZF90cmFuc2Zvcm1fKDAsIDIpLAotICAgICAgdGV4Y29vcmRfdHJhbnNmb3JtXygxLCAwKSArIHRleGNvb3JkX3RyYW5zZm9ybV8oMSwgMSkgKwotICAgICAgICAgIHRleGNvb3JkX3RyYW5zZm9ybV8oMSwgMikpOwotICBTZXRWZXJ0ZXgoJmF0dHJpYnV0ZXNbM10sIHJlY3RfLngoKSwgcmVjdF8uYm90dG9tKCksCi0gICAgICB0ZXhjb29yZF90cmFuc2Zvcm1fKDAsIDEpICsgdGV4Y29vcmRfdHJhbnNmb3JtXygwLCAyKSwgICAgLy8gdXYgPSAoMCwxKQotICAgICAgdGV4Y29vcmRfdHJhbnNmb3JtXygxLCAxKSArIHRleGNvb3JkX3RyYW5zZm9ybV8oMSwgMikpOworICBSUmVjdEF0dHJpYnV0ZXMgcnJlY3RbNF07CisgIEdldFJSZWN0QXR0cmlidXRlcyhyZWN0XywgYmFzZV9zdGF0ZV8ucm91bmRlZF9zY2lzc29yX3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAqYmFzZV9zdGF0ZV8ucm91bmRlZF9zY2lzc29yX2Nvcm5lcnMsIHJyZWN0KTsKKyAgZm9yIChpbnQgciA9IDAsIHYgPSAwOyByIDwgYXJyYXlzaXplKHJyZWN0KTsgKytyKSB7CisgICAgYXR0cmlidXRlc1t2ICBdLnBvc2l0aW9uWzBdID0gcnJlY3Rbcl0uYm91bmRzLngoKTsKKyAgICBhdHRyaWJ1dGVzW3YgIF0ucG9zaXRpb25bMV0gPSBycmVjdFtyXS5ib3VuZHMueSgpOworICAgIGF0dHJpYnV0ZXNbdiAgXS5yY29ybmVyID0KKyAgICAgICAgUkNvcm5lcihhdHRyaWJ1dGVzW3YgIF0ucG9zaXRpb24sIHJyZWN0W3JdLnJjb3JuZXIpOworICAgIGF0dHJpYnV0ZXNbdisxXS5wb3NpdGlvblswXSA9IHJyZWN0W3JdLmJvdW5kcy5yaWdodCgpOworICAgIGF0dHJpYnV0ZXNbdisxXS5wb3NpdGlvblsxXSA9IHJyZWN0W3JdLmJvdW5kcy55KCk7CisgICAgYXR0cmlidXRlc1t2KzFdLnJjb3JuZXIgPQorICAgICAgICBSQ29ybmVyKGF0dHJpYnV0ZXNbdisxXS5wb3NpdGlvbiwgcnJlY3Rbcl0ucmNvcm5lcik7CisgICAgYXR0cmlidXRlc1t2KzJdLnBvc2l0aW9uWzBdID0gcnJlY3Rbcl0uYm91bmRzLngoKTsKKyAgICBhdHRyaWJ1dGVzW3YrMl0ucG9zaXRpb25bMV0gPSBycmVjdFtyXS5ib3VuZHMuYm90dG9tKCk7CisgICAgYXR0cmlidXRlc1t2KzJdLnJjb3JuZXIgPQorICAgICAgICBSQ29ybmVyKGF0dHJpYnV0ZXNbdisyXS5wb3NpdGlvbiwgcnJlY3Rbcl0ucmNvcm5lcik7CisgICAgYXR0cmlidXRlc1t2KzNdLnBvc2l0aW9uWzBdID0gcnJlY3Rbcl0uYm91bmRzLnJpZ2h0KCk7CisgICAgYXR0cmlidXRlc1t2KzNdLnBvc2l0aW9uWzFdID0gcnJlY3Rbcl0uYm91bmRzLmJvdHRvbSgpOworICAgIGF0dHJpYnV0ZXNbdiszXS5yY29ybmVyID0KKyAgICAgICAgUkNvcm5lcihhdHRyaWJ1dGVzW3YrM10ucG9zaXRpb24sIHJyZWN0W3JdLnJjb3JuZXIpOworCisgICAgZm9yIChpbnQgdCA9IHY7IHQgPCB2ICsgNDsgKyt0KSB7CisgICAgICBtYXRoOjpQb2ludEYgdGV4Y29vcmQoCisgICAgICAgICAgKGF0dHJpYnV0ZXNbdF0ucG9zaXRpb25bMF0gLSByZWN0Xy54KCkpICoga1dpZHRoU2NhbGUsCisgICAgICAgICAgKGF0dHJpYnV0ZXNbdF0ucG9zaXRpb25bMV0gLSByZWN0Xy55KCkpICoga0hlaWdodFNjYWxlKTsKKyAgICAgIHRleGNvb3JkID0gdGV4Y29vcmRfdHJhbnNmb3JtXyAqIHRleGNvb3JkOworICAgICAgYXR0cmlidXRlc1t0XS50ZXhjb29yZFswXSA9IHRleGNvb3JkLngoKTsKKyAgICAgIGF0dHJpYnV0ZXNbdF0udGV4Y29vcmRbMV0gPSB0ZXhjb29yZC55KCk7CisgICAgfQorCisgICAgYXR0cmlidXRlc1t2KzRdID0gYXR0cmlidXRlc1t2KzFdOworICAgIGF0dHJpYnV0ZXNbdis1XSA9IGF0dHJpYnV0ZXNbdisyXTsKKyAgICB2ICs9IDY7CisgIH0KKwogICB2ZXJ0ZXhfYnVmZmVyXyA9IGdyYXBoaWNzX3N0YXRlLT5BbGxvY2F0ZVZlcnRleERhdGEoc2l6ZW9mKGF0dHJpYnV0ZXMpKTsKICAgU2JNZW1vcnlDb3B5KHZlcnRleF9idWZmZXJfLCBhdHRyaWJ1dGVzLCBzaXplb2YoYXR0cmlidXRlcykpOwogCkBAIC0xMTksOCArMTM3LDggQEAKIHZvaWQgRHJhd1JSZWN0Q29sb3JUZXh0dXJlOjpFeGVjdXRlUmFzdGVyaXplKAogICAgIEdyYXBoaWNzU3RhdGUqIGdyYXBoaWNzX3N0YXRlLAogICAgIFNoYWRlclByb2dyYW1NYW5hZ2VyKiBwcm9ncmFtX21hbmFnZXIpIHsKLSAgU2hhZGVyUHJvZ3JhbTxTaGFkZXJWZXJ0ZXhPZmZzZXRUZXhjb29yZCwKLSAgICAgICAgICAgICAgICBTaGFkZXJGcmFnbWVudFRleGNvb3JkQ29sb3JScmVjdD4qIHByb2dyYW07CisgIFNoYWRlclByb2dyYW08U2hhZGVyVmVydGV4UmNvcm5lclRleGNvb3JkLAorICAgICAgICAgICAgICAgIFNoYWRlckZyYWdtZW50UmNvcm5lclRleGNvb3JkQ29sb3I+KiBwcm9ncmFtOwogICBwcm9ncmFtX21hbmFnZXItPkdldFByb2dyYW0oJnByb2dyYW0pOwogICBncmFwaGljc19zdGF0ZS0+VXNlUHJvZ3JhbShwcm9ncmFtLT5HZXRIYW5kbGUoKSk7CiAgIGdyYXBoaWNzX3N0YXRlLT5VcGRhdGVDbGlwQWRqdXN0bWVudCgKQEAgLTEzNSwxOSArMTUzLDE1IEBACiAgICAgICBzaXplb2YoVmVydGV4QXR0cmlidXRlcyksIHZlcnRleF9idWZmZXJfICsKICAgICAgIG9mZnNldG9mKFZlcnRleEF0dHJpYnV0ZXMsIHBvc2l0aW9uKSk7CiAgIGdyYXBoaWNzX3N0YXRlLT5WZXJ0ZXhBdHRyaWJQb2ludGVyKAotICAgICAgcHJvZ3JhbS0+R2V0VmVydGV4U2hhZGVyKCkuYV9vZmZzZXQoKSwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLAorICAgICAgcHJvZ3JhbS0+R2V0VmVydGV4U2hhZGVyKCkuYV9yY29ybmVyKCksIDQsIEdMX0ZMT0FULCBHTF9GQUxTRSwKICAgICAgIHNpemVvZihWZXJ0ZXhBdHRyaWJ1dGVzKSwgdmVydGV4X2J1ZmZlcl8gKwotICAgICAgb2Zmc2V0b2YoVmVydGV4QXR0cmlidXRlcywgb2Zmc2V0KSk7CisgICAgICBvZmZzZXRvZihWZXJ0ZXhBdHRyaWJ1dGVzLCByY29ybmVyKSk7CiAgIGdyYXBoaWNzX3N0YXRlLT5WZXJ0ZXhBdHRyaWJQb2ludGVyKAogICAgICAgcHJvZ3JhbS0+R2V0VmVydGV4U2hhZGVyKCkuYV90ZXhjb29yZCgpLCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsCiAgICAgICBzaXplb2YoVmVydGV4QXR0cmlidXRlcyksIHZlcnRleF9idWZmZXJfICsKICAgICAgIG9mZnNldG9mKFZlcnRleEF0dHJpYnV0ZXMsIHRleGNvb3JkKSk7CiAgIGdyYXBoaWNzX3N0YXRlLT5WZXJ0ZXhBdHRyaWJGaW5pc2goKTsKIAotICBTZXRSUmVjdFVuaWZvcm1zKHByb2dyYW0tPkdldEZyYWdtZW50U2hhZGVyKCkudV9yZWN0KCksCi0gICAgICAgICAgICAgICAgICAgcHJvZ3JhbS0+R2V0RnJhZ21lbnRTaGFkZXIoKS51X2Nvcm5lcnMoKSwKLSAgICAgICAgICAgICAgICAgICBiYXNlX3N0YXRlXy5yb3VuZGVkX3NjaXNzb3JfcmVjdCwKLSAgICAgICAgICAgICAgICAgICAqYmFzZV9zdGF0ZV8ucm91bmRlZF9zY2lzc29yX2Nvcm5lcnMsIDAuNWYpOwogICBHTF9DQUxMKGdsVW5pZm9ybTRmKHByb2dyYW0tPkdldEZyYWdtZW50U2hhZGVyKCkudV9jb2xvcigpLAogICAgICAgICAgICAgICAgICAgICAgIGNvbG9yXy5yKCksIGNvbG9yXy5nKCksIGNvbG9yXy5iKCksIGNvbG9yXy5hKCkpKTsKICAgR0xfQ0FMTChnbFVuaWZvcm00ZnYocHJvZ3JhbS0+R2V0RnJhZ21lbnRTaGFkZXIoKS51X3RleGNvb3JkX2NsYW1wKCksIDEsCkBAIC0xNTcsNyArMTcxLDcgQEAKICAgICBncmFwaGljc19zdGF0ZS0+QWN0aXZlQmluZFRleHR1cmUoCiAgICAgICAgIHByb2dyYW0tPkdldEZyYWdtZW50U2hhZGVyKCkudV90ZXh0dXJlX3RleHVuaXQoKSwKICAgICAgICAgdGV4dHVyZV8tPkdldFRhcmdldCgpLCB0ZXh0dXJlXy0+Z2xfaGFuZGxlKCksIEdMX1JFUEVBVCk7Ci0gICAgR0xfQ0FMTChnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfRkFOLCAwLCBrVmVydGV4Q291bnQpKTsKKyAgICBHTF9DQUxMKGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRVMsIDAsIGtWZXJ0ZXhDb3VudCkpOwogICAgIGdyYXBoaWNzX3N0YXRlLT5BY3RpdmVCaW5kVGV4dHVyZSgKICAgICAgICAgcHJvZ3JhbS0+R2V0RnJhZ21lbnRTaGFkZXIoKS51X3RleHR1cmVfdGV4dW5pdCgpLAogICAgICAgICB0ZXh0dXJlXy0+R2V0VGFyZ2V0KCksIHRleHR1cmVfLT5nbF9oYW5kbGUoKSwgR0xfQ0xBTVBfVE9fRURHRSk7CkBAIC0xNjUsMTMgKzE3OSwxMyBAQAogICAgIGdyYXBoaWNzX3N0YXRlLT5BY3RpdmVCaW5kVGV4dHVyZSgKICAgICAgICAgcHJvZ3JhbS0+R2V0RnJhZ21lbnRTaGFkZXIoKS51X3RleHR1cmVfdGV4dW5pdCgpLAogICAgICAgICB0ZXh0dXJlXy0+R2V0VGFyZ2V0KCksIHRleHR1cmVfLT5nbF9oYW5kbGUoKSk7Ci0gICAgR0xfQ0FMTChnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfRkFOLCAwLCBrVmVydGV4Q291bnQpKTsKKyAgICBHTF9DQUxMKGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRVMsIDAsIGtWZXJ0ZXhDb3VudCkpOwogICB9CiB9CiAKIGJhc2U6OlR5cGVJZCBEcmF3UlJlY3RDb2xvclRleHR1cmU6OkdldFR5cGVJZCgpIGNvbnN0IHsKLSAgcmV0dXJuIFNoYWRlclByb2dyYW08U2hhZGVyVmVydGV4T2Zmc2V0VGV4Y29vcmQsCi0gICAgICAgICAgICAgICAgICAgICAgIFNoYWRlckZyYWdtZW50VGV4Y29vcmRDb2xvclJyZWN0Pjo6R2V0VHlwZUlkKCk7CisgIHJldHVybiBTaGFkZXJQcm9ncmFtPFNoYWRlclZlcnRleFJjb3JuZXJUZXhjb29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgU2hhZGVyRnJhZ21lbnRSY29ybmVyVGV4Y29vcmRDb2xvcj46OkdldFR5cGVJZCgpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgZWdsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2RyYXdfcnJlY3RfY29sb3JfdGV4dHVyZS5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9kcmF3X3JyZWN0X2NvbG9yX3RleHR1cmUuaAppbmRleCBjNjUzNDdlLi45OGE1Yzg0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2RyYXdfcnJlY3RfY29sb3JfdGV4dHVyZS5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19ycmVjdF9jb2xvcl90ZXh0dXJlLmgKQEAgLTQ0LDYgKzQ0LDEyIEBACiAgIGJhc2U6OlR5cGVJZCBHZXRUeXBlSWQoKSBjb25zdCBPVkVSUklERTsKIAogIHByaXZhdGU6CisgIHN0cnVjdCBWZXJ0ZXhBdHRyaWJ1dGVzIHsKKyAgICBmbG9hdCBwb3NpdGlvblsyXTsKKyAgICBmbG9hdCB0ZXhjb29yZFsyXTsKKyAgICBSQ29ybmVyIHJjb3JuZXI7CisgIH07CisKICAgbWF0aDo6TWF0cml4M0YgdGV4Y29vcmRfdHJhbnNmb3JtXzsKICAgbWF0aDo6UmVjdEYgcmVjdF87CiAgIHJlbmRlcl90cmVlOjpDb2xvclJHQkEgY29sb3JfOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJfcHJvZ3JhbV9tYW5hZ2VyLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJfcHJvZ3JhbV9tYW5hZ2VyLmNjCmluZGV4IDA0MTg5OTIuLjc0YWJhNGIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVyX3Byb2dyYW1fbWFuYWdlci5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcl9wcm9ncmFtX21hbmFnZXIuY2MKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC91dGlscy5oIgorI2luY2x1ZGUgImVnbC9nZW5lcmF0ZWRfc2hhZGVyX2ltcGwuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2UgcmVuZGVyZXIgewpAQCAtMjQsNiArMjUsMTMgQEAKIG5hbWVzcGFjZSBlZ2wgewogCiBTaGFkZXJQcm9ncmFtTWFuYWdlcjo6U2hhZGVyUHJvZ3JhbU1hbmFnZXIoKSB7CisgIC8vIFRoZXNlIGFyZSBzaGFkZXJzIHRoYXQgZ2V0IGluc3RhbnRpYXRlZCBkdXJpbmcgdmlkZW8gcGxheWJhY2sgd2hlbiB0aGUKKyAgLy8gdXNlcnMgc3RhcnRzIGludGVyYWN0aW5nIHdpdGggdGhlIHRyYW5zcG9ydCBjb250cm9scy4gVGhleSBhcmUgcHJlbG9hZGVkCisgIC8vIHRvIHByZXZlbnQgVUktaGljY3Vwcy4KKyAgLy8gVGhlc2Ugc2hhZGVycyBhcmUgZ2VuZXJhdGVkIGZyb20gZWdsL2dlbmVyYXRlZF9zaGFkZXJfaW1wbC5oCisgIFByZWxvYWQ8U2hhZGVyVmVydGV4T2Zmc2V0UmNvcm5lciwgU2hhZGVyRnJhZ21lbnRDb2xvckJsdXJScmVjdHM+KCk7CisgIFByZWxvYWQ8U2hhZGVyVmVydGV4Q29sb3JPZmZzZXQsIFNoYWRlckZyYWdtZW50Q29sb3JJbmNsdWRlPigpOworICBQcmVsb2FkPFNoYWRlclZlcnRleFJjb3JuZXJUZXhjb29yZCwgU2hhZGVyRnJhZ21lbnRSY29ybmVyVGV4Y29vcmRDb2xvcj4oKTsKIH0KIAogU2hhZGVyUHJvZ3JhbU1hbmFnZXI6On5TaGFkZXJQcm9ncmFtTWFuYWdlcigpIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVyX3Byb2dyYW1fbWFuYWdlci5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJfcHJvZ3JhbV9tYW5hZ2VyLmgKaW5kZXggZjljMzk2ZS4uNzE4NGU1NyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJfcHJvZ3JhbV9tYW5hZ2VyLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJfcHJvZ3JhbV9tYW5hZ2VyLmgKQEAgLTQ0LDYgKzQ0LDkgQEAKICAgU2hhZGVyUHJvZ3JhbUJhc2UqIEZpbmRQcm9ncmFtKGJhc2U6OlR5cGVJZCBwcm9ncmFtX3R5cGVfaWQpOwogICB2b2lkIEFkZFByb2dyYW0oYmFzZTo6VHlwZUlkIHByb2dyYW1fdHlwZV9pZCwgU2hhZGVyUHJvZ3JhbUJhc2UqIHByb2dyYW0pOwogCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBWZXJ0ZXh0U2hhZGVyVCwgdHlwZW5hbWUgRnJhZ21lbnRTaGFkZXJUPgorICB2b2lkIFByZWxvYWQoKTsKKwogICB0eXBlZGVmIGJhc2U6OmxpbmtlZF9oYXNoX21hcDxiYXNlOjpUeXBlSWQsIFNoYWRlclByb2dyYW1CYXNlKj4gUHJvZ3JhbU1hcDsKICAgUHJvZ3JhbU1hcCBwcm9ncmFtX21hcF87CiB9OwpAQCAtNTksNiArNjIsMTIgQEAKICAgKm91dF9wcm9ncmFtID0gYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8U2hhZGVyUHJvZ3JhbVR5cGUqPihwcm9ncmFtKTsKIH0KIAordGVtcGxhdGUgPHR5cGVuYW1lIFZlcnRleHRTaGFkZXJULCB0eXBlbmFtZSBGcmFnbWVudFNoYWRlclQ+CitpbmxpbmUgdm9pZCBTaGFkZXJQcm9ncmFtTWFuYWdlcjo6UHJlbG9hZCgpIHsKKyAgU2hhZGVyUHJvZ3JhbTxWZXJ0ZXh0U2hhZGVyVCwgRnJhZ21lbnRTaGFkZXJUPiogcHJvZ3JhbTsKKyAgR2V0UHJvZ3JhbSgmcHJvZ3JhbSk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBlZ2wKIH0gIC8vIG5hbWVzcGFjZSByYXN0ZXJpemVyCiB9ICAvLyBuYW1lc3BhY2UgcmVuZGVyZXIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy9mcmFnbWVudF9jb2xvcl9iZXR3ZWVuX3JyZWN0cy5nbHNsIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL2ZyYWdtZW50X2NvbG9yX2JldHdlZW5fcnJlY3RzLmdsc2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyODk3YWQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL2ZyYWdtZW50X2NvbG9yX2JldHdlZW5fcnJlY3RzLmdsc2wKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLS8vDQotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLS8vDQotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLS8vDQotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLXByZWNpc2lvbiBtZWRpdW1wIGZsb2F0Ow0KLQ0KLS8vIEEgcm91bmRlZCByZWN0IGlzIHJlcHJlc2VudGVkIGJ5IGEgdmVjNCBzcGVjaWZ5aW5nIChtaW4ueHksIG1heC54eSksIGFuZCBhDQotLy8gbWF0cml4IG9mIGNvcm5lcnMuIEVhY2ggdmVjdG9yIGluIHRoZSBtYXRyaXggcmVwcmVzZW50cyBhIGNvcm5lciAob3JkZXI6DQotLy8gdG9wIGxlZnQsIHRvcCByaWdodCwgYm90dG9tIGxlZnQsIGJvdHRvbSByaWdodCkuIEVhY2ggY29ybmVyIHZlYzQgcmVwcmVzZW50cw0KLS8vIChzdGFydC54eSwgcmFkaXVzLnh5KS4NCi11bmlmb3JtIHZlYzQgdV9pbm5lcl9yZWN0Ow0KLXVuaWZvcm0gbWF0NCB1X2lubmVyX2Nvcm5lcnM7DQotdW5pZm9ybSB2ZWM0IHVfb3V0ZXJfcmVjdDsNCi11bmlmb3JtIG1hdDQgdV9vdXRlcl9jb3JuZXJzOw0KLQ0KLXZhcnlpbmcgdmVjMiB2X29mZnNldDsNCi12YXJ5aW5nIHZlYzQgdl9jb2xvcjsNCi0NCi0jaW5jbHVkZSAiZnVuY3Rpb25faXNfb3V0c2lkZV9ycmVjdC5pbmMiDQotDQotdm9pZCBtYWluKCkgew0KLSAgZmxvYXQgaW5uZXJfc2NhbGUgPSBJc091dHNpZGVSUmVjdCh2X29mZnNldCwgdV9pbm5lcl9yZWN0LCB1X2lubmVyX2Nvcm5lcnMpOw0KLSAgZmxvYXQgb3V0ZXJfc2NhbGUgPSBJc091dHNpZGVSUmVjdCh2X29mZnNldCwgdV9vdXRlcl9yZWN0LCB1X291dGVyX2Nvcm5lcnMpOw0KLSAgZ2xfRnJhZ0NvbG9yID0gdl9jb2xvciAqIChpbm5lcl9zY2FsZSAqICgxLjAgLSBvdXRlcl9zY2FsZSkpOw0KLX0NCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvZnJhZ21lbnRfY29sb3JfYmx1ci5nbHNsIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL2ZyYWdtZW50X2NvbG9yX2JsdXIuZ2xzbAppbmRleCA1MGViZDZhLi40ZjE1NTcxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvZnJhZ21lbnRfY29sb3JfYmx1ci5nbHNsCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy9mcmFnbWVudF9jb2xvcl9ibHVyLmdsc2wKQEAgLTEzLDExICsxMywxMiBAQAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQogDQogcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7DQorDQordW5pZm9ybSB2ZWM0IHVfY29sb3I7DQogdW5pZm9ybSB2ZWM0IHVfYmx1cl9yZWN0Ow0KIHVuaWZvcm0gdmVjMiB1X3NjYWxlX2FkZDsNCiANCiB2YXJ5aW5nIHZlYzIgdl9vZmZzZXQ7DQotdmFyeWluZyB2ZWM0IHZfY29sb3I7DQogDQogI2luY2x1ZGUgImZ1bmN0aW9uX2dhdXNzaWFuX2ludGVncmFsLmluYyINCiANCkBAIC0yNyw1ICsyOCw1IEBACiAgIGZsb2F0IGludGVncmFsID0gR2F1c3NpYW5JbnRlZ3JhbCh1X2JsdXJfcmVjdC54eiAtIHZfb2Zmc2V0Lnh4KSAqDQogICAgICAgICAgICAgICAgICAgIEdhdXNzaWFuSW50ZWdyYWwodV9ibHVyX3JlY3QueXcgLSB2X29mZnNldC55eSk7DQogICBmbG9hdCBibHVyX3NjYWxlID0gaW50ZWdyYWwgKiB1X3NjYWxlX2FkZC54ICsgdV9zY2FsZV9hZGQueTsNCi0gIGdsX0ZyYWdDb2xvciA9IHZfY29sb3IgKiBibHVyX3NjYWxlOw0KKyAgZ2xfRnJhZ0NvbG9yID0gdV9jb2xvciAqIGJsdXJfc2NhbGU7DQogfQ0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy9mcmFnbWVudF9jb2xvcl9ibHVyX3JyZWN0cy5nbHNsIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL2ZyYWdtZW50X2NvbG9yX2JsdXJfcnJlY3RzLmdsc2wKaW5kZXggZWU4YzRhZS4uZWZjODc0NyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL2ZyYWdtZW50X2NvbG9yX2JsdXJfcnJlY3RzLmdsc2wKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL2ZyYWdtZW50X2NvbG9yX2JsdXJfcnJlY3RzLmdsc2wKQEAgLTE0LDEzICsxNCw2IEBACiANCiBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsNCiANCi0vLyBBIHJvdW5kZWQgcmVjdCBpcyByZXByZXNlbnRlZCBieSBhIHZlYzQgc3BlY2lmeWluZyAobWluLnh5LCBtYXgueHkpDQotLy8gYW5kIGEgbWF0cml4IG9mIGNvcm5lcnMuIEVhY2ggdmVjdG9yIGluIHRoZSBtYXRyaXggcmVwcmVzZW50cyBhIGNvcm5lcg0KLS8vIChvcmRlcjogdG9wIGxlZnQsIHRvcCByaWdodCwgYm90dG9tIGxlZnQsIGJvdHRvbSByaWdodCkuIEVhY2ggY29ybmVyIHZlYzQNCi0vLyByZXByZXNlbnRzIChzdGFydC54eSwgcmFkaXVzLnh5KS4NCi11bmlmb3JtIHZlYzQgdV9zY2lzc29yX3JlY3Q7DQotdW5pZm9ybSBtYXQ0IHVfc2Npc3Nvcl9jb3JuZXJzOw0KLQ0KIC8vIFRoZSByb3VuZGVkIHNwcmVhZCByZWN0IGlzIHJlcHJlc2VudGVkIGluIGEgd2F5IHRvIG9wdGltaXplIGNhbGN1bGF0aW9uIG9mDQogLy8gdGhlIGV4dGVudHMuIEVhY2ggZWxlbWVudCBvZiBhIHZlYzQgcmVwcmVzZW50cyBhIGNvcm5lcidzIHZhbHVlIC0tIG9yZGVyDQogLy8gaXMgdG9wIGxlZnQsIHRvcCByaWdodCwgYm90dG9tIGxlZnQsIGJvdHRvbSByaWdodC4gRXh0ZW50cyBmb3IgZWFjaCBjb3JuZXINCkBAIC00OSwxNCArNDIsMTYgQEAKIC8vIGluc2V0IHNoYWRvdyB3aXRoIHNjaXNzb3IgcmVjdCBiZWhhdmluZyBhcyBhbiBpbmNsdXNpdmUgc2Npc3Nvci4NCiB1bmlmb3JtIHZlYzIgdV9zY2FsZV9hZGQ7DQogDQordW5pZm9ybSB2ZWM0IHVfY29sb3I7DQorDQogLy8gQmx1ciBjYWxjdWxhdGlvbnMgaGFwcGVuIGluIHRlcm1zIGluIHNpZ21hIGRpc3RhbmNlcy4gVXNlIHNpZ21hX3NjYWxlIHRvDQogLy8gdHJhbnNsYXRlIHBpeGVsIGRpc3RhbmNlcyBpbnRvIHNpZ21hIGRpc3RhbmNlcy4NCiB1bmlmb3JtIHZlYzIgdV9zaWdtYV9zY2FsZTsNCiANCiB2YXJ5aW5nIHZlYzIgdl9vZmZzZXQ7DQotdmFyeWluZyB2ZWM0IHZfY29sb3I7DQordmFyeWluZyB2ZWM0IHZfcmNvcm5lcjsNCiANCi0jaW5jbHVkZSAiZnVuY3Rpb25faXNfb3V0c2lkZV9ycmVjdC5pbmMiDQorI2luY2x1ZGUgImZ1bmN0aW9uX2lzX291dHNpZGVfcmNvcm5lci5pbmMiDQogI2luY2x1ZGUgImZ1bmN0aW9uX2dhdXNzaWFuX2ludGVncmFsLmluYyINCiANCiB2ZWMyIEdldFhFeHRlbnRzKGZsb2F0IHkpIHsNCkBAIC0xMjYsOCArMTIxLDcgQEAKIA0KIHZvaWQgbWFpbigpIHsNCiAgIGZsb2F0IHNjaXNzb3Jfc2NhbGUgPQ0KLSAgICAgIElzT3V0c2lkZVJSZWN0KHZfb2Zmc2V0LCB1X3NjaXNzb3JfcmVjdCwgdV9zY2lzc29yX2Nvcm5lcnMpICoNCi0gICAgICB1X3NjYWxlX2FkZC54ICsgdV9zY2FsZV9hZGQueTsNCisgICAgICBJc091dHNpZGVSQ29ybmVyKHZfcmNvcm5lcikgKiB1X3NjYWxlX2FkZC54ICsgdV9zY2FsZV9hZGQueTsNCiAgIGZsb2F0IGJsdXJfc2NhbGUgPSBHZXRCbHVyKHZfb2Zmc2V0KSAqIHVfc2NhbGVfYWRkLnggKyB1X3NjYWxlX2FkZC55Ow0KLSAgZ2xfRnJhZ0NvbG9yID0gdl9jb2xvciAqIChibHVyX3NjYWxlICogc2Npc3Nvcl9zY2FsZSk7DQorICBnbF9GcmFnQ29sb3IgPSB1X2NvbG9yICogKGJsdXJfc2NhbGUgKiBzY2lzc29yX3NjYWxlKTsNCiB9DQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL2ZyYWdtZW50X2NvbG9yX3JyZWN0Lmdsc2wgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvZnJhZ21lbnRfY29sb3JfcnJlY3QuZ2xzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY1NDllZC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvZnJhZ21lbnRfY29sb3JfcnJlY3QuZ2xzbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotLy8NCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotLy8NCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotLy8NCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7DQotDQotLy8gQSByb3VuZGVkIHJlY3QgaXMgcmVwcmVzZW50ZWQgYnkgYSB2ZWM0IHNwZWNpZnlpbmcgKG1pbi54eSwgbWF4Lnh5KSwgYW5kIGENCi0vLyBtYXRyaXggb2YgY29ybmVycy4gRWFjaCB2ZWN0b3IgaW4gdGhlIG1hdHJpeCByZXByZXNlbnRzIGEgY29ybmVyIChvcmRlcjoNCi0vLyB0b3AgbGVmdCwgdG9wIHJpZ2h0LCBib3R0b20gbGVmdCwgYm90dG9tIHJpZ2h0KS4gRWFjaCBjb3JuZXIgdmVjNCByZXByZXNlbnRzDQotLy8gKHN0YXJ0Lnh5LCByYWRpdXMueHkpLg0KLXVuaWZvcm0gdmVjNCB1X3JlY3Q7DQotdW5pZm9ybSBtYXQ0IHVfY29ybmVyczsNCi0NCi12YXJ5aW5nIHZlYzIgdl9vZmZzZXQ7DQotdmFyeWluZyB2ZWM0IHZfY29sb3I7DQotDQotI2luY2x1ZGUgImZ1bmN0aW9uX2lzX291dHNpZGVfcnJlY3QuaW5jIg0KLQ0KLXZvaWQgbWFpbigpIHsNCi0gIGZsb2F0IHNjYWxlID0gSXNPdXRzaWRlUlJlY3Qodl9vZmZzZXQsIHVfcmVjdCwgdV9jb3JuZXJzKTsNCi0gIGdsX0ZyYWdDb2xvciA9IHZfY29sb3IgKiAoMS4wIC0gc2NhbGUpOw0KLX0NCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvZnJhZ21lbnRfcmNvcm5lcjJfY29sb3IuZ2xzbCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy9mcmFnbWVudF9yY29ybmVyMl9jb2xvci5nbHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YTg2MDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvZnJhZ21lbnRfcmNvcm5lcjJfY29sb3IuZ2xzbApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vDQorLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKy8vDQorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKy8vDQorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KK3ByZWNpc2lvbiBtZWRpdW1wIGZsb2F0Ow0KKw0KK3VuaWZvcm0gdmVjNCB1X2NvbG9yOw0KK3ZhcnlpbmcgdmVjNCB2X3Jjb3JuZXJfaW5uZXI7DQordmFyeWluZyB2ZWM0IHZfcmNvcm5lcl9vdXRlcjsNCisNCisjaW5jbHVkZSAiZnVuY3Rpb25faXNfb3V0c2lkZV9yY29ybmVyLmluYyINCisNCit2b2lkIG1haW4oKSB7DQorICBmbG9hdCBpbm5lcl9zY2FsZSA9IElzT3V0c2lkZVJDb3JuZXIodl9yY29ybmVyX2lubmVyKTsNCisgIGZsb2F0IG91dGVyX3NjYWxlID0gMS4wIC0gSXNPdXRzaWRlUkNvcm5lcih2X3Jjb3JuZXJfb3V0ZXIpOw0KKyAgZ2xfRnJhZ0NvbG9yID0gdV9jb2xvciAqIChpbm5lcl9zY2FsZSAqIG91dGVyX3NjYWxlKTsNCit9DQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL2ZyYWdtZW50X3Jjb3JuZXJfY29sb3IuZ2xzbCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy9mcmFnbWVudF9yY29ybmVyX2NvbG9yLmdsc2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJjMjQyNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy9mcmFnbWVudF9yY29ybmVyX2NvbG9yLmdsc2wKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisvLw0KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisvLw0KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisvLw0KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisNCitwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsNCisNCit1bmlmb3JtIHZlYzQgdV9jb2xvcjsNCit2YXJ5aW5nIHZlYzQgdl9yY29ybmVyOw0KKw0KKyNpbmNsdWRlICJmdW5jdGlvbl9pc19vdXRzaWRlX3Jjb3JuZXIuaW5jIg0KKw0KK3ZvaWQgbWFpbigpIHsNCisgIGZsb2F0IHNjYWxlID0gSXNPdXRzaWRlUkNvcm5lcih2X3Jjb3JuZXIpOw0KKyAgZ2xfRnJhZ0NvbG9yID0gdV9jb2xvciAqICgxLjAgLSBzY2FsZSk7DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy9mcmFnbWVudF9yY29ybmVyX3RleGNvb3JkX2NvbG9yLmdsc2wgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvZnJhZ21lbnRfcmNvcm5lcl90ZXhjb29yZF9jb2xvci5nbHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NzYzMTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvZnJhZ21lbnRfcmNvcm5lcl90ZXhjb29yZF9jb2xvci5nbHNsCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8NCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorLy8NCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorLy8NCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorDQorcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7DQorDQordW5pZm9ybSB2ZWM0IHVfY29sb3I7DQordW5pZm9ybSB2ZWM0IHVfdGV4Y29vcmRfY2xhbXA7DQordW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlOw0KKw0KK3ZhcnlpbmcgdmVjNCB2X3Jjb3JuZXI7DQordmFyeWluZyB2ZWMyIHZfdGV4Y29vcmQ7DQorDQorI2luY2x1ZGUgImZ1bmN0aW9uX2lzX291dHNpZGVfcmNvcm5lci5pbmMiDQorDQordm9pZCBtYWluKCkgew0KKyAgZmxvYXQgc2NhbGUgPSBJc091dHNpZGVSQ29ybmVyKHZfcmNvcm5lcik7DQorICBnbF9GcmFnQ29sb3IgPSB1X2NvbG9yICogKDEuMCAtIHNjYWxlKSAqIHRleHR1cmUyRCh1X3RleHR1cmUsDQorICAgICAgY2xhbXAodl90ZXhjb29yZCwgdV90ZXhjb29yZF9jbGFtcC54eSwgdV90ZXhjb29yZF9jbGFtcC56dykpOw0KK30NCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvZnJhZ21lbnRfdGV4Y29vcmRfY29sb3JfcnJlY3QuZ2xzbCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy9mcmFnbWVudF90ZXhjb29yZF9jb2xvcl9ycmVjdC5nbHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGEyNWFkLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy9mcmFnbWVudF90ZXhjb29yZF9jb2xvcl9ycmVjdC5nbHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0vLw0KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0vLw0KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0vLw0KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsNCi0NCi11bmlmb3JtIHZlYzQgdV9jb2xvcjsNCi11bmlmb3JtIHZlYzQgdV90ZXhjb29yZF9jbGFtcDsNCi11bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7DQotDQotLy8gQSByb3VuZGVkIHJlY3QgaXMgcmVwcmVzZW50ZWQgYnkgYSB2ZWM0IHNwZWNpZnlpbmcgKG1pbi54eSwgbWF4Lnh5KSwgYW5kIGENCi0vLyBtYXRyaXggb2YgY29ybmVycy4gRWFjaCB2ZWN0b3IgaW4gdGhlIG1hdHJpeCByZXByZXNlbnRzIGEgY29ybmVyIChvcmRlcjoNCi0vLyB0b3AgbGVmdCwgdG9wIHJpZ2h0LCBib3R0b20gbGVmdCwgYm90dG9tIHJpZ2h0KS4gRWFjaCBjb3JuZXIgdmVjNCByZXByZXNlbnRzDQotLy8gKHN0YXJ0Lnh5LCByYWRpdXMueHkpLg0KLXVuaWZvcm0gdmVjNCB1X3JlY3Q7DQotdW5pZm9ybSBtYXQ0IHVfY29ybmVyczsNCi0NCi12YXJ5aW5nIHZlYzIgdl9vZmZzZXQ7DQotdmFyeWluZyB2ZWMyIHZfdGV4Y29vcmQ7DQotDQotI2luY2x1ZGUgImZ1bmN0aW9uX2lzX291dHNpZGVfcnJlY3QuaW5jIg0KLQ0KLXZvaWQgbWFpbigpIHsNCi0gIGZsb2F0IHNjYWxlID0gSXNPdXRzaWRlUlJlY3Qodl9vZmZzZXQsIHVfcmVjdCwgdV9jb3JuZXJzKTsNCi0gIGdsX0ZyYWdDb2xvciA9IHVfY29sb3IgKiAoMS4wIC0gc2NhbGUpICogdGV4dHVyZTJEKHVfdGV4dHVyZSwNCi0gICAgICBjbGFtcCh2X3RleGNvb3JkLCB1X3RleGNvb3JkX2NsYW1wLnh5LCB1X3RleGNvb3JkX2NsYW1wLnp3KSk7DQotfQ0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy9mdW5jdGlvbl9pc19vdXRzaWRlX3Jjb3JuZXIuaW5jIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL2Z1bmN0aW9uX2lzX291dHNpZGVfcmNvcm5lci5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIzM2FlOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy9mdW5jdGlvbl9pc19vdXRzaWRlX3Jjb3JuZXIuaW5jCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8NCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorLy8NCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorLy8NCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorDQorLy8gUmV0dXJuIDAgaWYgdGhlIGdpdmVuIHBvc2l0aW9uIGlzIGluc2lkZSB0aGUgcm91bmRlZCBjb3JuZXIsIG9yIHNjYWxlDQorLy8gdG93YXJkcyAxIGFzIGl0IGdvZXMgb3V0c2lkZSBhIDEtcGl4ZWwgYW50aS1hbGlhc2luZyBib3JkZXIuDQorLy8gfHJjb3JuZXJ8IGlzIGEgdmVjNCByZXByZXNlbnRpbmcgKHNjYWxlZC54eSwgMSAvIHJhZGl1cy54eSkgd2l0aCBzY2FsZWQueHkNCisvLyAgIHJlcHJlc2VudGluZyB0aGUgb2Zmc2V0IG9mIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRlcm1zIG9mIHJhZGl1cy54eQ0KKy8vICAgKGkuZS4gb2Zmc2V0Lnh5IC8gcmFkaXVzLnh5KS4gVGhlIHNjYWxlZC54eSB2YWx1ZXMgY2FuIGJlIG5lZ2F0aXZlIGlmIHRoZQ0KKy8vICAgY3VycmVudCBwb3NpdGlvbiBpcyBvdXRzaWRlIHRoZSBjb3JuZXIgc3RhcnQuDQorZmxvYXQgSXNPdXRzaWRlUkNvcm5lcih2ZWM0IHJjb3JuZXIpIHsNCisgIC8vIEVzdGltYXRlIHRoZSBkaXN0YW5jZSB0byBhbiBpbXBsaWNpdCBmdW5jdGlvbiB1c2luZw0KKyAgLy8gICBkaXN0ID0gZih4LHkpIC8gbGVuZ3RoKGdyYWRpZW50KGYoeCx5KSkpDQorICAvLyBGb3IgYW4gZWxsaXBzZSwgZih4LHkpID0geF4yIC8gYV4yICsgeV4yIC8gYl4yIC0gMS4NCisgIHZlYzIgc2NhbGVkID0gbWF4KHJjb3JuZXIueHksIDAuMCk7DQorICBmbG9hdCBpbXBsaWNpdCA9IGRvdChzY2FsZWQsIHNjYWxlZCkgLSAxLjA7DQorDQorICAvLyBOT1RFOiBUbyBhY2NvbW1vZGF0ZSBsYXJnZSByYWRpdXMgdmFsdWVzIHVzaW5nIG1lZGl1bXAgZmxvYXRzLCByY29ybmVyLnp3DQorICAvLyAgIHdhcyBzY2FsZWQgYnkga1JDb3JuZXJHcmFkaWVudFNjYWxlIGluIHRoZSB2ZXJ0ZXggYXR0cmlidXRlIGRhdGEuDQorICAvLyAgIE11bHRpcGx5IGludl9ncmFkaWVudCBieSBrUkNvcm5lckdyYWRpZW50U2NhbGUgdG8gdW5kbyB0aGF0IHNjYWxpbmcuDQorICBjb25zdCBmbG9hdCBrUkNvcm5lckdyYWRpZW50U2NhbGUgPSAxNi4wOw0KKyAgdmVjMiBncmFkaWVudCA9IDIuMCAqIHNjYWxlZCAqIHJjb3JuZXIuenc7DQorICBmbG9hdCBpbnZfZ3JhZGllbnQgPSBrUkNvcm5lckdyYWRpZW50U2NhbGUgKg0KKyAgICAgIGludmVyc2VzcXJ0KG1heChkb3QoZ3JhZGllbnQsIGdyYWRpZW50KSwgMC4wMDAxKSk7DQorDQorICByZXR1cm4gY2xhbXAoMC41ICsgaW1wbGljaXQgKiBpbnZfZ3JhZGllbnQsIDAuMCwgMS4wKTsNCit9DQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL2Z1bmN0aW9uX2lzX291dHNpZGVfcnJlY3QuaW5jIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL2Z1bmN0aW9uX2lzX291dHNpZGVfcnJlY3QuaW5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2U1OGI5Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy9mdW5jdGlvbl9pc19vdXRzaWRlX3JyZWN0LmluYworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotLy8NCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotLy8NCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotLy8NCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotLy8gUmV0dXJuIDAgaWYgdGhlIGdpdmVuIHBvaW50IGlzIGluc2lkZSB0aGUgcm91bmRlZCByZWN0LCBvciBzY2FsZSB0b3dhcmRzIDENCi0vLyBhcyBpdCBnb2VzIG91dHNpZGUgYSAxLXBpeGVsIGFudGktYWxpYXNpbmcgYm9yZGVyLg0KLS8vIHxyZWN0fCByZXByZXNlbnRzIChtaW4ueHksIG1heC54eSkgb2YgdGhlIGVuY29tcGFzc2luZyByZWN0YW5nbGUuDQotLy8gfGNvcm5lcnN8IGlzIGEgbWF0cml4IHdpdGggZWFjaCB2ZWM0IHJlcHJlc2VudGluZyAoc3RhcnQueHksIHJhZGl1cy54eSkgb2YNCi0vLyAgIGEgY29ybmVyLiBUaGUgb3JkZXIgaXMgdG9wIGxlZnQsIHRvcCByaWdodCwgYm90dG9tIGxlZnQsIGJvdHRvbSByaWdodC4NCi1mbG9hdCBJc091dHNpZGVSUmVjdCh2ZWMyIHBvaW50LCB2ZWM0IHJlY3QsIG1hdDQgY29ybmVycykgew0KLSAgdmVjNCBzZWxlY3RfY29ybmVyID0gdmVjNCgNCi0gICAgICBzdGVwKHBvaW50LngsIGNvcm5lcnNbMF0ueCkgKiBzdGVwKHBvaW50LnksIGNvcm5lcnNbMF0ueSksDQotICAgICAgc3RlcChjb3JuZXJzWzFdLngsIHBvaW50LngpICogc3RlcChwb2ludC55LCBjb3JuZXJzWzFdLnkpLA0KLSAgICAgIHN0ZXAocG9pbnQueCwgY29ybmVyc1syXS54KSAqIHN0ZXAoY29ybmVyc1syXS55LCBwb2ludC55KSwNCi0gICAgICBzdGVwKGNvcm5lcnNbM10ueCwgcG9pbnQueCkgKiBzdGVwKGNvcm5lcnNbM10ueSwgcG9pbnQueSkpOw0KLSAgaWYgKGRvdChzZWxlY3RfY29ybmVyLCB2ZWM0KDEuMCkpID4gMC41KSB7DQotICAgIC8vIEVzdGltYXRlIHRoZSBhbW91bnQgb2YgYW50aS1hbGlhc2luZyB0aGF0IHNob3VsZCBiZSB1c2VkIGJ5IGNvbXBhcmluZw0KLSAgICAvLyB4XjIgLyBhXjIgKyB5XjIgLyBiXjIgZm9yIHRoZSBlbGxpcHNlIGFuZCBlbGxpcHNlICsgMSBwaXhlbC4NCi0gICAgdmVjNCBjb3JuZXIgPSBjb3JuZXJzICogc2VsZWN0X2Nvcm5lcjsNCi0gICAgdmVjMiBwaXhlbF9vZmZzZXQgPSBwb2ludCAtIGNvcm5lci54eTsNCi0NCi0gICAgaWYgKGFicyhjb3JuZXIueiAtIGNvcm5lci53KSA8IDAuMSkgew0KLSAgICAgIC8vIFRoaXMgaXMgYSBzcXVhcmUgb3Igcm91bmQgY29ybmVyLg0KLSAgICAgIHJldHVybiBjbGFtcChsZW5ndGgocGl4ZWxfb2Zmc2V0KSAtIGNvcm5lci56LCAwLjAsIDEuMCk7DQotICAgIH0NCi0NCi0gICAgdmVjMiBvZmZzZXRfbWluID0gcGl4ZWxfb2Zmc2V0IC8gY29ybmVyLnp3Ow0KLSAgICB2ZWMyIG9mZnNldF9tYXggPSBwaXhlbF9vZmZzZXQgLyAoY29ybmVyLnp3ICsgdmVjMigxLjApKTsNCi0gICAgZmxvYXQgcmVzdWx0X21pbiA9IGRvdChvZmZzZXRfbWluLCBvZmZzZXRfbWluKTsNCi0gICAgZmxvYXQgcmVzdWx0X21heCA9IGRvdChvZmZzZXRfbWF4LCBvZmZzZXRfbWF4KTsNCi0NCi0gICAgLy8gUmV0dXJuIDEuMCBpZiBvdXRzaWRlLCBvciBpbnRlcnBvbGF0ZSBpZiBpbiB0aGUgYm9yZGVyLCBvciAwIGlmIGluc2lkZS4NCi0gICAgcmV0dXJuIChyZXN1bHRfbWF4ID49IDEuMCkgPyAxLjAgOg0KLSAgICAgICAgbWF4KHJlc3VsdF9taW4gLSAxLjAsIDAuMCkgLyAocmVzdWx0X21pbiAtIHJlc3VsdF9tYXgpOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIGNsYW1wKHJlY3QueCAtIHBvaW50LngsIDAuMCwgMS4wKSArDQotICAgICAgICAgY2xhbXAocG9pbnQueCAtIHJlY3QueiwgMC4wLCAxLjApICsNCi0gICAgICAgICBjbGFtcChyZWN0LnkgLSBwb2ludC55LCAwLjAsIDEuMCkgKw0KLSAgICAgICAgIGNsYW1wKHBvaW50LnkgLSByZWN0LncsIDAuMCwgMS4wKTsNCi19DQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL3NoYWRlcnMuZ3lwIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL3NoYWRlcnMuZ3lwCmluZGV4IDlkMDA4OTkuLjJlYmM5NTQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy9zaGFkZXJzLmd5cAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvc2hhZGVycy5neXAKQEAgLTIwLDIyICsyMCwyNSBAQAogICAgICdnZW5lcmF0ZV9jbGFzc19zY3JpcHQnOiAnPChERVBUSCkvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvZ2VuZXJhdGVfc2hhZGVyX2ltcGwucHknLAogICAgICdzaGFkZXJfc291cmNlcyc6IFsKICAgICAgICc8KERFUFRIKS9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy9mcmFnbWVudF9jb2xvci5nbHNsJywKLSAgICAgICc8KERFUFRIKS9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy9mcmFnbWVudF9jb2xvcl9iZXR3ZWVuX3JyZWN0cy5nbHNsJywKICAgICAgICc8KERFUFRIKS9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy9mcmFnbWVudF9jb2xvcl9ibHVyLmdsc2wnLAogICAgICAgJzwoREVQVEgpL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL2ZyYWdtZW50X2NvbG9yX2JsdXJfcnJlY3RzLmdsc2wnLAogICAgICAgJzwoREVQVEgpL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL2ZyYWdtZW50X2NvbG9yX2luY2x1ZGUuZ2xzbCcsCi0gICAgICAnPChERVBUSCkvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvZnJhZ21lbnRfY29sb3JfcnJlY3QuZ2xzbCcsCiAgICAgICAnPChERVBUSCkvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvZnJhZ21lbnRfY29sb3JfdGV4Y29vcmQuZ2xzbCcsCiAgICAgICAnPChERVBUSCkvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvZnJhZ21lbnRfb3BhY2l0eV90ZXhjb29yZDFkLmdsc2wnLAorICAgICAgJzwoREVQVEgpL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL2ZyYWdtZW50X3Jjb3JuZXJfY29sb3IuZ2xzbCcsCisgICAgICAnPChERVBUSCkvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvZnJhZ21lbnRfcmNvcm5lcjJfY29sb3IuZ2xzbCcsCisgICAgICAnPChERVBUSCkvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvZnJhZ21lbnRfcmNvcm5lcl90ZXhjb29yZF9jb2xvci5nbHNsJywKICAgICAgICc8KERFUFRIKS9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy9mcmFnbWVudF90ZXhjb29yZC5nbHNsJywKLSAgICAgICc8KERFUFRIKS9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy9mcmFnbWVudF90ZXhjb29yZF9jb2xvcl9ycmVjdC5nbHNsJywKICAgICAgICc8KERFUFRIKS9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy9mdW5jdGlvbl9nYXVzc2lhbl9pbnRlZ3JhbC5pbmMnLAotICAgICAgJzwoREVQVEgpL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL2Z1bmN0aW9uX2lzX291dHNpZGVfcnJlY3QuaW5jJywKKyAgICAgICc8KERFUFRIKS9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy9mdW5jdGlvbl9pc19vdXRzaWRlX3Jjb3JuZXIuaW5jJywKICAgICAgICc8KERFUFRIKS9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy92ZXJ0ZXhfY29sb3IuZ2xzbCcsCiAgICAgICAnPChERVBUSCkvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvdmVydGV4X2NvbG9yX29mZnNldC5nbHNsJywKICAgICAgICc8KERFUFRIKS9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy92ZXJ0ZXhfY29sb3JfdGV4Y29vcmQuZ2xzbCcsCiAgICAgICAnPChERVBUSCkvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvdmVydGV4X29mZnNldC5nbHNsJywKLSAgICAgICc8KERFUFRIKS9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy92ZXJ0ZXhfb2Zmc2V0X3RleGNvb3JkLmdsc2wnLAorICAgICAgJzwoREVQVEgpL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL3ZlcnRleF9vZmZzZXRfcmNvcm5lci5nbHNsJywKKyAgICAgICc8KERFUFRIKS9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy92ZXJ0ZXhfcmNvcm5lci5nbHNsJywKKyAgICAgICc8KERFUFRIKS9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy92ZXJ0ZXhfcmNvcm5lcjIuZ2xzbCcsCisgICAgICAnPChERVBUSCkvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvdmVydGV4X3Jjb3JuZXJfdGV4Y29vcmQuZ2xzbCcsCiAgICAgICAnPChERVBUSCkvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvdmVydGV4X3RleGNvb3JkLmdsc2wnLAogICAgIF0sCiAgIH0sCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvdmVydGV4X29mZnNldF9yY29ybmVyLmdsc2wgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvdmVydGV4X29mZnNldF9yY29ybmVyLmdsc2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q5ZmY0NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy92ZXJ0ZXhfb2Zmc2V0X3Jjb3JuZXIuZ2xzbApAQCAtMCwwICsxLDI4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vDQorLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKy8vDQorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKy8vDQorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKw0KK3VuaWZvcm0gdmVjNCB1X2NsaXBfYWRqdXN0bWVudDsNCit1bmlmb3JtIG1hdDMgdV92aWV3X21hdHJpeDsNCithdHRyaWJ1dGUgdmVjMiBhX3Bvc2l0aW9uOw0KK2F0dHJpYnV0ZSB2ZWM0IGFfcmNvcm5lcjsNCit2YXJ5aW5nIHZlYzIgdl9vZmZzZXQ7DQordmFyeWluZyB2ZWM0IHZfcmNvcm5lcjsNCisNCit2b2lkIG1haW4oKSB7DQorICB2ZWMzIHBvczJkID0gdV92aWV3X21hdHJpeCAqIHZlYzMoYV9wb3NpdGlvbiwgMSk7DQorICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zMmQueHkgKiB1X2NsaXBfYWRqdXN0bWVudC54eSArDQorICAgICAgICAgICAgICAgICAgICAgdV9jbGlwX2FkanVzdG1lbnQuencsIDAsIHBvczJkLnopOw0KKyAgdl9vZmZzZXQgPSBhX3Bvc2l0aW9uOw0KKyAgdl9yY29ybmVyID0gYV9yY29ybmVyOw0KK30NCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvdmVydGV4X29mZnNldF90ZXhjb29yZC5nbHNsIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL3ZlcnRleF9vZmZzZXRfdGV4Y29vcmQuZ2xzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY4MWQyNC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvdmVydGV4X29mZnNldF90ZXhjb29yZC5nbHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0vLw0KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0vLw0KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0vLw0KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi11bmlmb3JtIHZlYzQgdV9jbGlwX2FkanVzdG1lbnQ7DQotdW5pZm9ybSBtYXQzIHVfdmlld19tYXRyaXg7DQotYXR0cmlidXRlIHZlYzIgYV9wb3NpdGlvbjsNCi1hdHRyaWJ1dGUgdmVjMiBhX29mZnNldDsNCi1hdHRyaWJ1dGUgdmVjMiBhX3RleGNvb3JkOw0KLXZhcnlpbmcgdmVjMiB2X29mZnNldDsNCi12YXJ5aW5nIHZlYzIgdl90ZXhjb29yZDsNCi0NCi12b2lkIG1haW4oKSB7DQotICB2ZWMzIHBvczJkID0gdV92aWV3X21hdHJpeCAqIHZlYzMoYV9wb3NpdGlvbiwgMSk7DQotICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zMmQueHkgKiB1X2NsaXBfYWRqdXN0bWVudC54eSArDQotICAgICAgICAgICAgICAgICAgICAgdV9jbGlwX2FkanVzdG1lbnQuencsIDAsIHBvczJkLnopOw0KLSAgdl9vZmZzZXQgPSBhX29mZnNldDsNCi0gIHZfdGV4Y29vcmQgPSBhX3RleGNvb3JkOw0KLX0NCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvdmVydGV4X3Jjb3JuZXIuZ2xzbCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy92ZXJ0ZXhfcmNvcm5lci5nbHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NGQ0ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvdmVydGV4X3Jjb3JuZXIuZ2xzbApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vDQorLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKy8vDQorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKy8vDQorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKw0KK3VuaWZvcm0gdmVjNCB1X2NsaXBfYWRqdXN0bWVudDsNCit1bmlmb3JtIG1hdDMgdV92aWV3X21hdHJpeDsNCithdHRyaWJ1dGUgdmVjMiBhX3Bvc2l0aW9uOw0KK2F0dHJpYnV0ZSB2ZWM0IGFfcmNvcm5lcjsNCit2YXJ5aW5nIHZlYzQgdl9yY29ybmVyOw0KKw0KK3ZvaWQgbWFpbigpIHsNCisgIHZlYzMgcG9zMmQgPSB1X3ZpZXdfbWF0cml4ICogdmVjMyhhX3Bvc2l0aW9uLCAxKTsNCisgIGdsX1Bvc2l0aW9uID0gdmVjNChwb3MyZC54eSAqIHVfY2xpcF9hZGp1c3RtZW50Lnh5ICsNCisgICAgICAgICAgICAgICAgICAgICB1X2NsaXBfYWRqdXN0bWVudC56dywgMCwgcG9zMmQueik7DQorICB2X3Jjb3JuZXIgPSBhX3Jjb3JuZXI7DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy92ZXJ0ZXhfcmNvcm5lcjIuZ2xzbCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy92ZXJ0ZXhfcmNvcm5lcjIuZ2xzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTRkMTU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL3ZlcnRleF9yY29ybmVyMi5nbHNsCkBAIC0wLDAgKzEsMjggQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8NCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorLy8NCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorLy8NCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQordW5pZm9ybSB2ZWM0IHVfY2xpcF9hZGp1c3RtZW50Ow0KK3VuaWZvcm0gbWF0MyB1X3ZpZXdfbWF0cml4Ow0KK2F0dHJpYnV0ZSB2ZWMyIGFfcG9zaXRpb247DQorYXR0cmlidXRlIHZlYzQgYV9yY29ybmVyX2lubmVyOw0KK2F0dHJpYnV0ZSB2ZWM0IGFfcmNvcm5lcl9vdXRlcjsNCit2YXJ5aW5nIHZlYzQgdl9yY29ybmVyX2lubmVyOw0KK3ZhcnlpbmcgdmVjNCB2X3Jjb3JuZXJfb3V0ZXI7DQorDQordm9pZCBtYWluKCkgew0KKyAgdmVjMyBwb3MyZCA9IHVfdmlld19tYXRyaXggKiB2ZWMzKGFfcG9zaXRpb24sIDEpOw0KKyAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvczJkLnh5ICogdV9jbGlwX2FkanVzdG1lbnQueHkgKw0KKyAgICAgICAgICAgICAgICAgICAgIHVfY2xpcF9hZGp1c3RtZW50Lnp3LCAwLCBwb3MyZC56KTsNCisgIHZfcmNvcm5lcl9pbm5lciA9IGFfcmNvcm5lcl9pbm5lcjsNCisgIHZfcmNvcm5lcl9vdXRlciA9IGFfcmNvcm5lcl9vdXRlcjsNCit9DQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL3ZlcnRleF9yY29ybmVyX3RleGNvb3JkLmdsc2wgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvdmVydGV4X3Jjb3JuZXJfdGV4Y29vcmQuZ2xzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDNkMWFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL3ZlcnRleF9yY29ybmVyX3RleGNvb3JkLmdsc2wKQEAgLTAsMCArMSwyOSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisvLw0KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisvLw0KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisvLw0KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisNCit1bmlmb3JtIHZlYzQgdV9jbGlwX2FkanVzdG1lbnQ7DQordW5pZm9ybSBtYXQzIHVfdmlld19tYXRyaXg7DQorYXR0cmlidXRlIHZlYzIgYV9wb3NpdGlvbjsNCithdHRyaWJ1dGUgdmVjNCBhX3Jjb3JuZXI7DQorYXR0cmlidXRlIHZlYzIgYV90ZXhjb29yZDsNCit2YXJ5aW5nIHZlYzQgdl9yY29ybmVyOw0KK3ZhcnlpbmcgdmVjMiB2X3RleGNvb3JkOw0KKw0KK3ZvaWQgbWFpbigpIHsNCisgIHZlYzMgcG9zMmQgPSB1X3ZpZXdfbWF0cml4ICogdmVjMyhhX3Bvc2l0aW9uLCAxKTsNCisgIGdsX1Bvc2l0aW9uID0gdmVjNChwb3MyZC54eSAqIHVfY2xpcF9hZGp1c3RtZW50Lnh5ICsNCisgICAgICAgICAgICAgICAgICAgICB1X2NsaXBfYWRqdXN0bWVudC56dywgMCwgcG9zMmQueik7DQorICB2X3Jjb3JuZXIgPSBhX3Jjb3JuZXI7DQorICB2X3RleGNvb3JkID0gYV90ZXhjb29yZDsNCit9DQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3BpeGVsX3Rlc3QuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvcGl4ZWxfdGVzdC5jYwppbmRleCBhM2Y2NmViLi43NjBiYjRkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvcGl4ZWxfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvcGl4ZWxfdGVzdC5jYwpAQCAtMjE2LDYgKzIxNiw0NCBAQAogICAgICAgICAgIFJvdGF0ZU1hdHJpeChzdGF0aWNfY2FzdDxmbG9hdD4oTV9QSSkgLyA2LjBmKSkpOwogfQogCitURVNUX0YoUGl4ZWxUZXN0LCBTY2FsZWRUaGVuUm90YXRlZFJlY3RXaXRoRGlmZmVyZW50Um91bmRlZENvcm5lcnMpIHsKKyAgUm91bmRlZENvcm5lciB0b3BfbGVmdCg2LCAxNSk7CisgIFJvdW5kZWRDb3JuZXIgdG9wX3JpZ2h0KDAsIDApOworICBSb3VuZGVkQ29ybmVyIGJvdHRvbV9yaWdodCg2LCAyNSk7CisgIFJvdW5kZWRDb3JuZXIgYm90dG9tX2xlZnQoMiwgMjUpOworCisgIHNjb3BlZF9wdHI8Um91bmRlZENvcm5lcnM+IHJvdW5kZWRfY29ybmVycygKKyAgICAgIG5ldyBSb3VuZGVkQ29ybmVycyh0b3BfbGVmdCwgdG9wX3JpZ2h0LCBib3R0b21fcmlnaHQsIGJvdHRvbV9sZWZ0KSk7CisKKyAgVGVzdFRyZWUobmV3IE1hdHJpeFRyYW5zZm9ybU5vZGUoCisgICAgICBuZXcgUmVjdE5vZGUoUmVjdEYoLTcsIC0yNSwgMTQsIDUwKSwKKyAgICAgICAgICAgICAgICAgICBzY29wZWRfcHRyPEJydXNoPigKKyAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNvbGlkQ29sb3JCcnVzaChDb2xvclJHQkEoMSwgMSwgMSwgMSkpKSwKKyAgICAgICAgICAgICAgICAgICByb3VuZGVkX2Nvcm5lcnMuUGFzcygpKSwKKyAgICAgIFRyYW5zbGF0ZU1hdHJpeCgxMDAuMGYsIDEwMC4wZikgKgorICAgICAgUm90YXRlTWF0cml4KHN0YXRpY19jYXN0PGZsb2F0PihNX1BJKSAvIDMuMGYpICoKKyAgICAgIFNjYWxlTWF0cml4KC0xMC4wZiwgMi4wZikpKTsKK30KKworVEVTVF9GKFBpeGVsVGVzdCwgUm90YXRlZFRoZW5TY2FsZWRSZWN0V2l0aERpZmZlcmVudFJvdW5kZWRDb3JuZXJzKSB7CisgIFJvdW5kZWRDb3JuZXIgdG9wX2xlZnQoNCwgNyk7CisgIFJvdW5kZWRDb3JuZXIgdG9wX3JpZ2h0KDAsIDApOworICBSb3VuZGVkQ29ybmVyIGJvdHRvbV9yaWdodCgxMCwgMik7CisgIFJvdW5kZWRDb3JuZXIgYm90dG9tX2xlZnQoNSwgMyk7CisKKyAgc2NvcGVkX3B0cjxSb3VuZGVkQ29ybmVycz4gcm91bmRlZF9jb3JuZXJzKAorICAgICAgbmV3IFJvdW5kZWRDb3JuZXJzKHRvcF9sZWZ0LCB0b3BfcmlnaHQsIGJvdHRvbV9yaWdodCwgYm90dG9tX2xlZnQpKTsKKworICBUZXN0VHJlZShuZXcgTWF0cml4VHJhbnNmb3JtTm9kZSgKKyAgICAgIG5ldyBSZWN0Tm9kZShSZWN0RigtMTAsIC03LCAyMCwgMTQpLAorICAgICAgICAgICAgICAgICAgIHNjb3BlZF9wdHI8QnJ1c2g+KAorICAgICAgICAgICAgICAgICAgICAgICBuZXcgU29saWRDb2xvckJydXNoKENvbG9yUkdCQSgxLCAxLCAxLCAxKSkpLAorICAgICAgICAgICAgICAgICAgIHJvdW5kZWRfY29ybmVycy5QYXNzKCkpLAorICAgICAgVHJhbnNsYXRlTWF0cml4KDEwMC4wZiwgMTAwLjBmKSAqCisgICAgICBTY2FsZU1hdHJpeCg2LjBmLCA5LjBmKSAqCisgICAgICBSb3RhdGVNYXRyaXgoc3RhdGljX2Nhc3Q8ZmxvYXQ+KE1fUEkpIC8gNi4wZikpKTsKK30KKwogVEVTVF9GKFBpeGVsVGVzdCwgUmVkUmVjdFdpdGhEaWZmZXJlbnRSb3VuZGVkQ29ybmVyc09uVG9wTGVmdE9mU3VyZmFjZSkgewogICBSb3VuZGVkQ29ybmVyIHRvcF9sZWZ0KDEwLCAxMCk7CiAgIFJvdW5kZWRDb3JuZXIgdG9wX3JpZ2h0KDIwLCAyMCk7CkBAIC0xOTUyLDYgKzE5OTAsMTkgQEAKICAgICAgIG5ldyBJbWFnZU5vZGUoaW1hZ2UpKSk7CiB9CiAKK1RFU1RfRihQaXhlbFRlc3QsIFNjYWxlZFRoZW5Sb3RhdGVkUm91bmRlZENvcm5lcnNWaWV3cG9ydE92ZXJJbWFnZSkgeworICBzY29wZWRfcmVmcHRyPEltYWdlPiBpbWFnZSA9CisgICAgICBDcmVhdGVDb2xvcmVkQ2hlY2tlcnNJbWFnZShHZXRSZXNvdXJjZVByb3ZpZGVyKCksIG91dHB1dF9zdXJmYWNlX3NpemUoKSk7CisKKyAgVGVzdFRyZWUobmV3IE1hdHJpeFRyYW5zZm9ybU5vZGUoCisgICAgICBuZXcgRmlsdGVyTm9kZSgKKyAgICAgICAgICBWaWV3cG9ydEZpbHRlcihSZWN0RigyNSwgNSwgMTUwLCAxMCksIFJvdW5kZWRDb3JuZXJzKDI1LCAyKSksCisgICAgICAgICAgbmV3IEltYWdlTm9kZShpbWFnZSkpLAorICAgICAgVHJhbnNsYXRlTWF0cml4KC0zMCwgMTMwKSAqCisgICAgICBSb3RhdGVNYXRyaXgoc3RhdGljX2Nhc3Q8ZmxvYXQ+KE1fUEkgLyAzLjBmKSkgKgorICAgICAgU2NhbGVNYXRyaXgoMS4wZiwgMTAuMGYpKSk7Cit9CisKIFRFU1RfRihQaXhlbFRlc3QsIFJvdW5kZWRDb3JuZXJzVmlld3BvcnRPdmVyV3JhcHBpbmdJbWFnZSkgewogICBzY29wZWRfcmVmcHRyPEltYWdlPiBpbWFnZSA9CiAgICAgICBDcmVhdGVDb2xvcmVkQ2hlY2tlcnNJbWFnZShHZXRSZXNvdXJjZVByb3ZpZGVyKCksIG91dHB1dF9zdXJmYWNlX3NpemUoKSk7CkBAIC0yODI5LDYgKzI4ODAsMTQgQEAKICAgICAgIFNoYWRvdyhWZWN0b3IyZEYoMC4wZiwgMC4wZiksIDEwMC4wZiwgQ29sb3JSR0JBKDAsIDAsIDAsIDEpKSkpOwogfQogCitURVNUX0YoUGl4ZWxUZXN0LCBTY2FsZWRCb3hTaGFkb3dXaXRoU3ByZWFkQW5kQmx1ckNlbnRlcmVkKSB7CisgIFRlc3RUcmVlKG5ldyBNYXRyaXhUcmFuc2Zvcm1Ob2RlKENyZWF0ZVNoYWRvd1JlY3RXaXRoQmFja2dyb3VuZCgKKyAgICAgIG91dHB1dF9zdXJmYWNlX3NpemUoKSwgQ29sb3JSR0JBKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpLAorICAgICAgQ29sb3JSR0JBKDAuNWYsIDAuNWYsIDAuNWYsIDEuMGYpLCBSZWN0Rig1MCwgOCwgMTAwLCA0KSwKKyAgICAgIFNoYWRvdyhWZWN0b3IyZEYoMC4wZiwgMC4wZiksIDMuMGYsIENvbG9yUkdCQSgwLCAwLCAwLCAxKSksIGZhbHNlLCA1LjBmKSwKKyAgICAgIFNjYWxlTWF0cml4KDEuMGYsIDEwLjBmKSkpOworfQorCiBURVNUX0YoUGl4ZWxUZXN0LCBUcmFuc3BhcmVudEJveFNoYWRvd0JsdXJPbkdyZWVuQmFja2dyb3VuZENlbnRlcmVkKSB7CiAgIFRlc3RUcmVlKENyZWF0ZVNoYWRvd1JlY3RXaXRoQmFja2dyb3VuZCgKICAgICAgIG91dHB1dF9zdXJmYWNlX3NpemUoKSwgQ29sb3JSR0JBKDAuM2YsIDAuOGYsIDAuM2YsIDEuMGYpLApAQCAtMjkxNiw2ICsyOTc1LDE1IEBACiAgICAgICBSb3VuZGVkQ29ybmVycygyNSwgMjUpKSk7CiB9CiAKK1RFU1RfRihQaXhlbFRlc3QsIFNjYWxlZEJveFNoYWRvd0VsbGlwc2VXaXRoT3V0c2V0NXB4U3ByZWFkQW5kUm91bmRlZENvcm5lcnMpIHsKKyAgVGVzdFRyZWUobmV3IE1hdHJpeFRyYW5zZm9ybU5vZGUoQ3JlYXRlU2hhZG93UmVjdFdpdGhCYWNrZ3JvdW5kKAorICAgICAgb3V0cHV0X3N1cmZhY2Vfc2l6ZSgpLCBDb2xvclJHQkEoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiksCisgICAgICBDb2xvclJHQkEoMC41ZiwgMC41ZiwgMC41ZiwgMS4wZiksIFJlY3RGKDYsIDI1LCAyLCAxMDApLAorICAgICAgU2hhZG93KFZlY3RvcjJkRigwLjBmLCAwLjBmKSwgMC4wZiwgQ29sb3JSR0JBKDAsIDAsIDAsIDEpKSwgZmFsc2UsIDUuMGYsCisgICAgICBSb3VuZGVkQ29ybmVycygxLCA1MCkpLAorICAgICAgU2NhbGVNYXRyaXgoMTUuMGYsIDEuMGYpKSk7Cit9CisKIFRFU1RfRihQaXhlbFRlc3QsIEJveFNoYWRvd0NpcmNsZVdpdGhJbnNldDI1cHhTcHJlYWQxcHhCbHVyQW5kUm91bmRlZENvcm5lcnMpIHsKICAgVGVzdFRyZWUoQ3JlYXRlU2hhZG93UmVjdFdpdGhCYWNrZ3JvdW5kKAogICAgICAgb3V0cHV0X3N1cmZhY2Vfc2l6ZSgpLCBDb2xvclJHQkEoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiksCkBAIC0zMDM0LDYgKzMxMDIsMTYgQEAKIH0KIAogVEVTVF9GKFBpeGVsVGVzdCwKKyAgICAgICBTY2FsZWRCb3hTaGFkb3dFbGxpcHNlV2l0aE91dHNldDI1cHhTcHJlYWQzcHhCbHVyQW5kUm91bmRlZENvcm5lcnMpIHsKKyAgVGVzdFRyZWUobmV3IE1hdHJpeFRyYW5zZm9ybU5vZGUoQ3JlYXRlU2hhZG93UmVjdFdpdGhCYWNrZ3JvdW5kKAorICAgICAgb3V0cHV0X3N1cmZhY2Vfc2l6ZSgpLCBDb2xvclJHQkEoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiksCisgICAgICBDb2xvclJHQkEoMC41ZiwgMC41ZiwgMC41ZiwgMS4wZiksIFJlY3RGKDIwLCA1LCAxNDAsIDEwKSwKKyAgICAgIFNoYWRvdyhWZWN0b3IyZEYoOC4wZiwgMS4wZiksIDMuMGYsIENvbG9yUkdCQSgwLCAwLCAwLCAxKSksIGZhbHNlLCA0LjBmLAorICAgICAgUm91bmRlZENvcm5lcnMoNzAsIDUpKSwKKyAgICAgIFNjYWxlTWF0cml4KDEuMGYsIDEwLjBmKSkpOworfQorCitURVNUX0YoUGl4ZWxUZXN0LAogICAgICAgIEJveFNoYWRvd0VsbGlwc2VXaXRoSW5zZXQyNXB4U3ByZWFkNTBweEJsdXJBbmRSb3VuZGVkQ29ybmVycykgewogICBUZXN0VHJlZShDcmVhdGVTaGFkb3dSZWN0V2l0aEJhY2tncm91bmQoCiAgICAgICBvdXRwdXRfc3VyZmFjZV9zaXplKCksIENvbG9yUkdCQSgxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKSwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX3Jlc291cmNlX3Byb3ZpZGVyLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmVzb3VyY2VfcHJvdmlkZXIuY2MKaW5kZXggNTc2OTY5Yy4uY2UzOWNjYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmVzb3VyY2VfcHJvdmlkZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmVzb3VyY2VfcHJvdmlkZXIuY2MKQEAgLTYwLDcgKzYwLDcgQEAKICAgLy8gb24gbXVsdGlwbGUgdGhyZWFkcyBzaW11bHRhbmVvdXNseSBsYXRlci4KICAgU2tTYWZlVW5yZWYoU2tGb250TWdyOjpSZWZEZWZhdWx0KCkpOwogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNCAmJiBTQl9IQVMoR1JBUEhJQ1MpCisjaWYgU0JfSEFTKEdSQVBISUNTKQogICBkZWNvZGVfdGFyZ2V0X2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLmVnbF9kaXNwbGF5ID0KICAgICAgIGNvYmFsdF9jb250ZXh0Xy0+c3lzdGVtX2VnbCgpLT5HZXREaXNwbGF5KCk7CiAgIGRlY29kZV90YXJnZXRfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8uZWdsX2NvbnRleHQgPQpAQCAtNjgsNyArNjgsNyBAQAogICBkZWNvZGVfdGFyZ2V0X2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLmdsZXNfY29udGV4dF9ydW5uZXIgPQogICAgICAgJkhhcmR3YXJlUmVzb3VyY2VQcm92aWRlcjo6R3JhcGhpY3NDb250ZXh0UnVubmVyOwogICBkZWNvZGVfdGFyZ2V0X2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLmdsZXNfY29udGV4dF9ydW5uZXJfY29udGV4dCA9IHRoaXM7Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQgJiYgU0JfSEFTKEdSQVBISUNTKQorI2VuZGlmICAvLyBTQl9IQVMoR1JBUEhJQ1MpCiB9CiAKIEhhcmR3YXJlUmVzb3VyY2VQcm92aWRlcjo6fkhhcmR3YXJlUmVzb3VyY2VQcm92aWRlcigpIHsKQEAgLTE0Niw3ICsxNDYsNyBAQAogICAgICAgc2VsZl9tZXNzYWdlX2xvb3BfKSk7CiB9CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0ICYmIFNCX0hBUyhHUkFQSElDUykKKyNpZiBTQl9IQVMoR1JBUEhJQ1MpCiBuYW1lc3BhY2UgewogCiAjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9ERUNPREVfVEFSR0VUX1BMQU5FU19GT1JfRk9STUFUCkBAIC0zNzgsNyArMzc4LDcgQEAKICAgfQogfQogCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQgJiYgU0JfSEFTKEdSQVBISUNTKQorI2VuZGlmICAvLyBTQl9IQVMoR1JBUEhJQ1MpCiAKIHNjb3BlZF9wdHI8UmF3SW1hZ2VNZW1vcnk+IEhhcmR3YXJlUmVzb3VyY2VQcm92aWRlcjo6QWxsb2NhdGVSYXdJbWFnZU1lbW9yeSgKICAgICBzaXplX3Qgc2l6ZV9pbl9ieXRlcywgc2l6ZV90IGFsaWdubWVudCkgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmVzb3VyY2VfcHJvdmlkZXIuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX3Jlc291cmNlX3Byb3ZpZGVyLmgKaW5kZXggMzNlZDRkMi4uNWFkMGM0YSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmVzb3VyY2VfcHJvdmlkZXIuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9yZXNvdXJjZV9wcm92aWRlci5oCkBAIC01Niw3ICs1Niw2IEBACiAgICAgICBzY29wZWRfcHRyPHJlbmRlcl90cmVlOjpJbWFnZURhdGE+IHBpeGVsX2RhdGEpIE9WRVJSSURFOwogCiAjaWYgU0JfSEFTKEdSQVBISUNTKQotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKIAogICBzY29wZWRfcmVmcHRyPHJlbmRlcl90cmVlOjpJbWFnZT4gQ3JlYXRlSW1hZ2VGcm9tU2JEZWNvZGVUYXJnZXQoCiAgICAgICBTYkRlY29kZVRhcmdldCBkZWNvZGVfdGFyZ2V0KSBPVkVSUklERTsKQEAgLTcxLDI0ICs3MCw2IEBACiAgIC8vIFdoZXRoZXIgU2JEZWNvZGVUYXJnZXRJc1N1cHBvcnRlZCBvciBub3QuCiAgIGJvb2wgU3VwcG9ydHNTYkRlY29kZVRhcmdldCgpIE9WRVJSSURFIHsgcmV0dXJuIHRydWU7IH0KIAotI2VsaWYgU0JfQVBJX1ZFUlNJT04gPj0gMwotCi0gIHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6OkltYWdlPiBDcmVhdGVJbWFnZUZyb21TYkRlY29kZVRhcmdldCgKLSAgICAgIFNiRGVjb2RlVGFyZ2V0IGRlY29kZV90YXJnZXQpIE9WRVJSSURFIHsKLSAgICBOT1RSRUFDSEVEKCkKLSAgICAgICAgPDwgIkNyZWF0ZUltYWdlRnJvbVNiRGVjb2RlVGFyZ2V0IGlzIG5vdCBzdXBwb3J0ZWQgb24gRUdMIHlldC4iOwotICAgIFNiRGVjb2RlVGFyZ2V0RGVzdHJveShkZWNvZGVfdGFyZ2V0KTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIC8vIFJldHVybiB0aGUgYXNzb2NpYXRlZCBTYkRlY29kZVRhcmdldFByb3ZpZGVyIHdpdGggdGhlIFJlc291cmNlUHJvdmlkZXIsCi0gIC8vIGlmIGl0IGV4aXN0cy4gIFJldHVybnMgTlVMTCBpZiBTYkRlY29kZVRhcmdldCBpcyBub3Qgc3VwcG9ydGVkLgotICBTYkRlY29kZVRhcmdldFByb3ZpZGVyKiBHZXRTYkRlY29kZVRhcmdldFByb3ZpZGVyKCkgT1ZFUlJJREUgeyByZXR1cm4gTlVMTDsgfQotCi0gIC8vIFdoZXRoZXIgU2JEZWNvZGVUYXJnZXRJc1N1cHBvcnRlZCBvciBub3QuCi0gIGJvb2wgU3VwcG9ydHNTYkRlY29kZVRhcmdldCgpIE9WRVJSSURFIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogI2VuZGlmICAvLyBTQl9IQVMoR1JBUEhJQ1MpCiAKICAgc2NvcGVkX3B0cjxyZW5kZXJfdHJlZTo6UmF3SW1hZ2VNZW1vcnk+IEFsbG9jYXRlUmF3SW1hZ2VNZW1vcnkoCkBAIC0xNDcsNyArMTI4LDcgQEAKICAgVGV4dFNoYXBlciB0ZXh0X3NoYXBlcl87CiAgIGludCBtYXhfdGV4dHVyZV9zaXplXzsKIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQgJiYgU0JfSEFTKEdSQVBISUNTKQorI2lmIFNCX0hBUyhHUkFQSElDUykKICAgc3RhdGljIHZvaWQgR3JhcGhpY3NDb250ZXh0UnVubmVyKAogICAgICAgU2JEZWNvZGVUYXJnZXRHcmFwaGljc0NvbnRleHRQcm92aWRlciogZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlciwKICAgICAgIFNiRGVjb2RlVGFyZ2V0R2xlc0NvbnRleHRSdW5uZXJUYXJnZXQgdGFyZ2V0X2Z1bmN0aW9uLApAQCAtMTU1LDcgKzEzNiw3IEBACiAKICAgU2JEZWNvZGVUYXJnZXRHcmFwaGljc0NvbnRleHRQcm92aWRlcgogICAgICAgZGVjb2RlX3RhcmdldF9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXzsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNCAmJiBTQl9IQVMoR1JBUEhJQ1MpCisjZW5kaWYgIC8vIFNCX0hBUyhHUkFQSElDUykKIAogICAvLyBXZSBrZWVwIGEgaGFuZGxlIHRvIHRoZSBtZXNzYWdlIGxvb3AgdGhhdCB0aGlzIHJlc291cmNlIHByb3ZpZGVyIHdhcwogICAvLyBjcmVhdGVkIG9uLiAgVGhpcyBtZXNzYWdlIGxvb3AgaXMgdXNlZCB3aGVuZXZlciB3ZSBuZWVkIHRvIGlzc3VlIGdyYXBoaWNzCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9yZW5kZXJfdHJlZV9ub2RlX3Zpc2l0b3IuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9yZW5kZXJfdHJlZV9ub2RlX3Zpc2l0b3IuY2MKaW5kZXggMGYyMTU5Yi4uOTE4YTYwZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvcmVuZGVyX3RyZWVfbm9kZV92aXNpdG9yLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3JlbmRlcl90cmVlX25vZGVfdmlzaXRvci5jYwpAQCAtOTQ5LDYgKzk0OSwxMSBAQAogICBTa2lhQnJ1c2hWaXNpdG9yIGJydXNoX3Zpc2l0b3IoJnBhaW50LCAqZHJhd19zdGF0ZSk7CiAgIGJydXNoLT5BY2NlcHQoJmJydXNoX3Zpc2l0b3IpOwogCisgIGlmICghZHJhd19zdGF0ZS0+cmVuZGVyX3RhcmdldC0+Z2V0VG90YWxNYXRyaXgoKS5wcmVzZXJ2ZXNBeGlzQWxpZ25tZW50KCkpIHsKKyAgICAvLyBFbmFibGUgYW50aS1hbGlhc2luZyBpZiB3ZSdyZSByZW5kZXJpbmcgYSByb3RhdGVkIG9yIHNrZXdlZCBib3guCisgICAgcGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICB9CisKICAgZHJhd19zdGF0ZS0+cmVuZGVyX3RhcmdldC0+ZHJhd1JlY3QoCiAgICAgICBTa1JlY3Q6Ok1ha2VYWVdIKHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKSwgcGFpbnQpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc29mdHdhcmVfcmVzb3VyY2VfcHJvdmlkZXIuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NvZnR3YXJlX3Jlc291cmNlX3Byb3ZpZGVyLmgKaW5kZXggNjdlOGUyZC4uNDkyZDNhYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc29mdHdhcmVfcmVzb3VyY2VfcHJvdmlkZXIuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9zb2Z0d2FyZV9yZXNvdXJjZV9wcm92aWRlci5oCkBAIC00Nyw3ICs0Nyw2IEBACiAgICAgICBzY29wZWRfcHRyPHJlbmRlcl90cmVlOjpJbWFnZURhdGE+IHBpeGVsX2RhdGEpIE9WRVJSSURFOwogCiAjaWYgU0JfSEFTKEdSQVBISUNTKQotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgc2NvcGVkX3JlZnB0cjxyZW5kZXJfdHJlZTo6SW1hZ2U+IENyZWF0ZUltYWdlRnJvbVNiRGVjb2RlVGFyZ2V0KAogICAgICAgU2JEZWNvZGVUYXJnZXQgZGVjb2RlX3RhcmdldCkgT1ZFUlJJREUgewogICAgIE5PVFJFQUNIRUQoKTsKQEAgLTYxLDE4ICs2MCw2IEBACiAgIH0KIAogICBib29sIFN1cHBvcnRzU2JEZWNvZGVUYXJnZXQoKSBPVkVSUklERSB7IHJldHVybiBmYWxzZTsgfQotI2VsaWYgU0JfQVBJX1ZFUlNJT04gPj0gMwotICBzY29wZWRfcmVmcHRyPHJlbmRlcl90cmVlOjpJbWFnZT4gQ3JlYXRlSW1hZ2VGcm9tU2JEZWNvZGVUYXJnZXQoCi0gICAgICBTYkRlY29kZVRhcmdldCBkZWNvZGVfdGFyZ2V0KSBPVkVSUklERSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIFNiRGVjb2RlVGFyZ2V0RGVzdHJveShkZWNvZGVfdGFyZ2V0KTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIFNiRGVjb2RlVGFyZ2V0UHJvdmlkZXIqIEdldFNiRGVjb2RlVGFyZ2V0UHJvdmlkZXIoKSBPVkVSUklERSB7IHJldHVybiBOVUxMOyB9Ci0KLSAgYm9vbCBTdXBwb3J0c1NiRGVjb2RlVGFyZ2V0KCkgT1ZFUlJJREUgeyByZXR1cm4gZmFsc2U7IH0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogI2VuZGlmICAvLyBTQl9IQVMoR1JBUEhJQ1MpCiAKICAgc2NvcGVkX3B0cjxyZW5kZXJfdHJlZTo6UmF3SW1hZ2VNZW1vcnk+IEFsbG9jYXRlUmF3SW1hZ2VNZW1vcnkoCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvdGVzdGRhdGEvUm90YXRlZFRoZW5TY2FsZWRSZWN0V2l0aERpZmZlcmVudFJvdW5kZWRDb3JuZXJzLWV4cGVjdGVkLnBuZyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci90ZXN0ZGF0YS9Sb3RhdGVkVGhlblNjYWxlZFJlY3RXaXRoRGlmZmVyZW50Um91bmRlZENvcm5lcnMtZXhwZWN0ZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNzI1YTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvdGVzdGRhdGEvUm90YXRlZFRoZW5TY2FsZWRSZWN0V2l0aERpZmZlcmVudFJvdW5kZWRDb3JuZXJzLWV4cGVjdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvdGVzdGRhdGEvU2NhbGVkQm94U2hhZG93RWxsaXBzZVdpdGhPdXRzZXQyNXB4U3ByZWFkM3B4Qmx1ckFuZFJvdW5kZWRDb3JuZXJzLWV4cGVjdGVkLnBuZyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci90ZXN0ZGF0YS9TY2FsZWRCb3hTaGFkb3dFbGxpcHNlV2l0aE91dHNldDI1cHhTcHJlYWQzcHhCbHVyQW5kUm91bmRlZENvcm5lcnMtZXhwZWN0ZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YTliMmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvdGVzdGRhdGEvU2NhbGVkQm94U2hhZG93RWxsaXBzZVdpdGhPdXRzZXQyNXB4U3ByZWFkM3B4Qmx1ckFuZFJvdW5kZWRDb3JuZXJzLWV4cGVjdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvdGVzdGRhdGEvU2NhbGVkQm94U2hhZG93RWxsaXBzZVdpdGhPdXRzZXQ1cHhTcHJlYWRBbmRSb3VuZGVkQ29ybmVycy1leHBlY3RlZC5wbmcgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvdGVzdGRhdGEvU2NhbGVkQm94U2hhZG93RWxsaXBzZVdpdGhPdXRzZXQ1cHhTcHJlYWRBbmRSb3VuZGVkQ29ybmVycy1leHBlY3RlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZmMjJkZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci90ZXN0ZGF0YS9TY2FsZWRCb3hTaGFkb3dFbGxpcHNlV2l0aE91dHNldDVweFNwcmVhZEFuZFJvdW5kZWRDb3JuZXJzLWV4cGVjdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvdGVzdGRhdGEvU2NhbGVkQm94U2hhZG93V2l0aFNwcmVhZEFuZEJsdXJDZW50ZXJlZC1leHBlY3RlZC5wbmcgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvdGVzdGRhdGEvU2NhbGVkQm94U2hhZG93V2l0aFNwcmVhZEFuZEJsdXJDZW50ZXJlZC1leHBlY3RlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMyYjViNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci90ZXN0ZGF0YS9TY2FsZWRCb3hTaGFkb3dXaXRoU3ByZWFkQW5kQmx1ckNlbnRlcmVkLWV4cGVjdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvdGVzdGRhdGEvU2NhbGVkVGhlblJvdGF0ZWRSZWN0V2l0aERpZmZlcmVudFJvdW5kZWRDb3JuZXJzLWV4cGVjdGVkLnBuZyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci90ZXN0ZGF0YS9TY2FsZWRUaGVuUm90YXRlZFJlY3RXaXRoRGlmZmVyZW50Um91bmRlZENvcm5lcnMtZXhwZWN0ZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNjI5MTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvdGVzdGRhdGEvU2NhbGVkVGhlblJvdGF0ZWRSZWN0V2l0aERpZmZlcmVudFJvdW5kZWRDb3JuZXJzLWV4cGVjdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvdGVzdGRhdGEvU2NhbGVkVGhlblJvdGF0ZWRSb3VuZGVkQ29ybmVyc1ZpZXdwb3J0T3ZlckltYWdlLWV4cGVjdGVkLnBuZyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci90ZXN0ZGF0YS9TY2FsZWRUaGVuUm90YXRlZFJvdW5kZWRDb3JuZXJzVmlld3BvcnRPdmVySW1hZ2UtZXhwZWN0ZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YzJkN2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvdGVzdGRhdGEvU2NhbGVkVGhlblJvdGF0ZWRSb3VuZGVkQ29ybmVyc1ZpZXdwb3J0T3ZlckltYWdlLWV4cGVjdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9lcnJvcl9yZXBvcnQuaCBiL3NyYy9jb2JhbHQvc2NyaXB0L2Vycm9yX3JlcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYzFiMTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9lcnJvcl9yZXBvcnQuaApAQCAtMCwwICsxLDQxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIENPQkFMVF9TQ1JJUFRfRVJST1JfUkVQT1JUX0hfCisjZGVmaW5lIENPQkFMVF9TQ1JJUFRfRVJST1JfUkVQT1JUX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC92YWx1ZV9oYW5kbGUuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2Ugc2NyaXB0IHsKKworc3RydWN0IEVycm9yUmVwb3J0IHsKKyBwdWJsaWM6CisgIEVycm9yUmVwb3J0KCkgOiBsaW5lX251bWJlcigwKSwgY29sdW1uX251bWJlcigwKSwgaXNfbXV0ZWQoZmFsc2UpIHt9CisKKyAgc3RkOjpzdHJpbmcgbWVzc2FnZTsKKyAgc3RkOjpzdHJpbmcgZmlsZW5hbWU7CisgIHVpbnQzMiBsaW5lX251bWJlcjsKKyAgdWludDMyIGNvbHVtbl9udW1iZXI7CisgIHNjb3BlZF9wdHI8c2NyaXB0OjpWYWx1ZUhhbmRsZUhvbGRlcj4gZXJyb3I7CisgIGJvb2wgaXNfbXV0ZWQ7Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc2NyaXB0Cit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX1NDUklQVF9FUlJPUl9SRVBPUlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L2Zha2VfZ2xvYmFsX2Vudmlyb25tZW50LmggYi9zcmMvY29iYWx0L3NjcmlwdC9mYWtlX2dsb2JhbF9lbnZpcm9ubWVudC5oCmluZGV4IGNhOGMzZmEuLjM5MWM1ZTcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L2Zha2VfZ2xvYmFsX2Vudmlyb25tZW50LmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvZmFrZV9nbG9iYWxfZW52aXJvbm1lbnQuaApAQCAtNDksNiArNDksOCBAQAogICB2b2lkIEVuYWJsZUV2YWwoKSBPVkVSUklERSB7fQogICB2b2lkIERpc2FibGVKaXQoKSBPVkVSUklERSB7fQogICB2b2lkIFNldFJlcG9ydEV2YWxDYWxsYmFjayhjb25zdCBiYXNlOjpDbG9zdXJlJiAvKnJlcG9ydF9ldmFsKi8pIE9WRVJSSURFIHt9CisgIHZvaWQgU2V0UmVwb3J0RXJyb3JDYWxsYmFjaygKKyAgICAgIGNvbnN0IFJlcG9ydEVycm9yQ2FsbGJhY2smIC8qcmVwb3J0X2V2YWwqLykgT1ZFUlJJREUge30KICAgdm9pZCBCaW5kKGNvbnN0IHN0ZDo6c3RyaW5nJiAvKmlkZW50aWZpZXIqLywKICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgLyppbXBsKi8pIE9WRVJSSURFIHt9CiAgIFNjcmlwdFZhbHVlRmFjdG9yeSogc2NyaXB0X3ZhbHVlX2ZhY3RvcnkoKSB7IHJldHVybiBOVUxMOyB9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCBiL3NyYy9jb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oCmluZGV4IDc5NGNjMjIuLjAzOWYwNWQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgogI2luY2x1ZGUgImJhc2Uvb3B0aW9uYWwuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2Vycm9yX3JlcG9ydC5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWVfZmFjdG9yeS5oIgpAQCAtMzUsNiArMzYsOSBAQAogLy8gTWFuYWdlcyBhIGhhbmRsZSB0byBhIEphdmFTY3JpcHQgZW5naW5lJ3MgZ2xvYmFsIG9iamVjdC4KIGNsYXNzIEdsb2JhbEVudmlyb25tZW50IDogcHVibGljIGJhc2U6OlJlZkNvdW50ZWQ8R2xvYmFsRW52aXJvbm1lbnQ+IHsKICBwdWJsaWM6CisgIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8Ym9vbChjb25zdCBFcnJvclJlcG9ydCYgZXJyb3JfcmVwb3J0KT4KKyAgICAgIFJlcG9ydEVycm9yQ2FsbGJhY2s7CisKICAgLy8gQ3JlYXRlIGEgbmV3IGdsb2JhbCBvYmplY3Qgd2l0aCBiaW5kaW5ncyBhcyBkZWZpbmVkIGZvciB0aGUgZGVmaW5pdGlvbiBvZgogICAvLyB0aGUgR2xvYmFsSW50ZXJmYWNlIHR5cGUuIFRoZSBJREwgZm9yIHRoaXMgaW50ZXJmYWNlIG11c3QgaGF2ZSB0aGUKICAgLy8gUHJpbWFyeUdsb2JhbCBvciBHbG9iYWwgZXh0ZW5kZWQgYXR0cmlidXRlLgpAQCAtOTUsNiArOTksMTAgQEAKICAgLy8gY29uc3RydWN0b3IgaXMgdXNlZC4KICAgdmlydHVhbCB2b2lkIFNldFJlcG9ydEV2YWxDYWxsYmFjayhjb25zdCBiYXNlOjpDbG9zdXJlJiByZXBvcnRfZXZhbCkgPSAwOwogCisgIC8vIFNldCBhIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBmaXJlZCB3aGVuZXZlciBhIEphdmFTY3JpcHQgZXJyb3Igb2NjdXJzLgorICB2aXJ0dWFsIHZvaWQgU2V0UmVwb3J0RXJyb3JDYWxsYmFjaygKKyAgICAgIGNvbnN0IFJlcG9ydEVycm9yQ2FsbGJhY2smIHJlcG9ydF9lcnJvcikgPSAwOworCiAgIC8vIER5bmFtaWNhbGx5IGJpbmQgYSBjcHAgb2JqZWN0IHRvIHRoZSBqYXZhc2NyaXB0IGdsb2JhbCBvYmplY3Qgd2l0aCB0aGUKICAgLy8gc3VwcGxpZWQgaWRlbnRpZmllci4KICAgLy8gVGhpcyBtZXRob2QgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIGFuZCBkZWJ1ZyBwdXJwb3NlcywgYXMgd2VsbCBhcyBmb3IKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5jYyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5jYwppbmRleCBjODUwNTA2Li4yNjczNzc4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmNjCkBAIC0zMzksNiArMzM5LDEyIEBACiAgIHJlcG9ydF9ldmFsXyA9IHJlcG9ydF9ldmFsOwogfQogCit2b2lkIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OlNldFJlcG9ydEVycm9yQ2FsbGJhY2soCisgICAgY29uc3QgUmVwb3J0RXJyb3JDYWxsYmFjayYgcmVwb3J0X2Vycm9yX2NhbGxiYWNrKSB7CisgIERDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKKyAgcmVwb3J0X2Vycm9yX2NhbGxiYWNrXyA9IHJlcG9ydF9lcnJvcl9jYWxsYmFjazsKK30KKwogdm9pZCBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpCaW5kKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZGVudGlmaWVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgaW1wbCkgewogICBUUkFDS19NRU1PUllfU0NPUEUoIkphdmFzY3JpcHQiKTsKQEAgLTQ1NiwxOSArNDYyLDU0IEBACiAKIHZvaWQgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6UmVwb3J0RXJyb3IoY29uc3QgY2hhciogbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNFcnJvclJlcG9ydCogcmVwb3J0KSB7Ci0gIHN0ZDo6c3RyaW5nIGVycm9yX21lc3NhZ2U7CisgIEpTOjpSb290ZWRWYWx1ZSBleGNlcHRpb24oY29udGV4dF8pOworICA6OkpTX0dldFBlbmRpbmdFeGNlcHRpb24oY29udGV4dF8sICZleGNlcHRpb24pOworCisgIC8vIE5vdGU6IHdlIG11c3QgZG8gdGhpcyBiZWZvcmUgcnVubmluZyBhbnkgbW9yZSBjb2RlIG9uIGNvbnRleHQuCisgIDo6SlNfQ2xlYXJQZW5kaW5nRXhjZXB0aW9uKGNvbnRleHRfKTsKKworICAvLyBQb3B1bGF0ZSB0aGUgZXJyb3IgcmVwb3J0LgorICBFcnJvclJlcG9ydCBlcnJvcl9yZXBvcnQ7CiAgIGlmIChyZXBvcnQtPmVycm9yTnVtYmVyID09IEpTTVNHX0NTUF9CTE9DS0VEX0VWQUwpIHsKLSAgICBlcnJvcl9tZXNzYWdlID0gZXZhbF9kaXNhYmxlZF9tZXNzYWdlXy52YWx1ZV9vcihtZXNzYWdlKTsKKyAgICBlcnJvcl9yZXBvcnQubWVzc2FnZSA9IGV2YWxfZGlzYWJsZWRfbWVzc2FnZV8udmFsdWVfb3IobWVzc2FnZSk7CiAgIH0gZWxzZSB7Ci0gICAgZXJyb3JfbWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgZXJyb3JfcmVwb3J0Lm1lc3NhZ2UgPSBtZXNzYWdlOworICB9CisgIGVycm9yX3JlcG9ydC5maWxlbmFtZSA9CisgICAgICByZXBvcnQtPmZpbGVuYW1lID8gcmVwb3J0LT5maWxlbmFtZSA6ICI8aW50ZXJuYWwgZXhjZXB0aW9uPiI7CisgIGVycm9yX3JlcG9ydC5saW5lX251bWJlciA9IHJlcG9ydC0+bGluZW5vOworICBlcnJvcl9yZXBvcnQuY29sdW1uX251bWJlciA9IHJlcG9ydC0+Y29sdW1uOworICAvLyBMZXQgZXJyb3Igb2JqZWN0IGJlIHRoZSBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBlcnJvcjogaW4gdGhlIGNhc2Ugb2YKKyAgLy8gYW4gdW5jYXVnaHQgZXhjZXB0aW9uLCB0aGF0IHdvdWxkIGJlIHRoZSBvYmplY3QgdGhhdCB3YXMgdGhyb3duOyBpbiB0aGUKKyAgLy8gY2FzZSBvZiBhIEphdmFTY3JpcHQgZXJyb3IgdGhhdCB3b3VsZCBiZSBhbiBFcnJvciBvYmplY3QuIElmIHRoZXJlIGlzIG5vCisgIC8vIGNvcnJlc3BvbmRpbmcgb2JqZWN0LCB0aGVuIHRoZSBudWxsIHZhbHVlIG11c3QgYmUgdXNlZCBpbnN0ZWFkLgorICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS93ZWJhcHBhcGlzLmh0bWwjcnVudGltZS1zY3JpcHQtZXJyb3JzCisgIGlmIChleGNlcHRpb24uaXNPYmplY3QoKSkgeworICAgIGVycm9yX3JlcG9ydC5lcnJvci5yZXNldCgKKyAgICAgICAgbmV3IE1vempzVmFsdWVIYW5kbGVIb2xkZXIoZXhjZXB0aW9uLCBjb250ZXh0Xywgd3JhcHBlcl9mYWN0b3J5KCkpKTsKKyAgfQorICBlcnJvcl9yZXBvcnQuaXNfbXV0ZWQgPSByZXBvcnQtPmlzTXV0ZWQ7CisKKyAgLy8gSWYgdGhpcyBpc24ndCBzaW1wbHkgYSB3YXJuaW5nLCBhbmQgdGhlIGVycm9yIHdhc24ndCBjYXVzZWQgYnkgSlMgcnVubmluZworICAvLyBvdXQgb2YgbWVtb3J5IChpbiB3aGljaCBjYXNlIHRoZSBjYWxsYmFjayB3aWxsIGZhaWwgYXMgd2VsbCksIHRoZW4gcnVuCisgIC8vIHRoZSBjYWxsYmFjay4gSW4gdGhlIGNhc2UgdGhhdCBpdCByZXR1cm5zIHRoYXQgdGhlIHNjcmlwdCB3YXMgaGFuZGxlZCwKKyAgLy8gc2ltcGx5IHJldHVybjsgdGhlIGVycm9yIHNob3VsZCBvbmx5IGJlIHJlcG9ydGVkIHRvIHRoZSB1c2VyIGlmIGl0IHdhc24ndAorICAvLyBoYW5kbGVkLgorICBpZiAoIUpTUkVQT1JUX0lTX1dBUk5JTkcocmVwb3J0LT5mbGFncykgJiYKKyAgICAgIHJlcG9ydC0+ZXJyb3JOdW1iZXIgIT0gSlNNU0dfT1VUX09GX01FTU9SWSAmJgorICAgICAgIXJlcG9ydF9lcnJvcl9jYWxsYmFja18uaXNfbnVsbCgpICYmCisgICAgICByZXBvcnRfZXJyb3JfY2FsbGJhY2tfLlJ1bihlcnJvcl9yZXBvcnQpKSB7CisgICAgcmV0dXJuOwogICB9CiAKKyAgLy8gSWYgdGhlIGVycm9yIGlzIG5vdCBoYW5kbGVkLCB0aGVuIHRoZSBlcnJvciBtYXkgYmUgcmVwb3J0ZWQgdG8gdGhlIHVzZXIuCisgIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3dlYmFwcGFwaXMuaHRtbCNydW50aW1lLXNjcmlwdC1lcnJvcnMtaW4tZG9jdW1lbnRzCiAgIGlmIChsYXN0X2Vycm9yX21lc3NhZ2VfKSB7Ci0gICAgKmxhc3RfZXJyb3JfbWVzc2FnZV8gPSBlcnJvcl9tZXNzYWdlOworICAgICpsYXN0X2Vycm9yX21lc3NhZ2VfID0gZXJyb3JfcmVwb3J0Lm1lc3NhZ2U7CiAgIH0gZWxzZSB7Ci0gICAgY29uc3QgY2hhciogZmlsZW5hbWUgPSByZXBvcnQtPmZpbGVuYW1lID8gcmVwb3J0LT5maWxlbmFtZSA6ICIobm9uZSkiOwotICAgIExPRyhFUlJPUikgPDwgIkpTIEVycm9yOiAiIDw8IGZpbGVuYW1lIDw8ICI6IiA8PCByZXBvcnQtPmxpbmVubyA8PCAiOiIKLSAgICAgICAgICAgICAgIDw8IHJlcG9ydC0+Y29sdW1uIDw8ICI6ICIgPDwgZXJyb3JfbWVzc2FnZTsKKyAgICBMT0coRVJST1IpIDw8ICJKUyBFcnJvcjogIiA8PCBlcnJvcl9yZXBvcnQuZmlsZW5hbWUgPDwgIjoiCisgICAgICAgICAgICAgICA8PCBlcnJvcl9yZXBvcnQubGluZV9udW1iZXIgPDwgIjoiIDw8IGVycm9yX3JlcG9ydC5jb2x1bW5fbnVtYmVyCisgICAgICAgICAgICAgICA8PCAiOiAiIDw8IGVycm9yX3JlcG9ydC5tZXNzYWdlOwogICB9CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgKaW5kZXggZTM0ZWFiZS4uYTdiY2NhZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgKQEAgLTc1LDYgKzc1LDkgQEAKIAogICB2b2lkIFNldFJlcG9ydEV2YWxDYWxsYmFjayhjb25zdCBiYXNlOjpDbG9zdXJlJiByZXBvcnRfZXZhbCkgT1ZFUlJJREU7CiAKKyAgdm9pZCBTZXRSZXBvcnRFcnJvckNhbGxiYWNrKAorICAgICAgY29uc3QgUmVwb3J0RXJyb3JDYWxsYmFjayYgcmVwb3J0X2Vycm9yX2NhbGxiYWNrKSBPVkVSUklERTsKKwogICB2b2lkIEJpbmQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkZW50aWZpZXIsCiAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIGltcGwpIE9WRVJSSURFOwogCkBAIC0xODIsNiArMTg1LDcgQEAKICAgYm9vbCBldmFsX2VuYWJsZWRfOwogICBiYXNlOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gZXZhbF9kaXNhYmxlZF9tZXNzYWdlXzsKICAgYmFzZTo6Q2xvc3VyZSByZXBvcnRfZXZhbF87CisgIFJlcG9ydEVycm9yQ2FsbGJhY2sgcmVwb3J0X2Vycm9yX2NhbGxiYWNrXzsKIAogICBmcmllbmQgY2xhc3MgR2xvYmFsT2JqZWN0UHJveHk7CiB9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmNjIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmNjCmluZGV4IDcxYjU5M2QuLjUyYWYxZmUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5jYworKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuY2MKQEAgLTM0NCw2ICszNDQsMTIgQEAKICAgcmVwb3J0X2V2YWxfID0gcmVwb3J0X2V2YWw7CiB9CiAKK3ZvaWQgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6U2V0UmVwb3J0RXJyb3JDYWxsYmFjaygKKyAgICBjb25zdCBSZXBvcnRFcnJvckNhbGxiYWNrJiByZXBvcnRfZXJyb3JfY2FsbGJhY2spIHsKKyAgRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOworICByZXBvcnRfZXJyb3JfY2FsbGJhY2tfID0gcmVwb3J0X2Vycm9yX2NhbGxiYWNrOworfQorCiB2b2lkIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkJpbmQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkZW50aWZpZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiBpbXBsKSB7CiAgIFRSQUNLX01FTU9SWV9TQ09QRSgiSmF2YXNjcmlwdCIpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmggYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaAppbmRleCA0OTE0ZTE4Li5lMjIxYTVkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaApAQCAtNzQsNiArNzQsOSBAQAogCiAgIHZvaWQgU2V0UmVwb3J0RXZhbENhbGxiYWNrKGNvbnN0IGJhc2U6OkNsb3N1cmUmIHJlcG9ydF9ldmFsKSBPVkVSUklERTsKIAorICB2b2lkIFNldFJlcG9ydEVycm9yQ2FsbGJhY2soCisgICAgICBjb25zdCBSZXBvcnRFcnJvckNhbGxiYWNrJiByZXBvcnRfZXJyb3JfY2FsbGJhY2spIE9WRVJSSURFOworCiAgIHZvaWQgQmluZChjb25zdCBzdGQ6OnN0cmluZyYgaWRlbnRpZmllciwKICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgaW1wbCkgT1ZFUlJJREU7CiAKQEAgLTE4MSw2ICsxODQsNyBAQAogICBib29sIGV2YWxfZW5hYmxlZF87CiAgIGJhc2U6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBldmFsX2Rpc2FibGVkX21lc3NhZ2VfOwogICBiYXNlOjpDbG9zdXJlIHJlcG9ydF9ldmFsXzsKKyAgUmVwb3J0RXJyb3JDYWxsYmFjayByZXBvcnRfZXJyb3JfY2FsbGJhY2tfOwogCiAgIGZyaWVuZCBjbGFzcyBHbG9iYWxPYmplY3RQcm94eTsKIH07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9zY3JpcHQuZ3lwIGIvc3JjL2NvYmFsdC9zY3JpcHQvc2NyaXB0Lmd5cAppbmRleCBhN2U5MTkyLi4zNGE3YzRlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9zY3JpcHQuZ3lwCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L3NjcmlwdC5neXAKQEAgLTIxLDYgKzIxLDcgQEAKICAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKICAgICAgICdzb3VyY2VzJzogWwogICAgICAgICAnY2FsbF9mcmFtZS5oJywKKyAgICAgICAgJ2Vycm9yX3JlcG9ydC5oJywKICAgICAgICAgJ2V4Y2VwdGlvbl9tZXNzYWdlLmNjJywKICAgICAgICAgJ2V4Y2VwdGlvbl9tZXNzYWdlLmgnLAogICAgICAgICAnZXhlY3V0aW9uX3N0YXRlLmNjJywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL2dvb2dsZV9zcGVlY2hfc2VydmljZS5jYyBiL3NyYy9jb2JhbHQvc3BlZWNoL2dvb2dsZV9zcGVlY2hfc2VydmljZS5jYwppbmRleCAyM2RlZGZkLi42ZmI3YTM0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC9nb29nbGVfc3BlZWNoX3NlcnZpY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvZ29vZ2xlX3NwZWVjaF9zZXJ2aWNlLmNjCkBAIC0yOTAsMTQgKzI5MCwxMiBAQAogCiAgIGNvbnN0IGNoYXIqIHNwZWVjaF9hcGlfa2V5ID0gIiI7CiAjaWYgZGVmaW5lZChPU19TVEFSQk9BUkQpCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gMgogICBjb25zdCBpbnQga1NwZWVjaEFwaUtleUxlbmd0aCA9IDEwMDsKICAgY2hhciBidWZmZXJba1NwZWVjaEFwaUtleUxlbmd0aF0gPSB7MH07CiAgIGJvb2wgcmVzdWx0ID0gU2JTeXN0ZW1HZXRQcm9wZXJ0eShrU2JTeXN0ZW1Qcm9wZXJ0eVNwZWVjaEFwaUtleSwgYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JfQVJSQVlfU0laRV9JTlQoYnVmZmVyKSk7CiAgIFNCX0RDSEVDSyhyZXN1bHQpOwogICBzcGVlY2hfYXBpX2tleSA9IHJlc3VsdCA/IGJ1ZmZlciA6ICIiOwotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSAyCiAjZW5kaWYgIC8vIGRlZmluZWQoT1NfU1RBUkJPQVJEKQogCiAgIHVwX3VybCA9IEFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHVwX3VybCwgImtleSIsIHNwZWVjaF9hcGlfa2V5KTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9jb25maWd1cmF0aW9uLmggYi9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfY29uZmlndXJhdGlvbi5oCmluZGV4IDhiOWUwYmEuLmMyM2VlNWUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9jb25maWd1cmF0aW9uLmgKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX2NvbmZpZ3VyYXRpb24uaApAQCAtMTYsMTUgKzE2LDE0IEBACiAjZGVmaW5lIENPQkFMVF9TUEVFQ0hfU1BFRUNIX0NPTkZJR1VSQVRJT05fSF8KIAogI2luY2x1ZGUgImJ1aWxkL2J1aWxkX2NvbmZpZy5oIgotCi0jaWYgZGVmaW5lZChPU19TVEFSQk9BUkQpCiAjaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCIKLSNpZiBTQl9IQVMoTUlDUk9QSE9ORSkgJiYgU0JfQVBJX1ZFUlNJT04gPj0gMgorCisjaWYgU0JfSEFTKE1JQ1JPUEhPTkUpCiAjZGVmaW5lIFNCX1VTRV9TQl9NSUNST1BIT05FIDEKLSNlbmRpZiAgLy8gU0JfSEFTKE1JQ1JPUEhPTkUpICYmIFNCX1ZFUlNJT04oMikKKyNlbmRpZiAgLy8gU0JfSEFTKE1JQ1JPUEhPTkUpCisKICNpZiBTQl9IQVMoU1BFRUNIX1JFQ09HTklaRVIpICYmIFNCX0FQSV9WRVJTSU9OID49IDUKICNkZWZpbmUgU0JfVVNFX1NCX1NQRUVDSF9SRUNPR05JWkVSIDEKICNlbmRpZiAgLy8gU0JfSEFTKFNQRUVDSF9SRUNPR05JWkVSKSAmJiBTQl9BUElfVkVSU0lPTiA+PSA1Ci0jZW5kaWYgIC8vIGRlZmluZWQoT1NfU1RBUkJPQVJEKQogCiAjZW5kaWYgIC8vIENPQkFMVF9TUEVFQ0hfU1BFRUNIX0NPTkZJR1VSQVRJT05fSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9zeW50aGVzaXMuY2MgYi9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfc3ludGhlc2lzLmNjCmluZGV4IDVlM2UxYmIuLmZiMzRlYWEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9zeW50aGVzaXMuY2MKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3N5bnRoZXNpcy5jYwpAQCAtMTAwLDEyICsxMDAsNiBAQAogICAgIHJldHVybjsKICAgfQogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPCA0Ci0gIC8vIERFUFJFQ0FURUQgSU4gQVBJIFZFUlNJT04gNAotICBzdGQ6OnN0cmluZyBsYW5ndWFnZSA9Ci0gICAgICB1dHRlcmFuY2UtPmxhbmcoKS5lbXB0eSgpID8gbmF2aWdhdG9yXy0+bGFuZ3VhZ2UoKSA6IHV0dGVyYW5jZS0+bGFuZygpOwotICBTYlNwZWVjaFN5bnRoZXNpc1NldExhbmd1YWdlKGxhbmd1YWdlLmNfc3RyKCkpOwotI2VuZGlmCiAgIFNCX0RMT0coSU5GTykgPDwgIlNwZWFraW5nOiBcIiIgPDwgdXR0ZXJhbmNlLT50ZXh0KCkgPDwgIlwiICIKICAgICAgICAgICAgICAgICA8PCB1dHRlcmFuY2UtPmxhbmcoKTsKICAgU2JTcGVlY2hTeW50aGVzaXNTcGVhayh1dHRlcmFuY2UtPnRleHQoKS5jX3N0cigpKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvdmVyc2lvbi5oIGIvc3JjL2NvYmFsdC92ZXJzaW9uLmgKaW5kZXggZTlkYWE3OC4uODg1ODJkYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC92ZXJzaW9uLmgKKysrIGIvc3JjL2NvYmFsdC92ZXJzaW9uLmgKQEAgLTE1LDYgKzE1LDYgQEAKICNkZWZpbmUgQ09CQUxUX1ZFUlNJT05fSF8KIAogLy8gQ29iYWx0IHJlbGVhc2UgbnVtYmVyLgotI2RlZmluZSBDT0JBTFRfVkVSU0lPTiAiMTIiCisjZGVmaW5lIENPQkFMVF9WRVJTSU9OICIxMyIKIAogI2VuZGlmICAvLyBDT0JBTFRfVkVSU0lPTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2VydmVyLmNjIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2VydmVyLmNjCmluZGV4IDMyMWM4YzQuLjE0NmI2NzQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3NlcnZlci5jYworKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9zZXJ2ZXIuY2MKQEAgLTIxLDYgKzIxLDggQEAKICNpbmNsdWRlICJiYXNlL2pzb24vanNvbl9yZWFkZXIuaCIKICNpbmNsdWRlICJiYXNlL2pzb24vanNvbl93cml0ZXIuaCIKICNpbmNsdWRlICJiYXNlL3N0cmluZ191dGlsLmgiCisjaW5jbHVkZSAibmV0L2Jhc2UvaXBfZW5kcG9pbnQuaCIKKyNpbmNsdWRlICJuZXQvYmFzZS9uZXRfZXJyb3JzLmgiCiAjaW5jbHVkZSAibmV0L2Jhc2UvdGNwX2xpc3Rlbl9zb2NrZXQuaCIKICNpbmNsdWRlICJuZXQvc2VydmVyL2h0dHBfc2VydmVyX3JlcXVlc3RfaW5mby5oIgogCkBAIC0xNzcsMTEgKzE3OSwyMSBAQAogCiBXZWJEcml2ZXJTZXJ2ZXI6OldlYkRyaXZlclNlcnZlcihpbnQgcG9ydCwgY29uc3Qgc3RkOjpzdHJpbmcmIGxpc3Rlbl9pcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhhbmRsZVJlcXVlc3RDYWxsYmFjayYgY2FsbGJhY2spCi0gICAgOiBoYW5kbGVfcmVxdWVzdF9jYWxsYmFja18oY2FsbGJhY2spIHsKKyAgICA6IGhhbmRsZV9yZXF1ZXN0X2NhbGxiYWNrXyhjYWxsYmFjayksCisgICAgICBzZXJ2ZXJfYWRkcmVzc18oIldlYkRyaXZlci5TZXJ2ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICJBZGRyZXNzIHRvIGNvbW11bmljYXRlIHdpdGggV2ViRHJpdmVyLiIpIHsKICAgLy8gQ3JlYXRlIGh0dHAgc2VydmVyCiAgIGZhY3RvcnlfLnJlc2V0KG5ldyBuZXQ6OlRDUExpc3RlblNvY2tldEZhY3RvcnkobGlzdGVuX2lwLCBwb3J0KSk7CiAgIHNlcnZlcl8gPSBuZXcgbmV0OjpIdHRwU2VydmVyKCpmYWN0b3J5XywgdGhpcyk7Ci0gIExPRyhJTkZPKSA8PCAiU3RhcnRpbmcgV2ViRHJpdmVyIHNlcnZlciBvbiBwb3J0ICIgPDwgcG9ydDsKKyAgR1VSTCBhZGRyZXNzOworICBpbnQgcmVzdWx0ID0gR2V0TG9jYWxBZGRyZXNzKCZhZGRyZXNzKTsKKyAgaWYgKHJlc3VsdCA9PSBuZXQ6Ok9LKSB7CisgICAgTE9HKElORk8pIDw8ICJTdGFydGluZyBXZWJEcml2ZXIgc2VydmVyIG9uIHBvcnQgIiA8PCBwb3J0OworICAgIHNlcnZlcl9hZGRyZXNzXyA9IGFkZHJlc3Muc3BlYygpOworICB9IGVsc2UgeworICAgIExPRyhXQVJOSU5HKSA8PCAiQ291bGQgbm90IHN0YXJ0IFdlYkRyaXZlciBzZXJ2ZXIiOworICAgIHNlcnZlcl9hZGRyZXNzXyA9ICI8Tk9UIFJVTk5JTkc+IjsKKyAgfQogfQogCiB2b2lkIFdlYkRyaXZlclNlcnZlcjo6T25IdHRwUmVxdWVzdChpbnQgY29ubmVjdGlvbl9pZCwKQEAgLTIxNyw1ICsyMjksMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLlBhc3MoKSwgcmVzcG9uc2VfaGFuZGxlci5QYXNzKCkpOwogfQogCitpbnQgV2ViRHJpdmVyU2VydmVyOjpHZXRMb2NhbEFkZHJlc3MoR1VSTCogb3V0KSBjb25zdCB7CisgIG5ldDo6SVBFbmRQb2ludCBpcF9hZGRyOworICBpbnQgcmVzdWx0ID0gc2VydmVyXy0+R2V0TG9jYWxBZGRyZXNzKCZpcF9hZGRyKTsKKyAgaWYgKHJlc3VsdCA9PSBuZXQ6Ok9LKSB7CisgICAgKm91dCA9IEdVUkwoImh0dHA6Ly8iICsgaXBfYWRkci5Ub1N0cmluZygpKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCiB9ICAvLyBuYW1lc3BhY2Ugd2ViZHJpdmVyCiB9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci9zZXJ2ZXIuaCBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3NlcnZlci5oCmluZGV4IDcxYTY2ZmEuLjAzYmEyYjQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3NlcnZlci5oCisrKyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3NlcnZlci5oCkBAIC0yMiw3ICsyMiw5IEBACiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgogI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZC5oIgogI2luY2x1ZGUgImJhc2UvdmFsdWVzLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvY192YWwuaCIKICNpbmNsdWRlICJjb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL3NlcnZlcl9zdGF0dXMuaCIKKyNpbmNsdWRlICJnb29nbGV1cmwvc3JjL2d1cmwuaCIKICNpbmNsdWRlICJuZXQvYmFzZS9zdHJlYW1fbGlzdGVuX3NvY2tldC5oIgogI2luY2x1ZGUgIm5ldC9zZXJ2ZXIvaHR0cF9zZXJ2ZXIuaCIKIApAQCAtOTIsMTAgKzk0LDEzIEBACiAgIHZvaWQgT25DbG9zZShpbnQpIE9WRVJSSURFIHt9ICAvLyBOT0xJTlQocmVhZGFiaWxpdHkvY2FzdGluZykKIAogIHByaXZhdGU6CisgIGludCBHZXRMb2NhbEFkZHJlc3MoR1VSTCogb3V0KSBjb25zdDsKKwogICBiYXNlOjpUaHJlYWRDaGVja2VyIHRocmVhZF9jaGVja2VyXzsKICAgSGFuZGxlUmVxdWVzdENhbGxiYWNrIGhhbmRsZV9yZXF1ZXN0X2NhbGxiYWNrXzsKICAgc2NvcGVkX3B0cjxuZXQ6OlN0cmVhbUxpc3RlblNvY2tldEZhY3Rvcnk+IGZhY3RvcnlfOwogICBzY29wZWRfcmVmcHRyPG5ldDo6SHR0cFNlcnZlcj4gc2VydmVyXzsKKyAgYmFzZTo6Q1ZhbDxzdGQ6OnN0cmluZz4gc2VydmVyX2FkZHJlc3NfOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIHdlYmRyaXZlcgpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2FuZHJvaWQvYXVkaW9fbWFuYWdlcl9hbmRyb2lkLmNjIGIvc3JjL21lZGlhL2F1ZGlvL2FuZHJvaWQvYXVkaW9fbWFuYWdlcl9hbmRyb2lkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTRkNmJhLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9hbmRyb2lkL2F1ZGlvX21hbmFnZXJfYW5kcm9pZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hbmRyb2lkL2F1ZGlvX21hbmFnZXJfYW5kcm9pZC5oIgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYW5kcm9pZC9vcGVuc2xlc19pbnB1dC5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2FuZHJvaWQvb3BlbnNsZXNfb3V0cHV0LmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fbWFuYWdlci5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2Zha2VfYXVkaW9faW5wdXRfc3RyZWFtLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIE1heGltdW0gbnVtYmVyIG9mIG91dHB1dCBzdHJlYW1zIHRoYXQgY2FuIGJlIG9wZW4gc2ltdWx0YW5lb3VzbHkuCi1zdGF0aWMgY29uc3QgaW50IGtNYXhPdXRwdXRTdHJlYW1zID0gMTA7Ci0KLUF1ZGlvTWFuYWdlciogQ3JlYXRlQXVkaW9NYW5hZ2VyKCkgewotICByZXR1cm4gbmV3IEF1ZGlvTWFuYWdlckFuZHJvaWQoKTsKLX0KLQotQXVkaW9NYW5hZ2VyQW5kcm9pZDo6QXVkaW9NYW5hZ2VyQW5kcm9pZCgpIHsKLSAgU2V0TWF4T3V0cHV0U3RyZWFtc0FsbG93ZWQoa01heE91dHB1dFN0cmVhbXMpOwotfQotCi1BdWRpb01hbmFnZXJBbmRyb2lkOjp+QXVkaW9NYW5hZ2VyQW5kcm9pZCgpIHsKLSAgU2h1dGRvd24oKTsKLX0KLQotYm9vbCBBdWRpb01hbmFnZXJBbmRyb2lkOjpIYXNBdWRpb091dHB1dERldmljZXMoKSB7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEF1ZGlvTWFuYWdlckFuZHJvaWQ6Okhhc0F1ZGlvSW5wdXREZXZpY2VzKCkgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLUF1ZGlvT3V0cHV0U3RyZWFtKiBBdWRpb01hbmFnZXJBbmRyb2lkOjpNYWtlTGluZWFyT3V0cHV0U3RyZWFtKAotICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpIHsKLSAgRENIRUNLX0VRKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xJTkVBUiwgcGFyYW1zLmZvcm1hdCgpKTsKLSAgcmV0dXJuIG5ldyBPcGVuU0xFU091dHB1dFN0cmVhbSh0aGlzLCBwYXJhbXMpOwotfQotCi1BdWRpb091dHB1dFN0cmVhbSogQXVkaW9NYW5hZ2VyQW5kcm9pZDo6TWFrZUxvd0xhdGVuY3lPdXRwdXRTdHJlYW0oCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcykgewotICBEQ0hFQ0tfRVEoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTE9XX0xBVEVOQ1ksIHBhcmFtcy5mb3JtYXQoKSk7Ci0gIHJldHVybiBuZXcgT3BlblNMRVNPdXRwdXRTdHJlYW0odGhpcywgcGFyYW1zKTsKLX0KLQotQXVkaW9JbnB1dFN0cmVhbSogQXVkaW9NYW5hZ2VyQW5kcm9pZDo6TWFrZUxpbmVhcklucHV0U3RyZWFtKAotICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2lkKSB7Ci0gIERDSEVDS19FUShBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIsIHBhcmFtcy5mb3JtYXQoKSk7Ci0gIHJldHVybiBuZXcgT3BlblNMRVNJbnB1dFN0cmVhbSh0aGlzLCBwYXJhbXMpOwotfQotCi1BdWRpb0lucHV0U3RyZWFtKiBBdWRpb01hbmFnZXJBbmRyb2lkOjpNYWtlTG93TGF0ZW5jeUlucHV0U3RyZWFtKAotICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2lkKSB7Ci0gIERDSEVDS19FUShBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MT1dfTEFURU5DWSwgcGFyYW1zLmZvcm1hdCgpKTsKLSAgcmV0dXJuIG5ldyBPcGVuU0xFU0lucHV0U3RyZWFtKHRoaXMsIHBhcmFtcyk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2FuZHJvaWQvYXVkaW9fbWFuYWdlcl9hbmRyb2lkLmggYi9zcmMvbWVkaWEvYXVkaW8vYW5kcm9pZC9hdWRpb19tYW5hZ2VyX2FuZHJvaWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYxNDgwOC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vYW5kcm9pZC9hdWRpb19tYW5hZ2VyX2FuZHJvaWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfQVVESU9fQU5EUk9JRF9BVURJT19NQU5BR0VSX0FORFJPSURfSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fQU5EUk9JRF9BVURJT19NQU5BR0VSX0FORFJPSURfSF8KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX21hbmFnZXJfYmFzZS5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBBbmRyb2lkIGltcGxlbWVudGlvbiBvZiBBdWRpb01hbmFnZXIuCi1jbGFzcyBNRURJQV9FWFBPUlQgQXVkaW9NYW5hZ2VyQW5kcm9pZCA6IHB1YmxpYyBBdWRpb01hbmFnZXJCYXNlIHsKLSBwdWJsaWM6Ci0gIEF1ZGlvTWFuYWdlckFuZHJvaWQoKTsKLQotICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBBdWRpb01hbmFnZXIuCi0gIHZpcnR1YWwgYm9vbCBIYXNBdWRpb091dHB1dERldmljZXMoKSBPVkVSUklERTsKLSAgdmlydHVhbCBib29sIEhhc0F1ZGlvSW5wdXREZXZpY2VzKCkgT1ZFUlJJREU7Ci0KLSAgLy8gSW1wbGVtZW50YXRpb24gb2YgQXVkaW9NYW5hZ2VyQmFzZS4KLSAgdmlydHVhbCBBdWRpb091dHB1dFN0cmVhbSogTWFrZUxpbmVhck91dHB1dFN0cmVhbSgKLSAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKSBPVkVSUklERTsKLSAgdmlydHVhbCBBdWRpb091dHB1dFN0cmVhbSogTWFrZUxvd0xhdGVuY3lPdXRwdXRTdHJlYW0oCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcykgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgQXVkaW9JbnB1dFN0cmVhbSogTWFrZUxpbmVhcklucHV0U3RyZWFtKAotICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfaWQpIE9WRVJSSURFOwotICB2aXJ0dWFsIEF1ZGlvSW5wdXRTdHJlYW0qIE1ha2VMb3dMYXRlbmN5SW5wdXRTdHJlYW0oCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCkgT1ZFUlJJREU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgfkF1ZGlvTWFuYWdlckFuZHJvaWQoKTsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBdWRpb01hbmFnZXJBbmRyb2lkKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0FVRElPX0FORFJPSURfQVVESU9fTUFOQUdFUl9BTkRST0lEX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vYW5kcm9pZC9vcGVuc2xlc19pbnB1dC5jYyBiL3NyYy9tZWRpYS9hdWRpby9hbmRyb2lkL29wZW5zbGVzX2lucHV0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGY1YmMxLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9hbmRyb2lkL29wZW5zbGVzX2lucHV0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzAxICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hbmRyb2lkL29wZW5zbGVzX2lucHV0LmgiCi0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hbmRyb2lkL2F1ZGlvX21hbmFnZXJfYW5kcm9pZC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1PcGVuU0xFU0lucHV0U3RyZWFtOjpPcGVuU0xFU0lucHV0U3RyZWFtKEF1ZGlvTWFuYWdlckFuZHJvaWQqIGF1ZGlvX21hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKQotICAgIDogYXVkaW9fbWFuYWdlcl8oYXVkaW9fbWFuYWdlciksCi0gICAgICBjYWxsYmFja18oTlVMTCksCi0gICAgICByZWNvcmRlcl8oTlVMTCksCi0gICAgICBzaW1wbGVfYnVmZmVyX3F1ZXVlXyhOVUxMKSwKLSAgICAgIGFjdGl2ZV9xdWV1ZV8oMCksCi0gICAgICBidWZmZXJfc2l6ZV9ieXRlc18oMCksCi0gICAgICBzdGFydGVkXyhmYWxzZSkgewotICBmb3JtYXRfLmZvcm1hdFR5cGUgPSBTTF9EQVRBRk9STUFUX1BDTTsKLSAgZm9ybWF0Xy5udW1DaGFubmVscyA9IHN0YXRpY19jYXN0PFNMdWludDMyPihwYXJhbXMuY2hhbm5lbHMoKSk7Ci0gIC8vIFByb3ZpZGVzIHNhbXBsaW5nIHJhdGUgaW4gbWlsbGlIZXJ0eiB0byBPcGVuU0xFUy4KLSAgZm9ybWF0Xy5zYW1wbGVzUGVyU2VjID0gc3RhdGljX2Nhc3Q8U0x1aW50MzI+KHBhcmFtcy5zYW1wbGVfcmF0ZSgpICogMTAwMCk7Ci0gIGZvcm1hdF8uYml0c1BlclNhbXBsZSA9IHBhcmFtcy5iaXRzX3Blcl9zYW1wbGUoKTsKLSAgZm9ybWF0Xy5jb250YWluZXJTaXplID0gcGFyYW1zLmJpdHNfcGVyX3NhbXBsZSgpOwotICBmb3JtYXRfLmVuZGlhbm5lc3MgPSBTTF9CWVRFT1JERVJfTElUVExFRU5ESUFOOwotICBpZiAoZm9ybWF0Xy5udW1DaGFubmVscyA9PSAxKQotICAgIGZvcm1hdF8uY2hhbm5lbE1hc2sgPSBTTF9TUEVBS0VSX0ZST05UX0NFTlRFUjsKLSAgZWxzZSBpZiAoZm9ybWF0Xy5udW1DaGFubmVscyA9PSAyKQotICAgIGZvcm1hdF8uY2hhbm5lbE1hc2sgPSBTTF9TUEVBS0VSX0ZST05UX0xFRlQgfCBTTF9TUEVBS0VSX0ZST05UX1JJR0hUOwotICBlbHNlCi0gICAgTk9UUkVBQ0hFRCgpIDw8ICJVbnN1cHBvcnRlZCBudW1iZXIgb2YgY2hhbm5lbHM6ICIgPDwgZm9ybWF0Xy5udW1DaGFubmVsczsKLQotICBidWZmZXJfc2l6ZV9ieXRlc18gPSBwYXJhbXMuR2V0Qnl0ZXNQZXJCdWZmZXIoKTsKLQotICBtZW1zZXQoJmF1ZGlvX2RhdGFfLCAwLCBzaXplb2YoYXVkaW9fZGF0YV8pKTsKLX0KLQotT3BlblNMRVNJbnB1dFN0cmVhbTo6fk9wZW5TTEVTSW5wdXRTdHJlYW0oKSB7Ci0gIERDSEVDSyghcmVjb3JkZXJfb2JqZWN0Xy5HZXQoKSk7Ci0gIERDSEVDSyghZW5naW5lX29iamVjdF8uR2V0KCkpOwotICBEQ0hFQ0soIXJlY29yZGVyXyk7Ci0gIERDSEVDSyghc2ltcGxlX2J1ZmZlcl9xdWV1ZV8pOwotICBEQ0hFQ0soIWF1ZGlvX2RhdGFfWzBdKTsKLX0KLQotYm9vbCBPcGVuU0xFU0lucHV0U3RyZWFtOjpPcGVuKCkgewotICBpZiAoZW5naW5lX29iamVjdF8uR2V0KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghQ3JlYXRlUmVjb3JkZXIoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgU2V0dXBBdWRpb0J1ZmZlcigpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIE9wZW5TTEVTSW5wdXRTdHJlYW06OlN0YXJ0KEF1ZGlvSW5wdXRDYWxsYmFjayogY2FsbGJhY2spIHsKLSAgRENIRUNLKGNhbGxiYWNrKTsKLSAgRENIRUNLKHJlY29yZGVyXyk7Ci0gIERDSEVDSyhzaW1wbGVfYnVmZmVyX3F1ZXVlXyk7Ci0gIGlmIChzdGFydGVkXykKLSAgICByZXR1cm47Ci0KLSAgLy8gRW5hYmxlIHRoZSBmbGFncyBiZWZvcmUgc3RyZWFtaW5nLgotICBjYWxsYmFja18gPSBjYWxsYmFjazsKLSAgYWN0aXZlX3F1ZXVlXyA9IDA7Ci0gIHN0YXJ0ZWRfID0gdHJ1ZTsKLQotICBTTHJlc3VsdCBlcnIgPSBTTF9SRVNVTFRfVU5LTk9XTl9FUlJPUjsKLSAgLy8gRW5xdWV1ZXMgfGtOdW1PZlF1ZXVlc0luQnVmZmVyfCB6ZXJvIGJ1ZmZlcnMgdG8gZ2V0IHRoZSBiYWxsIHJvbGxpbmcuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwga051bU9mUXVldWVzSW5CdWZmZXIgLSAxOyArK2kpIHsKLSAgICBlcnIgPSAoKnNpbXBsZV9idWZmZXJfcXVldWVfKS0+RW5xdWV1ZSgKLSAgICAgICAgc2ltcGxlX2J1ZmZlcl9xdWV1ZV8sCi0gICAgICAgIGF1ZGlvX2RhdGFfW2ldLAotICAgICAgICBidWZmZXJfc2l6ZV9ieXRlc18pOwotICAgIGlmIChTTF9SRVNVTFRfU1VDQ0VTUyAhPSBlcnIpIHsKLSAgICAgIEhhbmRsZUVycm9yKGVycik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgLy8gU3RhcnQgdGhlIHJlY29yZGluZyBieSBzZXR0aW5nIHRoZSBzdGF0ZSB0byB8U0xfUkVDT1JEU1RBVEVfUkVDT1JESU5HfC4KLSAgZXJyID0gKCpyZWNvcmRlcl8pLT5TZXRSZWNvcmRTdGF0ZShyZWNvcmRlcl8sIFNMX1JFQ09SRFNUQVRFX1JFQ09SRElORyk7Ci0gIERDSEVDS19FUShTTF9SRVNVTFRfU1VDQ0VTUywgZXJyKTsKLSAgaWYgKFNMX1JFU1VMVF9TVUNDRVNTICE9IGVycikKLSAgICBIYW5kbGVFcnJvcihlcnIpOwotfQotCi12b2lkIE9wZW5TTEVTSW5wdXRTdHJlYW06OlN0b3AoKSB7Ci0gIGlmICghc3RhcnRlZF8pCi0gICAgcmV0dXJuOwotCi0gIC8vIFN0b3AgcmVjb3JkaW5nIGJ5IHNldHRpbmcgdGhlIHJlY29yZCBzdGF0ZSB0byB8U0xfUkVDT1JEU1RBVEVfU1RPUFBFRHwuCi0gIFNMcmVzdWx0IGVyciA9ICgqcmVjb3JkZXJfKS0+U2V0UmVjb3JkU3RhdGUocmVjb3JkZXJfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMX1JFQ09SRFNUQVRFX1NUT1BQRUQpOwotICBpZiAoU0xfUkVTVUxUX1NVQ0NFU1MgIT0gZXJyKSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCAiU2V0UmVjb3JkU3RhdGUoKSBmYWlsZWQgdG8gc2V0IHRoZSBzdGF0ZSB0byBzdG9wIjsKLSAgfQotCi0gIC8vIENsZWFyIHRoZSBidWZmZXIgcXVldWUgdG8gZ2V0IHJpZCBvZiBvbGQgZGF0YSB3aGVuIHJlc3VtaW5nIHJlY29yZGluZy4KLSAgZXJyID0gKCpzaW1wbGVfYnVmZmVyX3F1ZXVlXyktPkNsZWFyKHNpbXBsZV9idWZmZXJfcXVldWVfKTsKLSAgaWYgKFNMX1JFU1VMVF9TVUNDRVNTICE9IGVycikgewotICAgIERMT0coV0FSTklORykgPDwgIkNsZWFyKCkgZmFpbGVkIHRvIGNsZWFyIHRoZSBidWZmZXIgcXVldWUiOwotICB9Ci0KLSAgc3RhcnRlZF8gPSBmYWxzZTsKLX0KLQotdm9pZCBPcGVuU0xFU0lucHV0U3RyZWFtOjpDbG9zZSgpIHsKLSAgLy8gU3RvcCB0aGUgc3RyZWFtIGlmIGl0IGlzIHN0aWxsIHJlY29yZGluZy4KLSAgU3RvcCgpOwotCi0gIC8vIEV4cGxpY2l0bHkgZnJlZSB0aGUgcGxheWVyIG9iamVjdHMgYW5kIGludmFsaWRhdGUgdGhlaXIgYXNzb2NpYXRlZAotICAvLyBpbnRlcmZhY2VzLiBUaGV5IGhhdmUgdG8gYmUgZG9uZSBpbiB0aGUgY29ycmVjdCBvcmRlci4KLSAgcmVjb3JkZXJfb2JqZWN0Xy5SZXNldCgpOwotICBlbmdpbmVfb2JqZWN0Xy5SZXNldCgpOwotICBzaW1wbGVfYnVmZmVyX3F1ZXVlXyA9IE5VTEw7Ci0gIHJlY29yZGVyXyA9IE5VTEw7Ci0KLSAgUmVsZWFzZUF1ZGlvQnVmZmVyKCk7Ci0KLSAgYXVkaW9fbWFuYWdlcl8tPlJlbGVhc2VJbnB1dFN0cmVhbSh0aGlzKTsKLX0KLQotZG91YmxlIE9wZW5TTEVTSW5wdXRTdHJlYW06OkdldE1heFZvbHVtZSgpIHsKLSAgTk9USU1QTEVNRU5URUQoKTsKLSAgcmV0dXJuIDAuMDsKLX0KLQotdm9pZCBPcGVuU0xFU0lucHV0U3RyZWFtOjpTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgewotICBOT1RJTVBMRU1FTlRFRCgpOwotfQotCi1kb3VibGUgT3BlblNMRVNJbnB1dFN0cmVhbTo6R2V0Vm9sdW1lKCkgewotICBOT1RJTVBMRU1FTlRFRCgpOwotICByZXR1cm4gMC4wOwotfQotCi12b2lkIE9wZW5TTEVTSW5wdXRTdHJlYW06OlNldEF1dG9tYXRpY0dhaW5Db250cm9sKGJvb2wgZW5hYmxlZCkgewotICBOT1RJTVBMRU1FTlRFRCgpOwotfQotCi1ib29sIE9wZW5TTEVTSW5wdXRTdHJlYW06OkdldEF1dG9tYXRpY0dhaW5Db250cm9sKCkgewotICBOT1RJTVBMRU1FTlRFRCgpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgT3BlblNMRVNJbnB1dFN0cmVhbTo6Q3JlYXRlUmVjb3JkZXIoKSB7Ci0gIC8vIEluaXRpYWxpemVzIHRoZSBlbmdpbmUgb2JqZWN0IHdpdGggc3BlY2lmaWMgb3B0aW9uLiBBZnRlciB3b3JraW5nIHdpdGggdGhlCi0gIC8vIG9iamVjdCwgd2UgbmVlZCB0byBmcmVlIHRoZSBvYmplY3QgYW5kIGl0cyByZXNvdXJjZXMuCi0gIFNMRW5naW5lT3B0aW9uIG9wdGlvbltdID0gewotICAgIHsgU0xfRU5HSU5FT1BUSU9OX1RIUkVBRFNBRkUsIHN0YXRpY19jYXN0PFNMdWludDMyPihTTF9CT09MRUFOX1RSVUUpIH0KLSAgfTsKLSAgU0xyZXN1bHQgZXJyID0gc2xDcmVhdGVFbmdpbmUoZW5naW5lX29iamVjdF8uUmVjZWl2ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICBEQ0hFQ0tfRVEoU0xfUkVTVUxUX1NVQ0NFU1MsIGVycik7Ci0gIGlmIChTTF9SRVNVTFRfU1VDQ0VTUyAhPSBlcnIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8vIFJlYWxpemUgdGhlIFNMIGVuZ2luZSBvYmplY3QgaW4gc3luY2hyb25vdXMgbW9kZS4KLSAgZXJyID0gZW5naW5lX29iamVjdF8tPlJlYWxpemUoZW5naW5lX29iamVjdF8uR2V0KCksIFNMX0JPT0xFQU5fRkFMU0UpOwotICBEQ0hFQ0tfRVEoU0xfUkVTVUxUX1NVQ0NFU1MsIGVycik7Ci0gIGlmIChTTF9SRVNVTFRfU1VDQ0VTUyAhPSBlcnIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8vIEdldCB0aGUgU0wgZW5naW5lIGludGVyZmFjZSB3aGljaCBpcyBpbXBsaWNpdC4KLSAgU0xFbmdpbmVJdGYgZW5naW5lOwotICBlcnIgPSBlbmdpbmVfb2JqZWN0Xy0+R2V0SW50ZXJmYWNlKAotICAgICAgZW5naW5lX29iamVjdF8uR2V0KCksIFNMX0lJRF9FTkdJTkUsICZlbmdpbmUpOwotICBEQ0hFQ0tfRVEoU0xfUkVTVUxUX1NVQ0NFU1MsIGVycik7Ci0gIGlmIChTTF9SRVNVTFRfU1VDQ0VTUyAhPSBlcnIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8vIEF1ZGlvIHNvdXJjZSBjb25maWd1cmF0aW9uLgotICBTTERhdGFMb2NhdG9yX0lPRGV2aWNlIG1pY19sb2NhdG9yID0gewotICAgIFNMX0RBVEFMT0NBVE9SX0lPREVWSUNFLCBTTF9JT0RFVklDRV9BVURJT0lOUFVULAotICAgIFNMX0RFRkFVTFRERVZJQ0VJRF9BVURJT0lOUFVULCBOVUxMCi0gIH07Ci0gIFNMRGF0YVNvdXJjZSBhdWRpb19zb3VyY2UgPSB7ICZtaWNfbG9jYXRvciwgTlVMTCB9OwotCi0gIC8vIEF1ZGlvIHNpbmsgY29uZmlndXJhdGlvbi4KLSAgU0xEYXRhTG9jYXRvcl9BbmRyb2lkU2ltcGxlQnVmZmVyUXVldWUgYnVmZmVyX3F1ZXVlID0gewotICAgIFNMX0RBVEFMT0NBVE9SX0FORFJPSURTSU1QTEVCVUZGRVJRVUVVRSwgLy8gTG9jYXRvciB0eXBlLgotICAgIHN0YXRpY19jYXN0PFNMdWludDMyPihrTnVtT2ZRdWV1ZXNJbkJ1ZmZlcikgIC8vIE51bWJlciBvZiBidWZmZXJzLgotICB9OwotICBTTERhdGFTaW5rIGF1ZGlvX3NpbmsgPSB7ICZidWZmZXJfcXVldWUsICZmb3JtYXRfIH07Ci0KLSAgLy8gQ3JlYXRlIGFuIGF1ZGlvIHJlY29yZGVyLgotICBjb25zdCBTTHVpbnQzMiBudW1iZXJfb2ZfaW50ZXJmYWNlcyA9IDE7Ci0gIGNvbnN0IFNMSW50ZXJmYWNlSUQgaW50ZXJmYWNlX2lkW251bWJlcl9vZl9pbnRlcmZhY2VzXSA9IHsKLSAgICBTTF9JSURfQU5EUk9JRFNJTVBMRUJVRkZFUlFVRVVFCi0gIH07Ci0gIGNvbnN0IFNMYm9vbGVhbiBpbnRlcmZhY2VfcmVxdWlyZWRbbnVtYmVyX29mX2ludGVyZmFjZXNdID0gewotICAgIFNMX0JPT0xFQU5fVFJVRQotICB9OwotICBlcnIgPSAoKmVuZ2luZSktPkNyZWF0ZUF1ZGlvUmVjb3JkZXIoZW5naW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkZXJfb2JqZWN0Xy5SZWNlaXZlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXVkaW9fc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1ZGlvX3NpbmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfaW50ZXJmYWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9yZXF1aXJlZCk7Ci0gIERDSEVDS19FUShTTF9SRVNVTFRfU1VDQ0VTUywgZXJyKTsKLSAgaWYgKFNMX1JFU1VMVF9TVUNDRVNTICE9IGVycikgewotICAgIERMT0coRVJST1IpIDw8ICJDcmVhdGVBdWRpb1JlY29yZGVyIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgIiA8PCBlcnI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gUmVhbGl6ZSB0aGUgcmVjb3JkZXIgb2JqZWN0IGluIHN5bmNocm9ub3VzIG1vZGUuCi0gIGVyciA9IHJlY29yZGVyX29iamVjdF8tPlJlYWxpemUocmVjb3JkZXJfb2JqZWN0Xy5HZXQoKSwgU0xfQk9PTEVBTl9GQUxTRSk7Ci0gIERDSEVDS19FUShTTF9SRVNVTFRfU1VDQ0VTUywgZXJyKTsKLSAgaWYgKFNMX1JFU1VMVF9TVUNDRVNTICE9IGVycikgewotICAgIERMT0coRVJST1IpIDw8ICJSZWNwcmRlciBSZWFsaXplKCkgZmFpbGVkIHdpdGggZXJyb3IgY29kZSAiIDw8IGVycjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBHZXQgYW4gaW1wbGljaXQgcmVjb3JkZXIgaW50ZXJmYWNlLgotICBlcnIgPSByZWNvcmRlcl9vYmplY3RfLT5HZXRJbnRlcmZhY2UocmVjb3JkZXJfb2JqZWN0Xy5HZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMX0lJRF9SRUNPUkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjb3JkZXJfKTsKLSAgRENIRUNLX0VRKFNMX1JFU1VMVF9TVUNDRVNTLCBlcnIpOwotICBpZiAoU0xfUkVTVUxUX1NVQ0NFU1MgIT0gZXJyKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvLyBHZXQgdGhlIHNpbXBsZSBidWZmZXIgcXVldWUgaW50ZXJmYWNlLgotICBlcnIgPSByZWNvcmRlcl9vYmplY3RfLT5HZXRJbnRlcmZhY2UocmVjb3JkZXJfb2JqZWN0Xy5HZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMX0lJRF9BTkRST0lEU0lNUExFQlVGRkVSUVVFVUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2ltcGxlX2J1ZmZlcl9xdWV1ZV8pOwotICBEQ0hFQ0tfRVEoU0xfUkVTVUxUX1NVQ0NFU1MsIGVycik7Ci0gIGlmIChTTF9SRVNVTFRfU1VDQ0VTUyAhPSBlcnIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8vIFJlZ2lzdGVyIHRoZSBpbnB1dCBjYWxsYmFjayBmb3IgdGhlIHNpbXBsZSBidWZmZXIgcXVldWUuCi0gIC8vIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2hlbiByZWNlaXZpbmcgbmV3IGRhdGEgZnJvbSB0aGUgZGV2aWNlLgotICBlcnIgPSAoKnNpbXBsZV9idWZmZXJfcXVldWVfKS0+UmVnaXN0ZXJDYWxsYmFjayhzaW1wbGVfYnVmZmVyX3F1ZXVlXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2ltcGxlQnVmZmVyUXVldWVDYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7Ci0gIERDSEVDS19FUShTTF9SRVNVTFRfU1VDQ0VTUywgZXJyKTsKLQotICByZXR1cm4gKFNMX1JFU1VMVF9TVUNDRVNTID09IGVycik7Ci19Ci0KLXZvaWQgT3BlblNMRVNJbnB1dFN0cmVhbTo6U2ltcGxlQnVmZmVyUXVldWVDYWxsYmFjaygKLSAgICBTTEFuZHJvaWRTaW1wbGVCdWZmZXJRdWV1ZUl0ZiBidWZmZXJfcXVldWUsIHZvaWQqIGluc3RhbmNlKSB7Ci0gIE9wZW5TTEVTSW5wdXRTdHJlYW0qIHN0cmVhbSA9Ci0gICAgICByZWludGVycHJldF9jYXN0PE9wZW5TTEVTSW5wdXRTdHJlYW0qPihpbnN0YW5jZSk7Ci0gIHN0cmVhbS0+UmVhZEJ1ZmZlclF1ZXVlKCk7Ci19Ci0KLXZvaWQgT3BlblNMRVNJbnB1dFN0cmVhbTo6UmVhZEJ1ZmZlclF1ZXVlKCkgewotICBpZiAoIXN0YXJ0ZWRfKQotICAgIHJldHVybjsKLQotICAvLyBHZXQgdGhlIGVucXVldWVkIGJ1ZmZlciBmcm9tIHRoZSBzb3VuZGNhcmQuCi0gIFNMcmVzdWx0IGVyciA9ICgqc2ltcGxlX2J1ZmZlcl9xdWV1ZV8pLT5FbnF1ZXVlKAotICAgICAgc2ltcGxlX2J1ZmZlcl9xdWV1ZV8sCi0gICAgICBhdWRpb19kYXRhX1thY3RpdmVfcXVldWVfXSwKLSAgICAgIGJ1ZmZlcl9zaXplX2J5dGVzXyk7Ci0gIGlmIChTTF9SRVNVTFRfU1VDQ0VTUyAhPSBlcnIpCi0gICAgSGFuZGxlRXJyb3IoZXJyKTsKLQotICAvLyBUT0RPKHhpYW5zKTogR2V0IGFuIGFjY3VyYXRlIGRlbGF5IGVzdGltYXRpb24uCi0gIGNhbGxiYWNrXy0+T25EYXRhKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RhdGFfW2FjdGl2ZV9xdWV1ZV9dLAotICAgICAgICAgICAgICAgICAgICBidWZmZXJfc2l6ZV9ieXRlc18sCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9zaXplX2J5dGVzXywKLSAgICAgICAgICAgICAgICAgICAgMC4wKTsKLQotICBhY3RpdmVfcXVldWVfID0gKGFjdGl2ZV9xdWV1ZV8gKyAxKSAlIGtOdW1PZlF1ZXVlc0luQnVmZmVyOwotfQotCi12b2lkIE9wZW5TTEVTSW5wdXRTdHJlYW06OlNldHVwQXVkaW9CdWZmZXIoKSB7Ci0gIERDSEVDSyghYXVkaW9fZGF0YV9bMF0pOwotICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1PZlF1ZXVlc0luQnVmZmVyOyArK2kpIHsKLSAgICBhdWRpb19kYXRhX1tpXSA9IG5ldyB1aW50OFtidWZmZXJfc2l6ZV9ieXRlc19dOwotICB9Ci19Ci0KLXZvaWQgT3BlblNMRVNJbnB1dFN0cmVhbTo6UmVsZWFzZUF1ZGlvQnVmZmVyKCkgewotICBpZiAoYXVkaW9fZGF0YV9bMF0pIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1PZlF1ZXVlc0luQnVmZmVyOyArK2kpIHsKLSAgICAgIGRlbGV0ZSBbXSBhdWRpb19kYXRhX1tpXTsKLSAgICAgIGF1ZGlvX2RhdGFfW2ldID0gTlVMTDsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBPcGVuU0xFU0lucHV0U3RyZWFtOjpIYW5kbGVFcnJvcihTTHJlc3VsdCBlcnJvcikgewotICBETE9HKEZBVEFMKSA8PCAiT3BlblNMRVMgZXJyb3IgIiA8PCBlcnJvcjsKLSAgaWYgKGNhbGxiYWNrXykKLSAgICBjYWxsYmFja18tPk9uRXJyb3IodGhpcywgZXJyb3IpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9hbmRyb2lkL29wZW5zbGVzX2lucHV0LmggYi9zcmMvbWVkaWEvYXVkaW8vYW5kcm9pZC9vcGVuc2xlc19pbnB1dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDE4ZjliLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9hbmRyb2lkL29wZW5zbGVzX2lucHV0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0FVRElPX0FORFJPSURfT1BFTlNMRVNfSU5QVVRfSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fQU5EUk9JRF9PUEVOU0xFU19JTlBVVF9IXwotCi0jaW5jbHVkZSAiYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX2lvLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fcGFyYW1ldGVycy5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2FuZHJvaWQvb3BlbnNsZXNfdXRpbC5oIgotI2luY2x1ZGUgPFNMRVMvT3BlblNMRVNfQW5kcm9pZC5oPgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBBdWRpb01hbmFnZXJBbmRyb2lkOwotCi0vLyBJbXBsZW1lbnRzIFBDTSBhdWRpbyBpbnB1dCBzdXBwb3J0IGZvciBBbmRyb2lkIHVzaW5nIHRoZSBPcGVuU0xFUyBBUEkuCi1jbGFzcyBPcGVuU0xFU0lucHV0U3RyZWFtIDogcHVibGljIEF1ZGlvSW5wdXRTdHJlYW0gewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IGludCBrTnVtT2ZRdWV1ZXNJbkJ1ZmZlciA9IDI7Ci0KLSAgT3BlblNMRVNJbnB1dFN0cmVhbShBdWRpb01hbmFnZXJBbmRyb2lkKiBtYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKTsKLQotICB2aXJ0dWFsIH5PcGVuU0xFU0lucHV0U3RyZWFtKCk7Ci0KLSAgLy8gSW1wbGVtZW50YXRpb24gb2YgQXVkaW9JbnB1dFN0cmVhbS4KLSAgdmlydHVhbCBib29sIE9wZW4oKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0YXJ0KEF1ZGlvSW5wdXRDYWxsYmFjayogY2FsbGJhY2spIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU3RvcCgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgQ2xvc2UoKSBPVkVSUklERTsKLSAgdmlydHVhbCBkb3VibGUgR2V0TWF4Vm9sdW1lKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgZG91YmxlIEdldFZvbHVtZSgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU2V0QXV0b21hdGljR2FpbkNvbnRyb2woYm9vbCBlbmFibGVkKSBPVkVSUklERTsKLSAgdmlydHVhbCBib29sIEdldEF1dG9tYXRpY0dhaW5Db250cm9sKCkgT1ZFUlJJREU7Ci0KLSBwcml2YXRlOgotICBib29sIENyZWF0ZVJlY29yZGVyKCk7Ci0KLSAgc3RhdGljIHZvaWQgU2ltcGxlQnVmZmVyUXVldWVDYWxsYmFjaygKLSAgICAgIFNMQW5kcm9pZFNpbXBsZUJ1ZmZlclF1ZXVlSXRmIGJ1ZmZlcl9xdWV1ZSwgdm9pZCogaW5zdGFuY2UpOwotCi0gIHZvaWQgUmVhZEJ1ZmZlclF1ZXVlKCk7Ci0KLSAgLy8gQ2FsbGVkIGluIE9wZW4oKTsKLSAgdm9pZCBTZXR1cEF1ZGlvQnVmZmVyKCk7Ci0KLSAgLy8gQ2FsbGVkIGluIENsb3NlKCk7Ci0gIHZvaWQgUmVsZWFzZUF1ZGlvQnVmZmVyKCk7Ci0KLSAgLy8gSWYgT3BlblNMRVMgcmVwb3J0cyBhbiBlcnJvciB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMgaXQgYW5kIHBhc3NlcyBpdCB0bwotICAvLyB0aGUgYXR0YWNoZWQgQXVkaW9JbnB1dENhbGxiYWNrOjpPbkVycm9yKCkuCi0gIHZvaWQgSGFuZGxlRXJyb3IoU0xyZXN1bHQgZXJyb3IpOwotCi0gIEF1ZGlvTWFuYWdlckFuZHJvaWQqIGF1ZGlvX21hbmFnZXJfOwotCi0gIEF1ZGlvSW5wdXRDYWxsYmFjayogY2FsbGJhY2tfOwotCi0gIC8vIFNoYXJlZCBlbmdpbmUgaW50ZXJmYWNlcyBmb3IgdGhlIGFwcC4KLSAgbWVkaWE6OlNjb3BlZFNMT2JqZWN0SXRmIHJlY29yZGVyX29iamVjdF87Ci0gIG1lZGlhOjpTY29wZWRTTE9iamVjdEl0ZiBlbmdpbmVfb2JqZWN0XzsKLQotICBTTFJlY29yZEl0ZiByZWNvcmRlcl87Ci0KLSAgLy8gQnVmZmVyIHF1ZXVlIHJlY29yZGVyIGludGVyZmFjZS4KLSAgU0xBbmRyb2lkU2ltcGxlQnVmZmVyUXVldWVJdGYgc2ltcGxlX2J1ZmZlcl9xdWV1ZV87Ci0KLSAgU0xEYXRhRm9ybWF0X1BDTSBmb3JtYXRfOwotCi0gIC8vIEF1ZGlvIGJ1ZmZlcnMgdGhhdCBhcmUgYWxsb2NhdGVkIGluIHRoZSBjb25zdHJ1Y3RvciBiYXNlZCBvbgotICAvLyBpbmZvIGZyb20gYXVkaW8gcGFyYW1ldGVycy4KLSAgdWludDgqIGF1ZGlvX2RhdGFfW2tOdW1PZlF1ZXVlc0luQnVmZmVyXTsKLQotICBpbnQgYWN0aXZlX3F1ZXVlXzsKLSAgaW50IGJ1ZmZlcl9zaXplX2J5dGVzXzsKLQotICBib29sIHN0YXJ0ZWRfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihPcGVuU0xFU0lucHV0U3RyZWFtKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0FVRElPX0FORFJPSURfT1BFTlNMRVNfSU5QVVRfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9hbmRyb2lkL29wZW5zbGVzX291dHB1dC5jYyBiL3NyYy9tZWRpYS9hdWRpby9hbmRyb2lkL29wZW5zbGVzX291dHB1dC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZhZTI1Yi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vYW5kcm9pZC9vcGVuc2xlc19vdXRwdXQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2FuZHJvaWQvb3BlbnNsZXNfb3V0cHV0LmgiCi0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb191dGlsLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYW5kcm9pZC9hdWRpb19tYW5hZ2VyX2FuZHJvaWQuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotT3BlblNMRVNPdXRwdXRTdHJlYW06Ok9wZW5TTEVTT3V0cHV0U3RyZWFtKEF1ZGlvTWFuYWdlckFuZHJvaWQqIG1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpCi0gICAgOiBhdWRpb19tYW5hZ2VyXyhtYW5hZ2VyKSwKLSAgICAgIGNhbGxiYWNrXyhOVUxMKSwKLSAgICAgIHBsYXllcl8oTlVMTCksCi0gICAgICBzaW1wbGVfYnVmZmVyX3F1ZXVlXyhOVUxMKSwKLSAgICAgIGFjdGl2ZV9xdWV1ZV8oMCksCi0gICAgICBidWZmZXJfc2l6ZV9ieXRlc18oMCksCi0gICAgICBzdGFydGVkXyhmYWxzZSksCi0gICAgICB2b2x1bWVfKDEuMCkgewotICBmb3JtYXRfLmZvcm1hdFR5cGUgPSBTTF9EQVRBRk9STUFUX1BDTTsKLSAgZm9ybWF0Xy5udW1DaGFubmVscyA9IHN0YXRpY19jYXN0PFNMdWludDMyPihwYXJhbXMuY2hhbm5lbHMoKSk7Ci0gIC8vIFByb3ZpZGVzIHNhbXBsaW5nIHJhdGUgaW4gbWlsbGlIZXJ0eiB0byBPcGVuU0xFUy4KLSAgZm9ybWF0Xy5zYW1wbGVzUGVyU2VjID0gc3RhdGljX2Nhc3Q8U0x1aW50MzI+KHBhcmFtcy5zYW1wbGVfcmF0ZSgpICogMTAwMCk7Ci0gIGZvcm1hdF8uYml0c1BlclNhbXBsZSA9IHBhcmFtcy5iaXRzX3Blcl9zYW1wbGUoKTsKLSAgZm9ybWF0Xy5jb250YWluZXJTaXplID0gcGFyYW1zLmJpdHNfcGVyX3NhbXBsZSgpOwotICBmb3JtYXRfLmVuZGlhbm5lc3MgPSBTTF9CWVRFT1JERVJfTElUVExFRU5ESUFOOwotICBpZiAoZm9ybWF0Xy5udW1DaGFubmVscyA9PSAxKQotICAgIGZvcm1hdF8uY2hhbm5lbE1hc2sgPSBTTF9TUEVBS0VSX0ZST05UX0NFTlRFUjsKLSAgZWxzZSBpZiAoZm9ybWF0Xy5udW1DaGFubmVscyA9PSAyKQotICAgIGZvcm1hdF8uY2hhbm5lbE1hc2sgPSBTTF9TUEVBS0VSX0ZST05UX0xFRlQgfCBTTF9TUEVBS0VSX0ZST05UX1JJR0hUOwotICBlbHNlCi0gICAgTk9UUkVBQ0hFRCgpIDw8ICJVbnN1cHBvcnRlZCBudW1iZXIgb2YgY2hhbm5lbHM6ICIgPDwgZm9ybWF0Xy5udW1DaGFubmVsczsKLQotICBidWZmZXJfc2l6ZV9ieXRlc18gPSBwYXJhbXMuR2V0Qnl0ZXNQZXJCdWZmZXIoKTsKLSAgYXVkaW9fYnVzXyA9IEF1ZGlvQnVzOjpDcmVhdGUocGFyYW1zKTsKLQotICBtZW1zZXQoJmF1ZGlvX2RhdGFfLCAwLCBzaXplb2YoYXVkaW9fZGF0YV8pKTsKLX0KLQotT3BlblNMRVNPdXRwdXRTdHJlYW06On5PcGVuU0xFU091dHB1dFN0cmVhbSgpIHsKLSAgRENIRUNLKCFlbmdpbmVfb2JqZWN0Xy5HZXQoKSk7Ci0gIERDSEVDSyghcGxheWVyX29iamVjdF8uR2V0KCkpOwotICBEQ0hFQ0soIW91dHB1dF9taXhlcl8uR2V0KCkpOwotICBEQ0hFQ0soIXBsYXllcl8pOwotICBEQ0hFQ0soIXNpbXBsZV9idWZmZXJfcXVldWVfKTsKLSAgRENIRUNLKCFhdWRpb19kYXRhX1swXSk7Ci19Ci0KLWJvb2wgT3BlblNMRVNPdXRwdXRTdHJlYW06Ok9wZW4oKSB7Ci0gIGlmIChlbmdpbmVfb2JqZWN0Xy5HZXQoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFDcmVhdGVQbGF5ZXIoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgU2V0dXBBdWRpb0J1ZmZlcigpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIE9wZW5TTEVTT3V0cHV0U3RyZWFtOjpTdGFydChBdWRpb1NvdXJjZUNhbGxiYWNrKiBjYWxsYmFjaykgewotICBEQ0hFQ0soY2FsbGJhY2spOwotICBEQ0hFQ0socGxheWVyXyk7Ci0gIERDSEVDSyhzaW1wbGVfYnVmZmVyX3F1ZXVlXyk7Ci0gIGlmIChzdGFydGVkXykKLSAgICByZXR1cm47Ci0KLSAgLy8gRW5hYmxlIHRoZSBmbGFncyBiZWZvcmUgc3RyZWFtaW5nLgotICBjYWxsYmFja18gPSBjYWxsYmFjazsKLSAgYWN0aXZlX3F1ZXVlXyA9IDA7Ci0gIHN0YXJ0ZWRfID0gdHJ1ZTsKLQotICAvLyBBdm9pZCBzdGFydC11cCBnbGl0Y2hlcyBieSBmaWxsaW5nIHVwIG9uZSBidWZmZXIgcXVldWUgYmVmb3JlIHN0YXJ0aW5nCi0gIC8vIHRoZSBzdHJlYW0uCi0gIEZpbGxCdWZmZXJRdWV1ZSgpOwotCi0gIC8vIFN0YXJ0IHN0cmVhbWluZyBkYXRhIGJ5IHNldHRpbmcgdGhlIHBsYXkgc3RhdGUgdG8gfFNMX1BMQVlTVEFURV9QTEFZSU5HfC4KLSAgU0xyZXN1bHQgZXJyID0gKCpwbGF5ZXJfKS0+U2V0UGxheVN0YXRlKHBsYXllcl8sIFNMX1BMQVlTVEFURV9QTEFZSU5HKTsKLSAgRENIRUNLX0VRKFNMX1JFU1VMVF9TVUNDRVNTLCBlcnIpOwotICBpZiAoU0xfUkVTVUxUX1NVQ0NFU1MgIT0gZXJyKSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCAiU2V0UGxheVN0YXRlKCkgZmFpbGVkIHRvIHN0YXJ0IHBsYXlpbmciOwotICB9Ci19Ci0KLXZvaWQgT3BlblNMRVNPdXRwdXRTdHJlYW06OlN0b3AoKSB7Ci0gIGlmICghc3RhcnRlZF8pCi0gICAgcmV0dXJuOwotCi0gIHN0YXJ0ZWRfID0gZmFsc2U7Ci0gIC8vIFN0b3AgcGxheWluZyBieSBzZXR0aW5nIHRoZSBwbGF5IHN0YXRlIHRvIHxTTF9QTEFZU1RBVEVfU1RPUFBFRHwuCi0gIFNMcmVzdWx0IGVyciA9ICgqcGxheWVyXyktPlNldFBsYXlTdGF0ZShwbGF5ZXJfLCBTTF9QTEFZU1RBVEVfU1RPUFBFRCk7Ci0gIGlmIChTTF9SRVNVTFRfU1VDQ0VTUyAhPSBlcnIpIHsKLSAgICBETE9HKFdBUk5JTkcpIDw8ICJTZXRQbGF5U3RhdGUoKSBmYWlsZWQgdG8gc2V0IHRoZSBzdGF0ZSB0byBzdG9wIjsKLSAgfQotCi0gIC8vIENsZWFyIHRoZSBidWZmZXIgcXVldWUgc28gdGhhdCB0aGUgb2xkIGRhdGEgd29uJ3QgYmUgcGxheWVkIHdoZW4KLSAgLy8gcmVzdW1pbmcgcGxheWluZy4KLSAgZXJyID0gKCpzaW1wbGVfYnVmZmVyX3F1ZXVlXyktPkNsZWFyKHNpbXBsZV9idWZmZXJfcXVldWVfKTsKLSAgaWYgKFNMX1JFU1VMVF9TVUNDRVNTICE9IGVycikgewotICAgIERMT0coV0FSTklORykgPDwgIkNsZWFyKCkgZmFpbGVkIHRvIGNsZWFyIHRoZSBidWZmZXIgcXVldWUiOwotICB9Ci19Ci0KLXZvaWQgT3BlblNMRVNPdXRwdXRTdHJlYW06OkNsb3NlKCkgewotICAvLyBTdG9wIHRoZSBzdHJlYW0gaWYgaXQgaXMgc3RpbGwgcGxheWluZy4KLSAgU3RvcCgpOwotCi0gIC8vIEV4cGxpY2l0bHkgZnJlZSB0aGUgcGxheWVyIG9iamVjdHMgYW5kIGludmFsaWRhdGUgdGhlaXIgYXNzb2NpYXRlZAotICAvLyBpbnRlcmZhY2VzLiBUaGV5IGhhdmUgdG8gYmUgZG9uZSBpbiB0aGUgY29ycmVjdCBvcmRlci4KLSAgb3V0cHV0X21peGVyXy5SZXNldCgpOwotICBwbGF5ZXJfb2JqZWN0Xy5SZXNldCgpOwotICBlbmdpbmVfb2JqZWN0Xy5SZXNldCgpOwotICBzaW1wbGVfYnVmZmVyX3F1ZXVlXyA9IE5VTEw7Ci0gIHBsYXllcl8gPSBOVUxMOwotCi0gIFJlbGVhc2VBdWRpb0J1ZmZlcigpOwotCi0gIGF1ZGlvX21hbmFnZXJfLT5SZWxlYXNlT3V0cHV0U3RyZWFtKHRoaXMpOwotfQotCi12b2lkIE9wZW5TTEVTT3V0cHV0U3RyZWFtOjpTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgewotICBmbG9hdCB2b2x1bWVfZmxvYXQgPSBzdGF0aWNfY2FzdDxmbG9hdD4odm9sdW1lKTsKLSAgaWYgKHZvbHVtZV9mbG9hdCA8IDAuMGYgfHwgdm9sdW1lX2Zsb2F0ID4gMS4wZikgewotICAgIHJldHVybjsKLSAgfQotICB2b2x1bWVfID0gdm9sdW1lX2Zsb2F0OwotfQotCi12b2lkIE9wZW5TTEVTT3V0cHV0U3RyZWFtOjpHZXRWb2x1bWUoZG91YmxlKiB2b2x1bWUpIHsKLSAgKnZvbHVtZSA9IHN0YXRpY19jYXN0PGRvdWJsZT4odm9sdW1lXyk7Ci19Ci0KLWJvb2wgT3BlblNMRVNPdXRwdXRTdHJlYW06OkNyZWF0ZVBsYXllcigpIHsKLSAgLy8gSW5pdGlhbGl6ZXMgdGhlIGVuZ2luZSBvYmplY3Qgd2l0aCBzcGVjaWZpYyBvcHRpb24uIEFmdGVyIHdvcmtpbmcgd2l0aCB0aGUKLSAgLy8gb2JqZWN0LCB3ZSBuZWVkIHRvIGZyZWUgdGhlIG9iamVjdCBhbmQgaXRzIHJlc291cmNlcy4KLSAgU0xFbmdpbmVPcHRpb24gb3B0aW9uW10gPSB7Ci0gICAgeyBTTF9FTkdJTkVPUFRJT05fVEhSRUFEU0FGRSwgc3RhdGljX2Nhc3Q8U0x1aW50MzI+KFNMX0JPT0xFQU5fVFJVRSkgfQotICB9OwotICBTTHJlc3VsdCBlcnIgPSBzbENyZWF0ZUVuZ2luZShlbmdpbmVfb2JqZWN0Xy5SZWNlaXZlKCksIDEsIG9wdGlvbiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7Ci0gIERDSEVDS19FUShTTF9SRVNVTFRfU1VDQ0VTUywgZXJyKTsKLSAgaWYgKFNMX1JFU1VMVF9TVUNDRVNTICE9IGVycikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gUmVhbGl6ZSB0aGUgU0wgZW5naW5lIG9iamVjdCBpbiBzeW5jaHJvbm91cyBtb2RlLgotICBlcnIgPSBlbmdpbmVfb2JqZWN0Xy0+UmVhbGl6ZShlbmdpbmVfb2JqZWN0Xy5HZXQoKSwgU0xfQk9PTEVBTl9GQUxTRSk7Ci0gIERDSEVDS19FUShTTF9SRVNVTFRfU1VDQ0VTUywgZXJyKTsKLSAgaWYgKFNMX1JFU1VMVF9TVUNDRVNTICE9IGVycikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gR2V0IHRoZSBTTCBlbmdpbmUgaW50ZXJmYWNlIHdoaWNoIGlzIGltcGxpY2l0LgotICBTTEVuZ2luZUl0ZiBlbmdpbmU7Ci0gIGVyciA9IGVuZ2luZV9vYmplY3RfLT5HZXRJbnRlcmZhY2UoZW5naW5lX29iamVjdF8uR2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xfSUlEX0VOR0lORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5naW5lKTsKLSAgRENIRUNLX0VRKFNMX1JFU1VMVF9TVUNDRVNTLCBlcnIpOwotICBpZiAoU0xfUkVTVUxUX1NVQ0NFU1MgIT0gZXJyKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvLyBDcmVhdGUgb3VwdXQgbWl4ZXIgb2JqZWN0IHRvIGJlIHVzZWQgYnkgdGhlIHBsYXllci4KLSAgLy8gVE9ETyh4aWFucyk6IERvIHdlIG5lZWQgdGhlIGVudmlyb25tZW50YWwgcmV2ZXJiIGF1eGlsaWFyeSBlZmZlY3Q/Ci0gIGVyciA9ICgqZW5naW5lKS0+Q3JlYXRlT3V0cHV0TWl4KGVuZ2luZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X21peGVyXy5SZWNlaXZlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICBEQ0hFQ0tfRVEoU0xfUkVTVUxUX1NVQ0NFU1MsIGVycik7Ci0gIGlmIChTTF9SRVNVTFRfU1VDQ0VTUyAhPSBlcnIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8vIFJlYWxpemluZyB0aGUgb3V0cHV0IG1peCBvYmplY3QgaW4gc3luY2hyb25vdXMgbW9kZS4KLSAgZXJyID0gb3V0cHV0X21peGVyXy0+UmVhbGl6ZShvdXRwdXRfbWl4ZXJfLkdldCgpLCBTTF9CT09MRUFOX0ZBTFNFKTsKLSAgRENIRUNLX0VRKFNMX1JFU1VMVF9TVUNDRVNTLCBlcnIpOwotICBpZiAoU0xfUkVTVUxUX1NVQ0NFU1MgIT0gZXJyKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvLyBBdWRpbyBzb3VyY2UgY29uZmlndXJhdGlvbi4KLSAgU0xEYXRhTG9jYXRvcl9BbmRyb2lkU2ltcGxlQnVmZmVyUXVldWUgc2ltcGxlX2J1ZmZlcl9xdWV1ZSA9IHsKLSAgICBTTF9EQVRBTE9DQVRPUl9BTkRST0lEU0lNUExFQlVGRkVSUVVFVUUsCi0gICAgc3RhdGljX2Nhc3Q8U0x1aW50MzI+KGtOdW1PZlF1ZXVlc0luQnVmZmVyKQotICB9OwotICBTTERhdGFTb3VyY2UgYXVkaW9fc291cmNlID0geyAmc2ltcGxlX2J1ZmZlcl9xdWV1ZSwgJmZvcm1hdF8gfTsKLQotICAvLyBBdWRpbyBzaW5rIGNvbmZpZ3VyYXRpb24uCi0gIFNMRGF0YUxvY2F0b3JfT3V0cHV0TWl4IGxvY2F0b3Jfb3V0cHV0X21peCA9IHsKLSAgICBTTF9EQVRBTE9DQVRPUl9PVVRQVVRNSVgsIG91dHB1dF9taXhlcl8uR2V0KCkKLSAgfTsKLSAgU0xEYXRhU2luayBhdWRpb19zaW5rID0geyAmbG9jYXRvcl9vdXRwdXRfbWl4LCBOVUxMIH07Ci0KLSAgLy8gQ3JlYXRlIGFuIGF1ZGlvIHBsYXllci4KLSAgY29uc3QgU0x1aW50MzIgbnVtYmVyX29mX2ludGVyZmFjZXMgPSAxOwotICBjb25zdCBTTEludGVyZmFjZUlEIGludGVyZmFjZV9pZFtudW1iZXJfb2ZfaW50ZXJmYWNlc10gPSB7Ci0gICAgU0xfSUlEX0JVRkZFUlFVRVVFCi0gIH07Ci0gIGNvbnN0IFNMYm9vbGVhbiBpbnRlcmZhY2VfcmVxdWlyZWRbbnVtYmVyX29mX2ludGVyZmFjZXNdID0gewotICAgIFNMX0JPT0xFQU5fVFJVRQotICB9OwotICBlcnIgPSAoKmVuZ2luZSktPkNyZWF0ZUF1ZGlvUGxheWVyKGVuZ2luZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJfb2JqZWN0Xy5SZWNlaXZlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1ZGlvX3NvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXVkaW9fc2luaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfaW50ZXJmYWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX3JlcXVpcmVkKTsKLSAgRENIRUNLX0VRKFNMX1JFU1VMVF9TVUNDRVNTLCBlcnIpOwotICBpZiAoU0xfUkVTVUxUX1NVQ0NFU1MgIT0gZXJyKSB7Ci0gICAgRExPRyhFUlJPUikgPDwgIkNyZWF0ZUF1ZGlvUGxheWVyKCkgZmFpbGVkIHdpdGggZXJyb3IgY29kZSAiIDw8IGVycjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBSZWFsaXplIHRoZSBwbGF5ZXIgb2JqZWN0IGluIHN5bmNocm9ub3VzIG1vZGUuCi0gIGVyciA9IHBsYXllcl9vYmplY3RfLT5SZWFsaXplKHBsYXllcl9vYmplY3RfLkdldCgpLCBTTF9CT09MRUFOX0ZBTFNFKTsKLSAgRENIRUNLX0VRKFNMX1JFU1VMVF9TVUNDRVNTLCBlcnIpOwotICBpZiAoU0xfUkVTVUxUX1NVQ0NFU1MgIT0gZXJyKSB7Ci0gICAgRExPRyhFUlJPUikgPDwgIlBsYXllciBSZWFsaXplKCkgZmFpbGVkIHdpdGggZXJyb3IgY29kZSAiIDw8IGVycjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBHZXQgYW4gaW1wbGljaXQgcGxheWVyIGludGVyZmFjZS4KLSAgZXJyID0gcGxheWVyX29iamVjdF8tPkdldEludGVyZmFjZSgKLSAgICAgIHBsYXllcl9vYmplY3RfLkdldCgpLCBTTF9JSURfUExBWSwgJnBsYXllcl8pOwotICBEQ0hFQ0tfRVEoU0xfUkVTVUxUX1NVQ0NFU1MsIGVycik7Ci0gIGlmIChTTF9SRVNVTFRfU1VDQ0VTUyAhPSBlcnIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8vIEdldCB0aGUgc2ltcGxlIGJ1ZmZlciBxdWV1ZSBpbnRlcmZhY2UuCi0gIGVyciA9IHBsYXllcl9vYmplY3RfLT5HZXRJbnRlcmZhY2UocGxheWVyX29iamVjdF8uR2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xfSUlEX0JVRkZFUlFVRVVFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaW1wbGVfYnVmZmVyX3F1ZXVlXyk7Ci0gIERDSEVDS19FUShTTF9SRVNVTFRfU1VDQ0VTUywgZXJyKTsKLSAgaWYgKFNMX1JFU1VMVF9TVUNDRVNTICE9IGVycikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gUmVnaXN0ZXIgdGhlIGlucHV0IGNhbGxiYWNrIGZvciB0aGUgc2ltcGxlIGJ1ZmZlciBxdWV1ZS4KLSAgLy8gVGhpcyBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBzb3VuZGNhcmQgbmVlZHMgZGF0YS4KLSAgZXJyID0gKCpzaW1wbGVfYnVmZmVyX3F1ZXVlXyktPlJlZ2lzdGVyQ2FsbGJhY2soc2ltcGxlX2J1ZmZlcl9xdWV1ZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZUJ1ZmZlclF1ZXVlQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOwotICBEQ0hFQ0tfRVEoU0xfUkVTVUxUX1NVQ0NFU1MsIGVycik7Ci0KLSAgcmV0dXJuIChTTF9SRVNVTFRfU1VDQ0VTUyA9PSBlcnIpOwotfQotCi12b2lkIE9wZW5TTEVTT3V0cHV0U3RyZWFtOjpTaW1wbGVCdWZmZXJRdWV1ZUNhbGxiYWNrKAotICAgIFNMQW5kcm9pZFNpbXBsZUJ1ZmZlclF1ZXVlSXRmIGJ1ZmZlcl9xdWV1ZSwgdm9pZCogaW5zdGFuY2UpIHsKLSAgT3BlblNMRVNPdXRwdXRTdHJlYW0qIHN0cmVhbSA9Ci0gICAgICByZWludGVycHJldF9jYXN0PE9wZW5TTEVTT3V0cHV0U3RyZWFtKj4oaW5zdGFuY2UpOwotICBzdHJlYW0tPkZpbGxCdWZmZXJRdWV1ZSgpOwotfQotCi12b2lkIE9wZW5TTEVTT3V0cHV0U3RyZWFtOjpGaWxsQnVmZmVyUXVldWUoKSB7Ci0gIGlmICghc3RhcnRlZF8pCi0gICAgcmV0dXJuOwotCi0gIC8vIFJlYWQgZGF0YSBmcm9tIHRoZSByZWdpc3RlcmVkIGNsaWVudCBzb3VyY2UuCi0gIC8vIFRPRE8oeGlhbnMpOiBHZXQgYW4gYWNjdXJhdGUgZGVsYXkgZXN0aW1hdGlvbi4KLSAgdWludDMyIGhhcmR3YXJlX2RlbGF5ID0gYnVmZmVyX3NpemVfYnl0ZXNfOwotICBpbnQgZnJhbWVzX2ZpbGxlZCA9IGNhbGxiYWNrXy0+T25Nb3JlRGF0YSgKLSAgICAgIGF1ZGlvX2J1c18uZ2V0KCksIEF1ZGlvQnVmZmVyc1N0YXRlKDAsIGhhcmR3YXJlX2RlbGF5KSk7Ci0gIGludCBudW1fZmlsbGVkX2J5dGVzID0KLSAgICAgIGZyYW1lc19maWxsZWQgKiBhdWRpb19idXNfLT5jaGFubmVscygpICogZm9ybWF0Xy5iaXRzUGVyU2FtcGxlIC8gODsKLSAgRENIRUNLX0xFKHN0YXRpY19jYXN0PHNpemVfdD4obnVtX2ZpbGxlZF9ieXRlcyksIGJ1ZmZlcl9zaXplX2J5dGVzXyk7Ci0gIC8vIE5vdGU6IElmIHRoaXMgZXZlciBjaGFuZ2VzIHRvIG91dHB1dCByYXcgZmxvYXQgdGhlIGRhdGEgbXVzdCBiZSBjbGlwcGVkIGFuZAotICAvLyBzYW5pdGl6ZWQgc2luY2UgaXQgbWF5IGNvbWUgZnJvbSBhbiB1bnRydXN0ZWQgc291cmNlIHN1Y2ggYXMgTmFDbC4KLSAgYXVkaW9fYnVzXy0+VG9JbnRlcmxlYXZlZCgKLSAgICAgIGZyYW1lc19maWxsZWQsIGZvcm1hdF8uYml0c1BlclNhbXBsZSAvIDgsIGF1ZGlvX2RhdGFfW2FjdGl2ZV9xdWV1ZV9dKTsKLQotICAvLyBQZXJmb3JtIGluLXBsYWNlLCBzb2Z0d2FyZS12b2x1bWUgYWRqdXN0bWVudHMuCi0gIG1lZGlhOjpBZGp1c3RWb2x1bWUoYXVkaW9fZGF0YV9bYWN0aXZlX3F1ZXVlX10sCi0gICAgICAgICAgICAgICAgICAgICAgbnVtX2ZpbGxlZF9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfLm51bUNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF8uYml0c1BlclNhbXBsZSAvIDgsCi0gICAgICAgICAgICAgICAgICAgICAgdm9sdW1lXyk7Ci0KLSAgLy8gRW5xdWV1ZSB0aGUgYnVmZmVyIGZvciBwbGF5YmFjay4KLSAgU0xyZXN1bHQgZXJyID0gKCpzaW1wbGVfYnVmZmVyX3F1ZXVlXyktPkVucXVldWUoCi0gICAgICBzaW1wbGVfYnVmZmVyX3F1ZXVlXywKLSAgICAgIGF1ZGlvX2RhdGFfW2FjdGl2ZV9xdWV1ZV9dLAotICAgICAgbnVtX2ZpbGxlZF9ieXRlcyk7Ci0gIGlmIChTTF9SRVNVTFRfU1VDQ0VTUyAhPSBlcnIpCi0gICAgSGFuZGxlRXJyb3IoZXJyKTsKLQotICBhY3RpdmVfcXVldWVfID0gKGFjdGl2ZV9xdWV1ZV8gICsgMSkgJSBrTnVtT2ZRdWV1ZXNJbkJ1ZmZlcjsKLX0KLQotdm9pZCBPcGVuU0xFU091dHB1dFN0cmVhbTo6U2V0dXBBdWRpb0J1ZmZlcigpIHsKLSAgRENIRUNLKCFhdWRpb19kYXRhX1swXSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwga051bU9mUXVldWVzSW5CdWZmZXI7ICsraSkgewotICAgIGF1ZGlvX2RhdGFfW2ldID0gbmV3IHVpbnQ4W2J1ZmZlcl9zaXplX2J5dGVzX107Ci0gIH0KLX0KLQotdm9pZCBPcGVuU0xFU091dHB1dFN0cmVhbTo6UmVsZWFzZUF1ZGlvQnVmZmVyKCkgewotICBpZiAoYXVkaW9fZGF0YV9bMF0pIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1PZlF1ZXVlc0luQnVmZmVyOyArK2kpIHsKLSAgICAgIGRlbGV0ZSBbXSBhdWRpb19kYXRhX1tpXTsKLSAgICAgIGF1ZGlvX2RhdGFfW2ldID0gTlVMTDsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBPcGVuU0xFU091dHB1dFN0cmVhbTo6SGFuZGxlRXJyb3IoU0xyZXN1bHQgZXJyb3IpIHsKLSAgRExPRyhGQVRBTCkgPDwgIk9wZW5TTEVTIGVycm9yICIgPDwgZXJyb3I7Ci0gIGlmIChjYWxsYmFja18pCi0gICAgY2FsbGJhY2tfLT5PbkVycm9yKHRoaXMsIGVycm9yKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vYW5kcm9pZC9vcGVuc2xlc19vdXRwdXQuaCBiL3NyYy9tZWRpYS9hdWRpby9hbmRyb2lkL29wZW5zbGVzX291dHB1dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWNmYjZjLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9hbmRyb2lkL29wZW5zbGVzX291dHB1dC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9BVURJT19BTkRST0lEX09QRU5TTEVTX09VVFBVVF9IXwotI2RlZmluZSBNRURJQV9BVURJT19BTkRST0lEX09QRU5TTEVTX09VVFBVVF9IXwotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2FuZHJvaWQvb3BlbnNsZXNfdXRpbC5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX2lvLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fcGFyYW1ldGVycy5oIgotI2luY2x1ZGUgPFNMRVMvT3BlblNMRVNfQW5kcm9pZC5oPgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBBdWRpb01hbmFnZXJBbmRyb2lkOwotCi0vLyBJbXBsZW1lbnRzIFBDTSBhdWRpbyBvdXRwdXQgc3VwcG9ydCBmb3IgQW5kcm9pZCB1c2luZyB0aGUgT3BlblNMRVMgQVBJLgotY2xhc3MgT3BlblNMRVNPdXRwdXRTdHJlYW0gOiBwdWJsaWMgQXVkaW9PdXRwdXRTdHJlYW0gewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IGludCBrTnVtT2ZRdWV1ZXNJbkJ1ZmZlciA9IDI7Ci0KLSAgT3BlblNMRVNPdXRwdXRTdHJlYW0oQXVkaW9NYW5hZ2VyQW5kcm9pZCogbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpOwotCi0gIHZpcnR1YWwgfk9wZW5TTEVTT3V0cHV0U3RyZWFtKCk7Ci0KLSAgLy8gSW1wbGVtZW50YXRpb24gb2YgQXVkaW9PdXRwdXRTdHJlYW0uCi0gIHZpcnR1YWwgYm9vbCBPcGVuKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBDbG9zZSgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU3RhcnQoQXVkaW9Tb3VyY2VDYWxsYmFjayogY2FsbGJhY2spIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU3RvcCgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgR2V0Vm9sdW1lKGRvdWJsZSogdm9sdW1lKSBPVkVSUklERTsKLQotIHByaXZhdGU6Ci0gIGJvb2wgQ3JlYXRlUGxheWVyKCk7Ci0KLSAgc3RhdGljIHZvaWQgU2ltcGxlQnVmZmVyUXVldWVDYWxsYmFjaygKLSAgICAgIFNMQW5kcm9pZFNpbXBsZUJ1ZmZlclF1ZXVlSXRmIGJ1ZmZlcl9xdWV1ZSwgdm9pZCogaW5zdGFuY2UpOwotCi0gIHZvaWQgRmlsbEJ1ZmZlclF1ZXVlKCk7Ci0KLSAgLy8gQ2FsbGVkIGluIE9wZW4oKTsKLSAgdm9pZCBTZXR1cEF1ZGlvQnVmZmVyKCk7Ci0KLSAgLy8gQ2FsbGVkIGluIENsb3NlKCk7Ci0gIHZvaWQgUmVsZWFzZUF1ZGlvQnVmZmVyKCk7Ci0KLSAgLy8gSWYgT3BlblNMRVMgcmVwb3J0cyBhbiBlcnJvciB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMgaXQgYW5kIHBhc3NlcyBpdCB0bwotICAvLyB0aGUgYXR0YWNoZWQgQXVkaW9PdXRwdXRDYWxsYmFjazo6T25FcnJvcigpLgotICB2b2lkIEhhbmRsZUVycm9yKFNMcmVzdWx0IGVycm9yKTsKLQotICBBdWRpb01hbmFnZXJBbmRyb2lkKiBhdWRpb19tYW5hZ2VyXzsKLQotICBBdWRpb1NvdXJjZUNhbGxiYWNrKiBjYWxsYmFja187Ci0KLSAgLy8gU2hhcmVkIGVuZ2luZSBpbnRlcmZhY2VzIGZvciB0aGUgYXBwLgotICBtZWRpYTo6U2NvcGVkU0xPYmplY3RJdGYgZW5naW5lX29iamVjdF87Ci0gIG1lZGlhOjpTY29wZWRTTE9iamVjdEl0ZiBwbGF5ZXJfb2JqZWN0XzsKLSAgbWVkaWE6OlNjb3BlZFNMT2JqZWN0SXRmIG91dHB1dF9taXhlcl87Ci0KLSAgU0xQbGF5SXRmIHBsYXllcl87Ci0KLSAgLy8gQnVmZmVyIHF1ZXVlIHJlY29yZGVyIGludGVyZmFjZS4KLSAgU0xBbmRyb2lkU2ltcGxlQnVmZmVyUXVldWVJdGYgc2ltcGxlX2J1ZmZlcl9xdWV1ZV87Ci0KLSAgU0xEYXRhRm9ybWF0X1BDTSBmb3JtYXRfOwotCi0gIC8vIEF1ZGlvIGJ1ZmZlciBhcnJheXMgdGhhdCBhcmUgYWxsb2NhdGVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KLSAgdWludDgqIGF1ZGlvX2RhdGFfW2tOdW1PZlF1ZXVlc0luQnVmZmVyXTsKLQotICBpbnQgYWN0aXZlX3F1ZXVlXzsKLSAgc2l6ZV90IGJ1ZmZlcl9zaXplX2J5dGVzXzsKLQotICBib29sIHN0YXJ0ZWRfOwotCi0gIC8vIFZvbHVtZSBsZXZlbCBmcm9tIDAgdG8gMS4KLSAgZmxvYXQgdm9sdW1lXzsKLQotICAvLyBDb250YWluZXIgZm9yIHJldHJpZXZpbmcgZGF0YSBmcm9tIEF1ZGlvU291cmNlQ2FsbGJhY2s6Ok9uTW9yZURhdGEoKS4KLSAgc2NvcGVkX3B0cjxBdWRpb0J1cz4gYXVkaW9fYnVzXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oT3BlblNMRVNPdXRwdXRTdHJlYW0pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQVVESU9fQU5EUk9JRF9PUEVOU0xFU19JTlBVVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2FuZHJvaWQvb3BlbnNsZXNfdXRpbC5oIGIvc3JjL21lZGlhL2F1ZGlvL2FuZHJvaWQvb3BlbnNsZXNfdXRpbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTAyOGUyLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9hbmRyb2lkL29wZW5zbGVzX3V0aWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfQVVESU9fQU5EUk9JRF9PUEVOU0xFU19VVElMX0hfCi0jZGVmaW5lIE1FRElBX0FVRElPX0FORFJPSURfT1BFTlNMRVNfVVRJTF9IXwotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSA8U0xFUy9PcGVuU0xFUy5oPgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU0xUeXBlLCB0eXBlbmFtZSBTTERlcmVmVHlwZT4KLWNsYXNzIFNjb3BlZFNMT2JqZWN0IHsKLSBwdWJsaWM6Ci0gIFNjb3BlZFNMT2JqZWN0KCkgOiBvYmpfKE5VTEwpIHt9Ci0KLSAgflNjb3BlZFNMT2JqZWN0KCkgeyBSZXNldCgpOyB9Ci0KLSAgU0xUeXBlKiBSZWNlaXZlKCkgewotICAgIERDSEVDSyghb2JqXyk7Ci0gICAgcmV0dXJuICZvYmpfOwotICB9Ci0KLSAgU0xEZXJlZlR5cGUgb3BlcmF0b3ItPigpIHsgcmV0dXJuICpvYmpfOyB9Ci0KLSAgU0xUeXBlIEdldCgpIGNvbnN0IHsgcmV0dXJuIG9ial87IH0KLQotICB2b2lkIFJlc2V0KCkgewotICAgIGlmIChvYmpfKSB7Ci0gICAgICAoKm9ial8pLT5EZXN0cm95KG9ial8pOwotICAgICAgb2JqXyA9IE5VTEw7Ci0gICAgfQotICB9Ci0KLSBwcml2YXRlOgotICBTTFR5cGUgb2JqXzsKLX07Ci0KLXR5cGVkZWYgU2NvcGVkU0xPYmplY3Q8U0xPYmplY3RJdGYsIGNvbnN0IFNMT2JqZWN0SXRmXyo+IFNjb3BlZFNMT2JqZWN0SXRmOwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9BVURJT19BTkRST0lEX09QRU5TTEVTX1VUSUxfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9hc3luY19zb2NrZXRfaW9faGFuZGxlci5oIGIvc3JjL21lZGlhL2F1ZGlvL2FzeW5jX3NvY2tldF9pb19oYW5kbGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxN2UzZDMuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2FzeW5jX3NvY2tldF9pb19oYW5kbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9BVURJT19BU1lOQ19TT0NLRVRfSU9fSEFORExFUl9IXwotI2RlZmluZSBNRURJQV9BVURJT19BU1lOQ19TT0NLRVRfSU9fSEFORExFUl9IXwotCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJiYXNlL3N5bmNfc29ja2V0LmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvbm9uX3RocmVhZF9zYWZlLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gVGhlIG1lc3NhZ2UgbG9vcCBjYWxsYmFjayBpbnRlcmZhY2UgaXMgZGlmZmVyZW50IGJhc2VkIG9uIHBsYXRmb3Jtcy4KLSNpZiBkZWZpbmVkKE9TX1dJTikKLXR5cGVkZWYgTWVzc2FnZUxvb3BGb3JJTzo6SU9IYW5kbGVyIE1lc3NhZ2VMb29wSU9IYW5kbGVyOwotI2VsaWYgZGVmaW5lZChPU19QT1NJWCkKLXR5cGVkZWYgTWVzc2FnZUxvb3BGb3JJTzo6V2F0Y2hlciBNZXNzYWdlTG9vcElPSGFuZGxlcjsKLSNlbmRpZgotCi0vLyBFeHRlbmRzIHRoZSBDYW5jZWxhYmxlU3luY1NvY2tldCBjbGFzcyB0byBhbGxvdyByZWFkaW5nIGZyb20gYSBzb2NrZXQKLS8vIGFzeW5jaHJvbm91c2x5IG9uIGEgVFlQRV9JTyBtZXNzYWdlIGxvb3AgdGhyZWFkLiAgVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHNoYXJlCi0vLyBhIHRocmVhZCB0aGF0IHVzZXMgYSBtZXNzYWdlIGxvb3AgKGUuZy4gZm9yIElQQyBhbmQgb3RoZXIgdGhpbmdzKSBhbmQgbm90Ci0vLyByZXF1aXJlIGEgc2VwYXJhdGUgdGhyZWFkIHRvIHJlYWQgZnJvbSB0aGUgc29ja2V0LgotLy8KLS8vIEV4YW1wbGUgdXNhZ2UgKGFsc28gc2VlIHRoZSB1bml0IHRlc3RzKToKLS8vCi0vLyBjbGFzcyBTb2NrZXRSZWFkZXIgewotLy8gIHB1YmxpYzoKLS8vICAgU29ja2V0UmVhZGVyKGJhc2U6OkNhbmNlbGFibGVTeW5jU29ja2V0KiBzb2NrZXQpCi0vLyAgICAgICA6IHNvY2tldF8oc29ja2V0KSwgYnVmZmVyXygpIHsKLS8vICAgICBpb19oYW5kbGVyLkluaXRpYWxpemUoc29ja2V0Xy0+aGFuZGxlKCksCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoJlNvY2tldFJlYWRlcjo6T25EYXRhQXZhaWxhYmxlLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpOwotLy8gICB9Ci0vLwotLy8gICB2b2lkIEFzeW5jUmVhZCgpIHsKLS8vICAgICBDSEVDSyhpb19oYW5kbGVyLlJlYWQoJmJ1ZmZlcl9bMF0sIHNpemVvZihidWZmZXJfKSkpOwotLy8gICB9Ci0vLwotLy8gIHByaXZhdGU6Ci0vLyAgIHZvaWQgT25EYXRhQXZhaWxhYmxlKGludCBieXRlc19yZWFkKSB7Ci0vLyAgICAgaWYgKFByb2Nlc3NEYXRhKCZidWZmZXJfWzBdLCBieXRlc19yZWFkKSkgewotLy8gICAgICAgLy8gSXNzdWUgYW5vdGhlciByZWFkLgotLy8gICAgICAgQ0hFQ0soaW9faGFuZGxlci5SZWFkKCZidWZmZXJfWzBdLCBzaXplb2YoYnVmZmVyXykpKTsKLS8vICAgICB9Ci0vLyAgIH0KLS8vCi0vLyAgIG1lZGlhOjpBc3luY1NvY2tldElvSGFuZGxlciBpb19oYW5kbGVyOwotLy8gICBiYXNlOjpDYW5jZWxhYmxlU3luY1NvY2tldCogc29ja2V0XzsKLS8vICAgY2hhciBidWZmZXJfW2tCdWZmZXJTaXplXTsKLS8vIH07Ci0vLwotY2xhc3MgTUVESUFfRVhQT1JUIEFzeW5jU29ja2V0SW9IYW5kbGVyCi0gICAgOiBwdWJsaWMgTk9OX0VYUE9SVEVEX0JBU0UoYmFzZTo6Tm9uVGhyZWFkU2FmZSksCi0gICAgICBwdWJsaWMgTk9OX0VYUE9SVEVEX0JBU0UoTWVzc2FnZUxvb3BJT0hhbmRsZXIpIHsKLSBwdWJsaWM6Ci0gIEFzeW5jU29ja2V0SW9IYW5kbGVyKCk7Ci0gIHZpcnR1YWwgfkFzeW5jU29ja2V0SW9IYW5kbGVyKCk7Ci0KLSAgLy8gVHlwZSBkZWZpbml0aW9uIGZvciB0aGUgY2FsbGJhY2suIFRoZSBwYXJhbWV0ZXIgdGVsbHMgaG93IG1hbnkKLSAgLy8gYnl0ZXMgd2VyZSByZWFkIGFuZCBpcyAwIGlmIGFuIGVycm9yIG9jY3VycmVkLgotICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHZvaWQoaW50KT4gUmVhZENvbXBsZXRlQ2FsbGJhY2s7Ci0KLSAgLy8gSW5pdGlhbGl6ZXMgdGhlIEFzeW5jU29ja2V0SW9IYW5kbGVyIGJ5IGhvb2tpbmcgaXQgdXAgdG8gdGhlIGN1cnJlbnQKLSAgLy8gdGhyZWFkJ3MgbWVzc2FnZSBsb29wIChtdXN0IGJlIFRZUEVfSU8pLCB0byBkbyBhc3luYyByZWFkcyBmcm9tIHRoZSBzb2NrZXQKLSAgLy8gb24gdGhlIGN1cnJlbnQgdGhyZWFkLiAgVGhlIHxjYWxsYmFja3wgd2lsbCBiZSBpbnZva2VkIHdoZW5ldmVyIGEgUmVhZCgpCi0gIC8vIGhhcyBjb21wbGV0ZWQuCi0gIGJvb2wgSW5pdGlhbGl6ZShiYXNlOjpTeW5jU29ja2V0OjpIYW5kbGUgc29ja2V0LAotICAgICAgICAgICAgICAgICAgY29uc3QgUmVhZENvbXBsZXRlQ2FsbGJhY2smIGNhbGxiYWNrKTsKLQotICAvLyBBdHRlbXB0cyB0byByZWFkIGZyb20gdGhlIHNvY2tldC4gIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSB8ZmFsc2V8Ci0gIC8vIGlmIGFuIGVycm9yIG9jY3VycmVkIGFuZCB8dHJ1ZXwgaWYgZGF0YSB3YXMgcmVhZCBvciBhIHBlbmRpbmcgcmVhZAotICAvLyB3YXMgaXNzdWVkLiAgUmVnYXJkbGVzcyBvZiBhc3luYyBvciBzeW5jIG9wZXJhdGlvbiwgdGhlCi0gIC8vIFJlYWRDb21wbGV0ZUNhbGxiYWNrIChzZWUgYWJvdmUpIHdpbGwgYmUgY2FsbGVkIHdoZW4gZGF0YSBpcyBhdmFpbGFibGUuCi0gIGJvb2wgUmVhZChjaGFyKiBidWZmZXIsIGludCBidWZmZXJfbGVuKTsKLQotIHByaXZhdGU6Ci0jaWYgZGVmaW5lZChPU19XSU4pCi0gIC8vIEltcGxlbWVudGF0aW9uIG9mIElPSGFuZGxlciBvbiBXaW5kb3dzLgotICB2aXJ0dWFsIHZvaWQgT25JT0NvbXBsZXRlZChNZXNzYWdlTG9vcEZvcklPOjpJT0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGJ5dGVzX3RyYW5zZmVyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGVycm9yKSBPVkVSUklERTsKLSNlbGlmIGRlZmluZWQoT1NfUE9TSVgpCi0gIC8vIEltcGxlbWVudGF0aW9uIG9mIE1lc3NhZ2VMb29wRm9ySU86OldhdGNoZXIuCi0gIHZpcnR1YWwgdm9pZCBPbkZpbGVDYW5Xcml0ZVdpdGhvdXRCbG9ja2luZyhpbnQgc29ja2V0KSBPVkVSUklERSB7fQotICB2aXJ0dWFsIHZvaWQgT25GaWxlQ2FuUmVhZFdpdGhvdXRCbG9ja2luZyhpbnQgc29ja2V0KSBPVkVSUklERTsKLQotICB2b2lkIEVuc3VyZVdhdGNoaW5nU29ja2V0KCk7Ci0jZW5kaWYKLQotICBiYXNlOjpTeW5jU29ja2V0OjpIYW5kbGUgc29ja2V0XzsKLSNpZiBkZWZpbmVkKE9TX1dJTikKLSAgTWVzc2FnZUxvb3BGb3JJTzo6SU9Db250ZXh0KiBjb250ZXh0XzsKLSAgYm9vbCBpc19wZW5kaW5nXzsKLSNlbGlmIGRlZmluZWQoT1NfUE9TSVgpCi0gIE1lc3NhZ2VMb29wRm9ySU86OkZpbGVEZXNjcmlwdG9yV2F0Y2hlciBzb2NrZXRfd2F0Y2hlcl87Ci0gIC8vIHxwZW5kaW5nX2J1ZmZlcl98IGFuZCB8cGVuZGluZ19idWZmZXJfbGVuX3wgYXJlIHZhbGlkIG9ubHkgYmV0d2VlbgotICAvLyBSZWFkKCkgYW5kIE9uRmlsZUNhblJlYWRXaXRob3V0QmxvY2tpbmcoKS4KLSAgY2hhciogcGVuZGluZ19idWZmZXJfOwotICBpbnQgcGVuZGluZ19idWZmZXJfbGVuXzsKLSAgLy8gfHRydWV8IGlmZiB0aGUgbWVzc2FnZSBsb29wIGlzIHdhdGNoaW5nIHRoZSBzb2NrZXQgZm9yIElPIGV2ZW50cy4KLSAgYm9vbCBpc193YXRjaGluZ187Ci0jZW5kaWYKLSAgUmVhZENvbXBsZXRlQ2FsbGJhY2sgcmVhZF9jb21wbGV0ZV87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEFzeW5jU29ja2V0SW9IYW5kbGVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYS4KLQotI2VuZGlmICAvLyBNRURJQV9BVURJT19BU1lOQ19TT0NLRVRfSU9fSEFORExFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2FzeW5jX3NvY2tldF9pb19oYW5kbGVyX3Bvc2l4LmNjIGIvc3JjL21lZGlhL2F1ZGlvL2FzeW5jX3NvY2tldF9pb19oYW5kbGVyX3Bvc2l4LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWVjN2MxLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9hc3luY19zb2NrZXRfaW9faGFuZGxlcl9wb3NpeC5jYworKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hc3luY19zb2NrZXRfaW9faGFuZGxlci5oIgotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLQotI2luY2x1ZGUgImJhc2UvcG9zaXgvZWludHJfd3JhcHBlci5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1Bc3luY1NvY2tldElvSGFuZGxlcjo6QXN5bmNTb2NrZXRJb0hhbmRsZXIoKQotICAgIDogc29ja2V0XyhiYXNlOjpTeW5jU29ja2V0OjprSW52YWxpZEhhbmRsZSksCi0gICAgICBwZW5kaW5nX2J1ZmZlcl8oTlVMTCksCi0gICAgICBwZW5kaW5nX2J1ZmZlcl9sZW5fKDApLAotICAgICAgaXNfd2F0Y2hpbmdfKGZhbHNlKSB7Ci19Ci0KLUFzeW5jU29ja2V0SW9IYW5kbGVyOjp+QXN5bmNTb2NrZXRJb0hhbmRsZXIoKSB7Ci0gIERDSEVDSyhDYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotfQotCi12b2lkIEFzeW5jU29ja2V0SW9IYW5kbGVyOjpPbkZpbGVDYW5SZWFkV2l0aG91dEJsb2NraW5nKGludCBzb2NrZXQpIHsKLSAgRENIRUNLKENhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIERDSEVDS19FUShzb2NrZXQsIHNvY2tldF8pOwotICBEQ0hFQ0soIXJlYWRfY29tcGxldGVfLmlzX251bGwoKSk7Ci0KLSAgaWYgKHBlbmRpbmdfYnVmZmVyXykgewotICAgIGludCBieXRlc19yZWFkID0gSEFORExFX0VJTlRSKHJlYWQoc29ja2V0XywgcGVuZGluZ19idWZmZXJfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ19idWZmZXJfbGVuXykpOwotICAgIERDSEVDS19HVChieXRlc19yZWFkLCAwKTsKLSAgICBwZW5kaW5nX2J1ZmZlcl8gPSBOVUxMOwotICAgIHBlbmRpbmdfYnVmZmVyX2xlbl8gPSAwOwotICAgIHJlYWRfY29tcGxldGVfLlJ1bihieXRlc19yZWFkID4gMCA/IGJ5dGVzX3JlYWQgOiAwKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBXZSdyZSBnZXR0aW5nIG5vdGlmaWNhdGlvbnMgdGhhdCB3ZSBjYW4gcmVhZCBmcm9tIHRoZSBzb2NrZXQgd2hpbGUKLSAgICAvLyB3ZSdyZSBub3Qgd2FpdGluZyBmb3IgZGF0YS4gIEluIG9yZGVyIHRvIG5vdCBzdGFydmUgdGhlIG1lc3NhZ2UgbG9vcCwKLSAgICAvLyBsZXQncyBzdG9wIHdhdGNoaW5nIHRoZSBmZCBhbmQgcmVzdGFydCB0aGUgd2F0Y2ggd2hlbiBSZWFkKCkgaXMgY2FsbGVkLgotICAgIGlzX3dhdGNoaW5nXyA9IGZhbHNlOwotICAgIHNvY2tldF93YXRjaGVyXy5TdG9wV2F0Y2hpbmdGaWxlRGVzY3JpcHRvcigpOwotICB9Ci19Ci0KLWJvb2wgQXN5bmNTb2NrZXRJb0hhbmRsZXI6OlJlYWQoY2hhciogYnVmZmVyLCBpbnQgYnVmZmVyX2xlbikgewotICBEQ0hFQ0soQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLSAgRENIRUNLKCFyZWFkX2NvbXBsZXRlXy5pc19udWxsKCkpOwotICBEQ0hFQ0soIXBlbmRpbmdfYnVmZmVyXyk7Ci0KLSAgRW5zdXJlV2F0Y2hpbmdTb2NrZXQoKTsKLQotICBpbnQgYnl0ZXNfcmVhZCA9IEhBTkRMRV9FSU5UUihyZWFkKHNvY2tldF8sIGJ1ZmZlciwgYnVmZmVyX2xlbikpOwotICBpZiAoYnl0ZXNfcmVhZCA8IDApIHsKLSAgICBpZiAoZXJybm8gPT0gRUFHQUlOKSB7Ci0gICAgICBwZW5kaW5nX2J1ZmZlcl8gPSBidWZmZXI7Ci0gICAgICBwZW5kaW5nX2J1ZmZlcl9sZW5fID0gYnVmZmVyX2xlbjsKLSAgICB9IGVsc2UgewotICAgICAgTk9UUkVBQ0hFRCgpIDw8ICJyZWFkKCk6ICIgPDwgZXJybm87Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHJlYWRfY29tcGxldGVfLlJ1bihieXRlc19yZWFkKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBBc3luY1NvY2tldElvSGFuZGxlcjo6SW5pdGlhbGl6ZShiYXNlOjpTeW5jU29ja2V0OjpIYW5kbGUgc29ja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWFkQ29tcGxldGVDYWxsYmFjayYgY2FsbGJhY2spIHsKLSAgRENIRUNLX0VRKHNvY2tldF8sIGJhc2U6OlN5bmNTb2NrZXQ6OmtJbnZhbGlkSGFuZGxlKTsKLQotICBEZXRhY2hGcm9tVGhyZWFkKCk7Ci0KLSAgc29ja2V0XyA9IHNvY2tldDsKLSAgcmVhZF9jb21wbGV0ZV8gPSBjYWxsYmFjazsKLQotICAvLyBTeW5jU29ja2V0IGlzIGJsb2NraW5nIGJ5IGRlZmF1bHQsIHNvIGxldCdzIGNvbnZlcnQgaXQgdG8gbm9uLWJsb2NraW5nLgotICBpbnQgdmFsdWUgPSBmY250bChzb2NrZXQsIEZfR0VURkwpOwotICBpZiAoISh2YWx1ZSAmIE9fTk9OQkxPQ0spKSB7Ci0gICAgLy8gU2V0IHRoZSBzb2NrZXQgdG8gYmUgbm9uLWJsb2NraW5nIHNvIHdlIGNhbiBkbyBhc3luYyByZWFkcy4KLSAgICBpZiAoZmNudGwoc29ja2V0LCBGX1NFVEZMLCBPX05PTkJMT0NLKSA9PSAtMSkgewotICAgICAgTk9UUkVBQ0hFRCgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEFzeW5jU29ja2V0SW9IYW5kbGVyOjpFbnN1cmVXYXRjaGluZ1NvY2tldCgpIHsKLSAgRENIRUNLKENhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIGlmICghaXNfd2F0Y2hpbmdfICYmIHNvY2tldF8gIT0gYmFzZTo6U3luY1NvY2tldDo6a0ludmFsaWRIYW5kbGUpIHsKLSAgICBpc193YXRjaGluZ18gPSBNZXNzYWdlTG9vcEZvcklPOjpjdXJyZW50KCktPldhdGNoRmlsZURlc2NyaXB0b3IoCi0gICAgICAgIHNvY2tldF8sIHRydWUsIE1lc3NhZ2VMb29wRm9ySU86OldBVENIX1JFQUQsICZzb2NrZXRfd2F0Y2hlcl8sIHRoaXMpOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYS4KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9hc3luY19zb2NrZXRfaW9faGFuZGxlcl91bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9hdWRpby9hc3luY19zb2NrZXRfaW9faGFuZGxlcl91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdmYTQ3Yi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vYXN5bmNfc29ja2V0X2lvX2hhbmRsZXJfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2FzeW5jX3NvY2tldF9pb19oYW5kbGVyLmgiCi0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIHsKLWNvbnN0IGNoYXIga0FzeW5jU29ja2V0SW9UZXN0U3RyaW5nW10gPSAiSGVsbG8sIEFzeW5jU29ja2V0SW9IYW5kbGVyIjsKLWNvbnN0IHNpemVfdCBrQXN5bmNTb2NrZXRJb1Rlc3RTdHJpbmdMZW5ndGggPQotICAgIGFycmF5c2l6ZShrQXN5bmNTb2NrZXRJb1Rlc3RTdHJpbmcpOwotCi1jbGFzcyBUZXN0U29ja2V0UmVhZGVyIHsKLSBwdWJsaWM6Ci0gIC8vIFNldCB8bnVtYmVyX29mX3JlYWRzX2JlZm9yZV9xdWl0fCB0byA+MCB3aGVuIHlvdSBleHBlY3QgYSBzcGVjaWZpYyBudW1iZXIKLSAgLy8gb2YgUmVhZCBvcGVyYXRpb25zIHRvIGNvbXBsZXRlLiAgT25jZSB0aGF0IG51bWJlciBpcyByZWFjaGVkLCB0aGUgY3VycmVudAotICAvLyBtZXNzYWdlIGxvb3Agd2lsbCBiZSBRdWl0KCkuICBTZXQgfG51bWJlcl9vZl9yZWFkc19iZWZvcmVfcXVpdHwgdG8gLTEgaWYKLSAgLy8gY2FsbGJhY2tzIHNob3VsZCBub3QgYmUgY291bnRlZC4KLSAgVGVzdFNvY2tldFJlYWRlcihiYXNlOjpDYW5jZWxhYmxlU3luY1NvY2tldCogc29ja2V0LAotICAgICAgICAgICAgICAgICAgIGludCBudW1iZXJfb2ZfcmVhZHNfYmVmb3JlX3F1aXQsCi0gICAgICAgICAgICAgICAgICAgYm9vbCBpc3N1ZV9yZWFkc19mcm9tX2NhbGxiYWNrKQotICAgICAgOiBzb2NrZXRfKHNvY2tldCksIGJ1ZmZlcl8oKSwKLSAgICAgICAgbnVtYmVyX29mX3JlYWRzX2JlZm9yZV9xdWl0XyhudW1iZXJfb2ZfcmVhZHNfYmVmb3JlX3F1aXQpLAotICAgICAgICBjYWxsYmFja3NfcmVjZWl2ZWRfKDApLAotICAgICAgICBpc3N1ZV9yZWFkc19mcm9tX2NhbGxiYWNrXyhpc3N1ZV9yZWFkc19mcm9tX2NhbGxiYWNrKSB7Ci0gICAgaW9faGFuZGxlci5Jbml0aWFsaXplKHNvY2tldF8tPmhhbmRsZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKCZUZXN0U29ja2V0UmVhZGVyOjpPblJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICB9Ci0gIH5UZXN0U29ja2V0UmVhZGVyKCkge30KLQotICBib29sIElzc3VlUmVhZCgpIHsKLSAgICByZXR1cm4gaW9faGFuZGxlci5SZWFkKCZidWZmZXJfWzBdLCBzaXplb2YoYnVmZmVyXykpOwotICB9Ci0KLSAgY29uc3QgY2hhciogYnVmZmVyKCkgY29uc3QgeyByZXR1cm4gJmJ1ZmZlcl9bMF07IH0KLQotICBpbnQgY2FsbGJhY2tzX3JlY2VpdmVkKCkgY29uc3QgeyByZXR1cm4gY2FsbGJhY2tzX3JlY2VpdmVkXzsgfQotCi0gcHJpdmF0ZToKLSAgdm9pZCBPblJlYWQoaW50IGJ5dGVzX3JlYWQpIHsKLSAgICBFWFBFQ1RfR1QoYnl0ZXNfcmVhZCwgMCk7Ci0gICAgKytjYWxsYmFja3NfcmVjZWl2ZWRfOwotICAgIGlmIChudW1iZXJfb2ZfcmVhZHNfYmVmb3JlX3F1aXRfID09IGNhbGxiYWNrc19yZWNlaXZlZF8pIHsKLSAgICAgIE1lc3NhZ2VMb29wOjpjdXJyZW50KCktPlF1aXQoKTsKLSAgICB9IGVsc2UgaWYgKGlzc3VlX3JlYWRzX2Zyb21fY2FsbGJhY2tfKSB7Ci0gICAgICBJc3N1ZVJlYWQoKTsKLSAgICB9Ci0gIH0KLQotICBtZWRpYTo6QXN5bmNTb2NrZXRJb0hhbmRsZXIgaW9faGFuZGxlcjsKLSAgYmFzZTo6Q2FuY2VsYWJsZVN5bmNTb2NrZXQqIHNvY2tldF87ICAvLyBPd25lcnNoaXAgbGllcyBvdXRzaWRlIHRoZSBjbGFzcy4KLSAgY2hhciBidWZmZXJfW2tBc3luY1NvY2tldElvVGVzdFN0cmluZ0xlbmd0aF07Ci0gIGludCBudW1iZXJfb2ZfcmVhZHNfYmVmb3JlX3F1aXRfOwotICBpbnQgY2FsbGJhY2tzX3JlY2VpdmVkXzsKLSAgYm9vbCBpc3N1ZV9yZWFkc19mcm9tX2NhbGxiYWNrXzsKLX07Ci0KLS8vIFdvcmthcm91bmQgdG8gYmUgYWJsZSB0byB1c2UgYSBiYXNlOjpDbG9zdXJlIGZvciBzZW5kaW5nIGRhdGEuCi0vLyBTZW5kKCkgcmV0dXJucyBpbnQgYnV0IGEgY2xvc3VyZSBtdXN0IHJldHVybiB2b2lkLgotdm9pZCBTZW5kRGF0YShiYXNlOjpDYW5jZWxhYmxlU3luY1NvY2tldCogc29ja2V0LAotICAgICAgICAgICAgICBjb25zdCB2b2lkKiBidWZmZXIsCi0gICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpIHsKLSAgc29ja2V0LT5TZW5kKGJ1ZmZlciwgbGVuZ3RoKTsKLX0KLQotfSAgLy8gZW5kIG5hbWVzcGFjZS4KLQotLy8gVGVzdHMgZG9pbmcgYSBwZW5kaW5nIHJlYWQgZnJvbSBhIHNvY2tldCBhbmQgdXNlIGFuIElPIGhhbmRsZXIgdG8gZ2V0Ci0vLyBub3RpZmllZCBvZiBkYXRhLgotVEVTVChBc3luY1NvY2tldElvSGFuZGxlclRlc3QsIEFzeW5jaHJvbm91c1JlYWRXaXRoTWVzc2FnZUxvb3ApIHsKLSAgTWVzc2FnZUxvb3BGb3JJTyBsb29wOwotCi0gIGJhc2U6OkNhbmNlbGFibGVTeW5jU29ja2V0IHBhaXJbMl07Ci0gIEFTU0VSVF9UUlVFKGJhc2U6OkNhbmNlbGFibGVTeW5jU29ja2V0OjpDcmVhdGVQYWlyKCZwYWlyWzBdLCAmcGFpclsxXSkpOwotCi0gIFRlc3RTb2NrZXRSZWFkZXIgcmVhZGVyKCZwYWlyWzBdLCAxLCBmYWxzZSk7Ci0gIEVYUEVDVF9UUlVFKHJlYWRlci5Jc3N1ZVJlYWQoKSk7Ci0KLSAgcGFpclsxXS5TZW5kKGtBc3luY1NvY2tldElvVGVzdFN0cmluZywga0FzeW5jU29ja2V0SW9UZXN0U3RyaW5nTGVuZ3RoKTsKLSAgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKS0+UnVuKCk7Ci0gIEVYUEVDVF9FUShzdHJjbXAocmVhZGVyLmJ1ZmZlcigpLCBrQXN5bmNTb2NrZXRJb1Rlc3RTdHJpbmcpLCAwKTsKLSAgRVhQRUNUX0VRKDEsIHJlYWRlci5jYWxsYmFja3NfcmVjZWl2ZWQoKSk7Ci19Ci0KLS8vIFRlc3RzIGRvaW5nIGEgcmVhZCBmcm9tIGEgc29ja2V0IHdoZW4gd2Uga25vdyB0aGF0IHRoZXJlIGlzIGRhdGEgaW4gdGhlCi0vLyBzb2NrZXQuICBIZXJlIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgYW55IGFzeW5jICdjYW4gcmVhZCcgbm90aWZpY2F0aW9ucwotLy8gd29uJ3QgdHJpcCB1cyBvZmYgYW5kIHRoYXQgdGhlIHN5bmNocm9ub3VzIGNhc2Ugd29ya3MgYXMgd2VsbC4KLVRFU1QoQXN5bmNTb2NrZXRJb0hhbmRsZXJUZXN0LCBTeW5jaHJvbm91c1JlYWRXaXRoTWVzc2FnZUxvb3ApIHsKLSAgTWVzc2FnZUxvb3BGb3JJTyBsb29wOwotCi0gIGJhc2U6OkNhbmNlbGFibGVTeW5jU29ja2V0IHBhaXJbMl07Ci0gIEFTU0VSVF9UUlVFKGJhc2U6OkNhbmNlbGFibGVTeW5jU29ja2V0OjpDcmVhdGVQYWlyKCZwYWlyWzBdLCAmcGFpclsxXSkpOwotCi0gIFRlc3RTb2NrZXRSZWFkZXIgcmVhZGVyKCZwYWlyWzBdLCAtMSwgZmFsc2UpOwotCi0gIHBhaXJbMV0uU2VuZChrQXN5bmNTb2NrZXRJb1Rlc3RTdHJpbmcsIGtBc3luY1NvY2tldElvVGVzdFN0cmluZ0xlbmd0aCk7Ci0gIE1lc3NhZ2VMb29wOjpjdXJyZW50KCktPlBvc3REZWxheWVkVGFzayhGUk9NX0hFUkUsIE1lc3NhZ2VMb29wOjpRdWl0Q2xvc3VyZSgpLAotICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDEwMCkpOwotICBNZXNzYWdlTG9vcDo6Y3VycmVudCgpLT5SdW4oKTsKLQotICBFWFBFQ1RfVFJVRShyZWFkZXIuSXNzdWVSZWFkKCkpOwotICBFWFBFQ1RfRVEoc3RyY21wKHJlYWRlci5idWZmZXIoKSwga0FzeW5jU29ja2V0SW9UZXN0U3RyaW5nKSwgMCk7Ci0gIC8vIFdlJ3ZlIG5vdyB2ZXJpZmllZCB0aGF0IHRoZSByZWFkIGhhcHBlbmVkIHN5bmNocm9ub3VzbHksIGJ1dCBpdCdzIG5vdAotICAvLyBndWFyYW50ZWVkIHRoYXQgdGhlIGNhbGxiYWNrIGhhcyBiZWVuIGlzc3VlZCBzaW5jZSB0aGUgY2FsbGJhY2sgd2lsbCBiZQotICAvLyBjYWxsZWQgYXN5bmNocm9ub3VzbHkgZXZlbiB0aG91Z2ggdGhlIHJlYWQgbWF5IGhhdmUgYmVlbiBkb25lLgotICAvLyBTbyB3ZSBjYWxsIFJ1blVudGlsSWRsZSgpIHRvIGFsbG93IGFueSBldmVudCBub3RpZmljYXRpb25zIG9yIEFQQydzIG9uCi0gIC8vIFdpbmRvd3MsIHRvIGV4ZWN1dGUgYmVmb3JlIGNoZWNraW5nIHRoZSBjb3VudCBvZiBob3cgbWFueSBjYWxsYmFja3Mgd2UndmUKLSAgLy8gcmVjZWl2ZWQuCi0gIE1lc3NhZ2VMb29wOjpjdXJyZW50KCktPlJ1blVudGlsSWRsZSgpOwotICBFWFBFQ1RfRVEoMSwgcmVhZGVyLmNhbGxiYWNrc19yZWNlaXZlZCgpKTsKLX0KLQotLy8gQ2FsbHMgUmVhZCgpIGZyb20gd2l0aGluIGEgY2FsbGJhY2sgdG8gdGVzdCB0aGF0IHNpbXBsZSByZWFkICJsb29wcyIgd29yay4KLVRFU1QoQXN5bmNTb2NrZXRJb0hhbmRsZXJUZXN0LCBSZWFkRnJvbUNhbGxiYWNrKSB7Ci0gIE1lc3NhZ2VMb29wRm9ySU8gbG9vcDsKLQotICBiYXNlOjpDYW5jZWxhYmxlU3luY1NvY2tldCBwYWlyWzJdOwotICBBU1NFUlRfVFJVRShiYXNlOjpDYW5jZWxhYmxlU3luY1NvY2tldDo6Q3JlYXRlUGFpcigmcGFpclswXSwgJnBhaXJbMV0pKTsKLQotICBjb25zdCBpbnQga1JlYWRPcGVyYXRpb25Db3VudCA9IDEwOwotICBUZXN0U29ja2V0UmVhZGVyIHJlYWRlcigmcGFpclswXSwga1JlYWRPcGVyYXRpb25Db3VudCwgdHJ1ZSk7Ci0gIEVYUEVDVF9UUlVFKHJlYWRlci5Jc3N1ZVJlYWQoKSk7Ci0KLSAgLy8gSXNzdWUgc2VuZHMgb24gYW4gaW50ZXJ2YWwgdG8gc2F0aXNmeSB0aGUgUmVhZCgpIHJlcXVpcmVtZW50cy4KLSAgaW50NjQgbWlsbGlzZWNvbmRzID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrUmVhZE9wZXJhdGlvbkNvdW50OyArK2kpIHsKLSAgICBNZXNzYWdlTG9vcDo6Y3VycmVudCgpLT5Qb3N0RGVsYXllZFRhc2soRlJPTV9IRVJFLAotICAgICAgICBiYXNlOjpCaW5kKCZTZW5kRGF0YSwgJnBhaXJbMV0sIGtBc3luY1NvY2tldElvVGVzdFN0cmluZywKLSAgICAgICAgICAgIGtBc3luY1NvY2tldElvVGVzdFN0cmluZ0xlbmd0aCksCi0gICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyhtaWxsaXNlY29uZHMpKTsKLSAgICBtaWxsaXNlY29uZHMgKz0gMTA7Ci0gIH0KLQotICBNZXNzYWdlTG9vcDo6Y3VycmVudCgpLT5Qb3N0RGVsYXllZFRhc2soRlJPTV9IRVJFLCBNZXNzYWdlTG9vcDo6UXVpdENsb3N1cmUoKSwKLSAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygxMDAgKyBtaWxsaXNlY29uZHMpKTsKLQotICBNZXNzYWdlTG9vcDo6Y3VycmVudCgpLT5SdW4oKTsKLSAgRVhQRUNUX0VRKGtSZWFkT3BlcmF0aW9uQ291bnQsIHJlYWRlci5jYWxsYmFja3NfcmVjZWl2ZWQoKSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vYXN5bmNfc29ja2V0X2lvX2hhbmRsZXJfd2luLmNjIGIvc3JjL21lZGlhL2F1ZGlvL2FzeW5jX3NvY2tldF9pb19oYW5kbGVyX3dpbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgzZjQwNS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vYXN5bmNfc29ja2V0X2lvX2hhbmRsZXJfd2luLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2FzeW5jX3NvY2tldF9pb19oYW5kbGVyLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLUFzeW5jU29ja2V0SW9IYW5kbGVyOjpBc3luY1NvY2tldElvSGFuZGxlcigpCi0gICAgOiBzb2NrZXRfKGJhc2U6OlN5bmNTb2NrZXQ6OmtJbnZhbGlkSGFuZGxlKSwKLSAgICAgIGNvbnRleHRfKE5VTEwpLAotICAgICAgaXNfcGVuZGluZ18oZmFsc2UpIHt9Ci0KLUFzeW5jU29ja2V0SW9IYW5kbGVyOjp+QXN5bmNTb2NrZXRJb0hhbmRsZXIoKSB7Ci0gIC8vIFdlIG5lZWQgdG8gYmUgZGVsZXRlZCBvbiB0aGUgY29ycmVjdCB0aHJlYWQgdG8gYXZvaWQgcmFjaW5nIHdpdGggdGhlCi0gIC8vIG1lc3NhZ2UgbG9vcCB0aHJlYWQuCi0gIERDSEVDSyhDYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotCi0gIGlmIChjb250ZXh0XykgewotICAgIGlmIChpc19wZW5kaW5nXykgewotICAgICAgLy8gTWFrZSB0aGUgY29udGV4dCBiZSBkZWxldGVkIGJ5IHRoZSBtZXNzYWdlIHB1bXAgd2hlbiBkb25lLgotICAgICAgY29udGV4dF8tPmhhbmRsZXIgPSBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICBkZWxldGUgY29udGV4dF87Ci0gICAgfQotICB9Ci19Ci0KLS8vIEltcGxlbWVudGF0aW9uIG9mIElPSGFuZGxlciBvbiBXaW5kb3dzLgotdm9pZCBBc3luY1NvY2tldElvSGFuZGxlcjo6T25JT0NvbXBsZXRlZChNZXNzYWdlTG9vcEZvcklPOjpJT0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGJ5dGVzX3RyYW5zZmVyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGVycm9yKSB7Ci0gIERDSEVDSyhDYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBEQ0hFQ0tfRVEoY29udGV4dF8sIGNvbnRleHQpOwotICBEQ0hFQ0soIXJlYWRfY29tcGxldGVfLmlzX251bGwoKSk7Ci0gIGlzX3BlbmRpbmdfID0gZmFsc2U7Ci0gIHJlYWRfY29tcGxldGVfLlJ1bihlcnJvciA9PSBFUlJPUl9TVUNDRVNTID8gYnl0ZXNfdHJhbnNmZXJlZCA6IDApOwotfQotCi1ib29sIEFzeW5jU29ja2V0SW9IYW5kbGVyOjpSZWFkKGNoYXIqIGJ1ZmZlciwgaW50IGJ1ZmZlcl9sZW4pIHsKLSAgRENIRUNLKENhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIERDSEVDSyghcmVhZF9jb21wbGV0ZV8uaXNfbnVsbCgpKTsKLSAgRENIRUNLKCFpc19wZW5kaW5nXyk7Ci0gIERDSEVDS19ORShzb2NrZXRfLCBiYXNlOjpTeW5jU29ja2V0OjprSW52YWxpZEhhbmRsZSk7Ci0KLSAgRFdPUkQgYnl0ZXNfcmVhZCA9IDA7Ci0gIEJPT0wgb2sgPSA6OlJlYWRGaWxlKHNvY2tldF8sIGJ1ZmZlciwgYnVmZmVyX2xlbiwgJmJ5dGVzX3JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0Xy0+b3ZlcmxhcHBlZCk7Ci0gIC8vIFRoZSBjb21wbGV0aW9uIHBvcnQgd2lsbCBiZSBzaWduYWxlZCByZWdhcmRsZXNzIG9mIGNvbXBsZXRpbmcgdGhlIHJlYWQKLSAgLy8gc3RyYWlnaHQgYXdheSBvciBhc3luY2hyb25vdXNseSAoRVJST1JfSU9fUEVORElORykuIE9uSU9Db21wbGV0ZWQoKSB3aWxsCi0gIC8vIGJlIGNhbGxlZCByZWdhcmRsZXNzIGFuZCB3ZSBkb24ndCBuZWVkIHRvIGV4cGxpY2l0bHkgcnVuIHRoZSBjYWxsYmFjawotICAvLyBpbiB0aGUgY2FzZSB3aGVyZSBvayBpcyBGQUxTRSBhbmQgR0xFPT1FUlJPUl9JT19QRU5ESU5HLgotICBpc19wZW5kaW5nXyA9ICFvayAmJiAoR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfSU9fUEVORElORyk7Ci0gIHJldHVybiBvayB8fCBpc19wZW5kaW5nXzsKLX0KLQotYm9vbCBBc3luY1NvY2tldElvSGFuZGxlcjo6SW5pdGlhbGl6ZShiYXNlOjpTeW5jU29ja2V0OjpIYW5kbGUgc29ja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWFkQ29tcGxldGVDYWxsYmFjayYgY2FsbGJhY2spIHsKLSAgRENIRUNLKCFjb250ZXh0Xyk7Ci0gIERDSEVDS19FUShzb2NrZXRfLCBiYXNlOjpTeW5jU29ja2V0OjprSW52YWxpZEhhbmRsZSk7Ci0KLSAgRGV0YWNoRnJvbVRocmVhZCgpOwotCi0gIHNvY2tldF8gPSBzb2NrZXQ7Ci0gIHJlYWRfY29tcGxldGVfID0gY2FsbGJhY2s7Ci0KLSAgTWVzc2FnZUxvb3BGb3JJTzo6Y3VycmVudCgpLT5SZWdpc3RlcklPSGFuZGxlcihzb2NrZXQsIHRoaXMpOwotCi0gIGNvbnRleHRfID0gbmV3IE1lc3NhZ2VMb29wRm9ySU86OklPQ29udGV4dCgpOwotICBjb250ZXh0Xy0+aGFuZGxlciA9IHRoaXM7Ci0gIG1lbXNldCgmY29udGV4dF8tPm92ZXJsYXBwZWQsIDAsIHNpemVvZihjb250ZXh0Xy0+b3ZlcmxhcHBlZCkpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEuCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fYnVmZmVyc19zdGF0ZS5jYyBiL3NyYy9tZWRpYS9hdWRpby9hdWRpb19idWZmZXJzX3N0YXRlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzRmOTUwLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb19idWZmZXJzX3N0YXRlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX2J1ZmZlcnNfc3RhdGUuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotQXVkaW9CdWZmZXJzU3RhdGU6OkF1ZGlvQnVmZmVyc1N0YXRlKCkKLSAgICA6IHBlbmRpbmdfYnl0ZXMoMCksCi0gICAgICBoYXJkd2FyZV9kZWxheV9ieXRlcygwKSB7Ci19Ci0KLUF1ZGlvQnVmZmVyc1N0YXRlOjpBdWRpb0J1ZmZlcnNTdGF0ZShpbnQgcGVuZGluZ19ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFyZHdhcmVfZGVsYXlfYnl0ZXMpCi0gICAgOiBwZW5kaW5nX2J5dGVzKHBlbmRpbmdfYnl0ZXMpLAotICAgICAgaGFyZHdhcmVfZGVsYXlfYnl0ZXMoaGFyZHdhcmVfZGVsYXlfYnl0ZXMpIHsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fYnVmZmVyc19zdGF0ZS5oIGIvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX2J1ZmZlcnNfc3RhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkyNDRhZS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fYnVmZmVyc19zdGF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9BVURJT19BVURJT19CVUZGRVJTX1NUQVRFX0hfCi0jZGVmaW5lIE1FRElBX0FVRElPX0FVRElPX0JVRkZFUlNfU1RBVEVfSF8KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIEF1ZGlvQnVmZmVyc1N0YXRlIHN0cnVjdCBzdG9yZXMgY3VycmVudCBzdGF0ZSBvZiBhdWRpbyBidWZmZXJzLgotLy8gSXQgaXMgdXNlZCBmb3IgYXVkaW8gc3luY2hyb25pemF0aW9uLgotc3RydWN0IE1FRElBX0VYUE9SVCBBdWRpb0J1ZmZlcnNTdGF0ZSB7Ci0gIEF1ZGlvQnVmZmVyc1N0YXRlKCk7Ci0gIEF1ZGlvQnVmZmVyc1N0YXRlKGludCBwZW5kaW5nX2J5dGVzLCBpbnQgaGFyZHdhcmVfZGVsYXlfYnl0ZXMpOwotCi0gIGludCB0b3RhbF9ieXRlcygpIHsKLSAgICByZXR1cm4gcGVuZGluZ19ieXRlcyArIGhhcmR3YXJlX2RlbGF5X2J5dGVzOwotICB9Ci0KLSAgLy8gTnVtYmVyIG9mIGJ5dGVzIHdlIGN1cnJlbnRseSBoYXZlIGluIG91ciBzb2Z0d2FyZSBidWZmZXIuCi0gIGludCBwZW5kaW5nX2J5dGVzOwotCi0gIC8vIE51bWJlciBvZiBieXRlcyB0aGF0IGhhdmUgYmVlbiB3cml0dGVuIHRvIHRoZSBkZXZpY2UsIGJ1dCBoYXZlbid0Ci0gIC8vIGJlZW4gcGxheWVkIHlldC4KLSAgaW50IGhhcmR3YXJlX2RlbGF5X2J5dGVzOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQVVESU9fQVVESU9fQlVGRkVSU19TVEFURV9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX2RldmljZV9uYW1lLmNjIGIvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX2RldmljZV9uYW1lLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmJiMDNmLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb19kZXZpY2VfbmFtZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19kZXZpY2VfbmFtZS5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1BdWRpb0RldmljZU5hbWU6OkF1ZGlvRGV2aWNlTmFtZSgpIHt9Ci0KLUF1ZGlvRGV2aWNlTmFtZTo6QXVkaW9EZXZpY2VOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB1bmlxdWVfaWQpCi0gICAgOiBkZXZpY2VfbmFtZShkZXZpY2VfbmFtZSksCi0gICAgICB1bmlxdWVfaWQodW5pcXVlX2lkKSB7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fZGV2aWNlX25hbWUuaCBiL3NyYy9tZWRpYS9hdWRpby9hdWRpb19kZXZpY2VfbmFtZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTNjY2EwLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb19kZXZpY2VfbmFtZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDExIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9BVURJT19BVURJT19ERVZJQ0VfTkFNRV9IXwotI2RlZmluZSBNRURJQV9BVURJT19BVURJT19ERVZJQ0VfTkFNRV9IXwotCi0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotc3RydWN0IE1FRElBX0VYUE9SVCBBdWRpb0RldmljZU5hbWUgewotICBBdWRpb0RldmljZU5hbWUoKTsKLSAgQXVkaW9EZXZpY2VOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB1bmlxdWVfaWQpOwotCi0gIHN0ZDo6c3RyaW5nIGRldmljZV9uYW1lOyAgLy8gRnJpZW5kbHkgbmFtZSBvZiB0aGUgZGV2aWNlLgotICBzdGQ6OnN0cmluZyB1bmlxdWVfaWQ7ICAgIC8vIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZGV2aWNlLgotfTsKLQotdHlwZWRlZiBzdGQ6Omxpc3Q8QXVkaW9EZXZpY2VOYW1lPiBBdWRpb0RldmljZU5hbWVzOwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9BVURJT19BVURJT19ERVZJQ0VfTkFNRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX2RldmljZV90aHJlYWQuY2MgYi9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fZGV2aWNlX3RocmVhZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFkNWVjZC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fZGV2aWNlX3RocmVhZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fZGV2aWNlX3RocmVhZC5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvYWxpZ25lZF9tZW1vcnkuaCIKLSNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3BsYXRmb3JtX3RocmVhZC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9yZXN0cmljdGlvbnMuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb191dGlsLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19idXMuaCIKLQotdXNpbmcgYmFzZTo6UGxhdGZvcm1UaHJlYWQ7Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIFRoZSBhY3R1YWwgd29ya2VyIHRocmVhZCBpbXBsZW1lbnRhdGlvbi4gIEl0J3MgdmVyeSBiYXJlIGJvbmVzIGFuZCBtdWNoCi0vLyBzaW1wbGVyIHRoYW4gU2ltcGxlVGhyZWFkIChubyBzeW5jaHJvbml6YXRpb24gaW4gU3RhcnQsIGV0YykgYW5kIHN1cHBvcnRzCi0vLyBqb2luaW5nIHRoZSB0aHJlYWQgaGFuZGxlIGFzeW5jaHJvbm91c2x5IHZpYSBhIHByb3ZpZGVkIG1lc3NhZ2UgbG9vcCBldmVuCi0vLyBhZnRlciB0aGUgVGhyZWFkIG9iamVjdCBpdHNlbGYgaGFzIGJlZW4gZGVsZXRlZC4KLWNsYXNzIEF1ZGlvRGV2aWNlVGhyZWFkOjpUaHJlYWQKLSAgICA6IHB1YmxpYyBQbGF0Zm9ybVRocmVhZDo6RGVsZWdhdGUsCi0gICAgICBwdWJsaWMgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8QXVkaW9EZXZpY2VUaHJlYWQ6OlRocmVhZD4gewotIHB1YmxpYzoKLSAgVGhyZWFkKEF1ZGlvRGV2aWNlVGhyZWFkOjpDYWxsYmFjayogY2FsbGJhY2ssCi0gICAgICAgICBiYXNlOjpTeW5jU29ja2V0OjpIYW5kbGUgc29ja2V0LAotICAgICAgICAgY29uc3QgY2hhciogdGhyZWFkX25hbWUpOwotCi0gIHZvaWQgU3RhcnQoKTsKLQotICAvLyBTdG9wcyB0aGUgdGhyZWFkLiAgSWYgfGxvb3BfZm9yX2pvaW58IGlzIG5vbi1OVUxMLCB0aGUgZnVuY3Rpb24gcG9zdHMKLSAgLy8gYSB0YXNrIHRvIGpvaW4gKGNsb3NlKSB0aGUgdGhyZWFkIGhhbmRsZSBsYXRlciBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yCi0gIC8vIHRoZSB0aHJlYWQuICBJZiBsb29wX2Zvcl9qb2luIGlzIE5VTEwsIHRoZW4gdGhlIGZ1bmN0aW9uIHdhaXRzCi0gIC8vIHN5bmNocm9ub3VzbHkgZm9yIHRoZSB0aHJlYWQgdG8gdGVybWluYXRlLgotICB2b2lkIFN0b3AoTWVzc2FnZUxvb3AqIGxvb3BfZm9yX2pvaW4pOwotCi0gcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPEF1ZGlvRGV2aWNlVGhyZWFkOjpUaHJlYWQ+OwotICB2aXJ0dWFsIH5UaHJlYWQoKTsKLQotICAvLyBPdmVycmlkZXMgZnJvbSBQbGF0Zm9ybVRocmVhZDo6RGVsZWdhdGUuCi0gIHZpcnR1YWwgdm9pZCBUaHJlYWRNYWluKCkgT1ZFUlJJREU7Ci0KLSAgLy8gUnVucyB0aGUgbG9vcCB0aGF0IHJlYWRzIGZyb20gdGhlIHNvY2tldC4KLSAgdm9pZCBSdW4oKTsKLQotIHByaXZhdGU6Ci0gIGJhc2U6OlBsYXRmb3JtVGhyZWFkSGFuZGxlIHRocmVhZF87Ci0gIEF1ZGlvRGV2aWNlVGhyZWFkOjpDYWxsYmFjayogY2FsbGJhY2tfOwotICBiYXNlOjpDYW5jZWxhYmxlU3luY1NvY2tldCBzb2NrZXRfOwotICBiYXNlOjpMb2NrIGNhbGxiYWNrX2xvY2tfOwotICBjb25zdCBjaGFyKiB0aHJlYWRfbmFtZV87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFRocmVhZCk7Ci19OwotCi0vLyBBdWRpb0RldmljZVRocmVhZCBpbXBsZW1lbnRhdGlvbgotCi1BdWRpb0RldmljZVRocmVhZDo6QXVkaW9EZXZpY2VUaHJlYWQoKSB7Ci19Ci0KLUF1ZGlvRGV2aWNlVGhyZWFkOjp+QXVkaW9EZXZpY2VUaHJlYWQoKSB7Ci0gIERDSEVDSyghdGhyZWFkXyk7Ci19Ci0KLXZvaWQgQXVkaW9EZXZpY2VUaHJlYWQ6OlN0YXJ0KEF1ZGlvRGV2aWNlVGhyZWFkOjpDYWxsYmFjayogY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpTeW5jU29ja2V0OjpIYW5kbGUgc29ja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGhyZWFkX25hbWUpIHsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKHRocmVhZF9sb2NrXyk7Ci0gIENIRUNLKHRocmVhZF8gPT0gTlVMTCk7Ci0gIHRocmVhZF8gPSBuZXcgQXVkaW9EZXZpY2VUaHJlYWQ6OlRocmVhZChjYWxsYmFjaywgc29ja2V0LCB0aHJlYWRfbmFtZSk7Ci0gIHRocmVhZF8tPlN0YXJ0KCk7Ci19Ci0KLXZvaWQgQXVkaW9EZXZpY2VUaHJlYWQ6OlN0b3AoTWVzc2FnZUxvb3AqIGxvb3BfZm9yX2pvaW4pIHsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKHRocmVhZF9sb2NrXyk7Ci0gIGlmICh0aHJlYWRfKSB7Ci0gICAgdGhyZWFkXy0+U3RvcChsb29wX2Zvcl9qb2luKTsKLSAgICB0aHJlYWRfID0gTlVMTDsKLSAgfQotfQotCi1ib29sIEF1ZGlvRGV2aWNlVGhyZWFkOjpJc1N0b3BwZWQoKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayh0aHJlYWRfbG9ja18pOwotICByZXR1cm4gdGhyZWFkXyA9PSBOVUxMOwotfQotCi0vLyBBdWRpb0RldmljZVRocmVhZDo6VGhyZWFkIGltcGxlbWVudGF0aW9uCi1BdWRpb0RldmljZVRocmVhZDo6VGhyZWFkOjpUaHJlYWQoQXVkaW9EZXZpY2VUaHJlYWQ6OkNhbGxiYWNrKiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpTeW5jU29ja2V0OjpIYW5kbGUgc29ja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRocmVhZF9uYW1lKQotICAgIDogdGhyZWFkXyhiYXNlOjprTnVsbFRocmVhZEhhbmRsZSksCi0gICAgICBjYWxsYmFja18oY2FsbGJhY2spLAotICAgICAgc29ja2V0Xyhzb2NrZXQpLAotICAgICAgdGhyZWFkX25hbWVfKHRocmVhZF9uYW1lKSB7Ci19Ci0KLUF1ZGlvRGV2aWNlVGhyZWFkOjpUaHJlYWQ6On5UaHJlYWQoKSB7Ci0gIERDSEVDS19FUSh0aHJlYWRfLCBiYXNlOjprTnVsbFRocmVhZEhhbmRsZSkgPDwgIlN0b3Agd2Fzbid0IGNhbGxlZCI7Ci19Ci0KLXZvaWQgQXVkaW9EZXZpY2VUaHJlYWQ6OlRocmVhZDo6U3RhcnQoKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhjYWxsYmFja19sb2NrXyk7Ci0gIERDSEVDS19FUSh0aHJlYWRfLCBiYXNlOjprTnVsbFRocmVhZEhhbmRsZSk7Ci0gIC8vIFRoaXMgcmVmZXJlbmNlIHdpbGwgYmUgcmVsZWFzZWQgd2hlbiB0aGUgdGhyZWFkIGV4aXN0cy4KLSAgQWRkUmVmKCk7Ci0KLSAgUGxhdGZvcm1UaHJlYWQ6OkNyZWF0ZVdpdGhQcmlvcml0eSgwLCB0aGlzLCAmdGhyZWFkXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjprVGhyZWFkUHJpb3JpdHlfUmVhbHRpbWVBdWRpbyk7Ci0gIENIRUNLKHRocmVhZF8gIT0gYmFzZTo6a051bGxUaHJlYWRIYW5kbGUpOwotfQotCi12b2lkIEF1ZGlvRGV2aWNlVGhyZWFkOjpUaHJlYWQ6OlN0b3AoTWVzc2FnZUxvb3AqIGxvb3BfZm9yX2pvaW4pIHsKLSAgc29ja2V0Xy5TaHV0ZG93bigpOwotCi0gIGJhc2U6OlBsYXRmb3JtVGhyZWFkSGFuZGxlIHRocmVhZCA9IGJhc2U6OmtOdWxsVGhyZWFkSGFuZGxlOwotCi0gIHsgIC8vIE5PTElOVAotICAgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhjYWxsYmFja19sb2NrXyk7Ci0gICAgY2FsbGJhY2tfID0gTlVMTDsKLSAgICBzdGQ6OnN3YXAodGhyZWFkLCB0aHJlYWRfKTsKLSAgfQotCi0gIGlmICh0aHJlYWQgIT0gYmFzZTo6a051bGxUaHJlYWRIYW5kbGUpIHsKLSAgICBpZiAobG9vcF9mb3Jfam9pbikgewotICAgICAgbG9vcF9mb3Jfam9pbi0+UG9zdFRhc2soRlJPTV9IRVJFLAotICAgICAgICAgIGJhc2U6OkJpbmQoJmJhc2U6OlBsYXRmb3JtVGhyZWFkOjpKb2luLCB0aHJlYWQpKTsKLSAgICB9IGVsc2UgewotICAgICAgYmFzZTo6UGxhdGZvcm1UaHJlYWQ6OkpvaW4odGhyZWFkKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBBdWRpb0RldmljZVRocmVhZDo6VGhyZWFkOjpUaHJlYWRNYWluKCkgewotICBQbGF0Zm9ybVRocmVhZDo6U2V0TmFtZSh0aHJlYWRfbmFtZV8pOwotCi0gIC8vIFNpbmdsZXRvbiBhY2Nlc3MgaXMgc2FmZSBmcm9tIHRoaXMgdGhyZWFkIGFzIGxvbmcgYXMgY2FsbGJhY2sgaXMgbm9uLU5VTEwuCi0gIC8vIFRoZSBjYWxsYmFjayBpcyB0aGUgb25seSBwb2ludCB3aGVyZSB0aGUgdGhyZWFkIGNhbGxzIG91dCB0byAndW5rbm93bicgY29kZQotICAvLyB0aGF0IG1pZ2h0IHRvdWNoIHNpbmdsZXRvbnMgYW5kIHRoZSBsaWZldGltZSBvZiB0aGUgY2FsbGJhY2sgaXMgY29udHJvbGxlZAotICAvLyBieSBhbm90aGVyIHRocmVhZCBvbiB3aGljaCBzaW5nbGV0b24gYWNjZXNzIGlzIE9LIGFzIHdlbGwuCi0gIGJhc2U6OlRocmVhZFJlc3RyaWN0aW9uczo6U2V0U2luZ2xldG9uQWxsb3dlZCh0cnVlKTsKLQotICB7ICAvLyBOT0xJTlQKLSAgICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2soY2FsbGJhY2tfbG9ja18pOwotICAgIGlmIChjYWxsYmFja18pCi0gICAgICBjYWxsYmFja18tPkluaXRpYWxpemVPbkF1ZGlvVGhyZWFkKCk7Ci0gIH0KLQotICBSdW4oKTsKLQotICAvLyBSZWxlYXNlIHRoZSByZWZlcmVuY2UgZm9yIHRoZSB0aHJlYWQuIE5vdGUgdGhhdCBhZnRlciB0aGlzLCB0aGUgVGhyZWFkCi0gIC8vIGluc3RhbmNlIHdpbGwgbW9zdCBsaWtlbHkgYmUgZGVsZXRlZC4KLSAgUmVsZWFzZSgpOwotfQotCi12b2lkIEF1ZGlvRGV2aWNlVGhyZWFkOjpUaHJlYWQ6OlJ1bigpIHsKLSAgd2hpbGUgKHRydWUpIHsKLSAgICBpbnQgcGVuZGluZ19kYXRhID0gMDsKLSAgICBzaXplX3QgYnl0ZXNfcmVhZCA9IHNvY2tldF8uUmVjZWl2ZSgmcGVuZGluZ19kYXRhLCBzaXplb2YocGVuZGluZ19kYXRhKSk7Ci0gICAgaWYgKGJ5dGVzX3JlYWQgIT0gc2l6ZW9mKHBlbmRpbmdfZGF0YSkpIHsKLSAgICAgIERDSEVDS19FUShieXRlc19yZWFkLCAwVSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2soY2FsbGJhY2tfbG9ja18pOwotICAgIGlmIChjYWxsYmFja18pCi0gICAgICBjYWxsYmFja18tPlByb2Nlc3MocGVuZGluZ19kYXRhKTsKLSAgfQotfQotCi0vLyBBdWRpb0RldmljZVRocmVhZDo6Q2FsbGJhY2sgaW1wbGVtZW50YXRpb24KLQotQXVkaW9EZXZpY2VUaHJlYWQ6OkNhbGxiYWNrOjpDYWxsYmFjaygKLSAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIGF1ZGlvX3BhcmFtZXRlcnMsCi0gICAgaW50IGlucHV0X2NoYW5uZWxzLAotICAgIGJhc2U6OlNoYXJlZE1lbW9yeUhhbmRsZSBtZW1vcnksIGludCBtZW1vcnlfbGVuZ3RoKQotICAgIDogYXVkaW9fcGFyYW1ldGVyc18oYXVkaW9fcGFyYW1ldGVycyksCi0gICAgICBpbnB1dF9jaGFubmVsc18oaW5wdXRfY2hhbm5lbHMpLAotICAgICAgc2FtcGxlc19wZXJfbXNfKGF1ZGlvX3BhcmFtZXRlcnMuc2FtcGxlX3JhdGUoKSAvIDEwMDApLAotICAgICAgYnl0ZXNfcGVyX21zXyhhdWRpb19wYXJhbWV0ZXJzLmNoYW5uZWxzKCkgKgotICAgICAgICAgICAgICAgICAgICAoYXVkaW9fcGFyYW1ldGVyc18uYml0c19wZXJfc2FtcGxlKCkgLyA4KSAqCi0gICAgICAgICAgICAgICAgICAgIHNhbXBsZXNfcGVyX21zXyksCi0gICAgICBzaGFyZWRfbWVtb3J5XyhtZW1vcnksIGZhbHNlKSwKLSAgICAgIG1lbW9yeV9sZW5ndGhfKG1lbW9yeV9sZW5ndGgpIHsKLSAgQ0hFQ0tfTkUoYnl0ZXNfcGVyX21zXywgMCk7ICAvLyBDYXRjaCBkaXZpc2lvbiBieSB6ZXJvIGVhcmx5LgotICBDSEVDS19ORShzYW1wbGVzX3Blcl9tc18sIDApOwotfQotCi1BdWRpb0RldmljZVRocmVhZDo6Q2FsbGJhY2s6On5DYWxsYmFjaygpIHt9Ci0KLXZvaWQgQXVkaW9EZXZpY2VUaHJlYWQ6OkNhbGxiYWNrOjpJbml0aWFsaXplT25BdWRpb1RocmVhZCgpIHsKLSAgTWFwU2hhcmVkTWVtb3J5KCk7Ci0gIERDSEVDSyhzaGFyZWRfbWVtb3J5Xy5tZW1vcnkoKSAhPSBOVUxMKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhLgpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX2RldmljZV90aHJlYWQuaCBiL3NyYy9tZWRpYS9hdWRpby9hdWRpb19kZXZpY2VfdGhyZWFkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZGJjM2EuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX2RldmljZV90aHJlYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0FVRElPX0FVRElPX0RFVklDRV9USFJFQURfSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fQVVESU9fREVWSUNFX1RIUkVBRF9IXwotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAiYmFzZS9zaGFyZWRfbWVtb3J5LmgiCi0jaW5jbHVkZSAiYmFzZS9zeW5jX3NvY2tldC5oIgotI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3BhcmFtZXRlcnMuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9zaGFyZWRfbWVtb3J5X3V0aWwuaCIKLQotY2xhc3MgTWVzc2FnZUxvb3A7Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci1jbGFzcyBBdWRpb0J1czsKLQotLy8gRGF0YSB0cmFuc2ZlciBiZXR3ZWVuIGJyb3dzZXIgYW5kIHJlbmRlciBwcm9jZXNzIHVzZXMgYSBjb21iaW5hdGlvbgotLy8gb2Ygc3luYyBzb2NrZXRzIGFuZCBzaGFyZWQgbWVtb3J5LiBUbyByZWFkIGZyb20gdGhlIHNvY2tldCBhbmQgcmVuZGVyCi0vLyBkYXRhLCB3ZSB1c2UgYSB3b3JrZXIgdGhyZWFkLCBhLmsuYS4gdGhlIEF1ZGlvRGV2aWNlVGhyZWFkLCB3aGljaCByZWFkcwotLy8gZGF0YSBmcm9tIHRoZSBicm93c2VyIHZpYSB0aGUgc29ja2V0IGFuZCBmaWxscyB0aGUgc2hhcmVkIG1lbW9yeSBmcm9tIHRoZQotLy8gYXVkaW8gdGhyZWFkIHZpYSB0aGUgQXVkaW9EZXZpY2VUaHJlYWQ6OkNhbGxiYWNrIGludGVyZmFjZS9jbGFzcy4KLS8vIEZvciBtb3JlIGRldGFpbHMgc2VlIHRoZSBkb2N1bWVudGF0aW9uIGluIGF1ZGlvX2RldmljZS5oLgotLy8KLS8vIFRPRE8odG9tbWkpOiBNdWx0aXBsZSBhdWRpbyBpbnB1dC9vdXRwdXQgZGV2aWNlIGluc3RhbmNlcyBzaG91bGQgYmUgYWJsZSB0bwotLy8gc2hhcmUgdGhlIHNhbWUgdGhyZWFkIGluc3RlYWQgb2Ygc3Bpbm5pbmcgb25lIHBlciBpbnN0YW5jZS4KLWNsYXNzIE1FRElBX0VYUE9SVCBBdWRpb0RldmljZVRocmVhZCB7Ci0gcHVibGljOgotICAvLyBUaGlzIGlzIHRoZSBjYWxsYmFjayBpbnRlcmZhY2UvYmFzZSBjbGFzcyB0aGF0IEF1ZGlvW091dHB1dHxJbnB1dF1EZXZpY2UKLSAgLy8gaW1wbGVtZW50cyB0byByZW5kZXIgaW5wdXQvb3V0cHV0IGRhdGEuIFRoZSBjYWxsYmFja3MgcnVuIG9uIHRoZQotICAvLyB0aHJlYWQgb3duZWQgYnkgQXVkaW9EZXZpY2VUaHJlYWQuCi0gIGNsYXNzIENhbGxiYWNrIHsKLSAgIHB1YmxpYzoKLSAgICBDYWxsYmFjayhjb25zdCBBdWRpb1BhcmFtZXRlcnMmIGF1ZGlvX3BhcmFtZXRlcnMsCi0gICAgICAgICAgICAgaW50IGlucHV0X2NoYW5uZWxzLAotICAgICAgICAgICAgIGJhc2U6OlNoYXJlZE1lbW9yeUhhbmRsZSBtZW1vcnksCi0gICAgICAgICAgICAgaW50IG1lbW9yeV9sZW5ndGgpOwotICAgIHZpcnR1YWwgfkNhbGxiYWNrKCk7Ci0KLSAgICAvLyBPbmUgdGltZSBpbml0aWFsaXphdGlvbiBmb3IgdGhlIGNhbGxiYWNrIG9iamVjdCBvbiB0aGUgYXVkaW8gdGhyZWFkLgotICAgIHZvaWQgSW5pdGlhbGl6ZU9uQXVkaW9UaHJlYWQoKTsKLQotICAgIC8vIERlcml2ZWQgaW1wbGVtZW50YXRpb25zIG11c3QgY2FsbCBzaGFyZWRfbWVtb3J5Xy5NYXAgYXBwcm9wcmlhdGVseQotICAgIC8vIGJlZm9yZSBQcm9jZXNzIGNhbiBiZSBjYWxsZWQuCi0gICAgdmlydHVhbCB2b2lkIE1hcFNoYXJlZE1lbW9yeSgpID0gMDsKLQotICAgIC8vIENhbGxlZCB3aGVuZXZlciB3ZSByZWNlaXZlIG5vdGlmaWNhdGlvbnMgYWJvdXQgcGVuZGluZyBkYXRhLgotICAgIHZpcnR1YWwgdm9pZCBQcm9jZXNzKGludCBwZW5kaW5nX2RhdGEpID0gMDsKLQotICAgcHJvdGVjdGVkOgotICAgIC8vIFByb3RlY3RlZCBzbyB0aGF0IGRlcml2ZWQgY2xhc3NlcyBjYW4gYWNjZXNzIGRpcmVjdGx5LgotICAgIC8vIFRoZSB2YXJpYWJsZXMgYXJlICdjb25zdCcgc2luY2UgdmFsdWVzIGFyZSBjYWxjdWxhdGVkL3NldCBpbiB0aGUKLSAgICAvLyBjb25zdHJ1Y3RvciBhbmQgbXVzdCBuZXZlciBjaGFuZ2UuCi0gICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzIGF1ZGlvX3BhcmFtZXRlcnNfOwotICAgIGNvbnN0IGludCBpbnB1dF9jaGFubmVsc187Ci0gICAgY29uc3QgaW50IHNhbXBsZXNfcGVyX21zXzsKLSAgICBjb25zdCBpbnQgYnl0ZXNfcGVyX21zXzsKLQotICAgIGJhc2U6OlNoYXJlZE1lbW9yeSBzaGFyZWRfbWVtb3J5XzsKLSAgICBjb25zdCBpbnQgbWVtb3J5X2xlbmd0aF87Ci0KLSAgIHByaXZhdGU6Ci0gICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKENhbGxiYWNrKTsKLSAgfTsKLQotICBBdWRpb0RldmljZVRocmVhZCgpOwotICB+QXVkaW9EZXZpY2VUaHJlYWQoKTsKLQotICAvLyBTdGFydHMgdGhlIGF1ZGlvIHRocmVhZC4gVGhlIHRocmVhZCBtdXN0IG5vdCBhbHJlYWR5IGJlIHJ1bm5pbmcuCi0gIHZvaWQgU3RhcnQoQXVkaW9EZXZpY2VUaHJlYWQ6OkNhbGxiYWNrKiBjYWxsYmFjaywKLSAgICAgICAgICAgICBiYXNlOjpTeW5jU29ja2V0OjpIYW5kbGUgc29ja2V0LAotICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRocmVhZF9uYW1lKTsKLQotICAvLyBUaGlzIHRlbGxzIHRoZSBhdWRpbyB0aHJlYWQgdG8gc3RvcCBhbmQgY2xlYW4gdXAgdGhlIGRhdGEuCi0gIC8vIFRoZSBtZXRob2QgY2FuIHN0b3AgdGhlIHRocmVhZCBzeW5jaHJvbm91c2x5IG9yIGFzeW5jaHJvbm91c2x5LgotICAvLyBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSB0aHJlYWQgd2lsbCBzdGlsbCBiZSBydW5uaW5nIGFmdGVyIFN0b3AoKQotICAvLyByZXR1cm5zLCBidXQgdGhlIGNhbGxiYWNrIHBvaW50ZXIgaXMgY2xlYXJlZCBzbyBubyBmdXJ0aGVyIGNhbGxiYWNrcyB3aWxsCi0gIC8vIGJlIG1hZGUgKElPVyBhZnRlciBTdG9wKCkgcmV0dXJucywgaXQgaXMgc2FmZSB0byBkZWxldGUgdGhlIGNhbGxiYWNrKS4KLSAgLy8gVGhlIHxsb29wX2Zvcl9qb2lufCBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQgZm9yIGFzeW5jaHJvbm91cyBvcGVyYXRpb24KLSAgLy8gaW4gb3JkZXIgdG8gam9pbiB0aGUgd29ya2VyIHRocmVhZCBhbmQgY2xvc2UgdGhlIHRocmVhZCBoYW5kbGUgbGF0ZXIgdmlhIGEKLSAgLy8gcG9zdGVkIHRhc2suCi0gIC8vIElmIHNldCB0byBOVUxMLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gZXhpdCBiZWZvcmUgcmV0dXJuaW5nLgotICB2b2lkIFN0b3AoTWVzc2FnZUxvb3AqIGxvb3BfZm9yX2pvaW4pOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGhyZWFkIGlzIHN0b3BwZWQgb3Igc3RvcHBpbmcuCi0gIGJvb2wgSXNTdG9wcGVkKCk7Ci0KLSBwcml2YXRlOgotICAvLyBPdXIgb3duIHByaXZhdGUgU2ltcGxlVGhyZWFkIG92ZXJyaWRlLiAgV2UgaW1wbGVtZW50IHRoaXMgaW4gYQotICAvLyBwcml2YXRlIGNsYXNzIHNvIHRoYXQgd2UgZ2V0IHRoZSBmb2xsb3dpbmcgYmVuZWZpdHM6Ci0gIC8vIDEpIEF1ZGlvRGV2aWNlVGhyZWFkIGRvZXNuJ3QgZXhwb3NlIFNpbXBsZVRocmVhZCBtZXRob2RzLgotICAvLyAgICBJLmUuIHRoZSBjYWxsZXIgY2FuJ3QgY2FsbCBTdGFydCgpL1N0b3AoKSAtIHdoaWNoIHdvdWxkIGJlIGJhZC4KLSAgLy8gMikgV2Ugb3ZlcnJpZGUgVGhyZWFkTWFpbiB0byBhZGQgYWRkaXRpb25hbCBvbi10aHJlYWQgaW5pdGlhbGl6YXRpb24KLSAgLy8gICAgd2hpbGUgc3RpbGwgc3luY2hyb25pemVkIHdpdGggU2ltcGxlVGhyZWFkOjpTdGFydCgpIHRvIHByb3ZpZGUKLSAgLy8gICAgcmVsaWFibGUgaW5pdGlhbGl6YXRpb24uCi0gIGNsYXNzIFRocmVhZDsKLQotICBiYXNlOjpMb2NrIHRocmVhZF9sb2NrXzsKLSAgc2NvcGVkX3JlZnB0cjxBdWRpb0RldmljZVRocmVhZDo6VGhyZWFkPiB0aHJlYWRfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBdWRpb0RldmljZVRocmVhZCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEuCi0KLSNlbmRpZiAgLy8gTUVESUFfQVVESU9fQVVESU9fREVWSUNFX1RIUkVBRF9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX2lucHV0X2NvbnRyb2xsZXIuY2MgYi9zcmMvbWVkaWEvYXVkaW8vYXVkaW9faW5wdXRfY29udHJvbGxlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTliYjQyMC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9faW5wdXRfY29udHJvbGxlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9faW5wdXRfY29udHJvbGxlci5oIgotCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX3Jlc3RyaWN0aW9ucy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbGltaXRzLmgiCi0KLW5hbWVzcGFjZSB7Ci1jb25zdCBpbnQga01heElucHV0Q2hhbm5lbHMgPSAyOwotY29uc3QgaW50IGtUaW1lclJlc2V0SW50ZXJ2YWxTZWNvbmRzID0gMTsKLSNpZiBkZWZpbmVkKE9TX0lPUykKLS8vIFRoZSBmaXJzdCBjYWxsYmFjayBvbiBpT1MgaXMgcmVjZWl2ZWQgYWZ0ZXIgdGhlIGN1cnJlbnQgYmFja2dyb3VuZAotLy8gYXVkaW8gaGFzIGZhZGVkIGF3YXkuCi1jb25zdCBpbnQga1RpbWVySW5pdGlhbEludGVydmFsU2Vjb25kcyA9IDQ7Ci0jZWxzZQotY29uc3QgaW50IGtUaW1lckluaXRpYWxJbnRlcnZhbFNlY29uZHMgPSAxOwotI2VuZGlmICAvLyBkZWZpbmVkKE9TX0lPUykKLX0KLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gc3RhdGljCi1BdWRpb0lucHV0Q29udHJvbGxlcjo6RmFjdG9yeSogQXVkaW9JbnB1dENvbnRyb2xsZXI6OmZhY3RvcnlfID0gTlVMTDsKLQotQXVkaW9JbnB1dENvbnRyb2xsZXI6OkF1ZGlvSW5wdXRDb250cm9sbGVyKEV2ZW50SGFuZGxlciogaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW5jV3JpdGVyKiBzeW5jX3dyaXRlcikKLSAgICA6IGNyZWF0b3JfbG9vcF8oYmFzZTo6TWVzc2FnZUxvb3BQcm94eTo6Y3VycmVudCgpKSwKLSAgICAgIGhhbmRsZXJfKGhhbmRsZXIpLAotICAgICAgc3RyZWFtXyhOVUxMKSwKLSAgICAgIGRhdGFfaXNfYWN0aXZlXyhmYWxzZSksCi0gICAgICBzdGF0ZV8oa0VtcHR5KSwKLSAgICAgIHN5bmNfd3JpdGVyXyhzeW5jX3dyaXRlciksCi0gICAgICBtYXhfdm9sdW1lXygwLjApIHsKLSAgRENIRUNLKGNyZWF0b3JfbG9vcF8pOwotfQotCi1BdWRpb0lucHV0Q29udHJvbGxlcjo6fkF1ZGlvSW5wdXRDb250cm9sbGVyKCkgewotICBEQ0hFQ0soa0Nsb3NlZCA9PSBzdGF0ZV8gfHwga0NyZWF0ZWQgPT0gc3RhdGVfIHx8IGtFbXB0eSA9PSBzdGF0ZV8pOwotfQotCi0vLyBzdGF0aWMKLXNjb3BlZF9yZWZwdHI8QXVkaW9JbnB1dENvbnRyb2xsZXI+IEF1ZGlvSW5wdXRDb250cm9sbGVyOjpDcmVhdGUoCi0gICAgQXVkaW9NYW5hZ2VyKiBhdWRpb19tYW5hZ2VyLAotICAgIEV2ZW50SGFuZGxlciogZXZlbnRfaGFuZGxlciwKLSAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcykgewotICBEQ0hFQ0soYXVkaW9fbWFuYWdlcik7Ci0KLSAgaWYgKCFwYXJhbXMuSXNWYWxpZCgpIHx8IChwYXJhbXMuY2hhbm5lbHMoKSA+IGtNYXhJbnB1dENoYW5uZWxzKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoZmFjdG9yeV8pCi0gICAgcmV0dXJuIGZhY3RvcnlfLT5DcmVhdGUoYXVkaW9fbWFuYWdlciwgZXZlbnRfaGFuZGxlciwgcGFyYW1zKTsKLQotICBzY29wZWRfcmVmcHRyPEF1ZGlvSW5wdXRDb250cm9sbGVyPiBjb250cm9sbGVyKG5ldyBBdWRpb0lucHV0Q29udHJvbGxlcigKLSAgICAgIGV2ZW50X2hhbmRsZXIsIE5VTEwpKTsKLQotICBjb250cm9sbGVyLT5tZXNzYWdlX2xvb3BfID0gYXVkaW9fbWFuYWdlci0+R2V0TWVzc2FnZUxvb3AoKTsKLQotICAvLyBDcmVhdGUgYW5kIG9wZW4gYSBuZXcgYXVkaW8gaW5wdXQgc3RyZWFtIGZyb20gdGhlIGV4aXN0aW5nCi0gIC8vIGF1ZGlvLWRldmljZSB0aHJlYWQuIFVzZSB0aGUgZGVmYXVsdCBhdWRpby1pbnB1dCBkZXZpY2UuCi0gIHN0ZDo6c3RyaW5nIGRldmljZV9pZCA9IEF1ZGlvTWFuYWdlckJhc2U6OmtEZWZhdWx0RGV2aWNlSWQ7Ci0gIGlmICghY29udHJvbGxlci0+bWVzc2FnZV9sb29wXy0+UG9zdFRhc2soRlJPTV9IRVJFLAotICAgICAgICAgIGJhc2U6OkJpbmQoJkF1ZGlvSW5wdXRDb250cm9sbGVyOjpEb0NyZWF0ZSwgY29udHJvbGxlciwKLSAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoYXVkaW9fbWFuYWdlciksIHBhcmFtcywgZGV2aWNlX2lkKSkpIHsKLSAgICBjb250cm9sbGVyID0gTlVMTDsKLSAgfQotCi0gIHJldHVybiBjb250cm9sbGVyOwotfQotCi0vLyBzdGF0aWMKLXNjb3BlZF9yZWZwdHI8QXVkaW9JbnB1dENvbnRyb2xsZXI+IEF1ZGlvSW5wdXRDb250cm9sbGVyOjpDcmVhdGVMb3dMYXRlbmN5KAotICAgIEF1ZGlvTWFuYWdlciogYXVkaW9fbWFuYWdlciwKLSAgICBFdmVudEhhbmRsZXIqIGV2ZW50X2hhbmRsZXIsCi0gICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCwKLSAgICBTeW5jV3JpdGVyKiBzeW5jX3dyaXRlcikgewotICBEQ0hFQ0soYXVkaW9fbWFuYWdlcik7Ci0gIERDSEVDSyhzeW5jX3dyaXRlcik7Ci0KLSAgaWYgKCFwYXJhbXMuSXNWYWxpZCgpIHx8IChwYXJhbXMuY2hhbm5lbHMoKSA+IGtNYXhJbnB1dENoYW5uZWxzKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvLyBDcmVhdGUgdGhlIEF1ZGlvSW5wdXRDb250cm9sbGVyIG9iamVjdCBhbmQgZW5zdXJlIHRoYXQgaXQgcnVucyBvbgotICAvLyB0aGUgYXVkaW8tbWFuYWdlciB0aHJlYWQuCi0gIHNjb3BlZF9yZWZwdHI8QXVkaW9JbnB1dENvbnRyb2xsZXI+IGNvbnRyb2xsZXIobmV3IEF1ZGlvSW5wdXRDb250cm9sbGVyKAotICAgICAgZXZlbnRfaGFuZGxlciwgc3luY193cml0ZXIpKTsKLSAgY29udHJvbGxlci0+bWVzc2FnZV9sb29wXyA9IGF1ZGlvX21hbmFnZXItPkdldE1lc3NhZ2VMb29wKCk7Ci0KLSAgLy8gQ3JlYXRlIGFuZCBvcGVuIGEgbmV3IGF1ZGlvIGlucHV0IHN0cmVhbSBmcm9tIHRoZSBleGlzdGluZwotICAvLyBhdWRpby1kZXZpY2UgdGhyZWFkLiBVc2UgdGhlIHByb3ZpZGVkIGF1ZGlvLWlucHV0IGRldmljZS4KLSAgaWYgKCFjb250cm9sbGVyLT5tZXNzYWdlX2xvb3BfLT5Qb3N0VGFzayhGUk9NX0hFUkUsCi0gICAgICAgICAgYmFzZTo6QmluZCgmQXVkaW9JbnB1dENvbnRyb2xsZXI6OkRvQ3JlYXRlLCBjb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChhdWRpb19tYW5hZ2VyKSwgcGFyYW1zLCBkZXZpY2VfaWQpKSkgewotICAgIGNvbnRyb2xsZXIgPSBOVUxMOwotICB9Ci0KLSAgcmV0dXJuIGNvbnRyb2xsZXI7Ci19Ci0KLXZvaWQgQXVkaW9JbnB1dENvbnRyb2xsZXI6OlJlY29yZCgpIHsKLSAgbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soRlJPTV9IRVJFLCBiYXNlOjpCaW5kKAotICAgICAgJkF1ZGlvSW5wdXRDb250cm9sbGVyOjpEb1JlY29yZCwgdGhpcykpOwotfQotCi12b2lkIEF1ZGlvSW5wdXRDb250cm9sbGVyOjpDbG9zZShjb25zdCBiYXNlOjpDbG9zdXJlJiBjbG9zZWRfdGFzaykgewotICBEQ0hFQ0soIWNsb3NlZF90YXNrLmlzX251bGwoKSk7Ci0gIERDSEVDSyhjcmVhdG9yX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotCi0gIG1lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrQW5kUmVwbHkoCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJkF1ZGlvSW5wdXRDb250cm9sbGVyOjpEb0Nsb3NlLCB0aGlzKSwgY2xvc2VkX3Rhc2spOwotfQotCi12b2lkIEF1ZGlvSW5wdXRDb250cm9sbGVyOjpTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgewotICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzayhGUk9NX0hFUkUsIGJhc2U6OkJpbmQoCi0gICAgICAmQXVkaW9JbnB1dENvbnRyb2xsZXI6OkRvU2V0Vm9sdW1lLCB0aGlzLCB2b2x1bWUpKTsKLX0KLQotdm9pZCBBdWRpb0lucHV0Q29udHJvbGxlcjo6U2V0QXV0b21hdGljR2FpbkNvbnRyb2woYm9vbCBlbmFibGVkKSB7Ci0gIG1lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKEZST01fSEVSRSwgYmFzZTo6QmluZCgKLSAgICAgICZBdWRpb0lucHV0Q29udHJvbGxlcjo6RG9TZXRBdXRvbWF0aWNHYWluQ29udHJvbCwgdGhpcywgZW5hYmxlZCkpOwotfQotCi12b2lkIEF1ZGlvSW5wdXRDb250cm9sbGVyOjpEb0NyZWF0ZShBdWRpb01hbmFnZXIqIGF1ZGlvX21hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfaWQpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0KLSAgc3RyZWFtXyA9IGF1ZGlvX21hbmFnZXItPk1ha2VBdWRpb0lucHV0U3RyZWFtKHBhcmFtcywgZGV2aWNlX2lkKTsKLQotICBpZiAoIXN0cmVhbV8pIHsKLSAgICAvLyBUT0RPKHNhdGlzaCk6IERlZmluZSBlcnJvciB0eXBlcy4KLSAgICBoYW5kbGVyXy0+T25FcnJvcih0aGlzLCAwKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoc3RyZWFtXyAmJiAhc3RyZWFtXy0+T3BlbigpKSB7Ci0gICAgc3RyZWFtXy0+Q2xvc2UoKTsKLSAgICBzdHJlYW1fID0gTlVMTDsKLSAgICAvLyBUT0RPKHNhdGlzaCk6IERlZmluZSBlcnJvciB0eXBlcy4KLSAgICBoYW5kbGVyXy0+T25FcnJvcih0aGlzLCAwKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBEQ0hFQ0soIW5vX2RhdGFfdGltZXJfLmdldCgpKTsKLSAgLy8gQ3JlYXRlIHRoZSBkYXRhIHRpbWVyIHdoaWNoIHdpbGwgY2FsbCBEb0NoZWNrRm9yTm9EYXRhKCkuIFRoZSB0aW1lcgotICAvLyBpcyBzdGFydGVkIGluIERvUmVjb3JkKCkgYW5kIHJlc3RhcnRlZCBpbiBlYWNoIERvQ2hlY2tGb3JOb0RhdGEoKSBjYWxsYmFjay4KLSAgbm9fZGF0YV90aW1lcl8ucmVzZXQobmV3IGJhc2U6OlRpbWVyKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKGtUaW1lckluaXRpYWxJbnRlcnZhbFNlY29uZHMpLAotICAgICAgYmFzZTo6QmluZCgmQXVkaW9JbnB1dENvbnRyb2xsZXI6OkRvQ2hlY2tGb3JOb0RhdGEsCi0gICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSwgZmFsc2UpKTsKLSAgc3RhdGVfID0ga0NyZWF0ZWQ7Ci0gIGhhbmRsZXJfLT5PbkNyZWF0ZWQodGhpcyk7Ci19Ci0KLXZvaWQgQXVkaW9JbnB1dENvbnRyb2xsZXI6OkRvUmVjb3JkKCkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLQotICBpZiAoc3RhdGVfICE9IGtDcmVhdGVkKQotICAgIHJldHVybjsKLQotICB7Ci0gICAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgICBzdGF0ZV8gPSBrUmVjb3JkaW5nOwotICB9Ci0KLSAgLy8gU3RhcnQgdGhlIGRhdGEgdGltZXIuIE9uY2UgfGtUaW1lclJlc2V0SW50ZXJ2YWxTZWNvbmRzfCBoYXZlIHBhc3NlZCwKLSAgLy8gYSBjYWxsYmFjayB0byBEb0NoZWNrRm9yTm9EYXRhKCkgaXMgbWFkZS4KLSAgbm9fZGF0YV90aW1lcl8tPlJlc2V0KCk7Ci0KLSAgc3RyZWFtXy0+U3RhcnQodGhpcyk7Ci0gIGhhbmRsZXJfLT5PblJlY29yZGluZyh0aGlzKTsKLX0KLQotdm9pZCBBdWRpb0lucHV0Q29udHJvbGxlcjo6RG9DbG9zZSgpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0KLSAgLy8gRGVsZXRlIHRoZSB0aW1lciBvbiB0aGUgc2FtZSB0aHJlYWQgdGhhdCBjcmVhdGVkIGl0LgotICBub19kYXRhX3RpbWVyXy5yZXNldCgpOwotCi0gIGlmIChzdGF0ZV8gIT0ga0Nsb3NlZCkgewotICAgIERvU3RvcENsb3NlQW5kQ2xlYXJTdHJlYW0oTlVMTCk7Ci0gICAgU2V0RGF0YUlzQWN0aXZlKGZhbHNlKTsKLQotICAgIGlmIChMb3dMYXRlbmN5TW9kZSgpKSB7Ci0gICAgICBzeW5jX3dyaXRlcl8tPkNsb3NlKCk7Ci0gICAgfQotCi0gICAgc3RhdGVfID0ga0Nsb3NlZDsKLSAgfQotfQotCi12b2lkIEF1ZGlvSW5wdXRDb250cm9sbGVyOjpEb1JlcG9ydEVycm9yKGludCBjb2RlKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBoYW5kbGVyXy0+T25FcnJvcih0aGlzLCBjb2RlKTsKLX0KLQotdm9pZCBBdWRpb0lucHV0Q29udHJvbGxlcjo6RG9TZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgRENIRUNLX0dFKHZvbHVtZSwgMCk7Ci0gIERDSEVDS19MRSh2b2x1bWUsIDEuMCk7Ci0KLSAgaWYgKHN0YXRlXyAhPSBrQ3JlYXRlZCAmJiBzdGF0ZV8gIT0ga1JlY29yZGluZykKLSAgICByZXR1cm47Ci0KLSAgLy8gT25seSBhc2sgZm9yIHRoZSBtYXhpbXVtIHZvbHVtZSBhdCBmaXJzdCBjYWxsIGFuZCB1c2UgY2FjaGVkIHZhbHVlCi0gIC8vIGZvciByZW1haW5pbmcgZnVuY3Rpb24gY2FsbHMuCi0gIGlmICghbWF4X3ZvbHVtZV8pIHsKLSAgICBtYXhfdm9sdW1lXyA9IHN0cmVhbV8tPkdldE1heFZvbHVtZSgpOwotICB9Ci0KLSAgaWYgKG1heF92b2x1bWVfID09IDAuMCkgewotICAgIERMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byBhY2Nlc3MgaW5wdXQgdm9sdW1lIGNvbnRyb2wiOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFNldCB0aGUgc3RyZWFtIHZvbHVtZSBhbmQgc2NhbGUgdG8gYSByYW5nZSBtYXRjaGVkIHRvIHRoZSBwbGF0Zm9ybS4KLSAgc3RyZWFtXy0+U2V0Vm9sdW1lKG1heF92b2x1bWVfICogdm9sdW1lKTsKLX0KLQotdm9pZCBBdWRpb0lucHV0Q29udHJvbGxlcjo6RG9TZXRBdXRvbWF0aWNHYWluQ29udHJvbChib29sIGVuYWJsZWQpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIERDSEVDS19ORShzdGF0ZV8sIGtSZWNvcmRpbmcpOwotCi0gIC8vIEVuc3VyZSB0aGF0IHRoZSBBR0Mgc3RhdGUgb25seSBjYW4gYmUgbW9kaWZpZWQgYmVmb3JlIHN0cmVhbWluZyBzdGFydHMuCi0gIGlmIChzdGF0ZV8gIT0ga0NyZWF0ZWQgfHwgc3RhdGVfID09IGtSZWNvcmRpbmcpCi0gICAgcmV0dXJuOwotCi0gIHN0cmVhbV8tPlNldEF1dG9tYXRpY0dhaW5Db250cm9sKGVuYWJsZWQpOwotfQotCi12b2lkIEF1ZGlvSW5wdXRDb250cm9sbGVyOjpEb0NoZWNrRm9yTm9EYXRhKCkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLQotICBpZiAoIUdldERhdGFJc0FjdGl2ZSgpKSB7Ci0gICAgLy8gVGhlIGRhdGEtaXMtYWN0aXZlIG1hcmtlciB3aWxsIGJlIGZhbHNlIG9ubHkgaWYgaXQgaGFzIGJlZW4gbW9yZSB0aGFuCi0gICAgLy8gb25lIHNlY29uZCBzaW5jZSBhIGRhdGEgcGFja2V0IHdhcyByZWNvcmRlZC4gVGhpcyBjYW4gaGFwcGVuIGlmIGEKLSAgICAvLyBjYXB0dXJlIGRldmljZSBoYXMgYmVlbiByZW1vdmVkIG9yIGRpc2FibGVkLgotICAgIGhhbmRsZXJfLT5PbkVycm9yKHRoaXMsIDApOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIE1hcmsgZGF0YSBhcyBub24tYWN0aXZlLiBUaGUgZmxhZyB3aWxsIGJlIHJlLWVuYWJsZWQgaW4gT25EYXRhKCkgZWFjaAotICAvLyB0aW1lIGEgZGF0YSBwYWNrZXQgaXMgcmVjZWl2ZWQuIEhlbmNlLCB1bmRlciBub3JtYWwgY29uZGl0aW9ucywgdGhlCi0gIC8vIGZsYWcgd2lsbCBvbmx5IGJlIGRpc2FibGVkIGR1cmluZyBhIHZlcnkgc2hvcnQgcGVyaW9kLgotICBTZXREYXRhSXNBY3RpdmUoZmFsc2UpOwotCi0gIC8vIFJlc3RhcnQgdGhlIHRpbWVyIHRvIGVuc3VyZSB0aGF0IHdlIGNoZWNrIHRoZSBmbGFnIGFnYWluIGluCi0gIC8vIHxrVGltZXJSZXNldEludGVydmFsU2Vjb25kc3wuCi0gIG5vX2RhdGFfdGltZXJfLT5TdGFydCgKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcyhrVGltZXJSZXNldEludGVydmFsU2Vjb25kcyksCi0gICAgICBiYXNlOjpCaW5kKCZBdWRpb0lucHV0Q29udHJvbGxlcjo6RG9DaGVja0Zvck5vRGF0YSwKLSAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLX0KLQotdm9pZCBBdWRpb0lucHV0Q29udHJvbGxlcjo6T25EYXRhKEF1ZGlvSW5wdXRTdHJlYW0qIHN0cmVhbSwgY29uc3QgdWludDgqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHNpemUsIHVpbnQzMiBoYXJkd2FyZV9kZWxheV9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdm9sdW1lKSB7Ci0gIHsKLSAgICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICAgIGlmIChzdGF0ZV8gIT0ga1JlY29yZGluZykKLSAgICAgIHJldHVybjsKLSAgfQotCi0gIC8vIE1hcmsgZGF0YSBhcyBhY3RpdmUgdG8gZW5zdXJlIHRoYXQgdGhlIHBlcmlvZGljIGNhbGxzIHRvCi0gIC8vIERvQ2hlY2tGb3JOb0RhdGEoKSBkb2VzIG5vdCByZXBvcnQgYW4gZXJyb3IgdG8gdGhlIGV2ZW50IGhhbmRsZXIuCi0gIFNldERhdGFJc0FjdGl2ZSh0cnVlKTsKLQotICAvLyBVc2UgU3luY1NvY2tldCBpZiB3ZSBhcmUgaW4gYSBsb3ctbGF0ZW5jeSBtb2RlLgotICBpZiAoTG93TGF0ZW5jeU1vZGUoKSkgewotICAgIHN5bmNfd3JpdGVyXy0+V3JpdGUoZGF0YSwgc2l6ZSwgdm9sdW1lKTsKLSAgICBzeW5jX3dyaXRlcl8tPlVwZGF0ZVJlY29yZGVkQnl0ZXMoaGFyZHdhcmVfZGVsYXlfYnl0ZXMpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGhhbmRsZXJfLT5PbkRhdGEodGhpcywgZGF0YSwgc2l6ZSk7Ci19Ci0KLXZvaWQgQXVkaW9JbnB1dENvbnRyb2xsZXI6Ok9uQ2xvc2UoQXVkaW9JbnB1dFN0cmVhbSogc3RyZWFtKSB7Ci0gIERWTE9HKDEpIDw8ICJBdWRpb0lucHV0Q29udHJvbGxlcjo6T25DbG9zZSgpIjsKLSAgLy8gVE9ETyhzYXRpc2gpOiBTb21ldGltZXMgdGhlIGRldmljZSBkcml2ZXIgY2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0gd2l0aG91dAotICAvLyB1cyBhc2tpbmcgZm9yIGl0IChtYXkgYmUgaWYgdGhlIGRldmljZSB3YXMgdW5wbHVnZ2VkPykuIENoZWNrIGhvdyB0byBoYW5kbGUKLSAgLy8gc3VjaCBjYXNlcyBoZXJlLgotfQotCi12b2lkIEF1ZGlvSW5wdXRDb250cm9sbGVyOjpPbkVycm9yKEF1ZGlvSW5wdXRTdHJlYW0qIHN0cmVhbSwgaW50IGNvZGUpIHsKLSAgLy8gSGFuZGxlIGVycm9yIG9uIHRoZSBhdWRpby1tYW5hZ2VyIHRocmVhZC4KLSAgbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soRlJPTV9IRVJFLCBiYXNlOjpCaW5kKAotICAgICAgJkF1ZGlvSW5wdXRDb250cm9sbGVyOjpEb1JlcG9ydEVycm9yLCB0aGlzLCBjb2RlKSk7Ci19Ci0KLXZvaWQgQXVkaW9JbnB1dENvbnRyb2xsZXI6OkRvU3RvcENsb3NlQW5kQ2xlYXJTdHJlYW0oCi0gICAgYmFzZTo6V2FpdGFibGVFdmVudCAqZG9uZSkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLQotICAvLyBBbGxvdyBjYWxsaW5nIHVuY29uZGl0aW9uYWxseSBhbmQgYmFpbCBpZiB3ZSBkb24ndCBoYXZlIGEgc3RyZWFtIHRvIGNsb3NlLgotICBpZiAoc3RyZWFtXyAhPSBOVUxMKSB7Ci0gICAgc3RyZWFtXy0+U3RvcCgpOwotICAgIHN0cmVhbV8tPkNsb3NlKCk7Ci0gICAgc3RyZWFtXyA9IE5VTEw7Ci0gIH0KLQotICAvLyBTaG91bGQgYmUgbGFzdCBpbiB0aGUgbWV0aG9kLCBkbyBub3QgdG91Y2ggInRoaXMiIGZyb20gaGVyZSBvbi4KLSAgaWYgKGRvbmUgIT0gTlVMTCkKLSAgICBkb25lLT5TaWduYWwoKTsKLX0KLQotdm9pZCBBdWRpb0lucHV0Q29udHJvbGxlcjo6U2V0RGF0YUlzQWN0aXZlKGJvb2wgZW5hYmxlZCkgewotICBiYXNlOjpzdWJ0bGU6OlJlbGVhc2VfU3RvcmUoJmRhdGFfaXNfYWN0aXZlXywgZW5hYmxlZCk7Ci19Ci0KLWJvb2wgQXVkaW9JbnB1dENvbnRyb2xsZXI6OkdldERhdGFJc0FjdGl2ZSgpIHsKLSAgcmV0dXJuIChiYXNlOjpzdWJ0bGU6OkFjcXVpcmVfTG9hZCgmZGF0YV9pc19hY3RpdmVfKSAhPSBmYWxzZSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX2lucHV0X2NvbnRyb2xsZXIuaCBiL3NyYy9tZWRpYS9hdWRpby9hdWRpb19pbnB1dF9jb250cm9sbGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZTNlODcuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX2lucHV0X2NvbnRyb2xsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0FVRElPX0FVRElPX0lOUFVUX0NPTlRST0xMRVJfSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fQVVESU9fSU5QVVRfQ09OVFJPTExFUl9IXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgImJhc2UvYXRvbWljb3BzLmgiCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKLSNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi93YWl0YWJsZV9ldmVudC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZC5oIgotI2luY2x1ZGUgImJhc2UvdGltZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19pby5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX21hbmFnZXJfYmFzZS5oIgotCi0vLyBBbiBBdWRpb0lucHV0Q29udHJvbGxlciBjb250cm9scyBhbiBBdWRpb0lucHV0U3RyZWFtIGFuZCByZWNvcmRzIGRhdGEKLS8vIGZyb20gdGhpcyBpbnB1dCBzdHJlYW0uIFRoZSB0d28gbWFpbiBtZXRob2RzIGFyZSBSZWNvcmQoKSBhbmQgQ2xvc2UoKSBhbmQKLS8vIHRoZXkgYXJlIGJvdGggZXhlY3V0ZWQgb24gdGhlIGF1ZGlvIHRocmVhZCB3aGljaCBpcyBpbmplY3RlZCBieSB0aGUgdHdvCi0vLyBhbHRlcm5hdGl2ZSBmYWN0b3J5IG1ldGhvZHMsIENyZWF0ZSgpIG9yIENyZWF0ZUxvd0xhdGVuY3koKS4KLS8vCi0vLyBBbGwgcHVibGljIG1ldGhvZHMgb2YgQXVkaW9JbnB1dENvbnRyb2xsZXIgYXJlIG5vbi1ibG9ja2luZy4KLS8vCi0vLyBIZXJlIGlzIGEgc3RhdGUgZGlhZ3JhbSBmb3IgdGhlIEF1ZGlvSW5wdXRDb250cm9sbGVyOgotLy8KLS8vICAgICAgICAgICAgICAgICAgICAuLS0+ICBbIENsb3NlZCAvIEVycm9yIF0gIDwtLS4KLS8vICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICAgICAgICAgICAgICAgWyBDcmVhdGVkIF0gIC0tLS0tLS0tLS0+ICBbIFJlY29yZGluZyBdCi0vLyAgICAgICAgICAgICAgICAgICAgXgotLy8gICAgICAgICAgICAgICAgICAgIHwKLS8vICAgICAgICAgICAgICAqWyAgRW1wdHkgIF0KLS8vCi0vLyAqIEluaXRpYWwgc3RhdGUKLS8vCi0vLyBTdGF0ZSBzZXF1ZW5jZXMgKGFzc3VtaW5nIGxvdy1sYXRlbmN5KToKLS8vCi0vLyAgW0NyZWF0aW5nIFRocmVhZF0gICAgICAgICAgICAgICAgICAgICBbQXVkaW8gVGhyZWFkXQotLy8KLS8vICAgICAgVXNlciAgICAgICAgICAgICAgIEF1ZGlvSW5wdXRDb250cm9sbGVyICAgICAgICAgICAgICAgRXZlbnRIYW5kbGVyCi0vLyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KLS8vIENyYXRlTG93TGF0ZW5jeSgpID09PiAgICAgICAgRG9DcmVhdGUoKQotLy8gICAgICAgICAgICAgICAgICAgQXVkaW9NYW5hZ2VyOjpNYWtlQXVkaW9JbnB1dFN0cmVhbSgpCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvSW5wdXRTdHJlYW06Ok9wZW4oKQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0+ICAgT25FcnJvcigpCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlIHRoZSBkYXRhIHRpbWVyCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gIE9uQ3JlYXRlZCgpCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ3JlYXRlZAotLy8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi0vLyBSZWNvcmQoKSA9PT4gICAgICAgICAgICAgICAgIERvUmVjb3JkKCkKLS8vICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvSW5wdXRTdHJlYW06OlN0YXJ0KCkKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiAgT25SZWNvcmRpbmcoKQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IHRoZSBkYXRhIHRpbWVyCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSZWNvcmRpbmcKLS8vIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQotLy8gQ2xvc2UoKSA9PT4gICAgICAgICAgICAgICAgICBEb0Nsb3NlKCkKLS8vICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoZSBkYXRhIHRpbWVyCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlXyA9IGtDbG9zZWQKLS8vICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9JbnB1dFN0cmVhbTo6U3RvcCgpCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvSW5wdXRTdHJlYW06OkNsb3NlKCkKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICBTeW5jV3JpdGVyOjpDbG9zZSgpCi0vLyBDbG9zdXJlOjpSdW4oKSA8LS0tLS0tLS0tLS0tLS0tLS0uCi0vLyAoY2xvc3VyZS10YXNrKQotLy8KLS8vIFRoZSBhdWRpbyB0aHJlYWQgaXRzZWxmIGlzIG93bmVkIGJ5IHRoZSBBdWRpb01hbmFnZXIgdGhhdCB0aGUKLS8vIEF1ZGlvSW5wdXRDb250cm9sbGVyIGhvbGRzIGEgcmVmZXJlbmNlIHRvLiAgV2hlbiBwZXJmb3JtaW5nIHRhc2tzIG9uIHRoZQotLy8gYXVkaW8gdGhyZWFkLCB0aGUgY29udHJvbGxlciBtdXN0IG5vdCBhZGQgb3IgcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZQotLy8gQXVkaW9NYW5hZ2VyIG9yIGl0c2VsZiAoc2luY2UgaXQgaW4gdHVybiBob2xkcyBhIHJlZmVyZW5jZSB0byB0aGUgbWFuYWdlcikuCi0vLwotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgTUVESUFfRVhQT1JUIEF1ZGlvSW5wdXRDb250cm9sbGVyCi0gICAgOiBwdWJsaWMgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8QXVkaW9JbnB1dENvbnRyb2xsZXI+LAotICAgICAgcHVibGljIEF1ZGlvSW5wdXRTdHJlYW06OkF1ZGlvSW5wdXRDYWxsYmFjayB7Ci0gcHVibGljOgotICAvLyBBbiBldmVudCBoYW5kbGVyIHRoYXQgcmVjZWl2ZXMgZXZlbnRzIGZyb20gdGhlIEF1ZGlvSW5wdXRDb250cm9sbGVyLiBUaGUKLSAgLy8gZm9sbG93aW5nIG1ldGhvZHMgYXJlIGFsbCBjYWxsZWQgb24gdGhlIGF1ZGlvIHRocmVhZC4KLSAgY2xhc3MgTUVESUFfRVhQT1JUIEV2ZW50SGFuZGxlciB7Ci0gICBwdWJsaWM6Ci0gICAgdmlydHVhbCB2b2lkIE9uQ3JlYXRlZChBdWRpb0lucHV0Q29udHJvbGxlciogY29udHJvbGxlcikgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBPblJlY29yZGluZyhBdWRpb0lucHV0Q29udHJvbGxlciogY29udHJvbGxlcikgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBPbkVycm9yKEF1ZGlvSW5wdXRDb250cm9sbGVyKiBjb250cm9sbGVyLCBpbnQgZXJyb3JfY29kZSkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBPbkRhdGEoQXVkaW9JbnB1dENvbnRyb2xsZXIqIGNvbnRyb2xsZXIsIGNvbnN0IHVpbnQ4KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHNpemUpID0gMDsKLQotICAgcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkV2ZW50SGFuZGxlcigpIHt9Ci0gIH07Ci0KLSAgLy8gQSBzeW5jaHJvbm91cyB3cml0ZXIgaW50ZXJmYWNlIHVzZWQgYnkgQXVkaW9JbnB1dENvbnRyb2xsZXIgZm9yCi0gIC8vIHN5bmNocm9ub3VzIHdyaXRpbmcuCi0gIGNsYXNzIFN5bmNXcml0ZXIgewotICAgcHVibGljOgotICAgIHZpcnR1YWwgflN5bmNXcml0ZXIoKSB7fQotCi0gICAgLy8gTm90aWZ5IHRoZSBzeW5jaHJvbm91cyB3cml0ZXIgYWJvdXQgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUKLSAgICAvLyBzb3VuZGNhcmQgd2hpY2ggaGFzIGJlZW4gcmVjb3JkZWQuCi0gICAgdmlydHVhbCB2b2lkIFVwZGF0ZVJlY29yZGVkQnl0ZXModWludDMyIGJ5dGVzKSA9IDA7Ci0KLSAgICAvLyBXcml0ZSBjZXJ0YWluIGFtb3VudCBvZiBkYXRhIGZyb20gfGRhdGF8LiBUaGlzIG1ldGhvZCByZXR1cm5zCi0gICAgLy8gbnVtYmVyIG9mIHdyaXR0ZW4gYnl0ZXMuCi0gICAgdmlydHVhbCB1aW50MzIgV3JpdGUoY29uc3Qgdm9pZCogZGF0YSwgdWludDMyIHNpemUsIGRvdWJsZSB2b2x1bWUpID0gMDsKLQotICAgIC8vIENsb3NlIHRoaXMgc3luY2hyb25vdXMgd3JpdGVyLgotICAgIHZpcnR1YWwgdm9pZCBDbG9zZSgpID0gMDsKLSAgfTsKLQotICAvLyBBdWRpb0lucHV0Q29udHJvbGxlcjo6Q3JlYXRlKCkgY2FuIHVzZSB0aGUgY3VycmVudGx5IHJlZ2lzdGVyZWQgRmFjdG9yeQotICAvLyB0byBjcmVhdGUgdGhlIEF1ZGlvSW5wdXRDb250cm9sbGVyLiBGYWN0b3J5IGlzIGludGVuZGVkIGZvciB0ZXN0aW5nIG9ubHkuCi0gIGNsYXNzIEZhY3RvcnkgewotICAgcHVibGljOgotICAgIHZpcnR1YWwgQXVkaW9JbnB1dENvbnRyb2xsZXIqIENyZWF0ZShBdWRpb01hbmFnZXIqIGF1ZGlvX21hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlciogZXZlbnRfaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXJzIHBhcmFtcykgPSAwOwotICAgcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkZhY3RvcnkoKSB7fQotICB9OwotCi0gIC8vIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBBdWRpb0lucHV0Q29udHJvbGxlci4KLSAgLy8gVGhlIGF1ZGlvIGRldmljZSB3aWxsIGJlIGNyZWF0ZWQgb24gdGhlIGF1ZGlvIHRocmVhZCwgYW5kIHdoZW4gdGhhdCBpcwotICAvLyBkb25lLCB0aGUgZXZlbnQgaGFuZGxlciB3aWxsIHJlY2VpdmUgYW4gT25DcmVhdGVkKCkgY2FsbCBmcm9tIHRoYXQgc2FtZQotICAvLyB0aHJlYWQuCi0gIHN0YXRpYyBzY29wZWRfcmVmcHRyPEF1ZGlvSW5wdXRDb250cm9sbGVyPiBDcmVhdGUoCi0gICAgICBBdWRpb01hbmFnZXIqIGF1ZGlvX21hbmFnZXIsCi0gICAgICBFdmVudEhhbmRsZXIqIGV2ZW50X2hhbmRsZXIsCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcyk7Ci0KLSAgLy8gU2V0cyB0aGUgZmFjdG9yeSB1c2VkIGJ5IHRoZSBzdGF0aWMgbWV0aG9kIENyZWF0ZSgpLiBBdWRpb0lucHV0Q29udHJvbGxlcgotICAvLyBkb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiB8ZmFjdG9yeXwuIEEgdmFsdWUgb2YgTlVMTCByZXN1bHRzIGluIGFuCi0gIC8vIEF1ZGlvSW5wdXRDb250cm9sbGVyIGJlaW5nIGNyZWF0ZWQgZGlyZWN0bHkuCi0gIHN0YXRpYyB2b2lkIHNldF9mYWN0b3J5X2Zvcl90ZXN0aW5nKEZhY3RvcnkqIGZhY3RvcnkpIHsgZmFjdG9yeV8gPSBmYWN0b3J5OyB9Ci0gIEF1ZGlvSW5wdXRTdHJlYW0qIHN0cmVhbV9mb3JfdGVzdGluZygpIHsgcmV0dXJuIHN0cmVhbV87IH0KLQotICAvLyBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gQXVkaW9JbnB1dENvbnRyb2xsZXIgZm9yIGxvdy1sYXRlbmN5IG1vZGUuCi0gIC8vIFRoZSBhdWRpbyBkZXZpY2Ugd2lsbCBiZSBjcmVhdGVkIG9uIHRoZSBhdWRpbyB0aHJlYWQsIGFuZCB3aGVuIHRoYXQgaXMKLSAgLy8gZG9uZSwgdGhlIGV2ZW50IGhhbmRsZXIgd2lsbCByZWNlaXZlIGFuIE9uQ3JlYXRlZCgpIGNhbGwgZnJvbSB0aGF0IHNhbWUKLSAgLy8gdGhyZWFkLgotICBzdGF0aWMgc2NvcGVkX3JlZnB0cjxBdWRpb0lucHV0Q29udHJvbGxlcj4gQ3JlYXRlTG93TGF0ZW5jeSgKLSAgICAgIEF1ZGlvTWFuYWdlciogYXVkaW9fbWFuYWdlciwKLSAgICAgIEV2ZW50SGFuZGxlciogZXZlbnRfaGFuZGxlciwKLSAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCwKLSAgICAgIC8vIEV4dGVybmFsIHN5bmNocm9ub3VzIHdyaXRlciBmb3IgYXVkaW8gY29udHJvbGxlci4KLSAgICAgIFN5bmNXcml0ZXIqIHN5bmNfd3JpdGVyKTsKLQotICAvLyBTdGFydHMgcmVjb3JkaW5nIHVzaW5nIHRoZSBjcmVhdGVkIGF1ZGlvIGlucHV0IHN0cmVhbS4KLSAgLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIHRoZSBjcmVhdG9yIHRocmVhZC4KLSAgdmlydHVhbCB2b2lkIFJlY29yZCgpOwotCi0gIC8vIENsb3NlcyB0aGUgYXVkaW8gaW5wdXQgc3RyZWFtLiBUaGUgc3RhdGUgaXMgY2hhbmdlZCBhbmQgdGhlIHJlc291cmNlcwotICAvLyBhcmUgZnJlZWQgb24gdGhlIGF1ZGlvIHRocmVhZC4gfGNsb3NlZF90YXNrfCBpcyB0aGVuIGV4ZWN1dGVkIG9uIHRoZSB0aHJlYWQKLSAgLy8gdGhhdCBjYWxsZWQgQ2xvc2UoKS4KLSAgLy8gQ2FsbGJhY2tzIChFdmVudEhhbmRsZXIgYW5kIFN5bmNXcml0ZXIpIG11c3QgZXhpc3QgdW50aWwgfGNsb3NlZF90YXNrfAotICAvLyBpcyBjYWxsZWQuCi0gIC8vIEl0IGlzIHNhZmUgdG8gY2FsbCB0aGlzIG1ldGhvZCBtb3JlIHRoYW4gb25jZS4gQ2FsbHMgYWZ0ZXIgdGhlIGZpcnN0IG9uZQotICAvLyB3aWxsIGhhdmUgbm8gZWZmZWN0LgotICAvLyBUaGlzIG1ldGhvZCB0cmFtcG9saW5lcyB0byB0aGUgYXVkaW8gdGhyZWFkLgotICB2aXJ0dWFsIHZvaWQgQ2xvc2UoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2xvc2VkX3Rhc2spOwotCi0gIC8vIFNldHMgdGhlIGNhcHR1cmUgdm9sdW1lIG9mIHRoZSBpbnB1dCBzdHJlYW0uIFRoZSB2YWx1ZSAwLjAgY29ycmVzcG9uZHMKLSAgLy8gdG8gbXV0ZWQgYW5kIDEuMCB0byBtYXhpbXVtIHZvbHVtZS4KLSAgdmlydHVhbCB2b2lkIFNldFZvbHVtZShkb3VibGUgdm9sdW1lKTsKLQotICAvLyBTZXRzIHRoZSBBdXRvbWF0aWMgR2FpbiBDb250cm9sIChBR0MpIHN0YXRlIG9mIHRoZSBpbnB1dCBzdHJlYW0uCi0gIC8vIENoYW5naW5nIHRoZSBBR0Mgc3RhdGUgaXMgbm90IHN1cHBvcnRlZCB3aGlsZSByZWNvcmRpbmcgaXMgYWN0aXZlLgotICB2aXJ0dWFsIHZvaWQgU2V0QXV0b21hdGljR2FpbkNvbnRyb2woYm9vbCBlbmFibGVkKTsKLQotICAvLyBBdWRpb0lucHV0Q2FsbGJhY2sgaW1wbGVtZW50YXRpb24uIFRocmVhZGluZyBkZXRhaWxzIGRlcGVuZHMgb24gdGhlCi0gIC8vIGRldmljZS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4KLSAgdmlydHVhbCB2b2lkIE9uRGF0YShBdWRpb0lucHV0U3RyZWFtKiBzdHJlYW0sIGNvbnN0IHVpbnQ4KiBzcmMsIHVpbnQzMiBzaXplLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBoYXJkd2FyZV9kZWxheV9ieXRlcywgZG91YmxlIHZvbHVtZSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBPbkNsb3NlKEF1ZGlvSW5wdXRTdHJlYW0qIHN0cmVhbSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBPbkVycm9yKEF1ZGlvSW5wdXRTdHJlYW0qIHN0cmVhbSwgaW50IGNvZGUpIE9WRVJSSURFOwotCi0gIGJvb2wgTG93TGF0ZW5jeU1vZGUoKSBjb25zdCB7IHJldHVybiBzeW5jX3dyaXRlcl8gIT0gTlVMTDsgfQotCi0gcHJvdGVjdGVkOgotICBmcmllbmQgY2xhc3MgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8QXVkaW9JbnB1dENvbnRyb2xsZXI+OwotCi0gIC8vIEludGVybmFsIHN0YXRlIG9mIHRoZSBzb3VyY2UuCi0gIGVudW0gU3RhdGUgewotICAgIGtFbXB0eSwKLSAgICBrQ3JlYXRlZCwKLSAgICBrUmVjb3JkaW5nLAotICAgIGtDbG9zZWQsCi0gICAga0Vycm9yCi0gIH07Ci0KLSAgQXVkaW9JbnB1dENvbnRyb2xsZXIoRXZlbnRIYW5kbGVyKiBoYW5kbGVyLCBTeW5jV3JpdGVyKiBzeW5jX3dyaXRlcik7Ci0gIHZpcnR1YWwgfkF1ZGlvSW5wdXRDb250cm9sbGVyKCk7Ci0KLSAgLy8gTWV0aG9kcyBjYWxsZWQgb24gdGhlIGF1ZGlvIHRocmVhZCAob3duZWQgYnkgdGhlIEF1ZGlvTWFuYWdlcikuCi0gIHZvaWQgRG9DcmVhdGUoQXVkaW9NYW5hZ2VyKiBhdWRpb19tYW5hZ2VyLCBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2lkKTsKLSAgdm9pZCBEb1JlY29yZCgpOwotICB2b2lkIERvQ2xvc2UoKTsKLSAgdm9pZCBEb1JlcG9ydEVycm9yKGludCBjb2RlKTsKLSAgdm9pZCBEb1NldFZvbHVtZShkb3VibGUgdm9sdW1lKTsKLSAgdm9pZCBEb1NldEF1dG9tYXRpY0dhaW5Db250cm9sKGJvb2wgZW5hYmxlZCk7Ci0KLSAgLy8gTWV0aG9kIHdoaWNoIGVuc3VyZXMgdGhhdCBPbkVycm9yKCkgaXMgdHJpZ2dlcmVkIHdoZW4gZGF0YSByZWNvcmRpbmcKLSAgLy8gdGltZXMgb3V0LiBDYWxsZWQgb24gdGhlIGF1ZGlvIHRocmVhZC4KLSAgdm9pZCBEb0NoZWNrRm9yTm9EYXRhKCk7Ci0KLSAgLy8gSGVscGVyIG1ldGhvZCB0aGF0IHN0b3BzLCBjbG9zZXMsIGFuZCBOVUxMOnMgfCpzdHJlYW1ffC4KLSAgLy8gU2lnbmFscyBldmVudCB3aGVuIGRvbmUgaWYgdGhlIGV2ZW50IGlzIG5vdCBOVUxMLgotICB2b2lkIERvU3RvcENsb3NlQW5kQ2xlYXJTdHJlYW0oYmFzZTo6V2FpdGFibGVFdmVudCogZG9uZSk7Ci0KLSAgdm9pZCBTZXREYXRhSXNBY3RpdmUoYm9vbCBlbmFibGVkKTsKLSAgYm9vbCBHZXREYXRhSXNBY3RpdmUoKTsKLQotICAvLyBHaXZlcyBhY2Nlc3MgdG8gdGhlIG1lc3NhZ2UgbG9vcCBvZiB0aGUgY3JlYXRpbmcgdGhyZWFkLgotICBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+IGNyZWF0b3JfbG9vcF87Ci0KLSAgLy8gVGhlIG1lc3NhZ2UgbG9vcCBvZiBhdWRpby1tYW5hZ2VyIHRocmVhZCB0aGF0IHRoaXMgb2JqZWN0IHJ1bnMgb24uCi0gIHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4gbWVzc2FnZV9sb29wXzsKLQotICAvLyBDb250YWlucyB0aGUgQXVkaW9JbnB1dENvbnRyb2xsZXI6OkV2ZW50SGFuZGxlciB3aGljaCByZWNlaXZlcyBzdGF0ZQotICAvLyBub3RpZmljYXRpb25zIGZyb20gdGhpcyBjbGFzcy4KLSAgRXZlbnRIYW5kbGVyKiBoYW5kbGVyXzsKLQotICAvLyBQb2ludGVyIHRvIHRoZSBhdWRpbyBpbnB1dCBzdHJlYW0gb2JqZWN0LgotICBBdWRpb0lucHV0U3RyZWFtKiBzdHJlYW1fOwotCi0gIC8vIHxub19kYXRhX3RpbWVyX3wgaXMgdXNlZCB0byBjYWxsIE9uRXJyb3IoKSB3aGVuIHdlIHN0b3AgcmVjZWl2aW5nCi0gIC8vIE9uRGF0YSgpIGNhbGxzIHdpdGhvdXQgYW4gT25DbG9zZSgpIGNhbGwuIFRoaXMgY2FuIG9jY3VyCi0gIC8vIHdoZW4gYW4gYXVkaW8gaW5wdXQgZGV2aWNlIGlzIHVucGx1Z2dlZCB3aGlsc3QgcmVjb3JkaW5nIG9uIFdpbmRvd3MuCi0gIC8vIFNlZSBodHRwOi8vY3JidWcuY29tLzc5OTM2IGZvciBkZXRhaWxzLgotICAvLyBUaGlzIG1lbWJlciBpcyBvbmx5IHRvdWNoZWQgYnkgdGhlIGF1ZGlvIHRocmVhZC4KLSAgc2NvcGVkX3B0cjxiYXNlOjpUaW1lcj4gbm9fZGF0YV90aW1lcl87Ci0KLSAgLy8gVGhpcyBmbGFnIGlzIHVzZWQgdG8gc2lnbmFsIHRoYXQgd2UgYXJlIHJlY2VpdmluZyBPbkRhdGEoKSBjYWxscywgaS5lLAotICAvLyB0aGF0IGRhdGEgaXMgYWN0aXZlLiBJdCBjYW4gYmUgdG91Y2hlZCBieSB0aGUgYXVkaW8gdGhyZWFkIGFuZCBieSB0aGUKLSAgLy8gbG93LWxldmVsIGF1ZGlvIHRocmVhZCB3aGljaCBjYWxscyBPbkRhdGEoKS4gRS5nLiBvbiBXaW5kb3dzLCB0aGUKLSAgLy8gbG93LWxldmVsIGF1ZGlvIHRocmVhZCBpcyBjYWxsZWQgd2FzYXBpX2NhcHR1cmVfdGhyZWFkLgotICBiYXNlOjpzdWJ0bGU6OkF0b21pYzMyIGRhdGFfaXNfYWN0aXZlXzsKLQotICAvLyB8c3RhdGVffCBpcyB3cml0dGVuIG9uIHRoZSBhdWRpbyB0aHJlYWQgYW5kIGlzIHJlYWQgb24gdGhlIGhhcmR3YXJlIGF1ZGlvCi0gIC8vIHRocmVhZC4gVGhlc2Ugb3BlcmF0aW9ucyBuZWVkIHRvIGJlIGxvY2tlZC4gQnV0IGxvY2sgaXMgbm90IHJlcXVpcmVkIGZvcgotICAvLyByZWFkaW5nIG9uIHRoZSBhdWRpbyBpbnB1dCBjb250cm9sbGVyIHRocmVhZC4KLSAgU3RhdGUgc3RhdGVfOwotCi0gIGJhc2U6OkxvY2sgbG9ja187Ci0KLSAgLy8gU3luY1dyaXRlciBpcyB1c2VkIG9ubHkgaW4gbG93LWxhdGVuY3kgbW9kZSBmb3Igc3luY2hyb25vdXMgd3JpdGluZy4KLSAgU3luY1dyaXRlciogc3luY193cml0ZXJfOwotCi0gIHN0YXRpYyBGYWN0b3J5KiBmYWN0b3J5XzsKLQotICBkb3VibGUgbWF4X3ZvbHVtZV87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEF1ZGlvSW5wdXRDb250cm9sbGVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0FVRElPX0FVRElPX0lOUFVUX0NPTlRST0xMRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb19pbnB1dF9jb250cm9sbGVyX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX2lucHV0X2NvbnRyb2xsZXJfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMmEzOWIuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX2lucHV0X2NvbnRyb2xsZXJfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wLmgiCi0jaW5jbHVkZSAiYmFzZS9zeW5jaHJvbml6YXRpb24vd2FpdGFibGVfZXZlbnQuaCIKLSNpbmNsdWRlICJiYXNlL3Rlc3QvdGVzdF90aW1lb3V0cy5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX2lucHV0X2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgOjp0ZXN0aW5nOjpfOwotdXNpbmcgOjp0ZXN0aW5nOjpBdExlYXN0OwotdXNpbmcgOjp0ZXN0aW5nOjpFeGFjdGx5OwotdXNpbmcgOjp0ZXN0aW5nOjpJbnZva2VXaXRob3V0QXJnczsKLXVzaW5nIDo6dGVzdGluZzo6Tm90TnVsbDsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotc3RhdGljIGNvbnN0IGludCBrU2FtcGxlUmF0ZSA9IEF1ZGlvUGFyYW1ldGVyczo6a0F1ZGlvQ0RTYW1wbGVSYXRlOwotc3RhdGljIGNvbnN0IGludCBrQml0c1BlclNhbXBsZSA9IDE2Owotc3RhdGljIGNvbnN0IENoYW5uZWxMYXlvdXQga0NoYW5uZWxMYXlvdXQgPSBDSEFOTkVMX0xBWU9VVF9TVEVSRU87Ci1zdGF0aWMgY29uc3QgaW50IGtTYW1wbGVzUGVyUGFja2V0ID0ga1NhbXBsZVJhdGUgLyAxMDsKLQotLy8gUG9zdHMgTWVzc2FnZUxvb3A6OlF1aXRDbG9zdXJlKCkgb24gc3BlY2lmaWVkIG1lc3NhZ2UgbG9vcC4KLUFDVElPTl9QKFF1aXRNZXNzYWdlTG9vcCwgbG9vcF9vcl9wcm94eSkgewotICBsb29wX29yX3Byb3h5LT5Qb3N0VGFzayhGUk9NX0hFUkUsIE1lc3NhZ2VMb29wOjpRdWl0Q2xvc3VyZSgpKTsKLX0KLQotLy8gUG9zdHMgTWVzc2FnZUxvb3A6OlF1aXRDbG9zdXJlKCkgb24gc3BlY2lmaWVkIG1lc3NhZ2UgbG9vcCBhZnRlciBhIGNlcnRhaW4KLS8vIG51bWJlciBvZiBjYWxscyBnaXZlbiBieSB8bGltaXR8LgotQUNUSU9OX1AzKENoZWNrQ291bnRBbmRQb3N0UXVpdFRhc2ssIGNvdW50LCBsaW1pdCwgbG9vcF9vcl9wcm94eSkgewotICBpZiAoKysqY291bnQgPj0gbGltaXQpIHsKLSAgICBsb29wX29yX3Byb3h5LT5Qb3N0VGFzayhGUk9NX0hFUkUsIE1lc3NhZ2VMb29wOjpRdWl0Q2xvc3VyZSgpKTsKLSAgfQotfQotCi0vLyBDbG9zZXMgQXVkaW9PdXRwdXRDb250cm9sbGVyIHN5bmNocm9ub3VzbHkuCi1zdGF0aWMgdm9pZCBDbG9zZUF1ZGlvQ29udHJvbGxlcihBdWRpb0lucHV0Q29udHJvbGxlciogY29udHJvbGxlcikgewotICBjb250cm9sbGVyLT5DbG9zZShNZXNzYWdlTG9vcDo6UXVpdENsb3N1cmUoKSk7Ci0gIE1lc3NhZ2VMb29wOjpjdXJyZW50KCktPlJ1bigpOwotfQotCi1jbGFzcyBNb2NrQXVkaW9JbnB1dENvbnRyb2xsZXJFdmVudEhhbmRsZXIKLSAgICA6IHB1YmxpYyBBdWRpb0lucHV0Q29udHJvbGxlcjo6RXZlbnRIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vY2tBdWRpb0lucHV0Q29udHJvbGxlckV2ZW50SGFuZGxlcigpIHt9Ci0KLSAgTU9DS19NRVRIT0QxKE9uQ3JlYXRlZCwgdm9pZChBdWRpb0lucHV0Q29udHJvbGxlciogY29udHJvbGxlcikpOwotICBNT0NLX01FVEhPRDEoT25SZWNvcmRpbmcsIHZvaWQoQXVkaW9JbnB1dENvbnRyb2xsZXIqIGNvbnRyb2xsZXIpKTsKLSAgTU9DS19NRVRIT0QyKE9uRXJyb3IsIHZvaWQoQXVkaW9JbnB1dENvbnRyb2xsZXIqIGNvbnRyb2xsZXIsIGludCBlcnJvcl9jb2RlKSk7Ci0gIE1PQ0tfTUVUSE9EMyhPbkRhdGEsIHZvaWQoQXVkaW9JbnB1dENvbnRyb2xsZXIqIGNvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIGRhdGEsIHVpbnQzMiBzaXplKSk7Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTW9ja0F1ZGlvSW5wdXRDb250cm9sbGVyRXZlbnRIYW5kbGVyKTsKLX07Ci0KLS8vIFRlc3QgZml4dHVyZS4KLWNsYXNzIEF1ZGlvSW5wdXRDb250cm9sbGVyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gIEF1ZGlvSW5wdXRDb250cm9sbGVyVGVzdCgpIHt9Ci0gIHZpcnR1YWwgfkF1ZGlvSW5wdXRDb250cm9sbGVyVGVzdCgpIHt9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIE1lc3NhZ2VMb29wIG1lc3NhZ2VfbG9vcF87Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQXVkaW9JbnB1dENvbnRyb2xsZXJUZXN0KTsKLX07Ci0KLS8vIFRlc3QgQXVkaW9JbnB1dENvbnRyb2xsZXIgZm9yIGNyZWF0ZSBhbmQgY2xvc2Ugd2l0aG91dCByZWNvcmRpbmcgYXVkaW8uCi1URVNUX0YoQXVkaW9JbnB1dENvbnRyb2xsZXJUZXN0LCBDcmVhdGVBbmRDbG9zZSkgewotICBNb2NrQXVkaW9JbnB1dENvbnRyb2xsZXJFdmVudEhhbmRsZXIgZXZlbnRfaGFuZGxlcjsKLQotICAvLyBPbkNyZWF0ZWQoKSB3aWxsIGJlIHBvc3RlZCBvbmNlLgotICBFWFBFQ1RfQ0FMTChldmVudF9oYW5kbGVyLCBPbkNyZWF0ZWQoTm90TnVsbCgpKSkKLSAgICAgIC5XaWxsT25jZShRdWl0TWVzc2FnZUxvb3AoJm1lc3NhZ2VfbG9vcF8pKTsKLQotICBzY29wZWRfcHRyPEF1ZGlvTWFuYWdlcj4gYXVkaW9fbWFuYWdlcihBdWRpb01hbmFnZXI6OkNyZWF0ZSgpKTsKLSAgQXVkaW9QYXJhbWV0ZXJzIHBhcmFtcyhBdWRpb1BhcmFtZXRlcnM6OkFVRElPX0ZBS0UsIGtDaGFubmVsTGF5b3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGtTYW1wbGVSYXRlLCBrQml0c1BlclNhbXBsZSwga1NhbXBsZXNQZXJQYWNrZXQpOwotICBzY29wZWRfcmVmcHRyPEF1ZGlvSW5wdXRDb250cm9sbGVyPiBjb250cm9sbGVyID0KLSAgICAgIEF1ZGlvSW5wdXRDb250cm9sbGVyOjpDcmVhdGUoYXVkaW9fbWFuYWdlci5nZXQoKSwgJmV2ZW50X2hhbmRsZXIsIHBhcmFtcyk7Ci0gIEFTU0VSVF9UUlVFKGNvbnRyb2xsZXIuZ2V0KCkpOwotCi0gIC8vIFdhaXQgZm9yIE9uQ3JlYXRlZCgpIHRvIGZpcmUuCi0gIG1lc3NhZ2VfbG9vcF8uUnVuKCk7Ci0KLSAgLy8gQ2xvc2UgdGhlIEF1ZGlvSW5wdXRDb250cm9sbGVyIHN5bmNocm9ub3VzbHkuCi0gIENsb3NlQXVkaW9Db250cm9sbGVyKGNvbnRyb2xsZXIpOwotfQotCi0vLyBUZXN0IGEgbm9ybWFsIGNhbGwgc2VxdWVuY2Ugb2YgY3JlYXRlLCByZWNvcmQgYW5kIGNsb3NlLgotVEVTVF9GKEF1ZGlvSW5wdXRDb250cm9sbGVyVGVzdCwgUmVjb3JkQW5kQ2xvc2UpIHsKLSAgTW9ja0F1ZGlvSW5wdXRDb250cm9sbGVyRXZlbnRIYW5kbGVyIGV2ZW50X2hhbmRsZXI7Ci0gIGludCBjb3VudCA9IDA7Ci0KLSAgLy8gT25DcmVhdGVkKCkgd2lsbCBiZSBjYWxsZWQgb25jZS4KLSAgRVhQRUNUX0NBTEwoZXZlbnRfaGFuZGxlciwgT25DcmVhdGVkKE5vdE51bGwoKSkpCi0gICAgICAuVGltZXMoRXhhY3RseSgxKSk7Ci0KLSAgLy8gT25SZWNvcmRpbmcoKSB3aWxsIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0gIEVYUEVDVF9DQUxMKGV2ZW50X2hhbmRsZXIsIE9uUmVjb3JkaW5nKE5vdE51bGwoKSkpCi0gICAgICAuVGltZXMoRXhhY3RseSgxKSk7Ci0KLSAgLy8gT25EYXRhKCkgc2hhbGwgYmUgY2FsbGVkIHRlbiB0aW1lcy4KLSAgRVhQRUNUX0NBTEwoZXZlbnRfaGFuZGxlciwgT25EYXRhKE5vdE51bGwoKSwgTm90TnVsbCgpLCBfKSkKLSAgICAgIC5UaW1lcyhBdExlYXN0KDEwKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShDaGVja0NvdW50QW5kUG9zdFF1aXRUYXNrKCZjb3VudCwgMTAsCi0gICAgICAgICAgbWVzc2FnZV9sb29wXy5tZXNzYWdlX2xvb3BfcHJveHkoKSkpOwotCi0gIHNjb3BlZF9wdHI8QXVkaW9NYW5hZ2VyPiBhdWRpb19tYW5hZ2VyKEF1ZGlvTWFuYWdlcjo6Q3JlYXRlKCkpOwotICBBdWRpb1BhcmFtZXRlcnMgcGFyYW1zKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fRkFLRSwga0NoYW5uZWxMYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAga1NhbXBsZVJhdGUsIGtCaXRzUGVyU2FtcGxlLCBrU2FtcGxlc1BlclBhY2tldCk7Ci0KLSAgLy8gQ3JlYXRpbmcgdGhlIEF1ZGlvSW5wdXRDb250cm9sbGVyIHNob3VsZCByZW5kZXIgYW4gT25DcmVhdGVkKCkgY2FsbC4KLSAgc2NvcGVkX3JlZnB0cjxBdWRpb0lucHV0Q29udHJvbGxlcj4gY29udHJvbGxlciA9Ci0gICAgICBBdWRpb0lucHV0Q29udHJvbGxlcjo6Q3JlYXRlKGF1ZGlvX21hbmFnZXIuZ2V0KCksICZldmVudF9oYW5kbGVyLCBwYXJhbXMpOwotICBBU1NFUlRfVFJVRShjb250cm9sbGVyLmdldCgpKTsKLQotICAvLyBTdGFydCByZWNvcmRpbmcgYW5kIHRyaWdnZXIgb25lIE9uUmVjb3JkaW5nKCkgY2FsbC4KLSAgY29udHJvbGxlci0+UmVjb3JkKCk7Ci0KLSAgLy8gUmVjb3JkIGFuZCB3YWl0IHVudGlsIHRlbiBPbkRhdGEoKSBjYWxsYmFja3MgYXJlIHJlY2VpdmVkLgotICBtZXNzYWdlX2xvb3BfLlJ1bigpOwotCi0gIC8vIENsb3NlIHRoZSBBdWRpb0lucHV0Q29udHJvbGxlciBzeW5jaHJvbm91c2x5LgotICBDbG9zZUF1ZGlvQ29udHJvbGxlcihjb250cm9sbGVyKTsKLX0KLQotLy8gVGVzdCB0aGF0IHRoZSBBdWRpb0lucHV0Q29udHJvbGxlciByZXBvcnRzIGFuIGVycm9yIHdoZW4gdGhlIGlucHV0IHN0cmVhbQotLy8gc3RvcHMgd2l0aG91dCBhbiBPbkNsb3NlKCkgY2FsbGJhY2suIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZSB1bmRlcmx5aW5nCi0vLyBhdWRpbyBsYXllciBzdG9wcyBmZWVkaW5nIGRhdGEgYXMgYSByZXN1bHQgb2YgYSByZW1vdmVkIG1pY3JvcGhvbmUgZGV2aWNlLgotVEVTVF9GKEF1ZGlvSW5wdXRDb250cm9sbGVyVGVzdCwgUmVjb3JkQW5kRXJyb3IpIHsKLSAgTW9ja0F1ZGlvSW5wdXRDb250cm9sbGVyRXZlbnRIYW5kbGVyIGV2ZW50X2hhbmRsZXI7Ci0gIGludCBjb3VudCA9IDA7Ci0KLSAgLy8gT25DcmVhdGVkKCkgd2lsbCBiZSBjYWxsZWQgb25jZS4KLSAgRVhQRUNUX0NBTEwoZXZlbnRfaGFuZGxlciwgT25DcmVhdGVkKE5vdE51bGwoKSkpCi0gICAgICAuVGltZXMoRXhhY3RseSgxKSk7Ci0KLSAgLy8gT25SZWNvcmRpbmcoKSB3aWxsIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0gIEVYUEVDVF9DQUxMKGV2ZW50X2hhbmRsZXIsIE9uUmVjb3JkaW5nKE5vdE51bGwoKSkpCi0gICAgICAuVGltZXMoRXhhY3RseSgxKSk7Ci0KLSAgLy8gT25EYXRhKCkgc2hhbGwgYmUgY2FsbGVkIHRlbiB0aW1lcy4KLSAgRVhQRUNUX0NBTEwoZXZlbnRfaGFuZGxlciwgT25EYXRhKE5vdE51bGwoKSwgTm90TnVsbCgpLCBfKSkKLSAgICAgIC5UaW1lcyhBdExlYXN0KDEwKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShDaGVja0NvdW50QW5kUG9zdFF1aXRUYXNrKCZjb3VudCwgMTAsCi0gICAgICAgICAgbWVzc2FnZV9sb29wXy5tZXNzYWdlX2xvb3BfcHJveHkoKSkpOwotCi0gIC8vIE9uRXJyb3IoKSB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgZGF0YSBzdHJlYW0gc3RvcHMgd2hpbGUgdGhlCi0gIC8vIGNvbnRyb2xsZXIgaXMgaW4gYSByZWNvcmRpbmcgc3RhdGUuCi0gIEVYUEVDVF9DQUxMKGV2ZW50X2hhbmRsZXIsIE9uRXJyb3IoTm90TnVsbCgpLCAwKSkKLSAgICAgIC5UaW1lcyhFeGFjdGx5KDEpKQotICAgICAgLldpbGxPbmNlKFF1aXRNZXNzYWdlTG9vcCgmbWVzc2FnZV9sb29wXykpOwotCi0gIHNjb3BlZF9wdHI8QXVkaW9NYW5hZ2VyPiBhdWRpb19tYW5hZ2VyKEF1ZGlvTWFuYWdlcjo6Q3JlYXRlKCkpOwotICBBdWRpb1BhcmFtZXRlcnMgcGFyYW1zKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fRkFLRSwga0NoYW5uZWxMYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAga1NhbXBsZVJhdGUsIGtCaXRzUGVyU2FtcGxlLCBrU2FtcGxlc1BlclBhY2tldCk7Ci0KLSAgLy8gQ3JlYXRpbmcgdGhlIEF1ZGlvSW5wdXRDb250cm9sbGVyIHNob3VsZCByZW5kZXIgYW4gT25DcmVhdGVkKCkgY2FsbC4KLSAgc2NvcGVkX3JlZnB0cjxBdWRpb0lucHV0Q29udHJvbGxlcj4gY29udHJvbGxlciA9Ci0gICAgICBBdWRpb0lucHV0Q29udHJvbGxlcjo6Q3JlYXRlKGF1ZGlvX21hbmFnZXIuZ2V0KCksICZldmVudF9oYW5kbGVyLCBwYXJhbXMpOwotICBBU1NFUlRfVFJVRShjb250cm9sbGVyLmdldCgpKTsKLQotICAvLyBTdGFydCByZWNvcmRpbmcgYW5kIHRyaWdnZXIgb25lIE9uUmVjb3JkaW5nKCkgY2FsbC4KLSAgY29udHJvbGxlci0+UmVjb3JkKCk7Ci0KLSAgLy8gUmVjb3JkIGFuZCB3YWl0IHVudGlsIHRlbiBPbkRhdGEoKSBjYWxsYmFja3MgYXJlIHJlY2VpdmVkLgotICBtZXNzYWdlX2xvb3BfLlJ1bigpOwotCi0gIC8vIFN0b3AgdGhlIHN0cmVhbSBhbmQgdmVyaWZ5IHRoYXQgT25FcnJvcigpIGlzIHBvc3RlZC4KLSAgQXVkaW9JbnB1dFN0cmVhbSogc3RyZWFtID0gY29udHJvbGxlci0+c3RyZWFtX2Zvcl90ZXN0aW5nKCk7Ci0gIHN0cmVhbS0+U3RvcCgpOwotICBtZXNzYWdlX2xvb3BfLlJ1bigpOwotCi0gIC8vIENsb3NlIHRoZSBBdWRpb0lucHV0Q29udHJvbGxlciBzeW5jaHJvbm91c2x5LgotICBDbG9zZUF1ZGlvQ29udHJvbGxlcihjb250cm9sbGVyKTsKLX0KLQotLy8gVGVzdCB0aGF0IEF1ZGlvSW5wdXRDb250cm9sbGVyIHJlamVjdHMgaW5zYW5lbHkgbGFyZ2UgcGFja2V0IHNpemVzLgotVEVTVF9GKEF1ZGlvSW5wdXRDb250cm9sbGVyVGVzdCwgU2FtcGxlc1BlclBhY2tldFRvb0xhcmdlKSB7Ci0gIC8vIENyZWF0ZSBhbiBhdWRpbyBkZXZpY2Ugd2l0aCBhIHZlcnkgbGFyZ2UgcGFja2V0IHNpemUuCi0gIE1vY2tBdWRpb0lucHV0Q29udHJvbGxlckV2ZW50SGFuZGxlciBldmVudF9oYW5kbGVyOwotCi0gIC8vIE9uQ3JlYXRlZCgpIHNoYWxsIG5vdCBiZSBjYWxsZWQgaW4gdGhpcyB0ZXN0LgotICBFWFBFQ1RfQ0FMTChldmVudF9oYW5kbGVyLCBPbkNyZWF0ZWQoTm90TnVsbCgpKSkKLSAgICAuVGltZXMoRXhhY3RseSgwKSk7Ci0KLSAgc2NvcGVkX3B0cjxBdWRpb01hbmFnZXI+IGF1ZGlvX21hbmFnZXIoQXVkaW9NYW5hZ2VyOjpDcmVhdGUoKSk7Ci0gIEF1ZGlvUGFyYW1ldGVycyBwYXJhbXMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19GQUtFLCBrQ2hhbm5lbExheW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBrU2FtcGxlUmF0ZSwga0JpdHNQZXJTYW1wbGUsIGtTYW1wbGVzUGVyUGFja2V0ICogMTAwMCk7Ci0gIHNjb3BlZF9yZWZwdHI8QXVkaW9JbnB1dENvbnRyb2xsZXI+IGNvbnRyb2xsZXIgPQotICAgICAgQXVkaW9JbnB1dENvbnRyb2xsZXI6OkNyZWF0ZShhdWRpb19tYW5hZ2VyLmdldCgpLCAmZXZlbnRfaGFuZGxlciwgcGFyYW1zKTsKLSAgQVNTRVJUX0ZBTFNFKGNvbnRyb2xsZXIpOwotfQotCi0vLyBUZXN0IGNhbGxpbmcgQXVkaW9JbnB1dENvbnRyb2xsZXI6OkNsb3NlIG11bHRpcGxlIHRpbWVzLgotVEVTVF9GKEF1ZGlvSW5wdXRDb250cm9sbGVyVGVzdCwgQ2xvc2VUd2ljZSkgewotICBNb2NrQXVkaW9JbnB1dENvbnRyb2xsZXJFdmVudEhhbmRsZXIgZXZlbnRfaGFuZGxlcjsKLQotICAvLyBPblJlY29yZGluZygpIHdpbGwgYmUgY2FsbGVkIG9ubHkgb25jZS4KLSAgRVhQRUNUX0NBTEwoZXZlbnRfaGFuZGxlciwgT25DcmVhdGVkKE5vdE51bGwoKSkpOwotCi0gIC8vIE9uUmVjb3JkaW5nKCkgd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlLgotICBFWFBFQ1RfQ0FMTChldmVudF9oYW5kbGVyLCBPblJlY29yZGluZyhOb3ROdWxsKCkpKQotICAgICAgLlRpbWVzKEV4YWN0bHkoMSkpOwotCi0gIHNjb3BlZF9wdHI8QXVkaW9NYW5hZ2VyPiBhdWRpb19tYW5hZ2VyKEF1ZGlvTWFuYWdlcjo6Q3JlYXRlKCkpOwotICBBdWRpb1BhcmFtZXRlcnMgcGFyYW1zKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fRkFLRSwga0NoYW5uZWxMYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAga1NhbXBsZVJhdGUsIGtCaXRzUGVyU2FtcGxlLCBrU2FtcGxlc1BlclBhY2tldCk7Ci0gIHNjb3BlZF9yZWZwdHI8QXVkaW9JbnB1dENvbnRyb2xsZXI+IGNvbnRyb2xsZXIgPQotICAgICAgQXVkaW9JbnB1dENvbnRyb2xsZXI6OkNyZWF0ZShhdWRpb19tYW5hZ2VyLmdldCgpLCAmZXZlbnRfaGFuZGxlciwgcGFyYW1zKTsKLSAgQVNTRVJUX1RSVUUoY29udHJvbGxlci5nZXQoKSk7Ci0KLSAgY29udHJvbGxlci0+UmVjb3JkKCk7Ci0KLSAgY29udHJvbGxlci0+Q2xvc2UoTWVzc2FnZUxvb3A6OlF1aXRDbG9zdXJlKCkpOwotICBNZXNzYWdlTG9vcDo6Y3VycmVudCgpLT5SdW4oKTsKLQotICBjb250cm9sbGVyLT5DbG9zZShNZXNzYWdlTG9vcDo6UXVpdENsb3N1cmUoKSk7Ci0gIE1lc3NhZ2VMb29wOjpjdXJyZW50KCktPlJ1bigpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb19pbnB1dF9kZXZpY2UuY2MgYi9zcmMvbWVkaWEvYXVkaW8vYXVkaW9faW5wdXRfZGV2aWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWRmNmRiLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb19pbnB1dF9kZXZpY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX2lucHV0X2RldmljZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfcmVzdHJpY3Rpb25zLmgiCi0jaW5jbHVkZSAiYmFzZS90aW1lLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fbWFuYWdlcl9iYXNlLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19idXMuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gVGFrZXMgY2FyZSBvZiBpbnZva2luZyB0aGUgY2FwdHVyZSBjYWxsYmFjayBvbiB0aGUgYXVkaW8gdGhyZWFkLgotLy8gQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBjcmVhdGVkIGZvciBlYWNoIGNhcHR1cmUgc3RyZWFtIGluCi0vLyBPbkxvd0xhdGVuY3lDcmVhdGVkKCkuCi1jbGFzcyBBdWRpb0lucHV0RGV2aWNlOjpBdWRpb1RocmVhZENhbGxiYWNrCi0gICAgOiBwdWJsaWMgQXVkaW9EZXZpY2VUaHJlYWQ6OkNhbGxiYWNrIHsKLSBwdWJsaWM6Ci0gIEF1ZGlvVGhyZWFkQ2FsbGJhY2soY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBhdWRpb19wYXJhbWV0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlNoYXJlZE1lbW9yeUhhbmRsZSBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgaW50IG1lbW9yeV9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZUNhbGxiYWNrKiBjYXB0dXJlX2NhbGxiYWNrKTsKLSAgdmlydHVhbCB+QXVkaW9UaHJlYWRDYWxsYmFjaygpOwotCi0gIHZpcnR1YWwgdm9pZCBNYXBTaGFyZWRNZW1vcnkoKSBPVkVSUklERTsKLQotICAvLyBDYWxsZWQgd2hlbmV2ZXIgd2UgcmVjZWl2ZSBub3RpZmljYXRpb25zIGFib3V0IHBlbmRpbmcgZGF0YS4KLSAgdmlydHVhbCB2b2lkIFByb2Nlc3MoaW50IHBlbmRpbmdfZGF0YSkgT1ZFUlJJREU7Ci0KLSBwcml2YXRlOgotICBDYXB0dXJlQ2FsbGJhY2sqIGNhcHR1cmVfY2FsbGJhY2tfOwotICBzY29wZWRfcHRyPEF1ZGlvQnVzPiBhdWRpb19idXNfOwotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQXVkaW9UaHJlYWRDYWxsYmFjayk7Ci19OwotCi1BdWRpb0lucHV0RGV2aWNlOjpBdWRpb0lucHV0RGV2aWNlKAotICAgIEF1ZGlvSW5wdXRJUEMqIGlwYywKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+JiBpb19sb29wKQotICAgIDogU2NvcGVkTG9vcE9ic2VydmVyKGlvX2xvb3ApLAotICAgICAgY2FsbGJhY2tfKE5VTEwpLAotICAgICAgZXZlbnRfaGFuZGxlcl8oTlVMTCksCi0gICAgICBpcGNfKGlwYyksCi0gICAgICBzdHJlYW1faWRfKDApLAotICAgICAgc2Vzc2lvbl9pZF8oMCksCi0gICAgICBwZW5kaW5nX2RldmljZV9yZWFkeV8oZmFsc2UpLAotICAgICAgYWdjX2lzX2VuYWJsZWRfKGZhbHNlKSB7Ci0gIENIRUNLKGlwY18pOwotfQotCi12b2lkIEF1ZGlvSW5wdXREZXZpY2U6OkluaXRpYWxpemUoY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZUNhbGxiYWNrKiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXB0dXJlRXZlbnRIYW5kbGVyKiBldmVudF9oYW5kbGVyKSB7Ci0gIERDSEVDSyghY2FsbGJhY2tfKTsKLSAgRENIRUNLKCFldmVudF9oYW5kbGVyXyk7Ci0gIGF1ZGlvX3BhcmFtZXRlcnNfID0gcGFyYW1zOwotICBjYWxsYmFja18gPSBjYWxsYmFjazsKLSAgZXZlbnRfaGFuZGxlcl8gPSBldmVudF9oYW5kbGVyOwotfQotCi12b2lkIEF1ZGlvSW5wdXREZXZpY2U6OlNldERldmljZShpbnQgc2Vzc2lvbl9pZCkgewotICBEVkxPRygxKSA8PCAiU2V0RGV2aWNlIChzZXNzaW9uX2lkPSIgPDwgc2Vzc2lvbl9pZCA8PCAiKSI7Ci0gIG1lc3NhZ2VfbG9vcCgpLT5Qb3N0VGFzayhGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kKCZBdWRpb0lucHV0RGV2aWNlOjpTZXRTZXNzaW9uSWRPbklPVGhyZWFkLCB0aGlzLCBzZXNzaW9uX2lkKSk7Ci19Ci0KLXZvaWQgQXVkaW9JbnB1dERldmljZTo6U3RhcnQoKSB7Ci0gIERWTE9HKDEpIDw8ICJTdGFydCgpIjsKLSAgbWVzc2FnZV9sb29wKCktPlBvc3RUYXNrKEZST01fSEVSRSwKLSAgICAgIGJhc2U6OkJpbmQoJkF1ZGlvSW5wdXREZXZpY2U6OkluaXRpYWxpemVPbklPVGhyZWFkLCB0aGlzKSk7Ci19Ci0KLXZvaWQgQXVkaW9JbnB1dERldmljZTo6U3RvcCgpIHsKLSAgRFZMT0coMSkgPDwgIlN0b3AoKSI7Ci0KLSAgewotICAgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhhdWRpb190aHJlYWRfbG9ja18pOwotICAgIGF1ZGlvX3RocmVhZF8uU3RvcChNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLSAgfQotCi0gIG1lc3NhZ2VfbG9vcCgpLT5Qb3N0VGFzayhGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kKCZBdWRpb0lucHV0RGV2aWNlOjpTaHV0RG93bk9uSU9UaHJlYWQsIHRoaXMpKTsKLX0KLQotdm9pZCBBdWRpb0lucHV0RGV2aWNlOjpTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgewotICBpZiAodm9sdW1lIDwgMCB8fCB2b2x1bWUgPiAxLjApIHsKLSAgICBETE9HKEVSUk9SKSA8PCAiSW52YWxpZCB2b2x1bWUgdmFsdWUgc3BlY2lmaWVkIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBtZXNzYWdlX2xvb3AoKS0+UG9zdFRhc2soRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZCgmQXVkaW9JbnB1dERldmljZTo6U2V0Vm9sdW1lT25JT1RocmVhZCwgdGhpcywgdm9sdW1lKSk7Ci19Ci0KLXZvaWQgQXVkaW9JbnB1dERldmljZTo6U2V0QXV0b21hdGljR2FpbkNvbnRyb2woYm9vbCBlbmFibGVkKSB7Ci0gIERWTE9HKDEpIDw8ICJTZXRBdXRvbWF0aWNHYWluQ29udHJvbChlbmFibGVkPSIgPDwgZW5hYmxlZCA8PCAiKSI7Ci0gIG1lc3NhZ2VfbG9vcCgpLT5Qb3N0VGFzayhGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kKCZBdWRpb0lucHV0RGV2aWNlOjpTZXRBdXRvbWF0aWNHYWluQ29udHJvbE9uSU9UaHJlYWQsCi0gICAgICAgICAgdGhpcywgZW5hYmxlZCkpOwotfQotCi12b2lkIEF1ZGlvSW5wdXREZXZpY2U6Ok9uU3RyZWFtQ3JlYXRlZCgKLSAgICBiYXNlOjpTaGFyZWRNZW1vcnlIYW5kbGUgaGFuZGxlLAotICAgIGJhc2U6OlN5bmNTb2NrZXQ6OkhhbmRsZSBzb2NrZXRfaGFuZGxlLAotICAgIGludCBsZW5ndGgpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcCgpLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotI2lmIGRlZmluZWQoT1NfV0lOKQotICBEQ0hFQ0soaGFuZGxlKTsKLSAgRENIRUNLKHNvY2tldF9oYW5kbGUpOwotI2VsaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICBEQ0hFQ0soaGFuZGxlLmdldCgpKTsKLSNlbHNlCi0gIERDSEVDS19HRShoYW5kbGUuZmQsIDApOwotICBEQ0hFQ0tfR0Uoc29ja2V0X2hhbmRsZSwgMCk7Ci0jZW5kaWYKLSAgRENIRUNLKGxlbmd0aCk7Ci0gIERWTE9HKDEpIDw8ICJPblN0cmVhbUNyZWF0ZWQgKHN0cmVhbV9pZD0iIDw8IHN0cmVhbV9pZF8gPDwgIikiOwotCi0gIC8vIFdlIHNob3VsZCBvbmx5IGdldCB0aGlzIGNhbGxiYWNrIGlmIHN0cmVhbV9pZF8gaXMgdmFsaWQuICBJZiBpdCBpcyBub3QsCi0gIC8vIHRoZSBJUEMgbGF5ZXIgc2hvdWxkIGhhdmUgY2xvc2VkIHRoZSBzaGFyZWQgbWVtb3J5IGFuZCBzb2NrZXQgaGFuZGxlcwotICAvLyBmb3IgdXMgYW5kIG5vdCBpbnZva2VkIHRoZSBjYWxsYmFjay4gIFRoZSBiYXNpYyBhc3NlcnRpb24gaXMgdGhhdCB3aGVuCi0gIC8vIHN0cmVhbV9pZF8gaXMgMCB0aGUgQXVkaW9JbnB1dERldmljZSBpbnN0YW5jZSBpcyBub3QgcmVnaXN0ZXJlZCBhcyBhCi0gIC8vIGRlbGVnYXRlIGFuZCBoZW5jZSBpdCBzaG91bGQgbm90IHJlY2VpdmUgY2FsbGJhY2tzLgotICBEQ0hFQ0soc3RyZWFtX2lkXyk7Ci0KLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGF1ZGlvX3RocmVhZF9sb2NrXyk7Ci0KLSAgRENIRUNLKGF1ZGlvX3RocmVhZF8uSXNTdG9wcGVkKCkpOwotICBhdWRpb19jYWxsYmFja18ucmVzZXQoCi0gICAgICBuZXcgQXVkaW9JbnB1dERldmljZTo6QXVkaW9UaHJlYWRDYWxsYmFjayhhdWRpb19wYXJhbWV0ZXJzXywgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLCBjYWxsYmFja18pKTsKLSAgYXVkaW9fdGhyZWFkXy5TdGFydChhdWRpb19jYWxsYmFja18uZ2V0KCksIHNvY2tldF9oYW5kbGUsICJBdWRpb0lucHV0RGV2aWNlIik7Ci0KLSAgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKS0+UG9zdFRhc2soRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZCgmQXVkaW9JbnB1dERldmljZTo6U3RhcnRPbklPVGhyZWFkLCB0aGlzKSk7Ci19Ci0KLXZvaWQgQXVkaW9JbnB1dERldmljZTo6T25Wb2x1bWUoZG91YmxlIHZvbHVtZSkgewotICBOT1RJTVBMRU1FTlRFRCgpOwotfQotCi12b2lkIEF1ZGlvSW5wdXREZXZpY2U6Ok9uU3RhdGVDaGFuZ2VkKAotICAgIEF1ZGlvSW5wdXRJUENEZWxlZ2F0ZTo6U3RhdGUgc3RhdGUpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcCgpLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotCi0gIC8vIERvIG5vdGhpbmcgaWYgdGhlIHN0cmVhbSBoYXMgYmVlbiBjbG9zZWQuCi0gIGlmICghc3RyZWFtX2lkXykKLSAgICByZXR1cm47Ci0KLSAgc3dpdGNoIChzdGF0ZSkgewotICAgIGNhc2UgQXVkaW9JbnB1dElQQ0RlbGVnYXRlOjprU3RvcHBlZDoKLSAgICAgIC8vIFRPRE8oeGlhbnMpOiBTaG91bGQgd2UganVzdCBjYWxsIFNodXREb3duT25JT1RocmVhZCBoZXJlIGluc3RlYWQ/Ci0gICAgICBpcGNfLT5SZW1vdmVEZWxlZ2F0ZShzdHJlYW1faWRfKTsKLQotICAgICAgYXVkaW9fdGhyZWFkXy5TdG9wKE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotICAgICAgYXVkaW9fY2FsbGJhY2tfLnJlc2V0KCk7Ci0KLSAgICAgIGlmIChldmVudF9oYW5kbGVyXykKLSAgICAgICAgZXZlbnRfaGFuZGxlcl8tPk9uRGV2aWNlU3RvcHBlZCgpOwotCi0gICAgICBzdHJlYW1faWRfID0gMDsKLSAgICAgIHBlbmRpbmdfZGV2aWNlX3JlYWR5XyA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBdWRpb0lucHV0SVBDRGVsZWdhdGU6OmtSZWNvcmRpbmc6Ci0gICAgICBOT1RJTVBMRU1FTlRFRCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBdWRpb0lucHV0SVBDRGVsZWdhdGU6OmtFcnJvcjoKLSAgICAgIERMT0coV0FSTklORykgPDwgIkF1ZGlvSW5wdXREZXZpY2U6Ok9uU3RhdGVDaGFuZ2VkKGtFcnJvcikiOwotICAgICAgLy8gRG9uJ3QgZGVyZWZlcmVuY2UgdGhlIGNhbGxiYWNrIG9iamVjdCBpZiB0aGUgYXVkaW8gdGhyZWFkCi0gICAgICAvLyBpcyBzdG9wcGVkIG9yIHN0b3BwaW5nLiAgVGhhdCBjb3VsZCBtZWFuIHRoYXQgdGhlIGNhbGxiYWNrCi0gICAgICAvLyBvYmplY3QgaGFzIGJlZW4gZGVsZXRlZC4KLSAgICAgIC8vIFRPRE8odG9tbWkpOiBBZGQgYW4gZXhwbGljaXQgY29udHJhY3QgZm9yIGNsZWFyaW5nIHRoZSBjYWxsYmFjawotICAgICAgLy8gb2JqZWN0LiAgUG9zc2libHkgcmVxdWlyZSBjYWxsaW5nIEluaXRpYWxpemUgYWdhaW4gb3IgcHJvdmlkZQotICAgICAgLy8gYSBjYWxsYmFjayBvYmplY3QgdmlhIFN0YXJ0KCkgYW5kIGNsZWFyIGl0IGluIFN0b3AoKS4KLSAgICAgIGlmICghYXVkaW9fdGhyZWFkXy5Jc1N0b3BwZWQoKSkKLSAgICAgICAgY2FsbGJhY2tfLT5PbkNhcHR1cmVFcnJvcigpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIE5PVFJFQUNIRUQoKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgQXVkaW9JbnB1dERldmljZTo6T25EZXZpY2VSZWFkeShjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2lkKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3AoKS0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgRFZMT0coMSkgPDwgIk9uRGV2aWNlUmVhZHkgKGRldmljZV9pZD0iIDw8IGRldmljZV9pZCA8PCAiKSI7Ci0KLSAgLy8gVGFrZXMgY2FyZSBvZiB0aGUgY2FzZSB3aGVuIFN0b3AoKSBpcyBjYWxsZWQgYmVmb3JlIE9uRGV2aWNlUmVhZHkoKS4KLSAgaWYgKCFwZW5kaW5nX2RldmljZV9yZWFkeV8pCi0gICAgcmV0dXJuOwotCi0gIC8vIElmIEF1ZGlvSW5wdXREZXZpY2VNYW5hZ2VyIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLCBpdCBtZWFucyBubyBkZXZpY2UKLSAgLy8gaXMgcmVhZHkgZm9yIHN0YXJ0LgotICBpZiAoZGV2aWNlX2lkLmVtcHR5KCkpIHsKLSAgICBpcGNfLT5SZW1vdmVEZWxlZ2F0ZShzdHJlYW1faWRfKTsKLSAgICBzdHJlYW1faWRfID0gMDsKLSAgfSBlbHNlIHsKLSAgICBpcGNfLT5DcmVhdGVTdHJlYW0oc3RyZWFtX2lkXywgYXVkaW9fcGFyYW1ldGVyc18sIGRldmljZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgYWdjX2lzX2VuYWJsZWRfKTsKLSAgfQotCi0gIHBlbmRpbmdfZGV2aWNlX3JlYWR5XyA9IGZhbHNlOwotICAvLyBOb3RpZnkgdGhlIGNsaWVudCB0aGF0IHRoZSBkZXZpY2UgaGFzIGJlZW4gc3RhcnRlZC4KLSAgaWYgKGV2ZW50X2hhbmRsZXJfKQotICAgIGV2ZW50X2hhbmRsZXJfLT5PbkRldmljZVN0YXJ0ZWQoZGV2aWNlX2lkKTsKLX0KLQotdm9pZCBBdWRpb0lucHV0RGV2aWNlOjpPbklQQ0Nsb3NlZCgpIHsKLSAgaXBjXyA9IE5VTEw7Ci19Ci0KLUF1ZGlvSW5wdXREZXZpY2U6On5BdWRpb0lucHV0RGV2aWNlKCkgewotICAvLyBUT0RPKGhlbnJpa2EpOiBUaGUgY3VycmVudCBkZXNpZ24gcmVxdWlyZXMgdGhhdCB0aGUgdXNlciBjYWxscwotICAvLyBTdG9wIGJlZm9yZSBkZWxldGluZyB0aGlzIGNsYXNzLgotICBDSEVDS19FUSgwLCBzdHJlYW1faWRfKTsKLX0KLQotdm9pZCBBdWRpb0lucHV0RGV2aWNlOjpJbml0aWFsaXplT25JT1RocmVhZCgpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcCgpLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgY2FsbCBTdGFydCgpIG1vcmUgdGhhbiBvbmNlLgotICBEQ0hFQ0tfRVEoMCwgc3RyZWFtX2lkXyk7Ci0gIGlmIChzdHJlYW1faWRfKQotICAgIHJldHVybjsKLQotICBzdHJlYW1faWRfID0gaXBjXy0+QWRkRGVsZWdhdGUodGhpcyk7Ci0gIC8vIElmIHxzZXNzaW9uX2lkX3wgaXMgbm90IHNwZWNpZmllZCwgaXQgd2lsbCBkaXJlY3RseSBjcmVhdGUgdGhlIHN0cmVhbTsKLSAgLy8gb3RoZXJ3aXNlIGl0IHdpbGwgc2VuZCBhIEF1ZGlvSW5wdXRIb3N0TXNnX1N0YXJ0RGV2aWNlIG1zZyB0byB0aGUgYnJvd3NlcgotICAvLyBhbmQgY3JlYXRlIHRoZSBzdHJlYW0gd2hlbiBnZXR0aW5nIGEgT25EZXZpY2VSZWFkeSgpIGNhbGxiYWNrLgotICBpZiAoIXNlc3Npb25faWRfKSB7Ci0gICAgaXBjXy0+Q3JlYXRlU3RyZWFtKHN0cmVhbV9pZF8sIGF1ZGlvX3BhcmFtZXRlcnNfLAotICAgICAgICBBdWRpb01hbmFnZXJCYXNlOjprRGVmYXVsdERldmljZUlkLCBhZ2NfaXNfZW5hYmxlZF8pOwotICB9IGVsc2UgewotICAgIGlwY18tPlN0YXJ0RGV2aWNlKHN0cmVhbV9pZF8sIHNlc3Npb25faWRfKTsKLSAgICBwZW5kaW5nX2RldmljZV9yZWFkeV8gPSB0cnVlOwotICB9Ci19Ci0KLXZvaWQgQXVkaW9JbnB1dERldmljZTo6U2V0U2Vzc2lvbklkT25JT1RocmVhZChpbnQgc2Vzc2lvbl9pZCkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wKCktPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIHNlc3Npb25faWRfID0gc2Vzc2lvbl9pZDsKLX0KLQotdm9pZCBBdWRpb0lucHV0RGV2aWNlOjpTdGFydE9uSU9UaHJlYWQoKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3AoKS0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgaWYgKHN0cmVhbV9pZF8pCi0gICAgaXBjXy0+UmVjb3JkU3RyZWFtKHN0cmVhbV9pZF8pOwotfQotCi12b2lkIEF1ZGlvSW5wdXREZXZpY2U6OlNodXREb3duT25JT1RocmVhZCgpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcCgpLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICAvLyBOT1RFOiB8Y29tcGxldGlvbnwgbWF5IGJlIE5VTEwuCi0gIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBjYWxsIHNodXRkb3duIG1vcmUgdGhhbiBvbmNlLgotICBpZiAoc3RyZWFtX2lkXykgewotICAgIGlmIChpcGNfKSB7Ci0gICAgICBpcGNfLT5DbG9zZVN0cmVhbShzdHJlYW1faWRfKTsKLSAgICAgIGlwY18tPlJlbW92ZURlbGVnYXRlKHN0cmVhbV9pZF8pOwotICAgIH0KLQotICAgIHN0cmVhbV9pZF8gPSAwOwotICAgIHNlc3Npb25faWRfID0gMDsKLSAgICBwZW5kaW5nX2RldmljZV9yZWFkeV8gPSBmYWxzZTsKLSAgICBhZ2NfaXNfZW5hYmxlZF8gPSBmYWxzZTsKLSAgfQotCi0gIC8vIFdlIGNhbiBydW4gaW50byBhbiBpc3N1ZSB3aGVyZSBTaHV0RG93bk9uSU9UaHJlYWQgaXMgY2FsbGVkIHJpZ2h0IGFmdGVyCi0gIC8vIE9uU3RyZWFtQ3JlYXRlZCBpcyBjYWxsZWQgaW4gY2FzZXMgd2hlcmUgU3RhcnQvU3RvcCBhcmUgY2FsbGVkIGJlZm9yZSB3ZQotICAvLyBnZXQgdGhlIE9uU3RyZWFtQ3JlYXRlZCBjYWxsYmFjay4gIFRvIGhhbmRsZSB0aGF0IGNvcm5lciBjYXNlLCB3ZSBjYWxsCi0gIC8vIFN0b3AoKS4gSW4gbW9zdCBjYXNlcywgdGhlIHRocmVhZCB3aWxsIGFscmVhZHkgYmUgc3RvcHBlZC4KLSAgLy8gQW5vdGhlciBzaXR1YXRpb24gaXMgd2hlbiB0aGUgSU8gdGhyZWFkIGdvZXMgYXdheSBiZWZvcmUgU3RvcCgpIGlzIGNhbGxlZAotICAvLyBpbiB3aGljaCBjYXNlLCB3ZSBjYW5ub3QgdXNlIHRoZSBtZXNzYWdlIGxvb3AgdG8gY2xvc2UgdGhlIHRocmVhZCBoYW5kbGUKLSAgLy8gYW5kIGNhbid0IG5vdCByZWx5IG9uIHRoZSBtYWluIHRocmVhZCBleGlzdGluZyBlaXRoZXIuCi0gIGJhc2U6OlRocmVhZFJlc3RyaWN0aW9uczo6U2NvcGVkQWxsb3dJTyBhbGxvd19pbzsKLSAgYXVkaW9fdGhyZWFkXy5TdG9wKE5VTEwpOwotICBhdWRpb19jYWxsYmFja18ucmVzZXQoKTsKLX0KLQotdm9pZCBBdWRpb0lucHV0RGV2aWNlOjpTZXRWb2x1bWVPbklPVGhyZWFkKGRvdWJsZSB2b2x1bWUpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcCgpLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBpZiAoc3RyZWFtX2lkXykKLSAgICBpcGNfLT5TZXRWb2x1bWUoc3RyZWFtX2lkXywgdm9sdW1lKTsKLX0KLQotdm9pZCBBdWRpb0lucHV0RGV2aWNlOjpTZXRBdXRvbWF0aWNHYWluQ29udHJvbE9uSU9UaHJlYWQoYm9vbCBlbmFibGVkKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3AoKS0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgRENIRUNLX0VRKDAsIHN0cmVhbV9pZF8pIDw8Ci0gICAgICAiVGhlIEFHQyBzdGF0ZSBjYW4gbm90IGJlIG1vZGlmaWVkIHdoaWxlIGNhcHR1cmluZyBpcyBhY3RpdmUuIjsKLSAgaWYgKHN0cmVhbV9pZF8pCi0gICAgcmV0dXJuOwotCi0gIC8vIFdlIHNpbXBseSBzdG9yZSB0aGUgbmV3IEFHQyBzZXR0aW5nIGhlcmUuIFRoaXMgdmFsdWUgd2lsbCBiZSB1c2VkIHdoZW4KLSAgLy8gYSBuZXcgc3RyZWFtIGlzIGluaXRpYWxpemVkIGFuZCBieSBHZXRBdXRvbWF0aWNHYWluQ29udHJvbCgpLgotICBhZ2NfaXNfZW5hYmxlZF8gPSBlbmFibGVkOwotfQotCi12b2lkIEF1ZGlvSW5wdXREZXZpY2U6OldpbGxEZXN0cm95Q3VycmVudE1lc3NhZ2VMb29wKCkgewotICBMT0coRVJST1IpIDw8ICJJTyBsb29wIGdvaW5nIGF3YXkgYmVmb3JlIHRoZSBpbnB1dCBkZXZpY2UgaGFzIGJlZW4gc3RvcHBlZCI7Ci0gIFNodXREb3duT25JT1RocmVhZCgpOwotfQotCi0vLyBBdWRpb0lucHV0RGV2aWNlOjpBdWRpb1RocmVhZENhbGxiYWNrCi1BdWRpb0lucHV0RGV2aWNlOjpBdWRpb1RocmVhZENhbGxiYWNrOjpBdWRpb1RocmVhZENhbGxiYWNrKAotICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgYXVkaW9fcGFyYW1ldGVycywKLSAgICBiYXNlOjpTaGFyZWRNZW1vcnlIYW5kbGUgbWVtb3J5LAotICAgIGludCBtZW1vcnlfbGVuZ3RoLAotICAgIENhcHR1cmVDYWxsYmFjayogY2FwdHVyZV9jYWxsYmFjaykKLSAgICA6IEF1ZGlvRGV2aWNlVGhyZWFkOjpDYWxsYmFjayhhdWRpb19wYXJhbWV0ZXJzLCAwLCBtZW1vcnksIG1lbW9yeV9sZW5ndGgpLAotICAgICAgY2FwdHVyZV9jYWxsYmFja18oY2FwdHVyZV9jYWxsYmFjaykgewotICBhdWRpb19idXNfID0gQXVkaW9CdXM6OkNyZWF0ZShhdWRpb19wYXJhbWV0ZXJzXyk7Ci19Ci0KLUF1ZGlvSW5wdXREZXZpY2U6OkF1ZGlvVGhyZWFkQ2FsbGJhY2s6On5BdWRpb1RocmVhZENhbGxiYWNrKCkgewotfQotCi12b2lkIEF1ZGlvSW5wdXREZXZpY2U6OkF1ZGlvVGhyZWFkQ2FsbGJhY2s6Ok1hcFNoYXJlZE1lbW9yeSgpIHsKLSAgc2hhcmVkX21lbW9yeV8uTWFwKG1lbW9yeV9sZW5ndGhfKTsKLX0KLQotdm9pZCBBdWRpb0lucHV0RGV2aWNlOjpBdWRpb1RocmVhZENhbGxiYWNrOjpQcm9jZXNzKGludCBwZW5kaW5nX2RhdGEpIHsKLSAgLy8gVGhlIHNoYXJlZCBtZW1vcnkgcmVwcmVzZW50cyBwYXJhbWV0ZXJzLCBzaXplIG9mIHRoZSBkYXRhIGJ1ZmZlciBhbmQgdGhlCi0gIC8vIGFjdHVhbCBkYXRhIGJ1ZmZlciBjb250YWluaW5nIGF1ZGlvIGRhdGEuIE1hcCB0aGUgbWVtb3J5IGludG8gdGhpcwotICAvLyBzdHJ1Y3R1cmUgYW5kIHBhcnNlIG91dCBwYXJhbWV0ZXJzIGFuZCB0aGUgZGF0YSBhcmVhLgotICBBdWRpb0lucHV0QnVmZmVyKiBidWZmZXIgPQotICAgICAgcmVpbnRlcnByZXRfY2FzdDxBdWRpb0lucHV0QnVmZmVyKj4oc2hhcmVkX21lbW9yeV8ubWVtb3J5KCkpOwotICBEQ0hFQ0tfRVEoYnVmZmVyLT5wYXJhbXMuc2l6ZSwKLSAgICAgICAgICAgIG1lbW9yeV9sZW5ndGhfIC0gc2l6ZW9mKEF1ZGlvSW5wdXRCdWZmZXJQYXJhbWV0ZXJzKSk7Ci0gIGRvdWJsZSB2b2x1bWUgPSBidWZmZXItPnBhcmFtcy52b2x1bWU7Ci0KLSAgaW50IGF1ZGlvX2RlbGF5X21pbGxpc2Vjb25kcyA9IHBlbmRpbmdfZGF0YSAvIGJ5dGVzX3Blcl9tc187Ci0gIGludDE2KiBtZW1vcnkgPSByZWludGVycHJldF9jYXN0PGludDE2Kj4oJmJ1ZmZlci0+YXVkaW9bMF0pOwotICBjb25zdCBpbnQgYnl0ZXNfcGVyX3NhbXBsZSA9IHNpemVvZihtZW1vcnlbMF0pOwotCi0gIC8vIERlaW50ZXJsZWF2ZSBlYWNoIGNoYW5uZWwgYW5kIGNvbnZlcnQgdG8gMzItYml0IGZsb2F0aW5nLXBvaW50Ci0gIC8vIHdpdGggbm9taW5hbCByYW5nZSAtMS4wIC0+ICsxLjAuCi0gIGF1ZGlvX2J1c18tPkZyb21JbnRlcmxlYXZlZChtZW1vcnksIGF1ZGlvX2J1c18tPmZyYW1lcygpLCBieXRlc19wZXJfc2FtcGxlKTsKLQotICAvLyBEZWxpdmVyIGNhcHR1cmVkIGRhdGEgdG8gdGhlIGNsaWVudCBpbiBmbG9hdGluZyBwb2ludCBmb3JtYXQKLSAgLy8gYW5kIHVwZGF0ZSB0aGUgYXVkaW8tZGVsYXkgbWVhc3VyZW1lbnQuCi0gIGNhcHR1cmVfY2FsbGJhY2tfLT5DYXB0dXJlKGF1ZGlvX2J1c18uZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RlbGF5X21pbGxpc2Vjb25kcywgdm9sdW1lKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9faW5wdXRfZGV2aWNlLmggYi9zcmMvbWVkaWEvYXVkaW8vYXVkaW9faW5wdXRfZGV2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZWZkZjEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX2lucHV0X2RldmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIExvdy1sYXRlbmN5IGF1ZGlvIGNhcHR1cmluZyBjbGFzcyB1dGlsaXppbmcgYXVkaW8gaW5wdXQgc3RyZWFtIHByb3ZpZGVkCi0vLyBieSBhIHNlcnZlciAoYnJvd3NlcikgcHJvY2VzcyBieSB1c2Ugb2YgYW4gSVBDIGludGVyZmFjZS4KLS8vCi0vLyBSZWxhdGlvbnNoaXAgb2YgY2xhc3NlczoKLS8vCi0vLyAgQXVkaW9JbnB1dENvbnRyb2xsZXIgICAgICAgICAgICAgICAgIEF1ZGlvSW5wdXREZXZpY2UKLS8vICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KLS8vICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICAgICAgICAgICB2ICAgICAgICAgICAgICAgICAgSVBDICAgICAgICAgICAgIHYKLS8vIEF1ZGlvSW5wdXRSZW5kZXJlckhvc3QgIDwtLS0tLS0tLS0+IEF1ZGlvSW5wdXRJUENEZWxlZ2F0ZQotLy8gICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgICAgIChpbXBsIGluIEF1ZGlvSW5wdXRNZXNzYWdlRmlsdGVyKQotLy8gICAgICAgICAgIHwKLS8vICAgICAgICAgICB2Ci0vLyBBdWRpb0lucHV0RGV2aWNlTWFuYWdlcgotLy8KLS8vIFRyYW5zcG9ydGF0aW9uIG9mIGF1ZGlvIHNhbXBsZXMgZnJvbSB0aGUgYnJvd3NlciB0byB0aGUgcmVuZGVyIHByb2Nlc3MKLS8vIGlzIGRvbmUgYnkgdXNpbmcgc2hhcmVkIG1lbW9yeSBpbiBjb21iaW5hdGlvbiB3aXRoIGEgU3luY1NvY2tldC4KLS8vIFRoZSBBdWRpb0lucHV0RGV2aWNlIHVzZXIgcmVnaXN0ZXJzIGFuIEF1ZGlvSW5wdXREZXZpY2U6OkNhcHR1cmVDYWxsYmFjayBieQotLy8gY2FsbGluZyBJbml0aWFsaXplKCkuICBUaGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2l0aCByZWNvcmRlZCBhdWRpbyBmcm9tCi0vLyB0aGUgdW5kZXJseWluZyBhdWRpbyBsYXllcnMuCi0vLyBUaGUgc2Vzc2lvbiBJRCBpcyB1c2VkIGJ5IHRoZSBBdWRpb0lucHV0UmVuZGVyZXJIb3N0IHRvIHN0YXJ0IHRoZSBkZXZpY2UKLS8vIHJlZmVyZW5jZWQgYnkgdGhpcyBJRC4KLS8vCi0vLyBTdGF0ZSBzZXF1ZW5jZXM6Ci0vLwotLy8gU2VxdWVuY2Ugd2hlcmUgc2Vzc2lvbl9pZCBoYXMgbm90IGJlZW4gc2V0IHVzaW5nIFNldERldmljZSgpOgotLy8gKCc8LScgc2lnbmlmaWVzIGNhbGxiYWNrcywgLT4gc2lnbmlmaWVzIGNhbGxzIG1hZGUgYnkgQXVkaW9JbnB1dERldmljZSkKLS8vIFN0YXJ0IC0+IEluaXRpYWxpemVPbklPVGhyZWFkIC0+IENyZWF0ZVN0cmVhbSAtPgotLy8gICAgICAgPC0gT25TdHJlYW1DcmVhdGVkIDwtCi0vLyAgICAgICAtPiBTdGFydE9uSU9UaHJlYWQgLT4gUGxheVN0cmVhbSAtPgotLy8KLS8vIFNlcXVlbmNlIHdoZXJlIHNlc3Npb25faWQgaGFzIGJlZW4gc2V0IHVzaW5nIFNldERldmljZSgpOgotLy8gU3RhcnQgLT4gSW5pdGlhbGl6ZU9uSU9UaHJlYWQgLT4gU3RhcnREZXZpY2UgLT4KLS8vICAgICAgIDwtIE9uRGV2aWNlUmVhZHkgPC0KLS8vICAgICAgIC0+IENyZWF0ZVN0cmVhbSAtPgotLy8gICAgICAgPC0gT25TdHJlYW1DcmVhdGVkIDwtCi0vLyAgICAgICAtPiBTdGFydE9uSU9UaHJlYWQgLT4gUGxheVN0cmVhbSAtPgotLy8KLS8vIEF1ZGlvSW5wdXREZXZpY2U6OkNhcHR1cmUgPT4gbG93IGxhdGVuY3kgYXVkaW8gdHJhbnNwb3J0IG9uIGF1ZGlvIHRocmVhZCA9PgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gU3RvcCAtLT4gU2h1dERvd25PbklPVGhyZWFkIC0tLS0tLT4gIENsb3NlU3RyZWFtIC0+IENsb3NlCi0vLwotLy8gVGhpcyBjbGFzcyBkZXBlbmRzIG9uIHR3byB0aHJlYWRzIHRvIGZ1bmN0aW9uOgotLy8KLS8vIDEuIEFuIElPIHRocmVhZC4KLS8vICAgIFRoaXMgdGhyZWFkIGlzIHVzZWQgdG8gYXN5bmNocm9ub3VzbHkgcHJvY2VzcyBTdGFydC9TdG9wIGV0YyBvcGVyYXRpb25zCi0vLyAgICB0aGF0IGFyZSBhdmFpbGFibGUgdmlhIHRoZSBwdWJsaWMgaW50ZXJmYWNlLiAgVGhlIHB1YmxpYyBtZXRob2RzIGFyZQotLy8gICAgYXN5bmNocm9ub3VzIGFuZCBzaW1wbHkgcG9zdCBhIHRhc2sgdG8gdGhlIElPIHRocmVhZCB0byBhY3R1YWxseSBwZXJmb3JtCi0vLyAgICB0aGUgd29yay4KLS8vIDIuIEF1ZGlvIHRyYW5zcG9ydCB0aHJlYWQuCi0vLyAgICBSZXNwb25zaWJsZSBmb3IgY2FsbGluZyB0aGUgQ2FwdHVyZUNhbGxiYWNrIGFuZCBmZWVkIGF1ZGlvIHNhbXBsZXMgZnJvbQotLy8gICAgdGhlIHNlcnZlciBzaWRlIGF1ZGlvIGxheWVyIHVzaW5nIGEgc29ja2V0IGFuZCBzaGFyZWQgbWVtb3J5LgotLy8KLS8vIEltcGxlbWVudGF0aW9uIG5vdGVzOgotLy8gLSBUaGUgdXNlciBtdXN0IGNhbGwgU3RvcCgpIGJlZm9yZSBkZWxldGluZyB0aGUgY2xhc3MgaW5zdGFuY2UuCi0KLSNpZm5kZWYgTUVESUFfQVVESU9fQVVESU9fSU5QVVRfREVWSUNFX0hfCi0jZGVmaW5lIE1FRElBX0FVRElPX0FVRElPX0lOUFVUX0RFVklDRV9IXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgImJhc2UvY29tcGlsZXJfc3BlY2lmaWMuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAiYmFzZS9zaGFyZWRfbWVtb3J5LmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fZGV2aWNlX3RocmVhZC5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX2lucHV0X2lwYy5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3BhcmFtZXRlcnMuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9zY29wZWRfbG9vcF9vYnNlcnZlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fY2FwdHVyZXJfc291cmNlLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gVE9ETyhoZW5yaWthKTogVGhpcyBjbGFzcyBpcyBiYXNlZCBvbiB0aGUgQXVkaW9PdXRwdXREZXZpY2UgY2xhc3MgYW5kIGl0IGhhcwotLy8gbWFueSBjb21wb25lbnRzIGluIGNvbW1vbi4gSW52ZXN0aWdhdGUgcG90ZW50aWFsIGZvciByZS1mYWN0b3JpbmcuCi0vLyBUT0RPKGhlbnJpa2EpOiBBZGQgc3VwcG9ydCBmb3IgZXZlbnQgaGFuZGxpbmcgKGUuZy4gT25TdGF0ZUNoYW5nZWQsCi0vLyBPbkNhcHR1cmVTdG9wcGVkIGV0Yy4pIGFuZCBlbnN1cmUgdGhhdCB3ZSBjYW4gZGVsaXZlciB0aGVzZSBub3RpZmljYXRpb25zCi0vLyB0byBhbnkgY2xpZW50cyB1c2luZyB0aGlzIGNsYXNzLgotY2xhc3MgTUVESUFfRVhQT1JUIEF1ZGlvSW5wdXREZXZpY2UKLSAgICA6IE5PTl9FWFBPUlRFRF9CQVNFKHB1YmxpYyBBdWRpb0NhcHR1cmVyU291cmNlKSwKLSAgICAgIE5PTl9FWFBPUlRFRF9CQVNFKHB1YmxpYyBBdWRpb0lucHV0SVBDRGVsZWdhdGUpLAotICAgICAgTk9OX0VYUE9SVEVEX0JBU0UocHVibGljIFNjb3BlZExvb3BPYnNlcnZlcikgewotIHB1YmxpYzoKLSAgQXVkaW9JbnB1dERldmljZShBdWRpb0lucHV0SVBDKiBpcGMsCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgaW9fbG9vcCk7Ci0KLSAgLy8gQXVkaW9DYXB0dXJlclNvdXJjZSBpbXBsZW1lbnRhdGlvbi4KLSAgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVDYWxsYmFjayogY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVFdmVudEhhbmRsZXIqIGV2ZW50X2hhbmRsZXIpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU3RhcnQoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0b3AoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFNldFZvbHVtZShkb3VibGUgdm9sdW1lKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFNldERldmljZShpbnQgc2Vzc2lvbl9pZCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTZXRBdXRvbWF0aWNHYWluQ29udHJvbChib29sIGVuYWJsZWQpIE9WRVJSSURFOwotCi0gcHJvdGVjdGVkOgotICAvLyBNZXRob2RzIGNhbGxlZCBvbiBJTyB0aHJlYWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBBdWRpb0lucHV0SVBDRGVsZWdhdGUgaW1wbGVtZW50YXRpb24uCi0gIHZpcnR1YWwgdm9pZCBPblN0cmVhbUNyZWF0ZWQoYmFzZTo6U2hhcmVkTWVtb3J5SGFuZGxlIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpTeW5jU29ja2V0OjpIYW5kbGUgc29ja2V0X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIE9uVm9sdW1lKGRvdWJsZSB2b2x1bWUpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgT25TdGF0ZUNoYW5nZWQoCi0gICAgICBBdWRpb0lucHV0SVBDRGVsZWdhdGU6OlN0YXRlIHN0YXRlKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIE9uRGV2aWNlUmVhZHkoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBPbklQQ0Nsb3NlZCgpIE9WRVJSSURFOwotCi0gIGZyaWVuZCBjbGFzcyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxBdWRpb0lucHV0RGV2aWNlPjsKLSAgdmlydHVhbCB+QXVkaW9JbnB1dERldmljZSgpOwotCi0gcHJpdmF0ZToKLSAgLy8gTWV0aG9kcyBjYWxsZWQgb24gSU8gdGhyZWFkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB0YXNrcyBwb3N0ZWQgb24gdGhlIElPIHRocmVhZCB0aGF0IG5lZWRzIHRvCi0gIC8vIGJlIGV4ZWN1dGVkIG9uIHRoYXQgdGhyZWFkLiBUaGV5IGludGVyYWN0IHdpdGggQXVkaW9JbnB1dE1lc3NhZ2VGaWx0ZXIgYW5kCi0gIC8vIHNlbmRzIElQQyBtZXNzYWdlcyBvbiB0aGF0IHRocmVhZC4KLSAgdm9pZCBJbml0aWFsaXplT25JT1RocmVhZCgpOwotICB2b2lkIFNldFNlc3Npb25JZE9uSU9UaHJlYWQoaW50IHNlc3Npb25faWQpOwotICB2b2lkIFN0YXJ0T25JT1RocmVhZCgpOwotICB2b2lkIFNodXREb3duT25JT1RocmVhZCgpOwotICB2b2lkIFNldFZvbHVtZU9uSU9UaHJlYWQoZG91YmxlIHZvbHVtZSk7Ci0gIHZvaWQgU2V0QXV0b21hdGljR2FpbkNvbnRyb2xPbklPVGhyZWFkKGJvb2wgZW5hYmxlZCk7Ci0KLSAgLy8gTWVzc2FnZUxvb3A6OkRlc3RydWN0aW9uT2JzZXJ2ZXIgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBJTyBsb29wLgotICAvLyBJZiB0aGUgSU8gbG9vcCBkaWVzIGJlZm9yZSB3ZSBkbywgd2Ugc2h1dCBkb3duIHRoZSBhdWRpbyB0aHJlYWQgZnJvbSBoZXJlLgotICB2aXJ0dWFsIHZvaWQgV2lsbERlc3Ryb3lDdXJyZW50TWVzc2FnZUxvb3AoKSBPVkVSUklERTsKLQotICBBdWRpb1BhcmFtZXRlcnMgYXVkaW9fcGFyYW1ldGVyc187Ci0KLSAgQ2FwdHVyZUNhbGxiYWNrKiBjYWxsYmFja187Ci0gIENhcHR1cmVFdmVudEhhbmRsZXIqIGV2ZW50X2hhbmRsZXJfOwotCi0gIEF1ZGlvSW5wdXRJUEMqIGlwY187Ci0KLSAgLy8gT3VyIHN0cmVhbSBJRCBvbiB0aGUgbWVzc2FnZSBmaWx0ZXIuIE9ubHkgbW9kaWZpZWQgb24gdGhlIElPIHRocmVhZC4KLSAgaW50IHN0cmVhbV9pZF87Ci0KLSAgLy8gVGhlIG1lZGlhIHNlc3Npb24gSUQgdXNlZCB0byBpZGVudGlmeSB3aGljaCBpbnB1dCBkZXZpY2UgdG8gYmUgc3RhcnRlZC4KLSAgLy8gT25seSBtb2RpZmllZCBvbiB0aGUgSU8gdGhyZWFkLgotICBpbnQgc2Vzc2lvbl9pZF87Ci0KLSAgLy8gU3RhdGUgdmFyaWFibGUgdXNlZCB0byBpbmRpY2F0ZSBpdCBpcyB3YWl0aW5nIGZvciBhIE9uRGV2aWNlUmVhZHkoKQotICAvLyBjYWxsYmFjay4gT25seSBtb2RpZmllZCBvbiB0aGUgSU8gdGhyZWFkLgotICBib29sIHBlbmRpbmdfZGV2aWNlX3JlYWR5XzsKLQotICAvLyBTdG9yZXMgdGhlIEF1dG9tYXRpYyBHYWluIENvbnRyb2wgc3RhdGUuIERlZmF1bHQgaXMgZmFsc2UuCi0gIC8vIE9ubHkgbW9kaWZpZWQgb24gdGhlIElPIHRocmVhZC4KLSAgYm9vbCBhZ2NfaXNfZW5hYmxlZF87Ci0KLSAgLy8gT3VyIGF1ZGlvIHRocmVhZCBjYWxsYmFjayBjbGFzcy4gIFNlZSBzb3VyY2UgZmlsZSBmb3IgZGV0YWlscy4KLSAgY2xhc3MgQXVkaW9UaHJlYWRDYWxsYmFjazsKLQotICAvLyBJbiBvcmRlciB0byBhdm9pZCBhIHJhY2UgYmV0d2VlbiBPblN0cmVhbUNyZWF0ZWQgYW5kIFN0b3AoKSwgd2UgdXNlIHRoaXMKLSAgLy8gZ3VhcmQgdG8gY29udHJvbCBzdG9wcGluZyBhbmQgc3RhcnRpbmcgdGhlIGF1ZGlvIHRocmVhZC4KLSAgYmFzZTo6TG9jayBhdWRpb190aHJlYWRfbG9ja187Ci0gIEF1ZGlvRGV2aWNlVGhyZWFkIGF1ZGlvX3RocmVhZF87Ci0gIHNjb3BlZF9wdHI8QXVkaW9JbnB1dERldmljZTo6QXVkaW9UaHJlYWRDYWxsYmFjaz4gYXVkaW9fY2FsbGJhY2tfOwotCi0gIERJU0FMTE9XX0lNUExJQ0lUX0NPTlNUUlVDVE9SUyhBdWRpb0lucHV0RGV2aWNlKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0FVRElPX0FVRElPX0lOUFVUX0RFVklDRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX2lucHV0X2RldmljZV91bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9hdWRpby9hdWRpb19pbnB1dF9kZXZpY2VfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMjExYTQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX2lucHV0X2RldmljZV91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAiYmFzZS9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19tYW5hZ2VyLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fbWFuYWdlcl9iYXNlLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0KLSNpZiBkZWZpbmVkKE9TX1dJTikKLSNpbmNsdWRlICJiYXNlL3dpbi9zY29wZWRfY29tX2luaXRpYWxpemVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vd2luL2F1ZGlvX21hbmFnZXJfd2luLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vd2luL3dhdmVpbl9pbnB1dF93aW4uaCIKLSNlbmRpZgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBUZXN0IGZpeHR1cmUgd2hpY2ggYWxsb3dzIHVzIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGVudW1lcmF0aW9uIEFQSSBvbgotLy8gV2luZG93cy4KLWNsYXNzIEF1ZGlvSW5wdXREZXZpY2VUZXN0Ci0gICAgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIEF1ZGlvSW5wdXREZXZpY2VUZXN0KCkKLSAgICAgIDogYXVkaW9fbWFuYWdlcl8oQXVkaW9NYW5hZ2VyOjpDcmVhdGUoKSkKLSNpZiBkZWZpbmVkKE9TX1dJTikKLSAgICAgICwgY29tX2luaXRfKGJhc2U6Ondpbjo6U2NvcGVkQ09NSW5pdGlhbGl6ZXI6OmtNVEEpCi0jZW5kaWYKLSAgewotICB9Ci0KLSNpZiBkZWZpbmVkKE9TX1dJTikKLSAgYm9vbCBTZXRNTURldmljZUVudW1lcmF0aW9uKCkgewotICAgIEF1ZGlvTWFuYWdlcldpbiogYW13ID0gc3RhdGljX2Nhc3Q8QXVkaW9NYW5hZ2VyV2luKj4oYXVkaW9fbWFuYWdlcl8uZ2V0KCkpOwotICAgIC8vIFdpbmRvd3MgV2F2ZSBpcyB1c2VkIGFzIGRlZmF1bHQgaWYgV2luZG93cyBYUCB3YXMgZGV0ZWN0ZWQgPT4KLSAgICAvLyByZXR1cm4gZmFsc2Ugc2luY2UgTU1EZXZpY2UgaXMgbm90IHN1cHBvcnRlZCBvbiBYUC4KLSAgICBpZiAoYW13LT5lbnVtZXJhdGlvbl90eXBlKCkgPT0gQXVkaW9NYW5hZ2VyV2luOjprV2F2ZUVudW1lcmF0aW9uKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgYW13LT5TZXRFbnVtZXJhdGlvblR5cGUoQXVkaW9NYW5hZ2VyV2luOjprTU1EZXZpY2VFbnVtZXJhdGlvbik7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB2b2lkIFNldFdhdmVFbnVtZXJhdGlvbigpIHsKLSAgICBBdWRpb01hbmFnZXJXaW4qIGFtdyA9IHN0YXRpY19jYXN0PEF1ZGlvTWFuYWdlcldpbio+KGF1ZGlvX21hbmFnZXJfLmdldCgpKTsKLSAgICBhbXctPlNldEVudW1lcmF0aW9uVHlwZShBdWRpb01hbmFnZXJXaW46OmtXYXZlRW51bWVyYXRpb24pOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgR2V0RGV2aWNlSWRGcm9tUENNV2F2ZUluQXVkaW9JbnB1dFN0cmVhbSgKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfaWQpIHsKLSAgICBBdWRpb01hbmFnZXJXaW4qIGFtdyA9IHN0YXRpY19jYXN0PEF1ZGlvTWFuYWdlcldpbio+KGF1ZGlvX21hbmFnZXJfLmdldCgpKTsKLSAgICBBdWRpb1BhcmFtZXRlcnMgcGFyYW1ldGVycygKLSAgICAgICAgQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSLCBDSEFOTkVMX0xBWU9VVF9TVEVSRU8sCi0gICAgICAgIEF1ZGlvUGFyYW1ldGVyczo6a0F1ZGlvQ0RTYW1wbGVSYXRlLCAxNiwKLSAgICAgICAgMTAyNCk7Ci0gICAgc2NvcGVkX3B0cjxQQ01XYXZlSW5BdWRpb0lucHV0U3RyZWFtPiBzdHJlYW0oCi0gICAgICAgIHN0YXRpY19jYXN0PFBDTVdhdmVJbkF1ZGlvSW5wdXRTdHJlYW0qPigKLSAgICAgICAgICAgIGFtdy0+Q3JlYXRlUENNV2F2ZUluQXVkaW9JbnB1dFN0cmVhbShwYXJhbWV0ZXJzLCBkZXZpY2VfaWQpKSk7Ci0gICAgcmV0dXJuIHN0cmVhbS5nZXQoKSA/IHN0cmVhbS0+ZGV2aWNlX2lkXyA6IHN0ZDo6c3RyaW5nKCk7Ci0gIH0KLSNlbmRpZgotCi0gIC8vIEhlbHBlciBtZXRob2Qgd2hpY2ggdmVyaWZpZXMgdGhhdCB0aGUgZGV2aWNlIGxpc3Qgc3RhcnRzIHdpdGggYSB2YWxpZAotICAvLyBkZWZhdWx0IHJlY29yZCBmb2xsb3dlZCBieSBub24tZGVmYXVsdCBkZXZpY2UgbmFtZXMuCi0gIHN0YXRpYyB2b2lkIENoZWNrRGV2aWNlTmFtZXMoY29uc3QgQXVkaW9EZXZpY2VOYW1lcyYgZGV2aWNlX25hbWVzKSB7Ci0gICAgaWYgKCFkZXZpY2VfbmFtZXMuZW1wdHkoKSkgewotICAgICAgQXVkaW9EZXZpY2VOYW1lczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBkZXZpY2VfbmFtZXMuYmVnaW4oKTsKLQotICAgICAgLy8gVGhlIGZpcnN0IGRldmljZSBpbiB0aGUgbGlzdCBzaG91bGQgYWx3YXlzIGJlIHRoZSBkZWZhdWx0IGRldmljZS4KLSAgICAgIEVYUEVDVF9FUShzdGQ6OnN0cmluZyhBdWRpb01hbmFnZXJCYXNlOjprRGVmYXVsdERldmljZU5hbWUpLAotICAgICAgICAgICAgICAgIGl0LT5kZXZpY2VfbmFtZSk7Ci0gICAgICBFWFBFQ1RfRVEoc3RkOjpzdHJpbmcoQXVkaW9NYW5hZ2VyQmFzZTo6a0RlZmF1bHREZXZpY2VJZCksIGl0LT51bmlxdWVfaWQpOwotICAgICAgKytpdDsKLQotICAgICAgLy8gT3RoZXIgZGV2aWNlcyBzaG91bGQgaGF2ZSBub24tZW1wdHkgbmFtZSBhbmQgaWQgYW5kIHNob3VsZCBub3QgY29udGFpbgotICAgICAgLy8gZGVmYXVsdCBuYW1lIG9yIGlkLgotICAgICAgd2hpbGUgKGl0ICE9IGRldmljZV9uYW1lcy5lbmQoKSkgewotICAgICAgICBFWFBFQ1RfRkFMU0UoaXQtPmRldmljZV9uYW1lLmVtcHR5KCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UoaXQtPnVuaXF1ZV9pZC5lbXB0eSgpKTsKLSAgICAgICAgRVhQRUNUX05FKHN0ZDo6c3RyaW5nKEF1ZGlvTWFuYWdlckJhc2U6OmtEZWZhdWx0RGV2aWNlTmFtZSksCi0gICAgICAgICAgICAgICAgICBpdC0+ZGV2aWNlX25hbWUpOwotICAgICAgICBFWFBFQ1RfTkUoc3RkOjpzdHJpbmcoQXVkaW9NYW5hZ2VyQmFzZTo6a0RlZmF1bHREZXZpY2VJZCksCi0gICAgICAgICAgICAgICAgICBpdC0+dW5pcXVlX2lkKTsKLSAgICAgICAgKytpdDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgLy8gTG9nIGEgd2FybmluZyBzbyB3ZSBjYW4gc2VlIHRoZSBzdGF0dXMgb24gdGhlIGJ1aWxkIGJvdHMuICBObyBuZWVkIHRvCi0gICAgICAvLyBicmVhayB0aGUgdGVzdCB0aG91Z2ggc2luY2UgdGhpcyBkb2VzIHN1Y2Nlc3NmdWxseSB0ZXN0IHRoZSBjb2RlIGFuZAotICAgICAgLy8gc29tZSBmYWlsdXJlIGNhc2VzLgotICAgICAgTE9HKFdBUk5JTkcpIDw8ICJObyBpbnB1dCBkZXZpY2VzIGRldGVjdGVkIjsKLSAgICB9Ci0gIH0KLQotICBib29sIENhblJ1bkF1ZGlvVGVzdCgpIHsKLSAgICByZXR1cm4gYXVkaW9fbWFuYWdlcl8tPkhhc0F1ZGlvSW5wdXREZXZpY2VzKCk7Ci0gIH0KLQotICBzY29wZWRfcHRyPEF1ZGlvTWFuYWdlcj4gYXVkaW9fbWFuYWdlcl87Ci0KLSNpZiBkZWZpbmVkKE9TX1dJTikKLSAgLy8gVGhlIE1NRGV2aWNlIEFQSSByZXF1aXJlcyBDT00gdG8gYmUgaW5pdGlhbGl6ZWQgb24gdGhlIGN1cnJlbnQgdGhyZWFkLgotICBiYXNlOjp3aW46OlNjb3BlZENPTUluaXRpYWxpemVyIGNvbV9pbml0XzsKLSNlbmRpZgotfTsKLQotLy8gVGVzdCB0aGF0IGRldmljZXMgY2FuIGJlIGVudW1lcmF0ZWQuCi1URVNUX0YoQXVkaW9JbnB1dERldmljZVRlc3QsIEVudW1lcmF0ZURldmljZXMpIHsKLSAgaWYgKCFDYW5SdW5BdWRpb1Rlc3QoKSkKLSAgICByZXR1cm47Ci0KLSAgQXVkaW9EZXZpY2VOYW1lcyBkZXZpY2VfbmFtZXM7Ci0gIGF1ZGlvX21hbmFnZXJfLT5HZXRBdWRpb0lucHV0RGV2aWNlTmFtZXMoJmRldmljZV9uYW1lcyk7Ci0gIENoZWNrRGV2aWNlTmFtZXMoZGV2aWNlX25hbWVzKTsKLX0KLQotLy8gUnVuIGFkZGl0aW9uYWwgdGVzdHMgZm9yIFdpbmRvd3Mgc2luY2UgZW51bWVyYXRpb24gY2FuIGJlIGRvbmUgdXNpbmcKLS8vIHR3byBkaWZmZXJlbnQgQVBJcy4gTU1EZXZpY2UgaXMgZGVmYXVsdCBmb3IgVmlzdGEgYW5kIGhpZ2hlciBhbmQgV2F2ZQotLy8gaXMgZGVmYXVsdCBmb3IgWFAgYW5kIGxvd2VyLgotI2lmIGRlZmluZWQoT1NfV0lOKQotCi0vLyBPdmVycmlkZSBkZWZhdWx0IGVudW1lcmF0aW9uIEFQSSBhbmQgZm9yY2UgdXNhZ2Ugb2YgV2luZG93cyBNTURldmljZS4KLS8vIFRoaXMgdGVzdCB3aWxsIG9ubHkgcnVuIG9uIFdpbmRvd3MgVmlzdGEgYW5kIGhpZ2hlci4KLVRFU1RfRihBdWRpb0lucHV0RGV2aWNlVGVzdCwgRW51bWVyYXRlRGV2aWNlc1dpbk1NRGV2aWNlKSB7Ci0gIGlmICghQ2FuUnVuQXVkaW9UZXN0KCkpCi0gICAgcmV0dXJuOwotCi0gIEF1ZGlvRGV2aWNlTmFtZXMgZGV2aWNlX25hbWVzOwotICBpZiAoIVNldE1NRGV2aWNlRW51bWVyYXRpb24oKSkgewotICAgIC8vIFVzYWdlIG9mIE1NRGV2aWNlIHdpbGwgZmFpbCBvbiBYUCBhbmQgbG93ZXIuCi0gICAgTE9HKFdBUk5JTkcpIDw8ICJNTSBkZXZpY2UgZW51bWVyYXRpb24gaXMgbm90IHN1cHBvcnRlZC4iOwotICAgIHJldHVybjsKLSAgfQotICBhdWRpb19tYW5hZ2VyXy0+R2V0QXVkaW9JbnB1dERldmljZU5hbWVzKCZkZXZpY2VfbmFtZXMpOwotICBDaGVja0RldmljZU5hbWVzKGRldmljZV9uYW1lcyk7Ci19Ci0KLS8vIE92ZXJyaWRlIGRlZmF1bHQgZW51bWVyYXRpb24gQVBJIGFuZCBmb3JjZSB1c2FnZSBvZiBXaW5kb3dzIFdhdmUuCi0vLyBUaGlzIHRlc3Qgd2lsbCBydW4gb24gV2luZG93cyBYUCwgV2luZG93cyBWaXN0YSBhbmQgV2luZG93cyA3LgotVEVTVF9GKEF1ZGlvSW5wdXREZXZpY2VUZXN0LCBFbnVtZXJhdGVEZXZpY2VzV2luV2F2ZSkgewotICBpZiAoIUNhblJ1bkF1ZGlvVGVzdCgpKQotICAgIHJldHVybjsKLQotICBBdWRpb0RldmljZU5hbWVzIGRldmljZV9uYW1lczsKLSAgU2V0V2F2ZUVudW1lcmF0aW9uKCk7Ci0gIGF1ZGlvX21hbmFnZXJfLT5HZXRBdWRpb0lucHV0RGV2aWNlTmFtZXMoJmRldmljZV9uYW1lcyk7Ci0gIENoZWNrRGV2aWNlTmFtZXMoZGV2aWNlX25hbWVzKTsKLX0KLQotVEVTVF9GKEF1ZGlvSW5wdXREZXZpY2VUZXN0LCBXaW5YUERldmljZUlkVW5jaGFuZ2VkKSB7Ci0gIGlmICghQ2FuUnVuQXVkaW9UZXN0KCkpCi0gICAgcmV0dXJuOwotCi0gIEF1ZGlvRGV2aWNlTmFtZXMgeHBfZGV2aWNlX25hbWVzOwotICBTZXRXYXZlRW51bWVyYXRpb24oKTsKLSAgYXVkaW9fbWFuYWdlcl8tPkdldEF1ZGlvSW5wdXREZXZpY2VOYW1lcygmeHBfZGV2aWNlX25hbWVzKTsKLSAgQ2hlY2tEZXZpY2VOYW1lcyh4cF9kZXZpY2VfbmFtZXMpOwotCi0gIC8vIERldmljZSBJRCBzaG91bGQgcmVtYWluIHVuY2hhbmdlZCwgaW5jbHVkaW5nIHRoZSBkZWZhdWx0IGRldmljZSBJRC4KLSAgZm9yIChBdWRpb0RldmljZU5hbWVzOjppdGVyYXRvciBpID0geHBfZGV2aWNlX25hbWVzLmJlZ2luKCk7Ci0gICAgICAgaSAhPSB4cF9kZXZpY2VfbmFtZXMuZW5kKCk7ICsraSkgewotICAgIEVYUEVDVF9FUShpLT51bmlxdWVfaWQsCi0gICAgICAgICAgICAgIEdldERldmljZUlkRnJvbVBDTVdhdmVJbkF1ZGlvSW5wdXRTdHJlYW0oaS0+dW5pcXVlX2lkKSk7Ci0gIH0KLX0KLQotVEVTVF9GKEF1ZGlvSW5wdXREZXZpY2VUZXN0LCBDb252ZXJ0VG9XaW5YUERldmljZUlkKSB7Ci0gIGlmICghQ2FuUnVuQXVkaW9UZXN0KCkpCi0gICAgcmV0dXJuOwotCi0gIGlmICghU2V0TU1EZXZpY2VFbnVtZXJhdGlvbigpKSB7Ci0gICAgLy8gVXNhZ2Ugb2YgTU1EZXZpY2Ugd2lsbCBmYWlsIG9uIFhQIGFuZCBsb3dlci4KLSAgICBMT0coV0FSTklORykgPDwgIk1NIGRldmljZSBlbnVtZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLiI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQXVkaW9EZXZpY2VOYW1lcyBkZXZpY2VfbmFtZXM7Ci0gIGF1ZGlvX21hbmFnZXJfLT5HZXRBdWRpb0lucHV0RGV2aWNlTmFtZXMoJmRldmljZV9uYW1lcyk7Ci0gIENoZWNrRGV2aWNlTmFtZXMoZGV2aWNlX25hbWVzKTsKLQotICBmb3IgKEF1ZGlvRGV2aWNlTmFtZXM6Oml0ZXJhdG9yIGkgPSBkZXZpY2VfbmFtZXMuYmVnaW4oKTsKLSAgICAgICBpICE9IGRldmljZV9uYW1lcy5lbmQoKTsgKytpKSB7Ci0gICAgc3RkOjpzdHJpbmcgY29udmVydGVkX2lkID0KLSAgICAgICAgR2V0RGV2aWNlSWRGcm9tUENNV2F2ZUluQXVkaW9JbnB1dFN0cmVhbShpLT51bmlxdWVfaWQpOwotICAgIGlmIChpID09IGRldmljZV9uYW1lcy5iZWdpbigpKSB7Ci0gICAgICAvLyBUaGUgZmlyc3QgaW4gdGhlIGxpc3QgaXMgdGhlIGRlZmF1bHQgZGV2aWNlIElELCB3aGljaCBzaG91bGQgbm90IGJlCi0gICAgICAvLyBjaGFuZ2VkIHdoZW4gcGFzc2VkIHRvIFBDTVdhdmVJbkF1ZGlvSW5wdXRTdHJlYW0uCi0gICAgICBFWFBFQ1RfRVEoaS0+dW5pcXVlX2lkLCBjb252ZXJ0ZWRfaWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBNTURldmljZS1zdHlsZSBkZXZpY2UgSURzIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gV2F2ZUluLXN0eWxlIGRldmljZQotICAgICAgLy8gSURzLgotICAgICAgRVhQRUNUX05FKGktPnVuaXF1ZV9pZCwgY29udmVydGVkX2lkKTsKLSAgICB9Ci0gIH0KLX0KLQotI2VuZGlmCi0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX2lucHV0X2lwYy5jYyBiL3NyYy9tZWRpYS9hdWRpby9hdWRpb19pbnB1dF9pcGMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MjUzYjAuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX2lucHV0X2lwYy5jYworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19pbnB1dF9pcGMuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotQXVkaW9JbnB1dElQQ0RlbGVnYXRlOjp+QXVkaW9JbnB1dElQQ0RlbGVnYXRlKCkge30KLQotQXVkaW9JbnB1dElQQzo6fkF1ZGlvSW5wdXRJUEMoKSB7fQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb19pbnB1dF9pcGMuaCBiL3NyYy9tZWRpYS9hdWRpby9hdWRpb19pbnB1dF9pcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI0ZTcyZC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9faW5wdXRfaXBjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9BVURJT19BVURJT19JTlBVVF9JUENfSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fQVVESU9fSU5QVVRfSVBDX0hfCi0KLSNpbmNsdWRlICJiYXNlL3NoYXJlZF9tZW1vcnkuaCIKLSNpbmNsdWRlICJiYXNlL3N5bmNfc29ja2V0LmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fcGFyYW1ldGVycy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIENvbnRhaW5zIElQQyBub3RpZmljYXRpb25zIGZvciB0aGUgc3RhdGUgb2YgdGhlIHNlcnZlciBzaWRlCi0vLyAoQXVkaW9JbnB1dENvbnRyb2xsZXIpIGF1ZGlvIHN0YXRlIGNoYW5nZXMgYW5kIHdoZW4gYW4gQXVkaW9JbnB1dENvbnRyb2xsZXIKLS8vIGhhcyBiZWVuIGNyZWF0ZWQuICBJbXBsZW1lbnRlZCBieSBBdWRpb0lucHV0RGV2aWNlLgotY2xhc3MgTUVESUFfRVhQT1JUIEF1ZGlvSW5wdXRJUENEZWxlZ2F0ZSB7Ci0gcHVibGljOgotICAvLyBWYWxpZCBzdGF0ZXMgZm9yIHRoZSBpbnB1dCBzdHJlYW0uCi0gIGVudW0gU3RhdGUgewotICAgIGtSZWNvcmRpbmcsCi0gICAga1N0b3BwZWQsCi0gICAga0Vycm9yCi0gIH07Ci0KLSAgLy8gQ2FsbGVkIHdoZW4gYW4gQXVkaW9JbnB1dENvbnRyb2xsZXIgaGFzIGJlZW4gY3JlYXRlZC4KLSAgLy8gVGhlIHNoYXJlZCBtZW1vcnkgfGhhbmRsZXwgcG9pbnRzIHRvIGEgbWVtb3J5IHNlY3Rpb24gdGhhdCdzIHVzZWQgdG8KLSAgLy8gdHJhbnNmZXIgZGF0YSBiZXR3ZWVuIHRoZSBBdWRpb0lucHV0RGV2aWNlIGFuZCBBdWRpb0lucHV0Q29udHJvbGxlcgotICAvLyBvYmplY3RzLiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIE9uU3RyZWFtQ3JlYXRlZCB0YWtlcyBvd25lcnNoaXAuCi0gIC8vIFRoZSB8c29ja2V0X2hhbmRsZXwgaXMgdXNlZCBieSB0aGUgQXVkaW9JbnB1dENvbnRyb2xsZXIgdG8gc2lnbmFsCi0gIC8vIG5vdGlmaWNhdGlvbnMgdGhhdCBtb3JlIGRhdGEgaXMgYXZhaWxhYmxlIGFuZCBjYW4gb3B0aW9uYWxseSBwcm92aWRlCi0gIC8vIHBhcmFtZXRlciBjaGFuZ2VzIGJhY2suICBUaGUgQXVkaW9JbnB1dERldmljZSBtdXN0IHJlYWQgZnJvbSB0aGlzIHNvY2tldAotICAvLyBhbmQgcHJvY2VzcyB0aGUgc2hhcmVkIG1lbW9yeSB3aGVuZXZlciBkYXRhIGlzIHJlYWQgZnJvbSB0aGUgc29ja2V0LgotICB2aXJ0dWFsIHZvaWQgT25TdHJlYW1DcmVhdGVkKGJhc2U6OlNoYXJlZE1lbW9yeUhhbmRsZSBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6U3luY1NvY2tldDo6SGFuZGxlIHNvY2tldF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCkgPSAwOwotCi0gIC8vIENhbGxlZCB3aGVuIHN0YXRlIG9mIGFuIGF1ZGlvIHN0cmVhbSBoYXMgY2hhbmdlZC4KLSAgdmlydHVhbCB2b2lkIE9uU3RhdGVDaGFuZ2VkKFN0YXRlIHN0YXRlKSA9IDA7Ci0KLSAgLy8gQ2FsbGVkIHdoZW4gdGhlIGlucHV0IHN0cmVhbSB2b2x1bWUgaGFzIGNoYW5nZWQuCi0gIHZpcnR1YWwgdm9pZCBPblZvbHVtZShkb3VibGUgdm9sdW1lKSA9IDA7Ci0KLSAgLy8gQ2FsbGVkIHdoZW4gYSBkZXZpY2UgaGFzIGJlZW4gc3RhcnRlZCBvbiB0aGUgc2VydmVyIHNpZGUuCi0gIC8vIElmIHRoZSBkZXZpY2UgY291bGQgbm90IGJlIHN0YXJ0ZWQsIHxkZXZpY2VfaWR8IHdpbGwgYmUgZW1wdHkuCi0gIHZpcnR1YWwgdm9pZCBPbkRldmljZVJlYWR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfaWQpID0gMDsKLQotICAvLyBDYWxsZWQgd2hlbiB0aGUgQXVkaW9JbnB1dElQQyBvYmplY3QgaXMgZ29pbmcgYXdheSBhbmQvb3Igd2hlbiB0aGUKLSAgLy8gSVBDIGNoYW5uZWwgaGFzIGJlZW4gY2xvc2VkIGFuZCBubyBtb3JlIElQQyByZXF1ZXN0cyBjYW4gYmUgbWFkZS4KLSAgLy8gSW1wbGVtZW50YXRpb25zIG11c3QgY2xlYXIgYW55IHJlZmVyZW5jZXMgdG8gdGhlIEF1ZGlvSW5wdXRJUEMgb2JqZWN0Ci0gIC8vIGF0IHRoaXMgcG9pbnQuCi0gIHZpcnR1YWwgdm9pZCBPbklQQ0Nsb3NlZCgpID0gMDsKLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB+QXVkaW9JbnB1dElQQ0RlbGVnYXRlKCk7Ci19OwotCi0vLyBQcm92aWRlcyBJUEMgZnVuY3Rpb25hbGl0eSBmb3IgYW4gQXVkaW9JbnB1dERldmljZS4gIFRoZSBpbXBsZW1lbnRhdGlvbgotLy8gc2hvdWxkIGFzeW5jaHJvbm91c2x5IGRlbGl2ZXIgdGhlIG1lc3NhZ2VzIHRvIGFuIEF1ZGlvSW5wdXRDb250cm9sbGVyIG9iamVjdAotLy8gKG9yIGNyZWF0ZSBvbmUgaW4gdGhlIGNhc2Ugb2YgQ3JlYXRlU3RyZWFtKCkpLCB0aGF0IG1heSBsaXZlIGluIGEgc2VwYXJhdGUKLS8vIHByb2Nlc3MuCi1jbGFzcyBNRURJQV9FWFBPUlQgQXVkaW9JbnB1dElQQyB7Ci0gcHVibGljOgotICAvLyBSZWdpc3RlcnMgYW4gQXVkaW9JbnB1dElQQ0RlbGVnYXRlIGFuZCByZXR1cm5zIGEgfHN0cmVhbV9pZHwgdGhhdAotICAvLyBtdXN0IGJlIHVzZWQgd2l0aCBhbGwgb3RoZXIgSVBDIGZ1bmN0aW9ucyBpbiB0aGlzIGludGVyZmFjZS4KLSAgdmlydHVhbCBpbnQgQWRkRGVsZWdhdGUoQXVkaW9JbnB1dElQQ0RlbGVnYXRlKiBkZWxlZ2F0ZSkgPSAwOwotCi0gIC8vIFVucmVnaXN0ZXJzIGEgZGVsZWdhdGUgdGhhdCB3YXMgcHJldmlvdXNseSByZWdpc3RlcmVkIHZpYSBhIGNhbGwgdG8KLSAgLy8gQWRkRGVsZWdhdGUoKS4gIFRoZSBhdWRpbyBzdHJlYW0gc2hvdWxkIGJlIGluIGEgY2xvc2VkIHN0YXRlIHByaW9yIHRvCi0gIC8vIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KLSAgdmlydHVhbCB2b2lkIFJlbW92ZURlbGVnYXRlKGludCBzdHJlYW1faWQpID0gMDsKLQotICAvLyBTZW5kcyBhIHJlcXVlc3QgdG8gY3JlYXRlIGFuIEF1ZGlvSW5wdXRDb250cm9sbGVyIG9iamVjdCBpbiB0aGUgcGVlcgotICAvLyBwcm9jZXNzLCBpZGVudGlmeSBpdCBieSB8c3RyZWFtX2lkfCBhbmQgY29uZmlndXJlIGl0IHRvIHVzZSB0aGUgc3BlY2lmaWVkCi0gIC8vIGF1ZGlvIHxwYXJhbXN8LiAgT25jZSB0aGUgc3RyZWFtIGhhcyBiZWVuIGNyZWF0ZWQsIHRoZSBpbXBsZW1lbnRhdGlvbiBtdXN0Ci0gIC8vIGdlbmVyYXRlIGEgbm90aWZpY2F0aW9uIHRvIHRoZSBBdWRpb0lucHV0SVBDRGVsZWdhdGUgYW5kIGNhbGwKLSAgLy8gT25TdHJlYW1DcmVhdGVkKCkuCi0gIHZpcnR1YWwgdm9pZCBDcmVhdGVTdHJlYW0oaW50IHN0cmVhbV9pZCwgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2lkLCBib29sIGF1dG9tYXRpY19nYWluX2NvbnRyb2wpID0gMDsKLQotICAvLyBTdGFydHMgdGhlIGRldmljZSBvbiB0aGUgc2VydmVyIHNpZGUuICBPbmNlIHRoZSBkZXZpY2UgaGFzIHN0YXJ0ZWQsCi0gIC8vIG9yIGZhaWxlZCB0byBzdGFydCwgYSBjYWxsYmFjayB0bwotICAvLyBBdWRpb0lucHV0SVBDRGVsZWdhdGU6Ok9uRGV2aWNlUmVhZHkoKSBtdXN0IGJlIG1hZGUuCi0gIHZpcnR1YWwgdm9pZCBTdGFydERldmljZShpbnQgc3RyZWFtX2lkLCBpbnQgc2Vzc2lvbl9pZCkgPSAwOwotCi0gIC8vIENvcnJlc3BvbmRzIHRvIGEgY2FsbCB0byBBdWRpb0lucHV0Q29udHJvbGxlcjo6UmVjb3JkKCkgb24gdGhlIHNlcnZlciBzaWRlLgotICB2aXJ0dWFsIHZvaWQgUmVjb3JkU3RyZWFtKGludCBzdHJlYW1faWQpID0gMDsKLQotICAvLyBTZXRzIHRoZSB2b2x1bWUgb2YgdGhlIGF1ZGlvIHN0cmVhbS4KLSAgdmlydHVhbCB2b2lkIFNldFZvbHVtZShpbnQgc3RyZWFtX2lkLCBkb3VibGUgdm9sdW1lKSA9IDA7Ci0KLSAgLy8gQ2xvc2VzIHRoZSBhdWRpbyBzdHJlYW0gYW5kIGRlbGV0ZXMgdGhlIG1hdGNoaW5nIEF1ZGlvSW5wdXRDb250cm9sbGVyCi0gIC8vIGluc3RhbmNlLiAgUHJpb3IgdG8gZGVsZXRpbmcgdGhlIEF1ZGlvSW5wdXRDb250cm9sbGVyIG9iamVjdCwgYSBjYWxsIHRvCi0gIC8vIEF1ZGlvSW5wdXRDb250cm9sbGVyOjpDbG9zZSBtdXN0IGJlIG1hZGUuCi0gIHZpcnR1YWwgdm9pZCBDbG9zZVN0cmVhbShpbnQgc3RyZWFtX2lkKSA9IDA7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgfkF1ZGlvSW5wdXRJUEMoKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0FVRElPX0FVRElPX0lOUFVUX0lQQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX2lucHV0X3N0cmVhbV9pbXBsLmNjIGIvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX2lucHV0X3N0cmVhbV9pbXBsLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjgzMTdjLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb19pbnB1dF9zdHJlYW1faW1wbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19pbnB1dF9zdHJlYW1faW1wbC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1zdGF0aWMgY29uc3QgaW50IGtNaW5JbnRlcnZhbEJldHdlZW5Wb2x1bWVVcGRhdGVzTXMgPSAxMDAwOwotCi1BdWRpb0lucHV0U3RyZWFtSW1wbDo6QXVkaW9JbnB1dFN0cmVhbUltcGwoKQotICAgIDogYWdjX2lzX2VuYWJsZWRfKGZhbHNlKSwKLSAgICAgIG1heF92b2x1bWVfKDAuMCksCi0gICAgICBub3JtYWxpemVkX3ZvbHVtZV8oMC4wKSB7Ci19Ci0KLUF1ZGlvSW5wdXRTdHJlYW1JbXBsOjp+QXVkaW9JbnB1dFN0cmVhbUltcGwoKSB7fQotCi12b2lkIEF1ZGlvSW5wdXRTdHJlYW1JbXBsOjpTZXRBdXRvbWF0aWNHYWluQ29udHJvbChib29sIGVuYWJsZWQpIHsKLSAgYWdjX2lzX2VuYWJsZWRfID0gZW5hYmxlZDsKLX0KLQotYm9vbCBBdWRpb0lucHV0U3RyZWFtSW1wbDo6R2V0QXV0b21hdGljR2FpbkNvbnRyb2woKSB7Ci0gIHJldHVybiBhZ2NfaXNfZW5hYmxlZF87Ci19Ci0KLXZvaWQgQXVkaW9JbnB1dFN0cmVhbUltcGw6OlVwZGF0ZUFnY1ZvbHVtZSgpIHsKLSAgYmFzZTo6QXV0b0xvY2sgbG9jayhsb2NrXyk7Ci0KLSAgLy8gV2UgdGFrZSBuZXcgdm9sdW1lIHNhbXBsZXMgb25jZSBldmVyeSBzZWNvbmQgd2hlbiB0aGUgQUdDIGlzIGVuYWJsZWQuCi0gIC8vIFRvIGVuc3VyZSB0aGF0IGEgbmV3IHNldHRpbmcgaGFzIGFuIGltbWVkaWF0ZSBlZmZlY3QsIHRoZSBuZXcgdm9sdW1lCi0gIC8vIHNldHRpbmcgaXMgY2FjaGVkIGhlcmUuIEl0IHdpbGwgZW5zdXJlIHRoYXQgdGhlIG5leHQgT25EYXRhKCkgY2FsbGJhY2sKLSAgLy8gd2lsbCBjb250YWluIGEgbmV3IHZhbGlkIHZvbHVtZSBsZXZlbC4gSWYgdGhpcyBhcHByb2FjaCB3YXMgbm90IHRha2VuLAotICAvLyB3ZSBjb3VsZCByZXBvcnQgaW52YWxpZCB2b2x1bWUgbGV2ZWxzIHRvIHRoZSBjbGllbnQgZm9yIGEgdGltZSBwZXJpb2QKLSAgLy8gb2YgdXAgdG8gb25lIHNlY29uZC4KLSAgaWYgKGFnY19pc19lbmFibGVkXykgewotICAgIEdldE5vcm1hbGl6ZWRWb2x1bWUoKTsKLSAgfQotfQotCi12b2lkIEF1ZGlvSW5wdXRTdHJlYW1JbXBsOjpRdWVyeUFnY1ZvbHVtZShkb3VibGUqIG5vcm1hbGl6ZWRfdm9sdW1lKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGxvY2sobG9ja18pOwotCi0gIC8vIE9ubHkgbW9kaWZ5IHRoZSB8dm9sdW1lfCBvdXRwdXQgcmVmZXJlbmNlIGlmIEFHQyBpcyBlbmFibGVkIGFuZCBpZgotICAvLyBtb3JlIHRoYW4gb25lIHNlY29uZCBoYXMgcGFzc2VkIHNpbmNlIHRoZSB2b2x1bWUgd2FzIHVwZGF0ZWQgdGhlIGxhc3QgdGltZS4KLSAgaWYgKGFnY19pc19lbmFibGVkXykgewotICAgIGJhc2U6OlRpbWUgbm93ID0gYmFzZTo6VGltZTo6Tm93KCk7Ci0gICAgaWYgKChub3cgLSBsYXN0X3ZvbHVtZV91cGRhdGVfdGltZV8pLkluTWlsbGlzZWNvbmRzKCkgPgotICAgICAga01pbkludGVydmFsQmV0d2VlblZvbHVtZVVwZGF0ZXNNcykgewotICAgICAgICBHZXROb3JtYWxpemVkVm9sdW1lKCk7Ci0gICAgICAgIGxhc3Rfdm9sdW1lX3VwZGF0ZV90aW1lXyA9IG5vdzsKLSAgICB9Ci0gICAgKm5vcm1hbGl6ZWRfdm9sdW1lID0gbm9ybWFsaXplZF92b2x1bWVfOwotICB9Ci19Ci0KLXZvaWQgQXVkaW9JbnB1dFN0cmVhbUltcGw6OkdldE5vcm1hbGl6ZWRWb2x1bWUoKSB7Ci0gIGlmIChtYXhfdm9sdW1lXyA9PSAwLjApIHsKLSAgICAvLyBDYWNoIHRoZSBtYXhpbXVtIHZvbHVtZSBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGFzayBmb3IgaXQuCi0gICAgbWF4X3ZvbHVtZV8gPSBHZXRNYXhWb2x1bWUoKTsKLSAgfQotCi0gIGlmIChtYXhfdm9sdW1lXyAhPSAwLjApIHsKLSAgICAvLyBSZXRyaWV2ZSB0aGUgY3VycmVudCB2b2x1bWUgbGV2ZWwgYnkgYXNraW5nIHRoZSBhdWRpbyBoYXJkd2FyZS4KLSAgICAvLyBSYW5nZSBpcyBub3JtYWxpemVkIHRvIFswLjAsMS4wXSBvciBbMC4wLCAxLjVdIG9uIExpbnV4LgotICAgIG5vcm1hbGl6ZWRfdm9sdW1lXyA9IEdldFZvbHVtZSgpIC8gbWF4X3ZvbHVtZV87Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9faW5wdXRfc3RyZWFtX2ltcGwuaCBiL3NyYy9tZWRpYS9hdWRpby9hdWRpb19pbnB1dF9zdHJlYW1faW1wbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDk4MGE5Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb19pbnB1dF9zdHJlYW1faW1wbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9BVURJT19BVURJT19JTlBVVF9TVFJFQU1fSU1QTF9IXwotI2RlZmluZSBNRURJQV9BVURJT19BVURJT19JTlBVVF9TVFJFQU1fSU1QTF9IXwotCi0jaW5jbHVkZSAiYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgotI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKLSNpbmNsdWRlICJiYXNlL3RpbWUuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19pby5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBBdWRpb0lucHV0U3RyZWFtSW1wbCBpbXBsZW1lbnRzIHBsYXRmb3JtLWluZGVwZW5kZW50IHBhcnRzIG9mIHRoZQotLy8gQXVkaW9JbnB1dFN0cmVhbSBpbnRlcmZhY2UuIEVhY2ggcGxhdGZvcm0gZGVwZW5kZW50IGltcGxlbWVudGF0aW9uCi0vLyBzaG91bGQgZGVyaXZlIGZyb20gdGhpcyBjbGFzcy4KLS8vIFRPRE8oaGVucmlrYSk6IHdlIGNhbiBwcm9iYWJseSBicmVhayBvdXQgbW9yZSBwYXJ0cyBmcm9tIG91ciBjdXJyZW50Ci0vLyBBdWRpb0lucHV0U3RyZWFtIGltcGxlbWVudGF0aW9uIGFuZCBtb3ZlIG91dCB0byB0aGlzIGNsYXNzLgotY2xhc3MgTUVESUFfRVhQT1JUIEF1ZGlvSW5wdXRTdHJlYW1JbXBsIDogcHVibGljIEF1ZGlvSW5wdXRTdHJlYW0gewotIHB1YmxpYzoKLSAgQXVkaW9JbnB1dFN0cmVhbUltcGwoKTsKLSAgdmlydHVhbCB+QXVkaW9JbnB1dFN0cmVhbUltcGwoKTsKLQotICAvLyBTZXRzIHRoZSBhdXRvbWF0aWMgZ2FpbiBjb250cm9sIChBR0MpIHRvIG9uIG9yIG9mZi4gV2hlbiBBR0MgaXMgZW5hYmxlZCwKLSAgLy8gdGhlIG1pY3JvcGhvbmUgdm9sdW1lIGlzIHF1ZXJpZWQgcGVyaW9kaWNhbGx5IGFuZCB0aGUgdm9sdW1lIGxldmVsIGlzCi0gIC8vIHByb3ZpZGVkIGluIGVhY2ggQXVkaW9JbnB1dENhbGxiYWNrOjpPbkRhdGEoKSBjYWxsYmFjayBhbmQgZmVkIHRvIHRoZQotICAvLyByZW5kZXItc2lkZSBBR0MuCi0gIHZpcnR1YWwgdm9pZCBTZXRBdXRvbWF0aWNHYWluQ29udHJvbChib29sIGVuYWJsZWQpIE9WRVJSSURFOwotCi0gIC8vIEdldHMgdGhlIGN1cnJlbnQgYXV0b21hdGljIGdhaW4gY29udHJvbCBzdGF0ZS4KLSAgdmlydHVhbCBib29sIEdldEF1dG9tYXRpY0dhaW5Db250cm9sKCkgT1ZFUlJJREU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8vIFN0b3JlcyBhIG5ldyB2b2x1bWUgbGV2ZWwgYnkgYXNraW5nIHRoZSBhdWRpbyBoYXJkd2FyZS4KLSAgLy8gVGhpcyBtZXRob2Qgb25seSBoYXMgYW4gZWZmZWN0IGlmIEFHQyBpcyBlbmFibGVkLgotICB2b2lkIFVwZGF0ZUFnY1ZvbHVtZSgpOwotCi0gIC8vIEdldHMgdGhlIGxhdGVzdCBzdG9yZWQgdm9sdW1lIGxldmVsIGlmIEFHQyBpcyBlbmFibGVkIGFuZCBpZgotICAvLyBtb3JlIHRoYW4gb25lIHNlY29uZCBoYXMgcGFzc2VkIHNpbmNlIHRoZSB2b2x1bWUgd2FzIHVwZGF0ZWQgdGhlIGxhc3QgdGltZS4KLSAgdm9pZCBRdWVyeUFnY1ZvbHVtZShkb3VibGUqIG5vcm1hbGl6ZWRfdm9sdW1lKTsKLQotIHByaXZhdGU6Ci0gIC8vIFRha2VzIGEgdm9sdW1lIHNhbXBsZSBhbmQgc3RvcmVzIGl0IGluIHxub3JtYWxpemVkX3ZvbHVtZV98LgotICB2b2lkIEdldE5vcm1hbGl6ZWRWb2x1bWUoKTsKLQotICAvLyBUcnVlIHdoZW4gYXV0b21hdGljIGdhaW4gY29udHJvbCBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gIC8vIEd1YXJkZWQgYnkgfGxvY2tffC4KLSAgYm9vbCBhZ2NfaXNfZW5hYmxlZF87Ci0KLSAgLy8gU3RvcmVzIHRoZSBtYXhpbXVtIHZvbHVtZSB3aGljaCBpcyB1c2VkIGZvciBub3JtYWxpemF0aW9uIHRvIGEgdm9sdW1lCi0gIC8vIHJhbmdlIG9mIFswLjAsIDEuMF0uCi0gIGRvdWJsZSBtYXhfdm9sdW1lXzsKLQotICAvLyBDb250YWlucyBsYXN0IHJlc3VsdCBvZiBpbnRlcm5hbCBjYWxsIHRvIEdldFZvbHVtZSgpLiBXZSBzYXZlIHJlc291cmNlcwotICAvLyBidXQgbm90IHF1ZXJ5aW5nIHRoZSBjYXB0dXJlIHZvbHVtZSBmb3IgZWFjaCBjYWxsYmFjay4gR3VhcmRlZCBieSB8bG9ja198LgotICAvLyBUaGUgcmFuZ2UgaXMgbm9ybWFsaXplZCB0byBbMC4wLCAxLjBdLgotICBkb3VibGUgbm9ybWFsaXplZF92b2x1bWVfOwotCi0gIC8vIFByb3RlY3RzIHxhZ2NfaXNfZW5hYmxlZF98IGFuZCB8dm9sdW1lX3wgLgotICBiYXNlOjpMb2NrIGxvY2tfOwotCi0gIC8vIEtlZXBzIHRyYWNrIG9mIHRoZSBsYXN0IHRpbWUgdGhlIG1pY3JvcGhvbmUgdm9sdW1lIGxldmVsIHdhcyBxdWVyaWVkLgotICBiYXNlOjpUaW1lIGxhc3Rfdm9sdW1lX3VwZGF0ZV90aW1lXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQXVkaW9JbnB1dFN0cmVhbUltcGwpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQVVESU9fQVVESU9fSU5QVVRfU1RSRUFNX0lNUExfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb19pbnB1dF91bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9hdWRpby9hdWRpb19pbnB1dF91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwMjMyMy4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9faW5wdXRfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgImJhc2UvZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy9wbGF0Zm9ybV90aHJlYWQuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19pby5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX21hbmFnZXJfYmFzZS5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1zdGF0aWMgY29uc3QgaW50IGtTYW1wbGluZ1JhdGUgPSA4MDAwOwotc3RhdGljIGNvbnN0IGludCBrU2FtcGxlc1BlclBhY2tldCA9IGtTYW1wbGluZ1JhdGUgLyAyMDsKLQotLy8gVGhpcyBjbGFzcyBhbGxvd3MgdG8gZmluZCBvdXQgaWYgdGhlIGNhbGxiYWNrcyBhcmUgb2NjdXJyaW5nIGFzCi0vLyBleHBlY3RlZCBhbmQgaWYgYW55IGVycm9yIGhhcyBiZWVuIHJlcG9ydGVkLgotY2xhc3MgVGVzdElucHV0Q2FsbGJhY2sgOiBwdWJsaWMgQXVkaW9JbnB1dFN0cmVhbTo6QXVkaW9JbnB1dENhbGxiYWNrIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFRlc3RJbnB1dENhbGxiYWNrKGludCBtYXhfZGF0YV9ieXRlcykKLSAgICAgIDogY2FsbGJhY2tfY291bnRfKDApLAotICAgICAgICBoYWRfZXJyb3JfKDApLAotICAgICAgICBtYXhfZGF0YV9ieXRlc18obWF4X2RhdGFfYnl0ZXMpIHsKLSAgfQotICB2aXJ0dWFsIHZvaWQgT25EYXRhKEF1ZGlvSW5wdXRTdHJlYW0qIHN0cmVhbSwgY29uc3QgdWludDgqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDMyIHNpemUsIHVpbnQzMiBoYXJkd2FyZV9kZWxheV9ieXRlcywgZG91YmxlIHZvbHVtZSkgewotICAgICsrY2FsbGJhY2tfY291bnRfOwotICAgIC8vIFJlYWQgdGhlIGZpcnN0IGJ5dGUgdG8gbWFrZSBzdXJlIG1lbW9yeSBpcyBnb29kLgotICAgIGlmIChzaXplKSB7Ci0gICAgICBBU1NFUlRfTEUoc3RhdGljX2Nhc3Q8aW50PihzaXplKSwgbWF4X2RhdGFfYnl0ZXNfKTsKLSAgICAgIGludCB2YWx1ZSA9IGRhdGFbMF07Ci0gICAgICBFWFBFQ1RfR0UodmFsdWUsIDApOwotICAgIH0KLSAgfQotICB2aXJ0dWFsIHZvaWQgT25DbG9zZShBdWRpb0lucHV0U3RyZWFtKiBzdHJlYW0pIHt9Ci0gIHZpcnR1YWwgdm9pZCBPbkVycm9yKEF1ZGlvSW5wdXRTdHJlYW0qIHN0cmVhbSwgaW50IGNvZGUpIHsKLSAgICArK2hhZF9lcnJvcl87Ci0gIH0KLSAgLy8gUmV0dXJucyBob3cgbWFueSB0aW1lcyBPbkRhdGEoKSBoYXMgYmVlbiBjYWxsZWQuCi0gIGludCBjYWxsYmFja19jb3VudCgpIGNvbnN0IHsKLSAgICByZXR1cm4gY2FsbGJhY2tfY291bnRfOwotICB9Ci0gIC8vIFJldHVybnMgaG93IG1hbnkgdGltZXMgdGhlIE9uRXJyb3IgY2FsbGJhY2sgd2FzIGNhbGxlZC4KLSAgaW50IGhhZF9lcnJvcigpIGNvbnN0IHsKLSAgICByZXR1cm4gaGFkX2Vycm9yXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgaW50IGNhbGxiYWNrX2NvdW50XzsKLSAgaW50IGhhZF9lcnJvcl87Ci0gIGludCBtYXhfZGF0YV9ieXRlc187Ci19OwotCi1zdGF0aWMgYm9vbCBDYW5SdW5BdWRpb1Rlc3RzKEF1ZGlvTWFuYWdlciogYXVkaW9fbWFuKSB7Ci0gIGJvb2wgaGFzX2lucHV0ID0gYXVkaW9fbWFuLT5IYXNBdWRpb0lucHV0RGV2aWNlcygpOwotCi0gIGlmICghaGFzX2lucHV0KQotICAgIExPRyhXQVJOSU5HKSA8PCAiTm8gaW5wdXQgZGV2aWNlcyBkZXRlY3RlZCI7Ci0KLSAgcmV0dXJuIGhhc19pbnB1dDsKLX0KLQotc3RhdGljIEF1ZGlvSW5wdXRTdHJlYW0qIENyZWF0ZVRlc3RBdWRpb0lucHV0U3RyZWFtKEF1ZGlvTWFuYWdlciogYXVkaW9fbWFuKSB7Ci0gIEF1ZGlvSW5wdXRTdHJlYW0qIGFpcyA9IGF1ZGlvX21hbi0+TWFrZUF1ZGlvSW5wdXRTdHJlYW0oCi0gICAgICBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSLCBDSEFOTkVMX0xBWU9VVF9TVEVSRU8sCi0gICAgICAgICAgICAgICAgICAgICAga1NhbXBsaW5nUmF0ZSwgMTYsIGtTYW1wbGVzUGVyUGFja2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICBBdWRpb01hbmFnZXJCYXNlOjprRGVmYXVsdERldmljZUlkKTsKLSAgRVhQRUNUX1RSVUUoTlVMTCAhPSBhaXMpOwotICByZXR1cm4gYWlzOwotfQotCi0vLyBUZXN0IHRoYXQgQXVkaW9JbnB1dFN0cmVhbSByZWplY3RzIG91dCBvZiByYW5nZSBwYXJhbWV0ZXJzLgotVEVTVChBdWRpb0lucHV0VGVzdCwgU2FuaXR5T25NYWtlUGFyYW1zKSB7Ci0gIHNjb3BlZF9wdHI8QXVkaW9NYW5hZ2VyPiBhdWRpb19tYW4oQXVkaW9NYW5hZ2VyOjpDcmVhdGUoKSk7Ci0gIGlmICghQ2FuUnVuQXVkaW9UZXN0cyhhdWRpb19tYW4uZ2V0KCkpKQotICAgIHJldHVybjsKLQotICBBdWRpb1BhcmFtZXRlcnM6OkZvcm1hdCBmbXQgPSBBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVI7Ci0gIEVYUEVDVF9UUlVFKE5VTEwgPT0gYXVkaW9fbWFuLT5NYWtlQXVkaW9JbnB1dFN0cmVhbSgKLSAgICAgIEF1ZGlvUGFyYW1ldGVycyhmbXQsIENIQU5ORUxfTEFZT1VUXzdfMSwgODAwMCwgMTYsCi0gICAgICAgICAgICAgICAgICAgICAga1NhbXBsZXNQZXJQYWNrZXQpLCBBdWRpb01hbmFnZXJCYXNlOjprRGVmYXVsdERldmljZUlkKSk7Ci0gIEVYUEVDVF9UUlVFKE5VTEwgPT0gYXVkaW9fbWFuLT5NYWtlQXVkaW9JbnB1dFN0cmVhbSgKLSAgICAgIEF1ZGlvUGFyYW1ldGVycyhmbXQsIENIQU5ORUxfTEFZT1VUX01PTk8sIDEwMjQgKiAxMDI0LCAxNiwKLSAgICAgICAgICAgICAgICAgICAgICBrU2FtcGxlc1BlclBhY2tldCksIEF1ZGlvTWFuYWdlckJhc2U6OmtEZWZhdWx0RGV2aWNlSWQpKTsKLSAgRVhQRUNUX1RSVUUoTlVMTCA9PSBhdWRpb19tYW4tPk1ha2VBdWRpb0lucHV0U3RyZWFtKAotICAgICAgQXVkaW9QYXJhbWV0ZXJzKGZtdCwgQ0hBTk5FTF9MQVlPVVRfU1RFUkVPLCA4MDAwLCA4MCwKLSAgICAgICAgICAgICAgICAgICAgICBrU2FtcGxlc1BlclBhY2tldCksIEF1ZGlvTWFuYWdlckJhc2U6OmtEZWZhdWx0RGV2aWNlSWQpKTsKLSAgRVhQRUNUX1RSVUUoTlVMTCA9PSBhdWRpb19tYW4tPk1ha2VBdWRpb0lucHV0U3RyZWFtKAotICAgICAgQXVkaW9QYXJhbWV0ZXJzKGZtdCwgQ0hBTk5FTF9MQVlPVVRfU1RFUkVPLCA4MDAwLCA4MCwKLSAgICAgICAgICAgICAgICAgICAgICAxMDAwICoga1NhbXBsZXNQZXJQYWNrZXQpLAotICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWFuYWdlckJhc2U6OmtEZWZhdWx0RGV2aWNlSWQpKTsKLSAgRVhQRUNUX1RSVUUoTlVMTCA9PSBhdWRpb19tYW4tPk1ha2VBdWRpb0lucHV0U3RyZWFtKAotICAgICAgQXVkaW9QYXJhbWV0ZXJzKGZtdCwgQ0hBTk5FTF9MQVlPVVRfVU5TVVBQT1JURUQsIDgwMDAsIDE2LAotICAgICAgICAgICAgICAgICAgICAgIGtTYW1wbGVzUGVyUGFja2V0KSwgQXVkaW9NYW5hZ2VyQmFzZTo6a0RlZmF1bHREZXZpY2VJZCkpOwotICBFWFBFQ1RfVFJVRShOVUxMID09IGF1ZGlvX21hbi0+TWFrZUF1ZGlvSW5wdXRTdHJlYW0oCi0gICAgICBBdWRpb1BhcmFtZXRlcnMoZm10LCBDSEFOTkVMX0xBWU9VVF9TVEVSRU8sIC04MDAwLCAxNiwKLSAgICAgICAgICAgICAgICAgICAgICBrU2FtcGxlc1BlclBhY2tldCksIEF1ZGlvTWFuYWdlckJhc2U6OmtEZWZhdWx0RGV2aWNlSWQpKTsKLSAgRVhQRUNUX1RSVUUoTlVMTCA9PSBhdWRpb19tYW4tPk1ha2VBdWRpb0lucHV0U3RyZWFtKAotICAgICAgQXVkaW9QYXJhbWV0ZXJzKGZtdCwgQ0hBTk5FTF9MQVlPVVRfU1RFUkVPLCA4MDAwLCAtMTYsCi0gICAgICAgICAgICAgICAgICAgICAga1NhbXBsZXNQZXJQYWNrZXQpLCBBdWRpb01hbmFnZXJCYXNlOjprRGVmYXVsdERldmljZUlkKSk7Ci0gIEVYUEVDVF9UUlVFKE5VTEwgPT0gYXVkaW9fbWFuLT5NYWtlQXVkaW9JbnB1dFN0cmVhbSgKLSAgICAgIEF1ZGlvUGFyYW1ldGVycyhmbXQsIENIQU5ORUxfTEFZT1VUX1NURVJFTywgODAwMCwgMTYsIC0xMDI0KSwKLSAgICAgIEF1ZGlvTWFuYWdlckJhc2U6OmtEZWZhdWx0RGV2aWNlSWQpKTsKLX0KLQotLy8gVGVzdCBjcmVhdGUgYW5kIGNsb3NlIG9mIGFuIEF1ZGlvSW5wdXRTdHJlYW0gd2l0aG91dCByZWNvcmRpbmcgYXVkaW8uCi1URVNUKEF1ZGlvSW5wdXRUZXN0LCBDcmVhdGVBbmRDbG9zZSkgewotICBzY29wZWRfcHRyPEF1ZGlvTWFuYWdlcj4gYXVkaW9fbWFuKEF1ZGlvTWFuYWdlcjo6Q3JlYXRlKCkpOwotICBpZiAoIUNhblJ1bkF1ZGlvVGVzdHMoYXVkaW9fbWFuLmdldCgpKSkKLSAgICByZXR1cm47Ci0gIEF1ZGlvSW5wdXRTdHJlYW0qIGFpcyA9IENyZWF0ZVRlc3RBdWRpb0lucHV0U3RyZWFtKGF1ZGlvX21hbi5nZXQoKSk7Ci0gIGFpcy0+Q2xvc2UoKTsKLX0KLQotLy8gVGVzdCBjcmVhdGUsIG9wZW4gYW5kIGNsb3NlIG9mIGFuIEF1ZGlvSW5wdXRTdHJlYW0gd2l0aG91dCByZWNvcmRpbmcgYXVkaW8uCi1URVNUKEF1ZGlvSW5wdXRUZXN0LCBPcGVuQW5kQ2xvc2UpIHsKLSAgc2NvcGVkX3B0cjxBdWRpb01hbmFnZXI+IGF1ZGlvX21hbihBdWRpb01hbmFnZXI6OkNyZWF0ZSgpKTsKLSAgaWYgKCFDYW5SdW5BdWRpb1Rlc3RzKGF1ZGlvX21hbi5nZXQoKSkpCi0gICAgcmV0dXJuOwotICBBdWRpb0lucHV0U3RyZWFtKiBhaXMgPSBDcmVhdGVUZXN0QXVkaW9JbnB1dFN0cmVhbShhdWRpb19tYW4uZ2V0KCkpOwotICBFWFBFQ1RfVFJVRShhaXMtPk9wZW4oKSk7Ci0gIGFpcy0+Q2xvc2UoKTsKLX0KLQotLy8gVGVzdCBjcmVhdGUsIG9wZW4sIHN0b3AgYW5kIGNsb3NlIG9mIGFuIEF1ZGlvSW5wdXRTdHJlYW0gd2l0aG91dCByZWNvcmRpbmcuCi1URVNUKEF1ZGlvSW5wdXRUZXN0LCBPcGVuU3RvcEFuZENsb3NlKSB7Ci0gIHNjb3BlZF9wdHI8QXVkaW9NYW5hZ2VyPiBhdWRpb19tYW4oQXVkaW9NYW5hZ2VyOjpDcmVhdGUoKSk7Ci0gIGlmICghQ2FuUnVuQXVkaW9UZXN0cyhhdWRpb19tYW4uZ2V0KCkpKQotICAgIHJldHVybjsKLSAgQXVkaW9JbnB1dFN0cmVhbSogYWlzID0gQ3JlYXRlVGVzdEF1ZGlvSW5wdXRTdHJlYW0oYXVkaW9fbWFuLmdldCgpKTsKLSAgRVhQRUNUX1RSVUUoYWlzLT5PcGVuKCkpOwotICBhaXMtPlN0b3AoKTsKLSAgYWlzLT5DbG9zZSgpOwotfQotCi0vLyBUZXN0IGEgbm9ybWFsIHJlY29yZGluZyBzZXF1ZW5jZSB1c2luZyBhbiBBdWRpb0lucHV0U3RyZWFtLgotVEVTVChBdWRpb0lucHV0VGVzdCwgUmVjb3JkKSB7Ci0gIHNjb3BlZF9wdHI8QXVkaW9NYW5hZ2VyPiBhdWRpb19tYW4oQXVkaW9NYW5hZ2VyOjpDcmVhdGUoKSk7Ci0gIGlmICghQ2FuUnVuQXVkaW9UZXN0cyhhdWRpb19tYW4uZ2V0KCkpKQotICAgIHJldHVybjsKLSAgTWVzc2FnZUxvb3AgbWVzc2FnZV9sb29wKE1lc3NhZ2VMb29wOjpUWVBFX0RFRkFVTFQpOwotICBBdWRpb0lucHV0U3RyZWFtKiBhaXMgPSBDcmVhdGVUZXN0QXVkaW9JbnB1dFN0cmVhbShhdWRpb19tYW4uZ2V0KCkpOwotICBFWFBFQ1RfVFJVRShhaXMtPk9wZW4oKSk7Ci0KLSAgVGVzdElucHV0Q2FsbGJhY2sgdGVzdF9jYWxsYmFjayhrU2FtcGxlc1BlclBhY2tldCAqIDQpOwotICBhaXMtPlN0YXJ0KCZ0ZXN0X2NhbGxiYWNrKTsKLSAgLy8gVmVyaWZ5IGF0IGxlYXN0IDUwMG1zIHdvcnRoIG9mIGF1ZGlvIHdhcyByZWNvcmRlZCwgYWZ0ZXIgZ2l2aW5nIHN1ZmZpY2llbnQKLSAgLy8gZXh0cmEgdGltZS4KLSAgbWVzc2FnZV9sb29wLlBvc3REZWxheWVkVGFzaygKLSAgICAgIEZST01fSEVSRSwKLSAgICAgIE1lc3NhZ2VMb29wOjpRdWl0Q2xvc3VyZSgpLAotICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDY5MCkpOwotICBtZXNzYWdlX2xvb3AuUnVuKCk7Ci0gIEVYUEVDVF9HRSh0ZXN0X2NhbGxiYWNrLmNhbGxiYWNrX2NvdW50KCksIDEpOwotICBFWFBFQ1RfRkFMU0UodGVzdF9jYWxsYmFjay5oYWRfZXJyb3IoKSk7Ci0KLSAgYWlzLT5TdG9wKCk7Ci0gIGFpcy0+Q2xvc2UoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9faW5wdXRfdm9sdW1lX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX2lucHV0X3ZvbHVtZV91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY3NTRjYy4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9faW5wdXRfdm9sdW1lX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlIDxjbWF0aD4KLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19pby5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX21hbmFnZXJfYmFzZS5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3V0aWwuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotI2lmIGRlZmluZWQoT1NfV0lOKQotI2luY2x1ZGUgImJhc2Uvd2luL3Njb3BlZF9jb21faW5pdGlhbGl6ZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby93aW4vY29yZV9hdWRpb191dGlsX3dpbi5oIgotI2VuZGlmCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIEF1ZGlvSW5wdXRWb2x1bWVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICBBdWRpb0lucHV0Vm9sdW1lVGVzdCgpCi0gICAgICA6IGF1ZGlvX21hbmFnZXJfKEF1ZGlvTWFuYWdlcjo6Q3JlYXRlKCkpCi0jaWYgZGVmaW5lZChPU19XSU4pCi0gICAgICAgLCBjb21faW5pdF8oYmFzZTo6d2luOjpTY29wZWRDT01Jbml0aWFsaXplcjo6a01UQSkKLSNlbmRpZgotICB7Ci0gIH0KLQotICBib29sIENhblJ1bkF1ZGlvVGVzdHMoKSB7Ci0jaWYgZGVmaW5lZChPU19XSU4pCi0gICAgLy8gVE9ETyhoZW5yaWthKTogYWRkIHN1cHBvcnQgZm9yIHZvbHVtZSBjb250cm9sIG9uIFdpbmRvd3MgWFAgYXMgd2VsbC4KLSAgICAvLyBGb3Igbm93LCB3ZSBtaWdodCBhcyB3ZWxsIHNpZ25hbCBmYWxzZSBhbHJlYWR5IGhlcmUgdG8gYXZvaWQgcnVubmluZwotICAgIC8vIHRoZXNlIHRlc3RzIG9uIFdpbmRvd3MgWFAuCi0gICAgaWYgKCFDb3JlQXVkaW9VdGlsOjpJc1N1cHBvcnRlZCgpKQotICAgICAgcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0gICAgaWYgKCFhdWRpb19tYW5hZ2VyXy5nZXQoKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiBhdWRpb19tYW5hZ2VyXy0+SGFzQXVkaW9JbnB1dERldmljZXMoKTsKLSAgfQotCi0gIC8vIEhlbHBlciBtZXRob2Qgd2hpY2ggY2hlY2tzIGlmIHRoZSBzdHJlYW0gaGFzIHZvbHVtZSBzdXBwb3J0LgotICBib29sIEhhc0RldmljZVZvbHVtZUNvbnRyb2woQXVkaW9JbnB1dFN0cmVhbSogc3RyZWFtKSB7Ci0gICAgaWYgKCFzdHJlYW0pCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gKHN0cmVhbS0+R2V0TWF4Vm9sdW1lKCkgIT0gMC4wKTsKLSAgfQotCi0gIEF1ZGlvSW5wdXRTdHJlYW0qIENyZWF0ZUFuZE9wZW5TdHJlYW0oY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCkgewotICAgIEF1ZGlvUGFyYW1ldGVyczo6Rm9ybWF0IGZvcm1hdCA9IEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xPV19MQVRFTkNZOwotICAgIENoYW5uZWxMYXlvdXQgY2hhbm5lbF9sYXlvdXQgPQotICAgICAgICBtZWRpYTo6R2V0QXVkaW9JbnB1dEhhcmR3YXJlQ2hhbm5lbExheW91dChkZXZpY2VfaWQpOwotICAgIGludCBiaXRzX3Blcl9zYW1wbGUgPSAxNjsKLSAgICBpbnQgc2FtcGxlX3JhdGUgPQotICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KG1lZGlhOjpHZXRBdWRpb0lucHV0SGFyZHdhcmVTYW1wbGVSYXRlKGRldmljZV9pZCkpOwotICAgIGludCBzYW1wbGVzX3Blcl9wYWNrZXQgPSAwOwotI2lmIGRlZmluZWQoT1NfTUFDT1NYKQotICAgIHNhbXBsZXNfcGVyX3BhY2tldCA9IChzYW1wbGVfcmF0ZSAvIDEwMCk7Ci0jZWxpZiBkZWZpbmVkKE9TX0xJTlVYKSB8fCBkZWZpbmVkKE9TX09QRU5CU0QpCi0gICAgc2FtcGxlc19wZXJfcGFja2V0ID0gKHNhbXBsZV9yYXRlIC8gMTAwKTsKLSNlbGlmIGRlZmluZWQoT1NfV0lOKQotICAgIGlmIChzYW1wbGVfcmF0ZSA9PSA0NDEwMCkKLSAgICAgIHNhbXBsZXNfcGVyX3BhY2tldCA9IDQ0ODsKLSAgICBlbHNlCi0gICAgICBzYW1wbGVzX3Blcl9wYWNrZXQgPSAoc2FtcGxlX3JhdGUgLyAxMDApOwotI2Vsc2UKLSNlcnJvciBVbnN1cHBvcnRlZCBwbGF0Zm9ybQotI2VuZGlmCi0gICAgQXVkaW9JbnB1dFN0cmVhbSogYWlzID0gYXVkaW9fbWFuYWdlcl8tPk1ha2VBdWRpb0lucHV0U3RyZWFtKAotICAgICAgICBBdWRpb1BhcmFtZXRlcnMoZm9ybWF0LCBjaGFubmVsX2xheW91dCwgc2FtcGxlX3JhdGUsIGJpdHNfcGVyX3NhbXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNfcGVyX3BhY2tldCksCi0gICAgICAgIGRldmljZV9pZCk7Ci0gICAgRVhQRUNUX1RSVUUoTlVMTCAhPSBhaXMpOwotCi0jaWYgZGVmaW5lZChPU19MSU5VWCkgfHwgZGVmaW5lZChPU19PUEVOQlNEKQotICAgIC8vIFNvbWUgbGludXggZGV2aWNlcyBkbyBub3Qgc3VwcG9ydCBvdXIgc2V0dGluZ3MsIHdlIG1heSBmYWlsIHRvIG9wZW4KLSAgICAvLyB0aG9zZSBkZXZpY2VzLgotICAgIGlmICghYWlzLT5PcGVuKCkpIHsKLSAgICAgIC8vIERlZmF1bHQgZGV2aWNlIHNob3VsZCBhbHdheXMgYmUgYWJsZSB0byBiZSBvcGVuZWQuCi0gICAgICBFWFBFQ1RfVFJVRShBdWRpb01hbmFnZXJCYXNlOjprRGVmYXVsdERldmljZUlkICE9IGRldmljZV9pZCk7Ci0gICAgICBhaXMtPkNsb3NlKCk7Ci0gICAgICBhaXMgPSBOVUxMOwotICAgIH0KLSNlbGlmIGRlZmluZWQoT1NfV0lOKSB8fCBkZWZpbmVkKE9TX01BQ09TWCkKLSAgICBFWFBFQ1RfVFJVRShhaXMtPk9wZW4oKSk7Ci0jZW5kaWYKLQotICAgIHJldHVybiBhaXM7Ci0gIH0KLQotICBzY29wZWRfcHRyPEF1ZGlvTWFuYWdlcj4gYXVkaW9fbWFuYWdlcl87Ci0KLSNpZiBkZWZpbmVkKE9TX1dJTikKLSAgYmFzZTo6d2luOjpTY29wZWRDT01Jbml0aWFsaXplciBjb21faW5pdF87Ci0jZW5kaWYKLX07Ci0KLVRFU1RfRihBdWRpb0lucHV0Vm9sdW1lVGVzdCwgSW5wdXRWb2x1bWVUZXN0KSB7Ci0gIGlmICghQ2FuUnVuQXVkaW9UZXN0cygpKQotICAgIHJldHVybjsKLQotICAvLyBSZXRyaWV2ZSBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBpbnB1dCBkZXZpY2VzLgotICBBdWRpb0RldmljZU5hbWVzIGRldmljZV9uYW1lczsKLSAgYXVkaW9fbWFuYWdlcl8tPkdldEF1ZGlvSW5wdXREZXZpY2VOYW1lcygmZGV2aWNlX25hbWVzKTsKLSAgaWYgKGRldmljZV9uYW1lcy5lbXB0eSgpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJDb3VsZCBub3QgZmluZCBhbnkgYXZhaWxhYmxlIGlucHV0IGRldmljZSI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gU2NhbiBhbGwgYXZhaWxhYmxlIGlucHV0IGRldmljZXMgYW5kIHJlcGVhdCB0aGUgc2FtZSB0ZXN0IGZvciBhbGwgb2YgdGhlbS4KLSAgZm9yIChBdWRpb0RldmljZU5hbWVzOjpjb25zdF9pdGVyYXRvciBpdCA9IGRldmljZV9uYW1lcy5iZWdpbigpOwotICAgICAgIGl0ICE9IGRldmljZV9uYW1lcy5lbmQoKTsKLSAgICAgICArK2l0KSB7Ci0gICAgQXVkaW9JbnB1dFN0cmVhbSogYWlzID0gQ3JlYXRlQW5kT3BlblN0cmVhbShpdC0+dW5pcXVlX2lkKTsKLSAgICBpZiAoIWFpcykgewotICAgICAgRExPRyhXQVJOSU5HKSA8PCAiRmFpbGVkIHRvIG9wZW4gc3RyZWFtIGZvciBkZXZpY2UgIiA8PCBpdC0+dW5pcXVlX2lkOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgaWYgKCFIYXNEZXZpY2VWb2x1bWVDb250cm9sKGFpcykpIHsKLSAgICAgIERMT0coV0FSTklORykgPDwgIkRldmljZTogIiA8PCBpdC0+dW5pcXVlX2lkCi0gICAgICAgICAgICAgICAgICAgIDw8ICIsIGRvZXMgbm90IGhhdmUgdm9sdW1lIGNvbnRyb2wuIjsKLSAgICAgIGFpcy0+Q2xvc2UoKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIGRvdWJsZSBtYXhfdm9sdW1lID0gYWlzLT5HZXRNYXhWb2x1bWUoKTsKLSAgICBFWFBFQ1RfR1QobWF4X3ZvbHVtZSwgMC4wKTsKLQotICAgIC8vIFN0b3JlIHRoZSBjdXJyZW50IGlucHV0LWRldmljZSB2b2x1bWUgbGV2ZWwuCi0gICAgZG91YmxlIG9yaWdpbmFsX3ZvbHVtZSA9IGFpcy0+R2V0Vm9sdW1lKCk7Ci0gICAgRVhQRUNUX0dFKG9yaWdpbmFsX3ZvbHVtZSwgMC4wKTsKLSNpZiBkZWZpbmVkKE9TX1dJTikgfHwgZGVmaW5lZChPU19NQUNPU1gpCi0gICAgLy8gTm90ZSB0aGF0IHxvcmlnaW5hbF92b2x1bWV8IGNhbiBiZSBoaWdoZXIgdGhhbiB8bWF4X3ZvbHVtZXwgb24gTGludXguCi0gICAgRVhQRUNUX0xFKG9yaWdpbmFsX3ZvbHVtZSwgbWF4X3ZvbHVtZSk7Ci0jZW5kaWYKLQotICAgIC8vIFNldCB0aGUgdm9sdW1lIHRvIHRoZSBtYXhpdW11bSBsZXZlbC4uCi0gICAgYWlzLT5TZXRWb2x1bWUobWF4X3ZvbHVtZSk7Ci0gICAgZG91YmxlIGN1cnJlbnRfdm9sdW1lID0gYWlzLT5HZXRWb2x1bWUoKTsKLSAgICBFWFBFQ1RfRVEobWF4X3ZvbHVtZSwgY3VycmVudF92b2x1bWUpOwotCi0gICAgLy8gU2V0IHRoZSB2b2x1bWUgdG8gdGhlIG1pbmludW0gbGV2ZWwgKD0wKS4KLSAgICBkb3VibGUgbmV3X3ZvbHVtZSA9IDAuMDsKLSAgICBhaXMtPlNldFZvbHVtZShuZXdfdm9sdW1lKTsKLSAgICBjdXJyZW50X3ZvbHVtZSA9IGFpcy0+R2V0Vm9sdW1lKCk7Ci0gICAgRVhQRUNUX0VRKG5ld192b2x1bWUsIGN1cnJlbnRfdm9sdW1lKTsKLQotICAgIC8vIFNldCB0aGUgdm9sdW1lIHRvIHRoZSBtaWQgbGV2ZWwgKDUwJSBvZiBtYXgpLgotICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBhYnNvbHV0ZSBlcnJvciBpcyBzbWFsbCBlbm91Z2guCi0gICAgbmV3X3ZvbHVtZSA9IG1heF92b2x1bWUgLyAyOwotICAgIGFpcy0+U2V0Vm9sdW1lKG5ld192b2x1bWUpOwotICAgIGN1cnJlbnRfdm9sdW1lID0gYWlzLT5HZXRWb2x1bWUoKTsKLSAgICBFWFBFQ1RfTFQoY3VycmVudF92b2x1bWUsIG1heF92b2x1bWUpOwotICAgIEVYUEVDVF9HVChjdXJyZW50X3ZvbHVtZSwgMCk7Ci0gICAgRVhQRUNUX05FQVIoY3VycmVudF92b2x1bWUsIG5ld192b2x1bWUsIDAuMjUgKiBtYXhfdm9sdW1lKTsKLQotICAgIC8vIFJlc3RvcmVzIHRoZSB2b2x1bWUgdG8gdGhlIG9yaWdpbmFsIHZhbHVlLgotICAgIGFpcy0+U2V0Vm9sdW1lKG9yaWdpbmFsX3ZvbHVtZSk7Ci0gICAgY3VycmVudF92b2x1bWUgPSBhaXMtPkdldFZvbHVtZSgpOwotICAgIEVYUEVDVF9FUShvcmlnaW5hbF92b2x1bWUsIGN1cnJlbnRfdm9sdW1lKTsKLQotICAgIGFpcy0+Q2xvc2UoKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb19pby5oIGIvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX2lvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YjlhMzYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX2lvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9BVURJT19BVURJT19JT19IXwotI2RlZmluZSBNRURJQV9BVURJT19BVURJT19JT19IXwotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fYnVmZmVyc19zdGF0ZS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fYnVzLmgiCi0KLS8vIExvdy1sZXZlbCBhdWRpbyBvdXRwdXQgc3VwcG9ydC4gVG8gbWFrZSBzb3VuZCB0aGVyZSBhcmUgMyBvYmplY3RzIGludm9sdmVkOgotLy8gLSBBdWRpb1NvdXJjZSA6IHByb2R1Y2VzIGF1ZGlvIHNhbXBsZXMgb24gYSBwdWxsIG1vZGVsLiBJbXBsZW1lbnRzCi0vLyAgIHRoZSBBdWRpb1NvdXJjZUNhbGxiYWNrIGludGVyZmFjZS4KLS8vIC0gQXVkaW9PdXRwdXRTdHJlYW0gOiB1c2VzIHRoZSBBdWRpb1NvdXJjZSB0byByZW5kZXIgYXVkaW8gb24gYSBnaXZlbgotLy8gICBjaGFubmVsLCBmb3JtYXQgYW5kIHNhbXBsZSBmcmVxdWVuY3kgY29uZmlndXJhdGlvbi4gRGF0YSBmcm9tIHRoZQotLy8gICBBdWRpb1NvdXJjZSBpcyBkZWxpdmVyZWQgaW4gYSAncHVsbCcgbW9kZWwuCi0vLyAtIEF1ZGlvTWFuYWdlciA6IGZhY3RvcnkgZm9yIHRoZSBBdWRpb091dHB1dFN0cmVhbSBvYmplY3RzLCBtYW5hZ2VyCi0vLyAgIG9mIHRoZSBoYXJkd2FyZSByZXNvdXJjZXMgYW5kIG1peGVyIGNvbnRyb2wuCi0vLwotLy8gVGhlIG51bWJlciBhbmQgY29uZmlndXJhdGlvbiBvZiBBdWRpb091dHB1dFN0cmVhbSBkb2VzIG5vdCBuZWVkIHRvIG1hdGNoIHRoZQotLy8gcGh5c2ljYWxseSBhdmFpbGFibGUgaGFyZHdhcmUgcmVzb3VyY2VzLiBGb3IgZXhhbXBsZSB5b3UgY2FuIGhhdmU6Ci0vLwotLy8gIE1vbm9QQ01Tb3VyY2UxIC0tPiBNb25vUENNU3RyZWFtMSAtLT4gfCAgICAgICB8IC0tPiBhdWRpbyBsZWZ0IGNoYW5uZWwKLS8vICBTdGVyZW9QQ01Tb3VyY2UgLT4gU3RlcmVvUENNU3RyZWFtIC0+IHwgbWl4ZXIgfAotLy8gIE1vbm9QQ01Tb3VyY2UyIC0tPiBNb25vUENNU3RyZWFtMiAtLT4gfCAgICAgICB8IC0tPiBhdWRpbyByaWdodCBjaGFubmVsCi0vLwotLy8gVGhpcyBmYWNpbGl0eSdzIG9iamVjdGl2ZSBpcyBtaXggYW5kIHJlbmRlciBhdWRpbyB3aXRoIGxvdyBvdmVyaGVhZCB1c2luZwotLy8gdGhlIE9TIGJhc2ljIGF1ZGlvIHN1cHBvcnQsIGFic3RyYWN0aW5nIGFzIG11Y2ggYXMgcG9zc2libGUgdGhlCi0vLyBpZGlvc3luY3Jhc2llcyBvZiBlYWNoIHBsYXRmb3JtLiBOb24tZ29hbHM6Ci0vLyAtIFBvc2l0aW9uYWwsIDNkIGF1ZGlvCi0vLyAtIERlcGVuZGVuY2Ugb24gbm9uLWRlZmF1bHQgbGlicmFyaWVzIHN1Y2ggYXMgRGlyZWN0WCA5LCAxMCwgWEF1ZGlvCi0vLyAtIERpZ2l0YWwgc2lnbmFsIHByb2Nlc3Npbmcgb3IgZWZmZWN0cwotLy8gLSBFeHRyYSBmZWF0dXJlcyBpZiBhIHNwZWNpZmljIGhhcmR3YXJlIGlzIGluc3RhbGxlZCAoRUFYLCBYLWZpKQotLy8KLS8vIFRoZSBwcmltYXJ5IGNsaWVudCBvZiB0aGlzIGZhY2lsaXR5IGlzIGF1ZGlvIGNvbWluZyBmcm9tIHNldmVyYWwgdGFicy4KLS8vIFNwZWNpZmljYWxseSBmb3IgdGhpcyBjYXNlIHdlIGF2b2lkIHN1cHBvcnRpbmcgY29tcGxleCBmb3JtYXRzIHN1Y2ggYXMgTVAzCi0vLyBvciBXTUEuIENvbXBsZXggZm9ybWF0IGRlY29kaW5nIHNob3VsZCBiZSBkb25lIGJ5IHRoZSByZW5kZXJlcnMuCi0KLQotLy8gTW9kZWxzIGFuIGF1ZGlvIHN0cmVhbSB0aGF0IGdldHMgcmVuZGVyZWQgdG8gdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dC4KLS8vIEJlY2F1c2Ugd2Ugc3VwcG9ydCBtb3JlIGF1ZGlvIHN0cmVhbXMgdGhhbiBwaHlzaWNhbGx5IGF2YWlsYWJsZSBjaGFubmVscwotLy8gYSBnaXZlbiBBdWRpb091dHB1dFN0cmVhbSBtaWdodCBvciBtaWdodCBub3QgdGFsayBkaXJlY3RseSB0byBoYXJkd2FyZS4KLS8vIEFuIGF1ZGlvIHN0cmVhbSBhbGxvY2F0ZXMgc2V2ZXJhbCBidWZmZXJzIGZvciBhdWRpbyBkYXRhIGFuZCBjYWxscwotLy8gQXVkaW9Tb3VyY2VDYWxsYmFjazo6T25Nb3JlRGF0YSgpIHBlcmlvZGljYWxseSB0byBmaWxsIHRoZXNlIGJ1ZmZlcnMsCi0vLyBhcyB0aGUgZGF0YSBpcyB3cml0dGVuIHRvIHRoZSBhdWRpbyBkZXZpY2UuIFNpemUgb2YgZWFjaCBwYWNrZXQgaXMgZGV0ZXJtaW5lZAotLy8gYnkgfHNhbXBsZXNfcGVyX3BhY2tldHwgc3BlY2lmaWVkIGluIEF1ZGlvUGFyYW1ldGVycyAgd2hlbiB0aGUgc3RyZWFtIGlzCi0vLyBjcmVhdGVkLgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBNRURJQV9FWFBPUlQgQXVkaW9PdXRwdXRTdHJlYW0gewotIHB1YmxpYzoKLSAgLy8gQXVkaW8gc291cmNlcyBtdXN0IGltcGxlbWVudCBBdWRpb1NvdXJjZUNhbGxiYWNrLiBUaGlzIGludGVyZmFjZSB3aWxsIGJlCi0gIC8vIGNhbGxlZCBpbiBhIHJhbmRvbSB0aHJlYWQgd2hpY2ggdmVyeSBsaWtlbHkgaXMgYSBoaWdoIHByaW9yaXR5IHRocmVhZC4gRG8KLSAgLy8gbm90IHJlbHkgb24gdXNpbmcgdGhpcyB0aHJlYWQgVExTIG9yIG1ha2UgY2FsbHMgdGhhdCBhbHRlciB0aGUgdGhyZWFkCi0gIC8vIGl0c2VsZiBzdWNoIGFzIGNyZWF0aW5nIFdpbmRvd3Mgb3IgaW5pdGlhbGl6aW5nIENPTS4KLSAgY2xhc3MgTUVESUFfRVhQT1JUIEF1ZGlvU291cmNlQ2FsbGJhY2sgewotICAgcHVibGljOgotICAgIC8vIFByb3ZpZGUgbW9yZSBkYXRhIGJ5IGZ1bGx5IGZpbGxpbmcgfGRlc3R8LiAgVGhlIHNvdXJjZSB3aWxsIHJldHVybgotICAgIC8vIHRoZSBudW1iZXIgb2YgZnJhbWVzIGl0IGZpbGxlZC4gIHxidWZmZXJzX3N0YXRlfCBjb250YWlucyBjdXJyZW50IHN0YXRlCi0gICAgLy8gb2YgdGhlIGJ1ZmZlcnMsIGFuZCBjYW4gYmUgdXNlZCBieSB0aGUgc291cmNlIHRvIGNhbGN1bGF0ZSBkZWxheS4KLSAgICB2aXJ0dWFsIGludCBPbk1vcmVEYXRhKEF1ZGlvQnVzKiBkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJzU3RhdGUgYnVmZmVyc19zdGF0ZSkgPSAwOwotCi0gICAgdmlydHVhbCBpbnQgT25Nb3JlSU9EYXRhKEF1ZGlvQnVzKiBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVzKiBkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlcnNTdGF0ZSBidWZmZXJzX3N0YXRlKSA9IDA7Ci0KLSAgICAvLyBUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgcGxheWluZyBhIGJ1ZmZlci4gQXVkaW8gc291cmNlIGNhbm5vdCBiZQotICAgIC8vIGRlc3Ryb3llZCB5ZXQuIE5vIGRpcmVjdCBhY3Rpb24gbmVlZGVkIGJ5IHRoZSBBdWRpb1N0cmVhbSwgYnV0IGl0IGlzCi0gICAgLy8gYSBnb29kIHBsYWNlIHRvIHN0b3AgYWNjdW11bGF0aW5nIHNvdW5kIGRhdGEgc2luY2UgaXMgaXMgbGlrZWx5IHRoYXQKLSAgICAvLyBwbGF5YmFjayB3aWxsIG5vdCBjb250aW51ZS4gfGNvZGV8IGlzIGFuIGVycm9yIGNvZGUgdGhhdCBpcyBwbGF0Zm9ybQotICAgIC8vIHNwZWNpZmljLgotICAgIHZpcnR1YWwgdm9pZCBPbkVycm9yKEF1ZGlvT3V0cHV0U3RyZWFtKiBzdHJlYW0sIGludCBjb2RlKSA9IDA7Ci0KLSAgICAvLyBEZXByZWNhdGVkLiAgRE8gTk9UIFVTRS4gIFdhaXRzIHVudGlsIGRhdGEgYmVjb21lcyBhdmFpbGFibGUuICBVc2VkIG9ubHkKLSAgICAvLyBieSBXaW5kb3dzJyBXYXZlT3V0IGNsaWVudHMgd2hpY2ggbWF5IGJlIGV4dHJlbWVseSBsYWdneS4gIFdpbGwgeWllbGQgdGhlCi0gICAgLy8gY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHJlbmRlcmVyIGNsaWVudCBoYXMgd3JpdHRlbiBpdHMgYXVkaW8gZGF0YSBvcgotICAgIC8vIDEuNSBzZWNvbmRzIGhhdmUgZWxhcHNlZC4KLSAgICB2aXJ0dWFsIHZvaWQgV2FpdFRpbGxEYXRhUmVhZHkoKSB7fQotCi0gICBwcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+QXVkaW9Tb3VyY2VDYWxsYmFjaygpIHt9Ci0gIH07Ci0KLSAgdmlydHVhbCB+QXVkaW9PdXRwdXRTdHJlYW0oKSB7fQotCi0gIC8vIE9wZW4gdGhlIHN0cmVhbS4gZmFsc2UgaXMgcmV0dXJuZWQgaWYgdGhlIHN0cmVhbSBjYW5ub3QgYmUgb3BlbmVkLiAgT3BlbigpCi0gIC8vIG11c3QgYWx3YXlzIGJlIGZvbGxvd2VkIGJ5IGEgY2FsbCB0byBDbG9zZSgpIGV2ZW4gaWYgT3BlbigpIGZhaWxzLgotICB2aXJ0dWFsIGJvb2wgT3BlbigpID0gMDsKLQotICAvLyBTdGFydHMgcGxheWluZyBhdWRpbyBhbmQgZ2VuZXJhdGluZyBBdWRpb1NvdXJjZUNhbGxiYWNrOjpPbk1vcmVEYXRhKCkuCi0gIC8vIFNpbmNlIGltcGxlbWVudG9yIG9mIEF1ZGlvT3V0cHV0U3RyZWFtIG1heSBoYXZlIGludGVybmFsIGJ1ZmZlcnMsIHJpZ2h0Ci0gIC8vIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgaW5pdGlhbCBidWZmZXJzIGFyZSBmZXRjaGVkLgotICAvLwotICAvLyBUaGUgb3V0cHV0IHN0cmVhbSBkb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiB0aGlzIGNhbGxiYWNrLgotICB2aXJ0dWFsIHZvaWQgU3RhcnQoQXVkaW9Tb3VyY2VDYWxsYmFjayogY2FsbGJhY2spID0gMDsKLQotICAvLyBTdG9wcyBwbGF5aW5nIGF1ZGlvLiBFZmZlY3QgbWlnaHQgbm90IGJlIGluc3RhbnRhbmVvdXMgYXMgdGhlIGhhcmR3YXJlCi0gIC8vIG1pZ2h0IGhhdmUgbG9ja2VkIGF1ZGlvIGRhdGEgdGhhdCBpcyBwcm9jZXNzaW5nLgotICB2aXJ0dWFsIHZvaWQgU3RvcCgpID0gMDsKLQotICAvLyBTZXRzIHRoZSByZWxhdGl2ZSB2b2x1bWUsIHdpdGggcmFuZ2UgWzAuMCwgMS4wXSBpbmNsdXNpdmUuCi0gIHZpcnR1YWwgdm9pZCBTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgPSAwOwotCi0gIC8vIEdldHMgdGhlIHJlbGF0aXZlIHZvbHVtZSwgd2l0aCByYW5nZSBbMC4wLCAxLjBdIGluY2x1c2l2ZS4KLSAgdmlydHVhbCB2b2lkIEdldFZvbHVtZShkb3VibGUqIHZvbHVtZSkgPSAwOwotCi0gIC8vIENsb3NlIHRoZSBzdHJlYW0uIFRoaXMgYWxzbyBnZW5lcmF0ZXMgQXVkaW9Tb3VyY2VDYWxsYmFjazo6T25DbG9zZSgpLgotICAvLyBBZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLCB0aGUgb2JqZWN0IHNob3VsZCBub3QgYmUgdXNlZCBhbnltb3JlLgotICB2aXJ0dWFsIHZvaWQgQ2xvc2UoKSA9IDA7Ci19OwotCi0vLyBNb2RlbHMgYW4gYXVkaW8gc2luayByZWNlaXZpbmcgcmVjb3JkZWQgYXVkaW8gZnJvbSB0aGUgYXVkaW8gZHJpdmVyLgotY2xhc3MgTUVESUFfRVhQT1JUIEF1ZGlvSW5wdXRTdHJlYW0gewotIHB1YmxpYzoKLSAgY2xhc3MgTUVESUFfRVhQT1JUIEF1ZGlvSW5wdXRDYWxsYmFjayB7Ci0gICBwdWJsaWM6Ci0gICAgLy8gQ2FsbGVkIGJ5IHRoZSBhdWRpbyByZWNvcmRlciB3aGVuIGEgZnVsbCBwYWNrZXQgb2YgYXVkaW8gZGF0YSBpcwotICAgIC8vIGF2YWlsYWJsZS4gVGhpcyBpcyBjYWxsZWQgZnJvbSBhIHNwZWNpYWwgYXVkaW8gdGhyZWFkIGFuZCB0aGUKLSAgICAvLyBpbXBsZW1lbnRhdGlvbiBzaG91bGQgcmV0dXJuIGFzIHNvb24gYXMgcG9zc2libGUuCi0gICAgdmlydHVhbCB2b2lkIE9uRGF0YShBdWRpb0lucHV0U3RyZWFtKiBzdHJlYW0sIGNvbnN0IHVpbnQ4KiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgc2l6ZSwgdWludDMyIGhhcmR3YXJlX2RlbGF5X2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZvbHVtZSkgPSAwOwotCi0gICAgLy8gVGhlIHN0cmVhbSBpcyBkb25lIHdpdGggdGhpcyBjYWxsYmFjaywgdGhlIGxhc3QgY2FsbCByZWNlaXZlZCBieSB0aGlzCi0gICAgLy8gYXVkaW8gc2luay4KLSAgICB2aXJ0dWFsIHZvaWQgT25DbG9zZShBdWRpb0lucHV0U3RyZWFtKiBzdHJlYW0pID0gMDsKLQotICAgIC8vIFRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSByZWNvcmRpbmcgYXVkaW8uIFRoZSBhdWRpbyBzaW5rIGNhbm5vdCBiZQotICAgIC8vIGRlc3Ryb3llZCB5ZXQuIE5vIGRpcmVjdCBhY3Rpb24gbmVlZGVkIGJ5IHRoZSBBdWRpb0lucHV0U3RyZWFtLCBidXQgaXQKLSAgICAvLyBpcyBhIGdvb2QgcGxhY2UgdG8gc3RvcCBhY2N1bXVsYXRpbmcgc291bmQgZGF0YSBzaW5jZSBpcyBpcyBsaWtlbHkgdGhhdAotICAgIC8vIHJlY29yZGluZyB3aWxsIG5vdCBjb250aW51ZS4gfGNvZGV8IGlzIGFuIGVycm9yIGNvZGUgdGhhdCBpcyBwbGF0Zm9ybQotICAgIC8vIHNwZWNpZmljLgotICAgIHZpcnR1YWwgdm9pZCBPbkVycm9yKEF1ZGlvSW5wdXRTdHJlYW0qIHN0cmVhbSwgaW50IGNvZGUpID0gMDsKLQotICAgcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkF1ZGlvSW5wdXRDYWxsYmFjaygpIHt9Ci0gIH07Ci0KLSAgdmlydHVhbCB+QXVkaW9JbnB1dFN0cmVhbSgpIHt9Ci0KLSAgLy8gT3BlbiB0aGUgc3RyZWFtIGFuZCBwcmVwYXJlcyBpdCBmb3IgcmVjb3JkaW5nLiBDYWxsIFN0YXJ0KCkgdG8gYWN0dWFsbHkKLSAgLy8gYmVnaW4gcmVjb3JkaW5nLgotICB2aXJ0dWFsIGJvb2wgT3BlbigpID0gMDsKLQotICAvLyBTdGFydHMgcmVjb3JkaW5nIGF1ZGlvIGFuZCBnZW5lcmF0aW5nIEF1ZGlvSW5wdXRDYWxsYmFjazo6T25EYXRhKCkuCi0gIC8vIFRoZSBpbnB1dCBzdHJlYW0gZG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YgdGhpcyBjYWxsYmFjay4KLSAgdmlydHVhbCB2b2lkIFN0YXJ0KEF1ZGlvSW5wdXRDYWxsYmFjayogY2FsbGJhY2spID0gMDsKLQotICAvLyBTdG9wcyByZWNvcmRpbmcgYXVkaW8uIEVmZmVjdCBtaWdodCBub3QgYmUgaW5zdGFudGFuZW91cyBhcyB0aGVyZSBjb3VsZCBiZQotICAvLyBwZW5kaW5nIGF1ZGlvIGNhbGxiYWNrcyBpbiB0aGUgcXVldWUgd2hpY2ggd2lsbCBiZSBpc3N1ZWQgZmlyc3QgYmVmb3JlCi0gIC8vIHJlY29yZGluZyBzdG9wcy4KLSAgdmlydHVhbCB2b2lkIFN0b3AoKSA9IDA7Ci0KLSAgLy8gQ2xvc2UgdGhlIHN0cmVhbS4gVGhpcyBhbHNvIGdlbmVyYXRlcyBBdWRpb0lucHV0Q2FsbGJhY2s6Ok9uQ2xvc2UoKS4gVGhpcwotICAvLyBzaG91bGQgYmUgdGhlIGxhc3QgY2FsbCBtYWRlIG9uIHRoaXMgb2JqZWN0LgotICB2aXJ0dWFsIHZvaWQgQ2xvc2UoKSA9IDA7Ci0KLSAgLy8gUmV0dXJucyB0aGUgbWF4aW11bSBtaWNyb3Bob25lIGFuYWxvZyB2b2x1bWUgb3IgMC4wIGlmIGRldmljZSBkb2VzIG5vdAotICAvLyBoYXZlIHZvbHVtZSBjb250cm9sLgotICB2aXJ0dWFsIGRvdWJsZSBHZXRNYXhWb2x1bWUoKSA9IDA7Ci0KLSAgLy8gU2V0cyB0aGUgbWljcm9waG9uZSBhbmFsb2cgdm9sdW1lLCB3aXRoIHJhbmdlIFswLCBtYXhfdm9sdW1lXSBpbmNsdXNpdmUuCi0gIHZpcnR1YWwgdm9pZCBTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgPSAwOwotCi0gIC8vIFJldHVybnMgdGhlIG1pY3JvcGhvbmUgYW5hbG9nIHZvbHVtZSwgd2l0aCByYW5nZSBbMCwgbWF4X3ZvbHVtZV0gaW5jbHVzaXZlLgotICB2aXJ0dWFsIGRvdWJsZSBHZXRWb2x1bWUoKSA9IDA7Ci0KLSAgLy8gU2V0cyB0aGUgQXV0b21hdGljIEdhaW4gQ29udHJvbCAoQUdDKSBzdGF0ZS4KLSAgdmlydHVhbCB2b2lkIFNldEF1dG9tYXRpY0dhaW5Db250cm9sKGJvb2wgZW5hYmxlZCkgPSAwOwotCi0gIC8vIFJldHVybnMgdGhlIEF1dG9tYXRpYyBHYWluIENvbnRyb2wgKEFHQykgc3RhdGUuCi0gIHZpcnR1YWwgYm9vbCBHZXRBdXRvbWF0aWNHYWluQ29udHJvbCgpID0gMDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0FVRElPX0FVRElPX0lPX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fbG93X2xhdGVuY3lfaW5wdXRfb3V0cHV0X3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX2xvd19sYXRlbmN5X2lucHV0X291dHB1dF91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYzMzIxYS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fbG93X2xhdGVuY3lfaW5wdXRfb3V0cHV0X3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDY0ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJiYXNlL2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiYmFzZS9maWxlX3V0aWwuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJiYXNlL3BhdGhfc2VydmljZS5oIgotI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKLSNpbmNsdWRlICJiYXNlL3Rlc3QvdGVzdF90aW1lb3V0cy5oIgotI2luY2x1ZGUgImJhc2UvdGltZS5oIgotI2luY2x1ZGUgImJ1aWxkL2J1aWxkX2NvbmZpZy5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX2lvLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fbWFuYWdlcl9iYXNlLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fdXRpbC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2Vla2FibGVfYnVmZmVyLmgiCi0jaW5jbHVkZSAidGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0KLSNpZiBkZWZpbmVkKE9TX0xJTlVYKSB8fCBkZWZpbmVkKE9TX09QRU5CU0QpCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vbGludXgvYXVkaW9fbWFuYWdlcl9saW51eC5oIgotI2VsaWYgZGVmaW5lZChPU19NQUNPU1gpCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vbWFjL2F1ZGlvX21hbmFnZXJfbWFjLmgiCi0jZWxpZiBkZWZpbmVkKE9TX1dJTikKLSNpbmNsdWRlICJiYXNlL3dpbi9zY29wZWRfY29tX2luaXRpYWxpemVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vd2luL2F1ZGlvX21hbmFnZXJfd2luLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vd2luL2NvcmVfYXVkaW9fdXRpbF93aW4uaCIKLSNlbGlmIGRlZmluZWQoT1NfQU5EUk9JRCkKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hbmRyb2lkL2F1ZGlvX21hbmFnZXJfYW5kcm9pZC5oIgotI2VuZGlmCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLSNpZiBkZWZpbmVkKE9TX0xJTlVYKSB8fCBkZWZpbmVkKE9TX09QRU5CU0QpCi10eXBlZGVmIEF1ZGlvTWFuYWdlckxpbnV4IEF1ZGlvTWFuYWdlckFueVBsYXRmb3JtOwotI2VsaWYgZGVmaW5lZChPU19NQUNPU1gpCi10eXBlZGVmIEF1ZGlvTWFuYWdlck1hYyBBdWRpb01hbmFnZXJBbnlQbGF0Zm9ybTsKLSNlbGlmIGRlZmluZWQoT1NfV0lOKQotdHlwZWRlZiBBdWRpb01hbmFnZXJXaW4gQXVkaW9NYW5hZ2VyQW55UGxhdGZvcm07Ci0jZWxpZiBkZWZpbmVkKE9TX0FORFJPSUQpCi10eXBlZGVmIEF1ZGlvTWFuYWdlckFuZHJvaWQgQXVkaW9NYW5hZ2VyQW55UGxhdGZvcm07Ci0jZW5kaWYKLQotLy8gTGltaXRzIHRoZSBudW1iZXIgb2YgZGVsYXkgbWVhc3VyZW1lbnRzIHdlIGNhbiBzdG9yZSBpbiBhbiBhcnJheSBhbmQKLS8vIHRoZW4gd3JpdGUgdG8gZmlsZSBhdCBlbmQgb2YgdGhlIFdBU0FQSUF1ZGlvSW5wdXRPdXRwdXRGdWxsRHVwbGV4IHRlc3QuCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhEZWxheU1lYXN1cmVtZW50cyA9IDEwMDA7Ci0KLS8vIE5hbWUgb2YgdGhlIG91dHB1dCB0ZXh0IGZpbGUuIFRoZSBvdXRwdXQgZmlsZSB3aWxsIGJlIHN0b3JlZCBpbiB0aGUKLS8vIGRpcmVjdG9yeSBjb250YWluaW5nIG1lZGlhX3VuaXR0ZXN0cy5leGUuCi0vLyBFeGFtcGxlOiBcc3JjXGJ1aWxkXERlYnVnXGF1ZGlvX2RlbGF5X3ZhbHVlc19tcy50eHQuCi0vLyBTZWUgY29tbWVudHMgZm9yIHRoZSBXQVNBUElBdWRpb0lucHV0T3V0cHV0RnVsbER1cGxleCB0ZXN0IGZvciBtb3JlIGRldGFpbHMKLS8vIGFib3V0IHRoZSBmaWxlIGZvcm1hdC4KLXN0YXRpYyBjb25zdCBjaGFyKiBrRGVsYXlWYWx1ZXNGaWxlTmFtZSA9ICJhdWRpb19kZWxheV92YWx1ZXNfbXMudHh0IjsKLQotLy8gQ29udGFpbnMgZGVsYXkgdmFsdWVzIHdoaWNoIGFyZSByZXBvcnRlZCBkdXJpbmcgdGhlIGZ1bGwtZHVwbGV4IHRlc3QuCi0vLyBUb3RhbCBkZWxheSA9IHxidWZmZXJfZGVsYXlfbXN8ICsgfGlucHV0X2RlbGF5X21zfCArIHxvdXRwdXRfZGVsYXlfbXN8Lgotc3RydWN0IEF1ZGlvRGVsYXlTdGF0ZSB7Ci0gIEF1ZGlvRGVsYXlTdGF0ZSgpCi0gICAgICA6IGRlbHRhX3RpbWVfbXMoMCksCi0gICAgICAgIGJ1ZmZlcl9kZWxheV9tcygwKSwKLSAgICAgICAgaW5wdXRfZGVsYXlfbXMoMCksCi0gICAgICAgIG91dHB1dF9kZWxheV9tcygwKSB7Ci0gIH0KLQotICAvLyBUaW1lIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBsYXN0IGRlbGF5IHJlcG9ydC4gVHlwaWNhbCB2YWx1ZSBpcyB+MTAgW21zXS4KLSAgaW50IGRlbHRhX3RpbWVfbXM7Ci0KLSAgLy8gU2l6ZSBvZiBpbnRlcm5hbCBzeW5jIGJ1ZmZlci4gVHlwaWNhbCB2YWx1ZSBpcyB+MCBbbXNdLgotICBpbnQgYnVmZmVyX2RlbGF5X21zOwotCi0gIC8vIFJlcG9ydGVkIGNhcHR1cmUvaW5wdXQgZGVsYXkuIFR5cGljYWwgdmFsdWUgaXMgfjEwIFttc10uCi0gIGludCBpbnB1dF9kZWxheV9tczsKLQotICAvLyBSZXBvcnRlZCByZW5kZXIvb3V0cHV0IGRlbGF5LiBUeXBpY2FsIHZhbHVlIGlzIH40MCBbbXNdLgotICBpbnQgb3V0cHV0X2RlbGF5X21zOwotfTsKLQotLy8gVGhpcyBjbGFzcyBtb2NrcyB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgYXVkaW8gbWFuYWdlciBhbmQgb3ZlcnJpZGVzCi0vLyB0aGUgR2V0TWVzc2FnZUxvb3AoKSBtZXRob2QgdG8gZW5zdXJlIHRoYXQgd2UgY2FuIHJ1biBvdXIgdGVzdHMgb24KLS8vIHRoZSBtYWluIHRocmVhZCBpbnN0ZWFkIG9mIHRoZSBhdWRpbyB0aHJlYWQuCi1jbGFzcyBNb2NrQXVkaW9NYW5hZ2VyIDogcHVibGljIEF1ZGlvTWFuYWdlckFueVBsYXRmb3JtIHsKLSBwdWJsaWM6Ci0gIE1vY2tBdWRpb01hbmFnZXIoKSB7fQotICB2aXJ0dWFsIH5Nb2NrQXVkaW9NYW5hZ2VyKCkge30KLQotICB2aXJ0dWFsIHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4gR2V0TWVzc2FnZUxvb3AoKSBPVkVSUklERSB7Ci0gICAgcmV0dXJuIE1lc3NhZ2VMb29wOjpjdXJyZW50KCktPm1lc3NhZ2VfbG9vcF9wcm94eSgpOwotICB9Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTW9ja0F1ZGlvTWFuYWdlcik7Ci19OwotCi0vLyBUZXN0IGZpeHR1cmUgY2xhc3MuCi1jbGFzcyBBdWRpb0xvd0xhdGVuY3lJbnB1dE91dHB1dFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICBBdWRpb0xvd0xhdGVuY3lJbnB1dE91dHB1dFRlc3QoKSB7fQotCi0gIHZpcnR1YWwgfkF1ZGlvTG93TGF0ZW5jeUlucHV0T3V0cHV0VGVzdCgpIHt9Ci0KLSAgQXVkaW9NYW5hZ2VyKiBhdWRpb19tYW5hZ2VyKCkgeyByZXR1cm4gJm1vY2tfYXVkaW9fbWFuYWdlcl87IH0KLSAgTWVzc2FnZUxvb3BGb3JVSSogbWVzc2FnZV9sb29wKCkgeyByZXR1cm4gJm1lc3NhZ2VfbG9vcF87IH0KLQotICAvLyBDb252ZW5pZW5jZSBtZXRob2Qgd2hpY2ggZW5zdXJlcyB0aGF0IHdlIGFyZSBub3QgcnVubmluZyBvbiB0aGUgYnVpbGQKLSAgLy8gYm90cyBhbmQgdGhhdCBhdCBsZWFzdCBvbmUgdmFsaWQgaW5wdXQgYW5kIG91dHB1dCBkZXZpY2UgY2FuIGJlIGZvdW5kLgotICBib29sIENhblJ1bkF1ZGlvVGVzdHMoKSB7Ci0gICAgYm9vbCBpbnB1dCA9IGF1ZGlvX21hbmFnZXIoKS0+SGFzQXVkaW9JbnB1dERldmljZXMoKTsKLSAgICBib29sIG91dHB1dCA9IGF1ZGlvX21hbmFnZXIoKS0+SGFzQXVkaW9PdXRwdXREZXZpY2VzKCk7Ci0gICAgTE9HX0lGKFdBUk5JTkcsICFpbnB1dCkgPDwgIk5vIGlucHV0IGRldmljZSBkZXRlY3RlZC4iOwotICAgIExPR19JRihXQVJOSU5HLCAhb3V0cHV0KSA8PCAiTm8gb3V0cHV0IGRldmljZSBkZXRlY3RlZC4iOwotICAgIHJldHVybiBpbnB1dCAmJiBvdXRwdXQ7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIE1lc3NhZ2VMb29wRm9yVUkgbWVzc2FnZV9sb29wXzsKLSAgTW9ja0F1ZGlvTWFuYWdlciBtb2NrX2F1ZGlvX21hbmFnZXJfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBdWRpb0xvd0xhdGVuY3lJbnB1dE91dHB1dFRlc3QpOwotfTsKLQotLy8gVGhpcyBhdWRpbyBzb3VyY2Uvc2luayBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgdXNlZCBmb3IgbWFudWFsIHRlc3RzCi0vLyBvbmx5IHNpbmNlIGRlbGF5IG1lYXN1cmVtZW50cyBhcmUgc3RvcmVkIG9uIGFuIG91dHB1dCB0ZXh0IGZpbGUuCi0vLyBBbGwgaW5jb21pbmcvcmVjb3JkZWQgYXVkaW8gcGFja2V0cyBhcmUgc3RvcmVkIGluIGFuIGludGVybWVkaWF0ZSBtZWRpYQotLy8gYnVmZmVyIHdoaWNoIHRoZSByZW5kZXJlciByZWFkcyBmcm9tIHdoZW4gaXQgbmVlZHMgYXVkaW8gZm9yIHBsYXlvdXQuCi0vLyBUaGUgdG90YWwgZWZmZWN0IGlzIHRoYXQgcmVjb3JkZWQgYXVkaW8gaXMgcGxheWVkIG91dCBpbiBsb29wIGJhY2sgdXNpbmcKLS8vIGEgc3luYyBidWZmZXIgYXMgdGVtcG9yYXJ5IHN0b3JhZ2UuCi1jbGFzcyBGdWxsRHVwbGV4QXVkaW9TaW5rU291cmNlCi0gICAgOiBwdWJsaWMgQXVkaW9JbnB1dFN0cmVhbTo6QXVkaW9JbnB1dENhbGxiYWNrLAotICAgICAgcHVibGljIEF1ZGlvT3V0cHV0U3RyZWFtOjpBdWRpb1NvdXJjZUNhbGxiYWNrIHsKLSBwdWJsaWM6Ci0gIEZ1bGxEdXBsZXhBdWRpb1NpbmtTb3VyY2UoaW50IHNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVzX3Blcl9wYWNrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzKQotICAgIDogc2FtcGxlX3JhdGVfKHNhbXBsZV9yYXRlKSwKLSAgICAgIHNhbXBsZXNfcGVyX3BhY2tldF8oc2FtcGxlc19wZXJfcGFja2V0KSwKLSAgICAgIGNoYW5uZWxzXyhjaGFubmVscyksCi0gICAgICBpbnB1dF9lbGVtZW50c190b193cml0ZV8oMCksCi0gICAgICBvdXRwdXRfZWxlbWVudHNfdG9fd3JpdGVfKDApLAotICAgICAgcHJldmlvdXNfd3JpdGVfdGltZV8oYmFzZTo6VGltZTo6Tm93KCkpIHsKLSAgICAvLyBTaXplIGluIGJ5dGVzIG9mIGVhY2ggYXVkaW8gZnJhbWUgKDQgYnl0ZXMgZm9yIDE2LWJpdCBzdGVyZW8gUENNKS4KLSAgICBmcmFtZV9zaXplXyA9ICgxNiAvIDgpICogY2hhbm5lbHNfOwotCi0gICAgLy8gU3RhcnQgd2l0aCB0aGUgc21hbGxlc3QgcG9zc2libGUgYnVmZmVyIHNpemUuIEl0IHdpbGwgYmUgaW5jcmVhc2VkCi0gICAgLy8gZHluYW1pY2FsbHkgZHVyaW5nIHRoZSB0ZXN0IGlmIHJlcXVpcmVkLgotICAgIGJ1ZmZlcl8ucmVzZXQoCi0gICAgICAgIG5ldyBtZWRpYTo6U2Vla2FibGVCdWZmZXIoMCwgc2FtcGxlc19wZXJfcGFja2V0XyAqIGZyYW1lX3NpemVfKSk7Ci0KLSAgICBmcmFtZXNfdG9fbXNfID0gc3RhdGljX2Nhc3Q8ZG91YmxlPigxMDAwLjAgLyBzYW1wbGVfcmF0ZV8pOwotICAgIGRlbGF5X3N0YXRlc18ucmVzZXQobmV3IEF1ZGlvRGVsYXlTdGF0ZVtrTWF4RGVsYXlNZWFzdXJlbWVudHNdKTsKLSAgfQotCi0gIHZpcnR1YWwgfkZ1bGxEdXBsZXhBdWRpb1NpbmtTb3VyY2UoKSB7Ci0gICAgLy8gR2V0IGNvbXBsZXRlIGZpbGUgcGF0aCB0byBvdXRwdXQgZmlsZSBpbiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcKLSAgICAvLyBtZWRpYV91bml0dGVzdHMuZXhlLiBFeGFtcGxlOiBzcmMvYnVpbGQvRGVidWcvYXVkaW9fZGVsYXlfdmFsdWVzX21zLnR4dC4KLSAgICBGaWxlUGF0aCBmaWxlX25hbWU7Ci0gICAgRVhQRUNUX1RSVUUoUGF0aFNlcnZpY2U6OkdldChiYXNlOjpESVJfRVhFLCAmZmlsZV9uYW1lKSk7Ci0gICAgZmlsZV9uYW1lID0gZmlsZV9uYW1lLkFwcGVuZEFTQ0lJKGtEZWxheVZhbHVlc0ZpbGVOYW1lKTsKLQotICAgIEZJTEUqIHRleHRfZmlsZSA9IGZpbGVfdXRpbDo6T3BlbkZpbGUoZmlsZV9uYW1lLCAid3QiKTsKLSAgICBETE9HX0lGKEVSUk9SLCAhdGV4dF9maWxlKSA8PCAiRmFpbGVkIHRvIG9wZW4gbG9nIGZpbGUuIjsKLSAgICBMT0coSU5GTykgPDwgIj4+IE91dHB1dCBmaWxlICIgPDwgZmlsZV9uYW1lLnZhbHVlKCkgPDwgIiBoYXMgYmVlbiBjcmVhdGVkLiI7Ci0KLSAgICAvLyBXcml0ZSB0aGUgYXJyYXkgd2hpY2ggY29udGFpbnMgdGltZS1zdGFtcHMsIGJ1ZmZlciBzaXplIGFuZAotICAgIC8vIGF1ZGlvIGRlbGF5cyB2YWx1ZXMgdG8gYSB0ZXh0IGZpbGUuCi0gICAgc2l6ZV90IGVsZW1lbnRzX3dyaXR0ZW4gPSAwOwotICAgIHdoaWxlIChlbGVtZW50c193cml0dGVuIDwKLSAgICAgICAgc3RkOjptaW4oaW5wdXRfZWxlbWVudHNfdG9fd3JpdGVfLCBvdXRwdXRfZWxlbWVudHNfdG9fd3JpdGVfKSkgewotICAgICAgY29uc3QgQXVkaW9EZWxheVN0YXRlIHN0YXRlID0gZGVsYXlfc3RhdGVzX1tlbGVtZW50c193cml0dGVuXTsKLSAgICAgIGZwcmludGYodGV4dF9maWxlLCAiJWQgJWQgJWQgJWRcbiIsCi0gICAgICAgICAgICAgIHN0YXRlLmRlbHRhX3RpbWVfbXMsCi0gICAgICAgICAgICAgIHN0YXRlLmJ1ZmZlcl9kZWxheV9tcywKLSAgICAgICAgICAgICAgc3RhdGUuaW5wdXRfZGVsYXlfbXMsCi0gICAgICAgICAgICAgIHN0YXRlLm91dHB1dF9kZWxheV9tcyk7Ci0gICAgICArK2VsZW1lbnRzX3dyaXR0ZW47Ci0gICAgfQotCi0gICAgZmlsZV91dGlsOjpDbG9zZUZpbGUodGV4dF9maWxlKTsKLSAgfQotCi0gIC8vIEF1ZGlvSW5wdXRTdHJlYW06OkF1ZGlvSW5wdXRDYWxsYmFjay4KLSAgdmlydHVhbCB2b2lkIE9uRGF0YShBdWRpb0lucHV0U3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHNyYywgdWludDMyIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDMyIGhhcmR3YXJlX2RlbGF5X2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2b2x1bWUpIE9WRVJSSURFIHsKLSAgICBiYXNlOjpBdXRvTG9jayBsb2NrKGxvY2tfKTsKLQotICAgIC8vIFVwZGF0ZSB0aHJlZSBjb21wb25lbnRzIGluIHRoZSBBdWRpb0RlbGF5U3RhdGUgZm9yIHRoaXMgcmVjb3JkZWQKLSAgICAvLyBhdWRpbyBwYWNrZXQuCi0gICAgYmFzZTo6VGltZSBub3dfdGltZSA9IGJhc2U6OlRpbWU6Ok5vdygpOwotICAgIGludCBkaWZmID0gKG5vd190aW1lIC0gcHJldmlvdXNfd3JpdGVfdGltZV8pLkluTWlsbGlzZWNvbmRzKCk7Ci0gICAgcHJldmlvdXNfd3JpdGVfdGltZV8gPSBub3dfdGltZTsKLSAgICBpZiAoaW5wdXRfZWxlbWVudHNfdG9fd3JpdGVfIDwga01heERlbGF5TWVhc3VyZW1lbnRzKSB7Ci0gICAgICBkZWxheV9zdGF0ZXNfW2lucHV0X2VsZW1lbnRzX3RvX3dyaXRlX10uZGVsdGFfdGltZV9tcyA9IGRpZmY7Ci0gICAgICBkZWxheV9zdGF0ZXNfW2lucHV0X2VsZW1lbnRzX3RvX3dyaXRlX10uYnVmZmVyX2RlbGF5X21zID0KLSAgICAgICAgICBCeXRlc1RvTWlsbGlzZWNvbmRzKGJ1ZmZlcl8tPmZvcndhcmRfYnl0ZXMoKSk7Ci0gICAgICBkZWxheV9zdGF0ZXNfW2lucHV0X2VsZW1lbnRzX3RvX3dyaXRlX10uaW5wdXRfZGVsYXlfbXMgPQotICAgICAgICAgIEJ5dGVzVG9NaWxsaXNlY29uZHMoaGFyZHdhcmVfZGVsYXlfYnl0ZXMpOwotICAgICAgKytpbnB1dF9lbGVtZW50c190b193cml0ZV87Ci0gICAgfQotCi0gICAgLy8gU3RvcmUgdGhlIGNhcHR1cmVkIGF1ZGlvIHBhY2tldCBpbiBhIHNlZWthYmxlIG1lZGlhIGJ1ZmZlci4KLSAgICBpZiAoIWJ1ZmZlcl8tPkFwcGVuZChzcmMsIHNpemUpKSB7Ci0gICAgICAvLyBBbiBhdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgdGhlIGJ1ZmZlciBsaW1pdHMgaGFzIGJlZW4gbWFkZS4KLSAgICAgIC8vIERvdWJsZSB0aGUgYnVmZmVyIGNhcGFjaXR5IHRvIGVuc3VyZSB0aGF0IHdlIGhhdmUgYSBidWZmZXIgbGFyZ2UKLSAgICAgIC8vIGVub3VnaCB0byBoYW5kbGUgdGhlIGN1cnJlbnQgc2FtcGxlIHRlc3Qgc2NlbmFyaW8uCi0gICAgICBidWZmZXJfLT5zZXRfZm9yd2FyZF9jYXBhY2l0eSgyICogYnVmZmVyXy0+Zm9yd2FyZF9jYXBhY2l0eSgpKTsKLSAgICAgIGJ1ZmZlcl8tPkNsZWFyKCk7Ci0gICAgfQotICB9Ci0KLSAgdmlydHVhbCB2b2lkIE9uQ2xvc2UoQXVkaW9JbnB1dFN0cmVhbSogc3RyZWFtKSBPVkVSUklERSB7fQotICB2aXJ0dWFsIHZvaWQgT25FcnJvcihBdWRpb0lucHV0U3RyZWFtKiBzdHJlYW0sIGludCBjb2RlKSBPVkVSUklERSB7fQotCi0gIC8vIEF1ZGlvT3V0cHV0U3RyZWFtOjpBdWRpb1NvdXJjZUNhbGxiYWNrLgotICB2aXJ0dWFsIGludCBPbk1vcmVEYXRhKEF1ZGlvQnVzKiBhdWRpb19idXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJzU3RhdGUgYnVmZmVyc19zdGF0ZSkgT1ZFUlJJREUgewotICAgIGJhc2U6OkF1dG9Mb2NrIGxvY2sobG9ja18pOwotCi0gICAgLy8gVXBkYXRlIG9uZSBjb21wb25lbnQgaW4gdGhlIEF1ZGlvRGVsYXlTdGF0ZSBmb3IgdGhlIHBhY2tldAotICAgIC8vIHdoaWNoIGlzIGFib3V0IHRvIGJlIHBsYXllZCBvdXQuCi0gICAgaWYgKG91dHB1dF9lbGVtZW50c190b193cml0ZV8gPCBrTWF4RGVsYXlNZWFzdXJlbWVudHMpIHsKLSAgICAgIGludCBvdXRwdXRfZGVsYXlfYnl0ZXMgPSBidWZmZXJzX3N0YXRlLmhhcmR3YXJlX2RlbGF5X2J5dGVzOwotI2lmIGRlZmluZWQoT1NfV0lOKQotICAgICAgLy8gU3BlY2lhbCBmaXggZm9yIFdpbmRvd3MgaW4gY29tYmluYXRpb24gd2l0aCBXYXZlIHdoZXJlIHRoZQotICAgICAgLy8gcGVuZGluZyBieXRlcyBmaWVsZCBvZiB0aGUgYXVkaW8gYnVmZmVyIHN0YXRlIGlzIHVzZWQgdG8KLSAgICAgIC8vIHJlcG9ydCB0aGUgZGVsYXkuCi0gICAgICBpZiAoIUNvcmVBdWRpb1V0aWw6OklzU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgb3V0cHV0X2RlbGF5X2J5dGVzID0gYnVmZmVyc19zdGF0ZS5wZW5kaW5nX2J5dGVzOwotICAgICAgfQotI2VuZGlmCi0gICAgICBkZWxheV9zdGF0ZXNfW291dHB1dF9lbGVtZW50c190b193cml0ZV9dLm91dHB1dF9kZWxheV9tcyA9Ci0gICAgICAgICAgQnl0ZXNUb01pbGxpc2Vjb25kcyhvdXRwdXRfZGVsYXlfYnl0ZXMpOwotICAgICAgKytvdXRwdXRfZWxlbWVudHNfdG9fd3JpdGVfOwotICAgIH0KLQotICAgIGludCBzaXplOwotICAgIGNvbnN0IHVpbnQ4KiBzb3VyY2U7Ci0gICAgLy8gUmVhZCB0aGUgZGF0YSBmcm9tIHRoZSBzZWVrYWJsZSBtZWRpYSBidWZmZXIgd2hpY2ggY29udGFpbnMKLSAgICAvLyBjYXB0dXJlZCBkYXRhIGF0IHRoZSBzYW1lIHNpemUgYW5kIHNhbXBsZSByYXRlIGFzIHRoZSBvdXRwdXQgc2lkZS4KLSAgICBpZiAoYnVmZmVyXy0+R2V0Q3VycmVudENodW5rKCZzb3VyY2UsICZzaXplKSAmJiBzaXplID4gMCkgewotICAgICAgRVhQRUNUX0VRKGNoYW5uZWxzXywgYXVkaW9fYnVzLT5jaGFubmVscygpKTsKLSAgICAgIHNpemUgPSBzdGQ6Om1pbihhdWRpb19idXMtPmZyYW1lcygpICogZnJhbWVfc2l6ZV8sIHNpemUpOwotICAgICAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PHNpemVfdD4oc2l6ZSkgJSBzaXplb2YoKmF1ZGlvX2J1cy0+Y2hhbm5lbCgwKSksIDBVKTsKLSAgICAgIGF1ZGlvX2J1cy0+RnJvbUludGVybGVhdmVkKAotICAgICAgICAgIHNvdXJjZSwgc2l6ZSAvIGZyYW1lX3NpemVfLCBmcmFtZV9zaXplXyAvIGNoYW5uZWxzXyk7Ci0gICAgICBidWZmZXJfLT5TZWVrKHNpemUpOwotICAgICAgcmV0dXJuIHNpemUgLyBmcmFtZV9zaXplXzsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHZpcnR1YWwgaW50IE9uTW9yZUlPRGF0YShBdWRpb0J1cyogc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdXMqIGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlcnNTdGF0ZSBidWZmZXJzX3N0YXRlKSBPVkVSUklERSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIE9uRXJyb3IoQXVkaW9PdXRwdXRTdHJlYW0qIHN0cmVhbSwgaW50IGNvZGUpIE9WRVJSSURFIHt9Ci0gIHZpcnR1YWwgdm9pZCBXYWl0VGlsbERhdGFSZWFkeSgpIE9WRVJSSURFIHt9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8vIENvbnZlcnRzIGZyb20gYnl0ZXMgdG8gbWlsbGlzZWNvbmRzIHRha2luZyB0aGUgc2FtcGxlIHJhdGUgYW5kIHNpemUKLSAgLy8gb2YgYW4gYXVkaW8gZnJhbWUgaW50byBhY2NvdW50LgotICBpbnQgQnl0ZXNUb01pbGxpc2Vjb25kcyh1aW50MzIgZGVsYXlfYnl0ZXMpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PigoZGVsYXlfYnl0ZXMgLyBmcmFtZV9zaXplXykgKiBmcmFtZXNfdG9fbXNfICsgMC41KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgYmFzZTo6TG9jayBsb2NrXzsKLSAgc2NvcGVkX3B0cjxtZWRpYTo6U2Vla2FibGVCdWZmZXI+IGJ1ZmZlcl87Ci0gIGludCBzYW1wbGVfcmF0ZV87Ci0gIGludCBzYW1wbGVzX3Blcl9wYWNrZXRfOwotICBpbnQgY2hhbm5lbHNfOwotICBpbnQgZnJhbWVfc2l6ZV87Ci0gIGRvdWJsZSBmcmFtZXNfdG9fbXNfOwotICBzY29wZWRfYXJyYXk8QXVkaW9EZWxheVN0YXRlPiBkZWxheV9zdGF0ZXNfOwotICBzaXplX3QgaW5wdXRfZWxlbWVudHNfdG9fd3JpdGVfOwotICBzaXplX3Qgb3V0cHV0X2VsZW1lbnRzX3RvX3dyaXRlXzsKLSAgYmFzZTo6VGltZSBwcmV2aW91c193cml0ZV90aW1lXzsKLX07Ci0KLWNsYXNzIEF1ZGlvSW5wdXRTdHJlYW1UcmFpdHMgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBBdWRpb0lucHV0U3RyZWFtIFN0cmVhbVR5cGU7Ci0KLSAgc3RhdGljIGludCBIYXJkd2FyZVNhbXBsZVJhdGUoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4obWVkaWE6OkdldEF1ZGlvSW5wdXRIYXJkd2FyZVNhbXBsZVJhdGUoCi0gICAgICAgIEF1ZGlvTWFuYWdlckJhc2U6OmtEZWZhdWx0RGV2aWNlSWQpKTsKLSAgfQotCi0gIC8vIFRPRE8oaGVucmlrYSk6IGFkZCBzdXBwb3J0IGZvciBHZXRBdWRpb0lucHV0SGFyZHdhcmVCdWZmZXJTaXplIGluIG1lZGlhLgotICBzdGF0aWMgaW50IEhhcmR3YXJlQnVmZmVyU2l6ZSgpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihtZWRpYTo6R2V0QXVkaW9IYXJkd2FyZUJ1ZmZlclNpemUoKSk7Ci0gIH0KLQotICBzdGF0aWMgU3RyZWFtVHlwZSogQ3JlYXRlU3RyZWFtKEF1ZGlvTWFuYWdlciogYXVkaW9fbWFuYWdlciwKLSAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKSB7Ci0gICAgcmV0dXJuIGF1ZGlvX21hbmFnZXItPk1ha2VBdWRpb0lucHV0U3RyZWFtKHBhcmFtcywKLSAgICAgIEF1ZGlvTWFuYWdlckJhc2U6OmtEZWZhdWx0RGV2aWNlSWQpOwotICB9Ci19OwotCi1jbGFzcyBBdWRpb091dHB1dFN0cmVhbVRyYWl0cyB7Ci0gcHVibGljOgotICB0eXBlZGVmIEF1ZGlvT3V0cHV0U3RyZWFtIFN0cmVhbVR5cGU7Ci0KLSAgc3RhdGljIGludCBIYXJkd2FyZVNhbXBsZVJhdGUoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4obWVkaWE6OkdldEF1ZGlvSGFyZHdhcmVTYW1wbGVSYXRlKCkpOwotICB9Ci0KLSAgc3RhdGljIGludCBIYXJkd2FyZUJ1ZmZlclNpemUoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4obWVkaWE6OkdldEF1ZGlvSGFyZHdhcmVCdWZmZXJTaXplKCkpOwotICB9Ci0KLSAgc3RhdGljIFN0cmVhbVR5cGUqIENyZWF0ZVN0cmVhbShBdWRpb01hbmFnZXIqIGF1ZGlvX21hbmFnZXIsCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcykgewotICAgIHJldHVybiBhdWRpb19tYW5hZ2VyLT5NYWtlQXVkaW9PdXRwdXRTdHJlYW0ocGFyYW1zKTsKLSAgfQotfTsKLQotLy8gVHJhaXRzIHRlbXBsYXRlIGhvbGRpbmcgYSB0cmFpdCBvZiBTdHJlYW1UeXBlLiBJdCBlbmNhcHN1bGF0ZXMKLS8vIEF1ZGlvSW5wdXRTdHJlYW0gYW5kIEF1ZGlvT3V0cHV0U3RyZWFtIHN0cmVhbSB0eXBlcy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBTdHJlYW1UcmFpdHM+Ci1jbGFzcyBTdHJlYW1XcmFwcGVyIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgdHlwZW5hbWUgU3RyZWFtVHJhaXRzOjpTdHJlYW1UeXBlIFN0cmVhbVR5cGU7Ci0KLSAgZXhwbGljaXQgU3RyZWFtV3JhcHBlcihBdWRpb01hbmFnZXIqIGF1ZGlvX21hbmFnZXIpCi0gICAgICA6Ci0jaWYgZGVmaW5lZChPU19XSU4pCi0gICAgICAgIGNvbV9pbml0XyhiYXNlOjp3aW46OlNjb3BlZENPTUluaXRpYWxpemVyOjprTVRBKSwKLSNlbmRpZgotICAgICAgICBhdWRpb19tYW5hZ2VyXyhhdWRpb19tYW5hZ2VyKSwKLSAgICAgICAgZm9ybWF0XyhBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MT1dfTEFURU5DWSksCi0jaWYgZGVmaW5lZChPU19BTkRST0lEKQotICAgICAgICBjaGFubmVsX2xheW91dF8oQ0hBTk5FTF9MQVlPVVRfTU9OTyksCi0jZWxzZQotICAgICAgICBjaGFubmVsX2xheW91dF8oQ0hBTk5FTF9MQVlPVVRfU1RFUkVPKSwKLSNlbmRpZgotICAgICAgICBiaXRzX3Blcl9zYW1wbGVfKDE2KSB7Ci0gICAgLy8gVXNlIHRoZSBwcmVmZXJyZWQgc2FtcGxlIHJhdGUuCi0gICAgc2FtcGxlX3JhdGVfID0gU3RyZWFtVHJhaXRzOjpIYXJkd2FyZVNhbXBsZVJhdGUoKTsKLQotICAgIC8vIFVzZSB0aGUgcHJlZmVycmVkIGJ1ZmZlciBzaXplLiBOb3RlIHRoYXQgdGhlIGlucHV0IHNpZGUgdXNlcyB0aGUgc2FtZQotICAgIC8vIHNpemUgYXMgdGhlIG91dHB1dCBzaWRlIGluIHRoaXMgaW1wbGVtZW50YXRpb24uCi0gICAgc2FtcGxlc19wZXJfcGFja2V0XyA9IFN0cmVhbVRyYWl0czo6SGFyZHdhcmVCdWZmZXJTaXplKCk7Ci0gIH0KLQotICB2aXJ0dWFsIH5TdHJlYW1XcmFwcGVyKCkge30KLQotICAvLyBDcmVhdGVzIGFuIEF1ZGlvW0lucHV0fE91dHB1dF1TdHJlYW0gc3RyZWFtIG9iamVjdCB1c2luZyBkZWZhdWx0Ci0gIC8vIHBhcmFtZXRlcnMuCi0gIFN0cmVhbVR5cGUqIENyZWF0ZSgpIHsKLSAgICByZXR1cm4gQ3JlYXRlU3RyZWFtKCk7Ci0gIH0KLQotICBpbnQgY2hhbm5lbHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIENoYW5uZWxMYXlvdXRUb0NoYW5uZWxDb3VudChjaGFubmVsX2xheW91dF8pOwotICB9Ci0gIGludCBiaXRzX3Blcl9zYW1wbGUoKSBjb25zdCB7IHJldHVybiBiaXRzX3Blcl9zYW1wbGVfOyB9Ci0gIGludCBzYW1wbGVfcmF0ZSgpIGNvbnN0IHsgcmV0dXJuIHNhbXBsZV9yYXRlXzsgfQotICBpbnQgc2FtcGxlc19wZXJfcGFja2V0KCkgY29uc3QgeyByZXR1cm4gc2FtcGxlc19wZXJfcGFja2V0XzsgfQotCi0gcHJpdmF0ZToKLSAgU3RyZWFtVHlwZSogQ3JlYXRlU3RyZWFtKCkgewotICAgIFN0cmVhbVR5cGUqIHN0cmVhbSA9IFN0cmVhbVRyYWl0czo6Q3JlYXRlU3RyZWFtKGF1ZGlvX21hbmFnZXJfLAotICAgICAgICBBdWRpb1BhcmFtZXRlcnMoZm9ybWF0XywgY2hhbm5lbF9sYXlvdXRfLCBzYW1wbGVfcmF0ZV8sCi0gICAgICAgICAgICBiaXRzX3Blcl9zYW1wbGVfLCBzYW1wbGVzX3Blcl9wYWNrZXRfKSk7Ci0gICAgRVhQRUNUX1RSVUUoc3RyZWFtKTsKLSAgICByZXR1cm4gc3RyZWFtOwotICB9Ci0KLSNpZiBkZWZpbmVkKE9TX1dJTikKLSAgYmFzZTo6d2luOjpTY29wZWRDT01Jbml0aWFsaXplciBjb21faW5pdF87Ci0jZW5kaWYKLQotICBBdWRpb01hbmFnZXIqIGF1ZGlvX21hbmFnZXJfOwotICBBdWRpb1BhcmFtZXRlcnM6OkZvcm1hdCBmb3JtYXRfOwotICBDaGFubmVsTGF5b3V0IGNoYW5uZWxfbGF5b3V0XzsKLSAgaW50IGJpdHNfcGVyX3NhbXBsZV87Ci0gIGludCBzYW1wbGVfcmF0ZV87Ci0gIGludCBzYW1wbGVzX3Blcl9wYWNrZXRfOwotfTsKLQotdHlwZWRlZiBTdHJlYW1XcmFwcGVyPEF1ZGlvSW5wdXRTdHJlYW1UcmFpdHM+IEF1ZGlvSW5wdXRTdHJlYW1XcmFwcGVyOwotdHlwZWRlZiBTdHJlYW1XcmFwcGVyPEF1ZGlvT3V0cHV0U3RyZWFtVHJhaXRzPiBBdWRpb091dHB1dFN0cmVhbVdyYXBwZXI7Ci0KLS8vIFRoaXMgdGVzdCBpcyBpbnRlbmRlZCBmb3IgbWFudWFsIHRlc3RzIGFuZCBzaG91bGQgb25seSBiZSBlbmFibGVkCi0vLyB3aGVuIGl0IGlzIHJlcXVpcmVkIHRvIG1ha2UgYSByZWFsLXRpbWUgdGVzdCBvZiBhdWRpbyBpbiBmdWxsIGR1cGxleCBhbmQKLS8vIGF0IHRoZSBzYW1lIHRpbWUgY3JlYXRlIGEgdGV4dCBmaWxlIHdoaWNoIGNvbnRhaW5zIG1lYXN1cmVkIGRlbGF5IHZhbHVlcy4KLS8vIFRoZSBmaWxlIGNhbiBsYXRlciBiZSBhbmFseXplZCBvZmYgbGluZSB1c2luZyBlLmcuIE1BVExBQi4KLS8vIE1BVExBQiBleGFtcGxlOgotLy8gICBEPWxvYWQoJ2F1ZGlvX2RlbGF5X3ZhbHVlc19tcy50eHQnKTsKLS8vICAgeD1jdW1zdW0oRCg6LDEpKTsKLS8vICAgcGxvdCh4LCBEKDosMiksIHgsIEQoOiwzKSwgeCwgRCg6LDQpLCB4LCBEKDosMikrRCg6LDMpK0QoOiw0KSk7Ci0vLyAgIGF4aXMoWzAsIG1heCh4KSwgMCwgbWF4KEQoOiwyKStEKDosMykrRCg6LDQpKSsxMF0pOwotLy8gICBsZWdlbmQoJ2J1ZmZlciBkZWxheScsJ2lucHV0IGRlbGF5Jywnb3V0cHV0IGRlbGF5JywndG90YWwgZGVsYXknKTsKLS8vICAgeGxhYmVsKCd0aW1lIFttc2VjXScpCi0vLyAgIHlsYWJlbCgnZGVsYXkgW21zZWNdJykKLS8vICAgdGl0bGUoJ0Z1bGwtZHVwbGV4IGF1ZGlvIGRlbGF5IG1lYXN1cmVtZW50Jyk7Ci1URVNUX0YoQXVkaW9Mb3dMYXRlbmN5SW5wdXRPdXRwdXRUZXN0LCBESVNBQkxFRF9GdWxsRHVwbGV4RGVsYXlNZWFzdXJlbWVudCkgewotICBpZiAoIUNhblJ1bkF1ZGlvVGVzdHMoKSkKLSAgICByZXR1cm47Ci0KLSAgQXVkaW9JbnB1dFN0cmVhbVdyYXBwZXIgYWlzdyhhdWRpb19tYW5hZ2VyKCkpOwotICBBdWRpb0lucHV0U3RyZWFtKiBhaXMgPSBhaXN3LkNyZWF0ZSgpOwotICBFWFBFQ1RfVFJVRShhaXMpOwotCi0gIEF1ZGlvT3V0cHV0U3RyZWFtV3JhcHBlciBhb3N3KGF1ZGlvX21hbmFnZXIoKSk7Ci0gIEF1ZGlvT3V0cHV0U3RyZWFtKiBhb3MgPSBhb3N3LkNyZWF0ZSgpOwotICBFWFBFQ1RfVFJVRShhb3MpOwotCi0gIC8vIFRoaXMgdGVzdCBvbmx5IHN1cHBvcnRzIGlkZW50aWNhbCBwYXJhbWV0ZXJzIGluIGJvdGggZGlyZWN0aW9ucy4KLSAgLy8gVE9ETyhoZW5yaWthKTogaXQgaXMgcG9zc2libGUgdG8gY3V0IGRlbGF5IGhlcmUgYnkgdXNpbmcgZGlmZmVyZW50Ci0gIC8vIGJ1ZmZlciBzaXplcyBmb3IgaW5wdXQgYW5kIG91dHB1dC4KLSAgaWYgKGFpc3cuc2FtcGxlX3JhdGUoKSAhPSBhb3N3LnNhbXBsZV9yYXRlKCkgfHwKLSAgICAgIGFpc3cuc2FtcGxlc19wZXJfcGFja2V0KCkgIT0gYW9zdy5zYW1wbGVzX3Blcl9wYWNrZXQoKSB8fAotICAgICAgYWlzdy5jaGFubmVscygpIT0gYW9zdy5jaGFubmVscygpIHx8Ci0gICAgICBhaXN3LmJpdHNfcGVyX3NhbXBsZSgpICE9IGFvc3cuYml0c19wZXJfc2FtcGxlKCkpIHsKLSAgICBMT0coRVJST1IpIDw8ICJUaGlzIHRlc3QgcmVxdWlyZXMgc3ltbWV0cmljIGlucHV0IGFuZCBvdXRwdXQgcGFyYW1ldGVycy4gIgotICAgICAgICAiRW5zdXJlIHRoYXQgc2FtcGxlIHJhdGUgYW5kIG51bWJlciBvZiBjaGFubmVscyBhcmUgaWRlbnRpY2FsIGluICIKLSAgICAgICAgImJvdGggZGlyZWN0aW9ucyI7Ci0gICAgYW9zLT5DbG9zZSgpOwotICAgIGFpcy0+Q2xvc2UoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBFWFBFQ1RfVFJVRShhaXMtPk9wZW4oKSk7Ci0gIEVYUEVDVF9UUlVFKGFvcy0+T3BlbigpKTsKLQotICBGdWxsRHVwbGV4QXVkaW9TaW5rU291cmNlIGZ1bGxfZHVwbGV4KAotICAgICAgYWlzdy5zYW1wbGVfcmF0ZSgpLCBhaXN3LnNhbXBsZXNfcGVyX3BhY2tldCgpLCBhaXN3LmNoYW5uZWxzKCkpOwotCi0gIExPRyhJTkZPKSA8PCAiPj4gWW91IHNob3VsZCBub3cgYmUgYWJsZSB0byBoZWFyIHlvdXJzZWxmIGluIGxvb3BiYWNrLi4uIjsKLSAgRExPRyhJTkZPKSA8PCAiICAgc2FtcGxlX3JhdGUgICAgICAgOiAiIDw8IGFpc3cuc2FtcGxlX3JhdGUoKTsKLSAgRExPRyhJTkZPKSA8PCAiICAgc2FtcGxlc19wZXJfcGFja2V0OiAiIDw8IGFpc3cuc2FtcGxlc19wZXJfcGFja2V0KCk7Ci0gIERMT0coSU5GTykgPDwgIiAgIGNoYW5uZWxzICAgICAgICAgIDogIiA8PCBhaXN3LmNoYW5uZWxzKCk7Ci0KLSAgYWlzLT5TdGFydCgmZnVsbF9kdXBsZXgpOwotICBhb3MtPlN0YXJ0KCZmdWxsX2R1cGxleCk7Ci0KLSAgLy8gV2FpdCBmb3IgYXBwcm94aW1hdGVseSAxMCBzZWNvbmRzLiBUaGUgdXNlciBzaGFsbCBoZWFyIGhpcyBvd24gdm9pY2UKLSAgLy8gaW4gbG9vcCBiYWNrIGR1cmluZyB0aGlzIHRpbWUuIEF0IHRoZSBzYW1lIHRpbWUsIGRlbGF5IHJlY29yZGluZ3MgYXJlCi0gIC8vIHBlcmZvcm1lZCBhbmQgc3RvcmVkIGluIHRoZSBvdXRwdXQgdGV4dCBmaWxlLgotICBtZXNzYWdlX2xvb3AoKS0+UG9zdERlbGF5ZWRUYXNrKEZST01fSEVSRSwKLSAgICAgIE1lc3NhZ2VMb29wOjpRdWl0Q2xvc3VyZSgpLCBUZXN0VGltZW91dHM6OmFjdGlvbl90aW1lb3V0KCkpOwotICBtZXNzYWdlX2xvb3AoKS0+UnVuKCk7Ci0KLSAgYW9zLT5TdG9wKCk7Ci0gIGFpcy0+U3RvcCgpOwotCi0gIC8vIEFsbCBDbG9zZSgpIG9wZXJhdGlvbnMgdGhhdCBydW4gb24gdGhlIG1vY2tlZCBhdWRpbyB0aHJlYWQsCi0gIC8vIHNob3VsZCBiZSBzeW5jaHJvbm91cyBhbmQgbm90IHBvc3QgYWRkaXRpb25hbCBjbG9zZSB0YXNrcyB0bwotICAvLyBtb2NrZWQgdGhlIGF1ZGlvIHRocmVhZC4gSGVuY2UsIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2FsbAotICAvLyBtZXNzYWdlX2xvb3AoKS0+UnVuVW50aWxJZGxlKCkgYWZ0ZXIgdGhlIENsb3NlKCkgbWV0aG9kcy4KLSAgYW9zLT5DbG9zZSgpOwotICBhaXMtPkNsb3NlKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX21hbmFnZXIuY2MgYi9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fbWFuYWdlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM3MmQwOC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fbWFuYWdlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19tYW5hZ2VyLmgiCi0KLSNpbmNsdWRlICJiYXNlL2F0X2V4aXQuaCIKLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2JpbmRfaGVscGVycy5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgdGhlIHBsYXRmb3JtIHNwZWNpZmljIEF1ZGlvTWFuYWdlciBmYWN0b3J5IGZ1bmN0aW9uLgotQXVkaW9NYW5hZ2VyKiBDcmVhdGVBdWRpb01hbmFnZXIoKTsKLQotQXVkaW9NYW5hZ2VyOjpBdWRpb01hbmFnZXIoKSB7Ci19Ci0KLUF1ZGlvTWFuYWdlcjo6fkF1ZGlvTWFuYWdlcigpIHsKLX0KLQotLy8gc3RhdGljCi1BdWRpb01hbmFnZXIqIEF1ZGlvTWFuYWdlcjo6Q3JlYXRlKCkgewotICByZXR1cm4gQ3JlYXRlQXVkaW9NYW5hZ2VyKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX21hbmFnZXIuaCBiL3NyYy9tZWRpYS9hdWRpby9hdWRpb19tYW5hZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNGM0NjguLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX21hbmFnZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0FVRElPX0FVRElPX01BTkFHRVJfSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fQVVESU9fTUFOQUdFUl9IXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3N0cmluZzE2LmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fZGV2aWNlX25hbWUuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19wYXJhbWV0ZXJzLmgiCi0KLWNsYXNzIE1lc3NhZ2VMb29wOwotCi1uYW1lc3BhY2UgYmFzZSB7Ci1jbGFzcyBNZXNzYWdlTG9vcFByb3h5OwotfQotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBBdWRpb0lucHV0U3RyZWFtOwotY2xhc3MgQXVkaW9PdXRwdXRTdHJlYW07Ci0KLS8vIE1hbmFnZXMgYWxsIGF1ZGlvIHJlc291cmNlcy4gSW4gcGFydGljdWxhciBpdCBvd25zIHRoZSBBdWRpb091dHB1dFN0cmVhbQotLy8gb2JqZWN0cy4gUHJvdmlkZXMgc29tZSBjb252ZW5pZW5jZSBmdW5jdGlvbnMgdGhhdCBhdm9pZCB0aGUgbmVlZCB0byBwcm92aWRlCi0vLyBpdGVyYXRvcnMgb3ZlciB0aGUgZXhpc3Rpbmcgc3RyZWFtcy4KLWNsYXNzIE1FRElBX0VYUE9SVCBBdWRpb01hbmFnZXIgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+QXVkaW9NYW5hZ2VyKCk7Ci0KLSAgLy8gVXNlIHRvIGNvbnN0cnVjdCB0aGUgYXVkaW8gbWFuYWdlci4KLSAgLy8gTk9URTogVGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lIGluc3RhbmNlLgotICBzdGF0aWMgQXVkaW9NYW5hZ2VyKiBDcmVhdGUoKTsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIE9TIHJlcG9ydHMgZXhpc3RlbmNlIG9mIGF1ZGlvIGRldmljZXMuIFRoaXMgZG9lcyBub3QKLSAgLy8gZ3VhcmFudGVlIHRoYXQgdGhlIGV4aXN0aW5nIGRldmljZXMgc3VwcG9ydCBhbGwgZm9ybWF0cyBhbmQgc2FtcGxlIHJhdGVzLgotICB2aXJ0dWFsIGJvb2wgSGFzQXVkaW9PdXRwdXREZXZpY2VzKCkgPSAwOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgT1MgcmVwb3J0cyBleGlzdGVuY2Ugb2YgYXVkaW8gcmVjb3JkaW5nIGRldmljZXMuIFRoaXMKLSAgLy8gZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQgdGhlIGV4aXN0aW5nIGRldmljZXMgc3VwcG9ydCBhbGwgZm9ybWF0cyBhbmQKLSAgLy8gc2FtcGxlIHJhdGVzLgotICB2aXJ0dWFsIGJvb2wgSGFzQXVkaW9JbnB1dERldmljZXMoKSA9IDA7Ci0KLSAgLy8gUmV0dXJucyBhIGh1bWFuIHJlYWRhYmxlIHN0cmluZyBmb3IgdGhlIG1vZGVsL21ha2Ugb2YgdGhlIGFjdGl2ZSBhdWRpbwotICAvLyBpbnB1dCBkZXZpY2UgZm9yIHRoaXMgY29tcHV0ZXIuCi0gIHZpcnR1YWwgc3RyaW5nMTYgR2V0QXVkaW9JbnB1dERldmljZU1vZGVsKCkgPSAwOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgYXVkaW8gaW5wdXQgc2V0dGluZ3MgVUkgaXMga25vd24KLSAgLy8gYW5kIGNhbiBiZSBzaG93bi4KLSAgdmlydHVhbCBib29sIENhblNob3dBdWRpb0lucHV0U2V0dGluZ3MoKSA9IDA7Ci0KLSAgLy8gT3BlbnMgdGhlIHBsYXRmb3JtIGRlZmF1bHQgYXVkaW8gaW5wdXQgc2V0dGluZ3MgVUkuCi0gIC8vIE5vdGU6IFRoaXMgY291bGQgaW52b2tlIGFuIGV4dGVybmFsIGFwcGxpY2F0aW9uL3ByZWZlcmVuY2VzIHBhbmUsIHNvCi0gIC8vIGlkZWFsbHkgbXVzdCBub3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZCBvciBvdGhlciB0aW1lIHNlbnNpdGl2ZQotICAvLyB0aHJlYWRzIHRvIGF2b2lkIGJsb2NraW5nIHRoZSByZXN0IG9mIHRoZSBhcHBsaWNhdGlvbi4KLSAgdmlydHVhbCB2b2lkIFNob3dBdWRpb0lucHV0U2V0dGluZ3MoKSA9IDA7Ci0KLSAgLy8gQXBwZW5kcyBhIGxpc3Qgb2YgYXZhaWxhYmxlIGlucHV0IGRldmljZXMuIEl0IGlzIG5vdCBndWFyYW50ZWVkIHRoYXQKLSAgLy8gYWxsIHRoZSBkZXZpY2VzIGluIHRoZSBsaXN0IHN1cHBvcnQgYWxsIGZvcm1hdHMgYW5kIHNhbXBsZSByYXRlcyBmb3IKLSAgLy8gcmVjb3JkaW5nLgotICB2aXJ0dWFsIHZvaWQgR2V0QXVkaW9JbnB1dERldmljZU5hbWVzKEF1ZGlvRGV2aWNlTmFtZXMqIGRldmljZV9uYW1lcykgPSAwOwotCi0gIC8vIEZhY3RvcnkgZm9yIGFsbCB0aGUgc3VwcG9ydGVkIHN0cmVhbSBmb3JtYXRzLiB8cGFyYW1zfCBkZWZpbmVzIHBhcmFtZXRlcnMKLSAgLy8gb2YgdGhlIGF1ZGlvIHN0cmVhbSB0byBiZSBjcmVhdGVkLgotICAvLwotICAvLyB8cGFyYW1zLnNhbXBsZV9wZXJfcGFja2V0fCBpcyB0aGUgcmVxdWVzdGVkIGJ1ZmZlciBhbGxvY2F0aW9uIHdoaWNoIHRoZQotICAvLyBhdWRpbyBzb3VyY2UgdGhpbmtzIGl0IGNhbiB1c3VhbGx5IGZpbGwgd2l0aG91dCBibG9ja2luZy4gSW50ZXJuYWxseSB0d28KLSAgLy8gb3IgdGhyZWUgYnVmZmVycyBhcmUgY3JlYXRlZCwgb25lIHdpbGwgYmUgbG9ja2VkIGZvciBwbGF5YmFjayBhbmQgb25lIHdpbGwKLSAgLy8gYmUgcmVhZHkgdG8gYmUgZmlsbGVkIGluIHRoZSBjYWxsIHRvIEF1ZGlvU291cmNlQ2FsbGJhY2s6Ok9uTW9yZURhdGEoKS4KLSAgLy8KLSAgLy8gUmV0dXJucyBOVUxMIGlmIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgcGFyYW1ldGVycyBpcyBub3Qgc3VwcG9ydGVkLCBvciBpZgotICAvLyB3ZSBoYXZlIHJlYWNoZWQgc29tZSBvdGhlciBwbGF0Zm9ybSBzcGVjaWZpYyBsaW1pdC4KLSAgLy8KLSAgLy8gfHBhcmFtcy5mb3JtYXR8IGNhbiBiZSBzZXQgdG8gQVVESU9fUENNX0xPV19MQVRFTkNZIGFuZCB0aGF0IGhhcyB0d28KLSAgLy8gZWZmZWN0czoKLSAgLy8gMS0gSW5zdGVhZCBvZiB0cmlwbGUgYnVmZmVyZWQgdGhlIGF1ZGlvIHdpbGwgYmUgZG91YmxlIGJ1ZmZlcmVkLgotICAvLyAyLSBBIGxvdyBsYXRlbmN5IGRyaXZlciBvciBhbHRlcm5hdGl2ZSBhdWRpbyBzdWJzeXN0ZW0gd2lsbCBiZSB1c2VkIHdoZW4KLSAgLy8gICAgYXZhaWxhYmxlLgotICAvLwotICAvLyBEbyBub3QgZnJlZSB0aGUgcmV0dXJuZWQgQXVkaW9PdXRwdXRTdHJlYW0uIEl0IGlzIG93bmVkIGJ5IEF1ZGlvTWFuYWdlci4KLSAgdmlydHVhbCBBdWRpb091dHB1dFN0cmVhbSogTWFrZUF1ZGlvT3V0cHV0U3RyZWFtKAotICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpID0gMDsKLQotICAvLyBDcmVhdGVzIG5ldyBhdWRpbyBvdXRwdXQgcHJveHkuIEEgcHJveHkgaW1wbGVtZW50cwotICAvLyBBdWRpb091dHB1dFN0cmVhbSBpbnRlcmZhY2UsIGJ1dCB1bmxpa2UgcmVndWxhciBvdXRwdXQgc3RyZWFtCi0gIC8vIGNyZWF0ZWQgd2l0aCBNYWtlQXVkaW9PdXRwdXRTdHJlYW0oKSBpdCBvcGVucyBkZXZpY2Ugb25seSB3aGVuIGEKLSAgLy8gc291bmQgaXMgYWN0dWFsbHkgcGxheWluZy4KLSAgdmlydHVhbCBBdWRpb091dHB1dFN0cmVhbSogTWFrZUF1ZGlvT3V0cHV0U3RyZWFtUHJveHkoCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcykgPSAwOwotCi0gIC8vIEZhY3RvcnkgdG8gY3JlYXRlIGF1ZGlvIHJlY29yZGluZyBzdHJlYW1zLgotICAvLyB8Y2hhbm5lbHN8IGNhbiBiZSAxIG9yIDIuCi0gIC8vIHxzYW1wbGVfcmF0ZXwgaXMgaW4gaGVydHogYW5kIGNhbiBiZSBhbnkgdmFsdWUgc3VwcG9ydGVkIGJ5IHRoZSBwbGF0Zm9ybS4KLSAgLy8gfGJpdHNfcGVyX3NhbXBsZXwgY2FuIGJlIGFueSB2YWx1ZSBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtLgotICAvLyB8c2FtcGxlc19wZXJfcGFja2V0fCBpcyBpbiBoZXJ0eiBhcyB3ZWxsIGFuZCBjYW4gYmUgMCB0byB8c2FtcGxlX3JhdGV8LAotICAvLyB3aXRoIDAgc3VnZ2VzdGluZyB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiB1c2UgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGF0Ci0gIC8vIHBsYXRmb3JtLgotICAvLyBSZXR1cm5zIE5VTEwgaWYgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBwYXJhbWV0ZXJzIGlzIG5vdCBzdXBwb3J0ZWQsIG9yIGlmCi0gIC8vIHdlIGhhdmUgcmVhY2hlZCBzb21lIG90aGVyIHBsYXRmb3JtIHNwZWNpZmljIGxpbWl0LgotICAvLwotICAvLyBEbyBub3QgZnJlZSB0aGUgcmV0dXJuZWQgQXVkaW9JbnB1dFN0cmVhbS4gSXQgaXMgb3duZWQgYnkgQXVkaW9NYW5hZ2VyLgotICAvLyBXaGVuIHlvdSBhcmUgZG9uZSB3aXRoIGl0LCBjYWxsIHxTdG9wKCl8IGFuZCB8Q2xvc2UoKXwgdG8gcmVsZWFzZSBpdC4KLSAgdmlydHVhbCBBdWRpb0lucHV0U3RyZWFtKiBNYWtlQXVkaW9JbnB1dFN0cmVhbSgKLSAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2lkKSA9IDA7Ci0KLSAgLy8gVXNlZCB0byBkZXRlcm1pbmUgaWYgc29tZXRoaW5nIGVsc2UgaXMgY3VycmVudGx5IG1ha2luZyB1c2Ugb2YgYXVkaW8gaW5wdXQuCi0gIHZpcnR1YWwgYm9vbCBJc1JlY29yZGluZ0luUHJvY2VzcygpID0gMDsKLQotICAvLyBSZXR1cm5zIG1lc3NhZ2UgbG9vcCB1c2VkIGZvciBhdWRpbyBJTy4KLSAgdmlydHVhbCBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+IEdldE1lc3NhZ2VMb29wKCkgPSAwOwotCi0gIC8vIEFsbG93cyBjbGllbnRzIHRvIGxpc3RlbiBmb3IgZGV2aWNlIHN0YXRlIGNoYW5nZXM7IGUuZy4gcHJlZmVycmVkIHNhbXBsZQotICAvLyByYXRlIG9yIGNoYW5uZWwgbGF5b3V0IGNoYW5nZXMuICBUaGUgdHlwaWNhbCByZXNwb25zZSB0byByZWNlaXZpbmcgdGhpcwotICAvLyBjYWxsYmFjayBpcyB0byByZWNyZWF0ZSB0aGUgc3RyZWFtLgotICBjbGFzcyBBdWRpb0RldmljZUxpc3RlbmVyIHsKLSAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQgT25EZXZpY2VDaGFuZ2UoKSA9IDA7Ci0gIH07Ci0KLSAgdmlydHVhbCB2b2lkIEFkZE91dHB1dERldmljZUNoYW5nZUxpc3RlbmVyKEF1ZGlvRGV2aWNlTGlzdGVuZXIqIGxpc3RlbmVyKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBSZW1vdmVPdXRwdXREZXZpY2VDaGFuZ2VMaXN0ZW5lcigKLSAgICAgIEF1ZGlvRGV2aWNlTGlzdGVuZXIqIGxpc3RlbmVyKSA9IDA7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIEF1ZGlvTWFuYWdlcigpOwotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEF1ZGlvTWFuYWdlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9BVURJT19BVURJT19NQU5BR0VSX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fbWFuYWdlcl9iYXNlLmNjIGIvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX21hbmFnZXJfYmFzZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzMzAzOS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fbWFuYWdlcl9iYXNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19tYW5hZ2VyX2Jhc2UuaCIKLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvY29tbWFuZF9saW5lLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3BfcHJveHkuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWQuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19vdXRwdXRfZGlzcGF0Y2hlcl9pbXBsLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fb3V0cHV0X3Byb3h5LmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fb3V0cHV0X3Jlc2FtcGxlci5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3V0aWwuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9mYWtlX2F1ZGlvX2lucHV0X3N0cmVhbS5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2Zha2VfYXVkaW9fb3V0cHV0X3N0cmVhbS5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3ZpcnR1YWxfYXVkaW9faW5wdXRfc3RyZWFtLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vdmlydHVhbF9hdWRpb19vdXRwdXRfc3RyZWFtLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9zd2l0Y2hlcy5oIgotCi0vLyBUT0RPKGRhbGVjdXJ0aXMpOiBUZW1wb3JhcmlseSBkaXNhYmxlZCB3aGlsZSBzd2l0Y2hpbmcgcGlwZWxpbmUgdG8gdXNlIGZsb2F0LAotLy8gaHR0cDovL2NyYnVnLmNvbS8xMTQ3MDAKLSNpZiBkZWZpbmVkKEVOQUJMRV9BVURJT19NSVhFUikKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19vdXRwdXRfbWl4ZXIuaCIKLSNlbmRpZgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1zdGF0aWMgY29uc3QgaW50IGtTdHJlYW1DbG9zZURlbGF5U2Vjb25kcyA9IDU7Ci0KLS8vIERlZmF1bHQgbWF4aW11bSBudW1iZXIgb2Ygb3V0cHV0IHN0cmVhbXMgdGhhdCBjYW4gYmUgb3BlbiBzaW11bHRhbmVvdXNseQotLy8gZm9yIGFsbCBwbGF0Zm9ybXMuCi1zdGF0aWMgY29uc3QgaW50IGtEZWZhdWx0TWF4T3V0cHV0U3RyZWFtcyA9IDE2OwotCi0vLyBEZWZhdWx0IG1heGltdW0gbnVtYmVyIG9mIGlucHV0IHN0cmVhbXMgdGhhdCBjYW4gYmUgb3BlbiBzaW11bHRhbmVvdXNseQotLy8gZm9yIGFsbCBwbGF0Zm9ybXMuCi1zdGF0aWMgY29uc3QgaW50IGtEZWZhdWx0TWF4SW5wdXRTdHJlYW1zID0gMTY7Ci0KLXN0YXRpYyBjb25zdCBpbnQga01heElucHV0Q2hhbm5lbHMgPSAyOwotCi1jb25zdCBjaGFyIEF1ZGlvTWFuYWdlckJhc2U6OmtEZWZhdWx0RGV2aWNlTmFtZVtdID0gIkRlZmF1bHQiOwotY29uc3QgY2hhciBBdWRpb01hbmFnZXJCYXNlOjprRGVmYXVsdERldmljZUlkW10gPSAiZGVmYXVsdCI7Ci0KLUF1ZGlvTWFuYWdlckJhc2U6OkF1ZGlvTWFuYWdlckJhc2UoKQotICAgIDogbnVtX2FjdGl2ZV9pbnB1dF9zdHJlYW1zXygwKSwKLSAgICAgIG1heF9udW1fb3V0cHV0X3N0cmVhbXNfKGtEZWZhdWx0TWF4T3V0cHV0U3RyZWFtcyksCi0gICAgICBtYXhfbnVtX2lucHV0X3N0cmVhbXNfKGtEZWZhdWx0TWF4SW5wdXRTdHJlYW1zKSwKLSAgICAgIG51bV9vdXRwdXRfc3RyZWFtc18oMCksCi0gICAgICBudW1faW5wdXRfc3RyZWFtc18oMCksCi0gICAgICBhdWRpb190aHJlYWRfKG5ldyBiYXNlOjpUaHJlYWQoIkF1ZGlvVGhyZWFkIikpLAotICAgICAgdmlydHVhbF9hdWRpb19pbnB1dF9zdHJlYW1fKE5VTEwpIHsKLSNpZiBkZWZpbmVkKE9TX1dJTikKLSAgYXVkaW9fdGhyZWFkXy0+aW5pdF9jb21fd2l0aF9tdGEodHJ1ZSk7Ci0jZW5kaWYKLSAgQ0hFQ0soYXVkaW9fdGhyZWFkXy0+U3RhcnQoKSk7Ci0gIG1lc3NhZ2VfbG9vcF8gPSBhdWRpb190aHJlYWRfLT5tZXNzYWdlX2xvb3BfcHJveHkoKTsKLX0KLQotQXVkaW9NYW5hZ2VyQmFzZTo6fkF1ZGlvTWFuYWdlckJhc2UoKSB7Ci0gIC8vIFRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBBdWRpb01hbmFnZXIgaW1wbGVtZW50YXRpb24gbXVzdCBoYXZlIGFscmVhZHkKLSAgLy8gc3RvcHBlZCB0aGUgYXVkaW8gdGhyZWFkLiBPdGhlcndpc2UsIHdlIG1heSBkZXN0cm95IGF1ZGlvIHN0cmVhbXMgYmVmb3JlCi0gIC8vIHN0b3BwaW5nIHRoZSB0aHJlYWQsIHJlc3VsdGluZyBhbiB1bmV4cGVjdGVkIGJlaGF2aW9yLgotICAvLyBUaGlzIHdheSB3ZSBtYWtlIHN1cmUgYWN0aXZpdGllcyBvZiB0aGUgYXVkaW8gc3RyZWFtcyBhcmUgYWxsIHN0b3BwZWQKLSAgLy8gYmVmb3JlIHdlIGRlc3Ryb3kgdGhlbS4KLSAgQ0hFQ0soIWF1ZGlvX3RocmVhZF8uZ2V0KCkpOwotICAvLyBBbGwgdGhlIG91dHB1dCBzdHJlYW1zIHNob3VsZCBoYXZlIGJlZW4gZGVsZXRlZC4KLSAgRENIRUNLX0VRKDAsIG51bV9vdXRwdXRfc3RyZWFtc18pOwotICAvLyBBbGwgdGhlIGlucHV0IHN0cmVhbXMgc2hvdWxkIGhhdmUgYmVlbiBkZWxldGVkLgotICBEQ0hFQ0tfRVEoMCwgbnVtX2lucHV0X3N0cmVhbXNfKTsKLX0KLQotc3RyaW5nMTYgQXVkaW9NYW5hZ2VyQmFzZTo6R2V0QXVkaW9JbnB1dERldmljZU1vZGVsKCkgewotICByZXR1cm4gc3RyaW5nMTYoKTsKLX0KLQotc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiBBdWRpb01hbmFnZXJCYXNlOjpHZXRNZXNzYWdlTG9vcCgpIHsKLSAgcmV0dXJuIG1lc3NhZ2VfbG9vcF87Ci19Ci0KLUF1ZGlvT3V0cHV0U3RyZWFtKiBBdWRpb01hbmFnZXJCYXNlOjpNYWtlQXVkaW9PdXRwdXRTdHJlYW0oCi0gICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpIHsKLSAgaWYgKCFwYXJhbXMuSXNWYWxpZCgpKSB7Ci0gICAgRExPRyhFUlJPUikgPDwgIkF1ZGlvIHBhcmFtZXRlcnMgYXJlIGludmFsaWQiOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgLy8gTGltaXQgdGhlIG51bWJlciBvZiBhdWRpbyBzdHJlYW1zIG9wZW5lZC4gVGhpcyBpcyB0byBwcmV2ZW50IHVzaW5nCi0gIC8vIGV4Y2Vzc2l2ZSByZXNvdXJjZXMgZm9yIGEgbGFyZ2UgbnVtYmVyIG9mIGF1ZGlvIHN0cmVhbXMuIE1vcmUKLSAgLy8gaW1wb3J0YW50bHkgaXQgcHJldmVudHMgaW5zdGFiaWxpdHkgb24gY2VydGFpbiBzeXN0ZW1zLgotICAvLyBTZWUgYnVnOiBodHRwOi8vY3JidWcuY29tLzMwMjQyLgotICBpZiAobnVtX291dHB1dF9zdHJlYW1zXyA+PSBtYXhfbnVtX291dHB1dF9zdHJlYW1zXykgewotICAgIERMT0coRVJST1IpIDw8ICJOdW1iZXIgb2Ygb3BlbmVkIG91dHB1dCBhdWRpbyBzdHJlYW1zICIKLSAgICAgICAgICAgICAgICA8PCBudW1fb3V0cHV0X3N0cmVhbXNfCi0gICAgICAgICAgICAgICAgPDwgIiBleGNlZWQgdGhlIG1heCBhbGxvd2VkIG51bWJlciAiCi0gICAgICAgICAgICAgICAgPDwgbWF4X251bV9vdXRwdXRfc3RyZWFtc187Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvLyBJZiB0aGVyZSBhcmUgbm8gYXVkaW8gb3V0cHV0IGRldmljZXMgd2Ugc2hvdWxkIHVzZSBhIEZha2VBdWRpb091dHB1dFN0cmVhbQotICAvLyB0byBlbnN1cmUgdmlkZW8gcGxheWJhY2sgY29udGludWVzIHRvIHdvcmsuCi0gIGJvb2wgYXVkaW9fb3V0cHV0X2Rpc2FibGVkID0KLSAgICAgIHBhcmFtcy5mb3JtYXQoKSA9PSBBdWRpb1BhcmFtZXRlcnM6OkFVRElPX0ZBS0UgfHwKLSAgICAgICFIYXNBdWRpb091dHB1dERldmljZXMoKTsKLQotICBBdWRpb091dHB1dFN0cmVhbSogc3RyZWFtID0gTlVMTDsKLSAgaWYgKHZpcnR1YWxfYXVkaW9faW5wdXRfc3RyZWFtXykgewotI2lmIGRlZmluZWQoT1NfSU9TKQotICAgIC8vIFdlIGRvIG5vdCBjdXJyZW50bHkgc3VwcG9ydCBpT1MuIEl0IGRvZXMgbm90IGxpbmsuCi0gICAgTk9USU1QTEVNRU5URUQoKTsKLSAgICByZXR1cm4gTlVMTDsKLSNlbHNlCi0gICAgc3RyZWFtID0gVmlydHVhbEF1ZGlvT3V0cHV0U3RyZWFtOjpNYWtlU3RyZWFtKHRoaXMsIHBhcmFtcywgbWVzc2FnZV9sb29wXywKLSAgICAgICAgdmlydHVhbF9hdWRpb19pbnB1dF9zdHJlYW1fKTsKLSNlbmRpZgotICB9IGVsc2UgaWYgKGF1ZGlvX291dHB1dF9kaXNhYmxlZCkgewotICAgIHN0cmVhbSA9IEZha2VBdWRpb091dHB1dFN0cmVhbTo6TWFrZUZha2VTdHJlYW0odGhpcywgcGFyYW1zKTsKLSAgfSBlbHNlIGlmIChwYXJhbXMuZm9ybWF0KCkgPT0gQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSKSB7Ci0gICAgc3RyZWFtID0gTWFrZUxpbmVhck91dHB1dFN0cmVhbShwYXJhbXMpOwotICB9IGVsc2UgaWYgKHBhcmFtcy5mb3JtYXQoKSA9PSBBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MT1dfTEFURU5DWSkgewotICAgIHN0cmVhbSA9IE1ha2VMb3dMYXRlbmN5T3V0cHV0U3RyZWFtKHBhcmFtcyk7Ci0gIH0KLQotICBpZiAoc3RyZWFtKQotICAgICsrbnVtX291dHB1dF9zdHJlYW1zXzsKLQotICByZXR1cm4gc3RyZWFtOwotfQotCi1BdWRpb0lucHV0U3RyZWFtKiBBdWRpb01hbmFnZXJCYXNlOjpNYWtlQXVkaW9JbnB1dFN0cmVhbSgKLSAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCkgewotICBpZiAoIXBhcmFtcy5Jc1ZhbGlkKCkgfHwgKHBhcmFtcy5jaGFubmVscygpID4ga01heElucHV0Q2hhbm5lbHMpIHx8Ci0gICAgICBkZXZpY2VfaWQuZW1wdHkoKSkgewotICAgIERMT0coRVJST1IpIDw8ICJBdWRpbyBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkIGZvciBkZXZpY2UgIiA8PCBkZXZpY2VfaWQ7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBpZiAobnVtX2lucHV0X3N0cmVhbXNfID49IG1heF9udW1faW5wdXRfc3RyZWFtc18pIHsKLSAgICBETE9HKEVSUk9SKSA8PCAiTnVtYmVyIG9mIG9wZW5lZCBpbnB1dCBhdWRpbyBzdHJlYW1zICIKLSAgICAgICAgICAgICAgICA8PCBudW1faW5wdXRfc3RyZWFtc18KLSAgICAgICAgICAgICAgICA8PCAiIGV4Y2VlZCB0aGUgbWF4IGFsbG93ZWQgbnVtYmVyICIgPDwgbWF4X251bV9pbnB1dF9zdHJlYW1zXzsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIEF1ZGlvSW5wdXRTdHJlYW0qIHN0cmVhbSA9IE5VTEw7Ci0gIGlmIChwYXJhbXMuZm9ybWF0KCkgPT0gQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19WSVJUVUFMKSB7Ci0jaWYgZGVmaW5lZChPU19JT1MpCi0gICAgLy8gV2UgZG8gbm90IGN1cnJlbnRseSBzdXBwb3J0IGlPUy4KLSAgICBOT1RJTVBMRU1FTlRFRCgpOwotICAgIHJldHVybiBOVUxMOwotI2Vsc2UKLSAgICAvLyBUT0RPKGp1c3Rpbmxpbik6IEN1cnJlbnRseSwgYXVkaW8gbWlycm9yaW5nIHdpbGwgb25seSB3b3JrIGZvciB0aGUgZmlyc3QKLSAgICAvLyByZXF1ZXN0LiBTdWJzZXF1ZW50IHJlcXVlc3RzIHdpbGwgbm90IGdldCBhdWRpby4KLSAgICBpZiAoIXZpcnR1YWxfYXVkaW9faW5wdXRfc3RyZWFtXykgewotICAgICAgdmlydHVhbF9hdWRpb19pbnB1dF9zdHJlYW1fID0KLSAgICAgICAgICBWaXJ0dWFsQXVkaW9JbnB1dFN0cmVhbTo6TWFrZVN0cmVhbSh0aGlzLCBwYXJhbXMsIG1lc3NhZ2VfbG9vcF8pOwotICAgICAgc3RyZWFtID0gdmlydHVhbF9hdWRpb19pbnB1dF9zdHJlYW1fOwotICAgICAgRFZMT0coMSkgPDwgIlZpcnR1YWwgYXVkaW8gaW5wdXQgc3RyZWFtIGNyZWF0ZWQuIjsKLQotICAgICAgLy8gTWFrZSBhbGwgY3VycmVudCBvdXRwdXQgc3RyZWFtcyByZWNyZWF0ZSB0aGVtc2VsdmVzIGFzCi0gICAgICAvLyBWaXJ0dWFsQXVkaW9PdXRwdXRTdHJlYW1zIHRoYXQgd2lsbCBhdHRhY2ggdG8gdGhlIGFib3ZlCi0gICAgICAvLyBWaXJ0dWFsQXVkaW9JbnB1dFN0cmVhbS4KLSAgICAgIG1lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKEZST01fSEVSRSwgYmFzZTo6QmluZCgKLSAgICAgICAgICAmQXVkaW9NYW5hZ2VyQmFzZTo6Tm90aWZ5QWxsT3V0cHV0RGV2aWNlQ2hhbmdlTGlzdGVuZXJzLAotICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLSAgICB9IGVsc2UgewotICAgICAgc3RyZWFtID0gTlVMTDsKLSAgICB9Ci0jZW5kaWYKLSAgfSBlbHNlIGlmIChwYXJhbXMuZm9ybWF0KCkgPT0gQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19GQUtFKSB7Ci0gICAgc3RyZWFtID0gRmFrZUF1ZGlvSW5wdXRTdHJlYW06Ok1ha2VGYWtlU3RyZWFtKHRoaXMsIHBhcmFtcyk7Ci0gIH0gZWxzZSBpZiAocGFyYW1zLmZvcm1hdCgpID09IEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xJTkVBUikgewotICAgIHN0cmVhbSA9IE1ha2VMaW5lYXJJbnB1dFN0cmVhbShwYXJhbXMsIGRldmljZV9pZCk7Ci0gIH0gZWxzZSBpZiAocGFyYW1zLmZvcm1hdCgpID09IEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xPV19MQVRFTkNZKSB7Ci0gICAgc3RyZWFtID0gTWFrZUxvd0xhdGVuY3lJbnB1dFN0cmVhbShwYXJhbXMsIGRldmljZV9pZCk7Ci0gIH0KLQotICBpZiAoc3RyZWFtKQotICAgICsrbnVtX2lucHV0X3N0cmVhbXNfOwotCi0gIHJldHVybiBzdHJlYW07Ci19Ci0KLUF1ZGlvT3V0cHV0U3RyZWFtKiBBdWRpb01hbmFnZXJCYXNlOjpNYWtlQXVkaW9PdXRwdXRTdHJlYW1Qcm94eSgKLSAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcykgewotI2lmIGRlZmluZWQoT1NfSU9TKQotICAvLyBJT1MgaW1wbGVtZW50cyBhdWRpbyBpbnB1dCBvbmx5LgotICBOT1RJTVBMRU1FTlRFRCgpOwotICByZXR1cm4gTlVMTDsKLSNlbHNlCi0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotCi0gIGJvb2wgdXNlX2F1ZGlvX291dHB1dF9yZXNhbXBsZXIgPQotICAgICAgIUNvbW1hbmRMaW5lOjpGb3JDdXJyZW50UHJvY2VzcygpLT5IYXNTd2l0Y2goCi0gICAgICAgICAgc3dpdGNoZXM6OmtEaXNhYmxlQXVkaW9PdXRwdXRSZXNhbXBsZXIpICYmCi0gICAgICBwYXJhbXMuZm9ybWF0KCkgPT0gQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTE9XX0xBVEVOQ1k7Ci0KLSAgLy8gSWYgd2UncmUgbm90IHVzaW5nIEF1ZGlvT3V0cHV0UmVzYW1wbGVyIG91ciBvdXRwdXQgcGFyYW1ldGVycyBhcmUgdGhlIHNhbWUKLSAgLy8gYXMgb3VyIGlucHV0IHBhcmFtZXRlcnMuCi0gIEF1ZGlvUGFyYW1ldGVycyBvdXRwdXRfcGFyYW1zID0gcGFyYW1zOwotICBpZiAodXNlX2F1ZGlvX291dHB1dF9yZXNhbXBsZXIpIHsKLSAgICBvdXRwdXRfcGFyYW1zID0gR2V0UHJlZmVycmVkTG93TGF0ZW5jeU91dHB1dFN0cmVhbVBhcmFtZXRlcnMocGFyYW1zKTsKLQotICAgIC8vIEVuc3VyZSB3ZSBvbmx5IHBhc3Mgb24gdmFsaWQgb3V0cHV0IHBhcmFtZXRlcnMuCi0gICAgaWYgKCFvdXRwdXRfcGFyYW1zLklzVmFsaWQoKSkgewotICAgICAgLy8gV2UndmUgcmVjZWl2ZWQgaW52YWxpZCBhdWRpbyBvdXRwdXQgcGFyYW1ldGVycywgc28gc3dpdGNoIHRvIGEgbW9jawotICAgICAgLy8gb3V0cHV0IGRldmljZSBiYXNlZCBvbiB0aGUgaW5wdXQgcGFyYW1ldGVycy4gIFRoaXMgbWF5IGhhcHBlbiBpZiB0aGUgT1MKLSAgICAgIC8vIHByb3ZpZGVkIHVzIGp1bmsgdmFsdWVzIGZvciB0aGUgaGFyZHdhcmUgY29uZmlndXJhdGlvbi4KLSAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgYXVkaW8gb3V0cHV0IHBhcmFtZXRlcnMgcmVjZWl2ZWQ7IHVzaW5nIGZha2UgIgotICAgICAgICAgICAgICAgICA8PCAiYXVkaW8gcGF0aC4gQ2hhbm5lbHM6ICIgPDwgb3V0cHV0X3BhcmFtcy5jaGFubmVscygpIDw8ICIsICIKLSAgICAgICAgICAgICAgICAgPDwgIlNhbXBsZSBSYXRlOiAiIDw8IG91dHB1dF9wYXJhbXMuc2FtcGxlX3JhdGUoKSA8PCAiLCAiCi0gICAgICAgICAgICAgICAgIDw8ICJCaXRzIFBlciBTYW1wbGU6ICIgPDwgb3V0cHV0X3BhcmFtcy5iaXRzX3Blcl9zYW1wbGUoKQotICAgICAgICAgICAgICAgICA8PCAiLCBGcmFtZXMgUGVyIEJ1ZmZlcjogIgotICAgICAgICAgICAgICAgICA8PCBvdXRwdXRfcGFyYW1zLmZyYW1lc19wZXJfYnVmZmVyKCk7Ci0KLSAgICAgIC8vIFRlbGwgdGhlIEF1ZGlvTWFuYWdlciB0byBjcmVhdGUgYSBmYWtlIG91dHB1dCBkZXZpY2UuCi0gICAgICBvdXRwdXRfcGFyYW1zID0gQXVkaW9QYXJhbWV0ZXJzKAotICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fRkFLRSwgcGFyYW1zLmNoYW5uZWxfbGF5b3V0KCksCi0gICAgICAgICAgcGFyYW1zLnNhbXBsZV9yYXRlKCksIHBhcmFtcy5iaXRzX3Blcl9zYW1wbGUoKSwKLSAgICAgICAgICBwYXJhbXMuZnJhbWVzX3Blcl9idWZmZXIoKSk7Ci0gICAgfQotICB9Ci0KLSAgc3RkOjpwYWlyPEF1ZGlvUGFyYW1ldGVycywgQXVkaW9QYXJhbWV0ZXJzPiBkaXNwYXRjaGVyX2tleSA9Ci0gICAgICBzdGQ6Om1ha2VfcGFpcihwYXJhbXMsIG91dHB1dF9wYXJhbXMpOwotICBBdWRpb091dHB1dERpc3BhdGNoZXJzTWFwOjppdGVyYXRvciBpdCA9Ci0gICAgICBvdXRwdXRfZGlzcGF0Y2hlcnNfLmZpbmQoZGlzcGF0Y2hlcl9rZXkpOwotICBpZiAoaXQgIT0gb3V0cHV0X2Rpc3BhdGNoZXJzXy5lbmQoKSkKLSAgICByZXR1cm4gbmV3IEF1ZGlvT3V0cHV0UHJveHkoaXQtPnNlY29uZCk7Ci0KLSAgYmFzZTo6VGltZURlbHRhIGNsb3NlX2RlbGF5ID0KLSAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoa1N0cmVhbUNsb3NlRGVsYXlTZWNvbmRzKTsKLQotICBpZiAodXNlX2F1ZGlvX291dHB1dF9yZXNhbXBsZXIgJiYKLSAgICAgIG91dHB1dF9wYXJhbXMuZm9ybWF0KCkgIT0gQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19GQUtFKSB7Ci0gICAgc2NvcGVkX3JlZnB0cjxBdWRpb091dHB1dERpc3BhdGNoZXI+IGRpc3BhdGNoZXIgPQotICAgICAgICBuZXcgQXVkaW9PdXRwdXRSZXNhbXBsZXIodGhpcywgcGFyYW1zLCBvdXRwdXRfcGFyYW1zLCBjbG9zZV9kZWxheSk7Ci0gICAgb3V0cHV0X2Rpc3BhdGNoZXJzX1tkaXNwYXRjaGVyX2tleV0gPSBkaXNwYXRjaGVyOwotICAgIHJldHVybiBuZXcgQXVkaW9PdXRwdXRQcm94eShkaXNwYXRjaGVyKTsKLSAgfQotCi0jaWYgZGVmaW5lZChFTkFCTEVfQVVESU9fTUlYRVIpCi0gIC8vIFRPRE8oZGFsZWN1cnRpcyk6IEJyb3dzZXIgc2lkZSBtaXhpbmcgaGFzIGEgY291cGxlIGlzc3VlcyB0aGF0IG11c3QgYmUKLSAgLy8gZml4ZWQgYmVmb3JlIGl0IGNhbiBiZSB0dXJuZWQgb24gYnkgZGVmYXVsdDogaHR0cDovL2NyYnVnLmNvbS8xMzgwOTggYW5kCi0gIC8vIGh0dHA6Ly9jcmJ1Zy5jb20vMTQwMjQ3Ci0gIGlmIChjbWRfbGluZS0+SGFzU3dpdGNoKHN3aXRjaGVzOjprRW5hYmxlQXVkaW9NaXhlcikpIHsKLSAgICBzY29wZWRfcmVmcHRyPEF1ZGlvT3V0cHV0RGlzcGF0Y2hlcj4gZGlzcGF0Y2hlciA9Ci0gICAgICAgIG5ldyBBdWRpb091dHB1dE1peGVyKHRoaXMsIHBhcmFtcywgY2xvc2VfZGVsYXkpOwotICAgIG91dHB1dF9kaXNwYXRjaGVyc19bZGlzcGF0Y2hlcl9rZXldID0gZGlzcGF0Y2hlcjsKLSAgICByZXR1cm4gbmV3IEF1ZGlvT3V0cHV0UHJveHkoZGlzcGF0Y2hlcik7Ci0gIH0KLSNlbmRpZgotCi0gIHNjb3BlZF9yZWZwdHI8QXVkaW9PdXRwdXREaXNwYXRjaGVyPiBkaXNwYXRjaGVyID0KLSAgICAgIG5ldyBBdWRpb091dHB1dERpc3BhdGNoZXJJbXBsKHRoaXMsIG91dHB1dF9wYXJhbXMsIGNsb3NlX2RlbGF5KTsKLSAgb3V0cHV0X2Rpc3BhdGNoZXJzX1tkaXNwYXRjaGVyX2tleV0gPSBkaXNwYXRjaGVyOwotICByZXR1cm4gbmV3IEF1ZGlvT3V0cHV0UHJveHkoZGlzcGF0Y2hlcik7Ci0jZW5kaWYgIC8vIGRlZmluZWQoT1NfSU9TKQotfQotCi1ib29sIEF1ZGlvTWFuYWdlckJhc2U6OkNhblNob3dBdWRpb0lucHV0U2V0dGluZ3MoKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBBdWRpb01hbmFnZXJCYXNlOjpTaG93QXVkaW9JbnB1dFNldHRpbmdzKCkgewotfQotCi12b2lkIEF1ZGlvTWFuYWdlckJhc2U6OkdldEF1ZGlvSW5wdXREZXZpY2VOYW1lcygKLSAgICBtZWRpYTo6QXVkaW9EZXZpY2VOYW1lcyogZGV2aWNlX25hbWVzKSB7Ci19Ci0KLXZvaWQgQXVkaW9NYW5hZ2VyQmFzZTo6UmVsZWFzZU91dHB1dFN0cmVhbShBdWRpb091dHB1dFN0cmVhbSogc3RyZWFtKSB7Ci0gIERDSEVDSyhzdHJlYW0pOwotICAvLyBUT0RPKHhpYW5zKSA6IEhhdmUgYSBjbGVhcmVyIGRlc3RydWN0aW9uIHBhdGggZm9yIHRoZSBBdWRpb091dHB1dFN0cmVhbS4KLSAgLy8gRm9yIGV4YW1wbGUsIHBhc3MgdGhlIG93bmVyc2hpcCB0byBBdWRpb01hbmFnZXIgc28gaXQgY2FuIGRlbGV0ZSB0aGUKLSAgLy8gc3RyZWFtcy4KLSAgbnVtX291dHB1dF9zdHJlYW1zXy0tOwotICBkZWxldGUgc3RyZWFtOwotfQotCi12b2lkIEF1ZGlvTWFuYWdlckJhc2U6OlJlbGVhc2VJbnB1dFN0cmVhbShBdWRpb0lucHV0U3RyZWFtKiBzdHJlYW0pIHsKLSAgRENIRUNLKHN0cmVhbSk7Ci0gIC8vIFRPRE8oeGlhbnMpIDogSGF2ZSBhIGNsZWFyZXIgZGVzdHJ1Y3Rpb24gcGF0aCBmb3IgdGhlIEF1ZGlvSW5wdXRTdHJlYW0uCi0KLSAgaWYgKHZpcnR1YWxfYXVkaW9faW5wdXRfc3RyZWFtXyA9PSBzdHJlYW0pIHsKLSAgICBEVkxPRygxKSA8PCAiVmlydHVhbCBhdWRpbyBpbnB1dCBzdHJlYW0gc3RvcHBpbmcuIjsKLSAgICB2aXJ0dWFsX2F1ZGlvX2lucHV0X3N0cmVhbV8tPlN0b3AoKTsKLSAgICB2aXJ0dWFsX2F1ZGlvX2lucHV0X3N0cmVhbV8gPSBOVUxMOwotCi0gICAgLy8gTWFrZSBhbGwgVmlydHVhbEF1ZGlvT3V0cHV0U3RyZWFtcyB1bnJlZ2lzdGVyIGZyb20gdGhlCi0gICAgLy8gVmlydHVhbEF1ZGlvSW5wdXRTdHJlYW0gYW5kIHJlY3JlYXRlIHRoZW1zZWx2ZXMgYXMgcmVndWxhciBhdWRpbyBzdHJlYW1zCi0gICAgLy8gdG8gcmV0dXJuIHNvdW5kIHRvIGhhcmR3YXJlLgotICAgIE5vdGlmeUFsbE91dHB1dERldmljZUNoYW5nZUxpc3RlbmVycygpOwotICB9Ci0KLSAgbnVtX2lucHV0X3N0cmVhbXNfLS07Ci0gIGRlbGV0ZSBzdHJlYW07Ci19Ci0KLXZvaWQgQXVkaW9NYW5hZ2VyQmFzZTo6SW5jcmVhc2VBY3RpdmVJbnB1dFN0cmVhbUNvdW50KCkgewotICBiYXNlOjpBdG9taWNSZWZDb3VudEluYygmbnVtX2FjdGl2ZV9pbnB1dF9zdHJlYW1zXyk7Ci19Ci0KLXZvaWQgQXVkaW9NYW5hZ2VyQmFzZTo6RGVjcmVhc2VBY3RpdmVJbnB1dFN0cmVhbUNvdW50KCkgewotICBEQ0hFQ0soSXNSZWNvcmRpbmdJblByb2Nlc3MoKSk7Ci0gIGJhc2U6OkF0b21pY1JlZkNvdW50RGVjKCZudW1fYWN0aXZlX2lucHV0X3N0cmVhbXNfKTsKLX0KLQotYm9vbCBBdWRpb01hbmFnZXJCYXNlOjpJc1JlY29yZGluZ0luUHJvY2VzcygpIHsKLSAgcmV0dXJuICFiYXNlOjpBdG9taWNSZWZDb3VudElzWmVybygmbnVtX2FjdGl2ZV9pbnB1dF9zdHJlYW1zXyk7Ci19Ci0KLXZvaWQgQXVkaW9NYW5hZ2VyQmFzZTo6U2h1dGRvd24oKSB7Ci0gIC8vIFRvIGF2b2lkIHJ1bm5pbmcgaW50byBkZWFkbG9ja3Mgd2hpbGUgd2Ugc3RvcCB0aGUgdGhyZWFkLCBzaHV0IGl0IGRvd24KLSAgLy8gdmlhIGEgbG9jYWwgdmFyaWFibGUgd2hpbGUgbm90IGhvbGRpbmcgdGhlIGF1ZGlvIHRocmVhZCBsb2NrLgotICBzY29wZWRfcHRyPGJhc2U6OlRocmVhZD4gYXVkaW9fdGhyZWFkOwotICB7Ci0gICAgYmFzZTo6QXV0b0xvY2sgbG9jayhhdWRpb190aHJlYWRfbG9ja18pOwotICAgIGF1ZGlvX3RocmVhZF8uc3dhcChhdWRpb190aHJlYWQpOwotICB9Ci0KLSAgaWYgKCFhdWRpb190aHJlYWQuZ2V0KCkpCi0gICAgcmV0dXJuOwotCi0gIENIRUNLX05FKE1lc3NhZ2VMb29wOjpjdXJyZW50KCksIGF1ZGlvX3RocmVhZC0+bWVzc2FnZV9sb29wKCkpOwotCi0gIC8vIFdlIG11c3QgdXNlIGJhc2U6OlVucmV0YWluZWQgc2luY2UgU2h1dGRvd24gbWlnaHQgaGF2ZSBiZWVuIGNhbGxlZCBmcm9tCi0gIC8vIHRoZSBkZXN0cnVjdG9yIGFuZCB3ZSBjYW4ndCBhbHRlciB0aGUgcmVmY291bnQgb2YgdGhlIG9iamVjdCBhdCB0aGF0IHBvaW50LgotICBhdWRpb190aHJlYWQtPm1lc3NhZ2VfbG9vcCgpLT5Qb3N0VGFzayhGUk9NX0hFUkUsIGJhc2U6OkJpbmQoCi0gICAgICAmQXVkaW9NYW5hZ2VyQmFzZTo6U2h1dGRvd25PbkF1ZGlvVGhyZWFkLAotICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotCi0gIC8vIFN0b3AoKSB3aWxsIHdhaXQgZm9yIGFueSBwb3N0ZWQgbWVzc2FnZXMgdG8gYmUgcHJvY2Vzc2VkIGZpcnN0LgotICBhdWRpb190aHJlYWQtPlN0b3AoKTsKLX0KLQotdm9pZCBBdWRpb01hbmFnZXJCYXNlOjpTaHV0ZG93bk9uQXVkaW9UaHJlYWQoKSB7Ci0vLyBJT1MgaW1wbGVtZW50cyBhdWRpbyBpbnB1dCBvbmx5LgotI2lmIGRlZmluZWQoT1NfSU9TKQotICByZXR1cm47Ci0jZWxzZQotICAvLyBUaGlzIHNob3VsZCBhbHdheXMgYmUgcnVubmluZyBvbiB0aGUgYXVkaW8gdGhyZWFkLCBidXQgc2luY2Ugd2UndmUgY2xlYXJlZAotICAvLyB0aGUgYXVkaW9fdGhyZWFkXyBtZW1iZXIgcG9pbnRlciB3aGVuIHdlIGdldCBoZXJlLCB3ZSBjYW4ndCB2ZXJpZnkgZXhhY3RseQotICAvLyB3aGF0IHRocmVhZCB3ZSdyZSBydW5uaW5nIG9uLiAgVGhlIG1ldGhvZCBpcyBub3QgcHVibGljIHRob3VnaCBhbmQgb25seQotICAvLyBjYWxsZWQgZnJvbSBvbmUgcGxhY2UsIHNvIHdlJ2xsIGxlYXZlIGl0IGF0IHRoYXQuCi0gIEF1ZGlvT3V0cHV0RGlzcGF0Y2hlcnNNYXA6Oml0ZXJhdG9yIGl0ID0gb3V0cHV0X2Rpc3BhdGNoZXJzXy5iZWdpbigpOwotICBmb3IgKDsgaXQgIT0gb3V0cHV0X2Rpc3BhdGNoZXJzXy5lbmQoKTsgKytpdCkgewotICAgIHNjb3BlZF9yZWZwdHI8QXVkaW9PdXRwdXREaXNwYXRjaGVyPiYgZGlzcGF0Y2hlciA9ICgqaXQpLnNlY29uZDsKLSAgICBpZiAoZGlzcGF0Y2hlcikgewotICAgICAgZGlzcGF0Y2hlci0+U2h1dGRvd24oKTsKLSAgICAgIC8vIEFsbCBBdWRpb091dHB1dFByb3hpZXMgbXVzdCBoYXZlIGJlZW4gZnJlZWQgYmVmb3JlIFNodXRkb3duIGlzIGNhbGxlZC4KLSAgICAgIC8vIElmIHRoZXkgc3RpbGwgZXhpc3QsIHRoaW5ncyB3aWxsIGdvIGJhZC4gIFRoZXkgaGF2ZSBkaXJlY3QgcG9pbnRlcnMgdG8KLSAgICAgIC8vIGJvdGggcGh5c2ljYWwgYXVkaW8gc3RyZWFtIG9iamVjdHMgdGhhdCBiZWxvbmcgdG8gdGhlIGRpc3BhdGNoZXIgYXMKLSAgICAgIC8vIHdlbGwgYXMgdGhlIG1lc3NhZ2UgbG9vcCBvZiB0aGUgYXVkaW8gdGhyZWFkIHRoYXQgd2lsbCBzb29uIGdvIGF3YXkuCi0gICAgICAvLyBTbywgYmV0dGVyIGNyYXNoIG5vdyB0aGFuIGxhdGVyLgotICAgICAgRENIRUNLKGRpc3BhdGNoZXItPkhhc09uZVJlZigpKSA8PCAiQXVkaW9PdXRwdXRQcm94aWVzIGFyZSBzdGlsbCBhbGl2ZSI7Ci0gICAgICBkaXNwYXRjaGVyID0gTlVMTDsKLSAgICB9Ci0gIH0KLQotICBvdXRwdXRfZGlzcGF0Y2hlcnNfLmNsZWFyKCk7Ci0jZW5kaWYgIC8vIGRlZmluZWQoT1NfSU9TKQotfQotCi1BdWRpb1BhcmFtZXRlcnMgQXVkaW9NYW5hZ2VyQmFzZTo6R2V0UHJlZmVycmVkTG93TGF0ZW5jeU91dHB1dFN0cmVhbVBhcmFtZXRlcnMoCi0gICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBpbnB1dF9wYXJhbXMpIHsKLSNpZiBkZWZpbmVkKE9TX0lPUykKLSAgLy8gSU9TIGltcGxlbWVudHMgYXVkaW8gaW5wdXQgb25seS4KLSAgTk9USU1QTEVNRU5URUQoKTsKLSAgcmV0dXJuIEF1ZGlvUGFyYW1ldGVycygpOwotI2Vsc2UKLSAgLy8gVE9ETyhkYWxlY3VydGlzKTogVGhpcyBzaG91bGQgaW5jbHVkZSBiaXRzIHBlciBjaGFubmVsIGFuZCBjaGFubmVsIGxheW91dAotICAvLyBldmVudHVhbGx5LgotICByZXR1cm4gQXVkaW9QYXJhbWV0ZXJzKAotICAgICAgQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTE9XX0xBVEVOQ1ksIGlucHV0X3BhcmFtcy5jaGFubmVsX2xheW91dCgpLAotICAgICAgR2V0QXVkaW9IYXJkd2FyZVNhbXBsZVJhdGUoKSwgMTYsIEdldEF1ZGlvSGFyZHdhcmVCdWZmZXJTaXplKCkpOwotI2VuZGlmICAvLyBkZWZpbmVkKE9TX0lPUykKLX0KLQotdm9pZCBBdWRpb01hbmFnZXJCYXNlOjpBZGRPdXRwdXREZXZpY2VDaGFuZ2VMaXN0ZW5lcigKLSAgICBBdWRpb0RldmljZUxpc3RlbmVyKiBsaXN0ZW5lcikgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgb3V0cHV0X2xpc3RlbmVyc18uQWRkT2JzZXJ2ZXIobGlzdGVuZXIpOwotfQotCi12b2lkIEF1ZGlvTWFuYWdlckJhc2U6OlJlbW92ZU91dHB1dERldmljZUNoYW5nZUxpc3RlbmVyKAotICAgIEF1ZGlvRGV2aWNlTGlzdGVuZXIqIGxpc3RlbmVyKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBvdXRwdXRfbGlzdGVuZXJzXy5SZW1vdmVPYnNlcnZlcihsaXN0ZW5lcik7Ci19Ci0KLXZvaWQgQXVkaW9NYW5hZ2VyQmFzZTo6Tm90aWZ5QWxsT3V0cHV0RGV2aWNlQ2hhbmdlTGlzdGVuZXJzKCkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgRFZMT0coMSkgPDwgIkZpcmluZyBPbkRldmljZUNoYW5nZSgpIG5vdGlmaWNhdGlvbnMuIjsKLSAgRk9SX0VBQ0hfT0JTRVJWRVIoQXVkaW9EZXZpY2VMaXN0ZW5lciwgb3V0cHV0X2xpc3RlbmVyc18sIE9uRGV2aWNlQ2hhbmdlKCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb19tYW5hZ2VyX2Jhc2UuaCBiL3NyYy9tZWRpYS9hdWRpby9hdWRpb19tYW5hZ2VyX2Jhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNhZDk4Yi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fbWFuYWdlcl9iYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9BVURJT19BVURJT19NQU5BR0VSX0JBU0VfSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fQVVESU9fTUFOQUdFUl9CQVNFX0hfCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlICJiYXNlL2F0b21pY19yZWZfY291bnQuaCIKLSNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgImJhc2Uvb2JzZXJ2ZXJfbGlzdC5oIgotI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19tYW5hZ2VyLmgiCi0KLSNpZiBkZWZpbmVkKE9TX1dJTikKLSNpbmNsdWRlICJiYXNlL3dpbi9zY29wZWRfY29tX2luaXRpYWxpemVyLmgiCi0jZW5kaWYKLQotbmFtZXNwYWNlIGJhc2UgewotY2xhc3MgVGhyZWFkOwotfQotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBBdWRpb091dHB1dERpc3BhdGNoZXI7Ci1jbGFzcyBWaXJ0dWFsQXVkaW9JbnB1dFN0cmVhbTsKLQotLy8gQXVkaW9NYW5hZ2VyQmFzZSBwcm92aWRlcyBBdWRpb01hbmFnZXIgZnVuY3Rpb25zIGNvbW1vbiBmb3IgYWxsIHBsYXRmb3Jtcy4KLWNsYXNzIE1FRElBX0VYUE9SVCBBdWRpb01hbmFnZXJCYXNlIDogcHVibGljIEF1ZGlvTWFuYWdlciB7Ci0gcHVibGljOgotICAvLyBOYW1lIG9mIHRoZSBnZW5lcmljICJkZWZhdWx0IiBkZXZpY2UuCi0gIHN0YXRpYyBjb25zdCBjaGFyIGtEZWZhdWx0RGV2aWNlTmFtZVtdOwotICAvLyBVbmlxdWUgSWQgb2YgdGhlIGdlbmVyaWMgImRlZmF1bHQiIGRldmljZS4KLSAgc3RhdGljIGNvbnN0IGNoYXIga0RlZmF1bHREZXZpY2VJZFtdOwotCi0gIHZpcnR1YWwgfkF1ZGlvTWFuYWdlckJhc2UoKTsKLQotICB2aXJ0dWFsIHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4gR2V0TWVzc2FnZUxvb3AoKSBPVkVSUklERTsKLQotICB2aXJ0dWFsIHN0cmluZzE2IEdldEF1ZGlvSW5wdXREZXZpY2VNb2RlbCgpIE9WRVJSSURFOwotCi0gIHZpcnR1YWwgYm9vbCBDYW5TaG93QXVkaW9JbnB1dFNldHRpbmdzKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTaG93QXVkaW9JbnB1dFNldHRpbmdzKCkgT1ZFUlJJREU7Ci0KLSAgdmlydHVhbCB2b2lkIEdldEF1ZGlvSW5wdXREZXZpY2VOYW1lcygKLSAgICAgIG1lZGlhOjpBdWRpb0RldmljZU5hbWVzKiBkZXZpY2VfbmFtZXMpIE9WRVJSSURFOwotCi0gIHZpcnR1YWwgQXVkaW9PdXRwdXRTdHJlYW0qIE1ha2VBdWRpb091dHB1dFN0cmVhbSgKLSAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKSBPVkVSUklERTsKLQotICB2aXJ0dWFsIEF1ZGlvSW5wdXRTdHJlYW0qIE1ha2VBdWRpb0lucHV0U3RyZWFtKAotICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfaWQpIE9WRVJSSURFOwotCi0gIHZpcnR1YWwgQXVkaW9PdXRwdXRTdHJlYW0qIE1ha2VBdWRpb091dHB1dFN0cmVhbVByb3h5KAotICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpIE9WRVJSSURFOwotCi0gIHZpcnR1YWwgYm9vbCBJc1JlY29yZGluZ0luUHJvY2VzcygpIE9WRVJSSURFOwotCi0gIC8vIENhbGxlZCBpbnRlcm5hbGx5IGJ5IHRoZSBhdWRpbyBzdHJlYW0gd2hlbiBpdCBoYXMgYmVlbiBjbG9zZWQuCi0gIHZpcnR1YWwgdm9pZCBSZWxlYXNlT3V0cHV0U3RyZWFtKEF1ZGlvT3V0cHV0U3RyZWFtKiBzdHJlYW0pOwotICB2aXJ0dWFsIHZvaWQgUmVsZWFzZUlucHV0U3RyZWFtKEF1ZGlvSW5wdXRTdHJlYW0qIHN0cmVhbSk7Ci0KLSAgdm9pZCBJbmNyZWFzZUFjdGl2ZUlucHV0U3RyZWFtQ291bnQoKTsKLSAgdm9pZCBEZWNyZWFzZUFjdGl2ZUlucHV0U3RyZWFtQ291bnQoKTsKLQotICAvLyBDcmVhdGVzIHRoZSBvdXRwdXQgc3RyZWFtIGZvciB0aGUgfEFVRElPX1BDTV9MSU5FQVJ8IGZvcm1hdC4gVGhlIGxlZ2FjeQotICAvLyBuYW1lIGlzIGFsc28gZnJvbSB8QVVESU9fUENNX0xJTkVBUnwuCi0gIHZpcnR1YWwgQXVkaW9PdXRwdXRTdHJlYW0qIE1ha2VMaW5lYXJPdXRwdXRTdHJlYW0oCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcykgPSAwOwotCi0gIC8vIENyZWF0ZXMgdGhlIG91dHB1dCBzdHJlYW0gZm9yIHRoZSB8QVVESU9fUENNX0xPV19MQVRFTkNZfCBmb3JtYXQuCi0gIHZpcnR1YWwgQXVkaW9PdXRwdXRTdHJlYW0qIE1ha2VMb3dMYXRlbmN5T3V0cHV0U3RyZWFtKAotICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpID0gMDsKLQotICAvLyBDcmVhdGVzIHRoZSBpbnB1dCBzdHJlYW0gZm9yIHRoZSB8QVVESU9fUENNX0xJTkVBUnwgZm9ybWF0LiBUaGUgbGVnYWN5Ci0gIC8vIG5hbWUgaXMgYWxzbyBmcm9tIHxBVURJT19QQ01fTElORUFSfC4KLSAgdmlydHVhbCBBdWRpb0lucHV0U3RyZWFtKiBNYWtlTGluZWFySW5wdXRTdHJlYW0oCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCkgPSAwOwotCi0gIC8vIENyZWF0ZXMgdGhlIGlucHV0IHN0cmVhbSBmb3IgdGhlIHxBVURJT19QQ01fTE9XX0xBVEVOQ1l8IGZvcm1hdC4KLSAgdmlydHVhbCBBdWRpb0lucHV0U3RyZWFtKiBNYWtlTG93TGF0ZW5jeUlucHV0U3RyZWFtKAotICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfaWQpID0gMDsKLQotICAvLyBSZXR1cm5zIHRoZSBwcmVmZXJyZWQgaGFyZHdhcmUgYXVkaW8gb3V0cHV0IHBhcmFtZXRlcnMgZm9yIG9wZW5pbmcgb3V0cHV0Ci0gIC8vIHN0cmVhbXMgaW4gdGhlIHxBVURJT19QQ01fTE9XX0xBVEVOQ1l8IGZvcm1hdC4KLSAgLy8gVE9ETyhkYWxlY3VydGlzKTogUmV0cmlldmUgdGhlIHxjaGFubmVsX2xheW91dHwgdmFsdWUgZnJvbSBoYXJkd2FyZSBpbnN0ZWFkCi0gIC8vIG9mIGFjY2VwdGluZyB0aGUgdmFsdWUuCi0gIC8vIFRPRE8oZGFsZWN1cnRpcyk6IEVhY2ggQXVkaW9NYW5hZ2VyIHNob3VsZCBpbXBsZW1lbnQgdGhlaXIgb3duIHZlcnNpb24sIHNlZQotICAvLyBodHRwOi8vY3JidWcuY29tLzEzNzMyNgotICB2aXJ0dWFsIEF1ZGlvUGFyYW1ldGVycyBHZXRQcmVmZXJyZWRMb3dMYXRlbmN5T3V0cHV0U3RyZWFtUGFyYW1ldGVycygKLSAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgaW5wdXRfcGFyYW1zKTsKLQotICAvLyBMaXN0ZW5lcnMgd2lsbCBiZSBub3RpZmllZCBvbiB0aGUgQXVkaW9NYW5hZ2VyOjpHZXRNZXNzYWdlTG9vcCgpIGxvb3AuCi0gIHZpcnR1YWwgdm9pZCBBZGRPdXRwdXREZXZpY2VDaGFuZ2VMaXN0ZW5lcigKLSAgICAgIEF1ZGlvRGV2aWNlTGlzdGVuZXIqIGxpc3RlbmVyKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFJlbW92ZU91dHB1dERldmljZUNoYW5nZUxpc3RlbmVyKAotICAgICAgQXVkaW9EZXZpY2VMaXN0ZW5lciogbGlzdGVuZXIpIE9WRVJSSURFOwotCi0gcHJvdGVjdGVkOgotICBBdWRpb01hbmFnZXJCYXNlKCk7Ci0KLSAgLy8gVE9ETyhkYWxlY3VydGlzKTogVGhpcyBtdXN0IGNoYW5nZSB0byBtYXAgYm90aCBpbnB1dCBhbmQgb3V0cHV0IHBhcmFtZXRlcnMKLSAgLy8gdG8gYSBzaW5nbGUgZGlzcGF0Y2hlciwgb3RoZXJ3aXNlIG9uIGEgZGV2aWNlIHN0YXRlIGNoYW5nZSB3ZSdsbCBqdXN0IGdldAotICAvLyB0aGUgZXhhY3Qgc2FtZSBpbnZhbGlkIGRpc3BhdGNoZXIuCi0gIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpwYWlyPEF1ZGlvUGFyYW1ldGVycywgQXVkaW9QYXJhbWV0ZXJzPiwKLSAgICAgICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPEF1ZGlvT3V0cHV0RGlzcGF0Y2hlcj4gPgotICAgICAgQXVkaW9PdXRwdXREaXNwYXRjaGVyc01hcDsKLQotICAvLyBTaHV0cyBkb3duIHRoZSBhdWRpbyB0aHJlYWQgYW5kIHJlbGVhc2VzIGFsbCB0aGUgYXVkaW8gb3V0cHV0IGRpc3BhdGNoZXJzCi0gIC8vIG9uIHRoZSBhdWRpbyB0aHJlYWQuICBBbGwgYXVkaW8gc3RyZWFtcyBzaG91bGQgYmUgZnJlZWQgYmVmb3JlIFNodXRkb3duKCkKLSAgLy8gaXMgY2FsbGVkLiAgVGhpcyBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgZGVzdHJ1Y3RvciBvZiBldmVyeSBBdWRpb01hbmFnZXJCYXNlCi0gIC8vIGltcGxlbWVudGF0aW9uLgotICB2b2lkIFNodXRkb3duKCk7Ci0KLSAgdm9pZCBTZXRNYXhPdXRwdXRTdHJlYW1zQWxsb3dlZChpbnQgbWF4KSB7IG1heF9udW1fb3V0cHV0X3N0cmVhbXNfID0gbWF4OyB9Ci0KLSAgLy8gQ2FsbGVkIGJ5IGVhY2ggcGxhdGZvcm0gc3BlY2lmaWMgQXVkaW9NYW5hZ2VyIHRvIG5vdGlmeSBvdXRwdXQgc3RhdGUgY2hhbmdlCi0gIC8vIGxpc3RlbmVycyB0aGF0IGEgc3RhdGUgY2hhbmdlIGhhcyBvY2N1cnJlZC4gIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIGF1ZGlvCi0gIC8vIHRocmVhZC4KLSAgdm9pZCBOb3RpZnlBbGxPdXRwdXREZXZpY2VDaGFuZ2VMaXN0ZW5lcnMoKTsKLQotICAvLyBNYXAgb2YgY2FjaGVkIEF1ZGlvT3V0cHV0RGlzcGF0Y2hlciBpbnN0YW5jZXMuICBNdXN0IG9ubHkgYmUgdG91Y2hlZAotICAvLyBmcm9tIHRoZSBhdWRpbyB0aHJlYWQgKG5vIGxvY2tpbmcpLgotICBBdWRpb091dHB1dERpc3BhdGNoZXJzTWFwIG91dHB1dF9kaXNwYXRjaGVyc187Ci0KLSBwcml2YXRlOgotICAvLyBDYWxsZWQgYnkgU2h1dGRvd24oKS4KLSAgdm9pZCBTaHV0ZG93bk9uQXVkaW9UaHJlYWQoKTsKLQotICAvLyBDb3VudHMgdGhlIG51bWJlciBvZiBhY3RpdmUgaW5wdXQgc3RyZWFtcyB0byBmaW5kIG91dCBpZiBzb21ldGhpbmcgZWxzZQotICAvLyBpcyBjdXJyZW50bHkgcmVjb3JkaW5nIGluIENocm9tZS4KLSAgYmFzZTo6QXRvbWljUmVmQ291bnQgbnVtX2FjdGl2ZV9pbnB1dF9zdHJlYW1zXzsKLQotICAvLyBNYXggbnVtYmVyIG9mIG9wZW4gb3V0cHV0IHN0cmVhbXMsIG1vZGlmaWVkIGJ5Ci0gIC8vIFNldE1heE91dHB1dFN0cmVhbXNBbGxvd2VkKCkuCi0gIGludCBtYXhfbnVtX291dHB1dF9zdHJlYW1zXzsKLQotICAvLyBNYXggbnVtYmVyIG9mIG9wZW4gaW5wdXQgc3RyZWFtcy4KLSAgaW50IG1heF9udW1faW5wdXRfc3RyZWFtc187Ci0KLSAgLy8gTnVtYmVyIG9mIGN1cnJlbnRseSBvcGVuIG91dHB1dCBzdHJlYW1zLgotICBpbnQgbnVtX291dHB1dF9zdHJlYW1zXzsKLQotICAvLyBOdW1iZXIgb2YgY3VycmVudGx5IG9wZW4gaW5wdXQgc3RyZWFtcy4KLSAgaW50IG51bV9pbnB1dF9zdHJlYW1zXzsKLQotICAvLyBUcmFjayBvdXRwdXQgc3RhdGUgY2hhbmdlIGxpc3RlbmVycy4KLSAgT2JzZXJ2ZXJMaXN0PEF1ZGlvRGV2aWNlTGlzdGVuZXI+IG91dHB1dF9saXN0ZW5lcnNfOwotCi0gIC8vIFRocmVhZCB1c2VkIHRvIGludGVyYWN0IHdpdGggYXVkaW8gc3RyZWFtcyBjcmVhdGVkIGJ5IHRoaXMgYXVkaW8gbWFuYWdlci4KLSAgc2NvcGVkX3B0cjxiYXNlOjpUaHJlYWQ+IGF1ZGlvX3RocmVhZF87Ci0gIG11dGFibGUgYmFzZTo6TG9jayBhdWRpb190aHJlYWRfbG9ja187Ci0KLSAgLy8gVGhlIG1lc3NhZ2UgbG9vcCBvZiB0aGUgYXVkaW8gdGhyZWFkIHRoaXMgb2JqZWN0IHJ1bnMgb24uIFVzZWQgZm9yIGludGVybmFsCi0gIC8vIHRhc2tzIHdoaWNoIHJ1biBvbiB0aGUgYXVkaW8gdGhyZWFkIGV2ZW4gYWZ0ZXIgU2h1dGRvd24oKSBoYXMgYmVlbiBzdGFydGVkCi0gIC8vIGFuZCBHZXRNZXNzYWdlTG9vcCgpIHN0YXJ0cyByZXR1cm5pbmcgTlVMTC4KLSAgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiBtZXNzYWdlX2xvb3BfOwotCi0gIC8vIEN1cnJlbnRseSBhY3RpdmUgVmlydHVhbEF1ZGlvSW5wdXRTdHJlYW0uIFdoZW4gdGhpcyBpcyBzZXQsIHdlIHdpbGwKLSAgLy8gY3JlYXRlIGFsbCBhdWRpbyBvdXRwdXQgc3RyZWFtcyBhcyB2aXJ0dWFsIHN0cmVhbXMgc28gYXMgdG8gcmVkaXJlY3QgYXVkaW8KLSAgLy8gZGF0YSB0byB0aGlzIHZpcnR1YWwgaW5wdXQgc3RyZWFtLgotICBWaXJ0dWFsQXVkaW9JbnB1dFN0cmVhbSogdmlydHVhbF9hdWRpb19pbnB1dF9zdHJlYW1fOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBdWRpb01hbmFnZXJCYXNlKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0FVRElPX0FVRElPX01BTkFHRVJfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9jb250cm9sbGVyLmNjIGIvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9jb250cm9sbGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDg1MGM5Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb19vdXRwdXRfY29udHJvbGxlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDQwMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fb3V0cHV0X2NvbnRyb2xsZXIuaCIKLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgotI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL3dhaXRhYmxlX2V2ZW50LmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvcGxhdGZvcm1fdGhyZWFkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX3Jlc3RyaWN0aW9ucy5oIgotI2luY2x1ZGUgImJhc2UvdGltZS5oIgotI2luY2x1ZGUgImJ1aWxkL2J1aWxkX2NvbmZpZy5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3NoYXJlZF9tZW1vcnlfdXRpbC5oIgotCi11c2luZyBiYXNlOjpUaW1lOwotdXNpbmcgYmFzZTo6VGltZURlbHRhOwotdXNpbmcgYmFzZTo6V2FpdGFibGVFdmVudDsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gUG9sbGluZy1yZWxhdGVkIGNvbnN0YW50cy4KLWNvbnN0IGludCBBdWRpb091dHB1dENvbnRyb2xsZXI6OmtQb2xsTnVtQXR0ZW1wdHMgPSAzOwotY29uc3QgaW50IEF1ZGlvT3V0cHV0Q29udHJvbGxlcjo6a1BvbGxQYXVzZUluTWlsbGlzZWNvbmRzID0gMzsKLQotQXVkaW9PdXRwdXRDb250cm9sbGVyOjpBdWRpb091dHB1dENvbnRyb2xsZXIoQXVkaW9NYW5hZ2VyKiBhdWRpb19tYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRIYW5kbGVyKiBoYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW5jUmVhZGVyKiBzeW5jX3JlYWRlcikKLSAgICA6IGF1ZGlvX21hbmFnZXJfKGF1ZGlvX21hbmFnZXIpLAotICAgICAgaGFuZGxlcl8oaGFuZGxlciksCi0gICAgICBzdHJlYW1fKE5VTEwpLAotICAgICAgdm9sdW1lXygxLjApLAotICAgICAgc3RhdGVfKGtFbXB0eSksCi0gICAgICBzeW5jX3JlYWRlcl8oc3luY19yZWFkZXIpLAotICAgICAgbWVzc2FnZV9sb29wXyhhdWRpb19tYW5hZ2VyLT5HZXRNZXNzYWdlTG9vcCgpKSwKLSAgICAgIG51bWJlcl9wb2xsaW5nX2F0dGVtcHRzX2xlZnRfKDApLAotICAgICAgcGFyYW1zXyhwYXJhbXMpLAotICAgICAgQUxMT1dfVEhJU19JTl9JTklUSUFMSVpFUl9MSVNUKHdlYWtfdGhpc18odGhpcykpIHsKLX0KLQotQXVkaW9PdXRwdXRDb250cm9sbGVyOjp+QXVkaW9PdXRwdXRDb250cm9sbGVyKCkgewotICBEQ0hFQ0tfRVEoa0Nsb3NlZCwgc3RhdGVfKTsKLQotICBpZiAobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKSB7Ci0gICAgRG9TdG9wQ2xvc2VBbmRDbGVhclN0cmVhbShOVUxMKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBodHRwOi8vY3JidWcuY29tLzEyMDk3MwotICAgIGJhc2U6OlRocmVhZFJlc3RyaWN0aW9uczo6U2NvcGVkQWxsb3dXYWl0IGFsbG93X3dhaXQ7Ci0gICAgV2FpdGFibGVFdmVudCBjb21wbGV0aW9uKHRydWUgLyogbWFudWFsIHJlc2V0ICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpbml0aWFsIHN0YXRlICovKTsKLSAgICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzayhGUk9NX0hFUkUsCi0gICAgICAgIGJhc2U6OkJpbmQoJkF1ZGlvT3V0cHV0Q29udHJvbGxlcjo6RG9TdG9wQ2xvc2VBbmRDbGVhclN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLAotICAgICAgICAgICAgICAgICAgICZjb21wbGV0aW9uKSk7Ci0gICAgY29tcGxldGlvbi5XYWl0KCk7Ci0gIH0KLX0KLQotLy8gc3RhdGljCi1zY29wZWRfcmVmcHRyPEF1ZGlvT3V0cHV0Q29udHJvbGxlcj4gQXVkaW9PdXRwdXRDb250cm9sbGVyOjpDcmVhdGUoCi0gICAgQXVkaW9NYW5hZ2VyKiBhdWRpb19tYW5hZ2VyLAotICAgIEV2ZW50SGFuZGxlciogZXZlbnRfaGFuZGxlciwKLSAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywKLSAgICBTeW5jUmVhZGVyKiBzeW5jX3JlYWRlcikgewotICBEQ0hFQ0soYXVkaW9fbWFuYWdlcik7Ci0gIERDSEVDSyhzeW5jX3JlYWRlcik7Ci0KLSAgaWYgKCFwYXJhbXMuSXNWYWxpZCgpIHx8ICFhdWRpb19tYW5hZ2VyKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8vIFN0YXJ0cyB0aGUgYXVkaW8gY29udHJvbGxlciB0aHJlYWQuCi0gIHNjb3BlZF9yZWZwdHI8QXVkaW9PdXRwdXRDb250cm9sbGVyPiBjb250cm9sbGVyKG5ldyBBdWRpb091dHB1dENvbnRyb2xsZXIoCi0gICAgICBhdWRpb19tYW5hZ2VyLCBldmVudF9oYW5kbGVyLCBwYXJhbXMsIHN5bmNfcmVhZGVyKSk7Ci0KLSAgY29udHJvbGxlci0+bWVzc2FnZV9sb29wXy0+UG9zdFRhc2soRlJPTV9IRVJFLCBiYXNlOjpCaW5kKAotICAgICAgJkF1ZGlvT3V0cHV0Q29udHJvbGxlcjo6RG9DcmVhdGUsIGNvbnRyb2xsZXIpKTsKLQotICByZXR1cm4gY29udHJvbGxlcjsKLX0KLQotdm9pZCBBdWRpb091dHB1dENvbnRyb2xsZXI6OlBsYXkoKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfKTsKLSAgbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soRlJPTV9IRVJFLCBiYXNlOjpCaW5kKAotICAgICAgJkF1ZGlvT3V0cHV0Q29udHJvbGxlcjo6RG9QbGF5LCB0aGlzKSk7Ci19Ci0KLXZvaWQgQXVkaW9PdXRwdXRDb250cm9sbGVyOjpQYXVzZSgpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8pOwotICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzayhGUk9NX0hFUkUsIGJhc2U6OkJpbmQoCi0gICAgICAmQXVkaW9PdXRwdXRDb250cm9sbGVyOjpEb1BhdXNlLCB0aGlzKSk7Ci19Ci0KLXZvaWQgQXVkaW9PdXRwdXRDb250cm9sbGVyOjpGbHVzaCgpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8pOwotICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzayhGUk9NX0hFUkUsIGJhc2U6OkJpbmQoCi0gICAgICAmQXVkaW9PdXRwdXRDb250cm9sbGVyOjpEb0ZsdXNoLCB0aGlzKSk7Ci19Ci0KLXZvaWQgQXVkaW9PdXRwdXRDb250cm9sbGVyOjpDbG9zZShjb25zdCBiYXNlOjpDbG9zdXJlJiBjbG9zZWRfdGFzaykgewotICBEQ0hFQ0soIWNsb3NlZF90YXNrLmlzX251bGwoKSk7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfKTsKLSAgbWVzc2FnZV9sb29wXy0+UG9zdFRhc2tBbmRSZXBseShGUk9NX0hFUkUsIGJhc2U6OkJpbmQoCi0gICAgICAmQXVkaW9PdXRwdXRDb250cm9sbGVyOjpEb0Nsb3NlLCB0aGlzKSwgY2xvc2VkX3Rhc2spOwotfQotCi12b2lkIEF1ZGlvT3V0cHV0Q29udHJvbGxlcjo6U2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8pOwotICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzayhGUk9NX0hFUkUsIGJhc2U6OkJpbmQoCi0gICAgICAmQXVkaW9PdXRwdXRDb250cm9sbGVyOjpEb1NldFZvbHVtZSwgdGhpcywgdm9sdW1lKSk7Ci19Ci0KLXZvaWQgQXVkaW9PdXRwdXRDb250cm9sbGVyOjpEb0NyZWF0ZSgpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0KLSAgLy8gQ2xvc2UoKSBjYW4gYmUgY2FsbGVkIGJlZm9yZSBEb0NyZWF0ZSgpIGlzIGV4ZWN1dGVkLgotICBpZiAoc3RhdGVfID09IGtDbG9zZWQpCi0gICAgcmV0dXJuOwotICBEQ0hFQ0soc3RhdGVfID09IGtFbXB0eSB8fCBzdGF0ZV8gPT0ga1JlY3JlYXRpbmcpIDw8IHN0YXRlXzsKLQotICBEb1N0b3BDbG9zZUFuZENsZWFyU3RyZWFtKE5VTEwpOwotICBzdHJlYW1fID0gYXVkaW9fbWFuYWdlcl8tPk1ha2VBdWRpb091dHB1dFN0cmVhbVByb3h5KHBhcmFtc18pOwotICBpZiAoIXN0cmVhbV8pIHsKLSAgICBzdGF0ZV8gPSBrRXJyb3I7Ci0KLSAgICAvLyBUT0RPKGhjbGFtKTogRGVmaW5lIGVycm9yIHR5cGVzLgotICAgIGhhbmRsZXJfLT5PbkVycm9yKHRoaXMsIDApOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICghc3RyZWFtXy0+T3BlbigpKSB7Ci0gICAgc3RhdGVfID0ga0Vycm9yOwotICAgIERvU3RvcENsb3NlQW5kQ2xlYXJTdHJlYW0oTlVMTCk7Ci0KLSAgICAvLyBUT0RPKGhjbGFtKTogRGVmaW5lIGVycm9yIHR5cGVzLgotICAgIGhhbmRsZXJfLT5PbkVycm9yKHRoaXMsIDApOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIEV2ZXJ5dGhpbmcgc3RhcnRlZCBva2F5LCBzbyByZWdpc3RlciBmb3Igc3RhdGUgY2hhbmdlIGNhbGxiYWNrcyBpZiB3ZSBoYXZlCi0gIC8vIG5vdCBhbHJlYWR5IGRvbmUgc28uCi0gIGlmIChzdGF0ZV8gIT0ga1JlY3JlYXRpbmcpCi0gICAgYXVkaW9fbWFuYWdlcl8tPkFkZE91dHB1dERldmljZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCi0gIC8vIFdlIGhhdmUgc3VjY2Vzc2Z1bGx5IG9wZW5lZCB0aGUgc3RyZWFtLiBTZXQgdGhlIGluaXRpYWwgdm9sdW1lLgotICBzdHJlYW1fLT5TZXRWb2x1bWUodm9sdW1lXyk7Ci0KLSAgLy8gRmluYWxseSBzZXQgdGhlIHN0YXRlIHRvIGtDcmVhdGVkLgotICBTdGF0ZSBvcmlnaW5hbF9zdGF0ZSA9IHN0YXRlXzsKLSAgc3RhdGVfID0ga0NyZWF0ZWQ7Ci0KLSAgLy8gQW5kIHRoZW4gcmVwb3J0IHdlIGhhdmUgYmVlbiBjcmVhdGVkIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LgotICBpZiAob3JpZ2luYWxfc3RhdGUgIT0ga1JlY3JlYXRpbmcpCi0gICAgaGFuZGxlcl8tPk9uQ3JlYXRlZCh0aGlzKTsKLX0KLQotdm9pZCBBdWRpb091dHB1dENvbnRyb2xsZXI6OkRvUGxheSgpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0KLSAgLy8gV2UgY2FuIHN0YXJ0IGZyb20gY3JlYXRlZCBvciBwYXVzZWQgc3RhdGUuCi0gIGlmIChzdGF0ZV8gIT0ga0NyZWF0ZWQgJiYgc3RhdGVfICE9IGtQYXVzZWQpIHsKLSAgICAvLyBJZiBhIHBhdXNlIGlzIHBlbmRpbmcgZHJvcCBpdC4gIE90aGVyd2lzZSB0aGUgY29udHJvbGxlciBtaWdodCBoYW5nIHNpbmNlCi0gICAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgcGxheSBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC4KLSAgICBpZiAoc3RhdGVfID09IGtQYXVzZWRXaGVuU3RhcnRpbmcpCi0gICAgICBzdGF0ZV8gPSBrU3RhcnRpbmc7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RhdGVfID0ga1N0YXJ0aW5nOwotCi0gIC8vIEFzayBmb3IgZmlyc3QgcGFja2V0LgotICBzeW5jX3JlYWRlcl8tPlVwZGF0ZVBlbmRpbmdCeXRlcygwKTsKLQotICAvLyBDYW5ub3Qgc3RhcnQgc3RyZWFtIGltbWVkaWF0ZWx5LCBzaG91bGQgZ2l2ZSByZW5kZXJlciBzb21lIHRpbWUKLSAgLy8gdG8gZGVsaXZlciBkYXRhLgotICAvLyBUT0RPKHZyayk6IFRoZSBwb2xsaW5nIGhlcmUgYW5kIGluIFdhaXRUaWxsRGF0YVJlYWR5KCkgaXMgcHJldHR5IGNsdW5reS4KLSAgLy8gUmVmaW5lIHRoZSBBUEkgc3VjaCB0aGF0IHBvbGxpbmcgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gKGNyYnVnLmNvbS8xMTIxOTYpCi0gIG51bWJlcl9wb2xsaW5nX2F0dGVtcHRzX2xlZnRfID0ga1BvbGxOdW1BdHRlbXB0czsKLSAgbWVzc2FnZV9sb29wXy0+UG9zdERlbGF5ZWRUYXNrKAotICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZCgmQXVkaW9PdXRwdXRDb250cm9sbGVyOjpQb2xsQW5kU3RhcnRJZkRhdGFSZWFkeSwKLSAgICAgIHdlYWtfdGhpc18uR2V0V2Vha1B0cigpKSwKLSAgICAgIFRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyhrUG9sbFBhdXNlSW5NaWxsaXNlY29uZHMpKTsKLX0KLQotdm9pZCBBdWRpb091dHB1dENvbnRyb2xsZXI6OlBvbGxBbmRTdGFydElmRGF0YVJlYWR5KCkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLQotICAvLyBCZWluZyBwYXJhbm9pZDogZG8gbm90aGluZyBpZiBzdGF0ZSB1bmV4cGVjdGVkbHkgY2hhbmdlZC4KLSAgaWYgKChzdGF0ZV8gIT0ga1N0YXJ0aW5nKSAmJiAoc3RhdGVfICE9IGtQYXVzZWRXaGVuU3RhcnRpbmcpKQotICAgIHJldHVybjsKLQotICBib29sIHBhdXNpbmcgPSAoc3RhdGVfID09IGtQYXVzZWRXaGVuU3RhcnRpbmcpOwotICAvLyBJZiB3ZSBhcmUgcmVhZHkgdG8gc3RhcnQgdGhlIHN0cmVhbSwgc3RhcnQgaXQuCi0gIC8vIE9mIGNvdXJzZSB3ZSBtYXkgaGF2ZSB0byBzdG9wIGl0IGltbWVkaWF0ZWx5Li4uCi0gIGlmICgtLW51bWJlcl9wb2xsaW5nX2F0dGVtcHRzX2xlZnRfID09IDAgfHwKLSAgICAgIHBhdXNpbmcgfHwKLSAgICAgIHN5bmNfcmVhZGVyXy0+RGF0YVJlYWR5KCkpIHsKLSAgICBTdGFydFN0cmVhbSgpOwotICAgIGlmIChwYXVzaW5nKSB7Ci0gICAgICBEb1BhdXNlKCk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIG1lc3NhZ2VfbG9vcF8tPlBvc3REZWxheWVkVGFzaygKLSAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICBiYXNlOjpCaW5kKCZBdWRpb091dHB1dENvbnRyb2xsZXI6OlBvbGxBbmRTdGFydElmRGF0YVJlYWR5LAotICAgICAgICB3ZWFrX3RoaXNfLkdldFdlYWtQdHIoKSksCi0gICAgICAgIFRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyhrUG9sbFBhdXNlSW5NaWxsaXNlY29uZHMpKTsKLSAgfQotfQotCi12b2lkIEF1ZGlvT3V0cHV0Q29udHJvbGxlcjo6U3RhcnRTdHJlYW0oKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBzdGF0ZV8gPSBrUGxheWluZzsKLQotICAvLyBXZSBzdGFydCB0aGUgQXVkaW9PdXRwdXRTdHJlYW0gbGF6aWx5LgotICBzdHJlYW1fLT5TdGFydCh0aGlzKTsKLQotICAvLyBUZWxsIHRoZSBldmVudCBoYW5kbGVyIHRoYXQgd2UgYXJlIG5vdyBwbGF5aW5nLgotICBoYW5kbGVyXy0+T25QbGF5aW5nKHRoaXMpOwotfQotCi12b2lkIEF1ZGlvT3V0cHV0Q29udHJvbGxlcjo6RG9QYXVzZSgpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0KLSAgaWYgKHN0cmVhbV8pIHsKLSAgICAvLyBUaGVuIHdlIHN0b3AgdGhlIGF1ZGlvIGRldmljZS4gVGhpcyBpcyBub3QgdGhlIHBlcmZlY3Qgc29sdXRpb24KLSAgICAvLyBiZWNhdXNlIGl0IGRpc2NhcmRzIGFsbCB0aGUgaW50ZXJuYWwgYnVmZmVyIGluIHRoZSBhdWRpbyBkZXZpY2UuCi0gICAgLy8gVE9ETyhoY2xhbSk6IEFjdHVhbGx5IHBhdXNlIHRoZSBhdWRpbyBkZXZpY2UuCi0gICAgc3RyZWFtXy0+U3RvcCgpOwotICB9Ci0KLSAgc3dpdGNoIChzdGF0ZV8pIHsKLSAgICBjYXNlIGtTdGFydGluZzoKLSAgICAgIC8vIFdlIHdlcmUgYXNrZWQgdG8gcGF1c2Ugd2hpbGUgc3RhcnRpbmcuIFRoZXJlIGlzIGRlbGF5ZWQgdGFzayB0aGF0IHdpbGwKLSAgICAgIC8vIHRyeSBzdGFydGluZyBwbGF5YmFjaywgYW5kIHRoZXJlIGlzIG5vIHdheSB0byByZW1vdmUgdGhhdCB0YXNrIGZyb20gdGhlCi0gICAgICAvLyBxdWV1ZS4gSWYgd2Ugc3RvcCBub3cgdGhhdCB0YXNrIHdpbGwgYmUgZXhlY3V0ZWQgYW55d2F5LgotICAgICAgLy8gRGVsYXkgcGF1c2luZywgbGV0IGRlbGF5ZWQgdGFzayB0byBkbyBwYXVzZSBhZnRlciBpdCBzdGFydCBwbGF5YmFjay4KLSAgICAgIHN0YXRlXyA9IGtQYXVzZWRXaGVuU3RhcnRpbmc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtQbGF5aW5nOgotICAgICAgc3RhdGVfID0ga1BhdXNlZDsKLQotICAgICAgLy8gU2VuZCBhIHNwZWNpYWwgcGF1c2UgbWFyayB0byB0aGUgbG93LWxhdGVuY3kgYXVkaW8gdGhyZWFkLgotICAgICAgc3luY19yZWFkZXJfLT5VcGRhdGVQZW5kaW5nQnl0ZXMoa1BhdXNlTWFyayk7Ci0KLSAgICAgIGhhbmRsZXJfLT5PblBhdXNlZCh0aGlzKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm47Ci0gIH0KLX0KLQotdm9pZCBBdWRpb091dHB1dENvbnRyb2xsZXI6OkRvRmx1c2goKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotCi0gIC8vIFRPRE8oaGNsYW0pOiBBY3R1YWxseSBmbHVzaCB0aGUgYXVkaW8gZGV2aWNlLgotfQotCi12b2lkIEF1ZGlvT3V0cHV0Q29udHJvbGxlcjo6RG9DbG9zZSgpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0KLSAgaWYgKHN0YXRlXyAhPSBrQ2xvc2VkKSB7Ci0gICAgRG9TdG9wQ2xvc2VBbmRDbGVhclN0cmVhbShOVUxMKTsKLSAgICBzeW5jX3JlYWRlcl8tPkNsb3NlKCk7Ci0gICAgc3RhdGVfID0ga0Nsb3NlZDsKLSAgfQotfQotCi12b2lkIEF1ZGlvT3V0cHV0Q29udHJvbGxlcjo6RG9TZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLQotICAvLyBTYXZlcyB0aGUgdm9sdW1lIHRvIGEgbWVtYmVyIGZpcnN0LiBXZSBtYXkgbm90IGJlIGFibGUgdG8gc2V0IHRoZSB2b2x1bWUKLSAgLy8gcmlnaHQgYXdheSBidXQgd2hlbiB0aGUgc3RyZWFtIGlzIGNyZWF0ZWQgd2UnbGwgc2V0IHRoZSB2b2x1bWUuCi0gIHZvbHVtZV8gPSB2b2x1bWU7Ci0KLSAgc3dpdGNoIChzdGF0ZV8pIHsKLSAgICBjYXNlIGtDcmVhdGVkOgotICAgIGNhc2Uga1N0YXJ0aW5nOgotICAgIGNhc2Uga1BhdXNlZFdoZW5TdGFydGluZzoKLSAgICBjYXNlIGtQbGF5aW5nOgotICAgIGNhc2Uga1BhdXNlZDoKLSAgICAgIHN0cmVhbV8tPlNldFZvbHVtZSh2b2x1bWVfKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm47Ci0gIH0KLX0KLQotdm9pZCBBdWRpb091dHB1dENvbnRyb2xsZXI6OkRvUmVwb3J0RXJyb3IoaW50IGNvZGUpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIGlmIChzdGF0ZV8gIT0ga0Nsb3NlZCkKLSAgICBoYW5kbGVyXy0+T25FcnJvcih0aGlzLCBjb2RlKTsKLX0KLQotaW50IEF1ZGlvT3V0cHV0Q29udHJvbGxlcjo6T25Nb3JlRGF0YShBdWRpb0J1cyogZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJzU3RhdGUgYnVmZmVyc19zdGF0ZSkgewotICByZXR1cm4gT25Nb3JlSU9EYXRhKE5VTEwsIGRlc3QsIGJ1ZmZlcnNfc3RhdGUpOwotfQotCi1pbnQgQXVkaW9PdXRwdXRDb250cm9sbGVyOjpPbk1vcmVJT0RhdGEoQXVkaW9CdXMqIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1cyogZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlcnNTdGF0ZSBidWZmZXJzX3N0YXRlKSB7Ci0gIFRSQUNFX0VWRU5UMCgiYXVkaW8iLCAiQXVkaW9PdXRwdXRDb250cm9sbGVyOjpPbk1vcmVJT0RhdGEiKTsKLQotICB7Ci0gICAgLy8gQ2hlY2sgc3RhdGUgYW5kIGRvIG5vdGhpbmcgaWYgd2UgYXJlIG5vdCBwbGF5aW5nLgotICAgIC8vIFdlIGFyZSBvbiB0aGUgaGFyZHdhcmUgYXVkaW8gdGhyZWFkLCBzbyBsb2NrIGlzIG5lZWRlZC4KLSAgICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICAgIGlmIChzdGF0ZV8gIT0ga1BsYXlpbmcpIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgfQotCi0gIGludCBmcmFtZXMgPSBzeW5jX3JlYWRlcl8tPlJlYWQoc291cmNlLCBkZXN0KTsKLSAgc3luY19yZWFkZXJfLT5VcGRhdGVQZW5kaW5nQnl0ZXMoCi0gICAgICBidWZmZXJzX3N0YXRlLnRvdGFsX2J5dGVzKCkgKyBmcmFtZXMgKiBwYXJhbXNfLkdldEJ5dGVzUGVyRnJhbWUoKSk7Ci0gIHJldHVybiBmcmFtZXM7Ci19Ci0KLXZvaWQgQXVkaW9PdXRwdXRDb250cm9sbGVyOjpXYWl0VGlsbERhdGFSZWFkeSgpIHsKLSNpZiBkZWZpbmVkKE9TX1dJTikgfHwgZGVmaW5lZChPU19NQUNPU1gpCi0gIGJhc2U6OlRpbWUgc3RhcnQgPSBiYXNlOjpUaW1lOjpOb3coKTsKLSAgLy8gV2FpdCBmb3IgdXAgdG8gMS41IHNlY29uZHMgZm9yIERhdGFSZWFkeSgpLiAgMS41IHNlY29uZHMgd2FzIGNob3NlbiBiZWNhdXNlCi0gIC8vIGl0J3MgbGFyZ2VyIHRoYW4gdGhlIHBsYXliYWNrIHRpbWUgb2YgdGhlIFdhdmVPdXQgYnVmZmVyIHNpemUgdXNpbmcgdGhlCi0gIC8vIG1pbmltdW0gc3VwcG9ydGVkIHNhbXBsZSByYXRlOiA0MDk2IC8gMzAwMCA9IH4xLjQgc2Vjb25kcy4gIEV2ZW4gYSBjbGllbnQKLSAgLy8gZXhwZWN0aW5nIHJlYWwgdGltZSBwbGF5b3V0IHNob3VsZCBiZSBhYmxlIHRvIGZpbGwgaW4gdGhpcyB0aW1lLgotICBjb25zdCBiYXNlOjpUaW1lRGVsdGEgbWF4X3dhaXQgPSBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMTUwMCk7Ci0gIHdoaWxlICghc3luY19yZWFkZXJfLT5EYXRhUmVhZHkoKSAmJgotICAgICAgICAgKChiYXNlOjpUaW1lOjpOb3coKSAtIHN0YXJ0KSA8IG1heF93YWl0KSkgewotICAgIGJhc2U6OlBsYXRmb3JtVGhyZWFkOjpZaWVsZEN1cnJlbnRUaHJlYWQoKTsKLSAgfQotI2Vsc2UKLSAgLy8gV2FpdFRpbGxEYXRhUmVhZHkoKSBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQuCi0gIENIRUNLKGZhbHNlKTsKLSNlbmRpZgotfQotCi12b2lkIEF1ZGlvT3V0cHV0Q29udHJvbGxlcjo6T25FcnJvcihBdWRpb091dHB1dFN0cmVhbSogc3RyZWFtLCBpbnQgY29kZSkgewotICAvLyBIYW5kbGUgZXJyb3Igb24gdGhlIGF1ZGlvIGNvbnRyb2xsZXIgdGhyZWFkLgotICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzayhGUk9NX0hFUkUsIGJhc2U6OkJpbmQoCi0gICAgICAmQXVkaW9PdXRwdXRDb250cm9sbGVyOjpEb1JlcG9ydEVycm9yLCB0aGlzLCBjb2RlKSk7Ci19Ci0KLXZvaWQgQXVkaW9PdXRwdXRDb250cm9sbGVyOjpEb1N0b3BDbG9zZUFuZENsZWFyU3RyZWFtKFdhaXRhYmxlRXZlbnQqIGRvbmUpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0KLSAgLy8gQWxsb3cgY2FsbGluZyB1bmNvbmRpdGlvbmFsbHkgYW5kIGJhaWwgaWYgd2UgZG9uJ3QgaGF2ZSBhIHN0cmVhbV8gdG8gY2xvc2UuCi0gIGlmIChzdHJlYW1fKSB7Ci0gICAgc3RyZWFtXy0+U3RvcCgpOwotICAgIHN0cmVhbV8tPkNsb3NlKCk7Ci0gICAgc3RyZWFtXyA9IE5VTEw7Ci0KLSAgICBhdWRpb19tYW5hZ2VyXy0+UmVtb3ZlT3V0cHV0RGV2aWNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0gICAgYXVkaW9fbWFuYWdlcl8gPSBOVUxMOwotCi0gICAgd2Vha190aGlzXy5JbnZhbGlkYXRlV2Vha1B0cnMoKTsKLSAgfQotCi0gIC8vIFNob3VsZCBiZSBsYXN0IGluIHRoZSBtZXRob2QsIGRvIG5vdCB0b3VjaCAidGhpcyIgZnJvbSBoZXJlIG9uLgotICBpZiAoZG9uZSkKLSAgICBkb25lLT5TaWduYWwoKTsKLX0KLQotdm9pZCBBdWRpb091dHB1dENvbnRyb2xsZXI6Ok9uRGV2aWNlQ2hhbmdlKCkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLQotICAvLyBXZSBzaG91bGQgYWx3YXlzIGhhdmUgYSBzdHJlYW0gYnkgdGhpcyBwb2ludC4KLSAgQ0hFQ0soc3RyZWFtXyk7Ci0KLSAgLy8gUHJlc2VydmUgdGhlIG9yaWdpbmFsIHN0YXRlIGFuZCBzaHV0ZG93biB0aGUgc3RyZWFtLgotICBTdGF0ZSBvcmlnaW5hbF9zdGF0ZSA9IHN0YXRlXzsKLSAgc3RyZWFtXy0+U3RvcCgpOwotICBzdHJlYW1fLT5DbG9zZSgpOwotICBzdHJlYW1fID0gTlVMTDsKLQotICAvLyBSZWNyZWF0ZSB0aGUgc3RyZWFtLCBleGl0IGlmIHdlIHJhbiBpbnRvIGFuIGVycm9yLgotICBzdGF0ZV8gPSBrUmVjcmVhdGluZzsKLSAgRG9DcmVhdGUoKTsKLSAgaWYgKCFzdHJlYW1fIHx8IHN0YXRlXyA9PSBrRXJyb3IpCi0gICAgcmV0dXJuOwotCi0gIC8vIEdldCB1cyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBzdGF0ZSBvciBhbiBlcXVpdmFsZW50IHN0YXRlLgotICBzd2l0Y2ggKG9yaWdpbmFsX3N0YXRlKSB7Ci0gICAgY2FzZSBrU3RhcnRpbmc6Ci0gICAgY2FzZSBrUGxheWluZzoKLSAgICAgIERvUGxheSgpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2Uga0NyZWF0ZWQ6Ci0gICAgY2FzZSBrUGF1c2VkV2hlblN0YXJ0aW5nOgotICAgIGNhc2Uga1BhdXNlZDoKLSAgICAgIC8vIEZyb20gdGhlIG91dHNpZGUgdGhlc2UgdGhyZWUgc3RhdGVzIGFyZSBlcXVpdmFsZW50LgotICAgICAgcmV0dXJuOwotICAgIGRlZmF1bHQ6Ci0gICAgICBOT1RSRUFDSEVEKCkgPDwgIkludmFsaWQgb3JpZ2luYWwgc3RhdGUuIjsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb19vdXRwdXRfY29udHJvbGxlci5oIGIvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9jb250cm9sbGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MmE5NDguLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9jb250cm9sbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9BVURJT19BVURJT19PVVRQVVRfQ09OVFJPTExFUl9IXwotI2RlZmluZSBNRURJQV9BVURJT19BVURJT19PVVRQVVRfQ09OVFJPTExFUl9IXwotCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvd2Vha19wdHIuaCIKLSNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi9sb2NrLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fYnVmZmVyc19zdGF0ZS5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX2lvLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fbWFuYWdlci5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3NpbXBsZV9zb3VyY2VzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCIKLQotbmFtZXNwYWNlIGJhc2UgewotY2xhc3MgV2FpdGFibGVFdmVudDsKLX0gIC8vIG5hbWVzcGFjZSBiYXNlCi0KLWNsYXNzIE1lc3NhZ2VMb29wOwotCi0vLyBBbiBBdWRpb091dHB1dENvbnRyb2xsZXIgY29udHJvbHMgYW4gQXVkaW9PdXRwdXRTdHJlYW0gYW5kIHByb3ZpZGVzIGRhdGEKLS8vIHRvIHRoaXMgb3V0cHV0IHN0cmVhbS4gSXQgaGFzIGFuIGltcG9ydGFudCBmdW5jdGlvbiB0aGF0IGl0IGV4ZWN1dGVzCi0vLyBhdWRpbyBvcGVyYXRpb25zIGxpa2UgcGxheSwgcGF1c2UsIHN0b3AsIGV0Yy4gb24gYSBzZXBhcmF0ZSB0aHJlYWQsCi0vLyBuYW1lbHkgdGhlIGF1ZGlvIG1hbmFnZXIgdGhyZWFkLgotLy8KLS8vIEFsbCB0aGUgcHVibGljIG1ldGhvZHMgb2YgQXVkaW9PdXRwdXRDb250cm9sbGVyIGFyZSBub24tYmxvY2tpbmcuCi0vLyBUaGUgYWN0dWFsIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCBvbiB0aGUgYXVkaW8gbWFuYWdlciB0aHJlYWQuCi0vLwotLy8gSGVyZSBpcyBhIHN0YXRlIGRpYWdyYW0gZm9yIHRoZSBBdWRpb091dHB1dENvbnRyb2xsZXI6Ci0vLwotLy8gICAgICAgICAgICAgLi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiAgWyBDbG9zZWQgLyBFcnJvciBdICA8LS0tLS0tLgotLy8gICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgfAotLy8gICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfAotLy8gICAgICAgIFsgQ3JlYXRlZCBdICAtLT4gIFsgU3RhcnRpbmcgXSAgLS0+ICBbIFBsYXlpbmcgXSAgLS0+ICBbIFBhdXNlZCBdCi0vLyAgICAgICAgICAgICBeICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICBeICAgICAgICAgICAgICAgIHwgIF4KLS8vICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgfAotLy8gICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgYC0tLS0tLS0tLS0tLS0tLS0nICB8Ci0vLyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICBWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICAgICAgICAgICAgIHwgICAgICAgIFsgUGF1c2VkV2hlblN0YXJ0aW5nIF0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJwotLy8gICAgICAgICAgICAgfAotLy8gICAgICAgKlsgIEVtcHR5ICBdCi0vLwotLy8gKiBJbml0aWFsIHN0YXRlCi0vLwotLy8gQXQgYW55IHRpbWUgYWZ0ZXIgcmVhY2hpbmcgdGhlIENyZWF0ZWQgc3RhdGUgYnV0IGJlZm9yZSBDbG9zZWQgLyBFcnJvciwgdGhlCi0vLyBBdWRpb091dHB1dENvbnRyb2xsZXIgbWF5IGJlIG5vdGlmaWVkIG9mIGEgZGV2aWNlIGNoYW5nZSB2aWEgT25EZXZpY2VDaGFuZ2UoKQotLy8gYW5kIHRyYW5zaXRpb24gdG8gdGhlIFJlY3JlYXRpbmcgc3RhdGUuICBJZiBPbkRldmljZUNoYW5nZSgpIGNvbXBsZXRlcwotLy8gc3VjY2Vzc2Z1bGx5IHRoZSBzdGF0ZSB3aWxsIHRyYW5zaXRpb24gYmFjayB0byBhbiBlcXVpdmFsZW50IHByZS1jYWxsIHN0YXRlLgotLy8gRS5nLiwgaWYgdGhlIHN0YXRlIHdhcyBQYXVzZWQgb3IgUGF1c2VkV2hlblN0YXJ0aW5nLCB0aGUgbmV3IHN0YXRlIHdpbGwgYmUKLS8vIENyZWF0ZWQsIHNpbmNlIHRoZXNlIHN0YXRlcyBhcmUgYWxsIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IGFuZCByZXF1aXJlIGEKLS8vIFBsYXkoKSBjYWxsIHRvIGNvbnRpbnVlIHRvIHRoZSBuZXh0IHN0YXRlLgotLy8KLS8vIFRoZSBBdWRpb091dHB1dFN0cmVhbSBjYW4gcmVxdWVzdCBkYXRhIGZyb20gdGhlIEF1ZGlvT3V0cHV0Q29udHJvbGxlciB2aWEgdGhlCi0vLyBBdWRpb1NvdXJjZUNhbGxiYWNrIGludGVyZmFjZS4gQXVkaW9PdXRwdXRDb250cm9sbGVyIHVzZXMgdGhlIFN5bmNSZWFkZXIKLS8vIHBhc3NlZCB0byBpdCB2aWEgY29uc3RydWN0aW9uIHRvIHN5bmNocm9ub3VzbHkgZnVsZmlsbCB0aGlzIHJlYWQgcmVxdWVzdC4KLS8vCi0vLyBTaW5jZSBBdWRpb091dHB1dENvbnRyb2xsZXIgdXNlcyBBdWRpb01hbmFnZXIncyBtZXNzYWdlIGxvb3AgdGhlIGNvbnRyb2xsZXIKLS8vIHVzZXMgV2Vha1B0ciB0byBhbGxvdyBzYWZlIGNhbmNlbGxhdGlvbiBvZiBwZW5kaW5nIHRhc2tzLgotLy8KLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgTUVESUFfRVhQT1JUIEF1ZGlvT3V0cHV0Q29udHJvbGxlcgotICAgIDogcHVibGljIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPEF1ZGlvT3V0cHV0Q29udHJvbGxlcj4sCi0gICAgICBwdWJsaWMgQXVkaW9PdXRwdXRTdHJlYW06OkF1ZGlvU291cmNlQ2FsbGJhY2ssCi0gICAgICBOT05fRVhQT1JURURfQkFTRShwdWJsaWMgQXVkaW9NYW5hZ2VyOjpBdWRpb0RldmljZUxpc3RlbmVyKSAgewotIHB1YmxpYzoKLSAgLy8gQW4gZXZlbnQgaGFuZGxlciB0aGF0IHJlY2VpdmVzIGV2ZW50cyBmcm9tIHRoZSBBdWRpb091dHB1dENvbnRyb2xsZXIuIFRoZQotICAvLyBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgY2FsbGVkIG9uIHRoZSBhdWRpbyBtYW5hZ2VyIHRocmVhZC4KLSAgY2xhc3MgTUVESUFfRVhQT1JUIEV2ZW50SGFuZGxlciB7Ci0gICBwdWJsaWM6Ci0gICAgdmlydHVhbCB2b2lkIE9uQ3JlYXRlZChBdWRpb091dHB1dENvbnRyb2xsZXIqIGNvbnRyb2xsZXIpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgT25QbGF5aW5nKEF1ZGlvT3V0cHV0Q29udHJvbGxlciogY29udHJvbGxlcikgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBPblBhdXNlZChBdWRpb091dHB1dENvbnRyb2xsZXIqIGNvbnRyb2xsZXIpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgT25FcnJvcihBdWRpb091dHB1dENvbnRyb2xsZXIqIGNvbnRyb2xsZXIsIGludCBlcnJvcl9jb2RlKSA9IDA7Ci0KLSAgIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5FdmVudEhhbmRsZXIoKSB7fQotICB9OwotCi0gIC8vIEEgc3luY2hyb25vdXMgcmVhZGVyIGludGVyZmFjZSB1c2VkIGJ5IEF1ZGlvT3V0cHV0Q29udHJvbGxlciBmb3IKLSAgLy8gc3luY2hyb25vdXMgcmVhZGluZy4KLSAgLy8gVE9ETyhjcm9nZXJzKTogZmluZCBhIGJldHRlciBuYW1lIGZvciB0aGlzIGNsYXNzIGFuZCB0aGUgUmVhZCgpIG1ldGhvZAotICAvLyBub3cgdGhhdCBpdCBjYW4gaGFuZGxlIHN5bmNocm9uaXplZCBJL08uCi0gIGNsYXNzIFN5bmNSZWFkZXIgewotICAgcHVibGljOgotICAgIHZpcnR1YWwgflN5bmNSZWFkZXIoKSB7fQotCi0gICAgLy8gTm90aWZ5IHRoZSBzeW5jaHJvbm91cyByZWFkZXIgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUKLSAgICAvLyBBdWRpb091dHB1dENvbnRyb2xsZXIgbm90IHlldCBwbGF5ZWQuIFRoaXMgaXMgdXNlZCBieSBTeW5jUmVhZGVyIHRvCi0gICAgLy8gcHJlcGFyZSBtb3JlIGRhdGEgYW5kIHBlcmZvcm0gc3luY2hyb25pemF0aW9uLgotICAgIHZpcnR1YWwgdm9pZCBVcGRhdGVQZW5kaW5nQnl0ZXModWludDMyIGJ5dGVzKSA9IDA7Ci0KLSAgICAvLyBBdHRlbXB0IHRvIGNvbXBsZXRlbHkgZmlsbCB8ZGVzdHwsIHJldHVybiB0aGUgYWN0dWFsIG51bWJlciBvZgotICAgIC8vIGZyYW1lcyB0aGF0IGNvdWxkIGJlIHJlYWQuCi0gICAgLy8gfHNvdXJjZXwgbWF5IG9wdGlvbmFsbHkgYmUgcHJvdmlkZWQgZm9yIGlucHV0IGRhdGEuCi0gICAgdmlydHVhbCBpbnQgUmVhZChBdWRpb0J1cyogc291cmNlLCBBdWRpb0J1cyogZGVzdCkgPSAwOwotCi0gICAgLy8gQ2xvc2UgdGhpcyBzeW5jaHJvbm91cyByZWFkZXIuCi0gICAgdmlydHVhbCB2b2lkIENsb3NlKCkgPSAwOwotCi0gICAgLy8gQ2hlY2sgaWYgZGF0YSBpcyByZWFkeS4KLSAgICB2aXJ0dWFsIGJvb2wgRGF0YVJlYWR5KCkgPSAwOwotICB9OwotCi0gIC8vIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBBdWRpb091dHB1dENvbnRyb2xsZXIuCi0gIC8vIFRoaXMgYWxzbyBjcmVhdGVzIGFuZCBvcGVucyBhbiBBdWRpb091dHB1dFN0cmVhbSBvbiB0aGUgYXVkaW8gbWFuYWdlcgotICAvLyB0aHJlYWQsIGFuZCBpZiB0aGlzIGlzIHN1Y2Nlc3NmdWwsIHRoZSB8ZXZlbnRfaGFuZGxlcnwgd2lsbCByZWNlaXZlIGFuCi0gIC8vIE9uQ3JlYXRlZCgpIGNhbGwgZnJvbSB0aGUgc2FtZSBhdWRpbyBtYW5hZ2VyIHRocmVhZC4gIHxhdWRpb19tYW5hZ2VyfCBtdXN0Ci0gIC8vIG91dGxpdmUgQXVkaW9PdXRwdXRDb250cm9sbGVyLgotICBzdGF0aWMgc2NvcGVkX3JlZnB0cjxBdWRpb091dHB1dENvbnRyb2xsZXI+IENyZWF0ZSgKLSAgICAgIEF1ZGlvTWFuYWdlciogYXVkaW9fbWFuYWdlciwgRXZlbnRIYW5kbGVyKiBldmVudF9oYW5kbGVyLAotICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsIFN5bmNSZWFkZXIqIHN5bmNfcmVhZGVyKTsKLQotICAvLyBNZXRob2RzIHRvIGNvbnRyb2wgcGxheWJhY2sgb2YgdGhlIHN0cmVhbS4KLQotICAvLyBTdGFydHMgdGhlIHBsYXliYWNrIG9mIHRoaXMgYXVkaW8gb3V0cHV0IHN0cmVhbS4KLSAgdm9pZCBQbGF5KCk7Ci0KLSAgLy8gUGF1c2UgdGhpcyBhdWRpbyBvdXRwdXQgc3RyZWFtLgotICB2b2lkIFBhdXNlKCk7Ci0KLSAgLy8gRGlzY2FyZCBhbGwgYXVkaW8gZGF0YSBidWZmZXJlZCBpbiB0aGlzIG91dHB1dCBzdHJlYW0uIFRoaXMgbWV0aG9kIG9ubHkKLSAgLy8gaGFzIGVmZmVjdCB3aGVuIHRoZSBzdHJlYW0gaXMgcGF1c2VkLgotICB2b2lkIEZsdXNoKCk7Ci0KLSAgLy8gQ2xvc2VzIHRoZSBhdWRpbyBvdXRwdXQgc3RyZWFtLiBUaGUgc3RhdGUgaXMgY2hhbmdlZCBhbmQgdGhlIHJlc291cmNlcwotICAvLyBhcmUgZnJlZWQgb24gdGhlIGF1ZGlvIG1hbmFnZXIgdGhyZWFkLiBjbG9zZWRfdGFzayBpcyBleGVjdXRlZCBhZnRlciB0aGF0LgotICAvLyBDYWxsYmFja3MgKEV2ZW50SGFuZGxlciBhbmQgU3luY1JlYWRlcikgbXVzdCBleGlzdCB1bnRpbCBjbG9zZWRfdGFzayBpcwotICAvLyBjYWxsZWQuCi0gIC8vCi0gIC8vIEl0IGlzIHNhZmUgdG8gY2FsbCB0aGlzIG1ldGhvZCBtb3JlIHRoYW4gb25jZS4gQ2FsbHMgYWZ0ZXIgdGhlIGZpcnN0IG9uZQotICAvLyB3aWxsIGhhdmUgbm8gZWZmZWN0LgotICB2b2lkIENsb3NlKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNsb3NlZF90YXNrKTsKLQotICAvLyBTZXRzIHRoZSB2b2x1bWUgb2YgdGhlIGF1ZGlvIG91dHB1dCBzdHJlYW0uCi0gIHZvaWQgU2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpOwotCi0gIC8vIEF1ZGlvU291cmNlQ2FsbGJhY2sgaW1wbGVtZW50YXRpb24uCi0gIHZpcnR1YWwgaW50IE9uTW9yZURhdGEoQXVkaW9CdXMqIGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJzU3RhdGUgYnVmZmVyc19zdGF0ZSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgaW50IE9uTW9yZUlPRGF0YShBdWRpb0J1cyogc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdXMqIGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlcnNTdGF0ZSBidWZmZXJzX3N0YXRlKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIE9uRXJyb3IoQXVkaW9PdXRwdXRTdHJlYW0qIHN0cmVhbSwgaW50IGNvZGUpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgV2FpdFRpbGxEYXRhUmVhZHkoKSBPVkVSUklERTsKLQotICAvLyBBdWRpb0RldmljZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uLiAgV2hlbiBjYWxsZWQgQXVkaW9PdXRwdXRDb250cm9sbGVyIHdpbGwKLSAgLy8gc2h1dGRvd24gdGhlIGV4aXN0aW5nIHxzdHJlYW1ffCwgdHJhbnNpdGlvbiB0byB0aGUga1JlY3JlYXRpbmcgc3RhdGUsCi0gIC8vIGNyZWF0ZSBhIG5ldyBzdHJlYW0sIGFuZCB0aGVuIHRyYW5zaXRpb24gYmFjayB0byBhbiBlcXVpdmFsZW50IHN0YXRlIHByaW9yCi0gIC8vIHRvIGJlaW5nIGNhbGxlZC4KLSAgdmlydHVhbCB2b2lkIE9uRGV2aWNlQ2hhbmdlKCkgT1ZFUlJJREU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gICAgLy8gSW50ZXJuYWwgc3RhdGUgb2YgdGhlIHNvdXJjZS4KLSAgZW51bSBTdGF0ZSB7Ci0gICAga0VtcHR5LAotICAgIGtDcmVhdGVkLAotICAgIGtQbGF5aW5nLAotICAgIGtTdGFydGluZywKLSAgICBrUGF1c2VkV2hlblN0YXJ0aW5nLAotICAgIGtQYXVzZWQsCi0gICAga0Nsb3NlZCwKLSAgICBrRXJyb3IsCi0gICAga1JlY3JlYXRpbmcsCi0gIH07Ci0KLSAgZnJpZW5kIGNsYXNzIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPEF1ZGlvT3V0cHV0Q29udHJvbGxlcj47Ci0gIHZpcnR1YWwgfkF1ZGlvT3V0cHV0Q29udHJvbGxlcigpOwotCi0gcHJpdmF0ZToKLSAgLy8gV2UgYXJlIHBvbGxpbmcgc3luYyByZWFkZXIgaWYgZGF0YSBiZWNhbWUgYXZhaWxhYmxlLgotICBzdGF0aWMgY29uc3QgaW50IGtQb2xsTnVtQXR0ZW1wdHM7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1BvbGxQYXVzZUluTWlsbGlzZWNvbmRzOwotCi0gIEF1ZGlvT3V0cHV0Q29udHJvbGxlcihBdWRpb01hbmFnZXIqIGF1ZGlvX21hbmFnZXIsIEV2ZW50SGFuZGxlciogaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLCBTeW5jUmVhZGVyKiBzeW5jX3JlYWRlcik7Ci0KLSAgLy8gVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBleGVjdXRlZCBvbiB0aGUgYXVkaW8gbWFuYWdlciB0aHJlYWQuCi0gIHZvaWQgRG9DcmVhdGUoKTsKLSAgdm9pZCBEb1BsYXkoKTsKLSAgdm9pZCBQb2xsQW5kU3RhcnRJZkRhdGFSZWFkeSgpOwotICB2b2lkIERvUGF1c2UoKTsKLSAgdm9pZCBEb0ZsdXNoKCk7Ci0gIHZvaWQgRG9DbG9zZSgpOwotICB2b2lkIERvU2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpOwotICB2b2lkIERvUmVwb3J0RXJyb3IoaW50IGNvZGUpOwotCi0gIC8vIEhlbHBlciBtZXRob2QgdGhhdCBzdGFydHMgcGh5c2ljYWwgc3RyZWFtLgotICB2b2lkIFN0YXJ0U3RyZWFtKCk7Ci0KLSAgLy8gSGVscGVyIG1ldGhvZCB0aGF0IHN0b3BzLCBjbG9zZXMsIGFuZCBOVUxMcyB8KnN0cmVhbV98LgotICAvLyBTaWduYWxzIGV2ZW50IHdoZW4gZG9uZSBpZiBpdCBpcyBub3QgTlVMTC4KLSAgdm9pZCBEb1N0b3BDbG9zZUFuZENsZWFyU3RyZWFtKGJhc2U6OldhaXRhYmxlRXZlbnQgKmRvbmUpOwotCi0gIEF1ZGlvTWFuYWdlciogYXVkaW9fbWFuYWdlcl87Ci0KLSAgLy8gfGhhbmRsZXJffCBtYXkgYmUgY2FsbGVkIG9ubHkgaWYgfHN0YXRlX3wgaXMgbm90IGtDbG9zZWQuCi0gIEV2ZW50SGFuZGxlciogaGFuZGxlcl87Ci0gIEF1ZGlvT3V0cHV0U3RyZWFtKiBzdHJlYW1fOwotCi0gIC8vIFRoZSBjdXJyZW50IHZvbHVtZSBvZiB0aGUgYXVkaW8gc3RyZWFtLgotICBkb3VibGUgdm9sdW1lXzsKLQotICAvLyB8c3RhdGVffCBpcyB3cml0dGVuIG9uIHRoZSBhdWRpbyBtYW5hZ2VyIHRocmVhZCBhbmQgaXMgcmVhZCBvbiB0aGUKLSAgLy8gaGFyZHdhcmUgYXVkaW8gdGhyZWFkLiBUaGVzZSBvcGVyYXRpb25zIG5lZWQgdG8gYmUgbG9ja2VkLiBCdXQgbG9jawotICAvLyBpcyBub3QgcmVxdWlyZWQgZm9yIHJlYWRpbmcgb24gdGhlIGF1ZGlvIG1hbmFnZXIgdGhyZWFkLgotICBTdGF0ZSBzdGF0ZV87Ci0KLSAgLy8gVGhlIHxsb2NrX3wgbXVzdCBiZSBhY3F1aXJlZCB3aGVuZXZlciB3ZSBhY2Nlc3MgfHN0YXRlX3wgZnJvbSBhIHRocmVhZAotICAvLyBvdGhlciB0aGFuIHRoZSBhdWRpbyBtYW5hZ2VyIHRocmVhZC4KLSAgYmFzZTo6TG9jayBsb2NrXzsKLQotICAvLyBTeW5jUmVhZGVyIGlzIHVzZWQgb25seSBpbiBsb3cgbGF0ZW5jeSBtb2RlIGZvciBzeW5jaHJvbm91cyByZWFkaW5nLgotICBTeW5jUmVhZGVyKiBzeW5jX3JlYWRlcl87Ci0KLSAgLy8gVGhlIG1lc3NhZ2UgbG9vcCBvZiBhdWRpbyBtYW5hZ2VyIHRocmVhZCB0aGF0IHRoaXMgb2JqZWN0IHJ1bnMgb24uCi0gIHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4gbWVzc2FnZV9sb29wXzsKLQotICAvLyBXaGVuIHN0YXJ0aW5nIHN0cmVhbSB3ZSB3YWl0IGZvciBkYXRhIHRvIGJlY29tZSBhdmFpbGFibGUuCi0gIC8vIE51bWJlciBvZiB0aW1lcyBsZWZ0LgotICBpbnQgbnVtYmVyX3BvbGxpbmdfYXR0ZW1wdHNfbGVmdF87Ci0KLSAgQXVkaW9QYXJhbWV0ZXJzIHBhcmFtc187Ci0KLSAgLy8gVXNlZCB0byBwb3N0IGRlbGF5ZWQgdGFza3MgdG8gb3Vyc2VsdmVzIHRoYXQgd2UgY2FuIGNhbmNlbC4KLSAgLy8gV2UgZG9uJ3Qgd2FudCB0aGUgdGFza3MgdG8gaG9sZCBvbnRvIGEgcmVmZXJlbmNlIGFzIGl0IHdpbGwgc2xvdyBkb3duCi0gIC8vIHNodXRkb3duIGFuZCBmb3JjZSBpdCB0byB3YWl0IGZvciB0aGUgbW9zdCBkZWxheWVkIHRhc2suCi0gIC8vIEFsc28sIGlmIHdlJ3JlIHNodXR0aW5nIGRvd24sIHdlIGRvIG5vdCB3YW50IHRvIHBvbGwgZm9yIG1vcmUgZGF0YS4KLSAgYmFzZTo6V2Vha1B0ckZhY3Rvcnk8QXVkaW9PdXRwdXRDb250cm9sbGVyPiB3ZWFrX3RoaXNfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBdWRpb091dHB1dENvbnRyb2xsZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQVVESU9fQVVESU9fT1VUUFVUX0NPTlRST0xMRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb19vdXRwdXRfY29udHJvbGxlcl91bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9hdWRpby9hdWRpb19vdXRwdXRfY29udHJvbGxlcl91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUyOWNlNS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fb3V0cHV0X2NvbnRyb2xsZXJfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgotI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL3dhaXRhYmxlX2V2ZW50LmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fb3V0cHV0X2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotLy8gVE9ETyh2cmspOiBUaGVzZSB0ZXN0cyBuZWVkIHRvIGJlIHJld3JpdHRlbiEgKGNyYnVnLmNvbS8xMTI1MDApCi0KLXVzaW5nIDo6dGVzdGluZzo6XzsKLXVzaW5nIDo6dGVzdGluZzo6QXRMZWFzdDsKLXVzaW5nIDo6dGVzdGluZzo6RG9BbGw7Ci11c2luZyA6OnRlc3Rpbmc6OkV4YWN0bHk7Ci11c2luZyA6OnRlc3Rpbmc6Okludm9rZVdpdGhvdXRBcmdzOwotdXNpbmcgOjp0ZXN0aW5nOjpOb3ROdWxsOwotdXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLXN0YXRpYyBjb25zdCBpbnQga1NhbXBsZVJhdGUgPSBBdWRpb1BhcmFtZXRlcnM6OmtBdWRpb0NEU2FtcGxlUmF0ZTsKLXN0YXRpYyBjb25zdCBpbnQga0JpdHNQZXJTYW1wbGUgPSAxNjsKLXN0YXRpYyBjb25zdCBDaGFubmVsTGF5b3V0IGtDaGFubmVsTGF5b3V0ID0gQ0hBTk5FTF9MQVlPVVRfU1RFUkVPOwotc3RhdGljIGNvbnN0IGludCBrU2FtcGxlc1BlclBhY2tldCA9IGtTYW1wbGVSYXRlIC8gMTA7Ci1zdGF0aWMgY29uc3QgaW50IGtIYXJkd2FyZUJ1ZmZlclNpemUgPSBrU2FtcGxlc1BlclBhY2tldCAqCi0gICAgQ2hhbm5lbExheW91dFRvQ2hhbm5lbENvdW50KGtDaGFubmVsTGF5b3V0KSAqIGtCaXRzUGVyU2FtcGxlIC8gODsKLQotY2xhc3MgTW9ja0F1ZGlvT3V0cHV0Q29udHJvbGxlckV2ZW50SGFuZGxlcgotICAgIDogcHVibGljIEF1ZGlvT3V0cHV0Q29udHJvbGxlcjo6RXZlbnRIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vY2tBdWRpb091dHB1dENvbnRyb2xsZXJFdmVudEhhbmRsZXIoKSB7fQotCi0gIE1PQ0tfTUVUSE9EMShPbkNyZWF0ZWQsIHZvaWQoQXVkaW9PdXRwdXRDb250cm9sbGVyKiBjb250cm9sbGVyKSk7Ci0gIE1PQ0tfTUVUSE9EMShPblBsYXlpbmcsIHZvaWQoQXVkaW9PdXRwdXRDb250cm9sbGVyKiBjb250cm9sbGVyKSk7Ci0gIE1PQ0tfTUVUSE9EMShPblBhdXNlZCwgdm9pZChBdWRpb091dHB1dENvbnRyb2xsZXIqIGNvbnRyb2xsZXIpKTsKLSAgTU9DS19NRVRIT0QyKE9uRXJyb3IsIHZvaWQoQXVkaW9PdXRwdXRDb250cm9sbGVyKiBjb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfY29kZSkpOwotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE1vY2tBdWRpb091dHB1dENvbnRyb2xsZXJFdmVudEhhbmRsZXIpOwotfTsKLQotY2xhc3MgTW9ja0F1ZGlvT3V0cHV0Q29udHJvbGxlclN5bmNSZWFkZXIKLSAgICA6IHB1YmxpYyBBdWRpb091dHB1dENvbnRyb2xsZXI6OlN5bmNSZWFkZXIgewotIHB1YmxpYzoKLSAgTW9ja0F1ZGlvT3V0cHV0Q29udHJvbGxlclN5bmNSZWFkZXIoKSB7fQotCi0gIE1PQ0tfTUVUSE9EMShVcGRhdGVQZW5kaW5nQnl0ZXMsIHZvaWQodWludDMyIGJ5dGVzKSk7Ci0gIE1PQ0tfTUVUSE9EMihSZWFkLCBpbnQoQXVkaW9CdXMqIHNvdXJjZSwgQXVkaW9CdXMqIGRlc3QpKTsKLSAgTU9DS19NRVRIT0QwKENsb3NlLCB2b2lkKCkpOwotICBNT0NLX01FVEhPRDAoRGF0YVJlYWR5LCBib29sKCkpOwotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE1vY2tBdWRpb091dHB1dENvbnRyb2xsZXJTeW5jUmVhZGVyKTsKLX07Ci0KLUFDVElPTl9QKFNpZ25hbEV2ZW50LCBldmVudCkgewotICBldmVudC0+U2lnbmFsKCk7Ci19Ci0KLS8vIEN1c3RvbSBhY3Rpb24gdG8gY2xlYXIgYSBtZW1vcnkgYnVmZmVyLgotQUNUSU9OKENsZWFyQnVmZmVyKSB7Ci0gIGFyZzEtPlplcm8oKTsKLX0KLQotLy8gQ2xvc2VzIEF1ZGlvT3V0cHV0Q29udHJvbGxlciBzeW5jaHJvbm91c2x5Lgotc3RhdGljIHZvaWQgQ2xvc2VBdWRpb0NvbnRyb2xsZXIoQXVkaW9PdXRwdXRDb250cm9sbGVyKiBjb250cm9sbGVyKSB7Ci0gIGNvbnRyb2xsZXItPkNsb3NlKE1lc3NhZ2VMb29wOjpRdWl0Q2xvc3VyZSgpKTsKLSAgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKS0+UnVuKCk7Ci19Ci0KLWNsYXNzIEF1ZGlvT3V0cHV0Q29udHJvbGxlclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICBBdWRpb091dHB1dENvbnRyb2xsZXJUZXN0KCkge30KLSAgdmlydHVhbCB+QXVkaW9PdXRwdXRDb250cm9sbGVyVGVzdCgpIHt9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIE1lc3NhZ2VMb29wRm9ySU8gbWVzc2FnZV9sb29wXzsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBdWRpb091dHB1dENvbnRyb2xsZXJUZXN0KTsKLX07Ci0KLVRFU1RfRihBdWRpb091dHB1dENvbnRyb2xsZXJUZXN0LCBDcmVhdGVBbmRDbG9zZSkgewotICBzY29wZWRfcHRyPEF1ZGlvTWFuYWdlcj4gYXVkaW9fbWFuYWdlcihBdWRpb01hbmFnZXI6OkNyZWF0ZSgpKTsKLSAgaWYgKCFhdWRpb19tYW5hZ2VyLT5IYXNBdWRpb091dHB1dERldmljZXMoKSkKLSAgICByZXR1cm47Ci0KLSAgTW9ja0F1ZGlvT3V0cHV0Q29udHJvbGxlckV2ZW50SGFuZGxlciBldmVudF9oYW5kbGVyOwotCi0gIEVYUEVDVF9DQUxMKGV2ZW50X2hhbmRsZXIsIE9uQ3JlYXRlZChOb3ROdWxsKCkpKQotICAgICAgLlRpbWVzKDEpOwotCi0gIE1vY2tBdWRpb091dHB1dENvbnRyb2xsZXJTeW5jUmVhZGVyIHN5bmNfcmVhZGVyOwotICBFWFBFQ1RfQ0FMTChzeW5jX3JlYWRlciwgQ2xvc2UoKSk7Ci0KLSAgQXVkaW9QYXJhbWV0ZXJzIHBhcmFtcyhBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIsIGtDaGFubmVsTGF5b3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGtTYW1wbGVSYXRlLCBrQml0c1BlclNhbXBsZSwga1NhbXBsZXNQZXJQYWNrZXQpOwotICBzY29wZWRfcmVmcHRyPEF1ZGlvT3V0cHV0Q29udHJvbGxlcj4gY29udHJvbGxlciA9Ci0gICAgICBBdWRpb091dHB1dENvbnRyb2xsZXI6OkNyZWF0ZSgKLSAgICAgICAgICBhdWRpb19tYW5hZ2VyLmdldCgpLCAmZXZlbnRfaGFuZGxlciwgcGFyYW1zLCAmc3luY19yZWFkZXIpOwotICBBU1NFUlRfVFJVRShjb250cm9sbGVyLmdldCgpKTsKLQotICAvLyBDbG9zZSB0aGUgY29udHJvbGxlciBpbW1lZGlhdGVseS4KLSAgQ2xvc2VBdWRpb0NvbnRyb2xsZXIoY29udHJvbGxlcik7Ci19Ci0KLVRFU1RfRihBdWRpb091dHB1dENvbnRyb2xsZXJUZXN0LCBQbGF5UGF1c2VDbG9zZSkgewotICBzY29wZWRfcHRyPEF1ZGlvTWFuYWdlcj4gYXVkaW9fbWFuYWdlcihBdWRpb01hbmFnZXI6OkNyZWF0ZSgpKTsKLSAgaWYgKCFhdWRpb19tYW5hZ2VyLT5IYXNBdWRpb091dHB1dERldmljZXMoKSkKLSAgICByZXR1cm47Ci0KLSAgTW9ja0F1ZGlvT3V0cHV0Q29udHJvbGxlckV2ZW50SGFuZGxlciBldmVudF9oYW5kbGVyOwotICBiYXNlOjpXYWl0YWJsZUV2ZW50IGV2ZW50KGZhbHNlLCBmYWxzZSk7Ci0gIGJhc2U6OldhaXRhYmxlRXZlbnQgcGF1c2VfZXZlbnQoZmFsc2UsIGZhbHNlKTsKLQotICAvLyBJZiBPbkNyZWF0ZWQgaXMgY2FsbGVkIHRoZW4gc2lnbmFsIHRoZSBldmVudC4KLSAgRVhQRUNUX0NBTEwoZXZlbnRfaGFuZGxlciwgT25DcmVhdGVkKE5vdE51bGwoKSkpCi0gICAgICAuV2lsbE9uY2UoSW52b2tlV2l0aG91dEFyZ3MoJmV2ZW50LCAmYmFzZTo6V2FpdGFibGVFdmVudDo6U2lnbmFsKSk7Ci0KLSAgLy8gT25QbGF5aW5nKCkgd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlLgotICBFWFBFQ1RfQ0FMTChldmVudF9oYW5kbGVyLCBPblBsYXlpbmcoTm90TnVsbCgpKSk7Ci0KLSAgTW9ja0F1ZGlvT3V0cHV0Q29udHJvbGxlclN5bmNSZWFkZXIgc3luY19yZWFkZXI7Ci0gIEVYUEVDVF9DQUxMKHN5bmNfcmVhZGVyLCBVcGRhdGVQZW5kaW5nQnl0ZXMoXykpCi0gICAgICAuVGltZXMoQXRMZWFzdCgyKSk7Ci0gIEVYUEVDVF9DQUxMKHN5bmNfcmVhZGVyLCBSZWFkKF8sIF8pKQotICAgICAgLldpbGxSZXBlYXRlZGx5KERvQWxsKENsZWFyQnVmZmVyKCksIFNpZ25hbEV2ZW50KCZldmVudCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuKDQpKSk7Ci0gIEVYUEVDVF9DQUxMKHN5bmNfcmVhZGVyLCBEYXRhUmVhZHkoKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4odHJ1ZSkpOwotICBFWFBFQ1RfQ0FMTChldmVudF9oYW5kbGVyLCBPblBhdXNlZChOb3ROdWxsKCkpKQotICAgICAgLldpbGxPbmNlKEludm9rZVdpdGhvdXRBcmdzKCZwYXVzZV9ldmVudCwgJmJhc2U6OldhaXRhYmxlRXZlbnQ6OlNpZ25hbCkpOwotICBFWFBFQ1RfQ0FMTChzeW5jX3JlYWRlciwgQ2xvc2UoKSk7Ci0KLSAgQXVkaW9QYXJhbWV0ZXJzIHBhcmFtcyhBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIsIGtDaGFubmVsTGF5b3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGtTYW1wbGVSYXRlLCBrQml0c1BlclNhbXBsZSwga1NhbXBsZXNQZXJQYWNrZXQpOwotICBzY29wZWRfcmVmcHRyPEF1ZGlvT3V0cHV0Q29udHJvbGxlcj4gY29udHJvbGxlciA9Ci0gICAgICBBdWRpb091dHB1dENvbnRyb2xsZXI6OkNyZWF0ZSgKLSAgICAgICAgICBhdWRpb19tYW5hZ2VyLmdldCgpLCAmZXZlbnRfaGFuZGxlciwgcGFyYW1zLCAmc3luY19yZWFkZXIpOwotICBBU1NFUlRfVFJVRShjb250cm9sbGVyLmdldCgpKTsKLQotICAvLyBXYWl0IGZvciBPbkNyZWF0ZWQoKSB0byBiZSBjYWxsZWQuCi0gIGV2ZW50LldhaXQoKTsKLQotICBBU1NFUlRfRkFMU0UocGF1c2VfZXZlbnQuSXNTaWduYWxlZCgpKTsKLSAgY29udHJvbGxlci0+UGxheSgpOwotICBjb250cm9sbGVyLT5QYXVzZSgpOwotICBwYXVzZV9ldmVudC5XYWl0KCk7Ci0KLSAgLy8gTm93IHN0b3AgdGhlIGNvbnRyb2xsZXIuCi0gIENsb3NlQXVkaW9Db250cm9sbGVyKGNvbnRyb2xsZXIpOwotfQotCi1URVNUX0YoQXVkaW9PdXRwdXRDb250cm9sbGVyVGVzdCwgSGFyZHdhcmVCdWZmZXJUb29MYXJnZSkgewotICBzY29wZWRfcHRyPEF1ZGlvTWFuYWdlcj4gYXVkaW9fbWFuYWdlcihBdWRpb01hbmFnZXI6OkNyZWF0ZSgpKTsKLSAgaWYgKCFhdWRpb19tYW5hZ2VyLT5IYXNBdWRpb091dHB1dERldmljZXMoKSkKLSAgICByZXR1cm47Ci0KLSAgLy8gQ3JlYXRlIGFuIGF1ZGlvIGRldmljZSB3aXRoIGEgdmVyeSBsYXJnZSBoYXJkd2FyZSBidWZmZXIgc2l6ZS4KLSAgTW9ja0F1ZGlvT3V0cHV0Q29udHJvbGxlckV2ZW50SGFuZGxlciBldmVudF9oYW5kbGVyOwotCi0gIE1vY2tBdWRpb091dHB1dENvbnRyb2xsZXJTeW5jUmVhZGVyIHN5bmNfcmVhZGVyOwotICBBdWRpb1BhcmFtZXRlcnMgcGFyYW1zKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xJTkVBUiwga0NoYW5uZWxMYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAga1NhbXBsZVJhdGUsIGtCaXRzUGVyU2FtcGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGtTYW1wbGVzUGVyUGFja2V0ICogMTAwMCk7Ci0gIHNjb3BlZF9yZWZwdHI8QXVkaW9PdXRwdXRDb250cm9sbGVyPiBjb250cm9sbGVyID0KLSAgICAgIEF1ZGlvT3V0cHV0Q29udHJvbGxlcjo6Q3JlYXRlKAotICAgICAgICAgIGF1ZGlvX21hbmFnZXIuZ2V0KCksICZldmVudF9oYW5kbGVyLCBwYXJhbXMsICZzeW5jX3JlYWRlcik7Ci0KLSAgLy8gVXNlIGFzc2VydCBiZWNhdXNlIHdlIGRvbid0IHN0b3AgdGhlIGRldmljZSBhbmQgYXNzdW1lIHdlIGNhbid0Ci0gIC8vIGNyZWF0ZSBvbmUuCi0gIEFTU0VSVF9GQUxTRShjb250cm9sbGVyKTsKLX0KLQotVEVTVF9GKEF1ZGlvT3V0cHV0Q29udHJvbGxlclRlc3QsIFBsYXlQYXVzZVBsYXlDbG9zZSkgewotICBzY29wZWRfcHRyPEF1ZGlvTWFuYWdlcj4gYXVkaW9fbWFuYWdlcihBdWRpb01hbmFnZXI6OkNyZWF0ZSgpKTsKLSAgaWYgKCFhdWRpb19tYW5hZ2VyLT5IYXNBdWRpb091dHB1dERldmljZXMoKSkKLSAgICByZXR1cm47Ci0KLSAgTW9ja0F1ZGlvT3V0cHV0Q29udHJvbGxlckV2ZW50SGFuZGxlciBldmVudF9oYW5kbGVyOwotICBiYXNlOjpXYWl0YWJsZUV2ZW50IGV2ZW50KGZhbHNlLCBmYWxzZSk7Ci0gIEVYUEVDVF9DQUxMKGV2ZW50X2hhbmRsZXIsIE9uQ3JlYXRlZChOb3ROdWxsKCkpKQotICAgICAgLldpbGxPbmNlKEludm9rZVdpdGhvdXRBcmdzKCZldmVudCwgJmJhc2U6OldhaXRhYmxlRXZlbnQ6OlNpZ25hbCkpOwotCi0gIC8vIE9uUGxheWluZygpIHdpbGwgYmUgY2FsbGVkIG9ubHkgb25jZS4KLSAgYmFzZTo6V2FpdGFibGVFdmVudCBwbGF5X2V2ZW50KGZhbHNlLCBmYWxzZSk7Ci0gIEVYUEVDVF9DQUxMKGV2ZW50X2hhbmRsZXIsIE9uUGxheWluZyhOb3ROdWxsKCkpKQotICAgICAgLldpbGxPbmNlKEludm9rZVdpdGhvdXRBcmdzKCZwbGF5X2V2ZW50LCAmYmFzZTo6V2FpdGFibGVFdmVudDo6U2lnbmFsKSk7Ci0KLSAgLy8gT25QYXVzZWQoKSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIHNpbmNlIHRoZSBwYXVzZSBkdXJpbmcga1N0YXJ0aW5nIGlzCi0gIC8vIGRyb3BwZWQgd2hlbiB0aGUgc2Vjb25kIHBsYXkgY29tZXMgaW4uCi0gIEVYUEVDVF9DQUxMKGV2ZW50X2hhbmRsZXIsIE9uUGF1c2VkKE5vdE51bGwoKSkpCi0gICAgICAuVGltZXMoMCk7Ci0KLSAgTW9ja0F1ZGlvT3V0cHV0Q29udHJvbGxlclN5bmNSZWFkZXIgc3luY19yZWFkZXI7Ci0gIEVYUEVDVF9DQUxMKHN5bmNfcmVhZGVyLCBVcGRhdGVQZW5kaW5nQnl0ZXMoXykpCi0gICAgICAuVGltZXMoQXRMZWFzdCgxKSk7Ci0gIEVYUEVDVF9DQUxMKHN5bmNfcmVhZGVyLCBSZWFkKF8sIF8pKQotICAgICAgLldpbGxSZXBlYXRlZGx5KERvQWxsKENsZWFyQnVmZmVyKCksIFNpZ25hbEV2ZW50KCZldmVudCksIFJldHVybig0KSkpOwotICBFWFBFQ1RfQ0FMTChzeW5jX3JlYWRlciwgRGF0YVJlYWR5KCkpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKHRydWUpKTsKLSAgRVhQRUNUX0NBTEwoc3luY19yZWFkZXIsIENsb3NlKCkpOwotCi0gIEF1ZGlvUGFyYW1ldGVycyBwYXJhbXMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSLCBrQ2hhbm5lbExheW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBrU2FtcGxlUmF0ZSwga0JpdHNQZXJTYW1wbGUsIGtTYW1wbGVzUGVyUGFja2V0KTsKLSAgc2NvcGVkX3JlZnB0cjxBdWRpb091dHB1dENvbnRyb2xsZXI+IGNvbnRyb2xsZXIgPQotICAgICAgQXVkaW9PdXRwdXRDb250cm9sbGVyOjpDcmVhdGUoCi0gICAgICAgICAgYXVkaW9fbWFuYWdlci5nZXQoKSwgJmV2ZW50X2hhbmRsZXIsIHBhcmFtcywgJnN5bmNfcmVhZGVyKTsKLSAgQVNTRVJUX1RSVUUoY29udHJvbGxlci5nZXQoKSk7Ci0KLSAgLy8gV2FpdCBmb3IgT25DcmVhdGVkKCkgdG8gYmUgY2FsbGVkLgotICBldmVudC5XYWl0KCk7Ci0KLSAgQVNTRVJUX0ZBTFNFKHBsYXlfZXZlbnQuSXNTaWduYWxlZCgpKTsKLSAgY29udHJvbGxlci0+UGxheSgpOwotICBjb250cm9sbGVyLT5QYXVzZSgpOwotICBjb250cm9sbGVyLT5QbGF5KCk7Ci0gIHBsYXlfZXZlbnQuV2FpdCgpOwotCi0gIC8vIE5vdyBzdG9wIHRoZSBjb250cm9sbGVyLgotICBDbG9zZUF1ZGlvQ29udHJvbGxlcihjb250cm9sbGVyKTsKLX0KLQotLy8gRW5zdXJlIHN0YXRlIGNoYW5nZSBldmVudHMgYXJlIGhhbmRsZWQuCi1URVNUX0YoQXVkaW9PdXRwdXRDb250cm9sbGVyVGVzdCwgUGxheVN0YXRlQ2hhbmdlQ2xvc2UpIHsKLSAgc2NvcGVkX3B0cjxBdWRpb01hbmFnZXI+IGF1ZGlvX21hbmFnZXIoQXVkaW9NYW5hZ2VyOjpDcmVhdGUoKSk7Ci0gIGlmICghYXVkaW9fbWFuYWdlci0+SGFzQXVkaW9PdXRwdXREZXZpY2VzKCkpCi0gICAgcmV0dXJuOwotCi0gIE1vY2tBdWRpb091dHB1dENvbnRyb2xsZXJFdmVudEhhbmRsZXIgZXZlbnRfaGFuZGxlcjsKLSAgYmFzZTo6V2FpdGFibGVFdmVudCBldmVudChmYWxzZSwgZmFsc2UpOwotICBFWFBFQ1RfQ0FMTChldmVudF9oYW5kbGVyLCBPbkNyZWF0ZWQoTm90TnVsbCgpKSkKLSAgICAgIC5XaWxsT25jZShJbnZva2VXaXRob3V0QXJncygmZXZlbnQsICZiYXNlOjpXYWl0YWJsZUV2ZW50OjpTaWduYWwpKTsKLQotICAvLyBPblBsYXlpbmcoKSB3aWxsIGJlIGNhbGxlZCBvbmNlIG5vcm1hbGx5IGFuZCBvbmNlIGFmdGVyIGJlaW5nIHJlY3JlYXRlZC4KLSAgYmFzZTo6V2FpdGFibGVFdmVudCBwbGF5X2V2ZW50KGZhbHNlLCBmYWxzZSk7Ci0gIEVYUEVDVF9DQUxMKGV2ZW50X2hhbmRsZXIsIE9uUGxheWluZyhOb3ROdWxsKCkpKQotICAgICAgLlRpbWVzKDIpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoSW52b2tlV2l0aG91dEFyZ3MoCi0gICAgICAgICAgJnBsYXlfZXZlbnQsICZiYXNlOjpXYWl0YWJsZUV2ZW50OjpTaWduYWwpKTsKLQotICAvLyBPblBhdXNlZCgpIHNob3VsZCBub3QgYmUgY2FsbGVkIGR1cmluZyB0aGUgc3RhdGUgY2hhbmdlIGV2ZW50LgotICBFWFBFQ1RfQ0FMTChldmVudF9oYW5kbGVyLCBPblBhdXNlZChOb3ROdWxsKCkpKQotICAgICAgLlRpbWVzKDApOwotCi0gIE1vY2tBdWRpb091dHB1dENvbnRyb2xsZXJTeW5jUmVhZGVyIHN5bmNfcmVhZGVyOwotICBFWFBFQ1RfQ0FMTChzeW5jX3JlYWRlciwgVXBkYXRlUGVuZGluZ0J5dGVzKF8pKQotICAgICAgLlRpbWVzKEF0TGVhc3QoMSkpOwotICBFWFBFQ1RfQ0FMTChzeW5jX3JlYWRlciwgUmVhZChfLCBfKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShEb0FsbChDbGVhckJ1ZmZlcigpLCBTaWduYWxFdmVudCgmZXZlbnQpLCBSZXR1cm4oNCkpKTsKLSAgRVhQRUNUX0NBTEwoc3luY19yZWFkZXIsIERhdGFSZWFkeSgpKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybih0cnVlKSk7Ci0gIEVYUEVDVF9DQUxMKHN5bmNfcmVhZGVyLCBDbG9zZSgpKTsKLQotICBBdWRpb1BhcmFtZXRlcnMgcGFyYW1zKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xJTkVBUiwga0NoYW5uZWxMYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAga1NhbXBsZVJhdGUsIGtCaXRzUGVyU2FtcGxlLCBrU2FtcGxlc1BlclBhY2tldCk7Ci0gIHNjb3BlZF9yZWZwdHI8QXVkaW9PdXRwdXRDb250cm9sbGVyPiBjb250cm9sbGVyID0KLSAgICAgIEF1ZGlvT3V0cHV0Q29udHJvbGxlcjo6Q3JlYXRlKAotICAgICAgICAgIGF1ZGlvX21hbmFnZXIuZ2V0KCksICZldmVudF9oYW5kbGVyLCBwYXJhbXMsICZzeW5jX3JlYWRlcik7Ci0gIEFTU0VSVF9UUlVFKGNvbnRyb2xsZXIuZ2V0KCkpOwotCi0gIC8vIFdhaXQgZm9yIE9uQ3JlYXRlZCgpIHRvIGJlIGNhbGxlZC4KLSAgZXZlbnQuV2FpdCgpOwotCi0gIEFTU0VSVF9GQUxTRShwbGF5X2V2ZW50LklzU2lnbmFsZWQoKSk7Ci0gIGNvbnRyb2xsZXItPlBsYXkoKTsKLSAgcGxheV9ldmVudC5XYWl0KCk7Ci0KLSAgLy8gRm9yY2UgYSBzdGF0ZSBjaGFuZ2UgYW5kIHdhaXQgZm9yIHRoZSBzdHJlYW0gdG8gY29tZSBiYWNrIHRvIHBsYXlpbmcgc3RhdGUuCi0gIHBsYXlfZXZlbnQuUmVzZXQoKTsKLSAgYXVkaW9fbWFuYWdlci0+R2V0TWVzc2FnZUxvb3AoKS0+UG9zdFRhc2soRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZCgmQXVkaW9PdXRwdXRDb250cm9sbGVyOjpPbkRldmljZUNoYW5nZSwgY29udHJvbGxlcikpOwotICBwbGF5X2V2ZW50LldhaXQoKTsKLQotICAvLyBOb3cgc3RvcCB0aGUgY29udHJvbGxlci4KLSAgQ2xvc2VBdWRpb0NvbnRyb2xsZXIoY29udHJvbGxlcik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9kZXZpY2UuY2MgYi9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fb3V0cHV0X2RldmljZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFkOTNmZi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fb3V0cHV0X2RldmljZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fb3V0cHV0X2RldmljZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX3Jlc3RyaWN0aW9ucy5oIgotI2luY2x1ZGUgImJhc2UvdGltZS5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fdXRpbC5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3NoYXJlZF9tZW1vcnlfdXRpbC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbGltaXRzLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIFRha2VzIGNhcmUgb2YgaW52b2tpbmcgdGhlIHJlbmRlciBjYWxsYmFjayBvbiB0aGUgYXVkaW8gdGhyZWFkLgotLy8gQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBjcmVhdGVkIGZvciBlYWNoIGNhcHR1cmUgc3RyZWFtIGluCi0vLyBPblN0cmVhbUNyZWF0ZWQoKS4KLWNsYXNzIEF1ZGlvT3V0cHV0RGV2aWNlOjpBdWRpb1RocmVhZENhbGxiYWNrCi0gICAgOiBwdWJsaWMgQXVkaW9EZXZpY2VUaHJlYWQ6OkNhbGxiYWNrIHsKLSBwdWJsaWM6Ci0gIEF1ZGlvVGhyZWFkQ2FsbGJhY2soY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBhdWRpb19wYXJhbWV0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dF9jaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpTaGFyZWRNZW1vcnlIYW5kbGUgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgIGludCBtZW1vcnlfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUmVuZGVyZXJTaW5rOjpSZW5kZXJDYWxsYmFjayogcmVuZGVyX2NhbGxiYWNrKTsKLSAgdmlydHVhbCB+QXVkaW9UaHJlYWRDYWxsYmFjaygpOwotCi0gIHZpcnR1YWwgdm9pZCBNYXBTaGFyZWRNZW1vcnkoKSBPVkVSUklERTsKLQotICAvLyBDYWxsZWQgd2hlbmV2ZXIgd2UgcmVjZWl2ZSBub3RpZmljYXRpb25zIGFib3V0IHBlbmRpbmcgZGF0YS4KLSAgdmlydHVhbCB2b2lkIFByb2Nlc3MoaW50IHBlbmRpbmdfZGF0YSkgT1ZFUlJJREU7Ci0KLSBwcml2YXRlOgotICBBdWRpb1JlbmRlcmVyU2luazo6UmVuZGVyQ2FsbGJhY2sqIHJlbmRlcl9jYWxsYmFja187Ci0gIHNjb3BlZF9wdHI8QXVkaW9CdXM+IGlucHV0X2J1c187Ci0gIHNjb3BlZF9wdHI8QXVkaW9CdXM+IG91dHB1dF9idXNfOwotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQXVkaW9UaHJlYWRDYWxsYmFjayk7Ci19OwotCi1BdWRpb091dHB1dERldmljZTo6QXVkaW9PdXRwdXREZXZpY2UoCi0gICAgQXVkaW9PdXRwdXRJUEMqIGlwYywKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+JiBpb19sb29wKQotICAgIDogU2NvcGVkTG9vcE9ic2VydmVyKGlvX2xvb3ApLAotICAgICAgaW5wdXRfY2hhbm5lbHNfKDApLAotICAgICAgY2FsbGJhY2tfKE5VTEwpLAotICAgICAgaXBjXyhpcGMpLAotICAgICAgc3RhdGVfKElETEUpLAotICAgICAgcGxheV9vbl9zdGFydF8odHJ1ZSksCi0gICAgICBzdG9wcGluZ19oYWNrXyhmYWxzZSkgewotICBDSEVDSyhpcGNfKTsKLSAgc3RyZWFtX2lkXyA9IGlwY18tPkFkZERlbGVnYXRlKHRoaXMpOwotfQotCi12b2lkIEF1ZGlvT3V0cHV0RGV2aWNlOjpJbml0aWFsaXplKGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJDYWxsYmFjayogY2FsbGJhY2spIHsKLSAgRENIRUNLKCFjYWxsYmFja18pIDw8ICJDYWxsaW5nIEluaXRpYWxpemUoKSB0d2ljZT8iOwotICBhdWRpb19wYXJhbWV0ZXJzXyA9IHBhcmFtczsKLSAgY2FsbGJhY2tfID0gY2FsbGJhY2s7Ci19Ci0KLXZvaWQgQXVkaW9PdXRwdXREZXZpY2U6OkluaXRpYWxpemVJTyhjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXRfY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyQ2FsbGJhY2sqIGNhbGxiYWNrKSB7Ci0gIERDSEVDS19HRShpbnB1dF9jaGFubmVscywgMCk7Ci0gIERDSEVDS19MVChpbnB1dF9jaGFubmVscywgbGltaXRzOjprTWF4Q2hhbm5lbHMpOwotICBpbnB1dF9jaGFubmVsc18gPSBpbnB1dF9jaGFubmVsczsKLSAgSW5pdGlhbGl6ZShwYXJhbXMsIGNhbGxiYWNrKTsKLX0KLQotQXVkaW9PdXRwdXREZXZpY2U6On5BdWRpb091dHB1dERldmljZSgpIHsKLSAgLy8gVGhlIGN1cnJlbnQgZGVzaWduIHJlcXVpcmVzIHRoYXQgdGhlIHVzZXIgY2FsbHMgU3RvcCgpIGJlZm9yZSBkZWxldGluZwotICAvLyB0aGlzIGNsYXNzLgotICBEQ0hFQ0soYXVkaW9fdGhyZWFkXy5Jc1N0b3BwZWQoKSk7Ci0KLSAgaWYgKGlwY18pCi0gICAgaXBjXy0+UmVtb3ZlRGVsZWdhdGUoc3RyZWFtX2lkXyk7Ci19Ci0KLXZvaWQgQXVkaW9PdXRwdXREZXZpY2U6OlN0YXJ0KCkgewotICBEQ0hFQ0soY2FsbGJhY2tfKSA8PCAiSW5pdGlhbGl6ZSBoYXNuJ3QgYmVlbiBjYWxsZWQiOwotICBtZXNzYWdlX2xvb3AoKS0+UG9zdFRhc2soRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZCgmQXVkaW9PdXRwdXREZXZpY2U6OkNyZWF0ZVN0cmVhbU9uSU9UaHJlYWQsIHRoaXMsCi0gICAgICAgICAgICAgICAgIGF1ZGlvX3BhcmFtZXRlcnNfLCBpbnB1dF9jaGFubmVsc18pKTsKLX0KLQotdm9pZCBBdWRpb091dHB1dERldmljZTo6U3RvcCgpIHsKLSAgewotICAgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhhdWRpb190aHJlYWRfbG9ja18pOwotICAgIGF1ZGlvX3RocmVhZF8uU3RvcChNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLSAgICBzdG9wcGluZ19oYWNrXyA9IHRydWU7Ci0gIH0KLQotICBtZXNzYWdlX2xvb3AoKS0+UG9zdFRhc2soRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZCgmQXVkaW9PdXRwdXREZXZpY2U6OlNodXREb3duT25JT1RocmVhZCwgdGhpcykpOwotfQotCi12b2lkIEF1ZGlvT3V0cHV0RGV2aWNlOjpQbGF5KCkgewotICBtZXNzYWdlX2xvb3AoKS0+UG9zdFRhc2soRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZCgmQXVkaW9PdXRwdXREZXZpY2U6OlBsYXlPbklPVGhyZWFkLCB0aGlzKSk7Ci19Ci0KLXZvaWQgQXVkaW9PdXRwdXREZXZpY2U6OlBhdXNlKGJvb2wgZmx1c2gpIHsKLSAgbWVzc2FnZV9sb29wKCktPlBvc3RUYXNrKEZST01fSEVSRSwKLSAgICAgIGJhc2U6OkJpbmQoJkF1ZGlvT3V0cHV0RGV2aWNlOjpQYXVzZU9uSU9UaHJlYWQsIHRoaXMsIGZsdXNoKSk7Ci19Ci0KLWJvb2wgQXVkaW9PdXRwdXREZXZpY2U6OlNldFZvbHVtZShkb3VibGUgdm9sdW1lKSB7Ci0gIGlmICh2b2x1bWUgPCAwIHx8IHZvbHVtZSA+IDEuMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFtZXNzYWdlX2xvb3AoKS0+UG9zdFRhc2soRlJPTV9IRVJFLAotICAgICAgICAgIGJhc2U6OkJpbmQoJkF1ZGlvT3V0cHV0RGV2aWNlOjpTZXRWb2x1bWVPbklPVGhyZWFkLCB0aGlzLCB2b2x1bWUpKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEF1ZGlvT3V0cHV0RGV2aWNlOjpDcmVhdGVTdHJlYW1PbklPVGhyZWFkKGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXRfY2hhbm5lbHMpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcCgpLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBpZiAoc3RhdGVfID09IElETEUpIHsKLSAgICBzdGF0ZV8gPSBDUkVBVElOR19TVFJFQU07Ci0gICAgaXBjXy0+Q3JlYXRlU3RyZWFtKHN0cmVhbV9pZF8sIHBhcmFtcywgaW5wdXRfY2hhbm5lbHMpOwotICB9Ci19Ci0KLXZvaWQgQXVkaW9PdXRwdXREZXZpY2U6OlBsYXlPbklPVGhyZWFkKCkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wKCktPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIGlmIChzdGF0ZV8gPT0gUEFVU0VEKSB7Ci0gICAgaXBjXy0+UGxheVN0cmVhbShzdHJlYW1faWRfKTsKLSAgICBzdGF0ZV8gPSBQTEFZSU5HOwotICAgIHBsYXlfb25fc3RhcnRfID0gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgcGxheV9vbl9zdGFydF8gPSB0cnVlOwotICB9Ci19Ci0KLXZvaWQgQXVkaW9PdXRwdXREZXZpY2U6OlBhdXNlT25JT1RocmVhZChib29sIGZsdXNoKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3AoKS0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgaWYgKHN0YXRlXyA9PSBQTEFZSU5HKSB7Ci0gICAgaXBjXy0+UGF1c2VTdHJlYW0oc3RyZWFtX2lkXyk7Ci0gICAgaWYgKGZsdXNoKQotICAgICAgaXBjXy0+Rmx1c2hTdHJlYW0oc3RyZWFtX2lkXyk7Ci0gICAgc3RhdGVfID0gUEFVU0VEOwotICB9IGVsc2UgewotICAgIC8vIE5vdGUgdGhhdCB8Zmx1c2h8IGlzbid0IHJlbGV2YW50IGhlcmUgc2luY2UgdGhpcyBpcyB0aGUgY2FzZSB3aGVyZQotICAgIC8vIHRoZSBzdHJlYW0gaXMgZmlyc3Qgc3RhcnRpbmcuCi0gIH0KLSAgcGxheV9vbl9zdGFydF8gPSBmYWxzZTsKLX0KLQotdm9pZCBBdWRpb091dHB1dERldmljZTo6U2h1dERvd25PbklPVGhyZWFkKCkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wKCktPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0KLSAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IGNhbGwgc2h1dGRvd24gbW9yZSB0aGFuIG9uY2UuCi0gIGlmIChzdGF0ZV8gPj0gQ1JFQVRJTkdfU1RSRUFNKSB7Ci0gICAgaXBjXy0+Q2xvc2VTdHJlYW0oc3RyZWFtX2lkXyk7Ci0gICAgc3RhdGVfID0gSURMRTsKLSAgfQotCi0gIC8vIFdlIGNhbiBydW4gaW50byBhbiBpc3N1ZSB3aGVyZSBTaHV0RG93bk9uSU9UaHJlYWQgaXMgY2FsbGVkIHJpZ2h0IGFmdGVyCi0gIC8vIE9uU3RyZWFtQ3JlYXRlZCBpcyBjYWxsZWQgaW4gY2FzZXMgd2hlcmUgU3RhcnQvU3RvcCBhcmUgY2FsbGVkIGJlZm9yZSB3ZQotICAvLyBnZXQgdGhlIE9uU3RyZWFtQ3JlYXRlZCBjYWxsYmFjay4gIFRvIGhhbmRsZSB0aGF0IGNvcm5lciBjYXNlLCB3ZSBjYWxsCi0gIC8vIFN0b3AoKS4gSW4gbW9zdCBjYXNlcywgdGhlIHRocmVhZCB3aWxsIGFscmVhZHkgYmUgc3RvcHBlZC4KLSAgLy8KLSAgLy8gQW5vdGhlciBzaXR1YXRpb24gaXMgd2hlbiB0aGUgSU8gdGhyZWFkIGdvZXMgYXdheSBiZWZvcmUgU3RvcCgpIGlzIGNhbGxlZAotICAvLyBpbiB3aGljaCBjYXNlLCB3ZSBjYW5ub3QgdXNlIHRoZSBtZXNzYWdlIGxvb3AgdG8gY2xvc2UgdGhlIHRocmVhZCBoYW5kbGUKLSAgLy8gYW5kIGNhbid0IHJlbHkgb24gdGhlIG1haW4gdGhyZWFkIGV4aXN0aW5nIGVpdGhlci4KLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrXyhhdWRpb190aHJlYWRfbG9ja18pOwotICBiYXNlOjpUaHJlYWRSZXN0cmljdGlvbnM6OlNjb3BlZEFsbG93SU8gYWxsb3dfaW87Ci0gIGF1ZGlvX3RocmVhZF8uU3RvcChOVUxMKTsKLSAgYXVkaW9fY2FsbGJhY2tfLnJlc2V0KCk7Ci0gIHN0b3BwaW5nX2hhY2tfID0gZmFsc2U7Ci19Ci0KLXZvaWQgQXVkaW9PdXRwdXREZXZpY2U6OlNldFZvbHVtZU9uSU9UaHJlYWQoZG91YmxlIHZvbHVtZSkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wKCktPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIGlmIChzdGF0ZV8gPj0gQ1JFQVRJTkdfU1RSRUFNKQotICAgIGlwY18tPlNldFZvbHVtZShzdHJlYW1faWRfLCB2b2x1bWUpOwotfQotCi12b2lkIEF1ZGlvT3V0cHV0RGV2aWNlOjpPblN0YXRlQ2hhbmdlZChBdWRpb091dHB1dElQQ0RlbGVnYXRlOjpTdGF0ZSBzdGF0ZSkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wKCktPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBpZiB0aGUgc3RyZWFtIGhhcyBiZWVuIGNsb3NlZC4KLSAgaWYgKHN0YXRlXyA8IENSRUFUSU5HX1NUUkVBTSkKLSAgICByZXR1cm47Ci0KLSAgaWYgKHN0YXRlID09IEF1ZGlvT3V0cHV0SVBDRGVsZWdhdGU6OmtFcnJvcikgewotICAgIERMT0coV0FSTklORykgPDwgIkF1ZGlvT3V0cHV0RGV2aWNlOjpPblN0YXRlQ2hhbmdlZChrRXJyb3IpIjsKLSAgICAvLyBEb24ndCBkZXJlZmVyZW5jZSB0aGUgY2FsbGJhY2sgb2JqZWN0IGlmIHRoZSBhdWRpbyB0aHJlYWQKLSAgICAvLyBpcyBzdG9wcGVkIG9yIHN0b3BwaW5nLiAgVGhhdCBjb3VsZCBtZWFuIHRoYXQgdGhlIGNhbGxiYWNrCi0gICAgLy8gb2JqZWN0IGhhcyBiZWVuIGRlbGV0ZWQuCi0gICAgLy8gVE9ETyh0b21taSk6IEFkZCBhbiBleHBsaWNpdCBjb250cmFjdCBmb3IgY2xlYXJpbmcgdGhlIGNhbGxiYWNrCi0gICAgLy8gb2JqZWN0LiAgUG9zc2libHkgcmVxdWlyZSBjYWxsaW5nIEluaXRpYWxpemUgYWdhaW4gb3IgcHJvdmlkZQotICAgIC8vIGEgY2FsbGJhY2sgb2JqZWN0IHZpYSBTdGFydCgpIGFuZCBjbGVhciBpdCBpbiBTdG9wKCkuCi0gICAgaWYgKCFhdWRpb190aHJlYWRfLklzU3RvcHBlZCgpKQotICAgICAgY2FsbGJhY2tfLT5PblJlbmRlckVycm9yKCk7Ci0gIH0KLX0KLQotdm9pZCBBdWRpb091dHB1dERldmljZTo6T25TdHJlYW1DcmVhdGVkKAotICAgIGJhc2U6OlNoYXJlZE1lbW9yeUhhbmRsZSBoYW5kbGUsCi0gICAgYmFzZTo6U3luY1NvY2tldDo6SGFuZGxlIHNvY2tldF9oYW5kbGUsCi0gICAgaW50IGxlbmd0aCkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wKCktPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0jaWYgZGVmaW5lZChPU19XSU4pCi0gIERDSEVDSyhoYW5kbGUpOwotICBEQ0hFQ0soc29ja2V0X2hhbmRsZSk7Ci0jZWxpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0gIERDSEVDSyhoYW5kbGUuZ2V0KCkpOwotI2Vsc2UKLSAgRENIRUNLX0dFKGhhbmRsZS5mZCwgMCk7Ci0gIERDSEVDS19HRShzb2NrZXRfaGFuZGxlLCAwKTsKLSNlbmRpZgotCi0gIGlmIChzdGF0ZV8gIT0gQ1JFQVRJTkdfU1RSRUFNKQotICAgIHJldHVybjsKLQotICAvLyBXZSBjYW4gcmVjZWl2ZSBPblN0cmVhbUNyZWF0ZWQoKSBvbiB0aGUgSU8gdGhyZWFkIGFmdGVyIHRoZSBjbGllbnQgaGFzCi0gIC8vIGNhbGxlZCBTdG9wKCkgYnV0IGJlZm9yZSBTaHV0RG93bk9uSU9UaHJlYWQoKSBpcyBwcm9jZXNzZWQuIEluIHN1Y2ggYQotICAvLyBzaXR1YXRpb24gfGNhbGxiYWNrX3wgbWlnaHQgcG9pbnQgdG8gZnJlZWQgbWVtb3J5LiBJbnN0ZWFkIG9mIHN0YXJ0aW5nCi0gIC8vIHxhdWRpb190aHJlYWRffCBkbyBub3RoaW5nIGFuZCB3YWl0IGZvciBTaHV0RG93bk9uSU9UaHJlYWQoKSB0byBnZXQgY2FsbGVkLgotICAvLwotICAvLyBUT0RPKHNjaGVya3VzKTogVGhlIHJlYWwgZml4IGlzIHRvIGhhdmUgc2FuZSBvd25lcnNoaXAgc2VtYW50aWNzLiBUaGUgZmFjdAotICAvLyB0aGF0IHxjYWxsYmFja198ICh3aGljaCBzaG91bGQgb3duIGFuZCBvdXRsaXZlIHRoaXMgb2JqZWN0ISkgY2FuIHBvaW50IHRvCi0gIC8vIGZyZWVkIG1lbW9yeSBpcyBhIG1lc3MuIEF1ZGlvUmVuZGVyZXJTaW5rIHNob3VsZCBiZSBub24tcmVmY291bnRlZCBzbyB0aGF0Ci0gIC8vIG93bmVycyAoV2ViUnRjQXVkaW9EZXZpY2VJbXBsLCBBdWRpb1JlbmRlcmVySW1wbCwgZXRjLi4uKSBjYW4gU3RvcCgpIGFuZAotICAvLyBkZWxldGUgYXMgdGhleSBzZWUgZml0LiBBdWRpb091dHB1dERldmljZSBzaG91bGQgaW50ZXJuYWxseSB1c2UgV2Vha1B0cgotICAvLyB0byBoYW5kbGUgdGVhcmRvd24gYW5kIHRocmVhZCBob3BwaW5nLiBTZWUgaHR0cDovL2NyYnVnLmNvbS8xNTEwNTEgZm9yCi0gIC8vIGRldGFpbHMuCi0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhhdWRpb190aHJlYWRfbG9ja18pOwotICBpZiAoc3RvcHBpbmdfaGFja18pCi0gICAgcmV0dXJuOwotCi0gIERDSEVDSyhhdWRpb190aHJlYWRfLklzU3RvcHBlZCgpKTsKLSAgYXVkaW9fY2FsbGJhY2tfLnJlc2V0KG5ldyBBdWRpb091dHB1dERldmljZTo6QXVkaW9UaHJlYWRDYWxsYmFjaygKLSAgICAgIGF1ZGlvX3BhcmFtZXRlcnNfLCBpbnB1dF9jaGFubmVsc18sIGhhbmRsZSwgbGVuZ3RoLCBjYWxsYmFja18pKTsKLSAgYXVkaW9fdGhyZWFkXy5TdGFydChhdWRpb19jYWxsYmFja18uZ2V0KCksIHNvY2tldF9oYW5kbGUsCi0gICAgICAiQXVkaW9PdXRwdXREZXZpY2UiKTsKLSAgc3RhdGVfID0gUEFVU0VEOwotCi0gIC8vIFdlIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBQbGF5KCkgYW5kL29yIFBhdXNlKCkgbWF5IGhhdmUgYmVlbiBjYWxsZWQKLSAgLy8gbXVsdGlwbGUgdGltZXMgYmVmb3JlIE9uU3RyZWFtQ3JlYXRlZCgpIGdldHMgY2FsbGVkLgotICBpZiAocGxheV9vbl9zdGFydF8pCi0gICAgUGxheU9uSU9UaHJlYWQoKTsKLX0KLQotdm9pZCBBdWRpb091dHB1dERldmljZTo6T25JUENDbG9zZWQoKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3AoKS0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgc3RhdGVfID0gSVBDX0NMT1NFRDsKLSAgaXBjXyA9IE5VTEw7Ci19Ci0KLXZvaWQgQXVkaW9PdXRwdXREZXZpY2U6OldpbGxEZXN0cm95Q3VycmVudE1lc3NhZ2VMb29wKCkgewotICBMT0coRVJST1IpIDw8ICJJTyBsb29wIGdvaW5nIGF3YXkgYmVmb3JlIHRoZSBhdWRpbyBkZXZpY2UgaGFzIGJlZW4gc3RvcHBlZCI7Ci0gIFNodXREb3duT25JT1RocmVhZCgpOwotfQotCi0vLyBBdWRpb091dHB1dERldmljZTo6QXVkaW9UaHJlYWRDYWxsYmFjawotCi1BdWRpb091dHB1dERldmljZTo6QXVkaW9UaHJlYWRDYWxsYmFjazo6QXVkaW9UaHJlYWRDYWxsYmFjaygKLSAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIGF1ZGlvX3BhcmFtZXRlcnMsCi0gICAgaW50IGlucHV0X2NoYW5uZWxzLAotICAgIGJhc2U6OlNoYXJlZE1lbW9yeUhhbmRsZSBtZW1vcnksCi0gICAgaW50IG1lbW9yeV9sZW5ndGgsCi0gICAgQXVkaW9SZW5kZXJlclNpbms6OlJlbmRlckNhbGxiYWNrKiByZW5kZXJfY2FsbGJhY2spCi0gICAgOiBBdWRpb0RldmljZVRocmVhZDo6Q2FsbGJhY2soYXVkaW9fcGFyYW1ldGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9jaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X2xlbmd0aCksCi0gICAgICByZW5kZXJfY2FsbGJhY2tfKHJlbmRlcl9jYWxsYmFjaykgewotfQotCi1BdWRpb091dHB1dERldmljZTo6QXVkaW9UaHJlYWRDYWxsYmFjazo6fkF1ZGlvVGhyZWFkQ2FsbGJhY2soKSB7Ci19Ci0KLXZvaWQgQXVkaW9PdXRwdXREZXZpY2U6OkF1ZGlvVGhyZWFkQ2FsbGJhY2s6Ok1hcFNoYXJlZE1lbW9yeSgpIHsKLSAgc2hhcmVkX21lbW9yeV8uTWFwKFRvdGFsU2hhcmVkTWVtb3J5U2l6ZUluQnl0ZXMobWVtb3J5X2xlbmd0aF8pKTsKLQotICAvLyBDYWxjdWxhdGUgb3V0cHV0IGFuZCBpbnB1dCBtZW1vcnkgc2l6ZS4KLSAgaW50IG91dHB1dF9tZW1vcnlfc2l6ZSA9IEF1ZGlvQnVzOjpDYWxjdWxhdGVNZW1vcnlTaXplKGF1ZGlvX3BhcmFtZXRlcnNfKTsKLSAgaW50IGZyYW1lcyA9IGF1ZGlvX3BhcmFtZXRlcnNfLmZyYW1lc19wZXJfYnVmZmVyKCk7Ci0gIGludCBpbnB1dF9tZW1vcnlfc2l6ZSA9Ci0gICAgICBBdWRpb0J1czo6Q2FsY3VsYXRlTWVtb3J5U2l6ZShpbnB1dF9jaGFubmVsc18sIGZyYW1lcyk7Ci0KLSAgaW50IGlvX3NpemUgPSBvdXRwdXRfbWVtb3J5X3NpemUgKyBpbnB1dF9tZW1vcnlfc2l6ZTsKLQotICBEQ0hFQ0tfRVEobWVtb3J5X2xlbmd0aF8sIGlvX3NpemUpOwotCi0gIG91dHB1dF9idXNfID0KLSAgICAgIEF1ZGlvQnVzOjpXcmFwTWVtb3J5KGF1ZGlvX3BhcmFtZXRlcnNfLCBzaGFyZWRfbWVtb3J5Xy5tZW1vcnkoKSk7Ci0KLSAgaWYgKGlucHV0X2NoYW5uZWxzXyA+IDApIHsKLSAgICAvLyBUaGUgaW5wdXQgZGF0YSBpcyBhZnRlciB0aGUgb3V0cHV0IGRhdGEuCi0gICAgY2hhciogaW5wdXRfZGF0YSA9Ci0gICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihzaGFyZWRfbWVtb3J5Xy5tZW1vcnkoKSkgKyBvdXRwdXRfbWVtb3J5X3NpemU7Ci0gICAgaW5wdXRfYnVzXyA9Ci0gICAgICAgIEF1ZGlvQnVzOjpXcmFwTWVtb3J5KGlucHV0X2NoYW5uZWxzXywgZnJhbWVzLCBpbnB1dF9kYXRhKTsKLSAgfQotfQotCi0vLyBDYWxsZWQgd2hlbmV2ZXIgd2UgcmVjZWl2ZSBub3RpZmljYXRpb25zIGFib3V0IHBlbmRpbmcgZGF0YS4KLXZvaWQgQXVkaW9PdXRwdXREZXZpY2U6OkF1ZGlvVGhyZWFkQ2FsbGJhY2s6OlByb2Nlc3MoaW50IHBlbmRpbmdfZGF0YSkgewotICBpZiAocGVuZGluZ19kYXRhID09IGtQYXVzZU1hcmspIHsKLSAgICBtZW1zZXQoc2hhcmVkX21lbW9yeV8ubWVtb3J5KCksIDAsIG1lbW9yeV9sZW5ndGhfKTsKLSAgICBTZXRBY3R1YWxEYXRhU2l6ZUluQnl0ZXMoJnNoYXJlZF9tZW1vcnlfLCBtZW1vcnlfbGVuZ3RoXywgMCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gQ29udmVydCB0aGUgbnVtYmVyIG9mIHBlbmRpbmcgYnl0ZXMgaW4gdGhlIHJlbmRlciBidWZmZXIKLSAgLy8gaW50byBtaWxsaXNlY29uZHMuCi0gIGludCBhdWRpb19kZWxheV9taWxsaXNlY29uZHMgPSBwZW5kaW5nX2RhdGEgLyBieXRlc19wZXJfbXNfOwotCi0gIFRSQUNFX0VWRU5UMCgiYXVkaW8iLCAiQXVkaW9PdXRwdXREZXZpY2U6OkZpcmVSZW5kZXJDYWxsYmFjayIpOwotCi0gIC8vIFVwZGF0ZSB0aGUgYXVkaW8tZGVsYXkgbWVhc3VyZW1lbnQgdGhlbiBhc2sgY2xpZW50IHRvIHJlbmRlciBhdWRpby4gIFNpbmNlCi0gIC8vIHxvdXRwdXRfYnVzX3wgaXMgd3JhcHBpbmcgdGhlIHNoYXJlZCBtZW1vcnkgdGhlIFJlbmRlcigpIGNhbGwgaXMgd3JpdGluZwotICAvLyBkaXJlY3RseSBpbnRvIHRoZSBzaGFyZWQgbWVtb3J5LgotICBzaXplX3QgbnVtX2ZyYW1lcyA9IGF1ZGlvX3BhcmFtZXRlcnNfLmZyYW1lc19wZXJfYnVmZmVyKCk7Ci0KLSAgaWYgKGlucHV0X2J1c18uZ2V0KCkgJiYgaW5wdXRfY2hhbm5lbHNfID4gMCkgewotICAgIHJlbmRlcl9jYWxsYmFja18tPlJlbmRlcklPKGlucHV0X2J1c18uZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2J1c18uZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGVsYXlfbWlsbGlzZWNvbmRzKTsKLSAgfSBlbHNlIHsKLSAgICBudW1fZnJhbWVzID0gcmVuZGVyX2NhbGxiYWNrXy0+UmVuZGVyKG91dHB1dF9idXNfLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGVsYXlfbWlsbGlzZWNvbmRzKTsKLSAgfQotCi0gIC8vIExldCB0aGUgaG9zdCBrbm93IHdlIGFyZSBkb25lLgotICAvLyBUT0RPKGRhbGVjdXJ0aXMpOiBUZWNobmljYWxseSB0aGlzIGlzIG5vdCBhbHdheXMgY29ycmVjdC4gIER1ZSB0byBjaGFubmVsCi0gIC8vIHBhZGRpbmcgZm9yIGFsaWdubWVudCwgdGhlcmUgbWF5IGJlIG1vcmUgZGF0YSBhdmFpbGFibGUgdGhhbiB0aGlzLiAgV2UncmUKLSAgLy8gcmVseWluZyBvbiBBdWRpb1N5bmNSZWFkZXI6OlJlYWQoKSB0byBwYXJzZSB0aGlzIHdpdGggdGhhdCBpbiBtaW5kLiAgUmVuYW1lCi0gIC8vIHRoZXNlIG1ldGhvZHMgdG8gU2V0L0dldEFjdHVhbEZyYW1lQ291bnQoKS4KLSAgU2V0QWN0dWFsRGF0YVNpemVJbkJ5dGVzKAotICAgICAgJnNoYXJlZF9tZW1vcnlfLCBtZW1vcnlfbGVuZ3RoXywKLSAgICAgIG51bV9mcmFtZXMgKiBzaXplb2YoKm91dHB1dF9idXNfLT5jaGFubmVsKDApKSAqIG91dHB1dF9idXNfLT5jaGFubmVscygpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhLgpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9kZXZpY2UuaCBiL3NyYy9tZWRpYS9hdWRpby9hdWRpb19vdXRwdXRfZGV2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NTAwMjguLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9kZXZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotLy8KLS8vIEF1ZGlvIHJlbmRlcmluZyB1bml0IHV0aWxpemluZyBhdWRpbyBvdXRwdXQgc3RyZWFtIHByb3ZpZGVkIGJ5IGJyb3dzZXIKLS8vIHByb2Nlc3MgdGhyb3VnaCBJUEMuCi0vLwotLy8gUmVsYXRpb25zaGlwIG9mIGNsYXNzZXMuCi0vLwotLy8gIEF1ZGlvT3V0cHV0Q29udHJvbGxlciAgICAgICAgICAgICAgICBBdWRpb091dHB1dERldmljZQotLy8gICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KLS8vICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyAgICAgICAgICAgdiAgICAgICAgICAgICAgIElQQyAgICAgICAgICAgICAgdgotLy8gICAgQXVkaW9SZW5kZXJlckhvc3QgIDwtLS0tLS0tLS0+IEF1ZGlvT3V0cHV0SVBDIChBdWRpb01lc3NhZ2VGaWx0ZXIpCi0vLwotLy8gVHJhbnNwb3J0YXRpb24gb2YgYXVkaW8gc2FtcGxlcyBmcm9tIHRoZSByZW5kZXIgdG8gdGhlIGJyb3dzZXIgcHJvY2VzcwotLy8gaXMgZG9uZSBieSB1c2luZyBzaGFyZWQgbWVtb3J5IGluIGNvbWJpbmF0aW9uIHdpdGggYSBzeW5jIHNvY2tldCBwYWlyCi0vLyB0byBnZW5lcmF0ZSBhIGxvdyBsYXRlbmN5IHRyYW5zcG9ydC4gVGhlIEF1ZGlvT3V0cHV0RGV2aWNlIHVzZXIgcmVnaXN0ZXJzIGFuCi0vLyBBdWRpb091dHB1dERldmljZTo6UmVuZGVyQ2FsbGJhY2sgYXQgY29uc3RydWN0aW9uIGFuZCB3aWxsIGJlIHBvbGxlZCBieSB0aGUKLS8vIEF1ZGlvT3V0cHV0RGV2aWNlIGZvciBhdWRpbyB0byBiZSBwbGF5ZWQgb3V0IGJ5IHRoZSB1bmRlcmx5aW5nIGF1ZGlvIGxheWVycy4KLS8vCi0vLyBTdGF0ZSBzZXF1ZW5jZXMuCi0vLwotLy8gICAgICAgICAgICBUYXNrIFtJTyB0aHJlYWRdICAgICAgICAgICAgICAgICAgSVBDIFtJTyB0aHJlYWRdCi0vLwotLy8gU3RhcnQgLT4gQ3JlYXRlU3RyZWFtT25JT1RocmVhZCAtLS0tLT4gQ3JlYXRlU3RyZWFtIC0tLS0tLT4KLS8vICAgICAgIDwtIE9uU3RyZWFtQ3JlYXRlZCA8LSBBdWRpb01zZ19Ob3RpZnlTdHJlYW1DcmVhdGVkIDwtCi0vLyAgICAgICAtLS0+IFBsYXlPbklPVGhyZWFkIC0tLS0tLS0tLS0tPiBQbGF5U3RyZWFtIC0tLS0tLS0tPgotLy8KLS8vIE9wdGlvbmFsbHkgUGxheSgpIC8gUGF1c2UoKSBzZXF1ZW5jZXMgbWF5IG9jY3VyOgotLy8gUGxheSAtPiBQbGF5T25JT1RocmVhZCAtLS0tLS0tLS0tLS0tLT4gUGxheVN0cmVhbSAtLS0tLS0tLS0+Ci0vLyBQYXVzZSAtPiBQYXVzZU9uSU9UaHJlYWQgLS0tLS0tLS0tLS0tPiBQYXVzZVN0cmVhbSAtLS0tLS0tLT4KLS8vIChub3RlIHRoYXQgUGxheSgpIC8gUGF1c2UoKSBzZXF1ZW5jZXMgYmVmb3JlIE9uU3RyZWFtQ3JlYXRlZCBhcmUKLS8vICBkZWZlcnJlZCB1bnRpbCBPblN0cmVhbUNyZWF0ZWQsIHdpdGggdGhlIGxhc3QgdmFsaWQgc3RhdGUgYmVpbmcgdXNlZCkKLS8vCi0vLyBBdWRpb091dHB1dERldmljZTo6UmVuZGVyID0+IGF1ZGlvIHRyYW5zcG9ydCBvbiBhdWRpbyB0aHJlYWQgPT4KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vIFN0b3AgLS0+IFNodXREb3duT25JT1RocmVhZCAtLS0tLS0tLT4gIENsb3NlU3RyZWFtIC0+IENsb3NlCi0vLwotLy8gVGhpcyBjbGFzcyB1dGlsaXplcyBzZXZlcmFsIHRocmVhZHMgZHVyaW5nIGl0cyBsaWZldGltZSwgbmFtZWx5OgotLy8gMS4gQ3JlYXRpbmcgdGhyZWFkLgotLy8gICAgTXVzdCBiZSB0aGUgbWFpbiByZW5kZXIgdGhyZWFkLgotLy8gMi4gQ29udHJvbCB0aHJlYWQgKG1heSBiZSB0aGUgbWFpbiByZW5kZXIgdGhyZWFkIG9yIGFub3RoZXIgdGhyZWFkKS4KLS8vICAgIFRoZSBtZXRob2RzOiBTdGFydCgpLCBTdG9wKCksIFBsYXkoKSwgUGF1c2UoKSwgU2V0Vm9sdW1lKCkKLS8vICAgIG11c3QgYmUgY2FsbGVkIG9uIHRoZSBzYW1lIHRocmVhZC4KLS8vIDMuIElPIHRocmVhZCAoaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsIC0gbm90IGV4cG9zZWQgdG8gcHVibGljIEFQSSkKLS8vICAgIFRoZSB0aHJlYWQgd2l0aGluIHdoaWNoIHRoaXMgY2xhc3MgcmVjZWl2ZXMgYWxsIHRoZSBJUEMgbWVzc2FnZXMgYW5kCi0vLyAgICBJUEMgY29tbXVuaWNhdGlvbnMgY2FuIG9ubHkgaGFwcGVuIGluIHRoaXMgdGhyZWFkLgotLy8gNC4gQXVkaW8gdHJhbnNwb3J0IHRocmVhZCAoU2VlIEF1ZGlvRGV2aWNlVGhyZWFkKS4KLS8vICAgIFJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIHRoZSBBdWRpb1RocmVhZENhbGxiYWNrIGltcGxlbWVudGF0aW9uIHRoYXQgaW4KLS8vICAgIHR1cm4gY2FsbHMgQXVkaW9SZW5kZXJlclNpbms6OlJlbmRlckNhbGxiYWNrIHdoaWNoIGZlZWRzIGF1ZGlvIHNhbXBsZXMgdG8KLS8vICAgIHRoZSBhdWRpbyBsYXllciBpbiB0aGUgYnJvd3NlciBwcm9jZXNzIHVzaW5nIHN5bmMgc29ja2V0cyBhbmQgc2hhcmVkCi0vLyAgICBtZW1vcnkuCi0vLwotLy8gSW1wbGVtZW50YXRpb24gbm90ZXM6Ci0vLyAtIFRoZSB1c2VyIG11c3QgY2FsbCBTdG9wKCkgYmVmb3JlIGRlbGV0aW5nIHRoZSBjbGFzcyBpbnN0YW5jZS4KLQotI2lmbmRlZiBNRURJQV9BVURJT19BVURJT19PVVRQVVRfREVWSUNFX0hfCi0jZGVmaW5lIE1FRElBX0FVRElPX0FVRElPX09VVFBVVF9ERVZJQ0VfSF8KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgotI2luY2x1ZGUgImJhc2Uvc2hhcmVkX21lbW9yeS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fZGV2aWNlX3RocmVhZC5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9pcGMuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19wYXJhbWV0ZXJzLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vc2NvcGVkX2xvb3Bfb2JzZXJ2ZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX3JlbmRlcmVyX3NpbmsuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgTUVESUFfRVhQT1JUIEF1ZGlvT3V0cHV0RGV2aWNlCi0gICAgOiBOT05fRVhQT1JURURfQkFTRShwdWJsaWMgQXVkaW9SZW5kZXJlclNpbmspLAotICAgICAgcHVibGljIEF1ZGlvT3V0cHV0SVBDRGVsZWdhdGUsCi0gICAgICBOT05fRVhQT1JURURfQkFTRShwdWJsaWMgU2NvcGVkTG9vcE9ic2VydmVyKSB7Ci0gcHVibGljOgotICAvLyBBdWRpb1JlbmRlcmVyU2luayBpbXBsZW1lbnRhdGlvbi4KLSAgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFJlbmRlckNhbGxiYWNrKiBjYWxsYmFjaykgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplSU8oY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0X2NoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbmRlckNhbGxiYWNrKiBjYWxsYmFjaykgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTdGFydCgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU3RvcCgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgUGxheSgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgUGF1c2UoYm9vbCBmbHVzaCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgYm9vbCBTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgT1ZFUlJJREU7Ci0KLSAgLy8gTWV0aG9kcyBjYWxsZWQgb24gSU8gdGhyZWFkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gQXVkaW9PdXRwdXRJUENEZWxlZ2F0ZSBtZXRob2RzLgotICB2aXJ0dWFsIHZvaWQgT25TdGF0ZUNoYW5nZWQoQXVkaW9PdXRwdXRJUENEZWxlZ2F0ZTo6U3RhdGUgc3RhdGUpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgT25TdHJlYW1DcmVhdGVkKGJhc2U6OlNoYXJlZE1lbW9yeUhhbmRsZSBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6U3luY1NvY2tldDo6SGFuZGxlIHNvY2tldF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBPbklQQ0Nsb3NlZCgpIE9WRVJSSURFOwotCi0gIC8vIENyZWF0ZXMgYW4gdW5pbml0aWFsaXplZCBBdWRpb091dHB1dERldmljZS4gQ2xpZW50cyBtdXN0IGNhbGwgSW5pdGlhbGl6ZSgpCi0gIC8vIGJlZm9yZSB1c2luZy4KLSAgQXVkaW9PdXRwdXREZXZpY2UoQXVkaW9PdXRwdXRJUEMqIGlwYywKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgaW9fbG9vcCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8vIE1hZ2ljIHJlcXVpcmVkIGJ5IHJlZl9jb3VudGVkLmggdG8gYXZvaWQgYW55IGNvZGUgZGVsZXRpbmcgdGhlIG9iamVjdAotICAvLyBhY2NpZGVudGFsbHkgd2hpbGUgdGhlcmUgYXJlIHJlZmVyZW5jZXMgdG8gaXQuCi0gIGZyaWVuZCBjbGFzcyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxBdWRpb091dHB1dERldmljZT47Ci0gIHZpcnR1YWwgfkF1ZGlvT3V0cHV0RGV2aWNlKCk7Ci0KLSAgLy8gQWNjZXNzb3JzIGZvciBzdWJjbGFzc2VzICh2aWEgSU8gdGhyZWFkIG9ubHkpLgotICBpbnQgc3RyZWFtX2lkKCkgY29uc3QgeyByZXR1cm4gc3RyZWFtX2lkXzsgfQotICBBdWRpb091dHB1dElQQyogYXVkaW9fb3V0cHV0X2lwYygpIGNvbnN0IHsgcmV0dXJuIGlwY187IH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vdGU6IFRoZSBvcmRlcmluZyBvZiBtZW1iZXJzIGluIHRoaXMgZW51bSBpcyBjcml0aWNhbCB0byBjb3JyZWN0IGJlaGF2aW9yIQotICBlbnVtIFN0YXRlIHsKLSAgICBJUENfQ0xPU0VELCAgLy8gTm8gbW9yZSBJUENzIGNhbiB0YWtlIHBsYWNlLgotICAgIElETEUsICAvLyBOb3Qgc3RhcnRlZC4KLSAgICBDUkVBVElOR19TVFJFQU0sICAvLyBXYWl0aW5nIGZvciBPblN0cmVhbUNyZWF0ZWQoKSB0byBiZSBjYWxsZWQgYmFjay4KLSAgICBQQVVTRUQsICAvLyBQYXVzZWQuICBPblN0cmVhbUNyZWF0ZWQoKSBoYXMgYmVlbiBjYWxsZWQuICBDYW4gUGxheSgpL1N0b3AoKS4KLSAgICBQTEFZSU5HLCAgLy8gUGxheWluZyBiYWNrLiAgQ2FuIFBhdXNlKCkvU3RvcCgpLgotICB9OwotCi0gIC8vIE1ldGhvZHMgY2FsbGVkIG9uIElPIHRocmVhZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgdGFza3MgcG9zdGVkIG9uIHRoZSBJTyB0aHJlYWQgdGhhdCBuZWVkcyB0bwotICAvLyBiZSBleGVjdXRlZCBvbiB0aGF0IHRocmVhZC4gVGhleSBpbnRlcmFjdCB3aXRoIEF1ZGlvTWVzc2FnZUZpbHRlciBhbmQKLSAgLy8gc2VuZHMgSVBDIG1lc3NhZ2VzIG9uIHRoYXQgdGhyZWFkLgotICB2b2lkIENyZWF0ZVN0cmVhbU9uSU9UaHJlYWQoY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXRfY2hhbm5lbHMpOwotICB2b2lkIFBsYXlPbklPVGhyZWFkKCk7Ci0gIHZvaWQgUGF1c2VPbklPVGhyZWFkKGJvb2wgZmx1c2gpOwotICB2b2lkIFNodXREb3duT25JT1RocmVhZCgpOwotICB2b2lkIFNldFZvbHVtZU9uSU9UaHJlYWQoZG91YmxlIHZvbHVtZSk7Ci0KLSAgLy8gTWVzc2FnZUxvb3A6OkRlc3RydWN0aW9uT2JzZXJ2ZXIgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBJTyBsb29wLgotICAvLyBJZiB0aGUgSU8gbG9vcCBkaWVzIGJlZm9yZSB3ZSBkbywgd2Ugc2h1dCBkb3duIHRoZSBhdWRpbyB0aHJlYWQgZnJvbSBoZXJlLgotICB2aXJ0dWFsIHZvaWQgV2lsbERlc3Ryb3lDdXJyZW50TWVzc2FnZUxvb3AoKSBPVkVSUklERTsKLQotICBBdWRpb1BhcmFtZXRlcnMgYXVkaW9fcGFyYW1ldGVyc187Ci0KLSAgLy8gVGhlIG51bWJlciBvZiBvcHRpb25hbCBzeW5jaHJvbml6ZWQgaW5wdXQgY2hhbm5lbHMgaGF2aW5nIHRoZSBzYW1lCi0gIC8vIHNhbXBsZS1yYXRlIGFuZCBidWZmZXItc2l6ZSBhcyBzcGVjaWZpZWQgaW4gYXVkaW9fcGFyYW1ldGVyc18uCi0gIGludCBpbnB1dF9jaGFubmVsc187Ci0KLSAgUmVuZGVyQ2FsbGJhY2sqIGNhbGxiYWNrXzsKLQotICAvLyBBIHBvaW50ZXIgdG8gdGhlIElQQyBsYXllciB0aGF0IHRha2VzIGNhcmUgb2Ygc2VuZGluZyByZXF1ZXN0cyBvdmVyIHRvCi0gIC8vIHRoZSBBdWRpb1JlbmRlcmVySG9zdC4KLSAgQXVkaW9PdXRwdXRJUEMqIGlwY187Ci0KLSAgLy8gT3VyIHN0cmVhbSBJRCBvbiB0aGUgbWVzc2FnZSBmaWx0ZXIuIE9ubHkgYWNjZXNzZWQgb24gdGhlIElPIHRocmVhZC4KLSAgLy8gTXVzdCBvbmx5IGJlIG1vZGlmaWVkIG9uIHRoZSBJTyB0aHJlYWQuCi0gIGludCBzdHJlYW1faWRfOwotCi0gIC8vIEN1cnJlbnQgc3RhdGUgKG11c3Qgb25seSBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBJTyB0aHJlYWQpLiAgU2VlIGNvbW1lbnRzIGZvcgotICAvLyBTdGF0ZSBlbnVtIGFib3ZlLgotICBTdGF0ZSBzdGF0ZV87Ci0KLSAgLy8gU3RhdGUgb2YgUGxheSgpIC8gUGF1c2UoKSBjYWxscyBiZWZvcmUgT25TdHJlYW1DcmVhdGVkKCkgaXMgY2FsbGVkLgotICBib29sIHBsYXlfb25fc3RhcnRfOwotCi0gIC8vIE91ciBhdWRpbyB0aHJlYWQgY2FsbGJhY2sgY2xhc3MuICBTZWUgc291cmNlIGZpbGUgZm9yIGRldGFpbHMuCi0gIGNsYXNzIEF1ZGlvVGhyZWFkQ2FsbGJhY2s7Ci0KLSAgLy8gSW4gb3JkZXIgdG8gYXZvaWQgYSByYWNlIGJldHdlZW4gT25TdHJlYW1DcmVhdGVkIGFuZCBTdG9wKCksIHdlIHVzZSB0aGlzCi0gIC8vIGd1YXJkIHRvIGNvbnRyb2wgc3RvcHBpbmcgYW5kIHN0YXJ0aW5nIHRoZSBhdWRpbyB0aHJlYWQuCi0gIGJhc2U6OkxvY2sgYXVkaW9fdGhyZWFkX2xvY2tfOwotICBBdWRpb0RldmljZVRocmVhZCBhdWRpb190aHJlYWRfOwotICBzY29wZWRfcHRyPEF1ZGlvT3V0cHV0RGV2aWNlOjpBdWRpb1RocmVhZENhbGxiYWNrPiBhdWRpb19jYWxsYmFja187Ci0KLSAgLy8gVGVtcG9yYXJ5IGhhY2sgdG8gaWdub3JlIE9uU3RyZWFtQ3JlYXRlZCgpIGR1ZSB0byB0aGUgdXNlciBjYWxsaW5nIFN0b3AoKQotICAvLyBzbyB3ZSBkb24ndCBzdGFydCB0aGUgYXVkaW8gdGhyZWFkIHBvaW50aW5nIHRvIGEgcG90ZW50aWFsbHkgZnJlZWQKLSAgLy8gfGNhbGxiYWNrX3wuCi0gIC8vCi0gIC8vIFRPRE8oc2NoZXJrdXMpOiBSZXBsYWNlIHRoaXMgYnkgY2hhbmdpbmcgQXVkaW9SZW5kZXJlclNpbmsgdG8gZWl0aGVyIGFjY2VwdAotICAvLyB0aGUgY2FsbGJhY2sgdmlhIFN0YXJ0KCkuIFNlZSBodHRwOi8vY3JidWcuY29tLzE1MTA1MSBmb3IgZGV0YWlscy4KLSAgYm9vbCBzdG9wcGluZ19oYWNrXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQXVkaW9PdXRwdXREZXZpY2UpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQVVESU9fQVVESU9fT1VUUFVUX0RFVklDRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9kZXZpY2VfdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fb3V0cHV0X2RldmljZV91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBlMmE0OS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fb3V0cHV0X2RldmljZV91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYmFzZS9hdF9leGl0LmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJiYXNlL3Byb2Nlc3NfdXRpbC5oIgotI2luY2x1ZGUgImJhc2Uvc2hhcmVkX21lbW9yeS5oIgotI2luY2x1ZGUgImJhc2Uvc3luY19zb2NrZXQuaCIKLSNpbmNsdWRlICJiYXNlL3Rlc3QvdGVzdF90aW1lb3V0cy5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9kZXZpY2UuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9zYW1wbGVfcmF0ZXMuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9zaGFyZWRfbWVtb3J5X3V0aWwuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrX211dGFudC5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi11c2luZyBiYXNlOjpDYW5jZWxhYmxlU3luY1NvY2tldDsKLXVzaW5nIGJhc2U6OlNoYXJlZE1lbW9yeTsKLXVzaW5nIGJhc2U6OlN5bmNTb2NrZXQ7Ci11c2luZyB0ZXN0aW5nOjpfOwotdXNpbmcgdGVzdGluZzo6RG9BbGw7Ci11c2luZyB0ZXN0aW5nOjpJbnZva2U7Ci11c2luZyB0ZXN0aW5nOjpSZXR1cm47Ci11c2luZyB0ZXN0aW5nOjpXaXRoQXJnczsKLXVzaW5nIHRlc3Rpbmc6OlN0cmljdE1vY2s7Ci11c2luZyB0ZXN0aW5nOjpWYWx1ZXM7Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vY2tSZW5kZXJDYWxsYmFjayA6IHB1YmxpYyBBdWRpb1JlbmRlcmVyU2luazo6UmVuZGVyQ2FsbGJhY2sgewotIHB1YmxpYzoKLSAgTW9ja1JlbmRlckNhbGxiYWNrKCkge30KLSAgdmlydHVhbCB+TW9ja1JlbmRlckNhbGxiYWNrKCkge30KLQotICBNT0NLX01FVEhPRDIoUmVuZGVyLCBpbnQoQXVkaW9CdXMqIGRlc3QsIGludCBhdWRpb19kZWxheV9taWxsaXNlY29uZHMpKTsKLSAgTU9DS19NRVRIT0QzKFJlbmRlcklPLCB2b2lkKEF1ZGlvQnVzKiBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1cyogZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb19kZWxheV9taWxsaXNlY29uZHMpKTsKLSAgTU9DS19NRVRIT0QwKE9uUmVuZGVyRXJyb3IsIHZvaWQoKSk7Ci19OwotCi1jbGFzcyBNb2NrQXVkaW9PdXRwdXRJUEMgOiBwdWJsaWMgQXVkaW9PdXRwdXRJUEMgewotIHB1YmxpYzoKLSAgTW9ja0F1ZGlvT3V0cHV0SVBDKCkge30KLSAgdmlydHVhbCB+TW9ja0F1ZGlvT3V0cHV0SVBDKCkge30KLQotICBNT0NLX01FVEhPRDEoQWRkRGVsZWdhdGUsIGludChBdWRpb091dHB1dElQQ0RlbGVnYXRlKiBkZWxlZ2F0ZSkpOwotICBNT0NLX01FVEhPRDEoUmVtb3ZlRGVsZWdhdGUsIHZvaWQoaW50IHN0cmVhbV9pZCkpOwotCi0gIE1PQ0tfTUVUSE9EMyhDcmVhdGVTdHJlYW0sCi0gICAgICB2b2lkKGludCBzdHJlYW1faWQsIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLCBpbnQgaW5wdXRfY2hhbm5lbHMpKTsKLSAgTU9DS19NRVRIT0QxKFBsYXlTdHJlYW0sIHZvaWQoaW50IHN0cmVhbV9pZCkpOwotICBNT0NLX01FVEhPRDEoQ2xvc2VTdHJlYW0sIHZvaWQoaW50IHN0cmVhbV9pZCkpOwotICBNT0NLX01FVEhPRDIoU2V0Vm9sdW1lLCB2b2lkKGludCBzdHJlYW1faWQsIGRvdWJsZSB2b2x1bWUpKTsKLSAgTU9DS19NRVRIT0QxKFBhdXNlU3RyZWFtLCB2b2lkKGludCBzdHJlYW1faWQpKTsKLSAgTU9DS19NRVRIT0QxKEZsdXNoU3RyZWFtLCB2b2lkKGludCBzdHJlYW1faWQpKTsKLX07Ci0KLS8vIENyZWF0ZXMgYSBjb3B5IG9mIGEgU3luY1NvY2tldCBoYW5kbGUgdGhhdCB3ZSBjYW4gZ2l2ZSB0byBBdWRpb091dHB1dERldmljZS4KLS8vIE9uIFdpbmRvd3MgdGhpcyBtZWFucyBkdXBsaWNhdGluZyB0aGUgcGlwZSBoYW5kbGUgc28gdGhhdCBBdWRpb091dHB1dERldmljZQotLy8gY2FuIGNhbGwgQ2xvc2VIYW5kbGUoKSAoc2luY2Ugb3duZXJzaGlwIGhhcyBiZWVuIHRyYW5zZmVycmVkKSwgYnV0IG9uIG90aGVyCi0vLyBwbGF0Zm9ybXMsIHdlIGp1c3QgY29weSB0aGUgc2FtZSBzb2NrZXQgaGFuZGxlIHNpbmNlIEF1ZGlvT3V0cHV0RGV2aWNlIG9uCi0vLyB0aG9zZSBwbGF0Zm9ybXMgd29uJ3QgYWN0dWFsbHkgb3duIHRoZSBzb2NrZXQgKEZpbGVEZXNjcmlwdG9yLmF1dG9fY2xvc2UgaXMKLS8vIGZhbHNlKS4KLWJvb2wgRHVwbGljYXRlU29ja2V0SGFuZGxlKFN5bmNTb2NrZXQ6OkhhbmRsZSBzb2NrZXRfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU3luY1NvY2tldDo6SGFuZGxlKiBjb3B5KSB7Ci0jaWYgZGVmaW5lZChPU19XSU4pCi0gIEhBTkRMRSBwcm9jZXNzID0gR2V0Q3VycmVudFByb2Nlc3MoKTsKLSAgOjpEdXBsaWNhdGVIYW5kbGUocHJvY2Vzcywgc29ja2V0X2hhbmRsZSwgcHJvY2VzcywgY29weSwKLSAgICAgICAgICAgICAgICAgICAgMCwgRkFMU0UsIERVUExJQ0FURV9TQU1FX0FDQ0VTUyk7Ci0gIHJldHVybiAqY29weSAhPSBOVUxMOwotI2Vsc2UKLSAgKmNvcHkgPSBzb2NrZXRfaGFuZGxlOwotICByZXR1cm4gKmNvcHkgIT0gLTE7Ci0jZW5kaWYKLX0KLQotQUNUSU9OX1AyKFNlbmRQZW5kaW5nQnl0ZXMsIHNvY2tldCwgcGVuZGluZ19ieXRlcykgewotICBzb2NrZXQtPlNlbmQoJnBlbmRpbmdfYnl0ZXMsIHNpemVvZihwZW5kaW5nX2J5dGVzKSk7Ci19Ci0KLS8vIFVzZWQgdG8gdGVybWluYXRlIGEgbG9vcCBmcm9tIGEgZGlmZmVyZW50IHRocmVhZCB0aGFuIHRoZSBsb29wIGJlbG9uZ3MgdG8uCi0vLyB8bG9vcHwgc2hvdWxkIGJlIGEgTWVzc2FnZUxvb3BQcm94eS4KLUFDVElPTl9QKFF1aXRMb29wLCBsb29wKSB7Ci0gIGxvb3AtPlBvc3RUYXNrKEZST01fSEVSRSwgTWVzc2FnZUxvb3A6OlF1aXRDbG9zdXJlKCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UuCi0KLWNsYXNzIEF1ZGlvT3V0cHV0RGV2aWNlVGVzdAotICAgIDogcHVibGljIHRlc3Rpbmc6OlRlc3QsCi0gICAgICBwdWJsaWMgdGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPGJvb2w+IHsKLSBwdWJsaWM6Ci0gIEF1ZGlvT3V0cHV0RGV2aWNlVGVzdCgpOwotICB+QXVkaW9PdXRwdXREZXZpY2VUZXN0KCk7Ci0KLSAgdm9pZCBTdGFydEF1ZGlvRGV2aWNlKCk7Ci0gIHZvaWQgQ3JlYXRlU3RyZWFtKCk7Ci0gIHZvaWQgRXhwZWN0UmVuZGVyQ2FsbGJhY2soKTsKLSAgdm9pZCBXYWl0VW50aWxSZW5kZXJDYWxsYmFjaygpOwotICB2b2lkIFN0b3BBdWRpb0RldmljZSgpOwotCi0gcHJvdGVjdGVkOgotICAvLyBVc2VkIHRvIGNsZWFuIHVwIFRMUyBwb2ludGVycyB0aGF0IHRoZSB0ZXN0KHMpIHdpbGwgaW5pdGlhbGl6ZS4KLSAgLy8gTXVzdCByZW1haW4gdGhlIGZpcnN0IG1lbWJlciBvZiB0aGlzIGNsYXNzLgotICBiYXNlOjpTaGFkb3dpbmdBdEV4aXRNYW5hZ2VyIGF0X2V4aXRfbWFuYWdlcl87Ci0gIE1lc3NhZ2VMb29wRm9ySU8gaW9fbG9vcF87Ci0gIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyBkZWZhdWx0X2F1ZGlvX3BhcmFtZXRlcnNfOwotICBTdHJpY3RNb2NrPE1vY2tSZW5kZXJDYWxsYmFjaz4gY2FsbGJhY2tfOwotICBTdHJpY3RNb2NrPE1vY2tBdWRpb091dHB1dElQQz4gYXVkaW9fb3V0cHV0X2lwY187Ci0gIHNjb3BlZF9yZWZwdHI8QXVkaW9PdXRwdXREZXZpY2U+IGF1ZGlvX2RldmljZV87Ci0KLSBwcml2YXRlOgotICBpbnQgQ2FsY3VsYXRlTWVtb3J5U2l6ZSgpOwotCi0gIGNvbnN0IGJvb2wgc3luY2hyb25pemVkX2lvXzsKLSAgY29uc3QgaW50IGlucHV0X2NoYW5uZWxzXzsKLSAgU2hhcmVkTWVtb3J5IHNoYXJlZF9tZW1vcnlfOwotICBDYW5jZWxhYmxlU3luY1NvY2tldCBicm93c2VyX3NvY2tldF87Ci0gIENhbmNlbGFibGVTeW5jU29ja2V0IHJlbmRlcmVyX3NvY2tldF87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEF1ZGlvT3V0cHV0RGV2aWNlVGVzdCk7Ci19OwotCi1zdGF0aWMgY29uc3QgaW50IGtTdHJlYW1JZCA9IDEyMzsKLQotaW50IEF1ZGlvT3V0cHV0RGV2aWNlVGVzdDo6Q2FsY3VsYXRlTWVtb3J5U2l6ZSgpIHsKLSAgLy8gQ2FsY3VsYXRlIG91dHB1dCBhbmQgaW5wdXQgbWVtb3J5IHNpemUuCi0gIGludCBvdXRwdXRfbWVtb3J5X3NpemUgPQotICAgICAgQXVkaW9CdXM6OkNhbGN1bGF0ZU1lbW9yeVNpemUoZGVmYXVsdF9hdWRpb19wYXJhbWV0ZXJzXyk7Ci0KLSAgaW50IGZyYW1lcyA9IGRlZmF1bHRfYXVkaW9fcGFyYW1ldGVyc18uZnJhbWVzX3Blcl9idWZmZXIoKTsKLSAgaW50IGlucHV0X21lbW9yeV9zaXplID0KLSAgICAgIEF1ZGlvQnVzOjpDYWxjdWxhdGVNZW1vcnlTaXplKGlucHV0X2NoYW5uZWxzXywgZnJhbWVzKTsKLQotICBpbnQgaW9fYnVmZmVyX3NpemUgPSBvdXRwdXRfbWVtb3J5X3NpemUgKyBpbnB1dF9tZW1vcnlfc2l6ZTsKLQotICAvLyBUaGlzIGlzIHdoZXJlIGl0IGdldHMgYSBiaXQgaGFja3kuICBUaGUgc2hhcmVkIG1lbW9yeSBjb250cmFjdCBiZXR3ZWVuCi0gIC8vIEF1ZGlvT3V0cHV0RGV2aWNlIGFuZCBpdHMgYnJvd3NlciBzaWRlIGNvdW50ZXIgcGFydCBpbmNsdWRlcyBhIGJpdCBtb3JlCi0gIC8vIHRoYW4ganVzdCB0aGUgYXVkaW8gZGF0YSwgc28gd2UgbXVzdCBjYWxsIFRvdGFsU2hhcmVkTWVtb3J5U2l6ZUluQnl0ZXMoKQotICAvLyB0byBnZXQgdGhlIGFjdHVhbCBzaXplIG5lZWRlZCB0byBmaXQgdGhlIGF1ZGlvIGRhdGEgcGx1cyB0aGUgZXh0cmEgZGF0YS4KLSAgcmV0dXJuIFRvdGFsU2hhcmVkTWVtb3J5U2l6ZUluQnl0ZXMoaW9fYnVmZmVyX3NpemUpOwotfQotCi1BdWRpb091dHB1dERldmljZVRlc3Q6OkF1ZGlvT3V0cHV0RGV2aWNlVGVzdCgpCi0gICAgOiBkZWZhdWx0X2F1ZGlvX3BhcmFtZXRlcnNfKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xJTkVBUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9MQVlPVVRfU1RFUkVPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAwMCwgMTYsIDEwMjQpLAotICAgICAgc3luY2hyb25pemVkX2lvXyhHZXRQYXJhbSgpKSwKLSAgICAgIGlucHV0X2NoYW5uZWxzXyhzeW5jaHJvbml6ZWRfaW9fID8gMiA6IDApIHsKLSAgRVhQRUNUX0NBTEwoYXVkaW9fb3V0cHV0X2lwY18sIEFkZERlbGVnYXRlKF8pKQotICAgICAgLldpbGxPbmNlKFJldHVybihrU3RyZWFtSWQpKTsKLQotICBhdWRpb19kZXZpY2VfID0gbmV3IEF1ZGlvT3V0cHV0RGV2aWNlKAotICAgICAgJmF1ZGlvX291dHB1dF9pcGNfLCBpb19sb29wXy5tZXNzYWdlX2xvb3BfcHJveHkoKSk7Ci0KLSAgaWYgKHN5bmNocm9uaXplZF9pb18pIHsKLSAgICBhdWRpb19kZXZpY2VfLT5Jbml0aWFsaXplSU8oZGVmYXVsdF9hdWRpb19wYXJhbWV0ZXJzXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfY2hhbm5lbHNfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FsbGJhY2tfKTsKLSAgfSBlbHNlIHsKLSAgICBhdWRpb19kZXZpY2VfLT5Jbml0aWFsaXplKGRlZmF1bHRfYXVkaW9fcGFyYW1ldGVyc18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FsbGJhY2tfKTsKLSAgfQotICBpb19sb29wXy5SdW5VbnRpbElkbGUoKTsKLX0KLQotQXVkaW9PdXRwdXREZXZpY2VUZXN0Ojp+QXVkaW9PdXRwdXREZXZpY2VUZXN0KCkgewotICBFWFBFQ1RfQ0FMTChhdWRpb19vdXRwdXRfaXBjXywgUmVtb3ZlRGVsZWdhdGUoa1N0cmVhbUlkKSk7Ci0KLSAgYXVkaW9fZGV2aWNlXyA9IE5VTEw7Ci19Ci0KLXZvaWQgQXVkaW9PdXRwdXREZXZpY2VUZXN0OjpTdGFydEF1ZGlvRGV2aWNlKCkgewotICBhdWRpb19kZXZpY2VfLT5TdGFydCgpOwotCi0gIEVYUEVDVF9DQUxMKGF1ZGlvX291dHB1dF9pcGNfLCBDcmVhdGVTdHJlYW0oa1N0cmVhbUlkLCBfLCBfKSk7Ci0KLSAgaW9fbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci19Ci0KLXZvaWQgQXVkaW9PdXRwdXREZXZpY2VUZXN0OjpDcmVhdGVTdHJlYW0oKSB7Ci0gIGNvbnN0IGludCBrTWVtb3J5U2l6ZSA9IENhbGN1bGF0ZU1lbW9yeVNpemUoKTsKLQotICBBU1NFUlRfVFJVRShzaGFyZWRfbWVtb3J5Xy5DcmVhdGVBbmRNYXBBbm9ueW1vdXMoa01lbW9yeVNpemUpKTsKLSAgbWVtc2V0KHNoYXJlZF9tZW1vcnlfLm1lbW9yeSgpLCAweGZmLCBrTWVtb3J5U2l6ZSk7Ci0KLSAgQVNTRVJUX1RSVUUoQ2FuY2VsYWJsZVN5bmNTb2NrZXQ6OkNyZWF0ZVBhaXIoJmJyb3dzZXJfc29ja2V0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlbmRlcmVyX3NvY2tldF8pKTsKLQotICAvLyBDcmVhdGUgZHVwbGljYXRlcyBvZiB0aGUgaGFuZGxlcyB3ZSBwYXNzIHRvIEF1ZGlvT3V0cHV0RGV2aWNlIHNpbmNlCi0gIC8vIG93bmVyc2hpcCB3aWxsIGJlIHRyYW5zZmVycmVkIGFuZCBBdWRpb091dHB1dERldmljZSBpcyByZXNwb25zaWJsZSBmb3IKLSAgLy8gZnJlZWluZy4KLSAgU3luY1NvY2tldDo6SGFuZGxlIGF1ZGlvX2RldmljZV9zb2NrZXQgPSBTeW5jU29ja2V0OjprSW52YWxpZEhhbmRsZTsKLSAgQVNTRVJUX1RSVUUoRHVwbGljYXRlU29ja2V0SGFuZGxlKHJlbmRlcmVyX3NvY2tldF8uaGFuZGxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXVkaW9fZGV2aWNlX3NvY2tldCkpOwotICBiYXNlOjpTaGFyZWRNZW1vcnlIYW5kbGUgZHVwbGljYXRlZF9tZW1vcnlfaGFuZGxlOwotICBBU1NFUlRfVFJVRShzaGFyZWRfbWVtb3J5Xy5TaGFyZVRvUHJvY2VzcyhiYXNlOjpHZXRDdXJyZW50UHJvY2Vzc0hhbmRsZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVwbGljYXRlZF9tZW1vcnlfaGFuZGxlKSk7Ci0KLSAgYXVkaW9fZGV2aWNlXy0+T25TdHJlYW1DcmVhdGVkKGR1cGxpY2F0ZWRfbWVtb3J5X2hhbmRsZSwgYXVkaW9fZGV2aWNlX3NvY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tldFNpemVJbkJ5dGVzKGtNZW1vcnlTaXplKSk7Ci0gIGlvX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotfQotCi12b2lkIEF1ZGlvT3V0cHV0RGV2aWNlVGVzdDo6RXhwZWN0UmVuZGVyQ2FsbGJhY2soKSB7Ci0gIC8vIFdlIHNob3VsZCBnZXQgYSAncGxheScgbm90aWZpY2F0aW9uIHdoZW4gd2UgY2FsbCBPblN0cmVhbUNyZWF0ZWQoKS4KLSAgLy8gUmVzcG9uZCBieSBhc2tpbmcgZm9yIHNvbWUgYXVkaW8gZGF0YS4gIFRoaXMgc2hvdWxkIGFzayBvdXIgY2FsbGJhY2sKLSAgLy8gdG8gcHJvdmlkZSBzb21lIGF1ZGlvIGRhdGEgdGhhdCBBdWRpb091dHB1dERldmljZSB0aGVuIHdyaXRlcyBpbnRvIHRoZQotICAvLyBzaGFyZWQgbWVtb3J5IHNlY3Rpb24uCi0gIGNvbnN0IGludCBrTWVtb3J5U2l6ZSA9IENhbGN1bGF0ZU1lbW9yeVNpemUoKTsKLQotICBFWFBFQ1RfQ0FMTChhdWRpb19vdXRwdXRfaXBjXywgUGxheVN0cmVhbShrU3RyZWFtSWQpKQotICAgICAgLldpbGxPbmNlKFNlbmRQZW5kaW5nQnl0ZXMoJmJyb3dzZXJfc29ja2V0Xywga01lbW9yeVNpemUpKTsKLQotICAvLyBXZSBleHBlY3QgY2FsbHMgdG8gb3VyIGF1ZGlvIHJlbmRlcmVyIGNhbGxiYWNrLCB3aGljaCByZXR1cm5zIHRoZSBudW1iZXIKLSAgLy8gb2YgZnJhbWVzIHdyaXR0ZW4gdG8gdGhlIG1lbW9yeSBzZWN0aW9uLgotICAvLyBIZXJlJ3MgdGhlIHNlY29uZCBwbGFjZSB3aGVyZSBpdCBnZXRzIGhhY2t5OiAgVGhlcmUncyBubyB3YXkgZm9yIHVzIHRvCi0gIC8vIGtub3cgKHdpdGhvdXQgdXNpbmcgYSBzbGVlcCBsb29wISkgd2hlbiB0aGUgQXVkaW9PdXRwdXREZXZpY2UgaGFzIGZpbmlzaGVkCi0gIC8vIHdyaXRpbmcgdGhlIGludGVybGVhdmVkIGF1ZGlvIGRhdGEgaW50byB0aGUgc2hhcmVkIG1lbW9yeSBzZWN0aW9uLgotICAvLyBTbywgZm9yIHRoZSBzYWtlIG9mIHRoaXMgdGVzdCwgd2UgY29uc2lkZXIgdGhlIGNhbGwgdG8gUmVuZGVyIGEgc2lnbgotICAvLyBvZiBzdWNjZXNzIGFuZCBxdWl0IHRoZSBsb29wLgotICBpZiAoc3luY2hyb25pemVkX2lvXykgewotICAgIC8vIEZvciBzeW5jaHJvbml6ZWQgSS9PLCB3ZSBleHBlY3QgUmVuZGVySU8oKS4KLSAgICBFWFBFQ1RfQ0FMTChjYWxsYmFja18sIFJlbmRlcklPKF8sIF8sIF8pKQotICAgICAgICAuV2lsbE9uY2UoUXVpdExvb3AoaW9fbG9vcF8ubWVzc2FnZV9sb29wX3Byb3h5KCkpKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBGb3Igb3V0cHV0IG9ubHkgd2UgZXhwZWN0IFJlbmRlcigpLgotICAgIGNvbnN0IGludCBrTnVtYmVyT2ZGcmFtZXNUb1Byb2Nlc3MgPSAwOwotICAgIEVYUEVDVF9DQUxMKGNhbGxiYWNrXywgUmVuZGVyKF8sIF8pKQotICAgICAgICAuV2lsbE9uY2UoRG9BbGwoCi0gICAgICAgICAgICBRdWl0TG9vcChpb19sb29wXy5tZXNzYWdlX2xvb3BfcHJveHkoKSksCi0gICAgICAgICAgICBSZXR1cm4oa051bWJlck9mRnJhbWVzVG9Qcm9jZXNzKSkpOwotICB9Ci19Ci0KLXZvaWQgQXVkaW9PdXRwdXREZXZpY2VUZXN0OjpXYWl0VW50aWxSZW5kZXJDYWxsYmFjaygpIHsKLSAgLy8gRG9uJ3QgaGFuZyB0aGUgdGVzdCBpZiB3ZSBuZXZlciBnZXQgdGhlIFJlbmRlcigpIGNhbGxiYWNrLgotICBpb19sb29wXy5Qb3N0RGVsYXllZFRhc2soRlJPTV9IRVJFLCBNZXNzYWdlTG9vcDo6UXVpdENsb3N1cmUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RUaW1lb3V0czo6YWN0aW9uX3RpbWVvdXQoKSk7Ci0gIGlvX2xvb3BfLlJ1bigpOwotfQotCi12b2lkIEF1ZGlvT3V0cHV0RGV2aWNlVGVzdDo6U3RvcEF1ZGlvRGV2aWNlKCkgewotICBhdWRpb19kZXZpY2VfLT5TdG9wKCk7Ci0KLSAgRVhQRUNUX0NBTEwoYXVkaW9fb3V0cHV0X2lwY18sIENsb3NlU3RyZWFtKGtTdHJlYW1JZCkpOwotCi0gIGlvX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotfQotCi1URVNUX1AoQXVkaW9PdXRwdXREZXZpY2VUZXN0LCBJbml0aWFsaXplKSB7Ci0gIC8vIFRlc3RzIHRoYXQgdGhlIG9iamVjdCBjYW4gYmUgY29uc3RydWN0ZWQsIGluaXRpYWxpemVkIGFuZCBkZXN0cnVjdGVkCi0gIC8vIHdpdGhvdXQgaGF2aW5nIGV2ZXIgYmVlbiBzdGFydGVkL3N0b3BwZWQuCi19Ci0KLS8vIENhbGxzIFN0YXJ0KCkgZm9sbG93ZWQgYnkgYW4gaW1tZWRpYXRlIFN0b3AoKSBhbmQgY2hlY2sgZm9yIHRoZSBiYXNpYyBtZXNzYWdlCi0vLyBmaWx0ZXIgbWVzc2FnZXMgYmVpbmcgc2VudCBpbiB0aGF0IGNhc2UuCi1URVNUX1AoQXVkaW9PdXRwdXREZXZpY2VUZXN0LCBTdGFydFN0b3ApIHsKLSAgU3RhcnRBdWRpb0RldmljZSgpOwotICBTdG9wQXVkaW9EZXZpY2UoKTsKLX0KLQotLy8gQXVkaW9PdXRwdXREZXZpY2Ugc3VwcG9ydHMgbXVsdGlwbGUgc3RhcnQvc3RvcCBzZXF1ZW5jZXMuCi1URVNUX1AoQXVkaW9PdXRwdXREZXZpY2VUZXN0LCBTdGFydFN0b3BTdGFydFN0b3ApIHsKLSAgU3RhcnRBdWRpb0RldmljZSgpOwotICBTdG9wQXVkaW9EZXZpY2UoKTsKLSAgU3RhcnRBdWRpb0RldmljZSgpOwotICBTdG9wQXVkaW9EZXZpY2UoKTsKLX0KLQotLy8gU2ltdWxhdGUgcmVjZWl2aW5nIE9uU3RyZWFtQ3JlYXRlZCgpIHByaW9yIHRvIHByb2Nlc3NpbmcgU2h1dERvd25PbklPVGhyZWFkKCkKLS8vIG9uIHRoZSBJTyBsb29wLgotVEVTVF9QKEF1ZGlvT3V0cHV0RGV2aWNlVGVzdCwgU3RvcEJlZm9yZVJlbmRlcikgewotICBTdGFydEF1ZGlvRGV2aWNlKCk7Ci0KLSAgLy8gQ2FsbCBTdG9wKCkgYnV0IGRvbid0IHJ1biB0aGUgSU8gbG9vcCB5ZXQuCi0gIGF1ZGlvX2RldmljZV8tPlN0b3AoKTsKLQotICAvLyBFeHBlY3QgdXMgdG8gc2h1dGRvd24gSVBDIGJ1dCBub3QgdG8gcmVuZGVyIGFueXRoaW5nIGRlc3BpdGUgdGhlIHN0cmVhbQotICAvLyBnZXR0aW5nIGNyZWF0ZWQuCi0gIEVYUEVDVF9DQUxMKGF1ZGlvX291dHB1dF9pcGNfLCBDbG9zZVN0cmVhbShrU3RyZWFtSWQpKTsKLSAgQ3JlYXRlU3RyZWFtKCk7Ci19Ci0KLS8vIEZ1bGwgdGVzdCB3aXRoIG91dHB1dCBvbmx5LgotVEVTVF9QKEF1ZGlvT3V0cHV0RGV2aWNlVGVzdCwgQ3JlYXRlU3RyZWFtKSB7Ci0gIFN0YXJ0QXVkaW9EZXZpY2UoKTsKLSAgRXhwZWN0UmVuZGVyQ2FsbGJhY2soKTsKLSAgQ3JlYXRlU3RyZWFtKCk7Ci0gIFdhaXRVbnRpbFJlbmRlckNhbGxiYWNrKCk7Ci0gIFN0b3BBdWRpb0RldmljZSgpOwotfQotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChSZW5kZXIsIEF1ZGlvT3V0cHV0RGV2aWNlVGVzdCwgVmFsdWVzKGZhbHNlKSk7Ci1JTlNUQU5USUFURV9URVNUX0NBU0VfUChSZW5kZXJJTywgQXVkaW9PdXRwdXREZXZpY2VUZXN0LCBWYWx1ZXModHJ1ZSkpOwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEuCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fb3V0cHV0X2Rpc3BhdGNoZXIuY2MgYi9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fb3V0cHV0X2Rpc3BhdGNoZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZDNmYjguLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9kaXNwYXRjaGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9kaXNwYXRjaGVyLmgiCi0KLSNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1BdWRpb091dHB1dERpc3BhdGNoZXI6OkF1ZGlvT3V0cHV0RGlzcGF0Y2hlcigKLSAgICBBdWRpb01hbmFnZXIqIGF1ZGlvX21hbmFnZXIsCi0gICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpCi0gICAgOiBhdWRpb19tYW5hZ2VyXyhhdWRpb19tYW5hZ2VyKSwKLSAgICAgIG1lc3NhZ2VfbG9vcF8oTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSksCi0gICAgICBwYXJhbXNfKHBhcmFtcykgewotICAvLyBXZSBleHBlY3QgdG8gYmUgaW5zdGFudGlhdGVkIG9uIHRoZSBhdWRpbyB0aHJlYWQuICBPdGhlcndpc2UgdGhlCi0gIC8vIG1lc3NhZ2VfbG9vcF8gbWVtYmVyIHdpbGwgcG9pbnQgdG8gdGhlIHdyb25nIG1lc3NhZ2UgbG9vcCEKLSAgRENIRUNLKGF1ZGlvX21hbmFnZXItPkdldE1lc3NhZ2VMb29wKCktPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci19Ci0KLUF1ZGlvT3V0cHV0RGlzcGF0Y2hlcjo6fkF1ZGlvT3V0cHV0RGlzcGF0Y2hlcigpIHsKLSAgRENIRUNLX0VRKE1lc3NhZ2VMb29wOjpjdXJyZW50KCksIG1lc3NhZ2VfbG9vcF8pOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb19vdXRwdXRfZGlzcGF0Y2hlci5oIGIvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9kaXNwYXRjaGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmOGQ4NmUuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9kaXNwYXRjaGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBBdWRpb091dHB1dERpc3BhdGNoZXIgaXMgYSBzaW5nbGUtdGhyZWFkZWQgYmFzZSBjbGFzcyB0aGF0IGRpc3BhdGNoZXMKLS8vIGNyZWF0aW9uIGFuZCBkZWxldGlvbiBvZiBhdWRpbyBvdXRwdXQgc3RyZWFtcy4gQXVkaW9PdXRwdXRQcm94eSBvYmplY3RzIHVzZQotLy8gdGhpcyBjbGFzcyB0byBhbGxvY2F0ZSBhbmQgcmVjeWNsZSBhY3R1YWwgYXVkaW8gb3V0cHV0IHN0cmVhbXMuIFdoZW4gcGxheWJhY2sKLS8vIGlzIHN0YXJ0ZWQsIHRoZSBwcm94eSBjYWxscyBTdGFydFN0cmVhbSgpIHRvIGdldCBhbiBvdXRwdXQgc3RyZWFtIHRoYXQgaXQKLS8vIHVzZXMgdG8gcGxheSBhdWRpby4gV2hlbiBwbGF5YmFjayBpcyBzdG9wcGVkLCB0aGUgcHJveHkgcmV0dXJucyB0aGUgc3RyZWFtCi0vLyBiYWNrIHRvIHRoZSBkaXNwYXRjaGVyIGJ5IGNhbGxpbmcgU3RvcFN0cmVhbSgpLgotLy8KLS8vIEF1ZGlvTWFuYWdlckJhc2UgY3JlYXRlcyBvbmUgc3BlY2lhbGl6YXRpb24gb2YgQXVkaW9PdXRwdXREaXNwYXRjaGVyIG9uIHRoZQotLy8gYXVkaW8gdGhyZWFkIGZvciBlYWNoIHBvc3NpYmxlIHNldCBvZiBhdWRpbyBwYXJhbWV0ZXJzLiBJLmUgc3RyZWFtcyB3aXRoCi0vLyBkaWZmZXJlbnQgcGFyYW1ldGVycyBhcmUgbWFuYWdlZCBpbmRlcGVuZGVudGx5LiAgVGhlIEF1ZGlvT3V0cHV0RGlzcGF0Y2hlcgotLy8gaW5zdGFuY2UgaXMgdGhlbiBkZWxldGVkIG9uIHRoZSBhdWRpbyB0aHJlYWQgd2hlbiB0aGUgQXVkaW9NYW5hZ2VyIHNodXRzCi0vLyBkb3duLgotCi0jaWZuZGVmIE1FRElBX0FVRElPX0FVRElPX09VVFBVVF9ESVNQQVRDSEVSX0hfCi0jZGVmaW5lIE1FRElBX0FVRElPX0FVRElPX09VVFBVVF9ESVNQQVRDSEVSX0hfCi0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGltZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19pby5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX21hbmFnZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19wYXJhbWV0ZXJzLmgiCi0KLWNsYXNzIE1lc3NhZ2VMb29wOwotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBBdWRpb091dHB1dFByb3h5OwotCi1jbGFzcyBNRURJQV9FWFBPUlQgQXVkaW9PdXRwdXREaXNwYXRjaGVyCi0gICAgOiBwdWJsaWMgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8QXVkaW9PdXRwdXREaXNwYXRjaGVyPiB7Ci0gcHVibGljOgotICBBdWRpb091dHB1dERpc3BhdGNoZXIoQXVkaW9NYW5hZ2VyKiBhdWRpb19tYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpOwotCi0gIC8vIENhbGxlZCBieSBBdWRpb091dHB1dFByb3h5IHRvIG9wZW4gdGhlIHN0cmVhbS4KLSAgLy8gUmV0dXJucyBmYWxzZSwgaWYgaXQgZmFpbHMgdG8gb3BlbiBpdC4KLSAgdmlydHVhbCBib29sIE9wZW5TdHJlYW0oKSA9IDA7Ci0KLSAgLy8gQ2FsbGVkIGJ5IEF1ZGlvT3V0cHV0UHJveHkgd2hlbiB0aGUgc3RyZWFtIGlzIHN0YXJ0ZWQuCi0gIC8vIFVzZXMgfGNhbGxiYWNrfCB0byBnZXQgc291cmNlIGRhdGEgYW5kIHJlcG9ydCBlcnJvcnMsIGlmIGFueS4KLSAgLy8gRG9lcyAqbm90KiB0YWtlIG93bmVyc2hpcCBvZiB0aGlzIGNhbGxiYWNrLgotICAvLyBSZXR1cm5zIHRydWUgaWYgc3RhcnRlZCBzdWNjZXNzZnVsbHksIGZhbHNlIG90aGVyd2lzZS4KLSAgdmlydHVhbCBib29sIFN0YXJ0U3RyZWFtKEF1ZGlvT3V0cHV0U3RyZWFtOjpBdWRpb1NvdXJjZUNhbGxiYWNrKiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvT3V0cHV0UHJveHkqIHN0cmVhbV9wcm94eSkgPSAwOwotCi0gIC8vIENhbGxlZCBieSBBdWRpb091dHB1dFByb3h5IHdoZW4gdGhlIHN0cmVhbSBpcyBzdG9wcGVkLgotICAvLyBPd25lcnNoaXAgb2YgdGhlIHxzdHJlYW1fcHJveHl8IGlzIHBhc3NlZCB0byB0aGUgZGlzcGF0Y2hlci4KLSAgdmlydHVhbCB2b2lkIFN0b3BTdHJlYW0oQXVkaW9PdXRwdXRQcm94eSogc3RyZWFtX3Byb3h5KSA9IDA7Ci0KLSAgLy8gQ2FsbGVkIGJ5IEF1ZGlvT3V0cHV0UHJveHkgd2hlbiB0aGUgdm9sdW1lIGlzIHNldC4KLSAgdmlydHVhbCB2b2lkIFN0cmVhbVZvbHVtZVNldChBdWRpb091dHB1dFByb3h5KiBzdHJlYW1fcHJveHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZvbHVtZSkgPSAwOwotCi0gIC8vIENhbGxlZCBieSBBdWRpb091dHB1dFByb3h5IHdoZW4gdGhlIHN0cmVhbSBpcyBjbG9zZWQuCi0gIHZpcnR1YWwgdm9pZCBDbG9zZVN0cmVhbShBdWRpb091dHB1dFByb3h5KiBzdHJlYW1fcHJveHkpID0gMDsKLQotICAvLyBDYWxsZWQgb24gdGhlIGF1ZGlvIHRocmVhZCB3aGVuIHRoZSBBdWRpb01hbmFnZXIgaXMgc2h1dHRpbmcgZG93bi4KLSAgdmlydHVhbCB2b2lkIFNodXRkb3duKCkgPSAwOwotCi0gcHJvdGVjdGVkOgotICBmcmllbmQgY2xhc3MgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8QXVkaW9PdXRwdXREaXNwYXRjaGVyPjsKLSAgZnJpZW5kIGNsYXNzIEF1ZGlvT3V0cHV0UHJveHlUZXN0OwotCi0gIHZpcnR1YWwgfkF1ZGlvT3V0cHV0RGlzcGF0Y2hlcigpOwotCi0gIC8vIEEgbm8tcmVmZXJlbmNlLWhlbGQgcG9pbnRlciAod2UgZG9uJ3Qgd2FudCBjaXJjdWxhciByZWZlcmVuY2VzKSBiYWNrIHRvIHRoZQotICAvLyBBdWRpb01hbmFnZXIgdGhhdCBvd25zIHRoaXMgb2JqZWN0LgotICBBdWRpb01hbmFnZXIqIGF1ZGlvX21hbmFnZXJfOwotICBNZXNzYWdlTG9vcCogbWVzc2FnZV9sb29wXzsKLSAgQXVkaW9QYXJhbWV0ZXJzIHBhcmFtc187Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQXVkaW9PdXRwdXREaXNwYXRjaGVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0FVRElPX0FVRElPX09VVFBVVF9ESVNQQVRDSEVSX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fb3V0cHV0X2Rpc3BhdGNoZXJfaW1wbC5jYyBiL3NyYy9tZWRpYS9hdWRpby9hdWRpb19vdXRwdXRfZGlzcGF0Y2hlcl9pbXBsLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjU0Mjc4Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb19vdXRwdXRfZGlzcGF0Y2hlcl9pbXBsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19vdXRwdXRfZGlzcGF0Y2hlcl9pbXBsLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJiYXNlL3RpbWUuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19pby5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9wcm94eS5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3V0aWwuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotQXVkaW9PdXRwdXREaXNwYXRjaGVySW1wbDo6QXVkaW9PdXRwdXREaXNwYXRjaGVySW1wbCgKLSAgICBBdWRpb01hbmFnZXIqIGF1ZGlvX21hbmFnZXIsCi0gICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsCi0gICAgY29uc3QgYmFzZTo6VGltZURlbHRhJiBjbG9zZV9kZWxheSkKLSAgICA6IEF1ZGlvT3V0cHV0RGlzcGF0Y2hlcihhdWRpb19tYW5hZ2VyLCBwYXJhbXMpLAotICAgICAgcGF1c2VfZGVsYXlfKGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygKLSAgICAgICAgICAyICogcGFyYW1zLmZyYW1lc19wZXJfYnVmZmVyKCkgKgotICAgICAgICAgIGJhc2U6OlRpbWU6OmtNaWxsaXNlY29uZHNQZXJTZWNvbmQgLyBwYXJhbXMuc2FtcGxlX3JhdGUoKSkpLAotICAgICAgcGF1c2VkX3Byb3hpZXNfKDApLAotICAgICAgQUxMT1dfVEhJU19JTl9JTklUSUFMSVpFUl9MSVNUKHdlYWtfdGhpc18odGhpcykpLAotICAgICAgY2xvc2VfdGltZXJfKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICBjbG9zZV9kZWxheSwKLSAgICAgICAgICAgICAgICAgICB3ZWFrX3RoaXNfLkdldFdlYWtQdHIoKSwKLSAgICAgICAgICAgICAgICAgICAmQXVkaW9PdXRwdXREaXNwYXRjaGVySW1wbDo6Q2xvc2VQZW5kaW5nU3RyZWFtcykgewotfQotCi1BdWRpb091dHB1dERpc3BhdGNoZXJJbXBsOjp+QXVkaW9PdXRwdXREaXNwYXRjaGVySW1wbCgpIHsKLSAgRENIRUNLKHByb3h5X3RvX3BoeXNpY2FsX21hcF8uZW1wdHkoKSk7Ci0gIERDSEVDSyhpZGxlX3N0cmVhbXNfLmVtcHR5KCkpOwotICBEQ0hFQ0socGF1c2luZ19zdHJlYW1zXy5lbXB0eSgpKTsKLX0KLQotYm9vbCBBdWRpb091dHB1dERpc3BhdGNoZXJJbXBsOjpPcGVuU3RyZWFtKCkgewotICBEQ0hFQ0tfRVEoTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSwgbWVzc2FnZV9sb29wXyk7Ci0KLSAgcGF1c2VkX3Byb3hpZXNfKys7Ci0KLSAgLy8gRW5zdXJlIHRoYXQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIG9wZW4gc3RyZWFtLgotICBpZiAoaWRsZV9zdHJlYW1zXy5lbXB0eSgpICYmICFDcmVhdGVBbmRPcGVuU3RyZWFtKCkpIHsKLSAgICBwYXVzZWRfcHJveGllc18tLTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBjbG9zZV90aW1lcl8uUmVzZXQoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQXVkaW9PdXRwdXREaXNwYXRjaGVySW1wbDo6U3RhcnRTdHJlYW0oCi0gICAgQXVkaW9PdXRwdXRTdHJlYW06OkF1ZGlvU291cmNlQ2FsbGJhY2sqIGNhbGxiYWNrLAotICAgIEF1ZGlvT3V0cHV0UHJveHkqIHN0cmVhbV9wcm94eSkgewotICBEQ0hFQ0tfRVEoTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSwgbWVzc2FnZV9sb29wXyk7Ci0KLSAgaWYgKGlkbGVfc3RyZWFtc18uZW1wdHkoKSAmJiAhQ3JlYXRlQW5kT3BlblN0cmVhbSgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBBdWRpb091dHB1dFN0cmVhbSogcGh5c2ljYWxfc3RyZWFtID0gaWRsZV9zdHJlYW1zXy5iYWNrKCk7Ci0gIERDSEVDSyhwaHlzaWNhbF9zdHJlYW0pOwotICBpZGxlX3N0cmVhbXNfLnBvcF9iYWNrKCk7Ci0KLSAgRENIRUNLX0dUKHBhdXNlZF9wcm94aWVzXywgMHUpOwotICAtLXBhdXNlZF9wcm94aWVzXzsKLQotICBjbG9zZV90aW1lcl8uUmVzZXQoKTsKLQotICAvLyBTY2hlZHVsZSB0YXNrIHRvIGFsbG9jYXRlIHN0cmVhbXMgZm9yIG90aGVyIHByb3hpZXMgaWYgd2UgbmVlZCB0by4KLSAgbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soRlJPTV9IRVJFLCBiYXNlOjpCaW5kKAotICAgICAgJkF1ZGlvT3V0cHV0RGlzcGF0Y2hlckltcGw6Ok9wZW5UYXNrLCB3ZWFrX3RoaXNfLkdldFdlYWtQdHIoKSkpOwotCi0gIGRvdWJsZSB2b2x1bWUgPSAwOwotICBzdHJlYW1fcHJveHktPkdldFZvbHVtZSgmdm9sdW1lKTsKLSAgcGh5c2ljYWxfc3RyZWFtLT5TZXRWb2x1bWUodm9sdW1lKTsKLSAgcGh5c2ljYWxfc3RyZWFtLT5TdGFydChjYWxsYmFjayk7Ci0gIHByb3h5X3RvX3BoeXNpY2FsX21hcF9bc3RyZWFtX3Byb3h5XSA9IHBoeXNpY2FsX3N0cmVhbTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQXVkaW9PdXRwdXREaXNwYXRjaGVySW1wbDo6U3RvcFN0cmVhbShBdWRpb091dHB1dFByb3h5KiBzdHJlYW1fcHJveHkpIHsKLSAgRENIRUNLX0VRKE1lc3NhZ2VMb29wOjpjdXJyZW50KCksIG1lc3NhZ2VfbG9vcF8pOwotCi0gIEF1ZGlvU3RyZWFtTWFwOjppdGVyYXRvciBpdCA9IHByb3h5X3RvX3BoeXNpY2FsX21hcF8uZmluZChzdHJlYW1fcHJveHkpOwotICBEQ0hFQ0soaXQgIT0gcHJveHlfdG9fcGh5c2ljYWxfbWFwXy5lbmQoKSk7Ci0gIEF1ZGlvT3V0cHV0U3RyZWFtKiBwaHlzaWNhbF9zdHJlYW0gPSBpdC0+c2Vjb25kOwotICBwcm94eV90b19waHlzaWNhbF9tYXBfLmVyYXNlKGl0KTsKLQotICBwaHlzaWNhbF9zdHJlYW0tPlN0b3AoKTsKLQotICArK3BhdXNlZF9wcm94aWVzXzsKLQotICBwYXVzaW5nX3N0cmVhbXNfLnB1c2hfZnJvbnQocGh5c2ljYWxfc3RyZWFtKTsKLQotICAvLyBEb24ndCByZWN5Y2xlIHN0cmVhbSB1bnRpbCB0d28gYnVmZmVycyB3b3J0aCBvZiB0aW1lIGhhcyBlbGFwc2VkLgotICBtZXNzYWdlX2xvb3BfLT5Qb3N0RGVsYXllZFRhc2soCi0gICAgICBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kKCZBdWRpb091dHB1dERpc3BhdGNoZXJJbXBsOjpTdG9wU3RyZWFtVGFzaywKLSAgICAgICAgICAgICAgICAgd2Vha190aGlzXy5HZXRXZWFrUHRyKCkpLAotICAgICAgcGF1c2VfZGVsYXlfKTsKLX0KLQotdm9pZCBBdWRpb091dHB1dERpc3BhdGNoZXJJbXBsOjpTdHJlYW1Wb2x1bWVTZXQoQXVkaW9PdXRwdXRQcm94eSogc3RyZWFtX3Byb3h5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZvbHVtZSkgewotICBEQ0hFQ0tfRVEoTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSwgbWVzc2FnZV9sb29wXyk7Ci0gIEF1ZGlvU3RyZWFtTWFwOjppdGVyYXRvciBpdCA9IHByb3h5X3RvX3BoeXNpY2FsX21hcF8uZmluZChzdHJlYW1fcHJveHkpOwotICBpZiAoaXQgIT0gcHJveHlfdG9fcGh5c2ljYWxfbWFwXy5lbmQoKSkgewotICAgIEF1ZGlvT3V0cHV0U3RyZWFtKiBwaHlzaWNhbF9zdHJlYW0gPSBpdC0+c2Vjb25kOwotICAgIHBoeXNpY2FsX3N0cmVhbS0+U2V0Vm9sdW1lKHZvbHVtZSk7Ci0gIH0KLX0KLQotdm9pZCBBdWRpb091dHB1dERpc3BhdGNoZXJJbXBsOjpTdG9wU3RyZWFtVGFzaygpIHsKLSAgRENIRUNLX0VRKE1lc3NhZ2VMb29wOjpjdXJyZW50KCksIG1lc3NhZ2VfbG9vcF8pOwotCi0gIGlmIChwYXVzaW5nX3N0cmVhbXNfLmVtcHR5KCkpCi0gICAgcmV0dXJuOwotCi0gIEF1ZGlvT3V0cHV0U3RyZWFtKiBzdHJlYW0gPSBwYXVzaW5nX3N0cmVhbXNfLmJhY2soKTsKLSAgcGF1c2luZ19zdHJlYW1zXy5wb3BfYmFjaygpOwotICBpZGxlX3N0cmVhbXNfLnB1c2hfYmFjayhzdHJlYW0pOwotICBjbG9zZV90aW1lcl8uUmVzZXQoKTsKLX0KLQotdm9pZCBBdWRpb091dHB1dERpc3BhdGNoZXJJbXBsOjpDbG9zZVN0cmVhbShBdWRpb091dHB1dFByb3h5KiBzdHJlYW1fcHJveHkpIHsKLSAgRENIRUNLX0VRKE1lc3NhZ2VMb29wOjpjdXJyZW50KCksIG1lc3NhZ2VfbG9vcF8pOwotCi0gIHdoaWxlICghcGF1c2luZ19zdHJlYW1zXy5lbXB0eSgpKSB7Ci0gICAgaWRsZV9zdHJlYW1zXy5wdXNoX2JhY2socGF1c2luZ19zdHJlYW1zXy5iYWNrKCkpOwotICAgIHBhdXNpbmdfc3RyZWFtc18ucG9wX2JhY2soKTsKLSAgfQotCi0gIERDSEVDS19HVChwYXVzZWRfcHJveGllc18sIDB1KTsKLSAgcGF1c2VkX3Byb3hpZXNfLS07Ci0KLSAgd2hpbGUgKGlkbGVfc3RyZWFtc18uc2l6ZSgpID4gcGF1c2VkX3Byb3hpZXNfKSB7Ci0gICAgaWRsZV9zdHJlYW1zXy5iYWNrKCktPkNsb3NlKCk7Ci0gICAgaWRsZV9zdHJlYW1zXy5wb3BfYmFjaygpOwotICB9Ci19Ci0KLXZvaWQgQXVkaW9PdXRwdXREaXNwYXRjaGVySW1wbDo6U2h1dGRvd24oKSB7Ci0gIERDSEVDS19FUShNZXNzYWdlTG9vcDo6Y3VycmVudCgpLCBtZXNzYWdlX2xvb3BfKTsKLQotICAvLyBDYW5jZWwgYW55IHBlbmRpbmcgdGFza3MgdG8gY2xvc2UgcGF1c2VkIHN0cmVhbXMgb3IgY3JlYXRlIG5ldyBvbmVzLgotICB3ZWFrX3RoaXNfLkludmFsaWRhdGVXZWFrUHRycygpOwotCi0gIC8vIE5vIEF1ZGlvT3V0cHV0UHJveHkgb2JqZWN0cyBzaG91bGQgaG9sZCBhIHJlZmVyZW5jZSB0byB1cyB3aGVuIHdlIGdldAotICAvLyB0byB0aGlzIHN0YWdlLgotICBEQ0hFQ0soSGFzT25lUmVmKCkpIDw8ICJPbmx5IHRoZSBBdWRpb01hbmFnZXIgc2hvdWxkIGhvbGQgYSByZWZlcmVuY2UiOwotCi0gIEF1ZGlvT3V0cHV0U3RyZWFtTGlzdDo6aXRlcmF0b3IgaXQgPSBpZGxlX3N0cmVhbXNfLmJlZ2luKCk7Ci0gIGZvciAoOyBpdCAhPSBpZGxlX3N0cmVhbXNfLmVuZCgpOyArK2l0KQotICAgICgqaXQpLT5DbG9zZSgpOwotICBpZGxlX3N0cmVhbXNfLmNsZWFyKCk7Ci0KLSAgaXQgPSBwYXVzaW5nX3N0cmVhbXNfLmJlZ2luKCk7Ci0gIGZvciAoOyBpdCAhPSBwYXVzaW5nX3N0cmVhbXNfLmVuZCgpOyArK2l0KQotICAgICgqaXQpLT5DbG9zZSgpOwotICBwYXVzaW5nX3N0cmVhbXNfLmNsZWFyKCk7Ci19Ci0KLWJvb2wgQXVkaW9PdXRwdXREaXNwYXRjaGVySW1wbDo6Q3JlYXRlQW5kT3BlblN0cmVhbSgpIHsKLSAgRENIRUNLX0VRKE1lc3NhZ2VMb29wOjpjdXJyZW50KCksIG1lc3NhZ2VfbG9vcF8pOwotICBBdWRpb091dHB1dFN0cmVhbSogc3RyZWFtID0gYXVkaW9fbWFuYWdlcl8tPk1ha2VBdWRpb091dHB1dFN0cmVhbShwYXJhbXNfKTsKLSAgaWYgKCFzdHJlYW0pCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghc3RyZWFtLT5PcGVuKCkpIHsKLSAgICBzdHJlYW0tPkNsb3NlKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlkbGVfc3RyZWFtc18ucHVzaF9iYWNrKHN0cmVhbSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEF1ZGlvT3V0cHV0RGlzcGF0Y2hlckltcGw6Ok9wZW5UYXNrKCkgewotICBEQ0hFQ0tfRVEoTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSwgbWVzc2FnZV9sb29wXyk7Ci0gIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYXQgbGVhc3Qgb25lIHN0cmVhbSBhbGxvY2F0ZWQgaWYgdGhlcmUKLSAgLy8gYXJlIHBhdXNlZCBzdHJlYW1zLgotICBpZiAocGF1c2VkX3Byb3hpZXNfID4gMCAmJiBpZGxlX3N0cmVhbXNfLmVtcHR5KCkgJiYKLSAgICAgIHBhdXNpbmdfc3RyZWFtc18uZW1wdHkoKSkgewotICAgIENyZWF0ZUFuZE9wZW5TdHJlYW0oKTsKLSAgfQotCi0gIGNsb3NlX3RpbWVyXy5SZXNldCgpOwotfQotCi0vLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgfGNsb3NlX3RpbWVyX3wuCi12b2lkIEF1ZGlvT3V0cHV0RGlzcGF0Y2hlckltcGw6OkNsb3NlUGVuZGluZ1N0cmVhbXMoKSB7Ci0gIERDSEVDS19FUShNZXNzYWdlTG9vcDo6Y3VycmVudCgpLCBtZXNzYWdlX2xvb3BfKTsKLSAgd2hpbGUgKCFpZGxlX3N0cmVhbXNfLmVtcHR5KCkpIHsKLSAgICBpZGxlX3N0cmVhbXNfLmJhY2soKS0+Q2xvc2UoKTsKLSAgICBpZGxlX3N0cmVhbXNfLnBvcF9iYWNrKCk7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fb3V0cHV0X2Rpc3BhdGNoZXJfaW1wbC5oIGIvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9kaXNwYXRjaGVyX2ltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhYTY1MS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fb3V0cHV0X2Rpc3BhdGNoZXJfaW1wbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIEF1ZGlvT3V0cHV0RGlzcGF0Y2hlckltcGwgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQXVkaW9PdXRwdXREaXNwYXRjaGVyLgotLy8KLS8vIFRvIGF2b2lkIG9wZW5pbmcgYW5kIGNsb3NpbmcgYXVkaW8gZGV2aWNlcyBtb3JlIGZyZXF1ZW50bHkgdGhhbiBuZWNlc3NhcnksCi0vLyBlYWNoIGRpc3BhdGNoZXIgaGFzIGEgcG9vbCBvZiBpbmFjdGl2ZSBwaHlzaWNhbCBzdHJlYW1zLiBBIHN0cmVhbSBpcyBjbG9zZWQKLS8vIG9ubHkgaWYgaXQgaGFzbid0IGJlZW4gdXNlZCBmb3IgYSBjZXJ0YWluIHBlcmlvZCBvZiB0aW1lIChzcGVjaWZpZWQgdmlhIHRoZQotLy8gY29uc3RydWN0b3IpLgotLy8KLQotI2lmbmRlZiBNRURJQV9BVURJT19BVURJT19PVVRQVVRfRElTUEFUQ0hFUl9JTVBMX0hfCi0jZGVmaW5lIE1FRElBX0FVRElPX0FVRElPX09VVFBVVF9ESVNQQVRDSEVSX0lNUExfSF8KLQotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8bWFwPgotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS93ZWFrX3B0ci5oIgotI2luY2x1ZGUgImJhc2UvdGltZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19pby5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX21hbmFnZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19vdXRwdXRfZGlzcGF0Y2hlci5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3BhcmFtZXRlcnMuaCIKLQotY2xhc3MgTWVzc2FnZUxvb3A7Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIEF1ZGlvT3V0cHV0UHJveHk7Ci0KLWNsYXNzIE1FRElBX0VYUE9SVCBBdWRpb091dHB1dERpc3BhdGNoZXJJbXBsIDogcHVibGljIEF1ZGlvT3V0cHV0RGlzcGF0Y2hlciB7Ci0gcHVibGljOgotICAvLyB8Y2xvc2VfZGVsYXlfbXN8IHNwZWNpZmllcyBkZWxheSBhZnRlciB0aGUgc3RyZWFtIGlzIHBhdXNlZCB1bnRpbAotICAvLyB0aGUgYXVkaW8gZGV2aWNlIGlzIGNsb3NlZC4KLSAgQXVkaW9PdXRwdXREaXNwYXRjaGVySW1wbChBdWRpb01hbmFnZXIqIGF1ZGlvX21hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6VGltZURlbHRhJiBjbG9zZV9kZWxheSk7Ci0KLSAgLy8gT3BlbnMgYSBuZXcgcGh5c2ljYWwgc3RyZWFtIGlmIHRoZXJlIGFyZSBubyBwZW5kaW5nIHN0cmVhbXMgaW4KLSAgLy8gfGlkbGVfc3RyZWFtc198LiAgRG8gbm90IGNhbGwgQ2xvc2UoKSBvciBTdG9wKCkgaWYgdGhpcyBtZXRob2QgZmFpbHMuCi0gIHZpcnR1YWwgYm9vbCBPcGVuU3RyZWFtKCkgT1ZFUlJJREU7Ci0KLSAgLy8gSWYgdGhlcmUgYXJlIHBlbmRpbmcgc3RyZWFtcyBpbiB8aWRsZV9zdHJlYW1zX3wgdGhlbiBpdCByZXVzZXMgb25lIG9mCi0gIC8vIHRoZW0sIG90aGVyd2lzZSBjcmVhdGVzIGEgbmV3IG9uZS4KLSAgdmlydHVhbCBib29sIFN0YXJ0U3RyZWFtKEF1ZGlvT3V0cHV0U3RyZWFtOjpBdWRpb1NvdXJjZUNhbGxiYWNrKiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvT3V0cHV0UHJveHkqIHN0cmVhbV9wcm94eSkgT1ZFUlJJREU7Ci0KLSAgLy8gSG9sZHMgdGhlIHBoeXNpY2FsIHN0cmVhbSB0ZW1wb3JhcmlseSBpbiB8cGF1c2luZ19zdHJlYW1zX3wgYW5kIHRoZW4KLSAgLy8gfHN0cmVhbXwgaXMgIGFkZGVkIHRvIHRoZSBwb29sIG9mIHBlbmRpbmcgc3RyZWFtcyAoaS5lLiB8aWRsZV9zdHJlYW1zX3wpLgotICB2aXJ0dWFsIHZvaWQgU3RvcFN0cmVhbShBdWRpb091dHB1dFByb3h5KiBzdHJlYW1fcHJveHkpIE9WRVJSSURFOwotCi0gIHZpcnR1YWwgdm9pZCBTdHJlYW1Wb2x1bWVTZXQoQXVkaW9PdXRwdXRQcm94eSogc3RyZWFtX3Byb3h5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2b2x1bWUpIE9WRVJSSURFOwotCi0gIHZpcnR1YWwgdm9pZCBDbG9zZVN0cmVhbShBdWRpb091dHB1dFByb3h5KiBzdHJlYW1fcHJveHkpIE9WRVJSSURFOwotCi0gIHZpcnR1YWwgdm9pZCBTaHV0ZG93bigpIE9WRVJSSURFOwotCi0gcHJpdmF0ZToKLSAgdHlwZWRlZiBzdGQ6Om1hcDxBdWRpb091dHB1dFByb3h5KiwgQXVkaW9PdXRwdXRTdHJlYW0qPiBBdWRpb1N0cmVhbU1hcDsKLSAgZnJpZW5kIGNsYXNzIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPEF1ZGlvT3V0cHV0RGlzcGF0Y2hlckltcGw+OwotICB2aXJ0dWFsIH5BdWRpb091dHB1dERpc3BhdGNoZXJJbXBsKCk7Ci0KLSAgZnJpZW5kIGNsYXNzIEF1ZGlvT3V0cHV0UHJveHlUZXN0OwotCi0gIC8vIENyZWF0ZXMgYSBuZXcgcGh5c2ljYWwgb3V0cHV0IHN0cmVhbSwgb3BlbnMgaXQgYW5kIHB1c2hlcyB0bwotICAvLyB8aWRsZV9zdHJlYW1zX3wuICBSZXR1cm5zIGZhbHNlIGlmIHRoZSBzdHJlYW0gY291bGRuJ3QgYmUgY3JlYXRlZCBvcgotICAvLyBvcGVuZWQuCi0gIGJvb2wgQ3JlYXRlQW5kT3BlblN0cmVhbSgpOwotCi0gIC8vIEEgdGFzayBzY2hlZHVsZWQgYnkgU3RhcnRTdHJlYW0oKS4gT3BlbnMgYSBuZXcgc3RyZWFtIGFuZCBwdXRzCi0gIC8vIGl0IGluIHxpZGxlX3N0cmVhbXNffC4KLSAgdm9pZCBPcGVuVGFzaygpOwotCi0gIC8vIEJlZm9yZSBhIHN0cmVhbSBpcyByZXVzZWQsIGl0IHNob3VsZCBzaXQgaWRsZSBmb3IgYSBiaXQuICBUaGlzIHRhc2sgaXMKLSAgLy8gY2FsbGVkIG9uY2UgdGhhdCB0aW1lIGhhcyBlbGFwc2VkLgotICB2b2lkIFN0b3BTdHJlYW1UYXNrKCk7Ci0KLSAgLy8gQ2FsbGVkIGJ5IHxjbG9zZV90aW1lcl98LiBDbG9zZXMgYWxsIHBlbmRpbmcgc3RyZWFtcy4KLSAgdm9pZCBDbG9zZVBlbmRpbmdTdHJlYW1zKCk7Ci0KLSAgYmFzZTo6VGltZURlbHRhIHBhdXNlX2RlbGF5XzsKLSAgc2l6ZV90IHBhdXNlZF9wcm94aWVzXzsKLSAgdHlwZWRlZiBzdGQ6Omxpc3Q8QXVkaW9PdXRwdXRTdHJlYW0qPiBBdWRpb091dHB1dFN0cmVhbUxpc3Q7Ci0gIEF1ZGlvT3V0cHV0U3RyZWFtTGlzdCBpZGxlX3N0cmVhbXNfOwotICBBdWRpb091dHB1dFN0cmVhbUxpc3QgcGF1c2luZ19zdHJlYW1zXzsKLQotICAvLyBVc2VkIHRvIHBvc3QgZGVsYXllZCB0YXNrcyB0byBvdXJzZWx2ZXMgdGhhdCB3ZSBjYW5jZWwgaW5zaWRlIFNodXRkb3duKCkuCi0gIGJhc2U6OldlYWtQdHJGYWN0b3J5PEF1ZGlvT3V0cHV0RGlzcGF0Y2hlckltcGw+IHdlYWtfdGhpc187Ci0gIGJhc2U6OkRlbGF5VGltZXI8QXVkaW9PdXRwdXREaXNwYXRjaGVySW1wbD4gY2xvc2VfdGltZXJfOwotCi0gIEF1ZGlvU3RyZWFtTWFwIHByb3h5X3RvX3BoeXNpY2FsX21hcF87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEF1ZGlvT3V0cHV0RGlzcGF0Y2hlckltcGwpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQVVESU9fQVVESU9fT1VUUFVUX0RJU1BBVENIRVJfSU1QTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9pcGMuY2MgYi9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fb3V0cHV0X2lwYy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzYTNiOC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fb3V0cHV0X2lwYy5jYworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19vdXRwdXRfaXBjLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLUF1ZGlvT3V0cHV0SVBDRGVsZWdhdGU6On5BdWRpb091dHB1dElQQ0RlbGVnYXRlKCkge30KLQotQXVkaW9PdXRwdXRJUEM6On5BdWRpb091dHB1dElQQygpIHt9Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9pcGMuaCBiL3NyYy9tZWRpYS9hdWRpby9hdWRpb19vdXRwdXRfaXBjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NDNjZGMuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9pcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0FVRElPX0FVRElPX09VVFBVVF9JUENfSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fQVVESU9fT1VUUFVUX0lQQ19IXwotCi0jaW5jbHVkZSAiYmFzZS9zaGFyZWRfbWVtb3J5LmgiCi0jaW5jbHVkZSAiYmFzZS9zeW5jX3NvY2tldC5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3BhcmFtZXRlcnMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBDb250YWlucyBJUEMgbm90aWZpY2F0aW9ucyBmb3IgdGhlIHN0YXRlIG9mIHRoZSBzZXJ2ZXIgc2lkZQotLy8gKEF1ZGlvT3V0cHV0Q29udHJvbGxlcikgYXVkaW8gc3RhdGUgY2hhbmdlcyBhbmQgd2hlbiBhbiBBdWRpb091dHB1dENvbnRyb2xsZXIKLS8vIGhhcyBiZWVuIGNyZWF0ZWQuICBJbXBsZW1lbnRlZCBieSBBdWRpb091dHB1dERldmljZS4KLWNsYXNzIE1FRElBX0VYUE9SVCBBdWRpb091dHB1dElQQ0RlbGVnYXRlIHsKLSBwdWJsaWM6Ci0gIC8vIEN1cnJlbnQgc3RhdHVzIG9mIHRoZSBhdWRpbyBvdXRwdXQgc3RyZWFtIGluIHRoZSBicm93c2VyIHByb2Nlc3MuIEJyb3dzZXIKLSAgLy8gc2VuZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgcGxheWJhY2sgc3RhdGUgYW5kIGVycm9yIHRvIHRoZQotICAvLyByZW5kZXJlciBwcm9jZXNzIHVzaW5nIHRoaXMgdHlwZS4KLSAgZW51bSBTdGF0ZSB7Ci0gICAga1BsYXlpbmcsCi0gICAga1BhdXNlZCwKLSAgICBrRXJyb3IKLSAgfTsKLQotICAvLyBDYWxsZWQgd2hlbiBzdGF0ZSBvZiBhbiBhdWRpbyBzdHJlYW0gaGFzIGNoYW5nZWQuCi0gIHZpcnR1YWwgdm9pZCBPblN0YXRlQ2hhbmdlZChTdGF0ZSBzdGF0ZSkgPSAwOwotCi0gIC8vIENhbGxlZCB3aGVuIGFuIGF1ZGlvIHN0cmVhbSBoYXMgYmVlbiBjcmVhdGVkLgotICAvLyBUaGUgc2hhcmVkIG1lbW9yeSB8aGFuZGxlfCBwb2ludHMgdG8gYSBtZW1vcnkgc2VjdGlvbiB0aGF0J3MgdXNlZCB0bwotICAvLyB0cmFuc2ZlciBhdWRpbyBidWZmZXJzIGZyb20gdGhlIEF1ZGlvT3V0cHV0SVBDRGVsZWdhdGUgYmFjayB0byB0aGUKLSAgLy8gQXVkaW9SZW5kZXJlckhvc3QuICBUaGUgaW1wbGVtZW50YXRpb24gb2YgT25TdHJlYW1DcmVhdGVkIHRha2VzIG93bmVyc2hpcC4KLSAgLy8gVGhlIHxzb2NrZXRfaGFuZGxlfCBpcyB1c2VkIGJ5IEF1ZGlvUmVuZGVyZXJIb3N0IHRvIHNpZ25hbCByZXF1ZXN0cyBmb3IKLSAgLy8gYXVkaW8gZGF0YSB0byBiZSB3cml0dGVuIGludG8gdGhlIHNoYXJlZCBtZW1vcnkuIFRoZSBBdWRpb091dHB1dElQQ0RlbGVnYXRlCi0gIC8vIG11c3QgcmVhZCBmcm9tIHRoaXMgc29ja2V0IGFuZCBwcm92aWRlIGF1ZGlvIHdoZW5ldmVyIGRhdGEgKHNlYXJjaCBmb3IKLSAgLy8gInBlbmRpbmdfYnl0ZXMiKSBpcyByZWNlaXZlZC4KLSAgdmlydHVhbCB2b2lkIE9uU3RyZWFtQ3JlYXRlZChiYXNlOjpTaGFyZWRNZW1vcnlIYW5kbGUgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlN5bmNTb2NrZXQ6OkhhbmRsZSBzb2NrZXRfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpID0gMDsKLQotICAvLyBDYWxsZWQgd2hlbiB0aGUgQXVkaW9PdXRwdXRJUEMgb2JqZWN0IGlzIGdvaW5nIGF3YXkgYW5kL29yIHdoZW4gdGhlIElQQwotICAvLyBjaGFubmVsIGhhcyBiZWVuIGNsb3NlZCBhbmQgbm8gbW9yZSBpcGMgcmVxdWVzdHMgY2FuIGJlIG1hZGUuCi0gIC8vIEltcGxlbWVudGF0aW9ucyBtdXN0IGNsZWFyIGFueSByZWZlcmVuY2VzIHRvIHRoZSBBdWRpb091dHB1dElQQyBvYmplY3QKLSAgLy8gYXQgdGhpcyBwb2ludC4KLSAgdmlydHVhbCB2b2lkIE9uSVBDQ2xvc2VkKCkgPSAwOwotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIH5BdWRpb091dHB1dElQQ0RlbGVnYXRlKCk7Ci19OwotCi0vLyBQcm92aWRlcyBJUEMgZnVuY3Rpb25hbGl0eSBmb3IgYW4gQXVkaW9PdXRwdXREZXZpY2UuICBUaGUgaW1wbGVtZW50YXRpb24KLS8vIHNob3VsZCBhc3luY2hyb25vdXNseSBkZWxpdmVyIHRoZSBtZXNzYWdlcyB0byBhbiBBdWRpb091dHB1dENvbnRyb2xsZXIgb2JqZWN0Ci0vLyAob3IgY3JlYXRlIG9uZSBpbiB0aGUgY2FzZSBvZiBDcmVhdGVTdHJlYW0oKSksIHRoYXQgbWF5IGxpdmUgaW4gYSBzZXBhcmF0ZQotLy8gcHJvY2Vzcy4KLWNsYXNzIE1FRElBX0VYUE9SVCBBdWRpb091dHB1dElQQyB7Ci0gcHVibGljOgotICAvLyBSZWdpc3RlcnMgYW4gQXVkaW9PdXRwdXRJUENEZWxlZ2F0ZSBhbmQgcmV0dXJucyBhIHxzdHJlYW1faWR8IHRoYXQgbXVzdAotICAvLyBiZSB1c2VkIHdpdGggYWxsIG90aGVyIElQQyBmdW5jdGlvbnMgaW4gdGhpcyBpbnRlcmZhY2UuCi0gIHZpcnR1YWwgaW50IEFkZERlbGVnYXRlKEF1ZGlvT3V0cHV0SVBDRGVsZWdhdGUqIGRlbGVnYXRlKSA9IDA7Ci0KLSAgLy8gVW5yZWdpc3RlcnMgYSBkZWxlZ2F0ZSB0aGF0IHdhcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgdmlhIGEgY2FsbCB0bwotICAvLyBBZGREZWxlZ2F0ZSgpLiAgVGhlIGF1ZGlvIHN0cmVhbSBzaG91bGQgYmUgaW4gYSBjbG9zZWQgc3RhdGUgcHJpb3IgdG8KLSAgLy8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgotICB2aXJ0dWFsIHZvaWQgUmVtb3ZlRGVsZWdhdGUoaW50IHN0cmVhbV9pZCkgPSAwOwotCi0gIC8vIFNlbmRzIGEgcmVxdWVzdCB0byBjcmVhdGUgYW4gQXVkaW9PdXRwdXRDb250cm9sbGVyIG9iamVjdCBpbiB0aGUgcGVlcgotICAvLyBwcm9jZXNzLCBpZGVudGlmeSBpdCBieSB8c3RyZWFtX2lkfCBhbmQgY29uZmlndXJlIGl0IHRvIHVzZSB0aGUgc3BlY2lmaWVkCi0gIC8vIGF1ZGlvIHxwYXJhbXN8IGFuZCBudW1iZXIgb2Ygc3luY2hyb25pemVkIGlucHV0IGNoYW5uZWxzLgotICAvLyBPbmNlIHRoZSBzdHJlYW0gaGFzIGJlZW4gY3JlYXRlZCwgdGhlIGltcGxlbWVudGF0aW9uIG11c3QKLSAgLy8gZ2VuZXJhdGUgYSBub3RpZmljYXRpb24gdG8gdGhlIEF1ZGlvT3V0cHV0SVBDRGVsZWdhdGUgYW5kIGNhbGwKLSAgLy8gT25TdHJlYW1DcmVhdGVkKCkuCi0gIHZpcnR1YWwgdm9pZCBDcmVhdGVTdHJlYW0oaW50IHN0cmVhbV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXRfY2hhbm5lbHMpID0gMDsKLQotICAvLyBTdGFydHMgcGxheWluZyB0aGUgc3RyZWFtLiAgVGhpcyBzaG91bGQgZ2VuZXJhdGUgYSBjYWxsIHRvCi0gIC8vIEF1ZGlvT3V0cHV0Q29udHJvbGxlcjo6UGxheSgpLgotICB2aXJ0dWFsIHZvaWQgUGxheVN0cmVhbShpbnQgc3RyZWFtX2lkKSA9IDA7Ci0KLSAgLy8gUGF1c2VzIGFuIGF1ZGlvIHN0cmVhbS4gIFRoaXMgc2hvdWxkIGdlbmVyYXRlIGEgY2FsbCB0bwotICAvLyBBdWRpb091dHB1dENvbnRyb2xsZXI6OlBhdXNlKCkuCi0gIHZpcnR1YWwgdm9pZCBQYXVzZVN0cmVhbShpbnQgc3RyZWFtX2lkKSA9IDA7Ci0KLSAgLy8gIkZsdXNoZXMiIHRoZSBhdWRpbyBkZXZpY2UuIFRoaXMgc2hvdWxkIGdlbmVyYXRlIGEgY2FsbCB0bwotICAvLyBBdWRpb091dHB1dENvbnRyb2xsZXI6OkZsdXNoKCkuCi0gIC8vIFRPRE8odG9tbWkpOiBUaGlzIGlzIGN1cnJlbnRseSBuZWl0aGVyIGltcGxlbWVudGVkIG5vciBjYWxsZWQuICBSZW1vdmU/Ci0gIHZpcnR1YWwgdm9pZCBGbHVzaFN0cmVhbShpbnQgc3RyZWFtX2lkKSA9IDA7Ci0KLSAgLy8gQ2xvc2VzIHRoZSBhdWRpbyBzdHJlYW0gYW5kIGRlbGV0ZXMgdGhlIG1hdGNoaW5nIEF1ZGlvT3V0cHV0Q29udHJvbGxlcgotICAvLyBpbnN0YW5jZS4gIFByaW9yIHRvIGRlbGV0aW5nIHRoZSBBdWRpb091dHB1dENvbnRyb2xsZXIgb2JqZWN0LCBhIGNhbGwgdG8KLSAgLy8gQXVkaW9PdXRwdXRDb250cm9sbGVyOjpDbG9zZSBtdXN0IGJlIG1hZGUuCi0gIHZpcnR1YWwgdm9pZCBDbG9zZVN0cmVhbShpbnQgc3RyZWFtX2lkKSA9IDA7Ci0KLSAgLy8gU2V0cyB0aGUgdm9sdW1lIG9mIHRoZSBhdWRpbyBzdHJlYW0uCi0gIHZpcnR1YWwgdm9pZCBTZXRWb2x1bWUoaW50IHN0cmVhbV9pZCwgZG91YmxlIHZvbHVtZSkgPSAwOwotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIH5BdWRpb091dHB1dElQQygpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQVVESU9fQVVESU9fT1VUUFVUX0lQQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9taXhlci5jYyBiL3NyYy9tZWRpYS9hdWRpby9hdWRpb19vdXRwdXRfbWl4ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkY2U0ZWEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9taXhlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fb3V0cHV0X21peGVyLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJiYXNlL3RpbWUuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19pby5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9wcm94eS5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3V0aWwuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotQXVkaW9PdXRwdXRNaXhlcjo6QXVkaW9PdXRwdXRNaXhlcihBdWRpb01hbmFnZXIqIGF1ZGlvX21hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpUaW1lRGVsdGEmIGNsb3NlX2RlbGF5KQotICAgIDogQXVkaW9PdXRwdXREaXNwYXRjaGVyKGF1ZGlvX21hbmFnZXIsIHBhcmFtcyksCi0gICAgICBBTExPV19USElTX0lOX0lOSVRJQUxJWkVSX0xJU1Qod2Vha190aGlzXyh0aGlzKSksCi0gICAgICBjbG9zZV90aW1lcl8oRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgIGNsb3NlX2RlbGF5LAotICAgICAgICAgICAgICAgICAgIHdlYWtfdGhpc18uR2V0V2Vha1B0cigpLAotICAgICAgICAgICAgICAgICAgICZBdWRpb091dHB1dE1peGVyOjpDbG9zZVBoeXNpY2FsU3RyZWFtKSwKLSAgICAgIHBlbmRpbmdfYnl0ZXNfKDApIHsKLSAgLy8gVE9ETyhlbmFsKTogYWxpZ24gZGF0YS4KLSAgbWl4ZXJfZGF0YV8ucmVzZXQobmV3IHVpbnQ4W3BhcmFtc18uR2V0Qnl0ZXNQZXJCdWZmZXIoKV0pOwotfQotCi1BdWRpb091dHB1dE1peGVyOjp+QXVkaW9PdXRwdXRNaXhlcigpIHsKLX0KLQotYm9vbCBBdWRpb091dHB1dE1peGVyOjpPcGVuU3RyZWFtKCkgewotICBEQ0hFQ0tfRVEoTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSwgbWVzc2FnZV9sb29wXyk7Ci0KLSAgaWYgKHBoeXNpY2FsX3N0cmVhbV8uZ2V0KCkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIEF1ZGlvT3V0cHV0U3RyZWFtKiBzdHJlYW0gPSBhdWRpb19tYW5hZ2VyXy0+TWFrZUF1ZGlvT3V0cHV0U3RyZWFtKHBhcmFtc18pOwotICBpZiAoIXN0cmVhbSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghc3RyZWFtLT5PcGVuKCkpIHsKLSAgICBzdHJlYW0tPkNsb3NlKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHBlbmRpbmdfYnl0ZXNfID0gMDsgIC8vIEp1c3QgaW4gY2FzZS4KLSAgcGh5c2ljYWxfc3RyZWFtXy5yZXNldChzdHJlYW0pOwotICBjbG9zZV90aW1lcl8uUmVzZXQoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQXVkaW9PdXRwdXRNaXhlcjo6U3RhcnRTdHJlYW0oCi0gICAgQXVkaW9PdXRwdXRTdHJlYW06OkF1ZGlvU291cmNlQ2FsbGJhY2sqIGNhbGxiYWNrLAotICAgIEF1ZGlvT3V0cHV0UHJveHkqIHN0cmVhbV9wcm94eSkgewotICBEQ0hFQ0tfRVEoTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSwgbWVzc2FnZV9sb29wXyk7Ci0KLSAgLy8gTWF5IG5lZWQgdG8gcmUtb3BlbiB0aGUgcGh5c2ljYWwgc3RyZWFtIGlmIG5vIGFjdGl2ZSBwcm94aWVzIGFuZAotICAvLyBlbm91Z2ggdGltZSBoYWQgcGFzcy4KLSAgT3BlblN0cmVhbSgpOwotICBpZiAoIXBoeXNpY2FsX3N0cmVhbV8uZ2V0KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGRvdWJsZSB2b2x1bWUgPSAwLjA7Ci0gIHN0cmVhbV9wcm94eS0+R2V0Vm9sdW1lKCZ2b2x1bWUpOwotICBib29sIHNob3VsZF9zdGFydCA9IHByb3hpZXNfLmVtcHR5KCk7Ci0gIHsKLSAgICBiYXNlOjpBdXRvTG9jayBsb2NrKGxvY2tfKTsKLSAgICBQcm94eURhdGEqIHByb3h5X2RhdGEgPSAmcHJveGllc19bc3RyZWFtX3Byb3h5XTsKLSAgICBwcm94eV9kYXRhLT5hdWRpb19zb3VyY2VfY2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICBwcm94eV9kYXRhLT52b2x1bWUgPSB2b2x1bWU7Ci0gICAgcHJveHlfZGF0YS0+cGVuZGluZ19ieXRlcyA9IDA7Ci0gIH0KLSAgLy8gV2UgY2Fubm90IHN0YXJ0IHBoeXNpY2FsIHN0cmVhbSB1bmRlciB0aGUgbG9jaywKLSAgLy8gT25Nb3JlRGF0YSgpIHdvdWxkIHRyeSBhY3F1aXJpbmcgaXQuLi4KLSAgaWYgKHNob3VsZF9zdGFydCkgewotICAgIHBoeXNpY2FsX3N0cmVhbV8tPlNldFZvbHVtZSgxLjApOwotICAgIHBoeXNpY2FsX3N0cmVhbV8tPlN0YXJ0KHRoaXMpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEF1ZGlvT3V0cHV0TWl4ZXI6OlN0b3BTdHJlYW0oQXVkaW9PdXRwdXRQcm94eSogc3RyZWFtX3Byb3h5KSB7Ci0gIERDSEVDS19FUShNZXNzYWdlTG9vcDo6Y3VycmVudCgpLCBtZXNzYWdlX2xvb3BfKTsKLQotICAvLyBCZWNhdXNlIG9mIHBvc3NpYmxlIGRlYWRsb2NrIHdlIGNhbm5vdCBzdG9wIHBoeXNpY2FsIHN0cmVhbSB1bmRlciB0aGUgbG9jawotICAvLyAocGh5c2ljYWxfc3RyZWFtXy0+U3RvcCgpIGNhbiBjYWxsIE9uRXJyb3IoKSwgYW5kIGl0IGFjcXVpcmVzIHRoZSBsb2NrIHRvCi0gIC8vIGl0ZXJhdGUgdGhyb3VnaCBwcm94aWVzKSwgc28gYWNxdWlyZSB0aGUgbG9jaywgdXBkYXRlIHByb3h5IGxpc3QsIHJlbGVhc2UKLSAgLy8gdGhlIGxvY2ssIGFuZCBvbmx5IHRoZW4gc3RvcCBwaHlzaWNhbCBzdHJlYW0gaWYgbmVjZXNzYXJ5LgotICBib29sIHN0b3BfcGh5c2ljYWxfc3RyZWFtID0gZmFsc2U7Ci0gIHsKLSAgICBiYXNlOjpBdXRvTG9jayBsb2NrKGxvY2tfKTsKLSAgICBQcm94eU1hcDo6aXRlcmF0b3IgaXQgPSBwcm94aWVzXy5maW5kKHN0cmVhbV9wcm94eSk7Ci0gICAgaWYgKGl0ICE9IHByb3hpZXNfLmVuZCgpKSB7Ci0gICAgICBwcm94aWVzXy5lcmFzZShpdCk7Ci0gICAgICBzdG9wX3BoeXNpY2FsX3N0cmVhbSA9IHByb3hpZXNfLmVtcHR5KCk7Ci0gICAgfQotICB9Ci0gIGlmIChwaHlzaWNhbF9zdHJlYW1fLmdldCgpKSB7Ci0gICAgaWYgKHN0b3BfcGh5c2ljYWxfc3RyZWFtKSB7Ci0gICAgICBwaHlzaWNhbF9zdHJlYW1fLT5TdG9wKCk7Ci0gICAgICBwZW5kaW5nX2J5dGVzXyA9IDA7ICAvLyBKdXN0IGluIGNhc2UuCi0gICAgfQotICAgIGNsb3NlX3RpbWVyXy5SZXNldCgpOwotICB9Ci19Ci0KLXZvaWQgQXVkaW9PdXRwdXRNaXhlcjo6U3RyZWFtVm9sdW1lU2V0KEF1ZGlvT3V0cHV0UHJveHkqIHN0cmVhbV9wcm94eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2b2x1bWUpIHsKLSAgRENIRUNLX0VRKE1lc3NhZ2VMb29wOjpjdXJyZW50KCksIG1lc3NhZ2VfbG9vcF8pOwotCi0gIFByb3h5TWFwOjppdGVyYXRvciBpdCA9IHByb3hpZXNfLmZpbmQoc3RyZWFtX3Byb3h5KTsKLQotICAvLyBEbyBub3RoaW5nIGlmIHN0cmVhbSBpcyBub3QgY3VycmVudGx5IHBsYXlpbmcuCi0gIGlmIChpdCAhPSBwcm94aWVzXy5lbmQoKSkgewotICAgIGJhc2U6OkF1dG9Mb2NrIGxvY2sobG9ja18pOwotICAgIGl0LT5zZWNvbmQudm9sdW1lID0gdm9sdW1lOwotICB9Ci19Ci0KLXZvaWQgQXVkaW9PdXRwdXRNaXhlcjo6Q2xvc2VTdHJlYW0oQXVkaW9PdXRwdXRQcm94eSogc3RyZWFtX3Byb3h5KSB7Ci0gIERDSEVDS19FUShNZXNzYWdlTG9vcDo6Y3VycmVudCgpLCBtZXNzYWdlX2xvb3BfKTsKLQotICBTdG9wU3RyZWFtKHN0cmVhbV9wcm94eSk7Ci19Ci0KLXZvaWQgQXVkaW9PdXRwdXRNaXhlcjo6U2h1dGRvd24oKSB7Ci0gIERDSEVDS19FUShNZXNzYWdlTG9vcDo6Y3VycmVudCgpLCBtZXNzYWdlX2xvb3BfKTsKLQotICAvLyBDYW5jZWwgYW55IHBlbmRpbmcgdGFza3MgdG8gY2xvc2UgcGh5c2ljYWwgc3RyZWFtLgotICB3ZWFrX3RoaXNfLkludmFsaWRhdGVXZWFrUHRycygpOwotCi0gIHdoaWxlICghcHJveGllc18uZW1wdHkoKSkgewotICAgIENsb3NlU3RyZWFtKHByb3hpZXNfLmJlZ2luKCktPmZpcnN0KTsKLSAgfQotICBDbG9zZVBoeXNpY2FsU3RyZWFtKCk7Ci0KLSAgLy8gTm8gQXVkaW9PdXRwdXRQcm94eSBvYmplY3RzIHNob3VsZCBob2xkIGEgcmVmZXJlbmNlIHRvIHVzIHdoZW4gd2UgZ2V0Ci0gIC8vIHRvIHRoaXMgc3RhZ2UuCi0gIERDSEVDSyhIYXNPbmVSZWYoKSkgPDwgIk9ubHkgdGhlIEF1ZGlvTWFuYWdlciBzaG91bGQgaG9sZCBhIHJlZmVyZW5jZSI7Ci19Ci0KLXZvaWQgQXVkaW9PdXRwdXRNaXhlcjo6Q2xvc2VQaHlzaWNhbFN0cmVhbSgpIHsKLSAgRENIRUNLX0VRKE1lc3NhZ2VMb29wOjpjdXJyZW50KCksIG1lc3NhZ2VfbG9vcF8pOwotCi0gIGlmIChwcm94aWVzXy5lbXB0eSgpICYmIHBoeXNpY2FsX3N0cmVhbV8uZ2V0KCkgIT0gTlVMTCkKLSAgICBwaHlzaWNhbF9zdHJlYW1fLnJlbGVhc2UoKS0+Q2xvc2UoKTsKLX0KLQotLy8gQXVkaW9Tb3VyY2VDYWxsYmFjayBpbXBsZW1lbnRhdGlvbi4KLXVpbnQzMiBBdWRpb091dHB1dE1peGVyOjpPbk1vcmVEYXRhKHVpbnQ4KiBkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIG1heF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJzU3RhdGUgYnVmZmVyc19zdGF0ZSkgewotICBtYXhfc2l6ZSA9IHN0ZDo6bWluKG1heF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMj4ocGFyYW1zXy5HZXRCeXRlc1BlckJ1ZmZlcigpKSk7Ci0gIC8vIFRPRE8oZW5hbCk6IGNvbnNpZGVyIGdldHRpbmcgcmlkIG9mIGxvY2sgYXMgaXQgaXMgaW4gdGltZS1jcml0aWNhbCBjb2RlLgotICAvLyAgICAgICAgICAgICBFLmcuIHN3YXAgfHByb3hpZXNffCB3aXRoIGxvY2FsIHZhcmlhYmxlLCBhbmQgbWVyZ2UgMiBsaXN0cwotICAvLyAgICAgICAgICAgICBhdCB0aGUgZW5kLiBUaGF0IHdvdWxkIHNwZWVkIHRoaW5ncyB1cCBidXQgY29tcGxpY2F0ZSBzdG9wcGluZwotICAvLyAgICAgICAgICAgICB0aGUgc3RyZWFtLgotICBiYXNlOjpBdXRvTG9jayBsb2NrKGxvY2tfKTsKLQotICBEQ0hFQ0tfR0UocGVuZGluZ19ieXRlc18sIGJ1ZmZlcnNfc3RhdGUucGVuZGluZ19ieXRlcyk7Ci0gIGlmIChwcm94aWVzXy5lbXB0eSgpKSB7Ci0gICAgcGVuZGluZ19ieXRlc18gPSBidWZmZXJzX3N0YXRlLnBlbmRpbmdfYnl0ZXM7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgdWludDMyIGFjdHVhbF90b3RhbF9zaXplID0gMDsKLSAgdWludDMyIGJ5dGVzX3Blcl9zYW1wbGUgPSBwYXJhbXNfLmJpdHNfcGVyX3NhbXBsZSgpID4+IDM7Ci0KLSAgLy8gR28gdGhyb3VnaCBhbGwgdGhlIHN0cmVhbXMsIGdldHRpbmcgZGF0YSBmb3IgZXZlcnkgb25lIG9mIHRoZW0KLSAgLy8gYW5kIG1peGluZyBpdCBpbnRvIGRlc3RpbmF0aW9uLgotICAvLyBNaW5vciBvcHRpbWl6YXRpb246IGZvciB0aGUgZmlyc3Qgc3RyZWFtIHdlIGFyZSB3cml0aW5nIGRhdGEgZGlyZWN0bHkgaW50bwotICAvLyBkZXN0aW5hdGlvbi4gVGhpcyB3YXkgd2UgZG9uJ3QgaGF2ZSB0byBtaXggdGhlIGRhdGEgd2hlbiB0aGVyZSBpcyBvbmx5IG9uZQotICAvLyBhY3RpdmUgc3RyZWFtLCBhbmQgbmV0IHdpbiBpbiBvdGhlciBjYXNlcywgdG9vLgotICBib29sIGZpcnN0X3N0cmVhbSA9IHRydWU7Ci0gIHVpbnQ4KiBhY3R1YWxfZGVzdCA9IGRlc3Q7Ci0gIGZvciAoUHJveHlNYXA6Oml0ZXJhdG9yIGl0ID0gcHJveGllc18uYmVnaW4oKTsgaXQgIT0gcHJveGllc18uZW5kKCk7ICsraXQpIHsKLSAgICBQcm94eURhdGEqIHByb3h5X2RhdGEgPSAmaXQtPnNlY29uZDsKLQotICAgIC8vIElmIHByb3h5J3MgcGVuZGluZyBieXRlcyBhcmUgdGhlIHNhbWUgYXMgcGVuZGluZyBieXRlcyBmb3IgY29tYmluZWQKLSAgICAvLyBzdHJlYW0sIGJvdGggYXJlIGVpdGhlciBwcmUtYnVmZmVyaW5nIG9yIGluIHRoZSBzdGVhZHkgc3RhdGUuIEluIGVpdGhlcgotICAgIC8vIGNhc2UgbmV3IHBlbmRpbmcgYnl0ZXMgZm9yIHByb3h5IGlzIHRoZSBzYW1lIGFzIG5ldyBwZW5kaW5nIGJ5dGVzIGZvcgotICAgIC8vIGNvbWJpbmVkIHN0cmVhbS4KLSAgICAvLyBOb3RlOiB1c2UgPj0gaW5zdGVhZCBvZiA9PSwgdGhhdCB3YXkgaXMgc2FmZXIuCi0gICAgaWYgKHByb3h5X2RhdGEtPnBlbmRpbmdfYnl0ZXMgPj0gcGVuZGluZ19ieXRlc18pCi0gICAgICBwcm94eV9kYXRhLT5wZW5kaW5nX2J5dGVzID0gYnVmZmVyc19zdGF0ZS5wZW5kaW5nX2J5dGVzOwotCi0gICAgLy8gTm90ZTogdGhlcmUgaXMgbm8gd2F5IHdlIGNhbiBkZWR1Y2UgaGFyZHdhcmVfZGVsYXlfYnl0ZXMgZm9yIHRoZQotICAgIC8vIHBhcnRpY3VsYXIgcHJveHkgc3RyZWFtLiBVc2UgemVybyBpbnN0ZWFkLgotICAgIHVpbnQzMiBhY3R1YWxfc2l6ZSA9IHByb3h5X2RhdGEtPmF1ZGlvX3NvdXJjZV9jYWxsYmFjay0+T25Nb3JlRGF0YSgKLSAgICAgICAgYWN0dWFsX2Rlc3QsCi0gICAgICAgIG1heF9zaXplLAotICAgICAgICBBdWRpb0J1ZmZlcnNTdGF0ZShwcm94eV9kYXRhLT5wZW5kaW5nX2J5dGVzLCAwKSk7Ci0gICAgaWYgKGFjdHVhbF9zaXplID09IDApCi0gICAgICBjb250aW51ZTsKLSAgICBkb3VibGUgdm9sdW1lID0gcHJveHlfZGF0YS0+dm9sdW1lOwotCi0gICAgLy8gRGlmZmVyZW50IGhhbmRsaW5nIGZvciBmaXJzdCBhbmQgYWxsIHN1YnNlcXVlbnQgc3RyZWFtcy4KLSAgICBpZiAoZmlyc3Rfc3RyZWFtKSB7Ci0gICAgICBpZiAodm9sdW1lICE9IDEuMCkgewotICAgICAgICBtZWRpYTo6QWRqdXN0Vm9sdW1lKGFjdHVhbF9kZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc18uY2hhbm5lbHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc19wZXJfc2FtcGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoYWN0dWFsX3NpemUgPCBtYXhfc2l6ZSkKLSAgICAgICAgbWVtc2V0KGRlc3QgKyBhY3R1YWxfc2l6ZSwgMCwgbWF4X3NpemUgLSBhY3R1YWxfc2l6ZSk7Ci0gICAgICBmaXJzdF9zdHJlYW0gPSBmYWxzZTsKLSAgICAgIGFjdHVhbF9kZXN0ID0gbWl4ZXJfZGF0YV8uZ2V0KCk7Ci0gICAgICBhY3R1YWxfdG90YWxfc2l6ZSA9IGFjdHVhbF9zaXplOwotICAgIH0gZWxzZSB7Ci0gICAgICBtZWRpYTo6TWl4U3RyZWFtcyhkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsX2Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3Blcl9zYW1wbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUpOwotICAgICAgYWN0dWFsX3RvdGFsX3NpemUgPSBzdGQ6Om1heChhY3R1YWxfc2l6ZSwgYWN0dWFsX3RvdGFsX3NpemUpOwotICAgIH0KLSAgfQotCi0gIC8vIE5vdyBnbyB0aHJvdWdoIGFsbCBwcm94aWVzIG9uY2UgYWdhaW4gYW5kIGluY3JlYXNlIHBlbmRpbmdfYnl0ZXMKLSAgLy8gZm9yIGVhY2ggcHJveHkuIENvdWxkIG5vdCBkbyBpdCBlYXJsaWVyIGJlY2F1c2Ugd2UgZGlkIG5vdCBrbm93Ci0gIC8vIGFjdHVhbF90b3RhbF9zaXplLgotICBmb3IgKFByb3h5TWFwOjppdGVyYXRvciBpdCA9IHByb3hpZXNfLmJlZ2luKCk7IGl0ICE9IHByb3hpZXNfLmVuZCgpOyArK2l0KSB7Ci0gICAgaXQtPnNlY29uZC5wZW5kaW5nX2J5dGVzICs9IGFjdHVhbF90b3RhbF9zaXplOwotICB9Ci0gIHBlbmRpbmdfYnl0ZXNfID0gYnVmZmVyc19zdGF0ZS5wZW5kaW5nX2J5dGVzICsgYWN0dWFsX3RvdGFsX3NpemU7Ci0KLSAgcmV0dXJuIGFjdHVhbF90b3RhbF9zaXplOwotfQotCi12b2lkIEF1ZGlvT3V0cHV0TWl4ZXI6Ok9uRXJyb3IoQXVkaW9PdXRwdXRTdHJlYW0qIHN0cmVhbSwgaW50IGNvZGUpIHsKLSAgYmFzZTo6QXV0b0xvY2sgbG9jayhsb2NrXyk7Ci0gIGZvciAoUHJveHlNYXA6Oml0ZXJhdG9yIGl0ID0gcHJveGllc18uYmVnaW4oKTsgaXQgIT0gcHJveGllc18uZW5kKCk7ICsraXQpIHsKLSAgICBpdC0+c2Vjb25kLmF1ZGlvX3NvdXJjZV9jYWxsYmFjay0+T25FcnJvcihpdC0+Zmlyc3QsIGNvZGUpOwotICB9Ci19Ci0KLXZvaWQgQXVkaW9PdXRwdXRNaXhlcjo6V2FpdFRpbGxEYXRhUmVhZHkoKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGxvY2sobG9ja18pOwotICBmb3IgKFByb3h5TWFwOjppdGVyYXRvciBpdCA9IHByb3hpZXNfLmJlZ2luKCk7IGl0ICE9IHByb3hpZXNfLmVuZCgpOyArK2l0KSB7Ci0gICAgaXQtPnNlY29uZC5hdWRpb19zb3VyY2VfY2FsbGJhY2stPldhaXRUaWxsRGF0YVJlYWR5KCk7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fb3V0cHV0X21peGVyLmggYi9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fb3V0cHV0X21peGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZGVlZWYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9taXhlci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gQXVkaW9PdXRwdXRNaXhlciBpcyBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBicm93c2VyLXNpZGUgYXVkaW8gbWl4ZXIuCi0vLyBBdWRpb091dHB1dE1peGVyIGltcGxlbWVudHMgYm90aCBBdWRpb091dHB1dERpc3BhdGNoZXIgYW5kCi0vLyBBdWRpb1NvdXJjZUNhbGxiYWNrIGludGVyZmFjZXMuCi0KLSNpZm5kZWYgTUVESUFfQVVESU9fQVVESU9fT1VUUFVUX01JWEVSX0hfCi0jZGVmaW5lIE1FRElBX0FVRElPX0FVRElPX09VVFBVVF9NSVhFUl9IXwotCi0jaW5jbHVkZSA8bWFwPgotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvd2Vha19wdHIuaCIKLSNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi9sb2NrLmgiCi0jaW5jbHVkZSAiYmFzZS90aW1lci5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX2lvLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fbWFuYWdlci5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9kaXNwYXRjaGVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fcGFyYW1ldGVycy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBNRURJQV9FWFBPUlQgQXVkaW9PdXRwdXRNaXhlcgotICAgIDogcHVibGljIEF1ZGlvT3V0cHV0RGlzcGF0Y2hlciwKLSAgICAgIHB1YmxpYyBBdWRpb091dHB1dFN0cmVhbTo6QXVkaW9Tb3VyY2VDYWxsYmFjayB7Ci0gcHVibGljOgotICBBdWRpb091dHB1dE1peGVyKEF1ZGlvTWFuYWdlciogYXVkaW9fbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpUaW1lRGVsdGEmIGNsb3NlX2RlbGF5KTsKLQotICAvLyBBdWRpb091dHB1dERpc3BhdGNoZXIgaW50ZXJmYWNlLgotICB2aXJ0dWFsIGJvb2wgT3BlblN0cmVhbSgpIE9WRVJSSURFOwotICB2aXJ0dWFsIGJvb2wgU3RhcnRTdHJlYW0oQXVkaW9PdXRwdXRTdHJlYW06OkF1ZGlvU291cmNlQ2FsbGJhY2sqIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9PdXRwdXRQcm94eSogc3RyZWFtX3Byb3h5KSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0b3BTdHJlYW0oQXVkaW9PdXRwdXRQcm94eSogc3RyZWFtX3Byb3h5KSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0cmVhbVZvbHVtZVNldChBdWRpb091dHB1dFByb3h5KiBzdHJlYW1fcHJveHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZvbHVtZSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBDbG9zZVN0cmVhbShBdWRpb091dHB1dFByb3h5KiBzdHJlYW1fcHJveHkpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU2h1dGRvd24oKSBPVkVSUklERTsKLQotICAvLyBBdWRpb1NvdXJjZUNhbGxiYWNrIGludGVyZmFjZS4KLSAgdmlydHVhbCB1aW50MzIgT25Nb3JlRGF0YSh1aW50OCogZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgbWF4X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJzU3RhdGUgYnVmZmVyc19zdGF0ZSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBPbkVycm9yKEF1ZGlvT3V0cHV0U3RyZWFtKiBzdHJlYW0sIGludCBjb2RlKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFdhaXRUaWxsRGF0YVJlYWR5KCkgT1ZFUlJJREU7Ci0KLSBwcml2YXRlOgotICBmcmllbmQgY2xhc3MgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8QXVkaW9PdXRwdXRNaXhlcj47Ci0gIHZpcnR1YWwgfkF1ZGlvT3V0cHV0TWl4ZXIoKTsKLQotICAvLyBDYWxsZWQgYnkgfGNsb3NlX3RpbWVyX3wuIENsb3NlcyBwaHlzaWNhbCBzdHJlYW0uCi0gIHZvaWQgQ2xvc2VQaHlzaWNhbFN0cmVhbSgpOwotCi0gIC8vIFRoZSB8bG9ja198IG11c3QgYmUgYWNxdWlyZWQgd2hlbmV2ZXIgd2UgbW9kaWZ5IHxwcm94aWVzX3wgaW4gdGhlIGF1ZGlvCi0gIC8vIG1hbmFnZXIgdGhyZWFkIG9yIGFjY2Vzc2luZyBpdCBpbiB0aGUgaGFyZHdhcmUgYXVkaW8gdGhyZWFkLiBSZWFkIGluIHRoZQotICAvLyBhdWRpbyBtYW5hZ2VyIHRocmVhZCBpcyBzYWZlLgotICBiYXNlOjpMb2NrIGxvY2tfOwotCi0gIC8vIExpc3Qgb2YgYXVkaW8gb3V0cHV0IHByb3hpZXMgY3VycmVudGx5IGJlaW5nIHBsYXllZC4KLSAgLy8gRm9yIGV2ZXJ5IHByb3h5IHdlIHN0b3JlIGF1eCBzdHJ1Y3R1cmUgY29udGFpbmluZyBkYXRhIG5lY2Vzc2FyeSBmb3IKLSAgLy8gbWl4aW5nLgotICBzdHJ1Y3QgUHJveHlEYXRhIHsKLSAgICBBdWRpb091dHB1dFN0cmVhbTo6QXVkaW9Tb3VyY2VDYWxsYmFjayogYXVkaW9fc291cmNlX2NhbGxiYWNrOwotICAgIGRvdWJsZSB2b2x1bWU7Ci0gICAgaW50IHBlbmRpbmdfYnl0ZXM7Ci0gIH07Ci0gIHR5cGVkZWYgc3RkOjptYXA8QXVkaW9PdXRwdXRQcm94eSosIFByb3h5RGF0YT4gUHJveHlNYXA7Ci0gIFByb3h5TWFwIHByb3hpZXNfOwotCi0gIC8vIFBoeXNpY2FsIHN0cmVhbSBmb3IgdGhpcyBtaXhlci4KLSAgc2NvcGVkX3B0cjxBdWRpb091dHB1dFN0cmVhbT4gcGh5c2ljYWxfc3RyZWFtXzsKLQotICAvLyBUZW1wb3JhcnkgYnVmZmVyIHVzZWQgd2hlbiBtaXhpbmcuIEFsbG9jYXRlZCBpbiB0aGUgY29uc3RydWN0b3IKLSAgLy8gdG8gYXZvaWQgY29uc3RhbnQgYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gaW4gdGhlIGNhbGxiYWNrLgotICBzY29wZWRfYXJyYXk8dWludDg+IG1peGVyX2RhdGFfOwotCi0gIC8vIFVzZWQgdG8gcG9zdCBkZWxheWVkIHRhc2tzIHRvIG91cnNlbHZlcyB0aGF0IHdlIGNhbmNlbCBpbnNpZGUgU2h1dGRvd24oKS4KLSAgYmFzZTo6V2Vha1B0ckZhY3Rvcnk8QXVkaW9PdXRwdXRNaXhlcj4gd2Vha190aGlzXzsKLSAgYmFzZTo6RGVsYXlUaW1lcjxBdWRpb091dHB1dE1peGVyPiBjbG9zZV90aW1lcl87Ci0KLSAgLy8gU2l6ZSBvZiBkYXRhIGluIGFsbCBpbi1mbGlnaHQgYnVmZmVycy4KLSAgaW50IHBlbmRpbmdfYnl0ZXNfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBdWRpb091dHB1dE1peGVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0FVRElPX0FVRElPX09VVFBVVF9NSVhFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9wcm94eS5jYyBiL3NyYy9tZWRpYS9hdWRpby9hdWRpb19vdXRwdXRfcHJveHkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MDkwNzkuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9wcm94eS5jYworKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19vdXRwdXRfcHJveHkuaCIKLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fbWFuYWdlci5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9kaXNwYXRjaGVyLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLUF1ZGlvT3V0cHV0UHJveHk6OkF1ZGlvT3V0cHV0UHJveHkoQXVkaW9PdXRwdXREaXNwYXRjaGVyKiBkaXNwYXRjaGVyKQotICAgIDogZGlzcGF0Y2hlcl8oZGlzcGF0Y2hlciksCi0gICAgICBzdGF0ZV8oa0NyZWF0ZWQpLAotICAgICAgdm9sdW1lXygxLjApIHsKLX0KLQotQXVkaW9PdXRwdXRQcm94eTo6fkF1ZGlvT3V0cHV0UHJveHkoKSB7Ci0gIERDSEVDSyhDYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBEQ0hFQ0soc3RhdGVfID09IGtDcmVhdGVkIHx8IHN0YXRlXyA9PSBrQ2xvc2VkKSA8PCAiU3RhdGUgaXM6ICIgPDwgc3RhdGVfOwotfQotCi1ib29sIEF1ZGlvT3V0cHV0UHJveHk6Ok9wZW4oKSB7Ci0gIERDSEVDSyhDYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBEQ0hFQ0tfRVEoc3RhdGVfLCBrQ3JlYXRlZCk7Ci0KLSAgaWYgKCFkaXNwYXRjaGVyXy0+T3BlblN0cmVhbSgpKSB7Ci0gICAgc3RhdGVfID0ga09wZW5FcnJvcjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBzdGF0ZV8gPSBrT3BlbmVkOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBBdWRpb091dHB1dFByb3h5OjpTdGFydChBdWRpb1NvdXJjZUNhbGxiYWNrKiBjYWxsYmFjaykgewotICBEQ0hFQ0soQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLSAgRENIRUNLX0VRKHN0YXRlXywga09wZW5lZCk7Ci0KLSAgaWYgKCFkaXNwYXRjaGVyXy0+U3RhcnRTdHJlYW0oY2FsbGJhY2ssIHRoaXMpKSB7Ci0gICAgc3RhdGVfID0ga1N0YXJ0RXJyb3I7Ci0gICAgY2FsbGJhY2stPk9uRXJyb3IodGhpcywgMCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHN0YXRlXyA9IGtQbGF5aW5nOwotfQotCi12b2lkIEF1ZGlvT3V0cHV0UHJveHk6OlN0b3AoKSB7Ci0gIERDSEVDSyhDYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBpZiAoc3RhdGVfICE9IGtQbGF5aW5nKQotICAgIHJldHVybjsKLQotICBkaXNwYXRjaGVyXy0+U3RvcFN0cmVhbSh0aGlzKTsKLSAgc3RhdGVfID0ga09wZW5lZDsKLX0KLQotdm9pZCBBdWRpb091dHB1dFByb3h5OjpTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgewotICBEQ0hFQ0soQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLSAgdm9sdW1lXyA9IHZvbHVtZTsKLSAgZGlzcGF0Y2hlcl8tPlN0cmVhbVZvbHVtZVNldCh0aGlzLCB2b2x1bWUpOwotfQotCi12b2lkIEF1ZGlvT3V0cHV0UHJveHk6OkdldFZvbHVtZShkb3VibGUqIHZvbHVtZSkgewotICBEQ0hFQ0soQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLSAgKnZvbHVtZSA9IHZvbHVtZV87Ci19Ci0KLXZvaWQgQXVkaW9PdXRwdXRQcm94eTo6Q2xvc2UoKSB7Ci0gIERDSEVDSyhDYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBEQ0hFQ0soc3RhdGVfID09IGtDcmVhdGVkIHx8IHN0YXRlXyA9PSBrT3BlbkVycm9yIHx8IHN0YXRlXyA9PSBrT3BlbmVkIHx8Ci0gICAgICAgICBzdGF0ZV8gPT0ga1N0YXJ0RXJyb3IpOwotCi0gIC8vIGtTdGFydEVycm9yIG1lYW5zIE9wZW5TdHJlYW0oKSBzdWNjZWVkZWQgYW5kIHRoZSBzdHJlYW0gbXVzdCBiZSBjbG9zZWQKLSAgLy8gYmVmb3JlIGRlc3RydWN0aW9uLgotICBpZiAoc3RhdGVfICE9IGtDcmVhdGVkICYmIHN0YXRlXyAhPSBrT3BlbkVycm9yKQotICAgIGRpc3BhdGNoZXJfLT5DbG9zZVN0cmVhbSh0aGlzKTsKLQotICBzdGF0ZV8gPSBrQ2xvc2VkOwotCi0gIC8vIERlbGV0ZSB0aGUgb2JqZWN0IG5vdyBsaWtlIGlzIGRvbmUgaW4gdGhlIENsb3NlKCkgaW1wbGVtZW50YXRpb24gb2YKLSAgLy8gcGh5c2ljYWwgc3RyZWFtIG9iamVjdHMuICBJZiB3ZSBkZWxldGUgdGhlIG9iamVjdCB2aWEgRGVsZXRlU29vbiwgd2UKLSAgLy8gdW5uZWNlc3NhcmlseSBjb21wbGljYXRlIHRoZSBTaHV0ZG93biBwcm9jZWR1cmUgb2YgdGhlCi0gIC8vIGRpc3BhdGNoZXIrYXVkaW8gbWFuYWdlci4KLSAgZGVsZXRlIHRoaXM7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9wcm94eS5oIGIvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9wcm94eS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmRhYjUxLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb19vdXRwdXRfcHJveHkuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfQVVESU9fQVVESU9fT1VUUFVUX1BST1hZX0hfCi0jZGVmaW5lIE1FRElBX0FVRElPX0FVRElPX09VVFBVVF9QUk9YWV9IXwotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvbm9uX3RocmVhZF9zYWZlLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9faW8uaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19wYXJhbWV0ZXJzLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIEF1ZGlvT3V0cHV0RGlzcGF0Y2hlcjsKLQotLy8gQXVkaW9PdXRwdXRQcm94eSBpcyBhbiBhdWRpbyBvdHB1dCBzdHJlYW0gdGhhdCB1c2VzIHJlc291cmNlcyBtb3JlCi0vLyBlZmZpY2llbnRseSB0aGFuIGEgcmVndWxhciBhdWRpbyBvdXRwdXQgc3RyZWFtOiBpdCBvcGVucyBhdWRpbwotLy8gZGV2aWNlIG9ubHkgd2hlbiBzb3VuZCBpcyBwbGF5aW5nLCBpLmUuIGJldHdlZW4gU3RhcnQoKSBhbmQgU3RvcCgpCi0vLyAodGhlcmUgaXMgc3RpbGwgb25lIHBoeXNpY2FsIHN0cmVhbSBwZXIgZWFjaCBhdWRpbyBvdXRwdXQgcHJveHkgaW4KLS8vIHBsYXlpbmcgc3RhdGUpLgotLy8KLS8vIEF1ZGlvT3V0cHV0UHJveHkgdXNlcyBBdWRpb091dHB1dERpc3BhdGNoZXIgdG8gb3BlbiBhbmQgY2xvc2UKLS8vIHBoeXNpY2FsIG91dHB1dCBzdHJlYW1zLgotY2xhc3MgTUVESUFfRVhQT1JUIEF1ZGlvT3V0cHV0UHJveHkKLSAgOiBwdWJsaWMgQXVkaW9PdXRwdXRTdHJlYW0sCi0gICAgcHVibGljIE5PTl9FWFBPUlRFRF9CQVNFKGJhc2U6Ok5vblRocmVhZFNhZmUpIHsKLSBwdWJsaWM6Ci0gIC8vIENhbGxlciBrZWVwcyBvd25lcnNoaXAgb2YgfGRpc3BhdGNoZXJ8LgotICBleHBsaWNpdCBBdWRpb091dHB1dFByb3h5KEF1ZGlvT3V0cHV0RGlzcGF0Y2hlciogZGlzcGF0Y2hlcik7Ci0KLSAgLy8gQXVkaW9PdXRwdXRTdHJlYW0gaW50ZXJmYWNlLgotICB2aXJ0dWFsIGJvb2wgT3BlbigpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU3RhcnQoQXVkaW9Tb3VyY2VDYWxsYmFjayogY2FsbGJhY2spIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU3RvcCgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgR2V0Vm9sdW1lKGRvdWJsZSogdm9sdW1lKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIENsb3NlKCkgT1ZFUlJJREU7Ci0KLSBwcml2YXRlOgotICBlbnVtIFN0YXRlIHsKLSAgICBrQ3JlYXRlZCwKLSAgICBrT3BlbmVkLAotICAgIGtQbGF5aW5nLAotICAgIGtDbG9zZWQsCi0gICAga09wZW5FcnJvciwKLSAgICBrU3RhcnRFcnJvciwKLSAgfTsKLQotICB2aXJ0dWFsIH5BdWRpb091dHB1dFByb3h5KCk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxBdWRpb091dHB1dERpc3BhdGNoZXI+IGRpc3BhdGNoZXJfOwotICBTdGF0ZSBzdGF0ZV87Ci0KLSAgLy8gTmVlZCB0byBzYXZlIHZvbHVtZSBoZXJlLCBzbyB0aGF0IHdlIGNhbiByZXN0b3JlIGl0IGluIGNhc2UgdGhlIHN0cmVhbQotICAvLyBpcyBzdG9wcGVkLCBhbmQgdGhlbiBzdGFydGVkIGFnYWluLgotICBkb3VibGUgdm9sdW1lXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQXVkaW9PdXRwdXRQcm94eSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9BVURJT19BVURJT19PVVRQVVRfUFJPWFlfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb19vdXRwdXRfcHJveHlfdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fb3V0cHV0X3Byb3h5X3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzEzODU2Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb19vdXRwdXRfcHJveHlfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5MDAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvY29tbWFuZF9saW5lLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcF9wcm94eS5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9kaXNwYXRjaGVyX2ltcGwuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19vdXRwdXRfcHJveHkuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19vdXRwdXRfcmVzYW1wbGVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fbWFuYWdlci5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX21hbmFnZXJfYmFzZS5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2Zha2VfYXVkaW9fb3V0cHV0X3N0cmVhbS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfc3dpdGNoZXMuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotLy8gVE9ETyhkYWxlY3VydGlzKTogVGVtcG9yYXJpbHkgZGlzYWJsZWQgd2hpbGUgc3dpdGNoaW5nIHBpcGVsaW5lIHRvIHVzZSBmbG9hdCwKLS8vIGh0dHA6Ly9jcmJ1Zy5jb20vMTE0NzAwCi0jaWYgZGVmaW5lZChFTkFCTEVfQVVESU9fTUlYRVIpCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fb3V0cHV0X21peGVyLmgiCi0jZW5kaWYKLQotdXNpbmcgOjp0ZXN0aW5nOjpfOwotdXNpbmcgOjp0ZXN0aW5nOjpBbGxPZjsKLXVzaW5nIDo6dGVzdGluZzo6RG9BbGw7Ci11c2luZyA6OnRlc3Rpbmc6OkZpZWxkOwotdXNpbmcgOjp0ZXN0aW5nOjpNb2NrOwotdXNpbmcgOjp0ZXN0aW5nOjpOb3ROdWxsOwotdXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47Ci11c2luZyA6OnRlc3Rpbmc6OlNldEFycmF5QXJndW1lbnQ7Ci11c2luZyBtZWRpYTo6QXVkaW9CdXM7Ci11c2luZyBtZWRpYTo6QXVkaW9CdWZmZXJzU3RhdGU7Ci11c2luZyBtZWRpYTo6QXVkaW9JbnB1dFN0cmVhbTsKLXVzaW5nIG1lZGlhOjpBdWRpb01hbmFnZXI7Ci11c2luZyBtZWRpYTo6QXVkaW9NYW5hZ2VyQmFzZTsKLXVzaW5nIG1lZGlhOjpBdWRpb091dHB1dERpc3BhdGNoZXI7Ci11c2luZyBtZWRpYTo6QXVkaW9PdXRwdXRQcm94eTsKLXVzaW5nIG1lZGlhOjpBdWRpb091dHB1dFN0cmVhbTsKLXVzaW5nIG1lZGlhOjpBdWRpb1BhcmFtZXRlcnM7Ci11c2luZyBtZWRpYTo6RmFrZUF1ZGlvT3V0cHV0U3RyZWFtOwotCi1uYW1lc3BhY2UgewotCi1zdGF0aWMgY29uc3QgaW50IGtUZXN0Q2xvc2VEZWxheU1zID0gMTAwOwotCi0vLyBVc2VkIGluIHRoZSB0ZXN0IHdoZXJlIHdlIGRvbid0IHdhbnQgYSBzdHJlYW0gdG8gYmUgY2xvc2VkIHVuZXhwZWN0ZWRseS4KLXN0YXRpYyBjb25zdCBpbnQga1Rlc3RCaWdDbG9zZURlbGF5U2Vjb25kcyA9IDEwMDA7Ci0KLS8vIERlbGF5IGJldHdlZW4gY2FsbGJhY2tzIHRvIEF1ZGlvU291cmNlQ2FsbGJhY2s6Ok9uTW9yZURhdGEuCi1zdGF0aWMgY29uc3QgaW50IGtPbk1vcmVEYXRhQ2FsbGJhY2tEZWxheU1zID0gMTA7Ci0KLS8vIExldCBzdGFydCBydW4gbG9uZyBlbm91Z2ggZm9yIG1hbnkgT25Nb3JlRGF0YSBjYWxsYmFja3MgdG8gb2NjdXIuCi1zdGF0aWMgY29uc3QgaW50IGtTdGFydFJ1blRpbWVNcyA9IGtPbk1vcmVEYXRhQ2FsbGJhY2tEZWxheU1zICogMTA7Ci0KLWNsYXNzIE1vY2tBdWRpb091dHB1dFN0cmVhbSA6IHB1YmxpYyBBdWRpb091dHB1dFN0cmVhbSB7Ci0gcHVibGljOgotICBNb2NrQXVkaW9PdXRwdXRTdHJlYW0oQXVkaW9NYW5hZ2VyQmFzZSogbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKQotICAgICAgOiBzdGFydF9jYWxsZWRfKGZhbHNlKSwKLSAgICAgICAgc3RvcF9jYWxsZWRfKGZhbHNlKSwKLSAgICAgICAgcGFyYW1zXyhwYXJhbXMpLAotICAgICAgICBmYWtlX291dHB1dF9zdHJlYW1fKAotICAgICAgICAgICAgRmFrZUF1ZGlvT3V0cHV0U3RyZWFtOjpNYWtlRmFrZVN0cmVhbShtYW5hZ2VyLCBwYXJhbXNfKSkgewotICB9Ci0KLSAgdm9pZCBTdGFydChBdWRpb1NvdXJjZUNhbGxiYWNrKiBjYWxsYmFjaykgewotICAgIHN0YXJ0X2NhbGxlZF8gPSB0cnVlOwotICAgIGZha2Vfb3V0cHV0X3N0cmVhbV8tPlN0YXJ0KGNhbGxiYWNrKTsKLSAgfQotCi0gIHZvaWQgU3RvcCgpIHsKLSAgICBzdG9wX2NhbGxlZF8gPSB0cnVlOwotICAgIGZha2Vfb3V0cHV0X3N0cmVhbV8tPlN0b3AoKTsKLSAgfQotCi0gIH5Nb2NrQXVkaW9PdXRwdXRTdHJlYW0oKSB7fQotCi0gIGJvb2wgc3RhcnRfY2FsbGVkKCkgeyByZXR1cm4gc3RhcnRfY2FsbGVkXzsgfQotICBib29sIHN0b3BfY2FsbGVkKCkgeyByZXR1cm4gc3RvcF9jYWxsZWRfOyB9Ci0KLSAgTU9DS19NRVRIT0QwKE9wZW4sIGJvb2woKSk7Ci0gIE1PQ0tfTUVUSE9EMShTZXRWb2x1bWUsIHZvaWQoZG91YmxlIHZvbHVtZSkpOwotICBNT0NLX01FVEhPRDEoR2V0Vm9sdW1lLCB2b2lkKGRvdWJsZSogdm9sdW1lKSk7Ci0gIE1PQ0tfTUVUSE9EMChDbG9zZSwgdm9pZCgpKTsKLQotIHByaXZhdGU6Ci0gIGJvb2wgc3RhcnRfY2FsbGVkXzsKLSAgYm9vbCBzdG9wX2NhbGxlZF87Ci0gIEF1ZGlvUGFyYW1ldGVycyBwYXJhbXNfOwotICBzY29wZWRfcHRyPEF1ZGlvT3V0cHV0U3RyZWFtPiBmYWtlX291dHB1dF9zdHJlYW1fOwotfTsKLQotY2xhc3MgTW9ja0F1ZGlvTWFuYWdlciA6IHB1YmxpYyBBdWRpb01hbmFnZXJCYXNlIHsKLSBwdWJsaWM6Ci0gIE1vY2tBdWRpb01hbmFnZXIoKSB7fQotICB2aXJ0dWFsIH5Nb2NrQXVkaW9NYW5hZ2VyKCkgewotICAgIFNodXRkb3duKCk7Ci0gIH0KLQotICBNT0NLX01FVEhPRDAoSGFzQXVkaW9PdXRwdXREZXZpY2VzLCBib29sKCkpOwotICBNT0NLX01FVEhPRDAoSGFzQXVkaW9JbnB1dERldmljZXMsIGJvb2woKSk7Ci0gIE1PQ0tfTUVUSE9EMChHZXRBdWRpb0lucHV0RGV2aWNlTW9kZWwsIHN0cmluZzE2KCkpOwotICBNT0NLX01FVEhPRDEoTWFrZUF1ZGlvT3V0cHV0U3RyZWFtLCBBdWRpb091dHB1dFN0cmVhbSooCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcykpOwotICBNT0NLX01FVEhPRDEoTWFrZUF1ZGlvT3V0cHV0U3RyZWFtUHJveHksIEF1ZGlvT3V0cHV0U3RyZWFtKigKLSAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKSk7Ci0gIE1PQ0tfTUVUSE9EMihNYWtlQXVkaW9JbnB1dFN0cmVhbSwgQXVkaW9JbnB1dFN0cmVhbSooCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCkpOwotICBNT0NLX01FVEhPRDAoQ2FuU2hvd0F1ZGlvSW5wdXRTZXR0aW5ncywgYm9vbCgpKTsKLSAgTU9DS19NRVRIT0QwKFNob3dBdWRpb0lucHV0U2V0dGluZ3MsIHZvaWQoKSk7Ci0gIE1PQ0tfTUVUSE9EMChHZXRNZXNzYWdlTG9vcCwgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PigpKTsKLSAgTU9DS19NRVRIT0QxKEdldEF1ZGlvSW5wdXREZXZpY2VOYW1lcywgdm9pZCgKLSAgICAgIG1lZGlhOjpBdWRpb0RldmljZU5hbWVzKiBkZXZpY2VfbmFtZSkpOwotICBNT0NLX01FVEhPRDAoSXNSZWNvcmRpbmdJblByb2Nlc3MsIGJvb2woKSk7Ci0KLSAgTU9DS19NRVRIT0QxKE1ha2VMaW5lYXJPdXRwdXRTdHJlYW0sIEF1ZGlvT3V0cHV0U3RyZWFtKigKLSAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKSk7Ci0gIE1PQ0tfTUVUSE9EMShNYWtlTG93TGF0ZW5jeU91dHB1dFN0cmVhbSwgQXVkaW9PdXRwdXRTdHJlYW0qKAotICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpKTsKLSAgTU9DS19NRVRIT0QyKE1ha2VMaW5lYXJJbnB1dFN0cmVhbSwgQXVkaW9JbnB1dFN0cmVhbSooCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCkpOwotICBNT0NLX01FVEhPRDIoTWFrZUxvd0xhdGVuY3lJbnB1dFN0cmVhbSwgQXVkaW9JbnB1dFN0cmVhbSooCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCkpOwotfTsKLQotY2xhc3MgTW9ja0F1ZGlvU291cmNlQ2FsbGJhY2sgOiBwdWJsaWMgQXVkaW9PdXRwdXRTdHJlYW06OkF1ZGlvU291cmNlQ2FsbGJhY2sgewotIHB1YmxpYzoKLSAgaW50IE9uTW9yZURhdGEoQXVkaW9CdXMqIGF1ZGlvX2J1cywgQXVkaW9CdWZmZXJzU3RhdGUgYnVmZmVyc19zdGF0ZSkgewotICAgIGF1ZGlvX2J1cy0+WmVybygpOwotICAgIHJldHVybiBhdWRpb19idXMtPmZyYW1lcygpOwotICB9Ci0gIGludCBPbk1vcmVJT0RhdGEoQXVkaW9CdXMqIHNvdXJjZSwgQXVkaW9CdXMqIGRlc3QsCi0gICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJzU3RhdGUgYnVmZmVyc19zdGF0ZSkgewotICAgIHJldHVybiBPbk1vcmVEYXRhKGRlc3QsIGJ1ZmZlcnNfc3RhdGUpOwotICB9Ci0gIE1PQ0tfTUVUSE9EMihPbkVycm9yLCB2b2lkKEF1ZGlvT3V0cHV0U3RyZWFtKiBzdHJlYW0sIGludCBjb2RlKSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgQXVkaW9PdXRwdXRQcm94eVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgRVhQRUNUX0NBTEwobWFuYWdlcl8sIEdldE1lc3NhZ2VMb29wKCkpCi0gICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4obWVzc2FnZV9sb29wXy5tZXNzYWdlX2xvb3BfcHJveHkoKSkpOwotICAgIEluaXREaXNwYXRjaGVyKGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyhrVGVzdENsb3NlRGVsYXlNcykpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgIC8vIEFsbCBwYXVzZWQgcHJveGllcyBzaG91bGQgaGF2ZSBiZWVuIGNsb3NlZCBhdCB0aGlzIHBvaW50LgotICAgIEVYUEVDVF9FUSgwdSwgZGlzcGF0Y2hlcl9pbXBsXy0+cGF1c2VkX3Byb3hpZXNfKTsKLQotICAgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGZyZWUgYWxsIHByb3h5IG9iamVjdHMgdGhhdCBoYXZlIGJlZW4KLSAgICAvLyBjbG9zZWQgYnkgdGhlIHRlc3QuCi0gICAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBJbml0RGlzcGF0Y2hlcihiYXNlOjpUaW1lRGVsdGEgY2xvc2VfZGVsYXkpIHsKLSAgICAvLyBVc2UgYSBsb3cgc2FtcGxlIHJhdGUgYW5kIGxhcmdlIGJ1ZmZlciBzaXplIHdoZW4gdGVzdGluZyBvdGhlcndpc2UgdGhlCi0gICAgLy8gRmFrZUF1ZGlvT3V0cHV0U3RyZWFtIHdpbGwga2VlcCB0aGUgbWVzc2FnZSBsb29wIGJ1c3kgaW5kZWZpbml0ZWx5OyBpLmUuLAotICAgIC8vIFJ1blVudGlsSWRsZSgpIHdpbGwgbmV2ZXIgdGVybWluYXRlLgotICAgIHBhcmFtc18gPSBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9MQVlPVVRfU1RFUkVPLCA4MDAwLCAxNiwgMjA0OCk7Ci0gICAgZGlzcGF0Y2hlcl9pbXBsXyA9IG5ldyBBdWRpb091dHB1dERpc3BhdGNoZXJJbXBsKCZtYW5hZ2VyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlX2RlbGF5KTsKLSNpZiBkZWZpbmVkKEVOQUJMRV9BVURJT19NSVhFUikKLSAgICBtaXhlcl8gPSBuZXcgQXVkaW9PdXRwdXRNaXhlcigmbWFuYWdlcigpLCBwYXJhbXNfLCBjbG9zZV9kZWxheSk7Ci0jZW5kaWYKLQotICAgIC8vIE5lY2Vzc2FyeSB0byBrbm93IGhvdyBsb25nIHRoZSBkaXNwYXRjaGVyIHdpbGwgd2FpdCBiZWZvcmUgcG9zdGluZwotICAgIC8vIFN0b3BTdHJlYW1UYXNrLgotICAgIHBhdXNlX2RlbGF5XyA9IGRpc3BhdGNoZXJfaW1wbF8tPnBhdXNlX2RlbGF5XzsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBPblN0YXJ0KCkge30KLQotICBNb2NrQXVkaW9NYW5hZ2VyJiBtYW5hZ2VyKCkgewotICAgIHJldHVybiBtYW5hZ2VyXzsKLSAgfQotCi0gIC8vIFdhaXQgZm9yIHRoZSBjbG9zZSB0aW1lciB0byBmaXJlLgotICB2b2lkIFdhaXRGb3JDbG9zZVRpbWVyKGNvbnN0IGludCB0aW1lcl9kZWxheV9tcykgewotICAgIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7ICAvLyBPcGVuVGFzaygpIG1heSByZXNldCB0aGUgdGltZXIuCi0gICAgYmFzZTo6UGxhdGZvcm1UaHJlYWQ6OlNsZWVwKAotICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHModGltZXJfZGVsYXlfbXMpICogMik7Ci0gICAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLSAgfQotCi0gIC8vIE1ldGhvZHMgdGhhdCBkbyBhY3R1YWwgdGVzdHMuCi0gIHZvaWQgT3BlbkFuZENsb3NlKEF1ZGlvT3V0cHV0RGlzcGF0Y2hlciogZGlzcGF0Y2hlcikgewotICAgIE1vY2tBdWRpb091dHB1dFN0cmVhbSBzdHJlYW0oJm1hbmFnZXJfLCBwYXJhbXNfKTsKLQotICAgIEVYUEVDVF9DQUxMKG1hbmFnZXIoKSwgTWFrZUF1ZGlvT3V0cHV0U3RyZWFtKF8pKQotICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKCZzdHJlYW0pKTsKLSAgICBFWFBFQ1RfQ0FMTChzdHJlYW0sIE9wZW4oKSkKLSAgICAgICAgLldpbGxPbmNlKFJldHVybih0cnVlKSk7Ci0gICAgRVhQRUNUX0NBTEwoc3RyZWFtLCBDbG9zZSgpKQotICAgICAgICAuVGltZXMoMSk7Ci0KLSAgICBBdWRpb091dHB1dFByb3h5KiBwcm94eSA9IG5ldyBBdWRpb091dHB1dFByb3h5KGRpc3BhdGNoZXIpOwotICAgIEVYUEVDVF9UUlVFKHByb3h5LT5PcGVuKCkpOwotICAgIHByb3h5LT5DbG9zZSgpOwotICAgIFdhaXRGb3JDbG9zZVRpbWVyKGtUZXN0Q2xvc2VEZWxheU1zKTsKLSAgfQotCi0gIC8vIENyZWF0ZSBhIHN0cmVhbSwgYW5kIHRoZW4gY2FsbHMgU3RhcnQoKSBhbmQgU3RvcCgpLgotICB2b2lkIFN0YXJ0QW5kU3RvcChBdWRpb091dHB1dERpc3BhdGNoZXIqIGRpc3BhdGNoZXIpIHsKLSAgICBNb2NrQXVkaW9PdXRwdXRTdHJlYW0gc3RyZWFtKCZtYW5hZ2VyXywgcGFyYW1zXyk7Ci0KLSAgICBFWFBFQ1RfQ0FMTChtYW5hZ2VyKCksIE1ha2VBdWRpb091dHB1dFN0cmVhbShfKSkKLSAgICAgICAgLldpbGxPbmNlKFJldHVybigmc3RyZWFtKSk7Ci0gICAgRVhQRUNUX0NBTEwoc3RyZWFtLCBPcGVuKCkpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4odHJ1ZSkpOwotICAgIEVYUEVDVF9DQUxMKHN0cmVhbSwgU2V0Vm9sdW1lKF8pKQotICAgICAgICAuVGltZXMoMSk7Ci0gICAgRVhQRUNUX0NBTEwoc3RyZWFtLCBDbG9zZSgpKQotICAgICAgICAuVGltZXMoMSk7Ci0KLSAgICBBdWRpb091dHB1dFByb3h5KiBwcm94eSA9IG5ldyBBdWRpb091dHB1dFByb3h5KGRpc3BhdGNoZXIpOwotICAgIEVYUEVDVF9UUlVFKHByb3h5LT5PcGVuKCkpOwotCi0gICAgcHJveHktPlN0YXJ0KCZjYWxsYmFja18pOwotICAgIE9uU3RhcnQoKTsKLSAgICBwcm94eS0+U3RvcCgpOwotCi0gICAgcHJveHktPkNsb3NlKCk7Ci0gICAgV2FpdEZvckNsb3NlVGltZXIoa1Rlc3RDbG9zZURlbGF5TXMpOwotICAgIEVYUEVDVF9UUlVFKHN0cmVhbS5zdG9wX2NhbGxlZCgpKTsKLSAgICBFWFBFQ1RfVFJVRShzdHJlYW0uc3RhcnRfY2FsbGVkKCkpOwotICB9Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgdGhlIHN0cmVhbSBpcyBjbG9zZWQgYWZ0ZXIgU3RvcCBpcyBjYWxsZWQuCi0gIHZvaWQgQ2xvc2VBZnRlclN0b3AoQXVkaW9PdXRwdXREaXNwYXRjaGVyKiBkaXNwYXRjaGVyKSB7Ci0gICAgTW9ja0F1ZGlvT3V0cHV0U3RyZWFtIHN0cmVhbSgmbWFuYWdlcl8sIHBhcmFtc18pOwotCi0gICAgRVhQRUNUX0NBTEwobWFuYWdlcigpLCBNYWtlQXVkaW9PdXRwdXRTdHJlYW0oXykpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4oJnN0cmVhbSkpOwotICAgIEVYUEVDVF9DQUxMKHN0cmVhbSwgT3BlbigpKQotICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKLSAgICBFWFBFQ1RfQ0FMTChzdHJlYW0sIFNldFZvbHVtZShfKSkKLSAgICAgICAgLlRpbWVzKDEpOwotICAgIEVYUEVDVF9DQUxMKHN0cmVhbSwgQ2xvc2UoKSkKLSAgICAgICAgLlRpbWVzKDEpOwotCi0gICAgQXVkaW9PdXRwdXRQcm94eSogcHJveHkgPSBuZXcgQXVkaW9PdXRwdXRQcm94eShkaXNwYXRjaGVyKTsKLSAgICBFWFBFQ1RfVFJVRShwcm94eS0+T3BlbigpKTsKLQotICAgIHByb3h5LT5TdGFydCgmY2FsbGJhY2tfKTsKLSAgICBPblN0YXJ0KCk7Ci0gICAgcHJveHktPlN0b3AoKTsKLQotICAgIC8vIFdhaXQgZm9yIFN0b3BTdHJlYW0oKSB0byBwb3N0IFN0b3BTdHJlYW1UYXNrKCkuCi0gICAgYmFzZTo6UGxhdGZvcm1UaHJlYWQ6OlNsZWVwKHBhdXNlX2RlbGF5XyAqIDIpOwotICAgIFdhaXRGb3JDbG9zZVRpbWVyKGtUZXN0Q2xvc2VEZWxheU1zKTsKLQotICAgIC8vIFZlcmlmeSBleHBlY3RhdGlvbiBiZWZvcmUgY2FsbGluZyBDbG9zZSgpLgotICAgIE1vY2s6OlZlcmlmeUFuZENsZWFyKCZzdHJlYW0pOwotCi0gICAgcHJveHktPkNsb3NlKCk7Ci0gICAgRVhQRUNUX1RSVUUoc3RyZWFtLnN0b3BfY2FsbGVkKCkpOwotICAgIEVYUEVDVF9UUlVFKHN0cmVhbS5zdGFydF9jYWxsZWQoKSk7Ci0gIH0KLQotICAvLyBDcmVhdGUgdHdvIHN0cmVhbXMsIGJ1dCBkb24ndCBzdGFydCB0aGVtLiBPbmx5IG9uZSBkZXZpY2UgbXVzdCBiZSBvcGVuLgotICB2b2lkIFR3b1N0cmVhbXMoQXVkaW9PdXRwdXREaXNwYXRjaGVyKiBkaXNwYXRjaGVyKSB7Ci0gICAgTW9ja0F1ZGlvT3V0cHV0U3RyZWFtIHN0cmVhbSgmbWFuYWdlcl8sIHBhcmFtc18pOwotCi0gICAgRVhQRUNUX0NBTEwobWFuYWdlcigpLCBNYWtlQXVkaW9PdXRwdXRTdHJlYW0oXykpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4oJnN0cmVhbSkpOwotICAgIEVYUEVDVF9DQUxMKHN0cmVhbSwgT3BlbigpKQotICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKLSAgICBFWFBFQ1RfQ0FMTChzdHJlYW0sIENsb3NlKCkpCi0gICAgICAgIC5UaW1lcygxKTsKLQotICAgIEF1ZGlvT3V0cHV0UHJveHkqIHByb3h5MSA9IG5ldyBBdWRpb091dHB1dFByb3h5KGRpc3BhdGNoZXIpOwotICAgIEF1ZGlvT3V0cHV0UHJveHkqIHByb3h5MiA9IG5ldyBBdWRpb091dHB1dFByb3h5KGRpc3BhdGNoZXIpOwotICAgIEVYUEVDVF9UUlVFKHByb3h5MS0+T3BlbigpKTsKLSAgICBFWFBFQ1RfVFJVRShwcm94eTItPk9wZW4oKSk7Ci0gICAgcHJveHkxLT5DbG9zZSgpOwotICAgIHByb3h5Mi0+Q2xvc2UoKTsKLSAgICBXYWl0Rm9yQ2xvc2VUaW1lcihrVGVzdENsb3NlRGVsYXlNcyk7Ci0gICAgRVhQRUNUX0ZBTFNFKHN0cmVhbS5zdG9wX2NhbGxlZCgpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoc3RyZWFtLnN0YXJ0X2NhbGxlZCgpKTsKLSAgfQotCi0gIC8vIE9wZW4oKSBtZXRob2QgZmFpbGVkLgotICB2b2lkIE9wZW5GYWlsZWQoQXVkaW9PdXRwdXREaXNwYXRjaGVyKiBkaXNwYXRjaGVyKSB7Ci0gICAgTW9ja0F1ZGlvT3V0cHV0U3RyZWFtIHN0cmVhbSgmbWFuYWdlcl8sIHBhcmFtc18pOwotCi0gICAgRVhQRUNUX0NBTEwobWFuYWdlcigpLCBNYWtlQXVkaW9PdXRwdXRTdHJlYW0oXykpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4oJnN0cmVhbSkpOwotICAgIEVYUEVDVF9DQUxMKHN0cmVhbSwgT3BlbigpKQotICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKGZhbHNlKSk7Ci0gICAgRVhQRUNUX0NBTEwoc3RyZWFtLCBDbG9zZSgpKQotICAgICAgICAuVGltZXMoMSk7Ci0KLSAgICBBdWRpb091dHB1dFByb3h5KiBwcm94eSA9IG5ldyBBdWRpb091dHB1dFByb3h5KGRpc3BhdGNoZXIpOwotICAgIEVYUEVDVF9GQUxTRShwcm94eS0+T3BlbigpKTsKLSAgICBwcm94eS0+Q2xvc2UoKTsKLSAgICBXYWl0Rm9yQ2xvc2VUaW1lcihrVGVzdENsb3NlRGVsYXlNcyk7Ci0gICAgRVhQRUNUX0ZBTFNFKHN0cmVhbS5zdG9wX2NhbGxlZCgpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoc3RyZWFtLnN0YXJ0X2NhbGxlZCgpKTsKLSAgfQotCi0gIHZvaWQgQ3JlYXRlQW5kV2FpdChBdWRpb091dHB1dERpc3BhdGNoZXIqIGRpc3BhdGNoZXIpIHsKLSAgICBNb2NrQXVkaW9PdXRwdXRTdHJlYW0gc3RyZWFtKCZtYW5hZ2VyXywgcGFyYW1zXyk7Ci0KLSAgICBFWFBFQ1RfQ0FMTChtYW5hZ2VyKCksIE1ha2VBdWRpb091dHB1dFN0cmVhbShfKSkKLSAgICAgICAgLldpbGxPbmNlKFJldHVybigmc3RyZWFtKSk7Ci0gICAgRVhQRUNUX0NBTEwoc3RyZWFtLCBPcGVuKCkpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4odHJ1ZSkpOwotICAgIEVYUEVDVF9DQUxMKHN0cmVhbSwgQ2xvc2UoKSkKLSAgICAgICAgLlRpbWVzKDEpOwotCi0gICAgQXVkaW9PdXRwdXRQcm94eSogcHJveHkgPSBuZXcgQXVkaW9PdXRwdXRQcm94eShkaXNwYXRjaGVyKTsKLSAgICBFWFBFQ1RfVFJVRShwcm94eS0+T3BlbigpKTsKLQotICAgIC8vIFNpbXVsYXRlIGEgZGVsYXkuCi0gICAgYmFzZTo6UGxhdGZvcm1UaHJlYWQ6OlNsZWVwKAotICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoa1Rlc3RDbG9zZURlbGF5TXMpICogMik7Ci0gICAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLQotICAgIC8vIFZlcmlmeSBleHBlY3RhdGlvbiBiZWZvcmUgY2FsbGluZyBDbG9zZSgpLgotICAgIE1vY2s6OlZlcmlmeUFuZENsZWFyKCZzdHJlYW0pOwotCi0gICAgcHJveHktPkNsb3NlKCk7Ci0gICAgRVhQRUNUX0ZBTFNFKHN0cmVhbS5zdG9wX2NhbGxlZCgpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoc3RyZWFtLnN0YXJ0X2NhbGxlZCgpKTsKLSAgfQotCi0gIHZvaWQgVHdvU3RyZWFtc19PbmVQbGF5aW5nKEF1ZGlvT3V0cHV0RGlzcGF0Y2hlciogZGlzcGF0Y2hlcikgewotICAgIE1vY2tBdWRpb091dHB1dFN0cmVhbSBzdHJlYW0xKCZtYW5hZ2VyXywgcGFyYW1zXyk7Ci0gICAgTW9ja0F1ZGlvT3V0cHV0U3RyZWFtIHN0cmVhbTIoJm1hbmFnZXJfLCBwYXJhbXNfKTsKLQotICAgIEVYUEVDVF9DQUxMKG1hbmFnZXIoKSwgTWFrZUF1ZGlvT3V0cHV0U3RyZWFtKF8pKQotICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKCZzdHJlYW0xKSkKLSAgICAgICAgLldpbGxPbmNlKFJldHVybigmc3RyZWFtMikpOwotCi0gICAgRVhQRUNUX0NBTEwoc3RyZWFtMSwgT3BlbigpKQotICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKLSAgICBFWFBFQ1RfQ0FMTChzdHJlYW0xLCBTZXRWb2x1bWUoXykpCi0gICAgICAgIC5UaW1lcygxKTsKLSAgICBFWFBFQ1RfQ0FMTChzdHJlYW0xLCBDbG9zZSgpKQotICAgICAgICAuVGltZXMoMSk7Ci0KLSAgICBFWFBFQ1RfQ0FMTChzdHJlYW0yLCBPcGVuKCkpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4odHJ1ZSkpOwotICAgIEVYUEVDVF9DQUxMKHN0cmVhbTIsIENsb3NlKCkpCi0gICAgICAgIC5UaW1lcygxKTsKLQotICAgIEF1ZGlvT3V0cHV0UHJveHkqIHByb3h5MSA9IG5ldyBBdWRpb091dHB1dFByb3h5KGRpc3BhdGNoZXIpOwotICAgIEF1ZGlvT3V0cHV0UHJveHkqIHByb3h5MiA9IG5ldyBBdWRpb091dHB1dFByb3h5KGRpc3BhdGNoZXIpOwotICAgIEVYUEVDVF9UUlVFKHByb3h5MS0+T3BlbigpKTsKLSAgICBFWFBFQ1RfVFJVRShwcm94eTItPk9wZW4oKSk7Ci0KLSAgICBwcm94eTEtPlN0YXJ0KCZjYWxsYmFja18pOwotICAgIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci0gICAgT25TdGFydCgpOwotICAgIHByb3h5MS0+U3RvcCgpOwotCi0gICAgcHJveHkxLT5DbG9zZSgpOwotICAgIHByb3h5Mi0+Q2xvc2UoKTsKLSAgICBFWFBFQ1RfVFJVRShzdHJlYW0xLnN0b3BfY2FsbGVkKCkpOwotICAgIEVYUEVDVF9UUlVFKHN0cmVhbTEuc3RhcnRfY2FsbGVkKCkpOwotICAgIEVYUEVDVF9GQUxTRShzdHJlYW0yLnN0b3BfY2FsbGVkKCkpOwotICAgIEVYUEVDVF9GQUxTRShzdHJlYW0yLnN0YXJ0X2NhbGxlZCgpKTsKLSAgfQotCi0gIHZvaWQgVHdvU3RyZWFtc19Cb3RoUGxheWluZyhBdWRpb091dHB1dERpc3BhdGNoZXIqIGRpc3BhdGNoZXIpIHsKLSAgICBNb2NrQXVkaW9PdXRwdXRTdHJlYW0gc3RyZWFtMSgmbWFuYWdlcl8sIHBhcmFtc18pOwotICAgIE1vY2tBdWRpb091dHB1dFN0cmVhbSBzdHJlYW0yKCZtYW5hZ2VyXywgcGFyYW1zXyk7Ci0KLSAgICBFWFBFQ1RfQ0FMTChtYW5hZ2VyKCksIE1ha2VBdWRpb091dHB1dFN0cmVhbShfKSkKLSAgICAgICAgLldpbGxPbmNlKFJldHVybigmc3RyZWFtMSkpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4oJnN0cmVhbTIpKTsKLQotICAgIEVYUEVDVF9DQUxMKHN0cmVhbTEsIE9wZW4oKSkKLSAgICAgICAgLldpbGxPbmNlKFJldHVybih0cnVlKSk7Ci0gICAgRVhQRUNUX0NBTEwoc3RyZWFtMSwgU2V0Vm9sdW1lKF8pKQotICAgICAgICAuVGltZXMoMSk7Ci0gICAgRVhQRUNUX0NBTEwoc3RyZWFtMSwgQ2xvc2UoKSkKLSAgICAgICAgLlRpbWVzKDEpOwotCi0gICAgRVhQRUNUX0NBTEwoc3RyZWFtMiwgT3BlbigpKQotICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKLSAgICBFWFBFQ1RfQ0FMTChzdHJlYW0yLCBTZXRWb2x1bWUoXykpCi0gICAgICAgIC5UaW1lcygxKTsKLSAgICBFWFBFQ1RfQ0FMTChzdHJlYW0yLCBDbG9zZSgpKQotICAgICAgICAuVGltZXMoMSk7Ci0KLSAgICBBdWRpb091dHB1dFByb3h5KiBwcm94eTEgPSBuZXcgQXVkaW9PdXRwdXRQcm94eShkaXNwYXRjaGVyKTsKLSAgICBBdWRpb091dHB1dFByb3h5KiBwcm94eTIgPSBuZXcgQXVkaW9PdXRwdXRQcm94eShkaXNwYXRjaGVyKTsKLSAgICBFWFBFQ1RfVFJVRShwcm94eTEtPk9wZW4oKSk7Ci0gICAgRVhQRUNUX1RSVUUocHJveHkyLT5PcGVuKCkpOwotCi0gICAgcHJveHkxLT5TdGFydCgmY2FsbGJhY2tfKTsKLSAgICBwcm94eTItPlN0YXJ0KCZjYWxsYmFja18pOwotICAgIE9uU3RhcnQoKTsKLSAgICBwcm94eTEtPlN0b3AoKTsKLSAgICBwcm94eTItPlN0b3AoKTsKLQotICAgIHByb3h5MS0+Q2xvc2UoKTsKLSAgICBwcm94eTItPkNsb3NlKCk7Ci0gICAgRVhQRUNUX1RSVUUoc3RyZWFtMS5zdG9wX2NhbGxlZCgpKTsKLSAgICBFWFBFQ1RfVFJVRShzdHJlYW0xLnN0YXJ0X2NhbGxlZCgpKTsKLSAgICBFWFBFQ1RfVFJVRShzdHJlYW0yLnN0b3BfY2FsbGVkKCkpOwotICAgIEVYUEVDVF9UUlVFKHN0cmVhbTIuc3RhcnRfY2FsbGVkKCkpOwotICB9Ci0KLSAgdm9pZCBTdGFydEZhaWxlZChBdWRpb091dHB1dERpc3BhdGNoZXIqIGRpc3BhdGNoZXIpIHsKLSAgICBNb2NrQXVkaW9PdXRwdXRTdHJlYW0gc3RyZWFtKCZtYW5hZ2VyXywgcGFyYW1zXyk7Ci0KLSAgICBFWFBFQ1RfQ0FMTChtYW5hZ2VyKCksIE1ha2VBdWRpb091dHB1dFN0cmVhbShfKSkKLSAgICAgICAgLldpbGxPbmNlKFJldHVybigmc3RyZWFtKSk7Ci0gICAgRVhQRUNUX0NBTEwoc3RyZWFtLCBPcGVuKCkpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4odHJ1ZSkpOwotICAgIEVYUEVDVF9DQUxMKHN0cmVhbSwgQ2xvc2UoKSkKLSAgICAgICAgLlRpbWVzKDEpOwotCi0gICAgQXVkaW9PdXRwdXRQcm94eSogcHJveHkgPSBuZXcgQXVkaW9PdXRwdXRQcm94eShkaXNwYXRjaGVyX2ltcGxfKTsKLSAgICBFWFBFQ1RfVFJVRShwcm94eS0+T3BlbigpKTsKLQotICAgIC8vIFNpbXVsYXRlIGEgZGVsYXkuCi0gICAgYmFzZTo6UGxhdGZvcm1UaHJlYWQ6OlNsZWVwKAotICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoa1Rlc3RDbG9zZURlbGF5TXMpICogMik7Ci0gICAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLQotICAgIC8vIFZlcmlmeSBleHBlY3RhdGlvbiBiZWZvcmUgY2FsbGluZyBDbG9zZSgpLgotICAgIE1vY2s6OlZlcmlmeUFuZENsZWFyKCZzdHJlYW0pOwotCi0gICAgLy8gfHN0cmVhbXwgaXMgY2xvc2VkIGF0IHRoaXMgcG9pbnQuIFN0YXJ0KCkgc2hvdWxkIHJlb3BlbiBpdCBhZ2Fpbi4KLSAgICBFWFBFQ1RfQ0FMTChtYW5hZ2VyKCksIE1ha2VBdWRpb091dHB1dFN0cmVhbShfKSkKLSAgICAgICAgLldpbGxPbmNlKFJldHVybihyZWludGVycHJldF9jYXN0PEF1ZGlvT3V0cHV0U3RyZWFtKj4oTlVMTCkpKTsKLQotICAgIEVYUEVDVF9DQUxMKGNhbGxiYWNrXywgT25FcnJvcihfLCBfKSkKLSAgICAgICAgLlRpbWVzKDEpOwotCi0gICAgcHJveHktPlN0YXJ0KCZjYWxsYmFja18pOwotCi0gICAgTW9jazo6VmVyaWZ5QW5kQ2xlYXIoJmNhbGxiYWNrXyk7Ci0KLSAgICBwcm94eS0+Q2xvc2UoKTsKLSAgfQotCi0gIE1lc3NhZ2VMb29wIG1lc3NhZ2VfbG9vcF87Ci0gIHNjb3BlZF9yZWZwdHI8QXVkaW9PdXRwdXREaXNwYXRjaGVySW1wbD4gZGlzcGF0Y2hlcl9pbXBsXzsKLSNpZiBkZWZpbmVkKEVOQUJMRV9BVURJT19NSVhFUikKLSAgc2NvcGVkX3JlZnB0cjxBdWRpb091dHB1dE1peGVyPiBtaXhlcl87Ci0jZW5kaWYKLSAgYmFzZTo6VGltZURlbHRhIHBhdXNlX2RlbGF5XzsKLSAgTW9ja0F1ZGlvTWFuYWdlciBtYW5hZ2VyXzsKLSAgTW9ja0F1ZGlvU291cmNlQ2FsbGJhY2sgY2FsbGJhY2tfOwotICBBdWRpb1BhcmFtZXRlcnMgcGFyYW1zXzsKLX07Ci0KLWNsYXNzIEF1ZGlvT3V0cHV0UmVzYW1wbGVyVGVzdCA6IHB1YmxpYyBBdWRpb091dHB1dFByb3h5VGVzdCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgQXVkaW9PdXRwdXRQcm94eVRlc3Q6OlRlYXJEb3duKCk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgSW5pdERpc3BhdGNoZXIoYmFzZTo6VGltZURlbHRhIGNsb3NlX2RlbGF5KSB7Ci0gICAgQXVkaW9PdXRwdXRQcm94eVRlc3Q6OkluaXREaXNwYXRjaGVyKGNsb3NlX2RlbGF5KTsKLSAgICAvLyBVc2UgYSBsb3cgc2FtcGxlIHJhdGUgYW5kIGxhcmdlIGJ1ZmZlciBzaXplIHdoZW4gdGVzdGluZyBvdGhlcndpc2UgdGhlCi0gICAgLy8gRmFrZUF1ZGlvT3V0cHV0U3RyZWFtIHdpbGwga2VlcCB0aGUgbWVzc2FnZSBsb29wIGJ1c3kgaW5kZWZpbml0ZWx5OyBpLmUuLAotICAgIC8vIFJ1blVudGlsSWRsZSgpIHdpbGwgbmV2ZXIgdGVybWluYXRlLgotICAgIHJlc2FtcGxlcl9wYXJhbXNfID0gQXVkaW9QYXJhbWV0ZXJzKAotICAgICAgICBBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MT1dfTEFURU5DWSwgQ0hBTk5FTF9MQVlPVVRfU1RFUkVPLAotICAgICAgICAxNjAwMCwgMTYsIDEwMjQpOwotICAgIHJlc2FtcGxlcl8gPSBuZXcgQXVkaW9PdXRwdXRSZXNhbXBsZXIoCi0gICAgICAgICZtYW5hZ2VyKCksIHBhcmFtc18sIHJlc2FtcGxlcl9wYXJhbXNfLCBjbG9zZV9kZWxheSk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgT25TdGFydCgpIHsKLSAgICAvLyBMZXQgc3RhcnQgcnVuIGZvciBhIGJpdC4KLSAgICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotICAgIGJhc2U6OlBsYXRmb3JtVGhyZWFkOjpTbGVlcCgKLSAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKGtTdGFydFJ1blRpbWVNcykpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIEF1ZGlvUGFyYW1ldGVycyByZXNhbXBsZXJfcGFyYW1zXzsKLSAgc2NvcGVkX3JlZnB0cjxBdWRpb091dHB1dFJlc2FtcGxlcj4gcmVzYW1wbGVyXzsKLX07Ci0KLVRFU1RfRihBdWRpb091dHB1dFByb3h5VGVzdCwgQ3JlYXRlQW5kQ2xvc2UpIHsKLSAgQXVkaW9PdXRwdXRQcm94eSogcHJveHkgPSBuZXcgQXVkaW9PdXRwdXRQcm94eShkaXNwYXRjaGVyX2ltcGxfKTsKLSAgcHJveHktPkNsb3NlKCk7Ci19Ci0KLSNpZiBkZWZpbmVkKEVOQUJMRV9BVURJT19NSVhFUikKLVRFU1RfRihBdWRpb091dHB1dFByb3h5VGVzdCwgQ3JlYXRlQW5kQ2xvc2VfTWl4ZXIpIHsKLSAgQXVkaW9PdXRwdXRQcm94eSogcHJveHkgPSBuZXcgQXVkaW9PdXRwdXRQcm94eShtaXhlcl8pOwotICBwcm94eS0+Q2xvc2UoKTsKLX0KLSNlbmRpZgotCi1URVNUX0YoQXVkaW9PdXRwdXRSZXNhbXBsZXJUZXN0LCBDcmVhdGVBbmRDbG9zZSkgewotICBBdWRpb091dHB1dFByb3h5KiBwcm94eSA9IG5ldyBBdWRpb091dHB1dFByb3h5KHJlc2FtcGxlcl8pOwotICBwcm94eS0+Q2xvc2UoKTsKLX0KLQotVEVTVF9GKEF1ZGlvT3V0cHV0UHJveHlUZXN0LCBPcGVuQW5kQ2xvc2UpIHsKLSAgT3BlbkFuZENsb3NlKGRpc3BhdGNoZXJfaW1wbF8pOwotfQotCi0jaWYgZGVmaW5lZChFTkFCTEVfQVVESU9fTUlYRVIpCi1URVNUX0YoQXVkaW9PdXRwdXRQcm94eVRlc3QsIE9wZW5BbmRDbG9zZV9NaXhlcikgewotICBPcGVuQW5kQ2xvc2UobWl4ZXJfKTsKLX0KLSNlbmRpZgotCi1URVNUX0YoQXVkaW9PdXRwdXRSZXNhbXBsZXJUZXN0LCBPcGVuQW5kQ2xvc2UpIHsKLSAgT3BlbkFuZENsb3NlKHJlc2FtcGxlcl8pOwotfQotCi0vLyBDcmVhdGUgYSBzdHJlYW0sIGFuZCB2ZXJpZnkgdGhhdCBpdCBpcyBjbG9zZWQgYWZ0ZXIga1Rlc3RDbG9zZURlbGF5TXMuCi0vLyBpZiBpdCBkb2Vzbid0IHN0YXJ0IHBsYXlpbmcuCi1URVNUX0YoQXVkaW9PdXRwdXRQcm94eVRlc3QsIENyZWF0ZUFuZFdhaXQpIHsKLSAgQ3JlYXRlQW5kV2FpdChkaXNwYXRjaGVyX2ltcGxfKTsKLX0KLQotLy8gQ3JlYXRlIGEgc3RyZWFtLCBhbmQgdmVyaWZ5IHRoYXQgaXQgaXMgY2xvc2VkIGFmdGVyIGtUZXN0Q2xvc2VEZWxheU1zLgotLy8gaWYgaXQgZG9lc24ndCBzdGFydCBwbGF5aW5nLgotVEVTVF9GKEF1ZGlvT3V0cHV0UmVzYW1wbGVyVGVzdCwgQ3JlYXRlQW5kV2FpdCkgewotICBDcmVhdGVBbmRXYWl0KHJlc2FtcGxlcl8pOwotfQotCi1URVNUX0YoQXVkaW9PdXRwdXRQcm94eVRlc3QsIFN0YXJ0QW5kU3RvcCkgewotICBTdGFydEFuZFN0b3AoZGlzcGF0Y2hlcl9pbXBsXyk7Ci19Ci0KLSNpZiBkZWZpbmVkKEVOQUJMRV9BVURJT19NSVhFUikKLVRFU1RfRihBdWRpb091dHB1dFByb3h5VGVzdCwgU3RhcnRBbmRTdG9wX01peGVyKSB7Ci0gIFN0YXJ0QW5kU3RvcChtaXhlcl8pOwotfQotI2VuZGlmCi0KLVRFU1RfRihBdWRpb091dHB1dFJlc2FtcGxlclRlc3QsIFN0YXJ0QW5kU3RvcCkgewotICBTdGFydEFuZFN0b3AocmVzYW1wbGVyXyk7Ci19Ci0KLVRFU1RfRihBdWRpb091dHB1dFByb3h5VGVzdCwgQ2xvc2VBZnRlclN0b3ApIHsKLSAgQ2xvc2VBZnRlclN0b3AoZGlzcGF0Y2hlcl9pbXBsXyk7Ci19Ci0KLSNpZiBkZWZpbmVkKEVOQUJMRV9BVURJT19NSVhFUikKLVRFU1RfRihBdWRpb091dHB1dFByb3h5VGVzdCwgQ2xvc2VBZnRlclN0b3BfTWl4ZXIpIHsKLSAgQ2xvc2VBZnRlclN0b3AobWl4ZXJfKTsKLX0KLSNlbmRpZgotCi1URVNUX0YoQXVkaW9PdXRwdXRSZXNhbXBsZXJUZXN0LCBDbG9zZUFmdGVyU3RvcCkgewotICBDbG9zZUFmdGVyU3RvcChyZXNhbXBsZXJfKTsKLX0KLQotVEVTVF9GKEF1ZGlvT3V0cHV0UHJveHlUZXN0LCBUd29TdHJlYW1zKSB7Ci0gIFR3b1N0cmVhbXMoZGlzcGF0Y2hlcl9pbXBsXyk7Ci19Ci0KLSNpZiBkZWZpbmVkKEVOQUJMRV9BVURJT19NSVhFUikKLVRFU1RfRihBdWRpb091dHB1dFByb3h5VGVzdCwgVHdvU3RyZWFtc19NaXhlcikgewotICBUd29TdHJlYW1zKG1peGVyXyk7Ci19Ci0jZW5kaWYKLQotVEVTVF9GKEF1ZGlvT3V0cHV0UmVzYW1wbGVyVGVzdCwgVHdvU3RyZWFtcykgewotICBUd29TdHJlYW1zKHJlc2FtcGxlcl8pOwotfQotCi0vLyBUd28gc3RyZWFtczogdmVyaWZ5IHRoYXQgc2Vjb25kIHN0cmVhbSBpcyBhbGxvY2F0ZWQgd2hlbiB0aGUgZmlyc3QKLS8vIHN0YXJ0cyBwbGF5aW5nLgotVEVTVF9GKEF1ZGlvT3V0cHV0UHJveHlUZXN0LCBUd29TdHJlYW1zX09uZVBsYXlpbmcpIHsKLSAgSW5pdERpc3BhdGNoZXIoYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcyhrVGVzdEJpZ0Nsb3NlRGVsYXlTZWNvbmRzKSk7Ci0gIFR3b1N0cmVhbXNfT25lUGxheWluZyhkaXNwYXRjaGVyX2ltcGxfKTsKLX0KLQotI2lmIGRlZmluZWQoRU5BQkxFX0FVRElPX01JWEVSKQotLy8gVHdvIHN0cmVhbXM6IHZlcmlmeSB0aGF0IG9ubHkgb25lIGRldmljZSB3aWxsIGJlIGNyZWF0ZWQuCi1URVNUX0YoQXVkaW9PdXRwdXRQcm94eVRlc3QsIFR3b1N0cmVhbXNfT25lUGxheWluZ19NaXhlcikgewotICBNb2NrQXVkaW9PdXRwdXRTdHJlYW0gc3RyZWFtKCZtYW5hZ2VyXywgcGFyYW1zXyk7Ci0KLSAgSW5pdERpc3BhdGNoZXIoYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKGtUZXN0Q2xvc2VEZWxheU1zKSk7Ci0KLSAgRVhQRUNUX0NBTEwobWFuYWdlcigpLCBNYWtlQXVkaW9PdXRwdXRTdHJlYW0oXykpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKCZzdHJlYW0pKTsKLQotICBFWFBFQ1RfQ0FMTChzdHJlYW0sIE9wZW4oKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4odHJ1ZSkpOwotICBFWFBFQ1RfQ0FMTChzdHJlYW0sIFN0YXJ0KF8pKQotICAgICAgLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTChzdHJlYW0sIFNldFZvbHVtZShfKSkKLSAgICAgIC5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwoc3RyZWFtLCBTdG9wKCkpCi0gICAgICAuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKHN0cmVhbSwgQ2xvc2UoKSkKLSAgICAgIC5UaW1lcygxKTsKLQotICBBdWRpb091dHB1dFByb3h5KiBwcm94eTEgPSBuZXcgQXVkaW9PdXRwdXRQcm94eShtaXhlcl8pOwotICBBdWRpb091dHB1dFByb3h5KiBwcm94eTIgPSBuZXcgQXVkaW9PdXRwdXRQcm94eShtaXhlcl8pOwotICBFWFBFQ1RfVFJVRShwcm94eTEtPk9wZW4oKSk7Ci0gIEVYUEVDVF9UUlVFKHByb3h5Mi0+T3BlbigpKTsKLQotICBwcm94eTEtPlN0YXJ0KCZjYWxsYmFja18pOwotICBwcm94eTEtPlN0b3AoKTsKLQotICBwcm94eTEtPkNsb3NlKCk7Ci0gIHByb3h5Mi0+Q2xvc2UoKTsKLSAgV2FpdEZvckNsb3NlVGltZXIoa1Rlc3RDbG9zZURlbGF5TXMpOwotfQotI2VuZGlmCi0KLVRFU1RfRihBdWRpb091dHB1dFJlc2FtcGxlclRlc3QsIFR3b1N0cmVhbXNfT25lUGxheWluZykgewotICBJbml0RGlzcGF0Y2hlcihiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKGtUZXN0QmlnQ2xvc2VEZWxheVNlY29uZHMpKTsKLSAgVHdvU3RyZWFtc19PbmVQbGF5aW5nKHJlc2FtcGxlcl8pOwotfQotCi0vLyBUd28gc3RyZWFtcywgYm90aCBhcmUgcGxheWluZy4gRGlzcGF0Y2hlciBzaG91bGQgbm90IG9wZW4gYSB0aGlyZCBzdHJlYW0uCi1URVNUX0YoQXVkaW9PdXRwdXRQcm94eVRlc3QsIFR3b1N0cmVhbXNfQm90aFBsYXlpbmcpIHsKLSAgSW5pdERpc3BhdGNoZXIoYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcyhrVGVzdEJpZ0Nsb3NlRGVsYXlTZWNvbmRzKSk7Ci0gIFR3b1N0cmVhbXNfQm90aFBsYXlpbmcoZGlzcGF0Y2hlcl9pbXBsXyk7Ci19Ci0KLSNpZiBkZWZpbmVkKEVOQUJMRV9BVURJT19NSVhFUikKLS8vIFR3byBzdHJlYW1zLCBib3RoIGFyZSBwbGF5aW5nLiBTdGlsbCBoYXZlIHRvIHVzZSBzaW5nbGUgZGV2aWNlLgotLy8gQWxzbyB2ZXJpZmllcyB0aGF0IGV2ZXJ5IHByb3h5IHN0cmVhbSBnZXRzIGl0cyBvd24gcGVuZGluZ19ieXRlcy4KLVRFU1RfRihBdWRpb091dHB1dFByb3h5VGVzdCwgVHdvU3RyZWFtc19Cb3RoUGxheWluZ19NaXhlcikgewotICBNb2NrQXVkaW9PdXRwdXRTdHJlYW0gc3RyZWFtKCZtYW5hZ2VyXywgcGFyYW1zXyk7Ci0KLSAgSW5pdERpc3BhdGNoZXIoYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKGtUZXN0Q2xvc2VEZWxheU1zKSk7Ci0KLSAgRVhQRUNUX0NBTEwobWFuYWdlcigpLCBNYWtlQXVkaW9PdXRwdXRTdHJlYW0oXykpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKCZzdHJlYW0pKTsKLQotICBFWFBFQ1RfQ0FMTChzdHJlYW0sIE9wZW4oKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4odHJ1ZSkpOwotICBFWFBFQ1RfQ0FMTChzdHJlYW0sIFN0YXJ0KF8pKQotICAgICAgLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTChzdHJlYW0sIFNldFZvbHVtZShfKSkKLSAgICAgIC5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwoc3RyZWFtLCBTdG9wKCkpCi0gICAgICAuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKHN0cmVhbSwgQ2xvc2UoKSkKLSAgICAgIC5UaW1lcygxKTsKLQotICBBdWRpb091dHB1dFByb3h5KiBwcm94eTEgPSBuZXcgQXVkaW9PdXRwdXRQcm94eShtaXhlcl8pOwotICBBdWRpb091dHB1dFByb3h5KiBwcm94eTIgPSBuZXcgQXVkaW9PdXRwdXRQcm94eShtaXhlcl8pOwotICBFWFBFQ1RfVFJVRShwcm94eTEtPk9wZW4oKSk7Ci0gIEVYUEVDVF9UUlVFKHByb3h5Mi0+T3BlbigpKTsKLQotICBwcm94eTEtPlN0YXJ0KCZjYWxsYmFja18pOwotCi0gIC8vIE11dGUgdGhlIHByb3h5LiBSZXN1bHRpbmcgc3RyZWFtIHNob3VsZCBzdGlsbCBoYXZlIGNvcnJlY3QgbGVuZ3RoLgotICBwcm94eTEtPlNldFZvbHVtZSgwLjApOwotCi0gIHVpbnQ4IHplcm9lc1s0XSA9IHswLCAwLCAwLCAwfTsKLSAgdWludDggYnVmMVs0XSA9IHswfTsKLSAgRVhQRUNUX0NBTEwoY2FsbGJhY2tfLAotICAgICAgT25Nb3JlRGF0YShOb3ROdWxsKCksIDQsCi0gICAgICAgICAgICAgICAgIEFsbE9mKEZpZWxkKCZBdWRpb0J1ZmZlcnNTdGF0ZTo6cGVuZGluZ19ieXRlcywgMCksCi0gICAgICAgICAgICAgICAgICAgICAgIEZpZWxkKCZBdWRpb0J1ZmZlcnNTdGF0ZTo6aGFyZHdhcmVfZGVsYXlfYnl0ZXMsIDApKSkpCi0gICAgICAuV2lsbE9uY2UoRG9BbGwoU2V0QXJyYXlBcmd1bWVudDwwPih6ZXJvZXMsIHplcm9lcyArIHNpemVvZih6ZXJvZXMpKSwKLSAgICAgICAgICAgICAgICAgICAgICBSZXR1cm4oNCkpKTsKLSAgbWl4ZXJfLT5Pbk1vcmVEYXRhKGJ1ZjEsIHNpemVvZihidWYxKSwgQXVkaW9CdWZmZXJzU3RhdGUoMCwgMCkpOwotICBwcm94eTItPlN0YXJ0KCZjYWxsYmFja18pOwotICB1aW50OCBidWYyWzRdID0gezB9OwotICBFWFBFQ1RfQ0FMTChjYWxsYmFja18sCi0gICAgICBPbk1vcmVEYXRhKE5vdE51bGwoKSwgNCwKLSAgICAgICAgICAgICAgICAgQWxsT2YoRmllbGQoJkF1ZGlvQnVmZmVyc1N0YXRlOjpwZW5kaW5nX2J5dGVzLCA0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgRmllbGQoJkF1ZGlvQnVmZmVyc1N0YXRlOjpoYXJkd2FyZV9kZWxheV9ieXRlcywgMCkpKSkKLSAgICAgIC5XaWxsT25jZShEb0FsbChTZXRBcnJheUFyZ3VtZW50PDA+KHplcm9lcywgemVyb2VzICsgc2l6ZW9mKHplcm9lcykpLAotICAgICAgICAgICAgICAgICAgICAgIFJldHVybig0KSkpOwotICBFWFBFQ1RfQ0FMTChjYWxsYmFja18sCi0gICAgICBPbk1vcmVEYXRhKE5vdE51bGwoKSwgNCwKLSAgICAgICAgICAgICAgICAgQWxsT2YoRmllbGQoJkF1ZGlvQnVmZmVyc1N0YXRlOjpwZW5kaW5nX2J5dGVzLCAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgRmllbGQoJkF1ZGlvQnVmZmVyc1N0YXRlOjpoYXJkd2FyZV9kZWxheV9ieXRlcywgMCkpKSkKLSAgICAgIC5XaWxsT25jZShEb0FsbChTZXRBcnJheUFyZ3VtZW50PDA+KHplcm9lcywgemVyb2VzICsgc2l6ZW9mKHplcm9lcykpLAotICAgICAgICAgICAgICAgICAgICAgIFJldHVybig0KSkpOwotICBtaXhlcl8tPk9uTW9yZURhdGEoYnVmMiwgc2l6ZW9mKGJ1ZjIpLCBBdWRpb0J1ZmZlcnNTdGF0ZSg0LCAwKSk7Ci0gIHByb3h5MS0+U3RvcCgpOwotICBwcm94eTItPlN0b3AoKTsKLQotICBwcm94eTEtPkNsb3NlKCk7Ci0gIHByb3h5Mi0+Q2xvc2UoKTsKLSAgV2FpdEZvckNsb3NlVGltZXIoa1Rlc3RDbG9zZURlbGF5TXMpOwotfQotI2VuZGlmCi0KLVRFU1RfRihBdWRpb091dHB1dFJlc2FtcGxlclRlc3QsIFR3b1N0cmVhbXNfQm90aFBsYXlpbmcpIHsKLSAgSW5pdERpc3BhdGNoZXIoYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcyhrVGVzdEJpZ0Nsb3NlRGVsYXlTZWNvbmRzKSk7Ci0gIFR3b1N0cmVhbXNfQm90aFBsYXlpbmcocmVzYW1wbGVyXyk7Ci19Ci0KLVRFU1RfRihBdWRpb091dHB1dFByb3h5VGVzdCwgT3BlbkZhaWxlZCkgewotICBPcGVuRmFpbGVkKGRpc3BhdGNoZXJfaW1wbF8pOwotfQotCi0jaWYgZGVmaW5lZChFTkFCTEVfQVVESU9fTUlYRVIpCi1URVNUX0YoQXVkaW9PdXRwdXRQcm94eVRlc3QsIE9wZW5GYWlsZWRfTWl4ZXIpIHsKLSAgT3BlbkZhaWxlZChtaXhlcl8pOwotfQotI2VuZGlmCi0KLVRFU1RfRihBdWRpb091dHB1dFJlc2FtcGxlclRlc3QsIE9wZW5GYWlsZWQpIHsKLSAgQ29tbWFuZExpbmU6OkZvckN1cnJlbnRQcm9jZXNzKCktPkFwcGVuZFN3aXRjaCgKLSAgICAgIHN3aXRjaGVzOjprRGlzYWJsZUF1ZGlvRmFsbGJhY2spOwotICBPcGVuRmFpbGVkKHJlc2FtcGxlcl8pOwotfQotCi0vLyBTdGFydCgpIG1ldGhvZCBmYWlsZWQuCi1URVNUX0YoQXVkaW9PdXRwdXRQcm94eVRlc3QsIFN0YXJ0RmFpbGVkKSB7Ci0gIFN0YXJ0RmFpbGVkKGRpc3BhdGNoZXJfaW1wbF8pOwotfQotCi0jaWYgZGVmaW5lZChFTkFCTEVfQVVESU9fTUlYRVIpCi0vLyBTdGFydCgpIG1ldGhvZCBmYWlsZWQuCi1URVNUX0YoQXVkaW9PdXRwdXRQcm94eVRlc3QsIFN0YXJ0RmFpbGVkX01peGVyKSB7Ci0gIE1vY2tBdWRpb091dHB1dFN0cmVhbSBzdHJlYW0oJm1hbmFnZXJfLCBwYXJhbXNfKTsKLQotICBFWFBFQ1RfQ0FMTChtYW5hZ2VyKCksIE1ha2VBdWRpb091dHB1dFN0cmVhbShfKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oJnN0cmVhbSkpOwotICBFWFBFQ1RfQ0FMTChzdHJlYW0sIE9wZW4oKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4odHJ1ZSkpOwotICBFWFBFQ1RfQ0FMTChzdHJlYW0sIENsb3NlKCkpCi0gICAgICAuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKHN0cmVhbSwgU3RhcnQoXykpCi0gICAgICAuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKHN0cmVhbSwgU2V0Vm9sdW1lKF8pKQotICAgICAgLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTChzdHJlYW0sIFN0b3AoKSkKLSAgICAgIC5UaW1lcygxKTsKLQotICBBdWRpb091dHB1dFByb3h5KiBwcm94eTEgPSBuZXcgQXVkaW9PdXRwdXRQcm94eShtaXhlcl8pOwotICBBdWRpb091dHB1dFByb3h5KiBwcm94eTIgPSBuZXcgQXVkaW9PdXRwdXRQcm94eShtaXhlcl8pOwotICBFWFBFQ1RfVFJVRShwcm94eTEtPk9wZW4oKSk7Ci0gIEVYUEVDVF9UUlVFKHByb3h5Mi0+T3BlbigpKTsKLSAgcHJveHkxLT5TdGFydCgmY2FsbGJhY2tfKTsKLSAgcHJveHkxLT5TdG9wKCk7Ci0gIHByb3h5MS0+Q2xvc2UoKTsKLSAgV2FpdEZvckNsb3NlVGltZXIoa1Rlc3RDbG9zZURlbGF5TXMpOwotCi0gIC8vIFZlcmlmeSBleHBlY3RhdGlvbiBiZWZvcmUgY29udGludWVpbmcuCi0gIE1vY2s6OlZlcmlmeUFuZENsZWFyKCZzdHJlYW0pOwotCi0gIC8vIHxzdHJlYW18IGlzIGNsb3NlZCBhdCB0aGlzIHBvaW50LiBTdGFydCgpIHNob3VsZCByZW9wZW4gaXQgYWdhaW4uCi0gIEVYUEVDVF9DQUxMKG1hbmFnZXIoKSwgTWFrZUF1ZGlvT3V0cHV0U3RyZWFtKF8pKQotICAgICAgLldpbGxPbmNlKFJldHVybihyZWludGVycHJldF9jYXN0PEF1ZGlvT3V0cHV0U3RyZWFtKj4oTlVMTCkpKTsKLQotICBFWFBFQ1RfQ0FMTChjYWxsYmFja18sIE9uRXJyb3IoXywgXykpCi0gICAgICAuVGltZXMoMSk7Ci0KLSAgcHJveHkyLT5TdGFydCgmY2FsbGJhY2tfKTsKLQotICBNb2NrOjpWZXJpZnlBbmRDbGVhcigmY2FsbGJhY2tfKTsKLQotICBwcm94eTItPkNsb3NlKCk7Ci0gIFdhaXRGb3JDbG9zZVRpbWVyKGtUZXN0Q2xvc2VEZWxheU1zKTsKLX0KLSNlbmRpZgotCi1URVNUX0YoQXVkaW9PdXRwdXRSZXNhbXBsZXJUZXN0LCBTdGFydEZhaWxlZCkgewotICBTdGFydEZhaWxlZChyZXNhbXBsZXJfKTsKLX0KLQotLy8gU2ltdWxhdGUgQXVkaW9PdXRwdXRTdHJlYW06OkNyZWF0ZSgpIGZhaWx1cmUgd2l0aCBhIGxvdyBsYXRlbmN5IHN0cmVhbSBhbmQKLS8vIGVuc3VyZSBBdWRpb091dHB1dFJlc2FtcGxlciBmYWxscyBiYWNrIHRvIHRoZSBoaWdoIGxhdGVuY3kgcGF0aC4KLVRFU1RfRihBdWRpb091dHB1dFJlc2FtcGxlclRlc3QsIExvd0xhdGVuY3lDcmVhdGVGYWlsZWRGYWxsYmFjaykgewotICBNb2NrQXVkaW9PdXRwdXRTdHJlYW0gc3RyZWFtKCZtYW5hZ2VyXywgcGFyYW1zXyk7Ci0gIEVYUEVDVF9DQUxMKG1hbmFnZXIoKSwgTWFrZUF1ZGlvT3V0cHV0U3RyZWFtKF8pKQotICAgICAgLlRpbWVzKDIpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKHN0YXRpY19jYXN0PEF1ZGlvT3V0cHV0U3RyZWFtKj4oTlVMTCkpKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybigmc3RyZWFtKSk7Ci0gIEVYUEVDVF9DQUxMKHN0cmVhbSwgT3BlbigpKQotICAgICAgLldpbGxPbmNlKFJldHVybih0cnVlKSk7Ci0gIEVYUEVDVF9DQUxMKHN0cmVhbSwgQ2xvc2UoKSkKLSAgICAgIC5UaW1lcygxKTsKLQotICBBdWRpb091dHB1dFByb3h5KiBwcm94eSA9IG5ldyBBdWRpb091dHB1dFByb3h5KHJlc2FtcGxlcl8pOwotICBFWFBFQ1RfVFJVRShwcm94eS0+T3BlbigpKTsKLSAgcHJveHktPkNsb3NlKCk7Ci0gIFdhaXRGb3JDbG9zZVRpbWVyKGtUZXN0Q2xvc2VEZWxheU1zKTsKLX0KLQotLy8gU2ltdWxhdGUgQXVkaW9PdXRwdXRTdHJlYW06Ok9wZW4oKSBmYWlsdXJlIHdpdGggYSBsb3cgbGF0ZW5jeSBzdHJlYW0gYW5kCi0vLyBlbnN1cmUgQXVkaW9PdXRwdXRSZXNhbXBsZXIgZmFsbHMgYmFjayB0byB0aGUgaGlnaCBsYXRlbmN5IHBhdGguCi1URVNUX0YoQXVkaW9PdXRwdXRSZXNhbXBsZXJUZXN0LCBMb3dMYXRlbmN5T3BlbkZhaWxlZEZhbGxiYWNrKSB7Ci0gIE1vY2tBdWRpb091dHB1dFN0cmVhbSBmYWlsZWRfc3RyZWFtKCZtYW5hZ2VyXywgcGFyYW1zXyk7Ci0gIE1vY2tBdWRpb091dHB1dFN0cmVhbSBva2F5X3N0cmVhbSgmbWFuYWdlcl8sIHBhcmFtc18pOwotICBFWFBFQ1RfQ0FMTChtYW5hZ2VyKCksIE1ha2VBdWRpb091dHB1dFN0cmVhbShfKSkKLSAgICAgIC5UaW1lcygyKQotICAgICAgLldpbGxPbmNlKFJldHVybigmZmFpbGVkX3N0cmVhbSkpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKCZva2F5X3N0cmVhbSkpOwotICBFWFBFQ1RfQ0FMTChmYWlsZWRfc3RyZWFtLCBPcGVuKCkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKGZhbHNlKSk7Ci0gIEVYUEVDVF9DQUxMKGZhaWxlZF9zdHJlYW0sIENsb3NlKCkpCi0gICAgICAuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKG9rYXlfc3RyZWFtLCBPcGVuKCkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKLSAgRVhQRUNUX0NBTEwob2theV9zdHJlYW0sIENsb3NlKCkpCi0gICAgICAuVGltZXMoMSk7Ci0KLSAgQXVkaW9PdXRwdXRQcm94eSogcHJveHkgPSBuZXcgQXVkaW9PdXRwdXRQcm94eShyZXNhbXBsZXJfKTsKLSAgRVhQRUNUX1RSVUUocHJveHktPk9wZW4oKSk7Ci0gIHByb3h5LT5DbG9zZSgpOwotICBXYWl0Rm9yQ2xvc2VUaW1lcihrVGVzdENsb3NlRGVsYXlNcyk7Ci19Ci0KLS8vIFNpbXVsYXRlIGZhaWx1cmVzIHRvIG9wZW4gYm90aCB0aGUgbG93IGxhdGVuY3kgYW5kIHRoZSBmYWxsYmFjayBoaWdoIGxhdGVuY3kKLS8vIHN0cmVhbSBhbmQgZW5zdXJlIEF1ZGlvT3V0cHV0UmVzYW1wbGVyIHRlcm1pbmF0ZXMgbm9ybWFsbHkuCi1URVNUX0YoQXVkaW9PdXRwdXRSZXNhbXBsZXJUZXN0LCBMb3dMYXRlbmN5RmFsbGJhY2tGYWlsZWQpIHsKLSAgRVhQRUNUX0NBTEwobWFuYWdlcigpLCBNYWtlQXVkaW9PdXRwdXRTdHJlYW0oXykpCi0gICAgICAuVGltZXMoMikKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oc3RhdGljX2Nhc3Q8QXVkaW9PdXRwdXRTdHJlYW0qPihOVUxMKSkpOwotCi0gIEF1ZGlvT3V0cHV0UHJveHkqIHByb3h5ID0gbmV3IEF1ZGlvT3V0cHV0UHJveHkocmVzYW1wbGVyXyk7Ci0gIEVYUEVDVF9GQUxTRShwcm94eS0+T3BlbigpKTsKLSAgcHJveHktPkNsb3NlKCk7Ci0gIFdhaXRGb3JDbG9zZVRpbWVyKGtUZXN0Q2xvc2VEZWxheU1zKTsKLX0KLQotLy8gU2ltdWxhdGUgYW4gZXZlbnR1YWwgT3BlblN0cmVhbSgpIGZhaWx1cmU7IGkuZS4gc3VjY2Vzc2Z1bCBPcGVuU3RyZWFtKCkgY2FsbHMKLS8vIGV2ZW50dWFsbHkgZm9sbG93ZWQgYnkgb25lIHdoaWNoIGZhaWxzOyByb290IGNhdXNlIG9mIGh0dHA6Ly9jcmJ1Zy5jb20vMTUwNjE5Ci1URVNUX0YoQXVkaW9PdXRwdXRSZXNhbXBsZXJUZXN0LCBMb3dMYXRlbmN5T3BlbkV2ZW50dWFsbHlGYWlscykgewotICBNb2NrQXVkaW9PdXRwdXRTdHJlYW0gc3RyZWFtMSgmbWFuYWdlcl8sIHBhcmFtc18pOwotICBNb2NrQXVkaW9PdXRwdXRTdHJlYW0gc3RyZWFtMigmbWFuYWdlcl8sIHBhcmFtc18pOwotICBNb2NrQXVkaW9PdXRwdXRTdHJlYW0gc3RyZWFtMygmbWFuYWdlcl8sIHBhcmFtc18pOwotCi0gIC8vIFNldHVwIHRoZSBtb2NrIHN1Y2ggdGhhdCBhbGwgdGhyZWUgc3RyZWFtcyBhcmUgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuCi0gIEVYUEVDVF9DQUxMKG1hbmFnZXIoKSwgTWFrZUF1ZGlvT3V0cHV0U3RyZWFtKF8pKQotICAgICAgLldpbGxPbmNlKFJldHVybigmc3RyZWFtMSkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKCZzdHJlYW0yKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oJnN0cmVhbTMpKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybihzdGF0aWNfY2FzdDxBdWRpb091dHB1dFN0cmVhbSo+KE5VTEwpKSk7Ci0KLSAgLy8gU3RyZWFtMSBzaG91bGQgYmUgYWJsZSB0byBzdWNjZXNzZnVsbHkgb3BlbiBhbmQgc3RhcnQuCi0gIEVYUEVDVF9DQUxMKHN0cmVhbTEsIE9wZW4oKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4odHJ1ZSkpOwotICBFWFBFQ1RfQ0FMTChzdHJlYW0xLCBDbG9zZSgpKQotICAgICAgLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTChzdHJlYW0xLCBTZXRWb2x1bWUoXykpCi0gICAgICAuVGltZXMoMSk7Ci0KLSAgLy8gU3RyZWFtMiBzaG91bGQgYWxzbyBiZSBhYmxlIHRvIHN1Y2Nlc3NmdWxseSBvcGVuIGFuZCBzdGFydC4KLSAgRVhQRUNUX0NBTEwoc3RyZWFtMiwgT3BlbigpKQotICAgICAgLldpbGxPbmNlKFJldHVybih0cnVlKSk7Ci0gIEVYUEVDVF9DQUxMKHN0cmVhbTIsIENsb3NlKCkpCi0gICAgICAuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKHN0cmVhbTIsIFNldFZvbHVtZShfKSkKLSAgICAgIC5UaW1lcygxKTsKLQotICAvLyBTdHJlYW0zIHNob3VsZCBmYWlsIG9uIE9wZW4oKSAoeWV0IHN0aWxsIGJlIGNsb3NlZCBzaW5jZQotICAvLyBNYWtlQXVkaW9PdXRwdXRTdHJlYW0gcmV0dXJuZWQgYSB2YWxpZCBBdWRpb091dHB1dFN0cmVhbSBvYmplY3QpLgotICBFWFBFQ1RfQ0FMTChzdHJlYW0zLCBPcGVuKCkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKGZhbHNlKSk7Ci0gIEVYUEVDVF9DQUxMKHN0cmVhbTMsIENsb3NlKCkpCi0gICAgICAuVGltZXMoMSk7Ci0KLSAgLy8gT3BlbiBhbmQgc3RhcnQgdGhlIGZpcnN0IHByb3h5IGFuZCBzdHJlYW0uCi0gIEF1ZGlvT3V0cHV0UHJveHkqIHByb3h5MSA9IG5ldyBBdWRpb091dHB1dFByb3h5KHJlc2FtcGxlcl8pOwotICBFWFBFQ1RfVFJVRShwcm94eTEtPk9wZW4oKSk7Ci0gIHByb3h5MS0+U3RhcnQoJmNhbGxiYWNrXyk7Ci0gIE9uU3RhcnQoKTsKLQotICAvLyBPcGVuIGFuZCBzdGFydCB0aGUgc2Vjb25kIHByb3h5IGFuZCBzdHJlYW0uCi0gIEF1ZGlvT3V0cHV0UHJveHkqIHByb3h5MiA9IG5ldyBBdWRpb091dHB1dFByb3h5KHJlc2FtcGxlcl8pOwotICBFWFBFQ1RfVFJVRShwcm94eTItPk9wZW4oKSk7Ci0gIHByb3h5Mi0+U3RhcnQoJmNhbGxiYWNrXyk7Ci0gIE9uU3RhcnQoKTsKLQotICAvLyBBdHRlbXB0IHRvIG9wZW4gdGhlIHRoaXJkIHN0cmVhbSB3aGljaCBzaG91bGQgZmFpbC4KLSAgQXVkaW9PdXRwdXRQcm94eSogcHJveHkzID0gbmV3IEF1ZGlvT3V0cHV0UHJveHkocmVzYW1wbGVyXyk7Ci0gIEVYUEVDVF9GQUxTRShwcm94eTMtPk9wZW4oKSk7Ci0KLSAgLy8gUGVyZm9ybSB0aGUgcmVxdWlyZWQgU3RvcCgpL0Nsb3NlKCkgc2h1dGRvd24gZGFuY2UgZm9yIGVhY2ggcHJveHkuICBVbmRlcgotICAvLyB0aGUgaG9vZCBlYWNoIHByb3h5IHNob3VsZCBjb3JyZWN0bHkgY2FsbCBDbG9zZVN0cmVhbSgpIGlmIE9wZW5TdHJlYW0oKQotICAvLyBzdWNjZWVkZWQgb3Igbm90LgotICBwcm94eTMtPlN0b3AoKTsKLSAgcHJveHkzLT5DbG9zZSgpOwotICBwcm94eTItPlN0b3AoKTsKLSAgcHJveHkyLT5DbG9zZSgpOwotICBwcm94eTEtPlN0b3AoKTsKLSAgcHJveHkxLT5DbG9zZSgpOwotCi0gIC8vIFdhaXQgZm9yIGFsbCBvZiB0aGUgbWVzc2FnZXMgdG8gZmx5IGFuZCB0aGVuIHZlcmlmeSBzdHJlYW0gYmVoYXZpb3IuCi0gIFdhaXRGb3JDbG9zZVRpbWVyKGtUZXN0Q2xvc2VEZWxheU1zKTsKLSAgRVhQRUNUX1RSVUUoc3RyZWFtMS5zdG9wX2NhbGxlZCgpKTsKLSAgRVhQRUNUX1RSVUUoc3RyZWFtMS5zdGFydF9jYWxsZWQoKSk7Ci0gIEVYUEVDVF9UUlVFKHN0cmVhbTIuc3RvcF9jYWxsZWQoKSk7Ci0gIEVYUEVDVF9UUlVFKHN0cmVhbTIuc3RhcnRfY2FsbGVkKCkpOwotICBFWFBFQ1RfRkFMU0Uoc3RyZWFtMy5zdG9wX2NhbGxlZCgpKTsKLSAgRVhQRUNUX0ZBTFNFKHN0cmVhbTMuc3RhcnRfY2FsbGVkKCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb19vdXRwdXRfcmVzYW1wbGVyLmNjIGIvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9yZXNhbXBsZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MzRlNDAuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9yZXNhbXBsZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzOTcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX291dHB1dF9yZXNhbXBsZXIuaCIKLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvYmluZF9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiYmFzZS9jb21tYW5kX2xpbmUuaCIKLSNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJiYXNlL21ldHJpY3MvaGlzdG9ncmFtLmgiCi0jaW5jbHVkZSAiYmFzZS90aW1lLmgiCi0jaW5jbHVkZSAiYnVpbGQvYnVpbGRfY29uZmlnLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9faW8uaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19vdXRwdXRfZGlzcGF0Y2hlcl9pbXBsLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fb3V0cHV0X3Byb3h5LmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fdXRpbC5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3NhbXBsZV9yYXRlcy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fY29udmVydGVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9saW1pdHMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX3N3aXRjaGVzLmgiCi0KLSNpZiBkZWZpbmVkKE9TX1dJTikKLSNpbmNsdWRlICJtZWRpYS9hdWRpby93aW4vY29yZV9hdWRpb191dGlsX3dpbi5oIgotI2VuZGlmCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIE9uTW9yZURhdGFDb252ZXJ0ZXIKLSAgICA6IHB1YmxpYyBBdWRpb091dHB1dFN0cmVhbTo6QXVkaW9Tb3VyY2VDYWxsYmFjaywKLSAgICAgIHB1YmxpYyBBdWRpb0NvbnZlcnRlcjo6SW5wdXRDYWxsYmFjayB7Ci0gcHVibGljOgotICBPbk1vcmVEYXRhQ29udmVydGVyKGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgaW5wdXRfcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgb3V0cHV0X3BhcmFtcyk7Ci0gIHZpcnR1YWwgfk9uTW9yZURhdGFDb252ZXJ0ZXIoKTsKLQotICAvLyBBdWRpb1NvdXJjZUNhbGxiYWNrIGludGVyZmFjZS4KLSAgdmlydHVhbCBpbnQgT25Nb3JlRGF0YShBdWRpb0J1cyogZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlcnNTdGF0ZSBidWZmZXJzX3N0YXRlKSBPVkVSUklERTsKLSAgdmlydHVhbCBpbnQgT25Nb3JlSU9EYXRhKEF1ZGlvQnVzKiBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1cyogZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyc1N0YXRlIGJ1ZmZlcnNfc3RhdGUpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgT25FcnJvcihBdWRpb091dHB1dFN0cmVhbSogc3RyZWFtLCBpbnQgY29kZSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBXYWl0VGlsbERhdGFSZWFkeSgpIE9WRVJSSURFOwotCi0gIC8vIFNldHMgfHNvdXJjZV9jYWxsYmFja198LiAgSWYgdGhpcyBpcyBub3QgYSBuZXcgb2JqZWN0LCB0aGVuIFN0b3AoKSBtdXN0IGJlCi0gIC8vIGNhbGxlZCBiZWZvcmUgU3RhcnQoKS4KLSAgdm9pZCBTdGFydChBdWRpb091dHB1dFN0cmVhbTo6QXVkaW9Tb3VyY2VDYWxsYmFjayogY2FsbGJhY2spOwotCi0gIC8vIENsZWFycyB8c291cmNlX2NhbGxiYWNrX3wgYW5kIGZsdXNoZXMgdGhlIHJlc2FtcGxlci4KLSAgdm9pZCBTdG9wKCk7Ci0KLSBwcml2YXRlOgotICAvLyBBdWRpb0NvbnZlcnRlcjo6SW5wdXRDYWxsYmFjayBpbXBsZW1lbnRhdGlvbi4KLSAgdmlydHVhbCBkb3VibGUgUHJvdmlkZUlucHV0KEF1ZGlvQnVzKiBhdWRpb19idXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGEgYnVmZmVyX2RlbGF5KSBPVkVSUklERTsKLQotICAvLyBSYXRpbyBvZiBpbnB1dCBieXRlcyB0byBvdXRwdXQgYnl0ZXMgdXNlZCB0byBjb3JyZWN0IHBsYXliYWNrIGRlbGF5IHdpdGgKLSAgLy8gcmVnYXJkIHRvIGJ1ZmZlcmluZyBhbmQgcmVzYW1wbGluZy4KLSAgZG91YmxlIGlvX3JhdGlvXzsKLQotICAvLyBTb3VyY2UgY2FsbGJhY2sgYW5kIGFzc29jaWF0ZWQgbG9jay4KLSAgYmFzZTo6TG9jayBzb3VyY2VfbG9ja187Ci0gIEF1ZGlvT3V0cHV0U3RyZWFtOjpBdWRpb1NvdXJjZUNhbGxiYWNrKiBzb3VyY2VfY2FsbGJhY2tfOwotCi0gIC8vIHxzb3VyY2V8IHBhc3NlZCB0byBPbk1vcmVJT0RhdGEoKSB3aGljaCBzaG91bGQgYmUgcGFzc2VkIGRvd25zdHJlYW0uCi0gIEF1ZGlvQnVzKiBzb3VyY2VfYnVzXzsKLQotICAvLyBMYXN0IEF1ZGlvQnVmZmVyc1N0YXRlIG9iamVjdCByZWNlaXZlZCB2aWEgT25Nb3JlRGF0YSgpLCB1c2VkIHRvIGNvcnJlY3QKLSAgLy8gcGxheWJhY2sgZGVsYXkgYnkgUHJvdmlkZUlucHV0KCkgYW5kIHBhc3NlZCBvbiB0byB8c291cmNlX2NhbGxiYWNrX3wuCi0gIEF1ZGlvQnVmZmVyc1N0YXRlIGN1cnJlbnRfYnVmZmVyc19zdGF0ZV87Ci0KLSAgY29uc3QgaW50IGlucHV0X2J5dGVzX3Blcl9zZWNvbmRfOwotCi0gIC8vIEhhbmRsZXMgcmVzYW1wbGluZywgYnVmZmVyaW5nLCBhbmQgY2hhbm5lbCBtaXhpbmcgYmV0d2VlbiBpbnB1dCBhbmQgb3V0cHV0Ci0gIC8vIHBhcmFtZXRlcnMuCi0gIEF1ZGlvQ29udmVydGVyIGF1ZGlvX2NvbnZlcnRlcl87Ci0KLSAgLy8gSWYgd2UncmUgdXNpbmcgV2F2ZU91dCBvbiBXaW5kb3dzJyB3ZSBhbHdheXMgaGF2ZSB0byB3YWl0IGZvciBEYXRhUmVhZHkoKQotICAvLyBiZWZvcmUgY2FsbGluZyB8c291cmNlX2NhbGxiYWNrX3wuCi0gIGJvb2wgd2F2ZW91dF93YWl0X2hhY2tfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihPbk1vcmVEYXRhQ29udmVydGVyKTsKLX07Ci0KLS8vIFJlY29yZCBVTUEgc3RhdGlzdGljcyBmb3IgaGFyZHdhcmUgb3V0cHV0IGNvbmZpZ3VyYXRpb24uCi1zdGF0aWMgdm9pZCBSZWNvcmRTdGF0cyhjb25zdCBBdWRpb1BhcmFtZXRlcnMmIG91dHB1dF9wYXJhbXMpIHsKLSAgVU1BX0hJU1RPR1JBTV9FTlVNRVJBVElPTigKLSAgICAgICJNZWRpYS5IYXJkd2FyZUF1ZGlvQml0c1BlckNoYW5uZWwiLCBvdXRwdXRfcGFyYW1zLmJpdHNfcGVyX3NhbXBsZSgpLAotICAgICAgbGltaXRzOjprTWF4Qml0c1BlclNhbXBsZSk7Ci0gIFVNQV9ISVNUT0dSQU1fRU5VTUVSQVRJT04oCi0gICAgICAiTWVkaWEuSGFyZHdhcmVBdWRpb0NoYW5uZWxMYXlvdXQiLCBvdXRwdXRfcGFyYW1zLmNoYW5uZWxfbGF5b3V0KCksCi0gICAgICBDSEFOTkVMX0xBWU9VVF9NQVgpOwotICBVTUFfSElTVE9HUkFNX0VOVU1FUkFUSU9OKAotICAgICAgIk1lZGlhLkhhcmR3YXJlQXVkaW9DaGFubmVsQ291bnQiLCBvdXRwdXRfcGFyYW1zLmNoYW5uZWxzKCksCi0gICAgICBsaW1pdHM6OmtNYXhDaGFubmVscyk7Ci0KLSAgQXVkaW9TYW1wbGVSYXRlIGFzciA9IG1lZGlhOjpBc0F1ZGlvU2FtcGxlUmF0ZShvdXRwdXRfcGFyYW1zLnNhbXBsZV9yYXRlKCkpOwotICBpZiAoYXNyICE9IGtVbmV4cGVjdGVkQXVkaW9TYW1wbGVSYXRlKSB7Ci0gICAgVU1BX0hJU1RPR1JBTV9FTlVNRVJBVElPTigKLSAgICAgICAgIk1lZGlhLkhhcmR3YXJlQXVkaW9TYW1wbGVzUGVyU2Vjb25kIiwgYXNyLCBrVW5leHBlY3RlZEF1ZGlvU2FtcGxlUmF0ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgVU1BX0hJU1RPR1JBTV9DT1VOVFMoCi0gICAgICAgICJNZWRpYS5IYXJkd2FyZUF1ZGlvU2FtcGxlc1BlclNlY29uZFVuZXhwZWN0ZWQiLAotICAgICAgICBvdXRwdXRfcGFyYW1zLnNhbXBsZV9yYXRlKCkpOwotICB9Ci19Ci0KLS8vIFJlY29yZCBVTUEgc3RhdGlzdGljcyBmb3IgaGFyZHdhcmUgb3V0cHV0IGNvbmZpZ3VyYXRpb24gYWZ0ZXIgZmFsbGJhY2suCi1zdGF0aWMgdm9pZCBSZWNvcmRGYWxsYmFja1N0YXRzKGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgb3V0cHV0X3BhcmFtcykgewotICBVTUFfSElTVE9HUkFNX0JPT0xFQU4oIk1lZGlhLkZhbGxiYWNrVG9IaWdoTGF0ZW5jeUF1ZGlvUGF0aCIsIHRydWUpOwotICBVTUFfSElTVE9HUkFNX0VOVU1FUkFUSU9OKAotICAgICAgIk1lZGlhLkZhbGxiYWNrSGFyZHdhcmVBdWRpb0JpdHNQZXJDaGFubmVsIiwKLSAgICAgIG91dHB1dF9wYXJhbXMuYml0c19wZXJfc2FtcGxlKCksIGxpbWl0czo6a01heEJpdHNQZXJTYW1wbGUpOwotICBVTUFfSElTVE9HUkFNX0VOVU1FUkFUSU9OKAotICAgICAgIk1lZGlhLkZhbGxiYWNrSGFyZHdhcmVBdWRpb0NoYW5uZWxMYXlvdXQiLAotICAgICAgb3V0cHV0X3BhcmFtcy5jaGFubmVsX2xheW91dCgpLCBDSEFOTkVMX0xBWU9VVF9NQVgpOwotICBVTUFfSElTVE9HUkFNX0VOVU1FUkFUSU9OKAotICAgICAgIk1lZGlhLkZhbGxiYWNrSGFyZHdhcmVBdWRpb0NoYW5uZWxDb3VudCIsCi0gICAgICBvdXRwdXRfcGFyYW1zLmNoYW5uZWxzKCksIGxpbWl0czo6a01heENoYW5uZWxzKTsKLQotICBBdWRpb1NhbXBsZVJhdGUgYXNyID0gbWVkaWE6OkFzQXVkaW9TYW1wbGVSYXRlKG91dHB1dF9wYXJhbXMuc2FtcGxlX3JhdGUoKSk7Ci0gIGlmIChhc3IgIT0ga1VuZXhwZWN0ZWRBdWRpb1NhbXBsZVJhdGUpIHsKLSAgICBVTUFfSElTVE9HUkFNX0VOVU1FUkFUSU9OKAotICAgICAgICAiTWVkaWEuRmFsbGJhY2tIYXJkd2FyZUF1ZGlvU2FtcGxlc1BlclNlY29uZCIsCi0gICAgICAgIGFzciwga1VuZXhwZWN0ZWRBdWRpb1NhbXBsZVJhdGUpOwotICB9IGVsc2UgewotICAgIFVNQV9ISVNUT0dSQU1fQ09VTlRTKAotICAgICAgICAiTWVkaWEuRmFsbGJhY2tIYXJkd2FyZUF1ZGlvU2FtcGxlc1BlclNlY29uZFVuZXhwZWN0ZWQiLAotICAgICAgICBvdXRwdXRfcGFyYW1zLnNhbXBsZV9yYXRlKCkpOwotICB9Ci19Ci0KLS8vIENvbnZlcnRzIGxvdyBsYXRlbmN5IGJhc2VkIHxvdXRwdXRfcGFyYW1zfCBpbnRvIGhpZ2ggbGF0ZW5jeSBhcHByb3ByaWF0ZQotLy8gb3V0cHV0IHBhcmFtZXRlcnMgaW4gZXJyb3Igc2l0dWF0aW9ucy4KLXN0YXRpYyBBdWRpb1BhcmFtZXRlcnMgU2V0dXBGYWxsYmFja1BhcmFtcygKLSAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIGlucHV0X3BhcmFtcywgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBvdXRwdXRfcGFyYW1zKSB7Ci0gIC8vIENob29zZSBBdWRpb1BhcmFtZXRlcnMgYXBwcm9wcmlhdGUgZm9yIG9wZW5pbmcgdGhlIGRldmljZSBpbiBoaWdoIGxhdGVuY3kKLSAgLy8gbW9kZS4gIHxrTWluTG93TGF0ZW5jeUZyYW1lU2l6ZXwgaXMgYXJiaXRyYXJpbHkgYmFzZWQgb24gUGVwcGVyIEZsYXNoJ3MKLSAgLy8gTUFYSU1VTSBmcmFtZSBzaXplIGZvciBsb3cgbGF0ZW5jeS4KLSAgc3RhdGljIGNvbnN0IGludCBrTWluTG93TGF0ZW5jeUZyYW1lU2l6ZSA9IDIwNDg7Ci0gIGludCBmcmFtZXNfcGVyX2J1ZmZlciA9IHN0ZDo6bWluKAotICAgICAgc3RkOjptYXgoaW5wdXRfcGFyYW1zLmZyYW1lc19wZXJfYnVmZmVyKCksIGtNaW5Mb3dMYXRlbmN5RnJhbWVTaXplKSwKLSAgICAgIHN0YXRpY19jYXN0PGludD4oCi0gICAgICAgICAgR2V0SGlnaExhdGVuY3lPdXRwdXRCdWZmZXJTaXplKGlucHV0X3BhcmFtcy5zYW1wbGVfcmF0ZSgpKSkpOwotCi0gIHJldHVybiBBdWRpb1BhcmFtZXRlcnMoCi0gICAgICBBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIsIGlucHV0X3BhcmFtcy5jaGFubmVsX2xheW91dCgpLAotICAgICAgaW5wdXRfcGFyYW1zLnNhbXBsZV9yYXRlKCksIGlucHV0X3BhcmFtcy5iaXRzX3Blcl9zYW1wbGUoKSwKLSAgICAgIGZyYW1lc19wZXJfYnVmZmVyKTsKLX0KLQotQXVkaW9PdXRwdXRSZXNhbXBsZXI6OkF1ZGlvT3V0cHV0UmVzYW1wbGVyKEF1ZGlvTWFuYWdlciogYXVkaW9fbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIGlucHV0X3BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIG91dHB1dF9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6VGltZURlbHRhJiBjbG9zZV9kZWxheSkKLSAgICA6IEF1ZGlvT3V0cHV0RGlzcGF0Y2hlcihhdWRpb19tYW5hZ2VyLCBpbnB1dF9wYXJhbXMpLAotICAgICAgY2xvc2VfZGVsYXlfKGNsb3NlX2RlbGF5KSwKLSAgICAgIG91dHB1dF9wYXJhbXNfKG91dHB1dF9wYXJhbXMpLAotICAgICAgc3RyZWFtc19vcGVuZWRfKGZhbHNlKSB7Ci0gIERDSEVDSyhpbnB1dF9wYXJhbXMuSXNWYWxpZCgpKTsKLSAgRENIRUNLKG91dHB1dF9wYXJhbXMuSXNWYWxpZCgpKTsKLSAgRENIRUNLX0VRKG91dHB1dF9wYXJhbXNfLmZvcm1hdCgpLCBBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MT1dfTEFURU5DWSk7Ci0KLSAgLy8gUmVjb3JkIFVNQSBzdGF0aXN0aWNzIGZvciB0aGUgaGFyZHdhcmUgY29uZmlndXJhdGlvbi4KLSAgUmVjb3JkU3RhdHMob3V0cHV0X3BhcmFtcyk7Ci0KLSAgSW5pdGlhbGl6ZSgpOwotfQotCi1BdWRpb091dHB1dFJlc2FtcGxlcjo6fkF1ZGlvT3V0cHV0UmVzYW1wbGVyKCkgewotICBEQ0hFQ0soY2FsbGJhY2tzXy5lbXB0eSgpKTsKLX0KLQotdm9pZCBBdWRpb091dHB1dFJlc2FtcGxlcjo6SW5pdGlhbGl6ZSgpIHsKLSAgRENIRUNLKCFzdHJlYW1zX29wZW5lZF8pOwotICBEQ0hFQ0soY2FsbGJhY2tzXy5lbXB0eSgpKTsKLSAgZGlzcGF0Y2hlcl8gPSBuZXcgQXVkaW9PdXRwdXREaXNwYXRjaGVySW1wbCgKLSAgICAgIGF1ZGlvX21hbmFnZXJfLCBvdXRwdXRfcGFyYW1zXywgY2xvc2VfZGVsYXlfKTsKLX0KLQotYm9vbCBBdWRpb091dHB1dFJlc2FtcGxlcjo6T3BlblN0cmVhbSgpIHsKLSAgRENIRUNLX0VRKE1lc3NhZ2VMb29wOjpjdXJyZW50KCksIG1lc3NhZ2VfbG9vcF8pOwotCi0gIGlmIChkaXNwYXRjaGVyXy0+T3BlblN0cmVhbSgpKSB7Ci0gICAgLy8gT25seSByZWNvcmQgdGhlIFVNQSBzdGF0aXN0aWMgaWYgd2UgZGlkbid0IGZhbGxiYWNrIGR1cmluZyBjb25zdHJ1Y3Rpb24KLSAgICAvLyBhbmQgb25seSBmb3IgdGhlIGZpcnN0IHN0cmVhbSB3ZSBvcGVuLgotICAgIGlmICghc3RyZWFtc19vcGVuZWRfICYmCi0gICAgICAgIG91dHB1dF9wYXJhbXNfLmZvcm1hdCgpID09IEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xPV19MQVRFTkNZKSB7Ci0gICAgICBVTUFfSElTVE9HUkFNX0JPT0xFQU4oIk1lZGlhLkZhbGxiYWNrVG9IaWdoTGF0ZW5jeUF1ZGlvUGF0aCIsIGZhbHNlKTsKLSAgICB9Ci0gICAgc3RyZWFtc19vcGVuZWRfID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vIElmIHdlJ3ZlIGFscmVhZHkgdHJpZWQgdG8gb3BlbiB0aGUgc3RyZWFtIGluIGhpZ2ggbGF0ZW5jeSBtb2RlIG9yIHdlJ3ZlCi0gIC8vIHN1Y2Nlc3NmdWxseSBvcGVuZWQgYSBzdHJlYW0gcHJldmlvdXNseSwgdGhlcmUncyBub3RoaW5nIG1vcmUgdG8gYmUgZG9uZS4KLSAgaWYgKG91dHB1dF9wYXJhbXNfLmZvcm1hdCgpID09IEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xJTkVBUiB8fAotICAgICAgc3RyZWFtc19vcGVuZWRfIHx8ICFjYWxsYmFja3NfLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBEQ0hFQ0tfRVEob3V0cHV0X3BhcmFtc18uZm9ybWF0KCksIEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xPV19MQVRFTkNZKTsKLQotICBpZiAoQ29tbWFuZExpbmU6OkZvckN1cnJlbnRQcm9jZXNzKCktPkhhc1N3aXRjaCgKLSAgICAgICAgICBzd2l0Y2hlczo6a0Rpc2FibGVBdWRpb0ZhbGxiYWNrKSkgewotICAgIExPRyhFUlJPUikgPDwgIk9wZW4gZmFpbGVkIGFuZCBhdXRvbWF0aWMgZmFsbGJhY2sgdG8gaGlnaCBsYXRlbmN5IGF1ZGlvICIKLSAgICAgICAgICAgICAgIDw8ICJwYXRoIGlzIGRpc2FibGVkLCBhYm9ydGluZy4iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIERMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gb3BlbiBhdWRpbyBkZXZpY2UgaW4gbG93IGxhdGVuY3kgbW9kZS4gIEZhbGxpbmcgIgotICAgICAgICAgICAgICA8PCAiYmFjayB0byBoaWdoIGxhdGVuY3kgYXVkaW8gb3V0cHV0LiI7Ci0KLSAgLy8gUmVjb3JkIFVNQSBzdGF0aXN0aWNzIGFib3V0IHRoZSBoYXJkd2FyZSB3aGljaCB0cmlnZ2VyZWQgdGhlIGZhaWx1cmUgc28KLSAgLy8gd2UgY2FuIGRlYnVnIGFuZCB0cmlhZ2UgbGF0ZXIuCi0gIFJlY29yZEZhbGxiYWNrU3RhdHMob3V0cHV0X3BhcmFtc18pOwotICBvdXRwdXRfcGFyYW1zXyA9IFNldHVwRmFsbGJhY2tQYXJhbXMocGFyYW1zXywgb3V0cHV0X3BhcmFtc18pOwotICBJbml0aWFsaXplKCk7Ci0KLSAgLy8gUmV0cnksIGlmIHRoaXMgZmFpbHMsIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvIGJ1dCByZXBvcnQgdGhlIGVycm9yIGJhY2suCi0gIHJldHVybiBkaXNwYXRjaGVyXy0+T3BlblN0cmVhbSgpOwotfQotCi1ib29sIEF1ZGlvT3V0cHV0UmVzYW1wbGVyOjpTdGFydFN0cmVhbSgKLSAgICBBdWRpb091dHB1dFN0cmVhbTo6QXVkaW9Tb3VyY2VDYWxsYmFjayogY2FsbGJhY2ssCi0gICAgQXVkaW9PdXRwdXRQcm94eSogc3RyZWFtX3Byb3h5KSB7Ci0gIERDSEVDS19FUShNZXNzYWdlTG9vcDo6Y3VycmVudCgpLCBtZXNzYWdlX2xvb3BfKTsKLQotICBPbk1vcmVEYXRhQ29udmVydGVyKiByZXNhbXBsZXJfY2FsbGJhY2sgPSBOVUxMOwotICBDYWxsYmFja01hcDo6aXRlcmF0b3IgaXQgPSBjYWxsYmFja3NfLmZpbmQoc3RyZWFtX3Byb3h5KTsKLSAgaWYgKGl0ID09IGNhbGxiYWNrc18uZW5kKCkpIHsKLSAgICByZXNhbXBsZXJfY2FsbGJhY2sgPSBuZXcgT25Nb3JlRGF0YUNvbnZlcnRlcihwYXJhbXNfLCBvdXRwdXRfcGFyYW1zXyk7Ci0gICAgY2FsbGJhY2tzX1tzdHJlYW1fcHJveHldID0gcmVzYW1wbGVyX2NhbGxiYWNrOwotICB9IGVsc2UgewotICAgIHJlc2FtcGxlcl9jYWxsYmFjayA9IGl0LT5zZWNvbmQ7Ci0gIH0KLSAgcmVzYW1wbGVyX2NhbGxiYWNrLT5TdGFydChjYWxsYmFjayk7Ci0gIHJldHVybiBkaXNwYXRjaGVyXy0+U3RhcnRTdHJlYW0ocmVzYW1wbGVyX2NhbGxiYWNrLCBzdHJlYW1fcHJveHkpOwotfQotCi12b2lkIEF1ZGlvT3V0cHV0UmVzYW1wbGVyOjpTdHJlYW1Wb2x1bWVTZXQoQXVkaW9PdXRwdXRQcm94eSogc3RyZWFtX3Byb3h5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2b2x1bWUpIHsKLSAgRENIRUNLX0VRKE1lc3NhZ2VMb29wOjpjdXJyZW50KCksIG1lc3NhZ2VfbG9vcF8pOwotICBkaXNwYXRjaGVyXy0+U3RyZWFtVm9sdW1lU2V0KHN0cmVhbV9wcm94eSwgdm9sdW1lKTsKLX0KLQotdm9pZCBBdWRpb091dHB1dFJlc2FtcGxlcjo6U3RvcFN0cmVhbShBdWRpb091dHB1dFByb3h5KiBzdHJlYW1fcHJveHkpIHsKLSAgRENIRUNLX0VRKE1lc3NhZ2VMb29wOjpjdXJyZW50KCksIG1lc3NhZ2VfbG9vcF8pOwotICBkaXNwYXRjaGVyXy0+U3RvcFN0cmVhbShzdHJlYW1fcHJveHkpOwotCi0gIC8vIE5vdyB0aGF0IFN0b3BTdHJlYW0oKSBoYXMgY29tcGxldGVkIHRoZSB1bmRlcmx5aW5nIHBoeXNpY2FsIHN0cmVhbSBzaG91bGQKLSAgLy8gYmUgc3RvcHBlZCBhbmQgbm8gbG9uZ2VyIGNhbGxpbmcgT25Nb3JlRGF0YSgpLCBtYWtpbmcgaXQgc2FmZSB0byBTdG9wKCkgdGhlCi0gIC8vIE9uTW9yZURhdGFDb252ZXJ0ZXIuCi0gIENhbGxiYWNrTWFwOjppdGVyYXRvciBpdCA9IGNhbGxiYWNrc18uZmluZChzdHJlYW1fcHJveHkpOwotICBpZiAoaXQgIT0gY2FsbGJhY2tzXy5lbmQoKSkKLSAgICBpdC0+c2Vjb25kLT5TdG9wKCk7Ci19Ci0KLXZvaWQgQXVkaW9PdXRwdXRSZXNhbXBsZXI6OkNsb3NlU3RyZWFtKEF1ZGlvT3V0cHV0UHJveHkqIHN0cmVhbV9wcm94eSkgewotICBEQ0hFQ0tfRVEoTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSwgbWVzc2FnZV9sb29wXyk7Ci0gIGRpc3BhdGNoZXJfLT5DbG9zZVN0cmVhbShzdHJlYW1fcHJveHkpOwotCi0gIC8vIFdlIGFzc3VtZSB0aGF0IFN0b3BTdHJlYW0oKSBpcyBhbHdheXMgY2FsbGVkIHByaW9yIHRvIENsb3NlU3RyZWFtKCksIHNvCi0gIC8vIHRoYXQgaXQgaXMgc2FmZSB0byBkZWxldGUgdGhlIE9uTW9yZURhdGFDb252ZXJ0ZXIgaGVyZS4KLSAgQ2FsbGJhY2tNYXA6Oml0ZXJhdG9yIGl0ID0gY2FsbGJhY2tzXy5maW5kKHN0cmVhbV9wcm94eSk7Ci0gIGlmIChpdCAhPSBjYWxsYmFja3NfLmVuZCgpKSB7Ci0gICAgZGVsZXRlIGl0LT5zZWNvbmQ7Ci0gICAgY2FsbGJhY2tzXy5lcmFzZShpdCk7Ci0gIH0KLX0KLQotdm9pZCBBdWRpb091dHB1dFJlc2FtcGxlcjo6U2h1dGRvd24oKSB7Ci0gIERDSEVDS19FUShNZXNzYWdlTG9vcDo6Y3VycmVudCgpLCBtZXNzYWdlX2xvb3BfKTsKLQotICAvLyBObyBBdWRpb091dHB1dFByb3h5IG9iamVjdHMgc2hvdWxkIGhvbGQgYSByZWZlcmVuY2UgdG8gdXMgd2hlbiB3ZSBnZXQKLSAgLy8gdG8gdGhpcyBzdGFnZS4KLSAgRENIRUNLKEhhc09uZVJlZigpKSA8PCAiT25seSB0aGUgQXVkaW9NYW5hZ2VyIHNob3VsZCBob2xkIGEgcmVmZXJlbmNlIjsKLQotICBkaXNwYXRjaGVyXy0+U2h1dGRvd24oKTsKLSAgRENIRUNLKGNhbGxiYWNrc18uZW1wdHkoKSk7Ci19Ci0KLU9uTW9yZURhdGFDb252ZXJ0ZXI6Ok9uTW9yZURhdGFDb252ZXJ0ZXIoY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBpbnB1dF9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgb3V0cHV0X3BhcmFtcykKLSAgICA6IHNvdXJjZV9jYWxsYmFja18oTlVMTCksCi0gICAgICBzb3VyY2VfYnVzXyhOVUxMKSwKLSAgICAgIGlucHV0X2J5dGVzX3Blcl9zZWNvbmRfKGlucHV0X3BhcmFtcy5HZXRCeXRlc1BlclNlY29uZCgpKSwKLSAgICAgIGF1ZGlvX2NvbnZlcnRlcl8oaW5wdXRfcGFyYW1zLCBvdXRwdXRfcGFyYW1zLCBmYWxzZSksCi0gICAgICB3YXZlb3V0X3dhaXRfaGFja18oZmFsc2UpIHsKLSAgaW9fcmF0aW9fID0KLSAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4oaW5wdXRfcGFyYW1zLkdldEJ5dGVzUGVyU2Vjb25kKCkpIC8KLSAgICAgIG91dHB1dF9wYXJhbXMuR2V0Qnl0ZXNQZXJTZWNvbmQoKTsKLQotICAvLyBUT0RPKGRhbGVjdXJ0aXMpOiBXZSBzaG91bGQgcmVxdWlyZSBhbGwgcmVuZGVyIHNpZGUgY2xpZW50cyB0byB1c2UgYQotICAvLyBidWZmZXIgc2l6ZSB0aGF0J3MgYSBtdWx0aXBsZSBvZiB0aGUgaGFyZHdhcmUgYnVmZmVyIHNpemUgc2NhbGVkIGJ5IHRoZQotICAvLyByZXF1ZXN0X3NhbXBsZV9yYXRlIC8gaHdfc2FtcGxlX3JhdGUuICBEb2luZyBzbyBlbnN1cmVzIGVhY2ggaGFyZHdhcmUKLSAgLy8gcmVxdWVzdCBmb3IgYXVkaW8gZGF0YSByZXN1bHRzIGluIG9ubHkgYSBzaW5nbGUgcmVuZGVyIHNpZGUgY2FsbGJhY2sgYW5kCi0gIC8vIHdvdWxkIGFsbG93IHVzIHRvIHJlbW92ZSB0aGlzIGhhY2suICBTZWUgaHR0cDovL2NyYnVnLmNvbS8xNjIyMDcuCi0jaWYgZGVmaW5lZChPU19XSU4pCi0gIHdhdmVvdXRfd2FpdF9oYWNrXyA9Ci0gICAgICBvdXRwdXRfcGFyYW1zLmZvcm1hdCgpID09IEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xJTkVBUiB8fAotICAgICAgIUNvcmVBdWRpb1V0aWw6OklzU3VwcG9ydGVkKCk7Ci0jZW5kaWYKLX0KLQotT25Nb3JlRGF0YUNvbnZlcnRlcjo6fk9uTW9yZURhdGFDb252ZXJ0ZXIoKSB7fQotCi12b2lkIE9uTW9yZURhdGFDb252ZXJ0ZXI6OlN0YXJ0KAotICAgIEF1ZGlvT3V0cHV0U3RyZWFtOjpBdWRpb1NvdXJjZUNhbGxiYWNrKiBjYWxsYmFjaykgewotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2soc291cmNlX2xvY2tfKTsKLSAgRENIRUNLKCFzb3VyY2VfY2FsbGJhY2tfKTsKLSAgc291cmNlX2NhbGxiYWNrXyA9IGNhbGxiYWNrOwotCi0gIC8vIFdoaWxlIEF1ZGlvQ29udmVydGVyIGNhbiBoYW5kbGUgbXVsdGlwbGUgaW5wdXRzLCB3ZSdyZSB1c2luZyBpdCBvbmx5IHdpdGgKLSAgLy8gYSBzaW5nbGUgaW5wdXQgY3VycmVudGx5LiAgRXZlbnR1YWxseSB0aGlzIG1heSBiZSB0aGUgYmFzaXMgZm9yIGEgYnJvd3NlcgotICAvLyBzaWRlIG1peGVyLgotICBhdWRpb19jb252ZXJ0ZXJfLkFkZElucHV0KHRoaXMpOwotfQotCi12b2lkIE9uTW9yZURhdGFDb252ZXJ0ZXI6OlN0b3AoKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhzb3VyY2VfbG9ja18pOwotICBzb3VyY2VfY2FsbGJhY2tfID0gTlVMTDsKLSAgYXVkaW9fY29udmVydGVyXy5SZW1vdmVJbnB1dCh0aGlzKTsKLX0KLQotaW50IE9uTW9yZURhdGFDb252ZXJ0ZXI6Ok9uTW9yZURhdGEoQXVkaW9CdXMqIGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlcnNTdGF0ZSBidWZmZXJzX3N0YXRlKSB7Ci0gIHJldHVybiBPbk1vcmVJT0RhdGEoTlVMTCwgZGVzdCwgYnVmZmVyc19zdGF0ZSk7Ci19Ci0KLWludCBPbk1vcmVEYXRhQ29udmVydGVyOjpPbk1vcmVJT0RhdGEoQXVkaW9CdXMqIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdXMqIGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyc1N0YXRlIGJ1ZmZlcnNfc3RhdGUpIHsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKHNvdXJjZV9sb2NrXyk7Ci0gIC8vIFdoaWxlIHdlIHdhaXRlZCBmb3IgfHNvdXJjZV9sb2NrX3wgdGhlIGNhbGxiYWNrIG1pZ2h0IGhhdmUgYmVlbiBjbGVhcmVkLgotICBpZiAoIXNvdXJjZV9jYWxsYmFja18pIHsKLSAgICBkZXN0LT5aZXJvKCk7Ci0gICAgcmV0dXJuIGRlc3QtPmZyYW1lcygpOwotICB9Ci0KLSAgc291cmNlX2J1c18gPSBzb3VyY2U7Ci0gIGN1cnJlbnRfYnVmZmVyc19zdGF0ZV8gPSBidWZmZXJzX3N0YXRlOwotICBhdWRpb19jb252ZXJ0ZXJfLkNvbnZlcnQoZGVzdCk7Ci0KLSAgLy8gQWx3YXlzIHJldHVybiB0aGUgZnVsbCBudW1iZXIgb2YgZnJhbWVzIHJlcXVlc3RlZCwgUHJvdmlkZUlucHV0X0xvY2tlZCgpCi0gIC8vIHdpbGwgcGFkIHdpdGggc2lsZW5jZSBpZiBpdCB3YXNuJ3QgYWJsZSB0byBhY3F1aXJlIGVub3VnaCBkYXRhLgotICByZXR1cm4gZGVzdC0+ZnJhbWVzKCk7Ci19Ci0KLWRvdWJsZSBPbk1vcmVEYXRhQ29udmVydGVyOjpQcm92aWRlSW5wdXQoQXVkaW9CdXMqIGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YSBidWZmZXJfZGVsYXkpIHsKLSAgc291cmNlX2xvY2tfLkFzc2VydEFjcXVpcmVkKCk7Ci0KLSAgLy8gQWRqdXN0IHBsYXliYWNrIGRlbGF5IHRvIGluY2x1ZGUgfGJ1ZmZlcl9kZWxheXwuCi0gIC8vIFRPRE8oZGFsZWN1cnRpcyk6IFN0b3AgcGFzc2luZyBieXRlcyBhcm91bmQsIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSBzaW5jZQotICAvLyBBdWRpb0J1cyBpcyBqdXN0IGZsb2F0IGRhdGEuICBVc2UgVGltZURlbHRhIGluc3RlYWQuCi0gIEF1ZGlvQnVmZmVyc1N0YXRlIG5ld19idWZmZXJzX3N0YXRlOwotICBuZXdfYnVmZmVyc19zdGF0ZS5wZW5kaW5nX2J5dGVzID0KLSAgICAgIGlvX3JhdGlvXyAqIChjdXJyZW50X2J1ZmZlcnNfc3RhdGVfLnRvdGFsX2J5dGVzKCkgKwotICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9kZWxheS5JblNlY29uZHNGKCkgKiBpbnB1dF9ieXRlc19wZXJfc2Vjb25kXyk7Ci0KLSAgaWYgKHdhdmVvdXRfd2FpdF9oYWNrXykKLSAgICBzb3VyY2VfY2FsbGJhY2tfLT5XYWl0VGlsbERhdGFSZWFkeSgpOwotCi0gIC8vIFJldHJpZXZlIGRhdGEgZnJvbSB0aGUgb3JpZ2luYWwgY2FsbGJhY2suCi0gIGludCBmcmFtZXMgPSBzb3VyY2VfY2FsbGJhY2tfLT5Pbk1vcmVJT0RhdGEoCi0gICAgICBzb3VyY2VfYnVzXywgZGVzdCwgbmV3X2J1ZmZlcnNfc3RhdGUpOwotCi0gIC8vIHxzb3VyY2VfYnVzX3wgc2hvdWxkIG9ubHkgYmUgcHJvdmlkZWQgb25jZS4KLSAgLy8gVE9ETyhkYWxlY3VydGlzLCBjcm9nZXJzKTogVGhpcyBpcyBub3QgYSBjb21wbGV0ZSBmaXguICBJZiBQcm92aWRlSW5wdXQoKQotICAvLyBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMsIHdlIG5lZWQgdG8gZG8gc29tZXRoaW5nIG1vcmUgY2xldmVyIGhlcmUuCi0gIHNvdXJjZV9idXNfID0gTlVMTDsKLQotICAvLyBaZXJvIGFueSB1bmZpbGxlZCBmcmFtZXMgaWYgYW55dGhpbmcgd2FzIGZpbGxlZCwgb3RoZXJ3aXNlIHdlJ2xsIGp1c3QKLSAgLy8gcmV0dXJuIGEgdm9sdW1lIG9mIHplcm8gYW5kIGxldCBBdWRpb0NvbnZlcnRlciBkcm9wIHRoZSBvdXRwdXQuCi0gIGlmIChmcmFtZXMgPiAwICYmIGZyYW1lcyA8IGRlc3QtPmZyYW1lcygpKQotICAgIGRlc3QtPlplcm9GcmFtZXNQYXJ0aWFsKGZyYW1lcywgZGVzdC0+ZnJhbWVzKCkgLSBmcmFtZXMpOwotCi0gIC8vIFRPRE8oZGFsZWN1cnRpcyk6IFJldHVybiB0aGUgY29ycmVjdCB2b2x1bWUgaGVyZS4KLSAgcmV0dXJuIGZyYW1lcyA+IDAgPyAxIDogMDsKLX0KLQotdm9pZCBPbk1vcmVEYXRhQ29udmVydGVyOjpPbkVycm9yKEF1ZGlvT3V0cHV0U3RyZWFtKiBzdHJlYW0sIGludCBjb2RlKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhzb3VyY2VfbG9ja18pOwotICBpZiAoc291cmNlX2NhbGxiYWNrXykKLSAgICBzb3VyY2VfY2FsbGJhY2tfLT5PbkVycm9yKHN0cmVhbSwgY29kZSk7Ci19Ci0KLXZvaWQgT25Nb3JlRGF0YUNvbnZlcnRlcjo6V2FpdFRpbGxEYXRhUmVhZHkoKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhzb3VyY2VfbG9ja18pOwotICBpZiAoc291cmNlX2NhbGxiYWNrXykKLSAgICBzb3VyY2VfY2FsbGJhY2tfLT5XYWl0VGlsbERhdGFSZWFkeSgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb19vdXRwdXRfcmVzYW1wbGVyLmggYi9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fb3V0cHV0X3Jlc2FtcGxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTdjZjM0Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb19vdXRwdXRfcmVzYW1wbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0FVRElPX0FVRElPX09VVFBVVF9SRVNBTVBMRVJfSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fQVVESU9fT1VUUFVUX1JFU0FNUExFUl9IXwotCi0jaW5jbHVkZSA8bWFwPgotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RpbWUuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19pby5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX21hbmFnZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19vdXRwdXRfZGlzcGF0Y2hlci5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3BhcmFtZXRlcnMuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgT25Nb3JlRGF0YUNvbnZlcnRlcjsKLQotLy8gQXVkaW9PdXRwdXRSZXNhbXBsZXIgaXMgYSBicm93c2VyLXNpZGUgcmVzYW1wbGluZyBhbmQgYnVmZmVyaW5nIHNvbHV0aW9uCi0vLyB3aGljaCBlbnN1cmVzIGF1ZGlvIGRhdGEgaXMgYWx3YXlzIG91dHB1dCBhdCBnaXZlbiBwYXJhbWV0ZXJzLiAgU2VlIHRoZQotLy8gQXVkaW9Db252ZXJ0ZXIgY2xhc3MgZm9yIGRldGFpbHMgb24gdGhlIGNvbnZlcnNpb24gcHJvY2Vzcy4KLS8vCi0vLyBBT1Igd29ya3MgYnkgaW50ZXJjZXB0aW5nIHRoZSBBdWRpb1NvdXJjZUNhbGxiYWNrIHByb3ZpZGVkIHRvIFN0YXJ0U3RyZWFtKCkKLS8vIGFuZCByZWRpcmVjdGluZyBpdCB0aHJvdWdoIGFuIEF1ZGlvQ29udmVydGVyIGluc3RhbmNlLiAgQXVkaW9CdWZmZXJzU3RhdGUgaXMKLS8vIGFkanVzdGVkIGZvciBidWZmZXIgZGVsYXkgY2F1c2VkIGJ5IHRoZSBjb252ZXJzaW9uIHByb2Nlc3MuCi0vLwotLy8gQU9SIHdpbGwgYXV0b21hdGljYWxseSBmYWxsIGJhY2sgZnJvbSBBVURJT19QQ01fTE9XX0xBVEVOQ1kgdG8KLS8vIEFVRElPX1BDTV9MSU5FQVIgaWYgdGhlIG91dHB1dCBkZXZpY2UgZmFpbHMgdG8gb3BlbiBhdCB0aGUgcmVxdWVzdGVkIG91dHB1dAotLy8gcGFyYW1ldGVycy4KLS8vCi0vLyBUT0RPKGRhbGVjdXJ0aXMpOiBJZGVhbGx5IHRoZSBsb3cgbGF0ZW5jeSBwYXRoIHdpbGwgYmUgYXMgcmVsaWFibGUgYXMgdGhlCi0vLyBoaWdoIGxhdGVuY3kgcGF0aCBvbmNlIHdlIGhhdmUgY2hhbm5lbCBtaXhpbmcgYW5kIHN1cHBvcnQgcXVlcnlpbmcgZm9yIHRoZQotLy8gaGFyZHdhcmUncyBjb25maWd1cmVkIGJpdCBkZXB0aC4gIE1vbml0b3IgdGhlIFVNQSBzdGF0cyBmb3IgZmFsbGJhY2sgYW5kCi0vLyByZW1vdmUgZmFsbGJhY2sgc3VwcG9ydCBvbmNlIGl0J3Mgc3RhYmxlLiAgaHR0cDovL2NyYnVnLmNvbS8xNDg0MTgKLWNsYXNzIE1FRElBX0VYUE9SVCBBdWRpb091dHB1dFJlc2FtcGxlciA6IHB1YmxpYyBBdWRpb091dHB1dERpc3BhdGNoZXIgewotIHB1YmxpYzoKLSAgQXVkaW9PdXRwdXRSZXNhbXBsZXIoQXVkaW9NYW5hZ2VyKiBhdWRpb19tYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIGlucHV0X3BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBvdXRwdXRfcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpUaW1lRGVsdGEmIGNsb3NlX2RlbGF5KTsKLQotICAvLyBBdWRpb091dHB1dERpc3BhdGNoZXIgaW50ZXJmYWNlLgotICB2aXJ0dWFsIGJvb2wgT3BlblN0cmVhbSgpIE9WRVJSSURFOwotICB2aXJ0dWFsIGJvb2wgU3RhcnRTdHJlYW0oQXVkaW9PdXRwdXRTdHJlYW06OkF1ZGlvU291cmNlQ2FsbGJhY2sqIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9PdXRwdXRQcm94eSogc3RyZWFtX3Byb3h5KSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0b3BTdHJlYW0oQXVkaW9PdXRwdXRQcm94eSogc3RyZWFtX3Byb3h5KSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0cmVhbVZvbHVtZVNldChBdWRpb091dHB1dFByb3h5KiBzdHJlYW1fcHJveHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZvbHVtZSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBDbG9zZVN0cmVhbShBdWRpb091dHB1dFByb3h5KiBzdHJlYW1fcHJveHkpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU2h1dGRvd24oKSBPVkVSUklERTsKLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxBdWRpb091dHB1dFJlc2FtcGxlcj47Ci0gIHZpcnR1YWwgfkF1ZGlvT3V0cHV0UmVzYW1wbGVyKCk7Ci0KLSAgLy8gVXNlZCB0byBpbml0aWFsaXplIGFuZCByZWluaXRpYWxpemUgfGRpc3BhdGNoZXJffC4KLSAgdm9pZCBJbml0aWFsaXplKCk7Ci0KLSAgLy8gRGlzcGF0Y2hlciB0byBwcm94eSBhbGwgQXVkaW9PdXRwdXREaXNwYXRjaGVyIGNhbGxzIHRvby4KLSAgc2NvcGVkX3JlZnB0cjxBdWRpb091dHB1dERpc3BhdGNoZXI+IGRpc3BhdGNoZXJfOwotCi0gIC8vIE1hcCBvZiBvdXRzdGFuZGluZyBPbk1vcmVEYXRhQ29udmVydGVyIG9iamVjdHMuICBBIG5ldyBvYmplY3QgaXMgY3JlYXRlZAotICAvLyBvbiBldmVyeSBTdGFydFN0cmVhbSgpIGNhbGwgYW5kIGRlc3Ryb3llZCBvbiBDbG9zZVN0cmVhbSgpLgotICB0eXBlZGVmIHN0ZDo6bWFwPEF1ZGlvT3V0cHV0UHJveHkqLCBPbk1vcmVEYXRhQ29udmVydGVyKj4gQ2FsbGJhY2tNYXA7Ci0gIENhbGxiYWNrTWFwIGNhbGxiYWNrc187Ci0KLSAgLy8gVXNlZCBieSBBdWRpb091dHB1dERpc3BhdGNoZXJJbXBsOyBrZXB0IHNvIHdlIGNhbiByZWluaXRpYWxpemUgb24gdGhlIGZseS4KLSAgYmFzZTo6VGltZURlbHRhIGNsb3NlX2RlbGF5XzsKLQotICAvLyBBdWRpb1BhcmFtZXRlcnMgdXNlZCB0byBzZXR1cCB0aGUgb3V0cHV0IHN0cmVhbS4KLSAgQXVkaW9QYXJhbWV0ZXJzIG91dHB1dF9wYXJhbXNfOwotCi0gIC8vIFdoZXRoZXIgYW55IHN0cmVhbXMgaGF2ZSBiZWVuIG9wZW5lZCB0aHJvdWdoIHxkaXNwYXRjaGVyX3wsIGlmIHNvIHdlIGNhbid0Ci0gIC8vIGZhbGxiYWNrIG9uIGZ1dHVyZSBPcGVuU3RyZWFtKCkgZmFpbHVyZXMuCi0gIGJvb2wgc3RyZWFtc19vcGVuZWRfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBdWRpb091dHB1dFJlc2FtcGxlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9BVURJT19BVURJT19PVVRQVVRfUkVTQU1QTEVSX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fcGFyYW1ldGVycy5jYyBiL3NyYy9tZWRpYS9hdWRpby9hdWRpb19wYXJhbWV0ZXJzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDkyNjNmLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb19wYXJhbWV0ZXJzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3BhcmFtZXRlcnMuaCIKLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbGltaXRzLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLUF1ZGlvUGFyYW1ldGVyczo6QXVkaW9QYXJhbWV0ZXJzKCkKLSAgICA6IGZvcm1hdF8oQVVESU9fUENNX0xJTkVBUiksCi0gICAgICBjaGFubmVsX2xheW91dF8oQ0hBTk5FTF9MQVlPVVRfTk9ORSksCi0gICAgICBzYW1wbGVfcmF0ZV8oMCksCi0gICAgICBiaXRzX3Blcl9zYW1wbGVfKDApLAotICAgICAgZnJhbWVzX3Blcl9idWZmZXJfKDApLAotICAgICAgY2hhbm5lbHNfKDApIHsKLX0KLQotQXVkaW9QYXJhbWV0ZXJzOjpBdWRpb1BhcmFtZXRlcnMoRm9ybWF0IGZvcm1hdCwgQ2hhbm5lbExheW91dCBjaGFubmVsX2xheW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVfcmF0ZSwgaW50IGJpdHNfcGVyX3NhbXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZXNfcGVyX2J1ZmZlcikKLSAgICA6IGZvcm1hdF8oZm9ybWF0KSwKLSAgICAgIGNoYW5uZWxfbGF5b3V0XyhjaGFubmVsX2xheW91dCksCi0gICAgICBzYW1wbGVfcmF0ZV8oc2FtcGxlX3JhdGUpLAotICAgICAgYml0c19wZXJfc2FtcGxlXyhiaXRzX3Blcl9zYW1wbGUpLAotICAgICAgZnJhbWVzX3Blcl9idWZmZXJfKGZyYW1lc19wZXJfYnVmZmVyKSwKLSAgICAgIGNoYW5uZWxzXyhDaGFubmVsTGF5b3V0VG9DaGFubmVsQ291bnQoY2hhbm5lbF9sYXlvdXQpKSB7Ci19Ci0KLXZvaWQgQXVkaW9QYXJhbWV0ZXJzOjpSZXNldChGb3JtYXQgZm9ybWF0LCBDaGFubmVsTGF5b3V0IGNoYW5uZWxfbGF5b3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVfcmF0ZSwgaW50IGJpdHNfcGVyX3NhbXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVzX3Blcl9idWZmZXIpIHsKLSAgZm9ybWF0XyA9IGZvcm1hdDsKLSAgY2hhbm5lbF9sYXlvdXRfID0gY2hhbm5lbF9sYXlvdXQ7Ci0gIHNhbXBsZV9yYXRlXyA9IHNhbXBsZV9yYXRlOwotICBiaXRzX3Blcl9zYW1wbGVfID0gYml0c19wZXJfc2FtcGxlOwotICBmcmFtZXNfcGVyX2J1ZmZlcl8gPSBmcmFtZXNfcGVyX2J1ZmZlcjsKLSAgY2hhbm5lbHNfID0gQ2hhbm5lbExheW91dFRvQ2hhbm5lbENvdW50KGNoYW5uZWxfbGF5b3V0KTsKLX0KLQotYm9vbCBBdWRpb1BhcmFtZXRlcnM6OklzVmFsaWQoKSBjb25zdCB7Ci0gIHJldHVybiAoZm9ybWF0XyA+PSBBVURJT19QQ01fTElORUFSKSAmJgotICAgICAgICAgKGZvcm1hdF8gPCBBVURJT19MQVNUX0ZPUk1BVCkgJiYKLSAgICAgICAgIChjaGFubmVsc18gPiAwKSAmJgotICAgICAgICAgKGNoYW5uZWxzXyA8PSBtZWRpYTo6bGltaXRzOjprTWF4Q2hhbm5lbHMpICYmCi0gICAgICAgICAoY2hhbm5lbF9sYXlvdXRfID4gQ0hBTk5FTF9MQVlPVVRfVU5TVVBQT1JURUQpICYmCi0gICAgICAgICAoY2hhbm5lbF9sYXlvdXRfIDwgQ0hBTk5FTF9MQVlPVVRfTUFYKSAmJgotICAgICAgICAgKHNhbXBsZV9yYXRlXyA+PSBtZWRpYTo6bGltaXRzOjprTWluU2FtcGxlUmF0ZSkgJiYKLSAgICAgICAgIChzYW1wbGVfcmF0ZV8gPD0gbWVkaWE6OmxpbWl0czo6a01heFNhbXBsZVJhdGUpICYmCi0gICAgICAgICAoYml0c19wZXJfc2FtcGxlXyA+IDApICYmCi0gICAgICAgICAoYml0c19wZXJfc2FtcGxlXyA8PSBtZWRpYTo6bGltaXRzOjprTWF4Qml0c1BlclNhbXBsZSkgJiYKLSAgICAgICAgIChmcmFtZXNfcGVyX2J1ZmZlcl8gPiAwKSAmJgotICAgICAgICAgKGZyYW1lc19wZXJfYnVmZmVyXyA8PSBtZWRpYTo6bGltaXRzOjprTWF4U2FtcGxlc1BlclBhY2tldCk7Ci19Ci0KLWludCBBdWRpb1BhcmFtZXRlcnM6OkdldEJ5dGVzUGVyQnVmZmVyKCkgY29uc3QgewotICByZXR1cm4gZnJhbWVzX3Blcl9idWZmZXJfICogR2V0Qnl0ZXNQZXJGcmFtZSgpOwotfQotCi1pbnQgQXVkaW9QYXJhbWV0ZXJzOjpHZXRCeXRlc1BlclNlY29uZCgpIGNvbnN0IHsKLSAgcmV0dXJuIHNhbXBsZV9yYXRlXyAqIEdldEJ5dGVzUGVyRnJhbWUoKTsKLX0KLQotaW50IEF1ZGlvUGFyYW1ldGVyczo6R2V0Qnl0ZXNQZXJGcmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGNoYW5uZWxzXyAqIGJpdHNfcGVyX3NhbXBsZV8gLyA4OwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb19wYXJhbWV0ZXJzLmggYi9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fcGFyYW1ldGVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjI1NDY4Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb19wYXJhbWV0ZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0FVRElPX0FVRElPX1BBUkFNRVRFUlNfSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fQVVESU9fUEFSQU1FVEVSU19IXwotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9jaGFubmVsX2xheW91dC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLXN0cnVjdCBNRURJQV9FWFBPUlQgQXVkaW9JbnB1dEJ1ZmZlclBhcmFtZXRlcnMgewotICBkb3VibGUgdm9sdW1lOwotICB1aW50MzIgc2l6ZTsKLX07Ci0KLS8vIFVzZSBhIHN0cnVjdC1pbi1zdHJ1Y3QgYXBwcm9hY2ggdG8gZW5zdXJlIHRoYXQgd2UgY2FuIGNhbGN1bGF0ZSB0aGUgcmVxdWlyZWQKLS8vIHNpemUgYXMgc2l6ZW9mKEF1ZGlvSW5wdXRCdWZmZXJQYXJhbWV0ZXJzKSArICMoYnl0ZXMgaW4gYXVkaW8gYnVmZmVyKSB3aXRob3V0Ci0vLyB1c2luZyBwYWNraW5nLgotc3RydWN0IE1FRElBX0VYUE9SVCBBdWRpb0lucHV0QnVmZmVyIHsKLSAgQXVkaW9JbnB1dEJ1ZmZlclBhcmFtZXRlcnMgcGFyYW1zOwotICBpbnQ4IGF1ZGlvWzFdOwotfTsKLQotY2xhc3MgTUVESUFfRVhQT1JUIEF1ZGlvUGFyYW1ldGVycyB7Ci0gcHVibGljOgotICBlbnVtIEZvcm1hdCB7Ci0gICAgQVVESU9fUENNX0xJTkVBUiA9IDAsICAgICAvLyBQQ00gaXMgJ3JhdycgYW1wbGl0dWRlIHNhbXBsZXMuCi0gICAgQVVESU9fUENNX0xPV19MQVRFTkNZLCAgICAvLyBMaW5lYXIgUENNLCBsb3cgbGF0ZW5jeSByZXF1ZXN0ZWQuCi0gICAgQVVESU9fRkFLRSwgICAgICAgICAgICAgICAvLyBDcmVhdGVzIGEgZmFrZSBBdWRpb091dHB1dFN0cmVhbSBvYmplY3QuCi0gICAgQVVESU9fVklSVFVBTCwgICAgICAgICAgICAvLyBDcmVhdGVzIGEgVmlydHVhbEF1ZGlvSW5wdXRTdHJlYW0gb2JqZWN0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwbGllcyB0byBpbnB1dCBzdHJlYW1zIG9ubHkuCi0gICAgQVVESU9fTEFTVF9GT1JNQVQgICAgICAgICAvLyBPbmx5IHVzZWQgZm9yIHZhbGlkYXRpb24gb2YgZm9ybWF0LgotICB9OwotCi0gIGVudW0gewotICAgIC8vIFRlbGVwaG9uZSBxdWFsaXR5IHNhbXBsZSByYXRlLCBtb3N0bHkgZm9yIHNwZWVjaC1vbmx5IGF1ZGlvLgotICAgIGtUZWxlcGhvbmVTYW1wbGVSYXRlID0gODAwMCwKLSAgICAvLyBDRCBzYW1wbGluZyByYXRlIGlzIDQ0LjEgS0h6IG9yIGNvbnZlbmllbnRseSAyeDJ4M3gzeDV4NXg3eDcuCi0gICAga0F1ZGlvQ0RTYW1wbGVSYXRlID0gNDQxMDAsCi0gIH07Ci0KLSAgQXVkaW9QYXJhbWV0ZXJzKCk7Ci0gIEF1ZGlvUGFyYW1ldGVycyhGb3JtYXQgZm9ybWF0LCBDaGFubmVsTGF5b3V0IGNoYW5uZWxfbGF5b3V0LAotICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZV9yYXRlLCBpbnQgYml0c19wZXJfc2FtcGxlLAotICAgICAgICAgICAgICAgICAgaW50IGZyYW1lc19wZXJfYnVmZmVyKTsKLSAgdm9pZCBSZXNldChGb3JtYXQgZm9ybWF0LCBDaGFubmVsTGF5b3V0IGNoYW5uZWxfbGF5b3V0LAotICAgICAgICAgICAgIGludCBzYW1wbGVfcmF0ZSwgaW50IGJpdHNfcGVyX3NhbXBsZSwKLSAgICAgICAgICAgICBpbnQgZnJhbWVzX3Blcl9idWZmZXIpOwotCi0gIC8vIENoZWNrcyB0aGF0IGFsbCB2YWx1ZXMgYXJlIGluIHRoZSBleHBlY3RlZCByYW5nZS4gQWxsIGxpbWl0cyBhcmUgc3BlY2lmaWVkCi0gIC8vIGluIG1lZGlhOjpMaW1pdHMuCi0gIGJvb2wgSXNWYWxpZCgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgc2l6ZSBvZiBhdWRpbyBidWZmZXIgaW4gYnl0ZXMuCi0gIGludCBHZXRCeXRlc1BlckJ1ZmZlcigpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZXByZXNlbnRpbmcgb25lIHNlY29uZCBvZiBhdWRpby4KLSAgaW50IEdldEJ5dGVzUGVyU2Vjb25kKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcHJlc2VudGluZyBhIGZyYW1lIG9mIGF1ZGlvLgotICBpbnQgR2V0Qnl0ZXNQZXJGcmFtZSgpIGNvbnN0OwotCi0gIEZvcm1hdCBmb3JtYXQoKSBjb25zdCB7IHJldHVybiBmb3JtYXRfOyB9Ci0gIENoYW5uZWxMYXlvdXQgY2hhbm5lbF9sYXlvdXQoKSBjb25zdCB7IHJldHVybiBjaGFubmVsX2xheW91dF87IH0KLSAgaW50IHNhbXBsZV9yYXRlKCkgY29uc3QgeyByZXR1cm4gc2FtcGxlX3JhdGVfOyB9Ci0gIGludCBiaXRzX3Blcl9zYW1wbGUoKSBjb25zdCB7IHJldHVybiBiaXRzX3Blcl9zYW1wbGVfOyB9Ci0gIGludCBmcmFtZXNfcGVyX2J1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIGZyYW1lc19wZXJfYnVmZmVyXzsgfQotICBpbnQgY2hhbm5lbHMoKSBjb25zdCB7IHJldHVybiBjaGFubmVsc187IH0KLQotIHByaXZhdGU6Ci0gIEZvcm1hdCBmb3JtYXRfOyAgICAgICAgICAgICAgICAgLy8gRm9ybWF0IG9mIHRoZSBzdHJlYW0uCi0gIENoYW5uZWxMYXlvdXQgY2hhbm5lbF9sYXlvdXRfOyAgLy8gT3JkZXIgb2Ygc3Vycm91bmQgc291bmQgY2hhbm5lbHMuCi0gIGludCBzYW1wbGVfcmF0ZV87ICAgICAgICAgICAgICAgLy8gU2FtcGxpbmcgZnJlcXVlbmN5L3JhdGUuCi0gIGludCBiaXRzX3Blcl9zYW1wbGVfOyAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJpdHMgcGVyIHNhbXBsZS4KLSAgaW50IGZyYW1lc19wZXJfYnVmZmVyXzsgICAgICAgICAvLyBOdW1iZXIgb2YgZnJhbWVzIGluIGEgYnVmZmVyLgotCi0gIGludCBjaGFubmVsc187ICAgICAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGNoYW5uZWxzLiBWYWx1ZSBzZXQgYmFzZWQgb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB8Y2hhbm5lbF9sYXlvdXR8LgotfTsKLQotLy8gQ29tcGFyaXNvbiBpcyB1c2VmdWwgd2hlbiBBdWRpb1BhcmFtZXRlcnMgaXMgdXNlZCB3aXRoIHN0ZCBzdHJ1Y3R1cmVzLgotaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgYSwgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBiKSB7Ci0gIGlmIChhLmZvcm1hdCgpICE9IGIuZm9ybWF0KCkpCi0gICAgcmV0dXJuIGEuZm9ybWF0KCkgPCBiLmZvcm1hdCgpOwotICBpZiAoYS5jaGFubmVscygpICE9IGIuY2hhbm5lbHMoKSkKLSAgICByZXR1cm4gYS5jaGFubmVscygpIDwgYi5jaGFubmVscygpOwotICBpZiAoYS5zYW1wbGVfcmF0ZSgpICE9IGIuc2FtcGxlX3JhdGUoKSkKLSAgICByZXR1cm4gYS5zYW1wbGVfcmF0ZSgpIDwgYi5zYW1wbGVfcmF0ZSgpOwotICBpZiAoYS5iaXRzX3Blcl9zYW1wbGUoKSAhPSBiLmJpdHNfcGVyX3NhbXBsZSgpKQotICAgIHJldHVybiBhLmJpdHNfcGVyX3NhbXBsZSgpIDwgYi5iaXRzX3Blcl9zYW1wbGUoKTsKLSAgcmV0dXJuIGEuZnJhbWVzX3Blcl9idWZmZXIoKSA8IGIuZnJhbWVzX3Blcl9idWZmZXIoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQVVESU9fQVVESU9fUEFSQU1FVEVSU19IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX3BhcmFtZXRlcnNfdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fcGFyYW1ldGVyc191bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ0MmUxNC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fcGFyYW1ldGVyc191bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9zdHJpbmdfbnVtYmVyX2NvbnZlcnNpb25zLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fcGFyYW1ldGVycy5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1URVNUKEF1ZGlvUGFyYW1ldGVycywgQ29uc3RydWN0b3JfRGVmYXVsdCkgewotICBBdWRpb1BhcmFtZXRlcnM6OkZvcm1hdCBleHBlY3RlZF9mb3JtYXQgPSBBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVI7Ci0gIGludCBleHBlY3RlZF9iaXRzID0gMDsKLSAgaW50IGV4cGVjdGVkX2NoYW5uZWxzID0gMDsKLSAgQ2hhbm5lbExheW91dCBleHBlY3RlZF9jaGFubmVsX2xheW91dCA9IENIQU5ORUxfTEFZT1VUX05PTkU7Ci0gIGludCBleHBlY3RlZF9yYXRlID0gMDsKLSAgaW50IGV4cGVjdGVkX3NhbXBsZXMgPSAwOwotCi0gIEF1ZGlvUGFyYW1ldGVycyBwYXJhbXM7Ci0KLSAgRVhQRUNUX0VRKGV4cGVjdGVkX2Zvcm1hdCwgcGFyYW1zLmZvcm1hdCgpKTsKLSAgRVhQRUNUX0VRKGV4cGVjdGVkX2JpdHMsIHBhcmFtcy5iaXRzX3Blcl9zYW1wbGUoKSk7Ci0gIEVYUEVDVF9FUShleHBlY3RlZF9jaGFubmVscywgcGFyYW1zLmNoYW5uZWxzKCkpOwotICBFWFBFQ1RfRVEoZXhwZWN0ZWRfY2hhbm5lbF9sYXlvdXQsIHBhcmFtcy5jaGFubmVsX2xheW91dCgpKTsKLSAgRVhQRUNUX0VRKGV4cGVjdGVkX3JhdGUsIHBhcmFtcy5zYW1wbGVfcmF0ZSgpKTsKLSAgRVhQRUNUX0VRKGV4cGVjdGVkX3NhbXBsZXMsIHBhcmFtcy5mcmFtZXNfcGVyX2J1ZmZlcigpKTsKLX0KLQotVEVTVChBdWRpb1BhcmFtZXRlcnMsIENvbnN0cnVjdG9yX1BhcmFtZXRlclZhbHVlcykgewotICBBdWRpb1BhcmFtZXRlcnM6OkZvcm1hdCBleHBlY3RlZF9mb3JtYXQgPQotICAgICAgQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTE9XX0xBVEVOQ1k7Ci0gIGludCBleHBlY3RlZF9iaXRzID0gMTY7Ci0gIGludCBleHBlY3RlZF9jaGFubmVscyA9IDY7Ci0gIENoYW5uZWxMYXlvdXQgZXhwZWN0ZWRfY2hhbm5lbF9sYXlvdXQgPSBDSEFOTkVMX0xBWU9VVF81XzE7Ci0gIGludCBleHBlY3RlZF9yYXRlID0gNDQxMDA7Ci0gIGludCBleHBlY3RlZF9zYW1wbGVzID0gODgwOwotCi0gIEF1ZGlvUGFyYW1ldGVycyBwYXJhbXMoZXhwZWN0ZWRfZm9ybWF0LCBleHBlY3RlZF9jaGFubmVsX2xheW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9yYXRlLCBleHBlY3RlZF9iaXRzLCBleHBlY3RlZF9zYW1wbGVzKTsKLQotICBFWFBFQ1RfRVEoZXhwZWN0ZWRfZm9ybWF0LCBwYXJhbXMuZm9ybWF0KCkpOwotICBFWFBFQ1RfRVEoZXhwZWN0ZWRfYml0cywgcGFyYW1zLmJpdHNfcGVyX3NhbXBsZSgpKTsKLSAgRVhQRUNUX0VRKGV4cGVjdGVkX2NoYW5uZWxzLCBwYXJhbXMuY2hhbm5lbHMoKSk7Ci0gIEVYUEVDVF9FUShleHBlY3RlZF9jaGFubmVsX2xheW91dCwgcGFyYW1zLmNoYW5uZWxfbGF5b3V0KCkpOwotICBFWFBFQ1RfRVEoZXhwZWN0ZWRfcmF0ZSwgcGFyYW1zLnNhbXBsZV9yYXRlKCkpOwotICBFWFBFQ1RfRVEoZXhwZWN0ZWRfc2FtcGxlcywgcGFyYW1zLmZyYW1lc19wZXJfYnVmZmVyKCkpOwotfQotCi1URVNUKEF1ZGlvUGFyYW1ldGVycywgR2V0Qnl0ZXNQZXJCdWZmZXIpIHsKLSAgRVhQRUNUX0VRKDEwMCwgQXVkaW9QYXJhbWV0ZXJzKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xJTkVBUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTEFZT1VUX01PTk8sIDEwMDAsICA4LCAxMDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuR2V0Qnl0ZXNQZXJCdWZmZXIoKSk7Ci0gIEVYUEVDVF9FUSgyMDAsIEF1ZGlvUGFyYW1ldGVycyhBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX0xBWU9VVF9NT05PLCAxMDAwLCAgMTYsIDEwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5HZXRCeXRlc1BlckJ1ZmZlcigpKTsKLSAgRVhQRUNUX0VRKDIwMCwgQXVkaW9QYXJhbWV0ZXJzKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xJTkVBUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTEFZT1VUX1NURVJFTywgMTAwMCwgIDgsIDEwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5HZXRCeXRlc1BlckJ1ZmZlcigpKTsKLSAgRVhQRUNUX0VRKDIwMCwgQXVkaW9QYXJhbWV0ZXJzKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xJTkVBUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTEFZT1VUX01PTk8sIDEwMDAsICA4LCAyMDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuR2V0Qnl0ZXNQZXJCdWZmZXIoKSk7Ci0gIEVYUEVDVF9FUSg4MDAsIEF1ZGlvUGFyYW1ldGVycyhBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX0xBWU9VVF9TVEVSRU8sIDEwMDAsICAxNiwgMjAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkdldEJ5dGVzUGVyQnVmZmVyKCkpOwotfQotCi1URVNUKEF1ZGlvUGFyYW1ldGVycywgR2V0Qnl0ZXNQZXJTZWNvbmQpIHsKLSAgRVhQRUNUX0VRKDAsIEF1ZGlvUGFyYW1ldGVycyhBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9MQVlPVVRfTk9ORSwgMCwgMCwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuR2V0Qnl0ZXNQZXJTZWNvbmQoKSk7Ci0gIEVYUEVDVF9FUSgwLCBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTEFZT1VUX1NURVJFTywgMCwgMCwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuR2V0Qnl0ZXNQZXJTZWNvbmQoKSk7Ci0gIEVYUEVDVF9FUSgwLCBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTEFZT1VUX05PTkUsIDEwMCwgMCwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuR2V0Qnl0ZXNQZXJTZWNvbmQoKSk7Ci0gIEVYUEVDVF9FUSgwLCBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTEFZT1VUX05PTkUsIDAsIDgsIDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkdldEJ5dGVzUGVyU2Vjb25kKCkpOwotICBFWFBFQ1RfRVEoMjAwLCBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9MQVlPVVRfU1RFUkVPLCAxMDAsIDgsIDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuR2V0Qnl0ZXNQZXJTZWNvbmQoKSk7Ci19Ci0KLVRFU1QoQXVkaW9QYXJhbWV0ZXJzLCBDb21wYXJlKSB7Ci0gIEF1ZGlvUGFyYW1ldGVycyB2YWx1ZXNbXSA9IHsKLSAgICBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSLCBDSEFOTkVMX0xBWU9VVF9NT05PLAotICAgICAgICAgICAgICAgICAgICAxMDAwLCAgOCwgMTAwKSwKLSAgICBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSLCBDSEFOTkVMX0xBWU9VVF9NT05PLAotICAgICAgICAgICAgICAgICAgICAxMDAwLCAgOCwgMjAwKSwKLSAgICBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSLCBDSEFOTkVMX0xBWU9VVF9NT05PLAotICAgICAgICAgICAgICAgICAgICAxMDAwLCAxNiwgMTAwKSwKLSAgICBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSLCBDSEFOTkVMX0xBWU9VVF9NT05PLAotICAgICAgICAgICAgICAgICAgICAxMDAwLCAxNiwgMjAwKSwKLSAgICBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSLCBDSEFOTkVMX0xBWU9VVF9NT05PLAotICAgICAgICAgICAgICAgICAgICAyMDAwLCAgOCwgMTAwKSwKLSAgICBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSLCBDSEFOTkVMX0xBWU9VVF9NT05PLAotICAgICAgICAgICAgICAgICAgICAyMDAwLCAgOCwgMjAwKSwKLSAgICBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSLCBDSEFOTkVMX0xBWU9VVF9NT05PLAotICAgICAgICAgICAgICAgICAgICAyMDAwLCAxNiwgMTAwKSwKLSAgICBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSLCBDSEFOTkVMX0xBWU9VVF9NT05PLAotICAgICAgICAgICAgICAgICAgICAyMDAwLCAxNiwgMjAwKSwKLQotICAgIEF1ZGlvUGFyYW1ldGVycyhBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIsIENIQU5ORUxfTEFZT1VUX1NURVJFTywKLSAgICAgICAgICAgICAgICAgICAgMTAwMCwgIDgsIDEwMCksCi0gICAgQXVkaW9QYXJhbWV0ZXJzKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xJTkVBUiwgQ0hBTk5FTF9MQVlPVVRfU1RFUkVPLAotICAgICAgICAgICAgICAgICAgICAxMDAwLCAgOCwgMjAwKSwKLSAgICBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSLCBDSEFOTkVMX0xBWU9VVF9TVEVSRU8sCi0gICAgICAgICAgICAgICAgICAgIDEwMDAsIDE2LCAxMDApLAotICAgIEF1ZGlvUGFyYW1ldGVycyhBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIsIENIQU5ORUxfTEFZT1VUX1NURVJFTywKLSAgICAgICAgICAgICAgICAgICAgMTAwMCwgMTYsIDIwMCksCi0gICAgQXVkaW9QYXJhbWV0ZXJzKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xJTkVBUiwgQ0hBTk5FTF9MQVlPVVRfU1RFUkVPLAotICAgICAgICAgICAgICAgICAgICAyMDAwLCAgOCwgMTAwKSwKLSAgICBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSLCBDSEFOTkVMX0xBWU9VVF9TVEVSRU8sCi0gICAgICAgICAgICAgICAgICAgIDIwMDAsICA4LCAyMDApLAotICAgIEF1ZGlvUGFyYW1ldGVycyhBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIsIENIQU5ORUxfTEFZT1VUX1NURVJFTywKLSAgICAgICAgICAgICAgICAgICAgMjAwMCwgMTYsIDEwMCksCi0gICAgQXVkaW9QYXJhbWV0ZXJzKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xJTkVBUiwgQ0hBTk5FTF9MQVlPVVRfU1RFUkVPLAotICAgICAgICAgICAgICAgICAgICAyMDAwLCAxNiwgMjAwKSwKLQotICAgIEF1ZGlvUGFyYW1ldGVycyhBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MT1dfTEFURU5DWSwgQ0hBTk5FTF9MQVlPVVRfTU9OTywKLSAgICAgICAgICAgICAgICAgICAgMTAwMCwgIDgsIDEwMCksCi0gICAgQXVkaW9QYXJhbWV0ZXJzKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xPV19MQVRFTkNZLCBDSEFOTkVMX0xBWU9VVF9NT05PLAotICAgICAgICAgICAgICAgICAgICAxMDAwLCAgOCwgMjAwKSwKLSAgICBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTE9XX0xBVEVOQ1ksIENIQU5ORUxfTEFZT1VUX01PTk8sCi0gICAgICAgICAgICAgICAgICAgIDEwMDAsIDE2LCAxMDApLAotICAgIEF1ZGlvUGFyYW1ldGVycyhBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MT1dfTEFURU5DWSwgQ0hBTk5FTF9MQVlPVVRfTU9OTywKLSAgICAgICAgICAgICAgICAgICAgMTAwMCwgMTYsIDIwMCksCi0gICAgQXVkaW9QYXJhbWV0ZXJzKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xPV19MQVRFTkNZLCBDSEFOTkVMX0xBWU9VVF9NT05PLAotICAgICAgICAgICAgICAgICAgICAyMDAwLCAgOCwgMTAwKSwKLSAgICBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTE9XX0xBVEVOQ1ksIENIQU5ORUxfTEFZT1VUX01PTk8sCi0gICAgICAgICAgICAgICAgICAgIDIwMDAsICA4LCAyMDApLAotICAgIEF1ZGlvUGFyYW1ldGVycyhBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MT1dfTEFURU5DWSwgQ0hBTk5FTF9MQVlPVVRfTU9OTywKLSAgICAgICAgICAgICAgICAgICAgMjAwMCwgMTYsIDEwMCksCi0gICAgQXVkaW9QYXJhbWV0ZXJzKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xPV19MQVRFTkNZLCBDSEFOTkVMX0xBWU9VVF9NT05PLAotICAgICAgICAgICAgICAgICAgICAyMDAwLCAxNiwgMjAwKSwKLQotICAgIEF1ZGlvUGFyYW1ldGVycyhBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MT1dfTEFURU5DWSwKLSAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9MQVlPVVRfU1RFUkVPLCAxMDAwLCAgOCwgMTAwKSwKLSAgICBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTE9XX0xBVEVOQ1ksCi0gICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTEFZT1VUX1NURVJFTywgMTAwMCwgIDgsIDIwMCksCi0gICAgQXVkaW9QYXJhbWV0ZXJzKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xPV19MQVRFTkNZLAotICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX0xBWU9VVF9TVEVSRU8sIDEwMDAsIDE2LCAxMDApLAotICAgIEF1ZGlvUGFyYW1ldGVycyhBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MT1dfTEFURU5DWSwKLSAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9MQVlPVVRfU1RFUkVPLCAxMDAwLCAxNiwgMjAwKSwKLSAgICBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTE9XX0xBVEVOQ1ksCi0gICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTEFZT1VUX1NURVJFTywgMjAwMCwgIDgsIDEwMCksCi0gICAgQXVkaW9QYXJhbWV0ZXJzKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xPV19MQVRFTkNZLAotICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX0xBWU9VVF9TVEVSRU8sIDIwMDAsICA4LCAyMDApLAotICAgIEF1ZGlvUGFyYW1ldGVycyhBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MT1dfTEFURU5DWSwKLSAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9MQVlPVVRfU1RFUkVPLCAyMDAwLCAxNiwgMTAwKSwKLSAgICBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTE9XX0xBVEVOQ1ksCi0gICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTEFZT1VUX1NURVJFTywgMjAwMCwgMTYsIDIwMCksCi0gIH07Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheXNpemUodmFsdWVzKTsgKytpKSB7Ci0gICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBhcnJheXNpemUodmFsdWVzKTsgKytqKSB7Ci0gICAgICBTQ09QRURfVFJBQ0UoImk9IiArIGJhc2U6OkludFRvU3RyaW5nKGkpICsgIiBqPSIgKyBiYXNlOjpJbnRUb1N0cmluZyhqKSk7Ci0gICAgICBFWFBFQ1RfRVEoaSA8IGosIHZhbHVlc1tpXSA8IHZhbHVlc1tqXSk7Ci0gICAgfQotCi0gICAgLy8gVmVyaWZ5IHRoYXQgYSB2YWx1ZSBpcyBuZXZlciBsZXNzIHRoYW4gaXRzZWxmLgotICAgIEVYUEVDVF9GQUxTRSh2YWx1ZXNbaV0gPCB2YWx1ZXNbaV0pOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2F1ZGlvX3V0aWwuY2MgYi9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fdXRpbC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkxNjEwZi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fdXRpbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDM4MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBTb2Z0d2FyZSBhZGp1c3Qgdm9sdW1lIG9mIHNhbXBsZXMsIGFsbG93cyBlYWNoIGF1ZGlvIHN0cmVhbSBpdHMgb3duCi0vLyB2b2x1bWUgd2l0aG91dCBpbXBhY3RpbmcgbWFzdGVyIHZvbHVtZSBmb3IgY2hyb21lIGFuZCBvdGhlciBhcHBsaWNhdGlvbnMuCi0KLS8vIEltcGxlbWVudGVkIGFzIHRlbXBsYXRlcyB0byBhbGxvdyA4LCAxNiBhbmQgMzIgYml0IGltcGxlbWVudGF0aW9ucy4KLS8vIDggYml0IGlzIHVuc2lnbmVkIGFuZCBiaWFzZWQgYnkgMTI4LgotCi0vLyBUT0RPKHZyayk6IFRoaXMgZmlsZSBoYXMgYmVlbiBydW5uaW5nIHByZXR0eSB3aWxkIGFuZCBmcmVlLCBhbmQgaXQncyBsaWtlbHkKLS8vIHRoYXQgYSBsb3Qgb2YgdGhlIGZ1bmN0aW9ucyBjYW4gYmUgc2ltcGxpZmllZCBhbmQgbWFkZSBtb3JlIGVsZWdhbnQuIFJldmlzaXQKLS8vIGFmdGVyIG90aGVyIGF1ZGlvIGNsZWFudXAgaXMgZG9uZS4gKGNyYnVnLmNvbS8xMjAzMTkpCi0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb191dGlsLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8bGltaXRzPgotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9jb21tYW5kX2xpbmUuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL3N0cmluZ19udW1iZXJfY29udmVyc2lvbnMuaCIKLSNpbmNsdWRlICJiYXNlL3RpbWUuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19wYXJhbWV0ZXJzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19idXMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX3N3aXRjaGVzLmgiCi0KLSNpZiBkZWZpbmVkKE9TX01BQ09TWCkKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9tYWMvYXVkaW9fbG93X2xhdGVuY3lfaW5wdXRfbWFjLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vbWFjL2F1ZGlvX2xvd19sYXRlbmN5X291dHB1dF9tYWMuaCIKLSNlbGlmIGRlZmluZWQoT1NfV0lOKQotI2luY2x1ZGUgImJhc2Uvd2luL3dpbmRvd3NfdmVyc2lvbi5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX21hbmFnZXJfYmFzZS5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3dpbi9hdWRpb19sb3dfbGF0ZW5jeV9pbnB1dF93aW4uaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby93aW4vYXVkaW9fbG93X2xhdGVuY3lfb3V0cHV0X3dpbi5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3dpbi9jb3JlX2F1ZGlvX3V0aWxfd2luLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9saW1pdHMuaCIKLSNlbmRpZgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBSZXR1cm5zIHVzZXIgYnVmZmVyIHNpemUgYXMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgb3IgMCBpZiBubyBidWZmZXIKLS8vIHNpemUgaGFzIGJlZW4gc3BlY2lmaWVkLgotc3RhdGljIGludCBHZXRVc2VyQnVmZmVyU2l6ZSgpIHsKLSAgY29uc3QgQ29tbWFuZExpbmUqIGNtZF9saW5lID0gQ29tbWFuZExpbmU6OkZvckN1cnJlbnRQcm9jZXNzKCk7Ci0gIGludCBidWZmZXJfc2l6ZSA9IDA7Ci0gIHN0ZDo6c3RyaW5nIGJ1ZmZlcl9zaXplX3N0cihjbWRfbGluZS0+R2V0U3dpdGNoVmFsdWVBU0NJSSgKLSAgICAgIHN3aXRjaGVzOjprQXVkaW9CdWZmZXJTaXplKSk7Ci0gIGlmIChiYXNlOjpTdHJpbmdUb0ludChidWZmZXJfc2l6ZV9zdHIsICZidWZmZXJfc2l6ZSkgJiYgYnVmZmVyX3NpemUgPiAwKSB7Ci0gICAgcmV0dXJuIGJ1ZmZlcl9zaXplOwotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIFRPRE8oZmJhcmNoYXJkKTogQ29udmVydCB0byBpbnRyaW5zaWNzIGZvciBiZXR0ZXIgZWZmaWNpZW5jeS4KLXRlbXBsYXRlPGNsYXNzIEZpeGVkPgotc3RhdGljIGludCBTY2FsZUNoYW5uZWwoaW50IGNoYW5uZWwsIGludCB2b2x1bWUpIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oKHN0YXRpY19jYXN0PEZpeGVkPihjaGFubmVsKSAqIHZvbHVtZSkgPj4gMTYpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBGb3JtYXQsIGNsYXNzIEZpeGVkLCBpbnQgYmlhcz4KLXN0YXRpYyB2b2lkIEFkanVzdFZvbHVtZShGb3JtYXQqIGJ1Zl9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZV9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZml4ZWRfdm9sdW1lKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgc2FtcGxlX2NvdW50OyArK2kpIHsKLSAgICBidWZfb3V0W2ldID0gc3RhdGljX2Nhc3Q8Rm9ybWF0PihTY2FsZUNoYW5uZWw8Rml4ZWQ+KGJ1Zl9vdXRbaV0gLSBiaWFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfdm9sdW1lKSArIGJpYXMpOwotICB9Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIEZpeGVkLCBpbnQgbWluX3ZhbHVlLCBpbnQgbWF4X3ZhbHVlPgotc3RhdGljIGludCBBZGRTYXR1cmF0ZWQoaW50IHZhbCwgaW50IGFkZGVyKSB7Ci0gIEZpeGVkIHN1bSA9IHN0YXRpY19jYXN0PEZpeGVkPih2YWwpICsgc3RhdGljX2Nhc3Q8Rml4ZWQ+KGFkZGVyKTsKLSAgaWYgKHN1bSA+IG1heF92YWx1ZSkKLSAgICByZXR1cm4gbWF4X3ZhbHVlOwotICBpZiAoc3VtIDwgbWluX3ZhbHVlKQotICAgIHJldHVybiBtaW5fdmFsdWU7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHN1bSk7Ci19Ci0KLS8vIEFkanVzdFZvbHVtZSgpIGRvZXMgYW4gaW4gcGxhY2UgYXVkaW8gc2FtcGxlIGNoYW5nZS4KLWJvb2wgQWRqdXN0Vm9sdW1lKHZvaWQqIGJ1ZiwKLSAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZsZW4sCi0gICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNfcGVyX3NhbXBsZSwKLSAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSkgewotICBEQ0hFQ0soYnVmKTsKLSAgaWYgKHZvbHVtZSA8IDAuMGYgfHwgdm9sdW1lID4gMS4wZikKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICh2b2x1bWUgPT0gMS4wZikgewotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgaWYgKHZvbHVtZSA9PSAwLjBmKSB7Ci0gICAgbWVtc2V0KGJ1ZiwgMCwgYnVmbGVuKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAoY2hhbm5lbHMgPiAwICYmIGNoYW5uZWxzIDw9IDggJiYgYnl0ZXNfcGVyX3NhbXBsZSA+IDApIHsKLSAgICBpbnQgc2FtcGxlX2NvdW50ID0gYnVmbGVuIC8gYnl0ZXNfcGVyX3NhbXBsZTsKLSAgICBjb25zdCBpbnQgZml4ZWRfdm9sdW1lID0gc3RhdGljX2Nhc3Q8aW50Pih2b2x1bWUgKiA2NTUzNik7Ci0gICAgaWYgKGJ5dGVzX3Blcl9zYW1wbGUgPT0gMSkgewotICAgICAgQWRqdXN0Vm9sdW1lPHVpbnQ4LCBpbnQzMiwgMTI4PihyZWludGVycHJldF9jYXN0PHVpbnQ4Kj4oYnVmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF92b2x1bWUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIGlmIChieXRlc19wZXJfc2FtcGxlID09IDIpIHsKLSAgICAgIEFkanVzdFZvbHVtZTxpbnQxNiwgaW50MzIsIDA+KHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTYqPihidWYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfdm9sdW1lKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSBpZiAoYnl0ZXNfcGVyX3NhbXBsZSA9PSA0KSB7Ci0gICAgICBBZGp1c3RWb2x1bWU8aW50MzIsIGludDY0LCAwPihyZWludGVycHJldF9jYXN0PGludDMyKj4oYnVmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3ZvbHVtZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBUT0RPKGVuYWwpOiB1c2UgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gYW5kIHNpemUtc3BlY2lmaWMgaW50cmluc2ljcy4KLS8vICAgICAgICAgICAgIENhbGwgaXMgb24gdGhlIHRpbWUtY3JpdGljYWwgcGF0aCwgYW5kIGJ5IHVzaW5nIFNTRS9BVlgKLS8vICAgICAgICAgICAgIGluc3RydWN0aW9ucyB3ZSBjYW4gc3BlZWQgdGhpbmdzIHVwIGJ5IH40LTh4LCBtb3JlIGZvciB0aGUgY2FzZQotLy8gICAgICAgICAgICAgd2hlbiB3ZSBoYXZlIHRvIGFkanVzdCB2b2x1bWUgYXMgd2VsbC4KLXRlbXBsYXRlPGNsYXNzIEZvcm1hdCwgY2xhc3MgRml4ZWQsIGludCBtaW5fdmFsdWUsIGludCBtYXhfdmFsdWUsIGludCBiaWFzPgotc3RhdGljIHZvaWQgTWl4U3RyZWFtcyhGb3JtYXQqIGRzdCwgRm9ybWF0KiBzcmMsIGludCBjb3VudCwgZmxvYXQgdm9sdW1lKSB7Ci0gIGlmICh2b2x1bWUgPT0gMC4wZikKLSAgICByZXR1cm47Ci0gIGlmICh2b2x1bWUgPT0gMS4wZikgewotICAgIC8vIE1vc3QgY29tbW9uIGNhc2UgLS0gbm8gbmVlZCB0byBhZGp1c3Qgdm9sdW1lLgotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgRml4ZWQgdmFsdWUgPSBBZGRTYXR1cmF0ZWQ8Rml4ZWQsIG1pbl92YWx1ZSwgbWF4X3ZhbHVlPihkc3RbaV0gLSBiaWFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNbaV0gLSBiaWFzKTsKLSAgICAgIGRzdFtpXSA9IHN0YXRpY19jYXN0PEZvcm1hdD4odmFsdWUgKyBiaWFzKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLy8gR2VuZXJhbCBjYXNlIC0tIGhhdmUgdG8gYWRqdXN0IHZvbHVtZSBiZWZvcmUgbWl4aW5nLgotICAgIGNvbnN0IGludCBmaXhlZF92b2x1bWUgPSBzdGF0aWNfY2FzdDxpbnQ+KHZvbHVtZSAqIDY1NTM2KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgIEZpeGVkIGFkanVzdGVkX3NyYyA9IFNjYWxlQ2hhbm5lbDxGaXhlZD4oc3JjW2ldIC0gYmlhcywgZml4ZWRfdm9sdW1lKTsKLSAgICAgIEZpeGVkIHZhbHVlID0gQWRkU2F0dXJhdGVkPEZpeGVkLCBtaW5fdmFsdWUsIG1heF92YWx1ZT4oZHN0W2ldIC0gYmlhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWRfc3JjKTsKLSAgICAgIGRzdFtpXSA9IHN0YXRpY19jYXN0PEZvcm1hdD4odmFsdWUgKyBiaWFzKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBNaXhTdHJlYW1zKHZvaWQqIGRzdCwKLSAgICAgICAgICAgICAgICB2b2lkKiBzcmMsCi0gICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmxlbiwKLSAgICAgICAgICAgICAgICBpbnQgYnl0ZXNfcGVyX3NhbXBsZSwKLSAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUpIHsKLSAgRENIRUNLKGRzdCk7Ci0gIERDSEVDSyhzcmMpOwotICBEQ0hFQ0tfR0Uodm9sdW1lLCAwLjBmKTsKLSAgRENIRUNLX0xFKHZvbHVtZSwgMS4wZik7Ci0gIHN3aXRjaCAoYnl0ZXNfcGVyX3NhbXBsZSkgewotICAgIGNhc2UgMToKLSAgICAgIE1peFN0cmVhbXM8dWludDgsIGludDMyLCBraW50OG1pbiwga2ludDhtYXgsIDEyOD4oCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDgqPihkc3QpLAotICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4Kj4oc3JjKSwKLSAgICAgICAgICBidWZsZW4sCi0gICAgICAgICAgdm9sdW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIERDSEVDS19FUSgwdSwgYnVmbGVuICUgMik7Ci0gICAgICBNaXhTdHJlYW1zPGludDE2LCBpbnQzMiwga2ludDE2bWluLCBraW50MTZtYXgsIDA+KAotICAgICAgICAgIHN0YXRpY19jYXN0PGludDE2Kj4oZHN0KSwKLSAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQxNio+KHNyYyksCi0gICAgICAgICAgYnVmbGVuIC8gMiwKLSAgICAgICAgICB2b2x1bWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgRENIRUNLX0VRKDB1LCBidWZsZW4gJSA0KTsKLSAgICAgIE1peFN0cmVhbXM8aW50MzIsIGludDY0LCBraW50MzJtaW4sIGtpbnQzMm1heCwgMD4oCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzIqPihkc3QpLAotICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyKj4oc3JjKSwKLSAgICAgICAgICBidWZsZW4gLyA0LAotICAgICAgICAgIHZvbHVtZSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTk9UUkVBQ0hFRCgpIDw8ICJJbGxlZ2FsIGJ5dGVzIHBlciBzYW1wbGUiOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotaW50IEdldEF1ZGlvSGFyZHdhcmVTYW1wbGVSYXRlKCkgewotI2lmIGRlZmluZWQoT1NfTUFDT1NYKQotICAvLyBIYXJkd2FyZSBzYW1wbGUtcmF0ZSBvbiB0aGUgTWFjIGNhbiBiZSBjb25maWd1cmVkLCBzbyB3ZSBtdXN0IHF1ZXJ5LgotICByZXR1cm4gQVVBdWRpb091dHB1dFN0cmVhbTo6SGFyZHdhcmVTYW1wbGVSYXRlKCk7Ci0jZWxpZiBkZWZpbmVkKE9TX1dJTikKLSAgaWYgKCFDb3JlQXVkaW9VdGlsOjpJc1N1cHBvcnRlZCgpKSB7Ci0gICAgLy8gRmFsbCBiYWNrIHRvIFdpbmRvd3MgV2F2ZSBpbXBsZW1lbnRhdGlvbiBvbiBXaW5kb3dzIFhQIG9yIGxvd2VyCi0gICAgLy8gYW5kIHVzZSA0OGtIeiBhcyBkZWZhdWx0IGlucHV0IHNhbXBsZSByYXRlLgotICAgIHJldHVybiA0ODAwMDsKLSAgfQotCi0gIC8vIFRPRE8oY3JvZ2Vycyk6IHR1bmUgdGhpcyByYXRlIGZvciBiZXN0IHBvc3NpYmxlIFdlYkF1ZGlvIHBlcmZvcm1hbmNlLgotICAvLyBXZWJSVEMgd29ya3Mgd2VsbCBhdCA0OGtIeiBhbmQgYSBidWZmZXIgc2l6ZSBvZiA0ODAgc2FtcGxlcyB3aWxsIGJlIHVzZWQKLSAgLy8gZm9yIHRoaXMgY2FzZS4gTm90ZSB0aGF0IGV4Y2x1c2l2ZSBtb2RlIGlzIGV4cGVyaW1lbnRhbC4KLSAgY29uc3QgQ29tbWFuZExpbmUqIGNtZF9saW5lID0gQ29tbWFuZExpbmU6OkZvckN1cnJlbnRQcm9jZXNzKCk7Ci0gIGlmIChjbWRfbGluZS0+SGFzU3dpdGNoKHN3aXRjaGVzOjprRW5hYmxlRXhjbHVzaXZlQXVkaW8pKSB7Ci0gICAgLy8gVGhpcyBzYW1wbGUgcmF0ZSB3aWxsIGJlIGNvbWJpbmVkIHdpdGggYSBidWZmZXIgc2l6ZSBvZiAyNTYgc2FtcGxlcwotICAgIC8vIChzZWUgR2V0QXVkaW9IYXJkd2FyZUJ1ZmZlclNpemUoKSksIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGFuIG91dHB1dAotICAgIC8vIGRlbGF5IG9mIH41LjMzbXMuCi0gICAgcmV0dXJuIDQ4MDAwOwotICB9Ci0KLSAgLy8gSGFyZHdhcmUgc2FtcGxlLXJhdGUgb24gV2luZG93cyBjYW4gYmUgY29uZmlndXJlZCwgc28gd2UgbXVzdCBxdWVyeS4KLSAgLy8gVE9ETyhoZW5yaWthKTogaW1wcm92ZSBwb3NzaWJpbGl0eSB0byBzcGVjaWZ5IGFuIGF1ZGlvIGVuZHBvaW50LgotICAvLyBVc2UgdGhlIGRlZmF1bHQgZGV2aWNlIChzYW1lIGFzIGZvciBXYXZlKSBmb3Igbm93IHRvIGJlIGNvbXBhdGlibGUKLSAgLy8gb3IgcG9zc2libHkgcmVtb3ZlIHRoZSBFUm9sZSBhcmd1bWVudCBjb21wbGV0ZWx5IHVudGlsIGl0IGlzIGluIHVzZS4KLSAgcmV0dXJuIFdBU0FQSUF1ZGlvT3V0cHV0U3RyZWFtOjpIYXJkd2FyZVNhbXBsZVJhdGUoZUNvbnNvbGUpOwotI2VsaWYgZGVmaW5lZChPU19BTkRST0lEKQotICByZXR1cm4gMTYwMDA7Ci0jZWxzZQotICAvLyBIYXJkd2FyZSBmb3IgTGludXggaXMgbmVhcmx5IGFsd2F5cyA0OEtIei4KLSAgLy8gVE9ETyhjcm9nZXJzKSA6IHJldHVybiBjb3JyZWN0IHZhbHVlIGluIHJhcmUgbm9uLTQ4S0h6IGNhc2VzLgotICByZXR1cm4gNDgwMDA7Ci0jZW5kaWYKLX0KLQotaW50IEdldEF1ZGlvSW5wdXRIYXJkd2FyZVNhbXBsZVJhdGUoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCkgewotICAvLyBUT0RPKGhlbnJpa2EpOiBhZGQgc3VwcG9ydCBmb3IgZGV2aWNlIHNlbGVjdGlvbiBvbiBhbGwgcGxhdGZvcm1zLgotICAvLyBPbmx5IGV4aXN0cyBvbiBXaW5kb3dzIHRvZGF5LgotI2lmIGRlZmluZWQoT1NfTUFDT1NYKQotICByZXR1cm4gQVVBdWRpb0lucHV0U3RyZWFtOjpIYXJkd2FyZVNhbXBsZVJhdGUoKTsKLSNlbGlmIGRlZmluZWQoT1NfV0lOKQotICBpZiAoIUNvcmVBdWRpb1V0aWw6OklzU3VwcG9ydGVkKCkpIHsKLSAgICByZXR1cm4gNDgwMDA7Ci0gIH0KLSAgcmV0dXJuIFdBU0FQSUF1ZGlvSW5wdXRTdHJlYW06OkhhcmR3YXJlU2FtcGxlUmF0ZShkZXZpY2VfaWQpOwotI2VsaWYgZGVmaW5lZChPU19BTkRST0lEKQotICByZXR1cm4gMTYwMDA7Ci0jZWxzZQotICByZXR1cm4gNDgwMDA7Ci0jZW5kaWYKLX0KLQotc2l6ZV90IEdldEF1ZGlvSGFyZHdhcmVCdWZmZXJTaXplKCkgewotICBpbnQgdXNlcl9idWZmZXJfc2l6ZSA9IEdldFVzZXJCdWZmZXJTaXplKCk7Ci0gIGlmICh1c2VyX2J1ZmZlcl9zaXplKQotICAgIHJldHVybiB1c2VyX2J1ZmZlcl9zaXplOwotCi0gIC8vIFRoZSBzaXplcyBoZXJlIHdlcmUgZGV0ZXJtaW5lZCBieSBleHBlcmltZW50YXRpb24gYW5kIGFyZSByb3VnaGx5Ci0gIC8vIHRoZSBsb3dlc3QgdmFsdWUgKGZvciBsb3cgbGF0ZW5jeSkgdGhhdCBzdGlsbCBhbGxvd2VkIGdsaXRjaC1mcmVlCi0gIC8vIGF1ZGlvIHVuZGVyIGhpZ2ggbG9hZHMuCi0gIC8vCi0gIC8vIEZvciBNYWMgT1MgWCBhbmQgV2luZG93cyB0aGUgY2hyb21pdW0gYXVkaW8gYmFja2VuZCB1c2VzIGEgbG93LWxhdGVuY3kKLSAgLy8gQ29yZSBBdWRpbyBBUEksIHNvIGEgbG93IGJ1ZmZlciBzaXplIGlzIHBvc3NpYmxlLiBGb3IgTGludXgsIGZ1cnRoZXIKLSAgLy8gdHVuaW5nIG1heSBiZSBuZWVkZWQuCi0jaWYgZGVmaW5lZChPU19NQUNPU1gpCi0gIHJldHVybiAxMjg7Ci0jZWxpZiBkZWZpbmVkKE9TX1dJTikKLSAgLy8gQnVmZmVyIHNpemUgdG8gdXNlIHdoZW4gYSBwcm9wZXIgc2l6ZSBjYW4ndCBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIHN5c3RlbS4KLSAgc3RhdGljIGNvbnN0IGludCBrRmFsbGJhY2tCdWZmZXJTaXplID0gNDA5NjsKLQotICBpZiAoIUNvcmVBdWRpb1V0aWw6OklzU3VwcG9ydGVkKCkpIHsKLSAgICAvLyBGYWxsIGJhY2sgdG8gV2luZG93cyBXYXZlIGltcGxlbWVudGF0aW9uIG9uIFdpbmRvd3MgWFAgb3IgbG93ZXIKLSAgICAvLyBhbmQgYXNzdW1lIDQ4a0h6IGFzIGRlZmF1bHQgc2FtcGxlIHJhdGUuCi0gICAgcmV0dXJuIGtGYWxsYmFja0J1ZmZlclNpemU7Ci0gIH0KLQotICAvLyBUT0RPKGNyb2dlcnMpOiB0dW5lIHRoaXMgc2l6ZSB0byBiZXN0IHBvc3NpYmxlIFdlYkF1ZGlvIHBlcmZvcm1hbmNlLgotICAvLyBXZWJSVEMgYWx3YXlzIHVzZXMgMTBtcyBmb3IgV2luZG93cyBhbmQgZG9lcyBub3QgY2FsbCB0aGlzIG1ldGhvZC4KLSAgLy8gTm90ZSB0aGF0IGV4Y2x1c2l2ZSBtb2RlIGlzIGV4cGVyaW1lbnRhbC4KLSAgY29uc3QgQ29tbWFuZExpbmUqIGNtZF9saW5lID0gQ29tbWFuZExpbmU6OkZvckN1cnJlbnRQcm9jZXNzKCk7Ci0gIGlmIChjbWRfbGluZS0+SGFzU3dpdGNoKHN3aXRjaGVzOjprRW5hYmxlRXhjbHVzaXZlQXVkaW8pKSB7Ci0gICAgcmV0dXJuIDI1NjsKLSAgfQotCi0gIC8vIFRPRE8oaGVucmlrYSk6IHJlbW92ZSB3aGVuIHRoZSAtLWVuYWJsZS13ZWJhdWRpby1pbnB1dCBmbGFnIGlzIG5vIGxvbmdlcgotICAvLyB1dGlsaXplZC4KLSAgaWYgKGNtZF9saW5lLT5IYXNTd2l0Y2goc3dpdGNoZXM6OmtFbmFibGVXZWJBdWRpb0lucHV0KSkgewotICAgIEF1ZGlvUGFyYW1ldGVycyBwYXJhbXM7Ci0gICAgSFJFU1VMVCBociA9IENvcmVBdWRpb1V0aWw6OkdldFByZWZlcnJlZEF1ZGlvUGFyYW1ldGVycyhlUmVuZGVyLCBlQ29uc29sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpOwotICAgIHJldHVybiBGQUlMRUQoaHIpID8ga0ZhbGxiYWNrQnVmZmVyU2l6ZSA6IHBhcmFtcy5mcmFtZXNfcGVyX2J1ZmZlcigpOwotICB9Ci0KLSAgLy8gVGhpcyBjYWxsIG11c3QgYmUgZG9uZSBvbiBhIENPTSB0aHJlYWQgY29uZmlndXJlZCBhcyBNVEEuCi0gIC8vIFRPRE8odG9tbWkpOiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0xMDM4MzUuCi0gIGludCBtaXhpbmdfc2FtcGxlX3JhdGUgPQotICAgICAgV0FTQVBJQXVkaW9PdXRwdXRTdHJlYW06OkhhcmR3YXJlU2FtcGxlUmF0ZShlQ29uc29sZSk7Ci0KLSAgLy8gV2luZG93cyB3aWxsIHJldHVybiBhIHNhbXBsZSByYXRlIG9mIDAgd2hlbiBubyBhdWRpbyBvdXRwdXQgaXMgYXZhaWxhYmxlCi0gIC8vIChpLmUuIHZpYSBSZW1vdGVEZXNrdG9wIHdpdGggcmVtb3RlIGF1ZGlvIGRpc2FibGVkKSwgYnV0IHdlIHNob3VsZCBuZXZlcgotICAvLyByZXR1cm4gYSBidWZmZXIgc2l6ZSBvZiB6ZXJvLgotICBpZiAobWl4aW5nX3NhbXBsZV9yYXRlID09IDApCi0gICAgcmV0dXJuIGtGYWxsYmFja0J1ZmZlclNpemU7Ci0KLSAgLy8gVXNlIGRpZmZlcmVudCBidWZmZXIgc2l6ZXMgZGVwZW5pbmcgb24gdGhlIHNhbXBsZSByYXRlIC4gVGhlIGV4aXN0aW5nCi0gIC8vIFdBU0FQSSBpbXBsZW1lbnRhdGlvbiBpcyB0dW5lZCB0byBwcm92aWRlIHRoZSBtb3N0IHN0YWJsZSBjYWxsYmFjawotICAvLyBzZXF1ZW5jZSB1c2luZyB0aGVzZSBjb21iaW5hdGlvbnMuCi0gIGlmIChtaXhpbmdfc2FtcGxlX3JhdGUgJSAxMTAyNSA9PSAwKQotICAgIC8vIFVzZSBidWZmZXIgc2l6ZSBvZiB+MTAuMTU4NzMgbXMuCi0gICAgcmV0dXJuICgxMTIgKiAobWl4aW5nX3NhbXBsZV9yYXRlIC8gMTEwMjUpKTsKLQotICBpZiAobWl4aW5nX3NhbXBsZV9yYXRlICUgODAwMCA9PSAwKQotICAgIC8vIFVzZSBidWZmZXIgc2l6ZSBvZiAxMG1zLgotICAgIHJldHVybiAoODAgKiAobWl4aW5nX3NhbXBsZV9yYXRlIC8gODAwMCkpOwotCi0gIC8vIEVuc3VyZSB3ZSBhbHdheXMgcmV0dXJuIGEgYnVmZmVyIHNpemUgd2hpY2ggaXMgc29tZXdoYXQgYXBwcm9wcmlhdGUuCi0gIExPRyhFUlJPUikgPDwgIlVua25vd24gc2FtcGxlIHJhdGUgIiA8PCBtaXhpbmdfc2FtcGxlX3JhdGUgPDwgIiBkZXRlY3RlZC4iOwotICBpZiAobWl4aW5nX3NhbXBsZV9yYXRlID4gbGltaXRzOjprTWluU2FtcGxlUmF0ZSkKLSAgICByZXR1cm4gKG1peGluZ19zYW1wbGVfcmF0ZSAvIDEwMCk7Ci0gIHJldHVybiBrRmFsbGJhY2tCdWZmZXJTaXplOwotI2Vsc2UKLSAgcmV0dXJuIDIwNDg7Ci0jZW5kaWYKLX0KLQotQ2hhbm5lbExheW91dCBHZXRBdWRpb0lucHV0SGFyZHdhcmVDaGFubmVsTGF5b3V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfaWQpIHsKLSAgLy8gVE9ETyhoZW5yaWthKTogYWRkIHN1cHBvcnQgZm9yIGRldmljZSBzZWxlY3Rpb24gb24gYWxsIHBsYXRmb3Jtcy4KLSAgLy8gT25seSBleGlzdHMgb24gV2luZG93cyB0b2RheS4KLSNpZiBkZWZpbmVkKE9TX01BQ09TWCkKLSAgcmV0dXJuIENIQU5ORUxfTEFZT1VUX01PTk87Ci0jZWxpZiBkZWZpbmVkKE9TX1dJTikKLSAgaWYgKCFDb3JlQXVkaW9VdGlsOjpJc1N1cHBvcnRlZCgpKSB7Ci0gICAgLy8gRmFsbCBiYWNrIHRvIFdpbmRvd3MgV2F2ZSBpbXBsZW1lbnRhdGlvbiBvbiBXaW5kb3dzIFhQIG9yIGxvd2VyIGFuZAotICAgIC8vIHVzZSBzdGVyZW8gYnkgZGVmYXVsdC4KLSAgICByZXR1cm4gQ0hBTk5FTF9MQVlPVVRfU1RFUkVPOwotICB9Ci0gIHJldHVybiBXQVNBUElBdWRpb0lucHV0U3RyZWFtOjpIYXJkd2FyZUNoYW5uZWxDb3VudChkZXZpY2VfaWQpID09IDEgPwotICAgICAgQ0hBTk5FTF9MQVlPVVRfTU9OTyA6IENIQU5ORUxfTEFZT1VUX1NURVJFTzsKLSNlbHNlCi0gIHJldHVybiBDSEFOTkVMX0xBWU9VVF9TVEVSRU87Ci0jZW5kaWYKLX0KLQotLy8gQ29tcHV0ZXMgYSBidWZmZXIgc2l6ZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gfHNhbXBsZV9yYXRlfC4gTXVzdCBiZSB1c2VkIGluCi0vLyBjb25qdW5jdGlvbiB3aXRoIEFVRElPX1BDTV9MSU5FQVIuCi1zaXplX3QgR2V0SGlnaExhdGVuY3lPdXRwdXRCdWZmZXJTaXplKGludCBzYW1wbGVfcmF0ZSkgewotICBpbnQgdXNlcl9idWZmZXJfc2l6ZSA9IEdldFVzZXJCdWZmZXJTaXplKCk7Ci0gIGlmICh1c2VyX2J1ZmZlcl9zaXplKQotICAgIHJldHVybiB1c2VyX2J1ZmZlcl9zaXplOwotCi0gIC8vIFRPRE8odnJrL2Nyb2dlcnMpOiBUaGUgYnVmZmVyIHNpemVzIHRoYXQgdGhpcyBmdW5jdGlvbiBjb21wdXRlcyBpcyBwcm9iYWJseQotICAvLyBvdmVybHkgY29uc2VydmF0aXZlLiBIb3dldmVyLCByZWR1Y2luZyB0aGUgYnVmZmVyIHNpemUgdG8gMjA0OC04MTkyIGJ5dGVzCi0gIC8vIGNhdXNlZCBjcmJ1Zy5jb20vMTA4Mzk2LiBUaGlzIGNvbXB1dGF0aW9uIHNob3VsZCBiZSByZXZpc2l0ZWQgd2hpbGUgbWFraW5nCi0gIC8vIHN1cmUgY3JidWcuY29tLzEwODM5NiBkb2Vzbid0IGhhcHBlbiBhZ2Fpbi4KLQotICAvLyBUaGUgbWluaW11bSBudW1iZXIgb2Ygc2FtcGxlcyBpbiBhIGhhcmR3YXJlIHBhY2tldC4KLSAgLy8gVGhpcyB2YWx1ZSBpcyBzZWxlY3RlZCBzbyB0aGF0IHdlIGNhbiBoYW5kbGUgZG93biB0byA1a2h6IHNhbXBsZSByYXRlLgotICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5TYW1wbGVzUGVySGFyZHdhcmVQYWNrZXQgPSAxMDI0OwotCi0gIC8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzYW1wbGVzIGluIGEgaGFyZHdhcmUgcGFja2V0LgotICAvLyBUaGlzIHZhbHVlIGlzIHNlbGVjdGVkIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSB1cCB0byAxOTJraHogc2FtcGxlIHJhdGUuCi0gIHN0YXRpYyBjb25zdCBzaXplX3Qga01heFNhbXBsZXNQZXJIYXJkd2FyZVBhY2tldCA9IDY0ICogMTAyNDsKLQotICAvLyBUaGlzIGNvbnN0YW50IGdvdmVybnMgdGhlIGhhcmR3YXJlIGF1ZGlvIGJ1ZmZlciBzaXplLCB0aGlzIHZhbHVlIHNob3VsZCBiZQotICAvLyBjaG9zZW4gY2FyZWZ1bGx5LgotICAvLyBUaGlzIHZhbHVlIGlzIHNlbGVjdGVkIHNvIHRoYXQgd2UgaGF2ZSA4MTkyIHNhbXBsZXMgZm9yIDQ4a2h6IHN0cmVhbXMuCi0gIHN0YXRpYyBjb25zdCBzaXplX3Qga01pbGxpc2Vjb25kc1BlckhhcmR3YXJlUGFja2V0ID0gMTcwOwotCi0gIC8vIFNlbGVjdCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdGhhdCBjYW4gcHJvdmlkZSBhdCBsZWFzdAotICAvLyB8a01pbGxpc2Vjb25kc1BlckhhcmR3YXJlUGFja2V0fCB3b3J0aCBvZiBhdWRpbyBkYXRhLgotICBzaXplX3Qgc2FtcGxlcyA9IGtNaW5TYW1wbGVzUGVySGFyZHdhcmVQYWNrZXQ7Ci0gIHdoaWxlIChzYW1wbGVzIDw9IGtNYXhTYW1wbGVzUGVySGFyZHdhcmVQYWNrZXQgJiYKLSAgICAgICAgIHNhbXBsZXMgKiBiYXNlOjpUaW1lOjprTWlsbGlzZWNvbmRzUGVyU2Vjb25kIDwKLSAgICAgICAgIHNhbXBsZV9yYXRlICoga01pbGxpc2Vjb25kc1BlckhhcmR3YXJlUGFja2V0KSB7Ci0gICAgc2FtcGxlcyAqPSAyOwotICB9Ci0gIHJldHVybiBzYW1wbGVzOwotfQotCi0jaWYgZGVmaW5lZChPU19XSU4pCi0KLWludCBOdW1iZXJPZldhdmVPdXRCdWZmZXJzKCkgewotICAvLyBVc2UgNCBidWZmZXJzIGZvciBWaXN0YSwgMyBmb3IgZXZlcnlvbmUgZWxzZToKLSAgLy8gIC0gVGhlIGVudGlyZSBXaW5kb3dzIGF1ZGlvIHN0YWNrIHdhcyByZXdyaXR0ZW4gZm9yIFdpbmRvd3MgVmlzdGEgYW5kIHdhdmUKLSAgLy8gICAgb3V0IHBlcmZvcm1hbmNlIHdhcyBkZWdyYWRlZCBjb21wYXJlZCB0byBYUC4KLSAgLy8gIC0gVGhlIHJlZ3Jlc3Npb24gd2FzIGZpeGVkIGluIFdpbmRvd3MgNyBhbmQgbW9zdCBjb25maWd1cmF0aW9ucyB3aWxsIHdvcmsKLSAgLy8gICAgd2l0aCAyLCBidXQgc29tZSAoZS5nLiwgc29tZSBTb3VuZCBCbGFzdGVycykgc3RpbGwgbmVlZCAzLgotICAvLyAgLSBTb21lIFhQIGNvbmZpZ3VyYXRpb25zIChldmVuIG11bHRpLXByb2Nlc3NvciBvbmVzKSBhbHNvIG5lZWQgMy4KLSAgcmV0dXJuIChiYXNlOjp3aW46OkdldFZlcnNpb24oKSA9PSBiYXNlOjp3aW46OlZFUlNJT05fVklTVEEpID8gNCA6IDM7Ci19Ci0KLSNlbmRpZgotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb191dGlsLmggYi9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fdXRpbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGNkYTQxLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb191dGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0FVRElPX0FVRElPX1VUSUxfSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fQVVESU9fVVRJTF9IXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9jaGFubmVsX2xheW91dC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLW5hbWVzcGFjZSBiYXNlIHsKLWNsYXNzIFNoYXJlZE1lbW9yeTsKLX0KLQotbmFtZXNwYWNlIG1lZGlhIHsKLWNsYXNzIEF1ZGlvQnVzOwotCi0vLyBGb3IgYWxsIGF1ZGlvIGZ1bmN0aW9ucyAzIGF1ZGlvIGZvcm1hdHMgYXJlIHN1cHBvcnRlZDoKLS8vIDggYml0cyB1bnNpZ25lZCAwIHRvIDI1NS4KLS8vIDE2IGJpdCBzaWduZWQgKGxpdHRsZSBlbmRpYW4pLgotLy8gMzIgYml0IHNpZ25lZCAobGl0dGxlIGVuZGlhbikKLQotLy8gQWRqdXN0Vm9sdW1lKCkgZG9lcyBhIHNvZnR3YXJlIHZvbHVtZSBhZGp1c3RtZW50IG9mIGEgc2FtcGxlIGJ1ZmZlci4KLS8vIFRoZSBzYW1wbGVzIGFyZSBtdWx0aXBsaWVkIGJ5IHRoZSB2b2x1bWUsIHdoaWNoIHNob3VsZCByYW5nZSBmcm9tCi0vLyAwLjAgKG11dGUpIHRvIDEuMCAoZnVsbCB2b2x1bWUpLgotLy8gVXNpbmcgc29mdHdhcmUgYWxsb3dzIGVhY2ggYXVkaW8gYW5kIHZpZGVvIHRvIGhhdmUgaXRzIG93biB2b2x1bWUgd2l0aG91dAotLy8gYWZmZWN0aW5nIHRoZSBtYXN0ZXIgdm9sdW1lLgotLy8gSW4gdGhlIGZ1dHVyZSB0aGUgZnVuY3Rpb24gbWF5IGJlIHVzZWQgdG8gYWRqdXN0IHRoZSBzYW1wbGUgZm9ybWF0IHRvCi0vLyBzaW1wbGlmeSBoYXJkd2FyZSByZXF1aXJlbWVudHMgYW5kIHRvIHN1cHBvcnQgYSB3aWRlciB2YXJpZXR5IG9mIGlucHV0Ci0vLyBmb3JtYXRzLgotLy8gVGhlIGJ1ZmZlciBpcyBtb2RpZmllZCBpbi1wbGFjZSB0byBhdm9pZCBtZW1vcnkgbWFuYWdlbWVudCwgYXMgdGhpcwotLy8gZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBpbiBwZXJmb3JtYW5jZSBjcml0aWNhbCBjb2RlLgotTUVESUFfRVhQT1JUIGJvb2wgQWRqdXN0Vm9sdW1lKHZvaWQqIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNfcGVyX3NhbXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUpOwotCi0vLyBNaXhTdHJlYW1zKCkgbWl4ZXMgMiBhdWRpbyBzdHJlYW1zIHdpdGggc2FtZSBzYW1wbGUgcmF0ZSBhbmQgbnVtYmVyIG9mCi0vLyBzYW1wbGVzLCBhZGp1c3Rpbmcgdm9sdW1lIG9uIG9uZSBvZiB0aGVtLgotLy8gRHN0ICs9IFNyYyAqIHZvbHVtZS4KLU1FRElBX0VYUE9SVCB2b2lkIE1peFN0cmVhbXModm9pZCogZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBieXRlc19wZXJfc2FtcGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUpOwotCi0vLyBSZXR1cm5zIHRoZSBkZWZhdWx0IGF1ZGlvIG91dHB1dCBoYXJkd2FyZSBzYW1wbGUtcmF0ZS4KLU1FRElBX0VYUE9SVCBpbnQgR2V0QXVkaW9IYXJkd2FyZVNhbXBsZVJhdGUoKTsKLQotLy8gUmV0dXJucyB0aGUgYXVkaW8gaW5wdXQgaGFyZHdhcmUgc2FtcGxlLXJhdGUgZm9yIHRoZSBzcGVjaWZpZWQgZGV2aWNlLgotTUVESUFfRVhQT1JUIGludCBHZXRBdWRpb0lucHV0SGFyZHdhcmVTYW1wbGVSYXRlKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfaWQpOwotCi0vLyBSZXR1cm5zIHRoZSBvcHRpbWFsIGxvdy1sYXRlbmN5IGJ1ZmZlciBzaXplIGZvciB0aGUgYXVkaW8gaGFyZHdhcmUuCi0vLyBUaGlzIGlzIHRoZSBzbWFsbGVzdCBidWZmZXIgc2l6ZSB0aGUgc3lzdGVtIGNhbiBjb21mb3J0YWJseSByZW5kZXIKLS8vIGF0IHdpdGhvdXQgZ2xpdGNoZXMuICBUaGUgYnVmZmVyIHNpemUgaXMgaW4gc2FtcGxlLWZyYW1lcy4KLU1FRElBX0VYUE9SVCBzaXplX3QgR2V0QXVkaW9IYXJkd2FyZUJ1ZmZlclNpemUoKTsKLQotLy8gUmV0dXJucyB0aGUgY2hhbm5lbCBsYXlvdXQgZm9yIHRoZSBzcGVjaWZpZWQgYXVkaW8gaW5wdXQgZGV2aWNlLgotTUVESUFfRVhQT1JUIENoYW5uZWxMYXlvdXQgR2V0QXVkaW9JbnB1dEhhcmR3YXJlQ2hhbm5lbExheW91dCgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2lkKTsKLQotLy8gQ29tcHV0ZXMgYSBidWZmZXIgc2l6ZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gfHNhbXBsZV9yYXRlfC4gTXVzdCBiZSB1c2VkIGluCi0vLyBjb25qdW5jdGlvbiB3aXRoIEFVRElPX1BDTV9MSU5FQVIuCi1NRURJQV9FWFBPUlQgc2l6ZV90IEdldEhpZ2hMYXRlbmN5T3V0cHV0QnVmZmVyU2l6ZShpbnQgc2FtcGxlX3JhdGUpOwotCi0jaWYgZGVmaW5lZChPU19XSU4pCi0KLS8vIFJldHVybnMgbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gYmUgdXNlZCBieSB3YXZlIG91dC4KLU1FRElBX0VYUE9SVCBpbnQgTnVtYmVyT2ZXYXZlT3V0QnVmZmVycygpOwotCi0jZW5kaWYgIC8vIGRlZmluZWQoT1NfV0lOKQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9BVURJT19BVURJT19VVElMX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vYXVkaW9fdXRpbF91bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9hdWRpby9hdWRpb191dGlsX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjQzYjk5Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9hdWRpb191dGlsX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb191dGlsLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0KLS8vIE51bWJlciBvZiBzYW1wbGVzIGluIGVhY2ggYXVkaW8gYXJyYXkuCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1iZXJPZlNhbXBsZXMgPSA0OwotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1URVNUKEF1ZGlvVXRpbFRlc3QsIEFkanVzdFZvbHVtZV91OCkgewotICAvLyBUZXN0IEFkanVzdFZvbHVtZSgpIG9uIDggYml0IHNhbXBsZXMuCi0gIHVpbnQ4IHNhbXBsZXNfdThba051bWJlck9mU2FtcGxlc10gPSB7IDQsIDB4NDAsIDB4ODAsIDB4ZmYgfTsKLSAgdWludDggZXhwZWN0ZWRfdThba051bWJlck9mU2FtcGxlc10gPSB7ICg0IC0gMTI4KSAvIDIgKyAxMjgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0MCAtIDEyOCkgLyAyICsgMTI4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ODAgLSAxMjgpIC8gMiArIDEyOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweGZmIC0gMTI4KSAvIDIgKyAxMjggfTsKLSAgYm9vbCByZXN1bHRfdTggPSBtZWRpYTo6QWRqdXN0Vm9sdW1lKHNhbXBsZXNfdTgsIHNpemVvZihzYW1wbGVzX3U4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsICAvLyBjaGFubmVscy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzYW1wbGVzX3U4WzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNWYpOwotICBFWFBFQ1RfVFJVRShyZXN1bHRfdTgpOwotICBpbnQgZXhwZWN0ZWRfdGVzdCA9IG1lbWNtcChzYW1wbGVzX3U4LCBleHBlY3RlZF91OCwgc2l6ZW9mKGV4cGVjdGVkX3U4KSk7Ci0gIEVYUEVDVF9FUSgwLCBleHBlY3RlZF90ZXN0KTsKLX0KLQotVEVTVChBdWRpb1V0aWxUZXN0LCBBZGp1c3RWb2x1bWVfczE2KSB7Ci0gIC8vIFRlc3QgQWRqdXN0Vm9sdW1lKCkgb24gMTYgYml0IHNhbXBsZXMuCi0gIGludDE2IHNhbXBsZXNfczE2W2tOdW1iZXJPZlNhbXBsZXNdID0geyAtNCwgMHg0MCwgLTMyNzY4LCAxMjMgfTsKLSAgaW50MTYgZXhwZWN0ZWRfczE2W2tOdW1iZXJPZlNhbXBsZXNdID0geyAtMSwgMHgxMCwgLTgxOTIsIDMwIH07Ci0gIGJvb2wgcmVzdWx0X3MxNiA9IG1lZGlhOjpBZGp1c3RWb2x1bWUoc2FtcGxlc19zMTYsIHNpemVvZihzYW1wbGVzX3MxNiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgIC8vIGNoYW5uZWxzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzYW1wbGVzX3MxNlswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNWYpOwotICBFWFBFQ1RfVFJVRShyZXN1bHRfczE2KTsKLSAgaW50IGV4cGVjdGVkX3Rlc3QgPSBtZW1jbXAoc2FtcGxlc19zMTYsIGV4cGVjdGVkX3MxNiwgc2l6ZW9mKGV4cGVjdGVkX3MxNikpOwotICBFWFBFQ1RfRVEoMCwgZXhwZWN0ZWRfdGVzdCk7Ci19Ci0KLVRFU1QoQXVkaW9VdGlsVGVzdCwgQWRqdXN0Vm9sdW1lX3MxNl96ZXJvKSB7Ci0gIC8vIFRlc3QgQWRqdXN0Vm9sdW1lKCkgb24gMTYgYml0IHNhbXBsZXMuCi0gIGludDE2IHNhbXBsZXNfczE2W2tOdW1iZXJPZlNhbXBsZXNdID0geyAtNCwgMHg0MCwgLTMyNzY4LCAxMjMgfTsKLSAgaW50MTYgZXhwZWN0ZWRfczE2W2tOdW1iZXJPZlNhbXBsZXNdID0geyAwLCAwLCAwLCAwIH07Ci0gIGJvb2wgcmVzdWx0X3MxNiA9IG1lZGlhOjpBZGp1c3RWb2x1bWUoc2FtcGxlc19zMTYsIHNpemVvZihzYW1wbGVzX3MxNiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgIC8vIGNoYW5uZWxzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzYW1wbGVzX3MxNlswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wZik7Ci0gIEVYUEVDVF9UUlVFKHJlc3VsdF9zMTYpOwotICBpbnQgZXhwZWN0ZWRfdGVzdCA9IG1lbWNtcChzYW1wbGVzX3MxNiwgZXhwZWN0ZWRfczE2LCBzaXplb2YoZXhwZWN0ZWRfczE2KSk7Ci0gIEVYUEVDVF9FUSgwLCBleHBlY3RlZF90ZXN0KTsKLX0KLQotVEVTVChBdWRpb1V0aWxUZXN0LCBBZGp1c3RWb2x1bWVfczE2X29uZSkgewotICAvLyBUZXN0IEFkanVzdFZvbHVtZSgpIG9uIDE2IGJpdCBzYW1wbGVzLgotICBpbnQxNiBzYW1wbGVzX3MxNltrTnVtYmVyT2ZTYW1wbGVzXSA9IHsgLTQsIDB4NDAsIC0zMjc2OCwgMTIzIH07Ci0gIGludDE2IGV4cGVjdGVkX3MxNltrTnVtYmVyT2ZTYW1wbGVzXSA9IHsgLTQsIDB4NDAsIC0zMjc2OCwgMTIzIH07Ci0gIGJvb2wgcmVzdWx0X3MxNiA9IG1lZGlhOjpBZGp1c3RWb2x1bWUoc2FtcGxlc19zMTYsIHNpemVvZihzYW1wbGVzX3MxNiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgIC8vIGNoYW5uZWxzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzYW1wbGVzX3MxNlswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wZik7Ci0gIEVYUEVDVF9UUlVFKHJlc3VsdF9zMTYpOwotICBpbnQgZXhwZWN0ZWRfdGVzdCA9IG1lbWNtcChzYW1wbGVzX3MxNiwgZXhwZWN0ZWRfczE2LCBzaXplb2YoZXhwZWN0ZWRfczE2KSk7Ci0gIEVYUEVDVF9FUSgwLCBleHBlY3RlZF90ZXN0KTsKLX0KLQotVEVTVChBdWRpb1V0aWxUZXN0LCBBZGp1c3RWb2x1bWVfczMyKSB7Ci0gIC8vIFRlc3QgQWRqdXN0Vm9sdW1lKCkgb24gMzIgYml0IHNhbXBsZXMuCi0gIGludDMyIHNhbXBsZXNfczMyW2tOdW1iZXJPZlNhbXBsZXNdID0geyAtNCwgMHg0MCwgLTMyNzY4LCAxMjMgfTsKLSAgaW50MzIgZXhwZWN0ZWRfczMyW2tOdW1iZXJPZlNhbXBsZXNdID0geyAtMSwgMHgxMCwgLTgxOTIsIDMwIH07Ci0gIGJvb2wgcmVzdWx0X3MzMiA9IG1lZGlhOjpBZGp1c3RWb2x1bWUoc2FtcGxlc19zMzIsIHNpemVvZihzYW1wbGVzX3MzMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgIC8vIGNoYW5uZWxzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzYW1wbGVzX3MzMlswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNWYpOwotICBFWFBFQ1RfVFJVRShyZXN1bHRfczMyKTsKLSAgaW50IGV4cGVjdGVkX3Rlc3QgPSBtZW1jbXAoc2FtcGxlc19zMzIsIGV4cGVjdGVkX3MzMiwgc2l6ZW9mKGV4cGVjdGVkX3MzMikpOwotICBFWFBFQ1RfRVEoMCwgZXhwZWN0ZWRfdGVzdCk7Ci19Ci0KLVRFU1QoQXVkaW9VdGlsVGVzdCwgTWl4U3RyZWFtc191OF9RdWFydGVyVm9sdW1lKSB7Ci0gIC8vIFRlc3QgTWl4U3RyZWFtcygpIG9uIDggYml0IHNhbXBsZXMuCi0gIHVpbnQ4IGRzdF91OFtrTnVtYmVyT2ZTYW1wbGVzXSA9IHsgMTQsIDB4NDQsIDB4ODAsIDB4ZmYgfTsKLSAgdWludDggc3JjX3U4W2tOdW1iZXJPZlNhbXBsZXNdID0geyA0LCAweDQwLCAweDgwLCAweGZmIH07Ci0gIHVpbnQ4IGV4cGVjdGVkX3U4W2tOdW1iZXJPZlNhbXBsZXNdID0geyAwLCAgLyogc2F0dXJhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDQgLSAxMjgpICsgKDB4NDAgLSAxMjgpIC8gNCArIDEyOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDgwIC0gMTI4KSArICgweDgwIC0gMTI4KSAvIDQgKyAxMjgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmIC8qIHNhdHVyYXRpb24gKi8gfTsKLSAgbWVkaWE6Ok1peFN0cmVhbXMoZHN0X3U4LCBzcmNfdTgsIHNpemVvZihkc3RfdTgpLCBzaXplb2Yoc3JjX3U4WzBdKSwgMC4yNWYpOwotICBpbnQgZXhwZWN0ZWRfdGVzdCA9IG1lbWNtcChkc3RfdTgsIGV4cGVjdGVkX3U4LCBzaXplb2YoZXhwZWN0ZWRfdTgpKTsKLSAgRVhQRUNUX0VRKDAsIGV4cGVjdGVkX3Rlc3QpOwotfQotCi1URVNUKEF1ZGlvVXRpbFRlc3QsIE1peFN0cmVhbXNfdThfRnVsbFZvbHVtZSkgewotICAvLyBUZXN0IE1peFN0cmVhbXMoKSBvbiA4IGJpdCBzYW1wbGVzLgotICB1aW50OCBkc3RfdThba051bWJlck9mU2FtcGxlc10gPSB7IDQ0LCAweDQ0LCAweDgwLCAweGZmIH07Ci0gIHVpbnQ4IHNyY191OFtrTnVtYmVyT2ZTYW1wbGVzXSA9IHsgNCwgMHg0MCwgMHg4MCwgMHhmZiB9OwotICB1aW50OCBleHBlY3RlZF91OFtrTnVtYmVyT2ZTYW1wbGVzXSA9IHsgMCwgIC8qIHNhdHVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ0IC0gMTI4KSArICgweDQwIC0gMTI4KSArIDEyOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDgwIC0gMTI4KSArICgweDgwIC0gMTI4KSArIDEyOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYgLyogc2F0dXJhdGlvbiAqLyB9OwotICBtZWRpYTo6TWl4U3RyZWFtcyhkc3RfdTgsIHNyY191OCwgc2l6ZW9mKGRzdF91OCksIHNpemVvZihzcmNfdThbMF0pLCAxLjBmKTsKLSAgaW50IGV4cGVjdGVkX3Rlc3QgPSBtZW1jbXAoZHN0X3U4LCBleHBlY3RlZF91OCwgc2l6ZW9mKGV4cGVjdGVkX3U4KSk7Ci0gIEVYUEVDVF9FUSgwLCBleHBlY3RlZF90ZXN0KTsKLX0KLQotVEVTVChBdWRpb1V0aWxUZXN0LCBNaXhTdHJlYW1zX3MxNl9RdWFydGVyVm9sdW1lKSB7Ci0gIC8vIFRlc3QgTWl4U3RyZWFtcygpIG9uIDE2IGJpdCBzYW1wbGVzLgotICBpbnQxNiBkc3RfczE2W2tOdW1iZXJPZlNhbXBsZXNdID0geyAtNCwgMHg0MCwgLTMyNzYwLCAzMjc2MCB9OwotICBpbnQxNiBzcmNfczE2W2tOdW1iZXJPZlNhbXBsZXNdID0geyAtNCwgMHg0MCwgLTEyMywgMTIzIH07Ci0gIGludDE2IGV4cGVjdGVkX3MxNltrTnVtYmVyT2ZTYW1wbGVzXSA9IHsgLTUsIDB4NTAsIC0zMjc2OCwgMzI3NjcgfTsKLSAgbWVkaWE6Ok1peFN0cmVhbXMoZHN0X3MxNiwKLSAgICAgICAgICAgICAgICAgICAgc3JjX3MxNiwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRzdF9zMTYpLAotICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3JjX3MxNlswXSksCi0gICAgICAgICAgICAgICAgICAgIDAuMjVmKTsKLSAgaW50IGV4cGVjdGVkX3Rlc3QgPSBtZW1jbXAoZHN0X3MxNiwgZXhwZWN0ZWRfczE2LCBzaXplb2YoZXhwZWN0ZWRfczE2KSk7Ci0gIEVYUEVDVF9FUSgwLCBleHBlY3RlZF90ZXN0KTsKLX0KLQotVEVTVChBdWRpb1V0aWxUZXN0LCBNaXhTdHJlYW1zX3MxNl9GdWxsVm9sdW1lKSB7Ci0gIC8vIFRlc3QgTWl4U3RyZWFtcygpIG9uIDE2IGJpdCBzYW1wbGVzLgotICBpbnQxNiBkc3RfczE2W2tOdW1iZXJPZlNhbXBsZXNdID0geyAtNCwgMHg0MCwgLTMyNzYwLCAzMjc2MCB9OwotICBpbnQxNiBzcmNfczE2W2tOdW1iZXJPZlNhbXBsZXNdID0geyAtNCwgMHg0MCwgLTEyMywgMTIzIH07Ci0gIGludDE2IGV4cGVjdGVkX3MxNltrTnVtYmVyT2ZTYW1wbGVzXSA9IHsgLTgsIDB4ODAsIC0zMjc2OCwgMzI3NjcgfTsKLSAgbWVkaWE6Ok1peFN0cmVhbXMoZHN0X3MxNiwKLSAgICAgICAgICAgICAgICAgICAgc3JjX3MxNiwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRzdF9zMTYpLAotICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3JjX3MxNlswXSksCi0gICAgICAgICAgICAgICAgICAgIDEuMGYpOwotICBpbnQgZXhwZWN0ZWRfdGVzdCA9IG1lbWNtcChkc3RfczE2LCBleHBlY3RlZF9zMTYsIHNpemVvZihleHBlY3RlZF9zMTYpKTsKLSAgRVhQRUNUX0VRKDAsIGV4cGVjdGVkX3Rlc3QpOwotfQotCi1URVNUKEF1ZGlvVXRpbFRlc3QsIE1peFN0cmVhbXNfczMyX1F1YXJ0ZXJWb2x1bWUpIHsKLSAgLy8gVGVzdCBNaXhTdHJlYW1zKCkgb24gMzIgYml0IHNhbXBsZXMuCi0gIGludDMyIGRzdF9zMzJba051bWJlck9mU2FtcGxlc10gPSB7IC00LCAweDQwLCAtMzI3NjgsIDIxNDc0ODM2NDAgfTsKLSAgaW50MzIgc3JjX3MzMltrTnVtYmVyT2ZTYW1wbGVzXSA9IHsgLTQsIDB4NDAsIC0zMjc2OCwgMTIzIH07Ci0gIGludDMyIGV4cGVjdGVkX3MzMltrTnVtYmVyT2ZTYW1wbGVzXSA9IHsgLTUsIDB4NTAsIC00MDk2MCwgMjE0NzQ4MzY0NyB9OwotICBtZWRpYTo6TWl4U3RyZWFtcyhkc3RfczMyLAotICAgICAgICAgICAgICAgICAgICBzcmNfczMyLAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoZHN0X3MzMiksCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihzcmNfczMyWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgMC4yNWYpOwotICBpbnQgZXhwZWN0ZWRfdGVzdCA9IG1lbWNtcChkc3RfczMyLCBleHBlY3RlZF9zMzIsIHNpemVvZihleHBlY3RlZF9zMzIpKTsKLSAgRVhQRUNUX0VRKDAsIGV4cGVjdGVkX3Rlc3QpOwotfQotCi1URVNUKEF1ZGlvVXRpbFRlc3QsIE1peFN0cmVhbXNfczMyX0Z1bGxWb2x1bWUpIHsKLSAgLy8gVGVzdCBNaXhTdHJlYW1zKCkgb24gMzIgYml0IHNhbXBsZXMuCi0gIGludDMyIGRzdF9zMzJba051bWJlck9mU2FtcGxlc10gPSB7IC00LCAweDQwLCAtMzI3NjgsIDIxNDc0ODM2NDAgfTsKLSAgaW50MzIgc3JjX3MzMltrTnVtYmVyT2ZTYW1wbGVzXSA9IHsgLTQsIDB4NDAsIC0zMjc2OCwgMTIzIH07Ci0gIGludDMyIGV4cGVjdGVkX3MzMltrTnVtYmVyT2ZTYW1wbGVzXSA9IHsgLTgsIDB4ODAsIC02NTUzNiwgMjE0NzQ4MzY0NyB9OwotICBtZWRpYTo6TWl4U3RyZWFtcyhkc3RfczMyLAotICAgICAgICAgICAgICAgICAgICBzcmNfczMyLAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoZHN0X3MzMiksCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihzcmNfczMyWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgMS4wKTsKLSAgaW50IGV4cGVjdGVkX3Rlc3QgPSBtZW1jbXAoZHN0X3MzMiwgZXhwZWN0ZWRfczMyLCBzaXplb2YoZXhwZWN0ZWRfczMyKSk7Ci0gIEVYUEVDVF9FUSgwLCBleHBlY3RlZF90ZXN0KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vY3Jvc3NfcHJvY2Vzc19ub3RpZmljYXRpb24uY2MgYi9zcmMvbWVkaWEvYXVkaW8vY3Jvc3NfcHJvY2Vzc19ub3RpZmljYXRpb24uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MDZmNzcuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2Nyb3NzX3Byb2Nlc3Nfbm90aWZpY2F0aW9uLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2Nyb3NzX3Byb2Nlc3Nfbm90aWZpY2F0aW9uLmgiCi0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0KLUNyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbjo6Q3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uKCkge30KLQotQ3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uOjpXYWl0Rm9yTXVsdGlwbGU6OldhaXRGb3JNdWx0aXBsZSgKLSAgICBjb25zdCBOb3RpZmljYXRpb25zKiBub3RpZmljYXRpb25zKSB7Ci0gIFJlc2V0KG5vdGlmaWNhdGlvbnMpOwotfQotCi1pbnQgQ3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uOjpXYWl0Rm9yTXVsdGlwbGU6OldhaXQoKSB7Ci0gIERDSEVDSyhDYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBpbnQgcmV0ID0gV2FpdE11bHRpcGxlKCpub3RpZmljYXRpb25zXywgd2FpdF9vZmZzZXRfKTsKLSAgd2FpdF9vZmZzZXRfID0gKHJldCArIDEpICUgbm90aWZpY2F0aW9uc18tPnNpemUoKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCBDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb246OldhaXRGb3JNdWx0aXBsZTo6UmVzZXQoCi0gICAgY29uc3QgTm90aWZpY2F0aW9ucyogbm90aWZpY2F0aW9ucykgewotICBEQ0hFQ0soQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLSAgd2FpdF9vZmZzZXRfID0gMDsKLSAgbm90aWZpY2F0aW9uc18gPSBub3RpZmljYXRpb25zOwotICBEQ0hFQ0soIW5vdGlmaWNhdGlvbnNfLT5lbXB0eSgpKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9jcm9zc19wcm9jZXNzX25vdGlmaWNhdGlvbi5oIGIvc3JjL21lZGlhL2F1ZGlvL2Nyb3NzX3Byb2Nlc3Nfbm90aWZpY2F0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZTc0MzUuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2Nyb3NzX3Byb2Nlc3Nfbm90aWZpY2F0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9BVURJT19DUk9TU19QUk9DRVNTX05PVElGSUNBVElPTl9IXwotI2RlZmluZSBNRURJQV9BVURJT19DUk9TU19QUk9DRVNTX05PVElGSUNBVElPTl9IXwotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9wcm9jZXNzLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvbm9uX3RocmVhZF9zYWZlLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCIKLQotI2lmIGRlZmluZWQoT1NfV0lOKQotI2luY2x1ZGUgImJhc2Uvd2luL3Njb3BlZF9oYW5kbGUuaCIKLSNlbHNlCi0jaW5jbHVkZSAiYmFzZS9maWxlX2Rlc2NyaXB0b3JfcG9zaXguaCIKLSNpbmNsdWRlICJiYXNlL3N5bmNfc29ja2V0LmgiCi0jZW5kaWYKLQotLy8gQSBtZWNoYW5pc20gdG8gc3luY2hyb25pemUgYWNjZXNzIHRvIGEgc2hhcmVkIHJlc291cmNlIGJldHdlZW4gdHdvIHBhcnRpZXMKLS8vIHdoZW4gdGhlIHVzYWdlIHBhdHRlcm4gcmVzZW1ibGVzIHRoYXQgb2YgdHdvIHBsYXllcnMgcGxheWluZyBhIGdhbWUgb2YgY2hlc3MuCi0vLyBFYWNoIGVuZCBoYXMgYW4gaW5zdGFuY2Ugb2YgQ3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uIGFuZCBjYWxscyBTaWduYWwoKSB3aGVuCi0vLyBpdCBoYXMgZmluaXNoZWQgdXNpbmcgdGhlIHNoYXJlZCByZXNvdXJjZS4KLS8vIEJlZm9yZSBhY2Nlc3NpbmcgdGhlIHJlc291cmNlLCBpdCBtdXN0IGNhbGwgV2FpdCgpIGluIG9yZGVyIHRvIGtub3cgd2hlbiB0aGUKLS8vIG90aGVyIGVuZCBoYXMgY2FsbGVkIFNpZ25hbCgpLgotLy8KLS8vIEhlcmUncyBzb21lIHBzZXVkbyBjb2RlIGZvciBob3cgdGhpcyBjbGFzcyBjYW4gYmUgdXNlZDoKLS8vCi0vLyBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IGJvdGggcHJvY2Vzc2VzIGFzIGl0J3MgYSBnZW5lcmFsIHdheSB0byB1c2UgdGhlCi0vLyBzaGFyZWQgcmVzb3VyY2UgYW5kIHRoZW4gZ3JhbnQgdGhlIHByaXZpbGVnZSB0byB0aGUgb3RoZXIgcHJvY2VzczoKLS8vCi0vLyB2b2lkIFdyaXRlVG9TaGFyZWRNZW1vcnkoQ3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uKiBub3RpZmljYXRpb24sCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgU2hhcmVkTWVtb3J5KiBtZW0sCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBteV9jaGFyKSB7Ci0vLyAgIG5vdGlmaWNhdGlvbi0+V2FpdCgpOyAgLy8gV2FpdCBmb3IgdGhlIG90aGVyIHByb2Nlc3MgdG8geWllbGQgYWNjZXNzLgotLy8gICByZWludGVycHJldF9jYXN0PGNoYXIqPihtZW0tPm1lbW9yeSgpKVswXSA9IG15X2NoYXI7Ci0vLyAgIG5vdGlmaWNhdGlvbi0+U2lnbmFsKCk7ICAvLyBHcmFudCB0aGUgb3RoZXIgcHJvY2VzcyBhY2Nlc3MuCi0vLyB9Ci0vLwotLy8gUHJvY2VzcyBBOgotLy8KLS8vIGNsYXNzIEEgewotLy8gIHB1YmxpYzoKLS8vICAgdm9pZCBJbml0aWFsaXplKGJhc2U6OlByb2Nlc3NIYW5kbGUgcHJvY2Vzc19iKSB7Ci0vLyAgICAgbWVtXy5DcmVhdGVOYW1lZCgiZm9vIiwgZmFsc2UsIDEwMjQpOwotLy8KLS8vICAgICBDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb24gb3RoZXI7Ci0vLyAgICAgQ0hFQ0soQ3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uOjpJbml0aWFsaXplUGFpcigmbm90aWZpY2F0aW9uXywgJm90aGVyKSk7Ci0vLyAgICAgQ3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uOjpJUENIYW5kbGUgaGFuZGxlXzEsIGhhbmRsZV8yOwotLy8gICAgIENIRUNLKG90aGVyLlNoYXJlVG9Qcm9jZXNzKHByb2Nlc3NfYiwgJmhhbmRsZV8xLCAmaGFuZGxlXzIpKTsKLS8vICAgICAvLyBUaGlzIGNvdWxkIGJlIGltcGxlbWVudGVkIGJ5IHVzaW5nIHNvbWUgSVBDIG1lY2hhbmlzbQotLy8gICAgIC8vIHN1Y2ggYXMgTWVzc2FnZUxvb3AuCi0vLyAgICAgU2VuZFRvUHJvY2Vzc0IobWVtXywgaGFuZGxlXzEsIGhhbmRsZV8yKTsKLS8vICAgICAvLyBBbGxvdyBwcm9jZXNzIEIgdGhlIGZpcnN0IGNoYW5jZSB0byB3cml0ZSB0byB0aGUgbWVtb3J5OgotLy8gICAgIG5vdGlmaWNhdGlvbl8uU2lnbmFsKCk7Ci0vLyAgICAgLy8gT25jZSBCIGlzIGRvbmUsIHdlJ2xsIHdyaXRlICdBJyB0byB0aGUgc2hhcmVkIG1lbW9yeS4KLS8vICAgICBXcml0ZVRvU2hhcmVkTWVtb3J5KCZub3RpZmljYXRpb25fLCAmbWVtXywgJ0EnKTsKLS8vICAgfQotLy8KLS8vICAgQ3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbl87Ci0vLyAgIFNoYXJlZE1lbW9yeSBtZW1fOwotLy8gfTsKLS8vCi0vLyBQcm9jZXNzIEI6Ci0vLwotLy8gY2xhc3MgQiB7Ci0vLyAgcHVibGljOgotLy8gICAvLyBDYWxsZWQgd2hlbiB3ZSByZWNlaXZlIHRoZSBJUEMgbWVzc2FnZSBmcm9tIEEuCi0vLyAgIHZvaWQgSW5pdGlhbGl6ZShTaGFyZWRNZW1vcnlIYW5kbGUgbWVtLAotLy8gICAgICAgICAgICAgICAgICAgQ3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uOjpJUENIYW5kbGUgaGFuZGxlXzEsCi0vLyAgICAgICAgICAgICAgICAgICBDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb246OklQQ0hhbmRsZSBoYW5kbGVfMikgewotLy8gICAgIG1lbV8ucmVzZXQobmV3IFNoYXJlZE1lbW9yeShtZW0sIGZhbHNlKSk7Ci0vLyAgICAgbm90aWZpY2F0aW9uXy5yZXNldChuZXcgQ3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uKGhhbmRsZV8xLCBoYW5kbGVfMikpOwotLy8gICAgIFdyaXRlVG9TaGFyZWRNZW1vcnkoJm5vdGlmaWNhdGlvbl8sICZtZW1fLCAnQicpOwotLy8gICB9Ci0vLwotLy8gICBDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uXzsKLS8vICAgc2NvcGVkX3B0cjxTaGFyZWRNZW1vcnk+IG1lbV87Ci0vLyB9OwotLy8KLWNsYXNzIE1FRElBX0VYUE9SVCBDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb24gewotIHB1YmxpYzoKLSNpZiBkZWZpbmVkKE9TX1dJTikKLSAgdHlwZWRlZiBIQU5ETEUgSVBDSGFuZGxlOwotI2Vsc2UKLSAgdHlwZWRlZiBiYXNlOjpGaWxlRGVzY3JpcHRvciBJUENIYW5kbGU7Ci0jZW5kaWYKLQotICB0eXBlZGVmIHN0ZDo6dmVjdG9yPENyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbio+IE5vdGlmaWNhdGlvbnM7Ci0KLSAgLy8gRGVmYXVsdCBjdG9yLiAgSW5pdGlhbGl6ZXMgYSBOVUxMIG5vdGlmaWNhdGlvbi4gIFVzZXIgbXVzdCBjYWxsCi0gIC8vIEluaXRpYWxpemVQYWlyKCkgdG8gaW5pdGlhbGl6ZSB0aGUgaW5zdGFuY2UgYWxvbmcgd2l0aCBhIGNvbm5lY3RlZCBvbmUuCi0gIENyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbigpOwotCi0gIC8vIEN0b3IgZm9yIHRoZSB1c2VyIHRoYXQgZG9lcyBub3QgY2FsbCBJbml0aWFsaXplUGFpciBidXQgaW5zdGVhZCByZWNlaXZlcwotICAvLyBoYW5kbGVzIGZyb20gdGhlIG9uZSB0aGF0IGRpZC4gIFRoZXNlIGhhbmRsZXMgY29tZSBmcm9tIGEgY2FsbCB0bwotICAvLyBTaGFyZVRvUHJvY2Vzcy4KLSAgQ3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uKElQQ0hhbmRsZSBoYW5kbGVfMSwgSVBDSGFuZGxlIGhhbmRsZV8yKTsKLSAgfkNyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbigpOwotCi0gIC8vIFJhaXNlcyBhIHNpZ25hbCB0aGF0IHRoZSBzaGFyZWQgcmVzb3VyY2Ugbm93IGNhbiBiZSBhY2Nlc3NlZCBieSB0aGUgb3RoZXIKLSAgLy8gcGFydHkuCi0gIC8vIE5PVEU6IENhbGxpbmcgU2lnbmFsKCkgbW9yZSB0aGFuIG9uY2Ugd2l0aG91dCBjYWxsaW5nIFdhaXQoKSBpbiBiZXR3ZWVuCi0gIC8vIGlzIG5vdCBhIHN1cHBvcnRlZCBzY2VuYXJpbyBhbmQgd2lsbCByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW9yIChhbmQKLSAgLy8gZGlmZmVyZW50IGRlcGVuZGluZyBvbiBwbGF0Zm9ybSkuCi0gIHZvaWQgU2lnbmFsKCk7Ci0KLSAgLy8gV2FpdHMgZm9yIHRoZSBvdGhlciBwYXJ0eSB0byBmaW5pc2ggdXNpbmcgdGhlIHNoYXJlZCByZXNvdXJjZS4KLSAgLy8gTk9URTogQXMgd2l0aCBTaWduYWwoKSwgeW91IG11c3Qgbm90IGNhbGwgV2FpdCgpIG1vcmUgdGhhbiBvbmNlIHdpdGhvdXQKLSAgLy8gY2FsbGluZyBTaWduYWwoKSBpbiBiZXR3ZWVuLgotICB2b2lkIFdhaXQoKTsKLQotICBib29sIElzVmFsaWQoKSBjb25zdDsKLQotICAvLyBDb3BpZXMgdGhlIGludGVybmFsIGhhbmRsZXMgdG8gdGhlIG91dHB1dCBwYXJhbWV0ZXJzLCB8aGFuZGxlXzF8IGFuZAotICAvLyB8aGFuZGxlXzJ8LiAgVGhlIG9wZXJhdGlvbiBjYW4gZmFpbCwgc28gdGhlIGNhbGxlciBtdXN0IGJlIHByZXBhcmVkIHRvCi0gIC8vIGhhbmRsZSB0aGF0IGNhc2UuCi0gIGJvb2wgU2hhcmVUb1Byb2Nlc3MoYmFzZTo6UHJvY2Vzc0hhbmRsZSBwcm9jZXNzLCBJUENIYW5kbGUqIGhhbmRsZV8xLAotICAgICAgICAgICAgICAgICAgICAgIElQQ0hhbmRsZSogaGFuZGxlXzIpOwotCi0gIC8vIEluaXRpYWxpemVzIGEgcGFpciBvZiBDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb24gaW5zdGFuY2VzLiAgTm90ZSB0aGF0IHRoaXMKLSAgLy8gY2FuIGZhaWwgKGUuZy4gZHVlIHRvIEVNRklMRSBvbiBMaW51eCkuCi0gIHN0YXRpYyBib29sIEluaXRpYWxpemVQYWlyKENyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbiogYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uKiBiKTsKLQotICAvLyBVc2UgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aGVuIHlvdSBoYXZlIHRvIHJlcGVhdGVkbHkgd2FpdCBmb3IgbXVsdGlwbGUKLSAgLy8gbm90aWZpY2F0aW9ucyBvbiB0aGUgc2FtZSB0aHJlYWQuICBUaGUgY2xhc3Mgd2lsbCBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dAotICAvLyB3aGljaCBub3RpZmljYXRpb24gd2FzIGxhc3Qgc2lnbmFsZWQgYW5kIHRyeSB0byBkaXN0cmlidXRlIHRoZSBzaWduYWxzIHNvCi0gIC8vIHRoYXQgYWxsIG5vdGlmaWNhdGlvbnMgZ2V0IGEgY2hhbmNlIHRvIGJlIHByb2Nlc3NlZCBpbiB0aW1lcyBvZiBoaWdoIGxvYWQKLSAgLy8gYW5kIGEgYnVzeSBvbmUgd29uJ3Qgc3RhcnZlIHRoZSBvdGhlcnMuCi0gIC8vIFRPRE8odG9tbWkpOiBTdXBwb3J0IGEgd2F5IHRvIGFib3J0IHRoZSB3YWl0LgotICBjbGFzcyBNRURJQV9FWFBPUlQgV2FpdEZvck11bHRpcGxlIDoKLSAgICAgIHB1YmxpYyBOT05fRVhQT1JURURfQkFTRShiYXNlOjpOb25UaHJlYWRTYWZlKSB7Ci0gICBwdWJsaWM6Ci0gICAgLy8gQ2FsbGVyIG11c3QgbWFrZSBzdXJlIHRoYXQgdGhlIGxpZmV0aW1lIG9mIHRoZSBhcnJheSBpcyBncmVhdGVyIHRoYW4KLSAgICAvLyB0aGF0IG9mIHRoZSBXYWl0Rm9yTXVsdGlwbGUgaW5zdGFuY2UuCi0gICAgZXhwbGljaXQgV2FpdEZvck11bHRpcGxlKGNvbnN0IE5vdGlmaWNhdGlvbnMqIG5vdGlmaWNhdGlvbnMpOwotCi0gICAgLy8gV2FpdHMgZm9yIGFueSBvZiB0aGUgbm90aWZpY2F0aW9ucyB0byBiZSBzaWduYWxlZC4gIFJldHVybnMgdGhlIDAgYmFzZWQKLSAgICAvLyBpbmRleCBvZiBhIHNpZ25hbGVkIG5vdGlmaWNhdGlvbi4KLSAgICBpbnQgV2FpdCgpOwotCi0gICAgLy8gQ2FsbCB3aGVuIHRoZSBhcnJheSBjaGFuZ2VzLiAgVGhpcyBzaG91bGQgYmUgY2FsbGVkIG9uIHRoZSBzYW1lIHRocmVhZAotICAgIC8vIGFzIFdhaXQoKSBpcyBjYWxsZWQgb24gYW5kIHRoZSBhcnJheSBtdXN0IG5ldmVyIGNoYW5nZSB3aGlsZSBhIFdhaXQoKQotICAgIC8vIGlzIGluIHByb2dyZXNzLgotICAgIHZvaWQgUmVzZXQoY29uc3QgTm90aWZpY2F0aW9ucyogbm90aWZpY2F0aW9ucyk7Ci0KLSAgIHByaXZhdGU6Ci0gICAgY29uc3QgTm90aWZpY2F0aW9ucyogbm90aWZpY2F0aW9uc187Ci0gICAgc2l6ZV90IHdhaXRfb2Zmc2V0XzsKLSAgfTsKLQotIHByaXZhdGU6Ci0gIC8vIE9ubHkgY2FsbGVkIGJ5IHRoZSBXYWl0Rm9yTXVsdGlwbGUgY2xhc3MuICBTZWUgZG9jdW1lbnRhdGlvbgotICAvLyBmb3IgV2FpdEZvck11bHRpcGxlIGFuZCBjb21tZW50cyBpbnNpZGUgV2FpdE11bHRpcGxlIGZvciBkZXRhaWxzLgotICBzdGF0aWMgaW50IFdhaXRNdWx0aXBsZShjb25zdCBOb3RpZmljYXRpb25zJiBub3RpZmljYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgd2FpdF9vZmZzZXQpOwotCi0jaWYgZGVmaW5lZChPU19XSU4pCi0gIGJhc2U6Ondpbjo6U2NvcGVkSGFuZGxlIG1pbmVfOwotICBiYXNlOjp3aW46OlNjb3BlZEhhbmRsZSBvdGhlcl87Ci0jZWxzZQotICB0eXBlZGVmIGJhc2U6OkNhbmNlbGFibGVTeW5jU29ja2V0IFNvY2tldENsYXNzOwotICBTb2NrZXRDbGFzcyBzb2NrZXRfOwotI2VuZGlmCi0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKENyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbik7Ci19OwotCi0jZW5kaWYgIC8vIE1FRElBX0FVRElPX0NST1NTX1BST0NFU1NfTk9USUZJQ0FUSU9OX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vY3Jvc3NfcHJvY2Vzc19ub3RpZmljYXRpb25fcG9zaXguY2MgYi9zcmMvbWVkaWEvYXVkaW8vY3Jvc3NfcHJvY2Vzc19ub3RpZmljYXRpb25fcG9zaXguY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MGVmMDYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2Nyb3NzX3Byb2Nlc3Nfbm90aWZpY2F0aW9uX3Bvc2l4LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby9jcm9zc19wcm9jZXNzX25vdGlmaWNhdGlvbi5oIgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzeXMvcG9sbC5oPgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgImJhc2UvZmlsZV9kZXNjcmlwdG9yX3Bvc2l4LmgiCi0KLUNyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbjo6fkNyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbigpIHt9Ci0KLUNyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbjo6Q3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uKElQQ0hhbmRsZSBoYW5kbGVfMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ0hhbmRsZSBoYW5kbGVfMikKLSAgICA6IHNvY2tldF8oaGFuZGxlXzEuZmQpIHsKLSAgRENIRUNLX05FKGhhbmRsZV8xLmZkLCAtMSk7Ci0gIERDSEVDS19FUShoYW5kbGVfMi5mZCwgLTEpOwotICBEQ0hFQ0soSXNWYWxpZCgpKTsKLX0KLQotdm9pZCBDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb246OlNpZ25hbCgpIHsKLSAgRENIRUNLKElzVmFsaWQoKSk7Ci0gIGNoYXIgc2lnbmFsID0gMTsKLSAgc2l6ZV90IGJ5dGVzID0gc29ja2V0Xy5TZW5kKCZzaWduYWwsIHNpemVvZihzaWduYWwpKTsKLSAgRENIRUNLX0VRKGJ5dGVzLCAxVSkgPDwgImVycm5vOiAiIDw8IGVycm5vOwotfQotCi12b2lkIENyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbjo6V2FpdCgpIHsKLSAgRENIRUNLKElzVmFsaWQoKSk7Ci0gIGNoYXIgc2lnbmFsID0gMDsKLSAgc2l6ZV90IGJ5dGVzID0gc29ja2V0Xy5SZWNlaXZlKCZzaWduYWwsIHNpemVvZihzaWduYWwpKTsKLSAgRENIRUNLX0VRKGJ5dGVzLCAxVSkgPDwgImVycm5vOiAiIDw8IGVycm5vOwotICBEQ0hFQ0tfRVEoc2lnbmFsLCAxKTsKLX0KLQotYm9vbCBDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb246OklzVmFsaWQoKSBjb25zdCB7Ci0gIHJldHVybiBzb2NrZXRfLmhhbmRsZSgpICE9IFNvY2tldENsYXNzOjprSW52YWxpZEhhbmRsZTsKLX0KLQotYm9vbCBDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb246OlNoYXJlVG9Qcm9jZXNzKGJhc2U6OlByb2Nlc3NIYW5kbGUgcHJvY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENIYW5kbGUqIGhhbmRsZV8xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ0hhbmRsZSogaGFuZGxlXzIpIHsKLSAgRENIRUNLKElzVmFsaWQoKSk7Ci0gIGhhbmRsZV8xLT5mZCA9IHNvY2tldF8uaGFuZGxlKCk7Ci0gIGhhbmRsZV8xLT5hdXRvX2Nsb3NlID0gZmFsc2U7Ci0gIGhhbmRsZV8yLT5mZCA9IC0xOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gc3RhdGljCi1ib29sIENyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbjo6SW5pdGlhbGl6ZVBhaXIoQ3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uKiBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbiogYikgewotICBEQ0hFQ0soIWEtPklzVmFsaWQoKSk7Ci0gIERDSEVDSyghYi0+SXNWYWxpZCgpKTsKLQotICBib29sIG9rID0gU29ja2V0Q2xhc3M6OkNyZWF0ZVBhaXIoJmEtPnNvY2tldF8sICZiLT5zb2NrZXRfKTsKLQotICBETE9HX0lGKFdBUk5JTkcsICFvaykgPDwgImZhaWxlZCB0byBjcmVhdGUgc29ja2V0OiAiIDw8IGVycm5vOwotICBEQ0hFQ0soIW9rIHx8IGEtPklzVmFsaWQoKSk7Ci0gIERDSEVDSyghb2sgfHwgYi0+SXNWYWxpZCgpKTsKLSAgcmV0dXJuIG9rOwotfQotCi0vLyBzdGF0aWMKLWludCBDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb246OldhaXRNdWx0aXBsZShjb25zdCBOb3RpZmljYXRpb25zJiBub3RpZmljYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB3YWl0X29mZnNldCkgewotICBEQ0hFQ0tfTFQod2FpdF9vZmZzZXQsIG5vdGlmaWNhdGlvbnMuc2l6ZSgpKTsKLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5vdGlmaWNhdGlvbnMuc2l6ZSgpOyArK2kpIHsKLSAgICBEQ0hFQ0sobm90aWZpY2F0aW9uc1tpXS0+SXNWYWxpZCgpKTsKLSAgfQotCi0gIC8vIEJlbG93LCB3ZSBhbHdheXMgY2hlY2sgdGhlIHxyZXZlbnRzfCBvZiB0aGUgZmlyc3Qgc29ja2V0IGluIHRoZSBhcnJheQotICAvLyBhbmQgcmV0dXJuIHRoZSBpbmRleCBvZiB0aGF0IHNvY2tldCBpZiBzZXQuICBUaGlzIGNhbiBjYXVzZSBzb2NrZXRzCi0gIC8vIHRoYXQgY29tZSBsYXRlciBpbiB0aGUgYXJyYXkgdG8gc3RhcnZlIHdoZW4gdGhlIGZpcnN0IHNvY2tldHMgYXJlCi0gIC8vIHZlcnkgYnVzeS4gIFNvIHRvIGF2b2lkIHRoZSBzdGFydmluZyBwcm9ibGVtLCB3ZSB1c2UgdGhlIHx3YWl0X29mZnNldHwKLSAgLy8gdmFyaWFibGUgdG8gc3BsaXQgdXAgdGhlIGFycmF5IHNvIHRoYXQgdGhlIGxhc3Qgc29ja2V0IHRvIGJlIHNpZ25hbGVkCi0gIC8vIGJlY29tZXMgdGhlIGxhc3Qgc29ja2V0IGluIHRoZSBhcnJheSBhbmQgYWxsIHRoZSBvdGhlciBzb2NrZXRzIHdpbGwgaGF2ZQotICAvLyBwcmlvcml0eSB0aGUgbmV4dCB0aW1lIFdhaXRNdWx0aXBsZSBpcyBjYWxsZWQuCi0gIHNjb3BlZF9hcnJheTxzdHJ1Y3QgcG9sbGZkPiBzb2NrZXRzKG5ldyBzdHJ1Y3QgcG9sbGZkW25vdGlmaWNhdGlvbnMuc2l6ZSgpXSk7Ci0gIG1lbXNldCgmc29ja2V0c1swXSwgMCwgbm90aWZpY2F0aW9ucy5zaXplKCkgKiBzaXplb2Yoc29ja2V0c1swXSkpOwotICBzaXplX3QgaW5kZXggPSAwOwotICBmb3IgKHNpemVfdCBpID0gd2FpdF9vZmZzZXQ7IGkgPCBub3RpZmljYXRpb25zLnNpemUoKTsgKytpKSB7Ci0gICAgc3RydWN0IHBvbGxmZCYgZmQgPSBzb2NrZXRzW2luZGV4KytdOwotICAgIGZkLmV2ZW50cyA9IFBPTExJTjsKLSAgICBmZC5mZCA9IG5vdGlmaWNhdGlvbnNbaV0tPnNvY2tldF8uaGFuZGxlKCk7Ci0gIH0KLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHdhaXRfb2Zmc2V0OyArK2kpIHsKLSAgICBzdHJ1Y3QgcG9sbGZkJiBmZCA9IHNvY2tldHNbaW5kZXgrK107Ci0gICAgZmQuZXZlbnRzID0gUE9MTElOOwotICAgIGZkLmZkID0gbm90aWZpY2F0aW9uc1tpXS0+c29ja2V0Xy5oYW5kbGUoKTsKLSAgfQotICBEQ0hFQ0tfRVEoaW5kZXgsIG5vdGlmaWNhdGlvbnMuc2l6ZSgpKTsKLQotICBpbnQgZXJyID0gcG9sbCgmc29ja2V0c1swXSwgbm90aWZpY2F0aW9ucy5zaXplKCksIC0xKTsKLSAgaWYgKGVyciAhPSAtMSkgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbm90aWZpY2F0aW9ucy5zaXplKCk7ICsraSkgewotICAgICAgaWYgKHNvY2tldHNbaV0ucmV2ZW50cykgewotICAgICAgICBzaXplX3QgcmV0ID0gKGkgKyB3YWl0X29mZnNldCkgJSBub3RpZmljYXRpb25zLnNpemUoKTsKLSAgICAgICAgRENIRUNLX0VRKHNvY2tldHNbaV0uZmQsIG5vdGlmaWNhdGlvbnNbcmV0XS0+c29ja2V0Xy5oYW5kbGUoKSk7Ci0gICAgICAgIG5vdGlmaWNhdGlvbnNbcmV0XS0+V2FpdCgpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgICAgfQotICAgIH0KLSAgfQotICAvLyBFaXRoZXIgcG9sbCgpIGZhaWxlZCBvciB3ZSBmYWlsZWQgdG8gZmluZCBhIHNpbmdsZSBzb2NrZXQgdGhhdCB3YXMKLSAgLy8gc2lnbmFsZWQuICBFaXRoZXIgd2F5IGNvbnRpbnVpbmcgd2lsbCByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW9yLgotICBMT0coRkFUQUwpIDw8ICJwb2xsKCkgZmFpbGVkOiAiIDw8IGVycm5vOwotICByZXR1cm4gLTE7Ci19CmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vY3Jvc3NfcHJvY2Vzc19ub3RpZmljYXRpb25fdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvYXVkaW8vY3Jvc3NfcHJvY2Vzc19ub3RpZmljYXRpb25fdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZmJlYWQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2Nyb3NzX3Byb2Nlc3Nfbm90aWZpY2F0aW9uX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDYxICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS9zaGFyZWRfbWVtb3J5LmgiCi0jaW5jbHVkZSAiYmFzZS9zdGxfdXRpbC5oIgotI2luY2x1ZGUgImJhc2UvdGVzdC9tdWx0aXByb2Nlc3NfdGVzdC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3BsYXRmb3JtX3RocmVhZC5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2Nyb3NzX3Byb2Nlc3Nfbm90aWZpY2F0aW9uLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0jaW5jbHVkZSAidGVzdGluZy9tdWx0aXByb2Nlc3NfZnVuY19saXN0LmgiCi0KLSNpbmNsdWRlIDx1dGlsaXR5PiAgLy8gTk9MSU5UCi0KLW5hbWVzcGFjZSB7Ci0KLS8vIEluaXRpYWxpemVzIChjdG9yKSBhbmQgZGVsZXRlcyAoZHRvcikgdHdvIHZlY3RvcnMgb2YgcGFpcnMgb2YKLS8vIENyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbiBpbnN0YW5jZXMuCi1jbGFzcyBOb3RpZmljYXRpb25zT3duZXIgewotIHB1YmxpYzoKLSAgLy8gQXR0ZW1wdHMgdG8gY3JlYXRlIHVwIHRvIHxudW1iZXJfb2ZfcGFpcnN8IG51bWJlciBvZiBwYWlycy4gQ2FsbCBzaXplKCkKLSAgLy8gYWZ0ZXIgY29uc3RydWN0aW9uIHRvIGZpbmQgb3V0IGhvdyBtYW55IHBhaXJzIHdlcmUgYWN0dWFsbHkgY3JlYXRlZC4KLSAgZXhwbGljaXQgTm90aWZpY2F0aW9uc093bmVyKHNpemVfdCBudW1iZXJfb2ZfcGFpcnMpIHsKLSAgICBDcmVhdGVNdWx0aXBsZVBhaXJzKG51bWJlcl9vZl9wYWlycyk7Ci0gIH0KLSAgfk5vdGlmaWNhdGlvbnNPd25lcigpIHsKLSAgICBTVExEZWxldGVFbGVtZW50cygmYV8pOwotICAgIFNUTERlbGV0ZUVsZW1lbnRzKCZiXyk7Ci0gIH0KLQotICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKLSAgICBEQ0hFQ0tfRVEoYV8uc2l6ZSgpLCBiXy5zaXplKCkpOwotICAgIHJldHVybiBhXy5zaXplKCk7Ci0gIH0KLQotICBjb25zdCBDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb246Ok5vdGlmaWNhdGlvbnMmIGEoKSB7IHJldHVybiBhXzsgfQotICBjb25zdCBDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb246Ok5vdGlmaWNhdGlvbnMmIGIoKSB7IHJldHVybiBiXzsgfQotCi0gcHJpdmF0ZToKLSAgdm9pZCBDcmVhdGVNdWx0aXBsZVBhaXJzKHNpemVfdCBjb3VudCkgewotICAgIGFfLnJlc2l6ZShjb3VudCk7Ci0gICAgYl8ucmVzaXplKGNvdW50KTsKLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgZm9yICg7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICBhX1tpXSA9IG5ldyBDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb24oKTsKLSAgICAgIGJfW2ldID0gbmV3IENyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbigpOwotICAgICAgaWYgKCFDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb246OkluaXRpYWxpemVQYWlyKGFfW2ldLCBiX1tpXSkpIHsKLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJJbml0aWFsaXplUGFpciBmYWlsZWQgYXQgIiA8PCBpOwotICAgICAgICBkZWxldGUgYV9baV07Ci0gICAgICAgIGRlbGV0ZSBiX1tpXTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGFfLnJlc2l6ZShpKTsKLSAgICBiXy5yZXNpemUoaSk7Ci0gIH0KLQotICBDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb246Ok5vdGlmaWNhdGlvbnMgYV87Ci0gIENyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbjo6Tm90aWZpY2F0aW9ucyBiXzsKLX07Ci0KLS8vIEEgc2ltcGxlIHRocmVhZCB0aGF0IHdlJ2xsIHJ1biB0d28gaW5zdGFuY2VzIG9mLiAgQm90aCB0aHJlYWRzIGdldCBhIHBvaW50ZXIKLS8vIHRvIHRoZSBzYW1lIHxzaGFyZWRfZGF0YXwgYW5kIHVzZSBhIENyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbiB0byBjb250cm9sIHdoZW4KLS8vIGVhY2ggdGhyZWFkIGNhbiByZWFkL3dyaXRlLgotY2xhc3MgU2luZ2xlTm90aWZpZXJXb3JrZXIgOiBwdWJsaWMgYmFzZTo6UGxhdGZvcm1UaHJlYWQ6OkRlbGVnYXRlIHsKLSBwdWJsaWM6Ci0gIFNpbmdsZU5vdGlmaWVyV29ya2VyKHNpemVfdCogc2hhcmVkX2RhdGEsIHNpemVfdCByZXBlYXRzLAotICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb24qIG5vdGlmaWVyKQotICAgICAgOiBzaGFyZWRfZGF0YV8oc2hhcmVkX2RhdGEpLCByZXBlYXRzXyhyZXBlYXRzKSwKLSAgICAgICAgbm90aWZpZXJfKG5vdGlmaWVyKSB7Ci0gIH0KLSAgdmlydHVhbCB+U2luZ2xlTm90aWZpZXJXb3JrZXIoKSB7fQotCi0gIC8vIGJhc2U6OlBsYXRmb3JtVGhyZWFkOjpEZWxlZ2F0ZToKLSAgdmlydHVhbCB2b2lkIFRocmVhZE1haW4oKSBPVkVSUklERSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXBlYXRzXzsgKytpKSB7Ci0gICAgICBub3RpZmllcl8tPldhaXQoKTsKLSAgICAgICsrKCpzaGFyZWRfZGF0YV8pOwotICAgICAgbm90aWZpZXJfLT5TaWduYWwoKTsKLSAgICB9Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHNpemVfdCogc2hhcmVkX2RhdGFfOwotICBzaXplX3QgcmVwZWF0c187Ci0gIENyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbiogbm90aWZpZXJfOwotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU2luZ2xlTm90aWZpZXJXb3JrZXIpOwotfTsKLQotLy8gU2ltaWxhciB0byBTaW5nbGVOb3RpZmllcldvcmtlciwgZXhjZXB0IGVhY2ggaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aWxsCi0vLyBoYXZlID4xIGluc3RhbmNlcyBvZiBDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb24gdG8gV2FpdC9TaWduYWwgYW5kIGFuIGVxdWFsCi0vLyBhbW91bnQgb2YgfHNoYXJlZF9kYXRhfCB0aGF0IHRoZSBub3RpZmllcnMgY29udHJvbCBhY2Nlc3MgdG8uCi1jbGFzcyBNdWx0aU5vdGlmaWVyV29ya2VyIDogcHVibGljIGJhc2U6OlBsYXRmb3JtVGhyZWFkOjpEZWxlZ2F0ZSB7Ci0gcHVibGljOgotICBNdWx0aU5vdGlmaWVyV29ya2VyKHNpemVfdCogc2hhcmVkX2RhdGEsIHNpemVfdCByZXBlYXRzLAotICAgICAgY29uc3QgQ3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uOjpOb3RpZmljYXRpb25zKiBub3RpZmllcnMpCi0gICAgICA6IHNoYXJlZF9kYXRhXyhzaGFyZWRfZGF0YSksIHJlcGVhdHNfKHJlcGVhdHMpLAotICAgICAgICBub3RpZmllcnNfKG5vdGlmaWVycykgewotICB9Ci0gIHZpcnR1YWwgfk11bHRpTm90aWZpZXJXb3JrZXIoKSB7fQotCi0gIC8vIGJhc2U6OlBsYXRmb3JtVGhyZWFkOjpEZWxlZ2F0ZToKLSAgdmlydHVhbCB2b2lkIFRocmVhZE1haW4oKSBPVkVSUklERSB7Ci0gICAgQ3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uOjpXYWl0Rm9yTXVsdGlwbGUgd2FpdGVyKG5vdGlmaWVyc18pOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVwZWF0c187ICsraSkgewotICAgICAgaW50IHNpZ25hbGVkID0gd2FpdGVyLldhaXQoKTsKLSAgICAgICsrc2hhcmVkX2RhdGFfW3NpZ25hbGVkXTsKLSAgICAgICgqbm90aWZpZXJzXylbc2lnbmFsZWRdLT5TaWduYWwoKTsKLSAgICB9Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHNpemVfdCogc2hhcmVkX2RhdGFfOwotICBzaXplX3QgcmVwZWF0c187Ci0gIGNvbnN0IENyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbjo6Tm90aWZpY2F0aW9ucyogbm90aWZpZXJzXzsKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE11bHRpTm90aWZpZXJXb3JrZXIpOwotfTsKLQotLy8gQSBmaXhlZCBhcnJheSBvZiBib29sIGZsYWdzLiAgRWFjaCBmbGFnIHVzZXMgMSBiaXQuICBVc2Ugc2l6ZW9mKEZsYWdBcnJheSkKLS8vIHRvIGRldGVybWluZSBob3cgbXVjaCBtZW1vcnkgeW91IG5lZWQuICBUaGUgbnVtYmVyIG9mIGZsYWdzIHdpbGwgdGhlcmVmb3JlCi0vLyBiZSBzaXplb2YoRmxhZ0FycmF5KSAqIDguCi0vLyBXZSB1c2UgJ3N0cnVjdCcgdG8gc2lnbmlmeSB0aGF0IHRoaXMgc3RydWN0dXJlcyByZXByZXNlbnRzIGNvbXBpbGVyCi0vLyBpbmRlcGVuZGVudCBzdHJ1Y3R1cmVkIGRhdGEuICBJLmUuIHlvdSBtdXN0IGJlIGFibGUgdG8gbWFwIHRoaXMgY2xhc3MKLS8vIHRvIGEgcGllY2Ugb2Ygc2hhcmVkIG1lbW9yeSBvZiBzaXplIHNpemVvZihGbGFnQXJyYXkpIGFuZCBiZSBhYmxlIHRvCi0vLyB1c2UgdGhlIGNsYXNzLiAgTm8gdnRhYmxlcyBldGMuCi0vLyBUT0RPKHRvbW1pKTogTW92ZSB0aGlzIHRvIGl0cyBvd24gaGVhZGVyIHdoZW4gd2Ugc3RhcnQgdXNpbmcgaXQgZm9yIHNpZ25hbGluZwotLy8gYXVkaW8gZGV2aWNlcy4gIEFzIGlzLCBpdCdzIGp1c3QgaGVyZSBmb3IgcGVyZiBjb21wYXJpc29uIGFnYWluc3QgdGhlCi0vLyAibXVsdGlwbGUgbm90aWZpZXJzIiBhcHByb2FjaC4KLXN0cnVjdCBGbGFnQXJyYXkgewotIHB1YmxpYzoKLSAgRmxhZ0FycmF5KCkgOiBmbGFnc18oKSB7fQotCi0gIGJvb2wgaXNfc2V0KHNpemVfdCBpbmRleCkgY29uc3QgewotICAgIHJldHVybiAoZmxhZ3NfW2luZGV4ID4+IDVdICYgKDEgPDwgKGluZGV4ICYgMzEpKSk7Ci0gIH0KLQotICB2b2lkIHNldChzaXplX3QgaW5kZXgpIHsKLSAgICBmbGFnc19baW5kZXggPj4gNV0gfD0gKDFVIDw8IChzdGF0aWNfY2FzdDx1aW50MzI+KGluZGV4KSAmIDMxKSk7Ci0gIH0KLQotICB2b2lkIGNsZWFyKHNpemVfdCBpbmRleCkgewotICAgIGZsYWdzX1tpbmRleCA+PiA1XSAmPSB+KDFVIDw8IChzdGF0aWNfY2FzdDx1aW50MzI+KGluZGV4KSAmIDMxKSk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmxhZ3MgdGhhdCBjYW4gYmUgc2V0L2NoZWNrZWQuCi0gIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZW9mKGZsYWdzXykgKiA4OyB9Ci0KLSBwcml2YXRlOgotICAvLyAyNTYgKiAzMiA9IDgxOTIgZmxhZ3MgaW4gMUtCLgotICB1aW50MzIgZmxhZ3NfWzI1Nl07Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihGbGFnQXJyYXkpOwotfTsKLQotY2xhc3MgTXVsdGlOb3RpZmllcldvcmtlckZsYWdBcnJheSA6IHB1YmxpYyBiYXNlOjpQbGF0Zm9ybVRocmVhZDo6RGVsZWdhdGUgewotIHB1YmxpYzoKLSAgTXVsdGlOb3RpZmllcldvcmtlckZsYWdBcnJheShzaXplX3QgY291bnQsIEZsYWdBcnJheSogc2lnbmFscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIHNoYXJlZF9kYXRhLCBzaXplX3QgcmVwZWF0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb24qIG5vdGlmaWVyKQotICAgICAgOiBjb3VudF8oY291bnQpLCBzaWduYWxzXyhzaWduYWxzKSwgc2hhcmVkX2RhdGFfKHNoYXJlZF9kYXRhKSwKLSAgICAgICAgcmVwZWF0c18ocmVwZWF0cyksIG5vdGlmaWVyXyhub3RpZmllcikgewotICB9Ci0gIHZpcnR1YWwgfk11bHRpTm90aWZpZXJXb3JrZXJGbGFnQXJyYXkoKSB7fQotCi0gIC8vIGJhc2U6OlBsYXRmb3JtVGhyZWFkOjpEZWxlZ2F0ZToKLSAgdmlydHVhbCB2b2lkIFRocmVhZE1haW4oKSBPVkVSUklERSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXBlYXRzXzsgKytpKSB7Ci0gICAgICBub3RpZmllcl8tPldhaXQoKTsKLSAgICAgIGZvciAoc2l6ZV90IHMgPSAwOyBzIDwgY291bnRfOyArK3MpIHsKLSAgICAgICAgaWYgKHNpZ25hbHNfLT5pc19zZXQocykpIHsKLSAgICAgICAgICArK3NoYXJlZF9kYXRhX1tzXTsKLSAgICAgICAgICAvLyBXZSBkb24ndCBjbGVhciB0aGUgZmxhZyBoZXJlIGJ1dCBzaW1wbHkgbGVhdmUgaXQgc2lnbmFsZWQgYmVjYXVzZQotICAgICAgICAgIC8vIHdlIHdhbnQgdGhlIG90aGVyIHRocmVhZCB0byBhbHNvIGluY3JlbWVudCB0aGlzIHZhcmlhYmxlLgotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBub3RpZmllcl8tPlNpZ25hbCgpOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgc2l6ZV90IGNvdW50XzsKLSAgRmxhZ0FycmF5KiBzaWduYWxzXzsKLSAgc2l6ZV90KiBzaGFyZWRfZGF0YV87Ci0gIHNpemVfdCByZXBlYXRzXzsKLSAgQ3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uKiBub3RpZmllcl87Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNdWx0aU5vdGlmaWVyV29ya2VyRmxhZ0FycmF5KTsKLX07Ci0KLX0gIC8vIGVuZCBuYW1lc3BhY2UKLQotVEVTVChDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb24sIEZsYWdBcnJheSkgewotICBGbGFnQXJyYXkgZmxhZ3M7Ci0gIEVYUEVDVF9HVChmbGFncy5zaXplKCksIDEwMDBVKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmbGFncy5zaXplKCk7ICsraSkgewotICAgIEVYUEVDVF9GQUxTRShmbGFncy5pc19zZXQoaSkpOwotICAgIGZsYWdzLnNldChpKTsKLSAgICBFWFBFQ1RfVFJVRShmbGFncy5pc19zZXQoaSkpOwotICAgIGZsYWdzLmNsZWFyKGkpOwotICAgIEVYUEVDVF9GQUxTRShmbGFncy5pc19zZXQoaSkpOwotICB9Ci19Ci0KLS8vIEluaXRpYWxpemVzIHR3byBub3RpZmllcnMsIHNpZ25hbHMgdGhlIGVhY2ggb25lIGFuZCBtYWtlIHN1cmUgdGhlIG90aGVycwotLy8gd2FpdCBpcyBzYXRpc2ZpZWQuCi1URVNUKENyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbiwgQmFzaWMpIHsKLSAgQ3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uIGEsIGI7Ci0gIEFTU0VSVF9UUlVFKENyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbjo6SW5pdGlhbGl6ZVBhaXIoJmEsICZiKSk7Ci0gIEVYUEVDVF9UUlVFKGEuSXNWYWxpZCgpKTsKLSAgRVhQRUNUX1RSVUUoYi5Jc1ZhbGlkKCkpOwotCi0gIGEuU2lnbmFsKCk7Ci0gIGIuV2FpdCgpOwotCi0gIGIuU2lnbmFsKCk7Ci0gIGEuV2FpdCgpOwotfQotCi0vLyBTcGlucyB0d28gd29ya2VyIHRocmVhZHMsIGVhY2ggd2l0aCB0aGVpciBvd24gQ3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uCi0vLyB0aGF0IHRoZXkgdXNlIHRvIHJlYWQgYW5kIHdyaXRlIGZyb20gYSBzaGFyZWQgbWVtb3J5IGJ1ZmZlci4KLS8vIERpc2FibGVkIGFzIGl0IHRyaXBzIG9mIHRoZSBUU0FOIGJvdCAoZmFsc2UgcG9zaXRpdmUgc2luY2UgVFNBTiBkb2Vzbid0Ci0vLyByZWNvZ25pemUgc29ja2V0cyBhcyBiZWluZyBhIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmUpLgotVEVTVChDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb24sIERJU0FCTEVEX1R3b1RocmVhZHMpIHsKLSAgQ3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uIGEsIGI7Ci0gIEFTU0VSVF9UUlVFKENyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbjo6SW5pdGlhbGl6ZVBhaXIoJmEsICZiKSk7Ci0KLSAgc2l6ZV90IGRhdGEgPSAwOwotICBjb25zdCBzaXplX3Qga1JlcGVhdHMgPSAxMDAwMDsKLSAgU2luZ2xlTm90aWZpZXJXb3JrZXIgd29ya2VyMSgmZGF0YSwga1JlcGVhdHMsICZhKTsKLSAgU2luZ2xlTm90aWZpZXJXb3JrZXIgd29ya2VyMigmZGF0YSwga1JlcGVhdHMsICZiKTsKLSAgYmFzZTo6UGxhdGZvcm1UaHJlYWRIYW5kbGUgdGhyZWFkMSwgdGhyZWFkMjsKLSAgYmFzZTo6UGxhdGZvcm1UaHJlYWQ6OkNyZWF0ZSgwLCAmd29ya2VyMSwgJnRocmVhZDEpOwotICBiYXNlOjpQbGF0Zm9ybVRocmVhZDo6Q3JlYXRlKDAsICZ3b3JrZXIyLCAmdGhyZWFkMik7Ci0KLSAgLy8gU3RhcnQgdGhlIGZpcnN0IHRocmVhZC4gIFRoZXkgc2hvdWxkIHBpbmcgcG9uZyBhIGZldyB0aW1lcyBhbmQgdGFrZSB0dXJucwotICAvLyBpbmNyZW1lbnRpbmcgdGhlIHNoYXJlZCB2YXJpYWJsZSBhbmQgbmV2ZXIgc3RlcCBvbiBlYWNoIG90aGVyJ3MgdG9lcy4KLSAgYS5TaWduYWwoKTsKLQotICBiYXNlOjpQbGF0Zm9ybVRocmVhZDo6Sm9pbih0aHJlYWQxKTsKLSAgYmFzZTo6UGxhdGZvcm1UaHJlYWQ6OkpvaW4odGhyZWFkMik7Ci0KLSAgRVhQRUNUX0VRKGtSZXBlYXRzICogMiwgZGF0YSk7Ci19Ci0KLS8vIFVzZXMgYSBwYWlyIG9mIHRocmVhZHMgdG8gYWNjZXNzIHVwIHRvIDEwMDAgcGllY2VzIG9mIHN5bmNocm9uaXplZCBzaGFyZWQKLS8vIGRhdGEuIE9uIHJlZ3VsYXIgZGV2IG1hY2hpbmVzLCB0aGUgbnVtYmVyIG9mIG5vdGlmaWVycyBzaG91bGQgYmUgMTAwMCwgYnV0IG9uCi0vLyBtYWMgYW5kIGxpbnV4IGJvdHMsIHRoZSBudW1iZXIgd2lsbCBiZSBzbWFsbGVyIGR1ZSB0byB0aGUgUkxJTUlUX05PRklMRQotLy8gbGltaXQuIFNwZWNpZmljYWxseSwgbGludXggd2lsbCBoYXZlIHRoaXMgbGltaXQgYXQgMTAyNCB3aGljaCBtZWFucyBmb3IgdGhpcwotLy8gdGVzdCB0aGF0IHRoZSBtYXggbnVtYmVyIG9mIG5vdGlmaWVycyB3aWxsIGJlIGluIHRoZSByYW5nZSA1MDAtNTEyLiBPbiBNYWMKLS8vIHRoZSBsaW1pdCBpcyAyNTYsIHNvIHxjb3VudHwgd2lsbCBiZSB+MTIwLiAgT2gsIGFuZCByYWlzaW5nIHRoZSBsaW1pdCB2aWEKLS8vIHNldHJsaW1pdCgpIHdvbid0IHdvcmsuCi0vLyBESVNBQkxFRCBzaW5jZSB0aGUgZGlzdHJpYnV0aW9uIHdvbid0IGJlIGFjY3VyYXRlIHdoZW4gcnVuIG9uIHZhbGdyaW5kLgotVEVTVChDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb24sIERJU0FCTEVEX1Rob3VzYW5kTm90aWZpZXJzVHdvVGhyZWFkcykgewotICBjb25zdCBzaXplX3Qga0NvdW50ID0gMTAwMDsKLSAgTm90aWZpY2F0aW9uc093bmVyIHBhaXJzKGtDb3VudCk7Ci0gIHNpemVfdCBkYXRhW2tDb3VudF0gPSB7MH07Ci0gIC8vIFdlIHVzZSBhIG11bHRpcGxlIG9mIHRoZSBjb3VudCBzbyB0aGF0IHRoZSBkaXZpc2lvbiBpbiB0aGUgY2hlY2sgYmVsb3cKLSAgLy8gd2lsbCBiZSBuaWNlIGFuZCByb3VuZC4KLSAgc2l6ZV90IHJlcGVhdHMgPSBwYWlycy5zaXplKCkgKiAxOwotCi0gIE11bHRpTm90aWZpZXJXb3JrZXIgd29ya2VyXzEoJmRhdGFbMF0sIHJlcGVhdHMsICZwYWlycy5hKCkpOwotICBNdWx0aU5vdGlmaWVyV29ya2VyIHdvcmtlcl8yKCZkYXRhWzBdLCByZXBlYXRzLCAmcGFpcnMuYigpKTsKLSAgYmFzZTo6UGxhdGZvcm1UaHJlYWRIYW5kbGUgdGhyZWFkXzEsIHRocmVhZF8yOwotICBiYXNlOjpQbGF0Zm9ybVRocmVhZDo6Q3JlYXRlKDAsICZ3b3JrZXJfMSwgJnRocmVhZF8xKTsKLSAgYmFzZTo6UGxhdGZvcm1UaHJlYWQ6OkNyZWF0ZSgwLCAmd29ya2VyXzIsICZ0aHJlYWRfMik7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYWlycy5zaXplKCk7ICsraSkKLSAgICBwYWlycy5hKClbaV0tPlNpZ25hbCgpOwotCi0gIGJhc2U6OlBsYXRmb3JtVGhyZWFkOjpKb2luKHRocmVhZF8xKTsKLSAgYmFzZTo6UGxhdGZvcm1UaHJlYWQ6OkpvaW4odGhyZWFkXzIpOwotCi0gIHNpemVfdCBleHBlY3RlZF90b3RhbCA9IHBhaXJzLnNpemUoKSAqIDI7Ci0gIHNpemVfdCB0b3RhbCA9IDA7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFpcnMuc2l6ZSgpOyArK2kpIHsKLSAgICAvLyBUaGUgQ3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uOjpXYWl0Rm9yTXVsdGlwbGUgY2xhc3Mgc2hvdWxkIGhhdmUgZW5zdXJlZAotICAgIC8vIHRoYXQgYWxsIG5vdGlmaWVycyBoYWQgdGhlIHNhbWUgcXVhbGl0eSBvZiBzZXJ2aWNlLgotICAgIEVYUEVDVF9FUShleHBlY3RlZF90b3RhbCAvIHBhaXJzLnNpemUoKSwgZGF0YVtpXSk7Ci0gICAgdG90YWwgKz0gZGF0YVtpXTsKLSAgfQotICBFWFBFQ1RfRVEoZXhwZWN0ZWRfdG90YWwsIHRvdGFsKTsKLX0KLQotLy8gRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgKGFzIGZhciBhcyB0aGUgc2hhcmVkIGRhdGEgZ29lcykgdG8gdGhlCi0vLyBUaG91c2FuZE5vdGlmaWVyc1R3b1RocmVhZHMgdGVzdCBidXQgdXNlcyBhIHNpbmdsZSBwYWlyIG9mIG5vdGlmaWVycyArCi0vLyBGbGFnQXJyYXkgZm9yIHRoZSAxMDAwIHNpZ25hbHMuIFRoaXMgYXBwcm9hY2ggaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIuCi0vLyBEaXNhYmxlZCBhcyBpdCB0cmlwcyBvZiB0aGUgVFNBTiBib3QgLSAiUG9zc2libGUgZGF0YSByYWNlIGR1cmluZyB3cml0ZSBvZgotLy8gc2l6ZSA0IiAodGhlIGZsYWcgYXJyYXkpLgotVEVTVChDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb24sIERJU0FCTEVEX1R3b05vdGlmaWVyc1R3b1RocmVhZHMxMDAwU2lnbmFscykgewotICBDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb24gYSwgYjsKLSAgQVNTRVJUX1RSVUUoQ3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uOjpJbml0aWFsaXplUGFpcigmYSwgJmIpKTsKLQotICBjb25zdCBzaXplX3Qga0NvdW50ID0gMTAwMDsKLSAgRmxhZ0FycmF5IHNpZ25hbHM7Ci0gIEFTU0VSVF9HRShzaWduYWxzLnNpemUoKSwga0NvdW50KTsKLSAgc2l6ZV90IGRhdGFba0NvdW50XSA9IHswfTsKLQotICAvLyBTaW5jZSB0aGlzIGFsZ29yaXRobSBjaGVja3MgYWxsIGV2ZW50cyBlYWNoIHRpbWUgdGhlIG5vdGlmaWVyIGlzCi0gIC8vIHNpZ25hbGVkLCB8cmVwZWF0fCBkb2Vzbid0IG1lYW4gdGhlIHNhbWUgdGhpbmcgaGVyZSBhcyBpdCBkb2VzIGluCi0gIC8vIFRob3VzYW5kTm90aWZpZXJzVHdvVGhyZWFkcy4gIDEgcmVwZWF0IGhlcmUgaXMgdGhlIHNhbWUgYXMga0NvdW50Ci0gIC8vIHJlcGVhdHMgaW4gVGhvdXNhbmROb3RpZmllcnNUd29UaHJlYWRzLgotICBzaXplX3QgcmVwZWF0cyA9IDE7Ci0gIE11bHRpTm90aWZpZXJXb3JrZXJGbGFnQXJyYXkgd29ya2VyMShrQ291bnQsICZzaWduYWxzLCAmZGF0YVswXSwgcmVwZWF0cywgJmEpOwotICBNdWx0aU5vdGlmaWVyV29ya2VyRmxhZ0FycmF5IHdvcmtlcjIoa0NvdW50LCAmc2lnbmFscywgJmRhdGFbMF0sIHJlcGVhdHMsICZiKTsKLSAgYmFzZTo6UGxhdGZvcm1UaHJlYWRIYW5kbGUgdGhyZWFkMSwgdGhyZWFkMjsKLSAgYmFzZTo6UGxhdGZvcm1UaHJlYWQ6OkNyZWF0ZSgwLCAmd29ya2VyMSwgJnRocmVhZDEpOwotICBiYXNlOjpQbGF0Zm9ybVRocmVhZDo6Q3JlYXRlKDAsICZ3b3JrZXIyLCAmdGhyZWFkMik7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrQ291bnQ7ICsraSkKLSAgICBzaWduYWxzLnNldChpKTsKLSAgYS5TaWduYWwoKTsKLQotICBiYXNlOjpQbGF0Zm9ybVRocmVhZDo6Sm9pbih0aHJlYWQxKTsKLSAgYmFzZTo6UGxhdGZvcm1UaHJlYWQ6OkpvaW4odGhyZWFkMik7Ci0KLSAgc2l6ZV90IGV4cGVjdGVkX3RvdGFsID0ga0NvdW50ICogMjsKLSAgc2l6ZV90IHRvdGFsID0gMDsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrQ291bnQ7ICsraSkgewotICAgIC8vIFNpbmNlIGZvciBlYWNoIHNpZ25hbCwgd2UgcHJvY2VzcyBhbGwgc2lnbmFsZWQgZXZlbnRzLCB0aGUgc2hhcmVkIGRhdGEKLSAgICAvLyB2YXJpYWJsZXMgc2hvdWxkIGFsbCBiZSBlcXVhbC4KLSAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfdG90YWwgLyBrQ291bnQsIGRhdGFbaV0pOwotICAgIHRvdGFsICs9IGRhdGFbaV07Ci0gIH0KLSAgRVhQRUNUX0VRKGV4cGVjdGVkX3RvdGFsLCB0b3RhbCk7Ci19Ci0KLS8vIFRlc3QgdGhlIG1heGltdW0gbnVtYmVyIG9mIG5vdGlmaWVycyB3aXRob3V0IHNwaW5uaW5nIGZ1cnRoZXIgd2FpdAotLy8gdGhyZWFkcyBvbiBXaW5kb3dzLiBUaGlzIHRlc3QgYXNzdW1lcyB3ZSBjYW4gYWx3YXlzIGNyZWF0ZSA2NCBwYWlycyBhbmQKLS8vIGJhaWxzIGlmIHdlIGNhbid0LgotVEVTVChDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb24sIE11bHRpcGxlV2FpdHM2NCkgewotICBjb25zdCBzaXplX3Qga0NvdW50ID0gNjQ7Ci0gIE5vdGlmaWNhdGlvbnNPd25lciBwYWlycyhrQ291bnQpOwotICBBU1NFUlRfVFJVRShwYWlycy5zaXplKCkgPT0ga0NvdW50KTsKLQotICBDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb246OldhaXRGb3JNdWx0aXBsZSB3YWl0ZXIoJnBhaXJzLmIoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga0NvdW50OyArK2kpIHsKLSAgICBwYWlycy5hKClbaV0tPlNpZ25hbCgpOwotICAgIGludCBpbmRleCA9IHdhaXRlci5XYWl0KCk7Ci0gICAgRVhQRUNUX0VRKGksIHN0YXRpY19jYXN0PHNpemVfdD4oaW5kZXgpKTsKLSAgfQotfQotCi0vLyBUZXN0cyB3YWl0aW5nIGZvciBtb3JlIG5vdGlmaWVycyB0aGFuIHRoZSBPUyBzdXBwb3J0cyBvbiBvbmUgdGhyZWFkLgotLy8gVGhlIHRlc3Qgd2lsbCBjcmVhdGUgYXQgbW9zdCAxMDAwIHBhaXJzLCBidXQgb24gbWFjL2xpbnV4IGJvdHMgdGhlIGFjdHVhbAotLy8gbnVtYmVyIHdpbGwgYmUgbG93ZXIuICBTZWUgY29tbWVudCBhYm91dCB0aGUgUkxJTUlUX05PRklMRSBsaW1pdCBhYm92ZSBmb3IKLS8vIG1vcmUgZGV0YWlscy4KLS8vIERJU0FCTEVEIHNpbmNlIHRoZSBkaXN0cmlidXRpb24gd29uJ3QgYmUgYWNjdXJhdGUgd2hlbiBydW4gb24gdmFsZ3JpbmQuCi1URVNUKENyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbiwgRElTQUJMRURfTXVsdGlwbGVXYWl0czEwMDApIHsKLSAgLy8gQSAxMDAwIG5vdGlmaWVycyByZXF1aXJlcyAxNiB0aHJlYWRzIG9uIFdpbmRvd3MsIGluY2x1ZGluZyB0aGUgY3VycmVudAotICAvLyBvbmUsIHRvIHBlcmZvcm0gdGhlIHdhaXQgb3BlcmF0aW9uLgotICBjb25zdCBzaXplX3Qga0NvdW50ID0gMTAwMDsKLSAgTm90aWZpY2F0aW9uc093bmVyIHBhaXJzKGtDb3VudCk7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYWlycy5zaXplKCk7ICsraSkgewotICAgIHBhaXJzLmEoKVtpXS0+U2lnbmFsKCk7Ci0gICAgLy8gVG8gZGlzYWJsZSB0aGUgbG9hZCBkaXN0cmlidXRpb24gYWxnb3JpdGhtIGFuZCBmb3JjZSB0aGUgZXh0cmEgd29ya2VyCi0gICAgLy8gdGhyZWFkKHMpIHRvIGNhdGNoIHRoZSBzaWduYWxlZCBldmVudCwgd2UgZGVmaW5lIHRoZSB8d2FpdGVyfCBpbnNpZGUKLSAgICAvLyB0aGUgbG9vcC4KLSAgICBDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb246OldhaXRGb3JNdWx0aXBsZSB3YWl0ZXIoJnBhaXJzLmIoKSk7Ci0gICAgaW50IGluZGV4ID0gd2FpdGVyLldhaXQoKTsKLSAgICBFWFBFQ1RfRVEoaSwgc3RhdGljX2Nhc3Q8c2l6ZV90PihpbmRleCkpOwotICB9Ci19Ci0KLWNsYXNzIENyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbk11bHRpUHJvY2Vzc1Rlc3QgOiBwdWJsaWMgYmFzZTo6TXVsdGlQcm9jZXNzVGVzdCB7Ci19OwotCi1uYW1lc3BhY2UgewotCi0vLyBBIHZlcnkgY3J1ZGUgSVBDIG1lY2hhbmlzbSB0aGF0IHdlIHVzZSB0byBzZXQgdXAgdGhlIHNwYXduZWQgY2hpbGQgcHJvY2VzcwotLy8gYW5kIHRoZSBwYXJlbnQgcHJvY2Vzcy4KLXN0cnVjdCBDcnVkZUlwYyB7Ci0gIHVpbnQ4IHJlYWR5OwotICBDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb246OklQQ0hhbmRsZSBoYW5kbGVfMTsKLSAgQ3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uOjpJUENIYW5kbGUgaGFuZGxlXzI7Ci19OwotCi0jaWYgZGVmaW5lZChPU19QT1NJWCkKLWNvbnN0IGludCBrUG9zaXhDaGlsZFNoYXJlZE1lbSA9IDMwOwotI2Vsc2UKLWNvbnN0IGNoYXIga1NoYXJlZE1lbU5hbWVbXSA9ICJDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb25NdWx0aVByb2Nlc3NUZXN0IjsKLSNlbmRpZgotCi1jb25zdCBzaXplX3Qga1NoYXJlZE1lbVNpemUgPSAxMDI0OwotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gVGhlIG1haW4gcm91dGluZSBvZiB0aGUgY2hpbGQgcHJvY2Vzcy4gIFdhaXRzIGZvciB0aGUgcGFyZW50IHByb2Nlc3MKLS8vIHRvIGNvcHkgaGFuZGxlcyBvdmVyIHRvIHRoZSBjaGlsZCBhbmQgdGhlbiB1c2VzIGEgQ3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uIHRvCi0vLyB3YWl0IGFuZCBzaWduYWwgdG8gdGhlIHBhcmVudCBwcm9jZXNzLgotTVVMVElQUk9DRVNTX1RFU1RfTUFJTihDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb25DaGlsZE1haW4pIHsKLSNpZiBkZWZpbmVkKE9TX1BPU0lYKQotICBiYXNlOjpTaGFyZWRNZW1vcnkgbWVtKAotICAgICAgYmFzZTo6U2hhcmVkTWVtb3J5SGFuZGxlKGtQb3NpeENoaWxkU2hhcmVkTWVtLCB0cnVlIC8qIGF1dG8gY2xvc2UgKi8pLAotICAgICAgZmFsc2UpOwotI2Vsc2UKLSAgYmFzZTo6U2hhcmVkTWVtb3J5IG1lbTsKLSAgQ0hFQ0sobWVtLkNyZWF0ZU5hbWVkKGtTaGFyZWRNZW1OYW1lLCB0cnVlLCBrU2hhcmVkTWVtU2l6ZSkpOwotI2VuZGlmCi0KLSAgQ0hFQ0sobWVtLk1hcChrU2hhcmVkTWVtU2l6ZSkpOwotICBDcnVkZUlwYyogaXBjID0gcmVpbnRlcnByZXRfY2FzdDxDcnVkZUlwYyo+KG1lbS5tZW1vcnkoKSk7Ci0KLSAgd2hpbGUgKCFpcGMtPnJlYWR5KQotICAgIGJhc2U6OlBsYXRmb3JtVGhyZWFkOjpTbGVlcChiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMTApKTsKLQotICBDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb24gbm90aWZpZXIoaXBjLT5oYW5kbGVfMSwgaXBjLT5oYW5kbGVfMik7Ci0gIG5vdGlmaWVyLldhaXQoKTsKLSAgbm90aWZpZXIuU2lnbmFsKCk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIFNwYXducyBhIG5ldyBwcm9jZXNzIGFuZCBoYW5kcyBhIENyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbiBpbnN0YW5jZSB0byB0aGUKLS8vIG5ldyBwcm9jZXNzLiAgT25jZSB0aGF0J3MgZG9uZSwgaXQgd2FpdHMgZm9yIHRoZSBjaGlsZCBwcm9jZXNzIHRvIHNpZ25hbAotLy8gaXQncyBlbmQgYW5kIHF1aXRzLgotVEVTVF9GKENyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbk11bHRpUHJvY2Vzc1Rlc3QsIEJhc2ljKSB7Ci0gIENyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbiBhLCBiOwotICBBU1NFUlRfVFJVRShDcm9zc1Byb2Nlc3NOb3RpZmljYXRpb246OkluaXRpYWxpemVQYWlyKCZhLCAmYikpOwotICBFWFBFQ1RfVFJVRShhLklzVmFsaWQoKSk7Ci0gIEVYUEVDVF9UUlVFKGIuSXNWYWxpZCgpKTsKLQotICBiYXNlOjpTaGFyZWRNZW1vcnkgbWVtOwotCi0jaWYgZGVmaW5lZChPU19QT1NJWCkKLSAgQVNTRVJUX1RSVUUobWVtLkNyZWF0ZUFuZE1hcEFub255bW91cyhrU2hhcmVkTWVtU2l6ZSkpOwotI2Vsc2UKLSAgbWVtLkRlbGV0ZShrU2hhcmVkTWVtTmFtZSk7ICAvLyBJbiBjYXNlIGEgcHJldmlvdXMgcnVuIHdhcyB1bnN1Y2Nlc3NmdWwuCi0gIEFTU0VSVF9UUlVFKG1lbS5DcmVhdGVOYW1lZChrU2hhcmVkTWVtTmFtZSwgZmFsc2UsIGtTaGFyZWRNZW1TaXplKSk7Ci0gIEFTU0VSVF9UUlVFKG1lbS5NYXAoa1NoYXJlZE1lbVNpemUpKTsKLSNlbmRpZgotCi0gIENydWRlSXBjKiBpcGMgPSByZWludGVycHJldF9jYXN0PENydWRlSXBjKj4obWVtLm1lbW9yeSgpKTsKLSAgaXBjLT5yZWFkeSA9IGZhbHNlOwotCi0jaWYgZGVmaW5lZChPU19QT1NJWCkKLSAgY29uc3QgaW50IGtQb3NpeENoaWxkU29ja2V0ID0gMjA7Ci0gIEVYUEVDVF9UUlVFKGIuU2hhcmVUb1Byb2Nlc3MoCi0gICAgICAgIGJhc2U6OmtOdWxsUHJvY2Vzc0hhbmRsZSwgJmlwYy0+aGFuZGxlXzEsICZpcGMtPmhhbmRsZV8yKSk7Ci0gIGJhc2U6OkZpbGVIYW5kbGVNYXBwaW5nVmVjdG9yIGZkX21hcHBpbmdfdmVjOwotICBmZF9tYXBwaW5nX3ZlYy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoaXBjLT5oYW5kbGVfMS5mZCwga1Bvc2l4Q2hpbGRTb2NrZXQpKTsKLSAgZmRfbWFwcGluZ192ZWMucHVzaF9iYWNrKAotICAgICAgc3RkOjptYWtlX3BhaXIobWVtLmhhbmRsZSgpLmZkLCBrUG9zaXhDaGlsZFNoYXJlZE1lbSkpOwotICBpcGMtPmhhbmRsZV8xLmZkID0ga1Bvc2l4Q2hpbGRTb2NrZXQ7Ci0gIGJhc2U6OlByb2Nlc3NIYW5kbGUgcHJvY2VzcyA9IFNwYXduQ2hpbGQoIkNyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbkNoaWxkTWFpbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRfbWFwcGluZ192ZWMsIGZhbHNlKTsKLSNlbHNlCi0gIGJhc2U6OlByb2Nlc3NIYW5kbGUgcHJvY2VzcyA9IFNwYXduQ2hpbGQoIkNyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbkNoaWxkTWFpbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICBFWFBFQ1RfVFJVRShiLlNoYXJlVG9Qcm9jZXNzKHByb2Nlc3MsICZpcGMtPmhhbmRsZV8xLCAmaXBjLT5oYW5kbGVfMikpOwotI2VuZGlmCi0KLSAgaXBjLT5yZWFkeSA9IHRydWU7Ci0KLSAgYS5TaWduYWwoKTsKLSAgYS5XYWl0KCk7Ci0KLSAgaW50IGV4aXRfY29kZSA9IC0xOwotICBiYXNlOjpXYWl0Rm9yRXhpdENvZGUocHJvY2VzcywgJmV4aXRfY29kZSk7Ci0gIEVYUEVDVF9FUSgwLCBleGl0X2NvZGUpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2Nyb3NzX3Byb2Nlc3Nfbm90aWZpY2F0aW9uX3dpbi5jYyBiL3NyYy9tZWRpYS9hdWRpby9jcm9zc19wcm9jZXNzX25vdGlmaWNhdGlvbl93aW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NTRjYmYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2Nyb3NzX3Byb2Nlc3Nfbm90aWZpY2F0aW9uX3dpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vY3Jvc3NfcHJvY2Vzc19ub3RpZmljYXRpb24uaCIKLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy9wbGF0Zm9ybV90aHJlYWQuaCIKLSNpbmNsdWRlICJiYXNlL3dpbi9zY29wZWRfaGFuZGxlLmgiCi0KLUNyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbjo6fkNyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbigpIHt9Ci0KLUNyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbjo6Q3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uKElQQ0hhbmRsZSBoYW5kbGVfMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ0hhbmRsZSBoYW5kbGVfMikKLSAgICA6IG1pbmVfKGhhbmRsZV8xKSwgb3RoZXJfKGhhbmRsZV8yKSB7Ci0gIERDSEVDSyhJc1ZhbGlkKCkpOwotfQotCi12b2lkIENyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbjo6U2lnbmFsKCkgewotICBEQ0hFQ0soSXNWYWxpZCgpKTsKLSAgRENIRUNLX0VRKDo6V2FpdEZvclNpbmdsZU9iamVjdChtaW5lXywgMCksIHN0YXRpY19jYXN0PERXT1JEPihXQUlUX1RJTUVPVVQpKQotICAgICAgPDwgIkFyZSB5b3UgY2FsbGluZyBTaWduYWwoKSB3aXRob3V0IGNhbGxpbmcgV2FpdCgpIGZpcnN0PyI7Ci0gIEJPT0wgb2sgPSA6OlNldEV2ZW50KG1pbmVfKTsKLSAgQ0hFQ0sob2spOwotfQotCi12b2lkIENyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbjo6V2FpdCgpIHsKLSAgRENIRUNLKElzVmFsaWQoKSk7Ci0gIERXT1JEIHdhaXQgPSA6OldhaXRGb3JTaW5nbGVPYmplY3Qob3RoZXJfLCBJTkZJTklURSk7Ci0gIERDSEVDS19FUSh3YWl0LCBXQUlUX09CSkVDVF8wKTsKLSAgQk9PTCBvayA9IDo6UmVzZXRFdmVudChvdGhlcl8pOwotICBDSEVDSyhvayk7Ci19Ci0KLWJvb2wgQ3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uOjpJc1ZhbGlkKCkgY29uc3QgewotICByZXR1cm4gbWluZV8uSXNWYWxpZCgpICYmIG90aGVyXy5Jc1ZhbGlkKCk7Ci19Ci0KLWJvb2wgQ3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uOjpTaGFyZVRvUHJvY2VzcyhiYXNlOjpQcm9jZXNzSGFuZGxlIHByb2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDSGFuZGxlKiBoYW5kbGVfMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENIYW5kbGUqIGhhbmRsZV8yKSB7Ci0gIERDSEVDSyhJc1ZhbGlkKCkpOwotICBIQU5ETEUgb3VyX3Byb2Nlc3MgPSA6OkdldEN1cnJlbnRQcm9jZXNzKCk7Ci0gIGlmICghOjpEdXBsaWNhdGVIYW5kbGUob3VyX3Byb2Nlc3MsIG1pbmVfLCBwcm9jZXNzLCBoYW5kbGVfMSwgMCwgRkFMU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRFVQTElDQVRFX1NBTUVfQUNDRVNTKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghOjpEdXBsaWNhdGVIYW5kbGUob3VyX3Byb2Nlc3MsIG90aGVyXywgcHJvY2VzcywgaGFuZGxlXzIsIDAsIEZBTFNFLAotICAgICAgICAgICAgICAgICAgICAgICAgIERVUExJQ0FURV9TQU1FX0FDQ0VTUykpIHsKLSAgICAvLyBJbiBjYXNlIHdlJ3JlIHNoYXJpbmcgdG8gb3Vyc2VsdmVzLCB3ZSBjYW4gY2xvc2UgdGhlIGhhbmRsZSwgYnV0Ci0gICAgLy8gaWYgdGhlIHRhcmdldCBwcm9jZXNzIGlzIGEgZGlmZmVyZW50IHByb2Nlc3MsIHdlIGRvIG5vdGhpbmcuCi0gICAgaWYgKHByb2Nlc3MgPT0gb3VyX3Byb2Nlc3MpCi0gICAgICA6OkNsb3NlSGFuZGxlKCpoYW5kbGVfMSk7Ci0gICAgKmhhbmRsZV8xID0gTlVMTDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gc3RhdGljCi1ib29sIENyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbjo6SW5pdGlhbGl6ZVBhaXIoQ3Jvc3NQcm9jZXNzTm90aWZpY2F0aW9uKiBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbiogYikgewotICBEQ0hFQ0soIWEtPklzVmFsaWQoKSk7Ci0gIERDSEVDSyghYi0+SXNWYWxpZCgpKTsKLQotICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKLQotICAvLyBDcmVhdGUgdHdvIG1hbnVhbGx5IHJlc2V0dGFibGUgZXZlbnRzIGFuZCBnaXZlIGVhY2ggcGFydHkgYSBoYW5kbGUKLSAgLy8gdG8gYm90aCBldmVudHMuCi0gIEhBTkRMRSBldmVudF9hID0gOjpDcmVhdGVFdmVudChOVUxMLCBUUlVFLCBGQUxTRSwgTlVMTCk7Ci0gIEhBTkRMRSBldmVudF9iID0gOjpDcmVhdGVFdmVudChOVUxMLCBUUlVFLCBGQUxTRSwgTlVMTCk7Ci0gIGlmIChldmVudF9hICYmIGV2ZW50X2IpIHsKLSAgICBhLT5taW5lXy5TZXQoZXZlbnRfYSk7Ci0gICAgYS0+b3RoZXJfLlNldChldmVudF9iKTsKLSAgICBzdWNjZXNzID0gYS0+U2hhcmVUb1Byb2Nlc3MoR2V0Q3VycmVudFByb2Nlc3MoKSwgJmV2ZW50X2EsICZldmVudF9iKTsKLSAgICBpZiAoc3VjY2VzcykgewotICAgICAgYi0+bWluZV8uU2V0KGV2ZW50X2IpOwotICAgICAgYi0+b3RoZXJfLlNldChldmVudF9hKTsKLSAgICB9IGVsc2UgewotICAgICAgYS0+bWluZV8uQ2xvc2UoKTsKLSAgICAgIGEtPm90aGVyXy5DbG9zZSgpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoZXZlbnRfYSkKLSAgICAgIDo6Q2xvc2VIYW5kbGUoZXZlbnRfYSk7Ci0gICAgaWYgKGV2ZW50X2IpCi0gICAgICA6OkNsb3NlSGFuZGxlKGV2ZW50X2IpOwotICB9Ci0KLSAgRENIRUNLKCFzdWNjZXNzIHx8IGEtPklzVmFsaWQoKSk7Ci0gIERDSEVDSyghc3VjY2VzcyB8fCBiLT5Jc1ZhbGlkKCkpOwotCi0gIHJldHVybiBzdWNjZXNzOwotfQotCi1uYW1lc3BhY2UgewotY2xhc3MgRXh0cmFXYWl0VGhyZWFkIDogcHVibGljIGJhc2U6OlBsYXRmb3JtVGhyZWFkOjpEZWxlZ2F0ZSB7Ci0gcHVibGljOgotICBFeHRyYVdhaXRUaHJlYWQoSEFORExFIHN0b3AsIEhBTkRMRSogZXZlbnRzLCBzaXplX3QgY291bnQsCi0gICAgICAgICAgICAgICAgICBpbnQqIHNpZ25hbGVkX2V2ZW50KQotICAgICAgOiBzdG9wXyhzdG9wKSwgZXZlbnRzXyhldmVudHMpLCBjb3VudF8oY291bnQpLAotICAgICAgICBzaWduYWxlZF9ldmVudF8oc2lnbmFsZWRfZXZlbnQpIHsKLSAgICAqc2lnbmFsZWRfZXZlbnRfID0gLTE7Ci0gIH0KLSAgdmlydHVhbCB+RXh0cmFXYWl0VGhyZWFkKCkge30KLQotICB2aXJ0dWFsIHZvaWQgVGhyZWFkTWFpbigpIE9WRVJSSURFIHsKLSAgICAvLyBTdG9yZSB0aGUgfHN0b3BffCBldmVudCBhcyB0aGUgZmlyc3QgZXZlbnQuCi0gICAgSEFORExFIGV2ZW50c1tNQVhJTVVNX1dBSVRfT0JKRUNUU10gPSB7IHN0b3BfIH07Ci0gICAgSEFORExFIG5leHRfdGhyZWFkID0gTlVMTDsKLSAgICBEV09SRCBldmVudF9jb3VudCA9IE1BWElNVU1fV0FJVF9PQkpFQ1RTOwotICAgIGludCB0aHJlYWRfc2lnbmFsZWRfZXZlbnQgPSAtMTsKLSAgICBzY29wZWRfcHRyPEV4dHJhV2FpdFRocmVhZD4gZXh0cmFfd2FpdF90aHJlYWQ7Ci0gICAgaWYgKGNvdW50XyA+IChNQVhJTVVNX1dBSVRfT0JKRUNUUyAtIDEpKSB7Ci0gICAgICBzdGQ6OmNvcHkoJmV2ZW50c19bMF0sICZldmVudHNfW01BWElNVU1fV0FJVF9PQkpFQ1RTIC0gMl0sICZldmVudHNbMV0pOwotCi0gICAgICBleHRyYV93YWl0X3RocmVhZC5yZXNldChuZXcgRXh0cmFXYWl0VGhyZWFkKHN0b3BfLAotICAgICAgICAgICZldmVudHNfW01BWElNVU1fV0FJVF9PQkpFQ1RTIC0gMl0sCi0gICAgICAgICAgY291bnRfIC0gKE1BWElNVU1fV0FJVF9PQkpFQ1RTIC0gMiksCi0gICAgICAgICAgJnRocmVhZF9zaWduYWxlZF9ldmVudCkpOwotICAgICAgYmFzZTo6UGxhdGZvcm1UaHJlYWQ6OkNyZWF0ZSgwLCBleHRyYV93YWl0X3RocmVhZC5nZXQoKSwgJm5leHRfdGhyZWFkKTsKLQotICAgICAgZXZlbnRfY291bnQgPSBNQVhJTVVNX1dBSVRfT0JKRUNUUzsKLSAgICAgIGV2ZW50c1tNQVhJTVVNX1dBSVRfT0JKRUNUUyAtIDFdID0gbmV4dF90aHJlYWQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN0ZDo6Y29weSgmZXZlbnRzX1swXSwgJmV2ZW50c19bY291bnRfXSwgJmV2ZW50c1sxXSk7Ci0gICAgICBldmVudF9jb3VudCA9IGNvdW50XyArIDE7Ci0gICAgfQotCi0gICAgRFdPUkQgd2FpdCA9IDo6V2FpdEZvck11bHRpcGxlT2JqZWN0cyhldmVudF9jb3VudCwgJmV2ZW50c1swXSwgRkFMU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZJTklURSk7Ci0gICAgaWYgKHdhaXQgPj0gV0FJVF9PQkpFQ1RfMCAmJiB3YWl0IDwgKFdBSVRfT0JKRUNUXzAgKyBldmVudF9jb3VudCkpIHsKLSAgICAgIHdhaXQgLT0gV0FJVF9PQkpFQ1RfMDsKLSAgICAgIGlmICh3YWl0ID09IDApIHsKLSAgICAgICAgLy8gVGhlIHN0b3AgZXZlbnQgd2FzIHNpZ25hbGVkLiAgQ2hlY2sgaWYgaXQgd2FzIHNpZ25hbGVkIGJ5IGEKLSAgICAgICAgLy8gc3ViIHRocmVhZC4gIEluIGNhc2Ugb3VyIHN1YiB0aHJlYWQgaGFkIHRvIHNwaW4gYW5vdGhlciB0aHJlYWQgKGFuZAotICAgICAgICAvLyBzbyBvbiksIHdlIG11c3Qgd2FpdCBmb3Igb3VycyB0byBleGl0IGJlZm9yZSB3ZSBjYW4gY2hlY2sgdGhlCi0gICAgICAgIC8vIHByb3BhZ2F0ZWQgZXZlbnQgb2Zmc2V0LgotICAgICAgICBpZiAobmV4dF90aHJlYWQpIHsKLSAgICAgICAgICBiYXNlOjpQbGF0Zm9ybVRocmVhZDo6Sm9pbihuZXh0X3RocmVhZCk7Ci0gICAgICAgICAgbmV4dF90aHJlYWQgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0aHJlYWRfc2lnbmFsZWRfZXZlbnQgIT0gLTEpCi0gICAgICAgICAgKnNpZ25hbGVkX2V2ZW50XyA9IHRocmVhZF9zaWduYWxlZF9ldmVudCArIChNQVhJTVVNX1dBSVRfT0JKRUNUUyAtIDIpOwotICAgICAgfSBlbHNlIGlmIChldmVudHNbd2FpdF0gPT0gbmV4dF90aHJlYWQpIHsKLSAgICAgICAgTk9UUkVBQ0hFRCgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgKnNpZ25hbGVkX2V2ZW50XyA9IHN0YXRpY19jYXN0PGludD4od2FpdCk7Ci0gICAgICAgIFNldEV2ZW50KHN0b3BfKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgTk9UUkVBQ0hFRCgpOwotICAgIH0KLQotICAgIGlmIChuZXh0X3RocmVhZCkKLSAgICAgIGJhc2U6OlBsYXRmb3JtVGhyZWFkOjpKb2luKG5leHRfdGhyZWFkKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgSEFORExFIHN0b3BfOwotICBIQU5ETEUqIGV2ZW50c187Ci0gIHNpemVfdCBjb3VudF87Ci0gIGludCogc2lnbmFsZWRfZXZlbnRfOwotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRXh0cmFXYWl0VGhyZWFkKTsKLX07Ci19ICAvLyBlbmQgbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotaW50IENyb3NzUHJvY2Vzc05vdGlmaWNhdGlvbjo6V2FpdE11bHRpcGxlKGNvbnN0IE5vdGlmaWNhdGlvbnMmIG5vdGlmaWNhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHdhaXRfb2Zmc2V0KSB7Ci0gIERDSEVDS19MVCh3YWl0X29mZnNldCwgbm90aWZpY2F0aW9ucy5zaXplKCkpOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbm90aWZpY2F0aW9ucy5zaXplKCk7ICsraSkgewotICAgIERDSEVDSyhub3RpZmljYXRpb25zW2ldLT5Jc1ZhbGlkKCkpOwotICB9Ci0KLSAgLy8gVE9ETyh0b21taSk6IFNob3VsZCB3ZSB3YWl0IGluIGFuIGFsZXJ0YWJsZSBzdGF0ZSBzbyB0aGF0IHdlIGNhbiBiZQotICAvLyBjYW5jZWxlZCB2aWEgYW4gQVBDPwotICBzY29wZWRfYXJyYXk8SEFORExFPiBoYW5kbGVzKG5ldyBIQU5ETEVbbm90aWZpY2F0aW9ucy5zaXplKCldKTsKLQotICAvLyBCZWNhdXNlIG9mIHRoZSB3YXkgV2FpdEZvck11bHRpcGxlT2JqZWN0cyB3b3Jrcywgd2UgZG8gYSBsaXR0bGUgdHJpY2sgaGVyZS4KLSAgLy8gV2hlbiBtdWx0aXBsZSBldmVudHMgYXJlIHNpZ25hbGVkLCBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzIHdpbGwgcmV0dXJuIHRoZQotICAvLyBpbmRleCBvZiB0aGUgZmlyc3Qgc2lnbmFsZWQgaXRlbSAobG93ZXN0KS4gIFRoaXMgbWVhbnMgdGhhdCBpZiB3ZSBhbHdheXMKLSAgLy8gcGFzcyB0aGUgYXJyYXkgdGhlIHNhbWUgd2F5IHRvIFdhaXRGb3JNdWx0aXBsZU9iamVjdHMsIHRoZSBvYmplY3RzIHRoYXQKLSAgLy8gY29tZSBmaXJzdCwgaGF2ZSBoaWdoZXIgcHJpb3JpdHkuICBJbiB0aW1lcyBvZiBoZWF2eSBsb2FkLCB0aGlzIHdpbGwgY2F1c2UKLSAgLy8gZWxlbWVudHMgYXQgdGhlIGJhY2sgdG8gYmVjb21lIERPUy1lZC4KLSAgLy8gU28sIHdlIHN0b3JlIHRoZSBsb2NhdGlvbiBvZiB0aGUgaXRlbSB0aGF0IHdhcyBsYXN0IHNpZ25hbGVkLiBUaGVuIHdlIHNwbGl0Ci0gIC8vIHVwIHRoZSBhcnJheSBhbmQgbW92ZSBldmVyeXRoaW5nIGhpZ2hlciB0aGFuIHRoZSBsYXN0IHNpZ25hbGVkIGluZGV4IHRvIHRoZQotICAvLyBmcm9udCBhbmQgdGhlIHJlc3QgdG8gdGhlIGJhY2sgKG1lYW5pbmcgdGhhdCB0aGUgbGFzdCBzaWduYWxlZCBpdGVtIHdpbGwKLSAgLy8gYmVjb21lIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIGxpc3QpLgotICAvLyBBc3N1bWluZyBlcXVhbGx5IGJ1c3kgZXZlbnRzLCB0aGlzIGFwcHJvYWNoIGRpc3RyaWJ1dGVzIHRoZSBwcmlvcml0eQotICAvLyBldmVubHkuCi0KLSAgc2l6ZV90IGluZGV4ID0gMDsKLSAgZm9yIChzaXplX3QgaSA9IHdhaXRfb2Zmc2V0OyBpIDwgbm90aWZpY2F0aW9ucy5zaXplKCk7ICsraSkKLSAgICBoYW5kbGVzW2luZGV4KytdID0gbm90aWZpY2F0aW9uc1tpXS0+b3RoZXJfOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgd2FpdF9vZmZzZXQ7ICsraSkKLSAgICBoYW5kbGVzW2luZGV4KytdID0gbm90aWZpY2F0aW9uc1tpXS0+b3RoZXJfOwotICBEQ0hFQ0tfRVEoaW5kZXgsIG5vdGlmaWNhdGlvbnMuc2l6ZSgpKTsKLQotICBEV09SRCB3YWl0ID0gV0FJVF9GQUlMRUQ7Ci0gIGJvb2wgd2FpdF9mYWlsZWQgPSBmYWxzZTsKLSAgaWYgKG5vdGlmaWNhdGlvbnMuc2l6ZSgpIDw9IE1BWElNVU1fV0FJVF9PQkpFQ1RTKSB7Ci0gICAgd2FpdCA9IDo6V2FpdEZvck11bHRpcGxlT2JqZWN0cyhub3RpZmljYXRpb25zLnNpemUoKSwgJmhhbmRsZXNbMF0sIEZBTFNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GSU5JVEUpOwotICAgIHdhaXRfZmFpbGVkID0gd2FpdCA8IFdBSVRfT0JKRUNUXzAgfHwKLSAgICAgICAgICAgICAgICAgIHdhaXQgPj0gKFdBSVRfT0JKRUNUXzAgKyBNQVhJTVVNX1dBSVRfT0JKRUNUUyk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gVXNlZCB0byBzdG9wIHRoZSBvdGhlciB3YWl0IHRocmVhZHMgd2hlbiBhbiBldmVudCBoYXMgYmVlbiBzaWduYWxlZC4KLSAgICBiYXNlOjp3aW46OlNjb3BlZEhhbmRsZSBzdG9wKDo6Q3JlYXRlRXZlbnQoTlVMTCwgVFJVRSwgRkFMU0UsIE5VTEwpKTsKLQotICAgIC8vIENyZWF0ZSB0aGUgZmlyc3QgdGhyZWFkIGFuZCBwYXNzIGEgcG9pbnRlciB0byBhbGwgaGFuZGxlcyA+NjMKLSAgICAvLyB0byB0aGUgdGhyZWFkICsgJ3N0b3AnLiAgVGhlbiBpbXBsZW1lbnQgdGhlIHRocmVhZCBzbyB0aGF0IGl0IGNoZWNrcwotICAgIC8vIGlmIHRoZSBudW1iZXIgb2YgaGFuZGxlcyBpcyA+IDYzLiAgSWYgc28sIHNwYXducyBhIG5ldyB0aHJlYWQgYW5kCi0gICAgLy8gcGFzc2VzID42MiBoYW5kbGVzIHRvIHRoYXQgdGhyZWFkIGFuZCB3YWl0cyBmb3IgdGhlIDYyIGhhbmRsZXMgKyBzdG9wICsKLSAgICAvLyBuZXh0IHRocmVhZC4gIGV0YyBldGMuCi0KLSAgICAvLyBDcmVhdGUgYSBsaXN0IG9mIHRocmVhZHMgc28gdGhhdCBlYWNoIHRocmVhZCB3YWl0cyBvbiBhdCBtb3N0IDYyIGV2ZW50cwotICAgIC8vIGluY2x1ZGluZyBvbmUgZXZlbnQgZm9yIHdoZW4gYSBjaGlsZCB0aHJlYWQgc2lnbmFscyBjb21wbGV0aW9uIGFuZCBvbmUKLSAgICAvLyBldmVudCBmb3Igd2hlbiBhbGwgb2YgdGhlIHRocmVhZHMgbXVzdCBiZSBzdG9wcGVkIChkdWUgdG8gc29tZSBldmVudAotICAgIC8vIGJlaW5nIHNpZ25hbGVkKS4KLQotICAgIGludCB0aHJlYWRfc2lnbmFsZWRfZXZlbnQgPSAtMTsKLSAgICBFeHRyYVdhaXRUaHJlYWQgd2FpdF90aHJlYWQoc3RvcCwgJmhhbmRsZXNbTUFYSU1VTV9XQUlUX09CSkVDVFMgLSAxXSwKLSAgICAgICAgbm90aWZpY2F0aW9ucy5zaXplKCkgLSAoTUFYSU1VTV9XQUlUX09CSkVDVFMgLSAxKSwKLSAgICAgICAgJnRocmVhZF9zaWduYWxlZF9ldmVudCk7Ci0gICAgYmFzZTo6UGxhdGZvcm1UaHJlYWRIYW5kbGUgdGhyZWFkOwotICAgIGJhc2U6OlBsYXRmb3JtVGhyZWFkOjpDcmVhdGUoMCwgJndhaXRfdGhyZWFkLCAmdGhyZWFkKTsKLSAgICBIQU5ETEUgZXZlbnRzW01BWElNVU1fV0FJVF9PQkpFQ1RTXTsKLSAgICBzdGQ6OmNvcHkoJmhhbmRsZXNbMF0sICZoYW5kbGVzW01BWElNVU1fV0FJVF9PQkpFQ1RTIC0gMV0sICZldmVudHNbMF0pOwotICAgIGV2ZW50c1tNQVhJTVVNX1dBSVRfT0JKRUNUUyAtIDFdID0gdGhyZWFkOwotICAgIHdhaXQgPSA6OldhaXRGb3JNdWx0aXBsZU9iamVjdHMoTUFYSU1VTV9XQUlUX09CSkVDVFMsICZldmVudHNbMF0sIEZBTFNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GSU5JVEUpOwotICAgIHdhaXRfZmFpbGVkID0gd2FpdCA8IFdBSVRfT0JKRUNUXzAgfHwKLSAgICAgICAgICAgICAgICAgIHdhaXQgPj0gKFdBSVRfT0JKRUNUXzAgKyBNQVhJTVVNX1dBSVRfT0JKRUNUUyk7Ci0gICAgaWYgKHdhaXQgPT0gV0FJVF9PQkpFQ1RfMCArIChNQVhJTVVNX1dBSVRfT0JKRUNUUyAtIDEpKSB7Ci0gICAgICBpZiAodGhyZWFkX3NpZ25hbGVkX2V2ZW50IDwgMCkgewotICAgICAgICB3YWl0X2ZhaWxlZCA9IHRydWU7Ci0gICAgICAgIE5PVFJFQUNIRUQoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHdhaXQgPSBXQUlUX09CSkVDVF8wICsgKE1BWElNVU1fV0FJVF9PQkpFQ1RTIC0gMikgKwotICAgICAgICAgICAgICAgdGhyZWFkX3NpZ25hbGVkX2V2ZW50OwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICA6OlNldEV2ZW50KHN0b3ApOwotICAgIH0KLSAgICBiYXNlOjpQbGF0Zm9ybVRocmVhZDo6Sm9pbih0aHJlYWQpOwotICB9Ci0KLSAgaW50IHJldCA9IC0xOwotICBpZiAoIXdhaXRfZmFpbGVkKSB7Ci0gICAgLy8gU3VidHJhY3QgdG8gYmUgcG9saXRpY2FsbHkgY29ycmVjdCAoV0FJVF9PQkpFQ1RfMCBpcyBhY3R1YWxseSAwKS4KLSAgICB3YWl0IC09IFdBSVRfT0JKRUNUXzA7Ci0gICAgQk9PTCBvayA9IDo6UmVzZXRFdmVudChoYW5kbGVzW3dhaXRdKTsKLSAgICBDSEVDSyhvayk7Ci0gICAgcmV0ID0gKHdhaXQgKyB3YWl0X29mZnNldCkgJSBub3RpZmljYXRpb25zLnNpemUoKTsKLSAgICBEQ0hFQ0tfRVEoaGFuZGxlc1t3YWl0XSwgbm90aWZpY2F0aW9uc1tyZXRdLT5vdGhlcl8uR2V0KCkpOwotICB9IGVsc2UgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgfQotCi0gIENIRUNLX05FKHJldCwgLTEpOwotICByZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2Zha2VfYXVkaW9faW5wdXRfc3RyZWFtLmNjIGIvc3JjL21lZGlhL2F1ZGlvL2Zha2VfYXVkaW9faW5wdXRfc3RyZWFtLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmIxY2U5Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9mYWtlX2F1ZGlvX2lucHV0X3N0cmVhbS5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vZmFrZV9hdWRpb19pbnB1dF9zdHJlYW0uaCIKLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX21hbmFnZXJfYmFzZS5oIgotCi11c2luZyBiYXNlOjpUaW1lOwotdXNpbmcgYmFzZTo6VGltZURlbHRhOwotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1uYW1lc3BhY2UgewotCi0vLyBUaGVzZSB2YWx1ZXMgYXJlIGJhc2VkIG9uIGV4cGVyaW1lbnRzIGZvciBsb2NhbC10by1sb2NhbAotLy8gUGVlckNvbm5lY3Rpb24gdG8gZGVtb25zdHJhdGUgYXVkaW8vdmlkZW8gc3luY2hyb25pemF0aW9uLgotY29uc3QgaW50IGtCZWVwRHVyYXRpb25NaWxsaXNlY29uZHMgPSAyMDsKLWNvbnN0IGludCBrQmVlcEZyZXF1ZW5jeSA9IDQwMDsKLQotc3RydWN0IEJlZXBDb250ZXh0IHsKLSAgQmVlcENvbnRleHQoKSA6IGJlZXBfb25jZShmYWxzZSkge30KLSAgYmFzZTo6TG9jayBiZWVwX2xvY2s7Ci0gIGJvb2wgYmVlcF9vbmNlOwotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxCZWVwQ29udGV4dD4gZ19iZWVwX2NvbnRleHQgPQotICAgIExBWllfSU5TVEFOQ0VfSU5JVElBTElaRVI7Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1BdWRpb0lucHV0U3RyZWFtKiBGYWtlQXVkaW9JbnB1dFN0cmVhbTo6TWFrZUZha2VTdHJlYW0oCi0gICAgQXVkaW9NYW5hZ2VyQmFzZSogbWFuYWdlciwKLSAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcykgewotICByZXR1cm4gbmV3IEZha2VBdWRpb0lucHV0U3RyZWFtKG1hbmFnZXIsIHBhcmFtcyk7Ci19Ci0KLUZha2VBdWRpb0lucHV0U3RyZWFtOjpGYWtlQXVkaW9JbnB1dFN0cmVhbShBdWRpb01hbmFnZXJCYXNlKiBtYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKQotICAgIDogYXVkaW9fbWFuYWdlcl8obWFuYWdlciksCi0gICAgICBjYWxsYmFja18oTlVMTCksCi0gICAgICBidWZmZXJfc2l6ZV8oKHBhcmFtcy5jaGFubmVscygpICogcGFyYW1zLmJpdHNfcGVyX3NhbXBsZSgpICoKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmZyYW1lc19wZXJfYnVmZmVyKCkpIC8gOCksCi0gICAgICBwYXJhbXNfKHBhcmFtcyksCi0gICAgICB0aHJlYWRfKCJGYWtlQXVkaW9SZWNvcmRpbmdUaHJlYWQiKSwKLSAgICAgIGNhbGxiYWNrX2ludGVydmFsXyhiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoCi0gICAgICAgICAgKHBhcmFtcy5mcmFtZXNfcGVyX2J1ZmZlcigpICogMTAwMCkgLyBwYXJhbXMuc2FtcGxlX3JhdGUoKSkpLAotICAgICAgYmVlcF9kdXJhdGlvbl9pbl9idWZmZXJzXygKLSAgICAgICAgICBrQmVlcER1cmF0aW9uTWlsbGlzZWNvbmRzICogcGFyYW1zLnNhbXBsZV9yYXRlKCkgLwotICAgICAgICAgIHBhcmFtcy5mcmFtZXNfcGVyX2J1ZmZlcigpIC8gMTAwMCksCi0gICAgICBiZWVwX2dlbmVyYXRlZF9pbl9idWZmZXJzXygwKSwKLSAgICAgIGJlZXBfcGVyaW9kX2luX2ZyYW1lc18ocGFyYW1zLnNhbXBsZV9yYXRlKCkgLyBrQmVlcEZyZXF1ZW5jeSksCi0gICAgICBmcmFtZXNfZWxhcHNlZF8oMCkgewotfQotCi1GYWtlQXVkaW9JbnB1dFN0cmVhbTo6fkZha2VBdWRpb0lucHV0U3RyZWFtKCkge30KLQotYm9vbCBGYWtlQXVkaW9JbnB1dFN0cmVhbTo6T3BlbigpIHsKLSAgYnVmZmVyXy5yZXNldChuZXcgdWludDhbYnVmZmVyX3NpemVfXSk7Ci0gIG1lbXNldChidWZmZXJfLmdldCgpLCAwLCBidWZmZXJfc2l6ZV8pOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBGYWtlQXVkaW9JbnB1dFN0cmVhbTo6U3RhcnQoQXVkaW9JbnB1dENhbGxiYWNrKiBjYWxsYmFjaykgIHsKLSAgRENIRUNLKCF0aHJlYWRfLklzUnVubmluZygpKTsKLSAgY2FsbGJhY2tfID0gY2FsbGJhY2s7Ci0gIGxhc3RfY2FsbGJhY2tfdGltZV8gPSBUaW1lOjpOb3coKTsKLSAgdGhyZWFkXy5TdGFydCgpOwotICB0aHJlYWRfLm1lc3NhZ2VfbG9vcCgpLT5Qb3N0RGVsYXllZFRhc2soCi0gICAgICBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kKCZGYWtlQXVkaW9JbnB1dFN0cmVhbTo6RG9DYWxsYmFjaywgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICBjYWxsYmFja19pbnRlcnZhbF8pOwotfQotCi12b2lkIEZha2VBdWRpb0lucHV0U3RyZWFtOjpEb0NhbGxiYWNrKCkgewotICBEQ0hFQ0soY2FsbGJhY2tfKTsKLQotICBtZW1zZXQoYnVmZmVyXy5nZXQoKSwgMCwgYnVmZmVyX3NpemVfKTsKLQotICBib29sIHNob3VsZF9iZWVwID0gZmFsc2U7Ci0gIHsKLSAgICBCZWVwQ29udGV4dCogYmVlcF9jb250ZXh0ID0gZ19iZWVwX2NvbnRleHQuUG9pbnRlcigpOwotICAgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhiZWVwX2NvbnRleHQtPmJlZXBfbG9jayk7Ci0gICAgc2hvdWxkX2JlZXAgPSBiZWVwX2NvbnRleHQtPmJlZXBfb25jZTsKLSAgICBiZWVwX2NvbnRleHQtPmJlZXBfb25jZSA9IGZhbHNlOwotICB9Ci0KLSAgLy8gSWYgdGhpcyBvYmplY3Qgd2FzIGluc3RydWN0ZWQgdG8gZ2VuZXJhdGUgYSBiZWVwIG9yIGhhcyBzdGFydGVkIHRvCi0gIC8vIGdlbmVyYXRlIGEgYmVlcCBzb3VuZC4KLSAgaWYgKHNob3VsZF9iZWVwIHx8IGJlZXBfZ2VuZXJhdGVkX2luX2J1ZmZlcnNfKSB7Ci0gICAgLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBvdXRwdXQgaGlnaCB2YWx1ZS4gVGhlbiBjb21wdXRlIHRoZQotICAgIC8vIG51bWJlciBvZiBieXRlcyBiYXNlZCBvbiBjaGFubmVscyBhbmQgYml0cyBwZXIgY2hhbm5lbC4KLSAgICBpbnQgaGlnaF9mcmFtZXMgPSBiZWVwX3BlcmlvZF9pbl9mcmFtZXNfIC8gMjsKLSAgICBpbnQgaGlnaF9ieXRlcyA9IGhpZ2hfZnJhbWVzICogcGFyYW1zXy5iaXRzX3Blcl9zYW1wbGUoKSAqCi0gICAgICAgIHBhcmFtc18uY2hhbm5lbHMoKSAvIDg7Ci0KLSAgICAvLyBTZXBhcmF0ZSBoaWdoIGFuZCBsb3cgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgYnl0ZXMgdG8gZ2VuZXJhdGUgYQotICAgIC8vIHNxdWFyZSB3YXZlLgotICAgIGludCBwb3NpdGlvbiA9IDA7Ci0gICAgd2hpbGUgKHBvc2l0aW9uICsgaGlnaF9ieXRlcyA8PSBidWZmZXJfc2l6ZV8pIHsKLSAgICAgIC8vIFdyaXRlIGhpZ2ggdmFsdWVzIGZpcnN0LgotICAgICAgbWVtc2V0KGJ1ZmZlcl8uZ2V0KCkgKyBwb3NpdGlvbiwgMTI4LCBoaWdoX2J5dGVzKTsKLQotICAgICAgLy8gVGhlbiBsZWF2ZSBsb3cgdmFsdWVzIGluIHRoZSBidWZmZXIgd2l0aCB8aGlnaF9ieXRlc3wuCi0gICAgICBwb3NpdGlvbiArPSBoaWdoX2J5dGVzICogMjsKLSAgICB9Ci0KLSAgICArK2JlZXBfZ2VuZXJhdGVkX2luX2J1ZmZlcnNfOwotICAgIGlmIChiZWVwX2dlbmVyYXRlZF9pbl9idWZmZXJzXyA+PSBiZWVwX2R1cmF0aW9uX2luX2J1ZmZlcnNfKQotICAgICAgYmVlcF9nZW5lcmF0ZWRfaW5fYnVmZmVyc18gPSAwOwotICB9Ci0KLSAgY2FsbGJhY2tfLT5PbkRhdGEodGhpcywgYnVmZmVyXy5nZXQoKSwgYnVmZmVyX3NpemVfLCBidWZmZXJfc2l6ZV8sIDEuMCk7Ci0gIGZyYW1lc19lbGFwc2VkXyArPSBwYXJhbXNfLmZyYW1lc19wZXJfYnVmZmVyKCk7Ci0KLSAgVGltZSBub3cgPSBUaW1lOjpOb3coKTsKLSAgYmFzZTo6VGltZURlbHRhIG5leHRfY2FsbGJhY2tfdGltZSA9Ci0gICAgICBsYXN0X2NhbGxiYWNrX3RpbWVfICsgY2FsbGJhY2tfaW50ZXJ2YWxfICogMiAtIG5vdzsKLQotICAvLyBJZiB3ZSBhcmUgZmFsbGluZyBiZWhpbmQsIHRyeSB0byBjYXRjaCB1cCBhcyBtdWNoIGFzIHdlIGNhbiBpbiB0aGUgbmV4dAotICAvLyBjYWxsYmFjay4KLSAgaWYgKG5leHRfY2FsbGJhY2tfdGltZSA8IGJhc2U6OlRpbWVEZWx0YSgpKQotICAgIG5leHRfY2FsbGJhY2tfdGltZSA9IGJhc2U6OlRpbWVEZWx0YSgpOwotCi0gIGxhc3RfY2FsbGJhY2tfdGltZV8gPSBub3c7Ci0gIHRocmVhZF8ubWVzc2FnZV9sb29wKCktPlBvc3REZWxheWVkVGFzaygKLSAgICAgIEZST01fSEVSRSwKLSAgICAgIGJhc2U6OkJpbmQoJkZha2VBdWRpb0lucHV0U3RyZWFtOjpEb0NhbGxiYWNrLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgIG5leHRfY2FsbGJhY2tfdGltZSk7Ci19Ci0KLXZvaWQgRmFrZUF1ZGlvSW5wdXRTdHJlYW06OlN0b3AoKSB7Ci0gIHRocmVhZF8uU3RvcCgpOwotfQotCi12b2lkIEZha2VBdWRpb0lucHV0U3RyZWFtOjpDbG9zZSgpIHsKLSAgaWYgKGNhbGxiYWNrXykgewotICAgIGNhbGxiYWNrXy0+T25DbG9zZSh0aGlzKTsKLSAgICBjYWxsYmFja18gPSBOVUxMOwotICB9Ci0gIGF1ZGlvX21hbmFnZXJfLT5SZWxlYXNlSW5wdXRTdHJlYW0odGhpcyk7Ci19Ci0KLWRvdWJsZSBGYWtlQXVkaW9JbnB1dFN0cmVhbTo6R2V0TWF4Vm9sdW1lKCkgewotICByZXR1cm4gMS4wOwotfQotCi12b2lkIEZha2VBdWRpb0lucHV0U3RyZWFtOjpTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgewotfQotCi1kb3VibGUgRmFrZUF1ZGlvSW5wdXRTdHJlYW06OkdldFZvbHVtZSgpIHsKLSAgcmV0dXJuIDEuMDsKLX0KLQotdm9pZCBGYWtlQXVkaW9JbnB1dFN0cmVhbTo6U2V0QXV0b21hdGljR2FpbkNvbnRyb2woYm9vbCBlbmFibGVkKSB7fQotCi1ib29sIEZha2VBdWRpb0lucHV0U3RyZWFtOjpHZXRBdXRvbWF0aWNHYWluQ29udHJvbCgpIHsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBGYWtlQXVkaW9JbnB1dFN0cmVhbTo6QmVlcE9uY2UoKSB7Ci0gIEJlZXBDb250ZXh0KiBiZWVwX2NvbnRleHQgPSBnX2JlZXBfY29udGV4dC5Qb2ludGVyKCk7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhiZWVwX2NvbnRleHQtPmJlZXBfbG9jayk7Ci0gIGJlZXBfY29udGV4dC0+YmVlcF9vbmNlID0gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vZmFrZV9hdWRpb19pbnB1dF9zdHJlYW0uaCBiL3NyYy9tZWRpYS9hdWRpby9mYWtlX2F1ZGlvX2lucHV0X3N0cmVhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWUxYmE1Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9mYWtlX2F1ZGlvX2lucHV0X3N0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLS8vCi0vLyBBIGZha2UgaW1wbGVtZW50YXRpb24gb2YgQXVkaW9JbnB1dFN0cmVhbSwgdXNlZnVsIGZvciB0ZXN0aW5nIHB1cnBvc2UuCi0KLSNpZm5kZWYgTUVESUFfQVVESU9fRkFLRV9BVURJT19JTlBVVF9TVFJFQU1fSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fRkFLRV9BVURJT19JTk9VVF9TVFJFQU1fSF8KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi9sb2NrLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkLmgiCi0jaW5jbHVkZSAiYmFzZS90aW1lLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9faW8uaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19wYXJhbWV0ZXJzLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIEF1ZGlvTWFuYWdlckJhc2U7Ci0KLWNsYXNzIE1FRElBX0VYUE9SVCBGYWtlQXVkaW9JbnB1dFN0cmVhbQotICAgIDogcHVibGljIEF1ZGlvSW5wdXRTdHJlYW0gewotIHB1YmxpYzoKLSAgc3RhdGljIEF1ZGlvSW5wdXRTdHJlYW0qIE1ha2VGYWtlU3RyZWFtKEF1ZGlvTWFuYWdlckJhc2UqIG1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcyk7Ci0KLSAgdmlydHVhbCBib29sIE9wZW4oKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0YXJ0KEF1ZGlvSW5wdXRDYWxsYmFjayogY2FsbGJhY2spIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU3RvcCgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgQ2xvc2UoKSBPVkVSUklERTsKLSAgdmlydHVhbCBkb3VibGUgR2V0TWF4Vm9sdW1lKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgZG91YmxlIEdldFZvbHVtZSgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU2V0QXV0b21hdGljR2FpbkNvbnRyb2woYm9vbCBlbmFibGVkKSBPVkVSUklERTsKLSAgdmlydHVhbCBib29sIEdldEF1dG9tYXRpY0dhaW5Db250cm9sKCkgT1ZFUlJJREU7Ci0KLSAgLy8gR2VuZXJhdGUgb25lIGJlZXAgc291bmQuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieQotICAvLyBGYWtlVmlkZW9DYXB0dXJlRGV2aWNlIHRvIHRlc3QgYXVkaW8vdmlkZW8gc3luY2hyb25pemF0aW9uLgotICAvLyBUaGlzIGlzIGEgc3RhdGljIG1ldGhvZCBiZWNhdXNlIEZha2VWaWRlb0NhcHR1cmVEZXZpY2UgaXMKLSAgLy8gZGlzY29ubmVjdGVkIGZyb20gYW4gYXVkaW8gZGV2aWNlLiBUaGlzIG1lYW5zIG9ubHkgb25lIGluc3RhbmNlIG9mCi0gIC8vIHRoaXMgY2xhc3MgZ2V0cyB0byByZXNwb25kLCB3aGljaCBpcyBva2F5IGJlY2F1c2Ugd2UgYXNzdW1lIHRoZXJlJ3MKLSAgLy8gb25seSBvbmUgc3RyZWFtIGZvciB0aGlzIHRlc3RpbmcgcHVycG9zZS4KLSAgLy8gVE9ETyhoY2xhbSk6IE1ha2UgdGhpcyBub24tc3RhdGljLiBUbyBkbyB0aGlzIHdlJ2xsIG5lZWQgdG8gZml4Ci0gIC8vIGNyYnVnLmNvbS8xNTkwNTMgc3VjaCB0aGF0IHZpZGVvIGNhcHR1cmUgZGV2aWNlIGlzIGF3YXJlIG9mIGF1ZGlvCi0gIC8vIGlucHV0IHN0cmVhbS4KLSAgc3RhdGljIHZvaWQgQmVlcE9uY2UoKTsKLQotIHByaXZhdGU6Ci0gIEZha2VBdWRpb0lucHV0U3RyZWFtKEF1ZGlvTWFuYWdlckJhc2UqIG1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKTsKLQotICB2aXJ0dWFsIH5GYWtlQXVkaW9JbnB1dFN0cmVhbSgpOwotCi0gIHZvaWQgRG9DYWxsYmFjaygpOwotCi0gIEF1ZGlvTWFuYWdlckJhc2UqIGF1ZGlvX21hbmFnZXJfOwotICBBdWRpb0lucHV0Q2FsbGJhY2sqIGNhbGxiYWNrXzsKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiBidWZmZXJfOwotICBpbnQgYnVmZmVyX3NpemVfOwotICBBdWRpb1BhcmFtZXRlcnMgcGFyYW1zXzsKLSAgYmFzZTo6VGhyZWFkIHRocmVhZF87Ci0gIGJhc2U6OlRpbWUgbGFzdF9jYWxsYmFja190aW1lXzsKLSAgYmFzZTo6VGltZURlbHRhIGNhbGxiYWNrX2ludGVydmFsXzsKLSAgaW50IGJlZXBfZHVyYXRpb25faW5fYnVmZmVyc187Ci0gIGludCBiZWVwX2dlbmVyYXRlZF9pbl9idWZmZXJzXzsKLSAgaW50IGJlZXBfcGVyaW9kX2luX2ZyYW1lc187Ci0gIGludCBmcmFtZXNfZWxhcHNlZF87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEZha2VBdWRpb0lucHV0U3RyZWFtKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0FVRElPX0ZBS0VfQVVESU9fSU5QVVRfU1RSRUFNX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vZmFrZV9hdWRpb19vdXRwdXRfc3RyZWFtLmNjIGIvc3JjL21lZGlhL2F1ZGlvL2Zha2VfYXVkaW9fb3V0cHV0X3N0cmVhbS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIxMDI2ZC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vZmFrZV9hdWRpb19vdXRwdXRfc3RyZWFtLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2Zha2VfYXVkaW9fb3V0cHV0X3N0cmVhbS5oIgotCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiYmFzZS9iaW5kX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX21hbmFnZXJfYmFzZS5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBzdGF0aWMKLUF1ZGlvT3V0cHV0U3RyZWFtKiBGYWtlQXVkaW9PdXRwdXRTdHJlYW06Ok1ha2VGYWtlU3RyZWFtKAotICAgIEF1ZGlvTWFuYWdlckJhc2UqIG1hbmFnZXIsIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKSB7Ci0gIHJldHVybiBuZXcgRmFrZUF1ZGlvT3V0cHV0U3RyZWFtKG1hbmFnZXIsIHBhcmFtcyk7Ci19Ci0KLUZha2VBdWRpb091dHB1dFN0cmVhbTo6RmFrZUF1ZGlvT3V0cHV0U3RyZWFtKEF1ZGlvTWFuYWdlckJhc2UqIG1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcykKLSAgICA6IGF1ZGlvX21hbmFnZXJfKG1hbmFnZXIpLAotICAgICAgY2FsbGJhY2tfKE5VTEwpLAotICAgICAgYXVkaW9fYnVzXyhBdWRpb0J1czo6Q3JlYXRlKHBhcmFtcykpLAotICAgICAgZnJhbWVzX3Blcl9taWxsaXNlY29uZF8oCi0gICAgICAgICAgcGFyYW1zLnNhbXBsZV9yYXRlKCkgLyBzdGF0aWNfY2FzdDxmbG9hdD4oCi0gICAgICAgICAgICAgIGJhc2U6OlRpbWU6OmtNaWxsaXNlY29uZHNQZXJTZWNvbmQpKSB7Ci19Ci0KLUZha2VBdWRpb091dHB1dFN0cmVhbTo6fkZha2VBdWRpb091dHB1dFN0cmVhbSgpIHsKLSAgRENIRUNLKCFjYWxsYmFja18pOwotfQotCi1ib29sIEZha2VBdWRpb091dHB1dFN0cmVhbTo6T3BlbigpIHsKLSAgRENIRUNLKGF1ZGlvX21hbmFnZXJfLT5HZXRNZXNzYWdlTG9vcCgpLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBGYWtlQXVkaW9PdXRwdXRTdHJlYW06OlN0YXJ0KEF1ZGlvU291cmNlQ2FsbGJhY2sqIGNhbGxiYWNrKSAgewotICBEQ0hFQ0soYXVkaW9fbWFuYWdlcl8tPkdldE1lc3NhZ2VMb29wKCktPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIGNhbGxiYWNrXyA9IGNhbGxiYWNrOwotICBvbl9tb3JlX2RhdGFfY2JfLlJlc2V0KGJhc2U6OkJpbmQoCi0gICAgICAmRmFrZUF1ZGlvT3V0cHV0U3RyZWFtOjpPbk1vcmVEYXRhVGFzaywgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICBhdWRpb19tYW5hZ2VyXy0+R2V0TWVzc2FnZUxvb3AoKS0+UG9zdFRhc2soCi0gICAgICBGUk9NX0hFUkUsIG9uX21vcmVfZGF0YV9jYl8uY2FsbGJhY2soKSk7Ci19Ci0KLXZvaWQgRmFrZUF1ZGlvT3V0cHV0U3RyZWFtOjpTdG9wKCkgewotICBEQ0hFQ0soYXVkaW9fbWFuYWdlcl8tPkdldE1lc3NhZ2VMb29wKCktPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIGNhbGxiYWNrXyA9IE5VTEw7Ci0gIG9uX21vcmVfZGF0YV9jYl8uQ2FuY2VsKCk7Ci19Ci0KLXZvaWQgRmFrZUF1ZGlvT3V0cHV0U3RyZWFtOjpDbG9zZSgpIHsKLSAgRENIRUNLKCFjYWxsYmFja18pOwotICBEQ0hFQ0soYXVkaW9fbWFuYWdlcl8tPkdldE1lc3NhZ2VMb29wKCktPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIGF1ZGlvX21hbmFnZXJfLT5SZWxlYXNlT3V0cHV0U3RyZWFtKHRoaXMpOwotfQotCi12b2lkIEZha2VBdWRpb091dHB1dFN0cmVhbTo6U2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpIHt9OwotCi12b2lkIEZha2VBdWRpb091dHB1dFN0cmVhbTo6R2V0Vm9sdW1lKGRvdWJsZSogdm9sdW1lKSB7Ci0gICp2b2x1bWUgPSAwOwotfTsKLQotdm9pZCBGYWtlQXVkaW9PdXRwdXRTdHJlYW06Ok9uTW9yZURhdGFUYXNrKCkgewotICBEQ0hFQ0soYXVkaW9fbWFuYWdlcl8tPkdldE1lc3NhZ2VMb29wKCktPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIERDSEVDSyhjYWxsYmFja18pOwotCi0gIGF1ZGlvX2J1c18tPlplcm8oKTsKLSAgaW50IGZyYW1lc19yZWNlaXZlZCA9IGNhbGxiYWNrXy0+T25Nb3JlRGF0YSgKLSAgICAgIGF1ZGlvX2J1c18uZ2V0KCksIEF1ZGlvQnVmZmVyc1N0YXRlKCkpOwotCi0gIC8vIENhbGN1bGF0ZSBvdXIgc2xlZXAgZHVyYXRpb24gZm9yIHNpbXVsYXRlZCBwbGF5YmFjay4gIFNsZWVwIGZvciBhdCBsZWFzdAotICAvLyBvbmUgbWlsbGlzZWNvbmQgc28gd2UgZG9uJ3Qgc3BpbiB0aGUgQ1BVLgotICBhdWRpb19tYW5hZ2VyXy0+R2V0TWVzc2FnZUxvb3AoKS0+UG9zdERlbGF5ZWRUYXNrKAotICAgICAgRlJPTV9IRVJFLCBvbl9tb3JlX2RhdGFfY2JfLmNhbGxiYWNrKCksIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygKLSAgICAgICAgICBzdGQ6Om1heCgxLjBmLCBmcmFtZXNfcmVjZWl2ZWQgLyBmcmFtZXNfcGVyX21pbGxpc2Vjb25kXykpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vZmFrZV9hdWRpb19vdXRwdXRfc3RyZWFtLmggYi9zcmMvbWVkaWEvYXVkaW8vZmFrZV9hdWRpb19vdXRwdXRfc3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxODhiOWYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2Zha2VfYXVkaW9fb3V0cHV0X3N0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9BVURJT19GQUtFX0FVRElPX09VVFBVVF9TVFJFQU1fSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fRkFLRV9BVURJT19PVVRPVVRfU1RSRUFNX0hfCi0KLSNpbmNsdWRlICJiYXNlL2NhbmNlbGFibGVfY2FsbGJhY2suaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9faW8uaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19wYXJhbWV0ZXJzLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIEF1ZGlvTWFuYWdlckJhc2U7Ci0KLS8vIEEgZmFrZSBpbXBsZW1lbnRhdGlvbiBvZiBBdWRpb091dHB1dFN0cmVhbS4gIFVzZWQgZm9yIHRlc3RpbmcgYW5kIHdoZW4gYSByZWFsCi0vLyBhdWRpbyBvdXRwdXQgZGV2aWNlIGlzIHVuYXZhaWxhYmxlIG9yIHJlZnVzaW5nIG91dHB1dCAoZS5nLiByZW1vdGUgZGVza3RvcCkuCi1jbGFzcyBNRURJQV9FWFBPUlQgRmFrZUF1ZGlvT3V0cHV0U3RyZWFtIDogcHVibGljIEF1ZGlvT3V0cHV0U3RyZWFtIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBBdWRpb091dHB1dFN0cmVhbSogTWFrZUZha2VTdHJlYW0oQXVkaW9NYW5hZ2VyQmFzZSogbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcyk7Ci0KLSAgLy8gQXVkaW9PdXRwdXRTdHJlYW0gaW1wbGVtZW50YXRpb24uCi0gIHZpcnR1YWwgYm9vbCBPcGVuKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTdGFydChBdWRpb1NvdXJjZUNhbGxiYWNrKiBjYWxsYmFjaykgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTdG9wKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBHZXRWb2x1bWUoZG91YmxlKiB2b2x1bWUpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgQ2xvc2UoKSBPVkVSUklERTsKLQotIHByaXZhdGU6Ci0gIEZha2VBdWRpb091dHB1dFN0cmVhbShBdWRpb01hbmFnZXJCYXNlKiBtYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpOwotICB2aXJ0dWFsIH5GYWtlQXVkaW9PdXRwdXRTdHJlYW0oKTsKLQotICAvLyBUYXNrIHRoYXQgcmVndWxhcmx5IGNhbGxzIHxjYWxsYmFja18tPk9uTW9yZURhdGEoKXwgYWNjb3JkaW5nIHRvIHRoZQotICAvLyBwbGF5YmFjayByYXRlIGFzIGRldGVybWluZWQgYnkgdGhlIGF1ZGlvIHBhcmFtZXRlcnMgZ2l2ZW4gZHVyaW5nCi0gIC8vIGNvbnN0cnVjdGlvbi4gIFJ1bnMgb24gQXVkaW9NYW5hZ2VyJ3MgbWVzc2FnZSBsb29wLgotICB2b2lkIE9uTW9yZURhdGFUYXNrKCk7Ci0KLSAgQXVkaW9NYW5hZ2VyQmFzZSogYXVkaW9fbWFuYWdlcl87Ci0gIEF1ZGlvU291cmNlQ2FsbGJhY2sqIGNhbGxiYWNrXzsKLSAgc2NvcGVkX3B0cjxBdWRpb0J1cz4gYXVkaW9fYnVzXzsKLSAgZmxvYXQgZnJhbWVzX3Blcl9taWxsaXNlY29uZF87Ci0KLSAgLy8gVXNlZCB0byBwb3N0IGRlbGF5ZWQgdGFza3MgdG8gdGhlIEF1ZGlvVGhyZWFkIHRoYXQgd2UgY2FuIGNhbmNlbC4KLSAgYmFzZTo6Q2FuY2VsYWJsZUNsb3N1cmUgb25fbW9yZV9kYXRhX2NiXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRmFrZUF1ZGlvT3V0cHV0U3RyZWFtKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0FVRElPX0ZBS0VfQVVESU9fT1VUUFVUX1NUUkVBTV9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2Zha2VfYXVkaW9fb3V0cHV0X3N0cmVhbV91bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9hdWRpby9mYWtlX2F1ZGlvX291dHB1dF9zdHJlYW1fdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MzhlM2YuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2Zha2VfYXVkaW9fb3V0cHV0X3N0cmVhbV91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi93YWl0YWJsZV9ldmVudC5oIgotI2luY2x1ZGUgImJhc2UvdGltZS5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2Zha2VfYXVkaW9fb3V0cHV0X3N0cmVhbS5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX21hbmFnZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9zaW1wbGVfc291cmNlcy5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBGYWtlQXVkaW9PdXRwdXRTdHJlYW1UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgRmFrZUF1ZGlvT3V0cHV0U3RyZWFtVGVzdCgpCi0gICAgICA6IGF1ZGlvX21hbmFnZXJfKEF1ZGlvTWFuYWdlcjo6Q3JlYXRlKCkpLAotICAgICAgICBwYXJhbXNfKAotICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19GQUtFLCBDSEFOTkVMX0xBWU9VVF9TVEVSRU8sIDgwMDAsIDgsIDEyOCksCi0gICAgICAgIHNvdXJjZV8ocGFyYW1zXy5jaGFubmVscygpLCAyMDAuMCwgcGFyYW1zXy5zYW1wbGVfcmF0ZSgpKSwKLSAgICAgICAgZG9uZV8oZmFsc2UsIGZhbHNlKSB7Ci0gICAgc3RyZWFtXyA9IGF1ZGlvX21hbmFnZXJfLT5NYWtlQXVkaW9PdXRwdXRTdHJlYW0oQXVkaW9QYXJhbWV0ZXJzKHBhcmFtc18pKTsKLSAgICBDSEVDSyhzdHJlYW1fKTsKLQotICAgIHRpbWVfYmV0d2Vlbl9jYWxsYmFja3NfID0gYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKAotICAgICAgICBwYXJhbXNfLmZyYW1lc19wZXJfYnVmZmVyKCkgKiBiYXNlOjpUaW1lOjprTWlsbGlzZWNvbmRzUGVyU2Vjb25kIC8KLSAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHBhcmFtc18uc2FtcGxlX3JhdGUoKSkpOwotICB9Ci0KLSAgdmlydHVhbCB+RmFrZUF1ZGlvT3V0cHV0U3RyZWFtVGVzdCgpIHt9Ci0KLSAgdm9pZCBSdW5PbkF1ZGlvVGhyZWFkKCkgewotICAgIEFTU0VSVF9UUlVFKGF1ZGlvX21hbmFnZXJfLT5HZXRNZXNzYWdlTG9vcCgpLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICAgIEFTU0VSVF9UUlVFKHN0cmVhbV8tPk9wZW4oKSk7Ci0gICAgc3RyZWFtXy0+U3RhcnQoJnNvdXJjZV8pOwotICB9Ci0KLSAgdm9pZCBSdW5PbmNlT25BdWRpb1RocmVhZCgpIHsKLSAgICBBU1NFUlRfVFJVRShhdWRpb19tYW5hZ2VyXy0+R2V0TWVzc2FnZUxvb3AoKS0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgICBSdW5PbkF1ZGlvVGhyZWFkKCk7Ci0gICAgLy8gU3RhcnQoKSBzaG91bGQgaW1tZWRpYXRlbHkgcG9zdCBhIHRhc2sgdG8gcnVuIHRoZSBzb3VyY2UgY2FsbGJhY2ssIHNvIHdlCi0gICAgLy8gc2hvdWxkIGVuZCB1cCB3aXRoIG9ubHkgYSBzaW5nbGUgY2FsbGJhY2sgYmVpbmcgcnVuLgotICAgIGF1ZGlvX21hbmFnZXJfLT5HZXRNZXNzYWdlTG9vcCgpLT5Qb3N0VGFzayhGUk9NX0hFUkUsIGJhc2U6OkJpbmQoCi0gICAgICAgICZGYWtlQXVkaW9PdXRwdXRTdHJlYW1UZXN0OjpFbmRUZXN0LCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLCAxKSk7Ci0gIH0KLQotICB2b2lkIFN0b3BTdGFydE9uQXVkaW9UaHJlYWQoKSB7Ci0gICAgQVNTRVJUX1RSVUUoYXVkaW9fbWFuYWdlcl8tPkdldE1lc3NhZ2VMb29wKCktPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gICAgc3RyZWFtXy0+U3RvcCgpOwotICAgIHN0cmVhbV8tPlN0YXJ0KCZzb3VyY2VfKTsKLSAgfQotCi0gIHZvaWQgVGltZUNhbGxiYWNrc09uQXVkaW9UaHJlYWQoaW50IGNhbGxiYWNrcykgewotICAgIEFTU0VSVF9UUlVFKGF1ZGlvX21hbmFnZXJfLT5HZXRNZXNzYWdlTG9vcCgpLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotCi0gICAgaWYgKHNvdXJjZV8uY2FsbGJhY2tzKCkgPT0gMCkgewotICAgICAgUnVuT25BdWRpb1RocmVhZCgpOwotICAgICAgc3RhcnRfdGltZV8gPSBiYXNlOjpUaW1lOjpOb3coKTsKLSAgICB9Ci0KLSAgICAvLyBLZWVwIGdvaW5nIHVudGlsIHdlJ3ZlIHNlZW4gdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgY2FsbGJhY2tzLgotICAgIGlmIChzb3VyY2VfLmNhbGxiYWNrcygpIDwgY2FsbGJhY2tzKSB7Ci0gICAgICBhdWRpb19tYW5hZ2VyXy0+R2V0TWVzc2FnZUxvb3AoKS0+UG9zdERlbGF5ZWRUYXNrKEZST01fSEVSRSwgYmFzZTo6QmluZCgKLSAgICAgICAgICAmRmFrZUF1ZGlvT3V0cHV0U3RyZWFtVGVzdDo6VGltZUNhbGxiYWNrc09uQXVkaW9UaHJlYWQsCi0gICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwgY2FsbGJhY2tzKSwgdGltZV9iZXR3ZWVuX2NhbGxiYWNrc18pOwotICAgIH0gZWxzZSB7Ci0gICAgICBhdWRpb19tYW5hZ2VyXy0+R2V0TWVzc2FnZUxvb3AoKS0+UG9zdFRhc2soRlJPTV9IRVJFLCBiYXNlOjpCaW5kKAotICAgICAgICAgICZGYWtlQXVkaW9PdXRwdXRTdHJlYW1UZXN0OjpFbmRUZXN0LCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLAotICAgICAgICAgIGNhbGxiYWNrcykpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgRW5kVGVzdChpbnQgY2FsbGJhY2tzKSB7Ci0gICAgQVNTRVJUX1RSVUUoYXVkaW9fbWFuYWdlcl8tPkdldE1lc3NhZ2VMb29wKCktPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gICAgc3RyZWFtXy0+U3RvcCgpOwotICAgIHN0cmVhbV8tPkNsb3NlKCk7Ci0gICAgRVhQRUNUX0VRKGNhbGxiYWNrcywgc291cmNlXy5jYWxsYmFja3MoKSk7Ci0gICAgRVhQRUNUX0VRKDAsIHNvdXJjZV8uZXJyb3JzKCkpOwotICAgIGRvbmVfLlNpZ25hbCgpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHNjb3BlZF9wdHI8QXVkaW9NYW5hZ2VyPiBhdWRpb19tYW5hZ2VyXzsKLSAgQXVkaW9QYXJhbWV0ZXJzIHBhcmFtc187Ci0gIEF1ZGlvT3V0cHV0U3RyZWFtKiBzdHJlYW1fOwotICBTaW5lV2F2ZUF1ZGlvU291cmNlIHNvdXJjZV87Ci0gIGJhc2U6OldhaXRhYmxlRXZlbnQgZG9uZV87Ci0gIGJhc2U6OlRpbWUgc3RhcnRfdGltZV87Ci0gIGJhc2U6OlRpbWVEZWx0YSB0aW1lX2JldHdlZW5fY2FsbGJhY2tzXzsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihGYWtlQXVkaW9PdXRwdXRTdHJlYW1UZXN0KTsKLX07Ci0KLS8vIEVuc3VyZSB0aGUgZmFrZSBhdWRpbyBzdHJlYW0gcnVucyBvbiB0aGUgYXVkaW8gdGhyZWFkIGFuZCBoYW5kbGVzIGZpcmVzCi0vLyBjYWxsYmFja3MgdG8gdGhlIEF1ZGlvU291cmNlQ2FsbGJhY2suCi1URVNUX0YoRmFrZUF1ZGlvT3V0cHV0U3RyZWFtVGVzdCwgRmFrZVN0cmVhbUJhc2ljQ2FsbGJhY2spIHsKLSAgYXVkaW9fbWFuYWdlcl8tPkdldE1lc3NhZ2VMb29wKCktPlBvc3RUYXNrKEZST01fSEVSRSwgYmFzZTo6QmluZCgKLSAgICAgICZGYWtlQXVkaW9PdXRwdXRTdHJlYW1UZXN0OjpSdW5PbmNlT25BdWRpb1RocmVhZCwKLSAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLSAgZG9uZV8uV2FpdCgpOwotfQotCi0vLyBFbnN1cmUgdGhlIHRpbWUgYmV0d2VlbiBjYWxsYmFja3MgaXMgc2FuZS4KLVRFU1RfRihGYWtlQXVkaW9PdXRwdXRTdHJlYW1UZXN0LCBUaW1lQmV0d2VlbkNhbGxiYWNrcykgewotICBzdGF0aWMgY29uc3QgaW50IGtUZXN0Q2FsbGJhY2tzID0gNTsKLQotICBhdWRpb19tYW5hZ2VyXy0+R2V0TWVzc2FnZUxvb3AoKS0+UG9zdFRhc2soRlJPTV9IRVJFLCBiYXNlOjpCaW5kKAotICAgICAgJkZha2VBdWRpb091dHB1dFN0cmVhbVRlc3Q6OlRpbWVDYWxsYmFja3NPbkF1ZGlvVGhyZWFkLAotICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwga1Rlc3RDYWxsYmFja3MpKTsKLQotICAvLyBMZXQgdGhlIGxvb3AgcnVuIGZvciBhIHNlY29uZCBvciB0d28gdGhlbiBpc3N1ZSBTdG9wKCkgLyBTdGFydCgpLgotICBhdWRpb19tYW5hZ2VyXy0+R2V0TWVzc2FnZUxvb3AoKS0+UG9zdERlbGF5ZWRUYXNrKEZST01fSEVSRSwgYmFzZTo6QmluZCgKLSAgICAgICZGYWtlQXVkaW9PdXRwdXRTdHJlYW1UZXN0OjpTdG9wU3RhcnRPbkF1ZGlvVGhyZWFkLAotICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksIHRpbWVfYmV0d2Vlbl9jYWxsYmFja3NfKTsKLQotICBkb25lXy5XYWl0KCk7Ci0KLSAgYmFzZTo6VGltZURlbHRhIGVsYXBzZWQgPSBiYXNlOjpUaW1lOjpOb3coKSAtIHN0YXJ0X3RpbWVfOwotCi0gIC8vIFRoZXJlIGFyZSBvbmx5IChrVGVzdENhbGxiYWNrcyAtIDEpIGludGVydmFscyBiZXR3ZWVuIGtUZXN0Q2FsbGJhY2tzLgotICBmbG9hdCBhY3R1YWxfdGltZV9iZXR3ZWVuX2NhbGxiYWNrc19tcyA9Ci0gICAgICBlbGFwc2VkLkluTWlsbGlzZWNvbmRzRigpIC8gKGtUZXN0Q2FsbGJhY2tzIC0gMSk7Ci0gIGZsb2F0IGV4cGVjdGVkX3RpbWVfYmV0d2Vlbl9jYWxsYmFja3NfbXMgPQotICAgICAgdGltZV9iZXR3ZWVuX2NhbGxiYWNrc18uSW5NaWxsaXNlY29uZHNGKCk7Ci0KLSAgLy8gRW5zdXJlIGNhbGxiYWNrIHRpbWUgaXMgbm8gZmFzdGVyIHRoYW4gdGhlIGV4cGVjdGVkIHRpbWUgYmV0d2VlbiBjYWxsYmFja3MuCi0gIEVYUEVDVF9HRShhY3R1YWxfdGltZV9iZXR3ZWVuX2NhbGxiYWNrc19tcywKLSAgICAgICAgICAgIGV4cGVjdGVkX3RpbWVfYmV0d2Vlbl9jYWxsYmFja3NfbXMpOwotCi0gIC8vIFNvZnRseSBjaGVjayBpZiB0aGUgY2FsbGJhY2sgdGltZSBpcyBubyBzbG93ZXIgdGhhbiB0d2ljZSB0aGUgZXhwZWN0ZWQgdGltZQotICAvLyBiZXR3ZWVuIGNhbGxiYWNrcy4gIFNpbmNlIHRoaXMgdGVzdCBydW5zIG9uIHRoZSBib3RzIHdlIGNhbid0IGJlIHRvbyBzdHJpY3QKLSAgLy8gd2l0aCB0aGUgYm91bmRzLgotICBpZiAoYWN0dWFsX3RpbWVfYmV0d2Vlbl9jYWxsYmFja3NfbXMgPiAyICogZXhwZWN0ZWRfdGltZV9iZXR3ZWVuX2NhbGxiYWNrc19tcykKLSAgICBMT0coRVJST1IpIDw8ICJUaW1lIGJldHdlZW4gZmFrZSBhdWRpbyBjYWxsYmFja3MgaXMgdG9vIGxhcmdlISI7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2lvcy9hdWRpb19tYW5hZ2VyX2lvcy5oIGIvc3JjL21lZGlhL2F1ZGlvL2lvcy9hdWRpb19tYW5hZ2VyX2lvcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWNiZTZlLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9pb3MvYXVkaW9fbWFuYWdlcl9pb3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9BVURJT19JT1NfQVVESU9fTUFOQUdFUl9JT1NfSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fSU9TX0FVRElPX01BTkFHRVJfSU9TX0hfCi0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19tYW5hZ2VyX2Jhc2UuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgUENNUXVldWVJbkF1ZGlvSW5wdXRTdHJlYW07Ci1jbGFzcyBQQ01RdWV1ZU91dEF1ZGlvT3V0cHV0U3RyZWFtOwotCi0vLyBpT1MgaW1wbGVtZW50YXRpb24gb2YgdGhlIEF1ZGlvTWFuYWdlciBzaW5nbGV0b24uIFN1cHBvcnRzIG9ubHkgYXVkaW8gaW5wdXQuCi1jbGFzcyBNRURJQV9FWFBPUlQgQXVkaW9NYW5hZ2VySU9TIDogcHVibGljIEF1ZGlvTWFuYWdlckJhc2UgewotIHB1YmxpYzoKLSAgQXVkaW9NYW5hZ2VySU9TKCk7Ci0KLSAgLy8gSW1wbGVtZW50YXRpb24gb2YgQXVkaW9NYW5hZ2VyLgotICB2aXJ0dWFsIGJvb2wgSGFzQXVkaW9PdXRwdXREZXZpY2VzKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgYm9vbCBIYXNBdWRpb0lucHV0RGV2aWNlcygpIE9WRVJSSURFOwotICB2aXJ0dWFsIEF1ZGlvT3V0cHV0U3RyZWFtKiBNYWtlQXVkaW9PdXRwdXRTdHJlYW0oCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcykgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgQXVkaW9JbnB1dFN0cmVhbSogTWFrZUF1ZGlvSW5wdXRTdHJlYW0oCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCkgT1ZFUlJJREU7Ci0KLSAgLy8gSW1wbGVtZW50YXRpb24gb2YgQXVkaW9NYW5hZ2VyQmFzZS4KLSAgdmlydHVhbCBBdWRpb091dHB1dFN0cmVhbSogTWFrZUxpbmVhck91dHB1dFN0cmVhbSgKLSAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKSBPVkVSUklERTsKLSAgdmlydHVhbCBBdWRpb091dHB1dFN0cmVhbSogTWFrZUxvd0xhdGVuY3lPdXRwdXRTdHJlYW0oCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcykgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgQXVkaW9JbnB1dFN0cmVhbSogTWFrZUxpbmVhcklucHV0U3RyZWFtKAotICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfaWQpIE9WRVJSSURFOwotICB2aXJ0dWFsIEF1ZGlvSW5wdXRTdHJlYW0qIE1ha2VMb3dMYXRlbmN5SW5wdXRTdHJlYW0oCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBSZWxlYXNlT3V0cHV0U3RyZWFtKEF1ZGlvT3V0cHV0U3RyZWFtKiBzdHJlYW0pIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgUmVsZWFzZUlucHV0U3RyZWFtKEF1ZGlvSW5wdXRTdHJlYW0qIHN0cmVhbSkgT1ZFUlJJREU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgfkF1ZGlvTWFuYWdlcklPUygpOwotCi0gcHJpdmF0ZToKLSAgLy8gSW5pdGlhbGl6ZXMgdGhlIGF1ZGlvIHNlc3Npb24gaWYgbmVjZXNzYXJ5LiBTYWZlIHRvIGNhbGwgbXVsdGlwbGUgdGltZXMuCi0gIC8vIFJldHVybnMgYSBib29sIGluZGljYXRpbmcgd2hldGhlciB0aGUgYXVkaW8gc2Vzc2lvbiBoYXMgYmVlbiBzdWNjZXNzZnVsbHkKLSAgLy8gaW5pdGlhbGl6ZWQgKGVpdGhlciBpbiB0aGUgY3VycmVudCBjYWxsIG9yIGluIGEgcHJldmlvdXMgY2FsbCkuCi0gIGJvb2wgSW5pdEF1ZGlvU2Vzc2lvbigpOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBdWRpb01hbmFnZXJJT1MpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQVVESU9fSU9TX0FVRElPX01BTkFHRVJfSU9TX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vaW9zL2F1ZGlvX21hbmFnZXJfaW9zLm1tIGIvc3JjL21lZGlhL2F1ZGlvL2lvcy9hdWRpb19tYW5hZ2VyX2lvcy5tbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmZmZmNS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vaW9zL2F1ZGlvX21hbmFnZXJfaW9zLm1tCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2lvcy9hdWRpb19tYW5hZ2VyX2lvcy5oIgotCi0jaW1wb3J0IDxBdWRpb1Rvb2xib3gvQXVkaW9Ub29sYm94Lmg+Ci0jaW1wb3J0IDxBVkZvdW5kYXRpb24vQVZGb3VuZGF0aW9uLmg+Ci0KLSNpbmNsdWRlICJiYXNlL3N5c19pbmZvLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vZmFrZV9hdWRpb19pbnB1dF9zdHJlYW0uaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9tYWMvYXVkaW9faW5wdXRfbWFjLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9saW1pdHMuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotZW51bSB7IGtNYXhJbnB1dENoYW5uZWxzID0gMiB9OwotCi0vLyBJbml0aWFsaXplcyB0aGUgYXVkaW8gc2Vzc2lvbiwgcmV0dXJuaW5nIGEgYm9vbCBpbmRpY2F0aW5nIHdoZXRoZXIKLS8vIGluaXRpYWxpemF0aW9uIHdhcyBzdWNjZXNzZnVsLiBTaG91bGQgb25seSBiZSBjYWxsZWQgb25jZS4KLXN0YXRpYyBib29sIEluaXRBdWRpb1Nlc3Npb25JbnRlcm5hbCgpIHsKLSAgT1NTdGF0dXMgZXJyb3IgPSBBdWRpb1Nlc3Npb25Jbml0aWFsaXplKE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwotICBEQ0hFQ0soZXJyb3IgIT0ga0F1ZGlvU2Vzc2lvbkFscmVhZHlJbml0aWFsaXplZCk7Ci0gIEFWQXVkaW9TZXNzaW9uKiBhdWRpb1Nlc3Npb24gPSBbQVZBdWRpb1Nlc3Npb24gc2hhcmVkSW5zdGFuY2VdOwotICBCT09MIHJlc3VsdCA9IFthdWRpb1Nlc3Npb24gc2V0Q2F0ZWdvcnk6QVZBdWRpb1Nlc3Npb25DYXRlZ29yeVBsYXlBbmRSZWNvcmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOm5pbF07Ci0gIERDSEVDSyhyZXN1bHQpOwotICBVSW50MzIgYWxsb3dNaXhpbmcgPSB0cnVlOwotICBBdWRpb1Nlc3Npb25TZXRQcm9wZXJ0eShrQXVkaW9TZXNzaW9uUHJvcGVydHlfT3ZlcnJpZGVDYXRlZ29yeU1peFdpdGhPdGhlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhbGxvd01peGluZyksICZhbGxvd01peGluZyk7Ci0gIHJldHVybiBlcnJvciA9PSBrQXVkaW9TZXNzaW9uTm9FcnJvcjsKLX0KLQotQXVkaW9NYW5hZ2VySU9TOjpBdWRpb01hbmFnZXJJT1MoKSB7Ci19Ci0KLUF1ZGlvTWFuYWdlcklPUzo6fkF1ZGlvTWFuYWdlcklPUygpIHsKLSAgU2h1dGRvd24oKTsKLX0KLQotYm9vbCBBdWRpb01hbmFnZXJJT1M6Okhhc0F1ZGlvT3V0cHV0RGV2aWNlcygpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEF1ZGlvTWFuYWdlcklPUzo6SGFzQXVkaW9JbnB1dERldmljZXMoKSB7Ci0gIGlmICghSW5pdEF1ZGlvU2Vzc2lvbigpKQotICAgIHJldHVybiBmYWxzZTsKLSAgLy8gTm90ZSB0aGF0IHRoZSB8a0F1ZGlvU2Vzc2lvblByb3BlcnR5X0F1ZGlvSW5wdXRBdmFpbGFibGV8IHByb3BlcnR5IGlzIGEKLSAgLy8gMzItYml0IGludGVnZXIsIG5vdCBhIGJvb2xlYW4uCi0gIFVJbnQzMiBwcm9wZXJ0eV9zaXplOwotICBPU1N0YXR1cyBlcnJvciA9Ci0gICAgICBBdWRpb1Nlc3Npb25HZXRQcm9wZXJ0eVNpemUoa0F1ZGlvU2Vzc2lvblByb3BlcnR5X0F1ZGlvSW5wdXRBdmFpbGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5X3NpemUpOwotICBpZiAoZXJyb3IgIT0ga0F1ZGlvU2Vzc2lvbk5vRXJyb3IpCi0gICAgcmV0dXJuIGZhbHNlOwotICBVSW50MzIgYXVkaW9faW5wdXRfaXNfYXZhaWxhYmxlID0gZmFsc2U7Ci0gIERDSEVDSyhwcm9wZXJ0eV9zaXplID09IHNpemVvZihhdWRpb19pbnB1dF9pc19hdmFpbGFibGUpKTsKLSAgZXJyb3IgPSBBdWRpb1Nlc3Npb25HZXRQcm9wZXJ0eShrQXVkaW9TZXNzaW9uUHJvcGVydHlfQXVkaW9JbnB1dEF2YWlsYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXVkaW9faW5wdXRfaXNfYXZhaWxhYmxlKTsKLSAgcmV0dXJuIGVycm9yID09IGtBdWRpb1Nlc3Npb25Ob0Vycm9yID8gYXVkaW9faW5wdXRfaXNfYXZhaWxhYmxlIDogZmFsc2U7Ci19Ci0KLUF1ZGlvT3V0cHV0U3RyZWFtKiBBdWRpb01hbmFnZXJJT1M6Ok1ha2VBdWRpb091dHB1dFN0cmVhbSgKLSAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcykgewotICBOT1RJTVBMRU1FTlRFRCgpOyAgLy8gT25seSBpbnB1dCBpcyBzdXBwb3J0ZWQgb24gaU9TLgotICByZXR1cm4gTlVMTDsKLX0KLQotQXVkaW9JbnB1dFN0cmVhbSogQXVkaW9NYW5hZ2VySU9TOjpNYWtlQXVkaW9JbnB1dFN0cmVhbSgKLSAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCkgewotICAvLyBDdXJyZW50IGxpbmUgb2YgaU9TIGRldmljZXMgaGFzIG9ubHkgb25lIGF1ZGlvIGlucHV0LgotICAvLyBJZ25vcmUgdGhlIGRldmljZV9pZCAodW5pdHRlc3QgdXNlcyBhIHRlc3QgdmFsdWUgaW4gaXQpLgotICBpZiAoIXBhcmFtcy5Jc1ZhbGlkKCkgfHwgKHBhcmFtcy5jaGFubmVscygpID4ga01heElucHV0Q2hhbm5lbHMpKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChwYXJhbXMuZm9ybWF0KCkgPT0gQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19GQUtFKQotICAgIHJldHVybiBGYWtlQXVkaW9JbnB1dFN0cmVhbTo6TWFrZUZha2VTdHJlYW0odGhpcywgcGFyYW1zKTsKLSAgZWxzZSBpZiAocGFyYW1zLmZvcm1hdCgpID09IEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xJTkVBUikKLSAgICByZXR1cm4gbmV3IFBDTVF1ZXVlSW5BdWRpb0lucHV0U3RyZWFtKHRoaXMsIHBhcmFtcyk7Ci0gIHJldHVybiBOVUxMOwotfQotCi1BdWRpb091dHB1dFN0cmVhbSogQXVkaW9NYW5hZ2VySU9TOjpNYWtlTGluZWFyT3V0cHV0U3RyZWFtKAotICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpIHsKLSAgTk9USU1QTEVNRU5URUQoKTsgIC8vIE9ubHkgaW5wdXQgaXMgc3VwcG9ydGVkIG9uIGlPUy4KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLUF1ZGlvT3V0cHV0U3RyZWFtKiBBdWRpb01hbmFnZXJJT1M6Ok1ha2VMb3dMYXRlbmN5T3V0cHV0U3RyZWFtKAotICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpIHsKLSAgTk9USU1QTEVNRU5URUQoKTsgIC8vIE9ubHkgaW5wdXQgaXMgc3VwcG9ydGVkIG9uIGlPUy4KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLUF1ZGlvSW5wdXRTdHJlYW0qIEF1ZGlvTWFuYWdlcklPUzo6TWFrZUxpbmVhcklucHV0U3RyZWFtKAotICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfaWQpIHsKLSAgcmV0dXJuIE1ha2VBdWRpb0lucHV0U3RyZWFtKHBhcmFtcywgZGV2aWNlX2lkKTsKLX0KLQotQXVkaW9JbnB1dFN0cmVhbSogQXVkaW9NYW5hZ2VySU9TOjpNYWtlTG93TGF0ZW5jeUlucHV0U3RyZWFtKAotICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfaWQpIHsKLSAgTk9USU1QTEVNRU5URUQoKTsgIC8vIE9ubHkgbGluZWFyIGF1ZGlvIGlucHV0IGlzIHN1cHBvcnRlZCBvbiBpT1MuCi0gIHJldHVybiBNYWtlQXVkaW9JbnB1dFN0cmVhbShwYXJhbXMsIGRldmljZV9pZCk7Ci19Ci0KLS8vIENhbGxlZCBieSB0aGUgc3RyZWFtIHdoZW4gaXQgaGFzIGJlZW4gcmVsZWFzZWQgYnkgY2FsbGluZyBDbG9zZSgpLgotdm9pZCBBdWRpb01hbmFnZXJJT1M6OlJlbGVhc2VPdXRwdXRTdHJlYW0oQXVkaW9PdXRwdXRTdHJlYW0qIHN0cmVhbSkgewotICBOT1RJTVBMRU1FTlRFRCgpOyAgLy8gT25seSBpbnB1dCBpcyBzdXBwb3J0ZWQgb24gaU9TLgotfQotCi0vLyBDYWxsZWQgYnkgdGhlIHN0cmVhbSB3aGVuIGl0IGhhcyBiZWVuIHJlbGVhc2VkIGJ5IGNhbGxpbmcgQ2xvc2UoKS4KLXZvaWQgQXVkaW9NYW5hZ2VySU9TOjpSZWxlYXNlSW5wdXRTdHJlYW0oQXVkaW9JbnB1dFN0cmVhbSogc3RyZWFtKSB7Ci0gIGRlbGV0ZSBzdHJlYW07Ci19Ci0KLWJvb2wgQXVkaW9NYW5hZ2VySU9TOjpJbml0QXVkaW9TZXNzaW9uKCkgewotICBzdGF0aWMgY29uc3QgYm9vbCBrU2Vzc2lvbkluaXRpYWxpemVkID0gSW5pdEF1ZGlvU2Vzc2lvbkludGVybmFsKCk7Ci0gIHJldHVybiBrU2Vzc2lvbkluaXRpYWxpemVkOwotfQotCi0vLyBzdGF0aWMKLUF1ZGlvTWFuYWdlciogQ3JlYXRlQXVkaW9NYW5hZ2VyKCkgewotICByZXR1cm4gbmV3IEF1ZGlvTWFuYWdlcklPUygpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9pb3MvYXVkaW9fbWFuYWdlcl9pb3NfdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvYXVkaW8vaW9zL2F1ZGlvX21hbmFnZXJfaW9zX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODAxM2NjLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9pb3MvYXVkaW9fbWFuYWdlcl9pb3NfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19pby5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX21hbmFnZXIuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgbmFtZXNwYWNlIG1lZGlhOwotCi0vLyBUZXN0IHRoYXQgaW5wdXQgaXMgc3VwcG9ydGVkIGFuZCBvdXRwdXQgaXMgbm90LgotVEVTVChJT1NBdWRpb1Rlc3QsIEF1ZGlvU3VwcG9ydCkgewotICBBdWRpb01hbmFnZXIqIGF1ZGlvX21hbmFnZXIgPSBBdWRpb01hbmFnZXI6OkNyZWF0ZSgpOwotICBBU1NFUlRfVFJVRShOVUxMICE9IGF1ZGlvX21hbmFnZXIpOwotICBBU1NFUlRfRkFMU0UoYXVkaW9fbWFuYWdlci0+SGFzQXVkaW9PdXRwdXREZXZpY2VzKCkpOwotICBBU1NFUlRfVFJVRShhdWRpb19tYW5hZ2VyLT5IYXNBdWRpb0lucHV0RGV2aWNlcygpKTsKLX0KLQotLy8gVGVzdCB0aGF0IGlucHV0IHN0cmVhbSBjYW4gYmUgb3BlbmVkIGFuZCBjbG9zZWQuCi1URVNUKElPU0F1ZGlvVGVzdCwgSW5wdXRTdHJlYW1PcGVuQW5kQ2xvc2UpIHsKLSAgQXVkaW9NYW5hZ2VyKiBhdWRpb19tYW5hZ2VyID0gQXVkaW9NYW5hZ2VyOjpDcmVhdGUoKTsKLSAgQVNTRVJUX1RSVUUoTlVMTCAhPSBhdWRpb19tYW5hZ2VyKTsKLSAgaWYgKCFhdWRpb19tYW5hZ2VyLT5IYXNBdWRpb0lucHV0RGV2aWNlcygpKQotICAgIHJldHVybjsKLSAgQXVkaW9JbnB1dFN0cmVhbSogaWFzID0gYXVkaW9fbWFuYWdlci0+TWFrZUF1ZGlvSW5wdXRTdHJlYW0oCi0gICAgICBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSLCBDSEFOTkVMX0xBWU9VVF9TVEVSRU8sCi0gICAgICAgICAgICAgICAgICAgICAgODAwMCwgMTYsIDEwMjQpLAotICAgICAgc3RkOjpzdHJpbmcoInRlc3RfZGV2aWNlIikpOwotICBBU1NFUlRfVFJVRShOVUxMICE9IGlhcyk7Ci0gIEVYUEVDVF9UUlVFKGlhcy0+T3BlbigpKTsKLSAgaWFzLT5DbG9zZSgpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2xpbnV4L2Fsc2FfaW5wdXQuY2MgYi9zcmMvbWVkaWEvYXVkaW8vbGludXgvYWxzYV9pbnB1dC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWExOTljYi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vbGludXgvYWxzYV9pbnB1dC5jYworKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vbGludXgvYWxzYV9pbnB1dC5oIgotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJiYXNlL3RpbWUuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19tYW5hZ2VyLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vbGludXgvYWxzYV9vdXRwdXQuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9saW51eC9hbHNhX3V0aWwuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9saW51eC9hbHNhX3dyYXBwZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9saW51eC9hdWRpb19tYW5hZ2VyX2xpbnV4LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLXN0YXRpYyBjb25zdCBpbnQga051bVBhY2tldHNJblJpbmdCdWZmZXIgPSAzOwotCi1zdGF0aWMgY29uc3QgY2hhciBrRGVmYXVsdERldmljZTFbXSA9ICJkZWZhdWx0IjsKLXN0YXRpYyBjb25zdCBjaGFyIGtEZWZhdWx0RGV2aWNlMltdID0gInBsdWc6ZGVmYXVsdCI7Ci0KLWNvbnN0IGNoYXIqIEFsc2FQY21JbnB1dFN0cmVhbTo6a0F1dG9TZWxlY3REZXZpY2UgPSAiIjsKLQotQWxzYVBjbUlucHV0U3RyZWFtOjpBbHNhUGNtSW5wdXRTdHJlYW0oQXVkaW9NYW5hZ2VyTGludXgqIGF1ZGlvX21hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsc2FXcmFwcGVyKiB3cmFwcGVyKQotICAgIDogYXVkaW9fbWFuYWdlcl8oYXVkaW9fbWFuYWdlciksCi0gICAgICBkZXZpY2VfbmFtZV8oZGV2aWNlX25hbWUpLAotICAgICAgcGFyYW1zXyhwYXJhbXMpLAotICAgICAgYnl0ZXNfcGVyX2J1ZmZlcl8ocGFyYW1zLmZyYW1lc19wZXJfYnVmZmVyKCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmFtcy5jaGFubmVscygpICogcGFyYW1zLmJpdHNfcGVyX3NhbXBsZSgpKSAvIDgpLAotICAgICAgd3JhcHBlcl8od3JhcHBlciksCi0gICAgICBidWZmZXJfZHVyYXRpb25fbXNfKAotICAgICAgICAgIChwYXJhbXMuZnJhbWVzX3Blcl9idWZmZXIoKSAqIGJhc2U6OlRpbWU6OmtNaWxsaXNlY29uZHNQZXJTZWNvbmQpIC8KLSAgICAgICAgICBwYXJhbXMuc2FtcGxlX3JhdGUoKSksCi0gICAgICBjYWxsYmFja18oTlVMTCksCi0gICAgICBkZXZpY2VfaGFuZGxlXyhOVUxMKSwKLSAgICAgIG1peGVyX2hhbmRsZV8oTlVMTCksCi0gICAgICBtaXhlcl9lbGVtZW50X2hhbmRsZV8oTlVMTCksCi0gICAgICBBTExPV19USElTX0lOX0lOSVRJQUxJWkVSX0xJU1Qod2Vha19mYWN0b3J5Xyh0aGlzKSksCi0gICAgICByZWFkX2NhbGxiYWNrX2JlaGluZF9zY2hlZHVsZV8oZmFsc2UpIHsKLX0KLQotQWxzYVBjbUlucHV0U3RyZWFtOjp+QWxzYVBjbUlucHV0U3RyZWFtKCkge30KLQotYm9vbCBBbHNhUGNtSW5wdXRTdHJlYW06Ok9wZW4oKSB7Ci0gIGlmIChkZXZpY2VfaGFuZGxlXykKLSAgICByZXR1cm4gZmFsc2U7ICAvLyBBbHJlYWR5IG9wZW4uCi0KLSAgc25kX3BjbV9mb3JtYXRfdCBwY21fZm9ybWF0ID0gYWxzYV91dGlsOjpCaXRzVG9Gb3JtYXQoCi0gICAgICBwYXJhbXNfLmJpdHNfcGVyX3NhbXBsZSgpKTsKLSAgaWYgKHBjbV9mb3JtYXQgPT0gU05EX1BDTV9GT1JNQVRfVU5LTk9XTikgewotICAgIExPRyhXQVJOSU5HKSA8PCAiVW5zdXBwb3J0ZWQgYml0cyBwZXIgc2FtcGxlOiAiCi0gICAgICAgICAgICAgICAgIDw8IHBhcmFtc18uYml0c19wZXJfc2FtcGxlKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdWludDMyIGxhdGVuY3lfdXMgPSBidWZmZXJfZHVyYXRpb25fbXNfICoga051bVBhY2tldHNJblJpbmdCdWZmZXIgKgotICAgICAgYmFzZTo6VGltZTo6a01pY3Jvc2Vjb25kc1Blck1pbGxpc2Vjb25kOwotCi0gIC8vIFVzZSB0aGUgc2FtZSBtaW5pbXVtIHJlcXVpcmVkIGxhdGVuY3kgYXMgb3V0cHV0LgotICBsYXRlbmN5X3VzID0gc3RkOjptYXgobGF0ZW5jeV91cywgQWxzYVBjbU91dHB1dFN0cmVhbTo6a01pbkxhdGVuY3lNaWNyb3MpOwotCi0gIGlmIChkZXZpY2VfbmFtZV8gPT0ga0F1dG9TZWxlY3REZXZpY2UpIHsKLSAgICBjb25zdCBjaGFyKiBkZXZpY2VfbmFtZXNbXSA9IHsga0RlZmF1bHREZXZpY2UxLCBrRGVmYXVsdERldmljZTIgfTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFycmF5c2l6ZShkZXZpY2VfbmFtZXMpOyArK2kpIHsKLSAgICAgIGRldmljZV9oYW5kbGVfID0gYWxzYV91dGlsOjpPcGVuQ2FwdHVyZURldmljZSgKLSAgICAgICAgICB3cmFwcGVyXywgZGV2aWNlX25hbWVzW2ldLCBwYXJhbXNfLmNoYW5uZWxzKCksCi0gICAgICAgICAgcGFyYW1zXy5zYW1wbGVfcmF0ZSgpLCBwY21fZm9ybWF0LCBsYXRlbmN5X3VzKTsKLQotICAgICAgaWYgKGRldmljZV9oYW5kbGVfKSB7Ci0gICAgICAgIGRldmljZV9uYW1lXyA9IGRldmljZV9uYW1lc1tpXTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIGRldmljZV9oYW5kbGVfID0gYWxzYV91dGlsOjpPcGVuQ2FwdHVyZURldmljZSh3cmFwcGVyXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX25hbWVfLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc18uY2hhbm5lbHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zXy5zYW1wbGVfcmF0ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY21fZm9ybWF0LCBsYXRlbmN5X3VzKTsKLSAgfQotCi0gIGlmIChkZXZpY2VfaGFuZGxlXykgewotICAgIGF1ZGlvX2J1ZmZlcl8ucmVzZXQobmV3IHVpbnQ4W2J5dGVzX3Blcl9idWZmZXJfXSk7Ci0KLSAgICAvLyBPcGVuIHRoZSBtaWNyb3Bob25lIG1peGVyLgotICAgIG1peGVyX2hhbmRsZV8gPSBhbHNhX3V0aWw6Ok9wZW5NaXhlcih3cmFwcGVyXywgZGV2aWNlX25hbWVfKTsKLSAgICBpZiAobWl4ZXJfaGFuZGxlXykgewotICAgICAgbWl4ZXJfZWxlbWVudF9oYW5kbGVfID0gYWxzYV91dGlsOjpMb2FkQ2FwdHVyZU1peGVyRWxlbWVudCgKLSAgICAgICAgICB3cmFwcGVyXywgbWl4ZXJfaGFuZGxlXyk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGRldmljZV9oYW5kbGVfICE9IE5VTEw7Ci19Ci0KLXZvaWQgQWxzYVBjbUlucHV0U3RyZWFtOjpTdGFydChBdWRpb0lucHV0Q2FsbGJhY2sqIGNhbGxiYWNrKSB7Ci0gIERDSEVDSyghY2FsbGJhY2tfICYmIGNhbGxiYWNrKTsKLSAgY2FsbGJhY2tfID0gY2FsbGJhY2s7Ci0gIGludCBlcnJvciA9IHdyYXBwZXJfLT5QY21QcmVwYXJlKGRldmljZV9oYW5kbGVfKTsKLSAgaWYgKGVycm9yIDwgMCkgewotICAgIEhhbmRsZUVycm9yKCJQY21QcmVwYXJlIiwgZXJyb3IpOwotICB9IGVsc2UgewotICAgIGVycm9yID0gd3JhcHBlcl8tPlBjbVN0YXJ0KGRldmljZV9oYW5kbGVfKTsKLSAgICBpZiAoZXJyb3IgPCAwKQotICAgICAgSGFuZGxlRXJyb3IoIlBjbVN0YXJ0IiwgZXJyb3IpOwotICB9Ci0KLSAgaWYgKGVycm9yIDwgMCkgewotICAgIGNhbGxiYWNrXyA9IE5VTEw7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gV2Ugc3RhcnQgcmVhZGluZyBkYXRhIGhhbGYgfGJ1ZmZlcl9kdXJhdGlvbl9tc198IGxhdGVyIHRoYW4gd2hlbiB0aGUKLSAgICAvLyBidWZmZXIgbWlnaHQgaGF2ZSBnb3QgZmlsbGVkLCB0byBhY2NvbW1vZGF0ZSBzb21lIGRlbGF5cyBpbiB0aGUgYXVkaW8KLSAgICAvLyBkcml2ZXIuIFRoaXMgY291bGQgYWxzbyBnaXZlIHVzIGEgc21vb3RoIHJlYWQgc2VxdWVuY2UgZ29pbmcgZm9yd2FyZC4KLSAgICBiYXNlOjpUaW1lRGVsdGEgZGVsYXkgPSBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoCi0gICAgICAgIGJ1ZmZlcl9kdXJhdGlvbl9tc18gKyBidWZmZXJfZHVyYXRpb25fbXNfIC8gMik7Ci0gICAgbmV4dF9yZWFkX3RpbWVfID0gYmFzZTo6VGltZTo6Tm93KCkgKyBkZWxheTsKLSAgICBNZXNzYWdlTG9vcDo6Y3VycmVudCgpLT5Qb3N0RGVsYXllZFRhc2soCi0gICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgYmFzZTo6QmluZCgmQWxzYVBjbUlucHV0U3RyZWFtOjpSZWFkQXVkaW8sIHdlYWtfZmFjdG9yeV8uR2V0V2Vha1B0cigpKSwKLSAgICAgICAgZGVsYXkpOwotCi0gICAgYXVkaW9fbWFuYWdlcl8tPkluY3JlYXNlQWN0aXZlSW5wdXRTdHJlYW1Db3VudCgpOwotICB9Ci19Ci0KLWJvb2wgQWxzYVBjbUlucHV0U3RyZWFtOjpSZWNvdmVyKGludCBvcmlnaW5hbF9lcnJvcikgewotICBpbnQgZXJyb3IgPSB3cmFwcGVyXy0+UGNtUmVjb3ZlcihkZXZpY2VfaGFuZGxlXywgb3JpZ2luYWxfZXJyb3IsIDEpOwotICBpZiAoZXJyb3IgPCAwKSB7Ci0gICAgLy8gRG9jcyBzYXkgc25kX3BjbV9yZWNvdmVyIHJldHVybnMgdGhlIG9yaWdpbmFsIGVycm9yIGlmIGl0IGlzIG5vdCBvbmUKLSAgICAvLyBvZiB0aGUgcmVjb3ZlcmFibGUgb25lcywgc28gdGhpcyBsb2cgbWVzc2FnZSB3aWxsIHByb2JhYmx5IGNvbnRhaW4gdGhlCi0gICAgLy8gc2FtZSBlcnJvciB0d2ljZS4KLSAgICBMT0coV0FSTklORykgPDwgIlVuYWJsZSB0byByZWNvdmVyIGZyb20gXCIiCi0gICAgICAgICAgICAgICAgIDw8IHdyYXBwZXJfLT5TdHJFcnJvcihvcmlnaW5hbF9lcnJvcikgPDwgIlwiOiAiCi0gICAgICAgICAgICAgICAgIDw8IHdyYXBwZXJfLT5TdHJFcnJvcihlcnJvcik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKG9yaWdpbmFsX2Vycm9yID09IC1FUElQRSkgeyAgLy8gQnVmZmVyIHVuZGVycnVuL292ZXJydW4uCi0gICAgLy8gRm9yIGNhcHR1cmUgc3RyZWFtcyB3ZSBoYXZlIHRvIHJlcGVhdCB0aGUgZXhwbGljaXQgc3RhcnQoKSB0byBnZXQKLSAgICAvLyBkYXRhIGZsb3dpbmcgYWdhaW4uCi0gICAgZXJyb3IgPSB3cmFwcGVyXy0+UGNtU3RhcnQoZGV2aWNlX2hhbmRsZV8pOwotICAgIGlmIChlcnJvciA8IDApIHsKLSAgICAgIEhhbmRsZUVycm9yKCJQY21TdGFydCIsIGVycm9yKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc25kX3BjbV9zZnJhbWVzX3QgQWxzYVBjbUlucHV0U3RyZWFtOjpHZXRDdXJyZW50RGVsYXkoKSB7Ci0gIHNuZF9wY21fc2ZyYW1lc190IGRlbGF5ID0gLTE7Ci0KLSAgaW50IGVycm9yID0gd3JhcHBlcl8tPlBjbURlbGF5KGRldmljZV9oYW5kbGVfLCAmZGVsYXkpOwotICBpZiAoZXJyb3IgPCAwKQotICAgIFJlY292ZXIoZXJyb3IpOwotCi0gIC8vIHNuZF9wY21fZGVsYXkoKSBtYXkgbm90IHdvcmsgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyZWFtLiBJbiB0aGlzIGNhc2UKLSAgLy8gcmV0dXJuIGRlbGF5IG9mIGRhdGEgd2Uga25vdyBjdXJyZW50bHkgaXMgaW4gdGhlIEFMU0EncyBidWZmZXIuCi0gIGlmIChkZWxheSA8IDApCi0gICAgZGVsYXkgPSB3cmFwcGVyXy0+UGNtQXZhaWxVcGRhdGUoZGV2aWNlX2hhbmRsZV8pOwotCi0gIHJldHVybiBkZWxheTsKLX0KLQotdm9pZCBBbHNhUGNtSW5wdXRTdHJlYW06OlJlYWRBdWRpbygpIHsKLSAgRENIRUNLKGNhbGxiYWNrXyk7Ci0KLSAgc25kX3BjbV9zZnJhbWVzX3QgZnJhbWVzID0gd3JhcHBlcl8tPlBjbUF2YWlsVXBkYXRlKGRldmljZV9oYW5kbGVfKTsKLSAgaWYgKGZyYW1lcyA8IDApIHsgIC8vIFBvdGVudGlhbGx5IHJlY292ZXJhYmxlIGVycm9yPwotICAgIExPRyhXQVJOSU5HKSA8PCAiUGNtQXZhaWxVcGRhdGUoKTogIiA8PCB3cmFwcGVyXy0+U3RyRXJyb3IoZnJhbWVzKTsKLSAgICBSZWNvdmVyKGZyYW1lcyk7Ci0gIH0KLQotICBpZiAoZnJhbWVzIDwgcGFyYW1zXy5mcmFtZXNfcGVyX2J1ZmZlcigpKSB7Ci0gICAgLy8gTm90IGVub3VnaCBkYXRhIHlldCBvciBlcnJvciBoYXBwZW5lZC4gSW4gYm90aCBjYXNlcyB3YWl0IGZvciBhIHZlcnkKLSAgICAvLyBzbWFsbCBkdXJhdGlvbiBiZWZvcmUgY2hlY2tpbmcgYWdhaW4uCi0gICAgLy8gRXZlbiBUaG91Z2ggcmVhZCBjYWxsYmFjayB3YXMgYmVoaW5kIHNjaGVkdWxlLCB0aGVyZSBpcyBubyBkYXRhLCBzbwotICAgIC8vIHJlc2V0IHRoZSBuZXh0X3JlYWRfdGltZV8uCi0gICAgaWYgKHJlYWRfY2FsbGJhY2tfYmVoaW5kX3NjaGVkdWxlXykgewotICAgICAgbmV4dF9yZWFkX3RpbWVfID0gYmFzZTo6VGltZTo6Tm93KCk7Ci0gICAgICByZWFkX2NhbGxiYWNrX2JlaGluZF9zY2hlZHVsZV8gPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBiYXNlOjpUaW1lRGVsdGEgbmV4dF9jaGVja190aW1lID0gYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKAotICAgICAgICBidWZmZXJfZHVyYXRpb25fbXNfIC8gMik7Ci0gICAgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKS0+UG9zdERlbGF5ZWRUYXNrKAotICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgIGJhc2U6OkJpbmQoJkFsc2FQY21JbnB1dFN0cmVhbTo6UmVhZEF1ZGlvLCB3ZWFrX2ZhY3RvcnlfLkdldFdlYWtQdHIoKSksCi0gICAgICAgIG5leHRfY2hlY2tfdGltZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW50IG51bV9idWZmZXJzID0gZnJhbWVzIC8gcGFyYW1zXy5mcmFtZXNfcGVyX2J1ZmZlcigpOwotICB1aW50MzIgaGFyZHdhcmVfZGVsYXlfYnl0ZXMgPQotICAgICAgc3RhdGljX2Nhc3Q8dWludDMyPihHZXRDdXJyZW50RGVsYXkoKSAqIHBhcmFtc18uR2V0Qnl0ZXNQZXJGcmFtZSgpKTsKLSAgZG91YmxlIG5vcm1hbGl6ZWRfdm9sdW1lID0gMC4wOwotCi0gIC8vIFVwZGF0ZSB0aGUgQUdDIHZvbHVtZSBsZXZlbCBvbmNlIGV2ZXJ5IHNlY29uZC4gTm90ZSB0aGF0LCB8dm9sdW1lfCBpcwotICAvLyBhbHNvIHVwZGF0ZWQgZWFjaCB0aW1lIFNldFZvbHVtZSgpIGlzIGNhbGxlZCB0aHJvdWdoIElQQyBieSB0aGUKLSAgLy8gcmVuZGVyLXNpZGUgQUdDLgotICBRdWVyeUFnY1ZvbHVtZSgmbm9ybWFsaXplZF92b2x1bWUpOwotCi0gIHdoaWxlIChudW1fYnVmZmVycy0tKSB7Ci0gICAgaW50IGZyYW1lc19yZWFkID0gd3JhcHBlcl8tPlBjbVJlYWRpKGRldmljZV9oYW5kbGVfLCBhdWRpb19idWZmZXJfLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNfLmZyYW1lc19wZXJfYnVmZmVyKCkpOwotICAgIGlmIChmcmFtZXNfcmVhZCA9PSBwYXJhbXNfLmZyYW1lc19wZXJfYnVmZmVyKCkpIHsKLSAgICAgIGNhbGxiYWNrXy0+T25EYXRhKHRoaXMsIGF1ZGlvX2J1ZmZlcl8uZ2V0KCksIGJ5dGVzX3Blcl9idWZmZXJfLAotICAgICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmVfZGVsYXlfYnl0ZXMsIG5vcm1hbGl6ZWRfdm9sdW1lKTsKLSAgICB9IGVsc2UgewotICAgICAgTE9HKFdBUk5JTkcpIDw8ICJQY21SZWFkaSByZXR1cm5pbmcgbGVzcyB0aGFuIGV4cGVjdGVkIGZyYW1lczogIgotICAgICAgICAgICAgICAgICAgIDw8IGZyYW1lc19yZWFkIDw8ICIgdnMuICIgPDwgcGFyYW1zXy5mcmFtZXNfcGVyX2J1ZmZlcigpCi0gICAgICAgICAgICAgICAgICAgPDwgIi4gRHJvcHBpbmcgdGhpcyBidWZmZXIuIjsKLSAgICB9Ci0gIH0KLQotICBuZXh0X3JlYWRfdGltZV8gKz0gYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKGJ1ZmZlcl9kdXJhdGlvbl9tc18pOwotICBiYXNlOjpUaW1lRGVsdGEgZGVsYXkgPSBuZXh0X3JlYWRfdGltZV8gLSBiYXNlOjpUaW1lOjpOb3coKTsKLSAgaWYgKGRlbGF5IDwgYmFzZTo6VGltZURlbHRhKCkpIHsKLSAgICBMT0coV0FSTklORykgPDwgIkF1ZGlvIHJlYWQgY2FsbGJhY2sgYmVoaW5kIHNjaGVkdWxlIGJ5ICIKLSAgICAgICAgICAgICAgICAgPDwgKGJ1ZmZlcl9kdXJhdGlvbl9tc18gLSBkZWxheS5Jbk1pbGxpc2Vjb25kcygpKQotICAgICAgICAgICAgICAgICA8PCAiIChtcykuIjsKLSAgICAvLyBSZWFkIGNhbGxiYWNrIGlzIGJlaGluZCBzY2hlZHVsZS4gQXNzdW1pbmcgdGhlcmUgaXMgZGF0YSBwZW5kaW5nIGluCi0gICAgLy8gdGhlIHNvdW5kY2FyZCwgaW52b2tlIHRoZSByZWFkIGNhbGxiYWNrIGltbWVkaWF0ZSBpbiBvcmRlciB0byBjYXRjaCB1cC4KLSAgICByZWFkX2NhbGxiYWNrX2JlaGluZF9zY2hlZHVsZV8gPSB0cnVlOwotICAgIGRlbGF5ID0gYmFzZTo6VGltZURlbHRhKCk7Ci0gIH0KLQotICBNZXNzYWdlTG9vcDo6Y3VycmVudCgpLT5Qb3N0RGVsYXllZFRhc2soCi0gICAgICBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kKCZBbHNhUGNtSW5wdXRTdHJlYW06OlJlYWRBdWRpbywgd2Vha19mYWN0b3J5Xy5HZXRXZWFrUHRyKCkpLAotICAgICAgZGVsYXkpOwotfQotCi12b2lkIEFsc2FQY21JbnB1dFN0cmVhbTo6U3RvcCgpIHsKLSAgaWYgKCFkZXZpY2VfaGFuZGxlXyB8fCAhY2FsbGJhY2tfKQotICAgIHJldHVybjsKLQotICAvLyBTdG9wIGlzIGFsd2F5cyBjYWxsZWQgYmVmb3JlIENsb3NlLiBJbiBjYXNlIG9mIGVycm9yLCB0aGlzIHdpbGwgYmUKLSAgLy8gYWxzbyBjYWxsZWQgd2hlbiBjbG9zaW5nIHRoZSBpbnB1dCBjb250cm9sbGVyLgotICBhdWRpb19tYW5hZ2VyXy0+RGVjcmVhc2VBY3RpdmVJbnB1dFN0cmVhbUNvdW50KCk7Ci0KLSAgd2Vha19mYWN0b3J5Xy5JbnZhbGlkYXRlV2Vha1B0cnMoKTsgIC8vIENhbmNlbCB0aGUgbmV4dCBzY2hlZHVsZWQgcmVhZC4KLSAgaW50IGVycm9yID0gd3JhcHBlcl8tPlBjbURyb3AoZGV2aWNlX2hhbmRsZV8pOwotICBpZiAoZXJyb3IgPCAwKQotICAgIEhhbmRsZUVycm9yKCJQY21Ecm9wIiwgZXJyb3IpOwotfQotCi12b2lkIEFsc2FQY21JbnB1dFN0cmVhbTo6Q2xvc2UoKSB7Ci0gIGlmIChkZXZpY2VfaGFuZGxlXykgewotICAgIHdlYWtfZmFjdG9yeV8uSW52YWxpZGF0ZVdlYWtQdHJzKCk7ICAvLyBDYW5jZWwgdGhlIG5leHQgc2NoZWR1bGVkIHJlYWQuCi0gICAgaW50IGVycm9yID0gYWxzYV91dGlsOjpDbG9zZURldmljZSh3cmFwcGVyXywgZGV2aWNlX2hhbmRsZV8pOwotICAgIGlmIChlcnJvciA8IDApCi0gICAgICBIYW5kbGVFcnJvcigiUGNtQ2xvc2UiLCBlcnJvcik7Ci0KLSAgICBpZiAobWl4ZXJfaGFuZGxlXykKLSAgICAgIGFsc2FfdXRpbDo6Q2xvc2VNaXhlcih3cmFwcGVyXywgbWl4ZXJfaGFuZGxlXywgZGV2aWNlX25hbWVfKTsKLQotICAgIGF1ZGlvX2J1ZmZlcl8ucmVzZXQoKTsKLSAgICBkZXZpY2VfaGFuZGxlXyA9IE5VTEw7Ci0gICAgbWl4ZXJfaGFuZGxlXyA9IE5VTEw7Ci0gICAgbWl4ZXJfZWxlbWVudF9oYW5kbGVfID0gTlVMTDsKLQotICAgIGlmIChjYWxsYmFja18pCi0gICAgICBjYWxsYmFja18tPk9uQ2xvc2UodGhpcyk7Ci0gIH0KLQotICBhdWRpb19tYW5hZ2VyXy0+UmVsZWFzZUlucHV0U3RyZWFtKHRoaXMpOwotfQotCi1kb3VibGUgQWxzYVBjbUlucHV0U3RyZWFtOjpHZXRNYXhWb2x1bWUoKSB7Ci0gIGlmICghbWl4ZXJfaGFuZGxlXyB8fCAhbWl4ZXJfZWxlbWVudF9oYW5kbGVfKSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCAiR2V0TWF4Vm9sdW1lIGlzIG5vdCBzdXBwb3J0ZWQgZm9yICIgPDwgZGV2aWNlX25hbWVfOwotICAgIHJldHVybiAwLjA7Ci0gIH0KLQotICBpZiAoIXdyYXBwZXJfLT5NaXhlclNlbGVtSGFzQ2FwdHVyZVZvbHVtZShtaXhlcl9lbGVtZW50X2hhbmRsZV8pKSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCAiVW5zdXBwb3J0ZWQgbWljcm9waG9uZSB2b2x1bWUgZm9yICIgPDwgZGV2aWNlX25hbWVfOwotICAgIHJldHVybiAwLjA7Ci0gIH0KLQotICBsb25nIG1pbiA9IDA7Ci0gIGxvbmcgbWF4ID0gMDsKLSAgaWYgKHdyYXBwZXJfLT5NaXhlclNlbGVtR2V0Q2FwdHVyZVZvbHVtZVJhbmdlKG1peGVyX2VsZW1lbnRfaGFuZGxlXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4KSkgewotICAgIERMT0coV0FSTklORykgPDwgIlVuc3VwcG9ydGVkIG1heCBtaWNyb3Bob25lIHZvbHVtZSBmb3IgIiA8PCBkZXZpY2VfbmFtZV87Ci0gICAgcmV0dXJuIDAuMDsKLSAgfQotICBEQ0hFQ0sobWluID09IDApOwotICBEQ0hFQ0sobWF4ID4gMCk7Ci0KLSAgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4obWF4KTsKLX0KLQotdm9pZCBBbHNhUGNtSW5wdXRTdHJlYW06OlNldFZvbHVtZShkb3VibGUgdm9sdW1lKSB7Ci0gIGlmICghbWl4ZXJfaGFuZGxlXyB8fCAhbWl4ZXJfZWxlbWVudF9oYW5kbGVfKSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCAiU2V0Vm9sdW1lIGlzIG5vdCBzdXBwb3J0ZWQgZm9yICIgPDwgZGV2aWNlX25hbWVfOwotICAgIHJldHVybjsKLSAgfQotCi0gIGludCBlcnJvciA9IHdyYXBwZXJfLT5NaXhlclNlbGVtU2V0Q2FwdHVyZVZvbHVtZUFsbCgKLSAgICAgIG1peGVyX2VsZW1lbnRfaGFuZGxlXywgc3RhdGljX2Nhc3Q8bG9uZz4odm9sdW1lKSk7Ci0gIGlmIChlcnJvciA8IDApIHsKLSAgICBETE9HKFdBUk5JTkcpIDw8ICJVbmFibGUgdG8gc2V0IHZvbHVtZSBmb3IgIiA8PCBkZXZpY2VfbmFtZV87Ci0gIH0KLQotICAvLyBVcGRhdGUgdGhlIEFHQyB2b2x1bWUgbGV2ZWwgYmFzZWQgb24gdGhlIGxhc3Qgc2V0dGluZyBhYm92ZS4gTm90ZSB0aGF0LAotICAvLyB0aGUgdm9sdW1lLWxldmVsIHJlc29sdXRpb24gaXMgbm90IGluZmluaXRlIGFuZCBpdCBpcyB0aGVyZWZvcmUgbm90Ci0gIC8vIHBvc3NpYmxlIHRvIGFzc3VtZSB0aGF0IHRoZSB2b2x1bWUgcHJvdmlkZWQgYXMgaW5wdXQgcGFyYW1ldGVyIGNhbiBiZQotICAvLyB1c2VkIGRpcmVjdGx5LiBJbnN0ZWFkLCBhIG5ldyBxdWVyeSB0byB0aGUgYXVkaW8gaGFyZHdhcmUgaXMgcmVxdWlyZWQuCi0gIC8vIFRoaXMgbWV0aG9kIGRvZXMgbm90aGluZyBpZiBBR0MgaXMgZGlzYWJsZWQuCi0gIFVwZGF0ZUFnY1ZvbHVtZSgpOwotfQotCi1kb3VibGUgQWxzYVBjbUlucHV0U3RyZWFtOjpHZXRWb2x1bWUoKSB7Ci0gIGlmICghbWl4ZXJfaGFuZGxlXyB8fCAhbWl4ZXJfZWxlbWVudF9oYW5kbGVfKSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCAiR2V0Vm9sdW1lIGlzIG5vdCBzdXBwb3J0ZWQgZm9yICIgPDwgZGV2aWNlX25hbWVfOwotICAgIHJldHVybiAwLjA7Ci0gIH0KLQotICBsb25nIGN1cnJlbnRfdm9sdW1lID0gMDsKLSAgaW50IGVycm9yID0gd3JhcHBlcl8tPk1peGVyU2VsZW1HZXRDYXB0dXJlVm9sdW1lKAotICAgICAgbWl4ZXJfZWxlbWVudF9oYW5kbGVfLCBzdGF0aWNfY2FzdDxzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90PigwKSwKLSAgICAgICZjdXJyZW50X3ZvbHVtZSk7Ci0gIGlmIChlcnJvciA8IDApIHsKLSAgICBETE9HKFdBUk5JTkcpIDw8ICJVbmFibGUgdG8gZ2V0IHZvbHVtZSBmb3IgIiA8PCBkZXZpY2VfbmFtZV87Ci0gICAgcmV0dXJuIDAuMDsKLSAgfQotCi0gIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KGN1cnJlbnRfdm9sdW1lKTsKLX0KLQotdm9pZCBBbHNhUGNtSW5wdXRTdHJlYW06OkhhbmRsZUVycm9yKGNvbnN0IGNoYXIqIG1ldGhvZCwgaW50IGVycm9yKSB7Ci0gIExPRyhXQVJOSU5HKSA8PCBtZXRob2QgPDwgIjogIiA8PCB3cmFwcGVyXy0+U3RyRXJyb3IoZXJyb3IpOwotICBjYWxsYmFja18tPk9uRXJyb3IodGhpcywgZXJyb3IpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9saW51eC9hbHNhX2lucHV0LmggYi9zcmMvbWVkaWEvYXVkaW8vbGludXgvYWxzYV9pbnB1dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTAyN2Q0Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9saW51eC9hbHNhX2lucHV0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0FVRElPX0xJTlVYX0FMU0FfSU5QVVRfSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fTElOVVhfQUxTQV9JTlBVVF9IXwotCi0jaW5jbHVkZSA8YWxzYS9hc291bmRsaWIuaD4KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvY29tcGlsZXJfc3BlY2lmaWMuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvd2Vha19wdHIuaCIKLSNpbmNsdWRlICJiYXNlL3RpbWUuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19pbnB1dF9zdHJlYW1faW1wbC5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX2lvLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fcGFyYW1ldGVycy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBBbHNhV3JhcHBlcjsKLWNsYXNzIEF1ZGlvTWFuYWdlckxpbnV4OwotCi0vLyBQcm92aWRlcyBhbiBpbnB1dCBzdHJlYW0gZm9yIGF1ZGlvIGNhcHR1cmUgYmFzZWQgb24gdGhlIEFMU0EgUENNIGludGVyZmFjZS4KLS8vIFRoaXMgb2JqZWN0IGlzIG5vdCB0aHJlYWQgc2FmZSBhbmQgYWxsIG1ldGhvZHMgc2hvdWxkIGJlIGludm9rZWQgaW4gdGhlCi0vLyB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSBvYmplY3QuCi1jbGFzcyBBbHNhUGNtSW5wdXRTdHJlYW0gOiBwdWJsaWMgQXVkaW9JbnB1dFN0cmVhbUltcGwgewotIHB1YmxpYzoKLSAgLy8gUGFzcyB0aGlzIHRvIHRoZSBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBhdHRlbXB0IGF1dG8tc2VsZWN0aW9uCi0gIC8vIG9mIHRoZSBhdWRpbyByZWNvcmRpbmcgZGV2aWNlLgotICBzdGF0aWMgY29uc3QgY2hhcioga0F1dG9TZWxlY3REZXZpY2U7Ci0KLSAgLy8gQ3JlYXRlIGEgUENNIE91dHB1dCBzdHJlYW0gZm9yIHRoZSBBTFNBIGRldmljZSBpZGVudGlmaWVkIGJ5Ci0gIC8vIHxkZXZpY2VfbmFtZXwuIElmIHVuc3VyZSBvZiB3aGF0IHRvIHVzZSBmb3IgfGRldmljZV9uYW1lfCwgdXNlCi0gIC8vIHxrQXV0b1NlbGVjdERldmljZXwuCi0gIEFsc2FQY21JbnB1dFN0cmVhbShBdWRpb01hbmFnZXJMaW51eCogYXVkaW9fbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgQWxzYVdyYXBwZXIqIHdyYXBwZXIpOwotCi0gIHZpcnR1YWwgfkFsc2FQY21JbnB1dFN0cmVhbSgpOwotCi0gIC8vIEltcGxlbWVudGF0aW9uIG9mIEF1ZGlvSW5wdXRTdHJlYW0uCi0gIHZpcnR1YWwgYm9vbCBPcGVuKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTdGFydChBdWRpb0lucHV0Q2FsbGJhY2sqIGNhbGxiYWNrKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0b3AoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIENsb3NlKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgZG91YmxlIEdldE1heFZvbHVtZSgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpIE9WRVJSSURFOwotICB2aXJ0dWFsIGRvdWJsZSBHZXRWb2x1bWUoKSBPVkVSUklERTsKLQotIHByaXZhdGU6Ci0gIC8vIExvZ3MgdGhlIGVycm9yIGFuZCBpbnZva2VzIGFueSByZWdpc3RlcmVkIGNhbGxiYWNrcy4KLSAgdm9pZCBIYW5kbGVFcnJvcihjb25zdCBjaGFyKiBtZXRob2QsIGludCBlcnJvcik7Ci0KLSAgLy8gUmVhZHMgb25lIG9yIG1vcmUgYnVmZmVycyBvZiBhdWRpbyBmcm9tIHRoZSBkZXZpY2UsIHBhc3NlcyBvbiB0byB0aGUKLSAgLy8gcmVnaXN0ZXJlZCBjYWxsYmFjayBhbmQgc2NoZWR1bGVzIHRoZSBuZXh0IHJlYWQuCi0gIHZvaWQgUmVhZEF1ZGlvKCk7Ci0KLSAgLy8gUmVjb3ZlcnMgZnJvbSBhbnkgZGV2aWNlIGVycm9ycyBpZiBwb3NzaWJsZS4KLSAgYm9vbCBSZWNvdmVyKGludCBlcnJvcik7Ci0KLSAgLy8gVXRpbGl0eSBmdW5jdGlvbiBmb3IgdGFsa2luZyB3aXRoIHRoZSBBTFNBIEFQSS4KLSAgc25kX3BjbV9zZnJhbWVzX3QgR2V0Q3VycmVudERlbGF5KCk7Ci0KLSAgLy8gTm9uLXJlZmNvdW50ZWQgcG9pbnRlciBiYWNrIHRvIHRoZSBhdWRpbyBtYW5hZ2VyLgotICAvLyBUaGUgQXVkaW9NYW5hZ2VyIGluZGlyZWN0bHkgaG9sZHMgb24gdG8gc3RyZWFtIG9iamVjdHMsIHNvIHdlIGRvbid0Ci0gIC8vIHdhbnQgY2lyY3VsYXIgcmVmZXJlbmNlcy4gIEFkZGl0aW9uYWxseSwgc3RyZWFtIG9iamVjdHMgbGl2ZSBvbiB0aGUgYXVkaW8KLSAgLy8gdGhyZWFkLCB3aGljaCBpcyBvd25lZCBieSB0aGUgYXVkaW8gbWFuYWdlciBhbmQgd2UgZG9uJ3Qgd2FudCB0byBhZGRyZWYKLSAgLy8gdGhlIG1hbmFnZXIgZnJvbSB0aGF0IHRocmVhZC4KLSAgQXVkaW9NYW5hZ2VyTGludXgqIGF1ZGlvX21hbmFnZXJfOwotICBzdGQ6OnN0cmluZyBkZXZpY2VfbmFtZV87Ci0gIEF1ZGlvUGFyYW1ldGVycyBwYXJhbXNfOwotICBpbnQgYnl0ZXNfcGVyX2J1ZmZlcl87Ci0gIEFsc2FXcmFwcGVyKiB3cmFwcGVyXzsKLSAgaW50IGJ1ZmZlcl9kdXJhdGlvbl9tc187ICAvLyBMZW5ndGggb2YgZWFjaCByZWNvcmRlZCBidWZmZXIgaW4gbWlsbGlzZWNvbmRzLgotICBBdWRpb0lucHV0Q2FsbGJhY2sqIGNhbGxiYWNrXzsgIC8vIFZhbGlkIGR1cmluZyBhIHJlY29yZGluZyBzZXNzaW9uLgotICBiYXNlOjpUaW1lIG5leHRfcmVhZF90aW1lXzsgIC8vIFNjaGVkdWxlZCB0aW1lIGZvciB0aGUgbmV4dCByZWFkIGNhbGxiYWNrLgotICBzbmRfcGNtX3QqIGRldmljZV9oYW5kbGVfOyAgLy8gSGFuZGxlIHRvIHRoZSBBTFNBIFBDTSByZWNvcmRpbmcgZGV2aWNlLgotICBzbmRfbWl4ZXJfdCogbWl4ZXJfaGFuZGxlXzsgLy8gSGFuZGxlIHRvIHRoZSBBTFNBIG1pY3JvcGhvbmUgbWl4ZXIuCi0gIHNuZF9taXhlcl9lbGVtX3QqIG1peGVyX2VsZW1lbnRfaGFuZGxlXzsgLy8gSGFuZGxlIHRvIHRoZSBjYXB0dXJlIGVsZW1lbnQuCi0gIGJhc2U6OldlYWtQdHJGYWN0b3J5PEFsc2FQY21JbnB1dFN0cmVhbT4gd2Vha19mYWN0b3J5XzsKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiBhdWRpb19idWZmZXJfOyAgLy8gQnVmZmVyIHVzZWQgZm9yIHJlYWRpbmcgYXVkaW8gZGF0YS4KLSAgYm9vbCByZWFkX2NhbGxiYWNrX2JlaGluZF9zY2hlZHVsZV87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEFsc2FQY21JbnB1dFN0cmVhbSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9BVURJT19MSU5VWF9BTFNBX0lOUFVUX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vbGludXgvYWxzYV9vdXRwdXQuY2MgYi9zcmMvbWVkaWEvYXVkaW8vbGludXgvYWxzYV9vdXRwdXQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjODIyYjYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2xpbnV4L2Fsc2Ffb3V0cHV0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzk2ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0vLwotLy8gVEhSRUFEIFNBRkVUWQotLy8KLS8vIEFsc2FQY21PdXRwdXRTdHJlYW0gb2JqZWN0IGlzICpub3QqIHRocmVhZC1zYWZlIGFuZCBzaG91bGQgb25seSBiZSB1c2VkCi0vLyBmcm9tIHRoZSBhdWRpbyB0aHJlYWQuICBXZSBEQ0hFQ0sgb24gdGhpcyBhc3N1bXB0aW9uIHdoZW5ldmVyIHdlIGNhbi4KLS8vCi0vLyBTRU1BTlRJQ1MgT0YgQ2xvc2UoKQotLy8KLS8vIENsb3NlKCkgaXMgcmVzcG9uc2libGUgZm9yIGNsZWFuaW5nIHVwIGFueSByZXNvdXJjZXMgdGhhdCB3ZXJlIGFjcXVpcmVkIGFmdGVyCi0vLyBhIHN1Y2Nlc3NmdWwgT3BlbigpLiAgQ2xvc2UoKSB3aWxsIG51bGxpZnkgYW55IHNjaGVkdWxlZCBvdXRzdGFuZGluZyBydW5uYWJsZQotLy8gbWV0aG9kcy4KLS8vCi0vLwotLy8gU0VNQU5USUNTIE9GIEVSUk9SIFNUQVRFUwotLy8KLS8vIFRoZSBvYmplY3QgaGFzIHR3byBkaXN0aW5jdCBlcnJvciBzdGF0ZXM6IHxzdGF0ZV98ID09IGtJbkVycm9yCi0vLyBhbmQgfHN0b3Bfc3RyZWFtX3wuICBUaGUgfHN0b3Bfc3RyZWFtX3wgdmFyaWFibGUgaXMgdXNlZCB0byBpbmRpY2F0ZQotLy8gdGhhdCB0aGUgcGxheWJhY2tfaGFuZGxlIHNob3VsZCBubyBsb25nZXIgYmUgdXNlZCBlaXRoZXIgYmVjYXVzZSBvZiBhCi0vLyBoYXJkd2FyZS9sb3ctbGV2ZWwgZXZlbnQuCi0vLwotLy8gV2hlbiB8c3RhdGVffCA9PSBrSW5FcnJvciwgYWxsIHB1YmxpYyBBUEkgZnVuY3Rpb25zIHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yCi0vLyAoU3RhcnQoKSB3aWxsIGNhbGwgdGhlIE9uRXJyb3IoKSBmdW5jdGlvbiBvbiB0aGUgY2FsbGJhY2sgaW1tZWRpYXRlbHkpLCBvcgotLy8gbm8tb3AgdGhlbXNlbHZlcyB3aXRoIHRoZSBleGNlcHRpb24gb2YgQ2xvc2UoKS4gIEV2ZW4gaWYgYW4gZXJyb3Igc3RhdGUgaGFzCi0vLyBiZWVuIGVudGVyZWQsIGlmIE9wZW4oKSBoYXMgcHJldmlvdXNseSByZXR1cm5lZCBzdWNjZXNzZnVsbHksIENsb3NlKCkgbXVzdCBiZQotLy8gY2FsbGVkIHRvIGNsZWFudXAgdGhlIEFMU0EgZGV2aWNlcyBhbmQgcmVsZWFzZSByZXNvdXJjZXMuCi0vLwotLy8gV2hlbiB8c3RvcF9zdHJlYW1ffCBpcyBzZXQsIG5vIG1vcmUgY29tbWFuZHMgd2lsbCBiZSBtYWRlIGFnYWluc3QgdGhlCi0vLyBBTFNBIGRldmljZSwgYW5kIHBsYXliYWNrIHdpbGwgZWZmZWN0aXZlbHkgc3RvcC4gIEZyb20gdGhlIGNsaWVudCdzIHBvaW50IG9mCi0vLyB2aWV3LCBpdCB3aWxsIHNlZW0gdGhhdCB0aGUgZGV2aWNlIGhhcyBqdXN0IGNsb2dnZWQgYW5kIHN0b3BwZWQgcmVxdWVzdGluZwotLy8gZGF0YS4KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2xpbnV4L2Fsc2Ffb3V0cHV0LmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJiYXNlL3N0bF91dGlsLmgiCi0jaW5jbHVkZSAiYmFzZS90aW1lLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fdXRpbC5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2xpbnV4L2Fsc2FfdXRpbC5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2xpbnV4L2Fsc2Ffd3JhcHBlci5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2xpbnV4L2F1ZGlvX21hbmFnZXJfbGludXguaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2NoYW5uZWxfbWl4ZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RhdGFfYnVmZmVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zZWVrYWJsZV9idWZmZXIuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gQW1vdW50IG9mIHRpbWUgdG8gd2FpdCBpZiB3ZSd2ZSBleGhhdXN0ZWQgdGhlIGRhdGEgc291cmNlLiAgVGhpcyBpcyB0byBhdm9pZAotLy8gYnVzeSBsb29waW5nLgotc3RhdGljIGNvbnN0IHVpbnQzMiBrTm9EYXRhU2xlZXBNaWxsaXNlY29uZHMgPSAxMDsKLQotLy8gTWluaW51bSBpbnRlcnZhbCBiZXR3ZWVuIE9uTW9yZURhdGEoKSBjYWxscy4gIFRoaXMgaXMgdG8gYXZvaWQgZ2xpdGNoZXMgZm9yCi0vLyBXZWJBdWRpbyB3aGljaCBuZWVkcyB0aW1lIHRvIGdlbmVyYXRlIG5ldyBkYXRhLgotc3RhdGljIGNvbnN0IHVpbnQzMiBrTWluSW50ZXJ2YWxCZXR3ZWVuT25Nb3JlRGF0YUNhbGxzSW5NcyA9IDU7Ci0KLS8vIEFjY29yZGluZyB0byB0aGUgbGludXggbmFub3NsZWVwIG1hbnBhZ2UsIG5hbm9zbGVlcCBvbiBsaW51eCBjYW4gbWlzcyB0aGUKLS8vIGRlYWRsaW5lIGJ5IHVwIHRvIDEwbXMgYmVjYXVzZSB0aGUga2VybmVsIHRpbWVzbGljZSBpcyAxMG1zLiAgVGhpcyBzaG91bGQgYmUKLS8vIGVub3VnaCB0byBjb21wZW5zYXRlIGZvciB0aGUgdGltZXNsaWNlLCBhbmQgYW55IGFkZGl0aW9uYWwgc2xvd2Rvd25zLgotc3RhdGljIGNvbnN0IHVpbnQzMiBrU2xlZXBFcnJvck1pbGxpc2Vjb25kcyA9IDEwOwotCi0vLyBTZXQgdG8gMCBkdXJpbmcgZGVidWdnaW5nIGlmIHlvdSB3YW50IGVycm9yIG1lc3NhZ2VzIGR1ZSB0byB1bmRlcnJ1bgotLy8gZXZlbnRzIG9yIG90aGVyIHJlY292ZXJhYmxlIGVycm9ycy4KLSNpZiBkZWZpbmVkKE5ERUJVRykKLXN0YXRpYyBjb25zdCBpbnQga1BjbVJlY292ZXJJc1NpbGVudCA9IDE7Ci0jZWxzZQotc3RhdGljIGNvbnN0IGludCBrUGNtUmVjb3ZlcklzU2lsZW50ID0gMDsKLSNlbmRpZgotCi0vLyBXaGlsZSB0aGUgImRlZmF1bHQiIGRldmljZSBtYXkgc3VwcG9ydCBtdWx0aS1jaGFubmVsIGF1ZGlvLCBpbiBBbHNhLCBvbmx5Ci0vLyB0aGUgZGV2aWNlIG5hbWVzIHN1cnJvdW5kNDAsIHN1cnJvdW5kNDEsIHN1cnJvdW5kNTAsIGV0YywgaGF2ZSBhIGRlZmluZWQKLS8vIGNoYW5uZWwgbWFwcGluZyBhY2NvcmRpbmcgdG8gTGVubmFydDoKLS8vCi0vLyBodHRwOi8vMHBvaW50ZXIuZGUvYmxvZy9wcm9qZWN0cy9ndWlkZS10by1zb3VuZC1hcGlzLmh0bWwKLS8vCi0vLyBUaGlzIGZ1bmN0aW9uIG1ha2VzIGEgYmVzdCBndWVzcyBhdCB0aGUgc3BlY2lmaWMgPiAyIGNoYW5uZWwgZGV2aWNlIG5hbWUKLS8vIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgcmVxdWVzdGVkLiAgTlVMTCBpcyByZXR1cm5lZCBpZiBubyBkZXZpY2UKLS8vIGNhbiBiZSBmb3VuZCB0byBtYXRjaCB0aGUgY2hhbm5lbCBudW1iZXJzLiAgSW4gdGhpcyBjYXNlLCB1c2luZwotLy8ga0RlZmF1bHREZXZpY2UgaXMgcHJvYmFibHkgdGhlIGJlc3QgYmV0LgotLy8KLS8vIEEgZml2ZSBjaGFubmVsIHNvdXJjZSBpcyBhc3N1bWVkIHRvIGJlIHN1cnJvdW5kNTAgaW5zdGVhZCBvZiBzdXJyb3VuZDQxCi0vLyAod2hpY2ggaXMgYWxzbyA1IGNoYW5uZWxzKS4KLS8vCi0vLyBUT0RPKGFqd29uZyk6IFRoZSBzb3VyY2UgZGF0YSBzaG91bGQgaGF2ZSBlbm91Z2ggaW5mbyB0byB0ZWxsIHVzIGlmIHdlIHdhbnQKLS8vIHN1cnJvdW5kNDEgdmVyc3VzIHN1cnJvdW5kNTEsIGV0Yy4sIGluc3RlYWQgb2YgbmVlZGluZyB1cyB0byBndWVzcyBiYXNlZCBvbgotLy8gY2hhbm5lbCBudW1iZXIuICBGaXggQVBJIHRvIHBhc3MgdGhhdCBkYXRhIGRvd24uCi1zdGF0aWMgY29uc3QgY2hhciogR3Vlc3NTcGVjaWZpY0RldmljZU5hbWUodWludDMyIGNoYW5uZWxzKSB7Ci0gIHN3aXRjaCAoY2hhbm5lbHMpIHsKLSAgICBjYXNlIDg6Ci0gICAgICByZXR1cm4gInN1cnJvdW5kNzEiOwotCi0gICAgY2FzZSA3OgotICAgICAgcmV0dXJuICJzdXJyb3VuZDcwIjsKLQotICAgIGNhc2UgNjoKLSAgICAgIHJldHVybiAic3Vycm91bmQ1MSI7Ci0KLSAgICBjYXNlIDU6Ci0gICAgICByZXR1cm4gInN1cnJvdW5kNTAiOwotCi0gICAgY2FzZSA0OgotICAgICAgcmV0dXJuICJzdXJyb3VuZDQwIjsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgfQotfQotCi1zdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBBbHNhUGNtT3V0cHV0U3RyZWFtOjpJbnRlcm5hbFN0YXRlIHN0YXRlKSB7Ci0gIHN3aXRjaCAoc3RhdGUpIHsKLSAgICBjYXNlIEFsc2FQY21PdXRwdXRTdHJlYW06OmtJbkVycm9yOgotICAgICAgb3MgPDwgImtJbkVycm9yIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQWxzYVBjbU91dHB1dFN0cmVhbTo6a0NyZWF0ZWQ6Ci0gICAgICBvcyA8PCAia0NyZWF0ZWQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBbHNhUGNtT3V0cHV0U3RyZWFtOjprSXNPcGVuZWQ6Ci0gICAgICBvcyA8PCAia0lzT3BlbmVkIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQWxzYVBjbU91dHB1dFN0cmVhbTo6a0lzUGxheWluZzoKLSAgICAgIG9zIDw8ICJrSXNQbGF5aW5nIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQWxzYVBjbU91dHB1dFN0cmVhbTo6a0lzU3RvcHBlZDoKLSAgICAgIG9zIDw8ICJrSXNTdG9wcGVkIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQWxzYVBjbU91dHB1dFN0cmVhbTo6a0lzQ2xvc2VkOgotICAgICAgb3MgPDwgImtJc0Nsb3NlZCI7Ci0gICAgICBicmVhazsKLSAgfTsKLSAgcmV0dXJuIG9zOwotfQotCi1jb25zdCBjaGFyIEFsc2FQY21PdXRwdXRTdHJlYW06OmtEZWZhdWx0RGV2aWNlW10gPSAiZGVmYXVsdCI7Ci1jb25zdCBjaGFyIEFsc2FQY21PdXRwdXRTdHJlYW06OmtBdXRvU2VsZWN0RGV2aWNlW10gPSAiIjsKLWNvbnN0IGNoYXIgQWxzYVBjbU91dHB1dFN0cmVhbTo6a1BsdWdQcmVmaXhbXSA9ICJwbHVnOiI7Ci0KLS8vIFdlIHVzZSA0MG1zIGFzIG91ciBtaW5pbXVtIHJlcXVpcmVkIGxhdGVuY3kuIElmIGl0IGlzIG5lZWRlZCwgd2UgbWF5IGJlIGFibGUKLS8vIHRvIGdldCBpdCBkb3duIHRvIDIwbXMuCi1jb25zdCB1aW50MzIgQWxzYVBjbU91dHB1dFN0cmVhbTo6a01pbkxhdGVuY3lNaWNyb3MgPSA0MCAqIDEwMDA7Ci0KLUFsc2FQY21PdXRwdXRTdHJlYW06OkFsc2FQY21PdXRwdXRTdHJlYW0oY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxzYVdyYXBwZXIqIHdyYXBwZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWFuYWdlckxpbnV4KiBtYW5hZ2VyKQotICAgIDogcmVxdWVzdGVkX2RldmljZV9uYW1lXyhkZXZpY2VfbmFtZSksCi0gICAgICBwY21fZm9ybWF0XyhhbHNhX3V0aWw6OkJpdHNUb0Zvcm1hdChwYXJhbXMuYml0c19wZXJfc2FtcGxlKCkpKSwKLSAgICAgIGNoYW5uZWxzXyhwYXJhbXMuY2hhbm5lbHMoKSksCi0gICAgICBjaGFubmVsX2xheW91dF8ocGFyYW1zLmNoYW5uZWxfbGF5b3V0KCkpLAotICAgICAgc2FtcGxlX3JhdGVfKHBhcmFtcy5zYW1wbGVfcmF0ZSgpKSwKLSAgICAgIGJ5dGVzX3Blcl9zYW1wbGVfKHBhcmFtcy5iaXRzX3Blcl9zYW1wbGUoKSAvIDgpLAotICAgICAgYnl0ZXNfcGVyX2ZyYW1lXyhjaGFubmVsc18gKiBwYXJhbXMuYml0c19wZXJfc2FtcGxlKCkgLyA4KSwKLSAgICAgIHBhY2tldF9zaXplXyhwYXJhbXMuR2V0Qnl0ZXNQZXJCdWZmZXIoKSksCi0gICAgICBtaWNyb3NfcGVyX3BhY2tldF8oRnJhbWVzVG9NaWNyb3MoCi0gICAgICAgICAgcGFyYW1zLmZyYW1lc19wZXJfYnVmZmVyKCksIHNhbXBsZV9yYXRlXykpLAotICAgICAgbGF0ZW5jeV9taWNyb3NfKHN0ZDo6bWF4KEFsc2FQY21PdXRwdXRTdHJlYW06OmtNaW5MYXRlbmN5TWljcm9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pY3Jvc19wZXJfcGFja2V0XyAqIDIpKSwKLSAgICAgIGJ5dGVzX3Blcl9vdXRwdXRfZnJhbWVfKGJ5dGVzX3Blcl9mcmFtZV8pLAotICAgICAgYWxzYV9idWZmZXJfZnJhbWVzXygwKSwKLSAgICAgIHN0b3Bfc3RyZWFtXyhmYWxzZSksCi0gICAgICB3cmFwcGVyXyh3cmFwcGVyKSwKLSAgICAgIG1hbmFnZXJfKG1hbmFnZXIpLAotICAgICAgbWVzc2FnZV9sb29wXyhNZXNzYWdlTG9vcDo6Y3VycmVudCgpKSwKLSAgICAgIHBsYXliYWNrX2hhbmRsZV8oTlVMTCksCi0gICAgICBmcmFtZXNfcGVyX3BhY2tldF8ocGFja2V0X3NpemVfIC8gYnl0ZXNfcGVyX2ZyYW1lXyksCi0gICAgICBBTExPV19USElTX0lOX0lOSVRJQUxJWkVSX0xJU1Qod2Vha19mYWN0b3J5Xyh0aGlzKSksCi0gICAgICBzdGF0ZV8oa0NyZWF0ZWQpLAotICAgICAgdm9sdW1lXygxLjBmKSwKLSAgICAgIHNvdXJjZV9jYWxsYmFja18oTlVMTCksCi0gICAgICBhdWRpb19idXNfKEF1ZGlvQnVzOjpDcmVhdGUocGFyYW1zKSkgewotICBEQ0hFQ0sobWFuYWdlcl8tPkdldE1lc3NhZ2VMb29wKCktPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIERDSEVDS19FUShhdWRpb19idXNfLT5mcmFtZXMoKSAqIGJ5dGVzX3Blcl9mcmFtZV8sIHBhY2tldF9zaXplXyk7Ci0KLSAgLy8gU2FuaXR5IGNoZWNrIGlucHV0IHZhbHVlcy4KLSAgaWYgKCFwYXJhbXMuSXNWYWxpZCgpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJVbnN1cHBvcnRlZCBhdWRpbyBwYXJhbWV0ZXJzLiI7Ci0gICAgVHJhbnNpdGlvblRvKGtJbkVycm9yKTsKLSAgfQotCi0gIGlmIChwY21fZm9ybWF0XyA9PSBTTkRfUENNX0ZPUk1BVF9VTktOT1dOKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJVbnN1cHBvcnRlZCBiaXRzIHBlciBzYW1wbGU6ICIgPDwgcGFyYW1zLmJpdHNfcGVyX3NhbXBsZSgpOwotICAgIFRyYW5zaXRpb25UbyhrSW5FcnJvcik7Ci0gIH0KLX0KLQotQWxzYVBjbU91dHB1dFN0cmVhbTo6fkFsc2FQY21PdXRwdXRTdHJlYW0oKSB7Ci0gIEludGVybmFsU3RhdGUgY3VycmVudF9zdGF0ZSA9IHN0YXRlKCk7Ci0gIERDSEVDSyhjdXJyZW50X3N0YXRlID09IGtDcmVhdGVkIHx8Ci0gICAgICAgICBjdXJyZW50X3N0YXRlID09IGtJc0Nsb3NlZCB8fAotICAgICAgICAgY3VycmVudF9zdGF0ZSA9PSBrSW5FcnJvcik7Ci0gIERDSEVDSyghcGxheWJhY2tfaGFuZGxlXyk7Ci19Ci0KLWJvb2wgQWxzYVBjbU91dHB1dFN0cmVhbTo6T3BlbigpIHsKLSAgRENIRUNLKElzT25BdWRpb1RocmVhZCgpKTsKLQotICBpZiAoc3RhdGUoKSA9PSBrSW5FcnJvcikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFDYW5UcmFuc2l0aW9uVG8oa0lzT3BlbmVkKSkgewotICAgIE5PVFJFQUNIRUQoKSA8PCAiSW52YWxpZCBzdGF0ZTogIiA8PCBzdGF0ZSgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFdlIGRvIG5vdCBuZWVkIHRvIGNoZWNrIGlmIHRoZSB0cmFuc2l0aW9uIHdhcyBzdWNjZXNzZnVsIGJlY2F1c2UKLSAgLy8gQ2FuVHJhbnNpdGlvblRvKCkgd2FzIGNoZWNrZWQgYWJvdmUsIGFuZCBpdCBpcyBhc3N1bWVkIHRoYXQgdGhpcwotICAvLyBvYmplY3QncyBwdWJsaWMgQVBJIGlzIG9ubHkgY2FsbGVkIG9uIG9uZSB0aHJlYWQgc28gdGhlIHN0YXRlIGNhbm5vdAotICAvLyB0cmFuc2l0aW9uIG91dCBmcm9tIHVuZGVyIHVzLgotICBUcmFuc2l0aW9uVG8oa0lzT3BlbmVkKTsKLQotICAvLyBUcnkgdG8gb3BlbiB0aGUgZGV2aWNlLgotICBpZiAocmVxdWVzdGVkX2RldmljZV9uYW1lXyA9PSBrQXV0b1NlbGVjdERldmljZSkgewotICAgIHBsYXliYWNrX2hhbmRsZV8gPSBBdXRvU2VsZWN0RGV2aWNlKGxhdGVuY3lfbWljcm9zXyk7Ci0gICAgaWYgKHBsYXliYWNrX2hhbmRsZV8pCi0gICAgICBEVkxPRygxKSA8PCAiQXV0by1zZWxlY3RlZCBkZXZpY2U6ICIgPDwgZGV2aWNlX25hbWVfOwotICB9IGVsc2UgewotICAgIGRldmljZV9uYW1lXyA9IHJlcXVlc3RlZF9kZXZpY2VfbmFtZV87Ci0gICAgcGxheWJhY2tfaGFuZGxlXyA9IGFsc2FfdXRpbDo6T3BlblBsYXliYWNrRGV2aWNlKAotICAgICAgICB3cmFwcGVyXywgZGV2aWNlX25hbWVfLmNfc3RyKCksIGNoYW5uZWxzXywgc2FtcGxlX3JhdGVfLAotICAgICAgICBwY21fZm9ybWF0XywgbGF0ZW5jeV9taWNyb3NfKTsKLSAgfQotCi0gIC8vIEZpbmlzaCBpbml0aWFsaXppbmcgdGhlIHN0cmVhbSBpZiB0aGUgZGV2aWNlIHdhcyBvcGVuZWQgc3VjY2Vzc2Z1bGx5LgotICBpZiAocGxheWJhY2tfaGFuZGxlXyA9PSBOVUxMKSB7Ci0gICAgc3RvcF9zdHJlYW1fID0gdHJ1ZTsKLSAgICBUcmFuc2l0aW9uVG8oa0luRXJyb3IpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIHsKLSAgICBieXRlc19wZXJfb3V0cHV0X2ZyYW1lXyA9IGNoYW5uZWxfbWl4ZXJfID8KLSAgICAgICAgbWl4ZWRfYXVkaW9fYnVzXy0+Y2hhbm5lbHMoKSAqIGJ5dGVzX3Blcl9zYW1wbGVfIDogYnl0ZXNfcGVyX2ZyYW1lXzsKLSAgICB1aW50MzIgb3V0cHV0X3BhY2tldF9zaXplID0gZnJhbWVzX3Blcl9wYWNrZXRfICogYnl0ZXNfcGVyX291dHB1dF9mcmFtZV87Ci0gICAgYnVmZmVyXy5yZXNldChuZXcgbWVkaWE6OlNlZWthYmxlQnVmZmVyKDAsIG91dHB1dF9wYWNrZXRfc2l6ZSkpOwotCi0gICAgLy8gR2V0IGFsc2EgYnVmZmVyIHNpemUuCi0gICAgc25kX3BjbV91ZnJhbWVzX3QgYnVmZmVyX3NpemU7Ci0gICAgc25kX3BjbV91ZnJhbWVzX3QgcGVyaW9kX3NpemU7Ci0gICAgaW50IGVycm9yID0gd3JhcHBlcl8tPlBjbUdldFBhcmFtcyhwbGF5YmFja19oYW5kbGVfLCAmYnVmZmVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVyaW9kX3NpemUpOwotICAgIGlmIChlcnJvciA8IDApIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBnZXQgcGxheWJhY2sgYnVmZmVyIHNpemUgZnJvbSBBTFNBOiAiCi0gICAgICAgICAgICAgICAgIDw8IHdyYXBwZXJfLT5TdHJFcnJvcihlcnJvcik7Ci0gICAgICAvLyBCdWZmZXIgc2l6ZSBpcyBhdCBsZWFzdCB0d2ljZSBvZiBwYWNrZXQgc2l6ZS4KLSAgICAgIGFsc2FfYnVmZmVyX2ZyYW1lc18gPSBmcmFtZXNfcGVyX3BhY2tldF8gKiAyOwotICAgIH0gZWxzZSB7Ci0gICAgICBhbHNhX2J1ZmZlcl9mcmFtZXNfID0gYnVmZmVyX3NpemU7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQWxzYVBjbU91dHB1dFN0cmVhbTo6Q2xvc2UoKSB7Ci0gIERDSEVDSyhJc09uQXVkaW9UaHJlYWQoKSk7Ci0KLSAgaWYgKHN0YXRlKCkgIT0ga0lzQ2xvc2VkKQotICAgIFRyYW5zaXRpb25UbyhrSXNDbG9zZWQpOwotCi0gIC8vIFNodXRkb3duIHRoZSBhdWRpbyBkZXZpY2UuCi0gIGlmIChwbGF5YmFja19oYW5kbGVfKSB7Ci0gICAgaWYgKGFsc2FfdXRpbDo6Q2xvc2VEZXZpY2Uod3JhcHBlcl8sIHBsYXliYWNrX2hhbmRsZV8pIDwgMCkgewotICAgICAgTE9HKFdBUk5JTkcpIDw8ICJVbmFibGUgdG8gY2xvc2UgYXVkaW8gZGV2aWNlLiBMZWFraW5nIGhhbmRsZS4iOwotICAgIH0KLSAgICBwbGF5YmFja19oYW5kbGVfID0gTlVMTDsKLQotICAgIC8vIFJlbGVhc2UgdGhlIGJ1ZmZlci4KLSAgICBidWZmZXJfLnJlc2V0KCk7Ci0KLSAgICAvLyBTaWduYWwgYW55dGhpbmcgdGhhdCBtaWdodCBhbHJlYWR5IGJlIHNjaGVkdWxlZCB0byBzdG9wLgotICAgIHN0b3Bfc3RyZWFtXyA9IHRydWU7ICAvLyBOb3QgbmVjZXNzYXJ5IGluIHByb2R1Y3Rpb24sIGJ1dCB1bml0IHRlc3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZXMgdGhlIGZsYWcgdG8gdmVyaWZ5IHRoYXQgc3RyZWFtIHdhcyBjbG9zZWQuCi0gIH0KLQotICB3ZWFrX2ZhY3RvcnlfLkludmFsaWRhdGVXZWFrUHRycygpOwotCi0gIC8vIFNpZ25hbCB0byB0aGUgbWFuYWdlciB0aGF0IHdlJ3JlIGNsb3NlZCBhbmQgY2FuIGJlIHJlbW92ZWQuCi0gIC8vIFNob3VsZCBiZSBsYXN0IGNhbGwgaW4gdGhlIG1ldGhvZCBhcyBpdCBkZWxldGVzICJ0aGlzIi4KLSAgbWFuYWdlcl8tPlJlbGVhc2VPdXRwdXRTdHJlYW0odGhpcyk7Ci19Ci0KLXZvaWQgQWxzYVBjbU91dHB1dFN0cmVhbTo6U3RhcnQoQXVkaW9Tb3VyY2VDYWxsYmFjayogY2FsbGJhY2spIHsKLSAgRENIRUNLKElzT25BdWRpb1RocmVhZCgpKTsKLQotICBDSEVDSyhjYWxsYmFjayk7Ci0KLSAgaWYgKHN0b3Bfc3RyZWFtXykKLSAgICByZXR1cm47Ci0KLSAgc2V0X3NvdXJjZV9jYWxsYmFjayhjYWxsYmFjayk7Ci0KLSAgLy8gT25seSBwb3N0IHRoZSB0YXNrIGlmIHdlIGNhbiBlbnRlciB0aGUgcGxheWluZyBzdGF0ZS4KLSAgaWYgKFRyYW5zaXRpb25UbyhrSXNQbGF5aW5nKSA9PSBrSXNQbGF5aW5nKSB7Ci0gICAgLy8gQmVmb3JlIHN0YXJ0aW5nLCB0aGUgYnVmZmVyIG1pZ2h0IGhhdmUgYXVkaW8gZnJvbSBwcmV2aW91cyB1c2VyIG9mIHRoaXMKLSAgICAvLyBkZXZpY2UuCi0gICAgYnVmZmVyXy0+Q2xlYXIoKTsKLQotICAgIC8vIFdoZW4gc3RhcnRpbmcgYWdhaW4sIGRyb3AgYWxsIHBhY2tldHMgaW4gdGhlIGRldmljZSBhbmQgcHJlcGFyZSBpdCBhZ2FpbgotICAgIC8vIGluIGNhc2Ugd2UgYXJlIHJlc3RhcnRpbmcgZnJvbSBhIHBhdXNlIHN0YXRlIGFuZCBuZWVkIHRvIGZsdXNoIG9sZCBkYXRhLgotICAgIGludCBlcnJvciA9IHdyYXBwZXJfLT5QY21Ecm9wKHBsYXliYWNrX2hhbmRsZV8pOwotICAgIGlmIChlcnJvciA8IDAgJiYgZXJyb3IgIT0gLUVBR0FJTikgewotICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbHVyZSBjbGVhcmluZyBwbGF5YmFjayBkZXZpY2UgKCIKLSAgICAgICAgICAgICAgICAgPDwgd3JhcHBlcl8tPlBjbU5hbWUocGxheWJhY2tfaGFuZGxlXykgPDwgIik6ICIKLSAgICAgICAgICAgICAgICAgPDwgd3JhcHBlcl8tPlN0ckVycm9yKGVycm9yKTsKLSAgICAgIHN0b3Bfc3RyZWFtXyA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGVycm9yID0gd3JhcHBlcl8tPlBjbVByZXBhcmUocGxheWJhY2tfaGFuZGxlXyk7Ci0gICAgICBpZiAoZXJyb3IgPCAwICYmIGVycm9yICE9IC1FQUdBSU4pIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbHVyZSBwcmVwYXJpbmcgc3RyZWFtICgiCi0gICAgICAgICAgICAgICAgICAgPDwgd3JhcHBlcl8tPlBjbU5hbWUocGxheWJhY2tfaGFuZGxlXykgPDwgIik6ICIKLSAgICAgICAgICAgICAgICAgICA8PCB3cmFwcGVyXy0+U3RyRXJyb3IoZXJyb3IpOwotICAgICAgICBzdG9wX3N0cmVhbV8gPSB0cnVlOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICghc3RvcF9zdHJlYW1fKQotICAgICAgV3JpdGVUYXNrKCk7Ci0gIH0KLX0KLQotdm9pZCBBbHNhUGNtT3V0cHV0U3RyZWFtOjpTdG9wKCkgewotICBEQ0hFQ0soSXNPbkF1ZGlvVGhyZWFkKCkpOwotCi0gIC8vIFJlc2V0IHRoZSBjYWxsYmFjaywgc28gdGhhdCBpdCBpcyBub3QgY2FsbGVkIGFueW1vcmUuCi0gIHNldF9zb3VyY2VfY2FsbGJhY2soTlVMTCk7Ci0KLSAgVHJhbnNpdGlvblRvKGtJc1N0b3BwZWQpOwotfQotCi12b2lkIEFsc2FQY21PdXRwdXRTdHJlYW06OlNldFZvbHVtZShkb3VibGUgdm9sdW1lKSB7Ci0gIERDSEVDSyhJc09uQXVkaW9UaHJlYWQoKSk7Ci0KLSAgdm9sdW1lXyA9IHN0YXRpY19jYXN0PGZsb2F0Pih2b2x1bWUpOwotfQotCi12b2lkIEFsc2FQY21PdXRwdXRTdHJlYW06OkdldFZvbHVtZShkb3VibGUqIHZvbHVtZSkgewotICBEQ0hFQ0soSXNPbkF1ZGlvVGhyZWFkKCkpOwotCi0gICp2b2x1bWUgPSB2b2x1bWVfOwotfQotCi12b2lkIEFsc2FQY21PdXRwdXRTdHJlYW06OkJ1ZmZlclBhY2tldChib29sKiBzb3VyY2VfZXhoYXVzdGVkKSB7Ci0gIERDSEVDSyhJc09uQXVkaW9UaHJlYWQoKSk7Ci0KLSAgLy8gSWYgc3RvcHBlZCwgc2ltdWxhdGUgYSAwLWxlbmd0aCBwYWNrZXQuCi0gIGlmIChzdG9wX3N0cmVhbV8pIHsKLSAgICBidWZmZXJfLT5DbGVhcigpOwotICAgICpzb3VyY2VfZXhoYXVzdGVkID0gdHJ1ZTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAqc291cmNlX2V4aGF1c3RlZCA9IGZhbHNlOwotCi0gIC8vIFJlcXVlc3QgbW9yZSBkYXRhIG9ubHkgd2hlbiB3ZSBydW4gb3V0IG9mIGRhdGEgaW4gdGhlIGJ1ZmZlciwgYmVjYXVzZQotICAvLyBXcml0ZVBhY2tldCgpIGNvbXN1bWVzIG9ubHkgdGhlIGN1cnJlbnQgY2h1bmsgb2YgZGF0YS4KLSAgaWYgKCFidWZmZXJfLT5mb3J3YXJkX2J5dGVzKCkpIHsKLSAgICAvLyBCZWZvcmUgbWFraW5nIGEgcmVxdWVzdCB0byBzb3VyY2UgZm9yIGRhdGEgd2UgbmVlZCB0byBkZXRlcm1pbmUgdGhlCi0gICAgLy8gZGVsYXkgKGluIGJ5dGVzKSBmb3IgdGhlIHJlcXVlc3RlZCBkYXRhIHRvIGJlIHBsYXllZC4KLQotICAgIHVpbnQzMiBidWZmZXJfZGVsYXkgPSBidWZmZXJfLT5mb3J3YXJkX2J5dGVzKCkgKiBieXRlc19wZXJfZnJhbWVfIC8KLSAgICAgICAgYnl0ZXNfcGVyX291dHB1dF9mcmFtZV87Ci0KLSAgICB1aW50MzIgaGFyZHdhcmVfZGVsYXkgPSBHZXRDdXJyZW50RGVsYXkoKSAqIGJ5dGVzX3Blcl9mcmFtZV87Ci0KLSAgICBzY29wZWRfcmVmcHRyPG1lZGlhOjpEYXRhQnVmZmVyPiBwYWNrZXQgPQotICAgICAgICBuZXcgbWVkaWE6OkRhdGFCdWZmZXIocGFja2V0X3NpemVfKTsKLSAgICBpbnQgZnJhbWVzX2ZpbGxlZCA9IFJ1bkRhdGFDYWxsYmFjaygKLSAgICAgICAgYXVkaW9fYnVzXy5nZXQoKSwgQXVkaW9CdWZmZXJzU3RhdGUoYnVmZmVyX2RlbGF5LCBoYXJkd2FyZV9kZWxheSkpOwotICAgIHNpemVfdCBwYWNrZXRfc2l6ZSA9IGZyYW1lc19maWxsZWQgKiBieXRlc19wZXJfZnJhbWVfOwotICAgIERDSEVDS19MRShwYWNrZXRfc2l6ZSwgcGFja2V0X3NpemVfKTsKLQotICAgIC8vIFJlc2V0IHRoZSB8bGFzdF9maWxsX3RpbWV8IHRvIGF2b2lkIGJhY2sgdG8gYmFjayBSdW5EYXRhQ2FsbGJhY2soKS4KLSAgICBsYXN0X2ZpbGxfdGltZV8gPSBiYXNlOjpUaW1lOjpOb3coKTsKLQotICAgIC8vIFRPRE8oZGFsZWN1cnRpcyk6IENoYW5uZWwgZG93bm1peGluZywgdXBtaXhpbmcsIHNob3VsZCBiZSBkb25lIGluIG1peGVyOwotICAgIC8vIHZvbHVtZSBhZGp1c3Qgc2hvdWxkIHVzZSBTU0Ugb3B0aW1pemVkIHZlY3Rvcl9mbXVsKCkgcHJpb3IgdG8gaW50ZXJsZWF2ZS4KLSAgICBBdWRpb0J1cyogb3V0cHV0X2J1cyA9IGF1ZGlvX2J1c18uZ2V0KCk7Ci0gICAgaWYgKGNoYW5uZWxfbWl4ZXJfKSB7Ci0gICAgICBvdXRwdXRfYnVzID0gbWl4ZWRfYXVkaW9fYnVzXy5nZXQoKTsKLSAgICAgIGNoYW5uZWxfbWl4ZXJfLT5UcmFuc2Zvcm0oYXVkaW9fYnVzXy5nZXQoKSwgb3V0cHV0X2J1cyk7Ci0gICAgICAvLyBBZGp1c3QgcGFja2V0IHNpemUgZm9yIGRvd25taXguCi0gICAgICBwYWNrZXRfc2l6ZSA9IHBhY2tldF9zaXplIC8gYnl0ZXNfcGVyX2ZyYW1lXyAqIGJ5dGVzX3Blcl9vdXRwdXRfZnJhbWVfOwotICAgIH0KLQotICAgIC8vIE5vdGU6IElmIHRoaXMgZXZlciBjaGFuZ2VzIHRvIG91dHB1dCByYXcgZmxvYXQgdGhlIGRhdGEgbXVzdCBiZSBjbGlwcGVkCi0gICAgLy8gYW5kIHNhbml0aXplZCBzaW5jZSBpdCBtYXkgY29tZSBmcm9tIGFuIHVudHJ1c3RlZCBzb3VyY2Ugc3VjaCBhcyBOYUNsLgotICAgIG91dHB1dF9idXMtPlRvSW50ZXJsZWF2ZWQoCi0gICAgICAgIGZyYW1lc19maWxsZWQsIGJ5dGVzX3Blcl9zYW1wbGVfLCBwYWNrZXQtPkdldFdyaXRhYmxlRGF0YSgpKTsKLQotICAgIG1lZGlhOjpBZGp1c3RWb2x1bWUocGFja2V0LT5HZXRXcml0YWJsZURhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2J1cy0+Y2hhbm5lbHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3Blcl9zYW1wbGVfLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lXyk7Ci0KLSAgICBpZiAocGFja2V0X3NpemUgPiAwKSB7Ci0gICAgICBwYWNrZXQtPlNldERhdGFTaXplKHBhY2tldF9zaXplKTsKLSAgICAgIC8vIEFkZCB0aGUgcGFja2V0IHRvIHRoZSBidWZmZXIuCi0gICAgICBidWZmZXJfLT5BcHBlbmQocGFja2V0KTsKLSAgICB9IGVsc2UgewotICAgICAgKnNvdXJjZV9leGhhdXN0ZWQgPSB0cnVlOwotICAgIH0KLSAgfQotfQotCi12b2lkIEFsc2FQY21PdXRwdXRTdHJlYW06OldyaXRlUGFja2V0KCkgewotICBEQ0hFQ0soSXNPbkF1ZGlvVGhyZWFkKCkpOwotCi0gIC8vIElmIHRoZSBkZXZpY2UgaXMgaW4gZXJyb3IsIGp1c3QgZWF0IHRoZSBieXRlcy4KLSAgaWYgKHN0b3Bfc3RyZWFtXykgewotICAgIGJ1ZmZlcl8tPkNsZWFyKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHN0YXRlKCkgIT0ga0lzUGxheWluZykKLSAgICByZXR1cm47Ci0KLSAgQ0hFQ0tfRVEoYnVmZmVyXy0+Zm9yd2FyZF9ieXRlcygpICUgYnl0ZXNfcGVyX291dHB1dF9mcmFtZV8sIDB1KTsKLQotICBjb25zdCB1aW50OCogYnVmZmVyX2RhdGE7Ci0gIGludCBidWZmZXJfc2l6ZTsKLSAgaWYgKGJ1ZmZlcl8tPkdldEN1cnJlbnRDaHVuaygmYnVmZmVyX2RhdGEsICZidWZmZXJfc2l6ZSkpIHsKLSAgICBidWZmZXJfc2l6ZSA9IGJ1ZmZlcl9zaXplIC0gKGJ1ZmZlcl9zaXplICUgYnl0ZXNfcGVyX291dHB1dF9mcmFtZV8pOwotICAgIHNuZF9wY21fc2ZyYW1lc190IGZyYW1lcyA9IHN0ZDo6bWluKAotICAgICAgICBzdGF0aWNfY2FzdDxzbmRfcGNtX3NmcmFtZXNfdD4oYnVmZmVyX3NpemUgLyBieXRlc19wZXJfb3V0cHV0X2ZyYW1lXyksCi0gICAgICAgIEdldEF2YWlsYWJsZUZyYW1lcygpKTsKLQotICAgIHNuZF9wY21fc2ZyYW1lc190IGZyYW1lc193cml0dGVuID0KLSAgICAgICAgd3JhcHBlcl8tPlBjbVdyaXRlaShwbGF5YmFja19oYW5kbGVfLCBidWZmZXJfZGF0YSwgZnJhbWVzKTsKLSAgICBpZiAoZnJhbWVzX3dyaXR0ZW4gPCAwKSB7Ci0gICAgICAvLyBBdHRlbXB0IG9uY2UgdG8gaW1tZWRpYXRlbHkgcmVjb3ZlciBmcm9tIEVJTlRSLAotICAgICAgLy8gRVBJUEUgKG92ZXJydW4vdW5kZXJydW4pLCBFU1RSUElQRSAoc3RyZWFtIHN1c3BlbmRlZCkuICBXcml0ZVBhY2tldAotICAgICAgLy8gd2lsbCBldmVudHVhbGx5IGJlIGNhbGxlZCBhZ2Fpbiwgc28gZXZlbnR1YWwgcmVjb3Zlcnkgd2lsbCBoYXBwZW4gaWYKLSAgICAgIC8vIG11bGlwbGUgcmV0cmllcyBhcmUgcmVxdWlyZWQuCi0gICAgICBmcmFtZXNfd3JpdHRlbiA9IHdyYXBwZXJfLT5QY21SZWNvdmVyKHBsYXliYWNrX2hhbmRsZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc193cml0dGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUGNtUmVjb3ZlcklzU2lsZW50KTsKLSAgICAgIGlmIChmcmFtZXNfd3JpdHRlbiA8IDApIHsKLSAgICAgICAgaWYgKGZyYW1lc193cml0dGVuICE9IC1FQUdBSU4pIHsKLSAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gd3JpdGUgdG8gcGNtIGRldmljZTogIgotICAgICAgICAgICAgICAgICAgICAgPDwgd3JhcHBlcl8tPlN0ckVycm9yKGZyYW1lc193cml0dGVuKTsKLSAgICAgICAgICBSdW5FcnJvckNhbGxiYWNrKGZyYW1lc193cml0dGVuKTsKLSAgICAgICAgICBzdG9wX3N0cmVhbV8gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIERDSEVDS19FUShmcmFtZXNfd3JpdHRlbiwgZnJhbWVzKTsKLQotICAgICAgLy8gU2VlayBmb3J3YXJkIGluIHRoZSBidWZmZXIgYWZ0ZXIgd2UndmUgd3JpdHRlbiBzb21lIGRhdGEgdG8gQUxTQS4KLSAgICAgIGJ1ZmZlcl8tPlNlZWsoZnJhbWVzX3dyaXR0ZW4gKiBieXRlc19wZXJfb3V0cHV0X2ZyYW1lXyk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8vIElmIG5vdGhpbmcgbGVmdCB0byB3cml0ZSBhbmQgcGxheWJhY2sgaGFzbid0IHN0YXJ0ZWQgeWV0LCBzdGFydCBpdCBub3cuCi0gICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgc2hvcnRlciBzb3VuZHMgd2lsbCBzdGlsbCBwbGF5LgotICAgIGlmIChwbGF5YmFja19oYW5kbGVfICYmCi0gICAgICAgICh3cmFwcGVyXy0+UGNtU3RhdGUocGxheWJhY2tfaGFuZGxlXykgPT0gU05EX1BDTV9TVEFURV9QUkVQQVJFRCkgJiYKLSAgICAgICAgR2V0Q3VycmVudERlbGF5KCkgPiAwKSB7Ci0gICAgICB3cmFwcGVyXy0+UGNtU3RhcnQocGxheWJhY2tfaGFuZGxlXyk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQWxzYVBjbU91dHB1dFN0cmVhbTo6V3JpdGVUYXNrKCkgewotICBEQ0hFQ0soSXNPbkF1ZGlvVGhyZWFkKCkpOwotCi0gIGlmIChzdG9wX3N0cmVhbV8pCi0gICAgcmV0dXJuOwotCi0gIGlmIChzdGF0ZSgpID09IGtJc1N0b3BwZWQpCi0gICAgcmV0dXJuOwotCi0gIGJvb2wgc291cmNlX2V4aGF1c3RlZDsKLSAgQnVmZmVyUGFja2V0KCZzb3VyY2VfZXhoYXVzdGVkKTsKLSAgV3JpdGVQYWNrZXQoKTsKLQotICBTY2hlZHVsZU5leHRXcml0ZShzb3VyY2VfZXhoYXVzdGVkKTsKLX0KLQotdm9pZCBBbHNhUGNtT3V0cHV0U3RyZWFtOjpTY2hlZHVsZU5leHRXcml0ZShib29sIHNvdXJjZV9leGhhdXN0ZWQpIHsKLSAgRENIRUNLKElzT25BdWRpb1RocmVhZCgpKTsKLQotICBpZiAoc3RvcF9zdHJlYW1fKQotICAgIHJldHVybjsKLQotICBjb25zdCB1aW50MzIga1RhcmdldEZyYW1lc0F2YWlsYWJsZSA9IGFsc2FfYnVmZmVyX2ZyYW1lc18gLyAyOwotICB1aW50MzIgYXZhaWxhYmxlX2ZyYW1lcyA9IEdldEF2YWlsYWJsZUZyYW1lcygpOwotICB1aW50MzIgZnJhbWVzX2luX2J1ZmZlciA9IGJ1ZmZlcl8tPmZvcndhcmRfYnl0ZXMoKSAvIGJ5dGVzX3Blcl9vdXRwdXRfZnJhbWVfOwotCi0gIC8vIE5leHQgd3JpdGUgaXMgaW5pdGlhbGx5IHNjaGVkdWxlZCBmb3IgdGhlIG1vbWVudCB3aGVuIGhhbGYgb2YgYSBwYWNrZXQKLSAgLy8gaGFzIGJlZW4gcGxheWVkIG91dC4KLSAgdWludDMyIG5leHRfZmlsbF90aW1lX21zID0KLSAgICAgIEZyYW1lc1RvTWlsbGlzKGZyYW1lc19wZXJfcGFja2V0XyAvIDIsIHNhbXBsZV9yYXRlXyk7Ci0KLSAgaWYgKGZyYW1lc19pbl9idWZmZXIgJiYgYXZhaWxhYmxlX2ZyYW1lcykgewotICAgIC8vIFRoZXJlIGlzIGRhdGEgaW4gdGhlIGN1cnJlbnQgYnVmZmVyLCBjb25zdW1lIHRoZW0gaW1tZWRpYXRlbHkgb25jZSB3ZQotICAgIC8vIGhhdmUgZW5vdWdoIHNwYWNlIGluIHRoZSBzb3VuZGNhcmQuCi0gICAgaWYgKGZyYW1lc19pbl9idWZmZXIgPD0gYXZhaWxhYmxlX2ZyYW1lcykKLSAgICAgIG5leHRfZmlsbF90aW1lX21zID0gMDsKLSAgfSBlbHNlIHsKLSAgICAvLyBPdGhlcndpc2Ugc2NoZWR1bGUgdGhlIG5leHQgd3JpdGUgZm9yIHRoZSBtb21lbnQgd2hlbiB0aGUgYXZhaWxhYmxlCi0gICAgLy8gYnVmZmVyIG9mIHRoZSBzb3VuZGNhcmRzIGhpdHMgdGhlIHxrVGFyZ2V0RnJhbWVzQXZhaWxhYmxlfC4KLSAgICBpZiAoYXZhaWxhYmxlX2ZyYW1lcyA8IGtUYXJnZXRGcmFtZXNBdmFpbGFibGUpIHsKLSAgICAgIHVpbnQzMiBmcmFtZXNfdW50aWxfZW1wdHlfZW5vdWdoID0KLSAgICAgICAgICBrVGFyZ2V0RnJhbWVzQXZhaWxhYmxlIC0gYXZhaWxhYmxlX2ZyYW1lczsKLSAgICAgIG5leHRfZmlsbF90aW1lX21zID0KLSAgICAgICAgICBGcmFtZXNUb01pbGxpcyhmcmFtZXNfdW50aWxfZW1wdHlfZW5vdWdoLCBzYW1wbGVfcmF0ZV8pOwotCi0gICAgICAvLyBBZGp1c3QgZm9yIHRoZSBrZXJuZWwgdGltZXNsaWNlIGFuZCBhbnkgYWRkaXRpb25hbCBzbG93ZG93bi4KLSAgICAgIC8vIFRPRE8oeGlhbnMpOiBSZW1vdmUgdGhpcyBhZGp1c3RtZW50IGlmIGl0IGlzIG5vdCByZXF1aXJlZCBieQotICAgICAgLy8gbG93IHBlcmZvcm1hbmNlIG1hY2hpbmVzIGFueSBtb3JlLgotICAgICAgaWYgKG5leHRfZmlsbF90aW1lX21zID4ga1NsZWVwRXJyb3JNaWxsaXNlY29uZHMpCi0gICAgICAgIG5leHRfZmlsbF90aW1lX21zIC09IGtTbGVlcEVycm9yTWlsbGlzZWNvbmRzOwotICAgICAgZWxzZQotICAgICAgICBuZXh0X2ZpbGxfdGltZV9tcyA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFRoZSBzb3VuZCBjYXJkIGhhcyB8a1RhcmdldEZyYW1lc0F2YWlsYWJsZXwgb3IgbW9yZSBmcmFtZXMgYXZhaWxhYmxlLgotICAgICAgLy8gSW52b2tlIHRoZSBuZXh0IHdyaXRlIGltbWVkaWF0ZWx5IHRvIGF2b2lkIHVuZGVycnVuLgotICAgICAgbmV4dF9maWxsX3RpbWVfbXMgPSAwOwotICAgIH0KLQotICAgIC8vIEF2b2lkIGJhY2stdG8tYmFjayB3cml0aW5nLgotICAgIGJhc2U6OlRpbWVEZWx0YSBkZWxheSA9IGJhc2U6OlRpbWU6Ok5vdygpIC0gbGFzdF9maWxsX3RpbWVfOwotICAgIGlmIChkZWxheS5Jbk1pbGxpc2Vjb25kcygpIDwga01pbkludGVydmFsQmV0d2Vlbk9uTW9yZURhdGFDYWxsc0luTXMgJiYKLSAgICAgICAgbmV4dF9maWxsX3RpbWVfbXMgPCBrTWluSW50ZXJ2YWxCZXR3ZWVuT25Nb3JlRGF0YUNhbGxzSW5NcykKLSAgICAgIG5leHRfZmlsbF90aW1lX21zID0ga01pbkludGVydmFsQmV0d2Vlbk9uTW9yZURhdGFDYWxsc0luTXM7Ci0gIH0KLQotICAvLyBBdm9pZCBidXN5IGxvb3BpbmcgaWYgdGhlIGRhdGEgc291cmNlIGlzIGV4aGF1c3RlZC4KLSAgaWYgKHNvdXJjZV9leGhhdXN0ZWQpCi0gICAgbmV4dF9maWxsX3RpbWVfbXMgPSBzdGQ6Om1heChuZXh0X2ZpbGxfdGltZV9tcywga05vRGF0YVNsZWVwTWlsbGlzZWNvbmRzKTsKLQotICAvLyBPbmx5IHNjaGVkdWxlIG1vcmUgcmVhZHMvd3JpdGVzIGlmIHdlIGFyZSBzdGlsbCBpbiB0aGUgcGxheWluZyBzdGF0ZS4KLSAgaWYgKHN0YXRlKCkgPT0ga0lzUGxheWluZykgewotICAgIG1lc3NhZ2VfbG9vcF8tPlBvc3REZWxheWVkVGFzaygKLSAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICBiYXNlOjpCaW5kKCZBbHNhUGNtT3V0cHV0U3RyZWFtOjpXcml0ZVRhc2ssCi0gICAgICAgICAgICAgICAgICAgd2Vha19mYWN0b3J5Xy5HZXRXZWFrUHRyKCkpLAotICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyhuZXh0X2ZpbGxfdGltZV9tcykpOwotICB9Ci19Ci0KLXVpbnQzMiBBbHNhUGNtT3V0cHV0U3RyZWFtOjpGcmFtZXNUb01pY3Jvcyh1aW50MzIgZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBzYW1wbGVfcmF0ZSkgewotICByZXR1cm4gZnJhbWVzICogYmFzZTo6VGltZTo6a01pY3Jvc2Vjb25kc1BlclNlY29uZCAvIHNhbXBsZV9yYXRlOwotfQotCi11aW50MzIgQWxzYVBjbU91dHB1dFN0cmVhbTo6RnJhbWVzVG9NaWxsaXModWludDMyIGZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgc2FtcGxlX3JhdGUpIHsKLSAgcmV0dXJuIGZyYW1lcyAqIGJhc2U6OlRpbWU6OmtNaWxsaXNlY29uZHNQZXJTZWNvbmQgLyBzYW1wbGVfcmF0ZTsKLX0KLQotc3RkOjpzdHJpbmcgQWxzYVBjbU91dHB1dFN0cmVhbTo6RmluZERldmljZUZvckNoYW5uZWxzKHVpbnQzMiBjaGFubmVscykgewotICAvLyBDb25zdGFudHMgc3BlY2lmaWVkIGJ5IHRoZSBBTFNBIEFQSSBmb3IgZGV2aWNlIGhpbnRzLgotICBzdGF0aWMgY29uc3QgaW50IGtHZXRBbGxEZXZpY2VzID0gLTE7Ci0gIHN0YXRpYyBjb25zdCBjaGFyIGtQY21JbnRlcmZhY2VOYW1lW10gPSAicGNtIjsKLSAgc3RhdGljIGNvbnN0IGNoYXIga0lvSGludE5hbWVbXSA9ICJJT0lEIjsKLSAgc3RhdGljIGNvbnN0IGNoYXIga05hbWVIaW50TmFtZVtdID0gIk5BTUUiOwotCi0gIGNvbnN0IGNoYXIqIHdhbnRlZF9kZXZpY2UgPSBHdWVzc1NwZWNpZmljRGV2aWNlTmFtZShjaGFubmVscyk7Ci0gIGlmICghd2FudGVkX2RldmljZSkKLSAgICByZXR1cm4gIiI7Ci0KLSAgc3RkOjpzdHJpbmcgZ3Vlc3NlZF9kZXZpY2U7Ci0gIHZvaWQqKiBoaW50cyA9IE5VTEw7Ci0gIGludCBlcnJvciA9IHdyYXBwZXJfLT5EZXZpY2VOYW1lSGludChrR2V0QWxsRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtQY21JbnRlcmZhY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhpbnRzKTsKLSAgaWYgKGVycm9yID09IDApIHsKLSAgICAvLyBOT1RFOiBEbyBub3QgZWFybHkgcmV0dXJuIGZyb20gaW5zaWRlIHRoaXMgaWYgc3RhdGVtZW50LiAgVGhlCi0gICAgLy8gaGludHMgYWJvdmUgbmVlZCB0byBiZSBmcmVlZC4KLSAgICBmb3IgKHZvaWQqKiBoaW50X2l0ZXIgPSBoaW50czsgKmhpbnRfaXRlciAhPSBOVUxMOyBoaW50X2l0ZXIrKykgewotICAgICAgLy8gT25seSBleGFtaW5lIGRldmljZXMgdGhhdCBhcmUgb3V0cHV0IGNhcGFibGUuLiAgVmFsaWQgdmFsdWVzIGFyZQotICAgICAgLy8gIklucHV0IiwgIk91dHB1dCIsIGFuZCBOVUxMIHdoaWNoIG1lYW5zIGJvdGggaW5wdXQgYW5kIG91dHB1dC4KLSAgICAgIHNjb3BlZF9wdHJfbWFsbG9jPGNoYXI+IGlvKAotICAgICAgICAgIHdyYXBwZXJfLT5EZXZpY2VOYW1lR2V0SGludCgqaGludF9pdGVyLCBrSW9IaW50TmFtZSkpOwotICAgICAgaWYgKGlvICE9IE5VTEwgJiYgc3RyY21wKGlvLmdldCgpLCAiSW5wdXQiKSA9PSAwKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgLy8gQXR0ZW1wdCB0byBzZWxlY3QgdGhlIGNsb3Nlc3QgZGV2aWNlIGZvciBudW1iZXIgb2YgY2hhbm5lbHMuCi0gICAgICBzY29wZWRfcHRyX21hbGxvYzxjaGFyPiBuYW1lKAotICAgICAgICAgIHdyYXBwZXJfLT5EZXZpY2VOYW1lR2V0SGludCgqaGludF9pdGVyLCBrTmFtZUhpbnROYW1lKSk7Ci0gICAgICBpZiAoc3RybmNtcCh3YW50ZWRfZGV2aWNlLCBuYW1lLmdldCgpLCBzdHJsZW4od2FudGVkX2RldmljZSkpID09IDApIHsKLSAgICAgICAgZ3Vlc3NlZF9kZXZpY2UgPSBuYW1lLmdldCgpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBEZXN0cm95IHRoZSBoaW50IG5vdyB0aGF0IHdlJ3JlIGRvbmUgd2l0aCBpdC4KLSAgICB3cmFwcGVyXy0+RGV2aWNlTmFtZUZyZWVIaW50KGhpbnRzKTsKLSAgICBoaW50cyA9IE5VTEw7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGdldCBoaW50cyBmb3IgZGV2aWNlczogIgotICAgICAgICAgICAgICAgPDwgd3JhcHBlcl8tPlN0ckVycm9yKGVycm9yKTsKLSAgfQotCi0gIHJldHVybiBndWVzc2VkX2RldmljZTsKLX0KLQotc25kX3BjbV9zZnJhbWVzX3QgQWxzYVBjbU91dHB1dFN0cmVhbTo6R2V0Q3VycmVudERlbGF5KCkgewotICBzbmRfcGNtX3NmcmFtZXNfdCBkZWxheSA9IC0xOwotICAvLyBEb24ndCBxdWVyeSBBTFNBJ3MgZGVsYXkgaWYgd2UgaGF2ZSB1bmRlcnJ1biBzaW5jZSBpdCdsbCBiZSBqYW1tZWQgYXQgc29tZQotICAvLyBub24temVybyB2YWx1ZSBhbmQgcG90ZW50aWFsbHkgZXZlbiBuZWdhdGl2ZSEKLSAgLy8KLSAgLy8gQWxzbywgaWYgd2UncmUgaW4gdGhlIHByZXBhcmVkIHN0YXRlLCBkb24ndCBxdWVyeSBiZWNhdXNlIHRoYXQgc2VlbXMgdG8KLSAgLy8gY2F1c2UgYW4gSS9PIGVycm9yIHdoZW4gd2UgZG8gcXVlcnkgdGhlIGRlbGF5LgotICBzbmRfcGNtX3N0YXRlX3QgcGNtX3N0YXRlID0gd3JhcHBlcl8tPlBjbVN0YXRlKHBsYXliYWNrX2hhbmRsZV8pOwotICBpZiAocGNtX3N0YXRlICE9IFNORF9QQ01fU1RBVEVfWFJVTiAmJgotICAgICAgcGNtX3N0YXRlICE9IFNORF9QQ01fU1RBVEVfUFJFUEFSRUQpIHsKLSAgICBpbnQgZXJyb3IgPSB3cmFwcGVyXy0+UGNtRGVsYXkocGxheWJhY2tfaGFuZGxlXywgJmRlbGF5KTsKLSAgICBpZiAoZXJyb3IgPCAwKSB7Ci0gICAgICAvLyBBc3N1bWUgYSBkZWxheSBvZiB6ZXJvIGFuZCBhdHRlbXB0IHRvIHJlY292ZXIgdGhlIGRldmljZS4KLSAgICAgIGRlbGF5ID0gLTE7Ci0gICAgICBlcnJvciA9IHdyYXBwZXJfLT5QY21SZWNvdmVyKHBsYXliYWNrX2hhbmRsZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUGNtUmVjb3ZlcklzU2lsZW50KTsKLSAgICAgIGlmIChlcnJvciA8IDApIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHF1ZXJ5aW5nIGRlbGF5OiAiIDw8IHdyYXBwZXJfLT5TdHJFcnJvcihlcnJvcik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gc25kX3BjbV9kZWxheSgpIHNvbWV0aW1lcyByZXR1cm5zIGNyYXp5IHZhbHVlcy4gSW4gdGhpcyBjYXNlIHJldHVybiBkZWxheQotICAvLyBvZiBkYXRhIHdlIGtub3cgY3VycmVudGx5IGlzIGluIEFMU0EncyBidWZmZXIuCi0gIGlmIChkZWxheSA8IDAgfHwgc3RhdGljX2Nhc3Q8c25kX3BjbV91ZnJhbWVzX3Q+KGRlbGF5KSA+IGFsc2FfYnVmZmVyX2ZyYW1lc18pCi0gICAgZGVsYXkgPSBhbHNhX2J1ZmZlcl9mcmFtZXNfIC0gR2V0QXZhaWxhYmxlRnJhbWVzKCk7Ci0KLSAgcmV0dXJuIGRlbGF5OwotfQotCi1zbmRfcGNtX3NmcmFtZXNfdCBBbHNhUGNtT3V0cHV0U3RyZWFtOjpHZXRBdmFpbGFibGVGcmFtZXMoKSB7Ci0gIERDSEVDSyhJc09uQXVkaW9UaHJlYWQoKSk7Ci0KLSAgaWYgKHN0b3Bfc3RyZWFtXykKLSAgICByZXR1cm4gMDsKLQotICAvLyBGaW5kIHRoZSBudW1iZXIgb2YgZnJhbWVzIHF1ZXVlZCBpbiB0aGUgc291bmQgZGV2aWNlLgotICBzbmRfcGNtX3NmcmFtZXNfdCBhdmFpbGFibGVfZnJhbWVzID0KLSAgICAgIHdyYXBwZXJfLT5QY21BdmFpbFVwZGF0ZShwbGF5YmFja19oYW5kbGVfKTsKLSAgaWYgKGF2YWlsYWJsZV9mcmFtZXMgPCAwKSB7Ci0gICAgYXZhaWxhYmxlX2ZyYW1lcyA9IHdyYXBwZXJfLT5QY21SZWNvdmVyKHBsYXliYWNrX2hhbmRsZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZV9mcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtQY21SZWNvdmVySXNTaWxlbnQpOwotICB9Ci0gIGlmIChhdmFpbGFibGVfZnJhbWVzIDwgMCkgewotICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCBxdWVyeWluZyBhdmFpbGFibGUgZnJhbWVzLiBBc3N1bWluZyAwOiAiCi0gICAgICAgICAgICAgICA8PCB3cmFwcGVyXy0+U3RyRXJyb3IoYXZhaWxhYmxlX2ZyYW1lcyk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKHN0YXRpY19jYXN0PHVpbnQzMj4oYXZhaWxhYmxlX2ZyYW1lcykgPiBhbHNhX2J1ZmZlcl9mcmFtZXNfKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiQUxTQSByZXR1cm5lZCAiIDw8IGF2YWlsYWJsZV9mcmFtZXMgPDwgIiBvZiAiCi0gICAgICAgICAgICAgICA8PCBhbHNhX2J1ZmZlcl9mcmFtZXNfIDw8ICIgZnJhbWVzIGF2YWlsYWJsZS4iOwotICAgIHJldHVybiBhbHNhX2J1ZmZlcl9mcmFtZXNfOwotICB9Ci0KLSAgcmV0dXJuIGF2YWlsYWJsZV9mcmFtZXM7Ci19Ci0KLXNuZF9wY21fdCogQWxzYVBjbU91dHB1dFN0cmVhbTo6QXV0b1NlbGVjdERldmljZSh1bnNpZ25lZCBpbnQgbGF0ZW5jeSkgewotICAvLyBGb3IgYXV0by1zZWxlY3Rpb246Ci0gIC8vICAgMSkgQXR0ZW1wdCB0byBvcGVuIGEgZGV2aWNlIHRoYXQgYmVzdCBtYXRjaGVzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKLSAgLy8gICAgICByZXF1ZXN0ZWQuCi0gIC8vICAgMikgSWYgdGhhdCBmYWlscywgYXR0ZW1wdCB0aGUgInBsdWc6IiB2ZXJzaW9uIG9mIGl0IGluIGNhc2UgQUxTQSBjYW4KLSAgLy8gICAgICByZW1hcCBkbyBzb21lIHNvZnR3YXJlIGNvbnZlcnNpb24gdG8gbWFrZSBpdCB3b3JrLgotICAvLyAgIDMpIEZhbGxiYWNrIHRvIGtEZWZhdWx0RGV2aWNlLgotICAvLyAgIDQpIElmIHRoYXQgZmFpbHMgdG9vLCB0cnkgdGhlICJwbHVnOiIgdmVyc2lvbiBvZiBrRGVmYXVsdERldmljZS4KLSAgLy8gICA1KSBHaXZlIHVwLgotICBzbmRfcGNtX3QqIGhhbmRsZSA9IE5VTEw7Ci0gIGRldmljZV9uYW1lXyA9IEZpbmREZXZpY2VGb3JDaGFubmVscyhjaGFubmVsc18pOwotCi0gIC8vIFN0ZXAgMS4KLSAgaWYgKCFkZXZpY2VfbmFtZV8uZW1wdHkoKSkgewotICAgIGlmICgoaGFuZGxlID0gYWxzYV91dGlsOjpPcGVuUGxheWJhY2tEZXZpY2Uod3JhcHBlcl8sIGRldmljZV9uYW1lXy5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNfLCBzYW1wbGVfcmF0ZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY21fZm9ybWF0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3kpKSAhPSBOVUxMKSB7Ci0gICAgICByZXR1cm4gaGFuZGxlOwotICAgIH0KLQotICAgIC8vIFN0ZXAgMi4KLSAgICBkZXZpY2VfbmFtZV8gPSBrUGx1Z1ByZWZpeCArIGRldmljZV9uYW1lXzsKLSAgICBpZiAoKGhhbmRsZSA9IGFsc2FfdXRpbDo6T3BlblBsYXliYWNrRGV2aWNlKHdyYXBwZXJfLCBkZXZpY2VfbmFtZV8uY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzXywgc2FtcGxlX3JhdGVfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNtX2Zvcm1hdF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlbmN5KSkgIT0gTlVMTCkgewotICAgICAgcmV0dXJuIGhhbmRsZTsKLSAgICB9Ci0gIH0KLQotICAvLyBGb3IgdGhlIGtEZWZhdWx0RGV2aWNlIGRldmljZSwgd2UgY2FuIG9ubHkgcmVsaWFibHkgZGVwZW5kIG9uIDItY2hhbm5lbAotICAvLyBvdXRwdXQgdG8gaGF2ZSB0aGUgY29ycmVjdCBvcmRlcmluZyBhY2NvcmRpbmcgdG8gTGVubmFydC4gIEZvciB0aGUgY2hhbm5lbAotICAvLyBmb3JtYXRzIHRoYXQgd2Uga25vdyBob3cgdG8gZG93bm1peCBmcm9tICgzIGNoYW5uZWwgdG8gOCBjaGFubmVsKSwgc2V0dXAKLSAgLy8gZG93bm1peGluZy4KLSAgdWludDMyIGRlZmF1bHRfY2hhbm5lbHMgPSBjaGFubmVsc187Ci0gIGlmIChkZWZhdWx0X2NoYW5uZWxzID4gMikgewotICAgIGNoYW5uZWxfbWl4ZXJfLnJlc2V0KG5ldyBDaGFubmVsTWl4ZXIoCi0gICAgICAgIGNoYW5uZWxfbGF5b3V0XywgQ0hBTk5FTF9MQVlPVVRfU1RFUkVPKSk7Ci0gICAgZGVmYXVsdF9jaGFubmVscyA9IDI7Ci0gICAgbWl4ZWRfYXVkaW9fYnVzXyA9IEF1ZGlvQnVzOjpDcmVhdGUoCi0gICAgICAgIGRlZmF1bHRfY2hhbm5lbHMsIGF1ZGlvX2J1c18tPmZyYW1lcygpKTsKLSAgfQotCi0gIC8vIFN0ZXAgMy4KLSAgZGV2aWNlX25hbWVfID0ga0RlZmF1bHREZXZpY2U7Ci0gIGlmICgoaGFuZGxlID0gYWxzYV91dGlsOjpPcGVuUGxheWJhY2tEZXZpY2UoCi0gICAgICB3cmFwcGVyXywgZGV2aWNlX25hbWVfLmNfc3RyKCksIGRlZmF1bHRfY2hhbm5lbHMsIHNhbXBsZV9yYXRlXywKLSAgICAgIHBjbV9mb3JtYXRfLCBsYXRlbmN5KSkgIT0gTlVMTCkgewotICAgIHJldHVybiBoYW5kbGU7Ci0gIH0KLQotICAvLyBTdGVwIDQuCi0gIGRldmljZV9uYW1lXyA9IGtQbHVnUHJlZml4ICsgZGV2aWNlX25hbWVfOwotICBpZiAoKGhhbmRsZSA9IGFsc2FfdXRpbDo6T3BlblBsYXliYWNrRGV2aWNlKAotICAgICAgd3JhcHBlcl8sIGRldmljZV9uYW1lXy5jX3N0cigpLCBkZWZhdWx0X2NoYW5uZWxzLCBzYW1wbGVfcmF0ZV8sCi0gICAgICBwY21fZm9ybWF0XywgbGF0ZW5jeSkpICE9IE5VTEwpIHsKLSAgICByZXR1cm4gaGFuZGxlOwotICB9Ci0KLSAgLy8gVW5hYmxlIHRvIG9wZW4gYW55IGRldmljZS4KLSAgZGV2aWNlX25hbWVfLmNsZWFyKCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi1ib29sIEFsc2FQY21PdXRwdXRTdHJlYW06OkNhblRyYW5zaXRpb25UbyhJbnRlcm5hbFN0YXRlIHRvKSB7Ci0gIHN3aXRjaCAoc3RhdGVfKSB7Ci0gICAgY2FzZSBrQ3JlYXRlZDoKLSAgICAgIHJldHVybiB0byA9PSBrSXNPcGVuZWQgfHwgdG8gPT0ga0lzQ2xvc2VkIHx8IHRvID09IGtJbkVycm9yOwotCi0gICAgY2FzZSBrSXNPcGVuZWQ6Ci0gICAgICByZXR1cm4gdG8gPT0ga0lzUGxheWluZyB8fCB0byA9PSBrSXNTdG9wcGVkIHx8Ci0gICAgICAgICAgdG8gPT0ga0lzQ2xvc2VkIHx8IHRvID09IGtJbkVycm9yOwotCi0gICAgY2FzZSBrSXNQbGF5aW5nOgotICAgICAgcmV0dXJuIHRvID09IGtJc1BsYXlpbmcgfHwgdG8gPT0ga0lzU3RvcHBlZCB8fAotICAgICAgICAgIHRvID09IGtJc0Nsb3NlZCB8fCB0byA9PSBrSW5FcnJvcjsKLQotICAgIGNhc2Uga0lzU3RvcHBlZDoKLSAgICAgIHJldHVybiB0byA9PSBrSXNQbGF5aW5nIHx8IHRvID09IGtJc1N0b3BwZWQgfHwKLSAgICAgICAgICB0byA9PSBrSXNDbG9zZWQgfHwgdG8gPT0ga0luRXJyb3I7Ci0KLSAgICBjYXNlIGtJbkVycm9yOgotICAgICAgcmV0dXJuIHRvID09IGtJc0Nsb3NlZCB8fCB0byA9PSBrSW5FcnJvcjsKLQotICAgIGNhc2Uga0lzQ2xvc2VkOgotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotQWxzYVBjbU91dHB1dFN0cmVhbTo6SW50ZXJuYWxTdGF0ZQotQWxzYVBjbU91dHB1dFN0cmVhbTo6VHJhbnNpdGlvblRvKEludGVybmFsU3RhdGUgdG8pIHsKLSAgRENIRUNLKElzT25BdWRpb1RocmVhZCgpKTsKLQotICBpZiAoIUNhblRyYW5zaXRpb25Ubyh0bykpIHsKLSAgICBOT1RSRUFDSEVEKCkgPDwgIkNhbm5vdCB0cmFuc2l0aW9uIGZyb206ICIgPDwgc3RhdGVfIDw8ICIgdG86ICIgPDwgdG87Ci0gICAgc3RhdGVfID0ga0luRXJyb3I7Ci0gIH0gZWxzZSB7Ci0gICAgc3RhdGVfID0gdG87Ci0gIH0KLSAgcmV0dXJuIHN0YXRlXzsKLX0KLQotQWxzYVBjbU91dHB1dFN0cmVhbTo6SW50ZXJuYWxTdGF0ZSBBbHNhUGNtT3V0cHV0U3RyZWFtOjpzdGF0ZSgpIHsKLSAgcmV0dXJuIHN0YXRlXzsKLX0KLQotYm9vbCBBbHNhUGNtT3V0cHV0U3RyZWFtOjpJc09uQXVkaW9UaHJlYWQoKSBjb25zdCB7Ci0gIHJldHVybiBtZXNzYWdlX2xvb3BfICYmIG1lc3NhZ2VfbG9vcF8gPT0gTWVzc2FnZUxvb3A6OmN1cnJlbnQoKTsKLX0KLQotaW50IEFsc2FQY21PdXRwdXRTdHJlYW06OlJ1bkRhdGFDYWxsYmFjayhBdWRpb0J1cyogYXVkaW9fYnVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlcnNTdGF0ZSBidWZmZXJzX3N0YXRlKSB7Ci0gIFRSQUNFX0VWRU5UMCgiYXVkaW8iLCAiQWxzYVBjbU91dHB1dFN0cmVhbTo6UnVuRGF0YUNhbGxiYWNrIik7Ci0KLSAgaWYgKHNvdXJjZV9jYWxsYmFja18pCi0gICAgcmV0dXJuIHNvdXJjZV9jYWxsYmFja18tPk9uTW9yZURhdGEoYXVkaW9fYnVzLCBidWZmZXJzX3N0YXRlKTsKLQotICByZXR1cm4gMDsKLX0KLQotdm9pZCBBbHNhUGNtT3V0cHV0U3RyZWFtOjpSdW5FcnJvckNhbGxiYWNrKGludCBjb2RlKSB7Ci0gIGlmIChzb3VyY2VfY2FsbGJhY2tfKQotICAgIHNvdXJjZV9jYWxsYmFja18tPk9uRXJyb3IodGhpcywgY29kZSk7Ci19Ci0KLS8vIENoYW5nZXMgdGhlIEF1ZGlvU291cmNlQ2FsbGJhY2sgdG8gcHJveHkgY2FsbHMgdG8uICBQYXNzIGluIE5VTEwgdG8KLS8vIHJlbGVhc2Ugb3duZXJzaGlwIG9mIHRoZSBjdXJyZW50bHkgcmVnaXN0ZXJlZCBjYWxsYmFjay4KLXZvaWQgQWxzYVBjbU91dHB1dFN0cmVhbTo6c2V0X3NvdXJjZV9jYWxsYmFjayhBdWRpb1NvdXJjZUNhbGxiYWNrKiBjYWxsYmFjaykgewotICBEQ0hFQ0soSXNPbkF1ZGlvVGhyZWFkKCkpOwotICBzb3VyY2VfY2FsbGJhY2tfID0gY2FsbGJhY2s7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2xpbnV4L2Fsc2Ffb3V0cHV0LmggYi9zcmMvbWVkaWEvYXVkaW8vbGludXgvYWxzYV9vdXRwdXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZiMjlmNC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vbGludXgvYWxzYV9vdXRwdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotLy8KLS8vIENyZWF0ZXMgYW4gb3V0cHV0IHN0cmVhbSBiYXNlZCBvbiB0aGUgQUxTQSBQQ00gaW50ZXJmYWNlLgotLy8KLS8vIE9uIGRldmljZSB3cml0ZSBmYWlsdXJlLCB0aGUgc3RyZWFtIHdpbGwgbW92ZSBpdHNlbGYgdG8gYW4gaW52YWxpZCBzdGF0ZS4KLS8vIE5vIG1vcmUgZGF0YSB3aWxsIGJlIHB1bGxlZCBmcm9tIHRoZSBkYXRhIHNvdXJjZSwgb3Igd3JpdHRlbiB0byB0aGUgZGV2aWNlLgotLy8gQWxsIGNhbGxzIHRvIHB1YmxpYyBBUEkgZnVuY3Rpb25zIHdpbGwgZWl0aGVyIG5vLW9wIHRoZW1zZWx2ZXMsIG9yIHJldHVybiBhbgotLy8gZXJyb3IgaWYgcG9zc2libGUuICBTcGVjaWZpY2FsbHksIElmIHRoZSBzdHJlYW0gaXMgaW4gYW4gZXJyb3Igc3RhdGUsIE9wZW4oKQotLy8gd2lsbCByZXR1cm4gZmFsc2UsIGFuZCBTdGFydCgpIHdpbGwgY2FsbCBPbkVycm9yKCkgaW1tZWRpYXRlbHkgb24gdGhlCi0vLyBwcm92aWRlZCBjYWxsYmFjay4KLS8vCi0vLyBJZiB0aGUgc3RyZWFtIGlzIHN1Y2Nlc3NmdWxseSBvcGVuZWQsIENsb3NlKCkgbXVzdCBiZSBjYWxsZWQuICBBZnRlciBDbG9zZQotLy8gaGFzIGJlZW4gY2FsbGVkLCB0aGUgb2JqZWN0IHNob3VsZCBiZSByZWdhcmRlZCBhcyBkZWxldGVkIGFuZCBub3QgdG91Y2hlZC4KLS8vCi0vLyBBbHNhUGNtT3V0cHV0U3RyZWFtIGlzIGEgc2luZ2xlIHRocmVhZGVkIGNsYXNzIHRoYXQgc2hvdWxkIG9ubHkgYmUgdXNlZCBmcm9tCi0vLyB0aGUgYXVkaW8gdGhyZWFkLiBXaGVuIG1vZGlmeWluZyB0aGUgY29kZSBpbiB0aGlzIGNsYXNzLCBwbGVhc2UgcmVhZCB0aGUKLS8vIHRocmVhZGluZyBhc3N1bXB0aW9ucyBhdCB0aGUgdG9wIG9mIHRoZSBpbXBsZW1lbnRhdGlvbi4KLQotI2lmbmRlZiBNRURJQV9BVURJT19MSU5VWF9BTFNBX09VVFBVVF9IXwotI2RlZmluZSBNRURJQV9BVURJT19MSU5VWF9BTFNBX09VVFBVVF9IXwotCi0jaW5jbHVkZSA8YWxzYS9hc291bmRsaWIuaD4KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvY29tcGlsZXJfc3BlY2lmaWMuaCIKLSNpbmNsdWRlICJiYXNlL2d0ZXN0X3Byb2RfdXRpbC5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS93ZWFrX3B0ci5oIgotI2luY2x1ZGUgImJhc2UvdGltZS5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX2lvLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fcGFyYW1ldGVycy5oIgotCi1jbGFzcyBNZXNzYWdlTG9vcDsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgQWxzYVdyYXBwZXI7Ci1jbGFzcyBBdWRpb01hbmFnZXJMaW51eDsKLWNsYXNzIENoYW5uZWxNaXhlcjsKLWNsYXNzIFNlZWthYmxlQnVmZmVyOwotCi1jbGFzcyBNRURJQV9FWFBPUlQgQWxzYVBjbU91dHB1dFN0cmVhbSA6IHB1YmxpYyBBdWRpb091dHB1dFN0cmVhbSB7Ci0gcHVibGljOgotICAvLyBTdHJpbmcgZm9yIHRoZSBnZW5lcmljICJkZWZhdWx0IiBBTFNBIGRldmljZSB0aGF0IGhhcyB0aGUgaGlnaGVzdAotICAvLyBjb21wYXRpYmlsaXR5IGFuZCBjaGFuY2Ugb2Ygd29ya2luZy4KLSAgc3RhdGljIGNvbnN0IGNoYXIga0RlZmF1bHREZXZpY2VbXTsKLQotICAvLyBQYXNzIHRoaXMgdG8gdGhlIEFsc2FQY21PdXRwdXRTdHJlYW0gaWYgeW91IHdhbnQgdG8gYXR0ZW1wdCBhdXRvLXNlbGVjdGlvbgotICAvLyBvZiB0aGUgYXVkaW8gZGV2aWNlLgotICBzdGF0aWMgY29uc3QgY2hhciBrQXV0b1NlbGVjdERldmljZVtdOwotCi0gIC8vIFByZWZpeCBmb3IgZGV2aWNlIG5hbWVzIHRvIGVuYWJsZSBBTFNBIGxpYnJhcnkgcmVzYW1wbGluZy4KLSAgc3RhdGljIGNvbnN0IGNoYXIga1BsdWdQcmVmaXhbXTsKLQotICAvLyBUaGUgbWluaW11bSBsYXRlbmN5IHRoYXQgaXMgYWNjZXB0ZWQgYnkgdGhlIGRldmljZS4KLSAgc3RhdGljIGNvbnN0IHVpbnQzMiBrTWluTGF0ZW5jeU1pY3JvczsKLQotICAvLyBDcmVhdGUgYSBQQ00gT3V0cHV0IHN0cmVhbSBmb3IgdGhlIEFMU0EgZGV2aWNlIGlkZW50aWZpZWQgYnkKLSAgLy8gfGRldmljZV9uYW1lfC4gIFRoZSBBbHNhUGNtT3V0cHV0U3RyZWFtIHVzZXMgfHdyYXBwZXJ8IHRvIGNvbW11bmljYXRlIHdpdGgKLSAgLy8gdGhlIGFsc2EgbGlicmFyaWVzLCBhbGxvd2luZyBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24gZHVyaW5nIHRlc3RpbmcuICBBbGwKLSAgLy8gcmVxdWVzdGluZyBvZiBkYXRhLCBhbmQgd3JpdGluZyB0byB0aGUgYWxzYSBkZXZpY2Ugd2lsbCBiZSBkb25lIG9uCi0gIC8vIHxtZXNzYWdlX2xvb3B8LgotICAvLwotICAvLyBJZiB1bnN1cmUgb2Ygd2hhdCB0byB1c2UgZm9yIHxkZXZpY2VfbmFtZXwsIHVzZSB8a0F1dG9TZWxlY3REZXZpY2V8LgotICBBbHNhUGNtT3V0cHV0U3RyZWFtKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICBBbHNhV3JhcHBlciogd3JhcHBlciwKLSAgICAgICAgICAgICAgICAgICAgICBBdWRpb01hbmFnZXJMaW51eCogbWFuYWdlcik7Ci0KLSAgdmlydHVhbCB+QWxzYVBjbU91dHB1dFN0cmVhbSgpOwotCi0gIC8vIEltcGxlbWVudGF0aW9uIG9mIEF1ZGlvT3V0cHV0U3RyZWFtLgotICB2aXJ0dWFsIGJvb2wgT3BlbigpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgQ2xvc2UoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0YXJ0KEF1ZGlvU291cmNlQ2FsbGJhY2sqIGNhbGxiYWNrKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0b3AoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFNldFZvbHVtZShkb3VibGUgdm9sdW1lKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIEdldFZvbHVtZShkb3VibGUqIHZvbHVtZSkgT1ZFUlJJREU7Ci0KLSBwcml2YXRlOgotICBmcmllbmQgY2xhc3MgQWxzYVBjbU91dHB1dFN0cmVhbVRlc3Q7Ci0gIEZSSUVORF9URVNUX0FMTF9QUkVGSVhFUyhBbHNhUGNtT3V0cHV0U3RyZWFtVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dG9TZWxlY3REZXZpY2VfRGV2aWNlU2VsZWN0KTsKLSAgRlJJRU5EX1RFU1RfQUxMX1BSRUZJWEVTKEFsc2FQY21PdXRwdXRTdHJlYW1UZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0b1NlbGVjdERldmljZV9GYWxsYmFja0RldmljZXMpOwotICBGUklFTkRfVEVTVF9BTExfUFJFRklYRVMoQWxzYVBjbU91dHB1dFN0cmVhbVRlc3QsIEF1dG9TZWxlY3REZXZpY2VfSGludEZhaWwpOwotICBGUklFTkRfVEVTVF9BTExfUFJFRklYRVMoQWxzYVBjbU91dHB1dFN0cmVhbVRlc3QsIEJ1ZmZlclBhY2tldCk7Ci0gIEZSSUVORF9URVNUX0FMTF9QUkVGSVhFUyhBbHNhUGNtT3V0cHV0U3RyZWFtVGVzdCwgQnVmZmVyUGFja2V0X05lZ2F0aXZlKTsKLSAgRlJJRU5EX1RFU1RfQUxMX1BSRUZJWEVTKEFsc2FQY21PdXRwdXRTdHJlYW1UZXN0LCBCdWZmZXJQYWNrZXRfU3RvcFN0cmVhbSk7Ci0gIEZSSUVORF9URVNUX0FMTF9QUkVGSVhFUyhBbHNhUGNtT3V0cHV0U3RyZWFtVGVzdCwgQnVmZmVyUGFja2V0X1VuZGVycnVuKTsKLSAgRlJJRU5EX1RFU1RfQUxMX1BSRUZJWEVTKEFsc2FQY21PdXRwdXRTdHJlYW1UZXN0LCBCdWZmZXJQYWNrZXRfRnVsbEJ1ZmZlcik7Ci0gIEZSSUVORF9URVNUX0FMTF9QUkVGSVhFUyhBbHNhUGNtT3V0cHV0U3RyZWFtVGVzdCwgQ29uc3RydWN0ZWRTdGF0ZSk7Ci0gIEZSSUVORF9URVNUX0FMTF9QUkVGSVhFUyhBbHNhUGNtT3V0cHV0U3RyZWFtVGVzdCwgTGF0ZW5jeUZsb29yKTsKLSAgRlJJRU5EX1RFU1RfQUxMX1BSRUZJWEVTKEFsc2FQY21PdXRwdXRTdHJlYW1UZXN0LCBPcGVuQ2xvc2UpOwotICBGUklFTkRfVEVTVF9BTExfUFJFRklYRVMoQWxzYVBjbU91dHB1dFN0cmVhbVRlc3QsIFBjbU9wZW5GYWlsZWQpOwotICBGUklFTkRfVEVTVF9BTExfUFJFRklYRVMoQWxzYVBjbU91dHB1dFN0cmVhbVRlc3QsIFBjbVNldFBhcmFtc0ZhaWxlZCk7Ci0gIEZSSUVORF9URVNUX0FMTF9QUkVGSVhFUyhBbHNhUGNtT3V0cHV0U3RyZWFtVGVzdCwgU2NoZWR1bGVOZXh0V3JpdGUpOwotICBGUklFTkRfVEVTVF9BTExfUFJFRklYRVMoQWxzYVBjbU91dHB1dFN0cmVhbVRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlZHVsZU5leHRXcml0ZV9TdG9wU3RyZWFtKTsKLSAgRlJJRU5EX1RFU1RfQUxMX1BSRUZJWEVTKEFsc2FQY21PdXRwdXRTdHJlYW1UZXN0LCBTdGFydFN0b3ApOwotICBGUklFTkRfVEVTVF9BTExfUFJFRklYRVMoQWxzYVBjbU91dHB1dFN0cmVhbVRlc3QsIFdyaXRlUGFja2V0X0ZpbmlzaGVkUGFja2V0KTsKLSAgRlJJRU5EX1RFU1RfQUxMX1BSRUZJWEVTKEFsc2FQY21PdXRwdXRTdHJlYW1UZXN0LCBXcml0ZVBhY2tldF9Ob3JtYWxQYWNrZXQpOwotICBGUklFTkRfVEVTVF9BTExfUFJFRklYRVMoQWxzYVBjbU91dHB1dFN0cmVhbVRlc3QsIFdyaXRlUGFja2V0X1N0b3BTdHJlYW0pOwotICBGUklFTkRfVEVTVF9BTExfUFJFRklYRVMoQWxzYVBjbU91dHB1dFN0cmVhbVRlc3QsIFdyaXRlUGFja2V0X1dyaXRlRmFpbHMpOwotCi0gIC8vIEZsYWdzIGluZGljYXRpbmcgdGhlIHN0YXRlIG9mIHRoZSBzdHJlYW0uCi0gIGVudW0gSW50ZXJuYWxTdGF0ZSB7Ci0gICAga0luRXJyb3IgPSAwLAotICAgIGtDcmVhdGVkLAotICAgIGtJc09wZW5lZCwKLSAgICBrSXNQbGF5aW5nLAotICAgIGtJc1N0b3BwZWQsCi0gICAga0lzQ2xvc2VkCi0gIH07Ci0gIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgSW50ZXJuYWxTdGF0ZSk7Ci0KLSAgLy8gRnVuY3Rpb25zIHRvIGdldCBhbm90aGVyIHBhY2tldCBmcm9tIHRoZSBkYXRhIHNvdXJjZSBhbmQgd3JpdGUgaXQgaW50byB0aGUKLSAgLy8gQUxTQSBkZXZpY2UuCi0gIHZvaWQgQnVmZmVyUGFja2V0KGJvb2wqIHNvdXJjZV9leGhhdXN0ZWQpOwotICB2b2lkIFdyaXRlUGFja2V0KCk7Ci0gIHZvaWQgV3JpdGVUYXNrKCk7Ci0gIHZvaWQgU2NoZWR1bGVOZXh0V3JpdGUoYm9vbCBzb3VyY2VfZXhoYXVzdGVkKTsKLQotICAvLyBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgdGFsa2luZyB3aXRoIHRoZSBBTFNBIEFQSS4KLSAgc3RhdGljIHVpbnQzMiBGcmFtZXNUb01pY3Jvcyh1aW50MzIgZnJhbWVzLCB1aW50MzIgc2FtcGxlX3JhdGUpOwotICBzdGF0aWMgdWludDMyIEZyYW1lc1RvTWlsbGlzKHVpbnQzMiBmcmFtZXMsIHVpbnQzMiBzYW1wbGVfcmF0ZSk7Ci0gIHN0ZDo6c3RyaW5nIEZpbmREZXZpY2VGb3JDaGFubmVscyh1aW50MzIgY2hhbm5lbHMpOwotICBzbmRfcGNtX3NmcmFtZXNfdCBHZXRBdmFpbGFibGVGcmFtZXMoKTsKLSAgc25kX3BjbV9zZnJhbWVzX3QgR2V0Q3VycmVudERlbGF5KCk7Ci0KLSAgLy8gQXR0ZW1wdHMgdG8gZmluZCB0aGUgYmVzdCBtYXRjaGluZyBsaW51eCBhdWRpbyBkZXZpY2UgZm9yIHRoZSBnaXZlbiBudW1iZXIKLSAgLy8gb2YgY2hhbm5lbHMuICBUaGlzIGZ1bmN0aW9uIHdpbGwgc2V0IHxkZXZpY2VfbmFtZV98IGFuZCB8Y2hhbm5lbF9taXhlcl98LgotICBzbmRfcGNtX3QqIEF1dG9TZWxlY3REZXZpY2UodWludDMyIGxhdGVuY3kpOwotCi0gIC8vIEZ1bmN0aW9ucyB0byBzYWZlZ3VhcmQgc3RhdGUgdHJhbnNpdGlvbnMuICBBbGwgY2hhbmdlcyB0byB0aGUgb2JqZWN0IHN0YXRlCi0gIC8vIHNob3VsZCBnbyB0aHJvdWdoIHRoZXNlIGZ1bmN0aW9ucy4KLSAgYm9vbCBDYW5UcmFuc2l0aW9uVG8oSW50ZXJuYWxTdGF0ZSB0byk7Ci0gIEludGVybmFsU3RhdGUgVHJhbnNpdGlvblRvKEludGVybmFsU3RhdGUgdG8pOwotICBJbnRlcm5hbFN0YXRlIHN0YXRlKCk7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIHdoZW4gd2UncmUgb24gdGhlIGF1ZGlvIHRocmVhZCBvciBpZiB0aGUgYXVkaW8gdGhyZWFkJ3MKLSAgLy8gbWVzc2FnZSBsb29wIGlzIE5VTEwgKHdoaWNoIHdpbGwgaGFwcGVuIGR1cmluZyBzaHV0ZG93bikuCi0gIGJvb2wgSXNPbkF1ZGlvVGhyZWFkKCkgY29uc3Q7Ci0KLSAgLy8gQVBJIGZvciBQcm94eWluZyBjYWxscyB0byB0aGUgQXVkaW9Tb3VyY2VDYWxsYmFjayBwcm92aWRlZCBkdXJpbmcKLSAgLy8gU3RhcnQoKS4KLSAgLy8KLSAgLy8gVE9ETyhhandvbmcpOiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBvd25lcnNoaXAgc2VtYW50aWNzIGZvciB0aGUKLSAgLy8gfHNvdXJjZV9jYWxsYmFja198IG9iamVjdCBhcmUgaW5jb3JyZWN0IGluIEF1ZGlvUmVuZGVySG9zdC4gVGhlIGNhbGxiYWNrCi0gIC8vIGlzIHBhc3NlZCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtLCBidXQgb3duZXJzaGlwIGlzIG5vdCB0cmFuc2ZlcmVkIHdoaWNoCi0gIC8vIHJlcXVpcmVzIGEgc3luY2hyb25pemF0aW9uIG9uIGFjY2VzcyBvZiB0aGUgfHNvdXJjZV9jYWxsYmFja198IHRvIGF2b2lkCi0gIC8vIHVzaW5nIGEgZGVsZXRlZCBjYWxsYmFjay4KLSAgaW50IFJ1bkRhdGFDYWxsYmFjayhBdWRpb0J1cyogYXVkaW9fYnVzLCBBdWRpb0J1ZmZlcnNTdGF0ZSBidWZmZXJzX3N0YXRlKTsKLSAgdm9pZCBSdW5FcnJvckNhbGxiYWNrKGludCBjb2RlKTsKLQotICAvLyBDaGFuZ2VzIHRoZSBBdWRpb1NvdXJjZUNhbGxiYWNrIHRvIHByb3h5IGNhbGxzIHRvLiAgUGFzcyBpbiBOVUxMIHRvCi0gIC8vIHJlbGVhc2Ugb3duZXJzaGlwIG9mIHRoZSBjdXJyZW50bHkgcmVnaXN0ZXJlZCBjYWxsYmFjay4KLSAgdm9pZCBzZXRfc291cmNlX2NhbGxiYWNrKEF1ZGlvU291cmNlQ2FsbGJhY2sqIGNhbGxiYWNrKTsKLQotICAvLyBDb25maWd1cmF0aW9uIGNvbnN0YW50cyBmcm9tIHRoZSBjb25zdHJ1Y3Rvci4gIFJlZmVyZW5jZWFibGUgYnkgYWxsIHRocmVhZHMKLSAgLy8gc2luY2UgdGhleSBhcmUgY29uc3RhbnRzLgotICBjb25zdCBzdGQ6OnN0cmluZyByZXF1ZXN0ZWRfZGV2aWNlX25hbWVfOwotICBjb25zdCBzbmRfcGNtX2Zvcm1hdF90IHBjbV9mb3JtYXRfOwotICBjb25zdCB1aW50MzIgY2hhbm5lbHNfOwotICBjb25zdCBDaGFubmVsTGF5b3V0IGNoYW5uZWxfbGF5b3V0XzsKLSAgY29uc3QgdWludDMyIHNhbXBsZV9yYXRlXzsKLSAgY29uc3QgdWludDMyIGJ5dGVzX3Blcl9zYW1wbGVfOwotICBjb25zdCB1aW50MzIgYnl0ZXNfcGVyX2ZyYW1lXzsKLQotICAvLyBEZXZpY2UgY29uZmlndXJhdGlvbiBkYXRhLiBQb3B1bGF0ZWQgYWZ0ZXIgT3BlblRhc2soKSBjb21wbGV0ZXMuCi0gIHN0ZDo6c3RyaW5nIGRldmljZV9uYW1lXzsKLSAgdWludDMyIHBhY2tldF9zaXplXzsKLSAgdWludDMyIG1pY3Jvc19wZXJfcGFja2V0XzsKLSAgdWludDMyIGxhdGVuY3lfbWljcm9zXzsKLSAgdWludDMyIGJ5dGVzX3Blcl9vdXRwdXRfZnJhbWVfOwotICB1aW50MzIgYWxzYV9idWZmZXJfZnJhbWVzXzsKLQotICAvLyBGbGFnIGluZGljYXRpbmcgdGhlIGNvZGUgc2hvdWxkIHN0b3AgcmVhZGluZyBmcm9tIHRoZSBkYXRhIHNvdXJjZSBvcgotICAvLyB3cml0aW5nIHRvIHRoZSBBTFNBIGRldmljZS4gIFRoaXMgaXMgc2V0IGJlY2F1c2UgdGhlIGRldmljZSBoYXMgZW50ZXJlZAotICAvLyBhbiB1bnJlY292ZXJhYmxlIGVycm9yIHN0YXRlLCBvciB0aGUgQ2xvc2VkVGFzaygpIGhhcyBleGVjdXRlZC4KLSAgYm9vbCBzdG9wX3N0cmVhbV87Ci0KLSAgLy8gV3JhcHBlciBjbGFzcyB0byBpbnZva2UgYWxsIHRoZSBBTFNBIGZ1bmN0aW9ucy4KLSAgQWxzYVdyYXBwZXIqIHdyYXBwZXJfOwotCi0gIC8vIEF1ZGlvIG1hbmFnZXIgdGhhdCBjcmVhdGVkIHVzLiAgVXNlZCB0byByZXBvcnQgdGhhdCB3ZSd2ZSBiZWVuIGNsb3NlZC4KLSAgQXVkaW9NYW5hZ2VyTGludXgqIG1hbmFnZXJfOwotCi0gIC8vIE1lc3NhZ2UgbG9vcCB0byB1c2UgZm9yIHBvbGxpbmcuIFRoZSBvYmplY3QgaXMgb3duZWQgYnkgdGhlIEF1ZGlvTWFuYWdlci4KLSAgLy8gV2UgaG9sZCBhIHJlZmVyZW5jZSB0byB0aGUgYXVkaW8gdGhyZWFkIG1lc3NhZ2UgbG9vcCBzaW5jZQotICAvLyBBdWRpb01hbmFnZXJCYXNlOjpTaHV0RG93bigpIGNhbiBpbnZhbGlkYXRlIHRoZSBtZXNzYWdlIGxvb3AgcG9pbnRlcgotICAvLyBiZWZvcmUgdGhlIHN0cmVhbSBnZXRzIGRlbGV0ZWQuCi0gIE1lc3NhZ2VMb29wKiBtZXNzYWdlX2xvb3BfOwotCi0gIC8vIEhhbmRsZSB0byB0aGUgYWN0dWFsIFBDTSBwbGF5YmFjayBkZXZpY2UuCi0gIHNuZF9wY21fdCogcGxheWJhY2tfaGFuZGxlXzsKLQotICBzY29wZWRfcHRyPG1lZGlhOjpTZWVrYWJsZUJ1ZmZlcj4gYnVmZmVyXzsKLSAgdWludDMyIGZyYW1lc19wZXJfcGFja2V0XzsKLQotICAvLyBBbGxvd3MgdXMgdG8gcnVuIHRhc2tzIG9uIHRoZSBBbHNhUGNtT3V0cHV0U3RyZWFtIGluc3RhbmNlIHdoaWNoIGFyZQotICAvLyBib3VuZCBieSBpdHMgbGlmZXRpbWUuCi0gIGJhc2U6OldlYWtQdHJGYWN0b3J5PEFsc2FQY21PdXRwdXRTdHJlYW0+IHdlYWtfZmFjdG9yeV87Ci0KLSAgSW50ZXJuYWxTdGF0ZSBzdGF0ZV87Ci0gIGZsb2F0IHZvbHVtZV87ICAvLyBWb2x1bWUgbGV2ZWwgZnJvbSAwLjAgdG8gMS4wLgotCi0gIEF1ZGlvU291cmNlQ2FsbGJhY2sqIHNvdXJjZV9jYWxsYmFja187Ci0KLSAgYmFzZTo6VGltZSBsYXN0X2ZpbGxfdGltZV87ICAvLyBUaW1lIGZvciB0aGUgbGFzdCBPbk1vcmVEYXRhKCkgY2FsbGJhY2suCi0KLSAgLy8gQ29udGFpbmVyIGZvciByZXRyaWV2aW5nIGRhdGEgZnJvbSBBdWRpb1NvdXJjZUNhbGxiYWNrOjpPbk1vcmVEYXRhKCkuCi0gIHNjb3BlZF9wdHI8QXVkaW9CdXM+IGF1ZGlvX2J1c187Ci0KLSAgLy8gQ2hhbm5lbCBtaXhlciBhbmQgdGVtcG9yYXJ5IGJ1cyBmb3IgdGhlIGZpbmFsIG1peGVkIGNoYW5uZWwgZGF0YS4KLSAgc2NvcGVkX3B0cjxDaGFubmVsTWl4ZXI+IGNoYW5uZWxfbWl4ZXJfOwotICBzY29wZWRfcHRyPEF1ZGlvQnVzPiBtaXhlZF9hdWRpb19idXNfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBbHNhUGNtT3V0cHV0U3RyZWFtKTsKLX07Ci0KLU1FRElBX0VYUE9SVCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxzYVBjbU91dHB1dFN0cmVhbTo6SW50ZXJuYWxTdGF0ZSk7Ci0KLX07ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9BVURJT19MSU5VWF9BTFNBX09VVFBVVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2xpbnV4L2Fsc2Ffb3V0cHV0X3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2F1ZGlvL2xpbnV4L2Fsc2Ffb3V0cHV0X3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGI5N2FmLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9saW51eC9hbHNhX291dHB1dF91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDg2OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJiYXNlL3N0cmluZ3ByaW50Zi5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2xpbnV4L2Fsc2Ffb3V0cHV0LmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vbGludXgvYWxzYV93cmFwcGVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vbGludXgvYXVkaW9fbWFuYWdlcl9saW51eC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGF0YV9idWZmZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3NlZWthYmxlX2J1ZmZlci5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi11c2luZyB0ZXN0aW5nOjpfOwotdXNpbmcgdGVzdGluZzo6QWxsT2Y7Ci11c2luZyB0ZXN0aW5nOjpBdExlYXN0OwotdXNpbmcgdGVzdGluZzo6RG9BbGw7Ci11c2luZyB0ZXN0aW5nOjpGaWVsZDsKLXVzaW5nIHRlc3Rpbmc6OkluU2VxdWVuY2U7Ci11c2luZyB0ZXN0aW5nOjpJbnZva2U7Ci11c2luZyB0ZXN0aW5nOjpJbnZva2VXaXRob3V0QXJnczsKLXVzaW5nIHRlc3Rpbmc6Ok1vY2s7Ci11c2luZyB0ZXN0aW5nOjpNb2NrRnVuY3Rpb247Ci11c2luZyB0ZXN0aW5nOjpSZXR1cm47Ci11c2luZyB0ZXN0aW5nOjpTZXRBcmd1bWVudFBvaW50ZWU7Ci11c2luZyB0ZXN0aW5nOjpTdHJpY3RNb2NrOwotdXNpbmcgdGVzdGluZzo6U3RyRXE7Ci11c2luZyB0ZXN0aW5nOjpVbnVzZWQ7Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIE1vY2tBbHNhV3JhcHBlciA6IHB1YmxpYyBBbHNhV3JhcHBlciB7Ci0gcHVibGljOgotICBNT0NLX01FVEhPRDMoRGV2aWNlTmFtZUhpbnQsIGludChpbnQgY2FyZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiogaGludHMpKTsKLSAgTU9DS19NRVRIT0QyKERldmljZU5hbWVHZXRIaW50LCBjaGFyKihjb25zdCB2b2lkKiBoaW50LCBjb25zdCBjaGFyKiBpZCkpOwotICBNT0NLX01FVEhPRDEoRGV2aWNlTmFtZUZyZWVIaW50LCBpbnQodm9pZCoqIGhpbnRzKSk7Ci0KLSAgTU9DS19NRVRIT0Q0KFBjbU9wZW4sIGludChzbmRfcGNtX3QqKiBoYW5kbGUsIGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX3BjbV9zdHJlYW1fdCBzdHJlYW0sIGludCBtb2RlKSk7Ci0gIE1PQ0tfTUVUSE9EMShQY21DbG9zZSwgaW50KHNuZF9wY21fdCogaGFuZGxlKSk7Ci0gIE1PQ0tfTUVUSE9EMShQY21QcmVwYXJlLCBpbnQoc25kX3BjbV90KiBoYW5kbGUpKTsKLSAgTU9DS19NRVRIT0QxKFBjbURyb3AsIGludChzbmRfcGNtX3QqIGhhbmRsZSkpOwotICBNT0NLX01FVEhPRDIoUGNtRGVsYXksIGludChzbmRfcGNtX3QqIGhhbmRsZSwgc25kX3BjbV9zZnJhbWVzX3QqIGRlbGF5KSk7Ci0gIE1PQ0tfTUVUSE9EMyhQY21Xcml0ZWksIHNuZF9wY21fc2ZyYW1lc190KHNuZF9wY21fdCogaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9wY21fdWZyYW1lc190IHNpemUpKTsKLSAgTU9DS19NRVRIT0QzKFBjbVJlYWRpLCBzbmRfcGNtX3NmcmFtZXNfdChzbmRfcGNtX3QqIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX3BjbV91ZnJhbWVzX3Qgc2l6ZSkpOwotICBNT0NLX01FVEhPRDMoUGNtUmVjb3ZlciwgaW50KHNuZF9wY21fdCogaGFuZGxlLCBpbnQgZXJyLCBpbnQgc2lsZW50KSk7Ci0gIE1PQ0tfTUVUSE9ENyhQY21TZXRQYXJhbXMsIGludChzbmRfcGNtX3QqIGhhbmRsZSwgc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfcGNtX2FjY2Vzc190IGFjY2VzcywgdW5zaWduZWQgaW50IGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJhdGUsIGludCBzb2Z0X3Jlc2FtcGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxhdGVuY3kpKTsKLSAgTU9DS19NRVRIT0QzKFBjbUdldFBhcmFtcywgaW50KHNuZF9wY21fdCogaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX3BjbV91ZnJhbWVzX3QqIGJ1ZmZlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX3BjbV91ZnJhbWVzX3QqIHBlcmlvZF9zaXplKSk7Ci0gIE1PQ0tfTUVUSE9EMShQY21OYW1lLCBjb25zdCBjaGFyKihzbmRfcGNtX3QqIGhhbmRsZSkpOwotICBNT0NLX01FVEhPRDEoUGNtQXZhaWxVcGRhdGUsIHNuZF9wY21fc2ZyYW1lc190KHNuZF9wY21fdCogaGFuZGxlKSk7Ci0gIE1PQ0tfTUVUSE9EMShQY21TdGF0ZSwgc25kX3BjbV9zdGF0ZV90KHNuZF9wY21fdCogaGFuZGxlKSk7Ci0gIE1PQ0tfTUVUSE9EMShQY21TdGFydCwgaW50KHNuZF9wY21fdCogaGFuZGxlKSk7Ci0KLSAgTU9DS19NRVRIT0QxKFN0ckVycm9yLCBjb25zdCBjaGFyKihpbnQgZXJybnVtKSk7Ci19OwotCi1jbGFzcyBNb2NrQXVkaW9Tb3VyY2VDYWxsYmFjayA6IHB1YmxpYyBBdWRpb091dHB1dFN0cmVhbTo6QXVkaW9Tb3VyY2VDYWxsYmFjayB7Ci0gcHVibGljOgotICBNT0NLX01FVEhPRDIoT25Nb3JlRGF0YSwgaW50KEF1ZGlvQnVzKiBhdWRpb19idXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJzU3RhdGUgYnVmZmVyc19zdGF0ZSkpOwotICBNT0NLX01FVEhPRDMoT25Nb3JlSU9EYXRhLCBpbnQoQXVkaW9CdXMqIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVzKiBkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJzU3RhdGUgYnVmZmVyc19zdGF0ZSkpOwotICBNT0NLX01FVEhPRDIoT25FcnJvciwgdm9pZChBdWRpb091dHB1dFN0cmVhbSogc3RyZWFtLCBpbnQgY29kZSkpOwotfTsKLQotY2xhc3MgTW9ja0F1ZGlvTWFuYWdlckxpbnV4IDogcHVibGljIEF1ZGlvTWFuYWdlckxpbnV4IHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EMChJbml0LCB2b2lkKCkpOwotICBNT0NLX01FVEhPRDAoSGFzQXVkaW9PdXRwdXREZXZpY2VzLCBib29sKCkpOwotICBNT0NLX01FVEhPRDAoSGFzQXVkaW9JbnB1dERldmljZXMsIGJvb2woKSk7Ci0gIE1PQ0tfTUVUSE9EMShNYWtlTGluZWFyT3V0cHV0U3RyZWFtLCBBdWRpb091dHB1dFN0cmVhbSooCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcykpOwotICBNT0NLX01FVEhPRDEoTWFrZUxvd0xhdGVuY3lPdXRwdXRTdHJlYW0sIEF1ZGlvT3V0cHV0U3RyZWFtKigKLSAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKSk7Ci0gIE1PQ0tfTUVUSE9EMihNYWtlTG93TGF0ZW5jeUlucHV0U3RyZWFtLCBBdWRpb0lucHV0U3RyZWFtKigKLSAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2lkKSk7Ci0KLSAgLy8gV2UgbmVlZCB0byBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGluIG9yZGVyIHRvIHNraXAgdGhlIGNoZWNraW5nIHRoZSBudW1iZXIKLSAgLy8gb2YgYWN0aXZlIG91dHB1dCBzdHJlYW1zLiBJdCBpcyBiZWNhdXNlIHRoZSBudW1iZXIgb2YgYWN0aXZlIHN0cmVhbXMKLSAgLy8gaXMgbWFuYWdlZCBpbnNpZGUgTWFrZUF1ZGlvT3V0cHV0U3RyZWFtLCBhbmQgd2UgZG9uJ3QgdXNlCi0gIC8vIE1ha2VBdWRpb091dHB1dFN0cmVhbSB0byBjcmVhdGUgdGhlIHN0cmVhbSBpbiB0aGUgdGVzdHMuCi0gIHZpcnR1YWwgdm9pZCBSZWxlYXNlT3V0cHV0U3RyZWFtKEF1ZGlvT3V0cHV0U3RyZWFtKiBzdHJlYW0pIE9WRVJSSURFIHsKLSAgICBEQ0hFQ0soc3RyZWFtKTsKLSAgICBkZWxldGUgc3RyZWFtOwotICB9Ci0KLSAgLy8gV2UgZG9uJ3QgbW9jayB0aGlzIG1ldGhvZCBzaW5jZSBhbGwgdGVzdHMgd2lsbCBkbyB0aGUgc2FtZSB0aGluZwotICAvLyBhbmQgdXNlIHRoZSBjdXJyZW50IG1lc3NhZ2UgbG9vcC4KLSAgdmlydHVhbCBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+IEdldE1lc3NhZ2VMb29wKCkgT1ZFUlJJREUgewotICAgIHJldHVybiBNZXNzYWdlTG9vcDo6Y3VycmVudCgpLT5tZXNzYWdlX2xvb3BfcHJveHkoKTsKLSAgfQotfTsKLQotY2xhc3MgQWxzYVBjbU91dHB1dFN0cmVhbVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICBBbHNhUGNtT3V0cHV0U3RyZWFtVGVzdCgpIHsKLSAgICBtb2NrX21hbmFnZXJfLnJlc2V0KG5ldyBTdHJpY3RNb2NrPE1vY2tBdWRpb01hbmFnZXJMaW51eD4oKSk7Ci0gIH0KLQotICB2aXJ0dWFsIH5BbHNhUGNtT3V0cHV0U3RyZWFtVGVzdCgpIHsKLSAgfQotCi0gIEFsc2FQY21PdXRwdXRTdHJlYW0qIENyZWF0ZVN0cmVhbShDaGFubmVsTGF5b3V0IGxheW91dCkgewotICAgIHJldHVybiBDcmVhdGVTdHJlYW0obGF5b3V0LCBrVGVzdEZyYW1lc1BlclBhY2tldCk7Ci0gIH0KLQotICBBbHNhUGNtT3V0cHV0U3RyZWFtKiBDcmVhdGVTdHJlYW0oQ2hhbm5lbExheW91dCBsYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMiBzYW1wbGVzX3Blcl9wYWNrZXQpIHsKLSAgICBBdWRpb1BhcmFtZXRlcnMgcGFyYW1zKGtUZXN0Rm9ybWF0LCBsYXlvdXQsIGtUZXN0U2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUZXN0Qml0c1BlclNhbXBsZSwgc2FtcGxlc19wZXJfcGFja2V0KTsKLSAgICByZXR1cm4gbmV3IEFsc2FQY21PdXRwdXRTdHJlYW0oa1Rlc3REZXZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2NrX2Fsc2Ffd3JhcHBlcl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vY2tfbWFuYWdlcl8uZ2V0KCkpOwotICB9Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIG1hbGxvYyB0aGUgc3RyaW5nIHJldHVybmVkIGJ5IERldmljZU5hbWVIaW50IGZvciBOQU1FLgotICBzdGF0aWMgY2hhciogRWNob0hpbnQoY29uc3Qgdm9pZCogbmFtZSwgVW51c2VkKSB7Ci0gICAgcmV0dXJuIHN0cmR1cChzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4obmFtZSkpOwotICB9Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIG1hbGxvYyB0aGUgc3RyaW5nIHJldHVybmVkIGJ5IERldmljZU5hbWVIaW50IGZvciBJT0lELgotICBzdGF0aWMgY2hhciogT3V0cHV0SGludChVbnVzZWQsIFVudXNlZCkgewotICAgIHJldHVybiBzdHJkdXAoIk91dHB1dCIpOwotICB9Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgfHRlc3Rfc3RyZWFtLT5idWZmZXJffC4gTXVzdCBiZSBjYWxsZWQKLSAgLy8gaW4gYWxsIHRlc3RzIHRoYXQgdXNlIGJ1ZmZlcl8gd2l0aG91dCBvcGVuaW5nIHRoZSBzdHJlYW0uCi0gIHZvaWQgSW5pdEJ1ZmZlcihBbHNhUGNtT3V0cHV0U3RyZWFtKiB0ZXN0X3N0cmVhbSkgewotICAgIERDSEVDSyh0ZXN0X3N0cmVhbSk7Ci0gICAgcGFja2V0XyA9IG5ldyBtZWRpYTo6RGF0YUJ1ZmZlcihrVGVzdFBhY2tldFNpemUpOwotICAgIHBhY2tldF8tPlNldERhdGFTaXplKGtUZXN0UGFja2V0U2l6ZSk7Ci0gICAgdGVzdF9zdHJlYW0tPmJ1ZmZlcl8ucmVzZXQobmV3IG1lZGlhOjpTZWVrYWJsZUJ1ZmZlcigwLCBrVGVzdFBhY2tldFNpemUpKTsKLSAgICB0ZXN0X3N0cmVhbS0+YnVmZmVyXy0+QXBwZW5kKHBhY2tldF8uZ2V0KCkpOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IENoYW5uZWxMYXlvdXQga1Rlc3RDaGFubmVsTGF5b3V0OwotICBzdGF0aWMgY29uc3QgaW50IGtUZXN0U2FtcGxlUmF0ZTsKLSAgc3RhdGljIGNvbnN0IGludCBrVGVzdEJpdHNQZXJTYW1wbGU7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1Rlc3RCeXRlc1BlckZyYW1lOwotICBzdGF0aWMgY29uc3QgQXVkaW9QYXJhbWV0ZXJzOjpGb3JtYXQga1Rlc3RGb3JtYXQ7Ci0gIHN0YXRpYyBjb25zdCBjaGFyIGtUZXN0RGV2aWNlTmFtZVtdOwotICBzdGF0aWMgY29uc3QgY2hhciBrRHVtbXlNZXNzYWdlW107Ci0gIHN0YXRpYyBjb25zdCB1aW50MzIga1Rlc3RGcmFtZXNQZXJQYWNrZXQ7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1Rlc3RQYWNrZXRTaXplOwotICBzdGF0aWMgY29uc3QgaW50IGtUZXN0RmFpbGVkRXJybm87Ci0gIHN0YXRpYyBzbmRfcGNtX3QqIGNvbnN0IGtGYWtlSGFuZGxlOwotCi0gIC8vIFVzZWQgdG8gc2ltdWxhdGUgRGV2aWNlTmFtZUhpbnQuCi0gIHN0YXRpYyBjaGFyIGtTdXJyb3VuZDQwW107Ci0gIHN0YXRpYyBjaGFyIGtTdXJyb3VuZDQxW107Ci0gIHN0YXRpYyBjaGFyIGtTdXJyb3VuZDUwW107Ci0gIHN0YXRpYyBjaGFyIGtTdXJyb3VuZDUxW107Ci0gIHN0YXRpYyBjaGFyIGtTdXJyb3VuZDcwW107Ci0gIHN0YXRpYyBjaGFyIGtTdXJyb3VuZDcxW107Ci0gIHN0YXRpYyB2b2lkKiBrRmFrZUhpbnRzW107Ci0KLSAgU3RyaWN0TW9jazxNb2NrQWxzYVdyYXBwZXI+IG1vY2tfYWxzYV93cmFwcGVyXzsKLSAgc2NvcGVkX3B0cjxTdHJpY3RNb2NrPE1vY2tBdWRpb01hbmFnZXJMaW51eD4gPiBtb2NrX21hbmFnZXJfOwotICBNZXNzYWdlTG9vcCBtZXNzYWdlX2xvb3BfOwotICBzY29wZWRfcmVmcHRyPG1lZGlhOjpEYXRhQnVmZmVyPiBwYWNrZXRfOwotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEFsc2FQY21PdXRwdXRTdHJlYW1UZXN0KTsKLX07Ci0KLWNvbnN0IENoYW5uZWxMYXlvdXQgQWxzYVBjbU91dHB1dFN0cmVhbVRlc3Q6OmtUZXN0Q2hhbm5lbExheW91dCA9Ci0gICAgQ0hBTk5FTF9MQVlPVVRfU1RFUkVPOwotY29uc3QgaW50IEFsc2FQY21PdXRwdXRTdHJlYW1UZXN0OjprVGVzdFNhbXBsZVJhdGUgPQotICAgIEF1ZGlvUGFyYW1ldGVyczo6a0F1ZGlvQ0RTYW1wbGVSYXRlOwotY29uc3QgaW50IEFsc2FQY21PdXRwdXRTdHJlYW1UZXN0OjprVGVzdEJpdHNQZXJTYW1wbGUgPSA4OwotY29uc3QgaW50IEFsc2FQY21PdXRwdXRTdHJlYW1UZXN0OjprVGVzdEJ5dGVzUGVyRnJhbWUgPQotICAgIEFsc2FQY21PdXRwdXRTdHJlYW1UZXN0OjprVGVzdEJpdHNQZXJTYW1wbGUgLyA4ICoKLSAgICBDaGFubmVsTGF5b3V0VG9DaGFubmVsQ291bnQoQWxzYVBjbU91dHB1dFN0cmVhbVRlc3Q6OmtUZXN0Q2hhbm5lbExheW91dCk7Ci1jb25zdCBBdWRpb1BhcmFtZXRlcnM6OkZvcm1hdCBBbHNhUGNtT3V0cHV0U3RyZWFtVGVzdDo6a1Rlc3RGb3JtYXQgPQotICAgIEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xJTkVBUjsKLWNvbnN0IGNoYXIgQWxzYVBjbU91dHB1dFN0cmVhbVRlc3Q6OmtUZXN0RGV2aWNlTmFtZVtdID0gIlRlc3REZXZpY2UiOwotY29uc3QgY2hhciBBbHNhUGNtT3V0cHV0U3RyZWFtVGVzdDo6a0R1bW15TWVzc2FnZVtdID0gImR1bW15IjsKLWNvbnN0IHVpbnQzMiBBbHNhUGNtT3V0cHV0U3RyZWFtVGVzdDo6a1Rlc3RGcmFtZXNQZXJQYWNrZXQgPSAxMDAwOwotY29uc3QgaW50IEFsc2FQY21PdXRwdXRTdHJlYW1UZXN0OjprVGVzdFBhY2tldFNpemUgPQotICAgIEFsc2FQY21PdXRwdXRTdHJlYW1UZXN0OjprVGVzdEZyYW1lc1BlclBhY2tldCAqCi0gICAgQWxzYVBjbU91dHB1dFN0cmVhbVRlc3Q6OmtUZXN0Qnl0ZXNQZXJGcmFtZTsKLWNvbnN0IGludCBBbHNhUGNtT3V0cHV0U3RyZWFtVGVzdDo6a1Rlc3RGYWlsZWRFcnJubyA9IC1FQUNDRVM7Ci1zbmRfcGNtX3QqIGNvbnN0IEFsc2FQY21PdXRwdXRTdHJlYW1UZXN0OjprRmFrZUhhbmRsZSA9Ci0gICAgcmVpbnRlcnByZXRfY2FzdDxzbmRfcGNtX3QqPigxKTsKLQotY2hhciBBbHNhUGNtT3V0cHV0U3RyZWFtVGVzdDo6a1N1cnJvdW5kNDBbXSA9ICJzdXJyb3VuZDQwOkNBUkQ9Zm9vLERFVj0wIjsKLWNoYXIgQWxzYVBjbU91dHB1dFN0cmVhbVRlc3Q6OmtTdXJyb3VuZDQxW10gPSAic3Vycm91bmQ0MTpDQVJEPWZvbyxERVY9MCI7Ci1jaGFyIEFsc2FQY21PdXRwdXRTdHJlYW1UZXN0OjprU3Vycm91bmQ1MFtdID0gInN1cnJvdW5kNTA6Q0FSRD1mb28sREVWPTAiOwotY2hhciBBbHNhUGNtT3V0cHV0U3RyZWFtVGVzdDo6a1N1cnJvdW5kNTFbXSA9ICJzdXJyb3VuZDUxOkNBUkQ9Zm9vLERFVj0wIjsKLWNoYXIgQWxzYVBjbU91dHB1dFN0cmVhbVRlc3Q6OmtTdXJyb3VuZDcwW10gPSAic3Vycm91bmQ3MDpDQVJEPWZvbyxERVY9MCI7Ci1jaGFyIEFsc2FQY21PdXRwdXRTdHJlYW1UZXN0OjprU3Vycm91bmQ3MVtdID0gInN1cnJvdW5kNzE6Q0FSRD1mb28sREVWPTAiOwotdm9pZCogQWxzYVBjbU91dHB1dFN0cmVhbVRlc3Q6OmtGYWtlSGludHNbXSA9IHsKLSAgICBrU3Vycm91bmQ0MCwga1N1cnJvdW5kNDEsIGtTdXJyb3VuZDUwLCBrU3Vycm91bmQ1MSwKLSAgICBrU3Vycm91bmQ3MCwga1N1cnJvdW5kNzEsIE5VTEwgfTsKLQotLy8gQ3VzdG9tIGFjdGlvbiB0byBjbGVhciBhIG1lbW9yeSBidWZmZXIuCi1BQ1RJT04oQ2xlYXJCdWZmZXIpIHsKLSAgYXJnMC0+WmVybygpOwotfQotCi1URVNUX0YoQWxzYVBjbU91dHB1dFN0cmVhbVRlc3QsIENvbnN0cnVjdGVkU3RhdGUpIHsKLSAgQWxzYVBjbU91dHB1dFN0cmVhbSogdGVzdF9zdHJlYW0gPSBDcmVhdGVTdHJlYW0oa1Rlc3RDaGFubmVsTGF5b3V0KTsKLSAgRVhQRUNUX0VRKEFsc2FQY21PdXRwdXRTdHJlYW06OmtDcmVhdGVkLCB0ZXN0X3N0cmVhbS0+c3RhdGUoKSk7Ci0gIHRlc3Rfc3RyZWFtLT5DbG9zZSgpOwotCi0gIC8vIFNob3VsZCBzdXBwb3J0IG1vbm8uCi0gIHRlc3Rfc3RyZWFtID0gQ3JlYXRlU3RyZWFtKENIQU5ORUxfTEFZT1VUX01PTk8pOwotICBFWFBFQ1RfRVEoQWxzYVBjbU91dHB1dFN0cmVhbTo6a0NyZWF0ZWQsIHRlc3Rfc3RyZWFtLT5zdGF0ZSgpKTsKLSAgdGVzdF9zdHJlYW0tPkNsb3NlKCk7Ci0KLSAgLy8gU2hvdWxkIHN1cHBvcnQgbXVsdGktY2hhbm5lbC4KLSAgdGVzdF9zdHJlYW0gPSBDcmVhdGVTdHJlYW0oQ0hBTk5FTF9MQVlPVVRfU1VSUk9VTkQpOwotICBFWFBFQ1RfRVEoQWxzYVBjbU91dHB1dFN0cmVhbTo6a0NyZWF0ZWQsIHRlc3Rfc3RyZWFtLT5zdGF0ZSgpKTsKLSAgdGVzdF9zdHJlYW0tPkNsb3NlKCk7Ci0KLSAgLy8gQmFkIGJpdHMgcGVyIHNhbXBsZS4KLSAgQXVkaW9QYXJhbWV0ZXJzIGJhZF9icHNfcGFyYW1zKGtUZXN0Rm9ybWF0LCBrVGVzdENoYW5uZWxMYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVGVzdFNhbXBsZVJhdGUsIGtUZXN0Qml0c1BlclNhbXBsZSAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVGVzdEZyYW1lc1BlclBhY2tldCk7Ci0gIHRlc3Rfc3RyZWFtID0gbmV3IEFsc2FQY21PdXRwdXRTdHJlYW0oa1Rlc3REZXZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhZF9icHNfcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2NrX2Fsc2Ffd3JhcHBlcl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9ja19tYW5hZ2VyXy5nZXQoKSk7Ci0gIEVYUEVDVF9FUShBbHNhUGNtT3V0cHV0U3RyZWFtOjprSW5FcnJvciwgdGVzdF9zdHJlYW0tPnN0YXRlKCkpOwotICB0ZXN0X3N0cmVhbS0+Q2xvc2UoKTsKLQotICAvLyBCYWQgZm9ybWF0LgotICBBdWRpb1BhcmFtZXRlcnMgYmFkX2Zvcm1hdF9wYXJhbXMoCi0gICAgICBBdWRpb1BhcmFtZXRlcnM6OkFVRElPX0xBU1RfRk9STUFULCBrVGVzdENoYW5uZWxMYXlvdXQsIGtUZXN0U2FtcGxlUmF0ZSwKLSAgICAgIGtUZXN0Qml0c1BlclNhbXBsZSwga1Rlc3RGcmFtZXNQZXJQYWNrZXQpOwotICB0ZXN0X3N0cmVhbSA9IG5ldyBBbHNhUGNtT3V0cHV0U3RyZWFtKGtUZXN0RGV2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRfZm9ybWF0X3BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9ja19hbHNhX3dyYXBwZXJfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vY2tfbWFuYWdlcl8uZ2V0KCkpOwotICBFWFBFQ1RfRVEoQWxzYVBjbU91dHB1dFN0cmVhbTo6a0luRXJyb3IsIHRlc3Rfc3RyZWFtLT5zdGF0ZSgpKTsKLSAgdGVzdF9zdHJlYW0tPkNsb3NlKCk7Ci19Ci0KLVRFU1RfRihBbHNhUGNtT3V0cHV0U3RyZWFtVGVzdCwgTGF0ZW5jeUZsb29yKSB7Ci0gIGNvbnN0IGRvdWJsZSBrTWljcm9zUGVyRnJhbWUgPQotICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPigxMDAwMDAwKSAvIGtUZXN0U2FtcGxlUmF0ZTsKLSAgY29uc3QgZG91YmxlIGtQYWNrZXRGcmFtZXNJbk1pbkxhdGVuY3kgPQotICAgICAgQWxzYVBjbU91dHB1dFN0cmVhbTo6a01pbkxhdGVuY3lNaWNyb3MgLyBrTWljcm9zUGVyRnJhbWUgLyAyLjA7Ci0KLSAgLy8gVGVzdCB0aGF0IHBhY2tldHMgd2hpY2ggd291bGQgY2F1c2UgYSBsYXRlbmN5IHVuZGVyIGxlc3MgdGhhbgotICAvLyBBbHNhUGNtT3V0cHV0U3RyZWFtOjprTWluTGF0ZW5jeU1pY3JvcyB3aWxsIGdldCBjbGlwcGVkIHRvCi0gIC8vIEFsc2FQY21PdXRwdXRTdHJlYW06OmtNaW5MYXRlbmN5TWljcm9zLAotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIFBjbU9wZW4oXywgXywgXywgXykpCi0gICAgICAuV2lsbE9uY2UoRG9BbGwoU2V0QXJndW1lbnRQb2ludGVlPDA+KGtGYWtlSGFuZGxlKSwKLSAgICAgICAgICAgICAgICAgICAgICBSZXR1cm4oMCkpKTsKLSAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLAotICAgICAgICAgICAgICBQY21TZXRQYXJhbXMoXywgXywgXywgXywgXywgXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsc2FQY21PdXRwdXRTdHJlYW06OmtNaW5MYXRlbmN5TWljcm9zKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oMCkpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIFBjbUdldFBhcmFtcyhfLCBfLCBfKSkKLSAgICAgIC5XaWxsT25jZShEb0FsbChTZXRBcmd1bWVudFBvaW50ZWU8MT4oa1Rlc3RGcmFtZXNQZXJQYWNrZXQpLAotICAgICAgICAgICAgICAgICAgICAgIFNldEFyZ3VtZW50UG9pbnRlZTwyPihrVGVzdEZyYW1lc1BlclBhY2tldCAvIDIpLAotICAgICAgICAgICAgICAgICAgICAgIFJldHVybigwKSkpOwotCi0gIEFsc2FQY21PdXRwdXRTdHJlYW0qIHRlc3Rfc3RyZWFtID0gQ3JlYXRlU3RyZWFtKGtUZXN0Q2hhbm5lbExheW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1BhY2tldEZyYW1lc0luTWluTGF0ZW5jeSk7Ci0gIEFTU0VSVF9UUlVFKHRlc3Rfc3RyZWFtLT5PcGVuKCkpOwotCi0gIC8vIE5vdyBjbG9zZSBpdCBhbmQgdGVzdCB0aGF0IGV2ZXJ5dGhpbmcgd2FzIHJlbGVhc2VkLgotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIFBjbUNsb3NlKGtGYWtlSGFuZGxlKSkuV2lsbE9uY2UoUmV0dXJuKDApKTsKLSAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLCBQY21OYW1lKGtGYWtlSGFuZGxlKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oa1Rlc3REZXZpY2VOYW1lKSk7Ci0gIHRlc3Rfc3RyZWFtLT5DbG9zZSgpOwotCi0gIE1vY2s6OlZlcmlmeUFuZENsZWFyKCZtb2NrX2Fsc2Ffd3JhcHBlcl8pOwotICBNb2NrOjpWZXJpZnlBbmRDbGVhcihtb2NrX21hbmFnZXJfLmdldCgpKTsKLQotICAvLyBUZXN0IHRoYXQgaGF2aW5nIG1vcmUgcGFja2V0cyBlbmRzIHVwIHdpdGggYSBsYXRlbmN5IGJhc2VkIG9uIHBhY2tldCBzaXplLgotICBjb25zdCBpbnQga092ZXJNaW5MYXRlbmN5UGFja2V0U2l6ZSA9IGtQYWNrZXRGcmFtZXNJbk1pbkxhdGVuY3kgKyAxOwotICBpbnQ2NCBleHBlY3RlZF9taWNyb3MgPSAyICogQWxzYVBjbU91dHB1dFN0cmVhbTo6RnJhbWVzVG9NaWNyb3MoCi0gICAgICBrT3Zlck1pbkxhdGVuY3lQYWNrZXRTaXplLCBrVGVzdFNhbXBsZVJhdGUpOwotCi0gIEVYUEVDVF9DQUxMKG1vY2tfYWxzYV93cmFwcGVyXywgUGNtT3BlbihfLCBfLCBfLCBfKSkKLSAgICAgIC5XaWxsT25jZShEb0FsbChTZXRBcmd1bWVudFBvaW50ZWU8MD4oa0Zha2VIYW5kbGUpLCBSZXR1cm4oMCkpKTsKLSAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLAotICAgICAgICAgICAgICBQY21TZXRQYXJhbXMoXywgXywgXywgXywgXywgXywgZXhwZWN0ZWRfbWljcm9zKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oMCkpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIFBjbUdldFBhcmFtcyhfLCBfLCBfKSkKLSAgICAgIC5XaWxsT25jZShEb0FsbChTZXRBcmd1bWVudFBvaW50ZWU8MT4oa1Rlc3RGcmFtZXNQZXJQYWNrZXQpLAotICAgICAgICAgICAgICAgICAgICAgIFNldEFyZ3VtZW50UG9pbnRlZTwyPihrVGVzdEZyYW1lc1BlclBhY2tldCAvIDIpLAotICAgICAgICAgICAgICAgICAgICAgIFJldHVybigwKSkpOwotCi0gIHRlc3Rfc3RyZWFtID0gQ3JlYXRlU3RyZWFtKGtUZXN0Q2hhbm5lbExheW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAga092ZXJNaW5MYXRlbmN5UGFja2V0U2l6ZSk7Ci0gIEFTU0VSVF9UUlVFKHRlc3Rfc3RyZWFtLT5PcGVuKCkpOwotCi0gIC8vIE5vdyBjbG9zZSBpdCBhbmQgdGVzdCB0aGF0IGV2ZXJ5dGhpbmcgd2FzIHJlbGVhc2VkLgotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIFBjbUNsb3NlKGtGYWtlSGFuZGxlKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oMCkpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIFBjbU5hbWUoa0Zha2VIYW5kbGUpKQotICAgICAgLldpbGxPbmNlKFJldHVybihrVGVzdERldmljZU5hbWUpKTsKLSAgdGVzdF9zdHJlYW0tPkNsb3NlKCk7Ci0KLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXIoJm1vY2tfYWxzYV93cmFwcGVyXyk7Ci0gIE1vY2s6OlZlcmlmeUFuZENsZWFyKG1vY2tfbWFuYWdlcl8uZ2V0KCkpOwotfQotCi1URVNUX0YoQWxzYVBjbU91dHB1dFN0cmVhbVRlc3QsIE9wZW5DbG9zZSkgewotICBpbnQ2NCBleHBlY3RlZF9taWNyb3MgPSAyICoKLSAgICAgIEFsc2FQY21PdXRwdXRTdHJlYW06OkZyYW1lc1RvTWljcm9zKGtUZXN0UGFja2V0U2l6ZSAvIGtUZXN0Qnl0ZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUZXN0U2FtcGxlUmF0ZSk7Ci0KLSAgLy8gT3BlbigpIGNhbGwgb3BlbnMgdGhlIHBsYXliYWNrIGRldmljZSwgc2V0cyB0aGUgcGFyYW1ldGVycywgcG9zdHMgYSB0YXNrCi0gIC8vIHdpdGggdGhlIHJlc3VsdGluZyBjb25maWd1cmF0aW9uIGRhdGEsIGFuZCB0cmFuc2l0aW9ucyB0aGUgb2JqZWN0IHN0YXRlIHRvCi0gIC8vIGtJc09wZW5lZC4KLSAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLAotICAgICAgICAgICAgICBQY21PcGVuKF8sIFN0ckVxKGtUZXN0RGV2aWNlTmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgU05EX1BDTV9TVFJFQU1fUExBWUJBQ0ssIFNORF9QQ01fTk9OQkxPQ0spKQotICAgICAgLldpbGxPbmNlKERvQWxsKFNldEFyZ3VtZW50UG9pbnRlZTwwPihrRmFrZUhhbmRsZSksCi0gICAgICAgICAgICAgICAgICAgICAgUmV0dXJuKDApKSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYWxzYV93cmFwcGVyXywKLSAgICAgICAgICAgICAgUGNtU2V0UGFyYW1zKGtGYWtlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU05EX1BDTV9GT1JNQVRfVTgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTTkRfUENNX0FDQ0VTU19SV19JTlRFUkxFQVZFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWxMYXlvdXRUb0NoYW5uZWxDb3VudChrVGVzdENoYW5uZWxMYXlvdXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAga1Rlc3RTYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX21pY3JvcykpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKDApKTsKLSAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLCBQY21HZXRQYXJhbXMoa0Zha2VIYW5kbGUsIF8sIF8pKQotICAgICAgLldpbGxPbmNlKERvQWxsKFNldEFyZ3VtZW50UG9pbnRlZTwxPihrVGVzdEZyYW1lc1BlclBhY2tldCksCi0gICAgICAgICAgICAgICAgICAgICAgU2V0QXJndW1lbnRQb2ludGVlPDI+KGtUZXN0RnJhbWVzUGVyUGFja2V0IC8gMiksCi0gICAgICAgICAgICAgICAgICAgICAgUmV0dXJuKDApKSk7Ci0KLSAgLy8gT3BlbiB0aGUgc3RyZWFtLgotICBBbHNhUGNtT3V0cHV0U3RyZWFtKiB0ZXN0X3N0cmVhbSA9IENyZWF0ZVN0cmVhbShrVGVzdENoYW5uZWxMYXlvdXQpOwotICBBU1NFUlRfVFJVRSh0ZXN0X3N0cmVhbS0+T3BlbigpKTsKLQotICBFWFBFQ1RfRVEoQWxzYVBjbU91dHB1dFN0cmVhbTo6a0lzT3BlbmVkLCB0ZXN0X3N0cmVhbS0+c3RhdGUoKSk7Ci0gIEVYUEVDVF9FUShrRmFrZUhhbmRsZSwgdGVzdF9zdHJlYW0tPnBsYXliYWNrX2hhbmRsZV8pOwotICBFWFBFQ1RfRVEoa1Rlc3RGcmFtZXNQZXJQYWNrZXQsIHRlc3Rfc3RyZWFtLT5mcmFtZXNfcGVyX3BhY2tldF8pOwotICBFWFBFQ1RfVFJVRSh0ZXN0X3N0cmVhbS0+YnVmZmVyXy5nZXQoKSk7Ci0gIEVYUEVDVF9GQUxTRSh0ZXN0X3N0cmVhbS0+c3RvcF9zdHJlYW1fKTsKLQotICAvLyBOb3cgY2xvc2UgaXQgYW5kIHRlc3QgdGhhdCBldmVyeXRoaW5nIHdhcyByZWxlYXNlZC4KLSAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLCBQY21DbG9zZShrRmFrZUhhbmRsZSkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKDApKTsKLSAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLCBQY21OYW1lKGtGYWtlSGFuZGxlKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oa1Rlc3REZXZpY2VOYW1lKSk7Ci0gIHRlc3Rfc3RyZWFtLT5DbG9zZSgpOwotfQotCi1URVNUX0YoQWxzYVBjbU91dHB1dFN0cmVhbVRlc3QsIFBjbU9wZW5GYWlsZWQpIHsKLSAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLCBQY21PcGVuKF8sIF8sIF8sIF8pKQotICAgICAgLldpbGxPbmNlKFJldHVybihrVGVzdEZhaWxlZEVycm5vKSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYWxzYV93cmFwcGVyXywgU3RyRXJyb3Ioa1Rlc3RGYWlsZWRFcnJubykpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKGtEdW1teU1lc3NhZ2UpKTsKLQotICBBbHNhUGNtT3V0cHV0U3RyZWFtKiB0ZXN0X3N0cmVhbSA9IENyZWF0ZVN0cmVhbShrVGVzdENoYW5uZWxMYXlvdXQpOwotICBBU1NFUlRfRkFMU0UodGVzdF9zdHJlYW0tPk9wZW4oKSk7Ci0gIEFTU0VSVF9FUShBbHNhUGNtT3V0cHV0U3RyZWFtOjprSW5FcnJvciwgdGVzdF9zdHJlYW0tPnN0YXRlKCkpOwotCi0gIC8vIEVuc3VyZSBpbnRlcm5hbCBzdGF0ZSBpcyBzZXQgZm9yIGEgbm8tb3Agc3RyZWFtIGlmIFBjbU9wZW4oKSBmYWlsZXMuCi0gIEVYUEVDVF9UUlVFKHRlc3Rfc3RyZWFtLT5zdG9wX3N0cmVhbV8pOwotICBFWFBFQ1RfVFJVRSh0ZXN0X3N0cmVhbS0+cGxheWJhY2tfaGFuZGxlXyA9PSBOVUxMKTsKLSAgRVhQRUNUX0ZBTFNFKHRlc3Rfc3RyZWFtLT5idWZmZXJfLmdldCgpKTsKLQotICAvLyBDbG9zZSB0aGUgc3RyZWFtIHNpbmNlIHdlIG9wZW5lZCBpdCB0byBtYWtlIGRlc3RydWN0aW9uIGhhcHB5LgotICB0ZXN0X3N0cmVhbS0+Q2xvc2UoKTsKLX0KLQotVEVTVF9GKEFsc2FQY21PdXRwdXRTdHJlYW1UZXN0LCBQY21TZXRQYXJhbXNGYWlsZWQpIHsKLSAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLCBQY21PcGVuKF8sIF8sIF8sIF8pKQotICAgICAgLldpbGxPbmNlKERvQWxsKFNldEFyZ3VtZW50UG9pbnRlZTwwPihrRmFrZUhhbmRsZSksCi0gICAgICAgICAgICAgICAgICAgICAgUmV0dXJuKDApKSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYWxzYV93cmFwcGVyXywgUGNtU2V0UGFyYW1zKF8sIF8sIF8sIF8sIF8sIF8sIF8pKQotICAgICAgLldpbGxPbmNlKFJldHVybihrVGVzdEZhaWxlZEVycm5vKSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYWxzYV93cmFwcGVyXywgUGNtQ2xvc2Uoa0Zha2VIYW5kbGUpKQotICAgICAgLldpbGxPbmNlKFJldHVybigwKSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYWxzYV93cmFwcGVyXywgUGNtTmFtZShrRmFrZUhhbmRsZSkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKGtUZXN0RGV2aWNlTmFtZSkpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIFN0ckVycm9yKGtUZXN0RmFpbGVkRXJybm8pKQotICAgICAgLldpbGxPbmNlKFJldHVybihrRHVtbXlNZXNzYWdlKSk7Ci0KLSAgLy8gSWYgb3BlbiBmYWlscywgdGhlIHN0cmVhbSBzdGF5cyBpbiBrQ3JlYXRlZCBiZWNhdXNlIGl0IGhhcyBlZmZlY3RpdmVseSBoYWQKLSAgLy8gbm8gY2hhbmdlcy4KLSAgQWxzYVBjbU91dHB1dFN0cmVhbSogdGVzdF9zdHJlYW0gPSBDcmVhdGVTdHJlYW0oa1Rlc3RDaGFubmVsTGF5b3V0KTsKLSAgQVNTRVJUX0ZBTFNFKHRlc3Rfc3RyZWFtLT5PcGVuKCkpOwotICBFWFBFQ1RfRVEoQWxzYVBjbU91dHB1dFN0cmVhbTo6a0luRXJyb3IsIHRlc3Rfc3RyZWFtLT5zdGF0ZSgpKTsKLQotICAvLyBFbnN1cmUgaW50ZXJuYWwgc3RhdGUgaXMgc2V0IGZvciBhIG5vLW9wIHN0cmVhbSBpZiBQY21TZXRQYXJhbXMoKSBmYWlsZXMuCi0gIEVYUEVDVF9UUlVFKHRlc3Rfc3RyZWFtLT5zdG9wX3N0cmVhbV8pOwotICBFWFBFQ1RfVFJVRSh0ZXN0X3N0cmVhbS0+cGxheWJhY2tfaGFuZGxlXyA9PSBOVUxMKTsKLSAgRVhQRUNUX0ZBTFNFKHRlc3Rfc3RyZWFtLT5idWZmZXJfLmdldCgpKTsKLQotICAvLyBDbG9zZSB0aGUgc3RyZWFtIHNpbmNlIHdlIG9wZW5lZCBpdCB0byBtYWtlIGRlc3RydWN0aW9uIGhhcHB5LgotICB0ZXN0X3N0cmVhbS0+Q2xvc2UoKTsKLX0KLQotVEVTVF9GKEFsc2FQY21PdXRwdXRTdHJlYW1UZXN0LCBTdGFydFN0b3ApIHsKLSAgLy8gT3BlbigpIGNhbGwgb3BlbnMgdGhlIHBsYXliYWNrIGRldmljZSwgc2V0cyB0aGUgcGFyYW1ldGVycywgcG9zdHMgYSB0YXNrCi0gIC8vIHdpdGggdGhlIHJlc3VsdGluZyBjb25maWd1cmF0aW9uIGRhdGEsIGFuZCB0cmFuc2l0aW9ucyB0aGUgb2JqZWN0IHN0YXRlIHRvCi0gIC8vIGtJc09wZW5lZC4KLSAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLCBQY21PcGVuKF8sIF8sIF8sIF8pKQotICAgICAgLldpbGxPbmNlKERvQWxsKFNldEFyZ3VtZW50UG9pbnRlZTwwPihrRmFrZUhhbmRsZSksCi0gICAgICAgICAgICAgICAgICAgICAgUmV0dXJuKDApKSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYWxzYV93cmFwcGVyXywgUGNtU2V0UGFyYW1zKF8sIF8sIF8sIF8sIF8sIF8sIF8pKQotICAgICAgLldpbGxPbmNlKFJldHVybigwKSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYWxzYV93cmFwcGVyXywgUGNtR2V0UGFyYW1zKF8sIF8sIF8pKQotICAgICAgLldpbGxPbmNlKERvQWxsKFNldEFyZ3VtZW50UG9pbnRlZTwxPihrVGVzdEZyYW1lc1BlclBhY2tldCksCi0gICAgICAgICAgICAgICAgICAgICAgU2V0QXJndW1lbnRQb2ludGVlPDI+KGtUZXN0RnJhbWVzUGVyUGFja2V0IC8gMiksCi0gICAgICAgICAgICAgICAgICAgICAgUmV0dXJuKDApKSk7Ci0KLSAgLy8gT3BlbiB0aGUgc3RyZWFtLgotICBBbHNhUGNtT3V0cHV0U3RyZWFtKiB0ZXN0X3N0cmVhbSA9IENyZWF0ZVN0cmVhbShrVGVzdENoYW5uZWxMYXlvdXQpOwotICBBU1NFUlRfVFJVRSh0ZXN0X3N0cmVhbS0+T3BlbigpKTsKLQotICAvLyBFeHBlY3QgRGV2aWNlIHNldHVwLgotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIFBjbURyb3Aoa0Zha2VIYW5kbGUpKQotICAgICAgLldpbGxPbmNlKFJldHVybigwKSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYWxzYV93cmFwcGVyXywgUGNtUHJlcGFyZShrRmFrZUhhbmRsZSkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKDApKTsKLQotICAvLyBFeHBlY3QgdGhlIHByZS1yb2xsLgotICBNb2NrQXVkaW9Tb3VyY2VDYWxsYmFjayBtb2NrX2NhbGxiYWNrOwotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIFBjbVN0YXRlKGtGYWtlSGFuZGxlKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oU05EX1BDTV9TVEFURV9SVU5OSU5HKSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYWxzYV93cmFwcGVyXywgUGNtRGVsYXkoa0Zha2VIYW5kbGUsIF8pKQotICAgICAgLldpbGxSZXBlYXRlZGx5KERvQWxsKFNldEFyZ3VtZW50UG9pbnRlZTwxPigwKSwgUmV0dXJuKDApKSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfY2FsbGJhY2ssIE9uTW9yZURhdGEoXywgXykpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoRG9BbGwoQ2xlYXJCdWZmZXIoKSwgUmV0dXJuKGtUZXN0RnJhbWVzUGVyUGFja2V0KSkpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIFBjbVdyaXRlaShrRmFrZUhhbmRsZSwgXywgXykpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKGtUZXN0RnJhbWVzUGVyUGFja2V0KSk7Ci0KLSAgLy8gRXhwZWN0IHNjaGVkdWxpbmcuCi0gIEVYUEVDVF9DQUxMKG1vY2tfYWxzYV93cmFwcGVyXywgUGNtQXZhaWxVcGRhdGUoa0Zha2VIYW5kbGUpKQotICAgICAgLlRpbWVzKEF0TGVhc3QoMikpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKGtUZXN0RnJhbWVzUGVyUGFja2V0KSk7Ci0KLSAgdGVzdF9zdHJlYW0tPlN0YXJ0KCZtb2NrX2NhbGxiYWNrKTsKLSAgLy8gU3RhcnQoKSB3aWxsIGlzc3VlIGEgV3JpdGVUYXNrKCkgZGlyZWN0bHkgYW5kIHRoZW4gc2NoZWR1bGUgdGhlIG5leHQgb25lLAotICAvLyBjYWxsIFN0b3AoKSBpbW1lZGlhdGVseSBhZnRlciB0byBlbnN1cmUgd2UgZG9uJ3QgcnVuIHRoZSBtZXNzYWdlIGxvb3AKLSAgLy8gZm9yZXZlci4KLSAgdGVzdF9zdHJlYW0tPlN0b3AoKTsKLSAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLQotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIFBjbUNsb3NlKGtGYWtlSGFuZGxlKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oMCkpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIFBjbU5hbWUoa0Zha2VIYW5kbGUpKQotICAgICAgLldpbGxPbmNlKFJldHVybihrVGVzdERldmljZU5hbWUpKTsKLSAgdGVzdF9zdHJlYW0tPkNsb3NlKCk7Ci19Ci0KLVRFU1RfRihBbHNhUGNtT3V0cHV0U3RyZWFtVGVzdCwgV3JpdGVQYWNrZXRfRmluaXNoZWRQYWNrZXQpIHsKLSAgQWxzYVBjbU91dHB1dFN0cmVhbSogdGVzdF9zdHJlYW0gPSBDcmVhdGVTdHJlYW0oa1Rlc3RDaGFubmVsTGF5b3V0KTsKLSAgSW5pdEJ1ZmZlcih0ZXN0X3N0cmVhbSk7Ci0gIHRlc3Rfc3RyZWFtLT5UcmFuc2l0aW9uVG8oQWxzYVBjbU91dHB1dFN0cmVhbTo6a0lzT3BlbmVkKTsKLSAgdGVzdF9zdHJlYW0tPlRyYW5zaXRpb25UbyhBbHNhUGNtT3V0cHV0U3RyZWFtOjprSXNQbGF5aW5nKTsKLQotICAvLyBOb3RoaW5nIHNob3VsZCBoYXBwZW4uICBEb24ndCBzZXQgYW55IGV4cGVjdGF0aW9ucyBhbmQgT3VyIHN0cmljdCBtb2NrcwotICAvLyBzaG91bGQgdmVyaWZ5IG1vc3Qgb2YgdGhpcy4KLQotICAvLyBUZXN0IGVtcHR5IGJ1ZmZlci4KLSAgdGVzdF9zdHJlYW0tPmJ1ZmZlcl8tPkNsZWFyKCk7Ci0gIHRlc3Rfc3RyZWFtLT5Xcml0ZVBhY2tldCgpOwotICB0ZXN0X3N0cmVhbS0+Q2xvc2UoKTsKLX0KLQotVEVTVF9GKEFsc2FQY21PdXRwdXRTdHJlYW1UZXN0LCBXcml0ZVBhY2tldF9Ob3JtYWxQYWNrZXQpIHsKLSAgLy8gV2UgbmVlZCB0byBvcGVuIHRoZSBzdHJlYW0gYmVmb3JlIHdyaXRpbmcgZGF0YSB0byBBTFNBLgotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIFBjbU9wZW4oXywgXywgXywgXykpCi0gICAgICAuV2lsbE9uY2UoRG9BbGwoU2V0QXJndW1lbnRQb2ludGVlPDA+KGtGYWtlSGFuZGxlKSwKLSAgICAgICAgICAgICAgICAgICAgICBSZXR1cm4oMCkpKTsKLSAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLCBQY21TZXRQYXJhbXMoXywgXywgXywgXywgXywgXywgXykpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKDApKTsKLSAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLCBQY21HZXRQYXJhbXMoXywgXywgXykpCi0gICAgICAuV2lsbE9uY2UoRG9BbGwoU2V0QXJndW1lbnRQb2ludGVlPDE+KGtUZXN0RnJhbWVzUGVyUGFja2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICBTZXRBcmd1bWVudFBvaW50ZWU8Mj4oa1Rlc3RGcmFtZXNQZXJQYWNrZXQgLyAyKSwKLSAgICAgICAgICAgICAgICAgICAgICBSZXR1cm4oMCkpKTsKLSAgQWxzYVBjbU91dHB1dFN0cmVhbSogdGVzdF9zdHJlYW0gPSBDcmVhdGVTdHJlYW0oa1Rlc3RDaGFubmVsTGF5b3V0KTsKLSAgQVNTRVJUX1RSVUUodGVzdF9zdHJlYW0tPk9wZW4oKSk7Ci0gIEluaXRCdWZmZXIodGVzdF9zdHJlYW0pOwotICB0ZXN0X3N0cmVhbS0+VHJhbnNpdGlvblRvKEFsc2FQY21PdXRwdXRTdHJlYW06OmtJc1BsYXlpbmcpOwotCi0gIC8vIFdyaXRlIGEgbGl0dGxlIGxlc3MgdGhhbiBoYWxmIHRoZSBkYXRhLgotICBpbnQgd3JpdHRlbiA9IHBhY2tldF8tPkdldERhdGFTaXplKCkgLyBrVGVzdEJ5dGVzUGVyRnJhbWUgLyAyIC0gMTsKLSAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLCBQY21BdmFpbFVwZGF0ZShrRmFrZUhhbmRsZSkpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4od3JpdHRlbikpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIFBjbVdyaXRlaShrRmFrZUhhbmRsZSwgcGFja2V0Xy0+R2V0RGF0YSgpLCBfKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4od3JpdHRlbikpOwotCi0gIHRlc3Rfc3RyZWFtLT5Xcml0ZVBhY2tldCgpOwotCi0gIEFTU0VSVF9FUSh0ZXN0X3N0cmVhbS0+YnVmZmVyXy0+Zm9yd2FyZF9ieXRlcygpLAotICAgICAgICAgICAgcGFja2V0Xy0+R2V0RGF0YVNpemUoKSAtIHdyaXR0ZW4gKiBrVGVzdEJ5dGVzUGVyRnJhbWUpOwotCi0gIC8vIFdyaXRlIHRoZSByZXN0LgotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIFBjbUF2YWlsVXBkYXRlKGtGYWtlSGFuZGxlKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oa1Rlc3RGcmFtZXNQZXJQYWNrZXQgLSB3cml0dGVuKSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYWxzYV93cmFwcGVyXywKLSAgICAgICAgICAgICAgUGNtV3JpdGVpKGtGYWtlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0Xy0+R2V0RGF0YSgpICsgd3JpdHRlbiAqIGtUZXN0Qnl0ZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIF8pKQotICAgICAgLldpbGxPbmNlKFJldHVybihwYWNrZXRfLT5HZXREYXRhU2l6ZSgpIC8ga1Rlc3RCeXRlc1BlckZyYW1lIC0gd3JpdHRlbikpOwotICB0ZXN0X3N0cmVhbS0+V3JpdGVQYWNrZXQoKTsKLSAgRVhQRUNUX0VRKDAsIHRlc3Rfc3RyZWFtLT5idWZmZXJfLT5mb3J3YXJkX2J5dGVzKCkpOwotCi0gIC8vIE5vdyBjbG9zZSBpdCBhbmQgdGVzdCB0aGF0IGV2ZXJ5dGhpbmcgd2FzIHJlbGVhc2VkLgotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIFBjbUNsb3NlKGtGYWtlSGFuZGxlKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oMCkpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIFBjbU5hbWUoa0Zha2VIYW5kbGUpKQotICAgICAgLldpbGxPbmNlKFJldHVybihrVGVzdERldmljZU5hbWUpKTsKLSAgdGVzdF9zdHJlYW0tPkNsb3NlKCk7Ci19Ci0KLVRFU1RfRihBbHNhUGNtT3V0cHV0U3RyZWFtVGVzdCwgV3JpdGVQYWNrZXRfV3JpdGVGYWlscykgewotICAvLyBXZSBuZWVkIHRvIG9wZW4gdGhlIHN0cmVhbSBiZWZvcmUgd3JpdGluZyBkYXRhIHRvIEFMU0EuCi0gIEVYUEVDVF9DQUxMKG1vY2tfYWxzYV93cmFwcGVyXywgUGNtT3BlbihfLCBfLCBfLCBfKSkKLSAgICAgIC5XaWxsT25jZShEb0FsbChTZXRBcmd1bWVudFBvaW50ZWU8MD4oa0Zha2VIYW5kbGUpLAotICAgICAgICAgICAgICAgICAgICAgIFJldHVybigwKSkpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIFBjbVNldFBhcmFtcyhfLCBfLCBfLCBfLCBfLCBfLCBfKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oMCkpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIFBjbUdldFBhcmFtcyhfLCBfLCBfKSkKLSAgICAgIC5XaWxsT25jZShEb0FsbChTZXRBcmd1bWVudFBvaW50ZWU8MT4oa1Rlc3RGcmFtZXNQZXJQYWNrZXQpLAotICAgICAgICAgICAgICAgICAgICAgIFNldEFyZ3VtZW50UG9pbnRlZTwyPihrVGVzdEZyYW1lc1BlclBhY2tldCAvIDIpLAotICAgICAgICAgICAgICAgICAgICAgIFJldHVybigwKSkpOwotICBBbHNhUGNtT3V0cHV0U3RyZWFtKiB0ZXN0X3N0cmVhbSA9IENyZWF0ZVN0cmVhbShrVGVzdENoYW5uZWxMYXlvdXQpOwotICBBU1NFUlRfVFJVRSh0ZXN0X3N0cmVhbS0+T3BlbigpKTsKLSAgSW5pdEJ1ZmZlcih0ZXN0X3N0cmVhbSk7Ci0gIHRlc3Rfc3RyZWFtLT5UcmFuc2l0aW9uVG8oQWxzYVBjbU91dHB1dFN0cmVhbTo6a0lzUGxheWluZyk7Ci0KLSAgLy8gRmFpbCBkdWUgdG8gYSByZWNvdmVyYWJsZSBlcnJvciBhbmQgc2VlIHRoYXQgUGNtUmVjb3ZlciBjb2RlIHBhdGgKLSAgLy8gY29udGludWVzIG5vcm1hbGx5LgotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIFBjbUF2YWlsVXBkYXRlKGtGYWtlSGFuZGxlKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oa1Rlc3RGcmFtZXNQZXJQYWNrZXQpKTsKLSAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLCBQY21Xcml0ZWkoa0Zha2VIYW5kbGUsIF8sIF8pKQotICAgICAgLldpbGxPbmNlKFJldHVybigtRUlOVFIpKTsKLSAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLCBQY21SZWNvdmVyKGtGYWtlSGFuZGxlLCBfLCBfKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oMCkpOwotCi0gIHRlc3Rfc3RyZWFtLT5Xcml0ZVBhY2tldCgpOwotCi0gIEFTU0VSVF9FUSh0ZXN0X3N0cmVhbS0+YnVmZmVyXy0+Zm9yd2FyZF9ieXRlcygpLCBwYWNrZXRfLT5HZXREYXRhU2l6ZSgpKTsKLQotICAvLyBGYWlsIHRoZSBuZXh0IHdyaXRlLCBhbmQgc2VlIHRoYXQgc3RvcF9zdHJlYW1fIGlzIHNldC4KLSAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLCBQY21BdmFpbFVwZGF0ZShrRmFrZUhhbmRsZSkpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4oa1Rlc3RGcmFtZXNQZXJQYWNrZXQpKTsKLSAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLCBQY21Xcml0ZWkoa0Zha2VIYW5kbGUsIF8sIF8pKQotICAgICAgLldpbGxPbmNlKFJldHVybihrVGVzdEZhaWxlZEVycm5vKSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYWxzYV93cmFwcGVyXywgUGNtUmVjb3ZlcihrRmFrZUhhbmRsZSwgXywgXykpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKGtUZXN0RmFpbGVkRXJybm8pKTsKLSAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLCBTdHJFcnJvcihrVGVzdEZhaWxlZEVycm5vKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oa0R1bW15TWVzc2FnZSkpOwotICB0ZXN0X3N0cmVhbS0+V3JpdGVQYWNrZXQoKTsKLSAgRVhQRUNUX0VRKHRlc3Rfc3RyZWFtLT5idWZmZXJfLT5mb3J3YXJkX2J5dGVzKCksIHBhY2tldF8tPkdldERhdGFTaXplKCkpOwotICBFWFBFQ1RfVFJVRSh0ZXN0X3N0cmVhbS0+c3RvcF9zdHJlYW1fKTsKLQotICAvLyBOb3cgY2xvc2UgaXQgYW5kIHRlc3QgdGhhdCBldmVyeXRoaW5nIHdhcyByZWxlYXNlZC4KLSAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLCBQY21DbG9zZShrRmFrZUhhbmRsZSkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKDApKTsKLSAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLCBQY21OYW1lKGtGYWtlSGFuZGxlKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oa1Rlc3REZXZpY2VOYW1lKSk7Ci0gIHRlc3Rfc3RyZWFtLT5DbG9zZSgpOwotfQotCi1URVNUX0YoQWxzYVBjbU91dHB1dFN0cmVhbVRlc3QsIFdyaXRlUGFja2V0X1N0b3BTdHJlYW0pIHsKLSAgQWxzYVBjbU91dHB1dFN0cmVhbSogdGVzdF9zdHJlYW0gPSBDcmVhdGVTdHJlYW0oa1Rlc3RDaGFubmVsTGF5b3V0KTsKLSAgSW5pdEJ1ZmZlcih0ZXN0X3N0cmVhbSk7Ci0gIHRlc3Rfc3RyZWFtLT5UcmFuc2l0aW9uVG8oQWxzYVBjbU91dHB1dFN0cmVhbTo6a0lzT3BlbmVkKTsKLSAgdGVzdF9zdHJlYW0tPlRyYW5zaXRpb25UbyhBbHNhUGNtT3V0cHV0U3RyZWFtOjprSXNQbGF5aW5nKTsKLQotICAvLyBObyBleHBlY3RhdGlvbnMgc2V0IG9uIHRoZSBzdHJpY3QgbW9jayBiZWNhdXNlIG5vdGhpbmcgc2hvdWxkIGJlIGNhbGxlZC4KLSAgdGVzdF9zdHJlYW0tPnN0b3Bfc3RyZWFtXyA9IHRydWU7Ci0gIHRlc3Rfc3RyZWFtLT5Xcml0ZVBhY2tldCgpOwotICBFWFBFQ1RfRVEoMCwgdGVzdF9zdHJlYW0tPmJ1ZmZlcl8tPmZvcndhcmRfYnl0ZXMoKSk7Ci0gIHRlc3Rfc3RyZWFtLT5DbG9zZSgpOwotfQotCi1URVNUX0YoQWxzYVBjbU91dHB1dFN0cmVhbVRlc3QsIEJ1ZmZlclBhY2tldCkgewotICBBbHNhUGNtT3V0cHV0U3RyZWFtKiB0ZXN0X3N0cmVhbSA9IENyZWF0ZVN0cmVhbShrVGVzdENoYW5uZWxMYXlvdXQpOwotICBJbml0QnVmZmVyKHRlc3Rfc3RyZWFtKTsKLSAgdGVzdF9zdHJlYW0tPmJ1ZmZlcl8tPkNsZWFyKCk7Ci0KLSAgTW9ja0F1ZGlvU291cmNlQ2FsbGJhY2sgbW9ja19jYWxsYmFjazsKLSAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLCBQY21TdGF0ZShfKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oU05EX1BDTV9TVEFURV9SVU5OSU5HKSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYWxzYV93cmFwcGVyXywgUGNtRGVsYXkoXywgXykpCi0gICAgICAuV2lsbE9uY2UoRG9BbGwoU2V0QXJndW1lbnRQb2ludGVlPDE+KDEpLCBSZXR1cm4oMCkpKTsKLSAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLCBQY21BdmFpbFVwZGF0ZShfKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oMCkpOyAgLy8gQnVmZmVyIGlzIGZ1bGwuCi0KLSAgLy8gUmV0dXJuIGEgcGFydGlhbGx5IGZpbGxlZCBwYWNrZXQuCi0gIEVYUEVDVF9DQUxMKG1vY2tfY2FsbGJhY2ssIE9uTW9yZURhdGEoXywgXykpCi0gICAgICAuV2lsbE9uY2UoRG9BbGwoQ2xlYXJCdWZmZXIoKSwgUmV0dXJuKGtUZXN0RnJhbWVzUGVyUGFja2V0IC8gMikpKTsKLQotICBib29sIHNvdXJjZV9leGhhdXN0ZWQ7Ci0gIHRlc3Rfc3RyZWFtLT5zZXRfc291cmNlX2NhbGxiYWNrKCZtb2NrX2NhbGxiYWNrKTsKLSAgdGVzdF9zdHJlYW0tPnBhY2tldF9zaXplXyA9IGtUZXN0UGFja2V0U2l6ZTsKLSAgdGVzdF9zdHJlYW0tPkJ1ZmZlclBhY2tldCgmc291cmNlX2V4aGF1c3RlZCk7Ci0KLSAgRVhQRUNUX0VRKGtUZXN0UGFja2V0U2l6ZSAvIDIsIHRlc3Rfc3RyZWFtLT5idWZmZXJfLT5mb3J3YXJkX2J5dGVzKCkpOwotICBFWFBFQ1RfRkFMU0Uoc291cmNlX2V4aGF1c3RlZCk7Ci0gIHRlc3Rfc3RyZWFtLT5DbG9zZSgpOwotfQotCi1URVNUX0YoQWxzYVBjbU91dHB1dFN0cmVhbVRlc3QsIEJ1ZmZlclBhY2tldF9OZWdhdGl2ZSkgewotICBBbHNhUGNtT3V0cHV0U3RyZWFtKiB0ZXN0X3N0cmVhbSA9IENyZWF0ZVN0cmVhbShrVGVzdENoYW5uZWxMYXlvdXQpOwotICBJbml0QnVmZmVyKHRlc3Rfc3RyZWFtKTsKLSAgdGVzdF9zdHJlYW0tPmJ1ZmZlcl8tPkNsZWFyKCk7Ci0KLSAgLy8gU2ltdWxhdGUgd2hlcmUgdGhlIHVuZGVycnVuIGhhcyBvY2N1cnJlZCByaWdodCBhZnRlciBjaGVja2luZyB0aGUgZGVsYXkuCi0gIE1vY2tBdWRpb1NvdXJjZUNhbGxiYWNrIG1vY2tfY2FsbGJhY2s7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYWxzYV93cmFwcGVyXywgUGNtU3RhdGUoXykpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKFNORF9QQ01fU1RBVEVfUlVOTklORykpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIFBjbURlbGF5KF8sIF8pKQotICAgICAgLldpbGxPbmNlKERvQWxsKFNldEFyZ3VtZW50UG9pbnRlZTwxPigtMSksIFJldHVybigwKSkpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIFBjbUF2YWlsVXBkYXRlKF8pKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybigwKSk7ICAvLyBCdWZmZXIgaXMgZnVsbC4KLSAgRVhQRUNUX0NBTEwobW9ja19jYWxsYmFjaywgT25Nb3JlRGF0YShfLCBfKSkKLSAgICAgIC5XaWxsT25jZShEb0FsbChDbGVhckJ1ZmZlcigpLCBSZXR1cm4oa1Rlc3RGcmFtZXNQZXJQYWNrZXQgLyAyKSkpOwotCi0gIGJvb2wgc291cmNlX2V4aGF1c3RlZDsKLSAgdGVzdF9zdHJlYW0tPnNldF9zb3VyY2VfY2FsbGJhY2soJm1vY2tfY2FsbGJhY2spOwotICB0ZXN0X3N0cmVhbS0+cGFja2V0X3NpemVfID0ga1Rlc3RQYWNrZXRTaXplOwotICB0ZXN0X3N0cmVhbS0+QnVmZmVyUGFja2V0KCZzb3VyY2VfZXhoYXVzdGVkKTsKLQotICBFWFBFQ1RfRVEoa1Rlc3RQYWNrZXRTaXplIC8gMiwgdGVzdF9zdHJlYW0tPmJ1ZmZlcl8tPmZvcndhcmRfYnl0ZXMoKSk7Ci0gIEVYUEVDVF9GQUxTRShzb3VyY2VfZXhoYXVzdGVkKTsKLSAgdGVzdF9zdHJlYW0tPkNsb3NlKCk7Ci19Ci0KLVRFU1RfRihBbHNhUGNtT3V0cHV0U3RyZWFtVGVzdCwgQnVmZmVyUGFja2V0X1VuZGVycnVuKSB7Ci0gIEFsc2FQY21PdXRwdXRTdHJlYW0qIHRlc3Rfc3RyZWFtID0gQ3JlYXRlU3RyZWFtKGtUZXN0Q2hhbm5lbExheW91dCk7Ci0gIEluaXRCdWZmZXIodGVzdF9zdHJlYW0pOwotICB0ZXN0X3N0cmVhbS0+YnVmZmVyXy0+Q2xlYXIoKTsKLQotICAvLyBJZiBBTFNBIGhhcyB1bmRlcnJ1biB0aGVuIHdlIHNob3VsZCBhc3N1bWUgYSBkZWxheSBvZiB6ZXJvLgotICBNb2NrQXVkaW9Tb3VyY2VDYWxsYmFjayBtb2NrX2NhbGxiYWNrOwotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIFBjbVN0YXRlKF8pKQotICAgICAgLldpbGxPbmNlKFJldHVybihTTkRfUENNX1NUQVRFX1hSVU4pKTsKLSAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLCBQY21BdmFpbFVwZGF0ZShfKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oMCkpOyAgLy8gQnVmZmVyIGlzIGZ1bGwuCi0gIEVYUEVDVF9DQUxMKG1vY2tfY2FsbGJhY2ssCi0gICAgICAgICAgICAgIE9uTW9yZURhdGEoXywgQWxsT2YoCi0gICAgICAgICAgICAgICAgICBGaWVsZCgmQXVkaW9CdWZmZXJzU3RhdGU6OnBlbmRpbmdfYnl0ZXMsIDApLAotICAgICAgICAgICAgICAgICAgRmllbGQoJkF1ZGlvQnVmZmVyc1N0YXRlOjpoYXJkd2FyZV9kZWxheV9ieXRlcywgMCkpKSkKLSAgICAgIC5XaWxsT25jZShEb0FsbChDbGVhckJ1ZmZlcigpLCBSZXR1cm4oa1Rlc3RGcmFtZXNQZXJQYWNrZXQgLyAyKSkpOwotCi0gIGJvb2wgc291cmNlX2V4aGF1c3RlZDsKLSAgdGVzdF9zdHJlYW0tPnNldF9zb3VyY2VfY2FsbGJhY2soJm1vY2tfY2FsbGJhY2spOwotICB0ZXN0X3N0cmVhbS0+cGFja2V0X3NpemVfID0ga1Rlc3RQYWNrZXRTaXplOwotICB0ZXN0X3N0cmVhbS0+QnVmZmVyUGFja2V0KCZzb3VyY2VfZXhoYXVzdGVkKTsKLQotICBFWFBFQ1RfRVEoa1Rlc3RQYWNrZXRTaXplIC8gMiwgdGVzdF9zdHJlYW0tPmJ1ZmZlcl8tPmZvcndhcmRfYnl0ZXMoKSk7Ci0gIEVYUEVDVF9GQUxTRShzb3VyY2VfZXhoYXVzdGVkKTsKLSAgdGVzdF9zdHJlYW0tPkNsb3NlKCk7Ci19Ci0KLVRFU1RfRihBbHNhUGNtT3V0cHV0U3RyZWFtVGVzdCwgQnVmZmVyUGFja2V0X0Z1bGxCdWZmZXIpIHsKLSAgQWxzYVBjbU91dHB1dFN0cmVhbSogdGVzdF9zdHJlYW0gPSBDcmVhdGVTdHJlYW0oa1Rlc3RDaGFubmVsTGF5b3V0KTsKLSAgSW5pdEJ1ZmZlcih0ZXN0X3N0cmVhbSk7Ci0gIC8vIE5vIGV4cGVjdGF0aW9ucyBzZXQgb24gdGhlIHN0cmljdCBtb2NrIGJlY2F1c2Ugbm90aGluZyBzaG91bGQgYmUgY2FsbGVkLgotICBib29sIHNvdXJjZV9leGhhdXN0ZWQ7Ci0gIHRlc3Rfc3RyZWFtLT5wYWNrZXRfc2l6ZV8gPSBrVGVzdFBhY2tldFNpemU7Ci0gIHRlc3Rfc3RyZWFtLT5CdWZmZXJQYWNrZXQoJnNvdXJjZV9leGhhdXN0ZWQpOwotICBFWFBFQ1RfRVEoa1Rlc3RQYWNrZXRTaXplLCB0ZXN0X3N0cmVhbS0+YnVmZmVyXy0+Zm9yd2FyZF9ieXRlcygpKTsKLSAgRVhQRUNUX0ZBTFNFKHNvdXJjZV9leGhhdXN0ZWQpOwotICB0ZXN0X3N0cmVhbS0+Q2xvc2UoKTsKLX0KLQotVEVTVF9GKEFsc2FQY21PdXRwdXRTdHJlYW1UZXN0LCBBdXRvU2VsZWN0RGV2aWNlX0RldmljZVNlbGVjdCkgewotICAvLyBUcnkgY2hhbm5lbHMgZnJvbSAxIC0+IDkuIGFuZCBzZWUgdGhhdCB3ZSBnZXQgdGhlIG1vcmUgc3BlY2lmaWMgc3Vycm91bmRYWAotICAvLyBkZXZpY2Ugb3BlbmVkIGZvciBjaGFubmVscyA0LTguICBGb3IgYWxsIG90aGVyIGNoYW5uZWxzLCB0aGUgZGV2aWNlIHNob3VsZAotICAvLyBkZWZhdWx0IHRvIHxBbHNhUGNtT3V0cHV0U3RyZWFtOjprRGVmYXVsdERldmljZXwuICBXZSBzaG91bGQgYWxzbyBub3QKLSAgLy8gZG93bm1peCBhbnkgY2hhbm5lbCBpbiB0aGlzIGNhc2UgYmVjYXVzZSBkb3dubWl4aW5nIGlzIG9ubHkgZGVmaW5lZCBmb3IKLSAgLy8gY2hhbm5lbHMgNC04LCB3aGljaCB3ZSBhcmUgZ3VhcmFudGVlaW5nIHRvIHdvcmsuCi0gIC8vCi0gIC8vIE5vdGUgdGhhdCB0aGUgbG9vcCBzdGFydHMgYXQgIjEiLCBzbyB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIGlnbm9yZWQgaW4KLSAgLy8gdGhlc2UgYXJyYXlzLgotICBjb25zdCBjaGFyKiBrRXhwZWN0ZWREZXZpY2VOYW1lW10gPSB7IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxzYVBjbU91dHB1dFN0cmVhbTo6a0RlZmF1bHREZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxzYVBjbU91dHB1dFN0cmVhbTo6a0RlZmF1bHREZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxzYVBjbU91dHB1dFN0cmVhbTo6a0RlZmF1bHREZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1N1cnJvdW5kNDAsIGtTdXJyb3VuZDUwLCBrU3Vycm91bmQ1MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrU3Vycm91bmQ3MCwga1N1cnJvdW5kNzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxzYVBjbU91dHB1dFN0cmVhbTo6a0RlZmF1bHREZXZpY2UgfTsKLSAgYm9vbCBrRXhwZWN0ZWREb3dubWl4W10gPSB7IGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlIH07Ci0gIENoYW5uZWxMYXlvdXQga0V4cGVjdGVkTGF5b3V0c1tdID0geyBDSEFOTkVMX0xBWU9VVF9OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9MQVlPVVRfTU9OTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTEFZT1VUX1NURVJFTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTEFZT1VUX1NVUlJPVU5ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9MQVlPVVRfNF8wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9MQVlPVVRfNV8wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9MQVlPVVRfNV8xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9MQVlPVVRfN18wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9MQVlPVVRfN18xIH07Ci0KLQotICBmb3IgKGludCBpID0gMTsgaSA8IDk7ICsraSkgewotICAgIGlmIChpID09IDMgfHwgaSA9PSA0IHx8IGkgPT0gNSkgIC8vIGludmFsaWQgbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgICBjb250aW51ZTsKLSAgICBTQ09QRURfVFJBQ0UoYmFzZTo6U3RyaW5nUHJpbnRmKCJBdHRlbXB0aW5nICVkIENoYW5uZWwiLCBpKSk7Ci0KLSAgICAvLyBIaW50cyB3aWxsIG9ubHkgYmUgZ3JhYmJlZCBmb3IgY2hhbm5lbCBudW1iZXJzIHRoYXQgaGF2ZSBub24tZGVmYXVsdAotICAgIC8vIGRldmljZXMgYXNzb2NpYXRlZCB3aXRoIHRoZW0uCi0gICAgaWYgKGtFeHBlY3RlZERldmljZU5hbWVbaV0gIT0gQWxzYVBjbU91dHB1dFN0cmVhbTo6a0RlZmF1bHREZXZpY2UpIHsKLSAgICAgIC8vIFRoZSBEZXZpY2VOYW1lSGludCBhbmQgRGV2aWNlTmFtZUZyZWVIaW50IG5lZWQgdG8gYmUgcGFpcmVkIHRvIGF2b2lkIGEKLSAgICAgIC8vIG1lbW9yeSBsZWFrLgotICAgICAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLCBEZXZpY2VOYW1lSGludChfLCBfLCBfKSkKLSAgICAgICAgICAuV2lsbE9uY2UoRG9BbGwoU2V0QXJndW1lbnRQb2ludGVlPDI+KCZrRmFrZUhpbnRzWzBdKSwgUmV0dXJuKDApKSk7Ci0gICAgICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIERldmljZU5hbWVGcmVlSGludCgma0Zha2VIaW50c1swXSkpCi0gICAgICAgICAgLlRpbWVzKDEpOwotICAgIH0KLQotICAgIEVYUEVDVF9DQUxMKG1vY2tfYWxzYV93cmFwcGVyXywKLSAgICAgICAgICAgICAgICBQY21PcGVuKF8sIFN0ckVxKGtFeHBlY3RlZERldmljZU5hbWVbaV0pLCBfLCBfKSkKLSAgICAgICAgLldpbGxPbmNlKERvQWxsKFNldEFyZ3VtZW50UG9pbnRlZTwwPihrRmFrZUhhbmRsZSksIFJldHVybigwKSkpOwotICAgIEVYUEVDVF9DQUxMKG1vY2tfYWxzYV93cmFwcGVyXywKLSAgICAgICAgICAgICAgICBQY21TZXRQYXJhbXMoa0Zha2VIYW5kbGUsIF8sIF8sIGksIF8sIF8sIF8pKQotICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKDApKTsKLQotICAgIC8vIFRoZSBwYXJhbWV0ZXJzIGFyZSBzcGVjaWZpZWQgYnkgQUxTQSBkb2N1bWVudGF0aW9uLCBhbmQgYXJlIGluIGNvbnN0YW50cwotICAgIC8vIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBmaWxlcy4KLSAgICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIERldmljZU5hbWVHZXRIaW50KF8sIFN0ckVxKCJJT0lEIikpKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoSW52b2tlKE91dHB1dEhpbnQpKTsKLSAgICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIERldmljZU5hbWVHZXRIaW50KF8sIFN0ckVxKCJOQU1FIikpKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoSW52b2tlKEVjaG9IaW50KSk7Ci0KLSAgICBBbHNhUGNtT3V0cHV0U3RyZWFtKiB0ZXN0X3N0cmVhbSA9IENyZWF0ZVN0cmVhbShrRXhwZWN0ZWRMYXlvdXRzW2ldKTsKLSAgICBFWFBFQ1RfVFJVRSh0ZXN0X3N0cmVhbS0+QXV0b1NlbGVjdERldmljZShpKSk7Ci0gICAgRVhQRUNUX0VRKGtFeHBlY3RlZERvd25taXhbaV0sCi0gICAgICAgICAgICAgIHN0YXRpY19jYXN0PGJvb2w+KHRlc3Rfc3RyZWFtLT5jaGFubmVsX21peGVyXykpOwotCi0gICAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm1vY2tfYWxzYV93cmFwcGVyXyk7Ci0gICAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMobW9ja19tYW5hZ2VyXy5nZXQoKSk7Ci0gICAgdGVzdF9zdHJlYW0tPkNsb3NlKCk7Ci0gIH0KLX0KLQotVEVTVF9GKEFsc2FQY21PdXRwdXRTdHJlYW1UZXN0LCBBdXRvU2VsZWN0RGV2aWNlX0ZhbGxiYWNrRGV2aWNlcykgewotICB1c2luZyBzdGQ6OnN0cmluZzsKLQotICAvLyBJZiB0aGVyZSBhcmUgcHJvYmxlbXMgb3BlbmluZyBhIG11bHRpLWNoYW5uZWwgZGV2aWNlLCBpdCB0aGUgZmFsbGJhY2tzCi0gIC8vIG9wZXJhdGlvbnMgc2hvdWxkIGJlIGFzIGZvbGxvd3MuICBBc3N1bWUgdGhlIG11bHRpLWNoYW5uZWwgZGV2aWNlIG5hbWUgaXMKLSAgLy8gc3Vycm91bmQ1MDoKLSAgLy8KLSAgLy8gICAxKSBUcnkgb3BlbiAic3Vycm91bmQ1MCIKLSAgLy8gICAyKSBUcnkgb3BlbiAicGx1ZzpzdXJyb3VuZDUwIi4KLSAgLy8gICAzKSBUcnkgb3BlbiAiZGVmYXVsdCIuCi0gIC8vICAgNCkgVHJ5IG9wZW4gInBsdWc6ZGVmYXVsdCIuCi0gIC8vICAgNSkgR2l2ZSB1cCB0cnlpbmcgdG8gb3Blbi4KLSAgLy8KLSAgY29uc3Qgc3RyaW5nIGZpcnN0X3RyeSA9IGtTdXJyb3VuZDUwOwotICBjb25zdCBzdHJpbmcgc2Vjb25kX3RyeSA9IHN0cmluZyhBbHNhUGNtT3V0cHV0U3RyZWFtOjprUGx1Z1ByZWZpeCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTdXJyb3VuZDUwOwotICBjb25zdCBzdHJpbmcgdGhpcmRfdHJ5ID0gQWxzYVBjbU91dHB1dFN0cmVhbTo6a0RlZmF1bHREZXZpY2U7Ci0gIGNvbnN0IHN0cmluZyBmb3VydGhfdHJ5ID0gc3RyaW5nKEFsc2FQY21PdXRwdXRTdHJlYW06OmtQbHVnUHJlZml4KSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxzYVBjbU91dHB1dFN0cmVhbTo6a0RlZmF1bHREZXZpY2U7Ci0KLSAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLCBEZXZpY2VOYW1lSGludChfLCBfLCBfKSkKLSAgICAgIC5XaWxsT25jZShEb0FsbChTZXRBcmd1bWVudFBvaW50ZWU8Mj4oJmtGYWtlSGludHNbMF0pLCBSZXR1cm4oMCkpKTsKLSAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLCBEZXZpY2VOYW1lRnJlZUhpbnQoJmtGYWtlSGludHNbMF0pKQotICAgICAgLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIERldmljZU5hbWVHZXRIaW50KF8sIFN0ckVxKCJJT0lEIikpKQotICAgICAgLldpbGxSZXBlYXRlZGx5KEludm9rZShPdXRwdXRIaW50KSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYWxzYV93cmFwcGVyXywgRGV2aWNlTmFtZUdldEhpbnQoXywgU3RyRXEoIk5BTUUiKSkpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoSW52b2tlKEVjaG9IaW50KSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYWxzYV93cmFwcGVyXywgU3RyRXJyb3Ioa1Rlc3RGYWlsZWRFcnJubykpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKGtEdW1teU1lc3NhZ2UpKTsKLQotICBJblNlcXVlbmNlIHM7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYWxzYV93cmFwcGVyXywgUGNtT3BlbihfLCBTdHJFcShmaXJzdF90cnkuY19zdHIoKSksIF8sIF8pKQotICAgICAgLldpbGxPbmNlKFJldHVybihrVGVzdEZhaWxlZEVycm5vKSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYWxzYV93cmFwcGVyXywgUGNtT3BlbihfLCBTdHJFcShzZWNvbmRfdHJ5LmNfc3RyKCkpLCBfLCBfKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oa1Rlc3RGYWlsZWRFcnJubykpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIFBjbU9wZW4oXywgU3RyRXEodGhpcmRfdHJ5LmNfc3RyKCkpLCBfLCBfKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oa1Rlc3RGYWlsZWRFcnJubykpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIFBjbU9wZW4oXywgU3RyRXEoZm91cnRoX3RyeS5jX3N0cigpKSwgXywgXykpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKGtUZXN0RmFpbGVkRXJybm8pKTsKLQotICBBbHNhUGNtT3V0cHV0U3RyZWFtKiB0ZXN0X3N0cmVhbSA9IENyZWF0ZVN0cmVhbShDSEFOTkVMX0xBWU9VVF81XzApOwotICBFWFBFQ1RfRkFMU0UodGVzdF9zdHJlYW0tPkF1dG9TZWxlY3REZXZpY2UoNSkpOwotICB0ZXN0X3N0cmVhbS0+Q2xvc2UoKTsKLX0KLQotVEVTVF9GKEFsc2FQY21PdXRwdXRTdHJlYW1UZXN0LCBBdXRvU2VsZWN0RGV2aWNlX0hpbnRGYWlsKSB7Ci0gIC8vIFNob3VsZCBnZXQgfGtEZWZhdWx0RGV2aWNlfCwgYW5kIGZvcmNlIGEgMi1jaGFubmVsIGRvd25taXggb24gYSBmYWlsdXJlIHRvCi0gIC8vIGVudW1lcmF0ZSBkZXZpY2VzLgotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sIERldmljZU5hbWVIaW50KF8sIF8sIF8pKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybihrVGVzdEZhaWxlZEVycm5vKSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYWxzYV93cmFwcGVyXywKLSAgICAgICAgICAgICAgUGNtT3BlbihfLCBTdHJFcShBbHNhUGNtT3V0cHV0U3RyZWFtOjprRGVmYXVsdERldmljZSksIF8sIF8pKQotICAgICAgLldpbGxPbmNlKERvQWxsKFNldEFyZ3VtZW50UG9pbnRlZTwwPihrRmFrZUhhbmRsZSksIFJldHVybigwKSkpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2Fsc2Ffd3JhcHBlcl8sCi0gICAgICAgICAgICAgIFBjbVNldFBhcmFtcyhrRmFrZUhhbmRsZSwgXywgXywgMiwgXywgXywgXykpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKDApKTsKLSAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLCBTdHJFcnJvcihrVGVzdEZhaWxlZEVycm5vKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oa0R1bW15TWVzc2FnZSkpOwotCi0gIEFsc2FQY21PdXRwdXRTdHJlYW0qIHRlc3Rfc3RyZWFtID0gQ3JlYXRlU3RyZWFtKENIQU5ORUxfTEFZT1VUXzVfMCk7Ci0gIEVYUEVDVF9UUlVFKHRlc3Rfc3RyZWFtLT5BdXRvU2VsZWN0RGV2aWNlKDUpKTsKLSAgRVhQRUNUX1RSVUUodGVzdF9zdHJlYW0tPmNoYW5uZWxfbWl4ZXJfKTsKLSAgdGVzdF9zdHJlYW0tPkNsb3NlKCk7Ci19Ci0KLVRFU1RfRihBbHNhUGNtT3V0cHV0U3RyZWFtVGVzdCwgQnVmZmVyUGFja2V0X1N0b3BTdHJlYW0pIHsKLSAgQWxzYVBjbU91dHB1dFN0cmVhbSogdGVzdF9zdHJlYW0gPSBDcmVhdGVTdHJlYW0oa1Rlc3RDaGFubmVsTGF5b3V0KTsKLSAgSW5pdEJ1ZmZlcih0ZXN0X3N0cmVhbSk7Ci0gIHRlc3Rfc3RyZWFtLT5zdG9wX3N0cmVhbV8gPSB0cnVlOwotICBib29sIHNvdXJjZV9leGhhdXN0ZWQ7Ci0gIHRlc3Rfc3RyZWFtLT5CdWZmZXJQYWNrZXQoJnNvdXJjZV9leGhhdXN0ZWQpOwotICBFWFBFQ1RfRVEoMCwgdGVzdF9zdHJlYW0tPmJ1ZmZlcl8tPmZvcndhcmRfYnl0ZXMoKSk7Ci0gIEVYUEVDVF9UUlVFKHNvdXJjZV9leGhhdXN0ZWQpOwotICB0ZXN0X3N0cmVhbS0+Q2xvc2UoKTsKLX0KLQotVEVTVF9GKEFsc2FQY21PdXRwdXRTdHJlYW1UZXN0LCBTY2hlZHVsZU5leHRXcml0ZSkgewotICBBbHNhUGNtT3V0cHV0U3RyZWFtKiB0ZXN0X3N0cmVhbSA9IENyZWF0ZVN0cmVhbShrVGVzdENoYW5uZWxMYXlvdXQpOwotICB0ZXN0X3N0cmVhbS0+VHJhbnNpdGlvblRvKEFsc2FQY21PdXRwdXRTdHJlYW06OmtJc09wZW5lZCk7Ci0gIHRlc3Rfc3RyZWFtLT5UcmFuc2l0aW9uVG8oQWxzYVBjbU91dHB1dFN0cmVhbTo6a0lzUGxheWluZyk7Ci0gIEluaXRCdWZmZXIodGVzdF9zdHJlYW0pOwotICBEVkxPRygxKSA8PCB0ZXN0X3N0cmVhbS0+c3RhdGUoKTsKLSAgRVhQRUNUX0NBTEwobW9ja19hbHNhX3dyYXBwZXJfLCBQY21BdmFpbFVwZGF0ZShfKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oMTApKTsKLSAgdGVzdF9zdHJlYW0tPlNjaGVkdWxlTmV4dFdyaXRlKGZhbHNlKTsKLSAgRFZMT0coMSkgPDwgdGVzdF9zdHJlYW0tPnN0YXRlKCk7Ci0gIC8vIFRPRE8oc2VyZ2V5dSk6IEZpZ3VyZSBvdXQgaG93IHRvIGNoZWNrIHRoYXQgdGhlIHRhc2sgaGFzIGJlZW4gYWRkZWQgdG8gdGhlCi0gIC8vIG1lc3NhZ2UgbG9vcC4KLQotICAvLyBDbGVhbnVwIHRoZSBtZXNzYWdlIHF1ZXVlLiBDdXJyZW50bHkgfk1lc3NhZ2VRdWV1ZSgpIGRvZXNuJ3QgZnJlZSBwZW5kaW5nCi0gIC8vIHRhc2tzIHVubGVzcyBydW5uaW5nIG9uIHZhbGdyaW5kLiBUaGUgY29kZSBiZWxvdyBpcyBuZWVkZWQgdG8ga2VlcAotICAvLyBoZWFwY2hlY2sgaGFwcHkuCi0KLSAgdGVzdF9zdHJlYW0tPnN0b3Bfc3RyZWFtXyA9IHRydWU7Ci0gIERWTE9HKDEpIDw8IHRlc3Rfc3RyZWFtLT5zdGF0ZSgpOwotICB0ZXN0X3N0cmVhbS0+VHJhbnNpdGlvblRvKEFsc2FQY21PdXRwdXRTdHJlYW06OmtJc0Nsb3NlZCk7Ci0gIERWTE9HKDEpIDw8IHRlc3Rfc3RyZWFtLT5zdGF0ZSgpOwotICB0ZXN0X3N0cmVhbS0+Q2xvc2UoKTsKLX0KLQotVEVTVF9GKEFsc2FQY21PdXRwdXRTdHJlYW1UZXN0LCBTY2hlZHVsZU5leHRXcml0ZV9TdG9wU3RyZWFtKSB7Ci0gIEFsc2FQY21PdXRwdXRTdHJlYW0qIHRlc3Rfc3RyZWFtID0gQ3JlYXRlU3RyZWFtKGtUZXN0Q2hhbm5lbExheW91dCk7Ci0gIHRlc3Rfc3RyZWFtLT5UcmFuc2l0aW9uVG8oQWxzYVBjbU91dHB1dFN0cmVhbTo6a0lzT3BlbmVkKTsKLSAgdGVzdF9zdHJlYW0tPlRyYW5zaXRpb25UbyhBbHNhUGNtT3V0cHV0U3RyZWFtOjprSXNQbGF5aW5nKTsKLQotICBJbml0QnVmZmVyKHRlc3Rfc3RyZWFtKTsKLQotICB0ZXN0X3N0cmVhbS0+c3RvcF9zdHJlYW1fID0gdHJ1ZTsKLSAgdGVzdF9zdHJlYW0tPlNjaGVkdWxlTmV4dFdyaXRlKHRydWUpOwotCi0gIC8vIFRPRE8oYWp3b25nKTogRmluZCBhIHdheSB0byB0ZXN0IHdoZXRoZXIgb3Igbm90IGFub3RoZXIgdGFzayBoYXMgYmVlbgotICAvLyBwb3N0ZWQgc28gd2UgY2FuIHZlcmlmeSB0aGF0IHRoZSBBbHNhIGNvZGUgd2lsbCBpbmRlZWQgYnJlYWsgdGhlIHRhc2sKLSAgLy8gcG9zdGluZyBsb29wLgotCi0gIHRlc3Rfc3RyZWFtLT5UcmFuc2l0aW9uVG8oQWxzYVBjbU91dHB1dFN0cmVhbTo6a0lzQ2xvc2VkKTsKLSAgdGVzdF9zdHJlYW0tPkNsb3NlKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2xpbnV4L2Fsc2FfdXRpbC5jYyBiL3NyYy9tZWRpYS9hdWRpby9saW51eC9hbHNhX3V0aWwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NmVmNjkuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2xpbnV4L2Fsc2FfdXRpbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vbGludXgvYWxzYV91dGlsLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9saW51eC9hbHNhX3dyYXBwZXIuaCIKLQotbmFtZXNwYWNlIGFsc2FfdXRpbCB7Ci0KLXN0YXRpYyBzbmRfcGNtX3QqIE9wZW5EZXZpY2UobWVkaWE6OkFsc2FXcmFwcGVyKiB3cmFwcGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZXZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX3BjbV9zdHJlYW1fdCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX3BjbV9mb3JtYXRfdCBwY21fZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGF0ZW5jeV91cykgewotICBzbmRfcGNtX3QqIGhhbmRsZSA9IE5VTEw7Ci0gIGludCBlcnJvciA9IHdyYXBwZXItPlBjbU9wZW4oJmhhbmRsZSwgZGV2aWNlX25hbWUsIHR5cGUsIFNORF9QQ01fTk9OQkxPQ0spOwotICBpZiAoZXJyb3IgPCAwKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJQY21PcGVuOiAiIDw8IGRldmljZV9uYW1lIDw8ICIsIgotICAgICAgICAgICAgICAgICA8PCB3cmFwcGVyLT5TdHJFcnJvcihlcnJvcik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBlcnJvciA9IHdyYXBwZXItPlBjbVNldFBhcmFtcyhoYW5kbGUsIHBjbV9mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNORF9QQ01fQUNDRVNTX1JXX0lOVEVSTEVBVkVELCBjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3JhdGUsIDEsIGxhdGVuY3lfdXMpOwotICBpZiAoZXJyb3IgPCAwKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJQY21TZXRQYXJhbXM6ICIgPDwgZGV2aWNlX25hbWUgPDwgIiwgIgotICAgICAgICAgICAgICAgICA8PCB3cmFwcGVyLT5TdHJFcnJvcihlcnJvcikgPDwgIiAtIEZvcm1hdDogIiA8PCBwY21fZm9ybWF0Ci0gICAgICAgICAgICAgICAgIDw8ICIgQ2hhbm5lbHM6ICIgPDwgY2hhbm5lbHMgPDwgIiBMYXRlbmN5OiAiIDw8IGxhdGVuY3lfdXM7Ci0gICAgaWYgKGFsc2FfdXRpbDo6Q2xvc2VEZXZpY2Uod3JhcHBlciwgaGFuZGxlKSA8IDApIHsKLSAgICAgIC8vIFRPRE8oYWp3b25nKTogUmV0cnkgb24gY2VydGFpbiBlcnJvcnM/Ci0gICAgICBMT0coV0FSTklORykgPDwgIlVuYWJsZSB0byBjbG9zZSBhdWRpbyBkZXZpY2UuIExlYWtpbmcgaGFuZGxlLiI7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgcmV0dXJuIGhhbmRsZTsKLX0KLQotc3RhdGljIHN0ZDo6c3RyaW5nIERldmljZU5hbWVUb0NvbnRyb2xOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfbmFtZSkgewotICBjb25zdCBjaGFyIGtNaXhlclByZWZpeFtdID0gImh3IjsKLSAgc3RkOjpzdHJpbmcgY29udHJvbF9uYW1lOwotICBzaXplX3QgcG9zMSA9IGRldmljZV9uYW1lLmZpbmQoJzonKTsKLSAgaWYgKHBvczEgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICBjb250cm9sX25hbWUgPSBkZXZpY2VfbmFtZTsKLSAgfSBlbHNlIHsKLSAgICAvLyBFeGFtcGxlczoKLSAgICAvLyBkZXZpY2VOYW1lOiAiZnJvbnQ6Q0FSRD1JbnRlbCxERVY9MCIsIGNvbnRyb2xOYW1lOiAiaHc6Q0FSRD1JbnRlbCIuCi0gICAgLy8gZGV2aWNlTmFtZTogImRlZmF1bHQ6Q0FSRD1JbnRlbCIsIGNvbnRyb2xOYW1lOiAiQ0FSRD1JbnRlbCIuCi0gICAgc2l6ZV90IHBvczIgPSBkZXZpY2VfbmFtZS5maW5kKCcsJyk7Ci0gICAgY29udHJvbF9uYW1lID0gKHBvczIgPT0gc3RkOjpzdHJpbmc6Om5wb3MpID8KLSAgICAgICAgZGV2aWNlX25hbWUuc3Vic3RyKHBvczEpIDoKLSAgICAgICAga01peGVyUHJlZml4ICsgZGV2aWNlX25hbWUuc3Vic3RyKHBvczEsIHBvczIgLSBwb3MxKTsKLSAgfQotCi0gIHJldHVybiBjb250cm9sX25hbWU7Ci19Ci0KLXNuZF9wY21fZm9ybWF0X3QgQml0c1RvRm9ybWF0KGludCBiaXRzX3Blcl9zYW1wbGUpIHsKLSAgc3dpdGNoIChiaXRzX3Blcl9zYW1wbGUpIHsKLSAgICBjYXNlIDg6Ci0gICAgICByZXR1cm4gU05EX1BDTV9GT1JNQVRfVTg7Ci0KLSAgICBjYXNlIDE2OgotICAgICAgcmV0dXJuIFNORF9QQ01fRk9STUFUX1MxNjsKLQotICAgIGNhc2UgMjQ6Ci0gICAgICByZXR1cm4gU05EX1BDTV9GT1JNQVRfUzI0OwotCi0gICAgY2FzZSAzMjoKLSAgICAgIHJldHVybiBTTkRfUENNX0ZPUk1BVF9TMzI7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIFNORF9QQ01fRk9STUFUX1VOS05PV047Ci0gIH0KLX0KLQotaW50IENsb3NlRGV2aWNlKG1lZGlhOjpBbHNhV3JhcHBlciogd3JhcHBlciwgc25kX3BjbV90KiBoYW5kbGUpIHsKLSAgc3RkOjpzdHJpbmcgZGV2aWNlX25hbWUgPSB3cmFwcGVyLT5QY21OYW1lKGhhbmRsZSk7Ci0gIGludCBlcnJvciA9IHdyYXBwZXItPlBjbUNsb3NlKGhhbmRsZSk7Ci0gIGlmIChlcnJvciA8IDApIHsKLSAgICBMT0coRVJST1IpIDw8ICJQY21DbG9zZTogIiA8PCBkZXZpY2VfbmFtZSA8PCAiLCAiCi0gICAgICAgICAgICAgICA8PCB3cmFwcGVyLT5TdHJFcnJvcihlcnJvcik7Ci0gIH0KLQotICByZXR1cm4gZXJyb3I7Ci19Ci0KLXNuZF9wY21fdCogT3BlbkNhcHR1cmVEZXZpY2UobWVkaWE6OkFsc2FXcmFwcGVyKiB3cmFwcGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZXZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9wY21fZm9ybWF0X3QgcGNtX2Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhdGVuY3lfdXMpIHsKLSAgcmV0dXJuIE9wZW5EZXZpY2Uod3JhcHBlciwgZGV2aWNlX25hbWUsIFNORF9QQ01fU1RSRUFNX0NBUFRVUkUsIGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICBzYW1wbGVfcmF0ZSwgcGNtX2Zvcm1hdCwgbGF0ZW5jeV91cyk7Ci19Ci0KLXNuZF9wY21fdCogT3BlblBsYXliYWNrRGV2aWNlKG1lZGlhOjpBbHNhV3JhcHBlciogd3JhcHBlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRldmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX3BjbV9mb3JtYXRfdCBwY21fZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhdGVuY3lfdXMpIHsKLSAgcmV0dXJuIE9wZW5EZXZpY2Uod3JhcHBlciwgZGV2aWNlX25hbWUsIFNORF9QQ01fU1RSRUFNX1BMQVlCQUNLLCBjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3JhdGUsIHBjbV9mb3JtYXQsIGxhdGVuY3lfdXMpOwotfQotCi1zbmRfbWl4ZXJfdCogT3Blbk1peGVyKG1lZGlhOjpBbHNhV3JhcHBlciogd3JhcHBlciwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9uYW1lKSB7Ci0gIHNuZF9taXhlcl90KiBtaXhlciA9IE5VTEw7Ci0KLSAgaW50IGVycm9yID0gd3JhcHBlci0+TWl4ZXJPcGVuKCZtaXhlciwgMCk7Ci0gIGlmIChlcnJvciA8IDApIHsKLSAgICBMT0coRVJST1IpIDw8ICJNaXhlck9wZW46ICIgPDwgZGV2aWNlX25hbWUgPDwgIiwgIgotICAgICAgICAgICAgICAgPDwgd3JhcHBlci0+U3RyRXJyb3IoZXJyb3IpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgY29udHJvbF9uYW1lID0gRGV2aWNlTmFtZVRvQ29udHJvbE5hbWUoZGV2aWNlX25hbWUpOwotICBlcnJvciA9IHdyYXBwZXItPk1peGVyQXR0YWNoKG1peGVyLCBjb250cm9sX25hbWUuY19zdHIoKSk7Ci0gIGlmIChlcnJvciA8IDApIHsKLSAgICBMT0coRVJST1IpIDw8ICJNaXhlckF0dGFjaCwgIiA8PCBjb250cm9sX25hbWUgPDwgIiwgIgotICAgICAgICAgICAgICAgPDwgd3JhcHBlci0+U3RyRXJyb3IoZXJyb3IpOwotICAgIGFsc2FfdXRpbDo6Q2xvc2VNaXhlcih3cmFwcGVyLCBtaXhlciwgZGV2aWNlX25hbWUpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgZXJyb3IgPSB3cmFwcGVyLT5NaXhlckVsZW1lbnRSZWdpc3RlcihtaXhlciwgTlVMTCwgTlVMTCk7Ci0gIGlmIChlcnJvciA8IDApIHsKLSAgICBMT0coRVJST1IpIDw8ICJNaXhlckVsZW1lbnRSZWdpc3RlcjogIiA8PCBjb250cm9sX25hbWUgPDwgIiwgIgotICAgICAgICAgICAgICAgPDwgd3JhcHBlci0+U3RyRXJyb3IoZXJyb3IpOwotICAgIGFsc2FfdXRpbDo6Q2xvc2VNaXhlcih3cmFwcGVyLCBtaXhlciwgZGV2aWNlX25hbWUpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgcmV0dXJuIG1peGVyOwotfQotCi12b2lkIENsb3NlTWl4ZXIobWVkaWE6OkFsc2FXcmFwcGVyKiB3cmFwcGVyLCBzbmRfbWl4ZXJfdCogbWl4ZXIsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9uYW1lKSB7Ci0gIGlmICghbWl4ZXIpCi0gICAgcmV0dXJuOwotCi0gIHdyYXBwZXItPk1peGVyRnJlZShtaXhlcik7Ci0KLSAgaW50IGVycm9yID0gMDsKLSAgaWYgKCFkZXZpY2VfbmFtZS5lbXB0eSgpKSB7Ci0gICAgc3RkOjpzdHJpbmcgY29udHJvbF9uYW1lID0gRGV2aWNlTmFtZVRvQ29udHJvbE5hbWUoZGV2aWNlX25hbWUpOwotICAgIGVycm9yID0gd3JhcHBlci0+TWl4ZXJEZXRhY2gobWl4ZXIsIGNvbnRyb2xfbmFtZS5jX3N0cigpKTsKLSAgICBpZiAoZXJyb3IgPCAwKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgIk1peGVyRGV0YWNoOiAiIDw8IGNvbnRyb2xfbmFtZSA8PCAiLCAiCi0gICAgICAgICAgICAgICAgICAgPDwgd3JhcHBlci0+U3RyRXJyb3IoZXJyb3IpOwotICAgIH0KLSAgfQotCi0gIGVycm9yID0gd3JhcHBlci0+TWl4ZXJDbG9zZShtaXhlcik7Ci0gIGlmIChlcnJvciA8IDApIHsKLSAgICBMT0coV0FSTklORykgPDwgIk1peGVyQ2xvc2U6ICIgPDwgd3JhcHBlci0+U3RyRXJyb3IoZXJyb3IpOwotICB9Ci19Ci0KLXNuZF9taXhlcl9lbGVtX3QqIExvYWRDYXB0dXJlTWl4ZXJFbGVtZW50KG1lZGlhOjpBbHNhV3JhcHBlciogd3JhcHBlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9taXhlcl90KiBtaXhlcikgewotICBpZiAoIW1peGVyKQotICAgIHJldHVybiBOVUxMOwotCi0gIGludCBlcnJvciA9IHdyYXBwZXItPk1peGVyTG9hZChtaXhlcik7Ci0gIGlmIChlcnJvciA8IDApIHsKLSAgICBMT0coRVJST1IpIDw8ICJNaXhlckxvYWQ6ICIgPDwgd3JhcHBlci0+U3RyRXJyb3IoZXJyb3IpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgc25kX21peGVyX2VsZW1fdCogZWxlbSA9IE5VTEw7Ci0gIHNuZF9taXhlcl9lbGVtX3QqIG1pY19lbGVtID0gTlVMTDsKLSAgY29uc3QgY2hhciBrQ2FwdHVyZUVsZW1OYW1lW10gPSAiQ2FwdHVyZSI7Ci0gIGNvbnN0IGNoYXIga01pY0VsZW1OYW1lW10gPSAiTWljIjsKLSAgZm9yIChlbGVtID0gd3JhcHBlci0+TWl4ZXJGaXJzdEVsZW0obWl4ZXIpOwotICAgICAgIGVsZW07Ci0gICAgICAgZWxlbSA9IHdyYXBwZXItPk1peGVyTmV4dEVsZW0oZWxlbSkpIHsKLSAgICBpZiAod3JhcHBlci0+TWl4ZXJTZWxlbUlzQWN0aXZlKGVsZW0pKSB7Ci0gICAgICBjb25zdCBjaGFyKiBlbGVtX25hbWUgPSB3cmFwcGVyLT5NaXhlclNlbGVtTmFtZShlbGVtKTsKLSAgICAgIGlmIChzdHJjbXAoZWxlbV9uYW1lLCBrQ2FwdHVyZUVsZW1OYW1lKSA9PSAwKQotICAgICAgICByZXR1cm4gZWxlbTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcChlbGVtX25hbWUsIGtNaWNFbGVtTmFtZSkgPT0gMCkKLSAgICAgICAgbWljX2VsZW0gPSBlbGVtOwotICAgIH0KLSAgfQotCi0gIC8vIERpZCBub3QgZmluZCBhbnkgQ2FwdHVyZSBoYW5kbGUsIHVzZSB0aGUgTWljIGhhbmRsZS4KLSAgcmV0dXJuIG1pY19lbGVtOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYWxzYV91dGlsCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vbGludXgvYWxzYV91dGlsLmggYi9zcmMvbWVkaWEvYXVkaW8vbGludXgvYWxzYV91dGlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzY2Y4MGEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2xpbnV4L2Fsc2FfdXRpbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9BVURJT19MSU5VWF9BTFNBX1VUSUxfSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fTElOVVhfQUxTQV9VVElMX0hfCi0KLSNpbmNsdWRlIDxhbHNhL2Fzb3VuZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZz4KLQotbmFtZXNwYWNlIG1lZGlhIHsKLWNsYXNzIEFsc2FXcmFwcGVyOwotfQotCi1uYW1lc3BhY2UgYWxzYV91dGlsIHsKLQotc25kX3BjbV9mb3JtYXRfdCBCaXRzVG9Gb3JtYXQoaW50IGJpdHNfcGVyX3NhbXBsZSk7Ci0KLXNuZF9wY21fdCogT3BlbkNhcHR1cmVEZXZpY2UobWVkaWE6OkFsc2FXcmFwcGVyKiB3cmFwcGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZXZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9wY21fZm9ybWF0X3QgcGNtX2Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhdGVuY3lfdXMpOwotCi1zbmRfcGNtX3QqIE9wZW5QbGF5YmFja0RldmljZShtZWRpYTo6QWxzYVdyYXBwZXIqIHdyYXBwZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZXZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9wY21fZm9ybWF0X3QgcGNtX2Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYXRlbmN5X3VzKTsKLQotaW50IENsb3NlRGV2aWNlKG1lZGlhOjpBbHNhV3JhcHBlciogd3JhcHBlciwgc25kX3BjbV90KiBoYW5kbGUpOwotCi1zbmRfbWl4ZXJfdCogT3Blbk1peGVyKG1lZGlhOjpBbHNhV3JhcHBlciogd3JhcHBlciwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9uYW1lKTsKLQotdm9pZCBDbG9zZU1peGVyKG1lZGlhOjpBbHNhV3JhcHBlciogd3JhcHBlciwKLSAgICAgICAgICAgICAgICBzbmRfbWl4ZXJfdCogbWl4ZXIsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9uYW1lKTsKLQotc25kX21peGVyX2VsZW1fdCogTG9hZENhcHR1cmVNaXhlckVsZW1lbnQobWVkaWE6OkFsc2FXcmFwcGVyKiB3cmFwcGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX21peGVyX3QqIG1peGVyKTsKLQotfSAgLy8gbmFtZXNwYWNlIGFsc2FfdXRpbAotCi0jZW5kaWYgIC8vIE1FRElBX0FVRElPX0xJTlVYX0FMU0FfVVRJTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2xpbnV4L2Fsc2Ffd3JhcHBlci5jYyBiL3NyYy9tZWRpYS9hdWRpby9saW51eC9hbHNhX3dyYXBwZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxY2UzNTkuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2xpbnV4L2Fsc2Ffd3JhcHBlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vbGludXgvYWxzYV93cmFwcGVyLmgiCi0KLSNpbmNsdWRlIDxhbHNhL2Fzb3VuZGxpYi5oPgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1BbHNhV3JhcHBlcjo6QWxzYVdyYXBwZXIoKSB7Ci19Ci0KLUFsc2FXcmFwcGVyOjp+QWxzYVdyYXBwZXIoKSB7Ci19Ci0KLWludCBBbHNhV3JhcHBlcjo6UGNtT3BlbihzbmRfcGNtX3QqKiBoYW5kbGUsIGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc25kX3BjbV9zdHJlYW1fdCBzdHJlYW0sIGludCBtb2RlKSB7Ci0gIHJldHVybiBzbmRfcGNtX29wZW4oaGFuZGxlLCBuYW1lLCBzdHJlYW0sIG1vZGUpOwotfQotCi1pbnQgQWxzYVdyYXBwZXI6OkRldmljZU5hbWVIaW50KGludCBjYXJkLCBjb25zdCBjaGFyKiBpZmFjZSwgdm9pZCoqKiBoaW50cykgewotICByZXR1cm4gc25kX2RldmljZV9uYW1lX2hpbnQoY2FyZCwgaWZhY2UsIGhpbnRzKTsKLX0KLQotY2hhciogQWxzYVdyYXBwZXI6OkRldmljZU5hbWVHZXRIaW50KGNvbnN0IHZvaWQqIGhpbnQsIGNvbnN0IGNoYXIqIGlkKSB7Ci0gIHJldHVybiBzbmRfZGV2aWNlX25hbWVfZ2V0X2hpbnQoaGludCwgaWQpOwotfQotCi1pbnQgQWxzYVdyYXBwZXI6OkRldmljZU5hbWVGcmVlSGludCh2b2lkKiogaGludHMpIHsKLSAgcmV0dXJuIHNuZF9kZXZpY2VfbmFtZV9mcmVlX2hpbnQoaGludHMpOwotfQotCi1pbnQgQWxzYVdyYXBwZXI6OkNhcmROZXh0KGludCogcmNhcmQpIHsKLSAgcmV0dXJuIHNuZF9jYXJkX25leHQocmNhcmQpOwotfQotCi1pbnQgQWxzYVdyYXBwZXI6OlBjbUNsb3NlKHNuZF9wY21fdCogaGFuZGxlKSB7Ci0gIHJldHVybiBzbmRfcGNtX2Nsb3NlKGhhbmRsZSk7Ci19Ci0KLWludCBBbHNhV3JhcHBlcjo6UGNtUHJlcGFyZShzbmRfcGNtX3QqIGhhbmRsZSkgewotICByZXR1cm4gc25kX3BjbV9wcmVwYXJlKGhhbmRsZSk7Ci19Ci0KLWludCBBbHNhV3JhcHBlcjo6UGNtRHJvcChzbmRfcGNtX3QqIGhhbmRsZSkgewotICByZXR1cm4gc25kX3BjbV9kcm9wKGhhbmRsZSk7Ci19Ci0KLWludCBBbHNhV3JhcHBlcjo6UGNtRGVsYXkoc25kX3BjbV90KiBoYW5kbGUsIHNuZF9wY21fc2ZyYW1lc190KiBkZWxheSkgewotICByZXR1cm4gc25kX3BjbV9kZWxheShoYW5kbGUsIGRlbGF5KTsKLX0KLQotc25kX3BjbV9zZnJhbWVzX3QgQWxzYVdyYXBwZXI6OlBjbVdyaXRlaShzbmRfcGNtX3QqIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfcGNtX3VmcmFtZXNfdCBzaXplKSB7Ci0gIHJldHVybiBzbmRfcGNtX3dyaXRlaShoYW5kbGUsIGJ1ZmZlciwgc2l6ZSk7Ci19Ci0KLXNuZF9wY21fc2ZyYW1lc190IEFsc2FXcmFwcGVyOjpQY21SZWFkaShzbmRfcGNtX3QqIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX3BjbV91ZnJhbWVzX3Qgc2l6ZSkgewotICByZXR1cm4gc25kX3BjbV9yZWFkaShoYW5kbGUsIGJ1ZmZlciwgc2l6ZSk7Ci19Ci0KLWludCBBbHNhV3JhcHBlcjo6UGNtUmVjb3ZlcihzbmRfcGNtX3QqIGhhbmRsZSwgaW50IGVyciwgaW50IHNpbGVudCkgewotICByZXR1cm4gc25kX3BjbV9yZWNvdmVyKGhhbmRsZSwgZXJyLCBzaWxlbnQpOwotfQotCi1jb25zdCBjaGFyKiBBbHNhV3JhcHBlcjo6UGNtTmFtZShzbmRfcGNtX3QqIGhhbmRsZSkgewotICByZXR1cm4gc25kX3BjbV9uYW1lKGhhbmRsZSk7Ci19Ci0KLWludCBBbHNhV3JhcHBlcjo6UGNtU2V0UGFyYW1zKHNuZF9wY21fdCogaGFuZGxlLCBzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9wY21fYWNjZXNzX3QgYWNjZXNzLCB1bnNpZ25lZCBpbnQgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcmF0ZSwgaW50IHNvZnRfcmVzYW1wbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGF0ZW5jeSkgewotICByZXR1cm4gc25kX3BjbV9zZXRfcGFyYW1zKGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc29mdF9yZXNhbXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlbmN5KTsKLX0KLQotaW50IEFsc2FXcmFwcGVyOjpQY21HZXRQYXJhbXMoc25kX3BjbV90KiBoYW5kbGUsIHNuZF9wY21fdWZyYW1lc190KiBidWZmZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9wY21fdWZyYW1lc190KiBwZXJpb2Rfc2l6ZSkgewotICByZXR1cm4gc25kX3BjbV9nZXRfcGFyYW1zKGhhbmRsZSwgYnVmZmVyX3NpemUsIHBlcmlvZF9zaXplKTsKLX0KLQotc25kX3BjbV9zZnJhbWVzX3QgQWxzYVdyYXBwZXI6OlBjbUF2YWlsVXBkYXRlKHNuZF9wY21fdCogaGFuZGxlKSB7Ci0gIHJldHVybiBzbmRfcGNtX2F2YWlsX3VwZGF0ZShoYW5kbGUpOwotfQotCi1zbmRfcGNtX3N0YXRlX3QgQWxzYVdyYXBwZXI6OlBjbVN0YXRlKHNuZF9wY21fdCogaGFuZGxlKSB7Ci0gIHJldHVybiBzbmRfcGNtX3N0YXRlKGhhbmRsZSk7Ci19Ci0KLWNvbnN0IGNoYXIqIEFsc2FXcmFwcGVyOjpTdHJFcnJvcihpbnQgZXJybnVtKSB7Ci0gIHJldHVybiBzbmRfc3RyZXJyb3IoZXJybnVtKTsKLX0KLQotaW50IEFsc2FXcmFwcGVyOjpQY21TdGFydChzbmRfcGNtX3QqIGhhbmRsZSkgewotICByZXR1cm4gc25kX3BjbV9zdGFydChoYW5kbGUpOwotfQotCi1pbnQgQWxzYVdyYXBwZXI6Ok1peGVyT3BlbihzbmRfbWl4ZXJfdCoqIG1peGVyLCBpbnQgbW9kZSkgewotICByZXR1cm4gc25kX21peGVyX29wZW4obWl4ZXIsIG1vZGUpOwotfQotCi1pbnQgQWxzYVdyYXBwZXI6Ok1peGVyQXR0YWNoKHNuZF9taXhlcl90KiBtaXhlciwgY29uc3QgY2hhciogbmFtZSkgewotICByZXR1cm4gc25kX21peGVyX2F0dGFjaChtaXhlciwgbmFtZSk7Ci19Ci0KLWludCBBbHNhV3JhcHBlcjo6TWl4ZXJFbGVtZW50UmVnaXN0ZXIoc25kX21peGVyX3QqIG1peGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc25kX21peGVyX3NlbGVtX3JlZ29wdCogb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX21peGVyX2NsYXNzX3QqKiBjbGFzc3ApIHsKLSAgcmV0dXJuIHNuZF9taXhlcl9zZWxlbV9yZWdpc3RlcihtaXhlciwgb3B0aW9ucywgY2xhc3NwKTsKLX0KLQotdm9pZCBBbHNhV3JhcHBlcjo6TWl4ZXJGcmVlKHNuZF9taXhlcl90KiBtaXhlcikgewotICBzbmRfbWl4ZXJfZnJlZShtaXhlcik7Ci19Ci0KLWludCBBbHNhV3JhcHBlcjo6TWl4ZXJEZXRhY2goc25kX21peGVyX3QqIG1peGVyLCBjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIHJldHVybiBzbmRfbWl4ZXJfZGV0YWNoKG1peGVyLCBuYW1lKTsKLX0KLQotaW50IEFsc2FXcmFwcGVyOjpNaXhlckNsb3NlKHNuZF9taXhlcl90KiBtaXhlcikgewotICByZXR1cm4gc25kX21peGVyX2Nsb3NlKG1peGVyKTsKLX0KLQotaW50IEFsc2FXcmFwcGVyOjpNaXhlckxvYWQoc25kX21peGVyX3QqIG1peGVyKSB7Ci0gIHJldHVybiBzbmRfbWl4ZXJfbG9hZChtaXhlcik7Ci19Ci0KLXNuZF9taXhlcl9lbGVtX3QqIEFsc2FXcmFwcGVyOjpNaXhlckZpcnN0RWxlbShzbmRfbWl4ZXJfdCogbWl4ZXIpIHsKLSAgcmV0dXJuIHNuZF9taXhlcl9maXJzdF9lbGVtKG1peGVyKTsKLX0KLQotc25kX21peGVyX2VsZW1fdCogQWxzYVdyYXBwZXI6Ok1peGVyTmV4dEVsZW0oc25kX21peGVyX2VsZW1fdCogZWxlbSkgewotICByZXR1cm4gc25kX21peGVyX2VsZW1fbmV4dChlbGVtKTsKLX0KLQotaW50IEFsc2FXcmFwcGVyOjpNaXhlclNlbGVtSXNBY3RpdmUoc25kX21peGVyX2VsZW1fdCogZWxlbSkgewotICByZXR1cm4gc25kX21peGVyX3NlbGVtX2lzX2FjdGl2ZShlbGVtKTsKLX0KLQotY29uc3QgY2hhciogQWxzYVdyYXBwZXI6Ok1peGVyU2VsZW1OYW1lKHNuZF9taXhlcl9lbGVtX3QqIGVsZW0pIHsKLSAgcmV0dXJuIHNuZF9taXhlcl9zZWxlbV9nZXRfbmFtZShlbGVtKTsKLX0KLQotaW50IEFsc2FXcmFwcGVyOjpNaXhlclNlbGVtU2V0Q2FwdHVyZVZvbHVtZUFsbCgKLSAgICBzbmRfbWl4ZXJfZWxlbV90KiBlbGVtLCBsb25nIHZhbHVlKSB7Ci0gIHJldHVybiBzbmRfbWl4ZXJfc2VsZW1fc2V0X2NhcHR1cmVfdm9sdW1lX2FsbChlbGVtLCB2YWx1ZSk7Ci19Ci0KLWludCBBbHNhV3JhcHBlcjo6TWl4ZXJTZWxlbUdldENhcHR1cmVWb2x1bWUoCi0gICAgc25kX21peGVyX2VsZW1fdCogZWxlbSwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsLCBsb25nKiB2YWx1ZSkgewotICByZXR1cm4gc25kX21peGVyX3NlbGVtX2dldF9jYXB0dXJlX3ZvbHVtZShlbGVtLCBjaGFubmVsLCB2YWx1ZSk7Ci19Ci0KLWludCBBbHNhV3JhcHBlcjo6TWl4ZXJTZWxlbUhhc0NhcHR1cmVWb2x1bWUoc25kX21peGVyX2VsZW1fdCogZWxlbSkgewotICByZXR1cm4gc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX3ZvbHVtZShlbGVtKTsKLX0KLQotaW50IEFsc2FXcmFwcGVyOjpNaXhlclNlbGVtR2V0Q2FwdHVyZVZvbHVtZVJhbmdlKHNuZF9taXhlcl9lbGVtX3QqIGVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyogbWluLCBsb25nKiBtYXgpIHsKLSAgcmV0dXJuIHNuZF9taXhlcl9zZWxlbV9nZXRfY2FwdHVyZV92b2x1bWVfcmFuZ2UoZWxlbSwgbWluLCBtYXgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9saW51eC9hbHNhX3dyYXBwZXIuaCBiL3NyYy9tZWRpYS9hdWRpby9saW51eC9hbHNhX3dyYXBwZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBkOTQ2My4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vbGludXgvYWxzYV93cmFwcGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotLy8KLS8vIEFsc2FXcmFwcGVyIGlzIGEgc2ltcGxlIHN0YXRlbGVzcyBjbGFzcyB0aGF0IHdyYXBzIHRoZSBhbHNhIGxpYnJhcnkgY29tbWFuZHMKLS8vIHdlIHdhbnQgdG8gdXNlLiAgSXQncyBwdXJwb3NlIGlzIHRvIGFsbG93IGluamVjdGlvbiBvZiBhIG1vY2sgc28gdGhhdCB0aGUKLS8vIGhpZ2hlciBsZXZlbCBjb2RlIGlzIHRlc3RhYmxlLgotCi0jaW5jbHVkZSA8YWxzYS9hc291bmRsaWIuaD4KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIE1FRElBX0VYUE9SVCBBbHNhV3JhcHBlciB7Ci0gcHVibGljOgotICBBbHNhV3JhcHBlcigpOwotICB2aXJ0dWFsIH5BbHNhV3JhcHBlcigpOwotCi0gIHZpcnR1YWwgaW50IERldmljZU5hbWVIaW50KGludCBjYXJkLCBjb25zdCBjaGFyKiBpZmFjZSwgdm9pZCoqKiBoaW50cyk7Ci0gIHZpcnR1YWwgY2hhciogRGV2aWNlTmFtZUdldEhpbnQoY29uc3Qgdm9pZCogaGludCwgY29uc3QgY2hhciogaWQpOwotICB2aXJ0dWFsIGludCBEZXZpY2VOYW1lRnJlZUhpbnQodm9pZCoqIGhpbnRzKTsKLSAgdmlydHVhbCBpbnQgQ2FyZE5leHQoaW50KiByY2FyZCk7Ci0KLSAgdmlydHVhbCBpbnQgUGNtT3BlbihzbmRfcGNtX3QqKiBoYW5kbGUsIGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgc25kX3BjbV9zdHJlYW1fdCBzdHJlYW0sIGludCBtb2RlKTsKLSAgdmlydHVhbCBpbnQgUGNtQ2xvc2Uoc25kX3BjbV90KiBoYW5kbGUpOwotICB2aXJ0dWFsIGludCBQY21QcmVwYXJlKHNuZF9wY21fdCogaGFuZGxlKTsKLSAgdmlydHVhbCBpbnQgUGNtRHJvcChzbmRfcGNtX3QqIGhhbmRsZSk7Ci0gIHZpcnR1YWwgaW50IFBjbURlbGF5KHNuZF9wY21fdCogaGFuZGxlLCBzbmRfcGNtX3NmcmFtZXNfdCogZGVsYXkpOwotICB2aXJ0dWFsIHNuZF9wY21fc2ZyYW1lc190IFBjbVdyaXRlaShzbmRfcGNtX3QqIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfcGNtX3VmcmFtZXNfdCBzaXplKTsKLSAgdmlydHVhbCBzbmRfcGNtX3NmcmFtZXNfdCBQY21SZWFkaShzbmRfcGNtX3QqIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX3BjbV91ZnJhbWVzX3Qgc2l6ZSk7Ci0gIHZpcnR1YWwgaW50IFBjbVJlY292ZXIoc25kX3BjbV90KiBoYW5kbGUsIGludCBlcnIsIGludCBzaWxlbnQpOwotICB2aXJ0dWFsIGludCBQY21TZXRQYXJhbXMoc25kX3BjbV90KiBoYW5kbGUsIHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX3BjbV9hY2Nlc3NfdCBhY2Nlc3MsIHVuc2lnbmVkIGludCBjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCByYXRlLCBpbnQgc29mdF9yZXNhbXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsYXRlbmN5KTsKLSAgdmlydHVhbCBpbnQgUGNtR2V0UGFyYW1zKHNuZF9wY21fdCogaGFuZGxlLCBzbmRfcGNtX3VmcmFtZXNfdCogYnVmZmVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfcGNtX3VmcmFtZXNfdCogcGVyaW9kX3NpemUpOwotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIFBjbU5hbWUoc25kX3BjbV90KiBoYW5kbGUpOwotICB2aXJ0dWFsIHNuZF9wY21fc2ZyYW1lc190IFBjbUF2YWlsVXBkYXRlKHNuZF9wY21fdCogaGFuZGxlKTsKLSAgdmlydHVhbCBzbmRfcGNtX3N0YXRlX3QgUGNtU3RhdGUoc25kX3BjbV90KiBoYW5kbGUpOwotICB2aXJ0dWFsIGludCBQY21TdGFydChzbmRfcGNtX3QqIGhhbmRsZSk7Ci0KLSAgdmlydHVhbCBpbnQgTWl4ZXJPcGVuKHNuZF9taXhlcl90KiogbWl4ZXIsIGludCBtb2RlKTsKLSAgdmlydHVhbCBpbnQgTWl4ZXJBdHRhY2goc25kX21peGVyX3QqIG1peGVyLCBjb25zdCBjaGFyKiBuYW1lKTsKLSAgdmlydHVhbCBpbnQgTWl4ZXJFbGVtZW50UmVnaXN0ZXIoc25kX21peGVyX3QqIG1peGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc25kX21peGVyX3NlbGVtX3JlZ29wdCogb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX21peGVyX2NsYXNzX3QqKiBjbGFzc3ApOwotICB2aXJ0dWFsIHZvaWQgTWl4ZXJGcmVlKHNuZF9taXhlcl90KiBtaXhlcik7Ci0gIHZpcnR1YWwgaW50IE1peGVyRGV0YWNoKHNuZF9taXhlcl90KiBtaXhlciwgY29uc3QgY2hhciogbmFtZSk7Ci0gIHZpcnR1YWwgaW50IE1peGVyQ2xvc2Uoc25kX21peGVyX3QqIG1peGVyKTsKLSAgdmlydHVhbCBpbnQgTWl4ZXJMb2FkKHNuZF9taXhlcl90KiBtaXhlcik7Ci0gIHZpcnR1YWwgc25kX21peGVyX2VsZW1fdCogTWl4ZXJGaXJzdEVsZW0oc25kX21peGVyX3QqIG1peGVyKTsKLSAgdmlydHVhbCBzbmRfbWl4ZXJfZWxlbV90KiBNaXhlck5leHRFbGVtKHNuZF9taXhlcl9lbGVtX3QqIGVsZW0pOwotICB2aXJ0dWFsIGludCBNaXhlclNlbGVtSXNBY3RpdmUoc25kX21peGVyX2VsZW1fdCogZWxlbSk7Ci0gIHZpcnR1YWwgY29uc3QgY2hhciogTWl4ZXJTZWxlbU5hbWUoc25kX21peGVyX2VsZW1fdCogZWxlbSk7Ci0gIHZpcnR1YWwgaW50IE1peGVyU2VsZW1TZXRDYXB0dXJlVm9sdW1lQWxsKHNuZF9taXhlcl9lbGVtX3QqIGVsZW0sIGxvbmcgdmFsdWUpOwotICB2aXJ0dWFsIGludCBNaXhlclNlbGVtR2V0Q2FwdHVyZVZvbHVtZShzbmRfbWl4ZXJfZWxlbV90KiBlbGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcqIHZhbHVlKTsKLSAgdmlydHVhbCBpbnQgTWl4ZXJTZWxlbUhhc0NhcHR1cmVWb2x1bWUoc25kX21peGVyX2VsZW1fdCogZWxlbSk7Ci0gIHZpcnR1YWwgaW50IE1peGVyU2VsZW1HZXRDYXB0dXJlVm9sdW1lUmFuZ2Uoc25kX21peGVyX2VsZW1fdCogZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nKiBtaW4sIGxvbmcqIG1heCk7Ci0KLSAgdmlydHVhbCBjb25zdCBjaGFyKiBTdHJFcnJvcihpbnQgZXJybnVtKTsKLQotIHByaXZhdGU6Ci0gIGludCBDb25maWd1cmVId1BhcmFtcyhzbmRfcGNtX3QqIGhhbmRsZSwgc25kX3BjbV9od19wYXJhbXNfdCogaHdfcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQsIHNuZF9wY21fYWNjZXNzX3QgYWNjZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNoYW5uZWxzLCB1bnNpZ25lZCBpbnQgcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2Z0X3Jlc2FtcGxlLCB1bnNpZ25lZCBpbnQgbGF0ZW5jeSk7Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBbHNhV3JhcHBlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9saW51eC9hdWRpb19tYW5hZ2VyX2xpbnV4LmNjIGIvc3JjL21lZGlhL2F1ZGlvL2xpbnV4L2F1ZGlvX21hbmFnZXJfbGludXguY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YmUwYjcuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2xpbnV4L2F1ZGlvX21hbmFnZXJfbGludXguY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2xpbnV4L2F1ZGlvX21hbmFnZXJfbGludXguaCIKLQotI2luY2x1ZGUgImJhc2UvY29tbWFuZF9saW5lLmgiCi0jaW5jbHVkZSAiYmFzZS9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2Uvbml4L3hkZ191dGlsLmgiCi0jaW5jbHVkZSAiYmFzZS9wcm9jZXNzX3V0aWwuaCIKLSNpbmNsdWRlICJiYXNlL3N0bF91dGlsLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fb3V0cHV0X2Rpc3BhdGNoZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb191dGlsLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vbGludXgvYWxzYV9pbnB1dC5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2xpbnV4L2Fsc2Ffb3V0cHV0LmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vbGludXgvYWxzYV93cmFwcGVyLmgiCi0jaWYgZGVmaW5lZChVU0VfUFVMU0VBVURJTykKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9wdWxzZS9wdWxzZV9vdXRwdXQuaCIKLSNlbmRpZgotI2lmIGRlZmluZWQoVVNFX0NSQVMpCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vbGludXgvY3Jhc19pbnB1dC5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2xpbnV4L2NyYXNfb3V0cHV0LmgiCi0jZW5kaWYKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2xpbWl0cy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfc3dpdGNoZXMuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gTWF4aW11bSBudW1iZXIgb2Ygb3V0cHV0IHN0cmVhbXMgdGhhdCBjYW4gYmUgb3BlbiBzaW11bHRhbmVvdXNseS4KLXN0YXRpYyBjb25zdCBpbnQga01heE91dHB1dFN0cmVhbXMgPSA1MDsKLQotLy8gU2luY2UgImRlZmF1bHQiLCAicHVsc2UiIGFuZCAiZG1peCIgZGV2aWNlcyBhcmUgdmlydHVhbCBkZXZpY2VzIG1hcHBlZCB0bwotLy8gcmVhbCBkZXZpY2VzLCB3ZSByZW1vdmUgdGhlbSBmcm9tIHRoZSBsaXN0IHRvIGF2b2lkaW5nIGR1cGxpY2F0ZSBjb3VudGluZy4KLS8vIEluIGFkZGl0aW9uLCBub3RlIHRoYXQgd2Ugc3VwcG9ydCBubyBtb3JlIHRoYW4gMiBjaGFubmVscyBmb3IgcmVjb3JkaW5nLAotLy8gaGVuY2Ugc3Vycm91bmQgZGV2aWNlcyBhcmUgbm90IHN0b3JlZCBpbiB0aGUgbGlzdC4KLXN0YXRpYyBjb25zdCBjaGFyKiBrSW52YWxpZEF1ZGlvSW5wdXREZXZpY2VzW10gPSB7Ci0gICJkZWZhdWx0IiwKLSAgIm51bGwiLAotICAicHVsc2UiLAotICAiZG1peCIsCi0gICJzdXJyb3VuZCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciBrQ3Jhc0F1dG9tYXRpY0RldmljZU5hbWVbXSA9ICJBdXRvbWF0aWMiOwotc3RhdGljIGNvbnN0IGNoYXIga0NyYXNBdXRvbWF0aWNEZXZpY2VJZFtdID0gImF1dG9tYXRpYyI7Ci0KLS8vIEltcGxlbWVudGF0aW9uIG9mIEF1ZGlvTWFuYWdlci4KLWJvb2wgQXVkaW9NYW5hZ2VyTGludXg6Okhhc0F1ZGlvT3V0cHV0RGV2aWNlcygpIHsKLSAgaWYgKFVzZUNyYXMoKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gSGFzQW55QWxzYUF1ZGlvRGV2aWNlKGtTdHJlYW1QbGF5YmFjayk7Ci19Ci0KLWJvb2wgQXVkaW9NYW5hZ2VyTGludXg6Okhhc0F1ZGlvSW5wdXREZXZpY2VzKCkgewotICBpZiAoVXNlQ3JhcygpKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBIYXNBbnlBbHNhQXVkaW9EZXZpY2Uoa1N0cmVhbUNhcHR1cmUpOwotfQotCi1BdWRpb01hbmFnZXJMaW51eDo6QXVkaW9NYW5hZ2VyTGludXgoKQotICAgIDogd3JhcHBlcl8obmV3IEFsc2FXcmFwcGVyKCkpIHsKLSAgU2V0TWF4T3V0cHV0U3RyZWFtc0FsbG93ZWQoa01heE91dHB1dFN0cmVhbXMpOwotfQotCi1BdWRpb01hbmFnZXJMaW51eDo6fkF1ZGlvTWFuYWdlckxpbnV4KCkgewotICBTaHV0ZG93bigpOwotfQotCi1ib29sIEF1ZGlvTWFuYWdlckxpbnV4OjpDYW5TaG93QXVkaW9JbnB1dFNldHRpbmdzKCkgewotICBzY29wZWRfcHRyPGJhc2U6OkVudmlyb25tZW50PiBlbnYoYmFzZTo6RW52aXJvbm1lbnQ6OkNyZWF0ZSgpKTsKLQotICBzd2l0Y2ggKGJhc2U6Om5peDo6R2V0RGVza3RvcEVudmlyb25tZW50KGVudi5nZXQoKSkpIHsKLSAgICBjYXNlIGJhc2U6Om5peDo6REVTS1RPUF9FTlZJUk9OTUVOVF9HTk9NRToKLSAgICBjYXNlIGJhc2U6Om5peDo6REVTS1RPUF9FTlZJUk9OTUVOVF9LREUzOgotICAgIGNhc2UgYmFzZTo6bml4OjpERVNLVE9QX0VOVklST05NRU5UX0tERTQ6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIGJhc2U6Om5peDo6REVTS1RPUF9FTlZJUk9OTUVOVF9PVEhFUjoKLSAgICBjYXNlIGJhc2U6Om5peDo6REVTS1RPUF9FTlZJUk9OTUVOVF9VTklUWToKLSAgICBjYXNlIGJhc2U6Om5peDo6REVTS1RPUF9FTlZJUk9OTUVOVF9YRkNFOgotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIFVubGVzcyBHZXREZXNrdG9wRW52aXJvbm1lbnQoKSBiYWRseSBtaXNiZWhhdmVzLCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4uCi0gIE5PVFJFQUNIRUQoKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEF1ZGlvTWFuYWdlckxpbnV4OjpTaG93QXVkaW9JbnB1dFNldHRpbmdzKCkgewotICBzY29wZWRfcHRyPGJhc2U6OkVudmlyb25tZW50PiBlbnYoYmFzZTo6RW52aXJvbm1lbnQ6OkNyZWF0ZSgpKTsKLSAgYmFzZTo6bml4OjpEZXNrdG9wRW52aXJvbm1lbnQgZGVza3RvcCA9IGJhc2U6Om5peDo6R2V0RGVza3RvcEVudmlyb25tZW50KAotICAgICAgZW52LmdldCgpKTsKLSAgc3RkOjpzdHJpbmcgY29tbWFuZCgoZGVza3RvcCA9PSBiYXNlOjpuaXg6OkRFU0tUT1BfRU5WSVJPTk1FTlRfR05PTUUpID8KLSAgICAgICAgICAgICAgICAgICAgICAiZ25vbWUtdm9sdW1lLWNvbnRyb2wiIDogImttaXgiKTsKLSAgYmFzZTo6TGF1bmNoUHJvY2VzcyhDb21tYW5kTGluZShGaWxlUGF0aChjb21tYW5kKSksIGJhc2U6OkxhdW5jaE9wdGlvbnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLX0KLQotdm9pZCBBdWRpb01hbmFnZXJMaW51eDo6R2V0QXVkaW9JbnB1dERldmljZU5hbWVzKAotICAgIG1lZGlhOjpBdWRpb0RldmljZU5hbWVzKiBkZXZpY2VfbmFtZXMpIHsKLSAgRENIRUNLKGRldmljZV9uYW1lcy0+ZW1wdHkoKSk7Ci0gIGlmIChVc2VDcmFzKCkpIHsKLSAgICBHZXRDcmFzQXVkaW9JbnB1dERldmljZXMoZGV2aWNlX25hbWVzKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBHZXRBbHNhQXVkaW9JbnB1dERldmljZXMoZGV2aWNlX25hbWVzKTsKLX0KLQotYm9vbCBBdWRpb01hbmFnZXJMaW51eDo6VXNlQ3JhcygpIHsKLSNpZiBkZWZpbmVkKFVTRV9DUkFTKQotICBpZiAoQ29tbWFuZExpbmU6OkZvckN1cnJlbnRQcm9jZXNzKCktPkhhc1N3aXRjaChzd2l0Y2hlczo6a1VzZUNyYXMpKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgQXVkaW9NYW5hZ2VyTGludXg6OkdldENyYXNBdWRpb0lucHV0RGV2aWNlcygKLSAgICBtZWRpYTo6QXVkaW9EZXZpY2VOYW1lcyogZGV2aWNlX25hbWVzKSB7Ci0gIC8vIENyYXMgd2lsbCByb3V0ZSBhdWRpbyBmcm9tIGEgcHJvcGVyIHBoeXNpY2FsIGRldmljZSBhdXRvbWF0aWNhbGx5LgotICBkZXZpY2VfbmFtZXMtPnB1c2hfYmFjayhtZWRpYTo6QXVkaW9EZXZpY2VOYW1lKAotICAgICAga0NyYXNBdXRvbWF0aWNEZXZpY2VOYW1lLCBrQ3Jhc0F1dG9tYXRpY0RldmljZUlkKSk7Ci19Ci0KLXZvaWQgQXVkaW9NYW5hZ2VyTGludXg6OkdldEFsc2FBdWRpb0lucHV0RGV2aWNlcygKLSAgICBtZWRpYTo6QXVkaW9EZXZpY2VOYW1lcyogZGV2aWNlX25hbWVzKSB7Ci0gIC8vIENvbnN0YW50cyBzcGVjaWZpZWQgYnkgdGhlIEFMU0EgQVBJIGZvciBkZXZpY2UgaGludHMuCi0gIHN0YXRpYyBjb25zdCBjaGFyIGtQY21JbnRlcmZhY2VOYW1lW10gPSAicGNtIjsKLSAgaW50IGNhcmQgPSAtMTsKLQotICAvLyBMb29wIHRocm91Z2ggdGhlIHNvdW5kIGNhcmRzIHRvIGdldCBBTFNBIGRldmljZSBoaW50cy4KLSAgd2hpbGUgKCF3cmFwcGVyXy0+Q2FyZE5leHQoJmNhcmQpICYmIGNhcmQgPj0gMCkgewotICAgIHZvaWQqKiBoaW50cyA9IE5VTEw7Ci0gICAgaW50IGVycm9yID0gd3JhcHBlcl8tPkRldmljZU5hbWVIaW50KGNhcmQsIGtQY21JbnRlcmZhY2VOYW1lLCAmaGludHMpOwotICAgIGlmICghZXJyb3IpIHsKLSAgICAgIEdldEFsc2FEZXZpY2VzSW5mbyhoaW50cywgZGV2aWNlX25hbWVzKTsKLQotICAgICAgLy8gRGVzdHJveSB0aGUgaGludHMgbm93IHRoYXQgd2UncmUgZG9uZSB3aXRoIGl0LgotICAgICAgd3JhcHBlcl8tPkRldmljZU5hbWVGcmVlSGludChoaW50cyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIERMT0coV0FSTklORykgPDwgIkdldEF1ZGlvSW5wdXREZXZpY2VzOiB1bmFibGUgdG8gZ2V0IGRldmljZSBoaW50czogIgotICAgICAgICAgICAgICAgICAgICA8PCB3cmFwcGVyXy0+U3RyRXJyb3IoZXJyb3IpOwotICAgIH0KLSAgfQotfQotCi12b2lkIEF1ZGlvTWFuYWdlckxpbnV4OjpHZXRBbHNhRGV2aWNlc0luZm8oCi0gICAgdm9pZCoqIGhpbnRzLCBtZWRpYTo6QXVkaW9EZXZpY2VOYW1lcyogZGV2aWNlX25hbWVzKSB7Ci0gIHN0YXRpYyBjb25zdCBjaGFyIGtJb0hpbnROYW1lW10gPSAiSU9JRCI7Ci0gIHN0YXRpYyBjb25zdCBjaGFyIGtOYW1lSGludE5hbWVbXSA9ICJOQU1FIjsKLSAgc3RhdGljIGNvbnN0IGNoYXIga0Rlc2NyaXB0aW9uSGludE5hbWVbXSA9ICJERVNDIjsKLSAgc3RhdGljIGNvbnN0IGNoYXIga091dHB1dERldmljZVtdID0gIk91dHB1dCI7Ci0KLSAgZm9yICh2b2lkKiogaGludF9pdGVyID0gaGludHM7ICpoaW50X2l0ZXIgIT0gTlVMTDsgaGludF9pdGVyKyspIHsKLSAgICAvLyBPbmx5IGV4YW1pbmUgZGV2aWNlcyB0aGF0IGFyZSBpbnB1dCBjYXBhYmxlLiAgVmFsaWQgdmFsdWVzIGFyZQotICAgIC8vICJJbnB1dCIsICJPdXRwdXQiLCBhbmQgTlVMTCB3aGljaCBtZWFucyBib3RoIGlucHV0IGFuZCBvdXRwdXQuCi0gICAgc2NvcGVkX3B0cl9tYWxsb2M8Y2hhcj4gaW8od3JhcHBlcl8tPkRldmljZU5hbWVHZXRIaW50KCpoaW50X2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtJb0hpbnROYW1lKSk7Ci0gICAgaWYgKGlvICE9IE5VTEwgJiYgc3RyY21wKGtPdXRwdXREZXZpY2UsIGlvLmdldCgpKSA9PSAwKQotICAgICAgY29udGludWU7Ci0KLSAgICAvLyBGb3VuZCBhbiBpbnB1dCBkZXZpY2UsIHByZXBlbmQgdGhlIGRlZmF1bHQgZGV2aWNlIHNpbmNlIHdlIGFsd2F5cyB3YW50Ci0gICAgLy8gaXQgdG8gYmUgb24gdGhlIHRvcCBvZiB0aGUgbGlzdCBmb3IgYWxsIHBsYXRmb3Jtcy4gQW5kIHRoZXJlIGlzIG5vCi0gICAgLy8gZHVwbGljYXRlIGNvdW50aW5nIGhlcmUgc2luY2UgaXQgaXMgb25seSBkb25lIGlmIHRoZSBsaXN0IGlzIHN0aWxsIGVtcHR5LgotICAgIC8vIE5vdGUsIHB1bHNlIGhhcyBleGNsdXNpdmVseSBvcGVuZWQgdGhlIGRlZmF1bHQgZGV2aWNlLCBzbyB3ZSBtdXN0IG9wZW4KLSAgICAvLyB0aGUgZGV2aWNlIHZpYSB0aGUgImRlZmF1bHQiIG1vbmlrZXIuCi0gICAgaWYgKGRldmljZV9uYW1lcy0+ZW1wdHkoKSkgewotICAgICAgZGV2aWNlX25hbWVzLT5wdXNoX2Zyb250KG1lZGlhOjpBdWRpb0RldmljZU5hbWUoCi0gICAgICAgICAgQXVkaW9NYW5hZ2VyQmFzZTo6a0RlZmF1bHREZXZpY2VOYW1lLAotICAgICAgICAgIEF1ZGlvTWFuYWdlckJhc2U6OmtEZWZhdWx0RGV2aWNlSWQpKTsKLSAgICB9Ci0KLSAgICAvLyBHZXQgdGhlIHVuaXF1ZSBkZXZpY2UgbmFtZSBmb3IgdGhlIGRldmljZS4KLSAgICBzY29wZWRfcHRyX21hbGxvYzxjaGFyPiB1bmlxdWVfZGV2aWNlX25hbWUoCi0gICAgICAgIHdyYXBwZXJfLT5EZXZpY2VOYW1lR2V0SGludCgqaGludF9pdGVyLCBrTmFtZUhpbnROYW1lKSk7Ci0KLSAgICAvLyBGaW5kIG91dCBpZiB0aGUgZGV2aWNlIGlzIGF2YWlsYWJsZS4KLSAgICBpZiAoSXNBbHNhRGV2aWNlQXZhaWxhYmxlKHVuaXF1ZV9kZXZpY2VfbmFtZS5nZXQoKSkpIHsKLSAgICAgIC8vIEdldCB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBkZXZpY2UuCi0gICAgICBzY29wZWRfcHRyX21hbGxvYzxjaGFyPiBkZXNjKHdyYXBwZXJfLT5EZXZpY2VOYW1lR2V0SGludCgKLSAgICAgICAgICAqaGludF9pdGVyLCBrRGVzY3JpcHRpb25IaW50TmFtZSkpOwotCi0gICAgICBtZWRpYTo6QXVkaW9EZXZpY2VOYW1lIG5hbWU7Ci0gICAgICBuYW1lLnVuaXF1ZV9pZCA9IHVuaXF1ZV9kZXZpY2VfbmFtZS5nZXQoKTsKLSAgICAgIGlmIChkZXNjLmdldCgpKSB7Ci0gICAgICAgIC8vIFVzZSB0aGUgbW9yZSB1c2VyIGZyaWVuZGx5IGRlc2NyaXB0aW9uIGFzIG5hbWUuCi0gICAgICAgIC8vIFJlcGxhY2UgJ1xuJyB3aXRoICctJy4KLSAgICAgICAgY2hhciogcHJldCA9IHN0cmNocihkZXNjLmdldCgpLCAnXG4nKTsKLSAgICAgICAgaWYgKHByZXQpCi0gICAgICAgICAgKnByZXQgPSAnLSc7Ci0gICAgICAgIG5hbWUuZGV2aWNlX25hbWUgPSBkZXNjLmdldCgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVmlydHVhbCBkZXZpY2VzIGRvbid0IG5lY2Vzc2FyaWx5IGhhdmUgZGVzY3JpcHRpb25zLgotICAgICAgICAvLyBVc2UgdGhlaXIgbmFtZXMgaW5zdGVhZC4KLSAgICAgICAgbmFtZS5kZXZpY2VfbmFtZSA9IHVuaXF1ZV9kZXZpY2VfbmFtZS5nZXQoKTsKLSAgICAgIH0KLQotICAgICAgLy8gU3RvcmUgdGhlIGRldmljZSBpbmZvcm1hdGlvbi4KLSAgICAgIGRldmljZV9uYW1lcy0+cHVzaF9iYWNrKG5hbWUpOwotICAgIH0KLSAgfQotfQotCi1ib29sIEF1ZGlvTWFuYWdlckxpbnV4OjpJc0Fsc2FEZXZpY2VBdmFpbGFibGUoY29uc3QgY2hhciogZGV2aWNlX25hbWUpIHsKLSAgaWYgKCFkZXZpY2VfbmFtZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gQ2hlY2sgaWYgdGhlIGRldmljZSBpcyBpbiB0aGUgbGlzdCBvZiBpbnZhbGlkIGRldmljZXMuCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJyYXlzaXplKGtJbnZhbGlkQXVkaW9JbnB1dERldmljZXMpOyArK2kpIHsKLSAgICBpZiAoc3RybmNtcChrSW52YWxpZEF1ZGlvSW5wdXREZXZpY2VzW2ldLCBkZXZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICBzdHJsZW4oa0ludmFsaWRBdWRpb0lucHV0RGV2aWNlc1tpXSkpID09IDApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBBdWRpb01hbmFnZXJMaW51eDo6SGFzQW55QWxzYUF1ZGlvRGV2aWNlKFN0cmVhbVR5cGUgc3RyZWFtKSB7Ci0gIHN0YXRpYyBjb25zdCBjaGFyIGtQY21JbnRlcmZhY2VOYW1lW10gPSAicGNtIjsKLSAgc3RhdGljIGNvbnN0IGNoYXIga0lvSGludE5hbWVbXSA9ICJJT0lEIjsKLSAgY29uc3QgY2hhcioga05vdFdhbnRlZERldmljZSA9Ci0gICAgICAoc3RyZWFtID09IGtTdHJlYW1QbGF5YmFjayA/ICJJbnB1dCIgOiAiT3V0cHV0Iik7Ci0gIHZvaWQqKiBoaW50cyA9IE5VTEw7Ci0gIGJvb2wgaGFzX2RldmljZSA9IGZhbHNlOwotICBpbnQgY2FyZCA9IC0xOwotCi0gIC8vIExvb3AgdGhyb3VnaCB0aGUgc291bmQgY2FyZHMuCi0gIC8vIERvbid0IHVzZSBzbmRfZGV2aWNlX25hbWVfaGludCgtMSwuLikgc2luY2UgdGhlcmUgaXMgYSBhY2Nlc3MgdmlvbGF0aW9uCi0gIC8vIGluc2lkZSB0aGlzIEFMU0EgQVBJIHdpdGggbGliYXNvdW5kLnNvLjIuMC4wLgotICB3aGlsZSAoIXdyYXBwZXJfLT5DYXJkTmV4dCgmY2FyZCkgJiYgKGNhcmQgPj0gMCkgJiYgIWhhc19kZXZpY2UpIHsKLSAgICBpbnQgZXJyb3IgPSB3cmFwcGVyXy0+RGV2aWNlTmFtZUhpbnQoY2FyZCwga1BjbUludGVyZmFjZU5hbWUsICZoaW50cyk7Ci0gICAgaWYgKCFlcnJvcikgewotICAgICAgZm9yICh2b2lkKiogaGludF9pdGVyID0gaGludHM7ICpoaW50X2l0ZXIgIT0gTlVMTDsgaGludF9pdGVyKyspIHsKLSAgICAgICAgLy8gT25seSBleGFtaW5lIGRldmljZXMgdGhhdCBhcmUgfHN0cmVhbXwgY2FwYWJsZS4gIFZhbGlkIHZhbHVlcyBhcmUKLSAgICAgICAgLy8gIklucHV0IiwgIk91dHB1dCIsIGFuZCBOVUxMIHdoaWNoIG1lYW5zIGJvdGggaW5wdXQgYW5kIG91dHB1dC4KLSAgICAgICAgc2NvcGVkX3B0cl9tYWxsb2M8Y2hhcj4gaW8od3JhcHBlcl8tPkRldmljZU5hbWVHZXRIaW50KCpoaW50X2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSW9IaW50TmFtZSkpOwotICAgICAgICBpZiAoaW8gIT0gTlVMTCAmJiBzdHJjbXAoa05vdFdhbnRlZERldmljZSwgaW8uZ2V0KCkpID09IDApCi0gICAgICAgICAgY29udGludWU7ICAvLyBXcm9uZyB0eXBlLCBza2lwIHRoZSBkZXZpY2UuCi0KLSAgICAgICAgLy8gRm91bmQgYW4gaW5wdXQgZGV2aWNlLgotICAgICAgICBoYXNfZGV2aWNlID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIERlc3Ryb3kgdGhlIGhpbnRzIG5vdyB0aGF0IHdlJ3JlIGRvbmUgd2l0aCBpdC4KLSAgICAgIHdyYXBwZXJfLT5EZXZpY2VOYW1lRnJlZUhpbnQoaGludHMpOwotICAgICAgaGludHMgPSBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICBETE9HKFdBUk5JTkcpIDw8ICJIYXNBbnlBdWRpb0RldmljZTogdW5hYmxlIHRvIGdldCBkZXZpY2UgaGludHM6ICIKLSAgICAgICAgICAgICAgICAgICAgPDwgd3JhcHBlcl8tPlN0ckVycm9yKGVycm9yKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gaGFzX2RldmljZTsKLX0KLQotQXVkaW9PdXRwdXRTdHJlYW0qIEF1ZGlvTWFuYWdlckxpbnV4OjpNYWtlTGluZWFyT3V0cHV0U3RyZWFtKAotICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKSB7Ci0gIERDSEVDS19FUShBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIsIHBhcmFtcy5mb3JtYXQoKSk7Ci0gIHJldHVybiBNYWtlT3V0cHV0U3RyZWFtKHBhcmFtcyk7Ci19Ci0KLUF1ZGlvT3V0cHV0U3RyZWFtKiBBdWRpb01hbmFnZXJMaW51eDo6TWFrZUxvd0xhdGVuY3lPdXRwdXRTdHJlYW0oCi0gICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpIHsKLSAgRENIRUNLX0VRKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xPV19MQVRFTkNZLCBwYXJhbXMuZm9ybWF0KCkpOwotICByZXR1cm4gTWFrZU91dHB1dFN0cmVhbShwYXJhbXMpOwotfQotCi1BdWRpb0lucHV0U3RyZWFtKiBBdWRpb01hbmFnZXJMaW51eDo6TWFrZUxpbmVhcklucHV0U3RyZWFtKAotICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2lkKSB7Ci0gIERDSEVDS19FUShBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIsIHBhcmFtcy5mb3JtYXQoKSk7Ci0gIHJldHVybiBNYWtlSW5wdXRTdHJlYW0ocGFyYW1zLCBkZXZpY2VfaWQpOwotfQotCi1BdWRpb0lucHV0U3RyZWFtKiBBdWRpb01hbmFnZXJMaW51eDo6TWFrZUxvd0xhdGVuY3lJbnB1dFN0cmVhbSgKLSAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCkgewotICBEQ0hFQ0tfRVEoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTE9XX0xBVEVOQ1ksIHBhcmFtcy5mb3JtYXQoKSk7Ci0gIHJldHVybiBNYWtlSW5wdXRTdHJlYW0ocGFyYW1zLCBkZXZpY2VfaWQpOwotfQotCi1BdWRpb091dHB1dFN0cmVhbSogQXVkaW9NYW5hZ2VyTGludXg6Ok1ha2VPdXRwdXRTdHJlYW0oCi0gICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpIHsKLSNpZiBkZWZpbmVkKFVTRV9DUkFTKQotICBpZiAoVXNlQ3JhcygpKSB7Ci0gICAgcmV0dXJuIG5ldyBDcmFzT3V0cHV0U3RyZWFtKHBhcmFtcywgdGhpcyk7Ci0gIH0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChVU0VfUFVMU0VBVURJTykKLSAgaWYgKENvbW1hbmRMaW5lOjpGb3JDdXJyZW50UHJvY2VzcygpLT5IYXNTd2l0Y2goc3dpdGNoZXM6OmtVc2VQdWxzZUF1ZGlvKSkgewotICAgIHJldHVybiBuZXcgUHVsc2VBdWRpb091dHB1dFN0cmVhbShwYXJhbXMsIHRoaXMpOwotICB9Ci0jZW5kaWYKLQotICBzdGQ6OnN0cmluZyBkZXZpY2VfbmFtZSA9IEFsc2FQY21PdXRwdXRTdHJlYW06OmtBdXRvU2VsZWN0RGV2aWNlOwotICBpZiAoQ29tbWFuZExpbmU6OkZvckN1cnJlbnRQcm9jZXNzKCktPkhhc1N3aXRjaCgKLSAgICAgICAgICBzd2l0Y2hlczo6a0Fsc2FPdXRwdXREZXZpY2UpKSB7Ci0gICAgZGV2aWNlX25hbWUgPSBDb21tYW5kTGluZTo6Rm9yQ3VycmVudFByb2Nlc3MoKS0+R2V0U3dpdGNoVmFsdWVBU0NJSSgKLSAgICAgICAgc3dpdGNoZXM6OmtBbHNhT3V0cHV0RGV2aWNlKTsKLSAgfQotICByZXR1cm4gbmV3IEFsc2FQY21PdXRwdXRTdHJlYW0oZGV2aWNlX25hbWUsIHBhcmFtcywgd3JhcHBlcl8uZ2V0KCksIHRoaXMpOwotfQotCi1BdWRpb0lucHV0U3RyZWFtKiBBdWRpb01hbmFnZXJMaW51eDo6TWFrZUlucHV0U3RyZWFtKAotICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2lkKSB7Ci0jaWYgZGVmaW5lZChVU0VfQ1JBUykKLSAgaWYgKFVzZUNyYXMoKSkgewotICAgIHJldHVybiBuZXcgQ3Jhc0lucHV0U3RyZWFtKHBhcmFtcywgdGhpcyk7Ci0gIH0KLSNlbmRpZgotCi0gIHN0ZDo6c3RyaW5nIGRldmljZV9uYW1lID0gKGRldmljZV9pZCA9PSBBdWRpb01hbmFnZXJCYXNlOjprRGVmYXVsdERldmljZUlkKSA/Ci0gICAgICBBbHNhUGNtSW5wdXRTdHJlYW06OmtBdXRvU2VsZWN0RGV2aWNlIDogZGV2aWNlX2lkOwotICBpZiAoQ29tbWFuZExpbmU6OkZvckN1cnJlbnRQcm9jZXNzKCktPkhhc1N3aXRjaChzd2l0Y2hlczo6a0Fsc2FJbnB1dERldmljZSkpIHsKLSAgICBkZXZpY2VfbmFtZSA9IENvbW1hbmRMaW5lOjpGb3JDdXJyZW50UHJvY2VzcygpLT5HZXRTd2l0Y2hWYWx1ZUFTQ0lJKAotICAgICAgICBzd2l0Y2hlczo6a0Fsc2FJbnB1dERldmljZSk7Ci0gIH0KLQotICByZXR1cm4gbmV3IEFsc2FQY21JbnB1dFN0cmVhbSh0aGlzLCBkZXZpY2VfbmFtZSwgcGFyYW1zLCB3cmFwcGVyXy5nZXQoKSk7Ci19Ci0KLUF1ZGlvTWFuYWdlciogQ3JlYXRlQXVkaW9NYW5hZ2VyKCkgewotICByZXR1cm4gbmV3IEF1ZGlvTWFuYWdlckxpbnV4KCk7Ci19Ci0KLUF1ZGlvUGFyYW1ldGVycyBBdWRpb01hbmFnZXJMaW51eDo6R2V0UHJlZmVycmVkTG93TGF0ZW5jeU91dHB1dFN0cmVhbVBhcmFtZXRlcnMoCi0gICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBpbnB1dF9wYXJhbXMpIHsKLSAgLy8gU2luY2UgTGludXggZG9lc24ndCBhY3R1YWxseSBoYXZlIGEgbG93IGxhdGVuY3kgcGF0aCB0aGUgaGFyZHdhcmUgYnVmZmVyCi0gIC8vIHNpemUgaXMgcXVpdGUgbGFyZ2UgaW4gb3JkZXIgdG8gcHJldmVudCBnbGl0Y2hlcyB3aXRoIGdlbmVyYWwgdXNhZ2UuICBTb21lCi0gIC8vIGNsaWVudHMsIHN1Y2ggYXMgV2ViUlRDLCBoYXZlIGEgbW9yZSBsaW1pdGVkIHVzZSBjYXNlIGFuZCB3b3JrIGFjY2VwdGFibHkKLSAgLy8gd2l0aCBhIHNtYWxsZXIgYnVmZmVyIHNpemUuICBUaGUgY2hlY2sgYmVsb3cgYWxsb3dzIGNsaWVudHMgd2hpY2ggd2FudCB0bwotICAvLyB0cnkgYSBzbWFsbGVyIGJ1ZmZlciBzaXplIG9uIExpbnV4IHRvIGRvIHNvLgotICBpbnQgYnVmZmVyX3NpemUgPSBHZXRBdWRpb0hhcmR3YXJlQnVmZmVyU2l6ZSgpOwotICBpZiAoaW5wdXRfcGFyYW1zLmZyYW1lc19wZXJfYnVmZmVyKCkgPCBidWZmZXJfc2l6ZSkKLSAgICBidWZmZXJfc2l6ZSA9IGlucHV0X3BhcmFtcy5mcmFtZXNfcGVyX2J1ZmZlcigpOwotCi0gIGludCBzYW1wbGVfcmF0ZSA9IEdldEF1ZGlvSGFyZHdhcmVTYW1wbGVSYXRlKCk7Ci0gIC8vIENSQVMgd2lsbCBzYW1wbGUgcmF0ZSBjb252ZXJ0IGlmIG5lZWRlZCwgc28gcGFzcyB0aHJvdWdoIGlucHV0IHNhbXBsZSByYXRlLgotICBpZiAoVXNlQ3JhcygpKQotICAgIHNhbXBsZV9yYXRlID0gaW5wdXRfcGFyYW1zLnNhbXBsZV9yYXRlKCk7Ci0KLSAgLy8gVE9ETyhkYWxlY3VydGlzKTogVGhpcyBzaG91bGQgaW5jbHVkZSBiaXRzIHBlciBjaGFubmVsIGFuZCBjaGFubmVsIGxheW91dAotICAvLyBldmVudHVhbGx5LgotICByZXR1cm4gQXVkaW9QYXJhbWV0ZXJzKAotICAgICAgQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTE9XX0xBVEVOQ1ksIGlucHV0X3BhcmFtcy5jaGFubmVsX2xheW91dCgpLAotICAgICAgc2FtcGxlX3JhdGUsIDE2LCBidWZmZXJfc2l6ZSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2xpbnV4L2F1ZGlvX21hbmFnZXJfbGludXguaCBiL3NyYy9tZWRpYS9hdWRpby9saW51eC9hdWRpb19tYW5hZ2VyX2xpbnV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhYWIzMmEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2xpbnV4L2F1ZGlvX21hbmFnZXJfbGludXguaAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfQVVESU9fTElOVVhfQVVESU9fTUFOQUdFUl9MSU5VWF9IXwotI2RlZmluZSBNRURJQV9BVURJT19MSU5VWF9BVURJT19NQU5BR0VSX0xJTlVYX0hfCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAiYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fbWFuYWdlcl9iYXNlLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIEFsc2FXcmFwcGVyOwotCi1jbGFzcyBNRURJQV9FWFBPUlQgQXVkaW9NYW5hZ2VyTGludXggOiBwdWJsaWMgQXVkaW9NYW5hZ2VyQmFzZSB7Ci0gcHVibGljOgotICBBdWRpb01hbmFnZXJMaW51eCgpOwotCi0gIC8vIEltcGxlbWVudGF0aW9uIG9mIEF1ZGlvTWFuYWdlci4KLSAgdmlydHVhbCBib29sIEhhc0F1ZGlvT3V0cHV0RGV2aWNlcygpIE9WRVJSSURFOwotICB2aXJ0dWFsIGJvb2wgSGFzQXVkaW9JbnB1dERldmljZXMoKSBPVkVSUklERTsKLSAgdmlydHVhbCBib29sIENhblNob3dBdWRpb0lucHV0U2V0dGluZ3MoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFNob3dBdWRpb0lucHV0U2V0dGluZ3MoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIEdldEF1ZGlvSW5wdXREZXZpY2VOYW1lcyhtZWRpYTo6QXVkaW9EZXZpY2VOYW1lcyogZGV2aWNlX25hbWVzKQotICAgICAgT1ZFUlJJREU7Ci0KLSAgLy8gSW1wbGVtZW50YXRpb24gb2YgQXVkaW9NYW5hZ2VyQmFzZS4KLSAgdmlydHVhbCBBdWRpb091dHB1dFN0cmVhbSogTWFrZUxpbmVhck91dHB1dFN0cmVhbSgKLSAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKSBPVkVSUklERTsKLSAgdmlydHVhbCBBdWRpb091dHB1dFN0cmVhbSogTWFrZUxvd0xhdGVuY3lPdXRwdXRTdHJlYW0oCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcykgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgQXVkaW9JbnB1dFN0cmVhbSogTWFrZUxpbmVhcklucHV0U3RyZWFtKAotICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfaWQpIE9WRVJSSURFOwotICB2aXJ0dWFsIEF1ZGlvSW5wdXRTdHJlYW0qIE1ha2VMb3dMYXRlbmN5SW5wdXRTdHJlYW0oCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgQXVkaW9QYXJhbWV0ZXJzIEdldFByZWZlcnJlZExvd0xhdGVuY3lPdXRwdXRTdHJlYW1QYXJhbWV0ZXJzKAotICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBpbnB1dF9wYXJhbXMpIE9WRVJSSURFOwotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIH5BdWRpb01hbmFnZXJMaW51eCgpOwotCi0gcHJpdmF0ZToKLSAgZW51bSBTdHJlYW1UeXBlIHsKLSAgICBrU3RyZWFtUGxheWJhY2sgPSAwLAotICAgIGtTdHJlYW1DYXB0dXJlLAotICB9OwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiBjcmFzIHNob3VsZCBiZSB1c2VkIGZvciBpbnB1dC9vdXRwdXQuCi0gIGJvb2wgVXNlQ3JhcygpOwotCi0gIC8vIEdldHMgYSBsaXN0IG9mIGF2YWlsYWJsZSBjcmFzIGlucHV0IGRldmljZXMuCi0gIHZvaWQgR2V0Q3Jhc0F1ZGlvSW5wdXREZXZpY2VzKG1lZGlhOjpBdWRpb0RldmljZU5hbWVzKiBkZXZpY2VfbmFtZXMpOwotCi0gIC8vIEdldHMgYSBsaXN0IG9mIGF2YWlsYWJsZSBBTFNBIGlucHV0IGRldmljZXMuCi0gIHZvaWQgR2V0QWxzYUF1ZGlvSW5wdXREZXZpY2VzKG1lZGlhOjpBdWRpb0RldmljZU5hbWVzKiBkZXZpY2VfbmFtZXMpOwotCi0gIC8vIEdldHMgdGhlIEFMU0EgZGV2aWNlcycgbmFtZXMgYW5kIGlkcy4KLSAgdm9pZCBHZXRBbHNhRGV2aWNlc0luZm8odm9pZCoqIGhpbnQsIG1lZGlhOjpBdWRpb0RldmljZU5hbWVzKiBkZXZpY2VfbmFtZXMpOwotCi0gIC8vIENoZWNrcyBpZiB0aGUgc3BlY2lmaWMgQUxTQSBkZXZpY2UgaXMgYXZhaWxhYmxlLgotICBib29sIElzQWxzYURldmljZUF2YWlsYWJsZShjb25zdCBjaGFyKiBkZXZpY2VfbmFtZSk7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIGEgZGV2aWNlIGlzIHByZXNlbnQgZm9yIHRoZSBnaXZlbiBzdHJlYW0gdHlwZS4KLSAgYm9vbCBIYXNBbnlBbHNhQXVkaW9EZXZpY2UoU3RyZWFtVHlwZSBzdHJlYW0pOwotCi0gIC8vIENhbGxlZCBieSBNYWtlTGluZWFyT3V0cHV0U3RyZWFtIGFuZCBNYWtlTG93TGF0ZW5jeU91dHB1dFN0cmVhbS4KLSAgQXVkaW9PdXRwdXRTdHJlYW0qIE1ha2VPdXRwdXRTdHJlYW0oY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpOwotCi0gIC8vIENhbGxlZCBieSBNYWtlTGluZWFySW5wdXRTdHJlYW0gYW5kIE1ha2VMb3dMYXRlbmN5SW5wdXRTdHJlYW0uCi0gIEF1ZGlvSW5wdXRTdHJlYW0qIE1ha2VJbnB1dFN0cmVhbShjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfaWQpOwotCi0gIHNjb3BlZF9wdHI8QWxzYVdyYXBwZXI+IHdyYXBwZXJfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBdWRpb01hbmFnZXJMaW51eCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9BVURJT19MSU5VWF9BVURJT19NQU5BR0VSX0xJTlVYX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vbGludXgvY3Jhc19pbnB1dC5jYyBiL3NyYy9tZWRpYS9hdWRpby9saW51eC9jcmFzX2lucHV0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGU0MDVlLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9saW51eC9jcmFzX2lucHV0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby9saW51eC9jcmFzX2lucHV0LmgiCi0KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL3RpbWUuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19tYW5hZ2VyLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vbGludXgvYWxzYV91dGlsLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vbGludXgvYXVkaW9fbWFuYWdlcl9saW51eC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1DcmFzSW5wdXRTdHJlYW06OkNyYXNJbnB1dFN0cmVhbShjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWFuYWdlckxpbnV4KiBtYW5hZ2VyKQotICAgIDogYXVkaW9fbWFuYWdlcl8obWFuYWdlciksCi0gICAgICBieXRlc19wZXJfZnJhbWVfKDApLAotICAgICAgY2FsbGJhY2tfKE5VTEwpLAotICAgICAgY2xpZW50XyhOVUxMKSwKLSAgICAgIHBhcmFtc18ocGFyYW1zKSwKLSAgICAgIHN0YXJ0ZWRfKGZhbHNlKSwKLSAgICAgIHN0cmVhbV9pZF8oMCkgewotICBEQ0hFQ0soYXVkaW9fbWFuYWdlcl8pOwotfQotCi1DcmFzSW5wdXRTdHJlYW06On5DcmFzSW5wdXRTdHJlYW0oKSB7Ci0gIERDSEVDSyghY2xpZW50Xyk7Ci19Ci0KLWJvb2wgQ3Jhc0lucHV0U3RyZWFtOjpPcGVuKCkgewotICBpZiAoY2xpZW50XykgewotICAgIE5PVFJFQUNIRUQoKSA8PCAiQ3Jhc0lucHV0U3RyZWFtIGFscmVhZHkgb3BlbiI7Ci0gICAgcmV0dXJuIGZhbHNlOyAgLy8gQWxyZWFkeSBvcGVuLgotICB9Ci0KLSAgLy8gU2FuaXR5IGNoZWNrIGlucHV0IHZhbHVlcy4KLSAgaWYgKHBhcmFtc18uc2FtcGxlX3JhdGUoKSA8PSAwKSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCAiVW5zdXBwb3J0ZWQgYXVkaW8gZnJlcXVlbmN5LiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xJTkVBUiAhPSBwYXJhbXNfLmZvcm1hdCgpICYmCi0gICAgICBBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MT1dfTEFURU5DWSAhPSBwYXJhbXNfLmZvcm1hdCgpKSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCAiVW5zdXBwb3J0ZWQgYXVkaW8gZm9ybWF0LiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc25kX3BjbV9mb3JtYXRfdCBwY21fZm9ybWF0ID0KLSAgICAgIGFsc2FfdXRpbDo6Qml0c1RvRm9ybWF0KHBhcmFtc18uYml0c19wZXJfc2FtcGxlKCkpOwotICBpZiAocGNtX2Zvcm1hdCA9PSBTTkRfUENNX0ZPUk1BVF9VTktOT1dOKSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCAiVW5zdXBwb3J0ZWQgYml0cy9zYW1wbGU6ICIgPDwgcGFyYW1zXy5iaXRzX3Blcl9zYW1wbGUoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBDcmVhdGUgdGhlIGNsaWVudCBhbmQgY29ubmVjdCB0byB0aGUgQ1JBUyBzZXJ2ZXIuCi0gIGlmIChjcmFzX2NsaWVudF9jcmVhdGUoJmNsaWVudF8pIDwgMCkgewotICAgIERMT0coV0FSTklORykgPDwgIkNvdWxkbid0IGNyZWF0ZSBDUkFTIGNsaWVudC5cbiI7Ci0gICAgY2xpZW50XyA9IE5VTEw7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGNyYXNfY2xpZW50X2Nvbm5lY3QoY2xpZW50XykpIHsKLSAgICBETE9HKFdBUk5JTkcpIDw8ICJDb3VsZG4ndCBjb25uZWN0IENSQVMgY2xpZW50LlxuIjsKLSAgICBjcmFzX2NsaWVudF9kZXN0cm95KGNsaWVudF8pOwotICAgIGNsaWVudF8gPSBOVUxMOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFRoZW4gc3RhcnQgcnVubmluZyB0aGUgY2xpZW50LgotICBpZiAoY3Jhc19jbGllbnRfcnVuX3RocmVhZChjbGllbnRfKSkgewotICAgIERMT0coV0FSTklORykgPDwgIkNvdWxkbid0IHJ1biBDUkFTIGNsaWVudC5cbiI7Ci0gICAgY3Jhc19jbGllbnRfZGVzdHJveShjbGllbnRfKTsKLSAgICBjbGllbnRfID0gTlVMTDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBDcmFzSW5wdXRTdHJlYW06OkNsb3NlKCkgewotICBpZiAoY2xpZW50XykgewotICAgIGNyYXNfY2xpZW50X3N0b3AoY2xpZW50Xyk7Ci0gICAgY3Jhc19jbGllbnRfZGVzdHJveShjbGllbnRfKTsKLSAgICBjbGllbnRfID0gTlVMTDsKLSAgfQotCi0gIGlmIChjYWxsYmFja18pIHsKLSAgICBjYWxsYmFja18tPk9uQ2xvc2UodGhpcyk7Ci0gICAgY2FsbGJhY2tfID0gTlVMTDsKLSAgfQotCi0gIC8vIFNpZ25hbCB0byB0aGUgbWFuYWdlciB0aGF0IHdlJ3JlIGNsb3NlZCBhbmQgY2FuIGJlIHJlbW92ZWQuCi0gIC8vIFNob3VsZCBiZSBsYXN0IGNhbGwgaW4gdGhlIG1ldGhvZCBhcyBpdCBkZWxldGVzICJ0aGlzIi4KLSAgYXVkaW9fbWFuYWdlcl8tPlJlbGVhc2VJbnB1dFN0cmVhbSh0aGlzKTsKLX0KLQotdm9pZCBDcmFzSW5wdXRTdHJlYW06OlN0YXJ0KEF1ZGlvSW5wdXRDYWxsYmFjayogY2FsbGJhY2spIHsKLSAgRENIRUNLKGNsaWVudF8pOwotICBEQ0hFQ0soY2FsbGJhY2spOwotCi0gIC8vIElmIGFscmVhZHkgcGxheWluZywgc3RvcCBiZWZvcmUgcmUtc3RhcnRpbmcuCi0gIGlmIChzdGFydGVkXykKLSAgICByZXR1cm47Ci0KLSAgY2FsbGJhY2tfID0gY2FsbGJhY2s7Ci0KLSAgLy8gUHJlcGFyZSB8YXVkaW9fZm9ybWF0fCBhbmQgfHN0cmVhbV9wYXJhbXN8IGZvciB0aGUgc3RyZWFtIHdlCi0gIC8vIHdpbGwgY3JlYXRlLgotICBjcmFzX2F1ZGlvX2Zvcm1hdCogYXVkaW9fZm9ybWF0ID0gY3Jhc19hdWRpb19mb3JtYXRfY3JlYXRlKAotICAgICAgYWxzYV91dGlsOjpCaXRzVG9Gb3JtYXQocGFyYW1zXy5iaXRzX3Blcl9zYW1wbGUoKSksCi0gICAgICBwYXJhbXNfLnNhbXBsZV9yYXRlKCksCi0gICAgICBwYXJhbXNfLmNoYW5uZWxzKCkpOwotICBpZiAoIWF1ZGlvX2Zvcm1hdCkgewotICAgIERMT0coV0FSTklORykgPDwgIkVycm9yIHNldHRpbmcgdXAgYXVkaW8gcGFyYW1ldGVycy4iOwotICAgIGNhbGxiYWNrXy0+T25FcnJvcih0aGlzLCAtRU5PTUVNKTsKLSAgICBjYWxsYmFja18gPSBOVUxMOwotICAgIHJldHVybjsKLSAgfQotCi0gIHVuc2lnbmVkIGludCBmcmFtZXNfcGVyX3BhY2tldCA9IHBhcmFtc18uZnJhbWVzX3Blcl9idWZmZXIoKTsKLSAgY3Jhc19zdHJlYW1fcGFyYW1zKiBzdHJlYW1fcGFyYW1zID0gY3Jhc19jbGllbnRfc3RyZWFtX3BhcmFtc19jcmVhdGUoCi0gICAgICBDUkFTX1NUUkVBTV9JTlBVVCwKLSAgICAgIGZyYW1lc19wZXJfcGFja2V0LCAgLy8gVG90YWwgbGF0ZW5jeS4KLSAgICAgIGZyYW1lc19wZXJfcGFja2V0LCAgLy8gQ2FsbCBiYWNrIHdoZW4gdGhpcyBtYW55IHJlYWR5LgotICAgICAgZnJhbWVzX3Blcl9wYWNrZXQsICAvLyBNaW5pbXVtIENhbGxiYWNrIGxldmVsIGlnbm9yZWQgZm9yIGNhcHR1cmUgc3RyZWFtcy4KLSAgICAgIENSQVNfU1RSRUFNX1RZUEVfREVGQVVMVCwKLSAgICAgIDAsICAvLyBVbnVzZWQgZmxhZ3MuCi0gICAgICB0aGlzLAotICAgICAgQ3Jhc0lucHV0U3RyZWFtOjpTYW1wbGVzUmVhZHksCi0gICAgICBDcmFzSW5wdXRTdHJlYW06OlN0cmVhbUVycm9yLAotICAgICAgYXVkaW9fZm9ybWF0KTsKLSAgaWYgKCFzdHJlYW1fcGFyYW1zKSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCAiRXJyb3Igc2V0dGluZyB1cCBzdHJlYW0gcGFyYW1ldGVycy4iOwotICAgIGNhbGxiYWNrXy0+T25FcnJvcih0aGlzLCAtRU5PTUVNKTsKLSAgICBjYWxsYmFja18gPSBOVUxMOwotICAgIGNyYXNfYXVkaW9fZm9ybWF0X2Rlc3Ryb3koYXVkaW9fZm9ybWF0KTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBCZWZvcmUgc3RhcnRpbmcgdGhlIHN0cmVhbSwgc2F2ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgZnJhbWUgZm9yIHVzZSBpbgotICAvLyB0aGUgY2FsbGJhY2suCi0gIGJ5dGVzX3Blcl9mcmFtZV8gPSBjcmFzX2NsaWVudF9mb3JtYXRfYnl0ZXNfcGVyX2ZyYW1lKGF1ZGlvX2Zvcm1hdCk7Ci0KLSAgLy8gQWRkaW5nIHRoZSBzdHJlYW0gd2lsbCBzdGFydCB0aGUgYXVkaW8gY2FsbGJhY2tzLgotICBpZiAoY3Jhc19jbGllbnRfYWRkX3N0cmVhbShjbGllbnRfLCAmc3RyZWFtX2lkXywgc3RyZWFtX3BhcmFtcykgPT0gMCkgewotICAgIGF1ZGlvX21hbmFnZXJfLT5JbmNyZWFzZUFjdGl2ZUlucHV0U3RyZWFtQ291bnQoKTsKLSAgfSBlbHNlIHsKLSAgICBETE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gYWRkIHRoZSBzdHJlYW0uIjsKLSAgICBjYWxsYmFja18tPk9uRXJyb3IodGhpcywgLUVJTyk7Ci0gICAgY2FsbGJhY2tfID0gTlVMTDsKLSAgfQotCi0gIC8vIERvbmUgd2l0aCBjb25maWcgcGFyYW1zLgotICBjcmFzX2F1ZGlvX2Zvcm1hdF9kZXN0cm95KGF1ZGlvX2Zvcm1hdCk7Ci0gIGNyYXNfY2xpZW50X3N0cmVhbV9wYXJhbXNfZGVzdHJveShzdHJlYW1fcGFyYW1zKTsKLQotICBzdGFydGVkXyA9IHRydWU7Ci19Ci0KLXZvaWQgQ3Jhc0lucHV0U3RyZWFtOjpTdG9wKCkgewotICBEQ0hFQ0soY2xpZW50Xyk7Ci0KLSAgaWYgKCFjYWxsYmFja18gfHwgIXN0YXJ0ZWRfKQotICAgIHJldHVybjsKLQotICAvLyBSZW1vdmluZyB0aGUgc3RyZWFtIGZyb20gdGhlIGNsaWVudCBzdG9wcyBhdWRpby4KLSAgY3Jhc19jbGllbnRfcm1fc3RyZWFtKGNsaWVudF8sIHN0cmVhbV9pZF8pOwotCi0gIGF1ZGlvX21hbmFnZXJfLT5EZWNyZWFzZUFjdGl2ZUlucHV0U3RyZWFtQ291bnQoKTsKLQotICBzdGFydGVkXyA9IGZhbHNlOwotfQotCi0vLyBTdGF0aWMgY2FsbGJhY2sgYXNraW5nIGZvciBzYW1wbGVzLiAgUnVuIG9uIGhpZ2ggcHJpb3JpdHkgdGhyZWFkLgotaW50IENyYXNJbnB1dFN0cmVhbTo6U2FtcGxlc1JlYWR5KGNyYXNfY2xpZW50KiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jhc19zdHJlYW1faWRfdCBzdHJlYW1faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aW1lc3BlYyogc2FtcGxlX3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGFyZykgewotICBDcmFzSW5wdXRTdHJlYW0qIG1lID0gc3RhdGljX2Nhc3Q8Q3Jhc0lucHV0U3RyZWFtKj4oYXJnKTsKLSAgbWUtPlJlYWRBdWRpbyhmcmFtZXMsIHNhbXBsZXMsIHNhbXBsZV90cyk7Ci0gIHJldHVybiBmcmFtZXM7Ci19Ci0KLS8vIFN0YXRpYyBjYWxsYmFjayBmb3Igc3RyZWFtIGVycm9ycy4KLWludCBDcmFzSW5wdXRTdHJlYW06OlN0cmVhbUVycm9yKGNyYXNfY2xpZW50KiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmFzX3N0cmVhbV9pZF90IHN0cmVhbV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhcmcpIHsKLSAgQ3Jhc0lucHV0U3RyZWFtKiBtZSA9IHN0YXRpY19jYXN0PENyYXNJbnB1dFN0cmVhbSo+KGFyZyk7Ci0gIG1lLT5Ob3RpZnlTdHJlYW1FcnJvcihlcnIpOwotICByZXR1cm4gMDsKLX0KLQotdm9pZCBDcmFzSW5wdXRTdHJlYW06OlJlYWRBdWRpbyhzaXplX3QgZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aW1lc3BlYyogc2FtcGxlX3RzKSB7Ci0gIERDSEVDSyhjYWxsYmFja18pOwotCi0gIHRpbWVzcGVjIGxhdGVuY3lfdHMgPSB7MCwgMH07Ci0KLSAgLy8gRGV0ZXJtaW5lIGxhdGVuY3kgYW5kIHBhc3MgdGhhdCBvbiB0byB0aGUgc2luay4gIHNhbXBsZV90cyBpcyB0aGUgd2FsbCB0aW1lCi0gIC8vIGluZGljYXRpbmcgd2hlbiB0aGUgZmlyc3Qgc2FtcGxlIGluIHRoZSBidWZmZXIgd2FzIGNhcHR1cmVkLiAgQ29udmVydCB0aGF0Ci0gIC8vIHRvIGxhdGVuY3kgaW4gYnl0ZXMuCi0gIGNyYXNfY2xpZW50X2NhbGNfY2FwdHVyZV9sYXRlbmN5KHNhbXBsZV90cywgJmxhdGVuY3lfdHMpOwotICBkb3VibGUgbGF0ZW5jeV91c2VjID0KLSAgICAgIGxhdGVuY3lfdHMudHZfc2VjICogYmFzZTo6VGltZTo6a01pY3Jvc2Vjb25kc1BlclNlY29uZCArCi0gICAgICBsYXRlbmN5X3RzLnR2X25zZWMgLyBiYXNlOjpUaW1lOjprTmFub3NlY29uZHNQZXJNaWNyb3NlY29uZDsKLSAgZG91YmxlIGZyYW1lc19sYXRlbmN5ID0KLSAgICAgIGxhdGVuY3lfdXNlYyAqIHBhcmFtc18uc2FtcGxlX3JhdGUoKSAvIGJhc2U6OlRpbWU6OmtNaWNyb3NlY29uZHNQZXJTZWNvbmQ7Ci0gIHVuc2lnbmVkIGludCBieXRlc19sYXRlbmN5ID0KLSAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oZnJhbWVzX2xhdGVuY3kgKiBieXRlc19wZXJfZnJhbWVfKTsKLQotICAvLyBVcGRhdGUgdGhlIEFHQyB2b2x1bWUgbGV2ZWwgb25jZSBldmVyeSBzZWNvbmQuIE5vdGUgdGhhdCwgfHZvbHVtZXwgaXMKLSAgLy8gYWxzbyB1cGRhdGVkIGVhY2ggdGltZSBTZXRWb2x1bWUoKSBpcyBjYWxsZWQgdGhyb3VnaCBJUEMgYnkgdGhlCi0gIC8vIHJlbmRlci1zaWRlIEFHQy4KLSAgZG91YmxlIG5vcm1hbGl6ZWRfdm9sdW1lID0gMC4wOwotICBRdWVyeUFnY1ZvbHVtZSgmbm9ybWFsaXplZF92b2x1bWUpOwotCi0gIGNhbGxiYWNrXy0+T25EYXRhKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgZnJhbWVzICogYnl0ZXNfcGVyX2ZyYW1lXywKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXNfbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZF92b2x1bWUpOwotfQotCi12b2lkIENyYXNJbnB1dFN0cmVhbTo6Tm90aWZ5U3RyZWFtRXJyb3IoaW50IGVycikgewotICBpZiAoY2FsbGJhY2tfKQotICAgIGNhbGxiYWNrXy0+T25FcnJvcih0aGlzLCBlcnIpOwotfQotCi1kb3VibGUgQ3Jhc0lucHV0U3RyZWFtOjpHZXRNYXhWb2x1bWUoKSB7Ci0gIERDSEVDSyhjbGllbnRfKTsKLQotICAvLyBDYXB0dXJlIGdhaW4gaXMgcmV0dXJuZWQgYXMgZEIgKiAxMDAgKDE1MCA9PiAxLjVkQkZTKS4gIENvbnZlcnQgdGhlIGRCCi0gIC8vIHZhbHVlIHRvIGEgcmF0aW8gYmVmb3JlIHJldHVybmluZy4KLSAgZG91YmxlIGRCID0gY3Jhc19jbGllbnRfZ2V0X3N5c3RlbV9tYXhfY2FwdHVyZV9nYWluKGNsaWVudF8pIC8gMTAwLjA7Ci0gIHJldHVybiBHZXRWb2x1bWVSYXRpb0Zyb21EZWNpYmVscyhkQik7Ci19Ci0KLXZvaWQgQ3Jhc0lucHV0U3RyZWFtOjpTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgewotICBEQ0hFQ0soY2xpZW50Xyk7Ci0KLSAgLy8gQ29udmVydCBmcm9tIHRoZSBwYXNzZWQgdm9sdW1lIHJhdGlvLCB0byBkQiAqIDEwMC4KLSAgZG91YmxlIGRCID0gR2V0RGVjaWJlbHNGcm9tVm9sdW1lUmF0aW8odm9sdW1lKTsKLSAgY3Jhc19jbGllbnRfc2V0X3N5c3RlbV9jYXB0dXJlX2dhaW4oY2xpZW50Xywgc3RhdGljX2Nhc3Q8bG9uZz4oZEIgKiAxMDAuMCkpOwotCi0gIC8vIFVwZGF0ZSB0aGUgQUdDIHZvbHVtZSBsZXZlbCBiYXNlZCBvbiB0aGUgbGFzdCBzZXR0aW5nIGFib3ZlLiBOb3RlIHRoYXQsCi0gIC8vIHRoZSB2b2x1bWUtbGV2ZWwgcmVzb2x1dGlvbiBpcyBub3QgaW5maW5pdGUgYW5kIGl0IGlzIHRoZXJlZm9yZSBub3QKLSAgLy8gcG9zc2libGUgdG8gYXNzdW1lIHRoYXQgdGhlIHZvbHVtZSBwcm92aWRlZCBhcyBpbnB1dCBwYXJhbWV0ZXIgY2FuIGJlCi0gIC8vIHVzZWQgZGlyZWN0bHkuIEluc3RlYWQsIGEgbmV3IHF1ZXJ5IHRvIHRoZSBhdWRpbyBoYXJkd2FyZSBpcyByZXF1aXJlZC4KLSAgLy8gVGhpcyBtZXRob2QgZG9lcyBub3RoaW5nIGlmIEFHQyBpcyBkaXNhYmxlZC4KLSAgVXBkYXRlQWdjVm9sdW1lKCk7Ci19Ci0KLWRvdWJsZSBDcmFzSW5wdXRTdHJlYW06OkdldFZvbHVtZSgpIHsKLSAgaWYgKCFjbGllbnRfKQotICAgIHJldHVybiAwLjA7Ci0KLSAgbG9uZyBkQiA9IGNyYXNfY2xpZW50X2dldF9zeXN0ZW1fY2FwdHVyZV9nYWluKGNsaWVudF8pIC8gMTAwLjA7Ci0gIHJldHVybiBHZXRWb2x1bWVSYXRpb0Zyb21EZWNpYmVscyhkQik7Ci19Ci0KLWRvdWJsZSBDcmFzSW5wdXRTdHJlYW06OkdldFZvbHVtZVJhdGlvRnJvbURlY2liZWxzKGRvdWJsZSBkQikgY29uc3QgewotICByZXR1cm4gcG93KDEwLCBkQiAvIDIwLjApOwotfQotCi1kb3VibGUgQ3Jhc0lucHV0U3RyZWFtOjpHZXREZWNpYmVsc0Zyb21Wb2x1bWVSYXRpbyhkb3VibGUgdm9sdW1lX3JhdGlvKSBjb25zdCB7Ci0gIHJldHVybiAyMCAqIGxvZzEwKHZvbHVtZV9yYXRpbyk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2xpbnV4L2NyYXNfaW5wdXQuaCBiL3NyYy9tZWRpYS9hdWRpby9saW51eC9jcmFzX2lucHV0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ODkxZGEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2xpbnV4L2NyYXNfaW5wdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0FVRElPX0xJTlVYX0NSQVNfSU5QVVRfSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fTElOVVhfQ1JBU19JTlBVVF9IXwotCi0jaW5jbHVkZSA8Y3Jhc19jbGllbnQuaD4KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvY29tcGlsZXJfc3BlY2lmaWMuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvd2Vha19wdHIuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19pbnB1dF9zdHJlYW1faW1wbC5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX2lvLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fcGFyYW1ldGVycy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBBdWRpb01hbmFnZXJMaW51eDsKLQotLy8gUHJvdmlkZXMgYW4gaW5wdXQgc3RyZWFtIGZvciBhdWRpbyBjYXB0dXJlIGJhc2VkIG9uIENSQVMsIHRoZSBDaHJvbWVPUyBBdWRpbwotLy8gU2VydmVyLiAgVGhpcyBvYmplY3QgaXMgbm90IHRocmVhZCBzYWZlIGFuZCBhbGwgbWV0aG9kcyBzaG91bGQgYmUgaW52b2tlZCBpbgotLy8gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIG9iamVjdC4KLWNsYXNzIENyYXNJbnB1dFN0cmVhbSA6IHB1YmxpYyBBdWRpb0lucHV0U3RyZWFtSW1wbCB7Ci0gcHVibGljOgotICAvLyBUaGUgY3RvciB0YWtlcyBhbGwgdGhlIHVzdWFsIHBhcmFtZXRlcnMsIHBsdXMgfG1hbmFnZXJ8IHdoaWNoIGlzIHRoZQotICAvLyBhdWRpbyBtYW5hZ2VyIHdobyBpcyBjcmVhdGluZyB0aGlzIG9iamVjdC4KLSAgQ3Jhc0lucHV0U3RyZWFtKGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLCBBdWRpb01hbmFnZXJMaW51eCogbWFuYWdlcik7Ci0KLSAgLy8gVGhlIGR0b3IgaXMgdHlwaWNhbGx5IGNhbGxlZCBieSB0aGUgQXVkaW9NYW5hZ2VyIG9ubHkgYW5kIGl0IGlzIHVzdWFsbHkKLSAgLy8gdHJpZ2dlcmVkIGJ5IGNhbGxpbmcgQXVkaW9PdXRwdXRTdHJlYW06OkNsb3NlKCkuCi0gIHZpcnR1YWwgfkNyYXNJbnB1dFN0cmVhbSgpOwotCi0gIC8vIEltcGxlbWVudGF0aW9uIG9mIEF1ZGlvSW5wdXRTdHJlYW0uCi0gIHZpcnR1YWwgYm9vbCBPcGVuKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTdGFydChBdWRpb0lucHV0Q2FsbGJhY2sqIGNhbGxiYWNrKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0b3AoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIENsb3NlKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgZG91YmxlIEdldE1heFZvbHVtZSgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpIE9WRVJSSURFOwotICB2aXJ0dWFsIGRvdWJsZSBHZXRWb2x1bWUoKSBPVkVSUklERTsKLQotIHByaXZhdGU6Ci0gIC8vIEhhbmRsZXMgcmVxdWVzdHMgdG8gZ2V0IHNhbXBsZXMgZnJvbSB0aGUgcHJvdmlkZWQgYnVmZmVyLiAgVGhpcyB3aWxsIGJlCi0gIC8vIGNhbGxlZCBieSB0aGUgYXVkaW8gc2VydmVyIHdoZW4gaXQgaGFzIHNhbXBsZXMgcmVhZHkuCi0gIHN0YXRpYyBpbnQgU2FtcGxlc1JlYWR5KGNyYXNfY2xpZW50KiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNyYXNfc3RyZWFtX2lkX3Qgc3RyZWFtX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogc2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltZXNwZWMqIHNhbXBsZV90cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYXJnKTsKLQotICAvLyBIYW5kbGVzIG5vdGlmaWNhaXRvbiB0aGF0IHRoZXJlIHdhcyBhbiBlcnJvciB3aXRoIHRoZSBwbGF5YmFjayBzdHJlYW0uCi0gIHN0YXRpYyBpbnQgU3RyZWFtRXJyb3IoY3Jhc19jbGllbnQqIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjcmFzX3N0cmVhbV9pZF90IHN0cmVhbV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGFyZyk7Ci0KLSAgLy8gUmVhZHMgb25lIG9yIG1vcmUgYnVmZmVycyBvZiBhdWRpbyBmcm9tIHRoZSBkZXZpY2UsIHBhc3NlcyBvbiB0byB0aGUKLSAgLy8gcmVnaXN0ZXJlZCBjYWxsYmFjay4gQ2FsbGVkIGZyb20gU2FtcGxlc1JlYWR5KCkuCi0gIHZvaWQgUmVhZEF1ZGlvKHNpemVfdCBmcmFtZXMsIHVpbnQ4KiBidWZmZXIsIGNvbnN0IHRpbWVzcGVjKiBzYW1wbGVfdHMpOwotCi0gIC8vIERlYWxzIHdpdGggYW4gZXJyb3IgdGhhdCBvY2N1cmVkIGluIHRoZSBzdHJlYW0uICBDYWxsZWQgZnJvbSBTdHJlYW1FcnJvcigpLgotICB2b2lkIE5vdGlmeVN0cmVhbUVycm9yKGludCBlcnIpOwotCi0gIC8vIENvbnZlcnQgZnJvbSBkQiAqIDEwMCB0byBhIHZvbHVtZSByYXRpby4KLSAgZG91YmxlIEdldFZvbHVtZVJhdGlvRnJvbURlY2liZWxzKGRvdWJsZSBkQikgY29uc3Q7Ci0KLSAgLy8gQ29udmVydCBmcm9tIGEgdm9sdW1lIHJhdGlvIHRvIGRCLgotICBkb3VibGUgR2V0RGVjaWJlbHNGcm9tVm9sdW1lUmF0aW8oZG91YmxlIHZvbHVtZV9yYXRpbykgY29uc3Q7Ci0KLSAgLy8gTm9uLXJlZmNvdW50ZWQgcG9pbnRlciBiYWNrIHRvIHRoZSBhdWRpbyBtYW5hZ2VyLgotICAvLyBUaGUgQXVkaW9NYW5hZ2VyIGluZGlyZWN0bHkgaG9sZHMgb24gdG8gc3RyZWFtIG9iamVjdHMsIHNvIHdlIGRvbid0Ci0gIC8vIHdhbnQgY2lyY3VsYXIgcmVmZXJlbmNlcy4gIEFkZGl0aW9uYWxseSwgc3RyZWFtIG9iamVjdHMgbGl2ZSBvbiB0aGUgYXVkaW8KLSAgLy8gdGhyZWFkLCB3aGljaCBpcyBvd25lZCBieSB0aGUgYXVkaW8gbWFuYWdlciBhbmQgd2UgZG9uJ3Qgd2FudCB0byBhZGRyZWYKLSAgLy8gdGhlIG1hbmFnZXIgZnJvbSB0aGF0IHRocmVhZC4KLSAgQXVkaW9NYW5hZ2VyTGludXgqIGF1ZGlvX21hbmFnZXJfOwotCi0gIC8vIFNpemUgb2YgZnJhbWUgaW4gYnl0ZXMuCi0gIHVpbnQzMiBieXRlc19wZXJfZnJhbWVfOwotCi0gIC8vIENhbGxiYWNrIHRvIHBhc3MgYXVkaW8gc2FtcGxlcyB0b28sIHZhbGlkIHdoaWxlIHJlY29yZGluZy4KLSAgQXVkaW9JbnB1dENhbGxiYWNrKiBjYWxsYmFja187Ci0KLSAgLy8gVGhlIGNsaWVudCB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGF1ZGlvIHNlcnZlci4KLSAgY3Jhc19jbGllbnQqIGNsaWVudF87Ci0KLSAgLy8gUENNIHBhcmFtZXRlcnMgZm9yIHRoZSBzdHJlYW0uCi0gIEF1ZGlvUGFyYW1ldGVycyBwYXJhbXNfOwotCi0gIC8vIFRydWUgaWYgdGhlIHN0cmVhbSBoYXMgYmVlbiBzdGFydGVkLgotICBib29sIHN0YXJ0ZWRfOwotCi0gIC8vIElEIG9mIHRoZSBwbGF5aW5nIHN0cmVhbS4KLSAgY3Jhc19zdHJlYW1faWRfdCBzdHJlYW1faWRfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihDcmFzSW5wdXRTdHJlYW0pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQVVESU9fTElOVVhfQUxTQV9JTlBVVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2xpbnV4L2NyYXNfaW5wdXRfdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvYXVkaW8vbGludXgvY3Jhc19pbnB1dF91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ5YTFjOC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vbGludXgvY3Jhc19pbnB1dF91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi93YWl0YWJsZV9ldmVudC5oIgotI2luY2x1ZGUgImJhc2UvdGVzdC90ZXN0X3RpbWVvdXRzLmgiCi0jaW5jbHVkZSAiYmFzZS90aW1lLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vbGludXgvYXVkaW9fbWFuYWdlcl9saW51eC5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2xpbnV4L2NyYXNfaW5wdXQuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgdGVzdGluZzo6XzsKLXVzaW5nIHRlc3Rpbmc6OkF0TGVhc3Q7Ci11c2luZyB0ZXN0aW5nOjpHZTsKLXVzaW5nIHRlc3Rpbmc6Okludm9rZVdpdGhvdXRBcmdzOwotdXNpbmcgdGVzdGluZzo6U3RyaWN0TW9jazsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgTW9ja0F1ZGlvSW5wdXRDYWxsYmFjayA6IHB1YmxpYyBBdWRpb0lucHV0U3RyZWFtOjpBdWRpb0lucHV0Q2FsbGJhY2sgewotIHB1YmxpYzoKLSAgTU9DS19NRVRIT0Q1KE9uRGF0YSwgdm9pZCgKLSAgICAgIEF1ZGlvSW5wdXRTdHJlYW0qLCBjb25zdCB1aW50OCosIHVpbnQzMiwgdWludDMyLCBkb3VibGUpKTsKLSAgTU9DS19NRVRIT0QyKE9uRXJyb3IsIHZvaWQoQXVkaW9JbnB1dFN0cmVhbSosIGludCkpOwotICBNT0NLX01FVEhPRDEoT25DbG9zZSwgdm9pZChBdWRpb0lucHV0U3RyZWFtKikpOwotfTsKLQotY2xhc3MgTW9ja0F1ZGlvTWFuYWdlckxpbnV4SW5wdXQgOiBwdWJsaWMgQXVkaW9NYW5hZ2VyTGludXggewotIHB1YmxpYzoKLSAgLy8gV2UgbmVlZCB0byBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGluIG9yZGVyIHRvIHNraXAgY2hlY2tpbmcgdGhlIG51bWJlcgotICAvLyBvZiBhY3RpdmUgb3V0cHV0IHN0cmVhbXMuIEl0IGlzIGJlY2F1c2UgdGhlIG51bWJlciBvZiBhY3RpdmUgc3RyZWFtcwotICAvLyBpcyBtYW5hZ2VkIGluc2lkZSBNYWtlQXVkaW9JbnB1dFN0cmVhbSwgYW5kIHdlIGRvbid0IHVzZQotICAvLyBNYWtlQXVkaW9JbnB1dFN0cmVhbSB0byBjcmVhdGUgdGhlIHN0cmVhbSBpbiB0aGUgdGVzdHMuCi0gIHZpcnR1YWwgdm9pZCBSZWxlYXNlSW5wdXRTdHJlYW0oQXVkaW9JbnB1dFN0cmVhbSogc3RyZWFtKSBPVkVSUklERSB7Ci0gICAgRENIRUNLKHN0cmVhbSk7Ci0gICAgZGVsZXRlIHN0cmVhbTsKLSAgfQotfTsKLQotY2xhc3MgQ3Jhc0lucHV0U3RyZWFtVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIENyYXNJbnB1dFN0cmVhbVRlc3QoKSB7Ci0gICAgbW9ja19tYW5hZ2VyXy5yZXNldChuZXcgU3RyaWN0TW9jazxNb2NrQXVkaW9NYW5hZ2VyTGludXhJbnB1dD4oKSk7Ci0gIH0KLQotICB2aXJ0dWFsIH5DcmFzSW5wdXRTdHJlYW1UZXN0KCkgewotICB9Ci0KLSAgQ3Jhc0lucHV0U3RyZWFtKiBDcmVhdGVTdHJlYW0oQ2hhbm5lbExheW91dCBsYXlvdXQpIHsKLSAgICByZXR1cm4gQ3JlYXRlU3RyZWFtKGxheW91dCwga1Rlc3RGcmFtZXNQZXJQYWNrZXQpOwotICB9Ci0KLSAgQ3Jhc0lucHV0U3RyZWFtKiBDcmVhdGVTdHJlYW0oQ2hhbm5lbExheW91dCBsYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyIHNhbXBsZXNfcGVyX3BhY2tldCkgewotICAgIEF1ZGlvUGFyYW1ldGVycyBwYXJhbXMoa1Rlc3RGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBrVGVzdFNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBrVGVzdEJpdHNQZXJTYW1wbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzX3Blcl9wYWNrZXQpOwotICAgIHJldHVybiBuZXcgQ3Jhc0lucHV0U3RyZWFtKHBhcmFtcywgbW9ja19tYW5hZ2VyXy5nZXQoKSk7Ci0gIH0KLQotICB2b2lkIENhcHR1cmVTb21lRnJhbWVzKGNvbnN0IEF1ZGlvUGFyYW1ldGVycyAmcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkdXJhdGlvbl9tcykgewotICAgIENyYXNJbnB1dFN0cmVhbSogdGVzdF9zdHJlYW0gPSBuZXcgQ3Jhc0lucHV0U3RyZWFtKHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2NrX21hbmFnZXJfLmdldCgpKTsKLQotICAgIEFTU0VSVF9UUlVFKHRlc3Rfc3RyZWFtLT5PcGVuKCkpOwotCi0gICAgLy8gQWxsb3cgOCBmcmFtZXMgdmFyaWFuY2UgZm9yIFNSQyBpbiB0aGUgY2FsbGJhY2suICBEaWZmZXJlbnQgbnVtYmVycyBvZgotICAgIC8vIHNhbXBsZXMgY2FuIGJlIHByb3ZpZGVkIHdoZW4gZG9pbmcgbm9uLWludGVnZXIgU1JDLiAgRm9yIGV4YW1wbGUKLSAgICAvLyBjb252ZXJ0aW5nIGZyb20gMTkyayB0byA0NC4xayBpcyBhIHJhdGlvIG9mIDQuMzUgdG8gMS4KLSAgICBNb2NrQXVkaW9JbnB1dENhbGxiYWNrIG1vY2tfY2FsbGJhY2s7Ci0gICAgdW5zaWduZWQgaW50IGV4cGVjdGVkX3NpemUgPSAoa1Rlc3RGcmFtZXNQZXJQYWNrZXQgLSA4KSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY2hhbm5lbHMoKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuYml0c19wZXJfc2FtcGxlKCkgLyA4OwotCi0gICAgYmFzZTo6V2FpdGFibGVFdmVudCBldmVudChmYWxzZSwgZmFsc2UpOwotCi0gICAgRVhQRUNUX0NBTEwobW9ja19jYWxsYmFjaywKLSAgICAgICAgICAgICAgICBPbkRhdGEodGVzdF9zdHJlYW0sIF8sIEdlKGV4cGVjdGVkX3NpemUpLCBfLCBfKSkKLSAgICAgICAgLldpbGxPbmNlKEludm9rZVdpdGhvdXRBcmdzKCZldmVudCwgJmJhc2U6OldhaXRhYmxlRXZlbnQ6OlNpZ25hbCkpOwotCi0gICAgdGVzdF9zdHJlYW0tPlN0YXJ0KCZtb2NrX2NhbGxiYWNrKTsKLQotICAgIC8vIFdhaXQgZm9yIHNhbXBsZXMgdG8gYmUgY2FwdHVyZWQuCi0gICAgRVhQRUNUX1RSVUUoZXZlbnQuVGltZWRXYWl0KFRlc3RUaW1lb3V0czo6YWN0aW9uX3RpbWVvdXQoKSkpOwotCi0gICAgdGVzdF9zdHJlYW0tPlN0b3AoKTsKLQotICAgIEVYUEVDVF9DQUxMKG1vY2tfY2FsbGJhY2ssIE9uQ2xvc2UodGVzdF9zdHJlYW0pKS5UaW1lcygxKTsKLSAgICB0ZXN0X3N0cmVhbS0+Q2xvc2UoKTsKLSAgfQotCi0gIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQga1Rlc3RCaXRzUGVyU2FtcGxlOwotICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGtUZXN0Q2FwdHVyZUR1cmF0aW9uTXM7Ci0gIHN0YXRpYyBjb25zdCBDaGFubmVsTGF5b3V0IGtUZXN0Q2hhbm5lbExheW91dDsKLSAgc3RhdGljIGNvbnN0IEF1ZGlvUGFyYW1ldGVyczo6Rm9ybWF0IGtUZXN0Rm9ybWF0OwotICBzdGF0aWMgY29uc3QgdWludDMyIGtUZXN0RnJhbWVzUGVyUGFja2V0OwotICBzdGF0aWMgY29uc3QgaW50IGtUZXN0U2FtcGxlUmF0ZTsKLQotICBzY29wZWRfcHRyPFN0cmljdE1vY2s8TW9ja0F1ZGlvTWFuYWdlckxpbnV4SW5wdXQ+ID4gbW9ja19tYW5hZ2VyXzsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihDcmFzSW5wdXRTdHJlYW1UZXN0KTsKLX07Ci0KLWNvbnN0IHVuc2lnbmVkIGludCBDcmFzSW5wdXRTdHJlYW1UZXN0OjprVGVzdEJpdHNQZXJTYW1wbGUgPSAxNjsKLWNvbnN0IHVuc2lnbmVkIGludCBDcmFzSW5wdXRTdHJlYW1UZXN0OjprVGVzdENhcHR1cmVEdXJhdGlvbk1zID0gMjUwOwotY29uc3QgQ2hhbm5lbExheW91dCBDcmFzSW5wdXRTdHJlYW1UZXN0OjprVGVzdENoYW5uZWxMYXlvdXQgPQotICAgIENIQU5ORUxfTEFZT1VUX1NURVJFTzsKLWNvbnN0IEF1ZGlvUGFyYW1ldGVyczo6Rm9ybWF0IENyYXNJbnB1dFN0cmVhbVRlc3Q6OmtUZXN0Rm9ybWF0ID0KLSAgICBBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVI7Ci1jb25zdCB1aW50MzIgQ3Jhc0lucHV0U3RyZWFtVGVzdDo6a1Rlc3RGcmFtZXNQZXJQYWNrZXQgPSAxMDAwOwotY29uc3QgaW50IENyYXNJbnB1dFN0cmVhbVRlc3Q6OmtUZXN0U2FtcGxlUmF0ZSA9IDQ0MTAwOwotCi1URVNUX0YoQ3Jhc0lucHV0U3RyZWFtVGVzdCwgT3Blbk1vbm8pIHsKLSAgQ3Jhc0lucHV0U3RyZWFtKiB0ZXN0X3N0cmVhbSA9IENyZWF0ZVN0cmVhbShDSEFOTkVMX0xBWU9VVF9NT05PKTsKLSAgRVhQRUNUX1RSVUUodGVzdF9zdHJlYW0tPk9wZW4oKSk7Ci0gIHRlc3Rfc3RyZWFtLT5DbG9zZSgpOwotfQotCi1URVNUX0YoQ3Jhc0lucHV0U3RyZWFtVGVzdCwgT3BlblN0ZXJlbykgewotICBDcmFzSW5wdXRTdHJlYW0qIHRlc3Rfc3RyZWFtID0gQ3JlYXRlU3RyZWFtKENIQU5ORUxfTEFZT1VUX1NURVJFTyk7Ci0gIEVYUEVDVF9UUlVFKHRlc3Rfc3RyZWFtLT5PcGVuKCkpOwotICB0ZXN0X3N0cmVhbS0+Q2xvc2UoKTsKLX0KLQotVEVTVF9GKENyYXNJbnB1dFN0cmVhbVRlc3QsIEJhZEJpdHNQZXJTYW1wbGUpIHsKLSAgQXVkaW9QYXJhbWV0ZXJzIGJhZF9icHNfcGFyYW1zKGtUZXN0Rm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1Rlc3RDaGFubmVsTGF5b3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1Rlc3RTYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1Rlc3RCaXRzUGVyU2FtcGxlIC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUZXN0RnJhbWVzUGVyUGFja2V0KTsKLSAgQ3Jhc0lucHV0U3RyZWFtKiB0ZXN0X3N0cmVhbSA9Ci0gICAgICBuZXcgQ3Jhc0lucHV0U3RyZWFtKGJhZF9icHNfcGFyYW1zLCBtb2NrX21hbmFnZXJfLmdldCgpKTsKLSAgRVhQRUNUX0ZBTFNFKHRlc3Rfc3RyZWFtLT5PcGVuKCkpOwotICB0ZXN0X3N0cmVhbS0+Q2xvc2UoKTsKLX0KLQotVEVTVF9GKENyYXNJbnB1dFN0cmVhbVRlc3QsIEJhZEZvcm1hdCkgewotICBBdWRpb1BhcmFtZXRlcnMgYmFkX2Zvcm1hdF9wYXJhbXMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19MQVNUX0ZPUk1BVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUZXN0Q2hhbm5lbExheW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUZXN0U2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUZXN0Qml0c1BlclNhbXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUZXN0RnJhbWVzUGVyUGFja2V0KTsKLSAgQ3Jhc0lucHV0U3RyZWFtKiB0ZXN0X3N0cmVhbSA9Ci0gICAgICBuZXcgQ3Jhc0lucHV0U3RyZWFtKGJhZF9mb3JtYXRfcGFyYW1zLCBtb2NrX21hbmFnZXJfLmdldCgpKTsKLSAgRVhQRUNUX0ZBTFNFKHRlc3Rfc3RyZWFtLT5PcGVuKCkpOwotICB0ZXN0X3N0cmVhbS0+Q2xvc2UoKTsKLX0KLQotVEVTVF9GKENyYXNJbnB1dFN0cmVhbVRlc3QsIEJhZFNhbXBsZVJhdGUpIHsKLSAgQXVkaW9QYXJhbWV0ZXJzIGJhZF9yYXRlX3BhcmFtcyhrVGVzdEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVGVzdENoYW5uZWxMYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVGVzdEJpdHNQZXJTYW1wbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1Rlc3RGcmFtZXNQZXJQYWNrZXQpOwotICBDcmFzSW5wdXRTdHJlYW0qIHRlc3Rfc3RyZWFtID0KLSAgICAgIG5ldyBDcmFzSW5wdXRTdHJlYW0oYmFkX3JhdGVfcGFyYW1zLCBtb2NrX21hbmFnZXJfLmdldCgpKTsKLSAgRVhQRUNUX0ZBTFNFKHRlc3Rfc3RyZWFtLT5PcGVuKCkpOwotICB0ZXN0X3N0cmVhbS0+Q2xvc2UoKTsKLX0KLQotVEVTVF9GKENyYXNJbnB1dFN0cmVhbVRlc3QsIFNldEdldFZvbHVtZSkgewotICBDcmFzSW5wdXRTdHJlYW0qIHRlc3Rfc3RyZWFtID0gQ3JlYXRlU3RyZWFtKENIQU5ORUxfTEFZT1VUX01PTk8pOwotICBFWFBFQ1RfVFJVRSh0ZXN0X3N0cmVhbS0+T3BlbigpKTsKLQotICBkb3VibGUgbWF4X3ZvbHVtZSA9IHRlc3Rfc3RyZWFtLT5HZXRNYXhWb2x1bWUoKTsKLSAgRVhQRUNUX0dFKG1heF92b2x1bWUsIDEuMCk7Ci0KLSAgdGVzdF9zdHJlYW0tPlNldFZvbHVtZShtYXhfdm9sdW1lIC8gMik7Ci0KLSAgZG91YmxlIG5ld192b2x1bWUgPSB0ZXN0X3N0cmVhbS0+R2V0Vm9sdW1lKCk7Ci0KLSAgRVhQRUNUX0dFKG5ld192b2x1bWUsIDAuMCk7Ci0gIEVYUEVDVF9MRShuZXdfdm9sdW1lLCBtYXhfdm9sdW1lKTsKLQotICB0ZXN0X3N0cmVhbS0+Q2xvc2UoKTsKLX0KLQotVEVTVF9GKENyYXNJbnB1dFN0cmVhbVRlc3QsIENhcHR1cmVGcmFtZXMpIHsKLSAgY29uc3QgdW5zaWduZWQgaW50IHJhdGVzW10gPQotICAgICAgezgwMDAsIDE2MDAwLCAyMjA1MCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCwgOTYwMDAsIDE5MjAwMH07Ci0KLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJhdGVzKTsgaSsrKSB7Ci0gICAgU0NPUEVEX1RSQUNFKHRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiTW9ubyAiIDw8IHJhdGVzW2ldIDw8ICJIeiIpOwotICAgIEF1ZGlvUGFyYW1ldGVycyBwYXJhbXNfbW9ubyhrVGVzdEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9MQVlPVVRfTU9OTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZXNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUZXN0Qml0c1BlclNhbXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1Rlc3RGcmFtZXNQZXJQYWNrZXQpOwotICAgIENhcHR1cmVTb21lRnJhbWVzKHBhcmFtc19tb25vLCBrVGVzdENhcHR1cmVEdXJhdGlvbk1zKTsKLSAgfQotCi0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgQVJSQVlfU0laRShyYXRlcyk7IGkrKykgewotICAgIFNDT1BFRF9UUkFDRSh0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgIlN0ZXJlbyAiIDw8IHJhdGVzW2ldIDw8ICJIeiIpOwotICAgIEF1ZGlvUGFyYW1ldGVycyBwYXJhbXNfc3RlcmVvKGtUZXN0Rm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTEFZT1VUX1NURVJFTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVGVzdEJpdHNQZXJTYW1wbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1Rlc3RGcmFtZXNQZXJQYWNrZXQpOwotICAgIENhcHR1cmVTb21lRnJhbWVzKHBhcmFtc19zdGVyZW8sIGtUZXN0Q2FwdHVyZUR1cmF0aW9uTXMpOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2xpbnV4L2NyYXNfb3V0cHV0LmNjIGIvc3JjL21lZGlhL2F1ZGlvL2xpbnV4L2NyYXNfb3V0cHV0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjlmZmMyLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9saW51eC9jcmFzX291dHB1dC5jYworKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotLy8KLS8vIFRoZSBvYmplY3QgaGFzIG9uZSBlcnJvciBzdGF0ZTogfHN0YXRlX3wgPT0ga0luRXJyb3IuICBXaGVuIHxzdGF0ZV98ID09Ci0vLyBrSW5FcnJvciwgYWxsIHB1YmxpYyBBUEkgZnVuY3Rpb25zIHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yIChTdGFydCgpIHdpbGwgY2FsbAotLy8gdGhlIE9uRXJyb3IoKSBmdW5jdGlvbiBvbiB0aGUgY2FsbGJhY2sgaW1tZWRpYXRlbHkpLCBvciBuby1vcCB0aGVtc2VsdmVzIHdpdGgKLS8vIHRoZSBleGNlcHRpb24gb2YgQ2xvc2UoKS4gIEV2ZW4gaWYgYW4gZXJyb3Igc3RhdGUgaGFzIGJlZW4gZW50ZXJlZCwgaWYgT3BlbigpCi0vLyBoYXMgcHJldmlvdXNseSByZXR1cm5lZCBzdWNjZXNzZnVsbHksIENsb3NlKCkgbXVzdCBiZSBjYWxsZWQuCi0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby9saW51eC9jcmFzX291dHB1dC5oIgotCi0jaW5jbHVkZSA8Y3Jhc19jbGllbnQuaD4KLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3V0aWwuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9saW51eC9hbHNhX3V0aWwuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9saW51eC9hdWRpb19tYW5hZ2VyX2xpbnV4LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIEhlbHBzIG1ha2UgbG9nIG1lc3NhZ2VzIHJlYWRhYmxlLgotc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ3Jhc091dHB1dFN0cmVhbTo6SW50ZXJuYWxTdGF0ZSBzdGF0ZSkgewotICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgY2FzZSBDcmFzT3V0cHV0U3RyZWFtOjprSW5FcnJvcjoKLSAgICAgIG9zIDw8ICJrSW5FcnJvciI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENyYXNPdXRwdXRTdHJlYW06OmtDcmVhdGVkOgotICAgICAgb3MgPDwgImtDcmVhdGVkIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ3Jhc091dHB1dFN0cmVhbTo6a0lzT3BlbmVkOgotICAgICAgb3MgPDwgImtJc09wZW5lZCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENyYXNPdXRwdXRTdHJlYW06OmtJc1BsYXlpbmc6Ci0gICAgICBvcyA8PCAia0lzUGxheWluZyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENyYXNPdXRwdXRTdHJlYW06OmtJc1N0b3BwZWQ6Ci0gICAgICBvcyA8PCAia0lzU3RvcHBlZCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENyYXNPdXRwdXRTdHJlYW06OmtJc0Nsb3NlZDoKLSAgICAgIG9zIDw8ICJrSXNDbG9zZWQiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9zIDw8ICJVbmtub3duU3RhdGUiOwotICAgICAgYnJlYWs7Ci0gIH07Ci0gIHJldHVybiBvczsKLX0KLQotLy8gT3ZlcnZpZXcgb2Ygb3BlcmF0aW9uOgotLy8gMSkgQW4gb2JqZWN0IG9mIENyYXNPdXRwdXRTdHJlYW0gaXMgY3JlYXRlZCBieSB0aGUgQXVkaW9NYW5hZ2VyCi0vLyBmYWN0b3J5OiBhdWRpb19tYW4tPk1ha2VBdWRpb1N0cmVhbSgpLgotLy8gMikgTmV4dCBzb21lIHRocmVhZCB3aWxsIGNhbGwgT3BlbigpLCBhdCB0aGF0IHBvaW50IGEgY2xpZW50IGlzIGNyZWF0ZWQgYW5kCi0vLyBjb25maWd1cmVkIGZvciB0aGUgY29ycmVjdCBmb3JtYXQgYW5kIHNhbXBsZSByYXRlLgotLy8gMykgVGhlbiBTdGFydChzb3VyY2UpIGlzIGNhbGxlZCBhbmQgYSBzdHJlYW0gaXMgYWRkZWQgdG8gdGhlIENSQVMgY2xpZW50Ci0vLyB3aGljaCB3aWxsIGNyZWF0ZSBpdHMgb3duIHRocmVhZCB0aGF0IHBlcmlvZGljYWxseSBjYWxscyB0aGUgc291cmNlIGZvciBtb3JlCi0vLyBkYXRhIGFzIGJ1ZmZlcnMgYXJlIGJlaW5nIGNvbnN1bWVkLgotLy8gNCkgV2hlbiBmaW5pc2hlZCBTdG9wKCkgaXMgY2FsbGVkLCB3aGljaCBpcyBoYW5kbGVkIGJ5IHN0b3BwaW5nIHRoZSBzdHJlYW0uCi0vLyA1KSBGaW5hbGx5IENsb3NlKCkgaXMgY2FsbGVkLiBJdCBjbGVhbnMgdXAgYW5kIG5vdGlmaWVzIHRoZSBhdWRpbyBtYW5hZ2VyLAotLy8gd2hpY2ggbGlrZWx5IHdpbGwgZGVzdHJveSB0aGlzIG9iamVjdC4KLQotQ3Jhc091dHB1dFN0cmVhbTo6Q3Jhc091dHB1dFN0cmVhbShjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NYW5hZ2VyTGludXgqIG1hbmFnZXIpCi0gICAgOiBjbGllbnRfKE5VTEwpLAotICAgICAgc3RyZWFtX2lkXygwKSwKLSAgICAgIHNhbXBsZXNfcGVyX3BhY2tldF8ocGFyYW1zLmZyYW1lc19wZXJfYnVmZmVyKCkpLAotICAgICAgYnl0ZXNfcGVyX2ZyYW1lXygwKSwKLSAgICAgIGZyYW1lX3JhdGVfKHBhcmFtcy5zYW1wbGVfcmF0ZSgpKSwKLSAgICAgIG51bV9jaGFubmVsc18ocGFyYW1zLmNoYW5uZWxzKCkpLAotICAgICAgcGNtX2Zvcm1hdF8oYWxzYV91dGlsOjpCaXRzVG9Gb3JtYXQocGFyYW1zLmJpdHNfcGVyX3NhbXBsZSgpKSksCi0gICAgICBzdGF0ZV8oa0NyZWF0ZWQpLAotICAgICAgdm9sdW1lXygxLjApLAotICAgICAgbWFuYWdlcl8obWFuYWdlciksCi0gICAgICBzb3VyY2VfY2FsbGJhY2tfKE5VTEwpLAotICAgICAgYXVkaW9fYnVzXyhBdWRpb0J1czo6Q3JlYXRlKHBhcmFtcykpIHsKLSAgLy8gV2UgbXVzdCBoYXZlIGEgbWFuYWdlci4KLSAgRENIRUNLKG1hbmFnZXJfKTsKLQotICAvLyBTYW5pdHkgY2hlY2sgaW5wdXQgdmFsdWVzLgotICBpZiAocGFyYW1zLnNhbXBsZV9yYXRlKCkgPD0gMCkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiVW5zdXBwb3J0ZWQgYXVkaW8gZnJlcXVlbmN5LiI7Ci0gICAgVHJhbnNpdGlvblRvKGtJbkVycm9yKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSICE9IHBhcmFtcy5mb3JtYXQoKSAmJgotICAgICAgQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTE9XX0xBVEVOQ1kgIT0gcGFyYW1zLmZvcm1hdCgpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJVbnN1cHBvcnRlZCBhdWRpbyBmb3JtYXQuIjsKLSAgICBUcmFuc2l0aW9uVG8oa0luRXJyb3IpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChwY21fZm9ybWF0XyA9PSBTTkRfUENNX0ZPUk1BVF9VTktOT1dOKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJVbnN1cHBvcnRlZCBiaXRzIHBlciBzYW1wbGU6ICIgPDwgcGFyYW1zLmJpdHNfcGVyX3NhbXBsZSgpOwotICAgIFRyYW5zaXRpb25UbyhrSW5FcnJvcik7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLUNyYXNPdXRwdXRTdHJlYW06On5DcmFzT3V0cHV0U3RyZWFtKCkgewotICBJbnRlcm5hbFN0YXRlIGN1cnJlbnRfc3RhdGUgPSBzdGF0ZSgpOwotICBEQ0hFQ0soY3VycmVudF9zdGF0ZSA9PSBrQ3JlYXRlZCB8fAotICAgICAgICAgY3VycmVudF9zdGF0ZSA9PSBrSXNDbG9zZWQgfHwKLSAgICAgICAgIGN1cnJlbnRfc3RhdGUgPT0ga0luRXJyb3IpOwotfQotCi1ib29sIENyYXNPdXRwdXRTdHJlYW06Ok9wZW4oKSB7Ci0gIGlmICghQ2FuVHJhbnNpdGlvblRvKGtJc09wZW5lZCkpIHsKLSAgICBOT1RSRUFDSEVEKCkgPDwgIkludmFsaWQgc3RhdGU6ICIgPDwgc3RhdGUoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBXZSBkbyBub3QgbmVlZCB0byBjaGVjayBpZiB0aGUgdHJhbnNpdGlvbiB3YXMgc3VjY2Vzc2Z1bCBiZWNhdXNlCi0gIC8vIENhblRyYW5zaXRpb25UbygpIHdhcyBjaGVja2VkIGFib3ZlLCBhbmQgaXQgaXMgYXNzdW1lZCB0aGF0IHRoaXMKLSAgLy8gb2JqZWN0J3MgcHVibGljIEFQSSBpcyBvbmx5IGNhbGxlZCBvbiBvbmUgdGhyZWFkIHNvIHRoZSBzdGF0ZSBjYW5ub3QKLSAgLy8gdHJhbnNpdGlvbiBvdXQgZnJvbSB1bmRlciB1cy4KLSAgVHJhbnNpdGlvblRvKGtJc09wZW5lZCk7Ci0KLSAgLy8gQ3JlYXRlIHRoZSBjbGllbnQgYW5kIGNvbm5lY3QgdG8gdGhlIENSQVMgc2VydmVyLgotICBpbnQgZXJyID0gY3Jhc19jbGllbnRfY3JlYXRlKCZjbGllbnRfKTsKLSAgaWYgKGVyciA8IDApIHsKLSAgICBMT0coV0FSTklORykgPDwgIkNvdWxkbid0IGNyZWF0ZSBDUkFTIGNsaWVudC5cbiI7Ci0gICAgY2xpZW50XyA9IE5VTEw7Ci0gICAgVHJhbnNpdGlvblRvKGtJbkVycm9yKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgZXJyID0gY3Jhc19jbGllbnRfY29ubmVjdChjbGllbnRfKTsKLSAgaWYgKGVycikgewotICAgIExPRyhXQVJOSU5HKSA8PCAiQ291bGRuJ3QgY29ubmVjdCBDUkFTIGNsaWVudC5cbiI7Ci0gICAgY3Jhc19jbGllbnRfZGVzdHJveShjbGllbnRfKTsKLSAgICBjbGllbnRfID0gTlVMTDsKLSAgICBUcmFuc2l0aW9uVG8oa0luRXJyb3IpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBUaGVuIHN0YXJ0IHJ1bm5pbmcgdGhlIGNsaWVudC4KLSAgZXJyID0gY3Jhc19jbGllbnRfcnVuX3RocmVhZChjbGllbnRfKTsKLSAgaWYgKGVycikgewotICAgIExPRyhXQVJOSU5HKSA8PCAiQ291bGRuJ3QgcnVuIENSQVMgY2xpZW50LlxuIjsKLSAgICBjcmFzX2NsaWVudF9kZXN0cm95KGNsaWVudF8pOwotICAgIGNsaWVudF8gPSBOVUxMOwotICAgIFRyYW5zaXRpb25UbyhrSW5FcnJvcik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQ3Jhc091dHB1dFN0cmVhbTo6Q2xvc2UoKSB7Ci0gIC8vIFNhbml0eSBDaGVjayB0aGF0IHdlIGNhbiB0cmFuc2l0aW9uIHRvIGNsb3NlZC4KLSAgaWYgKFRyYW5zaXRpb25UbyhrSXNDbG9zZWQpICE9IGtJc0Nsb3NlZCkgewotICAgIE5PVFJFQUNIRUQoKSA8PCAiVW5hYmxlIHRvIHRyYW5zaXRpb24gQ2xvc2VkLiI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGNsaWVudF8pIHsKLSAgICBjcmFzX2NsaWVudF9zdG9wKGNsaWVudF8pOwotICAgIGNyYXNfY2xpZW50X2Rlc3Ryb3koY2xpZW50Xyk7Ci0gICAgY2xpZW50XyA9IE5VTEw7Ci0gIH0KLQotICAvLyBTaWduYWwgdG8gdGhlIG1hbmFnZXIgdGhhdCB3ZSdyZSBjbG9zZWQgYW5kIGNhbiBiZSByZW1vdmVkLgotICAvLyBTaG91bGQgYmUgbGFzdCBjYWxsIGluIHRoZSBtZXRob2QgYXMgaXQgZGVsZXRlcyAidGhpcyIuCi0gIG1hbmFnZXJfLT5SZWxlYXNlT3V0cHV0U3RyZWFtKHRoaXMpOwotfQotCi12b2lkIENyYXNPdXRwdXRTdHJlYW06OlN0YXJ0KEF1ZGlvU291cmNlQ2FsbGJhY2sqIGNhbGxiYWNrKSB7Ci0gIENIRUNLKGNhbGxiYWNrKTsKLSAgc291cmNlX2NhbGxiYWNrXyA9IGNhbGxiYWNrOwotCi0gIC8vIE9ubHkgc3RhcnQgaWYgd2UgY2FuIGVudGVyIHRoZSBwbGF5aW5nIHN0YXRlLgotICBpZiAoVHJhbnNpdGlvblRvKGtJc1BsYXlpbmcpICE9IGtJc1BsYXlpbmcpCi0gICAgcmV0dXJuOwotCi0gIC8vIFByZXBhcmUgfGF1ZGlvX2Zvcm1hdHwgYW5kIHxzdHJlYW1fcGFyYW1zfCBmb3IgdGhlIHN0cmVhbSB3ZQotICAvLyB3aWxsIGNyZWF0ZS4KLSAgY3Jhc19hdWRpb19mb3JtYXQqIGF1ZGlvX2Zvcm1hdCA9IGNyYXNfYXVkaW9fZm9ybWF0X2NyZWF0ZSgKLSAgICAgIHBjbV9mb3JtYXRfLAotICAgICAgZnJhbWVfcmF0ZV8sCi0gICAgICBudW1fY2hhbm5lbHNfKTsKLSAgaWYgKGF1ZGlvX2Zvcm1hdCA9PSBOVUxMKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJFcnJvciBzZXR0aW5nIHVwIGF1ZGlvIHBhcmFtZXRlcnMuIjsKLSAgICBUcmFuc2l0aW9uVG8oa0luRXJyb3IpOwotICAgIGNhbGxiYWNrLT5PbkVycm9yKHRoaXMsIC1FTk9NRU0pOwotICAgIHJldHVybjsKLSAgfQotICBjcmFzX3N0cmVhbV9wYXJhbXMqIHN0cmVhbV9wYXJhbXMgPSBjcmFzX2NsaWVudF9zdHJlYW1fcGFyYW1zX2NyZWF0ZSgKLSAgICAgQ1JBU19TVFJFQU1fT1VUUFVULAotICAgICBzYW1wbGVzX3Blcl9wYWNrZXRfICogMiwgIC8vIFRvdGFsIGxhdGVuY3kuCi0gICAgIHNhbXBsZXNfcGVyX3BhY2tldF8gLyAyLCAgLy8gQ2FsbCBiYWNrIHdoZW4gdGhpcyBtYW55IGxlZnQuCi0gICAgIHNhbXBsZXNfcGVyX3BhY2tldF8sICAvLyBDYWxsIGJhY2sgd2l0aCBhdCBsZWFzdCB0aGlzIG11Y2ggc3BhY2UuCi0gICAgIENSQVNfU1RSRUFNX1RZUEVfREVGQVVMVCwKLSAgICAgMCwKLSAgICAgdGhpcywKLSAgICAgQ3Jhc091dHB1dFN0cmVhbTo6UHV0U2FtcGxlcywKLSAgICAgQ3Jhc091dHB1dFN0cmVhbTo6U3RyZWFtRXJyb3IsCi0gICAgIGF1ZGlvX2Zvcm1hdCk7Ci0gIGlmIChzdHJlYW1fcGFyYW1zID09IE5VTEwpIHsKLSAgICBMT0coV0FSTklORykgPDwgIkVycm9yIHNldHRpbmcgdXAgc3RyZWFtIHBhcmFtZXRlcnMuIjsKLSAgICBUcmFuc2l0aW9uVG8oa0luRXJyb3IpOwotICAgIGNhbGxiYWNrLT5PbkVycm9yKHRoaXMsIC1FTk9NRU0pOwotICAgIGNyYXNfYXVkaW9fZm9ybWF0X2Rlc3Ryb3koYXVkaW9fZm9ybWF0KTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBCZWZvcmUgc3RhcnRpbmcgdGhlIHN0cmVhbSwgc2F2ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgZnJhbWUgZm9yIHVzZSBpbgotICAvLyB0aGUgY2FsbGJhY2suCi0gIGJ5dGVzX3Blcl9mcmFtZV8gPSBjcmFzX2NsaWVudF9mb3JtYXRfYnl0ZXNfcGVyX2ZyYW1lKGF1ZGlvX2Zvcm1hdCk7Ci0KLSAgLy8gQWRkaW5nIHRoZSBzdHJlYW0gd2lsbCBzdGFydCB0aGUgYXVkaW8gY2FsbGJhY2tzIHJlcXVlc3RpbmcgZGF0YS4KLSAgaW50IGVyciA9IGNyYXNfY2xpZW50X2FkZF9zdHJlYW0oY2xpZW50XywgJnN0cmVhbV9pZF8sIHN0cmVhbV9wYXJhbXMpOwotICBpZiAoZXJyIDwgMCkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiRmFpbGVkIHRvIGFkZCB0aGUgc3RyZWFtIjsKLSAgICBUcmFuc2l0aW9uVG8oa0luRXJyb3IpOwotICAgIGNhbGxiYWNrLT5PbkVycm9yKHRoaXMsIGVycik7Ci0gICAgY3Jhc19hdWRpb19mb3JtYXRfZGVzdHJveShhdWRpb19mb3JtYXQpOwotICAgIGNyYXNfY2xpZW50X3N0cmVhbV9wYXJhbXNfZGVzdHJveShzdHJlYW1fcGFyYW1zKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBTZXQgaW5pdGlhbCB2b2x1bWUuCi0gIGNyYXNfY2xpZW50X3NldF9zdHJlYW1fdm9sdW1lKGNsaWVudF8sIHN0cmVhbV9pZF8sIHZvbHVtZV8pOwotCi0gIC8vIERvbmUgd2l0aCBjb25maWcgcGFyYW1zLgotICBjcmFzX2F1ZGlvX2Zvcm1hdF9kZXN0cm95KGF1ZGlvX2Zvcm1hdCk7Ci0gIGNyYXNfY2xpZW50X3N0cmVhbV9wYXJhbXNfZGVzdHJveShzdHJlYW1fcGFyYW1zKTsKLX0KLQotdm9pZCBDcmFzT3V0cHV0U3RyZWFtOjpTdG9wKCkgewotICBpZiAoIWNsaWVudF8pCi0gICAgcmV0dXJuOwotICAvLyBSZW1vdmluZyB0aGUgc3RyZWFtIGZyb20gdGhlIGNsaWVudCBzdG9wcyBhdWRpby4KLSAgY3Jhc19jbGllbnRfcm1fc3RyZWFtKGNsaWVudF8sIHN0cmVhbV9pZF8pOwotICBUcmFuc2l0aW9uVG8oa0lzU3RvcHBlZCk7Ci19Ci0KLXZvaWQgQ3Jhc091dHB1dFN0cmVhbTo6U2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpIHsKLSAgaWYgKCFjbGllbnRfKQotICAgIHJldHVybjsKLSAgdm9sdW1lXyA9IHN0YXRpY19jYXN0PGZsb2F0Pih2b2x1bWUpOwotICBjcmFzX2NsaWVudF9zZXRfc3RyZWFtX3ZvbHVtZShjbGllbnRfLCBzdHJlYW1faWRfLCB2b2x1bWVfKTsKLX0KLQotdm9pZCBDcmFzT3V0cHV0U3RyZWFtOjpHZXRWb2x1bWUoZG91YmxlKiB2b2x1bWUpIHsKLSAgKnZvbHVtZSA9IHZvbHVtZV87Ci19Ci0KLS8vIFN0YXRpYyBjYWxsYmFjayBhc2tpbmcgZm9yIHNhbXBsZXMuCi1pbnQgQ3Jhc091dHB1dFN0cmVhbTo6UHV0U2FtcGxlcyhjcmFzX2NsaWVudCogY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jhc19zdHJlYW1faWRfdCBzdHJlYW1faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogc2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aW1lc3BlYyogc2FtcGxlX3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYXJnKSB7Ci0gIENyYXNPdXRwdXRTdHJlYW0qIG1lID0gc3RhdGljX2Nhc3Q8Q3Jhc091dHB1dFN0cmVhbSo+KGFyZyk7Ci0gIHJldHVybiBtZS0+UmVuZGVyKGZyYW1lcywgc2FtcGxlcywgc2FtcGxlX3RzKTsKLX0KLQotLy8gU3RhdGljIGNhbGxiYWNrIGZvciBzdHJlYW0gZXJyb3JzLgotaW50IENyYXNPdXRwdXRTdHJlYW06OlN0cmVhbUVycm9yKGNyYXNfY2xpZW50KiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jhc19zdHJlYW1faWRfdCBzdHJlYW1faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhcmcpIHsKLSAgQ3Jhc091dHB1dFN0cmVhbSogbWUgPSBzdGF0aWNfY2FzdDxDcmFzT3V0cHV0U3RyZWFtKj4oYXJnKTsKLSAgbWUtPk5vdGlmeVN0cmVhbUVycm9yKGVycik7Ci0gIHJldHVybiAwOwotfQotCi0vLyBOb3RlIHRoaXMgaXMgcnVuIGZyb20gYSByZWFsIHRpbWUgdGhyZWFkLCBzbyBkb24ndCB3YXN0ZSBjeWNsZXMgaGVyZS4KLXVpbnQzMiBDcmFzT3V0cHV0U3RyZWFtOjpSZW5kZXIoc2l6ZV90IGZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltZXNwZWMqIHNhbXBsZV90cykgewotICB0aW1lc3BlYyBsYXRlbmN5X3RzICA9IHswLCAwfTsKLQotICAvLyBEZXRlcm1pbmUgbGF0ZW5jeSBhbmQgcGFzcyB0aGF0IG9uIHRvIHRoZSBzb3VyY2UuCi0gIGNyYXNfY2xpZW50X2NhbGNfcGxheWJhY2tfbGF0ZW5jeShzYW1wbGVfdHMsICZsYXRlbmN5X3RzKTsKLQotICAvLyBUcmVhdCBuZWdhdGl2ZSBsYXRlbmN5IChpZiB3ZSBhcmUgdG9vIHNsb3cgdG8gcmVuZGVyKSBhcyAwLgotICB1aW50MzIgbGF0ZW5jeV91c2VjOwotICBpZiAobGF0ZW5jeV90cy50dl9zZWMgPCAwIHx8IGxhdGVuY3lfdHMudHZfbnNlYyA8IDApIHsKLSAgICBsYXRlbmN5X3VzZWMgPSAwOwotICB9IGVsc2UgewotICAgIGxhdGVuY3lfdXNlYyA9IChsYXRlbmN5X3RzLnR2X3NlYyAqIDEwMDAwMDApICsKLSAgICAgICAgbGF0ZW5jeV90cy50dl9uc2VjIC8gMTAwMDsKLSAgfQotCi0gIHVpbnQzMiBmcmFtZXNfbGF0ZW5jeSA9IGxhdGVuY3lfdXNlYyAqIGZyYW1lX3JhdGVfIC8gMTAwMDAwMDsKLSAgdWludDMyIGJ5dGVzX2xhdGVuY3kgPSBmcmFtZXNfbGF0ZW5jeSAqIGJ5dGVzX3Blcl9mcmFtZV87Ci0gIERDSEVDS19FUShmcmFtZXMsIHN0YXRpY19jYXN0PHNpemVfdD4oYXVkaW9fYnVzXy0+ZnJhbWVzKCkpKTsKLSAgaW50IGZyYW1lc19maWxsZWQgPSBzb3VyY2VfY2FsbGJhY2tfLT5Pbk1vcmVEYXRhKAotICAgICAgYXVkaW9fYnVzXy5nZXQoKSwgQXVkaW9CdWZmZXJzU3RhdGUoMCwgYnl0ZXNfbGF0ZW5jeSkpOwotICAvLyBOb3RlOiBJZiB0aGlzIGV2ZXIgY2hhbmdlcyB0byBvdXRwdXQgcmF3IGZsb2F0IHRoZSBkYXRhIG11c3QgYmUgY2xpcHBlZCBhbmQKLSAgLy8gc2FuaXRpemVkIHNpbmNlIGl0IG1heSBjb21lIGZyb20gYW4gdW50cnVzdGVkIHNvdXJjZSBzdWNoIGFzIE5hQ2wuCi0gIGF1ZGlvX2J1c18tPlRvSW50ZXJsZWF2ZWQoCi0gICAgICBmcmFtZXNfZmlsbGVkLCBieXRlc19wZXJfZnJhbWVfIC8gbnVtX2NoYW5uZWxzXywgYnVmZmVyKTsKLSAgcmV0dXJuIGZyYW1lc19maWxsZWQ7Ci19Ci0KLXZvaWQgQ3Jhc091dHB1dFN0cmVhbTo6Tm90aWZ5U3RyZWFtRXJyb3IoaW50IGVycikgewotICAvLyBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBzdHJlYW0gZnJvbSB0aGUgY2xpZW50LgotICBpZiAoc3RhdGVfID09IGtJc0Nsb3NlZCB8fCBzdGF0ZV8gPT0ga0luRXJyb3IpCi0gICAgcmV0dXJuOyAgLy8gRG9uJ3QgY2FyZSBhYm91dCBlcnJvciBpZiB3ZSBhcmVuJ3QgdXNpbmcgaXQuCi0gIFRyYW5zaXRpb25UbyhrSW5FcnJvcik7Ci0gIGlmIChzb3VyY2VfY2FsbGJhY2tfKQotICAgIHNvdXJjZV9jYWxsYmFja18tPk9uRXJyb3IodGhpcywgZXJyKTsKLX0KLQotYm9vbCBDcmFzT3V0cHV0U3RyZWFtOjpDYW5UcmFuc2l0aW9uVG8oSW50ZXJuYWxTdGF0ZSB0bykgewotICBzd2l0Y2ggKHN0YXRlXykgewotICAgIGNhc2Uga0NyZWF0ZWQ6Ci0gICAgICByZXR1cm4gdG8gPT0ga0lzT3BlbmVkIHx8IHRvID09IGtJc0Nsb3NlZCB8fCB0byA9PSBrSW5FcnJvcjsKLQotICAgIGNhc2Uga0lzT3BlbmVkOgotICAgICAgcmV0dXJuIHRvID09IGtJc1BsYXlpbmcgfHwgdG8gPT0ga0lzU3RvcHBlZCB8fAotICAgICAgICAgIHRvID09IGtJc0Nsb3NlZCB8fCB0byA9PSBrSW5FcnJvcjsKLQotICAgIGNhc2Uga0lzUGxheWluZzoKLSAgICAgIHJldHVybiB0byA9PSBrSXNQbGF5aW5nIHx8IHRvID09IGtJc1N0b3BwZWQgfHwKLSAgICAgICAgICB0byA9PSBrSXNDbG9zZWQgfHwgdG8gPT0ga0luRXJyb3I7Ci0KLSAgICBjYXNlIGtJc1N0b3BwZWQ6Ci0gICAgICByZXR1cm4gdG8gPT0ga0lzUGxheWluZyB8fCB0byA9PSBrSXNTdG9wcGVkIHx8Ci0gICAgICAgICAgdG8gPT0ga0lzQ2xvc2VkIHx8IHRvID09IGtJbkVycm9yOwotCi0gICAgY2FzZSBrSW5FcnJvcjoKLSAgICAgIHJldHVybiB0byA9PSBrSXNDbG9zZWQgfHwgdG8gPT0ga0luRXJyb3I7Ci0KLSAgICBjYXNlIGtJc0Nsb3NlZDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLUNyYXNPdXRwdXRTdHJlYW06OkludGVybmFsU3RhdGUKLUNyYXNPdXRwdXRTdHJlYW06OlRyYW5zaXRpb25UbyhJbnRlcm5hbFN0YXRlIHRvKSB7Ci0gIGlmICghQ2FuVHJhbnNpdGlvblRvKHRvKSkgewotICAgIHN0YXRlXyA9IGtJbkVycm9yOwotICB9IGVsc2UgewotICAgIHN0YXRlXyA9IHRvOwotICB9Ci0gIHJldHVybiBzdGF0ZV87Ci19Ci0KLUNyYXNPdXRwdXRTdHJlYW06OkludGVybmFsU3RhdGUgQ3Jhc091dHB1dFN0cmVhbTo6c3RhdGUoKSB7Ci0gIHJldHVybiBzdGF0ZV87Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL2xpbnV4L2NyYXNfb3V0cHV0LmggYi9zcmMvbWVkaWEvYXVkaW8vbGludXgvY3Jhc19vdXRwdXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRmZmJjZS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vbGludXgvY3Jhc19vdXRwdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotLy8KLS8vIENyZWF0ZXMgYW4gb3V0cHV0IHN0cmVhbSBiYXNlZCBvbiB0aGUgY3JhcyAoQ2hyb21lT1MgYXVkaW8gc2VydmVyKSBpbnRlcmZhY2UuCi0vLwotLy8gQ3Jhc091dHB1dFN0cmVhbSBvYmplY3QgaXMgKm5vdCogdGhyZWFkLXNhZmUgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQKLS8vIGZyb20gdGhlIGF1ZGlvIHRocmVhZC4KLQotI2lmbmRlZiBNRURJQV9BVURJT19MSU5VWF9DUkFTX09VVFBVVF9IXwotI2RlZmluZSBNRURJQV9BVURJT19MSU5VWF9DUkFTX09VVFBVVF9IXwotCi0jaW5jbHVkZSA8YWxzYS9hc291bmRsaWIuaD4KLSNpbmNsdWRlIDxjcmFzX2NsaWVudC5oPgotI2luY2x1ZGUgPG9zdHJlYW0+Ci0KLSNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCi0jaW5jbHVkZSAiYmFzZS9ndGVzdF9wcm9kX3V0aWwuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19pby5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBBdWRpb01hbmFnZXJMaW51eDsKLWNsYXNzIEF1ZGlvUGFyYW1ldGVyczsKLQotLy8gSW1wbGVtZW50YXRpb24gb2YgQXVkaW9PdXB1dFN0cmVhbSBmb3IgQ2hyb21lIE9TIHVzaW5nIHRoZSBDaHJvbWUgT1MgYXVkaW8KLS8vIHNlcnZlci4KLWNsYXNzIE1FRElBX0VYUE9SVCBDcmFzT3V0cHV0U3RyZWFtIDogcHVibGljIEF1ZGlvT3V0cHV0U3RyZWFtIHsKLSBwdWJsaWM6Ci0gIC8vIFRoZSBjdG9yIHRha2VzIGFsbCB0aGUgdXN1YWwgcGFyYW1ldGVycywgcGx1cyB8bWFuYWdlcnwgd2hpY2ggaXMgdGhlCi0gIC8vIGF1ZGlvIG1hbmFnZXIgd2hvIGlzIGNyZWF0aW5nIHRoaXMgb2JqZWN0LgotICBDcmFzT3V0cHV0U3RyZWFtKGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLCBBdWRpb01hbmFnZXJMaW51eCogbWFuYWdlcik7Ci0KLSAgLy8gVGhlIGR0b3IgaXMgdHlwaWNhbGx5IGNhbGxlZCBieSB0aGUgQXVkaW9NYW5hZ2VyIG9ubHkgYW5kIGl0IGlzIHVzdWFsbHkKLSAgLy8gdHJpZ2dlcmVkIGJ5IGNhbGxpbmcgQXVkaW9PdXRwdXRTdHJlYW06OkNsb3NlKCkuCi0gIHZpcnR1YWwgfkNyYXNPdXRwdXRTdHJlYW0oKTsKLQotICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBBdWRpb091dHB1dFN0cmVhbS4KLSAgdmlydHVhbCBib29sIE9wZW4oKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIENsb3NlKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTdGFydChBdWRpb1NvdXJjZUNhbGxiYWNrKiBjYWxsYmFjaykgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTdG9wKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBHZXRWb2x1bWUoZG91YmxlKiB2b2x1bWUpIE9WRVJSSURFOwotCi0gIC8vIEZsYWdzIGluZGljYXRpbmcgdGhlIHN0YXRlIG9mIHRoZSBzdHJlYW0uCi0gIGVudW0gSW50ZXJuYWxTdGF0ZSB7Ci0gICAga0luRXJyb3IgPSAwLAotICAgIGtDcmVhdGVkLAotICAgIGtJc09wZW5lZCwKLSAgICBrSXNQbGF5aW5nLAotICAgIGtJc1N0b3BwZWQsCi0gICAga0lzQ2xvc2VkCi0gIH07Ci0gIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgSW50ZXJuYWxTdGF0ZSk7Ci0gIC8vIFJlcG9ydHMgdGhlIGN1cnJlbnQgc3RhdGUgZm9yIHVuaXQgdGVzdGluZy4KLSAgSW50ZXJuYWxTdGF0ZSBzdGF0ZSgpOwotCi0gcHJpdmF0ZToKLSAgLy8gSGFuZGxlcyByZXF1ZXN0cyB0byBwdXQgc2FtcGxlcyBpbiB0aGUgcHJvdmlkZWQgYnVmZmVyLiAgVGhpcyB3aWxsIGJlCi0gIC8vIGNhbGxlZCBieSB0aGUgYXVkaW8gc2VydmVyIHdoZW4gaXQgbmVlZHMgbW9yZSBkYXRhLgotICBzdGF0aWMgaW50IFB1dFNhbXBsZXMoY3Jhc19jbGllbnQqIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNyYXNfc3RyZWFtX2lkX3Qgc3RyZWFtX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltZXNwZWMqIHNhbXBsZV90cywKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGFyZyk7Ci0KLSAgLy8gSGFuZGxlcyBub3RpZmljYWl0b24gdGhhdCB0aGVyZSB3YXMgYW4gZXJyb3Igd2l0aCB0aGUgcGxheWJhY2sgc3RyZWFtLgotICBzdGF0aWMgaW50IFN0cmVhbUVycm9yKGNyYXNfY2xpZW50KiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY3Jhc19zdHJlYW1faWRfdCBzdHJlYW1faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhcmcpOwotCi0gIC8vIEFjdHVhbGx5IGZpbGxzIGJ1ZmZlciB3aXRoIGF1ZGlvIGRhdGEuICBDYWxsZWQgZnJvbSBQdXRTYW1wbGVzKCkuCi0gIHVpbnQzMiBSZW5kZXIoc2l6ZV90IGZyYW1lcywgdWludDgqIGJ1ZmZlciwgY29uc3QgdGltZXNwZWMqIHNhbXBsZV90cyk7Ci0KLSAgLy8gRGVhbHMgd2l0aCBhbiBlcnJvciB0aGF0IG9jY3VyZWQgaW4gdGhlIHN0cmVhbS4gIENhbGxlZCBmcm9tIFN0cmVhbUVycm9yKCkuCi0gIHZvaWQgTm90aWZ5U3RyZWFtRXJyb3IoaW50IGVycik7Ci0KLSAgLy8gRnVuY3Rpb25zIHRvIHNhZmVndWFyZCBzdGF0ZSB0cmFuc2l0aW9ucy4gIEFsbCBjaGFuZ2VzIHRvIHRoZSBvYmplY3Qgc3RhdGUKLSAgLy8gc2hvdWxkIGdvIHRocm91Z2ggdGhlc2UgZnVuY3Rpb25zLgotICBib29sIENhblRyYW5zaXRpb25UbyhJbnRlcm5hbFN0YXRlIHRvKTsKLSAgSW50ZXJuYWxTdGF0ZSBUcmFuc2l0aW9uVG8oSW50ZXJuYWxTdGF0ZSB0byk7Ci0KLSAgLy8gVGhlIGNsaWVudCB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGF1ZGlvIHNlcnZlci4KLSAgY3Jhc19jbGllbnQqIGNsaWVudF87Ci0KLSAgLy8gSUQgb2YgdGhlIHBsYXlpbmcgc3RyZWFtLgotICBjcmFzX3N0cmVhbV9pZF90IHN0cmVhbV9pZF87Ci0KLSAgLy8gUGFja2V0IHNpemUgaW4gc2FtcGxlcy4KLSAgdWludDMyIHNhbXBsZXNfcGVyX3BhY2tldF87Ci0KLSAgLy8gU2l6ZSBvZiBmcmFtZSBpbiBieXRlcy4KLSAgdWludDMyIGJ5dGVzX3Blcl9mcmFtZV87Ci0KLSAgLy8gUmF0ZSBpbiBIei4KLSAgc2l6ZV90IGZyYW1lX3JhdGVfOwotCi0gIC8vIE51bWJlciBvZiBjaGFubmVscy4KLSAgc2l6ZV90IG51bV9jaGFubmVsc187Ci0KLSAgLy8gUENNIGZvcm1hdCBmb3IgQWxzYS4KLSAgY29uc3Qgc25kX3BjbV9mb3JtYXRfdCBwY21fZm9ybWF0XzsKLQotICAvLyBDdXJyZW50IHN0YXRlLgotICBJbnRlcm5hbFN0YXRlIHN0YXRlXzsKLQotICAvLyBWb2x1bWUgbGV2ZWwgZnJvbSAwLjAgdG8gMS4wLgotICBmbG9hdCB2b2x1bWVfOwotCi0gIC8vIEF1ZGlvIG1hbmFnZXIgdGhhdCBjcmVhdGVkIHVzLiAgVXNlZCB0byByZXBvcnQgdGhhdCB3ZSd2ZSBiZWVuIGNsb3NlZC4KLSAgQXVkaW9NYW5hZ2VyTGludXgqIG1hbmFnZXJfOwotCi0gIC8vIENhbGxiYWNrIHRvIGdldCBhdWRpbyBzYW1wbGVzLgotICBBdWRpb1NvdXJjZUNhbGxiYWNrKiBzb3VyY2VfY2FsbGJhY2tfOwotCi0gIC8vIENvbnRhaW5lciBmb3IgcmV0cmlldmluZyBkYXRhIGZyb20gQXVkaW9Tb3VyY2VDYWxsYmFjazo6T25Nb3JlRGF0YSgpLgotICBzY29wZWRfcHRyPEF1ZGlvQnVzPiBhdWRpb19idXNfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihDcmFzT3V0cHV0U3RyZWFtKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0FVRElPX0xJTlVYX0NSQVNfT1VUUFVUX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vbGludXgvY3Jhc19vdXRwdXRfdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvYXVkaW8vbGludXgvY3Jhc19vdXRwdXRfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZTJiMjQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL2xpbnV4L2NyYXNfb3V0cHV0X3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby9saW51eC9hdWRpb19tYW5hZ2VyX2xpbnV4LmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vbGludXgvY3Jhc19vdXRwdXQuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgdGVzdGluZzo6XzsKLXVzaW5nIHRlc3Rpbmc6OkRvQWxsOwotdXNpbmcgdGVzdGluZzo6UmV0dXJuOwotdXNpbmcgdGVzdGluZzo6U2V0QXJndW1lbnRQb2ludGVlOwotdXNpbmcgdGVzdGluZzo6U3RyaWN0TW9jazsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgTW9ja0F1ZGlvU291cmNlQ2FsbGJhY2sgOiBwdWJsaWMgQXVkaW9PdXRwdXRTdHJlYW06OkF1ZGlvU291cmNlQ2FsbGJhY2sgewotIHB1YmxpYzoKLSAgTU9DS19NRVRIT0QyKE9uTW9yZURhdGEsIGludChBdWRpb0J1cyogYXVkaW9fYnVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyc1N0YXRlIGJ1ZmZlcnNfc3RhdGUpKTsKLSAgTU9DS19NRVRIT0QzKE9uTW9yZUlPRGF0YSwgaW50KEF1ZGlvQnVzKiBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1cyogZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyc1N0YXRlIGJ1ZmZlcnNfc3RhdGUpKTsKLSAgTU9DS19NRVRIT0QyKE9uRXJyb3IsIHZvaWQoQXVkaW9PdXRwdXRTdHJlYW0qIHN0cmVhbSwgaW50IGNvZGUpKTsKLX07Ci0KLWNsYXNzIE1vY2tBdWRpb01hbmFnZXJMaW51eCA6IHB1YmxpYyBBdWRpb01hbmFnZXJMaW51eCB7Ci0gcHVibGljOgotICBNT0NLX01FVEhPRDAoSW5pdCwgdm9pZCgpKTsKLSAgTU9DS19NRVRIT0QwKEhhc0F1ZGlvT3V0cHV0RGV2aWNlcywgYm9vbCgpKTsKLSAgTU9DS19NRVRIT0QwKEhhc0F1ZGlvSW5wdXREZXZpY2VzLCBib29sKCkpOwotICBNT0NLX01FVEhPRDEoTWFrZUxpbmVhck91dHB1dFN0cmVhbSwgQXVkaW9PdXRwdXRTdHJlYW0qKAotICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpKTsKLSAgTU9DS19NRVRIT0QxKE1ha2VMb3dMYXRlbmN5T3V0cHV0U3RyZWFtLCBBdWRpb091dHB1dFN0cmVhbSooCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcykpOwotICBNT0NLX01FVEhPRDIoTWFrZUxpbmVhck91dHB1dFN0cmVhbSwgQXVkaW9JbnB1dFN0cmVhbSooCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCkpOwotICBNT0NLX01FVEhPRDIoTWFrZUxvd0xhdGVuY3lJbnB1dFN0cmVhbSwgQXVkaW9JbnB1dFN0cmVhbSooCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCkpOwotCi0gIC8vIFdlIG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBpbiBvcmRlciB0byBza2lwIHRoZSBjaGVja2luZyB0aGUgbnVtYmVyCi0gIC8vIG9mIGFjdGl2ZSBvdXRwdXQgc3RyZWFtcy4gSXQgaXMgYmVjYXVzZSB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBzdHJlYW1zCi0gIC8vIGlzIG1hbmFnZWQgaW5zaWRlIE1ha2VBdWRpb091dHB1dFN0cmVhbSwgYW5kIHdlIGRvbid0IHVzZQotICAvLyBNYWtlQXVkaW9PdXRwdXRTdHJlYW0gdG8gY3JlYXRlIHRoZSBzdHJlYW0gaW4gdGhlIHRlc3RzLgotICB2aXJ0dWFsIHZvaWQgUmVsZWFzZU91dHB1dFN0cmVhbShBdWRpb091dHB1dFN0cmVhbSogc3RyZWFtKSBPVkVSUklERSB7Ci0gICAgRENIRUNLKHN0cmVhbSk7Ci0gICAgZGVsZXRlIHN0cmVhbTsKLSAgfQotCi0gIC8vIFdlIGRvbid0IG1vY2sgdGhpcyBtZXRob2Qgc2luY2UgYWxsIHRlc3RzIHdpbGwgZG8gdGhlIHNhbWUgdGhpbmcKLSAgLy8gYW5kIHVzZSB0aGUgY3VycmVudCBtZXNzYWdlIGxvb3AuCi0gIHZpcnR1YWwgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiBHZXRNZXNzYWdlTG9vcCgpIE9WRVJSSURFIHsKLSAgICByZXR1cm4gTWVzc2FnZUxvb3A6OmN1cnJlbnQoKS0+bWVzc2FnZV9sb29wX3Byb3h5KCk7Ci0gIH0KLX07Ci0KLWNsYXNzIENyYXNPdXRwdXRTdHJlYW1UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgQ3Jhc091dHB1dFN0cmVhbVRlc3QoKSB7Ci0gICAgbW9ja19tYW5hZ2VyXy5yZXNldChuZXcgU3RyaWN0TW9jazxNb2NrQXVkaW9NYW5hZ2VyTGludXg+KCkpOwotICB9Ci0KLSAgdmlydHVhbCB+Q3Jhc091dHB1dFN0cmVhbVRlc3QoKSB7Ci0gIH0KLQotICBDcmFzT3V0cHV0U3RyZWFtKiBDcmVhdGVTdHJlYW0oQ2hhbm5lbExheW91dCBsYXlvdXQpIHsKLSAgICByZXR1cm4gQ3JlYXRlU3RyZWFtKGxheW91dCwga1Rlc3RGcmFtZXNQZXJQYWNrZXQpOwotICB9Ci0KLSAgQ3Jhc091dHB1dFN0cmVhbSogQ3JlYXRlU3RyZWFtKENoYW5uZWxMYXlvdXQgbGF5b3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgc2FtcGxlc19wZXJfcGFja2V0KSB7Ci0gICAgQXVkaW9QYXJhbWV0ZXJzIHBhcmFtcyhrVGVzdEZvcm1hdCwgbGF5b3V0LCBrVGVzdFNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBrVGVzdEJpdHNQZXJTYW1wbGUsIHNhbXBsZXNfcGVyX3BhY2tldCk7Ci0gICAgcmV0dXJuIG5ldyBDcmFzT3V0cHV0U3RyZWFtKHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9ja19tYW5hZ2VyXy5nZXQoKSk7Ci0gIH0KLQotICBNb2NrQXVkaW9NYW5hZ2VyTGludXgmIG1vY2tfbWFuYWdlcigpIHsKLSAgICByZXR1cm4gKihtb2NrX21hbmFnZXJfLmdldCgpKTsKLSAgfQotCi0gIHN0YXRpYyBjb25zdCBDaGFubmVsTGF5b3V0IGtUZXN0Q2hhbm5lbExheW91dDsKLSAgc3RhdGljIGNvbnN0IGludCBrVGVzdFNhbXBsZVJhdGU7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1Rlc3RCaXRzUGVyU2FtcGxlOwotICBzdGF0aWMgY29uc3QgaW50IGtUZXN0Qnl0ZXNQZXJGcmFtZTsKLSAgc3RhdGljIGNvbnN0IEF1ZGlvUGFyYW1ldGVyczo6Rm9ybWF0IGtUZXN0Rm9ybWF0OwotICBzdGF0aWMgY29uc3QgdWludDMyIGtUZXN0RnJhbWVzUGVyUGFja2V0OwotICBzdGF0aWMgY29uc3QgdWludDMyIGtUZXN0UGFja2V0U2l6ZTsKLSAgc3RhdGljIHN0cnVjdCBjcmFzX2F1ZGlvX2Zvcm1hdCogY29uc3Qga0Zha2VBdWRpb0Zvcm1hdDsKLSAgc3RhdGljIHN0cnVjdCBjcmFzX3N0cmVhbV9wYXJhbXMqIGNvbnN0IGtGYWtlU3RyZWFtUGFyYW1zOwotICBzdGF0aWMgc3RydWN0IGNyYXNfY2xpZW50KiBjb25zdCBrRmFrZUNsaWVudDsKLQotICBzY29wZWRfcHRyPFN0cmljdE1vY2s8TW9ja0F1ZGlvTWFuYWdlckxpbnV4PiA+IG1vY2tfbWFuYWdlcl87Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQ3Jhc091dHB1dFN0cmVhbVRlc3QpOwotfTsKLQotY29uc3QgQ2hhbm5lbExheW91dCBDcmFzT3V0cHV0U3RyZWFtVGVzdDo6a1Rlc3RDaGFubmVsTGF5b3V0ID0KLSAgICBDSEFOTkVMX0xBWU9VVF9TVEVSRU87Ci1jb25zdCBpbnQgQ3Jhc091dHB1dFN0cmVhbVRlc3Q6OmtUZXN0U2FtcGxlUmF0ZSA9Ci0gICAgQXVkaW9QYXJhbWV0ZXJzOjprQXVkaW9DRFNhbXBsZVJhdGU7Ci1jb25zdCBpbnQgQ3Jhc091dHB1dFN0cmVhbVRlc3Q6OmtUZXN0Qml0c1BlclNhbXBsZSA9IDE2OwotY29uc3QgaW50IENyYXNPdXRwdXRTdHJlYW1UZXN0OjprVGVzdEJ5dGVzUGVyRnJhbWUgPQotICAgIENyYXNPdXRwdXRTdHJlYW1UZXN0OjprVGVzdEJpdHNQZXJTYW1wbGUgLyA4ICoKLSAgICBDaGFubmVsTGF5b3V0VG9DaGFubmVsQ291bnQoQ3Jhc091dHB1dFN0cmVhbVRlc3Q6OmtUZXN0Q2hhbm5lbExheW91dCk7Ci1jb25zdCBBdWRpb1BhcmFtZXRlcnM6OkZvcm1hdCBDcmFzT3V0cHV0U3RyZWFtVGVzdDo6a1Rlc3RGb3JtYXQgPQotICAgIEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xJTkVBUjsKLWNvbnN0IHVpbnQzMiBDcmFzT3V0cHV0U3RyZWFtVGVzdDo6a1Rlc3RGcmFtZXNQZXJQYWNrZXQgPSAxMDAwOwotY29uc3QgdWludDMyIENyYXNPdXRwdXRTdHJlYW1UZXN0OjprVGVzdFBhY2tldFNpemUgPQotICAgIENyYXNPdXRwdXRTdHJlYW1UZXN0OjprVGVzdEZyYW1lc1BlclBhY2tldCAqCi0gICAgQ3Jhc091dHB1dFN0cmVhbVRlc3Q6OmtUZXN0Qnl0ZXNQZXJGcmFtZTsKLXN0cnVjdCBjcmFzX2F1ZGlvX2Zvcm1hdCogY29uc3QgQ3Jhc091dHB1dFN0cmVhbVRlc3Q6OmtGYWtlQXVkaW9Gb3JtYXQgPQotICAgIHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IGNyYXNfYXVkaW9fZm9ybWF0Kj4oMSk7Ci1zdHJ1Y3QgY3Jhc19zdHJlYW1fcGFyYW1zKiBjb25zdCBDcmFzT3V0cHV0U3RyZWFtVGVzdDo6a0Zha2VTdHJlYW1QYXJhbXMgPQotICAgIHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IGNyYXNfc3RyZWFtX3BhcmFtcyo+KDEpOwotc3RydWN0IGNyYXNfY2xpZW50KiBjb25zdCBDcmFzT3V0cHV0U3RyZWFtVGVzdDo6a0Zha2VDbGllbnQgPQotICAgIHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IGNyYXNfY2xpZW50Kj4oMSk7Ci0KLVRFU1RfRihDcmFzT3V0cHV0U3RyZWFtVGVzdCwgQ29uc3RydWN0ZWRTdGF0ZSkgewotICAvLyBTaG91bGQgc3VwcG9ydCBtb25vLgotICBDcmFzT3V0cHV0U3RyZWFtKiB0ZXN0X3N0cmVhbSA9IENyZWF0ZVN0cmVhbShDSEFOTkVMX0xBWU9VVF9NT05PKTsKLSAgRVhQRUNUX0VRKENyYXNPdXRwdXRTdHJlYW06OmtDcmVhdGVkLCB0ZXN0X3N0cmVhbS0+c3RhdGUoKSk7Ci0gIHRlc3Rfc3RyZWFtLT5DbG9zZSgpOwotCi0gIC8vIFNob3VsZCBzdXBwb3J0IHN0ZXJlby4KLSAgdGVzdF9zdHJlYW0gPSBDcmVhdGVTdHJlYW0oQ0hBTk5FTF9MQVlPVVRfU1VSUk9VTkQpOwotICBFWFBFQ1RfRVEoQ3Jhc091dHB1dFN0cmVhbTo6a0NyZWF0ZWQsIHRlc3Rfc3RyZWFtLT5zdGF0ZSgpKTsKLSAgdGVzdF9zdHJlYW0tPkNsb3NlKCk7Ci0KLSAgLy8gQmFkIGJpdHMgcGVyIHNhbXBsZS4KLSAgQXVkaW9QYXJhbWV0ZXJzIGJhZF9icHNfcGFyYW1zKGtUZXN0Rm9ybWF0LCBrVGVzdENoYW5uZWxMYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVGVzdFNhbXBsZVJhdGUsIGtUZXN0Qml0c1BlclNhbXBsZSAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVGVzdEZyYW1lc1BlclBhY2tldCk7Ci0gIHRlc3Rfc3RyZWFtID0gbmV3IENyYXNPdXRwdXRTdHJlYW0oYmFkX2Jwc19wYXJhbXMsIG1vY2tfbWFuYWdlcl8uZ2V0KCkpOwotICBFWFBFQ1RfRVEoQ3Jhc091dHB1dFN0cmVhbTo6a0luRXJyb3IsIHRlc3Rfc3RyZWFtLT5zdGF0ZSgpKTsKLSAgdGVzdF9zdHJlYW0tPkNsb3NlKCk7Ci0KLSAgLy8gQmFkIGZvcm1hdC4KLSAgQXVkaW9QYXJhbWV0ZXJzIGJhZF9mb3JtYXRfcGFyYW1zKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fTEFTVF9GT1JNQVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVGVzdENoYW5uZWxMYXlvdXQsIGtUZXN0U2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUZXN0Qml0c1BlclNhbXBsZSwga1Rlc3RGcmFtZXNQZXJQYWNrZXQpOwotICB0ZXN0X3N0cmVhbSA9IG5ldyBDcmFzT3V0cHV0U3RyZWFtKGJhZF9mb3JtYXRfcGFyYW1zLCBtb2NrX21hbmFnZXJfLmdldCgpKTsKLSAgRVhQRUNUX0VRKENyYXNPdXRwdXRTdHJlYW06OmtJbkVycm9yLCB0ZXN0X3N0cmVhbS0+c3RhdGUoKSk7Ci0gIHRlc3Rfc3RyZWFtLT5DbG9zZSgpOwotCi0gIC8vIEJhZCBzYW1wbGUgcmF0ZS4KLSAgQXVkaW9QYXJhbWV0ZXJzIGJhZF9yYXRlX3BhcmFtcyhrVGVzdEZvcm1hdCwga1Rlc3RDaGFubmVsTGF5b3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGtUZXN0Qml0c1BlclNhbXBsZSwga1Rlc3RGcmFtZXNQZXJQYWNrZXQpOwotICB0ZXN0X3N0cmVhbSA9IG5ldyBDcmFzT3V0cHV0U3RyZWFtKGJhZF9yYXRlX3BhcmFtcywgbW9ja19tYW5hZ2VyXy5nZXQoKSk7Ci0gIEVYUEVDVF9FUShDcmFzT3V0cHV0U3RyZWFtOjprSW5FcnJvciwgdGVzdF9zdHJlYW0tPnN0YXRlKCkpOwotICB0ZXN0X3N0cmVhbS0+Q2xvc2UoKTsKLX0KLQotVEVTVF9GKENyYXNPdXRwdXRTdHJlYW1UZXN0LCBPcGVuQ2xvc2UpIHsKLSAgQ3Jhc091dHB1dFN0cmVhbSogdGVzdF9zdHJlYW0gPSBDcmVhdGVTdHJlYW0oQ0hBTk5FTF9MQVlPVVRfTU9OTyk7Ci0gIC8vIE9wZW4gdGhlIHN0cmVhbS4KLSAgQVNTRVJUX1RSVUUodGVzdF9zdHJlYW0tPk9wZW4oKSk7Ci0gIEVYUEVDVF9FUShDcmFzT3V0cHV0U3RyZWFtOjprSXNPcGVuZWQsIHRlc3Rfc3RyZWFtLT5zdGF0ZSgpKTsKLQotICAvLyBDbG9zZSB0aGUgc3RyZWFtLgotICB0ZXN0X3N0cmVhbS0+Q2xvc2UoKTsKLX0KLQotVEVTVF9GKENyYXNPdXRwdXRTdHJlYW1UZXN0LCBTdGFydEZhaWxCZWZvcmVPcGVuKSB7Ci0gIENyYXNPdXRwdXRTdHJlYW0qIHRlc3Rfc3RyZWFtID0gQ3JlYXRlU3RyZWFtKENIQU5ORUxfTEFZT1VUX01PTk8pOwotICBNb2NrQXVkaW9Tb3VyY2VDYWxsYmFjayBtb2NrX2NhbGxiYWNrOwotCi0gIHRlc3Rfc3RyZWFtLT5TdGFydCgmbW9ja19jYWxsYmFjayk7Ci0gIEVYUEVDVF9FUShDcmFzT3V0cHV0U3RyZWFtOjprSW5FcnJvciwgdGVzdF9zdHJlYW0tPnN0YXRlKCkpOwotfQotCi1URVNUX0YoQ3Jhc091dHB1dFN0cmVhbVRlc3QsIFN0YXJ0U3RvcCkgewotICBDcmFzT3V0cHV0U3RyZWFtKiB0ZXN0X3N0cmVhbSA9IENyZWF0ZVN0cmVhbShDSEFOTkVMX0xBWU9VVF9NT05PKTsKLSAgTW9ja0F1ZGlvU291cmNlQ2FsbGJhY2sgbW9ja19jYWxsYmFjazsKLQotICAvLyBPcGVuIHRoZSBzdHJlYW0uCi0gIEFTU0VSVF9UUlVFKHRlc3Rfc3RyZWFtLT5PcGVuKCkpOwotICBFWFBFQ1RfRVEoQ3Jhc091dHB1dFN0cmVhbTo6a0lzT3BlbmVkLCB0ZXN0X3N0cmVhbS0+c3RhdGUoKSk7Ci0KLSAgLy8gU3RhcnQuCi0gIHRlc3Rfc3RyZWFtLT5TdGFydCgmbW9ja19jYWxsYmFjayk7Ci0gIEVYUEVDVF9FUShDcmFzT3V0cHV0U3RyZWFtOjprSXNQbGF5aW5nLCB0ZXN0X3N0cmVhbS0+c3RhdGUoKSk7Ci0KLSAgLy8gU3RvcC4KLSAgdGVzdF9zdHJlYW0tPlN0b3AoKTsKLSAgRVhQRUNUX0VRKENyYXNPdXRwdXRTdHJlYW06OmtJc1N0b3BwZWQsIHRlc3Rfc3RyZWFtLT5zdGF0ZSgpKTsKLQotICAvLyBDbG9zZSB0aGUgc3RyZWFtLgotICB0ZXN0X3N0cmVhbS0+Q2xvc2UoKTsKLX0KLQotVEVTVF9GKENyYXNPdXRwdXRTdHJlYW1UZXN0LCBSZW5kZXJGcmFtZXMpIHsKLSAgQ3Jhc091dHB1dFN0cmVhbSogdGVzdF9zdHJlYW0gPSBDcmVhdGVTdHJlYW0oQ0hBTk5FTF9MQVlPVVRfTU9OTyk7Ci0gIE1vY2tBdWRpb1NvdXJjZUNhbGxiYWNrIG1vY2tfY2FsbGJhY2s7Ci0KLSAgLy8gT3BlbiB0aGUgc3RyZWFtLgotICBBU1NFUlRfVFJVRSh0ZXN0X3N0cmVhbS0+T3BlbigpKTsKLSAgRVhQRUNUX0VRKENyYXNPdXRwdXRTdHJlYW06OmtJc09wZW5lZCwgdGVzdF9zdHJlYW0tPnN0YXRlKCkpOwotCi0gIC8vIFJlbmRlciBDYWxsYmFjay4KLSAgRVhQRUNUX0NBTEwobW9ja19jYWxsYmFjaywgT25Nb3JlRGF0YShfLCBfKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oa1Rlc3RGcmFtZXNQZXJQYWNrZXQpKTsKLQotICAvLyBTdGFydC4KLSAgdGVzdF9zdHJlYW0tPlN0YXJ0KCZtb2NrX2NhbGxiYWNrKTsKLSAgRVhQRUNUX0VRKENyYXNPdXRwdXRTdHJlYW06OmtJc1BsYXlpbmcsIHRlc3Rfc3RyZWFtLT5zdGF0ZSgpKTsKLQotICAvLyBTdG9wLgotICB0ZXN0X3N0cmVhbS0+U3RvcCgpOwotICBFWFBFQ1RfRVEoQ3Jhc091dHB1dFN0cmVhbTo6a0lzU3RvcHBlZCwgdGVzdF9zdHJlYW0tPnN0YXRlKCkpOwotCi0gIC8vIENsb3NlIHRoZSBzdHJlYW0uCi0gIHRlc3Rfc3RyZWFtLT5DbG9zZSgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9tYWMvYXVkaW9faW5wdXRfbWFjLmNjIGIvc3JjL21lZGlhL2F1ZGlvL21hYy9hdWRpb19pbnB1dF9tYWMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NDFiMjkuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL21hYy9hdWRpb19pbnB1dF9tYWMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL21hYy9hdWRpb19pbnB1dF9tYWMuaCIKLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvbWFjL21hY19sb2dnaW5nLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fbWFuYWdlcl9iYXNlLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fdXRpbC5oIgotCi0jaWYgIWRlZmluZWQoT1NfSU9TKQotI2luY2x1ZGUgPENvcmVTZXJ2aWNlcy9Db3JlU2VydmljZXMuaD4KLSNlbmRpZgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1QQ01RdWV1ZUluQXVkaW9JbnB1dFN0cmVhbTo6UENNUXVldWVJbkF1ZGlvSW5wdXRTdHJlYW0oCi0gICAgQXVkaW9NYW5hZ2VyQmFzZSogbWFuYWdlciwgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpCi0gICAgOiBtYW5hZ2VyXyhtYW5hZ2VyKSwKLSAgICAgIGNhbGxiYWNrXyhOVUxMKSwKLSAgICAgIGF1ZGlvX3F1ZXVlXyhOVUxMKSwKLSAgICAgIGJ1ZmZlcl9zaXplX2J5dGVzXygwKSwKLSAgICAgIHN0YXJ0ZWRfKGZhbHNlKSB7Ci0gIC8vIFdlIG11c3QgaGF2ZSBhIG1hbmFnZXIuCi0gIERDSEVDSyhtYW5hZ2VyXyk7Ci0gIC8vIEEgZnJhbWUgaXMgb25lIHNhbXBsZSBhY3Jvc3MgYWxsIGNoYW5uZWxzLiBJbiBpbnRlcmxlYXZlZCBhdWRpbyB0aGUgcGVyCi0gIC8vIGZyYW1lIGZpZWxkcyBpZGVudGlmeSB0aGUgc2V0IG9mIG4gfGNoYW5uZWxzfC4gSW4gdW5jb21wcmVzc2VkIGF1ZGlvLCBhCi0gIC8vIHBhY2tldCBpcyBhbHdheXMgb25lIGZyYW1lLgotICBmb3JtYXRfLm1TYW1wbGVSYXRlID0gcGFyYW1zLnNhbXBsZV9yYXRlKCk7Ci0gIGZvcm1hdF8ubUZvcm1hdElEID0ga0F1ZGlvRm9ybWF0TGluZWFyUENNOwotICBmb3JtYXRfLm1Gb3JtYXRGbGFncyA9IGtMaW5lYXJQQ01Gb3JtYXRGbGFnSXNQYWNrZWQgfAotICAgICAgICAgICAgICAgICAgICAgICAgIGtMaW5lYXJQQ01Gb3JtYXRGbGFnSXNTaWduZWRJbnRlZ2VyOwotICBmb3JtYXRfLm1CaXRzUGVyQ2hhbm5lbCA9IHBhcmFtcy5iaXRzX3Blcl9zYW1wbGUoKTsKLSAgZm9ybWF0Xy5tQ2hhbm5lbHNQZXJGcmFtZSA9IHBhcmFtcy5jaGFubmVscygpOwotICBmb3JtYXRfLm1GcmFtZXNQZXJQYWNrZXQgPSAxOwotICBmb3JtYXRfLm1CeXRlc1BlclBhY2tldCA9IChwYXJhbXMuYml0c19wZXJfc2FtcGxlKCkgKiBwYXJhbXMuY2hhbm5lbHMoKSkgLyA4OwotICBmb3JtYXRfLm1CeXRlc1BlckZyYW1lID0gZm9ybWF0Xy5tQnl0ZXNQZXJQYWNrZXQ7Ci0gIGZvcm1hdF8ubVJlc2VydmVkID0gMDsKLQotICBidWZmZXJfc2l6ZV9ieXRlc18gPSBwYXJhbXMuR2V0Qnl0ZXNQZXJCdWZmZXIoKTsKLX0KLQotUENNUXVldWVJbkF1ZGlvSW5wdXRTdHJlYW06On5QQ01RdWV1ZUluQXVkaW9JbnB1dFN0cmVhbSgpIHsKLSAgRENIRUNLKCFjYWxsYmFja18pOwotICBEQ0hFQ0soIWF1ZGlvX3F1ZXVlXyk7Ci19Ci0KLWJvb2wgUENNUXVldWVJbkF1ZGlvSW5wdXRTdHJlYW06Ok9wZW4oKSB7Ci0gIE9TU3RhdHVzIGVyciA9IEF1ZGlvUXVldWVOZXdJbnB1dCgmZm9ybWF0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIYW5kbGVJbnB1dEJ1ZmZlclN0YXRpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgLy8gVXNlIE9TIENGUnVuTG9vcCBmb3IgfGNhbGxiYWNrfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGUnVuTG9vcENvbW1vbk1vZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIC8vIFJlc2VydmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXVkaW9fcXVldWVfKTsKLSAgaWYgKGVyciAhPSBub0VycikgewotICAgIEhhbmRsZUVycm9yKGVycik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiBTZXR1cEJ1ZmZlcnMoKTsKLX0KLQotdm9pZCBQQ01RdWV1ZUluQXVkaW9JbnB1dFN0cmVhbTo6U3RhcnQoQXVkaW9JbnB1dENhbGxiYWNrKiBjYWxsYmFjaykgewotICBEQ0hFQ0soY2FsbGJhY2spOwotICBETE9HX0lGKEVSUk9SLCAhYXVkaW9fcXVldWVfKSA8PCAiT3BlbigpIGhhcyBub3QgYmVlbiBjYWxsZWQgc3VjY2Vzc2Z1bGx5IjsKLSAgaWYgKGNhbGxiYWNrXyB8fCAhYXVkaW9fcXVldWVfKQotICAgIHJldHVybjsKLSAgY2FsbGJhY2tfID0gY2FsbGJhY2s7Ci0gIE9TU3RhdHVzIGVyciA9IEF1ZGlvUXVldWVTdGFydChhdWRpb19xdWV1ZV8sIE5VTEwpOwotICBpZiAoZXJyICE9IG5vRXJyKSB7Ci0gICAgSGFuZGxlRXJyb3IoZXJyKTsKLSAgfSBlbHNlIHsKLSAgICBzdGFydGVkXyA9IHRydWU7Ci0gICAgbWFuYWdlcl8tPkluY3JlYXNlQWN0aXZlSW5wdXRTdHJlYW1Db3VudCgpOwotICB9Ci19Ci0KLXZvaWQgUENNUXVldWVJbkF1ZGlvSW5wdXRTdHJlYW06OlN0b3AoKSB7Ci0gIGlmICghYXVkaW9fcXVldWVfIHx8ICFzdGFydGVkXykKLSAgICByZXR1cm47Ci0KLSAgLy8gU3RvcCBpcyBhbHdheXMgY2FsbGVkIGJlZm9yZSBDbG9zZS4gSW4gY2FzZSBvZiBlcnJvciwgdGhpcyB3aWxsIGJlCi0gIC8vIGFsc28gY2FsbGVkIHdoZW4gY2xvc2luZyB0aGUgaW5wdXQgY29udHJvbGxlci4KLSAgbWFuYWdlcl8tPkRlY3JlYXNlQWN0aXZlSW5wdXRTdHJlYW1Db3VudCgpOwotCi0gIC8vIFdlIHJlcXVlc3QgYSBzeW5jaHJvbm91cyBzdG9wLCBzbyB0aGUgbmV4dCBjYWxsIGNhbiB0YWtlIHNvbWUgdGltZS4gSW4KLSAgLy8gdGhlIHdpbmRvd3MgaW1wbGVtZW50YXRpb24gd2UgYmxvY2sgaGVyZSBhcyB3ZWxsLgotICBPU1N0YXR1cyBlcnIgPSBBdWRpb1F1ZXVlU3RvcChhdWRpb19xdWV1ZV8sIHRydWUpOwotICBpZiAoZXJyICE9IG5vRXJyKQotICAgIEhhbmRsZUVycm9yKGVycik7Ci0KLSAgc3RhcnRlZF8gPSBmYWxzZTsKLX0KLQotdm9pZCBQQ01RdWV1ZUluQXVkaW9JbnB1dFN0cmVhbTo6Q2xvc2UoKSB7Ci0gIC8vIEl0IGlzIHZhbGlkIHRvIGNhbGwgQ2xvc2UoKSBiZWZvcmUgY2FsbGluZyBPcGVuKCkgb3IgU3RhcnQoKSwgdGh1cwotICAvLyB8YXVkaW9fcXVldWVffCBhbmQgfGNhbGxiYWNrX3wgbWlnaHQgYmUgTlVMTC4KLSAgaWYgKGF1ZGlvX3F1ZXVlXykgewotICAgIE9TU3RhdHVzIGVyciA9IEF1ZGlvUXVldWVEaXNwb3NlKGF1ZGlvX3F1ZXVlXywgdHJ1ZSk7Ci0gICAgYXVkaW9fcXVldWVfID0gTlVMTDsKLSAgICBpZiAoZXJyICE9IG5vRXJyKQotICAgICAgSGFuZGxlRXJyb3IoZXJyKTsKLSAgfQotICBpZiAoY2FsbGJhY2tfKSB7Ci0gICAgY2FsbGJhY2tfLT5PbkNsb3NlKHRoaXMpOwotICAgIGNhbGxiYWNrXyA9IE5VTEw7Ci0gIH0KLSAgbWFuYWdlcl8tPlJlbGVhc2VJbnB1dFN0cmVhbSh0aGlzKTsKLSAgLy8gQ0FSRTogVGhpcyBvYmplY3QgbWF5IG5vdyBiZSBkZXN0cm95ZWQuCi19Ci0KLWRvdWJsZSBQQ01RdWV1ZUluQXVkaW9JbnB1dFN0cmVhbTo6R2V0TWF4Vm9sdW1lKCkgewotICBOT1RSRUFDSEVEKCkgPDwgIk9ubHkgc3VwcG9ydGVkIGZvciBsb3ctbGF0ZW5jeSBtb2RlLiI7Ci0gIHJldHVybiAwLjA7Ci19Ci0KLXZvaWQgUENNUXVldWVJbkF1ZGlvSW5wdXRTdHJlYW06OlNldFZvbHVtZShkb3VibGUgdm9sdW1lKSB7Ci0gIE5PVFJFQUNIRUQoKSA8PCAiT25seSBzdXBwb3J0ZWQgZm9yIGxvdy1sYXRlbmN5IG1vZGUuIjsKLX0KLQotZG91YmxlIFBDTVF1ZXVlSW5BdWRpb0lucHV0U3RyZWFtOjpHZXRWb2x1bWUoKSB7Ci0gIE5PVFJFQUNIRUQoKSA8PCAiT25seSBzdXBwb3J0ZWQgZm9yIGxvdy1sYXRlbmN5IG1vZGUuIjsKLSAgcmV0dXJuIDAuMDsKLX0KLQotdm9pZCBQQ01RdWV1ZUluQXVkaW9JbnB1dFN0cmVhbTo6U2V0QXV0b21hdGljR2FpbkNvbnRyb2woYm9vbCBlbmFibGVkKSB7Ci0gIE5PVFJFQUNIRUQoKSA8PCAiT25seSBzdXBwb3J0ZWQgZm9yIGxvdy1sYXRlbmN5IG1vZGUuIjsKLX0KLQotYm9vbCBQQ01RdWV1ZUluQXVkaW9JbnB1dFN0cmVhbTo6R2V0QXV0b21hdGljR2FpbkNvbnRyb2woKSB7Ci0gIE5PVFJFQUNIRUQoKSA8PCAiT25seSBzdXBwb3J0ZWQgZm9yIGxvdy1sYXRlbmN5IG1vZGUuIjsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFBDTVF1ZXVlSW5BdWRpb0lucHV0U3RyZWFtOjpIYW5kbGVFcnJvcihPU1N0YXR1cyBlcnIpIHsKLSAgaWYgKGNhbGxiYWNrXykKLSAgICBjYWxsYmFja18tPk9uRXJyb3IodGhpcywgc3RhdGljX2Nhc3Q8aW50PihlcnIpKTsKLSAgLy8gVGhpcyBwb2ludCBzaG91bGQgbmV2ZXIgYmUgcmVhY2hlZC4KLSAgT1NTVEFUVVNfRENIRUNLKDAsIGVycik7Ci19Ci0KLWJvb2wgUENNUXVldWVJbkF1ZGlvSW5wdXRTdHJlYW06OlNldHVwQnVmZmVycygpIHsKLSAgRENIRUNLKGJ1ZmZlcl9zaXplX2J5dGVzXyk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwga051bWJlckJ1ZmZlcnM7ICsraSkgewotICAgIEF1ZGlvUXVldWVCdWZmZXJSZWYgYnVmZmVyOwotICAgIE9TU3RhdHVzIGVyciA9IEF1ZGlvUXVldWVBbGxvY2F0ZUJ1ZmZlcihhdWRpb19xdWV1ZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9zaXplX2J5dGVzXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcik7Ci0gICAgaWYgKGVyciA9PSBub0VycikKLSAgICAgIGVyciA9IFF1ZXVlTmV4dEJ1ZmZlcihidWZmZXIpOwotICAgIGlmIChlcnIgIT0gbm9FcnIpIHsKLSAgICAgIEhhbmRsZUVycm9yKGVycik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIC8vIHxidWZmZXJ8IHdpbGwgYXV0b21hdGljYWxseSBiZSBmcmVlZCB3aGVuIHxhdWRpb19xdWV1ZV98IGlzIHJlbGVhc2VkLgotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1PU1N0YXR1cyBQQ01RdWV1ZUluQXVkaW9JbnB1dFN0cmVhbTo6UXVldWVOZXh0QnVmZmVyKAotICAgIEF1ZGlvUXVldWVCdWZmZXJSZWYgYXVkaW9fYnVmZmVyKSB7Ci0gIC8vIE9ubHkgdGhlIGZpcnN0IDIgcGFyYW1zIGFyZSBuZWVkZWQgZm9yIHJlY29yZGluZy4KLSAgcmV0dXJuIEF1ZGlvUXVldWVFbnF1ZXVlQnVmZmVyKGF1ZGlvX3F1ZXVlXywgYXVkaW9fYnVmZmVyLCAwLCBOVUxMKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIFBDTVF1ZXVlSW5BdWRpb0lucHV0U3RyZWFtOjpIYW5kbGVJbnB1dEJ1ZmZlclN0YXRpYygKLSAgICB2b2lkKiBkYXRhLAotICAgIEF1ZGlvUXVldWVSZWYgYXVkaW9fcXVldWUsCi0gICAgQXVkaW9RdWV1ZUJ1ZmZlclJlZiBhdWRpb19idWZmZXIsCi0gICAgY29uc3QgQXVkaW9UaW1lU3RhbXAqIHN0YXJ0X3RpbWUsCi0gICAgVUludDMyIG51bV9wYWNrZXRzLAotICAgIGNvbnN0IEF1ZGlvU3RyZWFtUGFja2V0RGVzY3JpcHRpb24qIGRlc2MpIHsKLSAgcmVpbnRlcnByZXRfY2FzdDxQQ01RdWV1ZUluQXVkaW9JbnB1dFN0cmVhbSo+KGRhdGEpLT4KLSAgICAgIEhhbmRsZUlucHV0QnVmZmVyKGF1ZGlvX3F1ZXVlLCBhdWRpb19idWZmZXIsIHN0YXJ0X3RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1fcGFja2V0cywgZGVzYyk7Ci19Ci0KLXZvaWQgUENNUXVldWVJbkF1ZGlvSW5wdXRTdHJlYW06OkhhbmRsZUlucHV0QnVmZmVyKAotICAgIEF1ZGlvUXVldWVSZWYgYXVkaW9fcXVldWUsCi0gICAgQXVkaW9RdWV1ZUJ1ZmZlclJlZiBhdWRpb19idWZmZXIsCi0gICAgY29uc3QgQXVkaW9UaW1lU3RhbXAqIHN0YXJ0X3RpbWUsCi0gICAgVUludDMyIG51bV9wYWNrZXRzLAotICAgIGNvbnN0IEF1ZGlvU3RyZWFtUGFja2V0RGVzY3JpcHRpb24qIHBhY2tldF9kZXNjKSB7Ci0gIERDSEVDS19FUShhdWRpb19xdWV1ZV8sIGF1ZGlvX3F1ZXVlKTsKLSAgRENIRUNLKGF1ZGlvX2J1ZmZlci0+bUF1ZGlvRGF0YSk7Ci0gIGlmICghY2FsbGJhY2tfKSB7Ci0gICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIFN0b3AoKSB3YXMgY2FsbGVkIHdpdGhvdXQgc3RhcnQuCi0gICAgRENIRUNLX0VRKDBVLCBhdWRpb19idWZmZXItPm1BdWRpb0RhdGFCeXRlU2l6ZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGF1ZGlvX2J1ZmZlci0+bUF1ZGlvRGF0YUJ5dGVTaXplKSB7Ci0gICAgLy8gVGhlIEF1ZGlvUXVldWUgQVBJIG1heSB1c2UgYSBsYXJnZSBpbnRlcm5hbCBidWZmZXIgYW5kIHJlcGVhdGVkbHkgY2FsbCB1cwotICAgIC8vIGJhY2sgdG8gYmFjayBvbmNlIHRoYXQgaW50ZXJuYWwgYnVmZmVyIGlzIGZpbGxlZC4gIFdoZW4gdGhpcyBoYXBwZW5zIHRoZQotICAgIC8vIHJlbmRlcmVyIGNsaWVudCBkb2VzIG5vdCBoYXZlIGVub3VnaCB0aW1lIHRvIHJlYWQgZGF0YSBiYWNrIGZyb20gdGhlCi0gICAgLy8gc2hhcmVkIG1lbW9yeSBiZWZvcmUgdGhlIG5leHQgd3JpdGUgY29tZXMgYWxvbmcuICBJZiBIYW5kbGVJbnB1dEJ1ZmZlcigpCi0gICAgLy8gaXMgY2FsbGVkIHRvbyBmcmVxdWVudGx5LCBTbGVlcCgpIGF0IGxlYXN0IDVtcyB0byBlbnN1cmUgdGhlIHNoYXJlZAotICAgIC8vIG1lbW9yeSBkb2Vzbid0IGdldCB0cmFtcGxlZC4KLSAgICAvLyBUT0RPKGRhbGVjdXJ0aXMpOiBUaGlzIGlzIGEgSEFDSy4gIExvbmcgdGVybSB0aGUgQXVkaW9RdWV1ZSBwYXRoIGlzIGdvaW5nCi0gICAgLy8gYXdheSBpbiBmYXZvciBvZiB0aGUgQXVkaW9Vbml0IGJhc2VkIEFVQXVkaW9JbnB1dFN0cmVhbSgpLiAgVHJhY2tlZCBieQotICAgIC8vIGh0dHA6Ly9jcmJ1Zy5jb20vMTYxMzgzLgotICAgIGJhc2U6OlRpbWVEZWx0YSBlbGFwc2VkID0gYmFzZTo6VGltZTo6Tm93KCkgLSBsYXN0X2ZpbGxfOwotICAgIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSBrTWluRGVsYXkgPSBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoNSk7Ci0gICAgaWYgKGVsYXBzZWQgPCBrTWluRGVsYXkpCi0gICAgICBiYXNlOjpQbGF0Zm9ybVRocmVhZDo6U2xlZXAoa01pbkRlbGF5IC0gZWxhcHNlZCk7Ci0KLSAgICBjYWxsYmFja18tPk9uRGF0YSh0aGlzLAotICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihhdWRpb19idWZmZXItPm1BdWRpb0RhdGEpLAotICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlci0+bUF1ZGlvRGF0YUJ5dGVTaXplLAotICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlci0+bUF1ZGlvRGF0YUJ5dGVTaXplLAotICAgICAgICAgICAgICAgICAgICAgIDAuMCk7Ci0KLSAgICBsYXN0X2ZpbGxfID0gYmFzZTo6VGltZTo6Tm93KCk7Ci0gIH0KLSAgLy8gUmVjeWNsZSB0aGUgYnVmZmVyLgotICBPU1N0YXR1cyBlcnIgPSBRdWV1ZU5leHRCdWZmZXIoYXVkaW9fYnVmZmVyKTsKLSAgaWYgKGVyciAhPSBub0VycikgewotICAgIGlmIChlcnIgPT0ga0F1ZGlvUXVldWVFcnJfRW5xdWV1ZUR1cmluZ1Jlc2V0KSB7Ci0gICAgICAvLyBUaGlzIGlzIHRoZSBlcnJvciB5b3UgZ2V0IGlmIHlvdSB0cnkgdG8gZW5xdWV1ZSBhIGJ1ZmZlciBhbmQgdGhlCi0gICAgICAvLyBxdWV1ZSBoYXMgYmVlbiBjbG9zZWQuIE5vdCByZWFsbHkgYSBwcm9ibGVtIGlmIGluZGVlZCB0aGUgcXVldWUKLSAgICAgIC8vIGhhcyBiZWVuIGNsb3NlZC4KLSAgICAgIC8vIFRPRE8oam90aCk6IFBDTVF1ZXVlT3V0QXVkaW9PdXRwdXRTdHJlYW0gdXNlcyBjYWxsYmFja18gdG8gcHJvdmlkZSBhbgotICAgICAgLy8gZXh0cmEgZ3VhcmQgZm9yIHRoaXMgc2l0dWF0aW9uLCBidXQgaXQgc2VlbXMgdG8gaW50cm9kdWNlIG1vcmUKLSAgICAgIC8vIGNvbXBsaWNhdGlvbnMgdGhhbiBpdCBzb2x2ZXMgKG1lbW9yeSBiYXJyaWVyIGlzc3VlcyBhY2Nlc3NpbmcgaXQgZnJvbQotICAgICAgLy8gbXVsdGlwbGUgdGhyZWFkcywgbG9vc2VzIHRoZSBtZWFucyB0byBpbmRpY2F0ZSBPbkNsb3NlZCB0byBjbGllbnQpLgotICAgICAgLy8gU2hvdWxkIGRldGVybWluZSBpZiB3ZSBuZWVkIHRvIGRvIHNvbWV0aGluZyBlcXVpdmFsZW50IGhlcmUuCi0gICAgICByZXR1cm47Ci0gICAgfQotICAgIEhhbmRsZUVycm9yKGVycik7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vbWFjL2F1ZGlvX2lucHV0X21hYy5oIGIvc3JjL21lZGlhL2F1ZGlvL21hYy9hdWRpb19pbnB1dF9tYWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY5ODU2Zi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vbWFjL2F1ZGlvX2lucHV0X21hYy5oCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9BVURJT19NQUNfQVVESU9fSU5QVVRfTUFDX0hfCi0jZGVmaW5lIE1FRElBX0FVRElPX01BQ19BVURJT19JTlBVVF9NQUNfSF8KLQotI2luY2x1ZGUgPEF1ZGlvVG9vbGJveC9BdWRpb1F1ZXVlLmg+Ci0jaW5jbHVkZSA8QXVkaW9Ub29sYm94L0F1ZGlvRm9ybWF0Lmg+Ci0KLSNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCi0jaW5jbHVkZSAiYmFzZS90aW1lLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9faW8uaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19wYXJhbWV0ZXJzLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIEF1ZGlvTWFuYWdlckJhc2U7Ci0KLS8vIEltcGxlbWVudGF0aW9uIG9mIEF1ZGlvSW5wdXRTdHJlYW0gZm9yIE1hYyBPUyBYIHVzaW5nIHRoZSBhdWRpbyBxdWV1ZSBzZXJ2aWNlCi0vLyBwcmVzZW50IGluIE9TIDEwLjUgYW5kIGxhdGVyLiBEZXNpZ24gcmVmbGVjdHMgUENNUXVldWVPdXRBdWRpb091dHB1dFN0cmVhbS4KLWNsYXNzIFBDTVF1ZXVlSW5BdWRpb0lucHV0U3RyZWFtIDogcHVibGljIEF1ZGlvSW5wdXRTdHJlYW0gewotIHB1YmxpYzoKLSAgLy8gUGFyYW1ldGVycyBhcyBwZXIgQXVkaW9NYW5hZ2VyOjpNYWtlQXVkaW9JbnB1dFN0cmVhbS4KLSAgUENNUXVldWVJbkF1ZGlvSW5wdXRTdHJlYW0oQXVkaW9NYW5hZ2VyQmFzZSogbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpOwotICB2aXJ0dWFsIH5QQ01RdWV1ZUluQXVkaW9JbnB1dFN0cmVhbSgpOwotCi0gIC8vIEltcGxlbWVudGF0aW9uIG9mIEF1ZGlvSW5wdXRTdHJlYW0uCi0gIHZpcnR1YWwgYm9vbCBPcGVuKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTdGFydChBdWRpb0lucHV0Q2FsbGJhY2sqIGNhbGxiYWNrKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0b3AoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIENsb3NlKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgZG91YmxlIEdldE1heFZvbHVtZSgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpIE9WRVJSSURFOwotICB2aXJ0dWFsIGRvdWJsZSBHZXRWb2x1bWUoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFNldEF1dG9tYXRpY0dhaW5Db250cm9sKGJvb2wgZW5hYmxlZCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgYm9vbCBHZXRBdXRvbWF0aWNHYWluQ29udHJvbCgpIE9WRVJSSURFOwotCi0gcHJpdmF0ZToKLSAgLy8gSXNzdWUgdGhlIE9uRXJyb3IgdG8gfGNhbGxiYWNrX3w7Ci0gIHZvaWQgSGFuZGxlRXJyb3IoT1NTdGF0dXMgZXJyKTsKLQotICAvLyBBbGxvY2F0ZXMgYW5kIHByZXBhcmVzIHRoZSBtZW1vcnkgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHJlY29yZGluZy4KLSAgYm9vbCBTZXR1cEJ1ZmZlcnMoKTsKLQotICAvLyBTZW5kcyBhIGJ1ZmZlciB0byB0aGUgYXVkaW8gZHJpdmVyIGZvciByZWNvcmRpbmcuCi0gIE9TU3RhdHVzIFF1ZXVlTmV4dEJ1ZmZlcihBdWRpb1F1ZXVlQnVmZmVyUmVmIGF1ZGlvX2J1ZmZlcik7Ci0KLSAgLy8gQ2FsbGJhY2sgZnJvbSBPUywgZGVsZWdhdGVzIHRvIG5vbi1zdGF0aWMgdmVyc2lvbiBiZWxvdy4KLSAgc3RhdGljIHZvaWQgSGFuZGxlSW5wdXRCdWZmZXJTdGF0aWMoCi0gICAgICB2b2lkKiBkYXRhLAotICAgICAgQXVkaW9RdWV1ZVJlZiBhdWRpb19xdWV1ZSwKLSAgICAgIEF1ZGlvUXVldWVCdWZmZXJSZWYgYXVkaW9fYnVmZmVyLAotICAgICAgY29uc3QgQXVkaW9UaW1lU3RhbXAqIHN0YXJ0X3RpbWUsCi0gICAgICBVSW50MzIgbnVtX3BhY2tldHMsCi0gICAgICBjb25zdCBBdWRpb1N0cmVhbVBhY2tldERlc2NyaXB0aW9uKiBkZXNjKTsKLQotICAvLyBIYW5kbGVzIGNhbGxiYWNrIGZyb20gT1MuIFdpbGwgYmUgY2FsbGVkIG9uIE9TIGludGVybmFsIHRocmVhZC4KLSAgdm9pZCBIYW5kbGVJbnB1dEJ1ZmZlcihBdWRpb1F1ZXVlUmVmIGF1ZGlvX3F1ZXVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUXVldWVCdWZmZXJSZWYgYXVkaW9fYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvVGltZVN0YW1wKiBzdGFydF90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBudW1fcGFja2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1N0cmVhbVBhY2tldERlc2NyaXB0aW9uKiBwYWNrZXRfZGVzYyk7Ci0KLSAgc3RhdGljIGNvbnN0IGludCBrTnVtYmVyQnVmZmVycyA9IDM7Ci0KLSAgLy8gTWFuYWdlciB0aGF0IG93bnMgdGhpcyBzdHJlYW0sIHVzZWQgZm9yIGNsb3NpbmcgZG93bi4KLSAgQXVkaW9NYW5hZ2VyQmFzZSogbWFuYWdlcl87Ci0gIC8vIFdlIHVzZSB0aGUgY2FsbGJhY2sgbW9zdGx5IHRvIHBlcmlvZGljYWxseSBzdXBwbHkgdGhlIHJlY29yZGVkIGF1ZGlvIGRhdGEuCi0gIEF1ZGlvSW5wdXRDYWxsYmFjayogY2FsbGJhY2tfOwotICAvLyBTdHJ1Y3R1cmUgdGhhdCBob2xkcyB0aGUgc3RyZWFtIGZvcm1hdCBkZXRhaWxzIHN1Y2ggYXMgYml0cmF0ZS4KLSAgQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uIGZvcm1hdF87Ci0gIC8vIEhhbmRsZSB0byB0aGUgT1MgYXVkaW8gcXVldWUgb2JqZWN0LgotICBBdWRpb1F1ZXVlUmVmIGF1ZGlvX3F1ZXVlXzsKLSAgLy8gU2l6ZSBvZiBlYWNoIG9mIHRoZSBidWZmZXJzIGluIHxhdWRpb19idWZmZXJzX3wKLSAgdWludDMyIGJ1ZmZlcl9zaXplX2J5dGVzXzsKLSAgLy8gVHJ1ZSBpZmYgU3RhcnQoKSBoYXMgYmVlbiBjYWxsZWQgc3VjY2Vzc2Z1bGx5LgotICBib29sIHN0YXJ0ZWRfOwotICAvLyBVc2VkIHRvIGRldGVybWluZSBpZiB3ZSBuZWVkIHRvIHNsb3cgZG93biB8Y2FsbGJhY2tffCBjYWxscy4KLSAgYmFzZTo6VGltZSBsYXN0X2ZpbGxfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihQQ01RdWV1ZUluQXVkaW9JbnB1dFN0cmVhbSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9BVURJT19NQUNfQVVESU9fSU5QVVRfTUFDX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vbWFjL2F1ZGlvX2xvd19sYXRlbmN5X2lucHV0X21hYy5jYyBiL3NyYy9tZWRpYS9hdWRpby9tYWMvYXVkaW9fbG93X2xhdGVuY3lfaW5wdXRfbWFjLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWVlZjFmLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9tYWMvYXVkaW9fbG93X2xhdGVuY3lfaW5wdXRfbWFjLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjU2ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby9tYWMvYXVkaW9fbG93X2xhdGVuY3lfaW5wdXRfbWFjLmgiCi0KLSNpbmNsdWRlIDxDb3JlU2VydmljZXMvQ29yZVNlcnZpY2VzLmg+Ci0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL21hYy9tYWNfbG9nZ2luZy5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3V0aWwuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9tYWMvYXVkaW9fbWFuYWdlcl9tYWMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RhdGFfYnVmZmVyLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLXN0YXRpYyBjb25zdCBpbnQga01pbkludGVydmFsQmV0d2VlblZvbHVtZVVwZGF0ZXNNcyA9IDEwMDA7Ci0KLXN0YXRpYyBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uJiBmb3JtYXQpIHsKLSAgb3MgPDwgInNhbXBsZSByYXRlICAgICAgIDogIiA8PCBmb3JtYXQubVNhbXBsZVJhdGUgPDwgc3RkOjplbmRsCi0gICAgIDw8ICJmb3JtYXQgSUQgICAgICAgICA6ICIgPDwgZm9ybWF0Lm1Gb3JtYXRJRCA8PCBzdGQ6OmVuZGwKLSAgICAgPDwgImZvcm1hdCBmbGFncyAgICAgIDogIiA8PCBmb3JtYXQubUZvcm1hdEZsYWdzIDw8IHN0ZDo6ZW5kbAotICAgICA8PCAiYnl0ZXMgcGVyIHBhY2tldCAgOiAiIDw8IGZvcm1hdC5tQnl0ZXNQZXJQYWNrZXQgPDwgc3RkOjplbmRsCi0gICAgIDw8ICJmcmFtZXMgcGVyIHBhY2tldCA6ICIgPDwgZm9ybWF0Lm1GcmFtZXNQZXJQYWNrZXQgPDwgc3RkOjplbmRsCi0gICAgIDw8ICJieXRlcyBwZXIgZnJhbWUgICA6ICIgPDwgZm9ybWF0Lm1CeXRlc1BlckZyYW1lIDw8IHN0ZDo6ZW5kbAotICAgICA8PCAiY2hhbm5lbHMgcGVyIGZyYW1lOiAiIDw8IGZvcm1hdC5tQ2hhbm5lbHNQZXJGcmFtZSA8PCBzdGQ6OmVuZGwKLSAgICAgPDwgImJpdHMgcGVyIGNoYW5uZWwgIDogIiA8PCBmb3JtYXQubUJpdHNQZXJDaGFubmVsOwotICByZXR1cm4gb3M7Ci19Ci0KLS8vIFNlZSAiVGVjaG5pY2FsIE5vdGUgVE4yMDkxIC0gRGV2aWNlIGlucHV0IHVzaW5nIHRoZSBIQUwgT3V0cHV0IEF1ZGlvIFVuaXQiCi0vLyBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9saWJyYXJ5L21hYy8jdGVjaG5vdGVzL3RuMjA5MS9faW5kZXguaHRtbAotLy8gZm9yIG1vcmUgZGV0YWlscyBhbmQgYmFja2dyb3VuZCByZWdhcmRpbmcgdGhpcyBpbXBsZW1lbnRhdGlvbi4KLQotQVVBdWRpb0lucHV0U3RyZWFtOjpBVUF1ZGlvSW5wdXRTdHJlYW0oCi0gICAgQXVkaW9NYW5hZ2VyTWFjKiBtYW5hZ2VyLCBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywKLSAgICBBdWRpb0RldmljZUlEIGF1ZGlvX2RldmljZV9pZCkKLSAgICA6IG1hbmFnZXJfKG1hbmFnZXIpLAotICAgICAgc2lua18oTlVMTCksCi0gICAgICBhdWRpb191bml0XygwKSwKLSAgICAgIGlucHV0X2RldmljZV9pZF8oYXVkaW9fZGV2aWNlX2lkKSwKLSAgICAgIHN0YXJ0ZWRfKGZhbHNlKSwKLSAgICAgIGhhcmR3YXJlX2xhdGVuY3lfZnJhbWVzXygwKSwKLSAgICAgIG51bWJlcl9vZl9jaGFubmVsc19pbl9mcmFtZV8oMCkgewotICBEQ0hFQ0sobWFuYWdlcl8pOwotCi0gIC8vIFNldCB1cCB0aGUgZGVzaXJlZCAob3V0cHV0KSBmb3JtYXQgc3BlY2lmaWVkIGJ5IHRoZSBjbGllbnQuCi0gIGZvcm1hdF8ubVNhbXBsZVJhdGUgPSBwYXJhbXMuc2FtcGxlX3JhdGUoKTsKLSAgZm9ybWF0Xy5tRm9ybWF0SUQgPSBrQXVkaW9Gb3JtYXRMaW5lYXJQQ007Ci0gIGZvcm1hdF8ubUZvcm1hdEZsYWdzID0ga0xpbmVhclBDTUZvcm1hdEZsYWdJc1BhY2tlZCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAga0xpbmVhclBDTUZvcm1hdEZsYWdJc1NpZ25lZEludGVnZXI7Ci0gIGZvcm1hdF8ubUJpdHNQZXJDaGFubmVsID0gcGFyYW1zLmJpdHNfcGVyX3NhbXBsZSgpOwotICBmb3JtYXRfLm1DaGFubmVsc1BlckZyYW1lID0gcGFyYW1zLmNoYW5uZWxzKCk7Ci0gIGZvcm1hdF8ubUZyYW1lc1BlclBhY2tldCA9IDE7ICAvLyB1bmNvbXByZXNzZWQgYXVkaW8KLSAgZm9ybWF0Xy5tQnl0ZXNQZXJQYWNrZXQgPSAoZm9ybWF0Xy5tQml0c1BlckNoYW5uZWwgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY2hhbm5lbHMoKSkgLyA4OwotICBmb3JtYXRfLm1CeXRlc1BlckZyYW1lID0gZm9ybWF0Xy5tQnl0ZXNQZXJQYWNrZXQ7Ci0gIGZvcm1hdF8ubVJlc2VydmVkID0gMDsKLQotICBEVkxPRygxKSA8PCAiRGVzaXJlZCBvdXB1dCBmb3JtYXQ6ICIgPDwgZm9ybWF0XzsKLQotICAvLyBTZXQgbnVtYmVyIG9mIHNhbXBsZSBmcmFtZXMgcGVyIGNhbGxiYWNrIHVzZWQgYnkgdGhlIGludGVybmFsIGF1ZGlvIGxheWVyLgotICAvLyBBbiBpbnRlcm5hbCBGSUZPIGlzIHRoZW4gdXRpbGl6ZWQgdG8gYWRhcHQgdGhlIGludGVybmFsIHNpemUgdG8gdGhlIHNpemUKLSAgLy8gcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuCi0gIC8vIE5vdGUgdGhhdCB3ZSAgdXNlIHRoZSBzYW1lIG5hdGl2ZSBidWZmZXIgc2l6ZSBhcyBmb3IgdGhlIG91dHB1dCBzaWRlIGhlcmUKLSAgLy8gc2luY2UgdGhlIEFVSEFMIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRoYXQgYm90aCBjYXB0dXJlIGFuZCByZW5kZXIgc2lkZQotICAvLyB1c2UgdGhlIHNhbWUgYnVmZmVyIHNpemUuIFNlZSBodHRwOi8vY3JidWcuY29tLzE1NDM1MiBmb3IgbW9yZSBkZXRhaWxzLgotICBudW1iZXJfb2ZfZnJhbWVzXyA9IEdldEF1ZGlvSGFyZHdhcmVCdWZmZXJTaXplKCk7Ci0gIERWTE9HKDEpIDw8ICJTaXplIG9mIGRhdGEgYnVmZmVyIGluIGZyYW1lcyA6ICIgPDwgbnVtYmVyX29mX2ZyYW1lc187Ci0KLSAgLy8gRGVyaXZlIHNpemUgKGluIGJ5dGVzKSBvZiB0aGUgYnVmZmVycyB0aGF0IHdlIHdpbGwgcmVuZGVyIHRvLgotICBVSW50MzIgZGF0YV9ieXRlX3NpemUgPSBudW1iZXJfb2ZfZnJhbWVzXyAqIGZvcm1hdF8ubUJ5dGVzUGVyRnJhbWU7Ci0gIERWTE9HKDEpIDw8ICJTaXplIG9mIGRhdGEgYnVmZmVyIGluIGJ5dGVzIDogIiA8PCBkYXRhX2J5dGVfc2l6ZTsKLQotICAvLyBBbGxvY2F0ZSBBdWRpb0J1ZmZlcnMgdG8gYmUgdXNlZCBhcyBzdG9yYWdlIGZvciB0aGUgcmVjZWl2ZWQgYXVkaW8uCi0gIC8vIFRoZSBBdWRpb0J1ZmZlckxpc3Qgc3RydWN0dXJlIHdvcmtzIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHRoZQotICAvLyBBdWRpb0J1ZmZlciBzdHJ1Y3R1cmUsIHdoaWNoIGhvbGRzIGEgcG9pbnRlciB0byB0aGUgYWN0dWFsIGRhdGEgYnVmZmVyLgotICBhdWRpb19kYXRhX2J1ZmZlcl8ucmVzZXQobmV3IHVpbnQ4W2RhdGFfYnl0ZV9zaXplXSk7Ci0gIGF1ZGlvX2J1ZmZlcl9saXN0Xy5tTnVtYmVyQnVmZmVycyA9IDE7Ci0KLSAgQXVkaW9CdWZmZXIqIGF1ZGlvX2J1ZmZlciA9IGF1ZGlvX2J1ZmZlcl9saXN0Xy5tQnVmZmVyczsKLSAgYXVkaW9fYnVmZmVyLT5tTnVtYmVyQ2hhbm5lbHMgPSBwYXJhbXMuY2hhbm5lbHMoKTsKLSAgYXVkaW9fYnVmZmVyLT5tRGF0YUJ5dGVTaXplID0gZGF0YV9ieXRlX3NpemU7Ci0gIGF1ZGlvX2J1ZmZlci0+bURhdGEgPSBhdWRpb19kYXRhX2J1ZmZlcl8uZ2V0KCk7Ci0KLSAgLy8gU2V0IHVwIGFuIGludGVybmFsIEZJRk8gYnVmZmVyIHRoYXQgd2lsbCBhY2N1bXVsYXRlIHJlY29yZGVkIGF1ZGlvIGZyYW1lcwotICAvLyB1bnRpbCBhIHJlcXVlc3RlZCBzaXplIGlzIHJlYWR5IHRvIGJlIHNlbnQgdG8gdGhlIGNsaWVudC4KLSAgLy8gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGFzayBmb3IgbGVzcyB0aGFuIHxrQXVkaW9GcmFtZXNQZXJDYWxsYmFja3wgbnVtYmVyIG9mCi0gIC8vIGF1ZGlvIGZyYW1lcy4KLSAgY29uc3Qgc2l6ZV90IHJlcXVlc3RlZF9zaXplX2ZyYW1lcyA9Ci0gICAgICBwYXJhbXMuR2V0Qnl0ZXNQZXJCdWZmZXIoKSAvIGZvcm1hdF8ubUJ5dGVzUGVyUGFja2V0OwotICBEQ0hFQ0tfR0UocmVxdWVzdGVkX3NpemVfZnJhbWVzLCBudW1iZXJfb2ZfZnJhbWVzXyk7Ci0gIHJlcXVlc3RlZF9zaXplX2J5dGVzXyA9IHJlcXVlc3RlZF9zaXplX2ZyYW1lcyAqIGZvcm1hdF8ubUJ5dGVzUGVyRnJhbWU7Ci0gIERWTE9HKDEpIDw8ICJSZXF1ZXN0ZWQgYnVmZmVyIHNpemUgaW4gYnl0ZXMgOiAiIDw8IHJlcXVlc3RlZF9zaXplX2J5dGVzXzsKLSAgRExPR19JRihJTkZPLCByZXF1ZXN0ZWRfc2l6ZV9mcmFtZXMgPiBudW1iZXJfb2ZfZnJhbWVzXykgPDwgIkZJRk8gaXMgdXNlZCI7Ci0KLSAgLy8gQWxsb2NhdGUgc29tZSBleHRyYSBtZW1vcnkgdG8gYXZvaWQgbWVtb3J5IHJlYWxsb2NhdGlvbnMuCi0gIC8vIEVuc3VyZSB0aGF0IHRoZSBzaXplIGlzIGFuIGV2ZW4gbXVsdGlwbGUgb2YgfG51bWJlcl9vZl9mcmFtZXNfIGFuZAotICAvLyBsYXJnZXIgdGhhbiB8cmVxdWVzdGVkX3NpemVfZnJhbWVzfC4KLSAgLy8gRXhhbXBsZTogbnVtYmVyX29mX2ZyYW1lc189MTI4LCByZXF1ZXN0ZWRfc2l6ZV9mcmFtZXM9NDgwID0+Ci0gIC8vIGFsbG9jYXRlZCBzcGFjZSBlcXVhbHMgNCoxMjg9NTEyIGF1ZGlvIGZyYW1lcwotICBjb25zdCBpbnQgbWF4X2ZvcndhcmRfY2FwYWNpdHkgPSBmb3JtYXRfLm1CeXRlc1BlckZyYW1lICogbnVtYmVyX29mX2ZyYW1lc18gKgotICAgICAgKChyZXF1ZXN0ZWRfc2l6ZV9mcmFtZXMgLyBudW1iZXJfb2ZfZnJhbWVzXykgKyAxKTsKLSAgZmlmb18ucmVzZXQobmV3IG1lZGlhOjpTZWVrYWJsZUJ1ZmZlcigwLCBtYXhfZm9yd2FyZF9jYXBhY2l0eSkpOwotCi0gIGRhdGFfID0gbmV3IG1lZGlhOjpEYXRhQnVmZmVyKHJlcXVlc3RlZF9zaXplX2J5dGVzXyk7Ci19Ci0KLUFVQXVkaW9JbnB1dFN0cmVhbTo6fkFVQXVkaW9JbnB1dFN0cmVhbSgpIHt9Ci0KLS8vIE9idGFpbiBhbmQgb3BlbiB0aGUgQVVIQUwgQXVkaW9PdXRwdXRVbml0IGZvciByZWNvcmRpbmcuCi1ib29sIEFVQXVkaW9JbnB1dFN0cmVhbTo6T3BlbigpIHsKLSAgLy8gVmVyaWZ5IHRoYXQgd2UgYXJlIG5vdCBhbHJlYWR5IG9wZW5lZC4KLSAgaWYgKGF1ZGlvX3VuaXRfKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvLyBWZXJpZnkgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgZGV2aWNlLgotICBpZiAoaW5wdXRfZGV2aWNlX2lkXyA9PSBrQXVkaW9PYmplY3RVbmtub3duKSB7Ci0gICAgTk9UUkVBQ0hFRCgpIDw8ICJEZXZpY2UgSUQgaXMgdW5rbm93biI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gU3RhcnQgYnkgb2J0YWluaW5nIGFuIEF1ZGlvT3VwdXRVbml0IHVzaW5nIGFuIEFVSEFMIGNvbXBvbmVudCBkZXNjcmlwdGlvbi4KLQotICBDb21wb25lbnQgY29tcDsKLSAgQ29tcG9uZW50RGVzY3JpcHRpb24gZGVzYzsKLQotICAvLyBEZXNjcmlwdGlvbiBmb3IgdGhlIEF1ZGlvIFVuaXQgd2Ugd2FudCB0byB1c2UgKEFVSEFMIGluIHRoaXMgY2FzZSkuCi0gIGRlc2MuY29tcG9uZW50VHlwZSA9IGtBdWRpb1VuaXRUeXBlX091dHB1dDsKLSAgZGVzYy5jb21wb25lbnRTdWJUeXBlID0ga0F1ZGlvVW5pdFN1YlR5cGVfSEFMT3V0cHV0OwotICBkZXNjLmNvbXBvbmVudE1hbnVmYWN0dXJlciA9IGtBdWRpb1VuaXRNYW51ZmFjdHVyZXJfQXBwbGU7Ci0gIGRlc2MuY29tcG9uZW50RmxhZ3MgPSAwOwotICBkZXNjLmNvbXBvbmVudEZsYWdzTWFzayA9IDA7Ci0gIGNvbXAgPSBGaW5kTmV4dENvbXBvbmVudCgwLCAmZGVzYyk7Ci0gIERDSEVDSyhjb21wKTsKLQotICAvLyBHZXQgYWNjZXNzIHRvIHRoZSBzZXJ2aWNlIHByb3ZpZGVkIGJ5IHRoZSBzcGVjaWZpZWQgQXVkaW8gVW5pdC4KLSAgT1NTdGF0dXMgcmVzdWx0ID0gT3BlbkFDb21wb25lbnQoY29tcCwgJmF1ZGlvX3VuaXRfKTsKLSAgaWYgKHJlc3VsdCkgewotICAgIEhhbmRsZUVycm9yKHJlc3VsdCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gRW5hYmxlIElPIG9uIHRoZSBpbnB1dCBzY29wZSBvZiB0aGUgQXVkaW8gVW5pdC4KLQotICAvLyBBZnRlciBjcmVhdGluZyB0aGUgQVVIQUwgb2JqZWN0LCB3ZSBtdXN0IGVuYWJsZSBJTyBvbiB0aGUgaW5wdXQgc2NvcGUKLSAgLy8gb2YgdGhlIEF1ZGlvIFVuaXQgdG8gb2J0YWluIHRoZSBkZXZpY2UgaW5wdXQuIElucHV0IG11c3QgYmUgZXhwbGljaXRseQotICAvLyBlbmFibGVkIHdpdGggdGhlIGtBdWRpb091dHB1dFVuaXRQcm9wZXJ0eV9FbmFibGVJTyBwcm9wZXJ0eSBvbiBFbGVtZW50IDEKLSAgLy8gb2YgdGhlIEFVSEFMLiBCZWFjYXVzZSB0aGUgQVVIQUwgY2FuIGJlIHVzZWQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCwKLSAgLy8gd2UgbXVzdCBhbHNvIGRpc2FibGUgSU8gb24gdGhlIG91dHB1dCBzY29wZS4KLQotICBVSW50MzIgZW5hYmxlSU8gPSAxOwotCi0gIC8vIEVuYWJsZSBpbnB1dCBvbiB0aGUgQVVIQUwuCi0gIHJlc3VsdCA9IEF1ZGlvVW5pdFNldFByb3BlcnR5KGF1ZGlvX3VuaXRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9PdXRwdXRVbml0UHJvcGVydHlfRW5hYmxlSU8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBdWRpb1VuaXRTY29wZV9JbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgICAgICAgICAgLy8gaW5wdXQgZWxlbWVudCAxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVJTywgIC8vIGVuYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZW5hYmxlSU8pKTsKLSAgaWYgKHJlc3VsdCkgewotICAgIEhhbmRsZUVycm9yKHJlc3VsdCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gRGlzYWJsZSBvdXRwdXQgb24gdGhlIEFVSEFMLgotICBlbmFibGVJTyA9IDA7Ci0gIHJlc3VsdCA9IEF1ZGlvVW5pdFNldFByb3BlcnR5KGF1ZGlvX3VuaXRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9PdXRwdXRVbml0UHJvcGVydHlfRW5hYmxlSU8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBdWRpb1VuaXRTY29wZV9PdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgIC8vIG91dHB1dCBlbGVtZW50IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZUlPLCAgLy8gZGlzYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZW5hYmxlSU8pKTsKLSAgaWYgKHJlc3VsdCkgewotICAgIEhhbmRsZUVycm9yKHJlc3VsdCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gTmV4dCwgc2V0IHRoZSBhdWRpbyBkZXZpY2UgdG8gYmUgdGhlIEF1ZGlvIFVuaXQncyBjdXJyZW50IGRldmljZS4KLSAgLy8gTm90ZSB0aGF0LCBkZXZpY2VzIGNhbiBvbmx5IGJlIHNldCB0byB0aGUgQVVIQUwgYWZ0ZXIgZW5hYmxpbmcgSU8uCi0gIHJlc3VsdCA9IEF1ZGlvVW5pdFNldFByb3BlcnR5KGF1ZGlvX3VuaXRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9PdXRwdXRVbml0UHJvcGVydHlfQ3VycmVudERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0F1ZGlvVW5pdFNjb3BlX0dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0X2RldmljZV9pZF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnB1dF9kZXZpY2VfaWRfKSk7Ci0gIGlmIChyZXN1bHQpIHsKLSAgICBIYW5kbGVFcnJvcihyZXN1bHQpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFJlZ2lzdGVyIHRoZSBpbnB1dCBwcm9jZWR1cmUgZm9yIHRoZSBBVUhBTC4KLSAgLy8gVGhpcyBwcm9jZWR1cmUgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgQVVIQUwgaGFzIHJlY2VpdmVkIG5ldyBkYXRhCi0gIC8vIGZyb20gdGhlIGlucHV0IGRldmljZS4KLSAgQVVSZW5kZXJDYWxsYmFja1N0cnVjdCBjYWxsYmFjazsKLSAgY2FsbGJhY2suaW5wdXRQcm9jID0gSW5wdXRQcm9jOwotICBjYWxsYmFjay5pbnB1dFByb2NSZWZDb24gPSB0aGlzOwotICByZXN1bHQgPSBBdWRpb1VuaXRTZXRQcm9wZXJ0eShhdWRpb191bml0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0F1ZGlvT3V0cHV0VW5pdFByb3BlcnR5X1NldElucHV0Q2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBdWRpb1VuaXRTY29wZV9HbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNhbGxiYWNrKSk7Ci0gIGlmIChyZXN1bHQpIHsKLSAgICBIYW5kbGVFcnJvcihyZXN1bHQpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFNldCB1cCB0aGUgdGhlIGRlc2lyZWQgKG91dHB1dCkgZm9ybWF0LgotICAvLyBGb3Igb2J0YWluaW5nIGlucHV0IGZyb20gYSBkZXZpY2UsIHRoZSBkZXZpY2UgZm9ybWF0IGlzIGFsd2F5cyBleHByZXNzZWQKLSAgLy8gb24gdGhlIG91dHB1dCBzY29wZSBvZiB0aGUgQVVIQUwncyBFbGVtZW50IDEuCi0gIHJlc3VsdCA9IEF1ZGlvVW5pdFNldFByb3BlcnR5KGF1ZGlvX3VuaXRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9Vbml0UHJvcGVydHlfU3RyZWFtRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9Vbml0U2NvcGVfT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZvcm1hdF8pKTsKLSAgaWYgKHJlc3VsdCkgewotICAgIEhhbmRsZUVycm9yKHJlc3VsdCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gU2V0IHRoZSBkZXNpcmVkIG51bWJlciBvZiBmcmFtZXMgaW4gdGhlIElPIGJ1ZmZlciAob3V0cHV0IHNjb3BlKS4KLSAgLy8gV0FSTklORzogU2V0dGluZyB0aGlzIHZhbHVlIGNoYW5nZXMgdGhlIGZyYW1lIHNpemUgZm9yIGFsbCBhdWRpbyB1bml0cyBpbgotICAvLyB0aGUgY3VycmVudCBwcm9jZXNzLiAgSXQncyBpbXBlcmF0aXZlIHRoYXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgZnJhbWUgc2l6ZXMKLSAgLy8gYmUgdGhlIHNhbWUgYXMgYXVkaW9fdXRpbDo6R2V0QXVkaW9IYXJkd2FyZUJ1ZmZlclNpemUoKS4KLSAgLy8gVE9ETyhoZW5yaWthKTogRHVlIHRvIGh0dHA6Ly9jcnJldi5jb20vMTU5NjY2IHRoaXMgaXMgY3VycmVudGx5IG5vdCB0cnVlCi0gIC8vIGFuZCBzaG91bGQgYmUgZml4ZWQsIGEgQ0hFQ0soKSBzaG91bGQgYmUgYWRkZWQgYXQgdGhhdCB0aW1lLgotICByZXN1bHQgPSBBdWRpb1VuaXRTZXRQcm9wZXJ0eShhdWRpb191bml0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0F1ZGlvRGV2aWNlUHJvcGVydHlCdWZmZXJGcmFtZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBdWRpb1VuaXRTY29wZV9PdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1iZXJfb2ZfZnJhbWVzXywgIC8vIHNpemUgaXMgc2V0IGluIHRoZSBjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihudW1iZXJfb2ZfZnJhbWVzXykpOwotICBpZiAocmVzdWx0KSB7Ci0gICAgSGFuZGxlRXJyb3IocmVzdWx0KTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBGaW5hbGx5LCBpbml0aWFsaXplIHRoZSBhdWRpbyB1bml0IGFuZCBlbnN1cmUgdGhhdCBpdCBpcyByZWFkeSB0byByZW5kZXIuCi0gIC8vIEFsbG9jYXRlcyBtZW1vcnkgYWNjb3JkaW5nIHRvIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhdWRpbyBmcmFtZXMKLSAgLy8gaXQgY2FuIHByb2R1Y2UgaW4gcmVzcG9uc2UgdG8gYSBzaW5nbGUgcmVuZGVyIGNhbGwuCi0gIHJlc3VsdCA9IEF1ZGlvVW5pdEluaXRpYWxpemUoYXVkaW9fdW5pdF8pOwotICBpZiAocmVzdWx0KSB7Ci0gICAgSGFuZGxlRXJyb3IocmVzdWx0KTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBUaGUgaGFyZHdhcmUgbGF0ZW5jeSBpcyBmaXhlZCBhbmQgd2lsbCBub3QgY2hhbmdlIGR1cmluZyB0aGUgY2FsbC4KLSAgaGFyZHdhcmVfbGF0ZW5jeV9mcmFtZXNfID0gR2V0SGFyZHdhcmVMYXRlbmN5KCk7Ci0KLSAgLy8gVGhlIG1hc3RlciBjaGFubmVsIGlzIDAsIExlZnQgYW5kIHJpZ2h0IGFyZSBjaGFubmVscyAxIGFuZCAyLgotICAvLyBBbmQgdGhlIG1hc3RlciBjaGFubmVsIGlzIG5vdCBjb3VudGVkIGluIHxudW1iZXJfb2ZfY2hhbm5lbHNfaW5fZnJhbWVffC4KLSAgbnVtYmVyX29mX2NoYW5uZWxzX2luX2ZyYW1lXyA9IEdldE51bWJlck9mQ2hhbm5lbHNGcm9tU3RyZWFtKCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQVVBdWRpb0lucHV0U3RyZWFtOjpTdGFydChBdWRpb0lucHV0Q2FsbGJhY2sqIGNhbGxiYWNrKSB7Ci0gIERDSEVDSyhjYWxsYmFjayk7Ci0gIERMT0dfSUYoRVJST1IsICFhdWRpb191bml0XykgPDwgIk9wZW4oKSBoYXMgbm90IGJlZW4gY2FsbGVkIHN1Y2Nlc3NmdWxseSI7Ci0gIGlmIChzdGFydGVkXyB8fCAhYXVkaW9fdW5pdF8pCi0gICAgcmV0dXJuOwotICBzaW5rXyA9IGNhbGxiYWNrOwotICBPU1N0YXR1cyByZXN1bHQgPSBBdWRpb091dHB1dFVuaXRTdGFydChhdWRpb191bml0Xyk7Ci0gIGlmIChyZXN1bHQgPT0gbm9FcnIpIHsKLSAgICBzdGFydGVkXyA9IHRydWU7Ci0gIH0KLSAgT1NTVEFUVVNfRExPR19JRihFUlJPUiwgcmVzdWx0ICE9IG5vRXJyLCByZXN1bHQpCi0gICAgICA8PCAiRmFpbGVkIHRvIHN0YXJ0IGFjcXVpcmluZyBkYXRhIjsKLX0KLQotdm9pZCBBVUF1ZGlvSW5wdXRTdHJlYW06OlN0b3AoKSB7Ci0gIGlmICghc3RhcnRlZF8pCi0gICAgcmV0dXJuOwotICBPU1N0YXR1cyByZXN1bHQgPSBBdWRpb091dHB1dFVuaXRTdG9wKGF1ZGlvX3VuaXRfKTsKLSAgaWYgKHJlc3VsdCA9PSBub0VycikgewotICAgIHN0YXJ0ZWRfID0gZmFsc2U7Ci0gIH0KLSAgT1NTVEFUVVNfRExPR19JRihFUlJPUiwgcmVzdWx0ICE9IG5vRXJyLCByZXN1bHQpCi0gICAgICA8PCAiRmFpbGVkIHRvIHN0b3AgYWNxdWlyaW5nIGRhdGEiOwotfQotCi12b2lkIEFVQXVkaW9JbnB1dFN0cmVhbTo6Q2xvc2UoKSB7Ci0gIC8vIEl0IGlzIHZhbGlkIHRvIGNhbGwgQ2xvc2UoKSBiZWZvcmUgY2FsbGluZyBvcGVuIG9yIFN0YXJ0KCkuCi0gIC8vIEl0IGlzIGFsc28gdmFsaWQgdG8gY2FsbCBDbG9zZSgpIGFmdGVyIFN0YXJ0KCkgaGFzIGJlZW4gY2FsbGVkLgotICBpZiAoc3RhcnRlZF8pIHsKLSAgICBTdG9wKCk7Ci0gIH0KLSAgaWYgKGF1ZGlvX3VuaXRfKSB7Ci0gICAgLy8gRGVhbGxvY2F0ZSB0aGUgYXVkaW8gdW5pdOKAmXMgcmVzb3VyY2VzLgotICAgIEF1ZGlvVW5pdFVuaW5pdGlhbGl6ZShhdWRpb191bml0Xyk7Ci0KLSAgICAvLyBUZXJtaW5hdGVzIG91ciBjb25uZWN0aW9uIHRvIHRoZSBBVUhBTCBjb21wb25lbnQuCi0gICAgQ2xvc2VDb21wb25lbnQoYXVkaW9fdW5pdF8pOwotICAgIGF1ZGlvX3VuaXRfID0gMDsKLSAgfQotICBpZiAoc2lua18pIHsKLSAgICBzaW5rXy0+T25DbG9zZSh0aGlzKTsKLSAgICBzaW5rXyA9IE5VTEw7Ci0gIH0KLQotICAvLyBJbmZvcm0gdGhlIGF1ZGlvIG1hbmFnZXIgdGhhdCB3ZSBoYXZlIGJlZW4gY2xvc2VkLiBUaGlzIGNhbiBjYXVzZSBvdXIKLSAgLy8gZGVzdHJ1Y3Rpb24uCi0gIG1hbmFnZXJfLT5SZWxlYXNlSW5wdXRTdHJlYW0odGhpcyk7Ci19Ci0KLWRvdWJsZSBBVUF1ZGlvSW5wdXRTdHJlYW06OkdldE1heFZvbHVtZSgpIHsKLSAgLy8gVmVyaWZ5IHRoYXQgd2UgaGF2ZSBhIHZhbGlkIGRldmljZS4KLSAgaWYgKGlucHV0X2RldmljZV9pZF8gPT0ga0F1ZGlvT2JqZWN0VW5rbm93bikgewotICAgIE5PVFJFQUNIRUQoKSA8PCAiRGV2aWNlIElEIGlzIHVua25vd24iOwotICAgIHJldHVybiAwLjA7Ci0gIH0KLQotICAvLyBRdWVyeSBpZiBhbnkgb2YgdGhlIG1hc3RlciwgbGVmdCBvciByaWdodCBjaGFubmVscyBoYXMgdm9sdW1lIGNvbnRyb2wuCi0gIGZvciAoaW50IGkgPSAwOyBpIDw9IG51bWJlcl9vZl9jaGFubmVsc19pbl9mcmFtZV87ICsraSkgewotICAgIC8vIElmIHRoZSB2b2x1bWUgaXMgc2V0dGFibGUsIHRoZSAgdmFsaWQgdm9sdW1lIHJhbmdlIGlzIFswLjAsIDEuMF0uCi0gICAgaWYgKElzVm9sdW1lU2V0dGFibGVPbkNoYW5uZWwoaSkpCi0gICAgICByZXR1cm4gMS4wOwotICB9Ci0KLSAgLy8gVm9sdW1lIGNvbnRyb2wgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhlIGF1ZGlvIHN0cmVhbS4KLSAgcmV0dXJuIDAuMDsKLX0KLQotdm9pZCBBVUF1ZGlvSW5wdXRTdHJlYW06OlNldFZvbHVtZShkb3VibGUgdm9sdW1lKSB7Ci0gIERWTE9HKDEpIDw8ICJTZXRWb2x1bWUodm9sdW1lPSIgPDwgdm9sdW1lIDw8ICIpIjsKLSAgRENIRUNLX0dFKHZvbHVtZSwgMC4wKTsKLSAgRENIRUNLX0xFKHZvbHVtZSwgMS4wKTsKLQotICAvLyBWZXJpZnkgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgZGV2aWNlLgotICBpZiAoaW5wdXRfZGV2aWNlX2lkXyA9PSBrQXVkaW9PYmplY3RVbmtub3duKSB7Ci0gICAgTk9UUkVBQ0hFRCgpIDw8ICJEZXZpY2UgSUQgaXMgdW5rbm93biI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRmxvYXQzMiB2b2x1bWVfZmxvYXQzMiA9IHN0YXRpY19jYXN0PEZsb2F0MzI+KHZvbHVtZSk7Ci0gIEF1ZGlvT2JqZWN0UHJvcGVydHlBZGRyZXNzIHByb3BlcnR5X2FkZHJlc3MgPSB7Ci0gICAga0F1ZGlvRGV2aWNlUHJvcGVydHlWb2x1bWVTY2FsYXIsCi0gICAga0F1ZGlvRGV2aWNlUHJvcGVydHlTY29wZUlucHV0LAotICAgIGtBdWRpb09iamVjdFByb3BlcnR5RWxlbWVudE1hc3RlcgotICB9OwotCi0gIC8vIFRyeSB0byBzZXQgdGhlIHZvbHVtZSBmb3IgbWFzdGVyIHZvbHVtZSBjaGFubmVsLgotICBpZiAoSXNWb2x1bWVTZXR0YWJsZU9uQ2hhbm5lbChrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXIpKSB7Ci0gICAgT1NTdGF0dXMgcmVzdWx0ID0gQXVkaW9PYmplY3RTZXRQcm9wZXJ0eURhdGEoaW5wdXRfZGV2aWNlX2lkXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZvbHVtZV9mbG9hdDMyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lX2Zsb2F0MzIpOwotICAgIGlmIChyZXN1bHQgIT0gbm9FcnIpIHsKLSAgICAgIERMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byBzZXQgdm9sdW1lIHRvICIgPDwgdm9sdW1lX2Zsb2F0MzI7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFRoZXJlIGlzIG5vIG1hc3RlciB2b2x1bWUgY29udHJvbCwgdHJ5IHRvIHNldCB2b2x1bWUgZm9yIGVhY2ggY2hhbm5lbC4KLSAgaW50IHN1Y2Nlc3NmdWxfY2hhbm5lbHMgPSAwOwotICBmb3IgKGludCBpID0gMTsgaSA8PSBudW1iZXJfb2ZfY2hhbm5lbHNfaW5fZnJhbWVfOyArK2kpIHsKLSAgICBwcm9wZXJ0eV9hZGRyZXNzLm1FbGVtZW50ID0gc3RhdGljX2Nhc3Q8VUludDMyPihpKTsKLSAgICBpZiAoSXNWb2x1bWVTZXR0YWJsZU9uQ2hhbm5lbChpKSkgewotICAgICAgT1NTdGF0dXMgcmVzdWx0ID0gQXVkaW9PYmplY3RTZXRQcm9wZXJ0eURhdGEoaW5wdXRfZGV2aWNlX2lkXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yodm9sdW1lX2Zsb2F0MzIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZV9mbG9hdDMyKTsKLSAgICAgIGlmIChyZXN1bHQgPT0gbm9FcnIpCi0gICAgICAgICsrc3VjY2Vzc2Z1bF9jaGFubmVsczsKLSAgICB9Ci0gIH0KLQotICBETE9HX0lGKFdBUk5JTkcsIHN1Y2Nlc3NmdWxfY2hhbm5lbHMgPT0gMCkKLSAgICAgIDw8ICJGYWlsZWQgdG8gc2V0IHZvbHVtZSB0byAiIDw8IHZvbHVtZV9mbG9hdDMyOwotCi0gIC8vIFVwZGF0ZSB0aGUgQUdDIHZvbHVtZSBsZXZlbCBiYXNlZCBvbiB0aGUgbGFzdCBzZXR0aW5nIGFib3ZlLiBOb3RlIHRoYXQsCi0gIC8vIHRoZSB2b2x1bWUtbGV2ZWwgcmVzb2x1dGlvbiBpcyBub3QgaW5maW5pdGUgYW5kIGl0IGlzIHRoZXJlZm9yZSBub3QKLSAgLy8gcG9zc2libGUgdG8gYXNzdW1lIHRoYXQgdGhlIHZvbHVtZSBwcm92aWRlZCBhcyBpbnB1dCBwYXJhbWV0ZXIgY2FuIGJlCi0gIC8vIHVzZWQgZGlyZWN0bHkuIEluc3RlYWQsIGEgbmV3IHF1ZXJ5IHRvIHRoZSBhdWRpbyBoYXJkd2FyZSBpcyByZXF1aXJlZC4KLSAgLy8gVGhpcyBtZXRob2QgZG9lcyBub3RoaW5nIGlmIEFHQyBpcyBkaXNhYmxlZC4KLSAgVXBkYXRlQWdjVm9sdW1lKCk7Ci19Ci0KLWRvdWJsZSBBVUF1ZGlvSW5wdXRTdHJlYW06OkdldFZvbHVtZSgpIHsKLSAgLy8gVmVyaWZ5IHRoYXQgd2UgaGF2ZSBhIHZhbGlkIGRldmljZS4KLSAgaWYgKGlucHV0X2RldmljZV9pZF8gPT0ga0F1ZGlvT2JqZWN0VW5rbm93bil7Ci0gICAgTk9UUkVBQ0hFRCgpIDw8ICJEZXZpY2UgSUQgaXMgdW5rbm93biI7Ci0gICAgcmV0dXJuIDAuMDsKLSAgfQotCi0gIEF1ZGlvT2JqZWN0UHJvcGVydHlBZGRyZXNzIHByb3BlcnR5X2FkZHJlc3MgPSB7Ci0gICAga0F1ZGlvRGV2aWNlUHJvcGVydHlWb2x1bWVTY2FsYXIsCi0gICAga0F1ZGlvRGV2aWNlUHJvcGVydHlTY29wZUlucHV0LAotICAgIGtBdWRpb09iamVjdFByb3BlcnR5RWxlbWVudE1hc3RlcgotICB9OwotCi0gIGlmIChBdWRpb09iamVjdEhhc1Byb3BlcnR5KGlucHV0X2RldmljZV9pZF8sICZwcm9wZXJ0eV9hZGRyZXNzKSkgewotICAgIC8vIFRoZSBkZXZpY2Ugc3VwcG9ydHMgbWFzdGVyIHZvbHVtZSBjb250cm9sLCBnZXQgdGhlIHZvbHVtZSBmcm9tIHRoZQotICAgIC8vIG1hc3RlciBjaGFubmVsLgotICAgIEZsb2F0MzIgdm9sdW1lX2Zsb2F0MzIgPSAwLjA7Ci0gICAgVUludDMyIHNpemUgPSBzaXplb2Yodm9sdW1lX2Zsb2F0MzIpOwotICAgIE9TU3RhdHVzIHJlc3VsdCA9IEF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhKGlucHV0X2RldmljZV9pZF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5X2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2b2x1bWVfZmxvYXQzMik7Ci0gICAgaWYgKHJlc3VsdCA9PSBub0VycikKLSAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KHZvbHVtZV9mbG9hdDMyKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBUaGVyZSBpcyBubyBtYXN0ZXIgdm9sdW1lIGNvbnRyb2wsIHRyeSB0byBnZXQgdGhlIGF2ZXJhZ2Ugdm9sdW1lIG9mCi0gICAgLy8gYWxsIHRoZSBjaGFubmVscy4KLSAgICBGbG9hdDMyIHZvbHVtZV9mbG9hdDMyID0gMC4wOwotICAgIGludCBzdWNjZXNzZnVsX2NoYW5uZWxzID0gMDsKLSAgICBmb3IgKGludCBpID0gMTsgaSA8PSBudW1iZXJfb2ZfY2hhbm5lbHNfaW5fZnJhbWVfOyArK2kpIHsKLSAgICAgIHByb3BlcnR5X2FkZHJlc3MubUVsZW1lbnQgPSBzdGF0aWNfY2FzdDxVSW50MzI+KGkpOwotICAgICAgaWYgKEF1ZGlvT2JqZWN0SGFzUHJvcGVydHkoaW5wdXRfZGV2aWNlX2lkXywgJnByb3BlcnR5X2FkZHJlc3MpKSB7Ci0gICAgICAgIEZsb2F0MzIgY2hhbm5lbF92b2x1bWUgPSAwOwotICAgICAgICBVSW50MzIgc2l6ZSA9IHNpemVvZihjaGFubmVsX3ZvbHVtZSk7Ci0gICAgICAgIE9TU3RhdHVzIHJlc3VsdCA9IEF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhKGlucHV0X2RldmljZV9pZF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWxfdm9sdW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBub0VycikgewotICAgICAgICAgIHZvbHVtZV9mbG9hdDMyICs9IGNoYW5uZWxfdm9sdW1lOwotICAgICAgICAgICsrc3VjY2Vzc2Z1bF9jaGFubmVsczsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIEdldCB0aGUgYXZlcmFnZSB2b2x1bWUgb2YgdGhlIGNoYW5uZWxzLgotICAgIGlmIChzdWNjZXNzZnVsX2NoYW5uZWxzICE9IDApCi0gICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPih2b2x1bWVfZmxvYXQzMiAvIHN1Y2Nlc3NmdWxfY2hhbm5lbHMpOwotICB9Ci0KLSAgRExPRyhXQVJOSU5HKSA8PCAiRmFpbGVkIHRvIGdldCB2b2x1bWUiOwotICByZXR1cm4gMC4wOwotfQotCi0vLyBBVUhBTCBBdWRpb0RldmljZU91dHB1dCB1bml0IGNhbGxiYWNrCi1PU1N0YXR1cyBBVUF1ZGlvSW5wdXRTdHJlYW06OklucHV0UHJvYyh2b2lkKiB1c2VyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1VuaXRSZW5kZXJBY3Rpb25GbGFncyogZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1RpbWVTdGFtcCogdGltZV9zdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBidXNfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyIG51bWJlcl9vZl9mcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlckxpc3QqIGlvX2RhdGEpIHsKLSAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvcnJlY3QgYnVzIGlzIHVzZWQgKElucHV0IGJ1cy9FbGVtZW50IDEpCi0gIERDSEVDS19FUShidXNfbnVtYmVyLCBzdGF0aWNfY2FzdDxVSW50MzI+KDEpKTsKLSAgQVVBdWRpb0lucHV0U3RyZWFtKiBhdWRpb19pbnB1dCA9Ci0gICAgICByZWludGVycHJldF9jYXN0PEFVQXVkaW9JbnB1dFN0cmVhbSo+KHVzZXJfZGF0YSk7Ci0gIERDSEVDSyhhdWRpb19pbnB1dCk7Ci0gIGlmICghYXVkaW9faW5wdXQpCi0gICAgcmV0dXJuIGtBdWRpb1VuaXRFcnJfSW52YWxpZEVsZW1lbnQ7Ci0KLSAgLy8gUmVjZWl2ZSBhdWRpbyBmcm9tIHRoZSBBVUhBTCBmcm9tIHRoZSBvdXRwdXQgc2NvcGUgb2YgdGhlIEF1ZGlvIFVuaXQuCi0gIE9TU3RhdHVzIHJlc3VsdCA9IEF1ZGlvVW5pdFJlbmRlcihhdWRpb19pbnB1dC0+YXVkaW9fdW5pdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX3N0YW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9mcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dC0+YXVkaW9fYnVmZmVyX2xpc3QoKSk7Ci0gIGlmIChyZXN1bHQpCi0gICAgcmV0dXJuIHJlc3VsdDsKLQotICAvLyBEZWxpdmVyIHJlY29yZGVkIGRhdGEgdG8gdGhlIGNvbnN1bWVyIGFzIGEgY2FsbGJhY2suCi0gIHJldHVybiBhdWRpb19pbnB1dC0+UHJvdmlkZShudW1iZXJfb2ZfZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXQtPmF1ZGlvX2J1ZmZlcl9saXN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX3N0YW1wKTsKLX0KLQotT1NTdGF0dXMgQVVBdWRpb0lucHV0U3RyZWFtOjpQcm92aWRlKFVJbnQzMiBudW1iZXJfb2ZfZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyTGlzdCogaW9fZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1RpbWVTdGFtcCogdGltZV9zdGFtcCkgewotICAvLyBVcGRhdGUgdGhlIGNhcHR1cmUgbGF0ZW5jeS4KLSAgZG91YmxlIGNhcHR1cmVfbGF0ZW5jeV9mcmFtZXMgPSBHZXRDYXB0dXJlTGF0ZW5jeSh0aW1lX3N0YW1wKTsKLQotICAvLyBVcGRhdGUgdGhlIEFHQyB2b2x1bWUgbGV2ZWwgb25jZSBldmVyeSBzZWNvbmQuIE5vdGUgdGhhdCwgfHZvbHVtZXwgaXMKLSAgLy8gYWxzbyB1cGRhdGVkIGVhY2ggdGltZSBTZXRWb2x1bWUoKSBpcyBjYWxsZWQgdGhyb3VnaCBJUEMgYnkgdGhlCi0gIC8vIHJlbmRlci1zaWRlIEFHQy4KLSAgZG91YmxlIG5vcm1hbGl6ZWRfdm9sdW1lID0gMC4wOwotICBRdWVyeUFnY1ZvbHVtZSgmbm9ybWFsaXplZF92b2x1bWUpOwotCi0gIEF1ZGlvQnVmZmVyJiBidWZmZXIgPSBpb19kYXRhLT5tQnVmZmVyc1swXTsKLSAgdWludDgqIGF1ZGlvX2RhdGEgPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4oYnVmZmVyLm1EYXRhKTsKLSAgdWludDMyIGNhcHR1cmVfZGVsYXlfYnl0ZXMgPSBzdGF0aWNfY2FzdDx1aW50MzI+Ci0gICAgICAoKGNhcHR1cmVfbGF0ZW5jeV9mcmFtZXMgKyAwLjUpICogZm9ybWF0Xy5tQnl0ZXNQZXJGcmFtZSk7Ci0gIERDSEVDSyhhdWRpb19kYXRhKTsKLSAgaWYgKCFhdWRpb19kYXRhKQotICAgIHJldHVybiBrQXVkaW9Vbml0RXJyX0ludmFsaWRFbGVtZW50OwotCi0gIC8vIFNlZSBodHRwOi8vY3JidWcuY29tLzE1NDM1MiBmb3IgZGV0YWlscy4KLSAgQ0hFQ0tfRVEobnVtYmVyX29mX2ZyYW1lcywgc3RhdGljX2Nhc3Q8VUludDMyPihudW1iZXJfb2ZfZnJhbWVzXykpOwotCi0gIC8vIEFjY3VtdWxhdGUgY2FwdHVyZWQgYXVkaW8gaW4gRklGTyB1bnRpbCB3ZSBjYW4gbWF0Y2ggdGhlIG91dHB1dCBzaXplCi0gIC8vIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LgotICBEQ0hFQ0tfTEUoZmlmb18tPmZvcndhcmRfYnl0ZXMoKSwgcmVxdWVzdGVkX3NpemVfYnl0ZXNfKTsKLSAgZmlmb18tPkFwcGVuZChhdWRpb19kYXRhLCBidWZmZXIubURhdGFCeXRlU2l6ZSk7Ci0KLSAgLy8gRGVsaXZlciByZWNvcmRlZCBkYXRhIHRvIHRoZSBjbGllbnQgYXMgc29vbiBhcyB0aGUgRklGTyBjb250YWlucyBhCi0gIC8vIHN1ZmZpY2llbnQgYW1vdW50LgotICBpZiAoZmlmb18tPmZvcndhcmRfYnl0ZXMoKSA+PSByZXF1ZXN0ZWRfc2l6ZV9ieXRlc18pIHsKLSAgICAvLyBSZWFkIGZyb20gRklGTyBpbnRvIHRlbXBvcmFyeSBkYXRhIGJ1ZmZlci4KLSAgICBmaWZvXy0+UmVhZChkYXRhXy0+R2V0V3JpdGFibGVEYXRhKCksIHJlcXVlc3RlZF9zaXplX2J5dGVzXyk7Ci0KLSAgICAvLyBEZWxpdmVyIGRhdGEgcGFja2V0LCBkZWxheSBlc3RpbWF0aW9uIGFuZCB2b2x1bWUgbGV2ZWwgdG8gdGhlIHVzZXIuCi0gICAgc2lua18tPk9uRGF0YSh0aGlzLAotICAgICAgICAgICAgICAgICAgZGF0YV8tPkdldERhdGEoKSwKLSAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9zaXplX2J5dGVzXywKLSAgICAgICAgICAgICAgICAgIGNhcHR1cmVfZGVsYXlfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICBub3JtYWxpemVkX3ZvbHVtZSk7Ci0gIH0KLQotICByZXR1cm4gbm9FcnI7Ci19Ci0KLWludCBBVUF1ZGlvSW5wdXRTdHJlYW06OkhhcmR3YXJlU2FtcGxlUmF0ZSgpIHsKLSAgLy8gRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGlucHV0IGRldmljZSdzIHNhbXBsZS1yYXRlLgotICBBdWRpb0RldmljZUlEIGRldmljZV9pZCA9IGtBdWRpb09iamVjdFVua25vd247Ci0gIFVJbnQzMiBpbmZvX3NpemUgPSBzaXplb2YoZGV2aWNlX2lkKTsKLQotICBBdWRpb09iamVjdFByb3BlcnR5QWRkcmVzcyBkZWZhdWx0X2lucHV0X2RldmljZV9hZGRyZXNzID0gewotICAgIGtBdWRpb0hhcmR3YXJlUHJvcGVydHlEZWZhdWx0SW5wdXREZXZpY2UsCi0gICAga0F1ZGlvT2JqZWN0UHJvcGVydHlTY29wZUdsb2JhbCwKLSAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXIKLSAgfTsKLSAgT1NTdGF0dXMgcmVzdWx0ID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGEoa0F1ZGlvT2JqZWN0U3lzdGVtT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVmYXVsdF9pbnB1dF9kZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm9fc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZV9pZCk7Ci0gIGlmIChyZXN1bHQgIT0gbm9FcnIpCi0gICAgcmV0dXJuIDAuMDsKLQotICBGbG9hdDY0IG5vbWluYWxfc2FtcGxlX3JhdGU7Ci0gIGluZm9fc2l6ZSA9IHNpemVvZihub21pbmFsX3NhbXBsZV9yYXRlKTsKLQotICBBdWRpb09iamVjdFByb3BlcnR5QWRkcmVzcyBub21pbmFsX3NhbXBsZV9yYXRlX2FkZHJlc3MgPSB7Ci0gICAga0F1ZGlvRGV2aWNlUHJvcGVydHlOb21pbmFsU2FtcGxlUmF0ZSwKLSAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eVNjb3BlR2xvYmFsLAotICAgIGtBdWRpb09iamVjdFByb3BlcnR5RWxlbWVudE1hc3RlcgotICB9OwotICByZXN1bHQgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YShkZXZpY2VfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub21pbmFsX3NhbXBsZV9yYXRlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub21pbmFsX3NhbXBsZV9yYXRlKTsKLSAgaWYgKHJlc3VsdCAhPSBub0VycikKLSAgICByZXR1cm4gMC4wOwotCi0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KG5vbWluYWxfc2FtcGxlX3JhdGUpOwotfQotCi1kb3VibGUgQVVBdWRpb0lucHV0U3RyZWFtOjpHZXRIYXJkd2FyZUxhdGVuY3koKSB7Ci0gIGlmICghYXVkaW9fdW5pdF8gfHwgaW5wdXRfZGV2aWNlX2lkXyA9PSBrQXVkaW9PYmplY3RVbmtub3duKSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCAiQXVkaW8gdW5pdCBvYmplY3QgaXMgTlVMTCBvciBkZXZpY2UgSUQgaXMgdW5rbm93biI7Ci0gICAgcmV0dXJuIDAuMDsKLSAgfQotCi0gIC8vIEdldCBhdWRpbyB1bml0IGxhdGVuY3kuCi0gIEZsb2F0NjQgYXVkaW9fdW5pdF9sYXRlbmN5X3NlYyA9IDAuMDsKLSAgVUludDMyIHNpemUgPSBzaXplb2YoYXVkaW9fdW5pdF9sYXRlbmN5X3NlYyk7Ci0gIE9TU3RhdHVzIHJlc3VsdCA9IEF1ZGlvVW5pdEdldFByb3BlcnR5KGF1ZGlvX3VuaXRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9Vbml0UHJvcGVydHlfTGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0F1ZGlvVW5pdFNjb3BlX0dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1ZGlvX3VuaXRfbGF0ZW5jeV9zZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKLSAgT1NTVEFUVVNfRExPR19JRihXQVJOSU5HLCByZXN1bHQgIT0gbm9FcnIsIHJlc3VsdCkKLSAgICAgIDw8ICJDb3VsZCBub3QgZ2V0IGF1ZGlvIHVuaXQgbGF0ZW5jeSI7Ci0KLSAgLy8gR2V0IGlucHV0IGF1ZGlvIGRldmljZSBsYXRlbmN5LgotICBBdWRpb09iamVjdFByb3BlcnR5QWRkcmVzcyBwcm9wZXJ0eV9hZGRyZXNzID0gewotICAgIGtBdWRpb0RldmljZVByb3BlcnR5TGF0ZW5jeSwKLSAgICBrQXVkaW9EZXZpY2VQcm9wZXJ0eVNjb3BlSW5wdXQsCi0gICAga0F1ZGlvT2JqZWN0UHJvcGVydHlFbGVtZW50TWFzdGVyCi0gIH07Ci0gIFVJbnQzMiBkZXZpY2VfbGF0ZW5jeV9mcmFtZXMgPSAwOwotICBzaXplID0gc2l6ZW9mKGRldmljZV9sYXRlbmN5X2ZyYW1lcyk7Ci0gIHJlc3VsdCA9IEF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhKGlucHV0X2RldmljZV9pZF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZV9sYXRlbmN5X2ZyYW1lcyk7Ci0gIERMT0dfSUYoV0FSTklORywgcmVzdWx0ICE9IG5vRXJyKSA8PCAiQ291bGQgbm90IGdldCBhdWRpbyBkZXZpY2UgbGF0ZW5jeS4iOwotCi0gIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KChhdWRpb191bml0X2xhdGVuY3lfc2VjICoKLSAgICAgIGZvcm1hdF8ubVNhbXBsZVJhdGUpICsgZGV2aWNlX2xhdGVuY3lfZnJhbWVzKTsKLX0KLQotZG91YmxlIEFVQXVkaW9JbnB1dFN0cmVhbTo6R2V0Q2FwdHVyZUxhdGVuY3koCi0gICAgY29uc3QgQXVkaW9UaW1lU3RhbXAqIGlucHV0X3RpbWVfc3RhbXApIHsKLSAgLy8gR2V0IHRoZSBkZWxheSBiZXR3ZWVuIGJldHdlZW4gdGhlIGFjdHVhbCByZWNvcmRpbmcgaW5zdGFudCBhbmQgdGhlIHRpbWUKLSAgLy8gd2hlbiB0aGUgZGF0YSBwYWNrZXQgaXMgcHJvdmlkZWQgYXMgYSBjYWxsYmFjay4KLSAgVUludDY0IGNhcHR1cmVfdGltZV9ucyA9IEF1ZGlvQ29udmVydEhvc3RUaW1lVG9OYW5vcygKLSAgICAgIGlucHV0X3RpbWVfc3RhbXAtPm1Ib3N0VGltZSk7Ci0gIFVJbnQ2NCBub3dfbnMgPSBBdWRpb0NvbnZlcnRIb3N0VGltZVRvTmFub3MoQXVkaW9HZXRDdXJyZW50SG9zdFRpbWUoKSk7Ci0gIGRvdWJsZSBkZWxheV9mcmFtZXMgPSBzdGF0aWNfY2FzdDxkb3VibGU+Ci0gICAgICAoMWUtOSAqIChub3dfbnMgLSBjYXB0dXJlX3RpbWVfbnMpICogZm9ybWF0Xy5tU2FtcGxlUmF0ZSk7Ci0KLSAgLy8gVG90YWwgbGF0ZW5jeSBpcyBjb21wb3NlZCBieSB0aGUgZHluYW1pYyBsYXRlbmN5IGFuZCB0aGUgZml4ZWQKLSAgLy8gaGFyZHdhcmUgbGF0ZW5jeS4KLSAgcmV0dXJuIChkZWxheV9mcmFtZXMgKyBoYXJkd2FyZV9sYXRlbmN5X2ZyYW1lc18pOwotfQotCi1pbnQgQVVBdWRpb0lucHV0U3RyZWFtOjpHZXROdW1iZXJPZkNoYW5uZWxzRnJvbVN0cmVhbSgpIHsKLSAgLy8gR2V0IHRoZSBzdHJlYW0gZm9ybWF0LCB0byBiZSBhYmxlIHRvIHJlYWQgdGhlIG51bWJlciBvZiBjaGFubmVscy4KLSAgQXVkaW9PYmplY3RQcm9wZXJ0eUFkZHJlc3MgcHJvcGVydHlfYWRkcmVzcyA9IHsKLSAgICBrQXVkaW9EZXZpY2VQcm9wZXJ0eVN0cmVhbUZvcm1hdCwKLSAgICBrQXVkaW9EZXZpY2VQcm9wZXJ0eVNjb3BlSW5wdXQsCi0gICAga0F1ZGlvT2JqZWN0UHJvcGVydHlFbGVtZW50TWFzdGVyCi0gIH07Ci0gIEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbiBzdHJlYW1fZm9ybWF0OwotICBVSW50MzIgc2l6ZSA9IHNpemVvZihzdHJlYW1fZm9ybWF0KTsKLSAgT1NTdGF0dXMgcmVzdWx0ID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGEoaW5wdXRfZGV2aWNlX2lkXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5X2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtX2Zvcm1hdCk7Ci0gIGlmIChyZXN1bHQgIT0gbm9FcnIpIHsKLSAgICBETE9HKFdBUk5JTkcpIDw8ICJDb3VsZCBub3QgZ2V0IHN0cmVhbSBmb3JtYXQiOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oc3RyZWFtX2Zvcm1hdC5tQ2hhbm5lbHNQZXJGcmFtZSk7Ci19Ci0KLXZvaWQgQVVBdWRpb0lucHV0U3RyZWFtOjpIYW5kbGVFcnJvcihPU1N0YXR1cyBlcnIpIHsKLSAgTk9UUkVBQ0hFRCgpIDw8ICJlcnJvciAiIDw8IEdldE1hY09TU3RhdHVzRXJyb3JTdHJpbmcoZXJyKQotICAgICAgICAgICAgICAgPDwgIiAoIiA8PCBlcnIgPDwgIikiOwotICBpZiAoc2lua18pCi0gICAgc2lua18tPk9uRXJyb3IodGhpcywgc3RhdGljX2Nhc3Q8aW50PihlcnIpKTsKLX0KLQotYm9vbCBBVUF1ZGlvSW5wdXRTdHJlYW06OklzVm9sdW1lU2V0dGFibGVPbkNoYW5uZWwoaW50IGNoYW5uZWwpIHsKLSAgQm9vbGVhbiBpc19zZXR0YWJsZSA9IGZhbHNlOwotICBBdWRpb09iamVjdFByb3BlcnR5QWRkcmVzcyBwcm9wZXJ0eV9hZGRyZXNzID0gewotICAgIGtBdWRpb0RldmljZVByb3BlcnR5Vm9sdW1lU2NhbGFyLAotICAgIGtBdWRpb0RldmljZVByb3BlcnR5U2NvcGVJbnB1dCwKLSAgICBzdGF0aWNfY2FzdDxVSW50MzI+KGNoYW5uZWwpCi0gIH07Ci0gIE9TU3RhdHVzIHJlc3VsdCA9IEF1ZGlvT2JqZWN0SXNQcm9wZXJ0eVNldHRhYmxlKGlucHV0X2RldmljZV9pZF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNfc2V0dGFibGUpOwotICByZXR1cm4gKHJlc3VsdCA9PSBub0VycikgPyBpc19zZXR0YWJsZSA6IGZhbHNlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9tYWMvYXVkaW9fbG93X2xhdGVuY3lfaW5wdXRfbWFjLmggYi9zcmMvbWVkaWEvYXVkaW8vbWFjL2F1ZGlvX2xvd19sYXRlbmN5X2lucHV0X21hYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzZlZGMwLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9tYWMvYXVkaW9fbG93X2xhdGVuY3lfaW5wdXRfbWFjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLS8vCi0vLyBJbXBsZW1lbnRhdGlvbiBvZiBBdWRpb0lucHV0U3RyZWFtIGZvciBNYWMgT1MgWCB1c2luZyB0aGUgc3BlY2lhbCBBVUhBTAotLy8gaW5wdXQgQXVkaW8gVW5pdCBwcmVzZW50IGluIE9TIDEwLjQgYW5kIGxhdGVyLgotLy8gVGhlIEFVSEFMIGlucHV0IEF1ZGlvIFVuaXQgaXMgZm9yIGxvdy1sYXRlbmN5IGF1ZGlvIEkvTy4KLS8vCi0vLyBPdmVydmlldyBvZiBvcGVyYXRpb246Ci0vLwotLy8gLSBBbiBvYmplY3Qgb2YgQVVBdWRpb0lucHV0U3RyZWFtIGlzIGNyZWF0ZWQgYnkgdGhlIEF1ZGlvTWFuYWdlcgotLy8gICBmYWN0b3J5OiBhdWRpb19tYW4tPk1ha2VBdWRpb0lucHV0U3RyZWFtKCkuCi0vLyAtIE5leHQgc29tZSB0aHJlYWQgd2lsbCBjYWxsIE9wZW4oKSwgYXQgdGhhdCBwb2ludCB0aGUgdW5kZXJseWluZwotLy8gICBBVUhBTCBvdXRwdXQgQXVkaW8gVW5pdCBpcyBjcmVhdGVkIGFuZCBjb25maWd1cmVkLgotLy8gLSBUaGVuIHNvbWUgdGhyZWFkIHdpbGwgY2FsbCBTdGFydChzaW5rKS4KLS8vICAgVGhlbiB0aGUgQXVkaW8gVW5pdCBpcyBzdGFydGVkIHdoaWNoIGNyZWF0ZXMgaXRzIG93biB0aHJlYWQgd2hpY2gKLS8vICAgcGVyaW9kaWNhbGx5IHdpbGwgcHJvdmlkZSB0aGUgc2luayB3aXRoIG1vcmUgZGF0YSBhcyBidWZmZXJzIGFyZSBiZWluZwotLy8gICBwcm9kdWNlZC9yZWNvcmRlZC4KLS8vIC0gQXQgc29tZSBwb2ludCBzb21lIHRocmVhZCB3aWxsIGNhbGwgU3RvcCgpLCB3aGljaCB3ZSBoYW5kbGUgYnkgZGlyZWN0bHkKLS8vICAgc3RvcHBpbmcgdGhlIEFVSEFMIG91dHB1dCBBdWRpbyBVbml0LgotLy8gLSBUaGUgc2FtZSB0aHJlYWQgdGhhdCBjYWxsZWQgc3RvcCB3aWxsIGNhbGwgQ2xvc2UoKSB3aGVyZSB3ZSBjbGVhbnVwCi0vLyAgIGFuZCBub3RpZnkgdGhlIGF1ZGlvIG1hbmFnZXIsIHdoaWNoIGxpa2VseSB3aWxsIGRlc3Ryb3kgdGhpcyBvYmplY3QuCi0vLwotLy8gSW1wbGVtZW50YXRpb24gbm90ZXM6Ci0vLwotLy8gLSBJdCBpcyByZWNvbW1lbmRlZCB0byBmaXJzdCBhY3F1aXJlIHRoZSBuYXRpdmUgc2FtcGxlIHJhdGUgb2YgdGhlIGRlZmF1bHQKLS8vICAgaW5wdXQgZGV2aWNlIGFuZCB0aGVuIHVzZSB0aGUgc2FtZSByYXRlIHdoZW4gY3JlYXRpbmcgdGhpcyBvYmplY3QuCi0vLyAgIFVzZSBBVUF1ZGlvSW5wdXRTdHJlYW06OkhhcmR3YXJlU2FtcGxlUmF0ZSgpIHRvIHJldHJpZXZlIHRoZSBzYW1wbGUgcmF0ZS4KLS8vIC0gQ2FsbGluZyBDbG9zZSgpIGFsc28gbGVhZHMgdG8gc2VsZiBkZXN0cnVjdGlvbi4KLS8vIC0gVGhlIGxhdGVuY3kgY29uc2lzdHMgb2YgdHdvIHBhcnRzOgotLy8gICAxKSBIYXJkd2FyZSBsYXRlbmN5LCB3aGljaCBpbmNsdWRlcyBBdWRpbyBVbml0IGxhdGVuY3ksIGF1ZGlvIGRldmljZQotLy8gICAgICBsYXRlbmN5OwotLy8gICAyKSBUaGUgZGVsYXkgYmV0d2VlbiB0aGUgYWN0dWFsIHJlY29yZGluZyBpbnN0YW50IGFuZCB0aGUgdGltZSB3aGVuIHRoZQotLy8gICAgICBkYXRhIHBhY2tldCBpcyBwcm92aWRlZCBhcyBhIGNhbGxiYWNrLgotLy8KLSNpZm5kZWYgTUVESUFfQVVESU9fTUFDX0FVRElPX0xPV19MQVRFTkNZX0lOUFVUX01BQ19IXwotI2RlZmluZSBNRURJQV9BVURJT19NQUNfQVVESU9fTE9XX0xBVEVOQ1lfSU5QVVRfTUFDX0hfCi0KLSNpbmNsdWRlIDxBdWRpb1VuaXQvQXVkaW9Vbml0Lmg+Ci0jaW5jbHVkZSA8Q29yZUF1ZGlvL0NvcmVBdWRpby5oPgotCi0jaW5jbHVkZSAiYmFzZS9hdG9taWNvcHMuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAiYmFzZS9zeW5jaHJvbml6YXRpb24vbG9jay5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX2lvLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9faW5wdXRfc3RyZWFtX2ltcGwuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19wYXJhbWV0ZXJzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zZWVrYWJsZV9idWZmZXIuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgQXVkaW9NYW5hZ2VyTWFjOwotY2xhc3MgRGF0YUJ1ZmZlcjsKLQotY2xhc3MgQVVBdWRpb0lucHV0U3RyZWFtIDogcHVibGljIEF1ZGlvSW5wdXRTdHJlYW1JbXBsIHsKLSBwdWJsaWM6Ci0gIC8vIFRoZSBjdG9yIHRha2VzIGFsbCB0aGUgdXN1YWwgcGFyYW1ldGVycywgcGx1cyB8bWFuYWdlcnwgd2hpY2ggaXMgdGhlCi0gIC8vIHRoZSBhdWRpbyBtYW5hZ2VyIHdobyBpcyBjcmVhdGluZyB0aGlzIG9iamVjdC4KLSAgQVVBdWRpb0lucHV0U3RyZWFtKEF1ZGlvTWFuYWdlck1hYyogbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VJRCBhdWRpb19kZXZpY2VfaWQpOwotICAvLyBUaGUgZHRvciBpcyB0eXBpY2FsbHkgY2FsbGVkIGJ5IHRoZSBBdWRpb01hbmFnZXIgb25seSBhbmQgaXQgaXMgdXN1YWxseQotICAvLyB0cmlnZ2VyZWQgYnkgY2FsbGluZyBBdWRpb0lucHV0U3RyZWFtOjpDbG9zZSgpLgotICB2aXJ0dWFsIH5BVUF1ZGlvSW5wdXRTdHJlYW0oKTsKLQotICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBBdWRpb0lucHV0U3RyZWFtLgotICB2aXJ0dWFsIGJvb2wgT3BlbigpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU3RhcnQoQXVkaW9JbnB1dENhbGxiYWNrKiBjYWxsYmFjaykgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTdG9wKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBDbG9zZSgpIE9WRVJSSURFOwotICB2aXJ0dWFsIGRvdWJsZSBHZXRNYXhWb2x1bWUoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFNldFZvbHVtZShkb3VibGUgdm9sdW1lKSBPVkVSUklERTsKLSAgdmlydHVhbCBkb3VibGUgR2V0Vm9sdW1lKCkgT1ZFUlJJREU7Ci0KLSAgLy8gUmV0dXJucyB0aGUgY3VycmVudCBoYXJkd2FyZSBzYW1wbGUgcmF0ZSBmb3IgdGhlIGRlZmF1bHQgaW5wdXQgZGV2aWNlLgotICBNRURJQV9FWFBPUlQgc3RhdGljIGludCBIYXJkd2FyZVNhbXBsZVJhdGUoKTsKLQotICBib29sIHN0YXJ0ZWQoKSBjb25zdCB7IHJldHVybiBzdGFydGVkXzsgfQotICBBdWRpb1VuaXQgYXVkaW9fdW5pdCgpIHsgcmV0dXJuIGF1ZGlvX3VuaXRfOyB9Ci0gIEF1ZGlvQnVmZmVyTGlzdCogYXVkaW9fYnVmZmVyX2xpc3QoKSB7IHJldHVybiAmYXVkaW9fYnVmZmVyX2xpc3RfOyB9Ci0KLSBwcml2YXRlOgotICAvLyBBdWRpb091dHB1dFVuaXQgY2FsbGJhY2suCi0gIHN0YXRpYyBPU1N0YXR1cyBJbnB1dFByb2Modm9pZCogdXNlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVW5pdFJlbmRlckFjdGlvbkZsYWdzKiBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1RpbWVTdGFtcCogdGltZV9zdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MzIgYnVzX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MzIgbnVtYmVyX29mX2ZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlckxpc3QqIGlvX2RhdGEpOwotCi0gIC8vIFB1c2hlcyByZWNvcmRlZCBkYXRhIHRvIGNvbnN1bWVyIG9mIHRoZSBpbnB1dCBhdWRpbyBzdHJlYW0uCi0gIE9TU3RhdHVzIFByb3ZpZGUoVUludDMyIG51bWJlcl9vZl9mcmFtZXMsIEF1ZGlvQnVmZmVyTGlzdCogaW9fZGF0YSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1RpbWVTdGFtcCogdGltZV9zdGFtcCk7Ci0KLSAgLy8gR2V0cyB0aGUgZml4ZWQgY2FwdHVyZSBoYXJkd2FyZSBsYXRlbmN5IGFuZCBzdG9yZSBpdCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCi0gIC8vIFJldHVybnMgMCBpZiBub3QgYXZhaWxhYmxlLgotICBkb3VibGUgR2V0SGFyZHdhcmVMYXRlbmN5KCk7Ci0KLSAgLy8gR2V0cyB0aGUgY3VycmVudCBjYXB0dXJlIGRlbGF5IHZhbHVlLgotICBkb3VibGUgR2V0Q2FwdHVyZUxhdGVuY3koY29uc3QgQXVkaW9UaW1lU3RhbXAqIGlucHV0X3RpbWVfc3RhbXApOwotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBjaGFubmVscyBmb3IgYSBzdHJlYW0gb2YgYXVkaW8gZGF0YS4KLSAgaW50IEdldE51bWJlck9mQ2hhbm5lbHNGcm9tU3RyZWFtKCk7Ci0KLSAgLy8gSXNzdWVzIHRoZSBPbkVycm9yKCkgY2FsbGJhY2sgdG8gdGhlIHxzaW5rX3wuCi0gIHZvaWQgSGFuZGxlRXJyb3IoT1NTdGF0dXMgZXJyKTsKLQotICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIHZvbHVtZSBjb250cm9sIGlzIGF2aWFsYWJsZSBvbiBzcGVjaWZpYwotICAvLyBjaGFubmVsLgotICBib29sIElzVm9sdW1lU2V0dGFibGVPbkNoYW5uZWwoaW50IGNoYW5uZWwpOwotCi0gIC8vIE91ciBjcmVhdG9yLCB0aGUgYXVkaW8gbWFuYWdlciBuZWVkcyB0byBiZSBub3RpZmllZCB3aGVuIHdlIGNsb3NlLgotICBBdWRpb01hbmFnZXJNYWMqIG1hbmFnZXJfOwotCi0gIC8vIENvbnRhaW5zIHRoZSBkZXNpcmVkIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgaW4gZWFjaCBjYWxsYmFjay4KLSAgc2l6ZV90IG51bWJlcl9vZl9mcmFtZXNfOwotCi0gIC8vIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUgcmVjb3JkZWQgYXVkaW8gc2FtcGxlcy4KLSAgQXVkaW9JbnB1dENhbGxiYWNrKiBzaW5rXzsKLQotICAvLyBTdHJ1Y3R1cmUgdGhhdCBob2xkcyB0aGUgZGVzaXJlZCBvdXRwdXQgZm9ybWF0IG9mIHRoZSBzdHJlYW0uCi0gIC8vIE5vdGUgdGhhdCwgdGhpcyBmb3JtYXQgY2FuIGRpZmZlciBmcm9tIHRoZSBkZXZpY2UoPWlucHV0KSBmb3JtYXQuCi0gIEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbiBmb3JtYXRfOwotCi0gIC8vIFRoZSBzcGVjaWFsIEF1ZGlvIFVuaXQgY2FsbGVkIEFVSEFMLCB3aGljaCBhbGxvd3MgdXMgdG8gcGFzcyBhdWRpbyBkYXRhCi0gIC8vIGRpcmVjdGx5IGZyb20gYSBtaWNyb3Bob25lLCB0aHJvdWdoIHRoZSBIQUwsIGFuZCB0byBvdXIgYXBwbGljYXRpb24uCi0gIC8vIFRoZSBBVUhBTCBhbHNvIGVuYWJsZXMgc2VsZWN0aW9uIG9mIG5vbiBkZWZhdWx0IGRldmljZXMuCi0gIEF1ZGlvVW5pdCBhdWRpb191bml0XzsKLQotICAvLyBUaGUgVUlEIHJlZmVycyB0byB0aGUgY3VycmVudCBpbnB1dCBhdWRpbyBkZXZpY2UuCi0gIEF1ZGlvRGV2aWNlSUQgaW5wdXRfZGV2aWNlX2lkXzsKLQotICAvLyBQcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgZW5jYXBzdWxhdGluZyBvbmUgb3IgbW9yZSBidWZmZXJzIG9mIGF1ZGlvIGRhdGEuCi0gIEF1ZGlvQnVmZmVyTGlzdCBhdWRpb19idWZmZXJfbGlzdF87Ci0KLSAgLy8gVGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIHJlY29yZGVkIGRhdGEuIFRoZSBJbnB1dFByb2MoKSByZW5kZXJzIGludG8gdGhpcwotICAvLyBhcnJheSBhcyBzb29uIGFzIGEgZnJhbWUgb2YgdGhlIGRlc2lyZWQgYnVmZmVyIHNpemUgaGFzIGJlZW4gcmVjb3JkZWQuCi0gIHNjb3BlZF9hcnJheTx1aW50OD4gYXVkaW9fZGF0YV9idWZmZXJfOwotCi0gIC8vIFRydWUgYWZ0ZXIgc3VjY2Vzc2Z1bGwgU3RhcnQoKSwgZmFsc2UgYWZ0ZXIgc3VjY2Vzc2Z1bCBTdG9wKCkuCi0gIGJvb2wgc3RhcnRlZF87Ci0KLSAgLy8gRml4ZWQgY2FwdHVyZSBoYXJkd2FyZSBsYXRlbmN5IGluIGZyYW1lcy4KLSAgZG91YmxlIGhhcmR3YXJlX2xhdGVuY3lfZnJhbWVzXzsKLQotICAvLyBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIGluIGVhY2ggZnJhbWUgb2YgYXVkaW8gZGF0YSwgd2hpY2ggaXMgdXNlZAotICAvLyB3aGVuIHF1ZXJ5aW5nIHRoZSB2b2x1bWUgb2YgZWFjaCBjaGFubmVsLgotICBpbnQgbnVtYmVyX29mX2NoYW5uZWxzX2luX2ZyYW1lXzsKLQotICAvLyBBY2N1bXVsYXRlcyByZWNvcmRlZCBkYXRhIHBhY2tldHMgdW50aWwgdGhlIHJlcXVlc3RlZCBzaXplIGhhcyBiZWVuIHN0b3JlZC4KLSAgc2NvcGVkX3B0cjxtZWRpYTo6U2Vla2FibGVCdWZmZXI+IGZpZm9fOwotCi0gICAvLyBJbnRlcm1lZGlhdGUgc3RvcmFnZSBvZiBkYXRhIGZyb20gdGhlIEZJRk8gYmVmb3JlIHNlbmRpbmcgaXQgdG8gdGhlCi0gICAvLyBjbGllbnQgdXNpbmcgdGhlIE9uRGF0YSgpIGNhbGxiYWNrLgotICBzY29wZWRfcmVmcHRyPG1lZGlhOjpEYXRhQnVmZmVyPiBkYXRhXzsKLQotICAvLyBUaGUgY2xpZW50IHJlcXVlc3RzIHRoYXQgdGhlIHJlY29yZGVkIGRhdGEgc2hhbGwgYmUgZGVsaXZlcmVkIHVzaW5nCi0gIC8vIE9uRGF0YSgpIGNhbGxiYWNrcyB3aGVyZSBlYWNoIGNhbGxiYWNrIGNvbnRhaW5zIHRoaXMgYW1vdW50IG9mIGJ5dGVzLgotICBpbnQgcmVxdWVzdGVkX3NpemVfYnl0ZXNfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBVUF1ZGlvSW5wdXRTdHJlYW0pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQVVESU9fTUFDX0FVRElPX0xPV19MQVRFTkNZX0lOUFVUX01BQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL21hYy9hdWRpb19sb3dfbGF0ZW5jeV9pbnB1dF9tYWNfdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvYXVkaW8vbWFjL2F1ZGlvX2xvd19sYXRlbmN5X2lucHV0X21hY191bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThlZjMzZC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vbWFjL2F1ZGlvX2xvd19sYXRlbmN5X2lucHV0X21hY191bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDMxNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wLmgiCi0jaW5jbHVkZSAiYmFzZS90ZXN0L3Rlc3RfdGltZW91dHMuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy9wbGF0Zm9ybV90aHJlYWQuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19pby5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX21hbmFnZXJfYmFzZS5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL21hYy9hdWRpb19sb3dfbGF0ZW5jeV9pbnB1dF9tYWMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3NlZWthYmxlX2J1ZmZlci5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi11c2luZyA6OnRlc3Rpbmc6Ol87Ci11c2luZyA6OnRlc3Rpbmc6OkFueU51bWJlcjsKLXVzaW5nIDo6dGVzdGluZzo6QXRMZWFzdDsKLXVzaW5nIDo6dGVzdGluZzo6R2U7Ci11c2luZyA6OnRlc3Rpbmc6Ok5vdE51bGw7Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLUFDVElPTl9QMyhDaGVja0NvdW50QW5kUG9zdFF1aXRUYXNrLCBjb3VudCwgbGltaXQsIGxvb3ApIHsKLSAgaWYgKCsrKmNvdW50ID49IGxpbWl0KSB7Ci0gICAgbG9vcC0+UG9zdFRhc2soRlJPTV9IRVJFLCBNZXNzYWdlTG9vcDo6UXVpdENsb3N1cmUoKSk7Ci0gIH0KLX0KLQotY2xhc3MgTW9ja0F1ZGlvSW5wdXRDYWxsYmFjayA6IHB1YmxpYyBBdWRpb0lucHV0U3RyZWFtOjpBdWRpb0lucHV0Q2FsbGJhY2sgewotIHB1YmxpYzoKLSAgTU9DS19NRVRIT0Q1KE9uRGF0YSwgdm9pZChBdWRpb0lucHV0U3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHNyYywgdWludDMyIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIGhhcmR3YXJlX2RlbGF5X2J5dGVzLCBkb3VibGUgdm9sdW1lKSk7Ci0gIE1PQ0tfTUVUSE9EMShPbkNsb3NlLCB2b2lkKEF1ZGlvSW5wdXRTdHJlYW0qIHN0cmVhbSkpOwotICBNT0NLX01FVEhPRDIoT25FcnJvciwgdm9pZChBdWRpb0lucHV0U3RyZWFtKiBzdHJlYW0sIGludCBjb2RlKSk7Ci19OwotCi0vLyBUaGlzIGF1ZGlvIHNpbmsgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIHVzZWQgZm9yIG1hbnVhbCB0ZXN0cyBvbmx5IHNpbmNlCi0vLyB0aGUgcmVjb3JkZWQgZGF0YSBpcyBzdG9yZWQgb24gYSByYXcgYmluYXJ5IGRhdGEgZmlsZS4KLS8vIFRoZSBsYXN0IHRlc3QgKFdyaXRlVG9GaWxlQXVkaW9TaW5rKSAtIHdoaWNoIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgLQotLy8gY2FuIHVzZSB0aGlzIGF1ZGlvIHNpbmsgdG8gc3RvcmUgdGhlIGNhcHR1cmVkIGRhdGEgb24gYSBmaWxlIGZvciBvZmZsaW5lCi0vLyBhbmFseXNpcy4KLWNsYXNzIFdyaXRlVG9GaWxlQXVkaW9TaW5rIDogcHVibGljIEF1ZGlvSW5wdXRTdHJlYW06OkF1ZGlvSW5wdXRDYWxsYmFjayB7Ci0gcHVibGljOgotICAvLyBBbGxvY2F0ZSBzcGFjZSBmb3IgfjEwIHNlY29uZHMgb2YgZGF0YSBAIDQ4a0h6IGluIHN0ZXJlbzoKLSAgLy8gMiBieXRlcyBwZXIgc2FtcGxlLCAyIGNoYW5uZWxzLCAxMG1zIEAgNDhrSHosIDEwIHNlY29uZHMgPD0+IDE5MjAwMDAgYnl0ZXMuCi0gIHN0YXRpYyBjb25zdCBpbnQga01heEJ1ZmZlclNpemUgPSAyICogMiAqIDQ4MCAqIDEwMCAqIDEwOwotCi0gIGV4cGxpY2l0IFdyaXRlVG9GaWxlQXVkaW9TaW5rKGNvbnN0IGNoYXIqIGZpbGVfbmFtZSkKLSAgICAgIDogYnVmZmVyXygwLCBrTWF4QnVmZmVyU2l6ZSksCi0gICAgICAgIGZpbGVfKGZvcGVuKGZpbGVfbmFtZSwgIndiIikpLAotICAgICAgICBieXRlc190b193cml0ZV8oMCkgewotICB9Ci0KLSAgdmlydHVhbCB+V3JpdGVUb0ZpbGVBdWRpb1NpbmsoKSB7Ci0gICAgaW50IGJ5dGVzX3dyaXR0ZW4gPSAwOwotICAgIHdoaWxlIChieXRlc193cml0dGVuIDwgYnl0ZXNfdG9fd3JpdGVfKSB7Ci0gICAgICBjb25zdCB1aW50OCogY2h1bms7Ci0gICAgICBpbnQgY2h1bmtfc2l6ZTsKLQotICAgICAgLy8gU3RvcCB3cml0aW5nIGlmIG5vIG1vcmUgZGF0YSBpcyBhdmFpbGFibGUuCi0gICAgICBpZiAoIWJ1ZmZlcl8uR2V0Q3VycmVudENodW5rKCZjaHVuaywgJmNodW5rX3NpemUpKQotICAgICAgICBicmVhazsKLQotICAgICAgLy8gV3JpdGUgcmVjb3JkZWQgZGF0YSBjaHVuayB0byB0aGUgZmlsZSBhbmQgcHJlcGFyZSBmb3IgbmV4dCBjaHVuay4KLSAgICAgIGZ3cml0ZShjaHVuaywgMSwgY2h1bmtfc2l6ZSwgZmlsZV8pOwotICAgICAgYnVmZmVyXy5TZWVrKGNodW5rX3NpemUpOwotICAgICAgYnl0ZXNfd3JpdHRlbiArPSBjaHVua19zaXplOwotICAgIH0KLSAgICBmY2xvc2UoZmlsZV8pOwotICB9Ci0KLSAgLy8gQXVkaW9JbnB1dFN0cmVhbTo6QXVkaW9JbnB1dENhbGxiYWNrIGltcGxlbWVudGF0aW9uLgotICB2aXJ0dWFsIHZvaWQgT25EYXRhKEF1ZGlvSW5wdXRTdHJlYW0qIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogc3JjLCB1aW50MzIgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgaGFyZHdhcmVfZGVsYXlfYnl0ZXMsIGRvdWJsZSB2b2x1bWUpIHsKLSAgICAvLyBTdG9yZSBkYXRhIGRhdGEgaW4gYSB0ZW1wb3JhcnkgYnVmZmVyIHRvIGF2b2lkIG1ha2luZyBibG9ja2luZwotICAgIC8vIGZ3cml0ZSgpIGNhbGxzIGluIHRoZSBhdWRpbyBjYWxsYmFjay4gVGhlIGNvbXBsZXRlIGJ1ZmZlciB3aWxsIGJlCi0gICAgLy8gd3JpdHRlbiB0byBmaWxlIGluIHRoZSBkZXN0cnVjdG9yLgotICAgIGlmIChidWZmZXJfLkFwcGVuZChzcmMsIHNpemUpKSB7Ci0gICAgICBieXRlc190b193cml0ZV8gKz0gc2l6ZTsKLSAgICB9Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgT25DbG9zZShBdWRpb0lucHV0U3RyZWFtKiBzdHJlYW0pIHt9Ci0gIHZpcnR1YWwgdm9pZCBPbkVycm9yKEF1ZGlvSW5wdXRTdHJlYW0qIHN0cmVhbSwgaW50IGNvZGUpIHt9Ci0KLSBwcml2YXRlOgotICBtZWRpYTo6U2Vla2FibGVCdWZmZXIgYnVmZmVyXzsKLSAgRklMRSogZmlsZV87Ci0gIGludCBieXRlc190b193cml0ZV87Ci19OwotCi1jbGFzcyBNYWNBdWRpb0lucHV0VGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIE1hY0F1ZGlvSW5wdXRUZXN0KCkgOiBhdWRpb19tYW5hZ2VyXyhBdWRpb01hbmFnZXI6OkNyZWF0ZSgpKSB7fQotICB2aXJ0dWFsIH5NYWNBdWRpb0lucHV0VGVzdCgpIHt9Ci0KLSAgLy8gQ29udmVuaWVuY2UgbWV0aG9kIHdoaWNoIGVuc3VyZXMgdGhhdCB3ZSBhcmUgbm90IHJ1bm5pbmcgb24gdGhlIGJ1aWxkCi0gIC8vIGJvdHMgYW5kIHRoYXQgYXQgbGVhc3Qgb25lIHZhbGlkIGlucHV0IGRldmljZSBjYW4gYmUgZm91bmQuCi0gIGJvb2wgQ2FuUnVuQXVkaW9UZXN0cygpIHsKLSAgICBib29sIGhhc19pbnB1dCA9IGF1ZGlvX21hbmFnZXJfLT5IYXNBdWRpb0lucHV0RGV2aWNlcygpOwotICAgIGlmICghaGFzX2lucHV0KQotICAgICAgTE9HKFdBUk5JTkcpIDw8ICJObyBpbnB1dCBkZXZpY2VzIGRldGVjdGVkIjsKLSAgICByZXR1cm4gaGFzX2lucHV0OwotICB9Ci0KLSAgLy8gQ29udmVuaWVuY2UgbWV0aG9kIHdoaWNoIGNyZWF0ZXMgYSBkZWZhdWx0IEF1ZGlvSW5wdXRTdHJlYW0gb2JqZWN0IHVzaW5nCi0gIC8vIGEgMTBtcyBmcmFtZSBzaXplIGFuZCBhIHNhbXBsZSByYXRlIHdoaWNoIGlzIHNldCB0byB0aGUgaGFyZHdhcmUgc2FtcGxlCi0gIC8vIHJhdGUuCi0gIEF1ZGlvSW5wdXRTdHJlYW0qIENyZWF0ZURlZmF1bHRBdWRpb0lucHV0U3RyZWFtKCkgewotICAgIGludCBmcyA9IHN0YXRpY19jYXN0PGludD4oQVVBdWRpb0lucHV0U3RyZWFtOjpIYXJkd2FyZVNhbXBsZVJhdGUoKSk7Ci0gICAgaW50IHNhbXBsZXNfcGVyX3BhY2tldCA9IGZzIC8gMTAwOwotICAgIEF1ZGlvSW5wdXRTdHJlYW0qIGFpcyA9IGF1ZGlvX21hbmFnZXJfLT5NYWtlQXVkaW9JbnB1dFN0cmVhbSgKLSAgICAgICAgQXVkaW9QYXJhbWV0ZXJzKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xPV19MQVRFTkNZLAotICAgICAgICBDSEFOTkVMX0xBWU9VVF9TVEVSRU8sIGZzLCAxNiwgc2FtcGxlc19wZXJfcGFja2V0KSwKLSAgICAgICAgQXVkaW9NYW5hZ2VyQmFzZTo6a0RlZmF1bHREZXZpY2VJZCk7Ci0gICAgRVhQRUNUX1RSVUUoYWlzKTsKLSAgICByZXR1cm4gYWlzOwotICB9Ci0KLSAgLy8gQ29udmVuaWVuY2UgbWV0aG9kIHdoaWNoIGNyZWF0ZXMgYW4gQXVkaW9JbnB1dFN0cmVhbSBvYmplY3Qgd2l0aCBhCi0gIC8vIHNwZWNpZmllZCBjaGFubmVsIGxheW91dC4KLSAgQXVkaW9JbnB1dFN0cmVhbSogQ3JlYXRlQXVkaW9JbnB1dFN0cmVhbShDaGFubmVsTGF5b3V0IGNoYW5uZWxfbGF5b3V0KSB7Ci0gICAgaW50IGZzID0gc3RhdGljX2Nhc3Q8aW50PihBVUF1ZGlvSW5wdXRTdHJlYW06OkhhcmR3YXJlU2FtcGxlUmF0ZSgpKTsKLSAgICBpbnQgc2FtcGxlc19wZXJfcGFja2V0ID0gZnMgLyAxMDA7Ci0gICAgQXVkaW9JbnB1dFN0cmVhbSogYWlzID0gYXVkaW9fbWFuYWdlcl8tPk1ha2VBdWRpb0lucHV0U3RyZWFtKAotICAgICAgICBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTE9XX0xBVEVOQ1ksCi0gICAgICAgIGNoYW5uZWxfbGF5b3V0LCBmcywgMTYsIHNhbXBsZXNfcGVyX3BhY2tldCksCi0gICAgICAgIEF1ZGlvTWFuYWdlckJhc2U6OmtEZWZhdWx0RGV2aWNlSWQpOwotICAgIEVYUEVDVF9UUlVFKGFpcyk7Ci0gICAgcmV0dXJuIGFpczsKLSAgfQotCi0gIHNjb3BlZF9wdHI8QXVkaW9NYW5hZ2VyPiBhdWRpb19tYW5hZ2VyXzsKLX07Ci0KLS8vIFRlc3QgQ3JlYXRlKCksIENsb3NlKCkuCi1URVNUX0YoTWFjQXVkaW9JbnB1dFRlc3QsIEFVQXVkaW9JbnB1dFN0cmVhbUNyZWF0ZUFuZENsb3NlKSB7Ci0gIGlmICghQ2FuUnVuQXVkaW9UZXN0cygpKQotICAgIHJldHVybjsKLSAgQXVkaW9JbnB1dFN0cmVhbSogYWlzID0gQ3JlYXRlRGVmYXVsdEF1ZGlvSW5wdXRTdHJlYW0oKTsKLSAgYWlzLT5DbG9zZSgpOwotfQotCi0vLyBUZXN0IE9wZW4oKSwgQ2xvc2UoKS4KLVRFU1RfRihNYWNBdWRpb0lucHV0VGVzdCwgQVVBdWRpb0lucHV0U3RyZWFtT3BlbkFuZENsb3NlKSB7Ci0gIGlmICghQ2FuUnVuQXVkaW9UZXN0cygpKQotICAgIHJldHVybjsKLSAgQXVkaW9JbnB1dFN0cmVhbSogYWlzID0gQ3JlYXRlRGVmYXVsdEF1ZGlvSW5wdXRTdHJlYW0oKTsKLSAgRVhQRUNUX1RSVUUoYWlzLT5PcGVuKCkpOwotICBhaXMtPkNsb3NlKCk7Ci19Ci0KLS8vIFRlc3QgT3BlbigpLCBTdGFydCgpLCBDbG9zZSgpLgotVEVTVF9GKE1hY0F1ZGlvSW5wdXRUZXN0LCBBVUF1ZGlvSW5wdXRTdHJlYW1PcGVuU3RhcnRBbmRDbG9zZSkgewotICBpZiAoIUNhblJ1bkF1ZGlvVGVzdHMoKSkKLSAgICByZXR1cm47Ci0gIEF1ZGlvSW5wdXRTdHJlYW0qIGFpcyA9IENyZWF0ZURlZmF1bHRBdWRpb0lucHV0U3RyZWFtKCk7Ci0gIEVYUEVDVF9UUlVFKGFpcy0+T3BlbigpKTsKLSAgTW9ja0F1ZGlvSW5wdXRDYWxsYmFjayBzaW5rOwotICBhaXMtPlN0YXJ0KCZzaW5rKTsKLSAgRVhQRUNUX0NBTEwoc2luaywgT25DbG9zZShhaXMpKQotICAgICAgLlRpbWVzKDEpOwotICBhaXMtPkNsb3NlKCk7Ci19Ci0KLS8vIFRlc3QgT3BlbigpLCBTdGFydCgpLCBTdG9wKCksIENsb3NlKCkuCi1URVNUX0YoTWFjQXVkaW9JbnB1dFRlc3QsIEFVQXVkaW9JbnB1dFN0cmVhbU9wZW5TdGFydFN0b3BBbmRDbG9zZSkgewotICBpZiAoIUNhblJ1bkF1ZGlvVGVzdHMoKSkKLSAgICByZXR1cm47Ci0gIEF1ZGlvSW5wdXRTdHJlYW0qIGFpcyA9IENyZWF0ZURlZmF1bHRBdWRpb0lucHV0U3RyZWFtKCk7Ci0gIEVYUEVDVF9UUlVFKGFpcy0+T3BlbigpKTsKLSAgTW9ja0F1ZGlvSW5wdXRDYWxsYmFjayBzaW5rOwotICBhaXMtPlN0YXJ0KCZzaW5rKTsKLSAgYWlzLT5TdG9wKCk7Ci0gIEVYUEVDVF9DQUxMKHNpbmssIE9uQ2xvc2UoYWlzKSkKLSAgICAgIC5UaW1lcygxKTsKLSAgYWlzLT5DbG9zZSgpOwotfQotCi0vLyBUZXN0IHNvbWUgYWRkaXRpb25hbCBjYWxsaW5nIHNlcXVlbmNlcy4KLVRFU1RfRihNYWNBdWRpb0lucHV0VGVzdCwgQVVBdWRpb0lucHV0U3RyZWFtTWlzY0NhbGxpbmdTZXF1ZW5jZXMpIHsKLSAgaWYgKCFDYW5SdW5BdWRpb1Rlc3RzKCkpCi0gICAgcmV0dXJuOwotICBBdWRpb0lucHV0U3RyZWFtKiBhaXMgPSBDcmVhdGVEZWZhdWx0QXVkaW9JbnB1dFN0cmVhbSgpOwotICBBVUF1ZGlvSW5wdXRTdHJlYW0qIGF1YWlzID0gc3RhdGljX2Nhc3Q8QVVBdWRpb0lucHV0U3RyZWFtKj4oYWlzKTsKLQotICAvLyBPcGVuKCksIE9wZW4oKSBzaG91bGQgZmFpbCB0aGUgc2Vjb25kIHRpbWUuCi0gIEVYUEVDVF9UUlVFKGFpcy0+T3BlbigpKTsKLSAgRVhQRUNUX0ZBTFNFKGFpcy0+T3BlbigpKTsKLQotICBNb2NrQXVkaW9JbnB1dENhbGxiYWNrIHNpbms7Ci0KLSAgLy8gU3RhcnQoKSwgU3RhcnQoKSBpcyBhIHZhbGlkIGNhbGxpbmcgc2VxdWVuY2UgKHNlY29uZCBjYWxsIGRvZXMgbm90aGluZykuCi0gIGFpcy0+U3RhcnQoJnNpbmspOwotICBFWFBFQ1RfVFJVRShhdWFpcy0+c3RhcnRlZCgpKTsKLSAgYWlzLT5TdGFydCgmc2luayk7Ci0gIEVYUEVDVF9UUlVFKGF1YWlzLT5zdGFydGVkKCkpOwotCi0gIC8vIFN0b3AoKSwgU3RvcCgpIGlzIGEgdmFsaWQgY2FsbGluZyBzZXF1ZW5jZSAoc2Vjb25kIGNhbGwgZG9lcyBub3RoaW5nKS4KLSAgYWlzLT5TdG9wKCk7Ci0gIEVYUEVDVF9GQUxTRShhdWFpcy0+c3RhcnRlZCgpKTsKLSAgYWlzLT5TdG9wKCk7Ci0gIEVYUEVDVF9GQUxTRShhdWFpcy0+c3RhcnRlZCgpKTsKLQotICBFWFBFQ1RfQ0FMTChzaW5rLCBPbkNsb3NlKGFpcykpCi0gICAgICAuVGltZXMoMSk7Ci0gIGFpcy0+Q2xvc2UoKTsKLX0KLQotLy8gVmVyaWZ5IHRoYXQgcmVjb3JkaW5nIHN0YXJ0cyBhbmQgc3RvcHMgY29ycmVjdGx5IGluIG1vbm8gdXNpbmcgbW9ja2VkIHNpbmsuCi1URVNUX0YoTWFjQXVkaW9JbnB1dFRlc3QsIEFVQXVkaW9JbnB1dFN0cmVhbVZlcmlmeU1vbm9SZWNvcmRpbmcpIHsKLSAgaWYgKCFDYW5SdW5BdWRpb1Rlc3RzKCkpCi0gICAgcmV0dXJuOwotCi0gIGludCBjb3VudCA9IDA7Ci0gIE1lc3NhZ2VMb29wRm9yVUkgbG9vcDsKLQotICAvLyBDcmVhdGUgYW4gYXVkaW8gaW5wdXQgc3RyZWFtIHdoaWNoIHJlY29yZHMgaW4gbW9uby4KLSAgQXVkaW9JbnB1dFN0cmVhbSogYWlzID0gQ3JlYXRlQXVkaW9JbnB1dFN0cmVhbShDSEFOTkVMX0xBWU9VVF9NT05PKTsKLSAgRVhQRUNUX1RSVUUoYWlzLT5PcGVuKCkpOwotCi0gIGludCBmcyA9IHN0YXRpY19jYXN0PGludD4oQVVBdWRpb0lucHV0U3RyZWFtOjpIYXJkd2FyZVNhbXBsZVJhdGUoKSk7Ci0gIGludCBzYW1wbGVzX3Blcl9wYWNrZXQgPSBmcyAvIDEwMDsKLSAgaW50IGJpdHNfcGVyX3NhbXBsZSA9IDE2OwotICB1aW50MzIgYnl0ZXNfcGVyX3BhY2tldCA9IHNhbXBsZXNfcGVyX3BhY2tldCAqIChiaXRzX3Blcl9zYW1wbGUgLyA4KTsKLQotICBNb2NrQXVkaW9JbnB1dENhbGxiYWNrIHNpbms7Ci0KLSAgLy8gV2UgdXNlIDEwbXMgcGFja2V0cyBhbmQgd2lsbCBydW4gdGhlIHRlc3QgdW50aWwgdGVuIHBhY2tldHMgYXJlIHJlY2VpdmVkLgotICAvLyBBbGwgc2hvdWxkIGNvbnRhaW4gdmFsaWQgcGFja2V0cyBvZiB0aGUgc2FtZSBzaXplIGFuZCBhIHZhbGlkIGRlbGF5Ci0gIC8vIGVzdGltYXRlLgotICBFWFBFQ1RfQ0FMTChzaW5rLCBPbkRhdGEoYWlzLCBOb3ROdWxsKCksIGJ5dGVzX3Blcl9wYWNrZXQsIF8sIF8pKQotICAgICAgLlRpbWVzKEF0TGVhc3QoMTApKQotICAgICAgLldpbGxSZXBlYXRlZGx5KENoZWNrQ291bnRBbmRQb3N0UXVpdFRhc2soJmNvdW50LCAxMCwgJmxvb3ApKTsKLSAgYWlzLT5TdGFydCgmc2luayk7Ci0gIGxvb3AuUnVuKCk7Ci0gIGFpcy0+U3RvcCgpOwotCi0gIC8vIFZlcmlmeSB0aGF0IHRoZSBzaW5rIHJlY2VpZXZlcyBPbkNsb3NlKCkgY2FsbCB3aGVuIGNhbGxpbmcgQ2xvc2UoKS4KLSAgRVhQRUNUX0NBTEwoc2luaywgT25DbG9zZShhaXMpKQotICAgICAgLlRpbWVzKDEpOwotICBhaXMtPkNsb3NlKCk7Ci19Ci0KLS8vIFZlcmlmeSB0aGF0IHJlY29yZGluZyBzdGFydHMgYW5kIHN0b3BzIGNvcnJlY3RseSBpbiBtb25vIHVzaW5nIG1vY2tlZCBzaW5rLgotVEVTVF9GKE1hY0F1ZGlvSW5wdXRUZXN0LCBBVUF1ZGlvSW5wdXRTdHJlYW1WZXJpZnlTdGVyZW9SZWNvcmRpbmcpIHsKLSAgaWYgKCFDYW5SdW5BdWRpb1Rlc3RzKCkpCi0gICAgcmV0dXJuOwotCi0gIGludCBjb3VudCA9IDA7Ci0gIE1lc3NhZ2VMb29wRm9yVUkgbG9vcDsKLQotICAvLyBDcmVhdGUgYW4gYXVkaW8gaW5wdXQgc3RyZWFtIHdoaWNoIHJlY29yZHMgaW4gc3RlcmVvLgotICBBdWRpb0lucHV0U3RyZWFtKiBhaXMgPSBDcmVhdGVBdWRpb0lucHV0U3RyZWFtKENIQU5ORUxfTEFZT1VUX1NURVJFTyk7Ci0gIEVYUEVDVF9UUlVFKGFpcy0+T3BlbigpKTsKLQotICBpbnQgZnMgPSBzdGF0aWNfY2FzdDxpbnQ+KEFVQXVkaW9JbnB1dFN0cmVhbTo6SGFyZHdhcmVTYW1wbGVSYXRlKCkpOwotICBpbnQgc2FtcGxlc19wZXJfcGFja2V0ID0gZnMgLyAxMDA7Ci0gIGludCBiaXRzX3Blcl9zYW1wbGUgPSAxNjsKLSAgdWludDMyIGJ5dGVzX3Blcl9wYWNrZXQgPSAyICogc2FtcGxlc19wZXJfcGFja2V0ICogKGJpdHNfcGVyX3NhbXBsZSAvIDgpOwotCi0gIE1vY2tBdWRpb0lucHV0Q2FsbGJhY2sgc2luazsKLQotICAvLyBXZSB1c2UgMTBtcyBwYWNrZXRzIGFuZCB3aWxsIHJ1biB0aGUgdGVzdCB1bnRpbCB0ZW4gcGFja2V0cyBhcmUgcmVjZWl2ZWQuCi0gIC8vIEFsbCBzaG91bGQgY29udGFpbiB2YWxpZCBwYWNrZXRzIG9mIHRoZSBzYW1lIHNpemUgYW5kIGEgdmFsaWQgZGVsYXkKLSAgLy8gZXN0aW1hdGUuCi0gIC8vIFRPRE8oaGVucmlrYSk6IGh0dHA6Ly9jcmJ1Zy5jb20vMTU0MzUyIGZvcmNlZCB1cyB0byBydW4gdGhlIGNhcHR1cmUgc2lkZQotICAvLyB1c2luZyBhIG5hdGl2ZSBidWZmZXIgc2l6ZSBvZiAxMjggYXVkaW8gZnJhbWVzIGFuZCBjb21iaW5lIGl0IHdpdGggYSBGSUZPCi0gIC8vIHRvIG1hdGNoIHRoZSByZXF1ZXN0ZWQgc2l6ZSBieSB0aGUgY2xpZW50LiBUaGlzIGNoYW5nZSBtaWdodCBhbHNvIGhhdmUKLSAgLy8gbW9kaWZpZWQgdGhlIGRlbGF5IGVzdGltYXRlcyBzaW5jZSB0aGUgZXhpc3RpbmcgR2UoYnl0ZXNfcGVyX3BhY2tldCkgZm9yCi0gIC8vIHBhcmFtZXRlciAjNCBkb2VzIG5vIGxvbmdlciBwYXNzLiBJIGFtIHJlbW92aW5nIHRoaXMgcmVzdHJpY3Rpb24gaGVyZSB0bwotICAvLyBlbnN1cmUgdGhhdCB3ZSBjYW4gbGFuZCB0aGUgcGF0Y2ggYnV0IHdpbGwgcmV2aXNpdCB0aGlzIHRlc3QgYWdhaW4gd2hlbgotICAvLyBtb3JlIGFuYWx5c2lzIG9mIHRoZSBkZWxheSBlc3RpbWF0ZXMgYXJlIGRvbmUuCi0gIEVYUEVDVF9DQUxMKHNpbmssIE9uRGF0YShhaXMsIE5vdE51bGwoKSwgYnl0ZXNfcGVyX3BhY2tldCwgXywgXykpCi0gICAgICAuVGltZXMoQXRMZWFzdCgxMCkpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoQ2hlY2tDb3VudEFuZFBvc3RRdWl0VGFzaygmY291bnQsIDEwLCAmbG9vcCkpOwotICBhaXMtPlN0YXJ0KCZzaW5rKTsKLSAgbG9vcC5SdW4oKTsKLSAgYWlzLT5TdG9wKCk7Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgdGhlIHNpbmsgcmVjZWlldmVzIE9uQ2xvc2UoKSBjYWxsIHdoZW4gY2FsbGluZyBDbG9zZSgpLgotICBFWFBFQ1RfQ0FMTChzaW5rLCBPbkNsb3NlKGFpcykpCi0gICAgICAuVGltZXMoMSk7Ci0gIGFpcy0+Q2xvc2UoKTsKLX0KLQotLy8gVGhpcyB0ZXN0IGlzIGludGVuZGVkIGZvciBtYW51YWwgdGVzdHMgYW5kIHNob3VsZCBvbmx5IGJlIGVuYWJsZWQKLS8vIHdoZW4gaXQgaXMgcmVxdWlyZWQgdG8gc3RvcmUgdGhlIGNhcHR1cmVkIGRhdGEgb24gYSBsb2NhbCBmaWxlLgotLy8gQnkgZGVmYXVsdCwgR1Rlc3Qgd2lsbCBwcmludCBvdXQgWU9VIEhBVkUgMSBESVNBQkxFRCBURVNULgotLy8gVG8gaW5jbHVkZSBkaXNhYmxlZCB0ZXN0cyBpbiB0ZXN0IGV4ZWN1dGlvbiwganVzdCBpbnZva2UgdGhlIHRlc3QgcHJvZ3JhbQotLy8gd2l0aCAtLWd0ZXN0X2Fsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIG9yIHNldCB0aGUgR1RFU1RfQUxTT19SVU5fRElTQUJMRURfVEVTVFMKLS8vIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGEgdmFsdWUgZ3JlYXRlciB0aGFuIDAuCi1URVNUX0YoTWFjQXVkaW9JbnB1dFRlc3QsIERJU0FCTEVEX0FVQXVkaW9JbnB1dFN0cmVhbVJlY29yZFRvRmlsZSkgewotICBpZiAoIUNhblJ1bkF1ZGlvVGVzdHMoKSkKLSAgICByZXR1cm47Ci0gIGNvbnN0IGNoYXIqIGZpbGVfbmFtZSA9ICJvdXRfc3RlcmVvXzEwc2VjLnBjbSI7Ci0KLSAgaW50IGZzID0gc3RhdGljX2Nhc3Q8aW50PihBVUF1ZGlvSW5wdXRTdHJlYW06OkhhcmR3YXJlU2FtcGxlUmF0ZSgpKTsKLSAgQXVkaW9JbnB1dFN0cmVhbSogYWlzID0gQ3JlYXRlRGVmYXVsdEF1ZGlvSW5wdXRTdHJlYW0oKTsKLSAgRVhQRUNUX1RSVUUoYWlzLT5PcGVuKCkpOwotCi0gIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgRmlsZSBuYW1lICA6ICVzXG4iLCBmaWxlX25hbWUpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgIFNhbXBsZSByYXRlOiAlZFxuIiwgZnMpOwotICBXcml0ZVRvRmlsZUF1ZGlvU2luayBmaWxlX3NpbmsoZmlsZV9uYW1lKTsKLSAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICA+PiBTcGVhayBpbnRvIHRoZSBtaWMgd2hpbGUgcmVjb3JkaW5nLi4uXG4iKTsKLSAgYWlzLT5TdGFydCgmZmlsZV9zaW5rKTsKLSAgYmFzZTo6UGxhdGZvcm1UaHJlYWQ6OlNsZWVwKFRlc3RUaW1lb3V0czo6YWN0aW9uX3RpbWVvdXQoKSk7Ci0gIGFpcy0+U3RvcCgpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgID4+IFJlY29yZGluZyBoYXMgc3RvcHBlZC5cbiIpOwotICBhaXMtPkNsb3NlKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL21hYy9hdWRpb19sb3dfbGF0ZW5jeV9vdXRwdXRfbWFjLmNjIGIvc3JjL21lZGlhL2F1ZGlvL21hYy9hdWRpb19sb3dfbGF0ZW5jeV9vdXRwdXRfbWFjLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODE4MmIwLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9tYWMvYXVkaW9fbG93X2xhdGVuY3lfb3V0cHV0X21hYy5jYworKysgL2Rldi9udWxsCkBAIC0xLDQwMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vbWFjL2F1ZGlvX2xvd19sYXRlbmN5X291dHB1dF9tYWMuaCIKLQotI2luY2x1ZGUgPENvcmVTZXJ2aWNlcy9Db3JlU2VydmljZXMuaD4KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgImJhc2UvY29tbWFuZF9saW5lLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS9tYWMvbWFjX2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb191dGlsLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vbWFjL2F1ZGlvX21hbmFnZXJfbWFjLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9zd2l0Y2hlcy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1zdGF0aWMgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbiYgZm9ybWF0KSB7Ci0gIG9zIDw8ICJzYW1wbGUgcmF0ZSAgICAgICA6ICIgPDwgZm9ybWF0Lm1TYW1wbGVSYXRlIDw8IHN0ZDo6ZW5kbAotICAgICA8PCAiZm9ybWF0IElEICAgICAgICAgOiAiIDw8IGZvcm1hdC5tRm9ybWF0SUQgPDwgc3RkOjplbmRsCi0gICAgIDw8ICJmb3JtYXQgZmxhZ3MgICAgICA6ICIgPDwgZm9ybWF0Lm1Gb3JtYXRGbGFncyA8PCBzdGQ6OmVuZGwKLSAgICAgPDwgImJ5dGVzIHBlciBwYWNrZXQgIDogIiA8PCBmb3JtYXQubUJ5dGVzUGVyUGFja2V0IDw8IHN0ZDo6ZW5kbAotICAgICA8PCAiZnJhbWVzIHBlciBwYWNrZXQgOiAiIDw8IGZvcm1hdC5tRnJhbWVzUGVyUGFja2V0IDw8IHN0ZDo6ZW5kbAotICAgICA8PCAiYnl0ZXMgcGVyIGZyYW1lICAgOiAiIDw8IGZvcm1hdC5tQnl0ZXNQZXJGcmFtZSA8PCBzdGQ6OmVuZGwKLSAgICAgPDwgImNoYW5uZWxzIHBlciBmcmFtZTogIiA8PCBmb3JtYXQubUNoYW5uZWxzUGVyRnJhbWUgPDwgc3RkOjplbmRsCi0gICAgIDw8ICJiaXRzIHBlciBjaGFubmVsICA6ICIgPDwgZm9ybWF0Lm1CaXRzUGVyQ2hhbm5lbDsKLSAgcmV0dXJuIG9zOwotfQotCi1zdGF0aWMgQXVkaW9PYmplY3RQcm9wZXJ0eUFkZHJlc3Mga0RlZmF1bHRPdXRwdXREZXZpY2VBZGRyZXNzID0gewotICBrQXVkaW9IYXJkd2FyZVByb3BlcnR5RGVmYXVsdE91dHB1dERldmljZSwKLSAga0F1ZGlvT2JqZWN0UHJvcGVydHlTY29wZUdsb2JhbCwKLSAga0F1ZGlvT2JqZWN0UHJvcGVydHlFbGVtZW50TWFzdGVyCi19OwotCi0vLyBPdmVydmlldyBvZiBvcGVyYXRpb246Ci0vLyAxKSBBbiBvYmplY3Qgb2YgQVVBdWRpb091dHB1dFN0cmVhbSBpcyBjcmVhdGVkIGJ5IHRoZSBBdWRpb01hbmFnZXIKLS8vIGZhY3Rvcnk6IGF1ZGlvX21hbi0+TWFrZUF1ZGlvU3RyZWFtKCkuCi0vLyAyKSBOZXh0IHNvbWUgdGhyZWFkIHdpbGwgY2FsbCBPcGVuKCksIGF0IHRoYXQgcG9pbnQgdGhlIHVuZGVybHlpbmcKLS8vIGRlZmF1bHQgb3V0cHV0IEF1ZGlvIFVuaXQgaXMgY3JlYXRlZCBhbmQgY29uZmlndXJlZC4KLS8vIDMpIFRoZW4gc29tZSB0aHJlYWQgd2lsbCBjYWxsIFN0YXJ0KHNvdXJjZSkuCi0vLyBUaGVuIHRoZSBBdWRpbyBVbml0IGlzIHN0YXJ0ZWQgd2hpY2ggY3JlYXRlcyBpdHMgb3duIHRocmVhZCB3aGljaAotLy8gcGVyaW9kaWNhbGx5IHdpbGwgY2FsbCB0aGUgc291cmNlIGZvciBtb3JlIGRhdGEgYXMgYnVmZmVycyBhcmUgYmVpbmcKLS8vIGNvbnN1bWVkLgotLy8gNCkgQXQgc29tZSBwb2ludCBzb21lIHRocmVhZCB3aWxsIGNhbGwgU3RvcCgpLCB3aGljaCB3ZSBoYW5kbGUgYnkgZGlyZWN0bHkKLS8vIHN0b3BwaW5nIHRoZSBkZWZhdWx0IG91dHB1dCBBdWRpbyBVbml0LgotLy8gNikgVGhlIHNhbWUgdGhyZWFkIHRoYXQgY2FsbGVkIHN0b3Agd2lsbCBjYWxsIENsb3NlKCkgd2hlcmUgd2UgY2xlYW51cAotLy8gYW5kIG5vdGlmeSB0aGUgYXVkaW8gbWFuYWdlciwgd2hpY2ggbGlrZWx5IHdpbGwgZGVzdHJveSB0aGlzIG9iamVjdC4KLQotQVVBdWRpb091dHB1dFN0cmVhbTo6QVVBdWRpb091dHB1dFN0cmVhbSgKLSAgICBBdWRpb01hbmFnZXJNYWMqIG1hbmFnZXIsIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKQotICAgIDogbWFuYWdlcl8obWFuYWdlciksCi0gICAgICBzb3VyY2VfKE5VTEwpLAotICAgICAgb3V0cHV0X3VuaXRfKDApLAotICAgICAgb3V0cHV0X2RldmljZV9pZF8oa0F1ZGlvT2JqZWN0VW5rbm93biksCi0gICAgICB2b2x1bWVfKDEpLAotICAgICAgaGFyZHdhcmVfbGF0ZW5jeV9mcmFtZXNfKDApLAotICAgICAgc3RvcHBlZF8oZmFsc2UpLAotICAgICAgYXVkaW9fYnVzXyhBdWRpb0J1czo6Q3JlYXRlKHBhcmFtcykpIHsKLSAgLy8gV2UgbXVzdCBoYXZlIGEgbWFuYWdlci4KLSAgRENIRUNLKG1hbmFnZXJfKTsKLQotICAvLyBBIGZyYW1lIGlzIG9uZSBzYW1wbGUgYWNyb3NzIGFsbCBjaGFubmVscy4gSW4gaW50ZXJsZWF2ZWQgYXVkaW8gdGhlIHBlcgotICAvLyBmcmFtZSBmaWVsZHMgaWRlbnRpZnkgdGhlIHNldCBvZiBuIHxjaGFubmVsc3wuIEluIHVuY29tcHJlc3NlZCBhdWRpbywgYQotICAvLyBwYWNrZXQgaXMgYWx3YXlzIG9uZSBmcmFtZS4KLSAgZm9ybWF0Xy5tU2FtcGxlUmF0ZSA9IHBhcmFtcy5zYW1wbGVfcmF0ZSgpOwotICBmb3JtYXRfLm1Gb3JtYXRJRCA9IGtBdWRpb0Zvcm1hdExpbmVhclBDTTsKLSAgZm9ybWF0Xy5tRm9ybWF0RmxhZ3MgPSBrTGluZWFyUENNRm9ybWF0RmxhZ0lzUGFja2VkIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICBrTGluZWFyUENNRm9ybWF0RmxhZ0lzU2lnbmVkSW50ZWdlcjsKLSAgZm9ybWF0Xy5tQml0c1BlckNoYW5uZWwgPSBwYXJhbXMuYml0c19wZXJfc2FtcGxlKCk7Ci0gIGZvcm1hdF8ubUNoYW5uZWxzUGVyRnJhbWUgPSBwYXJhbXMuY2hhbm5lbHMoKTsKLSAgZm9ybWF0Xy5tRnJhbWVzUGVyUGFja2V0ID0gMTsKLSAgZm9ybWF0Xy5tQnl0ZXNQZXJQYWNrZXQgPSAoZm9ybWF0Xy5tQml0c1BlckNoYW5uZWwgKiBwYXJhbXMuY2hhbm5lbHMoKSkgLyA4OwotICBmb3JtYXRfLm1CeXRlc1BlckZyYW1lID0gZm9ybWF0Xy5tQnl0ZXNQZXJQYWNrZXQ7Ci0gIGZvcm1hdF8ubVJlc2VydmVkID0gMDsKLQotICBEVkxPRygxKSA8PCAiRGVzaXJlZCBvdXB1dCBmb3JtYXQ6ICIgPDwgZm9ybWF0XzsKLQotICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBzYW1wbGUgZnJhbWVzIHBlciBjYWxsYmFjay4KLSAgbnVtYmVyX29mX2ZyYW1lc18gPSBwYXJhbXMuR2V0Qnl0ZXNQZXJCdWZmZXIoKSAvIGZvcm1hdF8ubUJ5dGVzUGVyUGFja2V0OwotICBEVkxPRygxKSA8PCAiTnVtYmVyIG9mIGZyYW1lcyBwZXIgY2FsbGJhY2s6ICIgPDwgbnVtYmVyX29mX2ZyYW1lc187Ci0gIENIRUNLX0VRKG51bWJlcl9vZl9mcmFtZXNfLCBHZXRBdWRpb0hhcmR3YXJlQnVmZmVyU2l6ZSgpKTsKLX0KLQotQVVBdWRpb091dHB1dFN0cmVhbTo6fkFVQXVkaW9PdXRwdXRTdHJlYW0oKSB7Ci19Ci0KLWJvb2wgQVVBdWRpb091dHB1dFN0cmVhbTo6T3BlbigpIHsKLSAgLy8gT2J0YWluIHRoZSBjdXJyZW50IGlucHV0IGRldmljZSBzZWxlY3RlZCBieSB0aGUgdXNlci4KLSAgVUludDMyIHNpemUgPSBzaXplb2Yob3V0cHV0X2RldmljZV9pZF8pOwotICBPU1N0YXR1cyByZXN1bHQgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YShrQXVkaW9PYmplY3RTeXN0ZW1PYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrRGVmYXVsdE91dHB1dERldmljZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0X2RldmljZV9pZF8pOwotICBpZiAocmVzdWx0ICE9IG5vRXJyIHx8IG91dHB1dF9kZXZpY2VfaWRfID09IGtBdWRpb09iamVjdFVua25vd24pIHsKLSAgICBPU1NUQVRVU19ETE9HKFdBUk5JTkcsIHJlc3VsdCkKLSAgICAgICAgPDwgIkNvdWxkIG5vdCBnZXQgZGVmYXVsdCBhdWRpbyBvdXRwdXQgZGV2aWNlLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gT3BlbiBhbmQgaW5pdGlhbGl6ZSB0aGUgRGVmYXVsdE91dHB1dFVuaXQuCi0gIEF1ZGlvQ29tcG9uZW50IGNvbXA7Ci0gIEF1ZGlvQ29tcG9uZW50RGVzY3JpcHRpb24gZGVzYzsKLQotICBkZXNjLmNvbXBvbmVudFR5cGUgPSBrQXVkaW9Vbml0VHlwZV9PdXRwdXQ7Ci0gIGRlc2MuY29tcG9uZW50U3ViVHlwZSA9IGtBdWRpb1VuaXRTdWJUeXBlX0RlZmF1bHRPdXRwdXQ7Ci0gIGRlc2MuY29tcG9uZW50TWFudWZhY3R1cmVyID0ga0F1ZGlvVW5pdE1hbnVmYWN0dXJlcl9BcHBsZTsKLSAgZGVzYy5jb21wb25lbnRGbGFncyA9IDA7Ci0gIGRlc2MuY29tcG9uZW50RmxhZ3NNYXNrID0gMDsKLSAgY29tcCA9IEF1ZGlvQ29tcG9uZW50RmluZE5leHQoMCwgJmRlc2MpOwotICBpZiAoIWNvbXApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJlc3VsdCA9IEF1ZGlvQ29tcG9uZW50SW5zdGFuY2VOZXcoY29tcCwgJm91dHB1dF91bml0Xyk7Ci0gIGlmIChyZXN1bHQgIT0gbm9FcnIpIHsKLSAgICBPU1NUQVRVU19ETE9HKFdBUk5JTkcsIHJlc3VsdCkgPDwgIkF1ZGlvQ29tcG9uZW50SW5zdGFuY2VOZXcoKSBmYWlsZWQuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXN1bHQgPSBBdWRpb1VuaXRJbml0aWFsaXplKG91dHB1dF91bml0Xyk7Ci0gIGlmIChyZXN1bHQgIT0gbm9FcnIpIHsKLSAgICBPU1NUQVRVU19ETE9HKFdBUk5JTkcsIHJlc3VsdCkgPDwgIkF1ZGlvVW5pdEluaXRpYWxpemUoKSBmYWlsZWQuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBoYXJkd2FyZV9sYXRlbmN5X2ZyYW1lc18gPSBHZXRIYXJkd2FyZUxhdGVuY3koKTsKLQotICByZXR1cm4gQ29uZmlndXJlKCk7Ci19Ci0KLWJvb2wgQVVBdWRpb091dHB1dFN0cmVhbTo6Q29uZmlndXJlKCkgewotICAvLyBTZXQgdGhlIHJlbmRlciBjYWxsYmFjay4KLSAgQVVSZW5kZXJDYWxsYmFja1N0cnVjdCBpbnB1dDsKLSAgaW5wdXQuaW5wdXRQcm9jID0gSW5wdXRQcm9jOwotICBpbnB1dC5pbnB1dFByb2NSZWZDb24gPSB0aGlzOwotICBPU1N0YXR1cyByZXN1bHQgPSBBdWRpb1VuaXRTZXRQcm9wZXJ0eSgKLSAgICAgIG91dHB1dF91bml0XywKLSAgICAgIGtBdWRpb1VuaXRQcm9wZXJ0eV9TZXRSZW5kZXJDYWxsYmFjaywKLSAgICAgIGtBdWRpb1VuaXRTY29wZV9HbG9iYWwsCi0gICAgICAwLAotICAgICAgJmlucHV0LAotICAgICAgc2l6ZW9mKGlucHV0KSk7Ci0gIGlmIChyZXN1bHQgIT0gbm9FcnIpIHsKLSAgICBPU1NUQVRVU19ETE9HKFdBUk5JTkcsIHJlc3VsdCkKLSAgICAgIDw8ICJBdWRpb1VuaXRTZXRQcm9wZXJ0eShrQXVkaW9Vbml0UHJvcGVydHlfU2V0UmVuZGVyQ2FsbGJhY2spIGZhaWxlZC4iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFNldCB0aGUgc3RyZWFtIGZvcm1hdC4KLSAgcmVzdWx0ID0gQXVkaW9Vbml0U2V0UHJvcGVydHkoCi0gICAgICBvdXRwdXRfdW5pdF8sCi0gICAgICBrQXVkaW9Vbml0UHJvcGVydHlfU3RyZWFtRm9ybWF0LAotICAgICAga0F1ZGlvVW5pdFNjb3BlX0lucHV0LAotICAgICAgMCwKLSAgICAgICZmb3JtYXRfLAotICAgICAgc2l6ZW9mKGZvcm1hdF8pKTsKLSAgaWYgKHJlc3VsdCAhPSBub0VycikgewotICAgIE9TU1RBVFVTX0RMT0coV0FSTklORywgcmVzdWx0KQotICAgICAgICA8PCAiQXVkaW9Vbml0U2V0UHJvcGVydHkoa0F1ZGlvVW5pdFByb3BlcnR5X1N0cmVhbUZvcm1hdCkgZmFpbGVkLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gU2V0IHRoZSBidWZmZXIgZnJhbWUgc2l6ZS4KLSAgLy8gV0FSTklORzogU2V0dGluZyB0aGlzIHZhbHVlIGNoYW5nZXMgdGhlIGZyYW1lIHNpemUgZm9yIGFsbCBhdWRpbyB1bml0cyBpbgotICAvLyB0aGUgY3VycmVudCBwcm9jZXNzLiAgSXQncyBpbXBlcmF0aXZlIHRoYXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgZnJhbWUgc2l6ZXMKLSAgLy8gYmUgdGhlIHNhbWUgYXMgYXVkaW9fdXRpbDo6R2V0QXVkaW9IYXJkd2FyZUJ1ZmZlclNpemUoKS4KLSAgLy8gU2VlIGh0dHA6Ly9jcmJ1Zy5jb20vMTU0MzUyIGZvciBkZXRhaWxzLgotICBVSW50MzIgYnVmZmVyX3NpemUgPSBudW1iZXJfb2ZfZnJhbWVzXzsKLSAgcmVzdWx0ID0gQXVkaW9Vbml0U2V0UHJvcGVydHkoCi0gICAgICBvdXRwdXRfdW5pdF8sCi0gICAgICBrQXVkaW9EZXZpY2VQcm9wZXJ0eUJ1ZmZlckZyYW1lU2l6ZSwKLSAgICAgIGtBdWRpb1VuaXRTY29wZV9PdXRwdXQsCi0gICAgICAwLAotICAgICAgJmJ1ZmZlcl9zaXplLAotICAgICAgc2l6ZW9mKGJ1ZmZlcl9zaXplKSk7Ci0gIGlmIChyZXN1bHQgIT0gbm9FcnIpIHsKLSAgICBPU1NUQVRVU19ETE9HKFdBUk5JTkcsIHJlc3VsdCkKLSAgICAgICAgPDwgIkF1ZGlvVW5pdFNldFByb3BlcnR5KGtBdWRpb0RldmljZVByb3BlcnR5QnVmZmVyRnJhbWVTaXplKSBmYWlsZWQuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBBVUF1ZGlvT3V0cHV0U3RyZWFtOjpDbG9zZSgpIHsKLSAgaWYgKG91dHB1dF91bml0XykKLSAgICBBdWRpb0NvbXBvbmVudEluc3RhbmNlRGlzcG9zZShvdXRwdXRfdW5pdF8pOwotCi0gIC8vIEluZm9ybSB0aGUgYXVkaW8gbWFuYWdlciB0aGF0IHdlIGhhdmUgYmVlbiBjbG9zZWQuIFRoaXMgY2FuIGNhdXNlIG91cgotICAvLyBkZXN0cnVjdGlvbi4KLSAgbWFuYWdlcl8tPlJlbGVhc2VPdXRwdXRTdHJlYW0odGhpcyk7Ci19Ci0KLXZvaWQgQVVBdWRpb091dHB1dFN0cmVhbTo6U3RhcnQoQXVkaW9Tb3VyY2VDYWxsYmFjayogY2FsbGJhY2spIHsKLSAgRENIRUNLKGNhbGxiYWNrKTsKLSAgaWYgKCFvdXRwdXRfdW5pdF8pIHsKLSAgICBETE9HKEVSUk9SKSA8PCAiT3BlbigpIGhhcyBub3QgYmVlbiBjYWxsZWQgc3VjY2Vzc2Z1bGx5IjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdG9wcGVkXyA9IGZhbHNlOwotICBzb3VyY2VfID0gY2FsbGJhY2s7Ci0KLSAgQXVkaW9PdXRwdXRVbml0U3RhcnQob3V0cHV0X3VuaXRfKTsKLX0KLQotdm9pZCBBVUF1ZGlvT3V0cHV0U3RyZWFtOjpTdG9wKCkgewotICAvLyBXZSByZXF1ZXN0IGEgc3luY2hyb25vdXMgc3RvcCwgc28gdGhlIG5leHQgY2FsbCBjYW4gdGFrZSBzb21lIHRpbWUuIEluCi0gIC8vIHRoZSB3aW5kb3dzIGltcGxlbWVudGF0aW9uIHdlIGJsb2NrIGhlcmUgYXMgd2VsbC4KLSAgaWYgKHN0b3BwZWRfKQotICAgIHJldHVybjsKLQotICBBdWRpb091dHB1dFVuaXRTdG9wKG91dHB1dF91bml0Xyk7Ci0KLSAgc291cmNlXyA9IE5VTEw7Ci0gIHN0b3BwZWRfID0gdHJ1ZTsKLX0KLQotdm9pZCBBVUF1ZGlvT3V0cHV0U3RyZWFtOjpTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgewotICBpZiAoIW91dHB1dF91bml0XykKLSAgICByZXR1cm47Ci0gIHZvbHVtZV8gPSBzdGF0aWNfY2FzdDxmbG9hdD4odm9sdW1lKTsKLQotICAvLyBUT0RPKGNyb2dlcnMpOiBzZXQgdm9sdW1lIHByb3BlcnR5Ci19Ci0KLXZvaWQgQVVBdWRpb091dHB1dFN0cmVhbTo6R2V0Vm9sdW1lKGRvdWJsZSogdm9sdW1lKSB7Ci0gIGlmICghb3V0cHV0X3VuaXRfKQotICAgIHJldHVybjsKLSAgKnZvbHVtZSA9IHZvbHVtZV87Ci19Ci0KLS8vIFB1bGxzIG9uIG91ciBwcm92aWRlciB0byBnZXQgcmVuZGVyZWQgYXVkaW8gc3RyZWFtLgotLy8gTm90ZSB0byBmdXR1cmUgaGFja2VycyBvZiB0aGlzIGZ1bmN0aW9uOiBEbyBub3QgYWRkIGxvY2tzIGhlcmUgYmVjYXVzZSB0aGlzCi0vLyBpcyBydW5uaW5nIG9uIGEgcmVhbC10aW1lIHRocmVhZCAoZm9yIGxvdy1sYXRlbmN5KS4KLU9TU3RhdHVzIEFVQXVkaW9PdXRwdXRTdHJlYW06OlJlbmRlcihVSW50MzIgbnVtYmVyX29mX2ZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlckxpc3QqIGlvX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9UaW1lU3RhbXAqIG91dHB1dF90aW1lX3N0YW1wKSB7Ci0gIC8vIFVwZGF0ZSB0aGUgcGxheW91dCBsYXRlbmN5LgotICBkb3VibGUgcGxheW91dF9sYXRlbmN5X2ZyYW1lcyA9IEdldFBsYXlvdXRMYXRlbmN5KG91dHB1dF90aW1lX3N0YW1wKTsKLQotICBBdWRpb0J1ZmZlciYgYnVmZmVyID0gaW9fZGF0YS0+bUJ1ZmZlcnNbMF07Ci0gIHVpbnQ4KiBhdWRpb19kYXRhID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KGJ1ZmZlci5tRGF0YSk7Ci0gIHVpbnQzMiBoYXJkd2FyZV9wZW5kaW5nX2J5dGVzID0gc3RhdGljX2Nhc3Q8dWludDMyPgotICAgICAgKChwbGF5b3V0X2xhdGVuY3lfZnJhbWVzICsgMC41KSAqIGZvcm1hdF8ubUJ5dGVzUGVyRnJhbWUpOwotCi0gIC8vIFVuZm9ydHVuYXRlbHkgQVVBdWRpb0lucHV0U3RyZWFtIGFuZCBBVUF1ZGlvT3V0cHV0U3RyZWFtIHNoYXJlIHRoZSBmcmFtZQotICAvLyBzaXplIHNldCBieSBrQXVkaW9EZXZpY2VQcm9wZXJ0eUJ1ZmZlckZyYW1lU2l6ZSBhYm92ZSBvbiBhIHBlciBwcm9jZXNzCi0gIC8vIGJhc2lzLiAgV2hhdCB0aGlzIG1lYW5zIGlzIHRoYXQgdGhlIHxudW1iZXJfb2ZfZnJhbWVzfCB2YWx1ZSBtYXkgYmUgbGFyZ2VyCi0gIC8vIG9yIHNtYWxsZXIgdGhhbiB0aGUgdmFsdWUgc2V0IGR1cmluZyBDb25maWd1cmUoKS4gIEluIHRoaXMgY2FzZSBlaXRoZXIKLSAgLy8gYXVkaW8gaW5wdXQgb3IgYXVkaW8gb3V0cHV0IHdpbGwgYmUgYnJva2VuLCBzbyBqdXN0IG91dHB1dCBzaWxlbmNlLgotICAvLyBUT0RPKGNyb2dlcnMpOiBGaWd1cmUgb3V0IHdoYXQgY2FuIHRyaWdnZXIgYSBjaGFuZ2UgaW4gfG51bWJlcl9vZl9mcmFtZXN8LgotICAvLyBTZWUgaHR0cDovL2NyYnVnLmNvbS8xNTQzIGZvciBkZXRhaWxzLgotICAgaWYgKG51bWJlcl9vZl9mcmFtZXMgIT0gc3RhdGljX2Nhc3Q8VUludDMyPihhdWRpb19idXNfLT5mcmFtZXMoKSkpIHsKLSAgICAgbWVtc2V0KGF1ZGlvX2RhdGEsIDAsIG51bWJlcl9vZl9mcmFtZXMgKiBmb3JtYXRfLm1CeXRlc1BlckZyYW1lKTsKLSAgICAgcmV0dXJuIG5vRXJyOwotICAgfQotCi0gIGludCBmcmFtZXNfZmlsbGVkID0gc291cmNlXy0+T25Nb3JlRGF0YSgKLSAgICAgIGF1ZGlvX2J1c18uZ2V0KCksIEF1ZGlvQnVmZmVyc1N0YXRlKDAsIGhhcmR3YXJlX3BlbmRpbmdfYnl0ZXMpKTsKLQotICAvLyBOb3RlOiBJZiB0aGlzIGV2ZXIgY2hhbmdlcyB0byBvdXRwdXQgcmF3IGZsb2F0IHRoZSBkYXRhIG11c3QgYmUgY2xpcHBlZCBhbmQKLSAgLy8gc2FuaXRpemVkIHNpbmNlIGl0IG1heSBjb21lIGZyb20gYW4gdW50cnVzdGVkIHNvdXJjZSBzdWNoIGFzIE5hQ2wuCi0gIGF1ZGlvX2J1c18tPlRvSW50ZXJsZWF2ZWQoCi0gICAgICBmcmFtZXNfZmlsbGVkLCBmb3JtYXRfLm1CaXRzUGVyQ2hhbm5lbCAvIDgsIGF1ZGlvX2RhdGEpOwotICB1aW50MzIgZmlsbGVkID0gZnJhbWVzX2ZpbGxlZCAqIGZvcm1hdF8ubUJ5dGVzUGVyRnJhbWU7Ci0KLSAgLy8gUGVyZm9ybSBpbi1wbGFjZSwgc29mdHdhcmUtdm9sdW1lIGFkanVzdG1lbnRzLgotICBtZWRpYTo6QWRqdXN0Vm9sdW1lKGF1ZGlvX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgZmlsbGVkLAotICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1c18tPmNoYW5uZWxzKCksCi0gICAgICAgICAgICAgICAgICAgICAgZm9ybWF0Xy5tQml0c1BlckNoYW5uZWwgLyA4LAotICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV8pOwotCi0gIHJldHVybiBub0VycjsKLX0KLQotLy8gRGVmYXVsdE91dHB1dFVuaXQgY2FsbGJhY2sKLU9TU3RhdHVzIEFVQXVkaW9PdXRwdXRTdHJlYW06OklucHV0UHJvYyh2b2lkKiB1c2VyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Vbml0UmVuZGVyQWN0aW9uRmxhZ3MqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvVGltZVN0YW1wKiBvdXRwdXRfdGltZV9zdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyIG51bWJlcl9vZl9mcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJMaXN0KiBpb19kYXRhKSB7Ci0gIEFVQXVkaW9PdXRwdXRTdHJlYW0qIGF1ZGlvX291dHB1dCA9Ci0gICAgICBzdGF0aWNfY2FzdDxBVUF1ZGlvT3V0cHV0U3RyZWFtKj4odXNlcl9kYXRhKTsKLSAgaWYgKCFhdWRpb19vdXRwdXQpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiBhdWRpb19vdXRwdXQtPlJlbmRlcihudW1iZXJfb2ZfZnJhbWVzLCBpb19kYXRhLCBvdXRwdXRfdGltZV9zdGFtcCk7Ci19Ci0KLWludCBBVUF1ZGlvT3V0cHV0U3RyZWFtOjpIYXJkd2FyZVNhbXBsZVJhdGUoKSB7Ci0gIC8vIERldGVybWluZSB0aGUgZGVmYXVsdCBvdXRwdXQgZGV2aWNlJ3Mgc2FtcGxlLXJhdGUuCi0gIEF1ZGlvRGV2aWNlSUQgZGV2aWNlX2lkID0ga0F1ZGlvT2JqZWN0VW5rbm93bjsKLSAgVUludDMyIGluZm9fc2l6ZSA9IHNpemVvZihkZXZpY2VfaWQpOwotICBPU1N0YXR1cyByZXN1bHQgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YShrQXVkaW9PYmplY3RTeXN0ZW1PYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrRGVmYXVsdE91dHB1dERldmljZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VfaWQpOwotICBpZiAocmVzdWx0ICE9IG5vRXJyIHx8IGRldmljZV9pZCA9PSBrQXVkaW9PYmplY3RVbmtub3duKSB7Ci0gICAgT1NTVEFUVVNfRExPRyhXQVJOSU5HLCByZXN1bHQpCi0gICAgICAgIDw8ICJDb3VsZCBub3QgZ2V0IGRlZmF1bHQgYXVkaW8gb3V0cHV0IGRldmljZS4iOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgRmxvYXQ2NCBub21pbmFsX3NhbXBsZV9yYXRlOwotICBpbmZvX3NpemUgPSBzaXplb2Yobm9taW5hbF9zYW1wbGVfcmF0ZSk7Ci0KLSAgQXVkaW9PYmplY3RQcm9wZXJ0eUFkZHJlc3Mgbm9taW5hbF9zYW1wbGVfcmF0ZV9hZGRyZXNzID0gewotICAgICAga0F1ZGlvRGV2aWNlUHJvcGVydHlOb21pbmFsU2FtcGxlUmF0ZSwKLSAgICAgIGtBdWRpb09iamVjdFByb3BlcnR5U2NvcGVHbG9iYWwsCi0gICAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXIKLSAgfTsKLSAgcmVzdWx0ID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGEoZGV2aWNlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9taW5hbF9zYW1wbGVfcmF0ZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mb19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9taW5hbF9zYW1wbGVfcmF0ZSk7Ci0gIGlmIChyZXN1bHQgIT0gbm9FcnIpIHsKLSAgICBPU1NUQVRVU19ETE9HKFdBUk5JTkcsIHJlc3VsdCkKLSAgICAgICAgPDwgIkNvdWxkIG5vdCBnZXQgZGVmYXVsdCBzYW1wbGUgcmF0ZSBmb3IgZGV2aWNlOiAiIDw8IGRldmljZV9pZDsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KG5vbWluYWxfc2FtcGxlX3JhdGUpOwotfQotCi1kb3VibGUgQVVBdWRpb091dHB1dFN0cmVhbTo6R2V0SGFyZHdhcmVMYXRlbmN5KCkgewotICBpZiAoIW91dHB1dF91bml0XyB8fCBvdXRwdXRfZGV2aWNlX2lkXyA9PSBrQXVkaW9PYmplY3RVbmtub3duKSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCAiQXVkaW8gdW5pdCBvYmplY3QgaXMgTlVMTCBvciBkZXZpY2UgSUQgaXMgdW5rbm93biI7Ci0gICAgcmV0dXJuIDAuMDsKLSAgfQotCi0gIC8vIEdldCBhdWRpbyB1bml0IGxhdGVuY3kuCi0gIEZsb2F0NjQgYXVkaW9fdW5pdF9sYXRlbmN5X3NlYyA9IDAuMDsKLSAgVUludDMyIHNpemUgPSBzaXplb2YoYXVkaW9fdW5pdF9sYXRlbmN5X3NlYyk7Ci0gIE9TU3RhdHVzIHJlc3VsdCA9IEF1ZGlvVW5pdEdldFByb3BlcnR5KG91dHB1dF91bml0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0F1ZGlvVW5pdFByb3BlcnR5X0xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBdWRpb1VuaXRTY29wZV9HbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdWRpb191bml0X2xhdGVuY3lfc2VjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSk7Ci0gIGlmIChyZXN1bHQgIT0gbm9FcnIpIHsKLSAgICBPU1NUQVRVU19ETE9HKFdBUk5JTkcsIHJlc3VsdCkgPDwgIkNvdWxkIG5vdCBnZXQgYXVkaW8gdW5pdCBsYXRlbmN5IjsKLSAgICByZXR1cm4gMC4wOwotICB9Ci0KLSAgLy8gR2V0IG91dHB1dCBhdWRpbyBkZXZpY2UgbGF0ZW5jeS4KLSAgQXVkaW9PYmplY3RQcm9wZXJ0eUFkZHJlc3MgcHJvcGVydHlfYWRkcmVzcyA9IHsKLSAgICBrQXVkaW9EZXZpY2VQcm9wZXJ0eUxhdGVuY3ksCi0gICAga0F1ZGlvRGV2aWNlUHJvcGVydHlTY29wZU91dHB1dCwKLSAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXIKLSAgfTsKLSAgVUludDMyIGRldmljZV9sYXRlbmN5X2ZyYW1lcyA9IDA7Ci0gIHNpemUgPSBzaXplb2YoZGV2aWNlX2xhdGVuY3lfZnJhbWVzKTsKLSAgcmVzdWx0ID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGEob3V0cHV0X2RldmljZV9pZF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZV9sYXRlbmN5X2ZyYW1lcyk7Ci0gIGlmIChyZXN1bHQgIT0gbm9FcnIpIHsKLSAgICBPU1NUQVRVU19ETE9HKFdBUk5JTkcsIHJlc3VsdCkgPDwgIkNvdWxkIG5vdCBnZXQgYXVkaW8gdW5pdCBsYXRlbmN5IjsKLSAgICByZXR1cm4gMC4wOwotICB9Ci0KLSAgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4oKGF1ZGlvX3VuaXRfbGF0ZW5jeV9zZWMgKgotICAgICAgZm9ybWF0Xy5tU2FtcGxlUmF0ZSkgKyBkZXZpY2VfbGF0ZW5jeV9mcmFtZXMpOwotfQotCi1kb3VibGUgQVVBdWRpb091dHB1dFN0cmVhbTo6R2V0UGxheW91dExhdGVuY3koCi0gICAgY29uc3QgQXVkaW9UaW1lU3RhbXAqIG91dHB1dF90aW1lX3N0YW1wKSB7Ci0gIC8vIEVuc3VyZSBtSG9zdFRpbWUgaXMgdmFsaWQuCi0gIGlmICgob3V0cHV0X3RpbWVfc3RhbXAtPm1GbGFncyAmIGtBdWRpb1RpbWVTdGFtcEhvc3RUaW1lVmFsaWQpID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgLy8gR2V0IHRoZSBkZWxheSBiZXR3ZWVuIHRoZSBtb21lbnQgZ2V0dGluZyB0aGUgY2FsbGJhY2sgYW5kIHRoZSBzY2hlZHVsZWQKLSAgLy8gdGltZSBzdGFtcCB0aGF0IHRlbGxzIHdoZW4gdGhlIGRhdGEgaXMgZ29pbmcgdG8gYmUgcGxheWVkIG91dC4KLSAgVUludDY0IG91dHB1dF90aW1lX25zID0gQXVkaW9Db252ZXJ0SG9zdFRpbWVUb05hbm9zKAotICAgICAgb3V0cHV0X3RpbWVfc3RhbXAtPm1Ib3N0VGltZSk7Ci0gIFVJbnQ2NCBub3dfbnMgPSBBdWRpb0NvbnZlcnRIb3N0VGltZVRvTmFub3MoQXVkaW9HZXRDdXJyZW50SG9zdFRpbWUoKSk7Ci0KLSAgLy8gUHJldmVudCBvdmVyZmxvdyBsZWFkaW5nIHRvIGh1Z2UgZGVsYXkgaW5mb3JtYXRpb247IG9jY3VycyByZWd1bGFybHkgb24KLSAgLy8gdGhlIGJvdHMsIHByb2JhYmx5IGxlc3Mgc28gaW4gdGhlIHdpbGQuCi0gIGlmIChub3dfbnMgPiBvdXRwdXRfdGltZV9ucykKLSAgICByZXR1cm4gMDsKLQotICBkb3VibGUgZGVsYXlfZnJhbWVzID0gc3RhdGljX2Nhc3Q8ZG91YmxlPgotICAgICAgKDFlLTkgKiAob3V0cHV0X3RpbWVfbnMgLSBub3dfbnMpICogZm9ybWF0Xy5tU2FtcGxlUmF0ZSk7Ci0KLSAgcmV0dXJuIChkZWxheV9mcmFtZXMgKyBoYXJkd2FyZV9sYXRlbmN5X2ZyYW1lc18pOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9tYWMvYXVkaW9fbG93X2xhdGVuY3lfb3V0cHV0X21hYy5oIGIvc3JjL21lZGlhL2F1ZGlvL21hYy9hdWRpb19sb3dfbGF0ZW5jeV9vdXRwdXRfbWFjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZWI0YWYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL21hYy9hdWRpb19sb3dfbGF0ZW5jeV9vdXRwdXRfbWFjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLS8vCi0vLyBJbXBsZW1lbnRhdGlvbiBub3RlczoKLS8vCi0vLyAtIEl0IGlzIHJlY29tbWVuZGVkIHRvIGZpcnN0IGFjcXVpcmUgdGhlIG5hdGl2ZSBzYW1wbGUgcmF0ZSBvZiB0aGUgZGVmYXVsdAotLy8gICBvdXRwdXQgZGV2aWNlIGFuZCB0aGVuIHVzZSB0aGUgc2FtZSByYXRlIHdoZW4gY3JlYXRpbmcgdGhpcyBvYmplY3QuCi0vLyAgIFVzZSBBVUF1ZGlvT3V0cHV0U3RyZWFtOjpIYXJkd2FyZVNhbXBsZVJhdGUoKSB0byByZXRyaWV2ZSB0aGUgc2FtcGxlIHJhdGUuCi0vLyAtIENhbGxpbmcgQ2xvc2UoKSBhbHNvIGxlYWRzIHRvIHNlbGYgZGVzdHJ1Y3Rpb24uCi0vLyAtIFRoZSBsYXRlbmN5IGNvbnNpc3RzIG9mIHR3byBwYXJ0czoKLS8vICAgMSkgSGFyZHdhcmUgbGF0ZW5jeSwgd2hpY2ggaW5jbHVkZXMgQXVkaW8gVW5pdCBsYXRlbmN5LCBhdWRpbyBkZXZpY2UKLS8vICAgICAgbGF0ZW5jeTsKLS8vICAgMikgVGhlIGRlbGF5IGJldHdlZW4gdGhlIG1vbWVudCBnZXR0aW5nIHRoZSBjYWxsYmFjayBhbmQgdGhlIHNjaGVkdWxlZCB0aW1lCi0vLyAgICAgIHN0YW1wIHRoYXQgdGVsbHMgd2hlbiB0aGUgZGF0YSBpcyBnb2luZyB0byBiZSBwbGF5ZWQgb3V0LgotLy8KLSNpZm5kZWYgTUVESUFfQVVESU9fTUFDX0FVRElPX0xPV19MQVRFTkNZX09VVFBVVF9NQUNfSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fTUFDX0FVRElPX0xPV19MQVRFTkNZX09VVFBVVF9NQUNfSF8KLQotI2luY2x1ZGUgPEF1ZGlvVW5pdC9BdWRpb1VuaXQuaD4KLSNpbmNsdWRlIDxDb3JlQXVkaW8vQ29yZUF1ZGlvLmg+Ci0KLSNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9faW8uaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19wYXJhbWV0ZXJzLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIEF1ZGlvTWFuYWdlck1hYzsKLQotLy8gSW1wbGVtZW50YXRpb24gb2YgQXVkaW9PdXB1dFN0cmVhbSBmb3IgTWFjIE9TIFggdXNpbmcgdGhlCi0vLyBkZWZhdWx0IG91dHB1dCBBdWRpbyBVbml0IHByZXNlbnQgaW4gT1MgMTAuNCBhbmQgbGF0ZXIuCi0vLyBUaGUgZGVmYXVsdCBvdXRwdXQgQXVkaW8gVW5pdCBpcyBmb3IgbG93LWxhdGVuY3kgYXVkaW8gSS9PLgotY2xhc3MgQVVBdWRpb091dHB1dFN0cmVhbSA6IHB1YmxpYyBBdWRpb091dHB1dFN0cmVhbSB7Ci0gcHVibGljOgotICAvLyBUaGUgY3RvciB0YWtlcyBhbGwgdGhlIHVzdWFsIHBhcmFtZXRlcnMsIHBsdXMgfG1hbmFnZXJ8IHdoaWNoIGlzIHRoZQotICAvLyB0aGUgYXVkaW8gbWFuYWdlciB3aG8gaXMgY3JlYXRpbmcgdGhpcyBvYmplY3QuCi0gIEFVQXVkaW9PdXRwdXRTdHJlYW0oQXVkaW9NYW5hZ2VyTWFjKiBtYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKTsKLSAgLy8gVGhlIGR0b3IgaXMgdHlwaWNhbGx5IGNhbGxlZCBieSB0aGUgQXVkaW9NYW5hZ2VyIG9ubHkgYW5kIGl0IGlzIHVzdWFsbHkKLSAgLy8gdHJpZ2dlcmVkIGJ5IGNhbGxpbmcgQXVkaW9PdXRwdXRTdHJlYW06OkNsb3NlKCkuCi0gIHZpcnR1YWwgfkFVQXVkaW9PdXRwdXRTdHJlYW0oKTsKLQotICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBBdWRpb091dHB1dFN0cmVhbS4KLSAgdmlydHVhbCBib29sIE9wZW4oKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIENsb3NlKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTdGFydChBdWRpb1NvdXJjZUNhbGxiYWNrKiBjYWxsYmFjaykgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTdG9wKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBHZXRWb2x1bWUoZG91YmxlKiB2b2x1bWUpIE9WRVJSSURFOwotCi0gIHN0YXRpYyBpbnQgSGFyZHdhcmVTYW1wbGVSYXRlKCk7Ci0KLSBwcml2YXRlOgotICAvLyBEZWZhdWx0T3V0cHV0VW5pdCBjYWxsYmFjay4KLSAgc3RhdGljIE9TU3RhdHVzIElucHV0UHJvYyh2b2lkKiB1c2VyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Vbml0UmVuZGVyQWN0aW9uRmxhZ3MqIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvVGltZVN0YW1wKiB0aW1lX3N0YW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBidXNfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBudW1iZXJfb2ZfZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyTGlzdCogaW9fZGF0YSk7Ci0KLSAgT1NTdGF0dXMgUmVuZGVyKFVJbnQzMiBudW1iZXJfb2ZfZnJhbWVzLCBBdWRpb0J1ZmZlckxpc3QqIGlvX2RhdGEsCi0gICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1RpbWVTdGFtcCogb3V0cHV0X3RpbWVfc3RhbXApOwotCi0gIC8vIFNldHMgdXAgdGhlIHN0cmVhbSBmb3JtYXQgZm9yIHRoZSBkZWZhdWx0IG91dHB1dCBBdWRpbyBVbml0LgotICBib29sIENvbmZpZ3VyZSgpOwotCi0gIC8vIEdldHMgdGhlIGZpeGVkIHBsYXlvdXQgZGV2aWNlIGhhcmR3YXJlIGxhdGVuY3kgYW5kIHN0b3JlcyBpdC4gUmV0dXJucyAwCi0gIC8vIGlmIG5vdCBhdmFpbGFibGUuCi0gIGRvdWJsZSBHZXRIYXJkd2FyZUxhdGVuY3koKTsKLQotICAvLyBHZXRzIHRoZSBjdXJyZW50IHBsYXlvdXQgbGF0ZW5jeSB2YWx1ZS4KLSAgZG91YmxlIEdldFBsYXlvdXRMYXRlbmN5KGNvbnN0IEF1ZGlvVGltZVN0YW1wKiBvdXRwdXRfdGltZV9zdGFtcCk7Ci0KLSAgLy8gT3VyIGNyZWF0b3IsIHRoZSBhdWRpbyBtYW5hZ2VyIG5lZWRzIHRvIGJlIG5vdGlmaWVkIHdoZW4gd2UgY2xvc2UuCi0gIEF1ZGlvTWFuYWdlck1hYyogbWFuYWdlcl87Ci0KLSAgc2l6ZV90IG51bWJlcl9vZl9mcmFtZXNfOwotCi0gIC8vIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0aGF0IHdpbGwgcHJvdmlkZSB0aGUgYXVkaW8gc2FtcGxlcy4KLSAgQXVkaW9Tb3VyY2VDYWxsYmFjayogc291cmNlXzsKLQotICAvLyBTdHJ1Y3R1cmUgdGhhdCBob2xkcyB0aGUgc3RyZWFtIGZvcm1hdCBkZXRhaWxzIHN1Y2ggYXMgYml0cmF0ZS4KLSAgQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uIGZvcm1hdF87Ci0KLSAgLy8gVGhlIGRlZmF1bHQgb3V0cHV0IEF1ZGlvIFVuaXQgd2hpY2ggdGFsa3MgdG8gdGhlIGF1ZGlvIGhhcmR3YXJlLgotICBBdWRpb1VuaXQgb3V0cHV0X3VuaXRfOwotCi0gIC8vIFRoZSBVSUQgcmVmZXJzIHRvIHRoZSBjdXJyZW50IG91dHB1dCBhdWRpbyBkZXZpY2UuCi0gIEF1ZGlvRGV2aWNlSUQgb3V0cHV0X2RldmljZV9pZF87Ci0KLSAgLy8gVm9sdW1lIGxldmVsIGZyb20gMCB0byAxLgotICBmbG9hdCB2b2x1bWVfOwotCi0gIC8vIEZpeGVkIHBsYXlvdXQgaGFyZHdhcmUgbGF0ZW5jeSBpbiBmcmFtZXMuCi0gIGRvdWJsZSBoYXJkd2FyZV9sYXRlbmN5X2ZyYW1lc187Ci0KLSAgLy8gVGhlIGZsYWcgdXNlZCB0byBzdG9wIHRoZSBzdHJlYW1pbmcuCi0gIGJvb2wgc3RvcHBlZF87Ci0KLSAgLy8gQ29udGFpbmVyIGZvciByZXRyaWV2aW5nIGRhdGEgZnJvbSBBdWRpb1NvdXJjZUNhbGxiYWNrOjpPbk1vcmVEYXRhKCkuCi0gIHNjb3BlZF9wdHI8QXVkaW9CdXM+IGF1ZGlvX2J1c187Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEFVQXVkaW9PdXRwdXRTdHJlYW0pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQVVESU9fTUFDX0FVRElPX0xPV19MQVRFTkNZX09VVFBVVF9NQUNfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9tYWMvYXVkaW9fbWFuYWdlcl9tYWMuY2MgYi9zcmMvbWVkaWEvYXVkaW8vbWFjL2F1ZGlvX21hbmFnZXJfbWFjLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDMwMGVkLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9tYWMvYXVkaW9fbWFuYWdlcl9tYWMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MDYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL21hYy9hdWRpb19tYW5hZ2VyX21hYy5oIgotCi0jaW5jbHVkZSA8Q29yZUF1ZGlvL0F1ZGlvSGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2NvbW1hbmRfbGluZS5oIgotI2luY2x1ZGUgImJhc2UvbWFjL21hY19sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS9tYWMvc2NvcGVkX2NmdHlwZXJlZi5oIgotI2luY2x1ZGUgImJhc2Uvc3lzX3N0cmluZ19jb252ZXJzaW9ucy5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3V0aWwuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9tYWMvYXVkaW9faW5wdXRfbWFjLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vbWFjL2F1ZGlvX2xvd19sYXRlbmN5X2lucHV0X21hYy5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL21hYy9hdWRpb19sb3dfbGF0ZW5jeV9vdXRwdXRfbWFjLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vbWFjL2F1ZGlvX291dHB1dF9tYWMuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9tYWMvYXVkaW9fc3luY2hyb25pemVkX21hYy5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL21hYy9hdWRpb191bmlmaWVkX21hYy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYmluZF90b19sb29wLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9saW1pdHMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX3N3aXRjaGVzLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIE1heGltdW0gbnVtYmVyIG9mIG91dHB1dCBzdHJlYW1zIHRoYXQgY2FuIGJlIG9wZW4gc2ltdWx0YW5lb3VzbHkuCi1zdGF0aWMgY29uc3QgaW50IGtNYXhPdXRwdXRTdHJlYW1zID0gNTA7Ci0KLXN0YXRpYyBib29sIEhhc0F1ZGlvSGFyZHdhcmUoQXVkaW9PYmplY3RQcm9wZXJ0eVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gIEF1ZGlvRGV2aWNlSUQgb3V0cHV0X2RldmljZV9pZCA9IGtBdWRpb09iamVjdFVua25vd247Ci0gIGNvbnN0IEF1ZGlvT2JqZWN0UHJvcGVydHlBZGRyZXNzIHByb3BlcnR5X2FkZHJlc3MgPSB7Ci0gICAgc2VsZWN0b3IsCi0gICAga0F1ZGlvT2JqZWN0UHJvcGVydHlTY29wZUdsb2JhbCwgICAgICAgICAgICAvLyBtU2NvcGUKLSAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXIgICAgICAgICAgIC8vIG1FbGVtZW50Ci0gIH07Ci0gIFVJbnQzMiBvdXRwdXRfZGV2aWNlX2lkX3NpemUgPSBzdGF0aWNfY2FzdDxVSW50MzI+KHNpemVvZihvdXRwdXRfZGV2aWNlX2lkKSk7Ci0gIE9TU3RhdHVzIGVyciA9IEF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhKGtBdWRpb09iamVjdFN5c3RlbU9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5X2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAvLyBpblF1YWxpZmllckRhdGFTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAvLyBpblF1YWxpZmllckRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dF9kZXZpY2VfaWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dF9kZXZpY2VfaWQpOwotICByZXR1cm4gZXJyID09IGtBdWRpb0hhcmR3YXJlTm9FcnJvciAmJgotICAgICAgb3V0cHV0X2RldmljZV9pZCAhPSBrQXVkaW9PYmplY3RVbmtub3duOwotfQotCi0vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGRlZmF1bHQgaW5wdXQgZGV2aWNlIGlzIHRoZSBzYW1lIGFzCi0vLyB0aGUgZGVmYXVsdCBvdXRwdXQgZGV2aWNlLgotc3RhdGljIGJvb2wgSGFzVW5pZmllZERlZmF1bHRJTygpIHsKLSAgQXVkaW9EZXZpY2VJRCBpbnB1dF9pZCwgb3V0cHV0X2lkOwotCi0gIEF1ZGlvT2JqZWN0UHJvcGVydHlBZGRyZXNzIHBhOwotICBwYS5tU2VsZWN0b3IgPSBrQXVkaW9IYXJkd2FyZVByb3BlcnR5RGVmYXVsdElucHV0RGV2aWNlOwotICBwYS5tU2NvcGUgPSBrQXVkaW9PYmplY3RQcm9wZXJ0eVNjb3BlR2xvYmFsOwotICBwYS5tRWxlbWVudCA9IGtBdWRpb09iamVjdFByb3BlcnR5RWxlbWVudE1hc3RlcjsKLSAgVUludDMyIHNpemUgPSBzaXplb2YoaW5wdXRfaWQpOwotCi0gIC8vIEdldCB0aGUgZGVmYXVsdCBpbnB1dC4KLSAgT1NTdGF0dXMgcmVzdWx0ID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGEoCi0gICAgICBrQXVkaW9PYmplY3RTeXN0ZW1PYmplY3QsCi0gICAgICAmcGEsCi0gICAgICAwLAotICAgICAgMCwKLSAgICAgICZzaXplLAotICAgICAgJmlucHV0X2lkKTsKLQotICBpZiAocmVzdWx0ICE9IG5vRXJyKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvLyBHZXQgdGhlIGRlZmF1bHQgb3V0cHV0LgotICBwYS5tU2VsZWN0b3IgPSBrQXVkaW9IYXJkd2FyZVByb3BlcnR5RGVmYXVsdE91dHB1dERldmljZTsKLSAgcmVzdWx0ID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGEoCi0gICAgICBrQXVkaW9PYmplY3RTeXN0ZW1PYmplY3QsCi0gICAgICAmcGEsCi0gICAgICAwLAotICAgICAgMCwKLSAgICAgICZzaXplLAotICAgICAgJm91dHB1dF9pZCk7Ci0KLSAgaWYgKHJlc3VsdCAhPSBub0VycikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIGlucHV0X2lkID09IG91dHB1dF9pZDsKLX0KLQotc3RhdGljIHZvaWQgR2V0QXVkaW9EZXZpY2VJbmZvKGJvb2wgaXNfaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvRGV2aWNlTmFtZXMqIGRldmljZV9uYW1lcykgewotICBEQ0hFQ0soZGV2aWNlX25hbWVzKTsKLSAgZGV2aWNlX25hbWVzLT5jbGVhcigpOwotCi0gIC8vIFF1ZXJ5IHRoZSBudW1iZXIgb2YgdG90YWwgZGV2aWNlcy4KLSAgQXVkaW9PYmplY3RQcm9wZXJ0eUFkZHJlc3MgcHJvcGVydHlfYWRkcmVzcyA9IHsKLSAgICBrQXVkaW9IYXJkd2FyZVByb3BlcnR5RGV2aWNlcywKLSAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eVNjb3BlR2xvYmFsLAotICAgIGtBdWRpb09iamVjdFByb3BlcnR5RWxlbWVudE1hc3RlcgotICB9OwotICBVSW50MzIgc2l6ZSA9IDA7Ci0gIE9TU3RhdHVzIHJlc3VsdCA9IEF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhU2l6ZShrQXVkaW9PYmplY3RTeXN0ZW1PYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOwotICBpZiAocmVzdWx0IHx8ICFzaXplKQotICAgIHJldHVybjsKLQotICBpbnQgZGV2aWNlX2NvdW50ID0gc2l6ZSAvIHNpemVvZihBdWRpb0RldmljZUlEKTsKLQotICAvLyBHZXQgdGhlIGFycmF5IG9mIGRldmljZSBpZHMgZm9yIGFsbCB0aGUgZGV2aWNlcywgd2hpY2ggaW5jbHVkZXMgYm90aAotICAvLyBpbnB1dCBkZXZpY2VzIGFuZCBvdXRwdXQgZGV2aWNlcy4KLSAgc2NvcGVkX3B0cl9tYWxsb2M8QXVkaW9EZXZpY2VJRD4KLSAgICAgIGRldmljZXMocmVpbnRlcnByZXRfY2FzdDxBdWRpb0RldmljZUlEKj4obWFsbG9jKHNpemUpKSk7Ci0gIEF1ZGlvRGV2aWNlSUQqIGRldmljZV9pZHMgPSBkZXZpY2VzLmdldCgpOwotICByZXN1bHQgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YShrQXVkaW9PYmplY3RTeXN0ZW1PYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2lkcyk7Ci0gIGlmIChyZXN1bHQpCi0gICAgcmV0dXJuOwotCi0gIC8vIEl0ZXJhdGUgb3ZlciBhbGwgYXZhaWxhYmxlIGRldmljZXMgdG8gZ2F0aGVyIGluZm9ybWF0aW9uLgotICBmb3IgKGludCBpID0gMDsgaSA8IGRldmljZV9jb3VudDsgKytpKSB7Ci0gICAgLy8gR2V0IHRoZSBudW1iZXIgb2YgaW5wdXQgb3Igb3V0cHV0IGNoYW5uZWxzIG9mIHRoZSBkZXZpY2UuCi0gICAgcHJvcGVydHlfYWRkcmVzcy5tU2NvcGUgPSBpc19pbnB1dCA/Ci0gICAgICAgIGtBdWRpb0RldmljZVByb3BlcnR5U2NvcGVJbnB1dCA6IGtBdWRpb0RldmljZVByb3BlcnR5U2NvcGVPdXRwdXQ7Ci0gICAgcHJvcGVydHlfYWRkcmVzcy5tU2VsZWN0b3IgPSBrQXVkaW9EZXZpY2VQcm9wZXJ0eVN0cmVhbXM7Ci0gICAgc2l6ZSA9IDA7Ci0gICAgcmVzdWx0ID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGFTaXplKGRldmljZV9pZHNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSk7Ci0gICAgaWYgKHJlc3VsdCB8fCAhc2l6ZSkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgLy8gR2V0IGRldmljZSBVSUQuCi0gICAgQ0ZTdHJpbmdSZWYgdWlkID0gTlVMTDsKLSAgICBzaXplID0gc2l6ZW9mKHVpZCk7Ci0gICAgcHJvcGVydHlfYWRkcmVzcy5tU2VsZWN0b3IgPSBrQXVkaW9EZXZpY2VQcm9wZXJ0eURldmljZVVJRDsKLSAgICBwcm9wZXJ0eV9hZGRyZXNzLm1TY29wZSA9IGtBdWRpb09iamVjdFByb3BlcnR5U2NvcGVHbG9iYWw7Ci0gICAgcmVzdWx0ID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGEoZGV2aWNlX2lkc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpZCk7Ci0gICAgaWYgKHJlc3VsdCkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgLy8gR2V0IGRldmljZSBuYW1lLgotICAgIENGU3RyaW5nUmVmIG5hbWUgPSBOVUxMOwotICAgIHByb3BlcnR5X2FkZHJlc3MubVNlbGVjdG9yID0ga0F1ZGlvT2JqZWN0UHJvcGVydHlOYW1lOwotICAgIHByb3BlcnR5X2FkZHJlc3MubVNjb3BlID0ga0F1ZGlvT2JqZWN0UHJvcGVydHlTY29wZUdsb2JhbDsKLSAgICByZXN1bHQgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YShkZXZpY2VfaWRzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZSk7Ci0gICAgaWYgKHJlc3VsdCkgewotICAgICAgaWYgKHVpZCkKLSAgICAgICAgQ0ZSZWxlYXNlKHVpZCk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICAvLyBTdG9yZSB0aGUgZGV2aWNlIG5hbWUgYW5kIFVJRC4KLSAgICBtZWRpYTo6QXVkaW9EZXZpY2VOYW1lIGRldmljZV9uYW1lOwotICAgIGRldmljZV9uYW1lLmRldmljZV9uYW1lID0gYmFzZTo6U3lzQ0ZTdHJpbmdSZWZUb1VURjgobmFtZSk7Ci0gICAgZGV2aWNlX25hbWUudW5pcXVlX2lkID0gYmFzZTo6U3lzQ0ZTdHJpbmdSZWZUb1VURjgodWlkKTsKLSAgICBkZXZpY2VfbmFtZXMtPnB1c2hfYmFjayhkZXZpY2VfbmFtZSk7Ci0KLSAgICAvLyBXZSBhcmUgcmVzcG9uc2libGUgZm9yIHJlbGVhc2luZyB0aGUgcmV0dXJuZWQgQ0ZPYmplY3QuICBTZWUgdGhlCi0gICAgLy8gY29tbWVudCBpbiB0aGUgQXVkaW9IYXJkd2FyZS5oIGZvciBjb25zdGFudAotICAgIC8vIGtBdWRpb0RldmljZVByb3BlcnR5RGV2aWNlVUlELgotICAgIGlmICh1aWQpCi0gICAgICBDRlJlbGVhc2UodWlkKTsKLSAgICBpZiAobmFtZSkKLSAgICAgIENGUmVsZWFzZShuYW1lKTsKLSAgfQotfQotCi1zdGF0aWMgQXVkaW9EZXZpY2VJRCBHZXRBdWRpb0RldmljZUlkQnlVSWQoYm9vbCBpc19pbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2lkKSB7Ci0gIEF1ZGlvT2JqZWN0UHJvcGVydHlBZGRyZXNzIHByb3BlcnR5X2FkZHJlc3MgPSB7Ci0gICAga0F1ZGlvSGFyZHdhcmVQcm9wZXJ0eURldmljZXMsCi0gICAga0F1ZGlvT2JqZWN0UHJvcGVydHlTY29wZUdsb2JhbCwKLSAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXIKLSAgfTsKLSAgQXVkaW9EZXZpY2VJRCBhdWRpb19kZXZpY2VfaWQgPSBrQXVkaW9PYmplY3RVbmtub3duOwotICBVSW50MzIgZGV2aWNlX3NpemUgPSBzaXplb2YoYXVkaW9fZGV2aWNlX2lkKTsKLSAgT1NTdGF0dXMgcmVzdWx0ID0gLTE7Ci0KLSAgaWYgKGRldmljZV9pZCA9PSBBdWRpb01hbmFnZXJCYXNlOjprRGVmYXVsdERldmljZUlkKSB7Ci0gICAgLy8gRGVmYXVsdCBEZXZpY2UuCi0gICAgcHJvcGVydHlfYWRkcmVzcy5tU2VsZWN0b3IgPSBpc19pbnB1dCA/Ci0gICAgICAgIGtBdWRpb0hhcmR3YXJlUHJvcGVydHlEZWZhdWx0SW5wdXREZXZpY2UgOgotICAgICAgICBrQXVkaW9IYXJkd2FyZVByb3BlcnR5RGVmYXVsdE91dHB1dERldmljZTsKLQotICAgIHJlc3VsdCA9IEF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhKGtBdWRpb09iamVjdFN5c3RlbU9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdWRpb19kZXZpY2VfaWQpOwotICB9IGVsc2UgewotICAgIC8vIE5vbi1kZWZhdWx0IGRldmljZS4KLSAgICBiYXNlOjptYWM6OlNjb3BlZENGVHlwZVJlZjxDRlN0cmluZ1JlZj4KLSAgICAgICAgdWlkKGJhc2U6OlN5c1VURjhUb0NGU3RyaW5nUmVmKGRldmljZV9pZCkpOwotICAgIEF1ZGlvVmFsdWVUcmFuc2xhdGlvbiB2YWx1ZTsKLSAgICB2YWx1ZS5tSW5wdXREYXRhID0gJnVpZDsKLSAgICB2YWx1ZS5tSW5wdXREYXRhU2l6ZSA9IHNpemVvZihDRlN0cmluZ1JlZik7Ci0gICAgdmFsdWUubU91dHB1dERhdGEgPSAmYXVkaW9fZGV2aWNlX2lkOwotICAgIHZhbHVlLm1PdXRwdXREYXRhU2l6ZSA9IGRldmljZV9zaXplOwotICAgIFVJbnQzMiB0cmFuc2xhdGlvbl9zaXplID0gc2l6ZW9mKEF1ZGlvVmFsdWVUcmFuc2xhdGlvbik7Ci0KLSAgICBwcm9wZXJ0eV9hZGRyZXNzLm1TZWxlY3RvciA9IGtBdWRpb0hhcmR3YXJlUHJvcGVydHlEZXZpY2VGb3JVSUQ7Ci0gICAgcmVzdWx0ID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGEoa0F1ZGlvT2JqZWN0U3lzdGVtT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNsYXRpb25fc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpOwotICB9Ci0KLSAgaWYgKHJlc3VsdCkgewotICAgIE9TU1RBVFVTX0RMT0coV0FSTklORywgcmVzdWx0KSA8PCAiVW5hYmxlIHRvIHF1ZXJ5IGRldmljZSAiIDw8IGRldmljZV9pZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZvciBBdWRpb0RldmljZUlEIjsKLSAgfQotCi0gIHJldHVybiBhdWRpb19kZXZpY2VfaWQ7Ci19Ci0KLS8vIFByb3BlcnR5IGFkZHJlc3MgdG8gbW9uaXRvciBmb3IgZGV2aWNlIGNoYW5nZXMuCi1zdGF0aWMgY29uc3QgQXVkaW9PYmplY3RQcm9wZXJ0eUFkZHJlc3Mga0RldmljZUNoYW5nZVByb3BlcnR5QWRkcmVzcyA9IHsKLSAga0F1ZGlvSGFyZHdhcmVQcm9wZXJ0eURlZmF1bHRPdXRwdXREZXZpY2UsCi0gIGtBdWRpb09iamVjdFByb3BlcnR5U2NvcGVHbG9iYWwsCi0gIGtBdWRpb09iamVjdFByb3BlcnR5RWxlbWVudE1hc3RlcgotfTsKLQotLy8gQ2FsbGJhY2sgZnJvbSB0aGUgc3lzdGVtIHdoZW4gdGhlIGRlZmF1bHQgZGV2aWNlIGNoYW5nZXM7IHRoaXMgbXVzdCBiZSBjYWxsZWQKLS8vIG9uIHRoZSBNZXNzYWdlTG9vcCB0aGF0IGNyZWF0ZWQgdGhlIEF1ZGlvTWFuYWdlci4KLXN0YXRpYyBPU1N0YXR1cyBPbkRlZmF1bHREZXZpY2VDaGFuZ2VkQ2FsbGJhY2soCi0gICAgQXVkaW9PYmplY3RJRCBvYmplY3QsCi0gICAgVUludDMyIG51bV9hZGRyZXNzZXMsCi0gICAgY29uc3QgQXVkaW9PYmplY3RQcm9wZXJ0eUFkZHJlc3MgYWRkcmVzc2VzW10sCi0gICAgdm9pZCogY29udGV4dCkgewotICBpZiAob2JqZWN0ICE9IGtBdWRpb09iamVjdFN5c3RlbU9iamVjdCkKLSAgICByZXR1cm4gbm9FcnI7Ci0KLSAgZm9yIChVSW50MzIgaSA9IDA7IGkgPCBudW1fYWRkcmVzc2VzOyArK2kpIHsKLSAgICBpZiAoYWRkcmVzc2VzW2ldLm1TZWxlY3RvciA9PSBrRGV2aWNlQ2hhbmdlUHJvcGVydHlBZGRyZXNzLm1TZWxlY3RvciAmJgotICAgICAgICBhZGRyZXNzZXNbaV0ubVNjb3BlID09IGtEZXZpY2VDaGFuZ2VQcm9wZXJ0eUFkZHJlc3MubVNjb3BlICYmCi0gICAgICAgIGFkZHJlc3Nlc1tpXS5tRWxlbWVudCA9PSBrRGV2aWNlQ2hhbmdlUHJvcGVydHlBZGRyZXNzLm1FbGVtZW50ICYmCi0gICAgICAgIGNvbnRleHQpIHsKLSAgICAgIHN0YXRpY19jYXN0PEF1ZGlvTWFuYWdlck1hYyo+KGNvbnRleHQpLT5PbkRldmljZUNoYW5nZSgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIG5vRXJyOwotfQotCi1BdWRpb01hbmFnZXJNYWM6OkF1ZGlvTWFuYWdlck1hYygpCi0gICAgOiBsaXN0ZW5lcl9yZWdpc3RlcmVkXyhmYWxzZSksCi0gICAgICBjcmVhdGluZ19tZXNzYWdlX2xvb3BfKGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk6OmN1cnJlbnQoKSkgewotICBTZXRNYXhPdXRwdXRTdHJlYW1zQWxsb3dlZChrTWF4T3V0cHV0U3RyZWFtcyk7Ci0KLSAgLy8gQXVkaW9NYW5hZ2VyTWFjIGlzIGV4cGVjdGVkIHRvIGJlIGNyZWF0ZWQgYnkgdGhlIHJvb3QgcGxhdGZvcm0gdGhyZWFkLCB0aGlzCi0gIC8vIGlzIGdlbmVyYWxseSBCcm93c2VyTWFpbkxvb3AsIGl0J3MgTWVzc2FnZUxvb3Agd2lsbCBkcml2ZSB0aGUgTlNBcHBsaWNhdGlvbgotICAvLyBwdW1wIHdoaWNoIGluIHR1cm4gZmlyZXMgdGhlIHByb3BlcnR5IGxpc3RlbmVyIGNhbGxiYWNrcy4KLSAgaWYgKCFjcmVhdGluZ19tZXNzYWdlX2xvb3BfKQotICAgIHJldHVybjsKLQotICBPU1N0YXR1cyByZXN1bHQgPSBBdWRpb09iamVjdEFkZFByb3BlcnR5TGlzdGVuZXIoCi0gICAgICBrQXVkaW9PYmplY3RTeXN0ZW1PYmplY3QsCi0gICAgICAma0RldmljZUNoYW5nZVByb3BlcnR5QWRkcmVzcywKLSAgICAgICZPbkRlZmF1bHREZXZpY2VDaGFuZ2VkQ2FsbGJhY2ssCi0gICAgICB0aGlzKTsKLQotICBpZiAocmVzdWx0ICE9IG5vRXJyKSB7Ci0gICAgT1NTVEFUVVNfRExPRyhFUlJPUiwgcmVzdWx0KSA8PCAiQXVkaW9PYmplY3RBZGRQcm9wZXJ0eUxpc3RlbmVyKCkgZmFpbGVkISI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgbGlzdGVuZXJfcmVnaXN0ZXJlZF8gPSB0cnVlOwotfQotCi1BdWRpb01hbmFnZXJNYWM6On5BdWRpb01hbmFnZXJNYWMoKSB7Ci0gIGlmIChsaXN0ZW5lcl9yZWdpc3RlcmVkXykgewotICAgIC8vIFRPRE8oZGFsZWN1cnRpcyk6IENIRUNLIGRlc3RydWN0aW9uIGhhcHBlbnMgb24gfGNyZWF0aW5nX21lc3NhZ2VfbG9vcF98LAotICAgIC8vIHNob3VsZCBiZSB0cnVlLCBidXQgY3VycmVudGx5IHNldmVyYWwgdW5pdCB0ZXN0cyBwZXJmb3JtIGRlc3RydWN0aW9uIGluCi0gICAgLy8gb2RkIHBsYWNlcyBzbyB3ZSBjYW4ndCBDSEVDSyBoZXJlIGN1cnJlbnRseS4KLSAgICBPU1N0YXR1cyByZXN1bHQgPSBBdWRpb09iamVjdFJlbW92ZVByb3BlcnR5TGlzdGVuZXIoCi0gICAgICAgIGtBdWRpb09iamVjdFN5c3RlbU9iamVjdCwKLSAgICAgICAgJmtEZXZpY2VDaGFuZ2VQcm9wZXJ0eUFkZHJlc3MsCi0gICAgICAgICZPbkRlZmF1bHREZXZpY2VDaGFuZ2VkQ2FsbGJhY2ssCi0gICAgICAgIHRoaXMpOwotICAgIE9TU1RBVFVTX0RMT0dfSUYoRVJST1IsIHJlc3VsdCAhPSBub0VyciwgcmVzdWx0KQotICAgICAgICA8PCAiQXVkaW9PYmplY3RSZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKCkgZmFpbGVkISI7Ci0gIH0KLQotICBTaHV0ZG93bigpOwotfQotCi1ib29sIEF1ZGlvTWFuYWdlck1hYzo6SGFzQXVkaW9PdXRwdXREZXZpY2VzKCkgewotICByZXR1cm4gSGFzQXVkaW9IYXJkd2FyZShrQXVkaW9IYXJkd2FyZVByb3BlcnR5RGVmYXVsdE91dHB1dERldmljZSk7Ci19Ci0KLWJvb2wgQXVkaW9NYW5hZ2VyTWFjOjpIYXNBdWRpb0lucHV0RGV2aWNlcygpIHsKLSAgcmV0dXJuIEhhc0F1ZGlvSGFyZHdhcmUoa0F1ZGlvSGFyZHdhcmVQcm9wZXJ0eURlZmF1bHRJbnB1dERldmljZSk7Ci19Ci0KLXZvaWQgQXVkaW9NYW5hZ2VyTWFjOjpHZXRBdWRpb0lucHV0RGV2aWNlTmFtZXMoCi0gICAgbWVkaWE6OkF1ZGlvRGV2aWNlTmFtZXMqIGRldmljZV9uYW1lcykgewotICBHZXRBdWRpb0RldmljZUluZm8odHJ1ZSwgZGV2aWNlX25hbWVzKTsKLSAgaWYgKCFkZXZpY2VfbmFtZXMtPmVtcHR5KCkpIHsKLSAgICAvLyBQcmVwZW5kIHRoZSBkZWZhdWx0IGRldmljZSB0byB0aGUgbGlzdCBzaW5jZSB3ZSBhbHdheXMgd2FudCBpdCB0byBiZQotICAgIC8vIG9uIHRoZSB0b3Agb2YgdGhlIGxpc3QgZm9yIGFsbCBwbGF0Zm9ybXMuIFRoZXJlIGlzIG5vIGR1cGxpY2F0ZQotICAgIC8vIGNvdW50aW5nIGhlcmUgc2luY2UgdGhlIGRlZmF1bHQgZGV2aWNlIGhhcyBiZWVuIGFic3RyYWN0ZWQgb3V0IGJlZm9yZS4KLSAgICBtZWRpYTo6QXVkaW9EZXZpY2VOYW1lIG5hbWU7Ci0gICAgbmFtZS5kZXZpY2VfbmFtZSA9IEF1ZGlvTWFuYWdlckJhc2U6OmtEZWZhdWx0RGV2aWNlTmFtZTsKLSAgICBuYW1lLnVuaXF1ZV9pZCA9ICBBdWRpb01hbmFnZXJCYXNlOjprRGVmYXVsdERldmljZUlkOwotICAgIGRldmljZV9uYW1lcy0+cHVzaF9mcm9udChuYW1lKTsKLSAgfQotfQotCi1BdWRpb091dHB1dFN0cmVhbSogQXVkaW9NYW5hZ2VyTWFjOjpNYWtlTGluZWFyT3V0cHV0U3RyZWFtKAotICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKSB7Ci0gIERDSEVDS19FUShBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIsIHBhcmFtcy5mb3JtYXQoKSk7Ci0gIHJldHVybiBuZXcgUENNUXVldWVPdXRBdWRpb091dHB1dFN0cmVhbSh0aGlzLCBwYXJhbXMpOwotfQotCi1BdWRpb091dHB1dFN0cmVhbSogQXVkaW9NYW5hZ2VyTWFjOjpNYWtlTG93TGF0ZW5jeU91dHB1dFN0cmVhbSgKLSAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcykgewotICBEQ0hFQ0tfRVEoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTE9XX0xBVEVOQ1ksIHBhcmFtcy5mb3JtYXQoKSk7Ci0KLSAgLy8gVE9ETyhjcm9nZXJzKTogcmVtb3ZlIG9uY2Ugd2UgcHJvcGVybHkgaGFuZGxlIGlucHV0IGRldmljZSBzZWxlY3Rpb24uCi0gIGlmIChDb21tYW5kTGluZTo6Rm9yQ3VycmVudFByb2Nlc3MoKS0+SGFzU3dpdGNoKAotICAgICAgc3dpdGNoZXM6OmtFbmFibGVXZWJBdWRpb0lucHV0KSkgewotICAgIGlmIChIYXNVbmlmaWVkRGVmYXVsdElPKCkpCi0gICAgICByZXR1cm4gbmV3IEF1ZGlvSGFyZHdhcmVVbmlmaWVkU3RyZWFtKHRoaXMsIHBhcmFtcyk7Ci0KLSAgICAvLyBrQXVkaW9EZXZpY2VVbmtub3duIHRyYW5zbGF0ZXMgdG8gInVzZSBkZWZhdWx0IiBoZXJlLgotICAgIHJldHVybiBuZXcgQXVkaW9TeW5jaHJvbml6ZWRTdHJlYW0odGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBdWRpb0RldmljZVVua25vd24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9EZXZpY2VVbmtub3duKTsKLSAgfQotCi0gIHJldHVybiBuZXcgQVVBdWRpb091dHB1dFN0cmVhbSh0aGlzLCBwYXJhbXMpOwotfQotCi1BdWRpb0lucHV0U3RyZWFtKiBBdWRpb01hbmFnZXJNYWM6Ok1ha2VMaW5lYXJJbnB1dFN0cmVhbSgKLSAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCkgewotICBEQ0hFQ0tfRVEoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSLCBwYXJhbXMuZm9ybWF0KCkpOwotICByZXR1cm4gbmV3IFBDTVF1ZXVlSW5BdWRpb0lucHV0U3RyZWFtKHRoaXMsIHBhcmFtcyk7Ci19Ci0KLUF1ZGlvSW5wdXRTdHJlYW0qIEF1ZGlvTWFuYWdlck1hYzo6TWFrZUxvd0xhdGVuY3lJbnB1dFN0cmVhbSgKLSAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCkgewotICBEQ0hFQ0tfRVEoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTE9XX0xBVEVOQ1ksIHBhcmFtcy5mb3JtYXQoKSk7Ci0gIC8vIEdldHMgdGhlIEF1ZGlvRGV2aWNlSUQgdGhhdCByZWZlcnMgdG8gdGhlIEF1ZGlvT3V0cHV0RGV2aWNlIHdpdGggdGhlIGRldmljZQotICAvLyB1bmlxdWUgaWQuIFRoaXMgQXVkaW9EZXZpY2VJRCBpcyB1c2VkIHRvIHNldCB0aGUgZGV2aWNlIGZvciBBdWRpbyBVbml0LgotICBBdWRpb0RldmljZUlEIGF1ZGlvX2RldmljZV9pZCA9IEdldEF1ZGlvRGV2aWNlSWRCeVVJZCh0cnVlLCBkZXZpY2VfaWQpOwotICBBdWRpb0lucHV0U3RyZWFtKiBzdHJlYW0gPSBOVUxMOwotICBpZiAoYXVkaW9fZGV2aWNlX2lkICE9IGtBdWRpb09iamVjdFVua25vd24pCi0gICAgc3RyZWFtID0gbmV3IEFVQXVkaW9JbnB1dFN0cmVhbSh0aGlzLCBwYXJhbXMsIGF1ZGlvX2RldmljZV9pZCk7Ci0KLSAgcmV0dXJuIHN0cmVhbTsKLX0KLQotQXVkaW9QYXJhbWV0ZXJzIEF1ZGlvTWFuYWdlck1hYzo6R2V0UHJlZmVycmVkTG93TGF0ZW5jeU91dHB1dFN0cmVhbVBhcmFtZXRlcnMoCi0gICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBpbnB1dF9wYXJhbXMpIHsKLSAgaWYgKENvbW1hbmRMaW5lOjpGb3JDdXJyZW50UHJvY2VzcygpLT5IYXNTd2l0Y2goCi0gICAgICBzd2l0Y2hlczo6a0VuYWJsZVdlYkF1ZGlvSW5wdXQpKSB7Ci0gICAgLy8gVE9ETyhjcm9nZXJzKTogZ2l2ZW4gdGhlIGxpbWl0YXRpb25zIG9mIHRoZSBBdWRpb091dHB1dFN0cmVhbQotICAgIC8vIGJhY2stZW5kcyB1c2VkIHdpdGgga0VuYWJsZVdlYkF1ZGlvSW5wdXQsIHdlIGhhcmQtY29kZSB0byBzdGVyZW8uCi0gICAgLy8gU3BlY2lmaWNhbGx5LCB0aGlzIGlzIGEgbGltaXRhdGlvbiBvZiBBdWRpb1N5bmNocm9uaXplZFN0cmVhbSB3aGljaAotICAgIC8vIGNhbiBiZSByZW1vdmVkIGFzIHBhcnQgb2YgdGhlIHdvcmsgdG8gY29uc29saWRhdGUgdGhlc2UgYmFjay1lbmRzLgotICAgIHJldHVybiBBdWRpb1BhcmFtZXRlcnMoCi0gICAgICAgIEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xPV19MQVRFTkNZLCBDSEFOTkVMX0xBWU9VVF9TVEVSRU8sCi0gICAgICAgIEdldEF1ZGlvSGFyZHdhcmVTYW1wbGVSYXRlKCksIDE2LCBHZXRBdWRpb0hhcmR3YXJlQnVmZmVyU2l6ZSgpKTsKLSAgfQotCi0gIHJldHVybiBBdWRpb01hbmFnZXJCYXNlOjpHZXRQcmVmZXJyZWRMb3dMYXRlbmN5T3V0cHV0U3RyZWFtUGFyYW1ldGVycygKLSAgICAgIGlucHV0X3BhcmFtcyk7Ci19Ci0KLXZvaWQgQXVkaW9NYW5hZ2VyTWFjOjpPbkRldmljZUNoYW5nZSgpIHsKLSAgLy8gUG9zdCB0aGUgdGFzayB0byB0aGUgfGNyZWF0aW5nX21lc3NhZ2VfbG9vcF98IHRvIGV4ZWN1dGUgb3VyIGxpc3RlbmVyCi0gIC8vIGNhbGxiYWNrLiAgVGhlIGNhbGxiYWNrIGlzIGNyZWF0ZWQgdXNpbmcgQmluZFRvTG9vcCgpIHNvIHdpbGwgaG9wIG92ZXIKLSAgLy8gdG8gdGhlIGF1ZGlvIHRocmVhZCB1cG9uIGV4ZWN1dGlvbi4KLSAgY3JlYXRpbmdfbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soRlJPTV9IRVJFLCBCaW5kVG9Mb29wKAotICAgICAgR2V0TWVzc2FnZUxvb3AoKSwgYmFzZTo6QmluZCgKLSAgICAgICAgICAmQXVkaW9NYW5hZ2VyTWFjOjpOb3RpZnlBbGxPdXRwdXREZXZpY2VDaGFuZ2VMaXN0ZW5lcnMsCi0gICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpKTsKLX0KLQotQXVkaW9NYW5hZ2VyKiBDcmVhdGVBdWRpb01hbmFnZXIoKSB7Ci0gIHJldHVybiBuZXcgQXVkaW9NYW5hZ2VyTWFjKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL21hYy9hdWRpb19tYW5hZ2VyX21hYy5oIGIvc3JjL21lZGlhL2F1ZGlvL21hYy9hdWRpb19tYW5hZ2VyX21hYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGI2YjJkLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9tYWMvYXVkaW9fbWFuYWdlcl9tYWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfQVVESU9fTUFDX0FVRElPX01BTkFHRVJfTUFDX0hfCi0jZGVmaW5lIE1FRElBX0FVRElPX01BQ19BVURJT19NQU5BR0VSX01BQ19IXwotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wX3Byb3h5LmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fbWFuYWdlcl9iYXNlLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIE1hYyBPUyBYIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBdWRpb01hbmFnZXIgc2luZ2xldG9uLiBUaGlzIGNsYXNzIGlzIGludGVybmFsCi0vLyB0byB0aGUgYXVkaW8gb3V0cHV0IGFuZCBvbmx5IGludGVybmFsIHVzZXJzIGNhbiBjYWxsIG1ldGhvZHMgbm90IGV4cG9zZWQgYnkKLS8vIHRoZSBBdWRpb01hbmFnZXIgY2xhc3MuCi1jbGFzcyBNRURJQV9FWFBPUlQgQXVkaW9NYW5hZ2VyTWFjIDogcHVibGljIEF1ZGlvTWFuYWdlckJhc2UgewotIHB1YmxpYzoKLSAgQXVkaW9NYW5hZ2VyTWFjKCk7Ci0KLSAgLy8gSW1wbGVtZW50YXRpb24gb2YgQXVkaW9NYW5hZ2VyLgotICB2aXJ0dWFsIGJvb2wgSGFzQXVkaW9PdXRwdXREZXZpY2VzKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgYm9vbCBIYXNBdWRpb0lucHV0RGV2aWNlcygpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgR2V0QXVkaW9JbnB1dERldmljZU5hbWVzKG1lZGlhOjpBdWRpb0RldmljZU5hbWVzKiBkZXZpY2VfbmFtZXMpCi0gICAgICBPVkVSUklERTsKLQotICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBBdWRpb01hbmFnZXJCYXNlLgotICB2aXJ0dWFsIEF1ZGlvT3V0cHV0U3RyZWFtKiBNYWtlTGluZWFyT3V0cHV0U3RyZWFtKAotICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpIE9WRVJSSURFOwotICB2aXJ0dWFsIEF1ZGlvT3V0cHV0U3RyZWFtKiBNYWtlTG93TGF0ZW5jeU91dHB1dFN0cmVhbSgKLSAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKSBPVkVSUklERTsKLSAgdmlydHVhbCBBdWRpb0lucHV0U3RyZWFtKiBNYWtlTGluZWFySW5wdXRTdHJlYW0oCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgQXVkaW9JbnB1dFN0cmVhbSogTWFrZUxvd0xhdGVuY3lJbnB1dFN0cmVhbSgKLSAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2lkKSBPVkVSUklERTsKLSAgdmlydHVhbCBBdWRpb1BhcmFtZXRlcnMgR2V0UHJlZmVycmVkTG93TGF0ZW5jeU91dHB1dFN0cmVhbVBhcmFtZXRlcnMoCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIGlucHV0X3BhcmFtcykgT1ZFUlJJREU7Ci0KLSAgLy8gQ2FsbGVkIGJ5IGFuIGludGVybmFsIGRldmljZSBjaGFuZ2UgbGlzdGVuZXIuICBNdXN0IGJlIGNhbGxlZCBvbgotICAvLyB8Y3JlYXRpbmdfbWVzc2FnZV9sb29wX3wuCi0gIHZvaWQgT25EZXZpY2VDaGFuZ2UoKTsKLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB+QXVkaW9NYW5hZ2VyTWFjKCk7Ci0KLSBwcml2YXRlOgotICBib29sIGxpc3RlbmVyX3JlZ2lzdGVyZWRfOwotICBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+IGNyZWF0aW5nX21lc3NhZ2VfbG9vcF87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEF1ZGlvTWFuYWdlck1hYyk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9BVURJT19NQUNfQVVESU9fTUFOQUdFUl9NQUNfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9tYWMvYXVkaW9fb3V0cHV0X21hYy5jYyBiL3NyYy9tZWRpYS9hdWRpby9tYWMvYXVkaW9fb3V0cHV0X21hYy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBlMGFmYS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vbWFjL2F1ZGlvX291dHB1dF9tYWMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NTMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL21hYy9hdWRpb19vdXRwdXRfbWFjLmgiCi0KLSNpbmNsdWRlIDxDb3JlU2VydmljZXMvQ29yZVNlcnZpY2VzLmg+Ci0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3V0aWwuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9tYWMvYXVkaW9fbWFuYWdlcl9tYWMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2NoYW5uZWxfbWl4ZXIuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gQSBjdXN0b20gZGF0YSBzdHJ1Y3R1cmUgdG8gc3RvcmUgaW5mb3JtYXRpb24gYW4gQXVkaW9RdWV1ZSBidWZmZXIuCi1zdHJ1Y3QgQXVkaW9RdWV1ZVVzZXJEYXRhIHsKLSAgQXVkaW9RdWV1ZVVzZXJEYXRhKCkgOiBlbXB0eV9idWZmZXIoZmFsc2UpIHt9Ci0gIGJvb2wgZW1wdHlfYnVmZmVyOwotfTsKLQotLy8gT3ZlcnZpZXcgb2Ygb3BlcmF0aW9uOgotLy8gMSkgQW4gb2JqZWN0IG9mIFBDTVF1ZXVlT3V0QXVkaW9PdXRwdXRTdHJlYW0gaXMgY3JlYXRlZCBieSB0aGUgQXVkaW9NYW5hZ2VyCi0vLyBmYWN0b3J5OiBhdWRpb19tYW4tPk1ha2VBdWRpb1N0cmVhbSgpLiBUaGlzIGp1c3QgZmlsbHMgc29tZSBzdHJ1Y3R1cmUuCi0vLyAyKSBOZXh0IHNvbWUgdGhyZWFkIHdpbGwgY2FsbCBPcGVuKCksIGF0IHRoYXQgcG9pbnQgdGhlIHVuZGVybGl5aW5nIE9TCi0vLyBxdWV1ZSBpcyBjcmVhdGVkIGFuZCB0aGUgYXVkaW8gYnVmZmVycyBhbGxvY2F0ZWQuCi0vLyAzKSBUaGVuIHNvbWUgdGhyZWFkIHdpbGwgY2FsbCBTdGFydChzb3VyY2UpIEF0IHRoaXMgcG9pbnQgdGhlIHNvdXJjZSB3aWxsIGJlCi0vLyBjYWxsZWQgdG8gZmlsbCB0aGUgaW5pdGlhbCBidWZmZXJzIGluIHRoZSBjb250ZXh0IG9mIHRoYXQgc2FtZSB0aHJlYWQuCi0vLyBUaGVuIHRoZSBPUyBxdWV1ZSBpcyBzdGFydGVkIHdoaWNoIHdpbGwgY3JlYXRlIGl0cyBvd24gdGhyZWFkIHdoaWNoCi0vLyBwZXJpb2RpY2FsbHkgd2lsbCBjYWxsIHRoZSBzb3VyY2UgZm9yIG1vcmUgZGF0YSBhcyBidWZmZXJzIGFyZSBiZWluZwotLy8gY29uc3VtZWQuCi0vLyA0KSBBdCBzb21lIHBvaW50IHNvbWUgdGhyZWFkIHdpbGwgY2FsbCBTdG9wKCksIHdoaWNoIHdlIGhhbmRsZSBieSBkaXJlY3RseQotLy8gc3RvcGluZyB0aGUgT1MgcXVldWUuCi0vLyA1KSBPbmUgbW9yZSBjYWxsYmFjayB0byB0aGUgc291cmNlIGNvdWxkIGJlIGRlbGl2ZXJlZCBpbiBpbiB0aGUgY29udGV4dCBvZgotLy8gdGhlIHF1ZXVlJ3Mgb3duIHRocmVhZC4gRGF0YSwgaWYgYW55IHdpbGwgYmUgZGlzY2FyZWQuCi0vLyA2KSBUaGUgc2FtZSB0aHJlYWQgdGhhdCBjYWxsZWQgc3RvcCB3aWxsIGNhbGwgQ2xvc2UoKSB3aGVyZSB3ZSBjbGVhbnVwCi0vLyBhbmQgbm90aWZpeSB0aGUgYXVkaW8gbWFuYWdlciwgd2hpY2ggbGlrbGV5IHdpbGwgZGVzdHJveSB0aGlzIG9iamVjdC4KLQotUENNUXVldWVPdXRBdWRpb091dHB1dFN0cmVhbTo6UENNUXVldWVPdXRBdWRpb091dHB1dFN0cmVhbSgKLSAgICBBdWRpb01hbmFnZXJNYWMqIG1hbmFnZXIsIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKQotICAgIDogYXVkaW9fcXVldWVfKE5VTEwpLAotICAgICAgc291cmNlXyhOVUxMKSwKLSAgICAgIG1hbmFnZXJfKG1hbmFnZXIpLAotICAgICAgcGFja2V0X3NpemVfKHBhcmFtcy5HZXRCeXRlc1BlckJ1ZmZlcigpKSwKLSAgICAgIHNpbGVuY2VfYnl0ZXNfKDApLAotICAgICAgdm9sdW1lXygxKSwKLSAgICAgIHBlbmRpbmdfYnl0ZXNfKDApLAotICAgICAgbnVtX3NvdXJjZV9jaGFubmVsc18ocGFyYW1zLmNoYW5uZWxzKCkpLAotICAgICAgc291cmNlX2xheW91dF8ocGFyYW1zLmNoYW5uZWxfbGF5b3V0KCkpLAotICAgICAgbnVtX2NvcmVfY2hhbm5lbHNfKDApLAotICAgICAgc2hvdWxkX3N3aXp6bGVfKGZhbHNlKSwKLSAgICAgIHN0b3BwZWRfZXZlbnRfKHRydWUgLyogbWFudWFsIHJlc2V0ICovLCBmYWxzZSAvKiBpbml0aWFsIHN0YXRlICovKSwKLSAgICAgIG51bV9idWZmZXJzX2xlZnRfKGtOdW1CdWZmZXJzKSwKLSAgICAgIGF1ZGlvX2J1c18oQXVkaW9CdXM6OkNyZWF0ZShwYXJhbXMpKSB7Ci0gIC8vIFdlIG11c3QgaGF2ZSBhIG1hbmFnZXIuCi0gIERDSEVDSyhtYW5hZ2VyXyk7Ci0gIC8vIEEgZnJhbWUgaXMgb25lIHNhbXBsZSBhY3Jvc3MgYWxsIGNoYW5uZWxzLiBJbiBpbnRlcmxlYXZlZCBhdWRpbyB0aGUgcGVyCi0gIC8vIGZyYW1lIGZpZWxkcyBpZGVudGlmeSB0aGUgc2V0IG9mIG4gfGNoYW5uZWxzfC4gSW4gdW5jb21wcmVzc2VkIGF1ZGlvLCBhCi0gIC8vIHBhY2tldCBpcyBhbHdheXMgb25lIGZyYW1lLgotICBmb3JtYXRfLm1TYW1wbGVSYXRlID0gcGFyYW1zLnNhbXBsZV9yYXRlKCk7Ci0gIGZvcm1hdF8ubUZvcm1hdElEID0ga0F1ZGlvRm9ybWF0TGluZWFyUENNOwotICBmb3JtYXRfLm1Gb3JtYXRGbGFncyA9IGtMaW5lYXJQQ01Gb3JtYXRGbGFnSXNQYWNrZWQ7Ci0gIGZvcm1hdF8ubUJpdHNQZXJDaGFubmVsID0gcGFyYW1zLmJpdHNfcGVyX3NhbXBsZSgpOwotICBmb3JtYXRfLm1DaGFubmVsc1BlckZyYW1lID0gcGFyYW1zLmNoYW5uZWxzKCk7Ci0gIGZvcm1hdF8ubUZyYW1lc1BlclBhY2tldCA9IDE7Ci0gIGZvcm1hdF8ubUJ5dGVzUGVyUGFja2V0ID0gKGZvcm1hdF8ubUJpdHNQZXJDaGFubmVsICogcGFyYW1zLmNoYW5uZWxzKCkpIC8gODsKLSAgZm9ybWF0Xy5tQnl0ZXNQZXJGcmFtZSA9IGZvcm1hdF8ubUJ5dGVzUGVyUGFja2V0OwotICBmb3JtYXRfLm1SZXNlcnZlZCA9IDA7Ci0KLSAgbWVtc2V0KGJ1ZmZlcl8sIDAsIHNpemVvZihidWZmZXJfKSk7Ci0gIG1lbXNldChjb3JlX2NoYW5uZWxfb3JkZXJpbmdzXywgMCwgc2l6ZW9mKGNvcmVfY2hhbm5lbF9vcmRlcmluZ3NfKSk7Ci0gIG1lbXNldChjaGFubmVsX3JlbWFwXywgMCwgc2l6ZW9mKGNoYW5uZWxfcmVtYXBfKSk7Ci0KLSAgaWYgKHBhcmFtcy5iaXRzX3Blcl9zYW1wbGUoKSA+IDgpIHsKLSAgICBmb3JtYXRfLm1Gb3JtYXRGbGFncyB8PSBrTGluZWFyUENNRm9ybWF0RmxhZ0lzU2lnbmVkSW50ZWdlcjsKLSAgfQotCi0gIC8vIFNpbGVuY2UgYnVmZmVyIGhhcyBhIGR1cmF0aW9uIG9mIDZtcyB0byBzaW11bGF0ZSB0aGUgYmVoYXZpb3Igb2YgV2luZG93cy4KLSAgLy8gVGhpcyB2YWx1ZSBpcyBjaG9vc2VuIGJ5IGV4cGVyaW1lbnRzIGFuZCBtYWNzIGNhbm5vdCBrZWVwIHVwIHdpdGgKLSAgLy8gYW55dGhpbmcgbGVzcyB0aGFuIDZtcy4KLSAgc2lsZW5jZV9ieXRlc18gPSBmb3JtYXRfLm1CeXRlc1BlckZyYW1lICogcGFyYW1zLnNhbXBsZV9yYXRlKCkgKiA2IC8gMTAwMDsKLX0KLQotUENNUXVldWVPdXRBdWRpb091dHB1dFN0cmVhbTo6flBDTVF1ZXVlT3V0QXVkaW9PdXRwdXRTdHJlYW0oKSB7Ci19Ci0KLXZvaWQgUENNUXVldWVPdXRBdWRpb091dHB1dFN0cmVhbTo6SGFuZGxlRXJyb3IoT1NTdGF0dXMgZXJyKSB7Ci0gIC8vIHNvdXJjZV8gY2FuIGJlIHNldCB0byBOVUxMIGZyb20gYW5vdGhlciB0aHJlYWQuIFdlIG5lZWQgdG8gY2FjaGUgaXRzCi0gIC8vIHBvaW50ZXIgd2hpbGUgd2Ugb3BlcmF0ZSBoZXJlLiBOb3RlIHRoYXQgZG9lcyBub3QgbWVhbiB0aGF0IHRoZSBzb3VyY2UKLSAgLy8gaGFzIGJlZW4gZGVzdHJveWVkLgotICBBdWRpb1NvdXJjZUNhbGxiYWNrKiBzb3VyY2UgPSBHZXRTb3VyY2UoKTsKLSAgaWYgKHNvdXJjZSkKLSAgICBzb3VyY2UtPk9uRXJyb3IodGhpcywgc3RhdGljX2Nhc3Q8aW50PihlcnIpKTsKLSAgTE9HKEVSUk9SKSA8PCAiZXJyb3IgIiA8PCBHZXRNYWNPU1N0YXR1c0Vycm9yU3RyaW5nKGVycikKLSAgICAgICAgICAgICA8PCAiICgiIDw8IGVyciA8PCAiKSI7Ci19Ci0KLWJvb2wgUENNUXVldWVPdXRBdWRpb091dHB1dFN0cmVhbTo6T3BlbigpIHsKLSAgLy8gR2V0IHRoZSBkZWZhdWx0IGRldmljZSBpZC4KLSAgQXVkaW9PYmplY3RJRCBkZXZpY2VfaWQgPSAwOwotICBBdWRpb09iamVjdFByb3BlcnR5QWRkcmVzcyBwcm9wZXJ0eV9hZGRyZXNzID0gewotICAgICAga0F1ZGlvSGFyZHdhcmVQcm9wZXJ0eURlZmF1bHRPdXRwdXREZXZpY2UsCi0gICAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eVNjb3BlR2xvYmFsLAotICAgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlFbGVtZW50TWFzdGVyCi0gIH07Ci0gIFVJbnQzMiBkZXZpY2VfaWRfc2l6ZSA9IHNpemVvZihkZXZpY2VfaWQpOwotICBPU1N0YXR1cyBlcnIgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YShrQXVkaW9PYmplY3RTeXN0ZW1PYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eV9hZGRyZXNzLCAwLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlX2lkX3NpemUsICZkZXZpY2VfaWQpOwotICBpZiAoZXJyICE9IG5vRXJyKSB7Ci0gICAgSGFuZGxlRXJyb3IoZXJyKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gR2V0IHRoZSBzaXplIG9mIHRoZSBjaGFubmVsIGxheW91dC4KLSAgVUludDMyIGNvcmVfbGF5b3V0X3NpemU7Ci0gIHByb3BlcnR5X2FkZHJlc3MubVNlbGVjdG9yID0ga0F1ZGlvRGV2aWNlUHJvcGVydHlQcmVmZXJyZWRDaGFubmVsTGF5b3V0OwotICBwcm9wZXJ0eV9hZGRyZXNzLm1TY29wZSA9IGtBdWRpb0RldmljZVByb3BlcnR5U2NvcGVPdXRwdXQ7Ci0gIGVyciA9IEF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhU2l6ZShkZXZpY2VfaWQsICZwcm9wZXJ0eV9hZGRyZXNzLCAwLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcmVfbGF5b3V0X3NpemUpOwotICBpZiAoZXJyICE9IG5vRXJyKSB7Ci0gICAgSGFuZGxlRXJyb3IoZXJyKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gR2V0IHRoZSBkZXZpY2UncyBjaGFubmVsIGxheW91dC4gIFRoaXMgbGF5b3V0IG1heSB2YXJ5IGluIHNpemVkIGJhc2VkIG9uCi0gIC8vIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMuICBVc2UgfGNvcmVfbGF5b3V0X3NpemV8IHRvIGFsbG9jYXRlIG1lbW9yeS4KLSAgc2NvcGVkX3B0cl9tYWxsb2M8QXVkaW9DaGFubmVsTGF5b3V0PiBjb3JlX2NoYW5uZWxfbGF5b3V0OwotICBjb3JlX2NoYW5uZWxfbGF5b3V0LnJlc2V0KAotICAgICAgcmVpbnRlcnByZXRfY2FzdDxBdWRpb0NoYW5uZWxMYXlvdXQqPihtYWxsb2MoY29yZV9sYXlvdXRfc2l6ZSkpKTsKLSAgbWVtc2V0KGNvcmVfY2hhbm5lbF9sYXlvdXQuZ2V0KCksIDAsIGNvcmVfbGF5b3V0X3NpemUpOwotICBlcnIgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YShkZXZpY2VfaWQsICZwcm9wZXJ0eV9hZGRyZXNzLCAwLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29yZV9sYXlvdXRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZV9jaGFubmVsX2xheW91dC5nZXQoKSk7Ci0gIGlmIChlcnIgIT0gbm9FcnIpIHsKLSAgICBIYW5kbGVFcnJvcihlcnIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIG51bV9jb3JlX2NoYW5uZWxzXyA9IHN0ZDo6bWluKAotICAgICAgc3RhdGljX2Nhc3Q8aW50PihDSEFOTkVMU19NQVgpLAotICAgICAgc3RhdGljX2Nhc3Q8aW50Pihjb3JlX2NoYW5uZWxfbGF5b3V0LT5tTnVtYmVyQ2hhbm5lbERlc2NyaXB0aW9ucykpOwotICBpZiAobnVtX2NvcmVfY2hhbm5lbHNfID09IDIgJiYKLSAgICAgIENoYW5uZWxMYXlvdXRUb0NoYW5uZWxDb3VudChzb3VyY2VfbGF5b3V0XykgPiAyKSB7Ci0gICAgY2hhbm5lbF9taXhlcl8ucmVzZXQobmV3IENoYW5uZWxNaXhlcigKLSAgICAgICAgc291cmNlX2xheW91dF8sIENIQU5ORUxfTEFZT1VUX1NURVJFTykpOwotICAgIG1peGVkX2F1ZGlvX2J1c18gPSBBdWRpb0J1czo6Q3JlYXRlKAotICAgICAgICBudW1fY29yZV9jaGFubmVsc18sIGF1ZGlvX2J1c18tPmZyYW1lcygpKTsKLQotICAgIGZvcm1hdF8ubUNoYW5uZWxzUGVyRnJhbWUgPSBudW1fY29yZV9jaGFubmVsc187Ci0gICAgZm9ybWF0Xy5tQnl0ZXNQZXJGcmFtZSA9IChmb3JtYXRfLm1CaXRzUGVyQ2hhbm5lbCA+PiAzKSAqCi0gICAgICAgIGZvcm1hdF8ubUNoYW5uZWxzUGVyRnJhbWU7Ci0gICAgZm9ybWF0Xy5tQnl0ZXNQZXJQYWNrZXQgPSBmb3JtYXRfLm1CeXRlc1BlckZyYW1lICogZm9ybWF0Xy5tRnJhbWVzUGVyUGFja2V0OwotICB9Ci0KLSAgLy8gQ3JlYXRlIHRoZSBhY3R1YWwgcXVldWUgb2JqZWN0IGFuZCBsZXQgdGhlIE9TIHVzZSBpdHMgb3duIHRocmVhZCB0bwotICAvLyBydW4gaXRzIENGUnVuTG9vcC4KLSAgZXJyID0gQXVkaW9RdWV1ZU5ld091dHB1dCgmZm9ybWF0XywgUmVuZGVyQ2FsbGJhY2ssIHRoaXMsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGUnVuTG9vcENvbW1vbk1vZGVzLCAwLCAmYXVkaW9fcXVldWVfKTsKLSAgaWYgKGVyciAhPSBub0VycikgewotICAgIEhhbmRsZUVycm9yKGVycik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIEFsbG9jYXRlIHRoZSBoYXJkd2FyZS1tYW5hZ2VkIGJ1ZmZlcnMuCi0gIGZvciAodWludDMyIGl4ID0gMDsgaXggIT0ga051bUJ1ZmZlcnM7ICsraXgpIHsKLSAgICBlcnIgPSBBdWRpb1F1ZXVlQWxsb2NhdGVCdWZmZXIoYXVkaW9fcXVldWVfLCBwYWNrZXRfc2l6ZV8sICZidWZmZXJfW2l4XSk7Ci0gICAgaWYgKGVyciAhPSBub0VycikgewotICAgICAgSGFuZGxlRXJyb3IoZXJyKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgLy8gQWxsb2NhdGUgbWVtb3J5IGZvciB1c2VyIGRhdGEuCi0gICAgYnVmZmVyX1tpeF0tPm1Vc2VyRGF0YSA9IG5ldyBBdWRpb1F1ZXVlVXNlckRhdGEoKTsKLSAgfQotICAvLyBTZXQgaW5pdGlhbCB2b2x1bWUgaGVyZS4KLSAgZXJyID0gQXVkaW9RdWV1ZVNldFBhcmFtZXRlcihhdWRpb19xdWV1ZV8sIGtBdWRpb1F1ZXVlUGFyYW1fVm9sdW1lLCAxLjApOwotICBpZiAoZXJyICE9IG5vRXJyKSB7Ci0gICAgSGFuZGxlRXJyb3IoZXJyKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBDYXB0dXJlIGNoYW5uZWwgbGF5b3V0IGluIGEgZm9ybWF0IHdlIGNhbiB1c2UuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgQ0hBTk5FTFNfTUFYOyArK2kpCi0gICAgY29yZV9jaGFubmVsX29yZGVyaW5nc19baV0gPSBrRW1wdHlDaGFubmVsOwotCi0gIGJvb2wgYWxsX2NoYW5uZWxzX3Vua25vd24gPSB0cnVlOwotICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9jb3JlX2NoYW5uZWxzXzsgKytpKSB7Ci0gICAgQXVkaW9DaGFubmVsTGFiZWwgbGFiZWwgPQotICAgICAgICBjb3JlX2NoYW5uZWxfbGF5b3V0LT5tQ2hhbm5lbERlc2NyaXB0aW9uc1tpXS5tQ2hhbm5lbExhYmVsOwotICAgIGlmIChsYWJlbCA9PSBrQXVkaW9DaGFubmVsTGFiZWxfVW5rbm93bikgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGFsbF9jaGFubmVsc191bmtub3duID0gZmFsc2U7Ci0gICAgc3dpdGNoIChsYWJlbCkgewotICAgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfTGVmdDoKLSAgICAgICAgY29yZV9jaGFubmVsX29yZGVyaW5nc19bTEVGVF0gPSBpOwotICAgICAgICBjaGFubmVsX3JlbWFwX1tpXSA9IENoYW5uZWxPcmRlcihzb3VyY2VfbGF5b3V0XywgTEVGVCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfUmlnaHQ6Ci0gICAgICAgIGNvcmVfY2hhbm5lbF9vcmRlcmluZ3NfW1JJR0hUXSA9IGk7Ci0gICAgICAgIGNoYW5uZWxfcmVtYXBfW2ldID0gQ2hhbm5lbE9yZGVyKHNvdXJjZV9sYXlvdXRfLCBSSUdIVCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfQ2VudGVyOgotICAgICAgICBjb3JlX2NoYW5uZWxfb3JkZXJpbmdzX1tDRU5URVJdID0gaTsKLSAgICAgICAgY2hhbm5lbF9yZW1hcF9baV0gPSBDaGFubmVsT3JkZXIoc291cmNlX2xheW91dF8sIENFTlRFUik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfTEZFU2NyZWVuOgotICAgICAgICBjb3JlX2NoYW5uZWxfb3JkZXJpbmdzX1tMRkVdID0gaTsKLSAgICAgICAgY2hhbm5lbF9yZW1hcF9baV0gPSBDaGFubmVsT3JkZXIoc291cmNlX2xheW91dF8sIExGRSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfTGVmdFN1cnJvdW5kOgotICAgICAgICBjb3JlX2NoYW5uZWxfb3JkZXJpbmdzX1tTSURFX0xFRlRdID0gaTsKLSAgICAgICAgY2hhbm5lbF9yZW1hcF9baV0gPSBDaGFubmVsT3JkZXIoc291cmNlX2xheW91dF8sIFNJREVfTEVGVCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfUmlnaHRTdXJyb3VuZDoKLSAgICAgICAgY29yZV9jaGFubmVsX29yZGVyaW5nc19bU0lERV9SSUdIVF0gPSBpOwotICAgICAgICBjaGFubmVsX3JlbWFwX1tpXSA9IENoYW5uZWxPcmRlcihzb3VyY2VfbGF5b3V0XywgU0lERV9SSUdIVCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfTGVmdENlbnRlcjoKLSAgICAgICAgY29yZV9jaGFubmVsX29yZGVyaW5nc19bTEVGVF9PRl9DRU5URVJdID0gaTsKLSAgICAgICAgY2hhbm5lbF9yZW1hcF9baV0gPSBDaGFubmVsT3JkZXIoc291cmNlX2xheW91dF8sIExFRlRfT0ZfQ0VOVEVSKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGtBdWRpb0NoYW5uZWxMYWJlbF9SaWdodENlbnRlcjoKLSAgICAgICAgY29yZV9jaGFubmVsX29yZGVyaW5nc19bUklHSFRfT0ZfQ0VOVEVSXSA9IGk7Ci0gICAgICAgIGNoYW5uZWxfcmVtYXBfW2ldID0gQ2hhbm5lbE9yZGVyKHNvdXJjZV9sYXlvdXRfLCBSSUdIVF9PRl9DRU5URVIpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2Uga0F1ZGlvQ2hhbm5lbExhYmVsX0NlbnRlclN1cnJvdW5kOgotICAgICAgICBjb3JlX2NoYW5uZWxfb3JkZXJpbmdzX1tCQUNLX0NFTlRFUl0gPSBpOwotICAgICAgICBjaGFubmVsX3JlbWFwX1tpXSA9IENoYW5uZWxPcmRlcihzb3VyY2VfbGF5b3V0XywgQkFDS19DRU5URVIpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2Uga0F1ZGlvQ2hhbm5lbExhYmVsX1JlYXJTdXJyb3VuZExlZnQ6Ci0gICAgICAgIGNvcmVfY2hhbm5lbF9vcmRlcmluZ3NfW0JBQ0tfTEVGVF0gPSBpOwotICAgICAgICBjaGFubmVsX3JlbWFwX1tpXSA9IENoYW5uZWxPcmRlcihzb3VyY2VfbGF5b3V0XywgQkFDS19MRUZUKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGtBdWRpb0NoYW5uZWxMYWJlbF9SZWFyU3Vycm91bmRSaWdodDoKLSAgICAgICAgY29yZV9jaGFubmVsX29yZGVyaW5nc19bQkFDS19SSUdIVF0gPSBpOwotICAgICAgICBjaGFubmVsX3JlbWFwX1tpXSA9IENoYW5uZWxPcmRlcihzb3VyY2VfbGF5b3V0XywgQkFDS19SSUdIVCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgRExPRyhXQVJOSU5HKSA8PCAiQ2hhbm5lbCBsYWJlbCBub3Qgc3VwcG9ydGVkIjsKLSAgICAgICAgY2hhbm5lbF9yZW1hcF9baV0gPSBrRW1wdHlDaGFubmVsOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBpZiAoYWxsX2NoYW5uZWxzX3Vua25vd24pIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSBsYXlvdXQuCi0gIC8vIElmIHRoZSBkZXZpY2UgaGFzIGEgQkFDS19MRUZUIGFuZCBubyBTSURFX0xFRlQgYW5kIHRoZSBzb3VyY2UgaGFzCi0gIC8vIGEgU0lERV9MRUZUIGJ1dCBubyBCQUNLX0xFRlQsIHRoZW4gbW92ZSAoYW5kIHByZXNlcnZlIHRoZSBjaGFubmVsKS4KLSAgLy8gZS5nLiBDSEFOTkVMX0xBWU9VVF81UE9JTlQxIC0+IENIQU5ORUxfTEFZT1VUXzVQT0lOVDFfQkFDSwotICBDaGVja0ZvckFkanVzdGVkTGF5b3V0KFNJREVfTEVGVCwgQkFDS19MRUZUKTsKLSAgLy8gU2FtZSBmb3IgU0lERV9SSUdIVCAtPiBCQUNLX1JJR0hULgotICBDaGVja0ZvckFkanVzdGVkTGF5b3V0KFNJREVfUklHSFQsIEJBQ0tfUklHSFQpOwotICAvLyBNb3ZlIEJBQ0tfTEVGVCB0byBTSURFX0xFRlQuCi0gIC8vIGUuZy4gQ0hBTk5FTF9MQVlPVVRfNVBPSU5UMV9CQUNLIC0+IENIQU5ORUxfTEFZT1VUXzVQT0lOVDEKLSAgQ2hlY2tGb3JBZGp1c3RlZExheW91dChCQUNLX0xFRlQsIFNJREVfTEVGVCk7Ci0gIC8vIFNhbWUgZm9yIEJBQ0tfUklHSFQgLT4gU0lERV9SSUdIVC4KLSAgQ2hlY2tGb3JBZGp1c3RlZExheW91dChCQUNLX1JJR0hULCBTSURFX1JJR0hUKTsKLSAgLy8gTW92ZSBTSURFX0xFRlQgdG8gTEVGVF9PRl9DRU5URVIuCi0gIC8vIGUuZy4gQ0hBTk5FTF9MQVlPVVRfN1BPSU5UMSAtPiBDSEFOTkVMX0xBWU9VVF83UE9JTlQxX1dJREUKLSAgQ2hlY2tGb3JBZGp1c3RlZExheW91dChTSURFX0xFRlQsIExFRlRfT0ZfQ0VOVEVSKTsKLSAgLy8gU2FtZSBmb3IgU0lERV9SSUdIVCAtPiBSSUdIVF9PRl9DRU5URVIuCi0gIENoZWNrRm9yQWRqdXN0ZWRMYXlvdXQoU0lERV9SSUdIVCwgUklHSFRfT0ZfQ0VOVEVSKTsKLSAgLy8gTW92ZSBMRUZUX09GX0NFTlRFUiB0byBTSURFX0xFRlQuCi0gIC8vIGUuZy4gQ0hBTk5FTF9MQVlPVVRfN1BPSU5UMV9XSURFIC0+IENIQU5ORUxfTEFZT1VUXzdQT0lOVDEKLSAgQ2hlY2tGb3JBZGp1c3RlZExheW91dChMRUZUX09GX0NFTlRFUiwgU0lERV9MRUZUKTsKLSAgLy8gU2FtZSBmb3IgUklHSFRfT0ZfQ0VOVEVSIC0+IFNJREVfUklHSFQuCi0gIENoZWNrRm9yQWRqdXN0ZWRMYXlvdXQoUklHSFRfT0ZfQ0VOVEVSLCBTSURFX1JJR0hUKTsKLSAgLy8gRm9yIE1PTk8gLT4gU1RFUkVPLCBtb3ZlIGF1ZGlvIHRvIExFRlQgYW5kIFJJR0hUIGlmIGFwcGxpY2FibGUuCi0gIENoZWNrRm9yQWRqdXN0ZWRMYXlvdXQoQ0VOVEVSLCBMRUZUKTsKLSAgQ2hlY2tGb3JBZGp1c3RlZExheW91dChDRU5URVIsIFJJR0hUKTsKLQotICAvLyBDaGVjayBpZiB3ZSB3aWxsIG5lZWQgdG8gc3dpenpsZSBmcm9tIHNvdXJjZSB0byBkZXZpY2UgbGF5b3V0IChtYXliZSBub3QhKS4KLSAgc2hvdWxkX3N3aXp6bGVfID0gZmFsc2U7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2NvcmVfY2hhbm5lbHNfOyArK2kpIHsKLSAgICBpZiAoQ2hhbm5lbE9yZGVyKHNvdXJjZV9sYXlvdXRfLCBzdGF0aWNfY2FzdDxDaGFubmVscz4oaSkpICE9Ci0gICAgICAgIGNvcmVfY2hhbm5lbF9vcmRlcmluZ3NfW2ldKSB7Ci0gICAgICBzaG91bGRfc3dpenpsZV8gPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUENNUXVldWVPdXRBdWRpb091dHB1dFN0cmVhbTo6Q2xvc2UoKSB7Ci0gIC8vIEl0IGlzIHZhbGlkIHRvIGNhbGwgQ2xvc2UoKSBiZWZvcmUgY2FsbGluZyBPcGVuKCksIHRodXMgYXVkaW9fcXVldWVfCi0gIC8vIG1pZ2h0IGJlIE5VTEwuCi0gIGlmIChhdWRpb19xdWV1ZV8pIHsKLSAgICBPU1N0YXR1cyBlcnIgPSAwOwotICAgIGZvciAodWludDMyIGl4ID0gMDsgaXggIT0ga051bUJ1ZmZlcnM7ICsraXgpIHsKLSAgICAgIGlmIChidWZmZXJfW2l4XSkgewotICAgICAgICAvLyBGcmVlIHVzZXIgZGF0YS4KLSAgICAgICAgZGVsZXRlIHN0YXRpY19jYXN0PEF1ZGlvUXVldWVVc2VyRGF0YSo+KGJ1ZmZlcl9baXhdLT5tVXNlckRhdGEpOwotICAgICAgICAvLyBGcmVlIEF1ZGlvUXVldWUgYnVmZmVyLgotICAgICAgICBlcnIgPSBBdWRpb1F1ZXVlRnJlZUJ1ZmZlcihhdWRpb19xdWV1ZV8sIGJ1ZmZlcl9baXhdKTsKLSAgICAgICAgaWYgKGVyciAhPSBub0VycikgewotICAgICAgICAgIEhhbmRsZUVycm9yKGVycik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZXJyID0gQXVkaW9RdWV1ZURpc3Bvc2UoYXVkaW9fcXVldWVfLCB0cnVlKTsKLSAgICBpZiAoZXJyICE9IG5vRXJyKQotICAgICAgSGFuZGxlRXJyb3IoZXJyKTsKLSAgfQotICAvLyBJbmZvcm0gdGhlIGF1ZGlvIG1hbmFnZXIgdGhhdCB3ZSBoYXZlIGJlZW4gY2xvc2VkLiBUaGlzIGNhbiBjYXVzZSBvdXIKLSAgLy8gZGVzdHJ1Y3Rpb24uCi0gIG1hbmFnZXJfLT5SZWxlYXNlT3V0cHV0U3RyZWFtKHRoaXMpOwotfQotCi12b2lkIFBDTVF1ZXVlT3V0QXVkaW9PdXRwdXRTdHJlYW06OlN0b3AoKSB7Ci0gIGlmIChzb3VyY2VfKSB7Ci0gICAgLy8gV2UgcmVxdWVzdCBhIHN5bmNocm9ub3VzIHN0b3AsIHNvIHRoZSBuZXh0IGNhbGwgY2FuIHRha2Ugc29tZSB0aW1lLiBJbgotICAgIC8vIHRoZSB3aW5kb3dzIGltcGxlbWVudGF0aW9uIHdlIGJsb2NrIGhlcmUgYXMgd2VsbC4KLSAgICBTZXRTb3VyY2UoTlVMTCk7Ci0gICAgc3RvcHBlZF9ldmVudF8uV2FpdCgpOwotICB9Ci19Ci0KLXZvaWQgUENNUXVldWVPdXRBdWRpb091dHB1dFN0cmVhbTo6U2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpIHsKLSAgaWYgKCFhdWRpb19xdWV1ZV8pCi0gICAgcmV0dXJuOwotICB2b2x1bWVfID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZvbHVtZSk7Ci0gIE9TU3RhdHVzIGVyciA9IEF1ZGlvUXVldWVTZXRQYXJhbWV0ZXIoYXVkaW9fcXVldWVfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBdWRpb1F1ZXVlUGFyYW1fVm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSk7Ci0gIGlmIChlcnIgIT0gbm9FcnIpIHsKLSAgICBIYW5kbGVFcnJvcihlcnIpOwotICB9Ci19Ci0KLXZvaWQgUENNUXVldWVPdXRBdWRpb091dHB1dFN0cmVhbTo6R2V0Vm9sdW1lKGRvdWJsZSogdm9sdW1lKSB7Ci0gIGlmICghYXVkaW9fcXVldWVfKQotICAgIHJldHVybjsKLSAgKnZvbHVtZSA9IHZvbHVtZV87Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIEZvcm1hdD4KLXZvaWQgUENNUXVldWVPdXRBdWRpb091dHB1dFN0cmVhbTo6U3dpenpsZUxheW91dChGb3JtYXQqIGIsIHVpbnQzMiBmaWxsZWQpIHsKLSAgRm9ybWF0IHNyY19mb3JtYXRbbnVtX3NvdXJjZV9jaGFubmVsc19dOwotICBpbnQgZmlsbGVkX2NoYW5uZWxzID0gKG51bV9jb3JlX2NoYW5uZWxzXyA8IG51bV9zb3VyY2VfY2hhbm5lbHNfKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBudW1fY29yZV9jaGFubmVsc18gOiBudW1fc291cmNlX2NoYW5uZWxzXzsKLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBmaWxsZWQ7IGkgKz0gc2l6ZW9mKHNyY19mb3JtYXQpLAotICAgICAgYiArPSBudW1fc291cmNlX2NoYW5uZWxzXykgewotICAgIC8vIFRPRE8oZmJhcmNoYXJkKTogVGhpcyBjb3VsZCBiZSBmdXJ0aGVyIG9wdGltaXplZCB3aXRoIHBzaHVmYi4KLSAgICBtZW1jcHkoc3JjX2Zvcm1hdCwgYiwgc2l6ZW9mKHNyY19mb3JtYXQpKTsKLSAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgZmlsbGVkX2NoYW5uZWxzOyArK2NoKSB7Ci0gICAgICBpZiAoY2hhbm5lbF9yZW1hcF9bY2hdICE9IGtFbXB0eUNoYW5uZWwgJiYKLSAgICAgICAgICBjaGFubmVsX3JlbWFwX1tjaF0gPD0gQ0hBTk5FTFNfTUFYKSB7Ci0gICAgICAgIGJbY2hdID0gc3JjX2Zvcm1hdFtjaGFubmVsX3JlbWFwX1tjaF1dOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYltjaF0gPSAwOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1ib29sIFBDTVF1ZXVlT3V0QXVkaW9PdXRwdXRTdHJlYW06OkNoZWNrRm9yQWRqdXN0ZWRMYXlvdXQoCi0gICAgQ2hhbm5lbHMgaW5wdXRfY2hhbm5lbCwKLSAgICBDaGFubmVscyBvdXRwdXRfY2hhbm5lbCkgewotICBpZiAoY29yZV9jaGFubmVsX29yZGVyaW5nc19bb3V0cHV0X2NoYW5uZWxdID4ga0VtcHR5Q2hhbm5lbCAmJgotICAgICAgY29yZV9jaGFubmVsX29yZGVyaW5nc19baW5wdXRfY2hhbm5lbF0gPT0ga0VtcHR5Q2hhbm5lbCAmJgotICAgICAgQ2hhbm5lbE9yZGVyKHNvdXJjZV9sYXlvdXRfLCBpbnB1dF9jaGFubmVsKSA+IGtFbXB0eUNoYW5uZWwgJiYKLSAgICAgIENoYW5uZWxPcmRlcihzb3VyY2VfbGF5b3V0Xywgb3V0cHV0X2NoYW5uZWwpID09IGtFbXB0eUNoYW5uZWwpIHsKLSAgICBjaGFubmVsX3JlbWFwX1tjb3JlX2NoYW5uZWxfb3JkZXJpbmdzX1tvdXRwdXRfY2hhbm5lbF1dID0KLSAgICAgICAgQ2hhbm5lbE9yZGVyKHNvdXJjZV9sYXlvdXRfLCBpbnB1dF9jaGFubmVsKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIE5vdGUgdG8gZnV0dXJlIGhhY2tlcnMgb2YgdGhpcyBmdW5jdGlvbjogRG8gbm90IGFkZCBsb2NrcyB0byB0aGlzIGZ1bmN0aW9uCi0vLyB0aGF0IGFyZSBoZWxkIHRocm91Z2ggYW55IGNhbGxzIG1hZGUgYmFjayBpbnRvIEF1ZGlvUXVldWUgQVBJcywgb3Igb3RoZXIKLS8vIE9TIGF1ZGlvIGZ1bmN0aW9ucy4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgT1MgZGlzcGF0Y2ggbWF5IGdyYWIgZXh0ZXJuYWwKLS8vIGxvY2tzLCBvciBwb3NzaWJseSByZS1lbnRlciB0aGlzIGZ1bmN0aW9uIHdoaWNoIGNhbiBsZWFkIHRvIGEgZGVhZGxvY2suCi12b2lkIFBDTVF1ZXVlT3V0QXVkaW9PdXRwdXRTdHJlYW06OlJlbmRlckNhbGxiYWNrKHZvaWQqIHBfdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9RdWV1ZVJlZiBxdWV1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9RdWV1ZUJ1ZmZlclJlZiBidWZmZXIpIHsKLSAgVFJBQ0VfRVZFTlQwKCJhdWRpbyIsICJQQ01RdWV1ZU91dEF1ZGlvT3V0cHV0U3RyZWFtOjpSZW5kZXJDYWxsYmFjayIpOwotCi0gIFBDTVF1ZXVlT3V0QXVkaW9PdXRwdXRTdHJlYW0qIGF1ZGlvX3N0cmVhbSA9Ci0gICAgICBzdGF0aWNfY2FzdDxQQ01RdWV1ZU91dEF1ZGlvT3V0cHV0U3RyZWFtKj4ocF90aGlzKTsKLQotICAvLyBDYWxsIHRoZSBhdWRpbyBzb3VyY2UgdG8gZmlsbCB0aGUgZnJlZSBidWZmZXIgd2l0aCBkYXRhLiBOb3QgaGF2aW5nIGEKLSAgLy8gc291cmNlIG1lYW5zIHRoYXQgdGhlIHF1ZXVlIGhhcyBiZWVuIHN0b3BwZWQuCi0gIEF1ZGlvU291cmNlQ2FsbGJhY2sqIHNvdXJjZSA9IGF1ZGlvX3N0cmVhbS0+R2V0U291cmNlKCk7Ci0gIGlmICghc291cmNlKSB7Ci0gICAgLy8gUENNUXVldWVPdXRBdWRpb091dHB1dFN0cmVhbTo6U3RvcCgpIGlzIHdhaXRpbmcgZm9yIGNhbGxiYWNrIHRvCi0gICAgLy8gc3RvcCB0aGUgc3RyZWFtIGFuZCBzaWduYWwgd2hlbiBhbGwgY2FsbGJhY2tzIGFyZSBkb25lLgotICAgIC8vICh3ZSBwcm9iYWJseSBjYW4gc3RvcCB0aGUgc3RyZWFtIHRoZXJlLCBidXQgaXQgaXMgYmV0dGVyIHRvIGhhdmUKLSAgICAvLyBhbGwgdGhlIGNvbXBsZXggbG9naWMgaW4gb25lIHBsYWNlOyBzdG9wcGluZyBsYXRlbmN5IGlzIG5vdCB2ZXJ5Ci0gICAgLy8gaW1wb3J0YW50IGlmIHlvdSByZXVzZSBhdWRpbyBzdHJlYW0gaW4gdGhlIG1peGVyIGFuZCBub3QgY2xvc2UgaXQKLSAgICAvLyBpbW1lZGlhdGVseSkuCi0gICAgLS1hdWRpb19zdHJlYW0tPm51bV9idWZmZXJzX2xlZnRfOwotICAgIGlmIChhdWRpb19zdHJlYW0tPm51bV9idWZmZXJzX2xlZnRfID09IGtOdW1CdWZmZXJzIC0gMSkgewotICAgICAgLy8gRmlyc3QgYnVmZmVyIGFmdGVyIHN0b3AgcmVxdWVzdGVkLCBzdG9wIHRoZSBxdWV1ZS4KLSAgICAgIE9TU3RhdHVzIGVyciA9IEF1ZGlvUXVldWVTdG9wKGF1ZGlvX3N0cmVhbS0+YXVkaW9fcXVldWVfLCB0cnVlKTsKLSAgICAgIGlmIChlcnIgIT0gbm9FcnIpCi0gICAgICAgIGF1ZGlvX3N0cmVhbS0+SGFuZGxlRXJyb3IoZXJyKTsKLSAgICB9Ci0gICAgaWYgKGF1ZGlvX3N0cmVhbS0+bnVtX2J1ZmZlcnNfbGVmdF8gPT0gMCkgewotICAgICAgLy8gTm93IHdlIGZpbmFsbHkgc2F3IGFsbCB0aGUgYnVmZmVycy4KLSAgICAgIC8vIFNpZ25hbCB0aGF0IHN0b3BwaW5nIGlzIGNvbXBsZXRlLgotICAgICAgLy8gU2hvdWxkIG5ldmVyIHRvdWNoIGF1ZGlvX3N0cmVhbSBhZnRlciBzaWduYWxpbmcgYXMgaXQKLSAgICAgIC8vIGNhbiBiZSBkZWxldGVkIGF0IGFueSBtb21lbnQuCi0gICAgICBhdWRpb19zdHJlYW0tPnN0b3BwZWRfZXZlbnRfLlNpZ25hbCgpOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBBZGp1c3QgdGhlIG51bWJlciBvZiBwZW5kaW5nIGJ5dGVzIGJ5IHN1YnRyYWN0aW5nIHRoZSBhbW91bnQgcGxheWVkLgotICBpZiAoIXN0YXRpY19jYXN0PEF1ZGlvUXVldWVVc2VyRGF0YSo+KGJ1ZmZlci0+bVVzZXJEYXRhKS0+ZW1wdHlfYnVmZmVyKQotICAgIGF1ZGlvX3N0cmVhbS0+cGVuZGluZ19ieXRlc18gLT0gYnVmZmVyLT5tQXVkaW9EYXRhQnl0ZVNpemU7Ci0KLSAgdWludDMyIGNhcGFjaXR5ID0gYnVmZmVyLT5tQXVkaW9EYXRhQnl0ZXNDYXBhY2l0eTsKLSAgQXVkaW9CdXMqIGF1ZGlvX2J1cyA9IGF1ZGlvX3N0cmVhbS0+YXVkaW9fYnVzXy5nZXQoKTsKLSAgRENIRUNLX0VRKAotICAgICAgYXVkaW9fYnVzLT5mcmFtZXMoKSAqIGF1ZGlvX3N0cmVhbS0+Zm9ybWF0Xy5tQnl0ZXNQZXJGcmFtZSwgY2FwYWNpdHkpOwotICAvLyBUT0RPKHNlcmdleXUpOiBTcGVjaWZ5IGNvcnJlY3QgaGFyZHdhcmUgZGVsYXkgZm9yIEF1ZGlvQnVmZmVyc1N0YXRlLgotICBpbnQgZnJhbWVzX2ZpbGxlZCA9IHNvdXJjZS0+T25Nb3JlRGF0YSgKLSAgICAgIGF1ZGlvX2J1cywgQXVkaW9CdWZmZXJzU3RhdGUoYXVkaW9fc3RyZWFtLT5wZW5kaW5nX2J5dGVzXywgMCkpOwotICB1aW50MzIgZmlsbGVkID0gZnJhbWVzX2ZpbGxlZCAqIGF1ZGlvX3N0cmVhbS0+Zm9ybWF0Xy5tQnl0ZXNQZXJGcmFtZTsKLQotICAvLyBUT0RPKGRhbGVjdXJ0aXMpOiBDaGFubmVsIGRvd25taXhpbmcsIHVwbWl4aW5nLCBzaG91bGQgYmUgZG9uZSBpbiBtaXhlcjsKLSAgLy8gdm9sdW1lIGFkanVzdCBzaG91bGQgdXNlIFNTRSBvcHRpbWl6ZWQgdmVjdG9yX2ZtdWwoKSBwcmlvciB0byBpbnRlcmxlYXZlLgotICBBdWRpb0J1cyogb3V0cHV0X2J1cyA9IGF1ZGlvX2J1czsKLSAgaWYgKGF1ZGlvX3N0cmVhbS0+Y2hhbm5lbF9taXhlcl8pIHsKLSAgICBvdXRwdXRfYnVzID0gYXVkaW9fc3RyZWFtLT5taXhlZF9hdWRpb19idXNfLmdldCgpOwotICAgIGF1ZGlvX3N0cmVhbS0+Y2hhbm5lbF9taXhlcl8tPlRyYW5zZm9ybShhdWRpb19idXMsIG91dHB1dF9idXMpOwotICB9Ci0KLSAgLy8gTm90ZTogSWYgdGhpcyBldmVyIGNoYW5nZXMgdG8gb3V0cHV0IHJhdyBmbG9hdCB0aGUgZGF0YSBtdXN0IGJlIGNsaXBwZWQKLSAgLy8gYW5kIHNhbml0aXplZCBzaW5jZSBpdCBtYXkgY29tZSBmcm9tIGFuIHVudHJ1c3RlZCBzb3VyY2Ugc3VjaCBhcyBOYUNsLgotICBvdXRwdXRfYnVzLT5Ub0ludGVybGVhdmVkKAotICAgICAgZnJhbWVzX2ZpbGxlZCwgYXVkaW9fc3RyZWFtLT5mb3JtYXRfLm1CaXRzUGVyQ2hhbm5lbCAvIDgsCi0gICAgICBidWZmZXItPm1BdWRpb0RhdGEpOwotCi0gIC8vIEluIG9yZGVyIHRvIGtlZXAgdGhlIGNhbGxiYWNrIHJ1bm5pbmcsIHdlIG5lZWQgdG8gcHJvdmlkZSBhIHBvc2l0aXZlIGFtb3VudAotICAvLyBvZiBkYXRhIHRvIHRoZSBhdWRpbyBxdWV1ZS4gVG8gc2ltdWxhdGUgdGhlIGJlaGF2aW9yIG9mIFdpbmRvd3MsIHdlIHdyaXRlCi0gIC8vIGEgYnVmZmVyIG9mIHNpbGVuY2UuCi0gIGlmICghZmlsbGVkKSB7Ci0gICAgQ0hFQ0soYXVkaW9fc3RyZWFtLT5zaWxlbmNlX2J5dGVzXyA8PSBzdGF0aWNfY2FzdDxpbnQ+KGNhcGFjaXR5KSk7Ci0gICAgZmlsbGVkID0gYXVkaW9fc3RyZWFtLT5zaWxlbmNlX2J5dGVzXzsKLQotICAgIC8vIEFzc3VtZSB1bnNpZ25lZCBhdWRpby4KLSAgICBpbnQgc2lsZW5jZV92YWx1ZSA9IDEyODsKLSAgICBpZiAoYXVkaW9fc3RyZWFtLT5mb3JtYXRfLm1CaXRzUGVyQ2hhbm5lbCA+IDgpIHsKLSAgICAgIC8vIFdoZW4gYml0cyBwZXIgY2hhbm5lbCBpcyBncmVhdGVyIHRoYW4gOCwgYXVkaW8gaXMgc2lnbmVkLgotICAgICAgc2lsZW5jZV92YWx1ZSA9IDA7Ci0gICAgfQotCi0gICAgbWVtc2V0KGJ1ZmZlci0+bUF1ZGlvRGF0YSwgc2lsZW5jZV92YWx1ZSwgZmlsbGVkKTsKLSAgICBzdGF0aWNfY2FzdDxBdWRpb1F1ZXVlVXNlckRhdGEqPihidWZmZXItPm1Vc2VyRGF0YSktPmVtcHR5X2J1ZmZlciA9IHRydWU7Ci0gIH0gZWxzZSBpZiAoZmlsbGVkID4gY2FwYWNpdHkpIHsKLSAgICAvLyBVc2VyIHByb2JhYmx5IG92ZXJyYW4gb3VyIGJ1ZmZlci4KLSAgICBhdWRpb19zdHJlYW0tPkhhbmRsZUVycm9yKDApOwotICAgIHJldHVybjsKLSAgfSBlbHNlIHsKLSAgICBzdGF0aWNfY2FzdDxBdWRpb1F1ZXVlVXNlckRhdGEqPihidWZmZXItPm1Vc2VyRGF0YSktPmVtcHR5X2J1ZmZlciA9IGZhbHNlOwotICB9Ci0KLSAgaWYgKGF1ZGlvX3N0cmVhbS0+c2hvdWxkX3N3aXp6bGVfKSB7Ci0gICAgLy8gSGFuZGxlIGNoYW5uZWwgb3JkZXIgZm9yIHN1cnJvdW5kIHNvdW5kIGF1ZGlvLgotICAgIGlmIChhdWRpb19zdHJlYW0tPmZvcm1hdF8ubUJpdHNQZXJDaGFubmVsID09IDgpIHsKLSAgICAgIGF1ZGlvX3N0cmVhbS0+U3dpenpsZUxheW91dChyZWludGVycHJldF9jYXN0PHVpbnQ4Kj4oYnVmZmVyLT5tQXVkaW9EYXRhKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsZWQpOwotICAgIH0gZWxzZSBpZiAoYXVkaW9fc3RyZWFtLT5mb3JtYXRfLm1CaXRzUGVyQ2hhbm5lbCA9PSAxNikgewotICAgICAgYXVkaW9fc3RyZWFtLT5Td2l6emxlTGF5b3V0KHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTYqPihidWZmZXItPm1BdWRpb0RhdGEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxlZCk7Ci0gICAgfSBlbHNlIGlmIChhdWRpb19zdHJlYW0tPmZvcm1hdF8ubUJpdHNQZXJDaGFubmVsID09IDMyKSB7Ci0gICAgICBhdWRpb19zdHJlYW0tPlN3aXp6bGVMYXlvdXQocmVpbnRlcnByZXRfY2FzdDxpbnQzMio+KGJ1ZmZlci0+bUF1ZGlvRGF0YSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbGVkKTsKLSAgICB9Ci0gIH0KLQotICBidWZmZXItPm1BdWRpb0RhdGFCeXRlU2l6ZSA9IGZpbGxlZDsKLQotICAvLyBJbmNyZW1lbnQgYnl0ZXMgYnkgYW1vdW50IGZpbGxlZCBpbnRvIGF1ZGlvIGJ1ZmZlciBpZiB0aGlzIGlzIG5vdCBhCi0gIC8vIHNpbGVuY2UgYnVmZmVyLgotICBpZiAoIXN0YXRpY19jYXN0PEF1ZGlvUXVldWVVc2VyRGF0YSo+KGJ1ZmZlci0+bVVzZXJEYXRhKS0+ZW1wdHlfYnVmZmVyKQotICAgIGF1ZGlvX3N0cmVhbS0+cGVuZGluZ19ieXRlc18gKz0gZmlsbGVkOwotICBpZiAoTlVMTCA9PSBxdWV1ZSkKLSAgICByZXR1cm47Ci0gIC8vIFF1ZXVlIHRoZSBhdWRpbyBkYXRhIHRvIHRoZSBhdWRpbyBkcml2ZXIuCi0gIE9TU3RhdHVzIGVyciA9IEF1ZGlvUXVldWVFbnF1ZXVlQnVmZmVyKHF1ZXVlLCBidWZmZXIsIDAsIE5VTEwpOwotICBpZiAoZXJyICE9IG5vRXJyKSB7Ci0gICAgaWYgKGVyciA9PSBrQXVkaW9RdWV1ZUVycl9FbnF1ZXVlRHVyaW5nUmVzZXQpIHsKLSAgICAgIC8vIFRoaXMgaXMgdGhlIGVycm9yIHlvdSBnZXQgaWYgeW91IHRyeSB0byBlbnF1ZXVlIGEgYnVmZmVyIGFuZCB0aGUKLSAgICAgIC8vIHF1ZXVlIGhhcyBiZWVuIGNsb3NlZC4gTm90IHJlYWxseSBhIHByb2JsZW0gaWYgaW5kZWVkIHRoZSBxdWV1ZQotICAgICAgLy8gaGFzIGJlZW4gY2xvc2VkLiAgV2UgcmVjaGVjayB0aGUgdmFsdWUgb2Ygc291cmNlIG5vdyB0byBzZWUgaWYgaXQgaGFzCi0gICAgICAvLyBpbmRlZWQgYmVlbiBjbG9zZWQuCi0gICAgICBpZiAoIWF1ZGlvX3N0cmVhbS0+R2V0U291cmNlKCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYXVkaW9fc3RyZWFtLT5IYW5kbGVFcnJvcihlcnIpOwotICB9Ci19Ci0KLXZvaWQgUENNUXVldWVPdXRBdWRpb091dHB1dFN0cmVhbTo6U3RhcnQoQXVkaW9Tb3VyY2VDYWxsYmFjayogY2FsbGJhY2spIHsKLSAgRENIRUNLKGNhbGxiYWNrKTsKLSAgRExPR19JRihFUlJPUiwgIWF1ZGlvX3F1ZXVlXykgPDwgIk9wZW4oKSBoYXMgbm90IGJlZW4gY2FsbGVkIHN1Y2Nlc3NmdWxseSI7Ci0gIGlmICghYXVkaW9fcXVldWVfKQotICAgIHJldHVybjsKLQotICBPU1N0YXR1cyBlcnIgPSBub0VycjsKLSAgU2V0U291cmNlKGNhbGxiYWNrKTsKLSAgcGVuZGluZ19ieXRlc18gPSAwOwotICBzdG9wcGVkX2V2ZW50Xy5SZXNldCgpOwotICBudW1fYnVmZmVyc19sZWZ0XyA9IGtOdW1CdWZmZXJzOwotICAvLyBBc2sgdGhlIHNvdXJjZSB0byBwcmUtZmlsbCBhbGwgb3VyIGJ1ZmZlcnMgYmVmb3JlIHBsYXlpbmcuCi0gIGZvciAodWludDMyIGl4ID0gMDsgaXggIT0ga051bUJ1ZmZlcnM7ICsraXgpIHsKLSAgICBidWZmZXJfW2l4XS0+bUF1ZGlvRGF0YUJ5dGVTaXplID0gMDsKLSAgICAvLyBDYWxsZXIgd2FpdHMgZm9yIDFzdCBwYWNrZXQgdG8gYmVjb21lIGF2YWlsYWJsZSwgYnV0IG5vdCBmb3Igb3RoZXJzLAotICAgIC8vIHNvIHdlIHdhaXQgZm9yIHRoZW0gaGVyZS4KLSAgICBpZiAoaXggIT0gMCkgewotICAgICAgQXVkaW9Tb3VyY2VDYWxsYmFjayogc291cmNlID0gR2V0U291cmNlKCk7Ci0gICAgICBpZiAoc291cmNlKQotICAgICAgICBzb3VyY2UtPldhaXRUaWxsRGF0YVJlYWR5KCk7Ci0gICAgfQotICAgIFJlbmRlckNhbGxiYWNrKHRoaXMsIE5VTEwsIGJ1ZmZlcl9baXhdKTsKLSAgfQotCi0gIC8vIFF1ZXVlIHRoZSBidWZmZXJzIHRvIHRoZSBhdWRpbyBkcml2ZXIsIHNvdW5kcyBzdGFydHMgbm93LgotICBmb3IgKHVpbnQzMiBpeCA9IDA7IGl4ICE9IGtOdW1CdWZmZXJzOyArK2l4KSB7Ci0gICAgZXJyID0gQXVkaW9RdWV1ZUVucXVldWVCdWZmZXIoYXVkaW9fcXVldWVfLCBidWZmZXJfW2l4XSwgMCwgTlVMTCk7Ci0gICAgaWYgKGVyciAhPSBub0VycikgewotICAgICAgSGFuZGxlRXJyb3IoZXJyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLSAgZXJyICA9IEF1ZGlvUXVldWVTdGFydChhdWRpb19xdWV1ZV8sIE5VTEwpOwotICBpZiAoZXJyICE9IG5vRXJyKSB7Ci0gICAgSGFuZGxlRXJyb3IoZXJyKTsKLSAgICByZXR1cm47Ci0gIH0KLX0KLQotdm9pZCBQQ01RdWV1ZU91dEF1ZGlvT3V0cHV0U3RyZWFtOjpTZXRTb3VyY2UoQXVkaW9Tb3VyY2VDYWxsYmFjayogc291cmNlKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGxvY2soc291cmNlX2xvY2tfKTsKLSAgc291cmNlXyA9IHNvdXJjZTsKLX0KLQotQXVkaW9PdXRwdXRTdHJlYW06OkF1ZGlvU291cmNlQ2FsbGJhY2sqCi1QQ01RdWV1ZU91dEF1ZGlvT3V0cHV0U3RyZWFtOjpHZXRTb3VyY2UoKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGxvY2soc291cmNlX2xvY2tfKTsKLSAgcmV0dXJuIHNvdXJjZV87Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL21hYy9hdWRpb19vdXRwdXRfbWFjLmggYi9zcmMvbWVkaWEvYXVkaW8vbWFjL2F1ZGlvX291dHB1dF9tYWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRiMTJmMi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vbWFjL2F1ZGlvX291dHB1dF9tYWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0FVRElPX01BQ19BVURJT19PVVRQVVRfTUFDX0hfCi0jZGVmaW5lIE1FRElBX0FVRElPX01BQ19BVURJT19PVVRQVVRfTUFDX0hfCi0KLSNpbmNsdWRlIDxBdWRpb1Rvb2xib3gvQXVkaW9Gb3JtYXQuaD4KLSNpbmNsdWRlIDxBdWRpb1Rvb2xib3gvQXVkaW9RdWV1ZS5oPgotI2luY2x1ZGUgPEF1ZGlvVW5pdC9BdWRpb1VuaXQuaD4KLSNpbmNsdWRlIDxDb3JlQXVkaW8vQ29yZUF1ZGlvLmg+Ci0KLSNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCi0jaW5jbHVkZSAiYmFzZS9zeW5jaHJvbml6YXRpb24vbG9jay5oIgotI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL3dhaXRhYmxlX2V2ZW50LmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9faW8uaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19wYXJhbWV0ZXJzLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIEF1ZGlvTWFuYWdlck1hYzsKLWNsYXNzIENoYW5uZWxNaXhlcjsKLQotLy8gSW1wbGVtZW50YXRpb24gb2YgQXVkaW9PdXB1dFN0cmVhbSBmb3IgTWFjIE9TIFggdXNpbmcgdGhlIGF1ZGlvIHF1ZXVlIHNlcnZpY2UKLS8vIHByZXNlbnQgaW4gT1MgMTAuNSBhbmQgbGF0ZXIuIEF1ZGlvcXVldWUgaXMgdGhlIHN1Y2Nlc3NvciB0byB0aGUgU291bmRNYW5hZ2VyCi0vLyBzZXJ2aWNlcyBidXQgaXQgaXMgc3VwcG9ydGVkIGluIDY0IGJpdHMuCi1jbGFzcyBQQ01RdWV1ZU91dEF1ZGlvT3V0cHV0U3RyZWFtIDogcHVibGljIEF1ZGlvT3V0cHV0U3RyZWFtIHsKLSBwdWJsaWM6Ci0gIC8vIFRoZSBjdG9yIHRha2VzIGFsbCB0aGUgdXN1YWwgcGFyYW1ldGVycywgcGx1cyB8bWFuYWdlcnwgd2hpY2ggaXMgdGhlCi0gIC8vIHRoZSBhdWRpbyBtYW5hZ2VyIHdobyBpcyBjcmVhdGluZyB0aGlzIG9iamVjdC4KLSAgUENNUXVldWVPdXRBdWRpb091dHB1dFN0cmVhbShBdWRpb01hbmFnZXJNYWMqIG1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpOwotICAvLyBUaGUgZHRvciBpcyB0eXBpY2FsbHkgY2FsbGVkIGJ5IHRoZSBBdWRpb01hbmFnZXIgb25seSBhbmQgaXQgaXMgdXN1YWxseQotICAvLyB0cmlnZ2VyZWQgYnkgY2FsbGluZyBBdWRpb091dHB1dFN0cmVhbTo6Q2xvc2UoKS4KLSAgdmlydHVhbCB+UENNUXVldWVPdXRBdWRpb091dHB1dFN0cmVhbSgpOwotCi0gIC8vIEltcGxlbWVudGF0aW9uIG9mIEF1ZGlvT3V0cHV0U3RyZWFtLgotICB2aXJ0dWFsIGJvb2wgT3BlbigpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgQ2xvc2UoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0YXJ0KEF1ZGlvU291cmNlQ2FsbGJhY2sqIGNhbGxiYWNrKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0b3AoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFNldFZvbHVtZShkb3VibGUgdm9sdW1lKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIEdldFZvbHVtZShkb3VibGUqIHZvbHVtZSkgT1ZFUlJJREU7Ci0KLSBwcml2YXRlOgotICAvLyBUaGUgYXVkaW8gaXMgZG91YmxlIGJ1ZmZlcmVkLgotICBzdGF0aWMgY29uc3QgdWludDMyIGtOdW1CdWZmZXJzID0gMjsKLSAgc3RhdGljIGNvbnN0IGludCBrRW1wdHlDaGFubmVsID0gLTE7Ci0KLSAgLy8gUmVvcmRlciBQQ00gZnJvbSBzb3VyY2UgbGF5b3V0IHRvIGRldmljZSBsYXlvdXQgZm91bmQgaW4gQ29yZSBBdWRpby4KLSAgdGVtcGxhdGU8Y2xhc3MgRm9ybWF0PgotICB2b2lkIFN3aXp6bGVMYXlvdXQoRm9ybWF0KiBiLCB1aW50MzIgZmlsbGVkKTsKLSAgLy8gQ2hlY2sgYW5kIG1vdmUgY2hhbm5lbHMgaWYgc3Vycm91bmQgc291bmQgbGF5b3V0IG5lZWRzIGFkanVzdGVkLgotICBib29sIENoZWNrRm9yQWRqdXN0ZWRMYXlvdXQoQ2hhbm5lbHMgaW5wdXRfY2hhbm5lbCwgQ2hhbm5lbHMgb3V0cHV0X2NoYW5uZWwpOwotCi0gIC8vIFRoZSBPUyBjYWxscyBiYWNrIGhlcmUgd2hlbiBhbiBhdWRpbyBidWZmZXIgaGFzIGJlZW4gcHJvY2Vzc2VkLgotICBzdGF0aWMgdm9pZCBSZW5kZXJDYWxsYmFjayh2b2lkKiBwX3RoaXMsIEF1ZGlvUXVldWVSZWYgcXVldWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUXVldWVCdWZmZXJSZWYgYnVmZmVyKTsKLSAgLy8gQ2FsbGVkIHdoZW4gYW4gZXJyb3Igb2NjdXJzLgotICB2b2lkIEhhbmRsZUVycm9yKE9TU3RhdHVzIGVycik7Ci0KLSAgLy8gQXRvbWljIG9wZXJhdGlvbnMgZm9yIHNldHRpbmcvZ2V0dGluZyB0aGUgc291cmNlIGNhbGxiYWNrLgotICB2b2lkIFNldFNvdXJjZShBdWRpb1NvdXJjZUNhbGxiYWNrKiBzb3VyY2UpOwotICBBdWRpb1NvdXJjZUNhbGxiYWNrKiBHZXRTb3VyY2UoKTsKLQotICAvLyBTdHJ1Y3R1cmUgdGhhdCBob2xkcyB0aGUgc3RyZWFtIGZvcm1hdCBkZXRhaWxzIHN1Y2ggYXMgYml0cmF0ZS4KLSAgQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uIGZvcm1hdF87Ci0gIC8vIEhhbmRsZSB0byB0aGUgT1MgYXVkaW8gcXVldWUgb2JqZWN0LgotICBBdWRpb1F1ZXVlUmVmIGF1ZGlvX3F1ZXVlXzsKLSAgLy8gQXJyYXkgb2YgcG9pbnRlcnMgdG8gdGhlIE9TIG1hbmFnZWQgYXVkaW8gYnVmZmVycy4KLSAgQXVkaW9RdWV1ZUJ1ZmZlclJlZiBidWZmZXJfW2tOdW1CdWZmZXJzXTsKLSAgLy8gTXV0ZXggZm9yIHRoZSB8c291cmNlX3wgdG8gaW1wbG1lbnQgYXRvbWljIHNldCBhbmQgZ2V0LgotICAvLyBJdCBpcyBpbXBvcnRhbnQgdG8gTk9UIHdhaXQgb24gYW55IG90aGVyIGxvY2tzIHdoaWxlIHRoaXMgaXMgaGVsZC4KLSAgYmFzZTo6TG9jayBzb3VyY2VfbG9ja187Ci0gIC8vIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0aGF0IHdpbGwgcHJvdmlkZSB0aGUgYXVkaW8gc2FtcGxlcy4KLSAgQXVkaW9Tb3VyY2VDYWxsYmFjayogc291cmNlXzsKLSAgLy8gT3VyIGNyZWF0b3IsIHRoZSBhdWRpbyBtYW5hZ2VyIG5lZWRzIHRvIGJlIG5vdGlmaWVkIHdoZW4gd2UgY2xvc2UuCi0gIEF1ZGlvTWFuYWdlck1hYyogbWFuYWdlcl87Ci0gIC8vIFBhY2tldCBzaXplIGluIGJ5dGVzLgotICB1aW50MzIgcGFja2V0X3NpemVfOwotICAvLyBOdW1iZXIgb2YgYnl0ZXMgZm9yIG1ha2luZyBhIHNpbGVuY2UgYnVmZmVyLgotICBpbnQgc2lsZW5jZV9ieXRlc187Ci0gIC8vIFZvbHVtZSBsZXZlbCBmcm9tIDAgdG8gMS4KLSAgZmxvYXQgdm9sdW1lXzsKLSAgLy8gTnVtYmVyIG9mIGJ5dGVzIHlldCB0byBiZSBwbGF5ZWQgaW4gYXVkaW8gYnVmZmVyLgotICB1aW50MzIgcGVuZGluZ19ieXRlc187Ci0gIC8vIE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgc291cmNlIGF1ZGlvLgotICBpbnQgbnVtX3NvdXJjZV9jaGFubmVsc187Ci0gIC8vIFNvdXJjZSdzIGNoYW5uZWwgbGF5b3V0IGZvciBzdXJyb3VuZCBzb3VuZCBjaGFubmVscy4KLSAgQ2hhbm5lbExheW91dCBzb3VyY2VfbGF5b3V0XzsKLSAgLy8gRGV2aWNlJ3MgY2hhbm5lbCBsYXlvdXQuCi0gIGludCBjb3JlX2NoYW5uZWxfb3JkZXJpbmdzX1tDSEFOTkVMU19NQVhdOwotICAvLyBBbiBhcnJheSBmb3IgcmVtYXBwaW5nIHNvdXJjZSB0byBkZXZpY2UgY2hhbm5lbCBsYXlvdXRzIGR1cmluZyBhIHN3aXp6bGUuCi0gIGludCBjaGFubmVsX3JlbWFwX1tDSEFOTkVMU19NQVhdOwotICAvLyBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gZGV2aWNlIGxheW91dC4KLSAgaW50IG51bV9jb3JlX2NoYW5uZWxzXzsKLSAgLy8gQSBmbGFnIHRvIGRldGVybWluZSBpZiBzd2l6emxlIGlzIG5lZWRlZCBmcm9tIHNvdXJjZSB0byBkZXZpY2UgbGF5b3V0cy4KLSAgYm9vbCBzaG91bGRfc3dpenpsZV87Ci0gIC8vIEEgZmxhZyB0byBkZXRlcm1pbmUgaWYgZG93bm1peCBpcyBuZWVkZWQgZnJvbSBzb3VyY2UgdG8gZGV2aWNlIGxheW91dHMuCi0gIGJvb2wgc2hvdWxkX2Rvd25fbWl4XzsKLQotICAvLyBFdmVudCB1c2VkIGZvciBzeW5jaHJvbml6YXRpb24gd2hlbiBzdG9wcGluZyB0aGUgc3RyZWFtLgotICAvLyBDYWxsYmFjayBzZXRzIGl0IGFmdGVyIHN0cmVhbSBpcyBzdG9wcGVkLgotICBiYXNlOjpXYWl0YWJsZUV2ZW50IHN0b3BwZWRfZXZlbnRfOwotICAvLyBXaGVuIHN0b3BwaW5nIHdlIGtlZXAgdHJhY2sgb2YgbnVtYmVyIG9mIGJ1ZmZlcnMgaW4gZmxpZ2h0IGFuZAotICAvLyBzaWduYWwgInN0b3AgY29tcGxldGVkIiBmcm9tIHRoZSBsYXN0IGJ1ZmZlcidzIGNhbGxiYWNrLgotICBpbnQgbnVtX2J1ZmZlcnNfbGVmdF87Ci0KLSAgLy8gQ29udGFpbmVyIGZvciByZXRyaWV2aW5nIGRhdGEgZnJvbSBBdWRpb1NvdXJjZUNhbGxiYWNrOjpPbk1vcmVEYXRhKCkuCi0gIHNjb3BlZF9wdHI8QXVkaW9CdXM+IGF1ZGlvX2J1c187Ci0KLSAgLy8gQ2hhbm5lbCBtaXhlciBhbmQgdGVtcG9yYXJ5IGJ1cyBmb3IgdGhlIGZpbmFsIG1peGVkIGNoYW5uZWwgZGF0YS4KLSAgc2NvcGVkX3B0cjxDaGFubmVsTWl4ZXI+IGNoYW5uZWxfbWl4ZXJfOwotICBzY29wZWRfcHRyPEF1ZGlvQnVzPiBtaXhlZF9hdWRpb19idXNfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihQQ01RdWV1ZU91dEF1ZGlvT3V0cHV0U3RyZWFtKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0FVRElPX01BQ19BVURJT19PVVRQVVRfTUFDX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vbWFjL2F1ZGlvX291dHB1dF9tYWNfdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvYXVkaW8vbWFjL2F1ZGlvX291dHB1dF9tYWNfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOWMxN2QuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL21hYy9hdWRpb19vdXRwdXRfbWFjX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9faW8uaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19tYW5hZ2VyLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vc2ltcGxlX3NvdXJjZXMuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgOjp0ZXN0aW5nOjpfOwotdXNpbmcgOjp0ZXN0aW5nOjpBbnlOdW1iZXI7Ci11c2luZyA6OnRlc3Rpbmc6OkRvQWxsOwotdXNpbmcgOjp0ZXN0aW5nOjpGaWVsZDsKLXVzaW5nIDo6dGVzdGluZzo6SW5TZXF1ZW5jZTsKLXVzaW5nIDo6dGVzdGluZzo6SW52b2tlOwotdXNpbmcgOjp0ZXN0aW5nOjpOaWNlTW9jazsKLXVzaW5nIDo6dGVzdGluZzo6Tm90TnVsbDsKLXVzaW5nIDo6dGVzdGluZzo6UmV0dXJuOwotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBNb2NrQXVkaW9Tb3VyY2UgOiBwdWJsaWMgQXVkaW9PdXRwdXRTdHJlYW06OkF1ZGlvU291cmNlQ2FsbGJhY2sgewotIHB1YmxpYzoKLSAgTU9DS19NRVRIT0QyKE9uTW9yZURhdGEsIGludChBdWRpb0J1cyogYXVkaW9fYnVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyc1N0YXRlIGJ1ZmZlcnNfc3RhdGUpKTsKLSAgTU9DS19NRVRIT0QzKE9uTW9yZUlPRGF0YSwgaW50KEF1ZGlvQnVzKiBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1cyogZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyc1N0YXRlIGJ1ZmZlcnNfc3RhdGUpKTsKLSAgTU9DS19NRVRIT0QyKE9uRXJyb3IsIHZvaWQoQXVkaW9PdXRwdXRTdHJlYW0qIHN0cmVhbSwgaW50IGNvZGUpKTsKLX07Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gVmFsaWRhdGlvbiBvZiBBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIKLS8vCi0KLS8vIFRlc3QgdGhhdCBjYW4gaXQgYmUgY3JlYXRlZCBhbmQgY2xvc2VkLgotVEVTVChNYWNBdWRpb1Rlc3QsIFBDTVdhdmVTdHJlYW1HZXRBbmRDbG9zZSkgewotICBzY29wZWRfcHRyPEF1ZGlvTWFuYWdlcj4gYXVkaW9fbWFuKEF1ZGlvTWFuYWdlcjo6Q3JlYXRlKCkpOwotICBpZiAoIWF1ZGlvX21hbi0+SGFzQXVkaW9PdXRwdXREZXZpY2VzKCkpCi0gICAgcmV0dXJuOwotICBBdWRpb091dHB1dFN0cmVhbSogb2FzID0gYXVkaW9fbWFuLT5NYWtlQXVkaW9PdXRwdXRTdHJlYW0oCi0gICAgICBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSLCBDSEFOTkVMX0xBWU9VVF9TVEVSRU8sCi0gICAgICAgICAgICAgICAgICAgICAgODAwMCwgMTYsIDEwMjQpKTsKLSAgQVNTRVJUX1RSVUUoTlVMTCAhPSBvYXMpOwotICBvYXMtPkNsb3NlKCk7Ci19Ci0KLS8vIFRlc3QgdGhhdCBpdCBjYW4gYmUgb3BlbmVkIGFuZCBjbG9zZWQuCi1URVNUKE1hY0F1ZGlvVGVzdCwgUENNV2F2ZVN0cmVhbU9wZW5BbmRDbG9zZSkgewotICBzY29wZWRfcHRyPEF1ZGlvTWFuYWdlcj4gYXVkaW9fbWFuKEF1ZGlvTWFuYWdlcjo6Q3JlYXRlKCkpOwotICBpZiAoIWF1ZGlvX21hbi0+SGFzQXVkaW9PdXRwdXREZXZpY2VzKCkpCi0gICAgcmV0dXJuOwotICBBdWRpb091dHB1dFN0cmVhbSogb2FzID0gYXVkaW9fbWFuLT5NYWtlQXVkaW9PdXRwdXRTdHJlYW0oCi0gICAgICBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSLCBDSEFOTkVMX0xBWU9VVF9TVEVSRU8sCi0gICAgICAgICAgICAgICAgICAgICAgODAwMCwgMTYsIDEwMjQpKTsKLSAgQVNTRVJUX1RSVUUoTlVMTCAhPSBvYXMpOwotICBFWFBFQ1RfVFJVRShvYXMtPk9wZW4oKSk7Ci0gIG9hcy0+Q2xvc2UoKTsKLX0KLQotLy8gVGhpcyB0ZXN0IHByb2R1Y2VzIGFjdHVhbCBhdWRpbyBmb3IgMS41IHNlY29uZHMgb24gdGhlIGRlZmF1bHQgd2F2ZSBkZXZpY2UgYXQKLS8vIDQ0LjFLIHMvc2VjLiBQYXJhbWV0ZXJzIGhhdmUgYmVlbiBjaG9zZW4gY2FyZWZ1bGx5IHNvIHlvdSBzaG91bGQgbm90IGhlYXIKLS8vIHBvcHMgb3Igbm9pc2VzIHdoaWxlIHRoZSBzb3VuZCBpcyBwbGF5aW5nLiBUaGUgc291bmQgbXVzdCBhbHNvIGJlIGlkZW50aWNhbAotLy8gdG8gdGhlIHNvdW5kIG9mIFBDTVdhdmVTdHJlYW1QbGF5MjAwSHpUb25lMjJLc3NNb25vIHRlc3QuCi1URVNUKE1hY0F1ZGlvVGVzdCwgUENNV2F2ZVN0cmVhbVBsYXkyMDBIelRvbmU0NEtzc01vbm8pIHsKLSAgc2NvcGVkX3B0cjxBdWRpb01hbmFnZXI+IGF1ZGlvX21hbihBdWRpb01hbmFnZXI6OkNyZWF0ZSgpKTsKLSAgaWYgKCFhdWRpb19tYW4tPkhhc0F1ZGlvT3V0cHV0RGV2aWNlcygpKQotICAgIHJldHVybjsKLSAgdWludDMyIGZyYW1lc18xMDBfbXMgPSBBdWRpb1BhcmFtZXRlcnM6OmtBdWRpb0NEU2FtcGxlUmF0ZSAvIDEwOwotICBBdWRpb091dHB1dFN0cmVhbSogb2FzID0gYXVkaW9fbWFuLT5NYWtlQXVkaW9PdXRwdXRTdHJlYW0oCi0gICAgICBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSLCBDSEFOTkVMX0xBWU9VVF9NT05PLAotICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyczo6a0F1ZGlvQ0RTYW1wbGVSYXRlLCAxNiwgZnJhbWVzXzEwMF9tcykpOwotICBBU1NFUlRfVFJVRShOVUxMICE9IG9hcyk7Ci0gIEVYUEVDVF9UUlVFKG9hcy0+T3BlbigpKTsKLQotICBTaW5lV2F2ZUF1ZGlvU291cmNlIHNvdXJjZSgxLCAyMDAuMCwgQXVkaW9QYXJhbWV0ZXJzOjprQXVkaW9DRFNhbXBsZVJhdGUpOwotICBvYXMtPlNldFZvbHVtZSgwLjUpOwotICBvYXMtPlN0YXJ0KCZzb3VyY2UpOwotICB1c2xlZXAoNTAwMDAwKTsKLQotICAvLyBUZXN0IHRoYXQgdGhlIHZvbHVtZSBpcyB3aXRoaW4gdGhlIHNldCBsaW1pdHMuCi0gIGRvdWJsZSB2b2x1bWUgPSAwLjA7Ci0gIG9hcy0+R2V0Vm9sdW1lKCZ2b2x1bWUpOwotICBFWFBFQ1RfTFQodm9sdW1lLCAwLjUxKTsKLSAgRVhQRUNUX0dUKHZvbHVtZSwgMC40OSk7Ci0gIG9hcy0+U3RvcCgpOwotICBvYXMtPkNsb3NlKCk7Ci19Ci0KLS8vIFRoaXMgdGVzdCBwcm9kdWNlcyBhY3R1YWwgYXVkaW8gZm9yIDEuNSBzZWNvbmRzIG9uIHRoZSBkZWZhdWx0IHdhdmUgZGV2aWNlIGF0Ci0vLyAyMksgcy9zZWMuIFBhcmFtZXRlcnMgaGF2ZSBiZWVuIGNob3NlbiBjYXJlZnVsbHkgc28geW91IHNob3VsZCBub3QgaGVhciBwb3BzCi0vLyBvciBub2lzZXMgd2hpbGUgdGhlIHNvdW5kIGlzIHBsYXlpbmcuIFRoZSBzb3VuZCBtdXN0IGFsc28gYmUgaWRlbnRpY2FsIHRvIHRoZQotLy8gc291bmQgb2YgUENNV2F2ZVN0cmVhbVBsYXkyMDBIelRvbmU0NEtzc01vbm8gdGVzdC4KLVRFU1QoTWFjQXVkaW9UZXN0LCBQQ01XYXZlU3RyZWFtUGxheTIwMEh6VG9uZTIyS3NzTW9ubykgewotICBzY29wZWRfcHRyPEF1ZGlvTWFuYWdlcj4gYXVkaW9fbWFuKEF1ZGlvTWFuYWdlcjo6Q3JlYXRlKCkpOwotICBpZiAoIWF1ZGlvX21hbi0+SGFzQXVkaW9PdXRwdXREZXZpY2VzKCkpCi0gICAgcmV0dXJuOwotICB1aW50MzIgZnJhbWVzXzEwMF9tcyA9IEF1ZGlvUGFyYW1ldGVyczo6a0F1ZGlvQ0RTYW1wbGVSYXRlIC8gMTA7Ci0gIEF1ZGlvT3V0cHV0U3RyZWFtKiBvYXMgPSBhdWRpb19tYW4tPk1ha2VBdWRpb091dHB1dFN0cmVhbSgKLSAgICAgIEF1ZGlvUGFyYW1ldGVycyhBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIsIENIQU5ORUxfTEFZT1VUX01PTk8sCi0gICAgICAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXJzOjprQXVkaW9DRFNhbXBsZVJhdGUgLyAyLCAxNiwKLSAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNfMTAwX21zKSk7Ci0gIEFTU0VSVF9UUlVFKE5VTEwgIT0gb2FzKTsKLQotICBTaW5lV2F2ZUF1ZGlvU291cmNlIHNvdXJjZSgxLCAyMDAuMCwgQXVkaW9QYXJhbWV0ZXJzOjprQXVkaW9DRFNhbXBsZVJhdGUvMik7Ci0gIEVYUEVDVF9UUlVFKG9hcy0+T3BlbigpKTsKLSAgb2FzLT5TdGFydCgmc291cmNlKTsKLSAgdXNsZWVwKDE1MDAwMDApOwotICBvYXMtPlN0b3AoKTsKLSAgb2FzLT5DbG9zZSgpOwotfQotCi0vLyBDdXN0b20gYWN0aW9uIHRvIGNsZWFyIGEgbWVtb3J5IGJ1ZmZlci4KLXN0YXRpYyBpbnQgQ2xlYXJCdWZmZXIoQXVkaW9CdXMqIGF1ZGlvX2J1cywKLSAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJzU3RhdGUgYnVmZmVyc19zdGF0ZSkgewotICBhdWRpb19idXMtPlplcm8oKTsKLSAgcmV0dXJuIGF1ZGlvX2J1cy0+ZnJhbWVzKCk7Ci19Ci0KLVRFU1QoTWFjQXVkaW9UZXN0LCBQQ01XYXZlU3RyZWFtUGVuZGluZ0J5dGVzKSB7Ci0gIHNjb3BlZF9wdHI8QXVkaW9NYW5hZ2VyPiBhdWRpb19tYW4oQXVkaW9NYW5hZ2VyOjpDcmVhdGUoKSk7Ci0gIGlmICghYXVkaW9fbWFuLT5IYXNBdWRpb091dHB1dERldmljZXMoKSkKLSAgICByZXR1cm47Ci0KLSAgdWludDMyIGZyYW1lc18xMDBfbXMgPSBBdWRpb1BhcmFtZXRlcnM6OmtBdWRpb0NEU2FtcGxlUmF0ZSAvIDEwOwotICBBdWRpb091dHB1dFN0cmVhbSogb2FzID0gYXVkaW9fbWFuLT5NYWtlQXVkaW9PdXRwdXRTdHJlYW0oCi0gICAgICBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSLCBDSEFOTkVMX0xBWU9VVF9NT05PLAotICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyczo6a0F1ZGlvQ0RTYW1wbGVSYXRlLCAxNiwgZnJhbWVzXzEwMF9tcykpOwotICBBU1NFUlRfVFJVRShOVUxMICE9IG9hcyk7Ci0KLSAgTmljZU1vY2s8TW9ja0F1ZGlvU291cmNlPiBzb3VyY2U7Ci0gIEVYUEVDVF9UUlVFKG9hcy0+T3BlbigpKTsKLQotICB1aW50MzIgYnl0ZXNfMTAwX21zID0gZnJhbWVzXzEwMF9tcyAqIDI7Ci0KLSAgLy8gV2UgZXhwZWN0IHRoZSBhbW91bnQgb2YgcGVuZGluZyBieXRlcyB3aWxsIHJlYWNoaW5nIHxieXRlc18xMDBfbXN8Ci0gIC8vIGJlY2F1c2UgdGhlIGF1ZGlvIG91dHB1dCBzdHJlYW0gaGFzIGEgZG91YmxlIGJ1ZmZlciBzY2hlbWUuCi0gIC8vIEFuZCB0aGVuIHdlIHdpbGwgdHJ5IHRvIHByb3ZpZGUgemVybyBkYXRhIHNvIHRoZSBhbW91bnQgb2YgcGVuZGluZyBieXRlcwotICAvLyB3aWxsIGdvIGRvd24gYW5kIGV2ZW50dWFsbHkgcmVhZCB6ZXJvLgotICBJblNlcXVlbmNlIHM7Ci0gIEVYUEVDVF9DQUxMKHNvdXJjZSwgT25Nb3JlRGF0YShOb3ROdWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZCgmQXVkaW9CdWZmZXJzU3RhdGU6OnBlbmRpbmdfYnl0ZXMsIDApKSkKLSAgICAgIC5XaWxsT25jZShJbnZva2UoQ2xlYXJCdWZmZXIpKTsKLSAgRVhQRUNUX0NBTEwoc291cmNlLCBPbk1vcmVEYXRhKE5vdE51bGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkKCZBdWRpb0J1ZmZlcnNTdGF0ZTo6cGVuZGluZ19ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzXzEwMF9tcykpKQotICAgICAgLldpbGxPbmNlKEludm9rZShDbGVhckJ1ZmZlcikpOwotICBFWFBFQ1RfQ0FMTChzb3VyY2UsIE9uTW9yZURhdGEoTm90TnVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQoJkF1ZGlvQnVmZmVyc1N0YXRlOjpwZW5kaW5nX2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfMTAwX21zKSkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKDApKTsKLSAgRVhQRUNUX0NBTEwoc291cmNlLCBPbk1vcmVEYXRhKE5vdE51bGwoKSwgXykpCi0gICAgICAuVGltZXMoQW55TnVtYmVyKCkpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKDApKTsKLQotICBvYXMtPlN0YXJ0KCZzb3VyY2UpOwotICB1c2xlZXAoNTAwMDAwKTsKLSAgb2FzLT5TdG9wKCk7Ci0gIG9hcy0+Q2xvc2UoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vbWFjL2F1ZGlvX3N5bmNocm9uaXplZF9tYWMuY2MgYi9zcmMvbWVkaWEvYXVkaW8vbWFjL2F1ZGlvX3N5bmNocm9uaXplZF9tYWMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NjFiY2IuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL21hYy9hdWRpb19zeW5jaHJvbml6ZWRfbWFjLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTQ1ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby9tYWMvYXVkaW9fc3luY2hyb25pemVkX21hYy5oIgotCi0jaW5jbHVkZSA8Q29yZVNlcnZpY2VzL0NvcmVTZXJ2aWNlcy5oPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL21hYy9tYWNfbG9nZ2luZy5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3V0aWwuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9tYWMvYXVkaW9fbWFuYWdlcl9tYWMuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotc3RhdGljIGNvbnN0IGludCBrSGFyZHdhcmVCdWZmZXJTaXplID0gMTI4Owotc3RhdGljIGNvbnN0IGludCBrRmlmb1NpemUgPSAxNjM4NDsKLQotLy8gVE9ETyhjcm9nZXJzKTogaGFuZGxlIHRoZSBub24tc3RlcmVvIGNhc2UuCi1zdGF0aWMgY29uc3QgaW50IGtDaGFubmVscyA9IDI7Ci0KLS8vIFRoaXMgdmFsdWUgd2FzIGRldGVybWluZWQgZW1waXJpY2FsbHkgZm9yIG1pbmltdW0gbGF0ZW5jeSB3aGlsZSBzdGlsbAotLy8gZ3VhcmRpbmcgYWdhaW5zdCBGSUZPIHVuZGVyLXJ1bnMuCi1zdGF0aWMgY29uc3QgaW50IGtCYXNlVGFyZ2V0Rmlmb0ZyYW1lcyA9IDI1NiArIDY0OwotCi0vLyBJZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBzYW1wbGUtcmF0ZSBkb24ndCBtYXRjaCwgdGhlbiB3ZSBuZWVkIHRvIG1haW50YWluCi0vLyBhbiBhZGRpdGlvbmFsIHNhZmV0eSBtYXJnaW4gZHVlIHRvIHRoZSBjYWxsYmFjayB0aW1pbmcgaml0dGVyIGFuZCB0aGUKLS8vIHZhcmlzcGVlZCBidWZmZXJpbmcuICBUaGlzIHZhbHVlIHdhcyBlbXBpcmljYWxseSB0dW5lZC4KLXN0YXRpYyBjb25zdCBpbnQga0FkZGl0aW9uYWxUYXJnZXRGaWZvRnJhbWVzID0gMTI4OwotCi1zdGF0aWMgdm9pZCBaZXJvQnVmZmVyTGlzdChBdWRpb0J1ZmZlckxpc3QqIGJ1ZmZlcl9saXN0KSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnVmZmVyX2xpc3QtPm1OdW1iZXJCdWZmZXJzOyArK2kpCi0gICAgbWVtc2V0KGJ1ZmZlcl9saXN0LT5tQnVmZmVyc1tpXS5tRGF0YSwKLSAgICAgICAgICAgMCwKLSAgICAgICAgICAgYnVmZmVyX2xpc3QtPm1CdWZmZXJzW2ldLm1EYXRhQnl0ZVNpemUpOwotfQotCi1zdGF0aWMgdm9pZCBXcmFwQnVmZmVyTGlzdChBdWRpb0J1ZmZlckxpc3QqIGJ1ZmZlcl9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdXMqIGJ1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZXMpIHsKLSAgRENIRUNLKGJ1ZmZlcl9saXN0KTsKLSAgRENIRUNLKGJ1cyk7Ci0gIGludCBjaGFubmVscyA9IGJ1cy0+Y2hhbm5lbHMoKTsKLSAgaW50IGJ1ZmZlcl9saXN0X2NoYW5uZWxzID0gYnVmZmVyX2xpc3QtPm1OdW1iZXJCdWZmZXJzOwotCi0gIC8vIENvcHkgcG9pbnRlcnMgZnJvbSBBdWRpb0J1ZmZlckxpc3QuCi0gIGludCBzb3VyY2VfaWR4ID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFubmVsczsgKytpKSB7Ci0gICAgYnVzLT5TZXRDaGFubmVsRGF0YSgKLSAgICAgICAgaSwgc3RhdGljX2Nhc3Q8ZmxvYXQqPihidWZmZXJfbGlzdC0+bUJ1ZmZlcnNbc291cmNlX2lkeF0ubURhdGEpKTsKLQotICAgIC8vIEl0J3Mgb2sgdG8gcGFzcyBpbiBhIHxidWZmZXJfbGlzdHwgd2l0aCBmZXdlciBjaGFubmVscywgaW4gd2hpY2gKLSAgICAvLyBjYXNlIHdlIGp1c3QgZHVwbGljYXRlIHRoZSBsYXN0IGNoYW5uZWwuCi0gICAgaWYgKHNvdXJjZV9pZHggPCBidWZmZXJfbGlzdF9jaGFubmVscyAtIDEpCi0gICAgICArK3NvdXJjZV9pZHg7Ci0gIH0KLQotICAvLyBGaW5hbGx5IHNldCB0aGUgYWN0dWFsIGxlbmd0aC4KLSAgYnVzLT5zZXRfZnJhbWVzKGZyYW1lcyk7Ci19Ci0KLUF1ZGlvU3luY2hyb25pemVkU3RyZWFtOjpBdWRpb1N5bmNocm9uaXplZFN0cmVhbSgKLSAgICBBdWRpb01hbmFnZXJNYWMqIG1hbmFnZXIsCi0gICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsCi0gICAgQXVkaW9EZXZpY2VJRCBpbnB1dF9pZCwKLSAgICBBdWRpb0RldmljZUlEIG91dHB1dF9pZCkKLSAgICA6IG1hbmFnZXJfKG1hbmFnZXIpLAotICAgICAgcGFyYW1zXyhwYXJhbXMpLAotICAgICAgaW5wdXRfc2FtcGxlX3JhdGVfKDApLAotICAgICAgb3V0cHV0X3NhbXBsZV9yYXRlXygwKSwKLSAgICAgIGlucHV0X2lkXyhpbnB1dF9pZCksCi0gICAgICBvdXRwdXRfaWRfKG91dHB1dF9pZCksCi0gICAgICBpbnB1dF9idWZmZXJfbGlzdF8oTlVMTCksCi0gICAgICBmaWZvXyhrQ2hhbm5lbHMsIGtGaWZvU2l6ZSksCi0gICAgICB0YXJnZXRfZmlmb19mcmFtZXNfKGtCYXNlVGFyZ2V0Rmlmb0ZyYW1lcyksCi0gICAgICBhdmVyYWdlX2RlbHRhXygwLjApLAotICAgICAgZmlmb19yYXRlX2NvbXBlbnNhdGlvbl8oMS4wKSwKLSAgICAgIGlucHV0X3VuaXRfKDApLAotICAgICAgdmFyaXNwZWVkX3VuaXRfKDApLAotICAgICAgb3V0cHV0X3VuaXRfKDApLAotICAgICAgZmlyc3RfaW5wdXRfdGltZV8oLTEpLAotICAgICAgaXNfcnVubmluZ18oZmFsc2UpLAotICAgICAgaGFyZHdhcmVfYnVmZmVyX3NpemVfKGtIYXJkd2FyZUJ1ZmZlclNpemUpLAotICAgICAgY2hhbm5lbHNfKGtDaGFubmVscykgewotfQotCi1BdWRpb1N5bmNocm9uaXplZFN0cmVhbTo6fkF1ZGlvU3luY2hyb25pemVkU3RyZWFtKCkgewotICBEQ0hFQ0soIWlucHV0X3VuaXRfKTsKLSAgRENIRUNLKCFvdXRwdXRfdW5pdF8pOwotICBEQ0hFQ0soIXZhcmlzcGVlZF91bml0Xyk7Ci19Ci0KLWJvb2wgQXVkaW9TeW5jaHJvbml6ZWRTdHJlYW06Ok9wZW4oKSB7Ci0gIGlmIChwYXJhbXNfLmNoYW5uZWxzKCkgIT0ga0NoYW5uZWxzKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiT25seSBzdGVyZW8gb3V0cHV0IGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBDcmVhdGUgdGhlIGlucHV0LCBvdXRwdXQsIGFuZCB2YXJpc3BlZWQgQXVkaW9Vbml0cy4KLSAgT1NTdGF0dXMgcmVzdWx0ID0gQ3JlYXRlQXVkaW9Vbml0cygpOwotICBpZiAocmVzdWx0ICE9IG5vRXJyKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGNyZWF0ZSBBdWRpb1VuaXRzLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmVzdWx0ID0gU2V0dXBJbnB1dChpbnB1dF9pZF8pOwotICBpZiAocmVzdWx0ICE9IG5vRXJyKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRXJyb3IgY29uZmlndXJpbmcgaW5wdXQgQXVkaW9Vbml0LiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmVzdWx0ID0gU2V0dXBPdXRwdXQob3V0cHV0X2lkXyk7Ci0gIGlmIChyZXN1bHQgIT0gbm9FcnIpIHsKLSAgICBMT0coRVJST1IpIDw8ICJFcnJvciBjb25maWd1cmluZyBvdXRwdXQgQXVkaW9Vbml0LiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmVzdWx0ID0gU2V0dXBDYWxsYmFja3MoKTsKLSAgaWYgKHJlc3VsdCAhPSBub0VycikgewotICAgIExPRyhFUlJPUikgPDwgIkVycm9yIHNldHRpbmcgdXAgY2FsbGJhY2tzIG9uIEF1ZGlvVW5pdHMuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXN1bHQgPSBTZXR1cFN0cmVhbUZvcm1hdHMoKTsKLSAgaWYgKHJlc3VsdCAhPSBub0VycikgewotICAgIExPRyhFUlJPUikgPDwgIkVycm9yIGNvbmZpZ3VyaW5nIHN0cmVhbSBmb3JtYXRzIG9uIEF1ZGlvVW5pdHMuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBBbGxvY2F0ZUlucHV0RGF0YSgpOwotCi0gIC8vIEZpbmFsIGluaXRpYWxpemF0aW9uIG9mIHRoZSBBdWRpb1VuaXRzLgotICByZXN1bHQgPSBBdWRpb1VuaXRJbml0aWFsaXplKGlucHV0X3VuaXRfKTsKLSAgaWYgKHJlc3VsdCAhPSBub0VycikgewotICAgIExPRyhFUlJPUikgPDwgIkVycm9yIGluaXRpYWxpemluZyBpbnB1dCBBdWRpb1VuaXQuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXN1bHQgPSBBdWRpb1VuaXRJbml0aWFsaXplKG91dHB1dF91bml0Xyk7Ci0gIGlmIChyZXN1bHQgIT0gbm9FcnIpIHsKLSAgICBMT0coRVJST1IpIDw8ICJFcnJvciBpbml0aWFsaXppbmcgb3V0cHV0IEF1ZGlvVW5pdC4iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJlc3VsdCA9IEF1ZGlvVW5pdEluaXRpYWxpemUodmFyaXNwZWVkX3VuaXRfKTsKLSAgaWYgKHJlc3VsdCAhPSBub0VycikgewotICAgIExPRyhFUlJPUikgPDwgIkVycm9yIGluaXRpYWxpemluZyB2YXJpc3BlZWQgQXVkaW9Vbml0LiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGlucHV0X3NhbXBsZV9yYXRlXyAhPSBvdXRwdXRfc2FtcGxlX3JhdGVfKSB7Ci0gICAgLy8gQWRkIGV4dHJhIHNhZmV0eSBtYXJnaW4uCi0gICAgdGFyZ2V0X2ZpZm9fZnJhbWVzXyArPSBrQWRkaXRpb25hbFRhcmdldEZpZm9GcmFtZXM7Ci0gIH0KLQotICAvLyBCdWZmZXIgaW5pdGlhbCBzaWxlbmNlIGNvcnJlc3BvbmRpbmcgdG8gdGFyZ2V0IEkvTyBidWZmZXJpbmcuCi0gIGZpZm9fLkNsZWFyKCk7Ci0gIHNjb3BlZF9wdHI8QXVkaW9CdXM+IHNpbGVuY2UgPQotICAgICAgQXVkaW9CdXM6OkNyZWF0ZShjaGFubmVsc18sIHRhcmdldF9maWZvX2ZyYW1lc18pOwotICBzaWxlbmNlLT5aZXJvKCk7Ci0gIGZpZm9fLlB1c2goc2lsZW5jZS5nZXQoKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQXVkaW9TeW5jaHJvbml6ZWRTdHJlYW06OkNsb3NlKCkgewotICBEQ0hFQ0soIWlzX3J1bm5pbmdfKTsKLQotICBpZiAoaW5wdXRfYnVmZmVyX2xpc3RfKSB7Ci0gICAgZnJlZShpbnB1dF9idWZmZXJfbGlzdF8pOwotICAgIGlucHV0X2J1ZmZlcl9saXN0XyA9IDA7Ci0gICAgaW5wdXRfYnVzXy5yZXNldChOVUxMKTsKLSAgICB3cmFwcGVyX2J1c18ucmVzZXQoTlVMTCk7Ci0gIH0KLQotICBpZiAoaW5wdXRfdW5pdF8pIHsKLSAgICBBdWRpb1VuaXRVbmluaXRpYWxpemUoaW5wdXRfdW5pdF8pOwotICAgIENsb3NlQ29tcG9uZW50KGlucHV0X3VuaXRfKTsKLSAgfQotCi0gIGlmIChvdXRwdXRfdW5pdF8pIHsKLSAgICBBdWRpb1VuaXRVbmluaXRpYWxpemUob3V0cHV0X3VuaXRfKTsKLSAgICBDbG9zZUNvbXBvbmVudChvdXRwdXRfdW5pdF8pOwotICB9Ci0KLSAgaWYgKHZhcmlzcGVlZF91bml0XykgewotICAgIEF1ZGlvVW5pdFVuaW5pdGlhbGl6ZSh2YXJpc3BlZWRfdW5pdF8pOwotICAgIENsb3NlQ29tcG9uZW50KHZhcmlzcGVlZF91bml0Xyk7Ci0gIH0KLQotICBpbnB1dF91bml0XyA9IE5VTEw7Ci0gIG91dHB1dF91bml0XyA9IE5VTEw7Ci0gIHZhcmlzcGVlZF91bml0XyA9IE5VTEw7Ci0KLSAgLy8gSW5mb3JtIHRoZSBhdWRpbyBtYW5hZ2VyIHRoYXQgd2UgaGF2ZSBiZWVuIGNsb3NlZC4gVGhpcyBjYW4gY2F1c2Ugb3VyCi0gIC8vIGRlc3RydWN0aW9uLgotICBtYW5hZ2VyXy0+UmVsZWFzZU91dHB1dFN0cmVhbSh0aGlzKTsKLX0KLQotdm9pZCBBdWRpb1N5bmNocm9uaXplZFN0cmVhbTo6U3RhcnQoQXVkaW9Tb3VyY2VDYWxsYmFjayogY2FsbGJhY2spIHsKLSAgRENIRUNLKGNhbGxiYWNrKTsKLSAgRENIRUNLKGlucHV0X3VuaXRfKTsKLSAgRENIRUNLKG91dHB1dF91bml0Xyk7Ci0gIERDSEVDSyh2YXJpc3BlZWRfdW5pdF8pOwotCi0gIGlmIChpc19ydW5uaW5nXyB8fCAhaW5wdXRfdW5pdF8gfHwgIW91dHB1dF91bml0XyB8fCAhdmFyaXNwZWVkX3VuaXRfKQotICAgIHJldHVybjsKLQotICBzb3VyY2VfID0gY2FsbGJhY2s7Ci0KLSAgLy8gUmVzZXQgc3RhdGUgdmFyaWFibGVzIGVhY2ggdGltZSB3ZSBTdGFydCgpLgotICBmaWZvX3JhdGVfY29tcGVuc2F0aW9uXyA9IDEuMDsKLSAgYXZlcmFnZV9kZWx0YV8gPSAwLjA7Ci0KLSAgT1NTdGF0dXMgcmVzdWx0ID0gbm9FcnI7Ci0KLSAgaWYgKCFpc19ydW5uaW5nXykgewotICAgIGZpcnN0X2lucHV0X3RpbWVfID0gLTE7Ci0KLSAgICByZXN1bHQgPSBBdWRpb091dHB1dFVuaXRTdGFydChpbnB1dF91bml0Xyk7Ci0gICAgT1NTVEFUVVNfRENIRUNLKHJlc3VsdCA9PSBub0VyciwgcmVzdWx0KTsKLQotICAgIGlmIChyZXN1bHQgPT0gbm9FcnIpIHsKLSAgICAgIHJlc3VsdCA9IEF1ZGlvT3V0cHV0VW5pdFN0YXJ0KG91dHB1dF91bml0Xyk7Ci0gICAgICBPU1NUQVRVU19EQ0hFQ0socmVzdWx0ID09IG5vRXJyLCByZXN1bHQpOwotICAgIH0KLSAgfQotCi0gIGlzX3J1bm5pbmdfID0gdHJ1ZTsKLX0KLQotdm9pZCBBdWRpb1N5bmNocm9uaXplZFN0cmVhbTo6U3RvcCgpIHsKLSAgT1NTdGF0dXMgcmVzdWx0ID0gbm9FcnI7Ci0gIGlmIChpc19ydW5uaW5nXykgewotICAgIHJlc3VsdCA9IEF1ZGlvT3V0cHV0VW5pdFN0b3AoaW5wdXRfdW5pdF8pOwotICAgIE9TU1RBVFVTX0RDSEVDSyhyZXN1bHQgPT0gbm9FcnIsIHJlc3VsdCk7Ci0KLSAgICBpZiAocmVzdWx0ID09IG5vRXJyKSB7Ci0gICAgICByZXN1bHQgPSBBdWRpb091dHB1dFVuaXRTdG9wKG91dHB1dF91bml0Xyk7Ci0gICAgICBPU1NUQVRVU19EQ0hFQ0socmVzdWx0ID09IG5vRXJyLCByZXN1bHQpOwotICAgIH0KLSAgfQotCi0gIGlmIChyZXN1bHQgPT0gbm9FcnIpCi0gICAgaXNfcnVubmluZ18gPSBmYWxzZTsKLX0KLQotYm9vbCBBdWRpb1N5bmNocm9uaXplZFN0cmVhbTo6SXNSdW5uaW5nKCkgewotICByZXR1cm4gaXNfcnVubmluZ187Ci19Ci0KLS8vIFRPRE8oY3JvZ2Vycyk6IGltcGxlbWVudCAtIG9yIHJlbW92ZSBmcm9tIEF1ZGlvT3V0cHV0U3RyZWFtLgotdm9pZCBBdWRpb1N5bmNocm9uaXplZFN0cmVhbTo6U2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpIHt9Ci12b2lkIEF1ZGlvU3luY2hyb25pemVkU3RyZWFtOjpHZXRWb2x1bWUoZG91YmxlKiB2b2x1bWUpIHt9Ci0KLU9TU3RhdHVzIEF1ZGlvU3luY2hyb25pemVkU3RyZWFtOjpTZXRPdXRwdXREZXZpY2VBc0N1cnJlbnQoCi0gICAgQXVkaW9EZXZpY2VJRCBvdXRwdXRfaWQpIHsKLSAgT1NTdGF0dXMgcmVzdWx0ID0gbm9FcnI7Ci0KLSAgLy8gR2V0IHRoZSBkZWZhdWx0IG91dHB1dCBkZXZpY2UgaWYgZGV2aWNlIGlzIHVua25vd24uCi0gIGlmIChvdXRwdXRfaWQgPT0ga0F1ZGlvRGV2aWNlVW5rbm93bikgewotICAgIEF1ZGlvT2JqZWN0UHJvcGVydHlBZGRyZXNzIHBhOwotICAgIHBhLm1TZWxlY3RvciA9IGtBdWRpb0hhcmR3YXJlUHJvcGVydHlEZWZhdWx0T3V0cHV0RGV2aWNlOwotICAgIHBhLm1TY29wZSA9IGtBdWRpb09iamVjdFByb3BlcnR5U2NvcGVHbG9iYWw7Ci0gICAgcGEubUVsZW1lbnQgPSBrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXI7Ci0gICAgVUludDMyIHNpemUgPSBzaXplb2Yob3V0cHV0X2lkKTsKLQotICAgIHJlc3VsdCA9IEF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhKAotICAgICAgICBrQXVkaW9PYmplY3RTeXN0ZW1PYmplY3QsCi0gICAgICAgICZwYSwKLSAgICAgICAgMCwKLSAgICAgICAgMCwKLSAgICAgICAgJnNpemUsCi0gICAgICAgICZvdXRwdXRfaWQpOwotCi0gICAgT1NTVEFUVVNfRENIRUNLKHJlc3VsdCA9PSBub0VyciwgcmVzdWx0KTsKLSAgICBpZiAocmVzdWx0ICE9IG5vRXJyKQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8vIFNldCB0aGUgcmVuZGVyIGZyYW1lIHNpemUuCi0gIFVJbnQzMiBmcmFtZV9zaXplID0gaGFyZHdhcmVfYnVmZmVyX3NpemVfOwotICBBdWRpb09iamVjdFByb3BlcnR5QWRkcmVzcyBwYTsKLSAgcGEubVNlbGVjdG9yID0ga0F1ZGlvRGV2aWNlUHJvcGVydHlCdWZmZXJGcmFtZVNpemU7Ci0gIHBhLm1TY29wZSA9IGtBdWRpb0RldmljZVByb3BlcnR5U2NvcGVJbnB1dDsKLSAgcGEubUVsZW1lbnQgPSBrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXI7Ci0gIHJlc3VsdCA9IEF1ZGlvT2JqZWN0U2V0UHJvcGVydHlEYXRhKAotICAgICAgb3V0cHV0X2lkLAotICAgICAgJnBhLAotICAgICAgMCwKLSAgICAgIDAsCi0gICAgICBzaXplb2YoZnJhbWVfc2l6ZSksCi0gICAgICAmZnJhbWVfc2l6ZSk7Ci0KLSAgT1NTVEFUVVNfRENIRUNLKHJlc3VsdCA9PSBub0VyciwgcmVzdWx0KTsKLSAgaWYgKHJlc3VsdCAhPSBub0VycikKLSAgICByZXR1cm4gcmVzdWx0OwotCi0gIG91dHB1dF9pbmZvXy5Jbml0aWFsaXplKG91dHB1dF9pZCwgZmFsc2UpOwotCi0gIC8vIFNldCB0aGUgQ3VycmVudCBEZXZpY2UgdG8gdGhlIERlZmF1bHQgT3V0cHV0IFVuaXQuCi0gIHJlc3VsdCA9IEF1ZGlvVW5pdFNldFByb3BlcnR5KAotICAgICAgb3V0cHV0X3VuaXRfLAotICAgICAga0F1ZGlvT3V0cHV0VW5pdFByb3BlcnR5X0N1cnJlbnREZXZpY2UsCi0gICAgICBrQXVkaW9Vbml0U2NvcGVfR2xvYmFsLAotICAgICAgMCwKLSAgICAgICZvdXRwdXRfaW5mb18uaWRfLAotICAgICAgc2l6ZW9mKG91dHB1dF9pbmZvXy5pZF8pKTsKLQotICBPU1NUQVRVU19EQ0hFQ0socmVzdWx0ID09IG5vRXJyLCByZXN1bHQpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1PU1N0YXR1cyBBdWRpb1N5bmNocm9uaXplZFN0cmVhbTo6U2V0SW5wdXREZXZpY2VBc0N1cnJlbnQoCi0gICAgQXVkaW9EZXZpY2VJRCBpbnB1dF9pZCkgewotICBPU1N0YXR1cyByZXN1bHQgPSBub0VycjsKLQotICAvLyBHZXQgdGhlIGRlZmF1bHQgaW5wdXQgZGV2aWNlIGlmIGRldmljZSBpcyB1bmtub3duLgotICBpZiAoaW5wdXRfaWQgPT0ga0F1ZGlvRGV2aWNlVW5rbm93bikgewotICAgIEF1ZGlvT2JqZWN0UHJvcGVydHlBZGRyZXNzIHBhOwotICAgIHBhLm1TZWxlY3RvciA9IGtBdWRpb0hhcmR3YXJlUHJvcGVydHlEZWZhdWx0SW5wdXREZXZpY2U7Ci0gICAgcGEubVNjb3BlID0ga0F1ZGlvT2JqZWN0UHJvcGVydHlTY29wZUdsb2JhbDsKLSAgICBwYS5tRWxlbWVudCA9IGtBdWRpb09iamVjdFByb3BlcnR5RWxlbWVudE1hc3RlcjsKLSAgICBVSW50MzIgc2l6ZSA9IHNpemVvZihpbnB1dF9pZCk7Ci0KLSAgICByZXN1bHQgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YSgKLSAgICAgICAga0F1ZGlvT2JqZWN0U3lzdGVtT2JqZWN0LAotICAgICAgICAmcGEsCi0gICAgICAgIDAsCi0gICAgICAgIDAsCi0gICAgICAgICZzaXplLAotICAgICAgICAmaW5wdXRfaWQpOwotCi0gICAgT1NTVEFUVVNfRENIRUNLKHJlc3VsdCA9PSBub0VyciwgcmVzdWx0KTsKLSAgICBpZiAocmVzdWx0ICE9IG5vRXJyKQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8vIFNldCB0aGUgcmVuZGVyIGZyYW1lIHNpemUuCi0gIFVJbnQzMiBmcmFtZV9zaXplID0gaGFyZHdhcmVfYnVmZmVyX3NpemVfOwotICBBdWRpb09iamVjdFByb3BlcnR5QWRkcmVzcyBwYTsKLSAgcGEubVNlbGVjdG9yID0ga0F1ZGlvRGV2aWNlUHJvcGVydHlCdWZmZXJGcmFtZVNpemU7Ci0gIHBhLm1TY29wZSA9IGtBdWRpb0RldmljZVByb3BlcnR5U2NvcGVJbnB1dDsKLSAgcGEubUVsZW1lbnQgPSBrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXI7Ci0gIHJlc3VsdCA9IEF1ZGlvT2JqZWN0U2V0UHJvcGVydHlEYXRhKAotICAgICAgaW5wdXRfaWQsCi0gICAgICAmcGEsCi0gICAgICAwLAotICAgICAgMCwKLSAgICAgIHNpemVvZihmcmFtZV9zaXplKSwKLSAgICAgICZmcmFtZV9zaXplKTsKLQotICBPU1NUQVRVU19EQ0hFQ0socmVzdWx0ID09IG5vRXJyLCByZXN1bHQpOwotICBpZiAocmVzdWx0ICE9IG5vRXJyKQotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgaW5wdXRfaW5mb18uSW5pdGlhbGl6ZShpbnB1dF9pZCwgdHJ1ZSk7Ci0KLSAgLy8gU2V0IHRoZSBDdXJyZW50IERldmljZSB0byB0aGUgQVVIQUwuCi0gIC8vIFRoaXMgc2hvdWxkIGJlIGRvbmUgb25seSBhZnRlciBJL08gaGFzIGJlZW4gZW5hYmxlZCBvbiB0aGUgQVVIQUwuCi0gIHJlc3VsdCA9IEF1ZGlvVW5pdFNldFByb3BlcnR5KAotICAgICAgaW5wdXRfdW5pdF8sCi0gICAgICBrQXVkaW9PdXRwdXRVbml0UHJvcGVydHlfQ3VycmVudERldmljZSwKLSAgICAgIGtBdWRpb1VuaXRTY29wZV9HbG9iYWwsCi0gICAgICAwLAotICAgICAgJmlucHV0X2luZm9fLmlkXywKLSAgICAgIHNpemVvZihpbnB1dF9pbmZvXy5pZF8pKTsKLQotICBPU1NUQVRVU19EQ0hFQ0socmVzdWx0ID09IG5vRXJyLCByZXN1bHQpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1PU1N0YXR1cyBBdWRpb1N5bmNocm9uaXplZFN0cmVhbTo6Q3JlYXRlQXVkaW9Vbml0cygpIHsKLSAgLy8gUTogV2h5IGRvIHdlIG5lZWQgYSB2YXJpc3BlZWQgdW5pdD8KLSAgLy8gQTogSWYgdGhlIGlucHV0IGRldmljZSBhbmQgdGhlIG91dHB1dCBkZXZpY2UgYXJlIHJ1bm5pbmcgYXQKLSAgLy8gZGlmZmVyZW50IHNhbXBsZSByYXRlcyBhbmQvb3Igb24gZGlmZmVyZW50IGNsb2Nrcywgd2Ugd2lsbCBuZWVkCi0gIC8vIHRvIGNvbXBlbnNhdGUgdG8gYXZvaWQgYSBwaXRjaCBjaGFuZ2UgYW5kCi0gIC8vIHRvIGF2b2lkIGJ1ZmZlciB1bmRlciBhbmQgb3ZlciBydW5zLgotICBDb21wb25lbnREZXNjcmlwdGlvbiB2YXJpc3BlZWRfZGVzYzsKLSAgdmFyaXNwZWVkX2Rlc2MuY29tcG9uZW50VHlwZSA9IGtBdWRpb1VuaXRUeXBlX0Zvcm1hdENvbnZlcnRlcjsKLSAgdmFyaXNwZWVkX2Rlc2MuY29tcG9uZW50U3ViVHlwZSA9IGtBdWRpb1VuaXRTdWJUeXBlX1ZhcmlzcGVlZDsKLSAgdmFyaXNwZWVkX2Rlc2MuY29tcG9uZW50TWFudWZhY3R1cmVyID0ga0F1ZGlvVW5pdE1hbnVmYWN0dXJlcl9BcHBsZTsKLSAgdmFyaXNwZWVkX2Rlc2MuY29tcG9uZW50RmxhZ3MgPSAwOwotICB2YXJpc3BlZWRfZGVzYy5jb21wb25lbnRGbGFnc01hc2sgPSAwOwotCi0gIENvbXBvbmVudCB2YXJpc3BlZWRfY29tcCA9IEZpbmROZXh0Q29tcG9uZW50KE5VTEwsICZ2YXJpc3BlZWRfZGVzYyk7Ci0gIGlmICh2YXJpc3BlZWRfY29tcCA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBPU1N0YXR1cyByZXN1bHQgPSBPcGVuQUNvbXBvbmVudCh2YXJpc3BlZWRfY29tcCwgJnZhcmlzcGVlZF91bml0Xyk7Ci0gIE9TU1RBVFVTX0RDSEVDSyhyZXN1bHQgPT0gbm9FcnIsIHJlc3VsdCk7Ci0gIGlmIChyZXN1bHQgIT0gbm9FcnIpCi0gICAgcmV0dXJuIHJlc3VsdDsKLQotICAvLyBPcGVuIGlucHV0IEF1ZGlvVW5pdC4KLSAgQ29tcG9uZW50RGVzY3JpcHRpb24gaW5wdXRfZGVzYzsKLSAgaW5wdXRfZGVzYy5jb21wb25lbnRUeXBlID0ga0F1ZGlvVW5pdFR5cGVfT3V0cHV0OwotICBpbnB1dF9kZXNjLmNvbXBvbmVudFN1YlR5cGUgPSBrQXVkaW9Vbml0U3ViVHlwZV9IQUxPdXRwdXQ7Ci0gIGlucHV0X2Rlc2MuY29tcG9uZW50TWFudWZhY3R1cmVyID0ga0F1ZGlvVW5pdE1hbnVmYWN0dXJlcl9BcHBsZTsKLSAgaW5wdXRfZGVzYy5jb21wb25lbnRGbGFncyA9IDA7Ci0gIGlucHV0X2Rlc2MuY29tcG9uZW50RmxhZ3NNYXNrID0gMDsKLQotICBDb21wb25lbnQgaW5wdXRfY29tcCA9IEZpbmROZXh0Q29tcG9uZW50KE5VTEwsICZpbnB1dF9kZXNjKTsKLSAgaWYgKGlucHV0X2NvbXAgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgcmVzdWx0ID0gT3BlbkFDb21wb25lbnQoaW5wdXRfY29tcCwgJmlucHV0X3VuaXRfKTsKLSAgT1NTVEFUVVNfRENIRUNLKHJlc3VsdCA9PSBub0VyciwgcmVzdWx0KTsKLSAgaWYgKHJlc3VsdCAhPSBub0VycikKLSAgICByZXR1cm4gcmVzdWx0OwotCi0gIC8vIE9wZW4gb3V0cHV0IEF1ZGlvVW5pdC4KLSAgQ29tcG9uZW50RGVzY3JpcHRpb24gb3V0cHV0X2Rlc2M7Ci0gIG91dHB1dF9kZXNjLmNvbXBvbmVudFR5cGUgPSBrQXVkaW9Vbml0VHlwZV9PdXRwdXQ7Ci0gIG91dHB1dF9kZXNjLmNvbXBvbmVudFN1YlR5cGUgPSBrQXVkaW9Vbml0U3ViVHlwZV9EZWZhdWx0T3V0cHV0OwotICBvdXRwdXRfZGVzYy5jb21wb25lbnRNYW51ZmFjdHVyZXIgPSBrQXVkaW9Vbml0TWFudWZhY3R1cmVyX0FwcGxlOwotICBvdXRwdXRfZGVzYy5jb21wb25lbnRGbGFncyA9IDA7Ci0gIG91dHB1dF9kZXNjLmNvbXBvbmVudEZsYWdzTWFzayA9IDA7Ci0KLSAgQ29tcG9uZW50IG91dHB1dF9jb21wID0gRmluZE5leHRDb21wb25lbnQoTlVMTCwgJm91dHB1dF9kZXNjKTsKLSAgaWYgKG91dHB1dF9jb21wID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJlc3VsdCA9IE9wZW5BQ29tcG9uZW50KG91dHB1dF9jb21wLCAmb3V0cHV0X3VuaXRfKTsKLSAgT1NTVEFUVVNfRENIRUNLKHJlc3VsdCA9PSBub0VyciwgcmVzdWx0KTsKLSAgaWYgKHJlc3VsdCAhPSBub0VycikKLSAgICByZXR1cm4gcmVzdWx0OwotCi0gIHJldHVybiBub0VycjsKLX0KLQotT1NTdGF0dXMgQXVkaW9TeW5jaHJvbml6ZWRTdHJlYW06OlNldHVwSW5wdXQoQXVkaW9EZXZpY2VJRCBpbnB1dF9pZCkgewotICAvLyBUaGUgQVVIQUwgdXNlZCBmb3IgaW5wdXQgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQKLSAgLy8gYmVmb3JlIGFueXRoaW5nIGlzIGRvbmUgdG8gaXQuCi0gIE9TU3RhdHVzIHJlc3VsdCA9IEF1ZGlvVW5pdEluaXRpYWxpemUoaW5wdXRfdW5pdF8pOwotICBPU1NUQVRVU19EQ0hFQ0socmVzdWx0ID09IG5vRXJyLCByZXN1bHQpOwotICBpZiAocmVzdWx0ICE9IG5vRXJyKQotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgLy8gV2UgbXVzdCBlbmFibGUgdGhlIEF1ZGlvIFVuaXQgKEFVSEFMKSBmb3IgaW5wdXQgYW5kIGRpc2FibGUgb3V0cHV0Ci0gIC8vIEJFRk9SRSBzZXR0aW5nIHRoZSBBVUhBTCdzIGN1cnJlbnQgZGV2aWNlLgotICByZXN1bHQgPSBFbmFibGVJTygpOwotICBPU1NUQVRVU19EQ0hFQ0socmVzdWx0ID09IG5vRXJyLCByZXN1bHQpOwotICBpZiAocmVzdWx0ICE9IG5vRXJyKQotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgcmVzdWx0ID0gU2V0SW5wdXREZXZpY2VBc0N1cnJlbnQoaW5wdXRfaWQpOwotICBPU1NUQVRVU19EQ0hFQ0socmVzdWx0ID09IG5vRXJyLCByZXN1bHQpOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLU9TU3RhdHVzIEF1ZGlvU3luY2hyb25pemVkU3RyZWFtOjpFbmFibGVJTygpIHsKLSAgLy8gRW5hYmxlIGlucHV0IG9uIHRoZSBBVUhBTC4KLSAgVUludDMyIGVuYWJsZV9pbyA9IDE7Ci0gIE9TU3RhdHVzIHJlc3VsdCA9IEF1ZGlvVW5pdFNldFByb3BlcnR5KAotICAgICAgaW5wdXRfdW5pdF8sCi0gICAgICBrQXVkaW9PdXRwdXRVbml0UHJvcGVydHlfRW5hYmxlSU8sCi0gICAgICBrQXVkaW9Vbml0U2NvcGVfSW5wdXQsCi0gICAgICAxLCAgLy8gaW5wdXQgZWxlbWVudAotICAgICAgJmVuYWJsZV9pbywKLSAgICAgIHNpemVvZihlbmFibGVfaW8pKTsKLQotICBPU1NUQVRVU19EQ0hFQ0socmVzdWx0ID09IG5vRXJyLCByZXN1bHQpOwotICBpZiAocmVzdWx0ICE9IG5vRXJyKQotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgLy8gRGlzYWJsZSBPdXRwdXQgb24gdGhlIEFVSEFMLgotICBlbmFibGVfaW8gPSAwOwotICByZXN1bHQgPSBBdWRpb1VuaXRTZXRQcm9wZXJ0eSgKLSAgICAgIGlucHV0X3VuaXRfLAotICAgICAga0F1ZGlvT3V0cHV0VW5pdFByb3BlcnR5X0VuYWJsZUlPLAotICAgICAga0F1ZGlvVW5pdFNjb3BlX091dHB1dCwKLSAgICAgIDAsICAvLyBvdXRwdXQgZWxlbWVudAotICAgICAgJmVuYWJsZV9pbywKLSAgICAgIHNpemVvZihlbmFibGVfaW8pKTsKLQotICBPU1NUQVRVU19EQ0hFQ0socmVzdWx0ID09IG5vRXJyLCByZXN1bHQpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1PU1N0YXR1cyBBdWRpb1N5bmNocm9uaXplZFN0cmVhbTo6U2V0dXBPdXRwdXQoQXVkaW9EZXZpY2VJRCBvdXRwdXRfaWQpIHsKLSAgT1NTdGF0dXMgcmVzdWx0ID0gbm9FcnI7Ci0KLSAgcmVzdWx0ID0gU2V0T3V0cHV0RGV2aWNlQXNDdXJyZW50KG91dHB1dF9pZCk7Ci0gIE9TU1RBVFVTX0RDSEVDSyhyZXN1bHQgPT0gbm9FcnIsIHJlc3VsdCk7Ci0gIGlmIChyZXN1bHQgIT0gbm9FcnIpCi0gICAgcmV0dXJuIHJlc3VsdDsKLQotICAvLyBUZWxsIHRoZSBvdXRwdXQgdW5pdCBub3QgdG8gcmVzZXQgdGltZXN0YW1wcy4KLSAgLy8gT3RoZXJ3aXNlIHNhbXBsZSByYXRlIGNoYW5nZXMgd2lsbCBjYXVzZSBzeW5jIGxvc3MuCi0gIFVJbnQzMiBzdGFydF9hdF96ZXJvID0gMDsKLSAgcmVzdWx0ID0gQXVkaW9Vbml0U2V0UHJvcGVydHkoCi0gICAgICBvdXRwdXRfdW5pdF8sCi0gICAgICBrQXVkaW9PdXRwdXRVbml0UHJvcGVydHlfU3RhcnRUaW1lc3RhbXBzQXRaZXJvLAotICAgICAga0F1ZGlvVW5pdFNjb3BlX0dsb2JhbCwKLSAgICAgIDAsCi0gICAgICAmc3RhcnRfYXRfemVybywKLSAgICAgIHNpemVvZihzdGFydF9hdF96ZXJvKSk7Ci0KLSAgT1NTVEFUVVNfRENIRUNLKHJlc3VsdCA9PSBub0VyciwgcmVzdWx0KTsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1PU1N0YXR1cyBBdWRpb1N5bmNocm9uaXplZFN0cmVhbTo6U2V0dXBDYWxsYmFja3MoKSB7Ci0gIC8vIFNldCB0aGUgaW5wdXQgY2FsbGJhY2suCi0gIEFVUmVuZGVyQ2FsbGJhY2tTdHJ1Y3QgY2FsbGJhY2s7Ci0gIGNhbGxiYWNrLmlucHV0UHJvYyA9IElucHV0UHJvYzsKLSAgY2FsbGJhY2suaW5wdXRQcm9jUmVmQ29uID0gdGhpczsKLSAgT1NTdGF0dXMgcmVzdWx0ID0gQXVkaW9Vbml0U2V0UHJvcGVydHkoCi0gICAgICBpbnB1dF91bml0XywKLSAgICAgIGtBdWRpb091dHB1dFVuaXRQcm9wZXJ0eV9TZXRJbnB1dENhbGxiYWNrLAotICAgICAga0F1ZGlvVW5pdFNjb3BlX0dsb2JhbCwKLSAgICAgIDAsCi0gICAgICAmY2FsbGJhY2ssCi0gICAgICBzaXplb2YoY2FsbGJhY2spKTsKLQotICBPU1NUQVRVU19EQ0hFQ0socmVzdWx0ID09IG5vRXJyLCByZXN1bHQpOwotICBpZiAocmVzdWx0ICE9IG5vRXJyKQotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgLy8gU2V0IHRoZSBvdXRwdXQgY2FsbGJhY2suCi0gIGNhbGxiYWNrLmlucHV0UHJvYyA9IE91dHB1dFByb2M7Ci0gIGNhbGxiYWNrLmlucHV0UHJvY1JlZkNvbiA9IHRoaXM7Ci0gIHJlc3VsdCA9IEF1ZGlvVW5pdFNldFByb3BlcnR5KAotICAgICAgb3V0cHV0X3VuaXRfLAotICAgICAga0F1ZGlvVW5pdFByb3BlcnR5X1NldFJlbmRlckNhbGxiYWNrLAotICAgICAga0F1ZGlvVW5pdFNjb3BlX0lucHV0LAotICAgICAgMCwKLSAgICAgICZjYWxsYmFjaywKLSAgICAgIHNpemVvZihjYWxsYmFjaykpOwotCi0gIE9TU1RBVFVTX0RDSEVDSyhyZXN1bHQgPT0gbm9FcnIsIHJlc3VsdCk7Ci0gIGlmIChyZXN1bHQgIT0gbm9FcnIpCi0gICAgcmV0dXJuIHJlc3VsdDsKLQotICAvLyBTZXQgdGhlIHZhcmlzcGVlZCBjYWxsYmFjay4KLSAgY2FsbGJhY2suaW5wdXRQcm9jID0gVmFyaXNwZWVkUHJvYzsKLSAgY2FsbGJhY2suaW5wdXRQcm9jUmVmQ29uID0gdGhpczsKLSAgcmVzdWx0ID0gQXVkaW9Vbml0U2V0UHJvcGVydHkoCi0gICAgICB2YXJpc3BlZWRfdW5pdF8sCi0gICAgICBrQXVkaW9Vbml0UHJvcGVydHlfU2V0UmVuZGVyQ2FsbGJhY2ssCi0gICAgICBrQXVkaW9Vbml0U2NvcGVfSW5wdXQsCi0gICAgICAwLAotICAgICAgJmNhbGxiYWNrLAotICAgICAgc2l6ZW9mKGNhbGxiYWNrKSk7Ci0KLSAgT1NTVEFUVVNfRENIRUNLKHJlc3VsdCA9PSBub0VyciwgcmVzdWx0KTsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1PU1N0YXR1cyBBdWRpb1N5bmNocm9uaXplZFN0cmVhbTo6U2V0dXBTdHJlYW1Gb3JtYXRzKCkgewotICBBdWRpb1N0cmVhbUJhc2ljRGVzY3JpcHRpb24gYXNiZCwgYXNiZF9kZXYxX2luLCBhc2JkX2RldjJfb3V0OwotCi0gIC8vIEdldCB0aGUgU3RyZWFtIEZvcm1hdCAoT3V0cHV0IGNsaWVudCBzaWRlKS4KLSAgVUludDMyIHByb3BlcnR5X3NpemUgPSBzaXplb2YoYXNiZF9kZXYxX2luKTsKLSAgT1NTdGF0dXMgcmVzdWx0ID0gQXVkaW9Vbml0R2V0UHJvcGVydHkoCi0gICAgICBpbnB1dF91bml0XywKLSAgICAgIGtBdWRpb1VuaXRQcm9wZXJ0eV9TdHJlYW1Gb3JtYXQsCi0gICAgICBrQXVkaW9Vbml0U2NvcGVfSW5wdXQsCi0gICAgICAxLAotICAgICAgJmFzYmRfZGV2MV9pbiwKLSAgICAgICZwcm9wZXJ0eV9zaXplKTsKLQotICBPU1NUQVRVU19EQ0hFQ0socmVzdWx0ID09IG5vRXJyLCByZXN1bHQpOwotICBpZiAocmVzdWx0ICE9IG5vRXJyKQotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgLy8gR2V0IHRoZSBTdHJlYW0gRm9ybWF0IChjbGllbnQgc2lkZSkuCi0gIHByb3BlcnR5X3NpemUgPSBzaXplb2YoYXNiZCk7Ci0gIHJlc3VsdCA9IEF1ZGlvVW5pdEdldFByb3BlcnR5KAotICAgICAgaW5wdXRfdW5pdF8sCi0gICAgICBrQXVkaW9Vbml0UHJvcGVydHlfU3RyZWFtRm9ybWF0LAotICAgICAga0F1ZGlvVW5pdFNjb3BlX091dHB1dCwKLSAgICAgIDEsCi0gICAgICAmYXNiZCwKLSAgICAgICZwcm9wZXJ0eV9zaXplKTsKLQotICBPU1NUQVRVU19EQ0hFQ0socmVzdWx0ID09IG5vRXJyLCByZXN1bHQpOwotICBpZiAocmVzdWx0ICE9IG5vRXJyKQotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgLy8gR2V0IHRoZSBTdHJlYW0gRm9ybWF0IChPdXRwdXQgY2xpZW50IHNpZGUpLgotICBwcm9wZXJ0eV9zaXplID0gc2l6ZW9mKGFzYmRfZGV2Ml9vdXQpOwotICByZXN1bHQgPSBBdWRpb1VuaXRHZXRQcm9wZXJ0eSgKLSAgICAgIG91dHB1dF91bml0XywKLSAgICAgIGtBdWRpb1VuaXRQcm9wZXJ0eV9TdHJlYW1Gb3JtYXQsCi0gICAgICBrQXVkaW9Vbml0U2NvcGVfT3V0cHV0LAotICAgICAgMCwKLSAgICAgICZhc2JkX2RldjJfb3V0LAotICAgICAgJnByb3BlcnR5X3NpemUpOwotCi0gIE9TU1RBVFVTX0RDSEVDSyhyZXN1bHQgPT0gbm9FcnIsIHJlc3VsdCk7Ci0gIGlmIChyZXN1bHQgIT0gbm9FcnIpCi0gICAgcmV0dXJuIHJlc3VsdDsKLQotICAvLyBTZXQgdGhlIGZvcm1hdCBvZiBhbGwgdGhlIEFVcyB0byB0aGUgaW5wdXQvb3V0cHV0IGRldmljZXMgY2hhbm5lbCBjb3VudC4KLSAgLy8gRm9yIGEgc2ltcGxlIGNhc2UsIHlvdSB3YW50IHRvIHNldCB0aGlzIHRvCi0gIC8vIHRoZSBsb3dlciBvZiBjb3VudCBvZiB0aGUgY2hhbm5lbHMgaW4gdGhlIGlucHV0IGRldmljZSB2cyBvdXRwdXQgZGV2aWNlLgotICBhc2JkLm1DaGFubmVsc1BlckZyYW1lID0gc3RkOjptaW4oYXNiZF9kZXYxX2luLm1DaGFubmVsc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNiZF9kZXYyX291dC5tQ2hhbm5lbHNQZXJGcmFtZSk7Ci0KLSAgLy8gV2UgbXVzdCBnZXQgdGhlIHNhbXBsZSByYXRlIG9mIHRoZSBpbnB1dCBkZXZpY2UgYW5kIHNldCBpdCB0byB0aGUKLSAgLy8gc3RyZWFtIGZvcm1hdCBvZiBBVUhBTC4KLSAgRmxvYXQ2NCByYXRlID0gMDsKLSAgcHJvcGVydHlfc2l6ZSA9IHNpemVvZihyYXRlKTsKLQotICBBdWRpb09iamVjdFByb3BlcnR5QWRkcmVzcyBwYTsKLSAgcGEubVNlbGVjdG9yID0ga0F1ZGlvRGV2aWNlUHJvcGVydHlOb21pbmFsU2FtcGxlUmF0ZTsKLSAgcGEubVNjb3BlID0ga0F1ZGlvT2JqZWN0UHJvcGVydHlTY29wZVdpbGRjYXJkOwotICBwYS5tRWxlbWVudCA9IGtBdWRpb09iamVjdFByb3BlcnR5RWxlbWVudE1hc3RlcjsKLSAgcmVzdWx0ID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGEoCi0gICAgICBpbnB1dF9pbmZvXy5pZF8sCi0gICAgICAmcGEsCi0gICAgICAwLAotICAgICAgMCwKLSAgICAgICZwcm9wZXJ0eV9zaXplLAotICAgICAgJnJhdGUpOwotCi0gIE9TU1RBVFVTX0RDSEVDSyhyZXN1bHQgPT0gbm9FcnIsIHJlc3VsdCk7Ci0gIGlmIChyZXN1bHQgIT0gbm9FcnIpCi0gICAgcmV0dXJuIHJlc3VsdDsKLQotICBpbnB1dF9zYW1wbGVfcmF0ZV8gPSByYXRlOwotCi0gIGFzYmQubVNhbXBsZVJhdGUgPSByYXRlOwotICBwcm9wZXJ0eV9zaXplID0gc2l6ZW9mKGFzYmQpOwotCi0gIC8vIFNldCB0aGUgbmV3IGZvcm1hdHMgdG8gdGhlIEFVcy4uLgotICByZXN1bHQgPSBBdWRpb1VuaXRTZXRQcm9wZXJ0eSgKLSAgICAgIGlucHV0X3VuaXRfLAotICAgICAga0F1ZGlvVW5pdFByb3BlcnR5X1N0cmVhbUZvcm1hdCwKLSAgICAgIGtBdWRpb1VuaXRTY29wZV9PdXRwdXQsCi0gICAgICAxLAotICAgICAgJmFzYmQsCi0gICAgICBwcm9wZXJ0eV9zaXplKTsKLQotICBPU1NUQVRVU19EQ0hFQ0socmVzdWx0ID09IG5vRXJyLCByZXN1bHQpOwotICBpZiAocmVzdWx0ICE9IG5vRXJyKQotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgcmVzdWx0ID0gQXVkaW9Vbml0U2V0UHJvcGVydHkoCi0gICAgICB2YXJpc3BlZWRfdW5pdF8sCi0gICAgICBrQXVkaW9Vbml0UHJvcGVydHlfU3RyZWFtRm9ybWF0LAotICAgICAga0F1ZGlvVW5pdFNjb3BlX0lucHV0LAotICAgICAgMCwKLSAgICAgICZhc2JkLAotICAgICAgcHJvcGVydHlfc2l6ZSk7Ci0KLSAgT1NTVEFUVVNfRENIRUNLKHJlc3VsdCA9PSBub0VyciwgcmVzdWx0KTsKLSAgaWYgKHJlc3VsdCAhPSBub0VycikKLSAgICByZXR1cm4gcmVzdWx0OwotCi0gIC8vIFNldCB0aGUgY29ycmVjdCBzYW1wbGUgcmF0ZSBmb3IgdGhlIG91dHB1dCBkZXZpY2UsCi0gIC8vIGJ1dCBrZWVwIHRoZSBjaGFubmVsIGNvdW50IHRoZSBzYW1lLgotICBwcm9wZXJ0eV9zaXplID0gc2l6ZW9mKHJhdGUpOwotCi0gIHBhLm1TZWxlY3RvciA9IGtBdWRpb0RldmljZVByb3BlcnR5Tm9taW5hbFNhbXBsZVJhdGU7Ci0gIHBhLm1TY29wZSA9IGtBdWRpb09iamVjdFByb3BlcnR5U2NvcGVXaWxkY2FyZDsKLSAgcGEubUVsZW1lbnQgPSBrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXI7Ci0gIHJlc3VsdCA9IEF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhKAotICAgICAgb3V0cHV0X2luZm9fLmlkXywKLSAgICAgICZwYSwKLSAgICAgIDAsCi0gICAgICAwLAotICAgICAgJnByb3BlcnR5X3NpemUsCi0gICAgICAmcmF0ZSk7Ci0KLSAgT1NTVEFUVVNfRENIRUNLKHJlc3VsdCA9PSBub0VyciwgcmVzdWx0KTsKLSAgaWYgKHJlc3VsdCAhPSBub0VycikKLSAgICByZXR1cm4gcmVzdWx0OwotCi0gIG91dHB1dF9zYW1wbGVfcmF0ZV8gPSByYXRlOwotCi0gIC8vIFRoZSByZXF1ZXN0ZWQgc2FtcGxlLXJhdGUgbXVzdCBtYXRjaCB0aGUgaGFyZHdhcmUgc2FtcGxlLXJhdGUuCi0gIGlmIChvdXRwdXRfc2FtcGxlX3JhdGVfICE9IHBhcmFtc18uc2FtcGxlX3JhdGUoKSkgewotICAgIExPRyhFUlJPUikgPDwgIlJlcXVlc3RlZCBzYW1wbGUtcmF0ZTogIiA8PCBwYXJhbXNfLnNhbXBsZV9yYXRlKCkKLSAgICAgICAgPDwgICIgbXVzdCBtYXRjaCB0aGUgaGFyZHdhcmUgc2FtcGxlLXJhdGU6ICIgPDwgb3V0cHV0X3NhbXBsZV9yYXRlXzsKLSAgICByZXR1cm4ga0F1ZGlvRGV2aWNlVW5zdXBwb3J0ZWRGb3JtYXRFcnJvcjsKLSAgfQotCi0gIGFzYmQubVNhbXBsZVJhdGUgPSByYXRlOwotICBwcm9wZXJ0eV9zaXplID0gc2l6ZW9mKGFzYmQpOwotCi0gIC8vIFNldCB0aGUgbmV3IGF1ZGlvIHN0cmVhbSBmb3JtYXRzIGZvciB0aGUgcmVzdCBvZiB0aGUgQVVzLi4uCi0gIHJlc3VsdCA9IEF1ZGlvVW5pdFNldFByb3BlcnR5KAotICAgICAgdmFyaXNwZWVkX3VuaXRfLAotICAgICAga0F1ZGlvVW5pdFByb3BlcnR5X1N0cmVhbUZvcm1hdCwKLSAgICAgIGtBdWRpb1VuaXRTY29wZV9PdXRwdXQsCi0gICAgICAwLAotICAgICAgJmFzYmQsCi0gICAgICBwcm9wZXJ0eV9zaXplKTsKLQotICBPU1NUQVRVU19EQ0hFQ0socmVzdWx0ID09IG5vRXJyLCByZXN1bHQpOwotICBpZiAocmVzdWx0ICE9IG5vRXJyKQotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgcmVzdWx0ID0gQXVkaW9Vbml0U2V0UHJvcGVydHkoCi0gICAgICBvdXRwdXRfdW5pdF8sCi0gICAgICBrQXVkaW9Vbml0UHJvcGVydHlfU3RyZWFtRm9ybWF0LAotICAgICAga0F1ZGlvVW5pdFNjb3BlX0lucHV0LAotICAgICAgMCwKLSAgICAgICZhc2JkLAotICAgICAgcHJvcGVydHlfc2l6ZSk7Ci0KLSAgT1NTVEFUVVNfRENIRUNLKHJlc3VsdCA9PSBub0VyciwgcmVzdWx0KTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBBdWRpb1N5bmNocm9uaXplZFN0cmVhbTo6QWxsb2NhdGVJbnB1dERhdGEoKSB7Ci0gIC8vIEFsbG9jYXRlIHN0b3JhZ2UgZm9yIHRoZSBBdWRpb0J1ZmZlckxpc3QgdXNlZCBmb3IgdGhlCi0gIC8vIGlucHV0IGRhdGEgZnJvbSB0aGUgaW5wdXQgQXVkaW9Vbml0LgotICAvLyBXZSBhbGxvY2F0ZSBlbm91Z2ggc3BhY2UgZm9yIHdpdGggb25lIEF1ZGlvQnVmZmVyIHBlciBjaGFubmVsLgotICBzaXplX3QgbWFsbG9jX3NpemUgPSBvZmZzZXRvZihBdWRpb0J1ZmZlckxpc3QsIG1CdWZmZXJzWzBdKSArCi0gICAgICAoc2l6ZW9mKEF1ZGlvQnVmZmVyKSAqIGNoYW5uZWxzXyk7Ci0KLSAgaW5wdXRfYnVmZmVyX2xpc3RfID0gc3RhdGljX2Nhc3Q8QXVkaW9CdWZmZXJMaXN0Kj4obWFsbG9jKG1hbGxvY19zaXplKSk7Ci0gIGlucHV0X2J1ZmZlcl9saXN0Xy0+bU51bWJlckJ1ZmZlcnMgPSBjaGFubmVsc187Ci0KLSAgaW5wdXRfYnVzXyA9IEF1ZGlvQnVzOjpDcmVhdGUoY2hhbm5lbHNfLCBoYXJkd2FyZV9idWZmZXJfc2l6ZV8pOwotICB3cmFwcGVyX2J1c18gPSBBdWRpb0J1czo6Q3JlYXRlV3JhcHBlcihjaGFubmVsc18pOwotCi0gIC8vIEFsbG9jYXRlIGJ1ZmZlcnMgZm9yIEF1ZGlvQnVmZmVyTGlzdC4KLSAgVUludDMyIGJ1ZmZlcl9zaXplX2J5dGVzID0gaW5wdXRfYnVzXy0+ZnJhbWVzKCkgKiBzaXplb2YoRmxvYXQzMik7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5wdXRfYnVmZmVyX2xpc3RfLT5tTnVtYmVyQnVmZmVyczsgKytpKSB7Ci0gICAgaW5wdXRfYnVmZmVyX2xpc3RfLT5tQnVmZmVyc1tpXS5tTnVtYmVyQ2hhbm5lbHMgPSAxOwotICAgIGlucHV0X2J1ZmZlcl9saXN0Xy0+bUJ1ZmZlcnNbaV0ubURhdGFCeXRlU2l6ZSA9IGJ1ZmZlcl9zaXplX2J5dGVzOwotICAgIGlucHV0X2J1ZmZlcl9saXN0Xy0+bUJ1ZmZlcnNbaV0ubURhdGEgPSBpbnB1dF9idXNfLT5jaGFubmVsKGkpOwotICB9Ci19Ci0KLU9TU3RhdHVzIEF1ZGlvU3luY2hyb25pemVkU3RyZWFtOjpIYW5kbGVJbnB1dENhbGxiYWNrKAotICAgIEF1ZGlvVW5pdFJlbmRlckFjdGlvbkZsYWdzKiBpb19hY3Rpb25fZmxhZ3MsCi0gICAgY29uc3QgQXVkaW9UaW1lU3RhbXAqIHRpbWVfc3RhbXAsCi0gICAgVUludDMyIGJ1c19udW1iZXIsCi0gICAgVUludDMyIG51bWJlcl9vZl9mcmFtZXMsCi0gICAgQXVkaW9CdWZmZXJMaXN0KiBpb19kYXRhKSB7Ci0gIFRSQUNFX0VWRU5UMCgiYXVkaW8iLCAiQXVkaW9TeW5jaHJvbml6ZWRTdHJlYW06OkhhbmRsZUlucHV0Q2FsbGJhY2siKTsKLQotICBpZiAoZmlyc3RfaW5wdXRfdGltZV8gPCAwLjApCi0gICAgZmlyc3RfaW5wdXRfdGltZV8gPSB0aW1lX3N0YW1wLT5tU2FtcGxlVGltZTsKLQotICAvLyBHZXQgdGhlIG5ldyBhdWRpbyBpbnB1dCBkYXRhLgotICBPU1N0YXR1cyByZXN1bHQgPSBBdWRpb1VuaXRSZW5kZXIoCi0gICAgICBpbnB1dF91bml0XywKLSAgICAgIGlvX2FjdGlvbl9mbGFncywKLSAgICAgIHRpbWVfc3RhbXAsCi0gICAgICBidXNfbnVtYmVyLAotICAgICAgbnVtYmVyX29mX2ZyYW1lcywKLSAgICAgIGlucHV0X2J1ZmZlcl9saXN0Xyk7Ci0KLSAgT1NTVEFUVVNfRENIRUNLKHJlc3VsdCA9PSBub0VyciwgcmVzdWx0KTsKLSAgaWYgKHJlc3VsdCAhPSBub0VycikKLSAgICByZXR1cm4gcmVzdWx0OwotCi0gIC8vIEJ1ZmZlciBpbnB1dCBpbnRvIEZJRk8uCi0gIGludCBhdmFpbGFibGVfZnJhbWVzID0gZmlmb18ubWF4X2ZyYW1lcygpIC0gZmlmb18uZnJhbWVzKCk7Ci0gIGlmIChpbnB1dF9idXNfLT5mcmFtZXMoKSA8PSBhdmFpbGFibGVfZnJhbWVzKQotICAgIGZpZm9fLlB1c2goaW5wdXRfYnVzXy5nZXQoKSk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotT1NTdGF0dXMgQXVkaW9TeW5jaHJvbml6ZWRTdHJlYW06OkhhbmRsZVZhcmlzcGVlZENhbGxiYWNrKAotICAgIEF1ZGlvVW5pdFJlbmRlckFjdGlvbkZsYWdzKiBpb19hY3Rpb25fZmxhZ3MsCi0gICAgY29uc3QgQXVkaW9UaW1lU3RhbXAqIHRpbWVfc3RhbXAsCi0gICAgVUludDMyIGJ1c19udW1iZXIsCi0gICAgVUludDMyIG51bWJlcl9vZl9mcmFtZXMsCi0gICAgQXVkaW9CdWZmZXJMaXN0KiBpb19kYXRhKSB7Ci0gIC8vIENyZWF0ZSBhIHdyYXBwZXIgYnVzIG9uIHRoZSBBdWRpb0J1ZmZlckxpc3QuCi0gIFdyYXBCdWZmZXJMaXN0KGlvX2RhdGEsIHdyYXBwZXJfYnVzXy5nZXQoKSwgbnVtYmVyX29mX2ZyYW1lcyk7Ci0KLSAgaWYgKGZpZm9fLmZyYW1lcygpIDwgc3RhdGljX2Nhc3Q8aW50PihudW1iZXJfb2ZfZnJhbWVzKSkgewotICAgIC8vIFdlIGRvbid0IERDSEVDSyBoZXJlLCBzaW5jZSB0aGlzIGlzIGEgcG9zc2libGUgcnVuLXRpbWUgY29uZGl0aW9uCi0gICAgLy8gaWYgdGhlIG1hY2hpbmUgaXMgYm9nZ2VkIGRvd24uCi0gICAgd3JhcHBlcl9idXNfLT5aZXJvKCk7Ci0gICAgcmV0dXJuIG5vRXJyOwotICB9Ci0KLSAgLy8gUmVhZCBmcm9tIHRoZSBGSUZPIHRvIGZlZWQgdGhlIHZhcmlzcGVlZC4KLSAgZmlmb18uQ29uc3VtZSh3cmFwcGVyX2J1c18uZ2V0KCksIDAsIG51bWJlcl9vZl9mcmFtZXMpOwotCi0gIHJldHVybiBub0VycjsKLX0KLQotT1NTdGF0dXMgQXVkaW9TeW5jaHJvbml6ZWRTdHJlYW06OkhhbmRsZU91dHB1dENhbGxiYWNrKAotICAgIEF1ZGlvVW5pdFJlbmRlckFjdGlvbkZsYWdzKiBpb19hY3Rpb25fZmxhZ3MsCi0gICAgY29uc3QgQXVkaW9UaW1lU3RhbXAqIHRpbWVfc3RhbXAsCi0gICAgVUludDMyIGJ1c19udW1iZXIsCi0gICAgVUludDMyIG51bWJlcl9vZl9mcmFtZXMsCi0gICAgQXVkaW9CdWZmZXJMaXN0KiBpb19kYXRhKSB7Ci0gIGlmIChmaXJzdF9pbnB1dF90aW1lXyA8IDAuMCkgewotICAgIC8vIElucHV0IGNhbGxiYWNrIGhhc24ndCBydW4geWV0IC0+IHNpbGVuY2UuCi0gICAgWmVyb0J1ZmZlckxpc3QoaW9fZGF0YSk7Ci0gICAgcmV0dXJuIG5vRXJyOwotICB9Ci0KLSAgLy8gVXNlIHRoZSB2YXJpc3BlZWQgcGxheWJhY2sgcmF0ZSB0byBvZmZzZXQgc21hbGwgZGlzY3JlcGFuY2llcwotICAvLyBpbiBoYXJkd2FyZSBjbG9ja3MsIGFuZCBhbHNvIGFueSBkaWZmZXJlbmNlcyBpbiBzYW1wbGUtcmF0ZQotICAvLyBiZXR3ZWVuIGlucHV0IGFuZCBvdXRwdXQgZGV2aWNlcy4KLQotICAvLyBDYWxjdWxhdGUgYSB2YXJpc3BlZWQgcmF0ZSBzY2FsYXIgZmFjdG9yIHRvIGNvbXBlbnNhdGUgZm9yIGRyaWZ0IGJldHdlZW4KLSAgLy8gaW5wdXQgYW5kIG91dHB1dC4gIFdlIHVzZSB0aGUgYWN0dWFsIG51bWJlciBvZiBmcmFtZXMgc3RpbGwgaW4gdGhlIEZJRk8KLSAgLy8gY29tcGFyZWQgd2l0aCB0aGUgaWRlYWwgdmFsdWUgb2YgfHRhcmdldF9maWZvX2ZyYW1lc198LgotICBpbnQgZGVsdGEgPSBmaWZvXy5mcmFtZXMoKSAtIHRhcmdldF9maWZvX2ZyYW1lc187Ci0KLSAgLy8gQXZlcmFnZSB8ZGVsdGF8IGJlY2F1c2UgaXQgY2FuIGppdHRlciBiYWNrL2ZvcnRoIHF1aXRlIGZyZXF1ZW50bHkKLSAgLy8gYnkgKy8tIHRoZSBoYXJkd2FyZSBidWZmZXItc2l6ZSAqaWYqIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGNhbGxiYWNrcyBhcmUKLSAgLy8gaGFwcGVuaW5nIGF0IGFsbW9zdCBleGFjdGx5IHRoZSBzYW1lIHRpbWUuICBBbHNvLCBpZiB0aGUgaW5wdXQgYW5kIG91dHB1dAotICAvLyBzYW1wbGUtcmF0ZXMgYXJlIGRpZmZlcmVudCB0aGVuIHxkZWx0YXwgd2lsbCBqaXR0ZXIgcXVpdGUgYSBiaXQgZHVlIHRvCi0gIC8vIHRoZSByYXRlIGNvbnZlcnNpb24gaGFwcGVuaW5nIGluIHRoZSB2YXJpc3BlZWQsIHBsdXMgdGhlIGppdHRlcmluZyBvZgotICAvLyB0aGUgY2FsbGJhY2tzLiAgVGhlIGF2ZXJhZ2UgdmFsdWUgaXMgd2hhdCdzIGltcG9ydGFudCBoZXJlLgotICBhdmVyYWdlX2RlbHRhXyArPSAoZGVsdGEgLSBhdmVyYWdlX2RlbHRhXykgKiAwLjE7Ci0KLSAgLy8gQ29tcHV0ZSBhIHJhdGUgY29tcGVuc2F0aW9uIHdoaWNoIGFsd2F5cyBhdHRyYWN0cyB1cyBiYWNrIHRvIHRoZQotICAvLyB8dGFyZ2V0X2ZpZm9fZnJhbWVzX3wgb3ZlciBhIHBlcmlvZCBvZiBrQ29ycmVjdGlvblRpbWVTZWNvbmRzLgotICBjb25zdCBkb3VibGUga0NvcnJlY3Rpb25UaW1lU2Vjb25kcyA9IDAuMTsKLSAgZG91YmxlIGNvcnJlY3Rpb25fdGltZV9mcmFtZXMgPSBrQ29ycmVjdGlvblRpbWVTZWNvbmRzICogb3V0cHV0X3NhbXBsZV9yYXRlXzsKLSAgZmlmb19yYXRlX2NvbXBlbnNhdGlvbl8gPQotICAgICAgKGNvcnJlY3Rpb25fdGltZV9mcmFtZXMgKyBhdmVyYWdlX2RlbHRhXykgLyBjb3JyZWN0aW9uX3RpbWVfZnJhbWVzOwotCi0gIC8vIEFkanVzdCBmb3IgRklGTyBkcmlmdC4KLSAgT1NTdGF0dXMgcmVzdWx0ID0gQXVkaW9Vbml0U2V0UGFyYW1ldGVyKAotICAgICAgdmFyaXNwZWVkX3VuaXRfLAotICAgICAga1ZhcmlzcGVlZFBhcmFtX1BsYXliYWNrUmF0ZSwKLSAgICAgIGtBdWRpb1VuaXRTY29wZV9HbG9iYWwsCi0gICAgICAwLAotICAgICAgZmlmb19yYXRlX2NvbXBlbnNhdGlvbl8sCi0gICAgICAwKTsKLQotICBPU1NUQVRVU19EQ0hFQ0socmVzdWx0ID09IG5vRXJyLCByZXN1bHQpOwotICBpZiAocmVzdWx0ICE9IG5vRXJyKQotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgLy8gUmVuZGVyIHRvIHRoZSBvdXRwdXQgdXNpbmcgdGhlIHZhcmlzcGVlZC4KLSAgcmVzdWx0ID0gQXVkaW9Vbml0UmVuZGVyKAotICAgICAgdmFyaXNwZWVkX3VuaXRfLAotICAgICAgaW9fYWN0aW9uX2ZsYWdzLAotICAgICAgdGltZV9zdGFtcCwKLSAgICAgIDAsCi0gICAgICBudW1iZXJfb2ZfZnJhbWVzLAotICAgICAgaW9fZGF0YSk7Ci0KLSAgT1NTVEFUVVNfRENIRUNLKHJlc3VsdCA9PSBub0VyciwgcmVzdWx0KTsKLSAgaWYgKHJlc3VsdCAhPSBub0VycikKLSAgICByZXR1cm4gcmVzdWx0OwotCi0gIC8vIENyZWF0ZSBhIHdyYXBwZXIgYnVzIG9uIHRoZSBBdWRpb0J1ZmZlckxpc3QuCi0gIFdyYXBCdWZmZXJMaXN0KGlvX2RhdGEsIHdyYXBwZXJfYnVzXy5nZXQoKSwgbnVtYmVyX29mX2ZyYW1lcyk7Ci0KLSAgLy8gUHJvY2VzcyBpbi1wbGFjZSEKLSAgc291cmNlXy0+T25Nb3JlSU9EYXRhKHdyYXBwZXJfYnVzXy5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXJfYnVzXy5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyc1N0YXRlKDAsIDApKTsKLQotICByZXR1cm4gbm9FcnI7Ci19Ci0KLU9TU3RhdHVzIEF1ZGlvU3luY2hyb25pemVkU3RyZWFtOjpJbnB1dFByb2MoCi0gICAgdm9pZCogdXNlcl9kYXRhLAotICAgIEF1ZGlvVW5pdFJlbmRlckFjdGlvbkZsYWdzKiBpb19hY3Rpb25fZmxhZ3MsCi0gICAgY29uc3QgQXVkaW9UaW1lU3RhbXAqIHRpbWVfc3RhbXAsCi0gICAgVUludDMyIGJ1c19udW1iZXIsCi0gICAgVUludDMyIG51bWJlcl9vZl9mcmFtZXMsCi0gICAgQXVkaW9CdWZmZXJMaXN0KiBpb19kYXRhKSB7Ci0gIEF1ZGlvU3luY2hyb25pemVkU3RyZWFtKiBzdHJlYW0gPQotICAgICAgc3RhdGljX2Nhc3Q8QXVkaW9TeW5jaHJvbml6ZWRTdHJlYW0qPih1c2VyX2RhdGEpOwotICBEQ0hFQ0soc3RyZWFtKTsKLQotICByZXR1cm4gc3RyZWFtLT5IYW5kbGVJbnB1dENhbGxiYWNrKAotICAgICAgaW9fYWN0aW9uX2ZsYWdzLAotICAgICAgdGltZV9zdGFtcCwKLSAgICAgIGJ1c19udW1iZXIsCi0gICAgICBudW1iZXJfb2ZfZnJhbWVzLAotICAgICAgaW9fZGF0YSk7Ci19Ci0KLU9TU3RhdHVzIEF1ZGlvU3luY2hyb25pemVkU3RyZWFtOjpWYXJpc3BlZWRQcm9jKAotICAgIHZvaWQqIHVzZXJfZGF0YSwKLSAgICBBdWRpb1VuaXRSZW5kZXJBY3Rpb25GbGFncyogaW9fYWN0aW9uX2ZsYWdzLAotICAgIGNvbnN0IEF1ZGlvVGltZVN0YW1wKiB0aW1lX3N0YW1wLAotICAgIFVJbnQzMiBidXNfbnVtYmVyLAotICAgIFVJbnQzMiBudW1iZXJfb2ZfZnJhbWVzLAotICAgIEF1ZGlvQnVmZmVyTGlzdCogaW9fZGF0YSkgewotICBBdWRpb1N5bmNocm9uaXplZFN0cmVhbSogc3RyZWFtID0KLSAgICAgIHN0YXRpY19jYXN0PEF1ZGlvU3luY2hyb25pemVkU3RyZWFtKj4odXNlcl9kYXRhKTsKLSAgRENIRUNLKHN0cmVhbSk7Ci0KLSAgcmV0dXJuIHN0cmVhbS0+SGFuZGxlVmFyaXNwZWVkQ2FsbGJhY2soCi0gICAgICBpb19hY3Rpb25fZmxhZ3MsCi0gICAgICB0aW1lX3N0YW1wLAotICAgICAgYnVzX251bWJlciwKLSAgICAgIG51bWJlcl9vZl9mcmFtZXMsCi0gICAgICBpb19kYXRhKTsKLX0KLQotT1NTdGF0dXMgQXVkaW9TeW5jaHJvbml6ZWRTdHJlYW06Ok91dHB1dFByb2MoCi0gICAgdm9pZCogdXNlcl9kYXRhLAotICAgIEF1ZGlvVW5pdFJlbmRlckFjdGlvbkZsYWdzKiBpb19hY3Rpb25fZmxhZ3MsCi0gICAgY29uc3QgQXVkaW9UaW1lU3RhbXAqIHRpbWVfc3RhbXAsCi0gICAgVUludDMyIGJ1c19udW1iZXIsCi0gICAgVUludDMyIG51bWJlcl9vZl9mcmFtZXMsCi0gICAgQXVkaW9CdWZmZXJMaXN0KiBpb19kYXRhKSB7Ci0gIEF1ZGlvU3luY2hyb25pemVkU3RyZWFtKiBzdHJlYW0gPQotICAgICAgc3RhdGljX2Nhc3Q8QXVkaW9TeW5jaHJvbml6ZWRTdHJlYW0qPih1c2VyX2RhdGEpOwotICBEQ0hFQ0soc3RyZWFtKTsKLQotICByZXR1cm4gc3RyZWFtLT5IYW5kbGVPdXRwdXRDYWxsYmFjaygKLSAgICAgIGlvX2FjdGlvbl9mbGFncywKLSAgICAgIHRpbWVfc3RhbXAsCi0gICAgICBidXNfbnVtYmVyLAotICAgICAgbnVtYmVyX29mX2ZyYW1lcywKLSAgICAgIGlvX2RhdGEpOwotfQotCi12b2lkIEF1ZGlvU3luY2hyb25pemVkU3RyZWFtOjpBdWRpb0RldmljZUluZm86OkluaXRpYWxpemUoCi0gICAgQXVkaW9EZXZpY2VJRCBpZCwgYm9vbCBpc19pbnB1dCkgewotICBpZF8gPSBpZDsKLSAgaXNfaW5wdXRfID0gaXNfaW5wdXQ7Ci0gIGlmIChpZF8gPT0ga0F1ZGlvRGV2aWNlVW5rbm93bikKLSAgICByZXR1cm47Ci0KLSAgVUludDMyIHByb3BlcnR5X3NpemUgPSBzaXplb2YoYnVmZmVyX3NpemVfZnJhbWVzXyk7Ci0KLSAgQXVkaW9PYmplY3RQcm9wZXJ0eUFkZHJlc3MgcGE7Ci0gIHBhLm1TZWxlY3RvciA9IGtBdWRpb0RldmljZVByb3BlcnR5QnVmZmVyRnJhbWVTaXplOwotICBwYS5tU2NvcGUgPSBrQXVkaW9PYmplY3RQcm9wZXJ0eVNjb3BlV2lsZGNhcmQ7Ci0gIHBhLm1FbGVtZW50ID0ga0F1ZGlvT2JqZWN0UHJvcGVydHlFbGVtZW50TWFzdGVyOwotICBPU1N0YXR1cyByZXN1bHQgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YSgKLSAgICAgIGlkXywKLSAgICAgICZwYSwKLSAgICAgIDAsCi0gICAgICAwLAotICAgICAgJnByb3BlcnR5X3NpemUsCi0gICAgICAmYnVmZmVyX3NpemVfZnJhbWVzXyk7Ci0KLSAgT1NTVEFUVVNfRENIRUNLKHJlc3VsdCA9PSBub0VyciwgcmVzdWx0KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vbWFjL2F1ZGlvX3N5bmNocm9uaXplZF9tYWMuaCBiL3NyYy9tZWRpYS9hdWRpby9tYWMvYXVkaW9fc3luY2hyb25pemVkX21hYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTlkOWM4Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9tYWMvYXVkaW9fc3luY2hyb25pemVkX21hYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfQVVESU9fTUFDX0FVRElPX1NZTkNIUk9OSVpFRF9NQUNfSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fTUFDX0FVRElPX1NZTkNIUk9OSVpFRF9NQUNfSF8KLQotI2luY2x1ZGUgPEF1ZGlvVG9vbGJveC9BdWRpb1Rvb2xib3guaD4KLSNpbmNsdWRlIDxBdWRpb1VuaXQvQXVkaW9Vbml0Lmg+Ci0jaW5jbHVkZSA8Q29yZUF1ZGlvL0NvcmVBdWRpby5oPgotCi0jaW5jbHVkZSAiYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgotI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19pby5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3BhcmFtZXRlcnMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2J1cy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fZmlmby5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBBdWRpb01hbmFnZXJNYWM7Ci0KLS8vIEF1ZGlvU3luY2hyb25pemVkU3RyZWFtIGFsbG93cyBhcmJpdHJhcnkgY29tYmluYXRpb25zIG9mIGlucHV0IGFuZCBvdXRwdXQKLS8vIGRldmljZXMgcnVubmluZyBvZmYgZGlmZmVyZW50IGNsb2NrcyBhbmQgdXNpbmcgZGlmZmVyZW50IGRyaXZlcnMsIHdpdGgKLS8vIHBvdGVudGlhbGx5IGRpZmZlcmluZyBzYW1wbGUtcmF0ZXMuICBJdCBpbXBsZW1lbnRzIEF1ZGlvT3V0cHV0U3RyZWFtCi0vLyBhbmQgc2h1dHRsZXMgaXRzIHN5bmNocm9uaXplZCBJL08gZGF0YSB1c2luZyBBdWRpb1NvdXJjZUNhbGxiYWNrLgotLy8KLS8vIEl0IGlzIHJlcXVpcmVkIHRvIGZpcnN0IGFjcXVpcmUgdGhlIG5hdGl2ZSBzYW1wbGUgcmF0ZSBvZiB0aGUgc2VsZWN0ZWQKLS8vIG91dHB1dCBkZXZpY2UgYW5kIHRoZW4gdXNlIHRoZSBzYW1lIHJhdGUgd2hlbiBjcmVhdGluZyB0aGlzIG9iamVjdC4KLS8vCi0vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0vLyBUaGVvcnkgb2YgT3BlcmF0aW9uOgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCi0vLyAgICAgIElOUFVUIFRIUkVBRCAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgT1VUUFVUIFRIUkVBRAotLy8gICArLS0tLS0tLS0tLS0tLS0tLS0rICAgICArLS0tLS0tKyAgICAuCi0vLyAgIHwgSW5wdXQgQXVkaW9Vbml0IHwgLS0+IHwgICAgICB8ICAgIC4KLS8vICAgKy0tLS0tLS0tLS0tLS0tLS0tKyAgICAgfCAgICAgIHwgICAgLgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICB8IEZJRk8gfCAgICAuCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICB8ICAgICAgICArLS0tLS0tLS0tLS0rCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICB8IC0tLS0tPiB8IFZhcmlzcGVlZCB8Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICB8ICAgICAgICArLS0tLS0tLS0tLS0rCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0rICAgIC4gICAgICAgICB8Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICB8ICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAgT25Nb3JlSU9EYXRhKCkgLS0+ICB8IE91dHB1dCBBVSB8Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rCi0vLwotLy8gVGhlIGlucHV0IEF1ZGlvVW5pdCdzIElucHV0UHJvYyBpcyBjYWxsZWQgb24gb25lIHRocmVhZCB3aGljaCBmZWVkcyB0aGUKLS8vIEZJRk8uICBUaGUgb3V0cHV0IEF1ZGlvVW5pdCdzIE91dHB1dFByb2MgaXMgY2FsbGVkIG9uIGEgc2Vjb25kIHRocmVhZAotLy8gd2hpY2ggcHVsbHMgb24gdGhlIHZhcmlzcGVlZCB0byBnZXQgdGhlIGN1cnJlbnQgaW5wdXQgZGF0YS4gIFRoZSB2YXJpc3BlZWQKLS8vIGhhbmRsZXMgbWlzbWF0Y2hlcyBiZXR3ZWVuIGlucHV0IGFuZCBvdXRwdXQgc2FtcGxlLXJhdGUgYW5kIGFsc28gY2xvY2sgZHJpZnQKLS8vIGJldHdlZW4gdGhlIGlucHV0IGFuZCBvdXRwdXQgZHJpdmVycy4gIFRoZSB2YXJpc3BlZWQgY29uc3VtZXMgaXRzIGRhdGEgZnJvbQotLy8gdGhlIEZJRk8gYW5kIGFkanVzdHMgaXRzIHJhdGUgZHluYW1pY2FsbHkgYWNjb3JkaW5nIHRvIHRoZSBhbW91bnQKLS8vIG9mIGRhdGEgYnVmZmVyZWQgaW4gdGhlIEZJRk8uICBJZiB0aGUgRklGTyBzdGFydHMgZ2V0dGluZyB0b28gbXVjaCBkYXRhCi0vLyBidWZmZXJlZCB0aGVuIHRoZSB2YXJpc3BlZWQgd2lsbCBzcGVlZCB1cCBzbGlnaHRseSB0byBjb21wZW5zYXRlCi0vLyBhbmQgc2ltaWxhcmx5IGlmIHRoZSBGSUZPIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggZGF0YSBidWZmZXJlZCB0aGVuIHRoZQotLy8gdmFyaXNwZWVkIHdpbGwgc2xvdyBkb3duIHNsaWdodGx5LgotLy8KLS8vIEZpbmFsbHksIG9uY2UgdGhlIGlucHV0IGRhdGEgaXMgYXZhaWxhYmxlIHRoZW4gT25Nb3JlSU9EYXRhKCkgaXMgY2FsbGVkCi0vLyB3aGljaCBpcyBnaXZlbiB0aGlzIGlucHV0LCBhbmQgcmVuZGVycyB0aGUgb3V0cHV0IHdoaWNoIGlzIGZpbmFsbHkgc2VudAotLy8gdG8gdGhlIE91dHB1dCBBdWRpb1VuaXQuCi1jbGFzcyBBdWRpb1N5bmNocm9uaXplZFN0cmVhbSA6IHB1YmxpYyBBdWRpb091dHB1dFN0cmVhbSB7Ci0gcHVibGljOgotICAvLyBUaGUgY3RvciB0YWtlcyBhbGwgdGhlIHVzdWFsIHBhcmFtZXRlcnMsIHBsdXMgfG1hbmFnZXJ8IHdoaWNoIGlzIHRoZQotICAvLyB0aGUgYXVkaW8gbWFuYWdlciB3aG8gaXMgY3JlYXRpbmcgdGhpcyBvYmplY3QuCi0gIEF1ZGlvU3luY2hyb25pemVkU3RyZWFtKEF1ZGlvTWFuYWdlck1hYyogbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlSUQgaW5wdXRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlSUQgb3V0cHV0X2lkKTsKLQotICB2aXJ0dWFsIH5BdWRpb1N5bmNocm9uaXplZFN0cmVhbSgpOwotCi0gIC8vIEltcGxlbWVudGF0aW9uIG9mIEF1ZGlvT3V0cHV0U3RyZWFtLgotICB2aXJ0dWFsIGJvb2wgT3BlbigpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgQ2xvc2UoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0YXJ0KEF1ZGlvU291cmNlQ2FsbGJhY2sqIGNhbGxiYWNrKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0b3AoKSBPVkVSUklERTsKLQotICB2aXJ0dWFsIHZvaWQgU2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgR2V0Vm9sdW1lKGRvdWJsZSogdm9sdW1lKSBPVkVSUklERTsKLQotICBPU1N0YXR1cyBTZXRJbnB1dERldmljZUFzQ3VycmVudChBdWRpb0RldmljZUlEIGlucHV0X2lkKTsKLSAgT1NTdGF0dXMgU2V0T3V0cHV0RGV2aWNlQXNDdXJyZW50KEF1ZGlvRGV2aWNlSUQgb3V0cHV0X2lkKTsKLSAgQXVkaW9EZXZpY2VJRCBHZXRJbnB1dERldmljZUlEKCkgeyByZXR1cm4gaW5wdXRfaW5mb18uaWRfOyAgfQotICBBdWRpb0RldmljZUlEIEdldE91dHB1dERldmljZUlEKCkgeyByZXR1cm4gb3V0cHV0X2luZm9fLmlkXzsgfQotCi0gIGJvb2wgSXNSdW5uaW5nKCk7Ci0KLSBwcml2YXRlOgotICAvLyBJbml0aWFsaXphdGlvbi4KLSAgT1NTdGF0dXMgQ3JlYXRlQXVkaW9Vbml0cygpOwotICBPU1N0YXR1cyBTZXR1cElucHV0KEF1ZGlvRGV2aWNlSUQgaW5wdXRfaWQpOwotICBPU1N0YXR1cyBFbmFibGVJTygpOwotICBPU1N0YXR1cyBTZXR1cE91dHB1dChBdWRpb0RldmljZUlEIG91dHB1dF9pZCk7Ci0gIE9TU3RhdHVzIFNldHVwQ2FsbGJhY2tzKCk7Ci0gIE9TU3RhdHVzIFNldHVwU3RyZWFtRm9ybWF0cygpOwotICB2b2lkIEFsbG9jYXRlSW5wdXREYXRhKCk7Ci0KLSAgLy8gSGFuZGxlcnMgZm9yIHRoZSBBdWRpb1VuaXQgY2FsbGJhY2tzLgotICBPU1N0YXR1cyBIYW5kbGVJbnB1dENhbGxiYWNrKEF1ZGlvVW5pdFJlbmRlckFjdGlvbkZsYWdzKiBpb19hY3Rpb25fZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9UaW1lU3RhbXAqIHRpbWVfc3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyIGJ1c19udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyIG51bWJlcl9vZl9mcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJMaXN0KiBpb19kYXRhKTsKLQotICBPU1N0YXR1cyBIYW5kbGVWYXJpc3BlZWRDYWxsYmFjayhBdWRpb1VuaXRSZW5kZXJBY3Rpb25GbGFncyogaW9fYWN0aW9uX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1RpbWVTdGFtcCogdGltZV9zdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyIGJ1c19udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBudW1iZXJfb2ZfZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlckxpc3QqIGlvX2RhdGEpOwotCi0gIE9TU3RhdHVzIEhhbmRsZU91dHB1dENhbGxiYWNrKEF1ZGlvVW5pdFJlbmRlckFjdGlvbkZsYWdzKiBpb19hY3Rpb25fZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvVGltZVN0YW1wKiB0aW1lX3N0YW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MzIgYnVzX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyIG51bWJlcl9vZl9mcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyTGlzdCogaW9fZGF0YSk7Ci0KLSAgLy8gQXVkaW9Vbml0IGNhbGxiYWNrcy4KLSAgc3RhdGljIE9TU3RhdHVzIElucHV0UHJvYyh2b2lkKiB1c2VyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Vbml0UmVuZGVyQWN0aW9uRmxhZ3MqIGlvX2FjdGlvbl9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1RpbWVTdGFtcCogdGltZV9zdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MzIgYnVzX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MzIgbnVtYmVyX29mX2ZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlckxpc3QqIGlvX2RhdGEpOwotCi0gIHN0YXRpYyBPU1N0YXR1cyBWYXJpc3BlZWRQcm9jKHZvaWQqIHVzZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Vbml0UmVuZGVyQWN0aW9uRmxhZ3MqIGlvX2FjdGlvbl9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9UaW1lU3RhbXAqIHRpbWVfc3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBidXNfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MzIgbnVtYmVyX29mX2ZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJMaXN0KiBpb19kYXRhKTsKLQotICBzdGF0aWMgT1NTdGF0dXMgT3V0cHV0UHJvYyh2b2lkKiB1c2VyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVW5pdFJlbmRlckFjdGlvbkZsYWdzKiBpb19hY3Rpb25fZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvVGltZVN0YW1wKiB0aW1lX3N0YW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MzIgYnVzX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyIG51bWJlcl9vZl9mcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyTGlzdCogIGlvX2RhdGEpOwotCi0gIC8vIE91ciBjcmVhdG9yLgotICBBdWRpb01hbmFnZXJNYWMqIG1hbmFnZXJfOwotCi0gIC8vIENsaWVudCBwYXJhbWV0ZXJzLgotICBBdWRpb1BhcmFtZXRlcnMgcGFyYW1zXzsKLQotICBkb3VibGUgaW5wdXRfc2FtcGxlX3JhdGVfOwotICBkb3VibGUgb3V0cHV0X3NhbXBsZV9yYXRlXzsKLQotICAvLyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdGhhdCB3aWxsIHByb3ZpZGUgdGhlIGF1ZGlvIHNhbXBsZXMuCi0gIEF1ZGlvU291cmNlQ2FsbGJhY2sqIHNvdXJjZV87Ci0KLSAgLy8gVmFsdWVzIHVzZWQgaW4gT3BlbigpLgotICBBdWRpb0RldmljZUlEIGlucHV0X2lkXzsKLSAgQXVkaW9EZXZpY2VJRCBvdXRwdXRfaWRfOwotCi0gIC8vIFRoZSBpbnB1dCBBdWRpb1VuaXQgcmVuZGVycyBpdHMgZGF0YSBoZXJlLgotICBBdWRpb0J1ZmZlckxpc3QqIGlucHV0X2J1ZmZlcl9saXN0XzsKLQotICAvLyBIb2xkcyB0aGUgYWN0dWFsIGRhdGEgZm9yIHxpbnB1dF9idWZmZXJfbGlzdF98LgotICBzY29wZWRfcHRyPEF1ZGlvQnVzPiBpbnB1dF9idXNfOwotCi0gIC8vIFVzZWQgdG8gb3ZlcmxheSBBdWRpb0J1ZmZlckxpc3RzLgotICBzY29wZWRfcHRyPEF1ZGlvQnVzPiB3cmFwcGVyX2J1c187Ci0KLSAgY2xhc3MgQXVkaW9EZXZpY2VJbmZvIHsKLSAgIHB1YmxpYzoKLSAgICBBdWRpb0RldmljZUluZm8oKQotICAgICAgICA6IGlkXyhrQXVkaW9EZXZpY2VVbmtub3duKSwKLSAgICAgICAgICBpc19pbnB1dF8oZmFsc2UpLAotICAgICAgICAgIGJ1ZmZlcl9zaXplX2ZyYW1lc18oMCkge30KLSAgICB2b2lkIEluaXRpYWxpemUoQXVkaW9EZXZpY2VJRCBpbklELCBib29sIGlzSW5wdXQpOwotICAgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IHsgcmV0dXJuIGlkXyAhPSBrQXVkaW9EZXZpY2VVbmtub3duOyB9Ci0KLSAgICBBdWRpb0RldmljZUlEIGlkXzsKLSAgICBib29sIGlzX2lucHV0XzsKLSAgICBVSW50MzIgYnVmZmVyX3NpemVfZnJhbWVzXzsKLSAgfTsKLQotICBBdWRpb0RldmljZUluZm8gaW5wdXRfaW5mb187Ci0gIEF1ZGlvRGV2aWNlSW5mbyBvdXRwdXRfaW5mb187Ci0KLSAgLy8gVXNlZCBmb3IgaW5wdXQgdG8gb3V0cHV0IGJ1ZmZlcmluZy4KLSAgQXVkaW9GaWZvIGZpZm9fOwotCi0gIC8vIFRoZSBvcHRpbWFsIG51bWJlciBvZiBmcmFtZXMgd2UnZCBsaWtlIHRvIGtlZXAgaW4gdGhlIEZJRk8gYXQgYWxsIHRpbWVzLgotICBpbnQgdGFyZ2V0X2ZpZm9fZnJhbWVzXzsKLQotICAvLyBBIHJ1bm5pbmcgYXZlcmFnZSBvZiB0aGUgbWVhc3VyZWQgZGVsdGEgYmV0d2VlbiBhY3R1YWwgbnVtYmVyIG9mIGZyYW1lcwotICAvLyBpbiB0aGUgRklGTyB2ZXJzdXMgfHRhcmdldF9maWZvX2ZyYW1lc198LgotICBkb3VibGUgYXZlcmFnZV9kZWx0YV87Ci0KLSAgLy8gQSB2YXJpc3BlZWQgcmF0ZSBzY2FsYXIgd2hpY2ggaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiBGSUZPIGRyaWZ0LgotICBkb3VibGUgZmlmb19yYXRlX2NvbXBlbnNhdGlvbl87Ci0KLSAgLy8gQXVkaW9Vbml0cy4KLSAgQXVkaW9Vbml0IGlucHV0X3VuaXRfOwotICBBdWRpb1VuaXQgdmFyaXNwZWVkX3VuaXRfOwotICBBdWRpb1VuaXQgb3V0cHV0X3VuaXRfOwotCi0gIGRvdWJsZSBmaXJzdF9pbnB1dF90aW1lXzsKLQotICBib29sIGlzX3J1bm5pbmdfOwotICBpbnQgaGFyZHdhcmVfYnVmZmVyX3NpemVfOwotICBpbnQgY2hhbm5lbHNfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBdWRpb1N5bmNocm9uaXplZFN0cmVhbSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9BVURJT19NQUNfQVVESU9fU1lOQ0hST05JWkVEX01BQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL21hYy9hdWRpb191bmlmaWVkX21hYy5jYyBiL3NyYy9tZWRpYS9hdWRpby9tYWMvYXVkaW9fdW5pZmllZF9tYWMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NjIyZTQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL21hYy9hdWRpb191bmlmaWVkX21hYy5jYworKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vbWFjL2F1ZGlvX3VuaWZpZWRfbWFjLmgiCi0KLSNpbmNsdWRlIDxDb3JlU2VydmljZXMvQ29yZVNlcnZpY2VzLmg+Ci0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL21hYy9tYWNfbG9nZ2luZy5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3V0aWwuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9tYWMvYXVkaW9fbWFuYWdlcl9tYWMuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gVE9ETyhjcm9nZXJzKTogc3VwcG9ydCBtb3JlIHRoYW4gaGFyZC1jb2RlZCBzdGVyZW8gaW5wdXQuCi0vLyBJZGVhbGx5IHdlIHdvdWxkIGxpa2UgdG8gcmVjZWl2ZSB0aGlzIHZhbHVlIGFzIGEgY29uc3RydWN0b3IgYXJndW1lbnQuCi1zdGF0aWMgY29uc3QgaW50IGtEZWZhdWx0SW5wdXRDaGFubmVscyA9IDI7Ci0KLUF1ZGlvSGFyZHdhcmVVbmlmaWVkU3RyZWFtOjpBdWRpb0hhcmR3YXJlVW5pZmllZFN0cmVhbSgKLSAgICBBdWRpb01hbmFnZXJNYWMqIG1hbmFnZXIsIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKQotICAgIDogbWFuYWdlcl8obWFuYWdlciksCi0gICAgICBzb3VyY2VfKE5VTEwpLAotICAgICAgY2xpZW50X2lucHV0X2NoYW5uZWxzXyhrRGVmYXVsdElucHV0Q2hhbm5lbHMpLAotICAgICAgdm9sdW1lXygxLjBmKSwKLSAgICAgIGlucHV0X2NoYW5uZWxzXygwKSwKLSAgICAgIG91dHB1dF9jaGFubmVsc18oMCksCi0gICAgICBpbnB1dF9jaGFubmVsc19wZXJfZnJhbWVfKDApLAotICAgICAgb3V0cHV0X2NoYW5uZWxzX3Blcl9mcmFtZV8oMCksCi0gICAgICBpb19wcm9jX2lkXygwKSwKLSAgICAgIGRldmljZV8oa0F1ZGlvT2JqZWN0VW5rbm93biksCi0gICAgICBpc19wbGF5aW5nXyhmYWxzZSkgewotICBEQ0hFQ0sobWFuYWdlcl8pOwotCi0gIC8vIEEgZnJhbWUgaXMgb25lIHNhbXBsZSBhY3Jvc3MgYWxsIGNoYW5uZWxzLiBJbiBpbnRlcmxlYXZlZCBhdWRpbyB0aGUgcGVyCi0gIC8vIGZyYW1lIGZpZWxkcyBpZGVudGlmeSB0aGUgc2V0IG9mIG4gfGNoYW5uZWxzfC4gSW4gdW5jb21wcmVzc2VkIGF1ZGlvLCBhCi0gIC8vIHBhY2tldCBpcyBhbHdheXMgb25lIGZyYW1lLgotICBmb3JtYXRfLm1TYW1wbGVSYXRlID0gcGFyYW1zLnNhbXBsZV9yYXRlKCk7Ci0gIGZvcm1hdF8ubUZvcm1hdElEID0ga0F1ZGlvRm9ybWF0TGluZWFyUENNOwotICBmb3JtYXRfLm1Gb3JtYXRGbGFncyA9IGtMaW5lYXJQQ01Gb3JtYXRGbGFnSXNQYWNrZWQgfAotICAgICAgICAgICAgICAgICAgICAgICAgIGtMaW5lYXJQQ01Gb3JtYXRGbGFnSXNTaWduZWRJbnRlZ2VyOwotICBmb3JtYXRfLm1CaXRzUGVyQ2hhbm5lbCA9IHBhcmFtcy5iaXRzX3Blcl9zYW1wbGUoKTsKLSAgZm9ybWF0Xy5tQ2hhbm5lbHNQZXJGcmFtZSA9IHBhcmFtcy5jaGFubmVscygpOwotICBmb3JtYXRfLm1GcmFtZXNQZXJQYWNrZXQgPSAxOwotICBmb3JtYXRfLm1CeXRlc1BlclBhY2tldCA9IChmb3JtYXRfLm1CaXRzUGVyQ2hhbm5lbCAqIHBhcmFtcy5jaGFubmVscygpKSAvIDg7Ci0gIGZvcm1hdF8ubUJ5dGVzUGVyRnJhbWUgPSBmb3JtYXRfLm1CeXRlc1BlclBhY2tldDsKLSAgZm9ybWF0Xy5tUmVzZXJ2ZWQgPSAwOwotCi0gIC8vIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHNhbXBsZSBmcmFtZXMgcGVyIGNhbGxiYWNrLgotICBudW1iZXJfb2ZfZnJhbWVzXyA9IHBhcmFtcy5HZXRCeXRlc1BlckJ1ZmZlcigpIC8gZm9ybWF0Xy5tQnl0ZXNQZXJQYWNrZXQ7Ci0KLSAgaW5wdXRfYnVzXyA9IEF1ZGlvQnVzOjpDcmVhdGUoY2xpZW50X2lucHV0X2NoYW5uZWxzXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmZyYW1lc19wZXJfYnVmZmVyKCkpOwotICBvdXRwdXRfYnVzXyA9IEF1ZGlvQnVzOjpDcmVhdGUocGFyYW1zKTsKLX0KLQotQXVkaW9IYXJkd2FyZVVuaWZpZWRTdHJlYW06On5BdWRpb0hhcmR3YXJlVW5pZmllZFN0cmVhbSgpIHsKLSAgRENIRUNLX0VRKGRldmljZV8sIGtBdWRpb09iamVjdFVua25vd24pOwotfQotCi1ib29sIEF1ZGlvSGFyZHdhcmVVbmlmaWVkU3RyZWFtOjpPcGVuKCkgewotICAvLyBPYnRhaW4gdGhlIGN1cnJlbnQgb3V0cHV0IGRldmljZSBzZWxlY3RlZCBieSB0aGUgdXNlci4KLSAgQXVkaW9PYmplY3RQcm9wZXJ0eUFkZHJlc3MgcGE7Ci0gIHBhLm1TZWxlY3RvciA9IGtBdWRpb0hhcmR3YXJlUHJvcGVydHlEZWZhdWx0T3V0cHV0RGV2aWNlOwotICBwYS5tU2NvcGUgPSBrQXVkaW9PYmplY3RQcm9wZXJ0eVNjb3BlR2xvYmFsOwotICBwYS5tRWxlbWVudCA9IGtBdWRpb09iamVjdFByb3BlcnR5RWxlbWVudE1hc3RlcjsKLQotICBVSW50MzIgc2l6ZSA9IHNpemVvZihkZXZpY2VfKTsKLQotICBPU1N0YXR1cyByZXN1bHQgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YSgKLSAgICAgIGtBdWRpb09iamVjdFN5c3RlbU9iamVjdCwKLSAgICAgICZwYSwKLSAgICAgIDAsCi0gICAgICAwLAotICAgICAgJnNpemUsCi0gICAgICAmZGV2aWNlXyk7Ci0KLSAgaWYgKChyZXN1bHQgIT0ga0F1ZGlvSGFyZHdhcmVOb0Vycm9yKSB8fCAoZGV2aWNlXyA9PSBrQXVkaW9EZXZpY2VVbmtub3duKSkgewotICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCBvcGVuIHVuaWZpZWQgQXVkaW9EZXZpY2UuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBUaGUgcmVxdWVzdGVkIHNhbXBsZS1yYXRlIG11c3QgbWF0Y2ggdGhlIGhhcmR3YXJlIHNhbXBsZS1yYXRlLgotICBGbG9hdDY0IHNhbXBsZV9yYXRlID0gMC4wOwotICBzaXplID0gc2l6ZW9mKHNhbXBsZV9yYXRlKTsKLQotICBwYS5tU2VsZWN0b3IgPSBrQXVkaW9EZXZpY2VQcm9wZXJ0eU5vbWluYWxTYW1wbGVSYXRlOwotICBwYS5tU2NvcGUgPSBrQXVkaW9PYmplY3RQcm9wZXJ0eVNjb3BlV2lsZGNhcmQ7Ci0gIHBhLm1FbGVtZW50ID0ga0F1ZGlvT2JqZWN0UHJvcGVydHlFbGVtZW50TWFzdGVyOwotCi0gIHJlc3VsdCA9IEF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhKAotICAgICAgZGV2aWNlXywKLSAgICAgICZwYSwKLSAgICAgIDAsCi0gICAgICAwLAotICAgICAgJnNpemUsCi0gICAgICAmc2FtcGxlX3JhdGUpOwotCi0gIGlmIChyZXN1bHQgIT0gbm9FcnIgfHwgc2FtcGxlX3JhdGUgIT0gZm9ybWF0Xy5tU2FtcGxlUmF0ZSkgewotICAgIExPRyhFUlJPUikgPDwgIlJlcXVlc3RlZCBzYW1wbGUtcmF0ZTogIiA8PCBmb3JtYXRfLm1TYW1wbGVSYXRlCi0gICAgICAgIDw8ICAiIG11c3QgbWF0Y2ggdGhlIGhhcmR3YXJlIHNhbXBsZS1yYXRlOiAiIDw8IHNhbXBsZV9yYXRlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIENvbmZpZ3VyZSBidWZmZXIgZnJhbWUgc2l6ZS4KLSAgVUludDMyIGZyYW1lX3NpemUgPSBudW1iZXJfb2ZfZnJhbWVzXzsKLQotICBwYS5tU2VsZWN0b3IgPSBrQXVkaW9EZXZpY2VQcm9wZXJ0eUJ1ZmZlckZyYW1lU2l6ZTsKLSAgcGEubVNjb3BlID0ga0F1ZGlvRGV2aWNlUHJvcGVydHlTY29wZUlucHV0OwotICBwYS5tRWxlbWVudCA9IGtBdWRpb09iamVjdFByb3BlcnR5RWxlbWVudE1hc3RlcjsKLSAgcmVzdWx0ID0gQXVkaW9PYmplY3RTZXRQcm9wZXJ0eURhdGEoCi0gICAgICBkZXZpY2VfLAotICAgICAgJnBhLAotICAgICAgMCwKLSAgICAgIDAsCi0gICAgICBzaXplb2YoZnJhbWVfc2l6ZSksCi0gICAgICAmZnJhbWVfc2l6ZSk7Ci0KLSAgaWYgKHJlc3VsdCAhPSBub0VycikgewotICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBzZXQgaW5wdXQgYnVmZmVyIGZyYW1lIHNpemU6ICIgIDw8IGZyYW1lX3NpemU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcGEubVNjb3BlID0ga0F1ZGlvRGV2aWNlUHJvcGVydHlTY29wZU91dHB1dDsKLSAgcmVzdWx0ID0gQXVkaW9PYmplY3RTZXRQcm9wZXJ0eURhdGEoCi0gICAgICBkZXZpY2VfLAotICAgICAgJnBhLAotICAgICAgMCwKLSAgICAgIDAsCi0gICAgICBzaXplb2YoZnJhbWVfc2l6ZSksCi0gICAgICAmZnJhbWVfc2l6ZSk7Ci0KLSAgaWYgKHJlc3VsdCAhPSBub0VycikgewotICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBzZXQgb3V0cHV0IGJ1ZmZlciBmcmFtZSBzaXplOiAiICA8PCBmcmFtZV9zaXplOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIERWTE9HKDEpIDw8ICJTYW1wbGUgcmF0ZTogIiA8PCBzYW1wbGVfcmF0ZTsKLSAgRFZMT0coMSkgPDwgIkZyYW1lIHNpemU6ICIgPDwgZnJhbWVfc2l6ZTsKLQotICAvLyBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBpbnB1dCBhbmQgb3V0cHV0IGNoYW5uZWxzLgotICAvLyBXZSBoYW5kbGUgYm90aCB0aGUgaW50ZXJsZWF2ZWQgYW5kIG5vbi1pbnRlcmxlYXZlZCBjYXNlcy4KLQotICAvLyBHZXQgaW5wdXQgc3RyZWFtIGNvbmZpZ3VyYXRpb24uCi0gIHBhLm1TZWxlY3RvciA9IGtBdWRpb0RldmljZVByb3BlcnR5U3RyZWFtQ29uZmlndXJhdGlvbjsKLSAgcGEubVNjb3BlID0ga0F1ZGlvRGV2aWNlUHJvcGVydHlTY29wZUlucHV0OwotICBwYS5tRWxlbWVudCA9IGtBdWRpb09iamVjdFByb3BlcnR5RWxlbWVudE1hc3RlcjsKLQotICByZXN1bHQgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YVNpemUoZGV2aWNlXywgJnBhLCAwLCAwLCAmc2l6ZSk7Ci0gIE9TU1RBVFVTX0RDSEVDSyhyZXN1bHQgPT0gbm9FcnIsIHJlc3VsdCk7Ci0KLSAgaWYgKHJlc3VsdCA9PSBub0VyciAmJiBzaXplID4gMCkgewotICAgIC8vIEFsbG9jYXRlIHN0b3JhZ2UuCi0gICAgc2NvcGVkX2FycmF5PHVpbnQ4PiBpbnB1dF9saXN0X3N0b3JhZ2UobmV3IHVpbnQ4W3NpemVdKTsKLSAgICBBdWRpb0J1ZmZlckxpc3QmIGlucHV0X2xpc3QgPQotICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxBdWRpb0J1ZmZlckxpc3QqPihpbnB1dF9saXN0X3N0b3JhZ2UuZ2V0KCkpOwotCi0gICAgcmVzdWx0ID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGEoCi0gICAgICAgIGRldmljZV8sCi0gICAgICAgICZwYSwKLSAgICAgICAgMCwKLSAgICAgICAgMCwKLSAgICAgICAgJnNpemUsCi0gICAgICAgICZpbnB1dF9saXN0KTsKLSAgICBPU1NUQVRVU19EQ0hFQ0socmVzdWx0ID09IG5vRXJyLCByZXN1bHQpOwotCi0gICAgaWYgKHJlc3VsdCA9PSBub0VycikgewotICAgICAgLy8gRGV0ZXJtaW5lIG51bWJlciBvZiBpbnB1dCBjaGFubmVscy4KLSAgICAgIGlucHV0X2NoYW5uZWxzX3Blcl9mcmFtZV8gPSBpbnB1dF9saXN0Lm1OdW1iZXJCdWZmZXJzID4gMCA/Ci0gICAgICAgICAgaW5wdXRfbGlzdC5tQnVmZmVyc1swXS5tTnVtYmVyQ2hhbm5lbHMgOiAwOwotICAgICAgaWYgKGlucHV0X2NoYW5uZWxzX3Blcl9mcmFtZV8gPT0gMSAmJiBpbnB1dF9saXN0Lm1OdW1iZXJCdWZmZXJzID4gMSkgewotICAgICAgICAvLyBOb24taW50ZXJsZWF2ZWQuCi0gICAgICAgIGlucHV0X2NoYW5uZWxzXyA9IGlucHV0X2xpc3QubU51bWJlckJ1ZmZlcnM7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBJbnRlcmxlYXZlZC4KLSAgICAgICAgaW5wdXRfY2hhbm5lbHNfID0gaW5wdXRfY2hhbm5lbHNfcGVyX2ZyYW1lXzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBEVkxPRygxKSA8PCAiSW5wdXQgY2hhbm5lbHM6ICIgPDwgaW5wdXRfY2hhbm5lbHNfOwotICBEVkxPRygxKSA8PCAiSW5wdXQgY2hhbm5lbHMgcGVyIGZyYW1lOiAiIDw8IGlucHV0X2NoYW5uZWxzX3Blcl9mcmFtZV87Ci0KLSAgLy8gVGhlIGhhcmR3YXJlIG11c3QgaGF2ZSBhdCBsZWFzdCB0aGUgcmVxdWVzdGVkIGlucHV0IGNoYW5uZWxzLgotICBpZiAocmVzdWx0ICE9IG5vRXJyIHx8IGNsaWVudF9pbnB1dF9jaGFubmVsc18gPiBpbnB1dF9jaGFubmVsc18pIHsKLSAgICBMT0coRVJST1IpIDw8ICJBdWRpb0RldmljZSBkb2VzIG5vdCBzdXBwb3J0IHJlcXVlc3RlZCBpbnB1dCBjaGFubmVscy4iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIEdldCBvdXRwdXQgc3RyZWFtIGNvbmZpZ3VyYXRpb24uCi0gIHBhLm1TZWxlY3RvciA9IGtBdWRpb0RldmljZVByb3BlcnR5U3RyZWFtQ29uZmlndXJhdGlvbjsKLSAgcGEubVNjb3BlID0ga0F1ZGlvRGV2aWNlUHJvcGVydHlTY29wZU91dHB1dDsKLSAgcGEubUVsZW1lbnQgPSBrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXI7Ci0KLSAgcmVzdWx0ID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGFTaXplKGRldmljZV8sICZwYSwgMCwgMCwgJnNpemUpOwotICBPU1NUQVRVU19EQ0hFQ0socmVzdWx0ID09IG5vRXJyLCByZXN1bHQpOwotCi0gIGlmIChyZXN1bHQgPT0gbm9FcnIgJiYgc2l6ZSA+IDApIHsKLSAgICAvLyBBbGxvY2F0ZSBzdG9yYWdlLgotICAgIHNjb3BlZF9hcnJheTx1aW50OD4gb3V0cHV0X2xpc3Rfc3RvcmFnZShuZXcgdWludDhbc2l6ZV0pOwotICAgIEF1ZGlvQnVmZmVyTGlzdCYgb3V0cHV0X2xpc3QgPQotICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxBdWRpb0J1ZmZlckxpc3QqPihvdXRwdXRfbGlzdF9zdG9yYWdlLmdldCgpKTsKLQotICAgIHJlc3VsdCA9IEF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhKAotICAgICAgICBkZXZpY2VfLAotICAgICAgICAmcGEsCi0gICAgICAgIDAsCi0gICAgICAgIDAsCi0gICAgICAgICZzaXplLAotICAgICAgICAmb3V0cHV0X2xpc3QpOwotICAgIE9TU1RBVFVTX0RDSEVDSyhyZXN1bHQgPT0gbm9FcnIsIHJlc3VsdCk7Ci0KLSAgICBpZiAocmVzdWx0ID09IG5vRXJyKSB7Ci0gICAgICAvLyBEZXRlcm1pbmUgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscy4KLSAgICAgIG91dHB1dF9jaGFubmVsc19wZXJfZnJhbWVfID0gb3V0cHV0X2xpc3QubUJ1ZmZlcnNbMF0ubU51bWJlckNoYW5uZWxzOwotICAgICAgaWYgKG91dHB1dF9jaGFubmVsc19wZXJfZnJhbWVfID09IDEgJiYgb3V0cHV0X2xpc3QubU51bWJlckJ1ZmZlcnMgPiAxKSB7Ci0gICAgICAgIC8vIE5vbi1pbnRlcmxlYXZlZC4KLSAgICAgICAgb3V0cHV0X2NoYW5uZWxzXyA9IG91dHB1dF9saXN0Lm1OdW1iZXJCdWZmZXJzOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gSW50ZXJsZWF2ZWQuCi0gICAgICAgIG91dHB1dF9jaGFubmVsc18gPSBvdXRwdXRfY2hhbm5lbHNfcGVyX2ZyYW1lXzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBEVkxPRygxKSA8PCAiT3V0cHV0IGNoYW5uZWxzOiAiIDw8IG91dHB1dF9jaGFubmVsc187Ci0gIERWTE9HKDEpIDw8ICJPdXRwdXQgY2hhbm5lbHMgcGVyIGZyYW1lOiAiIDw8IG91dHB1dF9jaGFubmVsc19wZXJfZnJhbWVfOwotCi0gIC8vIFRoZSBoYXJkd2FyZSBtdXN0IGhhdmUgYXQgbGVhc3QgdGhlIHJlcXVlc3RlZCBvdXRwdXQgY2hhbm5lbHMuCi0gIGlmIChyZXN1bHQgIT0gbm9FcnIgfHwKLSAgICAgIG91dHB1dF9jaGFubmVsc18gPCBzdGF0aWNfY2FzdDxpbnQ+KGZvcm1hdF8ubUNoYW5uZWxzUGVyRnJhbWUpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiQXVkaW9EZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCByZXF1ZXN0ZWQgb3V0cHV0IGNoYW5uZWxzLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gU2V0dXAgdGhlIEkvTyBwcm9jLgotICByZXN1bHQgPSBBdWRpb0RldmljZUNyZWF0ZUlPUHJvY0lEKGRldmljZV8sIFJlbmRlclByb2MsIHRoaXMsICZpb19wcm9jX2lkXyk7Ci0gIGlmIChyZXN1bHQgIT0gbm9FcnIpIHsKLSAgICBMT0coRVJST1IpIDw8ICJFcnJvciBjcmVhdGluZyBJT1Byb2MuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBBdWRpb0hhcmR3YXJlVW5pZmllZFN0cmVhbTo6Q2xvc2UoKSB7Ci0gIERDSEVDSyghaXNfcGxheWluZ18pOwotCi0gIE9TU3RhdHVzIHJlc3VsdCA9IEF1ZGlvRGV2aWNlRGVzdHJveUlPUHJvY0lEKGRldmljZV8sIGlvX3Byb2NfaWRfKTsKLSAgT1NTVEFUVVNfRENIRUNLKHJlc3VsdCA9PSBub0VyciwgcmVzdWx0KTsKLQotICBpb19wcm9jX2lkXyA9IDA7Ci0gIGRldmljZV8gPSBrQXVkaW9PYmplY3RVbmtub3duOwotCi0gIC8vIEluZm9ybSB0aGUgYXVkaW8gbWFuYWdlciB0aGF0IHdlIGhhdmUgYmVlbiBjbG9zZWQuIFRoaXMgY2FuIGNhdXNlIG91cgotICAvLyBkZXN0cnVjdGlvbi4KLSAgbWFuYWdlcl8tPlJlbGVhc2VPdXRwdXRTdHJlYW0odGhpcyk7Ci19Ci0KLXZvaWQgQXVkaW9IYXJkd2FyZVVuaWZpZWRTdHJlYW06OlN0YXJ0KEF1ZGlvU291cmNlQ2FsbGJhY2sqIGNhbGxiYWNrKSB7Ci0gIERDSEVDSyhjYWxsYmFjayk7Ci0gIERDSEVDS19ORShkZXZpY2VfLCBrQXVkaW9PYmplY3RVbmtub3duKTsKLSAgRENIRUNLKCFpc19wbGF5aW5nXyk7Ci0gIGlmIChkZXZpY2VfID09IGtBdWRpb09iamVjdFVua25vd24gfHwgaXNfcGxheWluZ18pCi0gICAgcmV0dXJuOwotCi0gIHNvdXJjZV8gPSBjYWxsYmFjazsKLQotICBPU1N0YXR1cyByZXN1bHQgPSBBdWRpb0RldmljZVN0YXJ0KGRldmljZV8sIGlvX3Byb2NfaWRfKTsKLSAgT1NTVEFUVVNfRENIRUNLKHJlc3VsdCA9PSBub0VyciwgcmVzdWx0KTsKLQotICBpZiAocmVzdWx0ID09IG5vRXJyKQotICAgIGlzX3BsYXlpbmdfID0gdHJ1ZTsKLX0KLQotdm9pZCBBdWRpb0hhcmR3YXJlVW5pZmllZFN0cmVhbTo6U3RvcCgpIHsKLSAgaWYgKCFpc19wbGF5aW5nXykKLSAgICByZXR1cm47Ci0KLSAgaWYgKGRldmljZV8gIT0ga0F1ZGlvT2JqZWN0VW5rbm93bikgewotICAgIE9TU3RhdHVzIHJlc3VsdCA9IEF1ZGlvRGV2aWNlU3RvcChkZXZpY2VfLCBpb19wcm9jX2lkXyk7Ci0gICAgT1NTVEFUVVNfRENIRUNLKHJlc3VsdCA9PSBub0VyciwgcmVzdWx0KTsKLSAgfQotCi0gIGlzX3BsYXlpbmdfID0gZmFsc2U7Ci0gIHNvdXJjZV8gPSBOVUxMOwotfQotCi12b2lkIEF1ZGlvSGFyZHdhcmVVbmlmaWVkU3RyZWFtOjpTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgewotICB2b2x1bWVfID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZvbHVtZSk7Ci0gIC8vIFRPRE8oY3JvZ2Vycyk6IHNldCB2b2x1bWUgcHJvcGVydHkKLX0KLQotdm9pZCBBdWRpb0hhcmR3YXJlVW5pZmllZFN0cmVhbTo6R2V0Vm9sdW1lKGRvdWJsZSogdm9sdW1lKSB7Ci0gICp2b2x1bWUgPSB2b2x1bWVfOwotfQotCi0vLyBQdWxscyBvbiBvdXIgcHJvdmlkZXIgd2l0aCBvcHRpb25hbCBpbnB1dCwgYXNraW5nIGl0IHRvIHJlbmRlciBvdXRwdXQuCi0vLyBOb3RlIHRvIGZ1dHVyZSBoYWNrZXJzIG9mIHRoaXMgZnVuY3Rpb246IERvIG5vdCBhZGQgbG9ja3MgaGVyZSBiZWNhdXNlIHRoaXMKLS8vIGlzIHJ1bm5pbmcgb24gYSByZWFsLXRpbWUgdGhyZWFkIChmb3IgbG93LWxhdGVuY3kpLgotT1NTdGF0dXMgQXVkaW9IYXJkd2FyZVVuaWZpZWRTdHJlYW06OlJlbmRlcigKLSAgICBBdWRpb0RldmljZUlEIGRldmljZSwKLSAgICBjb25zdCBBdWRpb1RpbWVTdGFtcCogbm93LAotICAgIGNvbnN0IEF1ZGlvQnVmZmVyTGlzdCogaW5wdXRfZGF0YSwKLSAgICBjb25zdCBBdWRpb1RpbWVTdGFtcCogaW5wdXRfdGltZSwKLSAgICBBdWRpb0J1ZmZlckxpc3QqIG91dHB1dF9kYXRhLAotICAgIGNvbnN0IEF1ZGlvVGltZVN0YW1wKiBvdXRwdXRfdGltZSkgewotICAvLyBDb252ZXJ0IHRoZSBpbnB1dCBkYXRhIGFjY291bnRpbmcgZm9yIHBvc3NpYmxlIGludGVybGVhdmluZy4KLSAgLy8gVE9ETyhjcm9nZXJzKTogaXQncyBiZXR0ZXIgdG8gc2ltcGx5IG1lbWNweSgpIGlmIHNvdXJjZSBpcyBhbHJlYWR5IHBsYW5hci4KLSAgaWYgKGlucHV0X2NoYW5uZWxzXyA+PSBjbGllbnRfaW5wdXRfY2hhbm5lbHNfKSB7Ci0gICAgZm9yIChpbnQgY2hhbm5lbF9pbmRleCA9IDA7IGNoYW5uZWxfaW5kZXggPCBjbGllbnRfaW5wdXRfY2hhbm5lbHNfOwotICAgICAgICAgKytjaGFubmVsX2luZGV4KSB7Ci0gICAgICBmbG9hdCogc291cmNlOwotCi0gICAgICBpbnQgc291cmNlX2NoYW5uZWxfaW5kZXggPSBjaGFubmVsX2luZGV4OwotCi0gICAgICBpZiAoaW5wdXRfY2hhbm5lbHNfcGVyX2ZyYW1lXyA+IDEpIHsKLSAgICAgICAgLy8gSW50ZXJsZWF2ZWQuCi0gICAgICAgIHNvdXJjZSA9IHN0YXRpY19jYXN0PGZsb2F0Kj4oaW5wdXRfZGF0YS0+bUJ1ZmZlcnNbMF0ubURhdGEpICsKLSAgICAgICAgICAgIHNvdXJjZV9jaGFubmVsX2luZGV4OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gTm9uLWludGVybGVhdmVkLgotICAgICAgICBzb3VyY2UgPSBzdGF0aWNfY2FzdDxmbG9hdCo+KAotICAgICAgICAgICAgaW5wdXRfZGF0YS0+bUJ1ZmZlcnNbc291cmNlX2NoYW5uZWxfaW5kZXhdLm1EYXRhKTsKLSAgICAgIH0KLQotICAgICAgZmxvYXQqIHAgPSBpbnB1dF9idXNfLT5jaGFubmVsKGNoYW5uZWxfaW5kZXgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJfb2ZfZnJhbWVzXzsgKytpKSB7Ci0gICAgICAgIHBbaV0gPSAqc291cmNlOwotICAgICAgICBzb3VyY2UgKz0gaW5wdXRfY2hhbm5lbHNfcGVyX2ZyYW1lXzsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSBpZiAoaW5wdXRfY2hhbm5lbHNfKSB7Ci0gICAgaW5wdXRfYnVzXy0+WmVybygpOwotICB9Ci0KLSAgLy8gR2l2ZSB0aGUgY2xpZW50IG9wdGlvbmFsIGlucHV0IGRhdGEgYW5kIGhhdmUgaXQgcmVuZGVyIHRoZSBvdXRwdXQgZGF0YS4KLSAgc291cmNlXy0+T25Nb3JlSU9EYXRhKGlucHV0X2J1c18uZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfYnVzXy5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyc1N0YXRlKDAsIDApKTsKLQotICAvLyBUT0RPKGNyb2dlcnMpOiBoYW5kbGUgZmluYWwgQ29yZSBBdWRpbyA1LjEgbGF5b3V0IGZvciA1LjEgYXVkaW8uCi0KLSAgLy8gSGFuZGxlIGludGVybGVhdmluZyBhcyBuZWNlc3NhcnkuCi0gIC8vIFRPRE8oY3JvZ2Vycyk6IGl0J3MgYmV0dGVyIHRvIHNpbXBseSBtZW1jcHkoKSBpZiBkZXN0IGlzIGFscmVhZHkgcGxhbmFyLgotCi0gIGZvciAoaW50IGNoYW5uZWxfaW5kZXggPSAwOwotICAgICAgIGNoYW5uZWxfaW5kZXggPCBzdGF0aWNfY2FzdDxpbnQ+KGZvcm1hdF8ubUNoYW5uZWxzUGVyRnJhbWUpOwotICAgICAgICsrY2hhbm5lbF9pbmRleCkgewotICAgIGZsb2F0KiBkZXN0OwotCi0gICAgaW50IGRlc3RfY2hhbm5lbF9pbmRleCA9IGNoYW5uZWxfaW5kZXg7Ci0KLSAgICBpZiAob3V0cHV0X2NoYW5uZWxzX3Blcl9mcmFtZV8gPiAxKSB7Ci0gICAgICAvLyBJbnRlcmxlYXZlZC4KLSAgICAgIGRlc3QgPSBzdGF0aWNfY2FzdDxmbG9hdCo+KG91dHB1dF9kYXRhLT5tQnVmZmVyc1swXS5tRGF0YSkgKwotICAgICAgICAgIGRlc3RfY2hhbm5lbF9pbmRleDsKLSAgICB9IGVsc2UgewotICAgICAgLy8gTm9uLWludGVybGVhdmVkLgotICAgICAgZGVzdCA9IHN0YXRpY19jYXN0PGZsb2F0Kj4oCi0gICAgICAgICAgb3V0cHV0X2RhdGEtPm1CdWZmZXJzW2Rlc3RfY2hhbm5lbF9pbmRleF0ubURhdGEpOwotICAgIH0KLQotICAgIGZsb2F0KiBwID0gb3V0cHV0X2J1c18tPmNoYW5uZWwoY2hhbm5lbF9pbmRleCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJfb2ZfZnJhbWVzXzsgKytpKSB7Ci0gICAgICAqZGVzdCA9IHBbaV07Ci0gICAgICBkZXN0ICs9IG91dHB1dF9jaGFubmVsc19wZXJfZnJhbWVfOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBub0VycjsKLX0KLQotT1NTdGF0dXMgQXVkaW9IYXJkd2FyZVVuaWZpZWRTdHJlYW06OlJlbmRlclByb2MoCi0gICAgQXVkaW9EZXZpY2VJRCBkZXZpY2UsCi0gICAgY29uc3QgQXVkaW9UaW1lU3RhbXAqIG5vdywKLSAgICBjb25zdCBBdWRpb0J1ZmZlckxpc3QqIGlucHV0X2RhdGEsCi0gICAgY29uc3QgQXVkaW9UaW1lU3RhbXAqIGlucHV0X3RpbWUsCi0gICAgQXVkaW9CdWZmZXJMaXN0KiBvdXRwdXRfZGF0YSwKLSAgICBjb25zdCBBdWRpb1RpbWVTdGFtcCogb3V0cHV0X3RpbWUsCi0gICAgdm9pZCogdXNlcl9kYXRhKSB7Ci0gIEF1ZGlvSGFyZHdhcmVVbmlmaWVkU3RyZWFtKiBhdWRpb19vdXRwdXQgPQotICAgICAgc3RhdGljX2Nhc3Q8QXVkaW9IYXJkd2FyZVVuaWZpZWRTdHJlYW0qPih1c2VyX2RhdGEpOwotICBEQ0hFQ0soYXVkaW9fb3V0cHV0KTsKLSAgaWYgKCFhdWRpb19vdXRwdXQpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiBhdWRpb19vdXRwdXQtPlJlbmRlcigKLSAgICAgIGRldmljZSwKLSAgICAgIG5vdywKLSAgICAgIGlucHV0X2RhdGEsCi0gICAgICBpbnB1dF90aW1lLAotICAgICAgb3V0cHV0X2RhdGEsCi0gICAgICBvdXRwdXRfdGltZSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL21hYy9hdWRpb191bmlmaWVkX21hYy5oIGIvc3JjL21lZGlhL2F1ZGlvL21hYy9hdWRpb191bmlmaWVkX21hYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjA5MGUzLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9tYWMvYXVkaW9fdW5pZmllZF9tYWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0FVRElPX01BQ19BVURJT19VTklGSUVEX01BQ19IXwotI2RlZmluZSBNRURJQV9BVURJT19NQUNfQVVESU9fVU5JRklFRF9NQUNfSF8KLQotI2luY2x1ZGUgPENvcmVBdWRpby9Db3JlQXVkaW8uaD4KLQotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19pby5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3BhcmFtZXRlcnMuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgQXVkaW9NYW5hZ2VyTWFjOwotCi0vLyBJbXBsZW1lbnRhdGlvbiBvZiBBdWRpb091dHB1dFN0cmVhbSBmb3IgTWFjIE9TIFggdXNpbmcgdGhlCi0vLyBDb3JlQXVkaW8gQXVkaW9IYXJkd2FyZSBBUEkgc3VpdGFibGUgZm9yIGxvdy1sYXRlbmN5IHVuaWZpZWQgYXVkaW8gSS9PCi0vLyB3aGVuIHVzaW5nIGRldmljZXMgd2hpY2ggc3VwcG9ydCAqYm90aCogaW5wdXQgYW5kIG91dHB1dAotLy8gaW4gdGhlIHNhbWUgZHJpdmVyLiAgVGhpcyBpcyB0aGUgY2FzZSB3aXRoIHByb2Zlc3Npb25hbAotLy8gVVNCIGFuZCBGaXJld2lyZSBkZXZpY2VzLgotLy8KLS8vIFBsZWFzZSBub3RlIHRoYXQgaXQncyByZXF1aXJlZCB0byBmaXJzdCBnZXQgdGhlIG5hdGl2ZSBzYW1wbGUtcmF0ZSBvZiB0aGUKLS8vIGRlZmF1bHQgb3V0cHV0IGRldmljZSBhbmQgdXNlIHRoYXQgc2FtcGxlLXJhdGUgd2hlbiBjcmVhdGluZyB0aGlzIG9iamVjdC4KLWNsYXNzIEF1ZGlvSGFyZHdhcmVVbmlmaWVkU3RyZWFtIDogcHVibGljIEF1ZGlvT3V0cHV0U3RyZWFtIHsKLSBwdWJsaWM6Ci0gIC8vIFRoZSBjdG9yIHRha2VzIGFsbCB0aGUgdXN1YWwgcGFyYW1ldGVycywgcGx1cyB8bWFuYWdlcnwgd2hpY2ggaXMgdGhlCi0gIC8vIHRoZSBhdWRpbyBtYW5hZ2VyIHdobyBpcyBjcmVhdGluZyB0aGlzIG9iamVjdC4KLSAgQXVkaW9IYXJkd2FyZVVuaWZpZWRTdHJlYW0oQXVkaW9NYW5hZ2VyTWFjKiBtYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcyk7Ci0gIC8vIFRoZSBkdG9yIGlzIHR5cGljYWxseSBjYWxsZWQgYnkgdGhlIEF1ZGlvTWFuYWdlciBvbmx5IGFuZCBpdCBpcyB1c3VhbGx5Ci0gIC8vIHRyaWdnZXJlZCBieSBjYWxsaW5nIEF1ZGlvT3V0cHV0U3RyZWFtOjpDbG9zZSgpLgotICB2aXJ0dWFsIH5BdWRpb0hhcmR3YXJlVW5pZmllZFN0cmVhbSgpOwotCi0gIC8vIEltcGxlbWVudGF0aW9uIG9mIEF1ZGlvT3V0cHV0U3RyZWFtLgotICB2aXJ0dWFsIGJvb2wgT3BlbigpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgQ2xvc2UoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0YXJ0KEF1ZGlvU291cmNlQ2FsbGJhY2sqIGNhbGxiYWNrKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0b3AoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFNldFZvbHVtZShkb3VibGUgdm9sdW1lKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIEdldFZvbHVtZShkb3VibGUqIHZvbHVtZSkgT1ZFUlJJREU7Ci0KLSAgaW50IGlucHV0X2NoYW5uZWxzKCkgY29uc3QgeyByZXR1cm4gaW5wdXRfY2hhbm5lbHNfOyB9Ci0gIGludCBvdXRwdXRfY2hhbm5lbHMoKSBjb25zdCB7IHJldHVybiBvdXRwdXRfY2hhbm5lbHNfOyB9Ci0KLSBwcml2YXRlOgotICBPU1N0YXR1cyBSZW5kZXIoQXVkaW9EZXZpY2VJRCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1RpbWVTdGFtcCogbm93LAotICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9CdWZmZXJMaXN0KiBpbnB1dF9kYXRhLAotICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9UaW1lU3RhbXAqIGlucHV0X3RpbWUsCi0gICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlckxpc3QqIG91dHB1dF9kYXRhLAotICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9UaW1lU3RhbXAqIG91dHB1dF90aW1lKTsKLQotICBzdGF0aWMgT1NTdGF0dXMgUmVuZGVyUHJvYyhBdWRpb0RldmljZUlEIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9UaW1lU3RhbXAqIG5vdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9CdWZmZXJMaXN0KiBpbnB1dF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1RpbWVTdGFtcCogaW5wdXRfdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJMaXN0KiBvdXRwdXRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9UaW1lU3RhbXAqIG91dHB1dF90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyX2RhdGEpOwotCi0gIC8vIE91ciBjcmVhdG9yLCB0aGUgYXVkaW8gbWFuYWdlciBuZWVkcyB0byBiZSBub3RpZmllZCB3aGVuIHdlIGNsb3NlLgotICBBdWRpb01hbmFnZXJNYWMqIG1hbmFnZXJfOwotCi0gIC8vIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0aGF0IHdpbGwgcHJvdmlkZSB0aGUgYXVkaW8gc2FtcGxlcy4KLSAgQXVkaW9Tb3VyY2VDYWxsYmFjayogc291cmNlXzsKLQotICAvLyBTdHJ1Y3R1cmUgdGhhdCBob2xkcyB0aGUgc3RyZWFtIGZvcm1hdCBkZXRhaWxzIHN1Y2ggYXMgYml0cmF0ZS4KLSAgQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uIGZvcm1hdF87Ci0KLSAgLy8gSGFyZHdhcmUgYnVmZmVyIHNpemUuCi0gIGludCBudW1iZXJfb2ZfZnJhbWVzXzsKLQotICAvLyBOdW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgcHJvdmlkZWQgdG8gdGhlIGNsaWVudCB2aWEgT25Nb3JlSU9EYXRhKCkuCi0gIGludCBjbGllbnRfaW5wdXRfY2hhbm5lbHNfOwotCi0gIC8vIFZvbHVtZSBsZXZlbCBmcm9tIDAgdG8gMS4KLSAgZmxvYXQgdm9sdW1lXzsKLQotICAvLyBOdW1iZXIgb2YgaW5wdXQgYW5kIG91dHB1dCBjaGFubmVscyBxdWVyaWVkIGZyb20gdGhlIGhhcmR3YXJlLgotICBpbnQgaW5wdXRfY2hhbm5lbHNfOwotICBpbnQgb3V0cHV0X2NoYW5uZWxzXzsKLSAgaW50IGlucHV0X2NoYW5uZWxzX3Blcl9mcmFtZV87Ci0gIGludCBvdXRwdXRfY2hhbm5lbHNfcGVyX2ZyYW1lXzsKLQotICBBdWRpb0RldmljZUlPUHJvY0lEIGlvX3Byb2NfaWRfOwotICBBdWRpb0RldmljZUlEIGRldmljZV87Ci0gIGJvb2wgaXNfcGxheWluZ187Ci0KLSAgLy8gSW50ZXJtZWRpYXRlIGJ1ZmZlcnMgdXNlZCB3aXRoIGNhbGwgdG8gT25Nb3JlSU9EYXRhKCkuCi0gIHNjb3BlZF9wdHI8QXVkaW9CdXM+IGlucHV0X2J1c187Ci0gIHNjb3BlZF9wdHI8QXVkaW9CdXM+IG91dHB1dF9idXNfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBdWRpb0hhcmR3YXJlVW5pZmllZFN0cmVhbSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9BVURJT19NQUNfQVVESU9fVU5JRklFRF9NQUNfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9tb2NrX2F1ZGlvX21hbmFnZXIuY2MgYi9zcmMvbWVkaWEvYXVkaW8vbW9ja19hdWRpb19tYW5hZ2VyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTQwYjY1Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9tb2NrX2F1ZGlvX21hbmFnZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vbW9ja19hdWRpb19tYW5hZ2VyLmgiCi0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcF9wcm94eS5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1Nb2NrQXVkaW9NYW5hZ2VyOjpNb2NrQXVkaW9NYW5hZ2VyKGJhc2U6Ok1lc3NhZ2VMb29wUHJveHkqIG1lc3NhZ2VfbG9vcF9wcm94eSkKLSAgICA6IG1lc3NhZ2VfbG9vcF9wcm94eV8obWVzc2FnZV9sb29wX3Byb3h5KSB7Ci19Ci0KLU1vY2tBdWRpb01hbmFnZXI6On5Nb2NrQXVkaW9NYW5hZ2VyKCkgewotfQotCi1ib29sIE1vY2tBdWRpb01hbmFnZXI6Okhhc0F1ZGlvT3V0cHV0RGV2aWNlcygpIHsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgTW9ja0F1ZGlvTWFuYWdlcjo6SGFzQXVkaW9JbnB1dERldmljZXMoKSB7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdHJpbmcxNiBNb2NrQXVkaW9NYW5hZ2VyOjpHZXRBdWRpb0lucHV0RGV2aWNlTW9kZWwoKSB7Ci0gIHJldHVybiBzdHJpbmcxNigpOwotfQotCi1ib29sIE1vY2tBdWRpb01hbmFnZXI6OkNhblNob3dBdWRpb0lucHV0U2V0dGluZ3MoKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBNb2NrQXVkaW9NYW5hZ2VyOjpTaG93QXVkaW9JbnB1dFNldHRpbmdzKCkgewotfQotCi12b2lkIE1vY2tBdWRpb01hbmFnZXI6OkdldEF1ZGlvSW5wdXREZXZpY2VOYW1lcygKLSAgICAgIG1lZGlhOjpBdWRpb0RldmljZU5hbWVzKiBkZXZpY2VfbmFtZXMpIHsKLX0KLQotbWVkaWE6OkF1ZGlvT3V0cHV0U3RyZWFtKiBNb2NrQXVkaW9NYW5hZ2VyOjpNYWtlQXVkaW9PdXRwdXRTdHJlYW0oCi0gICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcykgewotICBOT1RSRUFDSEVEKCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi1tZWRpYTo6QXVkaW9PdXRwdXRTdHJlYW0qIE1vY2tBdWRpb01hbmFnZXI6Ok1ha2VBdWRpb091dHB1dFN0cmVhbVByb3h5KAotICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcykgewotICBOT1RSRUFDSEVEKCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi1tZWRpYTo6QXVkaW9JbnB1dFN0cmVhbSogTW9ja0F1ZGlvTWFuYWdlcjo6TWFrZUF1ZGlvSW5wdXRTdHJlYW0oCi0gICAgY29uc3QgbWVkaWE6OkF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfaWQpIHsKLSAgTk9UUkVBQ0hFRCgpOwotICByZXR1cm4gTlVMTDsKLX0KLQotYm9vbCBNb2NrQXVkaW9NYW5hZ2VyOjpJc1JlY29yZGluZ0luUHJvY2VzcygpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+IE1vY2tBdWRpb01hbmFnZXI6OkdldE1lc3NhZ2VMb29wKCkgewotICByZXR1cm4gbWVzc2FnZV9sb29wX3Byb3h5XzsKLX0KLQotdm9pZCBNb2NrQXVkaW9NYW5hZ2VyOjpBZGRPdXRwdXREZXZpY2VDaGFuZ2VMaXN0ZW5lcigKLSAgICBBdWRpb0RldmljZUxpc3RlbmVyKiBsaXN0ZW5lcikgewotfQotCi12b2lkIE1vY2tBdWRpb01hbmFnZXI6OlJlbW92ZU91dHB1dERldmljZUNoYW5nZUxpc3RlbmVyKAotICAgIEF1ZGlvRGV2aWNlTGlzdGVuZXIqIGxpc3RlbmVyKSB7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYS4KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9tb2NrX2F1ZGlvX21hbmFnZXIuaCBiL3NyYy9tZWRpYS9hdWRpby9tb2NrX2F1ZGlvX21hbmFnZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE5NDA1NS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vbW9ja19hdWRpb19tYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0FVRElPX01PQ0tfQVVESU9fTUFOQUdFUl9IXwotI2RlZmluZSBNRURJQV9BVURJT19NT0NLX0FVRElPX01BTkFHRVJfSF8KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX21hbmFnZXIuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gVGhpcyBjbGFzcyBpcyBhIHNpbXBsZSBtb2NrIGFyb3VuZCBBdWRpb01hbmFnZXIsIHVzZWQgZXhjbHVzaXZlbHkgZm9yIHRlc3RzLAotLy8gd2hpY2ggaGFzIHRoZSBmb2xsb3dpbmcgcHVycG9zZXM6Ci0vLyAxKSBBdm9pZHMgdG8gdXNlIHRoZSBhY3R1YWwgKHN5c3RlbSBhbmQgcGxhdGZvcm0gZGVwZW5kZW50KSBBdWRpb01hbmFnZXIuCi0vLyAgICBTb21lIGJvdHMgZG9lcyBub3QgaGF2ZSBpbnB1dCBkZXZpY2VzLCB0aHVzIHVzaW5nIHRoZSBhY3R1YWwgQXVkaW9NYW5hZ2VyCi0vLyAgICB3b3VsZCBjYXVzaW5nIGZhaWx1cmVzIG9uIGNsYXNzZXMgd2hpY2ggZXhwZWN0IHRoYXQuCi0vLyAyKSBBbGxvd3MgdGhlIG1vY2sgYXVkaW8gZXZlbnRzIHRvIGJlIGRpc3BhdGNoZWQgb24gYW4gYXJiaXRyYXJ5IHRocmVhZCwKLS8vICAgIHJhdGhlciB0aGFuIGZvcmNpbmcgdGhlbSBvbiB0aGUgYXVkaW8gdGhyZWFkLCBlYXNpbmcgdGhlaXIgaGFuZGxpbmcgaW4KLS8vICAgIGJyb3dzZXIgdGVzdHMgKE5vdGU6IHNoYXJpbmcgYSB0aHJlYWQgY2FuIGNhdXNlIGRlYWRsb2NrcyBvbiBwcm9kdWN0aW9uCi0vLyAgICBjbGFzc2VzIGlmIFdhaXRhYmxlRXZlbnRzIG9yIGFueSBvdGhlciBmb3JtIG9mIGxvY2sgaXMgdXNlZCBmb3IKLS8vICAgIHN5bmNocm9uaXphdGlvbiBwdXJwb3NlcykuCi1jbGFzcyBNb2NrQXVkaW9NYW5hZ2VyIDogcHVibGljIG1lZGlhOjpBdWRpb01hbmFnZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgTW9ja0F1ZGlvTWFuYWdlcihiYXNlOjpNZXNzYWdlTG9vcFByb3h5KiBtZXNzYWdlX2xvb3BfcHJveHkpOwotCi0gIHZpcnR1YWwgYm9vbCBIYXNBdWRpb091dHB1dERldmljZXMoKSBPVkVSUklERTsKLQotICB2aXJ0dWFsIGJvb2wgSGFzQXVkaW9JbnB1dERldmljZXMoKSBPVkVSUklERTsKLQotICB2aXJ0dWFsIHN0cmluZzE2IEdldEF1ZGlvSW5wdXREZXZpY2VNb2RlbCgpIE9WRVJSSURFOwotCi0gIHZpcnR1YWwgYm9vbCBDYW5TaG93QXVkaW9JbnB1dFNldHRpbmdzKCkgT1ZFUlJJREU7Ci0KLSAgdmlydHVhbCB2b2lkIFNob3dBdWRpb0lucHV0U2V0dGluZ3MoKSBPVkVSUklERTsKLQotICB2aXJ0dWFsIHZvaWQgR2V0QXVkaW9JbnB1dERldmljZU5hbWVzKAotICAgICAgbWVkaWE6OkF1ZGlvRGV2aWNlTmFtZXMqIGRldmljZV9uYW1lcykgT1ZFUlJJREU7Ci0KLSAgdmlydHVhbCBtZWRpYTo6QXVkaW9PdXRwdXRTdHJlYW0qIE1ha2VBdWRpb091dHB1dFN0cmVhbSgKLSAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcykgT1ZFUlJJREU7Ci0KLSAgdmlydHVhbCBtZWRpYTo6QXVkaW9PdXRwdXRTdHJlYW0qIE1ha2VBdWRpb091dHB1dFN0cmVhbVByb3h5KAotICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKSBPVkVSUklERTsKLQotICB2aXJ0dWFsIG1lZGlhOjpBdWRpb0lucHV0U3RyZWFtKiBNYWtlQXVkaW9JbnB1dFN0cmVhbSgKLSAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfaWQpIE9WRVJSSURFOwotCi0gIHZpcnR1YWwgYm9vbCBJc1JlY29yZGluZ0luUHJvY2VzcygpIE9WRVJSSURFOwotCi0gIHZpcnR1YWwgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiBHZXRNZXNzYWdlTG9vcCgpIE9WRVJSSURFOwotCi0gIHZpcnR1YWwgdm9pZCBBZGRPdXRwdXREZXZpY2VDaGFuZ2VMaXN0ZW5lcigKLSAgICAgIEF1ZGlvRGV2aWNlTGlzdGVuZXIqIGxpc3RlbmVyKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFJlbW92ZU91dHB1dERldmljZUNoYW5nZUxpc3RlbmVyKAotICAgICAgQXVkaW9EZXZpY2VMaXN0ZW5lciogbGlzdGVuZXIpIE9WRVJSSURFOwotCi0gcHJpdmF0ZToKLSAgdmlydHVhbCB+TW9ja0F1ZGlvTWFuYWdlcigpOwotCi0gIHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4gbWVzc2FnZV9sb29wX3Byb3h5XzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTW9ja0F1ZGlvTWFuYWdlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEuCi0KLSNlbmRpZiAgLy8gTUVESUFfQVVESU9fTU9DS19BVURJT19NQU5BR0VSX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vbW9ja19zaGVsbF9hdWRpb19zdHJlYW1lci5oIGIvc3JjL21lZGlhL2F1ZGlvL21vY2tfc2hlbGxfYXVkaW9fc3RyZWFtZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZmMjMyNS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vbW9ja19zaGVsbF9hdWRpb19zdHJlYW1lci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9BVURJT19NT0NLX1NIRUxMX0FVRElPX1NUUkVBTUVSX0hfCi0jZGVmaW5lIE1FRElBX0FVRElPX01PQ0tfU0hFTExfQVVESU9fU1RSRUFNRVJfSF8KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3NoZWxsX2F1ZGlvX3N0cmVhbWVyLmgiCi0jaW5jbHVkZSAidGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIE1vY2tTaGVsbEF1ZGlvU3RyZWFtIDogcHVibGljIFNoZWxsQXVkaW9TdHJlYW0gewotIHB1YmxpYzoKLSAgTW9ja1NoZWxsQXVkaW9TdHJlYW0oKSB7fQotICBNT0NLX0NPTlNUX01FVEhPRDAoUGF1c2VSZXF1ZXN0ZWQsIGJvb2wgKCkpOwotICBNT0NLX01FVEhPRDIoUHVsbEZyYW1lcywgYm9vbCAodWludDMyX3QqLCB1aW50MzJfdCopKTsKLSAgTU9DS19NRVRIT0QxKENvbnN1bWVGcmFtZXMsIHZvaWQgKHVpbnQzMl90KSk7Ci0gIE1PQ0tfQ09OU1RfTUVUSE9EMChHZXRBdWRpb1BhcmFtZXRlcnMsIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgKCkpOwotICBNT0NLX01FVEhPRDAoR2V0QXVkaW9CdXMsIEF1ZGlvQnVzKiAoKSk7Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTW9ja1NoZWxsQXVkaW9TdHJlYW0pOwotfTsKLQotY2xhc3MgTW9ja1NoZWxsQXVkaW9TdHJlYW1lciA6IHB1YmxpYyBTaGVsbEF1ZGlvU3RyZWFtZXIgewotIHB1YmxpYzoKLSAgTW9ja1NoZWxsQXVkaW9TdHJlYW1lcigpIHt9Ci0gIE1PQ0tfQ09OU1RfTUVUSE9EMChHZXRDb25maWcsIENvbmZpZyAoKSk7Ci0gIE1PQ0tfTUVUSE9EMShBZGRTdHJlYW0sIGJvb2wgKFNoZWxsQXVkaW9TdHJlYW0qKSk7Ci0gIE1PQ0tfTUVUSE9EMShSZW1vdmVTdHJlYW0sIHZvaWQgKFNoZWxsQXVkaW9TdHJlYW0qKSk7Ci0gIE1PQ0tfQ09OU1RfTUVUSE9EMShIYXNTdHJlYW0sIGJvb2wgKFNoZWxsQXVkaW9TdHJlYW0qKSk7Ci0gIE1PQ0tfTUVUSE9EMihTZXRWb2x1bWUsIGJvb2wgKFNoZWxsQXVkaW9TdHJlYW0qLCBkb3VibGUpKTsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNb2NrU2hlbGxBdWRpb1N0cmVhbWVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0FVRElPX01PQ0tfU0hFTExfQVVESU9fU1RSRUFNRVJfSF8KLQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL251bGxfYXVkaW9fc2luay5jYyBiL3NyYy9tZWRpYS9hdWRpby9udWxsX2F1ZGlvX3NpbmsuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5M2NlYjEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL251bGxfYXVkaW9fc2luay5jYworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vbnVsbF9hdWRpb19zaW5rLmgiCi0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL3N0cmluZ3ByaW50Zi5oIgotI2luY2x1ZGUgImJhc2Uvc3lzX2J5dGVvcmRlci5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3BsYXRmb3JtX3RocmVhZC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1OdWxsQXVkaW9TaW5rOjpOdWxsQXVkaW9TaW5rKCkKLSAgICA6IGluaXRpYWxpemVkXyhmYWxzZSksCi0gICAgICBwbGF5aW5nXyhmYWxzZSksCi0gICAgICBjYWxsYmFja18oTlVMTCksCi0gICAgICB0aHJlYWRfKCJOdWxsQXVkaW9UaHJlYWQiKSwKLSAgICAgIGhhc2hfYXVkaW9fZm9yX3Rlc3RpbmdfKGZhbHNlKSB7Ci19Ci0KLXZvaWQgTnVsbEF1ZGlvU2luazo6SW5pdGlhbGl6ZShjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJDYWxsYmFjayogY2FsbGJhY2spIHsKLSAgRENIRUNLKCFpbml0aWFsaXplZF8pOwotICBwYXJhbXNfID0gcGFyYW1zOwotCi0gIGF1ZGlvX2J1c18gPSBBdWRpb0J1czo6Q3JlYXRlKHBhcmFtc18pOwotCi0gIGlmIChoYXNoX2F1ZGlvX2Zvcl90ZXN0aW5nXykgewotICAgIG1kNV9jaGFubmVsX2NvbnRleHRzXy5yZXNldChuZXcgYmFzZTo6TUQ1Q29udGV4dFtwYXJhbXNfLmNoYW5uZWxzKCldKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtc18uY2hhbm5lbHMoKTsgaSsrKQotICAgICAgYmFzZTo6TUQ1SW5pdCgmbWQ1X2NoYW5uZWxfY29udGV4dHNfW2ldKTsKLSAgfQotCi0gIGNhbGxiYWNrXyA9IGNhbGxiYWNrOwotICBpbml0aWFsaXplZF8gPSB0cnVlOwotfQotCi12b2lkIE51bGxBdWRpb1Npbms6OlN0YXJ0KCkgewotICBpZiAoIXRocmVhZF8uU3RhcnQoKSkKLSAgICByZXR1cm47Ci0KLSAgdGhyZWFkXy5tZXNzYWdlX2xvb3AoKS0+UG9zdFRhc2soRlJPTV9IRVJFLCBiYXNlOjpCaW5kKAotICAgICAgJk51bGxBdWRpb1Npbms6OkZpbGxCdWZmZXJUYXNrLCB0aGlzKSk7Ci19Ci0KLXZvaWQgTnVsbEF1ZGlvU2luazo6U3RvcCgpIHsKLSAgU2V0UGxheWluZyhmYWxzZSk7Ci0gIHRocmVhZF8uU3RvcCgpOwotfQotCi12b2lkIE51bGxBdWRpb1Npbms6OlBsYXkoKSB7Ci0gIFNldFBsYXlpbmcodHJ1ZSk7Ci19Ci0KLXZvaWQgTnVsbEF1ZGlvU2luazo6UGF1c2UoYm9vbCAvKiBmbHVzaCAqLykgewotICBTZXRQbGF5aW5nKGZhbHNlKTsKLX0KLQotYm9vbCBOdWxsQXVkaW9TaW5rOjpTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgewotICAvLyBBdWRpbyBpcyBhbHdheXMgbXV0ZWQuCi0gIHJldHVybiB2b2x1bWUgPT0gMC4wOwotfQotCi12b2lkIE51bGxBdWRpb1Npbms6OlNldFBsYXlpbmcoYm9vbCBpc19wbGF5aW5nKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gIHBsYXlpbmdfID0gaXNfcGxheWluZzsKLX0KLQotTnVsbEF1ZGlvU2luazo6fk51bGxBdWRpb1NpbmsoKSB7Ci0gIERDSEVDSyghdGhyZWFkXy5Jc1J1bm5pbmcoKSk7Ci19Ci0KLXZvaWQgTnVsbEF1ZGlvU2luazo6RmlsbEJ1ZmZlclRhc2soKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0KLSAgYmFzZTo6VGltZURlbHRhIGRlbGF5OwotICAvLyBPbmx5IGNvbnN1bWUgYnVmZmVycyB3aGVuIGFjdHVhbGx5IHBsYXlpbmcuCi0gIGlmIChwbGF5aW5nXykgIHsKLSAgICBpbnQgZnJhbWVzX3JlY2VpdmVkID0gY2FsbGJhY2tfLT5SZW5kZXIoYXVkaW9fYnVzXy5nZXQoKSwgMCk7Ci0gICAgaW50IGZyYW1lc19wZXJfbWlsbGlzZWNvbmQgPQotICAgICAgICBwYXJhbXNfLnNhbXBsZV9yYXRlKCkgLyBiYXNlOjpUaW1lOjprTWlsbGlzZWNvbmRzUGVyU2Vjb25kOwotCi0gICAgaWYgKGhhc2hfYXVkaW9fZm9yX3Rlc3RpbmdfICYmIGZyYW1lc19yZWNlaXZlZCA+IDApIHsKLSAgICAgIERDSEVDS19FUShzaXplb2YoZmxvYXQpLCBzaXplb2YodWludDMyKSk7Ci0gICAgICBpbnQgY2hhbm5lbHMgPSBhdWRpb19idXNfLT5jaGFubmVscygpOwotICAgICAgZm9yIChpbnQgY2hhbm5lbF9pZHggPSAwOyBjaGFubmVsX2lkeCA8IGNoYW5uZWxzOyArK2NoYW5uZWxfaWR4KSB7Ci0gICAgICAgIGZsb2F0KiBjaGFubmVsID0gYXVkaW9fYnVzXy0+Y2hhbm5lbChjaGFubmVsX2lkeCk7Ci0gICAgICAgIGZvciAoaW50IGZyYW1lX2lkeCA9IDA7IGZyYW1lX2lkeCA8IGZyYW1lc19yZWNlaXZlZDsgZnJhbWVfaWR4KyspIHsKLSAgICAgICAgICAvLyBDb252ZXJ0IGZsb2F0IHRvIHVpbnQzMiB3L28gY29udmVyc2lvbiBsb3NzLgotICAgICAgICAgIHVpbnQzMiBmcmFtZSA9IGJhc2U6OkJ5dGVTd2FwVG9MRTMyKAotICAgICAgICAgICAgICBiaXRfY2FzdDx1aW50MzI+KGNoYW5uZWxbZnJhbWVfaWR4XSkpOwotICAgICAgICAgIGJhc2U6Ok1ENVVwZGF0ZSgKLSAgICAgICAgICAgICAgJm1kNV9jaGFubmVsX2NvbnRleHRzX1tjaGFubmVsX2lkeF0sIGJhc2U6OlN0cmluZ1BpZWNlKAotICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmZyYW1lKSwgc2l6ZW9mKGZyYW1lKSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gQ2FsY3VsYXRlIG91ciBzbGVlcCBkdXJhdGlvbi4KLSAgICBkZWxheSA9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygKLSAgICAgICAgZnJhbWVzX3JlY2VpdmVkIC8gZnJhbWVzX3Blcl9taWxsaXNlY29uZCk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gSWYgcGF1c2VkLCBzbGVlcCBmb3IgMTAgbWlsbGlzZWNvbmRzIGJlZm9yZSBwb2xsaW5nIGFnYWluLgotICAgIGRlbGF5ID0gYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDEwKTsKLSAgfQotCi0gIC8vIFNsZWVwIGZvciBhdCBsZWFzdCBvbmUgbWlsbGlzZWNvbmQgc28gd2UgZG9uJ3Qgc3BpbiB0aGUgQ1BVLgotICBNZXNzYWdlTG9vcDo6Y3VycmVudCgpLT5Qb3N0RGVsYXllZFRhc2soCi0gICAgICBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kKCZOdWxsQXVkaW9TaW5rOjpGaWxsQnVmZmVyVGFzaywgdGhpcyksCi0gICAgICBzdGQ6Om1heChkZWxheSwgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDEpKSk7Ci19Ci0KLXZvaWQgTnVsbEF1ZGlvU2luazo6U3RhcnRBdWRpb0hhc2hGb3JUZXN0aW5nKCkgewotICBEQ0hFQ0soIWluaXRpYWxpemVkXyk7Ci0gIGhhc2hfYXVkaW9fZm9yX3Rlc3RpbmdfID0gdHJ1ZTsKLX0KLQotc3RkOjpzdHJpbmcgTnVsbEF1ZGlvU2luazo6R2V0QXVkaW9IYXNoRm9yVGVzdGluZygpIHsKLSAgRENIRUNLKGhhc2hfYXVkaW9fZm9yX3Rlc3RpbmdfKTsKLQotICAvLyBJZiBpbml0aWFsaXplIGZhaWxlZCBvciB3YXMgbmV2ZXIgY2FsbGVkLCBlbnN1cmUgd2UgcmV0dXJuIGFuIGVtcHR5IGhhc2guCi0gIGludCBjaGFubmVscyA9IDE7Ci0gIGlmICghaW5pdGlhbGl6ZWRfKSB7Ci0gICAgbWQ1X2NoYW5uZWxfY29udGV4dHNfLnJlc2V0KG5ldyBiYXNlOjpNRDVDb250ZXh0WzFdKTsKLSAgICBiYXNlOjpNRDVJbml0KCZtZDVfY2hhbm5lbF9jb250ZXh0c19bMF0pOwotICB9IGVsc2UgewotICAgIGNoYW5uZWxzID0gYXVkaW9fYnVzXy0+Y2hhbm5lbHMoKTsKLSAgfQotCi0gIC8vIEhhc2ggYWxsIGNoYW5uZWxzIGludG8gdGhlIGZpcnN0IGNoYW5uZWwuCi0gIGJhc2U6Ok1ENURpZ2VzdCBkaWdlc3Q7Ci0gIGZvciAoaW50IGkgPSAxOyBpIDwgY2hhbm5lbHM7IGkrKykgewotICAgIGJhc2U6Ok1ENUZpbmFsKCZkaWdlc3QsICZtZDVfY2hhbm5lbF9jb250ZXh0c19baV0pOwotICAgIGJhc2U6Ok1ENVVwZGF0ZSgmbWQ1X2NoYW5uZWxfY29udGV4dHNfWzBdLCBiYXNlOjpTdHJpbmdQaWVjZSgKLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmRpZ2VzdCksIHNpemVvZihiYXNlOjpNRDVEaWdlc3QpKSk7Ci0gIH0KLQotICBiYXNlOjpNRDVGaW5hbCgmZGlnZXN0LCAmbWQ1X2NoYW5uZWxfY29udGV4dHNfWzBdKTsKLSAgcmV0dXJuIGJhc2U6Ok1ENURpZ2VzdFRvQmFzZTE2KGRpZ2VzdCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL251bGxfYXVkaW9fc2luay5oIGIvc3JjL21lZGlhL2F1ZGlvL251bGxfYXVkaW9fc2luay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDczZjkzLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9udWxsX2F1ZGlvX3NpbmsuaAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfRklMVEVSU19OVUxMX0FVRElPX1JFTkRFUkVSX0hfCi0jZGVmaW5lIE1FRElBX0ZJTFRFUlNfTlVMTF9BVURJT19SRU5ERVJFUl9IXwotCi0vLyBOdWxsQXVkaW9TaW5rIGVmZmVjdGl2ZWx5IHVzZXMgYW4gZXh0cmEgdGhyZWFkIHRvICJ0aHJvdyBhd2F5IiB0aGUKLS8vIGF1ZGlvIGRhdGEgYXQgYSByYXRlIHJlc2VtYmxpbmcgbm9ybWFsIHBsYXliYWNrIHNwZWVkLiAgSXQncyBqdXN0IGxpa2UKLS8vIGRlY29kaW5nIHRvIC9kZXYvbnVsbCEKLS8vCi0vLyBOdWxsQXVkaW9TaW5rIGNhbiBhbHNvIGJlIHVzZWQgaW4gc2l0dWF0aW9ucyB3aGVyZSB0aGUgY2xpZW50IGhhcyBubwotLy8gYXVkaW8gZGV2aWNlIG9yIHdlIGhhdmVuJ3Qgd3JpdHRlbiBhbiBhdWRpbyBpbXBsZW1lbnRhdGlvbiBmb3IgYSBwYXJ0aWN1bGFyCi0vLyBwbGF0Zm9ybSB5ZXQuCi0KLSNpbmNsdWRlICJiYXNlL21kNS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX3JlbmRlcmVyX3NpbmsuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLWNsYXNzIEF1ZGlvQnVzOwotCi1jbGFzcyBNRURJQV9FWFBPUlQgTnVsbEF1ZGlvU2luawotICAgIDogTk9OX0VYUE9SVEVEX0JBU0UocHVibGljIEF1ZGlvUmVuZGVyZXJTaW5rKSB7Ci0gcHVibGljOgotICBOdWxsQXVkaW9TaW5rKCk7Ci0KLSAgLy8gQXVkaW9SZW5kZXJlclNpbmsgaW1wbGVtZW50YXRpb24uCi0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJDYWxsYmFjayogY2FsbGJhY2spIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU3RhcnQoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0b3AoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFBhdXNlKGJvb2wgZmx1c2gpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgUGxheSgpIE9WRVJSSURFOwotICB2aXJ0dWFsIGJvb2wgU2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgUmVzdW1lQWZ0ZXJVbmRlcmZsb3coYm9vbCBidWZmZXJfbW9yZV9hdWRpbykgT1ZFUlJJREUge30KLQotICAvLyBFbmFibGVzIGF1ZGlvIGZyYW1lIGhhc2hpbmcgYW5kIHJlaW5pdGlhbGl6ZXMgdGhlIE1ENSBjb250ZXh0LiAgTXVzdCBiZQotICAvLyBjYWxsZWQgcHJpb3IgdG8gSW5pdGlhbGl6ZSgpLgotICB2b2lkIFN0YXJ0QXVkaW9IYXNoRm9yVGVzdGluZygpOwotCi0gIC8vIFJldHVybnMgdGhlIE1ENSBoYXNoIG9mIGFsbCBhdWRpbyBmcmFtZXMgc2VlbiBzaW5jZSB0aGUgbGFzdCByZXNldC4KLSAgc3RkOjpzdHJpbmcgR2V0QXVkaW9IYXNoRm9yVGVzdGluZygpOwotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIH5OdWxsQXVkaW9TaW5rKCk7Ci0KLSBwcml2YXRlOgotICAvLyBBdWRpbyB0aHJlYWQgdGFzayB0aGF0IHBlcmlvZGljYWxseSBjYWxscyBGaWxsQnVmZmVyKCkgdG8gY29uc3VtZQotICAvLyBhdWRpbyBkYXRhLgotICB2b2lkIEZpbGxCdWZmZXJUYXNrKCk7Ci0KLSAgdm9pZCBTZXRQbGF5aW5nKGJvb2wgaXNfcGxheWluZyk7Ci0KLSAgLy8gQSBidWZmZXIgcGFzc2VkIHRvIEZpbGxCdWZmZXIgdG8gYWR2YW5jZSBwbGF5YmFjay4KLSAgc2NvcGVkX3B0cjxBdWRpb0J1cz4gYXVkaW9fYnVzXzsKLQotICBBdWRpb1BhcmFtZXRlcnMgcGFyYW1zXzsKLSAgYm9vbCBpbml0aWFsaXplZF87Ci0gIGJvb2wgcGxheWluZ187Ci0gIFJlbmRlckNhbGxiYWNrKiBjYWxsYmFja187Ci0KLSAgLy8gU2VwYXJhdGUgdGhyZWFkIHVzZWQgdG8gdGhyb3cgYXdheSBkYXRhLgotICBiYXNlOjpUaHJlYWQgdGhyZWFkXzsKLSAgYmFzZTo6TG9jayBsb2NrXzsKLQotICAvLyBDb250cm9scyB3aGV0aGVyIG9yIG5vdCBhIHJ1bm5pbmcgTUQ1IGhhc2ggaXMgY29tcHV0ZWQgZm9yIGF1ZGlvIGZyYW1lcy4KLSAgYm9vbCBoYXNoX2F1ZGlvX2Zvcl90ZXN0aW5nXzsKLSAgc2NvcGVkX2FycmF5PGJhc2U6Ok1ENUNvbnRleHQ+IG1kNV9jaGFubmVsX2NvbnRleHRzXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTnVsbEF1ZGlvU2luayk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9GSUxURVJTX05VTExfQVVESU9fUkVOREVSRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9udWxsX2F1ZGlvX3N0cmVhbWVyLmNjIGIvc3JjL21lZGlhL2F1ZGlvL251bGxfYXVkaW9fc3RyZWFtZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MzdiMTcuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL251bGxfYXVkaW9fc3RyZWFtZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL251bGxfYXVkaW9fc3RyZWFtZXIuaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3BhcmFtZXRlcnMuaCIKLSNpbmNsdWRlICJtZWRpYS9tcDQvYWFjLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLU51bGxBdWRpb1N0cmVhbWVyOjpOdWxsQXVkaW9TdHJlYW1lcigpCi0gICAgOiBudWxsX3N0cmVhbWVyX3RocmVhZF8oIk51bGwgQXVkaW8gU3RyZWFtZXIiKSB7Ci0gIG51bGxfc3RyZWFtZXJfdGhyZWFkXy5TdGFydCgpOwotICBudWxsX3N0cmVhbWVyX3RocmVhZF8ubWVzc2FnZV9sb29wKCktPlBvc3RUYXNrKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZOdWxsQXVkaW9TdHJlYW1lcjo6U3RhcnROdWxsU3RyZWFtZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotfQotCi1OdWxsQXVkaW9TdHJlYW1lcjo6fk51bGxBdWRpb1N0cmVhbWVyKCkgewotICBudWxsX3N0cmVhbWVyX3RocmVhZF8ubWVzc2FnZV9sb29wKCktPlBvc3RUYXNrKAotICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZCgmTnVsbEF1ZGlvU3RyZWFtZXI6OlN0b3BOdWxsU3RyZWFtZXIsIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLSAgbnVsbF9zdHJlYW1lcl90aHJlYWRfLlN0b3AoKTsKLX0KLQotU2hlbGxBdWRpb1N0cmVhbWVyOjpDb25maWcgTnVsbEF1ZGlvU3RyZWFtZXI6OkdldENvbmZpZygpIGNvbnN0IHsKLSAgLy8gUmVhc29uYWJsZSBsb29raW5nIHNldHRpbmdzLgotICBjb25zdCB1aW50MzIgaW5pdGlhbF9yZWJ1ZmZlcmluZ19mcmFtZXNfcGVyX2NoYW5uZWwgPQotICAgICAgbXA0OjpBQUM6OmtGcmFtZXNQZXJBY2Nlc3NVbml0ICogMzI7Ci0gIGNvbnN0IHVpbnQzMiBzaW5rX2J1ZmZlcl9zaXplX2luX2ZyYW1lc19wZXJfY2hhbm5lbCA9Ci0gICAgICBpbml0aWFsX3JlYnVmZmVyaW5nX2ZyYW1lc19wZXJfY2hhbm5lbCAqIDg7Ci0gIGNvbnN0IHVpbnQzMiBtYXhfaGFyZHdhcmVfY2hhbm5lbHMgPSAyOwotCi0gIHJldHVybiBDb25maWcoQ29uZmlnOjpJTlRFUkxFQVZFRCwgaW5pdGlhbF9yZWJ1ZmZlcmluZ19mcmFtZXNfcGVyX2NoYW5uZWwsCi0gICAgICAgICAgICAgICAgc2lua19idWZmZXJfc2l6ZV9pbl9mcmFtZXNfcGVyX2NoYW5uZWwsIG1heF9oYXJkd2FyZV9jaGFubmVscywKLSAgICAgICAgICAgICAgICBzaXplb2YoZmxvYXQpIC8qIGJ5dGVzX3Blcl9zYW1wbGUgKi8pOwotfQotCi1ib29sIE51bGxBdWRpb1N0cmVhbWVyOjpBZGRTdHJlYW0oU2hlbGxBdWRpb1N0cmVhbSogc3RyZWFtKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhzdHJlYW1zX2xvY2tfKTsKLSAgc3RyZWFtc18uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHN0cmVhbSwgTnVsbEF1ZGlvU3RyZWFtKCkpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgTnVsbEF1ZGlvU3RyZWFtZXI6OlJlbW92ZVN0cmVhbShTaGVsbEF1ZGlvU3RyZWFtKiBzdHJlYW0pIHsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKHN0cmVhbXNfbG9ja18pOwotICBETE9HKElORk8pIDw8ICJSZW1vdmUiOwotICBzdHJlYW1zXy5lcmFzZShzdHJlYW0pOwotfQotCi1ib29sIE51bGxBdWRpb1N0cmVhbWVyOjpIYXNTdHJlYW0oU2hlbGxBdWRpb1N0cmVhbSogc3RyZWFtKSBjb25zdCB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhzdHJlYW1zX2xvY2tfKTsKLSAgcmV0dXJuIHN0cmVhbXNfLmZpbmQoc3RyZWFtKSAhPSBzdHJlYW1zXy5lbmQoKTsKLX0KLQotdm9pZCBOdWxsQXVkaW9TdHJlYW1lcjo6U3RhcnROdWxsU3RyZWFtZXIoKSB7Ci0gIGxhc3RfcnVuX3RpbWVfID0gYmFzZTo6VGltZTo6Tm93KCk7Ci0gIGFkdmFuY2Vfc3RyZWFtc190aW1lcl8uZW1wbGFjZSgpOwotICBhZHZhbmNlX3N0cmVhbXNfdGltZXJfLT5TdGFydCgKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDEwKSwKLSAgICAgIGJhc2U6OkJpbmQoJk51bGxBdWRpb1N0cmVhbWVyOjpBZHZhbmNlU3RyZWFtcywgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotfQotCi12b2lkIE51bGxBdWRpb1N0cmVhbWVyOjpTdG9wTnVsbFN0cmVhbWVyKCkgewotICBhZHZhbmNlX3N0cmVhbXNfdGltZXJfLT5TdG9wKCk7Ci0gIGFkdmFuY2Vfc3RyZWFtc190aW1lcl8gPSBiYXNlOjpudWxsb3B0OwotfQotCi12b2lkIE51bGxBdWRpb1N0cmVhbWVyOjpBZHZhbmNlU3RyZWFtcygpIHsKLSAgYmFzZTo6VGltZSBub3cgPSBiYXNlOjpUaW1lOjpOb3coKTsKLSAgYmFzZTo6VGltZURlbHRhIHRpbWVfcGxheWVkID0gbm93IC0gbGFzdF9ydW5fdGltZV87Ci0gIGxhc3RfcnVuX3RpbWVfID0gbm93OwotCi0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhzdHJlYW1zX2xvY2tfKTsKLSAgZm9yIChOdWxsQXVkaW9TdHJlYW1NYXA6Oml0ZXJhdG9yIGl0ID0gc3RyZWFtc18uYmVnaW4oKTsgaXQgIT0gc3RyZWFtc18uZW5kKCk7Ci0gICAgICAgKytpdCkgewotICAgIFB1bGxGcmFtZXMoaXQtPmZpcnN0LCB0aW1lX3BsYXllZCwgJml0LT5zZWNvbmQpOwotICB9Ci19Ci0KLXZvaWQgTnVsbEF1ZGlvU3RyZWFtZXI6OlB1bGxGcmFtZXMoU2hlbGxBdWRpb1N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGEgdGltZV9wbGF5ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bGxBdWRpb1N0cmVhbSogbnVsbF9zdHJlYW0pIHsKLSAgLy8gQ2FsY3VsYXRlIGhvdyBtYW55IGZyYW1lcyB3ZXJlIGNvbnN1bWVkLgotICBpbnQgc2FtcGxlX3JhdGUgPSBzdHJlYW0tPkdldEF1ZGlvUGFyYW1ldGVycygpLnNhbXBsZV9yYXRlKCk7Ci0gIHVpbnQzMiBmcmFtZXNfcGxheWVkID0gc2FtcGxlX3JhdGUgKiB0aW1lX3BsYXllZC5JblNlY29uZHNGKCk7Ci0gIGZyYW1lc19wbGF5ZWQgPSBzdGQ6Om1pbihmcmFtZXNfcGxheWVkLCBudWxsX3N0cmVhbS0+dG90YWxfYXZhaWxhYmxlX2ZyYW1lcyk7Ci0gIGlmICghc3RyZWFtLT5QYXVzZVJlcXVlc3RlZCgpKSB7Ci0gICAgc3RyZWFtLT5Db25zdW1lRnJhbWVzKGZyYW1lc19wbGF5ZWQpOwotICB9Ci0gIC8vIFB1bGwgbW9yZSBmcmFtZXMuCi0gIHN0cmVhbS0+UHVsbEZyYW1lcyhOVUxMLCAmbnVsbF9zdHJlYW0tPnRvdGFsX2F2YWlsYWJsZV9mcmFtZXMpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9udWxsX2F1ZGlvX3N0cmVhbWVyLmggYi9zcmMvbWVkaWEvYXVkaW8vbnVsbF9hdWRpb19zdHJlYW1lci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzQyZjIzLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9udWxsX2F1ZGlvX3N0cmVhbWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX0FVRElPX05VTExfQVVESU9fU1RSRUFNRVJfSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fTlVMTF9BVURJT19TVFJFQU1FUl9IXwotCi0jaW5jbHVkZSA8bWFwPgotCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2luZ2xldG9uLmgiCi0jaW5jbHVkZSAiYmFzZS9vcHRpb25hbC5oIgotI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWQuaCIKLSNpbmNsdWRlICJiYXNlL3RpbWUuaCIKLSNpbmNsdWRlICJiYXNlL3RpbWVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vc2hlbGxfYXVkaW9fc3RyZWFtZXIuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgU2hlbGxBdWRpb1N0cmVhbWVyIHRvIGJlIHVzZWQgd2hlbiBvdXRwdXQgdG8gYW4KLS8vIGF1ZGlvIGRldmljZSBpcyBub3QgcG9zc2libGUgb3Igbm90IGRlc2lyZWQuIEl0IHN0YXJ0cyBhIHRocmVhZCB0aGF0IHdpbGwKLS8vIHJlZ3VsYXJseSBwdWxsIGFuZCBjb25zdW1lIGZyYW1lcyBmcm9tIGFueSBhZGRlZCBTaGVsbEF1ZGlvU3RyZWFtcyBhdCBhIHJhdGUKLS8vIGV4cGVjdGVkIGJ5IHRoZSBzdHJlYW0ncyBzYW1wbGluZyBmcmVxdWVuY3kuCi1jbGFzcyBOdWxsQXVkaW9TdHJlYW1lciA6IHB1YmxpYyBTaGVsbEF1ZGlvU3RyZWFtZXIgewotIHB1YmxpYzoKLSAgc3RhdGljIE51bGxBdWRpb1N0cmVhbWVyKiBHZXRJbnN0YW5jZSgpIHsKLSAgICByZXR1cm4gU2luZ2xldG9uPE51bGxBdWRpb1N0cmVhbWVyPjo6Z2V0KCk7Ci0gIH0KLQotICBDb25maWcgR2V0Q29uZmlnKCkgY29uc3QgT1ZFUlJJREU7Ci0gIGJvb2wgQWRkU3RyZWFtKFNoZWxsQXVkaW9TdHJlYW0qIHN0cmVhbSkgT1ZFUlJJREU7Ci0gIHZvaWQgUmVtb3ZlU3RyZWFtKFNoZWxsQXVkaW9TdHJlYW0qIHN0cmVhbSkgT1ZFUlJJREU7Ci0gIGJvb2wgSGFzU3RyZWFtKFNoZWxsQXVkaW9TdHJlYW0qIHN0cmVhbSkgY29uc3QgT1ZFUlJJREU7Ci0gIGJvb2wgU2V0Vm9sdW1lKFNoZWxsQXVkaW9TdHJlYW0qIC8qIHN0cmVhbSAqLywgZG91YmxlIC8qIHZvbHVtZSovKSBPVkVSUklERSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0cnVjdCBOdWxsQXVkaW9TdHJlYW0gewotICAgIE51bGxBdWRpb1N0cmVhbSgpIDogdG90YWxfYXZhaWxhYmxlX2ZyYW1lcygwKSB7fQotICAgIHVpbnQzMiB0b3RhbF9hdmFpbGFibGVfZnJhbWVzOwotICB9OwotCi0gIE51bGxBdWRpb1N0cmVhbWVyKCk7Ci0gIH5OdWxsQXVkaW9TdHJlYW1lcigpIE9WRVJSSURFOwotCi0gIHZvaWQgU3RhcnROdWxsU3RyZWFtZXIoKTsKLSAgdm9pZCBTdG9wTnVsbFN0cmVhbWVyKCk7Ci0gIHZvaWQgQWR2YW5jZVN0cmVhbXMoKTsKLSAgdm9pZCBQdWxsRnJhbWVzKFNoZWxsQXVkaW9TdHJlYW0qIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YSB0aW1lX3BsYXllZCwKLSAgICAgICAgICAgICAgICAgIE51bGxBdWRpb1N0cmVhbSogbnVsbF9hdWRpb19zdHJlYW0pOwotCi0gIGJhc2U6OlRocmVhZCBudWxsX3N0cmVhbWVyX3RocmVhZF87Ci0gIHR5cGVkZWYgYmFzZTo6UmVwZWF0aW5nVGltZXI8TnVsbEF1ZGlvU3RyZWFtZXI+IFJlcGVhdGluZ1RpbWVyOwotICBiYXNlOjpvcHRpb25hbDxSZXBlYXRpbmdUaW1lcj4gYWR2YW5jZV9zdHJlYW1zX3RpbWVyXzsKLSAgYmFzZTo6VGltZSBsYXN0X3J1bl90aW1lXzsKLQotICBtdXRhYmxlIGJhc2U6OkxvY2sgc3RyZWFtc19sb2NrXzsKLSAgdHlwZWRlZiBzdGQ6Om1hcDxTaGVsbEF1ZGlvU3RyZWFtKiwgTnVsbEF1ZGlvU3RyZWFtPiBOdWxsQXVkaW9TdHJlYW1NYXA7Ci0gIE51bGxBdWRpb1N0cmVhbU1hcCBzdHJlYW1zXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTnVsbEF1ZGlvU3RyZWFtZXIpOwotICBmcmllbmQgc3RydWN0IERlZmF1bHRTaW5nbGV0b25UcmFpdHM8TnVsbEF1ZGlvU3RyZWFtZXI+OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQVVESU9fTlVMTF9BVURJT19TVFJFQU1FUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL29wZW5ic2QvYXVkaW9fbWFuYWdlcl9vcGVuYnNkLmNjIGIvc3JjL21lZGlhL2F1ZGlvL29wZW5ic2QvYXVkaW9fbWFuYWdlcl9vcGVuYnNkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDMwNGE1Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9vcGVuYnNkL2F1ZGlvX21hbmFnZXJfb3BlbmJzZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby9vcGVuYnNkL2F1ZGlvX21hbmFnZXJfb3BlbmJzZC5oIgotCi0jaW5jbHVkZSAiYmFzZS9jb21tYW5kX2xpbmUuaCIKLSNpbmNsdWRlICJiYXNlL3N0bF91dGlsLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fb3V0cHV0X2Rpc3BhdGNoZXIuaCIKLSNpZiBkZWZpbmVkKFVTRV9QVUxTRUFVRElPKQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3B1bHNlL3B1bHNlX291dHB1dC5oIgotI2VuZGlmCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9saW1pdHMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX3N3aXRjaGVzLmgiCi0KLSNpbmNsdWRlIDxmY250bC5oPgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBNYXhpbXVtIG51bWJlciBvZiBvdXRwdXQgc3RyZWFtcyB0aGF0IGNhbiBiZSBvcGVuIHNpbXVsdGFuZW91c2x5Lgotc3RhdGljIGNvbnN0IGludCBrTWF4T3V0cHV0U3RyZWFtcyA9IDUwOwotCi0vLyBJbXBsZW1lbnRhdGlvbiBvZiBBdWRpb01hbmFnZXIuCi1zdGF0aWMgYm9vbCBIYXNBdWRpb0hhcmR3YXJlKCkgewotICBpbnQgZmQ7Ci0gIGNvbnN0IGNoYXIgKmZpbGU7Ci0KLSAgaWYgKChmaWxlID0gZ2V0ZW52KCJBVURJT0NUTERFVklDRSIpKSA9PSAwIHx8ICpmaWxlID09ICdcMCcpCi0gICAgZmlsZSA9ICIvZGV2L2F1ZGlvY3RsIjsKLQotICBpZiAoKGZkID0gb3BlbihmaWxlLCBPX1JET05MWSkpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgY2xvc2UoZmQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBBdWRpb01hbmFnZXJPcGVuQlNEOjpIYXNBdWRpb091dHB1dERldmljZXMoKSB7Ci0gIHJldHVybiBIYXNBdWRpb0hhcmR3YXJlKCk7Ci19Ci0KLWJvb2wgQXVkaW9NYW5hZ2VyT3BlbkJTRDo6SGFzQXVkaW9JbnB1dERldmljZXMoKSB7Ci0gIHJldHVybiBIYXNBdWRpb0hhcmR3YXJlKCk7Ci19Ci0KLUF1ZGlvTWFuYWdlck9wZW5CU0Q6OkF1ZGlvTWFuYWdlck9wZW5CU0QoKSB7Ci0gIFNldE1heE91dHB1dFN0cmVhbXNBbGxvd2VkKGtNYXhPdXRwdXRTdHJlYW1zKTsKLX0KLQotQXVkaW9NYW5hZ2VyT3BlbkJTRDo6fkF1ZGlvTWFuYWdlck9wZW5CU0QoKSB7Ci0gIFNodXRkb3duKCk7Ci19Ci0KLUF1ZGlvT3V0cHV0U3RyZWFtKiBBdWRpb01hbmFnZXJPcGVuQlNEOjpNYWtlTGluZWFyT3V0cHV0U3RyZWFtKAotICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKSB7Ci0gIERDSEVDS19FUShBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIsIHBhcmFtcy5mb3JtYXQpOwotICByZXR1cm4gTWFrZU91dHB1dFN0cmVhbShwYXJhbXMpOwotfQotCi1BdWRpb091dHB1dFN0cmVhbSogQXVkaW9NYW5hZ2VyT3BlbkJTRDo6TWFrZUxvd0xhdGVuY3lPdXRwdXRTdHJlYW0oCi0gICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpIHsKLSAgRENIRUNLX0VRKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xPV19MQVRFTkNZLCBwYXJhbXMuZm9ybWF0KTsKLSAgcmV0dXJuIE1ha2VPdXRwdXRTdHJlYW0ocGFyYW1zKTsKLX0KLQotQXVkaW9JbnB1dFN0cmVhbSogQXVkaW9NYW5hZ2VyT3BlbkJTRDo6TWFrZUxpbmVhcklucHV0U3RyZWFtKAotICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2lkKSB7Ci0gIERDSEVDS19FUShBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIsIHBhcmFtcy5mb3JtYXQpOwotICBOT1RJTVBMRU1FTlRFRCgpOwotICByZXR1cm4gTlVMTDsKLX0KLQotQXVkaW9JbnB1dFN0cmVhbSogQXVkaW9NYW5hZ2VyT3BlbkJTRDo6TWFrZUxvd0xhdGVuY3lJbnB1dFN0cmVhbSgKLSAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCkgewotICBEQ0hFQ0tfRVEoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTE9XX0xBVEVOQ1ksIHBhcmFtcy5mb3JtYXQpOwotICBOT1RJTVBMRU1FTlRFRCgpOwotICByZXR1cm4gTlVMTDsKLX0KLQotQXVkaW9PdXRwdXRTdHJlYW0qIEF1ZGlvTWFuYWdlck9wZW5CU0Q6Ok1ha2VPdXRwdXRTdHJlYW0oCi0gICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpIHsKLSNpZiBkZWZpbmVkKFVTRV9QVUxTRUFVRElPKQotICBpZiAoQ29tbWFuZExpbmU6OkZvckN1cnJlbnRQcm9jZXNzKCktPkhhc1N3aXRjaChzd2l0Y2hlczo6a1VzZVB1bHNlQXVkaW8pKSB7Ci0gICAgcmV0dXJuIG5ldyBQdWxzZUF1ZGlvT3V0cHV0U3RyZWFtKHBhcmFtcywgdGhpcyk7Ci0gIH0KLSNlbmRpZgotCi0gIE5PVElNUExFTUVOVEVEKCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vLyBzdGF0aWMKLUF1ZGlvTWFuYWdlciogQ3JlYXRlQXVkaW9NYW5hZ2VyKCkgewotICByZXR1cm4gbmV3IEF1ZGlvTWFuYWdlck9wZW5CU0QoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vb3BlbmJzZC9hdWRpb19tYW5hZ2VyX29wZW5ic2QuaCBiL3NyYy9tZWRpYS9hdWRpby9vcGVuYnNkL2F1ZGlvX21hbmFnZXJfb3BlbmJzZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWJhNDNlLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9vcGVuYnNkL2F1ZGlvX21hbmFnZXJfb3BlbmJzZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9BVURJT19PUEVOQlNEX0FVRElPX01BTkFHRVJfT1BFTkJTRF9IXwotI2RlZmluZSBNRURJQV9BVURJT19PUEVOQlNEX0FVRElPX01BTkFHRVJfT1BFTkJTRF9IXwotCi0jaW5jbHVkZSA8c2V0PgotCi0jaW5jbHVkZSAiYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX21hbmFnZXJfYmFzZS5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBNRURJQV9FWFBPUlQgQXVkaW9NYW5hZ2VyT3BlbkJTRCA6IHB1YmxpYyBBdWRpb01hbmFnZXJCYXNlIHsKLSBwdWJsaWM6Ci0gIEF1ZGlvTWFuYWdlck9wZW5CU0QoKTsKLQotICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBBdWRpb01hbmFnZXIuCi0gIHZpcnR1YWwgYm9vbCBIYXNBdWRpb091dHB1dERldmljZXMoKSBPVkVSUklERTsKLSAgdmlydHVhbCBib29sIEhhc0F1ZGlvSW5wdXREZXZpY2VzKCkgT1ZFUlJJREU7Ci0KLSAgLy8gSW1wbGVtZW50YXRpb24gb2YgQXVkaW9NYW5hZ2VyQmFzZS4KLSAgdmlydHVhbCBBdWRpb091dHB1dFN0cmVhbSogTWFrZUxpbmVhck91dHB1dFN0cmVhbSgKLSAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKSBPVkVSUklERTsKLSAgdmlydHVhbCBBdWRpb091dHB1dFN0cmVhbSogTWFrZUxvd0xhdGVuY3lPdXRwdXRTdHJlYW0oCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcykgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgQXVkaW9JbnB1dFN0cmVhbSogTWFrZUxpbmVhcklucHV0U3RyZWFtKAotICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfaWQpIE9WRVJSSURFOwotICB2aXJ0dWFsIEF1ZGlvSW5wdXRTdHJlYW0qIE1ha2VMb3dMYXRlbmN5SW5wdXRTdHJlYW0oCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCkgT1ZFUlJJREU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgfkF1ZGlvTWFuYWdlck9wZW5CU0QoKTsKLQotIHByaXZhdGU6Ci0gIC8vIENhbGxlZCBieSBNYWtlTGluZWFyT3V0cHV0U3RyZWFtIGFuZCBNYWtlTG93TGF0ZW5jeU91dHB1dFN0cmVhbS4KLSAgQXVkaW9PdXRwdXRTdHJlYW0qIE1ha2VPdXRwdXRTdHJlYW0oY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBdWRpb01hbmFnZXJPcGVuQlNEKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0FVRElPX09QRU5CU0RfQVVESU9fTUFOQUdFUl9PUEVOQlNEX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vcHVsc2UvcHVsc2Vfb3V0cHV0LmNjIGIvc3JjL21lZGlhL2F1ZGlvL3B1bHNlL3B1bHNlX291dHB1dC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY4N2U2ZS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vcHVsc2UvcHVsc2Vfb3V0cHV0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDUyICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby9wdWxzZS9wdWxzZV9vdXRwdXQuaCIKLQotI2luY2x1ZGUgPHB1bHNlL3B1bHNlYXVkaW8uaD4KLQotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fbWFuYWdlcl9iYXNlLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fcGFyYW1ldGVycy5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3V0aWwuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gQSBoZWxwZXIgY2xhc3MgdGhhdCBhY3F1aXJlcyBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrKCkgd2hpbGUgaW4gc2NvcGUuCi1jbGFzcyBBdXRvUHVsc2VMb2NrIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEF1dG9QdWxzZUxvY2socGFfdGhyZWFkZWRfbWFpbmxvb3AqIHBhX21haW5sb29wKQotICAgICAgOiBwYV9tYWlubG9vcF8ocGFfbWFpbmxvb3ApIHsKLSAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrKHBhX21haW5sb29wXyk7Ci0gIH0KLQotICB+QXV0b1B1bHNlTG9jaygpIHsKLSAgICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2socGFfbWFpbmxvb3BfKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgcGFfdGhyZWFkZWRfbWFpbmxvb3AqIHBhX21haW5sb29wXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQXV0b1B1bHNlTG9jayk7Ci19OwotCi1zdGF0aWMgcGFfc2FtcGxlX2Zvcm1hdF90IEJpdHNUb1BBU2FtcGxlRm9ybWF0KGludCBiaXRzX3Blcl9zYW1wbGUpIHsKLSAgc3dpdGNoIChiaXRzX3Blcl9zYW1wbGUpIHsKLSAgICBjYXNlIDg6Ci0gICAgICByZXR1cm4gUEFfU0FNUExFX1U4OwotICAgIGNhc2UgMTY6Ci0gICAgICByZXR1cm4gUEFfU0FNUExFX1MxNkxFOwotICAgIGNhc2UgMjQ6Ci0gICAgICByZXR1cm4gUEFfU0FNUExFX1MyNExFOwotICAgIGNhc2UgMzI6Ci0gICAgICByZXR1cm4gUEFfU0FNUExFX1MzMkxFOwotICAgIGRlZmF1bHQ6Ci0gICAgICBOT1RSRUFDSEVEKCkgPDwgIkludmFsaWQgYml0cyBwZXIgc2FtcGxlOiAiIDw8IGJpdHNfcGVyX3NhbXBsZTsKLSAgICAgIHJldHVybiBQQV9TQU1QTEVfSU5WQUxJRDsKLSAgfQotfQotCi1zdGF0aWMgcGFfY2hhbm5lbF9wb3NpdGlvbiBDaHJvbWl1bVRvUEFDaGFubmVsUG9zaXRpb24oQ2hhbm5lbHMgY2hhbm5lbCkgewotICBzd2l0Y2ggKGNoYW5uZWwpIHsKLSAgICAvLyBQdWxzZUF1ZGlvIGRvZXMgbm90IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBsZWZ0L3JpZ2h0IGFuZAotICAgIC8vIHN0ZXJlby1sZWZ0L3N0ZXJlby1yaWdodCwgYm90aCB0cmFuc2xhdGUgdG8gZnJvbnQtbGVmdC9mcm9udC1yaWdodC4KLSAgICBjYXNlIExFRlQ6Ci0gICAgICByZXR1cm4gUEFfQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZUOwotICAgIGNhc2UgUklHSFQ6Ci0gICAgICByZXR1cm4gUEFfQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVDsKLSAgICBjYXNlIENFTlRFUjoKLSAgICAgIHJldHVybiBQQV9DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUjsKLSAgICBjYXNlIExGRToKLSAgICAgIHJldHVybiBQQV9DSEFOTkVMX1BPU0lUSU9OX0xGRTsKLSAgICBjYXNlIEJBQ0tfTEVGVDoKLSAgICAgIHJldHVybiBQQV9DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVDsKLSAgICBjYXNlIEJBQ0tfUklHSFQ6Ci0gICAgICByZXR1cm4gUEFfQ0hBTk5FTF9QT1NJVElPTl9SRUFSX1JJR0hUOwotICAgIGNhc2UgTEVGVF9PRl9DRU5URVI6Ci0gICAgICByZXR1cm4gUEFfQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZUX09GX0NFTlRFUjsKLSAgICBjYXNlIFJJR0hUX09GX0NFTlRFUjoKLSAgICAgIHJldHVybiBQQV9DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hUX09GX0NFTlRFUjsKLSAgICBjYXNlIEJBQ0tfQ0VOVEVSOgotICAgICAgcmV0dXJuIFBBX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9DRU5URVI7Ci0gICAgY2FzZSBTSURFX0xFRlQ6Ci0gICAgICByZXR1cm4gUEFfQ0hBTk5FTF9QT1NJVElPTl9TSURFX0xFRlQ7Ci0gICAgY2FzZSBTSURFX1JJR0hUOgotICAgICAgcmV0dXJuIFBBX0NIQU5ORUxfUE9TSVRJT05fU0lERV9SSUdIVDsKLSAgICBjYXNlIENIQU5ORUxTX01BWDoKLSAgICAgIHJldHVybiBQQV9DSEFOTkVMX1BPU0lUSU9OX0lOVkFMSUQ7Ci0gICAgZGVmYXVsdDoKLSAgICAgIE5PVFJFQUNIRUQoKSA8PCAiSW52YWxpZCBjaGFubmVsOiAiIDw8IGNoYW5uZWw7Ci0gICAgICByZXR1cm4gUEFfQ0hBTk5FTF9QT1NJVElPTl9JTlZBTElEOwotICB9Ci19Ci0KLXN0YXRpYyBwYV9jaGFubmVsX21hcCBDaGFubmVsTGF5b3V0VG9QQUNoYW5uZWxNYXAoCi0gICAgQ2hhbm5lbExheW91dCBjaGFubmVsX2xheW91dCkgewotICBwYV9jaGFubmVsX21hcCBjaGFubmVsX21hcDsKLSAgcGFfY2hhbm5lbF9tYXBfaW5pdCgmY2hhbm5lbF9tYXApOwotCi0gIGNoYW5uZWxfbWFwLmNoYW5uZWxzID0gQ2hhbm5lbExheW91dFRvQ2hhbm5lbENvdW50KGNoYW5uZWxfbGF5b3V0KTsKLSAgZm9yIChDaGFubmVscyBjaCA9IExFRlQ7IGNoIDwgQ0hBTk5FTFNfTUFYOwotICAgICAgIGNoID0gc3RhdGljX2Nhc3Q8Q2hhbm5lbHM+KGNoICsgMSkpIHsKLSAgICBpbnQgY2hhbm5lbF9pbmRleCA9IENoYW5uZWxPcmRlcihjaGFubmVsX2xheW91dCwgY2gpOwotICAgIGlmIChjaGFubmVsX2luZGV4IDwgMCkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgY2hhbm5lbF9tYXAubWFwW2NoYW5uZWxfaW5kZXhdID0gQ2hyb21pdW1Ub1BBQ2hhbm5lbFBvc2l0aW9uKGNoKTsKLSAgfQotCi0gIHJldHVybiBjaGFubmVsX21hcDsKLX0KLQotLy8gc3RhdGljLCBwYV9jb250ZXh0X25vdGlmeV9jYgotdm9pZCBQdWxzZUF1ZGlvT3V0cHV0U3RyZWFtOjpDb250ZXh0Tm90aWZ5Q2FsbGJhY2socGFfY29udGV4dCogYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfdGhpcykgewotICBQdWxzZUF1ZGlvT3V0cHV0U3RyZWFtKiBzdHJlYW0gPSBzdGF0aWNfY2FzdDxQdWxzZUF1ZGlvT3V0cHV0U3RyZWFtKj4ocF90aGlzKTsKLQotICAvLyBGb3J3YXJkIHVuZXhwZWN0ZWQgZmFpbHVyZXMgdG8gdGhlIEF1ZGlvU291cmNlQ2FsbGJhY2sgaWYgYXZhaWxhYmxlLiAgQWxsCi0gIC8vIHRoZXNlIHZhcmlhYmxlcyBhcmUgb25seSBtb2RpZmllZCB1bmRlciBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrKCkgc28gdGhpcwotICAvLyBzaG91bGQgYmUgdGhyZWFkIHNhZmUuCi0gIGlmIChjICYmIHN0cmVhbS0+c291cmNlX2NhbGxiYWNrXyAmJgotICAgICAgcGFfY29udGV4dF9nZXRfc3RhdGUoYykgPT0gUEFfQ09OVEVYVF9GQUlMRUQpIHsKLSAgICBzdHJlYW0tPnNvdXJjZV9jYWxsYmFja18tPk9uRXJyb3Ioc3RyZWFtLCBwYV9jb250ZXh0X2Vycm5vKGMpKTsKLSAgfQotCi0gIHBhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbChzdHJlYW0tPnBhX21haW5sb29wXywgMCk7Ci19Ci0KLS8vIHN0YXRpYywgcGFfc3RyZWFtX25vdGlmeV9jYgotdm9pZCBQdWxzZUF1ZGlvT3V0cHV0U3RyZWFtOjpTdHJlYW1Ob3RpZnlDYWxsYmFjayhwYV9zdHJlYW0qIHMsIHZvaWQqIHBfdGhpcykgewotICBQdWxzZUF1ZGlvT3V0cHV0U3RyZWFtKiBzdHJlYW0gPSBzdGF0aWNfY2FzdDxQdWxzZUF1ZGlvT3V0cHV0U3RyZWFtKj4ocF90aGlzKTsKLQotICAvLyBGb3J3YXJkIHVuZXhwZWN0ZWQgZmFpbHVyZXMgdG8gdGhlIEF1ZGlvU291cmNlQ2FsbGJhY2sgaWYgYXZhaWxhYmxlLiAgQWxsCi0gIC8vIHRoZXNlIHZhcmlhYmxlcyBhcmUgb25seSBtb2RpZmllZCB1bmRlciBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrKCkgc28gdGhpcwotICAvLyBzaG91bGQgYmUgdGhyZWFkIHNhZmUuCi0gIGlmIChzICYmIHN0cmVhbS0+c291cmNlX2NhbGxiYWNrXyAmJgotICAgICAgcGFfc3RyZWFtX2dldF9zdGF0ZShzKSA9PSBQQV9TVFJFQU1fRkFJTEVEKSB7Ci0gICAgc3RyZWFtLT5zb3VyY2VfY2FsbGJhY2tfLT5PbkVycm9yKAotICAgICAgICBzdHJlYW0sIHBhX2NvbnRleHRfZXJybm8oc3RyZWFtLT5wYV9jb250ZXh0XykpOwotICB9Ci0KLSAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsKHN0cmVhbS0+cGFfbWFpbmxvb3BfLCAwKTsKLX0KLQotLy8gc3RhdGljLCBwYV9zdHJlYW1fc3VjY2Vzc19jYl90Ci12b2lkIFB1bHNlQXVkaW9PdXRwdXRTdHJlYW06OlN0cmVhbVN1Y2Nlc3NDYWxsYmFjayhwYV9zdHJlYW0qIHMsIGludCBzdWNjZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF90aGlzKSB7Ci0gIFB1bHNlQXVkaW9PdXRwdXRTdHJlYW0qIHN0cmVhbSA9IHN0YXRpY19jYXN0PFB1bHNlQXVkaW9PdXRwdXRTdHJlYW0qPihwX3RoaXMpOwotICBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwoc3RyZWFtLT5wYV9tYWlubG9vcF8sIDApOwotfQotCi0vLyBzdGF0aWMsIHBhX3N0cmVhbV9yZXF1ZXN0X2NiX3QKLXZvaWQgUHVsc2VBdWRpb091dHB1dFN0cmVhbTo6U3RyZWFtUmVxdWVzdENhbGxiYWNrKHBhX3N0cmVhbSogcywgc2l6ZV90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfdGhpcykgewotICAvLyBGdWxmaWxsIHdyaXRlIHJlcXVlc3Q7IG11c3QgYWx3YXlzIHJlc3VsdCBpbiBhIHBhX3N0cmVhbV93cml0ZSgpIGNhbGwuCi0gIHN0YXRpY19jYXN0PFB1bHNlQXVkaW9PdXRwdXRTdHJlYW0qPihwX3RoaXMpLT5GdWxmaWxsV3JpdGVSZXF1ZXN0KGxlbik7Ci19Ci0KLVB1bHNlQXVkaW9PdXRwdXRTdHJlYW06OlB1bHNlQXVkaW9PdXRwdXRTdHJlYW0oY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWFuYWdlckJhc2UqIG1hbmFnZXIpCi0gICAgOiBwYXJhbXNfKHBhcmFtcyksCi0gICAgICBtYW5hZ2VyXyhtYW5hZ2VyKSwKLSAgICAgIHBhX2NvbnRleHRfKE5VTEwpLAotICAgICAgcGFfbWFpbmxvb3BfKE5VTEwpLAotICAgICAgcGFfc3RyZWFtXyhOVUxMKSwKLSAgICAgIHZvbHVtZV8oMS4wZiksCi0gICAgICBzb3VyY2VfY2FsbGJhY2tfKE5VTEwpIHsKLSAgRENIRUNLKG1hbmFnZXJfLT5HZXRNZXNzYWdlTG9vcCgpLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotCi0gIENIRUNLKHBhcmFtc18uSXNWYWxpZCgpKTsKLSAgYXVkaW9fYnVzXyA9IEF1ZGlvQnVzOjpDcmVhdGUocGFyYW1zXyk7Ci19Ci0KLVB1bHNlQXVkaW9PdXRwdXRTdHJlYW06On5QdWxzZUF1ZGlvT3V0cHV0U3RyZWFtKCkgewotICAvLyBBbGwgaW50ZXJuYWwgc3RydWN0dXJlcyBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4gZnJlZWQgaW4gQ2xvc2UoKSwgd2hpY2gKLSAgLy8gY2FsbHMgQXVkaW9NYW5hZ2VyQmFzZTo6UmVsZWFzZU91dHB1dFN0cmVhbSgpIHdoaWNoIGRlbGV0ZXMgdGhpcyBvYmplY3QuCi0gIERDSEVDSyghcGFfc3RyZWFtXyk7Ci0gIERDSEVDSyghcGFfY29udGV4dF8pOwotICBEQ0hFQ0soIXBhX21haW5sb29wXyk7Ci19Ci0KLS8vIEhlbHBlciBtYWNybyBmb3IgT3BlbigpIHRvIGF2b2lkIGNvZGUgc3BhbSBhbmQgc3RyaW5nIGJsb2F0LgotI2RlZmluZSBSRVRVUk5fT05fRkFJTFVSRShleHByZXNzaW9uLCBtZXNzYWdlKSBkbyB7IFwKLSAgaWYgKCEoZXhwcmVzc2lvbikpIHsgXAotICAgIGlmIChwYV9jb250ZXh0XykgeyBcCi0gICAgICBETE9HKEVSUk9SKSA8PCBtZXNzYWdlIDw8ICIgIEVycm9yOiAiIFwKLSAgICAgICAgICAgICAgICAgIDw8IHBhX3N0cmVycm9yKHBhX2NvbnRleHRfZXJybm8ocGFfY29udGV4dF8pKTsgXAotICAgIH0gZWxzZSB7IFwKLSAgICAgIERMT0coRVJST1IpIDw8IG1lc3NhZ2U7IFwKLSAgICB9IFwKLSAgICByZXR1cm4gZmFsc2U7IFwKLSAgfSBcCi19IHdoaWxlKDApCi0KLWJvb2wgUHVsc2VBdWRpb091dHB1dFN0cmVhbTo6T3BlbigpIHsKLSAgRENIRUNLKG1hbmFnZXJfLT5HZXRNZXNzYWdlTG9vcCgpLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotCi0gIHBhX21haW5sb29wXyA9IHBhX3RocmVhZGVkX21haW5sb29wX25ldygpOwotICBSRVRVUk5fT05fRkFJTFVSRShwYV9tYWlubG9vcF8sICJGYWlsZWQgdG8gY3JlYXRlIFB1bHNlQXVkaW8gbWFpbiBsb29wLiIpOwotCi0gIHBhX21haW5sb29wX2FwaSogcGFfbWFpbmxvb3BfYXBpID0gcGFfdGhyZWFkZWRfbWFpbmxvb3BfZ2V0X2FwaShwYV9tYWlubG9vcF8pOwotICBwYV9jb250ZXh0XyA9IHBhX2NvbnRleHRfbmV3KHBhX21haW5sb29wX2FwaSwgIkNocm9taXVtIik7Ci0gIFJFVFVSTl9PTl9GQUlMVVJFKHBhX2NvbnRleHRfLCAiRmFpbGVkIHRvIGNyZWF0ZSBQdWxzZUF1ZGlvIGNvbnRleHQuIik7Ci0KLSAgLy8gQSBzdGF0ZSBjYWxsYmFjayBtdXN0IGJlIHNldCBiZWZvcmUgY2FsbGluZyBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrKCkgb3IKLSAgLy8gcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCgpIGNhbGxzIG1heSBsZWFkIHRvIGRlYWQgbG9jay4KLSAgcGFfY29udGV4dF9zZXRfc3RhdGVfY2FsbGJhY2socGFfY29udGV4dF8sICZDb250ZXh0Tm90aWZ5Q2FsbGJhY2ssIHRoaXMpOwotCi0gIC8vIExvY2sgdGhlIG1haW4gbG9vcCB3aGlsZSBzZXR0aW5nIHVwIHRoZSBjb250ZXh0LiAgRmFpbHVyZSB0byBkbyBzbyBtYXkgbGVhZAotICAvLyB0byBjcmFzaGVzIGFzIHRoZSBQdWxzZUF1ZGlvIHRocmVhZCB0cmllcyB0byBydW4gYmVmb3JlIHRoaW5ncyBhcmUgcmVhZHkuCi0gIEF1dG9QdWxzZUxvY2sgYXV0b19sb2NrKHBhX21haW5sb29wXyk7Ci0KLSAgUkVUVVJOX09OX0ZBSUxVUkUoCi0gICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9zdGFydChwYV9tYWlubG9vcF8pID09IDAsCi0gICAgICAiRmFpbGVkIHRvIHN0YXJ0IFB1bHNlQXVkaW8gbWFpbiBsb29wLiIpOwotICBSRVRVUk5fT05fRkFJTFVSRSgKLSAgICAgIHBhX2NvbnRleHRfY29ubmVjdChwYV9jb250ZXh0XywgTlVMTCwgUEFfQ09OVEVYVF9OT0FVVE9TUEFXTiwgTlVMTCkgPT0gMCwKLSAgICAgICJGYWlsZWQgdG8gY29ubmVjdCBQdWxzZUF1ZGlvIGNvbnRleHQuIik7Ci0KLSAgLy8gV2FpdCB1bnRpbCB8cGFfY29udGV4dF98IGlzIHJlYWR5LiAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCgpIG11c3QgYmUKLSAgLy8gY2FsbGVkIGFmdGVyIHBhX2NvbnRleHRfZ2V0X3N0YXRlKCkgaW4gY2FzZSB0aGUgY29udGV4dCBpcyBhbHJlYWR5IHJlYWR5LAotICAvLyBvdGhlcndpc2UgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCgpIHdpbGwgaGFuZyBpbmRlZmluaXRlbHkuCi0gIHdoaWxlICh0cnVlKSB7Ci0gICAgcGFfY29udGV4dF9zdGF0ZV90IGNvbnRleHRfc3RhdGUgPSBwYV9jb250ZXh0X2dldF9zdGF0ZShwYV9jb250ZXh0Xyk7Ci0gICAgUkVUVVJOX09OX0ZBSUxVUkUoCi0gICAgICAgIFBBX0NPTlRFWFRfSVNfR09PRChjb250ZXh0X3N0YXRlKSwgIkludmFsaWQgUHVsc2VBdWRpbyBjb250ZXh0IHN0YXRlLiIpOwotICAgIGlmIChjb250ZXh0X3N0YXRlID09IFBBX0NPTlRFWFRfUkVBRFkpCi0gICAgICBicmVhazsKLSAgICBwYV90aHJlYWRlZF9tYWlubG9vcF93YWl0KHBhX21haW5sb29wXyk7Ci0gIH0KLQotICAvLyBTZXQgc2FtcGxlIHNwZWNpZmljYXRpb25zLgotICBwYV9zYW1wbGVfc3BlYyBwYV9zYW1wbGVfc3BlY2lmaWNhdGlvbnM7Ci0gIHBhX3NhbXBsZV9zcGVjaWZpY2F0aW9ucy5mb3JtYXQgPSBCaXRzVG9QQVNhbXBsZUZvcm1hdCgKLSAgICAgIHBhcmFtc18uYml0c19wZXJfc2FtcGxlKCkpOwotICBwYV9zYW1wbGVfc3BlY2lmaWNhdGlvbnMucmF0ZSA9IHBhcmFtc18uc2FtcGxlX3JhdGUoKTsKLSAgcGFfc2FtcGxlX3NwZWNpZmljYXRpb25zLmNoYW5uZWxzID0gcGFyYW1zXy5jaGFubmVscygpOwotCi0gIC8vIEdldCBjaGFubmVsIG1hcHBpbmcgYW5kIG9wZW4gcGxheWJhY2sgc3RyZWFtLgotICBwYV9jaGFubmVsX21hcCogbWFwID0gTlVMTDsKLSAgcGFfY2hhbm5lbF9tYXAgc291cmNlX2NoYW5uZWxfbWFwID0gQ2hhbm5lbExheW91dFRvUEFDaGFubmVsTWFwKAotICAgICAgcGFyYW1zXy5jaGFubmVsX2xheW91dCgpKTsKLSAgaWYgKHNvdXJjZV9jaGFubmVsX21hcC5jaGFubmVscyAhPSAwKSB7Ci0gICAgLy8gVGhlIHNvdXJjZSBkYXRhIHVzZXMgYSBzdXBwb3J0ZWQgY2hhbm5lbCBtYXAgc28gd2Ugd2lsbCB1c2UgaXQgcmF0aGVyCi0gICAgLy8gdGhhbiB0aGUgZGVmYXVsdCBjaGFubmVsIG1hcCAoTlVMTCkuCi0gICAgbWFwID0gJnNvdXJjZV9jaGFubmVsX21hcDsKLSAgfQotICBwYV9zdHJlYW1fID0gcGFfc3RyZWFtX25ldygKLSAgICAgIHBhX2NvbnRleHRfLCAiUGxheWJhY2siLCAmcGFfc2FtcGxlX3NwZWNpZmljYXRpb25zLCBtYXApOwotICBSRVRVUk5fT05fRkFJTFVSRShwYV9zdHJlYW1fLCAiRmFpbGVkIHRvIGNyZWF0ZSBQdWxzZUF1ZGlvIHN0cmVhbS4iKTsKLSAgcGFfc3RyZWFtX3NldF9zdGF0ZV9jYWxsYmFjayhwYV9zdHJlYW1fLCAmU3RyZWFtTm90aWZ5Q2FsbGJhY2ssIHRoaXMpOwotCi0gIC8vIEV2ZW4gdGhvdWdoIHdlIHN0YXJ0IHRoZSBzdHJlYW0gY29ya2VkIGJlbG93LCBQdWxzZUF1ZGlvIHdpbGwgaXNzdWUgb25lCi0gIC8vIHN0cmVhbSByZXF1ZXN0IGFmdGVyIHNldHVwLiAgRnVsZmlsbFdyaXRlUmVxdWVzdCgpIG11c3QgZnVsZmlsbCB0aGUgd3JpdGUuCi0gIHBhX3N0cmVhbV9zZXRfd3JpdGVfY2FsbGJhY2socGFfc3RyZWFtXywgJlN0cmVhbVJlcXVlc3RDYWxsYmFjaywgdGhpcyk7Ci0KLSAgLy8gVGVsbCBwdWxzZSBhdWRpbyB3ZSBvbmx5IHdhbnQgY2FsbGJhY2tzIG9mIGEgY2VydGFpbiBzaXplLgotICBwYV9idWZmZXJfYXR0ciBwYV9idWZmZXJfYXR0cmlidXRlczsKLSAgcGFfYnVmZmVyX2F0dHJpYnV0ZXMubWF4bGVuZ3RoID0gcGFyYW1zXy5HZXRCeXRlc1BlckJ1ZmZlcigpOwotICBwYV9idWZmZXJfYXR0cmlidXRlcy5taW5yZXEgPSBwYXJhbXNfLkdldEJ5dGVzUGVyQnVmZmVyKCk7Ci0gIHBhX2J1ZmZlcl9hdHRyaWJ1dGVzLnByZWJ1ZiA9IHBhcmFtc18uR2V0Qnl0ZXNQZXJCdWZmZXIoKTsKLSAgcGFfYnVmZmVyX2F0dHJpYnV0ZXMudGxlbmd0aCA9IHBhcmFtc18uR2V0Qnl0ZXNQZXJCdWZmZXIoKTsKLSAgcGFfYnVmZmVyX2F0dHJpYnV0ZXMuZnJhZ3NpemUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oLTEpOwotCi0gIC8vIENvbm5lY3QgcGxheWJhY2sgc3RyZWFtLgotICAvLyBUT0RPKGRhbGVjdXJ0aXMpOiBQdWxzZSB0ZW5kcyB0byB3YW50IHJlYWxseSBsYXJnZSBidWZmZXIgc2l6ZXMgaWYgd2UgYXJlCi0gIC8vIG5vdCB1c2luZyB0aGUgbmF0aXZlIHNhbXBsZSByYXRlLiAgV2Ugc2hvdWxkIGFsd2F5cyBvcGVuIHRoZSBzdHJlYW0gd2l0aAotICAvLyBQQV9TVFJFQU1fRklYX1JBVEUgYW5kIGVuc3VyZSB0aGlzIGlzIHRydWUuCi0gIFJFVFVSTl9PTl9GQUlMVVJFKAotICAgICAgcGFfc3RyZWFtX2Nvbm5lY3RfcGxheWJhY2soCi0gICAgICAgICAgcGFfc3RyZWFtXywgTlVMTCwgJnBhX2J1ZmZlcl9hdHRyaWJ1dGVzLAotICAgICAgICAgIHN0YXRpY19jYXN0PHBhX3N0cmVhbV9mbGFnc190PigKLSAgICAgICAgICAgICAgUEFfU1RSRUFNX0FESlVTVF9MQVRFTkNZIHwgUEFfU1RSRUFNX0FVVE9fVElNSU5HX1VQREFURSB8Ci0gICAgICAgICAgICAgIFBBX1NUUkVBTV9OT1RfTU9OT1RPTklDIHwgUEFfU1RSRUFNX1NUQVJUX0NPUktFRCksCi0gICAgICAgICAgTlVMTCwgTlVMTCkgPT0gMCwKLSAgICAgICJGYWlsZWQgdG8gY29ubmVjdCBQdWxzZUF1ZGlvIHN0cmVhbS4iKTsKLQotICAvLyBXYWl0IGZvciB0aGUgc3RyZWFtIHRvIGJlIHJlYWR5LgotICB3aGlsZSAodHJ1ZSkgewotICAgIHBhX3N0cmVhbV9zdGF0ZV90IHN0cmVhbV9zdGF0ZSA9IHBhX3N0cmVhbV9nZXRfc3RhdGUocGFfc3RyZWFtXyk7Ci0gICAgUkVUVVJOX09OX0ZBSUxVUkUoCi0gICAgICAgIFBBX1NUUkVBTV9JU19HT09EKHN0cmVhbV9zdGF0ZSksICJJbnZhbGlkIFB1bHNlQXVkaW8gc3RyZWFtIHN0YXRlLiIpOwotICAgIGlmIChzdHJlYW1fc3RhdGUgPT0gUEFfU1RSRUFNX1JFQURZKQotICAgICAgYnJlYWs7Ci0gICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdChwYV9tYWlubG9vcF8pOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSN1bmRlZiBSRVRVUk5fT05fRkFJTFVSRQotCi12b2lkIFB1bHNlQXVkaW9PdXRwdXRTdHJlYW06OlJlc2V0KCkgewotICBpZiAoIXBhX21haW5sb29wXykgewotICAgIERDSEVDSyghcGFfc3RyZWFtXyk7Ci0gICAgRENIRUNLKCFwYV9jb250ZXh0Xyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgewotICAgIEF1dG9QdWxzZUxvY2sgYXV0b19sb2NrKHBhX21haW5sb29wXyk7Ci0KLSAgICAvLyBDbG9zZSB0aGUgc3RyZWFtLgotICAgIGlmIChwYV9zdHJlYW1fKSB7Ci0gICAgICAvLyBFbnN1cmUgYWxsIHNhbXBsZXMgYXJlIHBsYXllZCBvdXQgYmVmb3JlIHNodXRkb3duLgotICAgICAgV2FpdEZvclB1bHNlT3BlcmF0aW9uKHBhX3N0cmVhbV9mbHVzaCgKLSAgICAgICAgICBwYV9zdHJlYW1fLCAmU3RyZWFtU3VjY2Vzc0NhbGxiYWNrLCB0aGlzKSk7Ci0KLSAgICAgIC8vIFJlbGVhc2UgUHVsc2VBdWRpbyBzdHJ1Y3R1cmVzLgotICAgICAgcGFfc3RyZWFtX2Rpc2Nvbm5lY3QocGFfc3RyZWFtXyk7Ci0gICAgICBwYV9zdHJlYW1fc2V0X3dyaXRlX2NhbGxiYWNrKHBhX3N0cmVhbV8sIE5VTEwsIE5VTEwpOwotICAgICAgcGFfc3RyZWFtX3NldF9zdGF0ZV9jYWxsYmFjayhwYV9zdHJlYW1fLCBOVUxMLCBOVUxMKTsKLSAgICAgIHBhX3N0cmVhbV91bnJlZihwYV9zdHJlYW1fKTsKLSAgICAgIHBhX3N0cmVhbV8gPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChwYV9jb250ZXh0XykgewotICAgICAgcGFfY29udGV4dF9kaXNjb25uZWN0KHBhX2NvbnRleHRfKTsKLSAgICAgIHBhX2NvbnRleHRfc2V0X3N0YXRlX2NhbGxiYWNrKHBhX2NvbnRleHRfLCBOVUxMLCBOVUxMKTsKLSAgICAgIHBhX2NvbnRleHRfdW5yZWYocGFfY29udGV4dF8pOwotICAgICAgcGFfY29udGV4dF8gPSBOVUxMOwotICAgIH0KLSAgfQotCi0gIHBhX3RocmVhZGVkX21haW5sb29wX3N0b3AocGFfbWFpbmxvb3BfKTsKLSAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfZnJlZShwYV9tYWlubG9vcF8pOwotICBwYV9tYWlubG9vcF8gPSBOVUxMOwotfQotCi12b2lkIFB1bHNlQXVkaW9PdXRwdXRTdHJlYW06OkNsb3NlKCkgewotICBEQ0hFQ0sobWFuYWdlcl8tPkdldE1lc3NhZ2VMb29wKCktPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0KLSAgUmVzZXQoKTsKLQotICAvLyBTaWduYWwgdG8gdGhlIG1hbmFnZXIgdGhhdCB3ZSdyZSBjbG9zZWQgYW5kIGNhbiBiZSByZW1vdmVkLgotICAvLyBUaGlzIHNob3VsZCBiZSB0aGUgbGFzdCBjYWxsIGluIHRoZSBmdW5jdGlvbiBhcyBpdCBkZWxldGVzICJ0aGlzIi4KLSAgbWFuYWdlcl8tPlJlbGVhc2VPdXRwdXRTdHJlYW0odGhpcyk7Ci19Ci0KLWludCBQdWxzZUF1ZGlvT3V0cHV0U3RyZWFtOjpHZXRIYXJkd2FyZUxhdGVuY3lJbkJ5dGVzKCkgewotICBpbnQgbmVnYXRpdmUgPSAwOwotICBwYV91c2VjX3QgcGFfbGF0ZW5jeV9taWNyb3MgPSAwOwotICBpZiAocGFfc3RyZWFtX2dldF9sYXRlbmN5KHBhX3N0cmVhbV8sICZwYV9sYXRlbmN5X21pY3JvcywgJm5lZ2F0aXZlKSAhPSAwKQotICAgIHJldHVybiAwOwotCi0gIGlmIChuZWdhdGl2ZSkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gKHBhX2xhdGVuY3lfbWljcm9zICogcGFyYW1zXy5zYW1wbGVfcmF0ZSgpICoKLSAgICAgICAgICBwYXJhbXNfLkdldEJ5dGVzUGVyRnJhbWUoKSkgLyBiYXNlOjpUaW1lOjprTWljcm9zZWNvbmRzUGVyU2Vjb25kOwotfQotCi12b2lkIFB1bHNlQXVkaW9PdXRwdXRTdHJlYW06OkZ1bGZpbGxXcml0ZVJlcXVlc3Qoc2l6ZV90IHJlcXVlc3RlZF9ieXRlcykgewotICBDSEVDS19FUShyZXF1ZXN0ZWRfYnl0ZXMsIHN0YXRpY19jYXN0PHNpemVfdD4ocGFyYW1zXy5HZXRCeXRlc1BlckJ1ZmZlcigpKSk7Ci0KLSAgaW50IGZyYW1lc19maWxsZWQgPSAwOwotICBpZiAoc291cmNlX2NhbGxiYWNrXykgewotICAgIGZyYW1lc19maWxsZWQgPSBzb3VyY2VfY2FsbGJhY2tfLT5Pbk1vcmVEYXRhKAotICAgICAgICBhdWRpb19idXNfLmdldCgpLCBBdWRpb0J1ZmZlcnNTdGF0ZSgwLCBHZXRIYXJkd2FyZUxhdGVuY3lJbkJ5dGVzKCkpKTsKLSAgfQotCi0gIC8vIFplcm8gYW55IHVuZmlsbGVkIGRhdGEgc28gaXQgcGxheXMgYmFjayBhcyBzaWxlbmNlLgotICBpZiAoZnJhbWVzX2ZpbGxlZCA8IGF1ZGlvX2J1c18tPmZyYW1lcygpKSB7Ci0gICAgYXVkaW9fYnVzXy0+WmVyb0ZyYW1lc1BhcnRpYWwoCi0gICAgICAgIGZyYW1lc19maWxsZWQsIGF1ZGlvX2J1c18tPmZyYW1lcygpIC0gZnJhbWVzX2ZpbGxlZCk7Ci0gIH0KLQotICAvLyBQdWxzZUF1ZGlvIHdvbid0IGFsd2F5cyBiZSBhYmxlIHRvIHByb3ZpZGUgYSBidWZmZXIgbGFyZ2UgZW5vdWdoLCBzbyB3ZSBtYXkKLSAgLy8gbmVlZCB0byByZXF1ZXN0IG11bHRpcGxlIGJ1ZmZlcnMgYW5kIGZpbGwgdGhlbSBpbmRpdmlkdWFsbHkuCi0gIGludCBjdXJyZW50X2ZyYW1lID0gMDsKLSAgc2l6ZV90IGJ5dGVzX3JlbWFpbmluZyA9IHJlcXVlc3RlZF9ieXRlczsKLSAgd2hpbGUgKGJ5dGVzX3JlbWFpbmluZyA+IDApIHsKLSAgICB2b2lkKiBidWZmZXIgPSBOVUxMOwotICAgIHNpemVfdCBieXRlc190b19maWxsID0gYnl0ZXNfcmVtYWluaW5nOwotICAgIENIRUNLX0dFKHBhX3N0cmVhbV9iZWdpbl93cml0ZShwYV9zdHJlYW1fLCAmYnVmZmVyLCAmYnl0ZXNfdG9fZmlsbCksIDApOwotCi0gICAgLy8gSW4gY2FzZSBQdWxzZUF1ZGlvIGdpdmVzIHVzIGEgYmlnZ2VyIGJ1ZmZlciB0aGFuIHdlIHdhbnQsIGNhcCBvdXIgc2l6ZS4KLSAgICBieXRlc190b19maWxsID0gc3RkOjptaW4oCi0gICAgICAgIHN0ZDo6bWluKGJ5dGVzX3JlbWFpbmluZywgYnl0ZXNfdG9fZmlsbCksCi0gICAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4ocGFyYW1zXy5HZXRCeXRlc1BlckJ1ZmZlcigpKSk7Ci0KLSAgICBpbnQgZnJhbWVzX3RvX2ZpbGwgPSBieXRlc190b19maWxsIC8gcGFyYW1zXy5HZXRCeXRlc1BlckZyYW1lKCk7OwotCi0gICAgLy8gTm90ZTogSWYgdGhpcyBldmVyIGNoYW5nZXMgdG8gb3V0cHV0IHJhdyBmbG9hdCB0aGUgZGF0YSBtdXN0IGJlIGNsaXBwZWQKLSAgICAvLyBhbmQgc2FuaXRpemVkIHNpbmNlIGl0IG1heSBjb21lIGZyb20gYW4gdW50cnVzdGVkIHNvdXJjZSBzdWNoIGFzIE5hQ2wuCi0gICAgYXVkaW9fYnVzXy0+VG9JbnRlcmxlYXZlZFBhcnRpYWwoCi0gICAgICAgIGN1cnJlbnRfZnJhbWUsIGZyYW1lc190b19maWxsLCBwYXJhbXNfLmJpdHNfcGVyX3NhbXBsZSgpIC8gOCwgYnVmZmVyKTsKLSAgICBtZWRpYTo6QWRqdXN0Vm9sdW1lKGJ1ZmZlciwgYnl0ZXNfdG9fZmlsbCwgcGFyYW1zXy5jaGFubmVscygpLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zXy5iaXRzX3Blcl9zYW1wbGUoKSAvIDgsIHZvbHVtZV8pOwotCi0gICAgaWYgKHBhX3N0cmVhbV93cml0ZShwYV9zdHJlYW1fLCBidWZmZXIsIGJ5dGVzX3RvX2ZpbGwsIE5VTEwsIDBMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBBX1NFRUtfUkVMQVRJVkUpIDwgMCkgewotICAgICAgaWYgKHNvdXJjZV9jYWxsYmFja18pIHsKLSAgICAgICAgc291cmNlX2NhbGxiYWNrXy0+T25FcnJvcih0aGlzLCBwYV9jb250ZXh0X2Vycm5vKHBhX2NvbnRleHRfKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgYnl0ZXNfcmVtYWluaW5nIC09IGJ5dGVzX3RvX2ZpbGw7Ci0gICAgY3VycmVudF9mcmFtZSA9IGZyYW1lc190b19maWxsOwotICB9Ci19Ci0KLXZvaWQgUHVsc2VBdWRpb091dHB1dFN0cmVhbTo6U3RhcnQoQXVkaW9Tb3VyY2VDYWxsYmFjayogY2FsbGJhY2spIHsKLSAgRENIRUNLKG1hbmFnZXJfLT5HZXRNZXNzYWdlTG9vcCgpLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBDSEVDSyhjYWxsYmFjayk7Ci0gIENIRUNLKHBhX3N0cmVhbV8pOwotCi0gIEF1dG9QdWxzZUxvY2sgYXV0b19sb2NrKHBhX21haW5sb29wXyk7Ci0KLSAgLy8gRW5zdXJlIHRoZSBjb250ZXh0IGFuZCBzdHJlYW0gYXJlIHJlYWR5LgotICBpZiAocGFfY29udGV4dF9nZXRfc3RhdGUocGFfY29udGV4dF8pICE9IFBBX0NPTlRFWFRfUkVBRFkgJiYKLSAgICAgIHBhX3N0cmVhbV9nZXRfc3RhdGUocGFfc3RyZWFtXykgIT0gUEFfU1RSRUFNX1JFQURZKSB7Ci0gICAgY2FsbGJhY2stPk9uRXJyb3IodGhpcywgcGFfY29udGV4dF9lcnJubyhwYV9jb250ZXh0XykpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHNvdXJjZV9jYWxsYmFja18gPSBjYWxsYmFjazsKLQotICAvLyBVbmNvcmsgKHJlc3VtZSkgdGhlIHN0cmVhbS4KLSAgV2FpdEZvclB1bHNlT3BlcmF0aW9uKHBhX3N0cmVhbV9jb3JrKAotICAgICAgcGFfc3RyZWFtXywgMCwgJlN0cmVhbVN1Y2Nlc3NDYWxsYmFjaywgdGhpcykpOwotfQotCi12b2lkIFB1bHNlQXVkaW9PdXRwdXRTdHJlYW06OlN0b3AoKSB7Ci0gIERDSEVDSyhtYW5hZ2VyXy0+R2V0TWVzc2FnZUxvb3AoKS0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLQotICAvLyBDb3JrIChwYXVzZSkgdGhlIHN0cmVhbS4gIFdhaXRpbmcgZm9yIHRoZSBtYWluIGxvb3AgbG9jayB3aWxsIGVuc3VyZQotICAvLyBvdXRzdGFuZGluZyBjYWxsYmFja3MgaGF2ZSBjb21wbGV0ZWQuCi0gIEF1dG9QdWxzZUxvY2sgYXV0b19sb2NrKHBhX21haW5sb29wXyk7Ci0KLSAgLy8gRmx1c2ggdGhlIHN0cmVhbSBwcmlvciB0byBjb3JrLCBkb2luZyBzbyBhZnRlciB3aWxsIGNhdXNlIGhhbmdzLiAgV3JpdGUKLSAgLy8gY2FsbGJhY2tzIGFyZSBzdXNwZW5kZWQgd2hpbGUgaW5zaWRlIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2soKSBzbyB0aGlzCi0gIC8vIGlzIGFsbCB0aHJlYWQgc2FmZS4KLSAgV2FpdEZvclB1bHNlT3BlcmF0aW9uKHBhX3N0cmVhbV9mbHVzaCgKLSAgICAgIHBhX3N0cmVhbV8sICZTdHJlYW1TdWNjZXNzQ2FsbGJhY2ssIHRoaXMpKTsKLQotICBXYWl0Rm9yUHVsc2VPcGVyYXRpb24ocGFfc3RyZWFtX2NvcmsoCi0gICAgICBwYV9zdHJlYW1fLCAxLCAmU3RyZWFtU3VjY2Vzc0NhbGxiYWNrLCB0aGlzKSk7Ci0KLSAgc291cmNlX2NhbGxiYWNrXyA9IE5VTEw7Ci19Ci0KLXZvaWQgUHVsc2VBdWRpb091dHB1dFN0cmVhbTo6U2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpIHsKLSAgRENIRUNLKG1hbmFnZXJfLT5HZXRNZXNzYWdlTG9vcCgpLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotCi0gIHZvbHVtZV8gPSBzdGF0aWNfY2FzdDxmbG9hdD4odm9sdW1lKTsKLX0KLQotdm9pZCBQdWxzZUF1ZGlvT3V0cHV0U3RyZWFtOjpHZXRWb2x1bWUoZG91YmxlKiB2b2x1bWUpIHsKLSAgRENIRUNLKG1hbmFnZXJfLT5HZXRNZXNzYWdlTG9vcCgpLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotCi0gICp2b2x1bWUgPSB2b2x1bWVfOwotfQotCi12b2lkIFB1bHNlQXVkaW9PdXRwdXRTdHJlYW06OldhaXRGb3JQdWxzZU9wZXJhdGlvbihwYV9vcGVyYXRpb24qIG9wKSB7Ci0gIENIRUNLKG9wKTsKLSAgd2hpbGUgKHBhX29wZXJhdGlvbl9nZXRfc3RhdGUob3ApID09IFBBX09QRVJBVElPTl9SVU5OSU5HKSB7Ci0gICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdChwYV9tYWlubG9vcF8pOwotICB9Ci0gIHBhX29wZXJhdGlvbl91bnJlZihvcCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL3B1bHNlL3B1bHNlX291dHB1dC5oIGIvc3JjL21lZGlhL2F1ZGlvL3B1bHNlL3B1bHNlX291dHB1dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGQ3Y2ZkLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9wdWxzZS9wdWxzZV9vdXRwdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotLy8KLS8vIENyZWF0ZXMgYW4gYXVkaW8gb3V0cHV0IHN0cmVhbSBiYXNlZCBvbiB0aGUgUHVsc2VBdWRpbyBhc3luY2hyb25vdXMgQVBJOwotLy8gc3BlY2lmaWNhbGx5IHVzaW5nIHRoZSBwYV90aHJlYWRlZF9tYWlubG9vcCBtb2RlbC4KLS8vCi0vLyBJZiB0aGUgc3RyZWFtIGlzIHN1Y2Nlc3NmdWxseSBvcGVuZWQsIENsb3NlKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZQotLy8gc3RyZWFtIGlzIGRlbGV0ZWQgYXMgQ2xvc2UoKSBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgcmVzb3VyY2UgY2xlYW51cAotLy8gb2NjdXJzLgotLy8KLS8vIFRoaXMgb2JqZWN0IGlzIGRlc2lnbmVkIHNvIHRoYXQgYWxsIEF1ZGlvT3V0cHV0U3RyZWFtIG1ldGhvZHMgd2lsbCBiZSBjYWxsZWQKLS8vIG9uIHRoZSBzYW1lIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIG9iamVjdC4KLS8vCi0vLyBXQVJOSU5HOiBUaGlzIG9iamVjdCBibG9ja3Mgb24gaW50ZXJuYWwgUHVsc2VBdWRpbyBjYWxscyBpbiBPcGVuKCkgd2hpbGUKLS8vIHdhaXRpbmcgZm9yIFB1bHNlQXVkaW8ncyBjb250ZXh0IHN0cnVjdHVyZSB0byBiZSByZWFkeS4gIEl0IGFsc28gYmxvY2tzIGluCi0vLyBpbnNpZGUgUHVsc2VBdWRpbyBpbiBTdGFydCgpIGFuZCByZXBlYXRlZCBkdXJpbmcgcGxheWJhY2ssIHdhaXRpbmcgZm9yCi0vLyBQdWxzZUF1ZGlvIHdyaXRlIGNhbGxiYWNrcyB0byBvY2N1ci4KLQotI2lmbmRlZiBNRURJQV9BVURJT19QVUxTRV9QVUxTRV9PVVRQVVRfSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fUFVMU0VfUFVMU0VfT1VUUFVUX0hfCi0KLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9faW8uaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19wYXJhbWV0ZXJzLmgiCi0KLXN0cnVjdCBwYV9jb250ZXh0Owotc3RydWN0IHBhX29wZXJhdGlvbjsKLXN0cnVjdCBwYV9zdHJlYW07Ci1zdHJ1Y3QgcGFfdGhyZWFkZWRfbWFpbmxvb3A7Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci1jbGFzcyBBdWRpb01hbmFnZXJCYXNlOwotCi1jbGFzcyBQdWxzZUF1ZGlvT3V0cHV0U3RyZWFtIDogcHVibGljIEF1ZGlvT3V0cHV0U3RyZWFtIHsKLSBwdWJsaWM6Ci0gIFB1bHNlQXVkaW9PdXRwdXRTdHJlYW0oY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NYW5hZ2VyQmFzZSogbWFuYWdlcik7Ci0KLSAgdmlydHVhbCB+UHVsc2VBdWRpb091dHB1dFN0cmVhbSgpOwotCi0gIC8vIEltcGxlbWVudGF0aW9uIG9mIEF1ZGlvT3V0cHV0U3RyZWFtLgotICB2aXJ0dWFsIGJvb2wgT3BlbigpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgQ2xvc2UoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0YXJ0KEF1ZGlvU291cmNlQ2FsbGJhY2sqIGNhbGxiYWNrKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0b3AoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFNldFZvbHVtZShkb3VibGUgdm9sdW1lKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIEdldFZvbHVtZShkb3VibGUqIHZvbHVtZSkgT1ZFUlJJREU7Ci0KLSBwcml2YXRlOgotICAvLyBDYWxsZWQgYnkgUHVsc2VBdWRpbyB3aGVuIHxwYV9jb250ZXh0X3wgYW5kIHxwYV9zdHJlYW1ffCBjaGFuZ2Ugc3RhdGUuICBJZgotICAvLyBhbiB1bmV4cGVjdGVkIGZhaWx1cmUgc3RhdGUgY2hhbmdlIGhhcHBlbnMgYW5kIHxzb3VyY2VfY2FsbGJhY2tffCBpcyBzZXQKLSAgLy8gdGhlc2UgbWV0aG9kcyB3aWxsIGZvcndhcmQgdGhlIGVycm9yIHZpYSBPbkVycm9yKCkuCi0gIHN0YXRpYyB2b2lkIENvbnRleHROb3RpZnlDYWxsYmFjayhwYV9jb250ZXh0KiBjLCB2b2lkKiBwX3RoaXMpOwotICBzdGF0aWMgdm9pZCBTdHJlYW1Ob3RpZnlDYWxsYmFjayhwYV9zdHJlYW0qIHMsIHZvaWQqIHBfdGhpcyk7Ci0KLSAgLy8gVHJpZ2dlcnMgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsKCkgdG8gYXZvaWQgZGVhZGxvY2tzLgotICBzdGF0aWMgdm9pZCBTdHJlYW1TdWNjZXNzQ2FsbGJhY2socGFfc3RyZWFtKiBzLCBpbnQgc3VjY2Vzcywgdm9pZCogcF90aGlzKTsKLQotICAvLyBDYWxsZWQgYnkgUHVsc2VBdWRpbyB3aGVuIGl0IG5lZWRzIG1vcmUgYXVkaW8gZGF0YS4KLSAgc3RhdGljIHZvaWQgU3RyZWFtUmVxdWVzdENhbGxiYWNrKHBhX3N0cmVhbSogcywgc2l6ZV90IGxlbiwgdm9pZCogcF90aGlzKTsKLQotICAvLyBGdWxmaWxsIGEgd3JpdGUgcmVxdWVzdCBmcm9tIHRoZSB3cml0ZSByZXF1ZXN0IGNhbGxiYWNrLiAgT3V0cHV0cyBzaWxlbmNlCi0gIC8vIGlmIHRoZSByZXF1ZXN0IGNvdWxkIG5vdCBiZSBmdWxmaWxsZWQuCi0gIHZvaWQgRnVsZmlsbFdyaXRlUmVxdWVzdChzaXplX3QgcmVxdWVzdGVkX2J5dGVzKTsKLQotICAvLyBDbG9zZSgpIGhlbHBlciBmdW5jdGlvbiB0byBmcmVlIGludGVybmFsIHN0cnVjdHMuCi0gIHZvaWQgUmVzZXQoKTsKLQotICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IGhhcmR3YXJlIGxhdGVuY3kgdmFsdWUgaW4gYnl0ZXMuCi0gIGludCBHZXRIYXJkd2FyZUxhdGVuY3lJbkJ5dGVzKCk7Ci0KLSAgLy8gSGVscGVyIG1ldGhvZCBmb3Igd2FpdGluZyBvbiBQdWxzZSBBdWRpbyBvcGVyYXRpb25zIHRvIGNvbXBsZXRlLgotICB2b2lkIFdhaXRGb3JQdWxzZU9wZXJhdGlvbihwYV9vcGVyYXRpb24qIG9wKTsKLQotICAvLyBBdWRpb1BhcmFtZXRlcnMgZnJvbSB0aGUgY29uc3RydWN0b3IuCi0gIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyBwYXJhbXNfOwotCi0gIC8vIEF1ZGlvIG1hbmFnZXIgdGhhdCBjcmVhdGVkIHVzLiAgVXNlZCB0byByZXBvcnQgdGhhdCB3ZSd2ZSBjbG9zZWQuCi0gIEF1ZGlvTWFuYWdlckJhc2UqIG1hbmFnZXJfOwotCi0gIC8vIFB1bHNlQXVkaW8gQVBJIHN0cnVjdHMuCi0gIHBhX2NvbnRleHQqIHBhX2NvbnRleHRfOwotICBwYV90aHJlYWRlZF9tYWlubG9vcCogcGFfbWFpbmxvb3BfOwotICBwYV9zdHJlYW0qIHBhX3N0cmVhbV87Ci0KLSAgLy8gRmxvYXQgcmVwcmVzZW50YXRpb24gb2Ygdm9sdW1lIGZyb20gMC4wIHRvIDEuMC4KLSAgZmxvYXQgdm9sdW1lXzsKLQotICAvLyBDYWxsYmFjayB0byBhdWRpbyBkYXRhIHNvdXJjZS4gIE11c3Qgb25seSBiZSBtb2RpZmllZCB3aGlsZSBob2xkaW5nIGEgbG9jawotICAvLyBvbiB8cGFfbWFpbmxvb3BffCB2aWEgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jaygpLgotICBBdWRpb1NvdXJjZUNhbGxiYWNrKiBzb3VyY2VfY2FsbGJhY2tfOwotCi0gIC8vIENvbnRhaW5lciBmb3IgcmV0cmlldmluZyBkYXRhIGZyb20gQXVkaW9Tb3VyY2VDYWxsYmFjazo6T25Nb3JlRGF0YSgpLgotICBzY29wZWRfcHRyPEF1ZGlvQnVzPiBhdWRpb19idXNfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihQdWxzZUF1ZGlvT3V0cHV0U3RyZWFtKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0FVRElPX1BVTFNFX1BVTFNFX09VVFBVVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL3NhbXBsZV9yYXRlcy5jYyBiL3NyYy9tZWRpYS9hdWRpby9zYW1wbGVfcmF0ZXMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwODJhOTMuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL3NhbXBsZV9yYXRlcy5jYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby9zYW1wbGVfcmF0ZXMuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotQXVkaW9TYW1wbGVSYXRlIEFzQXVkaW9TYW1wbGVSYXRlKGludCBzYW1wbGVfcmF0ZSkgewotICBzd2l0Y2ggKHNhbXBsZV9yYXRlKSB7Ci0gICAgY2FzZSA4MDAwOiByZXR1cm4gazgwMDBIejsKLSAgICBjYXNlIDE2MDAwOiByZXR1cm4gazE2MDAwSHo7Ci0gICAgY2FzZSAzMjAwMDogcmV0dXJuIGszMjAwMEh6OwotICAgIGNhc2UgNDgwMDA6IHJldHVybiBrNDgwMDBIejsKLSAgICBjYXNlIDk2MDAwOiByZXR1cm4gazk2MDAwSHo7Ci0gICAgY2FzZSAxMTAyNTogcmV0dXJuIGsxMTAyNUh6OwotICAgIGNhc2UgMjIwNTA6IHJldHVybiBrMjIwNTBIejsKLSAgICBjYXNlIDQ0MTAwOiByZXR1cm4gazQ0MTAwSHo7Ci0gICAgY2FzZSA4ODIwMDogcmV0dXJuIGs4ODIwMEh6OwotICAgIGNhc2UgMTc2NDAwOiByZXR1cm4gazE3NjQwMEh6OwotICAgIGNhc2UgMTkyMDAwOiByZXR1cm4gazE5MjAwMEh6OwotICB9Ci0gIHJldHVybiBrVW5leHBlY3RlZEF1ZGlvU2FtcGxlUmF0ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vc2FtcGxlX3JhdGVzLmggYi9zcmMvbWVkaWEvYXVkaW8vc2FtcGxlX3JhdGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMjllNTQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL3NhbXBsZV9yYXRlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9BVURJT19TQU1QTEVfUkFURVNfSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fU0FNUExFX1JBVEVTX0hfCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBFbnVtZXJhdGlvbiB1c2VkIGZvciBoaXN0b2dyYW1taW5nIHNhbXBsZSByYXRlcyBpbnRvIGRpc3RpbmN0IGJ1Y2tldHMuCi0vLyBMb2dnZWQgdG8gVU1BLCBzbyBuZXZlciByZXVzZSBhIHZhbHVlLCBhbHdheXMgYWRkIG5ldy9ncmVhdGVyIG9uZXMhCi1lbnVtIEF1ZGlvU2FtcGxlUmF0ZSB7Ci0gIGs4MDAwSHogPSAwLAotICBrMTYwMDBIeiA9IDEsCi0gIGszMjAwMEh6ID0gMiwKLSAgazQ4MDAwSHogPSAzLAotICBrOTYwMDBIeiA9IDQsCi0gIGsxMTAyNUh6ID0gNSwKLSAgazIyMDUwSHogPSA2LAotICBrNDQxMDBIeiA9IDcsCi0gIGs4ODIwMEh6ID0gOCwKLSAgazE3NjQwMEh6ID0gOSwKLSAgazE5MjAwMEh6ID0gMTAsCi0gIGtVbmV4cGVjdGVkQXVkaW9TYW1wbGVSYXRlICAvLyBNdXN0IGFsd2F5cyBiZSBsYXN0IQotfTsKLQotLy8gSGVscGVyIG1ldGhvZCB0byBjb252ZXJ0IGludGVncmFsIHZhbHVlcyB0byB0aGVpciByZXNwZWN0aXZlIGVudW0gdmFsdWVzLAotLy8gb3Iga1VuZXhwZWN0ZWRBdWRpb1NhbXBsZVJhdGUgaWYgbm8gbWF0Y2ggZXhpc3RzLgotTUVESUFfRVhQT1JUIEF1ZGlvU2FtcGxlUmF0ZSBBc0F1ZGlvU2FtcGxlUmF0ZShpbnQgc2FtcGxlX3JhdGUpOwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9BVURJT19TQU1QTEVfUkFURVNfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9zY29wZWRfbG9vcF9vYnNlcnZlci5jYyBiL3NyYy9tZWRpYS9hdWRpby9zY29wZWRfbG9vcF9vYnNlcnZlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMzMmIwNy4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vc2NvcGVkX2xvb3Bfb2JzZXJ2ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vc2NvcGVkX2xvb3Bfb2JzZXJ2ZXIuaCIKLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL3dhaXRhYmxlX2V2ZW50LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLVNjb3BlZExvb3BPYnNlcnZlcjo6U2NvcGVkTG9vcE9ic2VydmVyKAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4mIGxvb3ApCi0gICAgOiBsb29wXyhsb29wKSB7Ci0gIE9ic2VydmVMb29wRGVzdHJ1Y3Rpb24odHJ1ZSwgTlVMTCk7Ci19Ci0KLVNjb3BlZExvb3BPYnNlcnZlcjo6flNjb3BlZExvb3BPYnNlcnZlcigpIHsKLSAgT2JzZXJ2ZUxvb3BEZXN0cnVjdGlvbihmYWxzZSwgTlVMTCk7Ci19Ci0KLXZvaWQgU2NvcGVkTG9vcE9ic2VydmVyOjpPYnNlcnZlTG9vcERlc3RydWN0aW9uKGJvb2wgZW5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6V2FpdGFibGVFdmVudCogZG9uZSkgewotICAvLyBOb3RlOiB8ZG9uZXwgbWF5IGJlIE5VTEwuCi0gIGlmIChsb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKSB7Ci0gICAgTWVzc2FnZUxvb3AqIGxvb3AgPSBNZXNzYWdlTG9vcDo6Y3VycmVudCgpOwotICAgIGlmIChlbmFibGUpIHsKLSAgICAgIGxvb3AtPkFkZERlc3RydWN0aW9uT2JzZXJ2ZXIodGhpcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGxvb3AtPlJlbW92ZURlc3RydWN0aW9uT2JzZXJ2ZXIodGhpcyk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGJhc2U6OldhaXRhYmxlRXZlbnQgZXZlbnQoZmFsc2UsIGZhbHNlKTsKLSAgICBpZiAobG9vcF8tPlBvc3RUYXNrKEZST01fSEVSRSwKLSAgICAgICAgICAgIGJhc2U6OkJpbmQoJlNjb3BlZExvb3BPYnNlcnZlcjo6T2JzZXJ2ZUxvb3BEZXN0cnVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwgZW5hYmxlLCAmZXZlbnQpKSkgewotICAgICAgZXZlbnQuV2FpdCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBUaGUgbWVzc2FnZSBsb29wJ3MgdGhyZWFkIGhhcyBhbHJlYWR5IHRlcm1pbmF0ZWQsIHNvIG5vIG5lZWQgdG8gd2FpdC4KLSAgICB9Ci0gIH0KLQotICBpZiAoZG9uZSkKLSAgICBkb25lLT5TaWduYWwoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhLgpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL3Njb3BlZF9sb29wX29ic2VydmVyLmggYi9zcmMvbWVkaWEvYXVkaW8vc2NvcGVkX2xvb3Bfb2JzZXJ2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU5YzY4Yi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vc2NvcGVkX2xvb3Bfb2JzZXJ2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfQVVESU9fU0NPUEVEX0xPT1BfT0JTRVJWRVJfSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fU0NPUEVEX0xPT1BfT0JTRVJWRVJfSF8KLQotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcF9wcm94eS5oIgotCi1uYW1lc3BhY2UgYmFzZSB7Ci1jbGFzcyBXYWl0YWJsZUV2ZW50OwotfQotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBBIGNvbW1vbiBiYXNlIGNsYXNzIGZvciBBdWRpb091dHB1dERldmljZSBhbmQgQXVkaW9JbnB1dERldmljZSB0aGF0IG1hbmFnZXMKLS8vIGEgbWVzc2FnZSBsb29wIHBvaW50ZXIgYW5kIG1vbml0b3JzIGl0IGZvciBkZXN0cnVjdGlvbi4gSWYgdGhlIG9iamVjdCBnb2VzCi0vLyBvdXQgb2Ygc2NvcGUgYmVmb3JlIHRoZSBtZXNzYWdlIGxvb3AsIHRoZSBvYmplY3Qgd2lsbCBhdXRvbWF0aWNhbGx5IHJlbW92ZQotLy8gaXRzZWxmIGZyb20gdGhlIG1lc3NhZ2UgbG9vcCdzIGxpc3Qgb2YgZGVzdHJ1Y3Rpb24gb2JzZXJ2ZXJzLgotLy8gTk9URTogVGhlIGNsYXNzIHRoYXQgaW5oZXJpdHMgZnJvbSB0aGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZQotLy8gV2lsbERlc3Ryb3lDdXJyZW50TWVzc2FnZUxvb3AgdmlydHVhbCBtZXRob2QgZnJvbSBEZXN0cnVjdGlvbk9ic2VydmVyLgotY2xhc3MgU2NvcGVkTG9vcE9ic2VydmVyCi0gICAgOiBwdWJsaWMgTWVzc2FnZUxvb3A6OkRlc3RydWN0aW9uT2JzZXJ2ZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgU2NvcGVkTG9vcE9ic2VydmVyKAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbWVzc2FnZV9sb29wKTsKLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB+U2NvcGVkTG9vcE9ic2VydmVyKCk7Ci0KLSAgLy8gQWNjZXNzb3IgdG8gdGhlIGxvb3AgdGhhdCdzIHVzZWQgYnkgdGhlIGRlcml2ZWQgY2xhc3MuCi0gIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4mIG1lc3NhZ2VfbG9vcCgpIHsgcmV0dXJuIGxvb3BfOyB9Ci0KLSBwcml2YXRlOgotICAvLyBDYWxsIHRvIGFkZCBvciByZW1vdmUgb3Vyc2VsdmVzIGZyb20gdGhlIGxpc3Qgb2YgZGVzdHJ1Y3Rpb24gb2JzZXJ2ZXJzIGZvcgotICAvLyB0aGUgbWVzc2FnZSBsb29wLgotICB2b2lkIE9ic2VydmVMb29wRGVzdHJ1Y3Rpb24oYm9vbCBlbmFibGUsIGJhc2U6OldhaXRhYmxlRXZlbnQqIGRvbmUpOwotCi0gIC8vIEEgcG9pbnRlciB0byB0aGUgbWVzc2FnZSBsb29wJ3MgcHJveHkuIEluIGNhc2UgdGhlIGxvb3AgZ2V0cyBkZXN0cm95ZWQKLSAgLy8gYmVmb3JlIHRoaXMgb2JqZWN0IGdvZXMgb3V0IG9mIHNjb3BlLCBQb3N0VGFzayBldGMgd2lsbCBmYWlsIGJ1dCBub3QgY3Jhc2guCi0gIHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4gbG9vcF87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNjb3BlZExvb3BPYnNlcnZlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEuCi0KLSNlbmRpZiAgLy8gTUVESUFfQVVESU9fU0NPUEVEX0xPT1BfT0JTRVJWRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9zaGFyZWRfbWVtb3J5X3V0aWwuY2MgYi9zcmMvbWVkaWEvYXVkaW8vc2hhcmVkX21lbW9yeV91dGlsLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjVkZjAzLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9zaGFyZWRfbWVtb3J5X3V0aWwuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vc2hhcmVkX21lbW9yeV91dGlsLmgiCi0KLSNpbmNsdWRlICJiYXNlL2F0b21pY29wcy5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotCi11c2luZyBiYXNlOjpzdWJ0bGU6OkF0b21pYzMyOwotCi1zdGF0aWMgY29uc3QgdWludDMyIGtVbmtub3duRGF0YVNpemUgPSBzdGF0aWNfY2FzdDx1aW50MzI+KC0xKTsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotdWludDMyIFRvdGFsU2hhcmVkTWVtb3J5U2l6ZUluQnl0ZXModWludDMyIHBhY2tldF9zaXplKSB7Ci0gIC8vIE5lZWQgdG8gcmVzZXJ2ZSBleHRyYSA0IGJ5dGVzIGZvciBzaXplIG9mIGRhdGEuCi0gIHJldHVybiBwYWNrZXRfc2l6ZSArIHNpemVvZihBdG9taWMzMik7Ci19Ci0KLXVpbnQzMiBQYWNrZXRTaXplSW5CeXRlcyh1aW50MzIgc2hhcmVkX21lbW9yeV9jcmVhdGVkX3NpemUpIHsKLSAgcmV0dXJuIHNoYXJlZF9tZW1vcnlfY3JlYXRlZF9zaXplIC0gc2l6ZW9mKEF0b21pYzMyKTsKLX0KLQotdWludDMyIEdldEFjdHVhbERhdGFTaXplSW5CeXRlcyhiYXNlOjpTaGFyZWRNZW1vcnkqIHNoYXJlZF9tZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBwYWNrZXRfc2l6ZSkgewotICBjaGFyKiBwdHIgPSBzdGF0aWNfY2FzdDxjaGFyKj4oc2hhcmVkX21lbW9yeS0+bWVtb3J5KCkpICsgcGFja2V0X3NpemU7Ci0gIERDSEVDS19FUSgwdSwgcmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KHB0cikgJiAzKTsKLQotICAvLyBBY3R1YWwgZGF0YSBzaXplIHN0b3JlZCBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCi0gIHVpbnQzMiBhY3R1YWxfZGF0YV9zaXplID0KLSAgICAgIGJhc2U6OnN1YnRsZTo6QWNxdWlyZV9Mb2FkKHJlaW50ZXJwcmV0X2Nhc3Q8dm9sYXRpbGUgQXRvbWljMzIqPihwdHIpKTsKLSAgcmV0dXJuIHN0ZDo6bWluKGFjdHVhbF9kYXRhX3NpemUsIHBhY2tldF9zaXplKTsKLX0KLQotdm9pZCBTZXRBY3R1YWxEYXRhU2l6ZUluQnl0ZXModm9pZCogc2hhcmVkX21lbW9yeV9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgcGFja2V0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgYWN0dWFsX2RhdGFfc2l6ZSkgewotICBjaGFyKiBwdHIgPSBzdGF0aWNfY2FzdDxjaGFyKj4oc2hhcmVkX21lbW9yeV9wdHIpICsgcGFja2V0X3NpemU7Ci0gIERDSEVDS19FUSgwdSwgcmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KHB0cikgJiAzKTsKLQotICAvLyBTZXQgYWN0dWFsIGRhdGEgc2l6ZSBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCi0gIGJhc2U6OnN1YnRsZTo6UmVsZWFzZV9TdG9yZShyZWludGVycHJldF9jYXN0PHZvbGF0aWxlIEF0b21pYzMyKj4ocHRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbF9kYXRhX3NpemUpOwotfQotCi12b2lkIFNldEFjdHVhbERhdGFTaXplSW5CeXRlcyhiYXNlOjpTaGFyZWRNZW1vcnkqIHNoYXJlZF9tZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgcGFja2V0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgYWN0dWFsX2RhdGFfc2l6ZSkgewotICBTZXRBY3R1YWxEYXRhU2l6ZUluQnl0ZXMoc2hhcmVkX21lbW9yeS0+bWVtb3J5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXRfc2l6ZSwgYWN0dWFsX2RhdGFfc2l6ZSk7Ci19Ci0KLXZvaWQgU2V0VW5rbm93bkRhdGFTaXplKGJhc2U6OlNoYXJlZE1lbW9yeSogc2hhcmVkX21lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBwYWNrZXRfc2l6ZSkgewotICBTZXRBY3R1YWxEYXRhU2l6ZUluQnl0ZXMoc2hhcmVkX21lbW9yeSwgcGFja2V0X3NpemUsIGtVbmtub3duRGF0YVNpemUpOwotfQotCi1ib29sIElzVW5rbm93bkRhdGFTaXplKGJhc2U6OlNoYXJlZE1lbW9yeSogc2hhcmVkX21lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHBhY2tldF9zaXplKSB7Ci0gIGNoYXIqIHB0ciA9IHN0YXRpY19jYXN0PGNoYXIqPihzaGFyZWRfbWVtb3J5LT5tZW1vcnkoKSkgKyBwYWNrZXRfc2l6ZTsKLSAgRENIRUNLX0VRKDB1LCByZWludGVycHJldF9jYXN0PHNpemVfdD4ocHRyKSAmIDMpOwotCi0gIC8vIEFjdHVhbCBkYXRhIHNpemUgc3RvcmVkIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KLSAgdWludDMyIGFjdHVhbF9kYXRhX3NpemUgPQotICAgICAgYmFzZTo6c3VidGxlOjpBY3F1aXJlX0xvYWQocmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBBdG9taWMzMio+KHB0cikpOwotICByZXR1cm4gYWN0dWFsX2RhdGFfc2l6ZSA9PSBrVW5rbm93bkRhdGFTaXplOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9zaGFyZWRfbWVtb3J5X3V0aWwuaCBiL3NyYy9tZWRpYS9hdWRpby9zaGFyZWRfbWVtb3J5X3V0aWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFlNmZmZS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vc2hhcmVkX21lbW9yeV91dGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0FVRElPX1NIQVJFRF9NRU1PUllfVVRJTF9IXwotI2RlZmluZSBNRURJQV9BVURJT19TSEFSRURfTUVNT1JZX1VUSUxfSF8KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgImJhc2Uvc2hhcmVkX21lbW9yeS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIFZhbHVlIHNlbnQgYnkgdGhlIGNvbnRyb2xsZXIgdG8gdGhlIHJlbmRlcmVyIGluIGxvdy1sYXRlbmN5IG1vZGUKLS8vIGluZGljYXRpbmcgdGhhdCB0aGUgc3RyZWFtIGlzIHBhdXNlZC4KLWVudW0geyBrUGF1c2VNYXJrID0gLTEgfTsKLQotLy8gRnVuY3Rpb25zIHRoYXQgaGFuZGxlIGRhdGEgYnVmZmVyIHBhc3NlZCBiZXR3ZWVuIHByb2Nlc3NlcyBpbiB0aGUgc2hhcmVkCi0vLyBtZW1vcnkuICBDYWxsZWQgb24gYm90aCBJUEMgc2lkZXMuICBUaGVzZSBhcmUgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIHNoYXJlZAotLy8gbWVtb3J5IGhhcyBhIGxheW91dDogdGhlIGxhc3Qgd29yZCBpbiB0aGUgYmxvY2sgaXMgdGhlIGRhdGEgc2l6ZSBpbiBieXRlcy4KLQotTUVESUFfRVhQT1JUIHVpbnQzMiBUb3RhbFNoYXJlZE1lbW9yeVNpemVJbkJ5dGVzKHVpbnQzMiBwYWNrZXRfc2l6ZSk7Ci1NRURJQV9FWFBPUlQgdWludDMyIFBhY2tldFNpemVJbkJ5dGVzKHVpbnQzMiBzaGFyZWRfbWVtb3J5X2NyZWF0ZWRfc2l6ZSk7Ci1NRURJQV9FWFBPUlQgdWludDMyIEdldEFjdHVhbERhdGFTaXplSW5CeXRlcyhiYXNlOjpTaGFyZWRNZW1vcnkqIHNoYXJlZF9tZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgcGFja2V0X3NpemUpOwotTUVESUFfRVhQT1JUIHZvaWQgU2V0QWN0dWFsRGF0YVNpemVJbkJ5dGVzKGJhc2U6OlNoYXJlZE1lbW9yeSogc2hhcmVkX21lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgcGFja2V0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIGFjdHVhbF9kYXRhX3NpemUpOwotTUVESUFfRVhQT1JUIHZvaWQgU2V0QWN0dWFsRGF0YVNpemVJbkJ5dGVzKHZvaWQqIHNoYXJlZF9tZW1vcnlfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBwYWNrZXRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgYWN0dWFsX2RhdGFfc2l6ZSk7Ci1NRURJQV9FWFBPUlQgdm9pZCBTZXRVbmtub3duRGF0YVNpemUoYmFzZTo6U2hhcmVkTWVtb3J5KiBzaGFyZWRfbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBwYWNrZXRfc2l6ZSk7Ci1NRURJQV9FWFBPUlQgYm9vbCBJc1Vua25vd25EYXRhU2l6ZShiYXNlOjpTaGFyZWRNZW1vcnkqIHNoYXJlZF9tZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgcGFja2V0X3NpemUpOwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9BVURJT19TSEFSRURfTUVNT1JZX1VUSUxfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9zaGVsbF9hdWRpb19zaW5rLmNjIGIvc3JjL21lZGlhL2F1ZGlvL3NoZWxsX2F1ZGlvX3NpbmsuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NmQzZjcuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL3NoZWxsX2F1ZGlvX3NpbmsuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3NoZWxsX2F1ZGlvX3NpbmsuaCIKLQotI2luY2x1ZGUgPGxpbWl0cz4KLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9hbGlnbmVkX21lbW9yeS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2J1cy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2hlbGxfbWVkaWFfc3RhdGlzdGljcy5oIgotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvc2hlbGxfYXVkaW9fcmVuZGVyZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9tcDQvYWFjLmgiCi0KLSNpZiBkZWZpbmVkKE9TX1NUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgotI2VuZGlmICAvLyBkZWZpbmVkKE9TX1NUQVJCT0FSRCkKLQotbmFtZXNwYWNlIHsKLQotc2NvcGVkX3B0cl9tYWxsb2M8ZmxvYXQsIGJhc2U6OlNjb3BlZFB0ckFsaWduZWRGcmVlPiBzX2F1ZGlvX3NpbmtfYnVmZmVyOwotc2l6ZV90IHNfYXVkaW9fc2lua19idWZmZXJfc2l6ZV9pbl9mbG9hdDsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLXZvaWQgQXVkaW9TaW5rU2V0dGluZ3M6OlJlc2V0KGNvbnN0IFNoZWxsQXVkaW9TdHJlYW1lcjo6Q29uZmlnJiBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIGF1ZGlvX3BhcmFtZXRlcnMpIHsKLSAgY29uZmlnXyA9IGNvbmZpZzsKLSAgYXVkaW9fcGFyYW1ldGVyc18gPSBhdWRpb19wYXJhbWV0ZXJzOwotfQotCi1jb25zdCBTaGVsbEF1ZGlvU3RyZWFtZXI6OkNvbmZpZyYgQXVkaW9TaW5rU2V0dGluZ3M6OmNvbmZpZygpIGNvbnN0IHsKLSAgcmV0dXJuIGNvbmZpZ187Ci19Ci0KLWNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgQXVkaW9TaW5rU2V0dGluZ3M6OmF1ZGlvX3BhcmFtZXRlcnMoKSBjb25zdCB7Ci0gIHJldHVybiBhdWRpb19wYXJhbWV0ZXJzXzsKLX0KLQotaW50IEF1ZGlvU2lua1NldHRpbmdzOjpjaGFubmVscygpIGNvbnN0IHsKLSAgcmV0dXJuIGF1ZGlvX3BhcmFtZXRlcnNfLmNoYW5uZWxzKCk7Ci19Ci0KLWludCBBdWRpb1NpbmtTZXR0aW5nczo6cGVyX2NoYW5uZWxfZnJhbWVzKEF1ZGlvQnVzKiBhdWRpb19idXMpIGNvbnN0IHsKLSAgcmV0dXJuIGF1ZGlvX2J1cy0+ZnJhbWVzKCkgKiBzaXplb2YoZmxvYXQpIC8KLSAgICAgICAgIChjb25maWdfLmludGVybGVhdmVkKCkgPyBjaGFubmVscygpIDogMSkgLwotICAgICAgICAgKGF1ZGlvX3BhcmFtZXRlcnNfLmJpdHNfcGVyX3NhbXBsZSgpIC8gOCk7Ci19Ci0KLS8vIHN0YXRpYwotU2hlbGxBdWRpb1NpbmsqIFNoZWxsQXVkaW9TaW5rOjpDcmVhdGUoU2hlbGxBdWRpb1N0cmVhbWVyKiBhdWRpb19zdHJlYW1lcikgewotICByZXR1cm4gbmV3IFNoZWxsQXVkaW9TaW5rKGF1ZGlvX3N0cmVhbWVyKTsKLX0KLQotU2hlbGxBdWRpb1Npbms6OlNoZWxsQXVkaW9TaW5rKFNoZWxsQXVkaW9TdHJlYW1lciogYXVkaW9fc3RyZWFtZXIpCi0gICAgOiByZW5kZXJfY2FsbGJhY2tfKE5VTEwpLAotICAgICAgcGF1c2VfcmVxdWVzdGVkXyh0cnVlKSwKLSAgICAgIHJlYnVmZmVyaW5nXyh0cnVlKSwKLSAgICAgIHJlYnVmZmVyX251bV9mcmFtZXNfKDApLAotICAgICAgcmVuZGVyX2ZyYW1lX2N1cnNvcl8oMCksCi0gICAgICBvdXRwdXRfZnJhbWVfY3Vyc29yXygwKSwKLSAgICAgIGF1ZGlvX3N0cmVhbWVyXyhhdWRpb19zdHJlYW1lcikgewotICBidWZmZXJfZmFjdG9yeV8gPSBTaGVsbEJ1ZmZlckZhY3Rvcnk6Okluc3RhbmNlKCk7Ci19Ci0KLVNoZWxsQXVkaW9TaW5rOjp+U2hlbGxBdWRpb1NpbmsoKSB7Ci0gIGlmIChyZW5kZXJfY2FsbGJhY2tfKSB7Ci0gICAgRENIRUNLKCFhdWRpb19zdHJlYW1lcl8tPkhhc1N0cmVhbSh0aGlzKSk7Ci0gIH0KLX0KLQotdm9pZCBTaGVsbEF1ZGlvU2luazo6SW5pdGlhbGl6ZShjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyQ2FsbGJhY2sqIGNhbGxiYWNrKSB7Ci0gIFRSQUNFX0VWRU5UMCgibWVkaWFfc3RhY2siLCAiU2hlbGxBdWRpb1Npbms6OkluaXRpYWxpemUoKSIpOwotICBEQ0hFQ0soIXJlbmRlcl9jYWxsYmFja18pOwotICBEQ0hFQ0socGFyYW1zLmJpdHNfcGVyX3NhbXBsZSgpID09IDE2IHx8IHBhcmFtcy5iaXRzX3Blcl9zYW1wbGUoKSA9PSAzMik7Ci0KLSAgcmVuZGVyX2NhbGxiYWNrXyA9IGNhbGxiYWNrOwotICBhdWRpb19wYXJhbWV0ZXJzXyA9IHBhcmFtczsKLQotICBzdHJlYW1lcl9jb25maWdfID0gYXVkaW9fc3RyZWFtZXJfLT5HZXRDb25maWcoKTsKLSAgc2V0dGluZ3NfLlJlc2V0KHN0cmVhbWVyX2NvbmZpZ18sIHBhcmFtcyk7Ci0KLSAgLy8gQ3JlYXRpbmcgdGhlIGF1ZGlvIGJ1cwotICBzaXplX3QgcGVyX2NoYW5uZWxfc2l6ZV9pbl9mbG9hdCA9Ci0gICAgICBzdHJlYW1lcl9jb25maWdfLnNpbmtfYnVmZmVyX3NpemVfaW5fZnJhbWVzX3Blcl9jaGFubmVsKCkgKgotICAgICAgYXVkaW9fcGFyYW1ldGVyc18uYml0c19wZXJfc2FtcGxlKCkgLyAoOCAqIHNpemVvZihmbG9hdCkpOwotICBzaXplX3QgYXVkaW9fYnVzX2J1ZmZlcl9zaXplX2luX2Zsb2F0ID0KLSAgICAgIHNldHRpbmdzXy5jaGFubmVscygpICogcGVyX2NoYW5uZWxfc2l6ZV9pbl9mbG9hdDsKLSAgaWYgKGF1ZGlvX2J1c19idWZmZXJfc2l6ZV9pbl9mbG9hdCA+IHNfYXVkaW9fc2lua19idWZmZXJfc2l6ZV9pbl9mbG9hdCkgewotICAgIHNfYXVkaW9fc2lua19idWZmZXJfc2l6ZV9pbl9mbG9hdCA9IGF1ZGlvX2J1c19idWZmZXJfc2l6ZV9pbl9mbG9hdDsKLSAgICAvLyBmcmVlIHRoZSBleGlzdGluZyBtZW1vcnkgZmlyc3Qgc28gd2UgaGF2ZSBtb3JlIGZyZWUgbWVtb3J5IGZvciB0aGUKLSAgICAvLyBhbGxvY2F0aW9uIGZvbGxvd2luZy4KLSAgICBzX2F1ZGlvX3NpbmtfYnVmZmVyLnJlc2V0KE5VTEwpOwotICAgIHNfYXVkaW9fc2lua19idWZmZXIucmVzZXQoc3RhdGljX2Nhc3Q8ZmxvYXQqPigKLSAgICAgICAgYmFzZTo6QWxpZ25lZEFsbG9jKHNfYXVkaW9fc2lua19idWZmZXJfc2l6ZV9pbl9mbG9hdCAqIHNpemVvZihmbG9hdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1czo6a0NoYW5uZWxBbGlnbm1lbnQpKSk7Ci0gICAgaWYgKCFzX2F1ZGlvX3NpbmtfYnVmZmVyKSB7Ci0gICAgICBETE9HKEVSUk9SKSA8PCAiY291bGRuJ3QgcmVhbGxvY2F0ZSBzaW5rIGJ1ZmZlciI7Ci0gICAgICByZW5kZXJfY2FsbGJhY2tfLT5PblJlbmRlckVycm9yKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgaWYgKHN0cmVhbWVyX2NvbmZpZ18uaW50ZXJsZWF2ZWQoKSkgewotICAgIGF1ZGlvX2J1c18gPSBBdWRpb0J1czo6V3JhcE1lbW9yeSgKLSAgICAgICAgMSwgc2V0dGluZ3NfLmNoYW5uZWxzKCkgKiBwZXJfY2hhbm5lbF9zaXplX2luX2Zsb2F0LAotICAgICAgICBzX2F1ZGlvX3NpbmtfYnVmZmVyLmdldCgpKTsKLSAgfSBlbHNlIHsKLSAgICBhdWRpb19idXNfID0KLSAgICAgICAgQXVkaW9CdXM6OldyYXBNZW1vcnkoc2V0dGluZ3NfLmNoYW5uZWxzKCksIHBlcl9jaGFubmVsX3NpemVfaW5fZmxvYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNfYXVkaW9fc2lua19idWZmZXIuZ2V0KCkpOwotICB9Ci0KLSAgaWYgKCFhdWRpb19idXNfKSB7Ci0gICAgTk9UUkVBQ0hFRCgpIDw8ICJjb3VsZG4ndCBjcmVhdGUgc2luayBidWZmZXIiOwotICAgIHJlbmRlcl9jYWxsYmFja18tPk9uUmVuZGVyRXJyb3IoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICByZWJ1ZmZlcl9udW1fZnJhbWVzXyA9Ci0gICAgICBzdHJlYW1lcl9jb25maWdfLmluaXRpYWxfcmVidWZmZXJpbmdfZnJhbWVzX3Blcl9jaGFubmVsKCk7Ci0gIHJlbmRlcmVyX2F1ZGlvX2J1c18gPSBBdWRpb0J1czo6Q3JlYXRlV3JhcHBlcihhdWRpb19idXNfLT5jaGFubmVscygpKTsKLX0KLQotdm9pZCBTaGVsbEF1ZGlvU2luazo6U3RhcnQoKSB7Ci0gIFRSQUNFX0VWRU5UMCgibWVkaWFfc3RhY2siLCAiU2hlbGxBdWRpb1Npbms6OlN0YXJ0KCkiKTsKLSAgRENIRUNLKHJlbmRlcl9jYWxsYmFja18pOwotCi0gIGlmICghYXVkaW9fc3RyZWFtZXJfLT5IYXNTdHJlYW0odGhpcykpIHsKLSAgICBwYXVzZV9yZXF1ZXN0ZWRfID0gdHJ1ZTsKLSAgICByZWJ1ZmZlcmluZ18gPSB0cnVlOwotICAgIGF1ZGlvX3N0cmVhbWVyXy0+U3RvcEJhY2tncm91bmRNdXNpYygpOwotICAgIGF1ZGlvX3N0cmVhbWVyXy0+QWRkU3RyZWFtKHRoaXMpOwotICAgIERDSEVDSyhhdWRpb19zdHJlYW1lcl8tPkhhc1N0cmVhbSh0aGlzKSk7Ci0gIH0KLX0KLQotdm9pZCBTaGVsbEF1ZGlvU2luazo6U3RvcCgpIHsKLSAgVFJBQ0VfRVZFTlQwKCJtZWRpYV9zdGFjayIsICJTaGVsbEF1ZGlvU2luazo6U3RvcCgpIik7Ci0gIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgU3RvcCgpIGlzIGNhbGxlZCBiZWZvcmUgSW5pdGlhbGl6ZSgpIGlzIGNhbGxlZC4gSW4KLSAgLy8gdGhpcyBjYXNlIHRoZSBhdWRpb19zdHJlYW1lcl8gd2lsbCBub3QgYmUgYWJsZSB0byBjaGVjayBpZiBpdCBoYXMgdGhlCi0gIC8vIHN0cmVhbSBhcyBhdWRpb19wYXJhbWV0ZXJzXyBoYXNuJ3QgYmVlbiBpbml0aWFsaXplZC4KLSAgaWYgKHJlbmRlcl9jYWxsYmFja18gJiYgYXVkaW9fc3RyZWFtZXJfLT5IYXNTdHJlYW0odGhpcykpIHsKLSAgICBhdWRpb19zdHJlYW1lcl8tPlJlbW92ZVN0cmVhbSh0aGlzKTsKLSAgICBwYXVzZV9yZXF1ZXN0ZWRfID0gdHJ1ZTsKLSAgICByZWJ1ZmZlcmluZ18gPSB0cnVlOwotICAgIHJlbmRlcl9mcmFtZV9jdXJzb3JfID0gMDsKLSAgICBvdXRwdXRfZnJhbWVfY3Vyc29yXyA9IDA7Ci0gIH0KLX0KLQotdm9pZCBTaGVsbEF1ZGlvU2luazo6UGF1c2UoYm9vbCBmbHVzaCkgewotICBUUkFDRV9FVkVOVDAoIm1lZGlhX3N0YWNrIiwgIlNoZWxsQXVkaW9TaW5rOjpQYXVzZSgpIik7Ci0gIC8vIGNsZWFyIGNvbnN1bXB0aW9uIG9mIGRhdGEgb24gdGhlIG1peGVyLgotICBwYXVzZV9yZXF1ZXN0ZWRfID0gdHJ1ZTsKLSAgaWYgKGZsdXNoKSB7Ci0gICAgVFJBQ0VfRVZFTlQwKCJtZWRpYV9zdGFjayIsICJTaGVsbEF1ZGlvU2luazo6UGF1c2UoKSBmbHVzaGluZy4iKTsKLSAgICAvLyByZW1vdmUgYW5kIHJlLWFkZCB0aGUgc3RyZWFtIHRvIGZsdXNoCi0gICAgYXVkaW9fc3RyZWFtZXJfLT5SZW1vdmVTdHJlYW0odGhpcyk7Ci0gICAgcmVidWZmZXJpbmdfID0gdHJ1ZTsKLSAgICByZW5kZXJfZnJhbWVfY3Vyc29yXyA9IDA7Ci0gICAgb3V0cHV0X2ZyYW1lX2N1cnNvcl8gPSAwOwotICAgIGF1ZGlvX3N0cmVhbWVyXy0+QWRkU3RyZWFtKHRoaXMpOwotICB9Ci19Ci0KLXZvaWQgU2hlbGxBdWRpb1Npbms6OlBsYXkoKSB7Ci0gIFRSQUNFX0VWRU5UMCgibWVkaWFfc3RhY2siLCAiU2hlbGxBdWRpb1Npbms6OlBsYXkoKSIpOwotICAvLyBjbGVhciBmbGFnIG9uIG1peGVyIGNhbGxiYWNrLCB3aWxsIHN0YXJ0IHRvIGNvbnN1bWUgbW9yZSBkYXRhCi0gIHBhdXNlX3JlcXVlc3RlZF8gPSBmYWxzZTsKLX0KLQotYm9vbCBTaGVsbEF1ZGlvU2luazo6U2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpIHsKLSAgcmV0dXJuIGF1ZGlvX3N0cmVhbWVyXy0+U2V0Vm9sdW1lKHRoaXMsIHZvbHVtZSk7Ci19Ci0KLXZvaWQgU2hlbGxBdWRpb1Npbms6OlJlc3VtZUFmdGVyVW5kZXJmbG93KGJvb2wgYnVmZmVyX21vcmVfYXVkaW8pIHsKLSAgLy8gb25seSByZWJ1ZmZlciB3aGVuIHBhdXNlZCwgd2UgYWNjZXNzIHN0YXRlIHZhcmlhYmxlcyBub24gYXRvbWljYWxseQotICBEQ0hFQ0socGF1c2VfcmVxdWVzdGVkXyk7Ci0gIERDSEVDSyhyZWJ1ZmZlcmluZ18pOwotCi0gIGlmICghYnVmZmVyX21vcmVfYXVkaW8pCi0gICAgcmV0dXJuOwotCi0gIHJlYnVmZmVyX251bV9mcmFtZXNfID0gc3RkOjptaW48aW50PigKLSAgICAgIHJlYnVmZmVyX251bV9mcmFtZXNfICogMiwgc2V0dGluZ3NfLnBlcl9jaGFubmVsX2ZyYW1lcyhhdWRpb19idXNfLmdldCgpKSk7Ci19Ci0KLWJvb2wgU2hlbGxBdWRpb1Npbms6OlBhdXNlUmVxdWVzdGVkKCkgY29uc3QgewotICByZXR1cm4gcGF1c2VfcmVxdWVzdGVkXyB8fCByZWJ1ZmZlcmluZ187Ci19Ci0KLWJvb2wgU2hlbGxBdWRpb1Npbms6OlB1bGxGcmFtZXModWludDMyX3QqIG9mZnNldF9pbl9mcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHRvdGFsX2ZyYW1lcykgewotICBUUkFDRV9FVkVOVDAoIm1lZGlhX3N0YWNrIiwgIlNoZWxsQXVkaW9TaW5rOjpQdWxsRnJhbWVzKCkiKTsKLSAgLy8gd2l0aCBhIHZhbGlkIHJlbmRlciBjYWxsYmFjawotICBEQ0hFQ0socmVuZGVyX2NhbGxiYWNrXyk7Ci0KLSAgdWludDMyX3QgZHVtbXlfb2Zmc2V0X2luX2ZyYW1lLCBkdW1teV90b3RhbF9mcmFtZXM7Ci0gIGlmICghb2Zmc2V0X2luX2ZyYW1lKQotICAgIG9mZnNldF9pbl9mcmFtZSA9ICZkdW1teV9vZmZzZXRfaW5fZnJhbWU7Ci0gIGlmICghdG90YWxfZnJhbWVzKQotICAgIHRvdGFsX2ZyYW1lcyA9ICZkdW1teV90b3RhbF9mcmFtZXM7Ci0KLSAgKnRvdGFsX2ZyYW1lcyA9IHJlbmRlcl9mcmFtZV9jdXJzb3JfIC0gb3V0cHV0X2ZyYW1lX2N1cnNvcl87Ci0gIHVpbnQzMiBmcmVlX2ZyYW1lcyA9Ci0gICAgICBzZXR0aW5nc18ucGVyX2NoYW5uZWxfZnJhbWVzKGF1ZGlvX2J1c18uZ2V0KCkpIC0gKnRvdGFsX2ZyYW1lczsKLSAgLy8gTnVtYmVyIG9mIG1zIG9mIGJ1ZmZlcmVkIHBsYXliYWNrIHJlbWFpbmluZwotICB1aW50MzJfdCBidWZmZXJlZF90aW1lID0KLSAgICAgICgqdG90YWxfZnJhbWVzICogMTAwMCAvIGF1ZGlvX3BhcmFtZXRlcnNfLnNhbXBsZV9yYXRlKCkpOwotICBpZiAoZnJlZV9mcmFtZXMgPj0gbXA0OjpBQUM6OmtGcmFtZXNQZXJBY2Nlc3NVbml0KSB7Ci0gICAgU2V0dXBSZW5kZXJBdWRpb0J1cygpOwotCi0gICAgaW50IGZyYW1lc19yZW5kZXJlZCA9Ci0gICAgICAgIHJlbmRlcl9jYWxsYmFja18tPlJlbmRlcihyZW5kZXJlcl9hdWRpb19idXNfLmdldCgpLCBidWZmZXJlZF90aW1lKTsKLSAgICAvLyAwIGluZGljYXRlcyB0aGUgcmVhZCBpcyBzdGlsbCBwZW5kaW5nLiBQb3NpdGl2ZSBudW1iZXIgaXMgIyBvZiBmcmFtZXMKLSAgICAvLyByZW5kZXJlZCwgbmVnYXRpdmUgbnVtYmVyIGluZGljYXRlcyBhbiBlcnJvci4KLSAgICBpZiAoZnJhbWVzX3JlbmRlcmVkID4gMCkgewotICAgICAgLy8gK3ZlIHZhbHVlIGluZGljYXRlcyBudW1iZXIgb2Ygc2FtcGxlcyBpbiBhIHN1Y2Nlc3NmdWwgcmVhZAotICAgICAgLy8gVE9ETzogV2UgY2Fubm90IGd1YXJhbnRlZSB0aGlzIG9uIHBsYXRmb3JtcyB0aGF0IHVzZSBhIHJlc2FtcGxlci4gQ2hlY2sKLSAgICAgIC8vIGlmIGl0IGlzIHBvc3NpYmxlIHRvIG1vdmUgdGhlIHJlc2FtcGxlIGludG8gdGhlIHN0cmVhbWVyLgotICAgICAgLy8gRENIRUNLX0VRKGZyYW1lc19yZW5kZXJlZCwgbXA0OjpBQUM6OmtGcmFtZXNQZXJBY2Nlc3NVbml0KTsKLSAgICAgIHJlbmRlcl9mcmFtZV9jdXJzb3JfICs9IGZyYW1lc19yZW5kZXJlZDsKLSAgICAgICp0b3RhbF9mcmFtZXMgKz0gZnJhbWVzX3JlbmRlcmVkOwotICAgICAgZnJlZV9mcmFtZXMgLT0gZnJhbWVzX3JlbmRlcmVkOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICByZW5kZXJfY2FsbGJhY2tfLT5SZW5kZXIoTlVMTCwgYnVmZmVyZWRfdGltZSk7Ci0gIH0KLQotICBib29sIGJ1ZmZlcl9mdWxsID0gZnJlZV9mcmFtZXMgPCBtcDQ6OkFBQzo6a0ZyYW1lc1BlckFjY2Vzc1VuaXQ7Ci0gIERDSEVDS19MRSgqdG90YWxfZnJhbWVzLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyPihzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyPjo6bWF4KCkpKTsKLSAgYm9vbCByZWJ1ZmZlcl90aHJlc2hvbGRfcmVhY2hlZCA9Ci0gICAgICBzdGF0aWNfY2FzdDxpbnQ+KCp0b3RhbF9mcmFtZXMpID49IHJlYnVmZmVyX251bV9mcmFtZXNfOwotICBpZiAocmVidWZmZXJpbmdfICYmIChidWZmZXJfZnVsbCB8fCByZWJ1ZmZlcl90aHJlc2hvbGRfcmVhY2hlZCkpIHsKLSAgICByZW5kZXJfY2FsbGJhY2tfLT5TaW5rRnVsbCgpOwotICAgIHJlYnVmZmVyaW5nXyA9IGZhbHNlOwotICB9Ci0KLSNpZiBkZWZpbmVkKE9TX1NUQVJCT0FSRCkKLSNpZiBTQl9JUyhNRURJQV9VTkRFUkZMT1dfREVURUNURURfQllfQVVESU9fU0lOSykKLQotI2RlZmluZSBNRURJQV9VTkRFUkZMT1dfREVURUNURURfQllfQVVESU9fU0lOSyAxCi0KLSNlbmRpZiAgLy8gU0JfSVMoTUVESUFfVU5ERVJGTE9XX0RFVEVDVEVEX0JZX0FVRElPX1NJTkspCi0jZW5kaWYgIC8vICNpZiBkZWZpbmVkKE9TX1NUQVJCT0FSRCkKLQotI2lmIGRlZmluZWQoTUVESUFfVU5ERVJGTE9XX0RFVEVDVEVEX0JZX0FVRElPX1NJTkspCi0gIGNvbnN0IHNpemVfdCBrVW5kZXJmbG93VGhyZXNob2xkID0gbXA0OjpBQUM6OmtGcmFtZXNQZXJBY2Nlc3NVbml0IC8gMjsKLSAgaWYgKCp0b3RhbF9mcmFtZXMgPCBrVW5kZXJmbG93VGhyZXNob2xkKSB7Ci0gICAgaWYgKCFyZWJ1ZmZlcmluZ18pIHsKLSAgICAgIHJlYnVmZmVyaW5nXyA9IHRydWU7Ci0gICAgICByZW5kZXJfY2FsbGJhY2tfLT5TaW5rVW5kZXJmbG93KCk7Ci0gICAgICBVUERBVEVfTUVESUFfU1RBVElTVElDUyhTVEFUX1RZUEVfQVVESU9fVU5ERVJGTE9XLCAwKTsKLSAgICB9Ci0gIH0KLSAgKm9mZnNldF9pbl9mcmFtZSA9Ci0gICAgICBvdXRwdXRfZnJhbWVfY3Vyc29yXyAlIHNldHRpbmdzXy5wZXJfY2hhbm5lbF9mcmFtZXMoYXVkaW9fYnVzXy5nZXQoKSk7Ci0gIHJldHVybiAhUGF1c2VSZXF1ZXN0ZWQoKTsKLSNlbHNlICAgLy8gZGVmaW5lZChNRURJQV9VTkRFUkZMT1dfREVURUNURURfQllfQVVESU9fU0lOSykKLSAgcmVidWZmZXJpbmdfID0gdHJ1ZTsKLSAgKm9mZnNldF9pbl9mcmFtZSA9Ci0gICAgICBvdXRwdXRfZnJhbWVfY3Vyc29yXyAlIHNldHRpbmdzXy5wZXJfY2hhbm5lbF9mcmFtZXMoYXVkaW9fYnVzXy5nZXQoKSk7Ci0gIGlmIChwYXVzZV9yZXF1ZXN0ZWRfKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotI2VuZGlmICAvLyBkZWZpbmVkKE1FRElBX1VOREVSRkxPV19ERVRFQ1RFRF9CWV9BVURJT19TSU5LKQotfQotCi12b2lkIFNoZWxsQXVkaW9TaW5rOjpDb25zdW1lRnJhbWVzKHVpbnQzMl90IGZyYW1lX3BsYXllZCkgewotICBUUkFDRV9FVkVOVDEoIm1lZGlhX3N0YWNrIiwgIlNoZWxsQXVkaW9TaW5rOjpDb25zdW1lRnJhbWVzKCkiLCAiYXVkaW9fY2xvY2siLAotICAgICAgICAgICAgICAgKG91dHB1dF9mcmFtZV9jdXJzb3JfICogMTAwMCkgLyBhdWRpb19wYXJhbWV0ZXJzXy5zYW1wbGVfcmF0ZSgpKTsKLSAgLy8gQ2FsbGVkIGJ5IHRoZSBTdHJlYW1lciB0aHJlYWQgdG8gaW5kaWNhdGUgd2hlcmUgdGhlIGhhcmR3YXJlIHJlbmRlcmVyCi0gIC8vIGlzIGluIHBsYXliYWNrCi0gIGlmIChmcmFtZV9wbGF5ZWQgPiAwKSB7Ci0gICAgLy8gYWR2YW5jZSBvdXIgb3V0cHV0IGN1cnNvciBieSB0aGUgbnVtYmVyIG9mIGZyYW1lcyB3ZSdyZSByZXR1cm5pbmcKLSAgICAvLyB1cGRhdGUgYXVkaW8gY2xvY2ssIHVzZWQgZm9yIGppdHRlciBjYWxjdWxhdGlvbnMKLSAgICBvdXRwdXRfZnJhbWVfY3Vyc29yXyArPSBmcmFtZV9wbGF5ZWQ7Ci0gICAgRENIRUNLX0xFKG91dHB1dF9mcmFtZV9jdXJzb3JfLCByZW5kZXJfZnJhbWVfY3Vyc29yXyk7Ci0gIH0KLX0KLQotQXVkaW9CdXMqIFNoZWxsQXVkaW9TaW5rOjpHZXRBdWRpb0J1cygpIHsKLSAgcmV0dXJuIGF1ZGlvX2J1c18uZ2V0KCk7Ci19Ci0KLWNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgU2hlbGxBdWRpb1Npbms6OkdldEF1ZGlvUGFyYW1ldGVycygpIGNvbnN0IHsKLSAgcmV0dXJuIGF1ZGlvX3BhcmFtZXRlcnNfOwotfQotCi12b2lkIFNoZWxsQXVkaW9TaW5rOjpTZXR1cFJlbmRlckF1ZGlvQnVzKCkgewotICAvLyBjaGVjayBmb3IgYnVmZmVyIHdyYXBhcm91bmQsIGhvcGVmdWxseSByYXJlCi0gIGludCByZW5kZXJfZnJhbWVfcG9zaXRpb24gPQotICAgICAgcmVuZGVyX2ZyYW1lX2N1cnNvcl8gJSBzZXR0aW5nc18ucGVyX2NoYW5uZWxfZnJhbWVzKGF1ZGlvX2J1c18uZ2V0KCkpOwotICBpbnQgcmVxdWVzdGVkX2ZyYW1lcyA9IG1wNDo6QUFDOjprRnJhbWVzUGVyQWNjZXNzVW5pdDsKLSAgaWYgKHJlbmRlcl9mcmFtZV9wb3NpdGlvbiArIHJlcXVlc3RlZF9mcmFtZXMgPgotICAgICAgc2V0dGluZ3NfLnBlcl9jaGFubmVsX2ZyYW1lcyhhdWRpb19idXNfLmdldCgpKSkgewotICAgIHJlcXVlc3RlZF9mcmFtZXMgPQotICAgICAgICBzZXR0aW5nc18ucGVyX2NoYW5uZWxfZnJhbWVzKGF1ZGlvX2J1c18uZ2V0KCkpIC0gcmVuZGVyX2ZyYW1lX3Bvc2l0aW9uOwotICB9Ci0gIC8vIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlciB3aGVyZSB3ZSdkIGxpa2UgdG8gc3RvcmUgdGhlc2UgZGF0YQotICBpZiAoc3RyZWFtZXJfY29uZmlnXy5pbnRlcmxlYXZlZCgpKSB7Ci0gICAgdWludDgqIGNoYW5uZWxfZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihhdWRpb19idXNfLT5jaGFubmVsKDApKTsKLSAgICB1aW50OCogY2hhbm5lbF9vZmZzZXQgPSBjaGFubmVsX2RhdGEgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcl9mcmFtZV9wb3NpdGlvbiAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhcmFtZXRlcnNfLmJpdHNfcGVyX3NhbXBsZSgpIC8gOCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzXy5jaGFubmVscygpOwotICAgIC8vIHNldHVwIHRoZSBBdWRpb0J1cyB0byBwYXNzIHRvIHRoZSByZW5kZXJlcgotICAgIHJlbmRlcmVyX2F1ZGlvX2J1c18tPlNldENoYW5uZWxEYXRhKAotICAgICAgICAwLCByZWludGVycHJldF9jYXN0PGZsb2F0Kj4oY2hhbm5lbF9vZmZzZXQpKTsKLSAgICByZW5kZXJlcl9hdWRpb19idXNfLT5zZXRfZnJhbWVzKHJlcXVlc3RlZF9mcmFtZXMgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGFyYW1ldGVyc18uYml0c19wZXJfc2FtcGxlKCkgLyA4IC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihmbG9hdCkgKiBzZXR0aW5nc18uY2hhbm5lbHMoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdWRpb19idXNfLT5jaGFubmVscygpOyArK2kpIHsKLSAgICAgIHVpbnQ4KiBjaGFubmVsX2RhdGEgPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4oYXVkaW9fYnVzXy0+Y2hhbm5lbChpKSk7Ci0gICAgICB1aW50OCogY2hhbm5lbF9vZmZzZXQgPQotICAgICAgICAgIGNoYW5uZWxfZGF0YSArCi0gICAgICAgICAgcmVuZGVyX2ZyYW1lX3Bvc2l0aW9uICogYXVkaW9fcGFyYW1ldGVyc18uYml0c19wZXJfc2FtcGxlKCkgLyA4OwotICAgICAgcmVuZGVyZXJfYXVkaW9fYnVzXy0+U2V0Q2hhbm5lbERhdGEoCi0gICAgICAgICAgaSwgcmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KGNoYW5uZWxfb2Zmc2V0KSk7Ci0gICAgfQotICAgIHJlbmRlcmVyX2F1ZGlvX2J1c18tPnNldF9mcmFtZXMocmVxdWVzdGVkX2ZyYW1lcyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXJhbWV0ZXJzXy5iaXRzX3Blcl9zYW1wbGUoKSAvIDggLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZsb2F0KSk7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vc2hlbGxfYXVkaW9fc2luay5oIGIvc3JjL21lZGlhL2F1ZGlvL3NoZWxsX2F1ZGlvX3NpbmsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJlY2EwOC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vc2hlbGxfYXVkaW9fc2luay5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQVVESU9fU0hFTExfQVVESU9fU0lOS19IXwotI2RlZmluZSBNRURJQV9BVURJT19TSEVMTF9BVURJT19TSU5LX0hfCi0KLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX3JlbmRlcmVyX3NpbmsuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9zaGVsbF9hdWRpb19zdHJlYW1lci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2hlbGxfYnVmZmVyX2ZhY3RvcnkuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIG1hbmFnZSB0aGUgY29tcGxleGl0eSBvZiBhdWRpbyBzZXR0aW5ncyBhcyB0aGUgYXVkaW8KLS8vIHNldHRpbmdzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBvcmlnaW5hbCBhdWRpbyBkYXRhIChzdGVyZW8sIDUuMSwgZXRjLiApCi0vLyBhbmQgYnkgdGhlIGRlY29kZXIgKFNvbWUgZGVjb2RlcnMgZGVjb2RlIG1vbm8gaW50byBzdGVyZW8pIGFuZCBoYXJkd2FyZQotLy8gKHNvbWUgaGFyZHdhcmUgcmVxdWlyZXMgYXVkaW8gZGF0YSB0byBiZSBpbnRlcmxlYXZlZCBidXQgb3RoZXJzIG1pZ2h0Ci0vLyByZXF1aXJlIGl0IHRvIGJlIG5vbi1pbnRlcmxlYXZlZC4KLWNsYXNzIEF1ZGlvU2lua1NldHRpbmdzIHsKLSBwdWJsaWM6Ci0gIEF1ZGlvU2lua1NldHRpbmdzKCkge30KLQotICB2b2lkIFJlc2V0KGNvbnN0IFNoZWxsQXVkaW9TdHJlYW1lcjo6Q29uZmlnJiBjb25maWcsCi0gICAgICAgICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBhdWRpb19wYXJhbWV0ZXJzKTsKLSAgY29uc3QgU2hlbGxBdWRpb1N0cmVhbWVyOjpDb25maWcmIGNvbmZpZygpIGNvbnN0OwotICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIGF1ZGlvX3BhcmFtZXRlcnMoKSBjb25zdDsKLQotICBpbnQgY2hhbm5lbHMoKSBjb25zdDsKLSAgaW50IHBlcl9jaGFubmVsX2ZyYW1lcyhBdWRpb0J1cyogYXVkaW9fYnVzKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIFNoZWxsQXVkaW9TdHJlYW1lcjo6Q29uZmlnIGNvbmZpZ187Ci0gIEF1ZGlvUGFyYW1ldGVycyBhdWRpb19wYXJhbWV0ZXJzXzsKLX07Ci0KLS8vIHBsYXRmb3JtLXNwZWNpZmljIGltcGxlbWVudGF0aW9uIG9mIGFuIGF1ZGlvIGVuZHBvaW50LgotY2xhc3MgTUVESUFfRVhQT1JUIFNoZWxsQXVkaW9TaW5rIDogTk9OX0VYUE9SVEVEX0JBU0UocHVibGljIEF1ZGlvUmVuZGVyZXJTaW5rKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PTl9FWFBPUlRFRF9CQVNFKHB1YmxpYyBTaGVsbEF1ZGlvU3RyZWFtKSB7Ci0gcHVibGljOgotICBTaGVsbEF1ZGlvU2luayhTaGVsbEF1ZGlvU3RyZWFtZXIqIGF1ZGlvX3N0cmVhbWVyKTsKLSAgdmlydHVhbCB+U2hlbGxBdWRpb1NpbmsoKTsKLQotICAvLyBzdGF0aWMgZmFjdG9yeSBtZXRob2QKLSAgc3RhdGljIFNoZWxsQXVkaW9TaW5rKiBDcmVhdGUoU2hlbGxBdWRpb1N0cmVhbWVyKiBhdWRpb19zdHJlYW1lcik7Ci0KLSAgLy8gQXVkaW9SZW5kZXJlclNpbmsgaW1wbGVtZW50YXRpb24KLSAgdm9pZCBJbml0aWFsaXplKGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgUmVuZGVyQ2FsbGJhY2sqIGNhbGxiYWNrKSBPVkVSUklERTsKLSAgdm9pZCBTdGFydCgpIE9WRVJSSURFOwotICB2b2lkIFN0b3AoKSBPVkVSUklERTsKLSAgdm9pZCBQYXVzZShib29sIGZsdXNoKSBPVkVSUklERTsKLSAgdm9pZCBQbGF5KCkgT1ZFUlJJREU7Ci0gIGJvb2wgU2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpIE9WRVJSSURFOwotICB2b2lkIFJlc3VtZUFmdGVyVW5kZXJmbG93KGJvb2wgYnVmZmVyX21vcmVfYXVkaW8pIE9WRVJSSURFOwotCi0gIC8vIFNoZWxsQXVkaW9TdHJlYW0gaW1wbGVtZW50YXRpb24KLSAgYm9vbCBQYXVzZVJlcXVlc3RlZCgpIGNvbnN0IE9WRVJSSURFOwotICBib29sIFB1bGxGcmFtZXModWludDMyX3QqIG9mZnNldF9pbl9mcmFtZSwgdWludDMyX3QqIHRvdGFsX2ZyYW1lcykgT1ZFUlJJREU7Ci0gIHZvaWQgQ29uc3VtZUZyYW1lcyh1aW50MzJfdCBmcmFtZV9wbGF5ZWQpIE9WRVJSSURFOwotICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIEdldEF1ZGlvUGFyYW1ldGVycygpIGNvbnN0IE9WRVJSSURFOwotICBBdWRpb0J1cyogR2V0QXVkaW9CdXMoKSBPVkVSUklERTsKLQotIHByaXZhdGU6Ci0gIC8vIENvbmZpZyB0aGUgYXVkaW8gYnVzIHRoYXQgd2lsbCBiZSBzZW50IHRvIHRoZSBBdWRpb1JlbmRlcmVyLiBJdCByZXVlc2VzCi0gIC8vIHRoZSBtZW1vcnkgb2NjdXBpZWQgYnkgdGhlIHNpbmsgYXVkaW8gYnVzIChhdWRpb19idXNfKS4KLSAgdm9pZCBTZXR1cFJlbmRlckF1ZGlvQnVzKCk7Ci0KLSAgQXVkaW9QYXJhbWV0ZXJzIGF1ZGlvX3BhcmFtZXRlcnNfOwotICBSZW5kZXJDYWxsYmFjayogcmVuZGVyX2NhbGxiYWNrXzsKLQotICBzY29wZWRfcHRyPEF1ZGlvQnVzPiBhdWRpb19idXNfOwotCi0gIC8vIFVzZWQgYXMgYSBwYXJlbWV0ZXIgd2hlbiBjYWxsaW5nIHJlbmRlcl9jYWxsYmFja18tPlJlbmRlcigpLgotICAvLyBXZSBjYW4gb25seSBjb25zdHJ1Y3QgaXQgdGhyb3VnaCBhIHN0YXRpYyBDcmVhdGUgbWV0aG9kIHRoYXQgZG9lcyBhIGhlYXAKLSAgLy8gYWxsb2NhdGUgc28gaXQgaXMgYSBtZW1iZXIgdmFyaWFibGUgdG8gYXZvaWQgYSBoZWFwIGFsbG9jYXRpb24gZWFjaAotICAvLyBmcmFtZS4KLSAgc2NvcGVkX3B0cjxBdWRpb0J1cz4gcmVuZGVyZXJfYXVkaW9fYnVzXzsKLQotICBib29sIHBhdXNlX3JlcXVlc3RlZF87Ci0gIGJvb2wgcmVidWZmZXJpbmdfOwotICAvLyBOdW1iZXIgb2YgZnJhbWVzIHRvIHJlYnVmZmVyIGJlZm9yZSBjYWxsaW5nIFNpbmtGdWxsCi0gIGludCByZWJ1ZmZlcl9udW1fZnJhbWVzXzsKLQotICAvLyBudW1iZXIgb2Ygc2FtcGxlcyBoYXZlIGJlZW4gbG9hZGVkIGludG8gYXVkaW9fYnVzIGZyb20gdGhlIFJlbmRlcmVyCi0gIC8vIChhbmQgbWF5IGhhdmUgYmVlbiBwbGF5ZWQgYW5kIHNpbmNlIGJlZW4gb3ZlcndyaXR0ZW4gYnkgbmV3ZXIgc2FtcGxlcykKLSAgdWludDY0X3QgcmVuZGVyX2ZyYW1lX2N1cnNvcl87Ci0gIC8vIGFkdmFuY2VkIGJ5IENvbnN1bWVTYW1wbGVzKCkgYXMgdGhlIFN0cmVhbWVyIHJlcG9ydHMgcGxheWJhY2sgYWR2YW5jaW5nCi0gIHVpbnQ2NF90IG91dHB1dF9mcmFtZV9jdXJzb3JfOwotCi0gIHNjb3BlZF9yZWZwdHI8U2hlbGxCdWZmZXJGYWN0b3J5PiBidWZmZXJfZmFjdG9yeV87Ci0gIFNoZWxsQXVkaW9TdHJlYW1lciogYXVkaW9fc3RyZWFtZXJfOwotICBTaGVsbEF1ZGlvU3RyZWFtZXI6OkNvbmZpZyBzdHJlYW1lcl9jb25maWdfOwotCi0gIEF1ZGlvU2lua1NldHRpbmdzIHNldHRpbmdzXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0FVRElPX1NIRUxMX0FVRElPX1NJTktfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9zaGVsbF9hdWRpb19zaW5rX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2F1ZGlvL3NoZWxsX2F1ZGlvX3NpbmtfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwOTk1YzEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL3NoZWxsX2F1ZGlvX3NpbmtfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3NoZWxsX2F1ZGlvX3NpbmsuaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL21vY2tfc2hlbGxfYXVkaW9fc3RyZWFtZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21vY2tfZmlsdGVycy5oIgotI2luY2x1ZGUgIm1lZGlhL21wNC9hYWMuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotdHlwZWRlZiBtZWRpYTo6U2hlbGxBdWRpb1N0cmVhbWVyOjpDb25maWcgQ29uZmlnOwotCi0vLyBUT0RPOiBBZGQgMzIgYml0cyBwZXIgc2FtcGxlIHRlc3RzLgotCi1uYW1lc3BhY2UgewotCi11c2luZyBuYW1lc3BhY2UgdGVzdGluZzsKLQotY29uc3QgdWludDMyIGtNYXhIYXJkd2FyZUNoYW5uZWxzU3RlcmVvID0gMjsKLWNvbnN0IHNpemVfdCBrRnJhbWVzUGVyQWNjZXNzVW5pdCA9IG1lZGlhOjptcDQ6OkFBQzo6a0ZyYW1lc1BlckFjY2Vzc1VuaXQ7Ci0KLWJvb2wgb3BlcmF0b3I9PShjb25zdCBtZWRpYTo6QXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMxLAotICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BhcmFtZXRlcnMmIHBhcmFtczIpIHsKLSAgcmV0dXJuIHBhcmFtczEuY2hhbm5lbHMoKSA9PSBwYXJhbXMyLmNoYW5uZWxzKCkgJiYKLSAgICAgICAgIHBhcmFtczEuYml0c19wZXJfc2FtcGxlKCkgPT0gcGFyYW1zMi5iaXRzX3Blcl9zYW1wbGUoKSAmJgotICAgICAgICAgcGFyYW1zMS5zYW1wbGVfcmF0ZSgpID09IHBhcmFtczIuc2FtcGxlX3JhdGUoKTsKLX0KLQotdm9pZCBJbnRlcmxlYXZlZEZpbGwoc2l6ZV90IGZyYW1lc19wZXJfY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgIGludCBieXRlc19wZXJfc2FtcGxlLAotICAgICAgICAgICAgICAgICAgICAgdWludDgqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICB1aW50OCogZmlsbF9ieXRlKSB7Ci0gIHdoaWxlIChmcmFtZXNfcGVyX2NoYW5uZWwpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYW5uZWxzOyArK2kpIHsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYnl0ZXNfcGVyX3NhbXBsZTsgKytqKSB7Ci0gICAgICAgICpkYXRhID0gKmZpbGxfYnl0ZSArIGo7Ci0gICAgICAgICsrZGF0YTsKLSAgICAgIH0KLSAgICB9Ci0gICAgKmZpbGxfYnl0ZSArPSBieXRlc19wZXJfc2FtcGxlOwotICAgIC0tZnJhbWVzX3Blcl9jaGFubmVsOwotICB9Ci19Ci0KLXZvaWQgSW50ZXJsZWF2ZWRWZXJpZnkoc2l6ZV90IGZyYW1lc19wZXJfY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNfcGVyX3NhbXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBmaWxsX2J5dGUpIHsKLSAgd2hpbGUgKGZyYW1lc19wZXJfY2hhbm5lbCkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhbm5lbHM7ICsraSkgewotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBieXRlc19wZXJfc2FtcGxlOyArK2opIHsKLSAgICAgICAgQVNTRVJUX0VRKCpkYXRhLCBzdGF0aWNfY2FzdDx1aW50OD4oKmZpbGxfYnl0ZSArIGopKTsKLSAgICAgICAgKytkYXRhOwotICAgICAgfQotICAgIH0KLSAgICAqZmlsbF9ieXRlICs9IGJ5dGVzX3Blcl9zYW1wbGU7Ci0gICAgLS1mcmFtZXNfcGVyX2NoYW5uZWw7Ci0gIH0KLX0KLQotY2xhc3MgTW9ja1JlbmRlckNhbGxiYWNrIDogcHVibGljIG1lZGlhOjpBdWRpb1JlbmRlcmVyU2luazo6UmVuZGVyQ2FsbGJhY2sgewotIHB1YmxpYzoKLSAgTW9ja1JlbmRlckNhbGxiYWNrKCkge30KLQotICBNT0NLX01FVEhPRDIoUmVuZGVyLCBpbnQobWVkaWE6OkF1ZGlvQnVzKiwgaW50KSk7Ci0gIE1PQ0tfTUVUSE9EMyhSZW5kZXJJTywgdm9pZChtZWRpYTo6QXVkaW9CdXMqLCBtZWRpYTo6QXVkaW9CdXMqLCBpbnQpKTsKLSAgTU9DS19NRVRIT0QwKE9uUmVuZGVyRXJyb3IsIHZvaWQoKSk7Ci0gIE1PQ0tfTUVUSE9EMChTaW5rRnVsbCwgdm9pZCgpKTsKLQotICBNT0NLX01FVEhPRDAoU2lua1VuZGVyZmxvdywgdm9pZCgpKTsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTW9ja1JlbmRlckNhbGxiYWNrKTsKLX07Ci0KLWNsYXNzIFNoZWxsQXVkaW9TaW5rVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gIFNoZWxsQXVkaW9TaW5rVGVzdCgpIHsgbWVkaWE6OlNoZWxsQnVmZmVyRmFjdG9yeTo6SW5pdGlhbGl6ZSgpOyB9Ci0KLSAgdmlydHVhbCB+U2hlbGxBdWRpb1NpbmtUZXN0KCkgeyBtZWRpYTo6U2hlbGxCdWZmZXJGYWN0b3J5OjpUZXJtaW5hdGUoKTsgfQotCi0gIHZvaWQgQ29uZmlndXJlKGNvbnN0IENvbmZpZyYgY29uZmlnKSB7Ci0gICAgcmVuZGVyX2J5dGVfID0gMDsKLSAgICBjb25zdW1wdGlvbl9ieXRlXyA9IDA7Ci0gICAgcmVuZGVyX2J5dGVzX251bV8gPSAwOwotICAgIGNvbnN1bXB0aW9uX2J5dGVzX251bV8gPSAwOwotICAgIHJlbmRlcl9mcmFtZXNfcGVyX2NoYW5uZWxfID0gMDsKLSAgICBjb25zdW1wdGlvbl9mcmFtZXNfcGVyX2NoYW5uZWxfID0gMDsKLQotICAgIHNpbmtfID0gbWVkaWE6OlNoZWxsQXVkaW9TaW5rOjpDcmVhdGUoJnN0cmVhbWVyXyk7Ci0gICAgRVhQRUNUX0NBTEwoc3RyZWFtZXJfLCBHZXRDb25maWcoKSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKGNvbmZpZykpOwotICAgIEVYUEVDVF9DQUxMKHN0cmVhbWVyXywgSGFzU3RyZWFtKHNpbmtfLmdldCgpKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybihmYWxzZSkpOwotICAgIEVYUEVDVF9DQUxMKHJlbmRlcl9jYWxsYmFja18sIFJlbmRlcihfLCBfKSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKDApKTsKLSAgICBFWFBFQ1RfQ0FMTChyZW5kZXJfY2FsbGJhY2tfLCBTaW5rRnVsbCgpKS5UaW1lcyhBbnlOdW1iZXIoKSk7Ci0gICAgRVhQRUNUX0NBTEwocmVuZGVyX2NhbGxiYWNrXywgU2lua1VuZGVyZmxvdygpKS5UaW1lcyhBbnlOdW1iZXIoKSk7Ci0gIH0KLQotICB2b2lkIEZpbGxBdWRpb0J1cyhpbnQgZnJhbWVzX3Blcl9jaGFubmVsLCBtZWRpYTo6QXVkaW9CdXMqIGF1ZGlvX2J1cykgewotICAgIENvbmZpZyBjb25maWcgPSBzdHJlYW1lcl8uR2V0Q29uZmlnKCk7Ci0gICAgbWVkaWE6OkF1ZGlvUGFyYW1ldGVycyBwYXJhbXMgPSBzaW5rXy0+R2V0QXVkaW9QYXJhbWV0ZXJzKCk7Ci0gICAgaW50IGJ5dGVzX3Blcl9jaGFubmVsID0gZnJhbWVzX3Blcl9jaGFubmVsICogcGFyYW1zLmJpdHNfcGVyX3NhbXBsZSgpIC8gODsKLSAgICBpbnQgY2hhbm5lbHMgPSBwYXJhbXMuY2hhbm5lbHMoKTsKLSAgICBpZiAoY29uZmlnLmludGVybGVhdmVkKCkpIHsKLSAgICAgIGJ5dGVzX3Blcl9jaGFubmVsICo9IGNoYW5uZWxzOwotICAgIH0KLSAgICBBU1NFUlRfTEUoYnl0ZXNfcGVyX2NoYW5uZWwsIGF1ZGlvX2J1cy0+ZnJhbWVzKCkgKiBzaXplb2YoZmxvYXQpKTsKLQotICAgIGlmIChjb25maWcuaW50ZXJsZWF2ZWQoKSkgewotICAgICAgQVNTRVJUX0VRKGF1ZGlvX2J1cy0+Y2hhbm5lbHMoKSwgMSk7Ci0gICAgICBJbnRlcmxlYXZlZEZpbGwoCi0gICAgICAgICAgZnJhbWVzX3Blcl9jaGFubmVsLCBjaGFubmVscywgcGFyYW1zLmJpdHNfcGVyX3NhbXBsZSgpIC8gOCwKLSAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4oYXVkaW9fYnVzLT5jaGFubmVsKDApKSwgJnJlbmRlcl9ieXRlXyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFTU0VSVF9FUShhdWRpb19idXMtPmNoYW5uZWxzKCksIGNoYW5uZWxzKTsKLSAgICAgIHVpbnQ4IHJlbmRlcl9ieXRlOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFubmVsczsgKytpKSB7Ci0gICAgICAgIHJlbmRlcl9ieXRlID0gcmVuZGVyX2J5dGVfOwotICAgICAgICBJbnRlcmxlYXZlZEZpbGwoZnJhbWVzX3Blcl9jaGFubmVsLCAxLCBwYXJhbXMuYml0c19wZXJfc2FtcGxlKCkgLyA4LAotICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KGF1ZGlvX2J1cy0+Y2hhbm5lbChpKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAmcmVuZGVyX2J5dGUpOwotICAgICAgfQotICAgICAgcmVuZGVyX2J5dGVfID0gcmVuZGVyX2J5dGU7Ci0gICAgfQotCi0gICAgcmVuZGVyX2J5dGVzX251bV8gKz0gY2hhbm5lbHMgKiBieXRlc19wZXJfY2hhbm5lbDsKLSAgICByZW5kZXJfZnJhbWVzX3Blcl9jaGFubmVsXyArPSBmcmFtZXNfcGVyX2NoYW5uZWw7Ci0gIH0KLQotICB2b2lkIENvbnN1bWUoaW50IGZyYW1lc19wZXJfY2hhbm5lbCkgewotICAgIENvbmZpZyBjb25maWcgPSBzdHJlYW1lcl8uR2V0Q29uZmlnKCk7Ci0gICAgbWVkaWE6OkF1ZGlvUGFyYW1ldGVycyBwYXJhbXMgPSBzaW5rXy0+R2V0QXVkaW9QYXJhbWV0ZXJzKCk7Ci0gICAgbWVkaWE6OkF1ZGlvU2lua1NldHRpbmdzIHNldHRpbmdzOwotICAgIG1lZGlhOjpBdWRpb0J1cyogYXVkaW9fYnVzID0gc2lua18tPkdldEF1ZGlvQnVzKCk7Ci0gICAgaW50IGJ5dGVzX3Blcl9jaGFubmVsID0gZnJhbWVzX3Blcl9jaGFubmVsICogcGFyYW1zLmJpdHNfcGVyX3NhbXBsZSgpIC8gODsKLQotICAgIHNldHRpbmdzLlJlc2V0KGNvbmZpZywgcGFyYW1zKTsKLSAgICBpZiAoY29uZmlnLmludGVybGVhdmVkKCkpIHsKLSAgICAgIGJ5dGVzX3Blcl9jaGFubmVsICo9IHNldHRpbmdzLmNoYW5uZWxzKCk7Ci0gICAgfQotICAgIEFTU0VSVF9MRShieXRlc19wZXJfY2hhbm5lbCwgYXVkaW9fYnVzLT5mcmFtZXMoKSAqIHNpemVvZihmbG9hdCkpOwotCi0gICAgdWludDMyX3Qgb2Zmc2V0X2luX2ZyYW1lLCB0b3RhbF9mcmFtZXM7Ci0gICAgRVhQRUNUX0NBTEwocmVuZGVyX2NhbGxiYWNrXywgUmVuZGVyKF8sIF8pKS5XaWxsT25jZShSZXR1cm4oMCkpOwotICAgIHNpbmtfLT5QdWxsRnJhbWVzKCZvZmZzZXRfaW5fZnJhbWUsICZ0b3RhbF9mcmFtZXMpOwotCi0gICAgRVhQRUNUX0xFKGZyYW1lc19wZXJfY2hhbm5lbCwgdG90YWxfZnJhbWVzKTsKLQotICAgIGludCBmcmFtZXNfdG9fcmVxdWVzdCA9Ci0gICAgICAgIHN0ZDo6bWluPGludD4oZnJhbWVzX3Blcl9jaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLnBlcl9jaGFubmVsX2ZyYW1lcyhhdWRpb19idXMpIC0gb2Zmc2V0X2luX2ZyYW1lKTsKLSAgICBpZiAoY29uZmlnLmludGVybGVhdmVkKCkpIHsKLSAgICAgIEFTU0VSVF9FUShhdWRpb19idXMtPmNoYW5uZWxzKCksIDEpOwotICAgICAgdWludDgqIGRhdGEgPQotICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihhdWRpb19idXMtPmNoYW5uZWwoMCkpICsKLSAgICAgICAgICBvZmZzZXRfaW5fZnJhbWUgKiBwYXJhbXMuYml0c19wZXJfc2FtcGxlKCkgLyA4ICogc2V0dGluZ3MuY2hhbm5lbHMoKTsKLSAgICAgIEludGVybGVhdmVkVmVyaWZ5KGZyYW1lc190b19yZXF1ZXN0LCBzZXR0aW5ncy5jaGFubmVscygpLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmJpdHNfcGVyX3NhbXBsZSgpIC8gOCwgZGF0YSwgJmNvbnN1bXB0aW9uX2J5dGVfKTsKLSAgICB9IGVsc2UgewotICAgICAgQVNTRVJUX0VRKGF1ZGlvX2J1cy0+Y2hhbm5lbHMoKSwgc2V0dGluZ3MuY2hhbm5lbHMoKSk7Ci0gICAgICB1aW50OCBjb25zdW1wdGlvbl9ieXRlOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXR0aW5ncy5jaGFubmVscygpOyArK2kpIHsKLSAgICAgICAgY29uc3VtcHRpb25fYnl0ZSA9IGNvbnN1bXB0aW9uX2J5dGVfOwotICAgICAgICB1aW50OCogZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihhdWRpb19idXMtPmNoYW5uZWwoaSkpICsKLSAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfaW5fZnJhbWUgKiBwYXJhbXMuYml0c19wZXJfc2FtcGxlKCkgLyA4OwotICAgICAgICBJbnRlcmxlYXZlZFZlcmlmeShmcmFtZXNfdG9fcmVxdWVzdCwgMSwgcGFyYW1zLmJpdHNfcGVyX3NhbXBsZSgpIC8gOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgJmNvbnN1bXB0aW9uX2J5dGUpOwotICAgICAgfQotICAgICAgY29uc3VtcHRpb25fYnl0ZV8gPSBjb25zdW1wdGlvbl9ieXRlOwotICAgIH0KLQotICAgIGZyYW1lc190b19yZXF1ZXN0ID0gZnJhbWVzX3Blcl9jaGFubmVsIC0gZnJhbWVzX3RvX3JlcXVlc3Q7Ci0gICAgaWYgKGZyYW1lc190b19yZXF1ZXN0ICE9IDApIHsKLSAgICAgIGlmIChjb25maWcuaW50ZXJsZWF2ZWQoKSkgewotICAgICAgICBBU1NFUlRfRVEoYXVkaW9fYnVzLT5jaGFubmVscygpLCAxKTsKLSAgICAgICAgdWludDgqIGRhdGEgPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4oYXVkaW9fYnVzLT5jaGFubmVsKDApKTsKLSAgICAgICAgSW50ZXJsZWF2ZWRWZXJpZnkoZnJhbWVzX3RvX3JlcXVlc3QsIHNldHRpbmdzLmNoYW5uZWxzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5iaXRzX3Blcl9zYW1wbGUoKSAvIDgsIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZjb25zdW1wdGlvbl9ieXRlXyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBBU1NFUlRfRVEoYXVkaW9fYnVzLT5jaGFubmVscygpLCBzZXR0aW5ncy5jaGFubmVscygpKTsKLSAgICAgICAgdWludDggY29uc3VtcHRpb25fYnl0ZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXR0aW5ncy5jaGFubmVscygpOyArK2kpIHsKLSAgICAgICAgICBjb25zdW1wdGlvbl9ieXRlID0gY29uc3VtcHRpb25fYnl0ZV87Ci0gICAgICAgICAgdWludDgqIGRhdGEgPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4oYXVkaW9fYnVzLT5jaGFubmVsKGkpKTsKLSAgICAgICAgICBJbnRlcmxlYXZlZFZlcmlmeShmcmFtZXNfdG9fcmVxdWVzdCwgMSwgcGFyYW1zLmJpdHNfcGVyX3NhbXBsZSgpIC8gOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCAmY29uc3VtcHRpb25fYnl0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3VtcHRpb25fYnl0ZV8gPSBjb25zdW1wdGlvbl9ieXRlOwotICAgICAgfQotICAgIH0KLQotICAgIHNpbmtfLT5Db25zdW1lRnJhbWVzKGZyYW1lc19wZXJfY2hhbm5lbCk7Ci0KLSAgICBjb25zdW1wdGlvbl9ieXRlc19udW1fICs9IHNldHRpbmdzLmNoYW5uZWxzKCkgKiBieXRlc19wZXJfY2hhbm5lbDsKLSAgICBjb25zdW1wdGlvbl9mcmFtZXNfcGVyX2NoYW5uZWxfICs9IGZyYW1lc19wZXJfY2hhbm5lbDsKLSAgfQotCi0gIGJvb2wgQWxsQ29uc3VtZWQoKSB7Ci0gICAgdWludDMyX3Qgb2Zmc2V0X2luX2ZyYW1lLCB0b3RhbF9mcmFtZXM7Ci0gICAgRVhQRUNUX0NBTEwocmVuZGVyX2NhbGxiYWNrXywgUmVuZGVyKF8sIF8pKQotICAgICAgICAuVGltZXMoQXRMZWFzdCgwKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybigwKSk7Ci0gICAgc2lua18tPlB1bGxGcmFtZXMoJm9mZnNldF9pbl9mcmFtZSwgJnRvdGFsX2ZyYW1lcyk7Ci0KLSAgICByZXR1cm4gdG90YWxfZnJhbWVzID09IDAgJiYgcmVuZGVyX2J5dGVfID09IGNvbnN1bXB0aW9uX2J5dGVfICYmCi0gICAgICAgICAgIHJlbmRlcl9ieXRlc19udW1fID09IGNvbnN1bXB0aW9uX2J5dGVzX251bV8gJiYKLSAgICAgICAgICAgcmVuZGVyX2ZyYW1lc19wZXJfY2hhbm5lbF8gPT0gY29uc3VtcHRpb25fZnJhbWVzX3Blcl9jaGFubmVsXzsKLSAgfQotCi0gIC8vID09PT0gVGVzdCBGaXh0dXJlIE1lbWJlcnMKLSAgbWVkaWE6Ok1vY2tTaGVsbEF1ZGlvU3RyZWFtZXIgc3RyZWFtZXJfOwotICBNb2NrUmVuZGVyQ2FsbGJhY2sgcmVuZGVyX2NhbGxiYWNrXzsKLSAgc2NvcGVkX3JlZnB0cjxtZWRpYTo6U2hlbGxBdWRpb1Npbms+IHNpbmtfOwotCi0gIHVpbnQ4IHJlbmRlcl9ieXRlXzsKLSAgdWludDggY29uc3VtcHRpb25fYnl0ZV87Ci0gIGludCByZW5kZXJfYnl0ZXNfbnVtXzsKLSAgaW50IGNvbnN1bXB0aW9uX2J5dGVzX251bV87Ci0gIGludCByZW5kZXJfZnJhbWVzX3Blcl9jaGFubmVsXzsKLSAgaW50IGNvbnN1bXB0aW9uX2ZyYW1lc19wZXJfY2hhbm5lbF87Ci19OwotCi0vLyBWZXJpZnkgdGhlIGZyYW1lIGNvdW50IG9mIGF1ZGlvX2J1cwotQUNUSU9OX1AzKFZlcmlmeUF1ZGlvQnVzRnJhbWVDb3VudCwgY29uZmlnLCBpbml0X3BhcmFtcywgZnJhbWVzX3Blcl9jaGFubmVsKSB7Ci0gIG1lZGlhOjpBdWRpb0J1cyogYXVkaW9fYnVzID0gYXJnMDsKLSAgaW50IGJ5dGVzX3Blcl9jaGFubmVsID0KLSAgICAgIGZyYW1lc19wZXJfY2hhbm5lbCAqIGluaXRfcGFyYW1zLmJpdHNfcGVyX3NhbXBsZSgpIC8gODsKLSAgaWYgKGNvbmZpZy5pbnRlcmxlYXZlZCgpKSB7Ci0gICAgaW50IGNoYW5uZWxzID0gaW5pdF9wYXJhbXMuY2hhbm5lbHMoKTsKLSAgICBieXRlc19wZXJfY2hhbm5lbCAqPSBjaGFubmVsczsKLSAgfQotICBFWFBFQ1RfRVEoYnl0ZXNfcGVyX2NoYW5uZWwsIGF1ZGlvX2J1cy0+ZnJhbWVzKCkgKiBzaXplb2YoZmxvYXQpKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIFZlcmlmeSB0aGUgZnJhbWUgY291bnQgb2YgYXVkaW9fYnVzCi1BQ1RJT05fUDIoUmVuZGVyQXVkaW9CdXMsIGZyYW1lc19wZXJfY2hhbm5lbCwgc2lua190ZXN0KSB7Ci0gIG1lZGlhOjpBdWRpb0J1cyogYXVkaW9fYnVzID0gYXJnMDsKLSAgc2lua190ZXN0LT5GaWxsQXVkaW9CdXMoZnJhbWVzX3Blcl9jaGFubmVsLCBhdWRpb19idXMpOwotICByZXR1cm4gZnJhbWVzX3Blcl9jaGFubmVsOwotfQotCi1URVNUX0YoU2hlbGxBdWRpb1NpbmtUZXN0LCBQcmVyZXF1aXNpdGVzKSB7Ci0gIHVpbnQ4IGRhdGFbNDgwMDBdID0gezB9OwotICB1aW50OCByZW5kZXJfYnl0ZSA9IDAsIGNvbnN1bWVfYnl0ZSA9IDA7Ci0gIHVpbnQ4IHZlcmlmeV9kYXRhW10gPSB7MHgwMCwgMHgwMSwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAweDAzLCAweDA0LCAweDA1LCAweDAzLCAweDA0LCAweDA1LCAweDAzLCAweDA0LCAweDA1fTsKLSAgSW50ZXJsZWF2ZWRGaWxsKDIsIDMsIDMsIGRhdGEsICZyZW5kZXJfYnl0ZSk7Ci0gIEVYUEVDVF9FUShtZW1jbXAodmVyaWZ5X2RhdGEsIGRhdGEsIDkpLCAwKTsKLSAgRVhQRUNUX0VRKG1lbWNtcChkYXRhICsgMTgsIGRhdGEgKyAxOSwgMTAyNCksIDApOwotCi0gIGZvciAoc2l6ZV90IGZyYW1lc19wZXJfY2hhbm5lbCA9IDE7IGZyYW1lc19wZXJfY2hhbm5lbCA8IDMwMTsKLSAgICAgICBmcmFtZXNfcGVyX2NoYW5uZWwgKz0gMykgewotICAgIGZvciAoaW50IGNoYW5uZWxzID0gMTsgY2hhbm5lbHMgPCA1OyArK2NoYW5uZWxzKSB7Ci0gICAgICBmb3IgKGludCBieXRlc19wZXJfc2FtcGxlID0gMTsgYnl0ZXNfcGVyX3NhbXBsZSA8IDU7ICsrYnl0ZXNfcGVyX3NhbXBsZSkgewotICAgICAgICByZW5kZXJfYnl0ZSA9IGNvbnN1bWVfYnl0ZSA9IDA7Ci0gICAgICAgIEludGVybGVhdmVkRmlsbChmcmFtZXNfcGVyX2NoYW5uZWwsIGNoYW5uZWxzLCBieXRlc19wZXJfc2FtcGxlLCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgJnJlbmRlcl9ieXRlKTsKLSAgICAgICAgSW50ZXJsZWF2ZWRWZXJpZnkoZnJhbWVzX3Blcl9jaGFubmVsLCBjaGFubmVscywgYnl0ZXNfcGVyX3NhbXBsZSwgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnN1bWVfYnl0ZSk7Ci0gICAgICAgIEFTU0VSVF9FUShyZW5kZXJfYnl0ZSwgY29uc3VtZV9ieXRlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotVEVTVF9GKFNoZWxsQXVkaW9TaW5rVGVzdCwgSW5pdGlhbGl6ZSkgewotICBjb25zdCB1aW50MzIgaW5pdGlhbF9yZWJ1ZmZlcmluZ19mcmFtZXNfcGVyX2NoYW5uZWwgPSAyMDQ4OwotICBjb25zdCB1aW50MzIgc2lua19idWZmZXJfc2l6ZV9pbl9mcmFtZXNfcGVyX2NoYW5uZWwgPSA4MTkyOwotCi0gIC8vIDIgY29uZmlndXJhdGlvbnMgd2l0aCBkaWZmZXJlbnQgaW50ZXJsZWF2ZWQKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLSAgICBmb3IgKG1lZGlhOjpDaGFubmVsTGF5b3V0IGxheW91dCA9IG1lZGlhOjpDSEFOTkVMX0xBWU9VVF9NT05POwotICAgICAgICAgbGF5b3V0ICE9IG1lZGlhOjpDSEFOTkVMX0xBWU9VVF9NQVg7Ci0gICAgICAgICBsYXlvdXQgPSBzdGF0aWNfY2FzdDxtZWRpYTo6Q2hhbm5lbExheW91dD4obGF5b3V0ICsgMSkpIHsKLSAgICAgIGZvciAoaW50IGJ5dGVzX3Blcl9zYW1wbGUgPSAyOyBieXRlc19wZXJfc2FtcGxlIDwgNTsKLSAgICAgICAgICAgYnl0ZXNfcGVyX3NhbXBsZSAqPSAyKSB7Ci0gICAgICAgIENvbmZpZyBjb25maWcoaSA9PSAwID8gQ29uZmlnOjpJTlRFUkxFQVZFRCA6IENvbmZpZzo6UExBTkFSLAotICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfcmVidWZmZXJpbmdfZnJhbWVzX3Blcl9jaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgIHNpbmtfYnVmZmVyX3NpemVfaW5fZnJhbWVzX3Blcl9jaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgIGtNYXhIYXJkd2FyZUNoYW5uZWxzU3RlcmVvLCBieXRlc19wZXJfc2FtcGxlLAotICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwIC8qIG91dHB1dF9zYW1wbGVfcmF0ZSAqLyk7Ci0KLSAgICAgICAgQ29uZmlndXJlKGNvbmZpZyk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKCFzaW5rXy0+R2V0QXVkaW9CdXMoKSk7Ci0gICAgICAgIG1lZGlhOjpBdWRpb1BhcmFtZXRlcnMgaW5pdF9wYXJhbXMgPSBtZWRpYTo6QXVkaW9QYXJhbWV0ZXJzKAotICAgICAgICAgICAgbWVkaWE6OkF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xPV19MQVRFTkNZLCBsYXlvdXQsIDQ4MDAwLAotICAgICAgICAgICAgYnl0ZXNfcGVyX3NhbXBsZSAqIDgsIDEwMjQpOwotICAgICAgICBzaW5rXy0+SW5pdGlhbGl6ZShpbml0X3BhcmFtcywgJnJlbmRlcl9jYWxsYmFja18pOwotCi0gICAgICAgIEVYUEVDVF9UUlVFKHNpbmtfLT5QYXVzZVJlcXVlc3RlZCgpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoc2lua18tPkdldEF1ZGlvQnVzKCkpOwotCi0gICAgICAgIG1lZGlhOjpBdWRpb0J1cyogYXVkaW9fYnVzID0gc2lua18tPkdldEF1ZGlvQnVzKCk7Ci0gICAgICAgIG1lZGlhOjpBdWRpb1BhcmFtZXRlcnMgcGFyYW1zID0gc2lua18tPkdldEF1ZGlvUGFyYW1ldGVycygpOwotICAgICAgICBpbnQgZXhwZWN0ZWRfY2hhbm5lbHMgPSBpbml0X3BhcmFtcy5jaGFubmVscygpOwotICAgICAgICBpZiAoY29uZmlnLmludGVybGVhdmVkKCkpIHsKLSAgICAgICAgICBFWFBFQ1RfRVEoYXVkaW9fYnVzLT5jaGFubmVscygpLCAxKTsKLSAgICAgICAgICBFWFBFQ1RfRVEoYXVkaW9fYnVzLT5mcmFtZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNpbmtfYnVmZmVyX3NpemVfaW5fZnJhbWVzX3Blcl9jaGFubmVsKCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfY2hhbm5lbHMgKiBieXRlc19wZXJfc2FtcGxlIC8gc2l6ZW9mKGZsb2F0KSk7Ci0gICAgICAgICAgRVhQRUNUX0VRKHBhcmFtcy5jaGFubmVscygpLCBpbml0X3BhcmFtcy5jaGFubmVscygpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBFWFBFQ1RfRVEoYXVkaW9fYnVzLT5jaGFubmVscygpLCBleHBlY3RlZF9jaGFubmVscyk7Ci0gICAgICAgICAgRVhQRUNUX0VRKGF1ZGlvX2J1cy0+ZnJhbWVzKCksCi0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zaW5rX2J1ZmZlcl9zaXplX2luX2ZyYW1lc19wZXJfY2hhbm5lbCgpICoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3Blcl9zYW1wbGUgLyBzaXplb2YoZmxvYXQpKTsKLSAgICAgICAgICBFWFBFQ1RfRVEocGFyYW1zLmNoYW5uZWxzKCksIGluaXRfcGFyYW1zLmNoYW5uZWxzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgRVhQRUNUX0VRKHBhcmFtcy5iaXRzX3Blcl9zYW1wbGUoKSwgaW5pdF9wYXJhbXMuYml0c19wZXJfc2FtcGxlKCkpOwotICAgICAgICBFWFBFQ1RfRVEocGFyYW1zLnNhbXBsZV9yYXRlKCksIGluaXRfcGFyYW1zLnNhbXBsZV9yYXRlKCkpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1URVNUX0YoU2hlbGxBdWRpb1NpbmtUZXN0LCBTdGFydEFuZFN0b3ApIHsKLSAgY29uc3QgdWludDMyIGluaXRpYWxfcmVidWZmZXJpbmdfZnJhbWVzX3Blcl9jaGFubmVsID0gMjA0ODsKLSAgY29uc3QgdWludDMyIHNpbmtfYnVmZmVyX3NpemVfaW5fZnJhbWVzX3Blcl9jaGFubmVsID0gODE5MjsKLQotICBDb25maWcgY29uZmlnKAotICAgICAgQ29uZmlnOjpJTlRFUkxFQVZFRCwgaW5pdGlhbF9yZWJ1ZmZlcmluZ19mcmFtZXNfcGVyX2NoYW5uZWwsCi0gICAgICBzaW5rX2J1ZmZlcl9zaXplX2luX2ZyYW1lc19wZXJfY2hhbm5lbCwga01heEhhcmR3YXJlQ2hhbm5lbHNTdGVyZW8sCi0gICAgICBzaXplb2YoaW50MTZfdCkgLyogYnl0ZXNfcGVyX3NhbXBsZSAqLywgNDgwMDAgLyogb3V0cHV0X3NhbXBsZV9yYXRlICovKTsKLQotICBtZWRpYTo6QXVkaW9QYXJhbWV0ZXJzIGluaXRfcGFyYW1zID0KLSAgICAgIG1lZGlhOjpBdWRpb1BhcmFtZXRlcnMobWVkaWE6OkF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xPV19MQVRFTkNZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6Q0hBTk5FTF9MQVlPVVRfTU9OTywgNDgwMDAsIDE2LCAxMDI0KTsKLQotICBDb25maWd1cmUoY29uZmlnKTsKLQotICBzaW5rXy0+SW5pdGlhbGl6ZShpbml0X3BhcmFtcywgJnJlbmRlcl9jYWxsYmFja18pOwotCi0gIEluU2VxdWVuY2Ugc2VxOwotICBFWFBFQ1RfQ0FMTChzdHJlYW1lcl8sIEhhc1N0cmVhbShzaW5rXy5nZXQoKSkpLldpbGxSZXBlYXRlZGx5KFJldHVybihmYWxzZSkpOwotICBFWFBFQ1RfQ0FMTChzdHJlYW1lcl8sIEFkZFN0cmVhbShzaW5rXy5nZXQoKSkpLldpbGxPbmNlKFJldHVybih0cnVlKSk7Ci0gIEVYUEVDVF9DQUxMKHN0cmVhbWVyXywgSGFzU3RyZWFtKHNpbmtfLmdldCgpKSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKHRydWUpKTsKLSAgc2lua18tPlN0YXJ0KCk7Ci0gIEVYUEVDVF9UUlVFKHNpbmtfLT5QYXVzZVJlcXVlc3RlZCgpKTsKLSAgRVhQRUNUX0NBTEwoc3RyZWFtZXJfLCBSZW1vdmVTdHJlYW0oc2lua18uZ2V0KCkpKS5XaWxsT25jZShSZXR1cm4oKSk7Ci0gIEVYUEVDVF9DQUxMKHN0cmVhbWVyXywgSGFzU3RyZWFtKHNpbmtfLmdldCgpKSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKGZhbHNlKSk7Ci0gIHNpbmtfLT5TdG9wKCk7Ci0gIEVYUEVDVF9UUlVFKHNpbmtfLT5QYXVzZVJlcXVlc3RlZCgpKTsKLX0KLQotVEVTVF9GKFNoZWxsQXVkaW9TaW5rVGVzdCwgUmVuZGVyTm9GcmFtZXMpIHsKLSAgY29uc3QgdWludDMyIGluaXRpYWxfcmVidWZmZXJpbmdfZnJhbWVzX3Blcl9jaGFubmVsID0gMjA0ODsKLSAgY29uc3QgdWludDMyIHNpbmtfYnVmZmVyX3NpemVfaW5fZnJhbWVzX3Blcl9jaGFubmVsID0gODE5MjsKLQotICBDb25maWcgY29uZmlnKAotICAgICAgQ29uZmlnOjpJTlRFUkxFQVZFRCwgaW5pdGlhbF9yZWJ1ZmZlcmluZ19mcmFtZXNfcGVyX2NoYW5uZWwsCi0gICAgICBzaW5rX2J1ZmZlcl9zaXplX2luX2ZyYW1lc19wZXJfY2hhbm5lbCwga01heEhhcmR3YXJlQ2hhbm5lbHNTdGVyZW8sCi0gICAgICBzaXplb2YoaW50MTZfdCkgLyogYnl0ZXNfcGVyX3NhbXBsZSAqLywgNDgwMDAgLyogb3V0cHV0X3NhbXBsZV9yYXRlICovKTsKLQotICBDb25maWd1cmUoY29uZmlnKTsKLQotICBtZWRpYTo6QXVkaW9QYXJhbWV0ZXJzIGluaXRfcGFyYW1zID0KLSAgICAgIG1lZGlhOjpBdWRpb1BhcmFtZXRlcnMobWVkaWE6OkF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xPV19MQVRFTkNZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6Q0hBTk5FTF9MQVlPVVRfTU9OTywgNDgwMDAsIDE2LCAxMDI0KTsKLQotICBzaW5rXy0+SW5pdGlhbGl6ZShpbml0X3BhcmFtcywgJnJlbmRlcl9jYWxsYmFja18pOwotCi0gIEluU2VxdWVuY2Ugc2VxOwotICBFWFBFQ1RfQ0FMTChzdHJlYW1lcl8sIEhhc1N0cmVhbShzaW5rXy5nZXQoKSkpLldpbGxSZXBlYXRlZGx5KFJldHVybihmYWxzZSkpOwotICBFWFBFQ1RfQ0FMTChzdHJlYW1lcl8sIEFkZFN0cmVhbShzaW5rXy5nZXQoKSkpLldpbGxPbmNlKFJldHVybih0cnVlKSk7Ci0gIEVYUEVDVF9DQUxMKHN0cmVhbWVyXywgSGFzU3RyZWFtKHNpbmtfLmdldCgpKSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKHRydWUpKTsKLSAgc2lua18tPlN0YXJ0KCk7Ci0KLSAgRVhQRUNUX0ZBTFNFKHNpbmtfLT5QdWxsRnJhbWVzKE5VTEwsIE5VTEwpKTsKLSAgdWludDMyX3Qgb2Zmc2V0X2luX2ZyYW1lLCB0b3RhbF9mcmFtZXM7Ci0gIEVYUEVDVF9GQUxTRShzaW5rXy0+UHVsbEZyYW1lcygmb2Zmc2V0X2luX2ZyYW1lLCAmdG90YWxfZnJhbWVzKSk7Ci0KLSAgRVhQRUNUX0NBTEwoc3RyZWFtZXJfLCBSZW1vdmVTdHJlYW0oc2lua18uZ2V0KCkpKS5XaWxsT25jZShSZXR1cm4oKSk7Ci0gIEVYUEVDVF9DQUxMKHN0cmVhbWVyXywgSGFzU3RyZWFtKHNpbmtfLmdldCgpKSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKGZhbHNlKSk7Ci0gIHNpbmtfLT5TdG9wKCk7Ci19Ci0KLVRFU1RfRihTaGVsbEF1ZGlvU2lua1Rlc3QsIFJlbmRlckZyYW1lcykgewotICBjb25zdCB1aW50MzIgaW5pdGlhbF9yZWJ1ZmZlcmluZ19mcmFtZXNfcGVyX2NoYW5uZWwgPSAyMDQ4OwotICBjb25zdCB1aW50MzIgc2lua19idWZmZXJfc2l6ZV9pbl9mcmFtZXNfcGVyX2NoYW5uZWwgPSA4MTkyOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7Ci0gICAgQ29uZmlnIGNvbmZpZygKLSAgICAgICAgaSA9PSAwID8gQ29uZmlnOjpJTlRFUkxFQVZFRCA6IENvbmZpZzo6UExBTkFSLAotICAgICAgICBpbml0aWFsX3JlYnVmZmVyaW5nX2ZyYW1lc19wZXJfY2hhbm5lbCwKLSAgICAgICAgc2lua19idWZmZXJfc2l6ZV9pbl9mcmFtZXNfcGVyX2NoYW5uZWwsIGtNYXhIYXJkd2FyZUNoYW5uZWxzU3RlcmVvLAotICAgICAgICBzaXplb2YoaW50MTZfdCkgLyogYnl0ZXNfcGVyX3NhbXBsZSAqLywgNDgwMDAgLyogb3V0cHV0X3NhbXBsZV9yYXRlICovKTsKLQotICAgIENvbmZpZ3VyZShjb25maWcpOwotCi0gICAgbWVkaWE6OkF1ZGlvUGFyYW1ldGVycyBpbml0X3BhcmFtcyA9Ci0gICAgICAgIG1lZGlhOjpBdWRpb1BhcmFtZXRlcnMobWVkaWE6OkF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xPV19MQVRFTkNZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpDSEFOTkVMX0xBWU9VVF9NT05PLCA0ODAwMCwgMTYsIDEwMjQpOwotCi0gICAgc2lua18tPkluaXRpYWxpemUoaW5pdF9wYXJhbXMsICZyZW5kZXJfY2FsbGJhY2tfKTsKLQotICAgIEluU2VxdWVuY2Ugc2VxOwotICAgIEVYUEVDVF9DQUxMKHN0cmVhbWVyXywgSGFzU3RyZWFtKHNpbmtfLmdldCgpKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybihmYWxzZSkpOwotICAgIEVYUEVDVF9DQUxMKHN0cmVhbWVyXywgQWRkU3RyZWFtKHNpbmtfLmdldCgpKSkuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKLSAgICBFWFBFQ1RfQ0FMTChzdHJlYW1lcl8sIEhhc1N0cmVhbShzaW5rXy5nZXQoKSkpLldpbGxSZXBlYXRlZGx5KFJldHVybih0cnVlKSk7Ci0gICAgc2lua18tPlN0YXJ0KCk7Ci0KLSAgICBFWFBFQ1RfQ0FMTChyZW5kZXJfY2FsbGJhY2tfLCBSZW5kZXIoXywgXykpCi0gICAgICAgIC5XaWxsT25jZShSZW5kZXJBdWRpb0J1cygxNiwgdGhpcykpOwotICAgIEVYUEVDVF9GQUxTRShzaW5rXy0+UHVsbEZyYW1lcyhOVUxMLCBOVUxMKSk7Ci0KLSAgICB1aW50MzJfdCBvZmZzZXRfaW5fZnJhbWUsIHRvdGFsX2ZyYW1lczsKLSAgICBFWFBFQ1RfQ0FMTChyZW5kZXJfY2FsbGJhY2tfLCBSZW5kZXIoXywgXykpLldpbGxPbmNlKFJldHVybigwKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKHNpbmtfLT5QdWxsRnJhbWVzKCZvZmZzZXRfaW5fZnJhbWUsICZ0b3RhbF9mcmFtZXMpKTsKLSAgICBFWFBFQ1RfRVEob2Zmc2V0X2luX2ZyYW1lLCAwKTsKLSAgICBFWFBFQ1RfRVEodG90YWxfZnJhbWVzLCAxNik7Ci0KLSAgICBFWFBFQ1RfQ0FMTChyZW5kZXJfY2FsbGJhY2tfLCBSZW5kZXIoXywgXykpCi0gICAgICAgIC5XaWxsT25jZShSZW5kZXJBdWRpb0J1cyg4LCB0aGlzKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKHNpbmtfLT5QdWxsRnJhbWVzKCZvZmZzZXRfaW5fZnJhbWUsICZ0b3RhbF9mcmFtZXMpKTsKLSAgICBFWFBFQ1RfRVEob2Zmc2V0X2luX2ZyYW1lLCAwKTsKLSAgICBFWFBFQ1RfRVEodG90YWxfZnJhbWVzLCAyNCk7Ci0KLSAgICBDb25zdW1lKDgpOwotCi0gICAgRVhQRUNUX0NBTEwocmVuZGVyX2NhbGxiYWNrXywgUmVuZGVyKF8sIF8pKS5XaWxsT25jZShSZXR1cm4oMCkpOwotICAgIEVYUEVDVF9GQUxTRShzaW5rXy0+UHVsbEZyYW1lcygmb2Zmc2V0X2luX2ZyYW1lLCAmdG90YWxfZnJhbWVzKSk7Ci0gICAgRVhQRUNUX0VRKG9mZnNldF9pbl9mcmFtZSwgOCk7Ci0gICAgRVhQRUNUX0VRKHRvdGFsX2ZyYW1lcywgMTYpOwotCi0gICAgQ29uc3VtZSgxNik7Ci0KLSAgICBFWFBFQ1RfVFJVRShBbGxDb25zdW1lZCgpKTsKLQotICAgIEVYUEVDVF9DQUxMKHN0cmVhbWVyXywgSGFzU3RyZWFtKHNpbmtfLmdldCgpKSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKHRydWUpKTsKLSAgICBFWFBFQ1RfQ0FMTChzdHJlYW1lcl8sIFJlbW92ZVN0cmVhbShzaW5rXy5nZXQoKSkpLldpbGxPbmNlKFJldHVybigpKTsKLSAgICBFWFBFQ1RfQ0FMTChzdHJlYW1lcl8sIEhhc1N0cmVhbShzaW5rXy5nZXQoKSkpCi0gICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oZmFsc2UpKTsKLSAgICBzaW5rXy0+U3RvcCgpOwotICB9Ci19Ci0KLVRFU1RfRihTaGVsbEF1ZGlvU2lua1Rlc3QsIFJlbmRlclJlcXVlc3RTaXplQWthQXVkaW9CdXNGcmFtZXMpIHsKLSAgY29uc3QgdWludDMyIGluaXRpYWxfcmVidWZmZXJpbmdfZnJhbWVzX3Blcl9jaGFubmVsID0gMjA0ODsKLSAgY29uc3QgdWludDMyIHNpbmtfYnVmZmVyX3NpemVfaW5fZnJhbWVzX3Blcl9jaGFubmVsID0gMjA0ODsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewotICAgIENvbmZpZyBjb25maWcoCi0gICAgICAgIGkgPT0gMCA/IENvbmZpZzo6SU5URVJMRUFWRUQgOiBDb25maWc6OlBMQU5BUiwKLSAgICAgICAgaW5pdGlhbF9yZWJ1ZmZlcmluZ19mcmFtZXNfcGVyX2NoYW5uZWwsCi0gICAgICAgIHNpbmtfYnVmZmVyX3NpemVfaW5fZnJhbWVzX3Blcl9jaGFubmVsLCBrTWF4SGFyZHdhcmVDaGFubmVsc1N0ZXJlbywKLSAgICAgICAgc2l6ZW9mKGludDE2X3QpIC8qIGJ5dGVzX3Blcl9zYW1wbGUgKi8sIDQ4MDAwIC8qIG91dHB1dF9zYW1wbGVfcmF0ZSAqLyk7Ci0gICAgQ29uZmlndXJlKGNvbmZpZyk7Ci0KLSAgICBtZWRpYTo6QXVkaW9QYXJhbWV0ZXJzIGluaXRfcGFyYW1zID0KLSAgICAgICAgbWVkaWE6OkF1ZGlvUGFyYW1ldGVycyhtZWRpYTo6QXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTE9XX0xBVEVOQ1ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkNIQU5ORUxfTEFZT1VUX01PTk8sIDQ4MDAwLCAxNiwgMTAyNCk7Ci0KLSAgICBzaW5rXy0+SW5pdGlhbGl6ZShpbml0X3BhcmFtcywgJnJlbmRlcl9jYWxsYmFja18pOwotCi0gICAgSW5TZXF1ZW5jZSBzZXE7Ci0gICAgRVhQRUNUX0NBTEwoc3RyZWFtZXJfLCBIYXNTdHJlYW0oc2lua18uZ2V0KCkpKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKGZhbHNlKSk7Ci0gICAgRVhQRUNUX0NBTEwoc3RyZWFtZXJfLCBBZGRTdHJlYW0oc2lua18uZ2V0KCkpKS5XaWxsT25jZShSZXR1cm4odHJ1ZSkpOwotICAgIEVYUEVDVF9DQUxMKHN0cmVhbWVyXywgSGFzU3RyZWFtKHNpbmtfLmdldCgpKSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKHRydWUpKTsKLSAgICBzaW5rXy0+U3RhcnQoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkgewotICAgICAgLy8gVHJ5IHRvIGdldCAxMDI0IGZyYW1lcyBidXQgZG9uJ3QgZ2l2ZSBpdCBhbnkgZGF0YQotICAgICAgRVhQRUNUX0NBTEwocmVuZGVyX2NhbGxiYWNrXywgUmVuZGVyKF8sIF8pKQotICAgICAgICAgIC5XaWxsT25jZShWZXJpZnlBdWRpb0J1c0ZyYW1lQ291bnQoY29uZmlnLCBpbml0X3BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtGcmFtZXNQZXJBY2Nlc3NVbml0KSk7Ci0gICAgICBFWFBFQ1RfRkFMU0Uoc2lua18tPlB1bGxGcmFtZXMoTlVMTCwgTlVMTCkpOwotCi0gICAgICAvLyBPaywgbm93IGdpdmUgaXQgMTAyNCBmcmFtZXMKLSAgICAgIEVYUEVDVF9DQUxMKHJlbmRlcl9jYWxsYmFja18sIFJlbmRlcihfLCBfKSkKLSAgICAgICAgICAuV2lsbE9uY2UoUmVuZGVyQXVkaW9CdXMoMTAyNCwgdGhpcykpOwotICAgICAgRVhQRUNUX0ZBTFNFKHNpbmtfLT5QdWxsRnJhbWVzKE5VTEwsIE5VTEwpKTsKLQotICAgICAgLy8gVHJ5IHRvIGdldCBhbm90aGVyIDEwMjQgZnJhbWVzIGJ1dCBkb24ndCBnaXZlIGl0IGFueSBkYXRhCi0gICAgICBFWFBFQ1RfQ0FMTChyZW5kZXJfY2FsbGJhY2tfLCBSZW5kZXIoXywgXykpCi0gICAgICAgICAgLldpbGxPbmNlKFZlcmlmeUF1ZGlvQnVzRnJhbWVDb3VudChjb25maWcsIGluaXRfcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ZyYW1lc1BlckFjY2Vzc1VuaXQpKTsKLSAgICAgIEVYUEVDVF9GQUxTRShzaW5rXy0+UHVsbEZyYW1lcyhOVUxMLCBOVUxMKSk7Ci0KLSAgICAgIC8vIE9rLCBub3cgZ2l2ZSBpdCA0ODAgZnJhbWVzCi0gICAgICBFWFBFQ1RfQ0FMTChyZW5kZXJfY2FsbGJhY2tfLCBSZW5kZXIoXywgXykpCi0gICAgICAgICAgLldpbGxPbmNlKFJlbmRlckF1ZGlvQnVzKDQ4MCwgdGhpcykpOwotICAgICAgRVhQRUNUX0ZBTFNFKHNpbmtfLT5QdWxsRnJhbWVzKE5VTEwsIE5VTEwpKTsKLQotICAgICAgLy8gQ29uc3VtZSAxMDI0IGZyYW1lcywgbGVhdmUgMTU2OCBmcmFtZXMgc3BhY2UgYnV0IG9ubHkgNTQ0IGFyZQotICAgICAgLy8gY29udGludW91cwotICAgICAgQ29uc3VtZSgxMDI0KTsKLQotICAgICAgLy8gSXQgc3RpbGwgb25seSBoYXMgcm9vbSBmb3IgNTQ0IGNvbnRpbnVvdXMgZnJhbWVzLCBkb24ndCBnaXZlIGl0IGFueQotICAgICAgRVhQRUNUX0NBTEwocmVuZGVyX2NhbGxiYWNrXywgUmVuZGVyKF8sIF8pKQotICAgICAgICAgIC5XaWxsT25jZShWZXJpZnlBdWRpb0J1c0ZyYW1lQ291bnQoY29uZmlnLCBpbml0X3BhcmFtcywgNTQ0KSk7Ci0gICAgICBFWFBFQ1RfRkFMU0Uoc2lua18tPlB1bGxGcmFtZXMoTlVMTCwgTlVMTCkpOwotCi0gICAgICAvLyBPaywgbm93IGdpdmUgaXQgNTQ0IGZyYW1lcwotICAgICAgRVhQRUNUX0NBTEwocmVuZGVyX2NhbGxiYWNrXywgUmVuZGVyKF8sIF8pKQotICAgICAgICAgIC5XaWxsT25jZShSZW5kZXJBdWRpb0J1cyg1NDQsIHRoaXMpKTsKLSAgICAgIEVYUEVDVF9GQUxTRShzaW5rXy0+UHVsbEZyYW1lcyhOVUxMLCBOVUxMKSk7Ci0KLSAgICAgIC8vIE5vdyBpdCBoYXMgcm9vbSBmb3IgYW5vdGhlciAxMDI0IGZyYW1lcywgZG9uJ3QgZ2l2ZSBpdAotICAgICAgRVhQRUNUX0NBTEwocmVuZGVyX2NhbGxiYWNrXywgUmVuZGVyKF8sIF8pKQotICAgICAgICAgIC5XaWxsT25jZShWZXJpZnlBdWRpb0J1c0ZyYW1lQ291bnQoY29uZmlnLCBpbml0X3BhcmFtcywgMTAyNCkpOwotICAgICAgRVhQRUNUX0ZBTFNFKHNpbmtfLT5QdWxsRnJhbWVzKE5VTEwsIE5VTEwpKTsKLQotICAgICAgLy8gT2ssIG5vdyBnaXZlIGl0IDEwMjQgZnJhbWVzCi0gICAgICBFWFBFQ1RfQ0FMTChyZW5kZXJfY2FsbGJhY2tfLCBSZW5kZXIoXywgXykpCi0gICAgICAgICAgLldpbGxPbmNlKFJlbmRlckF1ZGlvQnVzKDEwMjQsIHRoaXMpKTsKLSAgICAgIEVYUEVDVF9GQUxTRShzaW5rXy0+UHVsbEZyYW1lcyhOVUxMLCBOVUxMKSk7Ci0KLSAgICAgIC8vIENvbnN1bWUgMjA0OCBmcmFtZXMKLSAgICAgIENvbnN1bWUoMjA0OCk7Ci0KLSAgICAgIC8vIEdpdmUgaXQgYW5vdGhlciA2NCBhbmQgdGhlbiBjb25zdW1lIDY0IHRvIGVuc3VyZSB3ZSBjYW4gZ2V0IGludG8gdGhlCi0gICAgICAvLyBuZXh0IGl0ZXJhdGlvbiBvZiB0aGUgbG9vcCB3aXRoIGVtcHR5IGJ1ZmZlcgotICAgICAgRVhQRUNUX0NBTEwocmVuZGVyX2NhbGxiYWNrXywgUmVuZGVyKF8sIF8pKQotICAgICAgICAgIC5XaWxsT25jZShSZW5kZXJBdWRpb0J1cygxMDI0LCB0aGlzKSk7Ci0gICAgICBFWFBFQ1RfRkFMU0Uoc2lua18tPlB1bGxGcmFtZXMoTlVMTCwgTlVMTCkpOwotICAgICAgQ29uc3VtZSgxMDI0KTsKLQotICAgICAgRVhQRUNUX1RSVUUoQWxsQ29uc3VtZWQoKSk7Ci0gICAgfQotCi0gICAgRVhQRUNUX0NBTEwoc3RyZWFtZXJfLCBIYXNTdHJlYW0oc2lua18uZ2V0KCkpKS5XaWxsUmVwZWF0ZWRseShSZXR1cm4odHJ1ZSkpOwotICAgIEVYUEVDVF9DQUxMKHN0cmVhbWVyXywgUmVtb3ZlU3RyZWFtKHNpbmtfLmdldCgpKSkuV2lsbE9uY2UoUmV0dXJuKCkpOwotICAgIEVYUEVDVF9DQUxMKHN0cmVhbWVyXywgSGFzU3RyZWFtKHNpbmtfLmdldCgpKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybihmYWxzZSkpOwotICAgIHNpbmtfLT5TdG9wKCk7Ci0gIH0KLX0KLQotVEVTVF9GKFNoZWxsQXVkaW9TaW5rVGVzdCwgUmVzdW1lQWZ0ZXJVbmRlcmZsb3cpIHsKLSAgY29uc3QgdWludDMyIGluaXRpYWxfcmVidWZmZXJpbmdfZnJhbWVzX3Blcl9jaGFubmVsID0gMTAyNDsKLSAgY29uc3QgdWludDMyIHNpbmtfYnVmZmVyX3NpemVfaW5fZnJhbWVzX3Blcl9jaGFubmVsID0gMjA0ODsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewotICAgIENvbmZpZyBjb25maWcoCi0gICAgICAgIGkgPT0gMCA/IENvbmZpZzo6SU5URVJMRUFWRUQgOiBDb25maWc6OlBMQU5BUiwKLSAgICAgICAgaW5pdGlhbF9yZWJ1ZmZlcmluZ19mcmFtZXNfcGVyX2NoYW5uZWwsCi0gICAgICAgIHNpbmtfYnVmZmVyX3NpemVfaW5fZnJhbWVzX3Blcl9jaGFubmVsLCBrTWF4SGFyZHdhcmVDaGFubmVsc1N0ZXJlbywKLSAgICAgICAgc2l6ZW9mKGludDE2X3QpIC8qIGJ5dGVzX3Blcl9zYW1wbGUgKi8sIDQ4MDAwIC8qIG91dHB1dF9zYW1wbGVfcmF0ZSAqLyk7Ci0gICAgQ29uZmlndXJlKGNvbmZpZyk7Ci0KLSAgICBtZWRpYTo6QXVkaW9QYXJhbWV0ZXJzIGluaXRfcGFyYW1zID0KLSAgICAgICAgbWVkaWE6OkF1ZGlvUGFyYW1ldGVycyhtZWRpYTo6QXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTE9XX0xBVEVOQ1ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkNIQU5ORUxfTEFZT1VUX01PTk8sIDQ4MDAwLCAxNiwgMTAyNCk7Ci0KLSAgICBzaW5rXy0+SW5pdGlhbGl6ZShpbml0X3BhcmFtcywgJnJlbmRlcl9jYWxsYmFja18pOwotCi0gICAgSW5TZXF1ZW5jZSBzZXE7Ci0gICAgRVhQRUNUX0NBTEwoc3RyZWFtZXJfLCBIYXNTdHJlYW0oc2lua18uZ2V0KCkpKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKGZhbHNlKSk7Ci0gICAgRVhQRUNUX0NBTEwoc3RyZWFtZXJfLCBBZGRTdHJlYW0oc2lua18uZ2V0KCkpKS5XaWxsT25jZShSZXR1cm4odHJ1ZSkpOwotICAgIEVYUEVDVF9DQUxMKHN0cmVhbWVyXywgSGFzU3RyZWFtKHNpbmtfLmdldCgpKSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKHRydWUpKTsKLSAgICBzaW5rXy0+U3RhcnQoKTsKLQotICAgIC8vIFJlbmRlciA2NCBmcmFtZXMKLSAgICBFWFBFQ1RfQ0FMTChyZW5kZXJfY2FsbGJhY2tfLCBSZW5kZXIoXywgXykpCi0gICAgICAgIC5XaWxsT25jZShSZW5kZXJBdWRpb0J1cyg2NCwgdGhpcykpOwotICAgIEVYUEVDVF9GQUxTRShzaW5rXy0+UHVsbEZyYW1lcyhOVUxMLCBOVUxMKSk7Ci0KLSAgICAvLyBSZW5kZXIgYW5vdGhlciA2NCBmcmFtZXMKLSAgICBFWFBFQ1RfQ0FMTChyZW5kZXJfY2FsbGJhY2tfLCBSZW5kZXIoXywgXykpCi0gICAgICAgIC5XaWxsT25jZShSZW5kZXJBdWRpb0J1cyg2NCwgdGhpcykpOwotICAgIEVYUEVDVF9GQUxTRShzaW5rXy0+UHVsbEZyYW1lcyhOVUxMLCBOVUxMKSk7Ci0KLSAgICAvLyBDb25zdW1lIDExMiBmcmFtZXMsIGxlYXZlIDE2IGZyYW1lcyBsZWZ0Ci0gICAgQ29uc3VtZSgxMTIpOwotCi0gICAgLy8gUmVuZGVyIGFub3RoZXIgMTYgZnJhbWVzCi0gICAgRVhQRUNUX0NBTEwocmVuZGVyX2NhbGxiYWNrXywgUmVuZGVyKF8sIF8pKQotICAgICAgICAuV2lsbE9uY2UoUmVuZGVyQXVkaW9CdXMoMTYsIHRoaXMpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoc2lua18tPlB1bGxGcmFtZXMoTlVMTCwgTlVMTCkpOwotCi0gICAgQ29uc3VtZSgzMik7Ci0KLSAgICBFWFBFQ1RfVFJVRShBbGxDb25zdW1lZCgpKTsKLQotICAgIEVYUEVDVF9DQUxMKHN0cmVhbWVyXywgSGFzU3RyZWFtKHNpbmtfLmdldCgpKSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKHRydWUpKTsKLSAgICBFWFBFQ1RfQ0FMTChzdHJlYW1lcl8sIFJlbW92ZVN0cmVhbShzaW5rXy5nZXQoKSkpLldpbGxPbmNlKFJldHVybigpKTsKLSAgICBFWFBFQ1RfQ0FMTChzdHJlYW1lcl8sIEhhc1N0cmVhbShzaW5rXy5nZXQoKSkpCi0gICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oZmFsc2UpKTsKLSAgICBzaW5rXy0+U3RvcCgpOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL3NoZWxsX2F1ZGlvX3N0cmVhbWVyLmggYi9zcmMvbWVkaWEvYXVkaW8vc2hlbGxfYXVkaW9fc3RyZWFtZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E1MjliMy4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vc2hlbGxfYXVkaW9fc3RyZWFtZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTMgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX0FVRElPX1NIRUxMX0FVRElPX1NUUkVBTUVSX0hfCi0jZGVmaW5lIE1FRElBX0FVRElPX1NIRUxMX0FVRElPX1NUUkVBTUVSX0hfCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgIm1lZGlhL21wNC9hYWMuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgQXVkaW9CdXM7Ci1jbGFzcyBBdWRpb1BhcmFtZXRlcnM7Ci0KLS8vIEFic3RyYWN0IGNsYXNzIGZvciBhZGRpbmcgYW4gYXVkaW8gc3RyZWFtIHRvIHRoZSBhdWRpbyBzdHJlYW1lci4KLS8vIFlvdXIgY2xhc3MgY2FuIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBhbmQgdGhlbiBjYWxsIEFkZFN0cmVhbSh0aGlzKSB0bwotLy8gYXR0YWNoIGl0c2VsZiB0byB0aGUgaGFyZHdhcmUgYXVkaW8gc3RyZWFtZXIuCi1jbGFzcyBTaGVsbEF1ZGlvU3RyZWFtIHsKLSBwdWJsaWM6Ci0gIC8vIENoZWNrcyBpZiAiUGF1c2UiIGhhcyBiZWVuIHJlcXVlc3RlZCBvbiB0aGlzIHN0cmVhbS4gVGhlIHN0cmVhbWVyIHdpbGwKLSAgLy8gaGFsdCBwbGF5YmFjayB0aGUgbmV4dCB0aW1lIGl0IHVwZGF0ZXMuCi0gIHZpcnR1YWwgYm9vbCBQYXVzZVJlcXVlc3RlZCgpIGNvbnN0ID0gMDsKLSAgLy8gVGhpcyBmdW5jdGlvbiBzZXJ2ZXMgc2V2ZXJhbCBwdXJwb3NlczoKLSAgLy8gMS4gT25jZSB0aGUgYXVkaW8gc3RyZWFtIGlzIGFkZGVkIHRvIHRoZSBzdHJlYW1lci4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlCi0gIC8vIGNhbGxlZCBwZXJpb2RpY2FsbHkgc28gdGhlIHN0cmVhbSAodGhlIEF1ZGlvU2luaykgY2FuIHB1bGwgZGF0YSBmcm9tCi0gIC8vIHVwcGVyIGxldmVsLCBldmVuIHdoZW4gaXQgaXMgcGF1c2VkLgotICAvLyAyLiBJdCB3aWxsIHJldHVybiB0cnVlIHRvIGluZGljYXRlIHRoYXQgaXQgaXMgcGxheWluZywgZmFsc2UgdG8gcGF1c2UuCi0gIC8vIFRoZSBmcmFtZSByZWZlcnJlZCBpbiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBhbiBBQUMgZnJhbWUgYnV0IGEgUENNIGZyYW1lLiBJdAotICAvLyBjb250YWlucyBhIGdyb3VwIG9mIHNhbXBsZXMgc3RhcnQgYXQgdGhlIHNhbWUgdGltZXN0YW1wLCBlYWNoIG9mIHRoZW0gYXJlCi0gIC8vIGZyb20gZGlmZmVyZW50IGNoYW5uZWxzIG9mIGEgbXVsdGktY2hhbm5lbCBhdWRpbyBzdHJlYW0uCi0gIC8vIE5PVEU6IFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBvbiBhIGxvdyBsZXZlbCBhdWRpbyBtaXhlciB0aHJlYWQgYW5kCi0gIC8vIGlzIExBVEVOQ1ktU0VOU0lUSVZFLiBBdm9pZCBsb2NrcyBhbmQgb3RoZXIgaGlnaC1sYXRlbmN5IG9wZXJhdGlvbnMhCi0gIHZpcnR1YWwgYm9vbCBQdWxsRnJhbWVzKHVpbnQzMl90KiBvZmZzZXRfaW5fZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiB0b3RhbF9mcmFtZXMpID0gMDsKLSAgLy8gVGhpcyBmdW5jdGlvbiB0ZWxscyB0aGUgc3RyZWFtIHRoYXQgYGZyYW1lX3BsYXllZGAgb2YgYXVkaW8gZnJhbWVzIGhhdmUKLSAgLy8gYmVlbiBwbGF5ZWQgYW5kIGNhbiBiZSByZW1vdmVkIGZyb20gdGhlIGJ1ZmZlci4gVGhlIHN0cmVhbSBjYW4gYWxzbyB1c2UKLSAgLy8gdGhpcyB0byBjYWxjdWxhdGUgdGhlIHRpbWUgZWxhcHNlZC4gVGhlIHN0cmVhbSBzaG91bGRuJ3QgcHVsbCBhbnkgZGF0YQotICAvLyBpbiB0aGlzIGZ1bmN0aW9uLCBQdWxsRnJhbWVzIGlzIHRoZSBvbmx5IHBvaW50IHRvIHB1bGwgZGF0YS4KLSAgdmlydHVhbCB2b2lkIENvbnN1bWVGcmFtZXModWludDMyX3QgZnJhbWVfcGxheWVkKSA9IDA7Ci0gIC8vIEdldCB0aGUgQXVkaW9QYXJhbWV0ZXJzIGZvciB0aGlzIHN0cmVhbQotICB2aXJ0dWFsIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgR2V0QXVkaW9QYXJhbWV0ZXJzKCkgY29uc3QgPSAwOwotICAvLyBHZXQgdGhlIGludGVybmFsIGJ1ZmZlciBvZiB0aGlzIGF1ZGlvIHN0cmVhbSBhcyBhbiBBdWRpb0J1cy4KLSAgdmlydHVhbCBBdWRpb0J1cyogR2V0QXVkaW9CdXMoKSA9IDA7Ci19OwotCi0vLyBUaGUgY2xhc3MgY29udGFpbnMgc3R1YiBmdW5jdGlvbnMgZm9yIHBsYXRmb3JtIHNwZWNpZmljIGF1ZGlvIHBsYXliYWNrLgotLy8gQ2xhc3NlcyBpbmhlcml0ZWQgZnJvbSBpdCBoYXZlIHRvIGltcGxlbWVudCBhbGwgdGhlIHB1cmUgdmlydHVhbCBmdW5jdGlvbnMKLS8vIGFuZCBwcm92aWRlIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIHN0YXRpYyBmdW5jdGlvbnMuCi1jbGFzcyBTaGVsbEF1ZGlvU3RyZWFtZXIgewotIHB1YmxpYzoKLSAgY2xhc3MgQ29uZmlnIHsKLSAgIHB1YmxpYzoKLSAgICBzdGF0aWMgY29uc3QgdWludDMyIGtJbnZhbGlkU2FtcGxlUmF0ZSA9IDA7Ci0KLSAgICBlbnVtIFN0b3JhZ2VNb2RlIHsgSU5URVJMRUFWRUQsIFBMQU5BUiB9OwotCi0gICAgQ29uZmlnKCkgOiB2YWxpZF8oZmFsc2UpIHt9Ci0KLSAgICAvLyBJbml0aWFsaXplIHRoZSBDb25maWcgc2V0dGluZ3MsIHNlZSB0aGUgY29tbWVudCBvbiBpbmRpdmlkdWFsIG1lbWJlcgotICAgIC8vIGJlbG93IGZvciBtb3JlIGRldGFpbHMuCi0gICAgQ29uZmlnKFN0b3JhZ2VNb2RlIHN0b3JhZ2VfbW9kZSwKLSAgICAgICAgICAgdWludDMyIGluaXRpYWxfcmVidWZmZXJpbmdfZnJhbWVzX3Blcl9jaGFubmVsLAotICAgICAgICAgICB1aW50MzIgc2lua19idWZmZXJfc2l6ZV9pbl9mcmFtZXNfcGVyX2NoYW5uZWwsCi0gICAgICAgICAgIHVpbnQzMiBtYXhfaGFyZHdhcmVfY2hhbm5lbHMsCi0gICAgICAgICAgIHVpbnQzMiBieXRlc19wZXJfc2FtcGxlLAotICAgICAgICAgICB1aW50MzIgbmF0aXZlX291dHB1dF9zYW1wbGVfcmF0ZSA9IGtJbnZhbGlkU2FtcGxlUmF0ZSkKLSAgICAgICAgOiB2YWxpZF8odHJ1ZSksCi0gICAgICAgICAgaW50ZXJsZWF2ZWRfKHN0b3JhZ2VfbW9kZSA9PSBJTlRFUkxFQVZFRCksCi0gICAgICAgICAgaW5pdGlhbF9yZWJ1ZmZlcmluZ19mcmFtZXNfcGVyX2NoYW5uZWxfKAotICAgICAgICAgICAgICBpbml0aWFsX3JlYnVmZmVyaW5nX2ZyYW1lc19wZXJfY2hhbm5lbCksCi0gICAgICAgICAgc2lua19idWZmZXJfc2l6ZV9pbl9mcmFtZXNfcGVyX2NoYW5uZWxfKAotICAgICAgICAgICAgICBzaW5rX2J1ZmZlcl9zaXplX2luX2ZyYW1lc19wZXJfY2hhbm5lbCksCi0gICAgICAgICAgbWF4X2hhcmR3YXJlX2NoYW5uZWxzXyhtYXhfaGFyZHdhcmVfY2hhbm5lbHMpLAotICAgICAgICAgIGJ5dGVzX3Blcl9zYW1wbGVfKGJ5dGVzX3Blcl9zYW1wbGUpLAotICAgICAgICAgIG5hdGl2ZV9vdXRwdXRfc2FtcGxlX3JhdGVfKG5hdGl2ZV9vdXRwdXRfc2FtcGxlX3JhdGUpIHsKLSAgICAgIGNvbnN0IHNpemVfdCBrRnJhbWVzUGVyQWNjZXNzVW5pdCA9IG1wNDo6QUFDOjprRnJhbWVzUGVyQWNjZXNzVW5pdDsKLSAgICAgIERDSEVDS19MRShpbml0aWFsX3JlYnVmZmVyaW5nX2ZyYW1lc19wZXJfY2hhbm5lbCwKLSAgICAgICAgICAgICAgICBzaW5rX2J1ZmZlcl9zaXplX2luX2ZyYW1lc19wZXJfY2hhbm5lbCk7Ci0gICAgICBEQ0hFQ0tfRVEoaW5pdGlhbF9yZWJ1ZmZlcmluZ19mcmFtZXNfcGVyX2NoYW5uZWwgJSBrRnJhbWVzUGVyQWNjZXNzVW5pdCwKLSAgICAgICAgICAgICAgICAwKTsKLSAgICAgIERDSEVDS19FUShzaW5rX2J1ZmZlcl9zaXplX2luX2ZyYW1lc19wZXJfY2hhbm5lbCAlIGtGcmFtZXNQZXJBY2Nlc3NVbml0LAotICAgICAgICAgICAgICAgIDApOwotICAgIH0KLQotICAgIGJvb2wgaW50ZXJsZWF2ZWQoKSBjb25zdCB7Ci0gICAgICBBc3NlcnRWYWxpZCgpOwotICAgICAgcmV0dXJuIGludGVybGVhdmVkXzsKLSAgICB9Ci0gICAgdWludDMyIGluaXRpYWxfcmVidWZmZXJpbmdfZnJhbWVzX3Blcl9jaGFubmVsKCkgY29uc3QgewotICAgICAgQXNzZXJ0VmFsaWQoKTsKLSAgICAgIHJldHVybiBpbml0aWFsX3JlYnVmZmVyaW5nX2ZyYW1lc19wZXJfY2hhbm5lbF87Ci0gICAgfQotICAgIHVpbnQzMiBzaW5rX2J1ZmZlcl9zaXplX2luX2ZyYW1lc19wZXJfY2hhbm5lbCgpIGNvbnN0IHsKLSAgICAgIEFzc2VydFZhbGlkKCk7Ci0gICAgICByZXR1cm4gc2lua19idWZmZXJfc2l6ZV9pbl9mcmFtZXNfcGVyX2NoYW5uZWxfOwotICAgIH0KLSAgICB1aW50MzIgbWF4X2hhcmR3YXJlX2NoYW5uZWxzKCkgY29uc3QgewotICAgICAgQXNzZXJ0VmFsaWQoKTsKLSAgICAgIHJldHVybiBtYXhfaGFyZHdhcmVfY2hhbm5lbHNfOwotICAgIH0KLSAgICB1aW50MzIgYnl0ZXNfcGVyX3NhbXBsZSgpIGNvbnN0IHsKLSAgICAgIEFzc2VydFZhbGlkKCk7Ci0gICAgICByZXR1cm4gYnl0ZXNfcGVyX3NhbXBsZV87Ci0gICAgfQotICAgIHVpbnQzMiBuYXRpdmVfb3V0cHV0X3NhbXBsZV9yYXRlKCkgY29uc3QgewotICAgICAgQXNzZXJ0VmFsaWQoKTsKLSAgICAgIHJldHVybiBuYXRpdmVfb3V0cHV0X3NhbXBsZV9yYXRlXzsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgdm9pZCBBc3NlcnRWYWxpZCgpIGNvbnN0IHsgRENIRUNLKHZhbGlkXyk7IH0KLQotICAgIGJvb2wgdmFsaWRfOwotCi0gICAgLy8gSXMgdGhlIGRhdGEgaW4gYXVkaW8gYnVzIGludGVybGVhdmVkIGFuZCBzdG9yZWQgYXMgb25lIGNoYW5uZWwuCi0gICAgYm9vbCBpbnRlcmxlYXZlZF87Ci0gICAgLy8gVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXIgY29udHJvbHMgdGhlIHNpbmsgcmVidWZmZXJpbmcuCi0gICAgLy8gU2VlIFNoZWxsQXVkaW9TaW5rOjpSZXN1bWVBZnRlclVuZGVyZmxvdyBmb3IgbW9yZSBkZXRhaWxzLgotICAgIHVpbnQzMiBpbml0aWFsX3JlYnVmZmVyaW5nX2ZyYW1lc19wZXJfY2hhbm5lbF87Ci0gICAgdWludDMyIHNpbmtfYnVmZmVyX3NpemVfaW5fZnJhbWVzX3Blcl9jaGFubmVsXzsKLSAgICAvLyBNYXggY2hhbm5lbHMgdGhlIGN1cnJlbnQgYXVkaW8gaGFyZHdhcmUgY2FuIHJlbmRlci4gVGhpcyBjYW4gYmUgY2hhbmdlZAotICAgIC8vIGR1cmluZyB0aGUgcnVubmluZyBvZiB0aGUgYXBwbGljYXRpb24gYXMgdGhlIHVzZXIgY2FuIHBsdWcvdW5wbHVnCi0gICAgLy8gZGlmZmVyZW50IGRldmljZXMuIFNvIGl0IHJlcHJlc2VudCB0aGUgY3VycmVudCBzdGF0dXMgb24gdGhlIHRpbWUgb2YKLSAgICAvLyBxdWVyeS4KLSAgICB1aW50MzIgbWF4X2hhcmR3YXJlX2NoYW5uZWxzXzsKLSAgICB1aW50MzIgYnl0ZXNfcGVyX3NhbXBsZV87Ci0gICAgdWludDMyIG5hdGl2ZV9vdXRwdXRfc2FtcGxlX3JhdGVfOwotICB9OwotCi0gIHN0cnVjdCBPdXRwdXREZXZpY2UgewotICAgIHN0ZDo6c3RyaW5nIGNvbm5lY3RvcjsKLSAgICB1aW50MzIgbGF0ZW5jeV9tczsKLSAgICBzdGQ6OnN0cmluZyBjb2RpbmdfdHlwZTsKLSAgICB1aW50MzIgbnVtYmVyX29mX2NoYW5uZWxzOwotICAgIHVpbnQzMiBzYW1wbGluZ19mcmVxdWVuY3k7Ci0gIH07Ci0KLSAgU2hlbGxBdWRpb1N0cmVhbWVyKCkge30KLSAgdmlydHVhbCB+U2hlbGxBdWRpb1N0cmVhbWVyKCl7fTsKLQotICAvLyBUaGUgb25seSBpbnN0YW5jZSBvZiB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgYXVkaW8gc3RyZWFtZXIuIEl0IGJlY29tZXMKLSAgLy8gdmFsaWQgYWZ0ZXIgY2FsbGluZyBJbml0aWFsaXplIGFuZCBiZWNvbWUgTlVMTCBhZnRlciBjYWxsaW5nIFRlcm1pbmF0ZS4KLSAgc3RhdGljIFNoZWxsQXVkaW9TdHJlYW1lciogSW5zdGFuY2UoKTsKLSAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZSgpOwotICBzdGF0aWMgdm9pZCBUZXJtaW5hdGUoKTsKLQotICB2aXJ0dWFsIENvbmZpZyBHZXRDb25maWcoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBBZGRTdHJlYW0oU2hlbGxBdWRpb1N0cmVhbSogc3RyZWFtKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBSZW1vdmVTdHJlYW0oU2hlbGxBdWRpb1N0cmVhbSogc3RyZWFtKSA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBIYXNTdHJlYW0oU2hlbGxBdWRpb1N0cmVhbSogc3RyZWFtKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBTZXRWb2x1bWUoU2hlbGxBdWRpb1N0cmVhbSogc3RyZWFtLCBkb3VibGUgdm9sdW1lKSA9IDA7Ci0gIC8vIFNvbWUgY29uc29sZXMgaGF2ZSBiYWNrZ3JvdW5kIG11c2ljIHRyYWNrcyBwbGF5aW5nIGV2ZW4gd2hlbiBvdGhlciBhcHBzCi0gIC8vIGFyZSBydW5uaW5nLiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHN0b3AgdGhlIGJhY2tncm91bmQgbXVzaWMuCi0gIHZpcnR1YWwgdm9pZCBTdG9wQmFja2dyb3VuZE11c2ljKCkge30KLSAgLy8gUmV0dXJucyB0aGUgYXZhaWxhYmxlIGF1ZGlvIG91dHB1dCBkZXZpY2VzLiAgVGhpcyBmdW5jdGlvbiBpcyBmb3IKLSAgLy8gaW5mb3JtYXRpb25hbCBwdXJwb3NlIGFuZCBpcyBjdXJyZW50bHkgb25seSB1c2VkIHRvIGNyZWF0ZQotICAvLyBoNXZjYzo6QXVkaW9Db25maWcuCi0gIHZpcnR1YWwgc3RkOjp2ZWN0b3I8T3V0cHV0RGV2aWNlPiBHZXRPdXRwdXREZXZpY2VzKCkgewotICAgIHJldHVybiBzdGQ6OnZlY3RvcjxPdXRwdXREZXZpY2U+KCk7Ci0gIH0KLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU2hlbGxBdWRpb1N0cmVhbWVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0FVRElPX1NIRUxMX0FVRElPX1NUUkVBTUVSX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vc2hlbGxfYXVkaW9fc3RyZWFtZXJfbGludXguY2MgYi9zcmMvbWVkaWEvYXVkaW8vc2hlbGxfYXVkaW9fc3RyZWFtZXJfbGludXguY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMzViOTcuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL3NoZWxsX2F1ZGlvX3N0cmVhbWVyX2xpbnV4LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby9zaGVsbF9hdWRpb19zdHJlYW1lcl9saW51eC5oIgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAibGJfcGxhdGZvcm0uaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19wYXJhbWV0ZXJzLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vc2hlbGxfcHVsc2VfYXVkaW8uaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2J1cy5oIgotI2luY2x1ZGUgIm1lZGlhL21wNC9hYWMuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotbmFtZXNwYWNlIHsKLQotU2hlbGxBdWRpb1N0cmVhbWVyTGludXgqIGluc3RhbmNlID0gTlVMTDsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLWNsYXNzIFB1bHNlQXVkaW9Ib3N0IDogcHVibGljIFNoZWxsUHVsc2VBdWRpb1N0cmVhbTo6SG9zdCB7Ci0gcHVibGljOgotICBQdWxzZUF1ZGlvSG9zdChTaGVsbFB1bHNlQXVkaW9Db250ZXh0KiBwdWxzZV9hdWRpb19jb250ZXh0LAotICAgICAgICAgICAgICAgICBTaGVsbEF1ZGlvU3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgIGludCByYXRlLAotICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMpOwotICB+UHVsc2VBdWRpb0hvc3QoKTsKLSAgdmlydHVhbCB2b2lkIFJlcXVlc3RGcmFtZShzaXplX3QgbGVuZ3RoLCBXcml0ZUZ1bmMgd3JpdGUpIE9WRVJSSURFOwotCi0gcHJpdmF0ZToKLSAgZW51bSBTdHJlYW1TdGF0ZSB7Ci0gICAgU1RBVEVfSU5WQUxJRCwKLSAgICBTVEFURV9QQVVTRUQsICAgLy8gVm9pY2UgaXMgcGF1c2VkLCB3aWxsIHBsYXkgd2hlbiB1bnBhdXNlZAotICAgIFNUQVRFX1JVTk5JTkcsICAvLyBWb2ljZSBpcyBwbGF5aW5nLCByZWFkaW5nIG5ldyBkYXRhIHdoZW4gcG9zc2libGUKLSAgfTsKLQotICBTaGVsbFB1bHNlQXVkaW9Db250ZXh0KiBwdWxzZV9hdWRpb19jb250ZXh0XzsKLSAgaW50IGNoYW5uZWxzXzsKLSAgdWludDMyIHBsYXllZF9mcmFtZXNfOyAgIC8vIGZyYW1lcyBwbGF5ZWQgYnkgdGhlIGF1ZGlvIGRyaXZlcgotICB1aW50MzIgd3JpdHRlbl9mcmFtZXNfOyAgLy8gZnJhbWVzIHdyaXR0ZW4gdG8gdGhlIGF1ZGlvIGRyaXZlcgotICBTdHJlYW1TdGF0ZSBzdGF0ZV87Ci0gIFNoZWxsQXVkaW9TdHJlYW0qIGxiX2F1ZGlvX3N0cmVhbV87Ci0gIFNoZWxsUHVsc2VBdWRpb1N0cmVhbSogcHVsc2VfYXVkaW9fc3RyZWFtXzsKLX07Ci0KLVNoZWxsQXVkaW9TdHJlYW1lcjo6Q29uZmlnIFNoZWxsQXVkaW9TdHJlYW1lckxpbnV4OjpHZXRDb25maWcoKSBjb25zdCB7Ci0gIGNvbnN0IHVpbnQzMiBpbml0aWFsX3JlYnVmZmVyaW5nX2ZyYW1lc19wZXJfY2hhbm5lbCA9Ci0gICAgICBtcDQ6OkFBQzo6a0ZyYW1lc1BlckFjY2Vzc1VuaXQgKiAzMjsKLSAgY29uc3QgdWludDMyIHNpbmtfYnVmZmVyX3NpemVfaW5fZnJhbWVzX3Blcl9jaGFubmVsID0KLSAgICAgIGluaXRpYWxfcmVidWZmZXJpbmdfZnJhbWVzX3Blcl9jaGFubmVsICogODsKLSAgY29uc3QgdWludDMyIG1heF9oYXJkd2FyZV9jaGFubmVscyA9IDI7Ci0KLSAgcmV0dXJuIENvbmZpZyhDb25maWc6OklOVEVSTEVBVkVELCBpbml0aWFsX3JlYnVmZmVyaW5nX2ZyYW1lc19wZXJfY2hhbm5lbCwKLSAgICAgICAgICAgICAgICBzaW5rX2J1ZmZlcl9zaXplX2luX2ZyYW1lc19wZXJfY2hhbm5lbCwgbWF4X2hhcmR3YXJlX2NoYW5uZWxzLAotICAgICAgICAgICAgICAgIHNpemVvZihmbG9hdCkgLyogYnl0ZXNfcGVyX3NhbXBsZSAqLyk7Ci19Ci0KLWJvb2wgU2hlbGxBdWRpb1N0cmVhbWVyTGludXg6OkFkZFN0cmVhbShTaGVsbEF1ZGlvU3RyZWFtKiBzdHJlYW0pIHsKLSAgYmFzZTo6QXV0b0xvY2sgbG9jayhzdHJlYW1zX2xvY2tfKTsKLQotICBpZiAocHVsc2VfYXVkaW9fY29udGV4dF8gPT0gTlVMTCkgewotICAgIHB1bHNlX2F1ZGlvX2NvbnRleHRfLnJlc2V0KG5ldyBTaGVsbFB1bHNlQXVkaW9Db250ZXh0KCkpOwotICAgIGJvb2wgcmVzdWx0ID0gcHVsc2VfYXVkaW9fY29udGV4dF8tPkluaXRpYWxpemUoKTsKLSAgICBpZiAoIXJlc3VsdCkgewotICAgICAgcHVsc2VfYXVkaW9fY29udGV4dF8ucmVzZXQoKTsKLSAgICAgIERMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byBpbml0aWFsaXplIHB1bHNlIGF1ZGlvLiI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLy8gb3RoZXIgYmFzaWMgY2hlY2tzLCBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGRlY29kZXIgb3IgcmVuZGVyZXIgYWxnb3JpdGhtCi0gIC8vIHdpbGwgaGF2ZSByZWplY3RlZCBpbnZhbGlkIGNvbmZpZ3VyYXRpb25zIGJlZm9yZSBjcmVhdGluZyBhIHNpbmssIHNvCi0gIC8vIGhlcmUgdGhleSBhcmUgYXNzZXJ0cyBpbnN0ZWFkIG9mIHJ1bi10aW1lIGVycm9ycwotICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcyA9IHN0cmVhbS0+R2V0QXVkaW9QYXJhbWV0ZXJzKCk7Ci0gIERDSEVDSyhwYXJhbXMuY2hhbm5lbHMoKSA9PSAxIHx8IHBhcmFtcy5jaGFubmVscygpID09IDIpOwotICBEQ0hFQ0tfRVEocGFyYW1zLmJpdHNfcGVyX3NhbXBsZSgpLCAzMik7Ci0KLSAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBhdWRpb19wYXJhbWV0ZXJzID0gc3RyZWFtLT5HZXRBdWRpb1BhcmFtZXRlcnMoKTsKLSAgY29uc3QgaW50IHNhbXBsZV9yYXRlID0gYXVkaW9fcGFyYW1ldGVycy5zYW1wbGVfcmF0ZSgpOwotCi0gIHN0cmVhbXNfW3N0cmVhbV0gPSBuZXcgUHVsc2VBdWRpb0hvc3QocHVsc2VfYXVkaW9fY29udGV4dF8uZ2V0KCksIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfcmF0ZSwgcGFyYW1zLmNoYW5uZWxzKCkpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFNoZWxsQXVkaW9TdHJlYW1lckxpbnV4OjpSZW1vdmVTdHJlYW0oU2hlbGxBdWRpb1N0cmVhbSogc3RyZWFtKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGxvY2soc3RyZWFtc19sb2NrXyk7Ci0KLSAgU3RyZWFtTWFwOjppdGVyYXRvciBpdCA9IHN0cmVhbXNfLmZpbmQoc3RyZWFtKTsKLSAgaWYgKGl0ID09IHN0cmVhbXNfLmVuZCgpKQotICAgIHJldHVybjsKLSAgZGVsZXRlIGl0LT5zZWNvbmQ7Ci0gIHN0cmVhbXNfLmVyYXNlKGl0KTsKLQotICBpZiAoc3RyZWFtc18uZW1wdHkoKSkgewotICAgIHB1bHNlX2F1ZGlvX2NvbnRleHRfLnJlc2V0KCk7Ci0gIH0KLX0KLQotYm9vbCBTaGVsbEF1ZGlvU3RyZWFtZXJMaW51eDo6SGFzU3RyZWFtKFNoZWxsQXVkaW9TdHJlYW0qIHN0cmVhbSkgY29uc3QgewotICBiYXNlOjpBdXRvTG9jayBsb2NrKHN0cmVhbXNfbG9ja18pOwotICByZXR1cm4gc3RyZWFtc18uZmluZChzdHJlYW0pICE9IHN0cmVhbXNfLmVuZCgpOwotfQotCi1ib29sIFNoZWxsQXVkaW9TdHJlYW1lckxpbnV4OjpTZXRWb2x1bWUoU2hlbGxBdWRpb1N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2b2x1bWUpIHsKLSAgaWYgKHZvbHVtZSAhPSAxLjApIHsKLSAgICBOT1RJTVBMRU1FTlRFRCgpOwotICB9Ci0gIHJldHVybiB2b2x1bWUgIT0gMS4wOwotfQotCi1TaGVsbEF1ZGlvU3RyZWFtZXJMaW51eDo6U2hlbGxBdWRpb1N0cmVhbWVyTGludXgoKQotICAgIDogc3RyZWFtc192YWx1ZV9kZWxldGVyXygmc3RyZWFtc18pIHsKLSAgaW5zdGFuY2UgPSB0aGlzOwotfQotCi1TaGVsbEF1ZGlvU3RyZWFtZXJMaW51eDo6flNoZWxsQXVkaW9TdHJlYW1lckxpbnV4KCkgewotICBEQ0hFQ0soc3RyZWFtc18uZW1wdHkoKSk7Ci0gIGluc3RhbmNlID0gTlVMTDsKLX0KLQotUHVsc2VBdWRpb0hvc3Q6OlB1bHNlQXVkaW9Ib3N0KFNoZWxsUHVsc2VBdWRpb0NvbnRleHQqIHB1bHNlX2F1ZGlvX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGxBdWRpb1N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscykKLSAgICA6IGNoYW5uZWxzXyhjaGFubmVscyksCi0gICAgICBwdWxzZV9hdWRpb19jb250ZXh0XyhwdWxzZV9hdWRpb19jb250ZXh0KSwKLSAgICAgIHBsYXllZF9mcmFtZXNfKDApLAotICAgICAgd3JpdHRlbl9mcmFtZXNfKDApLAotICAgICAgc3RhdGVfKFNUQVRFX1BBVVNFRCksCi0gICAgICBsYl9hdWRpb19zdHJlYW1fKHN0cmVhbSkgewotICBwdWxzZV9hdWRpb19zdHJlYW1fID0gcHVsc2VfYXVkaW9fY29udGV4dC0+Q3JlYXRlU3RyZWFtKHRoaXMsIHJhdGUsIGNoYW5uZWxzKTsKLX0KLQotUHVsc2VBdWRpb0hvc3Q6On5QdWxzZUF1ZGlvSG9zdCgpIHsKLSAgaWYgKHB1bHNlX2F1ZGlvX3N0cmVhbV8pIHsKLSAgICBwdWxzZV9hdWRpb19jb250ZXh0Xy0+RGVzdHJveVN0cmVhbShwdWxzZV9hdWRpb19zdHJlYW1fKTsKLSAgfQotfQotCi12b2lkIFB1bHNlQXVkaW9Ib3N0OjpSZXF1ZXN0RnJhbWUoc2l6ZV90IGxlbmd0aCwgV3JpdGVGdW5jIHdyaXRlKSB7Ci0gIHVpbnQ2NCB0aW1lX3BsYXllZCA9IHB1bHNlX2F1ZGlvX3N0cmVhbV8tPkdldFBsYXliYWNrQ3Vyc29ySW5NaWNyb1NlY29uZHMoKTsKLSAgaW50IHNhbXBsZV9yYXRlID0gbGJfYXVkaW9fc3RyZWFtXy0+R2V0QXVkaW9QYXJhbWV0ZXJzKCkuc2FtcGxlX3JhdGUoKTsKLSAgdWludDY0IGZyYW1lc19wbGF5ZWQgPSB0aW1lX3BsYXllZCAqIHNhbXBsZV9yYXRlIC8gMTAwMDAwMDsKLSAgdWludDMyIGZyYW1lX2NvbnN1bWVkID0gMDsKLSAgdWludDMyIGZyYW1lX3B1bGxlZDsKLQotICBpZiAoZnJhbWVzX3BsYXllZCA+IHdyaXR0ZW5fZnJhbWVzXykKLSAgICBmcmFtZXNfcGxheWVkID0gd3JpdHRlbl9mcmFtZXNfOwotICBpZiAoZnJhbWVzX3BsYXllZCA+IHBsYXllZF9mcmFtZXNfKQotICAgIGZyYW1lX2NvbnN1bWVkID0gZnJhbWVzX3BsYXllZCAtIHBsYXllZF9mcmFtZXNfOwotICBwbGF5ZWRfZnJhbWVzXyArPSBmcmFtZV9jb25zdW1lZDsKLQotICAvLyBPdXIgc2FtcGxlcyBhcmUgaW4gZmxvYXRzLgotICBjb25zdCBpbnQga0J5dGVzUGVyRnJhbWUgPSBzaXplb2YoZmxvYXQpICogY2hhbm5lbHNfOwotICBEQ0hFQ0tfRVEobGVuZ3RoICUga0J5dGVzUGVyRnJhbWUsIDApOwotICBsZW5ndGggLz0ga0J5dGVzUGVyRnJhbWU7Ci0gIGNvbnN0IEF1ZGlvQnVzKiBhdWRpb19idXMgPSBsYl9hdWRpb19zdHJlYW1fLT5HZXRBdWRpb0J1cygpOwotCi0gIGxiX2F1ZGlvX3N0cmVhbV8tPkNvbnN1bWVGcmFtZXMoZnJhbWVfY29uc3VtZWQpOwotICBsYl9hdWRpb19zdHJlYW1fLT5QdWxsRnJhbWVzKE5VTEwsICZmcmFtZV9wdWxsZWQpOwotCi0gIGlmIChwbGF5ZWRfZnJhbWVzXyArIGZyYW1lX3B1bGxlZCA+IHdyaXR0ZW5fZnJhbWVzXyAmJiBsZW5ndGgpIHsKLSAgICBmcmFtZV9wdWxsZWQgPSBwbGF5ZWRfZnJhbWVzXyArIGZyYW1lX3B1bGxlZCAtIHdyaXR0ZW5fZnJhbWVzXzsKLSAgICBmcmFtZV9wdWxsZWQgPSBzdGQ6Om1pbjxzaXplX3Q+KGZyYW1lX3B1bGxlZCwgbGVuZ3RoKTsKLQotICAgIHVpbnQzMiBmcmFtZXMgPSBhdWRpb19idXMtPmZyYW1lcygpIC8gY2hhbm5lbHNfOwotICAgIHVpbnQzMiBmcmFtZV9vZmZzZXQgPSB3cml0dGVuX2ZyYW1lc18gJSBmcmFtZXM7Ci0KLSAgICB1aW50MzIgZnJhbWVfdG9fd3JpdGUgPQotICAgICAgICBzdGQ6Om1pbjxzaXplX3Q+KGZyYW1lX3B1bGxlZCwgZnJhbWVzIC0gZnJhbWVfb2Zmc2V0KTsKLSAgICBjb25zdCBmbG9hdCogYnVmZmVyID0gYXVkaW9fYnVzLT5jaGFubmVsKDApICsgZnJhbWVfb2Zmc2V0ICogY2hhbm5lbHNfOwotICAgIHdyaXRlLlJ1bihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4Kj4oYnVmZmVyKSwKLSAgICAgICAgICAgICAgZnJhbWVfdG9fd3JpdGUgKiBrQnl0ZXNQZXJGcmFtZSk7Ci0gICAgd3JpdHRlbl9mcmFtZXNfICs9IGZyYW1lX3RvX3dyaXRlOwotICB9Ci0KLSAgc3dpdGNoIChzdGF0ZV8pIHsKLSAgICBjYXNlIFNUQVRFX1BBVVNFRDoKLSAgICAgIGlmICghbGJfYXVkaW9fc3RyZWFtXy0+UGF1c2VSZXF1ZXN0ZWQoKSkgewotICAgICAgICBwdWxzZV9hdWRpb19zdHJlYW1fLT5QbGF5KCk7Ci0gICAgICAgIHN0YXRlXyA9IFNUQVRFX1JVTk5JTkc7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNUQVRFX1JVTk5JTkc6Ci0gICAgICBpZiAobGJfYXVkaW9fc3RyZWFtXy0+UGF1c2VSZXF1ZXN0ZWQoKSkgewotICAgICAgICBwdWxzZV9hdWRpb19zdHJlYW1fLT5QYXVzZSgpOwotICAgICAgICBzdGF0ZV8gPSBTVEFURV9QQVVTRUQ7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNUQVRFX0lOVkFMSUQ6Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIFNoZWxsQXVkaW9TdHJlYW1lcjo6SW5pdGlhbGl6ZSgpIHsKLSAgQ0hFQ0soIWluc3RhbmNlKTsKLSAgbmV3IFNoZWxsQXVkaW9TdHJlYW1lckxpbnV4KCk7Ci19Ci0KLXZvaWQgU2hlbGxBdWRpb1N0cmVhbWVyOjpUZXJtaW5hdGUoKSB7Ci0gIENIRUNLKGluc3RhbmNlKTsKLSAgZGVsZXRlIGluc3RhbmNlOwotICBpbnN0YW5jZSA9IE5VTEw7Ci19Ci0KLVNoZWxsQXVkaW9TdHJlYW1lciogU2hlbGxBdWRpb1N0cmVhbWVyOjpJbnN0YW5jZSgpIHsKLSAgQ0hFQ0soaW5zdGFuY2UpOwotICByZXR1cm4gaW5zdGFuY2U7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL3NoZWxsX2F1ZGlvX3N0cmVhbWVyX2xpbnV4LmggYi9zcmMvbWVkaWEvYXVkaW8vc2hlbGxfYXVkaW9fc3RyZWFtZXJfbGludXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZkOWUzOC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vc2hlbGxfYXVkaW9fc3RyZWFtZXJfbGludXguaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQVVESU9fU0hFTExfQVVESU9fU1RSRUFNRVJfTElOVVhfSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fU0hFTExfQVVESU9fU1RSRUFNRVJfTElOVVhfSF8KLQotI2luY2x1ZGUgPG1hcD4KLQotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJiYXNlL3N0bF91dGlsLmgiCi0jaW5jbHVkZSAiYmFzZS9zeW5jaHJvbml6YXRpb24vbG9jay5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3NoZWxsX2F1ZGlvX3N0cmVhbWVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vc2hlbGxfcHVsc2VfYXVkaW8uaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgUHVsc2VBdWRpb0hvc3Q7Ci0KLWNsYXNzIFNoZWxsQXVkaW9TdHJlYW1lckxpbnV4IDogcHVibGljIFNoZWxsQXVkaW9TdHJlYW1lciB7Ci0gcHVibGljOgotICBTaGVsbEF1ZGlvU3RyZWFtZXJMaW51eCgpOwotICB+U2hlbGxBdWRpb1N0cmVhbWVyTGludXgoKTsKLQotICB2aXJ0dWFsIENvbmZpZyBHZXRDb25maWcoKSBjb25zdCBPVkVSUklERTsKLSAgdmlydHVhbCBib29sIEFkZFN0cmVhbShTaGVsbEF1ZGlvU3RyZWFtKiBzdHJlYW0pIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgUmVtb3ZlU3RyZWFtKFNoZWxsQXVkaW9TdHJlYW0qIHN0cmVhbSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgYm9vbCBIYXNTdHJlYW0oU2hlbGxBdWRpb1N0cmVhbSogc3RyZWFtKSBjb25zdCBPVkVSUklERTsKLSAgdmlydHVhbCBib29sIFNldFZvbHVtZShTaGVsbEF1ZGlvU3RyZWFtKiBzdHJlYW0sIGRvdWJsZSB2b2x1bWUpIE9WRVJSSURFOwotCi0gcHJpdmF0ZToKLSAgdHlwZWRlZiBzdGQ6Om1hcDxTaGVsbEF1ZGlvU3RyZWFtKiwgUHVsc2VBdWRpb0hvc3QqPiBTdHJlYW1NYXA7Ci0gIFN0cmVhbU1hcCBzdHJlYW1zXzsKLSAgc2NvcGVkX3B0cjxTaGVsbFB1bHNlQXVkaW9Db250ZXh0PiBwdWxzZV9hdWRpb19jb250ZXh0XzsKLSAgU1RMVmFsdWVEZWxldGVyPFN0cmVhbU1hcD4gc3RyZWFtc192YWx1ZV9kZWxldGVyXzsKLSAgbXV0YWJsZSBiYXNlOjpMb2NrIHN0cmVhbXNfbG9ja187Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNoZWxsQXVkaW9TdHJlYW1lckxpbnV4KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0FVRElPX1NIRUxMX0FVRElPX1NUUkVBTUVSX0xJTlVYX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vc2hlbGxfcHVsc2VfYXVkaW8uY2MgYi9zcmMvbWVkaWEvYXVkaW8vc2hlbGxfcHVsc2VfYXVkaW8uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MWEyNGYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL3NoZWxsX3B1bHNlX2F1ZGlvLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vc2hlbGxfcHVsc2VfYXVkaW8uaCIKLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1TaGVsbFB1bHNlQXVkaW9TdHJlYW06OlNoZWxsUHVsc2VBdWRpb1N0cmVhbSgpCi0gICAgOiBjb250ZXh0XyhOVUxMKSwKLSAgICAgIGxhdGVuY3lfKGtNaW5MYXRlbmN5KSwKLSAgICAgIHN0cmVhbV8oTlVMTCksCi0gICAgICBsYXN0X3JlcXVlc3Rfc2l6ZV8oMCksCi0gICAgICBob3N0XyhOVUxMKSB7Ci19Ci0KLVNoZWxsUHVsc2VBdWRpb1N0cmVhbTo6flNoZWxsUHVsc2VBdWRpb1N0cmVhbSgpIHsKLSAgaWYgKHN0cmVhbV8pIHsKLSAgICBwYV9zdHJlYW1fc2V0X3dyaXRlX2NhbGxiYWNrKHN0cmVhbV8sIE5VTEwsIE5VTEwpOwotICAgIHBhX3N0cmVhbV9zZXRfdW5kZXJmbG93X2NhbGxiYWNrKHN0cmVhbV8sIE5VTEwsIE5VTEwpOwotICAgIHBhX3N0cmVhbV9kaXNjb25uZWN0KHN0cmVhbV8pOwotICAgIHBhX3N0cmVhbV91bnJlZihzdHJlYW1fKTsKLSAgfQotfQotCi1ib29sIFNoZWxsUHVsc2VBdWRpb1N0cmVhbTo6SW5pdGlhbGl6ZShTaGVsbFB1bHNlQXVkaW9Db250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9zdCogaG9zdCwgaW50IHJhdGUsIGludCBjaGFubmVsKSB7Ci0gIGNvbnRleHRfID0gY29udGV4dDsKLSAgaG9zdF8gPSBob3N0OwotICBzYW1wbGVfc3BlY18ucmF0ZSA9IHJhdGU7Ci0gIHNhbXBsZV9zcGVjXy5jaGFubmVscyA9IGNoYW5uZWw7Ci0gIHNhbXBsZV9zcGVjXy5mb3JtYXQgPSBQQV9TQU1QTEVfRkxPQVQzMkxFOwotCi0gIHN0cmVhbV8gPSBwYV9zdHJlYW1fbmV3KGNvbnRleHRfLT5HZXRDb250ZXh0KCksICJQbGF5YmFjayIsICZzYW1wbGVfc3BlY18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICBpZiAoIXN0cmVhbV8pCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHBhX3N0cmVhbV9zZXRfd3JpdGVfY2FsbGJhY2soc3RyZWFtXywgUmVxdWVzdENhbGxiYWNrLCB0aGlzKTsKLSAgcGFfc3RyZWFtX3NldF91bmRlcmZsb3dfY2FsbGJhY2soc3RyZWFtXywgVW5kZXJmbG93Q2FsbGJhY2ssIHRoaXMpOwotICBidWZfYXR0cl8uZnJhZ3NpemUgPSB+MDsKLSAgYnVmX2F0dHJfLm1heGxlbmd0aCA9IHBhX3VzZWNfdG9fYnl0ZXMobGF0ZW5jeV8sICZzYW1wbGVfc3BlY18pOwotICBidWZfYXR0cl8ubWlucmVxID0gcGFfdXNlY190b19ieXRlcygwLCAmc2FtcGxlX3NwZWNfKTsKLSAgYnVmX2F0dHJfLnByZWJ1ZiA9IH4wOwotICBidWZfYXR0cl8udGxlbmd0aCA9IGJ1Zl9hdHRyXy5tYXhsZW5ndGg7Ci0KLSAgY29uc3QgcGFfc3RyZWFtX2ZsYWdzX3Qga05vTGF0ZW5jeSA9Ci0gICAgICBzdGF0aWNfY2FzdDxwYV9zdHJlYW1fZmxhZ3NfdD4oUEFfU1RSRUFNX0lOVEVSUE9MQVRFX1RJTUlORyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFfU1RSRUFNX0FVVE9fVElNSU5HX1VQREFURSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFfU1RSRUFNX1NUQVJUX0NPUktFRCk7Ci0gIGNvbnN0IHBhX3N0cmVhbV9mbGFnc190IGtXaXRoTGF0ZW5jeSA9Ci0gICAgICBzdGF0aWNfY2FzdDxwYV9zdHJlYW1fZmxhZ3NfdD4oa05vTGF0ZW5jeSB8IFBBX1NUUkVBTV9BREpVU1RfTEFURU5DWSk7Ci0gIGlmIChwYV9zdHJlYW1fY29ubmVjdF9wbGF5YmFjaygKLSAgICAgIHN0cmVhbV8sIE5VTEwsICZidWZfYXR0cl8sIGtXaXRoTGF0ZW5jeSwgTlVMTCwgTlVMTCkgPj0gMCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLy8gVHJ5IGFnYWluIHdpdGhvdXQgbGF0ZW5jeSBmbGFnLgotICBpZiAocGFfc3RyZWFtX2Nvbm5lY3RfcGxheWJhY2soCi0gICAgICBzdHJlYW1fLCBOVUxMLCAmYnVmX2F0dHJfLCBrTm9MYXRlbmN5LCBOVUxMLCBOVUxMKSA+PSAwKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcGFfc3RyZWFtX3VucmVmKHN0cmVhbV8pOwotICBzdHJlYW1fID0gTlVMTDsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIFNoZWxsUHVsc2VBdWRpb1N0cmVhbTo6UGxheSgpIHsKLSAgcmV0dXJuIENvcmsoZmFsc2UpOwotfQotCi1ib29sIFNoZWxsUHVsc2VBdWRpb1N0cmVhbTo6UGF1c2UoKSB7Ci0gIHJldHVybiBDb3JrKHRydWUpOwotfQotCi11aW50NjQgU2hlbGxQdWxzZUF1ZGlvU3RyZWFtOjpHZXRQbGF5YmFja0N1cnNvckluTWljcm9TZWNvbmRzKCkgewotICBwYV91c2VjX3QgdXNlYyA9IDA7Ci0gIGlmIChwYV9zdHJlYW1fZ2V0X3RpbWUoc3RyZWFtXywgJnVzZWMpID09IDApCi0gICAgcmV0dXJuIHVzZWM7Ci0gIHJldHVybiAwOwotfQotCi12b2lkIFNoZWxsUHVsc2VBdWRpb1N0cmVhbTo6UmVxdWVzdEZyYW1lKCkgewotICBob3N0Xy0+UmVxdWVzdEZyYW1lKAotICAgICAgbGFzdF9yZXF1ZXN0X3NpemVfLCBiYXNlOjpCaW5kKCZTaGVsbFB1bHNlQXVkaW9TdHJlYW06OldyaXRlRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotfQotCi12b2lkIFNoZWxsUHVsc2VBdWRpb1N0cmVhbTo6UmVxdWVzdENhbGxiYWNrKHBhX3N0cmVhbSogcywgc2l6ZV90IGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlcmRhdGEpIHsKLSAgU2hlbGxQdWxzZUF1ZGlvU3RyZWFtKiBzdHJlYW0gPSBzdGF0aWNfY2FzdDxTaGVsbFB1bHNlQXVkaW9TdHJlYW0qPih1c2VyZGF0YSk7Ci0gIHN0cmVhbS0+SGFuZGxlUmVxdWVzdChsZW5ndGgpOwotfQotCi12b2lkIFNoZWxsUHVsc2VBdWRpb1N0cmVhbTo6SGFuZGxlUmVxdWVzdChzaXplX3QgbGVuZ3RoKSB7Ci0gIGxhc3RfcmVxdWVzdF9zaXplXyA9IGxlbmd0aDsKLX0KLQotdm9pZCBTaGVsbFB1bHNlQXVkaW9TdHJlYW06OlVuZGVyZmxvd0NhbGxiYWNrKHBhX3N0cmVhbSogcywgdm9pZCogdXNlcmRhdGEpIHsKLSAgU2hlbGxQdWxzZUF1ZGlvU3RyZWFtKiBzdHJlYW0gPSBzdGF0aWNfY2FzdDxTaGVsbFB1bHNlQXVkaW9TdHJlYW0qPih1c2VyZGF0YSk7Ci0gIHN0cmVhbS0+SGFuZGxlVW5kZXJmbG93KCk7Ci19Ci0KLXZvaWQgU2hlbGxQdWxzZUF1ZGlvU3RyZWFtOjpIYW5kbGVVbmRlcmZsb3coKSB7Ci0gIGlmIChsYXRlbmN5XyA8IGtNYXhMYXRlbmN5KSB7Ci0gICAgbGF0ZW5jeV8gKj0gMjsKLSAgICBpZiAobGF0ZW5jeV8gPiBrTWF4TGF0ZW5jeSkKLSAgICAgIGxhdGVuY3lfID0ga01heExhdGVuY3k7Ci0gICAgYnVmX2F0dHJfLm1heGxlbmd0aCA9IHBhX3VzZWNfdG9fYnl0ZXMobGF0ZW5jeV8sICZzYW1wbGVfc3BlY18pOwotICAgIGJ1Zl9hdHRyXy50bGVuZ3RoID0gYnVmX2F0dHJfLm1heGxlbmd0aDsKLSAgICBwYV9zdHJlYW1fc2V0X2J1ZmZlcl9hdHRyKHN0cmVhbV8sICZidWZfYXR0cl8sIE5VTEwsIE5VTEwpOwotICB9Ci19Ci0KLWJvb2wgU2hlbGxQdWxzZUF1ZGlvU3RyZWFtOjpDb3JrKGJvb2wgcGF1c2UpIHsKLSAgcGFfc3RyZWFtX2Nvcmsoc3RyZWFtXywgcGF1c2UsIFN1Y2Nlc3NDYWxsYmFjaywgTlVMTCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFNoZWxsUHVsc2VBdWRpb1N0cmVhbTo6U3VjY2Vzc0NhbGxiYWNrKHBhX3N0cmVhbSogcywgaW50IHN1Y2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXJkYXRhKSB7Ci19Ci0KLXZvaWQgU2hlbGxQdWxzZUF1ZGlvU3RyZWFtOjpXcml0ZUZyYW1lKGNvbnN0IHVpbnQ4KiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICBEQ0hFQ0tfTEUoc2l6ZSwgbGFzdF9yZXF1ZXN0X3NpemVfKTsKLSAgaWYgKHNpemUgIT0gMCkKLSAgICBwYV9zdHJlYW1fd3JpdGUoc3RyZWFtXywgZGF0YSwgc2l6ZSwgTlVMTCwgMExMLCBQQV9TRUVLX1JFTEFUSVZFKTsKLSAgbGFzdF9yZXF1ZXN0X3NpemVfIC09IHNpemU7Ci19Ci0KLVNoZWxsUHVsc2VBdWRpb0NvbnRleHQ6OlNoZWxsUHVsc2VBdWRpb0NvbnRleHQoKQotICAgIDogbWFpbmxvb3BfKE5VTEwpLAotICAgICAgY29udGV4dF8oTlVMTCksCi0gICAgICBwdWxzZV90aHJlYWRfKCJQdWxzZUF1ZGlvVGhyZWFkIikgewotfQotCi1TaGVsbFB1bHNlQXVkaW9Db250ZXh0Ojp+U2hlbGxQdWxzZUF1ZGlvQ29udGV4dCgpIHsKLSAgcHVsc2VfdGhyZWFkXy5TdG9wKCk7Ci0gIERDSEVDSyhzdHJlYW1zXy5lbXB0eSgpKTsKLSAgaWYgKGNvbnRleHRfKSB7Ci0gICAgcGFfY29udGV4dF9kaXNjb25uZWN0KGNvbnRleHRfKTsKLSAgICBwYV9jb250ZXh0X3VucmVmKGNvbnRleHRfKTsKLSAgfQotICBpZiAobWFpbmxvb3BfKSB7Ci0gICAgcGFfbWFpbmxvb3BfZnJlZShtYWlubG9vcF8pOwotICB9Ci0gIGlmIChwdWxzZV90aHJlYWRfLklzUnVubmluZygpKSB7Ci0gICAgcHVsc2VfdGhyZWFkXy5TdG9wKCk7Ci0gIH0KLX0KLQotYm9vbCBTaGVsbFB1bHNlQXVkaW9Db250ZXh0OjpJbml0aWFsaXplKCkgewotICBtYWlubG9vcF8gPSBwYV9tYWlubG9vcF9uZXcoKTsKLSAgY29udGV4dF8gPSBwYV9jb250ZXh0X25ldyhwYV9tYWlubG9vcF9nZXRfYXBpKG1haW5sb29wXyksICJTaGVsbFB1bHNlQXVkaW8iKTsKLQotICAvLyBTZXQgdGhlIHN0YXRlIGNhbGxiYWNrLiBUaGlzIHdpbGwgYmUgY2FsbGVkIGZyb20gd2l0aCBwYV9tYWlubG9vcF9pdGVyYXRlLgotICBpbnQgcGFfcmVhZHkgPSBrSW5pdGlhbDsKLSAgcGFfY29udGV4dF9zZXRfc3RhdGVfY2FsbGJhY2soY29udGV4dF8sIFN0YXRlQ2FsbGJhY2ssICZwYV9yZWFkeSk7Ci0KLSAgLy8gVHJ5IHRvIGNvbm5lY3QgdG8gdGhlIGNvbnRleHQsIG9yIHJldHVybiBvbiBmYWlsdXJlLgotICBpZiAocGFfY29udGV4dF9jb25uZWN0KGNvbnRleHRfLCBOVUxMLCBwYV9jb250ZXh0X2ZsYWdzX3QoKSwgTlVMTCkgPCAwKSB7Ci0gICAgRExPRyhFUlJPUikgPDwgIkVycm9yIGNvbm5lY3RpbmcgdG8gY29udGV4dC4iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFdhaXQgdW50aWwgdGhlIGNvbnRleHQgaXMgcmVhZHkuCi0gIHdoaWxlIChwYV9yZWFkeSA9PSBrSW5pdGlhbCkgewotICAgIHBhX21haW5sb29wX2l0ZXJhdGUobWFpbmxvb3BfLCAxLCBOVUxMKTsKLSAgfQotCi0gIC8vIENsZWFyIHRoZSBzdGF0ZSBjYWxsYmFjay4KLSAgcGFfY29udGV4dF9zZXRfc3RhdGVfY2FsbGJhY2soY29udGV4dF8sIE5VTEwsIE5VTEwpOwotCi0gIGlmIChwYV9yZWFkeSA9PSBrUmVhZHkpIHsKLSAgICBiYXNlOjpUaHJlYWQ6Ok9wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLnByaW9yaXR5ID0gYmFzZTo6a1RocmVhZFByaW9yaXR5X1JlYWx0aW1lQXVkaW87Ci0gICAgcHVsc2VfdGhyZWFkXy5TdGFydFdpdGhPcHRpb25zKG9wdGlvbnMpOwotICAgIHB1bHNlX3RocmVhZF8ubWVzc2FnZV9sb29wKCktPlBvc3RUYXNrKEZST01fSEVSRSwKLSAgICAgICAgYmFzZTo6QmluZCgmU2hlbGxQdWxzZUF1ZGlvQ29udGV4dDo6SXRlcmF0ZSwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICB9Ci0KLSAgcmV0dXJuIHBhX3JlYWR5ID09IGtSZWFkeTsKLX0KLQotcGFfY29udGV4dCogU2hlbGxQdWxzZUF1ZGlvQ29udGV4dDo6R2V0Q29udGV4dCgpIHsKLSAgcmV0dXJuIGNvbnRleHRfOwotfQotCi12b2lkIFNoZWxsUHVsc2VBdWRpb0NvbnRleHQ6Okl0ZXJhdGUoKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGxvY2sobG9ja18pOwotICBwdWxzZV90aHJlYWRfLm1lc3NhZ2VfbG9vcCgpLT5Qb3N0RGVsYXllZFRhc2soCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJlNoZWxsUHVsc2VBdWRpb0NvbnRleHQ6Okl0ZXJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoNSkpOwotICBwYV9tYWlubG9vcF9pdGVyYXRlKG1haW5sb29wXywgMCwgTlVMTCk7Ci0KLSAgZm9yIChTdHJlYW1zOjppdGVyYXRvciBpdGVyID0gc3RyZWFtc18uYmVnaW4oKTsKLSAgICAgICBpdGVyICE9IHN0cmVhbXNfLmVuZCgpOyArK2l0ZXIpIHsKLSAgICAoKml0ZXIpLT5SZXF1ZXN0RnJhbWUoKTsKLSAgfQotfQotCi1TaGVsbFB1bHNlQXVkaW9TdHJlYW0qIFNoZWxsUHVsc2VBdWRpb0NvbnRleHQ6OkNyZWF0ZVN0cmVhbSgKLSAgICBTaGVsbFB1bHNlQXVkaW9TdHJlYW06Okhvc3QqIGhvc3QsIGludCByYXRlLCBpbnQgY2hhbm5lbCkgewotICBiYXNlOjpBdXRvTG9jayBsb2NrKGxvY2tfKTsKLQotICBTaGVsbFB1bHNlQXVkaW9TdHJlYW0qIHN0cmVhbSA9IG5ldyBTaGVsbFB1bHNlQXVkaW9TdHJlYW07Ci0gIGJvb2wgcmVzdWx0ID0gc3RyZWFtLT5Jbml0aWFsaXplKHRoaXMsIGhvc3QsIHJhdGUsIGNoYW5uZWwpOwotICBEQ0hFQ0socmVzdWx0KTsKLSAgc3RyZWFtc18uaW5zZXJ0KHN0cmVhbSk7Ci0gIHJldHVybiBzdHJlYW07Ci19Ci0KLXZvaWQgU2hlbGxQdWxzZUF1ZGlvQ29udGV4dDo6RGVzdHJveVN0cmVhbShTaGVsbFB1bHNlQXVkaW9TdHJlYW0qIHN0cmVhbSkgewotICBiYXNlOjpBdXRvTG9jayBsb2NrKGxvY2tfKTsKLSAgRENIRUNLKHN0cmVhbXNfLmZpbmQoc3RyZWFtKSAhPSBzdHJlYW1zXy5lbmQoKSk7Ci0gIHN0cmVhbXNfLmVyYXNlKHN0cmVhbXNfLmZpbmQoc3RyZWFtKSk7Ci0gIGRlbGV0ZSBzdHJlYW07Ci19Ci0KLXZvaWQgU2hlbGxQdWxzZUF1ZGlvQ29udGV4dDo6U3RhdGVDYWxsYmFjayhwYV9jb250ZXh0KiBjLCB2b2lkKiB1c2VyZGF0YSkgewotICBpbnQqIHBhX3JlYWR5ID0gc3RhdGljX2Nhc3Q8aW50Kj4odXNlcmRhdGEpOwotCi0gIHN3aXRjaCAocGFfY29udGV4dF9nZXRfc3RhdGUoYykpIHsKLSAgICBjYXNlIFBBX0NPTlRFWFRfRkFJTEVEOgotICAgIGNhc2UgUEFfQ09OVEVYVF9URVJNSU5BVEVEOgotICAgICAgKnBhX3JlYWR5ID0ga0Vycm9yOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQQV9DT05URVhUX1JFQURZOgotICAgICAgKnBhX3JlYWR5ID0ga1JlYWR5OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vc2hlbGxfcHVsc2VfYXVkaW8uaCBiL3NyYy9tZWRpYS9hdWRpby9zaGVsbF9wdWxzZV9hdWRpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjkyZWJhLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9zaGVsbF9wdWxzZV9hdWRpby5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaWZuZGVmIE1FRElBX0FVRElPX1NIRUxMX1BVTFNFX0FVRElPX0hfCi0jZGVmaW5lIE1FRElBX0FVRElPX1NIRUxMX1BVTFNFX0FVRElPX0hfCi0KLSNpbmNsdWRlIDxwdWxzZS9wdWxzZWF1ZGlvLmg+Ci0KLSNpbmNsdWRlIDxzZXQ+Ci0KLSNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi9sb2NrLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIFNoZWxsUHVsc2VBdWRpb0NvbnRleHQ7Ci0KLWNsYXNzIFNoZWxsUHVsc2VBdWRpb1N0cmVhbSB7Ci0gcHVibGljOgotICBjbGFzcyBIb3N0IHsKLSAgIHB1YmxpYzoKLSAgICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHZvaWQoY29uc3QgdWludDgqLCBzaXplX3QpPiBXcml0ZUZ1bmM7Ci0gICAgdmlydHVhbCB+SG9zdCgpIHt9Ci0gICAgdmlydHVhbCB2b2lkIFJlcXVlc3RGcmFtZShzaXplX3QgbGVuZ3RoLCBXcml0ZUZ1bmMgd3JpdGUpID0gMDsKLSAgfTsKLQotICBTaGVsbFB1bHNlQXVkaW9TdHJlYW0oKTsKLSAgflNoZWxsUHVsc2VBdWRpb1N0cmVhbSgpOwotCi0gIGJvb2wgSW5pdGlhbGl6ZShTaGVsbFB1bHNlQXVkaW9Db250ZXh0KiBjb250ZXh0LCBIb3N0KiBob3N0LCBpbnQgcmF0ZSwKLSAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsKTsKLSAgYm9vbCBQbGF5KCk7Ci0gIGJvb2wgUGF1c2UoKTsKLSAgdWludDY0IEdldFBsYXliYWNrQ3Vyc29ySW5NaWNyb1NlY29uZHMoKTsKLSAgdm9pZCBSZXF1ZXN0RnJhbWUoKTsKLQotIHByaXZhdGU6Ci0gIGVudW0gewotICAgIGtJbml0aWFsID0gMCwKLSAgICBrU3VjY2VzcywKLSAgICBrRmFpbHVyZQotICB9OwotCi0gIHN0YXRpYyBjb25zdCBpbnQga01pbkxhdGVuY3kgPSAxMDAwMDAwOwotICBzdGF0aWMgY29uc3QgaW50IGtNYXhMYXRlbmN5ID0gNDAwMDAwMDsKLQotICBzdGF0aWMgdm9pZCBSZXF1ZXN0Q2FsbGJhY2socGFfc3RyZWFtKiBzLCBzaXplX3QgbGVuZ3RoLCB2b2lkKiB1c2VyZGF0YSk7Ci0gIHZvaWQgSGFuZGxlUmVxdWVzdChzaXplX3QgbGVuZ3RoKTsKLSAgc3RhdGljIHZvaWQgVW5kZXJmbG93Q2FsbGJhY2socGFfc3RyZWFtKiBzLCB2b2lkKiB1c2VyZGF0YSk7Ci0gIHZvaWQgSGFuZGxlVW5kZXJmbG93KCk7Ci0gIHN0YXRpYyB2b2lkIFN1Y2Nlc3NDYWxsYmFjayhwYV9zdHJlYW0qIHMsIGludCBzdWNjZXNzLCB2b2lkKiB1c2VyZGF0YSk7Ci0gIGJvb2wgQ29yayhib29sIHBhdXNlKTsKLQotICB2b2lkIFdyaXRlRnJhbWUoY29uc3QgdWludDgqIGRhdGEsIHNpemVfdCBzaXplKTsKLQotICBTaGVsbFB1bHNlQXVkaW9Db250ZXh0KiBjb250ZXh0XzsKLSAgaW50IGxhdGVuY3lfOwotICBwYV9idWZmZXJfYXR0ciBidWZfYXR0cl87Ci0gIHBhX3NhbXBsZV9zcGVjIHNhbXBsZV9zcGVjXzsKLSAgcGFfc3RyZWFtKiBzdHJlYW1fOwotICBzaXplX3QgbGFzdF9yZXF1ZXN0X3NpemVfOwotICBIb3N0KiBob3N0XzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU2hlbGxQdWxzZUF1ZGlvU3RyZWFtKTsKLX07Ci0KLWNsYXNzIFNoZWxsUHVsc2VBdWRpb0NvbnRleHQgewotIHB1YmxpYzoKLSAgU2hlbGxQdWxzZUF1ZGlvQ29udGV4dCgpOwotICB+U2hlbGxQdWxzZUF1ZGlvQ29udGV4dCgpOwotCi0gIGJvb2wgSW5pdGlhbGl6ZSgpOwotICBwYV9jb250ZXh0KiBHZXRDb250ZXh0KCk7Ci0gIHZvaWQgSXRlcmF0ZSgpOwotCi0gIFNoZWxsUHVsc2VBdWRpb1N0cmVhbSogQ3JlYXRlU3RyZWFtKFNoZWxsUHVsc2VBdWRpb1N0cmVhbTo6SG9zdCogaG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJhdGUsIGludCBjaGFubmVsKTsKLSAgdm9pZCBEZXN0cm95U3RyZWFtKFNoZWxsUHVsc2VBdWRpb1N0cmVhbSogc3RyZWFtKTsKLQotICBiYXNlOjpMb2NrJiBsb2NrKCkgeyByZXR1cm4gbG9ja187IH0KLQotIHByaXZhdGU6Ci0gIHR5cGVkZWYgc3RkOjpzZXQ8U2hlbGxQdWxzZUF1ZGlvU3RyZWFtKj4gU3RyZWFtczsKLSAgZW51bSB7Ci0gICAga0luaXRpYWwgPSAwLAotICAgIGtSZWFkeSwKLSAgICBrRXJyb3IKLSAgfTsKLQotICBzdGF0aWMgdm9pZCBTdGF0ZUNhbGxiYWNrKHBhX2NvbnRleHQqIGMsIHZvaWQqIHVzZXJkYXRhKTsKLQotICBwYV9tYWlubG9vcCogbWFpbmxvb3BfOwotICBwYV9jb250ZXh0KiBjb250ZXh0XzsKLSAgYmFzZTo6VGhyZWFkIHB1bHNlX3RocmVhZF87Ci0KLSAgU3RyZWFtcyBzdHJlYW1zXzsKLSAgYmFzZTo6TG9jayBsb2NrXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU2hlbGxQdWxzZUF1ZGlvQ29udGV4dCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9BVURJT19TSEVMTF9QVUxTRV9BVURJT19IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL3NoZWxsX3dhdl90ZXN0X3Byb2JlLmNjIGIvc3JjL21lZGlhL2F1ZGlvL3NoZWxsX3dhdl90ZXN0X3Byb2JlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDE5N2ExLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby9zaGVsbF93YXZfdGVzdF9wcm9iZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vc2hlbGxfd2F2X3Rlc3RfcHJvYmUuaCIKLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvZmlsZV9wYXRoLmgiCi0jaW5jbHVkZSAiYmFzZS9maWxlX3V0aWwuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL3BhdGhfc2VydmljZS5oIgotI2luY2x1ZGUgImJhc2UvcGxhdGZvcm1fZmlsZS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZW5kaWFuX3V0aWwuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL3NoZWxsX2RlbXV4ZXIuaCIKLQotLy8gZG9uJ3QgaW5jbHVkZSBtZSBpbiByZWxlYXNlIGJ1aWxkcyBwbGVhc2UKLSNpZiAhZGVmaW5lZChfX0xCX1NIRUxMX19GT1JfUkVMRUFTRV9fKQotCi1zdGF0aWMgY29uc3QgdWludDE2IGtXYXZGb3JtYXRDb2RlUENNID0gMHgwMDAxOwotc3RhdGljIGNvbnN0IHVpbnQxNiBrV2F2Rm9ybWF0Q29kZUlFRUVGbG9hdCA9IDB4MDAwMzsKLS8vICJSSUZGIiBpbiBBU0NJSSAoYmlnLWVuZGlhbikKLXN0YXRpYyBjb25zdCB1aW50MzIga1dhdl9SSUZGID0gMHg1MjQ5NDY0NjsKLS8vICJXQVZFIiBpbiBBU0NJSSAoYmlnLWVuZGlhbikKLXN0YXRpYyBjb25zdCB1aW50MzIga1dhdl9XQVZFID0gMHg1NzQxNTY0NTsKLS8vICJmbXQgIiBpbiBBU0NJSSAoYmlnLWVuZGlhbikKLXN0YXRpYyBjb25zdCB1aW50MzIga1dhdl9mbXQgPSAweDY2NmQ3NDIwOwotLy8gImRhdGEiIGluIEFTQ0lJIChiaWctZW5kaWFuKQotc3RhdGljIGNvbnN0IHVpbnQzMiBrV2F2X2RhdGEgPSAweDY0NjE3NDYxOwotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1TaGVsbFdhdlRlc3RQcm9iZTo6U2hlbGxXYXZUZXN0UHJvYmUoKQotICAgIDogd2F2X2ZpbGVfKE5VTEwpLAotICAgICAgZm9ybV93YXZfbGVuZ3RoX2J5dGVzXyhrV2F2VG90YWxIZWFkZXJMZW5ndGggLSA4KSwKLSAgICAgIGZvcm1hdF9jb2RlXygwKSwKLSAgICAgIGNoYW5uZWxzXygwKSwKLSAgICAgIHNhbXBsZXNfcGVyX3NlY29uZF8oMCksCi0gICAgICBiaXRzX3Blcl9zYW1wbGVfKDApLAotICAgICAgYnl0ZXNfcGVyX2ZyYW1lXygwKSwKLSAgICAgIGNsb3NlZF8odHJ1ZSksCi0gICAgICBjbG9zZV9hZnRlcl9tc18oMCkge30KLQotdm9pZCBTaGVsbFdhdlRlc3RQcm9iZTo6SW5pdGlhbGl6ZShjb25zdCBjaGFyKiBmaWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlc19wZXJfc2Vjb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0c19wZXJfc2FtcGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9mbG9hdHMpIHsKLSAgLy8gdHJ5IHRvIG9wZW4gZmlsZSBmaXJzdAotICBGaWxlUGF0aCBiYXNlX3BhdGg7Ci0gIGJvb2wgcGF0aF9vayA9IFBhdGhTZXJ2aWNlOjpHZXQoYmFzZTo6RElSX0VYRSwgJmJhc2VfcGF0aCk7Ci0gIERDSEVDSyhwYXRoX29rKTsKLSAgYmFzZV9wYXRoID0gYmFzZV9wYXRoLkFwcGVuZChmaWxlX25hbWUpOwotICB3YXZfZmlsZV8gPSBiYXNlOjpDcmVhdGVQbGF0Zm9ybUZpbGUoCi0gICAgICBiYXNlX3BhdGgsIGJhc2U6OlBMQVRGT1JNX0ZJTEVfQ1JFQVRFX0FMV0FZUyB8IGJhc2U6OlBMQVRGT1JNX0ZJTEVfV1JJVEUsCi0gICAgICBOVUxMLCBOVUxMKTsKLSAgRENIRUNLX05FKHdhdl9maWxlXywgYmFzZTo6a0ludmFsaWRQbGF0Zm9ybUZpbGVWYWx1ZSk7Ci0gIGNsb3NlZF8gPSBmYWxzZTsKLQotICBpZiAodXNlX2Zsb2F0cykKLSAgICBmb3JtYXRfY29kZV8gPSBrV2F2Rm9ybWF0Q29kZUlFRUVGbG9hdDsKLSAgZWxzZQotICAgIGZvcm1hdF9jb2RlXyA9IGtXYXZGb3JtYXRDb2RlUENNOwotCi0gIGNoYW5uZWxzXyA9IGNoYW5uZWxfY291bnQ7Ci0KLSAgYml0c19wZXJfc2FtcGxlXyA9ICh1aW50MTYpYml0c19wZXJfc2FtcGxlOwotICBzYW1wbGVzX3Blcl9zZWNvbmRfID0gc2FtcGxlc19wZXJfc2Vjb25kOwotCi0gIGJ5dGVzX3Blcl9mcmFtZV8gPSAoYml0c19wZXJfc2FtcGxlXyAvIDgpICogY2hhbm5lbHNfOwotCi0gIC8vIHdyaXRlIHRlbXBvcmFyeSBoZWFkZXIsIGl0J3MgaW5jb21wbGV0ZSB1bnRpbCB3ZSBrbm93IHRoZSB3aG9sZSBsZW5ndGgKLSAgLy8gb2YgdGhlIHNhbXBsZSBzdHJlYW0sIGJ1dCB0aGlzIHdpbGwgYWR2YW5jZSBmaWxlIHBvaW50ZXIgdG8gc3RhcnQgb2YKLSAgLy8gYXVkaW8gZGF0YQotICBXcml0ZUhlYWRlcigpOwotfQotCi0vLyBzZWU6IGh0dHA6Ly93d3ctbW1zcC5lY2UubWNnaWxsLmNhL0RvY3VtZW50cy9BdWRpb0Zvcm1hdHMvV0FWRS9XQVZFLmh0bWwKLXZvaWQgU2hlbGxXYXZUZXN0UHJvYmU6OldyaXRlSGVhZGVyKCkgewotICAvLyBmaXJzdCBmb3VyIGJ5dGVzIGFyZSBGT1JNIFJJRkYgaGVhZGVyCi0gIGVuZGlhbl91dGlsOjpzdG9yZV91aW50MzJfYmlnX2VuZGlhbihrV2F2X1JJRkYsIHdhdl9oZWFkZXJfYnVmZmVyXyk7Ci0gIC8vIG5leHQgZm9yIGFyZSBsZW5ndGggb2YgZmlsZSAtIEZPUk0gaGVhZGVyLCB1aW50MzIgbGl0dGxlLWVuZGlhbgotICBlbmRpYW5fdXRpbDo6c3RvcmVfdWludDMyX2xpdHRsZV9lbmRpYW4oZm9ybV93YXZfbGVuZ3RoX2J5dGVzXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdl9oZWFkZXJfYnVmZmVyXyArIDQpOwotICAvLyB0aGVuIFdBVkUgaGVhZGVyCi0gIGVuZGlhbl91dGlsOjpzdG9yZV91aW50MzJfYmlnX2VuZGlhbihrV2F2X1dBVkUsIHdhdl9oZWFkZXJfYnVmZmVyXyArIDgpOwotICAvLyBzdGFydCBjb21tb24gY2h1bmsgd2l0aCBmb3JtYXQgImZtdCAiIGhlYWRlcgotICBlbmRpYW5fdXRpbDo6c3RvcmVfdWludDMyX2JpZ19lbmRpYW4oa1dhdl9mbXQsIHdhdl9oZWFkZXJfYnVmZmVyXyArIDEyKTsKLSAgLy8gbGVuZ3RoIG9mIGZvcm1hdCBjaHVuaywgdWludDMyIGxpdHRsZS1lbmRpYW4KLSAgZW5kaWFuX3V0aWw6OnN0b3JlX3VpbnQzMl9saXR0bGVfZW5kaWFuKGtXYXZGb3JtYXRDaHVua0xlbmd0aCAtIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXZfaGVhZGVyX2J1ZmZlcl8gKyAxNik7Ci0gIC8vIGZvcm1hdCBjb2RlLCB1aW50MTYgbGl0dGxlLWVuZGlhbgotICBlbmRpYW5fdXRpbDo6c3RvcmVfdWludDE2X2xpdHRsZV9lbmRpYW4oZm9ybWF0X2NvZGVfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F2X2hlYWRlcl9idWZmZXJfICsgMjApOwotICAvLyBudW1iZXIgb2YgY2hhbm5lbHMsIHVpbnQxNiBsaXR0bGUtZW5kaWFuCi0gIGVuZGlhbl91dGlsOjpzdG9yZV91aW50MTZfbGl0dGxlX2VuZGlhbihjaGFubmVsc18sIHdhdl9oZWFkZXJfYnVmZmVyXyArIDIyKTsKLSAgLy8gc2FtcGxlIHJhdGUsIHVpbnQzMiBsaXR0bGUtZW5kaWFuCi0gIGVuZGlhbl91dGlsOjpzdG9yZV91aW50MzJfbGl0dGxlX2VuZGlhbihzYW1wbGVzX3Blcl9zZWNvbmRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F2X2hlYWRlcl9idWZmZXJfICsgMjQpOwotICAvLyBhdmVyYWdlIGJ5dGVzIHBlciBzZWNvbmQsIHVpbnQzMiBsaXR0bGUtZW5kaWFuLCBkZXJpdmVkCi0gIHVpbnQzMiBieXRlc19wZXJfc2Vjb25kID0gc2FtcGxlc19wZXJfc2Vjb25kXyAqIGJ5dGVzX3Blcl9mcmFtZV87Ci0gIGVuZGlhbl91dGlsOjpzdG9yZV91aW50MzJfbGl0dGxlX2VuZGlhbihieXRlc19wZXJfc2Vjb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F2X2hlYWRlcl9idWZmZXJfICsgMjgpOwotICAvLyAiYmxvY2sgYWxpZ24iLCByZWFkaW5nIGFzIGJ5dGVzIHBlciBmcmFtZSwgdWludDE2IGxpdHRsZS1lbmRpYW4KLSAgZW5kaWFuX3V0aWw6OnN0b3JlX3VpbnQxNl9saXR0bGVfZW5kaWFuKGJ5dGVzX3Blcl9mcmFtZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXZfaGVhZGVyX2J1ZmZlcl8gKyAzMik7Ci0gIC8vIGJpdHMgcGVyIHNhbXBsZSwgdWludDE2IGxpdHRsZS1lbmRpYW4KLSAgZW5kaWFuX3V0aWw6OnN0b3JlX3VpbnQxNl9saXR0bGVfZW5kaWFuKGJpdHNfcGVyX3NhbXBsZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXZfaGVhZGVyX2J1ZmZlcl8gKyAzNCk7Ci0gIC8vIHNpemUgb2YgZXh0ZW5zaW9uIGZvcm1hdCBjaHVuayBoZWFkZXIsIHVpbnQxNiBsaXR0bGUtZW5kaWFuCi0gIC8vIGFsd2F5cyAyMiBieXRlcyBmb3IgdXMgc28gd2UgY2FuIGRvID4gMiBjaGFubmVscyBhdWRpbwotICBlbmRpYW5fdXRpbDo6c3RvcmVfdWludDE2X2xpdHRsZV9lbmRpYW4oMjIsIHdhdl9oZWFkZXJfYnVmZmVyXyArIDM2KTsKLSAgLy8gdmFsaWQgYml0cyBwZXIgc2FtcGxlLCBhbHdheXMgc2FtZSBhcyBiaXRzIHBlciBzYW1wbGUKLSAgZW5kaWFuX3V0aWw6OnN0b3JlX3VpbnQxNl9saXR0bGVfZW5kaWFuKGJpdHNfcGVyX3NhbXBsZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXZfaGVhZGVyX2J1ZmZlcl8gKyAzOCk7Ci0gIC8vIGNoYW5uZWwgbWFzaywgNCBieXRlcywgc2V0IHRvIGFsbCB6ZXJvZXMgdG8ga2VlcCBkZWZhdWx0IGNoYW5uZWwgbGF5b3V0Ci0gIGVuZGlhbl91dGlsOjpzdG9yZV91aW50MzJfbGl0dGxlX2VuZGlhbigwLCB3YXZfaGVhZGVyX2J1ZmZlcl8gKyA0MCk7Ci0gIC8vIHN1YmZvcm1hdCBndWlkLCAxNiBieXRlcywgZmlyc3QgdHdvIGJ5dGVzIGFyZSBmb3JtYXQgY29kZSBhZ2FpbiwgcmVzdAotICAvLyBhcmUgYSBtYWdpYyBudW1iZXIgMDAgMDAgMDAgMDAgMTAgMDAgICA4MCAwMCAwMCBhYSAwMCAzOCA5YiA3MQotICB1aW50NjQgbWFnaWNfbXNkID0gKCh1aW50NjQpZm9ybWF0X2NvZGVfIDw8IDQ4KSB8IDB4MDAwMDAwMDAwMDAwMTAwMDsKLSAgZW5kaWFuX3V0aWw6OnN0b3JlX3VpbnQ2NF9iaWdfZW5kaWFuKG1hZ2ljX21zZCwgd2F2X2hlYWRlcl9idWZmZXJfICsgNDQpOwotICBlbmRpYW5fdXRpbDo6c3RvcmVfdWludDY0X2JpZ19lbmRpYW4oMHg4MDAwMDBhYTAwMzg5YjcxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F2X2hlYWRlcl9idWZmZXJfICsgNTIpOwotICAvLyBzdGFydCB0aGUgZGF0YSBjaHVuayB3aXRoICJkYXRhIiBoZWFkZXIKLSAgZW5kaWFuX3V0aWw6OnN0b3JlX3VpbnQzMl9iaWdfZW5kaWFuKGtXYXZfZGF0YSwgd2F2X2hlYWRlcl9idWZmZXJfICsgNjApOwotICAvLyBkYXRhIGNodW5rIHNpemUgaXMgZm9ybSB3YXYgbGVuZ3RoIG1pbnVzIHRoZSByZXN0IG9mIHRoZSBoZWFkZXIgYnl0ZXMKLSAgLy8gdWludDMyIGxpdHRsZS1lbmRpYW4KLSAgdWludDMyIGRhdGFfY2h1bmtfc2l6ZSA9IGZvcm1fd2F2X2xlbmd0aF9ieXRlc18gLSAoa1dhdlRvdGFsSGVhZGVyTGVuZ3RoIC0gOCk7Ci0gIGVuZGlhbl91dGlsOjpzdG9yZV91aW50MzJfbGl0dGxlX2VuZGlhbihkYXRhX2NodW5rX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXZfaGVhZGVyX2J1ZmZlcl8gKyA2NCk7Ci0gIC8vIGFscmlnaHQsIGFpZmYgaGVhZGVyIGJ1ZmZlciBpcyBjdXJyZW50LCBub3cgd2UgY2FuIHdyaXRlIGl0IGludG8gdGhlIGZpbGUKLSAgLy8ganVtcCB0byBzdGFydCBvZiBmaWxlCi0gIGludCByZXN1bHQgPQotICAgICAgYmFzZTo6U2Vla1BsYXRmb3JtRmlsZSh3YXZfZmlsZV8sIGJhc2U6OlBMQVRGT1JNX0ZJTEVfRlJPTV9CRUdJTiwgMCk7Ci0gIC8vIHdyaXRlIGJ1ZmZlcgotICByZXN1bHQgPSBiYXNlOjpXcml0ZVBsYXRmb3JtRmlsZUF0Q3VycmVudFBvcygKLSAgICAgIHdhdl9maWxlXywgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4od2F2X2hlYWRlcl9idWZmZXJfKSwKLSAgICAgIGtXYXZUb3RhbEhlYWRlckxlbmd0aCk7Ci0gIERDSEVDS19FUShyZXN1bHQsIGtXYXZUb3RhbEhlYWRlckxlbmd0aCk7Ci19Ci0KLXZvaWQgU2hlbGxXYXZUZXN0UHJvYmU6OkNsb3NlQWZ0ZXIodWludDY0IG1pbGxpc2Vjb25kcykgewotICBjbG9zZV9hZnRlcl9tc18gPSBtaWxsaXNlY29uZHM7Ci19Ci0KLXZvaWQgU2hlbGxXYXZUZXN0UHJvYmU6OkFkZERhdGEoY29uc3QgdWludDgqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NCB0aW1lc3RhbXApIHsKLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfX0JJR19FTkRJQU5fXykgfHwgXAotICAgIChkZWZpbmVkKE9TX1NUQVJCT0FSRCkgJiYgZGVmaW5lZChTQl9JU19CSUdfRU5ESUFOKSAmJiBTQl9JU19CSUdfRU5ESUFOKQotICB1aW50OCogcmV2ZXJzZV9idWZmZXIgPSAodWludDgqKW1hbGxvYyhsZW5ndGgpOwotICB1aW50MTYgYnl0ZXNfcGVyX3NhbXBsZSA9IGJpdHNfcGVyX3NhbXBsZV8gLyA4OwotICBpbnQgbnVtX3dvcmRzID0gbGVuZ3RoIC8gYnl0ZXNfcGVyX3NhbXBsZTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fd29yZHM7IGkrKykgewotICAgIHVpbnQ4KiBvdXQgPSByZXZlcnNlX2J1ZmZlciArIChpICogYnl0ZXNfcGVyX3NhbXBsZSk7Ci0gICAgaWYgKGJ5dGVzX3Blcl9zYW1wbGUgPT0gMikgewotICAgICAgZW5kaWFuX3V0aWw6OnN0b3JlX3VpbnQxNl9saXR0bGVfZW5kaWFuKCgodWludDE2KilkYXRhKVtpXSwgb3V0KTsKLSAgICB9IGVsc2UgaWYgKGJ5dGVzX3Blcl9zYW1wbGUgPT0gNCkgewotICAgICAgZW5kaWFuX3V0aWw6OnN0b3JlX3VpbnQzMl9saXR0bGVfZW5kaWFuKCgodWludDMyKilkYXRhKVtpXSwgb3V0KTsKLSAgICB9IGVsc2UgewotICAgICAgRExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBhZGQgZGF0YSI7Ci0gICAgfQotICB9Ci0gIEFkZERhdGFMaXR0bGVFbmRpYW4ocmV2ZXJzZV9idWZmZXIsIGxlbmd0aCwgdGltZXN0YW1wKTsKLSAgZnJlZShyZXZlcnNlX2J1ZmZlcik7Ci0jZWxzZQotICBBZGREYXRhTGl0dGxlRW5kaWFuKGRhdGEsIGxlbmd0aCwgdGltZXN0YW1wKTsKLSNlbmRpZgotfQotCi12b2lkIFNoZWxsV2F2VGVzdFByb2JlOjpBZGREYXRhTGl0dGxlRW5kaWFuKGNvbnN0IHVpbnQ4KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjQgdGltZXN0YW1wKSB7Ci0gIGlmIChjbG9zZWRfKQotICAgIHJldHVybjsKLSAgaWYgKCFsZW5ndGgpCi0gICAgcmV0dXJuOwotCi0gIGludCByZXN1bHQgPSBiYXNlOjpXcml0ZVBsYXRmb3JtRmlsZUF0Q3VycmVudFBvcygKLSAgICAgIHdhdl9maWxlXywgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZGF0YSksIGxlbmd0aCk7Ci0gIERDSEVDS19FUShyZXN1bHQsIGxlbmd0aCk7Ci0gIGJhc2U6OkZsdXNoUGxhdGZvcm1GaWxlKHdhdl9maWxlXyk7Ci0KLSAgLy8gdXBkYXRlIG91ciBjb3VudGVycwotICBmb3JtX3dhdl9sZW5ndGhfYnl0ZXNfICs9IGxlbmd0aDsKLQotICBpZiAoY2xvc2VfYWZ0ZXJfbXNfID4gMCkgewotICAgIGlmICh0aW1lc3RhbXAgPT0gMCkgewotICAgICAgLy8gZ3Vlc3MgYXQgdGltZXN0YW1wIGJhc2VkIG9uIHRvdGFsIGZpbGUgc2l6ZQotICAgICAgdGltZXN0YW1wID0gKCgodWludDY0KWZvcm1fd2F2X2xlbmd0aF9ieXRlc18gLQotICAgICAgICAgICAgICAgICAgICAodWludDY0KShrV2F2VG90YWxIZWFkZXJMZW5ndGggLSA4KSkgKgotICAgICAgICAgICAgICAgICAgIDEwMDBVTEwpIC8KLSAgICAgICAgICAgICAgICAgICh1aW50NjQpKHNhbXBsZXNfcGVyX3NlY29uZF8gKiBieXRlc19wZXJfZnJhbWVfKTsKLSAgICB9Ci0gICAgaWYgKHRpbWVzdGFtcCA+IGNsb3NlX2FmdGVyX21zXykgewotICAgICAgQ2xvc2UoKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBTaGVsbFdhdlRlc3RQcm9iZTo6QWRkRGF0YShjb25zdCBzY29wZWRfcmVmcHRyPEJ1ZmZlcj4mIGJ1ZmZlcikgewotICB1aW50NjQgdGltZXN0YW1wID0gMDsKLSAgaWYgKGJ1ZmZlci0+R2V0VGltZXN0YW1wKCkgIT0ga05vVGltZXN0YW1wKCkpIHsKLSAgICB0aW1lc3RhbXAgPSBidWZmZXItPkdldFRpbWVzdGFtcCgpLkluTWlsbGlzZWNvbmRzKCk7Ci0gIH0KLSAgQWRkRGF0YShidWZmZXItPkdldERhdGEoKSwgYnVmZmVyLT5HZXREYXRhU2l6ZSgpLCB0aW1lc3RhbXApOwotfQotCi12b2lkIFNoZWxsV2F2VGVzdFByb2JlOjpDbG9zZSgpIHsKLSAgaWYgKGNsb3NlZF8pCi0gICAgcmV0dXJuOwotCi0gIGNsb3NlZF8gPSB0cnVlOwotICAvLyB3cml0ZSB0aGUgaGVhZGVyIGFnYWluIG5vdyB0aGF0IHdlIGtub3cgdGhlIGxlbmd0aHMKLSAgV3JpdGVIZWFkZXIoKTsKLSAgLy8gY2xvc2UgdGhlIGZpbGUKLSAgYmFzZTo6Q2xvc2VQbGF0Zm9ybUZpbGUod2F2X2ZpbGVfKTsKLSAgd2F2X2ZpbGVfID0gTlVMTDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gX19MQl9TSEVMTF9fRk9SX1JFTEVBU0VfXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL3NoZWxsX3dhdl90ZXN0X3Byb2JlLmggYi9zcmMvbWVkaWEvYXVkaW8vc2hlbGxfd2F2X3Rlc3RfcHJvYmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIzN2E4ZC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vc2hlbGxfd2F2X3Rlc3RfcHJvYmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQVVESU9fU0hFTExfV0FWX1RFU1RfUFJPQkVfSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fU0hFTExfV0FWX1RFU1RfUFJPQkVfSF8KLQotI2luY2x1ZGUgImJhc2UvcGxhdGZvcm1fZmlsZS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYnVmZmVycy5oIgotCi0vLyBkb24ndCBpbmNsdWRlIG1lIGluIHJlbGVhc2UgYnVpbGRzIHBsZWFzZQotI2lmICFkZWZpbmVkKF9fTEJfU0hFTExfX0ZPUl9SRUxFQVNFX18pCi0KLXN0YXRpYyBjb25zdCB1aW50MzIga0Zvcm1XYXZIZWFkZXJMZW5ndGggPSAxMjsKLXN0YXRpYyBjb25zdCB1aW50MzIga1dhdkZvcm1hdENodW5rTGVuZ3RoID0gNDg7Ci1zdGF0aWMgY29uc3QgdWludDMyIGtXYXZEYXRhQ2h1bmtIZWFkZXJMZW5ndGggPSA4Owotc3RhdGljIGNvbnN0IHVpbnQzMiBrV2F2VG90YWxIZWFkZXJMZW5ndGggPQotICAgIGtGb3JtV2F2SGVhZGVyTGVuZ3RoICsga1dhdkZvcm1hdENodW5rTGVuZ3RoICsga1dhdkRhdGFDaHVua0hlYWRlckxlbmd0aDsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gVXRpbGl0eSBjbGFzcyBmb3Igc2F2aW5nIGRlY29kZWQgYXVkaW8gYnl0ZXMgaW50byBhIFdBViBmaWxlCi1jbGFzcyBNRURJQV9FWFBPUlQgU2hlbGxXYXZUZXN0UHJvYmUgewotIHB1YmxpYzoKLSAgU2hlbGxXYXZUZXN0UHJvYmUoKTsKLSAgLy8gaWYgdXNlX2Zsb2F0cyBpcyB0cnVlIHRoZW4gdGhlIGRhdGEgaXMgd3JpdHRlbiBhcyBmbG9hdGluZyBwb2ludCwKLSAgLy8gaWYgZmFsc2UgaXQgaXMgYXNzdW1lZCB0byBiZSBQQ00gdW5zaWduZWQgaW50cwotICB2b2lkIEluaXRpYWxpemUoY29uc3QgY2hhciogZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxfY291bnQsCi0gICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlc19wZXJfc2Vjb25kLAotICAgICAgICAgICAgICAgICAgaW50IGJpdHNfcGVyX3NhbXBsZSwKLSAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX2Zsb2F0cyk7Ci0gIC8vIGF1dG9tYXRpY2FsbHkgY2xvc2UgdGhlIGZpbGUgYWZ0ZXIgYXJnIG1pbGxpc2Vjb25kcyBhZGRlZCB0byBmaWxlLAotICAvLyBDbG9zZSgpIHdpbGwgaGFwcGVuIG9uIGZpcnN0IGNhbGwgdG8gQWRkRGF0YSgpIHdpdGggdGltZXN0YW1wIHBhc3QgYXJndW1lbnQKLSAgdm9pZCBDbG9zZUFmdGVyKHVpbnQ2NCBtaWxsaXNlY29uZHMpOwotICB2b2lkIEFkZERhdGEoY29uc3Qgc2NvcGVkX3JlZnB0cjxCdWZmZXI+JiBidWZmZXIpOwotICAvLyB0aW1lc3RhbXAgY2FuIGJlIHplcm8sIGluIHdoaWNoIGNhc2Ugd2Ugd2lsbCBndWVzcyBhdCB0aW1lc3RhbXAgYmFzZWQgb24KLSAgLy8gbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4sIHNpemUgb2Ygc2FtcGxlcywgYW5kIHNhbXBsZSByYXRlCi0gIHZvaWQgQWRkRGF0YShjb25zdCB1aW50OCogZGF0YSwgdWludDMyIGxlbmd0aCwgdWludDY0IHRpbWVzdGFtcCk7Ci0gIHZvaWQgQWRkRGF0YUxpdHRsZUVuZGlhbihjb25zdCB1aW50OCogZGF0YSwgdWludDMyIGxlbmd0aCwgdWludDY0IHRpbWVzdGFtcCk7Ci0gIHZvaWQgQ2xvc2UoKTsKLQotIHByaXZhdGU6Ci0gIC8vIHRha2UgdGhlIGN1cnJlbnQgc3RhdGUgdmFyaWFibGVzIGJlbG93IGFuZCB1c2UgdGhlbSB0byB3cml0ZSB0aGUKLSAgLy8gV0FWIGhlYWRlciBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlLiBNb3ZlcyB0aGUgZmlsZSBwb2ludGVyLgotICB2b2lkIFdyaXRlSGVhZGVyKCk7Ci0KLSAgYmFzZTo6UGxhdGZvcm1GaWxlIHdhdl9maWxlXzsKLSAgLy8gd2F2IGhlYWRlciBzdGF0ZSB2YXJpYWJsZXMKLSAgdWludDMyIGZvcm1fd2F2X2xlbmd0aF9ieXRlc187Ci0gIHVpbnQxNiBmb3JtYXRfY29kZV87Ci0gIHVpbnQxNiBjaGFubmVsc187Ci0gIHVpbnQzMiBzYW1wbGVzX3Blcl9zZWNvbmRfOwotICB1aW50MTYgYml0c19wZXJfc2FtcGxlXzsKLSAgdWludDggd2F2X2hlYWRlcl9idWZmZXJfW2tXYXZUb3RhbEhlYWRlckxlbmd0aF07Ci0gIHVpbnQzMiBieXRlc19wZXJfZnJhbWVfOwotICAvLyBvdGhlciBzdGF0ZQotICBib29sIGNsb3NlZF87Ci0gIHVpbnQ2NCBjbG9zZV9hZnRlcl9tc187Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBfX0xCX1NIRUxMX19GT1JfUkVMRUFTRV9fCi0KLSNlbmRpZiAgLy8gTUVESUFfQVVESU9fU0hFTExfV0FWX1RFU1RfUFJPQkVfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby9zaW1wbGVfc291cmNlcy5jYyBiL3NyYy9tZWRpYS9hdWRpby9zaW1wbGVfc291cmNlcy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVhYzg2ZC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vc2ltcGxlX3NvdXJjZXMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotLy8gTVNWQysrIHJlcXVpcmVzIHRoaXMgdG8gYmUgc2V0IGJlZm9yZSBhbnkgb3RoZXIgaW5jbHVkZXMgdG8gZ2V0IE1fUEkuCi0jZGVmaW5lIF9VU0VfTUFUSF9ERUZJTkVTCi0jaW5jbHVkZSA8Y21hdGg+Ci0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby9zaW1wbGVfc291cmNlcy5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fdXRpbC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFNpbmVXYXZlQXVkaW9Tb3VyY2UgaW1wbGVtZW50YXRpb24uCi0KLVNpbmVXYXZlQXVkaW9Tb3VyY2U6OlNpbmVXYXZlQXVkaW9Tb3VyY2UoaW50IGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZnJlcSwgZG91YmxlIHNhbXBsZV9mcmVxKQotICAgIDogY2hhbm5lbHNfKGNoYW5uZWxzKSwKLSAgICAgIGZfKGZyZXEgLyBzYW1wbGVfZnJlcSksCi0gICAgICB0aW1lX3N0YXRlXygwKSwKLSAgICAgIGNhcF8oMCksCi0gICAgICBjYWxsYmFja3NfKDApLAotICAgICAgZXJyb3JzXygwKSB7Ci19Ci0KLS8vIFRoZSBpbXBsZW1lbnRhdGlvbiBjb3VsZCBiZSBtb3JlIGVmZmljaWVudCBpZiBhIGxvb2t1cCB0YWJsZSBpcyBjb25zdHJ1Y3RlZAotLy8gYnV0IGl0IGlzIGVmZmljaWVudCBlbm91Z2ggZm9yIG91ciBzaW1wbGUgbmVlZHMuCi1pbnQgU2luZVdhdmVBdWRpb1NvdXJjZTo6T25Nb3JlRGF0YShBdWRpb0J1cyogYXVkaW9fYnVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJzU3RhdGUgYXVkaW9fYnVmZmVycykgewotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sodGltZV9sb2NrXyk7Ci0gIGNhbGxiYWNrc18rKzsKLQotICAvLyBUaGUgdGFibGUgaXMgZmlsbGVkIHdpdGggcyh0KSA9IGtpbnQxNm1heCpzaW4oVGhldGEqdCksCi0gIC8vIHdoZXJlIFRoZXRhID0gMipQSSpmcy4KLSAgLy8gV2Ugc3RvcmUgdGhlIGRpc2NyZXRlIHRpbWUgdmFsdWUgfHR8IGluIGEgbWVtYmVyIHRvIGVuc3VyZSB0aGF0IHRoZQotICAvLyBuZXh0IHBhc3Mgc3RhcnRzIGF0IGEgY29ycmVjdCBzdGF0ZS4KLSAgaW50IG1heF9mcmFtZXMgPSBjYXBfID4gMCA/Ci0gICAgICBzdGQ6Om1pbihhdWRpb19idXMtPmZyYW1lcygpLCBjYXBfIC0gdGltZV9zdGF0ZV8pIDogYXVkaW9fYnVzLT5mcmFtZXMoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhfZnJhbWVzOyArK2kpCi0gICAgYXVkaW9fYnVzLT5jaGFubmVsKDApW2ldID0gc2luKDIuMCAqIE1fUEkgKiBmXyAqIHRpbWVfc3RhdGVfKyspOwotICBmb3IgKGludCBpID0gMTsgaSA8IGF1ZGlvX2J1cy0+Y2hhbm5lbHMoKTsgKytpKSB7Ci0gICAgbWVtY3B5KGF1ZGlvX2J1cy0+Y2hhbm5lbChpKSwgYXVkaW9fYnVzLT5jaGFubmVsKDApLAotICAgICAgICAgICBtYXhfZnJhbWVzICogc2l6ZW9mKCphdWRpb19idXMtPmNoYW5uZWwoaSkpKTsKLSAgfQotICByZXR1cm4gbWF4X2ZyYW1lczsKLX0KLQotaW50IFNpbmVXYXZlQXVkaW9Tb3VyY2U6Ok9uTW9yZUlPRGF0YShBdWRpb0J1cyogc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1cyogZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJzU3RhdGUgYXVkaW9fYnVmZmVycykgewotICByZXR1cm4gT25Nb3JlRGF0YShkZXN0LCBhdWRpb19idWZmZXJzKTsKLX0KLQotdm9pZCBTaW5lV2F2ZUF1ZGlvU291cmNlOjpPbkVycm9yKEF1ZGlvT3V0cHV0U3RyZWFtKiBzdHJlYW0sIGludCBjb2RlKSB7Ci0gIGVycm9yc18rKzsKLX0KLQotdm9pZCBTaW5lV2F2ZUF1ZGlvU291cmNlOjpDYXBTYW1wbGVzKGludCBjYXApIHsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKHRpbWVfbG9ja18pOwotICBEQ0hFQ0tfR1QoY2FwLCAwKTsKLSAgY2FwXyA9IGNhcDsKLX0KLQotdm9pZCBTaW5lV2F2ZUF1ZGlvU291cmNlOjpSZXNldCgpIHsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKHRpbWVfbG9ja18pOwotICB0aW1lX3N0YXRlXyA9IDA7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL3NpbXBsZV9zb3VyY2VzLmggYi9zcmMvbWVkaWEvYXVkaW8vc2ltcGxlX3NvdXJjZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBiZDUxNy4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vc2ltcGxlX3NvdXJjZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfQVVESU9fU0lNUExFX1NPVVJDRVNfSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fU0lNUExFX1NPVVJDRVNfSF8KLQotI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19pby5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2Vla2FibGVfYnVmZmVyLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIEFuIGF1ZGlvIHNvdXJjZSB0aGF0IHByb2R1Y2VzIGEgcHVyZSBzaW51c29pZGFsIHRvbmUuCi1jbGFzcyBNRURJQV9FWFBPUlQgU2luZVdhdmVBdWRpb1NvdXJjZQotICAgIDogcHVibGljIEF1ZGlvT3V0cHV0U3RyZWFtOjpBdWRpb1NvdXJjZUNhbGxiYWNrIHsKLSBwdWJsaWM6Ci0gIC8vIHxjaGFubmVsc3wgaXMgdGhlIG51bWJlciBvZiBhdWRpbyBjaGFubmVscywgfGZyZXF8IGlzIHRoZSBmcmVxdWVuY3kgaW4KLSAgLy8gaGVydHogYW5kIGl0IGhhcyB0byBiZSBsZXNzIHRoYW4gaGFsZiBvZiB0aGUgc2FtcGxpbmcgZnJlcXVlbmN5Ci0gIC8vIHxzYW1wbGVfZnJlcXwgb3IgZWxzZSB5b3Ugd2lsbCBnZXQgYWxpYXNpbmcuCi0gIFNpbmVXYXZlQXVkaW9Tb3VyY2UoaW50IGNoYW5uZWxzLCBkb3VibGUgZnJlcSwgZG91YmxlIHNhbXBsZV9mcmVxKTsKLSAgdmlydHVhbCB+U2luZVdhdmVBdWRpb1NvdXJjZSgpIHt9Ci0KLSAgLy8gUmV0dXJuIHVwIHRvIHxjYXB8IHNhbXBsZXMgb2YgZGF0YSB2aWEgT25Nb3JlRGF0YSgpLiAgVXNlIFJlc2V0KCkgdG8KLSAgLy8gYWxsb3cgbW9yZSBkYXRhIHRvIGJlIHNlcnZlZC4KLSAgdm9pZCBDYXBTYW1wbGVzKGludCBjYXApOwotICB2b2lkIFJlc2V0KCk7Ci0KLSAgLy8gSW1wbGVtZW50YXRpb24gb2YgQXVkaW9Tb3VyY2VDYWxsYmFjay4KLSAgdmlydHVhbCBpbnQgT25Nb3JlRGF0YShBdWRpb0J1cyogYXVkaW9fYnVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyc1N0YXRlIGF1ZGlvX2J1ZmZlcnMpIE9WRVJSSURFOwotICB2aXJ0dWFsIGludCBPbk1vcmVJT0RhdGEoQXVkaW9CdXMqIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVzKiBkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJzU3RhdGUgYXVkaW9fYnVmZmVycykgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBPbkVycm9yKEF1ZGlvT3V0cHV0U3RyZWFtKiBzdHJlYW0sIGludCBjb2RlKSBPVkVSUklERTsKLQotICAvLyBUaGUgbnVtYmVyIG9mIE9uTW9yZURhdGEoKStPbk1vcmVJT0RhdGEoKSBhbmQgT25FcnJvcigpIGNhbGxzIHJlc3BlY3RpdmVseS4KLSAgaW50IGNhbGxiYWNrcygpIHsgcmV0dXJuIGNhbGxiYWNrc187IH0KLSAgaW50IGVycm9ycygpIHsgcmV0dXJuIGVycm9yc187IH0KLQotIHByb3RlY3RlZDoKLSAgaW50IGNoYW5uZWxzXzsKLSAgZG91YmxlIGZfOwotICBpbnQgdGltZV9zdGF0ZV87Ci0gIGludCBjYXBfOwotICBpbnQgY2FsbGJhY2tzXzsKLSAgaW50IGVycm9yc187Ci0gIGJhc2U6OkxvY2sgdGltZV9sb2NrXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0FVRElPX1NJTVBMRV9TT1VSQ0VTX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vc2ltcGxlX3NvdXJjZXNfdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvYXVkaW8vc2ltcGxlX3NvdXJjZXNfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZTVkOGEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL3NpbXBsZV9zb3VyY2VzX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgPGxpbWl0cz4KLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19wYXJhbWV0ZXJzLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vc2ltcGxlX3NvdXJjZXMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2J1cy5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBWYWxpZGF0ZSB0aGF0IHRoZSBTaW5lV2F2ZUF1ZGlvU291cmNlIHdyaXRlcyB0aGUgZXhwZWN0ZWQgdmFsdWVzLgotVEVTVChTaW1wbGVTb3VyY2VzLCBTaW5lV2F2ZUF1ZGlvU291cmNlKSB7Ci0gIHN0YXRpYyBjb25zdCB1aW50MzIgc2FtcGxlcyA9IDEwMjQ7Ci0gIHN0YXRpYyBjb25zdCB1aW50MzIgYnl0ZXNfcGVyX3NhbXBsZSA9IDI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgZnJlcSA9IDIwMDsKLQotICBBdWRpb1BhcmFtZXRlcnMgcGFyYW1zKAotICAgICAgICBBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIsIENIQU5ORUxfTEFZT1VUX01PTk8sCi0gICAgICAgIEF1ZGlvUGFyYW1ldGVyczo6a1RlbGVwaG9uZVNhbXBsZVJhdGUsIGJ5dGVzX3Blcl9zYW1wbGUgKiA4LCBzYW1wbGVzKTsKLQotICBTaW5lV2F2ZUF1ZGlvU291cmNlIHNvdXJjZSgxLCBmcmVxLCBwYXJhbXMuc2FtcGxlX3JhdGUoKSk7Ci0gIHNjb3BlZF9wdHI8QXVkaW9CdXM+IGF1ZGlvX2J1cyA9IEF1ZGlvQnVzOjpDcmVhdGUocGFyYW1zKTsKLSAgc291cmNlLk9uTW9yZURhdGEoYXVkaW9fYnVzLmdldCgpLCBBdWRpb0J1ZmZlcnNTdGF0ZSgpKTsKLSAgRVhQRUNUX0VRKDEsIHNvdXJjZS5jYWxsYmFja3MoKSk7Ci0gIEVYUEVDVF9FUSgwLCBzb3VyY2UuZXJyb3JzKCkpOwotCi0gIHVpbnQzMiBoYWxmX3BlcmlvZCA9IEF1ZGlvUGFyYW1ldGVyczo6a1RlbGVwaG9uZVNhbXBsZVJhdGUgLyAoZnJlcSAqIDIpOwotCi0gIC8vIFNwb3QgdGVzdCBwb3NpdGl2ZSBpbmN1cnNpb24gb2Ygc2luZSB3YXZlLgotICBFWFBFQ1RfTkVBUigwLCBhdWRpb19idXMtPmNoYW5uZWwoMClbMF0sCi0gICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjplcHNpbG9uKCkpOwotICBFWFBFQ1RfRkxPQVRfRVEoMC4xNTY0MzQ0NmYsIGF1ZGlvX2J1cy0+Y2hhbm5lbCgwKVsxXSk7Ci0gIEVYUEVDVF9MVChhdWRpb19idXMtPmNoYW5uZWwoMClbMV0sIGF1ZGlvX2J1cy0+Y2hhbm5lbCgwKVsyXSk7Ci0gIEVYUEVDVF9MVChhdWRpb19idXMtPmNoYW5uZWwoMClbMl0sIGF1ZGlvX2J1cy0+Y2hhbm5lbCgwKVszXSk7Ci0gIC8vIFNwb3QgdGVzdCBuZWdhdGl2ZSBpbmN1cnNpb24gb2Ygc2luZSB3YXZlLgotICBFWFBFQ1RfTkVBUigwLCBhdWRpb19idXMtPmNoYW5uZWwoMClbaGFsZl9wZXJpb2RdLAotICAgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6ZXBzaWxvbigpKTsKLSAgRVhQRUNUX0ZMT0FUX0VRKC0wLjE1NjQzNDQ2ZiwgYXVkaW9fYnVzLT5jaGFubmVsKDApW2hhbGZfcGVyaW9kICsgMV0pOwotICBFWFBFQ1RfR1QoYXVkaW9fYnVzLT5jaGFubmVsKDApW2hhbGZfcGVyaW9kICsgMV0sCi0gICAgICAgICAgICBhdWRpb19idXMtPmNoYW5uZWwoMClbaGFsZl9wZXJpb2QgKyAyXSk7Ci0gIEVYUEVDVF9HVChhdWRpb19idXMtPmNoYW5uZWwoMClbaGFsZl9wZXJpb2QgKyAyXSwKLSAgICAgICAgICAgIGF1ZGlvX2J1cy0+Y2hhbm5lbCgwKVtoYWxmX3BlcmlvZCArIDNdKTsKLX0KLQotVEVTVChTaW1wbGVTb3VyY2VzLCBTaW5lV2F2ZUF1ZGlvQ2FwcGVkKSB7Ci0gIFNpbmVXYXZlQXVkaW9Tb3VyY2Ugc291cmNlKDEsIDIwMCwgQXVkaW9QYXJhbWV0ZXJzOjprVGVsZXBob25lU2FtcGxlUmF0ZSk7Ci0KLSAgc3RhdGljIGNvbnN0IGludCBrU2FtcGxlQ2FwID0gMTAwOwotICBzb3VyY2UuQ2FwU2FtcGxlcyhrU2FtcGxlQ2FwKTsKLQotICBzY29wZWRfcHRyPEF1ZGlvQnVzPiBhdWRpb19idXMgPSBBdWRpb0J1czo6Q3JlYXRlKDEsIDIgKiBrU2FtcGxlQ2FwKTsKLSAgRVhQRUNUX0VRKHNvdXJjZS5Pbk1vcmVEYXRhKAotICAgICAgYXVkaW9fYnVzLmdldCgpLCBBdWRpb0J1ZmZlcnNTdGF0ZSgpKSwga1NhbXBsZUNhcCk7Ci0gIEVYUEVDVF9FUSgxLCBzb3VyY2UuY2FsbGJhY2tzKCkpOwotICBFWFBFQ1RfRVEoc291cmNlLk9uTW9yZURhdGEoYXVkaW9fYnVzLmdldCgpLCBBdWRpb0J1ZmZlcnNTdGF0ZSgpKSwgMCk7Ci0gIEVYUEVDVF9FUSgyLCBzb3VyY2UuY2FsbGJhY2tzKCkpOwotICBzb3VyY2UuUmVzZXQoKTsKLSAgRVhQRUNUX0VRKHNvdXJjZS5Pbk1vcmVEYXRhKAotICAgICAgYXVkaW9fYnVzLmdldCgpLCBBdWRpb0J1ZmZlcnNTdGF0ZSgpKSwga1NhbXBsZUNhcCk7Ci0gIEVYUEVDVF9FUSgzLCBzb3VyY2UuY2FsbGJhY2tzKCkpOwotICBFWFBFQ1RfRVEoMCwgc291cmNlLmVycm9ycygpKTsKLX0KLQotVEVTVChTaW1wbGVTb3VyY2VzLCBPbkVycm9yKSB7Ci0gIFNpbmVXYXZlQXVkaW9Tb3VyY2Ugc291cmNlKDEsIDIwMCwgQXVkaW9QYXJhbWV0ZXJzOjprVGVsZXBob25lU2FtcGxlUmF0ZSk7Ci0gIHNvdXJjZS5PbkVycm9yKE5VTEwsIDApOwotICBFWFBFQ1RfRVEoMSwgc291cmNlLmVycm9ycygpKTsKLSAgc291cmNlLk9uRXJyb3IoTlVMTCwgMCk7Ci0gIEVYUEVDVF9FUSgyLCBzb3VyY2UuZXJyb3JzKCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby90ZXN0X2F1ZGlvX2lucHV0X2NvbnRyb2xsZXJfZmFjdG9yeS5jYyBiL3NyYy9tZWRpYS9hdWRpby90ZXN0X2F1ZGlvX2lucHV0X2NvbnRyb2xsZXJfZmFjdG9yeS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRiZmI5Zi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vdGVzdF9hdWRpb19pbnB1dF9jb250cm9sbGVyX2ZhY3RvcnkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vdGVzdF9hdWRpb19pbnB1dF9jb250cm9sbGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19pby5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1UZXN0QXVkaW9JbnB1dENvbnRyb2xsZXI6OlRlc3RBdWRpb0lucHV0Q29udHJvbGxlcigKLSAgICBUZXN0QXVkaW9JbnB1dENvbnRyb2xsZXJGYWN0b3J5KiBmYWN0b3J5LAotICAgIEF1ZGlvTWFuYWdlciogYXVkaW9fbWFuYWdlciwKLSAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIGF1ZGlvX3BhcmFtZXRlcnMsCi0gICAgRXZlbnRIYW5kbGVyKiBldmVudF9oYW5kbGVyLAotICAgIFN5bmNXcml0ZXIqIHN5bmNfd3JpdGVyKQotICAgIDogQXVkaW9JbnB1dENvbnRyb2xsZXIoZXZlbnRfaGFuZGxlciwgc3luY193cml0ZXIpLAotICAgICAgYXVkaW9fcGFyYW1ldGVyc18oYXVkaW9fcGFyYW1ldGVycyksCi0gICAgICBmYWN0b3J5XyhmYWN0b3J5KSwKLSAgICAgIGV2ZW50X2hhbmRsZXJfKGV2ZW50X2hhbmRsZXIpIHsKLSAgbWVzc2FnZV9sb29wXyA9IGF1ZGlvX21hbmFnZXItPkdldE1lc3NhZ2VMb29wKCk7Ci19Ci0KLVRlc3RBdWRpb0lucHV0Q29udHJvbGxlcjo6flRlc3RBdWRpb0lucHV0Q29udHJvbGxlcigpIHsKLSAgLy8gSW5mb3JtIHRoZSBmYWN0b3J5IHNvIHRoYXQgaXQgYWxsb3dzIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXMgaW4gZnV0dXJlLgotICBmYWN0b3J5Xy0+T25UZXN0QXVkaW9JbnB1dENvbnRyb2xsZXJEZXN0cm95ZWQodGhpcyk7Ci19Ci0KLXZvaWQgVGVzdEF1ZGlvSW5wdXRDb250cm9sbGVyOjpSZWNvcmQoKSB7Ci0gIGlmIChmYWN0b3J5Xy0+ZGVsZWdhdGVfKQotICAgIGZhY3RvcnlfLT5kZWxlZ2F0ZV8tPlRlc3RBdWRpb0NvbnRyb2xsZXJPcGVuZWQodGhpcyk7Ci19Ci0KLXZvaWQgVGVzdEF1ZGlvSW5wdXRDb250cm9sbGVyOjpDbG9zZShjb25zdCBiYXNlOjpDbG9zdXJlJiBjbG9zZWRfdGFzaykgewotICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzayhGUk9NX0hFUkUsIGNsb3NlZF90YXNrKTsKLSAgaWYgKGZhY3RvcnlfLT5kZWxlZ2F0ZV8pCi0gICAgZmFjdG9yeV8tPmRlbGVnYXRlXy0+VGVzdEF1ZGlvQ29udHJvbGxlckNsb3NlZCh0aGlzKTsKLX0KLQotVGVzdEF1ZGlvSW5wdXRDb250cm9sbGVyRmFjdG9yeTo6VGVzdEF1ZGlvSW5wdXRDb250cm9sbGVyRmFjdG9yeSgpCi0gICAgOiBjb250cm9sbGVyXyhOVUxMKSwKLSAgICAgIGRlbGVnYXRlXyhOVUxMKSB7Ci19Ci0KLVRlc3RBdWRpb0lucHV0Q29udHJvbGxlckZhY3Rvcnk6On5UZXN0QXVkaW9JbnB1dENvbnRyb2xsZXJGYWN0b3J5KCkgewotICBEQ0hFQ0soIWNvbnRyb2xsZXJfKTsKLX0KLQotQXVkaW9JbnB1dENvbnRyb2xsZXIqIFRlc3RBdWRpb0lucHV0Q29udHJvbGxlckZhY3Rvcnk6OkNyZWF0ZSgKLSAgICBBdWRpb01hbmFnZXIqIGF1ZGlvX21hbmFnZXIsCi0gICAgQXVkaW9JbnB1dENvbnRyb2xsZXI6OkV2ZW50SGFuZGxlciogZXZlbnRfaGFuZGxlciwKLSAgICBBdWRpb1BhcmFtZXRlcnMgcGFyYW1zKSB7Ci0gIERDSEVDSyghY29udHJvbGxlcl8pOyAgLy8gT25seSBvbmUgdGVzdCBpbnN0YW5jZSBtYW5hZ2VkIGF0IGEgdGltZS4KLSAgY29udHJvbGxlcl8gPSBuZXcgVGVzdEF1ZGlvSW5wdXRDb250cm9sbGVyKHRoaXMsIGF1ZGlvX21hbmFnZXIsIHBhcmFtcywKLSAgICAgIGV2ZW50X2hhbmRsZXIsIE5VTEwpOwotICByZXR1cm4gY29udHJvbGxlcl87Ci19Ci0KLXZvaWQgVGVzdEF1ZGlvSW5wdXRDb250cm9sbGVyRmFjdG9yeTo6U2V0RGVsZWdhdGVGb3JUZXN0cygKLSAgICBUZXN0QXVkaW9JbnB1dENvbnRyb2xsZXJEZWxlZ2F0ZSogZGVsZWdhdGUpIHsKLSAgZGVsZWdhdGVfID0gZGVsZWdhdGU7Ci19Ci0KLXZvaWQgVGVzdEF1ZGlvSW5wdXRDb250cm9sbGVyRmFjdG9yeTo6T25UZXN0QXVkaW9JbnB1dENvbnRyb2xsZXJEZXN0cm95ZWQoCi0gICAgVGVzdEF1ZGlvSW5wdXRDb250cm9sbGVyKiBjb250cm9sbGVyKSB7Ci0gIERDSEVDS19FUShjb250cm9sbGVyXywgY29udHJvbGxlcik7Ci0gIGNvbnRyb2xsZXJfID0gTlVMTDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vdGVzdF9hdWRpb19pbnB1dF9jb250cm9sbGVyX2ZhY3RvcnkuaCBiL3NyYy9tZWRpYS9hdWRpby90ZXN0X2F1ZGlvX2lucHV0X2NvbnRyb2xsZXJfZmFjdG9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTE3OTQ3Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby90ZXN0X2F1ZGlvX2lucHV0X2NvbnRyb2xsZXJfZmFjdG9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfQVVESU9fVEVTVF9BVURJT19JTlBVVF9DT05UUk9MTEVSX0ZBQ1RPUllfSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fVEVTVF9BVURJT19JTlBVVF9DT05UUk9MTEVSX0ZBQ1RPUllfSF8KLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX2lucHV0X2NvbnRyb2xsZXIuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgVGVzdEF1ZGlvSW5wdXRDb250cm9sbGVyRmFjdG9yeTsKLQotLy8gVGVzdEF1ZGlvSW5wdXRDb250cm9sbGVyIGFuZCBUZXN0QXVkaW9JbnB1dENvbnRyb2xsZXJGYWN0b3J5IGFyZSB1c2VkIGZvcgotLy8gdGVzdGluZyBjb25zdW1lcnMgb2YgQXVkaW9JbnB1dENvbnRyb2xsZXIuIFRlc3RBdWRpb0lucHV0Q29udHJvbGxlckZhY3RvcnkKLS8vIGlzIGEgQXVkaW9JbnB1dENvbnRyb2xsZXI6OkZhY3RvcnkgdGhhdCBjcmVhdGVzIFRlc3RBdWRpb0lucHV0Q29udHJvbGxlcnMuCi0vLwotLy8gVGVzdEF1ZGlvSW5wdXRDb250cm9sbGVyOjpSZWNvcmQgYW5kIENsb3NlIGFyZSBvdmVycmlkZW4gdG8gZG8gbm90aGluZy4gSXQgaXMKLS8vIGV4cGVjdGVkIHRoYXQgeW91J2xsIGdyYWIgdGhlIEV2ZW50SGFuZGxlciBmcm9tIHRoZSBUZXN0QXVkaW9JbnB1dENvbnRyb2xsZXIKLS8vIGFuZCBpbnZva2UgdGhlIGNhbGxiYWNrIG1ldGhvZHMgd2hlbiBhcHByb3ByaWF0ZS4gSW4gdGhpcyB3YXkgaXQncyBlYXN5IHRvCi0vLyBtb2NrIGEgQXVkaW9JbnB1dENvbnRyb2xsZXIuCi0vLwotLy8gVHlwaWNhbCB1c2FnZToKLS8vICAgLy8gQ3JlYXRlIGFuZCByZWdpc3RlciBmYWN0b3J5LgotLy8gICBUZXN0QXVkaW9JbnB1dENvbnRyb2xsZXJGYWN0b3J5IGZhY3Rvcnk7Ci0vLyAgIEF1ZGlvSW5wdXRDb250cm9sbGVyOjpzZXRfZmFjdG9yeV9mb3JfdGVzdGluZygmZmFjdG9yeSk7Ci0vLwotLy8gICAvLyBEbyBzb21ldGhpbmcgdGhhdCB0cmlnZ2VycyBjcmVhdGlvbiBvZiBhbiBBdWRpb0lucHV0Q29udHJvbGxlci4KLS8vICAgVGVzdEF1ZGlvSW5wdXRDb250cm9sbGVyKiBjb250cm9sbGVyID0gZmFjdG9yeS5sYXN0X2NvbnRyb2xsZXIoKTsKLS8vICAgRENIRUNLKGNvbnRyb2xsZXIpOwotLy8KLS8vICAgLy8gTm90aWZ5IGV2ZW50IGhhbmRsZXIgd2l0aCB3aGF0ZXZlciBkYXRhIHlvdSB3YW50LgotLy8gICBjb250cm9sbGVyLT5ldmVudF9oYW5kbGVyKCktPk9uQ3JlYXRlZCguLi4pOwotLy8KLS8vICAgLy8gRG8gc29tZXRoaW5nIHRoYXQgdHJpZ2dlcnMgQXVkaW9JbnB1dENvbnRyb2xsZXI6OlJlY29yZCB0byBiZSBjYWxsZWQuCi0vLyAgIGNvbnRyb2xsZXItPmV2ZW50X2hhbmRsZXIoKS0+T25EYXRhKC4uLik7Ci0vLyAgIGNvbnRyb2xsZXItPmV2ZW50X2hhbmRsZXIoKS0+T25FcnJvciguLi4pOwotLy8KLS8vICAgLy8gTWFrZSBzdXJlIGNvbnN1bWVyIG9mIEF1ZGlvSW5wdXRDb250cm9sbGVyIGRvZXMgdGhlIHJpZ2h0IHRoaW5nLgotLy8gICAuLi4KLS8vICAgLy8gUmVzZXQgZmFjdG9yeS4KLS8vICAgQXVkaW9JbnB1dENvbnRyb2xsZXI6OnNldF9mYWN0b3J5X2Zvcl90ZXN0aW5nKE5VTEwpOwotCi1jbGFzcyBUZXN0QXVkaW9JbnB1dENvbnRyb2xsZXIgOiBwdWJsaWMgQXVkaW9JbnB1dENvbnRyb2xsZXIgewotIHB1YmxpYzoKLSAgY2xhc3MgRGVsZWdhdGUgewotICAgcHVibGljOgotICAgIHZpcnR1YWwgdm9pZCBUZXN0QXVkaW9Db250cm9sbGVyT3BlbmVkKAotICAgICAgICBUZXN0QXVkaW9JbnB1dENvbnRyb2xsZXIqIGNvbnRyb2xsZXIpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgVGVzdEF1ZGlvQ29udHJvbGxlckNsb3NlZCgKLSAgICAgICAgVGVzdEF1ZGlvSW5wdXRDb250cm9sbGVyKiBjb250cm9sbGVyKSA9IDA7Ci0gIH07Ci0KLSAgVGVzdEF1ZGlvSW5wdXRDb250cm9sbGVyKFRlc3RBdWRpb0lucHV0Q29udHJvbGxlckZhY3RvcnkqIGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01hbmFnZXIqIGF1ZGlvX21hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIGF1ZGlvX3BhcmFtZXRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEhhbmRsZXIqIGV2ZW50X2hhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTeW5jV3JpdGVyKiBzeW5jX3dyaXRlcik7Ci0KLSAgLy8gUmV0dXJucyB0aGUgZXZlbnQgaGFuZGxlciBpbnN0YWxsZWQgb24gdGhlIEF1ZGlvSW5wdXRDb250cm9sbGVyLgotICBFdmVudEhhbmRsZXIqIGV2ZW50X2hhbmRsZXIoKSBjb25zdCB7IHJldHVybiBldmVudF9oYW5kbGVyXzsgfQotCi0gIC8vIE5vdGlmaWVzIHRoZSBUZXN0QXVkaW9Db250cm9sbGVyT3BlbmVkKCkgZXZlbnQgdG8gdGhlIGRlbGVnYXRlIChpZiBhbnkpLgotICB2aXJ0dWFsIHZvaWQgUmVjb3JkKCkgT1ZFUlJJREU7Ci0KLSAgLy8gRW5zdXJlIHRoYXQgdGhlIGNsb3N1cmUgaXMgcnVuIG9uIHRoZSBhdWRpby1tYW5hZ2VyIHRocmVhZC4KLSAgdmlydHVhbCB2b2lkIENsb3NlKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNsb3NlZF90YXNrKSBPVkVSUklERTsKLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB+VGVzdEF1ZGlvSW5wdXRDb250cm9sbGVyKCk7Ci0KLSBwcml2YXRlOgotICBBdWRpb1BhcmFtZXRlcnMgYXVkaW9fcGFyYW1ldGVyc187Ci0KLSAgLy8gVGhlc2UgYXJlIG5vdCBvd25lZCBieSB1cyBhbmQgZXhwZWN0ZWQgdG8gYmUgdmFsaWQgZm9yIHRoaXMgb2JqZWN0J3MKLSAgLy8gbGlmZXRpbWUuCi0gIFRlc3RBdWRpb0lucHV0Q29udHJvbGxlckZhY3RvcnkqIGZhY3RvcnlfOwotICBFdmVudEhhbmRsZXIqIGV2ZW50X2hhbmRsZXJfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihUZXN0QXVkaW9JbnB1dENvbnRyb2xsZXIpOwotfTsKLQotdHlwZWRlZiBUZXN0QXVkaW9JbnB1dENvbnRyb2xsZXI6OkRlbGVnYXRlIFRlc3RBdWRpb0lucHV0Q29udHJvbGxlckRlbGVnYXRlOwotCi0vLyBTaW1wbGUgQXVkaW9JbnB1dENvbnRyb2xsZXI6OkZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcwotLy8gVGVzdEF1ZGlvSW5wdXRDb250cm9sbGVycy4KLWNsYXNzIFRlc3RBdWRpb0lucHV0Q29udHJvbGxlckZhY3RvcnkgOiBwdWJsaWMgQXVkaW9JbnB1dENvbnRyb2xsZXI6OkZhY3RvcnkgewotIHB1YmxpYzoKLSAgVGVzdEF1ZGlvSW5wdXRDb250cm9sbGVyRmFjdG9yeSgpOwotICB2aXJ0dWFsIH5UZXN0QXVkaW9JbnB1dENvbnRyb2xsZXJGYWN0b3J5KCk7Ci0KLSAgLy8gQXVkaW9JbnB1dENvbnRyb2xsZXI6OkZhY3RvcnkgbWV0aG9kcy4KLSAgdmlydHVhbCBBdWRpb0lucHV0Q29udHJvbGxlciogQ3JlYXRlKAotICAgICAgQXVkaW9NYW5hZ2VyKiBhdWRpb19tYW5hZ2VyLAotICAgICAgQXVkaW9JbnB1dENvbnRyb2xsZXI6OkV2ZW50SGFuZGxlciogZXZlbnRfaGFuZGxlciwKLSAgICAgIEF1ZGlvUGFyYW1ldGVycyBwYXJhbXMpIE9WRVJSSURFOwotCi0gIHZvaWQgU2V0RGVsZWdhdGVGb3JUZXN0cyhUZXN0QXVkaW9JbnB1dENvbnRyb2xsZXJEZWxlZ2F0ZSogZGVsZWdhdGUpOwotCi0gIFRlc3RBdWRpb0lucHV0Q29udHJvbGxlciogY29udHJvbGxlcigpIGNvbnN0IHsgcmV0dXJuIGNvbnRyb2xsZXJfOyB9Ci0KLSBwcml2YXRlOgotICBmcmllbmQgY2xhc3MgVGVzdEF1ZGlvSW5wdXRDb250cm9sbGVyOwotCi0gIC8vIEludm9rZWQgYnkgYSBUZXN0QXVkaW9JbnB1dENvbnRyb2xsZXIgd2hlbiBpdCBnZXRzIGRlc3Ryb3llZC4KLSAgdm9pZCBPblRlc3RBdWRpb0lucHV0Q29udHJvbGxlckRlc3Ryb3llZCgKLSAgICAgIFRlc3RBdWRpb0lucHV0Q29udHJvbGxlciogY29udHJvbGxlcik7Ci0KLSAgLy8gVGhlIGNhbGxlciBvZiBDcmVhdGUgb3ducyB0aGlzIG9iamVjdC4KLSAgVGVzdEF1ZGlvSW5wdXRDb250cm9sbGVyKiBjb250cm9sbGVyXzsKLQotICAvLyBUaGUgZGVsZWdhdGUgZm9yIHRlc3RzIGZvciByZWNlaXZpbmcgYXVkaW8gY29udHJvbGxlciBldmVudHMuCi0gIFRlc3RBdWRpb0lucHV0Q29udHJvbGxlckRlbGVnYXRlKiBkZWxlZ2F0ZV87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFRlc3RBdWRpb0lucHV0Q29udHJvbGxlckZhY3RvcnkpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQVVESU9fVEVTVF9BVURJT19JTlBVVF9DT05UUk9MTEVSX0ZBQ1RPUllfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby92aXJ0dWFsX2F1ZGlvX2lucHV0X3N0cmVhbS5jYyBiL3NyYy9tZWRpYS9hdWRpby92aXJ0dWFsX2F1ZGlvX2lucHV0X3N0cmVhbS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYyZjliZC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vdmlydHVhbF9hdWRpb19pbnB1dF9zdHJlYW0uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3ZpcnR1YWxfYXVkaW9faW5wdXRfc3RyZWFtLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vdmlydHVhbF9hdWRpb19vdXRwdXRfc3RyZWFtLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIExvb3BiYWNrQXVkaW9Db252ZXJ0ZXIgd29ya3Mgc2ltaWxhciB0byBBdWRpb0NvbnZlcnRlciBhbmQgY29udmVydHMgaW5wdXQKLS8vIHN0cmVhbXMgdG8gZGlmZmVyZW50IGF1ZGlvIHBhcmFtZXRlcnMuIFRoZW4sIHRoZSBMb29wYmFja0F1ZGlvQ29udmVydGVyIGNhbgotLy8gYmUgdXNlZCBhcyBhbiBpbnB1dCB0byBhbm90aGVyIEF1ZGlvQ29udmVydGVyLiBUaGlzIGFsbG93cyB1cyB0bwotLy8gdXNlIGNvbnZlcnRlZCBhdWRpbyBmcm9tIEF1ZGlvT3V0cHV0U3RyZWFtcyBhcyBpbnB1dCB0byBhbiBBdWRpb0NvbnZlcnRlci4KLS8vIEZvciBleGFtcGxlLCB0aGlzIGFsbG93cyBjb252ZXJ0aW5nIG11bHRpcGxlIHN0cmVhbXMgaW50byBhIGNvbW1vbiBmb3JtYXQgYW5kCi0vLyB1c2luZyB0aGUgY29udmVydGVkIGF1ZGlvIGFzIGlucHV0IHRvIGFub3RoZXIgQXVkaW9Db252ZXJ0ZXIgKGkuZS4gYSBtaXhlcikuCi1jbGFzcyBMb29wYmFja0F1ZGlvQ29udmVydGVyIDogcHVibGljIEF1ZGlvQ29udmVydGVyOjpJbnB1dENhbGxiYWNrIHsKLSBwdWJsaWM6Ci0gIExvb3BiYWNrQXVkaW9Db252ZXJ0ZXIoY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBpbnB1dF9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBvdXRwdXRfcGFyYW1zKQotICAgICAgOiBhdWRpb19jb252ZXJ0ZXJfKGlucHV0X3BhcmFtcywgb3V0cHV0X3BhcmFtcywgZmFsc2UpIHt9Ci0KLSAgdmlydHVhbCB+TG9vcGJhY2tBdWRpb0NvbnZlcnRlcigpIHt9Ci0KLSAgdm9pZCBBZGRJbnB1dChBdWRpb0NvbnZlcnRlcjo6SW5wdXRDYWxsYmFjayogaW5wdXQpIHsKLSAgICBhdWRpb19jb252ZXJ0ZXJfLkFkZElucHV0KGlucHV0KTsKLSAgfQotCi0gIHZvaWQgUmVtb3ZlSW5wdXQoQXVkaW9Db252ZXJ0ZXI6OklucHV0Q2FsbGJhY2sqIGlucHV0KSB7Ci0gICAgYXVkaW9fY29udmVydGVyXy5SZW1vdmVJbnB1dChpbnB1dCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHZpcnR1YWwgZG91YmxlIFByb3ZpZGVJbnB1dChBdWRpb0J1cyogYXVkaW9fYnVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhIGJ1ZmZlcl9kZWxheSkgT1ZFUlJJREUgewotICAgIGF1ZGlvX2NvbnZlcnRlcl8uQ29udmVydChhdWRpb19idXMpOwotICAgIHJldHVybiAxLjA7Ci0gIH0KLQotICBBdWRpb0NvbnZlcnRlciBhdWRpb19jb252ZXJ0ZXJfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihMb29wYmFja0F1ZGlvQ29udmVydGVyKTsKLX07Ci0KLVZpcnR1YWxBdWRpb0lucHV0U3RyZWFtKiBWaXJ0dWFsQXVkaW9JbnB1dFN0cmVhbTo6TWFrZVN0cmVhbSgKLSAgICBBdWRpb01hbmFnZXJCYXNlKiBtYW5hZ2VyLCBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywKLSAgICBiYXNlOjpNZXNzYWdlTG9vcFByb3h5KiBtZXNzYWdlX2xvb3ApIHsKLSAgcmV0dXJuIG5ldyBWaXJ0dWFsQXVkaW9JbnB1dFN0cmVhbShtYW5hZ2VyLCBwYXJhbXMsIG1lc3NhZ2VfbG9vcCk7Ci19Ci0KLVZpcnR1YWxBdWRpb0lucHV0U3RyZWFtOjpWaXJ0dWFsQXVkaW9JbnB1dFN0cmVhbSgKLSAgICBBdWRpb01hbmFnZXJCYXNlKiBtYW5hZ2VyLCBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywKLSAgICBiYXNlOjpNZXNzYWdlTG9vcFByb3h5KiBtZXNzYWdlX2xvb3ApCi0gICAgOiBhdWRpb19tYW5hZ2VyXyhtYW5hZ2VyKSwKLSAgICAgIG1lc3NhZ2VfbG9vcF8obWVzc2FnZV9sb29wKSwKLSAgICAgIGNhbGxiYWNrXyhOVUxMKSwKLSAgICAgIGJ1ZmZlcl9kdXJhdGlvbl9tc18oYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKAotICAgICAgICAgIHBhcmFtcy5mcmFtZXNfcGVyX2J1ZmZlcigpICogYmFzZTo6VGltZTo6a01pbGxpc2Vjb25kc1BlclNlY29uZCAvCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHBhcmFtcy5zYW1wbGVfcmF0ZSgpKSkpLAotICAgICAgYnVmZmVyXyhuZXcgdWludDhbcGFyYW1zLkdldEJ5dGVzUGVyQnVmZmVyKCldKSwKLSAgICAgIHBhcmFtc18ocGFyYW1zKSwKLSAgICAgIGF1ZGlvX2J1c18oQXVkaW9CdXM6OkNyZWF0ZShwYXJhbXNfKSksCi0gICAgICBtaXhlcl8ocGFyYW1zXywgcGFyYW1zXywgZmFsc2UpLAotICAgICAgbnVtX2F0dGFjaGVkX291dHB1dHNfc3RyZWFtc18oMCkgewotfQotCi1WaXJ0dWFsQXVkaW9JbnB1dFN0cmVhbTo6flZpcnR1YWxBdWRpb0lucHV0U3RyZWFtKCkgewotICBmb3IgKEF1ZGlvQ29udmVydGVyc01hcDo6aXRlcmF0b3IgaXQgPSBjb252ZXJ0ZXJzXy5iZWdpbigpOwotICAgICAgIGl0ICE9IGNvbnZlcnRlcnNfLmVuZCgpOyArK2l0KQotICAgIGRlbGV0ZSBpdC0+c2Vjb25kOwotCi0gIERDSEVDS19FUSgwLCBudW1fYXR0YWNoZWRfb3V0cHV0c19zdHJlYW1zXyk7Ci19Ci0KLWJvb2wgVmlydHVhbEF1ZGlvSW5wdXRTdHJlYW06Ok9wZW4oKSB7Ci0gIG1lbXNldChidWZmZXJfLmdldCgpLCAwLCBwYXJhbXNfLkdldEJ5dGVzUGVyQnVmZmVyKCkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBWaXJ0dWFsQXVkaW9JbnB1dFN0cmVhbTo6U3RhcnQoQXVkaW9JbnB1dENhbGxiYWNrKiBjYWxsYmFjaykgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgY2FsbGJhY2tfID0gY2FsbGJhY2s7Ci0gIG9uX21vcmVfZGF0YV9jYl8uUmVzZXQoYmFzZTo6QmluZCgmVmlydHVhbEF1ZGlvSW5wdXRTdHJlYW06OlJlYWRBdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLSAgYXVkaW9fbWFuYWdlcl8tPkdldE1lc3NhZ2VMb29wKCktPlBvc3RUYXNrKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uX21vcmVfZGF0YV9jYl8uY2FsbGJhY2soKSk7Ci19Ci0KLXZvaWQgVmlydHVhbEF1ZGlvSW5wdXRTdHJlYW06OlN0b3AoKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBvbl9tb3JlX2RhdGFfY2JfLkNhbmNlbCgpOwotfQotCi12b2lkIFZpcnR1YWxBdWRpb0lucHV0U3RyZWFtOjpBZGRPdXRwdXRTdHJlYW0oCi0gICAgVmlydHVhbEF1ZGlvT3V0cHV0U3RyZWFtKiBzdHJlYW0sIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgb3V0cHV0X3BhcmFtcykgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLQotICBBdWRpb0NvbnZlcnRlcnNNYXA6Oml0ZXJhdG9yIGNvbnZlcnRlciA9IGNvbnZlcnRlcnNfLmZpbmQob3V0cHV0X3BhcmFtcyk7Ci0gIGlmIChjb252ZXJ0ZXIgPT0gY29udmVydGVyc18uZW5kKCkpIHsKLSAgICBzdGQ6OnBhaXI8QXVkaW9Db252ZXJ0ZXJzTWFwOjppdGVyYXRvciwgYm9vbD4gcmVzdWx0ID0gY29udmVydGVyc18uaW5zZXJ0KAotICAgICAgICBzdGQ6Om1ha2VfcGFpcihvdXRwdXRfcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9vcGJhY2tBdWRpb0NvbnZlcnRlcihvdXRwdXRfcGFyYW1zLCBwYXJhbXNfKSkpOwotICAgIGNvbnZlcnRlciA9IHJlc3VsdC5maXJzdDsKLQotICAgIC8vIEFkZCB0byBtYWluIG1peGVyIGlmIHdlIGp1c3QgYWRkZWQgYSBuZXcgQXVkaW9UcmFuc2Zvcm0uCi0gICAgbWl4ZXJfLkFkZElucHV0KGNvbnZlcnRlci0+c2Vjb25kKTsKLSAgfQotICBjb252ZXJ0ZXItPnNlY29uZC0+QWRkSW5wdXQoc3RyZWFtKTsKLSAgKytudW1fYXR0YWNoZWRfb3V0cHV0c19zdHJlYW1zXzsKLX0KLQotdm9pZCBWaXJ0dWFsQXVkaW9JbnB1dFN0cmVhbTo6UmVtb3ZlT3V0cHV0U3RyZWFtKAotICAgIFZpcnR1YWxBdWRpb091dHB1dFN0cmVhbSogc3RyZWFtLCBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIG91dHB1dF9wYXJhbXMpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0KLSAgRENIRUNLKGNvbnZlcnRlcnNfLmZpbmQob3V0cHV0X3BhcmFtcykgIT0gY29udmVydGVyc18uZW5kKCkpOwotICBjb252ZXJ0ZXJzX1tvdXRwdXRfcGFyYW1zXS0+UmVtb3ZlSW5wdXQoc3RyZWFtKTsKLQotICAtLW51bV9hdHRhY2hlZF9vdXRwdXRzX3N0cmVhbXNfOwotfQotCi12b2lkIFZpcnR1YWxBdWRpb0lucHV0U3RyZWFtOjpSZWFkQXVkaW8oKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBEQ0hFQ0soY2FsbGJhY2tfKTsKLQotICBtaXhlcl8uQ29udmVydChhdWRpb19idXNfLmdldCgpKTsKLSAgYXVkaW9fYnVzXy0+VG9JbnRlcmxlYXZlZChwYXJhbXNfLmZyYW1lc19wZXJfYnVmZmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zXy5iaXRzX3Blcl9zYW1wbGUoKSAvIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyXy5nZXQoKSk7Ci0KLSAgY2FsbGJhY2tfLT5PbkRhdGEodGhpcywKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyXy5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1zXy5HZXRCeXRlc1BlckJ1ZmZlcigpLAotICAgICAgICAgICAgICAgICAgICBwYXJhbXNfLkdldEJ5dGVzUGVyQnVmZmVyKCksCi0gICAgICAgICAgICAgICAgICAgIDEuMCk7Ci0KLSAgbWVzc2FnZV9sb29wXy0+UG9zdERlbGF5ZWRUYXNrKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uX21vcmVfZGF0YV9jYl8uY2FsbGJhY2soKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9kdXJhdGlvbl9tc18pOwotfQotCi12b2lkIFZpcnR1YWxBdWRpb0lucHV0U3RyZWFtOjpDbG9zZSgpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIGlmIChjYWxsYmFja18pIHsKLSAgICBEQ0hFQ0sob25fbW9yZV9kYXRhX2NiXy5Jc0NhbmNlbGxlZCgpKTsKLSAgICBjYWxsYmFja18tPk9uQ2xvc2UodGhpcyk7Ci0gICAgY2FsbGJhY2tfID0gTlVMTDsKLSAgfQotICBhdWRpb19tYW5hZ2VyXy0+UmVsZWFzZUlucHV0U3RyZWFtKHRoaXMpOwotfQotCi1kb3VibGUgVmlydHVhbEF1ZGlvSW5wdXRTdHJlYW06OkdldE1heFZvbHVtZSgpIHsKLSAgcmV0dXJuIDEuMDsKLX0KLQotdm9pZCBWaXJ0dWFsQXVkaW9JbnB1dFN0cmVhbTo6U2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpIHt9Ci0KLWRvdWJsZSBWaXJ0dWFsQXVkaW9JbnB1dFN0cmVhbTo6R2V0Vm9sdW1lKCkgewotICByZXR1cm4gMS4wOwotfQotCi12b2lkIFZpcnR1YWxBdWRpb0lucHV0U3RyZWFtOjpTZXRBdXRvbWF0aWNHYWluQ29udHJvbChib29sIGVuYWJsZWQpIHt9Ci0KLWJvb2wgVmlydHVhbEF1ZGlvSW5wdXRTdHJlYW06OkdldEF1dG9tYXRpY0dhaW5Db250cm9sKCkgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL3ZpcnR1YWxfYXVkaW9faW5wdXRfc3RyZWFtLmggYi9zcmMvbWVkaWEvYXVkaW8vdmlydHVhbF9hdWRpb19pbnB1dF9zdHJlYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNiODdhNC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vdmlydHVhbF9hdWRpb19pbnB1dF9zdHJlYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0FVRElPX1ZJUlRVQUxfQVVESU9fSU5QVVRfU1RSRUFNX0hfCi0jZGVmaW5lIE1FRElBX0FVRElPX1ZJUlRVQUxfQVVESU9fSU5QVVRfU1RSRUFNX0hfCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c2V0PgotCi0jaW5jbHVkZSAiYmFzZS9jYW5jZWxhYmxlX2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiYmFzZS9ndGVzdF9wcm9kX3V0aWwuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9faW8uaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19tYW5hZ2VyX2Jhc2UuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19wYXJhbWV0ZXJzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19jb252ZXJ0ZXIuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgTG9vcGJhY2tBdWRpb0NvbnZlcnRlcjsKLWNsYXNzIFZpcnR1YWxBdWRpb091dHB1dFN0cmVhbTsKLQotLy8gVmlydHVhbEF1ZGlvSW5wdXRTdHJlYW0gY29udmVydHMgYW5kIG1peGVzIGF1ZGlvIGZyb20gYXR0YWNoZWQKLS8vIFZpcnR1YWxBdWRpb091dHB1dFN0cmVhbXMgaW50byBhIHNpbmdsZSBzdHJlYW0uIEl0IHdpbGwgY29udGludW91c2x5IHJlbmRlcgotLy8gYXVkaW8gdW50aWwgdGhpcyBWaXJ0dWFsQXVkaW9JbnB1dFN0cmVhbSBpcyBzdG9wcGVkIGFuZCBjbG9zZWQuCi1jbGFzcyBNRURJQV9FWFBPUlQgVmlydHVhbEF1ZGlvSW5wdXRTdHJlYW0gOiBwdWJsaWMgQXVkaW9JbnB1dFN0cmVhbSB7Ci0gcHVibGljOgotICBzdGF0aWMgVmlydHVhbEF1ZGlvSW5wdXRTdHJlYW0qIE1ha2VTdHJlYW0oCi0gICAgICBBdWRpb01hbmFnZXJCYXNlKiBtYW5hZ2VyLAotICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsCi0gICAgICBiYXNlOjpNZXNzYWdlTG9vcFByb3h5KiBtZXNzYWdlX2xvb3ApOwotCi0gIHZpcnR1YWwgflZpcnR1YWxBdWRpb0lucHV0U3RyZWFtKCk7Ci0KLSAgLy8gQXVkaW9JbnB1dFN0cmVhbToKLSAgdmlydHVhbCBib29sIE9wZW4oKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0YXJ0KEF1ZGlvSW5wdXRDYWxsYmFjayogY2FsbGJhY2spIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU3RvcCgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgQ2xvc2UoKSBPVkVSUklERTsKLSAgdmlydHVhbCBkb3VibGUgR2V0TWF4Vm9sdW1lKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgZG91YmxlIEdldFZvbHVtZSgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU2V0QXV0b21hdGljR2FpbkNvbnRyb2woYm9vbCBlbmFibGVkKSBPVkVSUklERTsKLSAgdmlydHVhbCBib29sIEdldEF1dG9tYXRpY0dhaW5Db250cm9sKCkgT1ZFUlJJREU7Ci0KLSAgLy8gQXR0YWNoZXMgYSBWaXJ0dWFsQXVkaW9PdXRwdXRTdHJlYW0gdG8gYmUgdXNlZCBhcyBpbnB1dC4gVGhpcwotICAvLyBWaXJ0dWFsQXVkaW9JbnB1dFN0cmVhbSBtdXN0IG91dGxpdmUgYWxsIGF0dGFjaGVkIHN0cmVhbXMsIHNvIGFueSBhdHRhY2hlZAotICAvLyBzdHJlYW0gbXVzdCBiZSBjbG9zZWQgKHdoaWNoIGNhdXNlcyBhIGRldGFjaCkgYmVmb3JlCi0gIC8vIFZpcnR1YWxBdWRpb0lucHV0U3RyZWFtIGlzIGRlc3Ryb3llZC4KLSAgdmlydHVhbCB2b2lkIEFkZE91dHB1dFN0cmVhbShWaXJ0dWFsQXVkaW9PdXRwdXRTdHJlYW0qIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIG91dHB1dF9wYXJhbXMpOwotCi0gIC8vIERldGFjaGVzIGEgVmlydHVhbEF1ZGlvT3V0cHV0U3RyZWFtIGFuZCByZW1vdmVzIGl0IGFzIGlucHV0LgotICB2aXJ0dWFsIHZvaWQgUmVtb3ZlT3V0cHV0U3RyZWFtKFZpcnR1YWxBdWRpb091dHB1dFN0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgb3V0cHV0X3BhcmFtcyk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGZyaWVuZCBjbGFzcyBWaXJ0dWFsQXVkaW9JbnB1dFN0cmVhbVRlc3Q7Ci0gIEZSSUVORF9URVNUX0FMTF9QUkVGSVhFUyhBdWRpb091dHB1dENvbnRyb2xsZXJUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlydHVhbFN0cmVhbXNUcmlnZ2VyRGV2aWNlQ2hhbmdlKTsKLQotICB0eXBlZGVmIHN0ZDo6bWFwPEF1ZGlvUGFyYW1ldGVycywgTG9vcGJhY2tBdWRpb0NvbnZlcnRlcio+IEF1ZGlvQ29udmVydGVyc01hcDsKLQotICBWaXJ0dWFsQXVkaW9JbnB1dFN0cmVhbShBdWRpb01hbmFnZXJCYXNlKiBtYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6TWVzc2FnZUxvb3BQcm94eSogbWVzc2FnZV9sb29wKTsKLQotICAvLyBXaGVuIFN0YXJ0KCkgaXMgY2FsbGVkIG9uIHRoaXMgY2xhc3MsIHdlIGNvbnRpbnVvdXNseSBzY2hlZHVsZSB0aGlzCi0gIC8vIGNhbGxiYWNrIHRvIHJlbmRlciBhdWRpbyB1c2luZyBhbnkgYXR0YWNoZWQgVmlydHVhbEF1ZGlvT3V0cHV0U3RyZWFtcyB1bnRpbAotICAvLyBTdG9wKCkgaXMgY2FsbGVkLgotICB2b2lkIFJlYWRBdWRpbygpOwotCi0gIEF1ZGlvTWFuYWdlckJhc2UqIGF1ZGlvX21hbmFnZXJfOwotICBiYXNlOjpNZXNzYWdlTG9vcFByb3h5KiBtZXNzYWdlX2xvb3BfOwotICBBdWRpb0lucHV0Q2FsbGJhY2sqIGNhbGxiYWNrXzsKLQotICAvLyBOb24tY29uc3QgZm9yIHRlc3RpbmcuCi0gIGJhc2U6OlRpbWVEZWx0YSBidWZmZXJfZHVyYXRpb25fbXNfOwotICBzY29wZWRfYXJyYXk8dWludDg+IGJ1ZmZlcl87Ci0gIEF1ZGlvUGFyYW1ldGVycyBwYXJhbXNfOwotICBzY29wZWRfcHRyPEF1ZGlvQnVzPiBhdWRpb19idXNfOwotICBiYXNlOjpDYW5jZWxhYmxlQ2xvc3VyZSBvbl9tb3JlX2RhdGFfY2JfOwotCi0gIC8vIEF1ZGlvQ29udmVydGVycyBhc3NvY2lhdGVkIHdpdGggdGhlIGF0dGFjaGVkIFZpcnR1YWxBdWRpb091dHB1dFN0cmVhbXMsCi0gIC8vIHBhcnRpdGlvbmVkIGJ5IGNvbW1vbiBBdWRpb1BhcmFtZXRlcnMuCi0gIEF1ZGlvQ29udmVydGVyc01hcCBjb252ZXJ0ZXJzXzsKLQotICAvLyBBdWRpb0NvbnZlcnRlciB0aGF0IHRha2VzIGFsbCB0aGUgYXVkaW8gY29udmVydGVycyBhbmQgbWl4ZXMgdGhlbSBpbnRvIG9uZQotICAvLyBmaW5hbCBhdWRpbyBzdHJlYW0uCi0gIEF1ZGlvQ29udmVydGVyIG1peGVyXzsKLQotICAvLyBOdW1iZXIgb2YgY3VycmVudGx5IGF0dGFjaGVkIFZpcnR1YWxBdWRpb091dHB1dFN0cmVhbXMuCi0gIGludCBudW1fYXR0YWNoZWRfb3V0cHV0c19zdHJlYW1zXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oVmlydHVhbEF1ZGlvSW5wdXRTdHJlYW0pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQVVESU9fVklSVFVBTF9BVURJT19JTlBVVF9TVFJFQU1fSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby92aXJ0dWFsX2F1ZGlvX2lucHV0X3N0cmVhbV91bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9hdWRpby92aXJ0dWFsX2F1ZGlvX2lucHV0X3N0cmVhbV91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI2NWI5Ni4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vdmlydHVhbF9hdWRpb19pbnB1dF9zdHJlYW1fdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMzUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wLmgiCi0jaW5jbHVkZSAiYmFzZS9zeW5jaHJvbml6YXRpb24vd2FpdGFibGVfZXZlbnQuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19tYW5hZ2VyLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vc2ltcGxlX3NvdXJjZXMuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby92aXJ0dWFsX2F1ZGlvX2lucHV0X3N0cmVhbS5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBNb2NrSW5wdXRDYWxsYmFjayA6IHB1YmxpYyBBdWRpb0lucHV0U3RyZWFtOjpBdWRpb0lucHV0Q2FsbGJhY2sgewotIHB1YmxpYzoKLSAgTW9ja0lucHV0Q2FsbGJhY2soKSB7fQotICB2aXJ0dWFsIHZvaWQgT25EYXRhKEF1ZGlvSW5wdXRTdHJlYW0qIHN0cmVhbSwgY29uc3QgdWludDgqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDMyIHNpemUsIHVpbnQzMiBoYXJkd2FyZV9kZWxheV9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdm9sdW1lKSB7fQotICB2aXJ0dWFsIHZvaWQgT25DbG9zZShBdWRpb0lucHV0U3RyZWFtKiBzdHJlYW0pIHt9Ci0gIHZpcnR1YWwgdm9pZCBPbkVycm9yKEF1ZGlvSW5wdXRTdHJlYW0qIHN0cmVhbSwgaW50IGNvZGUpIHt9Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTW9ja0lucHV0Q2FsbGJhY2spOwotfTsKLQotY2xhc3MgVmlydHVhbEF1ZGlvSW5wdXRTdHJlYW1UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgVmlydHVhbEF1ZGlvSW5wdXRTdHJlYW1UZXN0KCkKLSAgICAgIDogYXVkaW9fbWFuYWdlcl8oQXVkaW9NYW5hZ2VyOjpDcmVhdGUoKSksCi0gICAgICAgIHBhcmFtc18oCi0gICAgICAgICAgICBBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1ZJUlRVQUwsQ0hBTk5FTF9MQVlPVVRfTU9OTywgODAwMCwgOCwgMTI4KSwKLSAgICAgICAgb3V0cHV0X3BhcmFtc18oCi0gICAgICAgICAgICBBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIsIENIQU5ORUxfTEFZT1VUX01PTk8sIDgwMDAsIDgsCi0gICAgICAgICAgICAxMjgpLAotICAgICAgICBzdHJlYW1fKE5VTEwpLAotICAgICAgICBzb3VyY2VfKENIQU5ORUxfTEFZT1VUX1NURVJFTywgMjAwLjAsIDEyOCksCi0gICAgICAgIGRvbmVfKGZhbHNlLCBmYWxzZSkgewotICB9Ci0KLSAgdm9pZCBTdGFydFN0cmVhbUFuZFJ1blRlc3RzT25BdWRpb1RocmVhZChpbnQgbnVtX291dHB1dF9zdHJlYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fY2FsbGJhY2tfaXRlcmF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3N0cmVhbXNfcmVtb3ZlZF9wZXJfcm91bmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9leHBlY3RlZF9zb3VyY2VfY2FsbGJhY2tzKSB7Ci0gICAgQVNTRVJUX1RSVUUoYXVkaW9fbWFuYWdlcl8tPkdldE1lc3NhZ2VMb29wKCktPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gICAgc3RyZWFtXy0+T3BlbigpOwotICAgIHN0cmVhbV8tPlN0YXJ0KCZpbnB1dF9jYWxsYmFja18pOwotICAgIEFkZFN0cmVhbXNBbmREb0NhbGxiYWNrcyhudW1fb3V0cHV0X3N0cmVhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9jYWxsYmFja19pdGVyYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fc3RyZWFtc19yZW1vdmVkX3Blcl9yb3VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2V4cGVjdGVkX3NvdXJjZV9jYWxsYmFja3MpOwotICB9Ci0KLSAgdm9pZCBBZGRTdHJlYW1zQW5kRG9DYWxsYmFja3MoaW50IG51bV9vdXRwdXRfc3RyZWFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9jYWxsYmFja19pdGVyYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3N0cmVhbXNfcmVtb3ZlZF9wZXJfcm91bmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fZXhwZWN0ZWRfc291cmNlX2NhbGxiYWNrcykgewotICAgIEFTU0VSVF9UUlVFKGF1ZGlvX21hbmFnZXJfLT5HZXRNZXNzYWdlTG9vcCgpLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fb3V0cHV0X3N0cmVhbXM7ICsraSkgewotICAgICAgQXVkaW9PdXRwdXRTdHJlYW0qIG91dHB1dF9zdHJlYW0gPQotICAgICAgICAgIGF1ZGlvX21hbmFnZXJfLT5NYWtlQXVkaW9PdXRwdXRTdHJlYW0ob3V0cHV0X3BhcmFtc18pOwotICAgICAgRENIRUNLKG91dHB1dF9zdHJlYW0pOwotICAgICAgb3V0cHV0X3N0cmVhbXNfLnB1c2hfYmFjayhvdXRwdXRfc3RyZWFtKTsKLQotICAgICAgb3V0cHV0X3N0cmVhbS0+T3BlbigpOwotICAgICAgb3V0cHV0X3N0cmVhbS0+U3RhcnQoJnNvdXJjZV8pOwotICAgIH0KLQotICAgIGlmIChudW1fb3V0cHV0X3N0cmVhbXMgPT0gMCAmJiBudW1fc3RyZWFtc19yZW1vdmVkX3Blcl9yb3VuZCA+IDApIHsKLSAgICAgIEF1ZGlvT3V0cHV0U3RyZWFtKiBvdXRwdXRfc3RyZWFtID0gb3V0cHV0X3N0cmVhbXNfLmJhY2soKTsKLSAgICAgIG91dHB1dF9zdHJlYW1zXy5wb3BfYmFjaygpOwotICAgICAgb3V0cHV0X3N0cmVhbS0+U3RvcCgpOwotICAgICAgb3V0cHV0X3N0cmVhbS0+Q2xvc2UoKTsKLSAgICB9Ci0KLSAgICBpZiAobnVtX2NhbGxiYWNrX2l0ZXJhdGlvbnMgPiAwKSB7Ci0gICAgICAvLyBGb3JjZSB0aGUgbmV4dCBjYWxsYmFjayB0byBiZSBpbW1lZGlhdGUuCi0gICAgICBzdHJlYW1fLT5idWZmZXJfZHVyYXRpb25fbXNfID0gYmFzZTo6VGltZURlbHRhKCk7Ci0gICAgICBhdWRpb19tYW5hZ2VyXy0+R2V0TWVzc2FnZUxvb3AoKS0+UG9zdFRhc2soCi0gICAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKAotICAgICAgICAgICAgICAmVmlydHVhbEF1ZGlvSW5wdXRTdHJlYW1UZXN0OjpBZGRTdHJlYW1zQW5kRG9DYWxsYmFja3MsCi0gICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksCi0gICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgIC0tbnVtX2NhbGxiYWNrX2l0ZXJhdGlvbnMsCi0gICAgICAgICAgICAgIG51bV9zdHJlYW1zX3JlbW92ZWRfcGVyX3JvdW5kLAotICAgICAgICAgICAgICBudW1fZXhwZWN0ZWRfc291cmNlX2NhbGxiYWNrcykpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBGaW5pc2ggdGhlIHRlc3QuCi0gICAgICBFWFBFQ1RfRVEobnVtX2V4cGVjdGVkX3NvdXJjZV9jYWxsYmFja3MsIHNvdXJjZV8uY2FsbGJhY2tzKCkpOwotICAgICAgRVhQRUNUX0VRKDAsIHNvdXJjZV8uZXJyb3JzKCkpOwotCi0gICAgICBmb3IgKHN0ZDo6dmVjdG9yPEF1ZGlvT3V0cHV0U3RyZWFtKj46Oml0ZXJhdG9yIGl0ID0KLSAgICAgICAgICAgb3V0cHV0X3N0cmVhbXNfLmJlZ2luKCk7IGl0ICE9IG91dHB1dF9zdHJlYW1zXy5lbmQoKTsgKytpdCkKLSAgICAgICAgKCppdCktPlN0b3AoKTsKLQotICAgICAgc3RyZWFtXy0+U3RvcCgpOwotCi0gICAgICBhdWRpb19tYW5hZ2VyXy0+R2V0TWVzc2FnZUxvb3AoKS0+UG9zdFRhc2soCi0gICAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZWaXJ0dWFsQXVkaW9JbnB1dFN0cmVhbVRlc3Q6OkVuZFRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIE9wZW5BbmRDbG9zZU9uQXVkaW9UaHJlYWQoKSB7Ci0gICAgQVNTRVJUX1RSVUUoYXVkaW9fbWFuYWdlcl8tPkdldE1lc3NhZ2VMb29wKCktPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gICAgc3RyZWFtXy0+T3BlbigpOwotCi0gICAgLy8gQ3JlYXRlIDIgb3V0cHV0IHN0cmVhbXMsIHdoaWNoIHdlIGp1c3Qgb3BlbiBhbmQgY2xvc2Ugd2l0aG91dCBzdGFydGluZy4KLSAgICBjb25zdCBpbnQgbnVtX291dHB1dF9zdHJlYW0gPSAyOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fb3V0cHV0X3N0cmVhbTsgKytpKSB7Ci0gICAgICBBdWRpb091dHB1dFN0cmVhbSogb3V0cHV0X3N0cmVhbSA9Ci0gICAgICAgICAgYXVkaW9fbWFuYWdlcl8tPk1ha2VBdWRpb091dHB1dFN0cmVhbShvdXRwdXRfcGFyYW1zXyk7Ci0gICAgICBEQ0hFQ0sob3V0cHV0X3N0cmVhbSk7Ci0gICAgICBvdXRwdXRfc3RyZWFtc18ucHVzaF9iYWNrKG91dHB1dF9zdHJlYW0pOwotCi0gICAgICBvdXRwdXRfc3RyZWFtLT5PcGVuKCk7Ci0gICAgfQotCi0gICAgYXVkaW9fbWFuYWdlcl8tPkdldE1lc3NhZ2VMb29wKCktPlBvc3RUYXNrKAotICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJlZpcnR1YWxBdWRpb0lucHV0U3RyZWFtVGVzdDo6RW5kVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLSAgfQotCi0gIHZvaWQgU3RhcnRTdG9wT25BdWRpb1RocmVhZChpbnQgbnVtX291dHB1dF9zdHJlYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9jYWxsYmFja19pdGVyYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9leHBlY3RlZF9zb3VyY2VfY2FsbGJhY2tzKSB7Ci0gICAgQVNTRVJUX1RSVUUoYXVkaW9fbWFuYWdlcl8tPkdldE1lc3NhZ2VMb29wKCktPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gICAgc3RyZWFtXy0+T3BlbigpOwotICAgIHN0cmVhbV8tPlN0YXJ0KCZpbnB1dF9jYWxsYmFja18pOwotICAgIFN0YXJ0U3RvcENhbGxiYWNrKHRydWUsIG51bV9vdXRwdXRfc3RyZWFtcywgbnVtX2NhbGxiYWNrX2l0ZXJhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgbnVtX2V4cGVjdGVkX3NvdXJjZV9jYWxsYmFja3MpOwotICB9Ci0KLSAgdm9pZCBTdGFydFN0b3BDYWxsYmFjayhib29sIGluaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9vdXRwdXRfc3RyZWFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2NhbGxiYWNrX2l0ZXJhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9leHBlY3RlZF9zb3VyY2VfY2FsbGJhY2tzKSB7Ci0gICAgQVNTRVJUX1RSVUUoYXVkaW9fbWFuYWdlcl8tPkdldE1lc3NhZ2VMb29wKCktPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0KLSAgICBpZiAoaW5pdCkgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fb3V0cHV0X3N0cmVhbXM7ICsraSkgewotICAgICAgICBBdWRpb091dHB1dFN0cmVhbSogb3V0cHV0X3N0cmVhbSA9Ci0gICAgICAgICAgICBhdWRpb19tYW5hZ2VyXy0+TWFrZUF1ZGlvT3V0cHV0U3RyZWFtKG91dHB1dF9wYXJhbXNfKTsKLSAgICAgICAgRENIRUNLKG91dHB1dF9zdHJlYW0pOwotICAgICAgICBvdXRwdXRfc3RyZWFtc18ucHVzaF9iYWNrKG91dHB1dF9zdHJlYW0pOwotCi0gICAgICAgIG91dHB1dF9zdHJlYW0tPk9wZW4oKTsKLSAgICAgICAgb3V0cHV0X3N0cmVhbS0+U3RhcnQoJnNvdXJjZV8pOwotICAgICAgfQotCi0gICAgICAvLyBTdGFydCB3aXRoIGFuIG9kZCBpdGVyYXRpb24gbnVtYmVyIHNvIHdlIGNhbGwgU3RvcCgpIGZpcnN0IGJlbG93LgotICAgICAgRENIRUNLX05FKDAsIG51bV9jYWxsYmFja19pdGVyYXRpb25zICUgMik7Ci0gICAgfQotCi0gICAgLy8gU3RhcnQgb3Igc3RvcCBoYWxmIHRoZSBzdHJlYW1zLgotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX291dHB1dF9zdHJlYW1zIC8gMjsgKytpKSB7Ci0gICAgICBpZiAobnVtX2NhbGxiYWNrX2l0ZXJhdGlvbnMgJSAyICE9IDApCi0gICAgICAgIG91dHB1dF9zdHJlYW1zX1tpXS0+U3RvcCgpOwotICAgICAgZWxzZQotICAgICAgICBvdXRwdXRfc3RyZWFtc19baV0tPlN0YXJ0KCZzb3VyY2VfKTsKLSAgICB9Ci0KLSAgICBpZiAobnVtX2NhbGxiYWNrX2l0ZXJhdGlvbnMgPiAwKSB7Ci0gICAgICAvLyBGb3JjZSB0aGUgbmV4dCBjYWxsYmFjayB0byBiZSBpbW1lZGlhdGUuCi0gICAgICBzdHJlYW1fLT5idWZmZXJfZHVyYXRpb25fbXNfID0gYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDApOwotICAgICAgYXVkaW9fbWFuYWdlcl8tPkdldE1lc3NhZ2VMb29wKCktPlBvc3RUYXNrKAotICAgICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgKLSAgICAgICAgICAgICAgJlZpcnR1YWxBdWRpb0lucHV0U3RyZWFtVGVzdDo6U3RhcnRTdG9wQ2FsbGJhY2ssCi0gICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksCi0gICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICBudW1fb3V0cHV0X3N0cmVhbXMsCi0gICAgICAgICAgICAgIC0tbnVtX2NhbGxiYWNrX2l0ZXJhdGlvbnMsCi0gICAgICAgICAgICAgIG51bV9leHBlY3RlZF9zb3VyY2VfY2FsbGJhY2tzKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIEZpbmlzaCB0aGUgdGVzdC4KLSAgICAgIEVYUEVDVF9FUShudW1fZXhwZWN0ZWRfc291cmNlX2NhbGxiYWNrcywgc291cmNlXy5jYWxsYmFja3MoKSk7Ci0gICAgICBFWFBFQ1RfRVEoMCwgc291cmNlXy5lcnJvcnMoKSk7Ci0KLSAgICAgIGZvciAoc3RkOjp2ZWN0b3I8QXVkaW9PdXRwdXRTdHJlYW0qPjo6aXRlcmF0b3IgaXQgPQotICAgICAgICAgICBvdXRwdXRfc3RyZWFtc18uYmVnaW4oKTsgaXQgIT0gb3V0cHV0X3N0cmVhbXNfLmVuZCgpOyArK2l0KQotICAgICAgICAoKml0KS0+U3RvcCgpOwotCi0gICAgICBzdHJlYW1fLT5TdG9wKCk7Ci0KLSAgICAgIGF1ZGlvX21hbmFnZXJfLT5HZXRNZXNzYWdlTG9vcCgpLT5Qb3N0VGFzayhGUk9NX0hFUkUsCi0gICAgICAgICAgYmFzZTo6QmluZCgmVmlydHVhbEF1ZGlvSW5wdXRTdHJlYW1UZXN0OjpFbmRUZXN0LAotICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBFbmRUZXN0KCkgewotICAgIGZvciAoc3RkOjp2ZWN0b3I8QXVkaW9PdXRwdXRTdHJlYW0qPjo6aXRlcmF0b3IgaXQgPQotICAgICAgICAgb3V0cHV0X3N0cmVhbXNfLmJlZ2luKCk7IGl0ICE9IG91dHB1dF9zdHJlYW1zXy5lbmQoKTsgKytpdCkKLSAgICAgICgqaXQpLT5DbG9zZSgpOwotCi0gICAgc3RyZWFtXy0+Q2xvc2UoKTsKLQotICAgIGRvbmVfLlNpZ25hbCgpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHNjb3BlZF9wdHI8QXVkaW9NYW5hZ2VyPiBhdWRpb19tYW5hZ2VyXzsKLSAgQXVkaW9QYXJhbWV0ZXJzIHBhcmFtc187Ci0gIEF1ZGlvUGFyYW1ldGVycyBvdXRwdXRfcGFyYW1zXzsKLSAgVmlydHVhbEF1ZGlvSW5wdXRTdHJlYW0qIHN0cmVhbV87Ci0gIE1vY2tJbnB1dENhbGxiYWNrIGlucHV0X2NhbGxiYWNrXzsKLSAgc3RkOjp2ZWN0b3I8QXVkaW9PdXRwdXRTdHJlYW0qPiBvdXRwdXRfc3RyZWFtc187Ci0gIFNpbmVXYXZlQXVkaW9Tb3VyY2Ugc291cmNlXzsKLSAgYmFzZTo6V2FpdGFibGVFdmVudCBkb25lXzsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihWaXJ0dWFsQXVkaW9JbnB1dFN0cmVhbVRlc3QpOwotfTsKLQotVEVTVF9GKFZpcnR1YWxBdWRpb0lucHV0U3RyZWFtVGVzdCwgQXR0YWNoQW5kRHJpdmVTaW5nbGVTdHJlYW0pIHsKLSAgc3RyZWFtXyA9IHN0YXRpY19jYXN0PFZpcnR1YWxBdWRpb0lucHV0U3RyZWFtKj4oCi0gICAgICBhdWRpb19tYW5hZ2VyXy0+TWFrZUF1ZGlvSW5wdXRTdHJlYW0ocGFyYW1zXywgIjEiKSk7Ci0gIERDSEVDSyhzdHJlYW1fKTsKLQotICBjb25zdCBpbnQgbnVtX291dHB1dF9zdHJlYW1zID0gMTsKLSAgY29uc3QgaW50IG51bV9jYWxsYmFja19pdGVyYXRpb25zID0gMTsKLSAgY29uc3QgaW50IG51bV9zdHJlYW1zX3JlbW92ZWRfcGVyX3JvdW5kID0gMDsKLSAgY29uc3QgaW50IG51bV9leHBlY3RlZF9zb3VyY2VfY2FsbGJhY2tzID0gMTsKLQotICBhdWRpb19tYW5hZ2VyXy0+R2V0TWVzc2FnZUxvb3AoKS0+UG9zdFRhc2soCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoCi0gICAgICAgICAgJlZpcnR1YWxBdWRpb0lucHV0U3RyZWFtVGVzdDo6U3RhcnRTdHJlYW1BbmRSdW5UZXN0c09uQXVkaW9UaHJlYWQsCi0gICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwKLSAgICAgICAgICBudW1fb3V0cHV0X3N0cmVhbXMsCi0gICAgICAgICAgbnVtX2NhbGxiYWNrX2l0ZXJhdGlvbnMsCi0gICAgICAgICAgbnVtX3N0cmVhbXNfcmVtb3ZlZF9wZXJfcm91bmQsCi0gICAgICAgICAgbnVtX2V4cGVjdGVkX3NvdXJjZV9jYWxsYmFja3MpKTsKLQotICBkb25lXy5XYWl0KCk7Ci19Ci0KLVRFU1RfRihWaXJ0dWFsQXVkaW9JbnB1dFN0cmVhbVRlc3QsIEF0dGFjaEFuZERyaXZlTXVsdGlwbGVTdHJlYW1zKSB7Ci0gIHN0cmVhbV8gPSBzdGF0aWNfY2FzdDxWaXJ0dWFsQXVkaW9JbnB1dFN0cmVhbSo+KAotICAgICAgYXVkaW9fbWFuYWdlcl8tPk1ha2VBdWRpb0lucHV0U3RyZWFtKHBhcmFtc18sICIxIikpOwotICBEQ0hFQ0soc3RyZWFtXyk7Ci0KLSAgY29uc3QgaW50IG51bV9vdXRwdXRfc3RyZWFtcyA9IDU7Ci0gIGNvbnN0IGludCBudW1fY2FsbGJhY2tfaXRlcmF0aW9ucyA9IDU7Ci0gIGNvbnN0IGludCBudW1fc3RyZWFtc19yZW1vdmVkX3Blcl9yb3VuZCA9IDA7Ci0gIGNvbnN0IGludCBudW1fZXhwZWN0ZWRfc291cmNlX2NhbGxiYWNrcyA9IDI1OwotCi0gIGF1ZGlvX21hbmFnZXJfLT5HZXRNZXNzYWdlTG9vcCgpLT5Qb3N0VGFzaygKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgKLSAgICAgICAgICAmVmlydHVhbEF1ZGlvSW5wdXRTdHJlYW1UZXN0OjpTdGFydFN0cmVhbUFuZFJ1blRlc3RzT25BdWRpb1RocmVhZCwKLSAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLAotICAgICAgICAgIG51bV9vdXRwdXRfc3RyZWFtcywKLSAgICAgICAgICBudW1fY2FsbGJhY2tfaXRlcmF0aW9ucywKLSAgICAgICAgICBudW1fc3RyZWFtc19yZW1vdmVkX3Blcl9yb3VuZCwKLSAgICAgICAgICBudW1fZXhwZWN0ZWRfc291cmNlX2NhbGxiYWNrcykpOwotCi0gIGRvbmVfLldhaXQoKTsKLX0KLQotVEVTVF9GKFZpcnR1YWxBdWRpb0lucHV0U3RyZWFtVGVzdCwgQXR0YWNoQW5kUmVtb3ZlU3RyZWFtcykgewotICBzdHJlYW1fID0gc3RhdGljX2Nhc3Q8VmlydHVhbEF1ZGlvSW5wdXRTdHJlYW0qPigKLSAgICAgIGF1ZGlvX21hbmFnZXJfLT5NYWtlQXVkaW9JbnB1dFN0cmVhbShwYXJhbXNfLCAiMSIpKTsKLSAgRENIRUNLKHN0cmVhbV8pOwotCi0gIGNvbnN0IGludCBudW1fb3V0cHV0X3N0cmVhbXMgPSA4OwotICBjb25zdCBpbnQgbnVtX2NhbGxiYWNrX2l0ZXJhdGlvbnMgPSA1OwotICBjb25zdCBpbnQgbnVtX3N0cmVhbXNfcmVtb3ZlZF9wZXJfcm91bmQgPSAxOwotICBjb25zdCBpbnQgbnVtX2V4cGVjdGVkX3NvdXJjZV9jYWxsYmFja3MgPSA4ICsgNyArIDYgKyA1ICsgNDsKLQotICBhdWRpb19tYW5hZ2VyXy0+R2V0TWVzc2FnZUxvb3AoKS0+UG9zdFRhc2soCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoCi0gICAgICAgICAgJlZpcnR1YWxBdWRpb0lucHV0U3RyZWFtVGVzdDo6U3RhcnRTdHJlYW1BbmRSdW5UZXN0c09uQXVkaW9UaHJlYWQsCi0gICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwKLSAgICAgICAgICBudW1fb3V0cHV0X3N0cmVhbXMsCi0gICAgICAgICAgbnVtX2NhbGxiYWNrX2l0ZXJhdGlvbnMsCi0gICAgICAgICAgbnVtX3N0cmVhbXNfcmVtb3ZlZF9wZXJfcm91bmQsCi0gICAgICAgICAgbnVtX2V4cGVjdGVkX3NvdXJjZV9jYWxsYmFja3MpKTsKLQotICBkb25lXy5XYWl0KCk7Ci19Ci0KLS8vIE9wZW5zL2Nsb3NlcyBhIFZpcnR1YWxBdWRpb0lucHV0U3RyZWFtIGFuZCBhIG51bWJlciBvZiBhdHRhY2hlZAotLy8gVmlydHVhbEF1ZGlvT3V0cHV0U3RyZWFtcyB3aXRob3V0IGNhbGxpbmcgU3RhcnQoKS9TdG9wKCkuCi1URVNUX0YoVmlydHVhbEF1ZGlvSW5wdXRTdHJlYW1UZXN0LCBPcGVuQW5kQ2xvc2UpIHsKLSAgc3RyZWFtXyA9IHN0YXRpY19jYXN0PFZpcnR1YWxBdWRpb0lucHV0U3RyZWFtKj4oCi0gICAgICBhdWRpb19tYW5hZ2VyXy0+TWFrZUF1ZGlvSW5wdXRTdHJlYW0ocGFyYW1zXywgIjEiKSk7Ci0gIERDSEVDSyhzdHJlYW1fKTsKLQotICBhdWRpb19tYW5hZ2VyXy0+R2V0TWVzc2FnZUxvb3AoKS0+UG9zdFRhc2soCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoCi0gICAgICAgICAgJlZpcnR1YWxBdWRpb0lucHV0U3RyZWFtVGVzdDo6T3BlbkFuZENsb3NlT25BdWRpb1RocmVhZCwKLSAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0KLSAgZG9uZV8uV2FpdCgpOwotfQotCi0vLyBDcmVhdGVzIGFuZCBjbG9zZXMgYW5kIFZpcnR1YWxBdWRpb0lucHV0U3RyZWFtLgotVEVTVF9GKFZpcnR1YWxBdWRpb0lucHV0U3RyZWFtVGVzdCwgQ3JlYXRlQW5kQ2xvc2UpIHsKLSAgc3RyZWFtXyA9IHN0YXRpY19jYXN0PFZpcnR1YWxBdWRpb0lucHV0U3RyZWFtKj4oCi0gICAgICBhdWRpb19tYW5hZ2VyXy0+TWFrZUF1ZGlvSW5wdXRTdHJlYW0ocGFyYW1zXywgIjEiKSk7Ci0gIERDSEVDSyhzdHJlYW1fKTsKLQotICBhdWRpb19tYW5hZ2VyXy0+R2V0TWVzc2FnZUxvb3AoKS0+UG9zdFRhc2soCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJlZpcnR1YWxBdWRpb0lucHV0U3RyZWFtVGVzdDo6RW5kVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0KLSAgZG9uZV8uV2FpdCgpOwotfQotCi0vLyBTdGFydHMgYW5kIHN0b3BzIFZpcnR1YWxBdWRpb091dHB1dFN0cmVhbXMgd2hpbGUgYXR0YWNoZWQgdG8gYQotLy8gVmlydHVhbEF1ZGlvSW5wdXRTdHJlYW0uCi1URVNUX0YoVmlydHVhbEF1ZGlvSW5wdXRTdHJlYW1UZXN0LCBBdHRhY2hBbmRTdGFydFN0b3BTdHJlYW1zKSB7Ci0gIHN0cmVhbV8gPSBzdGF0aWNfY2FzdDxWaXJ0dWFsQXVkaW9JbnB1dFN0cmVhbSo+KAotICAgICAgYXVkaW9fbWFuYWdlcl8tPk1ha2VBdWRpb0lucHV0U3RyZWFtKHBhcmFtc18sICIxIikpOwotICBEQ0hFQ0soc3RyZWFtXyk7Ci0KLSAgY29uc3QgaW50IG51bV9vdXRwdXRfc3RyZWFtcyA9IDQ7Ci0gIGNvbnN0IGludCBudW1fY2FsbGJhY2tfaXRlcmF0aW9ucyA9IDU7Ci0gIGNvbnN0IGludCBudW1fZXhwZWN0ZWRfc291cmNlX2NhbGxiYWNrcyA9IDIgKyA0ICsgMiArIDQgKyAyOwotCi0gIGF1ZGlvX21hbmFnZXJfLT5HZXRNZXNzYWdlTG9vcCgpLT5Qb3N0VGFzaygKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgKLSAgICAgICAgICAmVmlydHVhbEF1ZGlvSW5wdXRTdHJlYW1UZXN0OjpTdGFydFN0b3BPbkF1ZGlvVGhyZWFkLAotICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksCi0gICAgICAgICAgbnVtX291dHB1dF9zdHJlYW1zLAotICAgICAgICAgIG51bV9jYWxsYmFja19pdGVyYXRpb25zLAotICAgICAgICAgIG51bV9leHBlY3RlZF9zb3VyY2VfY2FsbGJhY2tzKSk7Ci0KLSAgZG9uZV8uV2FpdCgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby92aXJ0dWFsX2F1ZGlvX291dHB1dF9zdHJlYW0uY2MgYi9zcmMvbWVkaWEvYXVkaW8vdmlydHVhbF9hdWRpb19vdXRwdXRfc3RyZWFtLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWNjNjY3Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby92aXJ0dWFsX2F1ZGlvX291dHB1dF9zdHJlYW0uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vdmlydHVhbF9hdWRpb19vdXRwdXRfc3RyZWFtLmgiCi0KLSNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX21hbmFnZXJfYmFzZS5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3ZpcnR1YWxfYXVkaW9faW5wdXRfc3RyZWFtLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIHN0YXRpYwotVmlydHVhbEF1ZGlvT3V0cHV0U3RyZWFtKiBWaXJ0dWFsQXVkaW9PdXRwdXRTdHJlYW06Ok1ha2VTdHJlYW0oCi0gICAgQXVkaW9NYW5hZ2VyQmFzZSogbWFuYWdlciwgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsCi0gICAgYmFzZTo6TWVzc2FnZUxvb3BQcm94eSogbWVzc2FnZV9sb29wLCBWaXJ0dWFsQXVkaW9JbnB1dFN0cmVhbSogdGFyZ2V0KSB7Ci0gIHJldHVybiBuZXcgVmlydHVhbEF1ZGlvT3V0cHV0U3RyZWFtKG1hbmFnZXIsIHBhcmFtcywgbWVzc2FnZV9sb29wLCB0YXJnZXQpOwotfQotCi1WaXJ0dWFsQXVkaW9PdXRwdXRTdHJlYW06OlZpcnR1YWxBdWRpb091dHB1dFN0cmVhbSgKLSAgICBBdWRpb01hbmFnZXJCYXNlKiBtYW5hZ2VyLCBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywKLSAgICBiYXNlOjpNZXNzYWdlTG9vcFByb3h5KiBtZXNzYWdlX2xvb3AsIFZpcnR1YWxBdWRpb0lucHV0U3RyZWFtKiB0YXJnZXQpCi0gICAgOiBhdWRpb19tYW5hZ2VyXyhtYW5hZ2VyKSwgbWVzc2FnZV9sb29wXyhtZXNzYWdlX2xvb3ApLCBjYWxsYmFja18oTlVMTCksCi0gICAgICBwYXJhbXNfKHBhcmFtcyksIHRhcmdldF9pbnB1dF9zdHJlYW1fKHRhcmdldCksIHZvbHVtZV8oMS4wZiksCi0gICAgICBhdHRhY2hlZF8oZmFsc2UpIHsKLX0KLQotVmlydHVhbEF1ZGlvT3V0cHV0U3RyZWFtOjp+VmlydHVhbEF1ZGlvT3V0cHV0U3RyZWFtKCkgewotICBEQ0hFQ0soIWNhbGxiYWNrXyk7Ci0gIERDSEVDSyghYXR0YWNoZWRfKTsKLX0KLQotYm9vbCBWaXJ0dWFsQXVkaW9PdXRwdXRTdHJlYW06Ok9wZW4oKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBWaXJ0dWFsQXVkaW9PdXRwdXRTdHJlYW06OlN0YXJ0KEF1ZGlvU291cmNlQ2FsbGJhY2sqIGNhbGxiYWNrKSAgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgRENIRUNLKCFhdHRhY2hlZF8pOwotICBjYWxsYmFja18gPSBjYWxsYmFjazsKLSAgdGFyZ2V0X2lucHV0X3N0cmVhbV8tPkFkZE91dHB1dFN0cmVhbSh0aGlzLCBwYXJhbXNfKTsKLSAgYXR0YWNoZWRfID0gdHJ1ZTsKLX0KLQotdm9pZCBWaXJ0dWFsQXVkaW9PdXRwdXRTdHJlYW06OlN0b3AoKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBEQ0hFQ0soYXR0YWNoZWRfKTsKLSAgY2FsbGJhY2tfID0gTlVMTDsKLSAgdGFyZ2V0X2lucHV0X3N0cmVhbV8tPlJlbW92ZU91dHB1dFN0cmVhbSh0aGlzLCBwYXJhbXNfKTsKLSAgYXR0YWNoZWRfID0gZmFsc2U7Ci19Ci0KLXZvaWQgVmlydHVhbEF1ZGlvT3V0cHV0U3RyZWFtOjpDbG9zZSgpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIGF1ZGlvX21hbmFnZXJfLT5SZWxlYXNlT3V0cHV0U3RyZWFtKHRoaXMpOwotfQotCi12b2lkIFZpcnR1YWxBdWRpb091dHB1dFN0cmVhbTo6U2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpIHsKLSAgdm9sdW1lXyA9IHZvbHVtZTsKLX0KLQotdm9pZCBWaXJ0dWFsQXVkaW9PdXRwdXRTdHJlYW06OkdldFZvbHVtZShkb3VibGUqIHZvbHVtZSkgewotICAqdm9sdW1lID0gdm9sdW1lXzsKLX0KLQotZG91YmxlIFZpcnR1YWxBdWRpb091dHB1dFN0cmVhbTo6UHJvdmlkZUlucHV0KEF1ZGlvQnVzKiBhdWRpb19idXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhIGJ1ZmZlcl9kZWxheSkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgRENIRUNLKGNhbGxiYWNrXyk7Ci0KLSAgaW50IGZyYW1lcyA9IGNhbGxiYWNrXy0+T25Nb3JlRGF0YShhdWRpb19idXMsIEF1ZGlvQnVmZmVyc1N0YXRlKCkpOwotICBpZiAoZnJhbWVzIDwgYXVkaW9fYnVzLT5mcmFtZXMoKSkKLSAgICBhdWRpb19idXMtPlplcm9GcmFtZXNQYXJ0aWFsKGZyYW1lcywgYXVkaW9fYnVzLT5mcmFtZXMoKSAtIGZyYW1lcyk7Ci0KLSAgcmV0dXJuIGZyYW1lcyA+IDAgPyB2b2x1bWVfIDogMDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vdmlydHVhbF9hdWRpb19vdXRwdXRfc3RyZWFtLmggYi9zcmMvbWVkaWEvYXVkaW8vdmlydHVhbF9hdWRpb19vdXRwdXRfc3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMjk2OWQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL3ZpcnR1YWxfYXVkaW9fb3V0cHV0X3N0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9BVURJT19WSVJUVUFMX0FVRElPX09VVFBVVF9TVFJFQU1fSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fVklSVFVBTF9BVURJT19PVVRQVVRfU1RSRUFNX0hfCi0KLSNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcF9wcm94eS5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX2lvLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fcGFyYW1ldGVycy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fY29udmVydGVyLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIEF1ZGlvTWFuYWdlckJhc2U7Ci1jbGFzcyBWaXJ0dWFsQXVkaW9JbnB1dFN0cmVhbTsKLQotLy8gVmlydHVhbEF1ZGlvT3V0cHV0U3RyZWFtIGF0dGFjaGVzIHRvIGEgVmlydHVhbEF1ZGlvSW5wdXRTdHJlYW0gd2hlbiBTdGFydCgpCi0vLyBpcyBjYWxsZWQgYW5kIGlzIHVzZWQgYXMgYW4gYXVkaW8gc291cmNlLiBWaXJ0dWFsQXVkaW9PdXRwdXRTdHJlYW0gYWxzbwotLy8gaW1wbGVtZW50cyBhbiBpbnRlcmZhY2Ugc28gaXQgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgdG8gQXVkaW9Db252ZXJ0ZXIgc28KLS8vIHRoYXQgd2UgY2FuIGdldCBhdWRpbyBmcmFtZXMgdGhhdCBtYXRjaCB0aGUgQXVkaW9QYXJhbWV0ZXJzIHRoYXQKLS8vIFZpcnR1YWxBdWRpb0lucHV0U3RyZWFtIGV4cGVjdHMuCi1jbGFzcyBNRURJQV9FWFBPUlQgVmlydHVhbEF1ZGlvT3V0cHV0U3RyZWFtCi0gICAgOiBwdWJsaWMgQXVkaW9PdXRwdXRTdHJlYW0sCi0gICAgICBwdWJsaWMgQXVkaW9Db252ZXJ0ZXI6OklucHV0Q2FsbGJhY2sgewotIHB1YmxpYzoKLSAgc3RhdGljIFZpcnR1YWxBdWRpb091dHB1dFN0cmVhbSogTWFrZVN0cmVhbSgKLSAgICAgIEF1ZGlvTWFuYWdlckJhc2UqIG1hbmFnZXIsCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywKLSAgICAgIGJhc2U6Ok1lc3NhZ2VMb29wUHJveHkqIG1lc3NhZ2VfbG9vcCwKLSAgICAgIFZpcnR1YWxBdWRpb0lucHV0U3RyZWFtKiB0YXJnZXQpOwotCi0gIHZpcnR1YWwgflZpcnR1YWxBdWRpb091dHB1dFN0cmVhbSgpOwotCi0gIC8vIEF1ZGlvT3V0cHV0U3RyZWFtOgotICB2aXJ0dWFsIGJvb2wgT3BlbigpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU3RhcnQoQXVkaW9Tb3VyY2VDYWxsYmFjayogY2FsbGJhY2spIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU3RvcCgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgR2V0Vm9sdW1lKGRvdWJsZSogdm9sdW1lKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIENsb3NlKCkgT1ZFUlJJREU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIFZpcnR1YWxBdWRpb091dHB1dFN0cmVhbShBdWRpb01hbmFnZXJCYXNlKiBtYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpNZXNzYWdlTG9vcFByb3h5KiBtZXNzYWdlX2xvb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWaXJ0dWFsQXVkaW9JbnB1dFN0cmVhbSogdGFyZ2V0KTsKLQotIHByaXZhdGU6Ci0gIC8vIEF1ZGlvQ29udmVydGVyOjpJbnB1dENhbGxiYWNrOgotICB2aXJ0dWFsIGRvdWJsZSBQcm92aWRlSW5wdXQoQXVkaW9CdXMqIGF1ZGlvX2J1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YSBidWZmZXJfZGVsYXkpIE9WRVJSSURFOwotCi0gIEF1ZGlvTWFuYWdlckJhc2UqIGF1ZGlvX21hbmFnZXJfOwotICBiYXNlOjpNZXNzYWdlTG9vcFByb3h5KiBtZXNzYWdlX2xvb3BfOwotICBBdWRpb1NvdXJjZUNhbGxiYWNrKiBjYWxsYmFja187Ci0gIEF1ZGlvUGFyYW1ldGVycyBwYXJhbXNfOwotCi0gIC8vIFBvaW50ZXIgdG8gdGhlIFZpcnR1YWxBdWRpb0lucHV0U3RyZWFtIHRvIGF0dGFjaCB0byB3aGVuIFN0YXJ0KCkgaXMgY2FsbGVkLgotICAvLyBUaGlzIHBvaW50ZXIgc2hvdWxkIGFsd2F5cyBiZSB2YWxpZCBiZWNhdXNlIFZpcnR1YWxBdWRpb0lucHV0U3RyZWFtIHNob3VsZAotICAvLyBvdXRsaXZlIHRoaXMgY2xhc3MuCi0gIFZpcnR1YWxBdWRpb0lucHV0U3RyZWFtKiB0YXJnZXRfaW5wdXRfc3RyZWFtXzsKLSAgZG91YmxlIHZvbHVtZV87Ci0gIGJvb2wgYXR0YWNoZWRfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihWaXJ0dWFsQXVkaW9PdXRwdXRTdHJlYW0pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQVVESU9fVklSVFVBTF9BVURJT19PVVRQVVRfU1RSRUFNX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vdmlydHVhbF9hdWRpb19vdXRwdXRfc3RyZWFtX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2F1ZGlvL3ZpcnR1YWxfYXVkaW9fb3V0cHV0X3N0cmVhbV91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUyNjdmNS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vdmlydHVhbF9hdWRpb19vdXRwdXRfc3RyZWFtX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgotI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL3dhaXRhYmxlX2V2ZW50LmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fbWFuYWdlci5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3NpbXBsZV9zb3VyY2VzLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vdmlydHVhbF9hdWRpb19pbnB1dF9zdHJlYW0uaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby92aXJ0dWFsX2F1ZGlvX291dHB1dF9zdHJlYW0uaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgOjp0ZXN0aW5nOjpfOwotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBNb2NrVmlydHVhbEF1ZGlvSW5wdXRTdHJlYW0gOiBwdWJsaWMgVmlydHVhbEF1ZGlvSW5wdXRTdHJlYW0gewotIHB1YmxpYzoKLSAgTW9ja1ZpcnR1YWxBdWRpb0lucHV0U3RyZWFtKEF1ZGlvTWFuYWdlckJhc2UqIG1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlcnMgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6TWVzc2FnZUxvb3BQcm94eSogbWVzc2FnZV9sb29wKQotICAgICAgOiBWaXJ0dWFsQXVkaW9JbnB1dFN0cmVhbShtYW5hZ2VyLCBwYXJhbXMsIG1lc3NhZ2VfbG9vcCkge30KLSAgfk1vY2tWaXJ0dWFsQXVkaW9JbnB1dFN0cmVhbSgpIHt9Ci0KLSAgTU9DS19NRVRIT0QyKEFkZE91dHB1dFN0cmVhbSwgdm9pZChWaXJ0dWFsQXVkaW9PdXRwdXRTdHJlYW0qIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIG91dHB1dF9wYXJhbXMpKTsKLSAgTU9DS19NRVRIT0QyKFJlbW92ZU91dHB1dFN0cmVhbSwgdm9pZChWaXJ0dWFsQXVkaW9PdXRwdXRTdHJlYW0qIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIG91dHB1dF9wYXJhbXMpKTsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNb2NrVmlydHVhbEF1ZGlvSW5wdXRTdHJlYW0pOwotfTsKLQotY2xhc3MgTW9ja0F1ZGlvRGV2aWNlTGlzdGVuZXIgOiBwdWJsaWMgQXVkaW9NYW5hZ2VyOjpBdWRpb0RldmljZUxpc3RlbmVyIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EMChPbkRldmljZUNoYW5nZSwgdm9pZCgpKTsKLX07Ci0KLWNsYXNzIFZpcnR1YWxBdWRpb091dHB1dFN0cmVhbVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICB2b2lkIExpc3RlbkFuZENyZWF0ZVZpcnR1YWxPbkF1ZGlvVGhyZWFkKAotICAgICAgQXVkaW9NYW5hZ2VyKiBtYW5hZ2VyLCBBdWRpb01hbmFnZXI6OkF1ZGlvRGV2aWNlTGlzdGVuZXIqIGxpc3RlbmVyKSB7Ci0gICAgbWFuYWdlci0+QWRkT3V0cHV0RGV2aWNlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCi0gICAgQXVkaW9QYXJhbWV0ZXJzIHBhcmFtcygKLSAgICAgICAgQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19WSVJUVUFMLCBDSEFOTkVMX0xBWU9VVF9NT05PLCA4MDAwLCA4LCAxMjgpOwotICAgIEF1ZGlvSW5wdXRTdHJlYW0qIHN0cmVhbSA9IG1hbmFnZXItPk1ha2VBdWRpb0lucHV0U3RyZWFtKHBhcmFtcywgIjEiKTsKLSAgICBzdHJlYW0tPkNsb3NlKCk7Ci0gICAgc2lnbmFsXy5TaWduYWwoKTsKLSAgfQotCi0gIHZvaWQgUmVtb3ZlTGlzdGVuZXJPbkF1ZGlvVGhyZWFkKAotICAgICAgQXVkaW9NYW5hZ2VyKiBtYW5hZ2VyLCBBdWRpb01hbmFnZXI6OkF1ZGlvRGV2aWNlTGlzdGVuZXIqIGxpc3RlbmVyKSB7Ci0gICAgbWFuYWdlci0+UmVtb3ZlT3V0cHV0RGV2aWNlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIHNpZ25hbF8uU2lnbmFsKCk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgVmlydHVhbEF1ZGlvT3V0cHV0U3RyZWFtVGVzdCgpIDogc2lnbmFsXyhmYWxzZSwgZmFsc2UpIHt9Ci0KLSAgYmFzZTo6V2FpdGFibGVFdmVudCBzaWduYWxfOwotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFZpcnR1YWxBdWRpb091dHB1dFN0cmVhbVRlc3QpOwotfTsKLQotVEVTVF9GKFZpcnR1YWxBdWRpb091dHB1dFN0cmVhbVRlc3QsIFN0YXJ0U3RvcFN0YXJ0U3RvcCkgewotICBzY29wZWRfcHRyPEF1ZGlvTWFuYWdlcj4gYXVkaW9fbWFuYWdlcihBdWRpb01hbmFnZXI6OkNyZWF0ZSgpKTsKLQotICBNZXNzYWdlTG9vcCBtZXNzYWdlX2xvb3A7Ci0KLSAgQXVkaW9QYXJhbWV0ZXJzIHBhcmFtcygKLSAgICAgIEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fVklSVFVBTCwgQ0hBTk5FTF9MQVlPVVRfTU9OTywgODAwMCwgOCwgMTI4KTsKLSAgQXVkaW9QYXJhbWV0ZXJzIG91dHB1dF9wYXJhbXMoCi0gICAgICBBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIsIENIQU5ORUxfTEFZT1VUX01PTk8sIDgwMDAsIDgsIDEyOCk7Ci0KLSAgTW9ja1ZpcnR1YWxBdWRpb0lucHV0U3RyZWFtIGlucHV0X3N0cmVhbSgKLSAgICAgIHN0YXRpY19jYXN0PEF1ZGlvTWFuYWdlckJhc2UqPihhdWRpb19tYW5hZ2VyLmdldCgpKSwKLSAgICAgIHBhcmFtcywKLSAgICAgIG1lc3NhZ2VfbG9vcC5tZXNzYWdlX2xvb3BfcHJveHkoKSk7Ci0KLSAgRVhQRUNUX0NBTEwoaW5wdXRfc3RyZWFtLCBBZGRPdXRwdXRTdHJlYW0oXywgXykpLlRpbWVzKDIpOwotICBFWFBFQ1RfQ0FMTChpbnB1dF9zdHJlYW0sIFJlbW92ZU91dHB1dFN0cmVhbShfLCBfKSkuVGltZXMoMik7Ci0KLSAgc2NvcGVkX3B0cjxWaXJ0dWFsQXVkaW9PdXRwdXRTdHJlYW0+IG91dHB1dF9zdHJlYW0oCi0gICAgICBWaXJ0dWFsQXVkaW9PdXRwdXRTdHJlYW06Ok1ha2VTdHJlYW0oCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8QXVkaW9NYW5hZ2VyQmFzZSo+KGF1ZGlvX21hbmFnZXIuZ2V0KCkpLAotICAgICAgICAgIG91dHB1dF9wYXJhbXMsCi0gICAgICAgICAgbWVzc2FnZV9sb29wLm1lc3NhZ2VfbG9vcF9wcm94eSgpLAotICAgICAgICAgICZpbnB1dF9zdHJlYW0pKTsKLQotICBTaW5lV2F2ZUF1ZGlvU291cmNlIHNvdXJjZShDSEFOTkVMX0xBWU9VVF9TVEVSRU8sIDIwMC4wLCAxMjgpOwotICBvdXRwdXRfc3RyZWFtLT5TdGFydCgmc291cmNlKTsKLSAgb3V0cHV0X3N0cmVhbS0+U3RvcCgpOwotICBvdXRwdXRfc3RyZWFtLT5TdGFydCgmc291cmNlKTsKLSAgb3V0cHV0X3N0cmVhbS0+U3RvcCgpOwotICAvLyBDYW4ndCBDbG9zZSgpIGhlcmUgYmVjYXVzZSB3ZSBkaWRuJ3QgY3JlYXRlIHRoaXMgb3V0cHV0IHN0cmVhbSBpcyBub3Qgb3duZWQKLSAgLy8gYnkgdGhlIGF1ZGlvIG1hbmFnZXIuCi19Ci0KLS8vIFRlc3RzIHRoYXQgd2UgZ2V0IG5vdGlmaWNhdGlvbnMgdG8gcmVhdHRhY2ggb3V0cHV0IHN0cmVhbXMgd2hlbiB3ZSBjcmVhdGUgYQotLy8gVmlydHVhbEF1ZGlvSW5wdXRTdHJlYW0uCi1URVNUX0YoVmlydHVhbEF1ZGlvT3V0cHV0U3RyZWFtVGVzdCwgT3V0cHV0U3RyZWFtc05vdGlmaWVkKSB7Ci0gIHNjb3BlZF9wdHI8QXVkaW9NYW5hZ2VyPiBhdWRpb19tYW5hZ2VyKEF1ZGlvTWFuYWdlcjo6Q3JlYXRlKCkpOwotCi0gIE1vY2tBdWRpb0RldmljZUxpc3RlbmVyIG1vY2tfbGlzdGVuZXI7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfbGlzdGVuZXIsIE9uRGV2aWNlQ2hhbmdlKCkpLlRpbWVzKDIpOwotCi0gIGF1ZGlvX21hbmFnZXItPkdldE1lc3NhZ2VMb29wKCktPlBvc3RUYXNrKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKAotICAgICAgICAgICZWaXJ0dWFsQXVkaW9PdXRwdXRTdHJlYW1UZXN0OjpMaXN0ZW5BbmRDcmVhdGVWaXJ0dWFsT25BdWRpb1RocmVhZCwKLSAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLAotICAgICAgICAgIGF1ZGlvX21hbmFnZXIuZ2V0KCksCi0gICAgICAgICAgJm1vY2tfbGlzdGVuZXIpKTsKLQotICBzaWduYWxfLldhaXQoKTsKLQotICBhdWRpb19tYW5hZ2VyLT5HZXRNZXNzYWdlTG9vcCgpLT5Qb3N0VGFzaygKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgKLSAgICAgICAgICAmVmlydHVhbEF1ZGlvT3V0cHV0U3RyZWFtVGVzdDo6UmVtb3ZlTGlzdGVuZXJPbkF1ZGlvVGhyZWFkLAotICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksCi0gICAgICAgICAgYXVkaW9fbWFuYWdlci5nZXQoKSwKLSAgICAgICAgICAmbW9ja19saXN0ZW5lcikpOwotCi0gIHNpZ25hbF8uV2FpdCgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby93aW4vYXVkaW9fZGV2aWNlX2xpc3RlbmVyX3dpbi5jYyBiL3NyYy9tZWRpYS9hdWRpby93aW4vYXVkaW9fZGV2aWNlX2xpc3RlbmVyX3dpbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY2NDQ5OC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vd2luL2F1ZGlvX2RldmljZV9saXN0ZW5lcl93aW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3dpbi9hdWRpb19kZXZpY2VfbGlzdGVuZXJfd2luLmgiCi0KLSNpbmNsdWRlIDxBdWRpb2NsaWVudC5oPgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS9zeXN0ZW1fbW9uaXRvci9zeXN0ZW1fbW9uaXRvci5oIgotI2luY2x1ZGUgImJhc2UvdXRmX3N0cmluZ19jb252ZXJzaW9ucy5oIgotI2luY2x1ZGUgImJhc2Uvd2luL3Njb3BlZF9jb19tZW0uaCIKLSNpbmNsdWRlICJiYXNlL3dpbi93aW5kb3dzX3ZlcnNpb24uaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb191dGlsLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vd2luL2NvcmVfYXVkaW9fdXRpbF93aW4uaCIKLQotdXNpbmcgYmFzZTo6d2luOjpTY29wZWRDb01lbTsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotQXVkaW9EZXZpY2VMaXN0ZW5lcldpbjo6QXVkaW9EZXZpY2VMaXN0ZW5lcldpbihjb25zdCBiYXNlOjpDbG9zdXJlJiBsaXN0ZW5lcl9jYikKLSAgICA6IGxpc3RlbmVyX2NiXyhsaXN0ZW5lcl9jYikgewotICBDSEVDSyhDb3JlQXVkaW9VdGlsOjpJc1N1cHBvcnRlZCgpKTsKLQotICBTY29wZWRDb21QdHI8SU1NRGV2aWNlRW51bWVyYXRvcj4gZGV2aWNlX2VudW1lcmF0b3IoCi0gICAgICBDb3JlQXVkaW9VdGlsOjpDcmVhdGVEZXZpY2VFbnVtZXJhdG9yKCkpOwotICBpZiAoIWRldmljZV9lbnVtZXJhdG9yKQotICAgIHJldHVybjsKLQotICBIUkVTVUxUIGhyID0gZGV2aWNlX2VudW1lcmF0b3ItPlJlZ2lzdGVyRW5kcG9pbnROb3RpZmljYXRpb25DYWxsYmFjayh0aGlzKTsKLSAgaWYgKEZBSUxFRChocikpIHsKLSAgICBETE9HKEVSUk9SKSAgPDwgIlJlZ2lzdGVyRW5kcG9pbnROb3RpZmljYXRpb25DYWxsYmFjayBmYWlsZWQ6ICIKLSAgICAgICAgICAgICAgICAgPDwgc3RkOjpoZXggPDwgaHI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZGV2aWNlX2VudW1lcmF0b3JfID0gZGV2aWNlX2VudW1lcmF0b3I7Ci0KLSAgU2NvcGVkQ29tUHRyPElNTURldmljZT4gZGV2aWNlID0KLSAgICAgIENvcmVBdWRpb1V0aWw6OkNyZWF0ZURlZmF1bHREZXZpY2UoZVJlbmRlciwgZUNvbnNvbGUpOwotICBpZiAoIWRldmljZSkgewotICAgIC8vIE1vc3QgcHJvYmFibGUgcmVhc29uIGZvciBlbmRpbmcgdXAgaGVyZSBpcyB0aGF0IGFsbCBhdWRpbyBkZXZpY2VzIGFyZQotICAgIC8vIGRpc2FibGVkIG9yIHVucGx1Z2dlZC4KLSAgICBEVkxPRygxKSAgPDwgIkNvcmVBdWRpb1V0aWw6OkNyZWF0ZURlZmF1bHREZXZpY2UgZmFpbGVkLiBObyBkZXZpY2U/IjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBBdWRpb0RldmljZU5hbWUgZGV2aWNlX25hbWU7Ci0gIGhyID0gQ29yZUF1ZGlvVXRpbDo6R2V0RGV2aWNlTmFtZShkZXZpY2UsICZkZXZpY2VfbmFtZSk7Ci0gIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgRFZMT0coMSkgIDw8ICJGYWlsZWQgdG8gcmV0cmlldmUgdGhlIGRldmljZSBpZDogIiA8PCBzdGQ6OmhleCA8PCBocjsKLSAgICByZXR1cm47Ci0gIH0KLSAgZGVmYXVsdF9yZW5kZXJfZGV2aWNlX2lkXyA9IGRldmljZV9uYW1lLnVuaXF1ZV9pZDsKLX0KLQotQXVkaW9EZXZpY2VMaXN0ZW5lcldpbjo6fkF1ZGlvRGV2aWNlTGlzdGVuZXJXaW4oKSB7Ci0gIERDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLSAgaWYgKGRldmljZV9lbnVtZXJhdG9yXykgewotICAgIEhSRVNVTFQgaHIgPQotICAgICAgICBkZXZpY2VfZW51bWVyYXRvcl8tPlVucmVnaXN0ZXJFbmRwb2ludE5vdGlmaWNhdGlvbkNhbGxiYWNrKHRoaXMpOwotICAgIERMT0dfSUYoRVJST1IsIEZBSUxFRChocikpIDw8ICJVbnJlZ2lzdGVyRW5kcG9pbnROb3RpZmljYXRpb25DYWxsYmFjaygpICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiZmFpbGVkOiAiIDw8IHN0ZDo6aGV4IDw8IGhyOwotICB9Ci19Ci0KLVNURE1FVEhPRElNUF8oVUxPTkcpIEF1ZGlvRGV2aWNlTGlzdGVuZXJXaW46OkFkZFJlZigpIHsKLSAgcmV0dXJuIDE7Ci19Ci0KLVNURE1FVEhPRElNUF8oVUxPTkcpIEF1ZGlvRGV2aWNlTGlzdGVuZXJXaW46OlJlbGVhc2UoKSB7Ci0gIHJldHVybiAxOwotfQotCi1TVERNRVRIT0RJTVAgQXVkaW9EZXZpY2VMaXN0ZW5lcldpbjo6UXVlcnlJbnRlcmZhY2UoUkVGSUlEIGlpZCwgdm9pZCoqIG9iamVjdCkgewotICBpZiAoaWlkID09IElJRF9JVW5rbm93biB8fCBpaWQgPT0gX191dWlkb2YoSU1NTm90aWZpY2F0aW9uQ2xpZW50KSkgewotICAgICpvYmplY3QgPSBzdGF0aWNfY2FzdDxJTU1Ob3RpZmljYXRpb25DbGllbnQqPih0aGlzKTsKLSAgICByZXR1cm4gU19PSzsKLSAgfQotCi0gICpvYmplY3QgPSBOVUxMOwotICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKLX0KLQotU1RETUVUSE9ESU1QIEF1ZGlvRGV2aWNlTGlzdGVuZXJXaW46Ok9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoCi0gICAgTFBDV1NUUiBkZXZpY2VfaWQsIGNvbnN0IFBST1BFUlRZS0VZIGtleSkgewotICAvLyBUT0RPKGRhbGVjdXJ0aXMpOiBXZSBuZWVkIHRvIGhhbmRsZSBjaGFuZ2VzIGZvciB0aGUgY3VycmVudCBkZWZhdWx0IGRldmljZQotICAvLyBoZXJlLiAgSXQncyB0cmlja3kgYmVjYXVzZSB0aGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG1hbnkgKDIwKykgdGltZXMgZm9yCi0gIC8vIGEgc2luZ2xlIGNoYW5nZSBsaWtlIHNhbXBsZSByYXRlLiAgaHR0cDovL2NyYnVnLmNvbS8xNTMwNTYKLSAgcmV0dXJuIFNfT0s7Ci19Ci0KLVNURE1FVEhPRElNUCBBdWRpb0RldmljZUxpc3RlbmVyV2luOjpPbkRldmljZUFkZGVkKExQQ1dTVFIgZGV2aWNlX2lkKSB7Ci0gIC8vIFdlIGRvbid0IGNhcmUgd2hlbiBkZXZpY2VzIGFyZSBhZGRlZC4KLSAgcmV0dXJuIFNfT0s7Ci19Ci0KLVNURE1FVEhPRElNUCBBdWRpb0RldmljZUxpc3RlbmVyV2luOjpPbkRldmljZVJlbW92ZWQoTFBDV1NUUiBkZXZpY2VfaWQpIHsKLSAgLy8gV2UgZG9uJ3QgY2FyZSB3aGVuIGRldmljZXMgYXJlIHJlbW92ZWQuCi0gIHJldHVybiBTX09LOwotfQotCi1TVERNRVRIT0RJTVAgQXVkaW9EZXZpY2VMaXN0ZW5lcldpbjo6T25EZXZpY2VTdGF0ZUNoYW5nZWQoTFBDV1NUUiBkZXZpY2VfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgbmV3X3N0YXRlKSB7Ci0gIGlmIChuZXdfc3RhdGUgIT0gREVWSUNFX1NUQVRFX0FDVElWRSAmJiBuZXdfc3RhdGUgIT0gREVWSUNFX1NUQVRFX05PVFBSRVNFTlQpCi0gICAgcmV0dXJuIFNfT0s7Ci0KLSAgYmFzZTo6U3lzdGVtTW9uaXRvciogbW9uaXRvciA9IGJhc2U6OlN5c3RlbU1vbml0b3I6OkdldCgpOwotICBpZiAobW9uaXRvcikKLSAgICBtb25pdG9yLT5Qcm9jZXNzRGV2aWNlc0NoYW5nZWQoYmFzZTo6U3lzdGVtTW9uaXRvcjo6REVWVFlQRV9BVURJT19DQVBUVVJFKTsKLQotICByZXR1cm4gU19PSzsKLX0KLQotU1RETUVUSE9ESU1QIEF1ZGlvRGV2aWNlTGlzdGVuZXJXaW46Ok9uRGVmYXVsdERldmljZUNoYW5nZWQoCi0gICAgRURhdGFGbG93IGZsb3csIEVSb2xlIHJvbGUsIExQQ1dTVFIgbmV3X2RlZmF1bHRfZGV2aWNlX2lkKSB7Ci0gIC8vIE9ubHkgbGlzdGVuIGZvciBvdXRwdXQgZGV2aWNlIGNoYW5nZXMgcmlnaHQgbm93Li4uCi0gIGlmIChmbG93ICE9IGVDb25zb2xlICYmIHJvbGUgIT0gZVJlbmRlcikKLSAgICByZXR1cm4gU19PSzsKLQotICAvLyBJZiBubyBkZXZpY2UgaXMgbm93IGF2YWlsYWJsZSwgfG5ld19kZWZhdWx0X2RldmljZV9pZHwgd2lsbCBiZSBOVUxMLgotICBzdGQ6OnN0cmluZyBuZXdfZGV2aWNlX2lkID0gIiI7Ci0gIGlmIChuZXdfZGVmYXVsdF9kZXZpY2VfaWQpCi0gICAgbmV3X2RldmljZV9pZCA9IFdpZGVUb1VURjgobmV3X2RlZmF1bHRfZGV2aWNlX2lkKTsKLQotICAvLyBPbmx5IGZpcmUgYSBzdGF0ZSBjaGFuZ2UgZXZlbnQgaWYgdGhlIGRldmljZSBoYXMgYWN0dWFsbHkgY2hhbmdlZC4KLSAgLy8gVE9ETyhkYWxlY3VydGlzKTogVGhpcyBzdGlsbCBzZWVtcyB0byBmaXJlIGFuIGV4dHJhIGV2ZW50IG9uIG15IG1hY2hpbmUgZm9yCi0gIC8vIGFuIHVucGx1ZyBldmVudCAocHJvYmFibHkgb3RoZXJzIHRvbyk7IGUuZy4sIHdlIGdldCB0d28gdHJhbnNpdGlvbnMgdG8gYQotICAvLyBuZXcgZGVmYXVsdCBkZXZpY2UgaWQuCi0gIGlmIChuZXdfZGV2aWNlX2lkLmNvbXBhcmUoZGVmYXVsdF9yZW5kZXJfZGV2aWNlX2lkXykgPT0gMCkKLSAgICByZXR1cm4gU19PSzsKLQotICBkZWZhdWx0X3JlbmRlcl9kZXZpY2VfaWRfID0gbmV3X2RldmljZV9pZDsKLSAgbGlzdGVuZXJfY2JfLlJ1bigpOwotCi0gIHJldHVybiBTX09LOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby93aW4vYXVkaW9fZGV2aWNlX2xpc3RlbmVyX3dpbi5oIGIvc3JjL21lZGlhL2F1ZGlvL3dpbi9hdWRpb19kZXZpY2VfbGlzdGVuZXJfd2luLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMzEyNTEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL3dpbi9hdWRpb19kZXZpY2VfbGlzdGVuZXJfd2luLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0FVRElPX1dJTl9BVURJT19ERVZJQ0VfTElTVEVORVJfV0lOX0hfCi0jZGVmaW5lIE1FRElBX0FVRElPX1dJTl9BVURJT19ERVZJQ0VfTElTVEVORVJfV0lOX0hfCi0KLSNpbmNsdWRlIDxNTURldmljZUFQSS5oPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImJhc2Uvd2luL3Njb3BlZF9jb21wdHIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotCi11c2luZyBiYXNlOjp3aW46OlNjb3BlZENvbVB0cjsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gSU1NTm90aWZpY2F0aW9uQ2xpZW50IGltcGxlbWVudGF0aW9uIGZvciBsaXN0ZW5pbmcgZm9yIGRlZmF1bHQgZGV2aWNlIGNoYW5nZXMKLS8vIGFuZCBmb3J3YXJkaW5nIHRvIEF1ZGlvTWFuYWdlcldpbiBzbyBpdCBjYW4gbm90aWZ5IGRvd25zdHJlYW0gY2xpZW50cy4gIE9ubHkKLS8vIG91dHB1dCAoZVJlbmRlcikgZGV2aWNlIGNoYW5nZXMgYXJlIHN1cHBvcnRlZCBjdXJyZW50bHkuICBDb3JlIEF1ZGlvIHN1cHBvcnQKLS8vIGlzIHJlcXVpcmVkIHRvIGNvbnN0cnVjdCB0aGlzIG9iamVjdC4gIE11c3QgYmUgY29uc3RydWN0ZWQgYW5kIGRlc3RydWN0ZWQgb24KLS8vIGEgc2luZ2xlIENPTSBpbml0aWFsaXplZCB0aHJlYWQuCi0vLyBUT0RPKGRhbGVjdXJ0aXMsIGhlbnJpa2EpOiBTdXBwb3J0IGlucHV0IGRldmljZSBjaGFuZ2VzLgotY2xhc3MgTUVESUFfRVhQT1JUIEF1ZGlvRGV2aWNlTGlzdGVuZXJXaW4gOiBwdWJsaWMgSU1NTm90aWZpY2F0aW9uQ2xpZW50IHsKLSBwdWJsaWM6Ci0gIC8vIFRoZSBsaXN0ZW5lciBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBmcm9tIGEgc3lzdGVtIGxldmVsIG11bHRpbWVkaWEgdGhyZWFkLAotICAvLyB0aHVzIHRoZSBjYWxsZWUgbXVzdCBiZSB0aHJlYWQgc2FmZS4gIHxsaXN0ZW5lcnwgaXMgYSBwZXJtYW5lbnQgY2FsbGJhY2sKLSAgLy8gYW5kIG11c3Qgb3V0bGl2ZSBBdWRpb0RldmljZUxpc3RlbmVyV2luLgotICBleHBsaWNpdCBBdWRpb0RldmljZUxpc3RlbmVyV2luKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGxpc3RlbmVyX2NiKTsKLSAgdmlydHVhbCB+QXVkaW9EZXZpY2VMaXN0ZW5lcldpbigpOwotCi0gcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIEF1ZGlvRGV2aWNlTGlzdGVuZXJXaW5UZXN0OwotCi0gIC8vIElNTU5vdGlmaWNhdGlvbkNsaWVudCBpbXBsZW1lbnRhdGlvbi4KLSAgU1RETUVUSE9EXyhVTE9ORywgQWRkUmVmKSgpOwotICBTVERNRVRIT0RfKFVMT05HLCBSZWxlYXNlKSgpOwotICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpKFJFRklJRCBpaWQsIHZvaWQqKiBvYmplY3QpOwotICBTVERNRVRIT0QoT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZCkoTFBDV1NUUiBkZXZpY2VfaWQsIGNvbnN0IFBST1BFUlRZS0VZIGtleSk7Ci0gIFNURE1FVEhPRChPbkRldmljZUFkZGVkKShMUENXU1RSIGRldmljZV9pZCk7Ci0gIFNURE1FVEhPRChPbkRldmljZVJlbW92ZWQpKExQQ1dTVFIgZGV2aWNlX2lkKTsKLSAgU1RETUVUSE9EKE9uRGV2aWNlU3RhdGVDaGFuZ2VkKShMUENXU1RSIGRldmljZV9pZCwgRFdPUkQgbmV3X3N0YXRlKTsKLSAgU1RETUVUSE9EKE9uRGVmYXVsdERldmljZUNoYW5nZWQpKEVEYXRhRmxvdyBmbG93LCBFUm9sZSByb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBuZXdfZGVmYXVsdF9kZXZpY2VfaWQpOwotCi0gIGJhc2U6OkNsb3N1cmUgbGlzdGVuZXJfY2JfOwotICBTY29wZWRDb21QdHI8SU1NRGV2aWNlRW51bWVyYXRvcj4gZGV2aWNlX2VudW1lcmF0b3JfOwotICBzdGQ6OnN0cmluZyBkZWZhdWx0X3JlbmRlcl9kZXZpY2VfaWRfOwotCi0gIC8vIEF1ZGlvRGV2aWNlTGlzdGVuZXJXaW4gbXVzdCBiZSBjb25zdHJ1Y3RlZCBhbmQgZGVzdHJ1Y3RlZCBvbiBvbmUgdGhyZWFkLgotICBiYXNlOjpUaHJlYWRDaGVja2VyIHRocmVhZF9jaGVja2VyXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQXVkaW9EZXZpY2VMaXN0ZW5lcldpbik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9BVURJT19XSU5fQVVESU9fREVWSUNFX0xJU1RFTkVSX1dJTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL3dpbi9hdWRpb19kZXZpY2VfbGlzdGVuZXJfd2luX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2F1ZGlvL3dpbi9hdWRpb19kZXZpY2VfbGlzdGVuZXJfd2luX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODlmOGE2Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby93aW4vYXVkaW9fZGV2aWNlX2xpc3RlbmVyX3dpbl91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiYmFzZS9iaW5kX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAiYmFzZS93aW4vc2NvcGVkX2NvbV9pbml0aWFsaXplci5oIgotI2luY2x1ZGUgImJhc2UvdXRmX3N0cmluZ19jb252ZXJzaW9ucy5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX21hbmFnZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby93aW4vYXVkaW9fZGV2aWNlX2xpc3RlbmVyX3dpbi5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3dpbi9jb3JlX2F1ZGlvX3V0aWxfd2luLmgiCi0jaW5jbHVkZSAidGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0KLXVzaW5nIGJhc2U6Ondpbjo6U2NvcGVkQ09NSW5pdGlhbGl6ZXI7Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBrTm9EZXZpY2UgPSAiIjsKLXN0YXRpYyBjb25zdCBjaGFyKiBrRmlyc3RUZXN0RGV2aWNlID0gInRlc3RfZGV2aWNlXzAiOwotc3RhdGljIGNvbnN0IGNoYXIqIGtTZWNvbmRUZXN0RGV2aWNlID0gInRlc3RfZGV2aWNlXzEiOwotCi1jbGFzcyBBdWRpb0RldmljZUxpc3RlbmVyV2luVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gIEF1ZGlvRGV2aWNlTGlzdGVuZXJXaW5UZXN0KCkKLSAgICAgIDogY29tX2luaXRfKFNjb3BlZENPTUluaXRpYWxpemVyOjprTVRBKSB7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgaWYgKCFDb3JlQXVkaW9VdGlsOjpJc1N1cHBvcnRlZCgpKQotICAgICAgcmV0dXJuOwotCi0gICAgb3V0cHV0X2RldmljZV9saXN0ZW5lcl8ucmVzZXQobmV3IEF1ZGlvRGV2aWNlTGlzdGVuZXJXaW4oYmFzZTo6QmluZCgKLSAgICAgICAgJkF1ZGlvRGV2aWNlTGlzdGVuZXJXaW5UZXN0OjpPbkRldmljZUNoYW5nZSwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpKTsKLSAgfQotCi0gIC8vIFNpbXVsYXRlIGEgZGV2aWNlIGNoYW5nZSB3aGVyZSBubyBvdXRwdXQgZGV2aWNlcyBhcmUgYXZhaWxhYmxlLgotICBib29sIFNpbXVsYXRlTnVsbERlZmF1bHRPdXRwdXREZXZpY2VDaGFuZ2UoKSB7Ci0gICAgcmV0dXJuIG91dHB1dF9kZXZpY2VfbGlzdGVuZXJfLT5PbkRlZmF1bHREZXZpY2VDaGFuZ2VkKAotICAgICAgICBzdGF0aWNfY2FzdDxFRGF0YUZsb3c+KGVDb25zb2xlKSwgc3RhdGljX2Nhc3Q8RVJvbGU+KGVSZW5kZXIpLAotICAgICAgICBOVUxMKSA9PSBTX09LOwotICB9Ci0KLSAgYm9vbCBTaW11bGF0ZURlZmF1bHRPdXRwdXREZXZpY2VDaGFuZ2UoY29uc3QgY2hhciogbmV3X2RldmljZV9pZCkgewotICAgIHJldHVybiBvdXRwdXRfZGV2aWNlX2xpc3RlbmVyXy0+T25EZWZhdWx0RGV2aWNlQ2hhbmdlZCgKLSAgICAgICAgc3RhdGljX2Nhc3Q8RURhdGFGbG93PihlQ29uc29sZSksIHN0YXRpY19jYXN0PEVSb2xlPihlUmVuZGVyKSwKLSAgICAgICAgQVNDSUlUb1dpZGUobmV3X2RldmljZV9pZCkuY19zdHIoKSkgPT0gU19PSzsKLSAgfQotCi0gIHZvaWQgU2V0T3V0cHV0RGV2aWNlSWQoc3RkOjpzdHJpbmcgbmV3X2RldmljZV9pZCkgewotICAgIG91dHB1dF9kZXZpY2VfbGlzdGVuZXJfLT5kZWZhdWx0X3JlbmRlcl9kZXZpY2VfaWRfID0gbmV3X2RldmljZV9pZDsKLSAgfQotCi0gIE1PQ0tfTUVUSE9EMChPbkRldmljZUNoYW5nZSwgdm9pZCgpKTsKLQotIHByaXZhdGU6Ci0gIFNjb3BlZENPTUluaXRpYWxpemVyIGNvbV9pbml0XzsKLSAgc2NvcGVkX3B0cjxBdWRpb0RldmljZUxpc3RlbmVyV2luPiBvdXRwdXRfZGV2aWNlX2xpc3RlbmVyXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQXVkaW9EZXZpY2VMaXN0ZW5lcldpblRlc3QpOwotfTsKLQotLy8gU2ltdWxhdGUgYSBkZXZpY2UgY2hhbmdlIGV2ZW50cyBhbmQgZW5zdXJlIHdlIGdldCB0aGUgcmlnaHQgY2FsbGJhY2tzLgotVEVTVF9GKEF1ZGlvRGV2aWNlTGlzdGVuZXJXaW5UZXN0LCBPdXRwdXREZXZpY2VDaGFuZ2UpIHsKLSAgaWYgKCFDb3JlQXVkaW9VdGlsOjpJc1N1cHBvcnRlZCgpKQotICAgIHJldHVybjsKLQotICBTZXRPdXRwdXREZXZpY2VJZChrTm9EZXZpY2UpOwotICBFWFBFQ1RfQ0FMTCgqdGhpcywgT25EZXZpY2VDaGFuZ2UoKSkuVGltZXMoMSk7Ci0gIEFTU0VSVF9UUlVFKFNpbXVsYXRlRGVmYXVsdE91dHB1dERldmljZUNoYW5nZShrRmlyc3RUZXN0RGV2aWNlKSk7Ci0KLSAgdGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXIodGhpcyk7Ci0gIEVYUEVDVF9DQUxMKCp0aGlzLCBPbkRldmljZUNoYW5nZSgpKS5UaW1lcygxKTsKLSAgQVNTRVJUX1RSVUUoU2ltdWxhdGVEZWZhdWx0T3V0cHV0RGV2aWNlQ2hhbmdlKGtTZWNvbmRUZXN0RGV2aWNlKSk7Ci0KLSAgLy8gVGhlIHNlY29uZCBkZXZpY2UgZXZlbnQgc2hvdWxkIGJlIGlnbm9yZWQgc2luY2UgdGhlIGRldmljZSBpZCBoYXMgbm90Ci0gIC8vIGNoYW5nZWQuCi0gIEFTU0VSVF9UUlVFKFNpbXVsYXRlRGVmYXVsdE91dHB1dERldmljZUNoYW5nZShrU2Vjb25kVGVzdERldmljZSkpOwotfQotCi0vLyBFbnN1cmUgdGhhdCBudWxsIG91dHB1dCBkZXZpY2UgY2hhbmdlcyBkb24ndCBjcmFzaC4gIFNpbXVsYXRlcyB0aGUgc2l0dWF0aW9uCi0vLyB3aGVyZSB3ZSBoYXZlIG5vIG91dHB1dCBkZXZpY2VzLgotVEVTVF9GKEF1ZGlvRGV2aWNlTGlzdGVuZXJXaW5UZXN0LCBOdWxsT3V0cHV0RGV2aWNlQ2hhbmdlKSB7Ci0gIGlmICghQ29yZUF1ZGlvVXRpbDo6SXNTdXBwb3J0ZWQoKSkKLSAgICByZXR1cm47Ci0KLSAgU2V0T3V0cHV0RGV2aWNlSWQoa05vRGV2aWNlKTsKLSAgRVhQRUNUX0NBTEwoKnRoaXMsIE9uRGV2aWNlQ2hhbmdlKCkpLlRpbWVzKDApOwotICBBU1NFUlRfVFJVRShTaW11bGF0ZU51bGxEZWZhdWx0T3V0cHV0RGV2aWNlQ2hhbmdlKCkpOwotCi0gIHRlc3Rpbmc6Ok1vY2s6OlZlcmlmeUFuZENsZWFyKHRoaXMpOwotICBFWFBFQ1RfQ0FMTCgqdGhpcywgT25EZXZpY2VDaGFuZ2UoKSkuVGltZXMoMSk7Ci0gIEFTU0VSVF9UUlVFKFNpbXVsYXRlRGVmYXVsdE91dHB1dERldmljZUNoYW5nZShrRmlyc3RUZXN0RGV2aWNlKSk7Ci0KLSAgdGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXIodGhpcyk7Ci0gIEVYUEVDVF9DQUxMKCp0aGlzLCBPbkRldmljZUNoYW5nZSgpKS5UaW1lcygxKTsKLSAgQVNTRVJUX1RSVUUoU2ltdWxhdGVOdWxsRGVmYXVsdE91dHB1dERldmljZUNoYW5nZSgpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vd2luL2F1ZGlvX2xvd19sYXRlbmN5X2lucHV0X3dpbi5jYyBiL3NyYy9tZWRpYS9hdWRpby93aW4vYXVkaW9fbG93X2xhdGVuY3lfaW5wdXRfd2luLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTU0NjRmLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby93aW4vYXVkaW9fbG93X2xhdGVuY3lfaW5wdXRfd2luLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjM1ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby93aW4vYXVkaW9fbG93X2xhdGVuY3lfaW5wdXRfd2luLmgiCi0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAiYmFzZS91dGZfc3RyaW5nX2NvbnZlcnNpb25zLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fdXRpbC5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3dpbi9hdWRpb19tYW5hZ2VyX3dpbi5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3dpbi9hdnJ0X3dyYXBwZXJfd2luLmgiCi0KLXVzaW5nIGJhc2U6Ondpbjo6U2NvcGVkQ29tUHRyOwotdXNpbmcgYmFzZTo6d2luOjpTY29wZWRDT01Jbml0aWFsaXplcjsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotV0FTQVBJQXVkaW9JbnB1dFN0cmVhbTo6V0FTQVBJQXVkaW9JbnB1dFN0cmVhbSgKLSAgICBBdWRpb01hbmFnZXJXaW4qIG1hbmFnZXIsIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfaWQpCi0gICAgOiBtYW5hZ2VyXyhtYW5hZ2VyKSwKLSAgICAgIGNhcHR1cmVfdGhyZWFkXyhOVUxMKSwKLSAgICAgIG9wZW5lZF8oZmFsc2UpLAotICAgICAgc3RhcnRlZF8oZmFsc2UpLAotICAgICAgZW5kcG9pbnRfYnVmZmVyX3NpemVfZnJhbWVzXygwKSwKLSAgICAgIGRldmljZV9pZF8oZGV2aWNlX2lkKSwKLSAgICAgIHNpbmtfKE5VTEwpIHsKLSAgRENIRUNLKG1hbmFnZXJfKTsKLQotICAvLyBMb2FkIHRoZSBBdnJ0IERMTCBpZiBub3QgYWxyZWFkeSBsb2FkZWQuIFJlcXVpcmVkIHRvIHN1cHBvcnQgTU1DU1MuCi0gIGJvb2wgYXZydF9pbml0ID0gYXZydDo6SW5pdGlhbGl6ZSgpOwotICBEQ0hFQ0soYXZydF9pbml0KSA8PCAiRmFpbGVkIHRvIGxvYWQgdGhlIEF2cnQuZGxsIjsKLQotICAvLyBTZXQgdXAgdGhlIGRlc2lyZWQgY2FwdHVyZSBmb3JtYXQgc3BlY2lmaWVkIGJ5IHRoZSBjbGllbnQuCi0gIGZvcm1hdF8ublNhbXBsZXNQZXJTZWMgPSBwYXJhbXMuc2FtcGxlX3JhdGUoKTsKLSAgZm9ybWF0Xy53Rm9ybWF0VGFnID0gV0FWRV9GT1JNQVRfUENNOwotICBmb3JtYXRfLndCaXRzUGVyU2FtcGxlID0gcGFyYW1zLmJpdHNfcGVyX3NhbXBsZSgpOwotICBmb3JtYXRfLm5DaGFubmVscyA9IHBhcmFtcy5jaGFubmVscygpOwotICBmb3JtYXRfLm5CbG9ja0FsaWduID0gKGZvcm1hdF8ud0JpdHNQZXJTYW1wbGUgLyA4KSAqIGZvcm1hdF8ubkNoYW5uZWxzOwotICBmb3JtYXRfLm5BdmdCeXRlc1BlclNlYyA9IGZvcm1hdF8ublNhbXBsZXNQZXJTZWMgKiBmb3JtYXRfLm5CbG9ja0FsaWduOwotICBmb3JtYXRfLmNiU2l6ZSA9IDA7Ci0KLSAgLy8gU2l6ZSBpbiBieXRlcyBvZiBlYWNoIGF1ZGlvIGZyYW1lLgotICBmcmFtZV9zaXplXyA9IGZvcm1hdF8ubkJsb2NrQWxpZ247Ci0gIC8vIFN0b3JlIHNpemUgb2YgYXVkaW8gcGFja2V0cyB3aGljaCB3ZSBleHBlY3QgdG8gZ2V0IGZyb20gdGhlIGF1ZGlvCi0gIC8vIGVuZHBvaW50IGRldmljZSBpbiBlYWNoIGNhcHR1cmUgZXZlbnQuCi0gIHBhY2tldF9zaXplX2ZyYW1lc18gPSBwYXJhbXMuR2V0Qnl0ZXNQZXJCdWZmZXIoKSAvIGZvcm1hdF8ubkJsb2NrQWxpZ247Ci0gIHBhY2tldF9zaXplX2J5dGVzXyA9IHBhcmFtcy5HZXRCeXRlc1BlckJ1ZmZlcigpOwotICBEVkxPRygxKSA8PCAiTnVtYmVyIG9mIGJ5dGVzIHBlciBhdWRpbyBmcmFtZSAgOiAiIDw8IGZyYW1lX3NpemVfOwotICBEVkxPRygxKSA8PCAiTnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyBwZXIgcGFja2V0OiAiIDw8IHBhY2tldF9zaXplX2ZyYW1lc187Ci0KLSAgLy8gQWxsIGV2ZW50cyBhcmUgYXV0by1yZXNldCBldmVudHMgYW5kIG5vbi1zaWduYWxlZCBpbml0aWFsbHkuCi0KLSAgLy8gQ3JlYXRlIHRoZSBldmVudCB3aGljaCB0aGUgYXVkaW8gZW5naW5lIHdpbGwgc2lnbmFsIGVhY2ggdGltZQotICAvLyBhIGJ1ZmZlciBiZWNvbWVzIHJlYWR5IHRvIGJlIHByb2Nlc3NlZCBieSB0aGUgY2xpZW50LgotICBhdWRpb19zYW1wbGVzX3JlYWR5X2V2ZW50Xy5TZXQoQ3JlYXRlRXZlbnQoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKSk7Ci0gIERDSEVDSyhhdWRpb19zYW1wbGVzX3JlYWR5X2V2ZW50Xy5Jc1ZhbGlkKCkpOwotCi0gIC8vIENyZWF0ZSB0aGUgZXZlbnQgd2hpY2ggd2lsbCBiZSBzZXQgaW4gU3RvcCgpIHdoZW4gY2FwdHVyaW5nIHNoYWxsIHN0b3AuCi0gIHN0b3BfY2FwdHVyZV9ldmVudF8uU2V0KENyZWF0ZUV2ZW50KE5VTEwsIEZBTFNFLCBGQUxTRSwgTlVMTCkpOwotICBEQ0hFQ0soc3RvcF9jYXB0dXJlX2V2ZW50Xy5Jc1ZhbGlkKCkpOwotCi0gIG1zX3RvX2ZyYW1lX2NvdW50XyA9IHN0YXRpY19jYXN0PGRvdWJsZT4ocGFyYW1zLnNhbXBsZV9yYXRlKCkpIC8gMTAwMC4wOwotCi0gIExBUkdFX0lOVEVHRVIgcGVyZm9ybWFuY2VfZnJlcXVlbmN5OwotICBpZiAoUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgmcGVyZm9ybWFuY2VfZnJlcXVlbmN5KSkgewotICAgIHBlcmZfY291bnRfdG9fMTAwbnNfdW5pdHNfID0KLSAgICAgICAgKDEwMDAwMDAwLjAgLyBzdGF0aWNfY2FzdDxkb3VibGU+KHBlcmZvcm1hbmNlX2ZyZXF1ZW5jeS5RdWFkUGFydCkpOwotICB9IGVsc2UgewotICAgIExPRyhFUlJPUikgPDwgICJIaWdoLXJlc29sdXRpb24gcGVyZm9ybWFuY2UgY291bnRlcnMgYXJlIG5vdCBzdXBwb3J0ZWQuIjsKLSAgICBwZXJmX2NvdW50X3RvXzEwMG5zX3VuaXRzXyA9IDAuMDsKLSAgfQotfQotCi1XQVNBUElBdWRpb0lucHV0U3RyZWFtOjp+V0FTQVBJQXVkaW9JbnB1dFN0cmVhbSgpIHt9Ci0KLWJvb2wgV0FTQVBJQXVkaW9JbnB1dFN0cmVhbTo6T3BlbigpIHsKLSAgRENIRUNLKENhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIC8vIFZlcmlmeSB0aGF0IHdlIGFyZSBub3QgYWxyZWFkeSBvcGVuZWQuCi0gIGlmIChvcGVuZWRfKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvLyBPYnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIElNTURldmljZSBpbnRlcmZhY2Ugb2YgdGhlIGNhcHR1cmluZwotICAvLyBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHVuaXF1ZSBpZGVudGlmaWVyIG9yIHJvbGUgd2hpY2ggd2FzCi0gIC8vIHNldCBhdCBjb25zdHJ1Y3Rpb24uCi0gIEhSRVNVTFQgaHIgPSBTZXRDYXB0dXJlRGV2aWNlKCk7Ci0gIGlmIChGQUlMRUQoaHIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvLyBPYnRhaW4gYW4gSUF1ZGlvQ2xpZW50IGludGVyZmFjZSB3aGljaCBlbmFibGVzIHVzIHRvIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZQotICAvLyBhbiBhdWRpbyBzdHJlYW0gYmV0d2VlbiBhbiBhdWRpbyBhcHBsaWNhdGlvbiBhbmQgdGhlIGF1ZGlvIGVuZ2luZS4KLSAgaHIgPSBBY3RpdmF0ZUNhcHR1cmVEZXZpY2UoKTsKLSAgaWYgKEZBSUxFRChocikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8vIFJldHJpZXZlIHRoZSBzdHJlYW0gZm9ybWF0IHdoaWNoIHRoZSBhdWRpbyBlbmdpbmUgdXNlcyBmb3IgaXRzIGludGVybmFsCi0gIC8vIHByb2Nlc3NpbmcvbWl4aW5nIG9mIHNoYXJlZC1tb2RlIHN0cmVhbXMuIFRoaXMgZnVuY3Rpb24gY2FsbCBpcyBmb3IKLSAgLy8gZGlhZ25vc3RpYyBwdXJwb3NlcyBvbmx5IGFuZCBvbmx5IGluIGRlYnVnIG1vZGUuCi0jaWZuZGVmIE5ERUJVRwotICBociA9IEdldEF1ZGlvRW5naW5lU3RyZWFtRm9ybWF0KCk7Ci0jZW5kaWYKLQotICAvLyBWZXJpZnkgdGhhdCB0aGUgc2VsZWN0ZWQgYXVkaW8gZW5kcG9pbnQgc3VwcG9ydHMgdGhlIHNwZWNpZmllZCBmb3JtYXQKLSAgLy8gc2V0IGR1cmluZyBjb25zdHJ1Y3Rpb24uCi0gIGlmICghRGVzaXJlZEZvcm1hdElzU3VwcG9ydGVkKCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBJbml0aWFsaXplIHRoZSBhdWRpbyBzdHJlYW0gYmV0d2VlbiB0aGUgY2xpZW50IGFuZCB0aGUgZGV2aWNlIHVzaW5nCi0gIC8vIHNoYXJlZCBtb2RlIGFuZCBhIGxvd2VzdCBwb3NzaWJsZSBnbGl0Y2gtZnJlZSBsYXRlbmN5LgotICBociA9IEluaXRpYWxpemVBdWRpb0VuZ2luZSgpOwotCi0gIG9wZW5lZF8gPSBTVUNDRUVERUQoaHIpOwotICByZXR1cm4gb3BlbmVkXzsKLX0KLQotdm9pZCBXQVNBUElBdWRpb0lucHV0U3RyZWFtOjpTdGFydChBdWRpb0lucHV0Q2FsbGJhY2sqIGNhbGxiYWNrKSB7Ci0gIERDSEVDSyhDYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBEQ0hFQ0soY2FsbGJhY2spOwotICBETE9HX0lGKEVSUk9SLCAhb3BlbmVkXykgPDwgIk9wZW4oKSBoYXMgbm90IGJlZW4gY2FsbGVkIHN1Y2Nlc3NmdWxseSI7Ci0gIGlmICghb3BlbmVkXykKLSAgICByZXR1cm47Ci0KLSAgaWYgKHN0YXJ0ZWRfKQotICAgIHJldHVybjsKLQotICBzaW5rXyA9IGNhbGxiYWNrOwotCi0gIC8vIENyZWF0ZSBhbmQgc3RhcnQgdGhlIHRocmVhZCB0aGF0IHdpbGwgZHJpdmUgdGhlIGNhcHR1cmluZyBieSB3YWl0aW5nIGZvcgotICAvLyBjYXB0dXJlIGV2ZW50cy4KLSAgY2FwdHVyZV90aHJlYWRfID0KLSAgICAgIG5ldyBiYXNlOjpEZWxlZ2F0ZVNpbXBsZVRocmVhZCh0aGlzLCAid2FzYXBpX2NhcHR1cmVfdGhyZWFkIik7Ci0gIGNhcHR1cmVfdGhyZWFkXy0+U3RhcnQoKTsKLQotICAvLyBTdGFydCBzdHJlYW1pbmcgZGF0YSBiZXR3ZWVuIHRoZSBlbmRwb2ludCBidWZmZXIgYW5kIHRoZSBhdWRpbyBlbmdpbmUuCi0gIEhSRVNVTFQgaHIgPSBhdWRpb19jbGllbnRfLT5TdGFydCgpOwotICBETE9HX0lGKEVSUk9SLCBGQUlMRUQoaHIpKSA8PCAiRmFpbGVkIHRvIHN0YXJ0IGlucHV0IHN0cmVhbWluZy4iOwotCi0gIHN0YXJ0ZWRfID0gU1VDQ0VFREVEKGhyKTsKLX0KLQotdm9pZCBXQVNBUElBdWRpb0lucHV0U3RyZWFtOjpTdG9wKCkgewotICBEQ0hFQ0soQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLSAgaWYgKCFzdGFydGVkXykKLSAgICByZXR1cm47Ci0KLSAgLy8gU2h1dCBkb3duIHRoZSBjYXB0dXJlIHRocmVhZC4KLSAgaWYgKHN0b3BfY2FwdHVyZV9ldmVudF8uSXNWYWxpZCgpKSB7Ci0gICAgU2V0RXZlbnQoc3RvcF9jYXB0dXJlX2V2ZW50Xy5HZXQoKSk7Ci0gIH0KLQotICAvLyBTdG9wIHRoZSBpbnB1dCBhdWRpbyBzdHJlYW1pbmcuCi0gIEhSRVNVTFQgaHIgPSBhdWRpb19jbGllbnRfLT5TdG9wKCk7Ci0gIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHN0b3AgaW5wdXQgc3RyZWFtaW5nLiI7Ci0gIH0KLQotICAvLyBXYWl0IHVudGlsIHRoZSB0aHJlYWQgY29tcGxldGVzIGFuZCBwZXJmb3JtIGNsZWFudXAuCi0gIGlmIChjYXB0dXJlX3RocmVhZF8pIHsKLSAgICBTZXRFdmVudChzdG9wX2NhcHR1cmVfZXZlbnRfLkdldCgpKTsKLSAgICBjYXB0dXJlX3RocmVhZF8tPkpvaW4oKTsKLSAgICBjYXB0dXJlX3RocmVhZF8gPSBOVUxMOwotICB9Ci0KLSAgc3RhcnRlZF8gPSBmYWxzZTsKLX0KLQotdm9pZCBXQVNBUElBdWRpb0lucHV0U3RyZWFtOjpDbG9zZSgpIHsKLSAgLy8gSXQgaXMgdmFsaWQgdG8gY2FsbCBDbG9zZSgpIGJlZm9yZSBjYWxsaW5nIG9wZW4gb3IgU3RhcnQoKS4KLSAgLy8gSXQgaXMgYWxzbyB2YWxpZCB0byBjYWxsIENsb3NlKCkgYWZ0ZXIgU3RhcnQoKSBoYXMgYmVlbiBjYWxsZWQuCi0gIFN0b3AoKTsKLSAgaWYgKHNpbmtfKSB7Ci0gICAgc2lua18tPk9uQ2xvc2UodGhpcyk7Ci0gICAgc2lua18gPSBOVUxMOwotICB9Ci0KLSAgLy8gSW5mb3JtIHRoZSBhdWRpbyBtYW5hZ2VyIHRoYXQgd2UgaGF2ZSBiZWVuIGNsb3NlZC4gVGhpcyB3aWxsIGNhdXNlIG91cgotICAvLyBkZXN0cnVjdGlvbi4KLSAgbWFuYWdlcl8tPlJlbGVhc2VJbnB1dFN0cmVhbSh0aGlzKTsKLX0KLQotZG91YmxlIFdBU0FQSUF1ZGlvSW5wdXRTdHJlYW06OkdldE1heFZvbHVtZSgpIHsKLSAgLy8gVmVyaWZ5IHRoYXQgT3BlbigpIGhhcyBiZWVuIGNhbGxlZCBzdWNjZXNmdWxseSwgdG8gZW5zdXJlIHRoYXQgYW4gYXVkaW8KLSAgLy8gc2Vzc2lvbiBleGlzdHMgYW5kIHRoYXQgYW4gSVNpbXBsZUF1ZGlvVm9sdW1lIGludGVyZmFjZSBoYXMgYmVlbiBjcmVhdGVkLgotICBETE9HX0lGKEVSUk9SLCAhb3BlbmVkXykgPDwgIk9wZW4oKSBoYXMgbm90IGJlZW4gY2FsbGVkIHN1Y2Nlc3NmdWxseSI7Ci0gIGlmICghb3BlbmVkXykKLSAgICByZXR1cm4gMC4wOwotCi0gIC8vIFRoZSBlZmZlY3RpdmUgdm9sdW1lIHZhbHVlIGlzIGFsd2F5cyBpbiB0aGUgcmFuZ2UgMC4wIHRvIDEuMCwgaGVuY2UKLSAgLy8gd2UgY2FuIHJldHVybiBhIGZpeGVkIHZhbHVlICg9MS4wKSBoZXJlLgotICByZXR1cm4gMS4wOwotfQotCi12b2lkIFdBU0FQSUF1ZGlvSW5wdXRTdHJlYW06OlNldFZvbHVtZShkb3VibGUgdm9sdW1lKSB7Ci0gIERWTE9HKDEpIDw8ICJTZXRWb2x1bWUodm9sdW1lPSIgPDwgdm9sdW1lIDw8ICIpIjsKLSAgRENIRUNLKENhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIERDSEVDS19HRSh2b2x1bWUsIDAuMCk7Ci0gIERDSEVDS19MRSh2b2x1bWUsIDEuMCk7Ci0KLSAgRExPR19JRihFUlJPUiwgIW9wZW5lZF8pIDw8ICJPcGVuKCkgaGFzIG5vdCBiZWVuIGNhbGxlZCBzdWNjZXNzZnVsbHkiOwotICBpZiAoIW9wZW5lZF8pCi0gICAgcmV0dXJuOwotCi0gIC8vIFNldCBhIG5ldyBtYXN0ZXIgdm9sdW1lIGxldmVsLiBWYWxpZCB2b2x1bWUgbGV2ZWxzIGFyZSBpbiB0aGUgcmFuZ2UKLSAgLy8gMC4wIHRvIDEuMC4gSWdub3JlIHZvbHVtZS1jaGFuZ2UgZXZlbnRzLgotICBIUkVTVUxUIGhyID0gc2ltcGxlX2F1ZGlvX3ZvbHVtZV8tPlNldE1hc3RlclZvbHVtZShzdGF0aWNfY2FzdDxmbG9hdD4odm9sdW1lKSwKLSAgICAgIE5VTEwpOwotICBETE9HX0lGKFdBUk5JTkcsIEZBSUxFRChocikpIDw8ICJGYWlsZWQgdG8gc2V0IG5ldyBpbnB1dCBtYXN0ZXIgdm9sdW1lLiI7Ci0KLSAgLy8gVXBkYXRlIHRoZSBBR0Mgdm9sdW1lIGxldmVsIGJhc2VkIG9uIHRoZSBsYXN0IHNldHRpbmcgYWJvdmUuIE5vdGUgdGhhdCwKLSAgLy8gdGhlIHZvbHVtZS1sZXZlbCByZXNvbHV0aW9uIGlzIG5vdCBpbmZpbml0ZSBhbmQgaXQgaXMgdGhlcmVmb3JlIG5vdAotICAvLyBwb3NzaWJsZSB0byBhc3N1bWUgdGhhdCB0aGUgdm9sdW1lIHByb3ZpZGVkIGFzIGlucHV0IHBhcmFtZXRlciBjYW4gYmUKLSAgLy8gdXNlZCBkaXJlY3RseS4gSW5zdGVhZCwgYSBuZXcgcXVlcnkgdG8gdGhlIGF1ZGlvIGhhcmR3YXJlIGlzIHJlcXVpcmVkLgotICAvLyBUaGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcgaWYgQUdDIGlzIGRpc2FibGVkLgotICBVcGRhdGVBZ2NWb2x1bWUoKTsKLX0KLQotZG91YmxlIFdBU0FQSUF1ZGlvSW5wdXRTdHJlYW06OkdldFZvbHVtZSgpIHsKLSAgRExPR19JRihFUlJPUiwgIW9wZW5lZF8pIDw8ICJPcGVuKCkgaGFzIG5vdCBiZWVuIGNhbGxlZCBzdWNjZXNzZnVsbHkiOwotICBpZiAoIW9wZW5lZF8pCi0gICAgcmV0dXJuIDAuMDsKLQotICAvLyBSZXRyaWV2ZSB0aGUgY3VycmVudCB2b2x1bWUgbGV2ZWwuIFRoZSB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC4wIHRvIDEuMC4KLSAgZmxvYXQgbGV2ZWwgPSAwLjBmOwotICBIUkVTVUxUIGhyID0gc2ltcGxlX2F1ZGlvX3ZvbHVtZV8tPkdldE1hc3RlclZvbHVtZSgmbGV2ZWwpOwotICBETE9HX0lGKFdBUk5JTkcsIEZBSUxFRChocikpIDw8ICJGYWlsZWQgdG8gZ2V0IGlucHV0IG1hc3RlciB2b2x1bWUuIjsKLQotICByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPihsZXZlbCk7Ci19Ci0KLS8vIHN0YXRpYwotaW50IFdBU0FQSUF1ZGlvSW5wdXRTdHJlYW06OkhhcmR3YXJlU2FtcGxlUmF0ZSgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2lkKSB7Ci0gIGJhc2U6Ondpbjo6U2NvcGVkQ29NZW08V0FWRUZPUk1BVEVYPiBhdWRpb19lbmdpbmVfbWl4X2Zvcm1hdDsKLSAgSFJFU1VMVCBociA9IEdldE1peEZvcm1hdChkZXZpY2VfaWQsICZhdWRpb19lbmdpbmVfbWl4X2Zvcm1hdCk7Ci0gIGlmIChGQUlMRUQoaHIpKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGF1ZGlvX2VuZ2luZV9taXhfZm9ybWF0LT5uU2FtcGxlc1BlclNlYyk7Ci19Ci0KLS8vIHN0YXRpYwotdWludDMyIFdBU0FQSUF1ZGlvSW5wdXRTdHJlYW06OkhhcmR3YXJlQ2hhbm5lbENvdW50KAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfaWQpIHsKLSAgYmFzZTo6d2luOjpTY29wZWRDb01lbTxXQVZFRk9STUFURVg+IGF1ZGlvX2VuZ2luZV9taXhfZm9ybWF0OwotICBIUkVTVUxUIGhyID0gR2V0TWl4Rm9ybWF0KGRldmljZV9pZCwgJmF1ZGlvX2VuZ2luZV9taXhfZm9ybWF0KTsKLSAgaWYgKEZBSUxFRChocikpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMj4oYXVkaW9fZW5naW5lX21peF9mb3JtYXQtPm5DaGFubmVscyk7Ci19Ci0KLS8vIHN0YXRpYwotSFJFU1VMVCBXQVNBUElBdWRpb0lucHV0U3RyZWFtOjpHZXRNaXhGb3JtYXQoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdBVkVGT1JNQVRFWCoqIGRldmljZV9mb3JtYXQpIHsKLSAgLy8gSXQgaXMgYXNzdW1lZCB0aGF0IHRoaXMgc3RhdGljIG1ldGhvZCBpcyBjYWxsZWQgZnJvbSBhIENPTSB0aHJlYWQsIGkuZS4sCi0gIC8vIENvSW5pdGlhbGl6ZUV4KCkgaXMgbm90IGNhbGxlZCBoZXJlIHRvIGF2b2lkIFNUQS9NVEEgY29uZmxpY3RzLgotICBTY29wZWRDb21QdHI8SU1NRGV2aWNlRW51bWVyYXRvcj4gZW51bWVyYXRvcjsKLSAgSFJFU1VMVCBociA9ICBDb0NyZWF0ZUluc3RhbmNlKF9fdXVpZG9mKE1NRGV2aWNlRW51bWVyYXRvciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xTQ1RYX0lOUFJPQ19TRVJWRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3V1aWRvZihJTU1EZXZpY2VFbnVtZXJhdG9yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmF0b3IuUmVjZWl2ZVZvaWQoKSk7Ci0gIGlmIChGQUlMRUQoaHIpKQotICAgIHJldHVybiBocjsKLQotICBTY29wZWRDb21QdHI8SU1NRGV2aWNlPiBlbmRwb2ludF9kZXZpY2U7Ci0gIGlmIChkZXZpY2VfaWQgPT0gQXVkaW9NYW5hZ2VyQmFzZTo6a0RlZmF1bHREZXZpY2VJZCkgewotICAgIC8vIFJldHJpZXZlIHRoZSBkZWZhdWx0IGNhcHR1cmUgYXVkaW8gZW5kcG9pbnQuCi0gICAgaHIgPSBlbnVtZXJhdG9yLT5HZXREZWZhdWx0QXVkaW9FbmRwb2ludChlQ2FwdHVyZSwgZUNvbnNvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludF9kZXZpY2UuUmVjZWl2ZSgpKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBSZXRyaWV2ZSBhIGNhcHR1cmUgZW5kcG9pbnQgZGV2aWNlIHRoYXQgaXMgc3BlY2lmaWVkIGJ5IGFuIGVuZHBvaW50Ci0gICAgLy8gZGV2aWNlLWlkZW50aWZpY2F0aW9uIHN0cmluZy4KLSAgICBociA9IGVudW1lcmF0b3ItPkdldERldmljZShVVEY4VG9VVEYxNihkZXZpY2VfaWQpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRfZGV2aWNlLlJlY2VpdmUoKSk7Ci0gIH0KLSAgaWYgKEZBSUxFRChocikpCi0gICAgcmV0dXJuIGhyOwotCi0gIFNjb3BlZENvbVB0cjxJQXVkaW9DbGllbnQ+IGF1ZGlvX2NsaWVudDsKLSAgaHIgPSBlbmRwb2ludF9kZXZpY2UtPkFjdGl2YXRlKF9fdXVpZG9mKElBdWRpb0NsaWVudCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTFNDVFhfSU5QUk9DX1NFUlZFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jbGllbnQuUmVjZWl2ZVZvaWQoKSk7Ci0gIHJldHVybiBTVUNDRUVERUQoaHIpID8gYXVkaW9fY2xpZW50LT5HZXRNaXhGb3JtYXQoZGV2aWNlX2Zvcm1hdCkgOiBocjsKLX0KLQotdm9pZCBXQVNBUElBdWRpb0lucHV0U3RyZWFtOjpSdW4oKSB7Ci0gIFNjb3BlZENPTUluaXRpYWxpemVyIGNvbV9pbml0KFNjb3BlZENPTUluaXRpYWxpemVyOjprTVRBKTsKLQotICAvLyBJbmNyZWFzZSB0aGUgdGhyZWFkIHByaW9yaXR5LgotICBjYXB0dXJlX3RocmVhZF8tPlNldFRocmVhZFByaW9yaXR5KGJhc2U6OmtUaHJlYWRQcmlvcml0eV9SZWFsdGltZUF1ZGlvKTsKLQotICAvLyBFbmFibGUgTU1DU1MgdG8gZW5zdXJlIHRoYXQgdGhpcyB0aHJlYWQgcmVjZWl2ZXMgcHJpb3JpdGl6ZWQgYWNjZXNzIHRvCi0gIC8vIENQVSByZXNvdXJjZXMuCi0gIERXT1JEIHRhc2tfaW5kZXggPSAwOwotICBIQU5ETEUgbW1fdGFzayA9IGF2cnQ6OkF2U2V0TW1UaHJlYWRDaGFyYWN0ZXJpc3RpY3MoTCJQcm8gQXVkaW8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhc2tfaW5kZXgpOwotICBib29sIG1tY3NzX2lzX29rID0KLSAgICAgIChtbV90YXNrICYmIGF2cnQ6OkF2U2V0TW1UaHJlYWRQcmlvcml0eShtbV90YXNrLCBBVlJUX1BSSU9SSVRZX0NSSVRJQ0FMKSk7Ci0gIGlmICghbW1jc3NfaXNfb2spIHsKLSAgICAvLyBGYWlsZWQgdG8gZW5hYmxlIE1NQ1NTIG9uIHRoaXMgdGhyZWFkLiBJdCBpcyBub3QgZmF0YWwgYnV0IGNhbiBsZWFkCi0gICAgLy8gdG8gcmVkdWNlZCBRb1MgYXQgaGlnaCBsb2FkLgotICAgIERXT1JEIGVyciA9IEdldExhc3RFcnJvcigpOwotICAgIExPRyhXQVJOSU5HKSA8PCAiRmFpbGVkIHRvIGVuYWJsZSBNTUNTUyAoZXJyb3IgY29kZT0iIDw8IGVyciA8PCAiKS4iOwotICB9Ci0KLSAgLy8gQWxsb2NhdGUgYSBidWZmZXIgd2l0aCBhIHNpemUgdGhhdCBlbmFibGVzIHVzIHRvIHRha2UgY2FyZSBvZiBjYXNlcyBsaWtlOgotICAvLyAxKSBUaGUgcmVjb3JkZWQgYnVmZmVyIHNpemUgaXMgc21hbGxlciwgb3IgZG9lcyBub3QgbWF0Y2ggZXhhY3RseSB3aXRoLAotICAvLyAgICB0aGUgc2VsZWN0ZWQgcGFja2V0IHNpemUgdXNlZCBpbiBlYWNoIGNhbGxiYWNrLgotICAvLyAyKSBUaGUgc2VsZWN0ZWQgYnVmZmVyIHNpemUgaXMgbGFyZ2VyIHRoYW4gdGhlIHJlY29yZGVkIGJ1ZmZlciBzaXplIGluCi0gIC8vICAgIGVhY2ggZXZlbnQuCi0gIHNpemVfdCBidWZmZXJfZnJhbWVfaW5kZXggPSAwOwotICBzaXplX3QgY2FwdHVyZV9idWZmZXJfc2l6ZSA9IHN0ZDo6bWF4KAotICAgICAgMiAqIGVuZHBvaW50X2J1ZmZlcl9zaXplX2ZyYW1lc18gKiBmcmFtZV9zaXplXywKLSAgICAgIDIgKiBwYWNrZXRfc2l6ZV9mcmFtZXNfICogZnJhbWVfc2l6ZV8pOwotICBzY29wZWRfYXJyYXk8dWludDg+IGNhcHR1cmVfYnVmZmVyKG5ldyB1aW50OFtjYXB0dXJlX2J1ZmZlcl9zaXplXSk7Ci0KLSAgTEFSR0VfSU5URUdFUiBub3dfY291bnQ7Ci0gIGJvb2wgcmVjb3JkaW5nID0gdHJ1ZTsKLSAgYm9vbCBlcnJvciA9IGZhbHNlOwotICBkb3VibGUgdm9sdW1lID0gR2V0Vm9sdW1lKCk7Ci0gIEhBTkRMRSB3YWl0X2FycmF5WzJdID0ge3N0b3BfY2FwdHVyZV9ldmVudF8sIGF1ZGlvX3NhbXBsZXNfcmVhZHlfZXZlbnRffTsKLQotICB3aGlsZSAocmVjb3JkaW5nICYmICFlcnJvcikgewotICAgIEhSRVNVTFQgaHIgPSBTX0ZBTFNFOwotCi0gICAgLy8gV2FpdCBmb3IgYSBjbG9zZS1kb3duIGV2ZW50IG9yIGEgbmV3IGNhcHR1cmUgZXZlbnQuCi0gICAgRFdPUkQgd2FpdF9yZXN1bHQgPSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKDIsIHdhaXRfYXJyYXksIEZBTFNFLCBJTkZJTklURSk7Ci0gICAgc3dpdGNoICh3YWl0X3Jlc3VsdCkgewotICAgICAgY2FzZSBXQUlUX0ZBSUxFRDoKLSAgICAgICAgZXJyb3IgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgV0FJVF9PQkpFQ1RfMCArIDA6Ci0gICAgICAgIC8vIHxzdG9wX2NhcHR1cmVfZXZlbnRffCBoYXMgYmVlbiBzZXQuCi0gICAgICAgIHJlY29yZGluZyA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgV0FJVF9PQkpFQ1RfMCArIDE6Ci0gICAgICAgIHsKLSAgICAgICAgICAvLyB8YXVkaW9fc2FtcGxlc19yZWFkeV9ldmVudF98IGhhcyBiZWVuIHNldC4KLSAgICAgICAgICBCWVRFKiBkYXRhX3B0ciA9IE5VTEw7Ci0gICAgICAgICAgVUlOVDMyIG51bV9mcmFtZXNfdG9fcmVhZCA9IDA7Ci0gICAgICAgICAgRFdPUkQgZmxhZ3MgPSAwOwotICAgICAgICAgIFVJTlQ2NCBkZXZpY2VfcG9zaXRpb24gPSAwOwotICAgICAgICAgIFVJTlQ2NCBmaXJzdF9hdWRpb19mcmFtZV90aW1lc3RhbXAgPSAwOwotCi0gICAgICAgICAgLy8gUmV0cmlldmUgdGhlIGFtb3VudCBvZiBkYXRhIGluIHRoZSBjYXB0dXJlIGVuZHBvaW50IGJ1ZmZlciwKLSAgICAgICAgICAvLyByZXBsYWNlIGl0IHdpdGggc2lsZW5jZSBpZiByZXF1aXJlZCwgY3JlYXRlIGNhbGxiYWNrcyBmb3IgZWFjaAotICAgICAgICAgIC8vIHBhY2tldCBhbmQgc3RvcmUgbm9uLWRlbGl2ZXJlZCBkYXRhIGZvciB0aGUgbmV4dCBldmVudC4KLSAgICAgICAgICBociA9IGF1ZGlvX2NhcHR1cmVfY2xpZW50Xy0+R2V0QnVmZmVyKCZkYXRhX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1fZnJhbWVzX3RvX3JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlX3Bvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0X2F1ZGlvX2ZyYW1lX3RpbWVzdGFtcCk7Ci0gICAgICAgICAgaWYgKEZBSUxFRChocikpIHsKLSAgICAgICAgICAgIERMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZ2V0IGRhdGEgZnJvbSB0aGUgY2FwdHVyZSBidWZmZXIiOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKG51bV9mcmFtZXNfdG9fcmVhZCAhPSAwKSB7Ci0gICAgICAgICAgICBzaXplX3QgcG9zID0gYnVmZmVyX2ZyYW1lX2luZGV4ICogZnJhbWVfc2l6ZV87Ci0gICAgICAgICAgICBzaXplX3QgbnVtX2J5dGVzID0gbnVtX2ZyYW1lc190b19yZWFkICogZnJhbWVfc2l6ZV87Ci0gICAgICAgICAgICBEQ0hFQ0tfR0UoY2FwdHVyZV9idWZmZXJfc2l6ZSwgcG9zICsgbnVtX2J5dGVzKTsKLQotICAgICAgICAgICAgaWYgKGZsYWdzICYgQVVEQ0xOVF9CVUZGRVJGTEFHU19TSUxFTlQpIHsKLSAgICAgICAgICAgICAgLy8gQ2xlYXIgb3V0IHRoZSBsb2NhbCBidWZmZXIgc2luY2Ugc2lsZW5jZSBpcyByZXBvcnRlZC4KLSAgICAgICAgICAgICAgbWVtc2V0KCZjYXB0dXJlX2J1ZmZlcltwb3NdLCAwLCBudW1fYnl0ZXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgLy8gQ29weSBjYXB0dXJlZCBkYXRhIGZyb20gYXVkaW8gZW5naW5lIGJ1ZmZlciB0byBsb2NhbCBidWZmZXIuCi0gICAgICAgICAgICAgIG1lbWNweSgmY2FwdHVyZV9idWZmZXJbcG9zXSwgZGF0YV9wdHIsIG51bV9ieXRlcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ1ZmZlcl9mcmFtZV9pbmRleCArPSBudW1fZnJhbWVzX3RvX3JlYWQ7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaHIgPSBhdWRpb19jYXB0dXJlX2NsaWVudF8tPlJlbGVhc2VCdWZmZXIobnVtX2ZyYW1lc190b19yZWFkKTsKLSAgICAgICAgICBETE9HX0lGKEVSUk9SLCBGQUlMRUQoaHIpKSA8PCAiRmFpbGVkIHRvIHJlbGVhc2UgY2FwdHVyZSBidWZmZXIiOwotCi0gICAgICAgICAgLy8gRGVyaXZlIGEgZGVsYXkgZXN0aW1hdGUgZm9yIHRoZSBjYXB0dXJlZCBhdWRpbyBwYWNrZXQuCi0gICAgICAgICAgLy8gVGhlIHZhbHVlIGNvbnRhaW5zIHR3byBwYXJ0cyAoQStCKSwgd2hlcmUgQSBpcyB0aGUgZGVsYXkgb2YgdGhlCi0gICAgICAgICAgLy8gZmlyc3QgYXVkaW8gZnJhbWUgaW4gdGhlIHBhY2tldCBhbmQgQiBpcyB0aGUgZXh0cmEgZGVsYXkKLSAgICAgICAgICAvLyBjb250YWluZWQgaW4gYW55IHN0b3JlZCBkYXRhLiBVbml0IGlzIGluIGF1ZGlvIGZyYW1lcy4KLSAgICAgICAgICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigmbm93X2NvdW50KTsKLSAgICAgICAgICBkb3VibGUgYXVkaW9fZGVsYXlfZnJhbWVzID0KLSAgICAgICAgICAgICAgKChwZXJmX2NvdW50X3RvXzEwMG5zX3VuaXRzXyAqIG5vd19jb3VudC5RdWFkUGFydCAtCi0gICAgICAgICAgICAgICAgZmlyc3RfYXVkaW9fZnJhbWVfdGltZXN0YW1wKSAvIDEwMDAwLjApICogbXNfdG9fZnJhbWVfY291bnRfICsKLSAgICAgICAgICAgICAgICBidWZmZXJfZnJhbWVfaW5kZXggLSBudW1fZnJhbWVzX3RvX3JlYWQ7Ci0KLSAgICAgICAgICAvLyBVcGRhdGUgdGhlIEFHQyB2b2x1bWUgbGV2ZWwgb25jZSBldmVyeSBzZWNvbmQuIE5vdGUgdGhhdCwKLSAgICAgICAgICAvLyB8dm9sdW1lfCBpcyBhbHNvIHVwZGF0ZWQgZWFjaCB0aW1lIFNldFZvbHVtZSgpIGlzIGNhbGxlZAotICAgICAgICAgIC8vIHRocm91Z2ggSVBDIGJ5IHRoZSByZW5kZXItc2lkZSBBR0MuCi0gICAgICAgICAgUXVlcnlBZ2NWb2x1bWUoJnZvbHVtZSk7Ci0KLSAgICAgICAgICAvLyBEZWxpdmVyIGNhcHR1cmVkIGRhdGEgdG8gdGhlIHJlZ2lzdGVyZWQgY29uc3VtZXIgdXNpbmcgYSBwYWNrZXQKLSAgICAgICAgICAvLyBzaXplIHdoaWNoIHdhcyBzcGVjaWZpZWQgYXQgY29uc3RydWN0aW9uLgotICAgICAgICAgIHVpbnQzMiBkZWxheV9mcmFtZXMgPSBzdGF0aWNfY2FzdDx1aW50MzI+KGF1ZGlvX2RlbGF5X2ZyYW1lcyArIDAuNSk7Ci0gICAgICAgICAgd2hpbGUgKGJ1ZmZlcl9mcmFtZV9pbmRleCA+PSBwYWNrZXRfc2l6ZV9mcmFtZXNfKSB7Ci0gICAgICAgICAgICB1aW50OCogYXVkaW9fZGF0YSA9Ci0gICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KGNhcHR1cmVfYnVmZmVyLmdldCgpKTsKLQotICAgICAgICAgICAgLy8gRGVsaXZlciBkYXRhIHBhY2tldCwgZGVsYXkgZXN0aW1hdGlvbiBhbmQgdm9sdW1lIGxldmVsIHRvCi0gICAgICAgICAgICAvLyB0aGUgdXNlci4KLSAgICAgICAgICAgIHNpbmtfLT5PbkRhdGEodGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0X3NpemVfYnl0ZXNfLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheV9mcmFtZXMgKiBmcmFtZV9zaXplXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lKTsKLQotICAgICAgICAgICAgLy8gU3RvcmUgcGFydHMgb2YgdGhlIHJlY29yZGVkIGRhdGEgd2hpY2ggY2FuJ3QgYmUgZGVsaXZlcmVkCi0gICAgICAgICAgICAvLyB1c2luZyB0aGUgY3VycmVudCBwYWNrZXQgc2l6ZS4gVGhlIHN0b3JlZCBzZWN0aW9uIHdpbGwgYmUgdXNlZAotICAgICAgICAgICAgLy8gZWl0aGVyIGluIHRoZSBuZXh0IHdoaWxlLWxvb3AgaXRlcmF0aW9uIG9yIGluIHRoZSBuZXh0Ci0gICAgICAgICAgICAvLyBjYXB0dXJlIGV2ZW50LgotICAgICAgICAgICAgbWVtbW92ZSgmY2FwdHVyZV9idWZmZXJbMF0sCi0gICAgICAgICAgICAgICAgICAgICZjYXB0dXJlX2J1ZmZlcltwYWNrZXRfc2l6ZV9ieXRlc19dLAotICAgICAgICAgICAgICAgICAgICAoYnVmZmVyX2ZyYW1lX2luZGV4IC0gcGFja2V0X3NpemVfZnJhbWVzXykgKiBmcmFtZV9zaXplXyk7Ci0KLSAgICAgICAgICAgIGJ1ZmZlcl9mcmFtZV9pbmRleCAtPSBwYWNrZXRfc2l6ZV9mcmFtZXNfOwotICAgICAgICAgICAgZGVsYXlfZnJhbWVzIC09IHBhY2tldF9zaXplX2ZyYW1lc187Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgZXJyb3IgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBpZiAocmVjb3JkaW5nICYmIGVycm9yKSB7Ci0gICAgLy8gVE9ETyhoZW5yaWthKTogcGVyaGFwcyBpdCB3b3J0aCBpbXByb3ZpbmcgdGhlIGNsZWFudXAgaGVyZSBieSBlLmcuCi0gICAgLy8gc3RvcHBpbmcgdGhlIGF1ZGlvIGNsaWVudCwgam9pbmluZyB0aGUgdGhyZWFkIGV0Yy4/Ci0gICAgTk9UUkVBQ0hFRCgpIDw8ICJXQVNBUEkgY2FwdHVyaW5nIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgIgotICAgICAgICAgICAgICAgICA8PCBHZXRMYXN0RXJyb3IoKTsKLSAgfQotCi0gIC8vIERpc2FibGUgTU1DU1MuCi0gIGlmIChtbV90YXNrICYmICFhdnJ0OjpBdlJldmVydE1tVGhyZWFkQ2hhcmFjdGVyaXN0aWNzKG1tX3Rhc2spKSB7Ci0gICAgUExPRyhXQVJOSU5HKSA8PCAiRmFpbGVkIHRvIGRpc2FibGUgTU1DU1MiOwotICB9Ci19Ci0KLXZvaWQgV0FTQVBJQXVkaW9JbnB1dFN0cmVhbTo6SGFuZGxlRXJyb3IoSFJFU1VMVCBlcnIpIHsKLSAgTk9UUkVBQ0hFRCgpIDw8ICJFcnJvciBjb2RlOiAiIDw8IGVycjsKLSAgaWYgKHNpbmtfKQotICAgIHNpbmtfLT5PbkVycm9yKHRoaXMsIHN0YXRpY19jYXN0PGludD4oZXJyKSk7Ci19Ci0KLUhSRVNVTFQgV0FTQVBJQXVkaW9JbnB1dFN0cmVhbTo6U2V0Q2FwdHVyZURldmljZSgpIHsKLSAgU2NvcGVkQ29tUHRyPElNTURldmljZUVudW1lcmF0b3I+IGVudW1lcmF0b3I7Ci0gIEhSRVNVTFQgaHIgPSAgQ29DcmVhdGVJbnN0YW5jZShfX3V1aWRvZihNTURldmljZUVudW1lcmF0b3IpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMU0NUWF9JTlBST0NfU0VSVkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191dWlkb2YoSU1NRGV2aWNlRW51bWVyYXRvciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhdG9yLlJlY2VpdmVWb2lkKCkpOwotICBpZiAoU1VDQ0VFREVEKGhyKSkgewotICAgIC8vIFJldHJpZXZlIHRoZSBJTU1EZXZpY2UgYnkgdXNpbmcgdGhlIHNwZWNpZmllZCByb2xlIG9yIHRoZSBzcGVjaWZpZWQKLSAgICAvLyB1bmlxdWUgZW5kcG9pbnQgZGV2aWNlLWlkZW50aWZpY2F0aW9uIHN0cmluZy4KLSAgICAvLyBUT0RPKGhlbnJpa2EpOiBwb3NzaWJseSBhZGQgc3VwcG9ydCBmb3IgdGhlIGVDb21tdW5pY2F0aW9ucyBhcyB3ZWxsLgotICAgIGlmIChkZXZpY2VfaWRfID09IEF1ZGlvTWFuYWdlckJhc2U6OmtEZWZhdWx0RGV2aWNlSWQpIHsKLSAgICAgIC8vIFJldHJpZXZlIHRoZSBkZWZhdWx0IGNhcHR1cmUgYXVkaW8gZW5kcG9pbnQgZm9yIHRoZSBzcGVjaWZpZWQgcm9sZS4KLSAgICAgIC8vIE5vdGUgdGhhdCwgaW4gV2luZG93cyBWaXN0YSwgdGhlIE1NRGV2aWNlIEFQSSBzdXBwb3J0cyBkZXZpY2Ugcm9sZXMKLSAgICAgIC8vIGJ1dCB0aGUgc3lzdGVtLXN1cHBsaWVkIHVzZXIgaW50ZXJmYWNlIHByb2dyYW1zIGRvIG5vdC4KLSAgICAgIGhyID0gZW51bWVyYXRvci0+R2V0RGVmYXVsdEF1ZGlvRW5kcG9pbnQoZUNhcHR1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDb25zb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludF9kZXZpY2VfLlJlY2VpdmUoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFJldHJpZXZlIGEgY2FwdHVyZSBlbmRwb2ludCBkZXZpY2UgdGhhdCBpcyBzcGVjaWZpZWQgYnkgYW4gZW5kcG9pbnQKLSAgICAgIC8vIGRldmljZS1pZGVudGlmaWNhdGlvbiBzdHJpbmcuCi0gICAgICBociA9IGVudW1lcmF0b3ItPkdldERldmljZShVVEY4VG9VVEYxNihkZXZpY2VfaWRfKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRfZGV2aWNlXy5SZWNlaXZlKCkpOwotICAgIH0KLQotICAgIGlmIChGQUlMRUQoaHIpKQotICAgICAgcmV0dXJuIGhyOwotCi0gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGF1ZGlvIGVuZHBvaW50IGRldmljZSBpcyBhY3RpdmUsIGkuZS4sIHRoZSBhdWRpbwotICAgIC8vIGFkYXB0ZXIgdGhhdCBjb25uZWN0cyB0byB0aGUgZW5kcG9pbnQgZGV2aWNlIGlzIHByZXNlbnQgYW5kIGVuYWJsZWQuCi0gICAgRFdPUkQgc3RhdGUgPSBERVZJQ0VfU1RBVEVfRElTQUJMRUQ7Ci0gICAgaHIgPSBlbmRwb2ludF9kZXZpY2VfLT5HZXRTdGF0ZSgmc3RhdGUpOwotICAgIGlmIChTVUNDRUVERUQoaHIpKSB7Ci0gICAgICBpZiAoIShzdGF0ZSAmIERFVklDRV9TVEFURV9BQ1RJVkUpKSB7Ci0gICAgICAgIERMT0coRVJST1IpIDw8ICJTZWxlY3RlZCBjYXB0dXJlIGRldmljZSBpcyBub3QgYWN0aXZlLiI7Ci0gICAgICAgIGhyID0gRV9BQ0NFU1NERU5JRUQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGhyOwotfQotCi1IUkVTVUxUIFdBU0FQSUF1ZGlvSW5wdXRTdHJlYW06OkFjdGl2YXRlQ2FwdHVyZURldmljZSgpIHsKLSAgLy8gQ3JlYXRlcyBhbmQgYWN0aXZhdGVzIGFuIElBdWRpb0NsaWVudCBDT00gb2JqZWN0IGdpdmVuIHRoZSBzZWxlY3RlZAotICAvLyBjYXB0dXJlIGVuZHBvaW50IGRldmljZS4KLSAgSFJFU1VMVCBociA9IGVuZHBvaW50X2RldmljZV8tPkFjdGl2YXRlKF9fdXVpZG9mKElBdWRpb0NsaWVudCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTFNDVFhfSU5QUk9DX1NFUlZFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jbGllbnRfLlJlY2VpdmVWb2lkKCkpOwotICByZXR1cm4gaHI7Ci19Ci0KLUhSRVNVTFQgV0FTQVBJQXVkaW9JbnB1dFN0cmVhbTo6R2V0QXVkaW9FbmdpbmVTdHJlYW1Gb3JtYXQoKSB7Ci0gIEhSRVNVTFQgaHIgPSBTX09LOwotI2lmbmRlZiBOREVCVUcKLSAgLy8gVGhlIEdldE1peEZvcm1hdCgpIG1ldGhvZCByZXRyaWV2ZXMgdGhlIHN0cmVhbSBmb3JtYXQgdGhhdCB0aGUKLSAgLy8gYXVkaW8gZW5naW5lIHVzZXMgZm9yIGl0cyBpbnRlcm5hbCBwcm9jZXNzaW5nIG9mIHNoYXJlZC1tb2RlIHN0cmVhbXMuCi0gIC8vIFRoZSBtZXRob2QgYWx3YXlzIHVzZXMgYSBXQVZFRk9STUFURVhURU5TSUJMRSBzdHJ1Y3R1cmUsIGluc3RlYWQKLSAgLy8gb2YgYSBzdGFuZC1hbG9uZSBXQVZFRk9STUFURVggc3RydWN0dXJlLCB0byBzcGVjaWZ5IHRoZSBmb3JtYXQuCi0gIC8vIEFuIFdBVkVGT1JNQVRFWFRFTlNJQkxFIHN0cnVjdHVyZSBjYW4gc3BlY2lmeSBib3RoIHRoZSBtYXBwaW5nIG9mCi0gIC8vIGNoYW5uZWxzIHRvIHNwZWFrZXJzIGFuZCB0aGUgbnVtYmVyIG9mIGJpdHMgb2YgcHJlY2lzaW9uIGluIGVhY2ggc2FtcGxlLgotICBiYXNlOjp3aW46OlNjb3BlZENvTWVtPFdBVkVGT1JNQVRFWFRFTlNJQkxFPiBmb3JtYXRfZXg7Ci0gIGhyID0gYXVkaW9fY2xpZW50Xy0+R2V0TWl4Rm9ybWF0KAotICAgICAgcmVpbnRlcnByZXRfY2FzdDxXQVZFRk9STUFURVgqKj4oJmZvcm1hdF9leCkpOwotCi0gIC8vIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL3dpbmRvd3MvaGFyZHdhcmUvZ2c0NjMwMDYjRUZICi0gIC8vIGZvciBkZXRhaWxzIG9uIHRoZSBXQVZFIGZpbGUgZm9ybWF0LgotICBXQVZFRk9STUFURVggZm9ybWF0ID0gZm9ybWF0X2V4LT5Gb3JtYXQ7Ci0gIERWTE9HKDIpIDw8ICJXQVZFRk9STUFURVg6IjsKLSAgRFZMT0coMikgPDwgIiAgd0Zvcm1hdFRhZ3MgICAgOiAweCIgPDwgc3RkOjpoZXggPDwgZm9ybWF0LndGb3JtYXRUYWc7Ci0gIERWTE9HKDIpIDw8ICIgIG5DaGFubmVscyAgICAgIDogIiA8PCBmb3JtYXQubkNoYW5uZWxzOwotICBEVkxPRygyKSA8PCAiICBuU2FtcGxlc1BlclNlYyA6ICIgPDwgZm9ybWF0Lm5TYW1wbGVzUGVyU2VjOwotICBEVkxPRygyKSA8PCAiICBuQXZnQnl0ZXNQZXJTZWM6ICIgPDwgZm9ybWF0Lm5BdmdCeXRlc1BlclNlYzsKLSAgRFZMT0coMikgPDwgIiAgbkJsb2NrQWxpZ24gICAgOiAiIDw8IGZvcm1hdC5uQmxvY2tBbGlnbjsKLSAgRFZMT0coMikgPDwgIiAgd0JpdHNQZXJTYW1wbGUgOiAiIDw8IGZvcm1hdC53Qml0c1BlclNhbXBsZTsKLSAgRFZMT0coMikgPDwgIiAgY2JTaXplICAgICAgICAgOiAiIDw8IGZvcm1hdC5jYlNpemU7Ci0KLSAgRFZMT0coMikgPDwgIldBVkVGT1JNQVRFWFRFTlNJQkxFOiI7Ci0gIERWTE9HKDIpIDw8ICIgd1ZhbGlkQml0c1BlclNhbXBsZTogIiA8PAotICAgICAgZm9ybWF0X2V4LT5TYW1wbGVzLndWYWxpZEJpdHNQZXJTYW1wbGU7Ci0gIERWTE9HKDIpIDw8ICIgZHdDaGFubmVsTWFzayAgICAgIDogMHgiIDw8IHN0ZDo6aGV4IDw8Ci0gICAgICBmb3JtYXRfZXgtPmR3Q2hhbm5lbE1hc2s7Ci0gIGlmIChmb3JtYXRfZXgtPlN1YkZvcm1hdCA9PSBLU0RBVEFGT1JNQVRfU1VCVFlQRV9QQ00pCi0gICAgRFZMT0coMikgPDwgIiBTdWJGb3JtYXQgICAgICAgICAgOiBLU0RBVEFGT1JNQVRfU1VCVFlQRV9QQ00iOwotICBlbHNlIGlmIChmb3JtYXRfZXgtPlN1YkZvcm1hdCA9PSBLU0RBVEFGT1JNQVRfU1VCVFlQRV9JRUVFX0ZMT0FUKQotICAgIERWTE9HKDIpIDw8ICIgU3ViRm9ybWF0ICAgICAgICAgIDogS1NEQVRBRk9STUFUX1NVQlRZUEVfSUVFRV9GTE9BVCI7Ci0gIGVsc2UgaWYgKGZvcm1hdF9leC0+U3ViRm9ybWF0ID09IEtTREFUQUZPUk1BVF9TVUJUWVBFX1dBVkVGT1JNQVRFWCkKLSAgICBEVkxPRygyKSA8PCAiIFN1YkZvcm1hdCAgICAgICAgICA6IEtTREFUQUZPUk1BVF9TVUJUWVBFX1dBVkVGT1JNQVRFWCI7Ci0jZW5kaWYKLSAgcmV0dXJuIGhyOwotfQotCi1ib29sIFdBU0FQSUF1ZGlvSW5wdXRTdHJlYW06OkRlc2lyZWRGb3JtYXRJc1N1cHBvcnRlZCgpIHsKLSAgLy8gQW4gYXBwbGljYXRpb24gdGhhdCB1c2VzIFdBU0FQSSB0byBtYW5hZ2Ugc2hhcmVkLW1vZGUgc3RyZWFtcyBjYW4gcmVseQotICAvLyBvbiB0aGUgYXVkaW8gZW5naW5lIHRvIHBlcmZvcm0gb25seSBsaW1pdGVkIGZvcm1hdCBjb252ZXJzaW9ucy4gVGhlIGF1ZGlvCi0gIC8vIGVuZ2luZSBjYW4gY29udmVydCBiZXR3ZWVuIGEgc3RhbmRhcmQgUENNIHNhbXBsZSBzaXplIHVzZWQgYnkgdGhlCi0gIC8vIGFwcGxpY2F0aW9uIGFuZCB0aGUgZmxvYXRpbmctcG9pbnQgc2FtcGxlcyB0aGF0IHRoZSBlbmdpbmUgdXNlcyBmb3IgaXRzCi0gIC8vIGludGVybmFsIHByb2Nlc3NpbmcuIEhvd2V2ZXIsIHRoZSBmb3JtYXQgZm9yIGFuIGFwcGxpY2F0aW9uIHN0cmVhbQotICAvLyB0eXBpY2FsbHkgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBjaGFubmVscyBhbmQgdGhlIHNhbWUgc2FtcGxlCi0gIC8vIHJhdGUgYXMgdGhlIHN0cmVhbSBmb3JtYXQgdXNlZCBieSB0aGUgZGV2aWNlLgotICAvLyBNYW55IGF1ZGlvIGRldmljZXMgc3VwcG9ydCBib3RoIFBDTSBhbmQgbm9uLVBDTSBzdHJlYW0gZm9ybWF0cy4gSG93ZXZlciwKLSAgLy8gdGhlIGF1ZGlvIGVuZ2luZSBjYW4gbWl4IG9ubHkgUENNIHN0cmVhbXMuCi0gIGJhc2U6Ondpbjo6U2NvcGVkQ29NZW08V0FWRUZPUk1BVEVYPiBjbG9zZXN0X21hdGNoOwotICBIUkVTVUxUIGhyID0gYXVkaW9fY2xpZW50Xy0+SXNGb3JtYXRTdXBwb3J0ZWQoQVVEQ0xOVF9TSEFSRU1PREVfU0hBUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2xvc2VzdF9tYXRjaCk7Ci0gIERMT0dfSUYoRVJST1IsIGhyID09IFNfRkFMU0UpIDw8ICJGb3JtYXQgaXMgbm90IHN1cHBvcnRlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJidXQgYSBjbG9zZXN0IG1hdGNoIGV4aXN0cy4iOwotICByZXR1cm4gKGhyID09IFNfT0spOwotfQotCi1IUkVTVUxUIFdBU0FQSUF1ZGlvSW5wdXRTdHJlYW06OkluaXRpYWxpemVBdWRpb0VuZ2luZSgpIHsKLSAgLy8gSW5pdGlhbGl6ZSB0aGUgYXVkaW8gc3RyZWFtIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgdGhlIGRldmljZS4KLSAgLy8gV2UgY29ubmVjdCBpbmRpcmVjdGx5IHRocm91Z2ggdGhlIGF1ZGlvIGVuZ2luZSBieSB1c2luZyBzaGFyZWQgbW9kZQotICAvLyBhbmQgV0FTQVBJIGlzIGluaXRpYWxpemVkIGluIGFuIGV2ZW50IGRyaXZlbiBtb2RlLgotICAvLyBOb3RlIHRoYXQsIHxobnNCdWZmZXJEdXJhdGlvbnwgaXMgc2V0IG9mIDAsIHdoaWNoIGVuc3VyZXMgdGhhdCB0aGUKLSAgLy8gYnVmZmVyIGlzIG5ldmVyIHNtYWxsZXIgdGhhbiB0aGUgbWluaW11bSBidWZmZXIgc2l6ZSBuZWVkZWQgdG8gZW5zdXJlCi0gIC8vIHRoYXQgZ2xpdGNoZXMgZG8gbm90IG9jY3VyIGJldHdlZW4gdGhlIHBlcmlvZGljIHByb2Nlc3NpbmcgcGFzc2VzLgotICAvLyBUaGlzIHNldHRpbmcgc2hvdWxkIGxlYWQgdG8gbG93ZXN0IHBvc3NpYmxlIGxhdGVuY3kuCi0gIEhSRVNVTFQgaHIgPSBhdWRpb19jbGllbnRfLT5Jbml0aWFsaXplKEFVRENMTlRfU0hBUkVNT0RFX1NIQVJFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVEQ0xOVF9TVFJFQU1GTEFHU19FVkVOVENBTExCQUNLIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVEQ0xOVF9TVFJFQU1GTEFHU19OT1BFUlNJU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBobnNCdWZmZXJEdXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gIGlmIChGQUlMRUQoaHIpKQotICAgIHJldHVybiBocjsKLQotICAvLyBSZXRyaWV2ZSB0aGUgbGVuZ3RoIG9mIHRoZSBlbmRwb2ludCBidWZmZXIgc2hhcmVkIGJldHdlZW4gdGhlIGNsaWVudAotICAvLyBhbmQgdGhlIGF1ZGlvIGVuZ2luZS4gVGhlIGJ1ZmZlciBsZW5ndGggZGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBhbW91bnQKLSAgLy8gb2YgY2FwdHVyZSBkYXRhIHRoYXQgdGhlIGF1ZGlvIGVuZ2luZSBjYW4gcmVhZCBmcm9tIHRoZSBlbmRwb2ludCBidWZmZXIKLSAgLy8gZHVyaW5nIGEgc2luZ2xlIHByb2Nlc3NpbmcgcGFzcy4KLSAgLy8gQSB0eXBpY2FsIHZhbHVlIGlzIDk2MCBhdWRpbyBmcmFtZXMgPD0+IDIwbXMgQCA0OGtIeiBzYW1wbGUgcmF0ZS4KLSAgaHIgPSBhdWRpb19jbGllbnRfLT5HZXRCdWZmZXJTaXplKCZlbmRwb2ludF9idWZmZXJfc2l6ZV9mcmFtZXNfKTsKLSAgaWYgKEZBSUxFRChocikpCi0gICAgcmV0dXJuIGhyOwotICBEVkxPRygxKSA8PCAiZW5kcG9pbnQgYnVmZmVyIHNpemU6ICIgPDwgZW5kcG9pbnRfYnVmZmVyX3NpemVfZnJhbWVzXwotICAgICAgICAgICA8PCAiIFtmcmFtZXNdIjsKLQotI2lmbmRlZiBOREVCVUcKLSAgLy8gVGhlIHBlcmlvZCBiZXR3ZWVuIHByb2Nlc3NpbmcgcGFzc2VzIGJ5IHRoZSBhdWRpbyBlbmdpbmUgaXMgZml4ZWQgZm9yIGEKLSAgLy8gcGFydGljdWxhciBhdWRpbyBlbmRwb2ludCBkZXZpY2UgYW5kIHJlcHJlc2VudHMgdGhlIHNtYWxsZXN0IHByb2Nlc3NpbmcKLSAgLy8gcXVhbnR1bSBmb3IgdGhlIGF1ZGlvIGVuZ2luZS4gVGhpcyBwZXJpb2QgcGx1cyB0aGUgc3RyZWFtIGxhdGVuY3kgYmV0d2VlbgotICAvLyB0aGUgYnVmZmVyIGFuZCBlbmRwb2ludCBkZXZpY2UgcmVwcmVzZW50cyB0aGUgbWluaW11bSBwb3NzaWJsZSBsYXRlbmN5Ci0gIC8vIHRoYXQgYW4gYXVkaW8gYXBwbGljYXRpb24gY2FuIGFjaGlldmUuCi0gIC8vIFRPRE8oaGVucmlrYSk6IHBvc3NpYmx5IHJlbW92ZSB0aGlzIHNlY3Rpb24gd2hlbiBhbGwgcGFydHMgYXJlIHJlYWR5LgotICBSRUZFUkVOQ0VfVElNRSBkZXZpY2VfcGVyaW9kX3NoYXJlZF9tb2RlID0gMDsKLSAgUkVGRVJFTkNFX1RJTUUgZGV2aWNlX3BlcmlvZF9leGNsdXNpdmVfbW9kZSA9IDA7Ci0gIEhSRVNVTFQgaHJfZGJnID0gYXVkaW9fY2xpZW50Xy0+R2V0RGV2aWNlUGVyaW9kKAotICAgICAgJmRldmljZV9wZXJpb2Rfc2hhcmVkX21vZGUsICZkZXZpY2VfcGVyaW9kX2V4Y2x1c2l2ZV9tb2RlKTsKLSAgaWYgKFNVQ0NFRURFRChocl9kYmcpKSB7Ci0gICAgRFZMT0coMSkgPDwgImRldmljZSBwZXJpb2Q6ICIKLSAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxkb3VibGU+KGRldmljZV9wZXJpb2Rfc2hhcmVkX21vZGUgLyAxMDAwMC4wKQotICAgICAgICAgICAgIDw8ICIgW21zXSI7Ci0gIH0KLQotICBSRUZFUkVOQ0VfVElNRSBsYXRlbmN5ID0gMDsKLSAgaHJfZGJnID0gYXVkaW9fY2xpZW50Xy0+R2V0U3RyZWFtTGF0ZW5jeSgmbGF0ZW5jeSk7Ci0gIGlmIChTVUNDRUVERUQoaHJfZGJnKSkgewotICAgIERWTE9HKDEpIDw8ICJzdHJlYW0gbGF0ZW5jeTogIiA8PCBzdGF0aWNfY2FzdDxkb3VibGU+KGxhdGVuY3kgLyAxMDAwMC4wKQotICAgICAgICAgICAgIDw8ICIgW21zXSI7Ci0gIH0KLSNlbmRpZgotCi0gIC8vIFNldCB0aGUgZXZlbnQgaGFuZGxlIHRoYXQgdGhlIGF1ZGlvIGVuZ2luZSB3aWxsIHNpZ25hbCBlYWNoIHRpbWUKLSAgLy8gYSBidWZmZXIgYmVjb21lcyByZWFkeSB0byBiZSBwcm9jZXNzZWQgYnkgdGhlIGNsaWVudC4KLSAgaHIgPSBhdWRpb19jbGllbnRfLT5TZXRFdmVudEhhbmRsZShhdWRpb19zYW1wbGVzX3JlYWR5X2V2ZW50Xy5HZXQoKSk7Ci0gIGlmIChGQUlMRUQoaHIpKQotICAgIHJldHVybiBocjsKLQotICAvLyBHZXQgYWNjZXNzIHRvIHRoZSBJQXVkaW9DYXB0dXJlQ2xpZW50IGludGVyZmFjZS4gVGhpcyBpbnRlcmZhY2UKLSAgLy8gZW5hYmxlcyB1cyB0byByZWFkIGlucHV0IGRhdGEgZnJvbSB0aGUgY2FwdHVyZSBlbmRwb2ludCBidWZmZXIuCi0gIGhyID0gYXVkaW9fY2xpZW50Xy0+R2V0U2VydmljZShfX3V1aWRvZihJQXVkaW9DYXB0dXJlQ2xpZW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NhcHR1cmVfY2xpZW50Xy5SZWNlaXZlVm9pZCgpKTsKLSAgaWYgKEZBSUxFRChocikpCi0gICAgcmV0dXJuIGhyOwotCi0gIC8vIE9idGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgSVNpbXBsZUF1ZGlvVm9sdW1lIGludGVyZmFjZSB3aGljaCBlbmFibGVzCi0gIC8vIHVzIHRvIGNvbnRyb2wgdGhlIG1hc3RlciB2b2x1bWUgbGV2ZWwgb2YgYW4gYXVkaW8gc2Vzc2lvbi4KLSAgaHIgPSBhdWRpb19jbGllbnRfLT5HZXRTZXJ2aWNlKF9fdXVpZG9mKElTaW1wbGVBdWRpb1ZvbHVtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGVfYXVkaW9fdm9sdW1lXy5SZWNlaXZlVm9pZCgpKTsKLSAgcmV0dXJuIGhyOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby93aW4vYXVkaW9fbG93X2xhdGVuY3lfaW5wdXRfd2luLmggYi9zcmMvbWVkaWEvYXVkaW8vd2luL2F1ZGlvX2xvd19sYXRlbmN5X2lucHV0X3dpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODNmYzkyLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby93aW4vYXVkaW9fbG93X2xhdGVuY3lfaW5wdXRfd2luLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLS8vCi0vLyBJbXBsZW1lbnRhdGlvbiBvZiBBdWRpb0lucHV0U3RyZWFtIGZvciBXaW5kb3dzIHVzaW5nIFdpbmRvd3MgQ29yZSBBdWRpbwotLy8gV0FTQVBJIGZvciBsb3cgbGF0ZW5jeSBjYXB0dXJpbmcuCi0vLwotLy8gT3ZlcnZpZXcgb2Ygb3BlcmF0aW9uOgotLy8KLS8vIC0gQW4gb2JqZWN0IG9mIFdBU0FQSUF1ZGlvSW5wdXRTdHJlYW0gaXMgY3JlYXRlZCBieSB0aGUgQXVkaW9NYW5hZ2VyCi0vLyAgIGZhY3RvcnkuCi0vLyAtIE5leHQgc29tZSB0aHJlYWQgd2lsbCBjYWxsIE9wZW4oKSwgYXQgdGhhdCBwb2ludCB0aGUgdW5kZXJseWluZwotLy8gICBDb3JlIEF1ZGlvIEFQSXMgYXJlIHV0aWxpemVkIHRvIGNyZWF0ZSB0d28gV0FTQVBJIGludGVyZmFjZXMgY2FsbGVkCi0vLyAgIElBdWRpb0NsaWVudCBhbmQgSUF1ZGlvQ2FwdHVyZUNsaWVudC4KLS8vIC0gVGhlbiBzb21lIHRocmVhZCB3aWxsIGNhbGwgU3RhcnQoc2luaykuCi0vLyAgIEEgdGhyZWFkIGNhbGxlZCAid2FzYXBpX2NhcHR1cmVfdGhyZWFkIiBpcyBzdGFydGVkIGFuZCB0aGlzIHRocmVhZCBsaXN0ZW5zCi0vLyAgIG9uIGFuIGV2ZW50IHNpZ25hbCB3aGljaCBpcyBzZXQgcGVyaW9kaWNhbGx5IGJ5IHRoZSBhdWRpbyBlbmdpbmUgZm9yCi0vLyAgIGVhY2ggcmVjb3JkZWQgZGF0YSBwYWNrZXQuIEFzIGEgcmVzdWx0LCBkYXRhIHNhbXBsZXMgd2lsbCBiZSBwcm92aWRlZAotLy8gICB0byB0aGUgcmVnaXN0ZXJlZCBzaW5rLgotLy8gLSBBdCBzb21lIHBvaW50LCBhIHRocmVhZCB3aWxsIGNhbGwgU3RvcCgpLCB3aGljaCBzdG9wcyBhbmQgam9pbnMgdGhlCi0vLyAgIGNhcHR1cmUgdGhyZWFkIGFuZCBhdCB0aGUgc2FtZSB0aW1lIHN0b3BzIGF1ZGlvIHN0cmVhbWluZy4KLS8vIC0gVGhlIHNhbWUgdGhyZWFkIHRoYXQgY2FsbGVkIHN0b3Agd2lsbCBjYWxsIENsb3NlKCkgd2hlcmUgd2UgY2xlYW51cAotLy8gICBhbmQgbm90aWZ5IHRoZSBhdWRpbyBtYW5hZ2VyLCB3aGljaCBsaWtlbHkgd2lsbCBkZXN0cm95IHRoaXMgb2JqZWN0LgotLy8KLS8vIEltcGxlbWVudGF0aW9uIG5vdGVzOgotLy8KLS8vIC0gVGhlIG1pbmltdW0gc3VwcG9ydGVkIGNsaWVudCBpcyBXaW5kb3dzIFZpc3RhLgotLy8gLSBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHNpbmdsZS10aHJlYWRlZCwgaGVuY2U6Ci0vLyAgICBvIENvbnN0cnVjdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gbXVzdCB0YWtlIHBsYWNlIGZyb20gdGhlIHNhbWUgdGhyZWFkLgotLy8gICAgbyBJdCBpcyByZWNvbW1lbmRlZCB0byBjYWxsIGFsbCBBUElzIGZyb20gdGhlIHNhbWUgdGhyZWFkIGFzIHdlbGwuCi0vLyAtIEl0IGlzIHJlY29tbWVuZGVkIHRvIGZpcnN0IGFjcXVpcmUgdGhlIG5hdGl2ZSBzYW1wbGUgcmF0ZSBvZiB0aGUgZGVmYXVsdAotLy8gICBpbnB1dCBkZXZpY2UgYW5kIHRoZW4gdXNlIHRoZSBzYW1lIHJhdGUgd2hlbiBjcmVhdGluZyB0aGlzIG9iamVjdC4gVXNlCi0vLyAgIFdBU0FQSUF1ZGlvSW5wdXRTdHJlYW06OkhhcmR3YXJlU2FtcGxlUmF0ZSgpIHRvIHJldHJpZXZlIHRoZSBzYW1wbGUgcmF0ZS4KLS8vIC0gQ2FsbGluZyBDbG9zZSgpIGFsc28gbGVhZHMgdG8gc2VsZiBkZXN0cnVjdGlvbi4KLS8vCi0vLyBDb3JlIEF1ZGlvIEFQSSBkZXRhaWxzOgotLy8KLS8vIC0gVXRpbGl6ZWQgTU1EZXZpY2UgaW50ZXJmYWNlczoKLS8vICAgICBvIElNTURldmljZUVudW1lcmF0b3IKLS8vICAgICBvIElNTURldmljZQotLy8gLSBVdGlsaXplZCBXQVNBUEkgaW50ZXJmYWNlczoKLS8vICAgICBvIElBdWRpb0NsaWVudAotLy8gICAgIG8gSUF1ZGlvQ2FwdHVyZUNsaWVudAotLy8gLSBUaGUgc3RyZWFtIGlzIGluaXRpYWxpemVkIGluIHNoYXJlZCBtb2RlIGFuZCB0aGUgcHJvY2Vzc2luZyBvZiB0aGUKLS8vICAgYXVkaW8gYnVmZmVyIGlzIGV2ZW50IGRyaXZlbi4KLS8vIC0gVGhlIE11bHRpbWVkaWEgQ2xhc3MgU2NoZWR1bGVyIHNlcnZpY2UgKE1NQ1NTKSBpcyB1dGlsaXplZCB0byBib29zdAotLy8gICB0aGUgcHJpb3JpdHkgb2YgdGhlIGNhcHR1cmUgdGhyZWFkLgotLy8gLSBBdWRpbyBhcHBsaWNhdGlvbnMgdGhhdCB1c2UgdGhlIE1NRGV2aWNlIEFQSSBhbmQgV0FTQVBJIHR5cGljYWxseSB1c2UKLS8vICAgdGhlIElTaW1wbGVBdWRpb1ZvbHVtZSBpbnRlcmZhY2UgdG8gbWFuYWdlIHN0cmVhbSB2b2x1bWUgbGV2ZWxzIG9uIGEKLS8vICAgcGVyLXNlc3Npb24gYmFzaXMuIEl0IGlzIGFsc28gcG9zc2libGUgdG8gdXNlIG9mIHRoZSBJQXVkaW9FbmRwb2ludFZvbHVtZQotLy8gICBpbnRlcmZhY2UgdG8gY29udHJvbCB0aGUgbWFzdGVyIHZvbHVtZSBsZXZlbCBvZiBhbiBhdWRpbyBlbmRwb2ludCBkZXZpY2UuCi0vLyAgIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgdXNpbmcgdGhlIElTaW1wbGVBdWRpb1ZvbHVtZSBpbnRlcmZhY2UuCi0vLyAgIE1TRE4gc3RhdGVzIHRoYXQgIkluIHJhcmUgY2FzZXMsIGEgc3BlY2lhbGl6ZWQgYXVkaW8gYXBwbGljYXRpb24gbWlnaHQKLS8vICAgcmVxdWlyZSB0aGUgdXNlIG9mIHRoZSBJQXVkaW9FbmRwb2ludFZvbHVtZSIuCi0vLwotI2lmbmRlZiBNRURJQV9BVURJT19XSU5fQVVESU9fTE9XX0xBVEVOQ1lfSU5QVVRfV0lOX0hfCi0jZGVmaW5lIE1FRElBX0FVRElPX1dJTl9BVURJT19MT1dfTEFURU5DWV9JTlBVVF9XSU5fSF8KLQotI2luY2x1ZGUgPEF1ZGlvY2xpZW50Lmg+Ci0jaW5jbHVkZSA8TU1EZXZpY2VBUEkuaD4KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvY29tcGlsZXJfc3BlY2lmaWMuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy9ub25fdGhyZWFkX3NhZmUuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy9wbGF0Zm9ybV90aHJlYWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy9zaW1wbGVfdGhyZWFkLmgiCi0jaW5jbHVkZSAiYmFzZS93aW4vc2NvcGVkX2NvX21lbS5oIgotI2luY2x1ZGUgImJhc2Uvd2luL3Njb3BlZF9jb21faW5pdGlhbGl6ZXIuaCIKLSNpbmNsdWRlICJiYXNlL3dpbi9zY29wZWRfY29tcHRyLmgiCi0jaW5jbHVkZSAiYmFzZS93aW4vc2NvcGVkX2hhbmRsZS5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX2lucHV0X3N0cmVhbV9pbXBsLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fcGFyYW1ldGVycy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIEF1ZGlvTWFuYWdlcldpbjsKLQotLy8gQXVkaW9JbnB1dFN0cmVhbSBpbXBsZW1lbnRhdGlvbiB1c2luZyBXaW5kb3dzIENvcmUgQXVkaW8gQVBJcy4KLWNsYXNzIE1FRElBX0VYUE9SVCBXQVNBUElBdWRpb0lucHV0U3RyZWFtCi0gICAgOiBwdWJsaWMgQXVkaW9JbnB1dFN0cmVhbUltcGwsCi0gICAgICBwdWJsaWMgYmFzZTo6RGVsZWdhdGVTaW1wbGVUaHJlYWQ6OkRlbGVnYXRlLAotICAgICAgTk9OX0VYUE9SVEVEX0JBU0UocHVibGljIGJhc2U6Ok5vblRocmVhZFNhZmUpIHsKLSBwdWJsaWM6Ci0gIC8vIFRoZSBjdG9yIHRha2VzIGFsbCB0aGUgdXN1YWwgcGFyYW1ldGVycywgcGx1cyB8bWFuYWdlcnwgd2hpY2ggaXMgdGhlCi0gIC8vIHRoZSBhdWRpbyBtYW5hZ2VyIHdobyBpcyBjcmVhdGluZyB0aGlzIG9iamVjdC4KLSAgV0FTQVBJQXVkaW9JbnB1dFN0cmVhbShBdWRpb01hbmFnZXJXaW4qIG1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCk7Ci0gIC8vIFRoZSBkdG9yIGlzIHR5cGljYWxseSBjYWxsZWQgYnkgdGhlIEF1ZGlvTWFuYWdlciBvbmx5IGFuZCBpdCBpcyB1c3VhbGx5Ci0gIC8vIHRyaWdnZXJlZCBieSBjYWxsaW5nIEF1ZGlvSW5wdXRTdHJlYW06OkNsb3NlKCkuCi0gIHZpcnR1YWwgfldBU0FQSUF1ZGlvSW5wdXRTdHJlYW0oKTsKLQotICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBBdWRpb0lucHV0U3RyZWFtLgotICB2aXJ0dWFsIGJvb2wgT3BlbigpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU3RhcnQoQXVkaW9JbnB1dENhbGxiYWNrKiBjYWxsYmFjaykgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTdG9wKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBDbG9zZSgpIE9WRVJSSURFOwotICB2aXJ0dWFsIGRvdWJsZSBHZXRNYXhWb2x1bWUoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFNldFZvbHVtZShkb3VibGUgdm9sdW1lKSBPVkVSUklERTsKLSAgdmlydHVhbCBkb3VibGUgR2V0Vm9sdW1lKCkgT1ZFUlJJREU7Ci0KLSAgLy8gUmV0cmlldmVzIHRoZSBzYW1wbGUgcmF0ZSB1c2VkIGJ5IHRoZSBhdWRpbyBlbmdpbmUgZm9yIGl0cyBpbnRlcm5hbAotICAvLyBwcm9jZXNzaW5nL21peGluZyBvZiBzaGFyZWQtbW9kZSBzdHJlYW1zIGdpdmVuIGEgc3BlY2lmZWQgZGV2aWNlLgotICBzdGF0aWMgaW50IEhhcmR3YXJlU2FtcGxlUmF0ZShjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2lkKTsKLQotICAvLyBSZXRyaWV2ZXMgdGhlIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyB1c2VkIGJ5IHRoZSBhdWRpbyBlbmdpbmUgZm9yIGl0cwotICAvLyBpbnRlcm5hbCBwcm9jZXNzaW5nL21peGluZyBvZiBzaGFyZWQtbW9kZSBzdHJlYW1zIGdpdmVuIGEgc3BlY2lmaWVkIGRldmljZS4KLSAgc3RhdGljIHVpbnQzMiBIYXJkd2FyZUNoYW5uZWxDb3VudChjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2lkKTsKLQotICBib29sIHN0YXJ0ZWQoKSBjb25zdCB7IHJldHVybiBzdGFydGVkXzsgfQotCi0gcHJpdmF0ZToKLSAgLy8gRGVsZWdhdGVTaW1wbGVUaHJlYWQ6OkRlbGVnYXRlIGltcGxlbWVudGF0aW9uLgotICB2aXJ0dWFsIHZvaWQgUnVuKCkgT1ZFUlJJREU7Ci0KLSAgLy8gSXNzdWVzIHRoZSBPbkVycm9yKCkgY2FsbGJhY2sgdG8gdGhlIHxzaW5rX3wuCi0gIHZvaWQgSGFuZGxlRXJyb3IoSFJFU1VMVCBlcnIpOwotCi0gIC8vIFRoZSBPcGVuKCkgbWV0aG9kIGlzIGRpdmlkZWQgaW50byB0aGVzZSBzdWIgbWV0aG9kcy4KLSAgSFJFU1VMVCBTZXRDYXB0dXJlRGV2aWNlKCk7Ci0gIEhSRVNVTFQgQWN0aXZhdGVDYXB0dXJlRGV2aWNlKCk7Ci0gIEhSRVNVTFQgR2V0QXVkaW9FbmdpbmVTdHJlYW1Gb3JtYXQoKTsKLSAgYm9vbCBEZXNpcmVkRm9ybWF0SXNTdXBwb3J0ZWQoKTsKLSAgSFJFU1VMVCBJbml0aWFsaXplQXVkaW9FbmdpbmUoKTsKLQotICAvLyBSZXRyaWV2ZXMgdGhlIHN0cmVhbSBmb3JtYXQgdGhhdCB0aGUgYXVkaW8gZW5naW5lIHVzZXMgZm9yIGl0cyBpbnRlcm5hbAotICAvLyBwcm9jZXNzaW5nL21peGluZyBvZiBzaGFyZWQtbW9kZSBzdHJlYW1zLgotICBzdGF0aWMgSFJFU1VMVCBHZXRNaXhGb3JtYXQoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdBVkVGT1JNQVRFWCoqIGRldmljZV9mb3JtYXQpOwotCi0gIC8vIE91ciBjcmVhdG9yLCB0aGUgYXVkaW8gbWFuYWdlciBuZWVkcyB0byBiZSBub3RpZmllZCB3aGVuIHdlIGNsb3NlLgotICBBdWRpb01hbmFnZXJXaW4qIG1hbmFnZXJfOwotCi0gIC8vIENhcHR1cmluZyBpcyBkcml2ZW4gYnkgdGhpcyB0aHJlYWQgKHdoaWNoIGhhcyBubyBtZXNzYWdlIGxvb3ApLgotICAvLyBBbGwgT25EYXRhKCkgY2FsbGJhY2tzIHdpbGwgYmUgY2FsbGVkIGZyb20gdGhpcyB0aHJlYWQuCi0gIGJhc2U6OkRlbGVnYXRlU2ltcGxlVGhyZWFkKiBjYXB0dXJlX3RocmVhZF87Ci0KLSAgLy8gQ29udGFpbnMgdGhlIGRlc2lyZWQgYXVkaW8gZm9ybWF0IHdoaWNoIGlzIHNldCB1cCBhdCBjb25zdHJ1Y3Rpb24uCi0gIFdBVkVGT1JNQVRFWCBmb3JtYXRfOwotCi0gIGJvb2wgb3BlbmVkXzsKLSAgYm9vbCBzdGFydGVkXzsKLQotICAvLyBTaXplIGluIGJ5dGVzIG9mIGVhY2ggYXVkaW8gZnJhbWUgKDQgYnl0ZXMgZm9yIDE2LWJpdCBzdGVyZW8gUENNKQotICBzaXplX3QgZnJhbWVfc2l6ZV87Ci0KLSAgLy8gU2l6ZSBpbiBhdWRpbyBmcmFtZXMgb2YgZWFjaCBhdWRpbyBwYWNrZXQgd2hlcmUgYW4gYXVkaW8gcGFja2V0Ci0gIC8vIGlzIGRlZmluZWQgYXMgdGhlIGJsb2NrIG9mIGRhdGEgd2hpY2ggdGhlIHVzZXIgcmVjZWl2ZWQgaW4gZWFjaAotICAvLyBPbkRhdGEoKSBjYWxsYmFjay4KLSAgc2l6ZV90IHBhY2tldF9zaXplX2ZyYW1lc187Ci0KLSAgLy8gU2l6ZSBpbiBieXRlcyBvZiBlYWNoIGF1ZGlvIHBhY2tldC4KLSAgc2l6ZV90IHBhY2tldF9zaXplX2J5dGVzXzsKLQotICAvLyBMZW5ndGggb2YgdGhlIGF1ZGlvIGVuZHBvaW50IGJ1ZmZlci4KLSAgc2l6ZV90IGVuZHBvaW50X2J1ZmZlcl9zaXplX2ZyYW1lc187Ci0KLSAgLy8gQ29udGFpbnMgdGhlIHVuaXF1ZSBuYW1lIG9mIHRoZSBzZWxlY3RlZCBlbmRwb2ludCBkZXZpY2UuCi0gIC8vIE5vdGUgdGhhdCBBdWRpb01hbmFnZXJCYXNlOjprRGVmYXVsdERldmljZUlkIHJlcHJlc2VudHMgdGhlIGRlZmF1bHQKLSAgLy8gZGV2aWNlIHJvbGUgYW5kIGlzIG5vdCBhIHZhbGlkIElEIGFzIHN1Y2guCi0gIHN0ZDo6c3RyaW5nIGRldmljZV9pZF87Ci0KLSAgLy8gQ29udmVyc2lvbiBmYWN0b3IgdXNlZCBpbiBkZWxheS1lc3RpbWF0aW9uIGNhbGN1bGF0aW9ucy4KLSAgLy8gQ29udmVydHMgYSByYXcgcGVyZm9ybWFuY2UgY291bnRlciB2YWx1ZSB0byAxMDAtbmFub3NlY29uZCB1bml0LgotICBkb3VibGUgcGVyZl9jb3VudF90b18xMDBuc191bml0c187Ci0KLSAgLy8gQ29udmVyc2lvbiBmYWN0b3IgdXNlZCBpbiBkZWxheS1lc3RpbWF0aW9uIGNhbGN1bGF0aW9ucy4KLSAgLy8gQ29udmVydHMgZnJvbSBtaWxsaXNlY29uZHMgdG8gYXVkaW8gZnJhbWVzLgotICBkb3VibGUgbXNfdG9fZnJhbWVfY291bnRfOwotCi0gIC8vIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUgcmVjb3JkZWQgYXVkaW8gc2FtcGxlcy4KLSAgQXVkaW9JbnB1dENhbGxiYWNrKiBzaW5rXzsKLQotICAvLyBXaW5kb3dzIE11bHRpbWVkaWEgRGV2aWNlIChNTURldmljZSkgQVBJIGludGVyZmFjZXMuCi0KLSAgLy8gQW4gSU1NRGV2aWNlIGludGVyZmFjZSB3aGljaCByZXByZXNlbnRzIGFuIGF1ZGlvIGVuZHBvaW50IGRldmljZS4KLSAgYmFzZTo6d2luOjpTY29wZWRDb21QdHI8SU1NRGV2aWNlPiBlbmRwb2ludF9kZXZpY2VfOwotCi0gIC8vIFdpbmRvd3MgQXVkaW8gU2Vzc2lvbiBBUEkgKFdBU0FQKSBpbnRlcmZhY2VzLgotCi0gIC8vIEFuIElBdWRpb0NsaWVudCBpbnRlcmZhY2Ugd2hpY2ggZW5hYmxlcyBhIGNsaWVudCB0byBjcmVhdGUgYW5kIGluaXRpYWxpemUKLSAgLy8gYW4gYXVkaW8gc3RyZWFtIGJldHdlZW4gYW4gYXVkaW8gYXBwbGljYXRpb24gYW5kIHRoZSBhdWRpbyBlbmdpbmUuCi0gIGJhc2U6Ondpbjo6U2NvcGVkQ29tUHRyPElBdWRpb0NsaWVudD4gYXVkaW9fY2xpZW50XzsKLQotICAvLyBUaGUgSUF1ZGlvQ2FwdHVyZUNsaWVudCBpbnRlcmZhY2UgZW5hYmxlcyBhIGNsaWVudCB0byByZWFkIGlucHV0IGRhdGEKLSAgLy8gZnJvbSBhIGNhcHR1cmUgZW5kcG9pbnQgYnVmZmVyLgotICBiYXNlOjp3aW46OlNjb3BlZENvbVB0cjxJQXVkaW9DYXB0dXJlQ2xpZW50PiBhdWRpb19jYXB0dXJlX2NsaWVudF87Ci0KLSAgLy8gVGhlIElTaW1wbGVBdWRpb1ZvbHVtZSBpbnRlcmZhY2UgZW5hYmxlcyBhIGNsaWVudCB0byBjb250cm9sIHRoZQotICAvLyBtYXN0ZXIgdm9sdW1lIGxldmVsIG9mIGFuIGF1ZGlvIHNlc3Npb24uCi0gIC8vIFRoZSB2b2x1bWUtbGV2ZWwgaXMgYSB2YWx1ZSBpbiB0aGUgcmFuZ2UgMC4wIHRvIDEuMC4KLSAgLy8gVGhpcyBpbnRlcmZhY2UgZG9lcyBvbmx5IHdvcmsgd2l0aCBzaGFyZWQtbW9kZSBzdHJlYW1zLgotICBiYXNlOjp3aW46OlNjb3BlZENvbVB0cjxJU2ltcGxlQXVkaW9Wb2x1bWU+IHNpbXBsZV9hdWRpb192b2x1bWVfOwotCi0gIC8vIFRoZSBhdWRpbyBlbmdpbmUgd2lsbCBzaWduYWwgdGhpcyBldmVudCBlYWNoIHRpbWUgYSBidWZmZXIgaGFzIGJlZW4KLSAgLy8gcmVjb3JkZWQuCi0gIGJhc2U6Ondpbjo6U2NvcGVkSGFuZGxlIGF1ZGlvX3NhbXBsZXNfcmVhZHlfZXZlbnRfOwotCi0gIC8vIFRoaXMgZXZlbnQgd2lsbCBiZSBzaWduYWxlZCB3aGVuIGNhcHR1cmluZyBzaGFsbCBzdG9wLgotICBiYXNlOjp3aW46OlNjb3BlZEhhbmRsZSBzdG9wX2NhcHR1cmVfZXZlbnRfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihXQVNBUElBdWRpb0lucHV0U3RyZWFtKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0FVRElPX1dJTl9BVURJT19MT1dfTEFURU5DWV9JTlBVVF9XSU5fSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby93aW4vYXVkaW9fbG93X2xhdGVuY3lfaW5wdXRfd2luX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2F1ZGlvL3dpbi9hdWRpb19sb3dfbGF0ZW5jeV9pbnB1dF93aW5fdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYWEzNTIuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL3dpbi9hdWRpb19sb3dfbGF0ZW5jeV9pbnB1dF93aW5fdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MDUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDxtbXN5c3RlbS5oPgotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImJhc2UvZmlsZV91dGlsLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wLmgiCi0jaW5jbHVkZSAiYmFzZS9wYXRoX3NlcnZpY2UuaCIKLSNpbmNsdWRlICJiYXNlL3Rlc3QvdGVzdF90aW1lb3V0cy5oIgotI2luY2x1ZGUgImJhc2Uvd2luL3Njb3BlZF9jb21faW5pdGlhbGl6ZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19pby5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX21hbmFnZXJfYmFzZS5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3dpbi9hdWRpb19sb3dfbGF0ZW5jeV9pbnB1dF93aW4uaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby93aW4vY29yZV9hdWRpb191dGlsX3dpbi5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2Vla2FibGVfYnVmZmVyLmgiCi0jaW5jbHVkZSAidGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0KLXVzaW5nIGJhc2U6Ondpbjo6U2NvcGVkQ09NSW5pdGlhbGl6ZXI7Ci11c2luZyA6OnRlc3Rpbmc6Ol87Ci11c2luZyA6OnRlc3Rpbmc6OkFueU51bWJlcjsKLXVzaW5nIDo6dGVzdGluZzo6QXRMZWFzdDsKLXVzaW5nIDo6dGVzdGluZzo6R3Q7Ci11c2luZyA6OnRlc3Rpbmc6Ok5vdE51bGw7Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLUFDVElPTl9QMyhDaGVja0NvdW50QW5kUG9zdFF1aXRUYXNrLCBjb3VudCwgbGltaXQsIGxvb3ApIHsKLSAgaWYgKCsrKmNvdW50ID49IGxpbWl0KSB7Ci0gICAgbG9vcC0+UG9zdFRhc2soRlJPTV9IRVJFLCBNZXNzYWdlTG9vcDo6UXVpdENsb3N1cmUoKSk7Ci0gIH0KLX0KLQotY2xhc3MgTW9ja0F1ZGlvSW5wdXRDYWxsYmFjayA6IHB1YmxpYyBBdWRpb0lucHV0U3RyZWFtOjpBdWRpb0lucHV0Q2FsbGJhY2sgewotIHB1YmxpYzoKLSAgTU9DS19NRVRIT0Q1KE9uRGF0YSwgdm9pZChBdWRpb0lucHV0U3RyZWFtKiBzdHJlYW0sCi0gICAgICBjb25zdCB1aW50OCogc3JjLCB1aW50MzIgc2l6ZSwKLSAgICAgIHVpbnQzMiBoYXJkd2FyZV9kZWxheV9ieXRlcywgZG91YmxlIHZvbHVtZSkpOwotICBNT0NLX01FVEhPRDEoT25DbG9zZSwgdm9pZChBdWRpb0lucHV0U3RyZWFtKiBzdHJlYW0pKTsKLSAgTU9DS19NRVRIT0QyKE9uRXJyb3IsIHZvaWQoQXVkaW9JbnB1dFN0cmVhbSogc3RyZWFtLCBpbnQgY29kZSkpOwotfTsKLQotLy8gVGhpcyBhdWRpbyBzaW5rIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSB1c2VkIGZvciBtYW51YWwgdGVzdHMgb25seSBzaW5jZQotLy8gdGhlIHJlY29yZGVkIGRhdGEgaXMgc3RvcmVkIG9uIGEgcmF3IGJpbmFyeSBkYXRhIGZpbGUuCi1jbGFzcyBXcml0ZVRvRmlsZUF1ZGlvU2luayA6IHB1YmxpYyBBdWRpb0lucHV0U3RyZWFtOjpBdWRpb0lucHV0Q2FsbGJhY2sgewotIHB1YmxpYzoKLSAgLy8gQWxsb2NhdGUgc3BhY2UgZm9yIH4xMCBzZWNvbmRzIG9mIGRhdGEgQCA0OGtIeiBpbiBzdGVyZW86Ci0gIC8vIDIgYnl0ZXMgcGVyIHNhbXBsZSwgMiBjaGFubmVscywgMTBtcyBAIDQ4a0h6LCAxMCBzZWNvbmRzIDw9PiAxOTIwMDAwIGJ5dGVzLgotICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhCdWZmZXJTaXplID0gMiAqIDIgKiA0ODAgKiAxMDAgKiAxMDsKLQotICBleHBsaWNpdCBXcml0ZVRvRmlsZUF1ZGlvU2luayhjb25zdCBjaGFyKiBmaWxlX25hbWUpCi0gICAgICA6IGJ1ZmZlcl8oMCwga01heEJ1ZmZlclNpemUpLAotICAgICAgICBieXRlc190b193cml0ZV8oMCkgewotICAgIEZpbGVQYXRoIGZpbGVfcGF0aDsKLSAgICBFWFBFQ1RfVFJVRShQYXRoU2VydmljZTo6R2V0KGJhc2U6OkRJUl9FWEUsICZmaWxlX3BhdGgpKTsKLSAgICBmaWxlX3BhdGggPSBmaWxlX3BhdGguQXBwZW5kQVNDSUkoZmlsZV9uYW1lKTsKLSAgICBiaW5hcnlfZmlsZV8gPSBmaWxlX3V0aWw6Ok9wZW5GaWxlKGZpbGVfcGF0aCwgIndiIik7Ci0gICAgRExPR19JRihFUlJPUiwgIWJpbmFyeV9maWxlXykgPDwgIkZhaWxlZCB0byBvcGVuIGJpbmFyeSBQQ00gZGF0YSBmaWxlLiI7Ci0gICAgTE9HKElORk8pIDw8ICI+PiBPdXRwdXQgZmlsZTogIiA8PCBmaWxlX3BhdGgudmFsdWUoKQotICAgICAgICAgICAgICA8PCAiIGhhcyBiZWVuIGNyZWF0ZWQuIjsKLSAgfQotCi0gIHZpcnR1YWwgfldyaXRlVG9GaWxlQXVkaW9TaW5rKCkgewotICAgIHNpemVfdCBieXRlc193cml0dGVuID0gMDsKLSAgICB3aGlsZSAoYnl0ZXNfd3JpdHRlbiA8IGJ5dGVzX3RvX3dyaXRlXykgewotICAgICAgY29uc3QgdWludDgqIGNodW5rOwotICAgICAgaW50IGNodW5rX3NpemU7Ci0KLSAgICAgIC8vIFN0b3Agd3JpdGluZyBpZiBubyBtb3JlIGRhdGEgaXMgYXZhaWxhYmxlLgotICAgICAgaWYgKCFidWZmZXJfLkdldEN1cnJlbnRDaHVuaygmY2h1bmssICZjaHVua19zaXplKSkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIC8vIFdyaXRlIHJlY29yZGVkIGRhdGEgY2h1bmsgdG8gdGhlIGZpbGUgYW5kIHByZXBhcmUgZm9yIG5leHQgY2h1bmsuCi0gICAgICBmd3JpdGUoY2h1bmssIDEsIGNodW5rX3NpemUsIGJpbmFyeV9maWxlXyk7Ci0gICAgICBidWZmZXJfLlNlZWsoY2h1bmtfc2l6ZSk7Ci0gICAgICBieXRlc193cml0dGVuICs9IGNodW5rX3NpemU7Ci0gICAgfQotICAgIGZpbGVfdXRpbDo6Q2xvc2VGaWxlKGJpbmFyeV9maWxlXyk7Ci0gIH0KLQotICAvLyBBdWRpb0lucHV0U3RyZWFtOjpBdWRpb0lucHV0Q2FsbGJhY2sgaW1wbGVtZW50YXRpb24uCi0gIHZpcnR1YWwgdm9pZCBPbkRhdGEoQXVkaW9JbnB1dFN0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDMyIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDMyIGhhcmR3YXJlX2RlbGF5X2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2b2x1bWUpIHsKLSAgICAvLyBTdG9yZSBkYXRhIGRhdGEgaW4gYSB0ZW1wb3JhcnkgYnVmZmVyIHRvIGF2b2lkIG1ha2luZyBibG9ja2luZwotICAgIC8vIGZ3cml0ZSgpIGNhbGxzIGluIHRoZSBhdWRpbyBjYWxsYmFjay4gVGhlIGNvbXBsZXRlIGJ1ZmZlciB3aWxsIGJlCi0gICAgLy8gd3JpdHRlbiB0byBmaWxlIGluIHRoZSBkZXN0cnVjdG9yLgotICAgIGlmIChidWZmZXJfLkFwcGVuZChzcmMsIHNpemUpKSB7Ci0gICAgICBieXRlc190b193cml0ZV8gKz0gc2l6ZTsKLSAgICB9Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgT25DbG9zZShBdWRpb0lucHV0U3RyZWFtKiBzdHJlYW0pIHt9Ci0gIHZpcnR1YWwgdm9pZCBPbkVycm9yKEF1ZGlvSW5wdXRTdHJlYW0qIHN0cmVhbSwgaW50IGNvZGUpIHt9Ci0KLSBwcml2YXRlOgotICBtZWRpYTo6U2Vla2FibGVCdWZmZXIgYnVmZmVyXzsKLSAgRklMRSogYmluYXJ5X2ZpbGVfOwotICBzaXplX3QgYnl0ZXNfdG9fd3JpdGVfOwotfTsKLQotLy8gQ29udmVuaWVuY2UgbWV0aG9kIHdoaWNoIGVuc3VyZXMgdGhhdCB3ZSBhcmUgbm90IHJ1bm5pbmcgb24gdGhlIGJ1aWxkCi0vLyBib3RzIGFuZCB0aGF0IGF0IGxlYXN0IG9uZSB2YWxpZCBpbnB1dCBkZXZpY2UgY2FuIGJlIGZvdW5kLiBXZSBhbHNvCi0vLyB2ZXJpZnkgdGhhdCB3ZSBhcmUgbm90IHJ1bm5pbmcgb24gWFAgc2luY2UgdGhlIGxvdy1sYXRlbmN5IChXQVNBUEktCi0vLyBiYXNlZCkgdmVyc2lvbiByZXF1aXJlcyBXaW5kb3dzIFZpc3RhIG9yIGhpZ2hlci4KLXN0YXRpYyBib29sIENhblJ1bkF1ZGlvVGVzdHMoQXVkaW9NYW5hZ2VyKiBhdWRpb19tYW4pIHsKLSAgaWYgKCFDb3JlQXVkaW9VdGlsOjpJc1N1cHBvcnRlZCgpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJUaGlzIHRlc3RzIHJlcXVpcmVzIFdpbmRvd3MgVmlzdGEgb3IgaGlnaGVyLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIFRPRE8oaGVucmlrYSk6IG5vdGUgdGhhdCB3ZSB1c2UgV2F2ZSB0b2RheSB0byBxdWVyeSB0aGUgbnVtYmVyIG9mCi0gIC8vIGV4aXN0aW5nIGlucHV0IGRldmljZXMuCi0gIGJvb2wgaW5wdXQgPSBhdWRpb19tYW4tPkhhc0F1ZGlvSW5wdXREZXZpY2VzKCk7Ci0gIExPR19JRihXQVJOSU5HLCAhaW5wdXQpIDw8ICJObyBpbnB1dCBkZXZpY2UgZGV0ZWN0ZWQuIjsKLSAgcmV0dXJuIGlucHV0OwotfQotCi0vLyBDb252ZW5pZW5jZSBtZXRob2Qgd2hpY2ggY3JlYXRlcyBhIGRlZmF1bHQgQXVkaW9JbnB1dFN0cmVhbSBvYmplY3QgYnV0Ci0vLyBhbHNvIGFsbG93cyB0aGUgdXNlciB0byBtb2RpZnkgdGhlIGRlZmF1bHQgc2V0dGluZ3MuCi1jbGFzcyBBdWRpb0lucHV0U3RyZWFtV3JhcHBlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBBdWRpb0lucHV0U3RyZWFtV3JhcHBlcihBdWRpb01hbmFnZXIqIGF1ZGlvX21hbmFnZXIpCi0gICAgICA6IGNvbV9pbml0XyhTY29wZWRDT01Jbml0aWFsaXplcjo6a01UQSksCi0gICAgICAgIGF1ZGlvX21hbl8oYXVkaW9fbWFuYWdlciksCi0gICAgICAgIGZvcm1hdF8oQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTE9XX0xBVEVOQ1kpLAotICAgICAgICBjaGFubmVsX2xheW91dF8oQ0hBTk5FTF9MQVlPVVRfU1RFUkVPKSwKLSAgICAgICAgYml0c19wZXJfc2FtcGxlXygxNikgewotICAgIC8vIFVzZSBuYXRpdmUvbWl4aW5nIHNhbXBsZSByYXRlIGFuZCAxMG1zIGZyYW1lIHNpemUgYXMgZGVmYXVsdC4KLSAgICBzYW1wbGVfcmF0ZV8gPSBzdGF0aWNfY2FzdDxpbnQ+KAotICAgICAgICBXQVNBUElBdWRpb0lucHV0U3RyZWFtOjpIYXJkd2FyZVNhbXBsZVJhdGUoCi0gICAgICAgICAgICBBdWRpb01hbmFnZXJCYXNlOjprRGVmYXVsdERldmljZUlkKSk7Ci0gICAgc2FtcGxlc19wZXJfcGFja2V0XyA9IHNhbXBsZV9yYXRlXyAvIDEwMDsKLSAgfQotCi0gIH5BdWRpb0lucHV0U3RyZWFtV3JhcHBlcigpIHt9Ci0KLSAgLy8gQ3JlYXRlcyBBdWRpb0lucHV0U3RyZWFtIG9iamVjdCB1c2luZyBkZWZhdWx0IHBhcmFtZXRlcnMuCi0gIEF1ZGlvSW5wdXRTdHJlYW0qIENyZWF0ZSgpIHsKLSAgICByZXR1cm4gQ3JlYXRlSW5wdXRTdHJlYW0oKTsKLSAgfQotCi0gIC8vIENyZWF0ZXMgQXVkaW9JbnB1dFN0cmVhbSBvYmplY3QgdXNpbmcgbm9uLWRlZmF1bHQgcGFyYW1ldGVycyB3aGVyZSB0aGUKLSAgLy8gZnJhbWUgc2l6ZSBpcyBtb2RpZmllZC4KLSAgQXVkaW9JbnB1dFN0cmVhbSogQ3JlYXRlKGludCBzYW1wbGVzX3Blcl9wYWNrZXQpIHsKLSAgICBzYW1wbGVzX3Blcl9wYWNrZXRfID0gc2FtcGxlc19wZXJfcGFja2V0OwotICAgIHJldHVybiBDcmVhdGVJbnB1dFN0cmVhbSgpOwotICB9Ci0KLSAgQXVkaW9QYXJhbWV0ZXJzOjpGb3JtYXQgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gZm9ybWF0XzsgfQotICBpbnQgY2hhbm5lbHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIENoYW5uZWxMYXlvdXRUb0NoYW5uZWxDb3VudChjaGFubmVsX2xheW91dF8pOwotICB9Ci0gIGludCBiaXRzX3Blcl9zYW1wbGUoKSBjb25zdCB7IHJldHVybiBiaXRzX3Blcl9zYW1wbGVfOyB9Ci0gIGludCBzYW1wbGVfcmF0ZSgpIGNvbnN0IHsgcmV0dXJuIHNhbXBsZV9yYXRlXzsgfQotICBpbnQgc2FtcGxlc19wZXJfcGFja2V0KCkgY29uc3QgeyByZXR1cm4gc2FtcGxlc19wZXJfcGFja2V0XzsgfQotCi0gcHJpdmF0ZToKLSAgQXVkaW9JbnB1dFN0cmVhbSogQ3JlYXRlSW5wdXRTdHJlYW0oKSB7Ci0gICAgQXVkaW9JbnB1dFN0cmVhbSogYWlzID0gYXVkaW9fbWFuXy0+TWFrZUF1ZGlvSW5wdXRTdHJlYW0oCi0gICAgICAgIEF1ZGlvUGFyYW1ldGVycyhmb3JtYXRfLCBjaGFubmVsX2xheW91dF8sIHNhbXBsZV9yYXRlXywKLSAgICAgICAgICAgICAgICAgICAgICAgIGJpdHNfcGVyX3NhbXBsZV8sIHNhbXBsZXNfcGVyX3BhY2tldF8pLAotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NYW5hZ2VyQmFzZTo6a0RlZmF1bHREZXZpY2VJZCk7Ci0gICAgRVhQRUNUX1RSVUUoYWlzKTsKLSAgICByZXR1cm4gYWlzOwotICB9Ci0KLSAgU2NvcGVkQ09NSW5pdGlhbGl6ZXIgY29tX2luaXRfOwotICBBdWRpb01hbmFnZXIqIGF1ZGlvX21hbl87Ci0gIEF1ZGlvUGFyYW1ldGVyczo6Rm9ybWF0IGZvcm1hdF87Ci0gIENoYW5uZWxMYXlvdXQgY2hhbm5lbF9sYXlvdXRfOwotICBpbnQgYml0c19wZXJfc2FtcGxlXzsKLSAgaW50IHNhbXBsZV9yYXRlXzsKLSAgaW50IHNhbXBsZXNfcGVyX3BhY2tldF87Ci19OwotCi0vLyBDb252ZW5pZW5jZSBtZXRob2Qgd2hpY2ggY3JlYXRlcyBhIGRlZmF1bHQgQXVkaW9JbnB1dFN0cmVhbSBvYmplY3QuCi1zdGF0aWMgQXVkaW9JbnB1dFN0cmVhbSogQ3JlYXRlRGVmYXVsdEF1ZGlvSW5wdXRTdHJlYW0oCi0gICAgQXVkaW9NYW5hZ2VyKiBhdWRpb19tYW5hZ2VyKSB7Ci0gIEF1ZGlvSW5wdXRTdHJlYW1XcmFwcGVyIGFpc3coYXVkaW9fbWFuYWdlcik7Ci0gIEF1ZGlvSW5wdXRTdHJlYW0qIGFpcyA9IGFpc3cuQ3JlYXRlKCk7Ci0gIHJldHVybiBhaXM7Ci19Ci0KLS8vIFZlcmlmeSB0aGF0IHdlIGNhbiByZXRyaWV2ZSB0aGUgY3VycmVudCBoYXJkd2FyZS9taXhpbmcgc2FtcGxlIHJhdGUKLS8vIGZvciBhbGwgYXZhaWxhYmxlIGlucHV0IGRldmljZXMuCi1URVNUKFdpbkF1ZGlvSW5wdXRUZXN0LCBXQVNBUElBdWRpb0lucHV0U3RyZWFtSGFyZHdhcmVTYW1wbGVSYXRlKSB7Ci0gIHNjb3BlZF9wdHI8QXVkaW9NYW5hZ2VyPiBhdWRpb19tYW5hZ2VyKEF1ZGlvTWFuYWdlcjo6Q3JlYXRlKCkpOwotICBpZiAoIUNhblJ1bkF1ZGlvVGVzdHMoYXVkaW9fbWFuYWdlci5nZXQoKSkpCi0gICAgcmV0dXJuOwotCi0gIFNjb3BlZENPTUluaXRpYWxpemVyIGNvbV9pbml0KFNjb3BlZENPTUluaXRpYWxpemVyOjprTVRBKTsKLQotICAvLyBSZXRyaWV2ZSBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBpbnB1dCBkZXZpY2VzLgotICBtZWRpYTo6QXVkaW9EZXZpY2VOYW1lcyBkZXZpY2VfbmFtZXM7Ci0gIGF1ZGlvX21hbmFnZXItPkdldEF1ZGlvSW5wdXREZXZpY2VOYW1lcygmZGV2aWNlX25hbWVzKTsKLQotICAvLyBTY2FuIGFsbCBhdmFpbGFibGUgaW5wdXQgZGV2aWNlcyBhbmQgcmVwZWF0IHRoZSBzYW1lIHRlc3QgZm9yIGFsbCBvZiB0aGVtLgotICBmb3IgKG1lZGlhOjpBdWRpb0RldmljZU5hbWVzOjpjb25zdF9pdGVyYXRvciBpdCA9IGRldmljZV9uYW1lcy5iZWdpbigpOwotICAgICAgIGl0ICE9IGRldmljZV9uYW1lcy5lbmQoKTsgKytpdCkgewotICAgIC8vIFJldHJpZXZlIHRoZSBoYXJkd2FyZSBzYW1wbGUgcmF0ZSBnaXZlbiBhIHNwZWNpZmllZCBhdWRpbyBpbnB1dCBkZXZpY2UuCi0gICAgLy8gVE9ETyh0b21taSk6IGVuc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgdG8gY2FzdCBoZXJlLgotICAgIGludCBmcyA9IHN0YXRpY19jYXN0PGludD4oV0FTQVBJQXVkaW9JbnB1dFN0cmVhbTo6SGFyZHdhcmVTYW1wbGVSYXRlKAotICAgICAgICBpdC0+dW5pcXVlX2lkKSk7Ci0gICAgRVhQRUNUX0dFKGZzLCAwKTsKLSAgfQotfQotCi0vLyBUZXN0IENyZWF0ZSgpLCBDbG9zZSgpIGNhbGxpbmcgc2VxdWVuY2UuCi1URVNUKFdpbkF1ZGlvSW5wdXRUZXN0LCBXQVNBUElBdWRpb0lucHV0U3RyZWFtQ3JlYXRlQW5kQ2xvc2UpIHsKLSAgc2NvcGVkX3B0cjxBdWRpb01hbmFnZXI+IGF1ZGlvX21hbmFnZXIoQXVkaW9NYW5hZ2VyOjpDcmVhdGUoKSk7Ci0gIGlmICghQ2FuUnVuQXVkaW9UZXN0cyhhdWRpb19tYW5hZ2VyLmdldCgpKSkKLSAgICByZXR1cm47Ci0gIEF1ZGlvSW5wdXRTdHJlYW0qIGFpcyA9IENyZWF0ZURlZmF1bHRBdWRpb0lucHV0U3RyZWFtKGF1ZGlvX21hbmFnZXIuZ2V0KCkpOwotICBhaXMtPkNsb3NlKCk7Ci19Ci0KLS8vIFRlc3QgT3BlbigpLCBDbG9zZSgpIGNhbGxpbmcgc2VxdWVuY2UuCi1URVNUKFdpbkF1ZGlvSW5wdXRUZXN0LCBXQVNBUElBdWRpb0lucHV0U3RyZWFtT3BlbkFuZENsb3NlKSB7Ci0gIHNjb3BlZF9wdHI8QXVkaW9NYW5hZ2VyPiBhdWRpb19tYW5hZ2VyKEF1ZGlvTWFuYWdlcjo6Q3JlYXRlKCkpOwotICBpZiAoIUNhblJ1bkF1ZGlvVGVzdHMoYXVkaW9fbWFuYWdlci5nZXQoKSkpCi0gICAgcmV0dXJuOwotICBBdWRpb0lucHV0U3RyZWFtKiBhaXMgPSBDcmVhdGVEZWZhdWx0QXVkaW9JbnB1dFN0cmVhbShhdWRpb19tYW5hZ2VyLmdldCgpKTsKLSAgRVhQRUNUX1RSVUUoYWlzLT5PcGVuKCkpOwotICBhaXMtPkNsb3NlKCk7Ci19Ci0KLS8vIFRlc3QgT3BlbigpLCBTdGFydCgpLCBDbG9zZSgpIGNhbGxpbmcgc2VxdWVuY2UuCi1URVNUKFdpbkF1ZGlvSW5wdXRUZXN0LCBXQVNBUElBdWRpb0lucHV0U3RyZWFtT3BlblN0YXJ0QW5kQ2xvc2UpIHsKLSAgc2NvcGVkX3B0cjxBdWRpb01hbmFnZXI+IGF1ZGlvX21hbmFnZXIoQXVkaW9NYW5hZ2VyOjpDcmVhdGUoKSk7Ci0gIGlmICghQ2FuUnVuQXVkaW9UZXN0cyhhdWRpb19tYW5hZ2VyLmdldCgpKSkKLSAgICByZXR1cm47Ci0gIEF1ZGlvSW5wdXRTdHJlYW0qIGFpcyA9IENyZWF0ZURlZmF1bHRBdWRpb0lucHV0U3RyZWFtKGF1ZGlvX21hbmFnZXIuZ2V0KCkpOwotICBFWFBFQ1RfVFJVRShhaXMtPk9wZW4oKSk7Ci0gIE1vY2tBdWRpb0lucHV0Q2FsbGJhY2sgc2luazsKLSAgYWlzLT5TdGFydCgmc2luayk7Ci0gIEVYUEVDVF9DQUxMKHNpbmssIE9uQ2xvc2UoYWlzKSkKLSAgICAgIC5UaW1lcygxKTsKLSAgYWlzLT5DbG9zZSgpOwotfQotCi0vLyBUZXN0IE9wZW4oKSwgU3RhcnQoKSwgU3RvcCgpLCBDbG9zZSgpIGNhbGxpbmcgc2VxdWVuY2UuCi1URVNUKFdpbkF1ZGlvSW5wdXRUZXN0LCBXQVNBUElBdWRpb0lucHV0U3RyZWFtT3BlblN0YXJ0U3RvcEFuZENsb3NlKSB7Ci0gIHNjb3BlZF9wdHI8QXVkaW9NYW5hZ2VyPiBhdWRpb19tYW5hZ2VyKEF1ZGlvTWFuYWdlcjo6Q3JlYXRlKCkpOwotICBpZiAoIUNhblJ1bkF1ZGlvVGVzdHMoYXVkaW9fbWFuYWdlci5nZXQoKSkpCi0gICAgcmV0dXJuOwotICBBdWRpb0lucHV0U3RyZWFtKiBhaXMgPSBDcmVhdGVEZWZhdWx0QXVkaW9JbnB1dFN0cmVhbShhdWRpb19tYW5hZ2VyLmdldCgpKTsKLSAgRVhQRUNUX1RSVUUoYWlzLT5PcGVuKCkpOwotICBNb2NrQXVkaW9JbnB1dENhbGxiYWNrIHNpbms7Ci0gIGFpcy0+U3RhcnQoJnNpbmspOwotICBhaXMtPlN0b3AoKTsKLSAgRVhQRUNUX0NBTEwoc2luaywgT25DbG9zZShhaXMpKQotICAgICAgLlRpbWVzKDEpOwotICBhaXMtPkNsb3NlKCk7Ci19Ci0KLS8vIFRlc3Qgc29tZSBhZGRpdGlvbmFsIGNhbGxpbmcgc2VxdWVuY2VzLgotVEVTVChXaW5BdWRpb0lucHV0VGVzdCwgV0FTQVBJQXVkaW9JbnB1dFN0cmVhbU1pc2NDYWxsaW5nU2VxdWVuY2VzKSB7Ci0gIHNjb3BlZF9wdHI8QXVkaW9NYW5hZ2VyPiBhdWRpb19tYW5hZ2VyKEF1ZGlvTWFuYWdlcjo6Q3JlYXRlKCkpOwotICBpZiAoIUNhblJ1bkF1ZGlvVGVzdHMoYXVkaW9fbWFuYWdlci5nZXQoKSkpCi0gICAgcmV0dXJuOwotICBBdWRpb0lucHV0U3RyZWFtKiBhaXMgPSBDcmVhdGVEZWZhdWx0QXVkaW9JbnB1dFN0cmVhbShhdWRpb19tYW5hZ2VyLmdldCgpKTsKLSAgV0FTQVBJQXVkaW9JbnB1dFN0cmVhbSogd2FpcyA9IHN0YXRpY19jYXN0PFdBU0FQSUF1ZGlvSW5wdXRTdHJlYW0qPihhaXMpOwotCi0gIC8vIE9wZW4oKSwgT3BlbigpIHNob3VsZCBmYWlsIHRoZSBzZWNvbmQgdGltZS4KLSAgRVhQRUNUX1RSVUUoYWlzLT5PcGVuKCkpOwotICBFWFBFQ1RfRkFMU0UoYWlzLT5PcGVuKCkpOwotCi0gIE1vY2tBdWRpb0lucHV0Q2FsbGJhY2sgc2luazsKLQotICAvLyBTdGFydCgpLCBTdGFydCgpIGlzIGEgdmFsaWQgY2FsbGluZyBzZXF1ZW5jZSAoc2Vjb25kIGNhbGwgZG9lcyBub3RoaW5nKS4KLSAgYWlzLT5TdGFydCgmc2luayk7Ci0gIEVYUEVDVF9UUlVFKHdhaXMtPnN0YXJ0ZWQoKSk7Ci0gIGFpcy0+U3RhcnQoJnNpbmspOwotICBFWFBFQ1RfVFJVRSh3YWlzLT5zdGFydGVkKCkpOwotCi0gIC8vIFN0b3AoKSwgU3RvcCgpIGlzIGEgdmFsaWQgY2FsbGluZyBzZXF1ZW5jZSAoc2Vjb25kIGNhbGwgZG9lcyBub3RoaW5nKS4KLSAgYWlzLT5TdG9wKCk7Ci0gIEVYUEVDVF9GQUxTRSh3YWlzLT5zdGFydGVkKCkpOwotICBhaXMtPlN0b3AoKTsKLSAgRVhQRUNUX0ZBTFNFKHdhaXMtPnN0YXJ0ZWQoKSk7Ci0KLSAgRVhQRUNUX0NBTEwoc2luaywgT25DbG9zZShhaXMpKQotICAgIC5UaW1lcygxKTsKLSAgYWlzLT5DbG9zZSgpOwotfQotCi1URVNUKFdpbkF1ZGlvSW5wdXRUZXN0LCBXQVNBUElBdWRpb0lucHV0U3RyZWFtVGVzdFBhY2tldFNpemVzKSB7Ci0gIHNjb3BlZF9wdHI8QXVkaW9NYW5hZ2VyPiBhdWRpb19tYW5hZ2VyKEF1ZGlvTWFuYWdlcjo6Q3JlYXRlKCkpOwotICBpZiAoIUNhblJ1bkF1ZGlvVGVzdHMoYXVkaW9fbWFuYWdlci5nZXQoKSkpCi0gICAgcmV0dXJuOwotCi0gIGludCBjb3VudCA9IDA7Ci0gIE1lc3NhZ2VMb29wRm9yVUkgbG9vcDsKLQotICAvLyAxMCBtcyBwYWNrZXQgc2l6ZS4KLQotICAvLyBDcmVhdGUgZGVmYXVsdCBXQVNBUEkgaW5wdXQgc3RyZWFtIHdoaWNoIHJlY29yZHMgaW4gc3RlcmVvIHVzaW5nCi0gIC8vIHRoZSBzaGFyZWQgbWl4aW5nIHJhdGUuIFRoZSBkZWZhdWx0IGJ1ZmZlciBzaXplIGlzIDEwbXMuCi0gIEF1ZGlvSW5wdXRTdHJlYW1XcmFwcGVyIGFpc3coYXVkaW9fbWFuYWdlci5nZXQoKSk7Ci0gIEF1ZGlvSW5wdXRTdHJlYW0qIGFpcyA9IGFpc3cuQ3JlYXRlKCk7Ci0gIEVYUEVDVF9UUlVFKGFpcy0+T3BlbigpKTsKLQotICBNb2NrQXVkaW9JbnB1dENhbGxiYWNrIHNpbms7Ci0KLSAgLy8gRGVyaXZlIHRoZSBleHBlY3RlZCBzaXplIGluIGJ5dGVzIG9mIGVhY2ggcmVjb3JkZWQgcGFja2V0LgotICB1aW50MzIgYnl0ZXNfcGVyX3BhY2tldCA9IGFpc3cuY2hhbm5lbHMoKSAqIGFpc3cuc2FtcGxlc19wZXJfcGFja2V0KCkgKgotICAgICAgKGFpc3cuYml0c19wZXJfc2FtcGxlKCkgLyA4KTsKLQotICAvLyBXZSB1c2UgMTBtcyBwYWNrZXRzIGFuZCB3aWxsIHJ1biB0aGUgdGVzdCB1bnRpbCB0ZW4gcGFja2V0cyBhcmUgcmVjZWl2ZWQuCi0gIC8vIEFsbCBzaG91bGQgY29udGFpbiB2YWxpZCBwYWNrZXRzIG9mIHRoZSBzYW1lIHNpemUgYW5kIGEgdmFsaWQgZGVsYXkKLSAgLy8gZXN0aW1hdGUuCi0gIEVYUEVDVF9DQUxMKHNpbmssIE9uRGF0YSgKLSAgICAgIGFpcywgTm90TnVsbCgpLCBieXRlc19wZXJfcGFja2V0LCBHdChieXRlc19wZXJfcGFja2V0KSwgXykpCi0gICAgICAuVGltZXMoQXRMZWFzdCgxMCkpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoQ2hlY2tDb3VudEFuZFBvc3RRdWl0VGFzaygmY291bnQsIDEwLCAmbG9vcCkpOwotICBhaXMtPlN0YXJ0KCZzaW5rKTsKLSAgbG9vcC5SdW4oKTsKLSAgYWlzLT5TdG9wKCk7Ci0KLSAgLy8gU3RvcmUgY3VycmVudCBwYWNrZXQgc2l6ZSAodG8gYmUgdXNlZCBpbiB0aGUgc3Vic2VxdWVudCB0ZXN0cykuCi0gIGludCBzYW1wbGVzX3Blcl9wYWNrZXRfMTBtcyA9IGFpc3cuc2FtcGxlc19wZXJfcGFja2V0KCk7Ci0KLSAgRVhQRUNUX0NBTEwoc2luaywgT25DbG9zZShhaXMpKQotICAgICAgLlRpbWVzKDEpOwotICBhaXMtPkNsb3NlKCk7Ci0KLSAgLy8gMjAgbXMgcGFja2V0IHNpemUuCi0KLSAgY291bnQgPSAwOwotICBhaXMgPSBhaXN3LkNyZWF0ZSgyICogc2FtcGxlc19wZXJfcGFja2V0XzEwbXMpOwotICBFWFBFQ1RfVFJVRShhaXMtPk9wZW4oKSk7Ci0gIGJ5dGVzX3Blcl9wYWNrZXQgPSBhaXN3LmNoYW5uZWxzKCkgKiBhaXN3LnNhbXBsZXNfcGVyX3BhY2tldCgpICoKLSAgICAgIChhaXN3LmJpdHNfcGVyX3NhbXBsZSgpIC8gOCk7Ci0KLSAgRVhQRUNUX0NBTEwoc2luaywgT25EYXRhKAotICAgICAgYWlzLCBOb3ROdWxsKCksIGJ5dGVzX3Blcl9wYWNrZXQsIEd0KGJ5dGVzX3Blcl9wYWNrZXQpLCBfKSkKLSAgICAgIC5UaW1lcyhBdExlYXN0KDEwKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShDaGVja0NvdW50QW5kUG9zdFF1aXRUYXNrKCZjb3VudCwgMTAsICZsb29wKSk7Ci0gIGFpcy0+U3RhcnQoJnNpbmspOwotICBsb29wLlJ1bigpOwotICBhaXMtPlN0b3AoKTsKLQotICBFWFBFQ1RfQ0FMTChzaW5rLCBPbkNsb3NlKGFpcykpCi0gICAgICAuVGltZXMoMSk7Ci0gIGFpcy0+Q2xvc2UoKTsKLQotICAvLyA1IG1zIHBhY2tldCBzaXplLgotCi0gIGNvdW50ID0gMDsKLSAgYWlzID0gYWlzdy5DcmVhdGUoc2FtcGxlc19wZXJfcGFja2V0XzEwbXMgLyAyKTsKLSAgRVhQRUNUX1RSVUUoYWlzLT5PcGVuKCkpOwotICBieXRlc19wZXJfcGFja2V0ID0gYWlzdy5jaGFubmVscygpICogYWlzdy5zYW1wbGVzX3Blcl9wYWNrZXQoKSAqCi0gICAgKGFpc3cuYml0c19wZXJfc2FtcGxlKCkgLyA4KTsKLQotICBFWFBFQ1RfQ0FMTChzaW5rLCBPbkRhdGEoCi0gICAgICBhaXMsIE5vdE51bGwoKSwgYnl0ZXNfcGVyX3BhY2tldCwgR3QoYnl0ZXNfcGVyX3BhY2tldCksIF8pKQotICAgICAgLlRpbWVzKEF0TGVhc3QoMTApKQotICAgICAgLldpbGxSZXBlYXRlZGx5KENoZWNrQ291bnRBbmRQb3N0UXVpdFRhc2soJmNvdW50LCAxMCwgJmxvb3ApKTsKLSAgYWlzLT5TdGFydCgmc2luayk7Ci0gIGxvb3AuUnVuKCk7Ci0gIGFpcy0+U3RvcCgpOwotCi0gIEVYUEVDVF9DQUxMKHNpbmssIE9uQ2xvc2UoYWlzKSkKLSAgICAgIC5UaW1lcygxKTsKLSAgYWlzLT5DbG9zZSgpOwotfQotCi0vLyBUaGlzIHRlc3QgaXMgaW50ZW5kZWQgZm9yIG1hbnVhbCB0ZXN0cyBhbmQgc2hvdWxkIG9ubHkgYmUgZW5hYmxlZAotLy8gd2hlbiBpdCBpcyByZXF1aXJlZCB0byBzdG9yZSB0aGUgY2FwdHVyZWQgZGF0YSBvbiBhIGxvY2FsIGZpbGUuCi0vLyBCeSBkZWZhdWx0LCBHVGVzdCB3aWxsIHByaW50IG91dCBZT1UgSEFWRSAxIERJU0FCTEVEIFRFU1QuCi0vLyBUbyBpbmNsdWRlIGRpc2FibGVkIHRlc3RzIGluIHRlc3QgZXhlY3V0aW9uLCBqdXN0IGludm9rZSB0aGUgdGVzdCBwcm9ncmFtCi0vLyB3aXRoIC0tZ3Rlc3RfYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMgb3Igc2V0IHRoZSBHVEVTVF9BTFNPX1JVTl9ESVNBQkxFRF9URVNUUwotLy8gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gYSB2YWx1ZSBncmVhdGVyIHRoYW4gMC4KLVRFU1QoV2luQXVkaW9JbnB1dFRlc3QsIERJU0FCTEVEX1dBU0FQSUF1ZGlvSW5wdXRTdHJlYW1SZWNvcmRUb0ZpbGUpIHsKLSAgc2NvcGVkX3B0cjxBdWRpb01hbmFnZXI+IGF1ZGlvX21hbmFnZXIoQXVkaW9NYW5hZ2VyOjpDcmVhdGUoKSk7Ci0gIGlmICghQ2FuUnVuQXVkaW9UZXN0cyhhdWRpb19tYW5hZ2VyLmdldCgpKSkKLSAgICByZXR1cm47Ci0KLSAgLy8gTmFtZSBvZiB0aGUgb3V0cHV0IFBDTSBmaWxlIGNvbnRhaW5pbmcgY2FwdHVyZWQgZGF0YS4gVGhlIG91dHB1dCBmaWxlCi0gIC8vIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyAnbWVkaWFfdW5pdHRlc3RzLmV4ZScuCi0gIC8vIEV4YW1wbGUgb2YgZnVsbCBuYW1lOiBcc3JjXGJ1aWxkXERlYnVnXG91dF9zdGVyZW9fMTBzZWMucGNtLgotICBjb25zdCBjaGFyKiBmaWxlX25hbWUgPSAib3V0X3N0ZXJlb18xMHNlYy5wY20iOwotCi0gIEF1ZGlvSW5wdXRTdHJlYW1XcmFwcGVyIGFpc3coYXVkaW9fbWFuYWdlci5nZXQoKSk7Ci0gIEF1ZGlvSW5wdXRTdHJlYW0qIGFpcyA9IGFpc3cuQ3JlYXRlKCk7Ci0gIEVYUEVDVF9UUlVFKGFpcy0+T3BlbigpKTsKLQotICBMT0coSU5GTykgPDwgIj4+IFNhbXBsZSByYXRlOiAiIDw8IGFpc3cuc2FtcGxlX3JhdGUoKSA8PCAiIFtIel0iOwotICBXcml0ZVRvRmlsZUF1ZGlvU2luayBmaWxlX3NpbmsoZmlsZV9uYW1lKTsKLSAgTE9HKElORk8pIDw8ICI+PiBTcGVhayBpbnRvIHRoZSBkZWZhdWx0IG1pY3JvcGhvbmUgd2hpbGUgcmVjb3JkaW5nLiI7Ci0gIGFpcy0+U3RhcnQoJmZpbGVfc2luayk7Ci0gIGJhc2U6OlBsYXRmb3JtVGhyZWFkOjpTbGVlcChUZXN0VGltZW91dHM6OmFjdGlvbl90aW1lb3V0KCkpOwotICBhaXMtPlN0b3AoKTsKLSAgTE9HKElORk8pIDw8ICI+PiBSZWNvcmRpbmcgaGFzIHN0b3BwZWQuIjsKLSAgYWlzLT5DbG9zZSgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby93aW4vYXVkaW9fbG93X2xhdGVuY3lfb3V0cHV0X3dpbi5jYyBiL3NyYy9tZWRpYS9hdWRpby93aW4vYXVkaW9fbG93X2xhdGVuY3lfb3V0cHV0X3dpbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAzNzU4OS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vd2luL2F1ZGlvX2xvd19sYXRlbmN5X291dHB1dF93aW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5NTYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3dpbi9hdWRpb19sb3dfbGF0ZW5jeV9vdXRwdXRfd2luLmgiCi0KLSNpbmNsdWRlIDxGdW5jdGlvbmRpc2NvdmVyeWtleXNfZGV2cGtleS5oPgotCi0jaW5jbHVkZSAiYmFzZS9jb21tYW5kX2xpbmUuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXRyaWNzL2hpc3RvZ3JhbS5oIgotI2luY2x1ZGUgImJhc2UvdXRmX3N0cmluZ19jb252ZXJzaW9ucy5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3V0aWwuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby93aW4vYXVkaW9fbWFuYWdlcl93aW4uaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby93aW4vYXZydF93cmFwcGVyX3dpbi5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbGltaXRzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9zd2l0Y2hlcy5oIgotCi11c2luZyBiYXNlOjp3aW46OlNjb3BlZENvbVB0cjsKLXVzaW5nIGJhc2U6Ondpbjo6U2NvcGVkQ09NSW5pdGlhbGl6ZXI7Ci11c2luZyBiYXNlOjp3aW46OlNjb3BlZENvTWVtOwotCi1uYW1lc3BhY2UgbWVkaWEgewotCi10eXBlZGVmIHVpbnQzMiBDaGFubmVsQ29uZmlnOwotCi0vLyBSZXRyaWV2ZXMgdGhlIHN0cmVhbSBmb3JtYXQgdGhhdCB0aGUgYXVkaW8gZW5naW5lIHVzZXMgZm9yIGl0cyBpbnRlcm5hbAotLy8gcHJvY2Vzc2luZy9taXhpbmcgb2Ygc2hhcmVkLW1vZGUgc3RyZWFtcy4KLXN0YXRpYyBIUkVTVUxUIEdldE1peEZvcm1hdChFUm9sZSBkZXZpY2Vfcm9sZSwgV0FWRUZPUk1BVEVYKiogZGV2aWNlX2Zvcm1hdCkgewotICAvLyBOb3RlIHRoYXQgd2UgYXJlIHVzaW5nIHRoZSBJQXVkaW9DbGllbnQ6OkdldE1peEZvcm1hdCgpIEFQSSB0byBnZXQgdGhlCi0gIC8vIGRldmljZSBmb3JtYXQgaW4gdGhpcyBmdW5jdGlvbi4gSXQgaXMgaW4gZmFjdCBwb3NzaWJsZSB0byBiZSAibW9yZSBuYXRpdmUiLAotICAvLyBhbmQgYXNrIHRoZSBlbmRwb2ludCBkZXZpY2UgZGlyZWN0bHkgZm9yIGl0cyBwcm9wZXJ0aWVzLiBHaXZlbiBhIHJlZmVyZW5jZQotICAvLyB0byB0aGUgSU1NRGV2aWNlIGludGVyZmFjZSBvZiBhbiBlbmRwb2ludCBvYmplY3QsIGEgY2xpZW50IGNhbiBvYnRhaW4gYQotICAvLyByZWZlcmVuY2UgdG8gdGhlIGVuZHBvaW50IG9iamVjdCdzIHByb3BlcnR5IHN0b3JlIGJ5IGNhbGxpbmcgdGhlCi0gIC8vIElNTURldmljZTo6T3BlblByb3BlcnR5U3RvcmUoKSBtZXRob2QuIEhvd2V2ZXIsIEkgaGF2ZSBub3QgYmVlbiBhYmxlIHRvCi0gIC8vIGFjY2VzcyBhbnkgdmFsdWFibGUgaW5mb3JtYXRpb24gdXNpbmcgdGhpcyBtZXRob2Qgb24gbXkgSFAgWjYwMCBkZXNrdG9wLAotICAvLyBoZW5jZSBpdCBmZWVscyBtb3JlIGFwcHJvcHJpYXRlIHRvIHVzZSB0aGUgSUF1ZGlvQ2xpZW50OjpHZXRNaXhGb3JtYXQoKQotICAvLyBhcHByb2FjaCBpbnN0ZWFkLgotCi0gIC8vIENhbGxpbmcgdGhpcyBmdW5jdGlvbiBvbmx5IG1ha2VzIHNlbnNlIGZvciBzaGFyZWQgbW9kZSBzdHJlYW1zLCBzaW5jZQotICAvLyBpZiB0aGUgZGV2aWNlIHdpbGwgYmUgb3BlbmVkIGluIGV4Y2x1c2l2ZSBtb2RlLCB0aGVuIHRoZSBhcHBsaWNhdGlvbgotICAvLyBzcGVjaWZpZWQgZm9ybWF0IGlzIHVzZWQgaW5zdGVhZC4gSG93ZXZlciwgdGhlIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCBjYW4KLSAgLy8gYmUgdXNlZnVsIGZvciB0ZXN0aW5nIHB1cnBvc2VzIHNvIHdlIGRvbid0IERDSEVDSyBoZXJlLgotICBETE9HX0lGKFdBUk5JTkcsIFdBU0FQSUF1ZGlvT3V0cHV0U3RyZWFtOjpHZXRTaGFyZU1vZGUoKSA9PQotICAgICAgICAgIEFVRENMTlRfU0hBUkVNT0RFX0VYQ0xVU0lWRSkgPDwKLSAgICAgICJUaGUgbWl4aW5nIHNhbXBsZSByYXRlIHdpbGwgYmUgaWdub3JlZCBmb3IgZXhjbHVzaXZlLW1vZGUgc3RyZWFtcy4iOwotCi0gIC8vIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGlzIHN0YXRpYyBtZXRob2QgaXMgY2FsbGVkIGZyb20gYSBDT00gdGhyZWFkLCBpLmUuLAotICAvLyBDb0luaXRpYWxpemVFeCgpIGlzIG5vdCBjYWxsZWQgaGVyZSBhZ2FpbiB0byBhdm9pZCBTVEEvTVRBIGNvbmZsaWN0cy4KLSAgU2NvcGVkQ29tUHRyPElNTURldmljZUVudW1lcmF0b3I+IGVudW1lcmF0b3I7Ci0gIEhSRVNVTFQgaHIgPSBDb0NyZWF0ZUluc3RhbmNlKF9fdXVpZG9mKE1NRGV2aWNlRW51bWVyYXRvciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMU0NUWF9JTlBST0NfU0VSVkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3V1aWRvZihJTU1EZXZpY2VFbnVtZXJhdG9yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYXRvci5SZWNlaXZlVm9pZCgpKTsKLSAgaWYgKEZBSUxFRChocikpCi0gICAgcmV0dXJuIGhyOwotCi0gIFNjb3BlZENvbVB0cjxJTU1EZXZpY2U+IGVuZHBvaW50X2RldmljZTsKLSAgaHIgPSBlbnVtZXJhdG9yLT5HZXREZWZhdWx0QXVkaW9FbmRwb2ludChlUmVuZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50X2RldmljZS5SZWNlaXZlKCkpOwotICBpZiAoRkFJTEVEKGhyKSkKLSAgICByZXR1cm4gaHI7Ci0KLSAgU2NvcGVkQ29tUHRyPElBdWRpb0NsaWVudD4gYXVkaW9fY2xpZW50OwotICBociA9IGVuZHBvaW50X2RldmljZS0+QWN0aXZhdGUoX191dWlkb2YoSUF1ZGlvQ2xpZW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMU0NUWF9JTlBST0NfU0VSVkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NsaWVudC5SZWNlaXZlVm9pZCgpKTsKLSAgcmV0dXJuIFNVQ0NFRURFRChocikgPyBhdWRpb19jbGllbnQtPkdldE1peEZvcm1hdChkZXZpY2VfZm9ybWF0KSA6IGhyOwotfQotCi0vLyBSZXRyaWV2ZXMgYW4gaW50ZWdlciBtYXNrIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBjaGFubmVsIGxheW91dCB0aGUKLS8vIGF1ZGlvIGVuZ2luZSB1c2VzIGZvciBpdHMgaW50ZXJuYWwgcHJvY2Vzc2luZy9taXhpbmcgb2Ygc2hhcmVkLW1vZGUKLS8vIHN0cmVhbXMuIFRoaXMgbWFzayBpbmRpY2F0ZXMgd2hpY2ggY2hhbm5lbHMgYXJlIHByZXNlbnQgaW4gdGhlIG11bHRpLQotLy8gY2hhbm5lbCBzdHJlYW0uIFRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgY29ycmVzcG9uZHMgd2l0aCB0aGUgRnJvbnQgTGVmdAotLy8gc3BlYWtlciwgdGhlIG5leHQgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IGNvcnJlc3BvbmRzIHRvIHRoZSBGcm9udCBSaWdodAotLy8gc3BlYWtlciwgYW5kIHNvIG9uLCBjb250aW51aW5nIGluIHRoZSBvcmRlciBkZWZpbmVkIGluIEtzTWVkaWEuaC4KLS8vIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvd2luZG93cy9oYXJkd2FyZS9mZjUzNzA4Myh2PXZzLjg1KS5hc3B4Ci0vLyBmb3IgbW9yZSBkZXRhaWxzLgotc3RhdGljIENoYW5uZWxDb25maWcgR2V0Q2hhbm5lbENvbmZpZygpIHsKLSAgLy8gVXNlIGEgV0FWRUZPUk1BVEVYVEVOU0lCTEUgc3RydWN0dXJlIHNpbmNlIGl0IGNhbiBzcGVjaWZ5IGJvdGggdGhlCi0gIC8vIG51bWJlciBvZiBjaGFubmVscyBhbmQgdGhlIG1hcHBpbmcgb2YgY2hhbm5lbHMgdG8gc3BlYWtlcnMgZm9yCi0gIC8vIG11bHRpY2hhbm5lbCBkZXZpY2VzLgotICBiYXNlOjp3aW46OlNjb3BlZENvTWVtPFdBVkVGT1JNQVRQQ01FWD4gZm9ybWF0X2V4OwotICBIUkVTVUxUIGhyID0gU19GQUxTRTsKLSAgaHIgPSBHZXRNaXhGb3JtYXQoZUNvbnNvbGUsIHJlaW50ZXJwcmV0X2Nhc3Q8V0FWRUZPUk1BVEVYKio+KCZmb3JtYXRfZXgpKTsKLSAgaWYgKEZBSUxFRChocikpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLy8gVGhlIGR3Q2hhbm5lbE1hc2sgbWVtYmVyIHNwZWNpZmllcyB3aGljaCBjaGFubmVscyBhcmUgcHJlc2VudCBpbiB0aGUKLSAgLy8gbXVsdGljaGFubmVsIHN0cmVhbS4gVGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBjb3JyZXNwb25kcyB0byB0aGUKLSAgLy8gZnJvbnQgbGVmdCBzcGVha2VyLCB0aGUgbmV4dCBsZWFzdCBzaWduaWZpY2FudCBiaXQgY29ycmVzcG9uZHMgdG8gdGhlCi0gIC8vIGZyb250IHJpZ2h0IHNwZWFrZXIsIGFuZCBzbyBvbi4KLSAgLy8gU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvZGQ3NTc3MTQodj12cy44NSkuYXNweAotICAvLyBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBjaGFubmVsIG1hcHBpbmcuCi0gIERWTE9HKDIpIDw8ICJkd0NoYW5uZWxNYXNrOiAweCIgPDwgc3RkOjpoZXggPDwgZm9ybWF0X2V4LT5kd0NoYW5uZWxNYXNrOwotCi0jaWYgIWRlZmluZWQoTkRFQlVHKQotICAvLyBTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TdXJyb3VuZF9zb3VuZCBmb3IgbW9yZSBkZXRhaWxzIG9uCi0gIC8vIGhvdyB0byBuYW1lIHZhcmlvdXMgc3BlYWtlciBjb25maWd1cmF0aW9ucy4gVGhlIGxpc3QgYmVsb3cgaXMgbm90IGNvbXBsZXRlLgotICBjb25zdCBjaGFyKiBzcGVha2VyX2NvbmZpZyA9ICJVbmRlZmluZWQiOwotICBzd2l0Y2ggKGZvcm1hdF9leC0+ZHdDaGFubmVsTWFzaykgewotICAgIGNhc2UgS1NBVURJT19TUEVBS0VSX01PTk86Ci0gICAgICBzcGVha2VyX2NvbmZpZyA9ICJNb25vIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgS1NBVURJT19TUEVBS0VSX1NURVJFTzoKLSAgICAgIHNwZWFrZXJfY29uZmlnID0gIlN0ZXJlbyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEtTQVVESU9fU1BFQUtFUl81UE9JTlQxX1NVUlJPVU5EOgotICAgICAgc3BlYWtlcl9jb25maWcgPSAiNS4xIHN1cnJvdW5kIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgS1NBVURJT19TUEVBS0VSXzVQT0lOVDE6Ci0gICAgICBzcGVha2VyX2NvbmZpZyA9ICI1LjEiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLU0FVRElPX1NQRUFLRVJfN1BPSU5UMV9TVVJST1VORDoKLSAgICAgIHNwZWFrZXJfY29uZmlnID0gIjcuMSBzdXJyb3VuZCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEtTQVVESU9fU1BFQUtFUl83UE9JTlQxOgotICAgICAgc3BlYWtlcl9jb25maWcgPSAiNy4xIjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICBEVkxPRygyKSA8PCAic3BlYWtlciBjb25maWd1cmF0aW9uOiAiIDw8IHNwZWFrZXJfY29uZmlnOwotI2VuZGlmCi0KLSAgcmV0dXJuIHN0YXRpY19jYXN0PENoYW5uZWxDb25maWc+KGZvcm1hdF9leC0+ZHdDaGFubmVsTWFzayk7Ci19Ci0KLS8vIENvbnZlcnRzIE1pY3Jvc29mdCdzIGNoYW5uZWwgY29uZmlndXJhdGlvbiB0byBDaGFubmVsTGF5b3V0LgotLy8gVGhpcyBtYXBwaW5nIGlzIG5vdCBwZXJmZWN0IGJ1dCB0aGUgYmVzdCB3ZSBjYW4gZG8gZ2l2ZW4gdGhlIGN1cnJlbnQKLS8vIENoYW5uZWxMYXlvdXQgZW51bWVyYXRvciBhbmQgdGhlIFdpbmRvd3Mtc3BlY2lmaWMgc3BlYWtlciBjb25maWd1cmF0aW9ucwotLy8gZGVmaW5lZCBpbiBrc21lZGlhLmguIERvbid0IGFzc3VtZSB0aGF0IHRoZSBjaGFubmVsIG9yZGVyaW5nIGluCi0vLyBDaGFubmVsTGF5b3V0IGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIFdpbmRvd3Mgc3BlY2lmaWMgY29uZmlndXJhdGlvbi4KLS8vIEFzIGFuIGV4YW1wbGU6IEtTQVVESU9fU1BFQUtFUl83UE9JTlQxX1NVUlJPVU5EIGlzIG1hcHBlZCB0bwotLy8gQ0hBTk5FTF9MQVlPVVRfN18xIGJ1dCB0aGUgcG9zaXRpb25zIG9mIEJhY2sgTCwgQmFjayBSIGFuZCBTaWRlIEwsIFNpZGUgUgotLy8gc3BlYWtlcnMgYXJlIGRpZmZlcmVudCBpbiB0aGVzZSB0d28gZGVmaW5pdGlvbnMuCi1zdGF0aWMgQ2hhbm5lbExheW91dCBDaGFubmVsQ29uZmlnVG9DaGFubmVsTGF5b3V0KENoYW5uZWxDb25maWcgY29uZmlnKSB7Ci0gIHN3aXRjaCAoY29uZmlnKSB7Ci0gICAgY2FzZSBLU0FVRElPX1NQRUFLRVJfRElSRUNUT1VUOgotICAgICAgcmV0dXJuIENIQU5ORUxfTEFZT1VUX05PTkU7Ci0gICAgY2FzZSBLU0FVRElPX1NQRUFLRVJfTU9OTzoKLSAgICAgIHJldHVybiBDSEFOTkVMX0xBWU9VVF9NT05POwotICAgIGNhc2UgS1NBVURJT19TUEVBS0VSX1NURVJFTzoKLSAgICAgIHJldHVybiBDSEFOTkVMX0xBWU9VVF9TVEVSRU87Ci0gICAgY2FzZSBLU0FVRElPX1NQRUFLRVJfUVVBRDoKLSAgICAgIHJldHVybiBDSEFOTkVMX0xBWU9VVF9RVUFEOwotICAgIGNhc2UgS1NBVURJT19TUEVBS0VSX1NVUlJPVU5EOgotICAgICAgcmV0dXJuIENIQU5ORUxfTEFZT1VUXzRfMDsKLSAgICBjYXNlIEtTQVVESU9fU1BFQUtFUl81UE9JTlQxOgotICAgICAgcmV0dXJuIENIQU5ORUxfTEFZT1VUXzVfMV9CQUNLOwotICAgIGNhc2UgS1NBVURJT19TUEVBS0VSXzVQT0lOVDFfU1VSUk9VTkQ6Ci0gICAgICByZXR1cm4gQ0hBTk5FTF9MQVlPVVRfNV8xOwotICAgIGNhc2UgS1NBVURJT19TUEVBS0VSXzdQT0lOVDE6Ci0gICAgICByZXR1cm4gQ0hBTk5FTF9MQVlPVVRfN18xX1dJREU7Ci0gICAgY2FzZSBLU0FVRElPX1NQRUFLRVJfN1BPSU5UMV9TVVJST1VORDoKLSAgICAgIHJldHVybiBDSEFOTkVMX0xBWU9VVF83XzE7Ci0gICAgZGVmYXVsdDoKLSAgICAgIERWTE9HKDEpIDw8ICJVbnN1cHBvcnRlZCBjaGFubmVsIGxheW91dDogIiA8PCBjb25maWc7Ci0gICAgICByZXR1cm4gQ0hBTk5FTF9MQVlPVVRfVU5TVVBQT1JURUQ7Ci0gIH0KLX0KLQotLy8gc3RhdGljCi1BVURDTE5UX1NIQVJFTU9ERSBXQVNBUElBdWRpb091dHB1dFN0cmVhbTo6R2V0U2hhcmVNb2RlKCkgewotICBjb25zdCBDb21tYW5kTGluZSogY21kX2xpbmUgPSBDb21tYW5kTGluZTo6Rm9yQ3VycmVudFByb2Nlc3MoKTsKLSAgaWYgKGNtZF9saW5lLT5IYXNTd2l0Y2goc3dpdGNoZXM6OmtFbmFibGVFeGNsdXNpdmVBdWRpbykpCi0gICAgcmV0dXJuIEFVRENMTlRfU0hBUkVNT0RFX0VYQ0xVU0lWRTsKLSAgcmV0dXJuIEFVRENMTlRfU0hBUkVNT0RFX1NIQVJFRDsKLX0KLQotV0FTQVBJQXVkaW9PdXRwdXRTdHJlYW06OldBU0FQSUF1ZGlvT3V0cHV0U3RyZWFtKEF1ZGlvTWFuYWdlcldpbiogbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUm9sZSBkZXZpY2Vfcm9sZSkKLSAgICA6IGNyZWF0aW5nX3RocmVhZF9pZF8oYmFzZTo6UGxhdGZvcm1UaHJlYWQ6OkN1cnJlbnRJZCgpKSwKLSAgICAgIG1hbmFnZXJfKG1hbmFnZXIpLAotICAgICAgb3BlbmVkXyhmYWxzZSksCi0gICAgICByZXN0YXJ0X3JlbmRlcmluZ19tb2RlXyhmYWxzZSksCi0gICAgICB2b2x1bWVfKDEuMCksCi0gICAgICBlbmRwb2ludF9idWZmZXJfc2l6ZV9mcmFtZXNfKDApLAotICAgICAgZGV2aWNlX3JvbGVfKGRldmljZV9yb2xlKSwKLSAgICAgIHNoYXJlX21vZGVfKEdldFNoYXJlTW9kZSgpKSwKLSAgICAgIGNsaWVudF9jaGFubmVsX2NvdW50XyhwYXJhbXMuY2hhbm5lbHMoKSksCi0gICAgICBudW1fd3JpdHRlbl9mcmFtZXNfKDApLAotICAgICAgc291cmNlXyhOVUxMKSwKLSAgICAgIGF1ZGlvX2J1c18oQXVkaW9CdXM6OkNyZWF0ZShwYXJhbXMpKSB7Ci0gIERDSEVDSyhtYW5hZ2VyXyk7Ci0KLSAgLy8gTG9hZCB0aGUgQXZydCBETEwgaWYgbm90IGFscmVhZHkgbG9hZGVkLiBSZXF1aXJlZCB0byBzdXBwb3J0IE1NQ1NTLgotICBib29sIGF2cnRfaW5pdCA9IGF2cnQ6OkluaXRpYWxpemUoKTsKLSAgRENIRUNLKGF2cnRfaW5pdCkgPDwgIkZhaWxlZCB0byBsb2FkIHRoZSBhdnJ0LmRsbCI7Ci0KLSAgaWYgKHNoYXJlX21vZGVfID09IEFVRENMTlRfU0hBUkVNT0RFX0VYQ0xVU0lWRSkgewotICAgIFZMT0coMSkgPDwgIj4+IE5vdGUgdGhhdCBFWENMVVNJVkUgTU9ERSBpcyBlbmFibGVkIDw8IjsKLSAgfQotCi0gIC8vIFNldCB1cCB0aGUgZGVzaXJlZCByZW5kZXIgZm9ybWF0IHNwZWNpZmllZCBieSB0aGUgY2xpZW50LiBXZSB1c2UgdGhlCi0gIC8vIFdBVkVfRk9STUFUX0VYVEVOU0lCTEUgc3RydWN0dXJlIHRvIGVuc3VyZSB0aGF0IG11bHRpcGxlIGNoYW5uZWwgb3JkZXJpbmcKLSAgLy8gYW5kIGhpZ2ggcHJlY2lzaW9uIGRhdGEgY2FuIGJlIHN1cHBvcnRlZC4KLQotICAvLyBCZWdpbiB3aXRoIHRoZSBXQVZFRk9STUFURVggc3RydWN0dXJlIHRoYXQgc3BlY2lmaWVzIHRoZSBiYXNpYyBmb3JtYXQuCi0gIFdBVkVGT1JNQVRFWCogZm9ybWF0ID0gJmZvcm1hdF8uRm9ybWF0OwotICBmb3JtYXQtPndGb3JtYXRUYWcgPSBXQVZFX0ZPUk1BVF9FWFRFTlNJQkxFOwotICBmb3JtYXQtPm5DaGFubmVscyA9IGNsaWVudF9jaGFubmVsX2NvdW50XzsKLSAgZm9ybWF0LT5uU2FtcGxlc1BlclNlYyA9IHBhcmFtcy5zYW1wbGVfcmF0ZSgpOwotICBmb3JtYXQtPndCaXRzUGVyU2FtcGxlID0gcGFyYW1zLmJpdHNfcGVyX3NhbXBsZSgpOwotICBmb3JtYXQtPm5CbG9ja0FsaWduID0gKGZvcm1hdC0+d0JpdHNQZXJTYW1wbGUgLyA4KSAqIGZvcm1hdC0+bkNoYW5uZWxzOwotICBmb3JtYXQtPm5BdmdCeXRlc1BlclNlYyA9IGZvcm1hdC0+blNhbXBsZXNQZXJTZWMgKiBmb3JtYXQtPm5CbG9ja0FsaWduOwotICBmb3JtYXQtPmNiU2l6ZSA9IHNpemVvZihXQVZFRk9STUFURVhURU5TSUJMRSkgLSBzaXplb2YoV0FWRUZPUk1BVEVYKTsKLQotICAvLyBBZGQgdGhlIHBhcnRzIHdoaWNoIGFyZSB1bmlxdWUgdG8gV0FWRV9GT1JNQVRfRVhURU5TSUJMRS4KLSAgZm9ybWF0Xy5TYW1wbGVzLndWYWxpZEJpdHNQZXJTYW1wbGUgPSBwYXJhbXMuYml0c19wZXJfc2FtcGxlKCk7Ci0gIGZvcm1hdF8uZHdDaGFubmVsTWFzayA9IEdldENoYW5uZWxDb25maWcoKTsKLSAgZm9ybWF0Xy5TdWJGb3JtYXQgPSBLU0RBVEFGT1JNQVRfU1VCVFlQRV9QQ007Ci0KLSAgLy8gU2l6ZSBpbiBieXRlcyBvZiBlYWNoIGF1ZGlvIGZyYW1lLgotICBmcmFtZV9zaXplXyA9IGZvcm1hdC0+bkJsb2NrQWxpZ247Ci0KLSAgLy8gU3RvcmUgc2l6ZSAoaW4gZGlmZmVyZW50IHVuaXRzKSBvZiBhdWRpbyBwYWNrZXRzIHdoaWNoIHdlIGV4cGVjdCB0bwotICAvLyBnZXQgZnJvbSB0aGUgYXVkaW8gZW5kcG9pbnQgZGV2aWNlIGluIGVhY2ggcmVuZGVyIGV2ZW50LgotICBwYWNrZXRfc2l6ZV9mcmFtZXNfID0gcGFyYW1zLkdldEJ5dGVzUGVyQnVmZmVyKCkgLyBmb3JtYXQtPm5CbG9ja0FsaWduOwotICBwYWNrZXRfc2l6ZV9ieXRlc18gPSBwYXJhbXMuR2V0Qnl0ZXNQZXJCdWZmZXIoKTsKLSAgcGFja2V0X3NpemVfbXNfID0gKDEwMDAuMCAqIHBhY2tldF9zaXplX2ZyYW1lc18pIC8gcGFyYW1zLnNhbXBsZV9yYXRlKCk7Ci0gIERWTE9HKDEpIDw8ICJOdW1iZXIgb2YgYnl0ZXMgcGVyIGF1ZGlvIGZyYW1lICA6ICIgPDwgZnJhbWVfc2l6ZV87Ci0gIERWTE9HKDEpIDw8ICJOdW1iZXIgb2YgYXVkaW8gZnJhbWVzIHBlciBwYWNrZXQ6ICIgPDwgcGFja2V0X3NpemVfZnJhbWVzXzsKLSAgRFZMT0coMSkgPDwgIk51bWJlciBvZiBieXRlcyBwZXIgcGFja2V0ICAgICAgIDogIiA8PCBwYWNrZXRfc2l6ZV9ieXRlc187Ci0gIERWTE9HKDEpIDw8ICJOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHBlciBwYWNrZXQ6ICIgPDwgcGFja2V0X3NpemVfbXNfOwotCi0gIC8vIEFsbCBldmVudHMgYXJlIGF1dG8tcmVzZXQgZXZlbnRzIGFuZCBub24tc2lnbmFsZWQgaW5pdGlhbGx5LgotCi0gIC8vIENyZWF0ZSB0aGUgZXZlbnQgd2hpY2ggdGhlIGF1ZGlvIGVuZ2luZSB3aWxsIHNpZ25hbCBlYWNoIHRpbWUKLSAgLy8gYSBidWZmZXIgYmVjb21lcyByZWFkeSB0byBiZSBwcm9jZXNzZWQgYnkgdGhlIGNsaWVudC4KLSAgYXVkaW9fc2FtcGxlc19yZW5kZXJfZXZlbnRfLlNldChDcmVhdGVFdmVudChOVUxMLCBGQUxTRSwgRkFMU0UsIE5VTEwpKTsKLSAgRENIRUNLKGF1ZGlvX3NhbXBsZXNfcmVuZGVyX2V2ZW50Xy5Jc1ZhbGlkKCkpOwotCi0gIC8vIENyZWF0ZSB0aGUgZXZlbnQgd2hpY2ggd2lsbCBiZSBzZXQgaW4gU3RvcCgpIHdoZW4gY2FwdHVyaW5nIHNoYWxsIHN0b3AuCi0gIHN0b3BfcmVuZGVyX2V2ZW50Xy5TZXQoQ3JlYXRlRXZlbnQoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKSk7Ci0gIERDSEVDSyhzdG9wX3JlbmRlcl9ldmVudF8uSXNWYWxpZCgpKTsKLX0KLQotV0FTQVBJQXVkaW9PdXRwdXRTdHJlYW06On5XQVNBUElBdWRpb091dHB1dFN0cmVhbSgpIHt9Ci0KLWJvb2wgV0FTQVBJQXVkaW9PdXRwdXRTdHJlYW06Ok9wZW4oKSB7Ci0gIERDSEVDS19FUShHZXRDdXJyZW50VGhyZWFkSWQoKSwgY3JlYXRpbmdfdGhyZWFkX2lkXyk7Ci0gIGlmIChvcGVuZWRfKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8vIENoYW5uZWwgbWl4aW5nIGlzIG5vdCBzdXBwb3J0ZWQsIGl0IG11c3QgYmUgaGFuZGxlZCBieSBDaGFubmVsTWl4ZXIuCi0gIGlmIChmb3JtYXRfLkZvcm1hdC5uQ2hhbm5lbHMgIT0gY2xpZW50X2NoYW5uZWxfY291bnRfKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiQ2hhbm5lbCBkb3duLW1peGluZyBpcyBub3Qgc3VwcG9ydGVkLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gQ3JlYXRlIGFuIElNTURldmljZUVudW1lcmF0b3IgaW50ZXJmYWNlIGFuZCBvYnRhaW4gYSByZWZlcmVuY2UgdG8KLSAgLy8gdGhlIElNTURldmljZSBpbnRlcmZhY2Ugb2YgdGhlIGRlZmF1bHQgcmVuZGVyaW5nIGRldmljZSB3aXRoIHRoZQotICAvLyBzcGVjaWZpZWQgcm9sZS4KLSAgSFJFU1VMVCBociA9IFNldFJlbmRlckRldmljZSgpOwotICBpZiAoRkFJTEVEKGhyKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIE9idGFpbiBhbiBJQXVkaW9DbGllbnQgaW50ZXJmYWNlIHdoaWNoIGVuYWJsZXMgdXMgdG8gY3JlYXRlIGFuZCBpbml0aWFsaXplCi0gIC8vIGFuIGF1ZGlvIHN0cmVhbSBiZXR3ZWVuIGFuIGF1ZGlvIGFwcGxpY2F0aW9uIGFuZCB0aGUgYXVkaW8gZW5naW5lLgotICBociA9IEFjdGl2YXRlUmVuZGVyRGV2aWNlKCk7Ci0gIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgdGhlIHNlbGVjdGVkIGF1ZGlvIGVuZHBvaW50IHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQgZm9ybWF0Ci0gIC8vIHNldCBkdXJpbmcgY29uc3RydWN0aW9uLgotICAvLyBJbiBleGNsdXNpdmUgbW9kZSwgdGhlIGNsaWVudCBjYW4gY2hvb3NlIHRvIG9wZW4gdGhlIHN0cmVhbSBpbiBhbnkgYXVkaW8KLSAgLy8gZm9ybWF0IHRoYXQgdGhlIGVuZHBvaW50IGRldmljZSBzdXBwb3J0cy4gSW4gc2hhcmVkIG1vZGUsIHRoZSBjbGllbnQgbXVzdAotICAvLyBvcGVuIHRoZSBzdHJlYW0gaW4gdGhlIG1peCBmb3JtYXQgdGhhdCBpcyBjdXJyZW50bHkgaW4gdXNlIGJ5IHRoZSBhdWRpbwotICAvLyBlbmdpbmUgKG9yIGEgZm9ybWF0IHRoYXQgaXMgc2ltaWxhciB0byB0aGUgbWl4IGZvcm1hdCkuIFRoZSBhdWRpbyBlbmdpbmUncwotICAvLyBpbnB1dCBzdHJlYW1zIGFuZCB0aGUgb3V0cHV0IG1peCBmcm9tIHRoZSBlbmdpbmUgYXJlIGFsbCBpbiB0aGlzIGZvcm1hdC4KLSAgaWYgKCFEZXNpcmVkRm9ybWF0SXNTdXBwb3J0ZWQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIEluaXRpYWxpemUgdGhlIGF1ZGlvIHN0cmVhbSBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBkZXZpY2UgdXNpbmcKLSAgLy8gc2hhcmVkIG9yIGV4Y2x1c2l2ZSBtb2RlIGFuZCBhIGxvd2VzdCBwb3NzaWJsZSBnbGl0Y2gtZnJlZSBsYXRlbmN5LgotICAvLyBXZSB3aWxsIGVudGVyIGRpZmZlcmVudCBjb2RlIHBhdGhzIGRlcGVuZGluZyBvbiB0aGUgc3BlY2lmaWVkIHNoYXJlIG1vZGUuCi0gIGhyID0gSW5pdGlhbGl6ZUF1ZGlvRW5naW5lKCk7Ci0gIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgb3BlbmVkXyA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFdBU0FQSUF1ZGlvT3V0cHV0U3RyZWFtOjpTdGFydChBdWRpb1NvdXJjZUNhbGxiYWNrKiBjYWxsYmFjaykgewotICBEQ0hFQ0tfRVEoR2V0Q3VycmVudFRocmVhZElkKCksIGNyZWF0aW5nX3RocmVhZF9pZF8pOwotICBDSEVDSyhjYWxsYmFjayk7Ci0gIENIRUNLKG9wZW5lZF8pOwotCi0gIGlmIChyZW5kZXJfdGhyZWFkXy5nZXQoKSkgewotICAgIENIRUNLX0VRKGNhbGxiYWNrLCBzb3VyY2VfKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAocmVzdGFydF9yZW5kZXJpbmdfbW9kZV8pIHsKLSAgICAvLyBUaGUgc2VsZWN0ZWQgYXVkaW8gZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgb3IgZGlzYWJsZWQgYW5kIGEgbmV3Ci0gICAgLy8gZGVmYXVsdCBkZXZpY2UgaGFzIGJlZW4gZW5hYmxlZCBpbnN0ZWFkLiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbgotICAgIC8vIGRvZXMgbm90IHRvIHN1cHBvcnQgdGhpcyBzZXF1ZW5jZSBvZiBldmVudHMuIEdpdmVuIHRoYXQgT3BlbigpCi0gICAgLy8gYW5kIFN0YXJ0KCkgYXJlIHVzdWFsbHkgY2FsbGVkIGluIG9uZSBzZXF1ZW5jZTsgaXQgc2hvdWxkIGJlIGEgdmVyeQotICAgIC8vIHJhcmUgZXZlbnQuCi0gICAgLy8gVE9ETyhoZW5yaWthKTogaXQgaXMgcG9zc2libGUgdG8gZXh0ZW5kIHRoZSBmdW5jdGlvbmFsaXR5IGhlcmUuCi0gICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIHN0YXJ0IHNpbmNlIHRoZSBzZWxlY3RlZCBkZWZhdWx0IGRldmljZSBoYXMgIgotICAgICAgICAgICAgICAgICAgImNoYW5nZWQgc2luY2UgT3BlbigpIHdhcyBjYWxsZWQuIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzb3VyY2VfID0gY2FsbGJhY2s7Ci0KLSAgLy8gQXZvaWQgc3RhcnQtdXAgZ2xpdGNoZXMgYnkgZmlsbGluZyB1cCB0aGUgZW5kcG9pbnQgYnVmZmVyIHdpdGggInNpbGVuY2UiCi0gIC8vIGJlZm9yZSBzdGFydGluZyB0aGUgc3RyZWFtLgotICBCWVRFKiBkYXRhX3B0ciA9IE5VTEw7Ci0gIEhSRVNVTFQgaHIgPSBhdWRpb19yZW5kZXJfY2xpZW50Xy0+R2V0QnVmZmVyKGVuZHBvaW50X2J1ZmZlcl9zaXplX2ZyYW1lc18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhX3B0cik7Ci0gIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgRExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byB1c2UgcmVuZGVyaW5nIGF1ZGlvIGJ1ZmZlcjogIiA8PCBzdGQ6OmhleCA8PCBocjsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBVc2luZyB0aGUgQVVEQ0xOVF9CVUZGRVJGTEFHU19TSUxFTlQgZmxhZyBlbGltaW5hdGVzIHRoZSBuZWVkIHRvCi0gIC8vIGV4cGxpY2l0bHkgd3JpdGUgc2lsZW5jZSBkYXRhIHRvIHRoZSByZW5kZXJpbmcgYnVmZmVyLgotICBhdWRpb19yZW5kZXJfY2xpZW50Xy0+UmVsZWFzZUJ1ZmZlcihlbmRwb2ludF9idWZmZXJfc2l6ZV9mcmFtZXNfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURDTE5UX0JVRkZFUkZMQUdTX1NJTEVOVCk7Ci0gIG51bV93cml0dGVuX2ZyYW1lc18gPSBlbmRwb2ludF9idWZmZXJfc2l6ZV9mcmFtZXNfOwotCi0gIC8vIFNhbml0eSBjaGVjazogdmVyaWZ5IHRoYXQgdGhlIGVuZHBvaW50IGJ1ZmZlciBpcyBmaWxsZWQgd2l0aCBzaWxlbmNlLgotICBVSU5UMzIgbnVtX3F1ZXVlZF9mcmFtZXMgPSAwOwotICBhdWRpb19jbGllbnRfLT5HZXRDdXJyZW50UGFkZGluZygmbnVtX3F1ZXVlZF9mcmFtZXMpOwotICBEQ0hFQ0sobnVtX3F1ZXVlZF9mcmFtZXMgPT0gbnVtX3dyaXR0ZW5fZnJhbWVzXyk7Ci0KLSAgLy8gQ3JlYXRlIGFuZCBzdGFydCB0aGUgdGhyZWFkIHRoYXQgd2lsbCBkcml2ZSB0aGUgcmVuZGVyaW5nIGJ5IHdhaXRpbmcgZm9yCi0gIC8vIHJlbmRlciBldmVudHMuCi0gIHJlbmRlcl90aHJlYWRfLnJlc2V0KAotICAgICAgbmV3IGJhc2U6OkRlbGVnYXRlU2ltcGxlVGhyZWFkKHRoaXMsICJ3YXNhcGlfcmVuZGVyX3RocmVhZCIpKTsKLSAgcmVuZGVyX3RocmVhZF8tPlN0YXJ0KCk7Ci0KLSAgLy8gU3RhcnQgc3RyZWFtaW5nIGRhdGEgYmV0d2VlbiB0aGUgZW5kcG9pbnQgYnVmZmVyIGFuZCB0aGUgYXVkaW8gZW5naW5lLgotICBociA9IGF1ZGlvX2NsaWVudF8tPlN0YXJ0KCk7Ci0gIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgU2V0RXZlbnQoc3RvcF9yZW5kZXJfZXZlbnRfLkdldCgpKTsKLSAgICByZW5kZXJfdGhyZWFkXy0+Sm9pbigpOwotICAgIHJlbmRlcl90aHJlYWRfLnJlc2V0KCk7Ci0gICAgSGFuZGxlRXJyb3IoaHIpOwotICB9Ci19Ci0KLXZvaWQgV0FTQVBJQXVkaW9PdXRwdXRTdHJlYW06OlN0b3AoKSB7Ci0gIERDSEVDS19FUShHZXRDdXJyZW50VGhyZWFkSWQoKSwgY3JlYXRpbmdfdGhyZWFkX2lkXyk7Ci0gIGlmICghcmVuZGVyX3RocmVhZF8uZ2V0KCkpCi0gICAgcmV0dXJuOwotCi0gIC8vIFN0b3Agb3V0cHV0IGF1ZGlvIHN0cmVhbWluZy4KLSAgSFJFU1VMVCBociA9IGF1ZGlvX2NsaWVudF8tPlN0b3AoKTsKLSAgaWYgKEZBSUxFRChocikpIHsKLSAgICBETE9HX0lGKEVSUk9SLCBociAhPSBBVURDTE5UX0VfTk9UX0lOSVRJQUxJWkVEKQotICAgICAgICA8PCAiRmFpbGVkIHRvIHN0b3Agb3V0cHV0IHN0cmVhbWluZzogIiA8PCBzdGQ6OmhleCA8PCBocjsKLSAgfQotCi0gIC8vIFdhaXQgdW50aWwgdGhlIHRocmVhZCBjb21wbGV0ZXMgYW5kIHBlcmZvcm0gY2xlYW51cC4KLSAgU2V0RXZlbnQoc3RvcF9yZW5kZXJfZXZlbnRfLkdldCgpKTsKLSAgcmVuZGVyX3RocmVhZF8tPkpvaW4oKTsKLSAgcmVuZGVyX3RocmVhZF8ucmVzZXQoKTsKLQotICAvLyBFbnN1cmUgdGhhdCB3ZSBkb24ndCBxdWl0IHRoZSBtYWluIHRocmVhZCBsb29wIGltbWVkaWF0ZWx5IG5leHQKLSAgLy8gdGltZSBTdGFydCgpIGlzIGNhbGxlZC4KLSAgUmVzZXRFdmVudChzdG9wX3JlbmRlcl9ldmVudF8uR2V0KCkpOwotCi0gIC8vIENsZWFyIHNvdXJjZSBjYWxsYmFjaywgaXQnbGwgYmUgc2V0IGFnYWluIG9uIHRoZSBuZXh0IFN0YXJ0KCkgY2FsbC4KLSAgc291cmNlXyA9IE5VTEw7Ci0KLSAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgZGF0YSBhbmQgcmVzZXQgdGhlIGF1ZGlvIGNsb2NrIHN0cmVhbSBwb3NpdGlvbiB0byAwLgotICBociA9IGF1ZGlvX2NsaWVudF8tPlJlc2V0KCk7Ci0gIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgRExPR19JRihFUlJPUiwgaHIgIT0gQVVEQ0xOVF9FX05PVF9JTklUSUFMSVpFRCkKLSAgICAgICAgPDwgIkZhaWxlZCB0byByZXNldCBzdHJlYW1pbmc6ICIgPDwgc3RkOjpoZXggPDwgaHI7Ci0gIH0KLQotICAvLyBFeHRyYSBzYWZldHkgY2hlY2sgdG8gZW5zdXJlIHRoYXQgdGhlIGJ1ZmZlcnMgYXJlIGNsZWFyZWQuCi0gIC8vIElmIHRoZSBidWZmZXJzIGFyZSBub3QgY2xlYXJlZCBjb3JyZWN0bHksIHRoZSBuZXh0IGNhbGwgdG8gU3RhcnQoKQotICAvLyB3b3VsZCBmYWlsIHdpdGggQVVEQ0xOVF9FX0JVRkZFUl9FUlJPUiBhdCBJQXVkaW9SZW5kZXJDbGllbnQ6OkdldEJ1ZmZlcigpLgotICAvLyBUaGlzIGNoZWNrIGlzIGlzIG9ubHkgbmVlZGVkIGZvciBzaGFyZWQtbW9kZSBzdHJlYW1zLgotICBpZiAoc2hhcmVfbW9kZV8gPT0gQVVEQ0xOVF9TSEFSRU1PREVfU0hBUkVEKSB7Ci0gICAgVUlOVDMyIG51bV9xdWV1ZWRfZnJhbWVzID0gMDsKLSAgICBhdWRpb19jbGllbnRfLT5HZXRDdXJyZW50UGFkZGluZygmbnVtX3F1ZXVlZF9mcmFtZXMpOwotICAgIERDSEVDS19FUSgwdSwgbnVtX3F1ZXVlZF9mcmFtZXMpOwotICB9Ci19Ci0KLXZvaWQgV0FTQVBJQXVkaW9PdXRwdXRTdHJlYW06OkNsb3NlKCkgewotICBEQ0hFQ0tfRVEoR2V0Q3VycmVudFRocmVhZElkKCksIGNyZWF0aW5nX3RocmVhZF9pZF8pOwotCi0gIC8vIEl0IGlzIHZhbGlkIHRvIGNhbGwgQ2xvc2UoKSBiZWZvcmUgY2FsbGluZyBvcGVuIG9yIFN0YXJ0KCkuCi0gIC8vIEl0IGlzIGFsc28gdmFsaWQgdG8gY2FsbCBDbG9zZSgpIGFmdGVyIFN0YXJ0KCkgaGFzIGJlZW4gY2FsbGVkLgotICBTdG9wKCk7Ci0KLSAgLy8gSW5mb3JtIHRoZSBhdWRpbyBtYW5hZ2VyIHRoYXQgd2UgaGF2ZSBiZWVuIGNsb3NlZC4gVGhpcyB3aWxsIGNhdXNlIG91cgotICAvLyBkZXN0cnVjdGlvbi4KLSAgbWFuYWdlcl8tPlJlbGVhc2VPdXRwdXRTdHJlYW0odGhpcyk7Ci19Ci0KLXZvaWQgV0FTQVBJQXVkaW9PdXRwdXRTdHJlYW06OlNldFZvbHVtZShkb3VibGUgdm9sdW1lKSB7Ci0gIERWTE9HKDEpIDw8ICJTZXRWb2x1bWUodm9sdW1lPSIgPDwgdm9sdW1lIDw8ICIpIjsKLSAgZmxvYXQgdm9sdW1lX2Zsb2F0ID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZvbHVtZSk7Ci0gIGlmICh2b2x1bWVfZmxvYXQgPCAwLjBmIHx8IHZvbHVtZV9mbG9hdCA+IDEuMGYpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgdm9sdW1lXyA9IHZvbHVtZV9mbG9hdDsKLX0KLQotdm9pZCBXQVNBUElBdWRpb091dHB1dFN0cmVhbTo6R2V0Vm9sdW1lKGRvdWJsZSogdm9sdW1lKSB7Ci0gIERWTE9HKDEpIDw8ICJHZXRWb2x1bWUoKSI7Ci0gICp2b2x1bWUgPSBzdGF0aWNfY2FzdDxkb3VibGU+KHZvbHVtZV8pOwotfQotCi0vLyBzdGF0aWMKLWludCBXQVNBUElBdWRpb091dHB1dFN0cmVhbTo6SGFyZHdhcmVDaGFubmVsQ291bnQoKSB7Ci0gIC8vIFVzZSBhIFdBVkVGT1JNQVRFWFRFTlNJQkxFIHN0cnVjdHVyZSBzaW5jZSBpdCBjYW4gc3BlY2lmeSBib3RoIHRoZQotICAvLyBudW1iZXIgb2YgY2hhbm5lbHMgYW5kIHRoZSBtYXBwaW5nIG9mIGNoYW5uZWxzIHRvIHNwZWFrZXJzIGZvcgotICAvLyBtdWx0aWNoYW5uZWwgZGV2aWNlcy4KLSAgYmFzZTo6d2luOjpTY29wZWRDb01lbTxXQVZFRk9STUFUUENNRVg+IGZvcm1hdF9leDsKLSAgSFJFU1VMVCBociA9IEdldE1peEZvcm1hdCgKLSAgICAgIGVDb25zb2xlLCByZWludGVycHJldF9jYXN0PFdBVkVGT1JNQVRFWCoqPigmZm9ybWF0X2V4KSk7Ci0gIGlmIChGQUlMRUQoaHIpKQotICAgIHJldHVybiAwOwotCi0gIC8vIE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgc3RyZWFtLiBDb3JyZXNwb25kcyB0byB0aGUgbnVtYmVyIG9mIGJpdHMKLSAgLy8gc2V0IGluIHRoZSBkd0NoYW5uZWxNYXNrLgotICBEVkxPRygxKSA8PCAiZW5kcG9pbnQgY2hhbm5lbHMgKG91dCk6ICIgPDwgZm9ybWF0X2V4LT5Gb3JtYXQubkNoYW5uZWxzOwotCi0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGZvcm1hdF9leC0+Rm9ybWF0Lm5DaGFubmVscyk7Ci19Ci0KLS8vIHN0YXRpYwotQ2hhbm5lbExheW91dCBXQVNBUElBdWRpb091dHB1dFN0cmVhbTo6SGFyZHdhcmVDaGFubmVsTGF5b3V0KCkgewotICByZXR1cm4gQ2hhbm5lbENvbmZpZ1RvQ2hhbm5lbExheW91dChHZXRDaGFubmVsQ29uZmlnKCkpOwotfQotCi0vLyBzdGF0aWMKLWludCBXQVNBUElBdWRpb091dHB1dFN0cmVhbTo6SGFyZHdhcmVTYW1wbGVSYXRlKEVSb2xlIGRldmljZV9yb2xlKSB7Ci0gIGJhc2U6Ondpbjo6U2NvcGVkQ29NZW08V0FWRUZPUk1BVEVYPiBmb3JtYXQ7Ci0gIEhSRVNVTFQgaHIgPSBHZXRNaXhGb3JtYXQoZGV2aWNlX3JvbGUsICZmb3JtYXQpOwotICBpZiAoRkFJTEVEKGhyKSkKLSAgICByZXR1cm4gMDsKLQotICBEVkxPRygyKSA8PCAiblNhbXBsZXNQZXJTZWM6ICIgPDwgZm9ybWF0LT5uU2FtcGxlc1BlclNlYzsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oZm9ybWF0LT5uU2FtcGxlc1BlclNlYyk7Ci19Ci0KLXZvaWQgV0FTQVBJQXVkaW9PdXRwdXRTdHJlYW06OlJ1bigpIHsKLSAgU2NvcGVkQ09NSW5pdGlhbGl6ZXIgY29tX2luaXQoU2NvcGVkQ09NSW5pdGlhbGl6ZXI6OmtNVEEpOwotCi0gIC8vIEluY3JlYXNlIHRoZSB0aHJlYWQgcHJpb3JpdHkuCi0gIHJlbmRlcl90aHJlYWRfLT5TZXRUaHJlYWRQcmlvcml0eShiYXNlOjprVGhyZWFkUHJpb3JpdHlfUmVhbHRpbWVBdWRpbyk7Ci0KLSAgLy8gRW5hYmxlIE1NQ1NTIHRvIGVuc3VyZSB0aGF0IHRoaXMgdGhyZWFkIHJlY2VpdmVzIHByaW9yaXRpemVkIGFjY2VzcyB0bwotICAvLyBDUFUgcmVzb3VyY2VzLgotICBEV09SRCB0YXNrX2luZGV4ID0gMDsKLSAgSEFORExFIG1tX3Rhc2sgPSBhdnJ0OjpBdlNldE1tVGhyZWFkQ2hhcmFjdGVyaXN0aWNzKEwiUHJvIEF1ZGlvIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXNrX2luZGV4KTsKLSAgYm9vbCBtbWNzc19pc19vayA9Ci0gICAgICAobW1fdGFzayAmJiBhdnJ0OjpBdlNldE1tVGhyZWFkUHJpb3JpdHkobW1fdGFzaywgQVZSVF9QUklPUklUWV9DUklUSUNBTCkpOwotICBpZiAoIW1tY3NzX2lzX29rKSB7Ci0gICAgLy8gRmFpbGVkIHRvIGVuYWJsZSBNTUNTUyBvbiB0aGlzIHRocmVhZC4gSXQgaXMgbm90IGZhdGFsIGJ1dCBjYW4gbGVhZAotICAgIC8vIHRvIHJlZHVjZWQgUW9TIGF0IGhpZ2ggbG9hZC4KLSAgICBEV09SRCBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKLSAgICBMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byBlbmFibGUgTU1DU1MgKGVycm9yIGNvZGU9IiA8PCBlcnIgPDwgIikuIjsKLSAgfQotCi0gIEhSRVNVTFQgaHIgPSBTX0ZBTFNFOwotCi0gIGJvb2wgcGxheWluZyA9IHRydWU7Ci0gIGJvb2wgZXJyb3IgPSBmYWxzZTsKLSAgSEFORExFIHdhaXRfYXJyYXlbXSA9IHsgc3RvcF9yZW5kZXJfZXZlbnRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zYW1wbGVzX3JlbmRlcl9ldmVudF8gfTsKLSAgVUlOVDY0IGRldmljZV9mcmVxdWVuY3kgPSAwOwotCi0gIC8vIFRoZSBJQXVkaW9DbG9jayBpbnRlcmZhY2UgZW5hYmxlcyB1cyB0byBtb25pdG9yIGEgc3RyZWFtJ3MgZGF0YQotICAvLyByYXRlIGFuZCB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgc3RyZWFtLiBBbGxvY2F0ZSBpdCBiZWZvcmUgd2UKLSAgLy8gc3RhcnQgc3Bpbm5pbmcuCi0gIFNjb3BlZENvbVB0cjxJQXVkaW9DbG9jaz4gYXVkaW9fY2xvY2s7Ci0gIGhyID0gYXVkaW9fY2xpZW50Xy0+R2V0U2VydmljZShfX3V1aWRvZihJQXVkaW9DbG9jayksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jbG9jay5SZWNlaXZlVm9pZCgpKTsKLSAgaWYgKFNVQ0NFRURFRChocikpIHsKLSAgICAvLyBUaGUgZGV2aWNlIGZyZXF1ZW5jeSBpcyB0aGUgZnJlcXVlbmN5IGdlbmVyYXRlZCBieSB0aGUgaGFyZHdhcmUgY2xvY2sgaW4KLSAgICAvLyB0aGUgYXVkaW8gZGV2aWNlLiBUaGUgR2V0RnJlcXVlbmN5KCkgbWV0aG9kIHJlcG9ydHMgYSBjb25zdGFudCBmcmVxdWVuY3kuCi0gICAgaHIgPSBhdWRpb19jbG9jay0+R2V0RnJlcXVlbmN5KCZkZXZpY2VfZnJlcXVlbmN5KTsKLSAgfQotICBlcnJvciA9IEZBSUxFRChocik7Ci0gIFBMT0dfSUYoRVJST1IsIGVycm9yKSA8PCAiRmFpbGVkIHRvIGFjcXVpcmUgSUF1ZGlvQ2xvY2sgaW50ZXJmYWNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmhleCA8PCBocjsKLQotICAvLyBLZWVwIHJlbmRlcmluZyBhdWRpbyB1bnRpbCB0aGUgc3RvcCBldmVudCBvciB0aGUgc3RyZWFtLXN3aXRjaCBldmVudAotICAvLyBpcyBzaWduYWxlZC4gQW4gZXJyb3IgZXZlbnQgY2FuIGFsc28gYnJlYWsgdGhlIG1haW4gdGhyZWFkIGxvb3AuCi0gIHdoaWxlIChwbGF5aW5nICYmICFlcnJvcikgewotICAgIC8vIFdhaXQgZm9yIGEgY2xvc2UtZG93biBldmVudCwgc3RyZWFtLXN3aXRjaCBldmVudCBvciBhIG5ldyByZW5kZXIgZXZlbnQuCi0gICAgRFdPUkQgd2FpdF9yZXN1bHQgPSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKGFycmF5c2l6ZSh3YWl0X2FycmF5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdF9hcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORklOSVRFKTsKLQotICAgIHN3aXRjaCAod2FpdF9yZXN1bHQpIHsKLSAgICAgIGNhc2UgV0FJVF9PQkpFQ1RfMCArIDA6Ci0gICAgICAgIC8vIHxzdG9wX3JlbmRlcl9ldmVudF98IGhhcyBiZWVuIHNldC4KLSAgICAgICAgcGxheWluZyA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgV0FJVF9PQkpFQ1RfMCArIDE6Ci0gICAgICAgIHsKLSAgICAgICAgICAvLyB8YXVkaW9fc2FtcGxlc19yZW5kZXJfZXZlbnRffCBoYXMgYmVlbiBzZXQuCi0gICAgICAgICAgVUlOVDMyIG51bV9xdWV1ZWRfZnJhbWVzID0gMDsKLSAgICAgICAgICB1aW50OCogYXVkaW9fZGF0YSA9IE5VTEw7Ci0KLSAgICAgICAgICAvLyBDb250YWlucyBob3cgbXVjaCBuZXcgZGF0YSB3ZSBjYW4gd3JpdGUgdG8gdGhlIGJ1ZmZlciB3aXRob3V0Ci0gICAgICAgICAgLy8gdGhlIHJpc2sgb2Ygb3ZlcndyaXRpbmcgcHJldmlvdXNseSB3cml0dGVuIGRhdGEgdGhhdCB0aGUgYXVkaW8KLSAgICAgICAgICAvLyBlbmdpbmUgaGFzIG5vdCB5ZXQgcmVhZCBmcm9tIHRoZSBidWZmZXIuCi0gICAgICAgICAgc2l6ZV90IG51bV9hdmFpbGFibGVfZnJhbWVzID0gMDsKLQotICAgICAgICAgIGlmIChzaGFyZV9tb2RlXyA9PSBBVURDTE5UX1NIQVJFTU9ERV9TSEFSRUQpIHsKLSAgICAgICAgICAgIC8vIEdldCB0aGUgcGFkZGluZyB2YWx1ZSB3aGljaCByZXByZXNlbnRzIHRoZSBhbW91bnQgb2YgcmVuZGVyaW5nCi0gICAgICAgICAgICAvLyBkYXRhIHRoYXQgaXMgcXVldWVkIHVwIHRvIHBsYXkgaW4gdGhlIGVuZHBvaW50IGJ1ZmZlci4KLSAgICAgICAgICAgIGhyID0gYXVkaW9fY2xpZW50Xy0+R2V0Q3VycmVudFBhZGRpbmcoJm51bV9xdWV1ZWRfZnJhbWVzKTsKLSAgICAgICAgICAgIG51bV9hdmFpbGFibGVfZnJhbWVzID0KLSAgICAgICAgICAgICAgICBlbmRwb2ludF9idWZmZXJfc2l6ZV9mcmFtZXNfIC0gbnVtX3F1ZXVlZF9mcmFtZXM7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFdoaWxlIHRoZSBzdHJlYW0gaXMgcnVubmluZywgdGhlIHN5c3RlbSBhbHRlcm5hdGVseSBzZW5kcyBvbmUKLSAgICAgICAgICAgIC8vIGJ1ZmZlciBvciB0aGUgb3RoZXIgdG8gdGhlIGNsaWVudC4gVGhpcyBmb3JtIG9mIGRvdWJsZSBidWZmZXJpbmcKLSAgICAgICAgICAgIC8vIGlzIHJlZmVycmVkIHRvIGFzICJwaW5nLXBvbmdpbmciLiBFYWNoIHRpbWUgdGhlIGNsaWVudCByZWNlaXZlcwotICAgICAgICAgICAgLy8gYSBidWZmZXIgZnJvbSB0aGUgc3lzdGVtICh0cmlnZ2VycyB0aGlzIGV2ZW50KSB0aGUgY2xpZW50IG11c3QKLSAgICAgICAgICAgIC8vIHByb2Nlc3MgdGhlIGVudGlyZSBidWZmZXIuIENhbGxzIHRvIHRoZSBHZXRDdXJyZW50UGFkZGluZyBtZXRob2QKLSAgICAgICAgICAgIC8vIGFyZSB1bm5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBwYWNrZXQgc2l6ZSBtdXN0IGFsd2F5cyBlcXVhbCB0aGUKLSAgICAgICAgICAgIC8vIGJ1ZmZlciBzaXplLiBJbiBjb250cmFzdCB0byB0aGUgc2hhcmVkIG1vZGUgYnVmZmVyaW5nIHNjaGVtZSwKLSAgICAgICAgICAgIC8vIHRoZSBsYXRlbmN5IGZvciBhbiBldmVudC1kcml2ZW4sIGV4Y2x1c2l2ZS1tb2RlIHN0cmVhbSBkZXBlbmRzCi0gICAgICAgICAgICAvLyBkaXJlY3RseSBvbiB0aGUgYnVmZmVyIHNpemUuCi0gICAgICAgICAgICBudW1fYXZhaWxhYmxlX2ZyYW1lcyA9IGVuZHBvaW50X2J1ZmZlcl9zaXplX2ZyYW1lc187Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgZW5vdWdoIGF2YWlsYWJsZSBzcGFjZSB0byBmaXQgdGhlIHBhY2tldCBzaXplCi0gICAgICAgICAgLy8gc3BlY2lmaWVkIGJ5IHRoZSBjbGllbnQuCi0gICAgICAgICAgaWYgKEZBSUxFRChocikgfHwgKG51bV9hdmFpbGFibGVfZnJhbWVzIDwgcGFja2V0X3NpemVfZnJhbWVzXykpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgIC8vIERlcml2ZSB0aGUgbnVtYmVyIG9mIHBhY2tldHMgd2UgbmVlZCBnZXQgZnJvbSB0aGUgY2xpZW50IHRvCi0gICAgICAgICAgLy8gZmlsbCB1cCB0aGUgYXZhaWxhYmxlIGFyZWEgaW4gdGhlIGVuZHBvaW50IGJ1ZmZlci4KLSAgICAgICAgICAvLyB8bnVtX3BhY2tldHN8IHdpbGwgYWx3YXlzIGJlIG9uZSBmb3IgZXhjbHVzaXZlLW1vZGUgc3RyZWFtcy4KLSAgICAgICAgICBzaXplX3QgbnVtX3BhY2tldHMgPSAobnVtX2F2YWlsYWJsZV9mcmFtZXMgLyBwYWNrZXRfc2l6ZV9mcmFtZXNfKTsKLQotICAgICAgICAgIC8vIEdldCBkYXRhIGZyb20gdGhlIGNsaWVudC9zb3VyY2UuCi0gICAgICAgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBudW1fcGFja2V0czsgKytuKSB7Ci0gICAgICAgICAgICAvLyBHcmFiIGFsbCBhdmFpbGFibGUgc3BhY2UgaW4gdGhlIHJlbmRlcmluZyBlbmRwb2ludCBidWZmZXIKLSAgICAgICAgICAgIC8vIGludG8gd2hpY2ggdGhlIGNsaWVudCBjYW4gd3JpdGUgYSBkYXRhIHBhY2tldC4KLSAgICAgICAgICAgIGhyID0gYXVkaW9fcmVuZGVyX2NsaWVudF8tPkdldEJ1ZmZlcihwYWNrZXRfc2l6ZV9mcmFtZXNfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdWRpb19kYXRhKTsKLSAgICAgICAgICAgIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgICAgICAgICAgIERMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gdXNlIHJlbmRlcmluZyBhdWRpbyBidWZmZXI6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpoZXggPDwgaHI7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBEZXJpdmUgdGhlIGF1ZGlvIGRlbGF5IHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBkZWxheSBiZXR3ZWVuCi0gICAgICAgICAgICAvLyBhIHJlbmRlciBldmVudCBhbmQgdGhlIHRpbWUgd2hlbiB0aGUgZmlyc3QgYXVkaW8gc2FtcGxlIGluIGEKLSAgICAgICAgICAgIC8vIHBhY2tldCBpcyBwbGF5ZWQgb3V0IHRocm91Z2ggdGhlIHNwZWFrZXIuIFRoaXMgZGVsYXkgdmFsdWUKLSAgICAgICAgICAgIC8vIGNhbiB0eXBpY2FsbHkgYmUgdXRpbGl6ZWQgYnkgYW4gYWNvdXN0aWMgZWNoby1jb250cm9sIChBRUMpCi0gICAgICAgICAgICAvLyB1bml0IGF0IHRoZSByZW5kZXIgc2lkZS4KLSAgICAgICAgICAgIFVJTlQ2NCBwb3NpdGlvbiA9IDA7Ci0gICAgICAgICAgICBpbnQgYXVkaW9fZGVsYXlfYnl0ZXMgPSAwOwotICAgICAgICAgICAgaHIgPSBhdWRpb19jbG9jay0+R2V0UG9zaXRpb24oJnBvc2l0aW9uLCBOVUxMKTsKLSAgICAgICAgICAgIGlmIChTVUNDRUVERUQoaHIpKSB7Ci0gICAgICAgICAgICAgIC8vIFN0cmVhbSBwb3NpdGlvbiBvZiB0aGUgc2FtcGxlIHRoYXQgaXMgY3VycmVudGx5IHBsYXlpbmcKLSAgICAgICAgICAgICAgLy8gdGhyb3VnaCB0aGUgc3BlYWtlci4KLSAgICAgICAgICAgICAgZG91YmxlIHBvc19zYW1wbGVfcGxheWluZ19mcmFtZXMgPSBmb3JtYXRfLkZvcm1hdC5uU2FtcGxlc1BlclNlYyAqCi0gICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8ZG91YmxlPihwb3NpdGlvbikgLyBkZXZpY2VfZnJlcXVlbmN5KTsKLQotICAgICAgICAgICAgICAvLyBTdHJlYW0gcG9zaXRpb24gb2YgdGhlIGxhc3Qgc2FtcGxlIHdyaXR0ZW4gdG8gdGhlIGVuZHBvaW50Ci0gICAgICAgICAgICAgIC8vIGJ1ZmZlci4gTm90ZSB0aGF0LCB0aGUgcGFja2V0IHdlIGFyZSBhYm91dCB0byByZWNlaXZlIGluCi0gICAgICAgICAgICAgIC8vIHRoZSB1cGNvbWluZyBjYWxsYmFjayBpcyBhbHNvIGluY2x1ZGVkLgotICAgICAgICAgICAgICBzaXplX3QgcG9zX2xhc3Rfc2FtcGxlX3dyaXR0ZW5fZnJhbWVzID0KLSAgICAgICAgICAgICAgICAgIG51bV93cml0dGVuX2ZyYW1lc18gKyBwYWNrZXRfc2l6ZV9mcmFtZXNfOwotCi0gICAgICAgICAgICAgIC8vIERlcml2ZSB0aGUgYWN0dWFsIGRlbGF5IHZhbHVlIHdoaWNoIHdpbGwgYmUgZmVkIHRvIHRoZQotICAgICAgICAgICAgICAvLyByZW5kZXIgY2xpZW50IHVzaW5nIHRoZSBPbk1vcmVEYXRhKCkgY2FsbGJhY2suCi0gICAgICAgICAgICAgIGF1ZGlvX2RlbGF5X2J5dGVzID0gKHBvc19sYXN0X3NhbXBsZV93cml0dGVuX2ZyYW1lcyAtCi0gICAgICAgICAgICAgICAgICBwb3Nfc2FtcGxlX3BsYXlpbmdfZnJhbWVzKSAqICBmcmFtZV9zaXplXzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmVhZCBhIGRhdGEgcGFja2V0IGZyb20gdGhlIHJlZ2lzdGVyZWQgY2xpZW50IHNvdXJjZSBhbmQKLSAgICAgICAgICAgIC8vIGRlbGl2ZXIgYSBkZWxheSBlc3RpbWF0ZSBpbiB0aGUgc2FtZSBjYWxsYmFjayB0byB0aGUgY2xpZW50LgotICAgICAgICAgICAgLy8gQSB0aW1lIHN0YW1wIGlzIGFsc28gc3RvcmVkIGluIHRoZSBBdWRpb0J1ZmZlcnNTdGF0ZS4gVGhpcwotICAgICAgICAgICAgLy8gdGltZSBzdGFtcCBjYW4gYmUgdXNlZCBhdCB0aGUgY2xpZW50IHNpZGUgdG8gY29tcGVuc2F0ZSBmb3IKLSAgICAgICAgICAgIC8vIHRoZSBkZWxheSBiZXR3ZWVuIHRoZSB1c2FnZSBvZiB0aGUgZGVsYXkgdmFsdWUgYW5kIHRoZSB0aW1lCi0gICAgICAgICAgICAvLyBvZiBnZW5lcmF0aW9uLgotCi0gICAgICAgICAgICB1aW50MzIgbnVtX2ZpbGxlZF9ieXRlcyA9IDA7Ci0gICAgICAgICAgICBjb25zdCBpbnQgYnl0ZXNfcGVyX3NhbXBsZSA9IGZvcm1hdF8uRm9ybWF0LndCaXRzUGVyU2FtcGxlID4+IDM7Ci0KLSAgICAgICAgICAgIGludCBmcmFtZXNfZmlsbGVkID0gc291cmNlXy0+T25Nb3JlRGF0YSgKLSAgICAgICAgICAgICAgICBhdWRpb19idXNfLmdldCgpLCBBdWRpb0J1ZmZlcnNTdGF0ZSgwLCBhdWRpb19kZWxheV9ieXRlcykpOwotICAgICAgICAgICAgbnVtX2ZpbGxlZF9ieXRlcyA9IGZyYW1lc19maWxsZWQgKiBmcmFtZV9zaXplXzsKLSAgICAgICAgICAgIERDSEVDS19MRShudW1fZmlsbGVkX2J5dGVzLCBwYWNrZXRfc2l6ZV9ieXRlc18pOwotICAgICAgICAgICAgLy8gTm90ZTogSWYgdGhpcyBldmVyIGNoYW5nZXMgdG8gb3V0cHV0IHJhdyBmbG9hdCB0aGUgZGF0YSBtdXN0IGJlCi0gICAgICAgICAgICAvLyBjbGlwcGVkIGFuZCBzYW5pdGl6ZWQgc2luY2UgaXQgbWF5IGNvbWUgZnJvbSBhbiB1bnRydXN0ZWQKLSAgICAgICAgICAgIC8vIHNvdXJjZSBzdWNoIGFzIE5hQ2wuCi0gICAgICAgICAgICBhdWRpb19idXNfLT5Ub0ludGVybGVhdmVkKAotICAgICAgICAgICAgICAgIGZyYW1lc19maWxsZWQsIGJ5dGVzX3Blcl9zYW1wbGUsIGF1ZGlvX2RhdGEpOwotCi0gICAgICAgICAgICAvLyBQZXJmb3JtIGluLXBsYWNlLCBzb2Z0d2FyZS12b2x1bWUgYWRqdXN0bWVudHMuCi0gICAgICAgICAgICBtZWRpYTo6QWRqdXN0Vm9sdW1lKGF1ZGlvX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9maWxsZWRfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1c18tPmNoYW5uZWxzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3Blcl9zYW1wbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV8pOwotCi0gICAgICAgICAgICAvLyBaZXJvIG91dCB0aGUgcGFydCBvZiB0aGUgcGFja2V0IHdoaWNoIGhhcyBub3QgYmVlbiBmaWxsZWQgYnkKLSAgICAgICAgICAgIC8vIHRoZSBjbGllbnQuIFVzaW5nIHNpbGVuY2UgaXMgdGhlIGxlYXN0IGJhZCBvcHRpb24gaW4gdGhpcwotICAgICAgICAgICAgLy8gc2l0dWF0aW9uLgotICAgICAgICAgICAgaWYgKG51bV9maWxsZWRfYnl0ZXMgPCBwYWNrZXRfc2l6ZV9ieXRlc18pIHsKLSAgICAgICAgICAgICAgbWVtc2V0KCZhdWRpb19kYXRhW251bV9maWxsZWRfYnl0ZXNdLCAwLAotICAgICAgICAgICAgICAgICAgICAgKHBhY2tldF9zaXplX2J5dGVzXyAtIG51bV9maWxsZWRfYnl0ZXMpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmVsZWFzZSB0aGUgYnVmZmVyIHNwYWNlIGFjcXVpcmVkIGluIHRoZSBHZXRCdWZmZXIoKSBjYWxsLgotICAgICAgICAgICAgRFdPUkQgZmxhZ3MgPSAwOwotICAgICAgICAgICAgYXVkaW9fcmVuZGVyX2NsaWVudF8tPlJlbGVhc2VCdWZmZXIocGFja2V0X3NpemVfZnJhbWVzXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQotICAgICAgICAgICAgbnVtX3dyaXR0ZW5fZnJhbWVzXyArPSBwYWNrZXRfc2l6ZV9mcmFtZXNfOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGVycm9yID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHBsYXlpbmcgJiYgZXJyb3IpIHsKLSAgICAvLyBTdG9wIGF1ZGlvIHJlbmRlcmluZyBzaW5jZSBzb21ldGhpbmcgaGFzIGdvbmUgd3JvbmcgaW4gb3VyIG1haW4gdGhyZWFkCi0gICAgLy8gbG9vcC4gTm90ZSB0aGF0LCB3ZSBhcmUgc3RpbGwgaW4gYSAic3RhcnRlZCIgc3RhdGUsIGhlbmNlIGEgU3RvcCgpIGNhbGwKLSAgICAvLyBpcyByZXF1aXJlZCB0byBqb2luIHRoZSB0aHJlYWQgcHJvcGVybHkuCi0gICAgYXVkaW9fY2xpZW50Xy0+U3RvcCgpOwotICAgIFBMT0coRVJST1IpIDw8ICJXQVNBUEkgcmVuZGVyaW5nIGZhaWxlZC4iOwotICB9Ci0KLSAgLy8gRGlzYWJsZSBNTUNTUy4KLSAgaWYgKG1tX3Rhc2sgJiYgIWF2cnQ6OkF2UmV2ZXJ0TW1UaHJlYWRDaGFyYWN0ZXJpc3RpY3MobW1fdGFzaykpIHsKLSAgICBQTE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gZGlzYWJsZSBNTUNTUyI7Ci0gIH0KLX0KLQotdm9pZCBXQVNBUElBdWRpb091dHB1dFN0cmVhbTo6SGFuZGxlRXJyb3IoSFJFU1VMVCBlcnIpIHsKLSAgQ0hFQ0soKHN0YXJ0ZWQoKSAmJiBHZXRDdXJyZW50VGhyZWFkSWQoKSA9PSByZW5kZXJfdGhyZWFkXy0+dGlkKCkpIHx8Ci0gICAgICAgICghc3RhcnRlZCgpICYmIEdldEN1cnJlbnRUaHJlYWRJZCgpID09IGNyZWF0aW5nX3RocmVhZF9pZF8pKTsKLSAgTk9UUkVBQ0hFRCgpIDw8ICJFcnJvciBjb2RlOiAiIDw8IHN0ZDo6aGV4IDw8IGVycjsKLSAgaWYgKHNvdXJjZV8pCi0gICAgc291cmNlXy0+T25FcnJvcih0aGlzLCBzdGF0aWNfY2FzdDxpbnQ+KGVycikpOwotfQotCi1IUkVTVUxUIFdBU0FQSUF1ZGlvT3V0cHV0U3RyZWFtOjpTZXRSZW5kZXJEZXZpY2UoKSB7Ci0gIFNjb3BlZENvbVB0cjxJTU1EZXZpY2VFbnVtZXJhdG9yPiBkZXZpY2VfZW51bWVyYXRvcjsKLSAgU2NvcGVkQ29tUHRyPElNTURldmljZT4gZW5kcG9pbnRfZGV2aWNlOwotCi0gIC8vIENyZWF0ZSB0aGUgSU1NRGV2aWNlRW51bWVyYXRvciBpbnRlcmZhY2UuCi0gIEhSRVNVTFQgaHIgPSBDb0NyZWF0ZUluc3RhbmNlKF9fdXVpZG9mKE1NRGV2aWNlRW51bWVyYXRvciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMU0NUWF9JTlBST0NfU0VSVkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3V1aWRvZihJTU1EZXZpY2VFbnVtZXJhdG9yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2VudW1lcmF0b3IuUmVjZWl2ZVZvaWQoKSk7Ci0gIGlmIChTVUNDRUVERUQoaHIpKSB7Ci0gICAgLy8gUmV0cmlldmUgdGhlIGRlZmF1bHQgcmVuZGVyIGF1ZGlvIGVuZHBvaW50IGZvciB0aGUgc3BlY2lmaWVkIHJvbGUuCi0gICAgLy8gTm90ZSB0aGF0LCBpbiBXaW5kb3dzIFZpc3RhLCB0aGUgTU1EZXZpY2UgQVBJIHN1cHBvcnRzIGRldmljZSByb2xlcwotICAgIC8vIGJ1dCB0aGUgc3lzdGVtLXN1cHBsaWVkIHVzZXIgaW50ZXJmYWNlIHByb2dyYW1zIGRvIG5vdC4KLSAgICBociA9IGRldmljZV9lbnVtZXJhdG9yLT5HZXREZWZhdWx0QXVkaW9FbmRwb2ludCgKLSAgICAgICAgZVJlbmRlciwgZGV2aWNlX3JvbGVfLCBlbmRwb2ludF9kZXZpY2UuUmVjZWl2ZSgpKTsKLSAgICBpZiAoRkFJTEVEKGhyKSkKLSAgICAgIHJldHVybiBocjsKLQotICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBhdWRpbyBlbmRwb2ludCBkZXZpY2UgaXMgYWN0aXZlLiBUaGF0IGlzLCB0aGUgYXVkaW8KLSAgICAvLyBhZGFwdGVyIHRoYXQgY29ubmVjdHMgdG8gdGhlIGVuZHBvaW50IGRldmljZSBpcyBwcmVzZW50IGFuZCBlbmFibGVkLgotICAgIERXT1JEIHN0YXRlID0gREVWSUNFX1NUQVRFX0RJU0FCTEVEOwotICAgIGhyID0gZW5kcG9pbnRfZGV2aWNlLT5HZXRTdGF0ZSgmc3RhdGUpOwotICAgIGlmIChTVUNDRUVERUQoaHIpKSB7Ci0gICAgICBpZiAoIShzdGF0ZSAmIERFVklDRV9TVEFURV9BQ1RJVkUpKSB7Ci0gICAgICAgIERMT0coRVJST1IpIDw8ICJTZWxlY3RlZCByZW5kZXIgZGV2aWNlIGlzIG5vdCBhY3RpdmUuIjsKLSAgICAgICAgaHIgPSBFX0FDQ0VTU0RFTklFRDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoU1VDQ0VFREVEKGhyKSkgewotICAgIGRldmljZV9lbnVtZXJhdG9yXyA9IGRldmljZV9lbnVtZXJhdG9yOwotICAgIGVuZHBvaW50X2RldmljZV8gPSBlbmRwb2ludF9kZXZpY2U7Ci0gIH0KLQotICByZXR1cm4gaHI7Ci19Ci0KLUhSRVNVTFQgV0FTQVBJQXVkaW9PdXRwdXRTdHJlYW06OkFjdGl2YXRlUmVuZGVyRGV2aWNlKCkgewotICBTY29wZWRDb21QdHI8SUF1ZGlvQ2xpZW50PiBhdWRpb19jbGllbnQ7Ci0KLSAgLy8gQ3JlYXRlcyBhbmQgYWN0aXZhdGVzIGFuIElBdWRpb0NsaWVudCBDT00gb2JqZWN0IGdpdmVuIHRoZSBzZWxlY3RlZAotICAvLyByZW5kZXIgZW5kcG9pbnQgZGV2aWNlLgotICBIUkVTVUxUIGhyID0gZW5kcG9pbnRfZGV2aWNlXy0+QWN0aXZhdGUoX191dWlkb2YoSUF1ZGlvQ2xpZW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMU0NUWF9JTlBST0NfU0VSVkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NsaWVudC5SZWNlaXZlVm9pZCgpKTsKLSAgaWYgKFNVQ0NFRURFRChocikpIHsKLSAgICAvLyBSZXRyaWV2ZSB0aGUgc3RyZWFtIGZvcm1hdCB0aGF0IHRoZSBhdWRpbyBlbmdpbmUgdXNlcyBmb3IgaXRzIGludGVybmFsCi0gICAgLy8gcHJvY2Vzc2luZy9taXhpbmcgb2Ygc2hhcmVkLW1vZGUgc3RyZWFtcy4KLSAgICBhdWRpb19lbmdpbmVfbWl4X2Zvcm1hdF8uUmVzZXQoTlVMTCk7Ci0gICAgaHIgPSBhdWRpb19jbGllbnQtPkdldE1peEZvcm1hdCgKLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxXQVZFRk9STUFURVgqKj4oJmF1ZGlvX2VuZ2luZV9taXhfZm9ybWF0XykpOwotCi0gICAgaWYgKFNVQ0NFRURFRChocikpIHsKLSAgICAgIGF1ZGlvX2NsaWVudF8gPSBhdWRpb19jbGllbnQ7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGhyOwotfQotCi1ib29sIFdBU0FQSUF1ZGlvT3V0cHV0U3RyZWFtOjpEZXNpcmVkRm9ybWF0SXNTdXBwb3J0ZWQoKSB7Ci0gIC8vIERldGVybWluZSwgYmVmb3JlIGNhbGxpbmcgSUF1ZGlvQ2xpZW50OjpJbml0aWFsaXplKCksIHdoZXRoZXIgdGhlIGF1ZGlvCi0gIC8vIGVuZ2luZSBzdXBwb3J0cyBhIHBhcnRpY3VsYXIgc3RyZWFtIGZvcm1hdC4KLSAgLy8gSW4gc2hhcmVkIG1vZGUsIHRoZSBhdWRpbyBlbmdpbmUgYWx3YXlzIHN1cHBvcnRzIHRoZSBtaXggZm9ybWF0LAotICAvLyB3aGljaCBpcyBzdG9yZWQgaW4gdGhlIHxhdWRpb19lbmdpbmVfbWl4X2Zvcm1hdF98IG1lbWJlciBhbmQgaXQgaXMgYWxzbwotICAvLyBwb3NzaWJsZSB0byByZWNlaXZlIGEgcHJvcG9zZWQgKGNsb3Nlc3QpIGZvcm1hdCBpZiB0aGUgY3VycmVudCBmb3JtYXQgaXMKLSAgLy8gbm90IHN1cHBvcnRlZC4KLSAgYmFzZTo6d2luOjpTY29wZWRDb01lbTxXQVZFRk9STUFURVhURU5TSUJMRT4gY2xvc2VzdF9tYXRjaDsKLSAgSFJFU1VMVCBociA9IGF1ZGlvX2NsaWVudF8tPklzRm9ybWF0U3VwcG9ydGVkKAotICAgICAgc2hhcmVfbW9kZV8sIHJlaW50ZXJwcmV0X2Nhc3Q8V0FWRUZPUk1BVEVYKj4oJmZvcm1hdF8pLAotICAgICAgcmVpbnRlcnByZXRfY2FzdDxXQVZFRk9STUFURVgqKj4oJmNsb3Nlc3RfbWF0Y2gpKTsKLQotICAvLyBUaGlzIGxvZyBjYW4gb25seSBiZSB0cmlnZ2VyZWQgZm9yIHNoYXJlZCBtb2RlLgotICBETE9HX0lGKEVSUk9SLCBociA9PSBTX0ZBTFNFKSA8PCAiRm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiYnV0IGEgY2xvc2VzdCBtYXRjaCBleGlzdHMuIjsKLSAgLy8gVGhpcyBsb2cgY2FuIGJlIHRyaWdnZXJlZCBib3RoIGZvciBzaGFyZWQgYW5kIGV4Y2x1c2l2ZSBtb2Rlcy4KLSAgRExPR19JRihFUlJPUiwgaHIgPT0gQVVEQ0xOVF9FX1VOU1VQUE9SVEVEX0ZPUk1BVCkgPDwgIlVuc3VwcG9ydGVkIGZvcm1hdC4iOwotICBpZiAoaHIgPT0gU19GQUxTRSkgewotICAgIERWTE9HKDEpIDw8ICJ3Rm9ybWF0VGFnICAgIDogIiA8PCBjbG9zZXN0X21hdGNoLT5Gb3JtYXQud0Zvcm1hdFRhZzsKLSAgICBEVkxPRygxKSA8PCAibkNoYW5uZWxzICAgICA6ICIgPDwgY2xvc2VzdF9tYXRjaC0+Rm9ybWF0Lm5DaGFubmVsczsKLSAgICBEVkxPRygxKSA8PCAiblNhbXBsZXNQZXJTZWM6ICIgPDwgY2xvc2VzdF9tYXRjaC0+Rm9ybWF0Lm5TYW1wbGVzUGVyU2VjOwotICAgIERWTE9HKDEpIDw8ICJ3Qml0c1BlclNhbXBsZTogIiA8PCBjbG9zZXN0X21hdGNoLT5Gb3JtYXQud0JpdHNQZXJTYW1wbGU7Ci0gIH0KLQotICByZXR1cm4gKGhyID09IFNfT0spOwotfQotCi1IUkVTVUxUIFdBU0FQSUF1ZGlvT3V0cHV0U3RyZWFtOjpJbml0aWFsaXplQXVkaW9FbmdpbmUoKSB7Ci0jaWYgIWRlZmluZWQoTkRFQlVHKQotICAvLyBUaGUgcGVyaW9kIGJldHdlZW4gcHJvY2Vzc2luZyBwYXNzZXMgYnkgdGhlIGF1ZGlvIGVuZ2luZSBpcyBmaXhlZCBmb3IgYQotICAvLyBwYXJ0aWN1bGFyIGF1ZGlvIGVuZHBvaW50IGRldmljZSBhbmQgcmVwcmVzZW50cyB0aGUgc21hbGxlc3QgcHJvY2Vzc2luZwotICAvLyBxdWFudHVtIGZvciB0aGUgYXVkaW8gZW5naW5lLiBUaGlzIHBlcmlvZCBwbHVzIHRoZSBzdHJlYW0gbGF0ZW5jeSBiZXR3ZWVuCi0gIC8vIHRoZSBidWZmZXIgYW5kIGVuZHBvaW50IGRldmljZSByZXByZXNlbnRzIHRoZSBtaW5pbXVtIHBvc3NpYmxlIGxhdGVuY3kKLSAgLy8gdGhhdCBhbiBhdWRpbyBhcHBsaWNhdGlvbiBjYW4gYWNoaWV2ZSBpbiBzaGFyZWQgbW9kZS4KLSAgewotICAgIFJFRkVSRU5DRV9USU1FIGRlZmF1bHRfZGV2aWNlX3BlcmlvZCA9IDA7Ci0gICAgUkVGRVJFTkNFX1RJTUUgbWluaW11bV9kZXZpY2VfcGVyaW9kID0gMDsKLSAgICBIUkVTVUxUIGhyX2RiZyA9IGF1ZGlvX2NsaWVudF8tPkdldERldmljZVBlcmlvZCgmZGVmYXVsdF9kZXZpY2VfcGVyaW9kLAotICAgICAgJm1pbmltdW1fZGV2aWNlX3BlcmlvZCk7Ci0gICAgaWYgKFNVQ0NFRURFRChocl9kYmcpKSB7Ci0gICAgICAvLyBTaGFyZWQgbW9kZSBkZXZpY2UgcGVyaW9kLgotICAgICAgRFZMT0coMSkgPDwgInNoYXJlZCBtb2RlIChkZWZhdWx0KSBkZXZpY2UgcGVyaW9kOiAiCi0gICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxkb3VibGU+KGRlZmF1bHRfZGV2aWNlX3BlcmlvZCAvIDEwMDAwLjApCi0gICAgICAgICAgICAgICA8PCAiIFttc10iOwotICAgICAgLy8gRXhjbHVzaXZlIG1vZGUgZGV2aWNlIHBlcmlvZC4KLSAgICAgIERWTE9HKDEpIDw8ICJleGNsdXNpdmUgbW9kZSAobWluaW11bSkgZGV2aWNlIHBlcmlvZDogIgotICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8ZG91YmxlPihtaW5pbXVtX2RldmljZV9wZXJpb2QgLyAxMDAwMC4wKQotICAgICAgICAgICAgICAgPDwgIiBbbXNdIjsKLSAgICB9Ci0KLSAgICBSRUZFUkVOQ0VfVElNRSBsYXRlbmN5ID0gMDsKLSAgICBocl9kYmcgPSBhdWRpb19jbGllbnRfLT5HZXRTdHJlYW1MYXRlbmN5KCZsYXRlbmN5KTsKLSAgICBpZiAoU1VDQ0VFREVEKGhyX2RiZykpIHsKLSAgICAgIERWTE9HKDEpIDw8ICJzdHJlYW0gbGF0ZW5jeTogIiA8PCBzdGF0aWNfY2FzdDxkb3VibGU+KGxhdGVuY3kgLyAxMDAwMC4wKQotICAgICAgICAgICAgICAgPDwgIiBbbXNdIjsKLSAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIEhSRVNVTFQgaHIgPSBTX0ZBTFNFOwotCi0gIC8vIFBlcmZvcm0gZGlmZmVyZW50IGluaXRpYWxpemF0aW9uIGRlcGVuZGluZyBvbiBpZiB0aGUgZGV2aWNlIHNoYWxsIGJlCi0gIC8vIG9wZW5lZCBpbiBzaGFyZWQgbW9kZSBvciBpbiBleGNsdXNpdmUgbW9kZS4KLSAgaHIgPSAoc2hhcmVfbW9kZV8gPT0gQVVEQ0xOVF9TSEFSRU1PREVfU0hBUkVEKSA/Ci0gICAgICBTaGFyZWRNb2RlSW5pdGlhbGl6YXRpb24oKSA6IEV4Y2x1c2l2ZU1vZGVJbml0aWFsaXphdGlvbigpOwotICBpZiAoRkFJTEVEKGhyKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiSUF1ZGlvQ2xpZW50OjpJbml0aWFsaXplKCkgZmFpbGVkOiAiIDw8IHN0ZDo6aGV4IDw8IGhyOwotICAgIHJldHVybiBocjsKLSAgfQotCi0gIC8vIFJldHJpZXZlIHRoZSBsZW5ndGggb2YgdGhlIGVuZHBvaW50IGJ1ZmZlci4gVGhlIGJ1ZmZlciBsZW5ndGggcmVwcmVzZW50cwotICAvLyB0aGUgbWF4aW11bSBhbW91bnQgb2YgcmVuZGVyaW5nIGRhdGEgdGhhdCB0aGUgY2xpZW50IGNhbiB3cml0ZSB0bwotICAvLyB0aGUgZW5kcG9pbnQgYnVmZmVyIGR1cmluZyBhIHNpbmdsZSBwcm9jZXNzaW5nIHBhc3MuCi0gIC8vIEEgdHlwaWNhbCB2YWx1ZSBpcyA5NjAgYXVkaW8gZnJhbWVzIDw9PiAyMG1zIEAgNDhrSHogc2FtcGxlIHJhdGUuCi0gIGhyID0gYXVkaW9fY2xpZW50Xy0+R2V0QnVmZmVyU2l6ZSgmZW5kcG9pbnRfYnVmZmVyX3NpemVfZnJhbWVzXyk7Ci0gIGlmIChGQUlMRUQoaHIpKQotICAgIHJldHVybiBocjsKLSAgRFZMT0coMSkgPDwgImVuZHBvaW50IGJ1ZmZlciBzaXplOiAiIDw8IGVuZHBvaW50X2J1ZmZlcl9zaXplX2ZyYW1lc18KLSAgICAgICAgICAgPDwgIiBbZnJhbWVzXSI7Ci0KLSAgLy8gVGhlIGJ1ZmZlciBzY2hlbWUgZm9yIGV4Y2x1c2l2ZSBtb2RlIHN0cmVhbXMgaXMgbm90IGRlc2lnbmVkIGZvciBtYXgKLSAgLy8gZmxleGliaWxpdHkuIFdlIG9ubHkgYWxsb3cgYSAicGVyZmVjdCBtYXRjaCIgYmV0d2VlbiB0aGUgcGFja2V0IHNpemUgc2V0Ci0gIC8vIGJ5IHRoZSB1c2VyIGFuZCB0aGUgYWN0dWFsIGVuZHBvaW50IGJ1ZmZlciBzaXplLgotICBpZiAoc2hhcmVfbW9kZV8gPT0gQVVEQ0xOVF9TSEFSRU1PREVfRVhDTFVTSVZFICYmCi0gICAgICBlbmRwb2ludF9idWZmZXJfc2l6ZV9mcmFtZXNfICE9IHBhY2tldF9zaXplX2ZyYW1lc18pIHsKLSAgICBociA9IEFVRENMTlRfRV9JTlZBTElEX1NJWkU7Ci0gICAgRExPRyhFUlJPUikgPDwgIkFVRENMTlRfRV9JTlZBTElEX1NJWkUiOwotICAgIHJldHVybiBocjsKLSAgfQotCi0gIC8vIFNldCB0aGUgZXZlbnQgaGFuZGxlIHRoYXQgdGhlIGF1ZGlvIGVuZ2luZSB3aWxsIHNpZ25hbCBlYWNoIHRpbWUKLSAgLy8gYSBidWZmZXIgYmVjb21lcyByZWFkeSB0byBiZSBwcm9jZXNzZWQgYnkgdGhlIGNsaWVudC4KLSAgaHIgPSBhdWRpb19jbGllbnRfLT5TZXRFdmVudEhhbmRsZShhdWRpb19zYW1wbGVzX3JlbmRlcl9ldmVudF8uR2V0KCkpOwotICBpZiAoRkFJTEVEKGhyKSkKLSAgICByZXR1cm4gaHI7Ci0KLSAgLy8gR2V0IGFjY2VzcyB0byB0aGUgSUF1ZGlvUmVuZGVyQ2xpZW50IGludGVyZmFjZS4gVGhpcyBpbnRlcmZhY2UKLSAgLy8gZW5hYmxlcyB1cyB0byB3cml0ZSBvdXRwdXQgZGF0YSB0byBhIHJlbmRlcmluZyBlbmRwb2ludCBidWZmZXIuCi0gIC8vIFRoZSBtZXRob2RzIGluIHRoaXMgaW50ZXJmYWNlIG1hbmFnZSB0aGUgbW92ZW1lbnQgb2YgZGF0YSBwYWNrZXRzCi0gIC8vIHRoYXQgY29udGFpbiBhdWRpby1yZW5kZXJpbmcgZGF0YS4KLSAgaHIgPSBhdWRpb19jbGllbnRfLT5HZXRTZXJ2aWNlKF9fdXVpZG9mKElBdWRpb1JlbmRlckNsaWVudCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19yZW5kZXJfY2xpZW50Xy5SZWNlaXZlVm9pZCgpKTsKLSAgcmV0dXJuIGhyOwotfQotCi1IUkVTVUxUIFdBU0FQSUF1ZGlvT3V0cHV0U3RyZWFtOjpTaGFyZWRNb2RlSW5pdGlhbGl6YXRpb24oKSB7Ci0gIERDSEVDS19FUShzaGFyZV9tb2RlXywgQVVEQ0xOVF9TSEFSRU1PREVfU0hBUkVEKTsKLQotICAvLyBUT0RPKGhlbnJpa2EpOiB0aGlzIGJ1ZmZlciBzY2hlbWUgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQuCi0gIC8vIFRoZSBleGFjdCBkZXRhaWxzIGFyZSB5ZXQgdG8gYmUgZGV0ZXJtaW5lZCBiYXNlZCBvbiB0ZXN0cyB3aXRoIGRpZmZlcmVudAotICAvLyBhdWRpbyBjbGllbnRzLgotICBpbnQgZ2xpdGNoX2ZyZWVfYnVmZmVyX3NpemVfbXMgPSBzdGF0aWNfY2FzdDxpbnQ+KHBhY2tldF9zaXplX21zXyArIDAuNSk7Ci0gIGlmIChhdWRpb19lbmdpbmVfbWl4X2Zvcm1hdF8tPkZvcm1hdC5uU2FtcGxlc1BlclNlYyAlIDgwMDAgPT0gMCkgewotICAgIC8vIEluaXRpYWwgdGVzdHMgaGF2ZSBzaG93biB0aGF0IHdlIGhhdmUgdG8gYWRkIDEwIG1zIGV4dHJhIHRvCi0gICAgLy8gZW5zdXJlIHRoYXQgd2UgZG9uJ3QgcnVuIGVtcHR5IGZvciBhbnkgcGFja2V0IHNpemUuCi0gICAgZ2xpdGNoX2ZyZWVfYnVmZmVyX3NpemVfbXMgKz0gMTA7Ci0gIH0gZWxzZSBpZiAoYXVkaW9fZW5naW5lX21peF9mb3JtYXRfLT5Gb3JtYXQublNhbXBsZXNQZXJTZWMgJSAxMTAyNSA9PSAwKSB7Ci0gICAgLy8gSW5pdGlhbCB0ZXN0cyBoYXZlIHNob3duIHRoYXQgd2UgaGF2ZSB0byBhZGQgMjAgbXMgZXh0cmEgdG8KLSAgICAvLyBlbnN1cmUgdGhhdCB3ZSBkb24ndCBydW4gZW1wdHkgZm9yIGFueSBwYWNrZXQgc2l6ZS4KLSAgICBnbGl0Y2hfZnJlZV9idWZmZXJfc2l6ZV9tcyArPSAyMDsKLSAgfSBlbHNlIHsKLSAgICBETE9HKFdBUk5JTkcpIDw8ICJVbnN1cHBvcnRlZCBzYW1wbGUgcmF0ZSAiCi0gICAgICAgIDw8IGF1ZGlvX2VuZ2luZV9taXhfZm9ybWF0Xy0+Rm9ybWF0Lm5TYW1wbGVzUGVyU2VjIDw8ICIgZGV0ZWN0ZWQiOwotICAgIGdsaXRjaF9mcmVlX2J1ZmZlcl9zaXplX21zICs9IDIwOwotICB9Ci0gIERWTE9HKDEpIDw8ICJnbGl0Y2hfZnJlZV9idWZmZXJfc2l6ZV9tczogIiA8PCBnbGl0Y2hfZnJlZV9idWZmZXJfc2l6ZV9tczsKLSAgUkVGRVJFTkNFX1RJTUUgcmVxdWVzdGVkX2J1ZmZlcl9kdXJhdGlvbiA9Ci0gICAgICBzdGF0aWNfY2FzdDxSRUZFUkVOQ0VfVElNRT4oZ2xpdGNoX2ZyZWVfYnVmZmVyX3NpemVfbXMgKiAxMDAwMCk7Ci0KLSAgLy8gSW5pdGlhbGl6ZSB0aGUgYXVkaW8gc3RyZWFtIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgdGhlIGRldmljZS4KLSAgLy8gV2UgY29ubmVjdCBpbmRpcmVjdGx5IHRocm91Z2ggdGhlIGF1ZGlvIGVuZ2luZSBieSB1c2luZyBzaGFyZWQgbW9kZQotICAvLyBhbmQgV0FTQVBJIGlzIGluaXRpYWxpemVkIGluIGFuIGV2ZW50IGRyaXZlbiBtb2RlLgotICAvLyBOb3RlIHRoYXQgdGhpcyBBUEkgZW5zdXJlcyB0aGF0IHRoZSBidWZmZXIgaXMgbmV2ZXIgc21hbGxlciB0aGFuIHRoZQotICAvLyBtaW5pbXVtIGJ1ZmZlciBzaXplIG5lZWRlZCB0byBlbnN1cmUgZ2xpdGNoLWZyZWUgcmVuZGVyaW5nLgotICAvLyBJZiB3ZSByZXF1ZXN0cyBhIGJ1ZmZlciBzaXplIHRoYXQgaXMgc21hbGxlciB0aGFuIHRoZSBhdWRpbyBlbmdpbmUncwotICAvLyBtaW5pbXVtIHJlcXVpcmVkIGJ1ZmZlciBzaXplLCB0aGUgbWV0aG9kIHNldHMgdGhlIGJ1ZmZlciBzaXplIHRvIHRoaXMKLSAgLy8gbWluaW11bSBidWZmZXIgc2l6ZSByYXRoZXIgdGhhbiB0byB0aGUgYnVmZmVyIHNpemUgcmVxdWVzdGVkLgotICBIUkVTVUxUIGhyID0gU19GQUxTRTsKLSAgaHIgPSBhdWRpb19jbGllbnRfLT5Jbml0aWFsaXplKEFVRENMTlRfU0hBUkVNT0RFX1NIQVJFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRENMTlRfU1RSRUFNRkxBR1NfRVZFTlRDQUxMQkFDSyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURDTE5UX1NUUkVBTUZMQUdTX05PUEVSU0lTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9idWZmZXJfZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxXQVZFRk9STUFURVgqPigmZm9ybWF0XyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgcmV0dXJuIGhyOwotfQotCi1IUkVTVUxUIFdBU0FQSUF1ZGlvT3V0cHV0U3RyZWFtOjpFeGNsdXNpdmVNb2RlSW5pdGlhbGl6YXRpb24oKSB7Ci0gIERDSEVDS19FUShzaGFyZV9tb2RlXywgQVVEQ0xOVF9TSEFSRU1PREVfRVhDTFVTSVZFKTsKLQotICBmbG9hdCBmID0gKDEwMDAuMCAqIHBhY2tldF9zaXplX2ZyYW1lc18pIC8gZm9ybWF0Xy5Gb3JtYXQublNhbXBsZXNQZXJTZWM7Ci0gIFJFRkVSRU5DRV9USU1FIHJlcXVlc3RlZF9idWZmZXJfZHVyYXRpb24gPQotICAgICAgc3RhdGljX2Nhc3Q8UkVGRVJFTkNFX1RJTUU+KGYgKiAxMDAwMC4wICsgMC41KTsKLQotICAvLyBJbml0aWFsaXplIHRoZSBhdWRpbyBzdHJlYW0gYmV0d2VlbiB0aGUgY2xpZW50IGFuZCB0aGUgZGV2aWNlLgotICAvLyBGb3IgYW4gZXhjbHVzaXZlLW1vZGUgc3RyZWFtIHRoYXQgdXNlcyBldmVudC1kcml2ZW4gYnVmZmVyaW5nLCB0aGUKLSAgLy8gY2FsbGVyIG11c3Qgc3BlY2lmeSBub256ZXJvIHZhbHVlcyBmb3IgaG5zUGVyaW9kaWNpdHkgYW5kCi0gIC8vIGhuc0J1ZmZlckR1cmF0aW9uLCBhbmQgdGhlIHZhbHVlcyBvZiB0aGVzZSB0d28gcGFyYW1ldGVycyBtdXN0IGJlIGVxdWFsLgotICAvLyBUaGUgSW5pdGlhbGl6ZSBtZXRob2QgYWxsb2NhdGVzIHR3byBidWZmZXJzIGZvciB0aGUgc3RyZWFtLiBFYWNoIGJ1ZmZlcgotICAvLyBpcyBlcXVhbCBpbiBkdXJhdGlvbiB0byB0aGUgdmFsdWUgb2YgdGhlIGhuc0J1ZmZlckR1cmF0aW9uIHBhcmFtZXRlci4KLSAgLy8gRm9sbG93aW5nIHRoZSBJbml0aWFsaXplIGNhbGwgZm9yIGEgcmVuZGVyaW5nIHN0cmVhbSwgdGhlIGNhbGxlciBzaG91bGQKLSAgLy8gZmlsbCB0aGUgZmlyc3Qgb2YgdGhlIHR3byBidWZmZXJzIGJlZm9yZSBzdGFydGluZyB0aGUgc3RyZWFtLgotICBIUkVTVUxUIGhyID0gU19GQUxTRTsKLSAgaHIgPSBhdWRpb19jbGllbnRfLT5Jbml0aWFsaXplKEFVRENMTlRfU0hBUkVNT0RFX0VYQ0xVU0lWRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRENMTlRfU1RSRUFNRkxBR1NfRVZFTlRDQUxMQkFDSyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURDTE5UX1NUUkVBTUZMQUdTX05PUEVSU0lTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9idWZmZXJfZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfYnVmZmVyX2R1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxXQVZFRk9STUFURVgqPigmZm9ybWF0XyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgaWYgKEZBSUxFRChocikpIHsKLSAgICBpZiAoaHIgPT0gQVVEQ0xOVF9FX0JVRkZFUl9TSVpFX05PVF9BTElHTkVEKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJBVURDTE5UX0VfQlVGRkVSX1NJWkVfTk9UX0FMSUdORUQiOwotCi0gICAgICBVSU5UMzIgYWxpZ25lZF9idWZmZXJfc2l6ZSA9IDA7Ci0gICAgICBhdWRpb19jbGllbnRfLT5HZXRCdWZmZXJTaXplKCZhbGlnbmVkX2J1ZmZlcl9zaXplKTsKLSAgICAgIERWTE9HKDEpIDw8ICJVc2UgYWxpZ25lZCBidWZmZXIgc2l6ZSBpbnN0ZWFkOiAiIDw8IGFsaWduZWRfYnVmZmVyX3NpemU7Ci0gICAgICBhdWRpb19jbGllbnRfLlJlbGVhc2UoKTsKLQotICAgICAgLy8gQ2FsY3VsYXRlIG5ldyBhbGlnbmVkIHBlcmlvZGljaXR5LiBFYWNoIHVuaXQgb2YgcmVmZXJlbmNlIHRpbWUKLSAgICAgIC8vIGlzIDEwMCBuYW5vc2Vjb25kcy4KLSAgICAgIFJFRkVSRU5DRV9USU1FIGFsaWduZWRfYnVmZmVyX2R1cmF0aW9uID0gc3RhdGljX2Nhc3Q8UkVGRVJFTkNFX1RJTUU+KAotICAgICAgICAgICgxMDAwMDAwMC4wICogYWxpZ25lZF9idWZmZXJfc2l6ZSAvIGZvcm1hdF8uRm9ybWF0Lm5TYW1wbGVzUGVyU2VjKQotICAgICAgICAgICsgMC41KTsKLQotICAgICAgLy8gSXQgaXMgcG9zc2libGUgdG8gcmUtYWN0aXZhdGUgYW5kIHJlLWluaXRpYWxpemUgdGhlIGF1ZGlvIGNsaWVudAotICAgICAgLy8gYXQgdGhpcyBzdGFnZSBidXQgd2UgYmFpbCBvdXQgd2l0aCBhbiBlcnJvciBjb2RlIGluc3RlYWQgYW5kCi0gICAgICAvLyBjb21iaW5lIGl0IHdpdGggYSBsb2cgbWVzc2FnZSB3aGljaCBpbmZvcm1zIGFib3V0IHRoZSBzdWdnZXN0ZWQKLSAgICAgIC8vIGFsaWduZWQgYnVmZmVyIHNpemUgd2hpY2ggc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KLSAgICAgIERWTE9HKDEpIDw8ICJhbGlnbmVkX2J1ZmZlcl9kdXJhdGlvbjogIgotICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGRvdWJsZT4oYWxpZ25lZF9idWZmZXJfZHVyYXRpb24gLyAxMDAwMC4wKQotICAgICAgICAgICAgICAgIDw8ICIgW21zXSI7Ci0gICAgfSBlbHNlIGlmIChociA9PSBBVURDTE5UX0VfSU5WQUxJRF9ERVZJQ0VfUEVSSU9EKSB7Ci0gICAgICAvLyBXZSB3aWxsIGdldCB0aGlzIGVycm9yIGlmIHdlIHRyeSB0byB1c2UgYSBzbWFsbGVyIGJ1ZmZlciBzaXplIHRoYW4KLSAgICAgIC8vIHRoZSBtaW5pbXVtIHN1cHBvcnRlZCBzaXplICh1c3VhbGx5IH4zbXMgb24gV2luZG93cyA3KS4KLSAgICAgIExPRyhFUlJPUikgPDwgIkFVRENMTlRfRV9JTlZBTElEX0RFVklDRV9QRVJJT0QiOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBocjsKLX0KLQotc3RkOjpzdHJpbmcgV0FTQVBJQXVkaW9PdXRwdXRTdHJlYW06OkdldERldmljZU5hbWUoTFBDV1NUUiBkZXZpY2VfaWQpIGNvbnN0IHsKLSAgc3RkOjpzdHJpbmcgbmFtZTsKLSAgU2NvcGVkQ29tUHRyPElNTURldmljZT4gYXVkaW9fZGV2aWNlOwotCi0gIC8vIEdldCB0aGUgSU1NRGV2aWNlIGludGVyZmFjZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBlbmRwb2ludCBJRCBzdHJpbmcuCi0gIEhSRVNVTFQgaHIgPSBkZXZpY2VfZW51bWVyYXRvcl8tPkdldERldmljZShkZXZpY2VfaWQsIGF1ZGlvX2RldmljZS5SZWNlaXZlKCkpOwotICBpZiAoU1VDQ0VFREVEKGhyKSkgewotICAgIC8vIFJldHJpZXZlIHVzZXItZnJpZW5kbHkgbmFtZSBvZiBlbmRwb2ludCBkZXZpY2UuCi0gICAgLy8gRXhhbXBsZTogIlNwZWFrZXJzIChSZWFsdGVrIEhpZ2ggRGVmaW5pdGlvbiBBdWRpbykiLgotICAgIFNjb3BlZENvbVB0cjxJUHJvcGVydHlTdG9yZT4gcHJvcGVydGllczsKLSAgICBociA9IGF1ZGlvX2RldmljZS0+T3BlblByb3BlcnR5U3RvcmUoU1RHTV9SRUFELCBwcm9wZXJ0aWVzLlJlY2VpdmUoKSk7Ci0gICAgaWYgKFNVQ0NFRURFRChocikpIHsKLSAgICAgIFBST1BWQVJJQU5UIGZyaWVuZGx5X25hbWU7Ci0gICAgICBQcm9wVmFyaWFudEluaXQoJmZyaWVuZGx5X25hbWUpOwotICAgICAgaHIgPSBwcm9wZXJ0aWVzLT5HZXRWYWx1ZShQS0VZX0RldmljZV9GcmllbmRseU5hbWUsICZmcmllbmRseV9uYW1lKTsKLSAgICAgIGlmIChTVUNDRUVERUQoaHIpICYmIGZyaWVuZGx5X25hbWUudnQgPT0gVlRfTFBXU1RSKSB7Ci0gICAgICAgIGlmIChmcmllbmRseV9uYW1lLnB3c3pWYWwpCi0gICAgICAgICAgbmFtZSA9IFdpZGVUb1VURjgoZnJpZW5kbHlfbmFtZS5wd3N6VmFsKTsKLSAgICAgIH0KLSAgICAgIFByb3BWYXJpYW50Q2xlYXIoJmZyaWVuZGx5X25hbWUpOwotICAgIH0KLSAgfQotICByZXR1cm4gbmFtZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vd2luL2F1ZGlvX2xvd19sYXRlbmN5X291dHB1dF93aW4uaCBiL3NyYy9tZWRpYS9hdWRpby93aW4vYXVkaW9fbG93X2xhdGVuY3lfb3V0cHV0X3dpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjlhYTNkLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby93aW4vYXVkaW9fbG93X2xhdGVuY3lfb3V0cHV0X3dpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIEltcGxlbWVudGF0aW9uIG9mIEF1ZGlvT3V0cHV0U3RyZWFtIGZvciBXaW5kb3dzIHVzaW5nIFdpbmRvd3MgQ29yZSBBdWRpbwotLy8gV0FTQVBJIGZvciBsb3cgbGF0ZW5jeSByZW5kZXJpbmcuCi0vLwotLy8gT3ZlcnZpZXcgb2Ygb3BlcmF0aW9uIGFuZCBwZXJmb3JtYW5jZToKLS8vCi0vLyAtIEFuIG9iamVjdCBvZiBXQVNBUElBdWRpb091dHB1dFN0cmVhbSBpcyBjcmVhdGVkIGJ5IHRoZSBBdWRpb01hbmFnZXIKLS8vICAgZmFjdG9yeS4KLS8vIC0gTmV4dCBzb21lIHRocmVhZCB3aWxsIGNhbGwgT3BlbigpLCBhdCB0aGF0IHBvaW50IHRoZSB1bmRlcmx5aW5nCi0vLyAgIENvcmUgQXVkaW8gQVBJcyBhcmUgdXRpbGl6ZWQgdG8gY3JlYXRlIHR3byBXQVNBUEkgaW50ZXJmYWNlcyBjYWxsZWQKLS8vICAgSUF1ZGlvQ2xpZW50IGFuZCBJQXVkaW9SZW5kZXJDbGllbnQuCi0vLyAtIFRoZW4gc29tZSB0aHJlYWQgd2lsbCBjYWxsIFN0YXJ0KHNvdXJjZSkuCi0vLyAgIEEgdGhyZWFkIGNhbGxlZCAid2FzYXBpX3JlbmRlcl90aHJlYWQiIGlzIHN0YXJ0ZWQgYW5kIHRoaXMgdGhyZWFkIGxpc3RlbnMKLS8vICAgb24gYW4gZXZlbnQgc2lnbmFsIHdoaWNoIGlzIHNldCBwZXJpb2RpY2FsbHkgYnkgdGhlIGF1ZGlvIGVuZ2luZSB0byBzaWduYWwKLS8vICAgcmVuZGVyIGV2ZW50cy4gQXMgYSByZXN1bHQsIE9uTW9yZURhdGEoKSB3aWxsIGJlIGNhbGxlZCBhbmQgdGhlIHJlZ2lzdGVyZWQKLS8vICAgY2xpZW50IGlzIHRoZW4gZXhwZWN0ZWQgdG8gcHJvdmlkZSBkYXRhIHNhbXBsZXMgdG8gYmUgcGxheWVkIG91dC4KLS8vIC0gQXQgc29tZSBwb2ludCwgYSB0aHJlYWQgd2lsbCBjYWxsIFN0b3AoKSwgd2hpY2ggc3RvcHMgYW5kIGpvaW5zIHRoZQotLy8gICByZW5kZXIgdGhyZWFkIGFuZCBhdCB0aGUgc2FtZSB0aW1lIHN0b3BzIGF1ZGlvIHN0cmVhbWluZy4KLS8vIC0gVGhlIHNhbWUgdGhyZWFkIHRoYXQgY2FsbGVkIHN0b3Agd2lsbCBjYWxsIENsb3NlKCkgd2hlcmUgd2UgY2xlYW51cAotLy8gICBhbmQgbm90aWZ5IHRoZSBhdWRpbyBtYW5hZ2VyLCB3aGljaCBsaWtlbHkgd2lsbCBkZXN0cm95IHRoaXMgb2JqZWN0LgotLy8gLSBJbml0aWFsIHRlc3RzIG9uIFdpbmRvd3MgNyBzaG93cyB0aGF0IHRoaXMgaW1wbGVtZW50YXRpb24gcmVzdWx0cyBpbiBhCi0vLyAgIGxhdGVuY3kgb2YgYXBwcm94aW1hdGVseSAzNSBtcyBpZiB0aGUgc2VsZWN0ZWQgcGFja2V0IHNpemUgaXMgbGVzcyB0aGFuCi0vLyAgIG9yIGVxdWFsIHRvIDIwIG1zLiBVc2luZyBhIHBhY2tldCBzaXplIG9mIDEwIG1zIGRvZXMgbm90IHJlc3VsdCBpbiBhCi0vLyAgIGxvd2VyIGxhdGVuY3kgYnV0IG9ubHkgYWZmZWN0cyB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBidWZmZXIgaW4gZWFjaAotLy8gICBPbk1vcmVEYXRhKCkgY2FsbGJhY2suCi0vLyAtIEEgdG90YWwgdHlwaWNhbCBkZWxheSBvZiAzNSBtcyBjb250YWlucyB0aHJlZSBwYXJ0czoKLS8vICAgIG8gQXVkaW8gZW5kcG9pbnQgZGV2aWNlIHBlcmlvZCAofjEwIG1zKS4KLS8vICAgIG8gU3RyZWFtIGxhdGVuY3kgYmV0d2VlbiB0aGUgYnVmZmVyIGFuZCBlbmRwb2ludCBkZXZpY2UgKH41IG1zKS4KLS8vICAgIG8gRW5kcG9pbnQgYnVmZmVyICh+MjAgbXMgdG8gZW5zdXJlIGdsaXRjaC1mcmVlIHJlbmRlcmluZykuCi0vLyAtIE5vdGUgdGhhdCwgaWYgdGhlIHVzZXIgc2VsZWN0cyBhIHBhY2tldCBzaXplIG9mIGUuZy4gMTAwIG1zLCB0aGUgdG90YWwKLS8vICAgZGVsYXkgd2lsbCBiZSBhcHByb3hpbWF0ZWx5IDExNSBtcyAoMTAgKyA1ICsgMTAwKS4KLS8vCi0vLyBJbXBsZW1lbnRhdGlvbiBub3RlczoKLS8vCi0vLyAtIFRoZSBtaW5pbXVtIHN1cHBvcnRlZCBjbGllbnQgaXMgV2luZG93cyBWaXN0YS4KLS8vIC0gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBzaW5nbGUtdGhyZWFkZWQsIGhlbmNlOgotLy8gICAgbyBDb25zdHJ1Y3Rpb24gYW5kIGRlc3RydWN0aW9uIG11c3QgdGFrZSBwbGFjZSBmcm9tIHRoZSBzYW1lIHRocmVhZC4KLS8vICAgIG8gQWxsIEFQSXMgbXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgY3JlYXRpbmcgdGhyZWFkIGFzIHdlbGwuCi0vLyAtIEl0IGlzIHJlY29tbWVuZGVkIHRvIGZpcnN0IGFjcXVpcmUgdGhlIG5hdGl2ZSBzYW1wbGUgcmF0ZSBvZiB0aGUgZGVmYXVsdAotLy8gICBpbnB1dCBkZXZpY2UgYW5kIHRoZW4gdXNlIHRoZSBzYW1lIHJhdGUgd2hlbiBjcmVhdGluZyB0aGlzIG9iamVjdC4gVXNlCi0vLyAgIFdBU0FQSUF1ZGlvT3V0cHV0U3RyZWFtOjpIYXJkd2FyZVNhbXBsZVJhdGUoKSB0byByZXRyaWV2ZSB0aGUgc2FtcGxlIHJhdGUuCi0vLyAtIENhbGxpbmcgQ2xvc2UoKSBhbHNvIGxlYWRzIHRvIHNlbGYgZGVzdHJ1Y3Rpb24uCi0vLyAtIFN0cmVhbSBzd2l0Y2hpbmcgaXMgbm90IHN1cHBvcnRlZCBpZiB0aGUgdXNlciBzaGlmdHMgdGhlIGF1ZGlvIGRldmljZQotLy8gICBhZnRlciBPcGVuKCkgaXMgY2FsbGVkIGJ1dCBiZWZvcmUgU3RhcnQoKSBoYXMgYmVlbiBjYWxsZWQuCi0vLyAtIFN0cmVhbSBzd2l0Y2hpbmcgY2FuIGZhaWwgaWYgc3RyZWFtaW5nIHN0YXJ0cyBvbiBvbmUgZGV2aWNlIHdpdGggYQotLy8gICBzdXBwb3J0ZWQgZm9ybWF0IChYKSBhbmQgdGhlIG5ldyBkZWZhdWx0IGRldmljZSAtIHRvIHdoaWNoIHdlIHdvdWxkIGxpa2UKLS8vICAgdG8gc3dpdGNoIC0gdXNlcyBhbm90aGVyIGZvcm1hdCAoWSksIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgZ2l2ZW4gdGhlCi0vLyAgIGNvbmZpZ3VyZWQgYXVkaW8gcGFyYW1ldGVycy4KLS8vIC0gVGhlIGF1ZGlvIGRldmljZSBtdXN0IGJlIG9wZW5lZCB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBjaGFubmVscyBhcyBpdAotLy8gICBzdXBwb3J0cyBuYXRpdmVseSAoc2VlIEhhcmR3YXJlQ2hhbm5lbENvdW50KCkpIG90aGVyd2lzZSBPcGVuKCkgd2lsbCBmYWlsLgotLy8gLSBTdXBwb3J0IGZvciA4LWJpdCBhdWRpbyBoYXMgbm90IHlldCBiZWVuIHZlcmlmaWVkIGFuZCB0ZXN0ZWQuCi0vLwotLy8gQ29yZSBBdWRpbyBBUEkgZGV0YWlsczoKLS8vCi0vLyAtIFRoZSBwdWJsaWMgQVBJIG1ldGhvZHMgKE9wZW4oKSwgU3RhcnQoKSwgU3RvcCgpIGFuZCBDbG9zZSgpKSBtdXN0IGJlCi0vLyAgIGNhbGxlZCBvbiBjb25zdHJ1Y3RpbmcgdGhyZWFkLiBUaGUgcmVhc29uIGlzIHRoYXQgd2Ugd2FudCB0byBlbnN1cmUgdGhhdAotLy8gICB0aGUgQ09NIGVudmlyb25tZW50IGlzIHRoZSBzYW1lIGZvciBhbGwgQVBJIGltcGxlbWVudGF0aW9ucy4KLS8vIC0gVXRpbGl6ZWQgTU1EZXZpY2UgaW50ZXJmYWNlczoKLS8vICAgICBvIElNTURldmljZUVudW1lcmF0b3IKLS8vICAgICBvIElNTURldmljZQotLy8gLSBVdGlsaXplZCBXQVNBUEkgaW50ZXJmYWNlczoKLS8vICAgICBvIElBdWRpb0NsaWVudAotLy8gICAgIG8gSUF1ZGlvUmVuZGVyQ2xpZW50Ci0vLyAtIFRoZSBzdHJlYW0gaXMgaW5pdGlhbGl6ZWQgaW4gc2hhcmVkIG1vZGUgYW5kIHRoZSBwcm9jZXNzaW5nIG9mIHRoZQotLy8gICBhdWRpbyBidWZmZXIgaXMgZXZlbnQgZHJpdmVuLgotLy8gLSBUaGUgTXVsdGltZWRpYSBDbGFzcyBTY2hlZHVsZXIgc2VydmljZSAoTU1DU1MpIGlzIHV0aWxpemVkIHRvIGJvb3N0Ci0vLyAgIHRoZSBwcmlvcml0eSBvZiB0aGUgcmVuZGVyIHRocmVhZC4KLS8vIC0gQXVkaW8tcmVuZGVyaW5nIGVuZHBvaW50IGRldmljZXMgY2FuIGhhdmUgdGhyZWUgcm9sZXM6Ci0vLyAgIENvbnNvbGUgKGVDb25zb2xlKSwgQ29tbXVuaWNhdGlvbnMgKGVDb21tdW5pY2F0aW9ucyksIGFuZCBNdWx0aW1lZGlhCi0vLyAgIChlTXVsdGltZWRpYSkuIFNlYXJjaCBmb3IgIkRldmljZSBSb2xlcyIgb24gTVNETiBmb3IgbW9yZSBkZXRhaWxzLgotLy8KLS8vIFRocmVhZGluZyBkZXRhaWxzOgotLy8KLS8vIC0gSXQgaXMgYXNzdW1lZCB0aGF0IHRoaXMgY2xhc3MgaXMgY3JlYXRlZCBvbiB0aGUgYXVkaW8gdGhyZWFkIG93bmVkCi0vLyAgIGJ5IHRoZSBBdWRpb01hbmFnZXIuCi0vLyAtIEl0IGlzIGEgcmVxdWlyZW1lbnQgdG8gY2FsbCB0aGUgZm9sbG93aW5nIG1ldGhvZHMgb24gdGhlIHNhbWUgYXVkaW8KLS8vICAgdGhyZWFkOiBPcGVuKCksIFN0YXJ0KCksIFN0b3AoKSwgYW5kIENsb3NlKCkuCi0vLyAtIEF1ZGlvIHJlbmRlcmluZyBpcyBwZXJmb3JtZWQgb24gdGhlIGF1ZGlvIHJlbmRlciB0aHJlYWQsIG93bmVkIGJ5IHRoaXMKLS8vICAgY2xhc3MsIGFuZCB0aGUgQXVkaW9Tb3VyY2VDYWxsYmFjazo6T25Nb3JlRGF0YSgpIG1ldGhvZCB3aWxsIGJlIGNhbGxlZAotLy8gICBmcm9tIHRoaXMgdGhyZWFkLiBTdHJlYW0gc3dpdGNoaW5nIGFsc28gdGFrZXMgcGxhY2Ugb24gdGhlIGF1ZGlvLXJlbmRlcgotLy8gICB0aHJlYWQuCi0vLwotLy8gRXhwZXJpbWVudGFsIGV4Y2x1c2l2ZSBtb2RlOgotLy8KLS8vIC0gSXQgaXMgcG9zc2libGUgdG8gb3BlbiB1cCBhIHN0cmVhbSBpbiBleGNsdXNpdmUgbW9kZSBieSB1c2luZyB0aGUKLS8vICAgLS1lbmFibGUtZXhjbHVzaXZlLWF1ZGlvIGNvbW1hbmQgbGluZSBmbGFnLgotLy8gLSBUaGUgaW50ZXJuYWwgYnVmZmVyaW5nIHNjaGVtZSBpcyBsZXNzIGZsZXhpYmxlIGZvciBleGNsdXNpdmUgc3RyZWFtcy4KLS8vICAgSGVuY2UsIHNvbWUgbWFudWFsIHR1bmluZyB3aWxsIGJlIHJlcXVpcmVkIGJlZm9yZSBkZWNpZGluZyB3aGF0IGZyYW1lCi0vLyAgIHNpemUgdG8gdXNlLiBTZWUgdGhlIFdpbkF1ZGlvT3V0cHV0VGVzdCB1bml0IHRlc3QgZm9yIG1vcmUgZGV0YWlscy4KLS8vIC0gSWYgYW4gYXBwbGljYXRpb24gb3BlbnMgYSBzdHJlYW0gaW4gZXhjbHVzaXZlIG1vZGUsIHRoZSBhcHBsaWNhdGlvbiBoYXMKLS8vICAgZXhjbHVzaXZlIHVzZSBvZiB0aGUgYXVkaW8gZW5kcG9pbnQgZGV2aWNlIHRoYXQgcGxheXMgdGhlIHN0cmVhbS4KLS8vIC0gRXhjbHVzaXZlLW1vZGUgc2hvdWxkIG9ubHkgYmUgdXRpbGl6ZWQgd2hlbiB0aGUgbG93ZXN0IHBvc3NpYmxlIGxhdGVuY3kKLS8vICAgaXMgaW1wb3J0YW50LgotLy8gLSBJbiBleGNsdXNpdmUgbW9kZSwgdGhlIGNsaWVudCBjYW4gY2hvb3NlIHRvIG9wZW4gdGhlIHN0cmVhbSBpbiBhbnkgYXVkaW8KLS8vICAgZm9ybWF0IHRoYXQgdGhlIGVuZHBvaW50IGRldmljZSBzdXBwb3J0cywgaS5lLiBub3QgbGltaXRlZCB0byB0aGUgZGV2aWNlJ3MKLS8vICAgY3VycmVudCAoZGVmYXVsdCkgY29uZmlndXJhdGlvbi4KLS8vIC0gSW5pdGlhbCBtZWFzdXJlbWVudHMgb24gV2luZG93cyA3IChIUCBaNjAwIHdvcmtzdGF0aW9uKSBoYXZlIHNob3duIHRoYXQKLS8vICAgdGhlIGxvd2VzdCBwb3NzaWJsZSBsYXRlbmNpZXMgd2UgY2FuIGFjaGlldmUgb24gdGhpcyBtYWNoaW5lIGFyZToKLS8vICAgICBvIH4zLjMzMzNtcyBAIDQ4a0h6IDw9PiAxNjAgYXVkaW8gZnJhbWVzIHBlciBidWZmZXIuCi0vLyAgICAgbyB+My42MjgxbXMgQCA0NC4xa0h6IDw9PiAxNjAgYXVkaW8gZnJhbWVzIHBlciBidWZmZXIuCi0vLyAtIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvd2luZG93cy9kZXNrdG9wL2RkMzcwODQ0KHY9dnMuODUpLmFzcHgKLS8vICAgZm9yIG1vcmUgZGV0YWlscy4KLQotI2lmbmRlZiBNRURJQV9BVURJT19XSU5fQVVESU9fTE9XX0xBVEVOQ1lfT1VUUFVUX1dJTl9IXwotI2RlZmluZSBNRURJQV9BVURJT19XSU5fQVVESU9fTE9XX0xBVEVOQ1lfT1VUUFVUX1dJTl9IXwotCi0jaW5jbHVkZSA8QXVkaW9jbGllbnQuaD4KLSNpbmNsdWRlIDxNTURldmljZUFQSS5oPgotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy9wbGF0Zm9ybV90aHJlYWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy9zaW1wbGVfdGhyZWFkLmgiCi0jaW5jbHVkZSAiYmFzZS93aW4vc2NvcGVkX2NvX21lbS5oIgotI2luY2x1ZGUgImJhc2Uvd2luL3Njb3BlZF9jb21faW5pdGlhbGl6ZXIuaCIKLSNpbmNsdWRlICJiYXNlL3dpbi9zY29wZWRfY29tcHRyLmgiCi0jaW5jbHVkZSAiYmFzZS93aW4vc2NvcGVkX2hhbmRsZS5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX2lvLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fcGFyYW1ldGVycy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIEF1ZGlvTWFuYWdlcldpbjsKLQotLy8gQXVkaW9PdXRwdXRTdHJlYW0gaW1wbGVtZW50YXRpb24gdXNpbmcgV2luZG93cyBDb3JlIEF1ZGlvIEFQSXMuCi1jbGFzcyBNRURJQV9FWFBPUlQgV0FTQVBJQXVkaW9PdXRwdXRTdHJlYW0gOgotICAgICAgcHVibGljIEF1ZGlvT3V0cHV0U3RyZWFtLAotICAgICAgcHVibGljIGJhc2U6OkRlbGVnYXRlU2ltcGxlVGhyZWFkOjpEZWxlZ2F0ZSB7Ci0gcHVibGljOgotICAvLyBUaGUgY3RvciB0YWtlcyBhbGwgdGhlIHVzdWFsIHBhcmFtZXRlcnMsIHBsdXMgfG1hbmFnZXJ8IHdoaWNoIGlzIHRoZQotICAvLyB0aGUgYXVkaW8gbWFuYWdlciB3aG8gaXMgY3JlYXRpbmcgdGhpcyBvYmplY3QuCi0gIFdBU0FQSUF1ZGlvT3V0cHV0U3RyZWFtKEF1ZGlvTWFuYWdlcldpbiogbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEVSb2xlIGRldmljZV9yb2xlKTsKLQotICAvLyBUaGUgZHRvciBpcyB0eXBpY2FsbHkgY2FsbGVkIGJ5IHRoZSBBdWRpb01hbmFnZXIgb25seSBhbmQgaXQgaXMgdXN1YWxseQotICAvLyB0cmlnZ2VyZWQgYnkgY2FsbGluZyBBdWRpb091dHB1dFN0cmVhbTo6Q2xvc2UoKS4KLSAgdmlydHVhbCB+V0FTQVBJQXVkaW9PdXRwdXRTdHJlYW0oKTsKLQotICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBBdWRpb091dHB1dFN0cmVhbS4KLSAgdmlydHVhbCBib29sIE9wZW4oKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0YXJ0KEF1ZGlvU291cmNlQ2FsbGJhY2sqIGNhbGxiYWNrKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0b3AoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIENsb3NlKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBHZXRWb2x1bWUoZG91YmxlKiB2b2x1bWUpIE9WRVJSSURFOwotCi0gIC8vIFJldHJpZXZlcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHRoZSBhdWRpbyBlbmdpbmUgdXNlcyBmb3IgaXRzIGludGVybmFsCi0gIC8vIHByb2Nlc3NpbmcvbWl4aW5nIG9mIHNoYXJlZC1tb2RlIHN0cmVhbXMgZm9yIHRoZSBkZWZhdWx0IGVuZHBvaW50IGRldmljZS4KLSAgc3RhdGljIGludCBIYXJkd2FyZUNoYW5uZWxDb3VudCgpOwotCi0gIC8vIFJldHJpZXZlcyB0aGUgY2hhbm5lbCBsYXlvdXQgdGhlIGF1ZGlvIGVuZ2luZSB1c2VzIGZvciBpdHMgaW50ZXJuYWwKLSAgLy8gcHJvY2Vzc2luZy9taXhpbmcgb2Ygc2hhcmVkLW1vZGUgc3RyZWFtcyBmb3IgdGhlIGRlZmF1bHQgZW5kcG9pbnQgZGV2aWNlLgotICAvLyBOb3RlIHRoYXQgd2UgY29udmVydCBhbiBpbnRlcm5hbCBjaGFubmVsIGxheW91dCBtYXNrIChzZWUgQ2hhbm5lbE1hc2soKSkKLSAgLy8gaW50byBhIENocm9tZS1zcGVjaWZpYyBjaGFubmVsIGxheW91dCBlbnVtZXJhdG9yIGluIHRoaXMgbWV0aG9kLCBoZW5jZQotICAvLyB0aGUgbWF0Y2ggbWlnaHQgbm90IGJlIHBlcmZlY3QuCi0gIHN0YXRpYyBDaGFubmVsTGF5b3V0IEhhcmR3YXJlQ2hhbm5lbExheW91dCgpOwotCi0gIC8vIFJldHJpZXZlcyB0aGUgc2FtcGxlIHJhdGUgdGhlIGF1ZGlvIGVuZ2luZSB1c2VzIGZvciBpdHMgaW50ZXJuYWwKLSAgLy8gcHJvY2Vzc2luZy9taXhpbmcgb2Ygc2hhcmVkLW1vZGUgc3RyZWFtcyBmb3IgdGhlIGRlZmF1bHQgZW5kcG9pbnQgZGV2aWNlLgotICBzdGF0aWMgaW50IEhhcmR3YXJlU2FtcGxlUmF0ZShFUm9sZSBkZXZpY2Vfcm9sZSk7Ci0KLSAgLy8gUmV0dXJucyBBVURDTE5UX1NIQVJFTU9ERV9FWENMVVNJVkUgaWYgLS1lbmFibGUtZXhjbHVzaXZlLW1vZGUgaXMgdXNlZAotICAvLyBhcyBjb21tYW5kLWxpbmUgZmxhZyBhbmQgQVVEQ0xOVF9TSEFSRU1PREVfU0hBUkVEIG90aGVyd2lzZSAoZGVmYXVsdCkuCi0gIHN0YXRpYyBBVURDTE5UX1NIQVJFTU9ERSBHZXRTaGFyZU1vZGUoKTsKLQotICBib29sIHN0YXJ0ZWQoKSBjb25zdCB7IHJldHVybiByZW5kZXJfdGhyZWFkXy5nZXQoKSAhPSBOVUxMOyB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHRoZSBhdWRpbyBlbmdpbmUgdXNlcyBmb3IgaXRzIGludGVybmFsCi0gIC8vIHByb2Nlc3NpbmcvbWl4aW5nIG9mIHNoYXJlZC1tb2RlIHN0cmVhbXMgZm9yIHRoZSBkZWZhdWx0IGVuZHBvaW50IGRldmljZS4KLSAgaW50IEdldEVuZHBvaW50Q2hhbm5lbENvdW50Rm9yVGVzdGluZygpIHsgcmV0dXJuIGZvcm1hdF8uRm9ybWF0Lm5DaGFubmVsczsgfQotCi0gcHJpdmF0ZToKLSAgLy8gRGVsZWdhdGVTaW1wbGVUaHJlYWQ6OkRlbGVnYXRlIGltcGxlbWVudGF0aW9uLgotICB2aXJ0dWFsIHZvaWQgUnVuKCkgT1ZFUlJJREU7Ci0KLSAgLy8gSXNzdWVzIHRoZSBPbkVycm9yKCkgY2FsbGJhY2sgdG8gdGhlIHxzaW5rX3wuCi0gIHZvaWQgSGFuZGxlRXJyb3IoSFJFU1VMVCBlcnIpOwotCi0gIC8vIFRoZSBPcGVuKCkgbWV0aG9kIGlzIGRpdmlkZWQgaW50byB0aGVzZSBzdWIgbWV0aG9kcy4KLSAgSFJFU1VMVCBTZXRSZW5kZXJEZXZpY2UoKTsKLSAgSFJFU1VMVCBBY3RpdmF0ZVJlbmRlckRldmljZSgpOwotICBib29sIERlc2lyZWRGb3JtYXRJc1N1cHBvcnRlZCgpOwotICBIUkVTVUxUIEluaXRpYWxpemVBdWRpb0VuZ2luZSgpOwotCi0gIC8vIENhbGxlZCB3aGVuIHRoZSBkZXZpY2Ugd2lsbCBiZSBvcGVuZWQgaW4gc2hhcmVkIG1vZGUgYW5kIHVzZSB0aGUKLSAgLy8gaW50ZXJuYWwgYXVkaW8gZW5naW5lJ3MgbWl4IGZvcm1hdC4KLSAgSFJFU1VMVCBTaGFyZWRNb2RlSW5pdGlhbGl6YXRpb24oKTsKLQotICAvLyBDYWxsZWQgd2hlbiB0aGUgZGV2aWNlIHdpbGwgYmUgb3BlbmVkIGluIGV4Y2x1c2l2ZSBtb2RlIGFuZCB1c2UgdGhlCi0gIC8vIGFwcGxpY2F0aW9uIHNwZWNpZmllZCBmb3JtYXQuCi0gIEhSRVNVTFQgRXhjbHVzaXZlTW9kZUluaXRpYWxpemF0aW9uKCk7Ci0KLSAgLy8gQ29udmVydHMgdW5pcXVlIGVuZHBvaW50IElEIHRvIHVzZXItZnJpZW5kbHkgZGV2aWNlIG5hbWUuCi0gIHN0ZDo6c3RyaW5nIEdldERldmljZU5hbWUoTFBDV1NUUiBkZXZpY2VfaWQpIGNvbnN0OwotCi0gIC8vIENvbnRhaW5zIHRoZSB0aHJlYWQgSUQgb2YgdGhlIGNyZWF0aW5nIHRocmVhZC4KLSAgYmFzZTo6UGxhdGZvcm1UaHJlYWRJZCBjcmVhdGluZ190aHJlYWRfaWRfOwotCi0gIC8vIE91ciBjcmVhdG9yLCB0aGUgYXVkaW8gbWFuYWdlciBuZWVkcyB0byBiZSBub3RpZmllZCB3aGVuIHdlIGNsb3NlLgotICBBdWRpb01hbmFnZXJXaW4qIG1hbmFnZXJfOwotCi0gIC8vIFJlbmRlcmluZyBpcyBkcml2ZW4gYnkgdGhpcyB0aHJlYWQgKHdoaWNoIGhhcyBubyBtZXNzYWdlIGxvb3ApLgotICAvLyBBbGwgT25Nb3JlRGF0YSgpIGNhbGxiYWNrcyB3aWxsIGJlIGNhbGxlZCBmcm9tIHRoaXMgdGhyZWFkLgotICBzY29wZWRfcHRyPGJhc2U6OkRlbGVnYXRlU2ltcGxlVGhyZWFkPiByZW5kZXJfdGhyZWFkXzsKLQotICAvLyBDb250YWlucyB0aGUgZGVzaXJlZCBhdWRpbyBmb3JtYXQgd2hpY2ggaXMgc2V0IHVwIGF0IGNvbnN0cnVjdGlvbi4KLSAgLy8gRXh0ZW5kZWQgUENNIHdhdmVmb3JtIGZvcm1hdCBzdHJ1Y3R1cmUgYmFzZWQgb24gV0FWRUZPUk1BVEVYVEVOU0lCTEUuCi0gIC8vIFVzZSB0aGlzIGZvciBtdWx0aXBsZSBjaGFubmVsIGFuZCBoaS1yZXNvbHV0aW9uIFBDTSBkYXRhLgotICBXQVZFRk9STUFUUENNRVggZm9ybWF0XzsKLQotICAvLyBDb3B5IG9mIHRoZSBhdWRpbyBmb3JtYXQgd2hpY2ggd2Uga25vdyB0aGUgYXVkaW8gZW5naW5lIHN1cHBvcnRzLgotICAvLyBJdCBpcyByZWNvbW1lbmRlZCB0byBlbnN1cmUgdGhhdCB0aGUgc2FtcGxlIHJhdGUgaW4gfGZvcm1hdF98IGlzIGlkZW50aWNhbAotICAvLyB0byB0aGUgc2FtcGxlIHJhdGUgaW4gfGF1ZGlvX2VuZ2luZV9taXhfZm9ybWF0X3wuCi0gIGJhc2U6Ondpbjo6U2NvcGVkQ29NZW08V0FWRUZPUk1BVFBDTUVYPiBhdWRpb19lbmdpbmVfbWl4X2Zvcm1hdF87Ci0KLSAgYm9vbCBvcGVuZWRfOwotCi0gIC8vIFNldCB0byB0cnVlIGFzIHNvb24gYXMgYSBuZXcgZGVmYXVsdCBkZXZpY2UgaXMgZGV0ZWN0ZWQsIGFuZCBjbGVhcmVkIHdoZW4KLSAgLy8gdGhlIHN0cmVhbWluZyBoYXMgc3dpdGNoZWQgZnJvbSB1c2luZyB0aGUgb2xkIGRldmljZSB0byB0aGUgbmV3IGRldmljZS4KLSAgLy8gQWxsIGFkZGl0aW9uYWwgZGV2aWNlIGRldGVjdGlvbnMgZHVyaW5nIGFuIGFjdGl2ZSBzdGF0ZSBhcmUgaWdub3JlZCB0bwotICAvLyBlbnN1cmUgdGhhdCB0aGUgb25nb2luZyBzd2l0Y2ggY2FuIGZpbmFsaXplIHdpdGhvdXQgZGlzcnVwdGlvbnMuCi0gIGJvb2wgcmVzdGFydF9yZW5kZXJpbmdfbW9kZV87Ci0KLSAgLy8gVm9sdW1lIGxldmVsIGZyb20gMCB0byAxLgotICBmbG9hdCB2b2x1bWVfOwotCi0gIC8vIFNpemUgaW4gYnl0ZXMgb2YgZWFjaCBhdWRpbyBmcmFtZSAoNCBieXRlcyBmb3IgMTYtYml0IHN0ZXJlbyBQQ00pLgotICBzaXplX3QgZnJhbWVfc2l6ZV87Ci0KLSAgLy8gU2l6ZSBpbiBhdWRpbyBmcmFtZXMgb2YgZWFjaCBhdWRpbyBwYWNrZXQgd2hlcmUgYW4gYXVkaW8gcGFja2V0Ci0gIC8vIGlzIGRlZmluZWQgYXMgdGhlIGJsb2NrIG9mIGRhdGEgd2hpY2ggdGhlIHNvdXJjZSBpcyBleHBlY3RlZCB0byBkZWxpdmVyCi0gIC8vIGluIGVhY2ggT25Nb3JlRGF0YSgpIGNhbGxiYWNrLgotICBzaXplX3QgcGFja2V0X3NpemVfZnJhbWVzXzsKLQotICAvLyBTaXplIGluIGJ5dGVzIG9mIGVhY2ggYXVkaW8gcGFja2V0LgotICBzaXplX3QgcGFja2V0X3NpemVfYnl0ZXNfOwotCi0gIC8vIFNpemUgaW4gbWlsbGlzZWNvbmRzIG9mIGVhY2ggYXVkaW8gcGFja2V0LgotICBmbG9hdCBwYWNrZXRfc2l6ZV9tc187Ci0KLSAgLy8gTGVuZ3RoIG9mIHRoZSBhdWRpbyBlbmRwb2ludCBidWZmZXIuCi0gIHNpemVfdCBlbmRwb2ludF9idWZmZXJfc2l6ZV9mcmFtZXNfOwotCi0gIC8vIERlZmluZXMgdGhlIHJvbGUgdGhhdCB0aGUgc3lzdGVtIGhhcyBhc3NpZ25lZCB0byBhbiBhdWRpbyBlbmRwb2ludCBkZXZpY2UuCi0gIEVSb2xlIGRldmljZV9yb2xlXzsKLQotICAvLyBUaGUgc2hhcmluZyBtb2RlIGZvciB0aGUgY29ubmVjdGlvbi4KLSAgLy8gVmFsaWQgdmFsdWVzIGFyZSBBVURDTE5UX1NIQVJFTU9ERV9TSEFSRUQgYW5kIEFVRENMTlRfU0hBUkVNT0RFX0VYQ0xVU0lWRQotICAvLyB3aGVyZSBBVURDTE5UX1NIQVJFTU9ERV9TSEFSRUQgaXMgdGhlIGRlZmF1bHQuCi0gIEFVRENMTlRfU0hBUkVNT0RFIHNoYXJlX21vZGVfOwotCi0gIC8vIFRoZSBjaGFubmVsIGNvdW50IHNldCBieSB0aGUgY2xpZW50IGluIHxwYXJhbXN8IHdoaWNoIGlzIHByb3ZpZGVkIHRvIHRoZQotICAvLyBjb25zdHJ1Y3Rvci4gVGhlIGNsaWVudCBtdXN0IGZlZWQgdGhlIEF1ZGlvU291cmNlQ2FsbGJhY2s6Ok9uTW9yZURhdGEoKQotICAvLyBjYWxsYmFjayB3aXRoIFBDTS1kYXRhIHRoYXQgY29udGFpbnMgdGhpcyBudW1iZXIgb2YgY2hhbm5lbHMuCi0gIGludCBjbGllbnRfY2hhbm5lbF9jb3VudF87Ci0KLSAgLy8gQ291bnRzIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gdG8gdGhlIGVuZHBvaW50IGJ1ZmZlci4KLSAgVUlOVDY0IG51bV93cml0dGVuX2ZyYW1lc187Ci0KLSAgLy8gUG9pbnRlciB0byB0aGUgY2xpZW50IHRoYXQgd2lsbCBkZWxpdmVyIGF1ZGlvIHNhbXBsZXMgdG8gYmUgcGxheWVkIG91dC4KLSAgQXVkaW9Tb3VyY2VDYWxsYmFjayogc291cmNlXzsKLQotICAvLyBBbiBJTU1EZXZpY2VFbnVtZXJhdG9yIGludGVyZmFjZSB3aGljaCByZXByZXNlbnRzIGEgZGV2aWNlIGVudW1lcmF0b3IuCi0gIGJhc2U6Ondpbjo6U2NvcGVkQ29tUHRyPElNTURldmljZUVudW1lcmF0b3I+IGRldmljZV9lbnVtZXJhdG9yXzsKLQotICAvLyBBbiBJTU1EZXZpY2UgaW50ZXJmYWNlIHdoaWNoIHJlcHJlc2VudHMgYW4gYXVkaW8gZW5kcG9pbnQgZGV2aWNlLgotICBiYXNlOjp3aW46OlNjb3BlZENvbVB0cjxJTU1EZXZpY2U+IGVuZHBvaW50X2RldmljZV87Ci0KLSAgLy8gQW4gSUF1ZGlvQ2xpZW50IGludGVyZmFjZSB3aGljaCBlbmFibGVzIGEgY2xpZW50IHRvIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZQotICAvLyBhbiBhdWRpbyBzdHJlYW0gYmV0d2VlbiBhbiBhdWRpbyBhcHBsaWNhdGlvbiBhbmQgdGhlIGF1ZGlvIGVuZ2luZS4KLSAgYmFzZTo6d2luOjpTY29wZWRDb21QdHI8SUF1ZGlvQ2xpZW50PiBhdWRpb19jbGllbnRfOwotCi0gIC8vIFRoZSBJQXVkaW9SZW5kZXJDbGllbnQgaW50ZXJmYWNlIGVuYWJsZXMgYSBjbGllbnQgdG8gd3JpdGUgb3V0cHV0Ci0gIC8vIGRhdGEgdG8gYSByZW5kZXJpbmcgZW5kcG9pbnQgYnVmZmVyLgotICBiYXNlOjp3aW46OlNjb3BlZENvbVB0cjxJQXVkaW9SZW5kZXJDbGllbnQ+IGF1ZGlvX3JlbmRlcl9jbGllbnRfOwotCi0gIC8vIFRoZSBhdWRpbyBlbmdpbmUgd2lsbCBzaWduYWwgdGhpcyBldmVudCBlYWNoIHRpbWUgYSBidWZmZXIgYmVjb21lcwotICAvLyByZWFkeSB0byBiZSBmaWxsZWQgYnkgdGhlIGNsaWVudC4KLSAgYmFzZTo6d2luOjpTY29wZWRIYW5kbGUgYXVkaW9fc2FtcGxlc19yZW5kZXJfZXZlbnRfOwotCi0gIC8vIFRoaXMgZXZlbnQgd2lsbCBiZSBzaWduYWxlZCB3aGVuIHJlbmRlcmluZyBzaGFsbCBzdG9wLgotICBiYXNlOjp3aW46OlNjb3BlZEhhbmRsZSBzdG9wX3JlbmRlcl9ldmVudF87Ci0KLSAgLy8gQ29udGFpbmVyIGZvciByZXRyaWV2aW5nIGRhdGEgZnJvbSBBdWRpb1NvdXJjZUNhbGxiYWNrOjpPbk1vcmVEYXRhKCkuCi0gIHNjb3BlZF9wdHI8QXVkaW9CdXM+IGF1ZGlvX2J1c187Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFdBU0FQSUF1ZGlvT3V0cHV0U3RyZWFtKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0FVRElPX1dJTl9BVURJT19MT1dfTEFURU5DWV9PVVRQVVRfV0lOX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vd2luL2F1ZGlvX2xvd19sYXRlbmN5X291dHB1dF93aW5fdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvYXVkaW8vd2luL2F1ZGlvX2xvd19sYXRlbmN5X291dHB1dF93aW5fdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MzZjMDkuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL3dpbi9hdWRpb19sb3dfbGF0ZW5jeV9vdXRwdXRfd2luX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzYzICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8bW1zeXN0ZW0uaD4KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgImJhc2UvZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJiYXNlL2ZpbGVfdXRpbC5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgotI2luY2x1ZGUgImJhc2UvdGVzdC90ZXN0X3RpbWVvdXRzLmgiCi0jaW5jbHVkZSAiYmFzZS90aW1lLmgiCi0jaW5jbHVkZSAiYmFzZS9wYXRoX3NlcnZpY2UuaCIKLSNpbmNsdWRlICJiYXNlL3dpbi9zY29wZWRfY29tX2luaXRpYWxpemVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9faW8uaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19tYW5hZ2VyLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fdXRpbC5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3dpbi9hdWRpb19sb3dfbGF0ZW5jeV9vdXRwdXRfd2luLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vd2luL2NvcmVfYXVkaW9fdXRpbF93aW4uaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zZWVrYWJsZV9idWZmZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3Rlc3RfZGF0YV91dGlsLmgiCi0jaW5jbHVkZSAidGVzdGluZy9nbW9ja19tdXRhbnQuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgOjp0ZXN0aW5nOjpfOwotdXNpbmcgOjp0ZXN0aW5nOjpBbnlOdW1iZXI7Ci11c2luZyA6OnRlc3Rpbmc6OkJldHdlZW47Ci11c2luZyA6OnRlc3Rpbmc6OkNyZWF0ZUZ1bmN0b3I7Ci11c2luZyA6OnRlc3Rpbmc6OkRvQWxsOwotdXNpbmcgOjp0ZXN0aW5nOjpHdDsKLXVzaW5nIDo6dGVzdGluZzo6SW52b2tlV2l0aG91dEFyZ3M7Ci11c2luZyA6OnRlc3Rpbmc6Ok5vdE51bGw7Ci11c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKLXVzaW5nIGJhc2U6Ondpbjo6U2NvcGVkQ09NSW5pdGlhbGl6ZXI7Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGtTcGVlY2hGaWxlXzE2Yl9zXzQ4a1tdID0gInNwZWVjaF8xNmJfc3RlcmVvXzQ4a0h6LnJhdyI7Ci1zdGF0aWMgY29uc3QgY2hhciBrU3BlZWNoRmlsZV8xNmJfc180NGtbXSA9ICJzcGVlY2hfMTZiX3N0ZXJlb180NGtIei5yYXciOwotc3RhdGljIGNvbnN0IHNpemVfdCBrRmlsZUR1cmF0aW9uTXMgPSAyMDAwMDsKLXN0YXRpYyBjb25zdCBzaXplX3Qga051bUZpbGVTZWdtZW50cyA9IDI7Ci1zdGF0aWMgY29uc3QgaW50IGtCaXRzUGVyU2FtcGxlID0gMTY7Ci1zdGF0aWMgY29uc3QgQ2hhbm5lbExheW91dCBrQ2hhbm5lbExheW91dCA9IENIQU5ORUxfTEFZT1VUX1NURVJFTzsKLXN0YXRpYyBjb25zdCBzaXplX3Qga01heERlbHRhU2FtcGxlcyA9IDEwMDA7Ci1zdGF0aWMgY29uc3QgY2hhcioga0RlbHRhVGltZU1zRmlsZU5hbWUgPSAiZGVsdGFfdGltZXNfbXMudHh0IjsKLQotTUFUQ0hFUl9QKEhhc1ZhbGlkRGVsYXksIHZhbHVlLCAiIikgewotICAvLyBJdCBpcyBkaWZmaWN1bHQgdG8gY29tZSB1cCB3aXRoIGEgcGVyZmVjdCB0ZXN0IGNvbmRpdGlvbiBmb3IgdGhlIGRlbGF5Ci0gIC8vIGVzdGltYXRpb24uIEZvciBub3csIHZlcmlmeSB0aGF0IHRoZSBwcm9kdWNlZCBvdXRwdXQgZGVsYXkgaXMgYWx3YXlzCi0gIC8vIGxhcmdlciB0aGFuIHRoZSBzZWxlY3RlZCBidWZmZXIgc2l6ZS4KLSAgcmV0dXJuIGFyZy5oYXJkd2FyZV9kZWxheV9ieXRlcyA+IHZhbHVlLmhhcmR3YXJlX2RlbGF5X2J5dGVzOwotfQotCi0vLyBVc2VkIHRvIHRlcm1pbmF0ZSBhIGxvb3AgZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQgdGhhbiB0aGUgbG9vcCBiZWxvbmdzIHRvLgotLy8gfGxvb3B8IHNob3VsZCBiZSBhIE1lc3NhZ2VMb29wUHJveHkuCi1BQ1RJT05fUChRdWl0TG9vcCwgbG9vcCkgewotICBsb29wLT5Qb3N0VGFzayhGUk9NX0hFUkUsIE1lc3NhZ2VMb29wOjpRdWl0Q2xvc3VyZSgpKTsKLX0KLQotY2xhc3MgTW9ja0F1ZGlvU291cmNlQ2FsbGJhY2sgOiBwdWJsaWMgQXVkaW9PdXRwdXRTdHJlYW06OkF1ZGlvU291cmNlQ2FsbGJhY2sgewotIHB1YmxpYzoKLSAgTU9DS19NRVRIT0QyKE9uTW9yZURhdGEsIGludChBdWRpb0J1cyogYXVkaW9fYnVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyc1N0YXRlIGJ1ZmZlcnNfc3RhdGUpKTsKLSAgTU9DS19NRVRIT0QzKE9uTW9yZUlPRGF0YSwgaW50KEF1ZGlvQnVzKiBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1cyogZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyc1N0YXRlIGJ1ZmZlcnNfc3RhdGUpKTsKLSAgTU9DS19NRVRIT0QyKE9uRXJyb3IsIHZvaWQoQXVkaW9PdXRwdXRTdHJlYW0qIHN0cmVhbSwgaW50IGNvZGUpKTsKLX07Ci0KLS8vIFRoaXMgYXVkaW8gc291cmNlIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSB1c2VkIGZvciBtYW51YWwgdGVzdHMgb25seSBzaW5jZQotLy8gaXQgdGFrZXMgYWJvdXQgMjAgc2Vjb25kcyB0byBwbGF5IG91dCBhIGZpbGUuCi1jbGFzcyBSZWFkRnJvbUZpbGVBdWRpb1NvdXJjZSA6IHB1YmxpYyBBdWRpb091dHB1dFN0cmVhbTo6QXVkaW9Tb3VyY2VDYWxsYmFjayB7Ci0gcHVibGljOgotICBleHBsaWNpdCBSZWFkRnJvbUZpbGVBdWRpb1NvdXJjZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkKLSAgICA6IHBvc18oMCksCi0gICAgICBwcmV2aW91c19jYWxsX3RpbWVfKGJhc2U6OlRpbWU6Ok5vdygpKSwKLSAgICAgIHRleHRfZmlsZV8oTlVMTCksCi0gICAgICBlbGVtZW50c190b193cml0ZV8oMCkgewotICAgIC8vIFJlYWRzIGEgdGVzdCBmaWxlIGZyb20gbWVkaWEvdGVzdC9kYXRhIGRpcmVjdG9yeS4KLSAgICBmaWxlXyA9IFJlYWRUZXN0RGF0YUZpbGUobmFtZSk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuIGFycmF5IHRoYXQgd2lsbCBzdG9yZSBkZWx0YSB0aW1lcyBiZXR3ZWVuIGNhbGxiYWNrcy4KLSAgICAvLyBUaGUgY29udGVudCBvZiB0aGlzIGFycmF5IHdpbGwgYmUgd3JpdHRlbiB0byBhIHRleHQgZmlsZSBhdAotICAgIC8vIGRlc3RydWN0aW9uIGFuZCBjYW4gdGhlbiBiZSB1c2VkIGZvciBvZmYtbGluZSBhbmFseXNpcyBvZiB0aGUgZXhhY3QKLSAgICAvLyB0aW1pbmcgb2YgY2FsbGJhY2tzLiBUaGUgdGV4dCBmaWxlIHdpbGwgYmUgc3RvcmVkIGluIG1lZGlhL3Rlc3QvZGF0YS4KLSAgICBkZWx0YV90aW1lc18ucmVzZXQobmV3IGludFtrTWF4RGVsdGFTYW1wbGVzXSk7Ci0gIH0KLQotICB2aXJ0dWFsIH5SZWFkRnJvbUZpbGVBdWRpb1NvdXJjZSgpIHsKLSAgICAvLyBHZXQgY29tcGxldGUgZmlsZSBwYXRoIHRvIG91dHB1dCBmaWxlIGluIGRpcmVjdG9yeSBjb250YWluaW5nCi0gICAgLy8gbWVkaWFfdW5pdHRlc3RzLmV4ZS4KLSAgICBGaWxlUGF0aCBmaWxlX25hbWU7Ci0gICAgRVhQRUNUX1RSVUUoUGF0aFNlcnZpY2U6OkdldChiYXNlOjpESVJfRVhFLCAmZmlsZV9uYW1lKSk7Ci0gICAgZmlsZV9uYW1lID0gZmlsZV9uYW1lLkFwcGVuZEFTQ0lJKGtEZWx0YVRpbWVNc0ZpbGVOYW1lKTsKLQotICAgIEVYUEVDVF9UUlVFKCF0ZXh0X2ZpbGVfKTsKLSAgICB0ZXh0X2ZpbGVfID0gZmlsZV91dGlsOjpPcGVuRmlsZShmaWxlX25hbWUsICJ3dCIpOwotICAgIERMT0dfSUYoRVJST1IsICF0ZXh0X2ZpbGVfKSA8PCAiRmFpbGVkIHRvIG9wZW4gbG9nIGZpbGUuIjsKLQotICAgIC8vIFdyaXRlIHRoZSBhcnJheSB3aGljaCBjb250YWlucyBkZWx0YSB0aW1lcyB0byBhIHRleHQgZmlsZS4KLSAgICBzaXplX3QgZWxlbWVudHNfd3JpdHRlbiA9IDA7Ci0gICAgd2hpbGUgKGVsZW1lbnRzX3dyaXR0ZW4gPCBlbGVtZW50c190b193cml0ZV8pIHsKLSAgICAgIGZwcmludGYodGV4dF9maWxlXywgIiVkXG4iLCBkZWx0YV90aW1lc19bZWxlbWVudHNfd3JpdHRlbl0pOwotICAgICAgKytlbGVtZW50c193cml0dGVuOwotICAgIH0KLQotICAgIGZpbGVfdXRpbDo6Q2xvc2VGaWxlKHRleHRfZmlsZV8pOwotICB9Ci0KLSAgLy8gQXVkaW9PdXRwdXRTdHJlYW06OkF1ZGlvU291cmNlQ2FsbGJhY2sgaW1wbGVtZW50YXRpb24uCi0gIHZpcnR1YWwgaW50IE9uTW9yZURhdGEoQXVkaW9CdXMqIGF1ZGlvX2J1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlcnNTdGF0ZSBidWZmZXJzX3N0YXRlKSB7Ci0gICAgLy8gU3RvcmUgdGltZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHN1Y2Nlc3NpdmUgY2FsbGJhY2tzIGluIGFuIGFycmF5LgotICAgIC8vIFRoZXNlIHZhbHVlcyB3aWxsIGJlIHdyaXR0ZW4gdG8gYSBmaWxlIGluIHRoZSBkZXN0cnVjdG9yLgotICAgIGludCBkaWZmID0gKGJhc2U6OlRpbWU6Ok5vdygpIC0gcHJldmlvdXNfY2FsbF90aW1lXykuSW5NaWxsaXNlY29uZHMoKTsKLSAgICBwcmV2aW91c19jYWxsX3RpbWVfID0gYmFzZTo6VGltZTo6Tm93KCk7Ci0gICAgaWYgKGVsZW1lbnRzX3RvX3dyaXRlXyA8IGtNYXhEZWx0YVNhbXBsZXMpIHsKLSAgICAgIGRlbHRhX3RpbWVzX1tlbGVtZW50c190b193cml0ZV9dID0gZGlmZjsKLSAgICAgICsrZWxlbWVudHNfdG9fd3JpdGVfOwotICAgIH0KLQotICAgIGludCBtYXhfc2l6ZSA9Ci0gICAgICAgIGF1ZGlvX2J1cy0+ZnJhbWVzKCkgKiBhdWRpb19idXMtPmNoYW5uZWxzKCkgKiBrQml0c1BlclNhbXBsZSAvIDg7Ci0KLSAgICAvLyBVc2Ugc2FtcGxlcyByZWFkIGZyb20gYSBkYXRhIGZpbGUgYW5kIGZpbGwgdXAgdGhlIGF1ZGlvIGJ1ZmZlcgotICAgIC8vIHByb3ZpZGVkIHRvIHVzIGluIHRoZSBjYWxsYmFjay4KLSAgICBpZiAocG9zXyArIHN0YXRpY19jYXN0PGludD4obWF4X3NpemUpID4gZmlsZV9zaXplKCkpCi0gICAgICBtYXhfc2l6ZSA9IGZpbGVfc2l6ZSgpIC0gcG9zXzsKLSAgICBpbnQgZnJhbWVzID0gbWF4X3NpemUgLyAoYXVkaW9fYnVzLT5jaGFubmVscygpICoga0JpdHNQZXJTYW1wbGUgLyA4KTsKLSAgICBpZiAobWF4X3NpemUpIHsKLSAgICAgIGF1ZGlvX2J1cy0+RnJvbUludGVybGVhdmVkKAotICAgICAgICAgIGZpbGVfLT5HZXREYXRhKCkgKyBwb3NfLCBmcmFtZXMsIGtCaXRzUGVyU2FtcGxlIC8gOCk7Ci0gICAgICBwb3NfICs9IG1heF9zaXplOwotICAgIH0KLSAgICByZXR1cm4gZnJhbWVzOwotICB9Ci0KLSAgdmlydHVhbCBpbnQgT25Nb3JlSU9EYXRhKEF1ZGlvQnVzKiBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1cyogZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyc1N0YXRlIGJ1ZmZlcnNfc3RhdGUpIE9WRVJSSURFIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgT25FcnJvcihBdWRpb091dHB1dFN0cmVhbSogc3RyZWFtLCBpbnQgY29kZSkge30KLQotICBpbnQgZmlsZV9zaXplKCkgeyByZXR1cm4gZmlsZV8tPkdldERhdGFTaXplKCk7IH0KLQotIHByaXZhdGU6Ci0gIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gZmlsZV87Ci0gIHNjb3BlZF9hcnJheTxpbnQ+IGRlbHRhX3RpbWVzXzsKLSAgaW50IHBvc187Ci0gIGJhc2U6OlRpbWUgcHJldmlvdXNfY2FsbF90aW1lXzsKLSAgRklMRSogdGV4dF9maWxlXzsKLSAgc2l6ZV90IGVsZW1lbnRzX3RvX3dyaXRlXzsKLX07Ci0KLXN0YXRpYyBib29sIEV4Y2x1c2l2ZU1vZGVJc0VuYWJsZWQoKSB7Ci0gIHJldHVybiAoV0FTQVBJQXVkaW9PdXRwdXRTdHJlYW06OkdldFNoYXJlTW9kZSgpID09Ci0gICAgICAgICAgQVVEQ0xOVF9TSEFSRU1PREVfRVhDTFVTSVZFKTsKLX0KLQotLy8gQ29udmVuaWVuY2UgbWV0aG9kIHdoaWNoIGVuc3VyZXMgdGhhdCB3ZSBhcmUgbm90IHJ1bm5pbmcgb24gdGhlIGJ1aWxkCi0vLyBib3RzIGFuZCB0aGF0IGF0IGxlYXN0IG9uZSB2YWxpZCBvdXRwdXQgZGV2aWNlIGNhbiBiZSBmb3VuZC4gV2UgYWxzbwotLy8gdmVyaWZ5IHRoYXQgd2UgYXJlIG5vdCBydW5uaW5nIG9uIFhQIHNpbmNlIHRoZSBsb3ctbGF0ZW5jeSAoV0FTQVBJLQotLy8gYmFzZWQpIHZlcnNpb24gcmVxdWlyZXMgV2luZG93cyBWaXN0YSBvciBoaWdoZXIuCi1zdGF0aWMgYm9vbCBDYW5SdW5BdWRpb1Rlc3RzKEF1ZGlvTWFuYWdlciogYXVkaW9fbWFuKSB7Ci0gIGlmICghQ29yZUF1ZGlvVXRpbDo6SXNTdXBwb3J0ZWQoKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiVGhpcyB0ZXN0IHJlcXVpcmVzIFdpbmRvd3MgVmlzdGEgb3IgaGlnaGVyLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gVE9ETyhoZW5yaWthKTogbm90ZSB0aGF0IHdlIHVzZSBXYXZlIHRvZGF5IHRvIHF1ZXJ5IHRoZSBudW1iZXIgb2YKLSAgLy8gZXhpc3Rpbmcgb3V0cHV0IGRldmljZXMuCi0gIGlmICghYXVkaW9fbWFuLT5IYXNBdWRpb091dHB1dERldmljZXMoKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiTm8gb3V0cHV0IGRldmljZXMgZGV0ZWN0ZWQuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoV0FTQVBJQXVkaW9PdXRwdXRTdHJlYW06OkhhcmR3YXJlQ2hhbm5lbExheW91dCgpICE9IGtDaGFubmVsTGF5b3V0KSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJUaGlzIHRlc3QgcmVxdWlyZXMgc3RlcmVvIGF1ZGlvIG91dHB1dC4iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vLyBDb252ZW5pZW5jZSBtZXRob2Qgd2hpY2ggY3JlYXRlcyBhIGRlZmF1bHQgQXVkaW9PdXRwdXRTdHJlYW0gb2JqZWN0IGJ1dAotLy8gYWxzbyBhbGxvd3MgdGhlIHVzZXIgdG8gbW9kaWZ5IHRoZSBkZWZhdWx0IHNldHRpbmdzLgotY2xhc3MgQXVkaW9PdXRwdXRTdHJlYW1XcmFwcGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEF1ZGlvT3V0cHV0U3RyZWFtV3JhcHBlcihBdWRpb01hbmFnZXIqIGF1ZGlvX21hbmFnZXIpCi0gICAgICA6IGNvbV9pbml0XyhTY29wZWRDT01Jbml0aWFsaXplcjo6a01UQSksCi0gICAgICAgIGF1ZGlvX21hbl8oYXVkaW9fbWFuYWdlciksCi0gICAgICAgIGZvcm1hdF8oQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTE9XX0xBVEVOQ1kpLAotICAgICAgICBjaGFubmVsX2xheW91dF8oa0NoYW5uZWxMYXlvdXQpLAotICAgICAgICBiaXRzX3Blcl9zYW1wbGVfKGtCaXRzUGVyU2FtcGxlKSB7Ci0gICAgLy8gVXNlIG5hdGl2ZS9taXhpbmcgc2FtcGxlIHJhdGUgYW5kIDEwbXMgZnJhbWUgc2l6ZSBhcyBkZWZhdWx0LgotICAgIHNhbXBsZV9yYXRlXyA9IHN0YXRpY19jYXN0PGludD4oCi0gICAgICAgIFdBU0FQSUF1ZGlvT3V0cHV0U3RyZWFtOjpIYXJkd2FyZVNhbXBsZVJhdGUoZUNvbnNvbGUpKTsKLSAgICBzYW1wbGVzX3Blcl9wYWNrZXRfID0gc2FtcGxlX3JhdGVfIC8gMTAwOwotICAgIERDSEVDSyhzYW1wbGVfcmF0ZV8pOwotICB9Ci0KLSAgfkF1ZGlvT3V0cHV0U3RyZWFtV3JhcHBlcigpIHt9Ci0KLSAgLy8gQ3JlYXRlcyBBdWRpb091dHB1dFN0cmVhbSBvYmplY3QgdXNpbmcgZGVmYXVsdCBwYXJhbWV0ZXJzLgotICBBdWRpb091dHB1dFN0cmVhbSogQ3JlYXRlKCkgewotICAgIHJldHVybiBDcmVhdGVPdXRwdXRTdHJlYW0oKTsKLSAgfQotCi0gIC8vIENyZWF0ZXMgQXVkaW9PdXRwdXRTdHJlYW0gb2JqZWN0IHVzaW5nIG5vbi1kZWZhdWx0IHBhcmFtZXRlcnMgd2hlcmUgdGhlCi0gIC8vIGZyYW1lIHNpemUgaXMgbW9kaWZpZWQuCi0gIEF1ZGlvT3V0cHV0U3RyZWFtKiBDcmVhdGUoaW50IHNhbXBsZXNfcGVyX3BhY2tldCkgewotICAgIHNhbXBsZXNfcGVyX3BhY2tldF8gPSBzYW1wbGVzX3Blcl9wYWNrZXQ7Ci0gICAgcmV0dXJuIENyZWF0ZU91dHB1dFN0cmVhbSgpOwotICB9Ci0KLSAgLy8gQ3JlYXRlcyBBdWRpb091dHB1dFN0cmVhbSBvYmplY3QgdXNpbmcgbm9uLWRlZmF1bHQgcGFyYW1ldGVycyB3aGVyZSB0aGUKLSAgLy8gc2FtcGxlIHJhdGUgYW5kIGZyYW1lIHNpemUgYXJlIG1vZGlmaWVkLgotICBBdWRpb091dHB1dFN0cmVhbSogQ3JlYXRlKGludCBzYW1wbGVfcmF0ZSwgaW50IHNhbXBsZXNfcGVyX3BhY2tldCkgewotICAgIHNhbXBsZV9yYXRlXyA9IHNhbXBsZV9yYXRlOwotICAgIHNhbXBsZXNfcGVyX3BhY2tldF8gPSBzYW1wbGVzX3Blcl9wYWNrZXQ7Ci0gICAgcmV0dXJuIENyZWF0ZU91dHB1dFN0cmVhbSgpOwotICB9Ci0KLSAgQXVkaW9QYXJhbWV0ZXJzOjpGb3JtYXQgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gZm9ybWF0XzsgfQotICBpbnQgY2hhbm5lbHMoKSBjb25zdCB7IHJldHVybiBDaGFubmVsTGF5b3V0VG9DaGFubmVsQ291bnQoY2hhbm5lbF9sYXlvdXRfKTsgfQotICBpbnQgYml0c19wZXJfc2FtcGxlKCkgY29uc3QgeyByZXR1cm4gYml0c19wZXJfc2FtcGxlXzsgfQotICBpbnQgc2FtcGxlX3JhdGUoKSBjb25zdCB7IHJldHVybiBzYW1wbGVfcmF0ZV87IH0KLSAgaW50IHNhbXBsZXNfcGVyX3BhY2tldCgpIGNvbnN0IHsgcmV0dXJuIHNhbXBsZXNfcGVyX3BhY2tldF87IH0KLQotIHByaXZhdGU6Ci0gIEF1ZGlvT3V0cHV0U3RyZWFtKiBDcmVhdGVPdXRwdXRTdHJlYW0oKSB7Ci0gICAgQXVkaW9PdXRwdXRTdHJlYW0qIGFvcyA9IGF1ZGlvX21hbl8tPk1ha2VBdWRpb091dHB1dFN0cmVhbSgKLSAgICAgICAgQXVkaW9QYXJhbWV0ZXJzKGZvcm1hdF8sIGNoYW5uZWxfbGF5b3V0Xywgc2FtcGxlX3JhdGVfLAotICAgICAgICAgICAgICAgICAgICAgICAgYml0c19wZXJfc2FtcGxlXywgc2FtcGxlc19wZXJfcGFja2V0XykpOwotICAgIEVYUEVDVF9UUlVFKGFvcyk7Ci0gICAgcmV0dXJuIGFvczsKLSAgfQotCi0gIFNjb3BlZENPTUluaXRpYWxpemVyIGNvbV9pbml0XzsKLSAgQXVkaW9NYW5hZ2VyKiBhdWRpb19tYW5fOwotICBBdWRpb1BhcmFtZXRlcnM6OkZvcm1hdCBmb3JtYXRfOwotICBDaGFubmVsTGF5b3V0IGNoYW5uZWxfbGF5b3V0XzsKLSAgaW50IGJpdHNfcGVyX3NhbXBsZV87Ci0gIGludCBzYW1wbGVfcmF0ZV87Ci0gIGludCBzYW1wbGVzX3Blcl9wYWNrZXRfOwotfTsKLQotLy8gQ29udmVuaWVuY2UgbWV0aG9kIHdoaWNoIGNyZWF0ZXMgYSBkZWZhdWx0IEF1ZGlvT3V0cHV0U3RyZWFtIG9iamVjdC4KLXN0YXRpYyBBdWRpb091dHB1dFN0cmVhbSogQ3JlYXRlRGVmYXVsdEF1ZGlvT3V0cHV0U3RyZWFtKAotICAgIEF1ZGlvTWFuYWdlciogYXVkaW9fbWFuYWdlcikgewotICBBdWRpb091dHB1dFN0cmVhbVdyYXBwZXIgYW9zdyhhdWRpb19tYW5hZ2VyKTsKLSAgQXVkaW9PdXRwdXRTdHJlYW0qIGFvcyA9IGFvc3cuQ3JlYXRlKCk7Ci0gIHJldHVybiBhb3M7Ci19Ci0KLS8vIFZlcmlmeSB0aGF0IHdlIGNhbiByZXRyaWV2ZSB0aGUgY3VycmVudCBoYXJkd2FyZS9taXhpbmcgc2FtcGxlIHJhdGUKLS8vIGZvciBhbGwgc3VwcG9ydGVkIGRldmljZSByb2xlcy4gVGhlIEVSb2xlIGVudW1lcmF0aW9uIGRlZmluZXMgY29uc3RhbnRzCi0vLyB0aGF0IGluZGljYXRlIHRoZSByb2xlIHRoYXQgdGhlIHN5c3RlbS91c2VyIGhhcyBhc3NpZ25lZCB0byBhbiBhdWRpbwotLy8gZW5kcG9pbnQgZGV2aWNlLgotLy8gVE9ETyhoZW5yaWthKTogbW9kaWZ5IHRoaXMgdGVzdCB3aGVuIHdlIHN1cHBvcnQgZnVsbCBkZXZpY2UgZW51bWVyYXRpb24uCi1URVNUKFdBU0FQSUF1ZGlvT3V0cHV0U3RyZWFtVGVzdCwgSGFyZHdhcmVTYW1wbGVSYXRlKSB7Ci0gIC8vIFNraXAgdGhpcyB0ZXN0IGluIGV4Y2x1c2l2ZSBtb2RlIHNpbmNlIHRoZSByZXN1bHRpbmcgcmF0ZSBpcyBvbmx5IHV0aWxpemVkCi0gIC8vIGZvciBzaGFyZWQgbW9kZSBzdHJlYW1zLgotICBzY29wZWRfcHRyPEF1ZGlvTWFuYWdlcj4gYXVkaW9fbWFuYWdlcihBdWRpb01hbmFnZXI6OkNyZWF0ZSgpKTsKLSAgaWYgKCFDYW5SdW5BdWRpb1Rlc3RzKGF1ZGlvX21hbmFnZXIuZ2V0KCkpIHx8IEV4Y2x1c2l2ZU1vZGVJc0VuYWJsZWQoKSkKLSAgICByZXR1cm47Ci0KLSAgU2NvcGVkQ09NSW5pdGlhbGl6ZXIgY29tX2luaXQoU2NvcGVkQ09NSW5pdGlhbGl6ZXI6OmtNVEEpOwotCi0gIC8vIERlZmF1bHQgZGV2aWNlIGludGVuZGVkIGZvciBnYW1lcywgc3lzdGVtIG5vdGlmaWNhdGlvbiBzb3VuZHMsCi0gIC8vIGFuZCB2b2ljZSBjb21tYW5kcy4KLSAgaW50IGZzID0gc3RhdGljX2Nhc3Q8aW50PigKLSAgICAgIFdBU0FQSUF1ZGlvT3V0cHV0U3RyZWFtOjpIYXJkd2FyZVNhbXBsZVJhdGUoZUNvbnNvbGUpKTsKLSAgRVhQRUNUX0dFKGZzLCAwKTsKLQotICAvLyBEZWZhdWx0IGNvbW11bmljYXRpb24gZGV2aWNlIGludGVuZGVkIGZvciBlLmcuIFZvSVAgY29tbXVuaWNhdGlvbi4KLSAgZnMgPSBzdGF0aWNfY2FzdDxpbnQ+KAotICAgICAgV0FTQVBJQXVkaW9PdXRwdXRTdHJlYW06OkhhcmR3YXJlU2FtcGxlUmF0ZShlQ29tbXVuaWNhdGlvbnMpKTsKLSAgRVhQRUNUX0dFKGZzLCAwKTsKLQotICAvLyBNdWx0aW1lZGlhIGRldmljZSBmb3IgbXVzaWMsIG1vdmllcyBhbmQgbGl2ZSBtdXNpYyByZWNvcmRpbmcuCi0gIGZzID0gc3RhdGljX2Nhc3Q8aW50PigKLSAgICAgIFdBU0FQSUF1ZGlvT3V0cHV0U3RyZWFtOjpIYXJkd2FyZVNhbXBsZVJhdGUoZU11bHRpbWVkaWEpKTsKLSAgRVhQRUNUX0dFKGZzLCAwKTsKLX0KLQotLy8gVGVzdCBDcmVhdGUoKSwgQ2xvc2UoKSBjYWxsaW5nIHNlcXVlbmNlLgotVEVTVChXQVNBUElBdWRpb091dHB1dFN0cmVhbVRlc3QsIENyZWF0ZUFuZENsb3NlKSB7Ci0gIHNjb3BlZF9wdHI8QXVkaW9NYW5hZ2VyPiBhdWRpb19tYW5hZ2VyKEF1ZGlvTWFuYWdlcjo6Q3JlYXRlKCkpOwotICBpZiAoIUNhblJ1bkF1ZGlvVGVzdHMoYXVkaW9fbWFuYWdlci5nZXQoKSkpCi0gICAgcmV0dXJuOwotICBBdWRpb091dHB1dFN0cmVhbSogYW9zID0gQ3JlYXRlRGVmYXVsdEF1ZGlvT3V0cHV0U3RyZWFtKGF1ZGlvX21hbmFnZXIuZ2V0KCkpOwotICBhb3MtPkNsb3NlKCk7Ci19Ci0KLS8vIFZlcmlmeSB0aGF0IHRoZSBjcmVhdGVkIG9iamVjdCBpcyBjb25maWd1cmVkIHRvIHVzZSB0aGUgc2FtZSBudW1iZXIgb2YKLS8vIGF1ZGlvIGNoYW5uZWxzIGFzIGlzIHJlcG9ydGVkIGJ5IHRoZSBzdGF0aWMgSGFyZHdhcmVDaGFubmVsQ291bnQoKSBtZXRob2QuCi1URVNUKFdBU0FQSUF1ZGlvT3V0cHV0U3RyZWFtVGVzdCwgSGFyZHdhcmVDaGFubmVsQ291bnQpIHsKLSAgc2NvcGVkX3B0cjxBdWRpb01hbmFnZXI+IGF1ZGlvX21hbmFnZXIoQXVkaW9NYW5hZ2VyOjpDcmVhdGUoKSk7Ci0gIGlmICghQ2FuUnVuQXVkaW9UZXN0cyhhdWRpb19tYW5hZ2VyLmdldCgpKSkKLSAgICByZXR1cm47Ci0KLSAgU2NvcGVkQ09NSW5pdGlhbGl6ZXIgY29tX2luaXQoU2NvcGVkQ09NSW5pdGlhbGl6ZXI6OmtNVEEpOwotCi0gIC8vIEZpcnN0LCB2ZXJpZnkgdGhhdCB3ZSBjYW4gcmVhZCBhIHZhbGlkIG5hdGl2ZS9oYXJkd2FyZSBjaGFubmVsLWNvdW50LgotICBpbnQgaGFyZHdhcmVfY2hhbm5lbF9jb3VudCA9IFdBU0FQSUF1ZGlvT3V0cHV0U3RyZWFtOjpIYXJkd2FyZUNoYW5uZWxDb3VudCgpOwotICBFWFBFQ1RfR0UoaGFyZHdhcmVfY2hhbm5lbF9jb3VudCwgMSk7Ci0KLSAgQXVkaW9PdXRwdXRTdHJlYW1XcmFwcGVyIGFvc3coYXVkaW9fbWFuYWdlci5nZXQoKSk7Ci0gIFdBU0FQSUF1ZGlvT3V0cHV0U3RyZWFtKiBhb3MgPQotICAgICAgc3RhdGljX2Nhc3Q8V0FTQVBJQXVkaW9PdXRwdXRTdHJlYW0qPihhb3N3LkNyZWF0ZSgpKTsKLQotICAvLyBOZXh0LCBlbnN1cmUgdGhhdCB0aGUgY3JlYXRlZCBvdXRwdXQgc3RyZWFtIG9iamVjdCBpcyByZWFsbHkgdXNpbmcgdGhlCi0gIC8vIGhhcmR3YXJlIGNoYW5uZWwtY291bnQuCi0gIEVYUEVDVF9FUShoYXJkd2FyZV9jaGFubmVsX2NvdW50LCBhb3MtPkdldEVuZHBvaW50Q2hhbm5lbENvdW50Rm9yVGVzdGluZygpKTsKLSAgYW9zLT5DbG9zZSgpOwotfQotCi0vLyBUZXN0IE9wZW4oKSwgQ2xvc2UoKSBjYWxsaW5nIHNlcXVlbmNlLgotVEVTVChXQVNBUElBdWRpb091dHB1dFN0cmVhbVRlc3QsIE9wZW5BbmRDbG9zZSkgewotICBzY29wZWRfcHRyPEF1ZGlvTWFuYWdlcj4gYXVkaW9fbWFuYWdlcihBdWRpb01hbmFnZXI6OkNyZWF0ZSgpKTsKLSAgaWYgKCFDYW5SdW5BdWRpb1Rlc3RzKGF1ZGlvX21hbmFnZXIuZ2V0KCkpKQotICAgIHJldHVybjsKLSAgQXVkaW9PdXRwdXRTdHJlYW0qIGFvcyA9IENyZWF0ZURlZmF1bHRBdWRpb091dHB1dFN0cmVhbShhdWRpb19tYW5hZ2VyLmdldCgpKTsKLSAgRVhQRUNUX1RSVUUoYW9zLT5PcGVuKCkpOwotICBhb3MtPkNsb3NlKCk7Ci19Ci0KLS8vIFRlc3QgT3BlbigpLCBTdGFydCgpLCBDbG9zZSgpIGNhbGxpbmcgc2VxdWVuY2UuCi1URVNUKFdBU0FQSUF1ZGlvT3V0cHV0U3RyZWFtVGVzdCwgT3BlblN0YXJ0QW5kQ2xvc2UpIHsKLSAgc2NvcGVkX3B0cjxBdWRpb01hbmFnZXI+IGF1ZGlvX21hbmFnZXIoQXVkaW9NYW5hZ2VyOjpDcmVhdGUoKSk7Ci0gIGlmICghQ2FuUnVuQXVkaW9UZXN0cyhhdWRpb19tYW5hZ2VyLmdldCgpKSkKLSAgICByZXR1cm47Ci0gIEF1ZGlvT3V0cHV0U3RyZWFtKiBhb3MgPSBDcmVhdGVEZWZhdWx0QXVkaW9PdXRwdXRTdHJlYW0oYXVkaW9fbWFuYWdlci5nZXQoKSk7Ci0gIEVYUEVDVF9UUlVFKGFvcy0+T3BlbigpKTsKLSAgTW9ja0F1ZGlvU291cmNlQ2FsbGJhY2sgc291cmNlOwotICBFWFBFQ1RfQ0FMTChzb3VyY2UsIE9uRXJyb3IoYW9zLCBfKSkKLSAgICAgIC5UaW1lcygwKTsKLSAgYW9zLT5TdGFydCgmc291cmNlKTsKLSAgYW9zLT5DbG9zZSgpOwotfQotCi0vLyBUZXN0IE9wZW4oKSwgU3RhcnQoKSwgU3RvcCgpLCBDbG9zZSgpIGNhbGxpbmcgc2VxdWVuY2UuCi1URVNUKFdBU0FQSUF1ZGlvT3V0cHV0U3RyZWFtVGVzdCwgT3BlblN0YXJ0U3RvcEFuZENsb3NlKSB7Ci0gIHNjb3BlZF9wdHI8QXVkaW9NYW5hZ2VyPiBhdWRpb19tYW5hZ2VyKEF1ZGlvTWFuYWdlcjo6Q3JlYXRlKCkpOwotICBpZiAoIUNhblJ1bkF1ZGlvVGVzdHMoYXVkaW9fbWFuYWdlci5nZXQoKSkpCi0gICAgcmV0dXJuOwotICBBdWRpb091dHB1dFN0cmVhbSogYW9zID0gQ3JlYXRlRGVmYXVsdEF1ZGlvT3V0cHV0U3RyZWFtKGF1ZGlvX21hbmFnZXIuZ2V0KCkpOwotICBFWFBFQ1RfVFJVRShhb3MtPk9wZW4oKSk7Ci0gIE1vY2tBdWRpb1NvdXJjZUNhbGxiYWNrIHNvdXJjZTsKLSAgRVhQRUNUX0NBTEwoc291cmNlLCBPbkVycm9yKGFvcywgXykpCi0gICAgICAuVGltZXMoMCk7Ci0gIGFvcy0+U3RhcnQoJnNvdXJjZSk7Ci0gIGFvcy0+U3RvcCgpOwotICBhb3MtPkNsb3NlKCk7Ci19Ci0KLS8vIFRlc3QgU2V0Vm9sdW1lKCksIEdldFZvbHVtZSgpCi1URVNUKFdBU0FQSUF1ZGlvT3V0cHV0U3RyZWFtVGVzdCwgVm9sdW1lKSB7Ci0gIHNjb3BlZF9wdHI8QXVkaW9NYW5hZ2VyPiBhdWRpb19tYW5hZ2VyKEF1ZGlvTWFuYWdlcjo6Q3JlYXRlKCkpOwotICBpZiAoIUNhblJ1bkF1ZGlvVGVzdHMoYXVkaW9fbWFuYWdlci5nZXQoKSkpCi0gICAgcmV0dXJuOwotICBBdWRpb091dHB1dFN0cmVhbSogYW9zID0gQ3JlYXRlRGVmYXVsdEF1ZGlvT3V0cHV0U3RyZWFtKGF1ZGlvX21hbmFnZXIuZ2V0KCkpOwotCi0gIC8vIEluaXRpYWwgdm9sdW1lIHNob3VsZCBiZSBmdWxsIHZvbHVtZSAoMS4wKS4KLSAgZG91YmxlIHZvbHVtZSA9IDAuMDsKLSAgYW9zLT5HZXRWb2x1bWUoJnZvbHVtZSk7Ci0gIEVYUEVDVF9FUSgxLjAsIHZvbHVtZSk7Ci0KLSAgLy8gVmVyaWZ5IHNvbWUgdmFsaWQgdm9sdW1lIHNldHRpbmdzLgotICBhb3MtPlNldFZvbHVtZSgwLjApOwotICBhb3MtPkdldFZvbHVtZSgmdm9sdW1lKTsKLSAgRVhQRUNUX0VRKDAuMCwgdm9sdW1lKTsKLQotICBhb3MtPlNldFZvbHVtZSgwLjUpOwotICBhb3MtPkdldFZvbHVtZSgmdm9sdW1lKTsKLSAgRVhQRUNUX0VRKDAuNSwgdm9sdW1lKTsKLQotICBhb3MtPlNldFZvbHVtZSgxLjApOwotICBhb3MtPkdldFZvbHVtZSgmdm9sdW1lKTsKLSAgRVhQRUNUX0VRKDEuMCwgdm9sdW1lKTsKLQotICAvLyBFbnN1cmUgdGhhdCBpbnZhbGlkIHZvbHVtZSBzZXR0aW5nIGhhdmUgbm8gZWZmZWN0LgotICBhb3MtPlNldFZvbHVtZSgxLjUpOwotICBhb3MtPkdldFZvbHVtZSgmdm9sdW1lKTsKLSAgRVhQRUNUX0VRKDEuMCwgdm9sdW1lKTsKLQotICBhb3MtPlNldFZvbHVtZSgtMC41KTsKLSAgYW9zLT5HZXRWb2x1bWUoJnZvbHVtZSk7Ci0gIEVYUEVDVF9FUSgxLjAsIHZvbHVtZSk7Ci0KLSAgYW9zLT5DbG9zZSgpOwotfQotCi0vLyBUZXN0IHNvbWUgYWRkaXRpb25hbCBjYWxsaW5nIHNlcXVlbmNlcy4KLVRFU1QoV0FTQVBJQXVkaW9PdXRwdXRTdHJlYW1UZXN0LCBNaXNjQ2FsbGluZ1NlcXVlbmNlcykgewotICBzY29wZWRfcHRyPEF1ZGlvTWFuYWdlcj4gYXVkaW9fbWFuYWdlcihBdWRpb01hbmFnZXI6OkNyZWF0ZSgpKTsKLSAgaWYgKCFDYW5SdW5BdWRpb1Rlc3RzKGF1ZGlvX21hbmFnZXIuZ2V0KCkpKQotICAgIHJldHVybjsKLQotICBBdWRpb091dHB1dFN0cmVhbSogYW9zID0gQ3JlYXRlRGVmYXVsdEF1ZGlvT3V0cHV0U3RyZWFtKGF1ZGlvX21hbmFnZXIuZ2V0KCkpOwotICBXQVNBUElBdWRpb091dHB1dFN0cmVhbSogd2FvcyA9IHN0YXRpY19jYXN0PFdBU0FQSUF1ZGlvT3V0cHV0U3RyZWFtKj4oYW9zKTsKLQotICAvLyBPcGVuKCksIE9wZW4oKSBpcyBhIHZhbGlkIGNhbGxpbmcgc2VxdWVuY2UgKHNlY29uZCBjYWxsIGRvZXMgbm90aGluZykuCi0gIEVYUEVDVF9UUlVFKGFvcy0+T3BlbigpKTsKLSAgRVhQRUNUX1RSVUUoYW9zLT5PcGVuKCkpOwotCi0gIE1vY2tBdWRpb1NvdXJjZUNhbGxiYWNrIHNvdXJjZTsKLQotICAvLyBTdGFydCgpLCBTdGFydCgpIGlzIGEgdmFsaWQgY2FsbGluZyBzZXF1ZW5jZSAoc2Vjb25kIGNhbGwgZG9lcyBub3RoaW5nKS4KLSAgYW9zLT5TdGFydCgmc291cmNlKTsKLSAgRVhQRUNUX1RSVUUod2Fvcy0+c3RhcnRlZCgpKTsKLSAgYW9zLT5TdGFydCgmc291cmNlKTsKLSAgRVhQRUNUX1RSVUUod2Fvcy0+c3RhcnRlZCgpKTsKLQotICAvLyBTdG9wKCksIFN0b3AoKSBpcyBhIHZhbGlkIGNhbGxpbmcgc2VxdWVuY2UgKHNlY29uZCBjYWxsIGRvZXMgbm90aGluZykuCi0gIGFvcy0+U3RvcCgpOwotICBFWFBFQ1RfRkFMU0Uod2Fvcy0+c3RhcnRlZCgpKTsKLSAgYW9zLT5TdG9wKCk7Ci0gIEVYUEVDVF9GQUxTRSh3YW9zLT5zdGFydGVkKCkpOwotCi0gIC8vIFN0YXJ0KCksIFN0b3AoKSwgU3RhcnQoKSwgU3RvcCgpLgotICBhb3MtPlN0YXJ0KCZzb3VyY2UpOwotICBFWFBFQ1RfVFJVRSh3YW9zLT5zdGFydGVkKCkpOwotICBhb3MtPlN0b3AoKTsKLSAgRVhQRUNUX0ZBTFNFKHdhb3MtPnN0YXJ0ZWQoKSk7Ci0gIGFvcy0+U3RhcnQoJnNvdXJjZSk7Ci0gIEVYUEVDVF9UUlVFKHdhb3MtPnN0YXJ0ZWQoKSk7Ci0gIGFvcy0+U3RvcCgpOwotICBFWFBFQ1RfRkFMU0Uod2Fvcy0+c3RhcnRlZCgpKTsKLQotICBhb3MtPkNsb3NlKCk7Ci19Ci0KLS8vIFVzZSBkZWZhdWx0IHBhY2tldCBzaXplICgxMG1zKSBhbmQgdmVyaWZ5IHRoYXQgcmVuZGVyaW5nIHN0YXJ0cy4KLVRFU1QoV0FTQVBJQXVkaW9PdXRwdXRTdHJlYW1UZXN0LCBQYWNrZXRTaXplSW5NaWxsaXNlY29uZHMpIHsKLSAgc2NvcGVkX3B0cjxBdWRpb01hbmFnZXI+IGF1ZGlvX21hbmFnZXIoQXVkaW9NYW5hZ2VyOjpDcmVhdGUoKSk7Ci0gIGlmICghQ2FuUnVuQXVkaW9UZXN0cyhhdWRpb19tYW5hZ2VyLmdldCgpKSkKLSAgICByZXR1cm47Ci0KLSAgTWVzc2FnZUxvb3BGb3JVSSBsb29wOwotICBNb2NrQXVkaW9Tb3VyY2VDYWxsYmFjayBzb3VyY2U7Ci0KLSAgLy8gQ3JlYXRlIGRlZmF1bHQgV0FTQVBJIG91dHB1dCBzdHJlYW0gd2hpY2ggcGxheXMgb3V0IGluIHN0ZXJlbyB1c2luZwotICAvLyB0aGUgc2hhcmVkIG1peGluZyByYXRlLiBUaGUgZGVmYXVsdCBidWZmZXIgc2l6ZSBpcyAxMG1zLgotICBBdWRpb091dHB1dFN0cmVhbVdyYXBwZXIgYW9zdyhhdWRpb19tYW5hZ2VyLmdldCgpKTsKLSAgQXVkaW9PdXRwdXRTdHJlYW0qIGFvcyA9IGFvc3cuQ3JlYXRlKCk7Ci0gIEVYUEVDVF9UUlVFKGFvcy0+T3BlbigpKTsKLQotICAvLyBEZXJpdmUgdGhlIGV4cGVjdGVkIHNpemUgaW4gYnl0ZXMgb2YgZWFjaCBwYWNrZXQuCi0gIHVpbnQzMiBieXRlc19wZXJfcGFja2V0ID0gYW9zdy5jaGFubmVscygpICogYW9zdy5zYW1wbGVzX3Blcl9wYWNrZXQoKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoYW9zdy5iaXRzX3Blcl9zYW1wbGUoKSAvIDgpOwotCi0gIC8vIFNldCB1cCBleHBlY3RlZCBtaW5pbXVtIGRlbGF5IGVzdGltYXRpb24uCi0gIEF1ZGlvQnVmZmVyc1N0YXRlIHN0YXRlKDAsIGJ5dGVzX3Blcl9wYWNrZXQpOwotCi0gIC8vIFdhaXQgZm9yIHRoZSBmaXJzdCBjYWxsYmFjayBhbmQgdmVyaWZ5IGl0cyBwYXJhbWV0ZXJzLgotICBFWFBFQ1RfQ0FMTChzb3VyY2UsIE9uTW9yZURhdGEoTm90TnVsbCgpLCBIYXNWYWxpZERlbGF5KHN0YXRlKSkpCi0gICAgICAuV2lsbE9uY2UoRG9BbGwoCi0gICAgICAgICAgUXVpdExvb3AobG9vcC5tZXNzYWdlX2xvb3BfcHJveHkoKSksCi0gICAgICAgICAgUmV0dXJuKGFvc3cuc2FtcGxlc19wZXJfcGFja2V0KCkpKSk7Ci0KLSAgYW9zLT5TdGFydCgmc291cmNlKTsKLSAgbG9vcC5Qb3N0RGVsYXllZFRhc2soRlJPTV9IRVJFLCBNZXNzYWdlTG9vcDo6UXVpdENsb3N1cmUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgVGVzdFRpbWVvdXRzOjphY3Rpb25fdGltZW91dCgpKTsKLSAgbG9vcC5SdW4oKTsKLSAgYW9zLT5TdG9wKCk7Ci0gIGFvcy0+Q2xvc2UoKTsKLX0KLQotLy8gVXNlIGEgZml4ZWQgcGFja2V0cyBzaXplIChpbmRlcGVuZGVudCBvZiBzYW1wbGUgcmF0ZSkgYW5kIHZlcmlmeQotLy8gdGhhdCByZW5kZXJpbmcgc3RhcnRzLgotVEVTVChXQVNBUElBdWRpb091dHB1dFN0cmVhbVRlc3QsIFBhY2tldFNpemVJblNhbXBsZXMpIHsKLSAgc2NvcGVkX3B0cjxBdWRpb01hbmFnZXI+IGF1ZGlvX21hbmFnZXIoQXVkaW9NYW5hZ2VyOjpDcmVhdGUoKSk7Ci0gIGlmICghQ2FuUnVuQXVkaW9UZXN0cyhhdWRpb19tYW5hZ2VyLmdldCgpKSkKLSAgICByZXR1cm47Ci0KLSAgTWVzc2FnZUxvb3BGb3JVSSBsb29wOwotICBNb2NrQXVkaW9Tb3VyY2VDYWxsYmFjayBzb3VyY2U7Ci0KLSAgLy8gQ3JlYXRlIGRlZmF1bHQgV0FTQVBJIG91dHB1dCBzdHJlYW0gd2hpY2ggcmVhZHMgZGF0YSBpbiBzdGVyZW8gdXNpbmcKLSAgLy8gdGhlIG5hdGl2ZSBtaXhpbmcgcmF0ZSBhbmQgY2hhbm5lbCBjb3VudC4gVGhlIGJ1ZmZlciBzaXplIGlzIHNldCB0bwotICAvLyAxMDI0IHNhbXBsZXMuCi0gIEF1ZGlvT3V0cHV0U3RyZWFtV3JhcHBlciBhb3N3KGF1ZGlvX21hbmFnZXIuZ2V0KCkpOwotICBBdWRpb091dHB1dFN0cmVhbSogYW9zID0gYW9zdy5DcmVhdGUoMTAyNCk7Ci0gIEVYUEVDVF9UUlVFKGFvcy0+T3BlbigpKTsKLQotICAvLyBEZXJpdmUgdGhlIGV4cGVjdGVkIHNpemUgaW4gYnl0ZXMgb2YgZWFjaCBwYWNrZXQuCi0gIHVpbnQzMiBieXRlc19wZXJfcGFja2V0ID0gYW9zdy5jaGFubmVscygpICogYW9zdy5zYW1wbGVzX3Blcl9wYWNrZXQoKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoYW9zdy5iaXRzX3Blcl9zYW1wbGUoKSAvIDgpOwotCi0gIC8vIFNldCB1cCBleHBlY3RlZCBtaW5pbXVtIGRlbGF5IGVzdGltYXRpb24uCi0gIEF1ZGlvQnVmZmVyc1N0YXRlIHN0YXRlKDAsIGJ5dGVzX3Blcl9wYWNrZXQpOwotCi0gIC8vIEVuc3VyZSB0aGF0IGNhbGxiYWNrcyBzdGFydCBjb3JyZWN0bHkuCi0gIEVYUEVDVF9DQUxMKHNvdXJjZSwgT25Nb3JlRGF0YShOb3ROdWxsKCksIEhhc1ZhbGlkRGVsYXkoc3RhdGUpKSkKLSAgICAgIC5XaWxsT25jZShEb0FsbCgKLSAgICAgICAgICBRdWl0TG9vcChsb29wLm1lc3NhZ2VfbG9vcF9wcm94eSgpKSwKLSAgICAgICAgICBSZXR1cm4oYW9zdy5zYW1wbGVzX3Blcl9wYWNrZXQoKSkpKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybihhb3N3LnNhbXBsZXNfcGVyX3BhY2tldCgpKSk7Ci0KLSAgYW9zLT5TdGFydCgmc291cmNlKTsKLSAgbG9vcC5Qb3N0RGVsYXllZFRhc2soRlJPTV9IRVJFLCBNZXNzYWdlTG9vcDo6UXVpdENsb3N1cmUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgVGVzdFRpbWVvdXRzOjphY3Rpb25fdGltZW91dCgpKTsKLSAgbG9vcC5SdW4oKTsKLSAgYW9zLT5TdG9wKCk7Ci0gIGFvcy0+Q2xvc2UoKTsKLX0KLQotLy8gVGhpcyB0ZXN0IGlzIGludGVuZGVkIGZvciBtYW51YWwgdGVzdHMgYW5kIHNob3VsZCBvbmx5IGJlIGVuYWJsZWQKLS8vIHdoZW4gaXQgaXMgcmVxdWlyZWQgdG8gcGxheSBvdXQgZGF0YSBmcm9tIGEgbG9jYWwgUENNIGZpbGUuCi0vLyBCeSBkZWZhdWx0LCBHVGVzdCB3aWxsIHByaW50IG91dCBZT1UgSEFWRSAxIERJU0FCTEVEIFRFU1QuCi0vLyBUbyBpbmNsdWRlIGRpc2FibGVkIHRlc3RzIGluIHRlc3QgZXhlY3V0aW9uLCBqdXN0IGludm9rZSB0aGUgdGVzdCBwcm9ncmFtCi0vLyB3aXRoIC0tZ3Rlc3RfYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMgb3Igc2V0IHRoZSBHVEVTVF9BTFNPX1JVTl9ESVNBQkxFRF9URVNUUwotLy8gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gYSB2YWx1ZSBncmVhdGVyIHRoYW4gMC4KLS8vIFRoZSB0ZXN0IGZpbGVzIGFyZSBhcHByb3hpbWF0ZWx5IDIwIHNlY29uZHMgbG9uZy4KLVRFU1QoV0FTQVBJQXVkaW9PdXRwdXRTdHJlYW1UZXN0LCBESVNBQkxFRF9SZWFkRnJvbVN0ZXJlb0ZpbGUpIHsKLSAgc2NvcGVkX3B0cjxBdWRpb01hbmFnZXI+IGF1ZGlvX21hbmFnZXIoQXVkaW9NYW5hZ2VyOjpDcmVhdGUoKSk7Ci0gIGlmICghQ2FuUnVuQXVkaW9UZXN0cyhhdWRpb19tYW5hZ2VyLmdldCgpKSkKLSAgICByZXR1cm47Ci0KLSAgQXVkaW9PdXRwdXRTdHJlYW1XcmFwcGVyIGFvc3coYXVkaW9fbWFuYWdlci5nZXQoKSk7Ci0gIEF1ZGlvT3V0cHV0U3RyZWFtKiBhb3MgPSBhb3N3LkNyZWF0ZSgpOwotICBFWFBFQ1RfVFJVRShhb3MtPk9wZW4oKSk7Ci0KLSAgc3RkOjpzdHJpbmcgZmlsZV9uYW1lOwotICBpZiAoYW9zdy5zYW1wbGVfcmF0ZSgpID09IDQ4MDAwKSB7Ci0gICAgZmlsZV9uYW1lID0ga1NwZWVjaEZpbGVfMTZiX3NfNDhrOwotICB9IGVsc2UgaWYgKGFvc3cuc2FtcGxlX3JhdGUoKSA9PSA0NDEwMCkgewotICAgIGZpbGVfbmFtZSA9IGtTcGVlY2hGaWxlXzE2Yl9zXzQ0azsKLSAgfSBlbHNlIGlmIChhb3N3LnNhbXBsZV9yYXRlKCkgPT0gOTYwMDApIHsKLSAgICAvLyBVc2UgNDhrSHogZmlsZSBhdCA5NmtIeiBhcyB3ZWxsLiBXaWxsIHNvdW5kIGxpa2UgRG9uYWxkIER1Y2suCi0gICAgZmlsZV9uYW1lID0ga1NwZWVjaEZpbGVfMTZiX3NfNDhrOwotICB9IGVsc2UgewotICAgIEZBSUwoKSA8PCAiVGhpcyB0ZXN0IHN1cHBvcnRzIDQ0LjEsIDQ4a0h6IGFuZCA5NmtIeiBvbmx5LiI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIFJlYWRGcm9tRmlsZUF1ZGlvU291cmNlIGZpbGVfc291cmNlKGZpbGVfbmFtZSk7Ci0KLSAgTE9HKElORk8pIDw8ICJGaWxlIG5hbWUgICAgICA6ICIgPDwgZmlsZV9uYW1lLmNfc3RyKCk7Ci0gIExPRyhJTkZPKSA8PCAiU2FtcGxlIHJhdGUgICAgOiAiIDw8IGFvc3cuc2FtcGxlX3JhdGUoKTsKLSAgTE9HKElORk8pIDw8ICJCaXRzIHBlciBzYW1wbGU6ICIgPDwgYW9zdy5iaXRzX3Blcl9zYW1wbGUoKTsKLSAgTE9HKElORk8pIDw8ICIjY2hhbm5lbHMgICAgICA6ICIgPDwgYW9zdy5jaGFubmVscygpOwotICBMT0coSU5GTykgPDwgIkZpbGUgc2l6ZSAgICAgIDogIiA8PCBmaWxlX3NvdXJjZS5maWxlX3NpemUoKTsKLSAgTE9HKElORk8pIDw8ICIjZmlsZSBzZWdtZW50cyA6ICIgPDwga051bUZpbGVTZWdtZW50czsKLSAgTE9HKElORk8pIDw8ICI+PiBMaXN0ZW4gdG8gdGhlIHN0ZXJlbyBmaWxlIHdoaWxlIHBsYXlpbmcuLi4iOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwga051bUZpbGVTZWdtZW50czsgaSsrKSB7Ci0gICAgLy8gRWFjaCBzZWdtZW50IHdpbGwgc3RhcnQgd2l0aCBhIHNob3J0ICh+MjBtcykgYmxvY2sgb2YgemVyb3MsIGhlbmNlCi0gICAgLy8gc29tZSBzaG9ydCBnbGl0Y2hlcyBtaWdodCBiZSBoZWFyZCBpbiB0aGlzIHRlc3QgaWYga051bUZpbGVTZWdtZW50cwotICAgIC8vIGlzIGxhcmdlciB0aGFuIG9uZS4gVGhlIGV4YWN0IGxlbmd0aCBvZiB0aGUgc2lsZW5jZSBwZXJpb2QgZGVwZW5kcyBvbgotICAgIC8vIHRoZSBzZWxlY3RlZCBzYW1wbGUgcmF0ZS4KLSAgICBhb3MtPlN0YXJ0KCZmaWxlX3NvdXJjZSk7Ci0gICAgYmFzZTo6UGxhdGZvcm1UaHJlYWQ6OlNsZWVwKAotICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoa0ZpbGVEdXJhdGlvbk1zIC8ga051bUZpbGVTZWdtZW50cykpOwotICAgIGFvcy0+U3RvcCgpOwotICB9Ci0KLSAgTE9HKElORk8pIDw8ICI+PiBTdGVyZW8gZmlsZSBwbGF5b3V0IGhhcyBzdG9wcGVkLiI7Ci0gIGFvcy0+Q2xvc2UoKTsKLX0KLQotLy8gVmVyaWZ5IHRoYXQgd2UgY2FuIG9wZW4gdGhlIG91dHB1dCBzdHJlYW0gaW4gZXhjbHVzaXZlIG1vZGUgdXNpbmcgYQotLy8gY2VydGFpbiBzZXQgb2YgYXVkaW8gcGFyYW1ldGVycyBhbmQgYSBzYW1wbGUgcmF0ZSBvZiA0OGtIei4KLS8vIFRoZSBleHBlY3RlZCBvdXRjb21lcyBvZiBlYWNoIHNldHRpbmcgaW4gdGhpcyB0ZXN0IGhhcyBiZWVuIGRlcml2ZWQKLS8vIG1hbnVhbGx5IHVzaW5nIGxvZyBvdXRwdXRzICgtLXY9MSkuCi1URVNUKFdBU0FQSUF1ZGlvT3V0cHV0U3RyZWFtVGVzdCwgRXhjbHVzaXZlTW9kZUJ1ZmZlclNpemVzQXQ0OGtIeikgewotICBpZiAoIUV4Y2x1c2l2ZU1vZGVJc0VuYWJsZWQoKSkKLSAgICByZXR1cm47Ci0KLSAgc2NvcGVkX3B0cjxBdWRpb01hbmFnZXI+IGF1ZGlvX21hbmFnZXIoQXVkaW9NYW5hZ2VyOjpDcmVhdGUoKSk7Ci0gIGlmICghQ2FuUnVuQXVkaW9UZXN0cyhhdWRpb19tYW5hZ2VyLmdldCgpKSkKLSAgICByZXR1cm47Ci0KLSAgQXVkaW9PdXRwdXRTdHJlYW1XcmFwcGVyIGFvc3coYXVkaW9fbWFuYWdlci5nZXQoKSk7Ci0KLSAgLy8gMTBtcyBAIDQ4a0h6IHNoYWxsIHdvcmsuCi0gIC8vIE5vdGUgdGhhdCwgdGhpcyBpcyB0aGUgc2FtZSBzaXplIGFzIHdlIGNhbiB1c2UgZm9yIHNoYXJlZC1tb2RlIHN0cmVhbWluZwotICAvLyBidXQgaGVyZSB0aGUgZW5kcG9pbnQgYnVmZmVyIGRlbGF5IGlzIG9ubHkgMTBtcyBpbnN0ZWFkIG9mIDIwbXMuCi0gIEF1ZGlvT3V0cHV0U3RyZWFtKiBhb3MgPSBhb3N3LkNyZWF0ZSg0ODAwMCwgNDgwKTsKLSAgRVhQRUNUX1RSVUUoYW9zLT5PcGVuKCkpOwotICBhb3MtPkNsb3NlKCk7Ci0KLSAgLy8gNW1zIEAgNDhrSHogZG9lcyBub3Qgd29yayBkdWUgdG8gbWlzYWxpZ25tZW50LgotICAvLyBUaGlzIHRlc3Qgd2lsbCBwcm9wb3NlIGFuIGFsaWduZWQgYnVmZmVyIHNpemUgb2YgNS4zMzMzbXMuCi0gIC8vIE5vdGUgdGhhdCB3ZSBtdXN0IGNhbGwgQ2xvc2UoKSBldmVuIGlzIE9wZW4oKSBmYWlscyBzaW5jZSBDbG9zZSgpIGFsc28KLSAgLy8gZGVsZXRlcyB0aGUgb2JqZWN0IGFuZCB3ZSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBvYmplY3QgaW4gdGhlIG5leHQgdGVzdC4KLSAgYW9zID0gYW9zdy5DcmVhdGUoNDgwMDAsIDI0MCk7Ci0gIEVYUEVDVF9GQUxTRShhb3MtPk9wZW4oKSk7Ci0gIGFvcy0+Q2xvc2UoKTsKLQotICAvLyA1LjMzMzNtcyBAIDQ4a0h6IHNob3VsZCB3b3JrIChzZWUgdGVzdCBhYm92ZSkuCi0gIGFvcyA9IGFvc3cuQ3JlYXRlKDQ4MDAwLCAyNTYpOwotICBFWFBFQ1RfVFJVRShhb3MtPk9wZW4oKSk7Ci0gIGFvcy0+Q2xvc2UoKTsKLQotICAvLyAyLjY2NjdtcyBpcyBzbWFsbGVyIHRoYW4gdGhlIG1pbmltdW0gc3VwcG9ydGVkIHNpemUgKD0zbXMpLgotICBhb3MgPSBhb3N3LkNyZWF0ZSg0ODAwMCwgMTI4KTsKLSAgRVhQRUNUX0ZBTFNFKGFvcy0+T3BlbigpKTsKLSAgYW9zLT5DbG9zZSgpOwotCi0gIC8vIDNtcyBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGFuIGFsaWduZWQgYnVmZmVyIHNpemUuCi0gIC8vIFRoaXMgdGVzdCB3aWxsIHByb3Bvc2UgYW4gYWxpZ25lZCBidWZmZXIgc2l6ZSBvZiAzLjMzMzNtcy4KLSAgYW9zID0gYW9zdy5DcmVhdGUoNDgwMDAsIDE0NCk7Ci0gIEVYUEVDVF9GQUxTRShhb3MtPk9wZW4oKSk7Ci0gIGFvcy0+Q2xvc2UoKTsKLQotICAvLyAzLjMzMzNtcyBAIDQ4a0h6IDw9PiBzbWFsbGVzdCBwb3NzaWJsZSBidWZmZXIgc2l6ZSB3ZSBjYW4gdXNlLgotICBhb3MgPSBhb3N3LkNyZWF0ZSg0ODAwMCwgMTYwKTsKLSAgRVhQRUNUX1RSVUUoYW9zLT5PcGVuKCkpOwotICBhb3MtPkNsb3NlKCk7Ci19Ci0KLS8vIFZlcmlmeSB0aGF0IHdlIGNhbiBvcGVuIHRoZSBvdXRwdXQgc3RyZWFtIGluIGV4Y2x1c2l2ZSBtb2RlIHVzaW5nIGEKLS8vIGNlcnRhaW4gc2V0IG9mIGF1ZGlvIHBhcmFtZXRlcnMgYW5kIGEgc2FtcGxlIHJhdGUgb2YgNDQuMWtIei4KLS8vIFRoZSBleHBlY3RlZCBvdXRjb21lcyBvZiBlYWNoIHNldHRpbmcgaW4gdGhpcyB0ZXN0IGhhcyBiZWVuIGRlcml2ZWQKLS8vIG1hbnVhbGx5IHVzaW5nIGxvZyBvdXRwdXRzICgtLXY9MSkuCi1URVNUKFdBU0FQSUF1ZGlvT3V0cHV0U3RyZWFtVGVzdCwgRXhjbHVzaXZlTW9kZUJ1ZmZlclNpemVzQXQ0NGtIeikgewotICBpZiAoIUV4Y2x1c2l2ZU1vZGVJc0VuYWJsZWQoKSkKLSAgICByZXR1cm47Ci0KLSAgc2NvcGVkX3B0cjxBdWRpb01hbmFnZXI+IGF1ZGlvX21hbmFnZXIoQXVkaW9NYW5hZ2VyOjpDcmVhdGUoKSk7Ci0gIGlmICghQ2FuUnVuQXVkaW9UZXN0cyhhdWRpb19tYW5hZ2VyLmdldCgpKSkKLSAgICByZXR1cm47Ci0KLSAgQXVkaW9PdXRwdXRTdHJlYW1XcmFwcGVyIGFvc3coYXVkaW9fbWFuYWdlci5nZXQoKSk7Ci0KLSAgLy8gMTBtcyBAIDQ0LjFrSHogZG9lcyBub3Qgd29yayBkdWUgdG8gbWlzYWxpZ25tZW50LgotICAvLyBUaGlzIHRlc3Qgd2lsbCBwcm9wb3NlIGFuIGFsaWduZWQgYnVmZmVyIHNpemUgb2YgMTAuMTU4N21zLgotICBBdWRpb091dHB1dFN0cmVhbSogYW9zID0gYW9zdy5DcmVhdGUoNDQxMDAsIDQ0MSk7Ci0gIEVYUEVDVF9GQUxTRShhb3MtPk9wZW4oKSk7Ci0gIGFvcy0+Q2xvc2UoKTsKLQotICAvLyAxMC4xNTg3bXMgQCA0NC4xa0h6IHNoYWxsIHdvcmsgKHNlZSB0ZXN0IGFib3ZlKS4KLSAgYW9zID0gYW9zdy5DcmVhdGUoNDQxMDAsIDQ0OCk7Ci0gIEVYUEVDVF9UUlVFKGFvcy0+T3BlbigpKTsKLSAgYW9zLT5DbG9zZSgpOwotCi0gIC8vIDUuODA1MG1zIEAgNDQuMSBzaG91bGQgd29yay4KLSAgYW9zID0gYW9zdy5DcmVhdGUoNDQxMDAsIDI1Nik7Ci0gIEVYUEVDVF9UUlVFKGFvcy0+T3BlbigpKTsKLSAgYW9zLT5DbG9zZSgpOwotCi0gIC8vIDQuOTg4N21zIEAgNDQuMWtIeiBkb2VzIG5vdCB3b3JrIHRvIG1pc2FsaWdubWVudC4KLSAgLy8gVGhpcyB0ZXN0IHdpbGwgcHJvcG9zZSBhbiBhbGlnbmVkIGJ1ZmZlciBzaXplIG9mIDUuMDc5NG1zLgotICAvLyBOb3RlIHRoYXQgd2UgbXVzdCBjYWxsIENsb3NlKCkgZXZlbiBpcyBPcGVuKCkgZmFpbHMgc2luY2UgQ2xvc2UoKSBhbHNvCi0gIC8vIGRlbGV0ZXMgdGhlIG9iamVjdCBhbmQgd2Ugd2FudCB0byBjcmVhdGUgYSBuZXcgb2JqZWN0IGluIHRoZSBuZXh0IHRlc3QuCi0gIGFvcyA9IGFvc3cuQ3JlYXRlKDQ0MTAwLCAyMjApOwotICBFWFBFQ1RfRkFMU0UoYW9zLT5PcGVuKCkpOwotICBhb3MtPkNsb3NlKCk7Ci0KLSAgLy8gNS4wNzk0bXMgQCA0NC4xa0h6IHNoYWxsIHdvcmsgKHNlZSB0ZXN0IGFib3ZlKS4KLSAgYW9zID0gYW9zdy5DcmVhdGUoNDQxMDAsIDIyNCk7Ci0gIEVYUEVDVF9UUlVFKGFvcy0+T3BlbigpKTsKLSAgYW9zLT5DbG9zZSgpOwotCi0gIC8vIDIuOTAyNW1zIGlzIHNtYWxsZXIgdGhhbiB0aGUgbWluaW11bSBzdXBwb3J0ZWQgc2l6ZSAoPTNtcykuCi0gIGFvcyA9IGFvc3cuQ3JlYXRlKDQ0MTAwLCAxMzIpOwotICBFWFBFQ1RfRkFMU0UoYW9zLT5PcGVuKCkpOwotICBhb3MtPkNsb3NlKCk7Ci0KLSAgLy8gMy4wMTU4N21zIGlzIGxhcmdlciB0aGFuIHRoZSBtaW5pbXVtIHNpemUgYnV0IGlzIG5vdCBhbGlnbmVkLgotICAvLyBUaGlzIHRlc3Qgd2lsbCBwcm9wb3NlIGFuIGFsaWduZWQgYnVmZmVyIHNpemUgb2YgMy42MjgxbXMuCi0gIGFvcyA9IGFvc3cuQ3JlYXRlKDQ0MTAwLCAxMzMpOwotICBFWFBFQ1RfRkFMU0UoYW9zLT5PcGVuKCkpOwotICBhb3MtPkNsb3NlKCk7Ci0KLSAgLy8gMy42MjgxbXMgQCA0NC4xa0h6IDw9PiBzbWFsbGVzdCBwb3NzaWJsZSBidWZmZXIgc2l6ZSB3ZSBjYW4gdXNlLgotICBhb3MgPSBhb3N3LkNyZWF0ZSg0NDEwMCwgMTYwKTsKLSAgRVhQRUNUX1RSVUUoYW9zLT5PcGVuKCkpOwotICBhb3MtPkNsb3NlKCk7Ci19Ci0KLS8vIFZlcmlmeSB0aGF0IHdlIGNhbiBvcGVuIGFuZCBzdGFydCB0aGUgb3V0cHV0IHN0cmVhbSBpbiBleGNsdXNpdmUgbW9kZSBhdAotLy8gdGhlIGxvd2VzdCBwb3NzaWJsZSBkZWxheSBhdCA0OGtIei4KLVRFU1QoV0FTQVBJQXVkaW9PdXRwdXRTdHJlYW1UZXN0LCBFeGNsdXNpdmVNb2RlTWluQnVmZmVyU2l6ZUF0NDhrSHopIHsKLSAgaWYgKCFFeGNsdXNpdmVNb2RlSXNFbmFibGVkKCkpCi0gICAgcmV0dXJuOwotCi0gIHNjb3BlZF9wdHI8QXVkaW9NYW5hZ2VyPiBhdWRpb19tYW5hZ2VyKEF1ZGlvTWFuYWdlcjo6Q3JlYXRlKCkpOwotICBpZiAoIUNhblJ1bkF1ZGlvVGVzdHMoYXVkaW9fbWFuYWdlci5nZXQoKSkpCi0gICAgcmV0dXJuOwotCi0gIE1lc3NhZ2VMb29wRm9yVUkgbG9vcDsKLSAgTW9ja0F1ZGlvU291cmNlQ2FsbGJhY2sgc291cmNlOwotCi0gIC8vIENyZWF0ZSBleGNsdXNpdmUtbW9kZSBXQVNBUEkgb3V0cHV0IHN0cmVhbSB3aGljaCBwbGF5cyBvdXQgaW4gc3RlcmVvCi0gIC8vIHVzaW5nIHRoZSBtaW5pbXVtIGJ1ZmZlciBzaXplIGF0IDQ4a0h6IHNhbXBsZSByYXRlLgotICBBdWRpb091dHB1dFN0cmVhbVdyYXBwZXIgYW9zdyhhdWRpb19tYW5hZ2VyLmdldCgpKTsKLSAgQXVkaW9PdXRwdXRTdHJlYW0qIGFvcyA9IGFvc3cuQ3JlYXRlKDQ4MDAwLCAxNjApOwotICBFWFBFQ1RfVFJVRShhb3MtPk9wZW4oKSk7Ci0KLSAgLy8gRGVyaXZlIHRoZSBleHBlY3RlZCBzaXplIGluIGJ5dGVzIG9mIGVhY2ggcGFja2V0LgotICB1aW50MzIgYnl0ZXNfcGVyX3BhY2tldCA9IGFvc3cuY2hhbm5lbHMoKSAqIGFvc3cuc2FtcGxlc19wZXJfcGFja2V0KCkgKgotICAgICAgKGFvc3cuYml0c19wZXJfc2FtcGxlKCkgLyA4KTsKLQotICAvLyBTZXQgdXAgZXhwZWN0ZWQgbWluaW11bSBkZWxheSBlc3RpbWF0aW9uLgotICBBdWRpb0J1ZmZlcnNTdGF0ZSBzdGF0ZSgwLCBieXRlc19wZXJfcGFja2V0KTsKLQotICAvLyBXYWl0IGZvciB0aGUgZmlyc3QgY2FsbGJhY2sgYW5kIHZlcmlmeSBpdHMgcGFyYW1ldGVycy4KLSAgRVhQRUNUX0NBTEwoc291cmNlLCBPbk1vcmVEYXRhKE5vdE51bGwoKSwgSGFzVmFsaWREZWxheShzdGF0ZSkpKQotICAgICAgLldpbGxPbmNlKERvQWxsKAotICAgICAgICAgIFF1aXRMb29wKGxvb3AubWVzc2FnZV9sb29wX3Byb3h5KCkpLAotICAgICAgICAgIFJldHVybihhb3N3LnNhbXBsZXNfcGVyX3BhY2tldCgpKSkpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKGFvc3cuc2FtcGxlc19wZXJfcGFja2V0KCkpKTsKLQotICBhb3MtPlN0YXJ0KCZzb3VyY2UpOwotICBsb29wLlBvc3REZWxheWVkVGFzayhGUk9NX0hFUkUsIE1lc3NhZ2VMb29wOjpRdWl0Q2xvc3VyZSgpLAotICAgICAgICAgICAgICAgICAgICAgICBUZXN0VGltZW91dHM6OmFjdGlvbl90aW1lb3V0KCkpOwotICBsb29wLlJ1bigpOwotICBhb3MtPlN0b3AoKTsKLSAgYW9zLT5DbG9zZSgpOwotfQotCi0vLyBWZXJpZnkgdGhhdCB3ZSBjYW4gb3BlbiBhbmQgc3RhcnQgdGhlIG91dHB1dCBzdHJlYW0gaW4gZXhjbHVzaXZlIG1vZGUgYXQKLS8vIHRoZSBsb3dlc3QgcG9zc2libGUgZGVsYXkgYXQgNDQuMWtIei4KLVRFU1QoV0FTQVBJQXVkaW9PdXRwdXRTdHJlYW1UZXN0LCBFeGNsdXNpdmVNb2RlTWluQnVmZmVyU2l6ZUF0NDRrSHopIHsKLSAgaWYgKCFFeGNsdXNpdmVNb2RlSXNFbmFibGVkKCkpCi0gICAgcmV0dXJuOwotCi0gIHNjb3BlZF9wdHI8QXVkaW9NYW5hZ2VyPiBhdWRpb19tYW5hZ2VyKEF1ZGlvTWFuYWdlcjo6Q3JlYXRlKCkpOwotICBpZiAoIUNhblJ1bkF1ZGlvVGVzdHMoYXVkaW9fbWFuYWdlci5nZXQoKSkpCi0gICAgcmV0dXJuOwotCi0gIE1lc3NhZ2VMb29wRm9yVUkgbG9vcDsKLSAgTW9ja0F1ZGlvU291cmNlQ2FsbGJhY2sgc291cmNlOwotCi0gIC8vIENyZWF0ZSBleGNsdXNpdmUtbW9kZSBXQVNBUEkgb3V0cHV0IHN0cmVhbSB3aGljaCBwbGF5cyBvdXQgaW4gc3RlcmVvCi0gIC8vIHVzaW5nIHRoZSBtaW5pbXVtIGJ1ZmZlciBzaXplIGF0IDQ0LjFrSHogc2FtcGxlIHJhdGUuCi0gIEF1ZGlvT3V0cHV0U3RyZWFtV3JhcHBlciBhb3N3KGF1ZGlvX21hbmFnZXIuZ2V0KCkpOwotICBBdWRpb091dHB1dFN0cmVhbSogYW9zID0gYW9zdy5DcmVhdGUoNDQxMDAsIDE2MCk7Ci0gIEVYUEVDVF9UUlVFKGFvcy0+T3BlbigpKTsKLQotICAvLyBEZXJpdmUgdGhlIGV4cGVjdGVkIHNpemUgaW4gYnl0ZXMgb2YgZWFjaCBwYWNrZXQuCi0gIHVpbnQzMiBieXRlc19wZXJfcGFja2V0ID0gYW9zdy5jaGFubmVscygpICogYW9zdy5zYW1wbGVzX3Blcl9wYWNrZXQoKSAqCi0gICAgICAoYW9zdy5iaXRzX3Blcl9zYW1wbGUoKSAvIDgpOwotCi0gIC8vIFNldCB1cCBleHBlY3RlZCBtaW5pbXVtIGRlbGF5IGVzdGltYXRpb24uCi0gIEF1ZGlvQnVmZmVyc1N0YXRlIHN0YXRlKDAsIGJ5dGVzX3Blcl9wYWNrZXQpOwotCi0gIC8vIFdhaXQgZm9yIHRoZSBmaXJzdCBjYWxsYmFjayBhbmQgdmVyaWZ5IGl0cyBwYXJhbWV0ZXJzLgotICBFWFBFQ1RfQ0FMTChzb3VyY2UsIE9uTW9yZURhdGEoTm90TnVsbCgpLCBIYXNWYWxpZERlbGF5KHN0YXRlKSkpCi0gICAgLldpbGxPbmNlKERvQWxsKAotICAgICAgICBRdWl0TG9vcChsb29wLm1lc3NhZ2VfbG9vcF9wcm94eSgpKSwKLSAgICAgICAgUmV0dXJuKGFvc3cuc2FtcGxlc19wZXJfcGFja2V0KCkpKSkKLSAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKGFvc3cuc2FtcGxlc19wZXJfcGFja2V0KCkpKTsKLQotICBhb3MtPlN0YXJ0KCZzb3VyY2UpOwotICBsb29wLlBvc3REZWxheWVkVGFzayhGUk9NX0hFUkUsIE1lc3NhZ2VMb29wOjpRdWl0Q2xvc3VyZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFRpbWVvdXRzOjphY3Rpb25fdGltZW91dCgpKTsKLSAgbG9vcC5SdW4oKTsKLSAgYW9zLT5TdG9wKCk7Ci0gIGFvcy0+Q2xvc2UoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vd2luL2F1ZGlvX21hbmFnZXJfd2luLmNjIGIvc3JjL21lZGlhL2F1ZGlvL3dpbi9hdWRpb19tYW5hZ2VyX3dpbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI3ODhiZi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vd2luL2F1ZGlvX21hbmFnZXJfd2luLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzc2ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19pby5oIgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPG9iamJhc2UuaD4gIC8vIFRoaXMgaGFzIHRvIGJlIGJlZm9yZSBpbml0Z3VpZC5oCi0jaW5jbHVkZSA8aW5pdGd1aWQuaD4KLSNpbmNsdWRlIDxtbXN5c3RlbS5oPgotI2luY2x1ZGUgPHNldHVwYXBpLmg+Ci0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2JpbmRfaGVscGVycy5oIgotI2luY2x1ZGUgImJhc2UvY29tbWFuZF9saW5lLmgiCi0jaW5jbHVkZSAiYmFzZS9maWxlX3BhdGguaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJiYXNlL3BhdGhfc2VydmljZS5oIgotI2luY2x1ZGUgImJhc2UvcHJvY2Vzc191dGlsLmgiCi0jaW5jbHVkZSAiYmFzZS9zdHJpbmdfbnVtYmVyX2NvbnZlcnNpb25zLmgiCi0jaW5jbHVkZSAiYmFzZS9zdHJpbmdfdXRpbC5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3V0aWwuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby93aW4vYXVkaW9fZGV2aWNlX2xpc3RlbmVyX3dpbi5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3dpbi9hdWRpb19sb3dfbGF0ZW5jeV9pbnB1dF93aW4uaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby93aW4vYXVkaW9fbG93X2xhdGVuY3lfb3V0cHV0X3dpbi5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3dpbi9hdWRpb19tYW5hZ2VyX3dpbi5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3dpbi9hdWRpb191bmlmaWVkX3dpbi5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3dpbi9jb3JlX2F1ZGlvX3V0aWxfd2luLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vd2luL2RldmljZV9lbnVtZXJhdGlvbl93aW4uaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby93aW4vd2F2ZWluX2lucHV0X3dpbi5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3dpbi93YXZlb3V0X291dHB1dF93aW4uaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2JpbmRfdG9fbG9vcC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbGltaXRzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9zd2l0Y2hlcy5oIgotCi0vLyBMaWJyYXJpZXMgcmVxdWlyZWQgZm9yIHRoZSBTZXR1cEFQSSBhbmQgV2JlbSBBUElzIHVzZWQgaGVyZS4KLSNwcmFnbWEgY29tbWVudChsaWIsICJzZXR1cGFwaS5saWIiKQotCi0vLyBUaGUgZm9sbG93aW5nIGFyZSBkZWZpbmVkIGluIHZhcmlvdXMgRERLIGhlYWRlcnMsIGFuZCB3ZSAocmUpZGVmaW5lIHRoZW0gaGVyZQotLy8gdG8gYXZvaWQgYWRkaW5nIHRoZSBEREsgYXMgYSBjaHJvbWUgZGVwZW5kZW5jeS4KLSNkZWZpbmUgRFJWX1FVRVJZREVWSUNFSU5URVJGQUNFIDB4ODBjCi0jZGVmaW5lIERSVk1fTUFQUEVSX1BSRUZFUlJFRF9HRVQgMHgyMDE1Ci0jZGVmaW5lIERSVl9RVUVSWURFVklDRUlOVEVSRkFDRVNJWkUgMHg4MGQKLURFRklORV9HVUlEKEFNX0tTQ0FURUdPUllfQVVESU8sIDB4Njk5NGFkMDQsIDB4OTNlZiwgMHgxMWQwLAotICAgICAgICAgICAgMHhhMywgMHhjYywgMHgwMCwgMHhhMCwgMHhjOSwgMHgyMiwgMHgzMSwgMHg5Nik7Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIE1heGltdW0gbnVtYmVyIG9mIG91dHB1dCBzdHJlYW1zIHRoYXQgY2FuIGJlIG9wZW4gc2ltdWx0YW5lb3VzbHkuCi1zdGF0aWMgY29uc3QgaW50IGtNYXhPdXRwdXRTdHJlYW1zID0gNTA7Ci0KLS8vIFVwIHRvIDggY2hhbm5lbHMgY2FuIGJlIHBhc3NlZCB0byB0aGUgZHJpdmVyLiAgVGhpcyBzaG91bGQgd29yaywgZ2l2ZW4gdGhlCi0vLyByaWdodCBkcml2ZXJzLCBidXQgZ3JhY2VmdWwgZXJyb3IgaGFuZGxpbmcgaXMgbmVlZGVkLgotc3RhdGljIGNvbnN0IGludCBrV2luTWF4Q2hhbm5lbHMgPSA4OwotCi0vLyBXZSB1c2UgMyBidWZmZXJzIGZvciByZWNvcmRpbmcgYXVkaW8gc28gdGhhdCBpZiBhIHJlY29yZGluZyBjYWxsYmFjayB0YWtlcwotLy8gc29tZSB0aW1lIHRvIHJldHVybiB3ZSB3b24ndCBsb3NlIGF1ZGlvLiBNb3JlIGJ1ZmZlcnMgd2hpbGUgcmVjb3JkaW5nIGFyZQotLy8gb2sgYmVjYXVzZSB0aGV5IGRvbid0IGludHJvZHVjZSBhbnkgZGVsYXkgaW4gcmVjb3JkaW5nLCB1bmxpa2UgaW4gcGxheWJhY2sKLS8vIHdoZXJlIHlvdSBmaXJzdCBuZWVkIHRvIGZpbGwgaW4gdGhhdCBudW1iZXIgb2YgYnVmZmVycyBiZWZvcmUgc3RhcnRpbmcgdG8KLS8vIHBsYXkuCi1zdGF0aWMgY29uc3QgaW50IGtOdW1JbnB1dEJ1ZmZlcnMgPSAzOwotCi1zdGF0aWMgaW50IEdldFZlcnNpb25QYXJ0QXNJbnQoRFdPUkRMT05HIG51bSkgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihudW0gJiAweGZmZmYpOwotfQotCi0vLyBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGRldmljZSdzIGRlc2NyaXB0aW9uIGFuZCBpbnN0YWxsZWQKLS8vIGRyaXZlciB2ZXJzaW9uLgotc3RhdGljIHN0cmluZzE2IEdldERldmljZUFuZERyaXZlckluZm8oSERFVklORk8gZGV2aWNlX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUF9ERVZJTkZPX0RBVEEqIGRldmljZV9kYXRhKSB7Ci0gIC8vIFNhdmUgdGhlIG9sZCBpbnN0YWxsIHBhcmFtcyBzZXR0aW5nIGFuZCBzZXQgYSBmbGFnIGZvciB0aGUKLSAgLy8gU2V0dXBEaUJ1aWxkRHJpdmVySW5mb0xpc3QgYmVsb3cgdG8gcmV0dXJuIG9ubHkgdGhlIGluc3RhbGxlZCBkcml2ZXJzLgotICBTUF9ERVZJTlNUQUxMX1BBUkFNUyBvbGRfZGV2aWNlX2luc3RhbGxfcGFyYW1zOwotICBvbGRfZGV2aWNlX2luc3RhbGxfcGFyYW1zLmNiU2l6ZSA9IHNpemVvZihvbGRfZGV2aWNlX2luc3RhbGxfcGFyYW1zKTsKLSAgU2V0dXBEaUdldERldmljZUluc3RhbGxQYXJhbXMoZGV2aWNlX2luZm8sIGRldmljZV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2xkX2RldmljZV9pbnN0YWxsX3BhcmFtcyk7Ci0gIFNQX0RFVklOU1RBTExfUEFSQU1TIGRldmljZV9pbnN0YWxsX3BhcmFtcyA9IG9sZF9kZXZpY2VfaW5zdGFsbF9wYXJhbXM7Ci0gIGRldmljZV9pbnN0YWxsX3BhcmFtcy5GbGFnc0V4IHw9IERJX0ZMQUdTRVhfSU5TVEFMTEVERFJJVkVSOwotICBTZXR1cERpU2V0RGV2aWNlSW5zdGFsbFBhcmFtcyhkZXZpY2VfaW5mbywgZGV2aWNlX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VfaW5zdGFsbF9wYXJhbXMpOwotCi0gIFNQX0RSVklORk9fREFUQSBkcml2ZXJfZGF0YTsKLSAgZHJpdmVyX2RhdGEuY2JTaXplID0gc2l6ZW9mKGRyaXZlcl9kYXRhKTsKLSAgc3RyaW5nMTYgZGV2aWNlX2FuZF9kcml2ZXJfaW5mbzsKLSAgaWYgKFNldHVwRGlCdWlsZERyaXZlckluZm9MaXN0KGRldmljZV9pbmZvLCBkZXZpY2VfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQRElUX0NPTVBBVERSSVZFUikpIHsKLSAgICBpZiAoU2V0dXBEaUVudW1Ecml2ZXJJbmZvKGRldmljZV9pbmZvLCBkZXZpY2VfZGF0YSwgU1BESVRfQ09NUEFURFJJVkVSLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRyaXZlcl9kYXRhKSkgewotICAgICAgRFdPUkRMT05HIHZlcnNpb24gPSBkcml2ZXJfZGF0YS5Ecml2ZXJWZXJzaW9uOwotICAgICAgZGV2aWNlX2FuZF9kcml2ZXJfaW5mbyA9IHN0cmluZzE2KGRyaXZlcl9kYXRhLkRlc2NyaXB0aW9uKSArIEwiIHYiICsKLSAgICAgICAgICBiYXNlOjpJbnRUb1N0cmluZzE2KEdldFZlcnNpb25QYXJ0QXNJbnQoKHZlcnNpb24gPj4gNDgpKSkgKyBMIi4iICsKLSAgICAgICAgICBiYXNlOjpJbnRUb1N0cmluZzE2KEdldFZlcnNpb25QYXJ0QXNJbnQoKHZlcnNpb24gPj4gMzIpKSkgKyBMIi4iICsKLSAgICAgICAgICBiYXNlOjpJbnRUb1N0cmluZzE2KEdldFZlcnNpb25QYXJ0QXNJbnQoKHZlcnNpb24gPj4gMTYpKSkgKyBMIi4iICsKLSAgICAgICAgICBiYXNlOjpJbnRUb1N0cmluZzE2KEdldFZlcnNpb25QYXJ0QXNJbnQodmVyc2lvbikpOwotICAgIH0KLSAgICBTZXR1cERpRGVzdHJveURyaXZlckluZm9MaXN0KGRldmljZV9pbmZvLCBkZXZpY2VfZGF0YSwgU1BESVRfQ09NUEFURFJJVkVSKTsKLSAgfQotCi0gIFNldHVwRGlTZXREZXZpY2VJbnN0YWxsUGFyYW1zKGRldmljZV9pbmZvLCBkZXZpY2VfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9sZF9kZXZpY2VfaW5zdGFsbF9wYXJhbXMpOwotCi0gIHJldHVybiBkZXZpY2VfYW5kX2RyaXZlcl9pbmZvOwotfQotCi1BdWRpb01hbmFnZXJXaW46OkF1ZGlvTWFuYWdlcldpbigpIHsKLSAgaWYgKCFDb3JlQXVkaW9VdGlsOjpJc1N1cHBvcnRlZCgpKSB7Ci0gICAgLy8gVXNlIHRoZSBXYXZlIEFQSSBmb3IgZGV2aWNlIGVudW1lcmF0aW9uIGlmIFhQIG9yIGxvd2VyLgotICAgIGVudW1lcmF0aW9uX3R5cGVfID0ga1dhdmVFbnVtZXJhdGlvbjsKLSAgfSBlbHNlIHsKLSAgICAvLyBVc2UgdGhlIE1NRGV2aWNlIEFQSSBmb3IgZGV2aWNlIGVudW1lcmF0aW9uIGlmIFZpc3RhIG9yIGhpZ2hlci4KLSAgICBlbnVtZXJhdGlvbl90eXBlXyA9IGtNTURldmljZUVudW1lcmF0aW9uOwotICB9Ci0KLSAgU2V0TWF4T3V0cHV0U3RyZWFtc0FsbG93ZWQoa01heE91dHB1dFN0cmVhbXMpOwotCi0gIC8vIFRhc2sgbXVzdCBiZSBwb3N0ZWQgbGFzdCB0byBhdm9pZCByYWNlcyBmcm9tIGhhbmRpbmcgb3V0ICJ0aGlzIiB0byB0aGUKLSAgLy8gYXVkaW8gdGhyZWFkLgotICBHZXRNZXNzYWdlTG9vcCgpLT5Qb3N0VGFzayhGUk9NX0hFUkUsIGJhc2U6OkJpbmQoCi0gICAgICAmQXVkaW9NYW5hZ2VyV2luOjpDcmVhdGVEZXZpY2VMaXN0ZW5lciwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotfQotCi1BdWRpb01hbmFnZXJXaW46On5BdWRpb01hbmFnZXJXaW4oKSB7Ci0gIC8vIEl0J3Mgc2FmZSB0byBwb3N0IGEgdGFzayBoZXJlIHNpbmNlIFNodXRkb3duKCkgd2lsbCB3YWl0IGZvciBhbGwgdGFza3MgdG8KLSAgLy8gY29tcGxldGUgYmVmb3JlIHJldHVybmluZy4KLSAgR2V0TWVzc2FnZUxvb3AoKS0+UG9zdFRhc2soRlJPTV9IRVJFLCBiYXNlOjpCaW5kKAotICAgICAgJkF1ZGlvTWFuYWdlcldpbjo6RGVzdHJveURldmljZUxpc3RlbmVyLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gIFNodXRkb3duKCk7Ci19Ci0KLWJvb2wgQXVkaW9NYW5hZ2VyV2luOjpIYXNBdWRpb091dHB1dERldmljZXMoKSB7Ci0gIHJldHVybiAoOjp3YXZlT3V0R2V0TnVtRGV2cygpICE9IDApOwotfQotCi1ib29sIEF1ZGlvTWFuYWdlcldpbjo6SGFzQXVkaW9JbnB1dERldmljZXMoKSB7Ci0gIHJldHVybiAoOjp3YXZlSW5HZXROdW1EZXZzKCkgIT0gMCk7Ci19Ci0KLXZvaWQgQXVkaW9NYW5hZ2VyV2luOjpDcmVhdGVEZXZpY2VMaXN0ZW5lcigpIHsKLSAgLy8gQXVkaW9EZXZpY2VMaXN0ZW5lcldpbiBtdXN0IGJlIGluaXRpYWxpemVkIG9uIGEgQ09NIHRocmVhZCBhbmQgc2hvdWxkIG9ubHkKLSAgLy8gYmUgdXNlZCBpZiBXQVNBUEkgLyBDb3JlIEF1ZGlvIGlzIHN1cHBvcnRlZC4KLSAgaWYgKENvcmVBdWRpb1V0aWw6OklzU3VwcG9ydGVkKCkpIHsKLSAgICBvdXRwdXRfZGV2aWNlX2xpc3RlbmVyXy5yZXNldChuZXcgQXVkaW9EZXZpY2VMaXN0ZW5lcldpbihCaW5kVG9Mb29wKAotICAgICAgICBHZXRNZXNzYWdlTG9vcCgpLCBiYXNlOjpCaW5kKAotICAgICAgICAgICAgJkF1ZGlvTWFuYWdlcldpbjo6Tm90aWZ5QWxsT3V0cHV0RGV2aWNlQ2hhbmdlTGlzdGVuZXJzLAotICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpKSk7Ci0gIH0KLX0KLQotdm9pZCBBdWRpb01hbmFnZXJXaW46OkRlc3Ryb3lEZXZpY2VMaXN0ZW5lcigpIHsKLSAgb3V0cHV0X2RldmljZV9saXN0ZW5lcl8ucmVzZXQoKTsKLX0KLQotc3RyaW5nMTYgQXVkaW9NYW5hZ2VyV2luOjpHZXRBdWRpb0lucHV0RGV2aWNlTW9kZWwoKSB7Ci0gIC8vIEdldCB0aGUgZGVmYXVsdCBhdWRpbyBjYXB0dXJlIGRldmljZSBhbmQgaXRzIGRldmljZSBpbnRlcmZhY2UgbmFtZS4KLSAgRFdPUkQgZGV2aWNlX2lkID0gMDsKLSAgd2F2ZUluTWVzc2FnZShyZWludGVycHJldF9jYXN0PEhXQVZFSU4+KFdBVkVfTUFQUEVSKSwKLSAgICAgICAgICAgICAgICBEUlZNX01BUFBFUl9QUkVGRVJSRURfR0VULAotICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8RFdPUkRfUFRSPigmZGV2aWNlX2lkKSwgTlVMTCk7Ci0gIFVMT05HIGRldmljZV9pbnRlcmZhY2VfbmFtZV9zaXplID0gMDsKLSAgd2F2ZUluTWVzc2FnZShyZWludGVycHJldF9jYXN0PEhXQVZFSU4+KGRldmljZV9pZCksCi0gICAgICAgICAgICAgICAgRFJWX1FVRVJZREVWSUNFSU5URVJGQUNFU0laRSwKLSAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PERXT1JEX1BUUj4oJmRldmljZV9pbnRlcmZhY2VfbmFtZV9zaXplKSwgMCk7Ci0gIHNpemVfdCBieXRlc19pbl9jaGFyMTYgPSBzaXplb2Yoc3RyaW5nMTY6OnZhbHVlX3R5cGUpOwotICBEQ0hFQ0tfRVEoMHUsIGRldmljZV9pbnRlcmZhY2VfbmFtZV9zaXplICUgYnl0ZXNfaW5fY2hhcjE2KTsKLSAgaWYgKGRldmljZV9pbnRlcmZhY2VfbmFtZV9zaXplIDw9IGJ5dGVzX2luX2NoYXIxNikKLSAgICByZXR1cm4gc3RyaW5nMTYoKTsgIC8vIE5vIGF1ZGlvIGNhcHR1cmUgZGV2aWNlLgotCi0gIHN0cmluZzE2IGRldmljZV9pbnRlcmZhY2VfbmFtZTsKLSAgc3RyaW5nMTY6OnZhbHVlX3R5cGUqIG5hbWVfcHRyID0gV3JpdGVJbnRvKCZkZXZpY2VfaW50ZXJmYWNlX25hbWUsCi0gICAgICBkZXZpY2VfaW50ZXJmYWNlX25hbWVfc2l6ZSAvIGJ5dGVzX2luX2NoYXIxNik7Ci0gIHdhdmVJbk1lc3NhZ2UocmVpbnRlcnByZXRfY2FzdDxIV0FWRUlOPihkZXZpY2VfaWQpLAotICAgICAgICAgICAgICAgIERSVl9RVUVSWURFVklDRUlOVEVSRkFDRSwKLSAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PERXT1JEX1BUUj4obmFtZV9wdHIpLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PERXT1JEX1BUUj4oZGV2aWNlX2ludGVyZmFjZV9uYW1lX3NpemUpKTsKLQotICAvLyBFbnVtZXJhdGUgYWxsIGF1ZGlvIGRldmljZXMgYW5kIGZpbmQgdGhlIG9uZSBtYXRjaGluZyB0aGUgYWJvdmUgZGV2aWNlCi0gIC8vIGludGVyZmFjZSBuYW1lLgotICBIREVWSU5GTyBkZXZpY2VfaW5mbyA9IFNldHVwRGlHZXRDbGFzc0RldnMoCi0gICAgICAmQU1fS1NDQVRFR09SWV9BVURJTywgMCwgMCwgRElHQ0ZfREVWSUNFSU5URVJGQUNFIHwgRElHQ0ZfUFJFU0VOVCk7Ci0gIGlmIChkZXZpY2VfaW5mbyA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKLSAgICByZXR1cm4gc3RyaW5nMTYoKTsKLQotICBEV09SRCBpbnRlcmZhY2VfaW5kZXggPSAwOwotICBTUF9ERVZJQ0VfSU5URVJGQUNFX0RBVEEgaW50ZXJmYWNlX2RhdGE7Ci0gIGludGVyZmFjZV9kYXRhLmNiU2l6ZSA9IHNpemVvZihpbnRlcmZhY2VfZGF0YSk7Ci0gIHdoaWxlIChTZXR1cERpRW51bURldmljZUludGVyZmFjZXMoZGV2aWNlX2luZm8sIDAsICZBTV9LU0NBVEVHT1JZX0FVRElPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9pbmRleCsrLCAmaW50ZXJmYWNlX2RhdGEpKSB7Ci0gICAgLy8gUXVlcnkgdGhlIHNpemUgb2YgdGhlIHN0cnVjdCwgYWxsb2NhdGUgaXQgYW5kIHRoZW4gcXVlcnkgdGhlIGRhdGEuCi0gICAgU1BfREVWSU5GT19EQVRBIGRldmljZV9kYXRhOwotICAgIGRldmljZV9kYXRhLmNiU2l6ZSA9IHNpemVvZihkZXZpY2VfZGF0YSk7Ci0gICAgRFdPUkQgaW50ZXJmYWNlX2RldGFpbF9zaXplID0gMDsKLSAgICBTZXR1cERpR2V0RGV2aWNlSW50ZXJmYWNlRGV0YWlsKGRldmljZV9pbmZvLCAmaW50ZXJmYWNlX2RhdGEsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJmYWNlX2RldGFpbF9zaXplLCAmZGV2aWNlX2RhdGEpOwotICAgIGlmICghaW50ZXJmYWNlX2RldGFpbF9zaXplKQotICAgICAgY29udGludWU7Ci0KLSAgICBzY29wZWRfYXJyYXk8Y2hhcj4gaW50ZXJmYWNlX2RldGFpbF9idWZmZXIobmV3IGNoYXJbaW50ZXJmYWNlX2RldGFpbF9zaXplXSk7Ci0gICAgU1BfREVWSUNFX0lOVEVSRkFDRV9ERVRBSUxfREFUQSogaW50ZXJmYWNlX2RldGFpbCA9Ci0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8U1BfREVWSUNFX0lOVEVSRkFDRV9ERVRBSUxfREFUQSo+KAotICAgICAgICAgICAgaW50ZXJmYWNlX2RldGFpbF9idWZmZXIuZ2V0KCkpOwotICAgIGludGVyZmFjZV9kZXRhaWwtPmNiU2l6ZSA9IGludGVyZmFjZV9kZXRhaWxfc2l6ZTsKLSAgICBpZiAoIVNldHVwRGlHZXREZXZpY2VJbnRlcmZhY2VEZXRhaWwoZGV2aWNlX2luZm8sICZpbnRlcmZhY2VfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2RldGFpbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2RldGFpbF9zaXplLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlX2RhdGEpKQotICAgICAgcmV0dXJuIHN0cmluZzE2KCk7Ci0KLSAgICBib29sIGRldmljZV9mb3VuZCA9IChkZXZpY2VfaW50ZXJmYWNlX25hbWUgPT0gaW50ZXJmYWNlX2RldGFpbC0+RGV2aWNlUGF0aCk7Ci0KLSAgICBpZiAoZGV2aWNlX2ZvdW5kKQotICAgICAgcmV0dXJuIEdldERldmljZUFuZERyaXZlckluZm8oZGV2aWNlX2luZm8sICZkZXZpY2VfZGF0YSk7Ci0gIH0KLQotICByZXR1cm4gc3RyaW5nMTYoKTsKLX0KLQotYm9vbCBBdWRpb01hbmFnZXJXaW46OkNhblNob3dBdWRpb0lucHV0U2V0dGluZ3MoKSB7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEF1ZGlvTWFuYWdlcldpbjo6U2hvd0F1ZGlvSW5wdXRTZXR0aW5ncygpIHsKLSAgc3RkOjp3c3RyaW5nIHByb2dyYW07Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50OwotICBpZiAoIUNvcmVBdWRpb1V0aWw6OklzU3VwcG9ydGVkKCkpIHsKLSAgICBwcm9ncmFtID0gTCJzbmR2b2wzMi5leGUiOwotICAgIGFyZ3VtZW50ID0gIi1SIjsKLSAgfSBlbHNlIHsKLSAgICBwcm9ncmFtID0gTCJjb250cm9sLmV4ZSI7Ci0gICAgYXJndW1lbnQgPSAibW1zeXMuY3BsLCwxIjsKLSAgfQotCi0gIEZpbGVQYXRoIHBhdGg7Ci0gIFBhdGhTZXJ2aWNlOjpHZXQoYmFzZTo6RElSX1NZU1RFTSwgJnBhdGgpOwotICBwYXRoID0gcGF0aC5BcHBlbmQocHJvZ3JhbSk7Ci0gIENvbW1hbmRMaW5lIGNvbW1hbmRfbGluZShwYXRoKTsKLSAgY29tbWFuZF9saW5lLkFwcGVuZEFyZyhhcmd1bWVudCk7Ci0gIGJhc2U6OkxhdW5jaFByb2Nlc3MoY29tbWFuZF9saW5lLCBiYXNlOjpMYXVuY2hPcHRpb25zKCksIE5VTEwpOwotfQotCi12b2lkIEF1ZGlvTWFuYWdlcldpbjo6R2V0QXVkaW9JbnB1dERldmljZU5hbWVzKAotICAgIG1lZGlhOjpBdWRpb0RldmljZU5hbWVzKiBkZXZpY2VfbmFtZXMpIHsKLSAgRENIRUNLKGVudW1lcmF0aW9uX3R5cGUoKSAhPSAga1VuaW5pdGlhbGl6ZWRFbnVtZXJhdGlvbik7Ci0gIC8vIEVudW1lcmF0ZSBhbGwgYWN0aXZlIGF1ZGlvLWVuZHBvaW50IGNhcHR1cmUgZGV2aWNlcy4KLSAgaWYgKGVudW1lcmF0aW9uX3R5cGUoKSA9PSBrV2F2ZUVudW1lcmF0aW9uKSB7Ci0gICAgLy8gVXRpbGl6ZSB0aGUgV2F2ZSBBUEkgZm9yIFdpbmRvd3MgWFAuCi0gICAgbWVkaWE6OkdldElucHV0RGV2aWNlTmFtZXNXaW5YUChkZXZpY2VfbmFtZXMpOwotICB9IGVsc2UgewotICAgIC8vIFV0aWxpemUgdGhlIE1NRGV2aWNlIEFQSSAocGFydCBvZiBDb3JlIEF1ZGlvKSBmb3IgVmlzdGEgYW5kIGhpZ2hlci4KLSAgICBtZWRpYTo6R2V0SW5wdXREZXZpY2VOYW1lc1dpbihkZXZpY2VfbmFtZXMpOwotICB9Ci0KLSAgLy8gQWx3YXlzIGFkZCBkZWZhdWx0IGRldmljZSBwYXJhbWV0ZXJzIGFzIGZpcnN0IGVsZW1lbnQuCi0gIGlmICghZGV2aWNlX25hbWVzLT5lbXB0eSgpKSB7Ci0gICAgbWVkaWE6OkF1ZGlvRGV2aWNlTmFtZSBuYW1lOwotICAgIG5hbWUuZGV2aWNlX25hbWUgPSBBdWRpb01hbmFnZXJCYXNlOjprRGVmYXVsdERldmljZU5hbWU7Ci0gICAgbmFtZS51bmlxdWVfaWQgPSBBdWRpb01hbmFnZXJCYXNlOjprRGVmYXVsdERldmljZUlkOwotICAgIGRldmljZV9uYW1lcy0+cHVzaF9mcm9udChuYW1lKTsKLSAgfQotfQotCi0vLyBGYWN0b3J5IGZvciB0aGUgaW1wbGVtZW50YXRpb25zIG9mIEF1ZGlvT3V0cHV0U3RyZWFtIGZvciBBVURJT19QQ01fTElORUFSCi0vLyBtb2RlLgotLy8gLSBQQ01XYXZlT3V0QXVkaW9PdXRwdXRTdHJlYW06IEJhc2VkIG9uIHRoZSB3YXZlT3V0IEFQSS4KLUF1ZGlvT3V0cHV0U3RyZWFtKiBBdWRpb01hbmFnZXJXaW46Ok1ha2VMaW5lYXJPdXRwdXRTdHJlYW0oCi0gICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpIHsKLSAgRENIRUNLX0VRKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xJTkVBUiwgcGFyYW1zLmZvcm1hdCgpKTsKLSAgaWYgKHBhcmFtcy5jaGFubmVscygpID4ga1dpbk1heENoYW5uZWxzKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJldHVybiBuZXcgUENNV2F2ZU91dEF1ZGlvT3V0cHV0U3RyZWFtKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6Ok51bWJlck9mV2F2ZU91dEJ1ZmZlcnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0FWRV9NQVBQRVIpOwotfQotCi0vLyBGYWN0b3J5IGZvciB0aGUgaW1wbGVtZW50YXRpb25zIG9mIEF1ZGlvT3V0cHV0U3RyZWFtIGZvcgotLy8gQVVESU9fUENNX0xPV19MQVRFTkNZIG1vZGUuIFR3byBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIHN1ZmZpY2UgbW9zdAotLy8gd2luZG93cyB1c2VyJ3MgbmVlZHMuCi0vLyAtIFBDTVdhdmVPdXRBdWRpb091dHB1dFN0cmVhbTogQmFzZWQgb24gdGhlIHdhdmVPdXQgQVBJLgotLy8gLSBXQVNBUElBdWRpb091dHB1dFN0cmVhbTogQmFzZWQgb24gQ29yZSBBdWRpbyAoV0FTQVBJKSBBUEkuCi1BdWRpb091dHB1dFN0cmVhbSogQXVkaW9NYW5hZ2VyV2luOjpNYWtlTG93TGF0ZW5jeU91dHB1dFN0cmVhbSgKLSAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcykgewotICBEQ0hFQ0tfRVEoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTE9XX0xBVEVOQ1ksIHBhcmFtcy5mb3JtYXQoKSk7Ci0gIGlmIChwYXJhbXMuY2hhbm5lbHMoKSA+IGtXaW5NYXhDaGFubmVscykKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoIUNvcmVBdWRpb1V0aWw6OklzU3VwcG9ydGVkKCkpIHsKLSAgICAvLyBGYWxsIGJhY2sgdG8gV2luZG93cyBXYXZlIGltcGxlbWVudGF0aW9uIG9uIFdpbmRvd3MgWFAgb3IgbG93ZXIuCi0gICAgRFZMT0coMSkgPDwgIlVzaW5nIFdhdmVPdXQgc2luY2UgV0FTQVBJIHJlcXVpcmVzIGF0IGxlYXN0IFZpc3RhLiI7Ci0gICAgcmV0dXJuIG5ldyBQQ01XYXZlT3V0QXVkaW9PdXRwdXRTdHJlYW0odGhpcywgcGFyYW1zLCAyLCBXQVZFX01BUFBFUik7Ci0gIH0KLQotICAvLyBUT0RPKGhlbnJpa2EpOiByZW1vdmUgb25jZSB3ZSBwcm9wZXJseSBoYW5kbGUgaW5wdXQgZGV2aWNlIHNlbGVjdGlvbi4KLSAgaWYgKENvbW1hbmRMaW5lOjpGb3JDdXJyZW50UHJvY2VzcygpLT5IYXNTd2l0Y2goCi0gICAgICAgICAgc3dpdGNoZXM6OmtFbmFibGVXZWJBdWRpb0lucHV0KSkgewotICAgIGlmIChXQVNBUElVbmlmaWVkU3RyZWFtOjpIYXNVbmlmaWVkRGVmYXVsdElPKCkpIHsKLSAgICAgIERWTE9HKDEpIDw8ICJXQVNBUElVbmlmaWVkU3RyZWFtIGlzIGNyZWF0ZWQuIjsKLSAgICAgIHJldHVybiBuZXcgV0FTQVBJVW5pZmllZFN0cmVhbSh0aGlzLCBwYXJhbXMpOwotICAgIH0KLSAgICBMT0coV0FSTklORykgPDwgIlVuaWZpZWQgYXVkaW8gSS9PIGlzIG5vdCBzdXBwb3J0ZWQuIjsKLSAgfQotCi0gIHJldHVybiBuZXcgV0FTQVBJQXVkaW9PdXRwdXRTdHJlYW0odGhpcywgcGFyYW1zLCBlQ29uc29sZSk7Ci19Ci0KLS8vIEZhY3RvcnkgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgQXVkaW9JbnB1dFN0cmVhbSBmb3IgQVVESU9fUENNX0xJTkVBUgotLy8gbW9kZS4KLUF1ZGlvSW5wdXRTdHJlYW0qIEF1ZGlvTWFuYWdlcldpbjo6TWFrZUxpbmVhcklucHV0U3RyZWFtKAotICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2lkKSB7Ci0gIERDSEVDS19FUShBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIsIHBhcmFtcy5mb3JtYXQoKSk7Ci0gIHJldHVybiBDcmVhdGVQQ01XYXZlSW5BdWRpb0lucHV0U3RyZWFtKHBhcmFtcywgZGV2aWNlX2lkKTsKLX0KLQotLy8gRmFjdG9yeSBmb3IgdGhlIGltcGxlbWVudGF0aW9ucyBvZiBBdWRpb0lucHV0U3RyZWFtIGZvcgotLy8gQVVESU9fUENNX0xPV19MQVRFTkNZIG1vZGUuCi1BdWRpb0lucHV0U3RyZWFtKiBBdWRpb01hbmFnZXJXaW46Ok1ha2VMb3dMYXRlbmN5SW5wdXRTdHJlYW0oCi0gICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfaWQpIHsKLSAgRENIRUNLX0VRKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xPV19MQVRFTkNZLCBwYXJhbXMuZm9ybWF0KCkpOwotICBBdWRpb0lucHV0U3RyZWFtKiBzdHJlYW0gPSBOVUxMOwotICBpZiAoIUNvcmVBdWRpb1V0aWw6OklzU3VwcG9ydGVkKCkpIHsKLSAgICAvLyBGYWxsIGJhY2sgdG8gV2luZG93cyBXYXZlIGltcGxlbWVudGF0aW9uIG9uIFdpbmRvd3MgWFAgb3IgbG93ZXIuCi0gICAgRFZMT0coMSkgPDwgIlVzaW5nIFdhdmVJbiBzaW5jZSBXQVNBUEkgcmVxdWlyZXMgYXQgbGVhc3QgVmlzdGEuIjsKLSAgICBzdHJlYW0gPSBDcmVhdGVQQ01XYXZlSW5BdWRpb0lucHV0U3RyZWFtKHBhcmFtcywgZGV2aWNlX2lkKTsKLSAgfSBlbHNlIHsKLSAgICBzdHJlYW0gPSBuZXcgV0FTQVBJQXVkaW9JbnB1dFN0cmVhbSh0aGlzLCBwYXJhbXMsIGRldmljZV9pZCk7Ci0gIH0KLQotICByZXR1cm4gc3RyZWFtOwotfQotCi1BdWRpb0lucHV0U3RyZWFtKiBBdWRpb01hbmFnZXJXaW46OkNyZWF0ZVBDTVdhdmVJbkF1ZGlvSW5wdXRTdHJlYW0oCi0gICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCkgewotICBzdGQ6OnN0cmluZyB4cF9kZXZpY2VfaWQgPSBkZXZpY2VfaWQ7Ci0gIGlmIChkZXZpY2VfaWQgIT0gQXVkaW9NYW5hZ2VyQmFzZTo6a0RlZmF1bHREZXZpY2VJZCAmJgotICAgICAgZW51bWVyYXRpb25fdHlwZV8gPT0ga01NRGV2aWNlRW51bWVyYXRpb24pIHsKLSAgICB4cF9kZXZpY2VfaWQgPSBtZWRpYTo6Q29udmVydFRvV2luWFBEZXZpY2VJZChkZXZpY2VfaWQpOwotICAgIGlmICh4cF9kZXZpY2VfaWQuZW1wdHkoKSkgewotICAgICAgRExPRyhFUlJPUikgPDwgIkNhbm5vdCBmaW5kIGEgd2F2ZUluIGRldmljZSB3aGljaCBtYXRjaGVzIHRoZSBkZXZpY2UgSUQgIgotICAgICAgICAgICAgICAgICAgPDwgZGV2aWNlX2lkOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIG5ldyBQQ01XYXZlSW5BdWRpb0lucHV0U3RyZWFtKHRoaXMsIHBhcmFtcywga051bUlucHV0QnVmZmVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwX2RldmljZV9pZCk7Ci19Ci0KLS8vLyBzdGF0aWMKLUF1ZGlvTWFuYWdlciogQ3JlYXRlQXVkaW9NYW5hZ2VyKCkgewotICByZXR1cm4gbmV3IEF1ZGlvTWFuYWdlcldpbigpOwotfQotCi1BdWRpb1BhcmFtZXRlcnMgQXVkaW9NYW5hZ2VyV2luOjpHZXRQcmVmZXJyZWRMb3dMYXRlbmN5T3V0cHV0U3RyZWFtUGFyYW1ldGVycygKLSAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIGlucHV0X3BhcmFtcykgewotICAvLyBJZiBXQVNBUEkgaXNuJ3Qgc3VwcG9ydGVkIHdlJ2xsIGZhbGxiYWNrIHRvIFdhdmVPdXQsIHdoaWNoIHdpbGwgdGFrZSBjYXJlCi0gIC8vIG9mIHJlc2FtcGxpbmcgYW5kIGJpdHMgcGVyIHNhbXBsZSBjaGFuZ2VzLiAgQnkgc2V0dGluZyB0aGVzZSBlcXVhbCB0byB0aGUKLSAgLy8gaW5wdXQgdmFsdWVzLCBBdWRpb091dHB1dFJlc2FtcGxlciB3aWxsIHNraXAgcmVzYW1wbGluZyBhbmQgYml0IHBlciBzYW1wbGUKLSAgLy8gZGlmZmVyZW5jZXMgKHNpbmNlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIHdpbGwgbWF0Y2ggdGhlIG91dHB1dCBwYXJhbWV0ZXJzKS4KLSAgaW50IHNhbXBsZV9yYXRlID0gaW5wdXRfcGFyYW1zLnNhbXBsZV9yYXRlKCk7Ci0gIGludCBiaXRzX3Blcl9zYW1wbGUgPSBpbnB1dF9wYXJhbXMuYml0c19wZXJfc2FtcGxlKCk7Ci0gIENoYW5uZWxMYXlvdXQgY2hhbm5lbF9sYXlvdXQgPSBpbnB1dF9wYXJhbXMuY2hhbm5lbF9sYXlvdXQoKTsKLSAgaWYgKENvcmVBdWRpb1V0aWw6OklzU3VwcG9ydGVkKCkpIHsKLSAgICBzYW1wbGVfcmF0ZSA9IEdldEF1ZGlvSGFyZHdhcmVTYW1wbGVSYXRlKCk7Ci0gICAgYml0c19wZXJfc2FtcGxlID0gMTY7Ci0gICAgY2hhbm5lbF9sYXlvdXQgPSBXQVNBUElBdWRpb091dHB1dFN0cmVhbTo6SGFyZHdhcmVDaGFubmVsTGF5b3V0KCk7Ci0gIH0KLQotICAvLyBUT0RPKGRhbGVjdXJ0aXMpOiBUaGlzIHNob3VsZCBpbmNsdWRlIGhhcmR3YXJlIGJpdHMgcGVyIGNoYW5uZWwgZXZlbnR1YWxseS4KLSAgcmV0dXJuIEF1ZGlvUGFyYW1ldGVycygKLSAgICAgIEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xPV19MQVRFTkNZLCBjaGFubmVsX2xheW91dCwKLSAgICAgIHNhbXBsZV9yYXRlLCBiaXRzX3Blcl9zYW1wbGUsIEdldEF1ZGlvSGFyZHdhcmVCdWZmZXJTaXplKCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby93aW4vYXVkaW9fbWFuYWdlcl93aW4uaCBiL3NyYy9tZWRpYS9hdWRpby93aW4vYXVkaW9fbWFuYWdlcl93aW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNlMmZiYy4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vd2luL2F1ZGlvX21hbmFnZXJfd2luLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0FVRElPX1dJTl9BVURJT19NQU5BR0VSX1dJTl9IXwotI2RlZmluZSBNRURJQV9BVURJT19XSU5fQVVESU9fTUFOQUdFUl9XSU5fSF8KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX21hbmFnZXJfYmFzZS5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBBdWRpb0RldmljZUxpc3RlbmVyV2luOwotCi0vLyBXaW5kb3dzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBdWRpb01hbmFnZXIgc2luZ2xldG9uLiBUaGlzIGNsYXNzIGlzIGludGVybmFsCi0vLyB0byB0aGUgYXVkaW8gb3V0cHV0IGFuZCBvbmx5IGludGVybmFsIHVzZXJzIGNhbiBjYWxsIG1ldGhvZHMgbm90IGV4cG9zZWQgYnkKLS8vIHRoZSBBdWRpb01hbmFnZXIgY2xhc3MuCi1jbGFzcyBNRURJQV9FWFBPUlQgQXVkaW9NYW5hZ2VyV2luIDogcHVibGljIEF1ZGlvTWFuYWdlckJhc2UgewotIHB1YmxpYzoKLSAgQXVkaW9NYW5hZ2VyV2luKCk7Ci0KLSAgLy8gSW1wbGVtZW50YXRpb24gb2YgQXVkaW9NYW5hZ2VyLgotICB2aXJ0dWFsIGJvb2wgSGFzQXVkaW9PdXRwdXREZXZpY2VzKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgYm9vbCBIYXNBdWRpb0lucHV0RGV2aWNlcygpIE9WRVJSSURFOwotICB2aXJ0dWFsIHN0cmluZzE2IEdldEF1ZGlvSW5wdXREZXZpY2VNb2RlbCgpIE9WRVJSSURFOwotICB2aXJ0dWFsIGJvb2wgQ2FuU2hvd0F1ZGlvSW5wdXRTZXR0aW5ncygpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU2hvd0F1ZGlvSW5wdXRTZXR0aW5ncygpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgR2V0QXVkaW9JbnB1dERldmljZU5hbWVzKG1lZGlhOjpBdWRpb0RldmljZU5hbWVzKiBkZXZpY2VfbmFtZXMpCi0gICAgICBPVkVSUklERTsKLQotICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBBdWRpb01hbmFnZXJCYXNlLgotICB2aXJ0dWFsIEF1ZGlvT3V0cHV0U3RyZWFtKiBNYWtlTGluZWFyT3V0cHV0U3RyZWFtKAotICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpIE9WRVJSSURFOwotICB2aXJ0dWFsIEF1ZGlvT3V0cHV0U3RyZWFtKiBNYWtlTG93TGF0ZW5jeU91dHB1dFN0cmVhbSgKLSAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKSBPVkVSUklERTsKLSAgdmlydHVhbCBBdWRpb0lucHV0U3RyZWFtKiBNYWtlTGluZWFySW5wdXRTdHJlYW0oCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgQXVkaW9JbnB1dFN0cmVhbSogTWFrZUxvd0xhdGVuY3lJbnB1dFN0cmVhbSgKLSAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2lkKSBPVkVSUklERTsKLSAgdmlydHVhbCBBdWRpb1BhcmFtZXRlcnMgR2V0UHJlZmVycmVkTG93TGF0ZW5jeU91dHB1dFN0cmVhbVBhcmFtZXRlcnMoCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIGlucHV0X3BhcmFtcykgT1ZFUlJJREU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgfkF1ZGlvTWFuYWdlcldpbigpOwotCi0gcHJpdmF0ZToKLSAgZW51bSBFbnVtZXJhdGlvblR5cGUgewotICAgIGtVbmluaXRpYWxpemVkRW51bWVyYXRpb24gPSAwLAotICAgIGtNTURldmljZUVudW1lcmF0aW9uLAotICAgIGtXYXZlRW51bWVyYXRpb24sCi0gIH07Ci0KLSAgLy8gQWxsb3cgdW5pdCB0ZXN0IHRvIG1vZGlmeSB0aGUgdXRpbGl6ZWQgZW51bWVyYXRpb24gQVBJLgotICBmcmllbmQgY2xhc3MgQXVkaW9JbnB1dERldmljZVRlc3Q7Ci0KLSAgRW51bWVyYXRpb25UeXBlIGVudW1lcmF0aW9uX3R5cGVfOwotICBFbnVtZXJhdGlvblR5cGUgZW51bWVyYXRpb25fdHlwZSgpIHsgcmV0dXJuIGVudW1lcmF0aW9uX3R5cGVfOyB9Ci0gIHZvaWQgU2V0RW51bWVyYXRpb25UeXBlKEVudW1lcmF0aW9uVHlwZSB0eXBlKSB7Ci0gICAgZW51bWVyYXRpb25fdHlwZV8gPSB0eXBlOwotICB9Ci0KLSAgLy8gUmV0dXJucyBhIFBDTVdhdmVJbkF1ZGlvSW5wdXRTdHJlYW0gaW5zdGFuY2Ugb3IgTlVMTCBvbiBmYWlsdXJlLgotICAvLyBUaGlzIG1ldGhvZCBjb252ZXJ0cyBNTURldmljZS1zdHlsZSBkZXZpY2UgSUQgdG8gV2F2ZUluLXN0eWxlIGRldmljZSBJRCBpZgotICAvLyBuZWNlc3NhcnkuCi0gIC8vIChQbGVhc2Ugc2VlIGRldmljZV9lbnVtZXJhdGlvbl93aW4uaCBmb3IgbW9yZSBpbmZvIGFib3V0IHRoZSB0d28ga2luZHMgb2YKLSAgLy8gZGV2aWNlIElEcy4pCi0gIEF1ZGlvSW5wdXRTdHJlYW0qIENyZWF0ZVBDTVdhdmVJbkF1ZGlvSW5wdXRTdHJlYW0oCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfaWQpOwotCi0gIC8vIEhlbHBlciBtZXRob2RzIGZvciBjb25zdHJ1Y3RpbmcgQXVkaW9EZXZpY2VMaXN0ZW5lcldpbiBvbiB0aGUgYXVkaW8gdGhyZWFkLgotICB2b2lkIENyZWF0ZURldmljZUxpc3RlbmVyKCk7Ci0gIHZvaWQgRGVzdHJveURldmljZUxpc3RlbmVyKCk7Ci0KLSAgLy8gTGlzdGVuIGZvciBvdXRwdXQgZGV2aWNlIGNoYW5nZXMuCi0gIHNjb3BlZF9wdHI8QXVkaW9EZXZpY2VMaXN0ZW5lcldpbj4gb3V0cHV0X2RldmljZV9saXN0ZW5lcl87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEF1ZGlvTWFuYWdlcldpbik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9BVURJT19XSU5fQVVESU9fTUFOQUdFUl9XSU5fSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby93aW4vYXVkaW9fb3V0cHV0X3dpbl91bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9hdWRpby93aW4vYXVkaW9fb3V0cHV0X3dpbl91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBiNGQ4MS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vd2luL2F1ZGlvX291dHB1dF93aW5fdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2OTMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDxtbXN5c3RlbS5oPgotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9iYXNlX3BhdGhzLmgiCi0jaW5jbHVkZSAiYmFzZS9maWxlX3V0aWwuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9hbGlnbmVkX21lbW9yeS5oIgotI2luY2x1ZGUgImJhc2UvcGF0aF9zZXJ2aWNlLmgiCi0jaW5jbHVkZSAiYmFzZS9zeW5jX3NvY2tldC5oIgotI2luY2x1ZGUgImJhc2Uvd2luL3Njb3BlZF9jb21faW5pdGlhbGl6ZXIuaCIKLSNpbmNsdWRlICJiYXNlL3dpbi93aW5kb3dzX3ZlcnNpb24uaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2xpbWl0cy5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX2lvLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fdXRpbC5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX21hbmFnZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9zaW1wbGVfc291cmNlcy5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi11c2luZyA6OnRlc3Rpbmc6Ol87Ci11c2luZyA6OnRlc3Rpbmc6OkFueU51bWJlcjsKLXVzaW5nIDo6dGVzdGluZzo6RG9BbGw7Ci11c2luZyA6OnRlc3Rpbmc6OkZpZWxkOwotdXNpbmcgOjp0ZXN0aW5nOjpJbnZva2U7Ci11c2luZyA6OnRlc3Rpbmc6OkluU2VxdWVuY2U7Ci11c2luZyA6OnRlc3Rpbmc6Ok5pY2VNb2NrOwotdXNpbmcgOjp0ZXN0aW5nOjpOb3ROdWxsOwotdXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47Ci0KLXVzaW5nIGJhc2U6Ondpbjo6U2NvcGVkQ09NSW5pdGlhbGl6ZXI7Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLXN0YXRpYyBjb25zdCB3Y2hhcl90IGtBdWRpb0ZpbGUxXzE2Yl9tXzE2S1tdCi0gICAgPSBMIm1lZGlhXFx0ZXN0XFxkYXRhXFxzd2VlcDAyXzE2Yl9tb25vXzE2S0h6LnJhdyI7Ci0KLS8vIFRoaXMgY2xhc3MgYWxsb3dzIHRvIGZpbmQgb3V0IGlmIHRoZSBjYWxsYmFja3MgYXJlIG9jY3VycmluZyBhcwotLy8gZXhwZWN0ZWQgYW5kIGlmIGFueSBlcnJvciBoYXMgYmVlbiByZXBvcnRlZC4KLWNsYXNzIFRlc3RTb3VyY2VCYXNpYyA6IHB1YmxpYyBBdWRpb091dHB1dFN0cmVhbTo6QXVkaW9Tb3VyY2VDYWxsYmFjayB7Ci0gcHVibGljOgotICBleHBsaWNpdCBUZXN0U291cmNlQmFzaWMoKQotICAgICAgOiBjYWxsYmFja19jb3VudF8oMCksCi0gICAgICAgIGhhZF9lcnJvcl8oMCkgewotICB9Ci0gIC8vIEF1ZGlvU291cmNlQ2FsbGJhY2s6Ok9uTW9yZURhdGEgaW1wbGVtZW50YXRpb246Ci0gIHZpcnR1YWwgaW50IE9uTW9yZURhdGEoQXVkaW9CdXMqIGF1ZGlvX2J1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlcnNTdGF0ZSBidWZmZXJzX3N0YXRlKSB7Ci0gICAgKytjYWxsYmFja19jb3VudF87Ci0gICAgLy8gVG91Y2ggdGhlIGNoYW5uZWwgbWVtb3J5IHZhbHVlIHRvIG1ha2Ugc3VyZSBtZW1vcnkgaXMgZ29vZC4KLSAgICBhdWRpb19idXMtPlplcm8oKTsKLSAgICByZXR1cm4gYXVkaW9fYnVzLT5mcmFtZXMoKTsKLSAgfQotICB2aXJ0dWFsIGludCBPbk1vcmVJT0RhdGEoQXVkaW9CdXMqIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVzKiBkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJzU3RhdGUgYnVmZmVyc19zdGF0ZSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICAvLyBBdWRpb1NvdXJjZUNhbGxiYWNrOjpPbkVycm9yIGltcGxlbWVudGF0aW9uOgotICB2aXJ0dWFsIHZvaWQgT25FcnJvcihBdWRpb091dHB1dFN0cmVhbSogc3RyZWFtLCBpbnQgY29kZSkgewotICAgICsraGFkX2Vycm9yXzsKLSAgfQotICAvLyBSZXR1cm5zIGhvdyBtYW55IHRpbWVzIE9uTW9yZURhdGEoKSBoYXMgYmVlbiBjYWxsZWQuCi0gIGludCBjYWxsYmFja19jb3VudCgpIGNvbnN0IHsKLSAgICByZXR1cm4gY2FsbGJhY2tfY291bnRfOwotICB9Ci0gIC8vIFJldHVybnMgaG93IG1hbnkgdGltZXMgdGhlIE9uRXJyb3IgY2FsbGJhY2sgd2FzIGNhbGxlZC4KLSAgaW50IGhhZF9lcnJvcigpIGNvbnN0IHsKLSAgICByZXR1cm4gaGFkX2Vycm9yXzsKLSAgfQotCi0gIHZvaWQgc2V0X2Vycm9yKGJvb2wgZXJyb3IpIHsKLSAgICBoYWRfZXJyb3JfICs9IGVycm9yID8gMSA6IDA7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGludCBjYWxsYmFja19jb3VudF87Ci0gIGludCBoYWRfZXJyb3JfOwotfTsKLQotY29uc3QgaW50IGtNYXhOdW1CdWZmZXJzID0gMzsKLS8vIFNwZWNpYWxpemVzIFRlc3RTb3VyY2VCYXNpYyB0byBzaW11bGF0ZSBhIHNvdXJjZSB0aGF0IGJsb2NrcyBmb3Igc29tZSB0aW1lCi0vLyBpbiB0aGUgT25Nb3JlRGF0YSBjYWxsYmFjay4KLWNsYXNzIFRlc3RTb3VyY2VMYWdneSA6IHB1YmxpYyBUZXN0U291cmNlQmFzaWMgewotIHB1YmxpYzoKLSAgVGVzdFNvdXJjZUxhZ2d5KGludCBsYWdneV9hZnRlcl9idWZmZXIsIGludCBsYWdfaW5fbXMpCi0gICAgICA6IGxhZ2d5X2FmdGVyX2J1ZmZlcl8obGFnZ3lfYWZ0ZXJfYnVmZmVyKSwgbGFnX2luX21zXyhsYWdfaW5fbXMpIHsKLSAgfQotICB2aXJ0dWFsIGludCBPbk1vcmVEYXRhKEF1ZGlvQnVzKiBhdWRpb19idXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJzU3RhdGUgYnVmZmVyc19zdGF0ZSkgewotICAgIC8vIENhbGwgdGhlIGJhc2UsIHdoaWNoIGluY3JlbWVudHMgdGhlIGNhbGxiYWNrX2NvdW50Xy4KLSAgICBUZXN0U291cmNlQmFzaWM6Ok9uTW9yZURhdGEoYXVkaW9fYnVzLCBidWZmZXJzX3N0YXRlKTsKLSAgICBpZiAoY2FsbGJhY2tfY291bnQoKSA+IGtNYXhOdW1CdWZmZXJzKSB7Ci0gICAgICA6OlNsZWVwKGxhZ19pbl9tc18pOwotICAgIH0KLSAgICByZXR1cm4gYXVkaW9fYnVzLT5mcmFtZXMoKTsKLSAgfQotIHByaXZhdGU6Ci0gIGludCBsYWdneV9hZnRlcl9idWZmZXJfOwotICBpbnQgbGFnX2luX21zXzsKLX07Ci0KLWNsYXNzIE1vY2tBdWRpb1NvdXJjZSA6IHB1YmxpYyBBdWRpb091dHB1dFN0cmVhbTo6QXVkaW9Tb3VyY2VDYWxsYmFjayB7Ci0gcHVibGljOgotICBNT0NLX01FVEhPRDIoT25Nb3JlRGF0YSwgaW50KEF1ZGlvQnVzKiBhdWRpb19idXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJzU3RhdGUgYnVmZmVyc19zdGF0ZSkpOwotICBNT0NLX01FVEhPRDMoT25Nb3JlSU9EYXRhLCBpbnQoQXVkaW9CdXMqIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVzKiBkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJzU3RhdGUgYnVmZmVyc19zdGF0ZSkpOwotICBNT0NLX01FVEhPRDIoT25FcnJvciwgdm9pZChBdWRpb091dHB1dFN0cmVhbSogc3RyZWFtLCBpbnQgY29kZSkpOwotCi0gIHN0YXRpYyBpbnQgQ2xlYXJEYXRhKEF1ZGlvQnVzKiBhdWRpb19idXMsIEF1ZGlvQnVmZmVyc1N0YXRlIGJ1ZmZlcnNfc3RhdGUpIHsKLSAgICBhdWRpb19idXMtPlplcm8oKTsKLSAgICByZXR1cm4gYXVkaW9fYnVzLT5mcmFtZXMoKTsKLSAgfQotfTsKLQotLy8gSGVscGVyIGNsYXNzIHRvIG1lbW9yeSBtYXAgYW4gZW50aXJlIGZpbGUuIFRoZSBtYXBwaW5nIGlzIHJlYWQtb25seS4gRG9uJ3QKLS8vIHVzZSBmb3IgZ2lnYWJ5dGUtc2l6ZWQgZmlsZXMuIEF0dGVtcHRzIHRvIHdyaXRlIHRvIHRoaXMgbWVtb3J5IGdlbmVyYXRlCi0vLyBtZW1vcnkgYWNjZXNzIHZpb2xhdGlvbnMuCi1jbGFzcyBSZWFkT25seU1hcHBlZEZpbGUgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgUmVhZE9ubHlNYXBwZWRGaWxlKGNvbnN0IHdjaGFyX3QqIGZpbGVfbmFtZSkKLSAgICAgIDogZm1hcF8oTlVMTCksIHN0YXJ0XyhOVUxMKSwgc2l6ZV8oMCkgewotICAgIEhBTkRMRSBmaWxlID0gOjpDcmVhdGVGaWxlVyhmaWxlX25hbWUsIEdFTkVSSUNfUkVBRCwgRklMRV9TSEFSRV9SRUFELCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEVOX0VYSVNUSU5HLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwsIE5VTEwpOwotICAgIGlmIChJTlZBTElEX0hBTkRMRV9WQUxVRSA9PSBmaWxlKQotICAgICAgcmV0dXJuOwotICAgIGZtYXBfID0gOjpDcmVhdGVGaWxlTWFwcGluZ1coZmlsZSwgTlVMTCwgUEFHRV9SRUFET05MWSwgMCwgMCwgTlVMTCk7Ci0gICAgOjpDbG9zZUhhbmRsZShmaWxlKTsKLSAgICBpZiAoIWZtYXBfKQotICAgICAgcmV0dXJuOwotICAgIHN0YXJ0XyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KDo6TWFwVmlld09mRmlsZShmbWFwXywgRklMRV9NQVBfUkVBRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCkpOwotICAgIGlmICghc3RhcnRfKQotICAgICAgcmV0dXJuOwotICAgIE1FTU9SWV9CQVNJQ19JTkZPUk1BVElPTiBtYmkgPSB7MH07Ci0gICAgOjpWaXJ0dWFsUXVlcnkoc3RhcnRfLCAmbWJpLCBzaXplb2YobWJpKSk7Ci0gICAgc2l6ZV8gPSBtYmkuUmVnaW9uU2l6ZTsKLSAgfQotICB+UmVhZE9ubHlNYXBwZWRGaWxlKCkgewotICAgIGlmIChzdGFydF8pIHsKLSAgICAgIDo6VW5tYXBWaWV3T2ZGaWxlKHN0YXJ0Xyk7Ci0gICAgICA6OkNsb3NlSGFuZGxlKGZtYXBfKTsKLSAgICB9Ci0gIH0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlIHdhcyBzdWNjZXNzZnVsbHkgbWFwcGVkLgotICBib29sIGlzX3ZhbGlkKCkgY29uc3QgewotICAgIHJldHVybiAoKHN0YXJ0XyA+IDApICYmIChzaXplXyA+IDApKTsKLSAgfQotICAvLyBSZXR1cm5zIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBtYXBwZWQgbWVtb3J5LgotICB1aW50MzIgc2l6ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gc2l6ZV87Ci0gIH0KLSAgLy8gUmV0dXJucyB0aGUgbWVtb3J5IGJhY2tpbmcgdGhlIGZpbGUuCi0gIGNvbnN0IHZvaWQqIEdldENodW5rQXQodWludDMyIG9mZnNldCkgewotICAgIHJldHVybiAmc3RhcnRfW29mZnNldF07Ci0gIH0KLQotIHByaXZhdGU6Ci0gIEhBTkRMRSBmbWFwXzsKLSAgY2hhciogc3RhcnRfOwotICB1aW50MzIgc2l6ZV87Ci19OwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFZhbGlkYXRpb24gb2YgQXVkaW9NYW5hZ2VyOjpBVURJT19QQ01fTElORUFSCi0vLwotLy8gTk9URToKLS8vIFRoZSB0ZXN0cyBjYW4gZmFpbCBvbiB0aGUgYnVpbGQgYm90cyB3aGVuIHNvbWVib2R5IGNvbm5lY3RzIHRvIHRoZW0gdmlhCi0vLyByZW1vdGUtZGVza3RvcCBhbmQgdGhlIHJkcCBjbGllbnQgaW5zdGFsbHMgYW4gYXVkaW8gZGV2aWNlIHRoYXQgZmFpbHMgdG8gb3BlbgotLy8gYXQgc29tZSBwb2ludCwgcG9zc2libHkgd2hlbiB0aGUgY29ubmVjdGlvbiBnb2VzIGlkbGUuCi0KLS8vIFRlc3QgdGhhdCBjYW4gaXQgYmUgY3JlYXRlZCBhbmQgY2xvc2VkLgotVEVTVChXaW5BdWRpb1Rlc3QsIFBDTVdhdmVTdHJlYW1HZXRBbmRDbG9zZSkgewotICBzY29wZWRfcHRyPEF1ZGlvTWFuYWdlcj4gYXVkaW9fbWFuKEF1ZGlvTWFuYWdlcjo6Q3JlYXRlKCkpOwotICBpZiAoIWF1ZGlvX21hbi0+SGFzQXVkaW9PdXRwdXREZXZpY2VzKCkpIHsKLSAgICBMT0coV0FSTklORykgPDwgIk5vIG91dHB1dCBkZXZpY2UgZGV0ZWN0ZWQuIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBBdWRpb091dHB1dFN0cmVhbSogb2FzID0gYXVkaW9fbWFuLT5NYWtlQXVkaW9PdXRwdXRTdHJlYW0oCi0gICAgICBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSLCBDSEFOTkVMX0xBWU9VVF9TVEVSRU8sCi0gICAgICAgICAgICAgICAgICAgICAgODAwMCwgMTYsIDI1NikpOwotICBBU1NFUlRfVFJVRShOVUxMICE9IG9hcyk7Ci0gIG9hcy0+Q2xvc2UoKTsKLX0KLQotLy8gVGVzdCB0aGF0IGNhbiBpdCBiZSBjYW5ub3QgYmUgY3JlYXRlZCB3aXRoIGludmFsaWQgcGFyYW1ldGVycy4KLVRFU1QoV2luQXVkaW9UZXN0LCBTYW5pdHlPbk1ha2VQYXJhbXMpIHsKLSAgc2NvcGVkX3B0cjxBdWRpb01hbmFnZXI+IGF1ZGlvX21hbihBdWRpb01hbmFnZXI6OkNyZWF0ZSgpKTsKLSAgaWYgKCFhdWRpb19tYW4tPkhhc0F1ZGlvT3V0cHV0RGV2aWNlcygpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJObyBvdXRwdXQgZGV2aWNlIGRldGVjdGVkLiI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQXVkaW9QYXJhbWV0ZXJzOjpGb3JtYXQgZm10ID0gQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSOwotICBFWFBFQ1RfVFJVRShOVUxMID09IGF1ZGlvX21hbi0+TWFrZUF1ZGlvT3V0cHV0U3RyZWFtKAotICAgICAgQXVkaW9QYXJhbWV0ZXJzKGZtdCwgQ0hBTk5FTF9MQVlPVVRfVU5TVVBQT1JURUQsIDgwMDAsIDE2LCAyNTYpKSk7Ci0gIEVYUEVDVF9UUlVFKE5VTEwgPT0gYXVkaW9fbWFuLT5NYWtlQXVkaW9PdXRwdXRTdHJlYW0oCi0gICAgICBBdWRpb1BhcmFtZXRlcnMoZm10LCBDSEFOTkVMX0xBWU9VVF9NT05PLCAxMDI0ICogMTAyNCwgMTYsIDI1NikpKTsKLSAgRVhQRUNUX1RSVUUoTlVMTCA9PSBhdWRpb19tYW4tPk1ha2VBdWRpb091dHB1dFN0cmVhbSgKLSAgICAgIEF1ZGlvUGFyYW1ldGVycyhmbXQsIENIQU5ORUxfTEFZT1VUX1NURVJFTywgODAwMCwgODAsIDI1NikpKTsKLSAgRVhQRUNUX1RSVUUoTlVMTCA9PSBhdWRpb19tYW4tPk1ha2VBdWRpb091dHB1dFN0cmVhbSgKLSAgICAgIEF1ZGlvUGFyYW1ldGVycyhmbXQsIENIQU5ORUxfTEFZT1VUX1VOU1VQUE9SVEVELCA4MDAwLCAxNiwgMjU2KSkpOwotICBFWFBFQ1RfVFJVRShOVUxMID09IGF1ZGlvX21hbi0+TWFrZUF1ZGlvT3V0cHV0U3RyZWFtKAotICAgICAgQXVkaW9QYXJhbWV0ZXJzKGZtdCwgQ0hBTk5FTF9MQVlPVVRfU1RFUkVPLCAtODAwMCwgMTYsIDI1NikpKTsKLSAgRVhQRUNUX1RSVUUoTlVMTCA9PSBhdWRpb19tYW4tPk1ha2VBdWRpb091dHB1dFN0cmVhbSgKLSAgICAgIEF1ZGlvUGFyYW1ldGVycyhmbXQsIENIQU5ORUxfTEFZT1VUX01PTk8sIDgwMDAsIDE2LCAtMTAwKSkpOwotICBFWFBFQ1RfVFJVRShOVUxMID09IGF1ZGlvX21hbi0+TWFrZUF1ZGlvT3V0cHV0U3RyZWFtKAotICAgICAgQXVkaW9QYXJhbWV0ZXJzKGZtdCwgQ0hBTk5FTF9MQVlPVVRfTU9OTywgODAwMCwgMTYsIDApKSk7Ci0gIEVYUEVDVF9UUlVFKE5VTEwgPT0gYXVkaW9fbWFuLT5NYWtlQXVkaW9PdXRwdXRTdHJlYW0oCi0gICAgICBBdWRpb1BhcmFtZXRlcnMoZm10LCBDSEFOTkVMX0xBWU9VVF9NT05PLCA4MDAwLCAxNiwKLSAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6bGltaXRzOjprTWF4U2FtcGxlc1BlclBhY2tldCArIDEpKSk7Ci19Ci0KLS8vIFRlc3QgdGhhdCBpdCBjYW4gYmUgb3BlbmVkIGFuZCBjbG9zZWQuCi1URVNUKFdpbkF1ZGlvVGVzdCwgUENNV2F2ZVN0cmVhbU9wZW5BbmRDbG9zZSkgewotICBzY29wZWRfcHRyPEF1ZGlvTWFuYWdlcj4gYXVkaW9fbWFuKEF1ZGlvTWFuYWdlcjo6Q3JlYXRlKCkpOwotICBpZiAoIWF1ZGlvX21hbi0+SGFzQXVkaW9PdXRwdXREZXZpY2VzKCkpIHsKLSAgICBMT0coV0FSTklORykgPDwgIk5vIG91dHB1dCBkZXZpY2UgZGV0ZWN0ZWQuIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBBdWRpb091dHB1dFN0cmVhbSogb2FzID0gYXVkaW9fbWFuLT5NYWtlQXVkaW9PdXRwdXRTdHJlYW0oCi0gICAgICBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSLCBDSEFOTkVMX0xBWU9VVF9TVEVSRU8sCi0gICAgICAgICAgICAgICAgICAgICAgODAwMCwgMTYsIDI1NikpOwotICBBU1NFUlRfVFJVRShOVUxMICE9IG9hcyk7Ci0gIEVYUEVDVF9UUlVFKG9hcy0+T3BlbigpKTsKLSAgb2FzLT5DbG9zZSgpOwotfQotCi0vLyBUZXN0IHRoYXQgaXQgaGFzIGEgbWF4aW11bSBwYWNrZXQgc2l6ZS4KLVRFU1QoV2luQXVkaW9UZXN0LCBQQ01XYXZlU3RyZWFtT3BlbkxpbWl0KSB7Ci0gIHNjb3BlZF9wdHI8QXVkaW9NYW5hZ2VyPiBhdWRpb19tYW4oQXVkaW9NYW5hZ2VyOjpDcmVhdGUoKSk7Ci0gIGlmICghYXVkaW9fbWFuLT5IYXNBdWRpb091dHB1dERldmljZXMoKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiTm8gb3V0cHV0IGRldmljZSBkZXRlY3RlZC4iOwotICAgIHJldHVybjsKLSAgfQotCi0gIEF1ZGlvT3V0cHV0U3RyZWFtKiBvYXMgPSBhdWRpb19tYW4tPk1ha2VBdWRpb091dHB1dFN0cmVhbSgKLSAgICAgIEF1ZGlvUGFyYW1ldGVycyhBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIsIENIQU5ORUxfTEFZT1VUX1NURVJFTywKLSAgICAgICAgICAgICAgICAgICAgICA4MDAwLCAxNiwgMTAyNCAqIDEwMjQgKiAxMDI0KSk7Ci0gIEVYUEVDVF9UUlVFKE5VTEwgPT0gb2FzKTsKLSAgaWYgKG9hcykKLSAgICBvYXMtPkNsb3NlKCk7Ci19Ci0KLS8vIFRlc3QgcG90ZW50aWFsIGRlYWRsb2NrIHNpdHVhdGlvbiBpZiB0aGUgc291cmNlIGlzIHNsb3cgb3IgYmxvY2tzIGZvciBzb21lCi0vLyB0aW1lLiBUaGUgYWN0dWFsIEVYUEVDVF9HVCBhcmUgbW9zdGx5IG1lYW5pbmdsZXNzIGFuZCB0aGUgcmVhbCB0ZXN0IGlzIHRoYXQKLS8vIHRoZSB0ZXN0IGNvbXBsZXRlcyBpbiByZWFzb25hYmxlIHRpbWUuCi1URVNUKFdpbkF1ZGlvVGVzdCwgUENNV2F2ZVNsb3dTb3VyY2UpIHsKLSAgc2NvcGVkX3B0cjxBdWRpb01hbmFnZXI+IGF1ZGlvX21hbihBdWRpb01hbmFnZXI6OkNyZWF0ZSgpKTsKLSAgaWYgKCFhdWRpb19tYW4tPkhhc0F1ZGlvT3V0cHV0RGV2aWNlcygpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJObyBvdXRwdXQgZGV2aWNlIGRldGVjdGVkLiI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQXVkaW9PdXRwdXRTdHJlYW0qIG9hcyA9IGF1ZGlvX21hbi0+TWFrZUF1ZGlvT3V0cHV0U3RyZWFtKAotICAgICAgQXVkaW9QYXJhbWV0ZXJzKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xJTkVBUiwgQ0hBTk5FTF9MQVlPVVRfTU9OTywKLSAgICAgICAgICAgICAgICAgICAgICAxNjAwMCwgMTYsIDI1NikpOwotICBBU1NFUlRfVFJVRShOVUxMICE9IG9hcyk7Ci0gIFRlc3RTb3VyY2VMYWdneSB0ZXN0X2xhZ2d5KDIsIDkwKTsKLSAgRVhQRUNUX1RSVUUob2FzLT5PcGVuKCkpOwotICAvLyBUaGUgdGVzdCBwYXJhbWV0ZXJzIGNhdXNlIGEgY2FsbGJhY2sgZXZlcnkgMzIgbXMgYW5kIHRoZSBzb3VyY2UgaXMKLSAgLy8gc2xlZXBpbmcgZm9yIDkwIG1zLCBzbyBpdCBpcyBndWFyYW50ZWVkIHRoYXQgd2UgcnVuIG91dCBvZiByZWFkeSBidWZmZXJzLgotICBvYXMtPlN0YXJ0KCZ0ZXN0X2xhZ2d5KTsKLSAgOjpTbGVlcCg1MDApOwotICBFWFBFQ1RfR1QodGVzdF9sYWdneS5jYWxsYmFja19jb3VudCgpLCAyKTsKLSAgRVhQRUNUX0ZBTFNFKHRlc3RfbGFnZ3kuaGFkX2Vycm9yKCkpOwotICBvYXMtPlN0b3AoKTsKLSAgOjpTbGVlcCg1MDApOwotICBvYXMtPkNsb3NlKCk7Ci19Ci0KLS8vIFRlc3QgYW5vdGhlciBwb3RlbnRpYWwgZGVhZGxvY2sgc2l0dWF0aW9uIGlmIHRoZSB0aHJlYWQgdGhhdCBjYWxscyBTdGFydCgpCi0vLyBnZXRzIHBhdXNlZC4gVGhpcyB0ZXN0IGlzIGJlc3Qgd2hlbiBydW4gb3ZlciBSRFAgd2l0aCBhdWRpbyBlbmFibGVkLiBTZWUKLS8vIGJ1ZyAxOTI3NiBmb3IgbW9yZSBkZXRhaWxzLgotVEVTVChXaW5BdWRpb1Rlc3QsIFBDTVdhdmVTdHJlYW1QbGF5U2xvd0xvb3ApIHsKLSAgc2NvcGVkX3B0cjxBdWRpb01hbmFnZXI+IGF1ZGlvX21hbihBdWRpb01hbmFnZXI6OkNyZWF0ZSgpKTsKLSAgaWYgKCFhdWRpb19tYW4tPkhhc0F1ZGlvT3V0cHV0RGV2aWNlcygpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJObyBvdXRwdXQgZGV2aWNlIGRldGVjdGVkLiI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdWludDMyIHNhbXBsZXNfMTAwX21zID0gQXVkaW9QYXJhbWV0ZXJzOjprQXVkaW9DRFNhbXBsZVJhdGUgLyAxMDsKLSAgQXVkaW9PdXRwdXRTdHJlYW0qIG9hcyA9IGF1ZGlvX21hbi0+TWFrZUF1ZGlvT3V0cHV0U3RyZWFtKAotICAgICAgQXVkaW9QYXJhbWV0ZXJzKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xJTkVBUiwgQ0hBTk5FTF9MQVlPVVRfTU9OTywKLSAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlcnM6OmtBdWRpb0NEU2FtcGxlUmF0ZSwgMTYsIHNhbXBsZXNfMTAwX21zKSk7Ci0gIEFTU0VSVF9UUlVFKE5VTEwgIT0gb2FzKTsKLQotICBTaW5lV2F2ZUF1ZGlvU291cmNlIHNvdXJjZSgxLCAyMDAuMCwgQXVkaW9QYXJhbWV0ZXJzOjprQXVkaW9DRFNhbXBsZVJhdGUpOwotCi0gIEVYUEVDVF9UUlVFKG9hcy0+T3BlbigpKTsKLSAgb2FzLT5TZXRWb2x1bWUoMS4wKTsKLQotICBmb3IgKGludCBpeCA9IDA7IGl4ICE9IDU7ICsraXgpIHsKLSAgICBvYXMtPlN0YXJ0KCZzb3VyY2UpOwotICAgIDo6U2xlZXAoMTApOwotICAgIG9hcy0+U3RvcCgpOwotICB9Ci0gIG9hcy0+Q2xvc2UoKTsKLX0KLQotCi0vLyBUaGlzIHRlc3QgcHJvZHVjZXMgYWN0dWFsIGF1ZGlvIGZvciAuNSBzZWNvbmRzIG9uIHRoZSBkZWZhdWx0IHdhdmUKLS8vIGRldmljZSBhdCA0NC4xSyBzL3NlYy4gUGFyYW1ldGVycyBoYXZlIGJlZW4gY2hvc2VuIGNhcmVmdWxseSBzbyB5b3Ugc2hvdWxkCi0vLyBub3QgaGVhciBwb3BzIG9yIG5vaXNlcyB3aGlsZSB0aGUgc291bmQgaXMgcGxheWluZy4KLVRFU1QoV2luQXVkaW9UZXN0LCBQQ01XYXZlU3RyZWFtUGxheTIwMEh6VG9uZTQ0S3NzKSB7Ci0gIHNjb3BlZF9wdHI8QXVkaW9NYW5hZ2VyPiBhdWRpb19tYW4oQXVkaW9NYW5hZ2VyOjpDcmVhdGUoKSk7Ci0gIGlmICghYXVkaW9fbWFuLT5IYXNBdWRpb091dHB1dERldmljZXMoKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiTm8gb3V0cHV0IGRldmljZSBkZXRlY3RlZC4iOwotICAgIHJldHVybjsKLSAgfQotCi0gIHVpbnQzMiBzYW1wbGVzXzEwMF9tcyA9IEF1ZGlvUGFyYW1ldGVyczo6a0F1ZGlvQ0RTYW1wbGVSYXRlIC8gMTA7Ci0gIEF1ZGlvT3V0cHV0U3RyZWFtKiBvYXMgPSBhdWRpb19tYW4tPk1ha2VBdWRpb091dHB1dFN0cmVhbSgKLSAgICAgIEF1ZGlvUGFyYW1ldGVycyhBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIsIENIQU5ORUxfTEFZT1VUX01PTk8sCi0gICAgICAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXJzOjprQXVkaW9DRFNhbXBsZVJhdGUsIDE2LCBzYW1wbGVzXzEwMF9tcykpOwotICBBU1NFUlRfVFJVRShOVUxMICE9IG9hcyk7Ci0KLSAgU2luZVdhdmVBdWRpb1NvdXJjZSBzb3VyY2UoMSwgMjAwLjAsIEF1ZGlvUGFyYW1ldGVyczo6a0F1ZGlvQ0RTYW1wbGVSYXRlKTsKLQotICBFWFBFQ1RfVFJVRShvYXMtPk9wZW4oKSk7Ci0gIG9hcy0+U2V0Vm9sdW1lKDEuMCk7Ci0gIG9hcy0+U3RhcnQoJnNvdXJjZSk7Ci0gIDo6U2xlZXAoNTAwKTsKLSAgb2FzLT5TdG9wKCk7Ci0gIG9hcy0+Q2xvc2UoKTsKLX0KLQotLy8gVGhpcyB0ZXN0IHByb2R1Y2VzIGFjdHVhbCBhdWRpbyBmb3IgZm9yIC41IHNlY29uZHMgb24gdGhlIGRlZmF1bHQgd2F2ZQotLy8gZGV2aWNlIGF0IDIySyBzL3NlYy4gUGFyYW1ldGVycyBoYXZlIGJlZW4gY2hvc2VuIGNhcmVmdWxseSBzbyB5b3Ugc2hvdWxkCi0vLyBub3QgaGVhciBwb3BzIG9yIG5vaXNlcyB3aGlsZSB0aGUgc291bmQgaXMgcGxheWluZy4gVGhlIGF1ZGlvIGFsc28gc2hvdWxkCi0vLyBzb3VuZCB3aXRoIGEgbG93ZXIgdm9sdW1lIHRoYW4gUENNV2F2ZVN0cmVhbVBsYXkyMDBIelRvbmU0NEtzcy4KLVRFU1QoV2luQXVkaW9UZXN0LCBQQ01XYXZlU3RyZWFtUGxheTIwMEh6VG9uZTIyS3NzKSB7Ci0gIHNjb3BlZF9wdHI8QXVkaW9NYW5hZ2VyPiBhdWRpb19tYW4oQXVkaW9NYW5hZ2VyOjpDcmVhdGUoKSk7Ci0gIGlmICghYXVkaW9fbWFuLT5IYXNBdWRpb091dHB1dERldmljZXMoKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiTm8gb3V0cHV0IGRldmljZSBkZXRlY3RlZC4iOwotICAgIHJldHVybjsKLSAgfQotCi0gIHVpbnQzMiBzYW1wbGVzXzEwMF9tcyA9IEF1ZGlvUGFyYW1ldGVyczo6a0F1ZGlvQ0RTYW1wbGVSYXRlIC8gMjA7Ci0gIEF1ZGlvT3V0cHV0U3RyZWFtKiBvYXMgPSBhdWRpb19tYW4tPk1ha2VBdWRpb091dHB1dFN0cmVhbSgKLSAgICAgIEF1ZGlvUGFyYW1ldGVycyhBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIsIENIQU5ORUxfTEFZT1VUX01PTk8sCi0gICAgICAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXJzOjprQXVkaW9DRFNhbXBsZVJhdGUgLyAyLCAxNiwKLSAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzXzEwMF9tcykpOwotICBBU1NFUlRfVFJVRShOVUxMICE9IG9hcyk7Ci0KLSAgU2luZVdhdmVBdWRpb1NvdXJjZSBzb3VyY2UoMSwgMjAwLjAsIEF1ZGlvUGFyYW1ldGVyczo6a0F1ZGlvQ0RTYW1wbGVSYXRlLzIpOwotCi0gIEVYUEVDVF9UUlVFKG9hcy0+T3BlbigpKTsKLQotICBvYXMtPlNldFZvbHVtZSgwLjUpOwotICBvYXMtPlN0YXJ0KCZzb3VyY2UpOwotICA6OlNsZWVwKDUwMCk7Ci0KLSAgLy8gVGVzdCB0aGF0IHRoZSB2b2x1bWUgaXMgd2l0aGluIHRoZSBzZXQgbGltaXRzLgotICBkb3VibGUgdm9sdW1lID0gMC4wOwotICBvYXMtPkdldFZvbHVtZSgmdm9sdW1lKTsKLSAgRVhQRUNUX0xUKHZvbHVtZSwgMC41MSk7Ci0gIEVYUEVDVF9HVCh2b2x1bWUsIDAuNDkpOwotICBvYXMtPlN0b3AoKTsKLSAgb2FzLT5DbG9zZSgpOwotfQotCi0vLyBVc2VzIGEgcmVzdHJpY3RlZCBzb3VyY2UgdG8gcGxheSB+MiBzZWNvbmRzIG9mIGF1ZGlvIGZvciBhYm91dCA1IHNlY29uZHMuIFdlCi0vLyB0cnkgaGFyZCB0byBnZW5lcmF0ZSBzaXR1YXRpb24gd2hlcmUgdGhlIHR3byB0aHJlYWRzIGFyZSBhY2Nlc3NpbmcgdGhlCi0vLyBvYmplY3Qgcm91Z2hseSBhdCB0aGUgc2FtZSB0aW1lLgotVEVTVChXaW5BdWRpb1Rlc3QsIFB1c2hTb3VyY2VGaWxlMTZLSHopICB7Ci0gIHNjb3BlZF9wdHI8QXVkaW9NYW5hZ2VyPiBhdWRpb19tYW4oQXVkaW9NYW5hZ2VyOjpDcmVhdGUoKSk7Ci0gIGlmICghYXVkaW9fbWFuLT5IYXNBdWRpb091dHB1dERldmljZXMoKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiTm8gb3V0cHV0IGRldmljZSBkZXRlY3RlZC4iOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0YXRpYyBjb25zdCBpbnQga1NhbXBsZVJhdGUgPSAxNjAwMDsKLSAgU2luZVdhdmVBdWRpb1NvdXJjZSBzb3VyY2UoMSwgMjAwLjAsIGtTYW1wbGVSYXRlKTsKLSAgLy8gQ29tcHV0ZSBidWZmZXIgc2l6ZSBmb3IgMTAwbXMgb2YgYXVkaW8uCi0gIGNvbnN0IHVpbnQzMiBrU2FtcGxlczEwMG1zID0gKGtTYW1wbGVSYXRlIC8gMTAwMCkgKiAxMDA7Ci0gIC8vIFJlc3RyaWN0IFNpbmVXYXZlQXVkaW9Tb3VyY2UgdG8gMTAwbXMgb2Ygc2FtcGxlcy4KLSAgc291cmNlLkNhcFNhbXBsZXMoa1NhbXBsZXMxMDBtcyk7Ci0KLSAgQXVkaW9PdXRwdXRTdHJlYW0qIG9hcyA9IGF1ZGlvX21hbi0+TWFrZUF1ZGlvT3V0cHV0U3RyZWFtKAotICAgICAgQXVkaW9QYXJhbWV0ZXJzKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xJTkVBUiwgQ0hBTk5FTF9MQVlPVVRfTU9OTywKLSAgICAgICAgICAgICAgICAgICAgICBrU2FtcGxlUmF0ZSwgMTYsIGtTYW1wbGVzMTAwbXMpKTsKLSAgQVNTRVJUX1RSVUUoTlVMTCAhPSBvYXMpOwotCi0gIEVYUEVDVF9UUlVFKG9hcy0+T3BlbigpKTsKLQotICBvYXMtPlNldFZvbHVtZSgxLjApOwotICBvYXMtPlN0YXJ0KCZzb3VyY2UpOwotCi0gIC8vIFdlIGJ1ZmZlciBhbmQgcGxheSBhdCB0aGUgc2FtZSB0aW1lLCBidWZmZXJpbmcgaGFwcGVucyBldmVyeSB+MTBtcyBhbmQgdGhlCi0gIC8vIGNvbnN1bWluZyBvZiB0aGUgYnVmZmVyIGhhcHBlbnMgZXZlcnkgfjEwMG1zLiBXZSBkbyAxMDAgYnVmZmVycyB3aGljaAotICAvLyBlZmZlY3RpdmVseSB3cmFwIGFyb3VuZCB0aGUgZmlsZSBtb3JlIHRoYW4gb25jZS4KLSAgZm9yICh1aW50MzIgaXggPSAwOyBpeCAhPSAxMDA7ICsraXgpIHsKLSAgICA6OlNsZWVwKDEwKTsKLSAgICBzb3VyY2UuUmVzZXQoKTsKLSAgfQotCi0gIC8vIFBsYXkgYSBsaXR0bGUgYml0IG1vcmUgb2YgdGhlIGZpbGUuCi0gIDo6U2xlZXAoNTAwKTsKLQotICBvYXMtPlN0b3AoKTsKLSAgb2FzLT5DbG9zZSgpOwotfQotCi0vLyBUaGlzIHRlc3QgaXMgdG8gbWFrZSBzdXJlIGFuIEF1ZGlvT3V0cHV0U3RyZWFtIGNhbiBiZSBzdGFydGVkIGFmdGVyIGl0IHdhcwotLy8gc3RvcHBlZC4gWW91IHdpbGwgaGVyZSB0d28gLjUgc2Vjb25kcyB3YXZlIHNpZ25hbCBzZXBhcmF0ZWQgYnkgMC41IHNlY29uZHMKLS8vIG9mIHNpbGVuY2UuCi1URVNUKFdpbkF1ZGlvVGVzdCwgUENNV2F2ZVN0cmVhbVBsYXlUd2ljZTIwMEh6VG9uZTQ0S3NzKSB7Ci0gIHNjb3BlZF9wdHI8QXVkaW9NYW5hZ2VyPiBhdWRpb19tYW4oQXVkaW9NYW5hZ2VyOjpDcmVhdGUoKSk7Ci0gIGlmICghYXVkaW9fbWFuLT5IYXNBdWRpb091dHB1dERldmljZXMoKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiTm8gb3V0cHV0IGRldmljZSBkZXRlY3RlZC4iOwotICAgIHJldHVybjsKLSAgfQotCi0gIHVpbnQzMiBzYW1wbGVzXzEwMF9tcyA9IEF1ZGlvUGFyYW1ldGVyczo6a0F1ZGlvQ0RTYW1wbGVSYXRlIC8gMTA7Ci0gIEF1ZGlvT3V0cHV0U3RyZWFtKiBvYXMgPSBhdWRpb19tYW4tPk1ha2VBdWRpb091dHB1dFN0cmVhbSgKLSAgICAgIEF1ZGlvUGFyYW1ldGVycyhBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIsIENIQU5ORUxfTEFZT1VUX01PTk8sCi0gICAgICAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXJzOjprQXVkaW9DRFNhbXBsZVJhdGUsIDE2LCBzYW1wbGVzXzEwMF9tcykpOwotICBBU1NFUlRfVFJVRShOVUxMICE9IG9hcyk7Ci0KLSAgU2luZVdhdmVBdWRpb1NvdXJjZSBzb3VyY2UoMSwgMjAwLjAsIEF1ZGlvUGFyYW1ldGVyczo6a0F1ZGlvQ0RTYW1wbGVSYXRlKTsKLSAgRVhQRUNUX1RSVUUob2FzLT5PcGVuKCkpOwotICBvYXMtPlNldFZvbHVtZSgxLjApOwotCi0gIC8vIFBsYXkgdGhlIHdhdmUgZm9yIC41IHNlY29uZHMuCi0gIG9hcy0+U3RhcnQoJnNvdXJjZSk7Ci0gIDo6U2xlZXAoNTAwKTsKLSAgb2FzLT5TdG9wKCk7Ci0KLSAgLy8gU2xlZXAgdG8gZ2l2ZSBzaWxlbmNlIGFmdGVyIHN0b3BwaW5nIHRoZSBBdWRpb091dHB1dFN0cmVhbS4KLSAgOjpTbGVlcCgyNTApOwotCi0gIC8vIFN0YXJ0IGFnYWluIGFuZCBwbGF5IGZvciAuNSBzZWNvbmRzLgotICBvYXMtPlN0YXJ0KCZzb3VyY2UpOwotICA6OlNsZWVwKDUwMCk7Ci0gIG9hcy0+U3RvcCgpOwotCi0gIG9hcy0+Q2xvc2UoKTsKLX0KLQotLy8gV2l0aCB0aGUgbG93IGxhdGVuY3kgbW9kZSwgV0FTQVBJIGlzIHV0aWxpemVkIGJ5IGRlZmF1bHQgZm9yIFZpc3RhIGFuZAotLy8gaGlnaGVyIGFuZCBXYXZlIGlzIHVzZWQgZm9yIFhQIGFuZCBsb3dlci4gSXQgaXMgcG9zc2libGUgdG8gdXRpbGl6ZSBhCi0vLyBzbWFsbGVyIGJ1ZmZlciBzaXplIGZvciBXQVNBUEkgdGhhbiBmb3IgV2F2ZS4KLVRFU1QoV2luQXVkaW9UZXN0LCBQQ01XYXZlU3RyZWFtUGxheTIwMEh6VG9uZUxvd0xhdGVuY3kpIHsKLSAgc2NvcGVkX3B0cjxBdWRpb01hbmFnZXI+IGF1ZGlvX21hbihBdWRpb01hbmFnZXI6OkNyZWF0ZSgpKTsKLSAgaWYgKCFhdWRpb19tYW4tPkhhc0F1ZGlvT3V0cHV0RGV2aWNlcygpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJObyBvdXRwdXQgZGV2aWNlIGRldGVjdGVkLiI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gVGhlIFdBU0FQSSBBUEkgcmVxdWlyZXMgYSBjb3JyZWN0IENPTSBlbnZpcm9ubWVudC4KLSAgU2NvcGVkQ09NSW5pdGlhbGl6ZXIgY29tX2luaXQoU2NvcGVkQ09NSW5pdGlhbGl6ZXI6OmtNVEEpOwotCi0gIC8vIFVzZSAxMCBtcyBidWZmZXIgc2l6ZSBmb3IgV0FTQVBJIGFuZCA1MCBtcyBidWZmZXIgc2l6ZSBmb3IgV2F2ZS4KLSAgLy8gVGFrZSB0aGUgZXhpc3RpbmcgbmF0aXZlIHNhbXBsZSByYXRlIGludG8gYWNjb3VudC4KLSAgaW50IHNhbXBsZV9yYXRlID0gc3RhdGljX2Nhc3Q8aW50PihtZWRpYTo6R2V0QXVkaW9IYXJkd2FyZVNhbXBsZVJhdGUoKSk7Ci0gIHVpbnQzMiBzYW1wbGVzXzEwX21zID0gc2FtcGxlX3JhdGUgLyAxMDA7Ci0gIGludCBuID0gMTsKLSAgKGJhc2U6Ondpbjo6R2V0VmVyc2lvbigpIDw9IGJhc2U6Ondpbjo6VkVSU0lPTl9YUCkgPyBuID0gNSA6IG4gPSAxOwotICBBdWRpb091dHB1dFN0cmVhbSogb2FzID0gYXVkaW9fbWFuLT5NYWtlQXVkaW9PdXRwdXRTdHJlYW0oCi0gICAgICBBdWRpb1BhcmFtZXRlcnMoQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTE9XX0xBVEVOQ1ksCi0gICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9MQVlPVVRfTU9OTywgc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgMTYsIG4gKiBzYW1wbGVzXzEwX21zKSk7Ci0gIEFTU0VSVF9UUlVFKE5VTEwgIT0gb2FzKTsKLQotICBTaW5lV2F2ZUF1ZGlvU291cmNlIHNvdXJjZSgxLCAyMDAsIHNhbXBsZV9yYXRlKTsKLQotICBib29sIG9wZW5lZCA9IG9hcy0+T3BlbigpOwotICBpZiAoIW9wZW5lZCkgewotICAgIC8vIEl0IHdhcyBub3QgcG9zc2libGUgdG8gb3BlbiB0aGlzIGF1ZGlvIGRldmljZSBpbiBtb25vLgotICAgIC8vIE5vIHBvaW50IGluIGNvbnRpbnVpbmcgdGhlIHRlc3Qgc28gbGV0J3MgYnJlYWsgaGVyZS4KLSAgICBMT0coV0FSTklORykgPDwgIk1vbm8gaXMgbm90IHN1cHBvcnRlZC4gU2tpcHBpbmcgdGVzdC4iOwotICAgIG9hcy0+Q2xvc2UoKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgb2FzLT5TZXRWb2x1bWUoMS4wKTsKLQotICAvLyBQbGF5IHRoZSB3YXZlIGZvciAuOCBzZWNvbmRzLgotICBvYXMtPlN0YXJ0KCZzb3VyY2UpOwotICA6OlNsZWVwKDgwMCk7Ci0gIG9hcy0+U3RvcCgpOwotICBvYXMtPkNsb3NlKCk7Ci19Ci0KLS8vIENoZWNrIHRoYXQgdGhlIHBlbmRpbmcgYnl0ZXMgdmFsdWUgaXMgY29ycmVjdCB3aGF0IHRoZSBzdHJlYW0gc3RhcnRzLgotVEVTVChXaW5BdWRpb1Rlc3QsIFBDTVdhdmVTdHJlYW1QZW5kaW5nQnl0ZXMpIHsKLSAgc2NvcGVkX3B0cjxBdWRpb01hbmFnZXI+IGF1ZGlvX21hbihBdWRpb01hbmFnZXI6OkNyZWF0ZSgpKTsKLSAgaWYgKCFhdWRpb19tYW4tPkhhc0F1ZGlvT3V0cHV0RGV2aWNlcygpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJObyBvdXRwdXQgZGV2aWNlIGRldGVjdGVkLiI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdWludDMyIHNhbXBsZXNfMTAwX21zID0gQXVkaW9QYXJhbWV0ZXJzOjprQXVkaW9DRFNhbXBsZVJhdGUgLyAxMDsKLSAgQXVkaW9PdXRwdXRTdHJlYW0qIG9hcyA9IGF1ZGlvX21hbi0+TWFrZUF1ZGlvT3V0cHV0U3RyZWFtKAotICAgICAgQXVkaW9QYXJhbWV0ZXJzKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xJTkVBUiwgQ0hBTk5FTF9MQVlPVVRfTU9OTywKLSAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlcnM6OmtBdWRpb0NEU2FtcGxlUmF0ZSwgMTYsIHNhbXBsZXNfMTAwX21zKSk7Ci0gIEFTU0VSVF9UUlVFKE5VTEwgIT0gb2FzKTsKLQotICBOaWNlTW9jazxNb2NrQXVkaW9Tb3VyY2U+IHNvdXJjZTsKLSAgRVhQRUNUX1RSVUUob2FzLT5PcGVuKCkpOwotCi0gIHVpbnQzMiBieXRlc18xMDBfbXMgPSBzYW1wbGVzXzEwMF9tcyAqIDI7Ci0KLSAgLy8gQXVkaW8gb3V0cHV0IHN0cmVhbSBoYXMgZWl0aGVyIGEgZG91YmxlIG9yIHRyaXBsZSBidWZmZXIgc2NoZW1lLgotICAvLyBXZSBleHBlY3QgdGhlIGFtb3VudCBvZiBwZW5kaW5nIGJ5dGVzIHdpbGwgcmVhY2hpbmcgdXAgdG8gMiB0aW1lcyBvZgotICAvLyB8Ynl0ZXNfMTAwX21zfCBkZXBlbmRpbmcgb24gbnVtYmVyIG9mIGJ1ZmZlcnMgdXNlZC4KLSAgLy8gRnJvbSB0aGF0IGl0IHdvdWxkIGRlY3JlYXNlIGFzIHdlIGFyZSBwbGF5aW5nIHRoZSBkYXRhIGJ1dCBub3QgcHJvdmlkaW5nCi0gIC8vIG5ldyBvbmUuIEFuZCB0aGVuIHdlIHdpbGwgdHJ5IHRvIHByb3ZpZGUgemVybyBkYXRhIHNvIHRoZSBhbW91bnQgb2YKLSAgLy8gcGVuZGluZyBieXRlcyB3aWxsIGdvIGRvd24gYW5kIGV2ZW50dWFsbHkgcmVhZCB6ZXJvLgotICBJblNlcXVlbmNlIHM7Ci0KLSAgRVhQRUNUX0NBTEwoc291cmNlLCBPbk1vcmVEYXRhKE5vdE51bGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkKCZBdWRpb0J1ZmZlcnNTdGF0ZTo6cGVuZGluZ19ieXRlcywgMCkpKQotICAgICAgLldpbGxPbmNlKEludm9rZShNb2NrQXVkaW9Tb3VyY2U6OkNsZWFyRGF0YSkpOwotICBzd2l0Y2ggKE51bWJlck9mV2F2ZU91dEJ1ZmZlcnMoKSkgewotICAgIGNhc2UgMjoKLSAgICAgIGJyZWFrOyAgLy8gQ2FsbHMgYXJlIHRoZSBzYW1lIGFzIGF0IGVuZCBvZiAzLWJ1ZmZlciBzY2hlbWUuCi0gICAgY2FzZSAzOgotICAgICAgRVhQRUNUX0NBTEwoc291cmNlLCBPbk1vcmVEYXRhKE5vdE51bGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZCgmQXVkaW9CdWZmZXJzU3RhdGU6OnBlbmRpbmdfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfMTAwX21zKSkpCi0gICAgICAgICAgLldpbGxPbmNlKEludm9rZShNb2NrQXVkaW9Tb3VyY2U6OkNsZWFyRGF0YSkpOwotICAgICAgRVhQRUNUX0NBTEwoc291cmNlLCBPbk1vcmVEYXRhKE5vdE51bGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZCgmQXVkaW9CdWZmZXJzU3RhdGU6OnBlbmRpbmdfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIGJ5dGVzXzEwMF9tcykpKQotICAgICAgICAgIC5XaWxsT25jZShJbnZva2UoTW9ja0F1ZGlvU291cmNlOjpDbGVhckRhdGEpKTsKLSAgICAgIEVYUEVDVF9DQUxMKHNvdXJjZSwgT25Nb3JlRGF0YShOb3ROdWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQoJkF1ZGlvQnVmZmVyc1N0YXRlOjpwZW5kaW5nX2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiBieXRlc18xMDBfbXMpKSkKLSAgICAgICAgICAuVGltZXMoQW55TnVtYmVyKCkpCi0gICAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybigwKSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpCi0gICAgICAgICAgPDwgIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIGJ1ZmZlcnM6ICIgPDwgTnVtYmVyT2ZXYXZlT3V0QnVmZmVycygpOwotICB9Ci0gIEVYUEVDVF9DQUxMKHNvdXJjZSwgT25Nb3JlRGF0YShOb3ROdWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZCgmQXVkaW9CdWZmZXJzU3RhdGU6OnBlbmRpbmdfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc18xMDBfbXMpKSkKLSAgICAgIC5UaW1lcyhBbnlOdW1iZXIoKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oMCkpOwotICBFWFBFQ1RfQ0FMTChzb3VyY2UsIE9uTW9yZURhdGEoTm90TnVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQoJkF1ZGlvQnVmZmVyc1N0YXRlOjpwZW5kaW5nX2J5dGVzLCAwKSkpCi0gICAgICAuVGltZXMoQW55TnVtYmVyKCkpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKDApKTsKLQotICBvYXMtPlN0YXJ0KCZzb3VyY2UpOwotICA6OlNsZWVwKDUwMCk7Ci0gIG9hcy0+U3RvcCgpOwotICBvYXMtPkNsb3NlKCk7Ci19Ci0KLS8vIFNpbXBsZSBzb3VyY2UgdGhhdCB1c2VzIGEgU3luY1NvY2tldCB0byByZXRyaWV2ZSB0aGUgYXVkaW8gZGF0YQotLy8gZnJvbSBhIHBvdGVudGlhbGx5IHJlbW90ZSB0aHJlYWQuCi1jbGFzcyBTeW5jU29ja2V0U291cmNlIDogcHVibGljIEF1ZGlvT3V0cHV0U3RyZWFtOjpBdWRpb1NvdXJjZUNhbGxiYWNrIHsKLSBwdWJsaWM6Ci0gIFN5bmNTb2NrZXRTb3VyY2UoYmFzZTo6U3luY1NvY2tldCogc29ja2V0LCBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcykKLSAgICAgIDogc29ja2V0Xyhzb2NrZXQpIHsKLSAgICAvLyBTZXR1cCBBdWRpb0J1cyB3cmFwcGluZyBkYXRhIHdlJ2xsIHJlY2VpdmUgb3ZlciB0aGUgc3luYyBzb2NrZXQuCi0gICAgZGF0YV9zaXplXyA9IEF1ZGlvQnVzOjpDYWxjdWxhdGVNZW1vcnlTaXplKHBhcmFtcyk7Ci0gICAgZGF0YV8ucmVzZXQoc3RhdGljX2Nhc3Q8ZmxvYXQqPigKLSAgICAgICAgYmFzZTo6QWxpZ25lZEFsbG9jKGRhdGFfc2l6ZV8sIEF1ZGlvQnVzOjprQ2hhbm5lbEFsaWdubWVudCkpKTsKLSAgICBhdWRpb19idXNfID0gQXVkaW9CdXM6OldyYXBNZW1vcnkocGFyYW1zLCBkYXRhXy5nZXQoKSk7Ci0gIH0KLSAgflN5bmNTb2NrZXRTb3VyY2UoKSB7fQotCi0gIC8vIEF1ZGlvU291cmNlQ2FsbGJhY2s6Ok9uTW9yZURhdGEgaW1wbGVtZW50YXRpb246Ci0gIHZpcnR1YWwgaW50IE9uTW9yZURhdGEoQXVkaW9CdXMqIGF1ZGlvX2J1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlcnNTdGF0ZSBidWZmZXJzX3N0YXRlKSB7Ci0gICAgc29ja2V0Xy0+U2VuZCgmYnVmZmVyc19zdGF0ZSwgc2l6ZW9mKGJ1ZmZlcnNfc3RhdGUpKTsKLSAgICB1aW50MzIgc2l6ZSA9IHNvY2tldF8tPlJlY2VpdmUoZGF0YV8uZ2V0KCksIGRhdGFfc2l6ZV8pOwotICAgIERDSEVDS19FUShzdGF0aWNfY2FzdDxzaXplX3Q+KHNpemUpICUgc2l6ZW9mKCphdWRpb19idXNfLT5jaGFubmVsKDApKSwgMFUpOwotICAgIGF1ZGlvX2J1c18tPkNvcHlUbyhhdWRpb19idXMpOwotICAgIHJldHVybiBhdWRpb19idXNfLT5mcmFtZXMoKTsKLSAgfQotICB2aXJ0dWFsIGludCBPbk1vcmVJT0RhdGEoQXVkaW9CdXMqIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVzKiBkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJzU3RhdGUgYnVmZmVyc19zdGF0ZSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICAvLyBBdWRpb1NvdXJjZUNhbGxiYWNrOjpPbkVycm9yIGltcGxlbWVudGF0aW9uOgotICB2aXJ0dWFsIHZvaWQgT25FcnJvcihBdWRpb091dHB1dFN0cmVhbSogc3RyZWFtLCBpbnQgY29kZSkgewotICB9Ci0KLSBwcml2YXRlOgotICBiYXNlOjpTeW5jU29ja2V0KiBzb2NrZXRfOwotICBpbnQgZGF0YV9zaXplXzsKLSAgc2NvcGVkX3B0cl9tYWxsb2M8ZmxvYXQsIGJhc2U6OlNjb3BlZFB0ckFsaWduZWRGcmVlPiBkYXRhXzsKLSAgc2NvcGVkX3B0cjxBdWRpb0J1cz4gYXVkaW9fYnVzXzsKLX07Ci0KLXN0cnVjdCBTeW5jVGhyZWFkQ29udGV4dCB7Ci0gIGJhc2U6OlN5bmNTb2NrZXQqIHNvY2tldDsKLSAgaW50IHNhbXBsZV9yYXRlOwotICBpbnQgY2hhbm5lbHM7Ci0gIGludCBmcmFtZXM7Ci0gIGRvdWJsZSBzaW5lX2ZyZXE7Ci0gIHVpbnQzMiBwYWNrZXRfc2l6ZV9ieXRlczsKLX07Ci0KLS8vIFRoaXMgdGhyZWFkIHByb3ZpZGVzIHRoZSBkYXRhIHRoYXQgdGhlIFN5bmNTb2NrZXRTb3VyY2UgYWJvdmUgbmVlZHMKLS8vIHVzaW5nIHRoZSBvdGhlciBlbmQgb2YgYSBTeW5jU29ja2V0LiBUaGUgcHJvdG9jb2wgaXMgYXMgZm9sbG93czoKLS8vCi0vLyBTeW5jU29ja2V0U291cmNlIC0tLXNlbmQgNCBieXRlcyAtLS0tLS0tLS0tLS0+IFN5bmNTb2NrZXRUaHJlYWQKLS8vICAgICAgICAgICAgICAgICAgPC0tLSBhdWRpbyBwYWNrZXQgLS0tLS0tLS0tLQotLy8KLURXT1JEIF9fc3RkY2FsbCBTeW5jU29ja2V0VGhyZWFkKHZvaWQqIGNvbnRleHQpIHsKLSAgU3luY1RocmVhZENvbnRleHQmIGN0eCA9ICoocmVpbnRlcnByZXRfY2FzdDxTeW5jVGhyZWFkQ29udGV4dCo+KGNvbnRleHQpKTsKLQotICAvLyBTZXR1cCBBdWRpb0J1cyB3cmFwcGluZyBkYXRhIHdlJ2xsIHBhc3Mgb3ZlciB0aGUgc3luYyBzb2NrZXQuCi0gIHNjb3BlZF9wdHJfbWFsbG9jPGZsb2F0LCBiYXNlOjpTY29wZWRQdHJBbGlnbmVkRnJlZT4gZGF0YShzdGF0aWNfY2FzdDxmbG9hdCo+KAotICAgICAgYmFzZTo6QWxpZ25lZEFsbG9jKGN0eC5wYWNrZXRfc2l6ZV9ieXRlcywgQXVkaW9CdXM6OmtDaGFubmVsQWxpZ25tZW50KSkpOwotICBzY29wZWRfcHRyPEF1ZGlvQnVzPiBhdWRpb19idXMgPSBBdWRpb0J1czo6V3JhcE1lbW9yeSgKLSAgICAgIGN0eC5jaGFubmVscywgY3R4LmZyYW1lcywgZGF0YS5nZXQoKSk7Ci0KLSAgU2luZVdhdmVBdWRpb1NvdXJjZSBzaW5lKDEsIGN0eC5zaW5lX2ZyZXEsIGN0eC5zYW1wbGVfcmF0ZSk7Ci0gIGNvbnN0IGludCBrVHdvU2VjRnJhbWVzID0gY3R4LnNhbXBsZV9yYXRlICogMjsKLQotICBBdWRpb0J1ZmZlcnNTdGF0ZSBidWZmZXJzX3N0YXRlOwotICBpbnQgdGltZXMgPSAwOwotICBmb3IgKGludCBpeCA9IDA7IGl4IDwga1R3b1NlY0ZyYW1lczsgaXggKz0gY3R4LmZyYW1lcykgewotICAgIGlmIChjdHguc29ja2V0LT5SZWNlaXZlKCZidWZmZXJzX3N0YXRlLCBzaXplb2YoYnVmZmVyc19zdGF0ZSkpID09IDApCi0gICAgICBicmVhazsKLSAgICBpZiAoKHRpbWVzID4gMCkgJiYgKGJ1ZmZlcnNfc3RhdGUucGVuZGluZ19ieXRlcyA8IDEwMDApKSBfX2RlYnVnYnJlYWsoKTsKLSAgICBzaW5lLk9uTW9yZURhdGEoYXVkaW9fYnVzLmdldCgpLCBidWZmZXJzX3N0YXRlKTsKLSAgICBjdHguc29ja2V0LT5TZW5kKGRhdGEuZ2V0KCksIGN0eC5wYWNrZXRfc2l6ZV9ieXRlcyk7Ci0gICAgKyt0aW1lczsKLSAgfQotCi0gIHJldHVybiAwOwotfQotCi0vLyBUZXN0IHRoZSBiYXNpYyBvcGVyYXRpb24gb2YgQXVkaW9PdXRwdXRTdHJlYW0gdXNlZCB3aXRoIGEgU3luY1NvY2tldC4KLS8vIFRoZSBlbXBoYXNpcyBpcyB0byB2ZXJpZnkgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBmZWVkIGRhdGEgdG8gdGhlIGF1ZGlvCi0vLyBsYXllciB1c2luZyBhIHNvdXJjZSBiYXNlZCBvbiBTeW5jU29ja2V0LiBJbiBhIHJlYWwgc2l0dWF0aW9uIHdlIHdvdWxkCi0vLyBnbyBmb3IgdGhlIGxvdy1sYXRlbmN5IHZlcnNpb24gaW4gY29tYmluYXRpb24gd2l0aCBTeW5jU29ja2V0LCBidXQgdG8ga2VlcAotLy8gdGhlIHRlc3QgbW9yZSBzaW1wbGUsIEFVRElPX1BDTV9MSU5FQVIgaXMgdXRpbGl6ZWQgaW5zdGVhZC4gVGhlIG1haW4KLS8vIHByaW5jaXBsZSBvZiB0aGUgdGVzdCBzdGlsbCByZW1haW5zIGFuZCB3ZSBhdm9pZCB0aGUgYWRkaXRpb25hbCBjb21wbGV4aXR5Ci0vLyByZWxhdGVkIHRvIHRoZSB0d28gZGlmZmVyZW50IGF1ZGlvLWxheWVycyBmb3IgQVVESU9fUENNX0xPV19MQVRFTkNZLgotLy8gSW4gdGhpcyB0ZXN0IHlvdSBzaG91bGQgaGVhciBhIGNvbnRpbnVvdXMgMjAwSHogdG9uZSBmb3IgMiBzZWNvbmRzLgotVEVTVChXaW5BdWRpb1Rlc3QsIFN5bmNTb2NrZXRCYXNpYykgewotICBzY29wZWRfcHRyPEF1ZGlvTWFuYWdlcj4gYXVkaW9fbWFuKEF1ZGlvTWFuYWdlcjo6Q3JlYXRlKCkpOwotICBpZiAoIWF1ZGlvX21hbi0+SGFzQXVkaW9PdXRwdXREZXZpY2VzKCkpIHsKLSAgICBMT0coV0FSTklORykgPDwgIk5vIG91dHB1dCBkZXZpY2UgZGV0ZWN0ZWQuIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGF0aWMgY29uc3QgaW50IHNhbXBsZV9yYXRlID0gQXVkaW9QYXJhbWV0ZXJzOjprQXVkaW9DRFNhbXBsZVJhdGU7Ci0gIHN0YXRpYyBjb25zdCB1aW50MzIga1NhbXBsZXMyMG1zID0gc2FtcGxlX3JhdGUgLyA1MDsKLSAgQXVkaW9QYXJhbWV0ZXJzIHBhcmFtcyhBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9MQVlPVVRfTU9OTywgc2FtcGxlX3JhdGUsIDE2LCBrU2FtcGxlczIwbXMpOwotCi0KLSAgQXVkaW9PdXRwdXRTdHJlYW0qIG9hcyA9IGF1ZGlvX21hbi0+TWFrZUF1ZGlvT3V0cHV0U3RyZWFtKHBhcmFtcyk7Ci0gIEFTU0VSVF9UUlVFKE5VTEwgIT0gb2FzKTsKLQotICBBU1NFUlRfVFJVRShvYXMtPk9wZW4oKSk7Ci0KLSAgYmFzZTo6U3luY1NvY2tldCBzb2NrZXRzWzJdOwotICBBU1NFUlRfVFJVRShiYXNlOjpTeW5jU29ja2V0OjpDcmVhdGVQYWlyKCZzb2NrZXRzWzBdLCAmc29ja2V0c1sxXSkpOwotCi0gIFN5bmNTb2NrZXRTb3VyY2Ugc291cmNlKCZzb2NrZXRzWzBdLCBwYXJhbXMpOwotCi0gIFN5bmNUaHJlYWRDb250ZXh0IHRocmVhZF9jb250ZXh0OwotICB0aHJlYWRfY29udGV4dC5zYW1wbGVfcmF0ZSA9IHBhcmFtcy5zYW1wbGVfcmF0ZSgpOwotICB0aHJlYWRfY29udGV4dC5zaW5lX2ZyZXEgPSAyMDAuMDsKLSAgdGhyZWFkX2NvbnRleHQucGFja2V0X3NpemVfYnl0ZXMgPSBBdWRpb0J1czo6Q2FsY3VsYXRlTWVtb3J5U2l6ZShwYXJhbXMpOwotICB0aHJlYWRfY29udGV4dC5mcmFtZXMgPSBwYXJhbXMuZnJhbWVzX3Blcl9idWZmZXIoKTsKLSAgdGhyZWFkX2NvbnRleHQuY2hhbm5lbHMgPSBwYXJhbXMuY2hhbm5lbHMoKTsKLSAgdGhyZWFkX2NvbnRleHQuc29ja2V0ID0gJnNvY2tldHNbMV07Ci0KLSAgSEFORExFIHRocmVhZCA9IDo6Q3JlYXRlVGhyZWFkKE5VTEwsIDAsIFN5bmNTb2NrZXRUaHJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhyZWFkX2NvbnRleHQsIDAsIE5VTEwpOwotCi0gIG9hcy0+U3RhcnQoJnNvdXJjZSk7Ci0KLSAgOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KHRocmVhZCwgSU5GSU5JVEUpOwotICA6OkNsb3NlSGFuZGxlKHRocmVhZCk7Ci0KLSAgb2FzLT5TdG9wKCk7Ci0gIG9hcy0+Q2xvc2UoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vd2luL2F1ZGlvX3VuaWZpZWRfd2luLmNjIGIvc3JjL21lZGlhL2F1ZGlvL3dpbi9hdWRpb191bmlmaWVkX3dpbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc3ZjllMC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vd2luL2F1ZGlvX3VuaWZpZWRfd2luLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTY5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby93aW4vYXVkaW9fdW5pZmllZF93aW4uaCIKLQotI2luY2x1ZGUgPEZ1bmN0aW9uZGlzY292ZXJ5a2V5c19kZXZwa2V5Lmg+Ci0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiYmFzZS90aW1lLmgiCi0jaW5jbHVkZSAiYmFzZS93aW4vc2NvcGVkX2NvbV9pbml0aWFsaXplci5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3dpbi9hdWRpb19tYW5hZ2VyX3dpbi5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3dpbi9hdnJ0X3dyYXBwZXJfd2luLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vd2luL2NvcmVfYXVkaW9fdXRpbF93aW4uaCIKLQotdXNpbmcgYmFzZTo6d2luOjpTY29wZWRDb21QdHI7Ci11c2luZyBiYXNlOjp3aW46OlNjb3BlZENPTUluaXRpYWxpemVyOwotdXNpbmcgYmFzZTo6d2luOjpTY29wZWRDb01lbTsKLQotLy8gVGltZSBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiB0d28gc3VjY2Vzc2l2ZSBkZWxheSBtZWFzdXJlbWVudHMuCi0vLyBXZSBzYXZlIHJlc291cmNlcyBieSBub3QgdXBkYXRpbmcgdGhlIGRlbGF5IGVzdGltYXRlcyBmb3IgZWFjaCBjYXB0dXJlCi0vLyBldmVudCAodHlwaWNhbGx5IDEwMEh6IHJhdGUpLgotc3RhdGljIGNvbnN0IHNpemVfdCBrVGltZURpZmZJbk1pbGxpc2Vjb25kc0JldHdlZW5EZWxheU1lYXN1cmVtZW50cyA9IDEwMDA7Ci0KLS8vIENvbXBhcmUgdHdvIHNldHMgb2YgYXVkaW8gcGFyYW1ldGVycyBhbmQgcmV0dXJuIHRydWUgaWYgdGhleSBhcmUgZXF1YWwuCi0vLyBOb3RlIHRoYXQgYml0c19wZXJfc2FtcGxlKCkgaXMgZXhjbHVkZWQgZnJvbSB0aGlzIGNvbXBhcmlzb24gc2luY2UgQ29yZQotLy8gQXVkaW8gY2FuIGRlYWwgd2l0aCBtb3N0IGJpdCBkZXB0aHMuIEFzIGFuIGV4YW1wbGUsIGlmIHRoZSBuYXRpdmUvbWl4aW5nCi0vLyBiaXQgZGVwdGggaXMgMzIgYml0cyAoZGVmYXVsdCksIG9wZW5pbmcgYXQgMTYgb3IgMjQgc3RpbGwgd29ya3MgZmluZSBhbmQKLS8vIHRoZSBhdWRpbyBlbmdpbmUgd2lsbCBkbyB0aGUgcmVxdWlyZWQgY29udmVyc2lvbiBmb3IgdXMuCi1zdGF0aWMgYm9vbCBDb21wYXJlQXVkaW9QYXJhbWV0ZXJzKGNvbnN0IG1lZGlhOjpBdWRpb1BhcmFtZXRlcnMmIGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BhcmFtZXRlcnMmIGIpIHsKLSAgcmV0dXJuIChhLmZvcm1hdCgpID09IGIuZm9ybWF0KCkgJiYKLSAgICAgICAgICBhLmNoYW5uZWxzKCkgPT0gYi5jaGFubmVscygpICYmCi0gICAgICAgICAgYS5zYW1wbGVfcmF0ZSgpID09IGIuc2FtcGxlX3JhdGUoKSAmJgotICAgICAgICAgIGEuZnJhbWVzX3Blcl9idWZmZXIoKSA9PSBiLmZyYW1lc19wZXJfYnVmZmVyKCkpOwotfQotCi0vLyBVc2UgdGhlIGFjcXVpcmVkIElBdWRpb0Nsb2NrIGludGVyZmFjZSB0byBkZXJpdmUgYSB0aW1lIHN0YW1wIG9mIHRoZSBhdWRpbwotLy8gc2FtcGxlIHdoaWNoIGlzIGN1cnJlbnRseSBwbGF5aW5nIHRocm91Z2ggdGhlIHNwZWFrZXJzLgotc3RhdGljIGRvdWJsZSBTcGVha2VyU3RyZWFtUG9zSW5NaWxsaXNlY29uZHMoSUF1ZGlvQ2xvY2sqIGNsb2NrKSB7Ci0gIFVJTlQ2NCBkZXZpY2VfZnJlcXVlbmN5ID0gMCwgcG9zaXRpb24gPSAwOwotICBpZiAoRkFJTEVEKGNsb2NrLT5HZXRGcmVxdWVuY3koJmRldmljZV9mcmVxdWVuY3kpKSB8fAotICAgICAgRkFJTEVEKGNsb2NrLT5HZXRQb3NpdGlvbigmcG9zaXRpb24sIE5VTEwpKSkgewotICAgIHJldHVybiAwLjA7Ci0gIH0KLQotICByZXR1cm4gYmFzZTo6VGltZTo6a01pbGxpc2Vjb25kc1BlclNlY29uZCAqCi0gICAgICAoc3RhdGljX2Nhc3Q8ZG91YmxlPihwb3NpdGlvbikgLyBkZXZpY2VfZnJlcXVlbmN5KTsKLX0KLQotLy8gR2V0IGEgdGltZSBzdGFtcCBpbiBtaWxsaXNlY29uZHMgZ2l2ZW4gbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyBpbiB8bnVtX2ZyYW1lc3wKLS8vIHVzaW5nIHRoZSBjdXJyZW50IHNhbXBsZSByYXRlIHxmc3wgYXMgc2NhbGUgZmFjdG9yLgotLy8gRXhhbXBsZTogfG51bV9mcmFtZXN8ID0gOTYwIGFuZCB8ZnN8ID0gNDgwMDAgPT4gMjAgW21zXS4KLXN0YXRpYyBkb3VibGUgQ3VycmVudFN0cmVhbVBvc0luTWlsbGlzZWNvbmRzKFVJTlQ2NCBudW1fZnJhbWVzLCBEV09SRCBmcykgewotICByZXR1cm4gYmFzZTo6VGltZTo6a01pbGxpc2Vjb25kc1BlclNlY29uZCAqCi0gICAgICAoc3RhdGljX2Nhc3Q8ZG91YmxlPihudW1fZnJhbWVzKSAvIGZzKTsKLX0KLQotLy8gQ29udmVydCBhIHRpbWVzdGFtcCBpbiBtaWxsaXNlY29uZHMgdG8gYnl0ZSB1bml0cyBnaXZlbiB0aGUgYXVkaW8gZm9ybWF0Ci0vLyBpbiB8Zm9ybWF0fC4KLS8vIEV4YW1wbGU6IHx0c19taWxsaXNlY29uZHN8IGVxdWFscyAxMCwgc2FtcGxlIHJhdGUgaXMgNDgwMDAgYW5kIGZyYW1lIHNpemUKLS8vIGlzIDQgYnl0ZXMgcGVyIGF1ZGlvIGZyYW1lID0+IDQ4MCAqIDQgPSAxOTIwIFtieXRlc10uCi1zdGF0aWMgaW50IE1pbGxpc2Vjb25kc1RvQnl0ZXMoZG91YmxlIHRzX21pbGxpc2Vjb25kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXQVZFRk9STUFUUENNRVgmIGZvcm1hdCkgewotICBkb3VibGUgc2Vjb25kcyA9IHRzX21pbGxpc2Vjb25kcyAvIGJhc2U6OlRpbWU6OmtNaWxsaXNlY29uZHNQZXJTZWNvbmQ7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHNlY29uZHMgKiBmb3JtYXQuRm9ybWF0Lm5TYW1wbGVzUGVyU2VjICoKLSAgICAgIGZvcm1hdC5Gb3JtYXQubkJsb2NrQWxpZ24gKyAwLjUpOwotfQotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1XQVNBUElVbmlmaWVkU3RyZWFtOjpXQVNBUElVbmlmaWVkU3RyZWFtKEF1ZGlvTWFuYWdlcldpbiogbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpCi0gICAgOiBjcmVhdGluZ190aHJlYWRfaWRfKGJhc2U6OlBsYXRmb3JtVGhyZWFkOjpDdXJyZW50SWQoKSksCi0gICAgICBtYW5hZ2VyXyhtYW5hZ2VyKSwKLSAgICAgIHNoYXJlX21vZGVfKENvcmVBdWRpb1V0aWw6OkdldFNoYXJlTW9kZSgpKSwKLSAgICAgIGF1ZGlvX2lvX3RocmVhZF8oTlVMTCksCi0gICAgICBvcGVuZWRfKGZhbHNlKSwKLSAgICAgIGVuZHBvaW50X3JlbmRlcl9idWZmZXJfc2l6ZV9mcmFtZXNfKDApLAotICAgICAgZW5kcG9pbnRfY2FwdHVyZV9idWZmZXJfc2l6ZV9mcmFtZXNfKDApLAotICAgICAgbnVtX3dyaXR0ZW5fZnJhbWVzXygwKSwKLSAgICAgIHRvdGFsX2RlbGF5X21zXygwLjApLAotICAgICAgc291cmNlXyhOVUxMKSwKLSAgICAgIGNhcHR1cmVfYnVzXyhBdWRpb0J1czo6Q3JlYXRlKHBhcmFtcykpLAotICAgICAgcmVuZGVyX2J1c18oQXVkaW9CdXM6OkNyZWF0ZShwYXJhbXMpKSB7Ci0gIERDSEVDSyhtYW5hZ2VyXyk7Ci0KLSAgRFZMT0dfSUYoMSwgIUhhc1VuaWZpZWREZWZhdWx0SU8oKSkgPDwgIlVuaWZpZWQgYXVkaW8gSS9PIGlzIG5vdCBzdXBwb3J0ZWQuIjsKLSAgRFZMT0dfSUYoMSwgc2hhcmVfbW9kZV8gPT0gQVVEQ0xOVF9TSEFSRU1PREVfRVhDTFVTSVZFKQotICAgICAgPDwgIkNvcmUgQXVkaW8gKFdBU0FQSSkgRVhDTFVTSVZFIE1PREUgaXMgZW5hYmxlZC4iOwotCi0jaWYgIWRlZmluZWQoTkRFQlVHKQotICAvLyBBZGQgbG9nIG1lc3NhZ2UgaWYgaW5wdXQgcGFyYW1ldGVycyBhcmUgbm90IGlkZW50aWNhbCB0byB0aGUgcHJlZmVycmVkCi0gIC8vIHBhcmFtZXRlcnMuCi0gIEF1ZGlvUGFyYW1ldGVycyBtaXhfcGFyYW1zOwotICBIUkVTVUxUIGhyID0gQ29yZUF1ZGlvVXRpbDo6R2V0UHJlZmVycmVkQXVkaW9QYXJhbWV0ZXJzKAotICAgICAgZVJlbmRlciwgZUNvbnNvbGUsICZtaXhfcGFyYW1zKTsKLSAgRFZMT0dfSUYoMSwgU1VDQ0VFREVEKGhyKSAmJiAhQ29tcGFyZUF1ZGlvUGFyYW1ldGVycyhwYXJhbXMsIG1peF9wYXJhbXMpKSA8PAotICAgICAgIklucHV0IGFuZCBwcmVmZXJyZWQgcGFyYW1ldGVycyBhcmUgbm90IGlkZW50aWNhbC4iOwotI2VuZGlmCi0KLSAgLy8gTG9hZCB0aGUgQXZydCBETEwgaWYgbm90IGFscmVhZHkgbG9hZGVkLiBSZXF1aXJlZCB0byBzdXBwb3J0IE1NQ1NTLgotICBib29sIGF2cnRfaW5pdCA9IGF2cnQ6OkluaXRpYWxpemUoKTsKLSAgRENIRUNLKGF2cnRfaW5pdCkgPDwgIkZhaWxlZCB0byBsb2FkIHRoZSBhdnJ0LmRsbCI7Ci0KLSAgLy8gQmVnaW4gd2l0aCB0aGUgV0FWRUZPUk1BVEVYIHN0cnVjdHVyZSB0aGF0IHNwZWNpZmllcyB0aGUgYmFzaWMgZm9ybWF0LgotICBXQVZFRk9STUFURVgqIGZvcm1hdCA9ICZmb3JtYXRfLkZvcm1hdDsKLSAgZm9ybWF0LT53Rm9ybWF0VGFnID0gV0FWRV9GT1JNQVRfRVhURU5TSUJMRTsKLSAgZm9ybWF0LT5uQ2hhbm5lbHMgPSAgcGFyYW1zLmNoYW5uZWxzKCk7Ci0gIGZvcm1hdC0+blNhbXBsZXNQZXJTZWMgPSBwYXJhbXMuc2FtcGxlX3JhdGUoKTsKLSAgZm9ybWF0LT53Qml0c1BlclNhbXBsZSA9IHBhcmFtcy5iaXRzX3Blcl9zYW1wbGUoKTsKLSAgZm9ybWF0LT5uQmxvY2tBbGlnbiA9IChmb3JtYXQtPndCaXRzUGVyU2FtcGxlIC8gOCkgKiBmb3JtYXQtPm5DaGFubmVsczsKLSAgZm9ybWF0LT5uQXZnQnl0ZXNQZXJTZWMgPSBmb3JtYXQtPm5TYW1wbGVzUGVyU2VjICogZm9ybWF0LT5uQmxvY2tBbGlnbjsKLSAgZm9ybWF0LT5jYlNpemUgPSBzaXplb2YoV0FWRUZPUk1BVEVYVEVOU0lCTEUpIC0gc2l6ZW9mKFdBVkVGT1JNQVRFWCk7Ci0KLSAgLy8gQWRkIHRoZSBwYXJ0cyB3aGljaCBhcmUgdW5pcXVlIHRvIFdBVkVfRk9STUFUX0VYVEVOU0lCTEUuCi0gIGZvcm1hdF8uU2FtcGxlcy53VmFsaWRCaXRzUGVyU2FtcGxlID0gcGFyYW1zLmJpdHNfcGVyX3NhbXBsZSgpOwotICBmb3JtYXRfLmR3Q2hhbm5lbE1hc2sgPSBLU0FVRElPX1NQRUFLRVJfU1RFUkVPOwotICBmb3JtYXRfLlN1YkZvcm1hdCA9IEtTREFUQUZPUk1BVF9TVUJUWVBFX1BDTTsKLQotICAvLyBTdG9yZSBzaXplIChpbiBkaWZmZXJlbnQgdW5pdHMpIG9mIGF1ZGlvIHBhY2tldHMgd2hpY2ggd2UgZXhwZWN0IHRvCi0gIC8vIGdldCBmcm9tIHRoZSBhdWRpbyBlbmRwb2ludCBkZXZpY2UgaW4gZWFjaCByZW5kZXIgZXZlbnQuCi0gIHBhY2tldF9zaXplX2ZyYW1lc18gPSBwYXJhbXMuR2V0Qnl0ZXNQZXJCdWZmZXIoKSAvIGZvcm1hdC0+bkJsb2NrQWxpZ247Ci0gIGZsb2F0IHBhY2tldF9zaXplX21zID0gKDEwMDAuMCAqIHBhY2tldF9zaXplX2ZyYW1lc18pIC8gcGFyYW1zLnNhbXBsZV9yYXRlKCk7Ci0gIERWTE9HKDEpIDw8ICJOdW1iZXIgb2YgYnl0ZXMgcGVyIGF1ZGlvIGZyYW1lICA6ICIgPDwgZm9ybWF0LT5uQmxvY2tBbGlnbjsKLSAgRFZMT0coMSkgPDwgIk51bWJlciBvZiBhdWRpbyBmcmFtZXMgcGVyIHBhY2tldDogIiA8PCBwYWNrZXRfc2l6ZV9mcmFtZXNfOwotICBEVkxPRygxKSA8PCAiTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBwZXIgcGFja2V0OiAiIDw8IHBhY2tldF9zaXplX21zOwotCi0gIC8vIEFsbCBldmVudHMgYXJlIGF1dG8tcmVzZXQgZXZlbnRzIGFuZCBub24tc2lnbmFsZWQgaW5pdGlhbGx5LgotCi0gIC8vIENyZWF0ZSB0aGUgZXZlbnQgd2hpY2ggdGhlIGF1ZGlvIGVuZ2luZSB3aWxsIHNpZ25hbCBlYWNoIHRpbWUgYSBidWZmZXIKLSAgLy8gaGFzIGJlZW4gcmVjb3JkZWQuCi0gIGNhcHR1cmVfZXZlbnRfLlNldChDcmVhdGVFdmVudChOVUxMLCBGQUxTRSwgRkFMU0UsIE5VTEwpKTsKLQotICAvLyBDcmVhdGUgdGhlIGV2ZW50IHdoaWNoIHdpbGwgYmUgc2V0IGluIFN0b3AoKSB3aGVuIHN0cmFlbWluZyBzaGFsbCBzdG9wLgotICBzdG9wX3N0cmVhbWluZ19ldmVudF8uU2V0KENyZWF0ZUV2ZW50KE5VTEwsIEZBTFNFLCBGQUxTRSwgTlVMTCkpOwotfQotCi1XQVNBUElVbmlmaWVkU3RyZWFtOjp+V0FTQVBJVW5pZmllZFN0cmVhbSgpIHsKLX0KLQotYm9vbCBXQVNBUElVbmlmaWVkU3RyZWFtOjpPcGVuKCkgewotICBEQ0hFQ0tfRVEoR2V0Q3VycmVudFRocmVhZElkKCksIGNyZWF0aW5nX3RocmVhZF9pZF8pOwotICBpZiAob3BlbmVkXykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoIUhhc1VuaWZpZWREZWZhdWx0SU8oKSkgewotICAgIExPRyhFUlJPUikgPDwgIlVuaWZpZWQgYXVkaW8gSS9PIGlzIG5vdCBzdXBwb3J0ZWQuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBSZW5kZXIgc2lkZToKLQotICBTY29wZWRDb21QdHI8SUF1ZGlvQ2xpZW50PiBhdWRpb19vdXRwdXRfY2xpZW50ID0KLSAgICAgIENvcmVBdWRpb1V0aWw6OkNyZWF0ZURlZmF1bHRDbGllbnQoZVJlbmRlciwgZUNvbnNvbGUpOwotICBpZiAoIWF1ZGlvX291dHB1dF9jbGllbnQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghQ29yZUF1ZGlvVXRpbDo6SXNGb3JtYXRTdXBwb3J0ZWQoYXVkaW9fb3V0cHV0X2NsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZV9tb2RlXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0XykpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBIUkVTVUxUIGhyID0gU19GQUxTRTsKLSAgaWYgKHNoYXJlX21vZGVfID09IEFVRENMTlRfU0hBUkVNT0RFX1NIQVJFRCkgewotICAgIGhyID0gQ29yZUF1ZGlvVXRpbDo6U2hhcmVkTW9kZUluaXRpYWxpemUoCi0gICAgICAgIGF1ZGlvX291dHB1dF9jbGllbnQsICZmb3JtYXRfLCBOVUxMLAotICAgICAgICAmZW5kcG9pbnRfcmVuZGVyX2J1ZmZlcl9zaXplX2ZyYW1lc18pOwotICB9IGVsc2UgewotICAgIC8vIFRPRE8oaGVucmlrYSk6IGFkZCBzdXBwb3J0IGZvciBBVURDTE5UX1NIQVJFTU9ERV9FWENMVVNJVkUuCi0gIH0KLSAgaWYgKEZBSUxFRChocikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIFNjb3BlZENvbVB0cjxJQXVkaW9SZW5kZXJDbGllbnQ+IGF1ZGlvX3JlbmRlcl9jbGllbnQgPQotICAgICAgQ29yZUF1ZGlvVXRpbDo6Q3JlYXRlUmVuZGVyQ2xpZW50KGF1ZGlvX291dHB1dF9jbGllbnQpOwotICBpZiAoIWF1ZGlvX3JlbmRlcl9jbGllbnQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8vIENhcHR1cmUgc2lkZToKLQotICBTY29wZWRDb21QdHI8SUF1ZGlvQ2xpZW50PiBhdWRpb19pbnB1dF9jbGllbnQgPQotICAgICAgQ29yZUF1ZGlvVXRpbDo6Q3JlYXRlRGVmYXVsdENsaWVudChlQ2FwdHVyZSwgZUNvbnNvbGUpOwotICBpZiAoIWF1ZGlvX2lucHV0X2NsaWVudCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFDb3JlQXVkaW9VdGlsOjpJc0Zvcm1hdFN1cHBvcnRlZChhdWRpb19pbnB1dF9jbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVfbW9kZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdF8pKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKHNoYXJlX21vZGVfID09IEFVRENMTlRfU0hBUkVNT0RFX1NIQVJFRCkgewotICAgIC8vIEluY2x1ZGUgdmFsaWQgZXZlbnQgaGFuZGxlIGZvciBldmVudC1kcml2ZW4gaW5pdGlhbGl6YXRpb24uCi0gICAgaHIgPSBDb3JlQXVkaW9VdGlsOjpTaGFyZWRNb2RlSW5pdGlhbGl6ZSgKLSAgICAgICAgYXVkaW9faW5wdXRfY2xpZW50LCAmZm9ybWF0XywgY2FwdHVyZV9ldmVudF8uR2V0KCksCi0gICAgICAgICZlbmRwb2ludF9jYXB0dXJlX2J1ZmZlcl9zaXplX2ZyYW1lc18pOwotICB9IGVsc2UgewotICAgIC8vIFRPRE8oaGVucmlrYSk6IGFkZCBzdXBwb3J0IGZvciBBVURDTE5UX1NIQVJFTU9ERV9FWENMVVNJVkUuCi0gIH0KLSAgaWYgKEZBSUxFRChocikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIFNjb3BlZENvbVB0cjxJQXVkaW9DYXB0dXJlQ2xpZW50PiBhdWRpb19jYXB0dXJlX2NsaWVudCA9Ci0gICAgICBDb3JlQXVkaW9VdGlsOjpDcmVhdGVDYXB0dXJlQ2xpZW50KGF1ZGlvX2lucHV0X2NsaWVudCk7Ci0gIGlmICghYXVkaW9fY2FwdHVyZV9jbGllbnQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8vIFN0b3JlIGFsbCB2YWxpZCBDT00gaW50ZXJmYWNlcy4KLSAgYXVkaW9fb3V0cHV0X2NsaWVudF8gPSBhdWRpb19vdXRwdXRfY2xpZW50OwotICBhdWRpb19yZW5kZXJfY2xpZW50XyA9IGF1ZGlvX3JlbmRlcl9jbGllbnQ7Ci0gIGF1ZGlvX2lucHV0X2NsaWVudF8gPSBhdWRpb19pbnB1dF9jbGllbnQ7Ci0gIGF1ZGlvX2NhcHR1cmVfY2xpZW50XyA9IGF1ZGlvX2NhcHR1cmVfY2xpZW50OwotCi0gIG9wZW5lZF8gPSB0cnVlOwotICByZXR1cm4gU1VDQ0VFREVEKGhyKTsKLX0KLQotdm9pZCBXQVNBUElVbmlmaWVkU3RyZWFtOjpTdGFydChBdWRpb1NvdXJjZUNhbGxiYWNrKiBjYWxsYmFjaykgewotICBEQ0hFQ0tfRVEoR2V0Q3VycmVudFRocmVhZElkKCksIGNyZWF0aW5nX3RocmVhZF9pZF8pOwotICBDSEVDSyhjYWxsYmFjayk7Ci0gIENIRUNLKG9wZW5lZF8pOwotCi0gIGlmIChhdWRpb19pb190aHJlYWRfLmdldCgpKSB7Ci0gICAgQ0hFQ0tfRVEoY2FsbGJhY2ssIHNvdXJjZV8pOwotICAgIHJldHVybjsKLSAgfQotCi0gIHNvdXJjZV8gPSBjYWxsYmFjazsKLQotICAvLyBDcmVhdGUgYW5kIHN0YXJ0IHRoZSB0aHJlYWQgdGhhdCB3aWxsIGNhcHR1cmluZyBhbmQgcmVuZGVyaW5nLgotICBhdWRpb19pb190aHJlYWRfLnJlc2V0KAotICAgICAgbmV3IGJhc2U6OkRlbGVnYXRlU2ltcGxlVGhyZWFkKHRoaXMsICJ3YXNhcGlfaW9fdGhyZWFkIikpOwotICBhdWRpb19pb190aHJlYWRfLT5TdGFydCgpOwotICBpZiAoIWF1ZGlvX2lvX3RocmVhZF8tPkhhc0JlZW5TdGFydGVkKCkpIHsKLSAgICBETE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHN0YXJ0IFdBU0FQSSBJTyB0aHJlYWQuIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBTdGFydCBpbnB1dCBzdHJlYW1pbmcgZGF0YSBiZXR3ZWVuIHRoZSBlbmRwb2ludCBidWZmZXIgYW5kIHRoZSBhdWRpbwotICAvLyBlbmdpbmUuCi0gIEhSRVNVTFQgaHIgPSBhdWRpb19pbnB1dF9jbGllbnRfLT5TdGFydCgpOwotICBpZiAoRkFJTEVEKGhyKSkgewotICAgIFN0b3BBbmRKb2luVGhyZWFkKGhyKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBSZXNldCB0aGUgY291bnRlciBmb3IgbnVtYmVyIG9mIHJlbmRlcmVkIGZyYW1lcyB0YWtpbmcgaW50byBhY2NvdW50IHRoZQotICAvLyBmYWN0IHRoYXQgd2UgYWx3YXlzIGluaXRpYWxpemUgdGhlIHJlbmRlciBzaWRlIHdpdGggc2lsZW5jZS4KLSAgVUlOVDMyIG51bV9xdWV1ZWRfZnJhbWVzID0gMDsKLSAgYXVkaW9fb3V0cHV0X2NsaWVudF8tPkdldEN1cnJlbnRQYWRkaW5nKCZudW1fcXVldWVkX2ZyYW1lcyk7Ci0gIERDSEVDS19FUShudW1fcXVldWVkX2ZyYW1lcywgZW5kcG9pbnRfcmVuZGVyX2J1ZmZlcl9zaXplX2ZyYW1lc18pOwotICBudW1fd3JpdHRlbl9mcmFtZXNfID0gbnVtX3F1ZXVlZF9mcmFtZXM7Ci0KLSAgLy8gU3RhcnQgb3V0cHV0IHN0cmVhbWluZyBkYXRhIGJldHdlZW4gdGhlIGVuZHBvaW50IGJ1ZmZlciBhbmQgdGhlIGF1ZGlvCi0gIC8vIGVuZ2luZS4KLSAgaHIgPSBhdWRpb19vdXRwdXRfY2xpZW50Xy0+U3RhcnQoKTsKLSAgaWYgKEZBSUxFRChocikpIHsKLSAgICBTdG9wQW5kSm9pblRocmVhZChocik7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLXZvaWQgV0FTQVBJVW5pZmllZFN0cmVhbTo6U3RvcCgpIHsKLSAgRENIRUNLX0VRKEdldEN1cnJlbnRUaHJlYWRJZCgpLCBjcmVhdGluZ190aHJlYWRfaWRfKTsKLSAgaWYgKCFhdWRpb19pb190aHJlYWRfLmdldCgpKQotICAgIHJldHVybjsKLQotICAvLyBTdG9wIGlucHV0IGF1ZGlvIHN0cmVhbWluZy4KLSAgSFJFU1VMVCBociA9IGF1ZGlvX2lucHV0X2NsaWVudF8tPlN0b3AoKTsKLSAgaWYgKEZBSUxFRChocikpIHsKLSAgICBETE9HX0lGKEVSUk9SLCBociAhPSBBVURDTE5UX0VfTk9UX0lOSVRJQUxJWkVEKQotICAgICAgPDwgIkZhaWxlZCB0byBzdG9wIGlucHV0IHN0cmVhbWluZzogIiA8PCBzdGQ6OmhleCA8PCBocjsKLSAgfQotCi0gIC8vIFN0b3Agb3V0cHV0IGF1ZGlvIHN0cmVhbWluZy4KLSAgaHIgPSBhdWRpb19vdXRwdXRfY2xpZW50Xy0+U3RvcCgpOwotICBpZiAoRkFJTEVEKGhyKSkgewotICAgIERMT0dfSUYoRVJST1IsIGhyICE9IEFVRENMTlRfRV9OT1RfSU5JVElBTElaRUQpCi0gICAgICAgIDw8ICJGYWlsZWQgdG8gc3RvcCBvdXRwdXQgc3RyZWFtaW5nOiAiIDw8IHN0ZDo6aGV4IDw8IGhyOwotICB9Ci0KLSAgLy8gV2FpdCB1bnRpbCB0aGUgdGhyZWFkIGNvbXBsZXRlcyBhbmQgcGVyZm9ybSBjbGVhbnVwLgotICBTZXRFdmVudChzdG9wX3N0cmVhbWluZ19ldmVudF8uR2V0KCkpOwotICBhdWRpb19pb190aHJlYWRfLT5Kb2luKCk7Ci0gIGF1ZGlvX2lvX3RocmVhZF8ucmVzZXQoKTsKLQotICAvLyBFbnN1cmUgdGhhdCB3ZSBkb24ndCBxdWl0IHRoZSBtYWluIHRocmVhZCBsb29wIGltbWVkaWF0ZWx5IG5leHQKLSAgLy8gdGltZSBTdGFydCgpIGlzIGNhbGxlZC4KLSAgUmVzZXRFdmVudChzdG9wX3N0cmVhbWluZ19ldmVudF8uR2V0KCkpOwotCi0gIC8vIENsZWFyIHNvdXJjZSBjYWxsYmFjaywgaXQnbGwgYmUgc2V0IGFnYWluIG9uIHRoZSBuZXh0IFN0YXJ0KCkgY2FsbC4KLSAgc291cmNlXyA9IE5VTEw7Ci0KLSAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgZGF0YSBhbmQgcmVzZXQgdGhlIGF1ZGlvIGNsb2NrIHN0cmVhbSBwb3NpdGlvbiB0byAwLgotICBociA9IGF1ZGlvX291dHB1dF9jbGllbnRfLT5SZXNldCgpOwotICBpZiAoRkFJTEVEKGhyKSkgewotICAgIERMT0dfSUYoRVJST1IsIGhyICE9IEFVRENMTlRfRV9OT1RfSU5JVElBTElaRUQpCi0gICAgICAgIDw8ICJGYWlsZWQgdG8gcmVzZXQgb3V0cHV0IHN0cmVhbWluZzogIiA8PCBzdGQ6OmhleCA8PCBocjsKLSAgfQotCi0gIGF1ZGlvX2lucHV0X2NsaWVudF8tPlJlc2V0KCk7Ci0gIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgRExPR19JRihFUlJPUiwgaHIgIT0gQVVEQ0xOVF9FX05PVF9JTklUSUFMSVpFRCkKLSAgICAgICAgPDwgIkZhaWxlZCB0byByZXNldCBpbnB1dCBzdHJlYW1pbmc6ICIgPDwgc3RkOjpoZXggPDwgaHI7Ci0gIH0KLQotICAvLyBFeHRyYSBzYWZldHkgY2hlY2sgdG8gZW5zdXJlIHRoYXQgdGhlIGJ1ZmZlcnMgYXJlIGNsZWFyZWQuCi0gIC8vIElmIHRoZSBidWZmZXJzIGFyZSBub3QgY2xlYXJlZCBjb3JyZWN0bHksIHRoZSBuZXh0IGNhbGwgdG8gU3RhcnQoKQotICAvLyB3b3VsZCBmYWlsIHdpdGggQVVEQ0xOVF9FX0JVRkZFUl9FUlJPUiBhdCBJQXVkaW9SZW5kZXJDbGllbnQ6OkdldEJ1ZmZlcigpLgotICAvLyBUT0RPKGhlbnJpa2EpOiB0aGlzIGNoZWNrIGlzIGlzIG9ubHkgbmVlZGVkIGZvciBzaGFyZWQtbW9kZSBzdHJlYW1zLgotICBVSU5UMzIgbnVtX3F1ZXVlZF9mcmFtZXMgPSAwOwotICBhdWRpb19vdXRwdXRfY2xpZW50Xy0+R2V0Q3VycmVudFBhZGRpbmcoJm51bV9xdWV1ZWRfZnJhbWVzKTsKLSAgRENIRUNLX0VRKDB1LCBudW1fcXVldWVkX2ZyYW1lcyk7Ci19Ci0KLXZvaWQgV0FTQVBJVW5pZmllZFN0cmVhbTo6Q2xvc2UoKSB7Ci0gIERDSEVDS19FUShHZXRDdXJyZW50VGhyZWFkSWQoKSwgY3JlYXRpbmdfdGhyZWFkX2lkXyk7Ci0KLSAgLy8gSXQgaXMgdmFsaWQgdG8gY2FsbCBDbG9zZSgpIGJlZm9yZSBjYWxsaW5nIG9wZW4gb3IgU3RhcnQoKS4KLSAgLy8gSXQgaXMgYWxzbyB2YWxpZCB0byBjYWxsIENsb3NlKCkgYWZ0ZXIgU3RhcnQoKSBoYXMgYmVlbiBjYWxsZWQuCi0gIFN0b3AoKTsKLQotICAvLyBJbmZvcm0gdGhlIGF1ZGlvIG1hbmFnZXIgdGhhdCB3ZSBoYXZlIGJlZW4gY2xvc2VkLiBUaGlzIHdpbGwgY2F1c2Ugb3VyCi0gIC8vIGRlc3RydWN0aW9uLgotICBtYW5hZ2VyXy0+UmVsZWFzZU91dHB1dFN0cmVhbSh0aGlzKTsKLX0KLQotdm9pZCBXQVNBUElVbmlmaWVkU3RyZWFtOjpTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgewotICBOT1RJTVBMRU1FTlRFRCgpOwotfQotCi12b2lkIFdBU0FQSVVuaWZpZWRTdHJlYW06OkdldFZvbHVtZShkb3VibGUqIHZvbHVtZSkgewotICBOT1RJTVBMRU1FTlRFRCgpOwotfQotCi0vLyBzdGF0aWMKLWJvb2wgV0FTQVBJVW5pZmllZFN0cmVhbTo6SGFzVW5pZmllZERlZmF1bHRJTygpIHsKLSAgQXVkaW9QYXJhbWV0ZXJzIGluX3BhcmFtczsKLSAgSFJFU1VMVCBociA9IENvcmVBdWRpb1V0aWw6OkdldFByZWZlcnJlZEF1ZGlvUGFyYW1ldGVycyhlQ2FwdHVyZSwgZUNvbnNvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluX3BhcmFtcyk7Ci0gIGlmIChGQUlMRUQoaHIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBBdWRpb1BhcmFtZXRlcnMgb3V0X3BhcmFtczsKLSAgaHIgPSBDb3JlQXVkaW9VdGlsOjpHZXRQcmVmZXJyZWRBdWRpb1BhcmFtZXRlcnMoZVJlbmRlciwgZUNvbnNvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRfcGFyYW1zKTsKLSAgaWYgKEZBSUxFRChocikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBDb21wYXJlQXVkaW9QYXJhbWV0ZXJzKGluX3BhcmFtcywgb3V0X3BhcmFtcyk7Ci19Ci0KLXZvaWQgV0FTQVBJVW5pZmllZFN0cmVhbTo6UnVuKCkgewotICBTY29wZWRDT01Jbml0aWFsaXplciBjb21faW5pdChTY29wZWRDT01Jbml0aWFsaXplcjo6a01UQSk7Ci0KLSAgLy8gSW5jcmVhc2UgdGhlIHRocmVhZCBwcmlvcml0eS4KLSAgYXVkaW9faW9fdGhyZWFkXy0+U2V0VGhyZWFkUHJpb3JpdHkoYmFzZTo6a1RocmVhZFByaW9yaXR5X1JlYWx0aW1lQXVkaW8pOwotCi0gIC8vIEVuYWJsZSBNTUNTUyB0byBlbnN1cmUgdGhhdCB0aGlzIHRocmVhZCByZWNlaXZlcyBwcmlvcml0aXplZCBhY2Nlc3MgdG8KLSAgLy8gQ1BVIHJlc291cmNlcy4KLSAgLy8gVE9ETyhoZW5yaWthKTogaW52ZXN0aWdhdGUgaWYgaXQgaXMgcG9zc2libGUgdG8gaW5jbHVkZSB0aGVzZSBhZGRpdGlvbmFsCi0gIC8vIHNldHRpbmdzIGluIFNldFRocmVhZFByaW9yaXR5KCkgYXMgd2VsbC4KLSAgRFdPUkQgdGFza19pbmRleCA9IDA7Ci0gIEhBTkRMRSBtbV90YXNrID0gYXZydDo6QXZTZXRNbVRocmVhZENoYXJhY3RlcmlzdGljcyhMIlBybyBBdWRpbyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFza19pbmRleCk7Ci0gIGJvb2wgbW1jc3NfaXNfb2sgPQotICAgICAgKG1tX3Rhc2sgJiYgYXZydDo6QXZTZXRNbVRocmVhZFByaW9yaXR5KG1tX3Rhc2ssIEFWUlRfUFJJT1JJVFlfQ1JJVElDQUwpKTsKLSAgaWYgKCFtbWNzc19pc19vaykgewotICAgIC8vIEZhaWxlZCB0byBlbmFibGUgTU1DU1Mgb24gdGhpcyB0aHJlYWQuIEl0IGlzIG5vdCBmYXRhbCBidXQgY2FuIGxlYWQKLSAgICAvLyB0byByZWR1Y2VkIFFvUyBhdCBoaWdoIGxvYWQuCi0gICAgRFdPUkQgZXJyID0gR2V0TGFzdEVycm9yKCk7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gZW5hYmxlIE1NQ1NTIChlcnJvciBjb2RlPSIgPDwgZXJyIDw8ICIpLiI7Ci0gIH0KLQotICAvLyBUaGUgSUF1ZGlvQ2xvY2sgaW50ZXJmYWNlIGVuYWJsZXMgdXMgdG8gbW9uaXRvciBhIHN0cmVhbSdzIGRhdGEKLSAgLy8gcmF0ZSBhbmQgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHN0cmVhbS4gQWxsb2NhdGUgaXQgYmVmb3JlIHdlCi0gIC8vIHN0YXJ0IHNwaW5uaW5nLgotICBTY29wZWRDb21QdHI8SUF1ZGlvQ2xvY2s+IGF1ZGlvX291dHB1dF9jbG9jazsKLSAgSFJFU1VMVCBociA9IGF1ZGlvX291dHB1dF9jbGllbnRfLT5HZXRTZXJ2aWNlKAotICAgICAgX191dWlkb2YoSUF1ZGlvQ2xvY2spLCBhdWRpb19vdXRwdXRfY2xvY2suUmVjZWl2ZVZvaWQoKSk7Ci0gIExPR19JRihXQVJOSU5HLCBGQUlMRUQoaHIpKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBJQXVkaW9DbG9jazogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpoZXggPDwgaHI7Ci0KLSAgLy8gU3RvcmVzIGEgZGVsYXkgbWVhc3VyZW1lbnQgKHVuaXQgaXMgaW4gYnl0ZXMpLiBUaGlzIHZhcmlhYmxlIGlzIG5vdAotICAvLyB1cGRhdGVkIGF0IGVhY2ggZXZlbnQsIGJ1dCB0aGUgdXBkYXRlIGZyZXF1ZW5jeSBpcyBzZXQgYnkgYSBjb25zdGFudAotICAvLyBjYWxsZWQgfGtUaW1lRGlmZkluTWlsbGlzZWNvbmRzQmV0d2VlbkRlbGF5TWVhc3VyZW1lbnRzfC4KLSAgaW50IHRvdGFsX2RlbGF5X2J5dGVzID0gMDsKLQotICBib29sIHN0cmVhbWluZyA9IHRydWU7Ci0gIGJvb2wgZXJyb3IgPSBmYWxzZTsKLSAgSEFORExFIHdhaXRfYXJyYXlbXSA9IHsgc3RvcF9zdHJlYW1pbmdfZXZlbnRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlX2V2ZW50XyB9OwotCi0gIGNvbnN0IGludCBieXRlc19wZXJfc2FtcGxlID0gZm9ybWF0Xy5Gb3JtYXQud0JpdHNQZXJTYW1wbGUgPj4gMzsKLQotICAvLyBLZWVwIHN0cmVhbWluZyBhdWRpbyB1bnRpbCB0aGUgc3RvcCwgb3IgZXJyb3IsIGV2ZW50IGlzIHNpZ25hbGVkLgotICAvLyBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB1c2VzIGNhcHR1cmUgZXZlbnRzIGFzIGRyaXZpbmcgbWVjaGFuaXNtIHNpbmNlCi0gIC8vIGV4dGVuc2l2ZSB0ZXN0aW5nIGhhcyBzaG93biB0aGF0IGl0IGdpdmVzIHVzIGEgbW9yZSByZWxpYWJsZSBjYWxsYmFjawotICAvLyBzZXF1ZW5jZSBjb21wYXJlZCB3aXRoIGEgc2NoZW1lIHdoZXJlIGJvdGggY2FwdHVyZSBhbmQgcmVuZGVyIGV2ZW50cyBhcmUKLSAgLy8gdXRpbGl6ZWQuCi0gIHdoaWxlIChzdHJlYW1pbmcgJiYgIWVycm9yKSB7Ci0gICAgLy8gV2FpdCBmb3IgYSBjbG9zZS1kb3duIGV2ZW50LCBvciBhIG5ldyBjYXB0dXJlIGV2ZW50LgotICAgIERXT1JEIHdhaXRfcmVzdWx0ID0gV2FpdEZvck11bHRpcGxlT2JqZWN0cyhhcnJheXNpemUod2FpdF9hcnJheSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRfYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZJTklURSk7Ci0gICAgc3dpdGNoICh3YWl0X3Jlc3VsdCkgewotICAgICAgY2FzZSBXQUlUX09CSkVDVF8wICsgMDoKLSAgICAgICAgLy8gfHN0b3Bfc3RyZWFtaW5nX2V2ZW50X3wgaGFzIGJlZW4gc2V0LgotICAgICAgICBzdHJlYW1pbmcgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFdBSVRfT0JKRUNUXzAgKyAxOgotICAgICAgICAvLyB8Y2FwdHVyZV9ldmVudF98IGhhcyBiZWVuIHNldAotICAgICAgICB7Ci0gICAgICAgICAgVFJBQ0VfRVZFTlQwKCJhdWRpbyIsICJXQVNBUElVbmlmaWVkU3RyZWFtOjpSdW4iKTsKLQotICAgICAgICAgIC8vIC0tLSBDYXB0dXJlIC0tLQotCi0gICAgICAgICAgQllURSogZGF0YV9wdHIgPSBOVUxMOwotICAgICAgICAgIFVJTlQzMiBudW1fY2FwdHVyZWRfZnJhbWVzID0gMDsKLSAgICAgICAgICBEV09SRCBmbGFncyA9IDA7Ci0gICAgICAgICAgVUlOVDY0IGRldmljZV9wb3NpdGlvbiA9IDA7Ci0gICAgICAgICAgVUlOVDY0IGNhcHR1cmVfdGltZV9zdGFtcCA9IDA7Ci0KLSAgICAgICAgICBiYXNlOjpUaW1lVGlja3Mgbm93X3RpY2sgPSBiYXNlOjpUaW1lVGlja3M6OkhpZ2hSZXNOb3coKTsKLQotICAgICAgICAgIC8vIFJldHJpZXZlIHRoZSBhbW91bnQgb2YgZGF0YSBpbiB0aGUgY2FwdHVyZSBlbmRwb2ludCBidWZmZXIuCi0gICAgICAgICAgLy8gfGVuZHBvaW50X2NhcHR1cmVfdGltZV9zdGFtcHwgaXMgdGhlIHZhbHVlIG9mIHRoZSBwZXJmb3JtYW5jZQotICAgICAgICAgIC8vIGNvdW50ZXIgYXQgdGhlIHRpbWUgdGhhdCB0aGUgYXVkaW8gZW5kcG9pbnQgZGV2aWNlIHJlY29yZGVkCi0gICAgICAgICAgLy8gdGhlIGRldmljZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgYXVkaW8gZnJhbWUgaW4gdGhlIGRhdGEgcGFja2V0LgotICAgICAgICAgIGhyID0gYXVkaW9fY2FwdHVyZV9jbGllbnRfLT5HZXRCdWZmZXIoJmRhdGFfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bV9jYXB0dXJlZF9mcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlX3Bvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhcHR1cmVfdGltZV9zdGFtcCk7Ci0gICAgICAgICAgaWYgKEZBSUxFRChocikpIHsKLSAgICAgICAgICAgIERMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZ2V0IGRhdGEgZnJvbSB0aGUgY2FwdHVyZSBidWZmZXIiOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKG51bV9jYXB0dXJlZF9mcmFtZXMgIT0gMCkgewotICAgICAgICAgICAgaWYgKGZsYWdzICYgQVVEQ0xOVF9CVUZGRVJGTEFHU19TSUxFTlQpIHsKLSAgICAgICAgICAgICAgLy8gQ2xlYXIgb3V0IHRoZSBjYXB0dXJlIGJ1ZmZlciBzaW5jZSBzaWxlbmNlIGlzIHJlcG9ydGVkLgotICAgICAgICAgICAgICBjYXB0dXJlX2J1c18tPlplcm8oKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIC8vIFN0b3JlIGNhcHR1cmVkIGRhdGEgaW4gYW4gYXVkaW8gYnVzIGFmdGVyIGRlLWludGVybGVhdmluZwotICAgICAgICAgICAgICAvLyB0aGUgZGF0YSB0byBtYXRjaCB0aGUgYXVkaW8gYnVzIHN0cnVjdHVyZS4KLSAgICAgICAgICAgICAgY2FwdHVyZV9idXNfLT5Gcm9tSW50ZXJsZWF2ZWQoCi0gICAgICAgICAgICAgICAgICBkYXRhX3B0ciwgbnVtX2NhcHR1cmVkX2ZyYW1lcywgYnl0ZXNfcGVyX3NhbXBsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaHIgPSBhdWRpb19jYXB0dXJlX2NsaWVudF8tPlJlbGVhc2VCdWZmZXIobnVtX2NhcHR1cmVkX2ZyYW1lcyk7Ci0gICAgICAgICAgRExPR19JRihFUlJPUiwgRkFJTEVEKGhyKSkgPDwgIkZhaWxlZCB0byByZWxlYXNlIGNhcHR1cmUgYnVmZmVyIjsKLQotICAgICAgICAgIC8vIFNhdmUgcmVzb3VyY2UgYnkgbm90IGFza2luZyBmb3IgbmV3IGRlbGF5IGVzdGltYXRlcyBlYWNoIHRpbWUuCi0gICAgICAgICAgLy8gVGhlc2UgZXN0aW1hdGVzIGFyZSBmYWlybHkgc3RhYmxlIGFuZCBpdCBpcyBwZXJmZWN0bHkgc2FmZSB0byBvbmx5Ci0gICAgICAgICAgLy8gc2FtcGxlIGF0IGEgcmF0ZSBvZiB+MUh6LgotICAgICAgICAgIC8vIFRPRE8oaGVucmlrYSk6IGl0IG1pZ2h0IGJlIHBvc3NpYmxlIHRvIHVzZSBhIGZpeGVkIGRlbGF5IGluc3RlYWQuCi0gICAgICAgICAgaWYgKChub3dfdGljayAtIGxhc3RfZGVsYXlfc2FtcGxlX3RpbWVfKS5Jbk1pbGxpc2Vjb25kcygpID4KLSAgICAgICAgICAgICAga1RpbWVEaWZmSW5NaWxsaXNlY29uZHNCZXR3ZWVuRGVsYXlNZWFzdXJlbWVudHMpIHsKLSAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZXN0aW1hdGVkIGNhcHR1cmUgZGVsYXksIGkuZS4sIHRoZSBsYXRlbmN5IGJldHdlZW4KLSAgICAgICAgICAgIC8vIHRoZSByZWNvcmRpbmcgdGltZSBhbmQgdGhlIHRpbWUgd2Ugd2hlbiB3ZSBhcmUgbm90aWZpZWQgYWJvdXQKLSAgICAgICAgICAgIC8vIHRoZSByZWNvcmRlZCBkYXRhLiBOb3RlIHRoYXQgdGhlIGNhcHR1cmUgdGltZSBzdGFtcCBpcyBnaXZlbiBpbgotICAgICAgICAgICAgLy8gMTAwLW5hbm9zZWNvbmQgKDAuMSBtaWNyb3NlY29uZHMpIHVuaXRzLgotICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhIGRpZmYgPSBub3dfdGljayAtCi0gICAgICAgICAgICAgICAgYmFzZTo6VGltZVRpY2tzOjpGcm9tSW50ZXJuYWxWYWx1ZSgwLjEgKiBjYXB0dXJlX3RpbWVfc3RhbXApOwotICAgICAgICAgICAgY29uc3QgZG91YmxlIGNhcHR1cmVfZGVsYXlfbXMgPSBkaWZmLkluTWlsbGlzZWNvbmRzRigpOwotCi0gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGVzdGltYXRlZCByZW5kZXIgZGVsYXksIGkuZS4sIHRoZSB0aW1lIGRpZmZlcmVuY2UKLSAgICAgICAgICAgIC8vIGJldHdlZW4gdGhlIHRpbWUgd2hlbiBkYXRhIGlzIGFkZGVkIHRvIHRoZSBlbmRwb2ludCBidWZmZXIgYW5kCi0gICAgICAgICAgICAvLyB3aGVuIHRoZSBkYXRhIGlzIHBsYXllZCBvdXQgb24gdGhlIGFjdHVhbCBzcGVha2VyLgotICAgICAgICAgICAgY29uc3QgZG91YmxlIHN0cmVhbV9wb3MgPSBDdXJyZW50U3RyZWFtUG9zSW5NaWxsaXNlY29uZHMoCi0gICAgICAgICAgICAgICAgbnVtX3dyaXR0ZW5fZnJhbWVzXyArIHBhY2tldF9zaXplX2ZyYW1lc18sCi0gICAgICAgICAgICAgICAgZm9ybWF0Xy5Gb3JtYXQublNhbXBsZXNQZXJTZWMpOwotICAgICAgICAgICAgY29uc3QgZG91YmxlIHNwZWFrZXJfcG9zID0KLSAgICAgICAgICAgICAgICBTcGVha2VyU3RyZWFtUG9zSW5NaWxsaXNlY29uZHMoYXVkaW9fb3V0cHV0X2Nsb2NrKTsKLSAgICAgICAgICAgIGNvbnN0IGRvdWJsZSByZW5kZXJfZGVsYXlfbXMgPSBzdHJlYW1fcG9zIC0gc3BlYWtlcl9wb3M7Ci0KLSAgICAgICAgICAgIC8vIERlcml2ZSB0aGUgdG90YWwgZGVsYXksIGkuZS4sIHRoZSBzdW0gb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQKLSAgICAgICAgICAgIC8vIGRlbGF5cy4gQWxzbyBjb252ZXJ0IHRoZSB2YWx1ZSBpbnRvIGJ5dGUgdW5pdHMuCi0gICAgICAgICAgICB0b3RhbF9kZWxheV9tc18gPSBjYXB0dXJlX2RlbGF5X21zICsgcmVuZGVyX2RlbGF5X21zOwotICAgICAgICAgICAgbGFzdF9kZWxheV9zYW1wbGVfdGltZV8gPSBub3dfdGljazsKLSAgICAgICAgICAgIERWTE9HKDMpIDw8ICJ0b3RhbF9kZWxheV9tcyAgOiAiIDw8IHRvdGFsX2RlbGF5X21zXzsKLSAgICAgICAgICAgIHRvdGFsX2RlbGF5X2J5dGVzID0gTWlsbGlzZWNvbmRzVG9CeXRlcyh0b3RhbF9kZWxheV9tc18sIGZvcm1hdF8pOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vIFByZXBhcmUgZm9yIHJlbmRlcmluZyBieSBjYWxsaW5nIE9uTW9yZUlPRGF0YSgpLgotICAgICAgICAgIGludCBmcmFtZXNfZmlsbGVkID0gc291cmNlXy0+T25Nb3JlSU9EYXRhKAotICAgICAgICAgICAgICBjYXB0dXJlX2J1c18uZ2V0KCksCi0gICAgICAgICAgICAgIHJlbmRlcl9idXNfLmdldCgpLAotICAgICAgICAgICAgICBBdWRpb0J1ZmZlcnNTdGF0ZSgwLCB0b3RhbF9kZWxheV9ieXRlcykpOwotICAgICAgICAgIERDSEVDS19FUShmcmFtZXNfZmlsbGVkLCByZW5kZXJfYnVzXy0+ZnJhbWVzKCkpOwotCi0gICAgICAgICAgLy8gLS0tIFJlbmRlciAtLS0KLQotICAgICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgbnVtYmVyIG9mIHJlbmRlcmVkIGZyYW1lcyBzaW5jZSB3ZSBuZWVkIGl0IGZvcgotICAgICAgICAgIC8vIG91ciBkZWxheSBjYWxjdWxhdGlvbnMuCi0gICAgICAgICAgbnVtX3dyaXR0ZW5fZnJhbWVzXyArPSBmcmFtZXNfZmlsbGVkOwotCi0gICAgICAgICAgLy8gRGVyaXZlIHRoZSB0aGUgYW1vdW50IG9mIGF2YWlsYWJsZSBzcGFjZSBpbiB0aGUgZW5kcG9pbnQgYnVmZmVyLgotICAgICAgICAgIC8vIEF2b2lkIHJlbmRlciBhdHRlbXB0IGlmIHRoZXJlIGlzIG5vIHJvb20gZm9yIGEgY2FwdHVyZWQgcGFja2V0LgotICAgICAgICAgIFVJTlQzMiBudW1fcXVldWVkX2ZyYW1lcyA9IDA7Ci0gICAgICAgICAgYXVkaW9fb3V0cHV0X2NsaWVudF8tPkdldEN1cnJlbnRQYWRkaW5nKCZudW1fcXVldWVkX2ZyYW1lcyk7Ci0gICAgICAgICAgaWYgKGVuZHBvaW50X3JlbmRlcl9idWZmZXJfc2l6ZV9mcmFtZXNfIC0gbnVtX3F1ZXVlZF9mcmFtZXMgPAotICAgICAgICAgICAgICBwYWNrZXRfc2l6ZV9mcmFtZXNfKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAvLyBHcmFiIGFsbCBhdmFpbGFibGUgc3BhY2UgaW4gdGhlIHJlbmRlcmluZyBlbmRwb2ludCBidWZmZXIKLSAgICAgICAgICAvLyBpbnRvIHdoaWNoIHRoZSBjbGllbnQgY2FuIHdyaXRlIGEgZGF0YSBwYWNrZXQuCi0gICAgICAgICAgdWludDgqIGF1ZGlvX2RhdGEgPSBOVUxMOwotICAgICAgICAgIGhyID0gYXVkaW9fcmVuZGVyX2NsaWVudF8tPkdldEJ1ZmZlcihwYWNrZXRfc2l6ZV9mcmFtZXNfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXVkaW9fZGF0YSk7Ci0gICAgICAgICAgaWYgKEZBSUxFRChocikpIHsKLSAgICAgICAgICAgIERMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gYWNjZXNzIHJlbmRlciBidWZmZXIiOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLy8gQ29udmVydCB0aGUgYXVkaW8gYnVzIGNvbnRlbnQgdG8gaW50ZXJsZWF2ZWQgaW50ZWdlciBkYXRhIHVzaW5nCi0gICAgICAgICAgLy8gfGF1ZGlvX2RhdGF8IGFzIGRlc3RpbmF0aW9uLgotICAgICAgICAgIHJlbmRlcl9idXNfLT5Ub0ludGVybGVhdmVkKAotICAgICAgICAgICAgICBwYWNrZXRfc2l6ZV9mcmFtZXNfLCBieXRlc19wZXJfc2FtcGxlLCBhdWRpb19kYXRhKTsKLQotICAgICAgICAgIC8vIFJlbGVhc2UgdGhlIGJ1ZmZlciBzcGFjZSBhY3F1aXJlZCBpbiB0aGUgR2V0QnVmZmVyKCkgY2FsbC4KLSAgICAgICAgICBhdWRpb19yZW5kZXJfY2xpZW50Xy0+UmVsZWFzZUJ1ZmZlcihwYWNrZXRfc2l6ZV9mcmFtZXNfLCAwKTsKLSAgICAgICAgICBETE9HX0lGKEVSUk9SLCBGQUlMRUQoaHIpKSA8PCAiRmFpbGVkIHRvIHJlbGVhc2UgcmVuZGVyIGJ1ZmZlciI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBlcnJvciA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIGlmIChzdHJlYW1pbmcgJiYgZXJyb3IpIHsKLSAgICAvLyBTdG9wIGF1ZGlvIHN0cmVhbWluZyBzaW5jZSBzb21ldGhpbmcgaGFzIGdvbmUgd3JvbmcgaW4gb3VyIG1haW4gdGhyZWFkCi0gICAgLy8gbG9vcC4gTm90ZSB0aGF0LCB3ZSBhcmUgc3RpbGwgaW4gYSAic3RhcnRlZCIgc3RhdGUsIGhlbmNlIGEgU3RvcCgpIGNhbGwKLSAgICAvLyBpcyByZXF1aXJlZCB0byBqb2luIHRoZSB0aHJlYWQgcHJvcGVybHkuCi0gICAgYXVkaW9faW5wdXRfY2xpZW50Xy0+U3RvcCgpOwotICAgIGF1ZGlvX291dHB1dF9jbGllbnRfLT5TdG9wKCk7Ci0gICAgUExPRyhFUlJPUikgPDwgIldBU0FQSSBzdHJlYW1pbmcgZmFpbGVkLiI7Ci0gIH0KLQotICAvLyBEaXNhYmxlIE1NQ1NTLgotICBpZiAobW1fdGFzayAmJiAhYXZydDo6QXZSZXZlcnRNbVRocmVhZENoYXJhY3RlcmlzdGljcyhtbV90YXNrKSkgewotICAgIFBMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byBkaXNhYmxlIE1NQ1NTIjsKLSAgfQotfQotCi12b2lkIFdBU0FQSVVuaWZpZWRTdHJlYW06OkhhbmRsZUVycm9yKEhSRVNVTFQgZXJyKSB7Ci0gIENIRUNLKChzdGFydGVkKCkgJiYgR2V0Q3VycmVudFRocmVhZElkKCkgPT0gYXVkaW9faW9fdGhyZWFkXy0+dGlkKCkpIHx8Ci0gICAgICAgICghc3RhcnRlZCgpICYmIEdldEN1cnJlbnRUaHJlYWRJZCgpID09IGNyZWF0aW5nX3RocmVhZF9pZF8pKTsKLSAgTk9UUkVBQ0hFRCgpIDw8ICJFcnJvciBjb2RlOiAiIDw8IHN0ZDo6aGV4IDw8IGVycjsKLSAgaWYgKHNvdXJjZV8pCi0gICAgc291cmNlXy0+T25FcnJvcih0aGlzLCBzdGF0aWNfY2FzdDxpbnQ+KGVycikpOwotfQotCi12b2lkIFdBU0FQSVVuaWZpZWRTdHJlYW06OlN0b3BBbmRKb2luVGhyZWFkKEhSRVNVTFQgZXJyKSB7Ci0gIENIRUNLKEdldEN1cnJlbnRUaHJlYWRJZCgpID09IGNyZWF0aW5nX3RocmVhZF9pZF8pOwotICBEQ0hFQ0soYXVkaW9faW9fdGhyZWFkXy5nZXQoKSk7Ci0gIFNldEV2ZW50KHN0b3Bfc3RyZWFtaW5nX2V2ZW50Xy5HZXQoKSk7Ci0gIGF1ZGlvX2lvX3RocmVhZF8tPkpvaW4oKTsKLSAgYXVkaW9faW9fdGhyZWFkXy5yZXNldCgpOwotICBIYW5kbGVFcnJvcihlcnIpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby93aW4vYXVkaW9fdW5pZmllZF93aW4uaCBiL3NyYy9tZWRpYS9hdWRpby93aW4vYXVkaW9fdW5pZmllZF93aW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU4ZTgyOS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vd2luL2F1ZGlvX3VuaWZpZWRfd2luLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9BVURJT19XSU5fQVVESU9fVU5JRklFRF9XSU5fSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fV0lOX0FVRElPX1VOSUZJRURfV0lOX0hfCi0KLSNpbmNsdWRlIDxBdWRpb2NsaWVudC5oPgotI2luY2x1ZGUgPE1NRGV2aWNlQVBJLmg+Ci0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCi0jaW5jbHVkZSAiYmFzZS9ndGVzdF9wcm9kX3V0aWwuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy9wbGF0Zm9ybV90aHJlYWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy9zaW1wbGVfdGhyZWFkLmgiCi0jaW5jbHVkZSAiYmFzZS93aW4vc2NvcGVkX2NvX21lbS5oIgotI2luY2x1ZGUgImJhc2Uvd2luL3Njb3BlZF9jb21wdHIuaCIKLSNpbmNsdWRlICJiYXNlL3dpbi9zY29wZWRfaGFuZGxlLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9faW8uaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19wYXJhbWV0ZXJzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgQXVkaW9NYW5hZ2VyV2luOwotCi0vLyBJbXBsZW1lbnRhdGlvbiBvZiBBdWRpb091dHB1dFN0cmVhbSBmb3IgV2luZG93cyB1c2luZyB0aGUgQ29yZSBBdWRpbyBBUEkKLS8vIHdoZXJlIGJvdGggY2FwdHVyaW5nIGFuZCByZW5kZXJpbmcgdGFrZXMgcGxhY2Ugb24gdGhlIHNhbWUgdGhyZWFkIHRvIGVuYWJsZQotLy8gYXVkaW8gSS9PLgotLy8KLS8vIFRoZSB1c2VyIHNob3VsZCBhbHNvIGVuc3VyZSB0aGF0IGF1ZGlvIEkvTyBpcyBzdXBwb3J0ZWQgYnkgY2FsbGluZwotLy8gSGFzVW5pZmllZERlZmF1bHRJTygpLgotLy8KLS8vIEltcGxlbWVudGF0aW9uIG5vdGVzOgotLy8KLS8vIC0gQ2VydGFpbiBjb25kaXRpb25zIG11c3QgYmUgZnVsZmlsbGVkIHRvIHN1cHBvcnQgYXVkaW8gSS9POgotLy8gICAgbyBCb3RoIGNhcHR1cmUgYW5kIHJlbmRlciBzaWRlIG11c3QgdXNlIHRoZSBzYW1lIHNhbXBsZSByYXRlLgotLy8gICAgbyBCb3RoIGNhcHR1cmUgYW5kIHJlbmRlciBzaWRlIG11c3QgdXNlIHRoZSBzYW1lIGNoYW5uZWwgY291bnQuCi0vLyAgICBvIEJvdGggY2FwdHVyZSBhbmQgcmVuZGVyIHNpZGUgbXVzdCB1c2UgdGhlIHNhbWUgY2hhbm5lbCBjb25maWd1cmF0aW9uLgotLy8gICAgbyBTZWUgSGFzVW5pZmllZERlZmF1bHRJTygpIGZvciBtb3JlIGRldGFpbHMuCi0vLwotLy8gVE9ETyhoZW5yaWthKToKLS8vCi0vLyAgLSBBZGQgc3VwcG9ydCBmb3IgZXhjbHVzaXZlIG1vZGUuCi0vLyAgLSBBZGQgbXVsdGktY2hhbm5lbCBzdXBwb3J0LgotLy8gIC0gQWRkIHN1cHBvcnQgZm9yIG5vbi1tYXRjaGluZyBzYW1wbGUgcmF0ZXMuCi0vLwotY2xhc3MgTUVESUFfRVhQT1JUIFdBU0FQSVVuaWZpZWRTdHJlYW0KLSAgICA6IHB1YmxpYyBBdWRpb091dHB1dFN0cmVhbSwKLSAgICAgIHB1YmxpYyBiYXNlOjpEZWxlZ2F0ZVNpbXBsZVRocmVhZDo6RGVsZWdhdGUgewotIHB1YmxpYzoKLSAgLy8gVGhlIGN0b3IgdGFrZXMgYWxsIHRoZSB1c3VhbCBwYXJhbWV0ZXJzLCBwbHVzIHxtYW5hZ2VyfCB3aGljaCBpcyB0aGUKLSAgLy8gdGhlIGF1ZGlvIG1hbmFnZXIgd2hvIGlzIGNyZWF0aW5nIHRoaXMgb2JqZWN0LgotICBXQVNBUElVbmlmaWVkU3RyZWFtKEF1ZGlvTWFuYWdlcldpbiogbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcyk7Ci0KLSAgLy8gVGhlIGR0b3IgaXMgdHlwaWNhbGx5IGNhbGxlZCBieSB0aGUgQXVkaW9NYW5hZ2VyIG9ubHkgYW5kIGl0IGlzIHVzdWFsbHkKLSAgLy8gdHJpZ2dlcmVkIGJ5IGNhbGxpbmcgQXVkaW9PdXRwdXRTdHJlYW06OkNsb3NlKCkuCi0gIHZpcnR1YWwgfldBU0FQSVVuaWZpZWRTdHJlYW0oKTsKLQotICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBBdWRpb091dHB1dFN0cmVhbS4KLSAgdmlydHVhbCBib29sIE9wZW4oKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0YXJ0KEF1ZGlvU291cmNlQ2FsbGJhY2sqIGNhbGxiYWNrKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0b3AoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIENsb3NlKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBHZXRWb2x1bWUoZG91YmxlKiB2b2x1bWUpIE9WRVJSSURFOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiBhbGwgY29uZGl0aW9ucyB0byBzdXBwb3J0IGF1ZGlvIElPIGFyZSBmdWxmaWxsZWQuCi0gIC8vIElucHV0IGFuZCBvdXRwdXQgc2lkZXMgb2YgdGhlIEF1ZGlvIEVuZ2luZSBtdXN0IHVzZSB0aGUgc2FtZSBuYXRpdmUKLSAgLy8gZGV2aWNlIHBlcmlvZCAocmVxdWlyZXMgZS5nLiBpZGVudGljYWwgc2FtcGxlIHJhdGVzKSBhbmQgaGF2ZSB0aGUgc2FtZQotICAvLyBjaGFubmVsIGNvdW50LgotICBzdGF0aWMgYm9vbCBIYXNVbmlmaWVkRGVmYXVsdElPKCk7Ci0KLSAgYm9vbCBzdGFydGVkKCkgY29uc3QgewotICAgIHJldHVybiBhdWRpb19pb190aHJlYWRfLmdldCgpICE9IE5VTEw7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIERlbGVnYXRlU2ltcGxlVGhyZWFkOjpEZWxlZ2F0ZSBpbXBsZW1lbnRhdGlvbi4KLSAgdmlydHVhbCB2b2lkIFJ1bigpIE9WRVJSSURFOwotCi0gIC8vIElzc3VlcyB0aGUgT25FcnJvcigpIGNhbGxiYWNrIHRvIHRoZSB8c291cmNlX3wuCi0gIHZvaWQgSGFuZGxlRXJyb3IoSFJFU1VMVCBlcnIpOwotCi0gIC8vIFN0b3BzIGFuZCBqb2lucyB0aGUgYXVkaW8gdGhyZWFkIGluIGNhc2Ugb2YgYW4gZXJyb3IuCi0gIHZvaWQgU3RvcEFuZEpvaW5UaHJlYWQoSFJFU1VMVCBlcnIpOwotCi0gIC8vIENvbnZlcnRzIHVuaXF1ZSBlbmRwb2ludCBJRCB0byB1c2VyLWZyaWVuZGx5IGRldmljZSBuYW1lLgotICBzdGQ6OnN0cmluZyBHZXREZXZpY2VOYW1lKExQQ1dTVFIgZGV2aWNlX2lkKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgdGhlIGF1ZGlvIGVuZ2luZSB1c2VzIGZvciBpdHMgaW50ZXJuYWwKLSAgLy8gcHJvY2Vzc2luZy9taXhpbmcgb2Ygc2hhcmVkLW1vZGUgc3RyZWFtcyBmb3IgdGhlIGRlZmF1bHQgZW5kcG9pbnQgZGV2aWNlLgotICBpbnQgZW5kcG9pbnRfY2hhbm5lbF9jb3VudCgpIHsgcmV0dXJuIGZvcm1hdF8uRm9ybWF0Lm5DaGFubmVsczsgfQotCi0gIC8vIENvbnRhaW5zIHRoZSB0aHJlYWQgSUQgb2YgdGhlIGNyZWF0aW5nIHRocmVhZC4KLSAgYmFzZTo6UGxhdGZvcm1UaHJlYWRJZCBjcmVhdGluZ190aHJlYWRfaWRfOwotCi0gIC8vIE91ciBjcmVhdG9yLCB0aGUgYXVkaW8gbWFuYWdlciBuZWVkcyB0byBiZSBub3RpZmllZCB3aGVuIHdlIGNsb3NlLgotICBBdWRpb01hbmFnZXJXaW4qIG1hbmFnZXJfOwotCi0gIC8vIFRoZSBzaGFyaW5nIG1vZGUgZm9yIHRoZSBzdHJlYW1zLgotICAvLyBWYWxpZCB2YWx1ZXMgYXJlIEFVRENMTlRfU0hBUkVNT0RFX1NIQVJFRCBhbmQgQVVEQ0xOVF9TSEFSRU1PREVfRVhDTFVTSVZFCi0gIC8vIHdoZXJlIEFVRENMTlRfU0hBUkVNT0RFX1NIQVJFRCBpcyB0aGUgZGVmYXVsdC4KLSAgQVVEQ0xOVF9TSEFSRU1PREUgc2hhcmVfbW9kZV87Ci0KLSAgLy8gUmVuZGVyaW5nIGFuZCBjYXB0dXJpbmcgaXMgZHJpdmVuIGJ5IHRoaXMgdGhyZWFkIChubyBtZXNzYWdlIGxvb3ApLgotICAvLyBBbGwgT25Nb3JlSU9EYXRhKCkgY2FsbGJhY2tzIHdpbGwgYmUgY2FsbGVkIGZyb20gdGhpcyB0aHJlYWQuCi0gIHNjb3BlZF9wdHI8YmFzZTo6RGVsZWdhdGVTaW1wbGVUaHJlYWQ+IGF1ZGlvX2lvX3RocmVhZF87Ci0KLSAgLy8gQ29udGFpbnMgdGhlIGRlc2lyZWQgYXVkaW8gZm9ybWF0IHdoaWNoIGlzIHNldCB1cCBhdCBjb25zdHJ1Y3Rpb24uCi0gIC8vIEV4dGVuZGVkIFBDTSB3YXZlZm9ybSBmb3JtYXQgc3RydWN0dXJlIGJhc2VkIG9uIFdBVkVGT1JNQVRFWFRFTlNJQkxFLgotICAvLyBVc2UgdGhpcyBmb3IgbXVsdGlwbGUgY2hhbm5lbCBhbmQgaGktcmVzb2x1dGlvbiBQQ00gZGF0YS4KLSAgV0FWRUZPUk1BVFBDTUVYIGZvcm1hdF87Ci0KLSAgLy8gVHJ1ZSB3aGVuIHN1Y2Nlc3NmdWxseSBvcGVuZWQuCi0gIGJvb2wgb3BlbmVkXzsKLQotICAvLyBTaXplIGluIGJ5dGVzIG9mIGVhY2ggYXVkaW8gZnJhbWUgKDQgYnl0ZXMgZm9yIDE2LWJpdCBzdGVyZW8gUENNKS4KLSAgc2l6ZV90IGZyYW1lX3NpemVfOwotCi0gIC8vIFNpemUgaW4gYXVkaW8gZnJhbWVzIG9mIGVhY2ggYXVkaW8gcGFja2V0IHdoZXJlIGFuIGF1ZGlvIHBhY2tldAotICAvLyBpcyBkZWZpbmVkIGFzIHRoZSBibG9jayBvZiBkYXRhIHdoaWNoIHRoZSBzb3VyY2UgaXMgZXhwZWN0ZWQgdG8gZGVsaXZlcgotICAvLyBpbiBlYWNoIE9uTW9yZUlPRGF0YSgpIGNhbGxiYWNrLgotICBzaXplX3QgcGFja2V0X3NpemVfZnJhbWVzXzsKLQotICAvLyBMZW5ndGggb2YgdGhlIGF1ZGlvIGVuZHBvaW50IGJ1ZmZlci4KLSAgc2l6ZV90IGVuZHBvaW50X3JlbmRlcl9idWZmZXJfc2l6ZV9mcmFtZXNfOwotICBzaXplX3QgZW5kcG9pbnRfY2FwdHVyZV9idWZmZXJfc2l6ZV9mcmFtZXNfOwotCi0gIC8vIENvdW50cyB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3cml0dGVuIHRvIHRoZSBlbmRwb2ludCBidWZmZXIuCi0gIHVpbnQ2NCBudW1fd3JpdHRlbl9mcmFtZXNfOwotCi0gIC8vIFRpbWUgc3RhbXAgZm9yIGxhc3QgZGVsYXkgbWVhc3VyZW1lbnQuCi0gIGJhc2U6OlRpbWVUaWNrcyBsYXN0X2RlbGF5X3NhbXBsZV90aW1lXzsKLQotICAvLyBDb250YWlucyB0aGUgdG90YWwgKHN1bSBvZiByZW5kZXIgYW5kIGNhcHR1cmUpIGRlbGF5IGluIG1pbGxpc2Vjb25kcy4KLSAgZG91YmxlIHRvdGFsX2RlbGF5X21zXzsKLQotICAvLyBQb2ludGVyIHRvIHRoZSBjbGllbnQgdGhhdCB3aWxsIGRlbGl2ZXIgYXVkaW8gc2FtcGxlcyB0byBiZSBwbGF5ZWQgb3V0LgotICBBdWRpb1NvdXJjZUNhbGxiYWNrKiBzb3VyY2VfOwotCi0gIC8vIElNTURldmljZSBpbnRlcmZhY2VzIHdoaWNoIHJlcHJlc2VudHMgYXVkaW8gZW5kcG9pbnQgZGV2aWNlcy4KLSAgYmFzZTo6d2luOjpTY29wZWRDb21QdHI8SU1NRGV2aWNlPiBlbmRwb2ludF9yZW5kZXJfZGV2aWNlXzsKLSAgYmFzZTo6d2luOjpTY29wZWRDb21QdHI8SU1NRGV2aWNlPiBlbmRwb2ludF9jYXB0dXJlX2RldmljZV87Ci0KLSAgLy8gSUF1ZGlvQ2xpZW50IGludGVyZmFjZXMgd2hpY2ggZW5hYmxlcyBhIGNsaWVudCB0byBjcmVhdGUgYW5kIGluaXRpYWxpemUKLSAgLy8gYW4gYXVkaW8gc3RyZWFtIGJldHdlZW4gYW4gYXVkaW8gYXBwbGljYXRpb24gYW5kIHRoZSBhdWRpbyBlbmdpbmUuCi0gIGJhc2U6Ondpbjo6U2NvcGVkQ29tUHRyPElBdWRpb0NsaWVudD4gYXVkaW9fb3V0cHV0X2NsaWVudF87Ci0gIGJhc2U6Ondpbjo6U2NvcGVkQ29tUHRyPElBdWRpb0NsaWVudD4gYXVkaW9faW5wdXRfY2xpZW50XzsKLQotICAvLyBJQXVkaW9SZW5kZXJDbGllbnQgaW50ZXJmYWNlcyBlbmFibGVzIGEgY2xpZW50IHRvIHdyaXRlIG91dHB1dAotICAvLyBkYXRhIHRvIGEgcmVuZGVyaW5nIGVuZHBvaW50IGJ1ZmZlci4KLSAgYmFzZTo6d2luOjpTY29wZWRDb21QdHI8SUF1ZGlvUmVuZGVyQ2xpZW50PiBhdWRpb19yZW5kZXJfY2xpZW50XzsKLQotICAvLyBJQXVkaW9DYXB0dXJlQ2xpZW50IGludGVyZmFjZXMgZW5hYmxlcyBhIGNsaWVudCB0byByZWFkIGlucHV0Ci0gIC8vIGRhdGEgZnJvbSBhIGNhcHR1cmluZyBlbmRwb2ludCBidWZmZXIuCi0gIGJhc2U6Ondpbjo6U2NvcGVkQ29tUHRyPElBdWRpb0NhcHR1cmVDbGllbnQ+IGF1ZGlvX2NhcHR1cmVfY2xpZW50XzsKLQotICAvLyBUaGUgYXVkaW8gZW5naW5lIHdpbGwgc2lnbmFsIHRoaXMgZXZlbnQgZWFjaCB0aW1lIGEgYnVmZmVyIGhhcyBiZWVuCi0gIC8vIHJlY29yZGVkLgotICBiYXNlOjp3aW46OlNjb3BlZEhhbmRsZSBjYXB0dXJlX2V2ZW50XzsKLQotICAvLyBUaGlzIGV2ZW50IHdpbGwgYmUgc2lnbmFsZWQgd2hlbiBzdHJlYW1pbmcgc2hhbGwgc3RvcC4KLSAgYmFzZTo6d2luOjpTY29wZWRIYW5kbGUgc3RvcF9zdHJlYW1pbmdfZXZlbnRfOwotCi0gIC8vIENvbnRhaW5lciBmb3IgcmV0cmlldmluZyBkYXRhIGZyb20gQXVkaW9Tb3VyY2VDYWxsYmFjazo6T25Nb3JlSU9EYXRhKCkuCi0gIHNjb3BlZF9wdHI8QXVkaW9CdXM+IHJlbmRlcl9idXNfOwotCi0gIC8vIENvbnRhaW5lciBmb3Igc2VuZGluZyBkYXRhIHRvIEF1ZGlvU291cmNlQ2FsbGJhY2s6Ok9uTW9yZUlPRGF0YSgpLgotICBzY29wZWRfcHRyPEF1ZGlvQnVzPiBjYXB0dXJlX2J1c187Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFdBU0FQSVVuaWZpZWRTdHJlYW0pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQVVESU9fV0lOX0FVRElPX1VOSUZJRURfV0lOX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vd2luL2F1ZGlvX3VuaWZpZWRfd2luX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2F1ZGlvL3dpbi9hdWRpb191bmlmaWVkX3dpbl91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ1ZjQxYi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vd2luL2F1ZGlvX3VuaWZpZWRfd2luX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJiYXNlL2NvbW1hbmRfbGluZS5oIgotI2luY2x1ZGUgImJhc2UvZmlsZV91dGlsLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJiYXNlL3BhdGhfc2VydmljZS5oIgotI2luY2x1ZGUgImJhc2UvdGVzdC90ZXN0X3RpbWVvdXRzLmgiCi0jaW5jbHVkZSAiYmFzZS90aW1lLmgiCi0jaW5jbHVkZSAiYmFzZS93aW4vc2NvcGVkX2NvbV9pbml0aWFsaXplci5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX2lvLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fbWFuYWdlci5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3V0aWwuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby93aW4vYXVkaW9fdW5pZmllZF93aW4uaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby93aW4vY29yZV9hdWRpb191dGlsX3dpbi5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfc3dpdGNoZXMuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgOjp0ZXN0aW5nOjpfOwotdXNpbmcgOjp0ZXN0aW5nOjpBdExlYXN0OwotdXNpbmcgOjp0ZXN0aW5nOjpCZXR3ZWVuOwotdXNpbmcgOjp0ZXN0aW5nOjpEb0FsbDsKLXVzaW5nIDo6dGVzdGluZzo6Tm90TnVsbDsKLXVzaW5nIDo6dGVzdGluZzo6UmV0dXJuOwotdXNpbmcgYmFzZTo6d2luOjpTY29wZWRDT01Jbml0aWFsaXplcjsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4RGVsdGFTYW1wbGVzID0gMTAwMDsKLXN0YXRpYyBjb25zdCBjaGFyKiBrRGVsdGFUaW1lTXNGaWxlTmFtZSA9ICJ1bmlmaWVkX2RlbHRhX3RpbWVzX21zLnR4dCI7Ci0KLS8vIFZlcmlmeSB0aGF0IHRoZSBkZWxheSBlc3RpbWF0ZSBpbiB0aGUgT25Nb3JlSU9EYXRhKCkgY2FsbGJhY2sgaXMgbGFyZ2VyCi0vLyB0aGFuIGFuIGV4cGVjdGVkIG1pbnVtdW0gdmFsdWUuCi1NQVRDSEVSX1AoRGVsYXlHcmVhdGVyVGhhbiwgdmFsdWUsICIiKSB7Ci0gIHJldHVybiAoYXJnLmhhcmR3YXJlX2RlbGF5X2J5dGVzID4gdmFsdWUuaGFyZHdhcmVfZGVsYXlfYnl0ZXMpOwotfQotCi0vLyBVc2VkIHRvIHRlcm1pbmF0ZSBhIGxvb3AgZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQgdGhhbiB0aGUgbG9vcCBiZWxvbmdzIHRvLgotLy8gfGxvb3B8IHNob3VsZCBiZSBhIE1lc3NhZ2VMb29wUHJveHkuCi1BQ1RJT05fUChRdWl0TG9vcCwgbG9vcCkgewotICBsb29wLT5Qb3N0VGFzayhGUk9NX0hFUkUsIE1lc3NhZ2VMb29wOjpRdWl0Q2xvc3VyZSgpKTsKLX0KLQotY2xhc3MgTW9ja1VuaWZpZWRTb3VyY2VDYWxsYmFjawotICAgIDogcHVibGljIEF1ZGlvT3V0cHV0U3RyZWFtOjpBdWRpb1NvdXJjZUNhbGxiYWNrIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EMihPbk1vcmVEYXRhLCBpbnQoQXVkaW9CdXMqIGF1ZGlvX2J1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlcnNTdGF0ZSBidWZmZXJzX3N0YXRlKSk7Ci0gIE1PQ0tfTUVUSE9EMyhPbk1vcmVJT0RhdGEsIGludChBdWRpb0J1cyogc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdXMqIGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlcnNTdGF0ZSBidWZmZXJzX3N0YXRlKSk7Ci0gIE1PQ0tfTUVUSE9EMihPbkVycm9yLCB2b2lkKEF1ZGlvT3V0cHV0U3RyZWFtKiBzdHJlYW0sIGludCBjb2RlKSk7Ci19OwotCi0vLyBBdWRpb091dHB1dFN0cmVhbTo6QXVkaW9Tb3VyY2VDYWxsYmFjayBpbXBsZW1lbnRhdGlvbiB3aGljaCBlbmFibGVzIGF1ZGlvCi0vLyBwbGF5LXRocm91Z2guIEl0IGFsc28gY3JlYXRlcyBhIHRleHQgZmlsZSB0aGF0IGNvbnRhaW5zIHRpbWVzIGJldHdlZW4gdHdvCi0vLyBzdWNjZXNzaXZlIGNhbGxiYWNrcy4gVW5pdHMgYXJlIGluIG1pbGxpc2Vjb25kcy4gVGhpcyBmaWxlIGNhbiBiZSB1c2VkIGZvcgotLy8gb2ZmLWxpbmUgYW5hbHlzaXMgb2YgdGhlIGNhbGxiYWNrIHNlcXVlbmNlLgotY2xhc3MgVW5pZmllZFNvdXJjZUNhbGxiYWNrIDogcHVibGljIEF1ZGlvT3V0cHV0U3RyZWFtOjpBdWRpb1NvdXJjZUNhbGxiYWNrIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFVuaWZpZWRTb3VyY2VDYWxsYmFjaygpCi0gICAgICA6IHByZXZpb3VzX2NhbGxfdGltZV8oYmFzZTo6VGltZTo6Tm93KCkpLAotICAgICAgICB0ZXh0X2ZpbGVfKE5VTEwpLAotICAgICAgICBlbGVtZW50c190b193cml0ZV8oMCkgewotICAgIGRlbHRhX3RpbWVzXy5yZXNldChuZXcgaW50W2tNYXhEZWx0YVNhbXBsZXNdKTsKLSAgfQotCi0gIHZpcnR1YWwgflVuaWZpZWRTb3VyY2VDYWxsYmFjaygpIHsKLSAgICBGaWxlUGF0aCBmaWxlX25hbWU7Ci0gICAgRVhQRUNUX1RSVUUoUGF0aFNlcnZpY2U6OkdldChiYXNlOjpESVJfRVhFLCAmZmlsZV9uYW1lKSk7Ci0gICAgZmlsZV9uYW1lID0gZmlsZV9uYW1lLkFwcGVuZEFTQ0lJKGtEZWx0YVRpbWVNc0ZpbGVOYW1lKTsKLQotICAgIEVYUEVDVF9UUlVFKCF0ZXh0X2ZpbGVfKTsKLSAgICB0ZXh0X2ZpbGVfID0gZmlsZV91dGlsOjpPcGVuRmlsZShmaWxlX25hbWUsICJ3dCIpOwotICAgIERMT0dfSUYoRVJST1IsICF0ZXh0X2ZpbGVfKSA8PCAiRmFpbGVkIHRvIG9wZW4gbG9nIGZpbGUuIjsKLSAgICBMT0coSU5GTykgPDwgIj4+IE91dHB1dCBmaWxlICIgPDwgZmlsZV9uYW1lLnZhbHVlKCkgPDwgIiBoYXMgYmVlbiBjcmVhdGVkLiI7Ci0KLSAgICAvLyBXcml0ZSB0aGUgYXJyYXkgd2hpY2ggY29udGFpbnMgZGVsdGEgdGltZXMgdG8gYSB0ZXh0IGZpbGUuCi0gICAgc2l6ZV90IGVsZW1lbnRzX3dyaXR0ZW4gPSAwOwotICAgIHdoaWxlIChlbGVtZW50c193cml0dGVuIDwgZWxlbWVudHNfdG9fd3JpdGVfKSB7Ci0gICAgICBmcHJpbnRmKHRleHRfZmlsZV8sICIlZFxuIiwgZGVsdGFfdGltZXNfW2VsZW1lbnRzX3dyaXR0ZW5dKTsKLSAgICAgICsrZWxlbWVudHNfd3JpdHRlbjsKLSAgICB9Ci0gICAgZmlsZV91dGlsOjpDbG9zZUZpbGUodGV4dF9maWxlXyk7Ci0gIH0KLQotICB2aXJ0dWFsIGludCBPbk1vcmVEYXRhKEF1ZGlvQnVzKiBkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyc1N0YXRlIGJ1ZmZlcnNfc3RhdGUpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH07Ci0KLSAgdmlydHVhbCBpbnQgT25Nb3JlSU9EYXRhKEF1ZGlvQnVzKiBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1cyogZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyc1N0YXRlIGJ1ZmZlcnNfc3RhdGUpIHsKLSAgICAvLyBTdG9yZSB0aW1lIGJldHdlZW4gdGhpcyBjYWxsYmFjayBhbmQgdGhlIHByZXZpb3VzIGNhbGxiYWNrLgotICAgIGludCBkaWZmID0gKGJhc2U6OlRpbWU6Ok5vdygpIC0gcHJldmlvdXNfY2FsbF90aW1lXykuSW5NaWxsaXNlY29uZHMoKTsKLSAgICBwcmV2aW91c19jYWxsX3RpbWVfID0gYmFzZTo6VGltZTo6Tm93KCk7Ci0gICAgaWYgKGVsZW1lbnRzX3RvX3dyaXRlXyA8IGtNYXhEZWx0YVNhbXBsZXMpIHsKLSAgICAgIGRlbHRhX3RpbWVzX1tlbGVtZW50c190b193cml0ZV9dID0gZGlmZjsKLSAgICAgICsrZWxlbWVudHNfdG9fd3JpdGVfOwotICAgIH0KLQotICAgIC8vIFBsYXkgb3V0IHRoZSByZWNvcmRlZCBhdWRpbyBzYW1wbGVzIGluIGxvb3AgYmFjay4KLSAgICBzb3VyY2UtPkNvcHlUbyhkZXN0KTsKLSAgICByZXR1cm4gc291cmNlLT5mcmFtZXMoKTsKLSAgfTsKLQotICB2aXJ0dWFsIHZvaWQgT25FcnJvcihBdWRpb091dHB1dFN0cmVhbSogc3RyZWFtLCBpbnQgY29kZSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgYmFzZTo6VGltZSBwcmV2aW91c19jYWxsX3RpbWVfOwotICBzY29wZWRfYXJyYXk8aW50PiBkZWx0YV90aW1lc187Ci0gIEZJTEUqIHRleHRfZmlsZV87Ci0gIHNpemVfdCBlbGVtZW50c190b193cml0ZV87Ci19OwotCi0vLyBDb252ZW5pZW5jZSBtZXRob2Qgd2hpY2ggZW5zdXJlcyB0aGF0IHdlIGZ1bGZpbGwgYWxsIHJlcXVpcmVkIGNvbmRpdGlvbnMKLS8vIHRvIHJ1biB1bmlmaWVkIGF1ZGlvIHRlc3RzIG9uIFdpbmRvd3MuCi1zdGF0aWMgYm9vbCBDYW5SdW5VbmlmaWVkQXVkaW9UZXN0cyhBdWRpb01hbmFnZXIqIGF1ZGlvX21hbikgewotICBjb25zdCBDb21tYW5kTGluZSogY21kX2xpbmUgPSBDb21tYW5kTGluZTo6Rm9yQ3VycmVudFByb2Nlc3MoKTsKLSAgaWYgKCFjbWRfbGluZS0+SGFzU3dpdGNoKHN3aXRjaGVzOjprRW5hYmxlV2ViQXVkaW9JbnB1dCkpIHsKLSAgICBEVkxPRygxKSA8PCAiLS1lbmFibGUtd2ViYXVkaW8taW5wdXQgbXVzdCBiZSBkZWZpbmVkIHRvIHJ1biB0aGlzIHRlc3QuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIUNvcmVBdWRpb1V0aWw6OklzU3VwcG9ydGVkKCkpIHsKLSAgICBMT0coV0FSTklORykgPDwgIlRoaXMgdGVzdHMgcmVxdWlyZXMgV2luZG93cyBWaXN0YSBvciBoaWdoZXIuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIWF1ZGlvX21hbi0+SGFzQXVkaW9PdXRwdXREZXZpY2VzKCkpIHsKLSAgICBMT0coV0FSTklORykgPDwgIk5vIG91dHB1dCBkZXZpY2VzIGRldGVjdGVkLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKCFhdWRpb19tYW4tPkhhc0F1ZGlvSW5wdXREZXZpY2VzKCkpIHsKLSAgICBMT0coV0FSTklORykgPDwgIk5vIGlucHV0IGRldmljZXMgZGV0ZWN0ZWQuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIVdBU0FQSVVuaWZpZWRTdHJlYW06Okhhc1VuaWZpZWREZWZhdWx0SU8oKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiQXVkaW8gSU8gaXMgbm90IHN1cHBvcnRlZC4iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vLyBDb252ZW5pZW5jZSBjbGFzcyB3aGljaCBzaW1wbGlmaWVzIGNyZWF0aW9uIG9mIGEgdW5pZmllZCBBdWRpb091dHB1dFN0cmVhbQotLy8gb2JqZWN0LgotY2xhc3MgQXVkaW9VbmlmaWVkU3RyZWFtV3JhcHBlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBBdWRpb1VuaWZpZWRTdHJlYW1XcmFwcGVyKEF1ZGlvTWFuYWdlciogYXVkaW9fbWFuYWdlcikKLSAgICAgIDogY29tX2luaXRfKFNjb3BlZENPTUluaXRpYWxpemVyOjprTVRBKSwKLSAgICAgICAgYXVkaW9fbWFuXyhhdWRpb19tYW5hZ2VyKSB7Ci0gICAgLy8gV2Ugb3BlbiB1cCBib3RoIGJvdGggc2lkZXMgKGlucHV0IGFuZCBvdXRwdXQpIHVzaW5nIHRoZSBwcmVmZXJyZWQKLSAgICAvLyBzZXQgb2YgYXVkaW8gcGFyYW1ldGVycy4gVGhlc2UgcGFyYW1ldGVycyBjb3JyZXNwb25kcyB0byB0aGUgbWl4IGZvcm1hdAotICAgIC8vIHRoYXQgdGhlIGF1ZGlvIGVuZ2luZSB1c2VzIGludGVybmFsbHkgZm9yIHByb2Nlc3Npbmcgb2Ygc2hhcmVkLW1vZGUKLSAgICAvLyBvdXRwdXQgc3RyZWFtcy4KLSAgICBFWFBFQ1RfVFJVRShTVUNDRUVERUQoQ29yZUF1ZGlvVXRpbDo6R2V0UHJlZmVycmVkQXVkaW9QYXJhbWV0ZXJzKAotICAgICAgICBlUmVuZGVyLCBlQ29uc29sZSwgJnBhcmFtc18pKSk7Ci0gIH0KLQotICB+QXVkaW9VbmlmaWVkU3RyZWFtV3JhcHBlcigpIHt9Ci0KLSAgLy8gQ3JlYXRlcyBBdWRpb091dHB1dFN0cmVhbSBvYmplY3QgdXNpbmcgZGVmYXVsdCBwYXJhbWV0ZXJzLgotICBXQVNBUElVbmlmaWVkU3RyZWFtKiBDcmVhdGUoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFdBU0FQSVVuaWZpZWRTdHJlYW0qPiAoQ3JlYXRlT3V0cHV0U3RyZWFtKCkpOwotICB9Ci0KLSAgQXVkaW9QYXJhbWV0ZXJzOjpGb3JtYXQgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gcGFyYW1zXy5mb3JtYXQoKTsgfQotICBpbnQgY2hhbm5lbHMoKSBjb25zdCB7IHJldHVybiBwYXJhbXNfLmNoYW5uZWxzKCk7IH0KLSAgaW50IGJpdHNfcGVyX3NhbXBsZSgpIGNvbnN0IHsgcmV0dXJuIHBhcmFtc18uYml0c19wZXJfc2FtcGxlKCk7IH0KLSAgaW50IHNhbXBsZV9yYXRlKCkgY29uc3QgeyByZXR1cm4gcGFyYW1zXy5zYW1wbGVfcmF0ZSgpOyB9Ci0gIGludCBmcmFtZXNfcGVyX2J1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIHBhcmFtc18uZnJhbWVzX3Blcl9idWZmZXIoKTsgfQotICBpbnQgYnl0ZXNfcGVyX2J1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIHBhcmFtc18uR2V0Qnl0ZXNQZXJCdWZmZXIoKTsgfQotCi0gcHJpdmF0ZToKLSAgQXVkaW9PdXRwdXRTdHJlYW0qIENyZWF0ZU91dHB1dFN0cmVhbSgpIHsKLSAgICBBdWRpb091dHB1dFN0cmVhbSogYW9zID0gYXVkaW9fbWFuXy0+TWFrZUF1ZGlvT3V0cHV0U3RyZWFtKHBhcmFtc18pOwotICAgIEVYUEVDVF9UUlVFKGFvcyk7Ci0gICAgcmV0dXJuIGFvczsKLSAgfQotCi0gIFNjb3BlZENPTUluaXRpYWxpemVyIGNvbV9pbml0XzsKLSAgQXVkaW9NYW5hZ2VyKiBhdWRpb19tYW5fOwotICBBdWRpb1BhcmFtZXRlcnMgcGFyYW1zXzsKLX07Ci0KLS8vIENvbnZlbmllbmNlIG1ldGhvZCB3aGljaCBjcmVhdGVzIGEgZGVmYXVsdCBXQVNBUElVbmlmaWVkU3RyZWFtIG9iamVjdC4KLXN0YXRpYyBXQVNBUElVbmlmaWVkU3RyZWFtKiBDcmVhdGVEZWZhdWx0VW5pZmllZFN0cmVhbSgKLSAgICBBdWRpb01hbmFnZXIqIGF1ZGlvX21hbmFnZXIpIHsKLSAgQXVkaW9VbmlmaWVkU3RyZWFtV3JhcHBlciBhb3N3KGF1ZGlvX21hbmFnZXIpOwotICByZXR1cm4gYW9zdy5DcmVhdGUoKTsKLX0KLQotLy8gVGVzdCBPcGVuKCksIENsb3NlKCkgY2FsbGluZyBzZXF1ZW5jZS4KLVRFU1QoV0FTQVBJVW5pZmllZFN0cmVhbVRlc3QsIE9wZW5BbmRDbG9zZSkgewotICBzY29wZWRfcHRyPEF1ZGlvTWFuYWdlcj4gYXVkaW9fbWFuYWdlcihBdWRpb01hbmFnZXI6OkNyZWF0ZSgpKTsKLSAgaWYgKCFDYW5SdW5VbmlmaWVkQXVkaW9UZXN0cyhhdWRpb19tYW5hZ2VyLmdldCgpKSkKLSAgICByZXR1cm47Ci0KLSAgV0FTQVBJVW5pZmllZFN0cmVhbSogd3VzID0gQ3JlYXRlRGVmYXVsdFVuaWZpZWRTdHJlYW0oYXVkaW9fbWFuYWdlci5nZXQoKSk7Ci0gIEVYUEVDVF9UUlVFKHd1cy0+T3BlbigpKTsKLSAgd3VzLT5DbG9zZSgpOwotfQotCi0vLyBUZXN0IE9wZW4oKSwgU3RhcnQoKSwgQ2xvc2UoKSBjYWxsaW5nIHNlcXVlbmNlLgotVEVTVChXQVNBUElVbmlmaWVkU3RyZWFtVGVzdCwgT3BlblN0YXJ0QW5kQ2xvc2UpIHsKLSAgc2NvcGVkX3B0cjxBdWRpb01hbmFnZXI+IGF1ZGlvX21hbmFnZXIoQXVkaW9NYW5hZ2VyOjpDcmVhdGUoKSk7Ci0gIGlmICghQ2FuUnVuVW5pZmllZEF1ZGlvVGVzdHMoYXVkaW9fbWFuYWdlci5nZXQoKSkpCi0gICAgcmV0dXJuOwotCi0gIE1vY2tVbmlmaWVkU291cmNlQ2FsbGJhY2sgc291cmNlOwotICBBdWRpb1VuaWZpZWRTdHJlYW1XcmFwcGVyIGF1c3coYXVkaW9fbWFuYWdlci5nZXQoKSk7Ci0gIFdBU0FQSVVuaWZpZWRTdHJlYW0qIHd1cyA9IGF1c3cuQ3JlYXRlKCk7Ci0KLSAgRVhQRUNUX1RSVUUod3VzLT5PcGVuKCkpOwotICBFWFBFQ1RfQ0FMTChzb3VyY2UsIE9uRXJyb3Iod3VzLCBfKSkKLSAgICAgIC5UaW1lcygwKTsKLSAgRVhQRUNUX0NBTEwoc291cmNlLCBPbk1vcmVJT0RhdGEoTm90TnVsbCgpLCBOb3ROdWxsKCksIF8pKQotICAgICAgLlRpbWVzKEJldHdlZW4oMCwgMSkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKGF1c3cuZnJhbWVzX3Blcl9idWZmZXIoKSkpOwotICB3dXMtPlN0YXJ0KCZzb3VyY2UpOwotICB3dXMtPkNsb3NlKCk7Ci19Ci0KLS8vIFZlcmlmeSB0aGF0IElPIGNhbGxiYWNrcyBzdGFydHMgYXMgdGhleSBzaG91bGQuCi1URVNUKFdBU0FQSVVuaWZpZWRTdHJlYW1UZXN0LCBTdGFydExvb3BiYWNrQXVkaW8pIHsKLSAgc2NvcGVkX3B0cjxBdWRpb01hbmFnZXI+IGF1ZGlvX21hbmFnZXIoQXVkaW9NYW5hZ2VyOjpDcmVhdGUoKSk7Ci0gIGlmICghQ2FuUnVuVW5pZmllZEF1ZGlvVGVzdHMoYXVkaW9fbWFuYWdlci5nZXQoKSkpCi0gICAgcmV0dXJuOwotCi0gIE1lc3NhZ2VMb29wRm9yVUkgbG9vcDsKLSAgTW9ja1VuaWZpZWRTb3VyY2VDYWxsYmFjayBzb3VyY2U7Ci0gIEF1ZGlvVW5pZmllZFN0cmVhbVdyYXBwZXIgYXVzdyhhdWRpb19tYW5hZ2VyLmdldCgpKTsKLSAgV0FTQVBJVW5pZmllZFN0cmVhbSogd3VzID0gYXVzdy5DcmVhdGUoKTsKLQotICAvLyBTZXQgdXAgZXhwZWN0ZWQgbWluaW11bSBkZWxheSBlc3RpbWF0aW9uIHdoZXJlIHdlIHVzZSBhIG1pbml1bSBkZWxheQotICAvLyB3aGljaCBpcyBlcXVhbCB0byB0aGUgc3VtIG9mIHJlbmRlciBhbmQgY2FwdHVyZSBzaXplcy4gV2UgY2FuIG5ldmVyCi0gIC8vIHJlYWNoIGEgZGVsYXkgbG93ZXIgdGhhbiB0aGlzIHZhbHVlLgotICBBdWRpb0J1ZmZlcnNTdGF0ZSBtaW5fdG90YWxfYXVkaW9fZGVsYXkoMCwgMiAqIGF1c3cuYnl0ZXNfcGVyX2J1ZmZlcigpKTsKLQotICBFWFBFQ1RfVFJVRSh3dXMtPk9wZW4oKSk7Ci0gIEVYUEVDVF9DQUxMKHNvdXJjZSwgT25FcnJvcih3dXMsIF8pKQotICAgICAgLlRpbWVzKDApOwotICBFWFBFQ1RfQ0FMTChzb3VyY2UsIE9uTW9yZUlPRGF0YSgKLSAgICAgIE5vdE51bGwoKSwgTm90TnVsbCgpLCBEZWxheUdyZWF0ZXJUaGFuKG1pbl90b3RhbF9hdWRpb19kZWxheSkpKQotICAgICAgLlRpbWVzKEF0TGVhc3QoMikpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKGF1c3cuZnJhbWVzX3Blcl9idWZmZXIoKSkpCi0gICAgICAuV2lsbE9uY2UoRG9BbGwoCi0gICAgICAgICAgUXVpdExvb3AobG9vcC5tZXNzYWdlX2xvb3BfcHJveHkoKSksCi0gICAgICAgICAgUmV0dXJuKGF1c3cuZnJhbWVzX3Blcl9idWZmZXIoKSkpKTsKLSAgd3VzLT5TdGFydCgmc291cmNlKTsKLSAgbG9vcC5Qb3N0RGVsYXllZFRhc2soRlJPTV9IRVJFLCBNZXNzYWdlTG9vcDo6UXVpdENsb3N1cmUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgVGVzdFRpbWVvdXRzOjphY3Rpb25fdGltZW91dCgpKTsKLSAgbG9vcC5SdW4oKTsKLSAgd3VzLT5TdG9wKCk7Ci0gIHd1cy0+Q2xvc2UoKTsKLX0KLQotLy8gUGVyZm9ybSBhIHJlYWwtdGltZSB0ZXN0IGluIGxvb3BiYWNrIHdoZXJlIHRoZSByZWNvcmRlZCBhdWRpbyBpcyBlY2hvZWQKLS8vIGJhY2sgdG8gdGhlIHNwZWFrZXIuIFRoaXMgdGVzdCBhbGxvd3MgdGhlIHVzZXIgdG8gdmVyaWZ5IHRoYXQgdGhlIGF1ZGlvCi0vLyBzb3VuZHMgT0suIEEgdGV4dCBmaWxlIHdpdGggbmFtZSB8a0RlbHRhVGltZU1zRmlsZU5hbWV8IGlzIGFsc28gZ2VuZXJhdGVkLgotVEVTVChXQVNBUElVbmlmaWVkU3RyZWFtVGVzdCwgRElTQUJMRURfUmVhbFRpbWVQbGF5VGhyb3VnaCkgewotICBzY29wZWRfcHRyPEF1ZGlvTWFuYWdlcj4gYXVkaW9fbWFuYWdlcihBdWRpb01hbmFnZXI6OkNyZWF0ZSgpKTsKLSAgaWYgKCFDYW5SdW5VbmlmaWVkQXVkaW9UZXN0cyhhdWRpb19tYW5hZ2VyLmdldCgpKSkKLSAgICByZXR1cm47Ci0KLSAgTWVzc2FnZUxvb3BGb3JVSSBsb29wOwotICBVbmlmaWVkU291cmNlQ2FsbGJhY2sgc291cmNlOwotICBXQVNBUElVbmlmaWVkU3RyZWFtKiB3dXMgPSBDcmVhdGVEZWZhdWx0VW5pZmllZFN0cmVhbShhdWRpb19tYW5hZ2VyLmdldCgpKTsKLQotICBFWFBFQ1RfVFJVRSh3dXMtPk9wZW4oKSk7Ci0gIHd1cy0+U3RhcnQoJnNvdXJjZSk7Ci0gIGxvb3AuUG9zdERlbGF5ZWRUYXNrKEZST01fSEVSRSwgTWVzc2FnZUxvb3A6OlF1aXRDbG9zdXJlKCksCi0gICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygxMDAwMCkpOwotICBsb29wLlJ1bigpOwotICB3dXMtPkNsb3NlKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL3dpbi9hdnJ0X3dyYXBwZXJfd2luLmNjIGIvc3JjL21lZGlhL2F1ZGlvL3dpbi9hdnJ0X3dyYXBwZXJfd2luLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWYxNTk5Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby93aW4vYXZydF93cmFwcGVyX3dpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby93aW4vYXZydF93cmFwcGVyX3dpbi5oIgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0KLW5hbWVzcGFjZSBhdnJ0IHsKLQotLy8gRnVuY3Rpb24gcG9pbnRlcnMKLXR5cGVkZWYgQk9PTCAoV0lOQVBJICpBdlJldmVydE1tVGhyZWFkQ2hhcmFjdGVyaXN0aWNzRm4pKEhBTkRMRSk7Ci10eXBlZGVmIEhBTkRMRSAoV0lOQVBJICpBdlNldE1tVGhyZWFkQ2hhcmFjdGVyaXN0aWNzRm4pKExQQ1dTVFIsIExQRFdPUkQpOwotdHlwZWRlZiBCT09MIChXSU5BUEkgKkF2U2V0TW1UaHJlYWRQcmlvcml0eUZuKShIQU5ETEUsIEFWUlRfUFJJT1JJVFkpOwotCi1ITU9EVUxFIGdfYXZydCA9IE5VTEw7Ci1BdlJldmVydE1tVGhyZWFkQ2hhcmFjdGVyaXN0aWNzRm4gZ19yZXZlcnRfbW1fdGhyZWFkX2NoYXJhY3RlcmlzdGljcyA9IE5VTEw7Ci1BdlNldE1tVGhyZWFkQ2hhcmFjdGVyaXN0aWNzRm4gZ19zZXRfbW1fdGhyZWFkX2NoYXJhY3RlcmlzdGljcyA9IE5VTEw7Ci1BdlNldE1tVGhyZWFkUHJpb3JpdHlGbiBnX3NldF9tbV90aHJlYWRfcHJpb3JpdHkgPSBOVUxMOwotCi1ib29sIEluaXRpYWxpemUoKSB7Ci0gIGlmICghZ19zZXRfbW1fdGhyZWFkX3ByaW9yaXR5KSB7Ci0gICAgLy8gVGhlIGF2cnQuZGxsIGlzIGF2YWlsYWJsZSBvbiBXaW5kb3dzIFZpc3RhIGFuZCBsYXRlci4KLSAgICB3Y2hhcl90IHBhdGhbTUFYX1BBVEhdID0gezB9OwotICAgIEV4cGFuZEVudmlyb25tZW50U3RyaW5ncyhMIiVXSU5ESVIlXFxzeXN0ZW0zMlxcYXZydC5kbGwiLCBwYXRoLAotICAgICAgICBhcnJheXNpemUocGF0aCkpOwotICAgIGdfYXZydCA9IExvYWRMaWJyYXJ5RXhXKHBhdGgsIE5VTEwsIExPQURfV0lUSF9BTFRFUkVEX1NFQVJDSF9QQVRIKTsKLSAgICBpZiAoIWdfYXZydCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGdfcmV2ZXJ0X21tX3RocmVhZF9jaGFyYWN0ZXJpc3RpY3MgPQotICAgICAgICByZWludGVycHJldF9jYXN0PEF2UmV2ZXJ0TW1UaHJlYWRDaGFyYWN0ZXJpc3RpY3NGbj4oCi0gICAgICAgICAgICBHZXRQcm9jQWRkcmVzcyhnX2F2cnQsICJBdlJldmVydE1tVGhyZWFkQ2hhcmFjdGVyaXN0aWNzIikpOwotICAgIGdfc2V0X21tX3RocmVhZF9jaGFyYWN0ZXJpc3RpY3MgPQotICAgICAgICByZWludGVycHJldF9jYXN0PEF2U2V0TW1UaHJlYWRDaGFyYWN0ZXJpc3RpY3NGbj4oCi0gICAgICAgICAgICBHZXRQcm9jQWRkcmVzcyhnX2F2cnQsICJBdlNldE1tVGhyZWFkQ2hhcmFjdGVyaXN0aWNzVyIpKTsKLSAgICBnX3NldF9tbV90aHJlYWRfcHJpb3JpdHkgPSByZWludGVycHJldF9jYXN0PEF2U2V0TW1UaHJlYWRQcmlvcml0eUZuPigKLSAgICAgICAgR2V0UHJvY0FkZHJlc3MoZ19hdnJ0LCAiQXZTZXRNbVRocmVhZFByaW9yaXR5IikpOwotICB9Ci0KLSAgcmV0dXJuIChnX2F2cnQgJiYgZ19yZXZlcnRfbW1fdGhyZWFkX2NoYXJhY3RlcmlzdGljcyAmJgotICAgICAgICAgIGdfc2V0X21tX3RocmVhZF9jaGFyYWN0ZXJpc3RpY3MgJiYgZ19zZXRfbW1fdGhyZWFkX3ByaW9yaXR5KTsKLX0KLQotYm9vbCBBdlJldmVydE1tVGhyZWFkQ2hhcmFjdGVyaXN0aWNzKEhBTkRMRSBhdnJ0X2hhbmRsZSkgewotICBEQ0hFQ0soZ19yZXZlcnRfbW1fdGhyZWFkX2NoYXJhY3RlcmlzdGljcyk7Ci0gIHJldHVybiAoZ19yZXZlcnRfbW1fdGhyZWFkX2NoYXJhY3RlcmlzdGljcyAmJgotICAgICAgICAgIGdfcmV2ZXJ0X21tX3RocmVhZF9jaGFyYWN0ZXJpc3RpY3MoYXZydF9oYW5kbGUpKTsKLX0KLQotSEFORExFIEF2U2V0TW1UaHJlYWRDaGFyYWN0ZXJpc3RpY3MoY29uc3Qgd2NoYXJfdCogdGFza19uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQqIHRhc2tfaW5kZXgpIHsKLSAgRENIRUNLKGdfc2V0X21tX3RocmVhZF9jaGFyYWN0ZXJpc3RpY3MpOwotICByZXR1cm4gKGdfc2V0X21tX3RocmVhZF9jaGFyYWN0ZXJpc3RpY3MgPwotICAgICAgICAgIGdfc2V0X21tX3RocmVhZF9jaGFyYWN0ZXJpc3RpY3ModGFza19uYW1lLCB0YXNrX2luZGV4KSA6IE5VTEwpOwotfQotCi1ib29sIEF2U2V0TW1UaHJlYWRQcmlvcml0eShIQU5ETEUgYXZydF9oYW5kbGUsIEFWUlRfUFJJT1JJVFkgcHJpb3JpdHkpIHsKLSAgRENIRUNLKGdfc2V0X21tX3RocmVhZF9wcmlvcml0eSk7Ci0gIHJldHVybiAoZ19zZXRfbW1fdGhyZWFkX3ByaW9yaXR5ICYmCi0gICAgICAgICAgZ19zZXRfbW1fdGhyZWFkX3ByaW9yaXR5KGF2cnRfaGFuZGxlLCBwcmlvcml0eSkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYXZydApkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL3dpbi9hdnJ0X3dyYXBwZXJfd2luLmggYi9zcmMvbWVkaWEvYXVkaW8vd2luL2F2cnRfd3JhcHBlcl93aW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEyN2I2Yi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vd2luL2F2cnRfd3JhcHBlcl93aW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0vLwotLy8gVGhlIGF2cnQgbmFtZXNwYWNlIGVuY2Fwc3VsYXRlcyB0aGUgZGV0YWlscyBuZWVkZWQgdG8gc3VwcG9ydCBNTUNTUy4KLS8vCi0vLyBUaGUgTXVsdGltZWRpYSBDbGFzcyBTY2hlZHVsZXIgc2VydmljZSAoTU1DU1MpIGVuYWJsZXMgbXVsdGltZWRpYQotLy8gYXBwbGljYXRpb25zIHRvIGVuc3VyZSB0aGF0IHRoZWlyIHRpbWUtc2Vuc2l0aXZlIHByb2Nlc3NpbmcgcmVjZWl2ZXMKLS8vIHByaW9yaXRpemVkIGFjY2VzcyB0byBDUFUgcmVzb3VyY2VzLiBUaGlzIHNlcnZpY2UgZW5hYmxlcyBtdWx0aW1lZGlhCi0vLyBhcHBsaWNhdGlvbnMgdG8gdXRpbGl6ZSBhcyBtdWNoIG9mIHRoZSBDUFUgYXMgcG9zc2libGUgd2l0aG91dCBkZW55aW5nCi0vLyBDUFUgcmVzb3VyY2VzIHRvIGxvd2VyLXByaW9yaXR5IGFwcGxpY2F0aW9ucy4KLS8vIE1NQ1NTIHJlcXVpcmVzIFdpbmRvd3MgVmlzdGEgb3IgaGlnaGVyIGFuZCB0aGF0IHRoZSBBdnJ0IERMTCBpcyBsb2FkZWQuCi0vLwotLy8gVE9ETyhoZW5yaWthKTogcmVmYWN0b3IgYW5kIG1lcmdlIGludG8gZXhpc3RpbmcgdGhyZWFkIGltcGxlbWVudGF0aW9uCi0vLyBmb3IgV2luZG93cyB0byBlbnN1cmUgdGhhdCBNTUNTUyBjYW4gYmUgZW5hYmxlZCBmb3IgYWxsIHRocmVhZHMuCi0vLwotI2lmbmRlZiBNRURJQV9BVURJT19XSU5fQVZSVF9XUkFQUEVSX1dJTl9IXwotI2RlZmluZSBNRURJQV9BVURJT19XSU5fQVZSVF9XUkFQUEVSX1dJTl9IXwotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPGF2cnQuaD4KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotCi1uYW1lc3BhY2UgYXZydCB7Ci0KLS8vIExvYWRzIHRoZSBBdnJ0LmRsbCB3aGljaCBpcyBhdmFpbGFibGUgb24gV2luZG93cyBWaXN0YSBhbmQgbGF0ZXIuCi1ib29sIEluaXRpYWxpemUoKTsKLQotLy8gRnVuY3Rpb24gd3JhcHBlcnMgZm9yIHRoZSB1bmRlcmx5aW5nIE1NQ1NTIGZ1bmN0aW9ucy4KLWJvb2wgQXZSZXZlcnRNbVRocmVhZENoYXJhY3RlcmlzdGljcyhIQU5ETEUgYXZydF9oYW5kbGUpOwotSEFORExFIEF2U2V0TW1UaHJlYWRDaGFyYWN0ZXJpc3RpY3MoY29uc3Qgd2NoYXJfdCogdGFza19uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQqIHRhc2tfaW5kZXgpOwotYm9vbCBBdlNldE1tVGhyZWFkUHJpb3JpdHkoSEFORExFIGF2cnRfaGFuZGxlLCBBVlJUX1BSSU9SSVRZIHByaW9yaXR5KTsKLQotfSAgLy8gbmFtZXNwYWNlIGF2cnQKLQotI2VuZGlmICAvLyBNRURJQV9BVURJT19XSU5fQVZSVF9XUkFQUEVSX1dJTl9IXwotCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vd2luL2NvcmVfYXVkaW9fdXRpbF93aW4uY2MgYi9zcmMvbWVkaWEvYXVkaW8vd2luL2NvcmVfYXVkaW9fdXRpbF93aW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MDFjYmYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL3dpbi9jb3JlX2F1ZGlvX3V0aWxfd2luLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTgwICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby93aW4vY29yZV9hdWRpb191dGlsX3dpbi5oIgotCi0jaW5jbHVkZSA8QXVkaW9jbGllbnQuaD4KLSNpbmNsdWRlIDxGdW5jdGlvbmRpc2NvdmVyeWtleXNfZGV2cGtleS5oPgotCi0jaW5jbHVkZSAiYmFzZS9jb21tYW5kX2xpbmUuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL3N0cmluZ3ByaW50Zi5oIgotI2luY2x1ZGUgImJhc2UvdXRmX3N0cmluZ19jb252ZXJzaW9ucy5oIgotI2luY2x1ZGUgImJhc2Uvd2luL3Njb3BlZF9jb19tZW0uaCIKLSNpbmNsdWRlICJiYXNlL3dpbi9zY29wZWRfaGFuZGxlLmgiCi0jaW5jbHVkZSAiYmFzZS93aW4vd2luZG93c192ZXJzaW9uLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9zd2l0Y2hlcy5oIgotCi11c2luZyBiYXNlOjp3aW46OlNjb3BlZENvTWVtOwotdXNpbmcgYmFzZTo6d2luOjpTY29wZWRIYW5kbGU7Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLXR5cGVkZWYgdWludDMyIENoYW5uZWxDb25maWc7Ci0KLS8vIENvbnZlcnRzIE1pY3Jvc29mdCdzIGNoYW5uZWwgY29uZmlndXJhdGlvbiB0byBDaGFubmVsTGF5b3V0LgotLy8gVGhpcyBtYXBwaW5nIGlzIG5vdCBwZXJmZWN0IGJ1dCB0aGUgYmVzdCB3ZSBjYW4gZG8gZ2l2ZW4gdGhlIGN1cnJlbnQKLS8vIENoYW5uZWxMYXlvdXQgZW51bWVyYXRvciBhbmQgdGhlIFdpbmRvd3Mtc3BlY2lmaWMgc3BlYWtlciBjb25maWd1cmF0aW9ucwotLy8gZGVmaW5lZCBpbiBrc21lZGlhLmguIERvbid0IGFzc3VtZSB0aGF0IHRoZSBjaGFubmVsIG9yZGVyaW5nIGluCi0vLyBDaGFubmVsTGF5b3V0IGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIFdpbmRvd3Mgc3BlY2lmaWMgY29uZmlndXJhdGlvbi4KLS8vIEFzIGFuIGV4YW1wbGU6IEtTQVVESU9fU1BFQUtFUl83UE9JTlQxX1NVUlJPVU5EIGlzIG1hcHBlZCB0bwotLy8gQ0hBTk5FTF9MQVlPVVRfN18xIGJ1dCB0aGUgcG9zaXRpb25zIG9mIEJhY2sgTCwgQmFjayBSIGFuZCBTaWRlIEwsIFNpZGUgUgotLy8gc3BlYWtlcnMgYXJlIGRpZmZlcmVudCBpbiB0aGVzZSB0d28gZGVmaW5pdGlvbnMuCi1zdGF0aWMgQ2hhbm5lbExheW91dCBDaGFubmVsQ29uZmlnVG9DaGFubmVsTGF5b3V0KENoYW5uZWxDb25maWcgY29uZmlnKSB7Ci0gIHN3aXRjaCAoY29uZmlnKSB7Ci0gICAgY2FzZSBLU0FVRElPX1NQRUFLRVJfRElSRUNUT1VUOgotICAgICAgRFZMT0coMikgPDwgIktTQVVESU9fU1BFQUtFUl9ESVJFQ1RPVVQ9PkNIQU5ORUxfTEFZT1VUX05PTkUiOwotICAgICAgcmV0dXJuIENIQU5ORUxfTEFZT1VUX05PTkU7Ci0gICAgY2FzZSBLU0FVRElPX1NQRUFLRVJfTU9OTzoKLSAgICAgIERWTE9HKDIpIDw8ICJLU0FVRElPX1NQRUFLRVJfTU9OTz0+Q0hBTk5FTF9MQVlPVVRfTU9OTyI7Ci0gICAgICByZXR1cm4gQ0hBTk5FTF9MQVlPVVRfTU9OTzsKLSAgICBjYXNlIEtTQVVESU9fU1BFQUtFUl9TVEVSRU86Ci0gICAgICBEVkxPRygyKSA8PCAiS1NBVURJT19TUEVBS0VSX1NURVJFTz0+Q0hBTk5FTF9MQVlPVVRfU1RFUkVPIjsKLSAgICAgIHJldHVybiBDSEFOTkVMX0xBWU9VVF9TVEVSRU87Ci0gICAgY2FzZSBLU0FVRElPX1NQRUFLRVJfUVVBRDoKLSAgICAgIERWTE9HKDIpIDw8ICJLU0FVRElPX1NQRUFLRVJfUVVBRD0+Q0hBTk5FTF9MQVlPVVRfUVVBRCI7Ci0gICAgICByZXR1cm4gQ0hBTk5FTF9MQVlPVVRfUVVBRDsKLSAgICBjYXNlIEtTQVVESU9fU1BFQUtFUl9TVVJST1VORDoKLSAgICAgIERWTE9HKDIpIDw8ICJLU0FVRElPX1NQRUFLRVJfU1VSUk9VTkQ9PkNIQU5ORUxfTEFZT1VUXzRfMCI7Ci0gICAgICByZXR1cm4gQ0hBTk5FTF9MQVlPVVRfNF8wOwotICAgIGNhc2UgS1NBVURJT19TUEVBS0VSXzVQT0lOVDE6Ci0gICAgICBEVkxPRygyKSA8PCAiS1NBVURJT19TUEVBS0VSXzVQT0lOVDE9PkNIQU5ORUxfTEFZT1VUXzVfMV9CQUNLIjsKLSAgICAgIHJldHVybiBDSEFOTkVMX0xBWU9VVF81XzFfQkFDSzsKLSAgICBjYXNlIEtTQVVESU9fU1BFQUtFUl81UE9JTlQxX1NVUlJPVU5EOgotICAgICAgRFZMT0coMikgPDwgIktTQVVESU9fU1BFQUtFUl81UE9JTlQxX1NVUlJPVU5EPT5DSEFOTkVMX0xBWU9VVF81XzEiOwotICAgICAgcmV0dXJuIENIQU5ORUxfTEFZT1VUXzVfMTsKLSAgICBjYXNlIEtTQVVESU9fU1BFQUtFUl83UE9JTlQxOgotICAgICAgRFZMT0coMikgPDwgIktTQVVESU9fU1BFQUtFUl83UE9JTlQxPT5DSEFOTkVMX0xBWU9VVF83XzFfV0lERSI7Ci0gICAgICByZXR1cm4gQ0hBTk5FTF9MQVlPVVRfN18xX1dJREU7Ci0gICAgY2FzZSBLU0FVRElPX1NQRUFLRVJfN1BPSU5UMV9TVVJST1VORDoKLSAgICAgIERWTE9HKDIpIDw8ICJLU0FVRElPX1NQRUFLRVJfN1BPSU5UMV9TVVJST1VORD0+Q0hBTk5FTF9MQVlPVVRfN18xIjsKLSAgICAgIHJldHVybiBDSEFOTkVMX0xBWU9VVF83XzE7Ci0gICAgZGVmYXVsdDoKLSAgICAgIERWTE9HKDIpIDw8ICJVbnN1cHBvcnRlZCBjaGFubmVsIGxheW91dDogIiA8PCBjb25maWc7Ci0gICAgICByZXR1cm4gQ0hBTk5FTF9MQVlPVVRfVU5TVVBQT1JURUQ7Ci0gIH0KLX0KLQotLy8gU2NvcGVkIFBST1BWQVJJQU5UIGNsYXNzIGZvciBhdXRvbWF0aWNhbGx5IGZyZWVpbmcgYSBDT00gUFJPUFZBUklBTlQKLS8vIHN0cnVjdHVyZSBhdCB0aGUgZW5kIG9mIGEgc2NvcGUuCi1jbGFzcyBTY29wZWRQcm9wZXJ0eVZhcmlhbnQgewotIHB1YmxpYzoKLSAgU2NvcGVkUHJvcGVydHlWYXJpYW50KCkgewotICAgIFByb3BWYXJpYW50SW5pdCgmcHJvcHZhcl8pOwotICB9Ci0gIH5TY29wZWRQcm9wZXJ0eVZhcmlhbnQoKSB7Ci0gICAgUHJvcFZhcmlhbnRDbGVhcigmcHJvcHZhcl8pOwotICB9Ci0KLSAgLy8gUmV0cmlldmVzIHRoZSBwb2ludGVyIGFkZHJlc3MuCi0gIC8vIFVzZWQgdG8gcmVjZWl2ZSBhIFBST1BWQVJJQU5UIGFzIGFuIG91dCBhcmd1bWVudCAoYW5kIHRha2Ugb3duZXJzaGlwKS4KLSAgUFJPUFZBUklBTlQqIFJlY2VpdmUoKSB7Ci0gICAgRENIRUNLX0VRKHByb3B2YXJfLnZ0LCBWVF9FTVBUWSk7Ci0gICAgcmV0dXJuICZwcm9wdmFyXzsKLSAgfQotCi0gIFZBUlRZUEUgdHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gcHJvcHZhcl8udnQ7Ci0gIH0KLQotICBMUFdTVFIgYXNfd2lkZV9zdHJpbmcoKSBjb25zdCB7Ci0gICAgRENIRUNLX0VRKHR5cGUoKSwgVlRfTFBXU1RSKTsKLSAgICByZXR1cm4gcHJvcHZhcl8ucHdzelZhbDsKLSAgfQotCi0gcHJpdmF0ZToKLSAgUFJPUFZBUklBTlQgcHJvcHZhcl87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNjb3BlZFByb3BlcnR5VmFyaWFudCk7Ci19OwotCi1ib29sIENvcmVBdWRpb1V0aWw6OklzU3VwcG9ydGVkKCkgewotICAvLyBNaWNyb3NvZnQgZG9lcyBub3QgcGxhbiB0byBtYWtlIHRoZSBDb3JlIEF1ZGlvIEFQSXMgYXZhaWxhYmxlIGZvciB1c2UKLSAgLy8gd2l0aCBlYXJsaWVyIHZlcnNpb25zIG9mIFdpbmRvd3MsIGluY2x1ZGluZyBNaWNyb3NvZnQgV2luZG93cyBTZXJ2ZXIgMjAwMywKLSAgLy8gV2luZG93cyBYUCwgV2luZG93cyBNaWxsZW5uaXVtIEVkaXRpb24sIFdpbmRvd3MgMjAwMCwgYW5kIFdpbmRvd3MgOTguCi0gIHJldHVybiAoYmFzZTo6d2luOjpHZXRWZXJzaW9uKCkgPj0gYmFzZTo6d2luOjpWRVJTSU9OX1ZJU1RBKTsKLX0KLQotYmFzZTo6VGltZURlbHRhIENvcmVBdWRpb1V0aWw6OlJlZmVyZXJlbmNlVGltZVRvVGltZURlbHRhKFJFRkVSRU5DRV9USU1FIHRpbWUpIHsKLSAgLy8gRWFjaCB1bml0IG9mIHJlZmVyZW5jZSB0aW1lIGlzIDEwMCBuYW5vc2Vjb25kcyA8PT4gMC4xIG1pY3Jvc2Vjb25kLgotICByZXR1cm4gYmFzZTo6VGltZURlbHRhOjpGcm9tTWljcm9zZWNvbmRzKDAuMSAqIHRpbWUgKyAwLjUpOwotfQotCi1BVURDTE5UX1NIQVJFTU9ERSBDb3JlQXVkaW9VdGlsOjpHZXRTaGFyZU1vZGUoKSB7Ci0gIGNvbnN0IENvbW1hbmRMaW5lKiBjbWRfbGluZSA9IENvbW1hbmRMaW5lOjpGb3JDdXJyZW50UHJvY2VzcygpOwotICBpZiAoY21kX2xpbmUtPkhhc1N3aXRjaChzd2l0Y2hlczo6a0VuYWJsZUV4Y2x1c2l2ZUF1ZGlvKSkKLSAgICByZXR1cm4gQVVEQ0xOVF9TSEFSRU1PREVfRVhDTFVTSVZFOwotICByZXR1cm4gQVVEQ0xOVF9TSEFSRU1PREVfU0hBUkVEOwotfQotCi1pbnQgQ29yZUF1ZGlvVXRpbDo6TnVtYmVyT2ZBY3RpdmVEZXZpY2VzKEVEYXRhRmxvdyBkYXRhX2Zsb3cpIHsKLSAgRENIRUNLKENvcmVBdWRpb1V0aWw6OklzU3VwcG9ydGVkKCkpOwotICAvLyBDcmVhdGUgdGhlIElNTURldmljZUVudW1lcmF0b3IgaW50ZXJmYWNlLgotICBTY29wZWRDb21QdHI8SU1NRGV2aWNlRW51bWVyYXRvcj4gZGV2aWNlX2VudW1lcmF0b3IgPQotICAgICAgQ3JlYXRlRGV2aWNlRW51bWVyYXRvcigpOwotICBpZiAoIWRldmljZV9lbnVtZXJhdG9yKQotICAgIHJldHVybiAwOwotCi0gIC8vIEdlbmVyYXRlIGEgY29sbGVjdGlvbiBvZiBhY3RpdmUgKHByZXNlbnQgYW5kIG5vdCBkaXNhYmxlZCkgYXVkaW8gZW5kcG9pbnQKLSAgLy8gZGV2aWNlcyBmb3IgdGhlIHNwZWNpZmllZCBkYXRhLWZsb3cgZGlyZWN0aW9uLgotICAvLyBUaGlzIG1ldGhvZCB3aWxsIHN1Y2NlZWQgZXZlbiBpZiBhbGwgZGV2aWNlcyBhcmUgZGlzYWJsZWQuCi0gIFNjb3BlZENvbVB0cjxJTU1EZXZpY2VDb2xsZWN0aW9uPiBjb2xsZWN0aW9uOwotICBIUkVTVUxUIGhyID0gZGV2aWNlX2VudW1lcmF0b3ItPkVudW1BdWRpb0VuZHBvaW50cyhkYXRhX2Zsb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFVklDRV9TVEFURV9BQ1RJVkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uUmVjZWl2ZSgpKTsKLSAgaWYgKEZBSUxFRChocikpIHsKLSAgICBMT0coRVJST1IpIDw8ICJJTU1EZXZpY2VDb2xsZWN0aW9uOjpFbnVtQXVkaW9FbmRwb2ludHM6ICIgPDwgc3RkOjpoZXggPDwgaHI7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLyBSZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBhdWRpbyBkZXZpY2VzIGZvciB0aGUgc3BlY2lmaWVkIGRpcmVjdGlvbgotICBVSU5UIG51bWJlcl9vZl9hY3RpdmVfZGV2aWNlcyA9IDA7Ci0gIGNvbGxlY3Rpb24tPkdldENvdW50KCZudW1iZXJfb2ZfYWN0aXZlX2RldmljZXMpOwotICBEVkxPRygyKSA8PCAoKGRhdGFfZmxvdyA9PSBlQ2FwdHVyZSkgPyAiW2luIF0gIiA6ICJbb3V0XSAiKQotICAgICAgICAgICA8PCAibnVtYmVyIG9mIGRldmljZXM6ICIgPDwgbnVtYmVyX29mX2FjdGl2ZV9kZXZpY2VzOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihudW1iZXJfb2ZfYWN0aXZlX2RldmljZXMpOwotfQotCi1TY29wZWRDb21QdHI8SU1NRGV2aWNlRW51bWVyYXRvcj4gQ29yZUF1ZGlvVXRpbDo6Q3JlYXRlRGV2aWNlRW51bWVyYXRvcigpIHsKLSAgRENIRUNLKENvcmVBdWRpb1V0aWw6OklzU3VwcG9ydGVkKCkpOwotICBTY29wZWRDb21QdHI8SU1NRGV2aWNlRW51bWVyYXRvcj4gZGV2aWNlX2VudW1lcmF0b3I7Ci0gIEhSRVNVTFQgaHIgPSBDb0NyZWF0ZUluc3RhbmNlKF9fdXVpZG9mKE1NRGV2aWNlRW51bWVyYXRvciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMU0NUWF9JTlBST0NfU0VSVkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3V1aWRvZihJTU1EZXZpY2VFbnVtZXJhdG9yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2VudW1lcmF0b3IuUmVjZWl2ZVZvaWQoKSk7Ci0gIC8vIENPX0VfTk9USU5JVElBTElaRUQgaXMgdGhlIG1vc3QgbGlrZWx5IHJlYXNvbiBmb3IgZmFpbHVyZSBhbmQgaWYgdGhhdAotICAvLyBoYXBwZW5zIHdlIG1pZ2h0IGFzIHdlbGwgZGllIGhlcmUuCi0gIENIRUNLKFNVQ0NFRURFRChocikpOwotICByZXR1cm4gZGV2aWNlX2VudW1lcmF0b3I7Ci19Ci0KLVNjb3BlZENvbVB0cjxJTU1EZXZpY2U+IENvcmVBdWRpb1V0aWw6OkNyZWF0ZURlZmF1bHREZXZpY2UoRURhdGFGbG93IGRhdGFfZmxvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJvbGUgcm9sZSkgewotICBEQ0hFQ0soQ29yZUF1ZGlvVXRpbDo6SXNTdXBwb3J0ZWQoKSk7Ci0gIFNjb3BlZENvbVB0cjxJTU1EZXZpY2U+IGVuZHBvaW50X2RldmljZTsKLQotICAvLyBDcmVhdGUgdGhlIElNTURldmljZUVudW1lcmF0b3IgaW50ZXJmYWNlLgotICBTY29wZWRDb21QdHI8SU1NRGV2aWNlRW51bWVyYXRvcj4gZGV2aWNlX2VudW1lcmF0b3IgPQotICAgICAgQ3JlYXRlRGV2aWNlRW51bWVyYXRvcigpOwotICBpZiAoIWRldmljZV9lbnVtZXJhdG9yKQotICAgIHJldHVybiBlbmRwb2ludF9kZXZpY2U7Ci0KLSAgLy8gUmV0cmlldmUgdGhlIGRlZmF1bHQgYXVkaW8gZW5kcG9pbnQgZm9yIHRoZSBzcGVjaWZpZWQgZGF0YS1mbG93Ci0gIC8vIGRpcmVjdGlvbiBhbmQgcm9sZS4KLSAgSFJFU1VMVCBociA9IGRldmljZV9lbnVtZXJhdG9yLT5HZXREZWZhdWx0QXVkaW9FbmRwb2ludCgKLSAgICAgIGRhdGFfZmxvdywgcm9sZSwgZW5kcG9pbnRfZGV2aWNlLlJlY2VpdmUoKSk7Ci0KLSAgaWYgKEZBSUxFRChocikpIHsKLSAgICBEVkxPRygxKSA8PCAiSU1NRGV2aWNlRW51bWVyYXRvcjo6R2V0RGVmYXVsdEF1ZGlvRW5kcG9pbnQ6ICIKLSAgICAgICAgICAgICA8PCBzdGQ6OmhleCA8PCBocjsKLSAgICByZXR1cm4gZW5kcG9pbnRfZGV2aWNlOwotICB9Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgdGhlIGF1ZGlvIGVuZHBvaW50IGRldmljZSBpcyBhY3RpdmUsIGkuZS4sIHRoYXQgdGhlIGF1ZGlvCi0gIC8vIGFkYXB0ZXIgdGhhdCBjb25uZWN0cyB0byB0aGUgZW5kcG9pbnQgZGV2aWNlIGlzIHByZXNlbnQgYW5kIGVuYWJsZWQuCi0gIERXT1JEIHN0YXRlID0gREVWSUNFX1NUQVRFX0RJU0FCTEVEOwotICBociA9IGVuZHBvaW50X2RldmljZS0+R2V0U3RhdGUoJnN0YXRlKTsKLSAgaWYgKFNVQ0NFRURFRChocikpIHsKLSAgICBpZiAoIShzdGF0ZSAmIERFVklDRV9TVEFURV9BQ1RJVkUpKSB7Ci0gICAgICBEVkxPRygxKSA8PCAiU2VsZWN0ZWQgZW5kcG9pbnQgZGV2aWNlIGlzIG5vdCBhY3RpdmUiOwotICAgICAgZW5kcG9pbnRfZGV2aWNlLlJlbGVhc2UoKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGVuZHBvaW50X2RldmljZTsKLX0KLQotU2NvcGVkQ29tUHRyPElNTURldmljZT4gQ29yZUF1ZGlvVXRpbDo6Q3JlYXRlRGV2aWNlKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfaWQpIHsKLSAgRENIRUNLKENvcmVBdWRpb1V0aWw6OklzU3VwcG9ydGVkKCkpOwotICBTY29wZWRDb21QdHI8SU1NRGV2aWNlPiBlbmRwb2ludF9kZXZpY2U7Ci0KLSAgLy8gQ3JlYXRlIHRoZSBJTU1EZXZpY2VFbnVtZXJhdG9yIGludGVyZmFjZS4KLSAgU2NvcGVkQ29tUHRyPElNTURldmljZUVudW1lcmF0b3I+IGRldmljZV9lbnVtZXJhdG9yID0KLSAgICAgIENyZWF0ZURldmljZUVudW1lcmF0b3IoKTsKLSAgaWYgKCFkZXZpY2VfZW51bWVyYXRvcikKLSAgICByZXR1cm4gZW5kcG9pbnRfZGV2aWNlOwotCi0gIC8vIFJldHJpZXZlIGFuIGF1ZGlvIGRldmljZSBzcGVjaWZpZWQgYnkgYW4gZW5kcG9pbnQgZGV2aWNlLWlkZW50aWZpY2F0aW9uCi0gIC8vIHN0cmluZy4KLSAgSFJFU1VMVCBociA9IGRldmljZV9lbnVtZXJhdG9yLT5HZXREZXZpY2UoVVRGOFRvVVRGMTYoZGV2aWNlX2lkKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludF9kZXZpY2UuUmVjZWl2ZSgpKTsKLSAgRFZMT0dfSUYoMSwgRkFJTEVEKGhyKSkgPDwgIklNTURldmljZUVudW1lcmF0b3I6OkdldERldmljZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmhleCA8PCBocjsKLSAgcmV0dXJuIGVuZHBvaW50X2RldmljZTsKLX0KLQotSFJFU1VMVCBDb3JlQXVkaW9VdGlsOjpHZXREZXZpY2VOYW1lKElNTURldmljZSogZGV2aWNlLCBBdWRpb0RldmljZU5hbWUqIG5hbWUpIHsKLSAgRENIRUNLKENvcmVBdWRpb1V0aWw6OklzU3VwcG9ydGVkKCkpOwotCi0gIC8vIFJldHJpZXZlIHVuaXF1ZSBuYW1lIG9mIGVuZHBvaW50IGRldmljZS4KLSAgLy8gRXhhbXBsZTogInswLjAuMS4wMDAwMDAwMH0uezhkYjYwMjBmLTE4ZTMtNGYyNS1iNmY1LTc3MjZjOTEyMjU3NH0iLgotICBBdWRpb0RldmljZU5hbWUgZGV2aWNlX25hbWU7Ci0gIFNjb3BlZENvTWVtPFdDSEFSPiBlbmRwb2ludF9kZXZpY2VfaWQ7Ci0gIEhSRVNVTFQgaHIgPSBkZXZpY2UtPkdldElkKCZlbmRwb2ludF9kZXZpY2VfaWQpOwotICBpZiAoRkFJTEVEKGhyKSkKLSAgICByZXR1cm4gaHI7Ci0gIFdpZGVUb1VURjgoZW5kcG9pbnRfZGV2aWNlX2lkLCB3Y3NsZW4oZW5kcG9pbnRfZGV2aWNlX2lkKSwKLSAgICAgICAgICAgICAmZGV2aWNlX25hbWUudW5pcXVlX2lkKTsKLQotICAvLyBSZXRyaWV2ZSB1c2VyLWZyaWVuZGx5IG5hbWUgb2YgZW5kcG9pbnQgZGV2aWNlLgotICAvLyBFeGFtcGxlOiAiTWljcm9waG9uZSAoUmVhbHRlayBIaWdoIERlZmluaXRpb24gQXVkaW8pIi4KLSAgU2NvcGVkQ29tUHRyPElQcm9wZXJ0eVN0b3JlPiBwcm9wZXJ0aWVzOwotICBociA9IGRldmljZS0+T3BlblByb3BlcnR5U3RvcmUoU1RHTV9SRUFELCBwcm9wZXJ0aWVzLlJlY2VpdmUoKSk7Ci0gIGlmIChGQUlMRUQoaHIpKQotICAgIHJldHVybiBocjsKLSAgU2NvcGVkUHJvcGVydHlWYXJpYW50IGZyaWVuZGx5X25hbWU7Ci0gIGhyID0gcHJvcGVydGllcy0+R2V0VmFsdWUoUEtFWV9EZXZpY2VfRnJpZW5kbHlOYW1lLCBmcmllbmRseV9uYW1lLlJlY2VpdmUoKSk7Ci0gIGlmIChGQUlMRUQoaHIpKQotICAgIHJldHVybiBocjsKLSAgaWYgKGZyaWVuZGx5X25hbWUuYXNfd2lkZV9zdHJpbmcoKSkgewotICAgIFdpZGVUb1VURjgoZnJpZW5kbHlfbmFtZS5hc193aWRlX3N0cmluZygpLAotICAgICAgICAgICAgICAgd2NzbGVuKGZyaWVuZGx5X25hbWUuYXNfd2lkZV9zdHJpbmcoKSksCi0gICAgICAgICAgICAgICAmZGV2aWNlX25hbWUuZGV2aWNlX25hbWUpOwotICB9Ci0KLSAgKm5hbWUgPSBkZXZpY2VfbmFtZTsKLSAgRFZMT0coMikgPDwgImZyaWVuZGx5IG5hbWU6ICIgPDwgZGV2aWNlX25hbWUuZGV2aWNlX25hbWU7Ci0gIERWTE9HKDIpIDw8ICJ1bmlxdWUgaWQgICAgOiAiIDw8IGRldmljZV9uYW1lLnVuaXF1ZV9pZDsKLSAgcmV0dXJuIGhyOwotfQotCi1zdGQ6OnN0cmluZyBDb3JlQXVkaW9VdGlsOjpHZXRGcmllbmRseU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCkgewotICBEQ0hFQ0soQ29yZUF1ZGlvVXRpbDo6SXNTdXBwb3J0ZWQoKSk7Ci0gIFNjb3BlZENvbVB0cjxJTU1EZXZpY2U+IGF1ZGlvX2RldmljZSA9IENyZWF0ZURldmljZShkZXZpY2VfaWQpOwotICBpZiAoIWF1ZGlvX2RldmljZSkKLSAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKLQotICBBdWRpb0RldmljZU5hbWUgZGV2aWNlX25hbWU7Ci0gIEhSRVNVTFQgaHIgPSBHZXREZXZpY2VOYW1lKGF1ZGlvX2RldmljZSwgJmRldmljZV9uYW1lKTsKLSAgaWYgKEZBSUxFRChocikpCi0gICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7Ci0KLSAgcmV0dXJuIGRldmljZV9uYW1lLmRldmljZV9uYW1lOwotfQotCi1ib29sIENvcmVBdWRpb1V0aWw6OkRldmljZUlzRGVmYXVsdChFRGF0YUZsb3cgZmxvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSb2xlIHJvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXZpY2VfaWQpIHsKLSAgRENIRUNLKENvcmVBdWRpb1V0aWw6OklzU3VwcG9ydGVkKCkpOwotICBTY29wZWRDb21QdHI8SU1NRGV2aWNlPiBkZXZpY2UgPSBDcmVhdGVEZWZhdWx0RGV2aWNlKGZsb3csIHJvbGUpOwotICBpZiAoIWRldmljZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgU2NvcGVkQ29NZW08V0NIQVI+IGRlZmF1bHRfZGV2aWNlX2lkOwotICBIUkVTVUxUIGhyID0gZGV2aWNlLT5HZXRJZCgmZGVmYXVsdF9kZXZpY2VfaWQpOwotICBpZiAoRkFJTEVEKGhyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3RkOjpzdHJpbmcgc3RyX2RlZmF1bHQ7Ci0gIFdpZGVUb1VURjgoZGVmYXVsdF9kZXZpY2VfaWQsIHdjc2xlbihkZWZhdWx0X2RldmljZV9pZCksICZzdHJfZGVmYXVsdCk7Ci0gIGlmIChkZXZpY2VfaWQuY29tcGFyZShzdHJfZGVmYXVsdCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1FRGF0YUZsb3cgQ29yZUF1ZGlvVXRpbDo6R2V0RGF0YUZsb3coSU1NRGV2aWNlKiBkZXZpY2UpIHsKLSAgRENIRUNLKENvcmVBdWRpb1V0aWw6OklzU3VwcG9ydGVkKCkpOwotICBTY29wZWRDb21QdHI8SU1NRW5kcG9pbnQ+IGVuZHBvaW50OwotICBIUkVTVUxUIGhyID0gZGV2aWNlLT5RdWVyeUludGVyZmFjZShlbmRwb2ludC5SZWNlaXZlKCkpOwotICBpZiAoRkFJTEVEKGhyKSkgewotICAgIERWTE9HKDEpIDw8ICJJTU1EZXZpY2U6OlF1ZXJ5SW50ZXJmYWNlOiAiIDw8IHN0ZDo6aGV4IDw8IGhyOwotICAgIHJldHVybiBlQWxsOwotICB9Ci0KLSAgRURhdGFGbG93IGRhdGFfZmxvdzsKLSAgaHIgPSBlbmRwb2ludC0+R2V0RGF0YUZsb3coJmRhdGFfZmxvdyk7Ci0gIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgRFZMT0coMSkgPDwgIklNTUVuZHBvaW50OjpHZXREYXRhRmxvdzogIiA8PCBzdGQ6OmhleCA8PCBocjsKLSAgICByZXR1cm4gZUFsbDsKLSAgfQotICByZXR1cm4gZGF0YV9mbG93OwotfQotCi1TY29wZWRDb21QdHI8SUF1ZGlvQ2xpZW50PiBDb3JlQXVkaW9VdGlsOjpDcmVhdGVDbGllbnQoCi0gICAgSU1NRGV2aWNlKiBhdWRpb19kZXZpY2UpIHsKLSAgRENIRUNLKENvcmVBdWRpb1V0aWw6OklzU3VwcG9ydGVkKCkpOwotCi0gIC8vIENyZWF0ZXMgYW5kIGFjdGl2YXRlcyBhbiBJQXVkaW9DbGllbnQgQ09NIG9iamVjdCBnaXZlbiB0aGUgc2VsZWN0ZWQKLSAgLy8gZW5kcG9pbnQgZGV2aWNlLgotICBTY29wZWRDb21QdHI8SUF1ZGlvQ2xpZW50PiBhdWRpb19jbGllbnQ7Ci0gIEhSRVNVTFQgaHIgPSBhdWRpb19kZXZpY2UtPkFjdGl2YXRlKF9fdXVpZG9mKElBdWRpb0NsaWVudCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMU0NUWF9JTlBST0NfU0VSVkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jbGllbnQuUmVjZWl2ZVZvaWQoKSk7Ci0gIERWTE9HX0lGKDEsIEZBSUxFRChocikpIDw8ICJJTU1EZXZpY2U6OkFjdGl2YXRlOiAiIDw8IHN0ZDo6aGV4IDw8IGhyOwotICByZXR1cm4gYXVkaW9fY2xpZW50OwotfQotCi1TY29wZWRDb21QdHI8SUF1ZGlvQ2xpZW50PiBDb3JlQXVkaW9VdGlsOjpDcmVhdGVEZWZhdWx0Q2xpZW50KAotICAgIEVEYXRhRmxvdyBkYXRhX2Zsb3csIEVSb2xlIHJvbGUpIHsKLSAgRENIRUNLKENvcmVBdWRpb1V0aWw6OklzU3VwcG9ydGVkKCkpOwotICBTY29wZWRDb21QdHI8SU1NRGV2aWNlPiBkZWZhdWx0X2RldmljZShDcmVhdGVEZWZhdWx0RGV2aWNlKGRhdGFfZmxvdywgcm9sZSkpOwotICByZXR1cm4gKGRlZmF1bHRfZGV2aWNlID8gQ3JlYXRlQ2xpZW50KGRlZmF1bHRfZGV2aWNlKSA6Ci0gICAgICBTY29wZWRDb21QdHI8SUF1ZGlvQ2xpZW50PigpKTsKLX0KLQotSFJFU1VMVCBDb3JlQXVkaW9VdGlsOjpHZXRTaGFyZWRNb2RlTWl4Rm9ybWF0KAotICAgIElBdWRpb0NsaWVudCogY2xpZW50LCBXQVZFRk9STUFUUENNRVgqIGZvcm1hdCkgewotICBEQ0hFQ0soQ29yZUF1ZGlvVXRpbDo6SXNTdXBwb3J0ZWQoKSk7Ci0gIFNjb3BlZENvTWVtPFdBVkVGT1JNQVRQQ01FWD4gZm9ybWF0X3BjbWV4OwotICBIUkVTVUxUIGhyID0gY2xpZW50LT5HZXRNaXhGb3JtYXQoCi0gICAgICByZWludGVycHJldF9jYXN0PFdBVkVGT1JNQVRFWCoqPigmZm9ybWF0X3BjbWV4KSk7Ci0gIGlmIChGQUlMRUQoaHIpKQotICAgIHJldHVybiBocjsKLQotICBzaXplX3QgYnl0ZXMgPSBzaXplb2YoV0FWRUZPUk1BVEVYKSArIGZvcm1hdF9wY21leC0+Rm9ybWF0LmNiU2l6ZTsKLSAgRENIRUNLX0VRKGJ5dGVzLCBzaXplb2YoV0FWRUZPUk1BVFBDTUVYKSk7Ci0KLSAgbWVtY3B5KGZvcm1hdCwgZm9ybWF0X3BjbWV4LCBieXRlcyk7Ci0KLSAgRFZMT0coMikgPDwgIndGb3JtYXRUYWc6IDB4IiA8PCBzdGQ6OmhleCA8PCBmb3JtYXQtPkZvcm1hdC53Rm9ybWF0VGFnCi0gICAgICAgICAgIDw8ICIsIG5DaGFubmVsczogIiA8PCBzdGQ6OmRlYyA8PCBmb3JtYXQtPkZvcm1hdC5uQ2hhbm5lbHMKLSAgICAgICAgICAgPDwgIiwgblNhbXBsZXNQZXJTZWM6ICIgPDwgZm9ybWF0LT5Gb3JtYXQublNhbXBsZXNQZXJTZWMKLSAgICAgICAgICAgPDwgIiwgbkF2Z0J5dGVzUGVyU2VjOiAiIDw8IGZvcm1hdC0+Rm9ybWF0Lm5BdmdCeXRlc1BlclNlYwotICAgICAgICAgICA8PCAiLCBuQmxvY2tBbGlnbjogIiA8PCBmb3JtYXQtPkZvcm1hdC5uQmxvY2tBbGlnbgotICAgICAgICAgICA8PCAiLCB3Qml0c1BlclNhbXBsZTogIiA8PCBmb3JtYXQtPkZvcm1hdC53Qml0c1BlclNhbXBsZQotICAgICAgICAgICA8PCAiLCBjYlNpemU6ICIgPDwgZm9ybWF0LT5Gb3JtYXQuY2JTaXplCi0gICAgICAgICAgIDw8ICIsIHdWYWxpZEJpdHNQZXJTYW1wbGU6ICIgPDwgZm9ybWF0LT5TYW1wbGVzLndWYWxpZEJpdHNQZXJTYW1wbGUKLSAgICAgICAgICAgPDwgIiwgZHdDaGFubmVsTWFzazogMHgiIDw8IHN0ZDo6aGV4IDw8IGZvcm1hdC0+ZHdDaGFubmVsTWFzazsKLQotICByZXR1cm4gaHI7Ci19Ci0KLWJvb2wgQ29yZUF1ZGlvVXRpbDo6SXNGb3JtYXRTdXBwb3J0ZWQoSUF1ZGlvQ2xpZW50KiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRENMTlRfU0hBUkVNT0RFIHNoYXJlX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdBVkVGT1JNQVRQQ01FWCogZm9ybWF0KSB7Ci0gIERDSEVDSyhDb3JlQXVkaW9VdGlsOjpJc1N1cHBvcnRlZCgpKTsKLSAgU2NvcGVkQ29NZW08V0FWRUZPUk1BVEVYVEVOU0lCTEU+IGNsb3Nlc3RfbWF0Y2g7Ci0gIEhSRVNVTFQgaHIgPSBjbGllbnQtPklzRm9ybWF0U3VwcG9ydGVkKAotICAgICAgc2hhcmVfbW9kZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBXQVZFRk9STUFURVgqPihmb3JtYXQpLAotICAgICAgcmVpbnRlcnByZXRfY2FzdDxXQVZFRk9STUFURVgqKj4oJmNsb3Nlc3RfbWF0Y2gpKTsKLQotICAvLyBUaGlzIGxvZyBjYW4gb25seSBiZSB0cmlnZ2VyZWQgZm9yIHNoYXJlZCBtb2RlLgotICBETE9HX0lGKEVSUk9SLCBociA9PSBTX0ZBTFNFKSA8PCAiRm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiYnV0IGEgY2xvc2VzdCBtYXRjaCBleGlzdHMuIjsKLSAgLy8gVGhpcyBsb2cgY2FuIGJlIHRyaWdnZXJlZCBib3RoIGZvciBzaGFyZWQgYW5kIGV4Y2x1c2l2ZSBtb2Rlcy4KLSAgRExPR19JRihFUlJPUiwgaHIgPT0gQVVEQ0xOVF9FX1VOU1VQUE9SVEVEX0ZPUk1BVCkgPDwgIlVuc3VwcG9ydGVkIGZvcm1hdC4iOwotICBpZiAoaHIgPT0gU19GQUxTRSkgewotICAgIERWTE9HKDIpIDw8ICJ3Rm9ybWF0VGFnOiAiIDw8IGNsb3Nlc3RfbWF0Y2gtPkZvcm1hdC53Rm9ybWF0VGFnCi0gICAgICAgICAgICAgPDwgIiwgbkNoYW5uZWxzOiAiIDw8IGNsb3Nlc3RfbWF0Y2gtPkZvcm1hdC5uQ2hhbm5lbHMKLSAgICAgICAgICAgICA8PCAiLCBuU2FtcGxlc1BlclNlYzogIiA8PCBjbG9zZXN0X21hdGNoLT5Gb3JtYXQublNhbXBsZXNQZXJTZWMKLSAgICAgICAgICAgICA8PCAiLCB3Qml0c1BlclNhbXBsZTogIiA8PCBjbG9zZXN0X21hdGNoLT5Gb3JtYXQud0JpdHNQZXJTYW1wbGU7Ci0gIH0KLQotICByZXR1cm4gKGhyID09IFNfT0spOwotfQotCi1IUkVTVUxUIENvcmVBdWRpb1V0aWw6OkdldERldmljZVBlcmlvZChJQXVkaW9DbGllbnQqIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRENMTlRfU0hBUkVNT0RFIHNoYXJlX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZFUkVOQ0VfVElNRSogZGV2aWNlX3BlcmlvZCkgewotICBEQ0hFQ0soQ29yZUF1ZGlvVXRpbDo6SXNTdXBwb3J0ZWQoKSk7Ci0KLSAgLy8gR2V0IHRoZSBwZXJpb2Qgb2YgdGhlIGVuZ2luZSB0aHJlYWQuCi0gIFJFRkVSRU5DRV9USU1FIGRlZmF1bHRfcGVyaW9kID0gMDsKLSAgUkVGRVJFTkNFX1RJTUUgbWluaW11bV9wZXJpb2QgPSAwOwotICBIUkVTVUxUIGhyID0gY2xpZW50LT5HZXREZXZpY2VQZXJpb2QoJmRlZmF1bHRfcGVyaW9kLCAmbWluaW11bV9wZXJpb2QpOwotICBpZiAoRkFJTEVEKGhyKSkKLSAgICByZXR1cm4gaHI7Ci0KLSAgKmRldmljZV9wZXJpb2QgPSAoc2hhcmVfbW9kZSA9PSBBVURDTE5UX1NIQVJFTU9ERV9TSEFSRUQpID8gZGVmYXVsdF9wZXJpb2QgOgotICAgICAgbWluaW11bV9wZXJpb2Q7Ci0gIERWTE9HKDIpIDw8ICJkZXZpY2VfcGVyaW9kOiAiCi0gICAgICAgICAgIDw8IFJlZmVyZXJlbmNlVGltZVRvVGltZURlbHRhKCpkZXZpY2VfcGVyaW9kKS5Jbk1pbGxpc2Vjb25kc0YoKQotICAgICAgICAgICA8PCAiIFttc10iOwotICByZXR1cm4gaHI7Ci19Ci0KLUhSRVNVTFQgQ29yZUF1ZGlvVXRpbDo6R2V0UHJlZmVycmVkQXVkaW9QYXJhbWV0ZXJzKAotICAgIElBdWRpb0NsaWVudCogY2xpZW50LCBBdWRpb1BhcmFtZXRlcnMqIHBhcmFtcykgewotICBEQ0hFQ0soQ29yZUF1ZGlvVXRpbDo6SXNTdXBwb3J0ZWQoKSk7Ci0gIFdBVkVGT1JNQVRQQ01FWCBmb3JtYXQ7Ci0gIEhSRVNVTFQgaHIgPSBHZXRTaGFyZWRNb2RlTWl4Rm9ybWF0KGNsaWVudCwgJmZvcm1hdCk7Ci0gIGlmIChGQUlMRUQoaHIpKQotICAgIHJldHVybiBocjsKLQotICBSRUZFUkVOQ0VfVElNRSBkZWZhdWx0X3BlcmlvZCA9IDA7Ci0gIGhyID0gR2V0RGV2aWNlUGVyaW9kKGNsaWVudCwgQVVEQ0xOVF9TSEFSRU1PREVfU0hBUkVELCAmZGVmYXVsdF9wZXJpb2QpOwotICBpZiAoRkFJTEVEKGhyKSkKLSAgICByZXR1cm4gaHI7Ci0KLSAgLy8gR2V0IHRoZSBpbnRlZ2VyIG1hc2sgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIGNoYW5uZWwgbGF5b3V0IHRoZQotICAvLyBhdWRpbyBlbmdpbmUgdXNlcyBmb3IgaXRzIGludGVybmFsIHByb2Nlc3NpbmcvbWl4aW5nIG9mIHNoYXJlZC1tb2RlCi0gIC8vIHN0cmVhbXMuIFRoaXMgbWFzayBpbmRpY2F0ZXMgd2hpY2ggY2hhbm5lbHMgYXJlIHByZXNlbnQgaW4gdGhlIG11bHRpLQotICAvLyBjaGFubmVsIHN0cmVhbS4gVGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBjb3JyZXNwb25kcyB3aXRoIHRoZSBGcm9udCBMZWZ0Ci0gIC8vIHNwZWFrZXIsIHRoZSBuZXh0IGxlYXN0IHNpZ25pZmljYW50IGJpdCBjb3JyZXNwb25kcyB0byB0aGUgRnJvbnQgUmlnaHQKLSAgLy8gc3BlYWtlciwgYW5kIHNvIG9uLCBjb250aW51aW5nIGluIHRoZSBvcmRlciBkZWZpbmVkIGluIEtzTWVkaWEuaC4KLSAgLy8gU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2hhcmR3YXJlL2ZmNTM3MDgzLmFzcHgKLSAgLy8gZm9yIG1vcmUgZGV0YWlscy4KLSAgQ2hhbm5lbENvbmZpZyBjaGFubmVsX2NvbmZpZyA9IGZvcm1hdC5kd0NoYW5uZWxNYXNrOwotCi0gIC8vIENvbnZlcnQgTWljcm9zb2Z0J3MgY2hhbm5lbCBjb25maWd1cmF0aW9uIHRvIGdlbnJpYyBDaGFubmVsTGF5b3V0LgotICBDaGFubmVsTGF5b3V0IGNoYW5uZWxfbGF5b3V0ID0gQ2hhbm5lbENvbmZpZ1RvQ2hhbm5lbExheW91dChjaGFubmVsX2NvbmZpZyk7Ci0KLSAgLy8gU3RvcmUgcHJlZmVycmVkIHNhbXBsZSByYXRlIGFuZCBidWZmZXIgc2l6ZS4KLSAgaW50IHNhbXBsZV9yYXRlID0gZm9ybWF0LkZvcm1hdC5uU2FtcGxlc1BlclNlYzsKLSAgaW50IGZyYW1lc19wZXJfYnVmZmVyID0gc3RhdGljX2Nhc3Q8aW50PihzYW1wbGVfcmF0ZSAqCi0gICAgICBSZWZlcmVyZW5jZVRpbWVUb1RpbWVEZWx0YShkZWZhdWx0X3BlcmlvZCkuSW5TZWNvbmRzRigpICsgMC41KTsKLQotICAvLyBUT0RPKGhlbnJpa2EpOiBwb3NzaWJseSB1c2UgZm9ybWF0LkZvcm1hdC53Qml0c1BlclNhbXBsZSBoZXJlIGluc3RlYWQuCi0gIC8vIFdlIHVzZSBhIGhhcmQtY29kZWQgdmFsdWUgb2YgMTYgYml0cyBwZXIgc2FtcGxlIHRvZGF5IGV2ZW4gaWYgbW9zdCBhdWRpbwotICAvLyBlbmdpbmVzIGRvZXMgdGhlIGFjdHVhbCBtaXhpbmcgaW4gMzIgYml0cyBwZXIgc2FtcGxlLgotICBpbnQgYml0c19wZXJfc2FtcGxlID0gMTY7Ci0KLSAgRFZMT0coMikgPDwgImNoYW5uZWxfbGF5b3V0ICAgOiAiIDw8IGNoYW5uZWxfbGF5b3V0OwotICBEVkxPRygyKSA8PCAic2FtcGxlX3JhdGUgICAgICA6ICIgPDwgc2FtcGxlX3JhdGU7Ci0gIERWTE9HKDIpIDw8ICJiaXRzX3Blcl9zYW1wbGUgIDogIiA8PCBiaXRzX3Blcl9zYW1wbGU7Ci0gIERWTE9HKDIpIDw8ICJmcmFtZXNfcGVyX2J1ZmZlcjogIiA8PCBmcmFtZXNfcGVyX2J1ZmZlcjsKLQotICBBdWRpb1BhcmFtZXRlcnMgYXVkaW9fcGFyYW1zKEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xPV19MQVRFTkNZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfbGF5b3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHNfcGVyX3NhbXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNfcGVyX2J1ZmZlcik7Ci0KLSAgKnBhcmFtcyA9IGF1ZGlvX3BhcmFtczsKLSAgcmV0dXJuIGhyOwotfQotCi1IUkVTVUxUIENvcmVBdWRpb1V0aWw6OkdldFByZWZlcnJlZEF1ZGlvUGFyYW1ldGVycygKLSAgICBFRGF0YUZsb3cgZGF0YV9mbG93LCBFUm9sZSByb2xlLCBBdWRpb1BhcmFtZXRlcnMqIHBhcmFtcykgewotICBEQ0hFQ0soQ29yZUF1ZGlvVXRpbDo6SXNTdXBwb3J0ZWQoKSk7Ci0KLSAgU2NvcGVkQ29tUHRyPElBdWRpb0NsaWVudD4gY2xpZW50ID0gQ3JlYXRlRGVmYXVsdENsaWVudChkYXRhX2Zsb3csIHJvbGUpOwotICBpZiAoIWNsaWVudCkgewotICAgIC8vIE1hcCBOVUxMLXBvaW50ZXIgdG8gbmV3IGVycm9yIGNvZGUgd2hpY2ggY2FuIGJlIGRpZmZlcmVudCBmcm9tIHRoZQotICAgIC8vIGFjdHVhbCBlcnJvciBjb2RlLiBUaGUgZXhhY3QgdmFsdWUgaXMgbm90IGltcG9ydGFudCBoZXJlLgotICAgIHJldHVybiBBVURDTE5UX0VfRU5EUE9JTlRfQ1JFQVRFX0ZBSUxFRDsKLSAgfQotICByZXR1cm4gR2V0UHJlZmVycmVkQXVkaW9QYXJhbWV0ZXJzKGNsaWVudCwgcGFyYW1zKTsKLX0KLQotSFJFU1VMVCBDb3JlQXVkaW9VdGlsOjpTaGFyZWRNb2RlSW5pdGlhbGl6ZShJQXVkaW9DbGllbnQqIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV0FWRUZPUk1BVFBDTUVYKiBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRSBldmVudF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogZW5kcG9pbnRfYnVmZmVyX3NpemUpIHsKLSAgRENIRUNLKENvcmVBdWRpb1V0aWw6OklzU3VwcG9ydGVkKCkpOwotCi0gIERXT1JEIHN0cmVhbV9mbGFncyA9IEFVRENMTlRfU1RSRUFNRkxBR1NfTk9QRVJTSVNUOwotCi0gIC8vIEVuYWJsZSBldmVudC1kcml2ZW4gc3RyZWFtaW5nIGlmIGEgdmFsaWQgZXZlbnQgaGFuZGxlIGlzIHByb3ZpZGVkLgotICAvLyBBZnRlciB0aGUgc3RyZWFtIHN0YXJ0cywgdGhlIGF1ZGlvIGVuZ2luZSB3aWxsIHNpZ25hbCB0aGUgZXZlbnQgaGFuZGxlCi0gIC8vIHRvIG5vdGlmeSB0aGUgY2xpZW50IGVhY2ggdGltZSBhIGJ1ZmZlciBiZWNvbWVzIHJlYWR5IHRvIHByb2Nlc3MuCi0gIC8vIEV2ZW50LWRyaXZlbiBidWZmZXJpbmcgaXMgc3VwcG9ydGVkIGZvciBib3RoIHJlbmRlcmluZyBhbmQgY2FwdHVyaW5nLgotICAvLyBCb3RoIHNoYXJlZC1tb2RlIGFuZCBleGNsdXNpdmUtbW9kZSBzdHJlYW1zIGNhbiB1c2UgZXZlbnQtZHJpdmVuIGJ1ZmZlcmluZy4KLSAgYm9vbCB1c2VfZXZlbnQgPSAoZXZlbnRfaGFuZGxlICE9IE5VTEwgJiYKLSAgICAgICAgICAgICAgICAgICAgZXZlbnRfaGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKTsKLSAgaWYgKHVzZV9ldmVudCkKLSAgICBzdHJlYW1fZmxhZ3MgfD0gQVVEQ0xOVF9TVFJFQU1GTEFHU19FVkVOVENBTExCQUNLOwotICBEVkxPRygyKSA8PCAic3RyZWFtX2ZsYWdzOiAweCIgPDwgc3RkOjpoZXggPDwgc3RyZWFtX2ZsYWdzOwotCi0gIC8vIEluaXRpYWxpemUgdGhlIHNoYXJlZCBtb2RlIGNsaWVudCBmb3IgbWluaW1hbCBkZWxheS4KLSAgSFJFU1VMVCBociA9IGNsaWVudC0+SW5pdGlhbGl6ZShBVURDTE5UX1NIQVJFTU9ERV9TSEFSRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IFdBVkVGT1JNQVRFWCo+KGZvcm1hdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgRFZMT0coMSkgPDwgIklBdWRpb0NsaWVudDo6SW5pdGlhbGl6ZTogIiA8PCBzdGQ6OmhleCA8PCBocjsKLSAgICByZXR1cm4gaHI7Ci0gIH0KLQotICBpZiAodXNlX2V2ZW50KSB7Ci0gICAgaHIgPSBjbGllbnQtPlNldEV2ZW50SGFuZGxlKGV2ZW50X2hhbmRsZSk7Ci0gICAgaWYgKEZBSUxFRChocikpIHsKLSAgICAgIERWTE9HKDEpIDw8ICJJQXVkaW9DbGllbnQ6OlNldEV2ZW50SGFuZGxlOiAiIDw8IHN0ZDo6aGV4IDw8IGhyOwotICAgICAgcmV0dXJuIGhyOwotICAgIH0KLSAgfQotCi0gIFVJTlQzMiBidWZmZXJfc2l6ZV9pbl9mcmFtZXMgPSAwOwotICBociA9IGNsaWVudC0+R2V0QnVmZmVyU2l6ZSgmYnVmZmVyX3NpemVfaW5fZnJhbWVzKTsKLSAgaWYgKEZBSUxFRChocikpIHsKLSAgICBEVkxPRygxKSA8PCAiSUF1ZGlvQ2xpZW50OjpHZXRCdWZmZXJTaXplOiAiIDw8IHN0ZDo6aGV4IDw8IGhyOwotICAgIHJldHVybiBocjsKLSAgfQotCi0gICplbmRwb2ludF9idWZmZXJfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oYnVmZmVyX3NpemVfaW5fZnJhbWVzKTsKLSAgRFZMT0coMikgPDwgImVuZHBvaW50IGJ1ZmZlciBzaXplOiAiIDw8IGJ1ZmZlcl9zaXplX2luX2ZyYW1lczsKLQotICAvLyBUT0RPKGhlbnJpa2EpOiB1dGlsaXplIHdoZW4gZGVsYXkgbWVhc3VyZW1lbnRzIGFyZSBhZGRlZC4KLSAgUkVGRVJFTkNFX1RJTUUgIGxhdGVuY3kgPSAwOwotICBociA9IGNsaWVudC0+R2V0U3RyZWFtTGF0ZW5jeSgmbGF0ZW5jeSk7Ci0gIERWTE9HKDIpIDw8ICJzdHJlYW0gbGF0ZW5jeTogIgotICAgICAgICAgICA8PCBSZWZlcmVyZW5jZVRpbWVUb1RpbWVEZWx0YShsYXRlbmN5KS5Jbk1pbGxpc2Vjb25kc0YoKSA8PCAiIFttc10iOwotICByZXR1cm4gaHI7Ci19Ci0KLVNjb3BlZENvbVB0cjxJQXVkaW9SZW5kZXJDbGllbnQ+IENvcmVBdWRpb1V0aWw6OkNyZWF0ZVJlbmRlckNsaWVudCgKLSAgICBJQXVkaW9DbGllbnQqIGNsaWVudCkgewotICBEQ0hFQ0soQ29yZUF1ZGlvVXRpbDo6SXNTdXBwb3J0ZWQoKSk7Ci0KLSAgLy8gR2V0IGFjY2VzcyB0byB0aGUgSUF1ZGlvUmVuZGVyQ2xpZW50IGludGVyZmFjZS4gVGhpcyBpbnRlcmZhY2UKLSAgLy8gZW5hYmxlcyB1cyB0byB3cml0ZSBvdXRwdXQgZGF0YSB0byBhIHJlbmRlcmluZyBlbmRwb2ludCBidWZmZXIuCi0gIFNjb3BlZENvbVB0cjxJQXVkaW9SZW5kZXJDbGllbnQ+IGF1ZGlvX3JlbmRlcl9jbGllbnQ7Ci0gIEhSRVNVTFQgaHIgPSBjbGllbnQtPkdldFNlcnZpY2UoX191dWlkb2YoSUF1ZGlvUmVuZGVyQ2xpZW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19yZW5kZXJfY2xpZW50LlJlY2VpdmVWb2lkKCkpOwotICBpZiAoRkFJTEVEKGhyKSkgewotICAgIERWTE9HKDEpIDw8ICJJQXVkaW9DbGllbnQ6OkdldFNlcnZpY2U6ICIgPDwgc3RkOjpoZXggPDwgaHI7Ci0gICAgcmV0dXJuIFNjb3BlZENvbVB0cjxJQXVkaW9SZW5kZXJDbGllbnQ+KCk7Ci0gIH0KLQotICAvLyBUT0RPKGhlbnJpa2EpOiB2ZXJpZnkgdGhhdCB0aGlzIHNjaGVtZSBpcyB0aGUgc2FtZSBmb3Igc2hhcmVkIG1vZGUgYW5kCi0gIC8vIGV4Y2x1c2l2ZSBtb2RlIHN0cmVhbXMuCi0KLSAgLy8gQXZvaWQgc3RhcnQtdXAgZ2xpdGNoZXMgYnkgZmlsbGluZyB1cCB0aGUgZW5kcG9pbnQgYnVmZmVyIHdpdGggInNpbGVuY2UiCi0gIC8vIGJlZm9yZSBzdGFydGluZyB0aGUgc3RyZWFtLgotICBVSU5UMzIgZW5kcG9pbnRfYnVmZmVyX3NpemUgPSAwOwotICBociA9IGNsaWVudC0+R2V0QnVmZmVyU2l6ZSgmZW5kcG9pbnRfYnVmZmVyX3NpemUpOwotICBEVkxPR19JRigxLCBGQUlMRUQoaHIpKSA8PCAiSUF1ZGlvQ2xpZW50OjpHZXRCdWZmZXJTaXplOiAiIDw8IHN0ZDo6aGV4IDw8IGhyOwotCi0gIEJZVEUqIGRhdGEgPSBOVUxMOwotICBociA9IGF1ZGlvX3JlbmRlcl9jbGllbnQtPkdldEJ1ZmZlcihlbmRwb2ludF9idWZmZXJfc2l6ZSwgJmRhdGEpOwotICBEVkxPR19JRigxLCBGQUlMRUQoaHIpKSA8PCAiSUF1ZGlvUmVuZGVyQ2xpZW50OjpHZXRCdWZmZXI6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpoZXggPDwgaHI7Ci0gIGlmIChTVUNDRUVERUQoaHIpKSB7Ci0gICAgLy8gVXNpbmcgdGhlIEFVRENMTlRfQlVGRkVSRkxBR1NfU0lMRU5UIGZsYWcgZWxpbWluYXRlcyB0aGUgbmVlZCB0bwotICAgIC8vIGV4cGxpY2l0bHkgd3JpdGUgc2lsZW5jZSBkYXRhIHRvIHRoZSByZW5kZXJpbmcgYnVmZmVyLgotICAgIGhyID0gYXVkaW9fcmVuZGVyX2NsaWVudC0+UmVsZWFzZUJ1ZmZlcihlbmRwb2ludF9idWZmZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVEQ0xOVF9CVUZGRVJGTEFHU19TSUxFTlQpOwotICAgIERWTE9HX0lGKDEsIEZBSUxFRChocikpIDw8ICJJQXVkaW9SZW5kZXJDbGllbnQ6OlJlbGVhc2VCdWZmZXI6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmhleCA8PCBocjsKLSAgfQotCi0gIC8vIFNhbml0eSBjaGVjazogdmVyaWZ5IHRoYXQgdGhlIGVuZHBvaW50IGJ1ZmZlciBpcyBmaWxsZWQgd2l0aCBzaWxlbmNlLgotICBVSU5UMzIgbnVtX3F1ZXVlZF9mcmFtZXMgPSAwOwotICBjbGllbnQtPkdldEN1cnJlbnRQYWRkaW5nKCZudW1fcXVldWVkX2ZyYW1lcyk7Ci0gIERDSEVDSyhudW1fcXVldWVkX2ZyYW1lcyA9PSBlbmRwb2ludF9idWZmZXJfc2l6ZSk7Ci0KLSAgcmV0dXJuIGF1ZGlvX3JlbmRlcl9jbGllbnQ7Ci19Ci0KLVNjb3BlZENvbVB0cjxJQXVkaW9DYXB0dXJlQ2xpZW50PiBDb3JlQXVkaW9VdGlsOjpDcmVhdGVDYXB0dXJlQ2xpZW50KAotICAgIElBdWRpb0NsaWVudCogY2xpZW50KSB7Ci0gIERDSEVDSyhDb3JlQXVkaW9VdGlsOjpJc1N1cHBvcnRlZCgpKTsKLQotICAvLyBHZXQgYWNjZXNzIHRvIHRoZSBJQXVkaW9DYXB0dXJlQ2xpZW50IGludGVyZmFjZS4gVGhpcyBpbnRlcmZhY2UKLSAgLy8gZW5hYmxlcyB1cyB0byByZWFkIGlucHV0IGRhdGEgZnJvbSBhIGNhcHR1cmluZyBlbmRwb2ludCBidWZmZXIuCi0gIFNjb3BlZENvbVB0cjxJQXVkaW9DYXB0dXJlQ2xpZW50PiBhdWRpb19jYXB0dXJlX2NsaWVudDsKLSAgSFJFU1VMVCBociA9IGNsaWVudC0+R2V0U2VydmljZShfX3V1aWRvZihJQXVkaW9DYXB0dXJlQ2xpZW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jYXB0dXJlX2NsaWVudC5SZWNlaXZlVm9pZCgpKTsKLSAgaWYgKEZBSUxFRChocikpIHsKLSAgICBEVkxPRygxKSA8PCAiSUF1ZGlvQ2xpZW50OjpHZXRTZXJ2aWNlOiAiIDw8IHN0ZDo6aGV4IDw8IGhyOwotICAgIHJldHVybiBTY29wZWRDb21QdHI8SUF1ZGlvQ2FwdHVyZUNsaWVudD4oKTsKLSAgfQotICByZXR1cm4gYXVkaW9fY2FwdHVyZV9jbGllbnQ7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL3dpbi9jb3JlX2F1ZGlvX3V0aWxfd2luLmggYi9zcmMvbWVkaWEvYXVkaW8vd2luL2NvcmVfYXVkaW9fdXRpbF93aW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhhMzdkNi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vd2luL2NvcmVfYXVkaW9fdXRpbF93aW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBVdGlsaXR5IG1ldGhvZHMgZm9yIHRoZSBDb3JlIEF1ZGlvIEFQSSBvbiBXaW5kb3dzLgotLy8gQWx3YXlzIGVuc3VyZSB0aGF0IENvcmUgQXVkaW8gaXMgc3VwcG9ydGVkIGJlZm9yZSB1c2luZyB0aGVzZSBtZXRob2RzLgotLy8gVXNlIG1lZGlhOjpDb3JlQXVkaW9Jc1N1cHBvcnRlZCgpIGZvciB0aGlzIHB1cnBvc2UuCi0vLyBBbHNvLCBhbGwgbWV0aG9kcyBtdXN0IGJlIGNhbGxlZCBvbiBhIHZhbGlkIENPTSB0aHJlYWQuIFRoaXMgY2FuIGJlIGRvbmUKLS8vIGJ5IHVzaW5nIHRoZSBiYXNlOjp3aW46OlNjb3BlZENPTUluaXRpYWxpemVyIGhlbHBlciBjbGFzcy4KLQotI2lmbmRlZiBNRURJQV9BVURJT19XSU5fQ09SRV9BVURJT19VVElMX1dJTl9IXwotI2RlZmluZSBNRURJQV9BVURJT19XSU5fQ09SRV9BVURJT19VVElMX1dJTl9IXwotCi0jaW5jbHVkZSA8YXVkaW9jbGllbnQuaD4KLSNpbmNsdWRlIDxtbWRldmljZWFwaS5oPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgImJhc2UvdGltZS5oIgotI2luY2x1ZGUgImJhc2Uvd2luL3Njb3BlZF9jb21wdHIuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19kZXZpY2VfbmFtZS5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3BhcmFtZXRlcnMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotCi11c2luZyBiYXNlOjp3aW46OlNjb3BlZENvbVB0cjsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgTUVESUFfRVhQT1JUIENvcmVBdWRpb1V0aWwgewotIHB1YmxpYzoKLSAgLy8gUmV0dXJucyB0cnVlIGlmIFdpbmRvd3MgQ29yZSBBdWRpbyBpcyBzdXBwb3J0ZWQuCi0gIC8vIEFsd2F5cyB2ZXJpZnkgdGhhdCB0aGlzIG1ldGhvZCByZXR1cm5zIHRydWUgYmVmb3JlIHVzaW5nIGFueSBvZiB0aGUKLSAgLy8gbWV0aG9kcyBpbiB0aGlzIGNsYXNzLgotICBzdGF0aWMgYm9vbCBJc1N1cHBvcnRlZCgpOwotCi0gIC8vIENvbnZlcnRzIGJldHdlZW4gcmVmZXJlbmNlIHRpbWUgdG8gYmFzZTo6VGltZURlbHRhLgotICAvLyBPbmUgcmVmZXJlbmNlLXRpbWUgdW5pdCBpcyAxMDAgbmFub3NlY29uZHMuCi0gIC8vIEV4YW1wbGU6IGRvdWJsZSBzID0gUmVmZXJlcmVuY2VUaW1lVG9UaW1lRGVsdGEodCkuSW5NaWxsaXNlY29uZHNGKCk7Ci0gIHN0YXRpYyBiYXNlOjpUaW1lRGVsdGEgUmVmZXJlcmVuY2VUaW1lVG9UaW1lRGVsdGEoUkVGRVJFTkNFX1RJTUUgdGltZSk7Ci0KLSAgLy8gUmV0dXJucyBBVURDTE5UX1NIQVJFTU9ERV9FWENMVVNJVkUgaWYgLS1lbmFibGUtZXhjbHVzaXZlLW1vZGUgaXMgdXNlZAotICAvLyBhcyBjb21tYW5kLWxpbmUgZmxhZyBhbmQgQVVEQ0xOVF9TSEFSRU1PREVfU0hBUkVEIG90aGVyd2lzZSAoZGVmYXVsdCkuCi0gIHN0YXRpYyBBVURDTE5UX1NIQVJFTU9ERSBHZXRTaGFyZU1vZGUoKTsKLQotICAvLyBUaGUgV2luZG93cyBNdWx0aW1lZGlhIERldmljZSAoTU1EZXZpY2UpIEFQSSBlbmFibGVzIGF1ZGlvIGNsaWVudHMgdG8KLSAgLy8gZGlzY292ZXIgYXVkaW8gZW5kcG9pbnQgZGV2aWNlcyBhbmQgZGV0ZXJtaW5lIHRoZWlyIGNhcGFiaWxpdGllcy4KLQotICAvLyBOdW1iZXIgb2YgYWN0aXZlIGF1ZGlvIGRldmljZXMgaW4gdGhlIHNwZWNpZmllZCBmbG93IGRhdGEgZmxvdyBkaXJlY3Rpb24uCi0gIC8vIFNldCB8ZGF0YV9mbG93fCB0byBlQWxsIHRvIHJldHJpZXZlIHRoZSB0b3RhbCBudW1iZXIgb2YgYWN0aXZlIGF1ZGlvCi0gIC8vIGRldmljZXMuCi0gIHN0YXRpYyBpbnQgTnVtYmVyT2ZBY3RpdmVEZXZpY2VzKEVEYXRhRmxvdyBkYXRhX2Zsb3cpOwotCi0gIC8vIENyZWF0ZXMgYW4gSU1NRGV2aWNlRW51bWVyYXRvciBpbnRlcmZhY2Ugd2hpY2ggcHJvdmlkZXMgbWV0aG9kcyBmb3IKLSAgLy8gZW51bWVyYXRpbmcgYXVkaW8gZW5kcG9pbnQgZGV2aWNlcy4KLSAgc3RhdGljIFNjb3BlZENvbVB0cjxJTU1EZXZpY2VFbnVtZXJhdG9yPiBDcmVhdGVEZXZpY2VFbnVtZXJhdG9yKCk7Ci0KLSAgLy8gQ3JlYXRlcyBhIGRlZmF1bHQgZW5kcG9pbnQgZGV2aWNlIHRoYXQgaXMgc3BlY2lmaWVkIGJ5IGEgZGF0YS1mbG93Ci0gIC8vIGRpcmVjdGlvbiBhbmQgcm9sZSwgZS5nLiBkZWZhdWx0IHJlbmRlciBkZXZpY2UuCi0gIHN0YXRpYyBTY29wZWRDb21QdHI8SU1NRGV2aWNlPiBDcmVhdGVEZWZhdWx0RGV2aWNlKAotICAgICAgRURhdGFGbG93IGRhdGFfZmxvdywgRVJvbGUgcm9sZSk7Ci0KLSAgLy8gQ3JlYXRlcyBhbiBlbmRwb2ludCBkZXZpY2UgdGhhdCBpcyBzcGVjaWZpZWQgYnkgYSB1bmlxdWUgZW5kcG9pbnQgZGV2aWNlLQotICAvLyBpZGVudGlmaWNhdGlvbiBzdHJpbmcuCi0gIHN0YXRpYyBTY29wZWRDb21QdHI8SU1NRGV2aWNlPiBDcmVhdGVEZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgdW5pcXVlIElEIGFuZCB1c2VyLWZyaWVuZGx5IG5hbWUgb2YgYSBnaXZlbiBlbmRwb2ludCBkZXZpY2UuCi0gIC8vIEV4YW1wbGU6ICJ7MC4wLjEuMDAwMDAwMDB9Lns4ZGI2MDIwZi0xOGUzLTRmMjUtYjZmNS03NzI2YzkxMjI1NzR9IiwgYW5kCi0gIC8vICAgICAgICAgICJNaWNyb3Bob25lIChSZWFsdGVrIEhpZ2ggRGVmaW5pdGlvbiBBdWRpbykiLgotICBzdGF0aWMgSFJFU1VMVCBHZXREZXZpY2VOYW1lKElNTURldmljZSogZGV2aWNlLCBBdWRpb0RldmljZU5hbWUqIG5hbWUpOwotCi0gIC8vIEdldHMgdGhlIHVzZXItZnJpZW5kbHkgbmFtZSBvZiB0aGUgZW5kcG9pbnQgZGV2aWNlIHdoaWNoIGlzIHJlcHJlc2VudGVkCi0gIC8vIGJ5IGEgdW5pcXVlIGlkIGluIHxkZXZpY2VfaWR8LgotICBzdGF0aWMgc3RkOjpzdHJpbmcgR2V0RnJpZW5kbHlOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfaWQpOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvdmlkZWQgdW5pcXVlIHxkZXZpY2VfaWR8IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50Ci0gIC8vIGRlZmF1bHQgZGV2aWNlIGZvciB0aGUgc3BlY2lmaWVkIGJ5IGEgZGF0YS1mbG93IGRpcmVjdGlvbiBhbmQgcm9sZS4KLSAgc3RhdGljIGJvb2wgRGV2aWNlSXNEZWZhdWx0KAotICAgICAgRURhdGFGbG93IGZsb3csIEVSb2xlIHJvbGUsIHN0ZDo6c3RyaW5nIGRldmljZV9pZCk7Ci0KLSAgLy8gUXVlcnkgaWYgdGhlIGF1ZGlvIGRldmljZSBpcyBhIHJlbmRlcmluZyBkZXZpY2Ugb3IgYSBjYXB0dXJlIGRldmljZS4KLSAgc3RhdGljIEVEYXRhRmxvdyBHZXREYXRhRmxvdyhJTU1EZXZpY2UqIGRldmljZSk7Ci0KLSAgLy8gVGhlIFdpbmRvd3MgQXVkaW8gU2Vzc2lvbiBBUEkgKFdBU0FQSSkgZW5hYmxlcyBjbGllbnQgYXBwbGljYXRpb25zIHRvCi0gIC8vIG1hbmFnZSB0aGUgZmxvdyBvZiBhdWRpbyBkYXRhIGJldHdlZW4gdGhlIGFwcGxpY2F0aW9uIGFuZCBhbiBhdWRpbyBlbmRwb2ludAotICAvLyBkZXZpY2UuCi0KLSAgLy8gQ3JlYXRlIGFuIElBdWRpb0NsaWVudCBpbnRlcmZhY2UgZm9yIHRoZSBkZWZhdWx0IElNTURldmljZSB3aGVyZQotICAvLyBmbG93IGRpcmVjdGlvbiBhbmQgcm9sZSBpcyBkZWZpbmUgYnkgfGRhdGFfZmxvd3wgYW5kIHxyb2xlfC4KLSAgLy8gVGhlIElBdWRpb0NsaWVudCBpbnRlcmZhY2UgZW5hYmxlcyBhIGNsaWVudCB0byBjcmVhdGUgYW5kIGluaXRpYWxpemUgYW4KLSAgLy8gYXVkaW8gc3RyZWFtIGJldHdlZW4gYW4gYXVkaW8gYXBwbGljYXRpb24gYW5kIHRoZSBhdWRpbyBlbmdpbmUgKGZvciBhCi0gIC8vIHNoYXJlZC1tb2RlIHN0cmVhbSkgb3IgdGhlIGhhcmR3YXJlIGJ1ZmZlciBvZiBhbiBhdWRpbyBlbmRwb2ludCBkZXZpY2UKLSAgLy8gKGZvciBhbiBleGNsdXNpdmUtbW9kZSBzdHJlYW0pLgotICBzdGF0aWMgU2NvcGVkQ29tUHRyPElBdWRpb0NsaWVudD4gQ3JlYXRlRGVmYXVsdENsaWVudChFRGF0YUZsb3cgZGF0YV9mbG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUm9sZSByb2xlKTsKLQotICAvLyBDcmVhdGUgYW4gSUF1ZGlvQ2xpZW50IGludGVyZmFjZSBmb3IgYW4gZXhpc3RpbmcgSU1NRGV2aWNlIGdpdmVuIGJ5Ci0gIC8vIHxhdWRpb19kZXZpY2V8LiBGbG93IGRpcmVjdGlvbiBhbmQgcm9sZSBpcyBkZWZpbmUgYnkgdGhlIHxhdWRpb19kZXZpY2V8LgotICBzdGF0aWMgU2NvcGVkQ29tUHRyPElBdWRpb0NsaWVudD4gQ3JlYXRlQ2xpZW50KElNTURldmljZSogYXVkaW9fZGV2aWNlKTsKLQotICAvLyBHZXQgdGhlIG1peCBmb3JtYXQgdGhhdCB0aGUgYXVkaW8gZW5naW5lIHVzZXMgaW50ZXJuYWxseSBmb3IgcHJvY2Vzc2luZwotICAvLyBvZiBzaGFyZWQtbW9kZSBzdHJlYW1zLiBUaGlzIGZvcm1hdCBpcyBub3QgbmVjZXNzYXJpbHkgYSBmb3JtYXQgdGhhdCB0aGUKLSAgLy8gYXVkaW8gZW5kcG9pbnQgZGV2aWNlIHN1cHBvcnRzLiBUaHVzLCB0aGUgY2FsbGVyIG1pZ2h0IG5vdCBzdWNjZWVkIGluCi0gIC8vIGNyZWF0aW5nIGFuIGV4Y2x1c2l2ZS1tb2RlIHN0cmVhbSB3aXRoIGEgZm9ybWF0IG9idGFpbmVkIGJ5IHRoaXMgbWV0aG9kLgotICBzdGF0aWMgSFJFU1VMVCBHZXRTaGFyZWRNb2RlTWl4Rm9ybWF0KElBdWRpb0NsaWVudCogY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdBVkVGT1JNQVRQQ01FWCogZm9ybWF0KTsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB8Y2xpZW50fCBzdXBwb3J0cyB0aGUgZm9ybWF0IGluIHxmb3JtYXR8Ci0gIC8vIGZvciB0aGUgZ2l2ZW4gfHNoYXJlX21vZGV8IChzaGFyZWQgb3IgZXhjbHVzaXZlKS4KLSAgc3RhdGljIGJvb2wgSXNGb3JtYXRTdXBwb3J0ZWQoSUF1ZGlvQ2xpZW50KiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRENMTlRfU0hBUkVNT0RFIHNoYXJlX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdBVkVGT1JNQVRQQ01FWCogZm9ybWF0KTsKLQotICAvLyBGb3IgYSBzaGFyZWQtbW9kZSBzdHJlYW0sIHRoZSBhdWRpbyBlbmdpbmUgcGVyaW9kaWNhbGx5IHByb2Nlc3NlcyB0aGUKLSAgLy8gZGF0YSBpbiB0aGUgZW5kcG9pbnQgYnVmZmVyIGF0IHRoZSBwZXJpb2Qgb2J0YWluZWQgaW4gfGRldmljZV9wZXJpb2R8LgotICAvLyBGb3IgYW4gZXhjbHVzaXZlIG1vZGUgc3RyZWFtLCB8ZGV2aWNlX3BlcmlvZHwgY29ycmVzcG9uZHMgdG8gdGhlIG1pbmltdW0KLSAgLy8gdGltZSBpbnRlcnZhbCBiZXR3ZWVuIHN1Y2Nlc3NpdmUgcHJvY2Vzc2luZyBieSB0aGUgZW5kcG9pbnQgZGV2aWNlLgotICAvLyBUaGlzIHBlcmlvZCBwbHVzIHRoZSBzdHJlYW0gbGF0ZW5jeSBiZXR3ZWVuIHRoZSBidWZmZXIgYW5kIGVuZHBvaW50IGRldmljZQotICAvLyByZXByZXNlbnRzIHRoZSBtaW5pbXVtIHBvc3NpYmxlIGxhdGVuY3kgdGhhdCBhbiBhdWRpbyBhcHBsaWNhdGlvbiBjYW4KLSAgLy8gYWNoaWV2ZS4gVGhlIHRpbWUgaW4gfGRldmljZV9wZXJpb2R8IGlzIGV4cHJlc3NlZCBpbiAxMDAtbmFub3NlY29uZCB1bml0cy4KLSAgc3RhdGljIEhSRVNVTFQgR2V0RGV2aWNlUGVyaW9kKElBdWRpb0NsaWVudCogY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVEQ0xOVF9TSEFSRU1PREUgc2hhcmVfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRkVSRU5DRV9USU1FKiBkZXZpY2VfcGVyaW9kKTsKLQotICAvLyBHZXQgdGhlIHByZWZlcnJlZCBhdWRpbyBwYXJhbWV0ZXJzIGZvciB0aGUgc3BlY2lmaWVkIHxjbGllbnR8IG9yIHRoZQotICAvLyBnaXZlbiBkaXJlY3Rpb24gYW5kIHJvbGUgaXMgZGVmaW5lIGJ5IHxkYXRhX2Zsb3d8IGFuZCB8cm9sZXwuCi0gIC8vIFRoZSBhY3F1aXJlZCB2YWx1ZXMgc2hvdWxkIG9ubHkgYmUgdXRpbGl6ZWQgZm9yIHNoYXJlZCBtb2RlIHN0cmVhbWVkIHNpbmNlCi0gIC8vIHRoZXJlIGFyZSBubyBwcmVmZXJyZWQgc2V0dGluZ3MgZm9yIGFuIGV4Y2x1c2l2ZSBtb2RlIHN0cmVhbS4KLSAgc3RhdGljIEhSRVNVTFQgR2V0UHJlZmVycmVkQXVkaW9QYXJhbWV0ZXJzKElBdWRpb0NsaWVudCogY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXJzKiBwYXJhbXMpOwotICBzdGF0aWMgSFJFU1VMVCBHZXRQcmVmZXJyZWRBdWRpb1BhcmFtZXRlcnMoRURhdGFGbG93IGRhdGFfZmxvdywgRVJvbGUgcm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVycyogcGFyYW1zKTsKLQotICAvLyBBZnRlciBhY3RpdmF0aW5nIGFuIElBdWRpb0NsaWVudCBpbnRlcmZhY2Ugb24gYW4gYXVkaW8gZW5kcG9pbnQgZGV2aWNlLAotICAvLyB0aGUgY2xpZW50IG11c3QgaW5pdGlhbGl6ZSBpdCBvbmNlLCBhbmQgb25seSBvbmNlLCB0byBpbml0aWFsaXplIHRoZSBhdWRpbwotICAvLyBzdHJlYW0gYmV0d2VlbiB0aGUgY2xpZW50IGFuZCB0aGUgZGV2aWNlLiBJbiBzaGFyZWQgbW9kZSwgdGhlIGNsaWVudAotICAvLyBjb25uZWN0cyBpbmRpcmVjdGx5IHRocm91Z2ggdGhlIGF1ZGlvIGVuZ2luZSB3aGljaCBkb2VzIHRoZSBtaXhpbmcuCi0gIC8vIEluIGV4Y2x1c2l2ZSBtb2RlLCB0aGUgY2xpZW50IGNvbm5lY3RzIGRpcmVjdGx5IHRvIHRoZSBhdWRpbyBoYXJkd2FyZS4KLSAgLy8gSWYgYSB2YWxpZCBldmVudCBpcyBwcm92aWRlZCBpbiB8ZXZlbnRfaGFuZGxlfCwgdGhlIGNsaWVudCB3aWxsIGJlCi0gIC8vIGluaXRpYWxpemVkIGZvciBldmVudC1kcml2ZW4gYnVmZmVyIGhhbmRsaW5nLiBJZiB8ZXZlbnRfaGFuZGxlfCBpcyBzZXQgdG8KLSAgLy8gTlVMTCwgZXZlbnQtZHJpdmVuIGJ1ZmZlciBoYW5kbGluZyBpcyBub3QgdXRpbGl6ZWQuCi0gIHN0YXRpYyBIUkVTVUxUIFNoYXJlZE1vZGVJbml0aWFsaXplKElBdWRpb0NsaWVudCogY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXQVZFRk9STUFUUENNRVgqIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFIGV2ZW50X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBlbmRwb2ludF9idWZmZXJfc2l6ZSk7Ci0gIC8vIFRPRE8oaGVucmlrYSk6IGFkZCBFeGNsdXNpdmVNb2RlSW5pdGlhbGl6ZSguLi4pCi0KLSAgLy8gQ3JlYXRlIGFuIElBdWRpb1JlbmRlckNsaWVudCBjbGllbnQgZm9yIGFuIGV4aXN0aW5nIElBdWRpb0NsaWVudCBnaXZlbiBieQotICAvLyB8Y2xpZW50fC4gVGhlIElBdWRpb1JlbmRlckNsaWVudCBpbnRlcmZhY2UgZW5hYmxlcyBhIGNsaWVudCB0byB3cml0ZQotICAvLyBvdXRwdXQgZGF0YSB0byBhIHJlbmRlcmluZyBlbmRwb2ludCBidWZmZXIuCi0gIHN0YXRpYyBTY29wZWRDb21QdHI8SUF1ZGlvUmVuZGVyQ2xpZW50PiBDcmVhdGVSZW5kZXJDbGllbnQoCi0gICAgICBJQXVkaW9DbGllbnQqIGNsaWVudCk7Ci0KLSAgLy8gQ3JlYXRlIGFuIElBdWRpb0NhcHR1cmVDbGllbnQgY2xpZW50IGZvciBhbiBleGlzdGluZyBJQXVkaW9DbGllbnQgZ2l2ZW4gYnkKLSAgLy8gfGNsaWVudHwuIFRoZSBJQXVkaW9DYXB0dXJlQ2xpZW50IGludGVyZmFjZSBlbmFibGVzIGEgY2xpZW50IHRvIHJlYWQKLSAgLy8gaW5wdXQgZGF0YSBmcm9tIGEgY2FwdHVyZSBlbmRwb2ludCBidWZmZXIuCi0gIHN0YXRpYyBTY29wZWRDb21QdHI8SUF1ZGlvQ2FwdHVyZUNsaWVudD4gQ3JlYXRlQ2FwdHVyZUNsaWVudCgKLSAgICAgIElBdWRpb0NsaWVudCogY2xpZW50KTsKLQotIHByaXZhdGU6Ci0gIENvcmVBdWRpb1V0aWwoKSB7fQotICB+Q29yZUF1ZGlvVXRpbCgpIHt9Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihDb3JlQXVkaW9VdGlsKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0FVRElPX1dJTl9DT1JFX0FVRElPX1VUSUxfV0lOX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vd2luL2NvcmVfYXVkaW9fdXRpbF93aW5fdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvYXVkaW8vd2luL2NvcmVfYXVkaW9fdXRpbF93aW5fdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZWRmNDcuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL3dpbi9jb3JlX2F1ZGlvX3V0aWxfd2luX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzg5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAiYmFzZS9zeW5jaHJvbml6YXRpb24vd2FpdGFibGVfZXZlbnQuaCIKLSNpbmNsdWRlICJiYXNlL3dpbi9zY29wZWRfY29tX2luaXRpYWxpemVyLmgiCi0jaW5jbHVkZSAiYmFzZS93aW4vc2NvcGVkX2hhbmRsZS5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3dpbi9jb3JlX2F1ZGlvX3V0aWxfd2luLmgiCi0jaW5jbHVkZSAidGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0KLXVzaW5nIGJhc2U6Ondpbjo6U2NvcGVkQ09NSW5pdGlhbGl6ZXI7Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIENvcmVBdWRpb1V0aWxXaW5UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICAvLyBUaGUgdGVzdCBydW5zIG9uIGEgQ09NIHRocmVhZCBpbiB0aGUgbXVsdGl0aHJlYWRlZCBhcGFydG1lbnQgKE1UQSkuCi0gIC8vIElmIHdlIGRvbid0IGluaXRpYWxpemUgdGhlIENPTSBsaWJyYXJ5IG9uIGEgdGhyZWFkIGJlZm9yZSB1c2luZyBDT00sCi0gIC8vIGFsbCBmdW5jdGlvbiBjYWxscyB3aWxsIHJldHVybiBDT19FX05PVElOSVRJQUxJWkVELgotICBDb3JlQXVkaW9VdGlsV2luVGVzdCgpCi0gICAgICA6IGNvbV9pbml0XyhTY29wZWRDT01Jbml0aWFsaXplcjo6a01UQSkgewotICAgIERDSEVDSyhjb21faW5pdF8uc3VjY2VlZGVkKCkpOwotICB9Ci0gIHZpcnR1YWwgfkNvcmVBdWRpb1V0aWxXaW5UZXN0KCkge30KLQotICBib29sIENhblJ1bkF1ZGlvVGVzdCgpIHsKLSAgICBib29sIGNvcmVfYXVkaW8gPSBDb3JlQXVkaW9VdGlsOjpJc1N1cHBvcnRlZCgpOwotICAgIGlmICghY29yZV9hdWRpbykKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpbnQgY2FwdHVyZV9kZXZpY2VzID0gQ29yZUF1ZGlvVXRpbDo6TnVtYmVyT2ZBY3RpdmVEZXZpY2VzKGVDYXB0dXJlKTsKLSAgICBpbnQgcmVuZGVyX2RldmljZXMgPSBDb3JlQXVkaW9VdGlsOjpOdW1iZXJPZkFjdGl2ZURldmljZXMoZVJlbmRlcik7Ci0gICAgcmV0dXJuICgoY2FwdHVyZV9kZXZpY2VzID4gMCkgJiYgKHJlbmRlcl9kZXZpY2VzID4gMCkpOwotICB9Ci0KLSAgU2NvcGVkQ09NSW5pdGlhbGl6ZXIgY29tX2luaXRfOwotfTsKLQotVEVTVF9GKENvcmVBdWRpb1V0aWxXaW5UZXN0LCBOdW1iZXJPZkFjdGl2ZURldmljZXMpIHsKLSAgaWYgKCFDYW5SdW5BdWRpb1Rlc3QoKSkKLSAgICByZXR1cm47Ci0KLSAgaW50IHJlbmRlcl9kZXZpY2VzID0gQ29yZUF1ZGlvVXRpbDo6TnVtYmVyT2ZBY3RpdmVEZXZpY2VzKGVSZW5kZXIpOwotICBFWFBFQ1RfR1QocmVuZGVyX2RldmljZXMsIDApOwotICBpbnQgY2FwdHVyZV9kZXZpY2VzID0gQ29yZUF1ZGlvVXRpbDo6TnVtYmVyT2ZBY3RpdmVEZXZpY2VzKGVDYXB0dXJlKTsKLSAgRVhQRUNUX0dUKGNhcHR1cmVfZGV2aWNlcywgMCk7Ci0gIGludCB0b3RhbF9kZXZpY2VzID0gQ29yZUF1ZGlvVXRpbDo6TnVtYmVyT2ZBY3RpdmVEZXZpY2VzKGVBbGwpOwotICBFWFBFQ1RfRVEodG90YWxfZGV2aWNlcywgcmVuZGVyX2RldmljZXMgKyBjYXB0dXJlX2RldmljZXMpOwotfQotCi1URVNUX0YoQ29yZUF1ZGlvVXRpbFdpblRlc3QsIENyZWF0ZURldmljZUVudW1lcmF0b3IpIHsKLSAgaWYgKCFDYW5SdW5BdWRpb1Rlc3QoKSkKLSAgICByZXR1cm47Ci0KLSAgU2NvcGVkQ29tUHRyPElNTURldmljZUVudW1lcmF0b3I+IGVudW1lcmF0b3IgPQotICAgICAgQ29yZUF1ZGlvVXRpbDo6Q3JlYXRlRGV2aWNlRW51bWVyYXRvcigpOwotICBFWFBFQ1RfVFJVRShlbnVtZXJhdG9yKTsKLX0KLQotVEVTVF9GKENvcmVBdWRpb1V0aWxXaW5UZXN0LCBDcmVhdGVEZWZhdWx0RGV2aWNlKSB7Ci0gIGlmICghQ2FuUnVuQXVkaW9UZXN0KCkpCi0gICAgcmV0dXJuOwotCi0gIHN0cnVjdCB7Ci0gICAgRURhdGFGbG93IGZsb3c7Ci0gICAgRVJvbGUgcm9sZTsKLSAgfSBkYXRhW10gPSB7Ci0gICAge2VSZW5kZXIsIGVDb25zb2xlfSwKLSAgICB7ZVJlbmRlciwgZUNvbW11bmljYXRpb25zfSwKLSAgICB7ZVJlbmRlciwgZU11bHRpbWVkaWF9LAotICAgIHtlQ2FwdHVyZSwgZUNvbnNvbGV9LAotICAgIHtlQ2FwdHVyZSwgZUNvbW11bmljYXRpb25zfSwKLSAgICB7ZUNhcHR1cmUsIGVNdWx0aW1lZGlhfQotICB9OwotCi0gIC8vIENyZWF0ZSBkZWZhdWx0IGRldmljZXMgZm9yIGFsbCBmbG93L3JvbGUgY29tYmluYXRpb25zIGFib3ZlLgotICBTY29wZWRDb21QdHI8SU1NRGV2aWNlPiBhdWRpb19kZXZpY2U7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlzaXplKGRhdGEpOyArK2kpIHsKLSAgICBhdWRpb19kZXZpY2UgPQotICAgICAgICBDb3JlQXVkaW9VdGlsOjpDcmVhdGVEZWZhdWx0RGV2aWNlKGRhdGFbaV0uZmxvdywgZGF0YVtpXS5yb2xlKTsKLSAgICBFWFBFQ1RfVFJVRShhdWRpb19kZXZpY2UpOwotICAgIEVYUEVDVF9FUShkYXRhW2ldLmZsb3csIENvcmVBdWRpb1V0aWw6OkdldERhdGFGbG93KGF1ZGlvX2RldmljZSkpOwotICB9Ci0KLSAgLy8gT25seSBlUmVuZGVyIGFuZCBlQ2FwdHVyZSBhcmUgYWxsb3dlZCBhcyBmbG93IHBhcmFtZXRlci4KLSAgYXVkaW9fZGV2aWNlID0gQ29yZUF1ZGlvVXRpbDo6Q3JlYXRlRGVmYXVsdERldmljZShlQWxsLCBlQ29uc29sZSk7Ci0gIEVYUEVDVF9GQUxTRShhdWRpb19kZXZpY2UpOwotfQotCi1URVNUX0YoQ29yZUF1ZGlvVXRpbFdpblRlc3QsIENyZWF0ZURldmljZSkgewotICBpZiAoIUNhblJ1bkF1ZGlvVGVzdCgpKQotICAgIHJldHVybjsKLQotICAvLyBHZXQgbmFtZSBhbmQgSUQgb2YgZGVmYXVsdCBkZXZpY2UgdXNlZCBmb3IgcGxheWJhY2suCi0gIFNjb3BlZENvbVB0cjxJTU1EZXZpY2U+IGRlZmF1bHRfcmVuZGVyX2RldmljZSA9Ci0gICAgICBDb3JlQXVkaW9VdGlsOjpDcmVhdGVEZWZhdWx0RGV2aWNlKGVSZW5kZXIsIGVDb25zb2xlKTsKLSAgQXVkaW9EZXZpY2VOYW1lIGRlZmF1bHRfcmVuZGVyX25hbWU7Ci0gIEVYUEVDVF9UUlVFKFNVQ0NFRURFRChDb3JlQXVkaW9VdGlsOjpHZXREZXZpY2VOYW1lKGRlZmF1bHRfcmVuZGVyX2RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlZmF1bHRfcmVuZGVyX25hbWUpKSk7Ci0KLSAgLy8gVXNlIHRoZSB1bmlxZSBJRCBhcyBpbnB1dCB0byBDcmVhdGVEZXZpY2UoKSBhbmQgY3JlYXRlIGEgY29ycmVzcG9uZGluZwotICAvLyBJTU1EZXZpY2UuCi0gIFNjb3BlZENvbVB0cjxJTU1EZXZpY2U+IGF1ZGlvX2RldmljZSA9Ci0gICAgICBDb3JlQXVkaW9VdGlsOjpDcmVhdGVEZXZpY2UoZGVmYXVsdF9yZW5kZXJfbmFtZS51bmlxdWVfaWQpOwotICBFWFBFQ1RfVFJVRShhdWRpb19kZXZpY2UpOwotCi0gIC8vIFZlcmlmeSB0aGF0IHRoZSB0d28gSU1NRGV2aWNlIGludGVyZmFjZXMgcmVwcmVzZW50cyB0aGUgc2FtZSBlbmRwb2ludAotICAvLyBieSBjb21wYXJpbmcgdGhlaXIgdW5pcXVlIElEcy4KLSAgQXVkaW9EZXZpY2VOYW1lIGRldmljZV9uYW1lOwotICBFWFBFQ1RfVFJVRShTVUNDRUVERUQoQ29yZUF1ZGlvVXRpbDo6R2V0RGV2aWNlTmFtZShhdWRpb19kZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VfbmFtZSkpKTsKLSAgRVhQRUNUX0VRKGRlZmF1bHRfcmVuZGVyX25hbWUudW5pcXVlX2lkLCBkZXZpY2VfbmFtZS51bmlxdWVfaWQpOwotfQotCi1URVNUX0YoQ29yZUF1ZGlvVXRpbFdpblRlc3QsIEdldERlZmF1bHREZXZpY2VOYW1lKSB7Ci0gIGlmICghQ2FuUnVuQXVkaW9UZXN0KCkpCi0gICAgcmV0dXJuOwotCi0gIHN0cnVjdCB7Ci0gICAgRURhdGFGbG93IGZsb3c7Ci0gICAgRVJvbGUgcm9sZTsKLSAgfSBkYXRhW10gPSB7Ci0gICAge2VSZW5kZXIsIGVDb25zb2xlfSwKLSAgICB7ZVJlbmRlciwgZUNvbW11bmljYXRpb25zfSwKLSAgICB7ZUNhcHR1cmUsIGVDb25zb2xlfSwKLSAgICB7ZUNhcHR1cmUsIGVDb21tdW5pY2F0aW9uc30KLSAgfTsKLQotICAvLyBHZXQgbmFtZSBhbmQgSUQgb2YgZGVmYXVsdCBkZXZpY2VzIGZvciBhbGwgZmxvdy9yb2xlIGNvbWJpbmF0aW9ucyBhYm92ZS4KLSAgU2NvcGVkQ29tUHRyPElNTURldmljZT4gYXVkaW9fZGV2aWNlOwotICBBdWRpb0RldmljZU5hbWUgZGV2aWNlX25hbWU7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlzaXplKGRhdGEpOyArK2kpIHsKLSAgICBhdWRpb19kZXZpY2UgPQotICAgICAgICBDb3JlQXVkaW9VdGlsOjpDcmVhdGVEZWZhdWx0RGV2aWNlKGRhdGFbaV0uZmxvdywgZGF0YVtpXS5yb2xlKTsKLSAgICBFWFBFQ1RfVFJVRShTVUNDRUVERUQoQ29yZUF1ZGlvVXRpbDo6R2V0RGV2aWNlTmFtZShhdWRpb19kZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZV9uYW1lKSkpOwotICAgIEVYUEVDVF9GQUxTRShkZXZpY2VfbmFtZS5kZXZpY2VfbmFtZS5lbXB0eSgpKTsKLSAgICBFWFBFQ1RfRkFMU0UoZGV2aWNlX25hbWUudW5pcXVlX2lkLmVtcHR5KCkpOwotICB9Ci19Ci0KLVRFU1RfRihDb3JlQXVkaW9VdGlsV2luVGVzdCwgR2V0RnJpZW5kbHlOYW1lKSB7Ci0gIGlmICghQ2FuUnVuQXVkaW9UZXN0KCkpCi0gICAgcmV0dXJuOwotCi0gIC8vIEdldCBuYW1lIGFuZCBJRCBvZiBkZWZhdWx0IGRldmljZSB1c2VkIGZvciByZWNvcmRpbmcuCi0gIFNjb3BlZENvbVB0cjxJTU1EZXZpY2U+IGF1ZGlvX2RldmljZSA9Ci0gICAgICBDb3JlQXVkaW9VdGlsOjpDcmVhdGVEZWZhdWx0RGV2aWNlKGVDYXB0dXJlLCBlQ29uc29sZSk7Ci0gIEF1ZGlvRGV2aWNlTmFtZSBkZXZpY2VfbmFtZTsKLSAgSFJFU1VMVCBociA9IENvcmVBdWRpb1V0aWw6OkdldERldmljZU5hbWUoYXVkaW9fZGV2aWNlLCAmZGV2aWNlX25hbWUpOwotICBFWFBFQ1RfVFJVRShTVUNDRUVERUQoaHIpKTsKLQotICAvLyBVc2UgdW5pcXVlIElEIGFzIGlucHV0IHRvIEdldEZyaWVuZGx5TmFtZSgpIGFuZCBjb21wYXJlIHRoZSByZXN1bHQKLSAgLy8gd2l0aCB0aGUgYWxyZWFkeSBvYnRhaW5lZCBmcmllbmRseSBuYW1lIGZvciB0aGUgZGVmYXVsdCBjYXB0dXJlIGRldmljZS4KLSAgc3RkOjpzdHJpbmcgZnJpZW5kbHlfbmFtZSA9IENvcmVBdWRpb1V0aWw6OkdldEZyaWVuZGx5TmFtZSgKLSAgICAgIGRldmljZV9uYW1lLnVuaXF1ZV9pZCk7Ci0gIEVYUEVDVF9FUShmcmllbmRseV9uYW1lLCBkZXZpY2VfbmFtZS5kZXZpY2VfbmFtZSk7Ci0KLSAgLy8gU2FtZSB0ZXN0IGFzIGFib3ZlIGJ1dCBmb3IgcGxheWJhY2suCi0gIGF1ZGlvX2RldmljZSA9IENvcmVBdWRpb1V0aWw6OkNyZWF0ZURlZmF1bHREZXZpY2UoZVJlbmRlciwgZUNvbnNvbGUpOwotICBociA9IENvcmVBdWRpb1V0aWw6OkdldERldmljZU5hbWUoYXVkaW9fZGV2aWNlLCAmZGV2aWNlX25hbWUpOwotICBFWFBFQ1RfVFJVRShTVUNDRUVERUQoaHIpKTsKLSAgZnJpZW5kbHlfbmFtZSA9IENvcmVBdWRpb1V0aWw6OkdldEZyaWVuZGx5TmFtZShkZXZpY2VfbmFtZS51bmlxdWVfaWQpOwotICBFWFBFQ1RfRVEoZnJpZW5kbHlfbmFtZSwgZGV2aWNlX25hbWUuZGV2aWNlX25hbWUpOwotfQotCi1URVNUX0YoQ29yZUF1ZGlvVXRpbFdpblRlc3QsIERldmljZUlzRGVmYXVsdCkgewotICBpZiAoIUNhblJ1bkF1ZGlvVGVzdCgpKQotICAgIHJldHVybjsKLQotICAvLyBWZXJpZnkgdGhhdCB0aGUgZGVmYXVsdCByZW5kZXIgZGV2aWNlIGlzIGNvcnJlY3RseSBpZGVudGlmaWVkIGFzIGEKLSAgLy8gZGVmYXVsdCBkZXZpY2UuCi0gIFNjb3BlZENvbVB0cjxJTU1EZXZpY2U+IGF1ZGlvX2RldmljZSA9Ci0gICAgICBDb3JlQXVkaW9VdGlsOjpDcmVhdGVEZWZhdWx0RGV2aWNlKGVSZW5kZXIsIGVDb25zb2xlKTsKLSAgQXVkaW9EZXZpY2VOYW1lIG5hbWU7Ci0gIEVYUEVDVF9UUlVFKFNVQ0NFRURFRChDb3JlQXVkaW9VdGlsOjpHZXREZXZpY2VOYW1lKGF1ZGlvX2RldmljZSwgJm5hbWUpKSk7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIGlkID0gbmFtZS51bmlxdWVfaWQ7Ci0gIEVYUEVDVF9UUlVFKENvcmVBdWRpb1V0aWw6OkRldmljZUlzRGVmYXVsdChlUmVuZGVyLCBlQ29uc29sZSwgaWQpKTsKLSAgRVhQRUNUX0ZBTFNFKENvcmVBdWRpb1V0aWw6OkRldmljZUlzRGVmYXVsdChlQ2FwdHVyZSwgZUNvbnNvbGUsIGlkKSk7Ci19Ci0KLVRFU1RfRihDb3JlQXVkaW9VdGlsV2luVGVzdCwgQ3JlYXRlRGVmYXVsdENsaWVudCkgewotICBpZiAoIUNhblJ1bkF1ZGlvVGVzdCgpKQotICAgIHJldHVybjsKLQotICBFRGF0YUZsb3cgZGF0YVtdID0ge2VSZW5kZXIsIGVDYXB0dXJlfTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5c2l6ZShkYXRhKTsgKytpKSB7Ci0gICAgU2NvcGVkQ29tUHRyPElBdWRpb0NsaWVudD4gY2xpZW50OwotICAgIGNsaWVudCA9IENvcmVBdWRpb1V0aWw6OkNyZWF0ZURlZmF1bHRDbGllbnQoZGF0YVtpXSwgZUNvbnNvbGUpOwotICAgIEVYUEVDVF9UUlVFKGNsaWVudCk7Ci0gIH0KLX0KLQotVEVTVF9GKENvcmVBdWRpb1V0aWxXaW5UZXN0LCBDcmVhdGVDbGllbnQpIHsKLSAgaWYgKCFDYW5SdW5BdWRpb1Rlc3QoKSkKLSAgICByZXR1cm47Ci0KLSAgRURhdGFGbG93IGRhdGFbXSA9IHtlUmVuZGVyLCBlQ2FwdHVyZX07Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheXNpemUoZGF0YSk7ICsraSkgewotICAgIFNjb3BlZENvbVB0cjxJTU1EZXZpY2U+IGRldmljZTsKLSAgICBTY29wZWRDb21QdHI8SUF1ZGlvQ2xpZW50PiBjbGllbnQ7Ci0gICAgZGV2aWNlID0gQ29yZUF1ZGlvVXRpbDo6Q3JlYXRlRGVmYXVsdERldmljZShkYXRhW2ldLCBlQ29uc29sZSk7Ci0gICAgRVhQRUNUX1RSVUUoZGV2aWNlKTsKLSAgICBFWFBFQ1RfRVEoZGF0YVtpXSwgQ29yZUF1ZGlvVXRpbDo6R2V0RGF0YUZsb3coZGV2aWNlKSk7Ci0gICAgY2xpZW50ID0gQ29yZUF1ZGlvVXRpbDo6Q3JlYXRlQ2xpZW50KGRldmljZSk7Ci0gICAgRVhQRUNUX1RSVUUoY2xpZW50KTsKLSAgfQotfQotCi1URVNUX0YoQ29yZUF1ZGlvVXRpbFdpblRlc3QsIEdldFNoYXJlZE1vZGVNaXhGb3JtYXQpIHsKLSAgaWYgKCFDYW5SdW5BdWRpb1Rlc3QoKSkKLSAgICByZXR1cm47Ci0KLSAgU2NvcGVkQ29tUHRyPElNTURldmljZT4gZGV2aWNlOwotICBTY29wZWRDb21QdHI8SUF1ZGlvQ2xpZW50PiBjbGllbnQ7Ci0gIGRldmljZSA9IENvcmVBdWRpb1V0aWw6OkNyZWF0ZURlZmF1bHREZXZpY2UoZVJlbmRlciwgZUNvbnNvbGUpOwotICBFWFBFQ1RfVFJVRShkZXZpY2UpOwotICBjbGllbnQgPSBDb3JlQXVkaW9VdGlsOjpDcmVhdGVDbGllbnQoZGV2aWNlKTsKLSAgRVhQRUNUX1RSVUUoY2xpZW50KTsKLQotICAvLyBQZXJmb3JtIGEgc2ltcGxlIHNhbml0eSB0ZXN0IG9mIHRoZSBhcXVpcmVkIGZvcm1hdCBzdHJ1Y3R1cmUuCi0gIFdBVkVGT1JNQVRQQ01FWCBmb3JtYXQ7Ci0gIEVYUEVDVF9UUlVFKFNVQ0NFRURFRChDb3JlQXVkaW9VdGlsOjpHZXRTaGFyZWRNb2RlTWl4Rm9ybWF0KGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCkpKTsKLSAgRVhQRUNUX0dFKGZvcm1hdC5Gb3JtYXQubkNoYW5uZWxzLCAxKTsKLSAgRVhQRUNUX0dFKGZvcm1hdC5Gb3JtYXQublNhbXBsZXNQZXJTZWMsIDgwMDB1KTsKLSAgRVhQRUNUX0dFKGZvcm1hdC5Gb3JtYXQud0JpdHNQZXJTYW1wbGUsIDE2KTsKLSAgRVhQRUNUX0dFKGZvcm1hdC5TYW1wbGVzLndWYWxpZEJpdHNQZXJTYW1wbGUsIDE2KTsKLSAgRVhQRUNUX0VRKGZvcm1hdC5Gb3JtYXQud0Zvcm1hdFRhZywgV0FWRV9GT1JNQVRfRVhURU5TSUJMRSk7Ci19Ci0KLVRFU1RfRihDb3JlQXVkaW9VdGlsV2luVGVzdCwgR2V0RGV2aWNlUGVyaW9kKSB7Ci0gIGlmICghQ2FuUnVuQXVkaW9UZXN0KCkpCi0gICAgcmV0dXJuOwotCi0gIEVEYXRhRmxvdyBkYXRhW10gPSB7ZVJlbmRlciwgZUNhcHR1cmV9OwotCi0gIC8vIFZlcmlmeSB0aGF0IHRoZSBkZXZpY2UgcGVyaW9kcyBhcmUgdmFsaWQgZm9yIHRoZSBkZWZhdWx0IHJlbmRlciBhbmQKLSAgLy8gY2FwdHVyZSBkZXZpY2VzLgotICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5c2l6ZShkYXRhKTsgKytpKSB7Ci0gICAgU2NvcGVkQ29tUHRyPElBdWRpb0NsaWVudD4gY2xpZW50OwotICAgIFJFRkVSRU5DRV9USU1FIHNoYXJlZF90aW1lX3BlcmlvZCA9IDA7Ci0gICAgUkVGRVJFTkNFX1RJTUUgZXhjbHVzaXZlX3RpbWVfcGVyaW9kID0gMDsKLSAgICBjbGllbnQgPSBDb3JlQXVkaW9VdGlsOjpDcmVhdGVEZWZhdWx0Q2xpZW50KGRhdGFbaV0sIGVDb25zb2xlKTsKLSAgICBFWFBFQ1RfVFJVRShjbGllbnQpOwotICAgIEVYUEVDVF9UUlVFKFNVQ0NFRURFRChDb3JlQXVkaW9VdGlsOjpHZXREZXZpY2VQZXJpb2QoCi0gICAgICAgIGNsaWVudCwgQVVEQ0xOVF9TSEFSRU1PREVfU0hBUkVELCAmc2hhcmVkX3RpbWVfcGVyaW9kKSkpOwotICAgIEVYUEVDVF9HVChzaGFyZWRfdGltZV9wZXJpb2QsIDApOwotICAgIEVYUEVDVF9UUlVFKFNVQ0NFRURFRChDb3JlQXVkaW9VdGlsOjpHZXREZXZpY2VQZXJpb2QoCi0gICAgICAgIGNsaWVudCwgQVVEQ0xOVF9TSEFSRU1PREVfRVhDTFVTSVZFLCAmZXhjbHVzaXZlX3RpbWVfcGVyaW9kKSkpOwotICAgIEVYUEVDVF9HVChleGNsdXNpdmVfdGltZV9wZXJpb2QsIDApOwotICAgIEVYUEVDVF9MRShleGNsdXNpdmVfdGltZV9wZXJpb2QsIHNoYXJlZF90aW1lX3BlcmlvZCk7Ci0gIH0KLX0KLQotVEVTVF9GKENvcmVBdWRpb1V0aWxXaW5UZXN0LCBHZXRQcmVmZXJyZWRBdWRpb1BhcmFtZXRlcnMpIHsKLSAgaWYgKCFDYW5SdW5BdWRpb1Rlc3QoKSkKLSAgICByZXR1cm47Ci0KLSAgRURhdGFGbG93IGRhdGFbXSA9IHtlUmVuZGVyLCBlQ2FwdHVyZX07Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgdGhlIHByZWZlcnJlZCBhdWRpbyBwYXJhbWV0ZXJzIGFyZSBPSyBmb3IgdGhlIGRlZmF1bHQgcmVuZGVyCi0gIC8vIGFuZCBjYXB0dXJlIGRldmljZXMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlzaXplKGRhdGEpOyArK2kpIHsKLSAgICBTY29wZWRDb21QdHI8SUF1ZGlvQ2xpZW50PiBjbGllbnQ7Ci0gICAgQXVkaW9QYXJhbWV0ZXJzIHBhcmFtczsKLSAgICBjbGllbnQgPSBDb3JlQXVkaW9VdGlsOjpDcmVhdGVEZWZhdWx0Q2xpZW50KGRhdGFbaV0sIGVDb25zb2xlKTsKLSAgICBFWFBFQ1RfVFJVRShjbGllbnQpOwotICAgIEVYUEVDVF9UUlVFKFNVQ0NFRURFRChDb3JlQXVkaW9VdGlsOjpHZXRQcmVmZXJyZWRBdWRpb1BhcmFtZXRlcnMoY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcykpKTsKLSAgICBFWFBFQ1RfVFJVRShwYXJhbXMuSXNWYWxpZCgpKTsKLSAgfQotfQotCi1URVNUX0YoQ29yZUF1ZGlvVXRpbFdpblRlc3QsIFNoYXJlZE1vZGVJbml0aWFsaXplKSB7Ci0gIGlmICghQ2FuUnVuQXVkaW9UZXN0KCkpCi0gICAgcmV0dXJuOwotCi0gIFNjb3BlZENvbVB0cjxJQXVkaW9DbGllbnQ+IGNsaWVudDsKLSAgY2xpZW50ID0gQ29yZUF1ZGlvVXRpbDo6Q3JlYXRlRGVmYXVsdENsaWVudChlUmVuZGVyLCBlQ29uc29sZSk7Ci0gIEVYUEVDVF9UUlVFKGNsaWVudCk7Ci0KLSAgV0FWRUZPUk1BVFBDTUVYIGZvcm1hdDsKLSAgRVhQRUNUX1RSVUUoU1VDQ0VFREVEKENvcmVBdWRpb1V0aWw6OkdldFNoYXJlZE1vZGVNaXhGb3JtYXQoY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0KSkpOwotCi0gIC8vIFBlcmZvcm0gYSBzaGFyZWQtbW9kZSBpbml0aWFsaXphdGlvbiB3aXRob3V0IGV2ZW50LWRyaXZlbiBidWZmZXIgaGFuZGxpbmcuCi0gIHNpemVfdCBlbmRwb2ludF9idWZmZXJfc2l6ZSA9IDA7Ci0gIEhSRVNVTFQgaHIgPSBDb3JlQXVkaW9VdGlsOjpTaGFyZWRNb2RlSW5pdGlhbGl6ZShjbGllbnQsICZmb3JtYXQsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5kcG9pbnRfYnVmZmVyX3NpemUpOwotICBFWFBFQ1RfVFJVRShTVUNDRUVERUQoaHIpKTsKLSAgRVhQRUNUX0dUKGVuZHBvaW50X2J1ZmZlcl9zaXplLCAwdSk7Ci0KLSAgLy8gSXQgaXMgb25seSBwb3NzaWJsZSB0byBjcmVhdGUgYSBjbGllbnQgb25jZS4KLSAgaHIgPSBDb3JlQXVkaW9VdGlsOjpTaGFyZWRNb2RlSW5pdGlhbGl6ZShjbGllbnQsICZmb3JtYXQsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuZHBvaW50X2J1ZmZlcl9zaXplKTsKLSAgRVhQRUNUX0ZBTFNFKFNVQ0NFRURFRChocikpOwotICBFWFBFQ1RfRVEoaHIsIEFVRENMTlRfRV9BTFJFQURZX0lOSVRJQUxJWkVEKTsKLQotICAvLyBWZXJpZnkgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byByZWluaXRpYWxpemUgdGhlIGNsaWVudCBhZnRlciByZWxlYXNpbmcgaXQuCi0gIGNsaWVudCA9IENvcmVBdWRpb1V0aWw6OkNyZWF0ZURlZmF1bHRDbGllbnQoZVJlbmRlciwgZUNvbnNvbGUpOwotICBFWFBFQ1RfVFJVRShjbGllbnQpOwotICBociA9IENvcmVBdWRpb1V0aWw6OlNoYXJlZE1vZGVJbml0aWFsaXplKGNsaWVudCwgJmZvcm1hdCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5kcG9pbnRfYnVmZmVyX3NpemUpOwotICBFWFBFQ1RfVFJVRShTVUNDRUVERUQoaHIpKTsKLSAgRVhQRUNUX0dUKGVuZHBvaW50X2J1ZmZlcl9zaXplLCAwdSk7Ci0KLSAgLy8gVXNlIGEgbm9uLXN1cHBvcnRlZCBmb3JtYXQgYW5kIHZlcmlmeSB0aGF0IGluaXRpYWxpemF0aW9uIGZhaWxzLgotICAvLyBBIHNpbXBsZSB3YXkgdG8gZW11bGF0ZSBhbiBpbnZhbGlkIGZvcm1hdCBpcyB0byB1c2UgdGhlIHNoYXJlZC1tb2RlCi0gIC8vIG1peGluZyBmb3JtYXQgYW5kIG1vZGlmeSB0aGUgcHJlZmVycmVkIHNhbXBsZS4KLSAgY2xpZW50ID0gQ29yZUF1ZGlvVXRpbDo6Q3JlYXRlRGVmYXVsdENsaWVudChlUmVuZGVyLCBlQ29uc29sZSk7Ci0gIEVYUEVDVF9UUlVFKGNsaWVudCk7Ci0gIGZvcm1hdC5Gb3JtYXQublNhbXBsZXNQZXJTZWMgPSBmb3JtYXQuRm9ybWF0Lm5TYW1wbGVzUGVyU2VjICsgMTsKLSAgRVhQRUNUX0ZBTFNFKENvcmVBdWRpb1V0aWw6OklzRm9ybWF0U3VwcG9ydGVkKAotICAgICAgICAgICAgICAgICAgY2xpZW50LCBBVURDTE5UX1NIQVJFTU9ERV9TSEFSRUQsICZmb3JtYXQpKTsKLSAgaHIgPSBDb3JlQXVkaW9VdGlsOjpTaGFyZWRNb2RlSW5pdGlhbGl6ZShjbGllbnQsICZmb3JtYXQsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuZHBvaW50X2J1ZmZlcl9zaXplKTsKLSAgRVhQRUNUX1RSVUUoRkFJTEVEKGhyKSk7Ci0gIEVYUEVDVF9FUShociwgRV9JTlZBTElEQVJHKTsKLQotICAvLyBGaW5hbGx5LCBwZXJmb3JtIGEgc2hhcmVkLW1vZGUgaW5pdGlhbGl6YXRpb24gdXNpbmcgZXZlbnQtZHJpdmVuIGJ1ZmZlcgotICAvLyBoYW5kbGluZy4gVGhlIGV2ZW50IGhhbmRsZSB3aWxsIGJlIHNpZ25hbGVkIHdoZW4gYW4gYXVkaW8gYnVmZmVyIGlzIHJlYWR5Ci0gIC8vIHRvIGJlIHByb2Nlc3NlZCBieSB0aGUgY2xpZW50IChub3QgdmVyaWZpZWQgaGVyZSkuCi0gIC8vIFRoZSBldmVudCBoYW5kbGUgc2hvdWxkIGJlIGluIHRoZSBub25zaWduYWxlZCBzdGF0ZS4KLSAgYmFzZTo6d2luOjpTY29wZWRIYW5kbGUgZXZlbnRfaGFuZGxlKDo6Q3JlYXRlRXZlbnQoTlVMTCwgVFJVRSwgRkFMU0UsIE5VTEwpKTsKLSAgY2xpZW50ID0gQ29yZUF1ZGlvVXRpbDo6Q3JlYXRlRGVmYXVsdENsaWVudChlUmVuZGVyLCBlQ29uc29sZSk7Ci0gIEVYUEVDVF9UUlVFKGNsaWVudCk7Ci0gIEVYUEVDVF9UUlVFKFNVQ0NFRURFRChDb3JlQXVkaW9VdGlsOjpHZXRTaGFyZWRNb2RlTWl4Rm9ybWF0KGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCkpKTsKLSAgRVhQRUNUX1RSVUUoQ29yZUF1ZGlvVXRpbDo6SXNGb3JtYXRTdXBwb3J0ZWQoCi0gICAgICAgICAgICAgICAgICBjbGllbnQsIEFVRENMTlRfU0hBUkVNT0RFX1NIQVJFRCwgJmZvcm1hdCkpOwotICBociA9IENvcmVBdWRpb1V0aWw6OlNoYXJlZE1vZGVJbml0aWFsaXplKGNsaWVudCwgJmZvcm1hdCwgZXZlbnRfaGFuZGxlLkdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmRwb2ludF9idWZmZXJfc2l6ZSk7Ci0gIEVYUEVDVF9UUlVFKFNVQ0NFRURFRChocikpOwotICBFWFBFQ1RfR1QoZW5kcG9pbnRfYnVmZmVyX3NpemUsIDB1KTsKLX0KLQotVEVTVF9GKENvcmVBdWRpb1V0aWxXaW5UZXN0LCBDcmVhdGVSZW5kZXJBbmRDYXB0dXJlQ2xpZW50cykgewotICBpZiAoIUNhblJ1bkF1ZGlvVGVzdCgpKQotICAgIHJldHVybjsKLQotICBFRGF0YUZsb3cgZGF0YVtdID0ge2VSZW5kZXIsIGVDYXB0dXJlfTsKLQotICBXQVZFRk9STUFUUENNRVggZm9ybWF0OwotICBzaXplX3QgZW5kcG9pbnRfYnVmZmVyX3NpemUgPSAwOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlzaXplKGRhdGEpOyArK2kpIHsKLSAgICBTY29wZWRDb21QdHI8SUF1ZGlvQ2xpZW50PiBjbGllbnQ7Ci0gICAgU2NvcGVkQ29tUHRyPElBdWRpb1JlbmRlckNsaWVudD4gcmVuZGVyX2NsaWVudDsKLSAgICBTY29wZWRDb21QdHI8SUF1ZGlvQ2FwdHVyZUNsaWVudD4gY2FwdHVyZV9jbGllbnQ7Ci0KLSAgICBjbGllbnQgPSBDb3JlQXVkaW9VdGlsOjpDcmVhdGVEZWZhdWx0Q2xpZW50KGRhdGFbaV0sIGVDb25zb2xlKTsKLSAgICBFWFBFQ1RfVFJVRShjbGllbnQpOwotICAgIEVYUEVDVF9UUlVFKFNVQ0NFRURFRChDb3JlQXVkaW9VdGlsOjpHZXRTaGFyZWRNb2RlTWl4Rm9ybWF0KGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0KSkpOwotICAgIGlmIChkYXRhW2ldID09IGVSZW5kZXIpIHsKLSAgICAgIC8vIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBjcmVhdGUgYSByZW5kZXIgY2xpZW50IHVzaW5nIGFuIHVuaXRpYWxpemVkCi0gICAgICAvLyBjbGllbnQgaW50ZXJmYWNlLgotICAgICAgcmVuZGVyX2NsaWVudCA9IENvcmVBdWRpb1V0aWw6OkNyZWF0ZVJlbmRlckNsaWVudChjbGllbnQpOwotICAgICAgRVhQRUNUX0ZBTFNFKHJlbmRlcl9jbGllbnQpOwotCi0gICAgICAvLyBEbyBhIHByb3BlciBpbml0aWFsaXphdGlvbiBhbmQgdmVyaWZ5IHRoYXQgaXQgd29ya3MgdGhpcyB0aW1lLgotICAgICAgQ29yZUF1ZGlvVXRpbDo6U2hhcmVkTW9kZUluaXRpYWxpemUoY2xpZW50LCAmZm9ybWF0LCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuZHBvaW50X2J1ZmZlcl9zaXplKTsKLSAgICAgIHJlbmRlcl9jbGllbnQgPSBDb3JlQXVkaW9VdGlsOjpDcmVhdGVSZW5kZXJDbGllbnQoY2xpZW50KTsKLSAgICAgIEVYUEVDVF9UUlVFKHJlbmRlcl9jbGllbnQpOwotICAgICAgRVhQRUNUX0dUKGVuZHBvaW50X2J1ZmZlcl9zaXplLCAwdSk7Ci0gICAgfSBlbHNlIGlmIChkYXRhW2ldID09IGVDYXB0dXJlKSB7Ci0gICAgICAvLyBJdCBpcyBub3QgcG9zc2libGUgdG8gY3JlYXRlIGEgY2FwdHVyZSBjbGllbnQgdXNpbmcgYW4gdW5pdGlhbGl6ZWQKLSAgICAgIC8vIGNsaWVudCBpbnRlcmZhY2UuCi0gICAgICBjYXB0dXJlX2NsaWVudCA9IENvcmVBdWRpb1V0aWw6OkNyZWF0ZUNhcHR1cmVDbGllbnQoY2xpZW50KTsKLSAgICAgIEVYUEVDVF9GQUxTRShjYXB0dXJlX2NsaWVudCk7Ci0KLSAgICAgIC8vIERvIGEgcHJvcGVyIGluaXRpYWxpemF0aW9uIGFuZCB2ZXJpZnkgdGhhdCBpdCB3b3JrcyB0aGlzIHRpbWUuCi0gICAgICBDb3JlQXVkaW9VdGlsOjpTaGFyZWRNb2RlSW5pdGlhbGl6ZShjbGllbnQsICZmb3JtYXQsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5kcG9pbnRfYnVmZmVyX3NpemUpOwotICAgICAgY2FwdHVyZV9jbGllbnQgPSBDb3JlQXVkaW9VdGlsOjpDcmVhdGVDYXB0dXJlQ2xpZW50KGNsaWVudCk7Ci0gICAgICBFWFBFQ1RfVFJVRShjYXB0dXJlX2NsaWVudCk7Ci0gICAgICBFWFBFQ1RfR1QoZW5kcG9pbnRfYnVmZmVyX3NpemUsIDB1KTsKLSAgICB9Ci0gIH0KLX0KLQotLy8KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vd2luL2RldmljZV9lbnVtZXJhdGlvbl93aW4uY2MgYi9zcmMvbWVkaWEvYXVkaW8vd2luL2RldmljZV9lbnVtZXJhdGlvbl93aW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YWFjYjAuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL3dpbi9kZXZpY2VfZW51bWVyYXRpb25fd2luLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlIDxNTURldmljZUFQSS5oPgotI2luY2x1ZGUgPG1tc3lzdGVtLmg+Ci0jaW5jbHVkZSA8RnVuY3Rpb25kaXNjb3ZlcnlrZXlzX2RldnBrZXkuaD4gIC8vIE1NRGV2aWNlQVBJLmggbXVzdCBjb21lIGZpcnN0Ci0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby93aW4vYXVkaW9fbWFuYWdlcl93aW4uaCIKLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvdXRmX3N0cmluZ19jb252ZXJzaW9ucy5oIgotI2luY2x1ZGUgImJhc2Uvd2luL3Njb3BlZF9jb19tZW0uaCIKLSNpbmNsdWRlICJiYXNlL3dpbi9zY29wZWRfY29tcHRyLmgiCi0KLXVzaW5nIG1lZGlhOjpBdWRpb0RldmljZU5hbWVzOwotdXNpbmcgYmFzZTo6d2luOjpTY29wZWRDb21QdHI7Ci11c2luZyBiYXNlOjp3aW46OlNjb3BlZENvTWVtOwotCi0vLyBUYWtlbiBmcm9tIE1tZGRrLmguCi0jZGVmaW5lIERSVl9SRVNFUlZFRCAgICAgICAgICAgICAgICAgICAgICAweDA4MDAKLSNkZWZpbmUgRFJWX1FVRVJZRlVOQ1RJT05JTlNUQU5DRUlEICAgICAgIChEUlZfUkVTRVJWRUQgKyAxNykKLSNkZWZpbmUgRFJWX1FVRVJZRlVOQ1RJT05JTlNUQU5DRUlEU0laRSAgIChEUlZfUkVTRVJWRUQgKyAxOCkKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotYm9vbCBHZXRJbnB1dERldmljZU5hbWVzV2luKEF1ZGlvRGV2aWNlTmFtZXMqIGRldmljZV9uYW1lcykgewotICAvLyBJdCBpcyBhc3N1bWVkIHRoYXQgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGZyb20gYSBDT00gdGhyZWFkLCBpLmUuLAotICAvLyBDb0luaXRpYWxpemVFeCgpIGlzIG5vdCBjYWxsZWQgaGVyZSBhZ2FpbiB0byBhdm9pZCBTVEEvTVRBIGNvbmZsaWN0cy4KLSAgU2NvcGVkQ29tUHRyPElNTURldmljZUVudW1lcmF0b3I+IGVudW1lcmF0b3I7Ci0gIEhSRVNVTFQgaHIgPSAgQ29DcmVhdGVJbnN0YW5jZShfX3V1aWRvZihNTURldmljZUVudW1lcmF0b3IpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMU0NUWF9JTlBST0NfU0VSVkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191dWlkb2YoSU1NRGV2aWNlRW51bWVyYXRvciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhdG9yLlJlY2VpdmVWb2lkKCkpOwotICBEQ0hFQ0tfTkUoQ09fRV9OT1RJTklUSUFMSVpFRCwgaHIpOwotICBpZiAoRkFJTEVEKGhyKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBJTU1EZXZpY2VFbnVtZXJhdG9yOiAiIDw8IHN0ZDo6aGV4IDw8IGhyOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIGEgY29sbGVjdGlvbiBvZiBhY3RpdmUgYXVkaW8gY2FwdHVyZSBlbmRwb2ludCBkZXZpY2VzLgotICAvLyBUaGlzIG1ldGhvZCB3aWxsIHN1Y2NlZWQgZXZlbiBpZiBhbGwgZGV2aWNlcyBhcmUgZGlzYWJsZWQuCi0gIFNjb3BlZENvbVB0cjxJTU1EZXZpY2VDb2xsZWN0aW9uPiBjb2xsZWN0aW9uOwotICBociA9IGVudW1lcmF0b3ItPkVudW1BdWRpb0VuZHBvaW50cyhlQ2FwdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVWSUNFX1NUQVRFX0FDVElWRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi5SZWNlaXZlKCkpOwotICBpZiAoRkFJTEVEKGhyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gUmV0cmlldmUgdGhlIG51bWJlciBvZiBhY3RpdmUgY2FwdHVyZSBkZXZpY2VzLgotICBVSU5UIG51bWJlcl9vZl9hY3RpdmVfZGV2aWNlcyA9IDA7Ci0gIGNvbGxlY3Rpb24tPkdldENvdW50KCZudW1iZXJfb2ZfYWN0aXZlX2RldmljZXMpOwotICBpZiAobnVtYmVyX29mX2FjdGl2ZV9kZXZpY2VzID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbWVkaWE6OkF1ZGlvRGV2aWNlTmFtZSBkZXZpY2U7Ci0KLSAgLy8gTG9vcCBvdmVyIGFsbCBhY3RpdmUgY2FwdHVyZSBkZXZpY2VzIGFuZCBhZGQgZnJpZW5kbHkgbmFtZSBhbmQKLSAgLy8gdW5pcXVlIElEIHRvIHRoZSB8ZGV2aWNlX25hbWVzfCBsaXN0LgotICBmb3IgKFVJTlQgaSA9IDA7IGkgPCBudW1iZXJfb2ZfYWN0aXZlX2RldmljZXM7ICsraSkgewotICAgIC8vIFJldHJpZXZlIHVuaXF1ZSBuYW1lIG9mIGVuZHBvaW50IGRldmljZS4KLSAgICAvLyBFeGFtcGxlOiAiezAuMC4xLjAwMDAwMDAwfS57OGRiNjAyMGYtMThlMy00ZjI1LWI2ZjUtNzcyNmM5MTIyNTc0fSIuCi0gICAgU2NvcGVkQ29tUHRyPElNTURldmljZT4gYXVkaW9fZGV2aWNlOwotICAgIGhyID0gY29sbGVjdGlvbi0+SXRlbShpLCBhdWRpb19kZXZpY2UuUmVjZWl2ZSgpKTsKLSAgICBpZiAoRkFJTEVEKGhyKSkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgLy8gU3RvcmUgdGhlIHVuaXF1ZSBuYW1lLgotICAgIFNjb3BlZENvTWVtPFdDSEFSPiBlbmRwb2ludF9kZXZpY2VfaWQ7Ci0gICAgYXVkaW9fZGV2aWNlLT5HZXRJZCgmZW5kcG9pbnRfZGV2aWNlX2lkKTsKLSAgICBkZXZpY2UudW5pcXVlX2lkID0gV2lkZVRvVVRGOChzdGF0aWNfY2FzdDxXQ0hBUio+KGVuZHBvaW50X2RldmljZV9pZCkpOwotCi0gICAgLy8gUmV0cmlldmUgdXNlci1mcmllbmRseSBuYW1lIG9mIGVuZHBvaW50IGRldmljZS4KLSAgICAvLyBFeGFtcGxlOiAiTWljcm9waG9uZSAoUmVhbHRlayBIaWdoIERlZmluaXRpb24gQXVkaW8pIi4KLSAgICBTY29wZWRDb21QdHI8SVByb3BlcnR5U3RvcmU+IHByb3BlcnRpZXM7Ci0gICAgaHIgPSBhdWRpb19kZXZpY2UtPk9wZW5Qcm9wZXJ0eVN0b3JlKFNUR01fUkVBRCwgcHJvcGVydGllcy5SZWNlaXZlKCkpOwotICAgIGlmIChTVUNDRUVERUQoaHIpKSB7Ci0gICAgICBQUk9QVkFSSUFOVCBmcmllbmRseV9uYW1lOwotICAgICAgUHJvcFZhcmlhbnRJbml0KCZmcmllbmRseV9uYW1lKTsKLSAgICAgIGhyID0gcHJvcGVydGllcy0+R2V0VmFsdWUoUEtFWV9EZXZpY2VfRnJpZW5kbHlOYW1lLCAmZnJpZW5kbHlfbmFtZSk7Ci0KLSAgICAgIC8vIFN0b3JlIHRoZSB1c2VyLWZyaWVuZGx5IG5hbWUuCi0gICAgICBpZiAoU1VDQ0VFREVEKGhyKSAmJgotICAgICAgICAgIGZyaWVuZGx5X25hbWUudnQgPT0gVlRfTFBXU1RSICYmIGZyaWVuZGx5X25hbWUucHdzelZhbCkgewotICAgICAgICBkZXZpY2UuZGV2aWNlX25hbWUgPSBXaWRlVG9VVEY4KGZyaWVuZGx5X25hbWUucHdzelZhbCk7Ci0gICAgICB9Ci0gICAgICBQcm9wVmFyaWFudENsZWFyKCZmcmllbmRseV9uYW1lKTsKLSAgICB9Ci0KLSAgICAvLyBBZGQgY29tYmluYXRpb24gb2YgdXNlci1mcmllbmRseSBhbmQgdW5pcXVlIG5hbWUgdG8gdGhlIG91dHB1dCBsaXN0LgotICAgIGRldmljZV9uYW1lcy0+cHVzaF9iYWNrKGRldmljZSk7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBHZXRJbnB1dERldmljZU5hbWVzV2luWFAoQXVkaW9EZXZpY2VOYW1lcyogZGV2aWNlX25hbWVzKSB7Ci0gIC8vIFJldHJpZXZlIHRoZSBudW1iZXIgb2YgYWN0aXZlIHdhdmVmb3JtIGlucHV0IGRldmljZXMuCi0gIFVJTlQgbnVtYmVyX29mX2FjdGl2ZV9kZXZpY2VzID0gd2F2ZUluR2V0TnVtRGV2cygpOwotICBpZiAobnVtYmVyX29mX2FjdGl2ZV9kZXZpY2VzID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbWVkaWE6OkF1ZGlvRGV2aWNlTmFtZSBkZXZpY2U7Ci0gIFdBVkVJTkNBUFMgY2FwYWJpbGl0aWVzOwotICBNTVJFU1VMVCBlcnIgPSBNTVNZU0VSUl9OT0VSUk9SOwotCi0gIC8vIExvb3Agb3ZlciBhbGwgYWN0aXZlIGNhcHR1cmUgZGV2aWNlcyBhbmQgYWRkIGZyaWVuZGx5IG5hbWUgYW5kCi0gIC8vIHVuaXF1ZSBJRCB0byB0aGUgfGRldmljZV9uYW1lc3wgbGlzdC4gTm90ZSB0aGF0LCBmb3IgV2F2ZSBvbiBYUCwKLSAgLy8gdGhlICJ1bmlxdWUiIG5hbWUgd2lsbCBzaW1wbHkgYmUgYSBjb3B5IG9mIHRoZSBmcmllbmRseSBuYW1lIHNpbmNlCi0gIC8vIHRoZXJlIGlzIG5vIHNhZmUgbWV0aG9kIHRvIHJldHJpZXZlIGEgdW5pcXVlIGRldmljZSBuYW1lIG9uIFhQLgotICBmb3IgKFVJTlQgaSA9IDA7IGkgPCBudW1iZXJfb2ZfYWN0aXZlX2RldmljZXM7ICsraSkgewotICAgIC8vIFJldHJpZXZlIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIHNwZWNpZmllZCB3YXZlZm9ybS1hdWRpbyBpbnB1dCBkZXZpY2UuCi0gICAgZXJyID0gd2F2ZUluR2V0RGV2Q2FwcyhpLCAgJmNhcGFiaWxpdGllcywgc2l6ZW9mKGNhcGFiaWxpdGllcykpOwotICAgIGlmIChlcnIgIT0gTU1TWVNFUlJfTk9FUlJPUikKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgLy8gU3RvcmUgdGhlIHVzZXItZnJpZW5kbHkgbmFtZS4gTWF4IGxlbmd0aCBpcyBNQVhQTkFNRUxFTig9MzIpCi0gICAgLy8gY2hhcmFjdGVycyBhbmQgdGhlIG5hbWUgY2FuZSBiZSB0cnVuY2F0ZWQgb24gWFAuCi0gICAgLy8gRXhhbXBsZTogIk1pY3JvcGhvbmUgKFJlYWx0ZWsgSGlnaCBEZWZpbmkiLgotICAgIGRldmljZS5kZXZpY2VfbmFtZSA9IFdpZGVUb1VURjgoY2FwYWJpbGl0aWVzLnN6UG5hbWUpOwotCi0gICAgLy8gU3RvcmUgdGhlICJ1bmlxdWUiIG5hbWUgKHdlIHVzZSBzYW1lIGFzIGZyaWVuZGx5IG5hbWUgb24gV2luZG93cyBYUCkuCi0gICAgZGV2aWNlLnVuaXF1ZV9pZCA9IFdpZGVUb1VURjgoY2FwYWJpbGl0aWVzLnN6UG5hbWUpOwotCi0gICAgLy8gQWRkIGNvbWJpbmF0aW9uIG9mIHVzZXItZnJpZW5kbHkgYW5kIHVuaXF1ZSBuYW1lIHRvIHRoZSBvdXRwdXQgbGlzdC4KLSAgICBkZXZpY2VfbmFtZXMtPnB1c2hfYmFjayhkZXZpY2UpOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0ZDo6c3RyaW5nIENvbnZlcnRUb1dpblhQRGV2aWNlSWQoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCkgewotICBVSU5UIG51bWJlcl9vZl9hY3RpdmVfZGV2aWNlcyA9IHdhdmVJbkdldE51bURldnMoKTsKLSAgTU1SRVNVTFQgcmVzdWx0ID0gTU1TWVNFUlJfTk9FUlJPUjsKLQotICBVSU5UIGkgPSAwOwotICBmb3IgKDsgaSA8IG51bWJlcl9vZl9hY3RpdmVfZGV2aWNlczsgKytpKSB7Ci0gICAgc2l6ZV90IHNpemUgPSAwOwotICAgIC8vIEdldCB0aGUgc2l6ZSAoaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyBOVUxMKSBvZiB0aGUgZW5kcG9pbnQgSUQgb2YgdGhlCi0gICAgLy8gd2F2ZUluIGRldmljZS4KLSAgICByZXN1bHQgPSB3YXZlSW5NZXNzYWdlKHJlaW50ZXJwcmV0X2Nhc3Q8SFdBVkVJTj4oaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBEUlZfUVVFUllGVU5DVElPTklOU1RBTkNFSURTSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxEV09SRF9QVFI+KCZzaXplKSwgTlVMTCk7Ci0gICAgaWYgKHJlc3VsdCAhPSBNTVNZU0VSUl9OT0VSUk9SKQotICAgICAgY29udGludWU7Ci0KLSAgICBTY29wZWRDb01lbTxXQ0hBUj4gaWQ7Ci0gICAgaWQuUmVzZXQoc3RhdGljX2Nhc3Q8V0NIQVIqPihDb1Rhc2tNZW1BbGxvYyhzaXplKSkpOwotICAgIGlmICghaWQpCi0gICAgICBjb250aW51ZTsKLQotICAgIC8vIEdldCB0aGUgZW5kcG9pbnQgSUQgc3RyaW5nIGZvciB0aGlzIHdhdmVJbiBkZXZpY2UuCi0gICAgcmVzdWx0ID0gd2F2ZUluTWVzc2FnZSgKLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxIV0FWRUlOPihpKSwgRFJWX1FVRVJZRlVOQ1RJT05JTlNUQU5DRUlELAotICAgICAgICByZWludGVycHJldF9jYXN0PERXT1JEX1BUUj4oc3RhdGljX2Nhc3Q8V0NIQVIqPihpZCkpLCBzaXplKTsKLSAgICBpZiAocmVzdWx0ICE9IE1NU1lTRVJSX05PRVJST1IpCi0gICAgICBjb250aW51ZTsKLQotICAgIHN0ZDo6c3RyaW5nIHV0ZjhfaWQgPSBXaWRlVG9VVEY4KHN0YXRpY19jYXN0PFdDSEFSKj4oaWQpKTsKLSAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBlbmRwb2ludCBJRCBzdHJpbmcgb2YgdGhpcyB3YXZlSW4gZGV2aWNlIG1hdGNoZXMgdGhhdAotICAgIC8vIG9mIHRoZSBhdWRpbyBlbmRwb2ludCBkZXZpY2UuCi0gICAgaWYgKGRldmljZV9pZCA9PSB1dGY4X2lkKQotICAgICAgYnJlYWs7Ci0gIH0KLQotICAvLyBJZiBhIG1hdGNoaW5nIHdhdmVJbiBkZXZpY2Ugd2FzIGZvdW5kLCBjb252ZXJ0IHRoZSB1bmlxdWUgZW5kcG9pbnQgSUQKLSAgLy8gc3RyaW5nIHRvIGEgc3RhbmRhcmQgZnJpZW5kbHkgbmFtZSB3aXRoIG1heCAzMiBjaGFyYWN0ZXJzLgotICBpZiAoaSA8IG51bWJlcl9vZl9hY3RpdmVfZGV2aWNlcykgewotICAgIFdBVkVJTkNBUFMgY2FwYWJpbGl0aWVzOwotCi0gICAgcmVzdWx0ID0gd2F2ZUluR2V0RGV2Q2FwcyhpLCAmY2FwYWJpbGl0aWVzLCBzaXplb2YoY2FwYWJpbGl0aWVzKSk7Ci0gICAgaWYgKHJlc3VsdCA9PSBNTVNZU0VSUl9OT0VSUk9SKQotICAgICAgcmV0dXJuIFdpZGVUb1VURjgoY2FwYWJpbGl0aWVzLnN6UG5hbWUpOwotICB9Ci0KLSAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL3dpbi9kZXZpY2VfZW51bWVyYXRpb25fd2luLmggYi9zcmMvbWVkaWEvYXVkaW8vd2luL2RldmljZV9lbnVtZXJhdGlvbl93aW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q0NDY3MC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vd2luL2RldmljZV9lbnVtZXJhdGlvbl93aW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfQVVESU9fV0lOX0RFVklDRV9FTlVNRVJBVElPTl9XSU5fSF8KLSNkZWZpbmUgTUVESUFfQVVESU9fV0lOX0RFVklDRV9FTlVNRVJBVElPTl9XSU5fSF8KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX2RldmljZV9uYW1lLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIFJldHVybnMgYSBsaXN0IG9mIGF1ZGlvIGlucHV0IGRldmljZSBzdHJ1Y3R1cmVzIChuYW1lIGFuZCB1bmlxdWUgZGV2aWNlIElEKQotLy8gdXNpbmcgdGhlIE1NRGV2aWNlIEFQSSB3aGljaCBpcyBzdXBwb3J0ZWQgb24gV2luZG93cyBWaXN0YSBhbmQgaGlnaGVyLgotLy8gRXhhbXBsZSByZWNvcmQgaW4gdGhlIG91dHB1dCBsaXN0OgotLy8gLSBkZXZpY2VfbmFtZTogIk1pY3JvcGhvbmUgKFJlYWx0ZWsgSGlnaCBEZWZpbml0aW9uIEF1ZGlvKSIuCi0vLyAtIHVuaXF1ZV9pZDogInswLjAuMS4wMDAwMDAwMH0uezhkYjYwMjBmLTE4ZTMtNGYyNS1iNmY1LTc3MjZjOTEyMjU3NH0iCi0vLyBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBmcm9tIGEgQ09NIHRocmVhZCB1c2luZyBNVEEuCi1ib29sIEdldElucHV0RGV2aWNlTmFtZXNXaW4obWVkaWE6OkF1ZGlvRGV2aWNlTmFtZXMqIGRldmljZV9uYW1lcyk7Ci0KLS8vIFJldHVybnMgYSBsaXN0IG9mIGF1ZGlvIGlucHV0IGRldmljZSBzdHJ1Y3R1cmVzIChuYW1lIGFuZCB1bmlxdWUgZGV2aWNlIElEKQotLy8gdXNpbmcgdGhlIFdhdmVJbiBBUEkgd2hpY2ggaXMgc3VwcG9ydGVkIG9uIFdpbmRvd3MgWFAgYW5kIGhpZ2hlci4KLS8vIEV4YW1wbGUgcmVjb3JkIGluIHRoZSBvdXRwdXQgbGlzdDoKLS8vIC0gZGV2aWNlX25hbWU6ICJNaWNyb3Bob25lIChSZWFsdGVrIEhpZ2ggRGVmaW5pIi4KLS8vIC0gdW5pcXVlX2lkOiAiTWljcm9waG9uZSAoUmVhbHRlayBIaWdoIERlZmluaSIgKHNhbWUgYXMgZnJpZW5kbHkgbmFtZSkuCi1ib29sIEdldElucHV0RGV2aWNlTmFtZXNXaW5YUChtZWRpYTo6QXVkaW9EZXZpY2VOYW1lcyogZGV2aWNlX25hbWVzKTsKLQotLy8gQ29udmVydHMgYSBkZXZpY2UgSUQgZ2VuZXJhdGVkIGJ5IHxHZXRJbnB1dERldmljZU5hbWVzV2luKCl8IHRvIHRoZQotLy8gY29ycmVzcG9uZGluZyBJRCBieSB8R2V0SW5wdXREZXZpY2VOYW1lc1dpblhQKCl8LiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvbgotLy8gZmFpbHVyZS4KLS8vIEV4YW1wbGUgaW5wdXQgYW5kIG91dHB1dDoKLS8vIC0gaW5wdXQgSUQ6ICJ7MC4wLjEuMDAwMDAwMDB9Lns4ZGI2MDIwZi0xOGUzLTRmMjUtYjZmNS03NzI2YzkxMjI1NzR9IgotLy8gLSBvdXRwdXQgSUQ6ICJNaWNyb3Bob25lIChSZWFsdGVrIEhpZ2ggRGVmaW5pIgotc3RkOjpzdHJpbmcgQ29udmVydFRvV2luWFBEZXZpY2VJZChjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2lkKTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQVVESU9fV0lOX0RFVklDRV9FTlVNRVJBVElPTl9XSU5fSF8KLQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2F1ZGlvL3dpbi93YXZlaW5faW5wdXRfd2luLmNjIGIvc3JjL21lZGlhL2F1ZGlvL3dpbi93YXZlaW5faW5wdXRfd2luLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjI1NzA3Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby93aW4vd2F2ZWluX2lucHV0X3dpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vd2luL3dhdmVpbl9pbnB1dF93aW4uaCIKLQotI3ByYWdtYSBjb21tZW50KGxpYiwgIndpbm1tLmxpYiIpCi0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19pby5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3V0aWwuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby93aW4vYXVkaW9fbWFuYWdlcl93aW4uaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby93aW4vZGV2aWNlX2VudW1lcmF0aW9uX3dpbi5oIgotCi1uYW1lc3BhY2UgewotY29uc3QgaW50IGtTdG9wSW5wdXRTdHJlYW1DYWxsYmFja1RpbWVvdXQgPSAzMDAwOyAgLy8gVGhyZWUgc2Vjb25kcy4KLX0KLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gT3VyIHNvdW5kIGJ1ZmZlcnMgYXJlIGFsbG9jYXRlZCBvbmNlIGFuZCBrZXB0IGluIGEgbGlua2VkIGxpc3QgdXNpbmcgdGhlCi0vLyB0aGUgV0FWRUhEUjo6ZHdVc2VyIHZhcmlhYmxlLiBUaGUgbGFzdCBidWZmZXIgcG9pbnRzIHRvIHRoZSBmaXJzdCBidWZmZXIuCi1zdGF0aWMgV0FWRUhEUiogR2V0TmV4dEJ1ZmZlcihXQVZFSERSKiBjdXJyZW50KSB7Ci0gIHJldHVybiByZWludGVycHJldF9jYXN0PFdBVkVIRFIqPihjdXJyZW50LT5kd1VzZXIpOwotfQotCi1QQ01XYXZlSW5BdWRpb0lucHV0U3RyZWFtOjpQQ01XYXZlSW5BdWRpb0lucHV0U3RyZWFtKAotICAgIEF1ZGlvTWFuYWdlcldpbiogbWFuYWdlciwgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsIGludCBudW1fYnVmZmVycywKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2lkKQotICAgIDogc3RhdGVfKGtTdGF0ZUVtcHR5KSwKLSAgICAgIG1hbmFnZXJfKG1hbmFnZXIpLAotICAgICAgZGV2aWNlX2lkXyhkZXZpY2VfaWQpLAotICAgICAgd2F2ZWluXyhOVUxMKSwKLSAgICAgIGNhbGxiYWNrXyhOVUxMKSwKLSAgICAgIG51bV9idWZmZXJzXyhudW1fYnVmZmVycyksCi0gICAgICBidWZmZXJfKE5VTEwpLAotICAgICAgY2hhbm5lbHNfKHBhcmFtcy5jaGFubmVscygpKSB7Ci0gIERDSEVDS19HVChudW1fYnVmZmVyc18sIDApOwotICBmb3JtYXRfLndGb3JtYXRUYWcgPSBXQVZFX0ZPUk1BVF9QQ007Ci0gIGZvcm1hdF8ubkNoYW5uZWxzID0gcGFyYW1zLmNoYW5uZWxzKCkgPiAyID8gMiA6IHBhcmFtcy5jaGFubmVscygpOwotICBmb3JtYXRfLm5TYW1wbGVzUGVyU2VjID0gcGFyYW1zLnNhbXBsZV9yYXRlKCk7Ci0gIGZvcm1hdF8ud0JpdHNQZXJTYW1wbGUgPSBwYXJhbXMuYml0c19wZXJfc2FtcGxlKCk7Ci0gIGZvcm1hdF8uY2JTaXplID0gMDsKLSAgZm9ybWF0Xy5uQmxvY2tBbGlnbiA9IChmb3JtYXRfLm5DaGFubmVscyAqIGZvcm1hdF8ud0JpdHNQZXJTYW1wbGUpIC8gODsKLSAgZm9ybWF0Xy5uQXZnQnl0ZXNQZXJTZWMgPSBmb3JtYXRfLm5CbG9ja0FsaWduICogZm9ybWF0Xy5uU2FtcGxlc1BlclNlYzsKLSAgYnVmZmVyX3NpemVfID0gcGFyYW1zLmZyYW1lc19wZXJfYnVmZmVyKCkgKiBmb3JtYXRfLm5CbG9ja0FsaWduOwotICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgcGFja2V0IHNpemUgd2UgdXNlIDEwMG1zLgotICBpZiAoIWJ1ZmZlcl9zaXplXykKLSAgICBidWZmZXJfc2l6ZV8gPSBmb3JtYXRfLm5BdmdCeXRlc1BlclNlYyAvIDEwOwotICAvLyBUaGUgZXZlbnQgaXMgYXV0by1yZXNldC4KLSAgc3RvcHBlZF9ldmVudF8uU2V0KDo6Q3JlYXRlRXZlbnRXKE5VTEwsIEZBTFNFLCBGQUxTRSwgTlVMTCkpOwotfQotCi1QQ01XYXZlSW5BdWRpb0lucHV0U3RyZWFtOjp+UENNV2F2ZUluQXVkaW9JbnB1dFN0cmVhbSgpIHsKLSAgRENIRUNLKE5VTEwgPT0gd2F2ZWluXyk7Ci19Ci0KLWJvb2wgUENNV2F2ZUluQXVkaW9JbnB1dFN0cmVhbTo6T3BlbigpIHsKLSAgaWYgKHN0YXRlXyAhPSBrU3RhdGVFbXB0eSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChudW1fYnVmZmVyc18gPCAyIHx8IG51bV9idWZmZXJzXyA+IDEwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvLyBDb252ZXJ0IHRoZSBzdG9yZWQgZGV2aWNlIGlkIHN0cmluZyBpbnRvIGFuIHVuc2lnbmVkIGludGVnZXIKLSAgLy8gY29ycmVzcG9uZGluZyB0byB0aGUgc2VsZWN0ZWQgZGV2aWNlLgotICBVSU5UIGRldmljZV9pZCA9IFdBVkVfTUFQUEVSOwotICBpZiAoIUdldERldmljZUlkKCZkZXZpY2VfaWQpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gT3BlbiB0aGUgc3BlY2lmaWVkIGlucHV0IGRldmljZSBmb3IgcmVjb3JkaW5nLgotICBNTVJFU1VMVCByZXN1bHQgPSBNTVNZU0VSUl9OT0VSUk9SOwotICByZXN1bHQgPSA6OndhdmVJbk9wZW4oJndhdmVpbl8sIGRldmljZV9pZCwgJmZvcm1hdF8sCi0gICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PERXT1JEX1BUUj4oV2F2ZUNhbGxiYWNrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8RFdPUkRfUFRSPih0aGlzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENBTExCQUNLX0ZVTkNUSU9OKTsKLSAgaWYgKHJlc3VsdCAhPSBNTVNZU0VSUl9OT0VSUk9SKQotICAgIHJldHVybiBmYWxzZTsKLQotICBTZXR1cEJ1ZmZlcnMoKTsKLSAgc3RhdGVfID0ga1N0YXRlUmVhZHk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFBDTVdhdmVJbkF1ZGlvSW5wdXRTdHJlYW06OlNldHVwQnVmZmVycygpIHsKLSAgV0FWRUhEUiogbGFzdCA9IE5VTEw7Ci0gIFdBVkVIRFIqIGZpcnN0ID0gTlVMTDsKLSAgZm9yIChpbnQgaXggPSAwOyBpeCAhPSBudW1fYnVmZmVyc187ICsraXgpIHsKLSAgICB1aW50MzIgc3ogPSBzaXplb2YoV0FWRUhEUikgKyBidWZmZXJfc2l6ZV87Ci0gICAgYnVmZmVyXyA9ICByZWludGVycHJldF9jYXN0PFdBVkVIRFIqPihuZXcgY2hhcltzel0pOwotICAgIGJ1ZmZlcl8tPmxwRGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGJ1ZmZlcl8pICsgc2l6ZW9mKFdBVkVIRFIpOwotICAgIGJ1ZmZlcl8tPmR3QnVmZmVyTGVuZ3RoID0gYnVmZmVyX3NpemVfOwotICAgIGJ1ZmZlcl8tPmR3Qnl0ZXNSZWNvcmRlZCA9IDA7Ci0gICAgYnVmZmVyXy0+ZHdVc2VyID0gcmVpbnRlcnByZXRfY2FzdDxEV09SRF9QVFI+KGxhc3QpOwotICAgIGJ1ZmZlcl8tPmR3RmxhZ3MgPSBXSERSX0RPTkU7Ci0gICAgYnVmZmVyXy0+ZHdMb29wcyA9IDA7Ci0gICAgaWYgKGl4ID09IDApCi0gICAgICBmaXJzdCA9IGJ1ZmZlcl87Ci0gICAgbGFzdCA9IGJ1ZmZlcl87Ci0gICAgOjp3YXZlSW5QcmVwYXJlSGVhZGVyKHdhdmVpbl8sIGJ1ZmZlcl8sIHNpemVvZihXQVZFSERSKSk7Ci0gIH0KLSAgLy8gRml4IHRoZSBmaXJzdCBidWZmZXIgdG8gcG9pbnQgdG8gdGhlIGxhc3Qgb25lLgotICBmaXJzdC0+ZHdVc2VyID0gcmVpbnRlcnByZXRfY2FzdDxEV09SRF9QVFI+KGxhc3QpOwotfQotCi12b2lkIFBDTVdhdmVJbkF1ZGlvSW5wdXRTdHJlYW06OkZyZWVCdWZmZXJzKCkgewotICBXQVZFSERSKiBjdXJyZW50ID0gYnVmZmVyXzsKLSAgZm9yIChpbnQgaXggPSAwOyBpeCAhPSBudW1fYnVmZmVyc187ICsraXgpIHsKLSAgICBXQVZFSERSKiBuZXh0ID0gR2V0TmV4dEJ1ZmZlcihjdXJyZW50KTsKLSAgICBpZiAoY3VycmVudC0+ZHdGbGFncyAmIFdIRFJfUFJFUEFSRUQpCi0gICAgICA6OndhdmVJblVucHJlcGFyZUhlYWRlcih3YXZlaW5fLCBjdXJyZW50LCBzaXplb2YoV0FWRUhEUikpOwotICAgIGRlbGV0ZVtdIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGN1cnJlbnQpOwotICAgIGN1cnJlbnQgPSBuZXh0OwotICB9Ci0gIGJ1ZmZlcl8gPSBOVUxMOwotfQotCi12b2lkIFBDTVdhdmVJbkF1ZGlvSW5wdXRTdHJlYW06OlN0YXJ0KEF1ZGlvSW5wdXRDYWxsYmFjayogY2FsbGJhY2spIHsKLSAgaWYgKHN0YXRlXyAhPSBrU3RhdGVSZWFkeSkKLSAgICByZXR1cm47Ci0KLSAgY2FsbGJhY2tfID0gY2FsbGJhY2s7Ci0gIHN0YXRlXyA9IGtTdGF0ZVJlY29yZGluZzsKLQotICBXQVZFSERSKiBidWZmZXIgPSBidWZmZXJfOwotICBmb3IgKGludCBpeCA9IDA7IGl4ICE9IG51bV9idWZmZXJzXzsgKytpeCkgewotICAgIFF1ZXVlTmV4dFBhY2tldChidWZmZXIpOwotICAgIGJ1ZmZlciA9IEdldE5leHRCdWZmZXIoYnVmZmVyKTsKLSAgfQotICBidWZmZXIgPSBidWZmZXJfOwotCi0gIE1NUkVTVUxUIHJlc3VsdCA9IDo6d2F2ZUluU3RhcnQod2F2ZWluXyk7Ci0gIGlmIChyZXN1bHQgIT0gTU1TWVNFUlJfTk9FUlJPUikgewotICAgIEhhbmRsZUVycm9yKHJlc3VsdCk7Ci0gICAgc3RhdGVfID0ga1N0YXRlUmVhZHk7Ci0gIH0gZWxzZSB7Ci0gICAgbWFuYWdlcl8tPkluY3JlYXNlQWN0aXZlSW5wdXRTdHJlYW1Db3VudCgpOwotICB9Ci19Ci0KLS8vIFN0b3BwaW5nIGlzIHRyaWNreS4gRmlyc3QsIG5vIGJ1ZmZlciBzaG91bGQgYmUgbG9ja2VkIGJ5IHRoZSBhdWRpbyBkcml2ZXIKLS8vIG9yIGVsc2UgdGhlIHdhdmVJblJlc2V0KCkgd2lsbCBkZWFkbG9jayBhbmQgc2Vjb25kbHksIHRoZSBjYWxsYmFjayBzaG91bGQKLS8vIG5vdCBiZSBpbnNpZGUgdGhlIEF1ZGlvSW5wdXRDYWxsYmFjaydzIE9uRGF0YSBiZWNhdXNlIHdhdmVJblJlc2V0KCkKLS8vIGZvcmNlZnVsbHkga2lsbHMgdGhlIGNhbGxiYWNrIHRocmVhZC4KLXZvaWQgUENNV2F2ZUluQXVkaW9JbnB1dFN0cmVhbTo6U3RvcCgpIHsKLSAgaWYgKHN0YXRlXyAhPSBrU3RhdGVSZWNvcmRpbmcpCi0gICAgcmV0dXJuOwotICBzdGF0ZV8gPSBrU3RhdGVTdG9wcGluZzsKLSAgLy8gV2FpdCBmb3IgdGhlIGNhbGxiYWNrIHRvIGZpbmlzaCwgaXQgd2lsbCBzaWduYWwgdXMgd2hlbiByZWFkeSB0byBiZSByZXNldC4KLSAgaWYgKFdBSVRfT0JKRUNUXzAgIT0KLSAgICAgIDo6V2FpdEZvclNpbmdsZU9iamVjdChzdG9wcGVkX2V2ZW50Xywga1N0b3BJbnB1dFN0cmVhbUNhbGxiYWNrVGltZW91dCkpIHsKLSAgICBIYW5kbGVFcnJvcig6OkdldExhc3RFcnJvcigpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy8gU3RvcCBpcyBhbHdheXMgY2FsbGVkIGJlZm9yZSBDbG9zZS4gSW4gY2FzZSBvZiBlcnJvciwgdGhpcyB3aWxsIGJlCi0gIC8vIGFsc28gY2FsbGVkIHdoZW4gY2xvc2luZyB0aGUgaW5wdXQgY29udHJvbGxlci4KLSAgbWFuYWdlcl8tPkRlY3JlYXNlQWN0aXZlSW5wdXRTdHJlYW1Db3VudCgpOwotCi0gIHN0YXRlXyA9IGtTdGF0ZVN0b3BwZWQ7Ci0gIE1NUkVTVUxUIHJlcyA9IDo6d2F2ZUluUmVzZXQod2F2ZWluXyk7Ci0gIGlmIChyZXMgIT0gTU1TWVNFUlJfTk9FUlJPUikgewotICAgIHN0YXRlXyA9IGtTdGF0ZVJlY29yZGluZzsKLSAgICBIYW5kbGVFcnJvcihyZXMpOwotICAgIHJldHVybjsKLSAgfQotICBzdGF0ZV8gPSBrU3RhdGVSZWFkeTsKLX0KLQotLy8gV2UgY2FuIENsb3NlIGluIGFueSBzdGF0ZSBleGNlcHQgdGhhdCB3aGVuIHRyeWluZyB0byBjbG9zZSBhIHN0cmVhbSB0aGF0IGlzCi0vLyByZWNvcmRpbmcgV2luZG93cyBnZW5lcmF0ZXMgYW4gZXJyb3IsIHdoaWNoIHdlIHByb3BhZ2F0ZSB0byB0aGUgc291cmNlLgotdm9pZCBQQ01XYXZlSW5BdWRpb0lucHV0U3RyZWFtOjpDbG9zZSgpIHsKLSAgaWYgKHdhdmVpbl8pIHsKLSAgICAvLyB3YXZlSW5DbG9zZSBnZW5lcmF0ZXMgYSBjYWxsYmFjayB3aXRoIFdJTV9DTE9TRSBpZCBpbiB0aGUgc2FtZSB0aHJlYWQuCi0gICAgTU1SRVNVTFQgcmVzID0gOjp3YXZlSW5DbG9zZSh3YXZlaW5fKTsKLSAgICBpZiAocmVzICE9IE1NU1lTRVJSX05PRVJST1IpIHsKLSAgICAgIEhhbmRsZUVycm9yKHJlcyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHN0YXRlXyA9IGtTdGF0ZUNsb3NlZDsKLSAgICB3YXZlaW5fID0gTlVMTDsKLSAgICBGcmVlQnVmZmVycygpOwotICB9Ci0gIC8vIFRlbGwgdGhlIGF1ZGlvIG1hbmFnZXIgdGhhdCB3ZSBoYXZlIGJlZW4gcmVsZWFzZWQuIFRoaXMgY2FuIHJlc3VsdCBpbgotICAvLyB0aGUgbWFuYWdlciBkZXN0cm95aW5nIHVzIGluLXBsYWNlIHNvIHRoaXMgbmVlZHMgdG8gYmUgdGhlIGxhc3QgdGhpbmcKLSAgLy8gd2UgZG8gb24gdGhpcyBmdW5jdGlvbi4KLSAgbWFuYWdlcl8tPlJlbGVhc2VJbnB1dFN0cmVhbSh0aGlzKTsKLX0KLQotZG91YmxlIFBDTVdhdmVJbkF1ZGlvSW5wdXRTdHJlYW06OkdldE1heFZvbHVtZSgpIHsKLSAgLy8gVE9ETyhoZW5yaWthKTogQWRkIHZvbHVtZSBzdXBwb3J0IHVzaW5nIHRoZSBBdWRpbyBNaXhlciBBUEkuCi0gIHJldHVybiAwLjA7Ci19Ci0KLXZvaWQgUENNV2F2ZUluQXVkaW9JbnB1dFN0cmVhbTo6U2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpIHsKLSAgLy8gVE9ETyhoZW5yaWthKTogQWRkIHZvbHVtZSBzdXBwb3J0IHVzaW5nIHRoZSBBdWRpbyBNaXhlciBBUEkuCi19Ci0KLWRvdWJsZSBQQ01XYXZlSW5BdWRpb0lucHV0U3RyZWFtOjpHZXRWb2x1bWUoKSB7Ci0gIC8vIFRPRE8oaGVucmlrYSk6IEFkZCB2b2x1bWUgc3VwcG9ydCB1c2luZyB0aGUgQXVkaW8gTWl4ZXIgQVBJLgotICByZXR1cm4gMC4wOwotfQotCi12b2lkIFBDTVdhdmVJbkF1ZGlvSW5wdXRTdHJlYW06OlNldEF1dG9tYXRpY0dhaW5Db250cm9sKGJvb2wgZW5hYmxlZCkgewotICAvLyBUT0RPKGhlbnJpa2EpOiBBZGQgQUdDIHN1cHBvcnQgd2hlbiB2b2x1bWUgY29udHJvbCBoYXMgYmVlbiBhZGRlZC4KLSAgTk9USU1QTEVNRU5URUQoKTsKLX0KLQotYm9vbCBQQ01XYXZlSW5BdWRpb0lucHV0U3RyZWFtOjpHZXRBdXRvbWF0aWNHYWluQ29udHJvbCgpIHsKLSAgLy8gVE9ETyhoZW5yaWthKTogQWRkIEFHQyBzdXBwb3J0IHdoZW4gdm9sdW1lIGNvbnRyb2wgaGFzIGJlZW4gYWRkZWQuCi0gIE5PVElNUExFTUVOVEVEKCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBQQ01XYXZlSW5BdWRpb0lucHV0U3RyZWFtOjpIYW5kbGVFcnJvcihNTVJFU1VMVCBlcnJvcikgewotICBETE9HKFdBUk5JTkcpIDw8ICJQQ01XYXZlSW5BdWRpbyBlcnJvciAiIDw8IGVycm9yOwotICBjYWxsYmFja18tPk9uRXJyb3IodGhpcywgZXJyb3IpOwotfQotCi12b2lkIFBDTVdhdmVJbkF1ZGlvSW5wdXRTdHJlYW06OlF1ZXVlTmV4dFBhY2tldChXQVZFSERSICpidWZmZXIpIHsKLSAgTU1SRVNVTFQgcmVzID0gOjp3YXZlSW5BZGRCdWZmZXIod2F2ZWluXywgYnVmZmVyLCBzaXplb2YoV0FWRUhEUikpOwotICBpZiAocmVzICE9IE1NU1lTRVJSX05PRVJST1IpCi0gICAgSGFuZGxlRXJyb3IocmVzKTsKLX0KLQotYm9vbCBQQ01XYXZlSW5BdWRpb0lucHV0U3RyZWFtOjpHZXREZXZpY2VJZChVSU5UKiBkZXZpY2VfaW5kZXgpIHsKLSAgLy8gRGVsaXZlciB0aGUgZGVmYXVsdCBpbnB1dCBkZXZpY2UgaWQgKFdBVkVfTUFQUEVSKSBpZiB0aGUgZGVmYXVsdAotICAvLyBkZXZpY2UgaGFzIGJlZW4gc2VsZWN0ZWQuCi0gIGlmIChkZXZpY2VfaWRfID09IEF1ZGlvTWFuYWdlckJhc2U6OmtEZWZhdWx0RGV2aWNlSWQpIHsKLSAgICAqZGV2aWNlX2luZGV4ID0gV0FWRV9NQVBQRVI7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvLyBHZXQgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIGFuZCBhY3RpdmUgZGV2aWNlcy4KLSAgQXVkaW9EZXZpY2VOYW1lcyBkZXZpY2VfbmFtZXM7Ci0gIGlmICghbWVkaWE6OkdldElucHV0RGV2aWNlTmFtZXNXaW5YUCgmZGV2aWNlX25hbWVzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGRldmljZV9uYW1lcy5lbXB0eSgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvLyBTZWFyY2ggdGhlIGZ1bGwgbGlzdCBvZiBkZXZpY2VzIGFuZCBjb21wYXJlIHdpdGggdGhlIHNwZWNpZmllZAotICAvLyBkZXZpY2UgaWQgd2hpY2ggd2FzIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IuIFN0b3AgY29tcGFyaW5nCi0gIC8vIHdoZW4gYSBtYXRjaCBpcyBmb3VuZCBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGluZGV4LgotICBVSU5UIGluZGV4ID0gMDsKLSAgYm9vbCBmb3VuZF9kZXZpY2UgPSBmYWxzZTsKLSAgQXVkaW9EZXZpY2VOYW1lczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBkZXZpY2VfbmFtZXMuYmVnaW4oKTsKLSAgd2hpbGUgKGl0ICE9IGRldmljZV9uYW1lcy5lbmQoKSkgewotICAgIGlmIChpdC0+dW5pcXVlX2lkLmNvbXBhcmUoZGV2aWNlX2lkXykgPT0gMCkgewotICAgICAgKmRldmljZV9pbmRleCA9IGluZGV4OwotICAgICAgZm91bmRfZGV2aWNlID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICArK2luZGV4OwotICAgICsraXQ7Ci0gIH0KLQotICByZXR1cm4gZm91bmRfZGV2aWNlOwotfQotCi0vLyBXaW5kb3dzIGNhbGxzIHVzIGJhY2sgaW4gdGhpcyBmdW5jdGlvbiB3aGVuIHNvbWUgZXZlbnRzIGhhcHBlbi4gTW9zdCBub3RhYmx5Ci0vLyB3aGVuIGl0IGhhcyBhbiBhdWRpbyBidWZmZXIgd2l0aCByZWNvcmRlZCBkYXRhLgotdm9pZCBQQ01XYXZlSW5BdWRpb0lucHV0U3RyZWFtOjpXYXZlQ2FsbGJhY2soSFdBVkVJTiBod2ksIFVJTlQgbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkRfUFRSIGluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkRfUFRSIHBhcmFtMSwgRFdPUkRfUFRSKSB7Ci0gIFBDTVdhdmVJbkF1ZGlvSW5wdXRTdHJlYW0qIG9iaiA9Ci0gICAgICByZWludGVycHJldF9jYXN0PFBDTVdhdmVJbkF1ZGlvSW5wdXRTdHJlYW0qPihpbnN0YW5jZSk7Ci0KLSAgaWYgKG1zZyA9PSBXSU1fREFUQSkgewotICAgIC8vIFdJTV9ET05FIGluZGljYXRlcyB0aGF0IHRoZSBkcml2ZXIgaXMgZG9uZSB3aXRoIG91ciBidWZmZXIuIFdlIHBhc3MgaXQKLSAgICAvLyB0byB0aGUgY2FsbGJhY2sgYW5kIGNoZWNrIGlmIHdlIG5lZWQgdG8gc3RvcCBwbGF5aW5nLgotICAgIC8vIEl0IHNob3VsZCBiZSBPSyB0byBhc3N1bWUgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlciBpcyB3aGF0IGhhcyBiZWVuCi0gICAgLy8gcmVjb3JkZWQgaW4gdGhlIHNvdW5kY2FyZC4KLSAgICAvLyBUT0RPKGhlbnJpa2EpOiB0aGUgfHZvbHVtZXwgcGFyYW1ldGVyIGlzIGFsd2F5cyBzZXQgdG8gemVybyBzaW5jZSB0aGVyZQotICAgIC8vIGlzIGN1cnJlbnRseSBubyBzdXBwb3J0IGZvciBjb250cm9sbGluZyB0aGUgbWljcm9waG9uZSB2b2x1bWUgbGV2ZWwuCi0gICAgV0FWRUhEUiogYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxXQVZFSERSKj4ocGFyYW0xKTsKLSAgICBvYmotPmNhbGxiYWNrXy0+T25EYXRhKG9iaiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KGJ1ZmZlci0+bHBEYXRhKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+ZHdCeXRlc1JlY29yZGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5kd0J5dGVzUmVjb3JkZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAwLjApOwotCi0gICAgaWYgKG9iai0+c3RhdGVfID09IGtTdGF0ZVN0b3BwaW5nKSB7Ci0gICAgICAvLyBUaGUgbWFpbiB0aHJlYWQgaGFzIGNhbGxlZCBTdG9wKCkgYW5kIGlzIHdhaXRpbmcgdG8gaXNzdWUgd2F2ZU91dFJlc2V0Ci0gICAgICAvLyB3aGljaCB3aWxsIGtpbGwgdGhpcyB0aHJlYWQuIFdlIHNob3VsZCBub3QgZW50ZXIgQXVkaW9Tb3VyY2VDYWxsYmFjawotICAgICAgLy8gY29kZSBhbnltb3JlLgotICAgICAgOjpTZXRFdmVudChvYmotPnN0b3BwZWRfZXZlbnRfKTsKLSAgICB9IGVsc2UgaWYgKG9iai0+c3RhdGVfID09IGtTdGF0ZVN0b3BwZWQpIHsKLSAgICAgIC8vIE5vdCBzdXJlIGlmIGV2ZXIgaGl0IHRoaXMgYnV0IGp1c3QgaW4gY2FzZS4KLSAgICB9IGVsc2UgewotICAgICAgLy8gUXVldWUgdGhlIGZpbmlzaGVkIGJ1ZmZlciBiYWNrIHdpdGggdGhlIGF1ZGlvIGRyaXZlci4gU2luY2Ugd2UgYXJlCi0gICAgICAvLyByZXVzaW5nIHRoZSBzYW1lIGJ1ZmZlcnMgd2UgY2FuIGdldCBhd2F5IHdpdGhvdXQgY2FsbGluZwotICAgICAgLy8gd2F2ZUluUHJlcGFyZUhlYWRlci4KLSAgICAgIG9iai0+UXVldWVOZXh0UGFja2V0KGJ1ZmZlcik7Ci0gICAgfQotICB9IGVsc2UgaWYgKG1zZyA9PSBXSU1fQ0xPU0UpIHsKLSAgICAvLyBXZSBjYW4gYmUgY2xvc2VkIGJlZm9yZSBjYWxsaW5nIFN0YXJ0LCBzbyBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIGEKLSAgICAvLyBudWxsIGNhbGxiYWNrIGF0IHRoaXMgcG9pbnQuCi0gICAgaWYgKG9iai0+Y2FsbGJhY2tfKQotICAgICAgb2JqLT5jYWxsYmFja18tPk9uQ2xvc2Uob2JqKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9hdWRpby93aW4vd2F2ZWluX2lucHV0X3dpbi5oIGIvc3JjL21lZGlhL2F1ZGlvL3dpbi93YXZlaW5faW5wdXRfd2luLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZjFmNTUuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2F1ZGlvL3dpbi93YXZlaW5faW5wdXRfd2luLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9BVURJT19XSU5fV0FWRUlOX0lOUFVUX1dJTl9IXwotI2RlZmluZSBNRURJQV9BVURJT19XSU5fV0FWRUlOX0lOUFVUX1dJTl9IXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPG1tc3lzdGVtLmg+Ci0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCi0jaW5jbHVkZSAiYmFzZS93aW4vc2NvcGVkX2hhbmRsZS5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX2lvLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fcGFyYW1ldGVycy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBBdWRpb01hbmFnZXJXaW47Ci0KLWNsYXNzIFBDTVdhdmVJbkF1ZGlvSW5wdXRTdHJlYW0gOiBwdWJsaWMgQXVkaW9JbnB1dFN0cmVhbSB7Ci0gcHVibGljOgotICAvLyBUaGUgY3RvciB0YWtlcyBhbGwgdGhlIHVzdWFsIHBhcmFtZXRlcnMsIHBsdXMgfG1hbmFnZXJ8IHdoaWNoIGlzIHRoZQotICAvLyB0aGUgYXVkaW8gbWFuYWdlciB3aG8gaXMgY3JlYXRpbmcgdGhpcyBvYmplY3QgYW5kIHxkZXZpY2VfaWR8IHdoaWNoCi0gIC8vIGlzIHByb3ZpZGVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtLgotICBQQ01XYXZlSW5BdWRpb0lucHV0U3RyZWFtKEF1ZGlvTWFuYWdlcldpbiogbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2J1ZmZlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCk7Ci0gIHZpcnR1YWwgflBDTVdhdmVJbkF1ZGlvSW5wdXRTdHJlYW0oKTsKLQotICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBBdWRpb0lucHV0U3RyZWFtLgotICB2aXJ0dWFsIGJvb2wgT3BlbigpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU3RhcnQoQXVkaW9JbnB1dENhbGxiYWNrKiBjYWxsYmFjaykgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTdG9wKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBDbG9zZSgpIE9WRVJSSURFOwotICAvLyBUT0RPKGhlbnJpa2EpOiBBZGQgdm9sdW1lIHN1cHBvcnQgdXNpbmcgdGhlIEF1ZGlvIE1peGVyIEFQSS4KLSAgdmlydHVhbCBkb3VibGUgR2V0TWF4Vm9sdW1lKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgZG91YmxlIEdldFZvbHVtZSgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU2V0QXV0b21hdGljR2FpbkNvbnRyb2woYm9vbCBlbmFibGVkKSBPVkVSUklERTsKLSAgdmlydHVhbCBib29sIEdldEF1dG9tYXRpY0dhaW5Db250cm9sKCkgT1ZFUlJJREU7Ci0KLSBwcml2YXRlOgotICBlbnVtIFN0YXRlIHsKLSAgICBrU3RhdGVFbXB0eSwgICAgICAvLyBJbml0aWFsIHN0YXRlLgotICAgIGtTdGF0ZVJlYWR5LCAgICAgIC8vIERldmljZSBvYnRhaW5lZCBhbmQgcmVhZHkgdG8gcmVjb3JkLgotICAgIGtTdGF0ZVJlY29yZGluZywgIC8vIFJlY29yZGluZyBhdWRpby4KLSAgICBrU3RhdGVTdG9wcGluZywgICAvLyBUcnlpbmcgdG8gc3RvcCwgd2FpdGluZyBmb3IgY2FsbGJhY2sgdG8gZmluaXNoLgotICAgIGtTdGF0ZVN0b3BwZWQsICAgIC8vIFN0b3BwZWQuIERldmljZSB3YXMgcmVzZXQuCi0gICAga1N0YXRlQ2xvc2VkICAgICAgLy8gRGV2aWNlIGhhcyBiZWVuIHJlbGVhc2VkLgotICB9OwotCi0gIC8vIEFsbG93IHVuaXQgdGVzdHMgdG8gcXVlcnkgdGhlIGRldmljZSBJRC4KLSAgZnJpZW5kIGNsYXNzIEF1ZGlvSW5wdXREZXZpY2VUZXN0OwotCi0gIC8vIFdpbmRvd3MgY2FsbHMgdXMgYmFjayB3aXRoIHRoZSByZWNvcmRlZCBhdWRpbyBkYXRhIGhlcmUuIFNlZSBtc2RuCi0gIC8vIGRvY3VtZW50YXRpb24gZm9yICd3YXZlSW5Qcm9jJyBmb3IgZGV0YWlscyBhYm91dCB0aGUgcGFyYW1ldGVycy4KLSAgc3RhdGljIHZvaWQgQ0FMTEJBQ0sgV2F2ZUNhbGxiYWNrKEhXQVZFSU4gaHdpLCBVSU5UIG1zZywgRFdPUkRfUFRSIGluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkRfUFRSIHBhcmFtMSwgRFdPUkRfUFRSIHBhcmFtMik7Ci0KLSAgLy8gSWYgd2luZG93cyByZXBvcnRzIGFuIGVycm9yIHRoaXMgZnVuY3Rpb24gaGFuZGxlcyBpdCBhbmQgcGFzc2VzIGl0IHRvCi0gIC8vIHRoZSBhdHRhY2hlZCBBdWRpb0lucHV0Q2FsbGJhY2s6Ok9uRXJyb3IoKS4KLSAgdm9pZCBIYW5kbGVFcnJvcihNTVJFU1VMVCBlcnJvcik7Ci0KLSAgLy8gQWxsb2NhdGVzIGFuZCBwcmVwYXJlcyB0aGUgbWVtb3J5IHRoYXQgd2lsbCBiZSB1c2VkIGZvciByZWNvcmRpbmcuCi0gIHZvaWQgU2V0dXBCdWZmZXJzKCk7Ci0KLSAgLy8gRGVhbGxvY2F0ZXMgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgaW4gU2V0dXBCdWZmZXJzLgotICB2b2lkIEZyZWVCdWZmZXJzKCk7Ci0KLSAgLy8gU2VuZHMgYSBidWZmZXIgdG8gdGhlIGF1ZGlvIGRyaXZlciBmb3IgcmVjb3JkaW5nLgotICB2b2lkIFF1ZXVlTmV4dFBhY2tldChXQVZFSERSKiBidWZmZXIpOwotCi0gIC8vIENvbnZlcnRzIHRoZSBzdG9yZWQgZGV2aWNlIGlkIHN0cmluZyBpbnRvIGFuIHVuc2lnbmVkIGludGVnZXIgd2hpY2gKLSAgLy8gY2FuIGJlIHVzZWQgYnkgd2F2ZUluT3BlbigpIHRvIG9wZW4gdGhlIHNwZWNpZmllZCBjYXB0dXJlIGRldmljZS4KLSAgYm9vbCBHZXREZXZpY2VJZChVSU5UKiBkZXZpY2VfaW5kZXgpOwotCi0gIC8vIFJlYWRlciBiZXdhcmUuIFZpc3VhbCBDIGhhcyBzdHJvbmdlciBndWFyYW50ZWVzIG9uIHZvbGF0aWxlIHZhcnMgdGhhbgotICAvLyBtb3N0IHBlb3BsZSBleHBlY3QuIEluIGZhY3QsIGl0IGhhcyByZWxlYXNlIHNlbWFudGljcyBvbiB3cml0ZSBhbmQKLSAgLy8gYWNxdWlyZSBzZW1hbnRpY3Mgb24gcmVhZHMuIFNlZSB0aGUgbXNkbiBkb2N1bWVudGF0aW9uLgotICB2b2xhdGlsZSBTdGF0ZSBzdGF0ZV87Ci0KLSAgLy8gVGhlIGF1ZGlvIG1hbmFnZXIgdGhhdCBjcmVhdGVkIHRoaXMgaW5wdXQgc3RyZWFtLiBXZSBub3RpZnkgaXQgd2hlbgotICAvLyB3ZSBjbG9zZSBzbyBpdCBjYW4gcmVsZWFzZSBpdHMgb3duIHJlc291cmNlcy4KLSAgQXVkaW9NYW5hZ2VyV2luKiBtYW5hZ2VyXzsKLQotICAvLyBXZSB1c2UgdGhlIGNhbGxiYWNrIG1vc3RseSB0byBwZXJpb2RpY2FsbHkgZ2l2ZSB0aGUgcmVjb3JkZWQgYXVkaW8gZGF0YS4KLSAgQXVkaW9JbnB1dENhbGxiYWNrKiBjYWxsYmFja187Ci0KLSAgLy8gVGhlIG51bWJlciBvZiBidWZmZXJzIG9mIHNpemUgfGJ1ZmZlcl9zaXplX3wgZWFjaCB0byB1c2UuCi0gIGNvbnN0IGludCBudW1fYnVmZmVyc187Ci0KLSAgLy8gVGhlIHNpemUgaW4gYnl0ZXMgb2YgZWFjaCBhdWRpbyBidWZmZXIuCi0gIHVpbnQzMiBidWZmZXJfc2l6ZV87Ci0KLSAgLy8gQ2hhbm5lbHMsIDEgb3IgMi4KLSAgY29uc3QgaW50IGNoYW5uZWxzXzsKLQotICAvLyBDb250YWlucyB0aGUgdW5pcXVlIG5hbWUgb2YgdGhlIHNlbGVjdGVkIGVuZHBvaW50IGRldmljZS4KLSAgLy8gTm90ZSB0aGF0IEF1ZGlvTWFuYWdlckJhc2U6OmtEZWZhdWx0RGV2aWNlSWQgcmVwcmVzZW50cyB0aGUgZGVmYXVsdAotICAvLyBkZXZpY2Ugcm9sZSBhbmQgaXMgbm90IGEgdmFsaWQgSUQgYXMgc3VjaC4KLSAgc3RkOjpzdHJpbmcgZGV2aWNlX2lkXzsKLQotICAvLyBXaW5kb3dzIG5hdGl2ZSBzdHJ1Y3R1cmUgdG8gZW5jb2RlIHRoZSBmb3JtYXQgcGFyYW1ldGVycy4KLSAgV0FWRUZPUk1BVEVYIGZvcm1hdF87Ci0KLSAgLy8gSGFuZGxlIHRvIHRoZSBpbnN0YW5jZSBvZiB0aGUgd2F2ZSBkZXZpY2UuCi0gIEhXQVZFSU4gd2F2ZWluXzsKLQotICAvLyBQb2ludGVyIHRvIHRoZSBmaXJzdCBhbGxvY2F0ZWQgYXVkaW8gYnVmZmVyLiBUaGlzIG9iamVjdCBvd25zIGl0LgotICBXQVZFSERSKiBidWZmZXJfOwotCi0gIC8vIEFuIGV2ZW50IHRoYXQgaXMgc2lnbmFsZWQgd2hlbiB0aGUgY2FsbGJhY2sgdGhyZWFkIGlzIHJlYWR5IHRvIHN0b3AuCi0gIGJhc2U6Ondpbjo6U2NvcGVkSGFuZGxlIHN0b3BwZWRfZXZlbnRfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihQQ01XYXZlSW5BdWRpb0lucHV0U3RyZWFtKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0FVRElPX1dJTl9XQVZFSU5fSU5QVVRfV0lOX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vd2luL3dhdmVvdXRfb3V0cHV0X3dpbi5jYyBiL3NyYy9tZWRpYS9hdWRpby93aW4vd2F2ZW91dF9vdXRwdXRfd2luLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMThiMmZhLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9hdWRpby93aW4vd2F2ZW91dF9vdXRwdXRfd2luLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDIyICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9hdWRpby93aW4vd2F2ZW91dF9vdXRwdXRfd2luLmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8bW1zeXN0ZW0uaD4KLSNwcmFnbWEgY29tbWVudChsaWIsICJ3aW5tbS5saWIiKQotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX2lvLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fdXRpbC5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3dpbi9hdWRpb19tYW5hZ2VyX3dpbi5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBTb21lIGdlbmVyYWwgdGhvdWdodHMgYWJvdXQgdGhlIHdhdmVPdXQgQVBJIHdoaWNoIGlzIGJhZGx5IGRvY3VtZW50ZWQgOgotLy8gLSBXZSB1c2UgQ0FMTEJBQ0tfRVZFTlQgbW9kZSBpbiB3aGljaCBYUCBzaWduYWxzIGV2ZW50cyBzdWNoIGFzIGJ1ZmZlcgotLy8gICByZWxlYXNlcy4KLS8vIC0gV2UgdXNlIFJlZ2lzdGVyV2FpdEZvclNpbmdsZU9iamVjdCgpIHNvIG9uZSBvZiB0aHJlYWRzIGluIHRocmVhZCBwb29sCi0vLyAgIGF1dG9tYXRpY2FsbHkgY2FsbHMgb3VyIGNhbGxiYWNrIHRoYXQgZmVlZHMgbW9yZSBkYXRhIHRvIFdpbmRvd3MuCi0vLyAtIFdpbmRvd3MgZG9lcyBub3QgcHJvdmlkZSBhIHdheSB0byBxdWVyeSBpZiB0aGUgZGV2aWNlIGlzIHBsYXlpbmcgb3IgcGF1c2VkCi0vLyAgIHRodXMgaXQgZm9yY2VzIHlvdSB0byBtYWludGFpbiBzdGF0ZSwgd2hpY2ggbmF0dXJhbGx5IGlzIG5vdCBleGFjdGx5Ci0vLyAgIHN5bmNocm9uaXplZCB0byB0aGUgYWN0dWFsIGRldmljZSBzdGF0ZS4KLQotLy8gU2l4dHkgZm91ciBNQiBpcyB0aGUgbWF4aW11bSBidWZmZXIgc2l6ZSBwZXIgQXVkaW9PdXRwdXRTdHJlYW0uCi1zdGF0aWMgY29uc3QgdWludDMyIGtNYXhPcGVuQnVmZmVyU2l6ZSA9IDEwMjQgKiAxMDI0ICogNjQ7Ci0KLS8vIFNlZSBBbHNvCi0vLyBodHRwOi8vd3d3LnRoeC5jb20vY29uc3VtZXIvaG9tZS1lbnRlcnRhaW5tZW50L2hvbWUtdGhlYXRlci9zdXJyb3VuZC1zb3VuZC1zcGVha2VyLXNldC11cC8KLS8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3Vycm91bmRfc291bmQKLQotc3RhdGljIGNvbnN0IGludCBrTWF4Q2hhbm5lbHNUb01hc2sgPSA4Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBrQ2hhbm5lbHNUb01hc2tba01heENoYW5uZWxzVG9NYXNrICsgMV0gPSB7Ci0gIDAsCi0gIC8vIDEgPSBNb25vCi0gIFNQRUFLRVJfRlJPTlRfQ0VOVEVSLAotICAvLyAyID0gU3RlcmVvCi0gIFNQRUFLRVJfRlJPTlRfTEVGVCAgfCBTUEVBS0VSX0ZST05UX1JJR0hULAotICAvLyAzID0gU3RlcmVvICsgQ2VudGVyCi0gIFNQRUFLRVJfRlJPTlRfTEVGVCAgfCBTUEVBS0VSX0ZST05UX1JJR0hUIHwgU1BFQUtFUl9GUk9OVF9DRU5URVIsCi0gIC8vIDQgPSBRdWFkCi0gIFNQRUFLRVJfRlJPTlRfTEVGVCAgfCBTUEVBS0VSX0ZST05UX1JJR0hUIHwKLSAgU1BFQUtFUl9CQUNLX0xFRlQgfCBTUEVBS0VSX0JBQ0tfUklHSFQsCi0gIC8vIDUgPSA1LjAKLSAgU1BFQUtFUl9GUk9OVF9MRUZUICB8IFNQRUFLRVJfRlJPTlRfUklHSFQgfCBTUEVBS0VSX0ZST05UX0NFTlRFUiB8Ci0gIFNQRUFLRVJfQkFDS19MRUZUIHwgU1BFQUtFUl9CQUNLX1JJR0hULAotICAvLyA2ID0gNS4xCi0gIFNQRUFLRVJfRlJPTlRfTEVGVCAgfCBTUEVBS0VSX0ZST05UX1JJR0hUIHwKLSAgU1BFQUtFUl9GUk9OVF9DRU5URVIgfCBTUEVBS0VSX0xPV19GUkVRVUVOQ1kgfAotICBTUEVBS0VSX0JBQ0tfTEVGVCB8IFNQRUFLRVJfQkFDS19SSUdIVCwKLSAgLy8gNyA9IDYuMQotICBTUEVBS0VSX0ZST05UX0xFRlQgIHwgU1BFQUtFUl9GUk9OVF9SSUdIVCB8Ci0gIFNQRUFLRVJfRlJPTlRfQ0VOVEVSIHwgU1BFQUtFUl9MT1dfRlJFUVVFTkNZIHwKLSAgU1BFQUtFUl9CQUNLX0xFRlQgfCBTUEVBS0VSX0JBQ0tfUklHSFQgfAotICBTUEVBS0VSX0JBQ0tfQ0VOVEVSLAotICAvLyA4ID0gNy4xCi0gIFNQRUFLRVJfRlJPTlRfTEVGVCAgfCBTUEVBS0VSX0ZST05UX1JJR0hUIHwKLSAgU1BFQUtFUl9GUk9OVF9DRU5URVIgfCBTUEVBS0VSX0xPV19GUkVRVUVOQ1kgfAotICBTUEVBS0VSX0JBQ0tfTEVGVCB8IFNQRUFLRVJfQkFDS19SSUdIVCB8Ci0gIFNQRUFLRVJfU0lERV9MRUZUIHwgU1BFQUtFUl9TSURFX1JJR0hUCi0gIC8vIFRPRE8oZmJhcmNoYXJkKTogQWRkIGFkZGl0aW9uYWwgbWFza3MgZm9yIDcuMiBhbmQgYmV5b25kLgotfTsKLQotaW5saW5lIHNpemVfdCBQQ01XYXZlT3V0QXVkaW9PdXRwdXRTdHJlYW06OkJ1ZmZlclNpemUoKSBjb25zdCB7Ci0gIC8vIFJvdW5kIHNpemUgb2YgYnVmZmVyIHVwIHRvIHRoZSBuZWFyZXN0IDE2IGJ5dGVzLgotICByZXR1cm4gKHNpemVvZihXQVZFSERSKSArIGJ1ZmZlcl9zaXplXyArIDE1dSkgJiBzdGF0aWNfY2FzdDxzaXplX3Q+KH4xNSk7Ci19Ci0KLWlubGluZSBXQVZFSERSKiBQQ01XYXZlT3V0QXVkaW9PdXRwdXRTdHJlYW06OkdldEJ1ZmZlcihpbnQgbikgY29uc3QgewotICBEQ0hFQ0tfR0UobiwgMCk7Ci0gIERDSEVDS19MVChuLCBudW1fYnVmZmVyc18pOwotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxXQVZFSERSKj4oJmJ1ZmZlcnNfW24gKiBCdWZmZXJTaXplKCldKTsKLX0KLQotUENNV2F2ZU91dEF1ZGlvT3V0cHV0U3RyZWFtOjpQQ01XYXZlT3V0QXVkaW9PdXRwdXRTdHJlYW0oCi0gICAgQXVkaW9NYW5hZ2VyV2luKiBtYW5hZ2VyLCBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywgaW50IG51bV9idWZmZXJzLAotICAgIFVJTlQgZGV2aWNlX2lkKQotICAgIDogc3RhdGVfKFBDTUFfQlJBTkRfTkVXKSwKLSAgICAgIG1hbmFnZXJfKG1hbmFnZXIpLAotICAgICAgZGV2aWNlX2lkXyhkZXZpY2VfaWQpLAotICAgICAgd2F2ZW91dF8oTlVMTCksCi0gICAgICBjYWxsYmFja18oTlVMTCksCi0gICAgICBudW1fYnVmZmVyc18obnVtX2J1ZmZlcnMpLAotICAgICAgYnVmZmVyX3NpemVfKHBhcmFtcy5HZXRCeXRlc1BlckJ1ZmZlcigpKSwKLSAgICAgIHZvbHVtZV8oMSksCi0gICAgICBjaGFubmVsc18ocGFyYW1zLmNoYW5uZWxzKCkpLAotICAgICAgcGVuZGluZ19ieXRlc18oMCksCi0gICAgICB3YWl0aW5nX2hhbmRsZV8oTlVMTCksCi0gICAgICBhdWRpb19idXNfKEF1ZGlvQnVzOjpDcmVhdGUocGFyYW1zKSkgewotICBmb3JtYXRfLkZvcm1hdC53Rm9ybWF0VGFnID0gV0FWRV9GT1JNQVRfRVhURU5TSUJMRTsKLSAgZm9ybWF0Xy5Gb3JtYXQubkNoYW5uZWxzID0gcGFyYW1zLmNoYW5uZWxzKCk7Ci0gIGZvcm1hdF8uRm9ybWF0Lm5TYW1wbGVzUGVyU2VjID0gcGFyYW1zLnNhbXBsZV9yYXRlKCk7Ci0gIGZvcm1hdF8uRm9ybWF0LndCaXRzUGVyU2FtcGxlID0gcGFyYW1zLmJpdHNfcGVyX3NhbXBsZSgpOwotICBmb3JtYXRfLkZvcm1hdC5jYlNpemUgPSBzaXplb2YoZm9ybWF0XykgLSBzaXplb2YoV0FWRUZPUk1BVEVYKTsKLSAgLy8gVGhlIG5leHQgYXJlIGNvbXB1dGVkIGZyb20gYWJvdmUuCi0gIGZvcm1hdF8uRm9ybWF0Lm5CbG9ja0FsaWduID0gKGZvcm1hdF8uRm9ybWF0Lm5DaGFubmVscyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF8uRm9ybWF0LndCaXRzUGVyU2FtcGxlKSAvIDg7Ci0gIGZvcm1hdF8uRm9ybWF0Lm5BdmdCeXRlc1BlclNlYyA9IGZvcm1hdF8uRm9ybWF0Lm5CbG9ja0FsaWduICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0Xy5Gb3JtYXQublNhbXBsZXNQZXJTZWM7Ci0gIGlmIChwYXJhbXMuY2hhbm5lbHMoKSA+IGtNYXhDaGFubmVsc1RvTWFzaykgewotICAgIGZvcm1hdF8uZHdDaGFubmVsTWFzayA9IGtDaGFubmVsc1RvTWFza1trTWF4Q2hhbm5lbHNUb01hc2tdOwotICB9IGVsc2UgewotICAgIGZvcm1hdF8uZHdDaGFubmVsTWFzayA9IGtDaGFubmVsc1RvTWFza1twYXJhbXMuY2hhbm5lbHMoKV07Ci0gIH0KLSAgZm9ybWF0Xy5TdWJGb3JtYXQgPSBLU0RBVEFGT1JNQVRfU1VCVFlQRV9QQ007Ci0gIGZvcm1hdF8uU2FtcGxlcy53VmFsaWRCaXRzUGVyU2FtcGxlID0gcGFyYW1zLmJpdHNfcGVyX3NhbXBsZSgpOwotfQotCi1QQ01XYXZlT3V0QXVkaW9PdXRwdXRTdHJlYW06On5QQ01XYXZlT3V0QXVkaW9PdXRwdXRTdHJlYW0oKSB7Ci0gIERDSEVDSyhOVUxMID09IHdhdmVvdXRfKTsKLX0KLQotYm9vbCBQQ01XYXZlT3V0QXVkaW9PdXRwdXRTdHJlYW06Ok9wZW4oKSB7Ci0gIGlmIChzdGF0ZV8gIT0gUENNQV9CUkFORF9ORVcpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoQnVmZmVyU2l6ZSgpICogbnVtX2J1ZmZlcnNfID4ga01heE9wZW5CdWZmZXJTaXplKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKG51bV9idWZmZXJzXyA8IDIgfHwgbnVtX2J1ZmZlcnNfID4gNSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gQ3JlYXRlIGJ1ZmZlciBldmVudC4KLSAgYnVmZmVyX2V2ZW50Xy5TZXQoOjpDcmVhdGVFdmVudChOVUxMLCAgICAvLyBTZWN1cml0eSBhdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCAgIC8vIEl0IHdpbGwgYXV0by1yZXNldC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgICAvLyBJbml0aWFsIHN0YXRlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKTsgIC8vIE5vIG5hbWUuCi0gIGlmICghYnVmZmVyX2V2ZW50Xy5HZXQoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gT3BlbiB0aGUgZGV2aWNlLgotICAvLyBXZSdsbCBiZSBnZXR0aW5nIGJ1ZmZlcl9ldmVudF8gZXZlbnRzIHdoZW4gaXQncyB0aW1lIHRvIHJlZmlsbCB0aGUgYnVmZmVyLgotICBNTVJFU1VMVCByZXN1bHQgPSA6OndhdmVPdXRPcGVuKAotICAgICAgJndhdmVvdXRfLAotICAgICAgZGV2aWNlX2lkXywKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TFBDV0FWRUZPUk1BVEVYPigmZm9ybWF0XyksCi0gICAgICByZWludGVycHJldF9jYXN0PERXT1JEX1BUUj4oYnVmZmVyX2V2ZW50Xy5HZXQoKSksCi0gICAgICBOVUxMLAotICAgICAgQ0FMTEJBQ0tfRVZFTlQpOwotICBpZiAocmVzdWx0ICE9IE1NU1lTRVJSX05PRVJST1IpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIFNldHVwQnVmZmVycygpOwotICBzdGF0ZV8gPSBQQ01BX1JFQURZOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBQQ01XYXZlT3V0QXVkaW9PdXRwdXRTdHJlYW06OlNldHVwQnVmZmVycygpIHsKLSAgYnVmZmVyc18ucmVzZXQobmV3IGNoYXJbQnVmZmVyU2l6ZSgpICogbnVtX2J1ZmZlcnNfXSk7Ci0gIGZvciAoaW50IGl4ID0gMDsgaXggIT0gbnVtX2J1ZmZlcnNfOyArK2l4KSB7Ci0gICAgV0FWRUhEUiogYnVmZmVyID0gR2V0QnVmZmVyKGl4KTsKLSAgICBidWZmZXItPmxwRGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGJ1ZmZlcikgKyBzaXplb2YoV0FWRUhEUik7Ci0gICAgYnVmZmVyLT5kd0J1ZmZlckxlbmd0aCA9IGJ1ZmZlcl9zaXplXzsKLSAgICBidWZmZXItPmR3Qnl0ZXNSZWNvcmRlZCA9IDA7Ci0gICAgYnVmZmVyLT5kd0ZsYWdzID0gV0hEUl9ET05FOwotICAgIGJ1ZmZlci0+ZHdMb29wcyA9IDA7Ci0gICAgLy8gVGVsbCB3aW5kb3dzIHNvdW5kIGRyaXZlcnMgYWJvdXQgb3VyIGJ1ZmZlcnMuIE5vdCBkb2N1bWVudGVkIHdoYXQKLSAgICAvLyB0aGlzIGRvZXMgYnV0IHdlIGNhbiBndWVzcyB0aGF0IGNhdXNlcyB0aGUgT1MgdG8ga2VlcCBhIHJlZmVyZW5jZSB0bwotICAgIC8vIHRoZSBtZW1vcnkgcGFnZXMgc28gdGhlIGRyaXZlciBjYW4gdXNlIHRoZW0gd2l0aG91dCB3b3JyaWVzLgotICAgIDo6d2F2ZU91dFByZXBhcmVIZWFkZXIod2F2ZW91dF8sIGJ1ZmZlciwgc2l6ZW9mKFdBVkVIRFIpKTsKLSAgfQotfQotCi12b2lkIFBDTVdhdmVPdXRBdWRpb091dHB1dFN0cmVhbTo6RnJlZUJ1ZmZlcnMoKSB7Ci0gIGZvciAoaW50IGl4ID0gMDsgaXggIT0gbnVtX2J1ZmZlcnNfOyArK2l4KSB7Ci0gICAgOjp3YXZlT3V0VW5wcmVwYXJlSGVhZGVyKHdhdmVvdXRfLCBHZXRCdWZmZXIoaXgpLCBzaXplb2YoV0FWRUhEUikpOwotICB9Ci0gIGJ1ZmZlcnNfLnJlc2V0KE5VTEwpOwotfQotCi0vLyBJbml0aWFsbHkgd2UgYXNrIHRoZSBzb3VyY2UgdG8gZmlsbCB1cCBhbGwgYXVkaW8gYnVmZmVycy4gSWYgd2UgZG9uJ3QgZG8KLS8vIHRoaXMgdGhlbiB3ZSB3b3VsZCBhbHdheXMgZ2V0IHRoZSBkcml2ZXIgY2FsbGJhY2sgd2hlbiBpdCBpcyBhYm91dCB0byBydW4KLS8vIHNhbXBsZXMgYW5kIHRoYXQgd291bGQgbGVhdmUgdG9vIGxpdHRsZSB0aW1lIHRvIHJlYWN0Lgotdm9pZCBQQ01XYXZlT3V0QXVkaW9PdXRwdXRTdHJlYW06OlN0YXJ0KEF1ZGlvU291cmNlQ2FsbGJhY2sqIGNhbGxiYWNrKSB7Ci0gIGlmIChzdGF0ZV8gIT0gUENNQV9SRUFEWSkKLSAgICByZXR1cm47Ci0gIGNhbGxiYWNrXyA9IGNhbGxiYWNrOwotCi0gIC8vIFJlc2V0IGJ1ZmZlciBldmVudCwgaXQgY2FuIGJlIGxlZnQgaW4gdGhlIGFyYml0cmFyeSBzdGF0ZSBpZiB3ZQotICAvLyBwcmV2aW91c2x5IHN0b3BwZWQgdGhlIHN0cmVhbS4gQ2FuIGhhcHBlbiBiZWNhdXNlIHdlIGFyZSBzdG9wcGluZwotICAvLyBjYWxsYmFja3MgYmVmb3JlIHN0b3BwaW5nIHBsYXliYWNrIGl0c2VsZi4KLSAgaWYgKCE6OlJlc2V0RXZlbnQoYnVmZmVyX2V2ZW50Xy5HZXQoKSkpIHsKLSAgICBIYW5kbGVFcnJvcihNTVNZU0VSUl9FUlJPUik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gU3RhcnQgd2F0Y2hpbmcgZm9yIGJ1ZmZlciBldmVudHMuCi0gIGlmICghOjpSZWdpc3RlcldhaXRGb3JTaW5nbGVPYmplY3QoJndhaXRpbmdfaGFuZGxlXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfZXZlbnRfLkdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCdWZmZXJDYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORklOSVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdUX0VYRUNVVEVERUZBVUxUKSkgewotICAgIEhhbmRsZUVycm9yKE1NU1lTRVJSX0VSUk9SKTsKLSAgICB3YWl0aW5nX2hhbmRsZV8gPSBOVUxMOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0YXRlXyA9IFBDTUFfUExBWUlORzsKLQotICAvLyBRdWV1ZSB0aGUgYnVmZmVycy4KLSAgcGVuZGluZ19ieXRlc18gPSAwOwotICBmb3IgKGludCBpeCA9IDA7IGl4ICE9IG51bV9idWZmZXJzXzsgKytpeCkgewotICAgIFdBVkVIRFIqIGJ1ZmZlciA9IEdldEJ1ZmZlcihpeCk7Ci0gICAgLy8gQ2FsbGVyIHdhaXRzIGZvciAxc3QgcGFja2V0IHRvIGJlY29tZSBhdmFpbGFibGUsIGJ1dCBub3QgZm9yIG90aGVycywKLSAgICAvLyBzbyB3ZSB3YWl0IGZvciB0aGVtIGhlcmUuCi0gICAgaWYgKGl4ICE9IDApCi0gICAgICBjYWxsYmFja18tPldhaXRUaWxsRGF0YVJlYWR5KCk7Ci0gICAgUXVldWVOZXh0UGFja2V0KGJ1ZmZlcik7ICAvLyBSZWFkIG1vcmUgZGF0YS4KLSAgICBwZW5kaW5nX2J5dGVzXyArPSBidWZmZXItPmR3QnVmZmVyTGVuZ3RoOwotICB9Ci0KLSAgLy8gRnJvbSBub3cgb24gfHBlbmRpbmdfYnl0ZXNffCB3b3VsZCBiZSBhY2Nlc3NlZCBieSBjYWxsYmFjayB0aHJlYWQuCi0gIC8vIE1vc3QgbGlrZWx5IHdhdmVPdXRQYXVzZSgpIG9yIHdhdmVPdXRSZXN0YXJ0KCkgaGFzIGl0cyBvd24gbWVtb3J5IGJhcnJpZXIsCi0gIC8vIGJ1dCBpc3N1aW5nIG91ciBvd24gaXMgc2FmZXIuCi0gIE1lbW9yeUJhcnJpZXIoKTsKLQotICBNTVJFU1VMVCByZXN1bHQgPSA6OndhdmVPdXRQYXVzZSh3YXZlb3V0Xyk7Ci0gIGlmIChyZXN1bHQgIT0gTU1TWVNFUlJfTk9FUlJPUikgewotICAgIEhhbmRsZUVycm9yKHJlc3VsdCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gU2VuZCB0aGUgYnVmZmVycyB0byB0aGUgYXVkaW8gZHJpdmVyLiBOb3RlIHRoYXQgdGhlIGRldmljZSBpcyBwYXVzZWQKLSAgLy8gc28gd2UgYXZvaWQgZW50ZXJpbmcgdGhlIGNhbGxiYWNrIG1ldGhvZCB3aGlsZSBzdGlsbCBoZXJlLgotICBmb3IgKGludCBpeCA9IDA7IGl4ICE9IG51bV9idWZmZXJzXzsgKytpeCkgewotICAgIHJlc3VsdCA9IDo6d2F2ZU91dFdyaXRlKHdhdmVvdXRfLCBHZXRCdWZmZXIoaXgpLCBzaXplb2YoV0FWRUhEUikpOwotICAgIGlmIChyZXN1bHQgIT0gTU1TWVNFUlJfTk9FUlJPUikgewotICAgICAgSGFuZGxlRXJyb3IocmVzdWx0KTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICByZXN1bHQgPSA6OndhdmVPdXRSZXN0YXJ0KHdhdmVvdXRfKTsKLSAgaWYgKHJlc3VsdCAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7Ci0gICAgSGFuZGxlRXJyb3IocmVzdWx0KTsKLSAgICByZXR1cm47Ci0gIH0KLX0KLQotLy8gU3RvcHBpbmcgaXMgdHJpY2t5IGlmIHdlIHdhbnQgaXQgYmUgZmFzdC4KLS8vIEZvciBub3cganVzdCBkbyBpdCBzeW5jaHJvbm91c2x5IGFuZCBhdm9pZCBhbGwgdGhlIGNvbXBsZXhpdGllcy4KLS8vIFRPRE8oZW5hbCk6IGlmIHdlIHdhbnQgZmFzdGVyIFN0b3AoKSB3ZSBjYW4gY3JlYXRlIHNpbmdsZXRvbiB0aGF0IGtlZXBzIHRyYWNrCi0vLyAgICAgICAgICAgICBvZiBhbGwgY3VycmVudGx5IHBsYXlpbmcgc3RyZWFtcy4gVGhlbiB5b3UgZG9uJ3QgaGF2ZSB0byB3YWl0Ci0vLyAgICAgICAgICAgICB0aWxsIGFsbCBjYWxsYmFja3MgYXJlIGNvbXBsZXRlZC4gT2YgY291cnNlIGFjY2VzcyB0byBzaW5nbGV0b24KLS8vICAgICAgICAgICAgIHNob3VsZCBiZSB1bmRlciBpdHMgb3duIGxvY2ssIGFuZCBjaGVja2luZyB0aGUgbGl2ZW5lc3MgYW5kCi0vLyAgICAgICAgICAgICBhY3F1aXJpbmcgdGhlIGxvY2sgb24gc3RyZWFtIHNob3VsZCBiZSBkb25lIGF0b21pY2FsbHkuCi12b2lkIFBDTVdhdmVPdXRBdWRpb091dHB1dFN0cmVhbTo6U3RvcCgpIHsKLSAgaWYgKHN0YXRlXyAhPSBQQ01BX1BMQVlJTkcpCi0gICAgcmV0dXJuOwotICBzdGF0ZV8gPSBQQ01BX1NUT1BQSU5HOwotICBNZW1vcnlCYXJyaWVyKCk7Ci0KLSAgLy8gU3RvcCB3YXRjaGluZyBmb3IgYnVmZmVyIGV2ZW50LCB3YWl0IHRpbGwgYWxsIHRoZSBjYWxsYmFja3MgYXJlIGNvbXBsZXRlLgotICAvLyBTaG91bGQgYmUgZG9uZSBiZWZvcmUgOjp3YXZlT3V0UmVzZXQoKSBjYWxsIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uIHdoZW4KLSAgLy8gY2FsbGJhY2sgdGhhdCBpcyBjdXJyZW50bHkgYWN0aXZlIGFuZCBhbHJlYWR5IGNoZWNrZWQgdGhhdCBzdHJlYW0gaXMgc3RpbGwKLSAgLy8gYmVpbmcgcGxheWVkIGNhbGxzIDo6d2F2ZU91dFdyaXRlKCkgYWZ0ZXIgOjp3YXZlT3V0UmVzZXQoKSByZXR1cm5zLCBsYXRlcgotICAvLyBjYXVzaW5nIDo6d2F2ZU91dENsb3NlKCkgdG8gZmFpbCB3aXRoIFdBVkVSUl9TVElMTFBMQVlJTkcuCi0gIC8vIFRPRE8oZW5hbCk6IHRoYXQgZGVsYXlzIGFjdHVhbCBzdG9wcGluZyBvZiBwbGF5YmFjay4gQWx0ZXJuYXRpdmUgY2FuIGJlCi0gIC8vICAgICAgICAgICAgIHRvIGNhbGwgOjp3YXZlT3V0UmVzZXQoKSB0d2ljZSwgb25jZSBiZWZvcmUKLSAgLy8gICAgICAgICAgICAgOjpVbnJlZ2lzdGVyV2FpdEV4KCkgYW5kIG9uY2UgYWZ0ZXIuCi0gIGlmICh3YWl0aW5nX2hhbmRsZV8pIHsKLSAgICBpZiAoITo6VW5yZWdpc3RlcldhaXRFeCh3YWl0aW5nX2hhbmRsZV8sIElOVkFMSURfSEFORExFX1ZBTFVFKSkgewotICAgICAgc3RhdGVfID0gUENNQV9QTEFZSU5HOwotICAgICAgSGFuZGxlRXJyb3IoTU1TWVNFUlJfRVJST1IpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB3YWl0aW5nX2hhbmRsZV8gPSBOVUxMOwotICB9Ci0KLSAgLy8gU3RvcCBwbGF5YmFjay4KLSAgTU1SRVNVTFQgcmVzID0gOjp3YXZlT3V0UmVzZXQod2F2ZW91dF8pOwotICBpZiAocmVzICE9IE1NU1lTRVJSX05PRVJST1IpIHsKLSAgICBzdGF0ZV8gPSBQQ01BX1BMQVlJTkc7Ci0gICAgSGFuZGxlRXJyb3IocmVzKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBXYWl0IGZvciBsb2NrIHRvIGVuc3VyZSBhbGwgb3V0c3RhbmRpbmcgY2FsbGJhY2tzIGhhdmUgY29tcGxldGVkLgotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotCi0gIC8vIHdhdmVPdXRSZXNldCgpIGxlYXZlcyBidWZmZXJzIGluIHRoZSB1bnByZWRpY3RhYmxlIHN0YXRlLCBjYXVzaW5nCi0gIC8vIHByb2JsZW1zIGlmIHdlIHdhbnQgdG8gY2xvc2UsIHJlbGVhc2UsIG9yIHJldXNlIHRoZW0uIEZpeCB0aGUgc3RhdGVzLgotICBmb3IgKGludCBpeCA9IDA7IGl4ICE9IG51bV9idWZmZXJzXzsgKytpeCkgewotICAgIEdldEJ1ZmZlcihpeCktPmR3RmxhZ3MgPSBXSERSX1BSRVBBUkVEOwotICB9Ci0KLSAgLy8gRG9uJ3QgdXNlIGNhbGxiYWNrIGFmdGVyIFN0b3AoKS4KLSAgY2FsbGJhY2tfID0gTlVMTDsKLQotICBzdGF0ZV8gPSBQQ01BX1JFQURZOwotfQotCi0vLyBXZSBjYW4gQ2xvc2UgaW4gYW55IHN0YXRlIGV4Y2VwdCB0aGF0IHRyeWluZyB0byBjbG9zZSBhIHN0cmVhbSB0aGF0IGlzCi0vLyBwbGF5aW5nIFdpbmRvd3MgZ2VuZXJhdGVzIGFuIGVycm9yLiBXZSBjYW5ub3QgcHJvcGFnYXRlIGl0IHRvIHRoZSBzb3VyY2UsCi0vLyBhcyBjYWxsYmFja18gaXMgc2V0IHRvIE5VTEwuIEp1c3QgcHJpbnQgaXQgYW5kIGhvcGUgc29tZWJvZHkgc29tZWhvdwotLy8gd2lsbCBmaW5kIGl0Li4uCi12b2lkIFBDTVdhdmVPdXRBdWRpb091dHB1dFN0cmVhbTo6Q2xvc2UoKSB7Ci0gIFN0b3AoKTsgIC8vIEp1c3QgdG8gYmUgc3VyZS4gTm8tb3AgaWYgbm90IHBsYXlpbmcuCi0gIGlmICh3YXZlb3V0XykgewotICAgIE1NUkVTVUxUIHJlc3VsdCA9IDo6d2F2ZU91dENsb3NlKHdhdmVvdXRfKTsKLSAgICAvLyBJZiA6OndhdmVPdXRDbG9zZSgpIGZhaWxzIHdlIGNhbm5vdCBqdXN0IGRlbGV0ZSB0aGUgc3RyZWFtLCBjYWxsYmFjawotICAgIC8vIG1heSB0cnkgdG8gYWNjZXNzIGl0IGFuZCB3b3VsZCBjcmFzaC4gQmV0dGVyIHRvIGxlYWsgdGhlIHN0cmVhbS4KLSAgICBpZiAocmVzdWx0ICE9IE1NU1lTRVJSX05PRVJST1IpIHsKLSAgICAgIEhhbmRsZUVycm9yKHJlc3VsdCk7Ci0gICAgICBzdGF0ZV8gPSBQQ01BX1BMQVlJTkc7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHN0YXRlXyA9IFBDTUFfQ0xPU0VEOwotICAgIHdhdmVvdXRfID0gTlVMTDsKLSAgICBGcmVlQnVmZmVycygpOwotICB9Ci0gIC8vIFRlbGwgdGhlIGF1ZGlvIG1hbmFnZXIgdGhhdCB3ZSBoYXZlIGJlZW4gcmVsZWFzZWQuIFRoaXMgY2FuIHJlc3VsdCBpbgotICAvLyB0aGUgbWFuYWdlciBkZXN0cm95aW5nIHVzIGluLXBsYWNlIHNvIHRoaXMgbmVlZHMgdG8gYmUgdGhlIGxhc3QgdGhpbmcKLSAgLy8gd2UgZG8gb24gdGhpcyBmdW5jdGlvbi4KLSAgbWFuYWdlcl8tPlJlbGVhc2VPdXRwdXRTdHJlYW0odGhpcyk7Ci19Ci0KLXZvaWQgUENNV2F2ZU91dEF1ZGlvT3V0cHV0U3RyZWFtOjpTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgewotICBpZiAoIXdhdmVvdXRfKQotICAgIHJldHVybjsKLSAgdm9sdW1lXyA9IHN0YXRpY19jYXN0PGZsb2F0Pih2b2x1bWUpOwotfQotCi12b2lkIFBDTVdhdmVPdXRBdWRpb091dHB1dFN0cmVhbTo6R2V0Vm9sdW1lKGRvdWJsZSogdm9sdW1lKSB7Ci0gIGlmICghd2F2ZW91dF8pCi0gICAgcmV0dXJuOwotICAqdm9sdW1lID0gdm9sdW1lXzsKLX0KLQotdm9pZCBQQ01XYXZlT3V0QXVkaW9PdXRwdXRTdHJlYW06OkhhbmRsZUVycm9yKE1NUkVTVUxUIGVycm9yKSB7Ci0gIERMT0coV0FSTklORykgPDwgIlBDTVdhdmVPdXRBdWRpbyBlcnJvciAiIDw8IGVycm9yOwotICBpZiAoY2FsbGJhY2tfKQotICAgIGNhbGxiYWNrXy0+T25FcnJvcih0aGlzLCBlcnJvcik7Ci19Ci0KLXZvaWQgUENNV2F2ZU91dEF1ZGlvT3V0cHV0U3RyZWFtOjpRdWV1ZU5leHRQYWNrZXQoV0FWRUhEUiAqYnVmZmVyKSB7Ci0gIERDSEVDS19FUShjaGFubmVsc18sIGZvcm1hdF8uRm9ybWF0Lm5DaGFubmVscyk7Ci0gIC8vIENhbGwgdGhlIHNvdXJjZSB3aGljaCB3aWxsIGZpbGwgb3VyIGJ1ZmZlciB3aXRoIHBsZWFzYW50IHNvdW5kcyBhbmQKLSAgLy8gcmV0dXJuIHRvIHVzIGhvdyBtYW55IGJ5dGVzIHdlcmUgdXNlZC4KLSAgLy8gVE9ETyhmYmFyY2hhcmQpOiBIYW5kbGUgdXNlZCAwIGJ5IHF1ZXVlaW5nIG1vcmUuCi0KLSAgLy8gSEFDSzogWWllbGQgaWYgUmVhZCgpIGlzIGNhbGxlZCB0b28gb2Z0ZW4uICBPbiBvbGRlciBwbGF0Zm9ybXMgd2hpY2ggYXJlCi0gIC8vIHN0aWxsIHVzaW5nIHRoZSBXYXZlT3V0IGJhY2tlbmQsIHdlIHJ1biBpbnRvIHN5bmNocm9uaXphdGlvbiBpc3N1ZXMgd2hlcmUKLSAgLy8gdGhlIHJlbmRlcmVyIGhhcyBub3QgZmluaXNoZWQgZmlsbGluZyB0aGUgc2hhcmVkIG1lbW9yeSB3aGVuIFJlYWQoKSBpcwotICAvLyBjYWxsZWQuICBSZWFkaW5nIHRvbyBlYXJseSB3aWxsIGxlYWQgdG8gY2xpY2tzIGFuZCBwb3BzLiAgU2VlIGlzc3VlczoKLSAgLy8gaHR0cDovL2NyYnVnLmNvbS8xNjEzMDcgYW5kIGh0dHA6Ly9jcmJ1Zy5jb20vNjEwMjIKLSAgY2FsbGJhY2tfLT5XYWl0VGlsbERhdGFSZWFkeSgpOwotCi0gIC8vIFRPRE8oc2VyZ2V5dSk6IFNwZWNpZnkgY29ycmVjdCBoYXJkd2FyZSBkZWxheSBmb3IgQXVkaW9CdWZmZXJzU3RhdGUuCi0gIGludCBmcmFtZXNfZmlsbGVkID0gY2FsbGJhY2tfLT5Pbk1vcmVEYXRhKAotICAgICAgYXVkaW9fYnVzXy5nZXQoKSwgQXVkaW9CdWZmZXJzU3RhdGUocGVuZGluZ19ieXRlc18sIDApKTsKLSAgdWludDMyIHVzZWQgPSBmcmFtZXNfZmlsbGVkICogYXVkaW9fYnVzXy0+Y2hhbm5lbHMoKSAqCi0gICAgICBmb3JtYXRfLkZvcm1hdC53Qml0c1BlclNhbXBsZSAvIDg7Ci0KLSAgaWYgKHVzZWQgPD0gYnVmZmVyX3NpemVfKSB7Ci0gICAgLy8gTm90ZTogSWYgdGhpcyBldmVyIGNoYW5nZXMgdG8gb3V0cHV0IHJhdyBmbG9hdCB0aGUgZGF0YSBtdXN0IGJlIGNsaXBwZWQKLSAgICAvLyBhbmQgc2FuaXRpemVkIHNpbmNlIGl0IG1heSBjb21lIGZyb20gYW4gdW50cnVzdGVkIHNvdXJjZSBzdWNoIGFzIE5hQ2wuCi0gICAgYXVkaW9fYnVzXy0+VG9JbnRlcmxlYXZlZCgKLSAgICAgICAgZnJhbWVzX2ZpbGxlZCwgZm9ybWF0Xy5Gb3JtYXQud0JpdHNQZXJTYW1wbGUgLyA4LCBidWZmZXItPmxwRGF0YSk7Ci0KLSAgICBidWZmZXItPmR3QnVmZmVyTGVuZ3RoID0gdXNlZCAqIGZvcm1hdF8uRm9ybWF0Lm5DaGFubmVscyAvIGNoYW5uZWxzXzsKLSAgICBtZWRpYTo6QWRqdXN0Vm9sdW1lKGJ1ZmZlci0+bHBEYXRhLCB1c2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0Xy5Gb3JtYXQubkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0Xy5Gb3JtYXQud0JpdHNQZXJTYW1wbGUgPj4gMywKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV8pOwotICB9IGVsc2UgewotICAgIEhhbmRsZUVycm9yKDApOwotICAgIHJldHVybjsKLSAgfQotICBidWZmZXItPmR3RmxhZ3MgPSBXSERSX1BSRVBBUkVEOwotfQotCi0vLyBPbmUgb2YgdGhlIHRocmVhZHMgaW4gb3VyIHRocmVhZCBwb29sIGFzeW5jaHJvbm91c2x5IGNhbGxzIHRoaXMgZnVuY3Rpb24gd2hlbgotLy8gYnVmZmVyX2V2ZW50XyBpcyBzaWduYWxsZWQuIFNlYXJjaCB0aHJvdWdoIGFsbCB0aGUgYnVmZmVycyBsb29raW5nIGZvciBmcmVlZAotLy8gb25lcywgZmlsbHMgdGhlbSB3aXRoIGRhdGEsIGFuZCAiZmVlZCIgdGhlIFdpbmRvd3MuCi0vLyBOb3RlOiBieSBzZWFyY2hpbmcgdGhyb3VnaCBhbGwgdGhlIGJ1ZmZlcnMgd2UgZ3VhcmFudGVlIHRoYXQgd2UgZmlsbCBhbGwgdGhlCi0vLyAgICAgICBidWZmZXJzLCBldmVuIHdoZW4gImV2ZW50IGxvc3MiIGhhcHBlbnMsIGkuZS4gaWYgV2luZG93cyBzaWduYWxzIGV2ZW50Ci0vLyAgICAgICB3aGVuIGl0IGRpZCBub3QgZmxpcCBpbnRvIHVuc2lnbmFsZWQgc3RhdGUgZnJvbSB0aGUgcHJldmlvdXMgc2lnbmFsLgotdm9pZCBOVEFQSSBQQ01XYXZlT3V0QXVkaW9PdXRwdXRTdHJlYW06OkJ1ZmZlckNhbGxiYWNrKFBWT0lEIGxwUGFyYW1ldGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0xFQU4gdGltZXJfZmlyZWQpIHsKLSAgVFJBQ0VfRVZFTlQwKCJhdWRpbyIsICJQQ01XYXZlT3V0QXVkaW9PdXRwdXRTdHJlYW06OkJ1ZmZlckNhbGxiYWNrIik7Ci0KLSAgRENIRUNLKCF0aW1lcl9maXJlZCk7Ci0gIFBDTVdhdmVPdXRBdWRpb091dHB1dFN0cmVhbSogc3RyZWFtID0KLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UENNV2F2ZU91dEF1ZGlvT3V0cHV0U3RyZWFtKj4obHBQYXJhbWV0ZXIpOwotCi0gIC8vIExvY2sgdGhlIHN0cmVhbSBzbyBjYWxsYmFja3MgZG8gbm90IGludGVyZmVyZSB3aXRoIGVhY2ggb3RoZXIuCi0gIC8vIFNldmVyYWwgY2FsbGJhY2tzIGNhbiBiZSBjYWxsZWQgc2ltdWx0YW5lb3VzbHkgYnkgZGlmZmVyZW50IHRocmVhZHMgaW4gdGhlCi0gIC8vIHRocmVhZCBwb29sIGlmIHNvbWUgb2YgdGhlIGNhbGxiYWNrcyBhcmUgc2xvdywgb3Igc3lzdGVtIGlzIHZlcnkgYnVzeSBhbmQKLSAgLy8gc2NoZWR1bGVkIGNhbGxiYWNrcyBhcmUgbm90IGNhbGxlZCBvbiB0aW1lLgotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2soc3RyZWFtLT5sb2NrXyk7Ci0gIGlmIChzdHJlYW0tPnN0YXRlXyAhPSBQQ01BX1BMQVlJTkcpCi0gICAgcmV0dXJuOwotCi0gIGZvciAoaW50IGl4ID0gMDsgaXggIT0gc3RyZWFtLT5udW1fYnVmZmVyc187ICsraXgpIHsKLSAgICBXQVZFSERSKiBidWZmZXIgPSBzdHJlYW0tPkdldEJ1ZmZlcihpeCk7Ci0gICAgaWYgKGJ1ZmZlci0+ZHdGbGFncyAmIFdIRFJfRE9ORSkgewotICAgICAgLy8gQmVmb3JlIHdlIHF1ZXVlIHRoZSBuZXh0IHBhY2tldCwgd2UgbmVlZCB0byBhZGp1c3QgdGhlIG51bWJlciBvZgotICAgICAgLy8gcGVuZGluZyBieXRlcyBzaW5jZSB0aGUgbGFzdCB3cml0ZSB0byBoYXJkd2FyZS4KLSAgICAgIHN0cmVhbS0+cGVuZGluZ19ieXRlc18gLT0gYnVmZmVyLT5kd0J1ZmZlckxlbmd0aDsKLSAgICAgIHN0cmVhbS0+UXVldWVOZXh0UGFja2V0KGJ1ZmZlcik7Ci0KLSAgICAgIC8vIFF1ZXVlTmV4dFBhY2tldCgpIGNhbiB0YWtlIGEgbG9uZyB0aW1lLCBlc3BlY2lhbGx5IGlmIHNldmVyYWwgb2YgdGhlbQotICAgICAgLy8gd2VyZSBjYWxsZWQgYmFjay10by1iYWNrLiBDaGVjayBpZiB3ZSBhcmUgc3RvcHBpbmcgbm93LgotICAgICAgaWYgKHN0cmVhbS0+c3RhdGVfICE9IFBDTUFfUExBWUlORykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICAvLyBUaW1lIHRvIHNlbmQgdGhlIGJ1ZmZlciB0byB0aGUgYXVkaW8gZHJpdmVyLiBTaW5jZSB3ZSBhcmUgcmV1c2luZwotICAgICAgLy8gdGhlIHNhbWUgYnVmZmVycyB3ZSBjYW4gZ2V0IGF3YXkgd2l0aG91dCBjYWxsaW5nIHdhdmVPdXRQcmVwYXJlSGVhZGVyLgotICAgICAgTU1SRVNVTFQgcmVzdWx0ID0gOjp3YXZlT3V0V3JpdGUoc3RyZWFtLT53YXZlb3V0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihXQVZFSERSKSk7Ci0gICAgICBpZiAocmVzdWx0ICE9IE1NU1lTRVJSX05PRVJST1IpCi0gICAgICAgIHN0cmVhbS0+SGFuZGxlRXJyb3IocmVzdWx0KTsKLSAgICAgIHN0cmVhbS0+cGVuZGluZ19ieXRlc18gKz0gYnVmZmVyLT5kd0J1ZmZlckxlbmd0aDsKLSAgICB9Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYXVkaW8vd2luL3dhdmVvdXRfb3V0cHV0X3dpbi5oIGIvc3JjL21lZGlhL2F1ZGlvL3dpbi93YXZlb3V0X291dHB1dF93aW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYyZmNmYy4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYXVkaW8vd2luL3dhdmVvdXRfb3V0cHV0X3dpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfQVVESU9fV0lOX1dBVkVPVVRfT1VUUFVUX1dJTl9IXwotI2RlZmluZSBNRURJQV9BVURJT19XSU5fV0FWRU9VVF9PVVRQVVRfV0lOX0hfCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8bW1zeXN0ZW0uaD4KLSNpbmNsdWRlIDxtbXJlZy5oPgotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKLSNpbmNsdWRlICJiYXNlL3dpbi9zY29wZWRfaGFuZGxlLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9faW8uaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19wYXJhbWV0ZXJzLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIEF1ZGlvTWFuYWdlcldpbjsKLQotLy8gSW1wbGVtZW50cyBQQ00gYXVkaW8gb3V0cHV0IHN1cHBvcnQgZm9yIFdpbmRvd3MgdXNpbmcgdGhlIFdhdmVYWFggQVBJLgotLy8gV2hpbGUgbm90IGFzIG5pY2UgYXMgdGhlIERpcmVjdFNvdW5kLWJhc2VkIEFQSSwgaXQgc2hvdWxkIHdvcmsgaW4gYWxsIHRhcmdldAotLy8gb3BlcmF0aW5nIHN5c3RlbXMgcmVnYXJkbGVzcyBvciBEaXJlY3RYIHZlcnNpb24gaW5zdGFsbGVkLiBJdCBpcyBrbm93biB0aGF0Ci0vLyBpbiBzb21lIG1hY2hpbmVzIFdhdmVYWFggYmFzZWQgYXVkaW8gaXMgYmV0dGVyIHdoaWxlIGluIG90aGVycyBEaXJlY3RTb3VuZAotLy8gaXMgYmV0dGVyLgotLy8KLS8vIEltcG9ydGFudDogdGhlIE9uWFhYWCBmdW5jdGlvbnMgaW4gQXVkaW9Tb3VyY2VDYWxsYmFjayBhcmUgY2FsbGVkIGJ5IG1vcmUKLS8vIHRoYW4gb25lIHRocmVhZCBzbyBpdCBpcyBpbXBvcnRhbnQgdG8gaGF2ZSBzb21lIGZvcm0gb2Ygc3luY2hyb25pemF0aW9uIGlmCi0vLyB5b3UgYXJlIGtlZXBpbmcgc3RhdGUgaW4gaXQuCi1jbGFzcyBQQ01XYXZlT3V0QXVkaW9PdXRwdXRTdHJlYW0gOiBwdWJsaWMgQXVkaW9PdXRwdXRTdHJlYW0gewotIHB1YmxpYzoKLSAgLy8gVGhlIGN0b3IgdGFrZXMgYWxsIHRoZSB1c3VhbCBwYXJhbWV0ZXJzLCBwbHVzIHxtYW5hZ2VyfCB3aGljaCBpcyB0aGUgdGhlCi0gIC8vIGF1ZGlvIG1hbmFnZXIgd2hvIGlzIGNyZWF0aW5nIHRoaXMgb2JqZWN0IGFuZCB8ZGV2aWNlX2lkfCB3aGljaCBpcyBwcm92aWRlZAotICAvLyBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4KLSAgUENNV2F2ZU91dEF1ZGlvT3V0cHV0U3RyZWFtKEF1ZGlvTWFuYWdlcldpbiogbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9idWZmZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBkZXZpY2VfaWQpOwotICB2aXJ0dWFsIH5QQ01XYXZlT3V0QXVkaW9PdXRwdXRTdHJlYW0oKTsKLQotICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBBdWRpb091dHB1dFN0cmVhbS4KLSAgdmlydHVhbCBib29sIE9wZW4oKTsKLSAgdmlydHVhbCB2b2lkIENsb3NlKCk7Ci0gIHZpcnR1YWwgdm9pZCBTdGFydChBdWRpb1NvdXJjZUNhbGxiYWNrKiBjYWxsYmFjayk7Ci0gIHZpcnR1YWwgdm9pZCBTdG9wKCk7Ci0gIHZpcnR1YWwgdm9pZCBTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSk7Ci0gIHZpcnR1YWwgdm9pZCBHZXRWb2x1bWUoZG91YmxlKiB2b2x1bWUpOwotCi0gIC8vIFNlbmRzIGEgYnVmZmVyIHRvIHRoZSBhdWRpbyBkcml2ZXIgZm9yIHBsYXliYWNrLgotICB2b2lkIFF1ZXVlTmV4dFBhY2tldChXQVZFSERSKiBidWZmZXIpOwotCi0gcHJpdmF0ZToKLSAgZW51bSBTdGF0ZSB7Ci0gICAgUENNQV9CUkFORF9ORVcsICAgIC8vIEluaXRpYWwgc3RhdGUuCi0gICAgUENNQV9SRUFEWSwgICAgICAgIC8vIERldmljZSBvYnRhaW5lZCBhbmQgcmVhZHkgdG8gcGxheS4KLSAgICBQQ01BX1BMQVlJTkcsICAgICAgLy8gUGxheWluZyBhdWRpby4KLSAgICBQQ01BX1NUT1BQSU5HLCAgICAgLy8gQXVkaW8gaXMgc3RvcHBpbmcsIGRvIG5vdCAiZmVlZCIgZGF0YSB0byBXaW5kb3dzLgotICAgIFBDTUFfQ0xPU0VEICAgICAgICAvLyBEZXZpY2UgaGFzIGJlZW4gcmVsZWFzZWQuCi0gIH07Ci0KLSAgLy8gUmV0dXJucyBwb2ludGVyIHRvIHRoZSBuLXRoIGJ1ZmZlci4KLSAgaW5saW5lIFdBVkVIRFIqIEdldEJ1ZmZlcihpbnQgbikgY29uc3Q7Ci0KLSAgLy8gU2l6ZSBvZiBvbmUgYnVmZmVyIGluIGJ5dGVzLCByb3VuZGVkIHVwIGlmIG5lY2Vzc2FyeS4KLSAgaW5saW5lIHNpemVfdCBCdWZmZXJTaXplKCkgY29uc3Q7Ci0KLSAgLy8gV2luZG93cyBjYWxscyB1cyBiYWNrIGFza2luZyBmb3IgbW9yZSBkYXRhIHdoZW4gYnVmZmVyX2V2ZW50XyBzaWduYWxsZWQuCi0gIC8vIFNlZSBNU0ROIGZvciBoZWxwIG9uIFJlZ2lzdGVyV2FpdEZvclNpbmdsZU9iamVjdCgpIGFuZCB3YXZlT3V0T3BlbigpLgotICBzdGF0aWMgdm9pZCBOVEFQSSBCdWZmZXJDYWxsYmFjayhQVk9JRCBscFBhcmFtZXRlciwgQk9PTEVBTiB0aW1lcl9maXJlZCk7Ci0KLSAgLy8gSWYgd2luZG93cyByZXBvcnRzIGFuIGVycm9yIHRoaXMgZnVuY3Rpb24gaGFuZGxlcyBpdCBhbmQgcGFzc2VzIGl0IHRvCi0gIC8vIHRoZSBhdHRhY2hlZCBBdWRpb1NvdXJjZUNhbGxiYWNrOjpPbkVycm9yKCkuCi0gIHZvaWQgSGFuZGxlRXJyb3IoTU1SRVNVTFQgZXJyb3IpOwotCi0gIC8vIEFsbG9jYXRlcyBhbmQgcHJlcGFyZXMgdGhlIG1lbW9yeSB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgcGxheWJhY2suCi0gIHZvaWQgU2V0dXBCdWZmZXJzKCk7Ci0KLSAgLy8gRGVhbGxvY2F0ZXMgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgaW4gU2V0dXBCdWZmZXJzLgotICB2b2lkIEZyZWVCdWZmZXJzKCk7Ci0KLSAgLy8gUmVhZGVyIGJld2FyZS4gVmlzdWFsIEMgaGFzIHN0cm9uZ2VyIGd1YXJhbnRlZXMgb24gdm9sYXRpbGUgdmFycyB0aGFuCi0gIC8vIG1vc3QgcGVvcGxlIGV4cGVjdC4gSW4gZmFjdCwgaXQgaGFzIHJlbGVhc2Ugc2VtYW50aWNzIG9uIHdyaXRlIGFuZAotICAvLyBhY3F1aXJlIHNlbWFudGljcyBvbiByZWFkcy4gU2VlIHRoZSBtc2RuIGRvY3VtZW50YXRpb24uCi0gIHZvbGF0aWxlIFN0YXRlIHN0YXRlXzsKLQotICAvLyBUaGUgYXVkaW8gbWFuYWdlciB0aGF0IGNyZWF0ZWQgdGhpcyBvdXRwdXQgc3RyZWFtLiBXZSBub3RpZnkgaXQgd2hlbgotICAvLyB3ZSBjbG9zZSBzbyBpdCBjYW4gcmVsZWFzZSBpdHMgb3duIHJlc291cmNlcy4KLSAgQXVkaW9NYW5hZ2VyV2luKiBtYW5hZ2VyXzsKLQotICAvLyBXZSB1c2UgdGhlIGNhbGxiYWNrIG1vc3RseSB0byBwZXJpb2RpY2FsbHkgcmVxdWVzdCBtb3JlIGF1ZGlvIGRhdGEuCi0gIEF1ZGlvU291cmNlQ2FsbGJhY2sqIGNhbGxiYWNrXzsKLQotICAvLyBUaGUgbnVtYmVyIG9mIGJ1ZmZlcnMgb2Ygc2l6ZSB8YnVmZmVyX3NpemVffCBlYWNoIHRvIHVzZS4KLSAgY29uc3QgaW50IG51bV9idWZmZXJzXzsKLQotICAvLyBUaGUgc2l6ZSBpbiBieXRlcyBvZiBlYWNoIGF1ZGlvIGJ1ZmZlciwgd2UgdXN1YWxseSBoYXZlIHR3byBvZiB0aGVzZS4KLSAgdWludDMyIGJ1ZmZlcl9zaXplXzsKLQotICAvLyBWb2x1bWUgbGV2ZWwgZnJvbSAwIHRvIDEuCi0gIGZsb2F0IHZvbHVtZV87Ci0KLSAgLy8gQ2hhbm5lbHMgZnJvbSAwIHRvIDguCi0gIGNvbnN0IGludCBjaGFubmVsc187Ci0KLSAgLy8gTnVtYmVyIG9mIGJ5dGVzIHlldCB0byBiZSBwbGF5ZWQgaW4gdGhlIGhhcmR3YXJlIGJ1ZmZlci4KLSAgdWludDMyIHBlbmRpbmdfYnl0ZXNfOwotCi0gIC8vIFRoZSBpZCBhc3NpZ25lZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0byB0aGUgc2VsZWN0ZWQgd2F2ZSBvdXRwdXQKLSAgLy8gaGFyZHdhcmUgZGV2aWNlLiBVc3VhbGx5IHRoaXMgaXMganVzdCAtMSB3aGljaCBtZWFucyAnZGVmYXVsdCBkZXZpY2UnLgotICBVSU5UIGRldmljZV9pZF87Ci0KLSAgLy8gV2luZG93cyBuYXRpdmUgc3RydWN0dXJlIHRvIGVuY29kZSB0aGUgZm9ybWF0IHBhcmFtZXRlcnMuCi0gIFdBVkVGT1JNQVRQQ01FWCBmb3JtYXRfOwotCi0gIC8vIEhhbmRsZSB0byB0aGUgaW5zdGFuY2Ugb2YgdGhlIHdhdmUgZGV2aWNlLgotICBIV0FWRU9VVCB3YXZlb3V0XzsKLQotICAvLyBIYW5kbGUgdG8gdGhlIGJ1ZmZlciBldmVudC4KLSAgYmFzZTo6d2luOjpTY29wZWRIYW5kbGUgYnVmZmVyX2V2ZW50XzsKLQotICAvLyBIYW5kbGUgcmV0dXJuZWQgYnkgUmVnaXN0ZXJXYWl0Rm9yU2luZ2xlT2JqZWN0KCkuCi0gIEhBTkRMRSB3YWl0aW5nX2hhbmRsZV87Ci0KLSAgLy8gUG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIGF1ZGlvIGJ1ZmZlcnMsIHdlIGFsbG9jYXRlIGFsbCBidWZmZXJzIGluIG9uZSBiaWcKLSAgLy8gY2h1bmsuIFRoaXMgb2JqZWN0IG93bnMgdGhlbS4KLSAgc2NvcGVkX2FycmF5PGNoYXI+IGJ1ZmZlcnNfOwotCi0gIC8vIExvY2sgdXNlZCB0byBhdm9pZCB0aGUgY29uZmxpY3Qgd2hlbiBjYWxsYmFja3MgYXJlIGNhbGxlZCBzaW11bHRhbmVvdXNseS4KLSAgYmFzZTo6TG9jayBsb2NrXzsKLQotICAvLyBDb250YWluZXIgZm9yIHJldHJpZXZpbmcgZGF0YSBmcm9tIEF1ZGlvU291cmNlQ2FsbGJhY2s6Ok9uTW9yZURhdGEoKS4KLSAgc2NvcGVkX3B0cjxBdWRpb0J1cz4gYXVkaW9fYnVzXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oUENNV2F2ZU91dEF1ZGlvT3V0cHV0U3RyZWFtKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0FVRElPX1dJTl9XQVZFT1VUX09VVFBVVF9XSU5fSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2F1ZGlvX2J1cy5jYyBiL3NyYy9tZWRpYS9iYXNlL2F1ZGlvX2J1cy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRmN2RlOS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9hdWRpb19idXMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fYnVzLmgiCi0KLSNpbmNsdWRlIDxsaW1pdHM+Ci0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19wYXJhbWV0ZXJzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9saW1pdHMuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotc3RhdGljIGJvb2wgSXNBbGlnbmVkKHZvaWQqIHB0cikgewotICByZXR1cm4gKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihwdHIpICYKLSAgICAgICAgICAoQXVkaW9CdXM6OmtDaGFubmVsQWxpZ25tZW50IC0gMSkpID09IDBVOwotfQotCi0vLyBDYWxjdWxhdGVzIHRoZSByZXF1aXJlZCBzaXplIGZvciBhbiBBdWRpb0J1cyB3aXRoIHRoZSBnaXZlbiBwYXJhbXMsIHNldHMKLS8vIHxhbGlnbmVkX2ZyYW1lc3wgdG8gdGhlIGFjdHVhbCBmcmFtZSBsZW5ndGggb2YgZWFjaCBjaGFubmVsIGFycmF5Lgotc3RhdGljIGludCBDYWxjdWxhdGVNZW1vcnlTaXplSW50ZXJuYWwoaW50IGNoYW5uZWxzLCBpbnQgZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBvdXRfYWxpZ25lZF9mcmFtZXMpIHsKLSAgLy8gQ2hvb3NlIGEgc2l6ZSBzdWNoIHRoYXQgZWFjaCBjaGFubmVsIHdpbGwgYmUgYWxpZ25lZCBieQotICAvLyBrQ2hhbm5lbEFsaWdubWVudCB3aGVuIHN0b3JlZCBpbiBhIGNvbnRpZ3VvdXMgYmxvY2suCi0gIGludCBhbGlnbmVkX2ZyYW1lcyA9Ci0gICAgICAoKGZyYW1lcyAqIHNpemVvZihmbG9hdCkgKyBBdWRpb0J1czo6a0NoYW5uZWxBbGlnbm1lbnQgLSAxKSAmCi0gICAgICAgfihBdWRpb0J1czo6a0NoYW5uZWxBbGlnbm1lbnQgLSAxKSkgLyBzaXplb2YoZmxvYXQpOwotCi0gIGlmIChvdXRfYWxpZ25lZF9mcmFtZXMpCi0gICAgKm91dF9hbGlnbmVkX2ZyYW1lcyA9IGFsaWduZWRfZnJhbWVzOwotCi0gIHJldHVybiBzaXplb2YoZmxvYXQpICogY2hhbm5lbHMgKiBhbGlnbmVkX2ZyYW1lczsKLX0KLQotLy8gfEZvcm1hdHwgaXMgdGhlIGRlc3RpbmF0aW9uIHR5cGUsIHxGaXhlZHwgaXMgYSB0eXBlIGxhcmdlciB0aGFuIHxGb3JtYXR8Ci0vLyBzdWNoIHRoYXQgb3BlcmF0aW9ucyBjYW4gYmUgbWFkZSB3aXRob3V0IG92ZXJmbG93aW5nLgotdGVtcGxhdGU8Y2xhc3MgRm9ybWF0LCBjbGFzcyBGaXhlZD4KLXN0YXRpYyB2b2lkIEZyb21JbnRlcmxlYXZlZEludGVybmFsKGNvbnN0IHZvaWQqIHNyYywgaW50IHN0YXJ0X2ZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lcywgQXVkaW9CdXMqIGRlc3QpIHsKLSAgY29uc3QgRm9ybWF0KiBzb3VyY2UgPSBzdGF0aWNfY2FzdDxjb25zdCBGb3JtYXQqPihzcmMpOwotCi0gIHN0YXRpYyBjb25zdCBGaXhlZCBrQmlhcyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8Rm9ybWF0Pjo6aXNfc2lnbmVkID8gMCA6Ci0gICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPEZvcm1hdD46Om1heCgpIC8gMiArIDE7Ci0gIHN0YXRpYyBjb25zdCBmbG9hdCBrTWF4U2NhbGUgPSAxLjBmIC8gKGtCaWFzID8ga0JpYXMgLSAxIDoKLSAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8Rm9ybWF0Pjo6bWF4KCkpOwotICBzdGF0aWMgY29uc3QgZmxvYXQga01pblNjYWxlID0gMS4wZiAvIChrQmlhcyA/IGtCaWFzIDoKLSAgICAgIC1zdGF0aWNfY2FzdDxGaXhlZD4oc3RkOjpudW1lcmljX2xpbWl0czxGb3JtYXQ+OjptaW4oKSkpOwotCi0gIGludCBjaGFubmVscyA9IGRlc3QtPmNoYW5uZWxzKCk7Ci0gIGZvciAoaW50IGNoID0gMDsgY2ggPCBjaGFubmVsczsgKytjaCkgewotICAgIGZsb2F0KiBjaGFubmVsX2RhdGEgPSBkZXN0LT5jaGFubmVsKGNoKTsKLSAgICBmb3IgKGludCBpID0gc3RhcnRfZnJhbWUsIG9mZnNldCA9IGNoOyBpIDwgc3RhcnRfZnJhbWUgKyBmcmFtZXM7Ci0gICAgICAgICArK2ksIG9mZnNldCArPSBjaGFubmVscykgewotICAgICAgRml4ZWQgdiA9IHN0YXRpY19jYXN0PEZpeGVkPihzb3VyY2Vbb2Zmc2V0XSkgLSBrQmlhczsKLSAgICAgIGNoYW5uZWxfZGF0YVtpXSA9IHYgKiAodiA8IDAgPyBrTWluU2NhbGUgOiBrTWF4U2NhbGUpOwotICAgIH0KLSAgfQotfQotCi0vLyB8Rm9ybWF0fCBpcyB0aGUgZGVzdGluYXRpb24gdHlwZSwgfEZpeGVkfCBpcyBhIHR5cGUgbGFyZ2VyIHRoYW4gfEZvcm1hdHwKLS8vIHN1Y2ggdGhhdCBvcGVyYXRpb25zIGNhbiBiZSBtYWRlIHdpdGhvdXQgb3ZlcmZsb3dpbmcuCi10ZW1wbGF0ZTxjbGFzcyBGb3JtYXQsIGNsYXNzIEZpeGVkPgotc3RhdGljIHZvaWQgVG9JbnRlcmxlYXZlZEludGVybmFsKGNvbnN0IEF1ZGlvQnVzKiBzb3VyY2UsIGludCBzdGFydF9mcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVzLCB2b2lkKiBkc3QpIHsKLSAgRm9ybWF0KiBkZXN0ID0gc3RhdGljX2Nhc3Q8Rm9ybWF0Kj4oZHN0KTsKLQotICBzdGF0aWMgY29uc3QgRm9ybWF0IGtCaWFzID0gc3RkOjpudW1lcmljX2xpbWl0czxGb3JtYXQ+Ojppc19zaWduZWQgPyAwIDoKLSAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8Rm9ybWF0Pjo6bWF4KCkgLyAyICsgMTsKLSAgc3RhdGljIGNvbnN0IEZpeGVkIGtNYXhWYWx1ZSA9IGtCaWFzID8ga0JpYXMgLSAxIDoKLSAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8Rm9ybWF0Pjo6bWF4KCk7Ci0gIHN0YXRpYyBjb25zdCBGaXhlZCBrTWluVmFsdWUgPSBrQmlhcyA/IC1rQmlhcyA6Ci0gICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPEZvcm1hdD46Om1pbigpOwotCi0gIGludCBjaGFubmVscyA9IHNvdXJjZS0+Y2hhbm5lbHMoKTsKLSAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyArK2NoKSB7Ci0gICAgY29uc3QgZmxvYXQqIGNoYW5uZWxfZGF0YSA9IHNvdXJjZS0+Y2hhbm5lbChjaCk7Ci0gICAgZm9yIChpbnQgaSA9IHN0YXJ0X2ZyYW1lLCBvZmZzZXQgPSBjaDsgaSA8IGZyYW1lczsKLSAgICAgICAgICsraSwgb2Zmc2V0ICs9IGNoYW5uZWxzKSB7Ci0gICAgICBmbG9hdCB2ID0gY2hhbm5lbF9kYXRhW2ldOwotICAgICAgRml4ZWQgc2FtcGxlID0gdiAqICh2IDwgMCA/IC1rTWluVmFsdWUgOiBrTWF4VmFsdWUpOwotCi0gICAgICBpZiAoc2FtcGxlID4ga01heFZhbHVlKQotICAgICAgICBzYW1wbGUgPSBrTWF4VmFsdWU7Ci0gICAgICBlbHNlIGlmIChzYW1wbGUgPCBrTWluVmFsdWUpCi0gICAgICAgIHNhbXBsZSA9IGtNaW5WYWx1ZTsKLQotICAgICAgZGVzdFtvZmZzZXRdID0gc3RhdGljX2Nhc3Q8Rm9ybWF0PihzYW1wbGUpICsga0JpYXM7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFZhbGlkYXRlQ29uZmlnKGludCBjaGFubmVscywgaW50IGZyYW1lcykgewotICBDSEVDS19HVChmcmFtZXMsIDApOwotICBDSEVDS19HVChjaGFubmVscywgMCk7Ci0gIENIRUNLX0xFKGNoYW5uZWxzLCBsaW1pdHM6OmtNYXhDaGFubmVscyk7Ci19Ci0KLXN0YXRpYyB2b2lkIENoZWNrT3ZlcmZsb3coaW50IHN0YXJ0X2ZyYW1lLCBpbnQgZnJhbWVzLCBpbnQgdG90YWxfZnJhbWVzKSB7Ci0gIENIRUNLX0dFKHN0YXJ0X2ZyYW1lLCAwKTsKLSAgQ0hFQ0tfR0UoZnJhbWVzLCAwKTsKLSAgQ0hFQ0tfR1QodG90YWxfZnJhbWVzLCAwKTsKLSAgaW50IHN1bSA9IHN0YXJ0X2ZyYW1lICsgZnJhbWVzOwotICBDSEVDS19MRShzdW0sIHRvdGFsX2ZyYW1lcyk7Ci0gIENIRUNLX0dFKHN1bSwgMCk7Ci19Ci0KLUF1ZGlvQnVzOjpBdWRpb0J1cyhpbnQgY2hhbm5lbHMsIGludCBmcmFtZXMpCi0gICAgOiBmcmFtZXNfKGZyYW1lcyksCi0gICAgICBjYW5fc2V0X2NoYW5uZWxfZGF0YV8oZmFsc2UpIHsKLSAgVmFsaWRhdGVDb25maWcoY2hhbm5lbHMsIGZyYW1lc18pOwotCi0gIGludCBhbGlnbmVkX2ZyYW1lcyA9IDA7Ci0gIGludCBzaXplID0gQ2FsY3VsYXRlTWVtb3J5U2l6ZUludGVybmFsKGNoYW5uZWxzLCBmcmFtZXMsICZhbGlnbmVkX2ZyYW1lcyk7Ci0KLSAgZGF0YV8ucmVzZXQoc3RhdGljX2Nhc3Q8ZmxvYXQqPihiYXNlOjpBbGlnbmVkQWxsb2MoCi0gICAgICBzaXplLCBBdWRpb0J1czo6a0NoYW5uZWxBbGlnbm1lbnQpKSk7Ci0KLSAgQnVpbGRDaGFubmVsRGF0YShjaGFubmVscywgYWxpZ25lZF9mcmFtZXMsIGRhdGFfLmdldCgpKTsKLX0KLQotQXVkaW9CdXM6OkF1ZGlvQnVzKGludCBjaGFubmVscywgaW50IGZyYW1lcywgZmxvYXQqIGRhdGEpCi0gICAgOiBmcmFtZXNfKGZyYW1lcyksCi0gICAgICBjYW5fc2V0X2NoYW5uZWxfZGF0YV8oZmFsc2UpIHsKLSAgVmFsaWRhdGVDb25maWcoY2hhbm5lbHMsIGZyYW1lc18pOwotCi0gIGludCBhbGlnbmVkX2ZyYW1lcyA9IDA7Ci0gIENhbGN1bGF0ZU1lbW9yeVNpemVJbnRlcm5hbChjaGFubmVscywgZnJhbWVzLCAmYWxpZ25lZF9mcmFtZXMpOwotCi0gIEJ1aWxkQ2hhbm5lbERhdGEoY2hhbm5lbHMsIGFsaWduZWRfZnJhbWVzLCBkYXRhKTsKLX0KLQotQXVkaW9CdXM6OkF1ZGlvQnVzKGludCBmcmFtZXMsIGNvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0Kj4mIGNoYW5uZWxfZGF0YSkKLSAgICA6IGNoYW5uZWxfZGF0YV8oY2hhbm5lbF9kYXRhKSwKLSAgICAgIGZyYW1lc18oZnJhbWVzKSwKLSAgICAgIGNhbl9zZXRfY2hhbm5lbF9kYXRhXyhmYWxzZSkgewotICBWYWxpZGF0ZUNvbmZpZyhjaGFubmVsX2RhdGFfLnNpemUoKSwgZnJhbWVzXyk7Ci0KLSAgLy8gU2FuaXR5IGNoZWNrIHdyYXBwZWQgdmVjdG9yIGZvciBhbGlnbm1lbnQgYW5kIGNoYW5uZWwgY291bnQuCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2hhbm5lbF9kYXRhXy5zaXplKCk7ICsraSkKLSAgICBEQ0hFQ0soSXNBbGlnbmVkKGNoYW5uZWxfZGF0YV9baV0pKTsKLX0KLQotQXVkaW9CdXM6OkF1ZGlvQnVzKGludCBjaGFubmVscykKLSAgICA6IGNoYW5uZWxfZGF0YV8oY2hhbm5lbHMpLAotICAgICAgZnJhbWVzXygwKSwKLSAgICAgIGNhbl9zZXRfY2hhbm5lbF9kYXRhXyh0cnVlKSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2hhbm5lbF9kYXRhXy5zaXplKCk7ICsraSkKLSAgICBjaGFubmVsX2RhdGFfW2ldID0gTlVMTDsKLX0KLQotQXVkaW9CdXM6On5BdWRpb0J1cygpIHt9Ci0KLXNjb3BlZF9wdHI8QXVkaW9CdXM+IEF1ZGlvQnVzOjpDcmVhdGUoaW50IGNoYW5uZWxzLCBpbnQgZnJhbWVzKSB7Ci0gIHJldHVybiBzY29wZWRfcHRyPEF1ZGlvQnVzPihuZXcgQXVkaW9CdXMoY2hhbm5lbHMsIGZyYW1lcykpOwotfQotCi1zY29wZWRfcHRyPEF1ZGlvQnVzPiBBdWRpb0J1czo6Q3JlYXRlKGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKSB7Ci0gIHJldHVybiBzY29wZWRfcHRyPEF1ZGlvQnVzPihuZXcgQXVkaW9CdXMoCi0gICAgICBwYXJhbXMuY2hhbm5lbHMoKSwgcGFyYW1zLmZyYW1lc19wZXJfYnVmZmVyKCkpKTsKLX0KLQotI2lmIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLQotc2NvcGVkX3B0cjxBdWRpb0J1cz4gQXVkaW9CdXM6OkNyZWF0ZShpbnQgY2hhbm5lbHMsIGludCBmcmFtZXNfcGVyX2NoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBieXRlc19wZXJfZnJhbWUsIGJvb2wgaW50ZXJsZWF2ZWQpIHsKLSAgLy8gQXVkaW9CdXMgdHJlYXRzIGV2ZXJ5dGhpbmcgaW4gZmxvYXQgc28gd2UgaGF2ZSB0byBjb252ZXJ0LgotICB1aW50MzIgZmxvYXRfZnJhbWVfcGVyX2NoYW5uZWwgPQotICAgICAgZnJhbWVzX3Blcl9jaGFubmVsICogYnl0ZXNfcGVyX2ZyYW1lIC8gc2l6ZW9mKGZsb2F0KTsKLSAgaWYgKGludGVybGVhdmVkKQotICAgIHJldHVybiBDcmVhdGUoMSwgY2hhbm5lbHMgKiBmbG9hdF9mcmFtZV9wZXJfY2hhbm5lbCk7Ci0KLSAgcmV0dXJuIENyZWF0ZShjaGFubmVscywgZmxvYXRfZnJhbWVfcGVyX2NoYW5uZWwpOwotfQotCi0jZW5kaWYgIC8vIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLQotc2NvcGVkX3B0cjxBdWRpb0J1cz4gQXVkaW9CdXM6OkNyZWF0ZVdyYXBwZXIoaW50IGNoYW5uZWxzKSB7Ci0gIHJldHVybiBzY29wZWRfcHRyPEF1ZGlvQnVzPihuZXcgQXVkaW9CdXMoY2hhbm5lbHMpKTsKLX0KLQotc2NvcGVkX3B0cjxBdWRpb0J1cz4gQXVkaW9CdXM6OldyYXBWZWN0b3IoCi0gICAgaW50IGZyYW1lcywgY29uc3Qgc3RkOjp2ZWN0b3I8ZmxvYXQqPiYgY2hhbm5lbF9kYXRhKSB7Ci0gIHJldHVybiBzY29wZWRfcHRyPEF1ZGlvQnVzPihuZXcgQXVkaW9CdXMoZnJhbWVzLCBjaGFubmVsX2RhdGEpKTsKLX0KLQotc2NvcGVkX3B0cjxBdWRpb0J1cz4gQXVkaW9CdXM6OldyYXBNZW1vcnkoaW50IGNoYW5uZWxzLCBpbnQgZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZGF0YSkgewotICAvLyB8ZGF0YXwgbXVzdCBiZSBhbGlnbmVkIGJ5IEF1ZGlvQnVzOjprQ2hhbm5lbEFsaWdubWVudC4KLSAgQ0hFQ0soSXNBbGlnbmVkKGRhdGEpKTsKLSAgcmV0dXJuIHNjb3BlZF9wdHI8QXVkaW9CdXM+KG5ldyBBdWRpb0J1cygKLSAgICAgIGNoYW5uZWxzLCBmcmFtZXMsIHN0YXRpY19jYXN0PGZsb2F0Kj4oZGF0YSkpKTsKLX0KLQotc2NvcGVkX3B0cjxBdWRpb0J1cz4gQXVkaW9CdXM6OldyYXBNZW1vcnkoY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBkYXRhKSB7Ci0gIC8vIHxkYXRhfCBtdXN0IGJlIGFsaWduZWQgYnkgQXVkaW9CdXM6OmtDaGFubmVsQWxpZ25tZW50LgotICBDSEVDSyhJc0FsaWduZWQoZGF0YSkpOwotICByZXR1cm4gc2NvcGVkX3B0cjxBdWRpb0J1cz4obmV3IEF1ZGlvQnVzKAotICAgICAgcGFyYW1zLmNoYW5uZWxzKCksIHBhcmFtcy5mcmFtZXNfcGVyX2J1ZmZlcigpLAotICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQqPihkYXRhKSkpOwotfQotCi12b2lkIEF1ZGlvQnVzOjpTZXRDaGFubmVsRGF0YShpbnQgY2hhbm5lbCwgZmxvYXQqIGRhdGEpIHsKLSAgQ0hFQ0soY2FuX3NldF9jaGFubmVsX2RhdGFfKTsKLSAgQ0hFQ0tfR0UoY2hhbm5lbCwgMCk7Ci0gIENIRUNLX0xUKHN0YXRpY19jYXN0PHNpemVfdD4oY2hhbm5lbCksIGNoYW5uZWxfZGF0YV8uc2l6ZSgpKTsKLSAgRENIRUNLKElzQWxpZ25lZChkYXRhKSk7Ci0gIGNoYW5uZWxfZGF0YV9bY2hhbm5lbF0gPSBkYXRhOwotfQotCi12b2lkIEF1ZGlvQnVzOjpzZXRfZnJhbWVzKGludCBmcmFtZXMpIHsKLSAgQ0hFQ0soY2FuX3NldF9jaGFubmVsX2RhdGFfKTsKLSAgZnJhbWVzXyA9IGZyYW1lczsKLX0KLQotdm9pZCBBdWRpb0J1czo6WmVyb0ZyYW1lc1BhcnRpYWwoaW50IHN0YXJ0X2ZyYW1lLCBpbnQgZnJhbWVzKSB7Ci0gIENoZWNrT3ZlcmZsb3coc3RhcnRfZnJhbWUsIGZyYW1lcywgZnJhbWVzXyk7Ci0KLSAgaWYgKGZyYW1lcyA8PSAwKQotICAgIHJldHVybjsKLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNoYW5uZWxfZGF0YV8uc2l6ZSgpOyArK2kpIHsKLSAgICBtZW1zZXQoY2hhbm5lbF9kYXRhX1tpXSArIHN0YXJ0X2ZyYW1lLCAwLAotICAgICAgICAgICBmcmFtZXMgKiBzaXplb2YoKmNoYW5uZWxfZGF0YV9baV0pKTsKLSAgfQotfQotCi12b2lkIEF1ZGlvQnVzOjpaZXJvRnJhbWVzKGludCBmcmFtZXMpIHsKLSAgWmVyb0ZyYW1lc1BhcnRpYWwoMCwgZnJhbWVzKTsKLX0KLQotdm9pZCBBdWRpb0J1czo6WmVybygpIHsKLSAgWmVyb0ZyYW1lcyhmcmFtZXNfKTsKLX0KLQotaW50IEF1ZGlvQnVzOjpDYWxjdWxhdGVNZW1vcnlTaXplKGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKSB7Ci0gIHJldHVybiBDYWxjdWxhdGVNZW1vcnlTaXplSW50ZXJuYWwoCi0gICAgICBwYXJhbXMuY2hhbm5lbHMoKSwgcGFyYW1zLmZyYW1lc19wZXJfYnVmZmVyKCksIE5VTEwpOwotfQotCi1pbnQgQXVkaW9CdXM6OkNhbGN1bGF0ZU1lbW9yeVNpemUoaW50IGNoYW5uZWxzLCBpbnQgZnJhbWVzKSB7Ci0gIHJldHVybiBDYWxjdWxhdGVNZW1vcnlTaXplSW50ZXJuYWwoY2hhbm5lbHMsIGZyYW1lcywgTlVMTCk7Ci19Ci0KLXZvaWQgQXVkaW9CdXM6OkJ1aWxkQ2hhbm5lbERhdGEoaW50IGNoYW5uZWxzLCBpbnQgYWxpZ25lZF9mcmFtZXMsIGZsb2F0KiBkYXRhKSB7Ci0gIERDSEVDSyhJc0FsaWduZWQoZGF0YSkpOwotICBEQ0hFQ0tfRVEoY2hhbm5lbF9kYXRhXy5zaXplKCksIDBVKTsKLSAgLy8gU2VwYXJhdGUgYXVkaW8gZGF0YSBvdXQgaW50byBjaGFubmVscyBmb3IgZWFzeSBsb29rdXAgbGF0ZXIuICBGaWd1cmUgb3V0Ci0gIGNoYW5uZWxfZGF0YV8ucmVzZXJ2ZShjaGFubmVscyk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhbm5lbHM7ICsraSkKLSAgICBjaGFubmVsX2RhdGFfLnB1c2hfYmFjayhkYXRhICsgaSAqIGFsaWduZWRfZnJhbWVzKTsKLX0KLQotLy8gVE9ETyhkYWxlY3VydGlzKTogU2VlIGlmIGludHJpbnNpYyBvcHRpbWl6YXRpb25zIGhlbHAgYW55IGhlcmUuCi12b2lkIEF1ZGlvQnVzOjpGcm9tSW50ZXJsZWF2ZWRQYXJ0aWFsKGNvbnN0IHZvaWQqIHNvdXJjZSwgaW50IHN0YXJ0X2ZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVzLCBpbnQgYnl0ZXNfcGVyX3NhbXBsZSkgewotICBDaGVja092ZXJmbG93KHN0YXJ0X2ZyYW1lLCBmcmFtZXMsIGZyYW1lc18pOwotICBzd2l0Y2ggKGJ5dGVzX3Blcl9zYW1wbGUpIHsKLSAgICBjYXNlIDE6Ci0gICAgICBGcm9tSW50ZXJsZWF2ZWRJbnRlcm5hbDx1aW50OCwgaW50MTY+KHNvdXJjZSwgc3RhcnRfZnJhbWUsIGZyYW1lcywgdGhpcyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBGcm9tSW50ZXJsZWF2ZWRJbnRlcm5hbDxpbnQxNiwgaW50MzI+KHNvdXJjZSwgc3RhcnRfZnJhbWUsIGZyYW1lcywgdGhpcyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBGcm9tSW50ZXJsZWF2ZWRJbnRlcm5hbDxpbnQzMiwgaW50NjQ+KHNvdXJjZSwgc3RhcnRfZnJhbWUsIGZyYW1lcywgdGhpcyk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTk9UUkVBQ0hFRCgpIDw8ICJVbnN1cHBvcnRlZCBieXRlcyBwZXIgc2FtcGxlIGVuY291bnRlcmVkLiI7Ci0gICAgICBaZXJvRnJhbWVzUGFydGlhbChzdGFydF9mcmFtZSwgZnJhbWVzKTsKLSAgICAgIHJldHVybjsKLSAgfQotCi0gIC8vIERvbid0IGNsZWFyIHJlbWFpbmluZyBmcmFtZXMgaWYgdGhpcyBpcyBhIHBhcnRpYWwgZGVpbnRlcmxlYXZlLgotICBpZiAoIXN0YXJ0X2ZyYW1lKSB7Ci0gICAgLy8gWmVybyBhbnkgcmVtYWluaW5nIGZyYW1lcy4KLSAgICBaZXJvRnJhbWVzUGFydGlhbChmcmFtZXMsIGZyYW1lc18gLSBmcmFtZXMpOwotICB9Ci19Ci0KLXZvaWQgQXVkaW9CdXM6OkZyb21JbnRlcmxlYXZlZChjb25zdCB2b2lkKiBzb3VyY2UsIGludCBmcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzX3Blcl9zYW1wbGUpIHsKLSAgRnJvbUludGVybGVhdmVkUGFydGlhbChzb3VyY2UsIDAsIGZyYW1lcywgYnl0ZXNfcGVyX3NhbXBsZSk7Ci19Ci0KLXZvaWQgQXVkaW9CdXM6OlRvSW50ZXJsZWF2ZWQoaW50IGZyYW1lcywgaW50IGJ5dGVzX3Blcl9zYW1wbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRlc3QpIGNvbnN0IHsKLSAgVG9JbnRlcmxlYXZlZFBhcnRpYWwoMCwgZnJhbWVzLCBieXRlc19wZXJfc2FtcGxlLCBkZXN0KTsKLX0KLQotLy8gVE9ETyhkYWxlY3VydGlzKTogU2VlIGlmIGludHJpbnNpYyBvcHRpbWl6YXRpb25zIGhlbHAgYW55IGhlcmUuCi12b2lkIEF1ZGlvQnVzOjpUb0ludGVybGVhdmVkUGFydGlhbChpbnQgc3RhcnRfZnJhbWUsIGludCBmcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNfcGVyX3NhbXBsZSwgdm9pZCogZGVzdCkgY29uc3QgewotICBDaGVja092ZXJmbG93KHN0YXJ0X2ZyYW1lLCBmcmFtZXMsIGZyYW1lc18pOwotICBzd2l0Y2ggKGJ5dGVzX3Blcl9zYW1wbGUpIHsKLSAgICBjYXNlIDE6Ci0gICAgICBUb0ludGVybGVhdmVkSW50ZXJuYWw8dWludDgsIGludDE2Pih0aGlzLCBzdGFydF9mcmFtZSwgZnJhbWVzLCBkZXN0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIFRvSW50ZXJsZWF2ZWRJbnRlcm5hbDxpbnQxNiwgaW50MzI+KHRoaXMsIHN0YXJ0X2ZyYW1lLCBmcmFtZXMsIGRlc3QpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgVG9JbnRlcmxlYXZlZEludGVybmFsPGludDMyLCBpbnQ2ND4odGhpcywgc3RhcnRfZnJhbWUsIGZyYW1lcywgZGVzdCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTk9UUkVBQ0hFRCgpIDw8ICJVbnN1cHBvcnRlZCBieXRlcyBwZXIgc2FtcGxlIGVuY291bnRlcmVkLiI7Ci0gICAgICBtZW1zZXQoZGVzdCwgMCwgZnJhbWVzICogYnl0ZXNfcGVyX3NhbXBsZSk7Ci0gICAgICByZXR1cm47Ci0gIH0KLX0KLQotI2lmIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLXZvaWQgQXVkaW9CdXM6OkZyb21JbnRlcmxlYXZlZEZsb2F0KGNvbnN0IGZsb2F0KiBzb3VyY2UsIGludCBmcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9fYnVzX29mZnNldCkgewotICBEQ0hFQ0tfTEUoZnJhbWVzICsgYXVkaW9fYnVzX29mZnNldCwgdGhpcy0+ZnJhbWVzKCkpOwotCi0gIHdoaWxlIChmcmFtZXMgPiAwKSB7Ci0gICAgZm9yIChpbnQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBjaGFubmVscygpOyArK2NoYW5uZWwpIHsKLSAgICAgIHRoaXMtPmNoYW5uZWwoY2hhbm5lbClbYXVkaW9fYnVzX29mZnNldF0gPSAqc291cmNlOwotICAgICAgKytzb3VyY2U7Ci0gICAgfQotICAgICsrYXVkaW9fYnVzX29mZnNldDsKLSAgICAtLWZyYW1lczsKLSAgfQotfQotCi12b2lkIEF1ZGlvQnVzOjpUb0ludGVybGVhdmVkRmxvYXQoCi0gICAgaW50IGZyYW1lcywgaW50IGF1ZGlvX2J1c19vZmZzZXQsIGludCBleHRyYV9jaGFubmVscywgZmxvYXQqIGRlc3QpIGNvbnN0IHsKLSAgRENIRUNLX0xFKGZyYW1lcyArIGF1ZGlvX2J1c19vZmZzZXQsIHRoaXMtPmZyYW1lcygpKTsKLSAgRENIRUNLX0dFKGV4dHJhX2NoYW5uZWxzLCAwKTsKLQotICB3aGlsZSAoZnJhbWVzID4gMCkgewotICAgIGZvciAoaW50IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgY2hhbm5lbHMoKTsgKytjaGFubmVsKSB7Ci0gICAgICAqZGVzdCA9IHRoaXMtPmNoYW5uZWwoY2hhbm5lbClbYXVkaW9fYnVzX29mZnNldF07Ci0gICAgICArK2Rlc3Q7Ci0gICAgfQotICAgIGZvciAoaW50IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgZXh0cmFfY2hhbm5lbHM7ICsrY2hhbm5lbCkgewotICAgICAgKmRlc3QgPSAwLmY7Ci0gICAgICArK2Rlc3Q7Ci0gICAgfQotICAgICsrYXVkaW9fYnVzX29mZnNldDsKLSAgICAtLWZyYW1lczsKLSAgfQotfQotI2VuZGlmICAvLyBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0KLXZvaWQgQXVkaW9CdXM6OkNvcHlUbyhBdWRpb0J1cyogZGVzdCkgY29uc3QgewotICBDSEVDS19FUShjaGFubmVscygpLCBkZXN0LT5jaGFubmVscygpKTsKLSAgQ0hFQ0tfRVEoZnJhbWVzKCksIGRlc3QtPmZyYW1lcygpKTsKLQotICAvLyBTaW5jZSB3ZSBkb24ndCBrbm93IGlmIHRoZSBvdGhlciBBdWRpb0J1cyBpcyB3cmFwcGVkIG9yIG5vdCAoYW5kIHdlIGRvbid0Ci0gIC8vIHdhbnQgdG8gY2FyZSksIGp1c3QgY29weSB1c2luZyB0aGUgcHVibGljIGNoYW5uZWwoKSBhY2Nlc3NvcnMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhbm5lbHMoKTsgKytpKQotICAgIG1lbWNweShkZXN0LT5jaGFubmVsKGkpLCBjaGFubmVsKGkpLCBzaXplb2YoKmNoYW5uZWwoaSkpICogZnJhbWVzKCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2F1ZGlvX2J1cy5oIGIvc3JjL21lZGlhL2Jhc2UvYXVkaW9fYnVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YjRlZjYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvYXVkaW9fYnVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9CQVNFX0FVRElPX0JVU19IXwotI2RlZmluZSBNRURJQV9CQVNFX0FVRElPX0JVU19IXwotCi0jaW5jbHVkZSA8bGltaXRzPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L2FsaWduZWRfbWVtb3J5LmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci1jbGFzcyBBdWRpb1BhcmFtZXRlcnM7Ci0KLS8vIFNjb3BlZCBjb250YWluZXIgZm9yICJidXNpbmciIGF1ZGlvIGNoYW5uZWwgZGF0YSBhcm91bmQuICBFYWNoIGNoYW5uZWwgaXMKLS8vIHN0b3JlZCBpbiBwbGFuYXIgZm9ybWF0IGFuZCBndWFyYW50ZWVkIHRvIGJlIGFsaWduZWQgYnkga0NoYW5uZWxBbGlnbm1lbnQuCi0vLyBBdWRpb0J1cyBvYmplY3RzIGNhbiBiZSBjcmVhdGVkIG5vcm1hbGx5IG9yIHZpYSB3cmFwcGluZy4gIE5vcm1hbGx5LCBBdWRpb0J1cwotLy8gd2lsbCBkaWNlIHVwIGEgY29udGlndW91cyBtZW1vcnkgYmxvY2sgZm9yIGNoYW5uZWwgZGF0YS4gIFdoZW4gd3JhcHBlZCwKLS8vIEF1ZGlvQnVzIGluc3RlYWQgcm91dGVzIHJlcXVlc3RzIGZvciBjaGFubmVsIGRhdGEgdG8gdGhlIHdyYXBwZWQgb2JqZWN0LgotY2xhc3MgTUVESUFfRVhQT1JUIEF1ZGlvQnVzIHsKLSBwdWJsaWM6Ci0jaWYgZGVmaW5lZChfX0xCX1BTM19fKQotICAvLyBXZSBpbnRlcmxlYXZlIG91ciBkYXRhIGFscmVhZHksIGJ1dCBhbGwgZGF0YSBpcyBmbG9hdHMsIHNvIHdlIHJlcXVpcmUgdGhhdAotICAvLyBubyBmcmFtZSBiZSBzbWFsbGVyIHRoYW4gNCBieXRlcy4KLSAgZW51bSB7IGtDaGFubmVsQWxpZ25tZW50ID0gNCB9OwotI2Vsc2UKLSAgLy8gR3VhcmFudGVlZCBhbGlnbm1lbnQgb2YgZWFjaCBjaGFubmVsJ3MgZGF0YTsgdXNlIDE2LWJ5dGUgYWxpZ25tZW50IGZvciBlYXN5Ci0gIC8vIFNTRSBvcHRpbWl6YXRpb25zLgotICBlbnVtIHsga0NoYW5uZWxBbGlnbm1lbnQgPSAxNiB9OwotI2VuZGlmCi0KLSAgLy8gQ3JlYXRlcyBhIG5ldyBBdWRpb0J1cyBhbmQgYWxsb2NhdGVzIHxjaGFubmVsc3wgb2YgbGVuZ3RoIHxmcmFtZXN8LiAgVXNlcwotICAvLyBjaGFubmVscygpIGFuZCBmcmFtZXNfcGVyX2J1ZmZlcigpIGZyb20gQXVkaW9QYXJhbWV0ZXJzIGlmIGdpdmVuLgotICBzdGF0aWMgc2NvcGVkX3B0cjxBdWRpb0J1cz4gQ3JlYXRlKGludCBjaGFubmVscywgaW50IGZyYW1lcyk7Ci0gIHN0YXRpYyBzY29wZWRfcHRyPEF1ZGlvQnVzPiBDcmVhdGUoY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMpOwotCi0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICBzdGF0aWMgc2NvcGVkX3B0cjxBdWRpb0J1cz4gQ3JlYXRlKGludCBjaGFubmVscywgaW50IGZyYW1lc19wZXJfY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNfcGVyX2ZyYW1lLCBib29sIGludGVybGVhdmVkKTsKLSNlbmRpZiAgLy8gZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotCi0gIC8vIENyZWF0ZXMgYSBuZXcgQXVkaW9CdXMgd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGNoYW5uZWxzLCBidXQgemVybyBsZW5ndGguCi0gIC8vIEl0J3MgZXhwZWN0ZWQgdG8gYmUgdXNlZCB3aXRoIFNldENoYW5uZWxEYXRhKCkgYW5kIHNldF9mcmFtZXMoKSB0bwotICAvLyB3cmFwIGV4dGVybmFsbHkgYWxsb2NhdGVkIG1lbW9yeS4KLSAgc3RhdGljIHNjb3BlZF9wdHI8QXVkaW9CdXM+IENyZWF0ZVdyYXBwZXIoaW50IGNoYW5uZWxzKTsKLQotICAvLyBDcmVhdGVzIGEgbmV3IEF1ZGlvQnVzIGZyb20gYW4gZXhpc3RpbmcgY2hhbm5lbCB2ZWN0b3IuICBEb2VzIG5vdCB0cmFuc2ZlcgotICAvLyBvd25lcnNoaXAgb2YgfGNoYW5uZWxfZGF0YXwgdG8gQXVkaW9CdXM7IGkuZS4sIHxjaGFubmVsX2RhdGF8IG11c3Qgb3V0bGl2ZQotICAvLyB0aGUgcmV0dXJuZWQgQXVkaW9CdXMuICBFYWNoIGNoYW5uZWwgbXVzdCBiZSBhbGlnbmVkIGJ5IGtDaGFubmVsQWxpZ25tZW50LgotICBzdGF0aWMgc2NvcGVkX3B0cjxBdWRpb0J1cz4gV3JhcFZlY3RvcigKLSAgICAgIGludCBmcmFtZXMsIGNvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0Kj4mIGNoYW5uZWxfZGF0YSk7Ci0KLSAgLy8gQ3JlYXRlcyBhIG5ldyBBdWRpb0J1cyBieSB3cmFwcGluZyBhbiBleGlzdGluZyBibG9jayBvZiBtZW1vcnkuICBCbG9jayBtdXN0Ci0gIC8vIGJlIGF0IGxlYXN0IENhbGN1bGF0ZU1lbW9yeVNpemUoKSBieXRlcyBpbiBzaXplLiAgfGRhdGF8IG11c3Qgb3V0bGl2ZSB0aGUKLSAgLy8gcmV0dXJuZWQgQXVkaW9CdXMuICB8ZGF0YXwgbXVzdCBiZSBhbGlnbmVkIGJ5IGtDaGFubmVsQWxpZ25tZW50LgotICBzdGF0aWMgc2NvcGVkX3B0cjxBdWRpb0J1cz4gV3JhcE1lbW9yeShpbnQgY2hhbm5lbHMsIGludCBmcmFtZXMsIHZvaWQqIGRhdGEpOwotICBzdGF0aWMgc2NvcGVkX3B0cjxBdWRpb0J1cz4gV3JhcE1lbW9yeShjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZGF0YSk7Ci0gIC8vIFJldHVybnMgdGhlIHJlcXVpcmVkIG1lbW9yeSBzaXplIHRvIHVzZSB0aGUgV3JhcE1lbW9yeSgpIG1ldGhvZC4KLSAgc3RhdGljIGludCBDYWxjdWxhdGVNZW1vcnlTaXplKGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zKTsKLQotICAvLyBDYWxjdWxhdGVzIHRoZSByZXF1aXJlZCBzaXplIGZvciBhbiBBdWRpb0J1cyBnaXZlbiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCi0gIC8vIGFuZCBmcmFtZXMuCi0gIHN0YXRpYyBpbnQgQ2FsY3VsYXRlTWVtb3J5U2l6ZShpbnQgY2hhbm5lbHMsIGludCBmcmFtZXMpOwotCi0gIC8vIEhlbHBlciBtZXRob2RzIGZvciBjb252ZXJ0aW5nIGFuIEF1ZGlvQnVzIGZyb20gYW5kIHRvIGludGVybGVhdmVkIGludGVnZXIKLSAgLy8gZGF0YS4gIEV4cGVjdHMgaW50ZXJsZWF2aW5nIHRvIGJlIFtjaDAsIGNoMSwgLi4uLCBjaE4sIGNoMCwgY2gxLCAuLi5dIHdpdGgKLSAgLy8gfGJ5dGVzX3Blcl9zYW1wbGV8IHBlciB2YWx1ZS4gIFZhbHVlcyBhcmUgc2NhbGVkIGFuZCBiaWFzIGNvcnJlY3RlZCBkdXJpbmcKLSAgLy8gY29udmVyc2lvbi4gIFRvSW50ZXJsZWF2ZWQoKSB3aWxsIGFsc28gY2xpcCB2YWx1ZXMgdG8gZm9ybWF0IHJhbmdlLgotICAvLyBIYW5kbGVzIHVpbnQ4LCBpbnQxNiwgYW5kIGludDMyIGN1cnJlbnRseS4gIEZyb21JbnRlcmxlYXZlZCgpIHdpbGwgemVybyBvdXQKLSAgLy8gYW55IHVuZmlsbGVkIGZyYW1lcyB3aGVuIHxmcmFtZXN8IGlzIGxlc3MgdGhhbiBmcmFtZXMoKS4KLSAgdm9pZCBGcm9tSW50ZXJsZWF2ZWQoY29uc3Qgdm9pZCogc291cmNlLCBpbnQgZnJhbWVzLCBpbnQgYnl0ZXNfcGVyX3NhbXBsZSk7Ci0gIHZvaWQgVG9JbnRlcmxlYXZlZChpbnQgZnJhbWVzLCBpbnQgYnl0ZXNfcGVyX3NhbXBsZSwgdm9pZCogZGVzdCkgY29uc3Q7Ci0gIHZvaWQgVG9JbnRlcmxlYXZlZFBhcnRpYWwoaW50IHN0YXJ0X2ZyYW1lLCBpbnQgZnJhbWVzLCBpbnQgYnl0ZXNfcGVyX3NhbXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBkZXN0KSBjb25zdDsKLQotI2lmIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLSAgLy8gVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIHdvcmsgb24gZmxvYXQgc2FtcGxlcyBpbnN0ZWFkIG9mIGludGVnZXIKLSAgLy8gc2FtcGxlcy4KLSAgLy8gRnJvbUludGVybGVhdmVkRmxvYXQgZmlsbHMgdGhlIGF1ZGlvIGJ1cyB3aXRoIGludGVybGVhdmVkIHNhbXBsZXMuIEl0IGlzCi0gIC8vIHBvc3NpYmxlIHRvIGZpbGwgZnJhbWVzIGluIHRoZSBtaWRkbGUgb2YgdGhlIGF1ZGlvIGJ1cyBieSB1c2luZyBhIG5vbi16ZXJvCi0gIC8vICJhdWRpb19idXNfb2Zmc2V0Ii4gTm90ZSB0aGF0IGl0IHdpbGwgbm90IGZpbGwgdGhlIHJlc3Qgc2FtcGxlcyB3aXRoIDAuCi0gIC8vICJmcmFtZXMiIGluZGljYXRlcyBmcmFtZSBjb3VudCBwZXIgY2hhbm5lbCBpbnN0ZWFkIG9mIHRoZSBjb21iaW5lZCBmcmFtZXMuCi0gIHZvaWQgRnJvbUludGVybGVhdmVkRmxvYXQoY29uc3QgZmxvYXQqIHNvdXJjZSwgaW50IGZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9fYnVzX29mZnNldCk7Ci0gIC8vIFRvSW50ZXJsZWF2ZWRGbG9hdCB3aWxsIGludGVybGVhdmUgZGF0YSBmcm9tIHRoZSBhdWRpbyBidXMgYW5kIHN0b3JlIHRoZW0KLSAgLy8gaW50byBkZXN0LgotICAvLyAiZnJhbWVzIiBpbmRpY2F0ZXMgZnJhbWUgY291bnQgcGVyIGNoYW5uZWwgaW5zdGVhZCBvZiB0aGUgY29tYmluZWQgZnJhbWVzLgotICAvLyBJdCBpcyBhbiBlcnJvciBpZiB0aGUgcmVxdWVzdGVkIGZyYW1lIGlzIGxhcmdlciB0aGFuIHdoYXQgdGhlIGF1ZGlvIGJ1cwotICAvLyBjYW4gb2ZmZXIuCi0gIC8vICJleHRyYV9jaGFubmVscyIgaGFzIHRvIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwLiBBIG5vbi16ZXJvIHZhbHVlCi0gIC8vIGluZGljYXRlcyB0aGF0IHRoZXJlIGFyZSBtb3JlIGNoYW5uZWxzIGluIHRoZSAiZGVzdCIgdGhhbiBpbiB0aGlzIGF1ZGlvIGJ1cwotICAvLyBhbmQgdGhleSB3aWxsIGJlIGZpbGxlZCB3aXRoIDAuCi0gIHZvaWQgVG9JbnRlcmxlYXZlZEZsb2F0KGludCBmcmFtZXMsIGludCBhdWRpb19idXNfb2Zmc2V0LCBpbnQgZXh0cmFfY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBkZXN0KSBjb25zdDsKLSNlbmRpZiAgLy8gZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotCi0gIC8vIFNpbWlsYXIgdG8gRnJvbUludGVybGVhdmVkKCkgYWJvdmUsIGJ1dCBtZWFudCBmb3Igc3RyZWFtaW5nIHNvdXJjZXMuICBEb2VzCi0gIC8vIG5vdCB6ZXJvIG91dCByZW1haW5pbmcgZnJhbWVzLCB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkb2luZyBzbyB1c2luZwotICAvLyBaZXJvRnJhbWVzUGFydGlhbCgpLiAgRnJhbWVzIGFyZSBkZWludGVybGVhdmVkIGZyb20gdGhlIHN0YXJ0IG9mIHxzb3VyY2V8Ci0gIC8vIHRvIGNoYW5uZWwoeClbc3RhcnRfZnJhbWVdLgotICB2b2lkIEZyb21JbnRlcmxlYXZlZFBhcnRpYWwoY29uc3Qgdm9pZCogc291cmNlLCBpbnQgc3RhcnRfZnJhbWUsIGludCBmcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNfcGVyX3NhbXBsZSk7Ci0KLSAgLy8gSGVscGVyIG1ldGhvZCBmb3IgY29weWluZyBjaGFubmVsIGRhdGEgZnJvbSBvbmUgQXVkaW9CdXMgdG8gYW5vdGhlci4gIEJvdGgKLSAgLy8gQXVkaW9CdXMgb2JqZWN0IG11c3QgaGF2ZSB0aGUgc2FtZSBmcmFtZXMoKSBhbmQgY2hhbm5lbHMoKS4KLSAgdm9pZCBDb3B5VG8oQXVkaW9CdXMqIGRlc3QpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgYSByYXcgcG9pbnRlciB0byB0aGUgcmVxdWVzdGVkIGNoYW5uZWwuICBQb2ludGVyIGlzIGd1YXJhbnRlZWQgdG8KLSAgLy8gaGF2ZSBhIDE2LWJ5dGUgYWxpZ25tZW50LiAgV2FybmluZzogRG8gbm90IHJlbHkgb24gaGF2aW5nIHNhbmUgKGkuZS4gbm90Ci0gIC8vIGluZiwgbmFuLCBvciBiZXR3ZWVuIFstMS4wLCAxLjBdKSB2YWx1ZXMgaW4gdGhlIGNoYW5uZWwgZGF0YS4KLSAgZmxvYXQqIGNoYW5uZWwoaW50IGNoYW5uZWwpIHsKLSAgICByZXR1cm4gY2hhbm5lbF9kYXRhX1tzdGF0aWNfY2FzdDxzaXplX3Q+KGNoYW5uZWwpXTsKLSAgfQotICBjb25zdCBmbG9hdCogY2hhbm5lbChpbnQgY2hhbm5lbCkgY29uc3QgewotICAgIHJldHVybiBjaGFubmVsX2RhdGFfW3N0YXRpY19jYXN0PHNpemVfdD4oY2hhbm5lbCldOwotICB9Ci0gIHZvaWQgU2V0Q2hhbm5lbERhdGEoaW50IGNoYW5uZWwsIGZsb2F0KiBkYXRhKTsKLQotICBpbnQgY2hhbm5lbHMoKSBjb25zdCB7Ci0gICAgRENIRUNLX0xFKGNoYW5uZWxfZGF0YV8uc2l6ZSgpLAotICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkpKTsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihjaGFubmVsX2RhdGFfLnNpemUoKSk7Ci0gIH0KLQotICBpbnQgZnJhbWVzKCkgY29uc3QgeyByZXR1cm4gZnJhbWVzXzsgfQotICB2b2lkIHNldF9mcmFtZXMoaW50IGZyYW1lcyk7Ci0KLSAgLy8gSGVscGVyIG1ldGhvZCBmb3IgemVyb2luZyBvdXQgYWxsIGNoYW5uZWxzIG9mIGF1ZGlvIGRhdGEuCi0gIHZvaWQgWmVybygpOwotICB2b2lkIFplcm9GcmFtZXMoaW50IGZyYW1lcyk7Ci0gIHZvaWQgWmVyb0ZyYW1lc1BhcnRpYWwoaW50IHN0YXJ0X2ZyYW1lLCBpbnQgZnJhbWVzKTsKLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBzY29wZWRfcHRyPEF1ZGlvQnVzPjsKLSAgfkF1ZGlvQnVzKCk7Ci0KLSAgQXVkaW9CdXMoaW50IGNoYW5uZWxzLCBpbnQgZnJhbWVzKTsKLSAgQXVkaW9CdXMoaW50IGNoYW5uZWxzLCBpbnQgZnJhbWVzLCBmbG9hdCogZGF0YSk7Ci0gIEF1ZGlvQnVzKGludCBmcmFtZXMsIGNvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0Kj4mIGNoYW5uZWxfZGF0YSk7Ci0gIGV4cGxpY2l0IEF1ZGlvQnVzKGludCBjaGFubmVscyk7Ci0KLSAgLy8gSGVscGVyIG1ldGhvZCBmb3IgYnVpbGRpbmcgfGNoYW5uZWxfZGF0YV98IGZyb20gYSBibG9jayBvZiBtZW1vcnkuICB8ZGF0YXwKLSAgLy8gbXVzdCBiZSBhdCBsZWFzdCBCbG9ja1NpemUoKSBieXRlcyBpbiBzaXplLgotICB2b2lkIEJ1aWxkQ2hhbm5lbERhdGEoaW50IGNoYW5uZWxzLCBpbnQgYWxpZ25lZF9mcmFtZSwgZmxvYXQqIGRhdGEpOwotCi0gIC8vIENvbnRpZ3VvdXMgYmxvY2sgb2YgY2hhbm5lbCBtZW1vcnkuCi0gIHNjb3BlZF9wdHJfbWFsbG9jPGZsb2F0LCBiYXNlOjpTY29wZWRQdHJBbGlnbmVkRnJlZT4gZGF0YV87Ci0KLSAgc3RkOjp2ZWN0b3I8ZmxvYXQqPiBjaGFubmVsX2RhdGFfOwotICBpbnQgZnJhbWVzXzsKLQotICAvLyBQcm90ZWN0IFNldENoYW5uZWxEYXRhKCkgYW5kIHNldF9mcmFtZXMoKSBmb3IgdXNlIGJ5IENyZWF0ZVdyYXBwZXIoKS4KLSAgYm9vbCBjYW5fc2V0X2NoYW5uZWxfZGF0YV87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEF1ZGlvQnVzKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0JBU0VfQVVESU9fQlVTX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9hdWRpb19idXNfdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvYmFzZS9hdWRpb19idXNfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiODgwMTkuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvYXVkaW9fYnVzX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlIDxsaW1pdHM+Ci0KLSNpbmNsdWRlICJiYXNlL3N0cmluZ3ByaW50Zi5oIgotI2luY2x1ZGUgImJhc2UvdGltZS5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3BhcmFtZXRlcnMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2J1cy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvY2hhbm5lbF9sYXlvdXQuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotc3RhdGljIGNvbnN0IGludCBrQ2hhbm5lbHMgPSA2Owotc3RhdGljIGNvbnN0IENoYW5uZWxMYXlvdXQga0NoYW5uZWxMYXlvdXQgPSBDSEFOTkVMX0xBWU9VVF81XzE7Ci0vLyBVc2UgYSBidWZmZXIgc2l6ZSB3aGljaCBpcyBpbnRlbnRpb25hbGx5IG5vdCBhIG11bHRpcGxlIG9mIGtDaGFubmVsQWxpZ25tZW50Lgotc3RhdGljIGNvbnN0IGludCBrRnJhbWVDb3VudCA9IG1lZGlhOjpBdWRpb0J1czo6a0NoYW5uZWxBbGlnbm1lbnQgKiAzMiAtIDE7Ci1zdGF0aWMgY29uc3QgaW50IGtTYW1wbGVSYXRlID0gNDgwMDA7Ci0KLWNsYXNzIEF1ZGlvQnVzVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gIEF1ZGlvQnVzVGVzdCgpIHt9Ci0gIH5BdWRpb0J1c1Rlc3QoKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkYXRhXy5zaXplKCk7ICsraSkKLSAgICAgIGJhc2U6OkFsaWduZWRGcmVlKGRhdGFfW2ldKTsKLSAgfQotCi0gIC8vIFZhbGlkYXRlIHBhcmFtZXRlcnMgcmV0dXJuZWQgYnkgQXVkaW9CdXMgdi5zLiB0aGUgY29uc3RydWN0ZWQgcGFyYW1ldGVycy4KLSAgdm9pZCBWZXJpZnlQYXJhbXMoQXVkaW9CdXMqIGJ1cykgewotICAgIEVYUEVDVF9FUShrQ2hhbm5lbHMsIGJ1cy0+Y2hhbm5lbHMoKSk7Ci0gICAgRVhQRUNUX0VRKGtGcmFtZUNvdW50LCBidXMtPmZyYW1lcygpKTsKLSAgfQotCi0gIHZvaWQgVmVyaWZ5VmFsdWUoY29uc3QgZmxvYXQgZGF0YVtdLCBpbnQgc2l6ZSwgZmxvYXQgdmFsdWUpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkKLSAgICAgIEFTU0VSVF9GTE9BVF9FUSh2YWx1ZSwgZGF0YVtpXSkgPDwgImk9IiA8PCBpOwotICB9Ci0KLSAgLy8gVmVyaWZ5IHZhbHVlcyBmb3IgZWFjaCBjaGFubmVsIGluIHxyZXN1bHR8IGFnYWluc3QgfGV4cGVjdGVkfC4KLSAgdm9pZCBWZXJpZnlCdXMoY29uc3QgQXVkaW9CdXMqIHJlc3VsdCwgY29uc3QgQXVkaW9CdXMqIGV4cGVjdGVkKSB7Ci0gICAgQVNTRVJUX0VRKGV4cGVjdGVkLT5jaGFubmVscygpLCByZXN1bHQtPmNoYW5uZWxzKCkpOwotICAgIEFTU0VSVF9FUShleHBlY3RlZC0+ZnJhbWVzKCksIHJlc3VsdC0+ZnJhbWVzKCkpOwotICAgIGZvciAoaW50IGNoID0gMDsgY2ggPCByZXN1bHQtPmNoYW5uZWxzKCk7ICsrY2gpIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0LT5mcmFtZXMoKTsgKytpKSB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRShiYXNlOjpTdHJpbmdQcmludGYoImNoPSVkLCBpPSVkIiwgY2gsIGkpKTsKLSAgICAgICAgQVNTRVJUX0ZMT0FUX0VRKGV4cGVjdGVkLT5jaGFubmVsKGNoKVtpXSwgcmVzdWx0LT5jaGFubmVsKGNoKVtpXSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gUmVhZCBhbmQgd3JpdGUgdG8gdGhlIGZ1bGwgZXh0ZW50IG9mIHRoZSBhbGxvY2F0ZWQgY2hhbm5lbCBkYXRhLiAgQWxzbyB0ZXN0Ci0gIC8vIHRoZSBaZXJvKCkgbWV0aG9kIGFuZCB2ZXJpZnkgaXQgZG9lcyBhcyBhZHZlcnRpc2VkLiAgQWxzbyB0ZXN0IGRhdGEgaWYgZGF0YQotICAvLyBpcyAxNi1ieXRlIGFsaWduZWQgYXMgYWR2ZXJ0aXNlZCAoc2VlIGtDaGFubmVsQWxpZ25tZW50IGluIGF1ZGlvX2J1cy5oKS4KLSAgdm9pZCBWZXJpZnlDaGFubmVsRGF0YShBdWRpb0J1cyogYnVzKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidXMtPmNoYW5uZWxzKCk7ICsraSkgewotICAgICAgQVNTRVJUX0VRKDBVLCByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oCi0gICAgICAgICAgYnVzLT5jaGFubmVsKGkpKSAmIChBdWRpb0J1czo6a0NoYW5uZWxBbGlnbm1lbnQgLSAxKSk7Ci0gICAgICBzdGQ6OmZpbGwoYnVzLT5jaGFubmVsKGkpLCBidXMtPmNoYW5uZWwoaSkgKyBidXMtPmZyYW1lcygpLCBpKTsKLSAgICB9Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1cy0+Y2hhbm5lbHMoKTsgKytpKQotICAgICAgVmVyaWZ5VmFsdWUoYnVzLT5jaGFubmVsKGkpLCBidXMtPmZyYW1lcygpLCBpKTsKLQotICAgIGJ1cy0+WmVybygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVzLT5jaGFubmVscygpOyArK2kpCi0gICAgICBWZXJpZnlWYWx1ZShidXMtPmNoYW5uZWwoaSksIGJ1cy0+ZnJhbWVzKCksIDApOwotICB9Ci0KLSAgLy8gVmVyaWZ5IGNvcHlpbmcgdG8gYW5kIGZyb20gfGJ1czF8IGFuZCB8YnVzMnwuCi0gIHZvaWQgQ29weVRlc3QoQXVkaW9CdXMqIGJ1czEsIEF1ZGlvQnVzKiBidXMyKSB7Ci0gICAgLy8gRmlsbCB8YnVzMXwgd2l0aCBkdW1teSBkYXRhLgotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVzMS0+Y2hhbm5lbHMoKTsgKytpKQotICAgICAgc3RkOjpmaWxsKGJ1czEtPmNoYW5uZWwoaSksIGJ1czEtPmNoYW5uZWwoaSkgKyBidXMxLT5mcmFtZXMoKSwgaSk7Ci0KLSAgICAvLyBWZXJpZnkgY29weSBmcm9tIHxidXMxfCB0byB8YnVzMnwuCi0gICAgYnVzMi0+WmVybygpOwotICAgIGJ1czEtPkNvcHlUbyhidXMyKTsKLSAgICBWZXJpZnlCdXMoYnVzMSwgYnVzMik7Ci0KLSAgICAvLyBWZXJpZnkgY29weSBmcm9tIHxidXMyfCB0byB8YnVzMXwuCi0gICAgYnVzMS0+WmVybygpOwotICAgIGJ1czItPkNvcHlUbyhidXMxKTsKLSAgICBWZXJpZnlCdXMoYnVzMiwgYnVzMSk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgc3RkOjp2ZWN0b3I8ZmxvYXQqPiBkYXRhXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQXVkaW9CdXNUZXN0KTsKLX07Ci0KLS8vIFZlcmlmeSBiYXNpYyBDcmVhdGUoLi4uKSBtZXRob2Qgd29ya3MgYXMgYWR2ZXJ0aXNlZC4KLVRFU1RfRihBdWRpb0J1c1Rlc3QsIENyZWF0ZSkgewotICBzY29wZWRfcHRyPEF1ZGlvQnVzPiBidXMgPSBBdWRpb0J1czo6Q3JlYXRlKGtDaGFubmVscywga0ZyYW1lQ291bnQpOwotICBWZXJpZnlQYXJhbXMoYnVzLmdldCgpKTsKLSAgVmVyaWZ5Q2hhbm5lbERhdGEoYnVzLmdldCgpKTsKLX0KLQotLy8gVmVyaWZ5IENyZWF0ZSguLi4pIHVzaW5nIEF1ZGlvUGFyYW1ldGVycyB3b3JrcyBhcyBhZHZlcnRpc2VkLgotVEVTVF9GKEF1ZGlvQnVzVGVzdCwgQ3JlYXRlVXNpbmdBdWRpb1BhcmFtZXRlcnMpIHsKLSAgc2NvcGVkX3B0cjxBdWRpb0J1cz4gYnVzID0gQXVkaW9CdXM6OkNyZWF0ZShBdWRpb1BhcmFtZXRlcnMoCi0gICAgICBBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIsIGtDaGFubmVsTGF5b3V0LCBrU2FtcGxlUmF0ZSwgMzIsCi0gICAgICBrRnJhbWVDb3VudCkpOwotICBWZXJpZnlQYXJhbXMoYnVzLmdldCgpKTsKLSAgVmVyaWZ5Q2hhbm5lbERhdGEoYnVzLmdldCgpKTsKLX0KLQotLy8gVmVyaWZ5IGFuIEF1ZGlvQnVzIGNyZWF0ZWQgdmlhIHdyYXBwaW5nIGEgdmVjdG9yIHdvcmtzIGFzIGFkdmVydGlzZWQuCi1URVNUX0YoQXVkaW9CdXNUZXN0LCBXcmFwVmVjdG9yKSB7Ci0gIGRhdGFfLnJlc2VydmUoa0NoYW5uZWxzKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQ2hhbm5lbHM7ICsraSkgewotICAgIGRhdGFfLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxmbG9hdCo+KGJhc2U6OkFsaWduZWRBbGxvYygKLSAgICAgICAgc2l6ZW9mKCpkYXRhX1tpXSkgKiBrRnJhbWVDb3VudCwgQXVkaW9CdXM6OmtDaGFubmVsQWxpZ25tZW50KSkpOwotICB9Ci0KLSAgc2NvcGVkX3B0cjxBdWRpb0J1cz4gYnVzID0gQXVkaW9CdXM6OldyYXBWZWN0b3Ioa0ZyYW1lQ291bnQsIGRhdGFfKTsKLSAgVmVyaWZ5UGFyYW1zKGJ1cy5nZXQoKSk7Ci0gIFZlcmlmeUNoYW5uZWxEYXRhKGJ1cy5nZXQoKSk7Ci19Ci0KLS8vIFZlcmlmeSBhbiBBdWRpb0J1cyBjcmVhdGVkIHZpYSB3cmFwcGluZyBhIG1lbW9yeSBibG9jayB3b3JrcyBhcyBhZHZlcnRpc2VkLgotVEVTVF9GKEF1ZGlvQnVzVGVzdCwgV3JhcE1lbW9yeSkgewotICBBdWRpb1BhcmFtZXRlcnMgcGFyYW1zKAotICAgICAgQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTElORUFSLCBrQ2hhbm5lbExheW91dCwga1NhbXBsZVJhdGUsIDMyLAotICAgICAga0ZyYW1lQ291bnQpOwotICBpbnQgZGF0YV9zaXplID0gQXVkaW9CdXM6OkNhbGN1bGF0ZU1lbW9yeVNpemUocGFyYW1zKTsKLSAgc2NvcGVkX3B0cl9tYWxsb2M8ZmxvYXQsIGJhc2U6OlNjb3BlZFB0ckFsaWduZWRGcmVlPiBkYXRhKHN0YXRpY19jYXN0PGZsb2F0Kj4oCi0gICAgICBiYXNlOjpBbGlnbmVkQWxsb2MoZGF0YV9zaXplLCBBdWRpb0J1czo6a0NoYW5uZWxBbGlnbm1lbnQpKSk7Ci0KLSAgLy8gRmlsbCB0aGUgbWVtb3J5IHdpdGggYSB0ZXN0IHZhbHVlIHdlIGNhbiBjaGVjayBmb3IgYWZ0ZXIgd3JhcHBpbmcuCi0gIHN0YXRpYyBjb25zdCBmbG9hdCBrVGVzdFZhbHVlID0gMzsKLSAgc3RkOjpmaWxsKAotICAgICAgZGF0YS5nZXQoKSwgZGF0YS5nZXQoKSArIGRhdGFfc2l6ZSAvIHNpemVvZigqZGF0YS5nZXQoKSksIGtUZXN0VmFsdWUpOwotCi0gIHNjb3BlZF9wdHI8QXVkaW9CdXM+IGJ1cyA9IEF1ZGlvQnVzOjpXcmFwTWVtb3J5KHBhcmFtcywgZGF0YS5nZXQoKSk7Ci0gIC8vIFZlcmlmeSB0aGUgdGVzdCB2YWx1ZSB3ZSBmaWxsZWQgcHJpb3IgdG8gd3JhcHBpbmcuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgYnVzLT5jaGFubmVscygpOyArK2kpCi0gICAgVmVyaWZ5VmFsdWUoYnVzLT5jaGFubmVsKGkpLCBidXMtPmZyYW1lcygpLCBrVGVzdFZhbHVlKTsKLSAgVmVyaWZ5UGFyYW1zKGJ1cy5nZXQoKSk7Ci0gIFZlcmlmeUNoYW5uZWxEYXRhKGJ1cy5nZXQoKSk7Ci0KLSAgLy8gVmVyaWZ5IHRoZSBjaGFubmVsIHZlY3RvcnMgbGllIHdpdGhpbiB0aGUgcHJvdmlkZWQgbWVtb3J5IGJsb2NrLgotICBFWFBFQ1RfR0UoYnVzLT5jaGFubmVsKDApLCBkYXRhLmdldCgpKTsKLSAgRVhQRUNUX0xFKGJ1cy0+Y2hhbm5lbChidXMtPmNoYW5uZWxzKCkgLSAxKSArIGJ1cy0+ZnJhbWVzKCksCi0gICAgICAgICAgICBkYXRhLmdldCgpICsgZGF0YV9zaXplIC8gc2l6ZW9mKCpkYXRhLmdldCgpKSk7Ci19Ci0KLS8vIFNpbXVsYXRlIGEgc2hhcmVkIG1lbW9yeSB0cmFuc2ZlciBhbmQgdmVyaWZ5IHJlc3VsdHMuCi1URVNUX0YoQXVkaW9CdXNUZXN0LCBDb3B5VG8pIHsKLSAgLy8gQ3JlYXRlIG9uZSBidXMgd2l0aCBBdWRpb1BhcmFtZXRlcnMgYW5kIHRoZSBvdGhlciB0aHJvdWdoIGRpcmVjdCB2YWx1ZXMgdG8KLSAgLy8gdGVzdCBmb3IgcGFyaXR5IGJldHdlZW4gdGhlIENyZWF0ZSgpIGZ1bmN0aW9ucy4KLSAgQXVkaW9QYXJhbWV0ZXJzIHBhcmFtcygKLSAgICAgIEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xJTkVBUiwga0NoYW5uZWxMYXlvdXQsIGtTYW1wbGVSYXRlLCAzMiwKLSAgICAgIGtGcmFtZUNvdW50KTsKLSAgc2NvcGVkX3B0cjxBdWRpb0J1cz4gYnVzMSA9IEF1ZGlvQnVzOjpDcmVhdGUoa0NoYW5uZWxzLCBrRnJhbWVDb3VudCk7Ci0gIHNjb3BlZF9wdHI8QXVkaW9CdXM+IGJ1czIgPSBBdWRpb0J1czo6Q3JlYXRlKHBhcmFtcyk7Ci0KLSAgewotICAgIFNDT1BFRF9UUkFDRSgiQ3JlYXRlZCIpOwotICAgIENvcHlUZXN0KGJ1czEuZ2V0KCksIGJ1czIuZ2V0KCkpOwotICB9Ci0gIHsKLSAgICBTQ09QRURfVFJBQ0UoIldyYXBwZWQgVmVjdG9yIik7Ci0gICAgLy8gVHJ5IGEgY29weSB0byBhbiBBdWRpb0J1cyB3cmFwcGluZyBhIHZlY3Rvci4KLSAgICBkYXRhXy5yZXNlcnZlKGtDaGFubmVscyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQ2hhbm5lbHM7ICsraSkgewotICAgICAgZGF0YV8ucHVzaF9iYWNrKHN0YXRpY19jYXN0PGZsb2F0Kj4oYmFzZTo6QWxpZ25lZEFsbG9jKAotICAgICAgICAgIHNpemVvZigqZGF0YV9baV0pICoga0ZyYW1lQ291bnQsIEF1ZGlvQnVzOjprQ2hhbm5lbEFsaWdubWVudCkpKTsKLSAgICB9Ci0KLSAgICBidXMyID0gQXVkaW9CdXM6OldyYXBWZWN0b3Ioa0ZyYW1lQ291bnQsIGRhdGFfKTsKLSAgICBDb3B5VGVzdChidXMxLmdldCgpLCBidXMyLmdldCgpKTsKLSAgfQotICB7Ci0gICAgU0NPUEVEX1RSQUNFKCJXcmFwcGVkIE1lbW9yeSIpOwotICAgIC8vIFRyeSBhIGNvcHkgdG8gYW4gQXVkaW9CdXMgd3JhcHBpbmcgYSBtZW1vcnkgYmxvY2suCi0gICAgc2NvcGVkX3B0cl9tYWxsb2M8ZmxvYXQsIGJhc2U6OlNjb3BlZFB0ckFsaWduZWRGcmVlPiBkYXRhKAotICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdCo+KGJhc2U6OkFsaWduZWRBbGxvYygKLSAgICAgICAgICAgIEF1ZGlvQnVzOjpDYWxjdWxhdGVNZW1vcnlTaXplKHBhcmFtcyksCi0gICAgICAgICAgICBBdWRpb0J1czo6a0NoYW5uZWxBbGlnbm1lbnQpKSk7Ci0KLSAgICBidXMyID0gQXVkaW9CdXM6OldyYXBNZW1vcnkocGFyYW1zLCBkYXRhLmdldCgpKTsKLSAgICBDb3B5VGVzdChidXMxLmdldCgpLCBidXMyLmdldCgpKTsKLSAgfQotfQotCi0vLyBWZXJpZnkgWmVybygpIGFuZCBaZXJvRnJhbWVzKC4uLikgdXRpbGl0eSBtZXRob2RzIHdvcmsgYXMgYWR2ZXJ0aXNlZC4KLVRFU1RfRihBdWRpb0J1c1Rlc3QsIFplcm8pIHsKLSAgc2NvcGVkX3B0cjxBdWRpb0J1cz4gYnVzID0gQXVkaW9CdXM6OkNyZWF0ZShrQ2hhbm5lbHMsIGtGcmFtZUNvdW50KTsKLQotICAvLyBGaWxsIHRoZSBidXMgd2l0aCBkdW1teSBkYXRhLgotICBmb3IgKGludCBpID0gMDsgaSA8IGJ1cy0+Y2hhbm5lbHMoKTsgKytpKQotICAgIHN0ZDo6ZmlsbChidXMtPmNoYW5uZWwoaSksIGJ1cy0+Y2hhbm5lbChpKSArIGJ1cy0+ZnJhbWVzKCksIGkgKyAxKTsKLQotICAvLyBaZXJvIGZpcnN0IGhhbGYgdGhlIGZyYW1lcyBvZiBlYWNoIGNoYW5uZWwuCi0gIGJ1cy0+WmVyb0ZyYW1lcyhrRnJhbWVDb3VudCAvIDIpOwotICBmb3IgKGludCBpID0gMDsgaSA8IGJ1cy0+Y2hhbm5lbHMoKTsgKytpKSB7Ci0gICAgU0NPUEVEX1RSQUNFKCJGaXJzdCBIYWxmIFplcm8iKTsKLSAgICBWZXJpZnlWYWx1ZShidXMtPmNoYW5uZWwoaSksIGtGcmFtZUNvdW50IC8gMiwgMCk7Ci0gICAgVmVyaWZ5VmFsdWUoYnVzLT5jaGFubmVsKGkpICsga0ZyYW1lQ291bnQgLyAyLAotICAgICAgICAgICAgICAgIGtGcmFtZUNvdW50IC0ga0ZyYW1lQ291bnQgLyAyLCBpICsgMSk7Ci0gIH0KLQotICAvLyBGaWxsIHRoZSBidXMgd2l0aCBkdW1teSBkYXRhLgotICBmb3IgKGludCBpID0gMDsgaSA8IGJ1cy0+Y2hhbm5lbHMoKTsgKytpKQotICAgIHN0ZDo6ZmlsbChidXMtPmNoYW5uZWwoaSksIGJ1cy0+Y2hhbm5lbChpKSArIGJ1cy0+ZnJhbWVzKCksIGkgKyAxKTsKLQotICAvLyBaZXJvIHRoZSBsYXN0IGhhbGYgb2YgdGhlIGZyYW1lcy4KLSAgYnVzLT5aZXJvRnJhbWVzUGFydGlhbChrRnJhbWVDb3VudCAvIDIsIGtGcmFtZUNvdW50IC0ga0ZyYW1lQ291bnQgLyAyKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBidXMtPmNoYW5uZWxzKCk7ICsraSkgewotICAgIFNDT1BFRF9UUkFDRSgiTGFzdCBIYWxmIFplcm8iKTsKLSAgICBWZXJpZnlWYWx1ZShidXMtPmNoYW5uZWwoaSkgKyBrRnJhbWVDb3VudCAvIDIsCi0gICAgICAgICAgICAgICAga0ZyYW1lQ291bnQgLSBrRnJhbWVDb3VudCAvIDIsIDApOwotICAgIFZlcmlmeVZhbHVlKGJ1cy0+Y2hhbm5lbChpKSwga0ZyYW1lQ291bnQgLyAyLCBpICsgMSk7Ci0gIH0KLQotICAvLyBGaWxsIHRoZSBidXMgd2l0aCBkdW1teSBkYXRhLgotICBmb3IgKGludCBpID0gMDsgaSA8IGJ1cy0+Y2hhbm5lbHMoKTsgKytpKQotICAgIHN0ZDo6ZmlsbChidXMtPmNoYW5uZWwoaSksIGJ1cy0+Y2hhbm5lbChpKSArIGJ1cy0+ZnJhbWVzKCksIGkgKyAxKTsKLQotICAvLyBaZXJvIGFsbCB0aGUgZnJhbWVzIG9mIGVhY2ggY2hhbm5lbC4KLSAgYnVzLT5aZXJvKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgYnVzLT5jaGFubmVscygpOyArK2kpIHsKLSAgICBTQ09QRURfVFJBQ0UoIkFsbCBaZXJvIik7Ci0gICAgVmVyaWZ5VmFsdWUoYnVzLT5jaGFubmVsKGkpLCBidXMtPmZyYW1lcygpLCAwKTsKLSAgfQotfQotCi0vLyBFYWNoIHRlc3QgdmVjdG9yIHJlcHJlc2VudHMgdHdvIGNoYW5uZWxzIG9mIGRhdGEgaW4gdGhlIGZvbGxvd2luZyBhcmJpdHJhcnkKLS8vIGxheW91dDogPG1pbiwgemVybywgbWF4LCBtaW4sIHplcm8sIG1heCwgemVybywgemVybz4uCi1zdGF0aWMgY29uc3QgaW50IGtUZXN0VmVjdG9yU2l6ZSA9IDg7Ci1zdGF0aWMgY29uc3QgdWludDgga1Rlc3RWZWN0b3JVaW50OFtrVGVzdFZlY3RvclNpemVdID0gewotICAgIDAsIC1raW50OG1pbiwga3VpbnQ4bWF4LCAwLCAta2ludDhtaW4sIGt1aW50OG1heCwgLWtpbnQ4bWluLCAta2ludDhtaW4gfTsKLXN0YXRpYyBjb25zdCBpbnQxNiBrVGVzdFZlY3RvckludDE2W2tUZXN0VmVjdG9yU2l6ZV0gPSB7Ci0gICAga2ludDE2bWluLCAwLCBraW50MTZtYXgsIGtpbnQxNm1pbiwgMCwga2ludDE2bWF4LCAwLCAwIH07Ci1zdGF0aWMgY29uc3QgaW50MzIga1Rlc3RWZWN0b3JJbnQzMltrVGVzdFZlY3RvclNpemVdID0gewotICAgIGtpbnQzMm1pbiwgMCwga2ludDMybWF4LCBraW50MzJtaW4sIDAsIGtpbnQzMm1heCwgMCwgMCB9OwotCi0vLyBFeHBlY3RlZCByZXN1bHRzLgotc3RhdGljIGNvbnN0IGludCBrVGVzdFZlY3RvckZyYW1lcyA9IGtUZXN0VmVjdG9yU2l6ZSAvIDI7Ci1zdGF0aWMgY29uc3QgZmxvYXQga1Rlc3RWZWN0b3JSZXN1bHRbXVtrVGVzdFZlY3RvckZyYW1lc10gPSB7Ci0gICAgeyAtMSwgMSwgMCwgMCB9LCB7IDAsIC0xLCAxLCAwIH19Owotc3RhdGljIGNvbnN0IGludCBrVGVzdFZlY3RvckNoYW5uZWxzID0gYXJyYXlzaXplKGtUZXN0VmVjdG9yUmVzdWx0KTsKLQotLy8gVmVyaWZ5IEZyb21JbnRlcmxlYXZlZCgpIGRlaW50ZXJsZWF2ZXMgYXVkaW8gaW4gc3VwcG9ydGVkIGZvcm1hdHMgY29ycmVjdGx5LgotVEVTVF9GKEF1ZGlvQnVzVGVzdCwgRnJvbUludGVybGVhdmVkKSB7Ci0gIHNjb3BlZF9wdHI8QXVkaW9CdXM+IGJ1cyA9IEF1ZGlvQnVzOjpDcmVhdGUoCi0gICAgICBrVGVzdFZlY3RvckNoYW5uZWxzLCBrVGVzdFZlY3RvckZyYW1lcyk7Ci0gIHNjb3BlZF9wdHI8QXVkaW9CdXM+IGV4cGVjdGVkID0gQXVkaW9CdXM6OkNyZWF0ZSgKLSAgICAgIGtUZXN0VmVjdG9yQ2hhbm5lbHMsIGtUZXN0VmVjdG9yRnJhbWVzKTsKLSAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IGtUZXN0VmVjdG9yQ2hhbm5lbHM7ICsrY2gpIHsKLSAgICBtZW1jcHkoZXhwZWN0ZWQtPmNoYW5uZWwoY2gpLCBrVGVzdFZlY3RvclJlc3VsdFtjaF0sCi0gICAgICAgICAgIGtUZXN0VmVjdG9yRnJhbWVzICogc2l6ZW9mKCpleHBlY3RlZC0+Y2hhbm5lbChjaCkpKTsKLSAgfQotICB7Ci0gICAgU0NPUEVEX1RSQUNFKCJ1aW50OCIpOwotICAgIGJ1cy0+WmVybygpOwotICAgIGJ1cy0+RnJvbUludGVybGVhdmVkKAotICAgICAgICBrVGVzdFZlY3RvclVpbnQ4LCBrVGVzdFZlY3RvckZyYW1lcywgc2l6ZW9mKCprVGVzdFZlY3RvclVpbnQ4KSk7Ci0gICAgVmVyaWZ5QnVzKGJ1cy5nZXQoKSwgZXhwZWN0ZWQuZ2V0KCkpOwotICB9Ci0gIHsKLSAgICBTQ09QRURfVFJBQ0UoImludDE2Iik7Ci0gICAgYnVzLT5aZXJvKCk7Ci0gICAgYnVzLT5Gcm9tSW50ZXJsZWF2ZWQoCi0gICAgICAgIGtUZXN0VmVjdG9ySW50MTYsIGtUZXN0VmVjdG9yRnJhbWVzLCBzaXplb2YoKmtUZXN0VmVjdG9ySW50MTYpKTsKLSAgICBWZXJpZnlCdXMoYnVzLmdldCgpLCBleHBlY3RlZC5nZXQoKSk7Ci0gIH0KLSAgewotICAgIFNDT1BFRF9UUkFDRSgiaW50MzIiKTsKLSAgICBidXMtPlplcm8oKTsKLSAgICBidXMtPkZyb21JbnRlcmxlYXZlZCgKLSAgICAgICAga1Rlc3RWZWN0b3JJbnQzMiwga1Rlc3RWZWN0b3JGcmFtZXMsIHNpemVvZigqa1Rlc3RWZWN0b3JJbnQzMikpOwotICAgIFZlcmlmeUJ1cyhidXMuZ2V0KCksIGV4cGVjdGVkLmdldCgpKTsKLSAgfQotfQotCi0vLyBWZXJpZnkgRnJvbUludGVybGVhdmVkUGFydGlhbCgpIGRlaW50ZXJsZWF2ZXMgYXVkaW8gY29ycmVjdGx5LgotVEVTVF9GKEF1ZGlvQnVzVGVzdCwgRnJvbUludGVybGVhdmVkUGFydGlhbCkgewotICAvLyBPbmx5IGRlaW50ZXJsZWF2ZSB0aGUgbWlkZGxlIHR3byBmcmFtZXMgaW4gZWFjaCBjaGFubmVsLgotICBzdGF0aWMgY29uc3QgaW50IGtQYXJ0aWFsU3RhcnQgPSAxOwotICBzdGF0aWMgY29uc3QgaW50IGtQYXJ0aWFsRnJhbWVzID0gMjsKLSAgQVNTRVJUX0xFKGtQYXJ0aWFsU3RhcnQgKyBrUGFydGlhbEZyYW1lcywga1Rlc3RWZWN0b3JGcmFtZXMpOwotCi0gIHNjb3BlZF9wdHI8QXVkaW9CdXM+IGJ1cyA9IEF1ZGlvQnVzOjpDcmVhdGUoCi0gICAgICBrVGVzdFZlY3RvckNoYW5uZWxzLCBrVGVzdFZlY3RvckZyYW1lcyk7Ci0gIHNjb3BlZF9wdHI8QXVkaW9CdXM+IGV4cGVjdGVkID0gQXVkaW9CdXM6OkNyZWF0ZSgKLSAgICAgIGtUZXN0VmVjdG9yQ2hhbm5lbHMsIGtUZXN0VmVjdG9yRnJhbWVzKTsKLSAgZXhwZWN0ZWQtPlplcm8oKTsKLSAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IGtUZXN0VmVjdG9yQ2hhbm5lbHM7ICsrY2gpIHsKLSAgICBtZW1jcHkoZXhwZWN0ZWQtPmNoYW5uZWwoY2gpICsga1BhcnRpYWxTdGFydCwKLSAgICAgICAgICAga1Rlc3RWZWN0b3JSZXN1bHRbY2hdICsga1BhcnRpYWxTdGFydCwKLSAgICAgICAgICAga1BhcnRpYWxGcmFtZXMgKiBzaXplb2YoKmV4cGVjdGVkLT5jaGFubmVsKGNoKSkpOwotICB9Ci0KLSAgYnVzLT5aZXJvKCk7Ci0gIGJ1cy0+RnJvbUludGVybGVhdmVkUGFydGlhbCgKLSAgICAgIGtUZXN0VmVjdG9ySW50MzIgKyBrUGFydGlhbFN0YXJ0ICogYnVzLT5jaGFubmVscygpLCBrUGFydGlhbFN0YXJ0LAotICAgICAga1BhcnRpYWxGcmFtZXMsIHNpemVvZigqa1Rlc3RWZWN0b3JJbnQzMikpOwotICBWZXJpZnlCdXMoYnVzLmdldCgpLCBleHBlY3RlZC5nZXQoKSk7Ci19Ci0KLS8vIFZlcmlmeSBUb0ludGVybGVhdmVkKCkgaW50ZXJsZWF2ZXMgYXVkaW8gaW4gc3Vwb3J0ZWQgZm9ybWF0cyBjb3JyZWN0bHkuCi1URVNUX0YoQXVkaW9CdXNUZXN0LCBUb0ludGVybGVhdmVkKSB7Ci0gIHNjb3BlZF9wdHI8QXVkaW9CdXM+IGJ1cyA9IEF1ZGlvQnVzOjpDcmVhdGUoCi0gICAgICBrVGVzdFZlY3RvckNoYW5uZWxzLCBrVGVzdFZlY3RvckZyYW1lcyk7Ci0gIC8vIEZpbGwgdGhlIGJ1cyB3aXRoIG91ciB0ZXN0IHZlY3Rvci4KLSAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IGtUZXN0VmVjdG9yQ2hhbm5lbHM7ICsrY2gpIHsKLSAgICBtZW1jcHkoYnVzLT5jaGFubmVsKGNoKSwga1Rlc3RWZWN0b3JSZXN1bHRbY2hdLAotICAgICAgICAgICBrVGVzdFZlY3RvckZyYW1lcyAqIHNpemVvZigqYnVzLT5jaGFubmVsKGNoKSkpOwotICB9Ci0gIHsKLSAgICBTQ09QRURfVFJBQ0UoInVpbnQ4Iik7Ci0gICAgdWludDggdGVzdF9hcnJheVthcnJheXNpemUoa1Rlc3RWZWN0b3JVaW50OCldOwotICAgIGJ1cy0+VG9JbnRlcmxlYXZlZChidXMtPmZyYW1lcygpLCBzaXplb2YoKmtUZXN0VmVjdG9yVWludDgpLCB0ZXN0X2FycmF5KTsKLSAgICBBU1NFUlRfRVEobWVtY21wKAotICAgICAgICB0ZXN0X2FycmF5LCBrVGVzdFZlY3RvclVpbnQ4LCBhcnJheXNpemUoa1Rlc3RWZWN0b3JVaW50OCkpLCAwKTsKLSAgfQotICB7Ci0gICAgU0NPUEVEX1RSQUNFKCJpbnQxNiIpOwotICAgIGludDE2IHRlc3RfYXJyYXlbYXJyYXlzaXplKGtUZXN0VmVjdG9ySW50MTYpXTsKLSAgICBidXMtPlRvSW50ZXJsZWF2ZWQoYnVzLT5mcmFtZXMoKSwgc2l6ZW9mKCprVGVzdFZlY3RvckludDE2KSwgdGVzdF9hcnJheSk7Ci0gICAgQVNTRVJUX0VRKG1lbWNtcCgKLSAgICAgICAgdGVzdF9hcnJheSwga1Rlc3RWZWN0b3JJbnQxNiwgYXJyYXlzaXplKGtUZXN0VmVjdG9ySW50MTYpKSwgMCk7Ci0gIH0KLSAgewotICAgIFNDT1BFRF9UUkFDRSgiaW50MzIiKTsKLSAgICBpbnQzMiB0ZXN0X2FycmF5W2FycmF5c2l6ZShrVGVzdFZlY3RvckludDMyKV07Ci0gICAgYnVzLT5Ub0ludGVybGVhdmVkKGJ1cy0+ZnJhbWVzKCksIHNpemVvZigqa1Rlc3RWZWN0b3JJbnQzMiksIHRlc3RfYXJyYXkpOwotICAgIEFTU0VSVF9FUShtZW1jbXAoCi0gICAgICAgIHRlc3RfYXJyYXksIGtUZXN0VmVjdG9ySW50MzIsIGFycmF5c2l6ZShrVGVzdFZlY3RvckludDMyKSksIDApOwotICB9Ci19Ci0KLS8vIFZlcmlmeSBUb0ludGVybGVhdmVkUGFydGlhbCgpIGludGVybGVhdmVzIGF1ZGlvIGNvcnJlY3RseS4KLVRFU1RfRihBdWRpb0J1c1Rlc3QsIFRvSW50ZXJsZWF2ZWRQYXJ0aWFsKSB7Ci0gIC8vIE9ubHkgaW50ZXJsZWF2ZSB0aGUgbWlkZGxlIHR3byBmcmFtZXMgaW4gZWFjaCBjaGFubmVsLgotICBzdGF0aWMgY29uc3QgaW50IGtQYXJ0aWFsU3RhcnQgPSAxOwotICBzdGF0aWMgY29uc3QgaW50IGtQYXJ0aWFsRnJhbWVzID0gMjsKLSAgQVNTRVJUX0xFKGtQYXJ0aWFsU3RhcnQgKyBrUGFydGlhbEZyYW1lcywga1Rlc3RWZWN0b3JGcmFtZXMpOwotCi0gIHNjb3BlZF9wdHI8QXVkaW9CdXM+IGV4cGVjdGVkID0gQXVkaW9CdXM6OkNyZWF0ZSgKLSAgICAgIGtUZXN0VmVjdG9yQ2hhbm5lbHMsIGtUZXN0VmVjdG9yRnJhbWVzKTsKLSAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IGtUZXN0VmVjdG9yQ2hhbm5lbHM7ICsrY2gpIHsKLSAgICBtZW1jcHkoZXhwZWN0ZWQtPmNoYW5uZWwoY2gpLCBrVGVzdFZlY3RvclJlc3VsdFtjaF0sCi0gICAgICAgICAgIGtUZXN0VmVjdG9yRnJhbWVzICogc2l6ZW9mKCpleHBlY3RlZC0+Y2hhbm5lbChjaCkpKTsKLSAgfQotCi0gIGludDE2IHRlc3RfYXJyYXlbYXJyYXlzaXplKGtUZXN0VmVjdG9ySW50MTYpXTsKLSAgZXhwZWN0ZWQtPlRvSW50ZXJsZWF2ZWRQYXJ0aWFsKAotICAgICAga1BhcnRpYWxTdGFydCwga1BhcnRpYWxGcmFtZXMsIHNpemVvZigqa1Rlc3RWZWN0b3JJbnQxNiksIHRlc3RfYXJyYXkpOwotICBBU1NFUlRfRVEobWVtY21wKAotICAgICAgdGVzdF9hcnJheSwga1Rlc3RWZWN0b3JJbnQxNiArIGtQYXJ0aWFsU3RhcnQgKiBrVGVzdFZlY3RvckNoYW5uZWxzLAotICAgICAga1BhcnRpYWxGcmFtZXMgKiBzaXplb2YoKmtUZXN0VmVjdG9ySW50MTYpKSwgMCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvYXVkaW9fY2FwdHVyZXJfc291cmNlLmggYi9zcmMvbWVkaWEvYmFzZS9hdWRpb19jYXB0dXJlcl9zb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYxMTAyNS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9hdWRpb19jYXB0dXJlcl9zb3VyY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfQkFTRV9BVURJT19DQVBUVVJFUl9TT1VSQ0VfSF8KLSNkZWZpbmUgTUVESUFfQkFTRV9BVURJT19DQVBUVVJFUl9TT1VSQ0VfSF8KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3BhcmFtZXRlcnMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2J1cy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIEF1ZGlvQ2FwdHVyZXJTb3VyY2UgaXMgYW4gaW50ZXJmYWNlIHJlcHJlc2VudGluZyB0aGUgc291cmNlIGZvcgotLy8gY2FwdHVyZWQgYXVkaW8uICBBbiBpbXBsZW1lbnRhdGlvbiB3aWxsIHBlcmlvZGljYWxseSBjYWxsIENhcHR1cmUoKSBvbiBhCi0vLyBjYWxsYmFjayBvYmplY3QuCi1jbGFzcyBBdWRpb0NhcHR1cmVyU291cmNlCi0gICAgOiBwdWJsaWMgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8bWVkaWE6OkF1ZGlvQ2FwdHVyZXJTb3VyY2U+IHsKLSBwdWJsaWM6Ci0gIGNsYXNzIENhcHR1cmVDYWxsYmFjayB7Ci0gICBwdWJsaWM6Ci0gICAgLy8gQ2FsbGJhY2sgdG8gZGVsaXZlciB0aGUgY2FwdHVyZWQgZGF0YSBmcm9tIHRoZSBPUy4KLSAgICB2aXJ0dWFsIHZvaWQgQ2FwdHVyZShBdWRpb0J1cyogYXVkaW9fc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb19kZWxheV9taWxsaXNlY29uZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZvbHVtZSkgPSAwOwotCi0gICAgLy8gU2lnbmFscyBhbiBlcnJvciBoYXMgb2NjdXJyZWQuCi0gICAgdmlydHVhbCB2b2lkIE9uQ2FwdHVyZUVycm9yKCkgPSAwOwotCi0gICBwcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+Q2FwdHVyZUNhbGxiYWNrKCkge30KLSAgfTsKLQotICBjbGFzcyBDYXB0dXJlRXZlbnRIYW5kbGVyIHsKLSAgIHB1YmxpYzoKLSAgICAvLyBOb3RpZmljYXRpb24gdG8gdGhlIGNsaWVudCB0aGF0IHRoZSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWMgfGRldmljZV9pZHwKLSAgICAvLyBoYXMgYmVlbiBzdGFydGVkLgotICAgIHZpcnR1YWwgdm9pZCBPbkRldmljZVN0YXJ0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9pZCkgPSAwOwotCi0gICAgLy8gTm90aWZpY2F0aW9uIHRvIHRoZSBjbGllbnQgdGhhdCB0aGUgZGV2aWNlIGhhcyBiZWVuIHN0b3BwZWQuCi0gICAgdmlydHVhbCB2b2lkIE9uRGV2aWNlU3RvcHBlZCgpID0gMDsKLQotICAgcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkNhcHR1cmVFdmVudEhhbmRsZXIoKSB7fQotICB9OwotCi0gIC8vIFNldHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGF1ZGlvIHN0cmVhbSBmb3JtYXQgYW5kIHRoZSBkZXZpY2UKLSAgLy8gdG8gYmUgdXNlZC4gSXQgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvZiB0aGUgb3RoZXIgbWV0aG9kcy4KLSAgLy8gVE9ETyh4aWFucyk6IEFkZCB8ZGV2aWNlX2lkfCB0byB0aGlzIEluaXRpYWxpemUoKSBmdW5jdGlvbi4KLSAgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVDYWxsYmFjayogY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVFdmVudEhhbmRsZXIqIGV2ZW50X2hhbmRsZXIpID0gMDsKLQotICAvLyBTdGFydHMgdGhlIGF1ZGlvIHJlY29yZGluZy4KLSAgdmlydHVhbCB2b2lkIFN0YXJ0KCkgPSAwOwotCi0gIC8vIFN0b3BzIHRoZSBhdWRpbyByZWNvcmRpbmcuIFRoaXMgQVBJIGlzIHN5bmNocm9ub3VzLCBhbmQgbm8gbW9yZSBkYXRhCi0gIC8vIGNhbGxiYWNrIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBjbGllbnQgYWZ0ZXIgaXQgaXMgYmVpbmcgY2FsbGVkLgotICB2aXJ0dWFsIHZvaWQgU3RvcCgpID0gMDsKLQotICAvLyBTZXRzIHRoZSBjYXB0dXJlIHZvbHVtZSwgd2l0aCByYW5nZSBbMC4wLCAxLjBdIGluY2x1c2l2ZS4KLSAgdmlydHVhbCB2b2lkIFNldFZvbHVtZShkb3VibGUgdm9sdW1lKSA9IDA7Ci0KLSAgLy8gU3BlY2lmaWVzIHRoZSB8c2Vzc2lvbl9pZHwgdG8gcXVlcnkgd2hpY2ggZGV2aWNlIHRvIHVzZS4KLSAgLy8gVE9ETyh4aWFucyk6IENoYW5nZSB0aGUgaW50ZXJmYWNlIHRvIFNldERldmljZShjb25zdCBzdGQ6OnN0cmluZyYpLgotICB2aXJ0dWFsIHZvaWQgU2V0RGV2aWNlKGludCBzZXNzaW9uX2lkKSA9IDA7Ci0KLSAgLy8gRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgV2ViUnRjIEFHQyBjb250cm9sLgotICB2aXJ0dWFsIHZvaWQgU2V0QXV0b21hdGljR2FpbkNvbnRyb2woYm9vbCBlbmFibGUpID0gMDsKLQotIHByb3RlY3RlZDoKLSAgZnJpZW5kIGNsYXNzIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPEF1ZGlvQ2FwdHVyZXJTb3VyY2U+OwotICB2aXJ0dWFsIH5BdWRpb0NhcHR1cmVyU291cmNlKCkge30KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0JBU0VfQVVESU9fQ0FQVFVSRVJfU09VUkNFX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9hdWRpb19kZWNvZGVyLmNjIGIvc3JjL21lZGlhL2Jhc2UvYXVkaW9fZGVjb2Rlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM5MDY2MC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9hdWRpb19kZWNvZGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fZGVjb2Rlci5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1BdWRpb0RlY29kZXI6OkF1ZGlvRGVjb2RlcigpIHt9Ci0KLUF1ZGlvRGVjb2Rlcjo6fkF1ZGlvRGVjb2RlcigpIHt9Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvYXVkaW9fZGVjb2Rlci5oIGIvc3JjL21lZGlhL2Jhc2UvYXVkaW9fZGVjb2Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmNmZTRhLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfQkFTRV9BVURJT19ERUNPREVSX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfQVVESU9fREVDT0RFUl9IXwotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9jaGFubmVsX2xheW91dC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvcGlwZWxpbmVfc3RhdHVzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgQnVmZmVyOwotY2xhc3MgRGVtdXhlclN0cmVhbTsKLQotY2xhc3MgTUVESUFfRVhQT1JUIEF1ZGlvRGVjb2RlcgotICAgIDogcHVibGljIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPEF1ZGlvRGVjb2Rlcj4gewotIHB1YmxpYzoKLSAgLy8gU3RhdHVzIGNvZGVzIGZvciByZWFkIG9wZXJhdGlvbnMuCi0gIGVudW0gU3RhdHVzIHsKLSAgICBrT2ssCi0gICAga0Fib3J0ZWQsCi0gICAga0RlY29kZUVycm9yLAotICB9OwotICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHNjb3BlZF9yZWZwdHI8QnVmZmVyPiA+IEJ1ZmZlcnM7Ci0KLSAgLy8gSW5pdGlhbGl6ZSBhbiBBdWRpb0RlY29kZXIgd2l0aCB0aGUgZ2l2ZW4gRGVtdXhlclN0cmVhbSwgZXhlY3V0aW5nIHRoZQotICAvLyBjYWxsYmFjayB1cG9uIGNvbXBsZXRpb24uCi0gIC8vIHN0YXRpc3RpY3NfY2IgaXMgdXNlZCB0byB1cGRhdGUgZ2xvYmFsIHBpcGVsaW5lIHN0YXRpc3RpY3MuCi0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4mIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc3RhdHVzX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0aXN0aWNzQ0ImIHN0YXRpc3RpY3NfY2IpID0gMDsKLQotICAvLyBSZXF1ZXN0IHNhbXBsZXMgdG8gYmUgZGVjb2RlZCBhbmQgcmV0dXJuZWQgdmlhIHRoZSBwcm92aWRlZCBjYWxsYmFjay4KLSAgLy8gT25seSBvbmUgcmVhZCBtYXkgYmUgaW4gZmxpZ2h0IGF0IGFueSBnaXZlbiB0aW1lLgotICAvLwotICAvLyBJbXBsZW1lbnRhdGlvbnMgZ3VhcmFudGVlIHRoYXQgdGhlIGNhbGxiYWNrIHdpbGwgbm90IGJlIGNhbGxlZCBmcm9tIHdpdGhpbgotICAvLyB0aGlzIG1ldGhvZC4KLSAgLy8KLSAgLy8gTm9uLU5VTEwgc2FtcGxlIGJ1ZmZlciBwb2ludGVycyB3aWxsIGNvbnRhaW4gZGVjb2RlZCBhdWRpbyBkYXRhIG9yIG1heQotICAvLyBpbmRpY2F0ZSB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uIEEgTlVMTCBidWZmZXIgcG9pbnRlciBpbmRpY2F0ZXMgYW4gYWJvcnRlZAotICAvLyBSZWFkKCkuIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgRGVtdXhlclN0cmVhbSBnZXRzIGZsdXNoZWQgYW5kIGRvZXNuJ3QgaGF2ZQotICAvLyBhbnkgbW9yZSBkYXRhIHRvIHJldHVybi4KLSNpZiAhZGVmaW5lZChDT0JBTFQpICYmICFkZWZpbmVkKF9fTEJfU0hFTExfXykKLSAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKFN0YXR1cywgY29uc3Qgc2NvcGVkX3JlZnB0cjxCdWZmZXI+Jik+IFJlYWRDQjsKLSNlbHNlICAgLy8gIWRlZmluZWQoQ09CQUxUKSAmJiAhZGVmaW5lZChfX0xCX1NIRUxMX18pCi0gIC8vIFRoaXMgaXMgYSB2YXJpYW50IG9mIHRoZSBhYm92ZSBjYWxsYmFjayB0aGF0IGNhbiBwYXNzIG11bHRpcGxlIGRlY29kZWQKLSAgLy8gYXVkaW8gYnVmZmVycyBhdCBvbmNlLiAgTm9uLWVtcHR5IHNhbXBsZSBidWZmZXJzIHdpbGwgY29udGFpbiBkZWNvZGVkIGF1ZGlvCi0gIC8vIGRhdGEgb3IgbWF5IGluZGljYXRlIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gIEVtcHR5IGJ1ZmZlcnMgaW5kaWNhdGUgYW4KLSAgLy8gYWJvcnRlZCBSZWFkKCkuIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgRGVtdXhlclN0cmVhbSBnZXRzIGZsdXNoZWQgYW5kCi0gIC8vIGRvZXNuJ3QgaGF2ZSBhbnkgbW9yZSBkYXRhIHRvIHJldHVybi4KLSAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKFN0YXR1cywgY29uc3QgQnVmZmVycyYpPiBSZWFkQ0I7Ci0jZW5kaWYgIC8vICFkZWZpbmVkKENPQkFMVCkgJiYgIWRlZmluZWQoX19MQl9TSEVMTF9fKQotICB2aXJ0dWFsIHZvaWQgUmVhZChjb25zdCBSZWFkQ0ImIHJlYWRfY2IpID0gMDsKLQotICAvLyBSZXNldCBkZWNvZGVyIHN0YXRlLCBkcm9wcGluZyBhbnkgcXVldWVkIGVuY29kZWQgZGF0YS4KLSAgdmlydHVhbCB2b2lkIFJlc2V0KGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNsb3N1cmUpID0gMDsKLQotICAvLyBSZXR1cm5zIHZhcmlvdXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRlY29kZWQgYXVkaW8gZm9ybWF0LgotICB2aXJ0dWFsIGludCBiaXRzX3Blcl9jaGFubmVsKCkgPSAwOwotICB2aXJ0dWFsIENoYW5uZWxMYXlvdXQgY2hhbm5lbF9sYXlvdXQoKSA9IDA7Ci0gIHZpcnR1YWwgaW50IHNhbXBsZXNfcGVyX3NlY29uZCgpID0gMDsKLQotIHByb3RlY3RlZDoKLSAgZnJpZW5kIGNsYXNzIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPEF1ZGlvRGVjb2Rlcj47Ci0gIHZpcnR1YWwgfkF1ZGlvRGVjb2RlcigpOwotICBBdWRpb0RlY29kZXIoKTsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBdWRpb0RlY29kZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQkFTRV9BVURJT19ERUNPREVSX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9hdWRpb19kZWNvZGVyX2NvbmZpZy5jYyBiL3NyYy9tZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDMzNWRiLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmgiCi0KLSNpbmNsdWRlIDxzc3RyZWFtPgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXRyaWNzL2hpc3RvZ3JhbS5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3NhbXBsZV9yYXRlcy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbGltaXRzLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLUF1ZGlvRGVjb2RlckNvbmZpZzo6QXVkaW9EZWNvZGVyQ29uZmlnKCkKLSAgICA6IGNvZGVjXyhrVW5rbm93bkF1ZGlvQ29kZWMpLAotICAgICAgYml0c19wZXJfY2hhbm5lbF8oMCksCi0gICAgICBjaGFubmVsX2xheW91dF8oQ0hBTk5FTF9MQVlPVVRfVU5TVVBQT1JURUQpLAotICAgICAgc2FtcGxlc19wZXJfc2Vjb25kXygwKSwKLSAgICAgIGJ5dGVzX3Blcl9mcmFtZV8oMCksCi0gICAgICBleHRyYV9kYXRhX3NpemVfKDApLAotICAgICAgaXNfZW5jcnlwdGVkXyhmYWxzZSkgewotfQotCi1BdWRpb0RlY29kZXJDb25maWc6OkF1ZGlvRGVjb2RlckNvbmZpZyhBdWRpb0NvZGVjIGNvZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHNfcGVyX2NoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsTGF5b3V0IGNoYW5uZWxfbGF5b3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZXNfcGVyX3NlY29uZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBleHRyYV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGV4dHJhX2RhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZW5jcnlwdGVkKSB7Ci0gIEluaXRpYWxpemUoY29kZWMsIGJpdHNfcGVyX2NoYW5uZWwsIGNoYW5uZWxfbGF5b3V0LCBzYW1wbGVzX3Blcl9zZWNvbmQsCi0gICAgICAgICAgICAgZXh0cmFfZGF0YSwgZXh0cmFfZGF0YV9zaXplLCBpc19lbmNyeXB0ZWQsIHRydWUpOwotfQotCi12b2lkIEF1ZGlvRGVjb2RlckNvbmZpZzo6SW5pdGlhbGl6ZShBdWRpb0NvZGVjIGNvZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHNfcGVyX2NoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsTGF5b3V0IGNoYW5uZWxfbGF5b3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZXNfcGVyX3NlY29uZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBleHRyYV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGV4dHJhX2RhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZW5jcnlwdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWNvcmRfc3RhdHMpIHsKLSAgQ0hFQ0soKGV4dHJhX2RhdGFfc2l6ZSAhPSAwKSA9PSAoZXh0cmFfZGF0YSAhPSBOVUxMKSk7Ci0KLSAgaWYgKHJlY29yZF9zdGF0cykgewotICAgIFVNQV9ISVNUT0dSQU1fRU5VTUVSQVRJT04oIk1lZGlhLkF1ZGlvQ29kZWMiLCBjb2RlYywga0F1ZGlvQ29kZWNNYXggKyAxKTsKLSAgICAvLyBGYWtlIGVudW0gaGlzdG9ncmFtIHRvIGdldCBleGFjdCBpbnRlZ3JhbCBidWNrZXRzLiAgRXhwZWN0IHRvIG5ldmVyIHNlZQotICAgIC8vIGFueSB2YWx1ZXMgb3ZlciAzMiBhbmQgZXZlbiB0aGF0IGlzIGh1Z2UuCi0gICAgVU1BX0hJU1RPR1JBTV9FTlVNRVJBVElPTigiTWVkaWEuQXVkaW9CaXRzUGVyQ2hhbm5lbCIsIGJpdHNfcGVyX2NoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCk7Ci0gICAgVU1BX0hJU1RPR1JBTV9FTlVNRVJBVElPTigiTWVkaWEuQXVkaW9DaGFubmVsTGF5b3V0IiwgY2hhbm5lbF9sYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX0xBWU9VVF9NQVgpOwotICAgIEF1ZGlvU2FtcGxlUmF0ZSBhc3IgPSBtZWRpYTo6QXNBdWRpb1NhbXBsZVJhdGUoc2FtcGxlc19wZXJfc2Vjb25kKTsKLSAgICBpZiAoYXNyICE9IGtVbmV4cGVjdGVkQXVkaW9TYW1wbGVSYXRlKSB7Ci0gICAgICBVTUFfSElTVE9HUkFNX0VOVU1FUkFUSU9OKCJNZWRpYS5BdWRpb1NhbXBsZXNQZXJTZWNvbmQiLCBhc3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtVbmV4cGVjdGVkQXVkaW9TYW1wbGVSYXRlKTsKLSAgICB9IGVsc2UgewotICAgICAgVU1BX0hJU1RPR1JBTV9DT1VOVFMoCi0gICAgICAgICAgIk1lZGlhLkF1ZGlvU2FtcGxlc1BlclNlY29uZFVuZXhwZWN0ZWQiLCBzYW1wbGVzX3Blcl9zZWNvbmQpOwotICAgIH0KLSAgfQotCi0gIGNvZGVjXyA9IGNvZGVjOwotICBiaXRzX3Blcl9jaGFubmVsXyA9IGJpdHNfcGVyX2NoYW5uZWw7Ci0gIGNoYW5uZWxfbGF5b3V0XyA9IGNoYW5uZWxfbGF5b3V0OwotICBzYW1wbGVzX3Blcl9zZWNvbmRfID0gc2FtcGxlc19wZXJfc2Vjb25kOwotICBleHRyYV9kYXRhX3NpemVfID0gZXh0cmFfZGF0YV9zaXplOwotCi0gIGlmIChleHRyYV9kYXRhX3NpemVfID4gMCkgewotICAgIGV4dHJhX2RhdGFfLnJlc2V0KG5ldyB1aW50OFtleHRyYV9kYXRhX3NpemVfXSk7Ci0gICAgbWVtY3B5KGV4dHJhX2RhdGFfLmdldCgpLCBleHRyYV9kYXRhLCBleHRyYV9kYXRhX3NpemVfKTsKLSAgfSBlbHNlIHsKLSAgICBleHRyYV9kYXRhXy5yZXNldCgpOwotICB9Ci0KLSAgaXNfZW5jcnlwdGVkXyA9IGlzX2VuY3J5cHRlZDsKLQotICBpbnQgY2hhbm5lbHMgPSBDaGFubmVsTGF5b3V0VG9DaGFubmVsQ291bnQoY2hhbm5lbF9sYXlvdXRfKTsKLSAgYnl0ZXNfcGVyX2ZyYW1lXyA9IGNoYW5uZWxzICogYml0c19wZXJfY2hhbm5lbF8gLyA4OwotfQotCi1BdWRpb0RlY29kZXJDb25maWc6On5BdWRpb0RlY29kZXJDb25maWcoKSB7fQotCi1ib29sIEF1ZGlvRGVjb2RlckNvbmZpZzo6SXNWYWxpZENvbmZpZygpIGNvbnN0IHsKLSAgcmV0dXJuIGNvZGVjXyAhPSBrVW5rbm93bkF1ZGlvQ29kZWMgJiYKLSAgICAgIGNoYW5uZWxfbGF5b3V0XyAhPSBDSEFOTkVMX0xBWU9VVF9VTlNVUFBPUlRFRCAmJgotICAgICAgYml0c19wZXJfY2hhbm5lbF8gPiAwICYmCi0gICAgICBiaXRzX3Blcl9jaGFubmVsXyA8PSBsaW1pdHM6OmtNYXhCaXRzUGVyU2FtcGxlICYmCi0gICAgICBzYW1wbGVzX3Blcl9zZWNvbmRfID4gMCAmJgotICAgICAgc2FtcGxlc19wZXJfc2Vjb25kXyA8PSBsaW1pdHM6OmtNYXhTYW1wbGVSYXRlOwotfQotCi1ib29sIEF1ZGlvRGVjb2RlckNvbmZpZzo6TWF0Y2hlcyhjb25zdCBBdWRpb0RlY29kZXJDb25maWcmIGNvbmZpZykgY29uc3QgewotICByZXR1cm4gKChjb2RlYygpID09IGNvbmZpZy5jb2RlYygpKSAmJgotICAgICAgICAgIChiaXRzX3Blcl9jaGFubmVsKCkgPT0gY29uZmlnLmJpdHNfcGVyX2NoYW5uZWwoKSkgJiYKLSAgICAgICAgICAoY2hhbm5lbF9sYXlvdXQoKSA9PSBjb25maWcuY2hhbm5lbF9sYXlvdXQoKSkgJiYKLSAgICAgICAgICAoc2FtcGxlc19wZXJfc2Vjb25kKCkgPT0gY29uZmlnLnNhbXBsZXNfcGVyX3NlY29uZCgpKSAmJgotICAgICAgICAgIChleHRyYV9kYXRhX3NpemUoKSA9PSBjb25maWcuZXh0cmFfZGF0YV9zaXplKCkpICYmCi0gICAgICAgICAgKCFleHRyYV9kYXRhKCkgfHwgIW1lbWNtcChleHRyYV9kYXRhKCksIGNvbmZpZy5leHRyYV9kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9kYXRhX3NpemUoKSkpICYmCi0gICAgICAgICAgKGlzX2VuY3J5cHRlZCgpID09IGNvbmZpZy5pc19lbmNyeXB0ZWQoKSkpOwotfQotCi1zdGQ6OnN0cmluZyBBdWRpb0RlY29kZXJDb25maWc6OkFzSHVtYW5SZWFkYWJsZVN0cmluZygpIGNvbnN0IHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHM7Ci0gIHMgPDwgImNvZGVjOiAiIDw8IGNvZGVjKCkKLSAgICA8PCAiIGJpdHMgcGVyIGNoYW5uZWw6ICIgPDwgYml0c19wZXJfY2hhbm5lbCgpCi0gICAgPDwgIiBjaGFubmVsIGxheW91dDogIiA8PCBjaGFubmVsX2xheW91dCgpCi0gICAgPDwgIiBzYW1wbGVzIHBlciBzZWNvbmQ6ICIgPDwgc2FtcGxlc19wZXJfc2Vjb25kKCkKLSAgICA8PCAiIGJ5dGVzIHBlciBmcmFtZTogIiA8PCBieXRlc19wZXJfZnJhbWUoKQotICAgIDw8ICIgaGFzIGV4dHJhIGRhdGE/ICIgPDwgKGV4dHJhX2RhdGEoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpCi0gICAgPDwgIiBlbmNyeXB0ZWQ/ICIgPDwgKGlzX2VuY3J5cHRlZCgpID8gInRydWUiIDogImZhbHNlIik7Ci0gIHJldHVybiBzLnN0cigpOwotfQotCi12b2lkIEF1ZGlvRGVjb2RlckNvbmZpZzo6Q29weUZyb20oY29uc3QgQXVkaW9EZWNvZGVyQ29uZmlnJiBhdWRpb19jb25maWcpIHsKLSAgSW5pdGlhbGl6ZShhdWRpb19jb25maWcuY29kZWMoKSwKLSAgICAgICAgICAgICBhdWRpb19jb25maWcuYml0c19wZXJfY2hhbm5lbCgpLAotICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZy5jaGFubmVsX2xheW91dCgpLAotICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZy5zYW1wbGVzX3Blcl9zZWNvbmQoKSwKLSAgICAgICAgICAgICBhdWRpb19jb25maWcuZXh0cmFfZGF0YSgpLAotICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZy5leHRyYV9kYXRhX3NpemUoKSwKLSAgICAgICAgICAgICBhdWRpb19jb25maWcuaXNfZW5jcnlwdGVkKCksCi0gICAgICAgICAgICAgZmFsc2UpOwotfQotCi1BdWRpb0NvZGVjIEF1ZGlvRGVjb2RlckNvbmZpZzo6Y29kZWMoKSBjb25zdCB7Ci0gIHJldHVybiBjb2RlY187Ci19Ci0KLWludCBBdWRpb0RlY29kZXJDb25maWc6OmJpdHNfcGVyX2NoYW5uZWwoKSBjb25zdCB7Ci0gIHJldHVybiBiaXRzX3Blcl9jaGFubmVsXzsKLX0KLQotQ2hhbm5lbExheW91dCBBdWRpb0RlY29kZXJDb25maWc6OmNoYW5uZWxfbGF5b3V0KCkgY29uc3QgewotICByZXR1cm4gY2hhbm5lbF9sYXlvdXRfOwotfQotCi1pbnQgQXVkaW9EZWNvZGVyQ29uZmlnOjpzYW1wbGVzX3Blcl9zZWNvbmQoKSBjb25zdCB7Ci0gIHJldHVybiBzYW1wbGVzX3Blcl9zZWNvbmRfOwotfQotCi1pbnQgQXVkaW9EZWNvZGVyQ29uZmlnOjpieXRlc19wZXJfZnJhbWUoKSBjb25zdCB7Ci0gIHJldHVybiBieXRlc19wZXJfZnJhbWVfOwotfQotCi11aW50OCogQXVkaW9EZWNvZGVyQ29uZmlnOjpleHRyYV9kYXRhKCkgY29uc3QgewotICByZXR1cm4gZXh0cmFfZGF0YV8uZ2V0KCk7Ci19Ci0KLXNpemVfdCBBdWRpb0RlY29kZXJDb25maWc6OmV4dHJhX2RhdGFfc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGV4dHJhX2RhdGFfc2l6ZV87Ci19Ci0KLWJvb2wgQXVkaW9EZWNvZGVyQ29uZmlnOjppc19lbmNyeXB0ZWQoKSBjb25zdCB7Ci0gIHJldHVybiBpc19lbmNyeXB0ZWRfOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmggYi9zcmMvbWVkaWEvYmFzZS9hdWRpb19kZWNvZGVyX2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDZhMTFiLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9CQVNFX0FVRElPX0RFQ09ERVJfQ09ORklHX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfQVVESU9fREVDT0RFUl9DT05GSUdfSF8KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2NoYW5uZWxfbGF5b3V0LmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotZW51bSBBdWRpb0NvZGVjIHsKLSAgLy8gVGhlc2UgdmFsdWVzIGFyZSBoaXN0b2dyYW1tZWQgb3ZlciB0aW1lOyBkbyBub3QgY2hhbmdlIHRoZWlyIG9yZGluYWwKLSAgLy8gdmFsdWVzLiAgV2hlbiBkZWxldGluZyBhIGNvZGVjIHJlcGxhY2UgaXQgd2l0aCBhIGR1bW15IHZhbHVlOyB3aGVuIGFkZGluZyBhCi0gIC8vIGNvZGVjLCBkbyBzbyBhdCB0aGUgYm90dG9tIChhbmQgdXBkYXRlIGtBdWRpb0NvZGVjTWF4KS4KLSAga1Vua25vd25BdWRpb0NvZGVjID0gMCwKLSAga0NvZGVjQUFDLAotICBrQ29kZWNNUDMsCi0gIGtDb2RlY1BDTSwKLSAga0NvZGVjVm9yYmlzLAotICBrQ29kZWNGTEFDLAotICBrQ29kZWNBTVJfTkIsCi0gIGtDb2RlY0FNUl9XQiwKLSAga0NvZGVjUENNX01VTEFXLAotICBrQ29kZWNHU01fTVMsCi0gIGtDb2RlY1BDTV9TMTZCRSwKLSAga0NvZGVjUENNX1MyNEJFLAotICBrQ29kZWNPcHVzLAotICAvLyBETyBOT1QgQUREIFJBTkRPTSBBVURJTyBDT0RFQ1MhCi0gIC8vCi0gIC8vIFRoZSBvbmx5IGFjY2VwdGFibGUgdGltZSB0byBhZGQgYSBuZXcgY29kZWMgaXMgaWYgdGhlcmUgaXMgcHJvZHVjdGlvbiBjb2RlCi0gIC8vIHRoYXQgdXNlcyBzYWlkIGNvZGVjIGluIHRoZSBzYW1lIENMLgotCi0gIGtBdWRpb0NvZGVjTWF4ID0ga0NvZGVjT3B1cyAgLy8gTXVzdCBlcXVhbCB0aGUgbGFzdCAicmVhbCIgY29kZWMgYWJvdmUuCi19OwotCi0vLyBUT0RPKGRhbGVjdXJ0aXMpOiBGRm1wZWcgQVBJIHVzZXMgfGJ5dGVzX3Blcl9jaGFubmVsfCBpbnN0ZWFkIG9mCi0vLyB8Yml0c19wZXJfY2hhbm5lbHwsIHdlIHNob3VsZCBzd2l0Y2ggb3ZlciBzaW5jZSBiaXRzIGFyZSBnZW5lcmFsbHkgY29uZnVzaW5nCi0vLyB0byB3b3JrIHdpdGguCi1jbGFzcyBNRURJQV9FWFBPUlQgQXVkaW9EZWNvZGVyQ29uZmlnIHsKLSBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdHMgYW4gdW5pbml0aWFsaXplZCBvYmplY3QuIENsaWVudHMgc2hvdWxkIGNhbGwgSW5pdGlhbGl6ZSgpIHdpdGgKLSAgLy8gYXBwcm9wcmlhdGUgdmFsdWVzIGJlZm9yZSB1c2luZy4KLSAgQXVkaW9EZWNvZGVyQ29uZmlnKCk7Ci0KLSAgLy8gQ29uc3RydWN0cyBhbiBpbml0aWFsaXplZCBvYmplY3QuIEl0IGlzIGFjY2VwdGFibGUgdG8gcGFzcyBpbiBOVUxMIGZvcgotICAvLyB8ZXh0cmFfZGF0YXwsIG90aGVyd2lzZSB0aGUgbWVtb3J5IGlzIGNvcGllZC4KLSAgQXVkaW9EZWNvZGVyQ29uZmlnKEF1ZGlvQ29kZWMgY29kZWMsIGludCBiaXRzX3Blcl9jaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbExheW91dCBjaGFubmVsX2xheW91dCwgaW50IHNhbXBsZXNfcGVyX3NlY29uZCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBleHRyYV9kYXRhLCBzaXplX3QgZXh0cmFfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19lbmNyeXB0ZWQpOwotCi0gIH5BdWRpb0RlY29kZXJDb25maWcoKTsKLQotICAvLyBSZXNldHMgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoaXMgb2JqZWN0LgotICB2b2lkIEluaXRpYWxpemUoQXVkaW9Db2RlYyBjb2RlYywgaW50IGJpdHNfcGVyX2NoYW5uZWwsCi0gICAgICAgICAgICAgICAgICBDaGFubmVsTGF5b3V0IGNoYW5uZWxfbGF5b3V0LCBpbnQgc2FtcGxlc19wZXJfc2Vjb25kLAotICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIGV4dHJhX2RhdGEsIHNpemVfdCBleHRyYV9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICBib29sIGlzX2VuY3J5cHRlZCwKLSAgICAgICAgICAgICAgICAgIGJvb2wgcmVjb3JkX3N0YXRzKTsKLQotICAvLyBEZWVwIGNvcGllcyB8YXVkaW9fY29uZmlnfC4KLSAgdm9pZCBDb3B5RnJvbShjb25zdCBBdWRpb0RlY29kZXJDb25maWcmIGF1ZGlvX2NvbmZpZyk7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgb2JqZWN0IGhhcyBhcHByb3ByaWF0ZSBjb25maWd1cmF0aW9uIHZhbHVlcywgZmFsc2UKLSAgLy8gb3RoZXJ3aXNlLgotICBib29sIElzVmFsaWRDb25maWcoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgYWxsIGZpZWxkcyBpbiB8Y29uZmlnfCBtYXRjaCB0aGlzIGNvbmZpZy4KLSAgLy8gTm90ZTogVGhlIGNvbnRlbnRzIG9mIHxleHRyYV9kYXRhX3wgYXJlIGNvbXBhcmVkIG5vdCB0aGUgcmF3IHBvaW50ZXJzLgotICBib29sIE1hdGNoZXMoY29uc3QgQXVkaW9EZWNvZGVyQ29uZmlnJiBjb25maWcpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgZGVzY3JpYmluZyB8KnRoaXN8LiAgRm9yIGRlYnVnZ2luZyAmIHRlc3QKLSAgLy8gb3V0cHV0IG9ubHkuCi0gIHN0ZDo6c3RyaW5nIEFzSHVtYW5SZWFkYWJsZVN0cmluZygpIGNvbnN0OwotCi0gIEF1ZGlvQ29kZWMgY29kZWMoKSBjb25zdDsKLSAgaW50IGJpdHNfcGVyX2NoYW5uZWwoKSBjb25zdDsKLSAgQ2hhbm5lbExheW91dCBjaGFubmVsX2xheW91dCgpIGNvbnN0OwotICBpbnQgc2FtcGxlc19wZXJfc2Vjb25kKCkgY29uc3Q7Ci0gIGludCBieXRlc19wZXJfZnJhbWUoKSBjb25zdDsKLQotICAvLyBPcHRpb25hbCBieXRlIGRhdGEgcmVxdWlyZWQgdG8gaW5pdGlhbGl6ZSBhdWRpbyBkZWNvZGVycyBzdWNoIGFzIFZvcmJpcwotICAvLyBjb2RlYm9va3MuCi0gIHVpbnQ4KiBleHRyYV9kYXRhKCkgY29uc3Q7Ci0gIHNpemVfdCBleHRyYV9kYXRhX3NpemUoKSBjb25zdDsKLQotICAvLyBXaGV0aGVyIHRoZSBhdWRpbyBzdHJlYW0gaXMgcG90ZW50aWFsbHkgZW5jcnlwdGVkLgotICAvLyBOb3RlIHRoYXQgaW4gYSBwb3RlbnRpYWxseSBlbmNyeXB0ZWQgYXVkaW8gc3RyZWFtLCBpbmRpdmlkdWFsIGJ1ZmZlcnMKLSAgLy8gY2FuIGJlIGVuY3J5cHRlZCBvciBub3QgZW5jcnlwdGVkLgotICBib29sIGlzX2VuY3J5cHRlZCgpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgQXVkaW9Db2RlYyBjb2RlY187Ci0gIGludCBiaXRzX3Blcl9jaGFubmVsXzsKLSAgQ2hhbm5lbExheW91dCBjaGFubmVsX2xheW91dF87Ci0gIGludCBzYW1wbGVzX3Blcl9zZWNvbmRfOwotICBpbnQgYnl0ZXNfcGVyX2ZyYW1lXzsKLQotICBzY29wZWRfYXJyYXk8dWludDg+IGV4dHJhX2RhdGFfOwotICBzaXplX3QgZXh0cmFfZGF0YV9zaXplXzsKLQotICBib29sIGlzX2VuY3J5cHRlZF87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEF1ZGlvRGVjb2RlckNvbmZpZyk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX0FVRElPX0RFQ09ERVJfQ09ORklHX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9hdWRpb19maWZvLmNjIGIvc3JjL21lZGlhL2Jhc2UvYXVkaW9fZmlmby5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZlOGY4MC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9hdWRpb19maWZvLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2ZpZm8uaCIKLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotCi11c2luZyBiYXNlOjpzdWJ0bGU6OkF0b21pYzMyOwotdXNpbmcgYmFzZTo6c3VidGxlOjpOb0JhcnJpZXJfU3RvcmU7Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIEdpdmVuIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIEZJRk8sIHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUKLS8vIEZJRk8gYW5kIHRoZSBzaXplIG9mIHRoZSBpbnB1dDsgdGhpcyBtZXRob2QgcHJvdmlkZXMgdHdvIG91dHB1dCByZXN1bHRzOgotLy8gfHNpemV8IGFuZCB8d3JhcF9zaXplfC4gVGhlc2UgdHdvIHJlc3VsdHMgY2FuIHRoZW4gYmUgdXRpbGl6ZWQgZm9yIG1lbWNvcHkKLS8vIG9wZXJhdGlvbnMgdG8gYW5kIGZyb20gdGhlIEZJRk8uCi0vLyBVbmRlciAibm9ybWFsIiBjaXJjdW1zdGFuY2VzLCB8c2l6ZXwgd2lsbCBiZSBlcXVhbCB0byB8aW5fc2l6ZXwgYW5kCi0vLyB8d3JhcF9zaXplfCB3aWxsIGJlIHplcm8uIFRoaXMgY2FzZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBub24td3JhcHBpbmcgY2FzZQotLy8gd2hlcmUgd2UgaGF2ZSBub3QgeWV0IHJlYWNoZWQgdGhlICJlZGdlIiBvZiB0aGUgRklGTy4gSWYgfHBvc3wgKyB8aW5fc2l6ZXwKLS8vIGV4Y2VlZHMgdGhlIHRvdGFsIHNpemUgb2YgdGhlIEZJRk8sIHdlIG11c3Qgd3JhcCBhcm91bmQgYW5kIHN0YXJ0IHJldXNpbmcKLS8vIGEgcGFydCB0aGUgYWxsb2NhdGVkIG1lbW9yeS4gVGhlIHNpemUgb2YgdGhpcyBwYXJ0IGlzIGdpdmVuIGJ5IHx3cmFwX3NpemV8Lgotc3RhdGljIHZvaWQgR2V0U2l6ZXMoCi0gICAgaW50IHBvcywgaW50IG1heF9zaXplLCBpbnQgaW5fc2l6ZSwgaW50KiBzaXplLCBpbnQqIHdyYXBfc2l6ZSkgewotICBpZiAocG9zICsgaW5fc2l6ZSA+IG1heF9zaXplKSB7Ci0gICAgLy8gV3JhcHBpbmcgaXMgcmVxdWlyZWQgPT4gZGVyaXZlIHNpemUgb2YgZWFjaCBzZWdtZW50LgotICAgICpzaXplID0gbWF4X3NpemUgLSBwb3M7Ci0gICAgKndyYXBfc2l6ZSA9IGluX3NpemUgLSAqc2l6ZTsKLSAgfSBlbHNlIHsKLSAgICAvLyBXcmFwcGluZyBpcyBub3QgcmVxdWlyZWQuCi0gICAgKnNpemUgPSBpbl9zaXplOwotICAgICp3cmFwX3NpemUgPSAwOwotICB9Ci19Ci0KLS8vIFVwZGF0ZXMgdGhlIHJlYWQvd3JpdGUgcG9zaXRpb24gd2l0aCB8c3RlcHwgbW9kdWxvIHRoZSBtYXhpbXVtIG51bWJlciBvZgotLy8gZWxlbWVudHMgaW4gdGhlIEZJRk8gdG8gZW5zdXJlIHRoYXQgdGhlIHBvc2l0aW9uIGNvdW50ZXJzIHdyYXBzIGFyb3VuZCBhdAotLy8gdGhlIGVuZHBvaW50Lgotc3RhdGljIGludCBVcGRhdGVQb3MoaW50IHBvcywgaW50IHN0ZXAsIGludCBtYXhfc2l6ZSkgewotICByZXR1cm4gKChwb3MgKyBzdGVwKSAlIG1heF9zaXplKTsKLX0KLQotQXVkaW9GaWZvOjpBdWRpb0ZpZm8oaW50IGNoYW5uZWxzLCBpbnQgZnJhbWVzKQotICAgIDogYXVkaW9fYnVzXyhBdWRpb0J1czo6Q3JlYXRlKGNoYW5uZWxzLCBmcmFtZXMpKSwKLSAgICAgIG1heF9mcmFtZXNfKGZyYW1lcyksCi0gICAgICBmcmFtZXNfcHVzaGVkXygwKSwKLSAgICAgIGZyYW1lc19jb25zdW1lZF8oMCksCi0gICAgICByZWFkX3Bvc18oMCksCi0gICAgICB3cml0ZV9wb3NfKDApIHt9Ci0KLUF1ZGlvRmlmbzo6fkF1ZGlvRmlmbygpIHt9Ci0KLWludCBBdWRpb0ZpZm86OmZyYW1lcygpIGNvbnN0IHsKLSAgaW50IGRlbHRhID0gZnJhbWVzX3B1c2hlZF8gLSBmcmFtZXNfY29uc3VtZWRfOwotICBiYXNlOjpzdWJ0bGU6Ok1lbW9yeUJhcnJpZXIoKTsKLSAgcmV0dXJuIGRlbHRhOwotfQotCi12b2lkIEF1ZGlvRmlmbzo6UHVzaChjb25zdCBBdWRpb0J1cyogc291cmNlKSB7Ci0gIERDSEVDSyhzb3VyY2UpOwotICBEQ0hFQ0tfRVEoc291cmNlLT5jaGFubmVscygpLCBhdWRpb19idXNfLT5jaGFubmVscygpKTsKLQotICAvLyBFbnN1cmUgdGhhdCB0aGVyZSBpcyBzcGFjZSBmb3IgdGhlIG5ldyBkYXRhIGluIHRoZSBGSUZPLgotICBjb25zdCBpbnQgc291cmNlX3NpemUgPSBzb3VyY2UtPmZyYW1lcygpOwotICBDSEVDS19MRShzb3VyY2Vfc2l6ZSArIGZyYW1lcygpLCBtYXhfZnJhbWVzXyk7Ci0KLSAgLy8gRmlndXJlIG91dCBpZiB3cmFwcGluZyBpcyBuZWVkZWQgYW5kIGlmIHNvIHdoYXQgc2VnbWVudCBzaXplcyB3ZSBuZWVkCi0gIC8vIHdoZW4gYWRkaW5nIHRoZSBuZXcgYXVkaW8gYnVzIGNvbnRlbnQgdG8gdGhlIEZJRk8uCi0gIGludCBhcHBlbmRfc2l6ZSA9IDA7Ci0gIGludCB3cmFwX3NpemUgPSAwOwotICBHZXRTaXplcyh3cml0ZV9wb3NfLCBtYXhfZnJhbWVzKCksIHNvdXJjZV9zaXplLCAmYXBwZW5kX3NpemUsICZ3cmFwX3NpemUpOwotCi0gIC8vIENvcHkgYWxsIGNoYW5uZWxzIGZyb20gdGhlIHNvdXJjZSB0byB0aGUgRklGTy4gV3JhcCBhcm91bmQgaWYgbmVlZGVkLgotICBmb3IgKGludCBjaCA9IDA7IGNoIDwgc291cmNlLT5jaGFubmVscygpOyArK2NoKSB7Ci0gICAgZmxvYXQqIGRlc3QgPSBhdWRpb19idXNfLT5jaGFubmVsKGNoKTsKLSAgICBjb25zdCBmbG9hdCogc3JjID0gc291cmNlLT5jaGFubmVsKGNoKTsKLQotICAgIC8vIEFwcGVuZCBwYXJ0IG9mIChvciB0aGUgY29tcGxldGUpIHNvdXJjZSB0byB0aGUgRklGTy4KLSAgICBtZW1jcHkoJmRlc3Rbd3JpdGVfcG9zX10sICZzcmNbMF0sIGFwcGVuZF9zaXplICogc2l6ZW9mKHNyY1swXSkpOwotICAgIGlmICh3cmFwX3NpemUgPiAwKSB7Ci0gICAgICAvLyBXcmFwcGluZyBpcyBuZWVkZWQ6IGNvcHkgcmVtYWluaW5nIHBhcnQgZnJvbSB0aGUgc291cmNlIHRvIHRoZSBGSUZPLgotICAgICAgbWVtY3B5KCZkZXN0WzBdLCAmc3JjW2FwcGVuZF9zaXplXSwgd3JhcF9zaXplICogc2l6ZW9mKHNyY1swXSkpOwotICAgIH0KLSAgfQotCi0gIC8vIEVuc3VyZSB0aGUgZGF0YSBpcyAqcmVhbGx5KiB3cml0dGVuIGJlZm9yZSB1cGRhdGluZyB8ZnJhbWVzX3B1c2hlZF98LgotICBiYXNlOjpzdWJ0bGU6Ok1lbW9yeUJhcnJpZXIoKTsKLQotICBBdG9taWMzMiBuZXdfZnJhbWVzX3B1c2hlZCA9IGZyYW1lc19wdXNoZWRfICsgc291cmNlX3NpemU7Ci0gIE5vQmFycmllcl9TdG9yZSgmZnJhbWVzX3B1c2hlZF8sIG5ld19mcmFtZXNfcHVzaGVkKTsKLQotICBEQ0hFQ0tfTEUoZnJhbWVzKCksIG1heF9mcmFtZXMoKSk7Ci0gIHdyaXRlX3Bvc18gPSBVcGRhdGVQb3Mod3JpdGVfcG9zXywgc291cmNlX3NpemUsIG1heF9mcmFtZXMoKSk7Ci19Ci0KLXZvaWQgQXVkaW9GaWZvOjpDb25zdW1lKEF1ZGlvQnVzKiBkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9mcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZXNfdG9fY29uc3VtZSkgewotICBEQ0hFQ0soZGVzdGluYXRpb24pOwotICBEQ0hFQ0tfRVEoZGVzdGluYXRpb24tPmNoYW5uZWxzKCksIGF1ZGlvX2J1c18tPmNoYW5uZWxzKCkpOwotCi0gIC8vIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBhc2sgZm9yIG1vcmUgZGF0YSB0aGFuIHdoYXQgaXMgYXZhaWxhYmxlIGluIHRoZSBGSUZPLgotICBDSEVDS19MRShmcmFtZXNfdG9fY29uc3VtZSwgZnJhbWVzKCkpOwotCi0gIC8vIEEgY29weSBmcm9tIHRoZSBGSUZPIHRvIHxkZXN0aW5hdGlvbnwgd2lsbCBvbmx5IGJlIHBlcmZvcm1lZCBpZiB0aGUKLSAgLy8gYWxsb2NhdGVkIG1lbW9yeSBpbiB8ZGVzdGluYXRpb258IGlzIHN1ZmZpY2llbnQuCi0gIENIRUNLX0xFKGZyYW1lc190b19jb25zdW1lICsgc3RhcnRfZnJhbWUsIGRlc3RpbmF0aW9uLT5mcmFtZXMoKSk7Ci0KLSAgLy8gRmlndXJlIG91dCBpZiB3cmFwcGluZyBpcyBuZWVkZWQgYW5kIGlmIHNvIHdoYXQgc2VnbWVudCBzaXplcyB3ZSBuZWVkCi0gIC8vIHdoZW4gcmVtb3ZpbmcgYXVkaW8gYnVzIGNvbnRlbnQgZnJvbSB0aGUgRklGTy4KLSAgaW50IGNvbnN1bWVfc2l6ZSA9IDA7Ci0gIGludCB3cmFwX3NpemUgPSAwOwotICBHZXRTaXplcyhyZWFkX3Bvc18sIG1heF9mcmFtZXMoKSwgZnJhbWVzX3RvX2NvbnN1bWUsCi0gICAgICAgICAgICZjb25zdW1lX3NpemUsICZ3cmFwX3NpemUpOwotCi0gIC8vIEZvciBhbGwgY2hhbm5lbHMsIHJlbW92ZSB0aGUgcmVxdWVzdGVkIGFtb3VudCBvZiBkYXRhIGZyb20gdGhlIEZJRk8KLSAgLy8gYW5kIGNvcHkgdGhlIGNvbnRlbnQgdG8gdGhlIGRlc3RpbmF0aW9uLiBXcmFwIGFyb3VuZCBpZiBuZWVkZWQuCi0gIGZvciAoaW50IGNoID0gMDsgY2ggPCBkZXN0aW5hdGlvbi0+Y2hhbm5lbHMoKTsgKytjaCkgewotICAgIGZsb2F0KiBkZXN0ID0gZGVzdGluYXRpb24tPmNoYW5uZWwoY2gpOwotICAgIGNvbnN0IGZsb2F0KiBzcmMgPSBhdWRpb19idXNfLT5jaGFubmVsKGNoKTsKLQotICAgIC8vIENvcHkgYSBzZWxlY3RlZCBwYXJ0IG9mIHRoZSBGSUZPIHRvIHRoZSBkZXN0aW5hdGlvbi4KLSAgICBtZW1jcHkoJmRlc3Rbc3RhcnRfZnJhbWVdLCAmc3JjW3JlYWRfcG9zX10sIGNvbnN1bWVfc2l6ZSAqIHNpemVvZihzcmNbMF0pKTsKLSAgICBpZiAod3JhcF9zaXplID4gMCkgewotICAgICAgLy8gV3JhcHBpbmcgaXMgbmVlZGVkOiBjb3B5IHJlbWFpbmluZyBwYXJ0IHRvIHRoZSBkZXN0aW5hdGlvbi4KLSAgICAgIG1lbWNweSgmZGVzdFtjb25zdW1lX3NpemUgKyBzdGFydF9mcmFtZV0sICZzcmNbMF0sCi0gICAgICAgICAgICAgd3JhcF9zaXplICogc2l6ZW9mKHNyY1swXSkpOwotICAgIH0KLSAgfQotCi0gIEF0b21pYzMyIG5ld19mcmFtZXNfY29uc3VtZWQgPSBmcmFtZXNfY29uc3VtZWRfICsgZnJhbWVzX3RvX2NvbnN1bWU7Ci0gIE5vQmFycmllcl9TdG9yZSgmZnJhbWVzX2NvbnN1bWVkXywgbmV3X2ZyYW1lc19jb25zdW1lZCk7Ci0KLSAgcmVhZF9wb3NfID0gVXBkYXRlUG9zKHJlYWRfcG9zXywgZnJhbWVzX3RvX2NvbnN1bWUsIG1heF9mcmFtZXMoKSk7Ci19Ci0KLXZvaWQgQXVkaW9GaWZvOjpDbGVhcigpIHsKLSAgZnJhbWVzX3B1c2hlZF8gPSAwOwotICBmcmFtZXNfY29uc3VtZWRfID0gMDsKLSAgcmVhZF9wb3NfID0gMDsKLSAgd3JpdGVfcG9zXyA9IDA7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvYXVkaW9fZmlmby5oIGIvc3JjL21lZGlhL2Jhc2UvYXVkaW9fZmlmby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTc4YWNlLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL2F1ZGlvX2ZpZm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfQkFTRV9BVURJT19GSUZPX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfQVVESU9fRklGT19IXwotCi0jaW5jbHVkZSAiYmFzZS9hdG9taWNvcHMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2J1cy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIEZpcnN0LWluIGZpcnN0LW91dCBjb250YWluZXIgZm9yIEF1ZGlvQnVzIGVsZW1lbnRzLgotLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyBpbiB0aGUgRklGTyBpcyBzZXQgYXQgY29uc3RydWN0aW9uIGFuZAotLy8gY2FuIG5vdCBiZSBleHRlbmRlZCBkeW5hbWljYWxseS4gIFRoZSBhbGxvY2F0ZWQgbWVtb3J5IGlzIHV0aWxpemVkIGFzIGEKLS8vIHJpbmcgYnVmZmVyLgotLy8gVGhpcyBjbGFzcyBpcyB0aHJlYWQtc2FmZSBpbiB0aGUgbGltaXRlZCBzZW5zZSB0aGF0IG9uZSB0aHJlYWQgbWF5IGNhbGwKLS8vIFB1c2goKSwgd2hpbGUgYSBzZWNvbmQgdGhyZWFkIGNhbGxzIENvbnN1bWUoKS4KLWNsYXNzIE1FRElBX0VYUE9SVCBBdWRpb0ZpZm8gewotIHB1YmxpYzoKLSAgLy8gQ3JlYXRlcyBhIG5ldyBBdWRpb0ZpZm8gYW5kIGFsbG9jYXRlcyB8Y2hhbm5lbHN8IG9mIGxlbmd0aCB8ZnJhbWVzfC4KLSAgQXVkaW9GaWZvKGludCBjaGFubmVscywgaW50IGZyYW1lcyk7Ci0gIHZpcnR1YWwgfkF1ZGlvRmlmbygpOwotCi0gIC8vIFB1c2hlcyBhbGwgYXVkaW8gY2hhbm5lbCBkYXRhIGZyb20gfHNvdXJjZXwgdG8gdGhlIEZJRk8uCi0gIC8vIFB1c2goKSB3aWxsIGNyYXNoIGlmIHRoZSBhbGxvY2F0ZWQgc3BhY2UgaXMgaW5zdWZmaWNpZW50LgotICB2b2lkIFB1c2goY29uc3QgQXVkaW9CdXMqIHNvdXJjZSk7Ci0KLSAgLy8gQ29uc3VtZXMgfGZyYW1lc190b19jb25zdW1lfCBhdWRpbyBmcmFtZXMgZnJvbSB0aGUgRklGTyBhbmQgY29waWVzCi0gIC8vIHRoZW0gdG8gfGRlc3RpbmF0aW9ufCBzdGFydGluZyBhdCBwb3NpdGlvbiB8c3RhcnRfZnJhbWV8LgotICAvLyBDb25zdW1lKCkgd2lsbCBjcmFzaCBpZiB0aGUgRklGTyBkb2VzIG5vdCBjb250YWluIHxmcmFtZXNfdG9fY29uc3VtZXwKLSAgLy8gZnJhbWVzIG9yIGlmIHRoZXJlIGlzIGluc3VmZmljaWVudCBzcGFjZSBpbiB8ZGVzdGluYXRpb258IHRvIHN0b3JlIHRoZQotICAvLyBmcmFtZXMuCi0gIHZvaWQgQ29uc3VtZShBdWRpb0J1cyogZGVzdGluYXRpb24sIGludCBzdGFydF9mcmFtZSwgaW50IGZyYW1lc190b19jb25zdW1lKTsKLQotICAvLyBFbXB0aWVzIHRoZSBGSUZPIHdpdGhvdXQgZGVhbGxvY2F0aW5nIGFueSBtZW1vcnkuCi0gIHZvaWQgQ2xlYXIoKTsKLQotICAvLyBOdW1iZXIgb2YgYWN0dWFsIGF1ZGlvIGZyYW1lcyBpbiB0aGUgRklGTy4KLSAgaW50IGZyYW1lcygpIGNvbnN0OwotCi0gIGludCBtYXhfZnJhbWVzKCkgY29uc3QgeyByZXR1cm4gbWF4X2ZyYW1lc187IH0KLQotIHByaXZhdGU6Ci0gIC8vIFRoZSBhY3R1YWwgRklGTyBpcyBhbiBhdWRpbyBidXMgaW1wbGVtZW50ZWQgYXMgYSByaW5nIGJ1ZmZlci4KLSAgc2NvcGVkX3B0cjxBdWRpb0J1cz4gYXVkaW9fYnVzXzsKLQotICAvLyBNYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyB0aGUgRklGTyBjYW4gY29udGFpbi4KLSAgLy8gVGhpcyB2YWx1ZSBpcyBzZXQgYnkgfGZyYW1lc3wgaW4gdGhlIGNvbnN0cnVjdG9yLgotICBjb25zdCBpbnQgbWF4X2ZyYW1lc187Ci0KLSAgLy8gTnVtYmVyIG9mIGFjdHVhbCBlbGVtZW50cyBpbiB0aGUgRklGTy4KLSAgdm9sYXRpbGUgYmFzZTo6c3VidGxlOjpBdG9taWMzMiBmcmFtZXNfcHVzaGVkXzsKLSAgdm9sYXRpbGUgYmFzZTo6c3VidGxlOjpBdG9taWMzMiBmcmFtZXNfY29uc3VtZWRfOwotCi0gIC8vIEN1cnJlbnQgcmVhZCBwb3NpdGlvbi4KLSAgaW50IHJlYWRfcG9zXzsKLQotICAvLyBDdXJyZW50IHdyaXRlIHBvc2l0aW9uLgotICBpbnQgd3JpdGVfcG9zXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQXVkaW9GaWZvKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0JBU0VfQVVESU9fRklGT19IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvYXVkaW9fZmlmb191bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9iYXNlL2F1ZGlvX2ZpZm9fdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNWZmZDkuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvYXVkaW9fZmlmb191bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBUT0RPKGhlbnJpa2EpOiBhZGQgdGVzdCB3aGljaCBpbmNsdWRlZCB8c3RhcnRfZnJhbWV8IGluIENvbnN1bWUoKSBjYWxsLgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19maWZvLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIEF1ZGlvRmlmb1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICBBdWRpb0ZpZm9UZXN0KCkge30KLSAgfkF1ZGlvRmlmb1Rlc3QoKSB7fQotCi0gIHZvaWQgVmVyaWZ5VmFsdWUoY29uc3QgZmxvYXQgZGF0YVtdLCBpbnQgc2l6ZSwgZmxvYXQgdmFsdWUpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkKLSAgICAgIEFTU0VSVF9GTE9BVF9FUSh2YWx1ZSwgZGF0YVtpXSkgPDwgImk9IiA8PCBpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBdWRpb0ZpZm9UZXN0KTsKLX07Ci0KLS8vIFZlcmlmeSB0aGF0IGNvbnN0cnVjdGlvbiB3b3JrcyBhcyBpbnRlbmRlZC4KLVRFU1RfRihBdWRpb0ZpZm9UZXN0LCBDb25zdHJ1Y3QpIHsKLSAgc3RhdGljIGNvbnN0IGludCBrQ2hhbm5lbHMgPSA2OwotICBzdGF0aWMgY29uc3QgaW50IGtNYXhGcmFtZUNvdW50ID0gMTI4OwotICBBdWRpb0ZpZm8gZmlmbyhrQ2hhbm5lbHMsIGtNYXhGcmFtZUNvdW50KTsKLSAgRVhQRUNUX0VRKGZpZm8uZnJhbWVzKCksIDApOwotfQotCi0vLyBQdXNoZXMgYXVkaW8gYnVzIG9iamVjdHMgdG8gYSBGSUZPIGFuZCBmaWxsIGl0IHVwIHRvIGRpZmZlcmVudCBkZWdyZWVzLgotVEVTVF9GKEF1ZGlvRmlmb1Rlc3QsIFB1c2gpIHsKLSAgc3RhdGljIGNvbnN0IGludCBrQ2hhbm5lbHMgPSAyOwotICBzdGF0aWMgY29uc3QgaW50IGtNYXhGcmFtZUNvdW50ID0gMTI4OwotICBBdWRpb0ZpZm8gZmlmbyhrQ2hhbm5lbHMsIGtNYXhGcmFtZUNvdW50KTsKLSAgewotICAgIFNDT1BFRF9UUkFDRSgiUHVzaCA1MCUiKTsKLSAgICBzY29wZWRfcHRyPEF1ZGlvQnVzPiBidXMgPSBBdWRpb0J1czo6Q3JlYXRlKGtDaGFubmVscywga01heEZyYW1lQ291bnQgLyAyKTsKLSAgICBFWFBFQ1RfRVEoZmlmby5mcmFtZXMoKSwgMCk7Ci0gICAgZmlmby5QdXNoKGJ1cy5nZXQoKSk7Ci0gICAgRVhQRUNUX0VRKGZpZm8uZnJhbWVzKCksIGJ1cy0+ZnJhbWVzKCkpOwotICAgIGZpZm8uQ2xlYXIoKTsKLSAgfQotICB7Ci0gICAgU0NPUEVEX1RSQUNFKCJQdXNoIDEwMCUiKTsKLSAgICBzY29wZWRfcHRyPEF1ZGlvQnVzPiBidXMgPSBBdWRpb0J1czo6Q3JlYXRlKGtDaGFubmVscywga01heEZyYW1lQ291bnQpOwotICAgIEVYUEVDVF9FUShmaWZvLmZyYW1lcygpLCAwKTsKLSAgICBmaWZvLlB1c2goYnVzLmdldCgpKTsKLSAgICBFWFBFQ1RfRVEoZmlmby5mcmFtZXMoKSwgYnVzLT5mcmFtZXMoKSk7Ci0gICAgZmlmby5DbGVhcigpOwotICB9Ci19Ci0KLS8vIENvbnN1bWVzIGF1ZGlvIGJ1cyBvYmplY3RzIGZyb20gYSBGSUZPIGFuZCBlbXB0eSBpdCB0byBkaWZmZXJlbnQgZGVncmVlcy4KLVRFU1RfRihBdWRpb0ZpZm9UZXN0LCBDb25zdW1lKSB7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0NoYW5uZWxzID0gMjsKLSAgc3RhdGljIGNvbnN0IGludCBrTWF4RnJhbWVDb3VudCA9IDEyODsKLSAgQXVkaW9GaWZvIGZpZm8oa0NoYW5uZWxzLCBrTWF4RnJhbWVDb3VudCk7Ci0gIHsKLSAgICBzY29wZWRfcHRyPEF1ZGlvQnVzPiBidXMgPSBBdWRpb0J1czo6Q3JlYXRlKGtDaGFubmVscywga01heEZyYW1lQ291bnQpOwotICAgIGZpZm8uUHVzaChidXMuZ2V0KCkpOwotICAgIEVYUEVDVF9FUShmaWZvLmZyYW1lcygpLCBrTWF4RnJhbWVDb3VudCk7Ci0gIH0KLSAgewotICAgIFNDT1BFRF9UUkFDRSgiQ29uc3VtZSA1MCUiKTsKLSAgICBzY29wZWRfcHRyPEF1ZGlvQnVzPiBidXMgPSBBdWRpb0J1czo6Q3JlYXRlKGtDaGFubmVscywga01heEZyYW1lQ291bnQgLyAyKTsKLSAgICBmaWZvLkNvbnN1bWUoYnVzLmdldCgpLCAwLCBidXMtPmZyYW1lcygpKTsKLSAgICBFWFBFQ1RfVFJVRShmaWZvLmZyYW1lcygpID09IGJ1cy0+ZnJhbWVzKCkpOwotICAgIGZpZm8uUHVzaChidXMuZ2V0KCkpOwotICAgIEVYUEVDVF9FUShmaWZvLmZyYW1lcygpLCBrTWF4RnJhbWVDb3VudCk7Ci0gIH0KLSAgewotICAgIFNDT1BFRF9UUkFDRSgiQ29uc3VtZSAxMDAlIik7Ci0gICAgc2NvcGVkX3B0cjxBdWRpb0J1cz4gYnVzID0gQXVkaW9CdXM6OkNyZWF0ZShrQ2hhbm5lbHMsIGtNYXhGcmFtZUNvdW50KTsKLSAgICBmaWZvLkNvbnN1bWUoYnVzLmdldCgpLCAwLCBidXMtPmZyYW1lcygpKTsKLSAgICBFWFBFQ1RfRVEoZmlmby5mcmFtZXMoKSwgMCk7Ci0gICAgZmlmby5QdXNoKGJ1cy5nZXQoKSk7Ci0gICAgRVhQRUNUX0VRKGZpZm8uZnJhbWVzKCksIGtNYXhGcmFtZUNvdW50KTsKLSAgfQotfQotCi0vLyBWZXJpZnkgdGhhdCB0aGUgZnJhbWVzKCkgbWV0aG9kIG9mIHRoZSBGSUZPIHdvcmtzIGFzIGludGVuZGVkIHdoaWxlCi0vLyBhcHBlbmRpbmcgYW5kIHJlbW92aW5nIGF1ZGlvIGJ1cyBlbGVtZW50cyB0by9mcm9tIHRoZSBGSUZPLgotVEVTVF9GKEF1ZGlvRmlmb1Rlc3QsIEZyYW1lc0luRmlmbykgewotICBzdGF0aWMgY29uc3QgaW50IGtDaGFubmVscyA9IDI7Ci0gIHN0YXRpYyBjb25zdCBpbnQga01heEZyYW1lQ291bnQgPSA2NDsKLSAgQXVkaW9GaWZvIGZpZm8oa0NoYW5uZWxzLCBrTWF4RnJhbWVDb3VudCk7Ci0KLSAgLy8gRmlsbCB1cCB0aGUgRklGTyBhbmQgdmVyaWZ5IHRoYXQgdGhlIHNpemUgZ3Jvd3MgYXMgaXQgc2hvdWxkIHdoaWxlIGFkZGluZwotICAvLyBvbmUgYXVkaW8gZnJhbWUgZWFjaCB0aW1lLgotICBzY29wZWRfcHRyPEF1ZGlvQnVzPiBidXMgPSBBdWRpb0J1czo6Q3JlYXRlKGtDaGFubmVscywgMSk7Ci0gIGludCBuID0gMDsKLSAgd2hpbGUgKGZpZm8uZnJhbWVzKCkgPCBrTWF4RnJhbWVDb3VudCkgewotICAgIGZpZm8uUHVzaChidXMuZ2V0KCkpOwotICAgIEVYUEVDVF9FUShmaWZvLmZyYW1lcygpLCArK24pOwotICB9Ci0gIEVYUEVDVF9FUShmaWZvLmZyYW1lcygpLCBrTWF4RnJhbWVDb3VudCk7Ci0KLSAgLy8gRW1wdHkgdGhlIEZJRk8gYW5kIHZlcmlmeSB0aGF0IHRoZSBzaXplIGRlY3JlYXNlcyBhcyBpdCBzaG91bGQuCi0gIC8vIFJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgRklGTyBieSBvbmUgZnJhbWUgZWFjaCB0aW1lLgotICB3aGlsZSAoZmlmby5mcmFtZXMoKSA+IDApIHsKLSAgICBmaWZvLkNvbnN1bWUoYnVzLmdldCgpLCAwLCBidXMtPmZyYW1lcygpKTsKLSAgICBFWFBFQ1RfRVEoZmlmby5mcmFtZXMoKSwgLS1uKTsKLSAgfQotICBFWFBFQ1RfRVEoZmlmby5mcmFtZXMoKSwgMCk7Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgYSBzdGVhZHktc3RhdGUgc2l6ZSBvZiAjZnJhbWVzIGluIHRoZSBGSUZPIGlzIG1haW50YWluZWQKLSAgLy8gZHVyaW5nIGEgc2VxdWVuY2Ugb2YgUHVzaC9Db25zdW1lIGNhbGxzIHdoaWNoIGludm9sdmVzIHdyYXBwaW5nLiBXZSBlbnN1cmUKLSAgLy8gd3JhcHBpbmcgYnkgc2VsZWN0aW5nIGEgYnVmZmVyIHNpemUgd2hpY2ggZG9lcyBkaXZpZGVzIHRoZSBGSUZPIHNpemUKLSAgLy8gd2l0aCBhIHJlbWFpbmRlciBvZiBvbmUuCi0gIHNjb3BlZF9wdHI8QXVkaW9CdXM+IGJ1czIgPQotICAgICAgQXVkaW9CdXM6OkNyZWF0ZShrQ2hhbm5lbHMsIChrTWF4RnJhbWVDb3VudCAvIDQpIC0gMSk7Ci0gIGNvbnN0IGludCBmcmFtZXNfaW5fZmlmbyA9IGJ1czItPmZyYW1lcygpOwotICBmaWZvLlB1c2goYnVzMi5nZXQoKSk7Ci0gIEVYUEVDVF9FUShmaWZvLmZyYW1lcygpLCBmcmFtZXNfaW5fZmlmbyk7Ci0gIGZvciAoaW50IG4gPSAwOyBuIDwga01heEZyYW1lQ291bnQ7ICsrbikgewotICAgIGZpZm8uUHVzaChidXMyLmdldCgpKTsKLSAgICBmaWZvLkNvbnN1bWUoYnVzMi5nZXQoKSwgMCwgZnJhbWVzX2luX2ZpZm8pOwotICAgIEVYUEVDVF9FUShmaWZvLmZyYW1lcygpLCBmcmFtZXNfaW5fZmlmbyk7Ci0gIH0KLX0KLQotLy8gUGVyZm9ybSBhIHNlcXVlbmNlIG9mIFB1c2gvQ29uc3VtZSBjYWxscyBhbmQgdmVyaWZ5IHRoYXQgdGhlIGRhdGEgd3JpdHRlbgotLy8gdG8gdGhlIEZJRk8gaXMgY29ycmVjdGx5IHJldHJpZXZlZCwgaS5lLiwgdGhhdCB0aGUgb3JkZXIgaXMgY29ycmVjdCBhbmQgdGhlCi0vLyB2YWx1ZXMgYXJlIGNvcnJlY3QuCi1URVNUX0YoQXVkaW9GaWZvVGVzdCwgVmVyaWZ5RGF0YVZhbHVlcykgewotICBzdGF0aWMgY29uc3QgaW50IGtDaGFubmVscyA9IDI7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0ZyYW1lQ291bnQgPSAyOwotICBzdGF0aWMgY29uc3QgaW50IGtGaWZvRnJhbWVDb3VudCA9IDUgKiBrRnJhbWVDb3VudDsKLQotICBBdWRpb0ZpZm8gZmlmbyhrQ2hhbm5lbHMsIGtGaWZvRnJhbWVDb3VudCk7Ci0gIHNjb3BlZF9wdHI8QXVkaW9CdXM+IGJ1cyA9IEF1ZGlvQnVzOjpDcmVhdGUoa0NoYW5uZWxzLCBrRnJhbWVDb3VudCk7Ci0gIEVYUEVDVF9FUShmaWZvLmZyYW1lcygpLCAwKTsKLSAgRVhQRUNUX0VRKGJ1cy0+ZnJhbWVzKCksIGtGcmFtZUNvdW50KTsKLQotICAvLyBTdGFydCBieSBmaWxsaW5nIHVwIHRoZSBGSUZPIHdpdGggYXVkaW8gZnJhbWVzLiBUaGUgZmlyc3QgYXVkaW8gZnJhbWUKLSAgLy8gd2lsbCBjb250YWluIGFsbCAxJ3MsIHRoZSBzZWNvbmQgYWxsIDIncyBldGMuIEFsbCBjaGFubmVscyBjb250YWluIHRoZQotICAvLyBzYW1lIHZhbHVlLgotICBpbnQgdmFsdWUgPSAxOwotICB3aGlsZSAoZmlmby5mcmFtZXMoKSA8IGtGaWZvRnJhbWVDb3VudCkgewotICAgIGZvciAoaW50IGogPSAwOyBqIDwgYnVzLT5jaGFubmVscygpOyArK2opCi0gICAgICBzdGQ6OmZpbGwoYnVzLT5jaGFubmVsKGopLCBidXMtPmNoYW5uZWwoaikgKyBidXMtPmZyYW1lcygpLCB2YWx1ZSk7Ci0gICAgZmlmby5QdXNoKGJ1cy5nZXQoKSk7Ci0gICAgRVhQRUNUX0VRKGZpZm8uZnJhbWVzKCksIGJ1cy0+ZnJhbWVzKCkgKiB2YWx1ZSk7Ci0gICAgKyt2YWx1ZTsKLSAgfQotCi0gIC8vIEZJRk8gc2hvdWxkIGJlIGZ1bGwgbm93LgotICBFWFBFQ1RfRVEoZmlmby5mcmFtZXMoKSwga0ZpZm9GcmFtZUNvdW50KTsKLQotICAvLyBDb25zdW1lIGFsbCBhdWRpbyBmcmFtZXMgaW4gdGhlIEZJRk8gYW5kIHZlcmlmeSB0aGF0IHRoZSBzdG9yZWQgdmFsdWVzCi0gIC8vIGFyZSBjb3JyZWN0LiBJbiB0aGlzIGV4YW1wbGUsIHdlIHNoYWxsIHJlYWQgb3V0OiAxLCAyLCAzLCA0LCA1IGluIHRoYXQKLSAgLy8gb3JkZXIuIE5vdGUgdGhhdCB3ZSBzZXQgfGZyYW1lc190b19jb25zdW1lfCB0byBoYWxmIHRoZSBzaXplIG9mIHRoZSBidXMuCi0gIC8vIEl0IG1lYW5zIHRoYXQgd2Ugc2hhbGwgcmVhZCBvdXQgdGhlIHNhbWUgdmFsdWUgdHdvIHRpbWVzIGluIHJvdy4KLSAgdmFsdWUgPSAxOwotICBpbnQgbiA9IDE7Ci0gIGNvbnN0IGludCBmcmFtZXNfdG9fY29uc3VtZSA9IGJ1cy0+ZnJhbWVzKCkgLyAyOwotICB3aGlsZSAoZmlmby5mcmFtZXMoKSA+IDApIHsKLSAgICBmaWZvLkNvbnN1bWUoYnVzLmdldCgpLCAwLCBmcmFtZXNfdG9fY29uc3VtZSk7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBidXMtPmNoYW5uZWxzKCk7ICsraikKLSAgICAgIFZlcmlmeVZhbHVlKGJ1cy0+Y2hhbm5lbChqKSwgZnJhbWVzX3RvX2NvbnN1bWUsIHZhbHVlKTsKLSAgICBpZiAobisrICUgMiA9PSAwKQotICAgICAgKyt2YWx1ZTsgIC8vIGNvdW50cyAxLCAxLCAyLCAyLCAzLCAzLC4uLgotICB9Ci0KLSAgLy8gRklGTyBzaG91bGQgYmUgZW1wdHkgbm93LgotICBFWFBFQ1RfRVEoZmlmby5mcmFtZXMoKSwgMCk7Ci0KLSAgLy8gUHVzaCBvbmUgYXVkaW8gYnVzIHRvIHRoZSBGSUZPIGFuZCBmaWxsIGl0IHdpdGggMSdzLgotICB2YWx1ZSA9IDE7Ci0gIGZvciAoaW50IGogPSAwOyBqIDwgYnVzLT5jaGFubmVscygpOyArK2opCi0gICAgc3RkOjpmaWxsKGJ1cy0+Y2hhbm5lbChqKSwgYnVzLT5jaGFubmVsKGopICsgYnVzLT5mcmFtZXMoKSwgdmFsdWUpOwotICBmaWZvLlB1c2goYnVzLmdldCgpKTsKLSAgRVhQRUNUX0VRKGZpZm8uZnJhbWVzKCksIGJ1cy0+ZnJhbWVzKCkpOwotCi0gIC8vIEtlZXAgY2FsbGluZyBDb25zdW1lL1B1c2ggYSBmZXcgcm91bmRzIGFuZCB2ZXJpZnkgdGhhdCB3ZSByZWFkIG91dCB0aGUKLSAgLy8gY29ycmVjdCB2YWx1ZXMuIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgc2hhbGwgYmUgZml4ZWQgKGtGcmFtZUNvdW50KSBkdXJpbmcKLSAgLy8gdGhpcyBwaGFzZS4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCA1ICoga0ZpZm9GcmFtZUNvdW50OyBpKyspIHsKLSAgICBmaWZvLkNvbnN1bWUoYnVzLmdldCgpLCAwLCBidXMtPmZyYW1lcygpKTsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IGJ1cy0+Y2hhbm5lbHMoKTsgKytqKSB7Ci0gICAgICBWZXJpZnlWYWx1ZShidXMtPmNoYW5uZWwoaiksIGJ1cy0+Y2hhbm5lbHMoKSwgdmFsdWUpOwotICAgICAgc3RkOjpmaWxsKGJ1cy0+Y2hhbm5lbChqKSwgYnVzLT5jaGFubmVsKGopICsgYnVzLT5mcmFtZXMoKSwgdmFsdWUgKyAxKTsKLSAgICB9Ci0gICAgZmlmby5QdXNoKGJ1cy5nZXQoKSk7Ci0gICAgRVhQRUNUX0VRKGZpZm8uZnJhbWVzKCksIGJ1cy0+ZnJhbWVzKCkpOwotICAgICsrdmFsdWU7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9hdWRpb19wdWxsX2ZpZm8uY2MgYi9zcmMvbWVkaWEvYmFzZS9hdWRpb19wdWxsX2ZpZm8uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NDM1OTEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvYXVkaW9fcHVsbF9maWZvLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fcHVsbF9maWZvLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotQXVkaW9QdWxsRmlmbzo6QXVkaW9QdWxsRmlmbyhpbnQgY2hhbm5lbHMsIGludCBmcmFtZXMsIGNvbnN0IFJlYWRDQiYgcmVhZF9jYikKLSAgICA6IHJlYWRfY2JfKHJlYWRfY2IpIHsKLSAgZmlmb18ucmVzZXQobmV3IEF1ZGlvRmlmbyhjaGFubmVscywgZnJhbWVzKSk7Ci0gIGJ1c18gPSBBdWRpb0J1czo6Q3JlYXRlKGNoYW5uZWxzLCBmcmFtZXMpOwotfQotCi1BdWRpb1B1bGxGaWZvOjp+QXVkaW9QdWxsRmlmbygpIHsKLSAgcmVhZF9jYl8uUmVzZXQoKTsKLX0KLQotdm9pZCBBdWRpb1B1bGxGaWZvOjpDb25zdW1lKEF1ZGlvQnVzKiBkZXN0aW5hdGlvbiwgaW50IGZyYW1lc190b19jb25zdW1lKSB7Ci0gIERDSEVDSyhkZXN0aW5hdGlvbik7Ci0gIERDSEVDS19MRShmcmFtZXNfdG9fY29uc3VtZSwgZGVzdGluYXRpb24tPmZyYW1lcygpKTsKLQotICBpbnQgd3JpdGVfcG9zID0gMDsKLSAgaW50IHJlbWFpbmluZ19mcmFtZXNfdG9fcHJvdmlkZSA9IGZyYW1lc190b19jb25zdW1lOwotCi0gIC8vIFRyeSB0byBmdWxmaWxsIHRoZSByZXF1ZXN0IHVzaW5nIHdoYXQncyBhdmFpbGFibGUgaW4gdGhlIEZJRk8uCi0gIFJlYWRGcm9tRmlmbyhkZXN0aW5hdGlvbiwgJnJlbWFpbmluZ19mcmFtZXNfdG9fcHJvdmlkZSwgJndyaXRlX3Bvcyk7Ci0KLSAgLy8gR2V0IHRoZSByZW1haW5pbmcgYXVkaW8gZnJhbWVzIGZyb20gdGhlIHByb2R1Y2VyIHVzaW5nIHRoZSBjYWxsYmFjay4KLSAgd2hpbGUgKHJlbWFpbmluZ19mcmFtZXNfdG9fcHJvdmlkZSA+IDApIHsKLSAgICAvLyBGaWxsIHVwIHRoZSBGSUZPIGJ5IGFjcXVpcmluZyBhdWRpbyBkYXRhIGZyb20gdGhlIHByb2R1Y2VyLgotICAgIHJlYWRfY2JfLlJ1bih3cml0ZV9wb3MsIGJ1c18uZ2V0KCkpOwotICAgIGZpZm9fLT5QdXNoKGJ1c18uZ2V0KCkpOwotCi0gICAgLy8gVHJ5IHRvIGZ1bGZpbGwgdGhlIHJlcXVlc3QgdXNpbmcgd2hhdCdzIGF2YWlsYWJsZSBpbiB0aGUgRklGTy4KLSAgICBSZWFkRnJvbUZpZm8oZGVzdGluYXRpb24sICZyZW1haW5pbmdfZnJhbWVzX3RvX3Byb3ZpZGUsICZ3cml0ZV9wb3MpOwotICB9Ci19Ci0KLXZvaWQgQXVkaW9QdWxsRmlmbzo6Q2xlYXIoKSB7Ci0gIGZpZm9fLT5DbGVhcigpOwotfQotCi12b2lkIEF1ZGlvUHVsbEZpZm86OlJlYWRGcm9tRmlmbyhBdWRpb0J1cyogZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGZyYW1lc190b19wcm92aWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3cml0ZV9wb3MpIHsKLSAgRENIRUNLKGZyYW1lc190b19wcm92aWRlKTsKLSAgRENIRUNLKHdyaXRlX3Bvcyk7Ci0gIGludCBmcmFtZXMgPSBzdGQ6Om1pbihmaWZvXy0+ZnJhbWVzKCksICpmcmFtZXNfdG9fcHJvdmlkZSk7Ci0gIGZpZm9fLT5Db25zdW1lKGRlc3RpbmF0aW9uLCAqd3JpdGVfcG9zLCBmcmFtZXMpOwotICAqd3JpdGVfcG9zICs9IGZyYW1lczsKLSAgKmZyYW1lc190b19wcm92aWRlIC09IGZyYW1lczsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9hdWRpb19wdWxsX2ZpZm8uaCBiL3NyYy9tZWRpYS9iYXNlL2F1ZGlvX3B1bGxfZmlmby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWY3M2U0Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL2F1ZGlvX3B1bGxfZmlmby5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9CQVNFX0FVRElPX1BVTExfRklGT19IXwotI2RlZmluZSBNRURJQV9CQVNFX0FVRElPX1BVTExfRklGT19IXwotCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fZmlmby5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIEEgRklGTyAoRmlyc3QgSW4gRmlyc3QgT3V0KSBidWZmZXIgdG8gaGFuZGxlIG1pc21hdGNoZXMgaW4gYnVmZmVyIHNpemVzCi0vLyBiZXR3ZWVuIGEgcHJvZHVjZXIgYW5kIGNvbnN1bWVyLiBUaGUgY29uc3VtZXIgd2lsbCBwdWxsIGRhdGEgZnJvbSB0aGlzIEZJRk8uCi0vLyBJZiBkYXRhIGlzIGFscmVhZHkgYXZhaWxhYmxlIGluIHRoZSBGSUZPLCBpdCBpcyBwcm92aWRlZCB0byB0aGUgY29uc3VtZXIuCi0vLyBJZiBpbnN1ZmZpY2llbnQgZGF0YSBpcyBhdmFpbGFibGUgdG8gc2F0aXNmeSB0aGUgcmVxdWVzdCwgdGhlIEZJRk8gd2lsbCBhc2sKLS8vIHRoZSBwcm9kdWNlciBmb3IgbW9yZSBkYXRhIHRvIGZ1bGZpbGwgYSByZXF1ZXN0LgotY2xhc3MgTUVESUFfRVhQT1JUIEF1ZGlvUHVsbEZpZm8gewotIHB1YmxpYzoKLSAgLy8gQ2FsbGJhY2sgdHlwZSBmb3IgcHJvdmlkaW5nIG1vcmUgZGF0YSBpbnRvIHRoZSBGSUZPLiAgRXhwZWN0cyBBdWRpb0J1cwotICAvLyB0byBiZSBjb21wbGV0ZWx5IGZpbGxlZCB3aXRoIGRhdGEgdXBvbiByZXR1cm47IHplcm8gcGFkZGVkIGlmIG5vdCBlbm91Z2gKLSAgLy8gZnJhbWVzIGFyZSBhdmFpbGFibGUgdG8gc2F0aXNmeSB0aGUgcmVxdWVzdC4gIHxmcmFtZV9kZWxheXwgaXMgdGhlIG51bWJlcgotICAvLyBvZiBvdXRwdXQgZnJhbWVzIGFscmVhZHkgcHJvY2Vzc2VkIGFuZCBjYW4gYmUgdXNlZCB0byBlc3RpbWF0ZSBkZWxheS4KLSAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKGludCBmcmFtZV9kZWxheSwgQXVkaW9CdXMqIGF1ZGlvX2J1cyk+IFJlYWRDQjsKLQotICAvLyBDb25zdHJ1Y3RzIGFuIEF1ZGlvUHVsbEZpZm8gd2l0aCB0aGUgc3BlY2lmaWVkIHxyZWFkX2NifCwgd2hpY2ggaXMgdXNlZCB0bwotICAvLyByZWFkIGF1ZGlvIGRhdGEgdG8gdGhlIEZJRk8gaWYgZGF0YSBpcyBub3QgYWxyZWFkeSBhdmFpbGFibGUuIFRoZSBpbnRlcm5hbAotICAvLyBGSUZPIGNhbiBjb250YWluIHxjaGFubmVsfCBudW1iZXIgb2YgY2hhbm5lbHMsIHdoZXJlIGVhY2ggY2hhbm5lbCBpcyBvZgotICAvLyBsZW5ndGggfGZyYW1lc3wgYXVkaW8gZnJhbWVzLgotICBBdWRpb1B1bGxGaWZvKGludCBjaGFubmVscywgaW50IGZyYW1lcywgY29uc3QgUmVhZENCJiByZWFkX2NiKTsKLSAgdmlydHVhbCB+QXVkaW9QdWxsRmlmbygpOwotCi0gIC8vIENvbnN1bWVzIHxmcmFtZXNfdG9fY29uc3VtZXwgYXVkaW8gZnJhbWVzIGZyb20gdGhlIEZJRk8gYW5kIGNvcGllcwotICAvLyB0aGVtIHRvIHxkZXN0aW5hdGlvbnwuIElmIHRoZSBGSUZPIGRvZXMgbm90IGhhdmUgZW5vdWdoIGRhdGEsIHdlIGFzawotICAvLyB0aGUgcHJvZHVjZXIgdG8gZ2l2ZSB1cyBtb3JlIGRhdGEgdG8gZnVsZmlsbCB0aGUgcmVxdWVzdCB1c2luZyB0aGUKLSAgLy8gUmVhZENCIGltcGxlbWVudGF0aW9uLgotICB2b2lkIENvbnN1bWUoQXVkaW9CdXMqIGRlc3RpbmF0aW9uLCBpbnQgZnJhbWVzX3RvX2NvbnN1bWUpOwotCi0gIC8vIEVtcHRpZXMgdGhlIEZJRk8gd2l0aG91dCBkZWFsbG9jYXRpbmcgYW55IG1lbW9yeS4KLSAgdm9pZCBDbGVhcigpOwotCi0gcHJpdmF0ZToKLSAgLy8gQXR0ZW1wdCB0byBmdWxmaWxsIHRoZSByZXF1ZXN0IHVzaW5nIHdoYXQgaXMgYXZhaWxhYmxlIGluIHRoZSBGSUZPLgotICAvLyBBcHBlbmQgbmV3IGRhdGEgdG8gdGhlIHxkZXN0aW5hdGlvbnwgc3RhcnRpbmcgYXQgfHdyaXRlX3Bvc3wuCi0gIHZvaWQgUmVhZEZyb21GaWZvKAotICAgICAgQXVkaW9CdXMqIGRlc3RpbmF0aW9uLCBpbnQqIGZyYW1lc190b19wcm92aWRlLCBpbnQqIHdyaXRlX3Bvcyk7Ci0KLSAgLy8gU291cmNlIG9mIGRhdGEgdG8gdGhlIEZJRk8uCi0gIFJlYWRDQiByZWFkX2NiXzsKLQotICAvLyBUaGUgYWN0dWFsIEZJRk8uCi0gIHNjb3BlZF9wdHI8QXVkaW9GaWZvPiBmaWZvXzsKLQotICAvLyBUZW1wb3JhcnkgYXVkaW8gYnVzIHRvIGhvbGQgdGhlIGRhdGEgZnJvbSB0aGUgcHJvZHVjZXIuCi0gIHNjb3BlZF9wdHI8QXVkaW9CdXM+IGJ1c187Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEF1ZGlvUHVsbEZpZm8pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQkFTRV9BVURJT19QVUxMX0ZJRk9fSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2F1ZGlvX3B1bGxfZmlmb191bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9iYXNlL2F1ZGlvX3B1bGxfZmlmb191bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VjNGQzNS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9hdWRpb19wdWxsX2ZpZm9fdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiYmFzZS9iaW5kX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJiYXNlL3N0cmluZ3ByaW50Zi5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fcHVsbF9maWZvLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIEJsb2NrIGRpYWdyYW0gb2YgYSBwb3NzaWJsZSByZWFsLXdvcmxkIHVzYWdlOgotLy8KLS8vICAgICAgIHwgUHJvZHVjZXIgfCAtLS0tPiB8IEF1ZGlvUHVsbEZpZm8gfCAtLS0tPiB8IENvbnN1bWVyIHwKLS8vICAgICAgICAgICAgICAgICAgICBwdXNoICAgICAgICAgICAgICAgICAgICBwdWxsCi0vLyAgICAgICAgICAyMDQ4ICAgICAgLS0tLT4gICAgICAgKDIwNDgpICAgICAgLS0tLT4gICAgIH41MTIKLQotLy8gTnVtYmVyIG9mIGNoYW5uZWxzIGluIGVhY2ggYXVkaW8gYnVzLgotc3RhdGljIGludCBrQ2hhbm5lbHMgPSAyOwotCi0vLyBNYXggbnVtYmVyIG9mIGF1ZGlvIGZyYW1lZCB0aGUgRklGTyBjYW4gY29udGFpbi4KLXN0YXRpYyBjb25zdCBpbnQga01heEZyYW1lc0luRmlmbyA9IDIwNDg7Ci0KLWNsYXNzIEF1ZGlvUHVsbEZpZm9UZXN0Ci0gICAgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxpbnQ+IHsKLSBwdWJsaWM6Ci0gIEF1ZGlvUHVsbEZpZm9UZXN0KCkKLSAgICA6IHB1bGxfZmlmb18oa0NoYW5uZWxzLCBrTWF4RnJhbWVzSW5GaWZvLCBiYXNlOjpCaW5kKAotICAgICAgICAgICZBdWRpb1B1bGxGaWZvVGVzdDo6UHJvdmlkZUlucHV0LCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSksCi0gICAgICBhdWRpb19idXNfKEF1ZGlvQnVzOjpDcmVhdGUoa0NoYW5uZWxzLCBrTWF4RnJhbWVzSW5GaWZvKSksCi0gICAgICBmaWxsX3ZhbHVlXygwKSwKLSAgICAgIGxhc3RfZnJhbWVfZGVsYXlfKC0xKSB7fQotICB2aXJ0dWFsIH5BdWRpb1B1bGxGaWZvVGVzdCgpIHt9Ci0KLSAgdm9pZCBWZXJpZnlWYWx1ZShjb25zdCBmbG9hdCBkYXRhW10sIGludCBzaXplLCBmbG9hdCBzdGFydF92YWx1ZSkgewotICAgIGZsb2F0IHZhbHVlID0gc3RhcnRfdmFsdWU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgIEFTU0VSVF9GTE9BVF9FUSh2YWx1ZSsrLCBkYXRhW2ldKSA8PCAiaT0iIDw8IGk7Ci0gICAgfQotICB9Ci0KLSAgLy8gQ29uc3VtZSBkYXRhIHVzaW5nIGRpZmZlcmVudCBzaXplcywgYWNxdWlyZSBhdWRpbyBmcmFtZXMgZnJvbSB0aGUgRklGTwotICAvLyBhbmQgdmVyaWZ5IHRoYXQgdGhlIHJldHJpZXZlZCB2YWx1ZXMgbWF0Y2hlcyB0aGUgdmFsdWVzIHdyaXR0ZW4gYnkgdGhlCi0gIC8vIHByb2R1Y2VyLgotICB2b2lkIENvbnN1bWVUZXN0KGludCBmcmFtZXNfdG9fY29uc3VtZSkgewotICAgIGludCBzdGFydF92YWx1ZSA9IDA7Ci0gICAgU0NPUEVEX1RSQUNFKGJhc2U6OlN0cmluZ1ByaW50ZigiQ2hlY2tpbmcgZnJhbWVzX3RvX2NvbnN1bWUgJWQiLAotICAgICAgICAgICAgICAgICBmcmFtZXNfdG9fY29uc3VtZSkpOwotICAgIHB1bGxfZmlmb18uQ29uc3VtZShhdWRpb19idXNfLmdldCgpLCBmcmFtZXNfdG9fY29uc3VtZSk7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBrQ2hhbm5lbHM7ICsraikgewotICAgICAgVmVyaWZ5VmFsdWUoYXVkaW9fYnVzXy0+Y2hhbm5lbChqKSwgZnJhbWVzX3RvX2NvbnN1bWUsIHN0YXJ0X3ZhbHVlKTsKLSAgICB9Ci0gICAgc3RhcnRfdmFsdWUgKz0gZnJhbWVzX3RvX2NvbnN1bWU7Ci0gICAgRVhQRUNUX0xUKGxhc3RfZnJhbWVfZGVsYXlfLCBhdWRpb19idXNfLT5mcmFtZXMoKSk7Ci0gIH0KLQotICAvLyBBdWRpb1B1bGxGaWZvOjpSZWFkQ0IgaW1wbGVtZW50YXRpb24gd2hlcmUgd2UgaW5jcmVhc2UgYSB2YWx1ZSBmb3IgZWFjaAotICAvLyBhdWRpbyBmcmFtZSB0aGF0IHdlIHByb3ZpZGUuIE5vdGUgdGhhdCBhbGwgY2hhbm5lbHMgYXJlIGdpdmVuIHRoZSBzYW1lCi0gIC8vIHZhbHVlIHRvIHNpbXBsaWZ5IHRoZSB2ZXJpZmljYXRpb24uCi0gIHZpcnR1YWwgdm9pZCBQcm92aWRlSW5wdXQoaW50IGZyYW1lX2RlbGF5LCBBdWRpb0J1cyogYXVkaW9fYnVzKSB7Ci0gICAgQVNTRVJUX0dUKGZyYW1lX2RlbGF5LCBsYXN0X2ZyYW1lX2RlbGF5Xyk7Ci0gICAgbGFzdF9mcmFtZV9kZWxheV8gPSBmcmFtZV9kZWxheTsKLQotICAgIEVYUEVDVF9FUShhdWRpb19idXMtPmNoYW5uZWxzKCksIGF1ZGlvX2J1c18tPmNoYW5uZWxzKCkpOwotICAgIEVYUEVDVF9FUShhdWRpb19idXMtPmZyYW1lcygpLCBrTWF4RnJhbWVzSW5GaWZvKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGF1ZGlvX2J1cy0+ZnJhbWVzKCk7ICsraSkgewotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBhdWRpb19idXMtPmNoYW5uZWxzKCk7ICsraikgewotICAgICAgICAvLyBTdG9yZSBzYW1lIHZhbHVlIGluIGFsbCBjaGFubmVscy4KLSAgICAgICAgYXVkaW9fYnVzLT5jaGFubmVsKGopW2ldID0gZmlsbF92YWx1ZV87Ci0gICAgICB9Ci0gICAgICBmaWxsX3ZhbHVlXysrOwotICAgIH0KLSAgfQotCi0gcHJvdGVjdGVkOgotICBBdWRpb1B1bGxGaWZvIHB1bGxfZmlmb187Ci0gIHNjb3BlZF9wdHI8QXVkaW9CdXM+IGF1ZGlvX2J1c187Ci0gIGludCBmaWxsX3ZhbHVlXzsKLSAgaW50IGxhc3RfZnJhbWVfZGVsYXlfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBdWRpb1B1bGxGaWZvVGVzdCk7Ci19OwotCi1URVNUX1AoQXVkaW9QdWxsRmlmb1Rlc3QsIENvbnN1bWUpIHsKLSAgQ29uc3VtZVRlc3QoR2V0UGFyYW0oKSk7Ci19Ci0KLS8vIFRlc3QgY29tbW9uIHxmcmFtZXNfdG9fY29uc3VtZXwgdmFsdWVzIHdoaWNoIHdpbGwgYmUgdXNlZCBhcyBpbnB1dAotLy8gcGFyYW1ldGVyIHRvIEF1ZGlvUHVsbEZpZm86OkNvbnN1bWUoKSB3aGVuIHRoZSBjb25zdW1lciBhc2tzIGZvciBkYXRhLgotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoCi0gICAgQXVkaW9QdWxsRmlmb1Rlc3QsIEF1ZGlvUHVsbEZpZm9UZXN0LAotICAgIHRlc3Rpbmc6OlZhbHVlcyg1NDQsIDUxMiwgNTEyLCA1MTIsIDUxMiwgMjA0OCwgNTQ0LCA0NDEsIDQ0MCwgNDMzLCA1MDApKTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9hdWRpb19yZW5kZXJlci5jYyBiL3NyYy9tZWRpYS9iYXNlL2F1ZGlvX3JlbmRlcmVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2I3MzdlLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL2F1ZGlvX3JlbmRlcmVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fcmVuZGVyZXIuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotQXVkaW9SZW5kZXJlcjo6QXVkaW9SZW5kZXJlcigpIHt9Ci1BdWRpb1JlbmRlcmVyOjp+QXVkaW9SZW5kZXJlcigpIHt9Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvYXVkaW9fcmVuZGVyZXIuaCBiL3NyYy9tZWRpYS9iYXNlL2F1ZGlvX3JlbmRlcmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NDU5YWMuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvYXVkaW9fcmVuZGVyZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0JBU0VfQVVESU9fUkVOREVSRVJfSF8KLSNkZWZpbmUgTUVESUFfQkFTRV9BVURJT19SRU5ERVJFUl9IXwotCi0jaW5jbHVkZSA8bGlzdD4KLQotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGltZS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9waXBlbGluZV9zdGF0dXMuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgQXVkaW9EZWNvZGVyOwotY2xhc3MgRGVtdXhlclN0cmVhbTsKLQotY2xhc3MgTUVESUFfRVhQT1JUIEF1ZGlvUmVuZGVyZXIKLSAgICA6IHB1YmxpYyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxBdWRpb1JlbmRlcmVyPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIHN0ZDo6bGlzdDxzY29wZWRfcmVmcHRyPEF1ZGlvRGVjb2Rlcj4gPiBBdWRpb0RlY29kZXJMaXN0OwotCi0gIC8vIEZpcnN0IHBhcmFtZXRlciBpcyB0aGUgY3VycmVudCB0aW1lIHRoYXQgaGFzIGJlZW4gcmVuZGVyZWQuCi0gIC8vIFNlY29uZCBwYXJhbWV0ZXIgaXMgdGhlIG1heGltdW0gdGltZSB2YWx1ZSB0aGF0IHRoZSBjbG9jayBjYW5ub3QgZXhjZWVkLgotICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHZvaWQoYmFzZTo6VGltZURlbHRhLCBiYXNlOjpUaW1lRGVsdGEpPiBUaW1lQ0I7Ci0KLSAgLy8gSW5pdGlhbGl6ZSBhIEF1ZGlvUmVuZGVyZXIgd2l0aCB0aGUgZ2l2ZW4gQXVkaW9EZWNvZGVyLCBleGVjdXRpbmcgdGhlCi0gIC8vIHxpbml0X2NifCB1cG9uIGNvbXBsZXRpb24uCi0gIC8vCi0gIC8vIHxzdGF0aXN0aWNzX2NifCBpcyBleGVjdXRlZCBwZXJpb2RpY2FsbHkgd2l0aCBhdWRpbyByZW5kZXJpbmcgc3RhdHMuCi0gIC8vCi0gIC8vIHx1bmRlcmZsb3dfY2J8IGlzIGV4ZWN1dGVkIHdoZW4gdGhlIHJlbmRlcmVyIHJ1bnMgb3V0IG9mIGRhdGEgdG8gcGFzcyB0bwotICAvLyB0aGUgYXVkaW8gY2FyZCBkdXJpbmcgcGxheWJhY2suIFJlc3VtZUFmdGVyVW5kZXJmbG93KCkgbXVzdCBiZSBjYWxsZWQKLSAgLy8gdG8gcmVzdW1lIHBsYXliYWNrLiBQYXVzZSgpLCBQcmVyb2xsKCksIG9yIFN0b3AoKSBjYW5jZWxzIHRoZSB1bmRlcmZsb3cKLSAgLy8gY29uZGl0aW9uLgotICAvLwotICAvLyB8dGltZV9jYnwgaXMgZXhlY3V0ZWQgd2hlbmV2ZXIgdGltZSBoYXMgYWR2YW5jZWQgYnkgd2F5IG9mIGF1ZGlvIHJlbmRlcmluZy4KLSAgLy8KLSAgLy8gfGVuZGVkX2NifCBpcyBleGVjdXRlZCB3aGVuIGF1ZGlvIHJlbmRlcmluZyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIHN0cmVhbS4KLSAgLy8KLSAgLy8gfGRpc2FibGVkX2NifCBpcyBleGVjdXRlZCB3aGVuIGF1ZGlvIHJlbmRlcmluZyBoYXMgYmVlbiBkaXNhYmxlZCBkdWUgdG8KLSAgLy8gZXh0ZXJuYWwgZmFjdG9ycyAoaS5lLiwgZGV2aWNlIHdhcyByZW1vdmVkKS4gfHRpbWVfY2J8IHdpbGwgbm8gbG9uZ2VyIGJlCi0gIC8vIGV4ZWN1dGVkLgotICAvLwotICAvLyB8ZXJyb3JfY2J8IGlzIGV4ZWN1dGVkIGlmIGFuIGVycm9yIHdhcyBlbmNvdW50ZXJlZC4KLSAgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoY29uc3Qgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiYgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RlY29kZXJMaXN0JiBkZWNvZGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgaW5pdF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdGlzdGljc0NCJiBzdGF0aXN0aWNzX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiB1bmRlcmZsb3dfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRpbWVDQiYgdGltZV9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6Q2xvc3VyZSYgZW5kZWRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIGRpc2FibGVkX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBlcnJvcl9jYikgPSAwOwotCi0gIC8vIFN0YXJ0IGF1ZGlvIGRlY29kaW5nIGFuZCByZW5kZXJpbmcgYXQgdGhlIGN1cnJlbnQgcGxheWJhY2sgcmF0ZSwgZXhlY3V0aW5nCi0gIC8vIHxjYWxsYmFja3wgd2hlbiBwbGF5YmFjayBpcyB1bmRlcndheS4KLSAgdmlydHVhbCB2b2lkIFBsYXkoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spID0gMDsKLQotICAvLyBUZW1wb3JhcmlseSBzdXNwZW5kIGRlY29kaW5nIGFuZCByZW5kZXJpbmcgYXVkaW8sIGV4ZWN1dGluZyB8Y2FsbGJhY2t8IHdoZW4KLSAgLy8gcGxheWJhY2sgaGFzIGJlZW4gc3VzcGVuZGVkLgotICB2aXJ0dWFsIHZvaWQgUGF1c2UoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spID0gMDsKLQotICAvLyBEaXNjYXJkIGFueSBhdWRpbyBkYXRhLCBleGVjdXRpbmcgfGNhbGxiYWNrfCB3aGVuIGNvbXBsZXRlZC4KLSAgdmlydHVhbCB2b2lkIEZsdXNoKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSA9IDA7Ci0KLSAgLy8gU3RhcnQgcHJlcm9sbGluZyBhdWRpbyBkYXRhIGZvciBzYW1wbGVzIHN0YXJ0aW5nIGF0IHx0aW1lfCwgZXhlY3V0aW5nCi0gIC8vIHxjYWxsYmFja3wgd2hlbiBjb21wbGV0ZWQuCi0gIC8vCi0gIC8vIE9ubHkgdmFsaWQgdG8gY2FsbCBhZnRlciBhIHN1Y2Nlc3NmdWwgSW5pdGlhbGl6ZSgpIG9yIEZsdXNoKCkuCi0gIHZpcnR1YWwgdm9pZCBQcmVyb2xsKGJhc2U6OlRpbWVEZWx0YSB0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBjYWxsYmFjaykgPSAwOwotCi0gIC8vIFN0b3AgYWxsIG9wZXJhdGlvbnMgaW4gcHJlcGFyYXRpb24gZm9yIGJlaW5nIGRlbGV0ZWQsIGV4ZWN1dGluZyB8Y2FsbGJhY2t8Ci0gIC8vIHdoZW4gY29tcGxldGUuCi0gIHZpcnR1YWwgdm9pZCBTdG9wKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSA9IDA7Ci0KLSAgLy8gVXBkYXRlcyB0aGUgY3VycmVudCBwbGF5YmFjayByYXRlLgotICB2aXJ0dWFsIHZvaWQgU2V0UGxheWJhY2tSYXRlKGZsb2F0IHBsYXliYWNrX3JhdGUpID0gMDsKLQotICAvLyBTZXRzIHRoZSBvdXRwdXQgdm9sdW1lLgotICB2aXJ0dWFsIHZvaWQgU2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSkgPSAwOwotCi0gIC8vIFJlc3VtZXMgcGxheWJhY2sgYWZ0ZXIgdW5kZXJmbG93IG9jY3Vycy4KLSAgLy8KLSAgLy8gfGJ1ZmZlcl9tb3JlX2F1ZGlvfCBpcyBzZXQgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0byBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUKLSAgLy8gZGVjb2RlZCBhdWRpbyBidWZmZXIuCi0gIHZpcnR1YWwgdm9pZCBSZXN1bWVBZnRlclVuZGVyZmxvdyhib29sIGJ1ZmZlcl9tb3JlX2F1ZGlvKSA9IDA7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGZyaWVuZCBjbGFzcyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxBdWRpb1JlbmRlcmVyPjsKLQotICBBdWRpb1JlbmRlcmVyKCk7Ci0gIHZpcnR1YWwgfkF1ZGlvUmVuZGVyZXIoKTsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBdWRpb1JlbmRlcmVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0JBU0VfQVVESU9fUkVOREVSRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2F1ZGlvX3JlbmRlcmVyX21peGVyX2lucHV0LmNjIGIvc3JjL21lZGlhL2Jhc2UvYXVkaW9fcmVuZGVyZXJfbWl4ZXJfaW5wdXQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OWIxMjYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvYXVkaW9fcmVuZGVyZXJfbWl4ZXJfaW5wdXQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19yZW5kZXJlcl9taXhlcl9pbnB1dC5oIgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19yZW5kZXJlcl9taXhlci5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1BdWRpb1JlbmRlcmVyTWl4ZXJJbnB1dDo6QXVkaW9SZW5kZXJlck1peGVySW5wdXQoCi0gICAgY29uc3QgR2V0TWl4ZXJDQiYgZ2V0X21peGVyX2NiLCBjb25zdCBSZW1vdmVNaXhlckNCJiByZW1vdmVfbWl4ZXJfY2IpCi0gICAgOiBwbGF5aW5nXyhmYWxzZSksCi0gICAgICBpbml0aWFsaXplZF8oZmFsc2UpLAotICAgICAgdm9sdW1lXygxLjBmKSwKLSAgICAgIGdldF9taXhlcl9jYl8oZ2V0X21peGVyX2NiKSwKLSAgICAgIHJlbW92ZV9taXhlcl9jYl8ocmVtb3ZlX21peGVyX2NiKSwKLSAgICAgIG1peGVyXyhOVUxMKSwKLSAgICAgIGNhbGxiYWNrXyhOVUxMKSwKLSAgICAgIGN1cnJlbnRfYXVkaW9fZGVsYXlfbWlsbGlzZWNvbmRzXygwKSB7Ci19Ci0KLUF1ZGlvUmVuZGVyZXJNaXhlcklucHV0Ojp+QXVkaW9SZW5kZXJlck1peGVySW5wdXQoKSB7Ci0gIC8vIE1peGVyIGlzIG5vIGxvbmdlciBzYWZlIHRvIHVzZSBhZnRlciB8cmVtb3ZlX21peGVyX2NiX3wgaGFzIGJlZW4gY2FsbGVkLgotICBpZiAoaW5pdGlhbGl6ZWRfKQotICAgIHJlbW92ZV9taXhlcl9jYl8uUnVuKHBhcmFtc18pOwotfQotCi12b2lkIEF1ZGlvUmVuZGVyZXJNaXhlcklucHV0OjpJbml0aWFsaXplKAotICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLAotICAgIEF1ZGlvUmVuZGVyZXJTaW5rOjpSZW5kZXJDYWxsYmFjayogY2FsbGJhY2spIHsKLSAgRENIRUNLKCFpbml0aWFsaXplZF8pOwotICBwYXJhbXNfID0gcGFyYW1zOwotICBtaXhlcl8gPSBnZXRfbWl4ZXJfY2JfLlJ1bihwYXJhbXNfKTsKLSAgY2FsbGJhY2tfID0gY2FsbGJhY2s7Ci0gIGluaXRpYWxpemVkXyA9IHRydWU7Ci19Ci0KLXZvaWQgQXVkaW9SZW5kZXJlck1peGVySW5wdXQ6OlN0YXJ0KCkgewotICBEQ0hFQ0soaW5pdGlhbGl6ZWRfKTsKLSAgRENIRUNLKCFwbGF5aW5nXyk7Ci19Ci0KLXZvaWQgQXVkaW9SZW5kZXJlck1peGVySW5wdXQ6OlN0b3AoKSB7Ci0gIC8vIFN0b3AoKSBtYXkgYmUgY2FsbGVkIGF0IGFueSB0aW1lLCBpZiBQYXVzZSgpIGhhc24ndCBiZWVuIGNhbGxlZCB3ZSBuZWVkIHRvCi0gIC8vIHJlbW92ZSBvdXIgbWl4ZXIgaW5wdXQgYmVmb3JlIHNodXRkb3duLgotICBpZiAoIXBsYXlpbmdfKQotICAgIHJldHVybjsKLQotICBtaXhlcl8tPlJlbW92ZU1peGVySW5wdXQodGhpcyk7Ci0gIHBsYXlpbmdfID0gZmFsc2U7Ci19Ci0KLXZvaWQgQXVkaW9SZW5kZXJlck1peGVySW5wdXQ6OlBsYXkoKSB7Ci0gIERDSEVDSyhpbml0aWFsaXplZF8pOwotCi0gIGlmIChwbGF5aW5nXykKLSAgICByZXR1cm47Ci0KLSAgbWl4ZXJfLT5BZGRNaXhlcklucHV0KHRoaXMpOwotICBwbGF5aW5nXyA9IHRydWU7Ci19Ci0KLXZvaWQgQXVkaW9SZW5kZXJlck1peGVySW5wdXQ6OlBhdXNlKGJvb2wgLyogZmx1c2ggKi8pIHsKLSAgRENIRUNLKGluaXRpYWxpemVkXyk7Ci0KLSAgaWYgKCFwbGF5aW5nXykKLSAgICByZXR1cm47Ci0KLSAgbWl4ZXJfLT5SZW1vdmVNaXhlcklucHV0KHRoaXMpOwotICBwbGF5aW5nXyA9IGZhbHNlOwotfQotCi1ib29sIEF1ZGlvUmVuZGVyZXJNaXhlcklucHV0OjpTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgewotICB2b2x1bWVfID0gdm9sdW1lOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotZG91YmxlIEF1ZGlvUmVuZGVyZXJNaXhlcklucHV0OjpQcm92aWRlSW5wdXQoQXVkaW9CdXMqIGF1ZGlvX2J1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YSBidWZmZXJfZGVsYXkpIHsKLSAgaW50IGZyYW1lc19maWxsZWQgPSBjYWxsYmFja18tPlJlbmRlcigKLSAgICAgIGF1ZGlvX2J1cywKLSAgICAgIGN1cnJlbnRfYXVkaW9fZGVsYXlfbWlsbGlzZWNvbmRzXyArIGJ1ZmZlcl9kZWxheS5Jbk1pbGxpc2Vjb25kcygpKTsKLQotICAvLyBBdWRpb0NvbnZlcnRlciBleHBlY3RzIHVuZmlsbGVkIGZyYW1lcyB0byBiZSB6ZXJvZWQuCi0gIGlmIChmcmFtZXNfZmlsbGVkIDwgYXVkaW9fYnVzLT5mcmFtZXMoKSkgewotICAgIGF1ZGlvX2J1cy0+WmVyb0ZyYW1lc1BhcnRpYWwoCi0gICAgICAgIGZyYW1lc19maWxsZWQsIGF1ZGlvX2J1cy0+ZnJhbWVzKCkgLSBmcmFtZXNfZmlsbGVkKTsKLSAgfQotCi0gIHJldHVybiBmcmFtZXNfZmlsbGVkID4gMCA/IHZvbHVtZV8gOiAwOwotfQotCi12b2lkIEF1ZGlvUmVuZGVyZXJNaXhlcklucHV0OjpPblJlbmRlckVycm9yKCkgewotICBjYWxsYmFja18tPk9uUmVuZGVyRXJyb3IoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9hdWRpb19yZW5kZXJlcl9taXhlcl9pbnB1dC5oIGIvc3JjL21lZGlhL2Jhc2UvYXVkaW9fcmVuZGVyZXJfbWl4ZXJfaW5wdXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA4YjEwOC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9hdWRpb19yZW5kZXJlcl9taXhlcl9pbnB1dC5oCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9CQVNFX0FVRElPX1JFTkRFUkVSX01JWEVSX0lOUFVUX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfQVVESU9fUkVOREVSRVJfTUlYRVJfSU5QVVRfSF8KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2NvbnZlcnRlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fcmVuZGVyZXJfc2luay5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBBdWRpb1JlbmRlcmVyTWl4ZXI7Ci0KLWNsYXNzIE1FRElBX0VYUE9SVCBBdWRpb1JlbmRlcmVyTWl4ZXJJbnB1dAotICAgIDogTk9OX0VYUE9SVEVEX0JBU0UocHVibGljIEF1ZGlvUmVuZGVyZXJTaW5rKSwKLSAgICAgIHB1YmxpYyBBdWRpb0NvbnZlcnRlcjo6SW5wdXRDYWxsYmFjayB7Ci0gcHVibGljOgotICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPEF1ZGlvUmVuZGVyZXJNaXhlciooCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcyk+IEdldE1peGVyQ0I7Ci0gIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZChjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcyk+IFJlbW92ZU1peGVyQ0I7Ci0KLSAgQXVkaW9SZW5kZXJlck1peGVySW5wdXQoCi0gICAgICBjb25zdCBHZXRNaXhlckNCJiBnZXRfbWl4ZXJfY2IsIGNvbnN0IFJlbW92ZU1peGVyQ0ImIHJlbW92ZV9taXhlcl9jYik7Ci0KLSAgLy8gQXVkaW9SZW5kZXJlclNpbmsgaW1wbGVtZW50YXRpb24uCi0gIHZpcnR1YWwgdm9pZCBTdGFydCgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU3RvcCgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgUGxheSgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgUGF1c2UoYm9vbCBmbHVzaCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgYm9vbCBTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1JlbmRlcmVyU2luazo6UmVuZGVyQ2FsbGJhY2sqIHJlbmRlcmVyKSBPVkVSUklERTsKLQotICAvLyBDYWxsZWQgYnkgQXVkaW9SZW5kZXJlck1peGVyIHdoZW4gbmV3IGRlbGF5IGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4KLSAgdm9pZCBzZXRfYXVkaW9fZGVsYXlfbWlsbGlzZWNvbmRzKGludCBhdWRpb19kZWxheV9taWxsaXNlY29uZHMpIHsKLSAgICBjdXJyZW50X2F1ZGlvX2RlbGF5X21pbGxpc2Vjb25kc18gPSBhdWRpb19kZWxheV9taWxsaXNlY29uZHM7Ci0gIH0KLQotICAvLyBDYWxsZWQgYnkgQXVkaW9SZW5kZXJlck1peGVyIHdoZW4gYW4gZXJyb3Igb2NjdXJzLgotICB2b2lkIE9uUmVuZGVyRXJyb3IoKTsKLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB+QXVkaW9SZW5kZXJlck1peGVySW5wdXQoKTsKLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBBdWRpb1JlbmRlcmVyTWl4ZXJJbnB1dFRlc3Q7Ci0KLSAgYm9vbCBwbGF5aW5nXzsKLSAgYm9vbCBpbml0aWFsaXplZF87Ci0gIGRvdWJsZSB2b2x1bWVfOwotCi0gIC8vIEF1ZGlvQ29udmVydGVyOjpJbnB1dENhbGxiYWNrIGltcGxlbWVudGF0aW9uLgotICB2aXJ0dWFsIGRvdWJsZSBQcm92aWRlSW5wdXQoQXVkaW9CdXMqIGF1ZGlvX2J1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YSBidWZmZXJfZGVsYXkpIE9WRVJSSURFOwotCi0gIC8vIENhbGxiYWNrcyBwcm92aWRlZCBkdXJpbmcgY29uc3RydWN0aW9uIHdoaWNoIGFsbG93IEF1ZGlvUmVuZGVyZXJNaXhlcklucHV0Ci0gIC8vIHRvIHJldHJpZXZlIGEgbWl4ZXIgZHVyaW5nIEluaXRpYWxpemUoKSBhbmQgbm90aWZ5IHdoZW4gaXQncyBkb25lIHdpdGggaXQuCi0gIEdldE1peGVyQ0IgZ2V0X21peGVyX2NiXzsKLSAgUmVtb3ZlTWl4ZXJDQiByZW1vdmVfbWl4ZXJfY2JfOwotCi0gIC8vIEF1ZGlvUGFyYW1ldGVycyByZWNlaXZlZCBkdXJpbmcgSW5pdGlhbGl6ZSgpLgotICBBdWRpb1BhcmFtZXRlcnMgcGFyYW1zXzsKLQotICAvLyBBdWRpb1JlbmRlcmVyTWl4ZXIgcHJvdmlkZWQgdGhyb3VnaCB8Z2V0X21peGVyX2NiX3wgZHVyaW5nIEluaXRpYWxpemUoKSwKLSAgLy8gZ3VhcmFudGVlZCB0byBsaXZlIChhdCBsZWFzdCkgdW50aWwgfHJlbW92ZV9taXhlcl9jYl98IGlzIGNhbGxlZC4KLSAgQXVkaW9SZW5kZXJlck1peGVyKiBtaXhlcl87Ci0KLSAgLy8gU291cmNlIG9mIGF1ZGlvIGRhdGEgd2hpY2ggaXMgcHJvdmlkZWQgdG8gdGhlIG1peGVyLgotICBBdWRpb1JlbmRlcmVyU2luazo6UmVuZGVyQ2FsbGJhY2sqIGNhbGxiYWNrXzsKLQotICAvLyBUaGUgY3VycmVudCBhdWRpbyBkZWxheSBhcyBsYXN0IHByb3ZpZGVkIGJ5IEF1ZGlvUmVuZGVyZXJNaXhlci4KLSAgaW50IGN1cnJlbnRfYXVkaW9fZGVsYXlfbWlsbGlzZWNvbmRzXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQXVkaW9SZW5kZXJlck1peGVySW5wdXQpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQkFTRV9BVURJT19SRU5ERVJFUl9NSVhFUl9JTlBVVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvYXVkaW9fcmVuZGVyZXJfbWl4ZXJfaW5wdXRfdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvYmFzZS9hdWRpb19yZW5kZXJlcl9taXhlcl9pbnB1dF91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQxM2RiMS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9hdWRpb19yZW5kZXJlcl9taXhlcl9pbnB1dF91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiYmFzZS9iaW5kX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX3JlbmRlcmVyX21peGVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19yZW5kZXJlcl9taXhlcl9pbnB1dC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZmFrZV9hdWRpb19yZW5kZXJfY2FsbGJhY2suaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21vY2tfYXVkaW9fcmVuZGVyZXJfc2luay5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1zdGF0aWMgY29uc3QgaW50IGtCaXRzUGVyQ2hhbm5lbCA9IDE2Owotc3RhdGljIGNvbnN0IGludCBrU2FtcGxlUmF0ZSA9IDQ4MDAwOwotc3RhdGljIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IDgxOTI7Ci1zdGF0aWMgY29uc3QgQ2hhbm5lbExheW91dCBrQ2hhbm5lbExheW91dCA9IENIQU5ORUxfTEFZT1VUX1NURVJFTzsKLQotY2xhc3MgQXVkaW9SZW5kZXJlck1peGVySW5wdXRUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgQXVkaW9SZW5kZXJlck1peGVySW5wdXRUZXN0KCkgewotICAgIGF1ZGlvX3BhcmFtZXRlcnNfID0gQXVkaW9QYXJhbWV0ZXJzKAotICAgICAgICBBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVIsIGtDaGFubmVsTGF5b3V0LCBrU2FtcGxlUmF0ZSwKLSAgICAgICAga0JpdHNQZXJDaGFubmVsLCBrQnVmZmVyU2l6ZSk7Ci0KLSAgICBDcmVhdGVNaXhlcklucHV0KCk7Ci0gICAgZmFrZV9jYWxsYmFja18ucmVzZXQobmV3IEZha2VBdWRpb1JlbmRlckNhbGxiYWNrKDApKTsKLSAgICBtaXhlcl9pbnB1dF8tPkluaXRpYWxpemUoYXVkaW9fcGFyYW1ldGVyc18sIGZha2VfY2FsbGJhY2tfLmdldCgpKTsKLSAgICBFWFBFQ1RfQ0FMTCgqdGhpcywgUmVtb3ZlTWl4ZXIodGVzdGluZzo6XykpOwotICAgIGF1ZGlvX2J1c18gPSBBdWRpb0J1czo6Q3JlYXRlKGF1ZGlvX3BhcmFtZXRlcnNfKTsKLSAgfQotCi0gIHZvaWQgQ3JlYXRlTWl4ZXJJbnB1dCgpIHsKLSAgICBtaXhlcl9pbnB1dF8gPSBuZXcgQXVkaW9SZW5kZXJlck1peGVySW5wdXQoCi0gICAgICAgIGJhc2U6OkJpbmQoCi0gICAgICAgICAgICAmQXVkaW9SZW5kZXJlck1peGVySW5wdXRUZXN0OjpHZXRNaXhlciwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICAgIGJhc2U6OkJpbmQoCi0gICAgICAgICAgICAmQXVkaW9SZW5kZXJlck1peGVySW5wdXRUZXN0OjpSZW1vdmVNaXhlciwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICB9Ci0KLSAgQXVkaW9SZW5kZXJlck1peGVyKiBHZXRNaXhlcihjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcykgewotICAgIGlmICghbWl4ZXJfLmdldCgpKSB7Ci0gICAgICBzY29wZWRfcmVmcHRyPE1vY2tBdWRpb1JlbmRlcmVyU2luaz4gc2luayA9IG5ldyBNb2NrQXVkaW9SZW5kZXJlclNpbmsoKTsKLSAgICAgIEVYUEVDVF9DQUxMKCpzaW5rLCBTdGFydCgpKTsKLSAgICAgIEVYUEVDVF9DQUxMKCpzaW5rLCBTdG9wKCkpOwotCi0gICAgICBtaXhlcl8ucmVzZXQobmV3IEF1ZGlvUmVuZGVyZXJNaXhlcigKLSAgICAgICAgICBhdWRpb19wYXJhbWV0ZXJzXywgYXVkaW9fcGFyYW1ldGVyc18sIHNpbmspKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1peGVyXy5nZXQoKTsKLSAgfQotCi0gIGRvdWJsZSBQcm92aWRlSW5wdXQoKSB7Ci0gICAgcmV0dXJuIG1peGVyX2lucHV0Xy0+UHJvdmlkZUlucHV0KGF1ZGlvX2J1c18uZ2V0KCksIGJhc2U6OlRpbWVEZWx0YSgpKTsKLSAgfQotCi0gIGludCBHZXRBdWRpb0RlbGF5TWlsbGlzZWNvbmRzKCkgewotICAgIHJldHVybiBtaXhlcl9pbnB1dF8tPmN1cnJlbnRfYXVkaW9fZGVsYXlfbWlsbGlzZWNvbmRzXzsKLSAgfQotCi0gIE1PQ0tfTUVUSE9EMShSZW1vdmVNaXhlciwgdm9pZChjb25zdCBBdWRpb1BhcmFtZXRlcnMmKSk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgfkF1ZGlvUmVuZGVyZXJNaXhlcklucHV0VGVzdCgpIHt9Ci0KLSAgQXVkaW9QYXJhbWV0ZXJzIGF1ZGlvX3BhcmFtZXRlcnNfOwotICBzY29wZWRfcHRyPEF1ZGlvUmVuZGVyZXJNaXhlcj4gbWl4ZXJfOwotICBzY29wZWRfcmVmcHRyPEF1ZGlvUmVuZGVyZXJNaXhlcklucHV0PiBtaXhlcl9pbnB1dF87Ci0gIHNjb3BlZF9wdHI8RmFrZUF1ZGlvUmVuZGVyQ2FsbGJhY2s+IGZha2VfY2FsbGJhY2tfOwotICBzY29wZWRfcHRyPEF1ZGlvQnVzPiBhdWRpb19idXNfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBdWRpb1JlbmRlcmVyTWl4ZXJJbnB1dFRlc3QpOwotfTsKLQotLy8gVGVzdCB0aGF0IGdldHRpbmcgYW5kIHNldHRpbmcgdGhlIHZvbHVtZSB3b3JrIGFzIGV4cGVjdGVkLiAgVGhlIHZvbHVtZSBpcwotLy8gcmV0dXJuZWQgZnJvbSBQcm92aWRlSW5wdXQoKSBvbmx5IHdoZW4gcGxheWluZy4KLVRFU1RfRihBdWRpb1JlbmRlcmVyTWl4ZXJJbnB1dFRlc3QsIEdldFNldFZvbHVtZSkgewotICBtaXhlcl9pbnB1dF8tPlN0YXJ0KCk7Ci0gIG1peGVyX2lucHV0Xy0+UGxheSgpOwotCi0gIC8vIFN0YXJ0aW5nIHZvbHVtZSBzaG91bGQgYmUgMS4wLgotICBFWFBFQ1RfRE9VQkxFX0VRKFByb3ZpZGVJbnB1dCgpLCAxKTsKLQotICBjb25zdCBkb3VibGUga1ZvbHVtZSA9IDAuNTsKLSAgRVhQRUNUX1RSVUUobWl4ZXJfaW5wdXRfLT5TZXRWb2x1bWUoa1ZvbHVtZSkpOwotICBFWFBFQ1RfRE9VQkxFX0VRKFByb3ZpZGVJbnB1dCgpLCBrVm9sdW1lKTsKLQotICBtaXhlcl9pbnB1dF8tPlN0b3AoKTsKLX0KLQotLy8gVGVzdCBTdGFydCgpL1BsYXkoKS9QYXVzZSgpL1N0b3AoKS9wbGF5aW5nKCkgYWxsIHdvcmsgYXMgZXhwZWN0ZWQuICBBbHNvCi0vLyBpbXBsaWNpdGx5IHRlc3RzIHRoYXQgQWRkTWl4ZXJJbnB1dCgpIGFuZCBSZW1vdmVNaXhlcklucHV0KCkgd29yayB3aXRob3V0Ci0vLyBjcmFzaGluZzsgZnVuY3Rpb25hbCB0ZXN0cyBmb3IgdGhlc2UgbWV0aG9kcyBhcmUgaW4gQXVkaW9SZW5kZXJlck1peGVyVGVzdC4KLVRFU1RfRihBdWRpb1JlbmRlcmVyTWl4ZXJJbnB1dFRlc3QsIFN0YXJ0UGxheVBhdXNlU3RvcFBsYXlpbmcpIHsKLSAgbWl4ZXJfaW5wdXRfLT5TdGFydCgpOwotICBtaXhlcl9pbnB1dF8tPlBsYXkoKTsKLSAgRVhQRUNUX0RPVUJMRV9FUShQcm92aWRlSW5wdXQoKSwgMSk7Ci0gIG1peGVyX2lucHV0Xy0+UGF1c2UoZmFsc2UpOwotICBtaXhlcl9pbnB1dF8tPlBsYXkoKTsKLSAgRVhQRUNUX0RPVUJMRV9FUShQcm92aWRlSW5wdXQoKSwgMSk7Ci0gIG1peGVyX2lucHV0Xy0+U3RvcCgpOwotfQotCi0vLyBUZXN0IHRoYXQgU3RvcCgpIGNhbiBiZSBjYWxsZWQgYmVmb3JlIEluaXRpYWxpemUoKSBhbmQgU3RhcnQoKS4KLVRFU1RfRihBdWRpb1JlbmRlcmVyTWl4ZXJJbnB1dFRlc3QsIFN0b3BCZWZvcmVJbml0aWFsaXplT3JTdGFydCkgewotICAvLyB8bWl4ZXJfaW5wdXRffCB3YXMgaW5pdGlhbGl6ZWQgZHVyaW5nIGNvbnN0cnVjdGlvbi4KLSAgbWl4ZXJfaW5wdXRfLT5TdG9wKCk7Ci0KLSAgLy8gVmVyaWZ5IFN0b3AoKSB3b3JrcyB3aXRob3V0IEluaXRpYWxpemUoKSBvciBTdGFydCgpLgotICBDcmVhdGVNaXhlcklucHV0KCk7Ci0gIG1peGVyX2lucHV0Xy0+U3RvcCgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2F1ZGlvX3JlbmRlcmVyX3NpbmsuaCBiL3NyYy9tZWRpYS9iYXNlL2F1ZGlvX3JlbmRlcmVyX3NpbmsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA0M2I4NS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9hdWRpb19yZW5kZXJlcl9zaW5rLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9CQVNFX0FVRElPX1JFTkRFUkVSX1NJTktfSF8KLSNkZWZpbmUgTUVESUFfQkFTRV9BVURJT19SRU5ERVJFUl9TSU5LX0hfCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb19wYXJhbWV0ZXJzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19idXMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotCi0jaWYgZGVmaW5lZChPU19TVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCIKLSNlbmRpZiAgLy8gZGVmaW5lZChPU19TVEFSQk9BUkQpCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIEF1ZGlvUmVuZGVyZXJTaW5rIGlzIGFuIGludGVyZmFjZSByZXByZXNlbnRpbmcgdGhlIGVuZC1wb2ludCBmb3IKLS8vIHJlbmRlcmVkIGF1ZGlvLiAgQW4gaW1wbGVtZW50YXRpb24gaXMgZXhwZWN0ZWQgdG8KLS8vIHBlcmlvZGljYWxseSBjYWxsIFJlbmRlcigpIG9uIGEgY2FsbGJhY2sgb2JqZWN0LgotCi1jbGFzcyBNRURJQV9FWFBPUlQgQXVkaW9SZW5kZXJlclNpbmsKLSAgICA6IHB1YmxpYyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxtZWRpYTo6QXVkaW9SZW5kZXJlclNpbms+IHsKLSBwdWJsaWM6Ci0gIGNsYXNzIE1FRElBX0VYUE9SVCBSZW5kZXJDYWxsYmFjayB7Ci0gICBwdWJsaWM6Ci0gICAgLy8gQXR0ZW1wdHMgdG8gY29tcGxldGVseSBmaWxsIGFsbCBjaGFubmVscyBvZiB8ZGVzdHwsIHJldHVybnMgYWN0dWFsCi0gICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBmaWxsZWQuCi0gICAgdmlydHVhbCBpbnQgUmVuZGVyKEF1ZGlvQnVzKiBkZXN0LCBpbnQgYXVkaW9fZGVsYXlfbWlsbGlzZWNvbmRzKSA9IDA7Ci0KLSAgICAvLyBTeW5jaHJvbml6ZWQgYXVkaW8gSS9PIC0gc2VlIEluaXRpYWxpemVJTygpIGJlbG93LgotICAgIHZpcnR1YWwgdm9pZCBSZW5kZXJJTyhBdWRpb0J1cyogLyogc291cmNlICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1cyogLyogZGVzdCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGF1ZGlvX2RlbGF5X21pbGxpc2Vjb25kcyAqLykge30KLQotICAgIC8vIFNpZ25hbHMgYW4gZXJyb3IgaGFzIG9jY3VycmVkLgotICAgIHZpcnR1YWwgdm9pZCBPblJlbmRlckVycm9yKCkgPSAwOwotCi0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICAgIC8vIENhbGxiYWNrIGZyb20gdGhlIHNpbmsgdG8gdGhlIHJlbmRlcmVyIHRvIGluZGljYXRlIHRoYXQgaXQgaXMgY3VycmVudGx5Ci0gICAgLy8gZnVsbCBhbmQgd2lsbCBub3QgYmUgcmVxdWVzdGluZyBhZGRpdGlvbmFsIGRhdGEgdW50aWwgc29tZSBpcyBjb25zdW1lZC4KLSAgICB2aXJ0dWFsIHZvaWQgU2lua0Z1bGwoKSA9IDA7Ci0KLSNpZiBkZWZpbmVkKE9TX1NUQVJCT0FSRCkKLSNpZiBTQl9JUyhNRURJQV9VTkRFUkZMT1dfREVURUNURURfQllfQVVESU9fU0lOSykKLSAgICAvLyBDYWxsYmFjayBmcm9tIHRoZSBzaW5rIHRvIHRoZSByZW5kZXJlciB0byBpbmRpY2F0ZSB0aGF0IGl0IGhhcyBub3QKLSAgICAvLyBlbm91Z2ggZGF0YSB0byBjb250aW51ZSBwbGF5YmFjayB3aXRob3V0IHBsYXlpbmcgcGFzdCB0aGUgZW5kIG9mCi0gICAgLy8gYnVmZmVyZWQgZGF0YS4KLSAgICB2aXJ0dWFsIHZvaWQgU2lua1VuZGVyZmxvdygpID0gMDsKLSNlbmRpZiAgLy8gU0JfSVMoTUVESUFfVU5ERVJGTE9XX0RFVEVDVEVEX0JZX0FVRElPX1NJTkspCi0jZW5kaWYgIC8vIGRlZmluZWQoT1NfU1RBUkJPQVJEKQotI2VuZGlmICAvLyBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0KLSAgIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5SZW5kZXJDYWxsYmFjaygpIHt9Ci0gIH07Ci0KLSAgLy8gU2V0cyBpbXBvcnRhbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGF1ZGlvIHN0cmVhbSBmb3JtYXQuCi0gIC8vIEl0IG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb2YgdGhlIG90aGVyIG1ldGhvZHMuCi0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJDYWxsYmFjayogY2FsbGJhY2spID0gMDsKLQotICAvLyBJbml0aWFsaXplSU8oKSBtYXkgYmUgY2FsbGVkIGluc3RlYWQgb2YgSW5pdGlhbGl6ZSgpIGZvciBjbGllbnRzIHdobyB3aXNoCi0gIC8vIHRvIGhhdmUgc3luY2hyb25pemVkIGlucHV0IGFuZCBvdXRwdXQuICB8aW5wdXRfY2hhbm5lbHN8IHNwZWNpZmllcyB0aGUKLSAgLy8gbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzIHdoaWNoIHdpbGwgYmUgYXQgdGhlIHNhbWUgc2FtcGxlLXJhdGUKLSAgLy8gYW5kIGJ1ZmZlci1zaXplIGFzIHRoZSBvdXRwdXQgYXMgc3BlY2lmaWVkIGluIHxwYXJhbXN8LgotICAvLyBUaGUgY2FsbGJhY2sncyBSZW5kZXJJTygpIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBpbnN0ZWFkIG9mIFJlbmRlcigpLAotICAvLyBwcm92aWRpbmcgdGhlIHN5bmNocm9uaXplZCBpbnB1dCBkYXRhIGF0IHRoZSBzYW1lIHRpbWUgYXMgd2hlbiBuZXcKLSAgLy8gb3V0cHV0IGRhdGEgaXMgdG8gYmUgcmVuZGVyZWQuCi0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplSU8oY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiAvKiBwYXJhbXMgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGlucHV0X2NoYW5uZWxzICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbmRlckNhbGxiYWNrKiAvKiBjYWxsYmFjayAqLykge30KLQotICAvLyBTdGFydHMgYXVkaW8gcGxheWJhY2suCi0gIHZpcnR1YWwgdm9pZCBTdGFydCgpID0gMDsKLQotICAvLyBTdG9wcyBhdWRpbyBwbGF5YmFjay4KLSAgdmlydHVhbCB2b2lkIFN0b3AoKSA9IDA7Ci0KLSAgLy8gUGF1c2VzIHBsYXliYWNrLgotICB2aXJ0dWFsIHZvaWQgUGF1c2UoYm9vbCBmbHVzaCkgPSAwOwotCi0gIC8vIFJlc3VtZXMgcGxheWJhY2sgYWZ0ZXIgY2FsbGluZyBQYXVzZSgpLgotICB2aXJ0dWFsIHZvaWQgUGxheSgpID0gMDsKLQotICAvLyBTZXRzIHRoZSBwbGF5YmFjayB2b2x1bWUsIHdpdGggcmFuZ2UgWzAuMCwgMS4wXSBpbmNsdXNpdmUuCi0gIC8vIFJldHVybnMgfHRydWV8IG9uIHN1Y2Nlc3MuCi0gIHZpcnR1YWwgYm9vbCBTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgPSAwOwotCi0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICAvLyBUbyBhdm9pZCBkdXBsaWNhdGlvbiBvZiBhdWRpbyBkYXRhIGFuZCBhZGRpdGlvbmFsIGNvcGllcyBvdXIgU2luawotICAvLyBpbXBsZW1lbnRhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgYnVmZmVyaW5nIHJlbmRlcmVkIGF1ZGlvLiBBcyBhCi0gIC8vIHJlc3VsdCB0aGUgcmVuZGVyZXIgcmVsYXlzIHRoZSBtZXNzYWdlIHRvIGJ1ZmZlciBtb3JlIGF1ZGlvIGJhY2sKLSAgLy8gdG8gdGhlIFNpbmsuCi0gIHZpcnR1YWwgdm9pZCBSZXN1bWVBZnRlclVuZGVyZmxvdyhib29sIGJ1ZmZlcl9tb3JlX2F1ZGlvKSA9IDA7Ci0jZW5kaWYKLQotIHByb3RlY3RlZDoKLSAgZnJpZW5kIGNsYXNzIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPEF1ZGlvUmVuZGVyZXJTaW5rPjsKLSAgdmlydHVhbCB+QXVkaW9SZW5kZXJlclNpbmsoKSB7fQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQkFTRV9BVURJT19SRU5ERVJFUl9TSU5LX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9hdWRpb19zcGxpY2VyLmNjIGIvc3JjL21lZGlhL2Jhc2UvYXVkaW9fc3BsaWNlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVmYmJhOS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9hdWRpb19zcGxpY2VyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX3NwbGljZXIuaCIKLQotI2luY2x1ZGUgPGNzdGRsaWI+Ci0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb190aW1lc3RhbXBfaGVscGVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9idWZmZXJzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kYXRhX2J1ZmZlci5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBMYXJnZXN0IGdhcCBvciBvdmVybGFwIGFsbG93ZWQgYnkgdGhpcyBjbGFzcy4gQW55dGhpbmcKLS8vIGxhcmdlciB0aGFuIHRoaXMgd2lsbCB0cmlnZ2VyIGFuIGVycm9yLgotLy8gVGhpcyBpcyBhbiBhcmJpdHJhcnkgdmFsdWUsIGJ1dCB0aGUgaW5pdGlhbCBzZWxlY3Rpb24gb2YgNTBtcwotLy8gcm91Z2hseSByZXByZXNlbnRzIHRoZSBkdXJhdGlvbiBvZiAyIGNvbXByZXNzZWQgQUFDIG9yIE1QMyBmcmFtZXMuCi1zdGF0aWMgY29uc3QgaW50IGtNYXhUaW1lRGVsdGFJbk1pbGxpc2Vjb25kcyA9IDUwOwotCi1BdWRpb1NwbGljZXI6OkF1ZGlvU3BsaWNlcihpbnQgYnl0ZXNfcGVyX2ZyYW1lLCBpbnQgc2FtcGxlc19wZXJfc2Vjb25kKQotICAgIDogb3V0cHV0X3RpbWVzdGFtcF9oZWxwZXJfKGJ5dGVzX3Blcl9mcmFtZSwgc2FtcGxlc19wZXJfc2Vjb25kKSwKLSAgICAgIG1pbl9nYXBfc2l6ZV8oMiAqIGJ5dGVzX3Blcl9mcmFtZSksCi0gICAgICByZWNlaXZlZF9lbmRfb2Zfc3RyZWFtXyhmYWxzZSkgewotfQotCi1BdWRpb1NwbGljZXI6On5BdWRpb1NwbGljZXIoKSB7Ci19Ci0KLXZvaWQgQXVkaW9TcGxpY2VyOjpSZXNldCgpIHsKLSAgb3V0cHV0X3RpbWVzdGFtcF9oZWxwZXJfLlNldEJhc2VUaW1lc3RhbXAoa05vVGltZXN0YW1wKCkpOwotICBvdXRwdXRfYnVmZmVyc18uY2xlYXIoKTsKLSAgcmVjZWl2ZWRfZW5kX29mX3N0cmVhbV8gPSBmYWxzZTsKLX0KLQotYm9vbCBBdWRpb1NwbGljZXI6OkFkZElucHV0KGNvbnN0IHNjb3BlZF9yZWZwdHI8QnVmZmVyPiYgaW5wdXQpewotICBEQ0hFQ0soIXJlY2VpdmVkX2VuZF9vZl9zdHJlYW1fIHx8IGlucHV0LT5Jc0VuZE9mU3RyZWFtKCkpOwotCi0gIGlmIChpbnB1dC0+SXNFbmRPZlN0cmVhbSgpKSB7Ci0gICAgb3V0cHV0X2J1ZmZlcnNfLnB1c2hfYmFjayhpbnB1dCk7Ci0gICAgcmVjZWl2ZWRfZW5kX29mX3N0cmVhbV8gPSB0cnVlOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgRENIRUNLKGlucHV0LT5HZXRUaW1lc3RhbXAoKSAhPSBrTm9UaW1lc3RhbXAoKSk7Ci0gIERDSEVDSyhpbnB1dC0+R2V0RHVyYXRpb24oKSA+IGJhc2U6OlRpbWVEZWx0YSgpKTsKLSAgRENIRUNLX0dUKGlucHV0LT5HZXREYXRhU2l6ZSgpLCAwKTsKLQotICBpZiAob3V0cHV0X3RpbWVzdGFtcF9oZWxwZXJfLmJhc2VfdGltZXN0YW1wKCkgPT0ga05vVGltZXN0YW1wKCkpCi0gICAgb3V0cHV0X3RpbWVzdGFtcF9oZWxwZXJfLlNldEJhc2VUaW1lc3RhbXAoaW5wdXQtPkdldFRpbWVzdGFtcCgpKTsKLQotICBpZiAob3V0cHV0X3RpbWVzdGFtcF9oZWxwZXJfLmJhc2VfdGltZXN0YW1wKCkgPiBpbnB1dC0+R2V0VGltZXN0YW1wKCkpIHsKLSAgICBEVkxPRygxKSA8PCAiSW5wdXQgdGltZXN0YW1wIGlzIGJlZm9yZSB0aGUgYmFzZSB0aW1lc3RhbXAuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wID0gaW5wdXQtPkdldFRpbWVzdGFtcCgpOwotICBiYXNlOjpUaW1lRGVsdGEgZXhwZWN0ZWRfdGltZXN0YW1wID0gb3V0cHV0X3RpbWVzdGFtcF9oZWxwZXJfLkdldFRpbWVzdGFtcCgpOwotICBiYXNlOjpUaW1lRGVsdGEgZGVsdGEgPSB0aW1lc3RhbXAgLSBleHBlY3RlZF90aW1lc3RhbXA7Ci0KLSAgaWYgKHN0ZDo6YWJzKGRlbHRhLkluTWlsbGlzZWNvbmRzKCkpID4ga01heFRpbWVEZWx0YUluTWlsbGlzZWNvbmRzKSB7Ci0gICAgRFZMT0coMSkgPDwgIlRpbWVzdGFtcCBkZWx0YSB0b28gbGFyZ2U6ICIgPDwgZGVsdGEuSW5NaWNyb3NlY29uZHMoKSA8PCAidXMiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGludCBieXRlc190b19maWxsID0gMDsKLSAgaWYgKGRlbHRhICE9IGJhc2U6OlRpbWVEZWx0YSgpKQotICAgIGJ5dGVzX3RvX2ZpbGwgPSBvdXRwdXRfdGltZXN0YW1wX2hlbHBlcl8uR2V0Qnl0ZXNUb1RhcmdldCh0aW1lc3RhbXApOwotCi0gIGlmIChieXRlc190b19maWxsID09IDAgfHwgc3RkOjphYnMoYnl0ZXNfdG9fZmlsbCkgPCBtaW5fZ2FwX3NpemVfKSB7Ci0gICAgQWRkT3V0cHV0QnVmZmVyKGlucHV0KTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGlmIChieXRlc190b19maWxsID4gMCkgewotICAgIERWTE9HKDEpIDw8ICJHYXAgZGV0ZWN0ZWQgQCAiIDw8IGV4cGVjdGVkX3RpbWVzdGFtcC5Jbk1pY3Jvc2Vjb25kcygpCi0gICAgICAgICAgICAgPDwgIiB1czogIiA8PCBkZWx0YS5Jbk1pY3Jvc2Vjb25kcygpIDw8ICIgdXMiOwotCi0gICAgLy8gQ3JlYXRlIGEgYnVmZmVyIHdpdGggZW5vdWdoIHNpbGVuY2Ugc2FtcGxlcyB0byBmaWxsIHRoZSBnYXAgYW5kCi0gICAgLy8gYWRkIGl0IHRvIHRoZSBvdXRwdXQgYnVmZmVyLgotICAgIHNjb3BlZF9yZWZwdHI8RGF0YUJ1ZmZlcj4gZ2FwID0gbmV3IERhdGFCdWZmZXIoYnl0ZXNfdG9fZmlsbCk7Ci0gICAgZ2FwLT5TZXREYXRhU2l6ZShieXRlc190b19maWxsKTsKLSAgICBtZW1zZXQoZ2FwLT5HZXRXcml0YWJsZURhdGEoKSwgMCwgYnl0ZXNfdG9fZmlsbCk7Ci0gICAgZ2FwLT5TZXRUaW1lc3RhbXAoZXhwZWN0ZWRfdGltZXN0YW1wKTsKLSAgICBnYXAtPlNldER1cmF0aW9uKG91dHB1dF90aW1lc3RhbXBfaGVscGVyXy5HZXREdXJhdGlvbihieXRlc190b19maWxsKSk7Ci0gICAgQWRkT3V0cHV0QnVmZmVyKGdhcCk7Ci0KLSAgICAvLyBBZGQgdGhlIGlucHV0IGJ1ZmZlciBub3cgdGhhdCB0aGUgZ2FwIGhhcyBiZWVuIGZpbGxlZC4KLSAgICBBZGRPdXRwdXRCdWZmZXIoaW5wdXQpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgaW50IGJ5dGVzX3RvX3NraXAgPSAtYnl0ZXNfdG9fZmlsbDsKLQotICBEVkxPRygxKSA8PCAiT3ZlcmxhcCBkZXRlY3RlZCBAICIgPDwgZXhwZWN0ZWRfdGltZXN0YW1wLkluTWljcm9zZWNvbmRzKCkKLSAgICAgICAgICAgPDwgIiB1czogIiAgPDwgLWRlbHRhLkluTWljcm9zZWNvbmRzKCkgPDwgIiB1cyI7Ci0KLSAgaWYgKGlucHV0LT5HZXREYXRhU2l6ZSgpIDw9IGJ5dGVzX3RvX3NraXApIHsKLSAgICBEVkxPRygxKSA8PCAiRHJvcHBpbmcgd2hvbGUgYnVmZmVyIjsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vIENvcHkgdGhlIHRyYWlsaW5nIHNhbXBsZXMgdGhhdCBkbyBub3Qgb3ZlcmxhcCBzYW1wbGVzIGFscmVhZHkgb3V0cHV0Ci0gIC8vIGludG8gYSBuZXcgYnVmZmVyLiBBZGQgdGhpcyBuZXcgYnVmZmVyIHRvIHRoZSBvdXRwdXQgcXVldWUuCi0gIC8vCi0gIC8vIFRPRE8oYWNvbHdlbGwpOiBJbXBsZW1lbnQgYSBjcm9zcy1mYWRlIGhlcmUgc28gdGhlIHRyYW5zaXRpb24gaXMgbGVzcwotICAvLyBqYXJyaW5nLgotICBpbnQgbmV3X2J1ZmZlcl9zaXplID0gaW5wdXQtPkdldERhdGFTaXplKCkgLSBieXRlc190b19za2lwOwotCi0gIHNjb3BlZF9yZWZwdHI8RGF0YUJ1ZmZlcj4gbmV3X2J1ZmZlciA9IG5ldyBEYXRhQnVmZmVyKG5ld19idWZmZXJfc2l6ZSk7Ci0gIG5ld19idWZmZXItPlNldERhdGFTaXplKG5ld19idWZmZXJfc2l6ZSk7Ci0gIG1lbWNweShuZXdfYnVmZmVyLT5HZXRXcml0YWJsZURhdGEoKSwKLSAgICAgICAgIGlucHV0LT5HZXREYXRhKCkgKyBieXRlc190b19za2lwLAotICAgICAgICAgbmV3X2J1ZmZlcl9zaXplKTsKLSAgbmV3X2J1ZmZlci0+U2V0VGltZXN0YW1wKGV4cGVjdGVkX3RpbWVzdGFtcCk7Ci0gIG5ld19idWZmZXItPlNldER1cmF0aW9uKAotICAgICAgb3V0cHV0X3RpbWVzdGFtcF9oZWxwZXJfLkdldER1cmF0aW9uKG5ld19idWZmZXJfc2l6ZSkpOwotICBBZGRPdXRwdXRCdWZmZXIobmV3X2J1ZmZlcik7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEF1ZGlvU3BsaWNlcjo6SGFzTmV4dEJ1ZmZlcigpIGNvbnN0IHsKLSAgcmV0dXJuICFvdXRwdXRfYnVmZmVyc18uZW1wdHkoKTsKLX0KLQotc2NvcGVkX3JlZnB0cjxCdWZmZXI+IEF1ZGlvU3BsaWNlcjo6R2V0TmV4dEJ1ZmZlcigpIHsKLSAgc2NvcGVkX3JlZnB0cjxCdWZmZXI+IHJldCA9IG91dHB1dF9idWZmZXJzXy5mcm9udCgpOwotICBvdXRwdXRfYnVmZmVyc18ucG9wX2Zyb250KCk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXZvaWQgQXVkaW9TcGxpY2VyOjpBZGRPdXRwdXRCdWZmZXIoY29uc3Qgc2NvcGVkX3JlZnB0cjxCdWZmZXI+JiBidWZmZXIpIHsKLSAgb3V0cHV0X3RpbWVzdGFtcF9oZWxwZXJfLkFkZEJ5dGVzKGJ1ZmZlci0+R2V0RGF0YVNpemUoKSk7Ci0gIG91dHB1dF9idWZmZXJzXy5wdXNoX2JhY2soYnVmZmVyKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9hdWRpb19zcGxpY2VyLmggYi9zcmMvbWVkaWEvYmFzZS9hdWRpb19zcGxpY2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhOTdmYWUuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvYXVkaW9fc3BsaWNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9CQVNFX0FVRElPX1NQTElDRVJfSF8KLSNkZWZpbmUgTUVESUFfQkFTRV9BVURJT19TUExJQ0VSX0hfCi0KLSNpbmNsdWRlIDxkZXF1ZT4KLQotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb190aW1lc3RhbXBfaGVscGVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgQXVkaW9EZWNvZGVyQ29uZmlnOwotY2xhc3MgQnVmZmVyOwotCi0vLyBIZWxwZXIgY2xhc3MgdGhhdCBoYW5kbGVzIGZpbGxpbmcgZ2FwcyBhbmQgcmVzb2x2aW5nIG92ZXJsYXBzLgotY2xhc3MgTUVESUFfRVhQT1JUIEF1ZGlvU3BsaWNlciB7Ci0gcHVibGljOgotICBBdWRpb1NwbGljZXIoaW50IGJ5dGVzX3Blcl9mcmFtZSwgaW50IHNhbXBsZXNfcGVyX3NlY29uZCk7Ci0gIH5BdWRpb1NwbGljZXIoKTsKLQotICAvLyBSZXNldHMgdGhlIHNwbGljZXIgc3RhdGUgYnkgY2xlYXJpbmcgdGhlIG91dHB1dCBidWZmZXJzIHF1ZXVlLAotICAvLyBhbmQgcmVzZXR0aW5nIHRoZSB0aW1lc3RhbXAgaGVscGVyLgotICB2b2lkIFJlc2V0KCk7Ci0KLSAgLy8gQWRkcyBhIG5ldyBidWZmZXIgZnVsbCBvZiBzYW1wbGVzIG9yIGVuZCBvZiBzdHJlYW0gYnVmZmVyIHRvIHRoZSBzcGxpY2VyLgotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGJ1ZmZlciB3YXMgYWNjZXB0ZWQuIEZhbHNlIGlzIHJldHVybmVkIGlmIGFuIGVycm9yCi0gIC8vIG9jY3VycmVkLgotICBib29sIEFkZElucHV0KGNvbnN0IHNjb3BlZF9yZWZwdHI8QnVmZmVyPiYgaW5wdXQpOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BsaWNlciBoYXMgYSBidWZmZXIgdG8gcmV0dXJuLgotICBib29sIEhhc05leHRCdWZmZXIoKSBjb25zdDsKLQotICAvLyBSZW1vdmVzIHRoZSBuZXh0IGJ1ZmZlciBmcm9tIHRoZSBvdXRwdXQgYnVmZmVyIHF1ZXVlIGFuZCByZXR1cm5zIGl0LgotICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiBIYXNOZXh0QnVmZmVyKCkgcmV0dXJucyB0cnVlLgotICBzY29wZWRfcmVmcHRyPEJ1ZmZlcj4gR2V0TmV4dEJ1ZmZlcigpOwotCi0gcHJpdmF0ZToKLSAgdm9pZCBBZGRPdXRwdXRCdWZmZXIoY29uc3Qgc2NvcGVkX3JlZnB0cjxCdWZmZXI+JiBidWZmZXIpOwotCi0gIEF1ZGlvVGltZXN0YW1wSGVscGVyIG91dHB1dF90aW1lc3RhbXBfaGVscGVyXzsKLQotICAvLyBNaW5pbXVtIGdhcCBzaXplIG5lZWRlZCBiZWZvcmUgdGhlIHNwbGljZXIgd2lsbCB0YWtlIGFjdGlvbiB0bwotICAvLyBmaWxsIGEgZ2FwLiBUaGlzIGF2b2lkcyBwZXJpb2RpY2FsbHkgaW5zZXJ0aW5nIGFuZCB0aGVuIGRyb3BwaW5nIHNhbXBsZXMKLSAgLy8gd2hlbiB0aGUgYnVmZmVyIHRpbWVzdGFtcHMgYXJlIHNsaWdodGx5IG9mZiBiZWNhdXNlIG9mIHRpbWVzdGFtcCByb3VuZGluZwotICAvLyBpbiB0aGUgc291cmNlIGNvbnRlbnQuCi0gIGludCBtaW5fZ2FwX3NpemVfOwotCi0gIHN0ZDo6ZGVxdWU8c2NvcGVkX3JlZnB0cjxCdWZmZXI+ID4gb3V0cHV0X2J1ZmZlcnNfOwotICBib29sIHJlY2VpdmVkX2VuZF9vZl9zdHJlYW1fOwotCi0gIERJU0FMTE9XX0lNUExJQ0lUX0NPTlNUUlVDVE9SUyhBdWRpb1NwbGljZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvYXVkaW9fc3BsaWNlcl91bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9iYXNlL2F1ZGlvX3NwbGljZXJfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwOTY3ODkuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvYXVkaW9fc3BsaWNlcl91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fc3BsaWNlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fdGltZXN0YW1wX2hlbHBlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYnVmZmVycy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGF0YV9idWZmZXIuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotc3RhdGljIGNvbnN0IGludCBrQnl0ZXNQZXJGcmFtZSA9IDQ7Ci1zdGF0aWMgY29uc3QgaW50IGtEZWZhdWx0U2FtcGxlUmF0ZSA9IDQ0MTAwOwotc3RhdGljIGNvbnN0IGludCBrRGVmYXVsdEJ1ZmZlclNpemUgPSAxMDAgKiBrQnl0ZXNQZXJGcmFtZTsKLQotY2xhc3MgQXVkaW9TcGxpY2VyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgQXVkaW9TcGxpY2VyVGVzdCgpCi0gICAgICA6IHNwbGljZXJfKGtCeXRlc1BlckZyYW1lLCBrRGVmYXVsdFNhbXBsZVJhdGUpLAotICAgICAgICBpbnB1dF90aW1lc3RhbXBfaGVscGVyXyhrQnl0ZXNQZXJGcmFtZSwga0RlZmF1bHRTYW1wbGVSYXRlKSB7Ci0gICAgaW5wdXRfdGltZXN0YW1wX2hlbHBlcl8uU2V0QmFzZVRpbWVzdGFtcChiYXNlOjpUaW1lRGVsdGEoKSk7Ci0gIH0KLQotICBzY29wZWRfcmVmcHRyPEJ1ZmZlcj4gR2V0TmV4dElucHV0QnVmZmVyKHVpbnQ4IHZhbHVlKSB7Ci0gICAgcmV0dXJuIEdldE5leHRJbnB1dEJ1ZmZlcih2YWx1ZSwga0RlZmF1bHRCdWZmZXJTaXplKTsKLSAgfQotCi0gIHNjb3BlZF9yZWZwdHI8QnVmZmVyPiBHZXROZXh0SW5wdXRCdWZmZXIodWludDggdmFsdWUsIGludCBzaXplKSB7Ci0gICAgc2NvcGVkX3JlZnB0cjxEYXRhQnVmZmVyPiBidWZmZXIgPSBuZXcgRGF0YUJ1ZmZlcihzaXplKTsKLSAgICBidWZmZXItPlNldERhdGFTaXplKHNpemUpOwotICAgIG1lbXNldChidWZmZXItPkdldFdyaXRhYmxlRGF0YSgpLCB2YWx1ZSwgYnVmZmVyLT5HZXREYXRhU2l6ZSgpKTsKLSAgICBidWZmZXItPlNldFRpbWVzdGFtcChpbnB1dF90aW1lc3RhbXBfaGVscGVyXy5HZXRUaW1lc3RhbXAoKSk7Ci0gICAgYnVmZmVyLT5TZXREdXJhdGlvbigKLSAgICAgICAgaW5wdXRfdGltZXN0YW1wX2hlbHBlcl8uR2V0RHVyYXRpb24oYnVmZmVyLT5HZXREYXRhU2l6ZSgpKSk7Ci0gICAgaW5wdXRfdGltZXN0YW1wX2hlbHBlcl8uQWRkQnl0ZXMoYnVmZmVyLT5HZXREYXRhU2l6ZSgpKTsKLSAgICByZXR1cm4gYnVmZmVyOwotICB9Ci0KLSAgYm9vbCBWZXJpZnlEYXRhKGNvbnN0IHVpbnQ4KiBkYXRhLCBpbnQgc2l6ZSwgaW50IHZhbHVlKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgIGlmIChkYXRhW2ldICE9IHZhbHVlKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIEF1ZGlvU3BsaWNlciBzcGxpY2VyXzsKLSAgQXVkaW9UaW1lc3RhbXBIZWxwZXIgaW5wdXRfdGltZXN0YW1wX2hlbHBlcl87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEF1ZGlvU3BsaWNlclRlc3QpOwotfTsKLQotVEVTVF9GKEF1ZGlvU3BsaWNlclRlc3QsIFBhc3NUaHJ1KSB7Ci0gIEVYUEVDVF9GQUxTRShzcGxpY2VyXy5IYXNOZXh0QnVmZmVyKCkpOwotCi0gIC8vIFRlc3Qgc2luZ2xlIGJ1ZmZlciBwYXNzLXRocnUgYmVoYXZpb3IuCi0gIHNjb3BlZF9yZWZwdHI8QnVmZmVyPiBpbnB1dF8xID0gR2V0TmV4dElucHV0QnVmZmVyKDEpOwotICBFWFBFQ1RfVFJVRShzcGxpY2VyXy5BZGRJbnB1dChpbnB1dF8xKSk7Ci0gIEVYUEVDVF9UUlVFKHNwbGljZXJfLkhhc05leHRCdWZmZXIoKSk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxCdWZmZXI+IG91dHB1dF8xID0gc3BsaWNlcl8uR2V0TmV4dEJ1ZmZlcigpOwotICBFWFBFQ1RfRkFMU0Uoc3BsaWNlcl8uSGFzTmV4dEJ1ZmZlcigpKTsKLSAgRVhQRUNUX0VRKGlucHV0XzEtPkdldFRpbWVzdGFtcCgpLCBvdXRwdXRfMS0+R2V0VGltZXN0YW1wKCkpOwotICBFWFBFQ1RfRVEoaW5wdXRfMS0+R2V0RHVyYXRpb24oKSwgb3V0cHV0XzEtPkdldER1cmF0aW9uKCkpOwotICBFWFBFQ1RfRVEoaW5wdXRfMS0+R2V0RGF0YVNpemUoKSwgb3V0cHV0XzEtPkdldERhdGFTaXplKCkpOwotCi0gIC8vIFRlc3QgdGhhdCBtdWx0aXBsZSBidWZmZXJzIGNhbiBiZSBxdWV1ZWQgaW4gdGhlIHNwbGljZXIuCi0gIHNjb3BlZF9yZWZwdHI8QnVmZmVyPiBpbnB1dF8yID0gR2V0TmV4dElucHV0QnVmZmVyKDIpOwotICBzY29wZWRfcmVmcHRyPEJ1ZmZlcj4gaW5wdXRfMyA9IEdldE5leHRJbnB1dEJ1ZmZlcigzKTsKLSAgRVhQRUNUX1RSVUUoc3BsaWNlcl8uQWRkSW5wdXQoaW5wdXRfMikpOwotICBFWFBFQ1RfVFJVRShzcGxpY2VyXy5BZGRJbnB1dChpbnB1dF8zKSk7Ci0gIEVYUEVDVF9UUlVFKHNwbGljZXJfLkhhc05leHRCdWZmZXIoKSk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxCdWZmZXI+IG91dHB1dF8yID0gc3BsaWNlcl8uR2V0TmV4dEJ1ZmZlcigpOwotICBFWFBFQ1RfVFJVRShzcGxpY2VyXy5IYXNOZXh0QnVmZmVyKCkpOwotICBFWFBFQ1RfRVEoaW5wdXRfMi0+R2V0VGltZXN0YW1wKCksIG91dHB1dF8yLT5HZXRUaW1lc3RhbXAoKSk7Ci0gIEVYUEVDVF9FUShpbnB1dF8yLT5HZXREdXJhdGlvbigpLCBvdXRwdXRfMi0+R2V0RHVyYXRpb24oKSk7Ci0gIEVYUEVDVF9FUShpbnB1dF8yLT5HZXREYXRhU2l6ZSgpLCBvdXRwdXRfMi0+R2V0RGF0YVNpemUoKSk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxCdWZmZXI+IG91dHB1dF8zID0gc3BsaWNlcl8uR2V0TmV4dEJ1ZmZlcigpOwotICBFWFBFQ1RfRkFMU0Uoc3BsaWNlcl8uSGFzTmV4dEJ1ZmZlcigpKTsKLSAgRVhQRUNUX0VRKGlucHV0XzMtPkdldFRpbWVzdGFtcCgpLCBvdXRwdXRfMy0+R2V0VGltZXN0YW1wKCkpOwotICBFWFBFQ1RfRVEoaW5wdXRfMy0+R2V0RHVyYXRpb24oKSwgb3V0cHV0XzMtPkdldER1cmF0aW9uKCkpOwotICBFWFBFQ1RfRVEoaW5wdXRfMy0+R2V0RGF0YVNpemUoKSwgb3V0cHV0XzMtPkdldERhdGFTaXplKCkpOwotfQotCi1URVNUX0YoQXVkaW9TcGxpY2VyVGVzdCwgUmVzZXQpIHsKLSAgc2NvcGVkX3JlZnB0cjxCdWZmZXI+IGlucHV0XzEgPSBHZXROZXh0SW5wdXRCdWZmZXIoMSk7Ci0gIEVYUEVDVF9UUlVFKHNwbGljZXJfLkFkZElucHV0KGlucHV0XzEpKTsKLSAgRVhQRUNUX1RSVUUoc3BsaWNlcl8uSGFzTmV4dEJ1ZmZlcigpKTsKLQotICBzcGxpY2VyXy5SZXNldCgpOwotICBFWFBFQ1RfRkFMU0Uoc3BsaWNlcl8uSGFzTmV4dEJ1ZmZlcigpKTsKLQotICAvLyBBZGQgc29tZSBieXRlcyB0byB0aGUgdGltZXN0YW1wIGhlbHBlciBzbyB0aGF0IHRoZQotICAvLyBuZXh0IGJ1ZmZlciBzdGFydHMgbWFueSBmcmFtZXMgYmV5b25kIHRoZSBlbmQgb2YKLSAgLy8gfGlucHV0XzF8LiBUaGlzIGlzIHRvIG1ha2Ugc3VyZSB0aGF0IFJlc2V0KCkgYWN0dWFsbHkKLSAgLy8gY2xlYXJzIGl0cyBzdGF0ZSBhbmQgZG9lc24ndCB0cnkgdG8gaW5zZXJ0IGEgZ2FwLgotICBpbnB1dF90aW1lc3RhbXBfaGVscGVyXy5BZGRCeXRlcygxMDAgKiBrQnl0ZXNQZXJGcmFtZSk7Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgYSBuZXcgaW5wdXQgYnVmZmVyIHBhc3NlcyB0aHJvdWdoIGFzIGV4cGVjdGVkLgotICBzY29wZWRfcmVmcHRyPEJ1ZmZlcj4gaW5wdXRfMiA9IEdldE5leHRJbnB1dEJ1ZmZlcigyKTsKLSAgRVhQRUNUX1RSVUUoc3BsaWNlcl8uQWRkSW5wdXQoaW5wdXRfMikpOwotICBFWFBFQ1RfVFJVRShzcGxpY2VyXy5IYXNOZXh0QnVmZmVyKCkpOwotCi0gIHNjb3BlZF9yZWZwdHI8QnVmZmVyPiBvdXRwdXRfMiA9IHNwbGljZXJfLkdldE5leHRCdWZmZXIoKTsKLSAgRVhQRUNUX0ZBTFNFKHNwbGljZXJfLkhhc05leHRCdWZmZXIoKSk7Ci0gIEVYUEVDVF9FUShpbnB1dF8yLT5HZXRUaW1lc3RhbXAoKSwgb3V0cHV0XzItPkdldFRpbWVzdGFtcCgpKTsKLSAgRVhQRUNUX0VRKGlucHV0XzItPkdldER1cmF0aW9uKCksIG91dHB1dF8yLT5HZXREdXJhdGlvbigpKTsKLSAgRVhQRUNUX0VRKGlucHV0XzItPkdldERhdGFTaXplKCksIG91dHB1dF8yLT5HZXREYXRhU2l6ZSgpKTsKLX0KLQotVEVTVF9GKEF1ZGlvU3BsaWNlclRlc3QsIEVuZE9mU3RyZWFtKSB7Ci0gIHNjb3BlZF9yZWZwdHI8QnVmZmVyPiBpbnB1dF8xID0gR2V0TmV4dElucHV0QnVmZmVyKDEpOwotICBzY29wZWRfcmVmcHRyPEJ1ZmZlcj4gaW5wdXRfMiA9IG5ldyBEYXRhQnVmZmVyKDApOyAgLy8gRW5kIG9mIHN0cmVhbS4KLSAgc2NvcGVkX3JlZnB0cjxCdWZmZXI+IGlucHV0XzMgPSBHZXROZXh0SW5wdXRCdWZmZXIoMik7Ci0gIEVYUEVDVF9UUlVFKGlucHV0XzItPklzRW5kT2ZTdHJlYW0oKSk7Ci0KLSAgRVhQRUNUX1RSVUUoc3BsaWNlcl8uQWRkSW5wdXQoaW5wdXRfMSkpOwotICBFWFBFQ1RfVFJVRShzcGxpY2VyXy5BZGRJbnB1dChpbnB1dF8yKSk7Ci0gIEVYUEVDVF9UUlVFKHNwbGljZXJfLkhhc05leHRCdWZmZXIoKSk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxCdWZmZXI+IG91dHB1dF8xID0gc3BsaWNlcl8uR2V0TmV4dEJ1ZmZlcigpOwotICBzY29wZWRfcmVmcHRyPEJ1ZmZlcj4gb3V0cHV0XzIgPSBzcGxpY2VyXy5HZXROZXh0QnVmZmVyKCk7Ci0gIEVYUEVDVF9GQUxTRShzcGxpY2VyXy5IYXNOZXh0QnVmZmVyKCkpOwotICBFWFBFQ1RfRVEoaW5wdXRfMS0+R2V0VGltZXN0YW1wKCksIG91dHB1dF8xLT5HZXRUaW1lc3RhbXAoKSk7Ci0gIEVYUEVDVF9FUShpbnB1dF8xLT5HZXREdXJhdGlvbigpLCBvdXRwdXRfMS0+R2V0RHVyYXRpb24oKSk7Ci0gIEVYUEVDVF9FUShpbnB1dF8xLT5HZXREYXRhU2l6ZSgpLCBvdXRwdXRfMS0+R2V0RGF0YVNpemUoKSk7Ci0KLSAgRVhQRUNUX1RSVUUob3V0cHV0XzItPklzRW5kT2ZTdHJlYW0oKSk7Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgYnVmZmVycyBjYW4gYmUgYWRkZWQgYWdhaW4gYWZ0ZXIgUmVzZXQoKS4KLSAgc3BsaWNlcl8uUmVzZXQoKTsKLSAgRVhQRUNUX1RSVUUoc3BsaWNlcl8uQWRkSW5wdXQoaW5wdXRfMykpOwotICBzY29wZWRfcmVmcHRyPEJ1ZmZlcj4gb3V0cHV0XzMgPSBzcGxpY2VyXy5HZXROZXh0QnVmZmVyKCk7Ci0gIEVYUEVDVF9GQUxTRShzcGxpY2VyXy5IYXNOZXh0QnVmZmVyKCkpOwotICBFWFBFQ1RfRVEoaW5wdXRfMy0+R2V0VGltZXN0YW1wKCksIG91dHB1dF8zLT5HZXRUaW1lc3RhbXAoKSk7Ci0gIEVYUEVDVF9FUShpbnB1dF8zLT5HZXREdXJhdGlvbigpLCBvdXRwdXRfMy0+R2V0RHVyYXRpb24oKSk7Ci0gIEVYUEVDVF9FUShpbnB1dF8zLT5HZXREYXRhU2l6ZSgpLCBvdXRwdXRfMy0+R2V0RGF0YVNpemUoKSk7Ci19Ci0KLQotLy8gVGVzdCB0aGUgZ2FwIGluc2VydGlvbiBjb2RlLgotLy8gKy0tLS0tLS0tLS0tLS0tKyAgICArLS0tLS0tLS0tLS0tLS0rCi0vLyB8MTExMTExMTExMTExMTF8ICAgIHwyMjIyMjIyMjIyMjIyMnwKLS8vICstLS0tLS0tLS0tLS0tLSsgICAgKy0tLS0tLS0tLS0tLS0tKwotLy8gUmVzdWx0cyBpbjoKLS8vICstLS0tLS0tLS0tLS0tLSstLS0tKy0tLS0tLS0tLS0tLS0tKwotLy8gfDExMTExMTExMTExMTExfDAwMDB8MjIyMjIyMjIyMjIyMjJ8Ci0vLyArLS0tLS0tLS0tLS0tLS0rLS0tLSstLS0tLS0tLS0tLS0tLSsKLVRFU1RfRihBdWRpb1NwbGljZXJUZXN0LCBHYXBJbnNlcnRpb24pIHsKLSAgc2NvcGVkX3JlZnB0cjxCdWZmZXI+IGlucHV0XzEgPSBHZXROZXh0SW5wdXRCdWZmZXIoMSk7Ci0KLSAgLy8gQWRkIGJ5dGVzIHRvIHRoZSB0aW1lc3RhbXAgaGVscGVyIHNvIHRoYXQgdGhlIG5leHQgYnVmZmVyCi0gIC8vIHdpbGwgaGF2ZSBhIHN0YXJ0aW5nIHRpbWVzdGFtcCB0aGF0IGluZGljYXRlcyBhIGdhcCBpcwotICAvLyBwcmVzZW50LgotICBjb25zdCBpbnQga0dhcFNpemUgPSA3ICoga0J5dGVzUGVyRnJhbWU7Ci0gIGlucHV0X3RpbWVzdGFtcF9oZWxwZXJfLkFkZEJ5dGVzKGtHYXBTaXplKTsKLSAgc2NvcGVkX3JlZnB0cjxCdWZmZXI+IGlucHV0XzIgPSBHZXROZXh0SW5wdXRCdWZmZXIoMik7Ci0KLSAgRVhQRUNUX1RSVUUoc3BsaWNlcl8uQWRkSW5wdXQoaW5wdXRfMSkpOwotICBFWFBFQ1RfVFJVRShzcGxpY2VyXy5BZGRJbnB1dChpbnB1dF8yKSk7Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgYSBnYXAgYnVmZmVyIGlzIGdlbmVyYXRlZC4KLSAgRVhQRUNUX1RSVUUoc3BsaWNlcl8uSGFzTmV4dEJ1ZmZlcigpKTsKLSAgc2NvcGVkX3JlZnB0cjxCdWZmZXI+IG91dHB1dF8xID0gc3BsaWNlcl8uR2V0TmV4dEJ1ZmZlcigpOwotICBzY29wZWRfcmVmcHRyPEJ1ZmZlcj4gb3V0cHV0XzIgPSBzcGxpY2VyXy5HZXROZXh0QnVmZmVyKCk7Ci0gIHNjb3BlZF9yZWZwdHI8QnVmZmVyPiBvdXRwdXRfMyA9IHNwbGljZXJfLkdldE5leHRCdWZmZXIoKTsKLSAgRVhQRUNUX0ZBTFNFKHNwbGljZXJfLkhhc05leHRCdWZmZXIoKSk7Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgdGhlIGZpcnN0IGlucHV0IGJ1ZmZlciBwYXNzZWQgdGhyb3VnaCB1bm1vZGlmaWVkLgotICBFWFBFQ1RfRVEoaW5wdXRfMS0+R2V0VGltZXN0YW1wKCksIG91dHB1dF8xLT5HZXRUaW1lc3RhbXAoKSk7Ci0gIEVYUEVDVF9FUShpbnB1dF8xLT5HZXREdXJhdGlvbigpLCBvdXRwdXRfMS0+R2V0RHVyYXRpb24oKSk7Ci0gIEVYUEVDVF9FUShpbnB1dF8xLT5HZXREYXRhU2l6ZSgpLCBvdXRwdXRfMS0+R2V0RGF0YVNpemUoKSk7Ci0gIEVYUEVDVF9UUlVFKFZlcmlmeURhdGEob3V0cHV0XzEtPkdldERhdGEoKSwgb3V0cHV0XzEtPkdldERhdGFTaXplKCksIDEpKTsKLQotICAvLyBWZXJpZnkgdGhlIGNvbnRlbnRzIG9mIHRoZSBnYXAgYnVmZmVyLgotICBiYXNlOjpUaW1lRGVsdGEgZ2FwX3RpbWVzdGFtcCA9Ci0gICAgICBpbnB1dF8xLT5HZXRUaW1lc3RhbXAoKSArIGlucHV0XzEtPkdldER1cmF0aW9uKCk7Ci0gIGJhc2U6OlRpbWVEZWx0YSBnYXBfZHVyYXRpb24gPSBpbnB1dF8yLT5HZXRUaW1lc3RhbXAoKSAtIGdhcF90aW1lc3RhbXA7Ci0gIEVYUEVDVF9HVChnYXBfZHVyYXRpb24sIGJhc2U6OlRpbWVEZWx0YSgpKTsKLSAgRVhQRUNUX0VRKGdhcF90aW1lc3RhbXAsIG91dHB1dF8yLT5HZXRUaW1lc3RhbXAoKSk7Ci0gIEVYUEVDVF9FUShnYXBfZHVyYXRpb24sIG91dHB1dF8yLT5HZXREdXJhdGlvbigpKTsKLSAgRVhQRUNUX0VRKGtHYXBTaXplLCBvdXRwdXRfMi0+R2V0RGF0YVNpemUoKSk7Ci0gIEVYUEVDVF9UUlVFKFZlcmlmeURhdGEob3V0cHV0XzItPkdldERhdGEoKSwgb3V0cHV0XzItPkdldERhdGFTaXplKCksIDApKTsKLQotICAvLyBWZXJpZnkgdGhhdCB0aGUgc2Vjb25kIGlucHV0IGJ1ZmZlciBwYXNzZWQgdGhyb3VnaCB1bm1vZGlmaWVkLgotICBFWFBFQ1RfRVEoaW5wdXRfMi0+R2V0VGltZXN0YW1wKCksIG91dHB1dF8zLT5HZXRUaW1lc3RhbXAoKSk7Ci0gIEVYUEVDVF9FUShpbnB1dF8yLT5HZXREdXJhdGlvbigpLCBvdXRwdXRfMy0+R2V0RHVyYXRpb24oKSk7Ci0gIEVYUEVDVF9FUShpbnB1dF8yLT5HZXREYXRhU2l6ZSgpLCBvdXRwdXRfMy0+R2V0RGF0YVNpemUoKSk7Ci0gIEVYUEVDVF9UUlVFKFZlcmlmeURhdGEob3V0cHV0XzMtPkdldERhdGEoKSwgb3V0cHV0XzMtPkdldERhdGFTaXplKCksIDIpKTsKLX0KLQotCi0vLyBUZXN0IHRoYXQgYW4gZXJyb3IgaXMgc2lnbmFsbGVkIHdoZW4gdGhlIGdhcCBiZXR3ZWVuIGlucHV0IGJ1ZmZlcnMgaXMKLS8vIHRvbyBsYXJnZS4KLVRFU1RfRihBdWRpb1NwbGljZXJUZXN0LCBHYXBUb29MYXJnZSkgewotICBzY29wZWRfcmVmcHRyPEJ1ZmZlcj4gaW5wdXRfMSA9IEdldE5leHRJbnB1dEJ1ZmZlcigxKTsKLQotICAvLyBBZGQgYSBzZWNvbmRzIHdvcnRoIG9mIGJ5dGVzIHNvIHRoYXQgYW4gdW5hY2NlcHRhYmx5IGxhcmdlCi0gIC8vIGdhcCBleGlzdHMgYmV0d2VlbiB8aW5wdXRfMXwgYW5kIHxpbnB1dF8yfC4KLSAgY29uc3QgaW50IGtHYXBTaXplID0ga0RlZmF1bHRTYW1wbGVSYXRlICoga0J5dGVzUGVyRnJhbWU7Ci0gIGlucHV0X3RpbWVzdGFtcF9oZWxwZXJfLkFkZEJ5dGVzKGtHYXBTaXplKTsKLSAgc2NvcGVkX3JlZnB0cjxCdWZmZXI+IGlucHV0XzIgPSBHZXROZXh0SW5wdXRCdWZmZXIoMik7Ci0KLSAgRVhQRUNUX1RSVUUoc3BsaWNlcl8uQWRkSW5wdXQoaW5wdXRfMSkpOwotICBFWFBFQ1RfRkFMU0Uoc3BsaWNlcl8uQWRkSW5wdXQoaW5wdXRfMikpOwotCi0gIEVYUEVDVF9UUlVFKHNwbGljZXJfLkhhc05leHRCdWZmZXIoKSk7Ci0gIHNjb3BlZF9yZWZwdHI8QnVmZmVyPiBvdXRwdXRfMSA9IHNwbGljZXJfLkdldE5leHRCdWZmZXIoKTsKLQotICAvLyBWZXJpZnkgdGhhdCB0aGUgZmlyc3QgaW5wdXQgYnVmZmVyIHBhc3NlZCB0aHJvdWdoIHVubW9kaWZpZWQuCi0gIEVYUEVDVF9FUShpbnB1dF8xLT5HZXRUaW1lc3RhbXAoKSwgb3V0cHV0XzEtPkdldFRpbWVzdGFtcCgpKTsKLSAgRVhQRUNUX0VRKGlucHV0XzEtPkdldER1cmF0aW9uKCksIG91dHB1dF8xLT5HZXREdXJhdGlvbigpKTsKLSAgRVhQRUNUX0VRKGlucHV0XzEtPkdldERhdGFTaXplKCksIG91dHB1dF8xLT5HZXREYXRhU2l6ZSgpKTsKLSAgRVhQRUNUX1RSVUUoVmVyaWZ5RGF0YShvdXRwdXRfMS0+R2V0RGF0YSgpLCBvdXRwdXRfMS0+R2V0RGF0YVNpemUoKSwgMSkpOwotCi0gIC8vIFZlcmlmeSB0aGF0IHRoZSBzZWNvbmQgYnVmZmVyIGlzIG5vdCBhdmFpbGFibGUuCi0gIEVYUEVDVF9GQUxTRShzcGxpY2VyXy5IYXNOZXh0QnVmZmVyKCkpOwotCi0gIC8vIFJlc2V0IHRoZSB0aW1lc3RhbXAgaGVscGVyIHNvIGl0IGNhbiBnZW5lcmF0ZSBhIGJ1ZmZlciB0aGF0IGlzCi0gIC8vIHJpZ2h0IGFmdGVyIHxpbnB1dF8xfC4KLSAgaW5wdXRfdGltZXN0YW1wX2hlbHBlcl8uU2V0QmFzZVRpbWVzdGFtcCgKLSAgICAgIGlucHV0XzEtPkdldFRpbWVzdGFtcCgpICsgaW5wdXRfMS0+R2V0RHVyYXRpb24oKSk7Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgdmFsaWQgYnVmZmVycyBhcmUgc3RpbGwgYWNjZXB0ZWQuCi0gIHNjb3BlZF9yZWZwdHI8QnVmZmVyPiBpbnB1dF8zID0gR2V0TmV4dElucHV0QnVmZmVyKDMpOwotICBFWFBFQ1RfVFJVRShzcGxpY2VyXy5BZGRJbnB1dChpbnB1dF8zKSk7Ci0gIEVYUEVDVF9UUlVFKHNwbGljZXJfLkhhc05leHRCdWZmZXIoKSk7Ci0gIHNjb3BlZF9yZWZwdHI8QnVmZmVyPiBvdXRwdXRfMiA9IHNwbGljZXJfLkdldE5leHRCdWZmZXIoKTsKLSAgRVhQRUNUX0ZBTFNFKHNwbGljZXJfLkhhc05leHRCdWZmZXIoKSk7Ci0gIEVYUEVDVF9FUShpbnB1dF8zLT5HZXRUaW1lc3RhbXAoKSwgb3V0cHV0XzItPkdldFRpbWVzdGFtcCgpKTsKLSAgRVhQRUNUX0VRKGlucHV0XzMtPkdldER1cmF0aW9uKCksIG91dHB1dF8yLT5HZXREdXJhdGlvbigpKTsKLSAgRVhQRUNUX0VRKGlucHV0XzMtPkdldERhdGFTaXplKCksIG91dHB1dF8yLT5HZXREYXRhU2l6ZSgpKTsKLSAgRVhQRUNUX1RSVUUoVmVyaWZ5RGF0YShvdXRwdXRfMi0+R2V0RGF0YSgpLCBvdXRwdXRfMi0+R2V0RGF0YVNpemUoKSwgMykpOwotfQotCi0KLS8vIFZlcmlmaWVzIHRoYXQgYW4gZXJyb3IgaXMgc2lnbmFsbGVkIGlmIEFkZElucHV0KCkgaXMgY2FsbGVkCi0vLyB3aXRoIGEgdGltZXN0YW1wIHRoYXQgaXMgZWFybGllciB0aGFuIHRoZSBmaXJzdCBidWZmZXIgYWRkZWQuCi1URVNUX0YoQXVkaW9TcGxpY2VyVGVzdCwgQnVmZmVyQWRkZWRCZWZvcmVCYXNlKSB7Ci0gIGlucHV0X3RpbWVzdGFtcF9oZWxwZXJfLlNldEJhc2VUaW1lc3RhbXAoCi0gICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWNyb3NlY29uZHMoMTApKTsKLSAgc2NvcGVkX3JlZnB0cjxCdWZmZXI+IGlucHV0XzEgPSBHZXROZXh0SW5wdXRCdWZmZXIoMSk7Ci0KLSAgLy8gUmVzZXQgdGhlIHRpbWVzdGFtcCBoZWxwZXIgc28gdGhlIG5leHQgYnVmZmVyIHdpbGwgaGF2ZSBhIHRpbWVzdGFtcCBlYXJsaWVyCi0gIC8vIHRoYW4gfGlucHV0XzF8LgotICBpbnB1dF90aW1lc3RhbXBfaGVscGVyXy5TZXRCYXNlVGltZXN0YW1wKGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoMCkpOwotICBzY29wZWRfcmVmcHRyPEJ1ZmZlcj4gaW5wdXRfMiA9IEdldE5leHRJbnB1dEJ1ZmZlcigxKTsKLQotICBFWFBFQ1RfR1QoaW5wdXRfMS0+R2V0VGltZXN0YW1wKCksIGlucHV0XzItPkdldFRpbWVzdGFtcCgpKTsKLSAgRVhQRUNUX1RSVUUoc3BsaWNlcl8uQWRkSW5wdXQoaW5wdXRfMSkpOwotICBFWFBFQ1RfRkFMU0Uoc3BsaWNlcl8uQWRkSW5wdXQoaW5wdXRfMikpOwotfQotCi0KLS8vIFRlc3Qgd2hlbiBvbmUgYnVmZmVyIHBhcnRpYWxseSBvdmVybGFwcyBhbm90aGVyLgotLy8gKy0tLS0tLS0tLS0tLS0tKwotLy8gfDExMTExMTExMTExMTExfAotLy8gKy0tLS0tLS0tLS0tLS0tKwotLy8gICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0rCi0vLyAgICAgICAgICAgIHwyMjIyMjIyMjIyMjIyMnwKLS8vICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tKwotLy8gUmVzdWx0cyBpbjoKLS8vICstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKwotLy8gfDExMTExMTExMTExMTExfDIyMjIyMjIyMjJ8Ci0vLyArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKLVRFU1RfRihBdWRpb1NwbGljZXJUZXN0LCBQYXJ0aWFsT3ZlcmxhcCkgewotICBzY29wZWRfcmVmcHRyPEJ1ZmZlcj4gaW5wdXRfMSA9IEdldE5leHRJbnB1dEJ1ZmZlcigxKTsKLQotICAvLyBSZXNldCB0aW1lc3RhbXAgaGVscGVyIHNvIHRoYXQgdGhlIG5leHQgYnVmZmVyIHdpbGwgaGF2ZSBhCi0gIC8vIHRpbWVzdGFtcCB0aGF0IHN0YXJ0cyBpbiB0aGUgbWlkZGxlIG9mIHxpbnB1dF8xfC4KLSAgY29uc3QgaW50IGtPdmVybGFwU2l6ZSA9IGlucHV0XzEtPkdldERhdGFTaXplKCkgLyA0OwotICBpbnB1dF90aW1lc3RhbXBfaGVscGVyXy5TZXRCYXNlVGltZXN0YW1wKGlucHV0XzEtPkdldFRpbWVzdGFtcCgpKTsKLSAgaW5wdXRfdGltZXN0YW1wX2hlbHBlcl8uQWRkQnl0ZXMoaW5wdXRfMS0+R2V0RGF0YVNpemUoKSAtIGtPdmVybGFwU2l6ZSk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxCdWZmZXI+IGlucHV0XzIgPSBHZXROZXh0SW5wdXRCdWZmZXIoMik7Ci0KLSAgRVhQRUNUX1RSVUUoc3BsaWNlcl8uQWRkSW5wdXQoaW5wdXRfMSkpOwotICBFWFBFQ1RfVFJVRShzcGxpY2VyXy5BZGRJbnB1dChpbnB1dF8yKSk7Ci0KLSAgRVhQRUNUX1RSVUUoc3BsaWNlcl8uSGFzTmV4dEJ1ZmZlcigpKTsKLSAgc2NvcGVkX3JlZnB0cjxCdWZmZXI+IG91dHB1dF8xID0gc3BsaWNlcl8uR2V0TmV4dEJ1ZmZlcigpOwotICBzY29wZWRfcmVmcHRyPEJ1ZmZlcj4gb3V0cHV0XzIgPSBzcGxpY2VyXy5HZXROZXh0QnVmZmVyKCk7Ci0gIEVYUEVDVF9GQUxTRShzcGxpY2VyXy5IYXNOZXh0QnVmZmVyKCkpOwotCi0gIC8vIFZlcmlmeSB0aGF0IHRoZSBmaXJzdCBpbnB1dCBidWZmZXIgcGFzc2VkIHRocm91Z2ggdW5tb2RpZmllZC4KLSAgRVhQRUNUX0VRKGlucHV0XzEtPkdldFRpbWVzdGFtcCgpLCBvdXRwdXRfMS0+R2V0VGltZXN0YW1wKCkpOwotICBFWFBFQ1RfRVEoaW5wdXRfMS0+R2V0RHVyYXRpb24oKSwgb3V0cHV0XzEtPkdldER1cmF0aW9uKCkpOwotICBFWFBFQ1RfRVEoaW5wdXRfMS0+R2V0RGF0YVNpemUoKSwgb3V0cHV0XzEtPkdldERhdGFTaXplKCkpOwotICBFWFBFQ1RfVFJVRShWZXJpZnlEYXRhKG91dHB1dF8xLT5HZXREYXRhKCksIG91dHB1dF8xLT5HZXREYXRhU2l6ZSgpLCAxKSk7Ci0KLQotICAvLyBWZXJpZnkgdGhhdCB0aGUgc2Vjb25kIGlucHV0IGJ1ZmZlciB3YXMgdHJ1bmNhdGVkIHRvIG9ubHkgY29udGFpbgotICAvLyB0aGUgc2FtcGxlcyB0aGF0IGFyZSBhZnRlciB0aGUgZW5kIG9mIHxpbnB1dF8xfC4KLSAgYmFzZTo6VGltZURlbHRhIGV4cGVjdGVkX3RpbWVzdGFtcCA9Ci0gICAgICBpbnB1dF8xLT5HZXRUaW1lc3RhbXAoKSArIGlucHV0XzEtPkdldER1cmF0aW9uKCk7Ci0gIGJhc2U6OlRpbWVEZWx0YSBleHBlY3RlZF9kdXJhdGlvbiA9Ci0gICAgICAoaW5wdXRfMi0+R2V0VGltZXN0YW1wKCkgKyBpbnB1dF8yLT5HZXREdXJhdGlvbigpKSAtIGV4cGVjdGVkX3RpbWVzdGFtcDsKLSAgRVhQRUNUX0VRKGV4cGVjdGVkX3RpbWVzdGFtcCwgb3V0cHV0XzItPkdldFRpbWVzdGFtcCgpKTsKLSAgRVhQRUNUX0VRKGV4cGVjdGVkX2R1cmF0aW9uLCBvdXRwdXRfMi0+R2V0RHVyYXRpb24oKSk7Ci0gIEVYUEVDVF9FUShpbnB1dF8yLT5HZXREYXRhU2l6ZSgpIC0ga092ZXJsYXBTaXplLCBvdXRwdXRfMi0+R2V0RGF0YVNpemUoKSk7Ci0gIEVYUEVDVF9UUlVFKFZlcmlmeURhdGEob3V0cHV0XzItPkdldERhdGEoKSwgb3V0cHV0XzItPkdldERhdGFTaXplKCksIDIpKTsKLX0KLQotCi0vLyBUZXN0IHRoYXQgYW4gaW5wdXQgYnVmZmVyIHRoYXQgaXMgY29tcGxldGVseSBvdmVybGFwcGVkIGJ5IGEgYnVmZmVyCi0vLyB0aGF0IHdhcyBhbHJlYWR5IGFkZGVkIGlzIGRyb3BwZWQuCi0vLyArLS0tLS0tLS0tLS0tLS0rCi0vLyB8MTExMTExMTExMTExMTF8Ci0vLyArLS0tLS0tLS0tLS0tLS0rCi0vLyAgICAgICArLS0tLS0rCi0vLyAgICAgICB8MjIyMjJ8Ci0vLyAgICAgICArLS0tLS0rCi0vLyAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLSsKLS8vICAgICAgICAgICAgICAgIHwzMzMzMzMzMzMzMzMzfAotLy8gICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0rCi0vLyBSZXN1bHRzIGluOgotLy8gKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rCi0vLyB8MTExMTExMTExMTExMTF8MzMzMzMzMzMzMzMzM3wKLS8vICstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKwotVEVTVF9GKEF1ZGlvU3BsaWNlclRlc3QsIERyb3BCdWZmZXIpIHsKLSAgc2NvcGVkX3JlZnB0cjxCdWZmZXI+IGlucHV0XzEgPSBHZXROZXh0SW5wdXRCdWZmZXIoMSk7Ci0KLSAgLy8gUmVzZXQgdGltZXN0YW1wIGhlbHBlciBzbyB0aGF0IHRoZSBuZXh0IGJ1ZmZlciB3aWxsIGhhdmUgYQotICAvLyB0aW1lc3RhbXAgdGhhdCBzdGFydHMgaW4gdGhlIG1pZGRsZSBvZiB8aW5wdXRfMXwuCi0gIGNvbnN0IGludCBrT3ZlcmxhcE9mZnNldCA9IGlucHV0XzEtPkdldERhdGFTaXplKCkgLyAyOwotICBjb25zdCBpbnQga092ZXJsYXBTaXplID0gaW5wdXRfMS0+R2V0RGF0YVNpemUoKSAvIDQ7Ci0gIGlucHV0X3RpbWVzdGFtcF9oZWxwZXJfLlNldEJhc2VUaW1lc3RhbXAoaW5wdXRfMS0+R2V0VGltZXN0YW1wKCkpOwotICBpbnB1dF90aW1lc3RhbXBfaGVscGVyXy5BZGRCeXRlcyhrT3ZlcmxhcE9mZnNldCk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxCdWZmZXI+IGlucHV0XzIgPSBHZXROZXh0SW5wdXRCdWZmZXIoMiwga092ZXJsYXBTaXplKTsKLQotICAvLyBSZXNldCB0aGUgdGltZXN0YW1wIGhlbHBlciBzbyB0aGUgbmV4dCBidWZmZXIgd2lsbCBiZSByaWdodCBhZnRlcgotICAvLyB8aW5wdXRfMXwuCi0gIGlucHV0X3RpbWVzdGFtcF9oZWxwZXJfLlNldEJhc2VUaW1lc3RhbXAoaW5wdXRfMS0+R2V0VGltZXN0YW1wKCkpOwotICBpbnB1dF90aW1lc3RhbXBfaGVscGVyXy5BZGRCeXRlcyhpbnB1dF8xLT5HZXREYXRhU2l6ZSgpKTsKLSAgc2NvcGVkX3JlZnB0cjxCdWZmZXI+IGlucHV0XzMgPSBHZXROZXh0SW5wdXRCdWZmZXIoMyk7Ci0KLSAgRVhQRUNUX1RSVUUoc3BsaWNlcl8uQWRkSW5wdXQoaW5wdXRfMSkpOwotICBFWFBFQ1RfVFJVRShzcGxpY2VyXy5BZGRJbnB1dChpbnB1dF8yKSk7Ci0gIEVYUEVDVF9UUlVFKHNwbGljZXJfLkFkZElucHV0KGlucHV0XzMpKTsKLQotICBFWFBFQ1RfVFJVRShzcGxpY2VyXy5IYXNOZXh0QnVmZmVyKCkpOwotICBzY29wZWRfcmVmcHRyPEJ1ZmZlcj4gb3V0cHV0XzEgPSBzcGxpY2VyXy5HZXROZXh0QnVmZmVyKCk7Ci0gIHNjb3BlZF9yZWZwdHI8QnVmZmVyPiBvdXRwdXRfMiA9IHNwbGljZXJfLkdldE5leHRCdWZmZXIoKTsKLSAgRVhQRUNUX0ZBTFNFKHNwbGljZXJfLkhhc05leHRCdWZmZXIoKSk7Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgdGhlIGZpcnN0IGlucHV0IGJ1ZmZlciBwYXNzZWQgdGhyb3VnaCB1bm1vZGlmaWVkLgotICBFWFBFQ1RfRVEoaW5wdXRfMS0+R2V0VGltZXN0YW1wKCksIG91dHB1dF8xLT5HZXRUaW1lc3RhbXAoKSk7Ci0gIEVYUEVDVF9FUShpbnB1dF8xLT5HZXREdXJhdGlvbigpLCBvdXRwdXRfMS0+R2V0RHVyYXRpb24oKSk7Ci0gIEVYUEVDVF9FUShpbnB1dF8xLT5HZXREYXRhU2l6ZSgpLCBvdXRwdXRfMS0+R2V0RGF0YVNpemUoKSk7Ci0gIEVYUEVDVF9UUlVFKFZlcmlmeURhdGEob3V0cHV0XzEtPkdldERhdGEoKSwgb3V0cHV0XzEtPkdldERhdGFTaXplKCksIDEpKTsKLQotICAvLyBWZXJpZnkgdGhhdCB0aGUgc2Vjb25kIG91dHB1dCBidWZmZXIgb25seSBjb250YWlucwotICAvLyB0aGUgc2FtcGxlcyB0aGF0IGFyZSBpbiB8aW5wdXRfM3wuCi0gIEVYUEVDVF9FUShpbnB1dF8zLT5HZXRUaW1lc3RhbXAoKSwgb3V0cHV0XzItPkdldFRpbWVzdGFtcCgpKTsKLSAgRVhQRUNUX0VRKGlucHV0XzMtPkdldER1cmF0aW9uKCksIG91dHB1dF8yLT5HZXREdXJhdGlvbigpKTsKLSAgRVhQRUNUX0VRKGlucHV0XzMtPkdldERhdGFTaXplKCksIG91dHB1dF8yLT5HZXREYXRhU2l6ZSgpKTsKLSAgRVhQRUNUX1RSVUUoVmVyaWZ5RGF0YShvdXRwdXRfMi0+R2V0RGF0YSgpLCBvdXRwdXRfMi0+R2V0RGF0YVNpemUoKSwgMykpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2F1ZGlvX3RpbWVzdGFtcF9oZWxwZXIuY2MgYi9zcmMvbWVkaWEvYmFzZS9hdWRpb190aW1lc3RhbXBfaGVscGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2YzN2M0Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL2F1ZGlvX3RpbWVzdGFtcF9oZWxwZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb190aW1lc3RhbXBfaGVscGVyLmgiCi0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2J1ZmZlcnMuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotQXVkaW9UaW1lc3RhbXBIZWxwZXI6OkF1ZGlvVGltZXN0YW1wSGVscGVyKGludCBieXRlc19wZXJfZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZXNfcGVyX3NlY29uZCkKLSAgICA6IGJ5dGVzX3Blcl9mcmFtZV8oYnl0ZXNfcGVyX2ZyYW1lKSwKLSAgICAgIGJhc2VfdGltZXN0YW1wXyhrTm9UaW1lc3RhbXAoKSksCi0gICAgICBmcmFtZV9jb3VudF8oMCkgewotICBEQ0hFQ0tfR1QoYnl0ZXNfcGVyX2ZyYW1lLCAwKTsKLSAgRENIRUNLX0dUKHNhbXBsZXNfcGVyX3NlY29uZCwgMCk7Ci0gIGRvdWJsZSBmcHMgPSBzYW1wbGVzX3Blcl9zZWNvbmQ7Ci0gIG1pY3Jvc2Vjb25kc19wZXJfZnJhbWVfID0gYmFzZTo6VGltZTo6a01pY3Jvc2Vjb25kc1BlclNlY29uZCAvIGZwczsKLX0KLQotdm9pZCBBdWRpb1RpbWVzdGFtcEhlbHBlcjo6U2V0QmFzZVRpbWVzdGFtcChiYXNlOjpUaW1lRGVsdGEgYmFzZV90aW1lc3RhbXApIHsKLSAgYmFzZV90aW1lc3RhbXBfID0gYmFzZV90aW1lc3RhbXA7Ci0gIGZyYW1lX2NvdW50XyA9IDA7Ci19Ci0KLWJhc2U6OlRpbWVEZWx0YSBBdWRpb1RpbWVzdGFtcEhlbHBlcjo6YmFzZV90aW1lc3RhbXAoKSBjb25zdCB7Ci0gIHJldHVybiBiYXNlX3RpbWVzdGFtcF87Ci19Ci0KLXZvaWQgQXVkaW9UaW1lc3RhbXBIZWxwZXI6OkFkZEJ5dGVzKGludCBieXRlX2NvdW50KSB7Ci0gIERDSEVDS19HRShieXRlX2NvdW50LCAwKTsKLSAgRENIRUNLKGJhc2VfdGltZXN0YW1wXyAhPSBrTm9UaW1lc3RhbXAoKSk7Ci0gIERDSEVDS19FUShieXRlX2NvdW50ICUgYnl0ZXNfcGVyX2ZyYW1lXywgMCk7Ci0gIGZyYW1lX2NvdW50XyArPSBieXRlX2NvdW50IC8gYnl0ZXNfcGVyX2ZyYW1lXzsKLX0KLQotYmFzZTo6VGltZURlbHRhIEF1ZGlvVGltZXN0YW1wSGVscGVyOjpHZXRUaW1lc3RhbXAoKSBjb25zdCB7Ci0gIHJldHVybiBDb21wdXRlVGltZXN0YW1wKGZyYW1lX2NvdW50Xyk7Ci19Ci0KLWJhc2U6OlRpbWVEZWx0YSBBdWRpb1RpbWVzdGFtcEhlbHBlcjo6R2V0RHVyYXRpb24oaW50IGJ5dGVfY291bnQpIGNvbnN0IHsKLSAgRENIRUNLX0dFKGJ5dGVfY291bnQsIDApOwotICBEQ0hFQ0tfRVEoYnl0ZV9jb3VudCAlIGJ5dGVzX3Blcl9mcmFtZV8sIDApOwotICBpbnQgZnJhbWVzID0gYnl0ZV9jb3VudCAvIGJ5dGVzX3Blcl9mcmFtZV87Ci0gIGJhc2U6OlRpbWVEZWx0YSBlbmRfdGltZXN0YW1wID0gQ29tcHV0ZVRpbWVzdGFtcChmcmFtZV9jb3VudF8gKyBmcmFtZXMpOwotICByZXR1cm4gZW5kX3RpbWVzdGFtcCAtIEdldFRpbWVzdGFtcCgpOwotfQotCi1pbnQ2NCBBdWRpb1RpbWVzdGFtcEhlbHBlcjo6R2V0Qnl0ZXNUb1RhcmdldCgKLSAgICBiYXNlOjpUaW1lRGVsdGEgdGFyZ2V0KSBjb25zdCB7Ci0gIERDSEVDSyhiYXNlX3RpbWVzdGFtcF8gIT0ga05vVGltZXN0YW1wKCkpOwotICBEQ0hFQ0sodGFyZ2V0ID49IGJhc2VfdGltZXN0YW1wXyk7Ci0KLSAgaW50NjQgZGVsdGFfaW5fdXMgPSAodGFyZ2V0IC0gR2V0VGltZXN0YW1wKCkpLkluTWljcm9zZWNvbmRzKCk7Ci0gIGlmIChkZWx0YV9pbl91cyA9PSAwKQotICAgIHJldHVybiAwOwotCi0gIC8vIENvbXB1dGUgYSB0aW1lc3RhbXAgcmVsYXRpdmUgdG8gfGJhc2VfdGltZXN0YW1wX3wgc2luY2UgdGltZXN0YW1wcwotICAvLyBjcmVhdGVkIGZyb20gfGZyYW1lX2NvdW50X3wgYXJlIGNvbXB1dGVkIHJlbGF0aXZlIHRvIHRoaXMgYmFzZS4KLSAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHRpbWUgdG8gZnJhbWUgY29tcHV0YXRpb24gaGVyZSBpcyB0aGUgcHJvcGVyIGludmVyc2UKLSAgLy8gb2YgdGhlIGZyYW1lIHRvIHRpbWUgY29tcHV0YXRpb24gaW4gQ29tcHV0ZVRpbWVzdGFtcCgpLgotICBiYXNlOjpUaW1lRGVsdGEgZGVsdGFfZnJvbV9iYXNlID0gdGFyZ2V0IC0gYmFzZV90aW1lc3RhbXBfOwotCi0gIC8vIENvbXB1dGUgZnJhbWUgY291bnQgZm9yIHRoZSB0aW1lIGRlbHRhLiBUaGlzIGNvbXB1dGF0aW9uIHJvdW5kcyB0bwotICAvLyB0aGUgbmVhcmVzdCB3aG9sZSBudW1iZXIgb2YgZnJhbWVzLgotICBkb3VibGUgdGhyZXNob2xkID0gbWljcm9zZWNvbmRzX3Blcl9mcmFtZV8gLyAyOwotICBpbnQ2NCB0YXJnZXRfZnJhbWVfY291bnQgPQotICAgICAgKGRlbHRhX2Zyb21fYmFzZS5Jbk1pY3Jvc2Vjb25kcygpICsgdGhyZXNob2xkKSAvIG1pY3Jvc2Vjb25kc19wZXJfZnJhbWVfOwotICByZXR1cm4gYnl0ZXNfcGVyX2ZyYW1lXyAqICh0YXJnZXRfZnJhbWVfY291bnQgLSBmcmFtZV9jb3VudF8pOwotfQotCi1iYXNlOjpUaW1lRGVsdGEgQXVkaW9UaW1lc3RhbXBIZWxwZXI6OkNvbXB1dGVUaW1lc3RhbXAoCi0gICAgaW50NjQgZnJhbWVfY291bnQpIGNvbnN0IHsKLSAgRENIRUNLX0dFKGZyYW1lX2NvdW50LCAwKTsKLSAgRENIRUNLKGJhc2VfdGltZXN0YW1wXyAhPSBrTm9UaW1lc3RhbXAoKSk7Ci0gIGRvdWJsZSBmcmFtZXNfdXMgPSBtaWNyb3NlY29uZHNfcGVyX2ZyYW1lXyAqIGZyYW1lX2NvdW50OwotICByZXR1cm4gYmFzZV90aW1lc3RhbXBfICsgYmFzZTo6VGltZURlbHRhOjpGcm9tTWljcm9zZWNvbmRzKGZyYW1lc191cyk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvYXVkaW9fdGltZXN0YW1wX2hlbHBlci5oIGIvc3JjL21lZGlhL2Jhc2UvYXVkaW9fdGltZXN0YW1wX2hlbHBlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjM4YmU3Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL2F1ZGlvX3RpbWVzdGFtcF9oZWxwZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfQkFTRV9BVURJT19USU1FU1RBTVBfSEVMUEVSX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfQVVESU9fVElNRVNUQU1QX0hFTFBFUl9IXwotCi0jaW5jbHVkZSAiYmFzZS90aW1lLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gR2VuZXJhdGVzIHRpbWVzdGFtcHMgZm9yIGEgc2VxdWVuY2Ugb2YgYXVkaW8gc2FtcGxlIGJ5dGVzLiBUaGlzIGNsYXNzIHNob3VsZAotLy8gYmUgdXNlZCBhbnkgcGxhY2UgdGltZXN0YW1wcyBuZWVkIHRvIGJlIGNhbGN1bGF0ZWQgZm9yIGEgc2VxdWVuY2Ugb2YgYXVkaW8KLS8vIHNhbXBsZXMuIEl0IGhlbHBzIGF2b2lkIHRpbWVzdGFtcHMgaW5hY2N1cmFjaWVzIGNhdXNlZCBieSByb3VuZGluZy90cnVuY2F0aW9uCi0vLyBpbiByZXBlYXRlZCBzYW1wbGUgY291bnQgdG8gdGltZXN0YW1wIGNvbnZlcnNpb25zLgotLy8KLS8vIFRoZSBjbGFzcyBpcyBjb25zdHJ1Y3RlZCB3aXRoIGJ5dGVzIHBlciBmcmFtZSBhbmQgc2FtcGxlc19wZXJfc2Vjb25kCi0vLyBpbmZvcm1hdGlvbiBzbyB0aGF0IGl0IGNhbiBjb252ZXJ0IGF1ZGlvIHNhbXBsZSBieXRlIGNvdW50cyBpbnRvIHRpbWVzdGFtcHMuCi0vLyBBZnRlciB0aGUgb2JqZWN0IGlzIGNvbnN0cnVjdGVkLCBTZXRCYXNlVGltZXN0YW1wKCkgbXVzdCBiZSBjYWxsZWQgdG8gc3BlY2lmeQotLy8gdGhlIHN0YXJ0aW5nIHRpbWVzdGFtcCBvZiB0aGUgYXVkaW8gc2VxdWVuY2UuIEFzIGF1ZGlvIHNhbXBsZXMgYXJlIHJlY2VpdmVkLAotLy8gdGhlaXIgYnl0ZSBjb3VudHMgYXJlIGFkZGVkIHRvIEFkZEJ5dGVzKCkuIFRoZXNlIGJ5dGUgY291bnRzIGFyZQotLy8gYWNjdW11bGF0ZWQgYnkgdGhpcyBjbGFzcyBzbyBHZXRUaW1lc3RhbXAoKSBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlCi0vLyB0aW1lc3RhbXAgZm9yIHRoZSBzYW1wbGVzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkLiBHZXREdXJhdGlvbigpIGNhbGN1bGF0ZXMKLS8vIHRoZSBwcm9wZXIgZHVyYXRpb24gdmFsdWVzIGZvciBzYW1wbGVzIGFkZGVkIHRvIHRoZSBjdXJyZW50IHRpbWVzdGFtcC4KLS8vIEdldEJ5dGVzVG9UYXJnZXQoKSBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBuZWVkIHRvIGJlCi0vLyBhZGRlZC9yZW1vdmVkIGZyb20gdGhlIGFjY3VtdWxhdGVkIGJ5dGVzIHRvIHJlYWNoIGEgdGFyZ2V0IHRpbWVzdGFtcC4KLWNsYXNzIE1FRElBX0VYUE9SVCBBdWRpb1RpbWVzdGFtcEhlbHBlciB7Ci0gcHVibGljOgotICBBdWRpb1RpbWVzdGFtcEhlbHBlcihpbnQgYnl0ZXNfcGVyX2ZyYW1lLCBpbnQgc2FtcGxlc19wZXJfc2Vjb25kKTsKLQotICAvLyBTZXRzIHRoZSBiYXNlIHRpbWVzdGFtcCB0byB8YmFzZV90aW1lc3RhbXB8IGFuZCB0aGUgc2V0cyBjb3VudCB0byAwLgotICB2b2lkIFNldEJhc2VUaW1lc3RhbXAoYmFzZTo6VGltZURlbHRhIGJhc2VfdGltZXN0YW1wKTsKLQotICBiYXNlOjpUaW1lRGVsdGEgYmFzZV90aW1lc3RhbXAoKSBjb25zdDsKLQotICAvLyBBZGRzIHNhbXBsZSBieXRlcyB0byB0aGUgZnJhbWUgY291bnRlci4KLSAgLy8KLSAgLy8gTm90ZTogU2V0QmFzZVRpbWVzdGFtcCgpIG11c3QgYmUgY2FsbGVkIHdpdGggYSB2YWx1ZSBvdGhlciB0aGFuCi0gIC8vIGtOb1RpbWVzdGFtcCgpIGJlZm9yZSB0aGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkLgotICB2b2lkIEFkZEJ5dGVzKGludCBieXRlX2NvdW50KTsKLQotICAvLyBHZXQgdGhlIGN1cnJlbnQgdGltZXN0YW1wLiBUaGlzIHZhbHVlIGlzIGNvbXB1dGVkIGZyb20gdGhlIGJhc2VfdGltZXN0YW1wKCkKLSAgLy8gYW5kIHRoZSBudW1iZXIgb2Ygc2FtcGxlIGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHNvIGZhci4KLSAgYmFzZTo6VGltZURlbHRhIEdldFRpbWVzdGFtcCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIGR1cmF0aW9uIGlmIHxieXRlX2NvdW50fCBieXRlcyB3ZXJlIGFkZGVkIHRvIHRoZSBjdXJyZW50Ci0gIC8vIHRpbWVzdGFtcCByZXBvcnRlZCBieSBHZXRUaW1lc3RhbXAoKS4gVGhpcyBtZXRob2QgZW5zdXJlcyB0aGF0Ci0gIC8vIChHZXRUaW1lc3RhbXAoKSArIEdldER1cmF0aW9uKG4pKSB3aWxsIGVxdWFsIHRoZSB0aW1lc3RhbXAgdGhhdAotICAvLyBHZXRUaW1lc3RhbXAoKSB3aWxsIHJldHVybiBpZiBBZGRCeXRlcyhuKSBpcyBjYWxsZWQuCi0gIGJhc2U6OlRpbWVEZWx0YSBHZXREdXJhdGlvbihpbnQgYnl0ZV9jb3VudCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byByZWFjaCB0aGUgdGFyZ2V0IHRpbWVzdGFtcC4KLSAgLy8KLSAgLy8gTm90ZTogfHRhcmdldHwgbXVzdCBiZSA+PSB8YmFzZV90aW1lc3RhbXBffC4KLSAgaW50NjQgR2V0Qnl0ZXNUb1RhcmdldChiYXNlOjpUaW1lRGVsdGEgdGFyZ2V0KSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIGJhc2U6OlRpbWVEZWx0YSBDb21wdXRlVGltZXN0YW1wKGludDY0IGZyYW1lX2NvdW50KSBjb25zdDsKLQotICBpbnQgYnl0ZXNfcGVyX2ZyYW1lXzsKLSAgZG91YmxlIG1pY3Jvc2Vjb25kc19wZXJfZnJhbWVfOwotCi0gIGJhc2U6OlRpbWVEZWx0YSBiYXNlX3RpbWVzdGFtcF87Ci0KLSAgLy8gTnVtYmVyIG9mIGZyYW1lcyBhY2N1bXVsYXRlZCBieSBieXRlIGNvdW50cyBwYXNzZWQgdG8gQWRkQnl0ZXMoKSBjYWxscy4KLSAgaW50NjQgZnJhbWVfY291bnRfOwotCi0gIERJU0FMTE9XX0lNUExJQ0lUX0NPTlNUUlVDVE9SUyhBdWRpb1RpbWVzdGFtcEhlbHBlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9hdWRpb190aW1lc3RhbXBfaGVscGVyX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2Jhc2UvYXVkaW9fdGltZXN0YW1wX2hlbHBlcl91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY1YmI0ZS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9hdWRpb190aW1lc3RhbXBfaGVscGVyX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX3RpbWVzdGFtcF9oZWxwZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2J1ZmZlcnMuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotc3RhdGljIGNvbnN0IGludCBrQnl0ZXNQZXJGcmFtZSA9IDQ7Ci1zdGF0aWMgY29uc3QgaW50IGtEZWZhdWx0U2FtcGxlUmF0ZSA9IDQ0MTAwOwotCi1jbGFzcyBBdWRpb1RpbWVzdGFtcEhlbHBlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gIEF1ZGlvVGltZXN0YW1wSGVscGVyVGVzdCgpCi0gICAgICA6IGhlbHBlcl8oa0J5dGVzUGVyRnJhbWUsIGtEZWZhdWx0U2FtcGxlUmF0ZSkgewotICAgIGhlbHBlcl8uU2V0QmFzZVRpbWVzdGFtcChiYXNlOjpUaW1lRGVsdGEoKSk7Ci0gIH0KLQotICAvLyBBZGRzIGJ5dGVzIHRvIHRoZSBoZWxwZXIgYW5kIHJldHVybnMgdGhlIGN1cnJlbnQgdGltZXN0YW1wIGluIG1pY3Jvc2Vjb25kcy4KLSAgaW50NjQgQWRkQnl0ZXMoaW50IGJ5dGVzKSB7Ci0gICAgaGVscGVyXy5BZGRCeXRlcyhieXRlcyk7Ci0gICAgcmV0dXJuIGhlbHBlcl8uR2V0VGltZXN0YW1wKCkuSW5NaWNyb3NlY29uZHMoKTsKLSAgfQotCi0gIGludDY0IEJ5dGVzVG9UYXJnZXQoaW50IHRhcmdldF9pbl9taWNyb3NlY29uZHMpIHsKLSAgICByZXR1cm4gaGVscGVyXy5HZXRCeXRlc1RvVGFyZ2V0KAotICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWNyb3NlY29uZHModGFyZ2V0X2luX21pY3Jvc2Vjb25kcykpOwotICB9Ci0KLSAgdm9pZCBUZXN0R2V0Qnl0ZXNUb1RhcmdldFJhbmdlKGludCBieXRlX2NvdW50LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPD0gZW5kOyArK2kpCi0gICAgICBFWFBFQ1RfRVEoYnl0ZV9jb3VudCxCeXRlc1RvVGFyZ2V0KGkpKSA8PCAiIEZhaWx1cmUgZm9yIHRpbWVzdGFtcCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpIDw8ICIgdXMuIjsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBBdWRpb1RpbWVzdGFtcEhlbHBlciBoZWxwZXJfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBdWRpb1RpbWVzdGFtcEhlbHBlclRlc3QpOwotfTsKLQotVEVTVF9GKEF1ZGlvVGltZXN0YW1wSGVscGVyVGVzdCwgQmFzaWMpIHsKLSAgRVhQRUNUX0VRKDAsIGhlbHBlcl8uR2V0VGltZXN0YW1wKCkuSW5NaWNyb3NlY29uZHMoKSk7Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgdGhlIG91dHB1dCB0aW1lc3RhbXAgaXMgYWx3YXlzIHJvdW5kZWQgZG93biB0byB0aGUKLSAgLy8gbmVhcmVzdCBtaWNyb3NlY29uZC4gMSBmcmFtZSBAIDQ0MTAwIGlzIH4yMi42NzU3MyBtaWNyb3NlY29uZHMsCi0gIC8vIHdoaWNoIGlzIHdoeSB0aGUgdGltZXN0YW1wIHNvbWV0aW1lcyBpbmNyZW1lbnRzIGJ5IDIzIG1pY3Jvc2Vjb25kcwotICAvLyBhbmQgb3RoZXIgdGltZXMgaXQgaW5jcmVtZW50cyBieSAyMiBtaWNyb3NlY29uZHMuCi0gIEVYUEVDVF9FUSgwLCBBZGRCeXRlcygwKSk7Ci0gIEVYUEVDVF9FUSgyMiwgQWRkQnl0ZXMoa0J5dGVzUGVyRnJhbWUpKTsKLSAgRVhQRUNUX0VRKDQ1LCBBZGRCeXRlcyhrQnl0ZXNQZXJGcmFtZSkpOwotICBFWFBFQ1RfRVEoNjgsIEFkZEJ5dGVzKGtCeXRlc1BlckZyYW1lKSk7Ci0gIEVYUEVDVF9FUSg5MCwgQWRkQnl0ZXMoa0J5dGVzUGVyRnJhbWUpKTsKLSAgRVhQRUNUX0VRKDExMywgQWRkQnl0ZXMoa0J5dGVzUGVyRnJhbWUpKTsKLQotICAvLyBWZXJpZnkgdGhhdCBhZGRpbmcgYnl0ZXMgb25lIGZyYW1lIGF0IGEgdGltZSBtYXRjaGVzIHRoZSB0aW1lc3RhbXAgcmV0dXJuZWQKLSAgLy8gaWYgdGhlIHNhbWUgbnVtYmVyIG9mIGJ5dGVzIGFyZSBhZGRlZCBhbGwgYXQgb25jZS4KLSAgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcF8xICA9IGhlbHBlcl8uR2V0VGltZXN0YW1wKCk7Ci0gIGhlbHBlcl8uU2V0QmFzZVRpbWVzdGFtcChrTm9UaW1lc3RhbXAoKSk7Ci0gIEVYUEVDVF9UUlVFKGtOb1RpbWVzdGFtcCgpID09IGhlbHBlcl8uYmFzZV90aW1lc3RhbXAoKSk7Ci0gIGhlbHBlcl8uU2V0QmFzZVRpbWVzdGFtcChiYXNlOjpUaW1lRGVsdGEoKSk7Ci0gIEVYUEVDVF9FUSgwLCBoZWxwZXJfLkdldFRpbWVzdGFtcCgpLkluTWljcm9zZWNvbmRzKCkpOwotCi0gIGhlbHBlcl8uQWRkQnl0ZXMoNSAqIGtCeXRlc1BlckZyYW1lKTsKLSAgRVhQRUNUX0VRKDExMywgaGVscGVyXy5HZXRUaW1lc3RhbXAoKS5Jbk1pY3Jvc2Vjb25kcygpKTsKLSAgRVhQRUNUX1RSVUUodGltZXN0YW1wXzEgPT0gaGVscGVyXy5HZXRUaW1lc3RhbXAoKSk7Ci19Ci0KLQotVEVTVF9GKEF1ZGlvVGltZXN0YW1wSGVscGVyVGVzdCwgR2V0RHVyYXRpb24pIHsKLSAgaGVscGVyXy5TZXRCYXNlVGltZXN0YW1wKGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pY3Jvc2Vjb25kcygxMDApKTsKLQotICBpbnQgYnl0ZV9jb3VudCA9IDUgKiBrQnl0ZXNQZXJGcmFtZTsKLSAgaW50NjQgZXhwZWN0ZWRfZHVyYXRpb25zW10gPSB7IDExMywgMTEzLCAxMTQsIDExMywgMTEzLCAxMTQgfTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheXNpemUoZXhwZWN0ZWRfZHVyYXRpb25zKTsgKytpKSB7Ci0gICAgYmFzZTo6VGltZURlbHRhIGR1cmF0aW9uID0gaGVscGVyXy5HZXREdXJhdGlvbihieXRlX2NvdW50KTsKLSAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfZHVyYXRpb25zW2ldLCBkdXJhdGlvbi5Jbk1pY3Jvc2Vjb25kcygpKTsKLQotICAgIGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXBfMSA9IGhlbHBlcl8uR2V0VGltZXN0YW1wKCkgKyBkdXJhdGlvbjsKLSAgICBoZWxwZXJfLkFkZEJ5dGVzKGJ5dGVfY291bnQpOwotICAgIGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXBfMiA9IGhlbHBlcl8uR2V0VGltZXN0YW1wKCk7Ci0gICAgRVhQRUNUX1RSVUUodGltZXN0YW1wXzEgPT0gdGltZXN0YW1wXzIpOwotICB9Ci19Ci0KLVRFU1RfRihBdWRpb1RpbWVzdGFtcEhlbHBlclRlc3QsIEdldEJ5dGVzVG9UYXJnZXQpIHsKLSAgLy8gVmVyaWZ5IEdldEJ5dGVzVG9UYXJnZXQoKSByb3VuZGluZyBiZWhhdmlvci4KLSAgLy8gMSBmcmFtZSBAIDQ0MTAwIGlzIH4yMi42NzU3MyBtaWNyb3NlY29uZHMsCi0KLSAgLy8gVGVzdCB2YWx1ZXMgbGVzcyB0aGFuIGhhbGYgb2YgdGhlIGZyYW1lIGR1cmF0aW9uLgotICBUZXN0R2V0Qnl0ZXNUb1RhcmdldFJhbmdlKDAsIDAsIDExKTsKLQotICAvLyBUZXN0IHZhbHVlcyBiZXR3ZWVuIGhhbGYgdGhlIGZyYW1lIGR1cmF0aW9uICYgdGhlCi0gIC8vIGZ1bGwgZnJhbWUgZHVyYXRpb24uCi0gIFRlc3RHZXRCeXRlc1RvVGFyZ2V0UmFuZ2Uoa0J5dGVzUGVyRnJhbWUsIDEyLCAyMik7Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgdGhlIHNhbWUgbnVtYmVyIG9mIGJ5dGVzIGlzIHJldHVybmVkIHVwCi0gIC8vIHRvIHRoZSBuZXh0IGhhbGYgYSBmcmFtZS4KLSAgVGVzdEdldEJ5dGVzVG9UYXJnZXRSYW5nZShrQnl0ZXNQZXJGcmFtZSwgMjMsIDM0KTsKLQotICAvLyBWZXJpZnkgdGhlIG5leHQgMyByYW5nZXMuCi0gIFRlc3RHZXRCeXRlc1RvVGFyZ2V0UmFuZ2UoMiAqIGtCeXRlc1BlckZyYW1lLCAzNSwgNTYpOwotICBUZXN0R2V0Qnl0ZXNUb1RhcmdldFJhbmdlKDMgKiBrQnl0ZXNQZXJGcmFtZSwgNTcsIDc5KTsKLSAgVGVzdEdldEJ5dGVzVG9UYXJnZXRSYW5nZSg0ICoga0J5dGVzUGVyRnJhbWUsIDgwLCAxMDIpOwotICBUZXN0R2V0Qnl0ZXNUb1RhcmdldFJhbmdlKDUgKiBrQnl0ZXNQZXJGcmFtZSwgMTAzLCAxMjQpOwotCi0KLSAgLy8gQWRkIGJ5dGVzIHRvIHRoZSBoZWxwZXIgc28gbmVnYXRpdmUgYnl0ZSBjb3VudHMgY2FuCi0gIC8vIGJlIHRlc3RlZC4KLSAgaGVscGVyXy5BZGRCeXRlcyg1ICoga0J5dGVzUGVyRnJhbWUpOwotCi0gIC8vIE5vdGU6IFRoZSB0aW1lc3RhbXAgcmFuZ2VzIG11c3QgbWF0Y2ggdGhlIHBvc2l0aXZlIHZhbHVlcwotICAvLyB0ZXN0ZWQgYWJvdmUgdG8gdmVyaWZ5IHRoYXQgdGhlIGNvZGUgaXMgcm91bmRpbmcgcHJvcGVybHkuCi0gIFRlc3RHZXRCeXRlc1RvVGFyZ2V0UmFuZ2UoMCAqIGtCeXRlc1BlckZyYW1lLCAxMDMsIDEyNCk7Ci0gIFRlc3RHZXRCeXRlc1RvVGFyZ2V0UmFuZ2UoLTEgKiBrQnl0ZXNQZXJGcmFtZSwgODAsIDEwMik7Ci0gIFRlc3RHZXRCeXRlc1RvVGFyZ2V0UmFuZ2UoLTIgKiBrQnl0ZXNQZXJGcmFtZSwgNTcsIDc5KTsKLSAgVGVzdEdldEJ5dGVzVG9UYXJnZXRSYW5nZSgtMyAqIGtCeXRlc1BlckZyYW1lLCAzNSwgNTYpOwotICBUZXN0R2V0Qnl0ZXNUb1RhcmdldFJhbmdlKC00ICoga0J5dGVzUGVyRnJhbWUsIDEyLCAzNCk7Ci0gIFRlc3RHZXRCeXRlc1RvVGFyZ2V0UmFuZ2UoLTUgKiBrQnl0ZXNQZXJGcmFtZSwgMCwgMTEpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2JpbmRfdG9fbG9vcC5oIGIvc3JjL21lZGlhL2Jhc2UvYmluZF90b19sb29wLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MzhmYWQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvYmluZF90b19sb29wLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgY29tbWFuZDoKLS8vICAgICBwdW1wLnB5IGJpbmRfdG9fbG9vcC5oLnB1bXAKLS8vIERPIE5PVCBFRElUIEJZIEhBTkQhISEKLQotCi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0JBU0VfQklORF9UT19MT09QX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfQklORF9UT19MT09QX0hfCi0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2xvY2F0aW9uLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3BfcHJveHkuaCIKLQotLy8gVGhpcyBpcyBhIGhlbHBlciB1dGlsaXR5IGZvciBiYXNlOjpCaW5kKClpbmcgY2FsbGJhY2tzIG9uIHRvIHBhcnRpY3VsYXIKLS8vIE1lc3NhZ2VMb29wcy4gIEEgdHlwaWNhbCB1c2UgaXMgd2hlbiB8YXwgKG9mIGNsYXNzIHxBfCkgd2FudHMgdG8gaGFuZCBhCi0vLyBjYWxsYmFjayBzdWNoIGFzIGJhc2U6OkJpbmQoJkE6OkFNZXRob2QsIGEpIHRvIHxifCwgYnV0IG5lZWRzIHRvIGVuc3VyZSB0aGF0Ci0vLyB3aGVuIHxifCBleGVjdXRlcyB0aGUgY2FsbGJhY2ssIGl0IGRvZXMgc28gb24gYSBwYXJ0aWN1bGFyIE1lc3NhZ2VMb29wLgotLy8KLS8vIFR5cGljYWwgdXNhZ2U6IHJlcXVlc3QgdG8gYmUgY2FsbGVkIGJhY2sgb24gdGhlIGN1cnJlbnQgdGhyZWFkOgotLy8gb3RoZXItPlN0YXJ0QXN5bmNQcm9jZXNzQW5kQ2FsbE1lQmFjaygKLS8vICAgIG1lZGlhOjpCaW5kVG9Mb29wKE1lc3NhZ2VMb29wUHJveHk6OmN1cnJlbnQoKSwKLS8vICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoJk15Q2xhc3M6Ok15TWV0aG9kLCB0aGlzKSkpOwotLy8KLS8vIE5vdGUgdGhhdCBsaWtlIGJhc2U6OkJpbmQoKSwgQmluZFRvTG9vcCgpIGNhbid0IGJpbmQgbm9uLWNvbnN0YW50IHJlZmVyZW5jZXMsCi0vLyBhbmQgdGhhdCAqdW5saWtlKiBiYXNlOjpCaW5kKCksIEJpbmRUb0xvb3AoKSBtYWtlcyBjb3BpZXMgb2YgaXRzIGFyZ3VtZW50cywKLS8vIGFuZCB0aHVzIGNhbid0IGJlIHVzZWQgd2l0aCBhcnJheXMuCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIE1pbWljIGJhc2U6OmludGVybmFsOjpDYWxsYmFja0ZvcndhcmQsIHJlcGxhY2luZyBwLlBhc3MoKSB3aXRoCi0vLyBiYXNlOjpQYXNzZWQoJnApIHRvIGFjY291bnQgZm9yIHRoZSBleHRyYSBsYXllciBvZiBpbmRpcmVjdGlvbi4KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLVQmIFRyYW1wb2xpbmVGb3J3YXJkKFQmIHQpIHsgcmV0dXJuIHQ7IH0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1iYXNlOjppbnRlcm5hbDo6UGFzc2VkV3JhcHBlcjxzY29wZWRfcHRyPFQ+ID4gVHJhbXBvbGluZUZvcndhcmQoCi0gICAgc2NvcGVkX3B0cjxUPiYgcCkgeyByZXR1cm4gYmFzZTo6UGFzc2VkKCZwKTsgfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWJhc2U6OmludGVybmFsOjpQYXNzZWRXcmFwcGVyPHNjb3BlZF9hcnJheTxUPiA+IFRyYW1wb2xpbmVGb3J3YXJkKAotICAgIHNjb3BlZF9hcnJheTxUPiYgcCkgeyByZXR1cm4gYmFzZTo6UGFzc2VkKCZwKTsgfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUj4KLWJhc2U6OmludGVybmFsOjpQYXNzZWRXcmFwcGVyPHNjb3BlZF9wdHJfbWFsbG9jPFQsIFI+ID4gVHJhbXBvbGluZUZvcndhcmQoCi0gICAgc2NvcGVkX3B0cl9tYWxsb2M8VCwgUj4mIHApIHsgcmV0dXJuIGJhc2U6OlBhc3NlZCgmcCk7IH0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1iYXNlOjppbnRlcm5hbDo6UGFzc2VkV3JhcHBlcjxTY29wZWRWZWN0b3I8VD4gPiBUcmFtcG9saW5lRm9yd2FyZCgKLSAgICBTY29wZWRWZWN0b3I8VD4mIHApIHsgcmV0dXJuIGJhc2U6OlBhc3NlZCgmcCk7IH0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBUcmFtcG9saW5lSGVscGVyOwotCi10ZW1wbGF0ZSA8Pgotc3RydWN0IFRyYW1wb2xpbmVIZWxwZXI8dm9pZCgpPiB7Ci0gIHN0YXRpYyB2b2lkIFJ1bigKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4mIGxvb3AsCi0gICAgICBjb25zdCBiYXNlOjpDYWxsYmFjazx2b2lkKCk+JiBjYikgewotICAgIGxvb3AtPlBvc3RUYXNrKEZST01fSEVSRSwgYmFzZTo6QmluZChjYikpOwotICB9Ci19OwotCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBMT4KLXN0cnVjdCBUcmFtcG9saW5lSGVscGVyPHZvaWQoQTEpPiB7Ci0gIHN0YXRpYyB2b2lkIFJ1bigKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4mIGxvb3AsCi0gICAgICBjb25zdCBiYXNlOjpDYWxsYmFjazx2b2lkKEExKT4mIGNiLCBBMSBhMSkgewotICAgIGxvb3AtPlBvc3RUYXNrKEZST01fSEVSRSwgYmFzZTo6QmluZChjYiwgaW50ZXJuYWw6OlRyYW1wb2xpbmVGb3J3YXJkKGExKSkpOwotICB9Ci19OwotCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTI+Ci1zdHJ1Y3QgVHJhbXBvbGluZUhlbHBlcjx2b2lkKEExLCBBMik+IHsKLSAgc3RhdGljIHZvaWQgUnVuKAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbG9vcCwKLSAgICAgIGNvbnN0IGJhc2U6OkNhbGxiYWNrPHZvaWQoQTEsIEEyKT4mIGNiLCBBMSBhMSwgQTIgYTIpIHsKLSAgICBsb29wLT5Qb3N0VGFzayhGUk9NX0hFUkUsIGJhc2U6OkJpbmQoY2IsIGludGVybmFsOjpUcmFtcG9saW5lRm9yd2FyZChhMSksCi0gICAgICAgIGludGVybmFsOjpUcmFtcG9saW5lRm9yd2FyZChhMikpKTsKLSAgfQotfTsKLQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMz4KLXN0cnVjdCBUcmFtcG9saW5lSGVscGVyPHZvaWQoQTEsIEEyLCBBMyk+IHsKLSAgc3RhdGljIHZvaWQgUnVuKAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbG9vcCwKLSAgICAgIGNvbnN0IGJhc2U6OkNhbGxiYWNrPHZvaWQoQTEsIEEyLCBBMyk+JiBjYiwgQTEgYTEsIEEyIGEyLCBBMyBhMykgewotICAgIGxvb3AtPlBvc3RUYXNrKEZST01fSEVSRSwgYmFzZTo6QmluZChjYiwgaW50ZXJuYWw6OlRyYW1wb2xpbmVGb3J3YXJkKGExKSwKLSAgICAgICAgaW50ZXJuYWw6OlRyYW1wb2xpbmVGb3J3YXJkKGEyKSwgaW50ZXJuYWw6OlRyYW1wb2xpbmVGb3J3YXJkKGEzKSkpOwotICB9Ci19OwotCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBND4KLXN0cnVjdCBUcmFtcG9saW5lSGVscGVyPHZvaWQoQTEsIEEyLCBBMywgQTQpPiB7Ci0gIHN0YXRpYyB2b2lkIFJ1bigKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4mIGxvb3AsCi0gICAgICBjb25zdCBiYXNlOjpDYWxsYmFjazx2b2lkKEExLCBBMiwgQTMsIEE0KT4mIGNiLCBBMSBhMSwgQTIgYTIsIEEzIGEzLAotICAgICAgICAgIEE0IGE0KSB7Ci0gICAgbG9vcC0+UG9zdFRhc2soRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGNiLCBpbnRlcm5hbDo6VHJhbXBvbGluZUZvcndhcmQoYTEpLAotICAgICAgICBpbnRlcm5hbDo6VHJhbXBvbGluZUZvcndhcmQoYTIpLCBpbnRlcm5hbDo6VHJhbXBvbGluZUZvcndhcmQoYTMpLAotICAgICAgICBpbnRlcm5hbDo6VHJhbXBvbGluZUZvcndhcmQoYTQpKSk7Ci0gIH0KLX07Ci0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNT4KLXN0cnVjdCBUcmFtcG9saW5lSGVscGVyPHZvaWQoQTEsIEEyLCBBMywgQTQsIEE1KT4gewotICBzdGF0aWMgdm9pZCBSdW4oCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+JiBsb29wLAotICAgICAgY29uc3QgYmFzZTo6Q2FsbGJhY2s8dm9pZChBMSwgQTIsIEEzLCBBNCwgQTUpPiYgY2IsIEExIGExLCBBMiBhMiwgQTMgYTMsCi0gICAgICAgICAgQTQgYTQsIEE1IGE1KSB7Ci0gICAgbG9vcC0+UG9zdFRhc2soRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGNiLCBpbnRlcm5hbDo6VHJhbXBvbGluZUZvcndhcmQoYTEpLAotICAgICAgICBpbnRlcm5hbDo6VHJhbXBvbGluZUZvcndhcmQoYTIpLCBpbnRlcm5hbDo6VHJhbXBvbGluZUZvcndhcmQoYTMpLAotICAgICAgICBpbnRlcm5hbDo6VHJhbXBvbGluZUZvcndhcmQoYTQpLCBpbnRlcm5hbDo6VHJhbXBvbGluZUZvcndhcmQoYTUpKSk7Ci0gIH0KLX07Ci0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKLSAgICB0eXBlbmFtZSBBNj4KLXN0cnVjdCBUcmFtcG9saW5lSGVscGVyPHZvaWQoQTEsIEEyLCBBMywgQTQsIEE1LCBBNik+IHsKLSAgc3RhdGljIHZvaWQgUnVuKAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbG9vcCwKLSAgICAgIGNvbnN0IGJhc2U6OkNhbGxiYWNrPHZvaWQoQTEsIEEyLCBBMywgQTQsIEE1LCBBNik+JiBjYiwgQTEgYTEsIEEyIGEyLAotICAgICAgICAgIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2KSB7Ci0gICAgbG9vcC0+UG9zdFRhc2soRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGNiLCBpbnRlcm5hbDo6VHJhbXBvbGluZUZvcndhcmQoYTEpLAotICAgICAgICBpbnRlcm5hbDo6VHJhbXBvbGluZUZvcndhcmQoYTIpLCBpbnRlcm5hbDo6VHJhbXBvbGluZUZvcndhcmQoYTMpLAotICAgICAgICBpbnRlcm5hbDo6VHJhbXBvbGluZUZvcndhcmQoYTQpLCBpbnRlcm5hbDo6VHJhbXBvbGluZUZvcndhcmQoYTUpLAotICAgICAgICBpbnRlcm5hbDo6VHJhbXBvbGluZUZvcndhcmQoYTYpKSk7Ci0gIH0KLX07Ci0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKLSAgICB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTc+Ci1zdHJ1Y3QgVHJhbXBvbGluZUhlbHBlcjx2b2lkKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3KT4gewotICBzdGF0aWMgdm9pZCBSdW4oCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+JiBsb29wLAotICAgICAgY29uc3QgYmFzZTo6Q2FsbGJhY2s8dm9pZChBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNyk+JiBjYiwgQTEgYTEsIEEyIGEyLAotICAgICAgICAgIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2LCBBNyBhNykgewotICAgIGxvb3AtPlBvc3RUYXNrKEZST01fSEVSRSwgYmFzZTo6QmluZChjYiwgaW50ZXJuYWw6OlRyYW1wb2xpbmVGb3J3YXJkKGExKSwKLSAgICAgICAgaW50ZXJuYWw6OlRyYW1wb2xpbmVGb3J3YXJkKGEyKSwgaW50ZXJuYWw6OlRyYW1wb2xpbmVGb3J3YXJkKGEzKSwKLSAgICAgICAgaW50ZXJuYWw6OlRyYW1wb2xpbmVGb3J3YXJkKGE0KSwgaW50ZXJuYWw6OlRyYW1wb2xpbmVGb3J3YXJkKGE1KSwKLSAgICAgICAgaW50ZXJuYWw6OlRyYW1wb2xpbmVGb3J3YXJkKGE2KSwgaW50ZXJuYWw6OlRyYW1wb2xpbmVGb3J3YXJkKGE3KSkpOwotICB9Ci19OwotCi0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3RhdGljIGJhc2U6OkNhbGxiYWNrPFQ+IEJpbmRUb0xvb3AoCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbG9vcCwKLSAgICBjb25zdCBiYXNlOjpDYWxsYmFjazxUPiYgY2IpIHsKLSAgcmV0dXJuIGJhc2U6OkJpbmQoJmludGVybmFsOjpUcmFtcG9saW5lSGVscGVyPFQ+OjpSdW4sIGxvb3AsIGNiKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXN0YXRpYyBiYXNlOjpDYWxsYmFjazxUPiBCaW5kVG9DdXJyZW50TG9vcCgKLSAgICBjb25zdCBiYXNlOjpDYWxsYmFjazxUPiYgY2IpIHsKLSAgcmV0dXJuIEJpbmRUb0xvb3AoYmFzZTo6TWVzc2FnZUxvb3BQcm94eTo6Y3VycmVudCgpLCBjYik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0JBU0VfQklORF9UT19MT09QX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9iaW5kX3RvX2xvb3AuaC5wdW1wIGIvc3JjL21lZGlhL2Jhc2UvYmluZF90b19sb29wLmgucHVtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExYWUxMi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9iaW5kX3RvX2xvb3AuaC5wdW1wCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLSQkIFRoaXMgaXMgYSBwdW1wIGZpbGUgZm9yIGdlbmVyYXRpbmcgZmlsZSB0ZW1wbGF0ZXMuICBQdW1wIGlzIGEgcHl0aG9uCi0kJCBzY3JpcHQgdGhhdCBpcyBwYXJ0IG9mIHRoZSBHb29nbGUgVGVzdCBzdWl0ZSBvZiB1dGlsaXRpZXMuICBEZXNjcmlwdGlvbgotJCQgY2FuIGJlIGZvdW5kIGhlcmU6Ci0kJAotJCQgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvd2lraS9QdW1wTWFudWFsCi0kJAotCi0kJCBTZWUgY29tbWVudCBmb3IgTUFYX0FSSVRZIGluIGJhc2UvYmluZC5oLnB1bXAuCi0kdmFyIE1BWF9BUklUWSA9IDcKLQotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9CQVNFX0JJTkRfVE9fTE9PUF9IXwotI2RlZmluZSBNRURJQV9CQVNFX0JJTkRfVE9fTE9PUF9IXwotCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2NhdGlvbi5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wX3Byb3h5LmgiCi0KLS8vIFRoaXMgaXMgYSBoZWxwZXIgdXRpbGl0eSBmb3IgYmFzZTo6QmluZCgpaW5nIGNhbGxiYWNrcyBvbiB0byBwYXJ0aWN1bGFyCi0vLyBNZXNzYWdlTG9vcHMuICBBIHR5cGljYWwgdXNlIGlzIHdoZW4gfGF8IChvZiBjbGFzcyB8QXwpIHdhbnRzIHRvIGhhbmQgYQotLy8gY2FsbGJhY2sgc3VjaCBhcyBiYXNlOjpCaW5kKCZBOjpBTWV0aG9kLCBhKSB0byB8YnwsIGJ1dCBuZWVkcyB0byBlbnN1cmUgdGhhdAotLy8gd2hlbiB8YnwgZXhlY3V0ZXMgdGhlIGNhbGxiYWNrLCBpdCBkb2VzIHNvIG9uIGEgcGFydGljdWxhciBNZXNzYWdlTG9vcC4KLS8vCi0vLyBUeXBpY2FsIHVzYWdlOiByZXF1ZXN0IHRvIGJlIGNhbGxlZCBiYWNrIG9uIHRoZSBjdXJyZW50IHRocmVhZDoKLS8vIG90aGVyLT5TdGFydEFzeW5jUHJvY2Vzc0FuZENhbGxNZUJhY2soCi0vLyAgICBtZWRpYTo6QmluZFRvTG9vcChNZXNzYWdlTG9vcFByb3h5OjpjdXJyZW50KCksCi0vLyAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKCZNeUNsYXNzOjpNeU1ldGhvZCwgdGhpcykpKTsKLS8vCi0vLyBOb3RlIHRoYXQgbGlrZSBiYXNlOjpCaW5kKCksIEJpbmRUb0xvb3AoKSBjYW4ndCBiaW5kIG5vbi1jb25zdGFudCByZWZlcmVuY2VzLAotLy8gYW5kIHRoYXQgKnVubGlrZSogYmFzZTo6QmluZCgpLCBCaW5kVG9Mb29wKCkgbWFrZXMgY29waWVzIG9mIGl0cyBhcmd1bWVudHMsCi0vLyBhbmQgdGh1cyBjYW4ndCBiZSB1c2VkIHdpdGggYXJyYXlzLgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBNaW1pYyBiYXNlOjppbnRlcm5hbDo6Q2FsbGJhY2tGb3J3YXJkLCByZXBsYWNpbmcgcC5QYXNzKCkgd2l0aAotLy8gYmFzZTo6UGFzc2VkKCZwKSB0byBhY2NvdW50IGZvciB0aGUgZXh0cmEgbGF5ZXIgb2YgaW5kaXJlY3Rpb24uCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1UJiBUcmFtcG9saW5lRm9yd2FyZChUJiB0KSB7IHJldHVybiB0OyB9Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotYmFzZTo6aW50ZXJuYWw6OlBhc3NlZFdyYXBwZXI8c2NvcGVkX3B0cjxUPiA+IFRyYW1wb2xpbmVGb3J3YXJkKAotICAgIHNjb3BlZF9wdHI8VD4mIHApIHsgcmV0dXJuIGJhc2U6OlBhc3NlZCgmcCk7IH0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1iYXNlOjppbnRlcm5hbDo6UGFzc2VkV3JhcHBlcjxzY29wZWRfYXJyYXk8VD4gPiBUcmFtcG9saW5lRm9yd2FyZCgKLSAgICBzY29wZWRfYXJyYXk8VD4mIHApIHsgcmV0dXJuIGJhc2U6OlBhc3NlZCgmcCk7IH0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFI+Ci1iYXNlOjppbnRlcm5hbDo6UGFzc2VkV3JhcHBlcjxzY29wZWRfcHRyX21hbGxvYzxULCBSPiA+IFRyYW1wb2xpbmVGb3J3YXJkKAotICAgIHNjb3BlZF9wdHJfbWFsbG9jPFQsIFI+JiBwKSB7IHJldHVybiBiYXNlOjpQYXNzZWQoJnApOyB9Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotYmFzZTo6aW50ZXJuYWw6OlBhc3NlZFdyYXBwZXI8U2NvcGVkVmVjdG9yPFQ+ID4gVHJhbXBvbGluZUZvcndhcmQoCi0gICAgU2NvcGVkVmVjdG9yPFQ+JiBwKSB7IHJldHVybiBiYXNlOjpQYXNzZWQoJnApOyB9Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgVHJhbXBvbGluZUhlbHBlcjsKLQotJHJhbmdlIEFSSVRZIDAuLk1BWF9BUklUWQotJGZvciBBUklUWSBbWwotJHJhbmdlIEFSRyAxLi5BUklUWQotCi10ZW1wbGF0ZSA8JGZvciBBUkcgLCBbW3R5cGVuYW1lIEEkKEFSRyldXT4KLXN0cnVjdCBUcmFtcG9saW5lSGVscGVyPHZvaWQoJGZvciBBUkcgLCBbW0EkKEFSRyldXSk+IHsKLSAgc3RhdGljIHZvaWQgUnVuKAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbG9vcCwKLSAgICAgIGNvbnN0IGJhc2U6OkNhbGxiYWNrPHZvaWQoJGZvciBBUkcgLCBbW0EkKEFSRyldXSk+JiBjYgotJGlmIEFSSVRZICE9IDAgW1ssIF1dCi0kZm9yIEFSRyAsIFtbQSQoQVJHKSBhJChBUkcpXV0KLSkgewotICAgIGxvb3AtPlBvc3RUYXNrKEZST01fSEVSRSwgYmFzZTo6QmluZChjYgotJGlmIEFSSVRZICE9IDAgW1ssIF1dCi0kZm9yIEFSRyAsIFtbaW50ZXJuYWw6OlRyYW1wb2xpbmVGb3J3YXJkKGEkKEFSRykpXV0pKTsKLSAgfQotfTsKLQotCi1dXSAgJCQgZm9yIEFSSVRZCi0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3RhdGljIGJhc2U6OkNhbGxiYWNrPFQ+IEJpbmRUb0xvb3AoCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbG9vcCwKLSAgICBjb25zdCBiYXNlOjpDYWxsYmFjazxUPiYgY2IpIHsKLSAgcmV0dXJuIGJhc2U6OkJpbmQoJmludGVybmFsOjpUcmFtcG9saW5lSGVscGVyPFQ+OjpSdW4sIGxvb3AsIGNiKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXN0YXRpYyBiYXNlOjpDYWxsYmFjazxUPiBCaW5kVG9DdXJyZW50TG9vcCgKLSAgICBjb25zdCBiYXNlOjpDYWxsYmFjazxUPiYgY2IpIHsKLSAgcmV0dXJuIEJpbmRUb0xvb3AoYmFzZTo6TWVzc2FnZUxvb3BQcm94eTo6Y3VycmVudCgpLCBjYik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0JBU0VfQklORF9UT19MT09QX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9iaW5kX3RvX2xvb3BfdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvYmFzZS9iaW5kX3RvX2xvb3BfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNDE0N2QuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvYmluZF90b19sb29wX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL2JpbmRfdG9fbG9vcC5oIgotCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi93YWl0YWJsZV9ldmVudC5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi12b2lkIEJvdW5kQm9vbFNldChib29sKiB2YXIsIGJvb2wgdmFsKSB7Ci0gICp2YXIgPSB2YWw7Ci19Ci0KLXZvaWQgQm91bmRCb29sU2V0RnJvbVNjb3BlZFB0cihib29sKiB2YXIsIHNjb3BlZF9wdHI8Ym9vbD4gdmFsKSB7Ci0gICp2YXIgPSAqdmFsOwotfQotCi12b2lkIEJvdW5kQm9vbFNldEZyb21TY29wZWRQdHJNYWxsb2MoYm9vbCogdmFyLCBzY29wZWRfcHRyX21hbGxvYzxib29sPiB2YWwpIHsKLSAgKnZhciA9IHZhbDsKLX0KLQotdm9pZCBCb3VuZEJvb2xTZXRGcm9tU2NvcGVkQXJyYXkoYm9vbCogdmFyLCBzY29wZWRfYXJyYXk8Ym9vbD4gdmFsKSB7Ci0gICp2YXIgPSB2YWxbMF07Ci19Ci0KLXZvaWQgQm91bmRCb29sU2V0RnJvbUNvbnN0UmVmKGJvb2wqIHZhciwgY29uc3QgYm9vbCYgdmFsKSB7Ci0gICp2YXIgPSB2YWw7Ci19Ci0KLXZvaWQgQm91bmRJbnRlZ2Vyc1NldChpbnQqIGFfdmFyLCBpbnQqIGJfdmFyLCBpbnQgYV92YWwsIGludCBiX3ZhbCkgewotICAqYV92YXIgPSBhX3ZhbDsKLSAgKmJfdmFyID0gYl92YWw7Ci19Ci0KLS8vIFZhcmlvdXMgdGVzdHMgdGhhdCBjaGVjayB0aGF0IHRoZSBib3VuZCBmdW5jdGlvbiBpcyBvbmx5IGFjdHVhbGx5IGV4ZWN1dGVkCi0vLyBvbiB0aGUgbWVzc2FnZSBsb29wLCBub3QgZHVyaW5nIHRoZSBvcmlnaW5hbCBSdW4uCi1jbGFzcyBCaW5kVG9Mb29wVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgQmluZFRvTG9vcFRlc3QoKSA6IHByb3h5Xyhsb29wXy5tZXNzYWdlX2xvb3BfcHJveHkoKSkge30KLQotIHByb3RlY3RlZDoKLSAgTWVzc2FnZUxvb3AgbG9vcF87Ci0gIHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4gcHJveHlfOwotfTsKLQotVEVTVF9GKEJpbmRUb0xvb3BUZXN0LCBDbG9zdXJlKSB7Ci0gIC8vIFRlc3QgdGhlIGNsb3N1cmUgaXMgcnVuIGluc2lkZSB0aGUgbG9vcCwgbm90IG91dHNpZGUgaXQuCi0gIGJhc2U6OldhaXRhYmxlRXZlbnQgd2FpdGVyKGZhbHNlLCBmYWxzZSk7Ci0gIGJhc2U6OkNsb3N1cmUgY2IgPSBCaW5kVG9Mb29wKHByb3h5XywgYmFzZTo6QmluZCgKLSAgICAgICZiYXNlOjpXYWl0YWJsZUV2ZW50OjpTaWduYWwsIGJhc2U6OlVucmV0YWluZWQoJndhaXRlcikpKTsKLSAgY2IuUnVuKCk7Ci0gIEVYUEVDVF9GQUxTRSh3YWl0ZXIuSXNTaWduYWxlZCgpKTsKLSAgbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci0gIEVYUEVDVF9UUlVFKHdhaXRlci5Jc1NpZ25hbGVkKCkpOwotfQotCi1URVNUX0YoQmluZFRvTG9vcFRlc3QsIEJvb2wpIHsKLSAgYm9vbCBib29sX3ZhciA9IGZhbHNlOwotICBiYXNlOjpDYWxsYmFjazx2b2lkKGJvb2wpPiBjYiA9IEJpbmRUb0xvb3AocHJveHlfLCBiYXNlOjpCaW5kKAotICAgICAgJkJvdW5kQm9vbFNldCwgJmJvb2xfdmFyKSk7Ci0gIGNiLlJ1bih0cnVlKTsKLSAgRVhQRUNUX0ZBTFNFKGJvb2xfdmFyKTsKLSAgbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci0gIEVYUEVDVF9UUlVFKGJvb2xfdmFyKTsKLX0KLQotVEVTVF9GKEJpbmRUb0xvb3BUZXN0LCBCb3VuZFNjb3BlZFB0ckJvb2wpIHsKLSAgYm9vbCBib29sX3ZhbCA9IGZhbHNlOwotICBzY29wZWRfcHRyPGJvb2w+IHNjb3BlZF9wdHJfYm9vbChuZXcgYm9vbCh0cnVlKSk7Ci0gIGJhc2U6OkNsb3N1cmUgY2IgPSBCaW5kVG9Mb29wKHByb3h5XywgYmFzZTo6QmluZCgKLSAgICAgICZCb3VuZEJvb2xTZXRGcm9tU2NvcGVkUHRyLCAmYm9vbF92YWwsIGJhc2U6OlBhc3NlZCgmc2NvcGVkX3B0cl9ib29sKSkpOwotICBjYi5SdW4oKTsKLSAgRVhQRUNUX0ZBTFNFKGJvb2xfdmFsKTsKLSAgbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci0gIEVYUEVDVF9UUlVFKGJvb2xfdmFsKTsKLX0KLQotVEVTVF9GKEJpbmRUb0xvb3BUZXN0LCBQYXNzZWRTY29wZWRQdHJCb29sKSB7Ci0gIGJvb2wgYm9vbF92YWwgPSBmYWxzZTsKLSAgc2NvcGVkX3B0cjxib29sPiBzY29wZWRfcHRyX2Jvb2wobmV3IGJvb2wodHJ1ZSkpOwotICBiYXNlOjpDYWxsYmFjazx2b2lkKHNjb3BlZF9wdHI8Ym9vbD4pPiBjYiA9IEJpbmRUb0xvb3AocHJveHlfLCBiYXNlOjpCaW5kKAotICAgICAgJkJvdW5kQm9vbFNldEZyb21TY29wZWRQdHIsICZib29sX3ZhbCkpOwotICBjYi5SdW4oc2NvcGVkX3B0cl9ib29sLlBhc3MoKSk7Ci0gIEVYUEVDVF9GQUxTRShib29sX3ZhbCk7Ci0gIGxvb3BfLlJ1blVudGlsSWRsZSgpOwotICBFWFBFQ1RfVFJVRShib29sX3ZhbCk7Ci19Ci0KLVRFU1RfRihCaW5kVG9Mb29wVGVzdCwgQm91bmRTY29wZWRBcnJheUJvb2wpIHsKLSAgYm9vbCBib29sX3ZhbCA9IGZhbHNlOwotICBzY29wZWRfYXJyYXk8Ym9vbD4gc2NvcGVkX2FycmF5X2Jvb2wobmV3IGJvb2xbMV0pOwotICBzY29wZWRfYXJyYXlfYm9vbFswXSA9IHRydWU7Ci0gIGJhc2U6OkNsb3N1cmUgY2IgPSBCaW5kVG9Mb29wKHByb3h5XywgYmFzZTo6QmluZCgKLSAgICAgICZCb3VuZEJvb2xTZXRGcm9tU2NvcGVkQXJyYXksICZib29sX3ZhbCwKLSAgICAgIGJhc2U6OlBhc3NlZCgmc2NvcGVkX2FycmF5X2Jvb2wpKSk7Ci0gIGNiLlJ1bigpOwotICBFWFBFQ1RfRkFMU0UoYm9vbF92YWwpOwotICBsb29wXy5SdW5VbnRpbElkbGUoKTsKLSAgRVhQRUNUX1RSVUUoYm9vbF92YWwpOwotfQotCi1URVNUX0YoQmluZFRvTG9vcFRlc3QsIFBhc3NlZFNjb3BlZEFycmF5Qm9vbCkgewotICBib29sIGJvb2xfdmFsID0gZmFsc2U7Ci0gIHNjb3BlZF9hcnJheTxib29sPiBzY29wZWRfYXJyYXlfYm9vbChuZXcgYm9vbFsxXSk7Ci0gIHNjb3BlZF9hcnJheV9ib29sWzBdID0gdHJ1ZTsKLSAgYmFzZTo6Q2FsbGJhY2s8dm9pZChzY29wZWRfYXJyYXk8Ym9vbD4pPiBjYiA9IEJpbmRUb0xvb3AocHJveHlfLCBiYXNlOjpCaW5kKAotICAgICAgJkJvdW5kQm9vbFNldEZyb21TY29wZWRBcnJheSwgJmJvb2xfdmFsKSk7Ci0gIGNiLlJ1bihzY29wZWRfYXJyYXlfYm9vbC5QYXNzKCkpOwotICBFWFBFQ1RfRkFMU0UoYm9vbF92YWwpOwotICBsb29wXy5SdW5VbnRpbElkbGUoKTsKLSAgRVhQRUNUX1RSVUUoYm9vbF92YWwpOwotfQotCi1URVNUX0YoQmluZFRvTG9vcFRlc3QsIEJvdW5kU2NvcGVkUHRyTWFsbG9jQm9vbCkgewotICBib29sIGJvb2xfdmFsID0gZmFsc2U7Ci0gIHNjb3BlZF9wdHJfbWFsbG9jPGJvb2w+IHNjb3BlZF9wdHJfbWFsbG9jX2Jvb2woCi0gICAgICBzdGF0aWNfY2FzdDxib29sKj4obWFsbG9jKHNpemVvZihib29sKSkpKTsKLSAgKnNjb3BlZF9wdHJfbWFsbG9jX2Jvb2wgPSB0cnVlOwotICBiYXNlOjpDbG9zdXJlIGNiID0gQmluZFRvTG9vcChwcm94eV8sIGJhc2U6OkJpbmQoCi0gICAgICAmQm91bmRCb29sU2V0RnJvbVNjb3BlZFB0ck1hbGxvYywgJmJvb2xfdmFsLAotICAgICAgYmFzZTo6UGFzc2VkKCZzY29wZWRfcHRyX21hbGxvY19ib29sKSkpOwotICBjYi5SdW4oKTsKLSAgRVhQRUNUX0ZBTFNFKGJvb2xfdmFsKTsKLSAgbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci0gIEVYUEVDVF9UUlVFKGJvb2xfdmFsKTsKLX0KLQotVEVTVF9GKEJpbmRUb0xvb3BUZXN0LCBQYXNzZWRTY29wZWRQdHJNYWxsb2NCb29sKSB7Ci0gIGJvb2wgYm9vbF92YWwgPSBmYWxzZTsKLSAgc2NvcGVkX3B0cl9tYWxsb2M8Ym9vbD4gc2NvcGVkX3B0cl9tYWxsb2NfYm9vbCgKLSAgICAgIHN0YXRpY19jYXN0PGJvb2wqPihtYWxsb2Moc2l6ZW9mKGJvb2wpKSkpOwotICAqc2NvcGVkX3B0cl9tYWxsb2NfYm9vbCA9IHRydWU7Ci0gIGJhc2U6OkNhbGxiYWNrPHZvaWQoc2NvcGVkX3B0cl9tYWxsb2M8Ym9vbD4pPiBjYiA9IEJpbmRUb0xvb3AoCi0gICAgICBwcm94eV8sIGJhc2U6OkJpbmQoJkJvdW5kQm9vbFNldEZyb21TY29wZWRQdHJNYWxsb2MsICZib29sX3ZhbCkpOwotICBjYi5SdW4oc2NvcGVkX3B0cl9tYWxsb2NfYm9vbC5QYXNzKCkpOwotICBFWFBFQ1RfRkFMU0UoYm9vbF92YWwpOwotICBsb29wXy5SdW5VbnRpbElkbGUoKTsKLSAgRVhQRUNUX1RSVUUoYm9vbF92YWwpOwotfQotCi1URVNUX0YoQmluZFRvTG9vcFRlc3QsIEJvb2xDb25zdFJlZikgewotICBib29sIGJvb2xfdmFyID0gZmFsc2U7Ci0gIGJvb2wgdHJ1ZV92YXIgPSB0cnVlOwotICBjb25zdCBib29sJiB0cnVlX3JlZiA9IHRydWVfdmFyOwotICBiYXNlOjpDbG9zdXJlIGNiID0gQmluZFRvTG9vcChwcm94eV8sIGJhc2U6OkJpbmQoCi0gICAgICAmQm91bmRCb29sU2V0RnJvbUNvbnN0UmVmLCAmYm9vbF92YXIsIHRydWVfcmVmKSk7Ci0gIGNiLlJ1bigpOwotICBFWFBFQ1RfRkFMU0UoYm9vbF92YXIpOwotICBsb29wXy5SdW5VbnRpbElkbGUoKTsKLSAgRVhQRUNUX1RSVUUoYm9vbF92YXIpOwotfQotCi1URVNUX0YoQmluZFRvTG9vcFRlc3QsIEludGVnZXJzKSB7Ci0gIGludCBhID0gMDsKLSAgaW50IGIgPSAwOwotICBiYXNlOjpDYWxsYmFjazx2b2lkKGludCwgaW50KT4gY2IgPSBCaW5kVG9Mb29wKHByb3h5XywgYmFzZTo6QmluZCgKLSAgICAgICZCb3VuZEludGVnZXJzU2V0LCAmYSwgJmIpKTsKLSAgY2IuUnVuKDEsIC0xKTsKLSAgRVhQRUNUX0VRKGEsIDApOwotICBFWFBFQ1RfRVEoYiwgMCk7Ci0gIGxvb3BfLlJ1blVudGlsSWRsZSgpOwotICBFWFBFQ1RfRVEoYSwgMSk7Ci0gIEVYUEVDVF9FUShiLCAtMSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvYml0X3JlYWRlci5jYyBiL3NyYy9tZWRpYS9iYXNlL2JpdF9yZWFkZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZGI4ZDQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvYml0X3JlYWRlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL2JpdF9yZWFkZXIuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotQml0UmVhZGVyOjpCaXRSZWFkZXIoY29uc3QgdWludDgqIGRhdGEsIG9mZl90IHNpemUpCi0gICAgOiBkYXRhXyhkYXRhKSwgYnl0ZXNfbGVmdF8oc2l6ZSksIG51bV9yZW1haW5pbmdfYml0c19pbl9jdXJyX2J5dGVfKDApIHsKLSAgRENIRUNLKGRhdGFfICE9IE5VTEwgJiYgYnl0ZXNfbGVmdF8gPiAwKTsKLQotICBVcGRhdGVDdXJyQnl0ZSgpOwotfQotCi1CaXRSZWFkZXI6On5CaXRSZWFkZXIoKSB7fQotCi1ib29sIEJpdFJlYWRlcjo6UmVhZEJpdHNJbnRlcm5hbChpbnQgbnVtX2JpdHMsIHVpbnQ2NCogb3V0KSB7Ci0gIERDSEVDS19MRShudW1fYml0cywgNjQpOwotCi0gICpvdXQgPSAwOwotCi0gIHdoaWxlIChudW1fcmVtYWluaW5nX2JpdHNfaW5fY3Vycl9ieXRlXyAhPSAwICYmIG51bV9iaXRzICE9IDApIHsKLSAgICBpbnQgYml0c190b190YWtlID0gc3RkOjptaW4obnVtX3JlbWFpbmluZ19iaXRzX2luX2N1cnJfYnl0ZV8sIG51bV9iaXRzKTsKLQotICAgICpvdXQgPDw9IGJpdHNfdG9fdGFrZTsKLSAgICAqb3V0ICs9IGN1cnJfYnl0ZV8gPj4gKG51bV9yZW1haW5pbmdfYml0c19pbl9jdXJyX2J5dGVfIC0gYml0c190b190YWtlKTsKLSAgICBudW1fYml0cyAtPSBiaXRzX3RvX3Rha2U7Ci0gICAgbnVtX3JlbWFpbmluZ19iaXRzX2luX2N1cnJfYnl0ZV8gLT0gYml0c190b190YWtlOwotICAgIGN1cnJfYnl0ZV8gJj0gKDEgPDwgbnVtX3JlbWFpbmluZ19iaXRzX2luX2N1cnJfYnl0ZV8pIC0gMTsKLQotICAgIGlmIChudW1fcmVtYWluaW5nX2JpdHNfaW5fY3Vycl9ieXRlXyA9PSAwKQotICAgICAgVXBkYXRlQ3VyckJ5dGUoKTsKLSAgfQotCi0gIHJldHVybiBudW1fYml0cyA9PSAwOwotfQotCi12b2lkIEJpdFJlYWRlcjo6VXBkYXRlQ3VyckJ5dGUoKSB7Ci0gIERDSEVDS19FUShudW1fcmVtYWluaW5nX2JpdHNfaW5fY3Vycl9ieXRlXywgMCk7Ci0KLSAgaWYgKGJ5dGVzX2xlZnRfID09IDApCi0gICAgcmV0dXJuOwotCi0gIC8vIExvYWQgYSBuZXcgYnl0ZSBhbmQgYWR2YW5jZSBwb2ludGVycy4KLSAgY3Vycl9ieXRlXyA9ICpkYXRhXzsKLSAgKytkYXRhXzsKLSAgLS1ieXRlc19sZWZ0XzsKLSAgbnVtX3JlbWFpbmluZ19iaXRzX2luX2N1cnJfYnl0ZV8gPSA4OwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2JpdF9yZWFkZXIuaCBiL3NyYy9tZWRpYS9iYXNlL2JpdF9yZWFkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJlY2Y5MS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9iaXRfcmVhZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0JBU0VfQklUX1JFQURFUl9IXwotI2RlZmluZSBNRURJQV9CQVNFX0JJVF9SRUFERVJfSF8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gQSBjbGFzcyB0byByZWFkIGJpdCBzdHJlYW1zLgotY2xhc3MgTUVESUFfRVhQT1JUIEJpdFJlYWRlciB7Ci0gcHVibGljOgotICAvLyBJbml0aWFsaXplIHRoZSByZWFkZXIgdG8gc3RhcnQgcmVhZGluZyBhdCB8ZGF0YXwsIHxzaXplfCBiZWluZyBzaXplCi0gIC8vIG9mIHxkYXRhfCBpbiBieXRlcy4KLSAgQml0UmVhZGVyKGNvbnN0IHVpbnQ4KiBkYXRhLCBvZmZfdCBzaXplKTsKLSAgfkJpdFJlYWRlcigpOwotCi0gIC8vIFJlYWQgfG51bV9iaXRzfCBuZXh0IGJpdHMgZnJvbSBzdHJlYW0gYW5kIHJldHVybiBpbiB8Km91dHwsIGZpcnN0IGJpdAotICAvLyBmcm9tIHRoZSBzdHJlYW0gc3RhcnRpbmcgYXQgfG51bV9iaXRzfCBwb3NpdGlvbiBpbiB8Km91dHwuCi0gIC8vIHxudW1fYml0c3wgY2Fubm90IGJlIGxhcmdlciB0aGFuIHRoZSBiaXRzIHRoZSB0eXBlIGNhbiBob2xkLgotICAvLyBSZXR1cm4gZmFsc2UgaWYgdGhlIGdpdmVuIG51bWJlciBvZiBiaXRzIGNhbm5vdCBiZSByZWFkIChub3QgZW5vdWdoCi0gIC8vIGJpdHMgaW4gdGhlIHN0cmVhbSksIHRydWUgb3RoZXJ3aXNlLiBXaGVuIHJldHVybiBmYWxzZSwgdGhlIHN0cmVhbSB3aWxsCi0gIC8vIGVudGVyIGEgc3RhdGUgd2hlcmUgZnVydGhlciBSZWFkQml0cy9Ta2lwQml0cyBvcGVyYXRpb25zIHdpbGwgYWx3YXlzCi0gIC8vIHJldHVybiBmYWxzZSB1bmxlc3MgfG51bV9iaXRzfCBpcyAwLiBUaGUgdHlwZSB8VHwgaGFzIHRvIGJlIGEgcHJpbWl0aXZlCi0gIC8vIGludGVnZXIgdHlwZS4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gYm9vbCBSZWFkQml0cyhpbnQgbnVtX2JpdHMsIFQgKm91dCkgewotICAgIERDSEVDS19MRShudW1fYml0cywgc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoVCkgKiA4KSk7Ci0gICAgdWludDY0IHRlbXA7Ci0gICAgYm9vbCByZXQgPSBSZWFkQml0c0ludGVybmFsKG51bV9iaXRzLCAmdGVtcCk7Ci0gICAgKm91dCA9IHN0YXRpY19jYXN0PFQ+KHRlbXApOwotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIEhlbHAgZnVuY3Rpb24gdXNlZCBieSBSZWFkQml0cyB0byBhdm9pZCBpbmxpbmluZyB0aGUgYml0IHJlYWRpbmcgbG9naWMuCi0gIGJvb2wgUmVhZEJpdHNJbnRlcm5hbChpbnQgbnVtX2JpdHMsIHVpbnQ2NCogb3V0KTsKLQotICAvLyBBZHZhbmNlIHRvIHRoZSBuZXh0IGJ5dGUsIGxvYWRpbmcgaXQgaW50byBjdXJyX2J5dGVfLgotICAvLyBJZiB0aGUgbnVtX3JlbWFpbmluZ19iaXRzX2luX2N1cnJfYnl0ZV8gaXMgMCBhZnRlciB0aGlzIGZ1bmN0aW9uIHJldHVybnMsCi0gIC8vIHRoZSBzdHJlYW0gaGFzIHJlYWNoZWQgdGhlIGVuZC4KLSAgdm9pZCBVcGRhdGVDdXJyQnl0ZSgpOwotCi0gIC8vIFBvaW50ZXIgdG8gdGhlIG5leHQgdW5yZWFkIChub3QgaW4gY3Vycl9ieXRlXykgYnl0ZSBpbiB0aGUgc3RyZWFtLgotICBjb25zdCB1aW50OCogZGF0YV87Ci0KLSAgLy8gQnl0ZXMgbGVmdCBpbiB0aGUgc3RyZWFtICh3aXRob3V0IHRoZSBjdXJyX2J5dGVfKS4KLSAgb2ZmX3QgYnl0ZXNfbGVmdF87Ci0KLSAgLy8gQ29udGVudHMgb2YgdGhlIGN1cnJlbnQgYnl0ZTsgZmlyc3QgdW5yZWFkIGJpdCBzdGFydGluZyBhdCBwb3NpdGlvbgotICAvLyA4IC0gbnVtX3JlbWFpbmluZ19iaXRzX2luX2N1cnJfYnl0ZV8gZnJvbSBNU0IuCi0gIHVpbnQ4IGN1cnJfYnl0ZV87Ci0KLSAgLy8gTnVtYmVyIG9mIGJpdHMgcmVtYWluaW5nIGluIGN1cnJfYnl0ZV8KLSAgaW50IG51bV9yZW1haW5pbmdfYml0c19pbl9jdXJyX2J5dGVfOwotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEJpdFJlYWRlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX0JJVF9SRUFERVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2JpdF9yZWFkZXJfdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvYmFzZS9iaXRfcmVhZGVyX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGU4YzVlLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL2JpdF9yZWFkZXJfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9iaXRfcmVhZGVyLmgiCi0KLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotVEVTVChCaXRSZWFkZXJUZXN0LCBOb3JtYWxPcGVyYXRpb25UZXN0KSB7Ci0gIHVpbnQ4IHZhbHVlODsKLSAgdWludDY0IHZhbHVlNjQ7Ci0gIC8vIDAxMDEgMDEwMSAxMDAxIDEwMDEgcmVwZWF0cyA0IHRpbWVzCi0gIHVpbnQ4IGJ1ZmZlcltdID0gezB4NTUsIDB4OTksIDB4NTUsIDB4OTksIDB4NTUsIDB4OTksIDB4NTUsIDB4OTl9OwotICBCaXRSZWFkZXIgcmVhZGVyMShidWZmZXIsIDYpOyAgLy8gSW5pdGlhbGl6ZSB3aXRoIDYgYnl0ZXMgb25seQotCi0gIEVYUEVDVF9UUlVFKHJlYWRlcjEuUmVhZEJpdHMoMSwgJnZhbHVlOCkpOwotICBFWFBFQ1RfRVEodmFsdWU4LCAwKTsKLSAgRVhQRUNUX1RSVUUocmVhZGVyMS5SZWFkQml0cyg4LCAmdmFsdWU4KSk7Ci0gIEVYUEVDVF9FUSh2YWx1ZTgsIDB4YWIpOyAgLy8gMTAxMCAxMDExCi0gIEVYUEVDVF9UUlVFKHJlYWRlcjEuUmVhZEJpdHMoNywgJnZhbHVlNjQpKTsKLSAgRVhQRUNUX1RSVUUocmVhZGVyMS5SZWFkQml0cygzMiwgJnZhbHVlNjQpKTsKLSAgRVhQRUNUX0VRKHZhbHVlNjQsIDB4NTU5OTU1OTl1KTsKLSAgRVhQRUNUX0ZBTFNFKHJlYWRlcjEuUmVhZEJpdHMoMSwgJnZhbHVlOCkpOwotICB2YWx1ZTggPSAweGZmOwotICBFWFBFQ1RfVFJVRShyZWFkZXIxLlJlYWRCaXRzKDAsICZ2YWx1ZTgpKTsKLSAgRVhQRUNUX0VRKHZhbHVlOCwgMCk7Ci0KLSAgQml0UmVhZGVyIHJlYWRlcjIoYnVmZmVyLCA4KTsKLSAgRVhQRUNUX1RSVUUocmVhZGVyMi5SZWFkQml0cyg2NCwgJnZhbHVlNjQpKTsKLSAgRVhQRUNUX0VRKHZhbHVlNjQsIDB4NTU5OTU1OTk1NTk5NTU5OXVsbCk7Ci0gIEVYUEVDVF9GQUxTRShyZWFkZXIyLlJlYWRCaXRzKDEsICZ2YWx1ZTgpKTsKLSAgRVhQRUNUX1RSVUUocmVhZGVyMi5SZWFkQml0cygwLCAmdmFsdWU4KSk7Ci19Ci0KLVRFU1QoQml0UmVhZGVyVGVzdCwgUmVhZEJleW9uZEVuZFRlc3QpIHsKLSAgdWludDggdmFsdWU4OwotICB1aW50OCBidWZmZXJbXSA9IHsweDEyfTsKLSAgQml0UmVhZGVyIHJlYWRlcjEoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7Ci0KLSAgRVhQRUNUX1RSVUUocmVhZGVyMS5SZWFkQml0cyg0LCAmdmFsdWU4KSk7Ci0gIEVYUEVDVF9GQUxTRShyZWFkZXIxLlJlYWRCaXRzKDUsICZ2YWx1ZTgpKTsKLSAgRVhQRUNUX0ZBTFNFKHJlYWRlcjEuUmVhZEJpdHMoMSwgJnZhbHVlOCkpOwotICBFWFBFQ1RfVFJVRShyZWFkZXIxLlJlYWRCaXRzKDAsICZ2YWx1ZTgpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9iaXRzdHJlYW1fYnVmZmVyLmggYi9zcmMvbWVkaWEvYmFzZS9iaXRzdHJlYW1fYnVmZmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZmYzZDcuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvYml0c3RyZWFtX2J1ZmZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDExIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9CQVNFX0JJVFNUUkVBTV9CVUZGRVJfSF8KLSNkZWZpbmUgTUVESUFfQkFTRV9CSVRTVFJFQU1fQlVGRkVSX0hfCi0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJiYXNlL3NoYXJlZF9tZW1vcnkuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gQ2xhc3MgZm9yIHBhc3NpbmcgYml0c3RyZWFtIGJ1ZmZlcnMgYXJvdW5kLiAgRG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YgdGhlCi0vLyBkYXRhLiAgVGhpcyBpcyB0aGUgbWVkaWEtbmFtZXNwYWNlIGVxdWl2YWxlbnQgb2YgUFBfVmlkZW9CaXRzdHJlYW1CdWZmZXJfRGV2LgotY2xhc3MgQml0c3RyZWFtQnVmZmVyIHsKLSBwdWJsaWM6Ci0gIEJpdHN0cmVhbUJ1ZmZlcihpbnQzMiBpZCwgYmFzZTo6U2hhcmVkTWVtb3J5SGFuZGxlIGhhbmRsZSwgc2l6ZV90IHNpemUpCi0gICAgICA6IGlkXyhpZCksCi0gICAgICAgIGhhbmRsZV8oaGFuZGxlKSwKLSAgICAgICAgc2l6ZV8oc2l6ZSkgewotICB9Ci0KLSAgaW50MzIgaWQoKSBjb25zdCB7IHJldHVybiBpZF87IH0KLSAgYmFzZTo6U2hhcmVkTWVtb3J5SGFuZGxlIGhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIGhhbmRsZV87IH0KLSAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBzaXplXzsgfQotCi0gcHJpdmF0ZToKLSAgaW50MzIgaWRfOwotICBiYXNlOjpTaGFyZWRNZW1vcnlIYW5kbGUgaGFuZGxlXzsKLSAgc2l6ZV90IHNpemVfOwotCi0gIC8vIEFsbG93IGNvbXBpbGVyLWdlbmVyYXRlZCBjb3B5ICYgYXNzaWduIGNvbnN0cnVjdG9ycy4KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0JBU0VfQklUU1RSRUFNX0JVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvYnVmZmVycy5jYyBiL3NyYy9tZWRpYS9iYXNlL2J1ZmZlcnMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzODAyYzYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvYnVmZmVycy5jYworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL2J1ZmZlcnMuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotQnVmZmVyOjpCdWZmZXIoYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCwgYmFzZTo6VGltZURlbHRhIGR1cmF0aW9uKQotICAgIDogdGltZXN0YW1wXyh0aW1lc3RhbXApLAotICAgICAgZHVyYXRpb25fKGR1cmF0aW9uKSB7Ci19Ci0KLUJ1ZmZlcjo6fkJ1ZmZlcigpIHt9Ci0KLWJvb2wgQnVmZmVyOjpJc0VuZE9mU3RyZWFtKCkgY29uc3QgewotICByZXR1cm4gR2V0RGF0YSgpID09IE5VTEw7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvYnVmZmVycy5oIGIvc3JjL21lZGlhL2Jhc2UvYnVmZmVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTRmNGRiLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL2J1ZmZlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIERlZmluZXMgYSBiYXNlIGNsYXNzIGZvciByZXByZXNlbnRpbmcgdGltZXN0YW1wZWQgbWVkaWEgZGF0YS4gRXZlcnkgYnVmZmVyCi0vLyBjb250YWlucyBhIHRpbWVzdGFtcCBpbiBtaWNyb3NlY29uZHMgZGVzY3JpYmluZyB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YKLS8vIHRoZSBidWZmZXIgd2l0aGluIHRoZSBtZWRpYSBzdHJlYW0sIGFuZCB0aGUgZHVyYXRpb24gaW4gbWljcm9zZWNvbmRzIGZvcgotLy8gdGhlIGxlbmd0aCBvZiB0aW1lIHRoZSBidWZmZXIgd2lsbCBiZSByZW5kZXJlZC4KLS8vCi0vLyBUaW1lc3RhbXBzIGFyZSBkZXJpdmVkIGRpcmVjdGx5IGZyb20gdGhlIGVuY29kZWQgbWVkaWEgZmlsZSBhbmQgYXJlIGNvbW1vbmx5Ci0vLyBrbm93biBhcyB0aGUgcHJlc2VudGF0aW9uIHRpbWVzdGFtcCAoUFRTKS4gIER1cmF0aW9ucyBhcmUgYSBiZXN0LWd1ZXNzIGFuZAotLy8gYXJlIHVzdWFsbHkgZGVyaXZlZCBmcm9tIHRoZSBzYW1wbGUvZnJhbWUgcmF0ZSBvZiB0aGUgbWVkaWEgZmlsZS4KLS8vCi0vLyBEdWUgdG8gZW5jb2RpbmcgYW5kIHRyYW5zbWlzc2lvbiBlcnJvcnMsIGl0IGlzIG5vdCBndWFyYW50ZWVkIHRoYXQgdGltZXN0YW1wcwotLy8gYXJyaXZlIGluIGEgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIG9yZGVyIG5vciB0aGF0IHRoZSBuZXh0IHRpbWVzdGFtcCB3aWxsCi0vLyBiZSBlcXVhbCB0byB0aGUgcHJldmlvdXMgdGltZXN0YW1wIHBsdXMgdGhlIGR1cmF0aW9uLgotLy8KLS8vIEluIHRoZSBpZGVhbCBzY2VuYXJpbyBmb3IgYSAyNWZwcyBtb3ZpZSwgYnVmZmVycyBhcmUgdGltZXN0YW1wZWQgYXMgZm9sbG93ZWQ6Ci0vLwotLy8gICAgICAgICAgICAgICBCdWZmZXIwICAgICAgQnVmZmVyMSAgICAgIEJ1ZmZlcjIgICAgICAuLi4gICAgICBCdWZmZXJOCi0vLyBUaW1lc3RhbXA6ICAgICAgICAwdXMgICAgICA0MDAwMHVzICAgICAgODAwMDB1cyAgICAgIC4uLiAgIChOKjQwMDAwKXVzCi0vLyBEdXJhdGlvbio6ICAgIDQwMDAwdXMgICAgICA0MDAwMHVzICAgICAgNDAwMDB1cyAgICAgIC4uLiAgICAgICA0MDAwMHVzCi0vLwotLy8gICoyNWZwcyA9IDAuMDRzIHBlciBmcmFtZSA9IDQwMDAwdXMgcGVyIGZyYW1lCi0KLSNpZm5kZWYgTUVESUFfQkFTRV9CVUZGRVJTX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfQlVGRkVSU19IXwotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RpbWUuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBJbmRpY2F0ZXMgYW4gaW52YWxpZCBvciBtaXNzaW5nIHRpbWVzdGFtcC4KLU1FRElBX0VYUE9SVCBleHRlcm4gaW5saW5lIGJhc2U6OlRpbWVEZWx0YSBrTm9UaW1lc3RhbXAoKSB7Ci0gIHJldHVybiBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWNyb3NlY29uZHMoa2ludDY0bWluKTsKLX0KLQotLy8gUmVwcmVzZW50cyBhbiBpbmZpbml0ZSBzdHJlYW0gZHVyYXRpb24uCi1NRURJQV9FWFBPUlQgZXh0ZXJuIGlubGluZSBiYXNlOjpUaW1lRGVsdGEga0luZmluaXRlRHVyYXRpb24oKSB7Ci0gIHJldHVybiBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWNyb3NlY29uZHMoa2ludDY0bWF4KTsKLX0KLQotY2xhc3MgTUVESUFfRVhQT1JUIEJ1ZmZlciA6IHB1YmxpYyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxCdWZmZXI+IHsKLSBwdWJsaWM6Ci0gIC8vIFJldHVybnMgYSByZWFkIG9ubHkgcG9pbnRlciB0byB0aGUgYnVmZmVyIGRhdGEuCi0gIHZpcnR1YWwgY29uc3QgdWludDgqIEdldERhdGEoKSBjb25zdCA9IDA7Ci0KLSAgLy8gUmV0dXJucyB0aGUgc2l6ZSBvZiB2YWxpZCBkYXRhIGluIGJ5dGVzLgotICB2aXJ0dWFsIGludCBHZXREYXRhU2l6ZSgpIGNvbnN0ID0gMDsKLQotICAvLyBJZiB0aGVyZSdzIG5vIGRhdGEgaW4gdGhpcyBidWZmZXIsIGl0IHJlcHJlc2VudHMgZW5kIG9mIHN0cmVhbS4KLSAgYm9vbCBJc0VuZE9mU3RyZWFtKCkgY29uc3Q7Ci0KLSAgYmFzZTo6VGltZURlbHRhIEdldFRpbWVzdGFtcCgpIGNvbnN0IHsKLSAgICByZXR1cm4gdGltZXN0YW1wXzsKLSAgfQotICB2b2lkIFNldFRpbWVzdGFtcChjb25zdCBiYXNlOjpUaW1lRGVsdGEmIHRpbWVzdGFtcCkgewotICAgIHRpbWVzdGFtcF8gPSB0aW1lc3RhbXA7Ci0gIH0KLQotICBiYXNlOjpUaW1lRGVsdGEgR2V0RHVyYXRpb24oKSBjb25zdCB7Ci0gICAgcmV0dXJuIGR1cmF0aW9uXzsKLSAgfQotICB2b2lkIFNldER1cmF0aW9uKGNvbnN0IGJhc2U6OlRpbWVEZWx0YSYgZHVyYXRpb24pIHsKLSAgICBkdXJhdGlvbl8gPSBkdXJhdGlvbjsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBmcmllbmQgY2xhc3MgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8QnVmZmVyPjsKLSAgQnVmZmVyKGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXAsIGJhc2U6OlRpbWVEZWx0YSBkdXJhdGlvbik7Ci0gIHZpcnR1YWwgfkJ1ZmZlcigpOwotCi0gcHJpdmF0ZToKLSAgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcF87Ci0gIGJhc2U6OlRpbWVEZWx0YSBkdXJhdGlvbl87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEJ1ZmZlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX0JVRkZFUlNfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2J1ZmZlcnNfdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvYmFzZS9idWZmZXJzX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTZiNDBiLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL2J1ZmZlcnNfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAiYmFzZS9zdHJpbmdfdXRpbC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYnVmZmVycy5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1uYW1lc3BhY2UgewotCi0vLyBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgQnVmZmVyIHRvIHRlc3QgYmFzZSBjbGFzcyBmdW5jdGlvbmFsaXR5LgotY2xhc3MgVGVzdEJ1ZmZlciA6IHB1YmxpYyBCdWZmZXIgewotIHB1YmxpYzoKLSAgVGVzdEJ1ZmZlcigpCi0gICAgICA6IEJ1ZmZlcihiYXNlOjpUaW1lRGVsdGEoKSwgYmFzZTo6VGltZURlbHRhKCkpIHsKLSAgfQotCi0gIC8vIFNldHMgfGRhdGFffCBhbmQgfHNpemVffCBtZW1iZXJzIGZvciB0ZXN0aW5nIHB1cnBvc2VzLiBEb2VzIG5vdCB0YWtlCi0gIC8vIG93bmVyc2hpcCBvZiB8ZGF0YXwuCi0gIFRlc3RCdWZmZXIoY29uc3QgdWludDgqIGRhdGEsIGludCBzaXplKQotICAgICAgOiBCdWZmZXIoYmFzZTo6VGltZURlbHRhKCksIGJhc2U6OlRpbWVEZWx0YSgpKSwKLSAgICAgICAgZGF0YV8oZGF0YSksCi0gICAgICAgIHNpemVfKHNpemUpIHsKLSAgfQotCi0gIC8vIEJ1ZmZlciBpbXBsZW1lbnRhdGlvbi4KLSAgdmlydHVhbCBjb25zdCB1aW50OCogR2V0RGF0YSgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIGRhdGFfOyB9Ci0gIHZpcnR1YWwgaW50IEdldERhdGFTaXplKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gc2l6ZV87IH0KLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB+VGVzdEJ1ZmZlcigpIHt9Ci0KLSBwcml2YXRlOgotICBjb25zdCB1aW50OCogZGF0YV87Ci0gIGludCBzaXplXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oVGVzdEJ1ZmZlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotVEVTVChCdWZmZXJUZXN0LCBUaW1lc3RhbXApIHsKLSAgY29uc3QgYmFzZTo6VGltZURlbHRhIGtaZXJvOwotICBjb25zdCBiYXNlOjpUaW1lRGVsdGEga1RpbWVzdGFtcEEgPSBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWNyb3NlY29uZHMoMTMzNyk7Ci0gIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSBrVGltZXN0YW1wQiA9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pY3Jvc2Vjb25kcygxMjM0KTsKLQotICBzY29wZWRfcmVmcHRyPFRlc3RCdWZmZXI+IGJ1ZmZlciA9IG5ldyBUZXN0QnVmZmVyKCk7Ci0gIEVYUEVDVF9UUlVFKGJ1ZmZlci0+R2V0VGltZXN0YW1wKCkgPT0ga1plcm8pOwotCi0gIGJ1ZmZlci0+U2V0VGltZXN0YW1wKGtUaW1lc3RhbXBBKTsKLSAgRVhQRUNUX1RSVUUoYnVmZmVyLT5HZXRUaW1lc3RhbXAoKSA9PSBrVGltZXN0YW1wQSk7Ci0KLSAgYnVmZmVyLT5TZXRUaW1lc3RhbXAoa1RpbWVzdGFtcEIpOwotICBFWFBFQ1RfVFJVRShidWZmZXItPkdldFRpbWVzdGFtcCgpID09IGtUaW1lc3RhbXBCKTsKLX0KLQotVEVTVChCdWZmZXJUZXN0LCBEdXJhdGlvbikgewotICBjb25zdCBiYXNlOjpUaW1lRGVsdGEga1plcm87Ci0gIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSBrRHVyYXRpb25BID0gYmFzZTo6VGltZURlbHRhOjpGcm9tTWljcm9zZWNvbmRzKDEzMzcpOwotICBjb25zdCBiYXNlOjpUaW1lRGVsdGEga0R1cmF0aW9uQiA9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pY3Jvc2Vjb25kcygxMjM0KTsKLQotICBzY29wZWRfcmVmcHRyPFRlc3RCdWZmZXI+IGJ1ZmZlciA9IG5ldyBUZXN0QnVmZmVyKCk7Ci0gIEVYUEVDVF9UUlVFKGJ1ZmZlci0+R2V0RHVyYXRpb24oKSA9PSBrWmVybyk7Ci0KLSAgYnVmZmVyLT5TZXREdXJhdGlvbihrRHVyYXRpb25BKTsKLSAgRVhQRUNUX1RSVUUoYnVmZmVyLT5HZXREdXJhdGlvbigpID09IGtEdXJhdGlvbkEpOwotCi0gIGJ1ZmZlci0+U2V0RHVyYXRpb24oa0R1cmF0aW9uQik7Ci0gIEVYUEVDVF9UUlVFKGJ1ZmZlci0+R2V0RHVyYXRpb24oKSA9PSBrRHVyYXRpb25CKTsKLX0KLQotVEVTVChCdWZmZXJUZXN0LCBJc0VuZE9mU3RyZWFtKSB7Ci0gIGNvbnN0IHVpbnQ4IGtEYXRhW10gPSB7IDB4MDAsIDB4RkYgfTsKLSAgY29uc3QgaW50IGtEYXRhU2l6ZSA9IGFycmF5c2l6ZShrRGF0YSk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxUZXN0QnVmZmVyPiBidWZmZXIgPSBuZXcgVGVzdEJ1ZmZlcihOVUxMLCAwKTsKLSAgRVhQRUNUX1RSVUUoYnVmZmVyLT5Jc0VuZE9mU3RyZWFtKCkpOwotCi0gIGJ1ZmZlciA9IG5ldyBUZXN0QnVmZmVyKGtEYXRhLCBrRGF0YVNpemUpOwotICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5Jc0VuZE9mU3RyZWFtKCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2J5dGVfcXVldWUuY2MgYi9zcmMvbWVkaWEvYmFzZS9ieXRlX3F1ZXVlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTFiZmI3Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL2J5dGVfcXVldWUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9ieXRlX3F1ZXVlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gRGVmYXVsdCBzdGFydGluZyBzaXplIGZvciB0aGUgcXVldWUuCi1lbnVtIHsga0RlZmF1bHRRdWV1ZVNpemUgPSAxMDI0IH07Ci0KLUJ5dGVRdWV1ZTo6Qnl0ZVF1ZXVlKCkKLSAgICA6IGJ1ZmZlcl8obmV3IHVpbnQ4W2tEZWZhdWx0UXVldWVTaXplXSksCi0gICAgICBzaXplXyhrRGVmYXVsdFF1ZXVlU2l6ZSksCi0gICAgICBvZmZzZXRfKDApLAotICAgICAgdXNlZF8oMCkgewotfQotCi1CeXRlUXVldWU6On5CeXRlUXVldWUoKSB7fQotCi12b2lkIEJ5dGVRdWV1ZTo6UmVzZXQoKSB7Ci0gIG9mZnNldF8gPSAwOwotICB1c2VkXyA9IDA7Ci19Ci0KLXZvaWQgQnl0ZVF1ZXVlOjpQdXNoKGNvbnN0IHVpbnQ4KiBkYXRhLCBpbnQgc2l6ZSkgewotICBEQ0hFQ0soZGF0YSk7Ci0gIERDSEVDS19HVChzaXplLCAwKTsKLQotICBzaXplX3Qgc2l6ZV9uZWVkZWQgPSB1c2VkXyArIHNpemU7Ci0KLSAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgYSBiaWdnZXIgYnVmZmVyLgotICBpZiAoc2l6ZV9uZWVkZWQgPiBzaXplXykgewotICAgIHNpemVfdCBuZXdfc2l6ZSA9IDIgKiBzaXplXzsKLSAgICB3aGlsZSAoc2l6ZV9uZWVkZWQgPiBuZXdfc2l6ZSAmJiBuZXdfc2l6ZSA+IHNpemVfKQotICAgICAgbmV3X3NpemUgKj0gMjsKLQotICAgIC8vIFNhbml0eSBjaGVjayB0byBtYWtlIHN1cmUgd2UgZGlkbid0IG92ZXJmbG93LgotICAgIENIRUNLX0dUKG5ld19zaXplLCBzaXplXyk7Ci0KLSAgICBzY29wZWRfYXJyYXk8dWludDg+IG5ld19idWZmZXIobmV3IHVpbnQ4W25ld19zaXplXSk7Ci0KLSAgICAvLyBDb3B5IHRoZSBkYXRhIGZyb20gdGhlIG9sZCBidWZmZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuZXcgb25lLgotICAgIGlmICh1c2VkXyA+IDApCi0gICAgICBtZW1jcHkobmV3X2J1ZmZlci5nZXQoKSwgZnJvbnQoKSwgdXNlZF8pOwotCi0gICAgYnVmZmVyXy5yZXNldChuZXdfYnVmZmVyLnJlbGVhc2UoKSk7Ci0gICAgc2l6ZV8gPSBuZXdfc2l6ZTsKLSAgICBvZmZzZXRfID0gMDsKLSAgfSBlbHNlIGlmICgob2Zmc2V0XyArIHVzZWRfICsgc2l6ZSkgPiBzaXplXykgewotICAgIC8vIFRoZSBidWZmZXIgaXMgYmlnIGVub3VnaCwgYnV0IHdlIG5lZWQgdG8gbW92ZSB0aGUgZGF0YSBpbiB0aGUgcXVldWUuCi0gICAgbWVtbW92ZShidWZmZXJfLmdldCgpLCBmcm9udCgpLCB1c2VkXyk7Ci0gICAgb2Zmc2V0XyA9IDA7Ci0gIH0KLQotICBtZW1jcHkoZnJvbnQoKSArIHVzZWRfLCBkYXRhLCBzaXplKTsKLSAgdXNlZF8gKz0gc2l6ZTsKLX0KLQotdm9pZCBCeXRlUXVldWU6OlBlZWsoY29uc3QgdWludDgqKiBkYXRhLCBpbnQqIHNpemUpIGNvbnN0IHsKLSAgRENIRUNLKGRhdGEpOwotICBEQ0hFQ0soc2l6ZSk7Ci0gICpkYXRhID0gZnJvbnQoKTsKLSAgKnNpemUgPSB1c2VkXzsKLX0KLQotdm9pZCBCeXRlUXVldWU6OlBvcChpbnQgY291bnQpIHsKLSAgRENIRUNLX0xFKGNvdW50LCB1c2VkXyk7Ci0KLSAgb2Zmc2V0XyArPSBjb3VudDsKLSAgdXNlZF8gLT0gY291bnQ7Ci0KLSAgLy8gTW92ZSB0aGUgb2Zmc2V0IGJhY2sgdG8gMCBpZiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgotICBpZiAob2Zmc2V0XyA9PSBzaXplXykgewotICAgIERDSEVDS19FUSh1c2VkXywgMCk7Ci0gICAgb2Zmc2V0XyA9IDA7Ci0gIH0KLX0KLQotdWludDgqIEJ5dGVRdWV1ZTo6ZnJvbnQoKSBjb25zdCB7IHJldHVybiBidWZmZXJfLmdldCgpICsgb2Zmc2V0XzsgfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2J5dGVfcXVldWUuaCBiL3NyYy9tZWRpYS9iYXNlL2J5dGVfcXVldWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYxOTQ3Mi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9ieXRlX3F1ZXVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0JBU0VfQllURV9RVUVVRV9IXwotI2RlZmluZSBNRURJQV9CQVNFX0JZVEVfUVVFVUVfSF8KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBSZXByZXNlbnRzIGEgcXVldWUgb2YgYnl0ZXMuCi0vLyBEYXRhIGlzIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlIHZpYSBhbiBQdXNoKCkgY2FsbCBhbmQgcmVtb3ZlZCB2aWEKLS8vIFBvcCgpLiBUaGUgY29udGVudHMgb2YgdGhlIHF1ZXVlIGNhbiBiZSBvYnNlcnZlZCB2aWEgdGhlIFBlZWsoKSBtZXRob2QuCi0vLyBUaGlzIGNsYXNzIG1hbmFnZXMgdGhlIHVuZGVybHlpbmcgc3RvcmFnZSBvZiB0aGUgcXVldWUgYW5kIHRyaWVzIHRvIG1pbmltaXplCi0vLyB0aGUgbnVtYmVyIG9mIGJ1ZmZlciBjb3BpZXMgd2hlbiBkYXRhIGlzIGFwcGVuZGVkIGFuZCByZW1vdmVkLgotY2xhc3MgTUVESUFfRVhQT1JUIEJ5dGVRdWV1ZSB7Ci0gcHVibGljOgotICBCeXRlUXVldWUoKTsKLSAgfkJ5dGVRdWV1ZSgpOwotCi0gIC8vIFJlc2V0IHRoZSBxdWV1ZSB0byB0aGUgZW1wdHkgc3RhdGUuCi0gIHZvaWQgUmVzZXQoKTsKLQotICAvLyBBcHBlbmRzIG5ldyBieXRlcyBvbnRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlLgotICB2b2lkIFB1c2goY29uc3QgdWludDgqIGRhdGEsIGludCBzaXplKTsKLQotICAvLyBHZXQgYSBwb2ludGVyIHRvIHRoZSBmcm9udCBvZiB0aGUgcXVldWUgYW5kIHRoZSBxdWV1ZSBzaXplLgotICAvLyBUaGVzZSB2YWx1ZXMgYXJlIG9ubHkgdmFsaWQgdW50aWwgdGhlIG5leHQgUHVzaCgpIG9yCi0gIC8vIFBvcCgpIGNhbGwuCi0gIHZvaWQgUGVlayhjb25zdCB1aW50OCoqIGRhdGEsIGludCogc2l6ZSkgY29uc3Q7Ci0KLSAgLy8gUmVtb3ZlIHxjb3VudHwgYnl0ZXMgZnJvbSB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlLgotICB2b2lkIFBvcChpbnQgY291bnQpOwotCi0gcHJpdmF0ZToKLSAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZyb250IG9mIHRoZSBxdWV1ZS4KLSAgdWludDgqIGZyb250KCkgY29uc3Q7Ci0KLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiBidWZmZXJfOwotCi0gIC8vIFNpemUgb2YgfGJ1ZmZlcl98LgotICBzaXplX3Qgc2l6ZV87Ci0KLSAgLy8gT2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHxidWZmZXJffCB0aGF0IG1hcmtzIHRoZSBmcm9udCBvZiB0aGUgcXVldWUuCi0gIHNpemVfdCBvZmZzZXRfOwotCi0gIC8vIE51bWJlciBvZiBieXRlcyBzdG9yZWQgaW4gdGhlIHF1ZXVlLgotICBpbnQgdXNlZF87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEJ5dGVRdWV1ZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX0JZVEVfUVVFVUVfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2NoYW5uZWxfbGF5b3V0LmNjIGIvc3JjL21lZGlhL2Jhc2UvY2hhbm5lbF9sYXlvdXQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNDQyYjMuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvY2hhbm5lbF9sYXlvdXQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvY2hhbm5lbF9sYXlvdXQuaCIKLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1zdGF0aWMgY29uc3QgaW50IGtMYXlvdXRUb0NoYW5uZWxzW10gPSB7Ci0gICAgMCwgICAvLyBDSEFOTkVMX0xBWU9VVF9OT05FCi0gICAgMCwgICAvLyBDSEFOTkVMX0xBWU9VVF9VTlNVUFBPUlRFRAotICAgIDEsICAgLy8gQ0hBTk5FTF9MQVlPVVRfTU9OTwotICAgIDIsICAgLy8gQ0hBTk5FTF9MQVlPVVRfU1RFUkVPCi0gICAgMywgICAvLyBDSEFOTkVMX0xBWU9VVF8yXzEKLSAgICAzLCAgIC8vIENIQU5ORUxfTEFZT1VUX1NVUlJPVU5ECi0gICAgNCwgICAvLyBDSEFOTkVMX0xBWU9VVF80UE9JTlQwCi0gICAgNCwgICAvLyBDSEFOTkVMX0xBWU9VVF8yXzIKLSAgICA0LCAgIC8vIENIQU5ORUxfTEFZT1VUX1FVQUQKLSAgICA1LCAgIC8vIENIQU5ORUxfTEFZT1VUXzVQT0lOVDAKLSAgICA2LCAgIC8vIENIQU5ORUxfTEFZT1VUXzVQT0lOVDEKLSAgICA1LCAgIC8vIENIQU5ORUxfTEFZT1VUXzVQT0lOVDBfQkFDSwotICAgIDYsICAgLy8gQ0hBTk5FTF9MQVlPVVRfNVBPSU5UMV9CQUNLCi0gICAgNywgICAvLyBDSEFOTkVMX0xBWU9VVF83UE9JTlQwCi0gICAgOCwgICAvLyBDSEFOTkVMX0xBWU9VVF83UE9JTlQxCi0gICAgOCwgICAvLyBDSEFOTkVMX0xBWU9VVF83UE9JTlQxX1dJREUKLSAgICAyLCAgIC8vIENIQU5ORUxfTEFZT1VUX1NURVJFT19ET1dOTUlYCi0gICAgMywgICAvLyBDSEFOTkVMX0xBWU9VVF8yUE9JTlQxCi0gICAgNCwgICAvLyBDSEFOTkVMX0xBWU9VVF8zXzEKLSAgICA1LCAgIC8vIENIQU5ORUxfTEFZT1VUXzRfMQotICAgIDYsICAgLy8gQ0hBTk5FTF9MQVlPVVRfNl8wCi0gICAgNiwgICAvLyBDSEFOTkVMX0xBWU9VVF82XzBfRlJPTlQKLSAgICA2LCAgIC8vIENIQU5ORUxfTEFZT1VUX0hFWEFHT05BTAotICAgIDcsICAgLy8gQ0hBTk5FTF9MQVlPVVRfNl8xCi0gICAgNywgICAvLyBDSEFOTkVMX0xBWU9VVF82XzFfQkFDSwotICAgIDcsICAgLy8gQ0hBTk5FTF9MQVlPVVRfNl8xX0ZST05UCi0gICAgNywgICAvLyBDSEFOTkVMX0xBWU9VVF83XzBfRlJPTlQKLSAgICA4LCAgIC8vIENIQU5ORUxfTEFZT1VUXzdfMV9XSURFX0JBQ0sKLSAgICA4LCAgIC8vIENIQU5ORUxfTEFZT1VUX09DVEFHT05BTAotfTsKLQotLy8gVGhlIGNoYW5uZWwgb3JkZXJpbmdzIGZvciBlYWNoIGxheW91dCBhcyBzcGVjaWZpZWQgYnkgRkZtcGVnLiAgRWFjaCB2YWx1ZQotLy8gcmVwcmVzZW50cyB0aGUgaW5kZXggb2YgZWFjaCBjaGFubmVsIGluIGVhY2ggbGF5b3V0LiAgVmFsdWVzIG9mIC0xIG1lYW4gdGhlCi0vLyBjaGFubmVsIGF0IHRoYXQgaW5kZXggaXMgbm90IHVzZWQgZm9yIHRoYXQgbGF5b3V0LkZvciBleGFtcGxlLCB0aGUgbGVmdCBzaWRlCi0vLyBzdXJyb3VuZCBzb3VuZCBjaGFubmVsIGluIEZGbXBlZydzIDUuMSBsYXlvdXQgaXMgaW4gdGhlIDV0aCBwb3NpdGlvbiAoYmVjYXVzZQotLy8gdGhlIG9yZGVyIGlzIEwsIFIsIEMsIExGRSwgTFMsIFJTKSwgc28KLS8vIGtDaGFubmVsT3JkZXJpbmdzW0NIQU5ORUxfTEFZT1VUXzVQT0lOVDFdW1NJREVfTEVGVF0gPSA0Owotc3RhdGljIGNvbnN0IGludCBrQ2hhbm5lbE9yZGVyaW5nc1tDSEFOTkVMX0xBWU9VVF9NQVhdW0NIQU5ORUxTX01BWF0gPSB7Ci0gICAgLy8gRkwgfCBGUiB8IEZDIHwgTEZFIHwgQkwgfCBCUiB8IEZMb2ZDIHwgRlJvZkMgfCBCQyB8IFNMIHwgU1IKLQotICAgIC8vIENIQU5ORUxfTEFZT1VUX05PTkUKLSAgICB7ICAtMSAsIC0xICwgLTEgLCAtMSAgLCAtMSAsIC0xICwgLTEgICAgLCAtMSAgICAsIC0xICwgLTEgLCAtMSB9LAotCi0gICAgLy8gQ0hBTk5FTF9MQVlPVVRfVU5TVVBQT1JURUQKLSAgICB7ICAtMSAsIC0xICwgLTEgLCAtMSAgLCAtMSAsIC0xICwgLTEgICAgLCAtMSAgICAsIC0xICwgLTEgLCAtMSB9LAotCi0gICAgLy8gQ0hBTk5FTF9MQVlPVVRfTU9OTwotICAgIHsgIC0xICwgLTEgLCAwICAsIC0xICAsIC0xICwgLTEgLCAtMSAgICAsIC0xICAgICwgLTEgLCAtMSAsIC0xIH0sCi0KLSAgICAvLyBDSEFOTkVMX0xBWU9VVF9TVEVSRU8KLSAgICB7ICAwICAsIDEgICwgLTEgLCAtMSAgLCAtMSAsIC0xICwgLTEgICAgLCAtMSAgICAsIC0xICwgLTEgLCAtMSB9LAotCi0gICAgLy8gQ0hBTk5FTF9MQVlPVVRfMl8xCi0gICAgeyAgMCAgLCAxICAsIC0xICwgLTEgICwgLTEgLCAtMSAsIC0xICAgICwgLTEgICAgLCAyICAsIC0xICwgLTEgfSwKLQotICAgIC8vIENIQU5ORUxfTEFZT1VUX1NVUlJPVU5ECi0gICAgeyAgMCAgLCAxICAsIDIgICwgLTEgICwgLTEgLCAtMSAsIC0xICAgICwgLTEgICAgLCAtMSAsIC0xICwgLTEgfSwKLQotICAgIC8vIENIQU5ORUxfTEFZT1VUXzRQT0lOVDAKLSAgICB7ICAwICAsIDEgICwgMiAgLCAtMSAgLCAtMSAsIC0xICwgLTEgICAgLCAtMSAgICAsIDMgICwgLTEgLCAtMSB9LAotCi0gICAgLy8gQ0hBTk5FTF9MQVlPVVRfMl8yCi0gICAgeyAgMCAgLCAxICAsIC0xICwgLTEgICwgLTEgLCAtMSAsIC0xICAgICwgLTEgICAgLCAtMSAsIDIgICwgIDMgfSwKLQotICAgIC8vIENIQU5ORUxfTEFZT1VUX1FVQUQKLSAgICB7ICAwICAsIDEgICwgLTEgLCAtMSAgLCAyICAsIDMgICwgLTEgICAgLCAtMSAgICAsIC0xICwgLTEgLCAtMSB9LAotCi0gICAgLy8gQ0hBTk5FTF9MQVlPVVRfNVBPSU5UMAotICAgIHsgIDAgICwgMSAgLCAyICAsIC0xICAsIC0xICwgLTEgLCAtMSAgICAsIC0xICAgICwgLTEgLCAzICAsICA0IH0sCi0KLSAgICAvLyBDSEFOTkVMX0xBWU9VVF81UE9JTlQxCi0gICAgeyAgMCAgLCAxICAsIDIgICwgMyAgICwgLTEgLCAtMSAsIC0xICAgICwgLTEgICAgLCAtMSAsIDQgICwgIDUgfSwKLQotICAgIC8vIEZMIHwgRlIgfCBGQyB8IExGRSB8IEJMIHwgQlIgfCBGTG9mQyB8IEZSb2ZDIHwgQkMgfCBTTCB8IFNSCi0KLSAgICAvLyBDSEFOTkVMX0xBWU9VVF81UE9JTlQwX0JBQ0sKLSAgICB7ICAwICAsIDEgICwgMiAgLCAtMSAgLCAzICAsIDQgICwgLTEgICAgLCAtMSAgICAsIC0xICwgLTEgLCAtMSB9LAotCi0gICAgLy8gQ0hBTk5FTF9MQVlPVVRfNVBPSU5UMV9CQUNLCi0gICAgeyAgMCAgLCAxICAsIDIgICwgMyAgICwgNCAgLCA1ICAsIC0xICAgICwgLTEgICAgLCAtMSAsIC0xICwgLTEgfSwKLQotICAgIC8vIENIQU5ORUxfTEFZT1VUXzdQT0lOVDAKLSAgICB7ICAwICAsIDEgICwgMiAgLCAtMSAgLCA1ICAsIDYgICwgLTEgICAgLCAtMSAgICAsIC0xICwgMyAgLCAgNCB9LAotCi0gICAgLy8gQ0hBTk5FTF9MQVlPVVRfN1BPSU5UMQotICAgIHsgIDAgICwgMSAgLCAyICAsIDMgICAsIDYgICwgNyAgLCAtMSAgICAsIC0xICAgICwgLTEgLCA0ICAsICA1IH0sCi0KLSAgICAvLyBDSEFOTkVMX0xBWU9VVF83UE9JTlQxX1dJREUKLSAgICB7ICAwICAsIDEgICwgMiAgLCAzICAgLCAtMSAsIC0xICwgNiAgICAgLCA3ICAgICAsIC0xICwgNCAgLCAgNSB9LAotCi0gICAgLy8gQ0hBTk5FTF9MQVlPVVRfU1RFUkVPX0RPV05NSVgKLSAgICB7ICAwICAsIDEgICwgLTEgLCAtMSAgLCAtMSAsIC0xICwgLTEgICAgLCAtMSAgICAsIC0xICwgLTEgLCAtMSB9LAotCi0gICAgLy8gQ0hBTk5FTF9MQVlPVVRfMlBPSU5UMQotICAgIHsgIDAgICwgMSAgLCAtMSAsICAyICAsIC0xICwgLTEgLCAtMSAgICAsIC0xICAgICwgLTEgLCAtMSAsIC0xIH0sCi0KLSAgICAvLyBDSEFOTkVMX0xBWU9VVF8zXzEKLSAgICB7ICAwICAsIDEgICwgIDIgLCAgMyAgLCAtMSAsIC0xICwgLTEgICAgLCAtMSAgICAsIC0xICwgLTEgLCAtMSB9LAotCi0gICAgLy8gQ0hBTk5FTF9MQVlPVVRfNF8xCi0gICAgeyAgMCAgLCAxICAsICAyICwgIDQgICwgLTEgLCAtMSAsIC0xICAgICwgLTEgICAgLCAgMyAsIC0xICwgLTEgfSwKLQotICAgIC8vIENIQU5ORUxfTEFZT1VUXzZfMAotICAgIHsgIDAgICwgMSAgLCAyICAsIC0xICAsIC0xICwgLTEgLCAtMSAgICAsIC0xICAgICwgIDUgLCAzICAsICA0IH0sCi0KLSAgICAvLyBDSEFOTkVMX0xBWU9VVF82XzBfRlJPTlQKLSAgICB7ICAwICAsIDEgICwgLTEgLCAtMSAgLCAtMSAsIC0xICwgIDQgICAgLCAgNSAgICAsIC0xICwgMiAgLCAgMyB9LAotCi0gICAgLy8gRkwgfCBGUiB8IEZDIHwgTEZFIHwgQkwgfCBCUiB8IEZMb2ZDIHwgRlJvZkMgfCBCQyB8IFNMIHwgU1IKLQotICAgIC8vIENIQU5ORUxfTEFZT1VUX0hFWEFHT05BTAotICAgIHsgIDAgICwgMSAgLCAyICAsIC0xICAsIDMgICwgNCAgLCAtMSAgICAsIC0xICAgICwgIDUgLCAtMSAsIC0xIH0sCi0KLSAgICAvLyBDSEFOTkVMX0xBWU9VVF82XzEKLSAgICB7ICAwICAsIDEgICwgMiAgLCAzICAgLCAtMSAsIC0xICwgLTEgICAgLCAtMSAgICAsICA2ICwgNCAgLCAgNSB9LAotCi0gICAgLy8gQ0hBTk5FTF9MQVlPVVRfNl8xX0JBQ0sKLSAgICB7ICAwICAsIDEgICwgMiAgLCAzICAgLCA0ICAsIDUgICwgLTEgICAgLCAtMSAgICAsICA2ICwgLTEgLCAtMSB9LAotCi0gICAgLy8gQ0hBTk5FTF9MQVlPVVRfNl8xX0ZST05UCi0gICAgeyAgMCAgLCAxICAsIC0xICwgNiAgICwgLTEgLCAtMSAsIDQgICAgICwgNSAgICAgLCAtMSAsIDIgICwgIDMgfSwKLQotICAgIC8vIENIQU5ORUxfTEFZT1VUXzdfMF9GUk9OVAotICAgIHsgIDAgICwgMSAgLCAyICAsIC0xICAsIC0xICwgLTEgLCA1ICAgICAsIDYgICAgICwgLTEgLCAzICAsICA0IH0sCi0KLSAgICAvLyBDSEFOTkVMX0xBWU9VVF83XzFfV0lERV9CQUNLCi0gICAgeyAgMCAgLCAxICAsIDIgICwgMyAgICwgNCAgLCA1ICAsIDYgICAgICwgNyAgICAgLCAtMSAsIC0xICwgLTEgfSwKLQotICAgIC8vIENIQU5ORUxfTEFZT1VUX09DVEFHT05BTAotICAgIHsgIDAgICwgMSAgLCAyICAsIC0xICAsIDUgICwgNiAgLCAtMSAgICAsIC0xICAgICwgIDcgLCAzICAsICA0IH0sCi0KLSAgICAvLyBGTCB8IEZSIHwgRkMgfCBMRkUgfCBCTCB8IEJSIHwgRkxvZkMgfCBGUm9mQyB8IEJDIHwgU0wgfCBTUgotfTsKLQotaW50IENoYW5uZWxMYXlvdXRUb0NoYW5uZWxDb3VudChDaGFubmVsTGF5b3V0IGxheW91dCkgewotICBEQ0hFQ0tfTFQoc3RhdGljX2Nhc3Q8c2l6ZV90PihsYXlvdXQpLCBhcnJheXNpemUoa0xheW91dFRvQ2hhbm5lbHMpKTsKLSAgcmV0dXJuIGtMYXlvdXRUb0NoYW5uZWxzW2xheW91dF07Ci19Ci0KLWludCBDaGFubmVsT3JkZXIoQ2hhbm5lbExheW91dCBsYXlvdXQsIENoYW5uZWxzIGNoYW5uZWwpIHsKLSAgRENIRUNLX0xUKHN0YXRpY19jYXN0PHNpemVfdD4obGF5b3V0KSwgYXJyYXlzaXplKGtDaGFubmVsT3JkZXJpbmdzKSk7Ci0gIERDSEVDS19MVChzdGF0aWNfY2FzdDxzaXplX3Q+KGNoYW5uZWwpLCBhcnJheXNpemUoa0NoYW5uZWxPcmRlcmluZ3NbMF0pKTsKLSAgcmV0dXJuIGtDaGFubmVsT3JkZXJpbmdzW2xheW91dF1bY2hhbm5lbF07Ci19Ci0KLS8vIENvbnZlcnRzIGEgY2hhbm5lbCBjb3VudCBpbnRvIGEgY2hhbm5lbCBsYXlvdXQuCi1DaGFubmVsTGF5b3V0IEd1ZXNzQ2hhbm5lbExheW91dChpbnQgY2hhbm5lbHMpIHsKLSAgc3dpdGNoIChjaGFubmVscykgewotICAgIGNhc2UgMToKLSAgICAgIHJldHVybiBDSEFOTkVMX0xBWU9VVF9NT05POwotICAgIGNhc2UgMjoKLSAgICAgIHJldHVybiBDSEFOTkVMX0xBWU9VVF9TVEVSRU87Ci0gICAgY2FzZSAzOgotICAgICAgcmV0dXJuIENIQU5ORUxfTEFZT1VUX1NVUlJPVU5EOwotICAgIGNhc2UgNDoKLSAgICAgIHJldHVybiBDSEFOTkVMX0xBWU9VVF9RVUFEOwotICAgIGNhc2UgNToKLSAgICAgIHJldHVybiBDSEFOTkVMX0xBWU9VVF81XzA7Ci0gICAgY2FzZSA2OgotICAgICAgcmV0dXJuIENIQU5ORUxfTEFZT1VUXzVfMTsKLSAgICBjYXNlIDc6Ci0gICAgICByZXR1cm4gQ0hBTk5FTF9MQVlPVVRfNl8xOwotICAgIGNhc2UgODoKLSAgICAgIHJldHVybiBDSEFOTkVMX0xBWU9VVF83XzE7Ci0gICAgZGVmYXVsdDoKLSAgICAgIERWTE9HKDEpIDw8ICJVbnN1cHBvcnRlZCBjaGFubmVsIGNvdW50OiAiIDw8IGNoYW5uZWxzOwotICB9Ci0gIHJldHVybiBDSEFOTkVMX0xBWU9VVF9VTlNVUFBPUlRFRDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9jaGFubmVsX2xheW91dC5oIGIvc3JjL21lZGlhL2Jhc2UvY2hhbm5lbF9sYXlvdXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY4Y2NlMC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9jaGFubmVsX2xheW91dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfQkFTRV9DSEFOTkVMX0xBWU9VVF9IXwotI2RlZmluZSBNRURJQV9CQVNFX0NIQU5ORUxfTEFZT1VUX0hfCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBFbnVtZXJhdGVzIHRoZSB2YXJpb3VzIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgb3JkZXJpbmcgb2YgYXVkaW8gY2hhbm5lbHMuCi0vLyBMb2dnZWQgdG8gVU1BLCBzbyBuZXZlciByZXVzZSBhIHZhbHVlLCBhbHdheXMgYWRkIG5ldy9ncmVhdGVyIG9uZXMhCi1lbnVtIENoYW5uZWxMYXlvdXQgewotICBDSEFOTkVMX0xBWU9VVF9OT05FID0gMCwKLSAgQ0hBTk5FTF9MQVlPVVRfVU5TVVBQT1JURUQgPSAxLAotCi0gIC8vIEZyb250IEMKLSAgQ0hBTk5FTF9MQVlPVVRfTU9OTyA9IDIsCi0KLSAgLy8gRnJvbnQgTCwgRnJvbnQgUgotICBDSEFOTkVMX0xBWU9VVF9TVEVSRU8gPSAzLAotCi0gIC8vIEZyb250IEwsIEZyb250IFIsIEJhY2sgQwotICBDSEFOTkVMX0xBWU9VVF8yXzEgPSA0LAotCi0gIC8vIEZyb250IEwsIEZyb250IFIsIEZyb250IEMKLSAgQ0hBTk5FTF9MQVlPVVRfU1VSUk9VTkQgPSA1LAotCi0gIC8vIEZyb250IEwsIEZyb250IFIsIEZyb250IEMsIEJhY2sgQwotICBDSEFOTkVMX0xBWU9VVF80XzAgPSA2LAotCi0gIC8vIEZyb250IEwsIEZyb250IFIsIFNpZGUgTCwgU2lkZSBSCi0gIENIQU5ORUxfTEFZT1VUXzJfMiA9IDcsCi0KLSAgLy8gRnJvbnQgTCwgRnJvbnQgUiwgQmFjayBMLCBCYWNrIFIKLSAgQ0hBTk5FTF9MQVlPVVRfUVVBRCA9IDgsCi0KLSAgLy8gRnJvbnQgTCwgRnJvbnQgUiwgRnJvbnQgQywgU2lkZSBMLCBTaWRlIFIKLSAgQ0hBTk5FTF9MQVlPVVRfNV8wID0gOSwKLQotICAvLyBGcm9udCBMLCBGcm9udCBSLCBGcm9udCBDLCBTaWRlIEwsIFNpZGUgUiwgTEZFCi0gIENIQU5ORUxfTEFZT1VUXzVfMSA9IDEwLAotCi0gIC8vIEZyb250IEwsIEZyb250IFIsIEZyb250IEMsIEJhY2sgTCwgQmFjayBSCi0gIENIQU5ORUxfTEFZT1VUXzVfMF9CQUNLID0gMTEsCi0KLSAgLy8gRnJvbnQgTCwgRnJvbnQgUiwgRnJvbnQgQywgQmFjayBMLCBCYWNrIFIsIExGRQotICBDSEFOTkVMX0xBWU9VVF81XzFfQkFDSyA9IDEyLAotCi0gIC8vIEZyb250IEwsIEZyb250IFIsIEZyb250IEMsIFNpZGUgTCwgU2lkZSBSLCBCYWNrIEwsIEJhY2sgUgotICBDSEFOTkVMX0xBWU9VVF83XzAgPSAxMywKLQotICAvLyBGcm9udCBMLCBGcm9udCBSLCBGcm9udCBDLCBTaWRlIEwsIFNpZGUgUiwgTEZFLCBCYWNrIEwsIEJhY2sgUgotICBDSEFOTkVMX0xBWU9VVF83XzEgPSAxNCwKLQotICAvLyBGcm9udCBMLCBGcm9udCBSLCBGcm9udCBDLCBTaWRlIEwsIFNpZGUgUiwgTEZFLCBGcm9udCBMb2ZDLCBGcm9udCBSb2ZDCi0gIENIQU5ORUxfTEFZT1VUXzdfMV9XSURFID0gMTUsCi0KLSAgLy8gU3RlcmVvIEwsIFN0ZXJlbyBSCi0gIENIQU5ORUxfTEFZT1VUX1NURVJFT19ET1dOTUlYID0gMTYsCi0KLSAgLy8gU3RlcmVvIEwsIFN0ZXJlbyBSLCBMRkUKLSAgQ0hBTk5FTF9MQVlPVVRfMlBPSU5UMSA9IDE3LAotCi0gIC8vIFN0ZXJlbyBMLCBTdGVyZW8gUiwgRnJvbnQgQywgTEZFCi0gIENIQU5ORUxfTEFZT1VUXzNfMSA9IDE4LAotCi0gIC8vIFN0ZXJlbyBMLCBTdGVyZW8gUiwgRnJvbnQgQywgUmVhciBDLCBMRkUKLSAgQ0hBTk5FTF9MQVlPVVRfNF8xID0gMTksCi0KLSAgLy8gU3RlcmVvIEwsIFN0ZXJlbyBSLCBGcm9udCBDLCBTaWRlIEwsIFNpZGUgUiwgQmFjayBDCi0gIENIQU5ORUxfTEFZT1VUXzZfMCA9IDIwLAotCi0gIC8vIFN0ZXJlbyBMLCBTdGVyZW8gUiwgU2lkZSBMLCBTaWRlIFIsIEZyb250IExvZkMsIEZyb250IFJvZkMKLSAgQ0hBTk5FTF9MQVlPVVRfNl8wX0ZST05UID0gMjEsCi0KLSAgLy8gU3RlcmVvIEwsIFN0ZXJlbyBSLCBTaWRlIEwsIFNpZGUgUiwgRnJvbnQgQywgUmVhciBDLgotICBDSEFOTkVMX0xBWU9VVF9IRVhBR09OQUwgPSAyMiwKLQotICAvLyBTdGVyZW8gTCwgU3RlcmVvIFIsIFNpZGUgTCwgU2lkZSBSLCBGcm9udCBDLCBSZWFyIENlbnRlciwgTEZFCi0gIENIQU5ORUxfTEFZT1VUXzZfMSA9IDIzLAotCi0gIC8vIFN0ZXJlbyBMLCBTdGVyZW8gUiwgQmFjayBMLCBCYWNrIFIsIEZyb250IEMsIFJlYXIgQ2VudGVyLCBMRkUKLSAgQ0hBTk5FTF9MQVlPVVRfNl8xX0JBQ0sgPSAyNCwKLQotICAvLyBTdGVyZW8gTCwgU3RlcmVvIFIsIFNpZGUgTCwgU2lkZSBSLCBGcm9udCBMb2ZDLCBGcm9udCBSb2ZDLCBMRkUKLSAgQ0hBTk5FTF9MQVlPVVRfNl8xX0ZST05UID0gMjUsCi0KLSAgLy8gRnJvbnQgTCwgRnJvbnQgUiwgRnJvbnQgQywgU2lkZSBMLCBTaWRlIFIsIEZyb250IExvZkMsIEZyb250IFJvZkMKLSAgQ0hBTk5FTF9MQVlPVVRfN18wX0ZST05UID0gMjYsCi0KLSAgLy8gRnJvbnQgTCwgRnJvbnQgUiwgRnJvbnQgQywgQmFjayBMLCBCYWNrIFIsIExGRSwgRnJvbnQgTG9mQywgRnJvbnQgUm9mQwotICBDSEFOTkVMX0xBWU9VVF83XzFfV0lERV9CQUNLID0gMjcsCi0KLSAgLy8gRnJvbnQgTCwgRnJvbnQgUiwgRnJvbnQgQywgU2lkZSBMLCBTaWRlIFIsIFJlYXIgQywgQmFjayBMLCBCYWNrIFIuCi0gIENIQU5ORUxfTEFZT1VUX09DVEFHT05BTCA9IDI4LAotCi0gIC8vIFRvdGFsIG51bWJlciBvZiBsYXlvdXRzLgotICBDSEFOTkVMX0xBWU9VVF9NQVggIC8vIE11c3QgYWx3YXlzIGJlIGxhc3QhCi19OwotCi1lbnVtIENoYW5uZWxzIHsKLSAgTEVGVCA9IDAsCi0gIFJJR0hULAotICBDRU5URVIsCi0gIExGRSwKLSAgQkFDS19MRUZULAotICBCQUNLX1JJR0hULAotICBMRUZUX09GX0NFTlRFUiwKLSAgUklHSFRfT0ZfQ0VOVEVSLAotICBCQUNLX0NFTlRFUiwKLSAgU0lERV9MRUZULAotICBTSURFX1JJR0hULAotICBDSEFOTkVMU19NQVgKLX07Ci0KLS8vIFJldHVybnMgdGhlIGV4cGVjdGVkIGNoYW5uZWwgcG9zaXRpb24gaW4gYW4gaW50ZXJsZWF2ZWQgc3RyZWFtLiAgVmFsdWVzIG9mIC0xCi0vLyBtZWFuIHRoZSBjaGFubmVsIGF0IHRoYXQgaW5kZXggaXMgbm90IHVzZWQgZm9yIHRoYXQgbGF5b3V0LiAgVmFsdWVzIHJhbmdlCi0vLyBmcm9tIDAgdG8gQ0hBTk5FTFNfTUFYIC0gMS4KLU1FRElBX0VYUE9SVCBpbnQgQ2hhbm5lbE9yZGVyKENoYW5uZWxMYXlvdXQgbGF5b3V0LCBDaGFubmVscyBjaGFubmVsKTsKLQotLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGluIGEgZ2l2ZW4gQ2hhbm5lbExheW91dC4KLU1FRElBX0VYUE9SVCBpbnQgQ2hhbm5lbExheW91dFRvQ2hhbm5lbENvdW50KENoYW5uZWxMYXlvdXQgbGF5b3V0KTsKLQotLy8gR2l2ZW4gdGhlIG51bWJlciBvZiBjaGFubmVscywgcmV0dXJuIHRoZSBiZXN0IGxheW91dCwKLS8vIG9yIHJldHVybiBDSEFOTkVMX0xBWU9VVF9VTlNVUFBPUlRFRCBpZiB0aGVyZSBpcyBubyBnb29kIG1hdGNoLgotTUVESUFfRVhQT1JUIENoYW5uZWxMYXlvdXQgR3Vlc3NDaGFubmVsTGF5b3V0KGludCBjaGFubmVscyk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0JBU0VfQ0hBTk5FTF9MQVlPVVRfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2NoYW5uZWxfbWl4ZXIuY2MgYi9zcmMvbWVkaWEvYmFzZS9jaGFubmVsX21peGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTRjYmI2Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL2NoYW5uZWxfbWl4ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gTVNWQysrIHJlcXVpcmVzIHRoaXMgdG8gYmUgc2V0IGJlZm9yZSBhbnkgb3RoZXIgaW5jbHVkZXMgdG8gZ2V0IE1fU1FSVDFfMi4KLSNkZWZpbmUgX1VTRV9NQVRIX0RFRklORVMKLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvY2hhbm5lbF9taXhlci5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGNtYXRoPgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19idXMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZlY3Rvcl9tYXRoLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIERlZmF1bHQgc2NhbGUgZmFjdG9yIGZvciBtaXhpbmcgdHdvIGNoYW5uZWxzIHRvZ2V0aGVyLiAgV2UgdXNlIGEgZGlmZmVyZW50Ci0vLyB2YWx1ZSBmb3Igc3RlcmVvIC0+IG1vbm8gYW5kIG1vbm8gLT4gc3RlcmVvIG1peGVzLgotc3RhdGljIGNvbnN0IGZsb2F0IGtFcXVhbFBvd2VyU2NhbGUgPSBzdGF0aWNfY2FzdDxmbG9hdD4oTV9TUVJUMV8yKTsKLQotc3RhdGljIGludCBWYWxpZGF0ZUxheW91dChDaGFubmVsTGF5b3V0IGxheW91dCkgewotICBDSEVDS19ORShsYXlvdXQsIENIQU5ORUxfTEFZT1VUX05PTkUpOwotICBDSEVDS19ORShsYXlvdXQsIENIQU5ORUxfTEFZT1VUX01BWCk7Ci0KLSAgLy8gVE9ETyhkYWxlY3VydGlzLCBjcm9nZXJzKTogV2Ugd2lsbCBldmVudHVhbGx5IGhhbmRsZSB1bnN1cHBvcnRlZCBsYXlvdXRzIGJ5Ci0gIC8vIHNpbXBseSBjb3B5aW5nIHRoZSBpbnB1dCBjaGFubmVscyB0byB0aGUgb3V0cHV0IGNoYW5uZWxzLCBzaW1pbGFyIHRvIGlmIHRoZQotICAvLyB1c2VyIHJlcXVlc3RzIGlkZW50aWNhbCBpbnB1dCBhbmQgb3V0cHV0IGxheW91dHMgdG9kYXkuCi0gIENIRUNLX05FKGxheW91dCwgQ0hBTk5FTF9MQVlPVVRfVU5TVVBQT1JURUQpOwotCi0gIC8vIFZlcmlmeSB0aGVyZSdzIGF0IGxlYXN0IG9uZSBjaGFubmVsLiAgU2hvdWxkIGFsd2F5cyBiZSB0cnVlIGhlcmUgYnkgdmlydHVlCi0gIC8vIG9mIG5vdCBiZWluZyBvbmUgb2YgdGhlIGludmFsaWQgbGF5b3V0cywgYnV0IGxldHMgZG91YmxlIGNoZWNrIHRvIGJlIHN1cmUuCi0gIGludCBjaGFubmVsX2NvdW50ID0gQ2hhbm5lbExheW91dFRvQ2hhbm5lbENvdW50KGxheW91dCk7Ci0gIERDSEVDS19HVChjaGFubmVsX2NvdW50LCAwKTsKLQotICAvLyBJZiB3ZSBoYXZlIG1vcmUgdGhhbiBvbmUgY2hhbm5lbCwgdmVyaWZ5IGEgc3ltbWV0cmljIGxheW91dCBmb3Igc2FuaXR5LgotICAvLyBUaGUgdW5pdCB0ZXN0IHdpbGwgdmVyaWZ5IGFsbCBwb3NzaWJsZSBsYXlvdXRzLCBzbyB0aGlzIGNhbiBiZSBhIERDSEVDSy4KLSAgLy8gU3ltbWV0cnkgYWxsb3dzIHNpbXBsaWZ5aW5nIHRoZSBtYXRyaXggYnVpbGRpbmcgY29kZSBieSBhbGxvd2luZyB1cyB0bwotICAvLyBhc3N1bWUgdGhhdCBpZiBvbmUgY2hhbm5lbCBvZiBhIHBhaXIgZXhpc3RzLCB0aGUgb3RoZXIgd2lsbCB0b28uCi0gIGlmIChjaGFubmVsX2NvdW50ID4gMSkgewotICAgIERDSEVDSygoQ2hhbm5lbE9yZGVyKGxheW91dCwgTEVGVCkgPj0gMCAmJgotICAgICAgICAgICAgQ2hhbm5lbE9yZGVyKGxheW91dCwgUklHSFQpID49IDApIHx8Ci0gICAgICAgICAgIChDaGFubmVsT3JkZXIobGF5b3V0LCBTSURFX0xFRlQpID49IDAgJiYKLSAgICAgICAgICAgIENoYW5uZWxPcmRlcihsYXlvdXQsIFNJREVfUklHSFQpID49IDApIHx8Ci0gICAgICAgICAgIChDaGFubmVsT3JkZXIobGF5b3V0LCBCQUNLX0xFRlQpID49IDAgJiYKLSAgICAgICAgICAgIENoYW5uZWxPcmRlcihsYXlvdXQsIEJBQ0tfUklHSFQpID49IDApIHx8Ci0gICAgICAgICAgIChDaGFubmVsT3JkZXIobGF5b3V0LCBMRUZUX09GX0NFTlRFUikgPj0gMCAmJgotICAgICAgICAgICAgQ2hhbm5lbE9yZGVyKGxheW91dCwgUklHSFRfT0ZfQ0VOVEVSKSA+PSAwKSkKLSAgICAgICAgPDwgIk5vbi1zeW1tZXRyaWMgY2hhbm5lbCBsYXlvdXQgZW5jb3VudGVyZWQuIjsKLSAgfSBlbHNlIHsKLSAgICBEQ0hFQ0tfRVEobGF5b3V0LCBDSEFOTkVMX0xBWU9VVF9NT05PKTsKLSAgfQotCi0gIHJldHVybiBjaGFubmVsX2NvdW50OwotfQotCi1DaGFubmVsTWl4ZXI6OkNoYW5uZWxNaXhlcihDaGFubmVsTGF5b3V0IGlucHV0LCBDaGFubmVsTGF5b3V0IG91dHB1dCkKLSAgICA6IGlucHV0X2xheW91dF8oaW5wdXQpLAotICAgICAgb3V0cHV0X2xheW91dF8ob3V0cHV0KSwKLSAgICAgIHJlbWFwcGluZ18oZmFsc2UpIHsKLSAgLy8gU3RlcmVvIGRvd24gbWl4IHNob3VsZCBuZXZlciBiZSB0aGUgb3V0cHV0IGxheW91dC4KLSAgQ0hFQ0tfTkUob3V0cHV0X2xheW91dF8sIENIQU5ORUxfTEFZT1VUX1NURVJFT19ET1dOTUlYKTsKLQotICBpbnQgaW5wdXRfY2hhbm5lbHMgPSBWYWxpZGF0ZUxheW91dChpbnB1dF9sYXlvdXRfKTsKLSAgaW50IG91dHB1dF9jaGFubmVscyA9IFZhbGlkYXRlTGF5b3V0KG91dHB1dF9sYXlvdXRfKTsKLQotICAvLyBTaXplIG91dCB0aGUgaW5pdGlhbCBtYXRyaXguCi0gIG1hdHJpeF8ucmVzZXJ2ZShvdXRwdXRfY2hhbm5lbHMpOwotICBmb3IgKGludCBvdXRwdXRfY2ggPSAwOyBvdXRwdXRfY2ggPCBvdXRwdXRfY2hhbm5lbHM7ICsrb3V0cHV0X2NoKQotICAgIG1hdHJpeF8ucHVzaF9iYWNrKHN0ZDo6dmVjdG9yPGZsb2F0PihpbnB1dF9jaGFubmVscywgMCkpOwotCi0gIC8vIFJvdXRlIG1hdGNoaW5nIGNoYW5uZWxzIGFuZCBmaWd1cmUgb3V0IHdoaWNoIG9uZXMgYXJlbid0IGFjY291bnRlZCBmb3IuCi0gIGZvciAoQ2hhbm5lbHMgY2ggPSBMRUZUOyBjaCA8IENIQU5ORUxTX01BWDsKLSAgICAgICBjaCA9IHN0YXRpY19jYXN0PENoYW5uZWxzPihjaCArIDEpKSB7Ci0gICAgaW50IGlucHV0X2NoX2luZGV4ID0gQ2hhbm5lbE9yZGVyKGlucHV0X2xheW91dF8sIGNoKTsKLSAgICBpbnQgb3V0cHV0X2NoX2luZGV4ID0gQ2hhbm5lbE9yZGVyKG91dHB1dF9sYXlvdXRfLCBjaCk7Ci0KLSAgICBpZiAoaW5wdXRfY2hfaW5kZXggPCAwKQotICAgICAgY29udGludWU7Ci0KLSAgICBpZiAob3V0cHV0X2NoX2luZGV4IDwgMCkgewotICAgICAgdW5hY2NvdW50ZWRfaW5wdXRzXy5wdXNoX2JhY2soY2gpOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgRENIRUNLX0xUKHN0YXRpY19jYXN0PHNpemVfdD4ob3V0cHV0X2NoX2luZGV4KSwgbWF0cml4Xy5zaXplKCkpOwotICAgIERDSEVDS19MVChzdGF0aWNfY2FzdDxzaXplX3Q+KGlucHV0X2NoX2luZGV4KSwKLSAgICAgICAgICAgICAgbWF0cml4X1tvdXRwdXRfY2hfaW5kZXhdLnNpemUoKSk7Ci0gICAgbWF0cml4X1tvdXRwdXRfY2hfaW5kZXhdW2lucHV0X2NoX2luZGV4XSA9IDE7Ci0gIH0KLQotICAvLyBJZiBhbGwgaW5wdXQgY2hhbm5lbHMgYXJlIGFjY291bnRlZCBmb3IsIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvLgotICBpZiAodW5hY2NvdW50ZWRfaW5wdXRzXy5lbXB0eSgpKSB7Ci0gICAgLy8gU2luY2UgYWxsIG91dHB1dCBjaGFubmVscyBtYXAgZGlyZWN0bHkgdG8gaW5wdXRzIHdlIGNhbiBvcHRpbWl6ZS4KLSAgICByZW1hcHBpbmdfID0gdHJ1ZTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBNaXggZnJvbnQgTFIgaW50byBjZW50ZXIuCi0gIGlmIChJc1VuYWNjb3VudGVkKExFRlQpKSB7Ci0gICAgLy8gV2hlbiBkb3duIG1peGluZyB0byBtb25vIGZyb20gc3RlcmVvLCB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwgb2YgZnVsbCBzY2FsZQotICAgIC8vIHN0ZXJlbyBtaXhlcy4gIFNjYWxpbmcgYnkgMSAvIHNxcnQoMikgaGVyZSB3aWxsIGxpa2VseSBsZWFkIHRvIGNsaXBwaW5nCi0gICAgLy8gc28gd2UgdXNlIDEgLyAyIGluc3RlYWQuCi0gICAgZmxvYXQgc2NhbGUgPSAob3V0cHV0ID09IENIQU5ORUxfTEFZT1VUX01PTk8gJiYgaW5wdXRfY2hhbm5lbHMgPT0gMikgPwotICAgICAgICAwLjUgOiBrRXF1YWxQb3dlclNjYWxlOwotICAgIE1peChMRUZULCBDRU5URVIsIHNjYWxlKTsKLSAgICBNaXgoUklHSFQsIENFTlRFUiwgc2NhbGUpOwotICB9Ci0KLSAgLy8gTWl4IGNlbnRlciBpbnRvIGZyb250IExSLgotICBpZiAoSXNVbmFjY291bnRlZChDRU5URVIpKSB7Ci0gICAgLy8gV2hlbiB1cCBtaXhpbmcgZnJvbSBtb25vLCBqdXN0IGRvIGEgY29weSB0byBmcm9udCBMUi4KLSAgICBmbG9hdCBzY2FsZSA9IChpbnB1dCA9PSBDSEFOTkVMX0xBWU9VVF9NT05PKSA/IDEgOiBrRXF1YWxQb3dlclNjYWxlOwotICAgIE1peFdpdGhvdXRBY2NvdW50aW5nKENFTlRFUiwgTEVGVCwgc2NhbGUpOwotICAgIE1peChDRU5URVIsIFJJR0hULCBzY2FsZSk7Ci0gIH0KLQotICAvLyBNaXggYmFjayBMUiBpbnRvOiBzaWRlIExSIHx8IGJhY2sgY2VudGVyIHx8IGZyb250IExSIHx8IGZyb250IGNlbnRlci4KLSAgaWYgKElzVW5hY2NvdW50ZWQoQkFDS19MRUZUKSkgewotICAgIGlmIChIYXNPdXRwdXRDaGFubmVsKFNJREVfTEVGVCkpIHsKLSAgICAgIC8vIElmIHdlIGhhdmUgc2lkZSBMUiwgbWl4IGJhY2sgTFIgaW50byBzaWRlIExSLCBidXQgaW5zdGVhZCBpZiB0aGUgaW5wdXQKLSAgICAgIC8vIGRvZXNuJ3QgaGF2ZSBzaWRlIExSIChidXQgb3V0cHV0IGRvZXMpIGNvcHkgYmFjayBMUiB0byBzaWRlIExSLgotICAgICAgZmxvYXQgc2NhbGUgPSBIYXNJbnB1dENoYW5uZWwoU0lERV9MRUZUKSA/IGtFcXVhbFBvd2VyU2NhbGUgOiAxOwotICAgICAgTWl4KEJBQ0tfTEVGVCwgU0lERV9MRUZULCBzY2FsZSk7Ci0gICAgICBNaXgoQkFDS19SSUdIVCwgU0lERV9SSUdIVCwgc2NhbGUpOwotICAgIH0gZWxzZSBpZiAoSGFzT3V0cHV0Q2hhbm5lbChCQUNLX0NFTlRFUikpIHsKLSAgICAgIC8vIE1peCBiYWNrIExSIGludG8gYmFjayBjZW50ZXIuCi0gICAgICBNaXgoQkFDS19MRUZULCBCQUNLX0NFTlRFUiwga0VxdWFsUG93ZXJTY2FsZSk7Ci0gICAgICBNaXgoQkFDS19SSUdIVCwgQkFDS19DRU5URVIsIGtFcXVhbFBvd2VyU2NhbGUpOwotICAgIH0gZWxzZSBpZiAob3V0cHV0ID4gQ0hBTk5FTF9MQVlPVVRfTU9OTykgewotICAgICAgLy8gTWl4IGJhY2sgTFIgaW50byBmcm9udCBMUi4KLSAgICAgIE1peChCQUNLX0xFRlQsIExFRlQsIGtFcXVhbFBvd2VyU2NhbGUpOwotICAgICAgTWl4KEJBQ0tfUklHSFQsIFJJR0hULCBrRXF1YWxQb3dlclNjYWxlKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gTWl4IGJhY2sgTFIgaW50byBmcm9udCBjZW50ZXIuCi0gICAgICBNaXgoQkFDS19MRUZULCBDRU5URVIsIGtFcXVhbFBvd2VyU2NhbGUpOwotICAgICAgTWl4KEJBQ0tfUklHSFQsIENFTlRFUiwga0VxdWFsUG93ZXJTY2FsZSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gTWl4IHNpZGUgTFIgaW50bzogYmFjayBMUiB8fCBiYWNrIGNlbnRlciB8fCBmcm9udCBMUiB8fCBmcm9udCBjZW50ZXIuCi0gIGlmIChJc1VuYWNjb3VudGVkKFNJREVfTEVGVCkpIHsKLSAgICBpZiAoSGFzT3V0cHV0Q2hhbm5lbChCQUNLX0xFRlQpKSB7Ci0gICAgICAvLyBJZiB3ZSBoYXZlIGJhY2sgTFIsIG1peCBzaWRlIExSIGludG8gYmFjayBMUiwgYnV0IGluc3RlYWQgaWYgdGhlIGlucHV0Ci0gICAgICAvLyBkb2Vzbid0IGhhdmUgYmFjayBMUiAoYnV0IG91dHB1dCBkb2VzKSBjb3B5IHNpZGUgTFIgdG8gYmFjayBMUi4KLSAgICAgIGZsb2F0IHNjYWxlID0gSGFzSW5wdXRDaGFubmVsKEJBQ0tfTEVGVCkgPyBrRXF1YWxQb3dlclNjYWxlIDogMTsKLSAgICAgIE1peChTSURFX0xFRlQsIEJBQ0tfTEVGVCwgc2NhbGUpOwotICAgICAgTWl4KFNJREVfUklHSFQsIEJBQ0tfUklHSFQsIHNjYWxlKTsKLSAgICB9IGVsc2UgaWYgKEhhc091dHB1dENoYW5uZWwoQkFDS19DRU5URVIpKSB7Ci0gICAgICAvLyBNaXggc2lkZSBMUiBpbnRvIGJhY2sgY2VudGVyLgotICAgICAgTWl4KFNJREVfTEVGVCwgQkFDS19DRU5URVIsIGtFcXVhbFBvd2VyU2NhbGUpOwotICAgICAgTWl4KFNJREVfUklHSFQsIEJBQ0tfQ0VOVEVSLCBrRXF1YWxQb3dlclNjYWxlKTsKLSAgICB9IGVsc2UgaWYgKG91dHB1dCA+IENIQU5ORUxfTEFZT1VUX01PTk8pIHsKLSAgICAgIC8vIE1peCBzaWRlIExSIGludG8gZnJvbnQgTFIuCi0gICAgICBNaXgoU0lERV9MRUZULCBMRUZULCBrRXF1YWxQb3dlclNjYWxlKTsKLSAgICAgIE1peChTSURFX1JJR0hULCBSSUdIVCwga0VxdWFsUG93ZXJTY2FsZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIE1peCBzaWRlIExSIGludG8gZnJvbnQgY2VudGVyLgotICAgICAgTWl4KFNJREVfTEVGVCwgQ0VOVEVSLCBrRXF1YWxQb3dlclNjYWxlKTsKLSAgICAgIE1peChTSURFX1JJR0hULCBDRU5URVIsIGtFcXVhbFBvd2VyU2NhbGUpOwotICAgIH0KLSAgfQotCi0gIC8vIE1peCBiYWNrIGNlbnRlciBpbnRvOiBiYWNrIExSIHx8IHNpZGUgTFIgfHwgZnJvbnQgTFIgfHwgZnJvbnQgY2VudGVyLgotICBpZiAoSXNVbmFjY291bnRlZChCQUNLX0NFTlRFUikpIHsKLSAgICBpZiAoSGFzT3V0cHV0Q2hhbm5lbChCQUNLX0xFRlQpKSB7Ci0gICAgICAvLyBNaXggYmFjayBjZW50ZXIgaW50byBiYWNrIExSLgotICAgICAgTWl4V2l0aG91dEFjY291bnRpbmcoQkFDS19DRU5URVIsIEJBQ0tfTEVGVCwga0VxdWFsUG93ZXJTY2FsZSk7Ci0gICAgICBNaXgoQkFDS19DRU5URVIsIEJBQ0tfUklHSFQsIGtFcXVhbFBvd2VyU2NhbGUpOwotICAgIH0gZWxzZSBpZiAoSGFzT3V0cHV0Q2hhbm5lbChTSURFX0xFRlQpKSB7Ci0gICAgICAvLyBNaXggYmFjayBjZW50ZXIgaW50byBzaWRlIExSLgotICAgICAgTWl4V2l0aG91dEFjY291bnRpbmcoQkFDS19DRU5URVIsIFNJREVfTEVGVCwga0VxdWFsUG93ZXJTY2FsZSk7Ci0gICAgICBNaXgoQkFDS19DRU5URVIsIFNJREVfUklHSFQsIGtFcXVhbFBvd2VyU2NhbGUpOwotICAgIH0gZWxzZSBpZiAob3V0cHV0ID4gQ0hBTk5FTF9MQVlPVVRfTU9OTykgewotICAgICAgLy8gTWl4IGJhY2sgY2VudGVyIGludG8gZnJvbnQgTFIuCi0gICAgICAvLyBUT0RPKGRhbGVjdXJ0aXMpOiBOb3Qgc3VyZSBhYm91dCB0aGVzZSB2YWx1ZXM/Ci0gICAgICBNaXhXaXRob3V0QWNjb3VudGluZyhCQUNLX0NFTlRFUiwgTEVGVCwga0VxdWFsUG93ZXJTY2FsZSk7Ci0gICAgICBNaXgoQkFDS19DRU5URVIsIFJJR0hULCBrRXF1YWxQb3dlclNjYWxlKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gTWl4IGJhY2sgY2VudGVyIGludG8gZnJvbnQgY2VudGVyLgotICAgICAgLy8gVE9ETyhkYWxlY3VydGlzKTogTm90IHN1cmUgYWJvdXQgdGhlc2UgdmFsdWVzPwotICAgICAgTWl4KEJBQ0tfQ0VOVEVSLCBDRU5URVIsIGtFcXVhbFBvd2VyU2NhbGUpOwotICAgIH0KLSAgfQotCi0gIC8vIE1peCBMUiBvZiBjZW50ZXIgaW50bzogZnJvbnQgY2VudGVyIHx8IGZyb250IExSLgotICBpZiAoSXNVbmFjY291bnRlZChMRUZUX09GX0NFTlRFUikpIHsKLSAgICBpZiAoSGFzT3V0cHV0Q2hhbm5lbChMRUZUKSkgewotICAgICAgLy8gTWl4IExSIG9mIGNlbnRlciBpbnRvIGZyb250IExSLgotICAgICAgTWl4KExFRlRfT0ZfQ0VOVEVSLCBMRUZULCBrRXF1YWxQb3dlclNjYWxlKTsKLSAgICAgIE1peChSSUdIVF9PRl9DRU5URVIsIFJJR0hULCBrRXF1YWxQb3dlclNjYWxlKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gTWl4IExSIG9mIGNlbnRlciBpbnRvIGZyb250IGNlbnRlci4KLSAgICAgIE1peChMRUZUX09GX0NFTlRFUiwgQ0VOVEVSLCBrRXF1YWxQb3dlclNjYWxlKTsKLSAgICAgIE1peChSSUdIVF9PRl9DRU5URVIsIENFTlRFUiwga0VxdWFsUG93ZXJTY2FsZSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gTWl4IExGRSBpbnRvOiBmcm9udCBMUiB8fCBmcm9udCBjZW50ZXIuCi0gIGlmIChJc1VuYWNjb3VudGVkKExGRSkpIHsKLSAgICBpZiAoIUhhc091dHB1dENoYW5uZWwoQ0VOVEVSKSkgewotICAgICAgLy8gTWl4IExGRSBpbnRvIGZyb250IExSLgotICAgICAgTWl4V2l0aG91dEFjY291bnRpbmcoTEZFLCBMRUZULCBrRXF1YWxQb3dlclNjYWxlKTsKLSAgICAgIE1peChMRkUsIFJJR0hULCBrRXF1YWxQb3dlclNjYWxlKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gTWl4IExGRSBpbnRvIGZyb250IGNlbnRlci4KLSAgICAgIE1peChMRkUsIENFTlRFUiwga0VxdWFsUG93ZXJTY2FsZSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gQWxsIGNoYW5uZWxzIHNob3VsZCBub3cgYmUgYWNjb3VudGVkIGZvci4KLSAgRENIRUNLKHVuYWNjb3VudGVkX2lucHV0c18uZW1wdHkoKSk7Ci0KLSAgLy8gU2VlIGlmIHRoZSBvdXRwdXQgfG1hdHJpeF98IGlzIHNpbXBseSBhIHJlbWFwcGluZyBtYXRyaXguICBJZiBlYWNoIGlucHV0Ci0gIC8vIGNoYW5uZWwgbWFwcyB0byBhIHNpbmdsZSBvdXRwdXQgY2hhbm5lbCB3ZSBjYW4gc2ltcGx5IHJlbWFwLiAgRG9pbmcgdGhpcwotICAvLyBwcm9ncmFtbWF0aWNhbGx5IGlzIGxlc3MgZnJhZ2lsZSB0aGFuIGxvZ2ljIGNoZWNrcyBvbiBjaGFubmVsIG1hcHBpbmdzLgotICBmb3IgKGludCBvdXRwdXRfY2ggPSAwOyBvdXRwdXRfY2ggPCBvdXRwdXRfY2hhbm5lbHM7ICsrb3V0cHV0X2NoKSB7Ci0gICAgaW50IGlucHV0X21hcHBpbmdzID0gMDsKLSAgICBmb3IgKGludCBpbnB1dF9jaCA9IDA7IGlucHV0X2NoIDwgaW5wdXRfY2hhbm5lbHM7ICsraW5wdXRfY2gpIHsKLSAgICAgIC8vIFdlIGNhbiBvbmx5IHJlbWFwIGlmIGVhY2ggcm93IGNvbnRhaW5zIGEgc2luZ2xlIHNjYWxlIG9mIDEuICBJLmUuLCBlYWNoCi0gICAgICAvLyBvdXRwdXQgY2hhbm5lbCBpcyBtYXBwZWQgZnJvbSBhIHNpbmdsZSB1bnNjYWxlZCBpbnB1dCBjaGFubmVsLgotICAgICAgaWYgKG1hdHJpeF9bb3V0cHV0X2NoXVtpbnB1dF9jaF0gIT0gMSB8fCArK2lucHV0X21hcHBpbmdzID4gMSkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotCi0gIC8vIElmIHdlJ3ZlIGdvdHRlbiBoZXJlLCB8bWF0cml4X3wgaXMgc2ltcGx5IGEgcmVtYXBwaW5nLgotICByZW1hcHBpbmdfID0gdHJ1ZTsKLX0KLQotQ2hhbm5lbE1peGVyOjp+Q2hhbm5lbE1peGVyKCkge30KLQotdm9pZCBDaGFubmVsTWl4ZXI6OlRyYW5zZm9ybShjb25zdCBBdWRpb0J1cyogaW5wdXQsIEF1ZGlvQnVzKiBvdXRwdXQpIHsKLSAgQ0hFQ0tfRVEobWF0cml4Xy5zaXplKCksIHN0YXRpY19jYXN0PHNpemVfdD4ob3V0cHV0LT5jaGFubmVscygpKSk7Ci0gIENIRUNLX0VRKG1hdHJpeF9bMF0uc2l6ZSgpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KGlucHV0LT5jaGFubmVscygpKSk7Ci0gIENIRUNLX0VRKGlucHV0LT5mcmFtZXMoKSwgb3V0cHV0LT5mcmFtZXMoKSk7Ci0KLSAgLy8gWmVybyBpbml0aWFsaXplIHxvdXRwdXR8IHNvIHdlJ3JlIGFjY3VtdWxhdGluZyBmcm9tIHplcm8uCi0gIG91dHB1dC0+WmVybygpOwotCi0gIC8vIElmIHdlJ3JlIGp1c3QgcmVtYXBwaW5nIHdlIGNhbiBzaW1wbHkgY29weSB0aGUgY29ycmVjdCBpbnB1dCB0byBvdXRwdXQuCi0gIGlmIChyZW1hcHBpbmdfKSB7Ci0gICAgZm9yIChpbnQgb3V0cHV0X2NoID0gMDsgb3V0cHV0X2NoIDwgb3V0cHV0LT5jaGFubmVscygpOyArK291dHB1dF9jaCkgewotICAgICAgZm9yIChpbnQgaW5wdXRfY2ggPSAwOyBpbnB1dF9jaCA8IGlucHV0LT5jaGFubmVscygpOyArK2lucHV0X2NoKSB7Ci0gICAgICAgIGZsb2F0IHNjYWxlID0gbWF0cml4X1tvdXRwdXRfY2hdW2lucHV0X2NoXTsKLSAgICAgICAgaWYgKHNjYWxlID4gMCkgewotICAgICAgICAgIERDSEVDS19FUShzY2FsZSwgMS4wZik7Ci0gICAgICAgICAgbWVtY3B5KG91dHB1dC0+Y2hhbm5lbChvdXRwdXRfY2gpLCBpbnB1dC0+Y2hhbm5lbChpbnB1dF9jaCksCi0gICAgICAgICAgICAgICAgIHNpemVvZigqb3V0cHV0LT5jaGFubmVsKG91dHB1dF9jaCkpICogb3V0cHV0LT5mcmFtZXMoKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZm9yIChpbnQgb3V0cHV0X2NoID0gMDsgb3V0cHV0X2NoIDwgb3V0cHV0LT5jaGFubmVscygpOyArK291dHB1dF9jaCkgewotICAgIGZvciAoaW50IGlucHV0X2NoID0gMDsgaW5wdXRfY2ggPCBpbnB1dC0+Y2hhbm5lbHMoKTsgKytpbnB1dF9jaCkgewotICAgICAgZmxvYXQgc2NhbGUgPSBtYXRyaXhfW291dHB1dF9jaF1baW5wdXRfY2hdOwotICAgICAgLy8gU2NhbGUgc2hvdWxkIGFsd2F5cyBiZSBwb3NpdGl2ZS4gIERvbid0IGJvdGhlciBzY2FsaW5nIGJ5IHplcm8uCi0gICAgICBEQ0hFQ0tfR0Uoc2NhbGUsIDApOwotICAgICAgaWYgKHNjYWxlID4gMCkgewotICAgICAgICB2ZWN0b3JfbWF0aDo6Rk1BQyhpbnB1dC0+Y2hhbm5lbChpbnB1dF9jaCksIHNjYWxlLCBvdXRwdXQtPmZyYW1lcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQtPmNoYW5uZWwob3V0cHV0X2NoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ2hhbm5lbE1peGVyOjpBY2NvdW50Rm9yKENoYW5uZWxzIGNoKSB7Ci0gIHVuYWNjb3VudGVkX2lucHV0c18uZXJhc2Uoc3RkOjpmaW5kKAotICAgICAgdW5hY2NvdW50ZWRfaW5wdXRzXy5iZWdpbigpLCB1bmFjY291bnRlZF9pbnB1dHNfLmVuZCgpLCBjaCkpOwotfQotCi1ib29sIENoYW5uZWxNaXhlcjo6SXNVbmFjY291bnRlZChDaGFubmVscyBjaCkgewotICByZXR1cm4gc3RkOjpmaW5kKHVuYWNjb3VudGVkX2lucHV0c18uYmVnaW4oKSwgdW5hY2NvdW50ZWRfaW5wdXRzXy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICBjaCkgIT0gdW5hY2NvdW50ZWRfaW5wdXRzXy5lbmQoKTsKLX0KLQotYm9vbCBDaGFubmVsTWl4ZXI6Okhhc0lucHV0Q2hhbm5lbChDaGFubmVscyBjaCkgewotICByZXR1cm4gQ2hhbm5lbE9yZGVyKGlucHV0X2xheW91dF8sIGNoKSA+PSAwOwotfQotCi1ib29sIENoYW5uZWxNaXhlcjo6SGFzT3V0cHV0Q2hhbm5lbChDaGFubmVscyBjaCkgewotICByZXR1cm4gQ2hhbm5lbE9yZGVyKG91dHB1dF9sYXlvdXRfLCBjaCkgPj0gMDsKLX0KLQotdm9pZCBDaGFubmVsTWl4ZXI6Ok1peChDaGFubmVscyBpbnB1dF9jaCwgQ2hhbm5lbHMgb3V0cHV0X2NoLCBmbG9hdCBzY2FsZSkgewotICBNaXhXaXRob3V0QWNjb3VudGluZyhpbnB1dF9jaCwgb3V0cHV0X2NoLCBzY2FsZSk7Ci0gIEFjY291bnRGb3IoaW5wdXRfY2gpOwotfQotCi12b2lkIENoYW5uZWxNaXhlcjo6TWl4V2l0aG91dEFjY291bnRpbmcoQ2hhbm5lbHMgaW5wdXRfY2gsIENoYW5uZWxzIG91dHB1dF9jaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzY2FsZSkgewotICBpbnQgaW5wdXRfY2hfaW5kZXggPSBDaGFubmVsT3JkZXIoaW5wdXRfbGF5b3V0XywgaW5wdXRfY2gpOwotICBpbnQgb3V0cHV0X2NoX2luZGV4ID0gQ2hhbm5lbE9yZGVyKG91dHB1dF9sYXlvdXRfLCBvdXRwdXRfY2gpOwotCi0gIERDSEVDSyhJc1VuYWNjb3VudGVkKGlucHV0X2NoKSk7Ci0gIERDSEVDS19HRShpbnB1dF9jaF9pbmRleCwgMCk7Ci0gIERDSEVDS19HRShvdXRwdXRfY2hfaW5kZXgsIDApOwotCi0gIERDSEVDS19FUShtYXRyaXhfW291dHB1dF9jaF9pbmRleF1baW5wdXRfY2hfaW5kZXhdLCAwKTsKLSAgbWF0cml4X1tvdXRwdXRfY2hfaW5kZXhdW2lucHV0X2NoX2luZGV4XSA9IHNjYWxlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2NoYW5uZWxfbWl4ZXIuaCBiL3NyYy9tZWRpYS9iYXNlL2NoYW5uZWxfbWl4ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZkY2MxOC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9jaGFubmVsX21peGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0JBU0VfQ0hBTk5FTF9NSVhFUl9IXwotI2RlZmluZSBNRURJQV9CQVNFX0NIQU5ORUxfTUlYRVJfSF8KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvY2hhbm5lbF9sYXlvdXQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBBdWRpb0J1czsKLQotLy8gQ2hhbm5lbE1peGVyIGlzIGZvciBjb252ZXJ0aW5nIGF1ZGlvIGJldHdlZW4gY2hhbm5lbCBsYXlvdXRzLiAgVGhlIGNvbnZlcnNpb24KLS8vIG1hdHJpeCBpcyBidWlsdCB1cG9uIGNvbnN0cnVjdGlvbiBhbmQgdXNlZCBkdXJpbmcgZWFjaCBUcmFuc2Zvcm0oKSBjYWxsLiAgVGhlCi0vLyBhbGdvcml0aG0gd29ya3MgYnkgZ2VuZXJhdGluZyBhIGNvbnZlcnNpb24gbWF0cml4IG1hcHBpbmcgZWFjaCBvdXRwdXQgY2hhbm5lbAotLy8gdG8gbGlzdCBvZiBpbnB1dCBjaGFubmVscy4gIFRoZSB0cmFuc2Zvcm0gcmVuZGVycyBhbGwgb2YgdGhlIG91dHB1dCBjaGFubmVscywKLS8vIHdpdGggZWFjaCBvdXRwdXQgY2hhbm5lbCByZW5kZXJlZCBhY2NvcmRpbmcgdG8gYSB3ZWlnaHRlZCBzdW0gb2YgdGhlIHJlbGV2YW50Ci0vLyBpbnB1dCBjaGFubmVscyBhcyBkZWZpbmVkIGluIHRoZSBtYXRyaXguCi1jbGFzcyBNRURJQV9FWFBPUlQgQ2hhbm5lbE1peGVyIHsKLSBwdWJsaWM6Ci0gIENoYW5uZWxNaXhlcihDaGFubmVsTGF5b3V0IGlucHV0LCBDaGFubmVsTGF5b3V0IG91dHB1dCk7Ci0gIH5DaGFubmVsTWl4ZXIoKTsKLQotICAvLyBUcmFuc2Zvcm1zIGFsbCBjaGFubmVscyBmcm9tIHxpbnB1dHwgaW50byB8b3V0cHV0fCBjaGFubmVscy4KLSAgdm9pZCBUcmFuc2Zvcm0oY29uc3QgQXVkaW9CdXMqIGlucHV0LCBBdWRpb0J1cyogb3V0cHV0KTsKLQotIHByaXZhdGU6Ci0gIC8vIENvbnN0cnVjdG9yIGhlbHBlciBtZXRob2RzIGZvciBtYW5hZ2luZyB1bmFjY291bnRlZCBpbnB1dCBjaGFubmVscy4KLSAgdm9pZCBBY2NvdW50Rm9yKENoYW5uZWxzIGNoKTsKLSAgYm9vbCBJc1VuYWNjb3VudGVkKENoYW5uZWxzIGNoKTsKLQotICAvLyBIZWxwZXIgbWV0aG9kcyBmb3IgY2hlY2tpbmcgaWYgfGNofCBleGlzdHMgaW4gZWl0aGVyIHxpbnB1dF9sYXlvdXRffCBvcgotICAvLyB8b3V0cHV0X2xheW91dF98IHJlc3BlY3RpdmVseS4KLSAgYm9vbCBIYXNJbnB1dENoYW5uZWwoQ2hhbm5lbHMgY2gpOwotICBib29sIEhhc091dHB1dENoYW5uZWwoQ2hhbm5lbHMgY2gpOwotCi0gIC8vIENvbnN0cnVjdG9yIGhlbHBlciBtZXRob2RzIGZvciB1cGRhdGluZyB8bWF0cml4X3wgd2l0aCB0aGUgcHJvcGVyIHZhbHVlIGZvcgotICAvLyBtaXhpbmcgfGlucHV0X2NofCBpbnRvIHxvdXRwdXRfY2h8LiAgTWl4V2l0aG91dEFjY291bnRpbmcoKSBkb2VzIG5vdCByZW1vdmUKLSAgLy8gdGhlIGNoYW5uZWwgZnJvbSB8dW5hY2NvdW50ZWRfaW5wdXRzX3wuCi0gIHZvaWQgTWl4KENoYW5uZWxzIGlucHV0X2NoLCBDaGFubmVscyBvdXRwdXRfY2gsIGZsb2F0IHNjYWxlKTsKLSAgdm9pZCBNaXhXaXRob3V0QWNjb3VudGluZyhDaGFubmVscyBpbnB1dF9jaCwgQ2hhbm5lbHMgb3V0cHV0X2NoLCBmbG9hdCBzY2FsZSk7Ci0KLSAgLy8gSW5wdXQgYW5kIG91dHB1dCBjaGFubmVsIGxheW91dCBwcm92aWRlZCBkdXJpbmcgY29uc3RydWN0aW9uLgotICBDaGFubmVsTGF5b3V0IGlucHV0X2xheW91dF87Ci0gIENoYW5uZWxMYXlvdXQgb3V0cHV0X2xheW91dF87Ci0KLSAgLy8gSGVscGVyIHZhcmlhYmxlIGZvciB0cmFja2luZyB3aGljaCBpbnB1dHMgYXJlIGN1cnJlbnRseSB1bmFjY291bnRlZCwgc2hvdWxkCi0gIC8vIGJlIGVtcHR5IGFmdGVyIGNvbnN0cnVjdGlvbiBjb21wbGV0ZXMuCi0gIHN0ZDo6dmVjdG9yPENoYW5uZWxzPiB1bmFjY291bnRlZF9pbnB1dHNfOwotCi0gIC8vIDJEIG1hdHJpeCBvZiBvdXRwdXQgY2hhbm5lbHMgdG8gaW5wdXQgY2hhbm5lbHMuCi0gIHN0ZDo6dmVjdG9yPCBzdGQ6OnZlY3RvcjxmbG9hdD4gPiBtYXRyaXhfOwotCi0gIC8vIE9wdGltaXphdGlvbiBjYXNlIGZvciB3aGVuIHdlIGNhbiBzaW1wbHkgcmVtYXAgdGhlIGlucHV0IGNoYW5uZWxzIHRvIG91dHB1dAotICAvLyBjaGFubmVscyBhbmQgZG9uJ3QgbmVlZCB0byBkbyBhIG11bHRpcGx5LWFjY3VtdWxhdGUgbG9vcCBvdmVyIHxtYXRyaXhffC4KLSAgYm9vbCByZW1hcHBpbmdfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihDaGFubmVsTWl4ZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQkFTRV9DSEFOTkVMX01JWEVSX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9jaGFubmVsX21peGVyX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2Jhc2UvY2hhbm5lbF9taXhlcl91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcxZjg2Yi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9jaGFubmVsX21peGVyX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE1TVkMrKyByZXF1aXJlcyB0aGlzIHRvIGJlIHNldCBiZWZvcmUgYW55IG90aGVyIGluY2x1ZGVzIHRvIGdldCBNX1NRUlQxXzIuCi0jZGVmaW5lIF9VU0VfTUFUSF9ERUZJTkVTCi0KLSNpbmNsdWRlIDxjbWF0aD4KLQotI2luY2x1ZGUgImJhc2Uvc3RyaW5ncHJpbnRmLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19idXMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2NoYW5uZWxfbWl4ZXIuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gTnVtYmVyIG9mIGZyYW1lcyB0byB0ZXN0IHdpdGguCi1lbnVtIHsga0ZyYW1lcyA9IDE2IH07Ci0KLS8vIFRlc3QgYWxsIHBvc3NpYmxlIGxheW91dCBjb252ZXJzaW9ucyBjYW4gYmUgY29uc3RydWN0ZWQgYW5kIG1peGVkLgotVEVTVChDaGFubmVsTWl4ZXJUZXN0LCBDb25zdHJ1Y3RBbGxQb3NzaWJsZUxheW91dHMpIHsKLSAgZm9yIChDaGFubmVsTGF5b3V0IGlucHV0X2xheW91dCA9IENIQU5ORUxfTEFZT1VUX01PTk87Ci0gICAgICAgaW5wdXRfbGF5b3V0IDwgQ0hBTk5FTF9MQVlPVVRfTUFYOwotICAgICAgIGlucHV0X2xheW91dCA9IHN0YXRpY19jYXN0PENoYW5uZWxMYXlvdXQ+KGlucHV0X2xheW91dCArIDEpKSB7Ci0gICAgZm9yIChDaGFubmVsTGF5b3V0IG91dHB1dF9sYXlvdXQgPSBDSEFOTkVMX0xBWU9VVF9NT05POwotICAgICAgICAgb3V0cHV0X2xheW91dCA8IENIQU5ORUxfTEFZT1VUX1NURVJFT19ET1dOTUlYOwotICAgICAgICAgb3V0cHV0X2xheW91dCA9IHN0YXRpY19jYXN0PENoYW5uZWxMYXlvdXQ+KG91dHB1dF9sYXlvdXQgKyAxKSkgewotICAgICAgU0NPUEVEX1RSQUNFKGJhc2U6OlN0cmluZ1ByaW50ZigKLSAgICAgICAgICAiSW5wdXQgTGF5b3V0OiAlZCwgT3V0cHV0IExheW91dDogJWQiLCBpbnB1dF9sYXlvdXQsIG91dHB1dF9sYXlvdXQpKTsKLSAgICAgIENoYW5uZWxNaXhlciBtaXhlcihpbnB1dF9sYXlvdXQsIG91dHB1dF9sYXlvdXQpOwotICAgICAgc2NvcGVkX3B0cjxBdWRpb0J1cz4gaW5wdXRfYnVzID0gQXVkaW9CdXM6OkNyZWF0ZSgKLSAgICAgICAgICBDaGFubmVsTGF5b3V0VG9DaGFubmVsQ291bnQoaW5wdXRfbGF5b3V0KSwga0ZyYW1lcyk7Ci0gICAgICBzY29wZWRfcHRyPEF1ZGlvQnVzPiBvdXRwdXRfYnVzID0gQXVkaW9CdXM6OkNyZWF0ZSgKLSAgICAgICAgICBDaGFubmVsTGF5b3V0VG9DaGFubmVsQ291bnQob3V0cHV0X2xheW91dCksIGtGcmFtZXMpOwotICAgICAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IGlucHV0X2J1cy0+Y2hhbm5lbHMoKTsgKytjaCkKLSAgICAgICAgc3RkOjpmaWxsKGlucHV0X2J1cy0+Y2hhbm5lbChjaCksIGlucHV0X2J1cy0+Y2hhbm5lbChjaCkgKyBrRnJhbWVzLCAxKTsKLQotICAgICAgbWl4ZXIuVHJhbnNmb3JtKGlucHV0X2J1cy5nZXQoKSwgb3V0cHV0X2J1cy5nZXQoKSk7Ci0gICAgfQotICB9Ci19Ci0KLXN0cnVjdCBDaGFubmVsTWl4ZXJUZXN0RGF0YSB7Ci0gIENoYW5uZWxNaXhlclRlc3REYXRhKENoYW5uZWxMYXlvdXQgaW5wdXRfbGF5b3V0LCBDaGFubmVsTGF5b3V0IG91dHB1dF9sYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBjaGFubmVsX3ZhbHVlcywgaW50IG51bV9jaGFubmVsX3ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2NhbGUpCi0gICAgICA6IGlucHV0X2xheW91dChpbnB1dF9sYXlvdXQpLAotICAgICAgICBvdXRwdXRfbGF5b3V0KG91dHB1dF9sYXlvdXQpLAotICAgICAgICBjaGFubmVsX3ZhbHVlcyhjaGFubmVsX3ZhbHVlcyksCi0gICAgICAgIG51bV9jaGFubmVsX3ZhbHVlcyhudW1fY2hhbm5lbF92YWx1ZXMpLAotICAgICAgICBzY2FsZShzY2FsZSkgewotICB9Ci0KLSAgc3RkOjpzdHJpbmcgRGVidWdTdHJpbmcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGJhc2U6OlN0cmluZ1ByaW50ZigKLSAgICAgICAgIklucHV0IExheW91dDogJWQsIE91dHB1dCBMYXlvdXQgJWQsIFNjYWxlOiAlZiIsIGlucHV0X2xheW91dCwKLSAgICAgICAgb3V0cHV0X2xheW91dCwgc2NhbGUpOwotICB9Ci0KLSAgQ2hhbm5lbExheW91dCBpbnB1dF9sYXlvdXQ7Ci0gIENoYW5uZWxMYXlvdXQgb3V0cHV0X2xheW91dDsKLSAgZmxvYXQqIGNoYW5uZWxfdmFsdWVzOwotICBpbnQgbnVtX2NoYW5uZWxfdmFsdWVzOwotICBmbG9hdCBzY2FsZTsKLX07Ci0KLXN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDaGFubmVsTWl4ZXJUZXN0RGF0YSYgZGF0YSkgewotICByZXR1cm4gb3MgPDwgZGF0YS5EZWJ1Z1N0cmluZygpOwotfQotCi1jbGFzcyBDaGFubmVsTWl4ZXJUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08Q2hhbm5lbE1peGVyVGVzdERhdGE+IHt9OwotCi0vLyBWZXJpZnkgY2hhbm5lbHMgYXJlIG1peGVkIGFuZCBzY2FsZWQgY29ycmVjdGx5LiAgVGhlIHRlc3Qgb25seSB3b3JrcyBpZiBhbGwKLS8vIG91dHB1dCBjaGFubmVscyBoYXZlIHRoZSBzYW1lIHZhbHVlLgotVEVTVF9QKENoYW5uZWxNaXhlclRlc3QsIE1peGluZykgewotICBDaGFubmVsTGF5b3V0IGlucHV0X2xheW91dCA9IEdldFBhcmFtKCkuaW5wdXRfbGF5b3V0OwotICBDaGFubmVsTGF5b3V0IG91dHB1dF9sYXlvdXQgPSBHZXRQYXJhbSgpLm91dHB1dF9sYXlvdXQ7Ci0KLSAgQ2hhbm5lbE1peGVyIG1peGVyKGlucHV0X2xheW91dCwgb3V0cHV0X2xheW91dCk7Ci0gIHNjb3BlZF9wdHI8QXVkaW9CdXM+IGlucHV0X2J1cyA9IEF1ZGlvQnVzOjpDcmVhdGUoCi0gICAgICBDaGFubmVsTGF5b3V0VG9DaGFubmVsQ291bnQoaW5wdXRfbGF5b3V0KSwga0ZyYW1lcyk7Ci0gIHNjb3BlZF9wdHI8QXVkaW9CdXM+IG91dHB1dF9idXMgPSBBdWRpb0J1czo6Q3JlYXRlKAotICAgICAgQ2hhbm5lbExheW91dFRvQ2hhbm5lbENvdW50KG91dHB1dF9sYXlvdXQpLCBrRnJhbWVzKTsKLQotICBjb25zdCBmbG9hdCogY2hhbm5lbF92YWx1ZXMgPSBHZXRQYXJhbSgpLmNoYW5uZWxfdmFsdWVzOwotICBBU1NFUlRfRVEoaW5wdXRfYnVzLT5jaGFubmVscygpLCBHZXRQYXJhbSgpLm51bV9jaGFubmVsX3ZhbHVlcyk7Ci0KLSAgZmxvYXQgZXhwZWN0ZWRfdmFsdWUgPSAwOwotICBmbG9hdCBzY2FsZSA9IEdldFBhcmFtKCkuc2NhbGU7Ci0gIGZvciAoaW50IGNoID0gMDsgY2ggPCBpbnB1dF9idXMtPmNoYW5uZWxzKCk7ICsrY2gpIHsKLSAgICBzdGQ6OmZpbGwoaW5wdXRfYnVzLT5jaGFubmVsKGNoKSwgaW5wdXRfYnVzLT5jaGFubmVsKGNoKSArIGtGcmFtZXMsCi0gICAgICAgICAgICAgIGNoYW5uZWxfdmFsdWVzW2NoXSk7Ci0gICAgZXhwZWN0ZWRfdmFsdWUgKz0gY2hhbm5lbF92YWx1ZXNbY2hdICogc2NhbGU7Ci0gIH0KLQotICBtaXhlci5UcmFuc2Zvcm0oaW5wdXRfYnVzLmdldCgpLCBvdXRwdXRfYnVzLmdldCgpKTsKLQotICBmb3IgKGludCBjaCA9IDA7IGNoIDwgb3V0cHV0X2J1cy0+Y2hhbm5lbHMoKTsgKytjaCkgewotICAgIGZvciAoaW50IGZyYW1lID0gMDsgZnJhbWUgPCBvdXRwdXRfYnVzLT5mcmFtZXMoKTsgKytmcmFtZSkgewotICAgICAgQVNTRVJUX0ZMT0FUX0VRKG91dHB1dF9idXMtPmNoYW5uZWwoY2gpW2ZyYW1lXSwgZXhwZWN0ZWRfdmFsdWUpOwotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgZmxvYXQga1N0ZXJlb1RvTW9ub1ZhbHVlc1tdID0geyAwLjVmLCAwLjc1ZiB9Owotc3RhdGljIGZsb2F0IGtNb25vVG9TdGVyZW9WYWx1ZXNbXSA9IHsgMC41ZiB9OwotLy8gWmVybyB0aGUgY2VudGVyIGNoYW5uZWwgc2luY2UgaXQgd2lsbCBiZSBtaXhlZCBhdCBzY2FsZSAxIHZzIE1fU1FSVDFfMi4KLXN0YXRpYyBmbG9hdCBrRml2ZU9uZVRvTW9ub1ZhbHVlc1tdID0geyAwLjFmLCAwLjJmLCAwLjBmLCAwLjRmLCAwLjVmLCAwLjZmIH07Ci0KLS8vIFJ1biB0aHJvdWdoIGJhc2ljIHNhbml0eSB0ZXN0cyBmb3Igc29tZSBjb21tb24gY29udmVyc2lvbnMuCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChDaGFubmVsTWl4ZXJUZXN0LCBDaGFubmVsTWl4ZXJUZXN0LCB0ZXN0aW5nOjpWYWx1ZXMoCi0gICAgQ2hhbm5lbE1peGVyVGVzdERhdGEoQ0hBTk5FTF9MQVlPVVRfU1RFUkVPLCBDSEFOTkVMX0xBWU9VVF9NT05PLAotICAgICAgICAgICAgICAgICAgICAgICAgIGtTdGVyZW9Ub01vbm9WYWx1ZXMsIGFycmF5c2l6ZShrU3RlcmVvVG9Nb25vVmFsdWVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAwLjVmKSwKLSAgICBDaGFubmVsTWl4ZXJUZXN0RGF0YShDSEFOTkVMX0xBWU9VVF9NT05PLCBDSEFOTkVMX0xBWU9VVF9TVEVSRU8sCi0gICAgICAgICAgICAgICAgICAgICAgICAga01vbm9Ub1N0ZXJlb1ZhbHVlcywgYXJyYXlzaXplKGtNb25vVG9TdGVyZW9WYWx1ZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgIDEuMGYpLAotICAgIENoYW5uZWxNaXhlclRlc3REYXRhKENIQU5ORUxfTEFZT1VUXzVfMSwgQ0hBTk5FTF9MQVlPVVRfTU9OTywKLSAgICAgICAgICAgICAgICAgICAgICAgICBrRml2ZU9uZVRvTW9ub1ZhbHVlcywgYXJyYXlzaXplKGtGaXZlT25lVG9Nb25vVmFsdWVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4oTV9TUVJUMV8yKSkKLSkpOwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2Nsb2NrLmNjIGIvc3JjL21lZGlhL2Jhc2UvY2xvY2suY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MzJmOTEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvY2xvY2suY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvY2xvY2suaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYnVmZmVycy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1DbG9jazo6Q2xvY2soVGltZVByb3ZpZGVyKiB0aW1lX3Byb3ZpZGVyKQotICAgIDogdGltZV9wcm92aWRlcl8odGltZV9wcm92aWRlcikgewotICBSZXNldCgpOwotfQotCi1DbG9jazo6fkNsb2NrKCkge30KLQotYm9vbCBDbG9jazo6SXNQbGF5aW5nKCkgY29uc3QgewotICByZXR1cm4gcGxheWluZ187Ci19Ci0KLWJhc2U6OlRpbWVEZWx0YSBDbG9jazo6UGxheSgpIHsKLSAgRENIRUNLKCFwbGF5aW5nXyk7Ci0gIFVwZGF0ZVJlZmVyZW5jZVBvaW50cygpOwotICBwbGF5aW5nXyA9IHRydWU7Ci0gIHJldHVybiBtZWRpYV90aW1lXzsKLX0KLQotYmFzZTo6VGltZURlbHRhIENsb2NrOjpQYXVzZSgpIHsKLSAgRENIRUNLKHBsYXlpbmdfKTsKLSAgVXBkYXRlUmVmZXJlbmNlUG9pbnRzKCk7Ci0gIHBsYXlpbmdfID0gZmFsc2U7Ci0gIHJldHVybiBtZWRpYV90aW1lXzsKLX0KLQotdm9pZCBDbG9jazo6U2V0UGxheWJhY2tSYXRlKGZsb2F0IHBsYXliYWNrX3JhdGUpIHsKLSAgVXBkYXRlUmVmZXJlbmNlUG9pbnRzKCk7Ci0gIHBsYXliYWNrX3JhdGVfID0gcGxheWJhY2tfcmF0ZTsKLX0KLQotdm9pZCBDbG9jazo6U2V0VGltZShiYXNlOjpUaW1lRGVsdGEgY3VycmVudF90aW1lLCBiYXNlOjpUaW1lRGVsdGEgbWF4X3RpbWUpIHsKLSAgRENIRUNLKGN1cnJlbnRfdGltZSA8PSBtYXhfdGltZSk7Ci0gIERDSEVDSyhjdXJyZW50X3RpbWUgIT0ga05vVGltZXN0YW1wKCkpOwotCi0gIFVwZGF0ZVJlZmVyZW5jZVBvaW50cyhjdXJyZW50X3RpbWUpOwotICBtYXhfdGltZV8gPSBDbGFtcFRvVmFsaWRUaW1lUmFuZ2UobWF4X3RpbWUpOwotICB1bmRlcmZsb3dfID0gZmFsc2U7Ci19Ci0KLWJhc2U6OlRpbWVEZWx0YSBDbG9jazo6RWxhcHNlZCgpIHsKLSAgaWYgKGR1cmF0aW9uXyA9PSBrTm9UaW1lc3RhbXAoKSkKLSAgICByZXR1cm4gYmFzZTo6VGltZURlbHRhKCk7Ci0KLSAgLy8gVGhlIGNsb2NrIGlzIG5vdCBhZHZhbmNpbmcsIHNvIHJldHVybiB0aGUgbGFzdCByZWNvcmRlZCB0aW1lLgotICBpZiAoIXBsYXlpbmdfIHx8IHVuZGVyZmxvd18pCi0gICAgcmV0dXJuIG1lZGlhX3RpbWVfOwotCi0gIGJhc2U6OlRpbWVEZWx0YSBlbGFwc2VkID0gRXN0aW1hdGVkRWxhcHNlZFRpbWUoKTsKLSAgaWYgKG1heF90aW1lXyAhPSBrTm9UaW1lc3RhbXAoKSAmJiBlbGFwc2VkID4gbWF4X3RpbWVfKSB7Ci0gICAgVXBkYXRlUmVmZXJlbmNlUG9pbnRzKG1heF90aW1lXyk7Ci0gICAgdW5kZXJmbG93XyA9IHRydWU7Ci0gICAgZWxhcHNlZCA9IG1heF90aW1lXzsKLSAgfQotCi0gIHJldHVybiBlbGFwc2VkOwotfQotCi12b2lkIENsb2NrOjpTZXRNYXhUaW1lKGJhc2U6OlRpbWVEZWx0YSBtYXhfdGltZSkgewotICBEQ0hFQ0sobWF4X3RpbWUgIT0ga05vVGltZXN0YW1wKCkpOwotCi0gIFVwZGF0ZVJlZmVyZW5jZVBvaW50cygpOwotICBtYXhfdGltZV8gPSBDbGFtcFRvVmFsaWRUaW1lUmFuZ2UobWF4X3RpbWUpOwotCi0gIHVuZGVyZmxvd18gPSBtZWRpYV90aW1lXyA+IG1heF90aW1lXzsKLSAgaWYgKHVuZGVyZmxvd18pCi0gICAgbWVkaWFfdGltZV8gPSBtYXhfdGltZV87Ci19Ci0KLXZvaWQgQ2xvY2s6OlNldER1cmF0aW9uKGJhc2U6OlRpbWVEZWx0YSBkdXJhdGlvbikgewotICBEQ0hFQ0soZHVyYXRpb24gPiBiYXNlOjpUaW1lRGVsdGEoKSk7Ci0gIGR1cmF0aW9uXyA9IGR1cmF0aW9uOwotCi0gIG1lZGlhX3RpbWVfID0gQ2xhbXBUb1ZhbGlkVGltZVJhbmdlKG1lZGlhX3RpbWVfKTsKLSAgaWYgKG1heF90aW1lXyAhPSBrTm9UaW1lc3RhbXAoKSkKLSAgICBtYXhfdGltZV8gPSBDbGFtcFRvVmFsaWRUaW1lUmFuZ2UobWF4X3RpbWVfKTsKLX0KLQotYmFzZTo6VGltZURlbHRhIENsb2NrOjpFbGFwc2VkVmlhUHJvdmlkZWRUaW1lKGNvbnN0IGJhc2U6OlRpbWUmIHRpbWUpIGNvbnN0IHsKLSAgLy8gVE9ETyhzY2hlcmt1cyk6IGZsb2F0aW5nIHBvaW50IGJhZG5lc3Mgc2NhbGluZyB0aW1lIGJ5IHBsYXliYWNrIHJhdGUuCi0gIGludDY0IG5vd191cyA9ICh0aW1lIC0gcmVmZXJlbmNlXykuSW5NaWNyb3NlY29uZHMoKTsKLSAgbm93X3VzID0gc3RhdGljX2Nhc3Q8aW50NjQ+KG5vd191cyAqIHBsYXliYWNrX3JhdGVfKTsKLSAgcmV0dXJuIG1lZGlhX3RpbWVfICsgYmFzZTo6VGltZURlbHRhOjpGcm9tTWljcm9zZWNvbmRzKG5vd191cyk7Ci19Ci0KLWJhc2U6OlRpbWUgQ2xvY2s6OkdldFRpbWVGcm9tUHJvdmlkZXIoKSBjb25zdCB7Ci0gIGlmICh0aW1lX3Byb3ZpZGVyXykKLSAgICByZXR1cm4gdGltZV9wcm92aWRlcl8oKTsKLSAgcmV0dXJuIGJhc2U6OlRpbWUoKTsKLX0KLQotYmFzZTo6VGltZURlbHRhIENsb2NrOjpDbGFtcFRvVmFsaWRUaW1lUmFuZ2UoYmFzZTo6VGltZURlbHRhIHRpbWUpIGNvbnN0IHsKLSAgaWYgKGR1cmF0aW9uXyA9PSBrTm9UaW1lc3RhbXAoKSkKLSAgICByZXR1cm4gYmFzZTo6VGltZURlbHRhKCk7Ci0gIHJldHVybiBzdGQ6Om1heChzdGQ6Om1pbih0aW1lLCBkdXJhdGlvbl8pLCBiYXNlOjpUaW1lRGVsdGEoKSk7Ci19Ci0KLXZvaWQgQ2xvY2s6OkVuZE9mU3RyZWFtKCkgewotICBQYXVzZSgpOwotICBTZXRUaW1lKER1cmF0aW9uKCksIER1cmF0aW9uKCkpOwotfQotCi1iYXNlOjpUaW1lRGVsdGEgQ2xvY2s6OkR1cmF0aW9uKCkgY29uc3QgewotICBpZiAoZHVyYXRpb25fID09IGtOb1RpbWVzdGFtcCgpKQotICAgIHJldHVybiBiYXNlOjpUaW1lRGVsdGEoKTsKLSAgcmV0dXJuIGR1cmF0aW9uXzsKLX0KLQotdm9pZCBDbG9jazo6VXBkYXRlUmVmZXJlbmNlUG9pbnRzKCkgewotICBVcGRhdGVSZWZlcmVuY2VQb2ludHMoRWxhcHNlZCgpKTsKLX0KLQotdm9pZCBDbG9jazo6VXBkYXRlUmVmZXJlbmNlUG9pbnRzKGJhc2U6OlRpbWVEZWx0YSBjdXJyZW50X3RpbWUpIHsKLSAgbWVkaWFfdGltZV8gPSBDbGFtcFRvVmFsaWRUaW1lUmFuZ2UoY3VycmVudF90aW1lKTsKLSAgcmVmZXJlbmNlXyA9IEdldFRpbWVGcm9tUHJvdmlkZXIoKTsKLX0KLQotYmFzZTo6VGltZURlbHRhIENsb2NrOjpFc3RpbWF0ZWRFbGFwc2VkVGltZSgpIHsKLSAgcmV0dXJuIENsYW1wVG9WYWxpZFRpbWVSYW5nZSgKLSAgICAgIEVsYXBzZWRWaWFQcm92aWRlZFRpbWUoR2V0VGltZUZyb21Qcm92aWRlcigpKSk7Ci19Ci0KLXZvaWQgQ2xvY2s6OlJlc2V0KCkgewotICBwbGF5aW5nXyA9IGZhbHNlOwotICBwbGF5YmFja19yYXRlXyA9IDEuMGY7Ci0gIG1heF90aW1lXyA9IGtOb1RpbWVzdGFtcCgpOwotICBkdXJhdGlvbl8gPSBrTm9UaW1lc3RhbXAoKTsKLSAgbWVkaWFfdGltZV8gPSBiYXNlOjpUaW1lRGVsdGEoKTsKLSAgcmVmZXJlbmNlXyA9IGJhc2U6OlRpbWUoKTsKLSAgdW5kZXJmbG93XyA9IGZhbHNlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2Nsb2NrLmggYi9zcmMvbWVkaWEvYmFzZS9jbG9jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjJhOTBjLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL2Nsb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9CQVNFX0NMT0NLX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfQ0xPQ0tfSF8KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgImJhc2UvdGltZS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIEEgY2xvY2sgcmVwcmVzZW50cyBhIHNpbmdsZSBzb3VyY2Ugb2YgdGltZSB0byBhbGxvdyBhdWRpbyBhbmQgdmlkZW8gc3RyZWFtcwotLy8gdG8gc3luY2hyb25pemUgd2l0aCBlYWNoIG90aGVyLiAgQ2xvY2sgZXNzZW50aWFsbHkgdHJhY2tzIHRoZSBtZWRpYSB0aW1lIHdpdGgKLS8vIHJlc3BlY3QgdG8gc29tZSBvdGhlciBzb3VyY2Ugb2YgdGltZSwgd2hldGhlciB0aGF0IG1heSBiZSB0aGUgc3lzdGVtIGNsb2NrIG9yCi0vLyB1cGRhdGVzIHZpYSBTZXRUaW1lKCkuIENsb2NrIHVzZXMgbGluZWFyIGludGVycG9sYXRpb24gdG8gY2FsY3VsYXRlIHRoZQotLy8gY3VycmVudCBtZWRpYSB0aW1lIHNpbmNlIHRoZSBsYXN0IHRpbWUgU2V0VGltZSgpIHdhcyBjYWxsZWQuCi0vLwotLy8gQ2xvY2tzIHN0YXJ0IG9mZiBwYXVzZWQgd2l0aCBhIHBsYXliYWNrIHJhdGUgb2YgMS4wZiBhbmQgYSBtZWRpYSB0aW1lIG9mIDAuCi0vLwotLy8gQ2xvY2sgaXMgbm90IHRocmVhZC1zYWZlIGFuZCBtdXN0IGJlIGV4dGVybmFsbHkgbG9ja2VkLgotLy8KLS8vIFRPRE8oc2NoZXJrdXMpOiBDbG9jayB3aWxsIHNvbWUgZGF5IGJlIHJlc3BvbnNpYmxlIGZvciBleGVjdXRpbmcgY2FsbGJhY2tzCi0vLyBnaXZlbiBhIG1lZGlhIHRpbWUuICBUaGlzIHdpbGwgYmUgdXNlZCBwcmltYXJpbHkgYnkgdmlkZW8gcmVuZGVyZXJzLiAgRm9yIG5vdwotLy8gd2UnbGwga2VlcCB1c2luZyBhIHBvbGwtYW5kLXNsZWVwIHNvbHV0aW9uLgotY2xhc3MgTUVESUFfRVhQT1JUIENsb2NrIHsKLSBwdWJsaWM6Ci0gIC8vIFR5cGUgZm9yIGEgc3RhdGljIGZ1bmN0aW9uIHBvaW50ZXIgdGhhdCBhY3RzIGFzIGEgdGltZSBzb3VyY2UuCi0gIHR5cGVkZWYgYmFzZTo6VGltZShUaW1lUHJvdmlkZXIpKCk7Ci0KLSAgZXhwbGljaXQgQ2xvY2soVGltZVByb3ZpZGVyKiB0aW1lX3Byb3ZpZGVyKTsKLSAgfkNsb2NrKCk7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjbG9jayBpcyBydW5uaW5nLgotICBib29sIElzUGxheWluZygpIGNvbnN0OwotCi0gIC8vIFN0YXJ0cyB0aGUgY2xvY2sgYW5kIHJldHVybnMgdGhlIGN1cnJlbnQgbWVkaWEgdGltZSwgd2hpY2ggd2lsbCBpbmNyZWFzZQotICAvLyB3aXRoIHJlc3BlY3QgdG8gdGhlIGN1cnJlbnQgcGxheWJhY2sgcmF0ZS4KLSAgYmFzZTo6VGltZURlbHRhIFBsYXkoKTsKLQotICAvLyBTdG9wcyB0aGUgY2xvY2sgYW5kIHJldHVybnMgdGhlIGN1cnJlbnQgbWVkaWEgdGltZSwgd2hpY2ggd2lsbCByZW1haW4KLSAgLy8gY29uc3RhbnQgdW50aWwgUGxheSgpIGlzIGNhbGxlZC4KLSAgYmFzZTo6VGltZURlbHRhIFBhdXNlKCk7Ci0KLSAgLy8gU2V0cyBhIG5ldyBwbGF5YmFjayByYXRlLiAgVGhlIHJhdGUgYXQgd2hpY2ggdGhlIG1lZGlhIHRpbWUgd2lsbCBpbmNyZWFzZQotICAvLyB3aWxsIG5vdyBjaGFuZ2UuCi0gIHZvaWQgU2V0UGxheWJhY2tSYXRlKGZsb2F0IHBsYXliYWNrX3JhdGUpOwotCi0gIC8vIEZvcmNlZnVsbHkgc2V0cyB0aGUgbWVkaWEgdGltZSB0byB8Y3VycmVudF90aW1lfC4gVGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMKLSAgLy8gdGhlIHxtYXhfdGltZXwgdGhhdCB0aGUgY2xvY2sgc2hvdWxkIHByb2dyZXNzIGFmdGVyIGEgY2FsbCB0byBQbGF5KCkuIFRoaXMKLSAgLy8gdmFsdWUgaXMgb2Z0ZW4gdGhlIHRpbWUgb2YgdGhlIGVuZCBvZiB0aGUgbGFzdCBmcmFtZSBidWZmZXJlZCBhbmQgZGVjb2RlZC4KLSAgLy8KLSAgLy8gVGhlc2UgdmFsdWVzIGFyZSBjbGFtcGVkIHRvIHRoZSBkdXJhdGlvbiBvZiB0aGUgdmlkZW8sIHdoaWNoIGlzIGluaXRpYWxseQotICAvLyBzZXQgdG8gMCAoYmVmb3JlIFNldER1cmF0aW9uKCkgaXMgY2FsbGVkKS4KLSAgdm9pZCBTZXRUaW1lKGJhc2U6OlRpbWVEZWx0YSBjdXJyZW50X3RpbWUsIGJhc2U6OlRpbWVEZWx0YSBtYXhfdGltZSk7Ci0KLSAgLy8gU2V0cyB0aGUgfG1heF90aW1lfCB0byBiZSByZXR1cm5lZCBieSBhIGNhbGwgdG8gRWxhcHNlZCgpLgotICB2b2lkIFNldE1heFRpbWUoYmFzZTo6VGltZURlbHRhIG1heF90aW1lKTsKLQotICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IGVsYXBzZWQgbWVkaWEgdGltZS4gUmV0dXJucyAwIGlmIFNldER1cmF0aW9uKCkgaGFzCi0gIC8vIG5ldmVyIGJlZW4gY2FsbGVkLgotICBiYXNlOjpUaW1lRGVsdGEgRWxhcHNlZCgpOwotCi0gIC8vIFNldHMgdGhlIGR1cmF0aW9uIG9mIHRoZSB2aWRlby4gQ2xvY2sgZXhwZWN0cyB0aGUgZHVyYXRpb24gd2lsbCBiZSBzZXQKLSAgLy8gZXhhY3RseSBvbmNlLgotICB2b2lkIFNldER1cmF0aW9uKGJhc2U6OlRpbWVEZWx0YSBkdXJhdGlvbik7Ci0KLSAgLy8gUmVzZXRzIGNsb2NrIHRvIGFuIHVuaW5pdGlhbGl6ZWQgc3RhdGUuCi0gIHZvaWQgUmVzZXQoKTsKLQotICAvLyBOb3RpZmllcyB0aGUgY2xvY2sgdGhhdCB0aGUgZW5kIG9mIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkLiBUaGUgY2xvY2sgc3RhdGUKLSAgLy8gaXMgdXBkYXRlZCBhY2NvcmRpbmdseS4KLSAgdm9pZCBFbmRPZlN0cmVhbSgpOwotCi0gIC8vIFJldHVybnMgdGhlIGR1cmF0aW9uIG9mIHRoZSBjbG9jaywgb3IgMCBpZiBub3Qgc2V0LgotICBiYXNlOjpUaW1lRGVsdGEgRHVyYXRpb24oKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIC8vIFVwZGF0ZXMgdGhlIHJlZmVyZW5jZSBwb2ludHMgYmFzZWQgb24gdGhlIGN1cnJlbnQgY2FsY3VsYXRlZCB0aW1lLgotICB2b2lkIFVwZGF0ZVJlZmVyZW5jZVBvaW50cygpOwotCi0gIC8vIFVwZGF0ZXMgdGhlIHJlZmVyZW5jZSBwb2ludHMgYmFzZWQgb24gdGhlIGdpdmVuIHxjdXJyZW50X3RpbWV8LgotICB2b2lkIFVwZGF0ZVJlZmVyZW5jZVBvaW50cyhiYXNlOjpUaW1lRGVsdGEgY3VycmVudF90aW1lKTsKLQotICAvLyBSZXR1cm5zIHRoZSB0aW1lIGVsYXBzZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVmZXJlbmNlIHBvaW50cywgaWdub3JpbmcKLSAgLy8gdGhlIHxtYXhfdGltZV98IGNhcC4KLSAgYmFzZTo6VGltZURlbHRhIEVzdGltYXRlZEVsYXBzZWRUaW1lKCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgY3VycmVudCBtZWRpYSB0aW1lIHRyZWF0aW5nIHRoZSBnaXZlbiB0aW1lIGFzIHRoZSBsYXRlc3QKLSAgLy8gdmFsdWUgYXMgcmV0dXJuZWQgYnkgfHRpbWVfcHJvdmlkZXJffC4KLSAgYmFzZTo6VGltZURlbHRhIEVsYXBzZWRWaWFQcm92aWRlZFRpbWUoY29uc3QgYmFzZTo6VGltZSYgdGltZSkgY29uc3Q7Ci0KLSAgYmFzZTo6VGltZSBHZXRUaW1lRnJvbVByb3ZpZGVyKCkgY29uc3Q7Ci0KLSAgYmFzZTo6VGltZURlbHRhIENsYW1wVG9WYWxpZFRpbWVSYW5nZShiYXNlOjpUaW1lRGVsdGEgdGltZSkgY29uc3Q7Ci0KLSAgLy8gRnVuY3Rpb24gcmV0dXJuaW5nIGN1cnJlbnQgdGltZSBpbiBiYXNlOjpUaW1lIHVuaXRzLgotICBUaW1lUHJvdmlkZXIqIHRpbWVfcHJvdmlkZXJfOwotCi0gIC8vIFdoZXRoZXIgdGhlIGNsb2NrIGlzIHJ1bm5pbmcuCi0gIGJvb2wgcGxheWluZ187Ci0KLSAgLy8gV2hldGhlciB0aGUgY2xvY2sgaXMgc3RhbGxlZCBiZWNhdXNlIGl0IGhhcyByZWFjaGVkIHRoZSB8bWF4X3RpbWVffAotICAvLyBhbGxvd2VkLgotICBib29sIHVuZGVyZmxvd187Ci0KLSAgLy8gVGhlIHN5c3RlbSBjbG9jayB0aW1lIHdoZW4gdGhpcyBjbG9jayBsYXN0IHN0YXJ0aW5nIHBsYXlpbmcgb3IgaGFkIGl0cwotICAvLyB0aW1lIHNldCB2aWEgU2V0VGltZSgpLgotICBiYXNlOjpUaW1lIHJlZmVyZW5jZV87Ci0KLSAgLy8gQ3VycmVudCBhY2N1bXVsYXRlZCBhbW91bnQgb2YgbWVkaWEgdGltZS4gIFRoZSByZW1haW5pbmcgcG9ydGlvbiBtdXN0IGJlCi0gIC8vIGNhbGN1bGF0ZWQgYnkgY29tcGFyaW5nIHRoZSBzeXN0ZW0gdGltZSB0byB0aGUgcmVmZXJlbmNlIHRpbWUuCi0gIGJhc2U6OlRpbWVEZWx0YSBtZWRpYV90aW1lXzsKLQotICAvLyBDdXJyZW50IHBsYXliYWNrIHJhdGUuCi0gIGZsb2F0IHBsYXliYWNrX3JhdGVfOwotCi0gIC8vIFRoZSBtYXhpbXVtIHRpbWUgdGhhdCBjYW4gYmUgcmV0dXJuZWQgYnkgY2FsbHMgdG8gRWxhcHNlZCgpLgotICBiYXNlOjpUaW1lRGVsdGEgbWF4X3RpbWVfOwotCi0gIC8vIER1cmF0aW9uIG9mIHRoZSBtZWRpYS4KLSAgYmFzZTo6VGltZURlbHRhIGR1cmF0aW9uXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQ2xvY2spOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQkFTRV9DTE9DS19IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvY2xvY2tfdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvYmFzZS9jbG9ja191bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc3M2E1Yi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9jbG9ja191bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS90ZXN0L21vY2tfdGltZV9wcm92aWRlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvY2xvY2suaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKLQotdXNpbmcgOjp0ZXN0aW5nOjpJblNlcXVlbmNlOwotdXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47Ci11c2luZyA6OnRlc3Rpbmc6OlN0cmljdE1vY2s7Ci0KLW5hbWVzcGFjZSBiYXNlIHsKLQotLy8gUHJvdmlkZSBhIHN0cmVhbSBvdXRwdXQgb3BlcmF0b3Igc28gd2UgY2FuIHVzZSBFWFBFQ1RfRVEoLi4uKSB3aXRoIFRpbWVEZWx0YS4KLS8vCi0vLyBUT0RPKHNjaGVya3VzKTogbW92ZSB0aGlzIGludG8gdGhlIHRlc3RpbmcgcGFja2FnZS4KLXN0YXRpYyBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBzdHJlYW0sIGNvbnN0IFRpbWVEZWx0YSYgdGltZSkgewotICByZXR1cm4gKHN0cmVhbSA8PCB0aW1lLlRvSW50ZXJuYWxWYWx1ZSgpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLXN0YXRpYyBjb25zdCBpbnQga0R1cmF0aW9uSW5TZWNvbmRzID0gMTIwOwotCi1jbGFzcyBDbG9ja1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gIENsb2NrVGVzdCgpCi0gICAgICA6IGNsb2NrXygmYmFzZTo6TW9ja1RpbWVQcm92aWRlcjo6U3RhdGljTm93KSB7Ci0gICAgU2V0RHVyYXRpb24oKTsKLSAgICBFWFBFQ1RfQ0FMTChtb2NrX3RpbWVfLCBOb3coKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybihiYXNlOjpUaW1lOjpVbml4RXBvY2goKSkpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0RHVyYXRpb24oKSB7Ci0gICAgY29uc3QgYmFzZTo6VGltZURlbHRhIGtEdXJhdGlvbiA9Ci0gICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoa0R1cmF0aW9uSW5TZWNvbmRzKTsKLSAgICBjbG9ja18uU2V0RHVyYXRpb24oa0R1cmF0aW9uKTsKLSAgICBFWFBFQ1RfRVEoa0R1cmF0aW9uLCBjbG9ja18uRHVyYXRpb24oKSk7Ci0gIH0KLQotICB2b2lkIEFkdmFuY2VTeXN0ZW1UaW1lKGJhc2U6OlRpbWVEZWx0YSBkZWx0YSkgewotICAgIHRpbWVfZWxhcHNlZF8gKz0gZGVsdGE7Ci0gICAgRVhQRUNUX0NBTEwobW9ja190aW1lXywgTm93KCkpCi0gICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oYmFzZTo6VGltZTo6VW5peEVwb2NoKCkgKyB0aW1lX2VsYXBzZWRfKSk7Ci0gIH0KLQotICBDbG9jayBjbG9ja187Ci0gIFN0cmljdE1vY2s8YmFzZTo6TW9ja1RpbWVQcm92aWRlcj4gbW9ja190aW1lXzsKLSAgYmFzZTo6VGltZURlbHRhIHRpbWVfZWxhcHNlZF87Ci19OwotCi1URVNUX0YoQ2xvY2tUZXN0LCBDcmVhdGVkKSB7Ci0gIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSBrRXhwZWN0ZWQgPSBiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKDApOwotICBFWFBFQ1RfRVEoa0V4cGVjdGVkLCBjbG9ja18uRWxhcHNlZCgpKTsKLX0KLQotVEVTVF9GKENsb2NrVGVzdCwgUGxheV9Ob3JtYWxTcGVlZCkgewotICBjb25zdCBiYXNlOjpUaW1lRGVsdGEga1plcm87Ci0gIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSBrVGltZVRvQWR2YW5jZSA9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoMik7Ci0KLSAgRVhQRUNUX0VRKGtaZXJvLCBjbG9ja18uUGxheSgpKTsKLSAgQWR2YW5jZVN5c3RlbVRpbWUoa1RpbWVUb0FkdmFuY2UpOwotICBFWFBFQ1RfRVEoa1RpbWVUb0FkdmFuY2UsIGNsb2NrXy5FbGFwc2VkKCkpOwotfQotCi1URVNUX0YoQ2xvY2tUZXN0LCBQbGF5X0RvdWJsZVNwZWVkKSB7Ci0gIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSBrWmVybzsKLSAgY29uc3QgYmFzZTo6VGltZURlbHRhIGtUaW1lVG9BZHZhbmNlID0gYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcyg1KTsKLQotICBjbG9ja18uU2V0UGxheWJhY2tSYXRlKDIuMGYpOwotICBFWFBFQ1RfRVEoa1plcm8sIGNsb2NrXy5QbGF5KCkpOwotICBBZHZhbmNlU3lzdGVtVGltZShrVGltZVRvQWR2YW5jZSk7Ci0gIEVYUEVDVF9FUSgyICoga1RpbWVUb0FkdmFuY2UsIGNsb2NrXy5FbGFwc2VkKCkpOwotfQotCi1URVNUX0YoQ2xvY2tUZXN0LCBQbGF5X0hhbGZTcGVlZCkgewotICBjb25zdCBiYXNlOjpUaW1lRGVsdGEga1plcm87Ci0gIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSBrVGltZVRvQWR2YW5jZSA9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoNCk7Ci0KLSAgY2xvY2tfLlNldFBsYXliYWNrUmF0ZSgwLjVmKTsKLSAgRVhQRUNUX0VRKGtaZXJvLCBjbG9ja18uUGxheSgpKTsKLSAgQWR2YW5jZVN5c3RlbVRpbWUoa1RpbWVUb0FkdmFuY2UpOwotICBFWFBFQ1RfRVEoa1RpbWVUb0FkdmFuY2UgLyAyLCBjbG9ja18uRWxhcHNlZCgpKTsKLX0KLQotVEVTVF9GKENsb2NrVGVzdCwgUGxheV9aZXJvU3BlZWQpIHsKLSAgLy8gV2UnbGwgcGxheSBmb3IgMiBzZWNvbmRzIGF0IG5vcm1hbCBzcGVlZCwgNCBzZWNvbmRzIGF0IHplcm8gc3BlZWQsIGFuZCA4Ci0gIC8vIHNlY29uZHMgYXQgbm9ybWFsIHNwZWVkLgotICBjb25zdCBiYXNlOjpUaW1lRGVsdGEga1plcm87Ci0gIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSBrUGxheUR1cmF0aW9uMSA9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoMik7Ci0gIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSBrUGxheUR1cmF0aW9uMiA9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoNCk7Ci0gIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSBrUGxheUR1cmF0aW9uMyA9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoOCk7Ci0gIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSBrRXhwZWN0ZWQgPSBrUGxheUR1cmF0aW9uMSArIGtQbGF5RHVyYXRpb24zOwotCi0gIEVYUEVDVF9FUShrWmVybywgY2xvY2tfLlBsYXkoKSk7Ci0KLSAgQWR2YW5jZVN5c3RlbVRpbWUoa1BsYXlEdXJhdGlvbjEpOwotICBjbG9ja18uU2V0UGxheWJhY2tSYXRlKDAuMGYpOwotICBBZHZhbmNlU3lzdGVtVGltZShrUGxheUR1cmF0aW9uMik7Ci0gIGNsb2NrXy5TZXRQbGF5YmFja1JhdGUoMS4wZik7Ci0gIEFkdmFuY2VTeXN0ZW1UaW1lKGtQbGF5RHVyYXRpb24zKTsKLQotICBFWFBFQ1RfRVEoa0V4cGVjdGVkLCBjbG9ja18uRWxhcHNlZCgpKTsKLX0KLQotVEVTVF9GKENsb2NrVGVzdCwgUGxheV9NdWx0aVNwZWVkKSB7Ci0gIC8vIFdlJ2xsIHBsYXkgZm9yIDIgc2Vjb25kcyBhdCBoYWxmIHNwZWVkLCA0IHNlY29uZHMgYXQgbm9ybWFsIHNwZWVkLCBhbmQgOAotICAvLyBzZWNvbmRzIGF0IGRvdWJsZSBzcGVlZC4KLSAgY29uc3QgYmFzZTo6VGltZURlbHRhIGtaZXJvOwotICBjb25zdCBiYXNlOjpUaW1lRGVsdGEga1BsYXlEdXJhdGlvbjEgPSBiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKDIpOwotICBjb25zdCBiYXNlOjpUaW1lRGVsdGEga1BsYXlEdXJhdGlvbjIgPSBiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKDQpOwotICBjb25zdCBiYXNlOjpUaW1lRGVsdGEga1BsYXlEdXJhdGlvbjMgPSBiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKDgpOwotICBjb25zdCBiYXNlOjpUaW1lRGVsdGEga0V4cGVjdGVkID0KLSAgICAgIGtQbGF5RHVyYXRpb24xIC8gMiArIGtQbGF5RHVyYXRpb24yICsgMiAqIGtQbGF5RHVyYXRpb24zOwotCi0gIGNsb2NrXy5TZXRQbGF5YmFja1JhdGUoMC41Zik7Ci0gIEVYUEVDVF9FUShrWmVybywgY2xvY2tfLlBsYXkoKSk7Ci0gIEFkdmFuY2VTeXN0ZW1UaW1lKGtQbGF5RHVyYXRpb24xKTsKLQotICBjbG9ja18uU2V0UGxheWJhY2tSYXRlKDEuMGYpOwotICBBZHZhbmNlU3lzdGVtVGltZShrUGxheUR1cmF0aW9uMik7Ci0KLSAgY2xvY2tfLlNldFBsYXliYWNrUmF0ZSgyLjBmKTsKLSAgQWR2YW5jZVN5c3RlbVRpbWUoa1BsYXlEdXJhdGlvbjMpOwotICBFWFBFQ1RfRVEoa0V4cGVjdGVkLCBjbG9ja18uRWxhcHNlZCgpKTsKLX0KLQotVEVTVF9GKENsb2NrVGVzdCwgUGF1c2UpIHsKLSAgY29uc3QgYmFzZTo6VGltZURlbHRhIGtaZXJvOwotICBjb25zdCBiYXNlOjpUaW1lRGVsdGEga1BsYXlEdXJhdGlvbiA9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoNCk7Ci0gIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSBrUGF1c2VEdXJhdGlvbiA9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoMjApOwotICBjb25zdCBiYXNlOjpUaW1lRGVsdGEga0V4cGVjdGVkRmlyc3RQYXVzZSA9IGtQbGF5RHVyYXRpb247Ci0gIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSBrRXhwZWN0ZWRTZWNvbmRQYXVzZSA9IDIgKiBrUGxheUR1cmF0aW9uOwotCi0gIC8vIFBsYXkgZm9yIDQgc2Vjb25kcy4KLSAgRVhQRUNUX0VRKGtaZXJvLCBjbG9ja18uUGxheSgpKTsKLSAgQWR2YW5jZVN5c3RlbVRpbWUoa1BsYXlEdXJhdGlvbik7Ci0KLSAgLy8gUGF1c2UgZm9yIDIwIHNlY29uZHMuCi0gIEVYUEVDVF9FUShrRXhwZWN0ZWRGaXJzdFBhdXNlLCBjbG9ja18uUGF1c2UoKSk7Ci0gIEVYUEVDVF9FUShrRXhwZWN0ZWRGaXJzdFBhdXNlLCBjbG9ja18uRWxhcHNlZCgpKTsKLSAgQWR2YW5jZVN5c3RlbVRpbWUoa1BhdXNlRHVyYXRpb24pOwotICBFWFBFQ1RfRVEoa0V4cGVjdGVkRmlyc3RQYXVzZSwgY2xvY2tfLkVsYXBzZWQoKSk7Ci0KLSAgLy8gUGxheSBhZ2FpbiBmb3IgNCBtb3JlIHNlY29uZHMuCi0gIEVYUEVDVF9FUShrRXhwZWN0ZWRGaXJzdFBhdXNlLCBjbG9ja18uUGxheSgpKTsKLSAgQWR2YW5jZVN5c3RlbVRpbWUoa1BsYXlEdXJhdGlvbik7Ci0gIEVYUEVDVF9FUShrRXhwZWN0ZWRTZWNvbmRQYXVzZSwgY2xvY2tfLlBhdXNlKCkpOwotICBFWFBFQ1RfRVEoa0V4cGVjdGVkU2Vjb25kUGF1c2UsIGNsb2NrXy5FbGFwc2VkKCkpOwotfQotCi1URVNUX0YoQ2xvY2tUZXN0LCBTZXRUaW1lX1BhdXNlZCkgewotICBjb25zdCBiYXNlOjpUaW1lRGVsdGEga0ZpcnN0VGltZSA9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoNCk7Ci0gIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSBrU2Vjb25kVGltZSA9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoMTYpOwotCi0gIGNsb2NrXy5TZXRUaW1lKGtGaXJzdFRpbWUsIGNsb2NrXy5EdXJhdGlvbigpKTsKLSAgRVhQRUNUX0VRKGtGaXJzdFRpbWUsIGNsb2NrXy5FbGFwc2VkKCkpOwotICBjbG9ja18uU2V0VGltZShrU2Vjb25kVGltZSwgY2xvY2tfLkR1cmF0aW9uKCkpOwotICBFWFBFQ1RfRVEoa1NlY29uZFRpbWUsIGNsb2NrXy5FbGFwc2VkKCkpOwotfQotCi1URVNUX0YoQ2xvY2tUZXN0LCBTZXRUaW1lX1BsYXlpbmcpIHsKLSAgLy8gV2UnbGwgcGxheSBmb3IgNCBzZWNvbmRzLCB0aGVuIHNldCB0aGUgdGltZSB0byAxMiwgdGhlbiBwbGF5IGZvciA0IG1vcmUKLSAgLy8gc2Vjb25kcy4KLSAgY29uc3QgYmFzZTo6VGltZURlbHRhIGtaZXJvOwotICBjb25zdCBiYXNlOjpUaW1lRGVsdGEga1BsYXlEdXJhdGlvbiA9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoNCk7Ci0gIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSBrVXBkYXRlZFRpbWUgPSBiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKDEyKTsKLSAgY29uc3QgYmFzZTo6VGltZURlbHRhIGtFeHBlY3RlZCA9IGtVcGRhdGVkVGltZSArIGtQbGF5RHVyYXRpb247Ci0KLSAgRVhQRUNUX0VRKGtaZXJvLCBjbG9ja18uUGxheSgpKTsKLSAgQWR2YW5jZVN5c3RlbVRpbWUoa1BsYXlEdXJhdGlvbik7Ci0KLSAgY2xvY2tfLlNldFRpbWUoa1VwZGF0ZWRUaW1lLCBjbG9ja18uRHVyYXRpb24oKSk7Ci0gIEFkdmFuY2VTeXN0ZW1UaW1lKGtQbGF5RHVyYXRpb24pOwotICBFWFBFQ1RfRVEoa0V4cGVjdGVkLCBjbG9ja18uRWxhcHNlZCgpKTsKLX0KLQotVEVTVF9GKENsb2NrVGVzdCwgQ2FwQXRNZWRpYUR1cmF0aW9uX1BhdXNlZCkgewotICBjb25zdCBiYXNlOjpUaW1lRGVsdGEga0R1cmF0aW9uID0KLSAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoa0R1cmF0aW9uSW5TZWNvbmRzKTsKLSAgY29uc3QgYmFzZTo6VGltZURlbHRhIGtUaW1lT3ZlckR1cmF0aW9uID0KLSAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoa0R1cmF0aW9uSW5TZWNvbmRzICsgNCk7Ci0KLSAgLy8gRWxhcHNlZCB0aW1lIHNob3VsZCBhbHdheXMgYmUgY2FwcGVkIGF0IHRoZSBkdXJhdGlvbiBvZiB0aGUgbWVkaWEuCi0gIGNsb2NrXy5TZXRUaW1lKGtUaW1lT3ZlckR1cmF0aW9uLCBrVGltZU92ZXJEdXJhdGlvbik7Ci0gIEVYUEVDVF9FUShrRHVyYXRpb24sIGNsb2NrXy5FbGFwc2VkKCkpOwotfQotCi1URVNUX0YoQ2xvY2tUZXN0LCBDYXBBdE1lZGlhRHVyYXRpb25fUGxheWluZykgewotICBjb25zdCBiYXNlOjpUaW1lRGVsdGEga1plcm87Ci0gIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSBrRHVyYXRpb24gPQotICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcyhrRHVyYXRpb25JblNlY29uZHMpOwotICBjb25zdCBiYXNlOjpUaW1lRGVsdGEga1RpbWVPdmVyRHVyYXRpb24gPQotICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcyhrRHVyYXRpb25JblNlY29uZHMgKyA0KTsKLQotICAvLyBQbGF5IGZvciB0d2ljZSBhcyBsb25nIGFzIHRoZSBkdXJhdGlvbiBvZiB0aGUgbWVkaWEuCi0gIEVYUEVDVF9FUShrWmVybywgY2xvY2tfLlBsYXkoKSk7Ci0gIEFkdmFuY2VTeXN0ZW1UaW1lKDIgKiBrRHVyYXRpb24pOwotICBFWFBFQ1RfRVEoa0R1cmF0aW9uLCBjbG9ja18uRWxhcHNlZCgpKTsKLQotICAvLyBNYW51YWxseSBzZXQgdGhlIHRpbWUgcGFzdCB0aGUgZHVyYXRpb24uCi0gIGNsb2NrXy5TZXRUaW1lKGtUaW1lT3ZlckR1cmF0aW9uLCBrVGltZU92ZXJEdXJhdGlvbik7Ci0gIEVYUEVDVF9FUShrRHVyYXRpb24sIGNsb2NrXy5FbGFwc2VkKCkpOwotfQotCi1URVNUX0YoQ2xvY2tUZXN0LCBTZXRNYXhUaW1lKSB7Ci0gIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSBrWmVybzsKLSAgY29uc3QgYmFzZTo6VGltZURlbHRhIGtUaW1lSW50ZXJ2YWwgPSBiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKDQpOwotICBjb25zdCBiYXNlOjpUaW1lRGVsdGEga01heFRpbWUgPSBiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKDYpOwotCi0gIEVYUEVDVF9FUShrWmVybywgY2xvY2tfLlBsYXkoKSk7Ci0gIGNsb2NrXy5TZXRNYXhUaW1lKGtNYXhUaW1lKTsKLSAgQWR2YW5jZVN5c3RlbVRpbWUoa1RpbWVJbnRlcnZhbCk7Ci0gIEVYUEVDVF9FUShrVGltZUludGVydmFsLCBjbG9ja18uRWxhcHNlZCgpKTsKLQotICBBZHZhbmNlU3lzdGVtVGltZShrVGltZUludGVydmFsKTsKLSAgRVhQRUNUX0VRKGtNYXhUaW1lLCBjbG9ja18uRWxhcHNlZCgpKTsKLQotICBBZHZhbmNlU3lzdGVtVGltZShrVGltZUludGVydmFsKTsKLSAgRVhQRUNUX0VRKGtNYXhUaW1lLCBjbG9ja18uRWxhcHNlZCgpKTsKLX0KLQotVEVTVF9GKENsb2NrVGVzdCwgU2V0TWF4VGltZV9NdWx0aXBsZVRpbWVzKSB7Ci0gIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSBrWmVybzsKLSAgY29uc3QgYmFzZTo6VGltZURlbHRhIGtUaW1lSW50ZXJ2YWwgPSBiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKDQpOwotICBjb25zdCBiYXNlOjpUaW1lRGVsdGEga01heFRpbWUxID0gYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcyg2KTsKLSAgY29uc3QgYmFzZTo6VGltZURlbHRhIGtNYXhUaW1lMiA9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoMTIpOwotCi0gIEVYUEVDVF9FUShrWmVybywgY2xvY2tfLlBsYXkoKSk7Ci0gIGNsb2NrXy5TZXRNYXhUaW1lKGNsb2NrXy5EdXJhdGlvbigpKTsKLSAgQWR2YW5jZVN5c3RlbVRpbWUoa1RpbWVJbnRlcnZhbCk7Ci0gIEVYUEVDVF9FUShrVGltZUludGVydmFsLCBjbG9ja18uRWxhcHNlZCgpKTsKLQotICBjbG9ja18uU2V0TWF4VGltZShrTWF4VGltZTEpOwotICBBZHZhbmNlU3lzdGVtVGltZShrVGltZUludGVydmFsKTsKLSAgRVhQRUNUX0VRKGtNYXhUaW1lMSwgY2xvY2tfLkVsYXBzZWQoKSk7Ci0KLSAgQWR2YW5jZVN5c3RlbVRpbWUoa1RpbWVJbnRlcnZhbCk7Ci0gIEVYUEVDVF9FUShrTWF4VGltZTEsIGNsb2NrXy5FbGFwc2VkKCkpOwotCi0gIGNsb2NrXy5TZXRNYXhUaW1lKGtNYXhUaW1lMik7Ci0gIEVYUEVDVF9FUShrTWF4VGltZTEsIGNsb2NrXy5FbGFwc2VkKCkpOwotCi0gIEFkdmFuY2VTeXN0ZW1UaW1lKGtUaW1lSW50ZXJ2YWwpOwotICBFWFBFQ1RfRVEoa01heFRpbWUxICsga1RpbWVJbnRlcnZhbCwgY2xvY2tfLkVsYXBzZWQoKSk7Ci0KLSAgQWR2YW5jZVN5c3RlbVRpbWUoa1RpbWVJbnRlcnZhbCk7Ci0gIEVYUEVDVF9FUShrTWF4VGltZTIsIGNsb2NrXy5FbGFwc2VkKCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2NvbG9yX3NwYWNlLmNjIGIvc3JjL21lZGlhL2Jhc2UvY29sb3Jfc3BhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzN2M3YmIuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvY29sb3Jfc3BhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvY29sb3Jfc3BhY2UuaCIKLQotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLQotbmFtZXNwYWNlIGdmeCB7Ci0KLUNvbG9yU3BhY2U6OlByaW1hcnlJRCBDb2xvclNwYWNlOjpQcmltYXJ5SURGcm9tSW50KGludCBwcmltYXJ5X2lkKSB7Ci0gIGlmIChwcmltYXJ5X2lkIDwgMCB8fCBwcmltYXJ5X2lkID4gc3RhdGljX2Nhc3Q8aW50PihrUHJpbWFyeUlkTGFzdCkpCi0gICAgcmV0dXJuIGtQcmltYXJ5SWRVbmtub3duOwotICBpZiAocHJpbWFyeV9pZCA+IHN0YXRpY19jYXN0PGludD4oa1ByaW1hcnlJZExhc3RTdGFuZGFyZFZhbHVlKSAmJgotICAgICAgcHJpbWFyeV9pZCA8IDEwMDApCi0gICAgcmV0dXJuIGtQcmltYXJ5SWRVbmtub3duOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJpbWFyeUlEPihwcmltYXJ5X2lkKTsKLX0KLQotQ29sb3JTcGFjZTo6VHJhbnNmZXJJRCBDb2xvclNwYWNlOjpUcmFuc2ZlcklERnJvbUludChpbnQgdHJhbnNmZXJfaWQpIHsKLSAgaWYgKHRyYW5zZmVyX2lkIDwgMCB8fCB0cmFuc2Zlcl9pZCA+IHN0YXRpY19jYXN0PGludD4oa1RyYW5zZmVySWRMYXN0KSkKLSAgICByZXR1cm4ga1RyYW5zZmVySWRVbmtub3duOwotICBpZiAodHJhbnNmZXJfaWQgPiBzdGF0aWNfY2FzdDxpbnQ+KGtUcmFuc2ZlcklkTGFzdFN0YW5kYXJkVmFsdWUpICYmCi0gICAgICB0cmFuc2Zlcl9pZCA8IDEwMDApCi0gICAgcmV0dXJuIGtUcmFuc2ZlcklkVW5rbm93bjsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PFRyYW5zZmVySUQ+KHRyYW5zZmVyX2lkKTsKLX0KLQotQ29sb3JTcGFjZTo6TWF0cml4SUQgQ29sb3JTcGFjZTo6TWF0cml4SURGcm9tSW50KGludCBtYXRyaXhfaWQpIHsKLSAgaWYgKG1hdHJpeF9pZCA8IDAgfHwgbWF0cml4X2lkID4gc3RhdGljX2Nhc3Q8aW50PihrTWF0cml4SWRMYXN0KSkKLSAgICByZXR1cm4ga01hdHJpeElkVW5rbm93bjsKLSAgaWYgKG1hdHJpeF9pZCA+IHN0YXRpY19jYXN0PGludD4oa01hdHJpeElkTGFzdFN0YW5kYXJkVmFsdWUpICYmCi0gICAgICBtYXRyaXhfaWQgPCAxMDAwKQotICAgIHJldHVybiBrTWF0cml4SWRVbmtub3duOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8TWF0cml4SUQ+KG1hdHJpeF9pZCk7Ci19Ci0KLUNvbG9yU3BhY2U6OkNvbG9yU3BhY2UoKQotICAgIDogcHJpbWFyaWVzXyhrUHJpbWFyeUlkVW5zcGVjaWZpZWQpLAotICAgICAgdHJhbnNmZXJfKGtUcmFuc2ZlcklkVW5zcGVjaWZpZWQpLAotICAgICAgbWF0cml4XyhrTWF0cml4SWRVbnNwZWNpZmllZCksCi0gICAgICByYW5nZV8oa1JhbmdlSWRMaW1pdGVkKSB7Ci0gIFNiTWVtb3J5U2V0KGN1c3RvbV9wcmltYXJ5X21hdHJpeF8sIDAsIHNpemVvZihjdXN0b21fcHJpbWFyeV9tYXRyaXhfKSk7Ci19Ci0KLUNvbG9yU3BhY2U6OkNvbG9yU3BhY2UoUHJpbWFyeUlEIHByaW1hcmllcywKLSAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmZXJJRCB0cmFuc2ZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgTWF0cml4SUQgbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICBSYW5nZUlEIHJhbmdlKQotICAgIDogcHJpbWFyaWVzXyhwcmltYXJpZXMpLAotICAgICAgdHJhbnNmZXJfKHRyYW5zZmVyKSwKLSAgICAgIG1hdHJpeF8obWF0cml4KSwKLSAgICAgIHJhbmdlXyhyYW5nZSkgewotICBTYk1lbW9yeVNldChjdXN0b21fcHJpbWFyeV9tYXRyaXhfLCAwLCBzaXplb2YoY3VzdG9tX3ByaW1hcnlfbWF0cml4XykpOwotfQotCi1Db2xvclNwYWNlOjpDb2xvclNwYWNlKGludCBwcmltYXJpZXMsIGludCB0cmFuc2ZlciwgaW50IG1hdHJpeCwgUmFuZ2VJRCByYW5nZSkKLSAgICA6IHByaW1hcmllc18oUHJpbWFyeUlERnJvbUludChwcmltYXJpZXMpKSwKLSAgICAgIHRyYW5zZmVyXyhUcmFuc2ZlcklERnJvbUludCh0cmFuc2ZlcikpLAotICAgICAgbWF0cml4XyhNYXRyaXhJREZyb21JbnQobWF0cml4KSksCi0gICAgICByYW5nZV8ocmFuZ2UpIHsKLSAgU2JNZW1vcnlTZXQoY3VzdG9tX3ByaW1hcnlfbWF0cml4XywgMCwgc2l6ZW9mKGN1c3RvbV9wcmltYXJ5X21hdHJpeF8pKTsKLX0KLQotQ29sb3JTcGFjZTo6Q29sb3JTcGFjZShjb25zdCBDb2xvclNwYWNlJiBvdGhlcikKLSAgICA6IHByaW1hcmllc18ob3RoZXIucHJpbWFyaWVzXyksCi0gICAgICB0cmFuc2Zlcl8ob3RoZXIudHJhbnNmZXJfKSwKLSAgICAgIG1hdHJpeF8ob3RoZXIubWF0cml4XyksCi0gICAgICByYW5nZV8ob3RoZXIucmFuZ2VfKSB7Ci0gIFNiTWVtb3J5Q29weShjdXN0b21fcHJpbWFyeV9tYXRyaXhfLCBvdGhlci5jdXN0b21fcHJpbWFyeV9tYXRyaXhfLAotICAgICAgICAgICAgICAgc2l6ZW9mKGN1c3RvbV9wcmltYXJ5X21hdHJpeF8pKTsKLX0KLQotQ29sb3JTcGFjZTo6fkNvbG9yU3BhY2UoKSB7fQotCi0vLyBTdGF0aWMKLUNvbG9yU3BhY2UgQ29sb3JTcGFjZTo6Q3JlYXRlWFlaRDUwKCkgewotICByZXR1cm4gQ29sb3JTcGFjZShrUHJpbWFyeUlkWHl6RDUwLCBrVHJhbnNmZXJJZExpbmVhciwga01hdHJpeElkUmdiLAotICAgICAgICAgICAgICAgICAgICBrUmFuZ2VJZEZ1bGwpOwotfQotCi0vLyBzdGF0aWMKLUNvbG9yU3BhY2UgQ29sb3JTcGFjZTo6Q3JlYXRlSnBlZygpIHsKLSAgcmV0dXJuIENvbG9yU3BhY2Uoa1ByaW1hcnlJZEJ0NzA5LCBrVHJhbnNmZXJJZEllYzYxOTY2MjEsIGtNYXRyaXhJZEJ0NzA5LAotICAgICAgICAgICAgICAgICAgICBrUmFuZ2VJZEZ1bGwpOwotfQotCi0vLyBzdGF0aWMKLUNvbG9yU3BhY2UgQ29sb3JTcGFjZTo6Q3JlYXRlUkVDNjAxKCkgewotICByZXR1cm4gQ29sb3JTcGFjZShrUHJpbWFyeUlkU21wdGUxNzBNLCBrVHJhbnNmZXJJZFNtcHRlMTcwTSwKLSAgICAgICAgICAgICAgICAgICAga01hdHJpeElkU21wdGUxNzBNLCBrUmFuZ2VJZExpbWl0ZWQpOwotfQotCi0vLyBzdGF0aWMKLUNvbG9yU3BhY2UgQ29sb3JTcGFjZTo6Q3JlYXRlUkVDNzA5KCkgewotICByZXR1cm4gQ29sb3JTcGFjZShrUHJpbWFyeUlkQnQ3MDksIGtUcmFuc2ZlcklkQnQ3MDksIGtNYXRyaXhJZEJ0NzA5LAotICAgICAgICAgICAgICAgICAgICBrUmFuZ2VJZExpbWl0ZWQpOwotfQotCi1ib29sIENvbG9yU3BhY2U6Om9wZXJhdG9yPT0oY29uc3QgQ29sb3JTcGFjZSYgb3RoZXIpIGNvbnN0IHsKLSAgaWYgKHByaW1hcmllc18gIT0gb3RoZXIucHJpbWFyaWVzXyB8fCB0cmFuc2Zlcl8gIT0gb3RoZXIudHJhbnNmZXJfIHx8Ci0gICAgICBtYXRyaXhfICE9IG90aGVyLm1hdHJpeF8gfHwgcmFuZ2VfICE9IG90aGVyLnJhbmdlXykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChwcmltYXJpZXNfID09IGtQcmltYXJ5SWRDdXN0b20gJiYKLSAgICAgIFNiTWVtb3J5Q29tcGFyZShjdXN0b21fcHJpbWFyeV9tYXRyaXhfLCBvdGhlci5jdXN0b21fcHJpbWFyeV9tYXRyaXhfLAotICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjdXN0b21fcHJpbWFyeV9tYXRyaXhfKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDb2xvclNwYWNlOjpvcGVyYXRvciE9KGNvbnN0IENvbG9yU3BhY2UmIG90aGVyKSBjb25zdCB7Ci0gIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKLX0KLQotYm9vbCBDb2xvclNwYWNlOjpvcGVyYXRvcjwoY29uc3QgQ29sb3JTcGFjZSYgb3RoZXIpIGNvbnN0IHsKLSAgaWYgKHByaW1hcmllc18gPCBvdGhlci5wcmltYXJpZXNfKQotICAgIHJldHVybiB0cnVlOwotICBpZiAocHJpbWFyaWVzXyA+IG90aGVyLnByaW1hcmllc18pCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAodHJhbnNmZXJfIDwgb3RoZXIudHJhbnNmZXJfKQotICAgIHJldHVybiB0cnVlOwotICBpZiAodHJhbnNmZXJfID4gb3RoZXIudHJhbnNmZXJfKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKG1hdHJpeF8gPCBvdGhlci5tYXRyaXhfKQotICAgIHJldHVybiB0cnVlOwotICBpZiAobWF0cml4XyA+IG90aGVyLm1hdHJpeF8pCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAocmFuZ2VfIDwgb3RoZXIucmFuZ2VfKQotICAgIHJldHVybiB0cnVlOwotICBpZiAocmFuZ2VfID4gb3RoZXIucmFuZ2VfKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKHByaW1hcmllc18gPT0ga1ByaW1hcnlJZEN1c3RvbSkgewotICAgIGludCBwcmltYXJ5X3Jlc3VsdCA9Ci0gICAgICAgIFNiTWVtb3J5Q29tcGFyZShjdXN0b21fcHJpbWFyeV9tYXRyaXhfLCBvdGhlci5jdXN0b21fcHJpbWFyeV9tYXRyaXhfLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGN1c3RvbV9wcmltYXJ5X21hdHJpeF8pKTsKLSAgICBpZiAocHJpbWFyeV9yZXN1bHQgPCAwKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgaWYgKHByaW1hcnlfcmVzdWx0ID4gMCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBnZngKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2NvbG9yX3NwYWNlLmggYi9zcmMvbWVkaWEvYmFzZS9jb2xvcl9zcGFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDA4NmEwLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL2NvbG9yX3NwYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBDT0JBTFRfTUVESUFfQkFTRV9DT0xPUl9TUEFDRV9IXwotI2RlZmluZSBDT0JBTFRfTUVESUFfQkFTRV9DT0xPUl9TUEFDRV9IXwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlICJiYXNlL2d0ZXN0X3Byb2RfdXRpbC5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJ1aWxkL2J1aWxkX2NvbmZpZy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZ2Z4X2V4cG9ydC5oIgotCi1uYW1lc3BhY2UgSVBDIHsKLXRlbXBsYXRlIDxjbGFzcyBQPgotc3RydWN0IFBhcmFtVHJhaXRzOwotfSAgLy8gbmFtZXNwYWNlIElQQwotCi0KLS8vIFRoaXMgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIGdmeDo6Q29sb3JTcGFjZSB3aXRoIFNraWEgZGVwZW5kZW5jeSByZW1vdmVkLgotLy8gSXQgaXMgdGVudGF0aXZlbHkgcHV0IGluc2lkZSBtZWRpYTIgdG8gYXZvaWQgaW50cm9kdWNpbmcgbmV3IGNvZGUgaW50bwotLy8gdWkvZ2Z4LiAgSXQgd2lsbCBiZSBmdXJ0aGVyIHNpbXBsaWZpZWQgYW5kIG1lcmdlZCBpbnRvIG1lZGlhIGluIGZvbGxvdyB1cAotLy8gcmVmYWN0b3JzLgotbmFtZXNwYWNlIGdmeCB7Ci0KLS8vIFVzZWQgdG8gcmVwcmVzZXQgYSBjb2xvciBzcGFjZSBmb3IgdGhlIHB1cnBvc2Ugb2YgY29sb3IgY29udmVyc2lvbi4KLS8vIFRoaXMgaXMgZGVzaWduZWQgdG8gYmUgc2FmZSBhbmQgY29tcGFjdCBlbm91Z2ggdG8gc2VuZCBvdmVyIElQQwotLy8gYmV0d2VlbiBhbnkgcHJvY2Vzc2VzLgotY2xhc3MgQ29sb3JTcGFjZSB7Ci0gcHVibGljOgotICBlbnVtIFByaW1hcnlJRCB7Ci0gICAgLy8gVGhlIGZpcnN0IDAtMjU1IHZhbHVlcyBzaG91bGQgbWF0Y2ggdGhlIEgyNjQgc3BlY2lmaWNhdGlvbiAoc2VlIFRhYmxlIEUtMwotICAgIC8vIENvbG91ciBQcmltYXJpZXMgaW4gaHR0cHM6Ly93d3cuaXR1LmludC9yZWMvVC1SRUMtSC4yNjQvZW4pLgotICAgIGtQcmltYXJ5SWRSZXNlcnZlZDAgPSAwLAotICAgIGtQcmltYXJ5SWRCdDcwOSA9IDEsCi0gICAga1ByaW1hcnlJZFVuc3BlY2lmaWVkID0gMiwKLSAgICBrUHJpbWFyeUlkUmVzZXJ2ZWQgPSAzLAotICAgIGtQcmltYXJ5SWRCdDQ3ME0gPSA0LAotICAgIGtQcmltYXJ5SWRCdDQ3MEJnID0gNSwKLSAgICBrUHJpbWFyeUlkU21wdGUxNzBNID0gNiwKLSAgICBrUHJpbWFyeUlkU21wdGUyNDBNID0gNywKLSAgICBrUHJpbWFyeUlkRmlsbSA9IDgsCi0gICAga1ByaW1hcnlJZEJ0MjAyMCA9IDksCi0gICAga1ByaW1hcnlJZFNtcHRlU3Q0MjgxID0gMTAsCi0gICAga1ByaW1hcnlJZFNtcHRlU3Q0MzEyID0gMTEsCi0gICAga1ByaW1hcnlJZFNtcHRlU3Q0MzIxID0gMTIsCi0KLSAgICBrUHJpbWFyeUlkTGFzdFN0YW5kYXJkVmFsdWUgPSBrUHJpbWFyeUlkU21wdGVTdDQzMjEsCi0KLSAgICAvLyBDaHJvbWUtc3BlY2lmaWMgdmFsdWVzIHN0YXJ0IGF0IDEwMDAuCi0gICAga1ByaW1hcnlJZFVua25vd24gPSAxMDAwLAotICAgIGtQcmltYXJ5SWRYeXpENTAsCi0gICAga1ByaW1hcnlJZEN1c3RvbSwKLSAgICBrUHJpbWFyeUlkTGFzdCA9IGtQcmltYXJ5SWRDdXN0b20KLSAgfTsKLQotICBlbnVtIFRyYW5zZmVySUQgewotICAgIC8vIFRoZSBmaXJzdCAwLTI1NSB2YWx1ZXMgc2hvdWxkIG1hdGNoIHRoZSBIMjY0IHNwZWNpZmljYXRpb24gKHNlZSBUYWJsZSBFLTQKLSAgICAvLyBUcmFuc2ZlciBDaGFyYWN0ZXJpc3RpY3MgaW4gaHR0cHM6Ly93d3cuaXR1LmludC9yZWMvVC1SRUMtSC4yNjQvZW4pLgotICAgIGtUcmFuc2ZlcklkUmVzZXJ2ZWQwID0gMCwKLSAgICBrVHJhbnNmZXJJZEJ0NzA5ID0gMSwKLSAgICBrVHJhbnNmZXJJZFVuc3BlY2lmaWVkID0gMiwKLSAgICBrVHJhbnNmZXJJZFJlc2VydmVkID0gMywKLSAgICBrVHJhbnNmZXJJZEdhbW1hMjIgPSA0LAotICAgIGtUcmFuc2ZlcklkR2FtbWEyOCA9IDUsCi0gICAga1RyYW5zZmVySWRTbXB0ZTE3ME0gPSA2LAotICAgIGtUcmFuc2ZlcklkU21wdGUyNDBNID0gNywKLSAgICBrVHJhbnNmZXJJZExpbmVhciA9IDgsCi0gICAga1RyYW5zZmVySWRMb2cgPSA5LAotICAgIGtUcmFuc2ZlcklkTG9nU3FydCA9IDEwLAotICAgIGtUcmFuc2ZlcklkSWVjNjE5NjYyNCA9IDExLAotICAgIGtUcmFuc2ZlcklkQnQxMzYxRWNnID0gMTIsCi0gICAga1RyYW5zZmVySWRJZWM2MTk2NjIxID0gMTMsCi0gICAga1RyYW5zZmVySWQxMEJpdEJ0MjAyMCA9IDE0LAotICAgIGtUcmFuc2ZlcklkMTJCaXRCdDIwMjAgPSAxNSwKLSAgICBrVHJhbnNmZXJJZFNtcHRlU3QyMDg0ID0gMTYsCi0gICAga1RyYW5zZmVySWRTbXB0ZVN0NDI4MSA9IDE3LAotICAgIGtUcmFuc2ZlcklkQXJpYlN0ZEI2NyA9IDE4LCAgLy8gQUtBIGh5YnJpZC1sb2cgZ2FtbWEsIEhMRy4KLQotICAgIGtUcmFuc2ZlcklkTGFzdFN0YW5kYXJkVmFsdWUgPSBrVHJhbnNmZXJJZFNtcHRlU3Q0MjgxLAotCi0gICAgLy8gQ2hyb21lLXNwZWNpZmljIHZhbHVlcyBzdGFydCBhdCAxMDAwLgotICAgIGtUcmFuc2ZlcklkVW5rbm93biA9IDEwMDAsCi0gICAga1RyYW5zZmVySWRHYW1tYTI0LAotCi0gICAgLy8gVGhpcyBpcyBhbiBhZC1ob2MgdHJhbnNmZXIgZnVuY3Rpb24gdGhhdCBkZWNvZGVzIFNNUFRFIDIwODQgY29udGVudAotICAgIC8vIGludG8gYSAwLTEgcmFuZ2UgbW9yZSBvciBsZXNzIHN1aXRhYmxlIGZvciB2aWV3aW5nIG9uIGEgbm9uLWhkcgotICAgIC8vIGRpc3BsYXkuCi0gICAga1RyYW5zZmVySWRTbXB0ZVN0MjA4NE5vbkhkciwKLQotICAgIC8vIFRPRE8oaHViYmUpOiBOZWVkIHRvIHN0b3JlIGFuIGFwcHJveGltYXRpb24gb2YgdGhlIGdhbW1hIGZ1bmN0aW9uKHMpLgotICAgIGtUcmFuc2ZlcklkQ3VzdG9tLAotICAgIGtUcmFuc2ZlcklkTGFzdCA9IGtUcmFuc2ZlcklkQ3VzdG9tLAotICB9OwotCi0gIGVudW0gTWF0cml4SUQgewotICAgIC8vIFRoZSBmaXJzdCAwLTI1NSB2YWx1ZXMgc2hvdWxkIG1hdGNoIHRoZSBIMjY0IHNwZWNpZmljYXRpb24gKHNlZSBUYWJsZSBFLTUKLSAgICAvLyBNYXRyaXggQ29lZmZpY2llbnRzIGluIGh0dHBzOi8vd3d3Lml0dS5pbnQvcmVjL1QtUkVDLUguMjY0L2VuKS4KLSAgICBrTWF0cml4SWRSZ2IgPSAwLAotICAgIGtNYXRyaXhJZEJ0NzA5ID0gMSwKLSAgICBrTWF0cml4SWRVbnNwZWNpZmllZCA9IDIsCi0gICAga01hdHJpeElkUmVzZXJ2ZWQgPSAzLAotICAgIGtNYXRyaXhJZEZjYyA9IDQsCi0gICAga01hdHJpeElkQnQ0NzBCZyA9IDUsCi0gICAga01hdHJpeElkU21wdGUxNzBNID0gNiwKLSAgICBrTWF0cml4SWRTbXB0ZTI0ME0gPSA3LAotICAgIGtNYXRyaXhJZFlDZ0NvID0gOCwKLSAgICBrTWF0cml4SWRCdDIwMjBOb25jb25zdGFudEx1bWluYW5jZSA9IDksCi0gICAga01hdHJpeElkQnQyMDIwQ29uc3RhbnRMdW1pbmFuY2UgPSAxMCwKLSAgICBrTWF0cml4SWRZRHpEeCA9IDExLAotCi0gICAga01hdHJpeElkTGFzdFN0YW5kYXJkVmFsdWUgPSBrTWF0cml4SWRZRHpEeCwKLQotICAgIC8vIENocm9tZS1zcGVjaWZpYyB2YWx1ZXMgc3RhcnQgYXQgMTAwMAotICAgIGtNYXRyaXhJZFVua25vd24gPSAxMDAwLAotICAgIGtNYXRyaXhJZExhc3QgPSBrTWF0cml4SWRVbmtub3duLAotICB9OwotCi0gIC8vIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIFdlYk0gUmFuZ2UgZW51bSB3aGljaCBpcyBwYXJ0IG9mIFdlYk0gY29sb3IgZGF0YQotICAvLyAoc2VlIGh0dHA6Ly93d3cud2VibXByb2plY3Qub3JnL2RvY3MvY29udGFpbmVyLyNSYW5nZSkuCi0gIC8vIEguMjY0IG9ubHkgdXNlcyBhIGJvb2wsIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBMSU1JVEVEL0ZVTEwgdmFsdWVzLgotICAvLyBDaHJvbWUtc3BlY2lmaWMgdmFsdWVzIHN0YXJ0IGF0IDEwMDAuCi0gIGVudW0gUmFuZ2VJRCB7Ci0gICAgLy8gUmFuZ2UgaXMgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkIC8gdW5rbm93bi4KLSAgICBrUmFuZ2VJZFVuc3BlY2lmaWVkID0gMCwKLQotICAgIC8vIExpbWl0ZWQgUmVjLiA3MDkgY29sb3IgcmFuZ2Ugd2l0aCBSR0IgdmFsdWVzIHJhbmdpbmcgZnJvbSAxNiB0byAyMzUuCi0gICAga1JhbmdlSWRMaW1pdGVkID0gMSwKLQotICAgIC8vIEZ1bGwgUkdCIGNvbG9yIHJhbmdlIHdpdGggUkdCIHZhbGVlcyBmcm9tIDAgdG8gMjU1LgotICAgIGtSYW5nZUlkRnVsbCA9IDIsCi0KLSAgICAvLyBSYW5nZSBpcyBkZWZpbmVkIGJ5IFRyYW5zZmVySUQvTWF0cml4SUQuCi0gICAga1JhbmdlSWREZXJpdmVkID0gMywKLQotICAgIGtSYW5nZUlkTGFzdCA9IGtSYW5nZUlkRGVyaXZlZAotICB9OwotCi0gIENvbG9yU3BhY2UoKTsKLSAgQ29sb3JTcGFjZShQcmltYXJ5SUQgcHJpbWFyaWVzLAotICAgICAgICAgICAgIFRyYW5zZmVySUQgdHJhbnNmZXIsCi0gICAgICAgICAgICAgTWF0cml4SUQgbWF0cml4LAotICAgICAgICAgICAgIFJhbmdlSUQgZnVsbF9yYW5nZSk7Ci0gIENvbG9yU3BhY2UoY29uc3QgQ29sb3JTcGFjZSYgb3RoZXIpOwotICBDb2xvclNwYWNlKGludCBwcmltYXJpZXMsIGludCB0cmFuc2ZlciwgaW50IG1hdHJpeCwgUmFuZ2VJRCBmdWxsX3JhbmdlKTsKLSAgfkNvbG9yU3BhY2UoKTsKLQotICB0eXBlZGVmIGZsb2F0IEN1c3RvbVByaW1hcnlNYXRyaXhbMTJdOwotCi0gIHN0YXRpYyBQcmltYXJ5SUQgUHJpbWFyeUlERnJvbUludChpbnQgcHJpbWFyeV9pZCk7Ci0gIHN0YXRpYyBUcmFuc2ZlcklEIFRyYW5zZmVySURGcm9tSW50KGludCB0cmFuc2Zlcl9pZCk7Ci0gIHN0YXRpYyBNYXRyaXhJRCBNYXRyaXhJREZyb21JbnQoaW50IG1hdHJpeF9pZCk7Ci0KLSAgc3RhdGljIENvbG9yU3BhY2UgQ3JlYXRlWFlaRDUwKCk7Ci0KLSAgLy8gVE9ETzogUmVtb3ZlIHRoZXNlLCBhbmQgcmVwbGFjZSB3aXRoIG1vcmUgZ2VuZXJpYyBjb25zdHJ1Y3RvcnMuCi0gIHN0YXRpYyBDb2xvclNwYWNlIENyZWF0ZUpwZWcoKTsKLSAgc3RhdGljIENvbG9yU3BhY2UgQ3JlYXRlUkVDNjAxKCk7Ci0gIHN0YXRpYyBDb2xvclNwYWNlIENyZWF0ZVJFQzcwOSgpOwotCi0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDb2xvclNwYWNlJiBvdGhlcikgY29uc3Q7Ci0gIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDb2xvclNwYWNlJiBvdGhlcikgY29uc3Q7Ci0gIGJvb2wgb3BlcmF0b3I8KGNvbnN0IENvbG9yU3BhY2UmIG90aGVyKSBjb25zdDsKLQotICBQcmltYXJ5SUQgcHJpbWFyaWVzKCkgY29uc3QgeyByZXR1cm4gcHJpbWFyaWVzXzsgfQotICBUcmFuc2ZlcklEIHRyYW5zZmVyKCkgY29uc3QgeyByZXR1cm4gdHJhbnNmZXJfOyB9Ci0gIE1hdHJpeElEIG1hdHJpeCgpIGNvbnN0IHsgcmV0dXJuIG1hdHJpeF87IH0KLSAgUmFuZ2VJRCByYW5nZSgpIGNvbnN0IHsgcmV0dXJuIHJhbmdlXzsgfQotCi0gIGNvbnN0IEN1c3RvbVByaW1hcnlNYXRyaXgmIGN1c3RvbV9wcmltYXJ5X21hdHJpeCgpIGNvbnN0IHsKLSAgICBEQ0hFQ0tfRVEocHJpbWFyaWVzXywga1ByaW1hcnlJZEN1c3RvbSk7Ci0gICAgcmV0dXJuIGN1c3RvbV9wcmltYXJ5X21hdHJpeF87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIFByaW1hcnlJRCBwcmltYXJpZXNfOwotICBUcmFuc2ZlcklEIHRyYW5zZmVyXzsKLSAgTWF0cml4SUQgbWF0cml4XzsKLSAgUmFuZ2VJRCByYW5nZV87Ci0KLSAgLy8gT25seSB1c2VkIGlmIHByaW1hcmllc18gPT0ga1ByaW1hcnlJZEN1c3RvbQotICBmbG9hdCBjdXN0b21fcHJpbWFyeV9tYXRyaXhfWzEyXTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBnZngKLQotI2VuZGlmICAvLyBDT0JBTFRfTUVESUFfQkFTRV9DT0xPUl9TUEFDRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvZGF0YV9idWZmZXIuY2MgYi9zcmMvbWVkaWEvYmFzZS9kYXRhX2J1ZmZlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhjYTQ5MS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9kYXRhX2J1ZmZlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RhdGFfYnVmZmVyLmgiCi0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotRGF0YUJ1ZmZlcjo6RGF0YUJ1ZmZlcihzY29wZWRfYXJyYXk8dWludDg+IGJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKQotICAgIDogQnVmZmVyKGJhc2U6OlRpbWVEZWx0YSgpLCBiYXNlOjpUaW1lRGVsdGEoKSksCi0gICAgICBkYXRhXyhidWZmZXIuUGFzcygpKSwKLSAgICAgIGJ1ZmZlcl9zaXplXyhidWZmZXJfc2l6ZSksCi0gICAgICBkYXRhX3NpemVfKGJ1ZmZlcl9zaXplKSB7Ci19Ci0KLURhdGFCdWZmZXI6OkRhdGFCdWZmZXIoaW50IGJ1ZmZlcl9zaXplKQotICAgIDogQnVmZmVyKGJhc2U6OlRpbWVEZWx0YSgpLCBiYXNlOjpUaW1lRGVsdGEoKSksCi0gICAgICBidWZmZXJfc2l6ZV8oYnVmZmVyX3NpemUpLAotICAgICAgZGF0YV9zaXplXygwKSB7Ci0gIEluaXRpYWxpemUoKTsKLX0KLQotRGF0YUJ1ZmZlcjo6RGF0YUJ1ZmZlcihjb25zdCB1aW50OCogZGF0YSwgaW50IGRhdGFfc2l6ZSkKLSAgICA6IEJ1ZmZlcihiYXNlOjpUaW1lRGVsdGEoKSwgYmFzZTo6VGltZURlbHRhKCkpLAotICAgICAgYnVmZmVyX3NpemVfKGRhdGFfc2l6ZSksCi0gICAgICBkYXRhX3NpemVfKGRhdGFfc2l6ZSkgewotICBJbml0aWFsaXplKCk7Ci0gIG1lbWNweShkYXRhXy5nZXQoKSwgZGF0YSwgZGF0YV9zaXplXyk7Ci19Ci0KLURhdGFCdWZmZXI6On5EYXRhQnVmZmVyKCkge30KLQotdm9pZCBEYXRhQnVmZmVyOjpJbml0aWFsaXplKCkgewotICAvLyBQcmV2ZW50IGFyYml0cmFyeSBwb2ludGVycy4KLSAgaWYgKGJ1ZmZlcl9zaXplXyA8PSAwKSB7Ci0gICAgYnVmZmVyX3NpemVfID0gZGF0YV9zaXplXyA9IDA7Ci0gICAgZGF0YV8ucmVzZXQoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBkYXRhXy5yZXNldChuZXcgdWludDhbYnVmZmVyX3NpemVfXSk7Ci19Ci0KLWNvbnN0IHVpbnQ4KiBEYXRhQnVmZmVyOjpHZXREYXRhKCkgY29uc3QgewotICByZXR1cm4gZGF0YV8uZ2V0KCk7Ci19Ci0KLWludCBEYXRhQnVmZmVyOjpHZXREYXRhU2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGRhdGFfc2l6ZV87Ci19Ci0KLXVpbnQ4KiBEYXRhQnVmZmVyOjpHZXRXcml0YWJsZURhdGEoKSB7Ci0gIHJldHVybiBkYXRhXy5nZXQoKTsKLX0KLQotdm9pZCBEYXRhQnVmZmVyOjpTZXREYXRhU2l6ZShpbnQgZGF0YV9zaXplKSB7Ci0gIERDSEVDS19MRShkYXRhX3NpemUsIGJ1ZmZlcl9zaXplXyk7Ci0gIGRhdGFfc2l6ZV8gPSBkYXRhX3NpemU7Ci19Ci0KLWludCBEYXRhQnVmZmVyOjpHZXRCdWZmZXJTaXplKCkgY29uc3QgewotICByZXR1cm4gYnVmZmVyX3NpemVfOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2RhdGFfYnVmZmVyLmggYi9zcmMvbWVkaWEvYmFzZS9kYXRhX2J1ZmZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmU5YWY1Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL2RhdGFfYnVmZmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBBIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBCdWZmZXIgdGhhdCB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIGdpdmVuIGRhdGEKLS8vIHBvaW50ZXIuCi0vLwotLy8gRGF0YUJ1ZmZlciBhc3N1bWVzIHRoYXQgbWVtb3J5IHdhcyBhbGxvY2F0ZWQgd2l0aCBuZXcgdWludDhbXS4KLQotI2lmbmRlZiBNRURJQV9CQVNFX0RBVEFfQlVGRkVSX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfREFUQV9CVUZGRVJfSF8KLQotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2J1ZmZlcnMuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgTUVESUFfRVhQT1JUIERhdGFCdWZmZXIgOiBwdWJsaWMgQnVmZmVyIHsKLSBwdWJsaWM6Ci0gIC8vIEFzc3VtZXMgdmFsaWQgZGF0YSBvZiBzaXplIHxidWZmZXJfc2l6ZXwuCi0gIERhdGFCdWZmZXIoc2NvcGVkX2FycmF5PHVpbnQ4PiBidWZmZXIsIGludCBidWZmZXJfc2l6ZSk7Ci0KLSAgLy8gQWxsb2NhdGVzIGJ1ZmZlciBvZiBzaXplIHxidWZmZXJfc2l6ZXwuIElmIHxidWZmZXJfc2l6ZXwgaXMgMCwgfGRhdGFffCBpcwotICAvLyBzZXQgdG8gYSBOVUxMIHB0ci4KLSAgZXhwbGljaXQgRGF0YUJ1ZmZlcihpbnQgYnVmZmVyX3NpemUpOwotCi0gIC8vIEFsbG9jYXRlcyBidWZmZXIgb2Ygc2l6ZSB8ZGF0YV9zaXplfCwgY29waWVzIFtkYXRhLGRhdGErZGF0YV9zaXplKSB0bwotICAvLyB0aGUgYWxsb2NhdGVkIGJ1ZmZlciBhbmQgc2V0cyBkYXRhIHNpemUgdG8gfGRhdGFfc2l6ZXwuCi0gIERhdGFCdWZmZXIoY29uc3QgdWludDgqIGRhdGEsIGludCBkYXRhX3NpemUpOwotCi0gIC8vIEJ1ZmZlciBpbXBsZW1lbnRhdGlvbi4KLSAgdmlydHVhbCBjb25zdCB1aW50OCogR2V0RGF0YSgpIGNvbnN0IE9WRVJSSURFOwotICB2aXJ0dWFsIGludCBHZXREYXRhU2l6ZSgpIGNvbnN0IE9WRVJSSURFOwotCi0gIC8vIFJldHVybnMgYSByZWFkLXdyaXRlIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBkYXRhLgotICB2aXJ0dWFsIHVpbnQ4KiBHZXRXcml0YWJsZURhdGEoKTsKLQotICAvLyBVcGRhdGVzIHRoZSBzaXplIG9mIHZhbGlkIGRhdGEgaW4gYnl0ZXMsIHdoaWNoIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsCi0gIC8vIHRvIEdldEJ1ZmZlclNpemUoKS4KLSAgdmlydHVhbCB2b2lkIFNldERhdGFTaXplKGludCBkYXRhX3NpemUpOwotCi0gIC8vIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIHVuZGVybHlpbmcgYnVmZmVyLgotICB2aXJ0dWFsIGludCBHZXRCdWZmZXJTaXplKCkgY29uc3Q7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgfkRhdGFCdWZmZXIoKTsKLQotIHByaXZhdGU6Ci0gIC8vIENvbnN0cnVjdG9yIGhlbHBlciBtZXRob2QgZm9yIG1lbW9yeSBhbGxvY2F0aW9ucy4KLSAgdm9pZCBJbml0aWFsaXplKCk7Ci0KLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiBkYXRhXzsKLSAgaW50IGJ1ZmZlcl9zaXplXzsKLSAgaW50IGRhdGFfc2l6ZV87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKERhdGFCdWZmZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQkFTRV9EQVRBX0JVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvZGF0YV9idWZmZXJfdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvYmFzZS9kYXRhX2J1ZmZlcl91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFkODM4OS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9kYXRhX2J1ZmZlcl91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJiYXNlL3N0cmluZ191dGlsLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kYXRhX2J1ZmZlci5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1URVNUKERhdGFCdWZmZXJUZXN0LCBDb25zdHJ1Y3RvcnMpIHsKLSAgY29uc3QgdWludDgga1Rlc3REYXRhW10gPSB7IDB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcgfTsKLSAgY29uc3QgaW50IGtUZXN0RGF0YVNpemUgPSBhcnJheXNpemUoa1Rlc3REYXRhKTsKLQotICBzY29wZWRfcmVmcHRyPERhdGFCdWZmZXI+IGJ1ZmZlcihuZXcgRGF0YUJ1ZmZlcigwKSk7Ci0gIEVYUEVDVF9GQUxTRShidWZmZXItPkdldERhdGEoKSk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxEYXRhQnVmZmVyPiBidWZmZXIyKG5ldyBEYXRhQnVmZmVyKGtUZXN0RGF0YVNpemUpKTsKLSAgRVhQRUNUX0VRKDAsIGJ1ZmZlcjItPkdldERhdGFTaXplKCkpOwotICBFWFBFQ1RfRVEoa1Rlc3REYXRhU2l6ZSwgYnVmZmVyMi0+R2V0QnVmZmVyU2l6ZSgpKTsKLQotICBzY29wZWRfcmVmcHRyPERhdGFCdWZmZXI+IGJ1ZmZlcjMobmV3IERhdGFCdWZmZXIoa1Rlc3REYXRhLCBrVGVzdERhdGFTaXplKSk7Ci0gIEVYUEVDVF9FUShrVGVzdERhdGFTaXplLCBidWZmZXIzLT5HZXREYXRhU2l6ZSgpKTsKLSAgRVhQRUNUX0VRKGtUZXN0RGF0YVNpemUsIGJ1ZmZlcjMtPkdldEJ1ZmZlclNpemUoKSk7Ci0gIEFTU0VSVF9FUSgwLCBtZW1jbXAoYnVmZmVyMy0+R2V0RGF0YSgpLCBrVGVzdERhdGEsIGtUZXN0RGF0YVNpemUpKTsKLSAgLy8gRW5zdXJlIHdlIGFyZSBjb3B5aW5nIHRoZSBkYXRhLCBub3QganVzdCBwb2ludGluZyB0byB0aGUgb3JpZ2luYWwgZGF0YS4KLSAgYnVmZmVyMy0+R2V0V3JpdGFibGVEYXRhKClbMF0gPSAweEZGOwotICBBU1NFUlRfTkUoMCwgbWVtY21wKGJ1ZmZlcjMtPkdldERhdGEoKSwga1Rlc3REYXRhLCBrVGVzdERhdGFTaXplKSk7Ci19Ci0KLVRFU1QoRGF0YUJ1ZmZlclRlc3QsIFJlYWRpbmdXcml0aW5nKSB7Ci0gIGNvbnN0IGNoYXIga0RhdGFbXSA9ICJoZWxsbyI7Ci0gIGNvbnN0IGludCBrRGF0YVNpemUgPSBhcnJheXNpemUoa0RhdGEpOwotICBjb25zdCBjaGFyIGtOZXdEYXRhW10gPSAiY2hyb21pdW0iOwotICBjb25zdCBpbnQga05ld0RhdGFTaXplID0gYXJyYXlzaXplKGtOZXdEYXRhKTsKLQotICAvLyBDcmVhdGUgYSBEYXRhQnVmZmVyLgotICBzY29wZWRfcmVmcHRyPERhdGFCdWZmZXI+IGJ1ZmZlcihuZXcgRGF0YUJ1ZmZlcihrRGF0YVNpemUpKTsKLSAgQVNTRVJUX1RSVUUoYnVmZmVyKTsKLQotICB1aW50OCogZGF0YSA9IGJ1ZmZlci0+R2V0V3JpdGFibGVEYXRhKCk7Ci0gIEFTU0VSVF9UUlVFKGRhdGEpOwotICBBU1NFUlRfRVEoa0RhdGFTaXplLCBidWZmZXItPkdldEJ1ZmZlclNpemUoKSk7Ci0gIG1lbWNweShkYXRhLCBrRGF0YSwga0RhdGFTaXplKTsKLSAgYnVmZmVyLT5TZXREYXRhU2l6ZShrRGF0YVNpemUpOwotICBjb25zdCB1aW50OCogcmVhZF9vbmx5X2RhdGEgPSBidWZmZXItPkdldERhdGEoKTsKLSAgQVNTRVJUX0VRKGRhdGEsIHJlYWRfb25seV9kYXRhKTsKLSAgQVNTRVJUX0VRKDAsIG1lbWNtcChyZWFkX29ubHlfZGF0YSwga0RhdGEsIGtEYXRhU2l6ZSkpOwotICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5Jc0VuZE9mU3RyZWFtKCkpOwotCi0gIHNjb3BlZF9yZWZwdHI8RGF0YUJ1ZmZlcj4gYnVmZmVyMihuZXcgRGF0YUJ1ZmZlcihrTmV3RGF0YVNpemUgKyAxMCkpOwotICBkYXRhID0gYnVmZmVyMi0+R2V0V3JpdGFibGVEYXRhKCk7Ci0gIEFTU0VSVF9UUlVFKGRhdGEpOwotICBBU1NFUlRfRVEoa05ld0RhdGFTaXplICsgMTAsIGJ1ZmZlcjItPkdldEJ1ZmZlclNpemUoKSk7Ci0gIG1lbWNweShkYXRhLCBrTmV3RGF0YSwga05ld0RhdGFTaXplKTsKLSAgYnVmZmVyMi0+U2V0RGF0YVNpemUoa05ld0RhdGFTaXplKTsKLSAgcmVhZF9vbmx5X2RhdGEgPSBidWZmZXIyLT5HZXREYXRhKCk7Ci0gIEVYUEVDVF9FUShrTmV3RGF0YVNpemUsIGJ1ZmZlcjItPkdldERhdGFTaXplKCkpOwotICBBU1NFUlRfRVEoZGF0YSwgcmVhZF9vbmx5X2RhdGEpOwotICBFWFBFQ1RfRVEoMCwgbWVtY21wKHJlYWRfb25seV9kYXRhLCBrTmV3RGF0YSwga05ld0RhdGFTaXplKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvZGF0YV9zb3VyY2UuY2MgYi9zcmMvbWVkaWEvYmFzZS9kYXRhX3NvdXJjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI1ZjllNy4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9kYXRhX3NvdXJjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RhdGFfc291cmNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gc3RhdGljCi1jb25zdCBpbnQgRGF0YVNvdXJjZTo6a1JlYWRFcnJvciA9IC0xOwotCi1EYXRhU291cmNlSG9zdDo6fkRhdGFTb3VyY2VIb3N0KCkge30KLQotRGF0YVNvdXJjZTo6RGF0YVNvdXJjZSgpIDogaG9zdF8oTlVMTCkge30KLQotRGF0YVNvdXJjZTo6fkRhdGFTb3VyY2UoKSB7fQotCi12b2lkIERhdGFTb3VyY2U6OnNldF9ob3N0KERhdGFTb3VyY2VIb3N0KiBob3N0KSB7Ci0gIERDSEVDSyhob3N0KTsKLSAgRENIRUNLKCFob3N0Xyk7Ci0gIGhvc3RfID0gaG9zdDsKLX0KLQotdm9pZCBEYXRhU291cmNlOjpTZXRQbGF5YmFja1JhdGUoZmxvYXQgcGxheWJhY2tfcmF0ZSkge30KLQotRGF0YVNvdXJjZUhvc3QqIERhdGFTb3VyY2U6Omhvc3QoKSB7IHJldHVybiBob3N0XzsgfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2RhdGFfc291cmNlLmggYi9zcmMvbWVkaWEvYmFzZS9kYXRhX3NvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGUyMjEzLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL2RhdGFfc291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0JBU0VfREFUQV9TT1VSQ0VfSF8KLSNkZWZpbmUgTUVESUFfQkFTRV9EQVRBX1NPVVJDRV9IXwotCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgotI2luY2x1ZGUgImJhc2UvdGltZS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIE1FRElBX0VYUE9SVCBEYXRhU291cmNlSG9zdCB7Ci0gcHVibGljOgotICAvLyBTZXQgdGhlIHRvdGFsIHNpemUgb2YgdGhlIG1lZGlhIGZpbGUuCi0gIHZpcnR1YWwgdm9pZCBTZXRUb3RhbEJ5dGVzKGludDY0IHRvdGFsX2J5dGVzKSA9IDA7Ci0KLSAgLy8gTm90aWZ5IHRoZSBob3N0IHRoYXQgYnl0ZSByYW5nZSBbc3RhcnQsZW5kXSBoYXMgYmVlbiBidWZmZXJlZC4KLSAgLy8gVE9ETyhmaXNjaG1hbik6IHJlbW92ZSB0aGlzIG1ldGhvZCB3aGVuIGRlbXV4aW5nIGlzIHB1c2gtYmFzZWQgaW5zdGVhZCBvZgotICAvLyBwdWxsLWJhc2VkLiAgaHR0cDovL2NyYnVnLmNvbS8xMzE0NDQKLSAgdmlydHVhbCB2b2lkIEFkZEJ1ZmZlcmVkQnl0ZVJhbmdlKGludDY0IHN0YXJ0LCBpbnQ2NCBlbmQpID0gMDsKLQotICAvLyBOb3RpZnkgdGhlIGhvc3QgdGhhdCB0aW1lIHJhbmdlIFtzdGFydCxlbmRdIGhhcyBiZWVuIGJ1ZmZlcmVkLgotICB2aXJ0dWFsIHZvaWQgQWRkQnVmZmVyZWRUaW1lUmFuZ2UoYmFzZTo6VGltZURlbHRhIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhIGVuZCkgPSAwOwotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIH5EYXRhU291cmNlSG9zdCgpOwotfTsKLQotY2xhc3MgTUVESUFfRVhQT1JUIERhdGFTb3VyY2UgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKGludDY0LCBpbnQ2NCk+IFN0YXR1c0NhbGxiYWNrOwotICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHZvaWQoaW50KT4gUmVhZENCOwotICBzdGF0aWMgY29uc3QgaW50IGtSZWFkRXJyb3I7Ci0KLSAgRGF0YVNvdXJjZSgpOwotCi0gIHZpcnR1YWwgdm9pZCBzZXRfaG9zdChEYXRhU291cmNlSG9zdCogaG9zdCk7Ci0KLSAgLy8gUmVhZHMgfHNpemV8IGJ5dGVzIGZyb20gfHBvc2l0aW9ufCBpbnRvIHxkYXRhfC4gQW5kIHdoZW4gdGhlIHJlYWQgaXMgZG9uZQotICAvLyBvciBmYWlsZWQsIHxyZWFkX2NifCBpcyBjYWxsZWQgd2l0aCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IKLSAgLy8ga1JlYWRFcnJvciBpbiBjYXNlIG9mIGVycm9yLgotICB2aXJ0dWFsIHZvaWQgUmVhZChpbnQ2NCBwb3NpdGlvbiwgaW50IHNpemUsIHVpbnQ4KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhU291cmNlOjpSZWFkQ0ImIHJlYWRfY2IpID0gMDsKLQotICAvLyBOb3RpZmllcyB0aGUgRGF0YVNvdXJjZSBvZiBhIGNoYW5nZSBpbiB0aGUgY3VycmVudCBwbGF5YmFjayByYXRlLgotICB2aXJ0dWFsIHZvaWQgU2V0UGxheWJhY2tSYXRlKGZsb2F0IHBsYXliYWNrX3JhdGUpOwotCi0gIC8vIFN0b3BzIHRoZSBEYXRhU291cmNlLiBPbmNlIHRoaXMgaXMgY2FsbGVkIGFsbCBmdXR1cmUgUmVhZCgpIGNhbGxzIHdpbGwKLSAgLy8gcmV0dXJuIGFuIGVycm9yLgotICB2aXJ0dWFsIHZvaWQgU3RvcCgpID0gMDsKLQotICAvLyBSZXR1cm5zIHRydWUgYW5kIHRoZSBmaWxlIHNpemUsIGZhbHNlIGlmIHRoZSBmaWxlIHNpemUgY291bGQgbm90IGJlCi0gIC8vIHJldHJpZXZlZC4KLSAgdmlydHVhbCBib29sIEdldFNpemUoaW50NjQqIHNpemVfb3V0KSA9IDA7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHdlIGFyZSBwZXJmb3JtaW5nIHN0cmVhbWluZy4gSW4gdGhpcyBjYXNlIHNlZWtpbmcgaXMKLSAgLy8gbm90IHBvc3NpYmxlLgotICB2aXJ0dWFsIGJvb2wgSXNTdHJlYW1pbmcoKSA9IDA7Ci0KLSAgLy8gTm90aWZ5IHRoZSBEYXRhU291cmNlIG9mIHRoZSBiaXRyYXRlIG9mIHRoZSBtZWRpYS4KLSAgLy8gVmFsdWVzIG9mIHxiaXRyYXRlfCA8PSAwIGFyZSBpbnZhbGlkIGFuZCBzaG91bGQgYmUgaWdub3JlZC4KLSAgdmlydHVhbCB2b2lkIFNldEJpdHJhdGUoaW50IGJpdHJhdGUpID0gMDsKLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB+RGF0YVNvdXJjZSgpOwotCi0gIERhdGFTb3VyY2VIb3N0KiBob3N0KCk7Ci0KLSBwcml2YXRlOgotICBEYXRhU291cmNlSG9zdCogaG9zdF87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKERhdGFTb3VyY2UpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQkFTRV9EQVRBX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXIuY2MgYi9zcmMvbWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRjNDE1MS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlci5oIgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNyeXB0X2NvbmZpZy5oIgotCi0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3NoZWxsX2J1ZmZlcl9mYWN0b3J5LmgiCi0jZW5kaWYgIC8vIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLQotI2lmICFkZWZpbmVkKE9TX0FORFJPSUQpCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvYWxpZ25lZF9tZW1vcnkuaCIKLSNlbmRpZgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotCi0vLyBzdGF0aWMKLXNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gRGVjb2RlckJ1ZmZlcjo6Q3JlYXRlRU9TQnVmZmVyKAotICAgIGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXApIHsKLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBlb3MgPQotICAgICAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPihuZXcgRGVjb2RlckJ1ZmZlcihOVUxMLCAwLCB0cnVlKSk7Ci0gIGVvcy0+U2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7Ci0gIHJldHVybiBlb3M7Ci19Ci0KLXZvaWQgRGVjb2RlckJ1ZmZlcjo6U2hyaW5rVG8oaW50IHNpemUpIHsKLSAgQ0hFQ0tfTEUoc2l6ZSwgR2V0QWxsb2NhdGVkU2l6ZSgpKTsKLSAgc2l6ZV8gPSBzaXplOwotfQotCi1EZWNvZGVyQnVmZmVyOjpEZWNvZGVyQnVmZmVyKHVpbnQ4KiByZXVzYWJsZV9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2tleWZyYW1lKQotICAgIDogQnVmZmVyKGtOb1RpbWVzdGFtcCgpLCBrSW5maW5pdGVEdXJhdGlvbigpKSwKLSAgICAgIGJ1ZmZlcl8ocmV1c2FibGVfYnVmZmVyKSwKLSAgICAgIHNpemVfKHNpemUpLAotICAgICAgYWxsb2NhdGVkX3NpemVfKHNpemUpLAotICAgICAgaXNfZGVjcnlwdGVkXyhmYWxzZSksCi0gICAgICBpc19rZXlmcmFtZV8oaXNfa2V5ZnJhbWUpIHsKLSAgaWYgKGJ1ZmZlcl8pIHsKLSAgICAvLyBSZXRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciBmYWN0b3J5LCB0byBlbnN1cmUgdGhhdCB3ZSBkbyBub3QKLSAgICAvLyBvdXRsaXZlIGl0LgotICAgIGJ1ZmZlcl9mYWN0b3J5XyA9IFNoZWxsQnVmZmVyRmFjdG9yeTo6SW5zdGFuY2UoKTsKLSAgfQotfQotCi1EZWNvZGVyQnVmZmVyOjp+RGVjb2RlckJ1ZmZlcigpIHsKLSAgLy8gcmVjeWNsZSBvdXIgYnVmZmVyCi0gIGlmIChidWZmZXJfKSB7Ci0gICAgVFJBQ0VfRVZFTlQxKCJtZWRpYV9zdGFjayIsICJEZWNvZGVyQnVmZmVyOjp+RGVjb2RlckJ1ZmZlcigpIiwKLSAgICAgICAgICAgICAgICAgInRpbWVzdGFtcCIsIEdldFRpbWVzdGFtcCgpLkluTWljcm9zZWNvbmRzKCkpOwotICAgIERDSEVDS19ORShidWZmZXJfZmFjdG9yeV8sIChTaGVsbEJ1ZmZlckZhY3RvcnkqKU5VTEwpOwotICAgIGJ1ZmZlcl9mYWN0b3J5Xy0+UmVjbGFpbShidWZmZXJfKTsKLSAgfQotfQotCi1jb25zdCBEZWNyeXB0Q29uZmlnKiBEZWNvZGVyQnVmZmVyOjpHZXREZWNyeXB0Q29uZmlnKCkgY29uc3QgewotICBEQ0hFQ0soIUlzRW5kT2ZTdHJlYW0oKSk7Ci0gIHJldHVybiBkZWNyeXB0X2NvbmZpZ18uZ2V0KCk7Ci19Ci0KLXZvaWQgRGVjb2RlckJ1ZmZlcjo6U2V0RGVjcnlwdENvbmZpZyhzY29wZWRfcHRyPERlY3J5cHRDb25maWc+IGRlY3J5cHRfY29uZmlnKSB7Ci0gIERDSEVDSyghSXNFbmRPZlN0cmVhbSgpKTsKLSAgZGVjcnlwdF9jb25maWdfID0gZGVjcnlwdF9jb25maWcuUGFzcygpOwotfQotCi12b2lkIERlY29kZXJCdWZmZXI6OlNldEJ1ZmZlcih1aW50OCogcmV1c2FibGVfYnVmZmVyKSB7Ci0gIGJ1ZmZlcl8gPSByZXVzYWJsZV9idWZmZXI7Ci0gIGlmIChidWZmZXJfKSB7Ci0gICAgLy8gUmV0YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgZmFjdG9yeSwgdG8gZW5zdXJlIHRoYXQgd2UgZG8gbm90Ci0gICAgLy8gb3V0bGl2ZSBpdC4KLSAgICBidWZmZXJfZmFjdG9yeV8gPSBTaGVsbEJ1ZmZlckZhY3Rvcnk6Okluc3RhbmNlKCk7Ci0gIH0KLX0KLQotI2Vsc2UgIC8vIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLQotRGVjb2RlckJ1ZmZlcjo6RGVjb2RlckJ1ZmZlcihpbnQgYnVmZmVyX3NpemUpCi0gICAgOiBCdWZmZXIoYmFzZTo6VGltZURlbHRhKCksIGJhc2U6OlRpbWVEZWx0YSgpKSwKLSAgICAgIGJ1ZmZlcl9zaXplXyhidWZmZXJfc2l6ZSkgewotICBJbml0aWFsaXplKCk7Ci19Ci0KLURlY29kZXJCdWZmZXI6OkRlY29kZXJCdWZmZXIoY29uc3QgdWludDgqIGRhdGEsIGludCBidWZmZXJfc2l6ZSkKLSAgICA6IEJ1ZmZlcihiYXNlOjpUaW1lRGVsdGEoKSwgYmFzZTo6VGltZURlbHRhKCkpLAotICAgICAgYnVmZmVyX3NpemVfKGJ1ZmZlcl9zaXplKSB7Ci0gIC8vIFByZXZlbnQgaW52YWxpZCBhbGxvY2F0aW9ucy4gIEFsc28gdXNlZCB0byBjcmVhdGUgZW5kIG9mIHN0cmVhbSBidWZmZXJzLgotICBpZiAoIWRhdGEpIHsKLSAgICBidWZmZXJfc2l6ZV8gPSAwOwotICAgIGRhdGFfID0gTlVMTDsKLSAgICByZXR1cm47Ci0gIH0KLQotICBJbml0aWFsaXplKCk7Ci0gIG1lbWNweShkYXRhXywgZGF0YSwgYnVmZmVyX3NpemVfKTsKLX0KLQotRGVjb2RlckJ1ZmZlcjo6fkRlY29kZXJCdWZmZXIoKSB7Ci0jaWYgIWRlZmluZWQoT1NfQU5EUk9JRCkKLSAgYmFzZTo6QWxpZ25lZEZyZWUoZGF0YV8pOwotI2Vsc2UKLSAgZGVsZXRlW10gZGF0YV87Ci0jZW5kaWYKLX0KLQotdm9pZCBEZWNvZGVyQnVmZmVyOjpJbml0aWFsaXplKCkgewotICBEQ0hFQ0tfR0UoYnVmZmVyX3NpemVfLCAwKTsKLSNpZiAhZGVmaW5lZChPU19BTkRST0lEKQotICBkYXRhXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPigKLSAgICAgIGJhc2U6OkFsaWduZWRBbGxvYyhidWZmZXJfc2l6ZV8gKyBrUGFkZGluZ1NpemUsIGtBbGlnbm1lbnRTaXplKSk7Ci0gIG1lbXNldChkYXRhXyArIGJ1ZmZlcl9zaXplXywgMCwga1BhZGRpbmdTaXplKTsKLSNlbHNlCi0gIGRhdGFfID0gbmV3IHVpbnQ4W2J1ZmZlcl9zaXplX107Ci0jZW5kaWYKLX0KLQotc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBEZWNvZGVyQnVmZmVyOjpDb3B5RnJvbShjb25zdCB1aW50OCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRhdGFfc2l6ZSkgewotICBEQ0hFQ0soZGF0YSk7Ci0gIHJldHVybiBtYWtlX3Njb3BlZF9yZWZwdHIobmV3IERlY29kZXJCdWZmZXIoZGF0YSwgZGF0YV9zaXplKSk7Ci19Ci0KLXNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gRGVjb2RlckJ1ZmZlcjo6Q3JlYXRlRU9TQnVmZmVyKCkgewotICByZXR1cm4gbWFrZV9zY29wZWRfcmVmcHRyKG5ldyBEZWNvZGVyQnVmZmVyKE5VTEwsIDApKTsKLX0KLQotY29uc3QgdWludDgqIERlY29kZXJCdWZmZXI6OkdldERhdGEoKSBjb25zdCB7Ci0gIHJldHVybiBkYXRhXzsKLX0KLQotaW50IERlY29kZXJCdWZmZXI6OkdldERhdGFTaXplKCkgY29uc3QgewotICByZXR1cm4gYnVmZmVyX3NpemVfOwotfQotCi11aW50OCogRGVjb2RlckJ1ZmZlcjo6R2V0V3JpdGFibGVEYXRhKCkgewotICByZXR1cm4gZGF0YV87Ci19Ci0KLWNvbnN0IERlY3J5cHRDb25maWcqIERlY29kZXJCdWZmZXI6OkdldERlY3J5cHRDb25maWcoKSBjb25zdCB7Ci0gIHJldHVybiBkZWNyeXB0X2NvbmZpZ18uZ2V0KCk7Ci19Ci0KLXZvaWQgRGVjb2RlckJ1ZmZlcjo6U2V0RGVjcnlwdENvbmZpZyhzY29wZWRfcHRyPERlY3J5cHRDb25maWc+IGRlY3J5cHRfY29uZmlnKSB7Ci0gIGRlY3J5cHRfY29uZmlnXyA9IGRlY3J5cHRfY29uZmlnLlBhc3MoKTsKLX0KLQotI2VuZGlmICAvLyBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXIuaCBiL3NyYy9tZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZjVjY2UuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBBIHNwZWNpYWxpemVkIGJ1ZmZlciBmb3IgaW50ZXJmYWNpbmcgd2l0aCBhdWRpbyAvIHZpZGVvIGRlY29kZXJzLgotLy8KLS8vIFNwZWNpZmljYWxseSBlbnN1cmVzIHRoYXQgZGF0YSBpcyBhbGlnbmVkIGFuZCBwYWRkZWQgYXMgbmVjZXNzYXJ5IGJ5IHRoZQotLy8gdW5kZXJseWluZyBkZWNvZGluZyBmcmFtZXdvcmsuICBPbiBkZXNrdG9wIHBsYXRmb3JtcyB0aGlzIG1lYW5zIG1lbW9yeSBpcwotLy8gYWxsb2NhdGVkIHVzaW5nIEZGbXBlZyB3aXRoIHBhcnRpY3VsYXIgYWxpZ25tZW50IGFuZCBwYWRkaW5nIHJlcXVpcmVtZW50cy4KLS8vCi0vLyBBbHNvIGluY2x1ZGVzIGRlY29kZXIgc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSBmb3IgZGVjcnlwdGlvbi4KLQotI2lmbmRlZiBNRURJQV9CQVNFX0RFQ09ERVJfQlVGRkVSX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfREVDT0RFUl9CVUZGRVJfSF8KLQotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJidWlsZC9idWlsZF9jb25maWcuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2J1ZmZlcnMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlY3J5cHRfY29uZmlnLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0KLWNsYXNzIERlY3J5cHRDb25maWc7Ci1jbGFzcyBTaGVsbEJ1ZmZlckZhY3Rvcnk7Ci0KLWNsYXNzIE1FRElBX0VYUE9SVCBEZWNvZGVyQnVmZmVyIDogcHVibGljIEJ1ZmZlciB7Ci0gcHVibGljOgotICAvLyBDcmVhdGUgYSBEZWNvZGVyQnVmZmVyIGluZGljYXRpbmcgd2UndmUgcmVhY2hlZCBlbmQgb2Ygc3RyZWFtIG9yIGFuIGVycm9yLgotICAvLyBHZXREYXRhKCkgYW5kIEdldFdyaXRhYmxlRGF0YSgpIHJldHVybiBOVUxMIGFuZCBHZXREYXRhU2l6ZSgpIHJldHVybnMgMC4KLSAgc3RhdGljIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gQ3JlYXRlRU9TQnVmZmVyKAotICAgICAgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCk7Ci0KLSAgLy8gQnVmZmVyIGltcGxlbWVudGF0aW9uLgotICBjb25zdCB1aW50OCogR2V0RGF0YSgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIGJ1ZmZlcl87IH0KLSAgLy8gRGF0YSBzaXplIGNhbiBiZSBsZXNzIHRoYW4gYWxsb2NhdGVkIHNpemUgYWZ0ZXIgU2hyaW5rVG8gaXMgY2FsbGVkLgotICBpbnQgR2V0RGF0YVNpemUoKSBjb25zdCBPVkVSUklERSB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVfKTsgfQotCi0gIGludCBHZXRBbGxvY2F0ZWRTaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihhbGxvY2F0ZWRfc2l6ZV8pOyB9Ci0gIC8vIFRoaXMgaXMgdXNlZCBieSB0aGUgZGF0YSB0aGF0IHdlIGRvbid0IGtub3cgdGhlIGV4YWN0IHNpemUgYmVmb3JlIHJlYWRpbmcuCi0gIHZvaWQgU2hyaW5rVG8oaW50IHNpemUpOwotICBib29sIElzS2V5ZnJhbWUoKSBjb25zdCB7IHJldHVybiBpc19rZXlmcmFtZV87IH0KLQotICAvLyBSZXR1cm5zIGEgcmVhZC13cml0ZSBwb2ludGVyIHRvIHRoZSBidWZmZXIgZGF0YS4KLSAgdmlydHVhbCB1aW50OCogR2V0V3JpdGFibGVEYXRhKCkgeyByZXR1cm4gYnVmZmVyXzsgfQotCi0gIC8vIFJldHVybnMgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhlIGJ1ZmZlciBoYXMgYmVlbiBkZWNyeXB0ZWQKLSAgLy8gaW4tcGxhY2UuICBJZiBzbywgYSBDRE0gc2hvdWxkIGF2b2lkIGRlY3J5cHRpbmcgaXQgYWdhaW4gYWZ0ZXIgYSBzZWVrLgotICBib29sIElzQWxyZWFkeURlY3J5cHRlZCgpIHsgcmV0dXJuIGlzX2RlY3J5cHRlZF87IH0KLSAgdm9pZCBTZXRBbHJlYWR5RGVjcnlwdGVkKGJvb2wgdmFsdWUpIHsgaXNfZGVjcnlwdGVkXyA9IHZhbHVlOyB9Ci0KLSAgdmlydHVhbCBjb25zdCBEZWNyeXB0Q29uZmlnKiBHZXREZWNyeXB0Q29uZmlnKCkgY29uc3Q7Ci0gIHZpcnR1YWwgdm9pZCBTZXREZWNyeXB0Q29uZmlnKHNjb3BlZF9wdHI8RGVjcnlwdENvbmZpZz4gZGVjcnlwdF9jb25maWcpOwotCi0gcHJvdGVjdGVkOgotICBmcmllbmQgY2xhc3MgU2hlbGxCdWZmZXJGYWN0b3J5OwotICAvLyBTaG91bGQgb25seSBiZSBjYWxsZWQgYnkgU2hlbGxCdWZmZXJGYWN0b3J5LCBjb25zdW1lcnMgc2hvdWxkIHVzZQotICAvLyBTaGVsbEJ1ZmZlckZhY3Rvcnk6OkFsbG9jYXRlQnVmZmVyIHRvIG1ha2UgYSBEZWNvZGVyQnVmZmVyLgotICBEZWNvZGVyQnVmZmVyKHVpbnQ4KiByZXVzYWJsZV9idWZmZXIsIHNpemVfdCBzaXplLCBib29sIGlzX2tleWZyYW1lKTsKLSAgLy8gRm9yIGRlZmVycmVkIGFsbG9jYXRpb24gY3JlYXRlIGEgc2hlbGwgYnVmZmVyIHdpdGggYnVmZmVyXyBOVUxMIGJ1dCBhCi0gIC8vIG5vbi16ZXJvIHNpemUuIFRoZW4gd2UgdXNlIHRoZSBTZXRCdWZmZXIoKSBtZXRob2QgYmVsb3cgdG8gYWN0dWFsbHkKLSAgLy8gc2V0IHRoZSByZXVzYWJsZSBidWZmZXIgcG9pbnRlciB3aGVuIGl0IGJlY29tZXMgYXZhaWxhYmxlCi0gIHZvaWQgU2V0QnVmZmVyKHVpbnQ4KiByZXVzYWJsZV9idWZmZXIpOwotCi0gIHZpcnR1YWwgfkRlY29kZXJCdWZmZXIoKTsKLSAgdWludDgqIGJ1ZmZlcl87Ci0gIHNpemVfdCBzaXplXzsKLSAgc2l6ZV90IGFsbG9jYXRlZF9zaXplXzsKLSAgc2NvcGVkX3JlZnB0cjxTaGVsbEJ1ZmZlckZhY3Rvcnk+IGJ1ZmZlcl9mYWN0b3J5XzsKLSAgc2NvcGVkX3B0cjxEZWNyeXB0Q29uZmlnPiBkZWNyeXB0X2NvbmZpZ187Ci0gIGJvb2wgaXNfZGVjcnlwdGVkXzsKLSAgYm9vbCBpc19rZXlmcmFtZV87Ci0KLSAgRElTQUxMT1dfSU1QTElDSVRfQ09OU1RSVUNUT1JTKERlY29kZXJCdWZmZXIpOwotfTsKLQotI2Vsc2UgIC8vIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLQotY2xhc3MgTUVESUFfRVhQT1JUIERlY29kZXJCdWZmZXIgOiBwdWJsaWMgQnVmZmVyIHsKLSBwdWJsaWM6Ci0gIGVudW0gewotICAgIGtQYWRkaW5nU2l6ZSA9IDE2LAotI2lmIGRlZmluZWQoQVJDSF9DUFVfQVJNX0ZBTUlMWSkKLSAgICBrQWxpZ25tZW50U2l6ZSA9IDE2Ci0jZWxzZQotICAgIGtBbGlnbm1lbnRTaXplID0gMzIKLSNlbmRpZgotICB9OwotCi0gIC8vIEFsbG9jYXRlcyBidWZmZXIgb2Ygc2l6ZSB8YnVmZmVyX3NpemV8ID49IDAuICBCdWZmZXIgd2lsbCBiZSBwYWRkZWQgYW5kCi0gIC8vIGFsaWduZWQgYXMgbmVjZXNzYXJ5LgotICBleHBsaWNpdCBEZWNvZGVyQnVmZmVyKGludCBidWZmZXJfc2l6ZSk7Ci0KLSAgLy8gQ3JlYXRlIGEgRGVjb2RlckJ1ZmZlciB3aG9zZSB8ZGF0YV98IGlzIGNvcGllZCBmcm9tIHxkYXRhfC4gIEJ1ZmZlciB3aWxsIGJlCi0gIC8vIHBhZGRlZCBhbmQgYWxpZ25lZCBhcyBuZWNlc3NhcnkuICB8ZGF0YXwgbXVzdCBub3QgYmUgTlVMTCBhbmQgfHNpemV8ID49IDAuCi0gIHN0YXRpYyBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IENvcHlGcm9tKGNvbnN0IHVpbnQ4KiBkYXRhLCBpbnQgc2l6ZSk7Ci0KLSAgLy8gQ3JlYXRlIGEgRGVjb2RlckJ1ZmZlciBpbmRpY2F0aW5nIHdlJ3ZlIHJlYWNoZWQgZW5kIG9mIHN0cmVhbS4gIEdldERhdGEoKQotICAvLyBhbmQgR2V0V3JpdGFibGVEYXRhKCkgd2lsbCByZXR1cm4gTlVMTCBhbmQgR2V0RGF0YVNpemUoKSB3aWxsIHJldHVybiAwLgotICBzdGF0aWMgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBDcmVhdGVFT1NCdWZmZXIoKTsKLQotICAvLyBCdWZmZXIgaW1wbGVtZW50YXRpb24uCi0gIHZpcnR1YWwgY29uc3QgdWludDgqIEdldERhdGEoKSBjb25zdCBPVkVSUklERTsKLSAgdmlydHVhbCBpbnQgR2V0RGF0YVNpemUoKSBjb25zdCBPVkVSUklERTsKLQotICAvLyBSZXR1cm5zIGEgcmVhZC13cml0ZSBwb2ludGVyIHRvIHRoZSBidWZmZXIgZGF0YS4KLSAgdmlydHVhbCB1aW50OCogR2V0V3JpdGFibGVEYXRhKCk7Ci0KLSAgdmlydHVhbCBjb25zdCBEZWNyeXB0Q29uZmlnKiBHZXREZWNyeXB0Q29uZmlnKCkgY29uc3Q7Ci0gIHZpcnR1YWwgdm9pZCBTZXREZWNyeXB0Q29uZmlnKHNjb3BlZF9wdHI8RGVjcnlwdENvbmZpZz4gZGVjcnlwdF9jb25maWcpOwotCi0gcHJvdGVjdGVkOgotICAvLyBBbGxvY2F0ZXMgYSBidWZmZXIgb2Ygc2l6ZSB8c2l6ZXwgPj0gMCBhbmQgY29waWVzIHxkYXRhfCBpbnRvIGl0LiAgQnVmZmVyCi0gIC8vIHdpbGwgYmUgcGFkZGVkIGFuZCBhbGlnbmVkIGFzIG5lY2Vzc2FyeS4gIElmIHxkYXRhfCBpcyBOVUxMIHRoZW4gfGRhdGFffCBpcwotICAvLyBzZXQgdG8gTlVMTCBhbmQgfGJ1ZmZlcl9zaXplX3wgdG8gMC4KLSAgRGVjb2RlckJ1ZmZlcihjb25zdCB1aW50OCogZGF0YSwgaW50IHNpemUpOwotICB2aXJ0dWFsIH5EZWNvZGVyQnVmZmVyKCk7Ci0KLSBwcml2YXRlOgotICBpbnQgYnVmZmVyX3NpemVfOwotICB1aW50OCogZGF0YV87Ci0gIHNjb3BlZF9wdHI8RGVjcnlwdENvbmZpZz4gZGVjcnlwdF9jb25maWdfOwotCi0gIC8vIENvbnN0cnVjdG9yIGhlbHBlciBtZXRob2QgZm9yIG1lbW9yeSBhbGxvY2F0aW9ucy4KLSAgdm9pZCBJbml0aWFsaXplKCk7Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKERlY29kZXJCdWZmZXIpOwotfTsKLQotI2VuZGlmICAvLyBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0JBU0VfREVDT0RFUl9CVUZGRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyX3Bvb2wuY2MgYi9zcmMvbWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlcl9wb29sLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDUyYjJhLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyX3Bvb2wuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlcl9wb29sLmgiCi0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3NoZWxsX2J1ZmZlcl9mYWN0b3J5LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLURlY29kZXJCdWZmZXJQb29sOjpEZWNvZGVyQnVmZmVyUG9vbCh1aW50MzIgc2FtcGxlX3NpemVfaW5fYnl0ZXMpIHsKLSAgdWludDMyIGJ1ZmZlcl9zaXplID0ga01heFNhbXBsZXNQZXJCdWZmZXIgKiBzYW1wbGVfc2l6ZV9pbl9ieXRlczsKLSAgd2hpbGUgKGRlY29kZXJfYnVmZmVyc18uc2l6ZSgpIDwga0J1ZmZlckNvdW50KSB7Ci0gICAgZGVjb2Rlcl9idWZmZXJzXy5wdXNoX2JhY2soQWxsb2NhdGVGcm9tU2hlbGxCdWZmZXJGYWN0b3J5KGJ1ZmZlcl9zaXplKSk7Ci0gICAgRENIRUNLKGRlY29kZXJfYnVmZmVyc18uYmFjaygpKTsKLSAgfQotfQotCi1zY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IERlY29kZXJCdWZmZXJQb29sOjpBbGxvY2F0ZShzaXplX3Qgc2l6ZV9pbl9ieXRlcykgewotICBmb3IgKERlY29kZXJCdWZmZXJzOjppdGVyYXRvciBpdGVyID0gZGVjb2Rlcl9idWZmZXJzXy5iZWdpbigpOwotICAgICAgIGl0ZXIgIT0gZGVjb2Rlcl9idWZmZXJzXy5lbmQoKTsgKytpdGVyKSB7Ci0gICAgaWYgKCgqaXRlciktPkhhc09uZVJlZigpKSB7Ci0gICAgICBEQ0hFQ0tfTEUoc2l6ZV9pbl9ieXRlcywgKCppdGVyKS0+R2V0QWxsb2NhdGVkU2l6ZSgpKTsKLSAgICAgIGlmIChzaXplX2luX2J5dGVzIDw9ICgqaXRlciktPkdldEFsbG9jYXRlZFNpemUoKSkgewotICAgICAgICAoKml0ZXIpLT5TaHJpbmtUbyhzaXplX2luX2J5dGVzKTsKLSAgICAgICAgcmV0dXJuICppdGVyOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIE5PVFJFQUNIRUQoKTsKLSAgcmV0dXJuIEFsbG9jYXRlRnJvbVNoZWxsQnVmZmVyRmFjdG9yeShzaXplX2luX2J5dGVzKTsKLX0KLQotc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBEZWNvZGVyQnVmZmVyUG9vbDo6QWxsb2NhdGVGcm9tU2hlbGxCdWZmZXJGYWN0b3J5KAotICAgIHNpemVfdCBzaXplX2luX2J5dGVzKSB7Ci0gIHJldHVybiBTaGVsbEJ1ZmZlckZhY3Rvcnk6Okluc3RhbmNlKCktPkFsbG9jYXRlQnVmZmVyTm93KHNpemVfaW5fYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlcl9wb29sLmggYi9zcmMvbWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlcl9wb29sLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMjYzNmIuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXJfcG9vbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9CQVNFX0RFQ09ERVJfQlVGRkVSX1BPT0xfSF8KLSNkZWZpbmUgTUVESUFfQkFTRV9ERUNPREVSX0JVRkZFUl9QT09MX0hfCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9tcDQvYWFjLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIFRoaXMgY2xhc3MgaXMgY3VycmVudGx5IHVzZWQgYnkgY2xhc3NlcyBpbmhlcml0ZWQgZnJvbSBTaGVsbFJhd0F1ZGlvRGVjb2Rlci4KLS8vIFRoZXNlIGNsYXNzZXMgbWF5IG5lZWQgdG8gYWxsb2NhdGUgRGVjb2RlckJ1ZmZlciBmcm9tIFNoZWxsQnVmZmVyRmFjdG9yeQotLy8gZHVyaW5nIHBsYXliYWNrLiAgT3VyIHByb2dyZXNzaXZlIGRlbXV4ZXIgd2lsbCB0cnkgdG8gdXNlIHVwIGFsbCBmcmVlIHNwYWNlCi0vLyBvZiBTaGVsbEJ1ZmZlckZhY3Rvcnkgc28gdGhlIGFsbG9jYXRpb24gbWFkZSBieSBTaGVsbFJhd0F1ZGlvRGVjb2RlciBtYXkKLS8vIGZhaWwuICBUaGlzIGNsYXNzIGNhbiBwcmUtYWxsb2NhdGUgRGVjb2RlckJ1ZmZlciBvbiBwbGF5YmFjayBzdGFydCB0byBlbnN1cmUKLS8vIHRoYXQgdGhlIHJhdyBhdWRpbyBkZWNvZGVyIGNhbiBhbHdheXMgaGF2ZSBidWZmZXIgdG8gdXNlLgotY2xhc3MgRGVjb2RlckJ1ZmZlclBvb2wgewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IHVpbnQzMiBrTWF4QXVkaW9DaGFubmVscyA9IDg7ICAvLyBXZSBzdXBwb3J0IDcuMSBhdCBtb3N0LgotICBzdGF0aWMgY29uc3QgdWludDMyIGtNYXhTYW1wbGVzUGVyQnVmZmVyID0KLSAgICAgIG1wNDo6QUFDOjprRnJhbWVzUGVyQWNjZXNzVW5pdCAqIGtNYXhBdWRpb0NoYW5uZWxzOwotICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtCdWZmZXJDb3VudCA9IDQ4OwotCi0gIERlY29kZXJCdWZmZXJQb29sKHVpbnQzMiBzYW1wbGVfc2l6ZV9pbl9ieXRlcyk7Ci0gIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gQWxsb2NhdGUoc2l6ZV90IHNpemVfaW5fYnl0ZXMpOwotCi0gcHJpdmF0ZToKLSAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+ID4gRGVjb2RlckJ1ZmZlcnM7Ci0KLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBBbGxvY2F0ZUZyb21TaGVsbEJ1ZmZlckZhY3RvcnkoCi0gICAgICBzaXplX3Qgc2l6ZV9pbl9ieXRlcyk7Ci0KLSAgRGVjb2RlckJ1ZmZlcnMgZGVjb2Rlcl9idWZmZXJzXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0JBU0VfREVDT0RFUl9CVUZGRVJfUE9PTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXJfcXVldWUuY2MgYi9zcmMvbWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlcl9xdWV1ZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ5MWMzNy4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlcl9xdWV1ZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyX3F1ZXVlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLURlY29kZXJCdWZmZXJRdWV1ZTo6RGVjb2RlckJ1ZmZlclF1ZXVlKCkKLSAgICA6IGVhcmxpZXN0X3ZhbGlkX3RpbWVzdGFtcF8oa05vVGltZXN0YW1wKCkpIHsKLX0KLQotRGVjb2RlckJ1ZmZlclF1ZXVlOjp+RGVjb2RlckJ1ZmZlclF1ZXVlKCkge30KLQotdm9pZCBEZWNvZGVyQnVmZmVyUXVldWU6OlB1c2goY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgYnVmZmVyKSB7Ci0gIENIRUNLKCFidWZmZXItPklzRW5kT2ZTdHJlYW0oKSk7Ci0KLSAgcXVldWVfLnB1c2hfYmFjayhidWZmZXIpOwotCi0gIC8vIFRPRE8oc2NoZXJrdXMpOiBGRm1wZWcgcmV0dXJucyBzb21lIHBhY2tldHMgd2l0aCBubyB0aW1lc3RhbXAgYWZ0ZXIKLSAgLy8gc2Vla2luZy4gRml4IGFuZCB0dXJuIHRoaXMgaW50byBDSEVDSygpLiBTZWUgaHR0cDovL2NyYnVnLmNvbS8xNjIxOTIKLSAgaWYgKGJ1ZmZlci0+R2V0VGltZXN0YW1wKCkgPT0ga05vVGltZXN0YW1wKCkpIHsKLSAgICBEVkxPRygxKSA8PCAiQnVmZmVyIGhhcyBubyB0aW1lc3RhbXAiOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChlYXJsaWVzdF92YWxpZF90aW1lc3RhbXBfID09IGtOb1RpbWVzdGFtcCgpKSB7Ci0gICAgZWFybGllc3RfdmFsaWRfdGltZXN0YW1wXyA9IGJ1ZmZlci0+R2V0VGltZXN0YW1wKCk7Ci0gIH0KLQotICBpZiAoYnVmZmVyLT5HZXRUaW1lc3RhbXAoKSA8IGVhcmxpZXN0X3ZhbGlkX3RpbWVzdGFtcF8pIHsKLSAgICBEVkxPRygxKQotICAgICAgICA8PCAiT3V0IG9mIG9yZGVyIHRpbWVzdGFtcHM6ICIKLSAgICAgICAgPDwgYnVmZmVyLT5HZXRUaW1lc3RhbXAoKS5Jbk1pY3Jvc2Vjb25kcygpCi0gICAgICAgIDw8ICIgdnMuICIKLSAgICAgICAgPDwgZWFybGllc3RfdmFsaWRfdGltZXN0YW1wXy5Jbk1pY3Jvc2Vjb25kcygpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGVhcmxpZXN0X3ZhbGlkX3RpbWVzdGFtcF8gPSBidWZmZXItPkdldFRpbWVzdGFtcCgpOwotICBpbl9vcmRlcl9xdWV1ZV8ucHVzaF9iYWNrKGJ1ZmZlcik7Ci19Ci0KLXNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gRGVjb2RlckJ1ZmZlclF1ZXVlOjpQb3AoKSB7Ci0gIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gYnVmZmVyID0gcXVldWVfLmZyb250KCk7Ci0gIHF1ZXVlXy5wb3BfZnJvbnQoKTsKLQotICBpZiAoIWluX29yZGVyX3F1ZXVlXy5lbXB0eSgpICYmCi0gICAgICBpbl9vcmRlcl9xdWV1ZV8uZnJvbnQoKSA9PSBidWZmZXIpIHsKLSAgICBpbl9vcmRlcl9xdWV1ZV8ucG9wX2Zyb250KCk7Ci0gIH0KLQotICByZXR1cm4gYnVmZmVyOwotfQotCi12b2lkIERlY29kZXJCdWZmZXJRdWV1ZTo6Q2xlYXIoKSB7Ci0gIHF1ZXVlXy5jbGVhcigpOwotICBpbl9vcmRlcl9xdWV1ZV8uY2xlYXIoKTsKLSAgZWFybGllc3RfdmFsaWRfdGltZXN0YW1wXyA9IGtOb1RpbWVzdGFtcCgpOwotfQotCi1ib29sIERlY29kZXJCdWZmZXJRdWV1ZTo6SXNFbXB0eSgpIHsKLSAgcmV0dXJuIHF1ZXVlXy5lbXB0eSgpOwotfQotCi1iYXNlOjpUaW1lRGVsdGEgRGVjb2RlckJ1ZmZlclF1ZXVlOjpEdXJhdGlvbigpIHsKLSAgaWYgKGluX29yZGVyX3F1ZXVlXy5zaXplKCkgPCAyKQotICAgIHJldHVybiBiYXNlOjpUaW1lRGVsdGEoKTsKLQotICBiYXNlOjpUaW1lRGVsdGEgc3RhcnQgPSBpbl9vcmRlcl9xdWV1ZV8uZnJvbnQoKS0+R2V0VGltZXN0YW1wKCk7Ci0gIGJhc2U6OlRpbWVEZWx0YSBlbmQgPSBpbl9vcmRlcl9xdWV1ZV8uYmFjaygpLT5HZXRUaW1lc3RhbXAoKTsKLSAgcmV0dXJuIGVuZCAtIHN0YXJ0OwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyX3F1ZXVlLmggYi9zcmMvbWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlcl9xdWV1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzUwNDZjLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyX3F1ZXVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0JBU0VfREVDT0RFUl9CVUZGRVJfUVVFVUVfSF8KLSNkZWZpbmUgTUVESUFfQkFTRV9ERUNPREVSX0JVRkZFUl9RVUVVRV9IXwotCi0jaW5jbHVkZSA8ZGVxdWU+Ci0KLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGltZS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIERlY29kZXJCdWZmZXI7Ci0KLS8vIE1haW50YWlucyBhIHF1ZXVlIG9mIERlY29kZXJCdWZmZXJzIGluIGluY3JlYXNpbmcgdGltZXN0YW1wIG9yZGVyLgotLy8KLS8vIEluZGl2aWR1YWwgYnVmZmVyIGR1cmF0aW9ucyBhcmUgaWdub3JlZCB3aGVuIGNhbGN1bGF0aW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUKLS8vIHF1ZXVlIGkuZS4sIHRoZSBxdWV1ZSBtdXN0IGhhdmUgYXQgbGVhc3QgMiBpbi1vcmRlciBidWZmZXJzIHRvIGNhbGN1bGF0ZQotLy8gZHVyYXRpb24uCi0vLwotLy8gTm90IHRocmVhZCBzYWZlOiBhY2Nlc3MgbXVzdCBiZSBleHRlcm5hbGx5IHN5bmNocm9uaXplZC4KLWNsYXNzIE1FRElBX0VYUE9SVCBEZWNvZGVyQnVmZmVyUXVldWUgewotIHB1YmxpYzoKLSAgRGVjb2RlckJ1ZmZlclF1ZXVlKCk7Ci0gIH5EZWNvZGVyQnVmZmVyUXVldWUoKTsKLQotICAvLyBQdXNoIHxidWZmZXJ8IHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlLiBJZiB8YnVmZmVyfCBpcyBxdWV1ZWQgb3V0IG9mIG9yZGVyCi0gIC8vIGl0IHdpbGwgYmUgZXhjbHVkZWQgZnJvbSBkdXJhdGlvbiBjYWxjdWxhdGlvbnMuCi0gIC8vCi0gIC8vIEl0IGlzIGludmFsaWQgdG8gcHVzaCBhbiBlbmQtb2Ytc3RyZWFtIHxidWZmZXJ8LgotICB2b2lkIFB1c2goY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgYnVmZmVyKTsKLQotICAvLyBQb3BzIGEgRGVjb2RlckJ1ZmZlciBmcm9tIHRoZSBmcm9udCBvZiB0aGUgcXVldWUuCi0gIC8vCi0gIC8vIEl0IGlzIGludmFsaWQgdG8gY2FsbCBQb3AoKSBvbiBhbiBlbXB0eSBxdWV1ZS4KLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBQb3AoKTsKLQotICAvLyBSZW1vdmVzIGFsbCBxdWV1ZWQgYnVmZmVycy4KLSAgdm9pZCBDbGVhcigpOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHF1ZXVlIGlzIGVtcHR5LgotICBib29sIElzRW1wdHkoKTsKLQotICAvLyBSZXR1cm5zIHRoZSBkdXJhdGlvbiBvZiBlbmNvZGVkIGRhdGEgc3RvcmVkIGluIHRoaXMgcXVldWUgYXMgbWVhc3VyZWQgYnkKLSAgLy8gdGhlIHRpbWVzdGFtcHMgb2YgdGhlIGVhcmxpZXN0IGFuZCBsYXRlc3QgYnVmZmVycywgaWdub3Jpbmcgb3V0IG9mIG9yZGVyCi0gIC8vIGJ1ZmZlcnMuCi0gIC8vCi0gIC8vIFJldHVybnMgemVybyBpZiB0aGUgcXVldWUgaXMgZW1wdHkuCi0gIGJhc2U6OlRpbWVEZWx0YSBEdXJhdGlvbigpOwotCi0gcHJpdmF0ZToKLSAgdHlwZWRlZiBzdGQ6OmRlcXVlPHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gPiBRdWV1ZTsKLSAgUXVldWUgcXVldWVfOwotCi0gIC8vIEEgc3Vic2V0IG9mIHxxdWV1ZV98IHRoYXQgY29udGFpbnMgYnVmZmVycyB0aGF0IGFyZSBpbiBzdHJpY3RseQotICAvLyBpbmNyZWFzaW5nIHRpbWVzdGFtcCBvcmRlci4gVXNlZCB0byBjYWxjdWxhdGUgRHVyYXRpb24oKSB3aGlsZSBpZ25vcmluZwotICAvLyBvdXQtb2Ytb3JkZXIgYnVmZmVycy4KLSAgUXVldWUgaW5fb3JkZXJfcXVldWVfOwotCi0gIGJhc2U6OlRpbWVEZWx0YSBlYXJsaWVzdF92YWxpZF90aW1lc3RhbXBfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihEZWNvZGVyQnVmZmVyUXVldWUpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQkFTRV9ERUNPREVSX0JVRkZFUl9RVUVVRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXJfcXVldWVfdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlcl9xdWV1ZV91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJjZDU0MS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlcl9xdWV1ZV91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXJfcXVldWUuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotc3RhdGljIGJhc2U6OlRpbWVEZWx0YSBUb1RpbWVEZWx0YShpbnQgc2Vjb25kcykgewotICBpZiAoc2Vjb25kcyA8IDApCi0gICAgcmV0dXJuIGtOb1RpbWVzdGFtcCgpOwotICByZXR1cm4gYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcyhzZWNvbmRzKTsKLX0KLQotLy8gSGVscGVyIHRvIGNyZWF0ZSBidWZmZXJzIHdpdGggc3BlY2lmaWVkIHRpbWVzdGFtcCBpbiBzZWNvbmRzLgotLy8KLS8vIE5lZ2F0aXZlIG51bWJlcnMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8ga05vVGltZXN0YW1wKCk7Ci1zdGF0aWMgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBDcmVhdGVCdWZmZXIoaW50IHRpbWVzdGFtcCkgewotICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGJ1ZmZlciA9IG5ldyBEZWNvZGVyQnVmZmVyKDApOwotICBidWZmZXItPlNldFRpbWVzdGFtcChUb1RpbWVEZWx0YSh0aW1lc3RhbXApKTsKLSAgYnVmZmVyLT5TZXREdXJhdGlvbihUb1RpbWVEZWx0YSgwKSk7Ci0gIHJldHVybiBidWZmZXI7Ci19Ci0KLVRFU1QoRGVjb2RlckJ1ZmZlclF1ZXVlVGVzdCwgSXNFbXB0eSkgewotICBEZWNvZGVyQnVmZmVyUXVldWUgcXVldWU7Ci0gIEVYUEVDVF9UUlVFKHF1ZXVlLklzRW1wdHkoKSk7Ci0KLSAgcXVldWUuUHVzaChDcmVhdGVCdWZmZXIoMCkpOwotICBFWFBFQ1RfRkFMU0UocXVldWUuSXNFbXB0eSgpKTsKLX0KLQotVEVTVChEZWNvZGVyQnVmZmVyUXVldWVUZXN0LCBDbGVhcikgewotICBEZWNvZGVyQnVmZmVyUXVldWUgcXVldWU7Ci0gIHF1ZXVlLlB1c2goQ3JlYXRlQnVmZmVyKDApKTsKLSAgcXVldWUuUHVzaChDcmVhdGVCdWZmZXIoMSkpOwotICBFWFBFQ1RfRkFMU0UocXVldWUuSXNFbXB0eSgpKTsKLSAgRVhQRUNUX0VRKDEsIHF1ZXVlLkR1cmF0aW9uKCkuSW5TZWNvbmRzKCkpOwotCi0gIHF1ZXVlLkNsZWFyKCk7Ci0gIEVYUEVDVF9UUlVFKHF1ZXVlLklzRW1wdHkoKSk7Ci0gIEVYUEVDVF9FUSgwLCBxdWV1ZS5EdXJhdGlvbigpLkluU2Vjb25kcygpKTsKLX0KLQotVEVTVChEZWNvZGVyQnVmZmVyUXVldWVUZXN0LCBEdXJhdGlvbikgewotICBEZWNvZGVyQnVmZmVyUXVldWUgcXVldWU7Ci0gIEVYUEVDVF9FUSgwLCBxdWV1ZS5EdXJhdGlvbigpLkluU2Vjb25kcygpKTsKLQotICBxdWV1ZS5QdXNoKENyZWF0ZUJ1ZmZlcigwKSk7Ci0gIEVYUEVDVF9FUSgwLCBxdWV1ZS5EdXJhdGlvbigpLkluU2Vjb25kcygpKTsKLQotICBxdWV1ZS5QdXNoKENyZWF0ZUJ1ZmZlcigxKSk7Ci0gIEVYUEVDVF9FUSgxLCBxdWV1ZS5EdXJhdGlvbigpLkluU2Vjb25kcygpKTsKLQotICBxdWV1ZS5QdXNoKENyZWF0ZUJ1ZmZlcigyKSk7Ci0gIEVYUEVDVF9FUSgyLCBxdWV1ZS5EdXJhdGlvbigpLkluU2Vjb25kcygpKTsKLQotICBxdWV1ZS5QdXNoKENyZWF0ZUJ1ZmZlcig0KSk7Ci0gIEVYUEVDVF9FUSg0LCBxdWV1ZS5EdXJhdGlvbigpLkluU2Vjb25kcygpKTsKLQotICBxdWV1ZS5Qb3AoKTsKLSAgRVhQRUNUX0VRKDMsIHF1ZXVlLkR1cmF0aW9uKCkuSW5TZWNvbmRzKCkpOwotCi0gIHF1ZXVlLlBvcCgpOwotICBFWFBFQ1RfRVEoMiwgcXVldWUuRHVyYXRpb24oKS5JblNlY29uZHMoKSk7Ci0KLSAgcXVldWUuUG9wKCk7Ci0gIEVYUEVDVF9FUSgwLCBxdWV1ZS5EdXJhdGlvbigpLkluU2Vjb25kcygpKTsKLQotICBxdWV1ZS5Qb3AoKTsKLSAgRVhQRUNUX0VRKDAsIHF1ZXVlLkR1cmF0aW9uKCkuSW5TZWNvbmRzKCkpOwotfQotCi1URVNUKERlY29kZXJCdWZmZXJRdWV1ZVRlc3QsIER1cmF0aW9uX091dE9mT3JkZXIpIHsKLSAgRGVjb2RlckJ1ZmZlclF1ZXVlIHF1ZXVlOwotICBxdWV1ZS5QdXNoKENyZWF0ZUJ1ZmZlcigxMCkpOwotICBxdWV1ZS5QdXNoKENyZWF0ZUJ1ZmZlcigxMikpOwotICBFWFBFQ1RfRVEoMiwgcXVldWUuRHVyYXRpb24oKS5JblNlY29uZHMoKSk7Ci0KLSAgLy8gT3V0IG9mIG9yZGVyOiBkdXJhdGlvbiBzaG91bGRuJ3QgY2hhbmdlLgotICBxdWV1ZS5QdXNoKENyZWF0ZUJ1ZmZlcig4KSk7Ci0gIEVYUEVDVF9FUSgyLCBxdWV1ZS5EdXJhdGlvbigpLkluU2Vjb25kcygpKTsKLQotICAvLyBSZW1vdmluZyBmaXJzdCBidWZmZXIgc2hvdWxkIGxlYXZlIHRoZSBzZWNvbmQgYnVmZmVyIGFzIHRoZSBvbmx5IGJ1ZmZlcgotICAvLyBpbmNsdWRlZCBpbiB0aGUgZHVyYXRpb24gY2FsY3VsYXRpb24uCi0gIHF1ZXVlLlBvcCgpOwotICBFWFBFQ1RfRVEoMCwgcXVldWUuRHVyYXRpb24oKS5JblNlY29uZHMoKSk7Ci0KLSAgLy8gUmVtb3Zpbmcgc2Vjb25kIGJ1ZmZlciBsZWF2ZXMgdGhlIG91dC1vZi1vcmRlciBidWZmZXIuIEl0IHNob3VsZG4ndCBiZQotICAvLyBpbmNsdWRlZCBpbiBkdXJhdGlvbiBjYWxjdWxhdGlvbnMuCi0gIHF1ZXVlLlBvcCgpOwotICBFWFBFQ1RfRVEoMCwgcXVldWUuRHVyYXRpb24oKS5JblNlY29uZHMoKSk7Ci0KLSAgLy8gUHVzaCBhIHN0aWxsLXRvby1lYXJseSBidWZmZXIuIEl0IHNob3VsZG4ndCBiZSBpbmNsdWRlZCBpbiBkdXJhdGlvbgotICAvLyBjYWxjdWxhdGlvbnMuCi0gIHF1ZXVlLlB1c2goQ3JlYXRlQnVmZmVyKDExKSk7Ci0gIEVYUEVDVF9FUSgwLCBxdWV1ZS5EdXJhdGlvbigpLkluU2Vjb25kcygpKTsKLQotICAvLyBQdXNoIGEgYnVmZmVyIHRoYXQncyBhZnRlciB0aGUgZWFybGllc3QgdmFsaWQgdGltZS4gSXQncyBhIHNpbmd1bGFyIHZhbGlkCi0gIC8vIGJ1ZmZlciBzbyBkdXJhdGlvbiBpcyBzdGlsbCB6ZXJvLgotICBxdWV1ZS5QdXNoKENyZWF0ZUJ1ZmZlcigxNCkpOwotICBFWFBFQ1RfRVEoMCwgcXVldWUuRHVyYXRpb24oKS5JblNlY29uZHMoKSk7Ci0KLSAgLy8gUHVzaCBhIHNlY29uZCB2YWxpZCBidWZmZXIuIFdlIHNob3VsZCBub3cgaGF2ZSBhIGR1cmF0aW9uLgotICBxdWV1ZS5QdXNoKENyZWF0ZUJ1ZmZlcigxNykpOwotICBFWFBFQ1RfRVEoMywgcXVldWUuRHVyYXRpb24oKS5JblNlY29uZHMoKSk7Ci19Ci0KLVRFU1QoRGVjb2RlckJ1ZmZlclF1ZXVlVGVzdCwgRHVyYXRpb25fTm9UaW1lc3RhbXApIHsKLSAgLy8gQnVmZmVycyB3aXRoIG5vIHRpbWVzdGFtcCBkb24ndCBhZmZlY3QgZHVyYXRpb24uCi0gIERlY29kZXJCdWZmZXJRdWV1ZSBxdWV1ZTsKLSAgcXVldWUuUHVzaChDcmVhdGVCdWZmZXIoMCkpOwotICBxdWV1ZS5QdXNoKENyZWF0ZUJ1ZmZlcig0KSk7Ci0gIEVYUEVDVF9FUSg0LCBxdWV1ZS5EdXJhdGlvbigpLkluU2Vjb25kcygpKTsKLQotICBxdWV1ZS5QdXNoKENyZWF0ZUJ1ZmZlcigtMSkpOwotICBFWFBFQ1RfRVEoNCwgcXVldWUuRHVyYXRpb24oKS5JblNlY29uZHMoKSk7Ci0KLSAgcXVldWUuUHVzaChDcmVhdGVCdWZmZXIoNikpOwotICBFWFBFQ1RfRVEoNiwgcXVldWUuRHVyYXRpb24oKS5JblNlY29uZHMoKSk7Ci0KLSAgcXVldWUuUG9wKCk7Ci0gIEVYUEVDVF9FUSgyLCBxdWV1ZS5EdXJhdGlvbigpLkluU2Vjb25kcygpKTsKLQotICBxdWV1ZS5Qb3AoKTsKLSAgRVhQRUNUX0VRKDAsIHF1ZXVlLkR1cmF0aW9uKCkuSW5TZWNvbmRzKCkpOwotCi0gIHF1ZXVlLlBvcCgpOwotICBFWFBFQ1RfRVEoMCwgcXVldWUuRHVyYXRpb24oKS5JblNlY29uZHMoKSk7Ci0KLSAgcXVldWUuUG9wKCk7Ci0gIEVYUEVDVF9FUSgwLCBxdWV1ZS5EdXJhdGlvbigpLkluU2Vjb25kcygpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlcl91bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWExNGI2Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgImJhc2Uvc3RyaW5nX3V0aWwuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLVRFU1QoRGVjb2RlckJ1ZmZlclRlc3QsIENvbnN0cnVjdG9ycykgewotICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGJ1ZmZlcihuZXcgRGVjb2RlckJ1ZmZlcigwKSk7Ci0gIEVYUEVDVF9UUlVFKGJ1ZmZlci0+R2V0RGF0YSgpKTsKLSAgRVhQRUNUX0VRKDAsIGJ1ZmZlci0+R2V0RGF0YVNpemUoKSk7Ci0gIEVYUEVDVF9GQUxTRShidWZmZXItPklzRW5kT2ZTdHJlYW0oKSk7Ci0KLSAgY29uc3QgaW50IGtUZXN0U2l6ZSA9IDEwOwotICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGJ1ZmZlcjMobmV3IERlY29kZXJCdWZmZXIoa1Rlc3RTaXplKSk7Ci0gIEFTU0VSVF9UUlVFKGJ1ZmZlcjMpOwotICBFWFBFQ1RfRVEoa1Rlc3RTaXplLCBidWZmZXIzLT5HZXREYXRhU2l6ZSgpKTsKLX0KLQotVEVTVChEZWNvZGVyQnVmZmVyVGVzdCwgQ3JlYXRlRU9TQnVmZmVyKSB7Ci0gIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gYnVmZmVyKERlY29kZXJCdWZmZXI6OkNyZWF0ZUVPU0J1ZmZlcigpKTsKLSAgRVhQRUNUX1RSVUUoYnVmZmVyLT5Jc0VuZE9mU3RyZWFtKCkpOwotICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5HZXREYXRhKCkpOwotICBFWFBFQ1RfRVEoMCwgYnVmZmVyLT5HZXREYXRhU2l6ZSgpKTsKLX0KLQotVEVTVChEZWNvZGVyQnVmZmVyVGVzdCwgQ29weUZyb20pIHsKLSAgY29uc3QgdWludDgga0RhdGFbXSA9ICJoZWxsbyI7Ci0gIGNvbnN0IGludCBrRGF0YVNpemUgPSBhcnJheXNpemUoa0RhdGEpOwotICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGJ1ZmZlcjIoRGVjb2RlckJ1ZmZlcjo6Q29weUZyb20oCi0gICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4Kj4oJmtEYXRhKSwga0RhdGFTaXplKSk7Ci0gIEFTU0VSVF9UUlVFKGJ1ZmZlcjIpOwotICBFWFBFQ1RfTkUoa0RhdGEsIGJ1ZmZlcjItPkdldERhdGEoKSk7Ci0gIEVYUEVDVF9FUShidWZmZXIyLT5HZXREYXRhU2l6ZSgpLCBrRGF0YVNpemUpOwotICBFWFBFQ1RfRVEoMCwgbWVtY21wKGJ1ZmZlcjItPkdldERhdGEoKSwga0RhdGEsIGtEYXRhU2l6ZSkpOwotICBFWFBFQ1RfRkFMU0UoYnVmZmVyMi0+SXNFbmRPZlN0cmVhbSgpKTsKLX0KLQotI2lmICFkZWZpbmVkKE9TX0FORFJPSUQpCi1URVNUKERlY29kZXJCdWZmZXJUZXN0LCBQYWRkaW5nQWxpZ25tZW50KSB7Ci0gIGNvbnN0IHVpbnQ4IGtEYXRhW10gPSAiaGVsbG8iOwotICBjb25zdCBpbnQga0RhdGFTaXplID0gYXJyYXlzaXplKGtEYXRhKTsKLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBidWZmZXIyKERlY29kZXJCdWZmZXI6OkNvcHlGcm9tKAotICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KCZrRGF0YSksIGtEYXRhU2l6ZSkpOwotICBBU1NFUlRfVFJVRShidWZmZXIyKTsKLQotICAvLyBQYWRkaW5nIGRhdGEgc2hvdWxkIGFsd2F5cyBiZSB6ZXJvZWQuCi0gIGZvcihpbnQgaSA9IDA7IGkgPCBEZWNvZGVyQnVmZmVyOjprUGFkZGluZ1NpemU7IGkrKykKLSAgICBFWFBFQ1RfRVEoKGJ1ZmZlcjItPkdldERhdGEoKSArIGtEYXRhU2l6ZSlbaV0sIDApOwotCi0gIC8vIElmIHRoZSBkYXRhIGlzIHBhZGRlZCBjb3JyZWN0bHkgd2Ugc2hvdWxkIGJlIGFibGUgdG8gcmVhZCBhbmQgd3JpdGUgcGFzdAotICAvLyB0aGUgZW5kIG9mIHRoZSBkYXRhIGJ5IERlY29kZXJCdWZmZXI6OmtQYWRkaW5nU2l6ZSBieXRlcyB3aXRob3V0IGNyYXNoaW5nCi0gIC8vIG9yIFZhbGdyaW5kL0FTQU4gdGhyb3dpbmcgZXJyb3JzLgotICBjb25zdCB1aW50OCBrRmlsbENoYXIgPSAweEZGOwotICBtZW1zZXQoCi0gICAgICBidWZmZXIyLT5HZXRXcml0YWJsZURhdGEoKSArIGtEYXRhU2l6ZSwga0ZpbGxDaGFyLAotICAgICAgRGVjb2RlckJ1ZmZlcjo6a1BhZGRpbmdTaXplKTsKLSAgZm9yKGludCBpID0gMDsgaSA8IERlY29kZXJCdWZmZXI6OmtQYWRkaW5nU2l6ZTsgaSsrKQotICAgIEVYUEVDVF9FUSgoYnVmZmVyMi0+R2V0RGF0YSgpICsga0RhdGFTaXplKVtpXSwga0ZpbGxDaGFyKTsKLQotICBFWFBFQ1RfRVEoMHUsIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PigKLSAgICAgIGJ1ZmZlcjItPkdldERhdGEoKSkgJiAoRGVjb2RlckJ1ZmZlcjo6a0FsaWdubWVudFNpemUgLSAxKSk7Ci19Ci0jZW5kaWYKLQotVEVTVChEZWNvZGVyQnVmZmVyVGVzdCwgUmVhZGluZ1dyaXRpbmcpIHsKLSAgY29uc3QgY2hhciBrRGF0YVtdID0gImhlbGxvIjsKLSAgY29uc3QgaW50IGtEYXRhU2l6ZSA9IGFycmF5c2l6ZShrRGF0YSk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBidWZmZXIobmV3IERlY29kZXJCdWZmZXIoa0RhdGFTaXplKSk7Ci0gIEFTU0VSVF9UUlVFKGJ1ZmZlcik7Ci0KLSAgdWludDgqIGRhdGEgPSBidWZmZXItPkdldFdyaXRhYmxlRGF0YSgpOwotICBBU1NFUlRfVFJVRShkYXRhKTsKLSAgQVNTRVJUX0VRKGtEYXRhU2l6ZSwgYnVmZmVyLT5HZXREYXRhU2l6ZSgpKTsKLSAgbWVtY3B5KGRhdGEsIGtEYXRhLCBrRGF0YVNpemUpOwotICBjb25zdCB1aW50OCogcmVhZF9vbmx5X2RhdGEgPSBidWZmZXItPkdldERhdGEoKTsKLSAgQVNTRVJUX0VRKGRhdGEsIHJlYWRfb25seV9kYXRhKTsKLSAgQVNTRVJUX0VRKDAsIG1lbWNtcChyZWFkX29ubHlfZGF0YSwga0RhdGEsIGtEYXRhU2l6ZSkpOwotICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5Jc0VuZE9mU3RyZWFtKCkpOwotfQotCi1URVNUKERlY29kZXJCdWZmZXJUZXN0LCBHZXREZWNyeXB0Q29uZmlnKSB7Ci0gIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gYnVmZmVyKG5ldyBEZWNvZGVyQnVmZmVyKDApKTsKLSAgRVhQRUNUX0ZBTFNFKGJ1ZmZlci0+R2V0RGVjcnlwdENvbmZpZygpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9kZWNyeXB0X2NvbmZpZy5jYyBiL3NyYy9tZWRpYS9iYXNlL2RlY3J5cHRfY29uZmlnLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjczMGFiLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL2RlY3J5cHRfY29uZmlnLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVjcnlwdF9jb25maWcuaCIKLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotCi1EZWNyeXB0Q29uZmlnOjpEZWNyeXB0Q29uZmlnKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U3Vic2FtcGxlRW50cnk+JiBzdWJzYW1wbGVzKQotICAgIDoga2V5X2lkXyhrZXlfaWQpLAotICAgICAgaXZfKGl2KSwKLSAgICAgIHN1YnNhbXBsZXNfKHN1YnNhbXBsZXMpIHsKLSAgQ0hFQ0tfR1Qoa2V5X2lkLnNpemUoKSwgMHUpOwotICBDSEVDSyhpdi5zaXplKCkgPT0gc3RhdGljX2Nhc3Q8c2l6ZV90PihEZWNyeXB0Q29uZmlnOjprRGVjcnlwdGlvbktleVNpemUpIHx8Ci0gICAgICAgIGl2LmVtcHR5KCkpOwotfQotCi0jZWxzZSAgLy8gZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotCi1EZWNyeXB0Q29uZmlnOjpEZWNyeXB0Q29uZmlnKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGRhdGFfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxTdWJzYW1wbGVFbnRyeT4mIHN1YnNhbXBsZXMpCi0gICAgOiBrZXlfaWRfKGtleV9pZCksCi0gICAgICBpdl8oaXYpLAotICAgICAgZGF0YV9vZmZzZXRfKGRhdGFfb2Zmc2V0KSwKLSAgICAgIHN1YnNhbXBsZXNfKHN1YnNhbXBsZXMpIHsKLSAgQ0hFQ0tfR1Qoa2V5X2lkLnNpemUoKSwgMHUpOwotICBDSEVDSyhpdi5zaXplKCkgPT0gc3RhdGljX2Nhc3Q8c2l6ZV90PihEZWNyeXB0Q29uZmlnOjprRGVjcnlwdGlvbktleVNpemUpIHx8Ci0gICAgICAgIGl2LmVtcHR5KCkpOwotICBDSEVDS19HRShkYXRhX29mZnNldCwgMCk7Ci19Ci0KLSNlbmRpZiAgLy8gZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotCi1EZWNyeXB0Q29uZmlnOjp+RGVjcnlwdENvbmZpZygpIHt9Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvZGVjcnlwdF9jb25maWcuaCBiL3NyYy9tZWRpYS9iYXNlL2RlY3J5cHRfY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYmM0ZTMuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvZGVjcnlwdF9jb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfQkFTRV9ERUNSWVBUX0NPTkZJR19IXwotI2RlZmluZSBNRURJQV9CQVNFX0RFQ1JZUFRfQ09ORklHX0hfCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIFRoZSBDb21tb24gRW5jcnlwdGlvbiBzcGVjIHByb3ZpZGVzIGZvciBzdWJzYW1wbGUgZW5jcnlwdGlvbiwgd2hlcmUgcG9ydGlvbnMKLS8vIG9mIGEgc2FtcGxlIGFyZSBzZXQgaW4gY2xlYXJ0ZXh0LiBBIFN1YnNhbXBsZUVudHJ5IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mCi0vLyBjbGVhciBhbmQgZW5jcnlwdGVkIGJ5dGVzIGluIGVhY2ggc3Vic2FtcGxlLiBGb3IgZGVjcnlwdGlvbiwgYWxsIG9mIHRoZQotLy8gZW5jcnlwdGVkIGJ5dGVzIGluIGEgc2FtcGxlIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgc2luZ2xlIGxvZ2ljYWwgc3RyZWFtLAotLy8gcmVnYXJkbGVzcyBvZiBob3cgdGhleSBhcmUgZGl2aWRlZCBpbnRvIHN1YnNhbXBsZXMsIGFuZCB0aGUgY2xlYXIgYnl0ZXMKLS8vIHNob3VsZCBub3QgYmUgY29uc2lkZXJlZCBhcyBwYXJ0IG9mIGRlY3J5cHRpb24uIFRoaXMgaXMgbG9naWNhbGx5IGVxdWl2YWxlbnQKLS8vIHRvIGNvbmNhdGVuYXRpbmcgYWxsICdjeXBoZXJfYnl0ZXMnIHBvcnRpb25zIG9mIHN1YnNhbXBsZXMsIGRlY3J5cHRpbmcgdGhhdAotLy8gcmVzdWx0LCBhbmQgdGhlbiBjb3B5aW5nIGVhY2ggYnl0ZSBmcm9tIHRoZSBkZWNyeXB0ZWQgYmxvY2sgb3ZlciB0aGUKLS8vIHBvc2l0aW9uIG9mIHRoZSBjb3JyZXNwb25kaW5nIGVuY3J5cHRlZCBieXRlLgotc3RydWN0IFN1YnNhbXBsZUVudHJ5IHsKLSAgdWludDMyIGNsZWFyX2J5dGVzOwotICB1aW50MzIgY3lwaGVyX2J5dGVzOwotfTsKLQotLy8gQ29udGFpbnMgYWxsIGluZm9ybWF0aW9uIHRoYXQgYSBkZWNyeXB0b3IgbmVlZHMgdG8gZGVjcnlwdCBhIG1lZGlhIHNhbXBsZS4KLWNsYXNzIE1FRElBX0VYUE9SVCBEZWNyeXB0Q29uZmlnIHsKLSBwdWJsaWM6Ci0gIC8vIEtleXMgYXJlIGFsd2F5cyAxMjggYml0cy4KLSAgc3RhdGljIGNvbnN0IGludCBrRGVjcnlwdGlvbktleVNpemUgPSAxNjsKLQotICAvLyB8a2V5X2lkfCBpcyB0aGUgSUQgdGhhdCByZWZlcmVuY2VzIHRoZSBkZWNyeXB0aW9uIGtleSBmb3IgdGhpcyBzYW1wbGUuCi0gIC8vIHxpdnwgaXMgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciBkZWZpbmVkIGJ5IHRoZSBlbmNyeXB0ZWQgZm9ybWF0LgotICAvLyAgIEN1cnJlbnRseSB8aXZ8IG11c3QgYmUgMTYgYnl0ZXMgYXMgZGVmaW5lZCBieSBXZWJNIGFuZCBJU08uIE9yIG11c3QgYmUKLSAgLy8gICBlbXB0eSB3aGljaCBzaWduYWxzIGFuIHVuZW5jcnlwdGVkIGZyYW1lLgotICAvLyB8ZGF0YV9vZmZzZXR8IGlzIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSBkaXNjYXJkZWQgZnJvbSB0aGUKLSAgLy8gICBoZWFkIG9mIHRoZSBzYW1wbGUgYnVmZmVyIGJlZm9yZSBhcHBseWluZyBzdWJzYW1wbGUgaW5mb3JtYXRpb24uIEEKLSAgLy8gICBkZWNyeXB0ZWQgYnVmZmVyIHdpbGwgYmUgc2hvcnRlciB0aGFuIGFuIGVuY3J5cHRlZCBidWZmZXIgYnkgdGhpcyBhbW91bnQuCi0gIC8vIHxzdWJzYW1wbGVzfCBkZWZpbmVzIHRoZSBjbGVhciBhbmQgZW5jcnlwdGVkIHBvcnRpb25zIG9mIHRoZSBzYW1wbGUgYXMKLSAgLy8gICBkZXNjcmliZWQgYWJvdmUuIEEgZGVjcnlwdGVkIGJ1ZmZlciB3aWxsIGJlIGVxdWFsIGluIHNpemUgdG8gdGhlIHN1bQotICAvLyAgIG9mIHRoZSBzdWJzYW1wbGUgc2l6ZXMuCi0gIC8vCi0gIC8vIHxkYXRhX29mZnNldHwgaXMgYXBwbGllZCBiZWZvcmUgfHN1YnNhbXBsZXN8LgotICBEZWNyeXB0Q29uZmlnKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfaWQsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGl2LAotI2lmICFkZWZpbmVkKF9fTEJfU0hFTExfXykgJiYgIWRlZmluZWQoQ09CQUxUKQotICAgICAgICAgICAgICAgIGNvbnN0IGludCBkYXRhX29mZnNldCwKLSNlbmRpZiAgLy8gIWRlZmluZWQoX19MQl9TSEVMTF9fKSAmJiAhZGVmaW5lZChDT0JBTFQpCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U3Vic2FtcGxlRW50cnk+JiBzdWJzYW1wbGVzKTsKLSAgfkRlY3J5cHRDb25maWcoKTsKLQotICBjb25zdCBzdGQ6OnN0cmluZyYga2V5X2lkKCkgY29uc3QgeyByZXR1cm4ga2V5X2lkXzsgfQotICBjb25zdCBzdGQ6OnN0cmluZyYgaXYoKSBjb25zdCB7IHJldHVybiBpdl87IH0KLSNpZiAhZGVmaW5lZChfX0xCX1NIRUxMX18pICYmICFkZWZpbmVkKENPQkFMVCkKLSAgaW50IGRhdGFfb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gZGF0YV9vZmZzZXRfOyB9Ci0jZW5kaWYgIC8vICFkZWZpbmVkKF9fTEJfU0hFTExfXykgJiYgIWRlZmluZWQoQ09CQUxUKQotICBjb25zdCBzdGQ6OnZlY3RvcjxTdWJzYW1wbGVFbnRyeT4mIHN1YnNhbXBsZXMoKSBjb25zdCB7IHJldHVybiBzdWJzYW1wbGVzXzsgfQotCi0gcHJpdmF0ZToKLSAgY29uc3Qgc3RkOjpzdHJpbmcga2V5X2lkXzsKLQotICAvLyBJbml0aWFsaXphdGlvbiB2ZWN0b3IuCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIGl2XzsKLQotI2lmICFkZWZpbmVkKF9fTEJfU0hFTExfXykgJiYgIWRlZmluZWQoQ09CQUxUKQotICAvLyBUT0RPKGZnYWxsaWdhbik6IFJlbW92ZSB8ZGF0YV9vZmZzZXRffCBpZiB0aGVyZSBpcyBubyBwbGFuIHRvIHVzZSBpdCBpbgotICAvLyB0aGUgZnV0dXJlLgotICAvLyBBbW91bnQgb2YgZGF0YSB0byBiZSBkaXNjYXJkZWQgYmVmb3JlIGFwcGx5aW5nIHN1YnNhbXBsZSBpbmZvcm1hdGlvbi4KLSAgY29uc3QgaW50IGRhdGFfb2Zmc2V0XzsKLSNlbmRpZiAgLy8gIWRlZmluZWQoX19MQl9TSEVMTF9fKSAmJiAhZGVmaW5lZChDT0JBTFQpCi0KLSAgLy8gU3Vic2FtcGxlIGluZm9ybWF0aW9uLiBNYXkgYmUgZW1wdHkgZm9yIHNvbWUgZm9ybWF0cywgbWVhbmluZyBlbnRpcmUgZnJhbWUKLSAgLy8gKGxlc3MgZGF0YSBpZ25vcmVkIGJ5IGRhdGFfb2Zmc2V0XykgaXMgZW5jcnlwdGVkLgotICBjb25zdCBzdGQ6OnZlY3RvcjxTdWJzYW1wbGVFbnRyeT4gc3Vic2FtcGxlc187Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKERlY3J5cHRDb25maWcpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQkFTRV9ERUNSWVBUX0NPTkZJR19IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvZGVjcnlwdG9yLmNjIGIvc3JjL21lZGlhL2Jhc2UvZGVjcnlwdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWIyMzJkLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL2RlY3J5cHRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlY3J5cHRvci5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1EZWNyeXB0b3I6OkRlY3J5cHRvcigpIHt9Ci0KLURlY3J5cHRvcjo6fkRlY3J5cHRvcigpIHt9Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvZGVjcnlwdG9yLmggYi9zcmMvbWVkaWEvYmFzZS9kZWNyeXB0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ1MWM5Ni4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9kZWNyeXB0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0JBU0VfREVDUllQVE9SX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfREVDUllQVE9SX0hfCi0KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fZGVjb2Rlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIEF1ZGlvRGVjb2RlckNvbmZpZzsKLWNsYXNzIEJ1ZmZlcjsKLWNsYXNzIERlY29kZXJCdWZmZXI7Ci1jbGFzcyBWaWRlb0RlY29kZXJDb25maWc7Ci1jbGFzcyBWaWRlb0ZyYW1lOwotCi0vLyBQZXJmb3JtcyBrZXkgb3BlcmF0aW9ucyBhbmQgZGVjcnlwdHMgKGFuZCBkZWNvZGVzKSBlbmNyeXB0ZWQgYnVmZmVyLgotLy8KLS8vIEtleSBvcGVyYXRpb25zIChHZW5lcmF0ZUtleVJlcXVlc3QoKSwgQWRkS2V5KCkgYW5kIENhbmNlbEtleVJlcXVlc3QoKSkKLS8vIGFyZSBjYWxsZWQgb24gdGhlIHJlbmRlcmVyIHRocmVhZC4gVGhlcmVmb3JlLCB0aGVzZSBjYWxscyBzaG91bGQgYmUgZmFzdAotLy8gYW5kIG5vbmJsb2NraW5nOyBrZXkgZXZlbnRzIHNob3VsZCBiZSBmaXJlZCBhc3luY2hyb25vdXNseS4KLS8vIEFsbCBvdGhlciBtZXRob2RzIGFyZSBjYWxsZWQgb24gdGhlICh2aWRlby9hdWRpbykgZGVjb2RlciB0aHJlYWQuCi0vLyBEZWNyeXB0b3IgaW1wbGVtZW50YXRpb25zIG11c3QgYmUgdGhyZWFkIHNhZmUgd2hlbiBtZXRob2RzIGFyZSBjYWxsZWQKLS8vIGZvbGxvd2luZyB0aGUgYWJvdmUgbW9kZWwuCi0vLyBEZXBlbmRpbmcgb24gdGhlIGltcGxlbWVudGF0aW9uIGNhbGxiYWNrcyBtYXkgYmUgZmlyZWQgc3luY2hyb25vdXNseSBvcgotLy8gYXN5bmNocm9ub3VzbHkuCi1jbGFzcyBNRURJQV9FWFBPUlQgRGVjcnlwdG9yIHsKLSBwdWJsaWM6Ci0gIC8vIFJlcG9ydGVkIHRvIFVNQSwgc28gbmV2ZXIgcmV1c2UgYSB2YWx1ZSEKLSAgLy8gTXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCBXZWJLaXQ6OldlYk1lZGlhUGxheWVyQ2xpZW50OjpNZWRpYUtleUVycm9yQ29kZQotICAvLyAoZW5mb3JjZWQgaW4gd2VibWVkaWFwbGF5ZXJfaW1wbC5jYykuCi0gIGVudW0gS2V5RXJyb3IgewotICAgIGtVbmtub3duRXJyb3IgPSAxLAotICAgIGtDbGllbnRFcnJvciwKLSAgICBrU2VydmljZUVycm9yLAotICAgIGtPdXRwdXRFcnJvciwKLSAgICBrSGFyZHdhcmVDaGFuZ2VFcnJvciwKLSAgICBrRG9tYWluRXJyb3IsCi0gICAga01heEtleUVycm9yICAvLyBNdXN0IGJlIGxhc3QgYW5kIGdyZWF0ZXIgdGhhbiBhbnkgbGVnaXQgdmFsdWUuCi0gIH07Ci0KLSAgLy8gVE9ETyh4aHdhbmcpOiBSZXBsYWNlIGtFcnJvciB3aXRoIGtEZWNyeXB0RXJyb3IgYW5kIGtEZWNvZGVFcnJvci4KLSAgLy8gVE9ETyh4aHdhbmcpOiBSZXBsYWNlIGtOZWVkTW9yZURhdGEgd2l0aCBrTm90RW5vdWdoRGF0YS4KLSAgZW51bSBTdGF0dXMgewotICAgIGtTdWNjZXNzLCAgLy8gRGVjcnlwdGlvbiBzdWNjZXNzZnVsbHkgY29tcGxldGVkLiBEZWNyeXB0ZWQgYnVmZmVyIHJlYWR5LgotICAgIGtOb0tleSwgIC8vIE5vIGtleSBpcyBhdmFpbGFibGUgdG8gZGVjcnlwdC4KLSAgICBrTmVlZE1vcmVEYXRhLCAgLy8gRGVjb2RlciBuZWVkcyBtb3JlIGRhdGEgdG8gcHJvZHVjZSBhIGZyYW1lLgotICAgIGtFcnJvciAgLy8gS2V5IGlzIGF2YWlsYWJsZSBidXQgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGRlY3J5cHRpb24uCi0gIH07Ci0KLSAgLy8gVE9ETyh4aHdhbmcpOiBVbmlmeSB0aGlzIHdpdGggRGVtdXhlclN0cmVhbTo6VHlwZS4KLSAgZW51bSBTdHJlYW1UeXBlIHsKLSAgICBrQXVkaW8sCi0gICAga1ZpZGVvCi0gIH07Ci0KLSAgRGVjcnlwdG9yKCk7Ci0gIHZpcnR1YWwgfkRlY3J5cHRvcigpOwotCi0gIC8vIEdlbmVyYXRlcyBhIGtleSByZXF1ZXN0IGZvciB0aGUgfGtleV9zeXN0ZW18IHdpdGggfHR5cGV8IGFuZAotICAvLyB8aW5pdF9kYXRhfCBwcm92aWRlZC4KLSAgLy8gUmV0dXJucyB0cnVlIGlmIGdlbmVyYXRpbmcga2V5IHJlcXVlc3Qgc3VjY2VlZGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gIC8vIE5vdGU6IEFkZEtleSgpIGFuZCBDYW5jZWxLZXlSZXF1ZXN0KCkgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGFmdGVyCi0gIC8vIEdlbmVyYXRlS2V5UmVxdWVzdCgpIHJldHVybnMgdHJ1ZS4KLSAgdmlydHVhbCBib29sIEdlbmVyYXRlS2V5UmVxdWVzdChjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogaW5pdF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbml0X2RhdGFfbGVuZ3RoKSA9IDA7Ci0KLSAgLy8gQWRkcyBhIHxrZXl8IHRvIHRoZSB8a2V5X3N5c3RlbXwuIFRoZSB8a2V5fCBpcyBub3QgbGltaXRlZCB0byBhIGRlY3J5cHRpb24KLSAgLy8ga2V5LiBJdCBjYW4gYmUgYW55IGRhdGEgdGhhdCB0aGUga2V5IHN5c3RlbSBhY2NlcHRzLCBzdWNoIGFzIGEgbGljZW5zZS4KLSAgLy8gSWYgbXVsdGlwbGUgY2FsbHMgb2YgdGhpcyBmdW5jdGlvbiBzZXQgZGlmZmVyZW50IGtleXMgZm9yIHRoZSBzYW1lCi0gIC8vIGtleSBJRCwgdGhlIG9sZGVyIGtleSB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBuZXdlciBrZXkuCi0gIHZpcnR1YWwgdm9pZCBBZGRLZXkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQga2V5X2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogaW5pdF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgIGludCBpbml0X2RhdGFfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkKSA9IDA7Ci0KLSAgLy8gQ2FuY2VscyB0aGUga2V5IHJlcXVlc3Qgc3BlY2lmaWVkIGJ5IHxzZXNzaW9uX2lkfC4KLSAgdmlydHVhbCB2b2lkIENhbmNlbEtleVJlcXVlc3QoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkKSA9IDA7Ci0KLSAgLy8gSW5kaWNhdGVzIHRoYXQgYSBrZXkgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIERlY3J5cHRvci4KLSAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKCk+IEtleUFkZGVkQ0I7Ci0KLSAgLy8gUmVnaXN0ZXJzIGEgS2V5QWRkZWRDQiB3aGljaCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gYSBrZXkgaXMgYWRkZWQgdG8gdGhlCi0gIC8vIGRlY3J5cHRvci4gT25seSBvbmUgS2V5QWRkZWRDQiBjYW4gYmUgcmVnaXN0ZXJlZCBmb3Igb25lIHxzdHJlYW1fdHlwZXwuCi0gIC8vIElmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGZvciB0aGUgc2FtZSB8c3RyZWFtX3R5cGV8LCB0aGUKLSAgLy8gcHJldmlvdXNseSByZWdpc3RlcmVkIGNhbGxiYWNrIHdpbGwgYmUgcmVwbGFjZWQuIEluIG90aGVyIHdvcmRzLAotICAvLyByZWdpc3RlcmluZyBhIG51bGwgY2FsbGJhY2sgY2FuY2VscyB0aGUgb3JpZ2luYWxseSByZWdpc3RlcmVkIGNhbGxiYWNrLgotICB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXJLZXlBZGRlZENCKFN0cmVhbVR5cGUgc3RyZWFtX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgS2V5QWRkZWRDQiYga2V5X2FkZGVkX2NiKSA9IDA7Ci0KLSAgLy8gSW5kaWNhdGVzIGNvbXBsZXRpb24gb2YgYSBkZWNyeXB0aW9uIG9wZXJhdGlvbi4KLSAgLy8KLSAgLy8gRmlyc3QgcGFyYW1ldGVyOiBUaGUgc3RhdHVzIG9mIHRoZSBkZWNyeXB0aW9uIG9wZXJhdGlvbi4KLSAgLy8gLSBTZXQgdG8ga1N1Y2Nlc3MgaWYgdGhlIGVuY3J5cHRlZCBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IGRlY3J5cHRlZCBhbmQKLSAgLy8gICB0aGUgZGVjcnlwdGVkIGJ1ZmZlciBpcyByZWFkeSB0byBiZSByZWFkLgotICAvLyAtIFNldCB0byBrTm9LZXkgaWYgbm8gZGVjcnlwdGlvbiBrZXkgaXMgYXZhaWxhYmxlIHRvIGRlY3J5cHQgdGhlIGVuY3J5cHRlZAotICAvLyAgIGJ1ZmZlci4gSW4gdGhpcyBjYXNlIHRoZSBkZWNyeXB0ZWQgYnVmZmVyIG11c3QgYmUgTlVMTC4KLSAgLy8gLSBTZXQgdG8ga0Vycm9yIGlmIHVuZXhwZWN0ZWQgZXJyb3IgaGFzIG9jY3VycmVkLiBJbiB0aGlzIGNhc2UgdGhlCi0gIC8vICAgZGVjcnlwdGVkIGJ1ZmZlciBtdXN0IGJlIE5VTEwuCi0gIC8vIC0gVGhpcyBwYXJhbWV0ZXIgc2hvdWxkIG5vdCBiZSBzZXQgdG8ga05lZWRNb3JlRGF0YS4KLSAgLy8gU2Vjb25kIHBhcmFtZXRlcjogVGhlIGRlY3J5cHRlZCBidWZmZXIuCi0gIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZChTdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+Jik+IERlY3J5cHRDQjsKLQotICAvLyBEZWNyeXB0cyB0aGUgfGVuY3J5cHRlZHwgYnVmZmVyLiBUaGUgZGVjcnlwdCBzdGF0dXMgYW5kIGRlY3J5cHRlZCBidWZmZXIKLSAgLy8gYXJlIHJldHVybmVkIHZpYSB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgfGRlY3J5cHRfY2J8LiBUaGUgfGVuY3J5cHRlZHwgYnVmZmVyCi0gIC8vIG11c3Qgbm90IGJlIE5VTEwuCi0gIC8vIERlY3J5cHQoKSBzaG91bGQgbm90IGJlIGNhbGxlZCB1bnRpbCBhbnkgcHJldmlvdXMgRGVjcnlwdENCIG9mIHRoZSBzYW1lCi0gIC8vIHxzdHJlYW1fdHlwZXwgaGFzIGNvbXBsZXRlZC4gVGh1cywgb25seSBvbmUgRGVjcnlwdENCIG1heSBiZSBwZW5kaW5nIGF0Ci0gIC8vIGEgdGltZSBmb3IgYSBnaXZlbiB8c3RyZWFtX3R5cGV8LgotICB2aXJ0dWFsIHZvaWQgRGVjcnlwdChTdHJlYW1UeXBlIHN0cmVhbV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBlbmNyeXB0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY3J5cHRDQiYgZGVjcnlwdF9jYikgPSAwOwotCi0gIC8vIENhbmNlbHMgdGhlIHNjaGVkdWxlZCBkZWNyeXB0aW9uIG9wZXJhdGlvbiBmb3IgfHN0cmVhbV90eXBlfCBhbmQgZmlyZXMgdGhlCi0gIC8vIHBlbmRpbmcgRGVjcnlwdENCIGltbWVkaWF0ZWx5IHdpdGgga1N1Y2Nlc3MgYW5kIE5VTEwuCi0gIC8vIERlY3J5cHQoKSBzaG91bGQgbm90IGJlIGNhbGxlZCBhZ2FpbiBiZWZvcmUgdGhlIHBlbmRpbmcgRGVjcnlwdENCIGZvciB0aGUKLSAgLy8gc2FtZSB8c3RyZWFtX3R5cGV8IGlzIGZpcmVkLgotICB2aXJ0dWFsIHZvaWQgQ2FuY2VsRGVjcnlwdChTdHJlYW1UeXBlIHN0cmVhbV90eXBlKSA9IDA7Ci0KLSAgLy8gSW5kaWNhdGVzIGNvbXBsZXRpb24gb2YgYXVkaW8vdmlkZW8gZGVjb2RlciBpbml0aWFsaXphdGlvbi4KLSAgLy8KLSAgLy8gRmlyc3QgUGFyYW1ldGVyOiBJbmRpY2F0ZXMgaW5pdGlhbGl6YXRpb24gc3VjY2Vzcy4KLSAgLy8gLSBTZXQgdG8gdHJ1ZSBpZiBpbml0aWFsaXphdGlvbiB3YXMgc3VjY2Vzc2Z1bC4gRmFsc2UgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCi0gIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZChib29sKT4gRGVjb2RlckluaXRDQjsKLQotICAvLyBJbml0aWFsaXplcyBhIGRlY29kZXIgd2l0aCB0aGUgZ2l2ZW4gfGNvbmZpZ3wsIGV4ZWN1dGluZyB0aGUgfGluaXRfY2J8Ci0gIC8vIHVwb24gY29tcGxldGlvbi4KLSAgdmlydHVhbCB2b2lkIEluaXRpYWxpemVBdWRpb0RlY29kZXIoc2NvcGVkX3B0cjxBdWRpb0RlY29kZXJDb25maWc+IGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjb2RlckluaXRDQiYgaW5pdF9jYikgPSAwOwotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZVZpZGVvRGVjb2RlcihzY29wZWRfcHRyPFZpZGVvRGVjb2RlckNvbmZpZz4gY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNvZGVySW5pdENCJiBpbml0X2NiKSA9IDA7Ci0KLSAgLy8gSGVscGVyIHN0cnVjdHVyZSBmb3IgbWFuYWdpbmcgbXVsdGlwbGUgZGVjb2RlZCBhdWRpbyBidWZmZXJzIHBlciBpbnB1dC4KLSAgLy8gVE9ETyh4aHdhbmcpOiBSZW5hbWUgdGhpcyB0byBBdWRpb0ZyYW1lcy4KLSAgdHlwZWRlZiBzdGQ6Omxpc3Q8c2NvcGVkX3JlZnB0cjxCdWZmZXI+ID4gQXVkaW9CdWZmZXJzOwotCi0gIC8vIEluZGljYXRlcyBjb21wbGV0aW9uIG9mIGF1ZGlvL3ZpZGVvIGRlY3J5cHQtYW5kLWRlY29kZSBvcGVyYXRpb24uCi0gIC8vCi0gIC8vIEZpcnN0IHBhcmFtZXRlcjogVGhlIHN0YXR1cyBvZiB0aGUgZGVjcnlwdC1hbmQtZGVjb2RlIG9wZXJhdGlvbi4KLSAgLy8gLSBTZXQgdG8ga1N1Y2Nlc3MgaWYgdGhlIGVuY3J5cHRlZCBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IGRlY3J5cHRlZCBhbmQKLSAgLy8gICBkZWNvZGVkLiBJbiB0aGlzIGNhc2UsIHRoZSBkZWNvZGVkIGZyYW1lL2J1ZmZlcnMgY2FuIGJlL2NvbnRhaW46Ci0gIC8vICAgMSkgTlVMTCwgd2hpY2ggbWVhbnMgdGhlIG9wZXJhdGlvbiBoYXMgYmVlbiBhYm9ydGVkLgotICAvLyAgIDIpIEVuZC1vZi1zdHJlYW0gKEVPUykgZnJhbWUsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGRlY29kZXIgaGFzIGhpdCBFT1MsCi0gIC8vICAgICAgZmx1c2hlZCBhbGwgaW50ZXJuYWwgYnVmZmVycyBhbmQgY2Fubm90IHByb2R1Y2UgbW9yZSB2aWRlbyBmcmFtZXMuCi0gIC8vICAgMykgRGVjcnlwdGVkIGFuZCBkZWNvZGVkIHZpZGVvIGZyYW1lIG9yIGF1ZGlvIGJ1ZmZlci4KLSAgLy8gLSBTZXQgdG8ga05vS2V5IGlmIG5vIGRlY3J5cHRpb24ga2V5IGlzIGF2YWlsYWJsZSB0byBkZWNyeXB0IHRoZSBlbmNyeXB0ZWQKLSAgLy8gICBidWZmZXIuIEluIHRoaXMgY2FzZSB0aGUgcmV0dXJuZWQgZnJhbWUocykgbXVzdCBiZSBOVUxML2VtcHR5LgotICAvLyAtIFNldCB0byBrTmVlZE1vcmVEYXRhIGlmIG1vcmUgZGF0YSBpcyBuZWVkZWQgdG8gcHJvZHVjZSBhIHZpZGVvIGZyYW1lLiBJbgotICAvLyAgIHRoaXMgY2FzZSB0aGUgcmV0dXJuZWQgZnJhbWUocykgbXVzdCBiZSBOVUxML2VtcHR5LgotICAvLyAtIFNldCB0byBrRXJyb3IgaWYgdW5leHBlY3RlZCBlcnJvciBoYXMgb2NjdXJyZWQuIEluIHRoaXMgY2FzZSB0aGUKLSAgLy8gICByZXR1cm5lZCBmcmFtZShzKSBtdXN0IGJlIE5VTEwvZW1wdHkuCi0gIC8vIFNlY29uZCBwYXJhbWV0ZXI6IFRoZSBkZWNvZGVkIHZpZGVvIGZyYW1lIG9yIGF1ZGlvIGJ1ZmZlcnMuCi0gIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZChTdGF0dXMsIGNvbnN0IEF1ZGlvQnVmZmVycyYpPiBBdWRpb0RlY29kZUNCOwotICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHZvaWQoU3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiYpPiBWaWRlb0RlY29kZUNCOwotCi0gIC8vIERlY3J5cHRzIGFuZCBkZWNvZGVzIHRoZSB8ZW5jcnlwdGVkfCBidWZmZXIuIFRoZSBzdGF0dXMgYW5kIHRoZSBkZWNyeXB0ZWQKLSAgLy8gYnVmZmVyIGFyZSByZXR1cm5lZCB2aWEgdGhlIHByb3ZpZGVkIGNhbGxiYWNrLgotICAvLyBUaGUgfGVuY3J5cHRlZHwgYnVmZmVyIG11c3Qgbm90IGJlIE5VTEwuCi0gIC8vIEF0IGVuZC1vZi1zdHJlYW0sIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgcmVwZWF0ZWRseSB3aXRoCi0gIC8vIGVuZC1vZi1zdHJlYW0gRGVjb2RlckJ1ZmZlciB1bnRpbCBubyBmcmFtZS9idWZmZXIgY2FuIGJlIHByb2R1Y2VkLgotICAvLyBUaGVzZSBtZXRob2RzIGNhbiBvbmx5IGJlIGNhbGxlZCBhZnRlciB0aGUgY29ycmVzcG9uZGluZyBkZWNvZGVyIGhhcwotICAvLyBiZWVuIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZC4KLSAgdmlydHVhbCB2b2lkIERlY3J5cHRBbmREZWNvZGVBdWRpbygKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGVuY3J5cHRlZCwKLSAgICAgIGNvbnN0IEF1ZGlvRGVjb2RlQ0ImIGF1ZGlvX2RlY29kZV9jYikgPSAwOwotICB2aXJ0dWFsIHZvaWQgRGVjcnlwdEFuZERlY29kZVZpZGVvKAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgZW5jcnlwdGVkLAotICAgICAgY29uc3QgVmlkZW9EZWNvZGVDQiYgdmlkZW9fZGVjb2RlX2NiKSA9IDA7Ci0KLSAgLy8gUmVzZXRzIHRoZSBkZWNvZGVyIHRvIGFuIGluaXRpYWxpemVkIGNsZWFuIHN0YXRlLCBjYW5jZWxzIGFueSBzY2hlZHVsZWQKLSAgLy8gZGVjcnlwdC1hbmQtZGVjb2RlIG9wZXJhdGlvbnMsIGFuZCBmaXJlcyBhbnkgcGVuZGluZwotICAvLyBBdWRpb0RlY29kZUNCL1ZpZGVvRGVjb2RlQ0IgaW1tZWRpYXRlbHkgd2l0aCBrRXJyb3IgYW5kIE5VTEwuCi0gIC8vIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGNhbGxlZCBhZnRlciB0aGUgY29ycmVzcG9uZGluZyBkZWNvZGVyIGhhcyBiZWVuCi0gIC8vIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZC4KLSAgdmlydHVhbCB2b2lkIFJlc2V0RGVjb2RlcihTdHJlYW1UeXBlIHN0cmVhbV90eXBlKSA9IDA7Ci0KLSAgLy8gUmVsZWFzZXMgZGVjb2RlciByZXNvdXJjZXMsIGRlaW5pdGlhbGl6ZXMgdGhlIGRlY29kZXIsIGNhbmNlbHMgYW55Ci0gIC8vIHNjaGVkdWxlZCBpbml0aWFsaXphdGlvbiBvciBkZWNyeXB0LWFuZC1kZWNvZGUgb3BlcmF0aW9ucywgYW5kIGZpcmVzCi0gIC8vIGFueSBwZW5kaW5nIERlY29kZXJJbml0Q0IvQXVkaW9EZWNvZGVDQi9WaWRlb0RlY29kZUNCIGltbWVkaWF0ZWx5LgotICAvLyBEZWNvZGVySW5pdENCIHNob3VsZCBiZSBmaXJlZCB3aXRoIGZhbHNlLiBBdWRpb0RlY29kZUNCL1ZpZGVvRGVjb2RlQ0IKLSAgLy8gc2hvdWxkIGJlIGZpcmVkIHdpdGgga0Vycm9yLgotICAvLyBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGFueSB0aW1lIGFmdGVyIEluaXRpYWxpemV7QXVkaW98VmlkZW99RGVjb2RlcigpCi0gIC8vIGhhcyBiZWVuIGNhbGxlZCAod2l0aCB0aGUgY29ycmVjdCBzdHJlYW0gdHlwZSkuCi0gIC8vIEFmdGVyIHRoaXMgb3BlcmF0aW9uLCB0aGUgZGVjb2RlciBpcyBzZXQgdG8gYW4gdW5pbml0aWFsaXplZCBzdGF0ZS4KLSAgLy8gVGhlIGRlY29kZXIgY2FuIGJlIHJlaW5pdGlhbGl6ZWQgYWZ0ZXIgaXQgaXMgdW5pbml0aWFsaXplZC4KLSAgdmlydHVhbCB2b2lkIERlaW5pdGlhbGl6ZURlY29kZXIoU3RyZWFtVHlwZSBzdHJlYW1fdHlwZSkgPSAwOwotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKERlY3J5cHRvcik7Ci19OwotCi0vLyBDYWxsYmFjayB0byBub3RpZnkgdGhhdCBhIGRlY3J5cHRvciBpcyByZWFkeS4KLXR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZChEZWNyeXB0b3IqKT4gRGVjcnlwdG9yUmVhZHlDQjsKLQotLy8gQ2FsbGJhY2sgdG8gc2V0L2NhbmNlbCBhIERlY3J5cHRvclJlYWR5Q0IuCi0vLyBDYWxsaW5nIHRoaXMgY2FsbGJhY2sgd2l0aCBhIG5vbi1udWxsIGNhbGxiYWNrIHJlZ2lzdGVycyBkZWNyeXB0b3IgcmVhZHkKLS8vIG5vdGlmaWNhdGlvbi4gV2hlbiB0aGUgZGVjcnlwdG9yIGlzIHJlYWR5LCBub3RpZmljYXRpb24gd2lsbCBiZSBzZW50Ci0vLyB0aHJvdWdoIHRoZSBwcm92aWRlZCBjYWxsYmFjay4KLS8vIENhbGxpbmcgdGhpcyBjYWxsYmFjayB3aXRoIGEgbnVsbCBjYWxsYmFjayBjYW5jZWxzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZAotLy8gZGVjcnlwdG9yIHJlYWR5IG5vdGlmaWNhdGlvbi4gQW55IHByZXZpb3VzbHkgcHJvdmlkZWQgY2FsbGJhY2sgd2lsbCBiZQotLy8gZmlyZWQgaW1tZWRpYXRlbHkgd2l0aCBOVUxMLgotdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKGNvbnN0IERlY3J5cHRvclJlYWR5Q0ImKT4gU2V0RGVjcnlwdG9yUmVhZHlDQjsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQkFTRV9ERUNSWVBUT1JfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2RlY3J5cHRvcl9jbGllbnQuaCBiL3NyYy9tZWRpYS9iYXNlL2RlY3J5cHRvcl9jbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRkMDlhOS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9kZWNyeXB0b3JfY2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0JBU0VfREVDUllQVE9SX0NMSUVOVF9IXwotI2RlZmluZSBNRURJQV9CQVNFX0RFQ1JZUFRPUl9DTElFTlRfSF8KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlY3J5cHRvci5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBJbnRlcmZhY2UgdXNlZCBieSBhIGRlY3J5cHRvciB0byBmaXJlIGtleSBldmVudHMuCi0vLyBTZWU6IGh0dHA6Ly9kdmNzLnczLm9yZy9oZy9odG1sLW1lZGlhL3Jhdy1maWxlL3RpcC9lbmNyeXB0ZWQtbWVkaWEvZW5jcnlwdGVkLW1lZGlhLmh0bWwjZXZlbnQtc3VtbWFyeQotY2xhc3MgRGVjcnlwdG9yQ2xpZW50IHsKLSBwdWJsaWM6Ci0gIC8vIFNpZ25hbHMgdGhhdCBhIGtleSBoYXMgYmVlbiBhZGRlZC4KLSAgdmlydHVhbCB2b2lkIEtleUFkZGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25faWQpID0gMDsKLQotICAvLyBTaWduYWxzIHRoYXQgYSBrZXkgZXJyb3Igb2NjdXJyZWQuIFRoZSB8c3lzdGVtX2NvZGV8IGlzIGtleQotICAvLyBzeXN0ZW0tZGVwZW5kZW50LiBGb3IgY2xlYXIga2V5IHN5c3RlbSwgdGhlIHxzeXN0ZW1fY29kZXwgaXMgYWx3YXlzIHplcm8uCi0gIHZpcnR1YWwgdm9pZCBLZXlFcnJvcihjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdG9yOjpLZXlFcnJvciBlcnJvcl9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN5c3RlbV9jb2RlKSA9IDA7Ci0KLSAgLy8gU2lnbmFscyB0aGF0IGEga2V5IG1lc3NhZ2UgaGFzIGJlZW4gZ2VuZXJhdGVkLgotICB2aXJ0dWFsIHZvaWQgS2V5TWVzc2FnZShjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGVmYXVsdF91cmwpID0gMDsKLQotICAvLyBTaWduYWxzIHRoYXQgYSBrZXkgaXMgbmVlZGVkIGZvciBkZWNyeXB0aW9uLiB8a2V5X3N5c3RlbXwgYW5kIHxzZXNzaW9uX2lkfAotICAvLyBjYW4gYmUgZW1wdHkgaWYgdGhlIGtleSBzeXN0ZW0gaGFzIG5vdCBiZWVuIHNlbGVjdGVkLgotICAvLyBUT0RPKHhod2FuZyk6IEZpZ3VyZSBvdXQgaWYgInR5cGUiIGlzIG9wdGlvbmFsIGZvciBOZWVkS2V5IGZpcmVkIGZyb20gdGhlCi0gIC8vIGRlY29kZXIuCi0gIHZpcnR1YWwgdm9pZCBOZWVkS2V5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9hcnJheTx1aW50OD4gaW5pdF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5pdF9kYXRhX2xlbmd0aCkgPSAwOwotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIH5EZWNyeXB0b3JDbGllbnQoKSB7fQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQkFTRV9ERUNSWVBUT1JfQ0xJRU5UX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9kZW11eGVyLmNjIGIvc3JjL21lZGlhL2Jhc2UvZGVtdXhlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNkNGUyOS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9kZW11eGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVtdXhlci5oIgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLURlbXV4ZXJIb3N0Ojp+RGVtdXhlckhvc3QoKSB7fQotCi1EZW11eGVyOjpEZW11eGVyKCkge30KLQotRGVtdXhlcjo6fkRlbXV4ZXIoKSB7fQotCi12b2lkIERlbXV4ZXI6OlNldFBsYXliYWNrUmF0ZShmbG9hdCBwbGF5YmFja19yYXRlKSB7fQotCi12b2lkIERlbXV4ZXI6OlNlZWsoYmFzZTo6VGltZURlbHRhIHRpbWUsIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIHN0YXR1c19jYikgewotICBEQ0hFQ0soIXN0YXR1c19jYi5pc19udWxsKCkpOwotICBzdGF0dXNfY2IuUnVuKFBJUEVMSU5FX09LKTsKLX0KLQotdm9pZCBEZW11eGVyOjpTdG9wKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSB7Ci0gIERDSEVDSyghY2FsbGJhY2suaXNfbnVsbCgpKTsKLSAgY2FsbGJhY2suUnVuKCk7Ci19Ci0KLXZvaWQgRGVtdXhlcjo6T25BdWRpb1JlbmRlcmVyRGlzYWJsZWQoKSB7fQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2RlbXV4ZXIuaCBiL3NyYy9tZWRpYS9iYXNlL2RlbXV4ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQxNTBhZi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9kZW11eGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0JBU0VfREVNVVhFUl9IXwotI2RlZmluZSBNRURJQV9CQVNFX0RFTVVYRVJfSF8KLQotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aW1lLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kYXRhX3NvdXJjZS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVtdXhlcl9zdHJlYW0uaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvcGlwZWxpbmVfc3RhdHVzLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIE1FRElBX0VYUE9SVCBEZW11eGVySG9zdCA6IHB1YmxpYyBEYXRhU291cmNlSG9zdCB7Ci0gcHVibGljOgotICAvLyBTZXRzIHRoZSBkdXJhdGlvbiBvZiB0aGUgbWVkaWEgaW4gbWljcm9zZWNvbmRzLgotICAvLyBEdXJhdGlvbiBtYXkgYmUga0luZmluaXRlRHVyYXRpb24oKSBpZiB0aGUgZHVyYXRpb24gaXMgbm90IGtub3duLgotICB2aXJ0dWFsIHZvaWQgU2V0RHVyYXRpb24oYmFzZTo6VGltZURlbHRhIGR1cmF0aW9uKSA9IDA7Ci0KLSAgLy8gU3RvcHMgZXhlY3V0aW9uIG9mIHRoZSBwaXBlbGluZSBkdWUgdG8gYSBmYXRhbCBlcnJvci4gIERvIG5vdCBjYWxsIHRoaXMKLSAgLy8gbWV0aG9kIHdpdGggUElQRUxJTkVfT0suCi0gIHZpcnR1YWwgdm9pZCBPbkRlbXV4ZXJFcnJvcihQaXBlbGluZVN0YXR1cyBlcnJvcikgPSAwOwotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIH5EZW11eGVySG9zdCgpOwotfTsKLQotY2xhc3MgTUVESUFfRVhQT1JUIERlbXV4ZXIgOiBwdWJsaWMgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8RGVtdXhlcj4gewotIHB1YmxpYzoKLSAgRGVtdXhlcigpOwotCi0gIC8vIENvbXBsZXRlcyBpbml0aWFsaXphdGlvbiBvZiB0aGUgZGVtdXhlci4KLSAgLy8KLSAgLy8gVGhlIGRlbXV4ZXIgZG9lcyBub3Qgb3duIHxob3N0fCBhcyBpdCBpcyBndWFyYW50ZWVkIHRvIG91dGxpdmUgdGhlCi0gIC8vIGxpZmV0aW1lIG9mIHRoZSBkZW11eGVyLiBEb24ndCBkZWxldGUgaXQhCi0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKERlbXV4ZXJIb3N0KiBob3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBzdGF0dXNfY2IpID0gMDsKLQotICAvLyBUaGUgcGlwZWxpbmUgcGxheWJhY2sgcmF0ZSBoYXMgYmVlbiBjaGFuZ2VkLiAgRGVtdXhlcnMgbWF5IGltcGxlbWVudCB0aGlzCi0gIC8vIG1ldGhvZCBpZiB0aGV5IG5lZWQgdG8gcmVzcG9uZCB0byB0aGlzIGNhbGwuCi0gIHZpcnR1YWwgdm9pZCBTZXRQbGF5YmFja1JhdGUoZmxvYXQgcGxheWJhY2tfcmF0ZSk7Ci0KLSAgLy8gQ2Fycnkgb3V0IGFueSBhY3Rpb25zIHJlcXVpcmVkIHRvIHNlZWsgdG8gdGhlIGdpdmVuIHRpbWUsIGV4ZWN1dGluZyB0aGUKLSAgLy8gY2FsbGJhY2sgdXBvbiBjb21wbGV0aW9uLgotICB2aXJ0dWFsIHZvaWQgU2VlayhiYXNlOjpUaW1lRGVsdGEgdGltZSwgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc3RhdHVzX2NiKTsKLQotICAvLyBUaGUgcGlwZWxpbmUgaXMgYmVpbmcgc3RvcHBlZCBlaXRoZXIgYXMgYSByZXN1bHQgb2YgYW4gZXJyb3Igb3IgYmVjYXVzZQotICAvLyB0aGUgY2xpZW50IGNhbGxlZCBTdG9wKCkuCi0gIHZpcnR1YWwgdm9pZCBTdG9wKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKTsKLQotICAvLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgZnJvbSB0aGUgcGlwZWxpbmUgd2hlbiB0aGUgYXVkaW8gcmVuZGVyZXIKLSAgLy8gaXMgZGlzYWJsZWQuIERlbXV4ZXJzIGNhbiBpZ25vcmUgdGhlIG5vdGlmaWNhdGlvbiBpZiB0aGV5IGRvIG5vdAotICAvLyBuZWVkIHRvIHJlYWN0IHRvIHRoaXMgZXZlbnQuCi0gIC8vCi0gIC8vIFRPRE8oYWNvbHdlbGwpOiBDaGFuZ2UgdG8gZ2VuZXJpYyBEaXNhYmxlU3RyZWFtKERlbXV4ZXJTdHJlYW06OlR5cGUpLgotICB2aXJ0dWFsIHZvaWQgT25BdWRpb1JlbmRlcmVyRGlzYWJsZWQoKTsKLQotICAvLyBSZXR1cm5zIHRoZSBnaXZlbiBzdHJlYW0gdHlwZSwgb3IgTlVMTCBpZiB0aGF0IHR5cGUgaXMgbm90IHByZXNlbnQuCi0gIHZpcnR1YWwgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiBHZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6VHlwZSB0eXBlKSA9IDA7Ci0KLSAgLy8gUmV0dXJucyB0aGUgc3RhcnRpbmcgdGltZSBmb3IgdGhlIG1lZGlhIGZpbGUuCi0gIHZpcnR1YWwgYmFzZTo6VGltZURlbHRhIEdldFN0YXJ0VGltZSgpIGNvbnN0ID0gMDsKLQotIHByb3RlY3RlZDoKLSAgZnJpZW5kIGNsYXNzIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPERlbXV4ZXI+OwotICB2aXJ0dWFsIH5EZW11eGVyKCk7Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRGVtdXhlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX0RFTVVYRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2RlbXV4ZXJfc3RyZWFtLmNjIGIvc3JjL21lZGlhL2Jhc2UvZGVtdXhlcl9zdHJlYW0uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZWRlNjUuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvZGVtdXhlcl9zdHJlYW0uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZW11eGVyX3N0cmVhbS5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1EZW11eGVyU3RyZWFtOjp+RGVtdXhlclN0cmVhbSgpIHt9Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvZGVtdXhlcl9zdHJlYW0uaCBiL3NyYy9tZWRpYS9iYXNlL2RlbXV4ZXJfc3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YTE2ZWEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvZGVtdXhlcl9zdHJlYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfQkFTRV9ERU1VWEVSX1NUUkVBTV9IXwotI2RlZmluZSBNRURJQV9CQVNFX0RFTVVYRVJfU1RSRUFNX0hfCi0KLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvcmFuZ2VzLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIEF1ZGlvRGVjb2RlckNvbmZpZzsKLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi1jbGFzcyBEZWNyeXB0b3I7Ci0jZW5kaWYKLWNsYXNzIERlY29kZXJCdWZmZXI7Ci1jbGFzcyBWaWRlb0RlY29kZXJDb25maWc7Ci0KLWNsYXNzIE1FRElBX0VYUE9SVCBEZW11eGVyU3RyZWFtCi0gICAgOiBwdWJsaWMgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8RGVtdXhlclN0cmVhbT4gewotIHB1YmxpYzoKLSAgZW51bSBUeXBlIHsKLSAgICBVTktOT1dOLAotICAgIEFVRElPLAotICAgIFZJREVPLAotICAgIE5VTV9UWVBFUywgIC8vIEFsd2F5cyBrZWVwIHRoaXMgZW50cnkgYXMgdGhlIGxhc3Qgb25lIQotICB9OwotCi0gIC8vIFN0YXR1cyByZXR1cm5lZCBpbiB0aGUgUmVhZCgpIGNhbGxiYWNrLgotICAvLyAga09rIDogSW5kaWNhdGVzIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIE5vbi1OVUxMIGFuZCBjb250YWlucyBtZWRpYSBkYXRhCi0gIC8vICAgICAgICBvciB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uCi0gIC8vICBrQWJvcnRlZCA6IEluZGljYXRlcyBhbiBhYm9ydGVkIFJlYWQoKS4gVGhpcyBjYW4gaGFwcGVuIGlmIHRoZQotICAvLyAgICAgICAgICAgICBEZW11eGVyU3RyZWFtIGdldHMgZmx1c2hlZCBhbmQgZG9lc24ndCBoYXZlIGFueSBtb3JlIGRhdGEgdG8KLSAgLy8gICAgICAgICAgICAgcmV0dXJuLiBUaGUgc2Vjb25kIHBhcmFtZXRlciBNVVNUIGJlIE5VTEwgd2hlbiB0aGlzIHN0YXR1cyBpcwotICAvLyAgICAgICAgICAgICByZXR1cm5lZC4KLSAgLy8gIGtDb25maWdDaGFuZ2UgOiBJbmRpY2F0ZXMgdGhhdCB0aGUgQXVkaW9EZWNvZGVyQ29uZmlnIG9yCi0gIC8vICAgICAgICAgICAgICAgICAgVmlkZW9EZWNvZGVyQ29uZmlnIGZvciB0aGUgc3RyZWFtIGhhcyBjaGFuZ2VkLgotICAvLyAgICAgICAgICAgICAgICAgIFRoZSBEZW11eGVyU3RyZWFtIGV4cGVjdHMgYW4gYXVkaW9fZGVjb2Rlcl9jb25maWcoKSBvcgotICAvLyAgICAgICAgICAgICAgICAgIHZpZGVvX2RlY29kZXJfY29uZmlnKCkgY2FsbCBiZWZvcmUgUmVhZCgpIHdpbGwgc3RhcnQKLSAgLy8gICAgICAgICAgICAgICAgICByZXR1cm5pbmcgRGVjb2RlckJ1ZmZlcnMgYWdhaW4uIFRoZSBkZWNvZGVyIHdpbGwgbmVlZCB0aGlzCi0gIC8vICAgICAgICAgICAgICAgICAgbmV3IGNvbmZpZ3VyYXRpb24gdG8gcHJvcGVybHkgZGVjb2RlIHRoZSBidWZmZXJzIHJlYWQKLSAgLy8gICAgICAgICAgICAgICAgICBmcm9tIHRoaXMgcG9pbnQgZm9yd2FyZC4gVGhlIHNlY29uZCBwYXJhbWV0ZXIgTVVTVCBiZSBOVUxMCi0gIC8vICAgICAgICAgICAgICAgICAgd2hlbiB0aGlzIHN0YXR1cyBpcyByZXR1cm5lZC4KLSAgZW51bSBTdGF0dXMgewotICAgIGtPaywKLSAgICBrQWJvcnRlZCwKLSAgICBrQ29uZmlnQ2hhbmdlZCwKLSAgfTsKLQotICAvLyBSZXF1ZXN0IGEgYnVmZmVyIHRvIHJldHVybmVkIHZpYSB0aGUgcHJvdmlkZWQgY2FsbGJhY2suCi0gIC8vCi0gIC8vIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBzdGF0dXMgb2YgdGhlIHJlYWQuCi0gIC8vIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIG5vbi1OVUxMIGFuZCBjb250YWlucyBtZWRpYSBkYXRhCi0gIC8vIG9yIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBpZiB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIGtPay4gTlVMTCBvdGhlcndpc2UuCi0gIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZChTdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+Jik+UmVhZENCOwotICB2aXJ0dWFsIHZvaWQgUmVhZChjb25zdCBSZWFkQ0ImIHJlYWRfY2IpID0gMDsKLQotICAvLyBSZXR1cm5zIHRoZSBhdWRpbyBkZWNvZGVyIGNvbmZpZ3VyYXRpb24uIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyBtZXRob2QKLSAgLy8gaWYgdHlwZSgpICE9IEFVRElPLgotICB2aXJ0dWFsIGNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYgYXVkaW9fZGVjb2Rlcl9jb25maWcoKSA9IDA7Ci0KLSAgLy8gUmV0dXJucyB0aGUgdmlkZW8gZGVjb2RlciBjb25maWd1cmF0aW9uLiBJdCBpcyBhbiBlcnJvciB0byBjYWxsIHRoaXMgbWV0aG9kCi0gIC8vIGlmIHR5cGUoKSAhPSBWSURFTy4KLSAgdmlydHVhbCBjb25zdCBWaWRlb0RlY29kZXJDb25maWcmIHZpZGVvX2RlY29kZXJfY29uZmlnKCkgPSAwOwotCi0gIC8vIFJldHVybnMgdGhlIHR5cGUgb2Ygc3RyZWFtLgotICB2aXJ0dWFsIFR5cGUgdHlwZSgpID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgRW5hYmxlQml0c3RyZWFtQ29udmVydGVyKCkgPSAwOwotCi0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbnRlbnQgd2FzIGVuY3J5cHRlZCBhdCBzb21lIHBvaW50Ci0gIHZpcnR1YWwgYm9vbCBTdHJlYW1XYXNFbmNyeXB0ZWQoKSBjb25zdCA9IDA7Ci0KLSAgdmlydHVhbCBEZWNyeXB0b3IqIEdldERlY3J5cHRvcigpIGNvbnN0IHsgcmV0dXJuIE5VTEw7IH0KLSNlbmRpZgotCi0gcHJvdGVjdGVkOgotICBmcmllbmQgY2xhc3MgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8RGVtdXhlclN0cmVhbT47Ci0gIHZpcnR1YWwgfkRlbXV4ZXJTdHJlYW0oKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0JBU0VfREVNVVhFUl9TVFJFQU1fSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2RqYjIuY2MgYi9zcmMvbWVkaWEvYmFzZS9kamIyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDQ3ZWQyLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL2RqYjIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kamIyLmgiCi0KLXVpbnQzMiBESkIySGFzaChjb25zdCB2b2lkKiBidWYsIHNpemVfdCBsZW4sIHVpbnQzMiBzZWVkKSB7Ci0gIGNvbnN0IHVpbnQ4KiBzcmMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4Kj4oYnVmKTsKLSAgdWludDMyIGhhc2ggPSBzZWVkOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbjsgKytpKSB7Ci0gICAgaGFzaCA9IGhhc2ggKiAzMyArIHNyY1tpXTsKLSAgfQotICByZXR1cm4gaGFzaDsKLX0KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2RqYjIuaCBiL3NyYy9tZWRpYS9iYXNlL2RqYjIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk4ZjlkMS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9kamIyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0JBU0VfREpCMl9IXwotI2RlZmluZSBNRURJQV9CQVNFX0RKQjJfSF8KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLS8vIERKQjIgaXMgYSBoYXNoIGFsZ29yaXRobSB3aXRoIGV4Y2VsbGVudCBkaXN0cmlidXRpb24gYW5kIHNwZWVkCi0vLyBvbiBtYW55IGRpZmZlcmVudCBzZXRzLgotLy8gSXQgaGFzIG1hcmdpbmFsbHkgbW9yZSBjb2xsaXNpb25zIHRoYW4gRk5WMSwgYnV0IG1ha2VzIHVwIGZvciBpdCBpbgotLy8gcGVyZm9ybWFuY2UuCi0vLyBUaGUgcmV0dXJuIHZhbHVlIGlzIHN1aXRhYmxlIGZvciB0YWJsZSBsb29rdXBzLgotLy8gRm9yIHNtYWxsIGZpeGVkIHNpemVzIChpZSBhIHBpeGVsKSwgaXQgaGFzIGxvdyBvdmVyaGVhZCBhbmQgaW5saW5lcyB3ZWxsLgotLy8gRm9yIGxhcmdlIGRhdGEgc2V0cywgaXQgb3B0aW1pemVzIGludG8gYXNzZW1ibHkvc2ltZCBhbmQgaXMgYXBwcm9wcmlhdGUKLS8vIGZvciByZWFsdGltZSBhcHBsaWNhdGlvbnMuCi0vLyBTZWUgQWxzbzoKLS8vICAgaHR0cDovL3d3dy5jc2UueW9ya3UuY2Evfm96L2hhc2guaHRtbAotCi1zdGF0aWMgY29uc3QgdWludDMyIGtESkIySGFzaFNlZWQgPSA1MzgxdTsKLQotLy8gVGhlc2UgZnVuY3Rpb25zIHBlcmZvcm0gREpCMiBoYXNoLiBUaGUgc2ltcGxlc3QgY2FsbCBpcyBESkIySGFzaCgpIHRvCi0vLyBnZW5lcmF0ZSB0aGUgREpCMiBoYXNoIG9mIHRoZSBnaXZlbiBkYXRhOgotLy8gICB1aW50MzIgaGFzaCA9IERKQjJIYXNoKGRhdGExLCBsZW5ndGgxLCBrREpCMkhhc2hTZWVkKTsKLS8vCi0vLyBZb3UgY2FuIGFsc28gY29tcHV0ZSB0aGUgREpCMiBoYXNoIG9mIGRhdGEgaW5jcmVtZW50YWxseSBieSBtYWtpbmcgbXVsdGlwbGUKLS8vIGNhbGxzIHRvIERKQjJIYXNoKCk6Ci0vLyAgIHVpbnQzMiBoYXNoX3ZhbHVlID0ga0RKQjJIYXNoU2VlZDsgIC8vIEluaXRpYWwgc2VlZCBmb3IgREpCMi4KLS8vICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3B5X2xpbmVzOyArK2kpIHsKLS8vICAgICBoYXNoX3ZhbHVlID0gREpCMkhhc2goc291cmNlLCBieXRlc19wZXJfbGluZSwgaGFzaF92YWx1ZSk7Ci0vLyAgICAgc291cmNlICs9IHNvdXJjZV9zdHJpZGU7Ci0vLyAgIH0KLQotLy8gRm9yIHRoZSBnaXZlbiBidWZmZXIgb2YgZGF0YSwgY29tcHV0ZSB0aGUgREpCMiBoYXNoIG9mCi0vLyB0aGUgZGF0YS4gWW91IGNhbiBjYWxsIHRoaXMgYW55IG51bWJlciBvZiB0aW1lcyBkdXJpbmcgdGhlIGNvbXB1dGF0aW9uLgotTUVESUFfRVhQT1JUIHVpbnQzMiBESkIySGFzaChjb25zdCB2b2lkKiBidWYsIHNpemVfdCBsZW4sIHVpbnQzMiBzZWVkKTsKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX0RKQjJfSF8KLQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvZGpiMl91bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9iYXNlL2RqYjJfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ODk4YWEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvZGpiMl91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAwOCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RqYjIuaCIKLQotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi11aW50OCBrVGVzdERhdGFbXSA9IHsgMSwgMiwgMyB9OwotCi1URVNUKERKQjJIYXNoVGVzdCwgSGFzaFRlc3QpIHsKLSAgRVhQRUNUX0VRKERKQjJIYXNoKE5VTEwsIDAsIDB1KSwgMHUpOwotICBFWFBFQ1RfRVEoREpCMkhhc2goa1Rlc3REYXRhLCBzaXplb2Yoa1Rlc3REYXRhKSwgNTM4MXUpLAotICAgICAgICAgICAgICAgICAgICAgKCg1MzgxdSAqIDMzdSArIDF1KSAqIDMzdSArIDJ1KSAqIDMzdSArIDN1KTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2VuZGlhbl91dGlsLmggYi9zcmMvbWVkaWEvYmFzZS9lbmRpYW5fdXRpbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWQ2YzAyLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL2VuZGlhbl91dGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBNRURJQV9CQVNFX0VORElBTl9VVElMX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfRU5ESUFOX1VUSUxfSF8KLQotI2luY2x1ZGUgImJhc2Uvc3lzX2J5dGVvcmRlci5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotbmFtZXNwYWNlIGVuZGlhbl91dGlsIHsKLQotLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbXVzdCBiZSBhYmxlIHRvIHN1cHBvcnQgc3RvcmluZyB0by9sb2FkaW5nIGZyb20KLS8vIG5vbi1hbGlnbmVkIG1lbW9yeS4gIFRodXMsIGNhc3RzIGxpa2UgIipyZWludGVycHJldF9jYXN0PHVpbnQxNl90Kj4ocCkiCi0vLyBzaG91bGQgYmUgYXZvaWRlZCBhcyB0aGVzZSBjYW4gY2F1c2UgY3Jhc2hlcyBkdWUgdG8gYWxpZ25tZW50IG9uIHNvbWUKLS8vIHBsYXRmb3Jtcy4KLQotLy8gTG9hZCAyIGxpdHRsZS1lbmRpYW4gYnl0ZXMgYXQgfHB8IGFuZCByZXR1cm4gYXMgYSBob3N0LWVuZGlhbiB1aW50MTZfdC4KLWlubGluZSB1aW50MTZfdCBsb2FkX3VpbnQxNl9saXR0bGVfZW5kaWFuKGNvbnN0IHVpbnQ4X3QqIHApIHsKLSAgdWludDE2X3QgYWxpZ25lZF9wOwotICBtZW1jcHkoJmFsaWduZWRfcCwgcCwgc2l6ZW9mKGFsaWduZWRfcCkpOwotICByZXR1cm4gYmFzZTo6Qnl0ZVN3YXBUb0xFMTYoYWxpZ25lZF9wKTsKLX0KLQotLy8gTG9hZCA0IGxpdHRsZS1lbmRpYW4gYnl0ZXMgYXQgfHB8IGFuZCByZXR1cm4gYXMgYSBob3N0LWVuZGlhbiB1aW50MzJfdC4KLWlubGluZSB1aW50MzJfdCBsb2FkX3VpbnQzMl9saXR0bGVfZW5kaWFuKGNvbnN0IHVpbnQ4X3QqIHApIHsKLSAgdWludDMyX3QgYWxpZ25lZF9wOwotICBtZW1jcHkoJmFsaWduZWRfcCwgcCwgc2l6ZW9mKGFsaWduZWRfcCkpOwotICByZXR1cm4gYmFzZTo6Qnl0ZVN3YXBUb0xFMzIoYWxpZ25lZF9wKTsKLX0KLQotLy8gTG9hZCA4IGxpdHRsZS1lbmRpYW4gYnl0ZXMgYXQgfHB8IGFuZCByZXR1cm4gYXMgYSBob3N0LWVuZGlhbiB1aW50NjRfdC4KLWlubGluZSB1aW50NjRfdCBsb2FkX3VpbnQ2NF9saXR0bGVfZW5kaWFuKGNvbnN0IHVpbnQ4X3QqIHApIHsKLSAgdWludDY0X3QgYWxpZ25lZF9wOwotICBtZW1jcHkoJmFsaWduZWRfcCwgcCwgc2l6ZW9mKGFsaWduZWRfcCkpOwotICByZXR1cm4gYmFzZTo6Qnl0ZVN3YXBUb0xFNjQoYWxpZ25lZF9wKTsKLX0KLQotLy8gTG9hZCAyIGJpZy1lbmRpYW4gYnl0ZXMgYXQgfHB8IGFuZCByZXR1cm4gYXMgYSBob3N0LWVuZGlhbiB1aW50MTZfdC4KLWlubGluZSB1aW50MTZfdCBsb2FkX3VpbnQxNl9iaWdfZW5kaWFuKGNvbnN0IHVpbnQ4X3QqIHApIHsKLSAgdWludDE2X3QgYWxpZ25lZF9wOwotICBtZW1jcHkoJmFsaWduZWRfcCwgcCwgc2l6ZW9mKGFsaWduZWRfcCkpOwotICByZXR1cm4gYmFzZTo6TmV0VG9Ib3N0MTYoYWxpZ25lZF9wKTsKLX0KLQotLy8gTG9hZCA0IGJpZy1lbmRpYW4gYnl0ZXMgYXQgfHB8IGFuZCByZXR1cm4gYXMgYSBob3N0LWVuZGlhbiB1aW50MzJfdC4KLWlubGluZSB1aW50MzJfdCBsb2FkX3VpbnQzMl9iaWdfZW5kaWFuKGNvbnN0IHVpbnQ4X3QqIHApIHsKLSAgdWludDMyX3QgYWxpZ25lZF9wOwotICBtZW1jcHkoJmFsaWduZWRfcCwgcCwgc2l6ZW9mKGFsaWduZWRfcCkpOwotICByZXR1cm4gYmFzZTo6TmV0VG9Ib3N0MzIoYWxpZ25lZF9wKTsKLX0KLQotLy8gTG9hZCA4IGJpZy1lbmRpYW4gYnl0ZXMgYXQgfHB8IGFuZCByZXR1cm4gYXMgYSBob3N0LWVuZGlhbiB1aW50NjRfdC4KLWlubGluZSB1aW50NjRfdCBsb2FkX3VpbnQ2NF9iaWdfZW5kaWFuKGNvbnN0IHVpbnQ4X3QqIHApIHsKLSAgdWludDY0X3QgYWxpZ25lZF9wOwotICBtZW1jcHkoJmFsaWduZWRfcCwgcCwgc2l6ZW9mKGFsaWduZWRfcCkpOwotICByZXR1cm4gYmFzZTo6TmV0VG9Ib3N0NjQoYWxpZ25lZF9wKTsKLX0KLQotLy8gTG9hZCAyIGJpZy1lbmRpYW4gYnl0ZXMgYXQgfHB8IGFuZCByZXR1cm4gYXMgYW4gaG9zdC1lbmRpYW4gaW50MTZfdC4KLWlubGluZSBpbnQxNl90IGxvYWRfaW50MTZfYmlnX2VuZGlhbihjb25zdCB1aW50OF90KiBwKSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQxNl90Pihsb2FkX3VpbnQxNl9iaWdfZW5kaWFuKHApKTsKLX0KLQotLy8gTG9hZCA0IGJpZy1lbmRpYW4gYnl0ZXMgYXQgfHB8IGFuZCByZXR1cm4gYXMgYW4gaG9zdC1lbmRpYW4gaW50MzJfdC4KLWlubGluZSBpbnQzMl90IGxvYWRfaW50MzJfYmlnX2VuZGlhbihjb25zdCB1aW50OF90KiBwKSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90Pihsb2FkX3VpbnQzMl9iaWdfZW5kaWFuKHApKTsKLX0KLQotLy8gTG9hZCA4IGJpZy1lbmRpYW4gYnl0ZXMgYXQgfHB8IGFuZCByZXR1cm4gYXMgYW4gaG9zdC1lbmRpYW4gaW50NjRfdC4KLWlubGluZSBpbnQ2NF90IGxvYWRfaW50NjRfYmlnX2VuZGlhbihjb25zdCB1aW50OF90KiBwKSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ2NF90Pihsb2FkX3VpbnQ2NF9iaWdfZW5kaWFuKHApKTsKLX0KLQotLy8gTG9hZCAyIGxpdHRsZS1lbmRpYW4gYnl0ZXMgYXQgfHB8IGFuZCByZXR1cm4gYXMgYSBob3N0LWVuZGlhbiBpbnQxNl90LgotaW5saW5lIGludDE2X3QgbG9hZF9pbnQxNl9saXR0bGVfZW5kaWFuKGNvbnN0IHVpbnQ4X3QqIHApIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludDE2X3Q+KGxvYWRfdWludDE2X2xpdHRsZV9lbmRpYW4ocCkpOwotfQotCi0vLyBMb2FkIDQgbGl0dGxlLWVuZGlhbiBieXRlcyBhdCB8cHwgYW5kIHJldHVybiBhcyBhIGhvc3QtZW5kaWFuIGludDMyX3QuCi1pbmxpbmUgaW50MzJfdCBsb2FkX2ludDMyX2xpdHRsZV9lbmRpYW4oY29uc3QgdWludDhfdCogcCkgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obG9hZF91aW50MzJfbGl0dGxlX2VuZGlhbihwKSk7Ci19Ci0KLS8vIExvYWQgOCBsaXR0bGUtZW5kaWFuIGJ5dGVzIGF0IHxwfCBhbmQgcmV0dXJuIGFzIGEgaG9zdC1lbmRpYW4gaW50NjRfdC4KLWlubGluZSBpbnQ2NF90IGxvYWRfaW50NjRfbGl0dGxlX2VuZGlhbihjb25zdCB1aW50OF90KiBwKSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ2NF90Pihsb2FkX3VpbnQ2NF9saXR0bGVfZW5kaWFuKHApKTsKLX0KLQotLy8gU3RvcmUgMiBob3N0LWVuZGlhbiBieXRlcyBhcyBiaWctZW5kaWFuIGF0IHxwfC4KLWlubGluZSB2b2lkIHN0b3JlX3VpbnQxNl9iaWdfZW5kaWFuKHVpbnQxNl90IGQsIHVpbnQ4X3QqIHApIHsKLSAgdWludDE2X3QgYmlnX2QgPSBiYXNlOjpIb3N0VG9OZXQxNihkKTsKLSAgbWVtY3B5KHAsICZiaWdfZCwgc2l6ZW9mKGJpZ19kKSk7Ci19Ci0KLS8vIFN0b3JlIDQgaG9zdC1lbmRpYW4gYnl0ZXMgYXMgYmlnLWVuZGlhbiBhdCB8cHwuCi1pbmxpbmUgdm9pZCBzdG9yZV91aW50MzJfYmlnX2VuZGlhbih1aW50MzJfdCBkLCB1aW50OF90KiBwKSB7Ci0gIHVpbnQzMl90IGJpZ19kID0gYmFzZTo6SG9zdFRvTmV0MzIoZCk7Ci0gIG1lbWNweShwLCAmYmlnX2QsIHNpemVvZihiaWdfZCkpOwotfQotCi0vLyBTdG9yZSA4IGhvc3QtZW5kaWFuIGJ5dGVzIGFzIGJpZy1lbmRpYW4gYXQgfHB8LgotaW5saW5lIHZvaWQgc3RvcmVfdWludDY0X2JpZ19lbmRpYW4odWludDY0X3QgZCwgdWludDhfdCogcCkgewotICB1aW50NjRfdCBiaWdfZCA9IGJhc2U6Okhvc3RUb05ldDY0KGQpOwotICBtZW1jcHkocCwgJmJpZ19kLCBzaXplb2YoYmlnX2QpKTsKLX0KLQotLy8gU3RvcmUgMiBob3N0LWVuZGlhbiBieXRlcyBhcyBsaXR0bGUtZW5kaWFuIGF0IHxwfC4KLWlubGluZSB2b2lkIHN0b3JlX3VpbnQxNl9saXR0bGVfZW5kaWFuKHVpbnQxNl90IGQsIHVpbnQ4X3QqIHApIHsKLSAgdWludDE2X3QgbGl0dGxlX2QgPSBiYXNlOjpCeXRlU3dhcFRvTEUxNihkKTsKLSAgbWVtY3B5KHAsICZsaXR0bGVfZCwgc2l6ZW9mKGxpdHRsZV9kKSk7Ci19Ci0KLS8vIFN0b3JlIDQgaG9zdC1lbmRpYW4gYnl0ZXMgYXMgbGl0dGxlLWVuZGlhbiBhdCB8cHwuCi1pbmxpbmUgdm9pZCBzdG9yZV91aW50MzJfbGl0dGxlX2VuZGlhbih1aW50MzJfdCBkLCB1aW50OF90KiBwKSB7Ci0gIHVpbnQzMl90IGxpdHRsZV9kID0gYmFzZTo6Qnl0ZVN3YXBUb0xFMzIoZCk7Ci0gIG1lbWNweShwLCAmbGl0dGxlX2QsIHNpemVvZihsaXR0bGVfZCkpOwotfQotCi0vLyBTdG9yZSA4IGhvc3QtZW5kaWFuIGJ5dGVzIGFzIGxpdHRsZS1lbmRpYW4gYXQgfHB8LgotaW5saW5lIHZvaWQgc3RvcmVfdWludDY0X2xpdHRsZV9lbmRpYW4odWludDY0X3QgZCwgdWludDhfdCogcCkgewotICB1aW50NjRfdCBsaXR0bGVfZCA9IGJhc2U6OkJ5dGVTd2FwVG9MRTY0KGQpOwotICBtZW1jcHkocCwgJmxpdHRsZV9kLCBzaXplb2YobGl0dGxlX2QpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGVuZGlhbl91dGlsCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX0VORElBTl9VVElMX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9mYWtlX2F1ZGlvX3JlbmRlcl9jYWxsYmFjay5jYyBiL3NyYy9tZWRpYS9iYXNlL2Zha2VfYXVkaW9fcmVuZGVyX2NhbGxiYWNrLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjU1OTEwLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL2Zha2VfYXVkaW9fcmVuZGVyX2NhbGxiYWNrLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gTVNWQysrIHJlcXVpcmVzIHRoaXMgdG8gYmUgc2V0IGJlZm9yZSBhbnkgb3RoZXIgaW5jbHVkZXMgdG8gZ2V0IE1fUEkuCi0jZGVmaW5lIF9VU0VfTUFUSF9ERUZJTkVTCi0KLSNpbmNsdWRlIDxjbWF0aD4KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZmFrZV9hdWRpb19yZW5kZXJfY2FsbGJhY2suaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotRmFrZUF1ZGlvUmVuZGVyQ2FsbGJhY2s6OkZha2VBdWRpb1JlbmRlckNhbGxiYWNrKGRvdWJsZSBzdGVwKQotICAgIDogaGFsZl9maWxsXyhmYWxzZSksCi0gICAgICBzdGVwXyhzdGVwKSwKLSAgICAgIGxhc3RfYXVkaW9fZGVsYXlfbWlsbGlzZWNvbmRzXygtMSksCi0gICAgICB2b2x1bWVfKDEpIHsKLSAgcmVzZXQoKTsKLX0KLQotRmFrZUF1ZGlvUmVuZGVyQ2FsbGJhY2s6On5GYWtlQXVkaW9SZW5kZXJDYWxsYmFjaygpIHt9Ci0KLWludCBGYWtlQXVkaW9SZW5kZXJDYWxsYmFjazo6UmVuZGVyKEF1ZGlvQnVzKiBhdWRpb19idXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9fZGVsYXlfbWlsbGlzZWNvbmRzKSB7Ci0gIGxhc3RfYXVkaW9fZGVsYXlfbWlsbGlzZWNvbmRzXyA9IGF1ZGlvX2RlbGF5X21pbGxpc2Vjb25kczsKLSAgaW50IG51bWJlcl9vZl9mcmFtZXMgPSBhdWRpb19idXMtPmZyYW1lcygpOwotICBpZiAoaGFsZl9maWxsXykKLSAgICBudW1iZXJfb2ZfZnJhbWVzIC89IDI7Ci0KLSAgLy8gRmlsbCBmaXJzdCBjaGFubmVsIHdpdGggYSBzaW5lIHdhdmUuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyX29mX2ZyYW1lczsgKytpKQotICAgIGF1ZGlvX2J1cy0+Y2hhbm5lbCgwKVtpXSA9IHNpbigyICogTV9QSSAqICh4XyArIHN0ZXBfICogaSkpOwotICB4XyArPSBudW1iZXJfb2ZfZnJhbWVzICogc3RlcF87Ci0KLSAgLy8gQ29weSBmaXJzdCBjaGFubmVsIGludG8gdGhlIHJlc3Qgb2YgdGhlIGNoYW5uZWxzLgotICBmb3IgKGludCBpID0gMTsgaSA8IGF1ZGlvX2J1cy0+Y2hhbm5lbHMoKTsgKytpKQotICAgIG1lbWNweShhdWRpb19idXMtPmNoYW5uZWwoaSksIGF1ZGlvX2J1cy0+Y2hhbm5lbCgwKSwKLSAgICAgICAgICAgbnVtYmVyX29mX2ZyYW1lcyAqIHNpemVvZigqYXVkaW9fYnVzLT5jaGFubmVsKGkpKSk7Ci0KLSAgcmV0dXJuIG51bWJlcl9vZl9mcmFtZXM7Ci19Ci0KLWRvdWJsZSBGYWtlQXVkaW9SZW5kZXJDYWxsYmFjazo6UHJvdmlkZUlucHV0KEF1ZGlvQnVzKiBhdWRpb19idXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGEgYnVmZmVyX2RlbGF5KSB7Ci0gIFJlbmRlcihhdWRpb19idXMsIGJ1ZmZlcl9kZWxheS5Jbk1pbGxpc2Vjb25kcygpKTsKLSAgcmV0dXJuIHZvbHVtZV87Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvZmFrZV9hdWRpb19yZW5kZXJfY2FsbGJhY2suaCBiL3NyYy9tZWRpYS9iYXNlL2Zha2VfYXVkaW9fcmVuZGVyX2NhbGxiYWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMThjOTkuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvZmFrZV9hdWRpb19yZW5kZXJfY2FsbGJhY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfQkFTRV9GQUtFX0FVRElPX1JFTkRFUl9DQUxMQkFDS19IXwotI2RlZmluZSBNRURJQV9CQVNFX0ZBS0VfQVVESU9fUkVOREVSX0NBTExCQUNLX0hfCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2NvbnZlcnRlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fcmVuZGVyZXJfc2luay5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBGYWtlIFJlbmRlckNhbGxiYWNrIHdoaWNoIHdpbGwgZmlsbCBlYWNoIHJlcXVlc3Qgd2l0aCBhIHNpbmUgd2F2ZS4gIFNpbmUKLS8vIHN0YXRlIGlzIGtlcHQgYWNyb3NzIGNhbGxiYWNrcy4gIFN0YXRlIGNhbiBiZSByZXNldCB0byBkZWZhdWx0IHZpYSByZXNldCgpLgotLy8gQWxzbyBwcm92aWRlIGFuIGludGVyZmFjZSB0byBBdWRpb1RyYW5zZm9ybUlucHV0LgotY2xhc3MgRmFrZUF1ZGlvUmVuZGVyQ2FsbGJhY2sKLSAgICA6IHB1YmxpYyBBdWRpb1JlbmRlcmVyU2luazo6UmVuZGVyQ2FsbGJhY2ssCi0gICAgICBwdWJsaWMgQXVkaW9Db252ZXJ0ZXI6OklucHV0Q2FsbGJhY2sgewotIHB1YmxpYzoKLSAgLy8gVGhlIGZ1bmN0aW9uIHVzZWQgdG8gZnVsZmlsbCBSZW5kZXIoKSBpcyBmKHgpID0gc2luKDIgKiBQSSAqIHggKiB8c3RlcHwpLAotICAvLyB3aGVyZSB4ID0gW3xudW1iZXJfb2ZfZnJhbWVzfCAqIG0sIHxudW1iZXJfb2ZfZnJhbWVzfCAqIChtICsgMSldIGFuZCBtID0KLSAgLy8gdGhlIG51bWJlciBvZiBSZW5kZXIoKSBjYWxscyBmdWxmaWxsZWQgdGh1cyBmYXIuCi0gIGV4cGxpY2l0IEZha2VBdWRpb1JlbmRlckNhbGxiYWNrKGRvdWJsZSBzdGVwKTsKLSAgdmlydHVhbCB+RmFrZUF1ZGlvUmVuZGVyQ2FsbGJhY2soKTsKLQotICAvLyBSZW5kZXJzIGEgc2luZSB3YXZlIGludG8gdGhlIHByb3ZpZGVkIGF1ZGlvIGRhdGEgYnVmZmVyLiAgSWYgfGhhbGZfZmlsbF98Ci0gIC8vIGlzIHNldCwgd2lsbCBvbmx5IGZpbGwgaGFsZiB0aGUgYnVmZmVyLgotICB2aXJ0dWFsIGludCBSZW5kZXIoQXVkaW9CdXMqIGF1ZGlvX2J1cywKLSAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb19kZWxheV9taWxsaXNlY29uZHMpIE9WRVJSSURFOwotICBNT0NLX01FVEhPRDAoT25SZW5kZXJFcnJvciwgdm9pZCgpKTsKLQotICAvLyBBdWRpb1RyYW5zZm9ybTo6UHJvdmlkZUF1ZGlvVHJhbnNmb3JtSW5wdXQgaW1wbGVtZW50YXRpb24uCi0gIHZpcnR1YWwgZG91YmxlIFByb3ZpZGVJbnB1dChBdWRpb0J1cyogYXVkaW9fYnVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhIGJ1ZmZlcl9kZWxheSkgT1ZFUlJJREU7Ci0KLSAgLy8gVG9nZ2xlcyBvbmx5IGZpbGxpbmcgaGFsZiB0aGUgcmVxdWVzdGVkIGFtb3VudCBkdXJpbmcgUmVuZGVyKCkuCi0gIHZvaWQgc2V0X2hhbGZfZmlsbChib29sIGhhbGZfZmlsbCkgeyBoYWxmX2ZpbGxfID0gaGFsZl9maWxsOyB9Ci0KLSAgLy8gUmVzZXQgdGhlIHNpbmUgc3RhdGUgdG8gaW5pdGlhbCB2YWx1ZS4KLSAgdm9pZCByZXNldCgpIHsgeF8gPSAwOyB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgbGFzdCB8YXVkaW9fZGVsYXlfbWlsbGlzZWNvbmRzfCBwcm92aWRlZCB0byBSZW5kZXIoKSBvciAtMSBpZgotICAvLyBubyBSZW5kZXIoKSBjYWxsIG9jY3VycmVkLgotICBpbnQgbGFzdF9hdWRpb19kZWxheV9taWxsaXNlY29uZHMoKSB7IHJldHVybiBsYXN0X2F1ZGlvX2RlbGF5X21pbGxpc2Vjb25kc187IH0KLQotICAvLyBTZXQgdm9sdW1lIGluZm9ybWF0aW9uIHVzZWQgYnkgUHJvdmlkZUF1ZGlvVHJhbnNmb3JtSW5wdXQoKS4KLSAgdm9pZCBzZXRfdm9sdW1lKGRvdWJsZSB2b2x1bWUpIHsgdm9sdW1lXyA9IHZvbHVtZTsgfQotCi0gcHJpdmF0ZToKLSAgYm9vbCBoYWxmX2ZpbGxfOwotICBkb3VibGUgeF87Ci0gIGRvdWJsZSBzdGVwXzsKLSAgaW50IGxhc3RfYXVkaW9fZGVsYXlfbWlsbGlzZWNvbmRzXzsKLSAgZG91YmxlIHZvbHVtZV87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEZha2VBdWRpb1JlbmRlckNhbGxiYWNrKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0JBU0VfRkFLRV9BVURJT19SRU5ERVJfQ0FMTEJBQ0tfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2ZpbHRlcl9jb2xsZWN0aW9uLmNjIGIvc3JjL21lZGlhL2Jhc2UvZmlsdGVyX2NvbGxlY3Rpb24uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MmE2MWIuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvZmlsdGVyX2NvbGxlY3Rpb24uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9maWx0ZXJfY29sbGVjdGlvbi5oIgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19kZWNvZGVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19yZW5kZXJlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVtdXhlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fZGVjb2Rlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fcmVuZGVyZXIuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotRmlsdGVyQ29sbGVjdGlvbjo6RmlsdGVyQ29sbGVjdGlvbigpIHt9Ci0KLUZpbHRlckNvbGxlY3Rpb246On5GaWx0ZXJDb2xsZWN0aW9uKCkge30KLQotdm9pZCBGaWx0ZXJDb2xsZWN0aW9uOjpTZXREZW11eGVyKGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVtdXhlcj4mIGRlbXV4ZXIpIHsKLSAgZGVtdXhlcl8gPSBkZW11eGVyOwotfQotCi1jb25zdCBzY29wZWRfcmVmcHRyPERlbXV4ZXI+JiBGaWx0ZXJDb2xsZWN0aW9uOjpHZXREZW11eGVyKCkgewotICByZXR1cm4gZGVtdXhlcl87Ci19Ci0KLXZvaWQgRmlsdGVyQ29sbGVjdGlvbjo6QWRkQXVkaW9SZW5kZXJlcihBdWRpb1JlbmRlcmVyKiBhdWRpb19yZW5kZXJlcikgewotICBhdWRpb19yZW5kZXJlcnNfLnB1c2hfYmFjayhhdWRpb19yZW5kZXJlcik7Ci19Ci0KLXZvaWQgRmlsdGVyQ29sbGVjdGlvbjo6QWRkVmlkZW9SZW5kZXJlcihWaWRlb1JlbmRlcmVyKiB2aWRlb19yZW5kZXJlcikgewotICB2aWRlb19yZW5kZXJlcnNfLnB1c2hfYmFjayh2aWRlb19yZW5kZXJlcik7Ci19Ci0KLXZvaWQgRmlsdGVyQ29sbGVjdGlvbjo6Q2xlYXIoKSB7Ci0gIGF1ZGlvX2RlY29kZXJzXy5jbGVhcigpOwotICB2aWRlb19kZWNvZGVyc18uY2xlYXIoKTsKLSAgYXVkaW9fcmVuZGVyZXJzXy5jbGVhcigpOwotICB2aWRlb19yZW5kZXJlcnNfLmNsZWFyKCk7Ci19Ci0KLXZvaWQgRmlsdGVyQ29sbGVjdGlvbjo6U2VsZWN0QXVkaW9SZW5kZXJlcihzY29wZWRfcmVmcHRyPEF1ZGlvUmVuZGVyZXI+KiBvdXQpIHsKLSAgaWYgKGF1ZGlvX3JlbmRlcmVyc18uZW1wdHkoKSkgewotICAgICpvdXQgPSBOVUxMOwotICAgIHJldHVybjsKLSAgfQotICAqb3V0ID0gYXVkaW9fcmVuZGVyZXJzXy5mcm9udCgpOwotICBhdWRpb19yZW5kZXJlcnNfLnBvcF9mcm9udCgpOwotfQotCi12b2lkIEZpbHRlckNvbGxlY3Rpb246OlNlbGVjdFZpZGVvUmVuZGVyZXIoc2NvcGVkX3JlZnB0cjxWaWRlb1JlbmRlcmVyPiogb3V0KSB7Ci0gIGlmICh2aWRlb19yZW5kZXJlcnNfLmVtcHR5KCkpIHsKLSAgICAqb3V0ID0gTlVMTDsKLSAgICByZXR1cm47Ci0gIH0KLSAgKm91dCA9IHZpZGVvX3JlbmRlcmVyc18uZnJvbnQoKTsKLSAgdmlkZW9fcmVuZGVyZXJzXy5wb3BfZnJvbnQoKTsKLX0KLQotRmlsdGVyQ29sbGVjdGlvbjo6QXVkaW9EZWNvZGVyTGlzdCogRmlsdGVyQ29sbGVjdGlvbjo6R2V0QXVkaW9EZWNvZGVycygpIHsKLSAgcmV0dXJuICZhdWRpb19kZWNvZGVyc187Ci19Ci0KLUZpbHRlckNvbGxlY3Rpb246OlZpZGVvRGVjb2Rlckxpc3QqIEZpbHRlckNvbGxlY3Rpb246OkdldFZpZGVvRGVjb2RlcnMoKSB7Ci0gIHJldHVybiAmdmlkZW9fZGVjb2RlcnNfOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2ZpbHRlcl9jb2xsZWN0aW9uLmggYi9zcmMvbWVkaWEvYmFzZS9maWx0ZXJfY29sbGVjdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWYyYmU1Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL2ZpbHRlcl9jb2xsZWN0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0JBU0VfRklMVEVSX0NPTExFQ1RJT05fSF8KLSNkZWZpbmUgTUVESUFfQkFTRV9GSUxURVJfQ09MTEVDVElPTl9IXwotCi0jaW5jbHVkZSA8bGlzdD4KLQotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgQXVkaW9EZWNvZGVyOwotY2xhc3MgQXVkaW9SZW5kZXJlcjsKLWNsYXNzIERlbXV4ZXI7Ci1jbGFzcyBWaWRlb0RlY29kZXI7Ci1jbGFzcyBWaWRlb1JlbmRlcmVyOwotCi0vLyBSZXByZXNlbnRzIGEgc2V0IG9mIHVuaW5pdGlhbGl6ZWQgZGVtdXhlciBhbmQgYXVkaW8vdmlkZW8gZGVjb2RlcnMgYW5kCi0vLyByZW5kZXJlcnMuIFVzZWQgdG8gc3RhcnQgYSBQaXBlbGluZSBvYmplY3QgZm9yIG1lZGlhIHBsYXliYWNrLgotLy8KLS8vIFRPRE8oc2NoZXJrdXMpOiBSZXBsYWNlIEZpbHRlckNvbGxlY3Rpb24gd2l0aCBzb21ldGhpbmcgc2Vuc2libGUsIHNlZQotLy8gaHR0cDovL2NyYnVnLmNvbS8xMTA4MDAKLWNsYXNzIE1FRElBX0VYUE9SVCBGaWx0ZXJDb2xsZWN0aW9uIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgc3RkOjpsaXN0PHNjb3BlZF9yZWZwdHI8QXVkaW9EZWNvZGVyPiA+IEF1ZGlvRGVjb2Rlckxpc3Q7Ci0gIHR5cGVkZWYgc3RkOjpsaXN0PHNjb3BlZF9yZWZwdHI8VmlkZW9EZWNvZGVyPiA+IFZpZGVvRGVjb2Rlckxpc3Q7Ci0KLSAgRmlsdGVyQ29sbGVjdGlvbigpOwotICB+RmlsdGVyQ29sbGVjdGlvbigpOwotCi0gIC8vIERlbXV4ZXIgYWNjZXNzb3IgbWV0aG9kcy4KLSAgdm9pZCBTZXREZW11eGVyKGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVtdXhlcj4mIGRlbXV4ZXIpOwotICBjb25zdCBzY29wZWRfcmVmcHRyPERlbXV4ZXI+JiBHZXREZW11eGVyKCk7Ci0KLSAgLy8gQWRkcyBhIGZpbHRlciB0byB0aGUgY29sbGVjdGlvbi4KLSAgdm9pZCBBZGRBdWRpb0RlY29kZXIoQXVkaW9EZWNvZGVyKiBhdWRpb19kZWNvZGVyKTsKLSAgdm9pZCBBZGRBdWRpb1JlbmRlcmVyKEF1ZGlvUmVuZGVyZXIqIGF1ZGlvX3JlbmRlcmVyKTsKLSAgdm9pZCBBZGRWaWRlb1JlbmRlcmVyKFZpZGVvUmVuZGVyZXIqIHZpZGVvX3JlbmRlcmVyKTsKLQotICAvLyBSZW1vdmUgcmVtYWluaW5nIGZpbHRlcnMuCi0gIHZvaWQgQ2xlYXIoKTsKLQotICAvLyBTZWxlY3RzIGEgZmlsdGVyIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBmcm9tIHRoZSBjb2xsZWN0aW9uLgotICAvLyBJZiB0aGUgcmVxdWlyZWQgZmlsdGVyIGNhbm5vdCBiZSBmb3VuZCwgTlVMTCBpcyByZXR1cm5lZC4KLSAgLy8gSWYgYSBmaWx0ZXIgaXMgcmV0dXJuZWQgaXQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBjb2xsZWN0aW9uLgotICAvLyBGaWx0ZXJzIGFyZSBzZWxlY3RlZCBpbiBGSUZPIG9yZGVyLgotICB2b2lkIFNlbGVjdEF1ZGlvUmVuZGVyZXIoc2NvcGVkX3JlZnB0cjxBdWRpb1JlbmRlcmVyPiogb3V0KTsKLSAgdm9pZCBTZWxlY3RWaWRlb1JlbmRlcmVyKHNjb3BlZF9yZWZwdHI8VmlkZW9SZW5kZXJlcj4qIG91dCk7Ci0KLSAgQXVkaW9EZWNvZGVyTGlzdCogR2V0QXVkaW9EZWNvZGVycygpOwotICBWaWRlb0RlY29kZXJMaXN0KiBHZXRWaWRlb0RlY29kZXJzKCk7Ci0KLSBwcml2YXRlOgotICBzY29wZWRfcmVmcHRyPERlbXV4ZXI+IGRlbXV4ZXJfOwotICBBdWRpb0RlY29kZXJMaXN0IGF1ZGlvX2RlY29kZXJzXzsKLSAgVmlkZW9EZWNvZGVyTGlzdCB2aWRlb19kZWNvZGVyc187Ci0gIHN0ZDo6bGlzdDxzY29wZWRfcmVmcHRyPEF1ZGlvUmVuZGVyZXI+ID4gYXVkaW9fcmVuZGVyZXJzXzsKLSAgc3RkOjpsaXN0PHNjb3BlZF9yZWZwdHI8VmlkZW9SZW5kZXJlcj4gPiB2aWRlb19yZW5kZXJlcnNfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihGaWx0ZXJDb2xsZWN0aW9uKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0JBU0VfRklMVEVSX0NPTExFQ1RJT05fSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2ZpbHRlcl9jb2xsZWN0aW9uX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2Jhc2UvZmlsdGVyX2NvbGxlY3Rpb25fdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZmRkNzAuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvZmlsdGVyX2NvbGxlY3Rpb25fdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9maWx0ZXJfY29sbGVjdGlvbi5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbW9ja19maWx0ZXJzLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIEZpbHRlckNvbGxlY3Rpb25UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICBGaWx0ZXJDb2xsZWN0aW9uVGVzdCgpIHt9Ci0gIHZpcnR1YWwgfkZpbHRlckNvbGxlY3Rpb25UZXN0KCkge30KLQotIHByb3RlY3RlZDoKLSAgRmlsdGVyQ29sbGVjdGlvbiBjb2xsZWN0aW9uXzsKLSAgTW9ja0ZpbHRlckNvbGxlY3Rpb24gbW9ja19maWx0ZXJzXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRmlsdGVyQ29sbGVjdGlvblRlc3QpOwotfTsKLQotVEVTVF9GKEZpbHRlckNvbGxlY3Rpb25UZXN0LCBTZWxlY3RYWFhNZXRob2RzKSB7Ci0gIHNjb3BlZF9yZWZwdHI8QXVkaW9SZW5kZXJlcj4gYXVkaW9fcmVuZGVyZXI7Ci0KLSAgY29sbGVjdGlvbl8uU2VsZWN0QXVkaW9SZW5kZXJlcigmYXVkaW9fcmVuZGVyZXIpOwotICBFWFBFQ1RfRkFMU0UoYXVkaW9fcmVuZGVyZXIpOwotCi0gIC8vIEFkZCBhbiBhdWRpbyBkZWNvZGVyLgotICBjb2xsZWN0aW9uXy5BZGRBdWRpb1JlbmRlcmVyKG1vY2tfZmlsdGVyc18uYXVkaW9fcmVuZGVyZXIoKSk7Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgd2UgY2FuIHNlbGVjdCB0aGUgYXVkaW8gZGVjb2Rlci4KLSAgY29sbGVjdGlvbl8uU2VsZWN0QXVkaW9SZW5kZXJlcigmYXVkaW9fcmVuZGVyZXIpOwotICBFWFBFQ1RfVFJVRShhdWRpb19yZW5kZXJlcik7Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgd2UgY2FuJ3Qgc2VsZWN0IGl0IGFnYWluIHNpbmNlIG9ubHkgb25lIGhhcyBiZWVuIGFkZGVkLgotICBjb2xsZWN0aW9uXy5TZWxlY3RBdWRpb1JlbmRlcmVyKCZhdWRpb19yZW5kZXJlcik7Ci0gIEVYUEVDVF9GQUxTRShhdWRpb19yZW5kZXJlcik7Ci19Ci0KLVRFU1RfRihGaWx0ZXJDb2xsZWN0aW9uVGVzdCwgTXVsdGlwbGVGaWx0ZXJzT2ZTYW1lVHlwZSkgewotICBzY29wZWRfcmVmcHRyPEF1ZGlvUmVuZGVyZXI+IGF1ZGlvX3JlbmRlcmVyX2EobmV3IE1vY2tBdWRpb1JlbmRlcmVyKCkpOwotICBzY29wZWRfcmVmcHRyPEF1ZGlvUmVuZGVyZXI+IGF1ZGlvX3JlbmRlcmVyX2IobmV3IE1vY2tBdWRpb1JlbmRlcmVyKCkpOwotCi0gIHNjb3BlZF9yZWZwdHI8QXVkaW9SZW5kZXJlcj4gYXVkaW9fcmVuZGVyZXI7Ci0KLSAgY29sbGVjdGlvbl8uQWRkQXVkaW9SZW5kZXJlcihhdWRpb19yZW5kZXJlcl9hLmdldCgpKTsKLSAgY29sbGVjdGlvbl8uQWRkQXVkaW9SZW5kZXJlcihhdWRpb19yZW5kZXJlcl9iLmdldCgpKTsKLQotICAvLyBWZXJpZnkgdGhhdCBmaXJzdCBTZWxlY3RBdWRpb1JlbmRlcmVyKCkgcmV0dXJucyBhdWRpb19yZW5kZXJlcl9hLgotICBjb2xsZWN0aW9uXy5TZWxlY3RBdWRpb1JlbmRlcmVyKCZhdWRpb19yZW5kZXJlcik7Ci0gIEVYUEVDVF9UUlVFKGF1ZGlvX3JlbmRlcmVyKTsKLSAgRVhQRUNUX0VRKGF1ZGlvX3JlbmRlcmVyLCBhdWRpb19yZW5kZXJlcl9hKTsKLQotICAvLyBWZXJpZnkgdGhhdCBzZWNvbmQgU2VsZWN0QXVkaW9SZW5kZXJlcigpIHJldHVybnMgYXVkaW9fcmVuZGVyZXJfYi4KLSAgY29sbGVjdGlvbl8uU2VsZWN0QXVkaW9SZW5kZXJlcigmYXVkaW9fcmVuZGVyZXIpOwotICBFWFBFQ1RfVFJVRShhdWRpb19yZW5kZXJlcik7Ci0gIEVYUEVDVF9FUShhdWRpb19yZW5kZXJlciwgYXVkaW9fcmVuZGVyZXJfYik7Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgdGhpcmQgU2VsZWN0QXVkaW9SZW5kZXJlcigpIHJldHVybnMgbm90aGluZy4KLSAgY29sbGVjdGlvbl8uU2VsZWN0QXVkaW9SZW5kZXJlcigmYXVkaW9fcmVuZGVyZXIpOwotICBFWFBFQ1RfRkFMU0UoYXVkaW9fcmVuZGVyZXIpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2dmeF9leHBvcnQuaCBiL3NyYy9tZWRpYS9iYXNlL2dmeF9leHBvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEwNjc0Ny4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9nZnhfZXhwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIENPQkFMVF9NRURJQV9CQVNFX0dGWF9FWFBPUlRfSF8KLSNkZWZpbmUgQ09CQUxUX01FRElBX0JBU0VfR0ZYX0VYUE9SVF9IXwotCi0jaWYgZGVmaW5lZChDT01QT05FTlRfQlVJTEQpCi0jaWYgZGVmaW5lZChXSU4zMikKLQotI2lmIGRlZmluZWQoR0ZYX0lNUExFTUVOVEFUSU9OKQotI2RlZmluZSBHRlhfRVhQT1JUIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotI2Vsc2UKLSNkZWZpbmUgR0ZYX0VYUE9SVCBfX2RlY2xzcGVjKGRsbGltcG9ydCkKLSNlbmRpZiAgLy8gZGVmaW5lZChHRlhfSU1QTEVNRU5UQVRJT04pCi0KLSNlbHNlICAvLyBkZWZpbmVkKFdJTjMyKQotI2lmIGRlZmluZWQoR0ZYX0lNUExFTUVOVEFUSU9OKQotI2RlZmluZSBHRlhfRVhQT1JUIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCi0jZWxzZQotI2RlZmluZSBHRlhfRVhQT1JUCi0jZW5kaWYKLSNlbmRpZgotCi0jZWxzZSAgLy8gZGVmaW5lZChDT01QT05FTlRfQlVJTEQpCi0jZGVmaW5lIEdGWF9FWFBPUlQKLSNlbmRpZgotCi0jZW5kaWYgIC8vIENPQkFMVF9NRURJQV9CQVNFX0dGWF9FWFBPUlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2dtb2NrX2NhbGxiYWNrX3N1cHBvcnQuaCBiL3NyYy9tZWRpYS9iYXNlL2dtb2NrX2NhbGxiYWNrX3N1cHBvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJmNGMxMC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9nbW9ja19jYWxsYmFja19zdXBwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9CQVNFX0dNT0NLX0NBTExCQUNLX1NVUFBPUlRfSF8KLSNkZWZpbmUgTUVESUFfQkFTRV9HTU9DS19DQUxMQkFDS19TVVBQT1JUX0hfCi0KLSNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gTWF0Y2hlcnMgZm9yIGJhc2U6OkNhbGxiYWNrIGFuZCBiYXNlOjpDbG9zdXJlLgotCi1NQVRDSEVSKElzTnVsbENhbGxiYWNrLCAiYSBudWxsIGNhbGxiYWNrIikgewotICByZXR1cm4gKGFyZy5pc19udWxsKCkpOwotfQotCi1NQVRDSEVSKElzTm90TnVsbENhbGxiYWNrLCAiYSBub24tbnVsbCBjYWxsYmFjayIpIHsKLSAgcmV0dXJuICghYXJnLmlzX251bGwoKSk7Ci19Ci0KLS8vIFRoZSBSdW5DbG9zdXJlPE4+KCkgYWN0aW9uIGludm9rZXMgUnVuKCkgbWV0aG9kIG9uIHRoZSBOLXRoICgwLWJhc2VkKQotLy8gYXJndW1lbnQgb2YgdGhlIG1vY2sgZnVuY3Rpb24uCi0KLUFDVElPTl9URU1QTEFURShSdW5DbG9zdXJlLAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAotICAgICAgICAgICAgICAgIEFORF8wX1ZBTFVFX1BBUkFNUygpKSB7Ci0gIDo6c3RkOjp0cjE6OmdldDxrPihhcmdzKS5SdW4oKTsKLX0KLQotLy8gVmFyaW91cyBvdmVybG9hZHMgZm9yIFJ1bkNhbGxiYWNrPE4+KCkuCi0vLwotLy8gVGhlIFJ1bkNhbGxiYWNrPE4+KHAxLCBwMiwgLi4uLCBwX2spIGFjdGlvbiBpbnZva2VzIFJ1bigpIG1ldGhvZCBvbiB0aGUgTi10aAotLy8gKDAtYmFzZWQpIGFyZ3VtZW50IG9mIHRoZSBtb2NrIGZ1bmN0aW9uLCB3aXRoIGFyZ3VtZW50cyBwMSwgcDIsIC4uLiwgcF9rLgotLy8KLS8vIE5vdGVzOgotLy8KLS8vICAgMS4gVGhlIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGJ5IHZhbHVlIGJ5IGRlZmF1bHQuICBJZiB5b3UgbmVlZCB0bwotLy8gICBwYXNzIGFuIGFyZ3VtZW50IGJ5IHJlZmVyZW5jZSwgd3JhcCBpdCBpbnNpZGUgQnlSZWYoKS4gIEZvciBleGFtcGxlLAotLy8KLS8vICAgICBSdW5DYWxsYmFjazwxPig1LCBzdHJpbmcoIkhlbGxvIiksIEJ5UmVmKGZvbykpCi0vLwotLy8gICBwYXNzZXMgNSBhbmQgc3RyaW5nKCJIZWxsbyIpIGJ5IHZhbHVlLCBhbmQgcGFzc2VzIGZvbyBieSByZWZlcmVuY2UuCi0vLwotLy8gICAyLiBJZiB0aGUgY2FsbGJhY2sgdGFrZXMgYW4gYXJndW1lbnQgYnkgcmVmZXJlbmNlIGJ1dCBCeVJlZigpIGlzCi0vLyAgIG5vdCB1c2VkLCBpdCB3aWxsIHJlY2VpdmUgdGhlIHJlZmVyZW5jZSB0byBhIGNvcHkgb2YgdGhlIHZhbHVlLAotLy8gICBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCB2YWx1ZS4gIEZvciBleGFtcGxlLCB3aGVuIHRoZSAwLXRoCi0vLyAgIGFyZ3VtZW50IG9mIHRoZSBjYWxsYmFjayB0YWtlcyBhIGNvbnN0IHN0cmluZyYsIHRoZSBhY3Rpb24KLS8vCi0vLyAgICAgUnVuQ2FsbGJhY2s8MD4oc3RyaW5nKCJIZWxsbyIpKQotLy8KLS8vICAgbWFrZXMgYSBjb3B5IG9mIHRoZSB0ZW1wb3Jhcnkgc3RyaW5nKCJIZWxsbyIpIG9iamVjdCBhbmQgcGFzc2VzIGEKLS8vICAgcmVmZXJlbmNlIG9mIHRoZSBjb3B5LCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCB0ZW1wb3Jhcnkgb2JqZWN0LAotLy8gICB0byB0aGUgY2FsbGJhY2suICBUaGlzIG1ha2VzIGl0IGVhc3kgZm9yIGEgdXNlciB0byBkZWZpbmUgYW4KLS8vICAgUnVuQ2FsbGJhY2sgYWN0aW9uIGZyb20gdGVtcG9yYXJ5IHZhbHVlcyBhbmQgaGF2ZSBpdCBwZXJmb3JtZWQgbGF0ZXIuCi0KLUFDVElPTl9URU1QTEFURShSdW5DYWxsYmFjaywKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKLSAgICAgICAgICAgICAgICBBTkRfMF9WQUxVRV9QQVJBTVMoKSkgewotICByZXR1cm4gOjpzdGQ6OnRyMTo6Z2V0PGs+KGFyZ3MpLlJ1bigpOwotfQotCi1BQ1RJT05fVEVNUExBVEUoUnVuQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksCi0gICAgICAgICAgICAgICAgQU5EXzFfVkFMVUVfUEFSQU1TKHAwKSkgewotICByZXR1cm4gOjpzdGQ6OnRyMTo6Z2V0PGs+KGFyZ3MpLlJ1bihwMCk7Ci19Ci0KLUFDVElPTl9URU1QTEFURShSdW5DYWxsYmFjaywKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKLSAgICAgICAgICAgICAgICBBTkRfMl9WQUxVRV9QQVJBTVMocDAsIHAxKSkgewotICByZXR1cm4gOjpzdGQ6OnRyMTo6Z2V0PGs+KGFyZ3MpLlJ1bihwMCwgcDEpOwotfQotCi1BQ1RJT05fVEVNUExBVEUoUnVuQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksCi0gICAgICAgICAgICAgICAgQU5EXzNfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIpKSB7Ci0gIHJldHVybiA6OnN0ZDo6dHIxOjpnZXQ8az4oYXJncykuUnVuKHAwLCBwMSwgcDIpOwotfQotCi1BQ1RJT05fVEVNUExBVEUoUnVuQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksCi0gICAgICAgICAgICAgICAgQU5EXzRfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzKSkgewotICByZXR1cm4gOjpzdGQ6OnRyMTo6Z2V0PGs+KGFyZ3MpLlJ1bihwMCwgcDEsIHAyLCBwMyk7Ci19Ci0KLUFDVElPTl9URU1QTEFURShSdW5DYWxsYmFjaywKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKLSAgICAgICAgICAgICAgICBBTkRfNV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0KSkgewotICByZXR1cm4gOjpzdGQ6OnRyMTo6Z2V0PGs+KGFyZ3MpLlJ1bihwMCwgcDEsIHAyLCBwMywgcDQpOwotfQotCi1BQ1RJT05fVEVNUExBVEUoUnVuQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksCi0gICAgICAgICAgICAgICAgQU5EXzZfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpKSB7Ci0gIHJldHVybiA6OnN0ZDo6dHIxOjpnZXQ8az4oYXJncykuUnVuKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpOwotfQotCi1BQ1RJT05fVEVNUExBVEUoUnVuQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksCi0gICAgICAgICAgICAgICAgQU5EXzdfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2KSkgewotICByZXR1cm4gOjpzdGQ6OnRyMTo6Z2V0PGs+KGFyZ3MpLlJ1bihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0JBU0VfR01PQ0tfQ0FMTEJBQ0tfU1VQUE9SVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvZ21vY2tfY2FsbGJhY2tfc3VwcG9ydF91bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9iYXNlL2dtb2NrX2NhbGxiYWNrX3N1cHBvcnRfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMWJlYjkuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvZ21vY2tfY2FsbGJhY2tfc3VwcG9ydF91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL2dtb2NrX2NhbGxiYWNrX3N1cHBvcnQuaCIKLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgdGVzdGluZzo6QnlSZWY7Ci11c2luZyB0ZXN0aW5nOjpNb2NrRnVuY3Rpb247Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLXR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZChjb25zdCBib29sJiBzcmMsIGJvb2wqIGRzdCk+IFRlc3RDYWxsYmFjazsKLQotdm9pZCBTZXRCb29sKGNvbnN0IGJvb2wmIHNyYywgYm9vbCogZHN0KSB7Ci0gICpkc3QgPSBzcmM7Ci19Ci0KLVRFU1QoR21vY2tDYWxsYmFja1N1cHBvcnRUZXN0LCBJc051bGxDYWxsYmFjaykgewotICBNb2NrRnVuY3Rpb248dm9pZChjb25zdCBUZXN0Q2FsbGJhY2smKT4gY2hlY2s7Ci0gIEVYUEVDVF9DQUxMKGNoZWNrLCBDYWxsKElzTnVsbENhbGxiYWNrKCkpKTsKLSAgY2hlY2suQ2FsbChUZXN0Q2FsbGJhY2soKSk7Ci19Ci0KLVRFU1QoR21vY2tDYWxsYmFja1N1cHBvcnRUZXN0LCBJc05vdE51bGxDYWxsYmFjaykgewotICBNb2NrRnVuY3Rpb248dm9pZChjb25zdCBUZXN0Q2FsbGJhY2smKT4gY2hlY2s7Ci0gIEVYUEVDVF9DQUxMKGNoZWNrLCBDYWxsKElzTm90TnVsbENhbGxiYWNrKCkpKTsKLSAgY2hlY2suQ2FsbChiYXNlOjpCaW5kKCZTZXRCb29sKSk7Ci19Ci0KLVRFU1QoR21vY2tDYWxsYmFja1N1cHBvcnRUZXN0LCBSdW5DbG9zdXJlKSB7Ci0gIE1vY2tGdW5jdGlvbjx2b2lkKGNvbnN0IGJhc2U6OkNsb3N1cmUmKT4gY2hlY2s7Ci0gIGJvb2wgZHN0ID0gZmFsc2U7Ci0gIEVYUEVDVF9DQUxMKGNoZWNrLCBDYWxsKElzTm90TnVsbENhbGxiYWNrKCkpKQotICAgICAgLldpbGxPbmNlKFJ1bkNsb3N1cmU8MD4oKSk7Ci0gIGNoZWNrLkNhbGwoYmFzZTo6QmluZCgmU2V0Qm9vbCwgdHJ1ZSwgJmRzdCkpOwotICBFWFBFQ1RfVFJVRShkc3QpOwotfQotCi1URVNUKEdtb2NrQ2FsbGJhY2tTdXBwb3J0VGVzdCwgUnVuQ2FsbGJhY2swKSB7Ci0gIE1vY2tGdW5jdGlvbjx2b2lkKGNvbnN0IFRlc3RDYWxsYmFjayYpPiBjaGVjazsKLSAgYm9vbCBkc3QgPSBmYWxzZTsKLSAgRVhQRUNUX0NBTEwoY2hlY2ssIENhbGwoSXNOb3ROdWxsQ2FsbGJhY2soKSkpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MD4odHJ1ZSwgJmRzdCkpOwotICBjaGVjay5DYWxsKGJhc2U6OkJpbmQoJlNldEJvb2wpKTsKLSAgRVhQRUNUX1RSVUUoZHN0KTsKLX0KLQotVEVTVChHbW9ja0NhbGxiYWNrU3VwcG9ydFRlc3QsIFJ1bkNhbGxiYWNrMSkgewotICBNb2NrRnVuY3Rpb248dm9pZChpbnQsIGNvbnN0IFRlc3RDYWxsYmFjayYpPiBjaGVjazsKLSAgYm9vbCBkc3QgPSBmYWxzZTsKLSAgRVhQRUNUX0NBTEwoY2hlY2ssIENhbGwoMCwgSXNOb3ROdWxsQ2FsbGJhY2soKSkpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MT4odHJ1ZSwgJmRzdCkpOwotICBjaGVjay5DYWxsKDAsIGJhc2U6OkJpbmQoJlNldEJvb2wpKTsKLSAgRVhQRUNUX1RSVUUoZHN0KTsKLX0KLQotVEVTVChHbW9ja0NhbGxiYWNrU3VwcG9ydFRlc3QsIFJ1bkNhbGxiYWNrUGFzc0J5UmVmKSB7Ci0gIE1vY2tGdW5jdGlvbjx2b2lkKGNvbnN0IFRlc3RDYWxsYmFjayYpPiBjaGVjazsKLSAgYm9vbCBkc3QgPSBmYWxzZTsKLSAgYm9vbCBzcmMgPSBmYWxzZTsKLSAgRVhQRUNUX0NBTEwoY2hlY2ssIENhbGwoSXNOb3ROdWxsQ2FsbGJhY2soKSkpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MD4oQnlSZWYoc3JjKSwgJmRzdCkpOwotICBzcmMgPSB0cnVlOwotICBjaGVjay5DYWxsKGJhc2U6OkJpbmQoJlNldEJvb2wpKTsKLSAgRVhQRUNUX1RSVUUoZHN0KTsKLX0KLQotVEVTVChHbW9ja0NhbGxiYWNrU3VwcG9ydFRlc3QsIFJ1bkNhbGxiYWNrUGFzc0J5VmFsdWUpIHsKLSAgTW9ja0Z1bmN0aW9uPHZvaWQoY29uc3QgVGVzdENhbGxiYWNrJik+IGNoZWNrOwotICBib29sIGRzdCA9IGZhbHNlOwotICBib29sIHNyYyA9IHRydWU7Ci0gIEVYUEVDVF9DQUxMKGNoZWNrLCBDYWxsKElzTm90TnVsbENhbGxiYWNrKCkpKQotICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrPDA+KHNyYywgJmRzdCkpOwotICBzcmMgPSBmYWxzZTsKLSAgY2hlY2suQ2FsbChiYXNlOjpCaW5kKCZTZXRCb29sKSk7Ci0gIEVYUEVDVF9UUlVFKGRzdCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvaGRyX21ldGFkYXRhLmNjIGIvc3JjL21lZGlhL2Jhc2UvaGRyX21ldGFkYXRhLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGRjZDU3Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL2hkcl9tZXRhZGF0YS5jYworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvaGRyX21ldGFkYXRhLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLU1hc3RlcmluZ01ldGFkYXRhOjpNYXN0ZXJpbmdNZXRhZGF0YSgpIHsKLSAgcHJpbWFyeV9yX2Nocm9tYXRpY2l0eV94ID0gMDsKLSAgcHJpbWFyeV9yX2Nocm9tYXRpY2l0eV95ID0gMDsKLSAgcHJpbWFyeV9nX2Nocm9tYXRpY2l0eV94ID0gMDsKLSAgcHJpbWFyeV9nX2Nocm9tYXRpY2l0eV95ID0gMDsKLSAgcHJpbWFyeV9iX2Nocm9tYXRpY2l0eV94ID0gMDsKLSAgcHJpbWFyeV9iX2Nocm9tYXRpY2l0eV95ID0gMDsKLSAgd2hpdGVfcG9pbnRfY2hyb21hdGljaXR5X3ggPSAwOwotICB3aGl0ZV9wb2ludF9jaHJvbWF0aWNpdHlfeSA9IDA7Ci0gIGx1bWluYW5jZV9tYXggPSAwOwotICBsdW1pbmFuY2VfbWluID0gMDsKLX0KLQotSERSTWV0YWRhdGE6OkhEUk1ldGFkYXRhKCkgewotICBtYXhfY2xsID0gMDsKLSAgbWF4X2ZhbGwgPSAwOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2hkcl9tZXRhZGF0YS5oIGIvc3JjL21lZGlhL2Jhc2UvaGRyX21ldGFkYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMjE5NzIuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvaGRyX21ldGFkYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfQkFTRV9IRFJfTUVUQURBVEFfSF8KLSNkZWZpbmUgTUVESUFfQkFTRV9IRFJfTUVUQURBVEFfSF8KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvY29sb3Jfc3BhY2UuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBTTVBURSBTVCAyMDg2IG1hc3RlcmluZyBtZXRhZGF0YS4KLXN0cnVjdCBNRURJQV9FWFBPUlQgTWFzdGVyaW5nTWV0YWRhdGEgewotICBmbG9hdCBwcmltYXJ5X3JfY2hyb21hdGljaXR5X3g7Ci0gIGZsb2F0IHByaW1hcnlfcl9jaHJvbWF0aWNpdHlfeTsKLSAgZmxvYXQgcHJpbWFyeV9nX2Nocm9tYXRpY2l0eV94OwotICBmbG9hdCBwcmltYXJ5X2dfY2hyb21hdGljaXR5X3k7Ci0gIGZsb2F0IHByaW1hcnlfYl9jaHJvbWF0aWNpdHlfeDsKLSAgZmxvYXQgcHJpbWFyeV9iX2Nocm9tYXRpY2l0eV95OwotICBmbG9hdCB3aGl0ZV9wb2ludF9jaHJvbWF0aWNpdHlfeDsKLSAgZmxvYXQgd2hpdGVfcG9pbnRfY2hyb21hdGljaXR5X3k7Ci0gIGZsb2F0IGx1bWluYW5jZV9tYXg7Ci0gIGZsb2F0IGx1bWluYW5jZV9taW47Ci0KLSAgTWFzdGVyaW5nTWV0YWRhdGEoKTsKLQotICBib29sIG9wZXJhdG9yPT0oY29uc3QgTWFzdGVyaW5nTWV0YWRhdGEmIHJocykgY29uc3QgewotICAgIHJldHVybiAoKHByaW1hcnlfcl9jaHJvbWF0aWNpdHlfeCA9PSByaHMucHJpbWFyeV9yX2Nocm9tYXRpY2l0eV94KSAmJgotICAgICAgICAgICAgKHByaW1hcnlfcl9jaHJvbWF0aWNpdHlfeSA9PSByaHMucHJpbWFyeV9yX2Nocm9tYXRpY2l0eV95KSAmJgotICAgICAgICAgICAgKHByaW1hcnlfZ19jaHJvbWF0aWNpdHlfeCA9PSByaHMucHJpbWFyeV9nX2Nocm9tYXRpY2l0eV94KSAmJgotICAgICAgICAgICAgKHByaW1hcnlfZ19jaHJvbWF0aWNpdHlfeSA9PSByaHMucHJpbWFyeV9nX2Nocm9tYXRpY2l0eV95KSAmJgotICAgICAgICAgICAgKHByaW1hcnlfYl9jaHJvbWF0aWNpdHlfeCA9PSByaHMucHJpbWFyeV9iX2Nocm9tYXRpY2l0eV94KSAmJgotICAgICAgICAgICAgKHByaW1hcnlfYl9jaHJvbWF0aWNpdHlfeSA9PSByaHMucHJpbWFyeV9iX2Nocm9tYXRpY2l0eV95KSAmJgotICAgICAgICAgICAgKHdoaXRlX3BvaW50X2Nocm9tYXRpY2l0eV94ID09IHJocy53aGl0ZV9wb2ludF9jaHJvbWF0aWNpdHlfeCkgJiYKLSAgICAgICAgICAgICh3aGl0ZV9wb2ludF9jaHJvbWF0aWNpdHlfeSA9PSByaHMud2hpdGVfcG9pbnRfY2hyb21hdGljaXR5X3kpICYmCi0gICAgICAgICAgICAobHVtaW5hbmNlX21heCA9PSByaHMubHVtaW5hbmNlX21heCkgJiYKLSAgICAgICAgICAgIChsdW1pbmFuY2VfbWluID09IHJocy5sdW1pbmFuY2VfbWluKSk7Ci0gIH0KLX07Ci0KLS8vIEhEUiBtZXRhZGF0YSBjb21tb24gZm9yIEhEUjEwIGFuZCBXZWJNL1ZQOS1iYXNlZCBIRFIgZm9ybWF0cy4KLXN0cnVjdCBNRURJQV9FWFBPUlQgSERSTWV0YWRhdGEgewotICBNYXN0ZXJpbmdNZXRhZGF0YSBtYXN0ZXJpbmdfbWV0YWRhdGE7Ci0gIHVuc2lnbmVkIGludCBtYXhfY2xsOwotICB1bnNpZ25lZCBpbnQgbWF4X2ZhbGw7Ci0KLSAgSERSTWV0YWRhdGEoKTsKLQotICBib29sIG9wZXJhdG9yPT0oY29uc3QgSERSTWV0YWRhdGEmIHJocykgY29uc3QgewotICAgIHJldHVybiAoKG1heF9jbGwgPT0gcmhzLm1heF9jbGwpICYmIChtYXhfZmFsbCA9PSByaHMubWF4X2ZhbGwpICYmCi0gICAgICAgICAgICAobWFzdGVyaW5nX21ldGFkYXRhID09IHJocy5tYXN0ZXJpbmdfbWV0YWRhdGEpKTsKLSAgfQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQkFTRV9IRFJfTUVUQURBVEFfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2ljY19wcm9maWxlLmNjIGIvc3JjL21lZGlhL2Jhc2UvaWNjX3Byb2ZpbGUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlN2I5NWQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvaWNjX3Byb2ZpbGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAidWkvZ2Z4L2ljY19wcm9maWxlLmgiCi0KLSNpbmNsdWRlIDxsaXN0PgotCi0jaW5jbHVkZSAiYmFzZS9jb250YWluZXJzL21ydV9jYWNoZS5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKLSNpbmNsdWRlICJ1aS9nZngvY29sb3JfdHJhbnNmb3JtLmgiCi0KLW5hbWVzcGFjZSBnZnggewotCi1uYW1lc3BhY2UgewotY29uc3Qgc2l6ZV90IGtNaW5Qcm9maWxlTGVuZ3RoID0gMTI4OwotY29uc3Qgc2l6ZV90IGtNYXhQcm9maWxlTGVuZ3RoID0gNCAqIDEwMjQgKiAxMDI0OwotCi0vLyBBbGxvdyBrZWVwaW5nIGFyb3VuZCBhIG1heGltdW0gb2YgOCBjYWNoZWQgSUNDIHByb2ZpbGVzLiBCZXdhcmUgdGhhdAotLy8gd2Ugd2lsbCBkbyBhIGxpbmVhciBzZWFyY2ggdGhvcnVnaCBjdXJyZW50bHktY2FjaGVkIElDQyBwcm9maWxlcywKLS8vIHdoZW4gY3JlYXRpbmcgYSBuZXcgSUNDIHByb2ZpbGUuCi1jb25zdCBzaXplX3Qga01heENhY2hlZElDQ1Byb2ZpbGVzID0gODsKLQotc3RydWN0IENhY2hlIHsKLSAgQ2FjaGUoKSA6IGlkX3RvX2ljY19wcm9maWxlX21ydShrTWF4Q2FjaGVkSUNDUHJvZmlsZXMpIHt9Ci0gIH5DYWNoZSgpIHt9Ci0KLSAgLy8gU3RhcnQgZnJvbS1JQ0MtZGF0YSBJRHMgYXQgdGhlIGVuZCBvZiB0aGUgaGFyZC1jb2RlZCBsaXN0LgotICB1aW50NjRfdCBuZXh0X3VudXNlZF9pZCA9IDU7Ci0gIGJhc2U6Ok1SVUNhY2hlPHVpbnQ2NF90LCBJQ0NQcm9maWxlPiBpZF90b19pY2NfcHJvZmlsZV9tcnU7Ci0gIGJhc2U6OkxvY2sgbG9jazsKLX07Ci1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPENhY2hlPiBnX2NhY2hlOwotCi19ICAvLyBuYW1lc3BhY2UKLQotSUNDUHJvZmlsZTo6SUNDUHJvZmlsZSgpID0gZGVmYXVsdDsKLUlDQ1Byb2ZpbGU6OklDQ1Byb2ZpbGUoSUNDUHJvZmlsZSYmIG90aGVyKSA9IGRlZmF1bHQ7Ci1JQ0NQcm9maWxlOjpJQ0NQcm9maWxlKGNvbnN0IElDQ1Byb2ZpbGUmIG90aGVyKSA9IGRlZmF1bHQ7Ci1JQ0NQcm9maWxlJiBJQ0NQcm9maWxlOjpvcGVyYXRvcj0oSUNDUHJvZmlsZSYmIG90aGVyKSA9IGRlZmF1bHQ7Ci1JQ0NQcm9maWxlJiBJQ0NQcm9maWxlOjpvcGVyYXRvcj0oY29uc3QgSUNDUHJvZmlsZSYgb3RoZXIpID0gZGVmYXVsdDsKLUlDQ1Byb2ZpbGU6On5JQ0NQcm9maWxlKCkgPSBkZWZhdWx0OwotCi1ib29sIElDQ1Byb2ZpbGU6Om9wZXJhdG9yPT0oY29uc3QgSUNDUHJvZmlsZSYgb3RoZXIpIGNvbnN0IHsKLSAgaWYgKHR5cGVfICE9IG90aGVyLnR5cGVfKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3dpdGNoICh0eXBlXykgewotICAgIGNhc2UgVHlwZTo6SU5WQUxJRDoKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgVHlwZTo6RlJPTV9DT0xPUl9TUEFDRToKLSAgICAgIHJldHVybiBjb2xvcl9zcGFjZV8gPT0gb3RoZXIuY29sb3Jfc3BhY2VfOwotICAgIGNhc2UgVHlwZTo6RlJPTV9EQVRBOgotICAgICAgcmV0dXJuIGRhdGFfID09IG90aGVyLmRhdGFfOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLy8gc3RhdGljCi1JQ0NQcm9maWxlIElDQ1Byb2ZpbGU6OkZyb21EYXRhKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7Ci0gIElDQ1Byb2ZpbGUgaWNjX3Byb2ZpbGU7Ci0gIGlmIChJc1ZhbGlkUHJvZmlsZUxlbmd0aChzaXplKSkgewotICAgIGljY19wcm9maWxlLnR5cGVfID0gVHlwZTo6RlJPTV9EQVRBOwotICAgIGljY19wcm9maWxlLmRhdGFfLmluc2VydChpY2NfcHJvZmlsZS5kYXRhXy5iZWdpbigpLCBkYXRhLCBkYXRhICsgc2l6ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIElDQ1Byb2ZpbGUoKTsKLSAgfQotCi0gIENhY2hlJiBjYWNoZSA9IGdfY2FjaGUuR2V0KCk7Ci0gIGJhc2U6OkF1dG9Mb2NrIGxvY2soY2FjaGUubG9jayk7Ci0KLSAgLy8gTGluZWFybHkgc2VhcmNoIHRoZSBjYWNoZWQgSUNDIHByb2ZpbGVzIHRvIGZpbmQgb25lIHdpdGggdGhlIHNhbWUgZGF0YS4KLSAgLy8gSWYgaXQgZXhpc3RzLCByZS11c2UgaXRzIGlkIGFuZCB0b3VjaCBpdCBpbiB0aGUgY2FjaGUuCi0gIGZvciAoYXV0byBpdGVyID0gY2FjaGUuaWRfdG9faWNjX3Byb2ZpbGVfbXJ1LmJlZ2luKCk7Ci0gICAgICAgaXRlciAhPSBjYWNoZS5pZF90b19pY2NfcHJvZmlsZV9tcnUuZW5kKCk7ICsraXRlcikgewotICAgIGlmIChpY2NfcHJvZmlsZS5kYXRhXyA9PSBpdGVyLT5zZWNvbmQuZGF0YV8pIHsKLSAgICAgIGljY19wcm9maWxlID0gaXRlci0+c2Vjb25kOwotICAgICAgY2FjaGUuaWRfdG9faWNjX3Byb2ZpbGVfbXJ1LkdldChpY2NfcHJvZmlsZS5pZF8pOwotICAgICAgcmV0dXJuIGljY19wcm9maWxlOwotICAgIH0KLSAgfQotCi0gIC8vIENyZWF0ZSBhIG5ldyBjYWNoZWQgaWQgYW5kIGFkZCBpdCB0byB0aGUgY2FjaGUuCi0gIGljY19wcm9maWxlLmlkXyA9IGNhY2hlLm5leHRfdW51c2VkX2lkKys7Ci0gIGljY19wcm9maWxlLmNvbG9yX3NwYWNlXyA9Ci0gICAgICBDb2xvclNwYWNlKENvbG9yU3BhY2U6OlByaW1hcnlJRDo6Q1VTVE9NLCBDb2xvclNwYWNlOjpUcmFuc2ZlcklEOjpDVVNUT00sCi0gICAgICAgICAgICAgICAgIENvbG9yU3BhY2U6Ok1hdHJpeElEOjpSR0IsIENvbG9yU3BhY2U6OlJhbmdlSUQ6OkZVTEwpOwotICBpY2NfcHJvZmlsZS5jb2xvcl9zcGFjZV8uaWNjX3Byb2ZpbGVfaWRfID0gaWNjX3Byb2ZpbGUuaWRfOwotICBjYWNoZS5pZF90b19pY2NfcHJvZmlsZV9tcnUuUHV0KGljY19wcm9maWxlLmlkXywgaWNjX3Byb2ZpbGUpOwotICByZXR1cm4gaWNjX3Byb2ZpbGU7Ci19Ci0KLSNpZiAhZGVmaW5lZChPU19XSU4pICYmICFkZWZpbmVkKE9TX01BQ09TWCkgJiYgIWRlZmluZWQoVVNFX1gxMSkKLS8vIHN0YXRpYwotSUNDUHJvZmlsZSBJQ0NQcm9maWxlOjpGcm9tQmVzdE1vbml0b3IoKSB7Ci0gIHJldHVybiBJQ0NQcm9maWxlKCk7Ci19Ci0jZW5kaWYKLQotLy8gc3RhdGljCi1JQ0NQcm9maWxlIElDQ1Byb2ZpbGU6OkZyb21Db2xvclNwYWNlKGNvbnN0IGdmeDo6Q29sb3JTcGFjZSYgY29sb3Jfc3BhY2UpIHsKLSAgaWYgKGNvbG9yX3NwYWNlID09IGdmeDo6Q29sb3JTcGFjZSgpKQotICAgIHJldHVybiBJQ0NQcm9maWxlKCk7Ci0KLSAgLy8gSWYgfGNvbG9yX3NwYWNlfCB3YXMgY3JlYXRlZCBmcm9tIGFuIElDQyBwcm9maWxlLCByZXRyaWV2ZSB0aGF0IGV4YWN0Ci0gIC8vIHByb2ZpbGUuCi0gIGlmIChjb2xvcl9zcGFjZS5pY2NfcHJvZmlsZV9pZF8pIHsKLSAgICBDYWNoZSYgY2FjaGUgPSBnX2NhY2hlLkdldCgpOwotICAgIGJhc2U6OkF1dG9Mb2NrIGxvY2soY2FjaGUubG9jayk7Ci0KLSAgICBhdXRvIGZvdW5kID0gY2FjaGUuaWRfdG9faWNjX3Byb2ZpbGVfbXJ1LkdldChjb2xvcl9zcGFjZS5pY2NfcHJvZmlsZV9pZF8pOwotICAgIGlmIChmb3VuZCAhPSBjYWNoZS5pZF90b19pY2NfcHJvZmlsZV9tcnUuZW5kKCkpIHsKLSAgICAgIHJldHVybiBmb3VuZC0+c2Vjb25kOwotICAgIH0KLSAgfQotCi0gIC8vIFRPRE8oY2NhbWVyb24pOiBTdXBwb3J0IGNvbnN0cnVjdGluZyBJQ0MgcHJvZmlsZXMgZnJvbSBhcmJpdHJhcnkgQ29sb3JTcGFjZQotICAvLyBvYmplY3RzLgotICBJQ0NQcm9maWxlIGljY19wcm9maWxlOwotICBpY2NfcHJvZmlsZS50eXBlXyA9IGdmeDo6SUNDUHJvZmlsZTo6VHlwZTo6RlJPTV9DT0xPUl9TUEFDRTsKLSAgaWNjX3Byb2ZpbGUuY29sb3Jfc3BhY2VfID0gY29sb3Jfc3BhY2U7Ci0gIHJldHVybiBpY2NfcHJvZmlsZTsKLX0KLQotY29uc3Qgc3RkOjp2ZWN0b3I8Y2hhcj4mIElDQ1Byb2ZpbGU6OkdldERhdGEoKSBjb25zdCB7Ci0gIHJldHVybiBkYXRhXzsKLX0KLQotQ29sb3JTcGFjZSBJQ0NQcm9maWxlOjpHZXRDb2xvclNwYWNlKCkgY29uc3QgewotICBpZiAodHlwZV8gPT0gVHlwZTo6SU5WQUxJRCkKLSAgICByZXR1cm4gZ2Z4OjpDb2xvclNwYWNlKCk7Ci0gIGlmICh0eXBlXyA9PSBUeXBlOjpGUk9NX0NPTE9SX1NQQUNFKQotICAgIHJldHVybiBjb2xvcl9zcGFjZV87Ci0KLSAgQ29sb3JTcGFjZSBjb2xvcl9zcGFjZSA9IGNvbG9yX3NwYWNlXzsKLQotICAvLyBNb3ZlIHRoaXMgSUNDIHByb2ZpbGUgdG8gdGhlIG1vc3QgcmVjZW50bHkgdXNlZCBlbmQgb2YgdGhlIGNhY2hlLgotICB7Ci0gICAgQ2FjaGUmIGNhY2hlID0gZ19jYWNoZS5HZXQoKTsKLSAgICBiYXNlOjpBdXRvTG9jayBsb2NrKGNhY2hlLmxvY2spOwotCi0gICAgYXV0byBmb3VuZCA9IGNhY2hlLmlkX3RvX2ljY19wcm9maWxlX21ydS5HZXQoaWRfKTsKLSAgICBpZiAoZm91bmQgPT0gY2FjaGUuaWRfdG9faWNjX3Byb2ZpbGVfbXJ1LmVuZCgpKQotICAgICAgY2FjaGUuaWRfdG9faWNjX3Byb2ZpbGVfbXJ1LlB1dChpZF8sICp0aGlzKTsKLSAgfQotCi0gIENvbG9yU3BhY2UgdW5pdHlfY29sb3JzcGFjZSgKLSAgICAgIENvbG9yU3BhY2U6OlByaW1hcnlJRDo6Q1VTVE9NLCBDb2xvclNwYWNlOjpUcmFuc2ZlcklEOjpMSU5FQVIsCi0gICAgICBDb2xvclNwYWNlOjpNYXRyaXhJRDo6UkdCLCBDb2xvclNwYWNlOjpSYW5nZUlEOjpGVUxMKTsKLSAgdW5pdHlfY29sb3JzcGFjZS5jdXN0b21fcHJpbWFyeV9tYXRyaXhfWzBdID0gMS4wZjsKLSAgdW5pdHlfY29sb3JzcGFjZS5jdXN0b21fcHJpbWFyeV9tYXRyaXhfWzFdID0gMC4wZjsKLSAgdW5pdHlfY29sb3JzcGFjZS5jdXN0b21fcHJpbWFyeV9tYXRyaXhfWzJdID0gMC4wZjsKLSAgdW5pdHlfY29sb3JzcGFjZS5jdXN0b21fcHJpbWFyeV9tYXRyaXhfWzNdID0gMC4wZjsKLQotICB1bml0eV9jb2xvcnNwYWNlLmN1c3RvbV9wcmltYXJ5X21hdHJpeF9bNF0gPSAwLjBmOwotICB1bml0eV9jb2xvcnNwYWNlLmN1c3RvbV9wcmltYXJ5X21hdHJpeF9bNV0gPSAxLjBmOwotICB1bml0eV9jb2xvcnNwYWNlLmN1c3RvbV9wcmltYXJ5X21hdHJpeF9bNl0gPSAwLjBmOwotICB1bml0eV9jb2xvcnNwYWNlLmN1c3RvbV9wcmltYXJ5X21hdHJpeF9bN10gPSAwLjBmOwotCi0gIHVuaXR5X2NvbG9yc3BhY2UuY3VzdG9tX3ByaW1hcnlfbWF0cml4X1s4XSA9IDAuMGY7Ci0gIHVuaXR5X2NvbG9yc3BhY2UuY3VzdG9tX3ByaW1hcnlfbWF0cml4X1s5XSA9IDAuMGY7Ci0gIHVuaXR5X2NvbG9yc3BhY2UuY3VzdG9tX3ByaW1hcnlfbWF0cml4X1sxMF0gPSAxLjBmOwotICB1bml0eV9jb2xvcnNwYWNlLmN1c3RvbV9wcmltYXJ5X21hdHJpeF9bMTFdID0gMC4wZjsKLQotICAvLyBUaGlzIHdpbGwgbG9vayB1cCBhbmQgdXNlIHRoZSBJQ0MgcHJvZmlsZS4KLSAgc3RkOjp1bmlxdWVfcHRyPENvbG9yVHJhbnNmb3JtPiB0cmFuc2Zvcm0oQ29sb3JUcmFuc2Zvcm06Ok5ld0NvbG9yVHJhbnNmb3JtKAotICAgICAgY29sb3Jfc3BhY2UsIHVuaXR5X2NvbG9yc3BhY2UsIENvbG9yVHJhbnNmb3JtOjpJbnRlbnQ6OklOVEVOVF9BQlNPTFVURSkpOwotCi0gIENvbG9yVHJhbnNmb3JtOjpUcmlTdGltIHRtcFs0XTsKLSAgdG1wWzBdLnNldF94KDEuMGYpOwotICB0bXBbMV0uc2V0X3koMS4wZik7Ci0gIHRtcFsyXS5zZXRfeigxLjBmKTsKLSAgdHJhbnNmb3JtLT50cmFuc2Zvcm0odG1wLCBhcnJheXNpemUodG1wKSk7Ci0KLSAgY29sb3Jfc3BhY2UuY3VzdG9tX3ByaW1hcnlfbWF0cml4X1swXSA9IHRtcFswXS54KCkgLSB0bXBbM10ueCgpOwotICBjb2xvcl9zcGFjZS5jdXN0b21fcHJpbWFyeV9tYXRyaXhfWzFdID0gdG1wWzFdLngoKSAtIHRtcFszXS54KCk7Ci0gIGNvbG9yX3NwYWNlLmN1c3RvbV9wcmltYXJ5X21hdHJpeF9bMl0gPSB0bXBbMl0ueCgpIC0gdG1wWzNdLngoKTsKLSAgY29sb3Jfc3BhY2UuY3VzdG9tX3ByaW1hcnlfbWF0cml4X1szXSA9IHRtcFszXS54KCk7Ci0KLSAgY29sb3Jfc3BhY2UuY3VzdG9tX3ByaW1hcnlfbWF0cml4X1s0XSA9IHRtcFswXS55KCkgLSB0bXBbM10ueSgpOwotICBjb2xvcl9zcGFjZS5jdXN0b21fcHJpbWFyeV9tYXRyaXhfWzVdID0gdG1wWzFdLnkoKSAtIHRtcFszXS55KCk7Ci0gIGNvbG9yX3NwYWNlLmN1c3RvbV9wcmltYXJ5X21hdHJpeF9bNl0gPSB0bXBbMl0ueSgpIC0gdG1wWzNdLnkoKTsKLSAgY29sb3Jfc3BhY2UuY3VzdG9tX3ByaW1hcnlfbWF0cml4X1s3XSA9IHRtcFszXS55KCk7Ci0KLSAgY29sb3Jfc3BhY2UuY3VzdG9tX3ByaW1hcnlfbWF0cml4X1s4XSA9IHRtcFswXS56KCkgLSB0bXBbM10ueigpOwotICBjb2xvcl9zcGFjZS5jdXN0b21fcHJpbWFyeV9tYXRyaXhfWzldID0gdG1wWzFdLnooKSAtIHRtcFszXS56KCk7Ci0gIGNvbG9yX3NwYWNlLmN1c3RvbV9wcmltYXJ5X21hdHJpeF9bMTBdID0gdG1wWzJdLnooKSAtIHRtcFszXS56KCk7Ci0gIGNvbG9yX3NwYWNlLmN1c3RvbV9wcmltYXJ5X21hdHJpeF9bMTFdID0gdG1wWzNdLnooKTsKLQotICByZXR1cm4gY29sb3Jfc3BhY2U7Ci19Ci0KLS8vIHN0YXRpYwotYm9vbCBJQ0NQcm9maWxlOjpJc1ZhbGlkUHJvZmlsZUxlbmd0aChzaXplX3QgbGVuZ3RoKSB7Ci0gIHJldHVybiBsZW5ndGggPj0ga01pblByb2ZpbGVMZW5ndGggJiYgbGVuZ3RoIDw9IGtNYXhQcm9maWxlTGVuZ3RoOwotfQotCi19ICAvLyBuYW1lc3BhY2UgZ2Z4CmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9pY2NfcHJvZmlsZS5oIGIvc3JjL21lZGlhL2Jhc2UvaWNjX3Byb2ZpbGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjZjYzMi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9pY2NfcHJvZmlsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBVSV9HRlhfSUNDX1BST0ZJTEVfSF8KLSNkZWZpbmUgVUlfR0ZYX0lDQ19QUk9GSUxFX0hfCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJiYXNlL2d0ZXN0X3Byb2RfdXRpbC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvY29sb3Jfc3BhY2UuaCIKLQotI2lmIGRlZmluZWQoT1NfTUFDT1NYKQotI2luY2x1ZGUgPENvcmVHcmFwaGljcy9DR0NvbG9yU3BhY2UuaD4KLSNlbmRpZgotCi1leHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKTsKLQotbmFtZXNwYWNlIG1vam8gewotdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZT4KLXN0cnVjdCBTdHJ1Y3RUcmFpdHM7Ci19Ci0KLW5hbWVzcGFjZSBnZnggewotCi1uYW1lc3BhY2UgbW9qb20gewotY2xhc3MgSUNDUHJvZmlsZURhdGFWaWV3OwotfQotCi0vLyBVc2VkIHRvIHJlcHJlc2VudCBhIGZ1bGwgSUNDIHByb2ZpbGUsIHVzdWFsbHkgcmV0cmlldmVkIGZyb20gYSBtb25pdG9yLiBJdAotLy8gY2FuIGJlIGxvc3NpbHkgY29tcHJlc3NlZCBpbnRvIGEgQ29sb3JTcGFjZSBvYmplY3QuIFRoaXMgc3RydWN0dXJlIHNob3VsZAotLy8gb25seSBiZSBzZW50IGZyb20gaGlnaGVyLXByaXZpbGVnZSBwcm9jZXNzZXMgdG8gbG93ZXItcHJpdmlsZWdlIHByb2Nlc3NlcywKLS8vIGFzIHBhcnNpbmcgdGhpcyBzdHJ1Y3R1cmUgaXMgbm90IHNlY3VyZS4KLWNsYXNzIEdGWF9FWFBPUlQgSUNDUHJvZmlsZSB7Ci0gcHVibGljOgotICBJQ0NQcm9maWxlKCk7Ci0gIElDQ1Byb2ZpbGUoSUNDUHJvZmlsZSYmIG90aGVyKTsKLSAgSUNDUHJvZmlsZShjb25zdCBJQ0NQcm9maWxlJiBvdGhlcik7Ci0gIElDQ1Byb2ZpbGUmIG9wZXJhdG9yPShJQ0NQcm9maWxlJiYgb3RoZXIpOwotICBJQ0NQcm9maWxlJiBvcGVyYXRvcj0oY29uc3QgSUNDUHJvZmlsZSYgb3RoZXIpOwotICB+SUNDUHJvZmlsZSgpOwotICBib29sIG9wZXJhdG9yPT0oY29uc3QgSUNDUHJvZmlsZSYgb3RoZXIpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdGhlIGNvbG9yIHByb2ZpbGUgb2YgdGhlIG1vbml0b3IgdGhhdCBjYW4gYmVzdCByZXByZXNlbnQgY29sb3IuCi0gIC8vIFRoaXMgcHJvZmlsZSBzaG91bGQgYmUgdXNlZCBmb3IgY3JlYXRpbmcgY29udGVudCB0aGF0IGRvZXMgbm90IGtub3cgb24KLSAgLy8gd2hpY2ggbW9uaXRvciBpdCB3aWxsIGJlIGRpc3BsYXllZC4KLSAgc3RhdGljIElDQ1Byb2ZpbGUgRnJvbUJlc3RNb25pdG9yKCk7Ci0jaWYgZGVmaW5lZChPU19NQUNPU1gpCi0gIHN0YXRpYyBJQ0NQcm9maWxlIEZyb21DR0NvbG9yU3BhY2UoQ0dDb2xvclNwYWNlUmVmIGNnX2NvbG9yX3NwYWNlKTsKLSNlbmRpZgotCi0gIC8vIFRoaXMgd2lsbCByZWNvdmVyIGEgSUNDUHJvZmlsZSBmcm9tIGEgY29tcGFjdCBDb2xvclNwYWNlIHJlcHJlc2VudGF0aW9uLgotICAvLyBJbnRlcm5hbGx5LCB0aGlzIHdpbGwgbWFrZSBhbiBlZmZvcnQgdG8gY3JlYXRlIGFuIGlkZW50aWNhbCBJQ0NQcm9maWxlCi0gIC8vIHRvIHRoZSBvbmUgdGhhdCBjcmVhdGVkIHxjb2xvcl9zcGFjZXwsIGJ1dCB0aGlzIGlzIG5vdCBndWFyYW50ZWVkLgotICBzdGF0aWMgSUNDUHJvZmlsZSBGcm9tQ29sb3JTcGFjZShjb25zdCBnZng6OkNvbG9yU3BhY2UmIGNvbG9yX3NwYWNlKTsKLQotICAvLyBDcmVhdGUgZGlyZWN0bHkgZnJvbSBwcm9maWxlIGRhdGEuCi0gIHN0YXRpYyBJQ0NQcm9maWxlIEZyb21EYXRhKGNvbnN0IGNoYXIqIGljY19wcm9maWxlLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgLy8gVGhpcyB3aWxsIHBlcmZvcm0gYSBwb3RlbnRpYWxseS1sb3NzeSBjb252ZXJzaW9uIHRvIGEgbW9yZSBjb21wYWN0IGNvbG9yCi0gIC8vIHNwYWNlIHJlcHJlc2VudGF0aW9uLgotICBDb2xvclNwYWNlIEdldENvbG9yU3BhY2UoKSBjb25zdDsKLQotICBjb25zdCBzdGQ6OnZlY3RvcjxjaGFyPiYgR2V0RGF0YSgpIGNvbnN0OwotCi0jaWYgZGVmaW5lZChPU19XSU4pCi0gIC8vIFRoaXMgd2lsbCByZWFkIG1vbml0b3IgSUNDIHByb2ZpbGVzIGZyb20gZGlzayBhbmQgY2FjaGUgdGhlIHJlc3VsdHMgZm9yIHRoZQotICAvLyBvdGhlciBmdW5jdGlvbnMgdG8gcmVhZC4gVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiB0aGUgVUkgb3IgSU8gdGhyZWFkLgotICBzdGF0aWMgdm9pZCBVcGRhdGVDYWNoZWRQcm9maWxlc09uQmFja2dyb3VuZFRocmVhZCgpOwotICBzdGF0aWMgYm9vbCBDYWNoZWRQcm9maWxlc05lZWRVcGRhdGUoKTsKLSNlbmRpZgotCi0gIGVudW0gY2xhc3MgVHlwZSB7Ci0gICAgLy8gVGhpcyBpcyBub3QgYSB2YWxpZCBwcm9maWxlLgotICAgIElOVkFMSUQsCi0gICAgLy8gVGhpcyBpcyBmcm9tIGEgZ2Z4OjpDb2xvclNwYWNlLiBUaGlzIGVuc3VyZXMgdGhhdCBHZXRDb2xvclNwYWNlIHJldHVybnMKLSAgICAvLyB0aGUgZXhhY3Qgc2FtZSBvYmplY3QgYXMgd2FzIHVzZWQgdG8gY3JlYXRlIHRoaXMuCi0gICAgRlJPTV9DT0xPUl9TUEFDRSwKLSAgICAvLyBUaGlzIHdhcyBjcmVhdGVkIGZyb20gSUNDIHByb2ZpbGUgZGF0YS4KLSAgICBGUk9NX0RBVEEsCi0gICAgTEFTVCA9IEZST01fREFUQQotICB9OwotCi0gcHJpdmF0ZToKLSAgc3RhdGljIGJvb2wgSXNWYWxpZFByb2ZpbGVMZW5ndGgoc2l6ZV90IGxlbmd0aCk7Ci0KLSAgVHlwZSB0eXBlXyA9IFR5cGU6OklOVkFMSUQ7Ci0gIGdmeDo6Q29sb3JTcGFjZSBjb2xvcl9zcGFjZV87Ci0gIHN0ZDo6dmVjdG9yPGNoYXI+IGRhdGFfOwotCi0gIC8vIFRoaXMgZ2xvYmFsbHkgaWRlbnRpZmllcyB0aGlzIElDQyBwcm9maWxlLiBJdCBpcyB1c2VkIHRvIGxvb2sgdXAgdGhpcyBJQ0MKLSAgLy8gcHJvZmlsZSBmcm9tIGEgQ29sb3JTcGFjZSBvYmplY3QgY3JlYXRlZCBmcm9tIGl0LgotICB1aW50NjRfdCBpZF8gPSAwOwotCi0gIEZSSUVORF9URVNUX0FMTF9QUkVGSVhFUyhTaW1wbGVDb2xvclNwYWNlLCBCVDcwOXRvU1JHQklDQyk7Ci0gIEZSSUVORF9URVNUX0FMTF9QUkVGSVhFUyhTaW1wbGVDb2xvclNwYWNlLCBHZXRDb2xvclNwYWNlKTsKLSAgZnJpZW5kIGludCA6OkxMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCosIHNpemVfdCk7Ci0gIGZyaWVuZCBjbGFzcyBDb2xvclNwYWNlOwotICBmcmllbmQgc3RydWN0IElQQzo6UGFyYW1UcmFpdHM8Z2Z4OjpJQ0NQcm9maWxlPjsKLSAgZnJpZW5kIHN0cnVjdCBJUEM6OlBhcmFtVHJhaXRzPGdmeDo6SUNDUHJvZmlsZTo6VHlwZT47Ci0gIGZyaWVuZCBzdHJ1Y3QgbW9qbzo6U3RydWN0VHJhaXRzPGdmeDo6bW9qb206OklDQ1Byb2ZpbGVEYXRhVmlldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Z4OjpJQ0NQcm9maWxlPjsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBnZngKLQotI2VuZGlmICAvLyBVSV9HRlhfSUNDX1BST0ZJTEVfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2ludGVybGVhdmVkX3NpbmNfcmVzYW1wbGVyLmNjIGIvc3JjL21lZGlhL2Jhc2UvaW50ZXJsZWF2ZWRfc2luY19yZXNhbXBsZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZGY5ZmYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvaW50ZXJsZWF2ZWRfc2luY19yZXNhbXBsZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMzUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLS8vCi0vLyBJbnB1dCBidWZmZXIgbGF5b3V0LCBkaXZpZGluZyB0aGUgdG90YWwgYnVmZmVyIGludG8gcmVnaW9ucyAocjBfIC0gcjVfKToKLS8vCi0vLyB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfAotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQmxvY2tTaXplICsga0tlcm5lbFNpemUgLyAyCi0vLyAgICAgICAgICAgICAgICAgICA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjBfCi0vLwotLy8gIGtLZXJuZWxTaXplIC8gMiAgIGtLZXJuZWxTaXplIC8gMiAgICAgICAgIGtLZXJuZWxTaXplIC8gMiAgIGtLZXJuZWxTaXplIC8gMgotLy8gPC0tLS0tLS0tLS0tLS0tLT4gPC0tLS0tLS0tLS0tLS0tLT4gICAgICAgPC0tLS0tLS0tLS0tLS0tLT4gPC0tLS0tLS0tLS0tLS0tLT4KLS8vICAgICAgICByMV8gICAgICAgICAgICAgICByMl8gICAgICAgICAgICAgICAgICAgICByM18gICAgICAgICAgICAgICByNF8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0Jsb2NrU2l6ZQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByNV8KLS8vCi0vLyBUaGUgYWxnb3JpdGhtOgotLy8KLS8vIDEpIENvbnN1bWUgaW5wdXQgZnJhbWVzIGludG8gcjBfIChyMV8gaXMgemVyby1pbml0aWFsaXplZCkuCi0vLyAyKSBQb3NpdGlvbiBrZXJuZWwgY2VudGVyZWQgYXQgc3RhcnQgb2YgcjBfIChyMl8pIGFuZCBnZW5lcmF0ZSBvdXRwdXQgZnJhbWVzCi0vLyAgICB1bnRpbCBrZXJuZWwgaXMgY2VudGVyZWQgYXQgc3RhcnQgb2YgcjRfIG9yIHdlJ3ZlIGZpbmlzaGVkIGdlbmVyYXRpbmcgYWxsCi0vLyAgICB0aGUgb3V0cHV0IGZyYW1lcy4KLS8vIDMpIENvcHkgcjNfIHRvIHIxXyBhbmQgcjRfIHRvIHIyXy4KLS8vIDQpIENvbnN1bWUgaW5wdXQgZnJhbWVzIGludG8gcjVfICh6ZXJvLXBhZCBpZiB3ZSBydW4gb3V0IG9mIGlucHV0KS4KLS8vIDUpIEdvdG8gKDIpIHVudGlsIGFsbCBvZiBpbnB1dCBpcyBjb25zdW1lZC4KLS8vCi0vLyBOb3RlOiB3ZSdyZSBnbG9zc2luZyBvdmVyIGhvdyB0aGUgc3ViLXNhbXBsZSBoYW5kbGluZyB3b3JrcyB3aXRoCi0vLyB8dmlydHVhbF9zb3VyY2VfaWR4X3wsIGV0Yy4KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvaW50ZXJsZWF2ZWRfc2luY19yZXNhbXBsZXIuaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxjbWF0aD4KLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1uYW1lc3BhY2UgewotCi0vLyBUaGUga2VybmVsIHNpemUgY2FuIGJlIGFkanVzdGVkIGZvciBxdWFsaXR5IChoaWdoZXIgaXMgYmV0dGVyKSBhdCB0aGUKLS8vIGV4cGVuc2Ugb2YgcGVyZm9ybWFuY2UuICBNdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzIuCi1jb25zdCBpbnQga0tlcm5lbFNpemUgPSAzMjsKLQotLy8gVGhlIG51bWJlciBvZiBkZXN0aW5hdGlvbiBmcmFtZXMgZ2VuZXJhdGVkIHBlciBwcm9jZXNzaW5nIHBhc3MuICBBZmZlY3RzCi0vLyBob3cgb2Z0ZW4gYW5kIGZvciBob3cgbXVjaCBJbnRlcmxlYXZlZFNpbmNSZXNhbXBsZXIgY2FsbHMgYmFjayBmb3IgaW5wdXQuCi0vLyBNdXN0IGJlIGdyZWF0ZXIgdGhhbiBrS2VybmVsU2l6ZS4KLWNvbnN0IGludCBrQmxvY2tTaXplID0gNTEyOwotCi0vLyBUaGUga2VybmVsIG9mZnNldCBjb3VudCBpcyB1c2VkIGZvciBpbnRlcnBvbGF0aW9uIGFuZCBpcyB0aGUgbnVtYmVyIG9mCi0vLyBzdWItc2FtcGxlIGtlcm5lbCBzaGlmdHMuICBDYW4gYmUgYWRqdXN0ZWQgZm9yIHF1YWxpdHkgKGhpZ2hlciBpcyBiZXR0ZXIpCi0vLyBhdCB0aGUgZXhwZW5zZSBvZiBhbGxvY2F0aW5nIG1vcmUgbWVtb3J5LgotY29uc3QgaW50IGtLZXJuZWxPZmZzZXRDb3VudCA9IDMyOwotY29uc3QgaW50IGtLZXJuZWxTdG9yYWdlU2l6ZSA9IGtLZXJuZWxTaXplICogKGtLZXJuZWxPZmZzZXRDb3VudCArIDEpOwotCi0vLyBUaGUgc2l6ZSAoaW4gc2FtcGxlcykgb2YgdGhlIGludGVybmFsIGJ1ZmZlciB1c2VkIGJ5IHRoZSByZXNhbXBsZXIuCi1jb25zdCBpbnQga0J1ZmZlclNpemUgPSBrQmxvY2tTaXplICsga0tlcm5lbFNpemU7Ci0KLS8vIFRoZSBtYXhpbXVtIG51bWJlcnMgb2YgYnVmZmVyIGNhbiBiZSBxdWV1ZWQuCi1jb25zdCBpbnQga01heGltdW1QZW5kaW5nQnVmZmVycyA9IDg7Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1JbnRlcmxlYXZlZFNpbmNSZXNhbXBsZXI6OkludGVybGVhdmVkU2luY1Jlc2FtcGxlcihkb3VibGUgaW9fc2FtcGxlX3JhdGVfcmF0aW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbF9jb3VudCkKLSAgICA6IGlvX3NhbXBsZV9yYXRlX3JhdGlvXyhpb19zYW1wbGVfcmF0ZV9yYXRpbyksCi0gICAgICB2aXJ0dWFsX3NvdXJjZV9pZHhfKDApLAotICAgICAgYnVmZmVyX3ByaW1lZF8oZmFsc2UpLAotICAgICAgY2hhbm5lbF9jb3VudF8oY2hhbm5lbF9jb3VudCksCi0gICAgICBmcmFtZV9zaXplX2luX2J5dGVzXyhzaXplb2YoZmxvYXQpICogY2hhbm5lbF9jb3VudF8pLAotICAgICAgLy8gQ3JlYXRlIGJ1ZmZlcnMgd2l0aCBhIDE2LWJ5dGUgYWxpZ25tZW50IGZvciBwb3NzaWJsZSBvcHRpbWl6YXRpb25zLgotICAgICAga2VybmVsX3N0b3JhZ2VfKHN0YXRpY19jYXN0PGZsb2F0Kj4oCi0gICAgICAgICAgYmFzZTo6QWxpZ25lZEFsbG9jKHNpemVvZihmbG9hdCkgKiBrS2VybmVsU3RvcmFnZVNpemUsIDE2KSkpLAotICAgICAgaW5wdXRfYnVmZmVyXyhzdGF0aWNfY2FzdDxmbG9hdCo+KAotICAgICAgICAgIGJhc2U6OkFsaWduZWRBbGxvYyhmcmFtZV9zaXplX2luX2J5dGVzXyAqIGtCdWZmZXJTaXplLCAxNikpKSwKLSAgICAgIG9mZnNldF9pbl9mcmFtZXNfKDApLAotICAgICAgZnJhbWVzX3Jlc2FtcGxlZF8oMCksCi0gICAgICBmcmFtZXNfcXVldWVkXygwKSwKLSAgICAgIC8vIFNldHVwIHZhcmlvdXMgcmVnaW9uIHBvaW50ZXJzIGluIHRoZSBidWZmZXIgKHNlZSBkaWFncmFtIGFib3ZlKS4KLSAgICAgIHIwXyhpbnB1dF9idWZmZXJfLmdldCgpICsga0tlcm5lbFNpemUgLyAyICogY2hhbm5lbF9jb3VudF8pLAotICAgICAgcjFfKGlucHV0X2J1ZmZlcl8uZ2V0KCkpLAotICAgICAgcjJfKHIwXyksCi0gICAgICByM18ocjBfICsgKGtCbG9ja1NpemUgLSBrS2VybmVsU2l6ZSAvIDIpICogY2hhbm5lbF9jb3VudF8pLAotICAgICAgcjRfKHIwXyArIGtCbG9ja1NpemUgKiBjaGFubmVsX2NvdW50XyksCi0gICAgICByNV8ocjBfICsga0tlcm5lbFNpemUgLyAyICogY2hhbm5lbF9jb3VudF8pIHsKLSAgLy8gRW5zdXJlIGtLZXJuZWxTaXplIGlzIGEgbXVsdGlwbGUgb2YgMzIgZm9yIGVhc3kgU1NFIG9wdGltaXphdGlvbnM7IGNhdXNlcwotICAvLyByMF8gYW5kIHI1XyAodXNlZCBmb3IgaW5wdXQpIHRvIGFsd2F5cyBiZSAxNi1ieXRlIGFsaWduZWQgYnkgdmlydHVlIG9mCi0gIC8vIGlucHV0X2J1ZmZlcl8gYmVpbmcgMTYtYnl0ZSBhbGlnbmVkLgotICBEQ0hFQ0tfRVEoa0tlcm5lbFNpemUgJSAzMiwgMCkgPDwgImtLZXJuZWxTaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMiEiOwotICBEQ0hFQ0tfR1Qoa0Jsb2NrU2l6ZSwga0tlcm5lbFNpemUpCi0gICAgICA8PCAia0Jsb2NrU2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBrS2VybmVsU2l6ZSEiOwotICAvLyBCYXNpYyBzYW5pdHkgY2hlY2tzIHRvIGVuc3VyZSBidWZmZXIgcmVnaW9ucyBhcmUgbGFpZCBvdXQgY29ycmVjdGx5OgotICAvLyByMF8gYW5kIHIyXyBzaG91bGQgYWx3YXlzIGJlIHRoZSBzYW1lIHBvc2l0aW9uLgotICBEQ0hFQ0tfRVEocjBfLCByMl8pOwotICAvLyByMV8gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLgotICBEQ0hFQ0tfRVEocjFfLCBpbnB1dF9idWZmZXJfLmdldCgpKTsKLSAgLy8gcjFfIGxlZnQgb2YgcjJfLCByMl8gbGVmdCBvZiByNV8gYW5kIHIxXywgcjJfIHNpemUgY29ycmVjdC4KLSAgRENIRUNLX0VRKHIyXyAtIHIxXywgcjVfIC0gcjJfKTsKLSAgLy8gcjNfIGxlZnQgb2YgcjRfLCByNV8gbGVmdCBvZiByMF8gYW5kIHIzXyBzaXplIGNvcnJlY3QuCi0gIERDSEVDS19FUShyNF8gLSByM18sIHI1XyAtIHIwXyk7Ci0gIC8vIHIzXywgcjRfIHNpemUgY29ycmVjdCBhbmQgcjRfIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KLSAgRENIRUNLX0VRKHI0XyArIChyNF8gLSByM18pLCByMV8gKyBrQnVmZmVyU2l6ZSAqIGNoYW5uZWxfY291bnRfKTsKLSAgLy8gcjVfIHNpemUgY29ycmVjdCBhbmQgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgotICBEQ0hFQ0tfRVEocjVfICsga0Jsb2NrU2l6ZSAqIGNoYW5uZWxfY291bnRfLAotICAgICAgICAgICAgcjFfICsga0J1ZmZlclNpemUgKiBjaGFubmVsX2NvdW50Xyk7Ci0KLSAgbWVtc2V0KGtlcm5lbF9zdG9yYWdlXy5nZXQoKSwgMCwKLSAgICAgICAgIHNpemVvZigqa2VybmVsX3N0b3JhZ2VfLmdldCgpKSAqIGtLZXJuZWxTdG9yYWdlU2l6ZSk7Ci0gIG1lbXNldChpbnB1dF9idWZmZXJfLmdldCgpLCAwLCBmcmFtZV9zaXplX2luX2J5dGVzXyAqIGtCdWZmZXJTaXplKTsKLQotICBJbml0aWFsaXplS2VybmVsKCk7Ci19Ci0KLXZvaWQgSW50ZXJsZWF2ZWRTaW5jUmVzYW1wbGVyOjpJbml0aWFsaXplS2VybmVsKCkgewotICAvLyBCbGFja21hbiB3aW5kb3cgcGFyYW1ldGVycy4KLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBrQWxwaGEgPSAwLjE2OwotICBzdGF0aWMgY29uc3QgZG91YmxlIGtBMCA9IDAuNSAqICgxLjAgLSBrQWxwaGEpOwotICBzdGF0aWMgY29uc3QgZG91YmxlIGtBMSA9IDAuNTsKLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBrQTIgPSAwLjUgKiBrQWxwaGE7Ci0KLSAgLy8gfHNpbmNfc2NhbGVfZmFjdG9yfCBpcyBiYXNpY2FsbHkgdGhlIG5vcm1hbGl6ZWQgY3V0b2ZmIGZyZXF1ZW5jeSBvZiB0aGUKLSAgLy8gbG93LXBhc3MgZmlsdGVyLgotICBkb3VibGUgc2luY19zY2FsZV9mYWN0b3IgPQotICAgICAgaW9fc2FtcGxlX3JhdGVfcmF0aW9fID4gMS4wID8gMS4wIC8gaW9fc2FtcGxlX3JhdGVfcmF0aW9fIDogMS4wOwotCi0gIC8vIFRoZSBzaW5jIGZ1bmN0aW9uIGlzIGFuIGlkZWFsaXplZCBicmljay13YWxsIGZpbHRlciwgYnV0IHNpbmNlIHdlJ3JlCi0gIC8vIHdpbmRvd2luZyBpdCB0aGUgdHJhbnNpdGlvbiBmcm9tIHBhc3MgdG8gc3RvcCBkb2VzIG5vdCBoYXBwZW4gcmlnaHQgYXdheS4KLSAgLy8gU28gd2Ugc2hvdWxkIGFkanVzdCB0aGUgbG93IHBhc3MgZmlsdGVyIGN1dG9mZiBzbGlnaHRseSBkb3dud2FyZCB0byBhdm9pZAotICAvLyBzb21lIGFsaWFzaW5nIGF0IHRoZSB2ZXJ5IGhpZ2gtZW5kLgotICAvLyBUT0RPKGNyb2dlcnMpOiB0aGlzIHZhbHVlIGlzIGVtcGlyaWNhbCBhbmQgdG8gYmUgbW9yZSBleGFjdCBzaG91bGQgdmFyeQotICAvLyBkZXBlbmRpbmcgb24ga0tlcm5lbFNpemUuCi0gIHNpbmNfc2NhbGVfZmFjdG9yICo9IDAuOTsKLQotICAvLyBHZW5lcmF0ZXMgYSBzZXQgb2Ygd2luZG93ZWQgc2luYygpIGtlcm5lbHMuCi0gIC8vIFdlIGdlbmVyYXRlIGEgcmFuZ2Ugb2Ygc3ViLXNhbXBsZSBvZmZzZXRzIGZyb20gMC4wIHRvIDEuMC4KLSAgZm9yIChpbnQgb2Zmc2V0X2lkeCA9IDA7IG9mZnNldF9pZHggPD0ga0tlcm5lbE9mZnNldENvdW50OyArK29mZnNldF9pZHgpIHsKLSAgICBkb3VibGUgc3Vic2FtcGxlX29mZnNldCA9Ci0gICAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4ob2Zmc2V0X2lkeCkgLyBrS2VybmVsT2Zmc2V0Q291bnQ7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGtLZXJuZWxTaXplOyArK2kpIHsKLSAgICAgIC8vIENvbXB1dGUgdGhlIHNpbmMgd2l0aCBvZmZzZXQuCi0gICAgICBkb3VibGUgcyA9Ci0gICAgICAgICAgc2luY19zY2FsZV9mYWN0b3IgKiBNX1BJICogKGkgLSBrS2VybmVsU2l6ZSAvIDIgLSBzdWJzYW1wbGVfb2Zmc2V0KTsKLSAgICAgIGRvdWJsZSBzaW5jID0gKCFzID8gMS4wIDogc2luKHMpIC8gcykgKiBzaW5jX3NjYWxlX2ZhY3RvcjsKLQotICAgICAgLy8gQ29tcHV0ZSBCbGFja21hbiB3aW5kb3csIG1hdGNoaW5nIHRoZSBvZmZzZXQgb2YgdGhlIHNpbmMoKS4KLSAgICAgIGRvdWJsZSB4ID0gKGkgLSBzdWJzYW1wbGVfb2Zmc2V0KSAvIGtLZXJuZWxTaXplOwotICAgICAgZG91YmxlIHdpbmRvdyA9Ci0gICAgICAgICAga0EwIC0ga0ExICogY29zKDIuMCAqIE1fUEkgKiB4KSArIGtBMiAqIGNvcyg0LjAgKiBNX1BJICogeCk7Ci0KLSAgICAgIC8vIFdpbmRvdyB0aGUgc2luYygpIGZ1bmN0aW9uIGFuZCBzdG9yZSBhdCB0aGUgY29ycmVjdCBvZmZzZXQuCi0gICAgICBrZXJuZWxfc3RvcmFnZV8uZ2V0KClbaSArIG9mZnNldF9pZHggKiBrS2VybmVsU2l6ZV0gPSBzaW5jICogd2luZG93OwotICAgIH0KLSAgfQotfQotCi12b2lkIEludGVybGVhdmVkU2luY1Jlc2FtcGxlcjo6UXVldWVCdWZmZXIoCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxCdWZmZXI+JiBidWZmZXIpIHsKLSAgRENIRUNLKGJ1ZmZlcik7Ci0gIERDSEVDSyhDYW5RdWV1ZUJ1ZmZlcigpKTsKLQotICBpZiAoIXBlbmRpbmdfYnVmZmVyc18uZW1wdHkoKSAmJiBwZW5kaW5nX2J1ZmZlcnNfLmJhY2soKS0+SXNFbmRPZlN0cmVhbSgpKSB7Ci0gICAgRENIRUNLKGJ1ZmZlci0+SXNFbmRPZlN0cmVhbSgpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoIWJ1ZmZlci0+SXNFbmRPZlN0cmVhbSgpKSB7Ci0gICAgZnJhbWVzX3F1ZXVlZF8gKz0gYnVmZmVyLT5HZXREYXRhU2l6ZSgpIC8gZnJhbWVfc2l6ZV9pbl9ieXRlc187Ci0gIH0KLQotICBwZW5kaW5nX2J1ZmZlcnNfLnB1c2goYnVmZmVyKTsKLX0KLQotYm9vbCBJbnRlcmxlYXZlZFNpbmNSZXNhbXBsZXI6OlJlc2FtcGxlKGZsb2F0KiBkZXN0aW5hdGlvbiwgaW50IGZyYW1lcykgewotICBpZiAoIUhhc0Vub3VnaERhdGEoZnJhbWVzKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGludCByZW1haW5pbmdfZnJhbWVzID0gZnJhbWVzOwotCi0gIC8vIFN0ZXAgKDEpIC0tIFByaW1lIHRoZSBpbnB1dCBidWZmZXIgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBzdHJlYW0uCi0gIGlmICghYnVmZmVyX3ByaW1lZF8pIHsKLSAgICBSZWFkKHIwXywga0Jsb2NrU2l6ZSArIGtLZXJuZWxTaXplIC8gMik7Ci0gICAgYnVmZmVyX3ByaW1lZF8gPSB0cnVlOwotICB9Ci0KLSAgLy8gU3RlcCAoMikgLS0gUmVzYW1wbGUhCi0gIHdoaWxlIChyZW1haW5pbmdfZnJhbWVzKSB7Ci0gICAgd2hpbGUgKHZpcnR1YWxfc291cmNlX2lkeF8gPCBrQmxvY2tTaXplKSB7Ci0gICAgICAvLyB8dmlydHVhbF9zb3VyY2VfaWR4X3wgbGllcyBpbiBiZXR3ZWVuIHR3byBrZXJuZWwgb2Zmc2V0cyBzbyBmaWd1cmUgb3V0Ci0gICAgICAvLyB3aGF0IHRoZXkgYXJlLgotICAgICAgaW50IHNvdXJjZV9pZHggPSBzdGF0aWNfY2FzdDxpbnQ+KHZpcnR1YWxfc291cmNlX2lkeF8pOwotICAgICAgZG91YmxlIHN1YnNhbXBsZV9yZW1haW5kZXIgPSB2aXJ0dWFsX3NvdXJjZV9pZHhfIC0gc291cmNlX2lkeDsKLQotICAgICAgZG91YmxlIHZpcnR1YWxfb2Zmc2V0X2lkeCA9IHN1YnNhbXBsZV9yZW1haW5kZXIgKiBrS2VybmVsT2Zmc2V0Q291bnQ7Ci0gICAgICBpbnQgb2Zmc2V0X2lkeCA9IHN0YXRpY19jYXN0PGludD4odmlydHVhbF9vZmZzZXRfaWR4KTsKLQotICAgICAgLy8gV2UnbGwgY29tcHV0ZSAiY29udm9sdXRpb25zIiBmb3IgdGhlIHR3byBrZXJuZWxzIHdoaWNoIHN0cmFkZGxlCi0gICAgICAvLyB8dmlydHVhbF9zb3VyY2VfaWR4X3wuCi0gICAgICBmbG9hdCogazEgPSBrZXJuZWxfc3RvcmFnZV8uZ2V0KCkgKyBvZmZzZXRfaWR4ICoga0tlcm5lbFNpemU7Ci0gICAgICBmbG9hdCogazIgPSBrMSArIGtLZXJuZWxTaXplOwotCi0gICAgICAvLyBJbml0aWFsaXplIGlucHV0IHBvaW50ZXIgYmFzZWQgb24gcXVhbnRpemVkIHx2aXJ0dWFsX3NvdXJjZV9pZHhffC4KLSAgICAgIGZsb2F0KiBpbnB1dF9wdHIgPSByMV8gKyBzb3VyY2VfaWR4ICogY2hhbm5lbF9jb3VudF87Ci0KLSAgICAgIC8vIEZpZ3VyZSBvdXQgaG93IG11Y2ggdG8gd2VpZ2h0IGVhY2gga2VybmVsJ3MgImNvbnZvbHV0aW9uIi4KLSAgICAgIGRvdWJsZSBrZXJuZWxfaW50ZXJwb2xhdGlvbl9mYWN0b3IgPSB2aXJ0dWFsX29mZnNldF9pZHggLSBvZmZzZXRfaWR4OwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFubmVsX2NvdW50XzsgKytpKSB7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0KLSAgICAgICAgICAgIENvbnZvbHZlKGlucHV0X3B0ciArIGksIGsxLCBrMiwga2VybmVsX2ludGVycG9sYXRpb25fZmFjdG9yKTsKLSAgICAgIH0KLQotICAgICAgLy8gQWR2YW5jZSB0aGUgdmlydHVhbCBpbmRleC4KLSAgICAgIHZpcnR1YWxfc291cmNlX2lkeF8gKz0gaW9fc2FtcGxlX3JhdGVfcmF0aW9fOwotCi0gICAgICBpZiAoIS0tcmVtYWluaW5nX2ZyYW1lcykgewotICAgICAgICBmcmFtZXNfcmVzYW1wbGVkXyArPSBmcmFtZXM7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFdyYXAgYmFjayBhcm91bmQgdG8gdGhlIHN0YXJ0LgotICAgIHZpcnR1YWxfc291cmNlX2lkeF8gLT0ga0Jsb2NrU2l6ZTsKLQotICAgIC8vIFN0ZXAgKDMpIENvcHkgcjNfIHRvIHIxXyBhbmQgcjRfIHRvIHIyXy4KLSAgICAvLyBUaGlzIHdyYXBzIHRoZSBsYXN0IGlucHV0IGZyYW1lcyBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyLgotICAgIG1lbWNweShyMV8sIHIzXywgZnJhbWVfc2l6ZV9pbl9ieXRlc18gKiAoa0tlcm5lbFNpemUgLyAyKSk7Ci0gICAgbWVtY3B5KHIyXywgcjRfLCBmcmFtZV9zaXplX2luX2J5dGVzXyAqIChrS2VybmVsU2l6ZSAvIDIpKTsKLQotICAgIC8vIFN0ZXAgKDQpCi0gICAgLy8gUmVmcmVzaCB0aGUgYnVmZmVyIHdpdGggbW9yZSBpbnB1dC4KLSAgICBSZWFkKHI1Xywga0Jsb2NrU2l6ZSk7Ci0gIH0KLQotICBOT1RSRUFDSEVEKCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBJbnRlcmxlYXZlZFNpbmNSZXNhbXBsZXI6OkZsdXNoKCkgewotICB2aXJ0dWFsX3NvdXJjZV9pZHhfID0gMDsKLSAgYnVmZmVyX3ByaW1lZF8gPSBmYWxzZTsKLSAgbWVtc2V0KGlucHV0X2J1ZmZlcl8uZ2V0KCksIDAsIGZyYW1lX3NpemVfaW5fYnl0ZXNfICoga0J1ZmZlclNpemUpOwotICB3aGlsZSAoIXBlbmRpbmdfYnVmZmVyc18uZW1wdHkoKSkgewotICAgIHBlbmRpbmdfYnVmZmVyc18ucG9wKCk7Ci0gIH0KLSAgb2Zmc2V0X2luX2ZyYW1lc18gPSAwOwotICBmcmFtZXNfcmVzYW1wbGVkXyA9IDA7Ci0gIGZyYW1lc19xdWV1ZWRfID0gMDsKLX0KLQotYm9vbCBJbnRlcmxlYXZlZFNpbmNSZXNhbXBsZXI6OkNhblF1ZXVlQnVmZmVyKCkgY29uc3QgewotICBpZiAocGVuZGluZ19idWZmZXJzXy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaWYgKHBlbmRpbmdfYnVmZmVyc18uYmFjaygpLT5Jc0VuZE9mU3RyZWFtKCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHBlbmRpbmdfYnVmZmVyc18uc2l6ZSgpIDwga01heGltdW1QZW5kaW5nQnVmZmVyczsKLX0KLQotYm9vbCBJbnRlcmxlYXZlZFNpbmNSZXNhbXBsZXI6OlJlYWNoZWRFT1MoKSBjb25zdCB7Ci0gIGlmIChwZW5kaW5nX2J1ZmZlcnNfLmVtcHR5KCkgfHwgIXBlbmRpbmdfYnVmZmVyc18uYmFjaygpLT5Jc0VuZE9mU3RyZWFtKCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIGZyYW1lc19yZXNhbXBsZWRfICogaW9fc2FtcGxlX3JhdGVfcmF0aW9fID49IGZyYW1lc19xdWV1ZWRfOwotfQotCi1ib29sIEludGVybGVhdmVkU2luY1Jlc2FtcGxlcjo6SGFzRW5vdWdoRGF0YShpbnQgZnJhbWVzX3RvX3Jlc2FtcGxlKSBjb25zdCB7Ci0gIC8vIEFsd2F5cyByZXR1cm4gdHJ1ZSBpZiBFT1MgaXMgc2VlbiwgYXMgaW4gdGhpcyBjYXNlIHdlIHdpbGwganVzdCBmaWxsIDAuCi0gIGlmICghcGVuZGluZ19idWZmZXJzXy5lbXB0eSgpICYmIHBlbmRpbmdfYnVmZmVyc18uYmFjaygpLT5Jc0VuZE9mU3RyZWFtKCkpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vIFdlIGhhdmUgdG8gZGVjcmVhc2UgZnJhbWVzX3F1ZXVlZF8gZG93biBhcyB0aGUgUmVhZCgpcyBhcmUgYWx3YXlzIGRvbmUgaW4KLSAgLy8gYmxvY2tzIG9mIGtCbG9ja1NpemUgb3Iga0J1ZmZlclNpemUuIFdlIGhhdmUgdG8gZW5zdXJlIHRoYXQgdGhlcmUgaXMgYnVmZmVyCi0gIC8vIGZvciBhbiBleHRyYSBSZWFkKCkuCi0gIHJldHVybiAoZnJhbWVzX3Jlc2FtcGxlZF8gKyBmcmFtZXNfdG9fcmVzYW1wbGUpICogaW9fc2FtcGxlX3JhdGVfcmF0aW9fIDwKLSAgICAgICAgIGZyYW1lc19xdWV1ZWRfIC0ga0J1ZmZlclNpemU7Ci19Ci0KLXZvaWQgSW50ZXJsZWF2ZWRTaW5jUmVzYW1wbGVyOjpSZWFkKGZsb2F0KiBkZXN0aW5hdGlvbiwgaW50IGZyYW1lcykgewotICB3aGlsZSAoZnJhbWVzID4gMCAmJiAhcGVuZGluZ19idWZmZXJzXy5lbXB0eSgpKSB7Ci0gICAgc2NvcGVkX3JlZnB0cjxCdWZmZXI+IGJ1ZmZlciA9IHBlbmRpbmdfYnVmZmVyc18uZnJvbnQoKTsKLSAgICBpZiAoYnVmZmVyLT5Jc0VuZE9mU3RyZWFtKCkpIHsKLSAgICAgIC8vIFplcm8gZmlsbCB0aGUgYnVmZmVyIGFmdGVyIEVPUyBoYXMgcmVhY2hlZC4KLSAgICAgIG1lbXNldChkZXN0aW5hdGlvbiwgMCwgZnJhbWVfc2l6ZV9pbl9ieXRlc18gKiBmcmFtZXMpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBDb3B5IHRoZSBkYXRhIG92ZXIuCi0gICAgaW50IGZyYW1lc19pbl9idWZmZXIgPSBidWZmZXItPkdldERhdGFTaXplKCkgLyBmcmFtZV9zaXplX2luX2J5dGVzXzsKLSAgICBpbnQgZnJhbWVzX3RvX2NvcHkgPSBzdGQ6Om1pbihmcmFtZXNfaW5fYnVmZmVyIC0gb2Zmc2V0X2luX2ZyYW1lc18sIGZyYW1lcyk7Ci0gICAgY29uc3QgdWludDgqIHNvdXJjZSA9IGJ1ZmZlci0+R2V0RGF0YSgpOwotICAgIHNvdXJjZSArPSBmcmFtZV9zaXplX2luX2J5dGVzXyAqIG9mZnNldF9pbl9mcmFtZXNfOwotICAgIG1lbWNweShkZXN0aW5hdGlvbiwgc291cmNlLCBmcmFtZV9zaXplX2luX2J5dGVzXyAqIGZyYW1lc190b19jb3B5KTsKLSAgICBvZmZzZXRfaW5fZnJhbWVzXyArPSBmcmFtZXNfdG9fY29weTsKLSAgICAvLyBQb3AgdGhlIGZpcnN0IGJ1ZmZlciBpZiBhbGwgaXRzIGNvbnRlbnQgaGFzIGJlZW4gcmVhZC4KLSAgICBpZiAob2Zmc2V0X2luX2ZyYW1lc18gPT0gZnJhbWVzX2luX2J1ZmZlcikgewotICAgICAgb2Zmc2V0X2luX2ZyYW1lc18gPSAwOwotICAgICAgcGVuZGluZ19idWZmZXJzXy5wb3AoKTsKLSAgICB9Ci0gICAgZnJhbWVzIC09IGZyYW1lc190b19jb3B5OwotICAgIGRlc3RpbmF0aW9uICs9IGZyYW1lc190b19jb3B5ICogY2hhbm5lbF9jb3VudF87Ci0gIH0KLQotICAvLyBSZWFkIHNob3VsZCBhbHdheXMgYmUgc2F0aXNmaWVkIGFzIG90aGVyd2lzZSBSZXNhbXBsZSBzaG91bGQgcmV0dXJuIGZhbHNlCi0gIC8vIHRvIHRoZSBjYWxsZXIgZGlyZWN0bHkuCi0gIERDSEVDS19FUShmcmFtZXMsIDApOwotfQotCi1mbG9hdCBJbnRlcmxlYXZlZFNpbmNSZXNhbXBsZXI6OkNvbnZvbHZlKGNvbnN0IGZsb2F0KiBpbnB1dF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBrMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGsyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUga2VybmVsX2ludGVycG9sYXRpb25fZmFjdG9yKSB7Ci0gIGZsb2F0IHN1bTEgPSAwOwotICBmbG9hdCBzdW0yID0gMDsKLQotICAvLyBHZW5lcmF0ZSBhIHNpbmdsZSBvdXRwdXQgc2FtcGxlLiAgVW5yb2xsaW5nIHRoaXMgbG9vcCBodXJ0IHBlcmZvcm1hbmNlIGluCi0gIC8vIGxvY2FsIHRlc3RpbmcuCi0gIGludCBuID0ga0tlcm5lbFNpemU7Ci0gIHdoaWxlIChuLS0pIHsKLSAgICBzdW0xICs9ICppbnB1dF9wdHIgKiAqazErKzsKLSAgICBzdW0yICs9ICppbnB1dF9wdHIgKiAqazIrKzsKLSAgICBpbnB1dF9wdHIgKz0gY2hhbm5lbF9jb3VudF87Ci0gIH0KLQotICAvLyBMaW5lYXJseSBpbnRlcnBvbGF0ZSB0aGUgdHdvICJjb252b2x1dGlvbnMiLgotICByZXR1cm4gKDEuMCAtIGtlcm5lbF9pbnRlcnBvbGF0aW9uX2ZhY3RvcikgKiBzdW0xICsKLSAgICAgICAgIGtlcm5lbF9pbnRlcnBvbGF0aW9uX2ZhY3RvciAqIHN1bTI7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvaW50ZXJsZWF2ZWRfc2luY19yZXNhbXBsZXIuaCBiL3NyYy9tZWRpYS9iYXNlL2ludGVybGVhdmVkX3NpbmNfcmVzYW1wbGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZmRhZGEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvaW50ZXJsZWF2ZWRfc2luY19yZXNhbXBsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0JBU0VfSU5URVJMRUFWRURfU0lOQ19SRVNBTVBMRVJfSF8KLSNkZWZpbmUgTUVESUFfQkFTRV9JTlRFUkxFQVZFRF9TSU5DX1JFU0FNUExFUl9IXwotCi0jaW5jbHVkZSA8cXVldWU+Ci0KLSNpbmNsdWRlICJiYXNlL21lbW9yeS9hbGlnbmVkX21lbW9yeS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYnVmZmVycy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIEludGVybGVhdmVkU2luY1Jlc2FtcGxlciBpcyBhIGhpZ2gtcXVhbGl0eSBpbnRlcmxlYXZlZCBtdWx0aS1jaGFubmVsIHNhbXBsZQotLy8tcmF0ZSBjb252ZXJ0ZXIgb3BlcmF0aW5nIG9uIHNhbXBsZXMgaW4gZmxvYXQuIEl0IHVzZXMgdGhlIHNhbWUgYWxnb3JpdGhtIGFzCi0vLyBTaW5jUmVzYW1wbGVyLiBVbmxpa2UgU2luY1Jlc2FtcGxlciwgaXQgd29ya3MgaW4gcHVzaCBtb2RlIGluc3RlYWQgb2YgcHVsbAotLy8gbW9kZS4KLWNsYXNzIE1FRElBX0VYUE9SVCBJbnRlcmxlYXZlZFNpbmNSZXNhbXBsZXIgewotIHB1YmxpYzoKLSAgLy8gfGlvX3NhbXBsZV9yYXRlX3JhdGlvfCBpcyB0aGUgcmF0aW8gb2YgaW5wdXQgLyBvdXRwdXQgc2FtcGxlIHJhdGVzLgotICAvLyB8Y2hhbm5lbF9jb3VudHwgaXMgdGhlIG51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgaW50ZXJsZWF2ZWQgYXVkaW8gc3RyZWFtLgotICBJbnRlcmxlYXZlZFNpbmNSZXNhbXBsZXIoZG91YmxlIGlvX3NhbXBsZV9yYXRlX3JhdGlvLCBpbnQgY2hhbm5lbF9jb3VudCk7Ci0KLSAgLy8gQXBwZW5kIGEgYnVmZmVyIHRvIHRoZSBxdWV1ZS4gVGhlIHNhbXBsZXMgaW4gdGhlIGJ1ZmZlciBoYXMgdG8gYmUgZmxvYXRzLgotICB2b2lkIFF1ZXVlQnVmZmVyKGNvbnN0IHNjb3BlZF9yZWZwdHI8QnVmZmVyPiYgYnVmZmVyKTsKLQotICAvLyBSZXNhbXBsZSB8ZnJhbWVzfCBvZiBkYXRhIGZyb20gZW5xdWV1ZWQgYnVmZmVycy4gIFJldHVybiBmYWxzZSBpZiBubyBzYW1wbGUKLSAgLy8gaXMgcmVhZC4gIFJldHVybiB0cnVlIGlmIGFsbCByZXF1ZXN0ZWQgc2FtcGxlcyBoYXZlIGJlZW4gd3JpdHRlbiBpbnRvCi0gIC8vIHxkZXN0aW5hdGlvbnwuICBJdCB3aWxsIG5ldmVyIGRvIGEgcGFydGlhbCByZWFkLiAgQWZ0ZXIgdGhlIHN0cmVhbSByZWFjaGVzCi0gIC8vIHRoZSBlbmQsIHRoZSBmdW5jdGlvbiB3aWxsIGZpbGwgdGhlIHJlc3Qgb2YgYnVmZmVyIHdpdGggMC4KLSAgYm9vbCBSZXNhbXBsZShmbG9hdCogZGVzdGluYXRpb24sIGludCBmcmFtZXMpOwotCi0gIC8vIEZsdXNoIGFsbCBidWZmZXJlZCBkYXRhIGFuZCByZXNldCBpbnRlcm5hbCBpbmRpY2VzLgotICB2b2lkIEZsdXNoKCk7Ci0KLSAgLy8gUmV0dXJuIGZhbHNlIGlmIHdlIHNob3VsZG4ndCBxdWV1ZSBtb3JlIGJ1ZmZlcnMgdG8gdGhlIHJlc2FtcGxlci4KLSAgYm9vbCBDYW5RdWV1ZUJ1ZmZlcigpIGNvbnN0OwotCi0gIC8vIFJldHVybmluZyB0cnVlIHdoZW4gd2Ugc3RhcnQgdG8gcmV0dXJuIHplcm8gZmlsbGVkIGRhdGEgYmVjYXVzZSBvZiBFT1MuCi0gIGJvb2wgUmVhY2hlZEVPUygpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgdm9pZCBJbml0aWFsaXplS2VybmVsKCk7Ci0gIGJvb2wgSGFzRW5vdWdoRGF0YShpbnQgZnJhbWVzX3RvX3Jlc2FtcGxlKSBjb25zdDsKLSAgdm9pZCBSZWFkKGZsb2F0KiBkZXN0aW5hdGlvbiwgaW50IGZyYW1lcyk7Ci0KLSAgZmxvYXQgQ29udm9sdmUoY29uc3QgZmxvYXQqIGlucHV0X3B0ciwKLSAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGsxLAotICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogazIsCi0gICAgICAgICAgICAgICAgIGRvdWJsZSBrZXJuZWxfaW50ZXJwb2xhdGlvbl9mYWN0b3IpOwotCi0gIC8vIFRoZSByYXRpbyBvZiBpbnB1dCAvIG91dHB1dCBzYW1wbGUgcmF0ZXMuCi0gIGRvdWJsZSBpb19zYW1wbGVfcmF0ZV9yYXRpb187Ci0KLSAgLy8gQW4gaW5kZXggb24gdGhlIHNvdXJjZSBpbnB1dCBidWZmZXIgd2l0aCBzdWItc2FtcGxlIHByZWNpc2lvbi4gIEl0IG11c3QgYmUKLSAgLy8gZG91YmxlIHByZWNpc2lvbiB0byBhdm9pZCBkcmlmdC4KLSAgZG91YmxlIHZpcnR1YWxfc291cmNlX2lkeF87Ci0KLSAgLy8gVGhlIGJ1ZmZlciBpcyBwcmltZWQgb25jZSBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2YgcHJvY2Vzc2luZy4KLSAgYm9vbCBidWZmZXJfcHJpbWVkXzsKLQotICAvLyBOdW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMuCi0gIGludCBjaGFubmVsX2NvdW50XzsKLQotICAvLyBUaGUgc2l6ZSBvZiBieXRlcyBmb3IgYW4gYXVkaW8gZnJhbWUuCi0gIGNvbnN0IGludCBmcmFtZV9zaXplX2luX2J5dGVzXzsKLQotICAvLyBDb250YWlucyBrS2VybmVsT2Zmc2V0Q291bnQga2VybmVscyBiYWNrLXRvLWJhY2ssIGVhY2ggb2Ygc2l6ZSBrS2VybmVsU2l6ZS4KLSAgLy8gVGhlIGtlcm5lbCBvZmZzZXRzIGFyZSBzdWItc2FtcGxlIHNoaWZ0cyBvZiBhIHdpbmRvd2VkIHNpbmMgc2hpZnRlZCBmcm9tCi0gIC8vIDAuMCB0byAxLjAgc2FtcGxlLgotICBzY29wZWRfcHRyX21hbGxvYzxmbG9hdCwgYmFzZTo6U2NvcGVkUHRyQWxpZ25lZEZyZWU+IGtlcm5lbF9zdG9yYWdlXzsKLQotICAvLyBEYXRhIGZyb20gdGhlIHNvdXJjZSBpcyBjb3BpZWQgaW50byB0aGlzIGJ1ZmZlciBmb3IgZWFjaCBwcm9jZXNzaW5nIHBhc3MuCi0gIHNjb3BlZF9wdHJfbWFsbG9jPGZsb2F0LCBiYXNlOjpTY29wZWRQdHJBbGlnbmVkRnJlZT4gaW5wdXRfYnVmZmVyXzsKLQotICAvLyBBIHF1ZXVlIG9mIGJ1ZmZlcnMgdG8gYmUgcmVzYW1wbGVkLgotICBzdGQ6OnF1ZXVlPHNjb3BlZF9yZWZwdHI8QnVmZmVyPiA+IHBlbmRpbmdfYnVmZmVyc187Ci0KLSAgLy8gVGhlIGN1cnJlbnQgb2Zmc2V0IHRvIHJlYWQgd2hlbiByZWFkaW5nIGZyb20gdGhlIGZpcnN0IHBlbmRpbmcgYnVmZmVyLgotICBpbnQgb2Zmc2V0X2luX2ZyYW1lc187Ci0KLSAgLy8gVGhlIGZvbGxvd2luZyB0d28gdmFyaWFibGVzIGFyZSB1c2VkIHRvIGNhbGN1bGF0ZSBFT1MgYW5kIGluIEhhc0Vub3VnaERhdGEuCi0gIGludCBmcmFtZXNfcmVzYW1wbGVkXzsKLSAgaW50IGZyYW1lc19xdWV1ZWRfOwotCi0gIC8vIFBvaW50ZXJzIHRvIHRoZSB2YXJpb3VzIHJlZ2lvbnMgaW5zaWRlIHxpbnB1dF9idWZmZXJffC4gIFNlZSB0aGUgZGlhZ3JhbSBhdAotICAvLyB0aGUgdG9wIG9mIHRoZSAuY2MgZmlsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgZmxvYXQqIGNvbnN0IHIwXzsKLSAgZmxvYXQqIGNvbnN0IHIxXzsKLSAgZmxvYXQqIGNvbnN0IHIyXzsKLSAgZmxvYXQqIGNvbnN0IHIzXzsKLSAgZmxvYXQqIGNvbnN0IHI0XzsKLSAgZmxvYXQqIGNvbnN0IHI1XzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oSW50ZXJsZWF2ZWRTaW5jUmVzYW1wbGVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0JBU0VfSU5URVJMRUFWRURfU0lOQ19SRVNBTVBMRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL2ludGVybGVhdmVkX3NpbmNfcmVzYW1wbGVyX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2Jhc2UvaW50ZXJsZWF2ZWRfc2luY19yZXNhbXBsZXJfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZjJlMTUuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvaW50ZXJsZWF2ZWRfc2luY19yZXNhbXBsZXJfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPG1hdGguaD4KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2ludGVybGVhdmVkX3NpbmNfcmVzYW1wbGVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaW5jX3Jlc2FtcGxlci5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1uYW1lc3BhY2UgewotCi0vLyBVc2VkIHRvIGNvbXBhcmUgaWYgdHdvIHNhbXBsZXMgYXJlIHRoZSBzYW1lLiBCZWNhdXNlIHRoZSByZXNhbXBsZWQgcmVzdWx0Ci0vLyBmcm9tIHRoZSBTaW5jUmVzYW1wbGVyIGFuZCB0aGUgSW50ZXJsZWF2ZWRTaW5jUmVzYW1wbGVyIGNhbiBiZSBzbGlnaHRseQotLy8gZGlmZmVyZW50IGFzIHRoZSBmaXJzdCBvbmUgbWF5IHVzZSB0aGUgU1NFIENvbnZvbHZlIGZ1bmN0aW9uLgotY29uc3QgZmxvYXQga0Vwc2lsb24gPSAwLjAwMDFmOwotCi1ib29sIEFyZVNhbXBsZXNTYW1lKGZsb2F0IHNhbXBsZTEsIGZsb2F0IHNhbXBsZTIpIHsKLSAgcmV0dXJuIGZhYnMoc2FtcGxlMSAtIHNhbXBsZTIpIDwga0Vwc2lsb247Ci19Ci0KLS8vIEZ1bmN0aW9uIHRvIHByb3ZpZGUgdGhlIGF1ZGlvIGRhdGEgb2YgYSBzaW5nbGUgY2hhbm5lbCBpbmRpY2F0ZWQgYnkKLS8vIHxjaGFubmVsX2luZGV4fCBpbnNpZGUgYSBtdWx0aSBjaGFubmVsIGF1ZGlvIHN0cmVhbSB0byBTaW5jUmVzYW1wbGVyLgotdm9pZCBSZWFkQ0IoY29uc3QgZmxvYXQqIHNvdXJjZSwKLSAgICAgICAgICAgIGNvbnN0IGludCBzb3VyY2Vfc2l6ZSwKLSAgICAgICAgICAgIGludCBjaGFubmVsX2luZGV4LAotICAgICAgICAgICAgaW50IGNoYW5uZWxfY291bnQsCi0gICAgICAgICAgICBpbnQqIG9mZnNldCwKLSAgICAgICAgICAgIGZsb2F0KiBkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgIGludCBzYW1wbGVzKSB7Ci0gIGludCBzYW1wbGVzX3RvX2NvcHkgPSBzdGQ6Om1pbihzb3VyY2Vfc2l6ZSAtICpvZmZzZXQsIHNhbXBsZXMpOwotICBzYW1wbGVzIC09IHNhbXBsZXNfdG9fY29weTsKLQotICB3aGlsZSAoc2FtcGxlc190b19jb3B5ICE9IDApIHsKLSAgICAqZGVzdGluYXRpb24rKyA9IHNvdXJjZVsqb2Zmc2V0ICogY2hhbm5lbF9jb3VudCArIGNoYW5uZWxfaW5kZXhdOwotICAgIC0tc2FtcGxlc190b19jb3B5OwotICAgICsrKm9mZnNldDsKLSAgfQotICBpZiAoc2FtcGxlcyAhPSAwKSB7Ci0gICAgbWVtc2V0KGRlc3RpbmF0aW9uLCAwLCBzaXplb2YoZmxvYXQpICogc2FtcGxlcyk7Ci0gIH0KLX0KLQotY2xhc3MgVGVzdEJ1ZmZlciA6IHB1YmxpYyBCdWZmZXIgewotIHB1YmxpYzoKLSAgVGVzdEJ1ZmZlcihjb25zdCB2b2lkKiBkYXRhLCBpbnQgZGF0YV9zaXplKQotICAgICAgOiBCdWZmZXIoYmFzZTo6VGltZURlbHRhKCksIGJhc2U6OlRpbWVEZWx0YSgpKSwKLSAgICAgICAgZGF0YV8oc3RhdGljX2Nhc3Q8Y29uc3QgdWludDgqPihkYXRhKSksCi0gICAgICAgIGRhdGFfc2l6ZV8oZGF0YV9zaXplKSB7fQotCi0gIGNvbnN0IHVpbnQ4KiBHZXREYXRhKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gZGF0YV87IH0KLQotICBpbnQgR2V0RGF0YVNpemUoKSBjb25zdCBPVkVSUklERSB7IHJldHVybiBkYXRhX3NpemVfOyB9Ci0KLSBwcml2YXRlOgotICBjb25zdCB1aW50OCogZGF0YV87Ci0gIGludCBkYXRhX3NpemVfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLVRFU1QoSW50ZXJsZWF2ZWRTaW5jUmVzYW1wbGVyVGVzdCwgSW5pdGlhbFN0YXRlKSB7Ci0gIEludGVybGVhdmVkU2luY1Jlc2FtcGxlciBpbnRlcmxlYXZlZF9yZXNhbXBsZXIoMSwgMSk7Ci0gIGZsb2F0IG91dHB1dFsxXTsKLQotICBBU1NFUlRfRkFMU0UoaW50ZXJsZWF2ZWRfcmVzYW1wbGVyLlJlYWNoZWRFT1MoKSk7Ci0gIEFTU0VSVF9UUlVFKGludGVybGVhdmVkX3Jlc2FtcGxlci5DYW5RdWV1ZUJ1ZmZlcigpKTsKLSAgQVNTRVJUX0ZBTFNFKGludGVybGVhdmVkX3Jlc2FtcGxlci5SZXNhbXBsZShvdXRwdXQsIDEpKTsKLX0KLQotVEVTVChJbnRlcmxlYXZlZFNpbmNSZXNhbXBsZXJUZXN0LCBSZWFkKSB7Ci0gIGNvbnN0IGludCBrSW5wdXRGcmFtZXMgPSAxMDI0OwotICBjb25zdCBpbnQga091dHB1dEZyYW1lcyA9IGtJbnB1dEZyYW1lcyAqIDI7Ci0gIGZsb2F0IHNhbXBsZXNba0lucHV0RnJhbWVzXSA9IHswLjB9OwotICBmbG9hdCBvdXRwdXRba091dHB1dEZyYW1lc107Ci0KLSAgSW50ZXJsZWF2ZWRTaW5jUmVzYW1wbGVyIGludGVybGVhdmVkX3Jlc2FtcGxlcigKLSAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4oa0lucHV0RnJhbWVzKSAvIGtPdXRwdXRGcmFtZXMsIDEpOwotCi0gIGludGVybGVhdmVkX3Jlc2FtcGxlci5RdWV1ZUJ1ZmZlcihuZXcgVGVzdEJ1ZmZlcihzYW1wbGVzLCBzaXplb2Yoc2FtcGxlcykpKTsKLSAgQVNTRVJUX0ZBTFNFKGludGVybGVhdmVkX3Jlc2FtcGxlci5SZXNhbXBsZShvdXRwdXQsIGtPdXRwdXRGcmFtZXMgKyAxKSk7Ci0KLSAgd2hpbGUgKGludGVybGVhdmVkX3Jlc2FtcGxlci5DYW5RdWV1ZUJ1ZmZlcigpKSB7Ci0gICAgaW50ZXJsZWF2ZWRfcmVzYW1wbGVyLlF1ZXVlQnVmZmVyKG5ldyBUZXN0QnVmZmVyKHNhbXBsZXMsIHNpemVvZihzYW1wbGVzKSkpOwotICB9Ci0KLSAgLy8gVGhlcmUgaXMgcmVhbGx5IG5vIGd1YXJhbnRlZSB0aGF0IHdlIGNhbiByZWFkIG1vcmUuCi0gIEFTU0VSVF9UUlVFKGludGVybGVhdmVkX3Jlc2FtcGxlci5SZXNhbXBsZShvdXRwdXQsIDEpKTsKLX0KLQotVEVTVChJbnRlcmxlYXZlZFNpbmNSZXNhbXBsZXJUZXN0LCBSZWFjaGVkRU9TKSB7Ci0gIGNvbnN0IGludCBrSW5wdXRGcmFtZXMgPSA1MTIgKiAzICsgMzI7Ci0gIGNvbnN0IGludCBrT3V0cHV0RnJhbWVzID0ga0lucHV0RnJhbWVzICogMjsKLSAgZmxvYXQgaW5wdXRba0lucHV0RnJhbWVzXSA9IHswLjB9OwotCi0gIEludGVybGVhdmVkU2luY1Jlc2FtcGxlciBpbnRlcmxlYXZlZF9yZXNhbXBsZXIoCi0gICAgICBzdGF0aWNfY2FzdDxkb3VibGU+KGtJbnB1dEZyYW1lcykgLyBrT3V0cHV0RnJhbWVzLCAxKTsKLQotICBpbnRlcmxlYXZlZF9yZXNhbXBsZXIuUXVldWVCdWZmZXIobmV3IFRlc3RCdWZmZXIoaW5wdXQsIHNpemVvZihpbnB1dCkpKTsKLSAgaW50ZXJsZWF2ZWRfcmVzYW1wbGVyLlF1ZXVlQnVmZmVyKG5ldyBUZXN0QnVmZmVyKE5VTEwsIDApKTsgIC8vIEVPUwotCi0gIEFTU0VSVF9GQUxTRShpbnRlcmxlYXZlZF9yZXNhbXBsZXIuUmVhY2hlZEVPUygpKTsKLQotICBmbG9hdCBvdXRwdXRba091dHB1dEZyYW1lc107Ci0KLSAgQVNTRVJUX1RSVUUoaW50ZXJsZWF2ZWRfcmVzYW1wbGVyLlJlc2FtcGxlKG91dHB1dCwga091dHB1dEZyYW1lcyAtIDQpKTsKLSAgQVNTRVJUX0ZBTFNFKGludGVybGVhdmVkX3Jlc2FtcGxlci5SZWFjaGVkRU9TKCkpOwotCi0gIEFTU0VSVF9UUlVFKGludGVybGVhdmVkX3Jlc2FtcGxlci5SZXNhbXBsZShvdXRwdXQsIDQpKTsKLSAgQVNTRVJUX1RSVUUoaW50ZXJsZWF2ZWRfcmVzYW1wbGVyLlJlYWNoZWRFT1MoKSk7Ci19Ci0KLS8vIEFzIEludGVybGVhdmVkU2luY1Jlc2FtcGxlciBpcyBqdXN0IHRoZSBpbnRlcmxlYXZlZCB2ZXJzaW9uIG9mIFNpbmNSZXNhbXBsZXIsCi0vLyB0aGUgZm9sbG93aW5nIHVuaXQgdGVzdHMganVzdCB0cnkgdG8gdmVyaWZ5IHRoYXQgdGhlIHJlc3VsdHMgb2YgdXNpbmcKLS8vIEludGVybGVhdmVkU2luY1Jlc2FtcGxlciBhcmUgdGhlIHNhbWUgYXMgdXNpbmcgU2luY1Jlc2FtcGxlciBvbiBpbmRpdmlkdWFsCi0vLyBjaGFubmVsLgotVEVTVChJbnRlcmxlYXZlZFNpbmNSZXNhbXBsZXJUZXN0LCBSZXNhbXBsZVNpbmdsZUNoYW5uZWwpIHsKLSAgY29uc3QgaW50IGtJbnB1dEZyYW1lcyA9IDE3MTk7Ci0gIC8vIFJlYWQgdHdpY2Ugb2YgdGhlIGZyYW1lcyBvdXQgdG8gZW5zdXJlIHRoYXQgd2Ugc2F0dXJhdGUgdGhlIGlucHV0IGZyYW1lcy4KLSAgY29uc3QgaW50IGtPdXRwdXRGcmFtZXMgPSBrSW5wdXRGcmFtZXMgKiAyOwotICBjb25zdCBkb3VibGUga1Jlc2FtcGxlUmF0aW8gPSA0NDEwMC4gLyA0ODAwMC47Ci0gIGZsb2F0IGlucHV0W2tJbnB1dEZyYW1lc107Ci0KLSAgLy8gRmlsbGVkIHRoZSBzYW1wbGVzCi0gIGZvciAoaW50IGkgPSAwOyBpIDwga0lucHV0RnJhbWVzOyArK2kpIHsKLSAgICBpbnB1dFtpXSA9IGkgLyBzdGF0aWNfY2FzdDxmbG9hdD4oa0lucHV0RnJhbWVzKTsKLSAgfQotCi0gIGludCBvZmZzZXQgPSAwOwotICBTaW5jUmVzYW1wbGVyIHNpbmNfcmVzYW1wbGVyKAotICAgICAga1Jlc2FtcGxlUmF0aW8sIGJhc2U6OkJpbmQoUmVhZENCLCBpbnB1dCwga0lucHV0RnJhbWVzLCAwLCAxLCAmb2Zmc2V0KSk7Ci0gIEludGVybGVhdmVkU2luY1Jlc2FtcGxlciBpbnRlcmxlYXZlZF9yZXNhbXBsZXIoa1Jlc2FtcGxlUmF0aW8sIDEpOwotCi0gIGludGVybGVhdmVkX3Jlc2FtcGxlci5RdWV1ZUJ1ZmZlcihuZXcgVGVzdEJ1ZmZlcihpbnB1dCwgc2l6ZW9mKGlucHV0KSkpOwotICBpbnRlcmxlYXZlZF9yZXNhbXBsZXIuUXVldWVCdWZmZXIobmV3IFRlc3RCdWZmZXIoTlVMTCwgMCkpOyAgLy8gRU9TCi0KLSAgZmxvYXQgbm9uX2ludGVybGVhdmVkX291dHB1dFtrT3V0cHV0RnJhbWVzXTsKLSAgZmxvYXQgaW50ZXJsZWF2ZWRfb3V0cHV0W2tPdXRwdXRGcmFtZXNdOwotCi0gIHNpbmNfcmVzYW1wbGVyLlJlc2FtcGxlKG5vbl9pbnRlcmxlYXZlZF9vdXRwdXQsIGtPdXRwdXRGcmFtZXMpOwotICBBU1NFUlRfVFJVRSgKLSAgICAgIGludGVybGVhdmVkX3Jlc2FtcGxlci5SZXNhbXBsZShpbnRlcmxlYXZlZF9vdXRwdXQsIGtPdXRwdXRGcmFtZXMpKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IGtPdXRwdXRGcmFtZXM7ICsraSkgewotICAgIEFTU0VSVF9UUlVFKAotICAgICAgICBBcmVTYW1wbGVzU2FtZShub25faW50ZXJsZWF2ZWRfb3V0cHV0W2ldLCBpbnRlcmxlYXZlZF9vdXRwdXRbaV0pKTsKLSAgfQotfQotCi1URVNUKEludGVybGVhdmVkU2luY1Jlc2FtcGxlclRlc3QsIFJlc2FtcGxlTXVsdGlwbGVDaGFubmVscykgewotICBjb25zdCBpbnQga0NoYW5uZWxDb3VudCA9IDM7Ci0gIGNvbnN0IGludCBrSW5wdXRGcmFtZXMgPSA4NzM3OwotICAvLyBSZWFkIHR3aWNlIG9mIHRoZSBmcmFtZXMgb3V0IHRvIGVuc3VyZSB0aGF0IHdlIHNhdHVyYXRlIHRoZSBpbnB1dCBmcmFtZXMuCi0gIGNvbnN0IGludCBrT3V0cHV0RnJhbWVzID0ga0lucHV0RnJhbWVzICogMjsKLSAgY29uc3QgZG91YmxlIGtSZXNhbXBsZVJhdGlvID0gNDQxMDAuIC8gNDgwMDAuOwotICBmbG9hdCBpbnB1dFtrSW5wdXRGcmFtZXMgKiBrQ2hhbm5lbENvdW50XTsKLQotICAvLyBGaWxsZWQgdGhlIGJ1ZmZlciB3aXRoIGRpZmZlcmVudCBzYW1wbGVzIHBlciBmcmFtZSBvbiBkaWZmZXJlbnQgY2hhbm5lbHMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwga0lucHV0RnJhbWVzICoga0NoYW5uZWxDb3VudDsgKytpKSB7Ci0gICAgaW5wdXRbaV0gPSBpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGtJbnB1dEZyYW1lcyAqIGtDaGFubmVsQ291bnQpOwotICB9Ci0KLSAgZmxvYXQgbm9uX2ludGVybGVhdmVkX291dHB1dHNba0NoYW5uZWxDb3VudF1ba0lucHV0RnJhbWVzICogMl07Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQ2hhbm5lbENvdW50OyArK2kpIHsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBTaW5jUmVzYW1wbGVyIHNpbmNfcmVzYW1wbGVyKAotICAgICAgICBrUmVzYW1wbGVSYXRpbywKLSAgICAgICAgYmFzZTo6QmluZChSZWFkQ0IsIGlucHV0LCBrSW5wdXRGcmFtZXMsIGksIGtDaGFubmVsQ291bnQsICZvZmZzZXQpKTsKLSAgICBzaW5jX3Jlc2FtcGxlci5SZXNhbXBsZShub25faW50ZXJsZWF2ZWRfb3V0cHV0c1tpXSwga091dHB1dEZyYW1lcyk7Ci0gIH0KLQotICBJbnRlcmxlYXZlZFNpbmNSZXNhbXBsZXIgaW50ZXJsZWF2ZWRfcmVzYW1wbGVyKGtSZXNhbXBsZVJhdGlvLCBrQ2hhbm5lbENvdW50KTsKLSAgaW50ZXJsZWF2ZWRfcmVzYW1wbGVyLlF1ZXVlQnVmZmVyKG5ldyBUZXN0QnVmZmVyKGlucHV0LCBzaXplb2YoaW5wdXQpKSk7Ci0gIGludGVybGVhdmVkX3Jlc2FtcGxlci5RdWV1ZUJ1ZmZlcihuZXcgVGVzdEJ1ZmZlcihOVUxMLCAwKSk7ICAvLyBFT1MKLQotICBmbG9hdCBpbnRlcmxlYXZlZF9vdXRwdXRba091dHB1dEZyYW1lcyAqIGtDaGFubmVsQ291bnRdOwotCi0gIEFTU0VSVF9UUlVFKAotICAgICAgaW50ZXJsZWF2ZWRfcmVzYW1wbGVyLlJlc2FtcGxlKGludGVybGVhdmVkX291dHB1dCwga091dHB1dEZyYW1lcykpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwga091dHB1dEZyYW1lczsgKytpKSB7Ci0gICAgZm9yIChpbnQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBrQ2hhbm5lbENvdW50OyArK2NoYW5uZWwpIHsKLSAgICAgIEFTU0VSVF9UUlVFKAotICAgICAgICAgIEFyZVNhbXBsZXNTYW1lKG5vbl9pbnRlcmxlYXZlZF9vdXRwdXRzW2NoYW5uZWxdW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybGVhdmVkX291dHB1dFtpICoga0NoYW5uZWxDb3VudCArIGNoYW5uZWxdKSk7Ci0gICAgfQotICB9Ci19Ci0KLVRFU1QoSW50ZXJsZWF2ZWRTaW5jUmVzYW1wbGVyVGVzdCwgQmVuY2htYXJrKSB7Ci0gIGNvbnN0IGludCBrQ2hhbm5lbENvdW50ID0gODsKLSAgY29uc3QgaW50IGtJbnB1dEZyYW1lcyA9IDQ0MTAwOwotICBjb25zdCBpbnQga051bWJlck9mSXRlcmF0aW9ucyA9IDEwMDsKLSAgY29uc3QgaW50IGtPdXRwdXRGcmFtZXMgPSBrSW5wdXRGcmFtZXMgKiAyOwotICBjb25zdCBkb3VibGUga1Jlc2FtcGxlUmF0aW8gPSA0NDEwMC4gLyA0ODAwMC47Ci0gIHN0ZDo6dmVjdG9yPGZsb2F0PiBpbnB1dChrSW5wdXRGcmFtZXMgKiBrQ2hhbm5lbENvdW50KTsKLQotICAvLyBGaWxsZWQgdGhlIGJ1ZmZlciB3aXRoIGRpZmZlcmVudCBzYW1wbGVzIHBlciBmcmFtZSBvbiBkaWZmZXJlbnQgY2hhbm5lbHMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwga0lucHV0RnJhbWVzICoga0NoYW5uZWxDb3VudDsgKytpKSB7Ci0gICAgaW5wdXRbaV0gPSBpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGtJbnB1dEZyYW1lcyAqIGtDaGFubmVsQ291bnQpOwotICB9Ci0KLSAgSW50ZXJsZWF2ZWRTaW5jUmVzYW1wbGVyIGludGVybGVhdmVkX3Jlc2FtcGxlcihrUmVzYW1wbGVSYXRpbywga0NoYW5uZWxDb3VudCk7Ci0KLSAgYmFzZTo6VGltZVRpY2tzIHN0YXJ0ID0gYmFzZTo6VGltZVRpY2tzOjpIaWdoUmVzTm93KCk7Ci0gIHN0ZDo6dmVjdG9yPGZsb2F0PiBpbnRlcmxlYXZlZF9vdXRwdXQoa091dHB1dEZyYW1lcyAqIGtDaGFubmVsQ291bnQpOwotICBpbnQgdG90YWxfb3V0cHV0X2ZyYW1lcyA9IDA7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtYmVyT2ZJdGVyYXRpb25zOyArK2kpIHsKLSAgICBpbnRlcmxlYXZlZF9yZXNhbXBsZXIuUXVldWVCdWZmZXIoCi0gICAgICAgIG5ldyBUZXN0QnVmZmVyKCZpbnB1dFswXSwgc2l6ZW9mKGZsb2F0KSAqIGlucHV0LnNpemUoKSkpOwotICAgIGlmIChpbnRlcmxlYXZlZF9yZXNhbXBsZXIuUmVzYW1wbGUoJmludGVybGVhdmVkX291dHB1dFswXSwga091dHB1dEZyYW1lcykpIHsKLSAgICAgIHRvdGFsX291dHB1dF9mcmFtZXMgKz0ga091dHB1dEZyYW1lczsKLSAgICB9Ci0gIH0KLQotICBkb3VibGUgdG90YWxfdGltZV9jX21zID0KLSAgICAgIChiYXNlOjpUaW1lVGlja3M6OkhpZ2hSZXNOb3coKSAtIHN0YXJ0KS5Jbk1pbGxpc2Vjb25kc0YoKTsKLSAgcHJpbnRmKAotICAgICAgIkJlbmNobWFya2luZyBJbnRlcmxlYXZlZFNpbmNSZXNhbXBsZXIgaW4gJWQgY2hhbm5lbHMgZm9yICVkICIKLSAgICAgICJpdGVyYXRpb25zIHRvb2sgJS40Z21zLlxuOlxuIiwKLSAgICAgIGtDaGFubmVsQ291bnQsIGtOdW1iZXJPZkl0ZXJhdGlvbnMsIHRvdGFsX3RpbWVfY19tcyk7Ci0KLSAgc3RhcnQgPSBiYXNlOjpUaW1lVGlja3M6OkhpZ2hSZXNOb3coKTsKLQotICBpbnQgb2Zmc2V0ID0gMDsKLSAgU2luY1Jlc2FtcGxlciBzaW5jX3Jlc2FtcGxlcigKLSAgICAgIGtSZXNhbXBsZVJhdGlvLAotICAgICAgYmFzZTo6QmluZChSZWFkQ0IsICZpbnB1dFswXSwga0lucHV0RnJhbWVzLCAwLCAxLCAmb2Zmc2V0KSk7Ci0KLSAgd2hpbGUgKHRvdGFsX291dHB1dF9mcmFtZXMgPiAwKSB7Ci0gICAgc2luY19yZXNhbXBsZXIuUmVzYW1wbGUoJmludGVybGVhdmVkX291dHB1dFswXSwga091dHB1dEZyYW1lcyk7Ci0gICAgdG90YWxfb3V0cHV0X2ZyYW1lcyAtPSBrT3V0cHV0RnJhbWVzOwotICAgIC8vIFNldCBvZmZzZXQgdG8gMCBzbyB3ZSdsbCBuZXZlciByZWFjaCBFT1MgdG8gZW5mb3JjZSBhIHNhbXBsZSBieSBzYW1wbGUKLSAgICAvLyBjb3B5IGZvciBldmVyeSBmcmFtZSBhcyBwcmV2aW91c2x5IHdlIGhhdmUgdG8gY29udmVydCBpbnRlcmxlYXZlZCBzdHJlYW0KLSAgICAvLyB0byBub24taW50ZXJsZWF2ZWQgc3RyZWFtIHRvIHVzZSBNdWx0aUNoYW5uZWxSZXNhbXBsZXIgYW5kIHRoZW4gY29udmVydAotICAgIC8vIHRoZSByZXN1bHQgc3RyZWFtIGJhY2sgdG8gaW50ZXJsZWF2ZWQuCi0gICAgb2Zmc2V0ID0gMDsKLSAgfQotCi0gIHRvdGFsX3RpbWVfY19tcyA9IChiYXNlOjpUaW1lVGlja3M6OkhpZ2hSZXNOb3coKSAtIHN0YXJ0KS5Jbk1pbGxpc2Vjb25kc0YoKTsKLSAgcHJpbnRmKAotICAgICAgIkJlbmNobWFya2luZyBTaW5jUmVzYW1wbGVyIHdpdGggb25lIGNoYW5uZWwgZm9yICVkIGl0ZXJhdGlvbnMgdG9vayAiCi0gICAgICAiJS40Z21zLlxuOlxuIiwKLSAgICAgIGtOdW1iZXJPZkl0ZXJhdGlvbnMsIHRvdGFsX3RpbWVfY19tcyk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvbGltaXRzLmggYi9zcmMvbWVkaWEvYmFzZS9saW1pdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VmZjVmNC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9saW1pdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIENvbnRhaW5zIGxpbWl0IGRlZmluaXRpb24gY29uc3RhbnRzIGZvciB0aGUgbWVkaWEgc3Vic3lzdGVtLgotCi0jaWZuZGVmIE1FRElBX0JBU0VfTElNSVRTX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfTElNSVRTX0hfCi0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotbmFtZXNwYWNlIGxpbWl0cyB7Ci0KLWVudW0gewotICAvLyBNYXhpbXVtIHBvc3NpYmxlIGRpbWVuc2lvbiAod2lkdGggb3IgaGVpZ2h0KSBmb3IgYW55IHZpZGVvLgotICBrTWF4RGltZW5zaW9uID0gKDEgPDwgMTUpIC0gMSwgIC8vIDMyNzY3Ci0KLSAgLy8gTWF4aW11bSBwb3NzaWJsZSBjYW52YXMgc2l6ZSAod2lkdGggbXVsdGlwbGllZCBieSBoZWlnaHQpIGZvciBhbnkgdmlkZW8uCi0gIGtNYXhDYW52YXMgPSAoMSA8PCAoMTQgKiAyKSksICAvLyAxNjM4NCB4IDE2Mzg0Ci0KLSAgLy8gVG90YWwgbnVtYmVyIG9mIHZpZGVvIGZyYW1lcyB3aGljaCBhcmUgcG9wdWxhdGluZyBpbiB0aGUgcGlwZWxpbmUuCi0gIGtNYXhWaWRlb0ZyYW1lcyA9IDQsCi0KLSAgLy8gVGhlIGZvbGxvd2luZyBsaW1pdHMgYXJlIHVzZWQgYnkgQXVkaW9QYXJhbWV0ZXJzOjpJc1ZhbGlkKCkuCi0gIC8vCi0gIC8vIEEgZmV3IG5vdGVzIG9uIHNhbXBsZSByYXRlcyBvZiBjb21tb24gZm9ybWF0czoKLSAgLy8gICAtIEFBQyBmaWxlcyBhcmUgbGltaXRlZCB0byA5NiBrSHouCi0gIC8vICAgLSBNUDMgZmlsZXMgYXJlIGxpbWl0ZWQgdG8gNDgga0h6LgotICAvLyAgIC0gVm9yYmlzIHVzZWQgdG8gYmUgbGltaXRlZCB0byA5NiBLSHosIGJ1dCBubyBsb25nZXIgaGFzIHRoYXQKLSAgLy8gICAgIHJlc3RyaWN0aW9uLgotICAvLyAgIC0gTW9zdCBQQyBhdWRpbyBoYXJkd2FyZSBpcyBsaW1pdGVkIHRvIDE5MiBLSHouCi0gIGtNYXhTYW1wbGVSYXRlID0gMTkyMDAwLAotICBrTWluU2FtcGxlUmF0ZSA9IDMwMDAsCi0gIGtNYXhDaGFubmVscyA9IDMyLAotICBrTWF4Qml0c1BlclNhbXBsZSA9IDY0LAotICBrTWF4U2FtcGxlc1BlclBhY2tldCA9IGtNYXhTYW1wbGVSYXRlLAotICBrTWF4UGFja2V0U2l6ZUluQnl0ZXMgPQotICAgICAgKGtNYXhCaXRzUGVyU2FtcGxlIC8gOCkgKiBrTWF4Q2hhbm5lbHMgKiBrTWF4U2FtcGxlc1BlclBhY2tldCwKLQotICAvLyBUaGlzIGxpbWl0IGlzIHVzZWQgYnkgUGFyYW1UcmFpdHM8VmlkZW9DYXB0dXJlUGFyYW1zPi4KLSAga01heEZyYW1lc1BlclNlY29uZCA9IDEwMDAsCi19OwotCi19ICAvLyBuYW1lc3BhY2UgbGltaXRzCi0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0JBU0VfTElNSVRTX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9tZWRpYS5oIGIvc3JjL21lZGlhL2Jhc2UvbWVkaWEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc3Yzc0MC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9tZWRpYS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gQ29udGFpbnMgY29kZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBpbml0aWFsaXppbmcsIG9yIHF1ZXJ5aW5nIHRoZSBzdGF0ZQotLy8gb2YgdGhlIG1lZGlhIGxpYnJhcnkgYXMgYSB3aG9sZS4KLQotI2lmbmRlZiBNRURJQV9CQVNFX01FRElBX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfTUVESUFfSF8KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLWNsYXNzIEZpbGVQYXRoOwotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBBdHRlbXB0cyB0byBpbml0aWFsaXplIHRoZSBtZWRpYSBsaWJyYXJ5IChsb2FkaW5nIERMTHMsIERTT3MsIGV0Yy4pLgotLy8KLS8vIElmIHxtb2R1bGVfZGlyfCBpcyB0aGUgZW1wdHJ5IHN0cmluZywgdGhlbiB0aGUgc3lzdGVtIGRlZmF1bHQgbGlicmFyeSBwYXRocwotLy8gYXJlIHNlYXJjaGVkIGZvciB0aGUgZHluYW1pYyBsaWJyYXJpZXMuICBJZiBhIHxtb2R1bGVfZGlyfCBpcyBwcm92aWRlZCwgdGhlbgotLy8gb25seSB0aGUgc3BlY2lmaWVkIHxtb2R1bGVfZGlyfCB3aWxsIGJlIHNlYXJjaGVkIGZvciB0aGUgZHluYW1pYyBsaWJyYXJpZXMuCi0vLwotLy8gSWYgbXVsdGlwbGUgaW5pdGlhbGl6YXRpb25zIGFyZSBhdHRlbXB0ZWQgd2l0aCBkaWZmZXJlbnQgfG1vZHVsZV9kaXJ8cwotLy8gc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IG9uZSB0byBzdWNjZWVkIHJlbWFpbnMgZWZmZWN0aXZlIGZvciB0aGUgbGlmZXRpbWUKLS8vIG9mIHRoZSBwcm9jZXNzLgotLy8KLS8vIFJldHVybnMgdHJ1ZSBpZiBldmVyeXRoaW5nIHdhcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQsIGZhbHNlIG90aGVyd2lzZS4KLU1FRElBX0VYUE9SVCBib29sIEluaXRpYWxpemVNZWRpYUxpYnJhcnkoY29uc3QgRmlsZVBhdGgmIG1vZHVsZV9kaXIpOwotCi0vLyBIZWxwZXIgZnVuY3Rpb24gZm9yIHVuaXQgdGVzdHMgdG8gYXZvaWQgYm9pbGVyIHBsYXRlIGNvZGUgZXZlcnl3aGVyZS4gVGhpcwotLy8gZnVuY3Rpb24gd2lsbCBjcmFzaCBpZiBpdCBmYWlscyB0byBsb2FkIHRoZSBtZWRpYSBsaWJyYXJ5LiBUaGlzIGVuc3VyZXMgdGVzdHMKLS8vIGZhaWwgaWYgdGhlIG1lZGlhIGxpYnJhcnkgaXMgbm90IGF2YWlsYWJsZS4KLU1FRElBX0VYUE9SVCB2b2lkIEluaXRpYWxpemVNZWRpYUxpYnJhcnlGb3JUZXN0aW5nKCk7Ci0KLS8vIFVzZSB0aGlzIGlmIHlvdSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgdGhlIG1lZGlhIGxpYnJhcnkgaXMgaW5pdGlhbGl6ZWQKLS8vIGZvciB0aGUgdGhpcyBwcm9jZXNzLCB3aXRob3V0IGFjdHVhbGx5IHRyeWluZyB0byBpbml0aWFsaXplIGl0LgotTUVESUFfRVhQT1JUIGJvb2wgSXNNZWRpYUxpYnJhcnlJbml0aWFsaXplZCgpOwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX01FRElBX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCBiL3NyYy9tZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGNjZWY3Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9CQVNFX01FRElBX0VYUE9SVF9IXwotI2RlZmluZSBNRURJQV9CQVNFX01FRElBX0VYUE9SVF9IXwotCi0vLyBEZWZpbmUgTUVESUFfRVhQT1JUIHNvIHRoYXQgZnVuY3Rpb25hbGl0eSBpbXBsZW1lbnRlZCBieSB0aGUgTWVkaWEgbW9kdWxlCi0vLyBjYW4gYmUgZXhwb3J0ZWQgdG8gY29uc3VtZXJzLgotCi0jaWYgZGVmaW5lZChDT01QT05FTlRfQlVJTEQpCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikKLQotI2lmIGRlZmluZWQoTUVESUFfSU1QTEVNRU5UQVRJT04pCi0jZGVmaW5lIE1FRElBX0VYUE9SVCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSNlbHNlCi0jZGVmaW5lIE1FRElBX0VYUE9SVCBfX2RlY2xzcGVjKGRsbGltcG9ydCkKLSNlbmRpZiAgLy8gZGVmaW5lZChNRURJQV9JTVBMRU1FTlRBVElPTikKLQotI2Vsc2UgIC8vIGRlZmluZWQoV0lOMzIpCi0jaWYgZGVmaW5lZChNRURJQV9JTVBMRU1FTlRBVElPTikKLSNkZWZpbmUgTUVESUFfRVhQT1JUIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCi0jZWxzZQotI2RlZmluZSBNRURJQV9FWFBPUlQKLSNlbmRpZgotI2VuZGlmCi0KLSNlbHNlICAvLyBkZWZpbmVkKENPTVBPTkVOVF9CVUlMRCkKLSNkZWZpbmUgTUVESUFfRVhQT1JUCi0jZW5kaWYKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX01FRElBX0VYUE9SVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvbWVkaWFfbG9nLmNjIGIvc3JjL21lZGlhL2Jhc2UvbWVkaWFfbG9nLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjhlYmJiLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL21lZGlhX2xvZy5jYworKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9sb2cuaCIKLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvYXRvbWljX3NlcXVlbmNlX251bS5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvdmFsdWVzLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIEEgY291bnQgb2YgYWxsIE1lZGlhTG9ncyBjcmVhdGVkIGluIHRoZSBjdXJyZW50IHByb2Nlc3MuIFVzZWQgdG8gZ2VuZXJhdGUKLS8vIHVuaXF1ZSBJRHMuCi1zdGF0aWMgYmFzZTo6U3RhdGljQXRvbWljU2VxdWVuY2VOdW1iZXIgZ19tZWRpYV9sb2dfY291bnQ7Ci0KLWNvbnN0IGNoYXIqIE1lZGlhTG9nOjpFdmVudFR5cGVUb1N0cmluZyhNZWRpYUxvZ0V2ZW50OjpUeXBlIHR5cGUpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBNZWRpYUxvZ0V2ZW50OjpXRUJNRURJQVBMQVlFUl9DUkVBVEVEOgotICAgICAgcmV0dXJuICJXRUJNRURJQVBMQVlFUl9DUkVBVEVEIjsKLSAgICBjYXNlIE1lZGlhTG9nRXZlbnQ6OldFQk1FRElBUExBWUVSX0RFU1RST1lFRDoKLSAgICAgIHJldHVybiAiV0VCTUVESUFQTEFZRVJfREVTVFJPWUVEIjsKLSAgICBjYXNlIE1lZGlhTG9nRXZlbnQ6OlBJUEVMSU5FX0NSRUFURUQ6Ci0gICAgICByZXR1cm4gIlBJUEVMSU5FX0NSRUFURUQiOwotICAgIGNhc2UgTWVkaWFMb2dFdmVudDo6UElQRUxJTkVfREVTVFJPWUVEOgotICAgICAgcmV0dXJuICJQSVBFTElORV9ERVNUUk9ZRUQiOwotICAgIGNhc2UgTWVkaWFMb2dFdmVudDo6TE9BRDoKLSAgICAgIHJldHVybiAiTE9BRCI7Ci0gICAgY2FzZSBNZWRpYUxvZ0V2ZW50OjpTRUVLOgotICAgICAgcmV0dXJuICJTRUVLIjsKLSAgICBjYXNlIE1lZGlhTG9nRXZlbnQ6OlBMQVk6Ci0gICAgICByZXR1cm4gIlBMQVkiOwotICAgIGNhc2UgTWVkaWFMb2dFdmVudDo6UEFVU0U6Ci0gICAgICByZXR1cm4gIlBBVVNFIjsKLSAgICBjYXNlIE1lZGlhTG9nRXZlbnQ6OlBJUEVMSU5FX1NUQVRFX0NIQU5HRUQ6Ci0gICAgICByZXR1cm4gIlBJUEVMSU5FX1NUQVRFX0NIQU5HRUQiOwotICAgIGNhc2UgTWVkaWFMb2dFdmVudDo6UElQRUxJTkVfRVJST1I6Ci0gICAgICByZXR1cm4gIlBJUEVMSU5FX0VSUk9SIjsKLSAgICBjYXNlIE1lZGlhTG9nRXZlbnQ6OlZJREVPX1NJWkVfU0VUOgotICAgICAgcmV0dXJuICJWSURFT19TSVpFX1NFVCI7Ci0gICAgY2FzZSBNZWRpYUxvZ0V2ZW50OjpEVVJBVElPTl9TRVQ6Ci0gICAgICByZXR1cm4gIkRVUkFUSU9OX1NFVCI7Ci0gICAgY2FzZSBNZWRpYUxvZ0V2ZW50OjpUT1RBTF9CWVRFU19TRVQ6Ci0gICAgICByZXR1cm4gIlRPVEFMX0JZVEVTX1NFVCI7Ci0gICAgY2FzZSBNZWRpYUxvZ0V2ZW50OjpORVRXT1JLX0FDVElWSVRZX1NFVDoKLSAgICAgIHJldHVybiAiTkVUV09SS19BQ1RJVklUWV9TRVQiOwotICAgIGNhc2UgTWVkaWFMb2dFdmVudDo6QVVESU9fRU5ERUQ6Ci0gICAgICByZXR1cm4gIkFVRElPX0VOREVEIjsKLSAgICBjYXNlIE1lZGlhTG9nRXZlbnQ6OlZJREVPX0VOREVEOgotICAgICAgcmV0dXJuICJWSURFT19FTkRFRCI7Ci0gICAgY2FzZSBNZWRpYUxvZ0V2ZW50OjpBVURJT19SRU5ERVJFUl9ESVNBQkxFRDoKLSAgICAgIHJldHVybiAiQVVESU9fUkVOREVSRVJfRElTQUJMRUQiOwotICAgIGNhc2UgTWVkaWFMb2dFdmVudDo6QlVGRkVSRURfRVhURU5UU19DSEFOR0VEOgotICAgICAgcmV0dXJuICJCVUZGRVJFRF9FWFRFTlRTX0NIQU5HRUQiOwotICAgIGNhc2UgTWVkaWFMb2dFdmVudDo6TUVESUFfU09VUkNFX0VSUk9SOgotICAgICAgcmV0dXJuICJNRURJQV9TT1VSQ0VfRVJST1IiOwotICB9Ci0gIE5PVFJFQUNIRUQoKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNvbnN0IGNoYXIqIE1lZGlhTG9nOjpQaXBlbGluZVN0YXR1c1RvU3RyaW5nKFBpcGVsaW5lU3RhdHVzIHN0YXR1cykgewotICBzd2l0Y2ggKHN0YXR1cykgewotICAgIGNhc2UgUElQRUxJTkVfT0s6Ci0gICAgICByZXR1cm4gInBpcGVsaW5lOiBvayI7Ci0gICAgY2FzZSBQSVBFTElORV9FUlJPUl9VUkxfTk9UX0ZPVU5EOgotICAgICAgcmV0dXJuICJwaXBlbGluZTogdXJsIG5vdCBmb3VuZCI7Ci0gICAgY2FzZSBQSVBFTElORV9FUlJPUl9ORVRXT1JLOgotICAgICAgcmV0dXJuICJwaXBlbGluZTogbmV0d29yayBlcnJvciI7Ci0gICAgY2FzZSBQSVBFTElORV9FUlJPUl9ERUNPREU6Ci0gICAgICByZXR1cm4gInBpcGVsaW5lOiBkZWNvZGUgZXJyb3IiOwotICAgIGNhc2UgUElQRUxJTkVfRVJST1JfREVDUllQVDoKLSAgICAgIHJldHVybiAicGlwZWxpbmU6IGRlY3J5cHQgZXJyb3IiOwotICAgIGNhc2UgUElQRUxJTkVfRVJST1JfQUJPUlQ6Ci0gICAgICByZXR1cm4gInBpcGVsaW5lOiBhYm9ydCI7Ci0gICAgY2FzZSBQSVBFTElORV9FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQ6Ci0gICAgICByZXR1cm4gInBpcGVsaW5lOiBpbml0aWFsaXphdGlvbiBmYWlsZWQiOwotICAgIGNhc2UgUElQRUxJTkVfRVJST1JfQ09VTERfTk9UX1JFTkRFUjoKLSAgICAgIHJldHVybiAicGlwZWxpbmU6IGNvdWxkIG5vdCByZW5kZXIiOwotICAgIGNhc2UgUElQRUxJTkVfRVJST1JfUkVBRDoKLSAgICAgIHJldHVybiAicGlwZWxpbmU6IHJlYWQgZXJyb3IiOwotICAgIGNhc2UgUElQRUxJTkVfRVJST1JfT1BFUkFUSU9OX1BFTkRJTkc6Ci0gICAgICByZXR1cm4gInBpcGVsaW5lOiBvcGVyYXRpb24gcGVuZGluZyI7Ci0gICAgY2FzZSBQSVBFTElORV9FUlJPUl9JTlZBTElEX1NUQVRFOgotICAgICAgcmV0dXJuICJwaXBlbGluZTogaW52YWxpZCBzdGF0ZSI7Ci0gICAgY2FzZSBERU1VWEVSX0VSUk9SX0NPVUxEX05PVF9PUEVOOgotICAgICAgcmV0dXJuICJkZW11eGVyOiBjb3VsZCBub3Qgb3BlbiI7Ci0gICAgY2FzZSBERU1VWEVSX0VSUk9SX0NPVUxEX05PVF9QQVJTRToKLSAgICAgIHJldHVybiAiZHVtdXhlcjogY291bGQgbm90IHBhcnNlIjsKLSAgICBjYXNlIERFTVVYRVJfRVJST1JfTk9fU1VQUE9SVEVEX1NUUkVBTVM6Ci0gICAgICByZXR1cm4gImRlbXV4ZXI6IG5vIHN1cHBvcnRlZCBzdHJlYW1zIjsKLSAgICBjYXNlIERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRDoKLSAgICAgIHJldHVybiAiZGVjb2Rlcjogbm90IHN1cHBvcnRlZCI7Ci0gICAgY2FzZSBQSVBFTElORV9TVEFUVVNfTUFYOgotICAgICAgTk9UUkVBQ0hFRCgpOwotICB9Ci0gIE5PVFJFQUNIRUQoKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLUxvZ0hlbHBlcjo6TG9nSGVscGVyKGNvbnN0IExvZ0NCJiBsb2dfY2IpIDogbG9nX2NiXyhsb2dfY2IpIHt9Ci0KLUxvZ0hlbHBlcjo6fkxvZ0hlbHBlcigpIHsKLSAgaWYgKGxvZ19jYl8uaXNfbnVsbCgpKQotICAgIHJldHVybjsKLSAgbG9nX2NiXy5SdW4oc3RyZWFtXy5zdHIoKSk7Ci19Ci0KLU1lZGlhTG9nOjpNZWRpYUxvZygpIDogaWRfKGdfbWVkaWFfbG9nX2NvdW50LkdldE5leHQoKSkge30KLQotTWVkaWFMb2c6On5NZWRpYUxvZygpIHt9Ci0KLXZvaWQgTWVkaWFMb2c6OkFkZEV2ZW50KHNjb3BlZF9wdHI8TWVkaWFMb2dFdmVudD4gZXZlbnQpIHt9Ci0KLXNjb3BlZF9wdHI8TWVkaWFMb2dFdmVudD4gTWVkaWFMb2c6OkNyZWF0ZUV2ZW50KE1lZGlhTG9nRXZlbnQ6OlR5cGUgdHlwZSkgewotICBzY29wZWRfcHRyPE1lZGlhTG9nRXZlbnQ+IGV2ZW50KG5ldyBNZWRpYUxvZ0V2ZW50KTsKLSAgZXZlbnQtPmlkID0gaWRfOwotICBldmVudC0+dHlwZSA9IHR5cGU7Ci0gIGV2ZW50LT50aW1lID0gYmFzZTo6VGltZTo6Tm93KCk7Ci0gIHJldHVybiBldmVudC5QYXNzKCk7Ci19Ci0KLXNjb3BlZF9wdHI8TWVkaWFMb2dFdmVudD4gTWVkaWFMb2c6OkNyZWF0ZUJvb2xlYW5FdmVudCgKLSAgICBNZWRpYUxvZ0V2ZW50OjpUeXBlIHR5cGUsIGNvbnN0IGNoYXIqIHByb3BlcnR5LCBib29sIHZhbHVlKSB7Ci0gIHNjb3BlZF9wdHI8TWVkaWFMb2dFdmVudD4gZXZlbnQoQ3JlYXRlRXZlbnQodHlwZSkpOwotICBldmVudC0+cGFyYW1zLlNldEJvb2xlYW4ocHJvcGVydHksIHZhbHVlKTsKLSAgcmV0dXJuIGV2ZW50LlBhc3MoKTsKLX0KLQotc2NvcGVkX3B0cjxNZWRpYUxvZ0V2ZW50PiBNZWRpYUxvZzo6Q3JlYXRlU3RyaW5nRXZlbnQoCi0gICAgTWVkaWFMb2dFdmVudDo6VHlwZSB0eXBlLCBjb25zdCBjaGFyKiBwcm9wZXJ0eSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHNjb3BlZF9wdHI8TWVkaWFMb2dFdmVudD4gZXZlbnQoQ3JlYXRlRXZlbnQodHlwZSkpOwotICBldmVudC0+cGFyYW1zLlNldFN0cmluZyhwcm9wZXJ0eSwgdmFsdWUpOwotICByZXR1cm4gZXZlbnQuUGFzcygpOwotfQotCi1zY29wZWRfcHRyPE1lZGlhTG9nRXZlbnQ+IE1lZGlhTG9nOjpDcmVhdGVUaW1lRXZlbnQoCi0gICAgTWVkaWFMb2dFdmVudDo6VHlwZSB0eXBlLCBjb25zdCBjaGFyKiBwcm9wZXJ0eSwgYmFzZTo6VGltZURlbHRhIHZhbHVlKSB7Ci0gIHNjb3BlZF9wdHI8TWVkaWFMb2dFdmVudD4gZXZlbnQoQ3JlYXRlRXZlbnQodHlwZSkpOwotICBldmVudC0+cGFyYW1zLlNldERvdWJsZShwcm9wZXJ0eSwgdmFsdWUuSW5TZWNvbmRzRigpKTsKLSAgcmV0dXJuIGV2ZW50LlBhc3MoKTsKLX0KLQotc2NvcGVkX3B0cjxNZWRpYUxvZ0V2ZW50PiBNZWRpYUxvZzo6Q3JlYXRlTG9hZEV2ZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiB1cmwpIHsKLSAgc2NvcGVkX3B0cjxNZWRpYUxvZ0V2ZW50PiBldmVudChDcmVhdGVFdmVudChNZWRpYUxvZ0V2ZW50OjpMT0FEKSk7Ci0gIGV2ZW50LT5wYXJhbXMuU2V0U3RyaW5nKCJ1cmwiLCB1cmwpOwotICByZXR1cm4gZXZlbnQuUGFzcygpOwotfQotCi1zY29wZWRfcHRyPE1lZGlhTG9nRXZlbnQ+IE1lZGlhTG9nOjpDcmVhdGVTZWVrRXZlbnQoZmxvYXQgc2Vjb25kcykgewotICBzY29wZWRfcHRyPE1lZGlhTG9nRXZlbnQ+IGV2ZW50KENyZWF0ZUV2ZW50KE1lZGlhTG9nRXZlbnQ6OlNFRUspKTsKLSAgZXZlbnQtPnBhcmFtcy5TZXREb3VibGUoInNlZWtfdGFyZ2V0Iiwgc2Vjb25kcyk7Ci0gIHJldHVybiBldmVudC5QYXNzKCk7Ci19Ci0KLXNjb3BlZF9wdHI8TWVkaWFMb2dFdmVudD4gTWVkaWFMb2c6OkNyZWF0ZVBpcGVsaW5lU3RhdGVDaGFuZ2VkRXZlbnQoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0YXRlKSB7Ci0gIHNjb3BlZF9wdHI8TWVkaWFMb2dFdmVudD4gZXZlbnQoCi0gICAgICBDcmVhdGVFdmVudChNZWRpYUxvZ0V2ZW50OjpQSVBFTElORV9TVEFURV9DSEFOR0VEKSk7Ci0gIGV2ZW50LT5wYXJhbXMuU2V0U3RyaW5nKCJwaXBlbGluZV9zdGF0ZSIsIHN0YXRlKTsKLSAgcmV0dXJuIGV2ZW50LlBhc3MoKTsKLX0KLQotc2NvcGVkX3B0cjxNZWRpYUxvZ0V2ZW50PiBNZWRpYUxvZzo6Q3JlYXRlUGlwZWxpbmVFcnJvckV2ZW50KAotICAgIFBpcGVsaW5lU3RhdHVzIGVycm9yKSB7Ci0gIHNjb3BlZF9wdHI8TWVkaWFMb2dFdmVudD4gZXZlbnQoQ3JlYXRlRXZlbnQoTWVkaWFMb2dFdmVudDo6UElQRUxJTkVfRVJST1IpKTsKLSAgZXZlbnQtPnBhcmFtcy5TZXRTdHJpbmcoInBpcGVsaW5lX2Vycm9yIiwgUGlwZWxpbmVTdGF0dXNUb1N0cmluZyhlcnJvcikpOwotICByZXR1cm4gZXZlbnQuUGFzcygpOwotfQotCi1zY29wZWRfcHRyPE1lZGlhTG9nRXZlbnQ+IE1lZGlhTG9nOjpDcmVhdGVWaWRlb1NpemVTZXRFdmVudCgKLSAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKLSAgc2NvcGVkX3B0cjxNZWRpYUxvZ0V2ZW50PiBldmVudChDcmVhdGVFdmVudChNZWRpYUxvZ0V2ZW50OjpWSURFT19TSVpFX1NFVCkpOwotICBldmVudC0+cGFyYW1zLlNldEludGVnZXIoIndpZHRoIiwgd2lkdGgpOwotICBldmVudC0+cGFyYW1zLlNldEludGVnZXIoImhlaWdodCIsIGhlaWdodCk7Ci0gIHJldHVybiBldmVudC5QYXNzKCk7Ci19Ci0KLXNjb3BlZF9wdHI8TWVkaWFMb2dFdmVudD4gTWVkaWFMb2c6OkNyZWF0ZUJ1ZmZlcmVkRXh0ZW50c0NoYW5nZWRFdmVudCgKLSAgICBzaXplX3Qgc3RhcnQsIHNpemVfdCBjdXJyZW50LCBzaXplX3QgZW5kKSB7Ci0gIHNjb3BlZF9wdHI8TWVkaWFMb2dFdmVudD4gZXZlbnQoCi0gICAgICBDcmVhdGVFdmVudChNZWRpYUxvZ0V2ZW50OjpCVUZGRVJFRF9FWFRFTlRTX0NIQU5HRUQpKTsKLSAgZXZlbnQtPnBhcmFtcy5TZXRJbnRlZ2VyKCJidWZmZXJfc3RhcnQiLCBzdGFydCk7Ci0gIGV2ZW50LT5wYXJhbXMuU2V0SW50ZWdlcigiYnVmZmVyX2N1cnJlbnQiLCBjdXJyZW50KTsKLSAgZXZlbnQtPnBhcmFtcy5TZXRJbnRlZ2VyKCJidWZmZXJfZW5kIiwgZW5kKTsKLSAgcmV0dXJuIGV2ZW50LlBhc3MoKTsKLX0KLQotc2NvcGVkX3B0cjxNZWRpYUxvZ0V2ZW50PiBNZWRpYUxvZzo6Q3JlYXRlTWVkaWFTb3VyY2VFcnJvckV2ZW50KAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcikgewotICBzY29wZWRfcHRyPE1lZGlhTG9nRXZlbnQ+IGV2ZW50KAotICAgICAgQ3JlYXRlRXZlbnQoTWVkaWFMb2dFdmVudDo6TUVESUFfU09VUkNFX0VSUk9SKSk7Ci0gIGV2ZW50LT5wYXJhbXMuU2V0U3RyaW5nKCJlcnJvciIsIGVycm9yKTsKLSAgcmV0dXJuIGV2ZW50LlBhc3MoKTsKLX0KLQotfSAgLy9uYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL21lZGlhX2xvZy5oIGIvc3JjL21lZGlhL2Jhc2UvbWVkaWFfbG9nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZWM3ZWQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvbWVkaWFfbG9nLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0JBU0VfTUVESUFfTE9HX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfTUVESUFfTE9HX0hfCi0KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9sb2dfZXZlbnQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3BpcGVsaW5lX3N0YXR1cy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBJbmRpY2F0ZXMgYSBzdHJpbmcgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBsb2cuCi0vLyBGaXJzdCBwYXJhbWV0ZXIgLSBUaGUgc3RyaW5nIHRvIGFkZCB0byB0aGUgbG9nLgotdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKGNvbnN0IHN0ZDo6c3RyaW5nJik+IExvZ0NCOwotCi0vLyBIZWxwZXIgY2xhc3MgdG8gbWFrZSBpdCBlYXNpZXIgdG8gdXNlIGxvZ19jYiBsaWtlIERWTE9HKCkuCi1jbGFzcyBMb2dIZWxwZXIgewotIHB1YmxpYzoKLSAgTG9nSGVscGVyKGNvbnN0IExvZ0NCJiBMb2dfY2IpOwotICB+TG9nSGVscGVyKCk7Ci0KLSAgc3RkOjpvc3RyZWFtJiBzdHJlYW0oKSB7IHJldHVybiBzdHJlYW1fOyB9Ci0KLSBwcml2YXRlOgotICBMb2dDQiBsb2dfY2JfOwotICBzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW1fOwotfTsKLQotI2RlZmluZSBNRURJQV9MT0cobG9nX2NiKSBMb2dIZWxwZXIobG9nX2NiKS5zdHJlYW0oKQotCi1jbGFzcyBNRURJQV9FWFBPUlQgTWVkaWFMb2cgOiBwdWJsaWMgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8TWVkaWFMb2c+IHsKLSBwdWJsaWM6Ci0gIC8vIENvbnZlcnQgdmFyaW91cyBlbnVtcyB0byBzdHJpbmdzLgotICBzdGF0aWMgY29uc3QgY2hhciogRXZlbnRUeXBlVG9TdHJpbmcoTWVkaWFMb2dFdmVudDo6VHlwZSB0eXBlKTsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIFBpcGVsaW5lU3RhdHVzVG9TdHJpbmcoUGlwZWxpbmVTdGF0dXMpOwotCi0gIE1lZGlhTG9nKCk7Ci0KLSAgLy8gQWRkIGFuIGV2ZW50IHRvIHRoaXMgbG9nLiBPdmVycmlkZW4gYnkgaW5oZXJpdG9ycyB0byBhY3R1YWxseSBkbyBzb21ldGhpbmcKLSAgLy8gd2l0aCBpdC4KLSAgdmlydHVhbCB2b2lkIEFkZEV2ZW50KHNjb3BlZF9wdHI8TWVkaWFMb2dFdmVudD4gZXZlbnQpOwotCi0gIC8vIEhlbHBlciBtZXRob2RzIHRvIGNyZWF0ZSBldmVudHMgYW5kIHRoZWlyIHBhcmFtZXRlcnMuCi0gIHNjb3BlZF9wdHI8TWVkaWFMb2dFdmVudD4gQ3JlYXRlRXZlbnQoTWVkaWFMb2dFdmVudDo6VHlwZSB0eXBlKTsKLSAgc2NvcGVkX3B0cjxNZWRpYUxvZ0V2ZW50PiBDcmVhdGVCb29sZWFuRXZlbnQoCi0gICAgICBNZWRpYUxvZ0V2ZW50OjpUeXBlIHR5cGUsIGNvbnN0IGNoYXIqIHByb3BlcnR5LCBib29sIHZhbHVlKTsKLSAgc2NvcGVkX3B0cjxNZWRpYUxvZ0V2ZW50PiBDcmVhdGVTdHJpbmdFdmVudCgKLSAgICAgIE1lZGlhTG9nRXZlbnQ6OlR5cGUgdHlwZSwgY29uc3QgY2hhciogcHJvcGVydHksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIHNjb3BlZF9wdHI8TWVkaWFMb2dFdmVudD4gQ3JlYXRlVGltZUV2ZW50KAotICAgICAgTWVkaWFMb2dFdmVudDo6VHlwZSB0eXBlLCBjb25zdCBjaGFyKiBwcm9wZXJ0eSwgYmFzZTo6VGltZURlbHRhIHZhbHVlKTsKLSAgc2NvcGVkX3B0cjxNZWRpYUxvZ0V2ZW50PiBDcmVhdGVMb2FkRXZlbnQoY29uc3Qgc3RkOjpzdHJpbmcmIHVybCk7Ci0gIHNjb3BlZF9wdHI8TWVkaWFMb2dFdmVudD4gQ3JlYXRlU2Vla0V2ZW50KGZsb2F0IHNlY29uZHMpOwotICBzY29wZWRfcHRyPE1lZGlhTG9nRXZlbnQ+IENyZWF0ZVBpcGVsaW5lU3RhdGVDaGFuZ2VkRXZlbnQoCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3RhdGUpOwotICBzY29wZWRfcHRyPE1lZGlhTG9nRXZlbnQ+IENyZWF0ZVBpcGVsaW5lRXJyb3JFdmVudChQaXBlbGluZVN0YXR1cyBlcnJvcik7Ci0gIHNjb3BlZF9wdHI8TWVkaWFMb2dFdmVudD4gQ3JlYXRlVmlkZW9TaXplU2V0RXZlbnQoCi0gICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpOwotICBzY29wZWRfcHRyPE1lZGlhTG9nRXZlbnQ+IENyZWF0ZUJ1ZmZlcmVkRXh0ZW50c0NoYW5nZWRFdmVudCgKLSAgICAgIHNpemVfdCBzdGFydCwgc2l6ZV90IGN1cnJlbnQsIHNpemVfdCBlbmQpOwotICBzY29wZWRfcHRyPE1lZGlhTG9nRXZlbnQ+IENyZWF0ZU1lZGlhU291cmNlRXJyb3JFdmVudCgKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcik7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGZyaWVuZCBjbGFzcyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxNZWRpYUxvZz47Ci0gIHZpcnR1YWwgfk1lZGlhTG9nKCk7Ci0KLSBwcml2YXRlOgotICAvLyBBIHVuaXF1ZSAodG8gdGhpcyBwcm9jZXNzKSBpZCBmb3IgdGhpcyBNZWRpYUxvZy4KLSAgaW50MzIgaWRfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNZWRpYUxvZyk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX01FRElBX0xPR19IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvbWVkaWFfbG9nX2V2ZW50LmggYi9zcmMvbWVkaWEvYmFzZS9tZWRpYV9sb2dfZXZlbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIwZjZlMS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9tZWRpYV9sb2dfZXZlbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfQkFTRV9NRURJQV9MT0dfRVZFTlRfSF8KLSNkZWZpbmUgTUVESUFfQkFTRV9NRURJQV9MT0dfRVZFTlRfSF8KLQotI2luY2x1ZGUgImJhc2UvdGltZS5oIgotI2luY2x1ZGUgImJhc2UvdmFsdWVzLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLXN0cnVjdCBNZWRpYUxvZ0V2ZW50IHsKLSAgZW51bSBUeXBlIHsKLSAgICAvLyBBIFdlYk1lZGlhUGxheWVyIGlzIGJlaW5nIGNyZWF0ZWQgb3IgZGVzdHJveWVkLgotICAgIC8vIHBhcmFtczogbm9uZS4KLSAgICBXRUJNRURJQVBMQVlFUl9DUkVBVEVELAotICAgIFdFQk1FRElBUExBWUVSX0RFU1RST1lFRCwKLQotICAgIC8vIEEgUGlwZWxpbmUgaXMgYmVpbmcgY3JlYXRlZCBvciBkZXN0cm95ZWQuCi0gICAgLy8gcGFyYW1zOiBub25lLgotICAgIFBJUEVMSU5FX0NSRUFURUQsCi0gICAgUElQRUxJTkVfREVTVFJPWUVELAotCi0gICAgLy8gQSBtZWRpYSBwbGF5ZXIgaXMgbG9hZGluZyBhIHJlc291cmNlLgotICAgIC8vIHBhcmFtczogInVybCI6IDxVUkwgb2YgdGhlIHJlc291cmNlPi4KLSAgICBMT0FELAotCi0gICAgLy8gQSBtZWRpYSBwbGF5ZXIgaGFzIHN0YXJ0ZWQgc2Vla2luZy4KLSAgICAvLyBwYXJhbXM6ICJzZWVrX3RhcmdldCI6IDxudW1iZXIgb2Ygc2Vjb25kcyB0byB3aGljaCB0byBzZWVrPi4KLSAgICBTRUVLLAotCi0gICAgLy8gQSBtZWRpYSBwbGF5ZXIgaGFzIGJlZW4gdG9sZCB0byBwbGF5IG9yIHBhdXNlLgotICAgIC8vIHBhcmFtczogbm9uZS4KLSAgICBQTEFZLAotICAgIFBBVVNFLAotCi0gICAgLy8gVGhlIHN0YXRlIG9mIFBpcGVsaW5lIGhhcyBjaGFuZ2VkLgotICAgIC8vIHBhcmFtczogInBpcGVsaW5lX3N0YXRlIjogPHN0cmluZyBuYW1lIG9mIHRoZSBzdGF0ZT4uCi0gICAgUElQRUxJTkVfU1RBVEVfQ0hBTkdFRCwKLQotICAgIC8vIEFuIGVycm9yIGhhcyBvY2N1cnJlZCBpbiB0aGUgcGlwZWxpbmUuCi0gICAgLy8gcGFyYW1zOiAicGlwZWxpbmVfZXJyb3IiOiA8c3RyaW5nIG5hbWUgb2YgdGhlIGVycm9yPi4KLSAgICBQSVBFTElORV9FUlJPUiwKLQotICAgIC8vIFRoZSBzaXplIG9mIHRoZSB2aWRlbyBoYXMgYmVlbiBkZXRlcm1pbmVkLgotICAgIC8vIHBhcmFtczogIndpZHRoIjogPGludGVncmFsIHdpZHRoIG9mIHRoZSB2aWRlbz4uCi0gICAgLy8gICAgICAgICAiaGVpZ2h0IjogPGludGVncmFsIGhlaWdodCBvZiB0aGUgdmlkZW8+LgotICAgIFZJREVPX1NJWkVfU0VULAotCi0gICAgLy8gQSBwcm9wZXJ0eSBvZiB0aGUgcGlwZWxpbmUgaGFzIGJlZW4gc2V0IGJ5IGEgZmlsdGVyLgotICAgIC8vIFRoZXNlIHRha2UgYSBzaW5nbGUgcGFyYW1ldGVyIGJhc2VkIHVwb24gdGhlIG5hbWUgb2YgdGhlIGV2ZW50IGFuZCBvZgotICAgIC8vIHRoZSBhcHByb3ByaWF0ZSB0eXBlLiBlLmcuIERVUkFUSU9OX1NFVDogImR1cmF0aW9uIiBvZiB0eXBlIFRpbWVEZWx0YS4KLSAgICBEVVJBVElPTl9TRVQsCi0gICAgVE9UQUxfQllURVNfU0VULAotICAgIE5FVFdPUktfQUNUSVZJVFlfU0VULAotCi0gICAgLy8gQXVkaW8vVmlkZW8gc3RyZWFtIHBsYXliYWNrIGhhcyBlbmRlZC4KLSAgICBBVURJT19FTkRFRCwKLSAgICBWSURFT19FTkRFRCwKLQotICAgIC8vIFRoZSBhdWRpbyByZW5kZXJlciBoYXMgYmVlbiBkaXNhYmxlZC4KLSAgICAvLyBwYXJhbXM6IG5vbmUuCi0gICAgQVVESU9fUkVOREVSRVJfRElTQUJMRUQsCi0KLSAgICAvLyBUaGUgZXh0ZW50cyBvZiB0aGUgc2xpZGluZyBidWZmZXIgaGF2ZSBjaGFuZ2VkLgotICAgIC8vIHBhcmFtczogImJ1ZmZlcl9zdGFydCI6IDxmaXJzdCBidWZmZXJlZCBieXRlPi4KLSAgICAvLyAgICAgICAgICJidWZmZXJfY3VycmVudCI6IDxjdXJyZW50IG9mZnNldD4uCi0gICAgLy8gICAgICAgICAiYnVmZmVyX2VuZCI6IDxsYXN0IGJ1ZmZlcmVkIGJ5dGU+LgotICAgIEJVRkZFUkVEX0VYVEVOVFNfQ0hBTkdFRCwKLQotICAgIC8vIEVycm9ycyByZXBvcnRlZCBieSBNZWRpYSBTb3VyY2UgRXh0ZW5zaW9ucyBjb2RlLgotICAgIE1FRElBX1NPVVJDRV9FUlJPUiwKLSAgICAvLyBwYXJhbXM6ICJlcnJvciI6IEVycm9yIHN0cmluZyBkZXNjcmliaW5nIHRoZSBlcnJvciBkZXRlY3RlZC4KLSAgfTsKLQotICBpbnQzMiBpZDsKLSAgVHlwZSB0eXBlOwotICBiYXNlOjpEaWN0aW9uYXJ5VmFsdWUgcGFyYW1zOwotICBiYXNlOjpUaW1lIHRpbWU7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX01FRElBX0xPR19FVkVOVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvbWVkaWFfcG9zaXguY2MgYi9zcmMvbWVkaWEvYmFzZS9tZWRpYV9wb3NpeC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZiZWJhYS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9tZWRpYV9wb3NpeC5jYworKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJiYXNlL2ZpbGVfcGF0aC5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvcGF0aF9zZXJ2aWNlLmgiCi0jaW5jbHVkZSAiYmFzZS9zdHJpbmdpemVfbWFjcm9zLmgiCi0jaW5jbHVkZSAibWVkaWEvZmZtcGVnL2ZmbXBlZ19jb21tb24uaCIKLQotI2lmICFkZWZpbmVkKFVTRV9TWVNURU1fRkZNUEVHKQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2ZmbXBlZy9mZm1wZWdfc3R1YnMuaCIKLQotdXNpbmcgdGhpcmRfcGFydHlfZmZtcGVnOjprTnVtU3R1Yk1vZHVsZXM7Ci11c2luZyB0aGlyZF9wYXJ0eV9mZm1wZWc6OmtNb2R1bGVGZm1wZWdzdW1vOwotdXNpbmcgdGhpcmRfcGFydHlfZmZtcGVnOjpJbml0aWFsaXplU3R1YnM7Ci11c2luZyB0aGlyZF9wYXJ0eV9mZm1wZWc6OlN0dWJQYXRoTWFwOwotI2VuZGlmICAvLyAhZGVmaW5lZChVU0VfU1lTVEVNX0ZGTVBFRykKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gSGFuZHkgdG8gcHJldmVudCBzaG9vdGluZyBvdXJzZWx2ZXMgaW4gdGhlIGZvb3Qgd2l0aCBtYWNybyB3aXphcmRyeS4KLSNpZiAhZGVmaW5lZChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IpIHx8IFwKLSAgICAhZGVmaW5lZChMSUJBVkZPUk1BVF9WRVJTSU9OX01BSk9SKSB8fCBcCi0gICAgIWRlZmluZWQoTElCQVZVVElMX1ZFUlNJT05fTUFKT1IpCi0jZXJyb3IgRkZtcGVnIGhlYWRlcnMgbm90IGluY2x1ZGVkIQotI2VuZGlmCi0KLSNkZWZpbmUgQVZDT0RFQ19WRVJTSU9OIFNUUklOR0laRShMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IpCi0jZGVmaW5lIEFWRk9STUFUX1ZFUlNJT04gU1RSSU5HSVpFKExJQkFWRk9STUFUX1ZFUlNJT05fTUFKT1IpCi0jZGVmaW5lIEFWVVRJTF9WRVJTSU9OIFNUUklOR0laRShMSUJBVlVUSUxfVkVSU0lPTl9NQUpPUikKLQotI2lmIGRlZmluZWQoT1NfTUFDT1NYKQotLy8gVE9ETyhldmFuKTogc2hvdWxkIGJlIHVzaW5nIC5zbyBsaWtlIGZmbWVwZ3N1bW8gaGVyZS4KLSNkZWZpbmUgRFNPX05BTUUoTU9EVUxFLCBWRVJTSU9OKSAoImxpYiIgTU9EVUxFICIuIiBWRVJTSU9OICIuZHlsaWIiKQotc3RhdGljIGNvbnN0IEZpbGVQYXRoOjpDaGFyVHlwZSBrU3Vtb0xpYltdID0KLSAgICBGSUxFX1BBVEhfTElURVJBTCgiZmZtcGVnc3Vtby5zbyIpOwotI2VsaWYgZGVmaW5lZChPU19QT1NJWCkKLSNkZWZpbmUgRFNPX05BTUUoTU9EVUxFLCBWRVJTSU9OKSAoImxpYiIgTU9EVUxFICIuc28uIiBWRVJTSU9OKQotc3RhdGljIGNvbnN0IEZpbGVQYXRoOjpDaGFyVHlwZSBrU3Vtb0xpYltdID0KLSAgICBGSUxFX1BBVEhfTElURVJBTCgibGliZmZtcGVnc3Vtby5zbyIpOwotI2Vsc2UKLSNlcnJvciAiRG8gbm90IGtub3cgaG93IHRvIGNvbnN0cnVjdCBEU08gbmFtZSBmb3IgdGhpcyBPUy4iCi0jZW5kaWYKLQotLy8gVXNlIGEgZ2xvYmFsIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGxpYnJhcnkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgb3Igbm90LiAgV2UKLS8vIHJlbHkgb24gZnVuY3Rpb24gbGV2ZWwgc3RhdGljIGluaXRpYWxpemF0aW9uIGluIEluaXRpYWxpemVNZWRpYUxpYnJhcnkoKSB0bwotLy8gZ3VhcmFudGVlIHRoaXMgaXMgb25seSBzZXQgb25jZSBpbiBhIHRocmVhZCBzYWZlIG1hbm5lci4KLXN0YXRpYyBib29sIGdfbWVkaWFfbGlicmFyeV9pc19pbml0aWFsaXplZCA9IGZhbHNlOwotCi1zdGF0aWMgYm9vbCBJbml0aWFsaXplTWVkaWFMaWJyYXJ5SW50ZXJuYWwoY29uc3QgRmlsZVBhdGgmIG1vZHVsZV9kaXIpIHsKLSAgRENIRUNLKCFnX21lZGlhX2xpYnJhcnlfaXNfaW5pdGlhbGl6ZWQpOwotCi0jaWYgZGVmaW5lZChVU0VfU1lTVEVNX0ZGTVBFRykKLSAgLy8gTm8gaW5pdGlhbGl6YXRpb24gaXMgbmVjZXNzYXJ5IHdoZW4gdXNpbmcgc3lzdGVtIGZmbXBlZywKLSAgLy8gd2UganVzdCBsaW5rIGRpcmVjdGx5IHdpdGggc3lzdGVtIGZmbXBlZyBsaWJyYXJpZXMuCi0gIGdfbWVkaWFfbGlicmFyeV9pc19pbml0aWFsaXplZCA9IHRydWU7Ci0jZWxzZQotICBTdHViUGF0aE1hcCBwYXRoczsKLQotICAvLyBGaXJzdCB0cnkgdG8gaW5pdGlhbGl6ZSB3aXRoIENocm9tZSdzIHN1bW8gbGlicmFyeS4KLSAgRENIRUNLX0VRKGtOdW1TdHViTW9kdWxlcywgMSk7Ci0gIHBhdGhzW2tNb2R1bGVGZm1wZWdzdW1vXS5wdXNoX2JhY2sobW9kdWxlX2Rpci5BcHBlbmQoa1N1bW9MaWIpLnZhbHVlKCkpOwotCi0gIC8vIElmIHRoYXQgZmFpbHMsIHNlZSBpZiBhbnkgc3lzdGVtIGxpYnJhcmllcyBhcmUgYXZhaWxhYmxlLgotICBwYXRoc1trTW9kdWxlRmZtcGVnc3Vtb10ucHVzaF9iYWNrKG1vZHVsZV9kaXIuQXBwZW5kKAotICAgICAgRklMRV9QQVRIX0xJVEVSQUwoRFNPX05BTUUoImF2dXRpbCIsIEFWVVRJTF9WRVJTSU9OKSkpLnZhbHVlKCkpOwotICBwYXRoc1trTW9kdWxlRmZtcGVnc3Vtb10ucHVzaF9iYWNrKG1vZHVsZV9kaXIuQXBwZW5kKAotICAgICAgRklMRV9QQVRIX0xJVEVSQUwoRFNPX05BTUUoImF2Y29kZWMiLCBBVkNPREVDX1ZFUlNJT04pKSkudmFsdWUoKSk7Ci0gIHBhdGhzW2tNb2R1bGVGZm1wZWdzdW1vXS5wdXNoX2JhY2sobW9kdWxlX2Rpci5BcHBlbmQoCi0gICAgICBGSUxFX1BBVEhfTElURVJBTChEU09fTkFNRSgiYXZmb3JtYXQiLCBBVkZPUk1BVF9WRVJTSU9OKSkpLnZhbHVlKCkpOwotCi0gIGdfbWVkaWFfbGlicmFyeV9pc19pbml0aWFsaXplZCA9IEluaXRpYWxpemVTdHVicyhwYXRocyk7Ci0jZW5kaWYgIC8vICFkZWZpbmVkKFVTRV9TWVNURU1fRkZNUEVHKQotICByZXR1cm4gZ19tZWRpYV9saWJyYXJ5X2lzX2luaXRpYWxpemVkOwotfQotCi1ib29sIEluaXRpYWxpemVNZWRpYUxpYnJhcnkoY29uc3QgRmlsZVBhdGgmIGJhc2VfcGF0aCkgewotICBzdGF0aWMgY29uc3QgYm9vbCBrTWVkaWFMaWJyYXJ5SW5pdGlhbGl6ZWQgPQotICAgICAgSW5pdGlhbGl6ZU1lZGlhTGlicmFyeUludGVybmFsKGJhc2VfcGF0aCk7Ci0gIERDSEVDS19FUShrTWVkaWFMaWJyYXJ5SW5pdGlhbGl6ZWQsIGdfbWVkaWFfbGlicmFyeV9pc19pbml0aWFsaXplZCk7Ci0gIHJldHVybiBrTWVkaWFMaWJyYXJ5SW5pdGlhbGl6ZWQ7Ci19Ci0KLXZvaWQgSW5pdGlhbGl6ZU1lZGlhTGlicmFyeUZvclRlc3RpbmcoKSB7Ci0gIEZpbGVQYXRoIGZpbGVfcGF0aDsKLSAgQ0hFQ0soUGF0aFNlcnZpY2U6OkdldChiYXNlOjpESVJfRVhFLCAmZmlsZV9wYXRoKSk7Ci0gIENIRUNLKEluaXRpYWxpemVNZWRpYUxpYnJhcnkoZmlsZV9wYXRoKSk7Ci19Ci0KLWJvb2wgSXNNZWRpYUxpYnJhcnlJbml0aWFsaXplZCgpIHsKLSAgcmV0dXJuIGdfbWVkaWFfbGlicmFyeV9pc19pbml0aWFsaXplZDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9tZWRpYV9zdHViLmNjIGIvc3JjL21lZGlhL2Jhc2UvbWVkaWFfc3R1Yi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQyYmJmOS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9tZWRpYV9zdHViLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYS5oIgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0KLS8vIFRoaXMgZmlsZSBpcyBpbnRlbmRlZCBmb3IgcGxhdGZvcm1zIHRoYXQgZG9uJ3QgbmVlZCB0byBsb2FkIGFueSBtZWRpYQotLy8gbGlicmFyaWVzIChlLmcuLCBBbmRyb2lkIGFuZCBpT1MpLgotbmFtZXNwYWNlIG1lZGlhIHsKLQotYm9vbCBJbml0aWFsaXplTWVkaWFMaWJyYXJ5KGNvbnN0IEZpbGVQYXRoJiBtb2R1bGVfZGlyKSB7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEluaXRpYWxpemVNZWRpYUxpYnJhcnlGb3JUZXN0aW5nKCkgewotfQotCi1ib29sIElzTWVkaWFMaWJyYXJ5SW5pdGlhbGl6ZWQoKSB7Ci0gIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL21lZGlhX3N3aXRjaGVzLmNjIGIvc3JjL21lZGlhL2Jhc2UvbWVkaWFfc3dpdGNoZXMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMDIwZGYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvbWVkaWFfc3dpdGNoZXMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9zd2l0Y2hlcy5oIgotCi1uYW1lc3BhY2Ugc3dpdGNoZXMgewotCi0vLyBBbGxvdyB1c2VycyB0byBzcGVjaWZ5IGEgY3VzdG9tIGJ1ZmZlciBzaXplIGZvciBkZWJ1Z2dpbmcgcHVycG9zZS4KLWNvbnN0IGNoYXIga0F1ZGlvQnVmZmVyU2l6ZVtdID0gImF1ZGlvLWJ1ZmZlci1zaXplIjsKLQotI2lmIGRlZmluZWQoT1NfTElOVVgpIHx8IGRlZmluZWQoT1NfRlJFRUJTRCkgfHwgZGVmaW5lZChPU19TT0xBUklTKQotLy8gVGhlIEFsc2EgZGV2aWNlIHRvIHVzZSB3aGVuIG9wZW5pbmcgYW4gYXVkaW8gc3RyZWFtLgotY29uc3QgY2hhciBrQWxzYU91dHB1dERldmljZVtdID0gImFsc2Etb3V0cHV0LWRldmljZSI7Ci0vLyBUaGUgQWxzYSBkZXZpY2UgdG8gdXNlIHdoZW4gb3BlbmluZyBhbiBhdWRpbyBpbnB1dCBzdHJlYW0uCi1jb25zdCBjaGFyIGtBbHNhSW5wdXREZXZpY2VbXSA9ICJhbHNhLWlucHV0LWRldmljZSI7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoVVNFX0NSQVMpCi0vLyBVc2UgQ1JBUywgdGhlIENocm9tZU9TIGF1ZGlvIHNlcnZlci4KLWNvbnN0IGNoYXIga1VzZUNyYXNbXSA9ICJ1c2UtY3JhcyI7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoVVNFX1BVTFNFQVVESU8pCi0vLyBVc2UgUHVsc2VBdWRpbyBvbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IGl0LgotY29uc3QgY2hhciBrVXNlUHVsc2VBdWRpb1tdID0gInVzZS1wdWxzZWF1ZGlvIjsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChPU19XSU4pCi0vLyBVc2UgZXhjbHVzaXZlIG1vZGUgYXVkaW8gc3RyZWFtaW5nIGZvciBXaW5kb3dzIFZpc3RhIGFuZCBoaWdoZXIuCi0vLyBMZWFkcyB0byBsb3dlciBsYXRlbmNpZXMgZm9yIGF1ZGlvIHN0cmVhbXMgd2hpY2ggdXNlcyB0aGUKLS8vIEF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xPV19MQVRFTkNZIGF1ZGlvIHBhdGguCi0vLyBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9kZDM3MDg0NCh2PXZzLjg1KS5hc3B4Ci0vLyBmb3IgZGV0YWlscy4KLWNvbnN0IGNoYXIga0VuYWJsZUV4Y2x1c2l2ZUF1ZGlvW10gPSAiZW5hYmxlLWV4Y2x1c2l2ZS1hdWRpbyI7Ci0jZW5kaWYKLQotLy8gRGlzYWJsZSBhdXRvbWF0aWMgZmFsbGJhY2sgZnJvbSBsb3cgbGF0ZW5jeSB0byBoaWdoIGxhdGVuY3kgcGF0aC4KLWNvbnN0IGNoYXIga0Rpc2FibGVBdWRpb0ZhbGxiYWNrW10gPSAiZGlzYWJsZS1hdWRpby1mYWxsYmFjayI7Ci0KLS8vIERpc2FibGUgQXVkaW9PdXRwdXRSZXNhbXBsZXIgZm9yIGF1dG9tYXRpYyBhdWRpbyByZXNhbXBsaW5nIGFuZCByZWJ1ZmZlcmluZy4KLWNvbnN0IGNoYXIga0Rpc2FibGVBdWRpb091dHB1dFJlc2FtcGxlcltdID0gImRpc2FibGUtYXVkaW8tb3V0cHV0LXJlc2FtcGxlciI7Ci0KLS8vIENvbnRyb2xzIHJlbmRlcmVyIHNpZGUgbWl4aW5nIGFuZCBsb3cgbGF0ZW5jeSBhdWRpbyBwYXRoIGZvciBtZWRpYSBlbGVtZW50cy4KLSNpZiBkZWZpbmVkKE9TX1dJTikgfHwgZGVmaW5lZChPU19NQUNPU1gpCi1jb25zdCBjaGFyIGtEaXNhYmxlUmVuZGVyZXJTaWRlTWl4aW5nW10gPSAiZGlzYWJsZS1yZW5kZXJlci1zaWRlLW1peGluZyI7Ci0jZWxzZQotY29uc3QgY2hhciBrRW5hYmxlUmVuZGVyZXJTaWRlTWl4aW5nW10gPSAiZW5hYmxlLXJlbmRlcmVyLXNpZGUtbWl4aW5nIjsKLSNlbmRpZgotCi0vLyBFbmFibGUgYnJvd3Nlci1zaWRlIGF1ZGlvIG1peGVyLgotY29uc3QgY2hhciBrRW5hYmxlQXVkaW9NaXhlcltdID0gImVuYWJsZS1hdWRpby1taXhlciI7Ci0KLS8vIEVuYWJsZSBsaXZlIGF1ZGlvIGlucHV0IHdpdGggZ2V0VXNlck1lZGlhKCkgYW5kIHRoZSBXZWIgQXVkaW8gQVBJLgotY29uc3QgY2hhciBrRW5hYmxlV2ViQXVkaW9JbnB1dFtdID0gImVuYWJsZS13ZWJhdWRpby1pbnB1dCI7Ci0KLS8vIFNldCBudW1iZXIgb2YgdGhyZWFkcyB0byB1c2UgZm9yIHZpZGVvIGRlY29kaW5nLgotY29uc3QgY2hhciBrVmlkZW9UaHJlYWRzW10gPSAidmlkZW8tdGhyZWFkcyI7Ci0KLS8vIEVuYWJsZXMgc3VwcG9ydCBmb3IgZW5jcnlwdGVkIG1lZGlhLiBDdXJyZW50IGltcGxlbWVudGF0aW9uIGlzCi0vLyBpbmNvbXBsZXRlIGFuZCB0aGlzIGZsYWcgaXMgdXNlZCBmb3IgZGV2ZWxvcG1lbnQgYW5kIHRlc3RpbmcuCi1jb25zdCBjaGFyIGtFbmFibGVFbmNyeXB0ZWRNZWRpYVtdID0gImVuYWJsZS1lbmNyeXB0ZWQtbWVkaWEiOwotCi0vLyBFbmFibGVzIE9wdXMgcGxheWJhY2sgaW4gbWVkaWEgZWxlbWVudHMuCi1jb25zdCBjaGFyIGtFbmFibGVPcHVzUGxheWJhY2tbXSA9ICJlbmFibGUtb3B1cy1wbGF5YmFjayI7Ci0KLX0gIC8vIG5hbWVzcGFjZSBzd2l0Y2hlcwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvbWVkaWFfc3dpdGNoZXMuaCBiL3NyYy9tZWRpYS9iYXNlL21lZGlhX3N3aXRjaGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMDVlZmIuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvbWVkaWFfc3dpdGNoZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIERlZmluZXMgYWxsIHRoZSAibWVkaWEiIGNvbW1hbmQtbGluZSBzd2l0Y2hlcy4KLQotI2lmbmRlZiBNRURJQV9CQVNFX01FRElBX1NXSVRDSEVTX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfTUVESUFfU1dJVENIRVNfSF8KLQotI2luY2x1ZGUgImJ1aWxkL2J1aWxkX2NvbmZpZy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLW5hbWVzcGFjZSBzd2l0Y2hlcyB7Ci0KLSNpZiBkZWZpbmVkKE9TX0xJTlVYKSB8fCBkZWZpbmVkKE9TX0ZSRUVCU0QpIHx8IGRlZmluZWQoT1NfU09MQVJJUykKLWV4dGVybiBjb25zdCBjaGFyIGtBbHNhT3V0cHV0RGV2aWNlW107Ci1leHRlcm4gY29uc3QgY2hhciBrQWxzYUlucHV0RGV2aWNlW107Ci0jZW5kaWYKLQotTUVESUFfRVhQT1JUIGV4dGVybiBjb25zdCBjaGFyIGtBdWRpb0J1ZmZlclNpemVbXTsKLQotI2lmIGRlZmluZWQoVVNFX0NSQVMpCi1NRURJQV9FWFBPUlQgZXh0ZXJuIGNvbnN0IGNoYXIga1VzZUNyYXNbXTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChVU0VfUFVMU0VBVURJTykKLU1FRElBX0VYUE9SVCBleHRlcm4gY29uc3QgY2hhciBrVXNlUHVsc2VBdWRpb1tdOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKE9TX1dJTikKLU1FRElBX0VYUE9SVCBleHRlcm4gY29uc3QgY2hhciBrRW5hYmxlRXhjbHVzaXZlQXVkaW9bXTsKLSNlbmRpZgotCi1NRURJQV9FWFBPUlQgZXh0ZXJuIGNvbnN0IGNoYXIga0Rpc2FibGVBdWRpb0ZhbGxiYWNrW107Ci0KLU1FRElBX0VYUE9SVCBleHRlcm4gY29uc3QgY2hhciBrRGlzYWJsZUF1ZGlvT3V0cHV0UmVzYW1wbGVyW107Ci0KLSNpZiBkZWZpbmVkKE9TX1dJTikgfHwgZGVmaW5lZChPU19NQUNPU1gpCi1NRURJQV9FWFBPUlQgZXh0ZXJuIGNvbnN0IGNoYXIga0Rpc2FibGVSZW5kZXJlclNpZGVNaXhpbmdbXTsKLSNlbHNlCi1NRURJQV9FWFBPUlQgZXh0ZXJuIGNvbnN0IGNoYXIga0VuYWJsZVJlbmRlcmVyU2lkZU1peGluZ1tdOwotI2VuZGlmCi0KLU1FRElBX0VYUE9SVCBleHRlcm4gY29uc3QgY2hhciBrRW5hYmxlQXVkaW9NaXhlcltdOwotCi1NRURJQV9FWFBPUlQgZXh0ZXJuIGNvbnN0IGNoYXIga0VuYWJsZVdlYkF1ZGlvSW5wdXRbXTsKLQotTUVESUFfRVhQT1JUIGV4dGVybiBjb25zdCBjaGFyIGtWaWRlb1RocmVhZHNbXTsKLQotTUVESUFfRVhQT1JUIGV4dGVybiBjb25zdCBjaGFyIGtFbmFibGVFbmNyeXB0ZWRNZWRpYVtdOwotCi1NRURJQV9FWFBPUlQgZXh0ZXJuIGNvbnN0IGNoYXIga0VuYWJsZU9wdXNQbGF5YmFja1tdOwotCi19ICAvLyBuYW1lc3BhY2Ugc3dpdGNoZXMKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX01FRElBX1NXSVRDSEVTX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9tZWRpYV93aW4uY2MgYi9zcmMvbWVkaWEvYmFzZS9tZWRpYV93aW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNmQzNzAuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvbWVkaWFfd2luLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWEuaCIKLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpZiBkZWZpbmVkKF9XSU4zMl9XSU5OVF9XSU44KQotLy8gVGhlIFdpbmRvd3MgOCBTREsgZGVmaW5lcyBGQUNJTElUWV9WSVNVQUxDUFAgaW4gd2luZXJyb3IuaC4KLSN1bmRlZiBGQUNJTElUWV9WSVNVQUxDUFAKLSNlbmRpZgotI2luY2x1ZGUgPGRlbGF5aW1wLmg+Ci0KLSNpbmNsdWRlICJiYXNlL2ZpbGVfcGF0aC5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvbmF0aXZlX2xpYnJhcnkuaCIKLSNpbmNsdWRlICJiYXNlL3BhdGhfc2VydmljZS5oIgotCi0jcHJhZ21hIGNvbW1lbnQobGliLCAiZGVsYXlpbXAubGliIikKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gRkZtcGVnIGxpYnJhcnkgbmFtZS4KLXN0YXRpYyBjb25zdCBjaGFyKiBrRkZtcGVnRExMID0gImZmbXBlZ3N1bW8uZGxsIjsKLQotLy8gVXNlIGEgZ2xvYmFsIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGxpYnJhcnkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgb3Igbm90LiAgV2UKLS8vIHJlbHkgb24gZnVuY3Rpb24gbGV2ZWwgc3RhdGljIGluaXRpYWxpemF0aW9uIGluIEluaXRpYWxpemVNZWRpYUxpYnJhcnkoKSB0bwotLy8gZ3VhcmFudGVlIHRoaXMgaXMgb25seSBzZXQgb25jZSBpbiBhIHRocmVhZCBzYWZlIG1hbm5lci4KLXN0YXRpYyBib29sIGdfbWVkaWFfbGlicmFyeV9pc19pbml0aWFsaXplZCA9IGZhbHNlOwotCi1zdGF0aWMgYm9vbCBJbml0aWFsaXplTWVkaWFMaWJyYXJ5SW50ZXJuYWwoY29uc3QgRmlsZVBhdGgmIGJhc2VfcGF0aCkgewotICBEQ0hFQ0soIWdfbWVkaWFfbGlicmFyeV9pc19pbml0aWFsaXplZCk7Ci0KLSAgLy8gTG9hZExpYnJhcnlFeCguLi4sIExPQURfV0lUSF9BTFRFUkVEX1NFQVJDSF9QQVRIKSBjYW5ub3QgaGFuZGxlCi0gIC8vIHJlbGF0aXZlIHBhdGguCi0gIGlmICghYmFzZV9wYXRoLklzQWJzb2x1dGUoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gVXNlIGFsdGVybmF0ZSBETEwgc2VhcmNoIHBhdGggc28gd2UgZG9uJ3QgbG9hZCBkZXBlbmRlbmNpZXMgZnJvbSB0aGUKLSAgLy8gc3lzdGVtIHBhdGguICBSZWZlciB0byBodHRwOi8vY3JidWcuY29tLzM1ODU3Ci0gIEhNT0RVTEUgbGliID0gOjpMb2FkTGlicmFyeUV4KAotICAgICAgYmFzZV9wYXRoLkFwcGVuZEFTQ0lJKGtGRm1wZWdETEwpLnZhbHVlKCkuY19zdHIoKSwgTlVMTCwKLSAgICAgIExPQURfV0lUSF9BTFRFUkVEX1NFQVJDSF9QQVRIKTsKLQotICAvLyBDaGVjayB0aGF0IHdlIGxvYWRlZCB0aGUgbGlicmFyeSBzdWNjZXNzZnVsbHkuCi0gIGdfbWVkaWFfbGlicmFyeV9pc19pbml0aWFsaXplZCA9IChsaWIgIT0gTlVMTCk7Ci0gIHJldHVybiBnX21lZGlhX2xpYnJhcnlfaXNfaW5pdGlhbGl6ZWQ7Ci19Ci0KLWJvb2wgSW5pdGlhbGl6ZU1lZGlhTGlicmFyeShjb25zdCBGaWxlUGF0aCYgYmFzZV9wYXRoKSB7Ci0gIHN0YXRpYyBjb25zdCBib29sIGtNZWRpYUxpYnJhcnlJbml0aWFsaXplZCA9Ci0gICAgICBJbml0aWFsaXplTWVkaWFMaWJyYXJ5SW50ZXJuYWwoYmFzZV9wYXRoKTsKLSAgRENIRUNLX0VRKGtNZWRpYUxpYnJhcnlJbml0aWFsaXplZCwgZ19tZWRpYV9saWJyYXJ5X2lzX2luaXRpYWxpemVkKTsKLSAgcmV0dXJuIGtNZWRpYUxpYnJhcnlJbml0aWFsaXplZDsKLX0KLQotdm9pZCBJbml0aWFsaXplTWVkaWFMaWJyYXJ5Rm9yVGVzdGluZygpIHsKLSAgRmlsZVBhdGggZmlsZV9wYXRoOwotICBDSEVDSyhQYXRoU2VydmljZTo6R2V0KGJhc2U6OkRJUl9FWEUsICZmaWxlX3BhdGgpKTsKLSAgQ0hFQ0soSW5pdGlhbGl6ZU1lZGlhTGlicmFyeShmaWxlX3BhdGgpKTsKLX0KLQotYm9vbCBJc01lZGlhTGlicmFyeUluaXRpYWxpemVkKCkgewotICByZXR1cm4gZ19tZWRpYV9saWJyYXJ5X2lzX2luaXRpYWxpemVkOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL21lc3NhZ2VfbG9vcF9mYWN0b3J5LmNjIGIvc3JjL21lZGlhL2Jhc2UvbWVzc2FnZV9sb29wX2ZhY3RvcnkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZjQ0NzMuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvbWVzc2FnZV9sb29wX2ZhY3RvcnkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZXNzYWdlX2xvb3BfZmFjdG9yeS5oIgotCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkLmgiCi0KLSNpZiBkZWZpbmVkKE9TX1NUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgotI2VuZGlmICAvLyBkZWZpbmVkKE9TX1NUQVJCT0FSRCkKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotTWVzc2FnZUxvb3BGYWN0b3J5OjpNZXNzYWdlTG9vcEZhY3RvcnkoKSB7fQotCi1NZXNzYWdlTG9vcEZhY3Rvcnk6On5NZXNzYWdlTG9vcEZhY3RvcnkoKSB7Ci0gIGZvciAoVGhyZWFkTGlzdDo6cmV2ZXJzZV9pdGVyYXRvciBpdCA9IHRocmVhZHNfLnJiZWdpbigpOwotICAgICAgIGl0ICE9IHRocmVhZHNfLnJlbmQoKTsgKytpdCkgewotICAgIGJhc2U6OlRocmVhZCogdGhyZWFkID0gaXQtPnNlY29uZDsKLSAgICB0aHJlYWQtPlN0b3AoKTsKLSAgICBkZWxldGUgdGhyZWFkOwotICB9Ci0gIHRocmVhZHNfLmNsZWFyKCk7Ci19Ci0KLXNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4gTWVzc2FnZUxvb3BGYWN0b3J5OjpHZXRNZXNzYWdlTG9vcCgKLSAgICBUeXBlIHR5cGUpIHsKLSAgcmV0dXJuIEdldFRocmVhZCh0eXBlKS0+bWVzc2FnZV9sb29wX3Byb3h5KCk7Ci19Ci0KLWJhc2U6OlRocmVhZCogTWVzc2FnZUxvb3BGYWN0b3J5OjpHZXRUaHJlYWQoVHlwZSB0eXBlKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gIGZvciAoVGhyZWFkTGlzdDo6aXRlcmF0b3IgaXQgPSB0aHJlYWRzXy5iZWdpbigpOyBpdCAhPSB0aHJlYWRzXy5lbmQoKTsgKytpdCkgewotICAgIGlmIChpdC0+Zmlyc3QgPT0gdHlwZSkKLSAgICAgIHJldHVybiBpdC0+c2Vjb25kOwotICB9Ci0KLSAgY29uc3QgY2hhciogbmFtZSA9IE5VTEw7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2Uga1BpcGVsaW5lOgotICAgICAgbmFtZSA9ICJNZWRpYVBpcGVsaW5lIjsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgYmFzZTo6VGhyZWFkKiB0aHJlYWQgPSBuZXcgYmFzZTo6VGhyZWFkKG5hbWUpOwotICBiYXNlOjpUaHJlYWQ6Ok9wdGlvbnMgb3B0aW9uczsKLQotICBpZiAodHlwZSA9PSBrUGlwZWxpbmUpIHsKLSNpZiBkZWZpbmVkKE9TX1NUQVJCT0FSRCkgJiYgZGVmaW5lZChTQl9NRURJQV9USFJFQURfU1RBQ0tfU0laRSkKLSAgICBvcHRpb25zLnN0YWNrX3NpemUgPSBTQl9NRURJQV9USFJFQURfU1RBQ0tfU0laRTsKLSNlbmRpZiAgLy8gZGVmaW5lZChPU19TVEFSQk9BUkQpICYmIGRlZmluZWQoU0JfTUVESUFfVEhSRUFEX1NUQUNLX1NJWkUpCi0gIH0KLQotICBDSEVDSyh0aHJlYWQtPlN0YXJ0V2l0aE9wdGlvbnMob3B0aW9ucykpCi0gICAgICA8PCAiRmFpbGVkIHRvIHN0YXJ0IHRocmVhZDogIiA8PCBuYW1lOwotICB0aHJlYWRzXy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIodHlwZSwgdGhyZWFkKSk7Ci0gIHJldHVybiB0aHJlYWQ7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvbWVzc2FnZV9sb29wX2ZhY3RvcnkuaCBiL3NyYy9tZWRpYS9iYXNlL21lc3NhZ2VfbG9vcF9mYWN0b3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzOTliNDguLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvbWVzc2FnZV9sb29wX2ZhY3RvcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfQkFTRV9NRVNTQUdFX0xPT1BfRkFDVE9SWV9IXwotI2RlZmluZSBNRURJQV9CQVNFX01FU1NBR0VfTE9PUF9GQUNUT1JZX0hfCi0KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wX3Byb3h5LmgiCi0jaW5jbHVkZSAiYmFzZS9zeW5jaHJvbml6YXRpb24vbG9jay5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLWNsYXNzIE1lc3NhZ2VMb29wOwotCi1uYW1lc3BhY2UgYmFzZSB7Ci1jbGFzcyBUaHJlYWQ7Ci19Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIEZhY3Rvcnkgb2JqZWN0IHRoYXQgbWFuYWdlcyBuYW1lZCBNZXNzYWdlTG9vcHMuCi0vLwotLy8gVE9ETyhzY2hlcmt1cyk6IHJlcGxhY2UgdGhpcyB3aXRoIHNvbWV0aGluZyBzaW1wbGVyIGh0dHA6Ly9jcmJ1Zy5jb20vMTE2ODczCi1jbGFzcyBNRURJQV9FWFBPUlQgTWVzc2FnZUxvb3BGYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIGVudW0gVHlwZSB7Ci0gICAga1BpcGVsaW5lCi0gIH07Ci0KLSAgTWVzc2FnZUxvb3BGYWN0b3J5KCk7Ci0KLSAgLy8gR2V0IHRoZSBtZXNzYWdlIGxvb3AgcHJveHkgYXNzb2NpYXRlZCB3aXRoIHx0eXBlfC4gQSBuZXcgTWVzc2FnZUxvb3BQcm94eQotICAvLyBpcyBjcmVhdGVkIGlmIHRoZSBmYWN0b3J5IGRvZXNuJ3QgaGF2ZSBvbmUgYXNzb2NpYXRlZCB3aXRoIHx0eXBlfC4KLSAgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiBHZXRNZXNzYWdlTG9vcChUeXBlIHR5cGUpOwotCi0gcHJpdmF0ZToKLSAgLy8gT25seSBhbGxvdyBzY29wZWRfcHRyPD4gdG8gZGVsZXRlIGZhY3RvcnkuCi0gIGZyaWVuZCBjbGFzcyBzY29wZWRfcHRyPE1lc3NhZ2VMb29wRmFjdG9yeT47Ci0gIH5NZXNzYWdlTG9vcEZhY3RvcnkoKTsKLQotICAvLyBSZXR1cm5zIHRoZSB0aHJlYWQgYXNzb2NpYXRlZCB3aXRoIHx0eXBlfCBjcmVhdGluZyBhIG5ldyB0aHJlYWQgaWYgbmVlZGVkLgotICBiYXNlOjpUaHJlYWQqIEdldFRocmVhZChUeXBlIHR5cGUpOwotCi0gIC8vIExvY2sgdXNlZCB0byBzZXJpYWxpemUgYWNjZXNzIGZvciB0aGUgZm9sbG93aW5nIGRhdGEgbWVtYmVycy4KLSAgYmFzZTo6TG9jayBsb2NrXzsKLQotICAvLyBMaXN0IG9mIHBhaXJzIG9mIGNyZWF0ZWQgdGhyZWFkcyBhbmQgdGhlaXIgdHlwZXMuICBXZSB1c2UgYSBsaXN0IHRvIGVuc3VyZQotICAvLyB0aHJlYWRzIGFyZSBzdG9wcGVkICYgZGVsZXRlZCBpbiByZXZlcnNlIG9yZGVyIG9mIGNyZWF0aW9uLgotICB0eXBlZGVmIHN0ZDo6bGlzdDxzdGQ6OnBhaXI8VHlwZSwgYmFzZTo6VGhyZWFkKj4gPiBUaHJlYWRMaXN0OwotICBUaHJlYWRMaXN0IHRocmVhZHNfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNZXNzYWdlTG9vcEZhY3RvcnkpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQkFTRV9NRVNTQUdFX0xPT1BfRkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvbW9ja19hdWRpb19yZW5kZXJlcl9zaW5rLmNjIGIvc3JjL21lZGlhL2Jhc2UvbW9ja19hdWRpb19yZW5kZXJlcl9zaW5rLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjFlYjE5Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL21vY2tfYXVkaW9fcmVuZGVyZXJfc2luay5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL21vY2tfYXVkaW9fcmVuZGVyZXJfc2luay5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1Nb2NrQXVkaW9SZW5kZXJlclNpbms6Ok1vY2tBdWRpb1JlbmRlcmVyU2luaygpIHt9Ci1Nb2NrQXVkaW9SZW5kZXJlclNpbms6On5Nb2NrQXVkaW9SZW5kZXJlclNpbmsoKSB7fQotCi12b2lkIE1vY2tBdWRpb1JlbmRlcmVyU2luazo6SW5pdGlhbGl6ZShjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbmRlckNhbGxiYWNrKiByZW5kZXJlcikgewotICBjYWxsYmFja18gPSByZW5kZXJlcjsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9tb2NrX2F1ZGlvX3JlbmRlcmVyX3NpbmsuaCBiL3NyYy9tZWRpYS9iYXNlL21vY2tfYXVkaW9fcmVuZGVyZXJfc2luay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjU5YmY2Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL21vY2tfYXVkaW9fcmVuZGVyZXJfc2luay5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9CQVNFX01PQ0tfQVVESU9fUkVOREVSRVJfU0lOS19IXwotI2RlZmluZSBNRURJQV9CQVNFX01PQ0tfQVVESU9fUkVOREVSRVJfU0lOS19IXwotCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fcGFyYW1ldGVycy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fcmVuZGVyZXJfc2luay5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBNb2NrQXVkaW9SZW5kZXJlclNpbmsgOiBwdWJsaWMgQXVkaW9SZW5kZXJlclNpbmsgewotIHB1YmxpYzoKLSAgTW9ja0F1ZGlvUmVuZGVyZXJTaW5rKCk7Ci0KLSAgTU9DS19NRVRIT0QwKFN0YXJ0LCB2b2lkKCkpOwotICBNT0NLX01FVEhPRDAoU3RvcCwgdm9pZCgpKTsKLSAgTU9DS19NRVRIT0QxKFBhdXNlLCB2b2lkKGJvb2wgZmx1c2gpKTsKLSAgTU9DS19NRVRIT0QwKFBsYXksIHZvaWQoKSk7Ci0gIE1PQ0tfTUVUSE9EMShTZXRWb2x1bWUsIGJvb2woZG91YmxlIHZvbHVtZSkpOwotI2lmIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLSAgTU9DS19NRVRIT0QxKFJlc3VtZUFmdGVyVW5kZXJmbG93LCB2b2lkKGJvb2wpKTsKLSNlbmRpZgotCi0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJDYWxsYmFjayogcmVuZGVyZXIpIE9WRVJSSURFOwotICBBdWRpb1JlbmRlcmVyU2luazo6UmVuZGVyQ2FsbGJhY2sqIGNhbGxiYWNrKCkgeyByZXR1cm4gY2FsbGJhY2tfOyB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgfk1vY2tBdWRpb1JlbmRlcmVyU2luaygpOwotCi0gcHJpdmF0ZToKLSAgUmVuZGVyQ2FsbGJhY2sqIGNhbGxiYWNrXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTW9ja0F1ZGlvUmVuZGVyZXJTaW5rKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0JBU0VfTU9DS19BVURJT19SRU5ERVJFUl9TSU5LX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9tb2NrX2RhdGFfc291cmNlX2hvc3QuY2MgYi9zcmMvbWVkaWEvYmFzZS9tb2NrX2RhdGFfc291cmNlX2hvc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZjBiNzguLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvbW9ja19kYXRhX3NvdXJjZV9ob3N0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDExIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbW9ja19kYXRhX3NvdXJjZV9ob3N0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLU1vY2tEYXRhU291cmNlSG9zdDo6TW9ja0RhdGFTb3VyY2VIb3N0KCkge30KLQotTW9ja0RhdGFTb3VyY2VIb3N0Ojp+TW9ja0RhdGFTb3VyY2VIb3N0KCkge30KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9tb2NrX2RhdGFfc291cmNlX2hvc3QuaCBiL3NyYy9tZWRpYS9iYXNlL21vY2tfZGF0YV9zb3VyY2VfaG9zdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTRkMDU1Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL21vY2tfZGF0YV9zb3VyY2VfaG9zdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLS8vCi0jaWZuZGVmIE1FRElBX0JBU0VfTU9DS19EQVRBX1NPVVJDRV9IT1NUX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfTU9DS19EQVRBX1NPVVJDRV9IT1NUX0hfCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RhdGFfc291cmNlLmgiCi0jaW5jbHVkZSAidGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIE1vY2tEYXRhU291cmNlSG9zdCA6IHB1YmxpYyBEYXRhU291cmNlSG9zdCB7Ci0gcHVibGljOgotICBNb2NrRGF0YVNvdXJjZUhvc3QoKTsKLSAgdmlydHVhbCB+TW9ja0RhdGFTb3VyY2VIb3N0KCk7Ci0KLSAgLy8gRGF0YVNvdXJjZUhvc3QgaW1wbGVtZW50YXRpb24uCi0gIE1PQ0tfTUVUSE9EMShTZXRUb3RhbEJ5dGVzLCB2b2lkKGludDY0IHRvdGFsX2J5dGVzKSk7Ci0gIE1PQ0tfTUVUSE9EMihBZGRCdWZmZXJlZEJ5dGVSYW5nZSwgdm9pZChpbnQ2NCBzdGFydCwgaW50NjQgZW5kKSk7Ci0gIE1PQ0tfTUVUSE9EMihBZGRCdWZmZXJlZFRpbWVSYW5nZSwgdm9pZChiYXNlOjpUaW1lRGVsdGEgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGEgZW5kKSk7Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTW9ja0RhdGFTb3VyY2VIb3N0KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0JBU0VfTU9DS19EQVRBX1NPVVJDRV9IT1NUX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9tb2NrX2RlbXV4ZXJfaG9zdC5jYyBiL3NyYy9tZWRpYS9iYXNlL21vY2tfZGVtdXhlcl9ob3N0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDA3ODdmLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL21vY2tfZGVtdXhlcl9ob3N0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDExIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbW9ja19kZW11eGVyX2hvc3QuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotTW9ja0RlbXV4ZXJIb3N0OjpNb2NrRGVtdXhlckhvc3QoKSB7fQotCi1Nb2NrRGVtdXhlckhvc3Q6On5Nb2NrRGVtdXhlckhvc3QoKSB7fQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL21vY2tfZGVtdXhlcl9ob3N0LmggYi9zcmMvbWVkaWEvYmFzZS9tb2NrX2RlbXV4ZXJfaG9zdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTdjMTMyLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL21vY2tfZGVtdXhlcl9ob3N0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotLy8KLSNpZm5kZWYgTUVESUFfQkFTRV9NT0NLX0RFTVVYRVJfSE9TVF9IXwotI2RlZmluZSBNRURJQV9CQVNFX01PQ0tfREVNVVhFUl9IT1NUX0hfCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlbXV4ZXIuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgTW9ja0RlbXV4ZXJIb3N0IDogcHVibGljIERlbXV4ZXJIb3N0IHsKLSBwdWJsaWM6Ci0gIE1vY2tEZW11eGVySG9zdCgpOwotICB2aXJ0dWFsIH5Nb2NrRGVtdXhlckhvc3QoKTsKLQotICAvLyBEYXRhU291cmNlSG9zdCBpbXBsZW1lbnRhdGlvbi4KLSAgTU9DS19NRVRIT0QxKFNldFRvdGFsQnl0ZXMsIHZvaWQoaW50NjQgdG90YWxfYnl0ZXMpKTsKLSAgTU9DS19NRVRIT0QyKEFkZEJ1ZmZlcmVkQnl0ZVJhbmdlLCB2b2lkKGludDY0IHN0YXJ0LCBpbnQ2NCBlbmQpKTsKLSAgTU9DS19NRVRIT0QyKEFkZEJ1ZmZlcmVkVGltZVJhbmdlLCB2b2lkKGJhc2U6OlRpbWVEZWx0YSBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YSBlbmQpKTsKLQotICAvLyBEZW11eGVySG9zdCBpbXBsZW1lbnRhdGlvbi4KLSAgTU9DS19NRVRIT0QxKE9uRGVtdXhlckVycm9yLCB2b2lkKFBpcGVsaW5lU3RhdHVzIGVycm9yKSk7Ci0gIE1PQ0tfTUVUSE9EMShTZXREdXJhdGlvbiwgdm9pZChiYXNlOjpUaW1lRGVsdGEgZHVyYXRpb24pKTsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNb2NrRGVtdXhlckhvc3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQkFTRV9NT0NLX0RFTVVYRVJfSE9TVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvbW9ja19maWx0ZXJzLmNjIGIvc3JjL21lZGlhL2Jhc2UvbW9ja19maWx0ZXJzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTk3ZWUyLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL21vY2tfZmlsdGVycy5jYworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL21vY2tfZmlsdGVycy5oIgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotCi11c2luZyA6OnRlc3Rpbmc6Ol87Ci11c2luZyA6OnRlc3Rpbmc6Okludm9rZTsKLXVzaW5nIDo6dGVzdGluZzo6Tm90TnVsbDsKLXVzaW5nIDo6dGVzdGluZzo6UmV0dXJuOwotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1Nb2NrRGVtdXhlcjo6TW9ja0RlbXV4ZXIoKSB7fQotCi1Nb2NrRGVtdXhlcjo6fk1vY2tEZW11eGVyKCkge30KLQotTW9ja0RlbXV4ZXJTdHJlYW06Ok1vY2tEZW11eGVyU3RyZWFtKCkge30KLQotTW9ja0RlbXV4ZXJTdHJlYW06On5Nb2NrRGVtdXhlclN0cmVhbSgpIHt9Ci0KLU1vY2tWaWRlb0RlY29kZXI6Ok1vY2tWaWRlb0RlY29kZXIoKSB7Ci0gIEVYUEVDVF9DQUxMKCp0aGlzLCBIYXNBbHBoYSgpKS5XaWxsUmVwZWF0ZWRseShSZXR1cm4oZmFsc2UpKTsKLX0KLQotTW9ja1ZpZGVvRGVjb2Rlcjo6fk1vY2tWaWRlb0RlY29kZXIoKSB7fQotCi1Nb2NrQXVkaW9EZWNvZGVyOjpNb2NrQXVkaW9EZWNvZGVyKCkge30KLQotTW9ja0F1ZGlvRGVjb2Rlcjo6fk1vY2tBdWRpb0RlY29kZXIoKSB7fQotCi1Nb2NrVmlkZW9SZW5kZXJlcjo6TW9ja1ZpZGVvUmVuZGVyZXIoKSB7fQotCi1Nb2NrVmlkZW9SZW5kZXJlcjo6fk1vY2tWaWRlb1JlbmRlcmVyKCkge30KLQotTW9ja0F1ZGlvUmVuZGVyZXI6Ok1vY2tBdWRpb1JlbmRlcmVyKCkge30KLQotTW9ja0F1ZGlvUmVuZGVyZXI6On5Nb2NrQXVkaW9SZW5kZXJlcigpIHt9Ci0KLU1vY2tEZWNyeXB0b3I6Ok1vY2tEZWNyeXB0b3IoKSB7fQotCi1Nb2NrRGVjcnlwdG9yOjp+TW9ja0RlY3J5cHRvcigpIHt9Ci0KLXZvaWQgTW9ja0RlY3J5cHRvcjo6SW5pdGlhbGl6ZUF1ZGlvRGVjb2RlcigKLSAgICBzY29wZWRfcHRyPEF1ZGlvRGVjb2RlckNvbmZpZz4gY29uZmlnLAotICAgIGNvbnN0IERlY29kZXJJbml0Q0ImIGluaXRfY2IpIHsKLSAgSW5pdGlhbGl6ZUF1ZGlvRGVjb2Rlck1vY2soKmNvbmZpZywgaW5pdF9jYik7Ci19Ci0KLXZvaWQgTW9ja0RlY3J5cHRvcjo6SW5pdGlhbGl6ZVZpZGVvRGVjb2RlcigKLSAgICBzY29wZWRfcHRyPFZpZGVvRGVjb2RlckNvbmZpZz4gY29uZmlnLAotICAgIGNvbnN0IERlY29kZXJJbml0Q0ImIGluaXRfY2IpIHsKLSAgSW5pdGlhbGl6ZVZpZGVvRGVjb2Rlck1vY2soKmNvbmZpZywgaW5pdF9jYik7Ci19Ci0KLU1vY2tEZWNyeXB0b3JDbGllbnQ6Ok1vY2tEZWNyeXB0b3JDbGllbnQoKSB7fQotCi1Nb2NrRGVjcnlwdG9yQ2xpZW50Ojp+TW9ja0RlY3J5cHRvckNsaWVudCgpIHt9Ci0KLXZvaWQgTW9ja0RlY3J5cHRvckNsaWVudDo6TmVlZEtleShjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfYXJyYXk8dWludDg+IGluaXRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5pdF9kYXRhX2xlbmd0aCkgewotICBOZWVkS2V5TW9jayhrZXlfc3lzdGVtLCBzZXNzaW9uX2lkLCB0eXBlLCBpbml0X2RhdGEuZ2V0KCksIGluaXRfZGF0YV9sZW5ndGgpOwotfQotCi1Nb2NrRmlsdGVyQ29sbGVjdGlvbjo6TW9ja0ZpbHRlckNvbGxlY3Rpb24oKQotICAgIDogZGVtdXhlcl8obmV3IE1vY2tEZW11eGVyKCkpLAotICAgICAgdmlkZW9fZGVjb2Rlcl8obmV3IE1vY2tWaWRlb0RlY29kZXIoKSksCi0gICAgICBhdWRpb19kZWNvZGVyXyhuZXcgTW9ja0F1ZGlvRGVjb2RlcigpKSwKLSAgICAgIHZpZGVvX3JlbmRlcmVyXyhuZXcgTW9ja1ZpZGVvUmVuZGVyZXIoKSksCi0gICAgICBhdWRpb19yZW5kZXJlcl8obmV3IE1vY2tBdWRpb1JlbmRlcmVyKCkpIHsKLX0KLQotTW9ja0ZpbHRlckNvbGxlY3Rpb246On5Nb2NrRmlsdGVyQ29sbGVjdGlvbigpIHt9Ci0KLXNjb3BlZF9wdHI8RmlsdGVyQ29sbGVjdGlvbj4gTW9ja0ZpbHRlckNvbGxlY3Rpb246OkNyZWF0ZSgpIHsKLSAgc2NvcGVkX3B0cjxGaWx0ZXJDb2xsZWN0aW9uPiBjb2xsZWN0aW9uKG5ldyBGaWx0ZXJDb2xsZWN0aW9uKCkpOwotICBjb2xsZWN0aW9uLT5TZXREZW11eGVyKGRlbXV4ZXJfKTsKLSAgY29sbGVjdGlvbi0+R2V0VmlkZW9EZWNvZGVycygpLT5wdXNoX2JhY2sodmlkZW9fZGVjb2Rlcl8pOwotICBjb2xsZWN0aW9uLT5HZXRBdWRpb0RlY29kZXJzKCktPnB1c2hfYmFjayhhdWRpb19kZWNvZGVyXyk7Ci0gIGNvbGxlY3Rpb24tPkFkZFZpZGVvUmVuZGVyZXIodmlkZW9fcmVuZGVyZXJfKTsKLSAgY29sbGVjdGlvbi0+QWRkQXVkaW9SZW5kZXJlcihhdWRpb19yZW5kZXJlcl8pOwotICByZXR1cm4gY29sbGVjdGlvbi5QYXNzKCk7Ci19Ci0KLU1vY2tTdGF0aXN0aWNzQ0I6Ok1vY2tTdGF0aXN0aWNzQ0IoKSB7fQotCi1Nb2NrU3RhdGlzdGljc0NCOjp+TW9ja1N0YXRpc3RpY3NDQigpIHt9Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvbW9ja19maWx0ZXJzLmggYi9zcmMvbWVkaWEvYmFzZS9tb2NrX2ZpbHRlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZhZjUwOC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9tb2NrX2ZpbHRlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotLy8KLS8vIEEgbmV3IGJyZWVkIG9mIG1vY2sgbWVkaWEgZmlsdGVycywgdGhpcyB0aW1lIHVzaW5nIGdtb2NrISAgRmVlbCBmcmVlIHRvIGFkZAotLy8gYWN0aW9ucyBpZiB5b3UgbmVlZCBpbnRlcmVzdGluZyBzaWRlLWVmZmVjdHMuCi0vLwotLy8gRG9uJ3QgZm9yZ2V0IHlvdSBjYW4gdXNlIFN0cmljdE1vY2s8PiBhbmQgTmljZU1vY2s8PiBpZiB5b3Ugd2FudCB0aGUgbW9jawotLy8gZmlsdGVycyB0byBmYWlsIHRoZSB0ZXN0IG9yIGRvIG5vdGhpbmcgd2hlbiBhbiB1bmV4cGVjdGVkIG1ldGhvZCBpcyBjYWxsZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay93aWtpL0Nvb2tCb29rI05pY2VfTW9ja3NfYW5kX1N0cmljdF9Nb2NrcwotCi0jaWZuZGVmIE1FRElBX0JBU0VfTU9DS19GSUxURVJTX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfTU9DS19GSUxURVJTX0hfCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19kZWNvZGVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19kZWNvZGVyX2NvbmZpZy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fcmVuZGVyZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNyeXB0b3IuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlY3J5cHRvcl9jbGllbnQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlbXV4ZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2ZpbHRlcl9jb2xsZWN0aW9uLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9waXBlbGluZV9zdGF0dXMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXJfY29uZmlnLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb19mcmFtZS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fcmVuZGVyZXIuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gVXNlIHRoaXMgdGVtcGxhdGUgdG8gdGVzdCBmb3Igb2JqZWN0IGRlc3RydWN0aW9uIGJ5IHNldHRpbmcgZXhwZWN0YXRpb25zIG9uCi0vLyB0aGUgbWV0aG9kIE9uRGVzdHJveSgpLgotLy8KLS8vIFRPRE8oc2NoZXJrdXMpOiBub3Qgc3VyZSBhYm91dCB0aGUgbmFtaW5nLi4uICBwZXJoYXBzIGNvbnRyaWJ1dGUgdGhpcyBiYWNrCi0vLyB0byBnbW9jayBpdHNlbGYhCi10ZW1wbGF0ZTxjbGFzcyBNb2NrQ2xhc3M+Ci1jbGFzcyBEZXN0cm95YWJsZSA6IHB1YmxpYyBNb2NrQ2xhc3MgewotIHB1YmxpYzoKLSAgRGVzdHJveWFibGUoKSB7fQotCi0gIE1PQ0tfTUVUSE9EMChPbkRlc3Ryb3ksIHZvaWQoKSk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgfkRlc3Ryb3lhYmxlKCkgewotICAgIE9uRGVzdHJveSgpOwotICB9Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRGVzdHJveWFibGUpOwotfTsKLQotY2xhc3MgTW9ja0RlbXV4ZXIgOiBwdWJsaWMgRGVtdXhlciB7Ci0gcHVibGljOgotICBNb2NrRGVtdXhlcigpOwotCi0gIC8vIERlbXV4ZXIgaW1wbGVtZW50YXRpb24uCi0gIE1PQ0tfTUVUSE9EMihJbml0aWFsaXplLCB2b2lkKERlbXV4ZXJIb3N0KiBob3N0LCBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBjYikpOwotICBNT0NLX01FVEhPRDEoU2V0UGxheWJhY2tSYXRlLCB2b2lkKGZsb2F0IHBsYXliYWNrX3JhdGUpKTsKLSAgTU9DS19NRVRIT0QyKFNlZWssIHZvaWQoYmFzZTo6VGltZURlbHRhIHRpbWUsIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGNiKSk7Ci0gIE1PQ0tfTUVUSE9EMShTdG9wLCB2b2lkKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSk7Ci0gIE1PQ0tfTUVUSE9EMChPbkF1ZGlvUmVuZGVyZXJEaXNhYmxlZCwgdm9pZCgpKTsKLSAgTU9DS19NRVRIT0QxKEdldFN0cmVhbSwgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPihEZW11eGVyU3RyZWFtOjpUeXBlKSk7Ci0gIE1PQ0tfQ09OU1RfTUVUSE9EMChHZXRTdGFydFRpbWUsIGJhc2U6OlRpbWVEZWx0YSgpKTsKLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB+TW9ja0RlbXV4ZXIoKTsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNb2NrRGVtdXhlcik7Ci19OwotCi1jbGFzcyBNb2NrRGVtdXhlclN0cmVhbSA6IHB1YmxpYyBEZW11eGVyU3RyZWFtIHsKLSBwdWJsaWM6Ci0gIE1vY2tEZW11eGVyU3RyZWFtKCk7Ci0KLSAgLy8gRGVtdXhlclN0cmVhbSBpbXBsZW1lbnRhdGlvbi4KLSAgTU9DS19NRVRIT0QwKHR5cGUsIFR5cGUoKSk7Ci0gIE1PQ0tfTUVUSE9EMShSZWFkLCB2b2lkKGNvbnN0IFJlYWRDQiYgcmVhZF9jYikpOwotICBNT0NLX01FVEhPRDAoYXVkaW9fZGVjb2Rlcl9jb25maWcsIGNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYoKSk7Ci0gIE1PQ0tfTUVUSE9EMCh2aWRlb19kZWNvZGVyX2NvbmZpZywgY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJigpKTsKLSAgTU9DS19NRVRIT0QwKEVuYWJsZUJpdHN0cmVhbUNvbnZlcnRlciwgdm9pZCgpKTsKLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0gIE1PQ0tfQ09OU1RfTUVUSE9EMChTdHJlYW1XYXNFbmNyeXB0ZWQsIGJvb2woKSk7Ci0jZW5kaWYKLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB+TW9ja0RlbXV4ZXJTdHJlYW0oKTsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNb2NrRGVtdXhlclN0cmVhbSk7Ci19OwotCi1jbGFzcyBNb2NrVmlkZW9EZWNvZGVyIDogcHVibGljIFZpZGVvRGVjb2RlciB7Ci0gcHVibGljOgotICBNb2NrVmlkZW9EZWNvZGVyKCk7Ci0KLSAgLy8gVmlkZW9EZWNvZGVyIGltcGxlbWVudGF0aW9uLgotICBNT0NLX01FVEhPRDMoSW5pdGlhbGl6ZSwgdm9pZChjb25zdCBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+JiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXRpc3RpY3NDQiYpKTsKLSAgTU9DS19NRVRIT0QxKFJlYWQsIHZvaWQoY29uc3QgUmVhZENCJikpOwotICBNT0NLX01FVEhPRDEoUmVzZXQsIHZvaWQoY29uc3QgYmFzZTo6Q2xvc3VyZSYpKTsKLSAgTU9DS19NRVRIT0QxKFN0b3AsIHZvaWQoY29uc3QgYmFzZTo6Q2xvc3VyZSYpKTsKLSAgTU9DS19DT05TVF9NRVRIT0QwKEhhc0FscGhhLCBib29sKCkpOwotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIH5Nb2NrVmlkZW9EZWNvZGVyKCk7Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTW9ja1ZpZGVvRGVjb2Rlcik7Ci19OwotCi1jbGFzcyBNb2NrQXVkaW9EZWNvZGVyIDogcHVibGljIEF1ZGlvRGVjb2RlciB7Ci0gcHVibGljOgotICBNb2NrQXVkaW9EZWNvZGVyKCk7Ci0KLSAgLy8gQXVkaW9EZWNvZGVyIGltcGxlbWVudGF0aW9uLgotICBNT0NLX01FVEhPRDMoSW5pdGlhbGl6ZSwgdm9pZChjb25zdCBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+JiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXRpc3RpY3NDQiYpKTsKLSAgTU9DS19NRVRIT0QxKFJlYWQsIHZvaWQoY29uc3QgUmVhZENCJikpOwotICBNT0NLX01FVEhPRDAoYml0c19wZXJfY2hhbm5lbCwgaW50KHZvaWQpKTsKLSAgTU9DS19NRVRIT0QwKGNoYW5uZWxfbGF5b3V0LCBDaGFubmVsTGF5b3V0KHZvaWQpKTsKLSAgTU9DS19NRVRIT0QwKHNhbXBsZXNfcGVyX3NlY29uZCwgaW50KHZvaWQpKTsKLSAgTU9DS19NRVRIT0QxKFJlc2V0LCB2b2lkKGNvbnN0IGJhc2U6OkNsb3N1cmUmKSk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgfk1vY2tBdWRpb0RlY29kZXIoKTsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNb2NrQXVkaW9EZWNvZGVyKTsKLX07Ci0KLWNsYXNzIE1vY2tWaWRlb1JlbmRlcmVyIDogcHVibGljIFZpZGVvUmVuZGVyZXIgewotIHB1YmxpYzoKLSAgTW9ja1ZpZGVvUmVuZGVyZXIoKTsKLQotICAvLyBWaWRlb1JlbmRlcmVyIGltcGxlbWVudGF0aW9uLgotICBNT0NLX01FVEhPRDEwKEluaXRpYWxpemUsIHZvaWQoY29uc3Qgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiYgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmlkZW9EZWNvZGVyTGlzdCYgZGVjb2RlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBpbml0X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdGlzdGljc0NCJiBzdGF0aXN0aWNzX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGltZUNCJiB0aW1lX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmF0dXJhbFNpemVDaGFuZ2VkQ0ImIHNpemVfY2hhbmdlZF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIGVuZGVkX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgZXJyb3JfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaW1lRGVsdGFDQiYgZ2V0X3RpbWVfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaW1lRGVsdGFDQiYgZ2V0X2R1cmF0aW9uX2NiKSk7Ci0gIE1PQ0tfTUVUSE9EMShQbGF5LCB2b2lkKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSk7Ci0gIE1PQ0tfTUVUSE9EMShQYXVzZSwgdm9pZChjb25zdCBiYXNlOjpDbG9zdXJlJiBjYWxsYmFjaykpOwotICBNT0NLX01FVEhPRDEoRmx1c2gsIHZvaWQoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spKTsKLSAgTU9DS19NRVRIT0QyKFByZXJvbGwsIHZvaWQoYmFzZTo6VGltZURlbHRhIHRpbWUsIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGNiKSk7Ci0gIE1PQ0tfTUVUSE9EMShTdG9wLCB2b2lkKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSk7Ci0gIE1PQ0tfTUVUSE9EMShTZXRQbGF5YmFja1JhdGUsIHZvaWQoZmxvYXQgcGxheWJhY2tfcmF0ZSkpOwotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIH5Nb2NrVmlkZW9SZW5kZXJlcigpOwotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE1vY2tWaWRlb1JlbmRlcmVyKTsKLX07Ci0KLWNsYXNzIE1vY2tBdWRpb1JlbmRlcmVyIDogcHVibGljIEF1ZGlvUmVuZGVyZXIgewotIHB1YmxpYzoKLSAgTW9ja0F1ZGlvUmVuZGVyZXIoKTsKLQotICAvLyBBdWRpb1JlbmRlcmVyIGltcGxlbWVudGF0aW9uLgotICBNT0NLX01FVEhPRDkoSW5pdGlhbGl6ZSwgdm9pZChjb25zdCBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+JiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGVjb2Rlckxpc3QmIGRlY29kZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBpbml0X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0aXN0aWNzQ0ImIHN0YXRpc3RpY3NfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIHVuZGVyZmxvd19jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGltZUNCJiB0aW1lX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiBlbmRlZF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6Q2xvc3VyZSYgZGlzYWJsZWRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGVycm9yX2NiKSk7Ci0gIE1PQ0tfTUVUSE9EMShQbGF5LCB2b2lkKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSk7Ci0gIE1PQ0tfTUVUSE9EMShQYXVzZSwgdm9pZChjb25zdCBiYXNlOjpDbG9zdXJlJiBjYWxsYmFjaykpOwotICBNT0NLX01FVEhPRDEoRmx1c2gsIHZvaWQoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spKTsKLSAgTU9DS19NRVRIT0QxKFN0b3AsIHZvaWQoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spKTsKLSAgTU9DS19NRVRIT0QxKFNldFBsYXliYWNrUmF0ZSwgdm9pZChmbG9hdCBwbGF5YmFja19yYXRlKSk7Ci0gIE1PQ0tfTUVUSE9EMihQcmVyb2xsLCB2b2lkKGJhc2U6OlRpbWVEZWx0YSB0aW1lLCBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBjYikpOwotICBNT0NLX01FVEhPRDEoU2V0Vm9sdW1lLCB2b2lkKGZsb2F0IHZvbHVtZSkpOwotICBNT0NLX01FVEhPRDEoUmVzdW1lQWZ0ZXJVbmRlcmZsb3csIHZvaWQoYm9vbCBidWZmZXJfbW9yZV9hdWRpbykpOwotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIH5Nb2NrQXVkaW9SZW5kZXJlcigpOwotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE1vY2tBdWRpb1JlbmRlcmVyKTsKLX07Ci0KLWNsYXNzIE1vY2tEZWNyeXB0b3IgOiBwdWJsaWMgRGVjcnlwdG9yIHsKLSBwdWJsaWM6Ci0gIE1vY2tEZWNyeXB0b3IoKTsKLSAgdmlydHVhbCB+TW9ja0RlY3J5cHRvcigpOwotCi0gIE1PQ0tfTUVUSE9ENChHZW5lcmF0ZUtleVJlcXVlc3QsIGJvb2woY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIGluaXRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5pdF9kYXRhX2xlbmd0aCkpOwotICBNT0NLX01FVEhPRDYoQWRkS2V5LCB2b2lkKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGtleV9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIGluaXRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5pdF9kYXRhX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCkpOwotICBNT0NLX01FVEhPRDIoQ2FuY2VsS2V5UmVxdWVzdCwgdm9pZChjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25faWQpKTsKLSAgTU9DS19NRVRIT0QyKFJlZ2lzdGVyS2V5QWRkZWRDQiwgdm9pZChTdHJlYW1UeXBlIHN0cmVhbV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEtleUFkZGVkQ0ImIGtleV9hZGRlZF9jYikpOwotICBNT0NLX01FVEhPRDMoRGVjcnlwdCwgdm9pZChTdHJlYW1UeXBlIHN0cmVhbV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBlbmNyeXB0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY3J5cHRDQiYgZGVjcnlwdF9jYikpOwotICBNT0NLX01FVEhPRDEoQ2FuY2VsRGVjcnlwdCwgdm9pZChTdHJlYW1UeXBlIHN0cmVhbV90eXBlKSk7Ci0gIC8vIFRPRE8oeGh3YW5nKTogVGhlIGZvbGxvd2luZyB0d28gbWV0aG9kcyBhcmUgd29ya2Fyb3VuZHMgb2YgdGhlIGlzc3VlIHRoYXQKLSAgLy8gbW92ZS1vbmx5IHBhcmFtZXRlcnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gbW9ja2VkIG1ldGhvZHMuIFJlbW92ZSB3aGVuIHRoZQotICAvLyBpc3N1ZSBpcyBmaXhlZDogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3QvaXNzdWVzL2RldGFpbD9pZD0zOTUKLSAgTU9DS19NRVRIT0QyKEluaXRpYWxpemVBdWRpb0RlY29kZXJNb2NrLAotICAgICAgICAgICAgICAgdm9pZChjb25zdCBBdWRpb0RlY29kZXJDb25maWcmIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjb2RlckluaXRDQiYgaW5pdF9jYikpOwotICBNT0NLX01FVEhPRDIoSW5pdGlhbGl6ZVZpZGVvRGVjb2Rlck1vY2ssCi0gICAgICAgICAgICAgICB2b2lkKGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNvZGVySW5pdENCJiBpbml0X2NiKSk7Ci0gIE1PQ0tfTUVUSE9EMihEZWNyeXB0QW5kRGVjb2RlQXVkaW8sCi0gICAgICAgICAgICAgICB2b2lkKGNvbnN0IHNjb3BlZF9yZWZwdHI8bWVkaWE6OkRlY29kZXJCdWZmZXI+JiBlbmNyeXB0ZWQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGVjb2RlQ0ImIGF1ZGlvX2RlY29kZV9jYikpOwotICBNT0NLX01FVEhPRDIoRGVjcnlwdEFuZERlY29kZVZpZGVvLAotICAgICAgICAgICAgICAgdm9pZChjb25zdCBzY29wZWRfcmVmcHRyPG1lZGlhOjpEZWNvZGVyQnVmZmVyPiYgZW5jcnlwdGVkLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBWaWRlb0RlY29kZUNCJiB2aWRlb19kZWNvZGVfY2IpKTsKLSAgTU9DS19NRVRIT0QxKFJlc2V0RGVjb2Rlciwgdm9pZChTdHJlYW1UeXBlIHN0cmVhbV90eXBlKSk7Ci0gIE1PQ0tfTUVUSE9EMShEZWluaXRpYWxpemVEZWNvZGVyLCB2b2lkKFN0cmVhbVR5cGUgc3RyZWFtX3R5cGUpKTsKLQotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZUF1ZGlvRGVjb2RlcihzY29wZWRfcHRyPEF1ZGlvRGVjb2RlckNvbmZpZz4gY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNvZGVySW5pdENCJiBpbml0X2NiKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIEluaXRpYWxpemVWaWRlb0RlY29kZXIoc2NvcGVkX3B0cjxWaWRlb0RlY29kZXJDb25maWc+IGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjb2RlckluaXRDQiYgaW5pdF9jYikgT1ZFUlJJREU7Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTW9ja0RlY3J5cHRvcik7Ci19OwotCi1jbGFzcyBNb2NrRGVjcnlwdG9yQ2xpZW50IDogcHVibGljIERlY3J5cHRvckNsaWVudCB7Ci0gcHVibGljOgotICBNb2NrRGVjcnlwdG9yQ2xpZW50KCk7Ci0gIHZpcnR1YWwgfk1vY2tEZWNyeXB0b3JDbGllbnQoKTsKLQotICBNT0NLX01FVEhPRDIoS2V5QWRkZWQsIHZvaWQoY29uc3Qgc3RkOjpzdHJpbmcmLCBjb25zdCBzdGQ6OnN0cmluZyYpKTsKLSAgTU9DS19NRVRIT0Q0KEtleUVycm9yLCB2b2lkKGNvbnN0IHN0ZDo6c3RyaW5nJiwgY29uc3Qgc3RkOjpzdHJpbmcmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdG9yOjpLZXlFcnJvciwgaW50KSk7Ci0gIE1PQ0tfTUVUSE9ENChLZXlNZXNzYWdlLCB2b2lkKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZWZhdWx0X3VybCkpOwotICAvLyBUT0RPKHhod2FuZyk6IFRoaXMgaXMgYSB3b3JrYXJvdW5kIG9mIHRoZSBpc3N1ZSB0aGF0IG1vdmUtb25seSBwYXJhbWV0ZXJzCi0gIC8vIGFyZSBub3Qgc3VwcG9ydGVkIGluIG1vY2tlZCBtZXRob2RzLiBSZW1vdmUgdGhpcyB3aGVuIHRoZSBpc3N1ZSBpcyBmaXhlZAotICAvLyAoaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3QvaXNzdWVzL2RldGFpbD9pZD0zOTUpIG9yIHdoZW4gd2UgdXNlCi0gIC8vIHN0ZDo6c3RyaW5nIGluc3RlYWQgb2Ygc2NvcGVkX2FycmF5PHVpbnQ4PiAoaHR0cDovL2NyYnVnLmNvbS8xMzA2ODkpLgotICBNT0NLX01FVEhPRDUoTmVlZEtleU1vY2ssIHZvaWQoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIGluaXRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbml0X2RhdGFfbGVuZ3RoKSk7Ci0gIHZpcnR1YWwgdm9pZCBOZWVkS2V5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9hcnJheTx1aW50OD4gaW5pdF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5pdF9kYXRhX2xlbmd0aCkgT1ZFUlJJREU7Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTW9ja0RlY3J5cHRvckNsaWVudCk7Ci19OwotCi0vLyBGaWx0ZXJGYWN0b3J5IHRoYXQgcmV0dXJucyBjYW5uZWQgaW5zdGFuY2VzIG9mIG1vY2sgZmlsdGVycy4gIFlvdSBjYW4gc2V0Ci0vLyBleHBlY3RhdGlvbnMgb24gdGhlIGZpbHRlcnMgYW5kIHRoZW4gcGFzcyB0aGUgY29sbGVjdGlvbiBpbnRvIGEgcGlwZWxpbmUuCi1jbGFzcyBNb2NrRmlsdGVyQ29sbGVjdGlvbiB7Ci0gcHVibGljOgotICBNb2NrRmlsdGVyQ29sbGVjdGlvbigpOwotICB2aXJ0dWFsIH5Nb2NrRmlsdGVyQ29sbGVjdGlvbigpOwotCi0gIC8vIE1vY2sgYWNjZXNzb3JzLgotICBNb2NrRGVtdXhlciogZGVtdXhlcigpIGNvbnN0IHsgcmV0dXJuIGRlbXV4ZXJfOyB9Ci0gIE1vY2tWaWRlb0RlY29kZXIqIHZpZGVvX2RlY29kZXIoKSBjb25zdCB7IHJldHVybiB2aWRlb19kZWNvZGVyXzsgfQotICBNb2NrQXVkaW9EZWNvZGVyKiBhdWRpb19kZWNvZGVyKCkgY29uc3QgeyByZXR1cm4gYXVkaW9fZGVjb2Rlcl87IH0KLSAgTW9ja1ZpZGVvUmVuZGVyZXIqIHZpZGVvX3JlbmRlcmVyKCkgY29uc3QgeyByZXR1cm4gdmlkZW9fcmVuZGVyZXJfOyB9Ci0gIE1vY2tBdWRpb1JlbmRlcmVyKiBhdWRpb19yZW5kZXJlcigpIGNvbnN0IHsgcmV0dXJuIGF1ZGlvX3JlbmRlcmVyXzsgfQotCi0gIC8vIENyZWF0ZXMgdGhlIEZpbHRlckNvbGxlY3Rpb24gY29udGFpbmluZyB0aGUgbW9ja3MuCi0gIHNjb3BlZF9wdHI8RmlsdGVyQ29sbGVjdGlvbj4gQ3JlYXRlKCk7Ci0KLSBwcml2YXRlOgotICBzY29wZWRfcmVmcHRyPE1vY2tEZW11eGVyPiBkZW11eGVyXzsKLSAgc2NvcGVkX3JlZnB0cjxNb2NrVmlkZW9EZWNvZGVyPiB2aWRlb19kZWNvZGVyXzsKLSAgc2NvcGVkX3JlZnB0cjxNb2NrQXVkaW9EZWNvZGVyPiBhdWRpb19kZWNvZGVyXzsKLSAgc2NvcGVkX3JlZnB0cjxNb2NrVmlkZW9SZW5kZXJlcj4gdmlkZW9fcmVuZGVyZXJfOwotICBzY29wZWRfcmVmcHRyPE1vY2tBdWRpb1JlbmRlcmVyPiBhdWRpb19yZW5kZXJlcl87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE1vY2tGaWx0ZXJDb2xsZWN0aW9uKTsKLX07Ci0KLS8vIEhlbHBlciBtb2NrIHN0YXRpc3RpY3MgY2FsbGJhY2suCi1jbGFzcyBNb2NrU3RhdGlzdGljc0NCIHsKLSBwdWJsaWM6Ci0gIE1vY2tTdGF0aXN0aWNzQ0IoKTsKLSAgfk1vY2tTdGF0aXN0aWNzQ0IoKTsKLQotICBNT0NLX01FVEhPRDEoT25TdGF0aXN0aWNzLCB2b2lkKGNvbnN0IG1lZGlhOjpQaXBlbGluZVN0YXRpc3RpY3MmIHN0YXRpc3RpY3MpKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0JBU0VfTU9DS19GSUxURVJTX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9tb2NrX3NoZWxsX2RhdGFfc291cmNlX3JlYWRlci5oIGIvc3JjL21lZGlhL2Jhc2UvbW9ja19zaGVsbF9kYXRhX3NvdXJjZV9yZWFkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlhZTQ2OC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9tb2NrX3NoZWxsX2RhdGFfc291cmNlX3JlYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9CQVNFX01PQ0tfU0hFTExfREFUQV9TT1VSQ0VfUkVBREVSX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfTU9DS19TSEVMTF9EQVRBX1NPVVJDRV9SRUFERVJfSF8KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2hlbGxfZGF0YV9zb3VyY2VfcmVhZGVyLmgiCi0jaW5jbHVkZSAidGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIE1vY2tTaGVsbERhdGFTb3VyY2VSZWFkZXIgOiBwdWJsaWMgU2hlbGxEYXRhU291cmNlUmVhZGVyIHsKLSBwdWJsaWM6Ci0gIE1vY2tTaGVsbERhdGFTb3VyY2VSZWFkZXIoKSB7fQotCi0gIC8vIFNoZWxsRGF0YVNvdXJjZVJlYWRlciBpbXBsZW1lbnRhdGlvbgotICBNT0NLX01FVEhPRDEoU2V0RGF0YVNvdXJjZSwgdm9pZChzY29wZWRfcmVmcHRyPERhdGFTb3VyY2U+KSk7Ci0gIE1PQ0tfTUVUSE9EMShTZXRFcnJvckNhbGxiYWNrLCB2b2lkKGJhc2U6OkNsb3N1cmUpKTsKLSAgTU9DS19NRVRIT0QzKEJsb2NraW5nUmVhZCwgaW50KGludDY0LCBpbnQsIHVpbnQ4KikpOwotICBNT0NLX01FVEhPRDAoRmlsZVNpemUsIGludDY0KCkpOwotICBNT0NLX01FVEhPRDAoQWJvcnRQZW5kaW5nUmVhZElmQW55LCB2b2lkKCkpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQkFTRV9NT0NLX1NIRUxMX0RBVEFfU09VUkNFX1JFQURFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvbXVsdGlfY2hhbm5lbF9yZXNhbXBsZXIuY2MgYi9zcmMvbWVkaWEvYmFzZS9tdWx0aV9jaGFubmVsX3Jlc2FtcGxlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVjYmYzZS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9tdWx0aV9jaGFubmVsX3Jlc2FtcGxlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tdWx0aV9jaGFubmVsX3Jlc2FtcGxlci5oIgotCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiYmFzZS9iaW5kX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2J1cy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1NdWx0aUNoYW5uZWxSZXNhbXBsZXI6Ok11bHRpQ2hhbm5lbFJlc2FtcGxlcihpbnQgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgaW9fc2FtcGxlX3JhdGVfcmF0aW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWFkQ0ImIHJlYWRfY2IpCi0gICAgOiBsYXN0X2ZyYW1lX2NvdW50XygwKSwKLSAgICAgIHJlYWRfY2JfKHJlYWRfY2IpLAotICAgICAgb3V0cHV0X2ZyYW1lc19yZWFkeV8oMCkgewotICAvLyBBbGxvY2F0ZSBlYWNoIGNoYW5uZWwncyByZXNhbXBsZXIuCi0gIHJlc2FtcGxlcnNfLnJlc2VydmUoY2hhbm5lbHMpOwotICBmb3IgKGludCBpID0gMDsgaSA8IGNoYW5uZWxzOyArK2kpIHsKLSAgICByZXNhbXBsZXJzXy5wdXNoX2JhY2sobmV3IFNpbmNSZXNhbXBsZXIoaW9fc2FtcGxlX3JhdGVfcmF0aW8sIGJhc2U6OkJpbmQoCi0gICAgICAgICZNdWx0aUNoYW5uZWxSZXNhbXBsZXI6OlByb3ZpZGVJbnB1dCwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwgaSkpKTsKLSAgfQotfQotCi1NdWx0aUNoYW5uZWxSZXNhbXBsZXI6On5NdWx0aUNoYW5uZWxSZXNhbXBsZXIoKSB7fQotCi12b2lkIE11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6UmVzYW1wbGUoQXVkaW9CdXMqIGF1ZGlvX2J1cywgaW50IGZyYW1lcykgewotICBEQ0hFQ0tfRVEoc3RhdGljX2Nhc3Q8c2l6ZV90PihhdWRpb19idXMtPmNoYW5uZWxzKCkpLCByZXNhbXBsZXJzXy5zaXplKCkpOwotCi0gIC8vIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgU2luY1Jlc2FtcGxlciBvbmx5IGNhbGxzIFByb3ZpZGVJbnB1dCBvbmNlIGZvciBlYWNoCi0gIC8vIGNoYW5uZWwuICBUbyBlbnN1cmUgdGhpcywgd2UgY2h1bmsgdGhlIG51bWJlciBvZiByZXF1ZXN0ZWQgZnJhbWVzIGludG8KLSAgLy8gU2luY1Jlc2FtcGxlcjo6Q2h1bmtTaXplKCkgc2l6ZWQgY2h1bmtzLiAgU2luY1Jlc2FtcGxlciBndWFyYW50ZWVzIGl0IHdpbGwKLSAgLy8gb25seSBjYWxsIFByb3ZpZGVJbnB1dCgpIG9uY2Ugd2hlbiB3ZSByZXNhbXBsZSB0aGlzIHdheS4KLSAgb3V0cHV0X2ZyYW1lc19yZWFkeV8gPSAwOwotICBpbnQgY2h1bmtfc2l6ZSA9IHJlc2FtcGxlcnNfWzBdLT5DaHVua1NpemUoKTsKLSAgd2hpbGUgKG91dHB1dF9mcmFtZXNfcmVhZHlfIDwgZnJhbWVzKSB7Ci0gICAgaW50IGZyYW1lc190aGlzX3RpbWUgPSBzdGQ6Om1pbihmcmFtZXMgLSBvdXRwdXRfZnJhbWVzX3JlYWR5XywgY2h1bmtfc2l6ZSk7Ci0KLSAgICAvLyBSZXNhbXBsZSBlYWNoIGNoYW5uZWwuCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXNhbXBsZXJzXy5zaXplKCk7ICsraSkgewotICAgICAgRENIRUNLX0VRKGNodW5rX3NpemUsIHJlc2FtcGxlcnNfW2ldLT5DaHVua1NpemUoKSk7Ci0KLSAgICAgIC8vIERlcGVuZGluZyBvbiB0aGUgc2FtcGxlLXJhdGUgc2NhbGUgZmFjdG9yLCBhbmQgdGhlIGludGVybmFsIGJ1ZmZlcmluZwotICAgICAgLy8gdXNlZCBpbiBhIFNpbmNSZXNhbXBsZXIga2VybmVsLCB0aGlzIGNhbGwgdG8gUmVzYW1wbGUoKSB3aWxsIG9ubHkKLSAgICAgIC8vIHNvbWV0aW1lcyBjYWxsIFByb3ZpZGVJbnB1dCgpLiAgSG93ZXZlciwgaWYgaXQgY2FsbHMgUHJvdmlkZUlucHV0KCkgZm9yCi0gICAgICAvLyB0aGUgZmlyc3QgY2hhbm5lbCwgdGhlbiBpdCB3aWxsIGNhbGwgaXQgZm9yIHRoZSByZW1haW5pbmcgY2hhbm5lbHMsCi0gICAgICAvLyBzaW5jZSB0aGV5IGFsbCBidWZmZXIgaW4gdGhlIHNhbWUgd2F5IGFuZCBhcmUgcHJvY2Vzc2luZyB0aGUgc2FtZQotICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcy4KLSAgICAgIHJlc2FtcGxlcnNfW2ldLT5SZXNhbXBsZSgKLSAgICAgICAgICBhdWRpb19idXMtPmNoYW5uZWwoaSkgKyBvdXRwdXRfZnJhbWVzX3JlYWR5XywgZnJhbWVzX3RoaXNfdGltZSk7Ci0gICAgfQotCi0gICAgb3V0cHV0X2ZyYW1lc19yZWFkeV8gKz0gZnJhbWVzX3RoaXNfdGltZTsKLSAgfQotfQotCi12b2lkIE11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6UHJvdmlkZUlucHV0KGludCBjaGFubmVsLCBmbG9hdCogZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZXMpIHsKLSAgLy8gR2V0IHRoZSBkYXRhIGZyb20gdGhlIG11bHRpLWNoYW5uZWwgcHJvdmlkZXIgd2hlbiB0aGUgZmlyc3QgY2hhbm5lbCBhc2tzCi0gIC8vIGZvciBpdC4gIEZvciBzdWJzZXF1ZW50IGNoYW5uZWxzLCB3ZSBjYW4ganVzdCBkaXNoIG91dCB0aGUgY2hhbm5lbCBkYXRhCi0gIC8vIGZyb20gdGhhdCAoc3RvcmVkIGluIHxyZXNhbXBsZXJfYXVkaW9fYnVzX3wpLgotICBpZiAoY2hhbm5lbCA9PSAwKSB7Ci0gICAgLy8gQWxsb2NhdGUgc3RhZ2luZyBhcnJheXMgb24gdGhlIGZpcnN0IHJlcXVlc3QgYW5kIGlmIHRoZSBmcmFtZSBzaXplIG9yCi0gICAgLy8gfGRlc3RpbmF0aW9ufCBjaGFuZ2VzIChzaG91bGQgb25seSBoYXBwZW4gb25jZSkuCi0gICAgaWYgKCFyZXNhbXBsZXJfYXVkaW9fYnVzXy5nZXQoKSB8fAotICAgICAgICByZXNhbXBsZXJfYXVkaW9fYnVzXy0+ZnJhbWVzKCkgIT0gZnJhbWVzIHx8Ci0gICAgICAgIHdyYXBwZWRfcmVzYW1wbGVyX2F1ZGlvX2J1c18tPmNoYW5uZWwoMCkgIT0gZGVzdGluYXRpb24pIHsKLSAgICAgIHJlc2FtcGxlcl9hdWRpb19idXNfID0gQXVkaW9CdXM6OkNyZWF0ZShyZXNhbXBsZXJzXy5zaXplKCksIGZyYW1lcyk7Ci0KLSAgICAgIC8vIENyZWF0ZSBhIGNoYW5uZWwgdmVjdG9yIGJhc2VkIG9uIHxyZXNhbXBsZXJfYXVkaW9fYnVzX3wgYnV0IHVzaW5nCi0gICAgICAvLyB8ZGVzdGluYXRpb258IGRpcmVjdGx5IGZvciB0aGUgZmlyc3QgY2hhbm5lbCBhbmQgdGhlbiB3cmFwIGl0IGluIGEgbmV3Ci0gICAgICAvLyBBdWRpb0J1cyBzbyB3ZSBjYW4gYXZvaWQgYW4gZXh0cmEgbWVtY3B5IGxhdGVyLgotICAgICAgcmVzYW1wbGVyX2F1ZGlvX2RhdGFfLmNsZWFyKCk7Ci0gICAgICByZXNhbXBsZXJfYXVkaW9fZGF0YV8ucmVzZXJ2ZShyZXNhbXBsZXJfYXVkaW9fYnVzXy0+Y2hhbm5lbHMoKSk7Ci0gICAgICByZXNhbXBsZXJfYXVkaW9fZGF0YV8ucHVzaF9iYWNrKGRlc3RpbmF0aW9uKTsKLSAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcmVzYW1wbGVyX2F1ZGlvX2J1c18tPmNoYW5uZWxzKCk7ICsraSkKLSAgICAgICAgcmVzYW1wbGVyX2F1ZGlvX2RhdGFfLnB1c2hfYmFjayhyZXNhbXBsZXJfYXVkaW9fYnVzXy0+Y2hhbm5lbChpKSk7Ci0gICAgICB3cmFwcGVkX3Jlc2FtcGxlcl9hdWRpb19idXNfID0gQXVkaW9CdXM6OldyYXBWZWN0b3IoCi0gICAgICAgICAgZnJhbWVzLCByZXNhbXBsZXJfYXVkaW9fZGF0YV8pOwotICAgIH0KLQotICAgIGxhc3RfZnJhbWVfY291bnRfID0gZnJhbWVzOwotICAgIHJlYWRfY2JfLlJ1bihvdXRwdXRfZnJhbWVzX3JlYWR5Xywgd3JhcHBlZF9yZXNhbXBsZXJfYXVkaW9fYnVzXy5nZXQoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gQWxsIGNoYW5uZWxzIG11c3QgYXNrIGZvciB0aGUgc2FtZSBhbW91bnQuICBUaGlzIHNob3VsZCBhbHdheXMgYmUgdGhlCi0gICAgLy8gY2FzZSwgYnV0IGxldCdzIGp1c3QgbWFrZSBzdXJlLgotICAgIERDSEVDS19FUShmcmFtZXMsIGxhc3RfZnJhbWVfY291bnRfKTsKLQotICAgIC8vIENvcHkgdGhlIGNoYW5uZWwgZGF0YSBmcm9tIHdoYXQgd2UgcmVjZWl2ZWQgZnJvbSB8cmVhZF9jYl98LgotICAgIG1lbWNweShkZXN0aW5hdGlvbiwgcmVzYW1wbGVyX2F1ZGlvX2J1c18tPmNoYW5uZWwoY2hhbm5lbCksCi0gICAgICAgICAgIHNpemVvZigqcmVzYW1wbGVyX2F1ZGlvX2J1c18tPmNoYW5uZWwoY2hhbm5lbCkpICogZnJhbWVzKTsKLSAgfQotfQotCi12b2lkIE11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6Rmx1c2goKSB7Ci0gIGxhc3RfZnJhbWVfY291bnRfID0gMDsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXNhbXBsZXJzXy5zaXplKCk7ICsraSkKLSAgICByZXNhbXBsZXJzX1tpXS0+Rmx1c2goKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9tdWx0aV9jaGFubmVsX3Jlc2FtcGxlci5oIGIvc3JjL21lZGlhL2Jhc2UvbXVsdGlfY2hhbm5lbF9yZXNhbXBsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRkNTY1Yi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9tdWx0aV9jaGFubmVsX3Jlc2FtcGxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9CQVNFX01VTFRJX0NIQU5ORUxfUkVTQU1QTEVSX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfTVVMVElfQ0hBTk5FTF9SRVNBTVBMRVJfSF8KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3ZlY3Rvci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2luY19yZXNhbXBsZXIuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLWNsYXNzIEF1ZGlvQnVzOwotCi0vLyBNdWx0aUNoYW5uZWxSZXNhbXBsZXIgaXMgYSBtdWx0aSBjaGFubmVsIHdyYXBwZXIgZm9yIFNpbmNSZXNhbXBsZXI7IGFsbG93aW5nCi0vLyBoaWdoIHF1YWxpdHkgc2FtcGxlIHJhdGUgY29udmVyc2lvbiBvZiBtdWx0aXBsZSBjaGFubmVscyBhdCBvbmNlLgotY2xhc3MgTUVESUFfRVhQT1JUIE11bHRpQ2hhbm5lbFJlc2FtcGxlciB7Ci0gcHVibGljOgotICAvLyBDYWxsYmFjayB0eXBlIGZvciBwcm92aWRpbmcgbW9yZSBkYXRhIGludG8gdGhlIHJlc2FtcGxlci4gIEV4cGVjdHMgQXVkaW9CdXMKLSAgLy8gdG8gYmUgY29tcGxldGVseSBmaWxsZWQgd2l0aCBkYXRhIHVwb24gcmV0dXJuOyB6ZXJvIHBhZGRlZCBpZiBub3QgZW5vdWdoCi0gIC8vIGZyYW1lcyBhcmUgYXZhaWxhYmxlIHRvIHNhdGlzZnkgdGhlIHJlcXVlc3QuICB8ZnJhbWVfZGVsYXl8IGlzIHRoZSBudW1iZXIKLSAgLy8gb2Ygb3V0cHV0IGZyYW1lcyBhbHJlYWR5IHByb2Nlc3NlZCBhbmQgY2FuIGJlIHVzZWQgdG8gZXN0aW1hdGUgZGVsYXkuCi0gIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZChpbnQgZnJhbWVfZGVsYXksIEF1ZGlvQnVzKiBhdWRpb19idXMpPiBSZWFkQ0I7Ci0KLSAgLy8gQ29uc3RydWN0cyBhIE11bHRpQ2hhbm5lbFJlc2FtcGxlciB3aXRoIHRoZSBzcGVjaWZpZWQgfHJlYWRfY2J8LCB3aGljaCBpcwotICAvLyB1c2VkIHRvIGFjcXVpcmUgYXVkaW8gZGF0YSBmb3IgcmVzYW1wbGluZy4gIHxpb19zYW1wbGVfcmF0ZV9yYXRpb3wgaXMgdGhlCi0gIC8vIHJhdGlvIG9mIGlucHV0IC8gb3V0cHV0IHNhbXBsZSByYXRlcy4KLSAgTXVsdGlDaGFubmVsUmVzYW1wbGVyKGludCBjaGFubmVscywgZG91YmxlIGlvX3NhbXBsZV9yYXRlX3JhdGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVhZENCJiByZWFkX2NiKTsKLSAgdmlydHVhbCB+TXVsdGlDaGFubmVsUmVzYW1wbGVyKCk7Ci0KLSAgLy8gUmVzYW1wbGVzIHxmcmFtZXN8IG9mIGRhdGEgZnJvbSB8cmVhZF9jYl98IGludG8gQXVkaW9CdXMuCi0gIHZvaWQgUmVzYW1wbGUoQXVkaW9CdXMqIGF1ZGlvX2J1cywgaW50IGZyYW1lcyk7Ci0KLSAgLy8gRmx1c2ggYWxsIGJ1ZmZlcmVkIGRhdGEgYW5kIHJlc2V0IGludGVybmFsIGluZGljZXMuCi0gIHZvaWQgRmx1c2goKTsKLQotIHByaXZhdGU6Ci0gIC8vIFNpbmNSZXNhbXBsZXI6OlJlYWRDQiBpbXBsZW1lbnRhdGlvbi4gIFByb3ZpZGVJbnB1dCgpIHdpbGwgYmUgY2FsbGVkIGZvcgotICAvLyBlYWNoIGNoYW5uZWwgKGluIGNoYW5uZWwgb3JkZXIpIGFzIFNpbmNSZXNhbXBsZXIgbmVlZHMgbW9yZSBkYXRhLgotICB2b2lkIFByb3ZpZGVJbnB1dChpbnQgY2hhbm5lbCwgZmxvYXQqIGRlc3RpbmF0aW9uLCBpbnQgZnJhbWVzKTsKLQotICAvLyBTYW5pdHkgY2hlY2sgdG8gZW5zdXJlIHRoYXQgUHJvdmlkZUlucHV0KCkgcmV0cmlldmVzIHRoZSBzYW1lIG51bWJlciBvZgotICAvLyBmcmFtZXMgZm9yIGV2ZXJ5IGNoYW5uZWwuCi0gIGludCBsYXN0X2ZyYW1lX2NvdW50XzsKLQotICAvLyBTb3VyY2Ugb2YgZGF0YSBmb3IgcmVzYW1wbGluZy4KLSAgUmVhZENCIHJlYWRfY2JfOwotCi0gIC8vIEVhY2ggY2hhbm5lbCBoYXMgaXRzIG93biBoaWdoIHF1YWxpdHkgcmVzYW1wbGVyLgotICBTY29wZWRWZWN0b3I8U2luY1Jlc2FtcGxlcj4gcmVzYW1wbGVyc187Ci0KLSAgLy8gQnVmZmVycyBmb3IgYXVkaW8gZGF0YSBnb2luZyBpbnRvIFNpbmNSZXNhbXBsZXIgZnJvbSBSZWFkQ0IuCi0gIHNjb3BlZF9wdHI8QXVkaW9CdXM+IHJlc2FtcGxlcl9hdWRpb19idXNfOwotICBzY29wZWRfcHRyPEF1ZGlvQnVzPiB3cmFwcGVkX3Jlc2FtcGxlcl9hdWRpb19idXNfOwotICBzdGQ6OnZlY3RvcjxmbG9hdCo+IHJlc2FtcGxlcl9hdWRpb19kYXRhXzsKLQotICAvLyBUaGUgbnVtYmVyIG9mIG91dHB1dCBmcmFtZXMgdGhhdCBoYXZlIHN1Y2Nlc3NmdWxseSBiZWVuIHByb2Nlc3NlZCBkdXJpbmcKLSAgLy8gdGhlIGN1cnJlbnQgUmVzYW1wbGUoKSBjYWxsLgotICBpbnQgb3V0cHV0X2ZyYW1lc19yZWFkeV87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE11bHRpQ2hhbm5lbFJlc2FtcGxlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX01VTFRJX0NIQU5ORUxfUkVTQU1QTEVSX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9tdWx0aV9jaGFubmVsX3Jlc2FtcGxlcl91bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9iYXNlL211bHRpX2NoYW5uZWxfcmVzYW1wbGVyX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDY3NTUwLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL211bHRpX2NoYW5uZWxfcmVzYW1wbGVyX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlIDxjbWF0aD4KLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvYmluZF9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fYnVzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tdWx0aV9jaGFubmVsX3Jlc2FtcGxlci5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBKdXN0IHRlc3QgYSBiYXNpYyByZXNhbXBsaW5nIGNhc2UuICBUaGUgU2luY1Jlc2FtcGxlciB1bml0IHRlc3Qgd2lsbCB0YWtlCi0vLyBjYXJlIG9mIGFjY3VyYWN5IHRlc3Rpbmc7IHdlIGp1c3QgbmVlZCB0byBjaGVjayB0aGF0IG11bHRpY2hhbm5lbCB3b3JrcyBhcwotLy8gZXhwZWN0ZWQgd2l0aGluIHNvbWUgdG9sZXJhbmNlLgotc3RhdGljIGNvbnN0IGZsb2F0IGtTY2FsZUZhY3RvciA9IDE5MjAwMC4wZiAvIDQ0MTAwLjBmOwotCi0vLyBTaW11bGF0ZSBsYXJnZSBhbmQgc21hbGwgc2FtcGxlIHJlcXVlc3RzIHVzZWQgYnkgdGhlIGRpZmZlcmVudCBhdWRpbyBwYXRocy4KLXN0YXRpYyBjb25zdCBpbnQga0hpZ2hMYXRlbmN5U2l6ZSA9IDgxOTI7Ci0vLyBMb3cgbGF0ZW5jeSBidWZmZXJzIHNob3cgYSBsYXJnZXIgZXJyb3IgdGhhbiBoaWdoIGxhdGVuY3kgb25lcy4gIFdoaWNoIG1ha2VzCi0vLyBzZW5zZSBzaW5jZSBlYWNoIGVycm9yIHJlcHJlc2VudHMgYSBsYXJnZXIgcG9ydGlvbiBvZiB0aGUgdG90YWwgcmVxdWVzdC4KLXN0YXRpYyBjb25zdCBpbnQga0xvd0xhdGVuY3lTaXplID0gMTI4OwotCi0vLyBUZXN0IGZpbGwgdmFsdWUuCi1zdGF0aWMgY29uc3QgZmxvYXQga0ZpbGxWYWx1ZSA9IDAuMWY7Ci0KLS8vIENob3NlbiBhcmJpdHJhcmlseSBiYXNlZCBvbiB3aGF0IGVhY2ggcmVzYW1wbGVyIHJlcG9ydGVkIGR1cmluZyB0ZXN0aW5nLgotc3RhdGljIGNvbnN0IGRvdWJsZSBrTG93TGF0ZW5jeU1heFJNU0Vycm9yID0gMC4wMDM2Owotc3RhdGljIGNvbnN0IGRvdWJsZSBrTG93TGF0ZW5jeU1heEVycm9yID0gMC4wNDsKLXN0YXRpYyBjb25zdCBkb3VibGUga0hpZ2hMYXRlbmN5TWF4Uk1TRXJyb3IgPSAwLjAwMzY7Ci1zdGF0aWMgY29uc3QgZG91YmxlIGtIaWdoTGF0ZW5jeU1heEVycm9yID0gMC4wNDsKLQotY2xhc3MgTXVsdGlDaGFubmVsUmVzYW1wbGVyVGVzdAotICAgIDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08aW50PiB7Ci0gcHVibGljOgotICBNdWx0aUNoYW5uZWxSZXNhbXBsZXJUZXN0KCkKLSAgICAgIDogbGFzdF9mcmFtZV9kZWxheV8oLTEpIHsKLSAgfQotICB2aXJ0dWFsIH5NdWx0aUNoYW5uZWxSZXNhbXBsZXJUZXN0KCkge30KLQotICB2b2lkIEluaXRpYWxpemVBdWRpb0RhdGEoaW50IGNoYW5uZWxzLCBpbnQgZnJhbWVzKSB7Ci0gICAgZnJhbWVzXyA9IGZyYW1lczsKLSAgICBhdWRpb19idXNfID0gQXVkaW9CdXM6OkNyZWF0ZShjaGFubmVscywgZnJhbWVzKTsKLSAgfQotCi0gIC8vIE11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6TXVsdGlDaGFubmVsQXVkaW9Tb3VyY2VQcm92aWRlciBpbXBsZW1lbnRhdGlvbiwganVzdAotICAvLyBmaWxscyB0aGUgcHJvdmlkZWQgYXVkaW9fZGF0YSB3aXRoIHxrRmlsbFZhbHVlfC4KLSAgdmlydHVhbCB2b2lkIFByb3ZpZGVJbnB1dChpbnQgZnJhbWVfZGVsYXksIEF1ZGlvQnVzKiBhdWRpb19idXMpIHsKLSAgICBFWFBFQ1RfR1QoZnJhbWVfZGVsYXksIGxhc3RfZnJhbWVfZGVsYXlfKTsKLSAgICBsYXN0X2ZyYW1lX2RlbGF5XyA9IGZyYW1lX2RlbGF5OwotCi0gICAgZmxvYXQgZmlsbF92YWx1ZSA9IGZpbGxfanVua192YWx1ZXNfID8gKDEgLyBrRmlsbFZhbHVlKSA6IGtGaWxsVmFsdWU7Ci0gICAgRVhQRUNUX0VRKGF1ZGlvX2J1cy0+Y2hhbm5lbHMoKSwgYXVkaW9fYnVzXy0+Y2hhbm5lbHMoKSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdWRpb19idXMtPmNoYW5uZWxzKCk7ICsraSkKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYXVkaW9fYnVzLT5mcmFtZXMoKTsgKytqKQotICAgICAgICBhdWRpb19idXMtPmNoYW5uZWwoaSlbal0gPSBmaWxsX3ZhbHVlOwotICB9Ci0KLSAgdm9pZCBNdWx0aUNoYW5uZWxUZXN0KGludCBjaGFubmVscywgaW50IGZyYW1lcywgZG91YmxlIGV4cGVjdGVkX21heF9ybXNfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZXhwZWN0ZWRfbWF4X2Vycm9yKSB7Ci0gICAgSW5pdGlhbGl6ZUF1ZGlvRGF0YShjaGFubmVscywgZnJhbWVzKTsKLSAgICBNdWx0aUNoYW5uZWxSZXNhbXBsZXIgcmVzYW1wbGVyKGNoYW5uZWxzLCBrU2NhbGVGYWN0b3IsIGJhc2U6OkJpbmQoCi0gICAgICAgICZNdWx0aUNoYW5uZWxSZXNhbXBsZXJUZXN0OjpQcm92aWRlSW5wdXQsIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLQotICAgIC8vIEZpcnN0IHByaW1lIHRoZSByZXNhbXBsZXIgd2l0aCBzb21lIGp1bmsgZGF0YSwgc28gd2UgY2FuIHZlcmlmeSBGbHVzaCgpLgotICAgIGZpbGxfanVua192YWx1ZXNfID0gdHJ1ZTsKLSAgICByZXNhbXBsZXIuUmVzYW1wbGUoYXVkaW9fYnVzXy5nZXQoKSwgMSk7Ci0gICAgcmVzYW1wbGVyLkZsdXNoKCk7Ci0gICAgZmlsbF9qdW5rX3ZhbHVlc18gPSBmYWxzZTsKLQotICAgIC8vIFRoZSBsYXN0IGZyYW1lIGRlbGF5IHNob3VsZCBiZSBzdHJpY3RseSBsZXNzIHRoYW4gdGhlIHRvdGFsIGZyYW1lIGNvdW50LgotICAgIEVYUEVDVF9MVChsYXN0X2ZyYW1lX2RlbGF5XywgYXVkaW9fYnVzXy0+ZnJhbWVzKCkpOwotICAgIGxhc3RfZnJhbWVfZGVsYXlfID0gLTE7Ci0KLSAgICAvLyBJZiBGbHVzaCgpIGRpZG4ndCB3b3JrLCB0aGUgcmVzdCBvZiB0aGUgdGVzdHMgd2lsbCBmYWlsLgotICAgIHJlc2FtcGxlci5SZXNhbXBsZShhdWRpb19idXNfLmdldCgpLCBmcmFtZXMpOwotICAgIFRlc3RWYWx1ZXMoZXhwZWN0ZWRfbWF4X3Jtc19lcnJvciwgZXhwZWN0ZWRfbWF4X2Vycm9yKTsKLSAgfQotCi0gIHZvaWQgSGlnaExhdGVuY3lUZXN0KGludCBjaGFubmVscykgewotICAgIE11bHRpQ2hhbm5lbFRlc3QoY2hhbm5lbHMsIGtIaWdoTGF0ZW5jeVNpemUsIGtIaWdoTGF0ZW5jeU1heFJNU0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAga0hpZ2hMYXRlbmN5TWF4RXJyb3IpOwotICB9Ci0KLSAgdm9pZCBMb3dMYXRlbmN5VGVzdChpbnQgY2hhbm5lbHMpIHsKLSAgICBNdWx0aUNoYW5uZWxUZXN0KGNoYW5uZWxzLCBrTG93TGF0ZW5jeVNpemUsIGtMb3dMYXRlbmN5TWF4Uk1TRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICBrTG93TGF0ZW5jeU1heEVycm9yKTsKLSAgfQotCi0gIHZvaWQgVGVzdFZhbHVlcyhkb3VibGUgZXhwZWN0ZWRfbWF4X3Jtc19lcnJvciwgZG91YmxlIGV4cGVjdGVkX21heF9lcnJvciApIHsKLSAgICAvLyBDYWxjdWxhdGUgUm9vdC1NZWFuLVNxdWFyZS1FcnJvciBmb3IgdGhlIHJlc2FtcGxpbmcuCi0gICAgZG91YmxlIG1heF9lcnJvciA9IDAuMDsKLSAgICBkb3VibGUgc3VtX29mX3NxdWFyZXMgPSAwLjA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdWRpb19idXNfLT5jaGFubmVscygpOyArK2kpIHsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZnJhbWVzXzsgKytqKSB7Ci0gICAgICAgIC8vIEVuc3VyZSBhbGwgdmFsdWVzIGFyZSBhY2NvdW50ZWQgZm9yLgotICAgICAgICBBU1NFUlRfTkUoYXVkaW9fYnVzXy0+Y2hhbm5lbChpKVtqXSwgMCk7Ci0KLSAgICAgICAgZG91YmxlIGVycm9yID0gZmFicyhhdWRpb19idXNfLT5jaGFubmVsKGkpW2pdIC0ga0ZpbGxWYWx1ZSk7Ci0gICAgICAgIG1heF9lcnJvciA9IHN0ZDo6bWF4KG1heF9lcnJvciwgZXJyb3IpOwotICAgICAgICBzdW1fb2Zfc3F1YXJlcyArPSBlcnJvciAqIGVycm9yOwotICAgICAgfQotICAgIH0KLQotICAgIGRvdWJsZSBybXNfZXJyb3IgPSBzcXJ0KAotICAgICAgICBzdW1fb2Zfc3F1YXJlcyAvIChmcmFtZXNfICogYXVkaW9fYnVzXy0+Y2hhbm5lbHMoKSkpOwotCi0gICAgRVhQRUNUX0xFKHJtc19lcnJvciwgZXhwZWN0ZWRfbWF4X3Jtc19lcnJvcik7Ci0gICAgRVhQRUNUX0xFKG1heF9lcnJvciwgZXhwZWN0ZWRfbWF4X2Vycm9yKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBpbnQgZnJhbWVzXzsKLSAgYm9vbCBmaWxsX2p1bmtfdmFsdWVzXzsKLSAgc2NvcGVkX3B0cjxBdWRpb0J1cz4gYXVkaW9fYnVzXzsKLSAgaW50IGxhc3RfZnJhbWVfZGVsYXlfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNdWx0aUNoYW5uZWxSZXNhbXBsZXJUZXN0KTsKLX07Ci0KLVRFU1RfUChNdWx0aUNoYW5uZWxSZXNhbXBsZXJUZXN0LCBIaWdoTGF0ZW5jeSkgewotICBIaWdoTGF0ZW5jeVRlc3QoR2V0UGFyYW0oKSk7Ci19Ci0KLVRFU1RfUChNdWx0aUNoYW5uZWxSZXNhbXBsZXJUZXN0LCBMb3dMYXRlbmN5KSB7Ci0gIExvd0xhdGVuY3lUZXN0KEdldFBhcmFtKCkpOwotfQotCi0vLyBUZXN0IGNvbW1vbiBjaGFubmVsIGxheW91dHM6IG1vbm8sIHN0ZXJlbywgNS4xLCA3LjEuCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUCgKLSAgICBNdWx0aUNoYW5uZWxSZXNhbXBsZXJUZXN0LCBNdWx0aUNoYW5uZWxSZXNhbXBsZXJUZXN0LAotICAgIHRlc3Rpbmc6OlZhbHVlcygxLCAyLCA2LCA4KSk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvcGlwZWxpbmUuaCBiL3NyYy9tZWRpYS9iYXNlL3BpcGVsaW5lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZDc1MmEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvcGlwZWxpbmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIE1FRElBX0JBU0VfUElQRUxJTkVfSF8KLSNkZWZpbmUgTUVESUFfQkFTRV9QSVBFTElORV9IXwotCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3BfcHJveHkuaCIKLSNpbmNsdWRlICJiYXNlL3RpbWUuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlY3J5cHRvci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZmlsdGVyX2NvbGxlY3Rpb24uaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvcGlwZWxpbmVfc3RhdHVzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9yYW5nZXMuaCIKLSNpbmNsdWRlICJ1aS9nZngvcmVjdC5oIgotI2luY2x1ZGUgInVpL2dmeC9zaXplLmgiCi0KLSNpZiBkZWZpbmVkKE9TX1NUQVJCT0FSRCkKLSNpZiBTQl9IQVMoUExBWUVSKQotCi0jZGVmaW5lIENPQkFMVF9VU0VfU0JQTEFZRVJfUElQRUxJTkUKLQotI2VuZGlmICAvLyBTQl9IQVMoUExBWUVSKQotI2VuZGlmICAvLyBkZWZpbmVkKE9TX1NUQVJCT0FSRCkKLQotI2lmIGRlZmluZWQoQ09CQUxUX1VTRV9TQlBMQVlFUl9QSVBFTElORSkKLSNpbmNsdWRlICJzdGFyYm9hcmQvd2luZG93LmgiCi10eXBlZGVmIFNiV2luZG93IFBpcGVsaW5lV2luZG93OwotI2Vsc2UgICAvLyBkZWZpbmVkKENPQkFMVF9VU0VfU0JQTEFZRVJfUElQRUxJTkUpCi10eXBlZGVmIHZvaWQqIFBpcGVsaW5lV2luZG93OwotI2VuZGlmICAvLyBkZWZpbmVkKENPQkFMVF9VU0VfU0JQTEFZRVJfUElQRUxJTkUpCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIE1lZGlhTG9nOwotCi0vLyBQaXBlbGluZSBjb250YWlucyB0aGUgY29tbW9uIGludGVyZmFjZSBmb3IgbWVkaWEgcGlwZWxpbmVzLiAgSXQgcHJvdmlkZXMKLS8vIGZ1bmN0aW9ucyB0byBwZXJmb3JtIGFzeW5jaHJvbm91cyBpbml0aWFsaXphdGlvbiwgcGF1c2luZywgc2Vla2luZyBhbmQKLS8vIHBsYXlpbmcuCi1jbGFzcyBNRURJQV9FWFBPUlQgUGlwZWxpbmUgOiBwdWJsaWMgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8UGlwZWxpbmU+IHsKLSBwdWJsaWM6Ci0gIC8vIFJldHVybiB0cnVlIGlmIHRoZSBwdW5jaCB0aHJvdWdoIGJveCBzaG91bGQgYmUgcmVuZGVyZWQuICBSZXR1cm4gZmFsc2UgaWYKLSAgLy8gbm8gcHVuY2ggdGhyb3VnaCBib3ggc2hvdWxkIGJlIHJlbmRlcmVkLgotICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPGJvb2woY29uc3QgZ2Z4OjpSZWN0Jik+IFNldEJvdW5kc0NCOwotCi0gIC8vIEJ1ZmZlcmluZyBzdGF0ZXMgdGhlIHBpcGVsaW5lIHRyYW5zaXRpb25zIGJldHdlZW4gZHVyaW5nIHBsYXliYWNrLgotICAvLyBrSGF2ZU1ldGFkYXRhOgotICAvLyAgIEluZGljYXRlcyB0aGF0IHRoZSBmb2xsb3dpbmcgdGhpbmdzIGFyZSBrbm93bjoKLSAgLy8gICBjb250ZW50IGR1cmF0aW9uLCBuYXR1cmFsIHNpemUsIHN0YXJ0IHRpbWUsIGFuZCB3aGV0aGVyIHRoZSBjb250ZW50IGhhcwotICAvLyAgIGF1ZGlvIGFuZC9vciB2aWRlbyBpbiBzdXBwb3J0ZWQgZm9ybWF0cy4KLSAgLy8ga1ByZXJvbGxDb21wbGV0ZWQ6Ci0gIC8vICAgQWxsIHJlbmRlcmVycyBoYXZlIGJ1ZmZlcmVkIGVub3VnaCBkYXRhIHRvIHNhdGlzZnkgcHJlcm9sbCBhbmQgYXJlIHJlYWR5Ci0gIC8vICAgdG8gc3RhcnQgcGxheWJhY2suCi0gIGVudW0gQnVmZmVyaW5nU3RhdGUgewotICAgIGtIYXZlTWV0YWRhdGEsCi0gICAga1ByZXJvbGxDb21wbGV0ZWQsCi0gIH07Ci0KLSAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKEJ1ZmZlcmluZ1N0YXRlKT4gQnVmZmVyaW5nU3RhdGVDQjsKLQotICBzdGF0aWMgc2NvcGVkX3JlZnB0cjxQaXBlbGluZT4gQ3JlYXRlKAotICAgICAgUGlwZWxpbmVXaW5kb3cgd2luZG93LAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbWVzc2FnZV9sb29wLAotICAgICAgTWVkaWFMb2cqIG1lZGlhX2xvZyk7Ci0KLSAgdmlydHVhbCB+UGlwZWxpbmUoKSB7fQotCi0gIHZpcnR1YWwgdm9pZCBTdXNwZW5kKCkge30KLSAgdmlydHVhbCB2b2lkIFJlc3VtZSgpIHt9Ci0KLSAgLy8gQnVpbGQgYSBwaXBlbGluZSB0byB1c2luZyB0aGUgZ2l2ZW4gZmlsdGVyIGNvbGxlY3Rpb24gdG8gY29uc3RydWN0IGEgZmlsdGVyCi0gIC8vIGNoYWluLCBleGVjdXRpbmcgfHNlZWtfY2J8IHdoZW4gdGhlIGluaXRpYWwgc2Vlay9wcmVyb2xsIGhhcyBjb21wbGV0ZWQuCi0gIC8vCi0gIC8vIHxmaWx0ZXJfY29sbGVjdGlvbnwgbXVzdCBiZSBhIGNvbXBsZXRlIGNvbGxlY3Rpb24gY29udGFpbmluZyBhIGRlbXV4ZXIsCi0gIC8vIGF1ZGlvL3ZpZGVvIGRlY29kZXJzLCBhbmQgYXVkaW8vdmlkZW8gcmVuZGVyZXJzLiBGYWlsaW5nIHRvIGRvIHNvIHdpbGwKLSAgLy8gcmVzdWx0IGluIGEgY3Jhc2guCi0gIC8vCi0gIC8vIFRoZSBmb2xsb3dpbmcgcGVybWFuZW50IGNhbGxiYWNrcyB3aWxsIGJlIGV4ZWN1dGVkIGFzIGZvbGxvd3MgdXAgdW50aWwKLSAgLy8gU3RvcCgpIGhhcyBjb21wbGV0ZWQ6Ci0gIC8vICAgfGRlY3J5cHRvcl9yZWFkeV9jYnwgY2FuIGJlIHVzZWQgaWYgUGlwZWxpbmUgbmVlZHMgdG8gYmUgbm90aWZpZWQgd2hlbgotICAvLyAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBEZWNyeXB0b3IgaXMgcmVhZHkuCi0gIC8vICAgfGVuZGVkX2NifCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW5ldmVyIHRoZSBtZWRpYSByZWFjaGVzIHRoZSBlbmQuCi0gIC8vICAgfGVycm9yX2NifCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW5ldmVyIGFuIGVycm9yIG9jY3VycyBidXQgaGFzbid0Ci0gIC8vICAgICAgICAgICAgICBiZWVuIHJlcG9ydGVkIGFscmVhZHkgdGhyb3VnaCBhbm90aGVyIGNhbGxiYWNrLgotICAvLyAgIHxidWZmZXJpbmdfc3RhdGVfY2J8IE9wdGlvbmFsIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuZXZlciB0aGUKLSAgLy8gICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSdzIGJ1ZmZlcmluZyBzdGF0ZSBjaGFuZ2VzLgotICAvLyAgIHxkdXJhdGlvbl9jaGFuZ2VfY2J8IG9wdGlvbmFsIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuZXZlciB0aGUKLSAgLy8gICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb24gZHVyYXRpb24gY2hhbmdlcy4KLSAgLy8gSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCB0aGlzIG1ldGhvZCBhZnRlciB0aGUgcGlwZWxpbmUgaGFzIGFscmVhZHkgc3RhcnRlZC4KLSAgdmlydHVhbCB2b2lkIFN0YXJ0KHNjb3BlZF9wdHI8RmlsdGVyQ29sbGVjdGlvbj4gZmlsdGVyX2NvbGxlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBTZXREZWNyeXB0b3JSZWFkeUNCJiBkZWNyeXB0b3JfcmVhZHlfY2IsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBlbmRlZF9jYiwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGVycm9yX2NiLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc2Vla19jYiwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ1ZmZlcmluZ1N0YXRlQ0ImIGJ1ZmZlcmluZ19zdGF0ZV9jYiwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIGR1cmF0aW9uX2NoYW5nZV9jYikgPSAwOwotCi0gIC8vIEFzeW5jaHJvbm91c2x5IHN0b3BzIHRoZSBwaXBlbGluZSwgZXhlY3V0aW5nIHxzdG9wX2NifCB3aGVuIHRoZSBwaXBlbGluZQotICAvLyB0ZWFyZG93biBoYXMgY29tcGxldGVkLgotICAvLwotICAvLyBTdG9wKCkgbXVzdCBjb21wbGV0ZSBiZWZvcmUgZGVzdHJveWluZyB0aGUgcGlwZWxpbmUuIEl0IGl0IHBlcm1pc3NpYmxlIHRvCi0gIC8vIGNhbGwgU3RvcCgpIGF0IGFueSBwb2ludCBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoZSBwaXBlbGluZS4KLSAgdmlydHVhbCB2b2lkIFN0b3AoY29uc3QgYmFzZTo6Q2xvc3VyZSYgc3RvcF9jYikgPSAwOwotCi0gIC8vIEF0dGVtcHQgdG8gc2VlayB0byB0aGUgcG9zaXRpb24gc3BlY2lmaWVkIGJ5IHRpbWUuICB8c2Vla19jYnwgd2lsbCBiZQotICAvLyBleGVjdXRlZCB3aGVuIHRoZSBhbGwgZmlsdGVycyBpbiB0aGUgcGlwZWxpbmUgaGF2ZSBwcm9jZXNzZWQgdGhlIHNlZWsuCi0gIC8vCi0gIC8vIENsaWVudHMgYXJlIGV4cGVjdGVkIHRvIGNhbGwgR2V0TWVkaWFUaW1lKCkgdG8gY2hlY2sgd2hldGhlciB0aGUgc2VlawotICAvLyBzdWNjZWVkZWQuCi0gIC8vCi0gIC8vIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyBtZXRob2QgaWYgdGhlIHBpcGVsaW5lIGhhcyBub3Qgc3RhcnRlZC4KLSAgdmlydHVhbCB2b2lkIFNlZWsoYmFzZTo6VGltZURlbHRhIHRpbWUsIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIHNlZWtfY2IpID0gMDsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIG1lZGlhIGhhcyBhdWRpby4KLSAgdmlydHVhbCBib29sIEhhc0F1ZGlvKCkgY29uc3QgPSAwOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWVkaWEgaGFzIHZpZGVvLgotICB2aXJ0dWFsIGJvb2wgSGFzVmlkZW8oKSBjb25zdCA9IDA7Ci0KLSAgLy8gR2V0cyB0aGUgY3VycmVudCBwbGF5YmFjayByYXRlIG9mIHRoZSBwaXBlbGluZS4gIFdoZW4gdGhlIHBpcGVsaW5lIGlzCi0gIC8vIHN0YXJ0ZWQsIHRoZSBwbGF5YmFjayByYXRlIHdpbGwgYmUgMC4wZi4gIEEgcmF0ZSBvZiAxLjBmIGluZGljYXRlcwotICAvLyB0aGF0IHRoZSBwaXBlbGluZSBpcyByZW5kZXJpbmcgdGhlIG1lZGlhIGF0IHRoZSBzdGFuZGFyZCByYXRlLiAgVmFsaWQKLSAgLy8gdmFsdWVzIGZvciBwbGF5YmFjayByYXRlIGFyZSA+PSAwLjBmLgotICB2aXJ0dWFsIGZsb2F0IEdldFBsYXliYWNrUmF0ZSgpIGNvbnN0ID0gMDsKLQotICAvLyBBdHRlbXB0IHRvIGFkanVzdCB0aGUgcGxheWJhY2sgcmF0ZS4gU2V0dGluZyBhIHBsYXliYWNrIHJhdGUgb2YgMC4wZiBwYXVzZXMKLSAgLy8gYWxsIHJlbmRlcmluZyBvZiB0aGUgbWVkaWEuICBBIHJhdGUgb2YgMS4wZiBpbmRpY2F0ZXMgYSBub3JtYWwgcGxheWJhY2sKLSAgLy8gcmF0ZS4gIFZhbHVlcyBmb3IgdGhlIHBsYXliYWNrIHJhdGUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMC4wZi4KLSAgdmlydHVhbCB2b2lkIFNldFBsYXliYWNrUmF0ZShmbG9hdCBwbGF5YmFja19yYXRlKSA9IDA7Ci0KLSAgLy8gR2V0cyB0aGUgY3VycmVudCB2b2x1bWUgc2V0dGluZyBiZWluZyB1c2VkIGJ5IHRoZSBhdWRpbyByZW5kZXJlci4gIFdoZW4KLSAgLy8gdGhlIHBpcGVsaW5lIGlzIHN0YXJ0ZWQsIHRoaXMgdmFsdWUgd2lsbCBiZSAxLjBmLiAgVmFsaWQgdmFsdWVzIHJhbmdlCi0gIC8vIGZyb20gMC4wZiB0byAxLjBmLgotICB2aXJ0dWFsIGZsb2F0IEdldFZvbHVtZSgpIGNvbnN0ID0gMDsKLQotICAvLyBBdHRlbXB0IHRvIHNldCB0aGUgdm9sdW1lIG9mIHRoZSBhdWRpbyByZW5kZXJlci4gIFZhbGlkIHZhbHVlcyBmb3Igdm9sdW1lCi0gIC8vIHJhbmdlIGZyb20gMC4wZiAobXV0ZWQpIHRvIDEuMGYgKGZ1bGwgdm9sdW1lKS4gIFRoaXMgdmFsdWUgYWZmZWN0cyBhbGwKLSAgLy8gY2hhbm5lbHMgcHJvcG9ydGlvbmF0ZWx5IGZvciBtdWx0aS1jaGFubmVsIGF1ZGlvIHN0cmVhbXMuCi0gIHZpcnR1YWwgdm9pZCBTZXRWb2x1bWUoZmxvYXQgdm9sdW1lKSA9IDA7Ci0KLSAgLy8gUmV0dXJucyB0aGUgY3VycmVudCBtZWRpYSBwbGF5YmFjayB0aW1lLCB3aGljaCBwcm9ncmVzc2VzIGZyb20gMCB1bnRpbAotICAvLyBHZXRNZWRpYUR1cmF0aW9uKCkuCi0gIHZpcnR1YWwgYmFzZTo6VGltZURlbHRhIEdldE1lZGlhVGltZSgpIGNvbnN0ID0gMDsKLQotICAvLyBHZXQgYXBwcm94aW1hdGUgdGltZSByYW5nZXMgb2YgYnVmZmVyZWQgbWVkaWEuCi0gIHZpcnR1YWwgUmFuZ2VzPGJhc2U6OlRpbWVEZWx0YT4gR2V0QnVmZmVyZWRUaW1lUmFuZ2VzKCkgPSAwOwotCi0gIC8vIEdldCB0aGUgZHVyYXRpb24gb2YgdGhlIG1lZGlhIGluIG1pY3Jvc2Vjb25kcy4gIElmIHRoZSBkdXJhdGlvbiBoYXMgbm90Ci0gIC8vIGJlZW4gZGV0ZXJtaW5lZCB5ZXQsIHRoZW4gcmV0dXJucyAwLgotICB2aXJ0dWFsIGJhc2U6OlRpbWVEZWx0YSBHZXRNZWRpYUR1cmF0aW9uKCkgY29uc3QgPSAwOwotCi0gIC8vIEdldCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgbWVkaWEgZmlsZS4gIElmIHRoZSBzaXplIGhhcyBub3QgeWV0IGJlZW4KLSAgLy8gZGV0ZXJtaW5lZCBvciBjYW4gbm90IGJlIGRldGVybWluZWQsIHRoaXMgdmFsdWUgaXMgMC4KLSAgdmlydHVhbCBpbnQ2NCBHZXRUb3RhbEJ5dGVzKCkgY29uc3QgPSAwOwotCi0gIC8vIEdldHMgdGhlIG5hdHVyYWwgc2l6ZSBvZiB0aGUgdmlkZW8gb3V0cHV0IGluIHBpeGVsIHVuaXRzLiAgSWYgdGhlcmUgaXMgbm8KLSAgLy8gdmlkZW8gb3IgdGhlIHZpZGVvIGhhcyBub3QgYmVlbiByZW5kZXJlZCB5ZXQsIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IHdpbGwKLSAgLy8gYmUgMC4KLSAgdmlydHVhbCB2b2lkIEdldE5hdHVyYWxWaWRlb1NpemUoZ2Z4OjpTaXplKiBvdXRfc2l6ZSkgY29uc3QgPSAwOwotCi0gIC8vIFJldHVybiB0cnVlIGlmIGxvYWRpbmcgcHJvZ3Jlc3MgaGFzIGJlZW4gbWFkZSBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMKLSAgLy8gbWV0aG9kIHdhcyBjYWxsZWQuCi0gIHZpcnR1YWwgYm9vbCBEaWRMb2FkaW5nUHJvZ3Jlc3MoKSBjb25zdCA9IDA7Ci0KLSAgLy8gR2V0cyB0aGUgY3VycmVudCBwaXBlbGluZSBzdGF0aXN0aWNzLgotICB2aXJ0dWFsIFBpcGVsaW5lU3RhdGlzdGljcyBHZXRTdGF0aXN0aWNzKCkgY29uc3QgPSAwOwotCi0gIC8vIEdldCB0aGUgU2V0Qm91bmRzQ0IgdXNlZCB0byBzZXQgdGhlIGJvdW5kcyBvZiB0aGUgdmlkZW8gZnJhbWUuCi0gIHZpcnR1YWwgU2V0Qm91bmRzQ0IgR2V0U2V0Qm91bmRzQ0IoKSB7IHJldHVybiBTZXRCb3VuZHNDQigpOyB9Ci0KLSAgLy8gVXBkYXRlcyB0aGUgcGxheWVyJ3MgcHJlZmVyZW5jZSBmb3IgZGVjb2RlLXRvLXRleHR1cmUgdmVyc3VzIHB1bmNoIHRocm91Z2guCi0gIHZpcnR1YWwgdm9pZCBTZXREZWNvZGVUb1RleHR1cmVPdXRwdXRNb2RlKGJvb2wgLyplbmFibGVkKi8pIHt9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX1BJUEVMSU5FX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9waXBlbGluZV9pbXBsLmNjIGIvc3JjL21lZGlhL2Jhc2UvcGlwZWxpbmVfaW1wbC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZmNzU5ZC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9waXBlbGluZV9pbXBsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTAwNSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9waXBlbGluZV9pbXBsLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFja19oZWxwZXJzLmgiCi0jaW5jbHVkZSAiYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXRyaWNzL2hpc3RvZ3JhbS5oIgotI2luY2x1ZGUgImJhc2Uvc3RsX3V0aWwuaCIKLSNpbmNsdWRlICJiYXNlL3N0cmluZ19udW1iZXJfY29udmVyc2lvbnMuaCIKLSNpbmNsdWRlICJiYXNlL3N0cmluZ191dGlsLmgiCi0jaW5jbHVkZSAiYmFzZS9zeW5jaHJvbml6YXRpb24vY29uZGl0aW9uX3ZhcmlhYmxlLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19kZWNvZGVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19yZW5kZXJlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvY2xvY2suaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2ZpbHRlcl9jb2xsZWN0aW9uLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9sb2cuaCIKLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaGVsbF9tZWRpYV9wbGF0Zm9ybS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2hlbGxfbWVkaWFfc3RhdGlzdGljcy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2hlbGxfdmlkZW9fZnJhbWVfcHJvdmlkZXIuaCIKLSNlbmRpZiAgLy8gZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fZGVjb2Rlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fZGVjb2Rlcl9jb25maWcuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX3JlbmRlcmVyLmgiCi0KLXVzaW5nIGJhc2U6OlRpbWVEZWx0YTsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotUGlwZWxpbmVTdGF0dXNOb3RpZmljYXRpb246OlBpcGVsaW5lU3RhdHVzTm90aWZpY2F0aW9uKCkKLSAgICA6IGN2XygmbG9ja18pLCBzdGF0dXNfKFBJUEVMSU5FX09LKSwgbm90aWZpZWRfKGZhbHNlKSB7Ci19Ci0KLVBpcGVsaW5lU3RhdHVzTm90aWZpY2F0aW9uOjp+UGlwZWxpbmVTdGF0dXNOb3RpZmljYXRpb24oKSB7Ci0gIERDSEVDSyhub3RpZmllZF8pOwotfQotCi1QaXBlbGluZVN0YXR1c0NCIFBpcGVsaW5lU3RhdHVzTm90aWZpY2F0aW9uOjpDYWxsYmFjaygpIHsKLSAgcmV0dXJuIGJhc2U6OkJpbmQoJlBpcGVsaW5lU3RhdHVzTm90aWZpY2F0aW9uOjpOb3RpZnksCi0gICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpOwotfQotCi12b2lkIFBpcGVsaW5lU3RhdHVzTm90aWZpY2F0aW9uOjpOb3RpZnkobWVkaWE6OlBpcGVsaW5lU3RhdHVzIHN0YXR1cykgewotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICBEQ0hFQ0soIW5vdGlmaWVkXyk7Ci0gIG5vdGlmaWVkXyA9IHRydWU7Ci0gIHN0YXR1c18gPSBzdGF0dXM7Ci0gIGN2Xy5TaWduYWwoKTsKLX0KLQotdm9pZCBQaXBlbGluZVN0YXR1c05vdGlmaWNhdGlvbjo6V2FpdCgpIHsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgd2hpbGUgKCFub3RpZmllZF8pCi0gICAgY3ZfLldhaXQoKTsKLX0KLQotbWVkaWE6OlBpcGVsaW5lU3RhdHVzIFBpcGVsaW5lU3RhdHVzTm90aWZpY2F0aW9uOjpzdGF0dXMoKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gIERDSEVDSyhub3RpZmllZF8pOwotICByZXR1cm4gc3RhdHVzXzsKLX0KLQotc2NvcGVkX3JlZnB0cjxQaXBlbGluZT4gUGlwZWxpbmU6OkNyZWF0ZSgKLSAgICBQaXBlbGluZVdpbmRvdyB3aW5kb3csCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbWVzc2FnZV9sb29wLAotICAgIE1lZGlhTG9nKiBtZWRpYV9sb2cpIHsKLSAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUih3aW5kb3cpOwotICByZXR1cm4gbmV3IFBpcGVsaW5lSW1wbChtZXNzYWdlX2xvb3AsIG1lZGlhX2xvZyk7Ci19Ci0KLVBpcGVsaW5lSW1wbDo6UGlwZWxpbmVJbXBsKAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4mIG1lc3NhZ2VfbG9vcCwKLSAgICBNZWRpYUxvZyogbWVkaWFfbG9nKQotICAgIDogbWVzc2FnZV9sb29wXyhtZXNzYWdlX2xvb3ApLAotICAgICAgbWVkaWFfbG9nXyhtZWRpYV9sb2cpLAotICAgICAgcnVubmluZ18oZmFsc2UpLAotICAgICAgZGlkX2xvYWRpbmdfcHJvZ3Jlc3NfKGZhbHNlKSwKLSAgICAgIHRvdGFsX2J5dGVzXygwKSwKLSAgICAgIG5hdHVyYWxfc2l6ZV8oMCwgMCksCi0gICAgICB2b2x1bWVfKDEuMGYpLAotICAgICAgcGxheWJhY2tfcmF0ZV8oMC4wZiksCi0gICAgICBjbG9ja18obmV3IENsb2NrKCZiYXNlOjpUaW1lOjpOb3cpKSwKLSAgICAgIHdhaXRpbmdfZm9yX2Nsb2NrX3VwZGF0ZV8oZmFsc2UpLAotICAgICAgc3RhdHVzXyhQSVBFTElORV9PSyksCi0gICAgICBoYXNfYXVkaW9fKGZhbHNlKSwKLSAgICAgIGhhc192aWRlb18oZmFsc2UpLAotICAgICAgc3RhdGVfKGtDcmVhdGVkKSwKLSAgICAgIGF1ZGlvX2VuZGVkXyhmYWxzZSksCi0gICAgICB2aWRlb19lbmRlZF8oZmFsc2UpLAotICAgICAgYXVkaW9fZGlzYWJsZWRfKGZhbHNlKSwKLSAgICAgIGNyZWF0aW9uX3RpbWVfKGJhc2U6OlRpbWU6Ok5vdygpKSB7Ci0gIG1lZGlhX2xvZ18tPkFkZEV2ZW50KAotICAgICAgbWVkaWFfbG9nXy0+Q3JlYXRlUGlwZWxpbmVTdGF0ZUNoYW5nZWRFdmVudChHZXRTdGF0ZVN0cmluZyhrQ3JlYXRlZCkpKTsKLSAgbWVkaWFfbG9nXy0+QWRkRXZlbnQoCi0gICAgICBtZWRpYV9sb2dfLT5DcmVhdGVFdmVudChNZWRpYUxvZ0V2ZW50OjpQSVBFTElORV9DUkVBVEVEKSk7Ci19Ci0KLVBpcGVsaW5lSW1wbDo6flBpcGVsaW5lSW1wbCgpIHsKLSAgLy8gVE9ETyhzY2hlcmt1cyk6IFJlZW5hYmxlIGFmdGVyIGZpZ3VyaW5nIG91dCB3aHkgdGhpcyBpcyBmaXJpbmcsIHNlZQotICAvLyBodHRwOi8vY3JidWcuY29tLzE0ODQwNQotI2lmIDAKLSAgRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpCi0gICAgICA8PCAiUGlwZWxpbmVJbXBsIG11c3QgYmUgZGVzdHJveWVkIG9uIHNhbWUgdGhyZWFkIHRoYXQgY3JlYXRlZCBpdCI7Ci0jZW5kaWYKLSAgRENIRUNLKCFydW5uaW5nXykgPDwgIlN0b3AoKSBtdXN0IGNvbXBsZXRlIGJlZm9yZSBkZXN0cm95aW5nIG9iamVjdCI7Ci0gIERDSEVDSyhzdG9wX2NiXy5pc19udWxsKCkpOwotICBEQ0hFQ0soc2Vla19jYl8uaXNfbnVsbCgpKTsKLQotICBtZWRpYV9sb2dfLT5BZGRFdmVudCgKLSAgICAgIG1lZGlhX2xvZ18tPkNyZWF0ZUV2ZW50KE1lZGlhTG9nRXZlbnQ6OlBJUEVMSU5FX0RFU1RST1lFRCkpOwotfQotCi12b2lkIFBpcGVsaW5lSW1wbDo6U3VzcGVuZCgpIHsKLSAgLy8gUGlwZWxpbmVJbXBsOjpTdXNwZW5kKCkgaXMgb25seSBjYWxsZWQgZHVyaW5nIHF1aXR0aW5nLiAgSXQgaXMgYmxvY2tpbmcKLSAgLy8gYW5kIG1heSB0YWtlIGEgbG9uZyB0aW1lLgotICBiYXNlOjpXYWl0YWJsZUV2ZW50IHdhaXRlcihmYWxzZSwgZmFsc2UpOwotICBETE9HKElORk8pIDw8ICJUcnlpbmcgdG8gc3RvcCBtZWRpYSBwaXBlbGluZS4iOwotICBTdG9wKGJhc2U6OkJpbmQoJmJhc2U6OldhaXRhYmxlRXZlbnQ6OlNpZ25hbCwgYmFzZTo6VW5yZXRhaW5lZCgmd2FpdGVyKSkpOwotICB3YWl0ZXIuV2FpdCgpOwotICBETE9HKElORk8pIDw8ICJNZWRpYSBwaXBlbGluZSBzdXNwZW5kZWQuIjsKLX0KLQotdm9pZCBQaXBlbGluZUltcGw6OlJlc3VtZSgpIHsKLSAgLy8gUGlwZWxpbmVJbXBsIGRvZXNuJ3Qgc3VwcG9ydCBSZXN1bWUoKS4KLSAgTk9UUkVBQ0hFRCgpOwotfQotCi12b2lkIFBpcGVsaW5lSW1wbDo6U3RhcnQoc2NvcGVkX3B0cjxGaWx0ZXJDb2xsZWN0aW9uPiBjb2xsZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNldERlY3J5cHRvclJlYWR5Q0ImIGRlY3J5cHRvcl9yZWFkeV9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBlbmRlZF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBlcnJvcl9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBzZWVrX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ1ZmZlcmluZ1N0YXRlQ0ImIGJ1ZmZlcmluZ19zdGF0ZV9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiBkdXJhdGlvbl9jaGFuZ2VfY2IpIHsKLSAgRENIRUNLX0VRKGNvbGxlY3Rpb24tPkdldEF1ZGlvRGVjb2RlcnMoKS0+c2l6ZSgpLCAxKTsKLSAgRENIRUNLX0VRKGNvbGxlY3Rpb24tPkdldFZpZGVvRGVjb2RlcnMoKS0+c2l6ZSgpLCAxKTsKLQotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICBDSEVDSyghcnVubmluZ18pIDw8ICJNZWRpYSBwaXBlbGluZSBpcyBhbHJlYWR5IHJ1bm5pbmciOwotICBEQ0hFQ0soIWJ1ZmZlcmluZ19zdGF0ZV9jYi5pc19udWxsKCkpOwotCi0gIHJ1bm5pbmdfID0gdHJ1ZTsKLSAgbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJlBpcGVsaW5lSW1wbDo6U3RhcnRUYXNrLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlBhc3NlZCgmY29sbGVjdGlvbiksIGVuZGVkX2NiLCBlcnJvcl9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVrX2NiLCBidWZmZXJpbmdfc3RhdGVfY2IsIGR1cmF0aW9uX2NoYW5nZV9jYikpOwotfQotCi12b2lkIFBpcGVsaW5lSW1wbDo6U3RvcChjb25zdCBiYXNlOjpDbG9zdXJlJiBzdG9wX2NiKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gIG1lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmUGlwZWxpbmVJbXBsOjpTdG9wVGFzaywgdGhpcywgc3RvcF9jYikpOwotfQotCi12b2lkIFBpcGVsaW5lSW1wbDo6U2VlayhUaW1lRGVsdGEgdGltZSwgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc2Vla19jYikgewotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICBpZiAocnVubmluZ18pIHsKLSAgICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzaygKLSAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZQaXBlbGluZUltcGw6OlNlZWtUYXNrLCB0aGlzLCB0aW1lLCBzZWVrX2NiKSk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gVGhpcyBjYWxsYmFjayB3aWxsIGJlIHNpbGVudGx5IGlnbm9yZWQgaWYgdGhlcmUgaXMgYSByZWxvYWQgYXMgdGhlCi0gICAgLy8gUGlwZWxpbmVJbXBsIHdpbGwgYmUga2lsbGVkIGluIHRoYXQgY2FzZS4gVGhpcyBpcyBhY2NlcHRhYmxlIHNpbmNlIHRoZQotICAgIC8vIGFwcAotICAgIC8vIG5lZWRuJ3QgcmVseSBvbiB0aGlzIGNhbGxiYWNrLgotICAgIG1lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKAotICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoc2Vla19jYiwgUElQRUxJTkVfRVJST1JfSU5WQUxJRF9TVEFURSkpOwotICB9Ci19Ci0KLWJvb2wgUGlwZWxpbmVJbXBsOjpJc1J1bm5pbmcoKSBjb25zdCB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gIHJldHVybiBydW5uaW5nXzsKLX0KLQotYm9vbCBQaXBlbGluZUltcGw6Okhhc0F1ZGlvKCkgY29uc3QgewotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICByZXR1cm4gaGFzX2F1ZGlvXzsKLX0KLQotYm9vbCBQaXBlbGluZUltcGw6Okhhc1ZpZGVvKCkgY29uc3QgewotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICByZXR1cm4gaGFzX3ZpZGVvXzsKLX0KLQotZmxvYXQgUGlwZWxpbmVJbXBsOjpHZXRQbGF5YmFja1JhdGUoKSBjb25zdCB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gIHJldHVybiBwbGF5YmFja19yYXRlXzsKLX0KLQotdm9pZCBQaXBlbGluZUltcGw6OlNldFBsYXliYWNrUmF0ZShmbG9hdCBwbGF5YmFja19yYXRlKSB7Ci0gIGlmIChwbGF5YmFja19yYXRlIDwgMC4wZikKLSAgICByZXR1cm47Ci0KLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgcGxheWJhY2tfcmF0ZV8gPSBwbGF5YmFja19yYXRlOwotICBpZiAocnVubmluZ18pIHsKLSAgICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzaygKLSAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZQaXBlbGluZUltcGw6OlBsYXliYWNrUmF0ZUNoYW5nZWRUYXNrLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tfcmF0ZSkpOwotICB9Ci19Ci0KLWZsb2F0IFBpcGVsaW5lSW1wbDo6R2V0Vm9sdW1lKCkgY29uc3QgewotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICByZXR1cm4gdm9sdW1lXzsKLX0KLQotdm9pZCBQaXBlbGluZUltcGw6OlNldFZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgaWYgKHZvbHVtZSA8IDAuMGYgfHwgdm9sdW1lID4gMS4wZikKLSAgICByZXR1cm47Ci0KLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgdm9sdW1lXyA9IHZvbHVtZTsKLSAgaWYgKHJ1bm5pbmdfKSB7Ci0gICAgbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soCi0gICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmUGlwZWxpbmVJbXBsOjpWb2x1bWVDaGFuZ2VkVGFzaywgdGhpcywgdm9sdW1lKSk7Ci0gIH0KLX0KLQotVGltZURlbHRhIFBpcGVsaW5lSW1wbDo6R2V0TWVkaWFUaW1lKCkgY29uc3QgewotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICByZXR1cm4gY2xvY2tfLT5FbGFwc2VkKCk7Ci19Ci0KLVJhbmdlczxUaW1lRGVsdGE+IFBpcGVsaW5lSW1wbDo6R2V0QnVmZmVyZWRUaW1lUmFuZ2VzKCkgewotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICBSYW5nZXM8VGltZURlbHRhPiB0aW1lX3JhbmdlczsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBidWZmZXJlZF90aW1lX3Jhbmdlc18uc2l6ZSgpOyArK2kpIHsKLSAgICB0aW1lX3Jhbmdlcy5BZGQoYnVmZmVyZWRfdGltZV9yYW5nZXNfLnN0YXJ0KGkpLAotICAgICAgICAgICAgICAgICAgICBidWZmZXJlZF90aW1lX3Jhbmdlc18uZW5kKGkpKTsKLSAgfQotICBpZiAoY2xvY2tfLT5EdXJhdGlvbigpID09IFRpbWVEZWx0YSgpIHx8IHRvdGFsX2J5dGVzXyA9PSAwKQotICAgIHJldHVybiB0aW1lX3JhbmdlczsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBidWZmZXJlZF9ieXRlX3Jhbmdlc18uc2l6ZSgpOyArK2kpIHsKLSAgICBUaW1lRGVsdGEgc3RhcnQgPSBUaW1lRm9yQnl0ZU9mZnNldF9Mb2NrZWQoYnVmZmVyZWRfYnl0ZV9yYW5nZXNfLnN0YXJ0KGkpKTsKLSAgICBUaW1lRGVsdGEgZW5kID0gVGltZUZvckJ5dGVPZmZzZXRfTG9ja2VkKGJ1ZmZlcmVkX2J5dGVfcmFuZ2VzXy5lbmQoaSkpOwotICAgIC8vIENhcCBhcHByb3hpbWF0ZWQgYnVmZmVyZWQgdGltZSBhdCB0aGUgbGVuZ3RoIG9mIHRoZSB2aWRlby4KLSAgICBlbmQgPSBzdGQ6Om1pbihlbmQsIGNsb2NrXy0+RHVyYXRpb24oKSk7Ci0gICAgdGltZV9yYW5nZXMuQWRkKHN0YXJ0LCBlbmQpOwotICB9Ci0KLSAgcmV0dXJuIHRpbWVfcmFuZ2VzOwotfQotCi1UaW1lRGVsdGEgUGlwZWxpbmVJbXBsOjpHZXRNZWRpYUR1cmF0aW9uKCkgY29uc3QgewotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICByZXR1cm4gY2xvY2tfLT5EdXJhdGlvbigpOwotfQotCi1pbnQ2NCBQaXBlbGluZUltcGw6OkdldFRvdGFsQnl0ZXMoKSBjb25zdCB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gIHJldHVybiB0b3RhbF9ieXRlc187Ci19Ci0KLXZvaWQgUGlwZWxpbmVJbXBsOjpHZXROYXR1cmFsVmlkZW9TaXplKGdmeDo6U2l6ZSogb3V0X3NpemUpIGNvbnN0IHsKLSAgQ0hFQ0sob3V0X3NpemUpOwotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICAqb3V0X3NpemUgPSBuYXR1cmFsX3NpemVfOwotfQotCi1ib29sIFBpcGVsaW5lSW1wbDo6RGlkTG9hZGluZ1Byb2dyZXNzKCkgY29uc3QgewotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICBib29sIHJldCA9IGRpZF9sb2FkaW5nX3Byb2dyZXNzXzsKLSAgZGlkX2xvYWRpbmdfcHJvZ3Jlc3NfID0gZmFsc2U7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLVBpcGVsaW5lU3RhdGlzdGljcyBQaXBlbGluZUltcGw6OkdldFN0YXRpc3RpY3MoKSBjb25zdCB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gIHJldHVybiBzdGF0aXN0aWNzXzsKLX0KLQotdm9pZCBQaXBlbGluZUltcGw6OlNldENsb2NrRm9yVGVzdGluZyhDbG9jayogY2xvY2spIHsKLSAgY2xvY2tfLnJlc2V0KGNsb2NrKTsKLX0KLQotdm9pZCBQaXBlbGluZUltcGw6OlNldEVycm9yRm9yVGVzdGluZyhQaXBlbGluZVN0YXR1cyBzdGF0dXMpIHsKLSAgU2V0RXJyb3Ioc3RhdHVzKTsKLX0KLQotdm9pZCBQaXBlbGluZUltcGw6OlNldFN0YXRlKFN0YXRlIG5leHRfc3RhdGUpIHsKLSAgaWYgKHN0YXRlXyAhPSBrU3RhcnRlZCAmJiBuZXh0X3N0YXRlID09IGtTdGFydGVkICYmCi0gICAgICAhY3JlYXRpb25fdGltZV8uaXNfbnVsbCgpKSB7Ci0gICAgVU1BX0hJU1RPR1JBTV9USU1FUygKLSAgICAgICAgIk1lZGlhLlRpbWVUb1BpcGVsaW5lU3RhcnRlZCIsIGJhc2U6OlRpbWU6Ok5vdygpIC0gY3JlYXRpb25fdGltZV8pOwotICAgIGNyZWF0aW9uX3RpbWVfID0gYmFzZTo6VGltZSgpOwotICB9Ci0KLSAgRFZMT0coMikgPDwgR2V0U3RhdGVTdHJpbmcoc3RhdGVfKSA8PCAiIC0+ICIgPDwgR2V0U3RhdGVTdHJpbmcobmV4dF9zdGF0ZSk7Ci0KLSAgc3RhdGVfID0gbmV4dF9zdGF0ZTsKLSAgbWVkaWFfbG9nXy0+QWRkRXZlbnQoCi0gICAgICBtZWRpYV9sb2dfLT5DcmVhdGVQaXBlbGluZVN0YXRlQ2hhbmdlZEV2ZW50KEdldFN0YXRlU3RyaW5nKG5leHRfc3RhdGUpKSk7Ci19Ci0KLSNkZWZpbmUgUkVUVVJOX1NUUklORyhzdGF0ZSkgY2FzZSBzdGF0ZTogcmV0dXJuICNzdGF0ZTsKLQotY29uc3QgY2hhciogUGlwZWxpbmVJbXBsOjpHZXRTdGF0ZVN0cmluZyhTdGF0ZSBzdGF0ZSkgewotICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgUkVUVVJOX1NUUklORyhrQ3JlYXRlZCk7Ci0gICAgUkVUVVJOX1NUUklORyhrSW5pdERlbXV4ZXIpOwotICAgIFJFVFVSTl9TVFJJTkcoa0luaXRBdWRpb1JlbmRlcmVyKTsKLSAgICBSRVRVUk5fU1RSSU5HKGtJbml0VmlkZW9SZW5kZXJlcik7Ci0gICAgUkVUVVJOX1NUUklORyhrSW5pdFByZXJvbGxpbmcpOwotICAgIFJFVFVSTl9TVFJJTkcoa1NlZWtpbmcpOwotICAgIFJFVFVSTl9TVFJJTkcoa1N0YXJ0aW5nKTsKLSAgICBSRVRVUk5fU1RSSU5HKGtTdGFydGVkKTsKLSAgICBSRVRVUk5fU1RSSU5HKGtTdG9wcGluZyk7Ci0gICAgUkVUVVJOX1NUUklORyhrU3RvcHBlZCk7Ci0gIH0KLSAgTk9UUkVBQ0hFRCgpOwotICByZXR1cm4gIklOVkFMSUQiOwotfQotCi0jdW5kZWYgUkVUVVJOX1NUUklORwotCi1QaXBlbGluZUltcGw6OlN0YXRlIFBpcGVsaW5lSW1wbDo6R2V0TmV4dFN0YXRlKCkgY29uc3QgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgRENIRUNLKHN0b3BfY2JfLmlzX251bGwoKSkKLSAgICAgIDw8ICJTdGF0ZSB0cmFuc2l0aW9ucyBkb24ndCBoYXBwZW4gd2hlbiBzdG9wcGluZyI7Ci0gIERDSEVDS19FUShzdGF0dXNfLCBQSVBFTElORV9PSykKLSAgICAgIDw8ICJTdGF0ZSB0cmFuc2l0aW9ucyBkb24ndCBoYXBwZW4gd2hlbiB0aGVyZSdzIGFuIGVycm9yOiAiIDw8IHN0YXR1c187Ci0KLSAgc3dpdGNoIChzdGF0ZV8pIHsKLSAgICBjYXNlIGtDcmVhdGVkOgotICAgICAgcmV0dXJuIGtJbml0RGVtdXhlcjsKLQotICAgIGNhc2Uga0luaXREZW11eGVyOgotICAgICAgaWYgKGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6QVVESU8pKQotICAgICAgICByZXR1cm4ga0luaXRBdWRpb1JlbmRlcmVyOwotICAgICAgaWYgKGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6VklERU8pKQotICAgICAgICByZXR1cm4ga0luaXRWaWRlb1JlbmRlcmVyOwotICAgICAgcmV0dXJuIGtJbml0UHJlcm9sbGluZzsKLQotICAgIGNhc2Uga0luaXRBdWRpb1JlbmRlcmVyOgotICAgICAgaWYgKGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6VklERU8pKQotICAgICAgICByZXR1cm4ga0luaXRWaWRlb1JlbmRlcmVyOwotICAgICAgcmV0dXJuIGtJbml0UHJlcm9sbGluZzsKLQotICAgIGNhc2Uga0luaXRWaWRlb1JlbmRlcmVyOgotICAgICAgcmV0dXJuIGtJbml0UHJlcm9sbGluZzsKLQotICAgIGNhc2Uga0luaXRQcmVyb2xsaW5nOgotICAgICAgcmV0dXJuIGtTdGFydGluZzsKLQotICAgIGNhc2Uga1NlZWtpbmc6Ci0gICAgICByZXR1cm4ga1N0YXJ0aW5nOwotCi0gICAgY2FzZSBrU3RhcnRpbmc6Ci0gICAgICByZXR1cm4ga1N0YXJ0ZWQ7Ci0KLSAgICBjYXNlIGtTdGFydGVkOgotICAgIGNhc2Uga1N0b3BwaW5nOgotICAgIGNhc2Uga1N0b3BwZWQ6Ci0gICAgICBicmVhazsKLSAgfQotICBOT1RSRUFDSEVEKCkgPDwgIlN0YXRlIGhhcyBubyB0cmFuc2l0aW9uOiAiIDw8IHN0YXRlXzsKLSAgcmV0dXJuIHN0YXRlXzsKLX0KLQotdm9pZCBQaXBlbGluZUltcGw6Ok9uRGVtdXhlckVycm9yKFBpcGVsaW5lU3RhdHVzIGVycm9yKSB7Ci0gIFNldEVycm9yKGVycm9yKTsKLX0KLQotdm9pZCBQaXBlbGluZUltcGw6OlNldEVycm9yKFBpcGVsaW5lU3RhdHVzIGVycm9yKSB7Ci0gIERDSEVDSyhJc1J1bm5pbmcoKSk7Ci0gIERDSEVDS19ORShQSVBFTElORV9PSywgZXJyb3IpOwotICBWTE9HKDEpIDw8ICJNZWRpYSBwaXBlbGluZSBlcnJvcjogIiA8PCBlcnJvcjsKLQotICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzaygKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmUGlwZWxpbmVJbXBsOjpFcnJvckNoYW5nZWRUYXNrLCB0aGlzLCBlcnJvcikpOwotCi0gIG1lZGlhX2xvZ18tPkFkZEV2ZW50KG1lZGlhX2xvZ18tPkNyZWF0ZVBpcGVsaW5lRXJyb3JFdmVudChlcnJvcikpOwotfQotCi12b2lkIFBpcGVsaW5lSW1wbDo6T25BdWRpb0Rpc2FibGVkKCkgewotICBEQ0hFQ0soSXNSdW5uaW5nKCkpOwotICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzayhGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoJlBpcGVsaW5lSW1wbDo6QXVkaW9EaXNhYmxlZFRhc2ssIHRoaXMpKTsKLSAgbWVkaWFfbG9nXy0+QWRkRXZlbnQoCi0gICAgICBtZWRpYV9sb2dfLT5DcmVhdGVFdmVudChNZWRpYUxvZ0V2ZW50OjpBVURJT19SRU5ERVJFUl9ESVNBQkxFRCkpOwotfQotCi12b2lkIFBpcGVsaW5lSW1wbDo6T25BdWRpb1RpbWVVcGRhdGUoVGltZURlbHRhIHRpbWUsIFRpbWVEZWx0YSBtYXhfdGltZSkgewotICBEQ0hFQ0tfTEUodGltZS5Jbk1pY3Jvc2Vjb25kcygpLCBtYXhfdGltZS5Jbk1pY3Jvc2Vjb25kcygpKTsKLSAgRENIRUNLKElzUnVubmluZygpKTsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLQotICBpZiAoIWhhc19hdWRpb18pCi0gICAgcmV0dXJuOwotICBpZiAod2FpdGluZ19mb3JfY2xvY2tfdXBkYXRlXyAmJiB0aW1lIDwgY2xvY2tfLT5FbGFwc2VkKCkpCi0gICAgcmV0dXJuOwotCi0gIC8vIFRPRE8oc2NoZXJrdXMpOiB8c3RhdGVffCBzaG91bGQgb25seSBiZSBhY2Nlc3NlZCBvbiBwaXBlbGluZSB0aHJlYWQsIHNlZQotICAvLyBodHRwOi8vY3JidWcuY29tLzEzNzk3MwotICBpZiAoc3RhdGVfID09IGtTZWVraW5nKQotICAgIHJldHVybjsKLQotICBjbG9ja18tPlNldFRpbWUodGltZSwgbWF4X3RpbWUpOwotICBTdGFydENsb2NrSWZXYWl0aW5nRm9yVGltZVVwZGF0ZV9Mb2NrZWQoKTsKLX0KLQotdm9pZCBQaXBlbGluZUltcGw6Ok9uVmlkZW9UaW1lVXBkYXRlKFRpbWVEZWx0YSBtYXhfdGltZSkgewotICBEQ0hFQ0soSXNSdW5uaW5nKCkpOwotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotCi0gIGlmIChoYXNfYXVkaW9fKQotICAgIHJldHVybjsKLQotICAvLyBUT0RPKHNjaGVya3VzKTogfHN0YXRlX3wgc2hvdWxkIG9ubHkgYmUgYWNjZXNzZWQgb24gcGlwZWxpbmUgdGhyZWFkLCBzZWUKLSAgLy8gaHR0cDovL2NyYnVnLmNvbS8xMzc5NzMKLSAgaWYgKHN0YXRlXyA9PSBrU2Vla2luZykKLSAgICByZXR1cm47Ci0KLSAgRENIRUNLKCF3YWl0aW5nX2Zvcl9jbG9ja191cGRhdGVfKTsKLSAgY2xvY2tfLT5TZXRNYXhUaW1lKG1heF90aW1lKTsKLX0KLQotdm9pZCBQaXBlbGluZUltcGw6OlNldER1cmF0aW9uKFRpbWVEZWx0YSBkdXJhdGlvbikgewotICBtZWRpYV9sb2dfLT5BZGRFdmVudCgKLSAgICAgIG1lZGlhX2xvZ18tPkNyZWF0ZVRpbWVFdmVudCgKLSAgICAgICAgICBNZWRpYUxvZ0V2ZW50OjpEVVJBVElPTl9TRVQsICJkdXJhdGlvbiIsIGR1cmF0aW9uKSk7Ci0gIFVNQV9ISVNUT0dSQU1fTE9OR19USU1FUygiTWVkaWEuRHVyYXRpb24iLCBkdXJhdGlvbik7Ci0KLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgY2xvY2tfLT5TZXREdXJhdGlvbihkdXJhdGlvbik7Ci0gIGlmICghZHVyYXRpb25fY2hhbmdlX2NiXy5pc19udWxsKCkpCi0gICAgZHVyYXRpb25fY2hhbmdlX2NiXy5SdW4oKTsKLX0KLQotdm9pZCBQaXBlbGluZUltcGw6OlNldFRvdGFsQnl0ZXMoaW50NjQgdG90YWxfYnl0ZXMpIHsKLSAgRENIRUNLKElzUnVubmluZygpKTsKLSAgbWVkaWFfbG9nXy0+QWRkRXZlbnQoCi0gICAgICBtZWRpYV9sb2dfLT5DcmVhdGVTdHJpbmdFdmVudCgKLSAgICAgICAgICBNZWRpYUxvZ0V2ZW50OjpUT1RBTF9CWVRFU19TRVQsICJ0b3RhbF9ieXRlcyIsCi0gICAgICAgICAgYmFzZTo6SW50NjRUb1N0cmluZyh0b3RhbF9ieXRlcykpKTsKLSAgaW50NjQgdG90YWxfbWJ5dGVzID0gdG90YWxfYnl0ZXMgPj4gMjA7Ci0gIGlmICh0b3RhbF9tYnl0ZXMgPiBraW50MzJtYXgpCi0gICAgdG90YWxfbWJ5dGVzID0ga2ludDMybWF4OwotICBVTUFfSElTVE9HUkFNX0NVU1RPTV9DT1VOVFMoCi0gICAgICAiTWVkaWEuVG90YWxNQnl0ZXMiLCBzdGF0aWNfY2FzdDxpbnQzMj4odG90YWxfbWJ5dGVzKSwgMSwga2ludDMybWF4LCA1MCk7Ci0KLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgdG90YWxfYnl0ZXNfID0gdG90YWxfYnl0ZXM7Ci19Ci0KLVRpbWVEZWx0YSBQaXBlbGluZUltcGw6OlRpbWVGb3JCeXRlT2Zmc2V0X0xvY2tlZChpbnQ2NCBieXRlX29mZnNldCkgY29uc3QgewotICBsb2NrXy5Bc3NlcnRBY3F1aXJlZCgpOwotICBUaW1lRGVsdGEgdGltZV9vZmZzZXQgPSBieXRlX29mZnNldCAqIGNsb2NrXy0+RHVyYXRpb24oKSAvIHRvdGFsX2J5dGVzXzsKLSAgLy8gU2luY2UgdGhlIGJ5dGUtPnRpbWUgY2FsY3VsYXRpb24gaXMgYXBwcm94aW1hdGUsIGZ1ZGdlIHRoZSBiZWdpbm5pbmcgJgotICAvLyBlbmRpbmcgYXJlYXMgdG8gbG9vayBiZXR0ZXIuCi0gIFRpbWVEZWx0YSBlcHNpbG9uID0gY2xvY2tfLT5EdXJhdGlvbigpIC8gMTAwOwotICBpZiAodGltZV9vZmZzZXQgPCBlcHNpbG9uKQotICAgIHJldHVybiBUaW1lRGVsdGEoKTsKLSAgaWYgKHRpbWVfb2Zmc2V0ICsgZXBzaWxvbiA+IGNsb2NrXy0+RHVyYXRpb24oKSkKLSAgICByZXR1cm4gY2xvY2tfLT5EdXJhdGlvbigpOwotICByZXR1cm4gdGltZV9vZmZzZXQ7Ci19Ci0KLXZvaWQgUGlwZWxpbmVJbXBsOjpPblN0YXRlVHJhbnNpdGlvbihQaXBlbGluZVN0YXR1cyBzdGF0dXMpIHsKLSAgLy8gRm9yY2UgcG9zdCB0byBwcm9jZXNzIHN0YXRlIHRyYW5zaXRpb25zIGFmdGVyIGN1cnJlbnQgZXhlY3V0aW9uIGZyYW1lLgotICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzaygKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmUGlwZWxpbmVJbXBsOjpTdGF0ZVRyYW5zaXRpb25UYXNrLCB0aGlzLCBzdGF0dXMpKTsKLX0KLQotdm9pZCBQaXBlbGluZUltcGw6OlN0YXRlVHJhbnNpdGlvblRhc2soUGlwZWxpbmVTdGF0dXMgc3RhdHVzKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotCi0gIC8vIE5vLW9wIGFueSBzdGF0ZSB0cmFuc2l0aW9ucyBpZiB3ZSdyZSBzdG9wcGluZy4KLSAgaWYgKHN0YXRlXyA9PSBrU3RvcHBpbmcgfHwgc3RhdGVfID09IGtTdG9wcGVkKQotICAgIHJldHVybjsKLQotICAvLyBQcmVzZXJ2ZSBleGlzdGluZyBhYm5vcm1hbCBzdGF0dXMsIG90aGVyd2lzZSB1cGRhdGUgYmFzZWQgb24gdGhlIHJlc3VsdCBvZgotICAvLyB0aGUgcHJldmlvdXMgb3BlcmF0aW9uLgotICBzdGF0dXNfID0gKHN0YXR1c18gIT0gUElQRUxJTkVfT0sgPyBzdGF0dXNfIDogc3RhdHVzKTsKLQotICBpZiAoc3RhdHVzXyAhPSBQSVBFTElORV9PSykgewotICAgIEVycm9yQ2hhbmdlZFRhc2soc3RhdHVzXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gR3VhcmQgYWdhaW5zdCBhY2NpZGVudGFsbHkgY2xlYXJpbmcgfHBlbmRpbmdfY2FsbGJhY2tzX3wgZm9yIHN0YXRlcyB0aGF0Ci0gIC8vIHVzZSBpdCBhcyB3ZWxsIGFzIHN0YXRlcyB0aGF0IHNob3VsZCBub3QgYmUgdXNpbmcgaXQuCi0gIC8vCi0gIC8vIFRPRE8oc2NoZXJrdXMpOiBNYWtlIGV2ZXJ5IHN0YXRlIHRyYW5zaXRpb24gdXNlIHxwZW5kaW5nX2NhbGxiYWNrc198LgotICBEQ0hFQ0tfRVEocGVuZGluZ19jYWxsYmFja3NfLmdldCgpICE9IE5VTEwsCi0gICAgICAgICAgICAoc3RhdGVfID09IGtJbml0UHJlcm9sbGluZyB8fCBzdGF0ZV8gPT0ga1N0YXJ0aW5nIHx8Ci0gICAgICAgICAgICAgc3RhdGVfID09IGtTZWVraW5nKSk7Ci0gIHBlbmRpbmdfY2FsbGJhY2tzXy5yZXNldCgpOwotCi0gIFBpcGVsaW5lU3RhdHVzQ0IgZG9uZV9jYiA9IGJhc2U6OkJpbmQoJlBpcGVsaW5lSW1wbDo6T25TdGF0ZVRyYW5zaXRpb24sIHRoaXMpOwotCi0gIC8vIFN3aXRjaCBzdGF0ZXMsIHBlcmZvcm1pbmcgYW55IGVudHJhbmNlIGFjdGlvbnMgZm9yIHRoZSBuZXcgc3RhdGUgYXMgd2VsbC4KLSAgU2V0U3RhdGUoR2V0TmV4dFN0YXRlKCkpOwotICBzd2l0Y2ggKHN0YXRlXykgewotICAgIGNhc2Uga0luaXREZW11eGVyOgotICAgICAgcmV0dXJuIEluaXRpYWxpemVEZW11eGVyKGRvbmVfY2IpOwotCi0gICAgY2FzZSBrSW5pdEF1ZGlvUmVuZGVyZXI6Ci0gICAgICByZXR1cm4gSW5pdGlhbGl6ZUF1ZGlvUmVuZGVyZXIoZG9uZV9jYik7Ci0KLSAgICBjYXNlIGtJbml0VmlkZW9SZW5kZXJlcjoKLSAgICAgIHJldHVybiBJbml0aWFsaXplVmlkZW9SZW5kZXJlcihkb25lX2NiKTsKLQotICAgIGNhc2Uga0luaXRQcmVyb2xsaW5nOgotICAgICAgZmlsdGVyX2NvbGxlY3Rpb25fLnJlc2V0KCk7Ci0gICAgICB7Ci0gICAgICAgIGJhc2U6OkF1dG9Mb2NrIGwobG9ja18pOwotICAgICAgICAvLyBXZSBkbyBub3Qgd2FudCB0byBzdGFydCB0aGUgY2xvY2sgcnVubmluZy4gV2Ugb25seSB3YW50IHRvIHNldCB0aGUKLSAgICAgICAgLy8gYmFzZSBtZWRpYSB0aW1lIHNvIG91ciB0aW1lc3RhbXAgY2FsY3VsYXRpb25zIHdpbGwgYmUgY29ycmVjdC4KLSAgICAgICAgY2xvY2tfLT5TZXRUaW1lKGRlbXV4ZXJfLT5HZXRTdGFydFRpbWUoKSwgZGVtdXhlcl8tPkdldFN0YXJ0VGltZSgpKTsKLQotICAgICAgICAvLyBUT0RPKHNjaGVya3VzKTogfGhhc19hdWRpb198IHNob3VsZCBiZSB0cnVlIG5vIG1hdHRlciB3aGF0IC0tCi0gICAgICAgIC8vIG90aGVyd2lzZSBwZW9wbGUgd2l0aCBtdXRlZC9kaXNhYmxlZCBzb3VuZCBjYXJkcyB3aWxsIG1ha2Ugb3VyCi0gICAgICAgIC8vIGRlZmF1bHQgY29udHJvbHMgbG9vayBhcyBpZiBldmVyeSB2aWRlbyBkb2Vzbid0IGNvbnRhaW4gYW4gYXVkaW8KLSAgICAgICAgLy8gdHJhY2suCi0gICAgICAgIGhhc19hdWRpb18gPSBhdWRpb19yZW5kZXJlcl8gIT0gTlVMTCAmJiAhYXVkaW9fZGlzYWJsZWRfOwotICAgICAgICBoYXNfdmlkZW9fID0gdmlkZW9fcmVuZGVyZXJfICE9IE5VTEw7Ci0gICAgICB9Ci0gICAgICBpZiAoIWF1ZGlvX3JlbmRlcmVyXyAmJiAhdmlkZW9fcmVuZGVyZXJfKSB7Ci0gICAgICAgIGRvbmVfY2IuUnVuKFBJUEVMSU5FX0VSUk9SX0NPVUxEX05PVF9SRU5ERVIpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIGJ1ZmZlcmluZ19zdGF0ZV9jYl8uUnVuKGtIYXZlTWV0YWRhdGEpOwotCi0gICAgICByZXR1cm4gRG9Jbml0aWFsUHJlcm9sbChkb25lX2NiKTsKLQotICAgIGNhc2Uga1N0YXJ0aW5nOgotICAgICAgcmV0dXJuIERvUGxheShkb25lX2NiKTsKLQotICAgIGNhc2Uga1N0YXJ0ZWQ6Ci0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICAgICAgU2hlbGxNZWRpYVN0YXRpc3RpY3M6Okluc3RhbmNlKCkuT25QbGF5YmFja0JlZ2luKCk7Ci0jZW5kaWYgIC8vIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLSAgICAgIHsKLSAgICAgICAgYmFzZTo6QXV0b0xvY2sgbChsb2NrXyk7Ci0gICAgICAgIC8vIFdlIHVzZSBhdWRpbyBzdHJlYW0gdG8gdXBkYXRlIHRoZSBjbG9jay4gU28gaWYgdGhlcmUgaXMgc3VjaCBhCi0gICAgICAgIC8vIHN0cmVhbSwgd2UgcGF1c2UgdGhlIGNsb2NrIHVudGlsIHdlIHJlY2VpdmUgYSB2YWxpZCB0aW1lc3RhbXAuCi0gICAgICAgIHdhaXRpbmdfZm9yX2Nsb2NrX3VwZGF0ZV8gPSB0cnVlOwotICAgICAgICBpZiAoIWhhc19hdWRpb18pIHsKLSAgICAgICAgICBjbG9ja18tPlNldE1heFRpbWUoY2xvY2tfLT5EdXJhdGlvbigpKTsKLSAgICAgICAgICBTdGFydENsb2NrSWZXYWl0aW5nRm9yVGltZVVwZGF0ZV9Mb2NrZWQoKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBEQ0hFQ0soIXNlZWtfY2JfLmlzX251bGwoKSk7Ci0gICAgICBEQ0hFQ0tfRVEoc3RhdHVzXywgUElQRUxJTkVfT0spOwotCi0gICAgICAvLyBGaXJlIGNhbnBsYXl0aHJvdWdoIGltbWVkaWF0ZWx5IGFmdGVyIHBsYXliYWNrIGJlZ2lucyBiZWNhdXNlIG9mCi0gICAgICAvLyBjcmJ1Zy5jb20vMTA2NDgwLgotICAgICAgLy8gVE9ETyh2cmspOiBzZXQgcmVhZHkgc3RhdGUgdG8gSGF2ZUZ1dHVyZURhdGEgd2hlbiBidWcgYWJvdmUgaXMgZml4ZWQuCi0gICAgICBidWZmZXJpbmdfc3RhdGVfY2JfLlJ1bihrUHJlcm9sbENvbXBsZXRlZCk7Ci0gICAgICByZXR1cm4gYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnNlZWtfY2JfKS5SdW4oUElQRUxJTkVfT0spOwotCi0gICAgY2FzZSBrU3RvcHBpbmc6Ci0gICAgY2FzZSBrU3RvcHBlZDoKLSAgICBjYXNlIGtDcmVhdGVkOgotICAgIGNhc2Uga1NlZWtpbmc6Ci0gICAgICBOT1RSRUFDSEVEKCkgPDwgIlN0YXRlIGhhcyBubyB0cmFuc2l0aW9uOiAiIDw8IHN0YXRlXzsKLSAgICAgIHJldHVybjsKLSAgfQotfQotCi12b2lkIFBpcGVsaW5lSW1wbDo6RG9Jbml0aWFsUHJlcm9sbChjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBkb25lX2NiKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBEQ0hFQ0soIXBlbmRpbmdfY2FsbGJhY2tzXy5nZXQoKSk7Ci0gIFNlcmlhbFJ1bm5lcjo6UXVldWUgYm91bmRfZm5zOwotCi0gIGJhc2U6OlRpbWVEZWx0YSBzZWVrX3RpbWVzdGFtcCA9IGRlbXV4ZXJfLT5HZXRTdGFydFRpbWUoKTsKLQotICAvLyBQcmVyb2xsIHJlbmRlcmVycy4KLSAgaWYgKGF1ZGlvX3JlbmRlcmVyXykgewotICAgIGJvdW5kX2Zucy5QdXNoKGJhc2U6OkJpbmQoCi0gICAgICAgICZBdWRpb1JlbmRlcmVyOjpQcmVyb2xsLCBhdWRpb19yZW5kZXJlcl8sIHNlZWtfdGltZXN0YW1wKSk7Ci0gIH0KLQotICBpZiAodmlkZW9fcmVuZGVyZXJfKSB7Ci0gICAgYm91bmRfZm5zLlB1c2goYmFzZTo6QmluZCgKLSAgICAgICAgJlZpZGVvUmVuZGVyZXI6OlByZXJvbGwsIHZpZGVvX3JlbmRlcmVyXywgc2Vla190aW1lc3RhbXApKTsKLSAgfQotCi0gIHBlbmRpbmdfY2FsbGJhY2tzXyA9IFNlcmlhbFJ1bm5lcjo6UnVuKGJvdW5kX2ZucywgZG9uZV9jYik7Ci19Ci0KLXZvaWQgUGlwZWxpbmVJbXBsOjpEb1NlZWsoYmFzZTo6VGltZURlbHRhIHNlZWtfdGltZXN0YW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBkb25lX2NiKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBEQ0hFQ0soIXBlbmRpbmdfY2FsbGJhY2tzXy5nZXQoKSk7Ci0gIFNlcmlhbFJ1bm5lcjo6UXVldWUgYm91bmRfZm5zOwotCi0gIC8vIFBhdXNlLgotICBpZiAoYXVkaW9fcmVuZGVyZXJfKQotICAgIGJvdW5kX2Zucy5QdXNoKGJhc2U6OkJpbmQoJkF1ZGlvUmVuZGVyZXI6OlBhdXNlLCBhdWRpb19yZW5kZXJlcl8pKTsKLSAgaWYgKHZpZGVvX3JlbmRlcmVyXykKLSAgICBib3VuZF9mbnMuUHVzaChiYXNlOjpCaW5kKCZWaWRlb1JlbmRlcmVyOjpQYXVzZSwgdmlkZW9fcmVuZGVyZXJfKSk7Ci0KLSAgLy8gRmx1c2guCi0gIGlmIChhdWRpb19yZW5kZXJlcl8pCi0gICAgYm91bmRfZm5zLlB1c2goYmFzZTo6QmluZCgmQXVkaW9SZW5kZXJlcjo6Rmx1c2gsIGF1ZGlvX3JlbmRlcmVyXykpOwotICBpZiAodmlkZW9fcmVuZGVyZXJfKQotICAgIGJvdW5kX2Zucy5QdXNoKGJhc2U6OkJpbmQoJlZpZGVvUmVuZGVyZXI6OkZsdXNoLCB2aWRlb19yZW5kZXJlcl8pKTsKLQotICAvLyBTZWVrIGRlbXV4ZXIuCi0gIGJvdW5kX2Zucy5QdXNoKGJhc2U6OkJpbmQoCi0gICAgICAmRGVtdXhlcjo6U2VlaywgZGVtdXhlcl8sIHNlZWtfdGltZXN0YW1wKSk7Ci0KLSAgLy8gUHJlcm9sbCByZW5kZXJlcnMuCi0gIGlmIChhdWRpb19yZW5kZXJlcl8pIHsKLSAgICBib3VuZF9mbnMuUHVzaChiYXNlOjpCaW5kKAotICAgICAgICAmQXVkaW9SZW5kZXJlcjo6UHJlcm9sbCwgYXVkaW9fcmVuZGVyZXJfLCBzZWVrX3RpbWVzdGFtcCkpOwotICB9Ci0KLSAgaWYgKHZpZGVvX3JlbmRlcmVyXykgewotICAgIGJvdW5kX2Zucy5QdXNoKGJhc2U6OkJpbmQoCi0gICAgICAgICZWaWRlb1JlbmRlcmVyOjpQcmVyb2xsLCB2aWRlb19yZW5kZXJlcl8sIHNlZWtfdGltZXN0YW1wKSk7Ci0gIH0KLQotICBwZW5kaW5nX2NhbGxiYWNrc18gPSBTZXJpYWxSdW5uZXI6OlJ1bihib3VuZF9mbnMsIGRvbmVfY2IpOwotfQotCi12b2lkIFBpcGVsaW5lSW1wbDo6RG9QbGF5KGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGRvbmVfY2IpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIERDSEVDSyghcGVuZGluZ19jYWxsYmFja3NfLmdldCgpKTsKLSAgU2VyaWFsUnVubmVyOjpRdWV1ZSBib3VuZF9mbnM7Ci0KLSAgUGxheWJhY2tSYXRlQ2hhbmdlZFRhc2soR2V0UGxheWJhY2tSYXRlKCkpOwotICBWb2x1bWVDaGFuZ2VkVGFzayhHZXRWb2x1bWUoKSk7Ci0KLSAgaWYgKGF1ZGlvX3JlbmRlcmVyXykKLSAgICBib3VuZF9mbnMuUHVzaChiYXNlOjpCaW5kKCZBdWRpb1JlbmRlcmVyOjpQbGF5LCBhdWRpb19yZW5kZXJlcl8pKTsKLQotICBpZiAodmlkZW9fcmVuZGVyZXJfKQotICAgIGJvdW5kX2Zucy5QdXNoKGJhc2U6OkJpbmQoJlZpZGVvUmVuZGVyZXI6OlBsYXksIHZpZGVvX3JlbmRlcmVyXykpOwotCi0gIHBlbmRpbmdfY2FsbGJhY2tzXyA9IFNlcmlhbFJ1bm5lcjo6UnVuKGJvdW5kX2ZucywgZG9uZV9jYik7Ci19Ci0KLXZvaWQgUGlwZWxpbmVJbXBsOjpEb1N0b3AoY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgZG9uZV9jYikgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgRENIRUNLKCFwZW5kaW5nX2NhbGxiYWNrc18uZ2V0KCkpOwotICBTZXJpYWxSdW5uZXI6OlF1ZXVlIGJvdW5kX2ZuczsKLQotICBpZiAoZGVtdXhlcl8pCi0gICAgYm91bmRfZm5zLlB1c2goYmFzZTo6QmluZCgmRGVtdXhlcjo6U3RvcCwgZGVtdXhlcl8pKTsKLQotICBpZiAoYXVkaW9fcmVuZGVyZXJfKQotICAgIGJvdW5kX2Zucy5QdXNoKGJhc2U6OkJpbmQoJkF1ZGlvUmVuZGVyZXI6OlN0b3AsIGF1ZGlvX3JlbmRlcmVyXykpOwotCi0gIGlmICh2aWRlb19yZW5kZXJlcl8pCi0gICAgYm91bmRfZm5zLlB1c2goYmFzZTo6QmluZCgmVmlkZW9SZW5kZXJlcjo6U3RvcCwgdmlkZW9fcmVuZGVyZXJfKSk7Ci0KLSAgcGVuZGluZ19jYWxsYmFja3NfID0gU2VyaWFsUnVubmVyOjpSdW4oYm91bmRfZm5zLCBkb25lX2NiKTsKLX0KLQotdm9pZCBQaXBlbGluZUltcGw6Ok9uU3RvcENvbXBsZXRlZChQaXBlbGluZVN0YXR1cyBzdGF0dXMpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIERDSEVDS19FUShzdGF0ZV8sIGtTdG9wcGluZyk7Ci0gIHsKLSAgICBiYXNlOjpBdXRvTG9jayBsKGxvY2tfKTsKLSAgICBydW5uaW5nXyA9IGZhbHNlOwotICB9Ci0KLSAgU2V0U3RhdGUoa1N0b3BwZWQpOwotICBwZW5kaW5nX2NhbGxiYWNrc18ucmVzZXQoKTsKLSAgZmlsdGVyX2NvbGxlY3Rpb25fLnJlc2V0KCk7Ci0gIGF1ZGlvX3JlbmRlcmVyXyA9IE5VTEw7Ci0gIHZpZGVvX3JlbmRlcmVyXyA9IE5VTEw7Ci0gIGRlbXV4ZXJfID0gTlVMTDsKLQotICAvLyBJZiB3ZSBzdG9wIGR1cmluZyBpbml0aWFsaXphdGlvbi9zZWVraW5nIHdlIHdhbnQgdG8gcnVuIHxzZWVrX2NiX3wKLSAgLy8gZm9sbG93ZWQgYnkgfHN0b3BfY2JffCBzbyB3ZSBkb24ndCBsZWF2ZSBvdXRzdGFuZGluZyBjYWxsYmFja3MgYXJvdW5kLgotICBpZiAoIXNlZWtfY2JfLmlzX251bGwoKSkgewotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZzZWVrX2NiXykuUnVuKHN0YXR1c18pOwotICAgIGVycm9yX2NiXy5SZXNldCgpOwotICB9Ci0gIGlmICghc3RvcF9jYl8uaXNfbnVsbCgpKSB7Ci0gICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnN0b3BfY2JfKS5SdW4oKTsKLSAgICBlcnJvcl9jYl8uUmVzZXQoKTsKLSAgfQotICBpZiAoIWVycm9yX2NiXy5pc19udWxsKCkpIHsKLSAgICBEQ0hFQ0tfTkUoc3RhdHVzXywgUElQRUxJTkVfT0spOwotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZlcnJvcl9jYl8pLlJ1bihzdGF0dXNfKTsKLSAgfQotfQotCi12b2lkIFBpcGVsaW5lSW1wbDo6QWRkQnVmZmVyZWRCeXRlUmFuZ2UoaW50NjQgc3RhcnQsIGludDY0IGVuZCkgewotICBEQ0hFQ0soSXNSdW5uaW5nKCkpOwotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICBidWZmZXJlZF9ieXRlX3Jhbmdlc18uQWRkKHN0YXJ0LCBlbmQpOwotICBkaWRfbG9hZGluZ19wcm9ncmVzc18gPSB0cnVlOwotfQotCi12b2lkIFBpcGVsaW5lSW1wbDo6QWRkQnVmZmVyZWRUaW1lUmFuZ2UoYmFzZTo6VGltZURlbHRhIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YSBlbmQpIHsKLSAgRENIRUNLKElzUnVubmluZygpKTsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgYnVmZmVyZWRfdGltZV9yYW5nZXNfLkFkZChzdGFydCwgZW5kKTsKLSAgZGlkX2xvYWRpbmdfcHJvZ3Jlc3NfID0gdHJ1ZTsKLX0KLQotdm9pZCBQaXBlbGluZUltcGw6Ok9uTmF0dXJhbFZpZGVvU2l6ZUNoYW5nZWQoY29uc3QgZ2Z4OjpTaXplJiBzaXplKSB7Ci0gIERDSEVDSyhJc1J1bm5pbmcoKSk7Ci0gIG1lZGlhX2xvZ18tPkFkZEV2ZW50KG1lZGlhX2xvZ18tPkNyZWF0ZVZpZGVvU2l6ZVNldEV2ZW50KAotICAgICAgc2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpKSk7Ci0KLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgbmF0dXJhbF9zaXplXyA9IHNpemU7Ci19Ci0KLXZvaWQgUGlwZWxpbmVJbXBsOjpPbkF1ZGlvUmVuZGVyZXJFbmRlZCgpIHsKLSAgLy8gRm9yY2UgcG9zdCB0byBwcm9jZXNzIGVuZGVkIG1lc3NhZ2VzIGFmdGVyIGN1cnJlbnQgZXhlY3V0aW9uIGZyYW1lLgotICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzaygKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmUGlwZWxpbmVJbXBsOjpEb0F1ZGlvUmVuZGVyZXJFbmRlZCwgdGhpcykpOwotICBtZWRpYV9sb2dfLT5BZGRFdmVudChtZWRpYV9sb2dfLT5DcmVhdGVFdmVudChNZWRpYUxvZ0V2ZW50OjpBVURJT19FTkRFRCkpOwotfQotCi12b2lkIFBpcGVsaW5lSW1wbDo6T25WaWRlb1JlbmRlcmVyRW5kZWQoKSB7Ci0gIC8vIEZvcmNlIHBvc3QgdG8gcHJvY2VzcyBlbmRlZCBtZXNzYWdlcyBhZnRlciBjdXJyZW50IGV4ZWN1dGlvbiBmcmFtZS4KLSAgbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJlBpcGVsaW5lSW1wbDo6RG9WaWRlb1JlbmRlcmVyRW5kZWQsIHRoaXMpKTsKLSAgbWVkaWFfbG9nXy0+QWRkRXZlbnQobWVkaWFfbG9nXy0+Q3JlYXRlRXZlbnQoTWVkaWFMb2dFdmVudDo6VklERU9fRU5ERUQpKTsKLX0KLQotLy8gQ2FsbGVkIGZyb20gYW55IHRocmVhZC4KLXZvaWQgUGlwZWxpbmVJbXBsOjpPblVwZGF0ZVN0YXRpc3RpY3MoY29uc3QgUGlwZWxpbmVTdGF0aXN0aWNzJiBzdGF0cykgewotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICBzdGF0aXN0aWNzXy5hdWRpb19ieXRlc19kZWNvZGVkICs9IHN0YXRzLmF1ZGlvX2J5dGVzX2RlY29kZWQ7Ci0gIHN0YXRpc3RpY3NfLnZpZGVvX2J5dGVzX2RlY29kZWQgKz0gc3RhdHMudmlkZW9fYnl0ZXNfZGVjb2RlZDsKLSAgc3RhdGlzdGljc18udmlkZW9fZnJhbWVzX2RlY29kZWQgKz0gc3RhdHMudmlkZW9fZnJhbWVzX2RlY29kZWQ7Ci0gIHN0YXRpc3RpY3NfLnZpZGVvX2ZyYW1lc19kcm9wcGVkICs9IHN0YXRzLnZpZGVvX2ZyYW1lc19kcm9wcGVkOwotfQotCi12b2lkIFBpcGVsaW5lSW1wbDo6U3RhcnRUYXNrKHNjb3BlZF9wdHI8RmlsdGVyQ29sbGVjdGlvbj4gZmlsdGVyX2NvbGxlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGVuZGVkX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBlcnJvcl9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc2Vla19jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnVmZmVyaW5nU3RhdGVDQiYgYnVmZmVyaW5nX3N0YXRlX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiBkdXJhdGlvbl9jaGFuZ2VfY2IpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIENIRUNLX0VRKGtDcmVhdGVkLCBzdGF0ZV8pCi0gICAgICA8PCAiTWVkaWEgcGlwZWxpbmUgY2Fubm90IGJlIHN0YXJ0ZWQgbW9yZSB0aGFuIG9uY2UiOwotCi0gIGZpbHRlcl9jb2xsZWN0aW9uXyA9IGZpbHRlcl9jb2xsZWN0aW9uLlBhc3MoKTsKLSAgZW5kZWRfY2JfID0gZW5kZWRfY2I7Ci0gIGVycm9yX2NiXyA9IGVycm9yX2NiOwotICBzZWVrX2NiXyA9IHNlZWtfY2I7Ci0gIGJ1ZmZlcmluZ19zdGF0ZV9jYl8gPSBidWZmZXJpbmdfc3RhdGVfY2I7Ci0gIGR1cmF0aW9uX2NoYW5nZV9jYl8gPSBkdXJhdGlvbl9jaGFuZ2VfY2I7Ci0KLSAgU3RhdGVUcmFuc2l0aW9uVGFzayhQSVBFTElORV9PSyk7Ci19Ci0KLXZvaWQgUGlwZWxpbmVJbXBsOjpTdG9wVGFzayhjb25zdCBiYXNlOjpDbG9zdXJlJiBzdG9wX2NiKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBEQ0hFQ0soc3RvcF9jYl8uaXNfbnVsbCgpKTsKLQotICBpZiAoc3RhdGVfID09IGtTdG9wcGVkKSB7Ci0gICAgc3RvcF9jYi5SdW4oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdG9wX2NiXyA9IHN0b3BfY2I7Ci0KLSAgLy8gV2UgbWF5IGFscmVhZHkgYmUgc3RvcHBpbmcgZHVlIHRvIGEgcnVudGltZSBlcnJvci4KLSAgaWYgKHN0YXRlXyA9PSBrU3RvcHBpbmcpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBTZXRTdGF0ZShrU3RvcHBpbmcpOwotICBwZW5kaW5nX2NhbGxiYWNrc18ucmVzZXQoKTsKLSAgRG9TdG9wKGJhc2U6OkJpbmQoJlBpcGVsaW5lSW1wbDo6T25TdG9wQ29tcGxldGVkLCB0aGlzKSk7Ci19Ci0KLXZvaWQgUGlwZWxpbmVJbXBsOjpFcnJvckNoYW5nZWRUYXNrKFBpcGVsaW5lU3RhdHVzIGVycm9yKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBEQ0hFQ0tfTkUoUElQRUxJTkVfT0ssIGVycm9yKSA8PCAiUElQRUxJTkVfT0sgaXNuJ3QgYW4gZXJyb3IhIjsKLQotICBpZiAoc3RhdGVfID09IGtTdG9wcGluZyB8fCBzdGF0ZV8gPT0ga1N0b3BwZWQpCi0gICAgcmV0dXJuOwotCi0gIFNldFN0YXRlKGtTdG9wcGluZyk7Ci0gIHBlbmRpbmdfY2FsbGJhY2tzXy5yZXNldCgpOwotICBzdGF0dXNfID0gZXJyb3I7Ci0KLSAgRG9TdG9wKGJhc2U6OkJpbmQoJlBpcGVsaW5lSW1wbDo6T25TdG9wQ29tcGxldGVkLCB0aGlzKSk7Ci19Ci0KLXZvaWQgUGlwZWxpbmVJbXBsOjpQbGF5YmFja1JhdGVDaGFuZ2VkVGFzayhmbG9hdCBwbGF5YmFja19yYXRlKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotCi0gIC8vIFBsYXliYWNrIHJhdGUgY2hhbmdlcyBhcmUgb25seSBjYXJyaWVkIG91dCB3aGlsZSBwbGF5aW5nLgotICBpZiAoc3RhdGVfICE9IGtTdGFydGluZyAmJiBzdGF0ZV8gIT0ga1N0YXJ0ZWQpCi0gICAgcmV0dXJuOwotCi0gIHsKLSAgICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICAgIGNsb2NrXy0+U2V0UGxheWJhY2tSYXRlKHBsYXliYWNrX3JhdGUpOwotICB9Ci0KLSAgaWYgKGRlbXV4ZXJfKQotICAgIGRlbXV4ZXJfLT5TZXRQbGF5YmFja1JhdGUocGxheWJhY2tfcmF0ZSk7Ci0gIGlmIChhdWRpb19yZW5kZXJlcl8pCi0gICAgYXVkaW9fcmVuZGVyZXJfLT5TZXRQbGF5YmFja1JhdGUocGxheWJhY2tfcmF0ZV8pOwotICBpZiAodmlkZW9fcmVuZGVyZXJfKQotICAgIHZpZGVvX3JlbmRlcmVyXy0+U2V0UGxheWJhY2tSYXRlKHBsYXliYWNrX3JhdGVfKTsKLX0KLQotdm9pZCBQaXBlbGluZUltcGw6OlZvbHVtZUNoYW5nZWRUYXNrKGZsb2F0IHZvbHVtZSkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLQotICAvLyBWb2x1bWUgY2hhbmdlcyBhcmUgb25seSBjYXJyaWVkIG91dCB3aGlsZSBwbGF5aW5nLgotICBpZiAoc3RhdGVfICE9IGtTdGFydGluZyAmJiBzdGF0ZV8gIT0ga1N0YXJ0ZWQpCi0gICAgcmV0dXJuOwotCi0gIGlmIChhdWRpb19yZW5kZXJlcl8pCi0gICAgYXVkaW9fcmVuZGVyZXJfLT5TZXRWb2x1bWUodm9sdW1lKTsKLX0KLQotdm9pZCBQaXBlbGluZUltcGw6OlNlZWtUYXNrKFRpbWVEZWx0YSB0aW1lLCBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBzZWVrX2NiKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBEQ0hFQ0soc3RvcF9jYl8uaXNfbnVsbCgpKTsKLQotICAvLyBTdXBwcmVzcyBzZWVraW5nIGlmIHdlJ3JlIG5vdCBmdWxseSBzdGFydGVkLgotICBpZiAoc3RhdGVfICE9IGtTdGFydGVkKSB7Ci0gICAgRENIRUNLKHN0YXRlXyA9PSBrU3RvcHBpbmcgfHwgc3RhdGVfID09IGtTdG9wcGVkKQotICAgICAgICA8PCAiUmVjZWl2ZSBleHRyYSBzZWVrIGluIHVuZXhwZWN0ZWQgc3RhdGU6ICIgPDwgc3RhdGVfOwotCi0gICAgLy8gVE9ETyhzY2hlcmt1cyk6IHNob3VsZCB3ZSBydW4gdGhlIGNhbGxiYWNrPyAgSSdtIHRlbXB0ZWQgdG8gc2F5IHRoZSBBUEkKLSAgICAvLyB3aWxsIG9ubHkgZXhlY3V0ZSB0aGUgZmlyc3QgU2VlaygpIHJlcXVlc3QuCi0gICAgRFZMT0coMSkgPDwgIk1lZGlhIHBpcGVsaW5lIGhhcyBub3Qgc3RhcnRlZCwgaWdub3Jpbmcgc2VlayB0byAiCi0gICAgICAgICAgICAgPDwgdGltZS5Jbk1pY3Jvc2Vjb25kcygpIDw8ICIgKGN1cnJlbnQgc3RhdGU6ICIgPDwgc3RhdGVfIDw8ICIpIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBEQ0hFQ0soc2Vla19jYl8uaXNfbnVsbCgpKTsKLQotICBTZXRTdGF0ZShrU2Vla2luZyk7Ci0gIGJhc2U6OlRpbWVEZWx0YSBzZWVrX3RpbWVzdGFtcCA9IHN0ZDo6bWF4KHRpbWUsIGRlbXV4ZXJfLT5HZXRTdGFydFRpbWUoKSk7Ci0gIHNlZWtfY2JfID0gc2Vla19jYjsKLSAgYXVkaW9fZW5kZWRfID0gZmFsc2U7Ci0gIHZpZGVvX2VuZGVkXyA9IGZhbHNlOwotCi0gIC8vIEtpY2sgb2ZmIHNlZWtpbmchCi0gIHsKLSAgICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICAgIGlmIChjbG9ja18tPklzUGxheWluZygpKQotICAgICAgY2xvY2tfLT5QYXVzZSgpOwotICAgIHdhaXRpbmdfZm9yX2Nsb2NrX3VwZGF0ZV8gPSBmYWxzZTsKLSAgICBjbG9ja18tPlNldFRpbWUoc2Vla190aW1lc3RhbXAsIHNlZWtfdGltZXN0YW1wKTsKLSAgfQotICBEb1NlZWsoc2Vla190aW1lc3RhbXAsIGJhc2U6OkJpbmQoJlBpcGVsaW5lSW1wbDo6T25TdGF0ZVRyYW5zaXRpb24sIHRoaXMpKTsKLX0KLQotdm9pZCBQaXBlbGluZUltcGw6OkRvQXVkaW9SZW5kZXJlckVuZGVkKCkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLQotICBpZiAoc3RhdGVfICE9IGtTdGFydGVkKQotICAgIHJldHVybjsKLQotICBEQ0hFQ0soIWF1ZGlvX2VuZGVkXyk7Ci0gIGF1ZGlvX2VuZGVkXyA9IHRydWU7Ci0KLSAgLy8gU3RhcnQgY2xvY2sgc2luY2UgdGhlcmUgaXMgbm8gbW9yZSBhdWRpbyB0byB0cmlnZ2VyIGNsb2NrIHVwZGF0ZXMuCi0gIGlmICghYXVkaW9fZGlzYWJsZWRfKSB7Ci0gICAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgICBjbG9ja18tPlNldE1heFRpbWUoY2xvY2tfLT5EdXJhdGlvbigpKTsKLSAgICBTdGFydENsb2NrSWZXYWl0aW5nRm9yVGltZVVwZGF0ZV9Mb2NrZWQoKTsKLSAgfQotCi0gIFJ1bkVuZGVkQ2FsbGJhY2tJZk5lZWRlZCgpOwotfQotCi12b2lkIFBpcGVsaW5lSW1wbDo6RG9WaWRlb1JlbmRlcmVyRW5kZWQoKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotCi0gIGlmIChzdGF0ZV8gIT0ga1N0YXJ0ZWQpCi0gICAgcmV0dXJuOwotCi0gIERDSEVDSyghdmlkZW9fZW5kZWRfKTsKLSAgdmlkZW9fZW5kZWRfID0gdHJ1ZTsKLQotICBSdW5FbmRlZENhbGxiYWNrSWZOZWVkZWQoKTsKLX0KLQotdm9pZCBQaXBlbGluZUltcGw6OlJ1bkVuZGVkQ2FsbGJhY2tJZk5lZWRlZCgpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0KLSAgaWYgKGF1ZGlvX3JlbmRlcmVyXyAmJiAhYXVkaW9fZW5kZWRfICYmICFhdWRpb19kaXNhYmxlZF8pCi0gICAgcmV0dXJuOwotCi0gIGlmICh2aWRlb19yZW5kZXJlcl8gJiYgIXZpZGVvX2VuZGVkXykKLSAgICByZXR1cm47Ci0KLSAgewotICAgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gICAgY2xvY2tfLT5FbmRPZlN0cmVhbSgpOwotICB9Ci0KLSAgRExPRyhJTkZPKSA8PCAidmlkZW8gcGxheWJhY2sgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSEgOikiOwotCi0gIC8vIFRPRE8oc2NoZXJrdXMpOiBDaGFuZ2UgfGVuZGVkX2NiX3wgaW50byBhIENsb3N1cmUuCi0gIERDSEVDS19FUShzdGF0dXNfLCBQSVBFTElORV9PSyk7Ci0gIGVuZGVkX2NiXy5SdW4oc3RhdHVzXyk7Ci19Ci0KLXZvaWQgUGlwZWxpbmVJbXBsOjpBdWRpb0Rpc2FibGVkVGFzaygpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0KLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgaGFzX2F1ZGlvXyA9IGZhbHNlOwotICBhdWRpb19kaXNhYmxlZF8gPSB0cnVlOwotCi0gIC8vIE5vdGlmeSBvdXIgZGVtdXhlciB0aGF0IHdlJ3JlIG5vIGxvbmdlciByZW5kZXJpbmcgYXVkaW8uCi0gIGRlbXV4ZXJfLT5PbkF1ZGlvUmVuZGVyZXJEaXNhYmxlZCgpOwotCi0gIC8vIFN0YXJ0IGNsb2NrIHNpbmNlIHRoZXJlIGlzIG5vIG1vcmUgYXVkaW8gdG8gdHJpZ2dlciBjbG9jayB1cGRhdGVzLgotICBjbG9ja18tPlNldE1heFRpbWUoY2xvY2tfLT5EdXJhdGlvbigpKTsKLSAgU3RhcnRDbG9ja0lmV2FpdGluZ0ZvclRpbWVVcGRhdGVfTG9ja2VkKCk7Ci19Ci0KLXZvaWQgUGlwZWxpbmVJbXBsOjpJbml0aWFsaXplRGVtdXhlcihjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBkb25lX2NiKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotCi0gIGRlbXV4ZXJfID0gZmlsdGVyX2NvbGxlY3Rpb25fLT5HZXREZW11eGVyKCk7Ci0gIGRlbXV4ZXJfLT5Jbml0aWFsaXplKHRoaXMsIGRvbmVfY2IpOwotfQotCi12b2lkIFBpcGVsaW5lSW1wbDo6SW5pdGlhbGl6ZUF1ZGlvUmVuZGVyZXIoY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgZG9uZV9jYikgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLQotICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IHN0cmVhbSA9Ci0gICAgICBkZW11eGVyXy0+R2V0U3RyZWFtKERlbXV4ZXJTdHJlYW06OkFVRElPKTsKLSAgRENIRUNLKHN0cmVhbSk7Ci0KLSAgZmlsdGVyX2NvbGxlY3Rpb25fLT5TZWxlY3RBdWRpb1JlbmRlcmVyKCZhdWRpb19yZW5kZXJlcl8pOwotICBhdWRpb19yZW5kZXJlcl8tPkluaXRpYWxpemUoCi0gICAgICBzdHJlYW0sICpmaWx0ZXJfY29sbGVjdGlvbl8tPkdldEF1ZGlvRGVjb2RlcnMoKSwgZG9uZV9jYiwKLSAgICAgIGJhc2U6OkJpbmQoJlBpcGVsaW5lSW1wbDo6T25VcGRhdGVTdGF0aXN0aWNzLCB0aGlzKSwKLSAgICAgIGJhc2U6OkJpbmQoJlBpcGVsaW5lSW1wbDo6T25BdWRpb1VuZGVyZmxvdywgdGhpcyksCi0gICAgICBiYXNlOjpCaW5kKCZQaXBlbGluZUltcGw6Ok9uQXVkaW9UaW1lVXBkYXRlLCB0aGlzKSwKLSAgICAgIGJhc2U6OkJpbmQoJlBpcGVsaW5lSW1wbDo6T25BdWRpb1JlbmRlcmVyRW5kZWQsIHRoaXMpLAotICAgICAgYmFzZTo6QmluZCgmUGlwZWxpbmVJbXBsOjpPbkF1ZGlvRGlzYWJsZWQsIHRoaXMpLAotICAgICAgYmFzZTo6QmluZCgmUGlwZWxpbmVJbXBsOjpTZXRFcnJvciwgdGhpcykpOwotICBmaWx0ZXJfY29sbGVjdGlvbl8tPkdldEF1ZGlvRGVjb2RlcnMoKS0+Y2xlYXIoKTsKLX0KLQotdm9pZCBQaXBlbGluZUltcGw6OkluaXRpYWxpemVWaWRlb1JlbmRlcmVyKGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGRvbmVfY2IpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiBzdHJlYW0gPQotICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpWSURFTyk7Ci0gIERDSEVDSyhzdHJlYW0pOwotCi0gIHsKLSAgICAvLyBHZXQgYW4gaW5pdGlhbCBuYXR1cmFsIHNpemUgc28gd2UgaGF2ZSBzb21ldGhpbmcgd2hlbiB3ZSBzaWduYWwKLSAgICAvLyB0aGUga0hhdmVNZXRhZGF0YSBidWZmZXJpbmcgc3RhdGUuCi0gICAgYmFzZTo6QXV0b0xvY2sgbChsb2NrXyk7Ci0gICAgbmF0dXJhbF9zaXplXyA9IHN0cmVhbS0+dmlkZW9fZGVjb2Rlcl9jb25maWcoKS5uYXR1cmFsX3NpemUoKTsKLSAgfQotCi0gIGZpbHRlcl9jb2xsZWN0aW9uXy0+U2VsZWN0VmlkZW9SZW5kZXJlcigmdmlkZW9fcmVuZGVyZXJfKTsKLSAgdmlkZW9fcmVuZGVyZXJfLT5Jbml0aWFsaXplKAotICAgICAgc3RyZWFtLCAqZmlsdGVyX2NvbGxlY3Rpb25fLT5HZXRWaWRlb0RlY29kZXJzKCksIGRvbmVfY2IsCi0gICAgICBiYXNlOjpCaW5kKCZQaXBlbGluZUltcGw6Ok9uVXBkYXRlU3RhdGlzdGljcywgdGhpcyksCi0gICAgICBiYXNlOjpCaW5kKCZQaXBlbGluZUltcGw6Ok9uVmlkZW9UaW1lVXBkYXRlLCB0aGlzKSwKLSAgICAgIGJhc2U6OkJpbmQoJlBpcGVsaW5lSW1wbDo6T25OYXR1cmFsVmlkZW9TaXplQ2hhbmdlZCwgdGhpcyksCi0gICAgICBiYXNlOjpCaW5kKCZQaXBlbGluZUltcGw6Ok9uVmlkZW9SZW5kZXJlckVuZGVkLCB0aGlzKSwKLSAgICAgIGJhc2U6OkJpbmQoJlBpcGVsaW5lSW1wbDo6U2V0RXJyb3IsIHRoaXMpLAotICAgICAgYmFzZTo6QmluZCgmUGlwZWxpbmVJbXBsOjpHZXRNZWRpYVRpbWUsIHRoaXMpLAotICAgICAgYmFzZTo6QmluZCgmUGlwZWxpbmVJbXBsOjpHZXRNZWRpYUR1cmF0aW9uLCB0aGlzKSk7Ci0gIGZpbHRlcl9jb2xsZWN0aW9uXy0+R2V0VmlkZW9EZWNvZGVycygpLT5jbGVhcigpOwotfQotCi12b2lkIFBpcGVsaW5lSW1wbDo6T25BdWRpb1VuZGVyZmxvdygpIHsKLSAgaWYgKCFtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpIHsKLSAgICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzayhGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmUGlwZWxpbmVJbXBsOjpPbkF1ZGlvVW5kZXJmbG93LCB0aGlzKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHN0YXRlXyAhPSBrU3RhcnRlZCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGF1ZGlvX3JlbmRlcmVyXykKLSAgICBhdWRpb19yZW5kZXJlcl8tPlJlc3VtZUFmdGVyVW5kZXJmbG93KHRydWUpOwotfQotCi12b2lkIFBpcGVsaW5lSW1wbDo6U3RhcnRDbG9ja0lmV2FpdGluZ0ZvclRpbWVVcGRhdGVfTG9ja2VkKCkgewotICBsb2NrXy5Bc3NlcnRBY3F1aXJlZCgpOwotICBpZiAoIXdhaXRpbmdfZm9yX2Nsb2NrX3VwZGF0ZV8pCi0gICAgcmV0dXJuOwotCi0gIHdhaXRpbmdfZm9yX2Nsb2NrX3VwZGF0ZV8gPSBmYWxzZTsKLSAgY2xvY2tfLT5QbGF5KCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvcGlwZWxpbmVfaW1wbC5oIGIvc3JjL21lZGlhL2Jhc2UvcGlwZWxpbmVfaW1wbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjE5ODNmLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3BpcGVsaW5lX2ltcGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0JBU0VfUElQRUxJTkVfSU1QTF9IXwotI2RlZmluZSBNRURJQV9CQVNFX1BJUEVMSU5FX0lNUExfSF8KLQotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKLSNpbmNsdWRlICJiYXNlL2d0ZXN0X3Byb2RfdXRpbC5oIgotI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2NvbmRpdGlvbl92YXJpYWJsZS5oIgotI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fcmVuZGVyZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlbXV4ZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvcGlwZWxpbmUuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3BpcGVsaW5lX3N0YXR1cy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvcmFuZ2VzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zZXJpYWxfcnVubmVyLmgiCi0KLWNsYXNzIE1lc3NhZ2VMb29wOwotCi1uYW1lc3BhY2UgYmFzZSB7Ci1jbGFzcyBNZXNzYWdlTG9vcFByb3h5OwotY2xhc3MgVGltZURlbHRhOwotfQotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBDbG9jazsKLWNsYXNzIEZpbHRlckNvbGxlY3Rpb247Ci1jbGFzcyBNZWRpYUxvZzsKLWNsYXNzIFZpZGVvUmVuZGVyZXI7Ci0KLS8vIEFkYXB0ZXIgZm9yIHVzaW5nIGFzeW5jaHJvbm91cyBQaXBlbGluZSBtZXRob2RzIGluIGNvZGUgdGhhdCB3YW50cyB0byBydW4KLS8vIHN5bmNocm9ub3VzbHkuICBUbyB1c2UsIGNvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFuZCBwYXNzIHRoZQotLy8gfENhbGxiYWNrKCl8IHRvIHRoZSBQaXBlbGluZSBtZXRob2QgcmVxdWlyaW5nIGEgY2FsbGJhY2suICBUaGVuIFdhaXQoKSBmb3IKLS8vIHRoZSBjYWxsYmFjayB0byBnZXQgZmlyZWQgYW5kIGNhbGwgc3RhdHVzKCkgdG8gc2VlIHdoYXQgdGhlIGNhbGxiYWNrJ3MKLS8vIGFyZ3VtZW50IHdhcy4gIFRoaXMgb2JqZWN0IGlzIGZvciBvbmUtdGltZSB1c2U7IGNhbGwgfENhbGxiYWNrKCl8IGV4YWN0bHkKLS8vIG9uY2UuCi1jbGFzcyBNRURJQV9FWFBPUlQgUGlwZWxpbmVTdGF0dXNOb3RpZmljYXRpb24gewotIHB1YmxpYzoKLSAgUGlwZWxpbmVTdGF0dXNOb3RpZmljYXRpb24oKTsKLSAgflBpcGVsaW5lU3RhdHVzTm90aWZpY2F0aW9uKCk7Ci0KLSAgLy8gU2VlIGNsYXNzLWxldmVsIGNvbW1lbnQgZm9yIHVzYWdlLgotICBQaXBlbGluZVN0YXR1c0NCIENhbGxiYWNrKCk7Ci0gIHZvaWQgV2FpdCgpOwotICBQaXBlbGluZVN0YXR1cyBzdGF0dXMoKTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgTm90aWZ5KG1lZGlhOjpQaXBlbGluZVN0YXR1cyBzdGF0dXMpOwotCi0gIGJhc2U6OkxvY2sgbG9ja187Ci0gIGJhc2U6OkNvbmRpdGlvblZhcmlhYmxlIGN2XzsKLSAgbWVkaWE6OlBpcGVsaW5lU3RhdHVzIHN0YXR1c187Ci0gIGJvb2wgbm90aWZpZWRfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihQaXBlbGluZVN0YXR1c05vdGlmaWNhdGlvbik7Ci19OwotCi0vLyBQaXBlbGluZSBydW5zIHRoZSBtZWRpYSBwaXBlbGluZS4gIEZpbHRlcnMgYXJlIGNyZWF0ZWQgYW5kIGNhbGxlZCBvbiB0aGUKLS8vIG1lc3NhZ2UgbG9vcCBpbmplY3RlZCBpbnRvIHRoaXMgb2JqZWN0LiBQaXBlbGluZSB3b3JrcyBsaWtlIGEgc3RhdGUKLS8vIG1hY2hpbmUgdG8gcGVyZm9ybSBhc3luY2hyb25vdXMgaW5pdGlhbGl6YXRpb24sIHBhdXNpbmcsIHNlZWtpbmcgYW5kIHBsYXlpbmcuCi0vLwotLy8gSGVyZSdzIGEgc3RhdGUgZGlhZ3JhbSB0aGF0IGRlc2NyaWJlcyB0aGUgbGlmZXRpbWUgb2YgdGhpcyBvYmplY3QuCi0vLwotLy8gICBbICpDcmVhdGVkIF0gICAgICAgICAgICAgICAgICAgICAgIFsgQW55IFN0YXRlIF0KLS8vICAgICAgICAgfCBTdGFydCgpICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3RvcCgpIC8gU2V0RXJyb3IoKQotLy8gICAgICAgICBWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVgotLy8gICBbIEluaXRYWFggKGZvciBlYWNoIGZpbHRlcikgXSAgICAgIFsgU3RvcHBpbmcgXQotLy8gICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gICAgICAgICBWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVgotLy8gICBbIEluaXRQcmVyb2xsIF0gICAgICAgICAgICAgICAgICAgIFsgU3RvcHBlZCBdCi0vLyAgICAgICAgIHwKLS8vICAgICAgICAgVgotLy8gICBbIFN0YXJ0aW5nIF0gPC0tIFsgU2Vla2luZyBdCi0vLyAgICAgICAgIHwgICAgICAgICAgICAgICBeCi0vLyAgICAgICAgIFYgICAgICAgICAgICAgICB8Ci0vLyAgIFsgU3RhcnRlZCBdIC0tLS0tLS0tLS0nCi0vLyAgICAgICAgICAgICAgICAgU2VlaygpCi0vLwotLy8gSW5pdGlhbGl6YXRpb24gaXMgYSBzZXJpZXMgb2Ygc3RhdGUgdHJhbnNpdGlvbnMgZnJvbSAiQ3JlYXRlZCIgdGhyb3VnaCBlYWNoCi0vLyBmaWx0ZXIgaW5pdGlhbGl6YXRpb24gc3RhdGUuICBXaGVuIGFsbCBmaWx0ZXIgaW5pdGlhbGl6YXRpb24gc3RhdGVzIGhhdmUKLS8vIGNvbXBsZXRlZCwgd2UgYXJlIGltcGxpY2l0bHkgaW4gYSAiUGF1c2VkIiBzdGF0ZS4gIEF0IHRoYXQgcG9pbnQgd2Ugc2ltdWxhdGUKLS8vIGEgU2VlaygpIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lZGlhIHRvIGdpdmUgZmlsdGVycyBhIGNoYW5jZSB0byBwcmVyb2xsLgotLy8gRnJvbSB0aGVuIG9uIHRoZSBub3JtYWwgU2VlaygpIHRyYW5zaXRpb25zIGFyZSBjYXJyaWVkIG91dCBhbmQgd2Ugc3RhcnQKLS8vIHBsYXlpbmcgdGhlIG1lZGlhLgotLy8KLS8vIElmIGFueSBlcnJvciBldmVyIGhhcHBlbnMsIHRoaXMgb2JqZWN0IHdpbGwgdHJhbnNpdGlvbiB0byB0aGUgIkVycm9yIiBzdGF0ZQotLy8gZnJvbSBhbnkgc3RhdGUuIElmIFN0b3AoKSBpcyBldmVyIGNhbGxlZCwgdGhpcyBvYmplY3Qgd2lsbCB0cmFuc2l0aW9uIHRvCi0vLyAiU3RvcHBlZCIgc3RhdGUuCi1jbGFzcyBNRURJQV9FWFBPUlQgUGlwZWxpbmVJbXBsIDogcHVibGljIFBpcGVsaW5lLCBwdWJsaWMgRGVtdXhlckhvc3QgewotIHB1YmxpYzoKLSAgLy8gQ29uc3RydWN0cyBhIG1lZGlhIHBpcGVsaW5lIHRoYXQgd2lsbCBleGVjdXRlIG9uIHxtZXNzYWdlX2xvb3B8LgotICBQaXBlbGluZUltcGwoY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbWVzc2FnZV9sb29wLAotICAgICAgICAgICAgICAgTWVkaWFMb2cqIG1lZGlhX2xvZyk7Ci0KLSAgdm9pZCBTdXNwZW5kKCkgT1ZFUlJJREU7Ci0gIHZvaWQgUmVzdW1lKCkgT1ZFUlJJREU7Ci0KLSAgLy8gQnVpbGQgYSBwaXBlbGluZSB0byB1c2luZyB0aGUgZ2l2ZW4gZmlsdGVyIGNvbGxlY3Rpb24gdG8gY29uc3RydWN0IGEgZmlsdGVyCi0gIC8vIGNoYWluLCBleGVjdXRpbmcgfHNlZWtfY2J8IHdoZW4gdGhlIGluaXRpYWwgc2Vlay9wcmVyb2xsIGhhcyBjb21wbGV0ZWQuCi0gIC8vCi0gIC8vIHxmaWx0ZXJfY29sbGVjdGlvbnwgbXVzdCBiZSBhIGNvbXBsZXRlIGNvbGxlY3Rpb24gY29udGFpbmluZyBhIGRlbXV4ZXIsCi0gIC8vIGF1ZGlvL3ZpZGVvIGRlY29kZXJzLCBhbmQgYXVkaW8vdmlkZW8gcmVuZGVyZXJzLiBGYWlsaW5nIHRvIGRvIHNvIHdpbGwKLSAgLy8gcmVzdWx0IGluIGEgY3Jhc2guCi0gIC8vCi0gIC8vIFRoZSBmb2xsb3dpbmcgcGVybWFuZW50IGNhbGxiYWNrcyB3aWxsIGJlIGV4ZWN1dGVkIGFzIGZvbGxvd3MgdXAgdW50aWwKLSAgLy8gU3RvcCgpIGhhcyBjb21wbGV0ZWQ6Ci0gIC8vICAgfGRlY3J5cHRvcl9yZWFkeV9jYnwgY2FuIGJlIHVzZWQgaWYgUGlwZWxpbmUgbmVlZHMgdG8gYmUgbm90aWZpZWQgd2hlbgotICAvLyAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBEZWNyeXB0b3IgaXMgcmVhZHkuCi0gIC8vICAgfGVuZGVkX2NifCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW5ldmVyIHRoZSBtZWRpYSByZWFjaGVzIHRoZSBlbmQuCi0gIC8vICAgfGVycm9yX2NifCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW5ldmVyIGFuIGVycm9yIG9jY3VycyBidXQgaGFzbid0Ci0gIC8vICAgICAgICAgICAgICBiZWVuIHJlcG9ydGVkIGFscmVhZHkgdGhyb3VnaCBhbm90aGVyIGNhbGxiYWNrLgotICAvLyAgIHxidWZmZXJpbmdfc3RhdGVfY2J8IE9wdGlvbmFsIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuZXZlciB0aGUKLSAgLy8gICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSdzIGJ1ZmZlcmluZyBzdGF0ZSBjaGFuZ2VzLgotICAvLyAgIHxkdXJhdGlvbl9jaGFuZ2VfY2J8IG9wdGlvbmFsIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuZXZlciB0aGUKLSAgLy8gICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb24gZHVyYXRpb24gY2hhbmdlcy4KLSAgLy8gSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCB0aGlzIG1ldGhvZCBhZnRlciB0aGUgcGlwZWxpbmUgaGFzIGFscmVhZHkgc3RhcnRlZC4KLSAgdm9pZCBTdGFydChzY29wZWRfcHRyPEZpbHRlckNvbGxlY3Rpb24+IGZpbHRlcl9jb2xsZWN0aW9uLAotICAgICAgICAgICAgIGNvbnN0IFNldERlY3J5cHRvclJlYWR5Q0ImIGRlY3J5cHRvcl9yZWFkeV9jYiwKLSAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBlbmRlZF9jYiwKLSAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBlcnJvcl9jYiwKLSAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBzZWVrX2NiLAotICAgICAgICAgICAgIGNvbnN0IEJ1ZmZlcmluZ1N0YXRlQ0ImIGJ1ZmZlcmluZ19zdGF0ZV9jYiwKLSAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiBkdXJhdGlvbl9jaGFuZ2VfY2IpIE9WRVJSSURFOwotCi0gIC8vIEFzeW5jaHJvbm91c2x5IHN0b3BzIHRoZSBwaXBlbGluZSwgZXhlY3V0aW5nIHxzdG9wX2NifCB3aGVuIHRoZSBwaXBlbGluZQotICAvLyB0ZWFyZG93biBoYXMgY29tcGxldGVkLgotICAvLwotICAvLyBTdG9wKCkgbXVzdCBjb21wbGV0ZSBiZWZvcmUgZGVzdHJveWluZyB0aGUgcGlwZWxpbmUuIEl0IGl0IHBlcm1pc3NpYmxlIHRvCi0gIC8vIGNhbGwgU3RvcCgpIGF0IGFueSBwb2ludCBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoZSBwaXBlbGluZS4KLSAgdm9pZCBTdG9wKGNvbnN0IGJhc2U6OkNsb3N1cmUmIHN0b3BfY2IpIE9WRVJSSURFOwotCi0gIC8vIEF0dGVtcHQgdG8gc2VlayB0byB0aGUgcG9zaXRpb24gc3BlY2lmaWVkIGJ5IHRpbWUuICB8c2Vla19jYnwgd2lsbCBiZQotICAvLyBleGVjdXRlZCB3aGVuIHRoZSBhbGwgZmlsdGVycyBpbiB0aGUgcGlwZWxpbmUgaGF2ZSBwcm9jZXNzZWQgdGhlIHNlZWsuCi0gIC8vCi0gIC8vIENsaWVudHMgYXJlIGV4cGVjdGVkIHRvIGNhbGwgR2V0TWVkaWFUaW1lKCkgdG8gY2hlY2sgd2hldGhlciB0aGUgc2VlawotICAvLyBzdWNjZWVkZWQuCi0gIC8vCi0gIC8vIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyBtZXRob2QgaWYgdGhlIHBpcGVsaW5lIGhhcyBub3Qgc3RhcnRlZC4KLSAgdm9pZCBTZWVrKGJhc2U6OlRpbWVEZWx0YSB0aW1lLCBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBzZWVrX2NiKSBPVkVSUklERTsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHBpcGVsaW5lIGhhcyBiZWVuIHN0YXJ0ZWQgdmlhIFN0YXJ0KCkuICBJZiBJc1J1bm5pbmcoKQotICAvLyByZXR1cm5zIHRydWUsIGl0IGlzIGV4cGVjdGVkIHRoYXQgU3RvcCgpIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBkZXN0cm95aW5nCi0gIC8vIHRoZSBwaXBlbGluZS4KLSAgYm9vbCBJc1J1bm5pbmcoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIG1lZGlhIGhhcyBhdWRpby4KLSAgYm9vbCBIYXNBdWRpbygpIGNvbnN0IE9WRVJSSURFOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWVkaWEgaGFzIHZpZGVvLgotICBib29sIEhhc1ZpZGVvKCkgY29uc3QgT1ZFUlJJREU7Ci0KLSAgLy8gR2V0cyB0aGUgY3VycmVudCBwbGF5YmFjayByYXRlIG9mIHRoZSBwaXBlbGluZS4gIFdoZW4gdGhlIHBpcGVsaW5lIGlzCi0gIC8vIHN0YXJ0ZWQsIHRoZSBwbGF5YmFjayByYXRlIHdpbGwgYmUgMC4wZi4gIEEgcmF0ZSBvZiAxLjBmIGluZGljYXRlcwotICAvLyB0aGF0IHRoZSBwaXBlbGluZSBpcyByZW5kZXJpbmcgdGhlIG1lZGlhIGF0IHRoZSBzdGFuZGFyZCByYXRlLiAgVmFsaWQKLSAgLy8gdmFsdWVzIGZvciBwbGF5YmFjayByYXRlIGFyZSA+PSAwLjBmLgotICBmbG9hdCBHZXRQbGF5YmFja1JhdGUoKSBjb25zdCBPVkVSUklERTsKLQotICAvLyBBdHRlbXB0IHRvIGFkanVzdCB0aGUgcGxheWJhY2sgcmF0ZS4gU2V0dGluZyBhIHBsYXliYWNrIHJhdGUgb2YgMC4wZiBwYXVzZXMKLSAgLy8gYWxsIHJlbmRlcmluZyBvZiB0aGUgbWVkaWEuICBBIHJhdGUgb2YgMS4wZiBpbmRpY2F0ZXMgYSBub3JtYWwgcGxheWJhY2sKLSAgLy8gcmF0ZS4gIFZhbHVlcyBmb3IgdGhlIHBsYXliYWNrIHJhdGUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMC4wZi4KLSAgLy8KLSAgLy8gVE9ETyhzY2hlcmt1cyk6IFdoYXQgYWJvdXQgbWF4aW11bSByYXRlPyAgRG9lcyBIVE1MNSBzcGVjaWZ5IGEgbWF4PwotICB2b2lkIFNldFBsYXliYWNrUmF0ZShmbG9hdCBwbGF5YmFja19yYXRlKSBPVkVSUklERTsKLQotICAvLyBHZXRzIHRoZSBjdXJyZW50IHZvbHVtZSBzZXR0aW5nIGJlaW5nIHVzZWQgYnkgdGhlIGF1ZGlvIHJlbmRlcmVyLiAgV2hlbgotICAvLyB0aGUgcGlwZWxpbmUgaXMgc3RhcnRlZCwgdGhpcyB2YWx1ZSB3aWxsIGJlIDEuMGYuICBWYWxpZCB2YWx1ZXMgcmFuZ2UKLSAgLy8gZnJvbSAwLjBmIHRvIDEuMGYuCi0gIGZsb2F0IEdldFZvbHVtZSgpIGNvbnN0IE9WRVJSSURFOwotCi0gIC8vIEF0dGVtcHQgdG8gc2V0IHRoZSB2b2x1bWUgb2YgdGhlIGF1ZGlvIHJlbmRlcmVyLiAgVmFsaWQgdmFsdWVzIGZvciB2b2x1bWUKLSAgLy8gcmFuZ2UgZnJvbSAwLjBmIChtdXRlZCkgdG8gMS4wZiAoZnVsbCB2b2x1bWUpLiAgVGhpcyB2YWx1ZSBhZmZlY3RzIGFsbAotICAvLyBjaGFubmVscyBwcm9wb3J0aW9uYXRlbHkgZm9yIG11bHRpLWNoYW5uZWwgYXVkaW8gc3RyZWFtcy4KLSAgdm9pZCBTZXRWb2x1bWUoZmxvYXQgdm9sdW1lKSBPVkVSUklERTsKLQotICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IG1lZGlhIHBsYXliYWNrIHRpbWUsIHdoaWNoIHByb2dyZXNzZXMgZnJvbSAwIHVudGlsCi0gIC8vIEdldE1lZGlhRHVyYXRpb24oKS4KLSAgYmFzZTo6VGltZURlbHRhIEdldE1lZGlhVGltZSgpIGNvbnN0IE9WRVJSSURFOwotCi0gIC8vIEdldCBhcHByb3hpbWF0ZSB0aW1lIHJhbmdlcyBvZiBidWZmZXJlZCBtZWRpYS4KLSAgUmFuZ2VzPGJhc2U6OlRpbWVEZWx0YT4gR2V0QnVmZmVyZWRUaW1lUmFuZ2VzKCkgT1ZFUlJJREU7Ci0KLSAgLy8gR2V0IHRoZSBkdXJhdGlvbiBvZiB0aGUgbWVkaWEgaW4gbWljcm9zZWNvbmRzLiAgSWYgdGhlIGR1cmF0aW9uIGhhcyBub3QKLSAgLy8gYmVlbiBkZXRlcm1pbmVkIHlldCwgdGhlbiByZXR1cm5zIDAuCi0gIGJhc2U6OlRpbWVEZWx0YSBHZXRNZWRpYUR1cmF0aW9uKCkgY29uc3QgT1ZFUlJJREU7Ci0KLSAgLy8gR2V0IHRoZSB0b3RhbCBzaXplIG9mIHRoZSBtZWRpYSBmaWxlLiAgSWYgdGhlIHNpemUgaGFzIG5vdCB5ZXQgYmVlbgotICAvLyBkZXRlcm1pbmVkIG9yIGNhbiBub3QgYmUgZGV0ZXJtaW5lZCwgdGhpcyB2YWx1ZSBpcyAwLgotICBpbnQ2NCBHZXRUb3RhbEJ5dGVzKCkgY29uc3QgT1ZFUlJJREU7Ci0KLSAgLy8gR2V0cyB0aGUgbmF0dXJhbCBzaXplIG9mIHRoZSB2aWRlbyBvdXRwdXQgaW4gcGl4ZWwgdW5pdHMuICBJZiB0aGVyZSBpcyBubwotICAvLyB2aWRlbyBvciB0aGUgdmlkZW8gaGFzIG5vdCBiZWVuIHJlbmRlcmVkIHlldCwgdGhlIHdpZHRoIGFuZCBoZWlnaHQgd2lsbAotICAvLyBiZSAwLgotICB2b2lkIEdldE5hdHVyYWxWaWRlb1NpemUoZ2Z4OjpTaXplKiBvdXRfc2l6ZSkgY29uc3QgT1ZFUlJJREU7Ci0KLSAgLy8gUmV0dXJuIHRydWUgaWYgbG9hZGluZyBwcm9ncmVzcyBoYXMgYmVlbiBtYWRlIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcwotICAvLyBtZXRob2Qgd2FzIGNhbGxlZC4KLSAgYm9vbCBEaWRMb2FkaW5nUHJvZ3Jlc3MoKSBjb25zdCBPVkVSUklERTsKLQotICAvLyBHZXRzIHRoZSBjdXJyZW50IHBpcGVsaW5lIHN0YXRpc3RpY3MuCi0gIFBpcGVsaW5lU3RhdGlzdGljcyBHZXRTdGF0aXN0aWNzKCkgY29uc3QgT1ZFUlJJREU7Ci0KLSAgdm9pZCBTZXRDbG9ja0ZvclRlc3RpbmcoQ2xvY2sqIGNsb2NrKTsKLSAgdm9pZCBTZXRFcnJvckZvclRlc3RpbmcoUGlwZWxpbmVTdGF0dXMgc3RhdHVzKTsKLQotIHByaXZhdGU6Ci0gIEZSSUVORF9URVNUX0FMTF9QUkVGSVhFUyhQaXBlbGluZVRlc3QsIEdldEJ1ZmZlcmVkVGltZVJhbmdlcyk7Ci0gIEZSSUVORF9URVNUX0FMTF9QUkVGSVhFUyhQaXBlbGluZVRlc3QsIERpc2FibGVBdWRpb1JlbmRlcmVyKTsKLSAgRlJJRU5EX1RFU1RfQUxMX1BSRUZJWEVTKFBpcGVsaW5lVGVzdCwgRGlzYWJsZUF1ZGlvUmVuZGVyZXJEdXJpbmdJbml0KTsKLSAgRlJJRU5EX1RFU1RfQUxMX1BSRUZJWEVTKFBpcGVsaW5lVGVzdCwgRW5kZWRDYWxsYmFjayk7Ci0gIEZSSUVORF9URVNUX0FMTF9QUkVGSVhFUyhQaXBlbGluZVRlc3QsIEF1ZGlvU3RyZWFtU2hvcnRlclRoYW5WaWRlbyk7Ci0gIGZyaWVuZCBjbGFzcyBNZWRpYUxvZzsKLQotICB2aXJ0dWFsIH5QaXBlbGluZUltcGwoKTsKLQotICAvLyBQaXBlbGluZUltcGwgc3RhdGVzLCBhcyBkZXNjcmliZWQgYWJvdmUuCi0gIGVudW0gU3RhdGUgewotICAgIGtDcmVhdGVkLAotICAgIGtJbml0RGVtdXhlciwKLSAgICBrSW5pdEF1ZGlvUmVuZGVyZXIsCi0gICAga0luaXRWaWRlb1JlbmRlcmVyLAotICAgIGtJbml0UHJlcm9sbGluZywKLSAgICBrU2Vla2luZywKLSAgICBrU3RhcnRpbmcsCi0gICAga1N0YXJ0ZWQsCi0gICAga1N0b3BwaW5nLAotICAgIGtTdG9wcGVkLAotICB9OwotCi0gIC8vIFVwZGF0ZXMgfHN0YXRlX3wuIEFsbCBzdGF0ZSB0cmFuc2l0aW9ucyBzaG91bGQgdXNlIHRoaXMgY2FsbC4KLSAgdm9pZCBTZXRTdGF0ZShTdGF0ZSBuZXh0X3N0YXRlKTsKLQotICBzdGF0aWMgY29uc3QgY2hhciogR2V0U3RhdGVTdHJpbmcoU3RhdGUgc3RhdGUpOwotICBTdGF0ZSBHZXROZXh0U3RhdGUoKSBjb25zdDsKLQotICAvLyBIZWxwZXIgbWV0aG9kIHRoYXQgcnVucyAmIHJlc2V0cyB8c2Vla19jYl98IGFuZCByZXNldHMgfHNlZWtfdGltZXN0YW1wX3wKLSAgLy8gYW5kIHxzZWVrX3BlbmRpbmdffC4KLSAgdm9pZCBGaW5pc2hTZWVrKCk7Ci0KLSAgLy8gRGF0YVNvdXJjZUhvc3QgKGJ5IHdheSBvZiBEZW11eGVySG9zdCkgaW1wbGVtZW50YXRpb24uCi0gIHZpcnR1YWwgdm9pZCBTZXRUb3RhbEJ5dGVzKGludDY0IHRvdGFsX2J5dGVzKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIEFkZEJ1ZmZlcmVkQnl0ZVJhbmdlKGludDY0IHN0YXJ0LCBpbnQ2NCBlbmQpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgQWRkQnVmZmVyZWRUaW1lUmFuZ2UoYmFzZTo6VGltZURlbHRhIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhIGVuZCkgT1ZFUlJJREU7Ci0KLSAgLy8gRGVtdXhlckhvc3QgaW1wbGVtZW50YWlvbi4KLSAgdmlydHVhbCB2b2lkIFNldER1cmF0aW9uKGJhc2U6OlRpbWVEZWx0YSBkdXJhdGlvbikgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBPbkRlbXV4ZXJFcnJvcihQaXBlbGluZVN0YXR1cyBlcnJvcikgT1ZFUlJJREU7Ci0KLSAgLy8gSW5pdGlhdGVzIHRlYXJkb3duIHNlcXVlbmNlIGluIHJlc3BvbnNlIHRvIGEgcnVudGltZSBlcnJvci4KLSAgLy8KLSAgLy8gU2FmZSB0byBjYWxsIGZyb20gYW55IHRocmVhZC4KLSAgdm9pZCBTZXRFcnJvcihQaXBlbGluZVN0YXR1cyBlcnJvcik7Ci0KLSAgLy8gQ2FsbGJhY2sgZXhlY3V0ZWQgd2hlbiB0aGUgbmF0dXJhbCBzaXplIG9mIHRoZSB2aWRlbyBoYXMgY2hhbmdlZC4KLSAgdm9pZCBPbk5hdHVyYWxWaWRlb1NpemVDaGFuZ2VkKGNvbnN0IGdmeDo6U2l6ZSYgc2l6ZSk7Ci0KLSAgLy8gQ2FsbGJhY2tzIGV4ZWN1dGVkIHdoZW4gYSByZW5kZXJlciBoYXMgZW5kZWQuCi0gIHZvaWQgT25BdWRpb1JlbmRlcmVyRW5kZWQoKTsKLSAgdm9pZCBPblZpZGVvUmVuZGVyZXJFbmRlZCgpOwotCi0gIC8vIENhbGxiYWNrIGV4ZWN1dGVkIGJ5IGZpbHRlcnMgdG8gdXBkYXRlIHN0YXRpc3RpY3MuCi0gIHZvaWQgT25VcGRhdGVTdGF0aXN0aWNzKGNvbnN0IFBpcGVsaW5lU3RhdGlzdGljcyYgc3RhdHMpOwotCi0gIC8vIENhbGxiYWNrIGV4ZWN1dGVkIGJ5IGF1ZGlvIHJlbmRlcmVyIHdoZW4gaXQgaGFzIGJlZW4gZGlzYWJsZWQuCi0gIHZvaWQgT25BdWRpb0Rpc2FibGVkKCk7Ci0KLSAgLy8gQ2FsbGJhY2sgZXhlY3V0ZWQgYnkgYXVkaW8gcmVuZGVyZXIgdG8gdXBkYXRlIGNsb2NrIHRpbWUuCi0gIHZvaWQgT25BdWRpb1RpbWVVcGRhdGUoYmFzZTo6VGltZURlbHRhIHRpbWUsIGJhc2U6OlRpbWVEZWx0YSBtYXhfdGltZSk7Ci0KLSAgLy8gQ2FsbGJhY2sgZXhlY3V0ZWQgYnkgdmlkZW8gcmVuZGVyZXIgdG8gdXBkYXRlIGNsb2NrIHRpbWUuCi0gIHZvaWQgT25WaWRlb1RpbWVVcGRhdGUoYmFzZTo6VGltZURlbHRhIG1heF90aW1lKTsKLQotICAvLyBUaGUgZm9sbG93aW5nICJ0YXNrIiBtZXRob2RzIGNvcnJlc3BvbmQgdG8gdGhlIHB1YmxpYyBtZXRob2RzLCBidXQgdGhlc2UKLSAgLy8gbWV0aG9kcyBhcmUgcnVuIGFzIHRoZSByZXN1bHQgb2YgcG9zdGluZyBhIHRhc2sgdG8gdGhlIFBpcGVsaW5lSW50ZXJuYWwncwotICAvLyBtZXNzYWdlIGxvb3AuCi0gIHZvaWQgU3RhcnRUYXNrKHNjb3BlZF9wdHI8RmlsdGVyQ29sbGVjdGlvbj4gZmlsdGVyX2NvbGxlY3Rpb24sCi0gICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGVuZGVkX2NiLAotICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBlcnJvcl9jYiwKLSAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc2Vla19jYiwKLSAgICAgICAgICAgICAgICAgY29uc3QgQnVmZmVyaW5nU3RhdGVDQiYgYnVmZmVyaW5nX3N0YXRlX2NiLAotICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiBkdXJhdGlvbl9jaGFuZ2VfY2IpOwotCi0gIC8vIFN0b3BzIGFuZCBkZXN0cm95cyBhbGwgZmlsdGVycywgcGxhY2luZyB0aGUgcGlwZWxpbmUgaW4gdGhlIGtTdG9wcGVkIHN0YXRlLgotICB2b2lkIFN0b3BUYXNrKGNvbnN0IGJhc2U6OkNsb3N1cmUmIHN0b3BfY2IpOwotCi0gIC8vIENhcnJpZXMgb3V0IHN0b3BwaW5nIGFuZCBkZXN0cm95aW5nIGFsbCBmaWx0ZXJzLCBwbGFjaW5nIHRoZSBwaXBlbGluZSBpbgotICAvLyB0aGUga1N0b3BwZWQgc3RhdGUuCi0gIHZvaWQgRXJyb3JDaGFuZ2VkVGFzayhQaXBlbGluZVN0YXR1cyBlcnJvcik7Ci0KLSAgLy8gQ2FycmllcyBvdXQgbm90aWZ5aW5nIGZpbHRlcnMgdGhhdCB0aGUgcGxheWJhY2sgcmF0ZSBoYXMgY2hhbmdlZC4KLSAgdm9pZCBQbGF5YmFja1JhdGVDaGFuZ2VkVGFzayhmbG9hdCBwbGF5YmFja19yYXRlKTsKLQotICAvLyBDYXJyaWVzIG91dCBub3RpZnlpbmcgZmlsdGVycyB0aGF0IHRoZSB2b2x1bWUgaGFzIGNoYW5nZWQuCi0gIHZvaWQgVm9sdW1lQ2hhbmdlZFRhc2soZmxvYXQgdm9sdW1lKTsKLQotICAvLyBDYXJyaWVzIG91dCBub3RpZnlpbmcgZmlsdGVycyB0aGF0IHdlIGFyZSBzZWVraW5nIHRvIGEgbmV3IHRpbWVzdGFtcC4KLSAgdm9pZCBTZWVrVGFzayhiYXNlOjpUaW1lRGVsdGEgdGltZSwgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc2Vla19jYik7Ci0KLSAgLy8gSGFuZGxlcyBhdWRpby92aWRlbyBlbmRlZCBsb2dpYyBhbmQgcnVubmluZyB8ZW5kZWRfY2JffC4KLSAgdm9pZCBEb0F1ZGlvUmVuZGVyZXJFbmRlZCgpOwotICB2b2lkIERvVmlkZW9SZW5kZXJlckVuZGVkKCk7Ci0gIHZvaWQgUnVuRW5kZWRDYWxsYmFja0lmTmVlZGVkKCk7Ci0KLSAgLy8gQ2FycmllcyBvdXQgZGlzYWJsaW5nIHRoZSBhdWRpbyByZW5kZXJlci4KLSAgdm9pZCBBdWRpb0Rpc2FibGVkVGFzaygpOwotCi0gIC8vIEtpY2tzIG9mZiBpbml0aWFsaXphdGlvbiBmb3IgZWFjaCBtZWRpYSBvYmplY3QsIGV4ZWN1dGluZyB8ZG9uZV9jYnwgd2l0aAotICAvLyB0aGUgcmVzdWx0IHdoZW4gY29tcGxldGVkLgotICB2b2lkIEluaXRpYWxpemVEZW11eGVyKGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGRvbmVfY2IpOwotICB2b2lkIEluaXRpYWxpemVBdWRpb1JlbmRlcmVyKGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGRvbmVfY2IpOwotICB2b2lkIEluaXRpYWxpemVWaWRlb1JlbmRlcmVyKGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGRvbmVfY2IpOwotCi0gIC8vIEtpY2tzIG9mZiBkZXN0cm95aW5nIGZpbHRlcnMuIENhbGxlZCBieSBTdG9wVGFzaygpIGFuZCBFcnJvckNoYW5nZWRUYXNrKCkuCi0gIC8vIFdoZW4gd2Ugc3RhcnQgdG8gdGVhciBkb3duIHRoZSBwaXBlbGluZSwgd2Ugd2lsbCBjb25zaWRlciB0d28gY2FzZXM6Ci0gIC8vIDEuIHdoZW4gcGlwZWxpbmUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLCB3ZSB3aWxsIHRyYW5zaXQgdG8gc3RvcHBpbmcKLSAgLy8gc3RhdGUgZmlyc3QuCi0gIC8vIDIuIHdoZW4gcGlwZWxpbmUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQsIHdlIHdpbGwgZmlyc3QgdHJhbnNpdCB0byBwYXVzaW5nCi0gIC8vID0+IGZsdXNoaW5nID0+IHN0b3BwaW5nID0+IHN0b3BwZWQgc3RhdGUuCi0gIC8vIFRoaXMgd2lsbCByZW1vdmUgdGhlIHJhY2UgY29uZGl0aW9uIGR1cmluZyBzdG9wIGJldHdlZW4gZmlsdGVycy4KLSAgdm9pZCBUZWFyRG93blBpcGVsaW5lKCk7Ci0KLSAgLy8gQ29tcHV0ZSB0aGUgdGltZSBjb3JyZXNwb25kaW5nIHRvIGEgYnl0ZSBvZmZzZXQuCi0gIGJhc2U6OlRpbWVEZWx0YSBUaW1lRm9yQnl0ZU9mZnNldF9Mb2NrZWQoaW50NjQgYnl0ZV9vZmZzZXQpIGNvbnN0OwotCi0gIHZvaWQgT25TdGF0ZVRyYW5zaXRpb24oUGlwZWxpbmVTdGF0dXMgc3RhdHVzKTsKLSAgdm9pZCBTdGF0ZVRyYW5zaXRpb25UYXNrKFBpcGVsaW5lU3RhdHVzIHN0YXR1cyk7Ci0KLSAgLy8gSW5pdGlhdGVzIGFuIGFzeW5jaHJvbm91cyBwcmVyb2xsIGNhbGwgc2VxdWVuY2UgZXhlY3V0aW5nIHxkb25lX2NifAotICAvLyB3aXRoIHRoZSBmaW5hbCBzdGF0dXMgd2hlbiBjb21wbGV0ZWQuCi0gIHZvaWQgRG9Jbml0aWFsUHJlcm9sbChjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBkb25lX2NiKTsKLQotICAvLyBJbml0aWF0ZXMgYW4gYXN5bmNocm9ub3VzIHBhdXNlLWZsdXNoLXNlZWstcHJlcm9sbCBjYWxsIHNlcXVlbmNlCi0gIC8vIGV4ZWN1dGluZyB8ZG9uZV9jYnwgd2l0aCB0aGUgZmluYWwgc3RhdHVzIHdoZW4gY29tcGxldGVkLgotICAvLwotICAvLyBUT0RPKHNjaGVya3VzKTogUHJlcm9sbGluZyBzaG91bGQgYmUgc2VwYXJhdGUgZnJvbSBzZWVraW5nIHNvIHdlIGNhbiByZXBvcnQKLSAgLy8gZmluZXIgZ3JhaW5lZCByZWFkeSBzdGF0ZXMgKEhBVkVfQ1VSUkVOVF9EQVRBIHZzLiBIQVZFX0ZVVFVSRV9EQVRBKQotICAvLyBpbmRlcGVudGVudCBmcm9tIHNlZWtpbmcuCi0gIHZvaWQgRG9TZWVrKGJhc2U6OlRpbWVEZWx0YSBzZWVrX3RpbWVzdGFtcCwgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgZG9uZV9jYik7Ci0KLSAgLy8gVXBkYXRlcyBwbGF5YmFjayByYXRlIGFuZCB2b2x1bWUgYW5kIGluaXRpYXRlcyBhbiBhc3luY2hyb25vdXMgcGxheSBjYWxsCi0gIC8vIHNlcXVlbmNlIGV4ZWN1dGluZyB8ZG9uZV9jYnwgd2l0aCB0aGUgZmluYWwgc3RhdHVzIHdoZW4gY29tcGxldGVkLgotICB2b2lkIERvUGxheShjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBkb25lX2NiKTsKLQotICAvLyBJbml0aWF0ZXMgYW4gYXN5bmNocm9ub3VzIHBhdXNlLWZsdXNoLXN0b3AgY2FsbCBzZXF1ZW5jZSBleGVjdXRpbmcKLSAgLy8gfGRvbmVfY2J8IHdoZW4gY29tcGxldGVkLgotICB2b2lkIERvU3RvcChjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBkb25lX2NiKTsKLSAgdm9pZCBPblN0b3BDb21wbGV0ZWQoUGlwZWxpbmVTdGF0dXMgc3RhdHVzKTsKLQotICB2b2lkIE9uQXVkaW9VbmRlcmZsb3coKTsKLQotICB2b2lkIFN0YXJ0Q2xvY2tJZldhaXRpbmdGb3JUaW1lVXBkYXRlX0xvY2tlZCgpOwotCi0gIC8vIE1lc3NhZ2UgbG9vcCB1c2VkIHRvIGV4ZWN1dGUgcGlwZWxpbmUgdGFza3MuCi0gIHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4gbWVzc2FnZV9sb29wXzsKLQotICAvLyBNZWRpYUxvZyB0byB3aGljaCB0byBsb2cgZXZlbnRzLgotICBzY29wZWRfcmVmcHRyPE1lZGlhTG9nPiBtZWRpYV9sb2dfOwotCi0gIC8vIExvY2sgdXNlZCB0byBzZXJpYWxpemUgYWNjZXNzIGZvciB0aGUgZm9sbG93aW5nIGRhdGEgbWVtYmVycy4KLSAgbXV0YWJsZSBiYXNlOjpMb2NrIGxvY2tfOwotCi0gIC8vIFdoZXRoZXIgb3Igbm90IHRoZSBwaXBlbGluZSBpcyBydW5uaW5nLgotICBib29sIHJ1bm5pbmdfOwotCi0gIC8vIEFtb3VudCBvZiBhdmFpbGFibGUgYnVmZmVyZWQgZGF0YS4gIFNldCBieSBmaWx0ZXJzLgotICBSYW5nZXM8aW50NjQ+IGJ1ZmZlcmVkX2J5dGVfcmFuZ2VzXzsKLSAgUmFuZ2VzPGJhc2U6OlRpbWVEZWx0YT4gYnVmZmVyZWRfdGltZV9yYW5nZXNfOwotCi0gIC8vIFRydWUgd2hlbiBBZGRCdWZmZXJlZEJ5dGVSYW5nZSgpIGhhcyBiZWVuIGNhbGxlZCBtb3JlIHJlY2VudGx5IHRoYW4KLSAgLy8gRGlkTG9hZGluZ1Byb2dyZXNzKCkuCi0gIG11dGFibGUgYm9vbCBkaWRfbG9hZGluZ19wcm9ncmVzc187Ci0KLSAgLy8gVG90YWwgc2l6ZSBvZiB0aGUgbWVkaWEuICBTZXQgYnkgZmlsdGVycy4KLSAgaW50NjQgdG90YWxfYnl0ZXNfOwotCi0gIC8vIFZpZGVvJ3MgbmF0dXJhbCB3aWR0aCBhbmQgaGVpZ2h0LiAgU2V0IGJ5IGZpbHRlcnMuCi0gIGdmeDo6U2l6ZSBuYXR1cmFsX3NpemVfOwotCi0gIC8vIEN1cnJlbnQgdm9sdW1lIGxldmVsIChmcm9tIDAuMGYgdG8gMS4wZikuICBUaGlzIHZhbHVlIGlzIHNldCBpbW1lZGlhdGVseQotICAvLyB2aWEgU2V0Vm9sdW1lKCkgYW5kIGEgdGFzayBpcyBkaXNwYXRjaGVkIG9uIHRoZSBtZXNzYWdlIGxvb3AgdG8gbm90aWZ5IHRoZQotICAvLyBmaWx0ZXJzLgotICBmbG9hdCB2b2x1bWVfOwotCi0gIC8vIEN1cnJlbnQgcGxheWJhY2sgcmF0ZSAoPj0gMC4wZikuICBUaGlzIHZhbHVlIGlzIHNldCBpbW1lZGlhdGVseSB2aWEKLSAgLy8gU2V0UGxheWJhY2tSYXRlKCkgYW5kIGEgdGFzayBpcyBkaXNwYXRjaGVkIG9uIHRoZSBtZXNzYWdlIGxvb3AgdG8gbm90aWZ5Ci0gIC8vIHRoZSBmaWx0ZXJzLgotICBmbG9hdCBwbGF5YmFja19yYXRlXzsKLQotICAvLyBSZWZlcmVuY2UgY2xvY2suICBLZWVwcyB0cmFjayBvZiBjdXJyZW50IHBsYXliYWNrIHRpbWUuICBVc2VzIHN5c3RlbQotICAvLyBjbG9jayBhbmQgbGluZWFyIGludGVycG9sYXRpb24sIGJ1dCBjYW4gaGF2ZSBpdHMgdGltZSBtYW51YWxseSBzZXQKLSAgLy8gYnkgZmlsdGVycy4KLSAgc2NvcGVkX3B0cjxDbG9jaz4gY2xvY2tfOwotCi0gIC8vIElmIHRoaXMgdmFsdWUgaXMgc2V0IHRvIHRydWUsIHRoZW4gfGNsb2NrX3wgaXMgcGF1c2VkIGFuZCB3ZSBhcmUgd2FpdGluZwotICAvLyBmb3IgYW4gdXBkYXRlIG9mIHRoZSBjbG9jayBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGVsYXBzZWQgdGltZSB0bwotICAvLyBzdGFydCB0aGUgY2xvY2suCi0gIGJvb2wgd2FpdGluZ19mb3JfY2xvY2tfdXBkYXRlXzsKLQotICAvLyBTdGF0dXMgb2YgdGhlIHBpcGVsaW5lLiAgSW5pdGlhbGl6ZWQgdG8gUElQRUxJTkVfT0sgd2hpY2ggaW5kaWNhdGVzIHRoYXQKLSAgLy8gdGhlIHBpcGVsaW5lIGlzIG9wZXJhdGluZyBjb3JyZWN0bHkuIEFueSBvdGhlciB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUKLSAgLy8gcGlwZWxpbmUgaXMgc3RvcHBlZCBvciBpcyBzdG9wcGluZy4gIENsaWVudHMgY2FuIGNhbGwgdGhlIFN0b3AoKSBtZXRob2QgdG8KLSAgLy8gcmVzZXQgdGhlIHBpcGVsaW5lIHN0YXRlLCBhbmQgcmVzdG9yZSB0aGlzIHRvIFBJUEVMSU5FX09LLgotICBQaXBlbGluZVN0YXR1cyBzdGF0dXNfOwotCi0gIC8vIFdoZXRoZXIgdGhlIG1lZGlhIGNvbnRhaW5zIHJlbmRlcmVkIGF1ZGlvIGFuZCB2aWRlbyBzdHJlYW1zLgotICAvLyBUT0RPKGZpc2NobWFuLHNjaGVya3VzKTogcmVwbGFjZSB0aGVzZSB3aXRoIGNoZWNrcyBmb3IKLSAgLy8ge2F1ZGlvLHZpZGVvfV9kZWNvZGVyXyBvbmNlIGV4dHJhY3Rpb24gb2Yge0F1ZGlvLFZpZGVvfURlY29kZXIgZnJvbSB0aGUKLSAgLy8gRmlsdGVyIGhlaXJhcmNoeSBpcyBkb25lLgotICBib29sIGhhc19hdWRpb187Ci0gIGJvb2wgaGFzX3ZpZGVvXzsKLQotICAvLyBUaGUgZm9sbG93aW5nIGRhdGEgbWVtYmVycyBhcmUgb25seSBhY2Nlc3NlZCBieSB0YXNrcyBwb3N0ZWQgdG8KLSAgLy8gfG1lc3NhZ2VfbG9vcF98LgotCi0gIC8vIE1lbWJlciB0aGF0IHRyYWNrcyB0aGUgY3VycmVudCBzdGF0ZS4KLSAgU3RhdGUgc3RhdGVfOwotCi0gIC8vIFdoZXRoZXIgd2UndmUgcmVjZWl2ZWQgdGhlIGF1ZGlvL3ZpZGVvIGVuZGVkIGV2ZW50cy4KLSAgYm9vbCBhdWRpb19lbmRlZF87Ci0gIGJvb2wgdmlkZW9fZW5kZWRfOwotCi0gIC8vIFNldCB0byB0cnVlIGluIERpc2FibGVBdWRpb1JlbmRlcmVyVGFzaygpLgotICBib29sIGF1ZGlvX2Rpc2FibGVkXzsKLQotICBzY29wZWRfcHRyPEZpbHRlckNvbGxlY3Rpb24+IGZpbHRlcl9jb2xsZWN0aW9uXzsKLQotICAvLyBUZW1wb3JhcnkgY2FsbGJhY2sgdXNlZCBmb3IgU3RhcnQoKSBhbmQgU2VlaygpLgotICBQaXBlbGluZVN0YXR1c0NCIHNlZWtfY2JfOwotCi0gIC8vIFRlbXBvcmFyeSBjYWxsYmFjayB1c2VkIGZvciBTdG9wKCkuCi0gIGJhc2U6OkNsb3N1cmUgc3RvcF9jYl87Ci0KLSAgLy8gUGVybWFuZW50IGNhbGxiYWNrcyBwYXNzZWQgaW4gdmlhIFN0YXJ0KCkuCi0gIFBpcGVsaW5lU3RhdHVzQ0IgZW5kZWRfY2JfOwotICBQaXBlbGluZVN0YXR1c0NCIGVycm9yX2NiXzsKLSAgQnVmZmVyaW5nU3RhdGVDQiBidWZmZXJpbmdfc3RhdGVfY2JfOwotICBiYXNlOjpDbG9zdXJlIGR1cmF0aW9uX2NoYW5nZV9jYl87Ci0KLSAgLy8gUmVuZGVyZXIgcmVmZXJlbmNlcyB1c2VkIGZvciBzZXR0aW5nIHRoZSB2b2x1bWUsIHBsYXliYWNrIHJhdGUsIGFuZAotICAvLyBkZXRlcm1pbmluZyB3aGVuIHBsYXliYWNrIGhhcyBmaW5pc2hlZC4KLSAgc2NvcGVkX3JlZnB0cjxBdWRpb1JlbmRlcmVyPiBhdWRpb19yZW5kZXJlcl87Ci0gIHNjb3BlZF9yZWZwdHI8VmlkZW9SZW5kZXJlcj4gdmlkZW9fcmVuZGVyZXJfOwotCi0gIC8vIERlbXV4ZXIgcmVmZXJlbmNlIHVzZWQgZm9yIHNldHRpbmcgdGhlIHByZWxvYWQgdmFsdWUuCi0gIHNjb3BlZF9yZWZwdHI8RGVtdXhlcj4gZGVtdXhlcl87Ci0KLSAgUGlwZWxpbmVTdGF0aXN0aWNzIHN0YXRpc3RpY3NfOwotCi0gIC8vIFRpbWUgb2YgcGlwZWxpbmUgY3JlYXRpb247IGlzIG5vbi16ZXJvIG9ubHkgdW50aWwgdGhlIHBpcGVsaW5lIGZpcnN0Ci0gIC8vIHJlYWNoZXMgImtTdGFydGVkIiwgYXQgd2hpY2ggcG9pbnQgaXQgaXMgdXNlZCAmIHplcm9lZCBvdXQuCi0gIGJhc2U6OlRpbWUgY3JlYXRpb25fdGltZV87Ci0KLSAgc2NvcGVkX3B0cjxTZXJpYWxSdW5uZXI+IHBlbmRpbmdfY2FsbGJhY2tzXzsKLQotICBiYXNlOjpUaHJlYWRDaGVja2VyIHRocmVhZF9jaGVja2VyXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oUGlwZWxpbmVJbXBsKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0JBU0VfUElQRUxJTkVfSU1QTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvcGlwZWxpbmVfaW1wbF91bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9iYXNlL3BpcGVsaW5lX2ltcGxfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZTc0M2IuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvcGlwZWxpbmVfaW1wbF91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEyMTUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wLmgiCi0jaW5jbHVkZSAiYmFzZS9zdGxfdXRpbC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3NpbXBsZV90aHJlYWQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2Nsb2NrLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9nbW9ja19jYWxsYmFja19zdXBwb3J0LmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9sb2cuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21vY2tfZmlsdGVycy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvcGlwZWxpbmVfaW1wbC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdGVzdF9oZWxwZXJzLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0jaW5jbHVkZSAidWkvZ2Z4L3NpemUuaCIKLQotdXNpbmcgOjp0ZXN0aW5nOjpfOwotdXNpbmcgOjp0ZXN0aW5nOjpEZWxldGVBcmc7Ci11c2luZyA6OnRlc3Rpbmc6OkRvQWxsOwotLy8gVE9ETyhzY2hlcmt1cyk6IFJlbW92ZSBJblNlcXVlbmNlIGFmdGVyIHJlZmFjdG9yaW5nIFBpcGVsaW5lSW1wbC4KLXVzaW5nIDo6dGVzdGluZzo6SW5TZXF1ZW5jZTsKLXVzaW5nIDo6dGVzdGluZzo6SW52b2tlOwotdXNpbmcgOjp0ZXN0aW5nOjpJbnZva2VXaXRob3V0QXJnczsKLXVzaW5nIDo6dGVzdGluZzo6TW9jazsKLXVzaW5nIDo6dGVzdGluZzo6Tm90TnVsbDsKLXVzaW5nIDo6dGVzdGluZzo6UmV0dXJuOwotdXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm5SZWY7Ci11c2luZyA6OnRlc3Rpbmc6OlNhdmVBcmc7Ci11c2luZyA6OnRlc3Rpbmc6OlN0cmljdE1vY2s7Ci11c2luZyA6OnRlc3Rpbmc6OldpdGhBcmc7Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIERlbXV4ZXIgcHJvcGVydGllcy4KLXN0YXRpYyBjb25zdCBpbnQga1RvdGFsQnl0ZXMgPSAxMDI0OwotCi1BQ1RJT05fUChTZXREZW11eGVyUHJvcGVydGllcywgZHVyYXRpb24pIHsKLSAgYXJnMC0+U2V0VG90YWxCeXRlcyhrVG90YWxCeXRlcyk7Ci0gIGFyZzAtPlNldER1cmF0aW9uKGR1cmF0aW9uKTsKLX0KLQotQUNUSU9OX1AyKFN0b3AsIHBpcGVsaW5lLCBzdG9wX2NiKSB7Ci0gIHBpcGVsaW5lLT5TdG9wKHN0b3BfY2IpOwotfQotCi1BQ1RJT05fUDIoU2V0RXJyb3IsIHBpcGVsaW5lLCBzdGF0dXMpIHsKLSAgcGlwZWxpbmUtPlNldEVycm9yRm9yVGVzdGluZyhzdGF0dXMpOwotfQotCi0vLyBVc2VkIGZvciBzZXR0aW5nIGV4cGVjdGF0aW9ucyBvbiBwaXBlbGluZSBjYWxsYmFja3MuICBVc2luZyBhIFN0cmljdE1vY2sKLS8vIGFsc28gbGV0cyB1cyB0ZXN0IGZvciBtaXNzaW5nIGNhbGxiYWNrcy4KLWNsYXNzIENhbGxiYWNrSGVscGVyIHsKLSBwdWJsaWM6Ci0gIENhbGxiYWNrSGVscGVyKCkge30KLSAgdmlydHVhbCB+Q2FsbGJhY2tIZWxwZXIoKSB7fQotCi0gIE1PQ0tfTUVUSE9EMShPblN0YXJ0LCB2b2lkKFBpcGVsaW5lU3RhdHVzKSk7Ci0gIE1PQ0tfTUVUSE9EMShPblNlZWssIHZvaWQoUGlwZWxpbmVTdGF0dXMpKTsKLSAgTU9DS19NRVRIT0QwKE9uU3RvcCwgdm9pZCgpKTsKLSAgTU9DS19NRVRIT0QxKE9uRW5kZWQsIHZvaWQoUGlwZWxpbmVTdGF0dXMpKTsKLSAgTU9DS19NRVRIT0QxKE9uRXJyb3IsIHZvaWQoUGlwZWxpbmVTdGF0dXMpKTsKLSAgTU9DS19NRVRIT0QxKE9uQnVmZmVyaW5nU3RhdGUsIHZvaWQoUGlwZWxpbmVJbXBsOjpCdWZmZXJpbmdTdGF0ZSkpOwotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKENhbGxiYWNrSGVscGVyKTsKLX07Ci0KLS8vIFRPRE8oc2NoZXJrdXMpOiBldmVuIHRob3VnaCBzb21lIGZpbHRlcnMgYXJlIGluaXRpYWxpemVkIG9uIHNlcGFyYXRlCi0vLyB0aHJlYWRzIHRoZXNlIHRlc3QgYXJlbid0IGZsYWt5Li4uIHdoeT8gIEl0J3MgYmVjYXVzZSBmaWx0ZXJzJyBJbml0aWFsaXplKCkKLS8vIGlzIGV4ZWN1dGVkIG9uIHxtZXNzYWdlX2xvb3BffCBhbmQgdGhlIG1vY2sgZmlsdGVycyBpbnN0YW50bHkgY2FsbAotLy8gSW5pdGlhbGl6YXRpb25Db21wbGV0ZSgpLCB3aGljaCBrZWVwcyB0aGUgcGlwZWxpbmUgaHVtbWluZyBhbG9uZy4gIElmCi0vLyBlaXRoZXIgZmlsdGVycyBkb24ndCBjYWxsIEluaXRpYWxpemF0aW9uQ29tcGxldGUoKSBpbW1lZGlhdGVseSBvciBmaWx0ZXIKLS8vIGluaXRpYWxpemF0aW9uIGlzIG1vdmVkIHRvIGEgc2VwYXJhdGUgdGhyZWFkIHRoaXMgdGVzdCB3aWxsIGJlY29tZSBmbGFreS4KLWNsYXNzIFBpcGVsaW5lVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgUGlwZWxpbmVUZXN0KCkKLSAgICAgIDogcGlwZWxpbmVfKG5ldyBQaXBlbGluZUltcGwobWVzc2FnZV9sb29wXy5tZXNzYWdlX2xvb3BfcHJveHkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1lZGlhTG9nKCkpKSB7Ci0gICAgbW9ja3NfLnJlc2V0KG5ldyBNb2NrRmlsdGVyQ29sbGVjdGlvbigpKTsKLQotICAgIC8vIEluaXRpYWxpemVEZW11eGVyKCkgYWRkcyBvdmVycmlkaW5nIGV4cGVjdGF0aW9ucyBmb3IgZXhwZWN0ZWQgbm9uLU5VTEwKLSAgICAvLyBzdHJlYW1zLgotICAgIERlbXV4ZXJTdHJlYW0qIG51bGxfcG9pbnRlciA9IE5VTEw7Ci0gICAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+ZGVtdXhlcigpLCBHZXRTdHJlYW0oXykpCi0gICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4obnVsbF9wb2ludGVyKSk7Ci0KLSAgICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5kZW11eGVyKCksIEdldFN0YXJ0VGltZSgpKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKGJhc2U6OlRpbWVEZWx0YSgpKSk7Ci0gIH0KLQotICB2aXJ0dWFsIH5QaXBlbGluZVRlc3QoKSB7Ci0gICAgLy8gU2h1dGRvd24gc2VxdWVuY2UuCi0gICAgaWYgKHBpcGVsaW5lXy0+SXNSdW5uaW5nKCkpIHsKLSAgICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPmRlbXV4ZXIoKSwgU3RvcChfKSkKLSAgICAgICAgICAuV2lsbE9uY2UoUnVuQ2xvc3VyZTwwPigpKTsKLQotICAgICAgaWYgKGF1ZGlvX3N0cmVhbV8pCi0gICAgICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPmF1ZGlvX3JlbmRlcmVyKCksIFN0b3AoXykpCi0gICAgICAgICAgICAuV2lsbE9uY2UoUnVuQ2xvc3VyZTwwPigpKTsKLQotICAgICAgaWYgKHZpZGVvX3N0cmVhbV8pCi0gICAgICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPnZpZGVvX3JlbmRlcmVyKCksIFN0b3AoXykpCi0gICAgICAgICAgICAuV2lsbE9uY2UoUnVuQ2xvc3VyZTwwPigpKTsKLSAgICB9Ci0KLSAgICAvLyBFeHBlY3QgYSBzdG9wIGNhbGxiYWNrIGlmIHdlIHdlcmUgc3RhcnRlZC4KLSAgICBFWFBFQ1RfQ0FMTChjYWxsYmFja3NfLCBPblN0b3AoKSk7Ci0gICAgcGlwZWxpbmVfLT5TdG9wKGJhc2U6OkJpbmQoJkNhbGxiYWNrSGVscGVyOjpPblN0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCgmY2FsbGJhY2tzXykpKTsKLSAgICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotCi0gICAgcGlwZWxpbmVfID0gTlVMTDsKLSAgICBtb2Nrc18ucmVzZXQoKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICAvLyBTZXRzIHVwIGV4cGVjdGF0aW9ucyB0byBhbGxvdyB0aGUgZGVtdXhlciB0byBpbml0aWFsaXplLgotICB0eXBlZGVmIHN0ZDo6dmVjdG9yPE1vY2tEZW11eGVyU3RyZWFtKj4gTW9ja0RlbXV4ZXJTdHJlYW1WZWN0b3I7Ci0gIHZvaWQgSW5pdGlhbGl6ZURlbXV4ZXIoTW9ja0RlbXV4ZXJTdHJlYW1WZWN0b3IqIHN0cmVhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6VGltZURlbHRhJiBkdXJhdGlvbikgewotICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPmRlbXV4ZXIoKSwgSW5pdGlhbGl6ZShfLCBfKSkKLSAgICAgICAgLldpbGxPbmNlKERvQWxsKFNldERlbXV4ZXJQcm9wZXJ0aWVzKGR1cmF0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkNhbGxiYWNrPDE+KFBJUEVMSU5FX09LKSkpOwotCi0gICAgLy8gQ29uZmlndXJlIHRoZSBkZW11eGVyIHRvIHJldHVybiB0aGUgc3RyZWFtcy4KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0cmVhbXMtPnNpemUoKTsgKytpKSB7Ci0gICAgICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IHN0cmVhbSgoKnN0cmVhbXMpW2ldKTsKLSAgICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPmRlbXV4ZXIoKSwgR2V0U3RyZWFtKHN0cmVhbS0+dHlwZSgpKSkKLSAgICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKHN0cmVhbSkpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgSW5pdGlhbGl6ZURlbXV4ZXIoTW9ja0RlbXV4ZXJTdHJlYW1WZWN0b3IqIHN0cmVhbXMpIHsKLSAgICAvLyBJbml0aWFsaXplIHdpdGggYSBkZWZhdWx0IG5vbi16ZXJvIGR1cmF0aW9uLgotICAgIEluaXRpYWxpemVEZW11eGVyKHN0cmVhbXMsIGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoMTApKTsKLSAgfQotCi0gIFN0cmljdE1vY2s8TW9ja0RlbXV4ZXJTdHJlYW0+KiBDcmVhdGVTdHJlYW0oRGVtdXhlclN0cmVhbTo6VHlwZSB0eXBlKSB7Ci0gICAgU3RyaWN0TW9jazxNb2NrRGVtdXhlclN0cmVhbT4qIHN0cmVhbSA9Ci0gICAgICAgIG5ldyBTdHJpY3RNb2NrPE1vY2tEZW11eGVyU3RyZWFtPigpOwotICAgIEVYUEVDVF9DQUxMKCpzdHJlYW0sIHR5cGUoKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybih0eXBlKSk7Ci0gICAgcmV0dXJuIHN0cmVhbTsKLSAgfQotCi0gIC8vIFNldHMgdXAgZXhwZWN0YXRpb25zIHRvIGFsbG93IHRoZSB2aWRlbyByZW5kZXJlciB0byBpbml0aWFsaXplLgotICB2b2lkIEluaXRpYWxpemVWaWRlb1JlbmRlcmVyKGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4mIHN0cmVhbSkgewotICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPnZpZGVvX3JlbmRlcmVyKCksCi0gICAgICAgICAgICAgICAgSW5pdGlhbGl6ZShzdHJlYW0sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8pKQotICAgICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8Mj4oUElQRUxJTkVfT0spKTsKLSAgICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT52aWRlb19yZW5kZXJlcigpLCBTZXRQbGF5YmFja1JhdGUoMC4wZikpOwotCi0gICAgLy8gU3RhcnR1cCBzZXF1ZW5jZS4KLSAgICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT52aWRlb19yZW5kZXJlcigpLAotICAgICAgICAgICAgICAgIFByZXJvbGwobW9ja3NfLT5kZW11eGVyKCktPkdldFN0YXJ0VGltZSgpLCBfKSkKLSAgICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrPDE+KFBJUEVMSU5FX09LKSk7Ci0gICAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+dmlkZW9fcmVuZGVyZXIoKSwgUGxheShfKSkKLSAgICAgICAgLldpbGxPbmNlKFJ1bkNsb3N1cmU8MD4oKSk7Ci0gIH0KLQotICAvLyBTZXRzIHVwIGV4cGVjdGF0aW9ucyB0byBhbGxvdyB0aGUgYXVkaW8gcmVuZGVyZXIgdG8gaW5pdGlhbGl6ZS4KLSAgdm9pZCBJbml0aWFsaXplQXVkaW9SZW5kZXJlcihjb25zdCBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+JiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkaXNhYmxlX2FmdGVyX2luaXRfY2IpIHsKLSAgICBpZiAoZGlzYWJsZV9hZnRlcl9pbml0X2NiKSB7Ci0gICAgICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5hdWRpb19yZW5kZXJlcigpLAotICAgICAgICAgICAgICAgICAgSW5pdGlhbGl6ZShzdHJlYW0sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8pKQotICAgICAgICAgIC5XaWxsT25jZShEb0FsbChSdW5DYWxsYmFjazwyPihQSVBFTElORV9PSyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFdpdGhBcmc8Nz4oUnVuQ2xvc3VyZTwwPigpKSkpOyAgLy8gfGRpc2FibGVkX2NifC4KLSAgICB9IGVsc2UgewotICAgICAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+YXVkaW9fcmVuZGVyZXIoKSwKLSAgICAgICAgICAgICAgICAgIEluaXRpYWxpemUoc3RyZWFtLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfKSkKLSAgICAgICAgICAuV2lsbE9uY2UoRG9BbGwoU2F2ZUFyZzw1PigmYXVkaW9fdGltZV9jYl8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5DYWxsYmFjazwyPihQSVBFTElORV9PSykpKTsKLSAgICB9Ci0gIH0KLQotICAvLyBTZXRzIHVwIGV4cGVjdGF0aW9ucyBvbiB0aGUgY2FsbGJhY2sgYW5kIGluaXRpYWxpemVzIHRoZSBwaXBlbGluZS4gIENhbGxlZAotICAvLyBhZnRlciB0ZXN0cyBoYXZlIHNldCBleHBlY3RhdGlvbnMgYW55IGZpbHRlcnMgdGhleSB3aXNoIHRvIHVzZS4KLSAgdm9pZCBJbml0aWFsaXplUGlwZWxpbmUoUGlwZWxpbmVTdGF0dXMgc3RhcnRfc3RhdHVzKSB7Ci0gICAgRVhQRUNUX0NBTEwoY2FsbGJhY2tzXywgT25TdGFydChzdGFydF9zdGF0dXMpKTsKLQotICAgIGlmIChzdGFydF9zdGF0dXMgPT0gUElQRUxJTkVfT0spIHsKLSAgICAgIEVYUEVDVF9DQUxMKGNhbGxiYWNrc18sIE9uQnVmZmVyaW5nU3RhdGUoUGlwZWxpbmVJbXBsOjprSGF2ZU1ldGFkYXRhKSk7Ci0gICAgICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5kZW11eGVyKCksIFNldFBsYXliYWNrUmF0ZSgwLjBmKSk7Ci0KLSAgICAgIGlmIChhdWRpb19zdHJlYW1fKSB7Ci0gICAgICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPmF1ZGlvX3JlbmRlcmVyKCksIFNldFBsYXliYWNrUmF0ZSgwLjBmKSk7Ci0gICAgICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPmF1ZGlvX3JlbmRlcmVyKCksIFNldFZvbHVtZSgxLjBmKSk7Ci0KLSAgICAgICAgLy8gU3RhcnR1cCBzZXF1ZW5jZS4KLSAgICAgICAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+YXVkaW9fcmVuZGVyZXIoKSwgUHJlcm9sbChiYXNlOjpUaW1lRGVsdGEoKSwgXykpCi0gICAgICAgICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MT4oUElQRUxJTkVfT0spKTsKLSAgICAgICAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+YXVkaW9fcmVuZGVyZXIoKSwgUGxheShfKSkKLSAgICAgICAgICAgIC5XaWxsT25jZShSdW5DbG9zdXJlPDA+KCkpOwotICAgICAgfQotICAgICAgRVhQRUNUX0NBTEwoY2FsbGJhY2tzXywKLSAgICAgICAgICAgICAgICAgIE9uQnVmZmVyaW5nU3RhdGUoUGlwZWxpbmVJbXBsOjprUHJlcm9sbENvbXBsZXRlZCkpOwotICAgIH0KLQotICAgIHBpcGVsaW5lXy0+U3RhcnQoCi0gICAgICAgIG1vY2tzXy0+Q3JlYXRlKCkuUGFzcygpLCBTZXREZWNyeXB0b3JSZWFkeUNCKCksCi0gICAgICAgIGJhc2U6OkJpbmQoJkNhbGxiYWNrSGVscGVyOjpPbkVuZGVkLCBiYXNlOjpVbnJldGFpbmVkKCZjYWxsYmFja3NfKSksCi0gICAgICAgIGJhc2U6OkJpbmQoJkNhbGxiYWNrSGVscGVyOjpPbkVycm9yLCBiYXNlOjpVbnJldGFpbmVkKCZjYWxsYmFja3NfKSksCi0gICAgICAgIGJhc2U6OkJpbmQoJkNhbGxiYWNrSGVscGVyOjpPblN0YXJ0LCBiYXNlOjpVbnJldGFpbmVkKCZjYWxsYmFja3NfKSksCi0gICAgICAgIGJhc2U6OkJpbmQoJkNhbGxiYWNrSGVscGVyOjpPbkJ1ZmZlcmluZ1N0YXRlLAotICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoJmNhbGxiYWNrc18pKSwKLSAgICAgICAgYmFzZTo6Q2xvc3VyZSgpKTsKLSAgICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotICB9Ci0KLSAgdm9pZCBDcmVhdGVBdWRpb1N0cmVhbSgpIHsKLSAgICBhdWRpb19zdHJlYW1fID0gQ3JlYXRlU3RyZWFtKERlbXV4ZXJTdHJlYW06OkFVRElPKTsKLSAgfQotCi0gIHZvaWQgQ3JlYXRlVmlkZW9TdHJlYW0oKSB7Ci0gICAgdmlkZW9fc3RyZWFtXyA9IENyZWF0ZVN0cmVhbShEZW11eGVyU3RyZWFtOjpWSURFTyk7Ci0gICAgRVhQRUNUX0NBTEwoKnZpZGVvX3N0cmVhbV8sIHZpZGVvX2RlY29kZXJfY29uZmlnKCkpCi0gICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm5SZWYodmlkZW9fZGVjb2Rlcl9jb25maWdfKSk7Ci0gIH0KLQotICBNb2NrRGVtdXhlclN0cmVhbSogYXVkaW9fc3RyZWFtKCkgewotICAgIHJldHVybiBhdWRpb19zdHJlYW1fOwotICB9Ci0KLSAgTW9ja0RlbXV4ZXJTdHJlYW0qIHZpZGVvX3N0cmVhbSgpIHsKLSAgICByZXR1cm4gdmlkZW9fc3RyZWFtXzsKLSAgfQotCi0gIHZvaWQgRXhwZWN0U2Vlayhjb25zdCBiYXNlOjpUaW1lRGVsdGEmIHNlZWtfdGltZSkgewotICAgIC8vIEV2ZXJ5IGZpbHRlciBzaG91bGQgcmVjZWl2ZSBhIGNhbGwgdG8gU2VlaygpLgotICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPmRlbXV4ZXIoKSwgU2VlayhzZWVrX3RpbWUsIF8pKQotICAgICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MT4oUElQRUxJTkVfT0spKTsKLSAgICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5kZW11eGVyKCksIFNldFBsYXliYWNrUmF0ZShfKSk7Ci0KLSAgICBpZiAoYXVkaW9fc3RyZWFtXykgewotICAgICAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+YXVkaW9fcmVuZGVyZXIoKSwgUGF1c2UoXykpCi0gICAgICAgICAgLldpbGxPbmNlKFJ1bkNsb3N1cmU8MD4oKSk7Ci0gICAgICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5hdWRpb19yZW5kZXJlcigpLCBGbHVzaChfKSkKLSAgICAgICAgICAuV2lsbE9uY2UoUnVuQ2xvc3VyZTwwPigpKTsKLSAgICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPmF1ZGlvX3JlbmRlcmVyKCksIFByZXJvbGwoc2Vla190aW1lLCBfKSkKLSAgICAgICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MT4oUElQRUxJTkVfT0spKTsKLSAgICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPmF1ZGlvX3JlbmRlcmVyKCksIFNldFBsYXliYWNrUmF0ZShfKSk7Ci0gICAgICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5hdWRpb19yZW5kZXJlcigpLCBTZXRWb2x1bWUoXykpOwotICAgICAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+YXVkaW9fcmVuZGVyZXIoKSwgUGxheShfKSkKLSAgICAgICAgICAuV2lsbE9uY2UoUnVuQ2xvc3VyZTwwPigpKTsKLSAgICB9Ci0KLSAgICBpZiAodmlkZW9fc3RyZWFtXykgewotICAgICAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+dmlkZW9fcmVuZGVyZXIoKSwgUGF1c2UoXykpCi0gICAgICAgICAgLldpbGxPbmNlKFJ1bkNsb3N1cmU8MD4oKSk7Ci0gICAgICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT52aWRlb19yZW5kZXJlcigpLCBGbHVzaChfKSkKLSAgICAgICAgICAuV2lsbE9uY2UoUnVuQ2xvc3VyZTwwPigpKTsKLSAgICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPnZpZGVvX3JlbmRlcmVyKCksIFByZXJvbGwoc2Vla190aW1lLCBfKSkKLSAgICAgICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MT4oUElQRUxJTkVfT0spKTsKLSAgICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPnZpZGVvX3JlbmRlcmVyKCksIFNldFBsYXliYWNrUmF0ZShfKSk7Ci0gICAgICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT52aWRlb19yZW5kZXJlcigpLCBQbGF5KF8pKQotICAgICAgICAgIC5XaWxsT25jZShSdW5DbG9zdXJlPDA+KCkpOwotICAgIH0KLQotICAgIEVYUEVDVF9DQUxMKGNhbGxiYWNrc18sIE9uQnVmZmVyaW5nU3RhdGUoUGlwZWxpbmVJbXBsOjprUHJlcm9sbENvbXBsZXRlZCkpOwotCi0gICAgLy8gV2UgZXhwZWN0IGEgc3VjY2Vzc2Z1bCBzZWVrIGNhbGxiYWNrLgotICAgIEVYUEVDVF9DQUxMKGNhbGxiYWNrc18sIE9uU2VlayhQSVBFTElORV9PSykpOwotICB9Ci0KLSAgdm9pZCBEb1NlZWsoY29uc3QgYmFzZTo6VGltZURlbHRhJiBzZWVrX3RpbWUpIHsKLSAgICBwaXBlbGluZV8tPlNlZWsoc2Vla190aW1lLAotICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKCZDYWxsYmFja0hlbHBlcjo6T25TZWVrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoJmNhbGxiYWNrc18pKSk7Ci0KLSAgICAvLyBXZSBleHBlY3QgdGhlIHRpbWUgdG8gYmUgdXBkYXRlZCBvbmx5IGFmdGVyIHRoZSBzZWVrIGhhcyBjb21wbGV0ZWQuCi0gICAgRVhQRUNUX05FKHNlZWtfdGltZSwgcGlwZWxpbmVfLT5HZXRNZWRpYVRpbWUoKSk7Ci0gICAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLSAgICBFWFBFQ1RfRVEoc2Vla190aW1lLCBwaXBlbGluZV8tPkdldE1lZGlhVGltZSgpKTsKLSAgfQotCi0gIC8vIEZpeHR1cmUgbWVtYmVycy4KLSAgU3RyaWN0TW9jazxDYWxsYmFja0hlbHBlcj4gY2FsbGJhY2tzXzsKLSAgTWVzc2FnZUxvb3AgbWVzc2FnZV9sb29wXzsKLSAgc2NvcGVkX3JlZnB0cjxQaXBlbGluZUltcGw+IHBpcGVsaW5lXzsKLSAgc2NvcGVkX3B0cjxtZWRpYTo6TW9ja0ZpbHRlckNvbGxlY3Rpb24+IG1vY2tzXzsKLSAgc2NvcGVkX3JlZnB0cjxTdHJpY3RNb2NrPE1vY2tEZW11eGVyU3RyZWFtPiA+IGF1ZGlvX3N0cmVhbV87Ci0gIHNjb3BlZF9yZWZwdHI8U3RyaWN0TW9jazxNb2NrRGVtdXhlclN0cmVhbT4gPiB2aWRlb19zdHJlYW1fOwotICBBdWRpb1JlbmRlcmVyOjpUaW1lQ0IgYXVkaW9fdGltZV9jYl87Ci0gIFZpZGVvRGVjb2RlckNvbmZpZyB2aWRlb19kZWNvZGVyX2NvbmZpZ187Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oUGlwZWxpbmVUZXN0KTsKLX07Ci0KLS8vIFRlc3QgdGhhdCBwbGF5YmFjayBjb250cm9scyBtZXRob2RzIG5vLW9wIHdoZW4gdGhlIHBpcGVsaW5lIGhhc24ndCBiZWVuCi0vLyBzdGFydGVkLgotVEVTVF9GKFBpcGVsaW5lVGVzdCwgTm90U3RhcnRlZCkgewotICBjb25zdCBiYXNlOjpUaW1lRGVsdGEga1plcm87Ci0KLSAgRVhQRUNUX0ZBTFNFKHBpcGVsaW5lXy0+SXNSdW5uaW5nKCkpOwotICBFWFBFQ1RfRkFMU0UocGlwZWxpbmVfLT5IYXNBdWRpbygpKTsKLSAgRVhQRUNUX0ZBTFNFKHBpcGVsaW5lXy0+SGFzVmlkZW8oKSk7Ci0KLSAgLy8gU2V0dGluZyBzaG91bGQgc3RpbGwgd29yay4KLSAgRVhQRUNUX0VRKDAuMGYsIHBpcGVsaW5lXy0+R2V0UGxheWJhY2tSYXRlKCkpOwotICBwaXBlbGluZV8tPlNldFBsYXliYWNrUmF0ZSgtMS4wZik7Ci0gIEVYUEVDVF9FUSgwLjBmLCBwaXBlbGluZV8tPkdldFBsYXliYWNrUmF0ZSgpKTsKLSAgcGlwZWxpbmVfLT5TZXRQbGF5YmFja1JhdGUoMS4wZik7Ci0gIEVYUEVDVF9FUSgxLjBmLCBwaXBlbGluZV8tPkdldFBsYXliYWNrUmF0ZSgpKTsKLQotICAvLyBTZXR0aW5nIHNob3VsZCBzdGlsbCB3b3JrLgotICBFWFBFQ1RfRVEoMS4wZiwgcGlwZWxpbmVfLT5HZXRWb2x1bWUoKSk7Ci0gIHBpcGVsaW5lXy0+U2V0Vm9sdW1lKC0xLjBmKTsKLSAgRVhQRUNUX0VRKDEuMGYsIHBpcGVsaW5lXy0+R2V0Vm9sdW1lKCkpOwotICBwaXBlbGluZV8tPlNldFZvbHVtZSgwLjBmKTsKLSAgRVhQRUNUX0VRKDAuMGYsIHBpcGVsaW5lXy0+R2V0Vm9sdW1lKCkpOwotCi0gIEVYUEVDVF9UUlVFKGtaZXJvID09IHBpcGVsaW5lXy0+R2V0TWVkaWFUaW1lKCkpOwotICBFWFBFQ1RfRVEoMHUsIHBpcGVsaW5lXy0+R2V0QnVmZmVyZWRUaW1lUmFuZ2VzKCkuc2l6ZSgpKTsKLSAgRVhQRUNUX1RSVUUoa1plcm8gPT0gcGlwZWxpbmVfLT5HZXRNZWRpYUR1cmF0aW9uKCkpOwotCi0gIEVYUEVDVF9FUSgwLCBwaXBlbGluZV8tPkdldFRvdGFsQnl0ZXMoKSk7Ci0KLSAgLy8gU2hvdWxkIGFsd2F5cyBnZXQgc2V0IHRvIHplcm8uCi0gIGdmeDo6U2l6ZSBzaXplKDEsIDEpOwotICBwaXBlbGluZV8tPkdldE5hdHVyYWxWaWRlb1NpemUoJnNpemUpOwotICBFWFBFQ1RfRVEoMCwgc2l6ZS53aWR0aCgpKTsKLSAgRVhQRUNUX0VRKDAsIHNpemUuaGVpZ2h0KCkpOwotfQotCi1URVNUX0YoUGlwZWxpbmVUZXN0LCBOZXZlckluaXRpYWxpemVzKSB7Ci0gIC8vIERvbid0IGV4ZWN1dGUgdGhlIGNhbGxiYWNrIHBhc3NlZCBpbnRvIEluaXRpYWxpemUoKS4KLSAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+ZGVtdXhlcigpLCBJbml0aWFsaXplKF8sIF8pKTsKLQotICAvLyBUaGlzIHRlc3QgaGFuZ3MgZHVyaW5nIGluaXRpYWxpemF0aW9uIGJ5IG5ldmVyIGNhbGxpbmcKLSAgLy8gSW5pdGlhbGl6YXRpb25Db21wbGV0ZSgpLiAgU3RyaWN0TW9jazw+IHdpbGwgZW5zdXJlIHRoYXQgdGhlIGNhbGxiYWNrIGlzCi0gIC8vIG5ldmVyIGV4ZWN1dGVkLgotICBwaXBlbGluZV8tPlN0YXJ0KAotICAgICAgbW9ja3NfLT5DcmVhdGUoKS5QYXNzKCksIFNldERlY3J5cHRvclJlYWR5Q0IoKSwKLSAgICAgIGJhc2U6OkJpbmQoJkNhbGxiYWNrSGVscGVyOjpPbkVuZGVkLCBiYXNlOjpVbnJldGFpbmVkKCZjYWxsYmFja3NfKSksCi0gICAgICBiYXNlOjpCaW5kKCZDYWxsYmFja0hlbHBlcjo6T25FcnJvciwgYmFzZTo6VW5yZXRhaW5lZCgmY2FsbGJhY2tzXykpLAotICAgICAgYmFzZTo6QmluZCgmQ2FsbGJhY2tIZWxwZXI6Ok9uU3RhcnQsIGJhc2U6OlVucmV0YWluZWQoJmNhbGxiYWNrc18pKSwKLSAgICAgIGJhc2U6OkJpbmQoJkNhbGxiYWNrSGVscGVyOjpPbkJ1ZmZlcmluZ1N0YXRlLAotICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKCZjYWxsYmFja3NfKSksCi0gICAgICBiYXNlOjpDbG9zdXJlKCkpOwotICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotCi0KLSAgLy8gQmVjYXVzZSBvdXIgY2FsbGJhY2sgd2lsbCBnZXQgZXhlY3V0ZWQgd2hlbiB0aGUgdGVzdCB0ZWFycyBkb3duLCB3ZSdsbAotICAvLyB2ZXJpZnkgdGhhdCBub3RoaW5nIGhhcyBiZWVuIGNhbGxlZCwgdGhlbiBzZXQgb3VyIGV4cGVjdGF0aW9uIGZvciB0aGUgY2FsbAotICAvLyBtYWRlIGR1cmluZyB0ZWFyIGRvd24uCi0gIE1vY2s6OlZlcmlmeUFuZENsZWFyKCZjYWxsYmFja3NfKTsKLSAgRVhQRUNUX0NBTEwoY2FsbGJhY2tzXywgT25TdGFydChQSVBFTElORV9PSykpOwotfQotCi1URVNUX0YoUGlwZWxpbmVUZXN0LCBVUkxOb3RGb3VuZCkgewotICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5kZW11eGVyKCksIEluaXRpYWxpemUoXywgXykpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MT4oUElQRUxJTkVfRVJST1JfVVJMX05PVF9GT1VORCkpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5kZW11eGVyKCksIFN0b3AoXykpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2xvc3VyZTwwPigpKTsKLQotICBJbml0aWFsaXplUGlwZWxpbmUoUElQRUxJTkVfRVJST1JfVVJMX05PVF9GT1VORCk7Ci19Ci0KLVRFU1RfRihQaXBlbGluZVRlc3QsIE5vU3RyZWFtcykgewotICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5kZW11eGVyKCksIEluaXRpYWxpemUoXywgXykpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MT4oUElQRUxJTkVfT0spKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+ZGVtdXhlcigpLCBTdG9wKF8pKQotICAgICAgLldpbGxPbmNlKFJ1bkNsb3N1cmU8MD4oKSk7Ci0KLSAgSW5pdGlhbGl6ZVBpcGVsaW5lKFBJUEVMSU5FX0VSUk9SX0NPVUxEX05PVF9SRU5ERVIpOwotfQotCi1URVNUX0YoUGlwZWxpbmVUZXN0LCBBdWRpb1N0cmVhbSkgewotICBDcmVhdGVBdWRpb1N0cmVhbSgpOwotICBNb2NrRGVtdXhlclN0cmVhbVZlY3RvciBzdHJlYW1zOwotICBzdHJlYW1zLnB1c2hfYmFjayhhdWRpb19zdHJlYW0oKSk7Ci0KLSAgSW5pdGlhbGl6ZURlbXV4ZXIoJnN0cmVhbXMpOwotICBJbml0aWFsaXplQXVkaW9SZW5kZXJlcihhdWRpb19zdHJlYW0oKSwgZmFsc2UpOwotCi0gIEluaXRpYWxpemVQaXBlbGluZShQSVBFTElORV9PSyk7Ci0gIEVYUEVDVF9UUlVFKHBpcGVsaW5lXy0+SGFzQXVkaW8oKSk7Ci0gIEVYUEVDVF9GQUxTRShwaXBlbGluZV8tPkhhc1ZpZGVvKCkpOwotfQotCi1URVNUX0YoUGlwZWxpbmVUZXN0LCBWaWRlb1N0cmVhbSkgewotICBDcmVhdGVWaWRlb1N0cmVhbSgpOwotICBNb2NrRGVtdXhlclN0cmVhbVZlY3RvciBzdHJlYW1zOwotICBzdHJlYW1zLnB1c2hfYmFjayh2aWRlb19zdHJlYW0oKSk7Ci0KLSAgSW5pdGlhbGl6ZURlbXV4ZXIoJnN0cmVhbXMpOwotICBJbml0aWFsaXplVmlkZW9SZW5kZXJlcih2aWRlb19zdHJlYW0oKSk7Ci0KLSAgSW5pdGlhbGl6ZVBpcGVsaW5lKFBJUEVMSU5FX09LKTsKLSAgRVhQRUNUX0ZBTFNFKHBpcGVsaW5lXy0+SGFzQXVkaW8oKSk7Ci0gIEVYUEVDVF9UUlVFKHBpcGVsaW5lXy0+SGFzVmlkZW8oKSk7Ci19Ci0KLVRFU1RfRihQaXBlbGluZVRlc3QsIEF1ZGlvVmlkZW9TdHJlYW0pIHsKLSAgQ3JlYXRlQXVkaW9TdHJlYW0oKTsKLSAgQ3JlYXRlVmlkZW9TdHJlYW0oKTsKLSAgTW9ja0RlbXV4ZXJTdHJlYW1WZWN0b3Igc3RyZWFtczsKLSAgc3RyZWFtcy5wdXNoX2JhY2soYXVkaW9fc3RyZWFtKCkpOwotICBzdHJlYW1zLnB1c2hfYmFjayh2aWRlb19zdHJlYW0oKSk7Ci0KLSAgSW5pdGlhbGl6ZURlbXV4ZXIoJnN0cmVhbXMpOwotICBJbml0aWFsaXplQXVkaW9SZW5kZXJlcihhdWRpb19zdHJlYW0oKSwgZmFsc2UpOwotICBJbml0aWFsaXplVmlkZW9SZW5kZXJlcih2aWRlb19zdHJlYW0oKSk7Ci0KLSAgSW5pdGlhbGl6ZVBpcGVsaW5lKFBJUEVMSU5FX09LKTsKLSAgRVhQRUNUX1RSVUUocGlwZWxpbmVfLT5IYXNBdWRpbygpKTsKLSAgRVhQRUNUX1RSVUUocGlwZWxpbmVfLT5IYXNWaWRlbygpKTsKLX0KLQotVEVTVF9GKFBpcGVsaW5lVGVzdCwgU2VlaykgewotICBDcmVhdGVBdWRpb1N0cmVhbSgpOwotICBDcmVhdGVWaWRlb1N0cmVhbSgpOwotICBNb2NrRGVtdXhlclN0cmVhbVZlY3RvciBzdHJlYW1zOwotICBzdHJlYW1zLnB1c2hfYmFjayhhdWRpb19zdHJlYW0oKSk7Ci0gIHN0cmVhbXMucHVzaF9iYWNrKHZpZGVvX3N0cmVhbSgpKTsKLQotICBJbml0aWFsaXplRGVtdXhlcigmc3RyZWFtcywgYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcygzMDAwKSk7Ci0gIEluaXRpYWxpemVBdWRpb1JlbmRlcmVyKGF1ZGlvX3N0cmVhbSgpLCBmYWxzZSk7Ci0gIEluaXRpYWxpemVWaWRlb1JlbmRlcmVyKHZpZGVvX3N0cmVhbSgpKTsKLQotICAvLyBJbml0aWFsaXplIHRoZW4gc2VlayEKLSAgSW5pdGlhbGl6ZVBpcGVsaW5lKFBJUEVMSU5FX09LKTsKLQotICAvLyBFdmVyeSBmaWx0ZXIgc2hvdWxkIHJlY2VpdmUgYSBjYWxsIHRvIFNlZWsoKS4KLSAgYmFzZTo6VGltZURlbHRhIGV4cGVjdGVkID0gYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcygyMDAwKTsKLSAgRXhwZWN0U2VlayhleHBlY3RlZCk7Ci0gIERvU2VlayhleHBlY3RlZCk7Ci19Ci0KLVRFU1RfRihQaXBlbGluZVRlc3QsIFNldFZvbHVtZSkgewotICBDcmVhdGVBdWRpb1N0cmVhbSgpOwotICBNb2NrRGVtdXhlclN0cmVhbVZlY3RvciBzdHJlYW1zOwotICBzdHJlYW1zLnB1c2hfYmFjayhhdWRpb19zdHJlYW0oKSk7Ci0KLSAgSW5pdGlhbGl6ZURlbXV4ZXIoJnN0cmVhbXMpOwotICBJbml0aWFsaXplQXVkaW9SZW5kZXJlcihhdWRpb19zdHJlYW0oKSwgZmFsc2UpOwotCi0gIC8vIFRoZSBhdWRpbyByZW5kZXJlciBzaG91bGQgcmVjZWl2ZSBhIGNhbGwgdG8gU2V0Vm9sdW1lKCkuCi0gIGZsb2F0IGV4cGVjdGVkID0gMC41ZjsKLSAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+YXVkaW9fcmVuZGVyZXIoKSwgU2V0Vm9sdW1lKGV4cGVjdGVkKSk7Ci0KLSAgLy8gSW5pdGlhbGl6ZSB0aGVuIHNldCB2b2x1bWUhCi0gIEluaXRpYWxpemVQaXBlbGluZShQSVBFTElORV9PSyk7Ci0gIHBpcGVsaW5lXy0+U2V0Vm9sdW1lKGV4cGVjdGVkKTsKLX0KLQotVEVTVF9GKFBpcGVsaW5lVGVzdCwgUHJvcGVydGllcykgewotICBDcmVhdGVWaWRlb1N0cmVhbSgpOwotICBNb2NrRGVtdXhlclN0cmVhbVZlY3RvciBzdHJlYW1zOwotICBzdHJlYW1zLnB1c2hfYmFjayh2aWRlb19zdHJlYW0oKSk7Ci0KLSAgY29uc3QgYmFzZTo6VGltZURlbHRhIGtEdXJhdGlvbiA9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoMTAwKTsKLSAgSW5pdGlhbGl6ZURlbXV4ZXIoJnN0cmVhbXMsIGtEdXJhdGlvbik7Ci0gIEluaXRpYWxpemVWaWRlb1JlbmRlcmVyKHZpZGVvX3N0cmVhbSgpKTsKLQotICBJbml0aWFsaXplUGlwZWxpbmUoUElQRUxJTkVfT0spOwotICBFWFBFQ1RfRVEoa0R1cmF0aW9uLlRvSW50ZXJuYWxWYWx1ZSgpLAotICAgICAgICAgICAgcGlwZWxpbmVfLT5HZXRNZWRpYUR1cmF0aW9uKCkuVG9JbnRlcm5hbFZhbHVlKCkpOwotICBFWFBFQ1RfRVEoa1RvdGFsQnl0ZXMsIHBpcGVsaW5lXy0+R2V0VG90YWxCeXRlcygpKTsKLSAgRVhQRUNUX0ZBTFNFKHBpcGVsaW5lXy0+RGlkTG9hZGluZ1Byb2dyZXNzKCkpOwotfQotCi1URVNUX0YoUGlwZWxpbmVUZXN0LCBHZXRCdWZmZXJlZFRpbWVSYW5nZXMpIHsKLSAgQ3JlYXRlVmlkZW9TdHJlYW0oKTsKLSAgTW9ja0RlbXV4ZXJTdHJlYW1WZWN0b3Igc3RyZWFtczsKLSAgc3RyZWFtcy5wdXNoX2JhY2sodmlkZW9fc3RyZWFtKCkpOwotCi0gIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSBrRHVyYXRpb24gPSBiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKDEwMCk7Ci0gIEluaXRpYWxpemVEZW11eGVyKCZzdHJlYW1zLCBrRHVyYXRpb24pOwotICBJbml0aWFsaXplVmlkZW9SZW5kZXJlcih2aWRlb19zdHJlYW0oKSk7Ci0KLSAgSW5pdGlhbGl6ZVBpcGVsaW5lKFBJUEVMSU5FX09LKTsKLQotICBFWFBFQ1RfRVEoMHUsIHBpcGVsaW5lXy0+R2V0QnVmZmVyZWRUaW1lUmFuZ2VzKCkuc2l6ZSgpKTsKLQotICBFWFBFQ1RfRkFMU0UocGlwZWxpbmVfLT5EaWRMb2FkaW5nUHJvZ3Jlc3MoKSk7Ci0gIHBpcGVsaW5lXy0+QWRkQnVmZmVyZWRCeXRlUmFuZ2UoMCwga1RvdGFsQnl0ZXMgLyA4KTsKLSAgRVhQRUNUX1RSVUUocGlwZWxpbmVfLT5EaWRMb2FkaW5nUHJvZ3Jlc3MoKSk7Ci0gIEVYUEVDVF9GQUxTRShwaXBlbGluZV8tPkRpZExvYWRpbmdQcm9ncmVzcygpKTsKLSAgRVhQRUNUX0VRKDF1LCBwaXBlbGluZV8tPkdldEJ1ZmZlcmVkVGltZVJhbmdlcygpLnNpemUoKSk7Ci0gIEVYUEVDVF9FUShiYXNlOjpUaW1lRGVsdGEoKSwgcGlwZWxpbmVfLT5HZXRCdWZmZXJlZFRpbWVSYW5nZXMoKS5zdGFydCgwKSk7Ci0gIEVYUEVDVF9FUShrRHVyYXRpb24gLyA4LCBwaXBlbGluZV8tPkdldEJ1ZmZlcmVkVGltZVJhbmdlcygpLmVuZCgwKSk7Ci0gIHBpcGVsaW5lXy0+QWRkQnVmZmVyZWRUaW1lUmFuZ2UoYmFzZTo6VGltZURlbHRhKCksIGtEdXJhdGlvbiAvIDgpOwotICBFWFBFQ1RfRVEoYmFzZTo6VGltZURlbHRhKCksIHBpcGVsaW5lXy0+R2V0QnVmZmVyZWRUaW1lUmFuZ2VzKCkuc3RhcnQoMCkpOwotICBFWFBFQ1RfRVEoa0R1cmF0aW9uIC8gOCwgcGlwZWxpbmVfLT5HZXRCdWZmZXJlZFRpbWVSYW5nZXMoKS5lbmQoMCkpOwotCi0gIGJhc2U6OlRpbWVEZWx0YSBrU2Vla1RpbWUgPSBrRHVyYXRpb24gLyAyOwotICBFeHBlY3RTZWVrKGtTZWVrVGltZSk7Ci0gIERvU2VlayhrU2Vla1RpbWUpOwotCi0gIEVYUEVDVF9UUlVFKHBpcGVsaW5lXy0+RGlkTG9hZGluZ1Byb2dyZXNzKCkpOwotICBFWFBFQ1RfRkFMU0UocGlwZWxpbmVfLT5EaWRMb2FkaW5nUHJvZ3Jlc3MoKSk7Ci0gIHBpcGVsaW5lXy0+QWRkQnVmZmVyZWRCeXRlUmFuZ2Uoa1RvdGFsQnl0ZXMgLyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUb3RhbEJ5dGVzIC8gMiArIGtUb3RhbEJ5dGVzIC8gOCk7Ci0gIEVYUEVDVF9UUlVFKHBpcGVsaW5lXy0+RGlkTG9hZGluZ1Byb2dyZXNzKCkpOwotICBFWFBFQ1RfRkFMU0UocGlwZWxpbmVfLT5EaWRMb2FkaW5nUHJvZ3Jlc3MoKSk7Ci0gIEVYUEVDVF9FUSgydSwgcGlwZWxpbmVfLT5HZXRCdWZmZXJlZFRpbWVSYW5nZXMoKS5zaXplKCkpOwotICBFWFBFQ1RfRVEoYmFzZTo6VGltZURlbHRhKCksIHBpcGVsaW5lXy0+R2V0QnVmZmVyZWRUaW1lUmFuZ2VzKCkuc3RhcnQoMCkpOwotICBFWFBFQ1RfRVEoa0R1cmF0aW9uIC8gOCwgcGlwZWxpbmVfLT5HZXRCdWZmZXJlZFRpbWVSYW5nZXMoKS5lbmQoMCkpOwotICBFWFBFQ1RfRVEoa0R1cmF0aW9uIC8gMiwgcGlwZWxpbmVfLT5HZXRCdWZmZXJlZFRpbWVSYW5nZXMoKS5zdGFydCgxKSk7Ci0gIEVYUEVDVF9FUShrRHVyYXRpb24gLyAyICsga0R1cmF0aW9uIC8gOCwKLSAgICAgICAgICAgIHBpcGVsaW5lXy0+R2V0QnVmZmVyZWRUaW1lUmFuZ2VzKCkuZW5kKDEpKTsKLQotICBwaXBlbGluZV8tPkFkZEJ1ZmZlcmVkVGltZVJhbmdlKGtEdXJhdGlvbiAvIDQsIDMgKiBrRHVyYXRpb24gLyA4KTsKLSAgRVhQRUNUX0VRKGJhc2U6OlRpbWVEZWx0YSgpLCBwaXBlbGluZV8tPkdldEJ1ZmZlcmVkVGltZVJhbmdlcygpLnN0YXJ0KDApKTsKLSAgRVhQRUNUX0VRKGtEdXJhdGlvbiAvIDgsIHBpcGVsaW5lXy0+R2V0QnVmZmVyZWRUaW1lUmFuZ2VzKCkuZW5kKDApKTsKLSAgRVhQRUNUX0VRKGtEdXJhdGlvbiAvIDQsIHBpcGVsaW5lXy0+R2V0QnVmZmVyZWRUaW1lUmFuZ2VzKCkuc3RhcnQoMSkpOwotICBFWFBFQ1RfRVEoMyoga0R1cmF0aW9uIC8gOCwgcGlwZWxpbmVfLT5HZXRCdWZmZXJlZFRpbWVSYW5nZXMoKS5lbmQoMSkpOwotICBFWFBFQ1RfRVEoa0R1cmF0aW9uIC8gMiwgcGlwZWxpbmVfLT5HZXRCdWZmZXJlZFRpbWVSYW5nZXMoKS5zdGFydCgyKSk7Ci0gIEVYUEVDVF9FUShrRHVyYXRpb24gLyAyICsga0R1cmF0aW9uIC8gOCwKLSAgICAgICAgICAgIHBpcGVsaW5lXy0+R2V0QnVmZmVyZWRUaW1lUmFuZ2VzKCkuZW5kKDIpKTsKLX0KLQotVEVTVF9GKFBpcGVsaW5lVGVzdCwgRGlzYWJsZUF1ZGlvUmVuZGVyZXIpIHsKLSAgQ3JlYXRlQXVkaW9TdHJlYW0oKTsKLSAgQ3JlYXRlVmlkZW9TdHJlYW0oKTsKLSAgTW9ja0RlbXV4ZXJTdHJlYW1WZWN0b3Igc3RyZWFtczsKLSAgc3RyZWFtcy5wdXNoX2JhY2soYXVkaW9fc3RyZWFtKCkpOwotICBzdHJlYW1zLnB1c2hfYmFjayh2aWRlb19zdHJlYW0oKSk7Ci0KLSAgSW5pdGlhbGl6ZURlbXV4ZXIoJnN0cmVhbXMpOwotICBJbml0aWFsaXplQXVkaW9SZW5kZXJlcihhdWRpb19zdHJlYW0oKSwgZmFsc2UpOwotICBJbml0aWFsaXplVmlkZW9SZW5kZXJlcih2aWRlb19zdHJlYW0oKSk7Ci0KLSAgSW5pdGlhbGl6ZVBpcGVsaW5lKFBJUEVMSU5FX09LKTsKLSAgRVhQRUNUX1RSVUUocGlwZWxpbmVfLT5IYXNBdWRpbygpKTsKLSAgRVhQRUNUX1RSVUUocGlwZWxpbmVfLT5IYXNWaWRlbygpKTsKLQotICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5kZW11eGVyKCksIE9uQXVkaW9SZW5kZXJlckRpc2FibGVkKCkpOwotICBwaXBlbGluZV8tPk9uQXVkaW9EaXNhYmxlZCgpOwotCi0gIC8vIFZlcmlmeSB0aGF0IGVuZGVkIGV2ZW50IGlzIGZpcmVkIHdoZW4gdmlkZW8gZW5kcy4KLSAgRVhQRUNUX0NBTEwoY2FsbGJhY2tzXywgT25FbmRlZChQSVBFTElORV9PSykpOwotICBwaXBlbGluZV8tPk9uVmlkZW9SZW5kZXJlckVuZGVkKCk7Ci19Ci0KLVRFU1RfRihQaXBlbGluZVRlc3QsIERpc2FibGVBdWRpb1JlbmRlcmVyRHVyaW5nSW5pdCkgewotICBDcmVhdGVBdWRpb1N0cmVhbSgpOwotICBDcmVhdGVWaWRlb1N0cmVhbSgpOwotICBNb2NrRGVtdXhlclN0cmVhbVZlY3RvciBzdHJlYW1zOwotICBzdHJlYW1zLnB1c2hfYmFjayhhdWRpb19zdHJlYW0oKSk7Ci0gIHN0cmVhbXMucHVzaF9iYWNrKHZpZGVvX3N0cmVhbSgpKTsKLQotICBJbml0aWFsaXplRGVtdXhlcigmc3RyZWFtcyk7Ci0gIEluaXRpYWxpemVBdWRpb1JlbmRlcmVyKGF1ZGlvX3N0cmVhbSgpLCB0cnVlKTsKLSAgSW5pdGlhbGl6ZVZpZGVvUmVuZGVyZXIodmlkZW9fc3RyZWFtKCkpOwotCi0gIEVYUEVDVF9DQUxMKCptb2Nrc18tPmRlbXV4ZXIoKSwKLSAgICAgICAgICAgICAgT25BdWRpb1JlbmRlcmVyRGlzYWJsZWQoKSk7Ci0KLSAgSW5pdGlhbGl6ZVBpcGVsaW5lKFBJUEVMSU5FX09LKTsKLSAgRVhQRUNUX0ZBTFNFKHBpcGVsaW5lXy0+SGFzQXVkaW8oKSk7Ci0gIEVYUEVDVF9UUlVFKHBpcGVsaW5lXy0+SGFzVmlkZW8oKSk7Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgZW5kZWQgZXZlbnQgaXMgZmlyZWQgd2hlbiB2aWRlbyBlbmRzLgotICBFWFBFQ1RfQ0FMTChjYWxsYmFja3NfLCBPbkVuZGVkKFBJUEVMSU5FX09LKSk7Ci0gIHBpcGVsaW5lXy0+T25WaWRlb1JlbmRlcmVyRW5kZWQoKTsKLX0KLQotVEVTVF9GKFBpcGVsaW5lVGVzdCwgRW5kZWRDYWxsYmFjaykgewotICBDcmVhdGVBdWRpb1N0cmVhbSgpOwotICBDcmVhdGVWaWRlb1N0cmVhbSgpOwotICBNb2NrRGVtdXhlclN0cmVhbVZlY3RvciBzdHJlYW1zOwotICBzdHJlYW1zLnB1c2hfYmFjayhhdWRpb19zdHJlYW0oKSk7Ci0gIHN0cmVhbXMucHVzaF9iYWNrKHZpZGVvX3N0cmVhbSgpKTsKLQotICBJbml0aWFsaXplRGVtdXhlcigmc3RyZWFtcyk7Ci0gIEluaXRpYWxpemVBdWRpb1JlbmRlcmVyKGF1ZGlvX3N0cmVhbSgpLCBmYWxzZSk7Ci0gIEluaXRpYWxpemVWaWRlb1JlbmRlcmVyKHZpZGVvX3N0cmVhbSgpKTsKLSAgSW5pdGlhbGl6ZVBpcGVsaW5lKFBJUEVMSU5FX09LKTsKLQotICAvLyBUaGUgZW5kZWQgY2FsbGJhY2sgc2hvdWxkbid0IHJ1biB1bnRpbCBib3RoIHJlbmRlcmVycyBoYXZlIGVuZGVkLgotICBwaXBlbGluZV8tPk9uQXVkaW9SZW5kZXJlckVuZGVkKCk7Ci0gIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci0KLSAgRVhQRUNUX0NBTEwoY2FsbGJhY2tzXywgT25FbmRlZChQSVBFTElORV9PSykpOwotICBwaXBlbGluZV8tPk9uVmlkZW9SZW5kZXJlckVuZGVkKCk7Ci0gIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci19Ci0KLS8vIFN0YXRpYyBmdW5jdGlvbiAmIHRpbWUgdmFyaWFibGUgdXNlZCB0byBzaW11bGF0ZSBjaGFuZ2VzIGluIHdhbGxjbG9jayB0aW1lLgotc3RhdGljIGludDY0IGdfc3RhdGljX2Nsb2NrX3RpbWU7Ci1zdGF0aWMgYmFzZTo6VGltZSBTdGF0aWNDbG9ja0Z1bmN0aW9uKCkgewotICByZXR1cm4gYmFzZTo6VGltZTo6RnJvbUludGVybmFsVmFsdWUoZ19zdGF0aWNfY2xvY2tfdGltZSk7Ci19Ci0KLVRFU1RfRihQaXBlbGluZVRlc3QsIEF1ZGlvU3RyZWFtU2hvcnRlclRoYW5WaWRlbykgewotICBiYXNlOjpUaW1lRGVsdGEgZHVyYXRpb24gPSBiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKDEwKTsKLQotICBDcmVhdGVBdWRpb1N0cmVhbSgpOwotICBDcmVhdGVWaWRlb1N0cmVhbSgpOwotICBNb2NrRGVtdXhlclN0cmVhbVZlY3RvciBzdHJlYW1zOwotICBzdHJlYW1zLnB1c2hfYmFjayhhdWRpb19zdHJlYW0oKSk7Ci0gIHN0cmVhbXMucHVzaF9iYWNrKHZpZGVvX3N0cmVhbSgpKTsKLQotICAvLyBSZXBsYWNlIHRoZSBjbG9jayBzbyB3ZSBjYW4gc2ltdWxhdGUgd2FsbGNsb2NrIHRpbWUgYWR2YW5jaW5nIHcvbyB1c2luZwotICAvLyBTbGVlcCgpLgotICBwaXBlbGluZV8tPlNldENsb2NrRm9yVGVzdGluZyhuZXcgQ2xvY2soJlN0YXRpY0Nsb2NrRnVuY3Rpb24pKTsKLQotICBJbml0aWFsaXplRGVtdXhlcigmc3RyZWFtcywgZHVyYXRpb24pOwotICBJbml0aWFsaXplQXVkaW9SZW5kZXJlcihhdWRpb19zdHJlYW0oKSwgZmFsc2UpOwotICBJbml0aWFsaXplVmlkZW9SZW5kZXJlcih2aWRlb19zdHJlYW0oKSk7Ci0gIEluaXRpYWxpemVQaXBlbGluZShQSVBFTElORV9PSyk7Ci0KLSAgRVhQRUNUX0VRKDAsIHBpcGVsaW5lXy0+R2V0TWVkaWFUaW1lKCkuVG9JbnRlcm5hbFZhbHVlKCkpOwotCi0gIGZsb2F0IHBsYXliYWNrX3JhdGUgPSAxLjBmOwotICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5kZW11eGVyKCksIFNldFBsYXliYWNrUmF0ZShwbGF5YmFja19yYXRlKSk7Ci0gIEVYUEVDVF9DQUxMKCptb2Nrc18tPnZpZGVvX3JlbmRlcmVyKCksIFNldFBsYXliYWNrUmF0ZShwbGF5YmFja19yYXRlKSk7Ci0gIEVYUEVDVF9DQUxMKCptb2Nrc18tPmF1ZGlvX3JlbmRlcmVyKCksIFNldFBsYXliYWNrUmF0ZShwbGF5YmFja19yYXRlKSk7Ci0gIHBpcGVsaW5lXy0+U2V0UGxheWJhY2tSYXRlKHBsYXliYWNrX3JhdGUpOwotICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotCi0gIEluU2VxdWVuY2UgczsKLQotICAvLyBWZXJpZnkgdGhhdCB0aGUgY2xvY2sgZG9lc24ndCBhZHZhbmNlIHNpbmNlIGl0IGhhc24ndCBiZWVuIHN0YXJ0ZWQgYnkKLSAgLy8gYSB0aW1lIHVwZGF0ZSBmcm9tIHRoZSBhdWRpbyBzdHJlYW0uCi0gIGludDY0IHN0YXJ0X3RpbWUgPSBwaXBlbGluZV8tPkdldE1lZGlhVGltZSgpLlRvSW50ZXJuYWxWYWx1ZSgpOwotICBnX3N0YXRpY19jbG9ja190aW1lICs9Ci0gICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMTAwKS5Ub0ludGVybmFsVmFsdWUoKTsKLSAgRVhQRUNUX0VRKHBpcGVsaW5lXy0+R2V0TWVkaWFUaW1lKCkuVG9JbnRlcm5hbFZhbHVlKCksIHN0YXJ0X3RpbWUpOwotCi0gIC8vIFNpZ25hbCBlbmQgb2YgYXVkaW8gc3RyZWFtLgotICBwaXBlbGluZV8tPk9uQXVkaW9SZW5kZXJlckVuZGVkKCk7Ci0gIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNsb2NrIGFkdmFuY2VzLgotICBzdGFydF90aW1lID0gcGlwZWxpbmVfLT5HZXRNZWRpYVRpbWUoKS5Ub0ludGVybmFsVmFsdWUoKTsKLSAgZ19zdGF0aWNfY2xvY2tfdGltZSArPQotICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDEwMCkuVG9JbnRlcm5hbFZhbHVlKCk7Ci0gIEVYUEVDVF9HVChwaXBlbGluZV8tPkdldE1lZGlhVGltZSgpLlRvSW50ZXJuYWxWYWx1ZSgpLCBzdGFydF90aW1lKTsKLQotICAvLyBTaWduYWwgZW5kIG9mIHZpZGVvIHN0cmVhbSBhbmQgbWFrZSBzdXJlIE9uRW5kZWQoKSBjYWxsYmFjayBvY2N1cnMuCi0gIEVYUEVDVF9DQUxMKGNhbGxiYWNrc18sIE9uRW5kZWQoUElQRUxJTkVfT0spKTsKLSAgcGlwZWxpbmVfLT5PblZpZGVvUmVuZGVyZXJFbmRlZCgpOwotfQotCi1URVNUX0YoUGlwZWxpbmVUZXN0LCBFcnJvckR1cmluZ1NlZWspIHsKLSAgQ3JlYXRlQXVkaW9TdHJlYW0oKTsKLSAgTW9ja0RlbXV4ZXJTdHJlYW1WZWN0b3Igc3RyZWFtczsKLSAgc3RyZWFtcy5wdXNoX2JhY2soYXVkaW9fc3RyZWFtKCkpOwotCi0gIEluaXRpYWxpemVEZW11eGVyKCZzdHJlYW1zKTsKLSAgSW5pdGlhbGl6ZUF1ZGlvUmVuZGVyZXIoYXVkaW9fc3RyZWFtKCksIGZhbHNlKTsKLSAgSW5pdGlhbGl6ZVBpcGVsaW5lKFBJUEVMSU5FX09LKTsKLQotICBmbG9hdCBwbGF5YmFja19yYXRlID0gMS4wZjsKLSAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+ZGVtdXhlcigpLCBTZXRQbGF5YmFja1JhdGUocGxheWJhY2tfcmF0ZSkpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5hdWRpb19yZW5kZXJlcigpLCBTZXRQbGF5YmFja1JhdGUocGxheWJhY2tfcmF0ZSkpOwotICBwaXBlbGluZV8tPlNldFBsYXliYWNrUmF0ZShwbGF5YmFja19yYXRlKTsKLSAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLQotICBiYXNlOjpUaW1lRGVsdGEgc2Vla190aW1lID0gYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcyg1KTsKLQotICAvLyBQcmVyb2xsKCkgaXNuJ3QgY2FsbGVkIGFzIHRoZSBkZW11eGVyIGVycm9ycyBvdXQgZmlyc3QuCi0gIEVYUEVDVF9DQUxMKCptb2Nrc18tPmF1ZGlvX3JlbmRlcmVyKCksIFBhdXNlKF8pKQotICAgICAgLldpbGxPbmNlKFJ1bkNsb3N1cmU8MD4oKSk7Ci0gIEVYUEVDVF9DQUxMKCptb2Nrc18tPmF1ZGlvX3JlbmRlcmVyKCksIEZsdXNoKF8pKQotICAgICAgLldpbGxPbmNlKFJ1bkNsb3N1cmU8MD4oKSk7Ci0gIEVYUEVDVF9DQUxMKCptb2Nrc18tPmF1ZGlvX3JlbmRlcmVyKCksIFN0b3AoXykpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2xvc3VyZTwwPigpKTsKLQotICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5kZW11eGVyKCksIFNlZWsoc2Vla190aW1lLCBfKSkKLSAgICAgIC5XaWxsT25jZShSdW5DYWxsYmFjazwxPihQSVBFTElORV9FUlJPUl9SRUFEKSk7Ci0gIEVYUEVDVF9DQUxMKCptb2Nrc18tPmRlbXV4ZXIoKSwgU3RvcChfKSkKLSAgICAgIC5XaWxsT25jZShSdW5DbG9zdXJlPDA+KCkpOwotCi0gIHBpcGVsaW5lXy0+U2VlayhzZWVrX3RpbWUsIGJhc2U6OkJpbmQoJkNhbGxiYWNrSGVscGVyOjpPblNlZWssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCgmY2FsbGJhY2tzXykpKTsKLSAgRVhQRUNUX0NBTEwoY2FsbGJhY2tzXywgT25TZWVrKFBJUEVMSU5FX0VSUk9SX1JFQUQpKTsKLSAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLX0KLQotLy8gSW52b2tlZCBmdW5jdGlvbiBPbkVycm9yLiBUaGlzIGFzc2VydHMgdGhhdCB0aGUgcGlwZWxpbmUgZG9lcyBub3QgZW5xdWV1ZQotLy8gbm9uLXRlYXJkb3duIHJlbGF0ZWQgdGFza3Mgd2hpbGUgdGVhcmluZyBkb3duLgotc3RhdGljIHZvaWQgVGVzdE5vQ2FsbHNBZnRlckVycm9yKFBpcGVsaW5lSW1wbCogcGlwZWxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxvb3AqIG1lc3NhZ2VfbG9vcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXBlbGluZVN0YXR1cyAvKiBzdGF0dXMgKi8pIHsKLSAgQ0hFQ0socGlwZWxpbmUpOwotICBDSEVDSyhtZXNzYWdlX2xvb3ApOwotCi0gIC8vIFdoZW4gd2UgZ2V0IHRvIHRoaXMgc3RhZ2UsIHRoZSBtZXNzYWdlIGxvb3Agc2hvdWxkIGJlIGVtcHR5LgotICBtZXNzYWdlX2xvb3AtPkFzc2VydElkbGUoKTsKLQotICAvLyBNYWtlIGNhbGxzIG9uIHBpcGVsaW5lIGFmdGVyIGVycm9yIGhhcyBvY2N1cnJlZC4KLSAgcGlwZWxpbmUtPlNldFBsYXliYWNrUmF0ZSgwLjVmKTsKLSAgcGlwZWxpbmUtPlNldFZvbHVtZSgwLjVmKTsKLQotICAvLyBObyBhZGRpdGlvbmFsIHRhc2tzIHNob3VsZCBiZSBxdWV1ZWQgYXMgYSByZXN1bHQgb2YgdGhlc2UgY2FsbHMuCi0gIG1lc3NhZ2VfbG9vcC0+QXNzZXJ0SWRsZSgpOwotfQotCi1URVNUX0YoUGlwZWxpbmVUZXN0LCBOb01lc3NhZ2VEdXJpbmdUZWFyRG93bkZyb21FcnJvcikgewotICBDcmVhdGVBdWRpb1N0cmVhbSgpOwotICBNb2NrRGVtdXhlclN0cmVhbVZlY3RvciBzdHJlYW1zOwotICBzdHJlYW1zLnB1c2hfYmFjayhhdWRpb19zdHJlYW0oKSk7Ci0KLSAgSW5pdGlhbGl6ZURlbXV4ZXIoJnN0cmVhbXMpOwotICBJbml0aWFsaXplQXVkaW9SZW5kZXJlcihhdWRpb19zdHJlYW0oKSwgZmFsc2UpOwotICBJbml0aWFsaXplUGlwZWxpbmUoUElQRUxJTkVfT0spOwotCi0gIC8vIFRyaWdnZXIgYWRkaXRpb25hbCByZXF1ZXN0cyBvbiB0aGUgcGlwZWxpbmUgZHVyaW5nIHRlYXIgZG93biBmcm9tIGVycm9yLgotICBiYXNlOjpDYWxsYmFjazx2b2lkKFBpcGVsaW5lU3RhdHVzKT4gY2IgPSBiYXNlOjpCaW5kKAotICAgICAgJlRlc3ROb0NhbGxzQWZ0ZXJFcnJvciwgcGlwZWxpbmVfLCAmbWVzc2FnZV9sb29wXyk7Ci0gIE9OX0NBTEwoY2FsbGJhY2tzXywgT25FcnJvcihfKSkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KEludm9rZSgmY2IsICZiYXNlOjpDYWxsYmFjazx2b2lkKFBpcGVsaW5lU3RhdHVzKT46OlJ1bikpOwotCi0gIGJhc2U6OlRpbWVEZWx0YSBzZWVrX3RpbWUgPSBiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKDUpOwotCi0gIC8vIFNlZWsoKSBpc24ndCBjYWxsZWQgYXMgdGhlIGRlbXV4ZXIgZXJyb3JzIG91dCBmaXJzdC4KLSAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+YXVkaW9fcmVuZGVyZXIoKSwgUGF1c2UoXykpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2xvc3VyZTwwPigpKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+YXVkaW9fcmVuZGVyZXIoKSwgRmx1c2goXykpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2xvc3VyZTwwPigpKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+YXVkaW9fcmVuZGVyZXIoKSwgU3RvcChfKSkKLSAgICAgIC5XaWxsT25jZShSdW5DbG9zdXJlPDA+KCkpOwotCi0gIEVYUEVDVF9DQUxMKCptb2Nrc18tPmRlbXV4ZXIoKSwgU2VlayhzZWVrX3RpbWUsIF8pKQotICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrPDE+KFBJUEVMSU5FX0VSUk9SX1JFQUQpKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+ZGVtdXhlcigpLCBTdG9wKF8pKQotICAgICAgLldpbGxPbmNlKFJ1bkNsb3N1cmU8MD4oKSk7Ci0KLSAgcGlwZWxpbmVfLT5TZWVrKHNlZWtfdGltZSwgYmFzZTo6QmluZCgmQ2FsbGJhY2tIZWxwZXI6Ok9uU2VlaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKCZjYWxsYmFja3NfKSkpOwotICBFWFBFQ1RfQ0FMTChjYWxsYmFja3NfLCBPblNlZWsoUElQRUxJTkVfRVJST1JfUkVBRCkpOwotICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotfQotCi1URVNUX0YoUGlwZWxpbmVUZXN0LCBTdGFydFRpbWVJc1plcm8pIHsKLSAgQ3JlYXRlVmlkZW9TdHJlYW0oKTsKLSAgTW9ja0RlbXV4ZXJTdHJlYW1WZWN0b3Igc3RyZWFtczsKLSAgc3RyZWFtcy5wdXNoX2JhY2sodmlkZW9fc3RyZWFtKCkpOwotCi0gIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSBrRHVyYXRpb24gPSBiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKDEwMCk7Ci0gIEluaXRpYWxpemVEZW11eGVyKCZzdHJlYW1zLCBrRHVyYXRpb24pOwotICBJbml0aWFsaXplVmlkZW9SZW5kZXJlcih2aWRlb19zdHJlYW0oKSk7Ci0KLSAgSW5pdGlhbGl6ZVBpcGVsaW5lKFBJUEVMSU5FX09LKTsKLSAgRVhQRUNUX0ZBTFNFKHBpcGVsaW5lXy0+SGFzQXVkaW8oKSk7Ci0gIEVYUEVDVF9UUlVFKHBpcGVsaW5lXy0+SGFzVmlkZW8oKSk7Ci0KLSAgRVhQRUNUX0VRKGJhc2U6OlRpbWVEZWx0YSgpLCBwaXBlbGluZV8tPkdldE1lZGlhVGltZSgpKTsKLX0KLQotVEVTVF9GKFBpcGVsaW5lVGVzdCwgU3RhcnRUaW1lSXNOb25aZXJvKSB7Ci0gIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSBrU3RhcnRUaW1lID0gYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcyg0KTsKLSAgY29uc3QgYmFzZTo6VGltZURlbHRhIGtEdXJhdGlvbiA9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoMTAwKTsKLQotICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5kZW11eGVyKCksIEdldFN0YXJ0VGltZSgpKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybihrU3RhcnRUaW1lKSk7Ci0KLSAgQ3JlYXRlVmlkZW9TdHJlYW0oKTsKLSAgTW9ja0RlbXV4ZXJTdHJlYW1WZWN0b3Igc3RyZWFtczsKLSAgc3RyZWFtcy5wdXNoX2JhY2sodmlkZW9fc3RyZWFtKCkpOwotCi0gIEluaXRpYWxpemVEZW11eGVyKCZzdHJlYW1zLCBrRHVyYXRpb24pOwotICBJbml0aWFsaXplVmlkZW9SZW5kZXJlcih2aWRlb19zdHJlYW0oKSk7Ci0KLSAgSW5pdGlhbGl6ZVBpcGVsaW5lKFBJUEVMSU5FX09LKTsKLSAgRVhQRUNUX0ZBTFNFKHBpcGVsaW5lXy0+SGFzQXVkaW8oKSk7Ci0gIEVYUEVDVF9UUlVFKHBpcGVsaW5lXy0+SGFzVmlkZW8oKSk7Ci0KLSAgRVhQRUNUX0VRKGtTdGFydFRpbWUsIHBpcGVsaW5lXy0+R2V0TWVkaWFUaW1lKCkpOwotfQotCi1zdGF0aWMgdm9pZCBSdW5UaW1lQ0IoY29uc3QgQXVkaW9SZW5kZXJlcjo6VGltZUNCJiB0aW1lX2NiLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGltZV9pbl9tcywKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF90aW1lX2luX21zKSB7Ci0gIHRpbWVfY2IuUnVuKGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyh0aW1lX2luX21zKSwKLSAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKG1heF90aW1lX2luX21zKSk7Ci19Ci0KLVRFU1RfRihQaXBlbGluZVRlc3QsIEF1ZGlvVGltZVVwZGF0ZUR1cmluZ1NlZWspIHsKLSAgQ3JlYXRlQXVkaW9TdHJlYW0oKTsKLSAgTW9ja0RlbXV4ZXJTdHJlYW1WZWN0b3Igc3RyZWFtczsKLSAgc3RyZWFtcy5wdXNoX2JhY2soYXVkaW9fc3RyZWFtKCkpOwotCi0gIEluaXRpYWxpemVEZW11eGVyKCZzdHJlYW1zKTsKLSAgSW5pdGlhbGl6ZUF1ZGlvUmVuZGVyZXIoYXVkaW9fc3RyZWFtKCksIGZhbHNlKTsKLSAgSW5pdGlhbGl6ZVBpcGVsaW5lKFBJUEVMSU5FX09LKTsKLQotICBmbG9hdCBwbGF5YmFja19yYXRlID0gMS4wZjsKLSAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+ZGVtdXhlcigpLCBTZXRQbGF5YmFja1JhdGUocGxheWJhY2tfcmF0ZSkpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5hdWRpb19yZW5kZXJlcigpLCBTZXRQbGF5YmFja1JhdGUocGxheWJhY2tfcmF0ZSkpOwotICBwaXBlbGluZV8tPlNldFBsYXliYWNrUmF0ZShwbGF5YmFja19yYXRlKTsKLSAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLQotICAvLyBQcm92aWRlIGFuIGluaXRpYWwgdGltZSB1cGRhdGUgc28gdGhhdCB0aGUgcGlwZWxpbmUgdHJhbnNpdGlvbnMgb3V0IG9mIHRoZQotICAvLyAid2FpdGluZyBmb3IgdGltZSB1cGRhdGUiIHN0YXRlLgotICBhdWRpb190aW1lX2NiXy5SdW4oYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDEwMCksCi0gICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoNTAwKSk7Ci0KLSAgYmFzZTo6VGltZURlbHRhIHNlZWtfdGltZSA9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoNSk7Ci0KLSAgLy8gQXJyYW5nZSB0byB0cmlnZ2VyIGEgdGltZSB1cGRhdGUgd2hpbGUgdGhlIGRlbXV4ZXIgaXMgaW4gdGhlIG1pZGRsZSBvZgotICAvLyBzZWVraW5nLiBUaGlzIHVwZGF0ZSBzaG91bGQgYmUgaWdub3JlZCBieSB0aGUgcGlwZWxpbmUgYW5kIHRoZSBjbG9jayBzaG91bGQKLSAgLy8gbm90IGdldCB1cGRhdGVkLgotICBiYXNlOjpDbG9zdXJlIGNsb3N1cmUgPSBiYXNlOjpCaW5kKCZSdW5UaW1lQ0IsIGF1ZGlvX3RpbWVfY2JfLCAzMDAsIDcwMCk7Ci0gIEVYUEVDVF9DQUxMKCptb2Nrc18tPmRlbXV4ZXIoKSwgU2VlayhzZWVrX3RpbWUsIF8pKQotICAgICAgLldpbGxPbmNlKERvQWxsKEludm9rZVdpdGhvdXRBcmdzKCZjbG9zdXJlLCAmYmFzZTo6Q2xvc3VyZTo6UnVuKSwKLSAgICAgICAgICAgICAgICAgICAgICBSdW5DYWxsYmFjazwxPihQSVBFTElORV9PSykpKTsKLQotICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5hdWRpb19yZW5kZXJlcigpLCBQYXVzZShfKSkKLSAgICAgIC5XaWxsT25jZShSdW5DbG9zdXJlPDA+KCkpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5hdWRpb19yZW5kZXJlcigpLCBGbHVzaChfKSkKLSAgICAgIC5XaWxsT25jZShSdW5DbG9zdXJlPDA+KCkpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5hdWRpb19yZW5kZXJlcigpLCBQcmVyb2xsKHNlZWtfdGltZSwgXykpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MT4oUElQRUxJTkVfT0spKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+ZGVtdXhlcigpLCBTZXRQbGF5YmFja1JhdGUoXykpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5hdWRpb19yZW5kZXJlcigpLCBTZXRQbGF5YmFja1JhdGUoXykpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5hdWRpb19yZW5kZXJlcigpLCBTZXRWb2x1bWUoXykpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5hdWRpb19yZW5kZXJlcigpLCBQbGF5KF8pKQotICAgICAgLldpbGxPbmNlKFJ1bkNsb3N1cmU8MD4oKSk7Ci0KLSAgRVhQRUNUX0NBTEwoY2FsbGJhY2tzXywgT25CdWZmZXJpbmdTdGF0ZShQaXBlbGluZUltcGw6OmtQcmVyb2xsQ29tcGxldGVkKSk7Ci0gIEVYUEVDVF9DQUxMKGNhbGxiYWNrc18sIE9uU2VlayhQSVBFTElORV9PSykpOwotICBEb1NlZWsoc2Vla190aW1lKTsKLQotICBFWFBFQ1RfRVEocGlwZWxpbmVfLT5HZXRNZWRpYVRpbWUoKSwgc2Vla190aW1lKTsKLQotICAvLyBOb3cgdGhhdCB0aGUgc2VlayBpcyBjb21wbGV0ZSwgdmVyaWZ5IHRoYXQgdGltZSB1cGRhdGVzIGFkdmFuY2UgdGhlIGN1cnJlbnQKLSAgLy8gdGltZS4KLSAgYmFzZTo6VGltZURlbHRhIG5ld190aW1lID0gc2Vla190aW1lICsgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDEwMCk7Ci0gIGF1ZGlvX3RpbWVfY2JfLlJ1bihuZXdfdGltZSwgbmV3X3RpbWUpOwotCi0gIEVYUEVDVF9FUShwaXBlbGluZV8tPkdldE1lZGlhVGltZSgpLCBuZXdfdGltZSk7Ci19Ci0KLWNsYXNzIEZsZXhpYmxlQ2FsbGJhY2tSdW5uZXIgOiBwdWJsaWMgYmFzZTo6RGVsZWdhdGVTaW1wbGVUaHJlYWQ6OkRlbGVnYXRlIHsKLSBwdWJsaWM6Ci0gIEZsZXhpYmxlQ2FsbGJhY2tSdW5uZXIoYmFzZTo6VGltZURlbHRhIGRlbGF5LCBQaXBlbGluZVN0YXR1cyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc3RhdHVzX2NiKQotICAgICAgOiBkZWxheV8oZGVsYXkpLAotICAgICAgICBzdGF0dXNfKHN0YXR1cyksCi0gICAgICAgIHN0YXR1c19jYl8oc3RhdHVzX2NiKSB7Ci0gICAgaWYgKGRlbGF5XyA8IGJhc2U6OlRpbWVEZWx0YSgpKSB7Ci0gICAgICBzdGF0dXNfY2JfLlJ1bihzdGF0dXNfKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLSAgdmlydHVhbCB2b2lkIFJ1bigpIHsKLSAgICBpZiAoZGVsYXlfIDwgYmFzZTo6VGltZURlbHRhKCkpIHJldHVybjsKLSAgICBiYXNlOjpQbGF0Zm9ybVRocmVhZDo6U2xlZXAoZGVsYXlfKTsKLSAgICBzdGF0dXNfY2JfLlJ1bihzdGF0dXNfKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgYmFzZTo6VGltZURlbHRhIGRlbGF5XzsKLSAgUGlwZWxpbmVTdGF0dXMgc3RhdHVzXzsKLSAgUGlwZWxpbmVTdGF0dXNDQiBzdGF0dXNfY2JfOwotfTsKLQotdm9pZCBUZXN0UGlwZWxpbmVTdGF0dXNOb3RpZmljYXRpb24oYmFzZTo6VGltZURlbHRhIGRlbGF5KSB7Ci0gIFBpcGVsaW5lU3RhdHVzTm90aWZpY2F0aW9uIG5vdGU7Ci0gIC8vIEFyYml0cmFyeSBlcnJvciB2YWx1ZSB3ZSBleHBlY3QgdG8gZmlzaCBvdXQgb2YgdGhlIG5vdGlmaWNhdGlvbiBhZnRlciB0aGUKLSAgLy8gY2FsbGJhY2sgaXMgZmlyZWQuCi0gIGNvbnN0IFBpcGVsaW5lU3RhdHVzIGV4cGVjdGVkX2Vycm9yID0gUElQRUxJTkVfRVJST1JfVVJMX05PVF9GT1VORDsKLSAgRmxleGlibGVDYWxsYmFja1J1bm5lciBydW5uZXIoZGVsYXksIGV4cGVjdGVkX2Vycm9yLCBub3RlLkNhbGxiYWNrKCkpOwotICBiYXNlOjpEZWxlZ2F0ZVNpbXBsZVRocmVhZCB0aHJlYWQoJnJ1bm5lciwgIkZsZXhpYmxlQ2FsbGJhY2tSdW5uZXIiKTsKLSAgdGhyZWFkLlN0YXJ0KCk7Ci0gIG5vdGUuV2FpdCgpOwotICBFWFBFQ1RfRVEobm90ZS5zdGF0dXMoKSwgZXhwZWN0ZWRfZXJyb3IpOwotICB0aHJlYWQuSm9pbigpOwotfQotCi0vLyBUZXN0IHRoYXQgaW4tbGluZSBjYWxsYmFjayAoc2FtZSB0aHJlYWQsIG5vIHlpZWxkKSB3b3JrcyBjb3JyZWN0bHkuCi1URVNUKFBpcGVsaW5lU3RhdHVzTm90aWZpY2F0aW9uVGVzdCwgSW5saW5lQ2FsbGJhY2spIHsKLSAgVGVzdFBpcGVsaW5lU3RhdHVzTm90aWZpY2F0aW9uKGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygtMSkpOwotfQotCi0vLyBUZXN0IHRoYXQgZGlmZmVyZW50LXRocmVhZCwgbm8tZGVsYXkgY2FsbGJhY2sgd29ya3MgY29ycmVjdGx5LgotVEVTVChQaXBlbGluZVN0YXR1c05vdGlmaWNhdGlvblRlc3QsIEltbWVkaWF0ZUNhbGxiYWNrKSB7Ci0gIFRlc3RQaXBlbGluZVN0YXR1c05vdGlmaWNhdGlvbihiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMCkpOwotfQotCi0vLyBUZXN0IHRoYXQgZGlmZmVyZW50LXRocmVhZCwgc29tZS1kZWxheSBjYWxsYmFjayAodGhlIGV4cGVjdGVkIGNvbW1vbiBjYXNlKQotLy8gd29ya3MgY29ycmVjdGx5LgotVEVTVChQaXBlbGluZVN0YXR1c05vdGlmaWNhdGlvblRlc3QsIERlbGF5ZWRDYWxsYmFjaykgewotICBUZXN0UGlwZWxpbmVTdGF0dXNOb3RpZmljYXRpb24oYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDIwKSk7Ci19Ci0KLWNsYXNzIFBpcGVsaW5lVGVhcmRvd25UZXN0IDogcHVibGljIFBpcGVsaW5lVGVzdCB7Ci0gcHVibGljOgotICBlbnVtIFRlYXJkb3duU3RhdGUgewotICAgIGtJbml0RGVtdXhlciwKLSAgICBrSW5pdEF1ZGlvUmVuZGVyZXIsCi0gICAga0luaXRWaWRlb1JlbmRlcmVyLAotICAgIGtQYXVzaW5nLAotICAgIGtGbHVzaGluZywKLSAgICBrU2Vla2luZywKLSAgICBrUHJlcm9sbGluZywKLSAgICBrU3RhcnRpbmcsCi0gICAga1BsYXlpbmcsCi0gIH07Ci0KLSAgZW51bSBTdG9wT3JFcnJvciB7Ci0gICAga1N0b3AsCi0gICAga0Vycm9yLAotICB9OwotCi0gIFBpcGVsaW5lVGVhcmRvd25UZXN0KCkge30KLSAgdmlydHVhbCB+UGlwZWxpbmVUZWFyZG93blRlc3QoKSB7fQotCi0gIHZvaWQgUnVuVGVzdChUZWFyZG93blN0YXRlIHN0YXRlLCBTdG9wT3JFcnJvciBzdG9wX29yX2Vycm9yKSB7Ci0gICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgY2FzZSBrSW5pdERlbXV4ZXI6Ci0gICAgICBjYXNlIGtJbml0QXVkaW9SZW5kZXJlcjoKLSAgICAgIGNhc2Uga0luaXRWaWRlb1JlbmRlcmVyOgotICAgICAgICBEb0luaXRpYWxpemUoc3RhdGUsIHN0b3Bfb3JfZXJyb3IpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBrUGF1c2luZzoKLSAgICAgIGNhc2Uga0ZsdXNoaW5nOgotICAgICAgY2FzZSBrU2Vla2luZzoKLSAgICAgIGNhc2Uga1ByZXJvbGxpbmc6Ci0gICAgICBjYXNlIGtTdGFydGluZzoKLSAgICAgICAgRG9Jbml0aWFsaXplKHN0YXRlLCBzdG9wX29yX2Vycm9yKTsKLSAgICAgICAgRG9TZWVrKHN0YXRlLCBzdG9wX29yX2Vycm9yKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2Uga1BsYXlpbmc6Ci0gICAgICAgIERvSW5pdGlhbGl6ZShzdGF0ZSwgc3RvcF9vcl9lcnJvcik7Ci0gICAgICAgIERvU3RvcE9yRXJyb3Ioc3RvcF9vcl9lcnJvcik7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gVE9ETyhzY2hlcmt1cyk6IFdlIGRvIHJhZGljYWxseSBkaWZmZXJlbnQgdGhpbmdzIHdoZXRoZXIgdGVhcmRvd24gaXMKLSAgLy8gaW52b2tlZCB2aWEgc3RvcCB2cyBlcnJvci4gVGhlIHRlYXJkb3duIHBhdGggc2hvdWxkIGJlIHRoZSBzYW1lLAotICAvLyBzZWUgaHR0cDovL2NyYnVnLmNvbS8xMTAyMjgKLSAgdm9pZCBEb0luaXRpYWxpemUoVGVhcmRvd25TdGF0ZSBzdGF0ZSwgU3RvcE9yRXJyb3Igc3RvcF9vcl9lcnJvcikgewotICAgIFBpcGVsaW5lU3RhdHVzIGV4cGVjdGVkX3N0YXR1cyA9Ci0gICAgICAgIFNldEluaXRpYWxpemVFeHBlY3RhdGlvbnMoc3RhdGUsIHN0b3Bfb3JfZXJyb3IpOwotCi0gICAgRVhQRUNUX0NBTEwoY2FsbGJhY2tzXywgT25TdGFydChleHBlY3RlZF9zdGF0dXMpKTsKLSAgICBwaXBlbGluZV8tPlN0YXJ0KAotICAgICAgICBtb2Nrc18tPkNyZWF0ZSgpLlBhc3MoKSwgU2V0RGVjcnlwdG9yUmVhZHlDQigpLAotICAgICAgICBiYXNlOjpCaW5kKCZDYWxsYmFja0hlbHBlcjo6T25FbmRlZCwgYmFzZTo6VW5yZXRhaW5lZCgmY2FsbGJhY2tzXykpLAotICAgICAgICBiYXNlOjpCaW5kKCZDYWxsYmFja0hlbHBlcjo6T25FcnJvciwgYmFzZTo6VW5yZXRhaW5lZCgmY2FsbGJhY2tzXykpLAotICAgICAgICBiYXNlOjpCaW5kKCZDYWxsYmFja0hlbHBlcjo6T25TdGFydCwgYmFzZTo6VW5yZXRhaW5lZCgmY2FsbGJhY2tzXykpLAotICAgICAgICBiYXNlOjpCaW5kKCZDYWxsYmFja0hlbHBlcjo6T25CdWZmZXJpbmdTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKCZjYWxsYmFja3NfKSksCi0gICAgICAgIGJhc2U6OkNsb3N1cmUoKSk7Ci0gICAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLSAgfQotCi0gIFBpcGVsaW5lU3RhdHVzIFNldEluaXRpYWxpemVFeHBlY3RhdGlvbnMoVGVhcmRvd25TdGF0ZSBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9wT3JFcnJvciBzdG9wX29yX2Vycm9yKSB7Ci0gICAgUGlwZWxpbmVTdGF0dXMgc3RhdHVzID0gUElQRUxJTkVfT0s7Ci0gICAgYmFzZTo6Q2xvc3VyZSBzdG9wX2NiID0gYmFzZTo6QmluZCgKLSAgICAgICAgJkNhbGxiYWNrSGVscGVyOjpPblN0b3AsIGJhc2U6OlVucmV0YWluZWQoJmNhbGxiYWNrc18pKTsKLQotICAgIGlmIChzdGF0ZSA9PSBrSW5pdERlbXV4ZXIpIHsKLSAgICAgIGlmIChzdG9wX29yX2Vycm9yID09IGtTdG9wKSB7Ci0gICAgICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPmRlbXV4ZXIoKSwgSW5pdGlhbGl6ZShfLCBfKSkKLSAgICAgICAgICAgIC5XaWxsT25jZShEb0FsbChTdG9wKHBpcGVsaW5lXywgc3RvcF9jYiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUnVuQ2FsbGJhY2s8MT4oUElQRUxJTkVfT0spKSk7Ci0gICAgICAgIEVYUEVDVF9DQUxMKGNhbGxiYWNrc18sIE9uU3RvcCgpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXR1cyA9IERFTVVYRVJfRVJST1JfQ09VTERfTk9UX09QRU47Ci0gICAgICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPmRlbXV4ZXIoKSwgSW5pdGlhbGl6ZShfLCBfKSkKLSAgICAgICAgICAgIC5XaWxsT25jZShSdW5DYWxsYmFjazwxPihzdGF0dXMpKTsKLSAgICAgIH0KLQotICAgICAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+ZGVtdXhlcigpLCBTdG9wKF8pKS5XaWxsT25jZShSdW5DbG9zdXJlPDA+KCkpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBDcmVhdGVBdWRpb1N0cmVhbSgpOwotICAgIENyZWF0ZVZpZGVvU3RyZWFtKCk7Ci0gICAgTW9ja0RlbXV4ZXJTdHJlYW1WZWN0b3Igc3RyZWFtczsKLSAgICBzdHJlYW1zLnB1c2hfYmFjayhhdWRpb19zdHJlYW0oKSk7Ci0gICAgc3RyZWFtcy5wdXNoX2JhY2sodmlkZW9fc3RyZWFtKCkpOwotICAgIEluaXRpYWxpemVEZW11eGVyKCZzdHJlYW1zLCBiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKDMwMDApKTsKLQotICAgIGlmIChzdGF0ZSA9PSBrSW5pdEF1ZGlvUmVuZGVyZXIpIHsKLSAgICAgIGlmIChzdG9wX29yX2Vycm9yID09IGtTdG9wKSB7Ci0gICAgICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPmF1ZGlvX3JlbmRlcmVyKCksCi0gICAgICAgICAgICAgICAgICAgIEluaXRpYWxpemUoXywgXywgXywgXywgXywgXywgXywgXywgXykpCi0gICAgICAgICAgICAuV2lsbE9uY2UoRG9BbGwoU3RvcChwaXBlbGluZV8sIHN0b3BfY2IpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkNhbGxiYWNrPDI+KFBJUEVMSU5FX09LKSkpOwotICAgICAgICBFWFBFQ1RfQ0FMTChjYWxsYmFja3NfLCBPblN0b3AoKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzdGF0dXMgPSBQSVBFTElORV9FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQ7Ci0gICAgICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPmF1ZGlvX3JlbmRlcmVyKCksCi0gICAgICAgICAgICAgICAgICAgIEluaXRpYWxpemUoXywgXywgXywgXywgXywgXywgXywgXywgXykpCi0gICAgICAgICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8Mj4oc3RhdHVzKSk7Ci0gICAgICB9Ci0KLSAgICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPmRlbXV4ZXIoKSwgU3RvcChfKSkuV2lsbE9uY2UoUnVuQ2xvc3VyZTwwPigpKTsKLSAgICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPmF1ZGlvX3JlbmRlcmVyKCksIFN0b3AoXykpLldpbGxPbmNlKFJ1bkNsb3N1cmU8MD4oKSk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPmF1ZGlvX3JlbmRlcmVyKCksCi0gICAgICAgICAgICAgICAgSW5pdGlhbGl6ZShfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfKSkKLSAgICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrPDI+KFBJUEVMSU5FX09LKSk7Ci0KLSAgICBpZiAoc3RhdGUgPT0ga0luaXRWaWRlb1JlbmRlcmVyKSB7Ci0gICAgICBpZiAoc3RvcF9vcl9lcnJvciA9PSBrU3RvcCkgewotICAgICAgICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT52aWRlb19yZW5kZXJlcigpLAotICAgICAgICAgICAgICAgICAgICBJbml0aWFsaXplKF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8pKQotICAgICAgICAgICAgLldpbGxPbmNlKERvQWxsKFN0b3AocGlwZWxpbmVfLCBzdG9wX2NiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5DYWxsYmFjazwyPihQSVBFTElORV9PSykpKTsKLSAgICAgICAgRVhQRUNUX0NBTEwoY2FsbGJhY2tzXywgT25TdG9wKCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdHVzID0gUElQRUxJTkVfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOwotICAgICAgICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT52aWRlb19yZW5kZXJlcigpLAotICAgICAgICAgICAgICAgICAgICBJbml0aWFsaXplKF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8pKQotICAgICAgICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrPDI+KHN0YXR1cykpOwotICAgICAgfQotCi0gICAgICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5kZW11eGVyKCksIFN0b3AoXykpLldpbGxPbmNlKFJ1bkNsb3N1cmU8MD4oKSk7Ci0gICAgICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5hdWRpb19yZW5kZXJlcigpLCBTdG9wKF8pKS5XaWxsT25jZShSdW5DbG9zdXJlPDA+KCkpOwotICAgICAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+dmlkZW9fcmVuZGVyZXIoKSwgU3RvcChfKSkuV2lsbE9uY2UoUnVuQ2xvc3VyZTwwPigpKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+dmlkZW9fcmVuZGVyZXIoKSwKLSAgICAgICAgICAgICAgICBJbml0aWFsaXplKF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8pKQotICAgICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8Mj4oUElQRUxJTkVfT0spKTsKLQotICAgIEVYUEVDVF9DQUxMKGNhbGxiYWNrc18sIE9uQnVmZmVyaW5nU3RhdGUoUGlwZWxpbmVJbXBsOjprSGF2ZU1ldGFkYXRhKSk7Ci0KLSAgICAvLyBJZiB3ZSBnZXQgaGVyZSBpdCdzIGEgc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbi4KLSAgICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5hdWRpb19yZW5kZXJlcigpLCBQcmVyb2xsKGJhc2U6OlRpbWVEZWx0YSgpLCBfKSkKLSAgICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrPDE+KFBJUEVMSU5FX09LKSk7Ci0gICAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+dmlkZW9fcmVuZGVyZXIoKSwgUHJlcm9sbChiYXNlOjpUaW1lRGVsdGEoKSwgXykpCi0gICAgICAgIC5XaWxsT25jZShSdW5DYWxsYmFjazwxPihQSVBFTElORV9PSykpOwotCi0gICAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+ZGVtdXhlcigpLCBTZXRQbGF5YmFja1JhdGUoMC4wZikpOwotICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPmF1ZGlvX3JlbmRlcmVyKCksIFNldFBsYXliYWNrUmF0ZSgwLjBmKSk7Ci0gICAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+dmlkZW9fcmVuZGVyZXIoKSwgU2V0UGxheWJhY2tSYXRlKDAuMGYpKTsKLSAgICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5hdWRpb19yZW5kZXJlcigpLCBTZXRWb2x1bWUoMS4wZikpOwotCi0gICAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+YXVkaW9fcmVuZGVyZXIoKSwgUGxheShfKSkKLSAgICAgICAgLldpbGxPbmNlKFJ1bkNsb3N1cmU8MD4oKSk7Ci0gICAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+dmlkZW9fcmVuZGVyZXIoKSwgUGxheShfKSkKLSAgICAgICAgLldpbGxPbmNlKFJ1bkNsb3N1cmU8MD4oKSk7Ci0KLSAgICBpZiAoc3RhdHVzID09IFBJUEVMSU5FX09LKQotICAgICAgRVhQRUNUX0NBTEwoY2FsbGJhY2tzXywKLSAgICAgICAgICAgICAgICAgIE9uQnVmZmVyaW5nU3RhdGUoUGlwZWxpbmVJbXBsOjprUHJlcm9sbENvbXBsZXRlZCkpOwotCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIHZvaWQgRG9TZWVrKFRlYXJkb3duU3RhdGUgc3RhdGUsIFN0b3BPckVycm9yIHN0b3Bfb3JfZXJyb3IpIHsKLSAgICBJblNlcXVlbmNlIHM7Ci0gICAgUGlwZWxpbmVTdGF0dXMgc3RhdHVzID0gU2V0U2Vla0V4cGVjdGF0aW9ucyhzdGF0ZSwgc3RvcF9vcl9lcnJvcik7Ci0KLSAgICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5kZW11eGVyKCksIFN0b3AoXykpLldpbGxPbmNlKFJ1bkNsb3N1cmU8MD4oKSk7Ci0gICAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+YXVkaW9fcmVuZGVyZXIoKSwgU3RvcChfKSkuV2lsbE9uY2UoUnVuQ2xvc3VyZTwwPigpKTsKLSAgICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT52aWRlb19yZW5kZXJlcigpLCBTdG9wKF8pKS5XaWxsT25jZShSdW5DbG9zdXJlPDA+KCkpOwotICAgIEVYUEVDVF9DQUxMKGNhbGxiYWNrc18sIE9uU2VlayhzdGF0dXMpKTsKLQotICAgIGlmIChzdGF0dXMgPT0gUElQRUxJTkVfT0spIHsKLSAgICAgIEVYUEVDVF9DQUxMKGNhbGxiYWNrc18sIE9uU3RvcCgpKTsKLSAgICB9Ci0KLSAgICBwaXBlbGluZV8tPlNlZWsoYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcygxMCksIGJhc2U6OkJpbmQoCi0gICAgICAgICZDYWxsYmFja0hlbHBlcjo6T25TZWVrLCBiYXNlOjpVbnJldGFpbmVkKCZjYWxsYmFja3NfKSkpOwotICAgIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci0gIH0KLQotICBQaXBlbGluZVN0YXR1cyBTZXRTZWVrRXhwZWN0YXRpb25zKFRlYXJkb3duU3RhdGUgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcE9yRXJyb3Igc3RvcF9vcl9lcnJvcikgewotICAgIFBpcGVsaW5lU3RhdHVzIHN0YXR1cyA9IFBJUEVMSU5FX09LOwotICAgIGJhc2U6OkNsb3N1cmUgc3RvcF9jYiA9IGJhc2U6OkJpbmQoCi0gICAgICAgICZDYWxsYmFja0hlbHBlcjo6T25TdG9wLCBiYXNlOjpVbnJldGFpbmVkKCZjYWxsYmFja3NfKSk7Ci0KLSAgICBpZiAoc3RhdGUgPT0ga1BhdXNpbmcpIHsKLSAgICAgIGlmIChzdG9wX29yX2Vycm9yID09IGtTdG9wKSB7Ci0gICAgICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPmF1ZGlvX3JlbmRlcmVyKCksIFBhdXNlKF8pKQotICAgICAgICAgICAgLldpbGxPbmNlKERvQWxsKFN0b3AocGlwZWxpbmVfLCBzdG9wX2NiKSwgUnVuQ2xvc3VyZTwwPigpKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzdGF0dXMgPSBQSVBFTElORV9FUlJPUl9SRUFEOwotICAgICAgICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5hdWRpb19yZW5kZXJlcigpLCBQYXVzZShfKSkKLSAgICAgICAgICAgIC5XaWxsT25jZShEb0FsbChTZXRFcnJvcihwaXBlbGluZV8sIHN0YXR1cyksIFJ1bkNsb3N1cmU8MD4oKSkpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPmF1ZGlvX3JlbmRlcmVyKCksIFBhdXNlKF8pKS5XaWxsT25jZShSdW5DbG9zdXJlPDA+KCkpOwotICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPnZpZGVvX3JlbmRlcmVyKCksIFBhdXNlKF8pKS5XaWxsT25jZShSdW5DbG9zdXJlPDA+KCkpOwotCi0gICAgaWYgKHN0YXRlID09IGtGbHVzaGluZykgewotICAgICAgaWYgKHN0b3Bfb3JfZXJyb3IgPT0ga1N0b3ApIHsKLSAgICAgICAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+YXVkaW9fcmVuZGVyZXIoKSwgRmx1c2goXykpCi0gICAgICAgICAgICAuV2lsbE9uY2UoRG9BbGwoU3RvcChwaXBlbGluZV8sIHN0b3BfY2IpLCBSdW5DbG9zdXJlPDA+KCkpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXR1cyA9IFBJUEVMSU5FX0VSUk9SX1JFQUQ7Ci0gICAgICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPmF1ZGlvX3JlbmRlcmVyKCksIEZsdXNoKF8pKQotICAgICAgICAgICAgLldpbGxPbmNlKERvQWxsKFNldEVycm9yKHBpcGVsaW5lXywgc3RhdHVzKSwgUnVuQ2xvc3VyZTwwPigpKSk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+YXVkaW9fcmVuZGVyZXIoKSwgRmx1c2goXykpLldpbGxPbmNlKFJ1bkNsb3N1cmU8MD4oKSk7Ci0gICAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+dmlkZW9fcmVuZGVyZXIoKSwgRmx1c2goXykpLldpbGxPbmNlKFJ1bkNsb3N1cmU8MD4oKSk7Ci0KLSAgICBpZiAoc3RhdGUgPT0ga1NlZWtpbmcpIHsKLSAgICAgIGlmIChzdG9wX29yX2Vycm9yID09IGtTdG9wKSB7Ci0gICAgICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPmRlbXV4ZXIoKSwgU2VlayhfLCBfKSkKLSAgICAgICAgICAgIC5XaWxsT25jZShEb0FsbChTdG9wKHBpcGVsaW5lXywgc3RvcF9jYiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUnVuQ2FsbGJhY2s8MT4oUElQRUxJTkVfT0spKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzdGF0dXMgPSBQSVBFTElORV9FUlJPUl9SRUFEOwotICAgICAgICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5kZW11eGVyKCksIFNlZWsoXywgXykpCi0gICAgICAgICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MT4oc3RhdHVzKSk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+ZGVtdXhlcigpLCBTZWVrKF8sIF8pKQotICAgICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MT4oUElQRUxJTkVfT0spKTsKLQotICAgIGlmIChzdGF0ZSA9PSBrUHJlcm9sbGluZykgewotICAgICAgaWYgKHN0b3Bfb3JfZXJyb3IgPT0ga1N0b3ApIHsKLSAgICAgICAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+YXVkaW9fcmVuZGVyZXIoKSwgUHJlcm9sbChfLCBfKSkKLSAgICAgICAgICAgIC5XaWxsT25jZShEb0FsbChTdG9wKHBpcGVsaW5lXywgc3RvcF9jYiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUnVuQ2FsbGJhY2s8MT4oUElQRUxJTkVfT0spKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzdGF0dXMgPSBQSVBFTElORV9FUlJPUl9SRUFEOwotICAgICAgICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5hdWRpb19yZW5kZXJlcigpLCBQcmVyb2xsKF8sIF8pKQotICAgICAgICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrPDE+KHN0YXR1cykpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPmF1ZGlvX3JlbmRlcmVyKCksIFByZXJvbGwoXywgXykpCi0gICAgICAgIC5XaWxsT25jZShSdW5DYWxsYmFjazwxPihQSVBFTElORV9PSykpOwotICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPnZpZGVvX3JlbmRlcmVyKCksIFByZXJvbGwoXywgXykpCi0gICAgICAgIC5XaWxsT25jZShSdW5DYWxsYmFjazwxPihQSVBFTElORV9PSykpOwotCi0gICAgLy8gUGxheWJhY2sgcmF0ZSBhbmQgdm9sdW1lIGFyZSB1cGRhdGVkIHByaW9yIHRvIHN0YXJ0aW5nLgotICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPmRlbXV4ZXIoKSwgU2V0UGxheWJhY2tSYXRlKDAuMGYpKTsKLSAgICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5hdWRpb19yZW5kZXJlcigpLCBTZXRQbGF5YmFja1JhdGUoMC4wZikpOwotICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPnZpZGVvX3JlbmRlcmVyKCksIFNldFBsYXliYWNrUmF0ZSgwLjBmKSk7Ci0gICAgRVhQRUNUX0NBTEwoKm1vY2tzXy0+YXVkaW9fcmVuZGVyZXIoKSwgU2V0Vm9sdW1lKDEuMGYpKTsKLQotICAgIGlmIChzdGF0ZSA9PSBrU3RhcnRpbmcpIHsKLSAgICAgIGlmIChzdG9wX29yX2Vycm9yID09IGtTdG9wKSB7Ci0gICAgICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPmF1ZGlvX3JlbmRlcmVyKCksIFBsYXkoXykpCi0gICAgICAgICAgICAuV2lsbE9uY2UoRG9BbGwoU3RvcChwaXBlbGluZV8sIHN0b3BfY2IpLCBSdW5DbG9zdXJlPDA+KCkpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXR1cyA9IFBJUEVMSU5FX0VSUk9SX1JFQUQ7Ci0gICAgICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPmF1ZGlvX3JlbmRlcmVyKCksIFBsYXkoXykpCi0gICAgICAgICAgICAuV2lsbE9uY2UoRG9BbGwoU2V0RXJyb3IocGlwZWxpbmVfLCBzdGF0dXMpLCBSdW5DbG9zdXJlPDA+KCkpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgTk9UUkVBQ0hFRCgpIDw8ICJTdGF0ZSBub3Qgc3VwcG9ydGVkOiAiIDw8IHN0YXRlOwotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICB2b2lkIERvU3RvcE9yRXJyb3IoU3RvcE9yRXJyb3Igc3RvcF9vcl9lcnJvcikgewotICAgIEluU2VxdWVuY2UgczsKLQotICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPmRlbXV4ZXIoKSwgU3RvcChfKSkuV2lsbE9uY2UoUnVuQ2xvc3VyZTwwPigpKTsKLSAgICBFWFBFQ1RfQ0FMTCgqbW9ja3NfLT5hdWRpb19yZW5kZXJlcigpLCBTdG9wKF8pKS5XaWxsT25jZShSdW5DbG9zdXJlPDA+KCkpOwotICAgIEVYUEVDVF9DQUxMKCptb2Nrc18tPnZpZGVvX3JlbmRlcmVyKCksIFN0b3AoXykpLldpbGxPbmNlKFJ1bkNsb3N1cmU8MD4oKSk7Ci0KLSAgICBpZiAoc3RvcF9vcl9lcnJvciA9PSBrU3RvcCkgewotICAgICAgRVhQRUNUX0NBTEwoY2FsbGJhY2tzXywgT25TdG9wKCkpOwotICAgICAgcGlwZWxpbmVfLT5TdG9wKGJhc2U6OkJpbmQoCi0gICAgICAgICAgJkNhbGxiYWNrSGVscGVyOjpPblN0b3AsIGJhc2U6OlVucmV0YWluZWQoJmNhbGxiYWNrc18pKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEVYUEVDVF9DQUxMKGNhbGxiYWNrc18sIE9uRXJyb3IoUElQRUxJTkVfRVJST1JfUkVBRCkpOwotICAgICAgcGlwZWxpbmVfLT5TZXRFcnJvckZvclRlc3RpbmcoUElQRUxJTkVfRVJST1JfUkVBRCk7Ci0gICAgfQotCi0gICAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLSAgfQotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihQaXBlbGluZVRlYXJkb3duVGVzdCk7Ci19OwotCi0jZGVmaW5lIElOU1RBTlRJQVRFX1RFQVJET1dOX1RFU1Qoc3RvcF9vcl9lcnJvciwgc3RhdGUpIFwKLSAgICBURVNUX0YoUGlwZWxpbmVUZWFyZG93blRlc3QsIHN0b3Bfb3JfZXJyb3IjI18jI3N0YXRlKSB7IFwKLSAgICAgIFJ1blRlc3QoayMjc3RhdGUsIGsjI3N0b3Bfb3JfZXJyb3IpOyBcCi0gICAgfQotCi1JTlNUQU5USUFURV9URUFSRE9XTl9URVNUKFN0b3AsIEluaXREZW11eGVyKTsKLUlOU1RBTlRJQVRFX1RFQVJET1dOX1RFU1QoU3RvcCwgSW5pdEF1ZGlvUmVuZGVyZXIpOwotSU5TVEFOVElBVEVfVEVBUkRPV05fVEVTVChTdG9wLCBJbml0VmlkZW9SZW5kZXJlcik7Ci1JTlNUQU5USUFURV9URUFSRE9XTl9URVNUKFN0b3AsIFBhdXNpbmcpOwotSU5TVEFOVElBVEVfVEVBUkRPV05fVEVTVChTdG9wLCBGbHVzaGluZyk7Ci1JTlNUQU5USUFURV9URUFSRE9XTl9URVNUKFN0b3AsIFNlZWtpbmcpOwotSU5TVEFOVElBVEVfVEVBUkRPV05fVEVTVChTdG9wLCBQcmVyb2xsaW5nKTsKLUlOU1RBTlRJQVRFX1RFQVJET1dOX1RFU1QoU3RvcCwgU3RhcnRpbmcpOwotSU5TVEFOVElBVEVfVEVBUkRPV05fVEVTVChTdG9wLCBQbGF5aW5nKTsKLQotSU5TVEFOVElBVEVfVEVBUkRPV05fVEVTVChFcnJvciwgSW5pdERlbXV4ZXIpOwotSU5TVEFOVElBVEVfVEVBUkRPV05fVEVTVChFcnJvciwgSW5pdEF1ZGlvUmVuZGVyZXIpOwotSU5TVEFOVElBVEVfVEVBUkRPV05fVEVTVChFcnJvciwgSW5pdFZpZGVvUmVuZGVyZXIpOwotSU5TVEFOVElBVEVfVEVBUkRPV05fVEVTVChFcnJvciwgUGF1c2luZyk7Ci1JTlNUQU5USUFURV9URUFSRE9XTl9URVNUKEVycm9yLCBGbHVzaGluZyk7Ci1JTlNUQU5USUFURV9URUFSRE9XTl9URVNUKEVycm9yLCBTZWVraW5nKTsKLUlOU1RBTlRJQVRFX1RFQVJET1dOX1RFU1QoRXJyb3IsIFByZXJvbGxpbmcpOwotSU5TVEFOVElBVEVfVEVBUkRPV05fVEVTVChFcnJvciwgU3RhcnRpbmcpOwotSU5TVEFOVElBVEVfVEVBUkRPV05fVEVTVChFcnJvciwgUGxheWluZyk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvcGlwZWxpbmVfc3RhdHVzLmNjIGIvc3JjL21lZGlhL2Jhc2UvcGlwZWxpbmVfc3RhdHVzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzA4MzgzLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3BpcGVsaW5lX3N0YXR1cy5jYworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL3BpcGVsaW5lX3N0YXR1cy5oIgotCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXRyaWNzL2hpc3RvZ3JhbS5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1zdGF0aWMgdm9pZCBSZXBvcnRBbmRSdW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUGlwZWxpbmVTdGF0dXMgc3RhdHVzKSB7Ci0gIFVNQV9ISVNUT0dSQU1fRU5VTUVSQVRJT04obmFtZSwgc3RhdHVzLCBQSVBFTElORV9TVEFUVVNfTUFYKTsKLSAgY2IuUnVuKHN0YXR1cyk7Ci19Ci0KLVBpcGVsaW5lU3RhdHVzQ0IgQ3JlYXRlVU1BUmVwb3J0aW5nUGlwZWxpbmVDQihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBjYikgewotICByZXR1cm4gYmFzZTo6QmluZCgmUmVwb3J0QW5kUnVuLCBuYW1lLCBjYik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvcGlwZWxpbmVfc3RhdHVzLmggYi9zcmMvbWVkaWEvYmFzZS9waXBlbGluZV9zdGF0dXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIwOGQwMS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9waXBlbGluZV9zdGF0dXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfQkFTRV9QSVBFTElORV9TVEFUVVNfSF8KLSNkZWZpbmUgTUVESUFfQkFTRV9QSVBFTElORV9TVEFUVVNfSF8KLQotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKLQotI2luY2x1ZGUgPHN0cmluZz4KLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gU3RhdHVzIHN0YXRlcyBmb3IgcGlwZWxpbmUuICBBbGwgY29kZXMgZXhjZXB0IFBJUEVMSU5FX09LIGluZGljYXRlIGVycm9ycy4KLS8vIExvZ2dlZCB0byBVTUEsIHNvIG5ldmVyIHJldXNlIGEgdmFsdWUsIGFsd2F5cyBhZGQgbmV3L2dyZWF0ZXIgb25lcyEKLS8vIFRPRE8odnJrL3NjaGVya3VzKTogVHJpbSB0aGUgdW51c2VkIHN0YXR1cyBjb2Rlcy4gKGNyYnVnLmNvbS8xMjYwNzApCi1lbnVtIFBpcGVsaW5lU3RhdHVzIHsKLSAgUElQRUxJTkVfT0sgPSAwLAotICBQSVBFTElORV9FUlJPUl9VUkxfTk9UX0ZPVU5EID0gMSwKLSAgUElQRUxJTkVfRVJST1JfTkVUV09SSyA9IDIsCi0gIFBJUEVMSU5FX0VSUk9SX0RFQ09ERSA9IDMsCi0gIFBJUEVMSU5FX0VSUk9SX0RFQ1JZUFQgPSA0LAotICBQSVBFTElORV9FUlJPUl9BQk9SVCA9IDUsCi0gIFBJUEVMSU5FX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRCA9IDYsCi0gIFBJUEVMSU5FX0VSUk9SX0NPVUxEX05PVF9SRU5ERVIgPSA4LAotICBQSVBFTElORV9FUlJPUl9SRUFEID0gOSwKLSAgUElQRUxJTkVfRVJST1JfT1BFUkFUSU9OX1BFTkRJTkcgPSAxMCwKLSAgUElQRUxJTkVfRVJST1JfSU5WQUxJRF9TVEFURSA9IDExLAotICAvLyBEZW11eGVyIHJlbGF0ZWQgZXJyb3JzLgotICBERU1VWEVSX0VSUk9SX0NPVUxEX05PVF9PUEVOID0gMTIsCi0gIERFTVVYRVJfRVJST1JfQ09VTERfTk9UX1BBUlNFID0gMTMsCi0gIERFTVVYRVJfRVJST1JfTk9fU1VQUE9SVEVEX1NUUkVBTVMgPSAxNCwKLSAgLy8gRGVjb2RlciByZWxhdGVkIGVycm9ycy4KLSAgREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVEID0gMTUsCi0gIFBJUEVMSU5FX1NUQVRVU19NQVgsICAvLyBNdXN0IGJlIGdyZWF0ZXIgdGhhbiBhbGwgb3RoZXIgdmFsdWVzIGxvZ2dlZC4KLX07Ci0KLXR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZChQaXBlbGluZVN0YXR1cyk+IFBpcGVsaW5lU3RhdHVzQ0I7Ci0KLS8vIFdyYXAgJiByZXR1cm4gYSBjYWxsYmFjayBhcm91bmQgfGNifCB3aGljaCByZXBvcnRzIGl0cyBhcmd1bWVudCB0byBVTUEgdW5kZXIKLS8vIHRoZSByZXF1ZXN0ZWQgfG5hbWV8LgotUGlwZWxpbmVTdGF0dXNDQiBDcmVhdGVVTUFSZXBvcnRpbmdQaXBlbGluZUNCKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGNiKTsKLQotLy8gVE9ETyhzY2hlcmt1cyk6IHRoaXMgc2hvdWxkIGJlIG1vdmVkIGFsb25nc2lkZSBob3N0IGludGVyZmFjZSBkZWZpbml0aW9ucy4KLXN0cnVjdCBQaXBlbGluZVN0YXRpc3RpY3MgewotICBQaXBlbGluZVN0YXRpc3RpY3MoKQotICAgICAgOiBhdWRpb19ieXRlc19kZWNvZGVkKDApLAotICAgICAgICB2aWRlb19ieXRlc19kZWNvZGVkKDApLAotICAgICAgICB2aWRlb19mcmFtZXNfZGVjb2RlZCgwKSwKLSAgICAgICAgdmlkZW9fZnJhbWVzX2Ryb3BwZWQoMCkgewotICB9Ci0KLSAgdWludDMyIGF1ZGlvX2J5dGVzX2RlY29kZWQ7ICAvLyBTaG91bGQgYmUgdWludDY0PwotICB1aW50MzIgdmlkZW9fYnl0ZXNfZGVjb2RlZDsgIC8vIFNob3VsZCBiZSB1aW50NjQ/Ci0gIHVpbnQzMiB2aWRlb19mcmFtZXNfZGVjb2RlZDsKLSAgdWludDMyIHZpZGVvX2ZyYW1lc19kcm9wcGVkOwotfTsKLQotLy8gVXNlZCBmb3IgdXBkYXRpbmcgcGlwZWxpbmUgc3RhdGlzdGljcy4KLXR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZChjb25zdCBQaXBlbGluZVN0YXRpc3RpY3MmKT4gU3RhdGlzdGljc0NCOwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX1BJUEVMSU5FX1NUQVRVU19IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvcmFuZ2VzLmNjIGIvc3JjL21lZGlhL2Jhc2UvcmFuZ2VzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2IyYjU1Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3Jhbmdlcy5jYworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL3Jhbmdlcy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi10ZW1wbGF0ZTw+Ci12b2lkIFJhbmdlczxiYXNlOjpUaW1lRGVsdGE+OjpEQ2hlY2tMVChjb25zdCBiYXNlOjpUaW1lRGVsdGEmIGxocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSYgcmhzKSBjb25zdCB7Ci0gIERDSEVDSyhsaHMgPCByaHMpIDw8IGxocy5Ub0ludGVybmFsVmFsdWUoKSA8PCAiIDwgIiA8PCByaHMuVG9JbnRlcm5hbFZhbHVlKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvcmFuZ2VzLmggYi9zcmMvbWVkaWEvYmFzZS9yYW5nZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWExZGY2Ni4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9yYW5nZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0JBU0VfUkFOR0VTX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfUkFOR0VTX0hfCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8b3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL3RpbWUuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBSYW5nZXMgYWxsb3dzIGhvbGRpbmcgYW4gb3JkZXJlZCBsaXN0IG9mIHJhbmdlcyBvZiBbc3RhcnQsZW5kKSBpbnRlcnZhbHMuCi0vLyBUaGUgY2Fub25pY2FsIGV4YW1wbGUgdXNlLWNhc2UgaXMgaG9sZGluZyB0aGUgbGlzdCBvZiByYW5nZXMgb2YgYnVmZmVyZWQKLS8vIGJ5dGVzIG9yIHRpbWVzIGluIGEgPHZpZGVvPiB0YWcuCi10ZW1wbGF0ZTxjbGFzcyBUPiAgLy8gRW5kcG9pbnQgdHlwZTsgdHlwaWNhbGx5IGEgYmFzZTo6VGltZURlbHRhIG9yIGFuIGludDY0LgotY2xhc3MgUmFuZ2VzIHsKLSBwdWJsaWM6Ci0gIC8vIEFsbG93IGNvcHkgJiBhc3NpZ24uCi0KLSAgLy8gQWRkIChzdGFydCxlbmQpIHRvIHRoaXMgb2JqZWN0LCBjb2FsbGVzY2luZyBvdmVybGFwcyBhcyBhcHByb3ByaWF0ZS4KLSAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHN0b3JlZCByYW5nZXMsIHBvc3QgY29hbGxlc2NpbmcuCi0gIHNpemVfdCBBZGQoVCBzdGFydCwgVCBlbmQpOwotCi0gIC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGRpc2pvaW50IHJhbmdlcy4KLSAgc2l6ZV90IHNpemUoKSBjb25zdDsKLQotICAvLyBSZXR1cm4gdGhlICJpIid0aCByYW5nZSdzIHN0YXJ0ICYgZW5kICgwLWJhc2VkKS4KLSAgVCBzdGFydChpbnQgaSkgY29uc3Q7Ci0gIFQgZW5kKGludCBpKSBjb25zdDsKLQotICAvLyBDbGVhciBhbGwgcmFuZ2VzLgotICB2b2lkIGNsZWFyKCk7Ci0KLSAgLy8gQ29tcHV0ZXMgdGhlIGludGVyc2VjdGlvbiBiZXR3ZWVuIHRoaXMgcmFuZ2UgYW5kIHxvdGhlcnwuCi0gIFJhbmdlczxUPiBJbnRlcnNlY3Rpb25XaXRoKGNvbnN0IFJhbmdlczxUPiYgb3RoZXIpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgLy8gV3JhcHBlciBhcm91bmQgRENIRUNLX0xUIGFsbG93aW5nIGNvbXBhcmlzb25zIG9mIG9wZXJhdG9yPDwnYWJsZSBUJ3MuCi0gIHZvaWQgRENoZWNrTFQoY29uc3QgVCYgbGhzLCBjb25zdCBUJiByaHMpIGNvbnN0OwotCi0gIC8vIERpc2pvaW50LCBpbiBpbmNyZWFzaW5nIG9yZGVyIG9mIHN0YXJ0LgotICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8VCwgVD4gPiByYW5nZXNfOwotfTsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRVZFUllUSElORyBCRUxPVyBIRVJFIElTIElNUExFTUVOVEFUSU9OIERFVEFJTCEhCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci1zaXplX3QgUmFuZ2VzPFQ+OjpBZGQoVCBzdGFydCwgVCBlbmQpIHsKLSAgaWYgKHN0YXJ0ID09IGVuZCkgIC8vIE5vdGhpbmcgdG8gYmUgZG9uZSB3aXRoIGVtcHR5IHJhbmdlcy4KLSAgICByZXR1cm4gcmFuZ2VzXy5zaXplKCk7Ci0KLSAgRENoZWNrTFQoc3RhcnQsIGVuZCk7Ci0gIHNpemVfdCBpOwotICAvLyBXYWxrIGFsb25nIHRoZSBhcnJheSBvZiByYW5nZXMgdW50aWwgfHN0YXJ0fCBpcyBubyBsb25nZXIgbGFyZ2VyIHRoYW4gdGhlCi0gIC8vIGN1cnJlbnQgaW50ZXJ2YWwncyBlbmQuCi0gIGZvciAoaSA9IDA7IGkgPCByYW5nZXNfLnNpemUoKSAmJiByYW5nZXNfW2ldLnNlY29uZCA8IHN0YXJ0OyArK2kpIHsKLSAgICAvLyBFbXB0eSBib2R5Ci0gIH0KLQotICAvLyBOb3cgd2Uga25vdyB8c3RhcnR8IGJlbG9uZ3MgaW4gdGhlIGkndGggc2xvdC4KLSAgLy8gSWYgaSBpcyB0aGUgZW5kIG9mIHRoZSByYW5nZSwgYXBwZW5kIG5ldyByYW5nZSBhbmQgZG9uZS4KLSAgaWYgKGkgPT0gcmFuZ2VzXy5zaXplKCkpIHsKLSAgICByYW5nZXNfLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihzdGFydCwgZW5kKSk7Ci0gICAgcmV0dXJuIHJhbmdlc18uc2l6ZSgpOwotICB9Ci0KLSAgLy8gSWYgfGVuZHwgaXMgbGVzcyB0aGFuIGktPmZpcnN0LCB0aGVuIFtzdGFydCxlbmQpIGlzIGEgbmV3IChub24tb3ZlcmxhcHBpbmcpCi0gIC8vIGkndGggZW50cnkgcHVzaGluZyBldmVyeW9uZSBlbHNlIGJhY2ssIGFuZCBkb25lLgotICBpZiAoZW5kIDwgcmFuZ2VzX1tpXS5maXJzdCkgewotICAgIHJhbmdlc18uaW5zZXJ0KHJhbmdlc18uYmVnaW4oKSArIGksIHN0ZDo6bWFrZV9wYWlyKHN0YXJ0LCBlbmQpKTsKLSAgICByZXR1cm4gcmFuZ2VzXy5zaXplKCk7Ci0gIH0KLQotICAvLyBFYXN5IGNhc2VzIGRvbmUuICBHZXR0aW5nIGhlcmUgbWVhbnMgdGhlcmUgaXMgb3ZlcmxhcCBiZXR3ZWVuIFtzdGFydCxlbmQpCi0gIC8vIGFuZCB0aGUgZXhpc3RpbmcgcmFuZ2VzLgotCi0gIC8vIE5vdzogc3RhcnQgPD0gaS0+c2Vjb25kICYmIGktPmZpcnN0IDw9IGVuZAotICBpZiAoc3RhcnQgPCByYW5nZXNfW2ldLmZpcnN0KQotICAgIHJhbmdlc19baV0uZmlyc3QgPSBzdGFydDsKLSAgaWYgKHJhbmdlc19baV0uc2Vjb25kIDwgZW5kKQotICAgIHJhbmdlc19baV0uc2Vjb25kID0gZW5kOwotCi0gIC8vIE5vdzogW3N0YXJ0LGVuZCkgaXMgY29udGFpbmVkIGluIHRoZSBpJ3RoIHJhbmdlLCBhbmQgd2UnZCBiZSBkb25lLCBleGNlcHQKLSAgLy8gZm9yIHRoZSBmYWN0IHRoYXQgdGhlIG5ld2x5LWV4dGVuZGVkIGkndGggcmFuZ2UgbWlnaHQgbm93IG92ZXJsYXAKLSAgLy8gc3Vic2VxdWVudCByYW5nZXMuICBNZXJnZSB1bnRpbCBkaXNjb250aW51aXRpZXMgYXBwZWFyLiAgTm90ZSB0aGF0IHRoZXJlJ3MKLSAgLy8gbm8gbmVlZCB0byB0ZXN0L21lcmdlIHByZXZpb3VzIHJhbmdlcywgc2luY2UgbmVlZGluZyB0aGF0IHdvdWxkIG1lYW4gdGhlCi0gIC8vIG9yaWdpbmFsIGxvb3Agd2VudCB0b28gZmFyLgotICB3aGlsZSAoKGkgKyAxKSA8IHJhbmdlc18uc2l6ZSgpICYmCi0gICAgICAgICByYW5nZXNfW2kgKyAxXS5maXJzdCA8PSByYW5nZXNfW2ldLnNlY29uZCkgewotICAgIHJhbmdlc19baV0uc2Vjb25kID0gc3RkOjptYXgocmFuZ2VzX1tpXS5zZWNvbmQsIHJhbmdlc19baSArIDFdLnNlY29uZCk7Ci0gICAgcmFuZ2VzXy5lcmFzZShyYW5nZXNfLmJlZ2luKCkgKyBpICsgMSk7Ci0gIH0KLQotICByZXR1cm4gcmFuZ2VzXy5zaXplKCk7Ci19Ci0KLXRlbXBsYXRlPD4KLXZvaWQgUmFuZ2VzPGJhc2U6OlRpbWVEZWx0YT46OkRDaGVja0xUKGNvbnN0IGJhc2U6OlRpbWVEZWx0YSYgbGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6VGltZURlbHRhJiByaHMpIGNvbnN0OwotCi10ZW1wbGF0ZTxjbGFzcyBUPgotdm9pZCBSYW5nZXM8VD46OkRDaGVja0xUKGNvbnN0IFQmIGxocywgY29uc3QgVCYgcmhzKSBjb25zdCB7Ci0gIERDSEVDS19MVChsaHMsIHJocyk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci1zaXplX3QgUmFuZ2VzPFQ+OjpzaXplKCkgY29uc3QgewotICByZXR1cm4gcmFuZ2VzXy5zaXplKCk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci1UIFJhbmdlczxUPjo6c3RhcnQoaW50IGkpIGNvbnN0IHsKLSAgcmV0dXJuIHJhbmdlc19bc3RhdGljX2Nhc3Q8c2l6ZV90PihpKV0uZmlyc3Q7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci1UIFJhbmdlczxUPjo6ZW5kKGludCBpKSBjb25zdCB7Ci0gIHJldHVybiByYW5nZXNfW3N0YXRpY19jYXN0PHNpemVfdD4oaSldLnNlY29uZDsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4KLXZvaWQgUmFuZ2VzPFQ+OjpjbGVhcigpIHsKLSAgcmFuZ2VzXy5jbGVhcigpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPgotUmFuZ2VzPFQ+IFJhbmdlczxUPjo6SW50ZXJzZWN0aW9uV2l0aChjb25zdCBSYW5nZXM8VD4mIG90aGVyKSBjb25zdCB7Ci0gIFJhbmdlczxUPiByZXN1bHQ7Ci0KLSAgc2l6ZV90IGkgPSAwOwotICBzaXplX3QgaiA9IDA7Ci0KLSAgd2hpbGUgKGkgPCBzaXplKCkgJiYgaiA8IG90aGVyLnNpemUoKSkgewotICAgIFQgbWF4X3N0YXJ0ID0gc3RkOjptYXgoc3RhcnQoaSksIG90aGVyLnN0YXJ0KGopKTsKLSAgICBUIG1pbl9lbmQgPSBzdGQ6Om1pbihlbmQoaSksIG90aGVyLmVuZChqKSk7Ci0KLSAgICAvLyBBZGQgYW4gaW50ZXJzZWN0aW9uIHJhbmdlIHRvIHRoZSByZXN1bHQgaWYgdGhlIHJhbmdlcyBvdmVybGFwLgotICAgIGlmIChtYXhfc3RhcnQgPCBtaW5fZW5kKQotICAgICAgcmVzdWx0LkFkZChtYXhfc3RhcnQsIG1pbl9lbmQpOwotCi0gICAgaWYgKGVuZChpKSA8IG90aGVyLmVuZChqKSkKLSAgICAgICsraTsKLSAgICBlbHNlCi0gICAgICArK2o7Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX1JBTkdFU19IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvcmFuZ2VzX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2Jhc2UvcmFuZ2VzX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjdkMTM4Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3Jhbmdlc191bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSA8c3N0cmVhbT4KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvcmFuZ2VzLmgiCi0KLSNpbmNsdWRlICJiYXNlL3N0cmluZ19waWVjZS5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBIdW1hbi1yZWFkYWJsZSBvdXRwdXQgb3BlcmF0b3IsIGZvciBkZWJ1Z2dpbmcvdGVzdGFiaWxpdHkuCi10ZW1wbGF0ZTxjbGFzcyBUPgotc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFJhbmdlczxUPiYgcikgewotICBvcyA8PCAieyAiOwotICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgci5zaXplKCk7ICsraSkKLSAgICBvcyA8PCAiWyIgPDwgci5zdGFydChpKSA8PCAiLCIgPDwgci5lbmQoaSkgPDwgIikgIjsKLSAgb3MgPDwgIn0iOwotICByZXR1cm4gb3M7Ci19Ci0KLS8vIEhlbHBlciBtZXRob2QgZm9yIGFzc2VydGluZyBzdHJpbmdpZmllZCBmb3JtIG9mIHxyfCBtYXRjaGVzIGV4cGVjdGF0aW9uLgotdGVtcGxhdGU8Y2xhc3MgVD4KLXN0YXRpYyB2b2lkIEV4cGVjdFJhbmdlcyhjb25zdCBSYW5nZXM8VD4mIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6U3RyaW5nUGllY2UmIGV4cGVjdGVkX3N0cmluZykgewotICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgc3MgPDwgcjsKLSAgQVNTRVJUX0VRKHNzLnN0cigpLCBleHBlY3RlZF9zdHJpbmcpOwotfQotCi0jZGVmaW5lIEFTU0VSVF9SQU5HRVMocmFuZ2VzLCBleHBlY3RhdGlvbikgXAotICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShFeHBlY3RSYW5nZXMocmFuZ2VzLCBleHBlY3RhdGlvbikpOwotCi1URVNUKFJhbmdlc1Rlc3QsIFNpbXBsZVRlc3RzKSB7Ci0gIFJhbmdlczxpbnQ+IHI7Ci0gIEFTU0VSVF9FUShyLnNpemUoKSwgMHUpIDw8IHI7Ci0gIEFTU0VSVF9FUShyLkFkZCgwLCAxKSwgMXUpIDw8IHI7Ci0gIEFTU0VSVF9FUShyLnNpemUoKSwgMXUpIDw8IHI7Ci0gIEFTU0VSVF9SQU5HRVMociwgInsgWzAsMSkgfSIpOwotICBBU1NFUlRfRVEoci5BZGQoMiwgMyksIDJ1KSA8PCByOwotICBBU1NFUlRfUkFOR0VTKHIsICJ7IFswLDEpIFsyLDMpIH0iKTsKLSAgQVNTRVJUX0VRKHIuQWRkKDEsIDIpLCAxdSkgPDwgcjsKLSAgQVNTRVJUX1JBTkdFUyhyLCAieyBbMCwzKSB9Iik7Ci0gIEFTU0VSVF9FUShyLkFkZCgxLCA0KSwgMXUpIDw8IHI7Ci0gIEFTU0VSVF9SQU5HRVMociwgInsgWzAsNCkgfSIpOwotICBBU1NFUlRfRVEoci5BZGQoNywgOSksIDJ1KSA8PCByOwotICBBU1NFUlRfRVEoci5BZGQoNSwgNiksIDN1KSA8PCByOwotICBBU1NFUlRfUkFOR0VTKHIsICJ7IFswLDQpIFs1LDYpIFs3LDkpIH0iKTsKLSAgQVNTRVJUX0VRKHIuQWRkKDYsIDcpLCAydSkgPDwgcjsKLSAgQVNTRVJUX1JBTkdFUyhyLCAieyBbMCw0KSBbNSw5KSB9Iik7Ci19Ci0KLVRFU1QoUmFuZ2VzVGVzdCwgRXh0ZW5kUmFuZ2UpIHsKLSAgUmFuZ2VzPGRvdWJsZT4gcjsKLSAgQVNTRVJUX0VRKHIuQWRkKDAsIDEpLCAxdSkgPDwgcjsKLSAgQVNTRVJUX0VRKHIuQWRkKDAuNSwgMS41KSwgMXUpIDw8IHI7Ci0gIEFTU0VSVF9SQU5HRVMociwgInsgWzAsMS41KSB9Iik7Ci0KLSAgci5jbGVhcigpOwotICBBU1NFUlRfRVEoci5BZGQoMCwgMSksIDF1KSA8PCByOwotICBBU1NFUlRfRVEoci5BZGQoLTAuNSwgMC41KSwgMXUpIDw8IHI7Ci0gIEFTU0VSVF9SQU5HRVMociwgInsgWy0wLjUsMSkgfSIpOwotCi0gIHIuY2xlYXIoKTsKLSAgQVNTRVJUX0VRKHIuQWRkKDAsIDEpLCAxdSkgPDwgcjsKLSAgQVNTRVJUX0VRKHIuQWRkKDIsIDMpLCAydSkgPDwgcjsKLSAgQVNTRVJUX0VRKHIuQWRkKDQsIDUpLCAzdSkgPDwgcjsKLSAgQVNTRVJUX0VRKHIuQWRkKDAuNSwgMS41KSwgM3UpIDw8IHI7Ci0gIEFTU0VSVF9SQU5HRVMociwgInsgWzAsMS41KSBbMiwzKSBbNCw1KSB9Iik7Ci0KLSAgci5jbGVhcigpOwotICBBU1NFUlRfRVEoci5BZGQoMCwgMSksIDF1KSA8PCByOwotICBBU1NFUlRfRVEoci5BZGQoMiwgMyksIDJ1KSA8PCByOwotICBBU1NFUlRfRVEoci5BZGQoNCwgNSksIDN1KSA8PCByOwotICBBU1NFUlRfRVEoci5BZGQoMS41LCAyLjUpLCAzdSkgPDwgcjsKLSAgQVNTRVJUX1JBTkdFUyhyLCAieyBbMCwxKSBbMS41LDMpIFs0LDUpIH0iKTsKLX0KLQotVEVTVChSYW5nZXNUZXN0LCBDb2FsZXNjZVJhbmdlcykgewotICBSYW5nZXM8ZG91YmxlPiByOwotICBBU1NFUlRfRVEoci5BZGQoMCwgMSksIDF1KSA8PCByOwotICBBU1NFUlRfRVEoci5BZGQoMiwgMyksIDJ1KSA8PCByOwotICBBU1NFUlRfRVEoci5BZGQoNCwgNSksIDN1KSA8PCByOwotICBBU1NFUlRfRVEoci5BZGQoMC41LCAyLjUpLCAydSkgPDwgcjsKLSAgQVNTRVJUX1JBTkdFUyhyLCAieyBbMCwzKSBbNCw1KSB9Iik7Ci0KLSAgci5jbGVhcigpOwotICBBU1NFUlRfRVEoci5BZGQoMCwgMSksIDF1KSA8PCByOwotICBBU1NFUlRfRVEoci5BZGQoMiwgMyksIDJ1KSA8PCByOwotICBBU1NFUlRfRVEoci5BZGQoNCwgNSksIDN1KSA8PCByOwotICBBU1NFUlRfRVEoci5BZGQoMC41LCA0LjUpLCAxdSkgPDwgcjsKLSAgQVNTRVJUX1JBTkdFUyhyLCAieyBbMCw1KSB9Iik7Ci0KLSAgci5jbGVhcigpOwotICBBU1NFUlRfRVEoci5BZGQoMCwgMSksIDF1KSA8PCByOwotICBBU1NFUlRfRVEoci5BZGQoMSwgMiksIDF1KSA8PCByOwotICBBU1NFUlRfUkFOR0VTKHIsICJ7IFswLDIpIH0iKTsKLX0KLQotVEVTVChSYW5nZXNUZXN0LCBJbnRlcnNlY3Rpb25XaXRoKSB7Ci0gIFJhbmdlczxpbnQ+IGE7Ci0gIFJhbmdlczxpbnQ+IGI7Ci0KLSAgQVNTRVJUX0VRKGEuQWRkKDAsIDEpLCAxdSkgPDwgYTsKLSAgQVNTRVJUX0VRKGEuQWRkKDQsIDcpLCAydSkgPDwgYTsKLSAgQVNTRVJUX0VRKGEuQWRkKDEwLCAxMiksIDN1KSA8PCBhOwotCi0gIC8vIFRlc3QgaW50ZXJzZWN0aW9ucyB3aXRoIGFuIGVtcHR5IHJhbmdlLgotICBBU1NFUlRfUkFOR0VTKGEsICJ7IFswLDEpIFs0LDcpIFsxMCwxMikgfSIpOwotICBBU1NFUlRfUkFOR0VTKGIsICJ7IH0iKTsKLSAgQVNTRVJUX1JBTkdFUyhhLkludGVyc2VjdGlvbldpdGgoYiksICJ7IH0iKTsKLSAgQVNTRVJUX1JBTkdFUyhiLkludGVyc2VjdGlvbldpdGgoYSksICJ7IH0iKTsKLQotICAvLyBUZXN0IGludGVyc2VjdGlvbnMgd2l0aCBhIGNvbXBsZXRlbHkgb3ZlcmxhcGluZyByYW5nZS4KLSAgQVNTRVJUX0VRKGIuQWRkKC0xLCAxMyksIDF1KSA8PCBiOwotICBBU1NFUlRfUkFOR0VTKGEsICJ7IFswLDEpIFs0LDcpIFsxMCwxMikgfSIpOwotICBBU1NFUlRfUkFOR0VTKGIsICJ7IFstMSwxMykgfSIpOwotICBBU1NFUlRfUkFOR0VTKGEuSW50ZXJzZWN0aW9uV2l0aChiKSwgInsgWzAsMSkgWzQsNykgWzEwLDEyKSB9Iik7Ci0gIEFTU0VSVF9SQU5HRVMoYi5JbnRlcnNlY3Rpb25XaXRoKGEpLCAieyBbMCwxKSBbNCw3KSBbMTAsMTIpIH0iKTsKLQotICAvLyBUZXN0IGludGVyc2VjdGlvbnMgd2l0aCBhIGRpc2pvaW50IHJhbmdlcy4KLSAgYi5jbGVhcigpOwotICBBU1NFUlRfRVEoYi5BZGQoMSwgNCksIDF1KSA8PCBiOwotICBBU1NFUlRfRVEoYi5BZGQoOCwgOSksIDJ1KSA8PCBiOwotICBBU1NFUlRfUkFOR0VTKGEsICJ7IFswLDEpIFs0LDcpIFsxMCwxMikgfSIpOwotICBBU1NFUlRfUkFOR0VTKGIsICJ7IFsxLDQpIFs4LDkpIH0iKTsKLSAgQVNTRVJUX1JBTkdFUyhhLkludGVyc2VjdGlvbldpdGgoYiksICJ7IH0iKTsKLSAgQVNTRVJUX1JBTkdFUyhiLkludGVyc2VjdGlvbldpdGgoYSksICJ7IH0iKTsKLQotICAvLyBUZXN0IGludGVyc2VjdGlvbnMgd2l0aCBwYXJ0aWFsbHkgb3ZlcmxhcHBpbmcgcmFuZ2VzLgotICBiLmNsZWFyKCk7Ci0gIEFTU0VSVF9FUShiLkFkZCgwLCAzKSwgMXUpIDw8IGI7Ci0gIEFTU0VSVF9FUShiLkFkZCg1LCAxMSksIDJ1KSA8PCBiOwotICBBU1NFUlRfUkFOR0VTKGEsICJ7IFswLDEpIFs0LDcpIFsxMCwxMikgfSIpOwotICBBU1NFUlRfUkFOR0VTKGIsICJ7IFswLDMpIFs1LDExKSB9Iik7Ci0gIEFTU0VSVF9SQU5HRVMoYS5JbnRlcnNlY3Rpb25XaXRoKGIpLCAieyBbMCwxKSBbNSw3KSBbMTAsMTEpIH0iKTsKLSAgQVNTRVJUX1JBTkdFUyhiLkludGVyc2VjdGlvbldpdGgoYSksICJ7IFswLDEpIFs1LDcpIFsxMCwxMSkgfSIpOwotCi0gIC8vIFRlc3QgaW50ZXJzZWN0aW9uIHdpdGggYSByYW5nZSB0aGF0IHN0YXJ0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAvLyBmaXJzdCByYW5nZSBhbmQgZW5kcyBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IHJhbmdlLgotICBiLmNsZWFyKCk7Ci0gIEFTU0VSVF9FUShiLkFkZCgwLCAxMiksIDF1KSA8PCBiOwotICBBU1NFUlRfUkFOR0VTKGEsICJ7IFswLDEpIFs0LDcpIFsxMCwxMikgfSIpOwotICBBU1NFUlRfUkFOR0VTKGIsICJ7IFswLDEyKSB9Iik7Ci0gIEFTU0VSVF9SQU5HRVMoYS5JbnRlcnNlY3Rpb25XaXRoKGIpLCAieyBbMCwxKSBbNCw3KSBbMTAsMTIpIH0iKTsKLSAgQVNTRVJUX1JBTkdFUyhiLkludGVyc2VjdGlvbldpdGgoYSksICJ7IFswLDEpIFs0LDcpIFsxMCwxMikgfSIpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3J1bl9hbGxfdW5pdHRlc3RzLmNjIGIvc3JjL21lZGlhL2Jhc2UvcnVuX2FsbF91bml0dGVzdHMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NDIxMjQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvcnVuX2FsbF91bml0dGVzdHMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAiYmFzZS90ZXN0L21haW5faG9vay5oIgotI2luY2x1ZGUgImJhc2UvdGVzdC90ZXN0X3N1aXRlLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYS5oIgotCi1jbGFzcyBUZXN0U3VpdGVOb0F0RXhpdCA6IHB1YmxpYyBiYXNlOjpUZXN0U3VpdGUgewotIHB1YmxpYzoKLSAgVGVzdFN1aXRlTm9BdEV4aXQoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSA6IFRlc3RTdWl0ZShhcmdjLCBhcmd2KSB7fQotICB2aXJ0dWFsIH5UZXN0U3VpdGVOb0F0RXhpdCgpIHt9Ci0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZSgpOwotfTsKLQotdm9pZCBUZXN0U3VpdGVOb0F0RXhpdDo6SW5pdGlhbGl6ZSgpIHsKLSAgLy8gUnVuIFRlc3RTdWl0ZTo6SW5pdGlhbGl6ZSBmaXJzdCBzbyB0aGF0IGxvZ2dpbmcgaXMgaW5pdGlhbGl6ZWQuCi0gIGJhc2U6OlRlc3RTdWl0ZTo6SW5pdGlhbGl6ZSgpOwotI2lmICFkZWZpbmVkKF9fTEJfU0hFTExfXykgJiYgIWRlZmluZWQoQ09CQUxUKQotICAvLyBSdW4gdGhpcyBoZXJlIGluc3RlYWQgb2YgbWFpbigpIHRvIGVuc3VyZSBhbiBBdEV4aXRNYW5hZ2VyIGlzIGFscmVhZHkKLSAgLy8gcHJlc2VudC4KLSAgbWVkaWE6OkluaXRpYWxpemVNZWRpYUxpYnJhcnlGb3JUZXN0aW5nKCk7Ci0jZW5kaWYKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gIE1haW5Ib29rIGhvb2sobWFpbiwgYXJnYywgYXJndik7Ci0gIHJldHVybiBUZXN0U3VpdGVOb0F0RXhpdChhcmdjLCBhcmd2KS5SdW4oKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3NhbXBsZV9mb3JtYXQuY2MgYi9zcmMvbWVkaWEvYmFzZS9zYW1wbGVfZm9ybWF0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODI3ZDY5Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3NhbXBsZV9mb3JtYXQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL3NhbXBsZV9mb3JtYXQuaCIKLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1pbnQgU2FtcGxlRm9ybWF0VG9CeXRlc1BlckNoYW5uZWwoU2FtcGxlRm9ybWF0IHNhbXBsZV9mb3JtYXQpIHsKLSAgc3dpdGNoIChzYW1wbGVfZm9ybWF0KSB7Ci0gICAgY2FzZSBrVW5rbm93blNhbXBsZUZvcm1hdDoKLSAgICAgIHJldHVybiAwOwotICAgIGNhc2Uga1NhbXBsZUZvcm1hdFU4OgotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBrU2FtcGxlRm9ybWF0UzE2OgotICAgIGNhc2Uga1NhbXBsZUZvcm1hdFBsYW5hclMxNjoKLSAgICAgIHJldHVybiAyOwotICAgIGNhc2Uga1NhbXBsZUZvcm1hdFMzMjoKLSAgICBjYXNlIGtTYW1wbGVGb3JtYXRGMzI6Ci0gICAgY2FzZSBrU2FtcGxlRm9ybWF0UGxhbmFyRjMyOgotICAgICAgcmV0dXJuIDQ7Ci0gIH0KLQotICBOT1RSRUFDSEVEKCkgPDwgIkludmFsaWQgc2FtcGxlIGZvcm1hdCBwcm92aWRlZDogIiA8PCBzYW1wbGVfZm9ybWF0OwotICByZXR1cm4gMDsKLX0KLQotY29uc3QgY2hhciogU2FtcGxlRm9ybWF0VG9TdHJpbmcoU2FtcGxlRm9ybWF0IHNhbXBsZV9mb3JtYXQpIHsKLSAgc3dpdGNoKHNhbXBsZV9mb3JtYXQpIHsKLSAgICBjYXNlIGtVbmtub3duU2FtcGxlRm9ybWF0OgotICAgICAgcmV0dXJuICJVbmtub3duIHNhbXBsZSBmb3JtYXQiOwotICAgIGNhc2Uga1NhbXBsZUZvcm1hdFU4OgotICAgICAgcmV0dXJuICJVbnNpZ25lZCA4LWJpdCB3aXRoIGJpYXMgb2YgMTI4IjsKLSAgICBjYXNlIGtTYW1wbGVGb3JtYXRTMTY6Ci0gICAgICByZXR1cm4gIlNpZ25lZCAxNi1iaXQiOwotICAgIGNhc2Uga1NhbXBsZUZvcm1hdFMzMjoKLSAgICAgIHJldHVybiAiU2lnbmVkIDMyLWJpdCI7Ci0gICAgY2FzZSBrU2FtcGxlRm9ybWF0RjMyOgotICAgICAgcmV0dXJuICJGbG9hdCAzMi1iaXQiOwotICAgIGNhc2Uga1NhbXBsZUZvcm1hdFBsYW5hclMxNjoKLSAgICAgIHJldHVybiAiU2lnbmVkIDE2LWJpdCBwbGFuYXIiOwotICAgIGNhc2Uga1NhbXBsZUZvcm1hdFBsYW5hckYzMjoKLSAgICAgIHJldHVybiAiRmxvYXQgMzItYml0IHBsYW5hciI7Ci0gIH0KLSAgTk9UUkVBQ0hFRCgpIDw8ICJJbnZhbGlkIHNhbXBsZSBmb3JtYXQgcHJvdmlkZWQ6ICIgPDwgc2FtcGxlX2Zvcm1hdDsKLSAgcmV0dXJuICIiOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2Uvc2FtcGxlX2Zvcm1hdC5oIGIvc3JjL21lZGlhL2Jhc2Uvc2FtcGxlX2Zvcm1hdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDZiYzhlLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3NhbXBsZV9mb3JtYXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEzIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9CQVNFX1NBTVBMRV9GT1JNQVRfSAotI2RlZmluZSBNRURJQV9CQVNFX1NBTVBMRV9GT1JNQVRfSAotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotZW51bSBTYW1wbGVGb3JtYXQgewotICAvLyBUaGVzZSB2YWx1ZXMgYXJlIGhpc3RvZ3JhbW1lZCBvdmVyIHRpbWU7IGRvIG5vdCBjaGFuZ2UgdGhlaXIgb3JkaW5hbAotICAvLyB2YWx1ZXMuICBXaGVuIGRlbGV0aW5nIGEgc2FtcGxlIGZvcm1hdCByZXBsYWNlIGl0IHdpdGggYSBkdW1teSB2YWx1ZTsgd2hlbgotICAvLyBhZGRpbmcgYSBzYW1wbGUgZm9ybWF0LCBkbyBzbyBhdCB0aGUgYm90dG9tIGJlZm9yZSBrU2FtcGxlRm9ybWF0TWF4LCBhbmQKLSAgLy8gdXBkYXRlIHRoZSB2YWx1ZSBvZiBrU2FtcGxlRm9ybWF0TWF4LgotICBrVW5rbm93blNhbXBsZUZvcm1hdCA9IDAsCi0gIGtTYW1wbGVGb3JtYXRVOCwgICAgICAgICAvLyBVbnNpZ25lZCA4LWJpdCB3LyBiaWFzIG9mIDEyOC4KLSAga1NhbXBsZUZvcm1hdFMxNiwgICAgICAgIC8vIFNpZ25lZCAxNi1iaXQuCi0gIGtTYW1wbGVGb3JtYXRTMzIsICAgICAgICAvLyBTaWduZWQgMzItYml0LgotICBrU2FtcGxlRm9ybWF0RjMyLCAgICAgICAgLy8gRmxvYXQgMzItYml0LgotICBrU2FtcGxlRm9ybWF0UGxhbmFyUzE2LCAgLy8gU2lnbmVkIDE2LWJpdCBwbGFuYXIuCi0gIGtTYW1wbGVGb3JtYXRQbGFuYXJGMzIsICAvLyBGbG9hdCAzMi1iaXQgcGxhbmFyLgotCi0gIC8vIE11c3QgYWx3YXlzIGJlIGVxdWFsIHRvIGxhcmdlc3QgdmFsdWUgZXZlciBsb2dnZWQuCi0gIGtTYW1wbGVGb3JtYXRNYXggPSBrU2FtcGxlRm9ybWF0UGxhbmFyRjMyLAotfTsKLQotLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgcGVyIGNoYW5uZWwgZm9yIHRoZSBzcGVjaWZpZWQKLS8vIHxzYW1wbGVfZm9ybWF0fC4KLU1FRElBX0VYUE9SVCBpbnQgU2FtcGxlRm9ybWF0VG9CeXRlc1BlckNoYW5uZWwoU2FtcGxlRm9ybWF0IHNhbXBsZV9mb3JtYXQpOwotCi0vLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBzYW1wbGUgZm9ybWF0IGFzIGEgc3RyaW5nCi1NRURJQV9FWFBPUlQgY29uc3QgY2hhciogU2FtcGxlRm9ybWF0VG9TdHJpbmcoU2FtcGxlRm9ybWF0IHNhbXBsZV9mb3JtYXQpOwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX1NBTVBMRV9GT1JNQVRfSAotCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9zZWVrYWJsZV9idWZmZXIuY2MgYi9zcmMvbWVkaWEvYmFzZS9zZWVrYWJsZV9idWZmZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YzA4NTguLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2Uvc2Vla2FibGVfYnVmZmVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL3NlZWthYmxlX2J1ZmZlci5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kYXRhX2J1ZmZlci5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1TZWVrYWJsZUJ1ZmZlcjo6U2Vla2FibGVCdWZmZXIoaW50IGJhY2t3YXJkX2NhcGFjaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3J3YXJkX2NhcGFjaXR5KQotICAgIDogY3VycmVudF9idWZmZXJfb2Zmc2V0XygwKSwKLSAgICAgIGJhY2t3YXJkX2NhcGFjaXR5XyhiYWNrd2FyZF9jYXBhY2l0eSksCi0gICAgICBiYWNrd2FyZF9ieXRlc18oMCksCi0gICAgICBmb3J3YXJkX2NhcGFjaXR5Xyhmb3J3YXJkX2NhcGFjaXR5KSwKLSAgICAgIGZvcndhcmRfYnl0ZXNfKDApLAotICAgICAgY3VycmVudF90aW1lXyhrTm9UaW1lc3RhbXAoKSkgewotICBjdXJyZW50X2J1ZmZlcl8gPSBidWZmZXJzXy5iZWdpbigpOwotfQotCi1TZWVrYWJsZUJ1ZmZlcjo6flNlZWthYmxlQnVmZmVyKCkgewotfQotCi12b2lkIFNlZWthYmxlQnVmZmVyOjpDbGVhcigpIHsKLSAgYnVmZmVyc18uY2xlYXIoKTsKLSAgY3VycmVudF9idWZmZXJfID0gYnVmZmVyc18uYmVnaW4oKTsKLSAgY3VycmVudF9idWZmZXJfb2Zmc2V0XyA9IDA7Ci0gIGJhY2t3YXJkX2J5dGVzXyA9IDA7Ci0gIGZvcndhcmRfYnl0ZXNfID0gMDsKLSAgY3VycmVudF90aW1lXyA9IGtOb1RpbWVzdGFtcCgpOwotfQotCi1pbnQgU2Vla2FibGVCdWZmZXI6OlJlYWQodWludDgqIGRhdGEsIGludCBzaXplKSB7Ci0gIERDSEVDSyhkYXRhKTsKLSAgcmV0dXJuIEludGVybmFsUmVhZChkYXRhLCBzaXplLCB0cnVlLCAwKTsKLX0KLQotaW50IFNlZWthYmxlQnVmZmVyOjpQZWVrKHVpbnQ4KiBkYXRhLCBpbnQgc2l6ZSwgaW50IGZvcndhcmRfb2Zmc2V0KSB7Ci0gIERDSEVDSyhkYXRhKTsKLSAgcmV0dXJuIEludGVybmFsUmVhZChkYXRhLCBzaXplLCBmYWxzZSwgZm9yd2FyZF9vZmZzZXQpOwotfQotCi1ib29sIFNlZWthYmxlQnVmZmVyOjpHZXRDdXJyZW50Q2h1bmsoY29uc3QgdWludDgqKiBkYXRhLCBpbnQqIHNpemUpIGNvbnN0IHsKLSAgQnVmZmVyUXVldWU6Oml0ZXJhdG9yIGN1cnJlbnRfYnVmZmVyID0gY3VycmVudF9idWZmZXJfOwotICBpbnQgY3VycmVudF9idWZmZXJfb2Zmc2V0ID0gY3VycmVudF9idWZmZXJfb2Zmc2V0XzsKLSAgLy8gQWR2YW5jZSBwb3NpdGlvbiBpZiB3ZSBhcmUgaW4gdGhlIGVuZCBvZiB0aGUgY3VycmVudCBidWZmZXIuCi0gIHdoaWxlIChjdXJyZW50X2J1ZmZlciAhPSBidWZmZXJzXy5lbmQoKSAmJgotICAgICAgICAgY3VycmVudF9idWZmZXJfb2Zmc2V0ID49ICgqY3VycmVudF9idWZmZXIpLT5HZXREYXRhU2l6ZSgpKSB7Ci0gICAgKytjdXJyZW50X2J1ZmZlcjsKLSAgICBjdXJyZW50X2J1ZmZlcl9vZmZzZXQgPSAwOwotICB9Ci0gIGlmIChjdXJyZW50X2J1ZmZlciA9PSBidWZmZXJzXy5lbmQoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gICpkYXRhID0gKCpjdXJyZW50X2J1ZmZlciktPkdldERhdGEoKSArIGN1cnJlbnRfYnVmZmVyX29mZnNldDsKLSAgKnNpemUgPSAoKmN1cnJlbnRfYnVmZmVyKS0+R2V0RGF0YVNpemUoKSAtIGN1cnJlbnRfYnVmZmVyX29mZnNldDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU2Vla2FibGVCdWZmZXI6OkFwcGVuZChCdWZmZXIqIGJ1ZmZlcl9pbikgewotICBpZiAoYnVmZmVyc18uZW1wdHkoKSAmJiBidWZmZXJfaW4tPkdldFRpbWVzdGFtcCgpICE9IGtOb1RpbWVzdGFtcCgpKSB7Ci0gICAgY3VycmVudF90aW1lXyA9IGJ1ZmZlcl9pbi0+R2V0VGltZXN0YW1wKCk7Ci0gIH0KLQotICAvLyBTaW5jZSB0aGUgZm9yd2FyZCBjYXBhY2l0eSBpcyBvbmx5IHVzZWQgdG8gY2hlY2sgdGhlIGNyaXRlcmlhIGZvciBidWZmZXIKLSAgLy8gZnVsbCwgd2UgYWx3YXlzIGFwcGVuZCBkYXRhIHRvIHRoZSBidWZmZXIuCi0gIGJ1ZmZlcnNfLnB1c2hfYmFjayhzY29wZWRfcmVmcHRyPEJ1ZmZlcj4oYnVmZmVyX2luKSk7Ci0KLSAgLy8gQWZ0ZXIgd2UgaGF2ZSB3cml0dGVuIHRoZSBmaXJzdCBidWZmZXIsIHVwZGF0ZSB8Y3VycmVudF9idWZmZXJffCB0byBwb2ludAotICAvLyB0byBpdC4KLSAgaWYgKGN1cnJlbnRfYnVmZmVyXyA9PSBidWZmZXJzXy5lbmQoKSkgewotICAgIERDSEVDS19FUSgwLCBmb3J3YXJkX2J5dGVzXyk7Ci0gICAgY3VycmVudF9idWZmZXJfID0gYnVmZmVyc18uYmVnaW4oKTsKLSAgfQotCi0gIC8vIFVwZGF0ZSB0aGUgfGZvcndhcmRfYnl0ZXNffCBjb3VudGVyIHNpbmNlIHdlIGhhdmUgbW9yZSBieXRlcy4KLSAgZm9yd2FyZF9ieXRlc18gKz0gYnVmZmVyX2luLT5HZXREYXRhU2l6ZSgpOwotCi0gIC8vIEFkdmlzZSB0aGUgdXNlciB0byBzdG9wIGFwcGVuZCBpZiB0aGUgYW1vdW50IG9mIGZvcndhcmQgYnl0ZXMgZXhjZWVkcwotICAvLyB0aGUgZm9yd2FyZCBjYXBhY2l0eS4gQSBmYWxzZSByZXR1cm4gdmFsdWUgbWVhbnMgdGhlIHVzZXIgc2hvdWxkIHN0b3AKLSAgLy8gYXBwZW5kaW5nIG1vcmUgZGF0YSB0byB0aGlzIGJ1ZmZlci4KLSAgaWYgKGZvcndhcmRfYnl0ZXNfID49IGZvcndhcmRfY2FwYWNpdHlfKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU2Vla2FibGVCdWZmZXI6OkFwcGVuZChjb25zdCB1aW50OCogZGF0YSwgaW50IHNpemUpIHsKLSAgaWYgKHNpemUgPiAwKSB7Ci0gICAgRGF0YUJ1ZmZlciogZGF0YV9idWZmZXIgPSBuZXcgRGF0YUJ1ZmZlcihkYXRhLCBzaXplKTsKLSAgICByZXR1cm4gQXBwZW5kKGRhdGFfYnVmZmVyKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIGZvcndhcmQgY2FwYWNpdHkuCi0gICAgcmV0dXJuIGZvcndhcmRfYnl0ZXNfIDwgZm9yd2FyZF9jYXBhY2l0eV87Ci0gIH0KLX0KLQotYm9vbCBTZWVrYWJsZUJ1ZmZlcjo6U2VlayhpbnQzMiBvZmZzZXQpIHsKLSAgaWYgKG9mZnNldCA+IDApCi0gICAgcmV0dXJuIFNlZWtGb3J3YXJkKG9mZnNldCk7Ci0gIGVsc2UgaWYgKG9mZnNldCA8IDApCi0gICAgcmV0dXJuIFNlZWtCYWNrd2FyZCgtb2Zmc2V0KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU2Vla2FibGVCdWZmZXI6OlNlZWtGb3J3YXJkKGludCBzaXplKSB7Ci0gIC8vIFBlcmZvcm0gc2Vla2luZyBmb3J3YXJkIG9ubHkgaWYgd2UgaGF2ZSBlbm91Z2ggYnl0ZXMgaW4gdGhlIHF1ZXVlLgotICBpZiAoc2l6ZSA+IGZvcndhcmRfYnl0ZXNfKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvLyBEbyBhIHJlYWQgb2YgfHNpemV8IGJ5dGVzLgotICBpbnQgdGFrZW4gPSBJbnRlcm5hbFJlYWQoTlVMTCwgc2l6ZSwgdHJ1ZSwgMCk7Ci0gIERDSEVDS19FUSh0YWtlbiwgc2l6ZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFNlZWthYmxlQnVmZmVyOjpTZWVrQmFja3dhcmQoaW50IHNpemUpIHsKLSAgaWYgKHNpemUgPiBiYWNrd2FyZF9ieXRlc18pCi0gICAgcmV0dXJuIGZhbHNlOwotICAvLyBSZWNvcmQgdGhlIG51bWJlciBvZiBieXRlcyB0YWtlbi4KLSAgaW50IHRha2VuID0gMDsKLSAgLy8gTG9vcCB1bnRpbCB3ZSB0YWtlbiBlbm91Z2ggYnl0ZXMgYW5kIHJld2luZCBieSB0aGUgZGVzaXJlZCB8c2l6ZXwuCi0gIHdoaWxlICh0YWtlbiA8IHNpemUpIHsKLSAgICAvLyB8Y3VycmVudF9idWZmZXJffCBjYW4gbmV2ZXIgYmUgaW52YWxpZCB3aGVuIHdlIGFyZSBpbiB0aGlzIGxvb3AuIEl0IGNhbgotICAgIC8vIG9ubHkgYmUgaW52YWxpZCBiZWZvcmUgYW55IGRhdGEgaXMgYXBwZW5kZWQuIFRoZSBpbnZhbGlkIGNhc2Ugc2hvdWxkIGJlCi0gICAgLy8gaGFuZGxlZCBieSBjaGVja3MgYmVmb3JlIHdlIGVudGVyIHRoaXMgbG9vcC4KLSAgICBEQ0hFQ0soY3VycmVudF9idWZmZXJfICE9IGJ1ZmZlcnNfLmVuZCgpKTsKLQotICAgIC8vIFdlIHRyeSB0byBjb25zdW1lIGF0IG1vc3QgfHNpemV8IGJ5dGVzIGluIHRoZSBiYWNrd2FyZCBkaXJlY3Rpb24uIFdlIGFsc28KLSAgICAvLyBoYXZlIHRvIGFjY291bnQgZm9yIHRoZSBvZmZzZXQgd2UgYXJlIGluIHRoZSBjdXJyZW50IGJ1ZmZlciwgc28gdGFrZSB0aGUKLSAgICAvLyBtaW5pbXVtIGJldHdlZW4gdGhlIHR3byB0byBkZXRlcm1pbmUgdGhlIGFtb3VudCBvZiBieXRlcyB0byB0YWtlIGZyb20gdGhlCi0gICAgLy8gY3VycmVudCBidWZmZXIuCi0gICAgaW50IGNvbnN1bWVkID0gc3RkOjptaW4oc2l6ZSAtIHRha2VuLCBjdXJyZW50X2J1ZmZlcl9vZmZzZXRfKTsKLQotICAgIC8vIERlY3JlYXNlcyB0aGUgb2Zmc2V0IGluIHRoZSBjdXJyZW50IGJ1ZmZlciBzaW5jZSB3ZSBhcmUgcmV3aW5kaW5nLgotICAgIGN1cnJlbnRfYnVmZmVyX29mZnNldF8gLT0gY29uc3VtZWQ7Ci0KLSAgICAvLyBJbmNyZWFzZSB0aGUgYW1vdW50IG9mIGJ5dGVzIHRha2VuIGluIHRoZSBiYWNrd2FyZCBkaXJlY3Rpb24uIFRoaXMKLSAgICAvLyBkZXRlcm1pbmVzIHdoZW4gdG8gc3RvcCB0aGUgbG9vcC4KLSAgICB0YWtlbiArPSBjb25zdW1lZDsKLQotICAgIC8vIEZvcndhcmQgYnl0ZXMgaW5jcmVhc2VzIGFuZCBiYWNrd2FyZCBieXRlcyBkZWNyZWFzZXMgYnkgdGhlIGFtb3VudAotICAgIC8vIGNvbnN1bWVkIGluIHRoZSBjdXJyZW50IGJ1ZmZlci4KLSAgICBmb3J3YXJkX2J5dGVzXyArPSBjb25zdW1lZDsKLSAgICBiYWNrd2FyZF9ieXRlc18gLT0gY29uc3VtZWQ7Ci0gICAgRENIRUNLX0dFKGJhY2t3YXJkX2J5dGVzXywgMCk7Ci0KLSAgICAvLyBUaGUgY3VycmVudCBidWZmZXIgcG9pbnRlZCBieSBjdXJyZW50IGl0ZXJhdG9yIGhhcyBiZWVuIGNvbnN1bWVkLiBNb3ZlCi0gICAgLy8gdGhlIGl0ZXJhdG9yIGJhY2t3YXJkIHNvIGl0IHBvaW50cyB0byB0aGUgcHJldmlvdXMgYnVmZmVyLgotICAgIGlmIChjdXJyZW50X2J1ZmZlcl9vZmZzZXRfID09IDApIHsKLSAgICAgIGlmIChjdXJyZW50X2J1ZmZlcl8gPT0gYnVmZmVyc18uYmVnaW4oKSkKLSAgICAgICAgYnJlYWs7Ci0gICAgICAvLyBNb3ZlIHRoZSBpdGVyYXRvciBiYWNrd2FyZC4KLSAgICAgIC0tY3VycmVudF9idWZmZXJfOwotICAgICAgLy8gU2V0IHRoZSBvZmZzZXQgaW50byB0aGUgY3VycmVudCBidWZmZXIgdG8gYmUgdGhlIGJ1ZmZlciBzaXplIGFzIHdlCi0gICAgICAvLyBhcmUgcHJlcGFyaW5nIGZvciByZXdpbmQgZm9yIG5leHQgaXRlcmF0aW9uLgotICAgICAgY3VycmVudF9idWZmZXJfb2Zmc2V0XyA9ICgqY3VycmVudF9idWZmZXJfKS0+R2V0RGF0YVNpemUoKTsKLSAgICB9Ci0gIH0KLQotICBVcGRhdGVDdXJyZW50VGltZShjdXJyZW50X2J1ZmZlcl8sIGN1cnJlbnRfYnVmZmVyX29mZnNldF8pOwotCi0gIERDSEVDS19FUSh0YWtlbiwgc2l6ZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFNlZWthYmxlQnVmZmVyOjpFdmljdEJhY2t3YXJkQnVmZmVycygpIHsKLSAgLy8gQWR2YW5jZXMgdGhlIGl0ZXJhdG9yIHVudGlsIHdlIGhpdCB0aGUgY3VycmVudCBwb2ludGVyLgotICB3aGlsZSAoYmFja3dhcmRfYnl0ZXNfID4gYmFja3dhcmRfY2FwYWNpdHlfKSB7Ci0gICAgQnVmZmVyUXVldWU6Oml0ZXJhdG9yIGkgPSBidWZmZXJzXy5iZWdpbigpOwotICAgIGlmIChpID09IGN1cnJlbnRfYnVmZmVyXykKLSAgICAgIGJyZWFrOwotICAgIHNjb3BlZF9yZWZwdHI8QnVmZmVyPiBidWZmZXIgPSAqaTsKLSAgICBiYWNrd2FyZF9ieXRlc18gLT0gYnVmZmVyLT5HZXREYXRhU2l6ZSgpOwotICAgIERDSEVDS19HRShiYWNrd2FyZF9ieXRlc18sIDApOwotCi0gICAgYnVmZmVyc18uZXJhc2UoaSk7Ci0gIH0KLX0KLQotaW50IFNlZWthYmxlQnVmZmVyOjpJbnRlcm5hbFJlYWQodWludDgqIGRhdGEsIGludCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhZHZhbmNlX3Bvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcndhcmRfb2Zmc2V0KSB7Ci0gIC8vIENvdW50cyBob3cgbWFueSBieXRlcyBhcmUgYWN0dWFsbHkgcmVhZCBmcm9tIHRoZSBidWZmZXIgcXVldWUuCi0gIGludCB0YWtlbiA9IDA7Ci0KLSAgQnVmZmVyUXVldWU6Oml0ZXJhdG9yIGN1cnJlbnRfYnVmZmVyID0gY3VycmVudF9idWZmZXJfOwotICBpbnQgY3VycmVudF9idWZmZXJfb2Zmc2V0ID0gY3VycmVudF9idWZmZXJfb2Zmc2V0XzsKLQotICBpbnQgYnl0ZXNfdG9fc2tpcCA9IGZvcndhcmRfb2Zmc2V0OwotICB3aGlsZSAodGFrZW4gPCBzaXplKSB7Ci0gICAgLy8gfGN1cnJlbnRfYnVmZmVyfCBpcyB2YWxpZCBzaW5jZSB0aGUgZmlyc3QgdGltZSB0aGlzIGJ1ZmZlciBpcyBhcHBlbmRlZAotICAgIC8vIHdpdGggZGF0YS4KLSAgICBpZiAoY3VycmVudF9idWZmZXIgPT0gYnVmZmVyc18uZW5kKCkpCi0gICAgICBicmVhazsKLQotICAgIHNjb3BlZF9yZWZwdHI8QnVmZmVyPiBidWZmZXIgPSAqY3VycmVudF9idWZmZXI7Ci0KLSAgICBpbnQgcmVtYWluaW5nX2J5dGVzX2luX2J1ZmZlciA9Ci0gICAgICAgIGJ1ZmZlci0+R2V0RGF0YVNpemUoKSAtIGN1cnJlbnRfYnVmZmVyX29mZnNldDsKLQotICAgIGlmIChieXRlc190b19za2lwID09IDApIHsKLSAgICAgIC8vIEZpbmQgdGhlIHJpZ2h0IGFtb3VudCB0byBjb3B5IGZyb20gdGhlIGN1cnJlbnQgYnVmZmVyIHJlZmVyZW5jZWQgYnkKLSAgICAgIC8vIHxidWZmZXJ8LiBXZSBzaGFsbCBjb3B5IG5vIG1vcmUgdGhhbiB8c2l6ZXwgYnl0ZXMgaW4gdG90YWwgYW5kIGVhY2gKLSAgICAgIC8vIHNpbmdsZSBzdGVwIGNvcGllZCBubyBtb3JlIHRoYW4gdGhlIGN1cnJlbnQgYnVmZmVyIHNpemUuCi0gICAgICBpbnQgY29waWVkID0gc3RkOjptaW4oc2l6ZSAtIHRha2VuLCByZW1haW5pbmdfYnl0ZXNfaW5fYnVmZmVyKTsKLQotICAgICAgLy8gfGRhdGF8IGlzIE5VTEwgaWYgd2UgYXJlIHNlZWtpbmcgZm9yd2FyZCwgc28gdGhlcmUncyBubyBuZWVkIHRvIGNvcHkuCi0gICAgICBpZiAoZGF0YSkKLSAgICAgICAgbWVtY3B5KGRhdGEgKyB0YWtlbiwgYnVmZmVyLT5HZXREYXRhKCkgKyBjdXJyZW50X2J1ZmZlcl9vZmZzZXQsIGNvcGllZCk7Ci0KLSAgICAgIC8vIEluY3JlYXNlIHRvdGFsIG51bWJlciBvZiBieXRlcyBjb3BpZWQsIHdoaWNoIHJlZ3VsYXRlcyB3aGVuIHRvIGVuZCB0aGlzCi0gICAgICAvLyBsb29wLgotICAgICAgdGFrZW4gKz0gY29waWVkOwotCi0gICAgICAvLyBXZSBoYXZlIHJlYWQgfGNvcGllZHwgYnl0ZXMgZnJvbSB0aGUgY3VycmVudCBidWZmZXIuIEFkdmFuY2VzIHRoZQotICAgICAgLy8gb2Zmc2V0LgotICAgICAgY3VycmVudF9idWZmZXJfb2Zmc2V0ICs9IGNvcGllZDsKLSAgICB9IGVsc2UgewotICAgICAgaW50IHNraXBwZWQgPSBzdGQ6Om1pbihyZW1haW5pbmdfYnl0ZXNfaW5fYnVmZmVyLCBieXRlc190b19za2lwKTsKLSAgICAgIGN1cnJlbnRfYnVmZmVyX29mZnNldCArPSBza2lwcGVkOwotICAgICAgYnl0ZXNfdG9fc2tpcCAtPSBza2lwcGVkOwotICAgIH0KLQotICAgIC8vIFRoZSBidWZmZXIgaGFzIGJlZW4gY29uc3VtZWQuCi0gICAgaWYgKGN1cnJlbnRfYnVmZmVyX29mZnNldCA9PSBidWZmZXItPkdldERhdGFTaXplKCkpIHsKLSAgICAgIGlmIChhZHZhbmNlX3Bvc2l0aW9uKSB7Ci0gICAgICAgIC8vIE5leHQgYnVmZmVyIG1heSBub3QgaGF2ZSB0aW1lc3RhbXAsIHNvIHdlIG5lZWQgdG8gdXBkYXRlIGN1cnJlbnQKLSAgICAgICAgLy8gdGltZXN0YW1wIGJlZm9yZSBzd2l0Y2hpbmcgdG8gdGhlIG5leHQgYnVmZmVyLgotICAgICAgICBVcGRhdGVDdXJyZW50VGltZShjdXJyZW50X2J1ZmZlciwgY3VycmVudF9idWZmZXJfb2Zmc2V0KTsKLSAgICAgIH0KLQotICAgICAgQnVmZmVyUXVldWU6Oml0ZXJhdG9yIG5leHQgPSBjdXJyZW50X2J1ZmZlcjsKLSAgICAgICsrbmV4dDsKLSAgICAgIC8vIElmIHdlIGFyZSBhdCB0aGUgbGFzdCBidWZmZXIsIGRvbid0IGFkdmFuY2UuCi0gICAgICBpZiAobmV4dCA9PSBidWZmZXJzXy5lbmQoKSkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIC8vIEFkdmFuY2VzIHRoZSBpdGVyYXRvci4KLSAgICAgIGN1cnJlbnRfYnVmZmVyID0gbmV4dDsKLSAgICAgIGN1cnJlbnRfYnVmZmVyX29mZnNldCA9IDA7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGFkdmFuY2VfcG9zaXRpb24pIHsKLSAgICAvLyBXZSBoYXZlIGxlc3MgZm9yd2FyZCBieXRlcyBhbmQgbW9yZSBiYWNrd2FyZCBieXRlcy4gVXBkYXRlcyB0aGVzZQotICAgIC8vIGNvdW50ZXJzIGJ5IHx0YWtlbnwuCi0gICAgZm9yd2FyZF9ieXRlc18gLT0gdGFrZW47Ci0gICAgYmFja3dhcmRfYnl0ZXNfICs9IHRha2VuOwotICAgIERDSEVDS19HRShmb3J3YXJkX2J5dGVzXywgMCk7Ci0gICAgRENIRUNLKGN1cnJlbnRfYnVmZmVyXyAhPSBidWZmZXJzXy5lbmQoKSB8fCBmb3J3YXJkX2J5dGVzXyA9PSAwKTsKLQotICAgIGN1cnJlbnRfYnVmZmVyXyA9IGN1cnJlbnRfYnVmZmVyOwotICAgIGN1cnJlbnRfYnVmZmVyX29mZnNldF8gPSBjdXJyZW50X2J1ZmZlcl9vZmZzZXQ7Ci0KLSAgICBVcGRhdGVDdXJyZW50VGltZShjdXJyZW50X2J1ZmZlcl8sIGN1cnJlbnRfYnVmZmVyX29mZnNldF8pOwotICAgIEV2aWN0QmFja3dhcmRCdWZmZXJzKCk7Ci0gIH0KLQotICByZXR1cm4gdGFrZW47Ci19Ci0KLXZvaWQgU2Vla2FibGVCdWZmZXI6OlVwZGF0ZUN1cnJlbnRUaW1lKEJ1ZmZlclF1ZXVlOjppdGVyYXRvciBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0KSB7Ci0gIC8vIEdhcmJhZ2UgdmFsdWVzIGFyZSB1bmF2b2lkYWJsZSwgc28gdGhpcyBjaGVjayB3aWxsIHJlbWFpbi4KLSAgaWYgKGJ1ZmZlciAhPSBidWZmZXJzXy5lbmQoKSAmJiAoKmJ1ZmZlciktPkdldFRpbWVzdGFtcCgpICE9IGtOb1RpbWVzdGFtcCgpKSB7Ci0gICAgaW50NjQgdGltZV9vZmZzZXQgPSAoKCpidWZmZXIpLT5HZXREdXJhdGlvbigpLkluTWljcm9zZWNvbmRzKCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCkgLyAoKmJ1ZmZlciktPkdldERhdGFTaXplKCk7Ci0KLSAgICBjdXJyZW50X3RpbWVfID0gKCpidWZmZXIpLT5HZXRUaW1lc3RhbXAoKSArCi0gICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pY3Jvc2Vjb25kcyh0aW1lX29mZnNldCk7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9zZWVrYWJsZV9idWZmZXIuaCBiL3NyYy9tZWRpYS9iYXNlL3NlZWthYmxlX2J1ZmZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTNmZjcyLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3NlZWthYmxlX2J1ZmZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIFNlZWthYmxlQnVmZmVyIHRvIHN1cHBvcnQgYmFja3dhcmQgYW5kIGZvcndhcmQgc2Vla2luZyBpbiBhIGJ1ZmZlciBmb3IKLS8vIHJlYWRpbmcgYSBtZWRpYSBkYXRhIHNvdXJjZS4KLS8vCi0vLyBJbiBvcmRlciB0byBzdXBwb3J0IGJhY2t3YXJkIGFuZCBmb3J3YXJkIHNlZWtpbmcsIHRoaXMgY2xhc3MgYnVmZmVycyBkYXRhIGluCi0vLyBib3RoIGJhY2t3YXJkIGFuZCBmb3J3YXJkIGRpcmVjdGlvbnMsIHRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24gY2FuIGJlIHJlc2V0Ci0vLyB0byBhbnl3aGVyZSBpbiB0aGUgYnVmZmVyZWQgZGF0YS4KLS8vCi0vLyBUaGUgYW1vdW50IG9mIGRhdGEgYnVmZmVyZWQgaXMgcmVndWxhdGVkIGJ5IHR3byB2YXJpYWJsZXMgYXQgY29uc3RydWN0aW9uLAotLy8gfGJhY2t3YXJkX2NhcGFjaXR5fCBhbmQgfGZvcndhcmRfY2FwYWNpdHl8LgotLy8KLS8vIEluIHRoZSBjYXNlIG9mIHJlYWRpbmcgYW5kIHNlZWtpbmcgZm9yd2FyZCwgdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbgotLy8gYWR2YW5jZXMgYW5kIHRoZXJlIHdpbGwgYmUgbW9yZSBkYXRhIGluIHRoZSBiYWNrd2FyZCBkaXJlY3Rpb24uIElmIGJhY2t3YXJkCi0vLyBieXRlcyBleGNlZWRzIHxiYWNrd2FyZF9jYXBhY2l0eXwsIHRoZSBleGNlZWRpbmcgYnl0ZXMgYXJlIGV2aWN0ZWQgYW5kIHRodXMKLS8vIGJhY2t3YXJkX2J5dGVzKCkgd2lsbCBhbHdheXMgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHxiYWNrd2FyZF9jYXBhY2l0eXwuCi0vLyBUaGUgZXZpY3Rpb24gd2lsbCBiZSBjYXVzZWQgYnkgUmVhZCgpIGFuZCBTZWVrKCkgaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uIGFuZAotLy8gaXMgZG9uZSBpbnRlcm5hbGx5IHdoZW4gdGhlIG1lbnRpb25lZCBjcml0ZXJpYSBpcyBmdWxmaWxsZWQuCi0vLwotLy8gSW4gdGhlIGNhc2Ugb2YgYXBwZW5kaW5nIGRhdGEgdG8gdGhlIGJ1ZmZlciwgdGhlcmUgaXMgYW4gYWR2aXNvcnkgbGltaXQgb2YKLS8vIGhvdyBtYW55IGJ5dGVzIGNhbiBiZSBrZXB0IGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbiwgcmVndWxhdGVkIGJ5Ci0vLyB8Zm9yd2FyZF9jYXBhY2l0eXwuIFRoZSBhcHBlbmQgb3BlcmF0aW9uIChieSBjYWxsaW5nIEFwcGVuZCgpKSB0aGF0IGNhdXNlZAotLy8gZm9yd2FyZCBieXRlcyB0byBleGNlZWQgfGZvcndhcmRfY2FwYWNpdHl8IHdpbGwgaGF2ZSBhIHJldHVybiB2YWx1ZSB0aGF0Ci0vLyBhZHZpc2VzIGEgaGFsdCBvZiBhcHBlbmQgb3BlcmF0aW9uLCBmdXJ0aGVyIGFwcGVuZCBvcGVyYXRpb25zIGFyZSBhbGxvd2VkIGJ1dAotLy8gYXJlIG5vdCBhZHZpc2VkLiBTaW5jZSB0aGlzIGNsYXNzIGlzIHVzZWQgYXMgYSBiYWNrZW5kIGJ1ZmZlciBmb3IgY2FjaGluZwotLy8gbWVkaWEgZmlsZXMgZG93bmxvYWRlZCBmcm9tIG5ldHdvcmsgd2UgY2Fubm90IGFmZm9yZCBsb3NpbmcgZGF0YSwgd2UgY2FuCi0vLyBvbmx5IGFkdmlzZSBhIGhhbHQgb2YgZnVydGhlciB3cml0aW5nIHRvIHRoaXMgYnVmZmVyLgotLy8gVGhpcyBjbGFzcyBpcyBub3QgaW5oZXJlbnRseSB0aHJlYWQtc2FmZS4gQ29uY3VycmVudCBhY2Nlc3MgbXVzdCBiZQotLy8gZXh0ZXJuYWxseSBzZXJpYWxpemVkLgotCi0jaWZuZGVmIE1FRElBX0JBU0VfU0VFS0FCTEVfQlVGRkVSX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfU0VFS0FCTEVfQlVGRkVSX0hfCi0KLSNpbmNsdWRlIDxsaXN0PgotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2J1ZmZlcnMuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgTUVESUFfRVhQT1JUIFNlZWthYmxlQnVmZmVyIHsKLSBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugd2l0aCB8Zm9yd2FyZF9jYXBhY2l0eXwgYW5kIHxiYWNrd2FyZF9jYXBhY2l0eXwuCi0gIC8vIFRoZSB2YWx1ZXMgYXJlIGluIGJ5dGVzLgotICBTZWVrYWJsZUJ1ZmZlcihpbnQgYmFja3dhcmRfY2FwYWNpdHksIGludCBmb3J3YXJkX2NhcGFjaXR5KTsKLQotICB+U2Vla2FibGVCdWZmZXIoKTsKLQotICAvLyBDbGVhcnMgdGhlIGJ1ZmZlciBxdWV1ZS4KLSAgdm9pZCBDbGVhcigpOwotCi0gIC8vIFJlYWRzIGEgbWF4aW11bSBvZiB8c2l6ZXwgYnl0ZXMgaW50byB8ZGF0YXwgZnJvbSB0aGUgY3VycmVudCByZWFkCi0gIC8vIHBvc2l0aW9uLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KLSAgLy8gVGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiB3aWxsIGFkdmFuY2UgYnkgdGhlIGFtb3VudCBvZiBieXRlcyByZWFkLiBJZgotICAvLyByZWFkaW5nIGNhdXNlZCBiYWNrd2FyZF9ieXRlcygpIHRvIGV4Y2VlZCBiYWNrd2FyZF9jYXBhY2l0eSgpLCBhbiBldmljdGlvbgotICAvLyBvZiB0aGUgYmFja3dhcmQgYnVmZmVyIHdpbGwgYmUgZG9uZSBpbnRlcm5hbGx5LgotICBpbnQgUmVhZCh1aW50OCogZGF0YSwgaW50IHNpemUpOwotCi0gIC8vIENvcGllcyB1cCB0byB8c2l6ZXwgYnl0ZXMgZnJvbSBjdXJyZW50IHBvc2l0aW9uIHRvIHxkYXRhfC4gUmV0dXJucwotICAvLyBudW1iZXIgb2YgYnl0ZXMgY29waWVkLiBEb2Vzbid0IGFkdmFuY2UgY3VycmVudCBwb3NpdGlvbi4gT3B0aW9uYWxseQotICAvLyBzdGFydHMgYXQgYSB8Zm9yd2FyZF9vZmZzZXR8IGZyb20gY3VycmVudCBwb3NpdGlvbi4KLSAgaW50IFBlZWsodWludDgqIGRhdGEsIGludCBzaXplKSB7IHJldHVybiBQZWVrKGRhdGEsIHNpemUsIDApOyB9Ci0gIGludCBQZWVrKHVpbnQ4KiBkYXRhLCBpbnQgc2l6ZSwgaW50IGZvcndhcmRfb2Zmc2V0KTsKLQotICAvLyBSZXR1cm5zIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgY2h1bmsgb2YgZGF0YSB0aGF0IGlzIGJlaW5nIGNvbnN1bWVkLgotICAvLyBJZiB0aGVyZSBpcyBubyBkYXRhIGxlZnQgaW4gdGhlIGJ1ZmZlciBmYWxzZSBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlCi0gIC8vIHRydWUgaXMgcmV0dXJuZWQgYW5kIHxkYXRhfCBhbmQgfHNpemV8IGFyZSB1cGRhdGVkLiBUaGUgcmV0dXJuZWQKLSAgLy8gfGRhdGF8IHZhbHVlIGJlY29tZXMgaW52YWxpZCB3aGVuIFJlYWQoKSwgQXBwZW5kKCkgb3IgU2VlaygpCi0gIC8vIGFyZSBjYWxsZWQuCi0gIGJvb2wgR2V0Q3VycmVudENodW5rKGNvbnN0IHVpbnQ4KiogZGF0YSwgaW50KiBzaXplKSBjb25zdDsKLQotICAvLyBBcHBlbmRzIHxidWZmZXJfaW58IHRvIHRoaXMgYnVmZmVyLiBSZXR1cm5zIGZhbHNlIGlmIGZvcndhcmRfYnl0ZXMoKSBpcwotICAvLyBncmVhdGVyIHRoYW4gb3IgZXF1YWxzIHRvIGZvcndhcmRfY2FwYWNpdHkoKSwgdHJ1ZSBvdGhlcndpc2UuIFRoZSBkYXRhCi0gIC8vIGlzIGFkZGVkIHRvIHRoZSBidWZmZXIgaW4gYW55IGNhc2UuCi0gIGJvb2wgQXBwZW5kKEJ1ZmZlciogYnVmZmVyX2luKTsKLQotICAvLyBBcHBlbmRzIHxzaXplfCBieXRlcyBvZiB8ZGF0YXwgdG8gdGhlIGJ1ZmZlci4gUmVzdWx0IGlzIHRoZSBzYW1lCi0gIC8vIGFzIGZvciBBcHBlbmQoQnVmZmVyKikuCi0gIGJvb2wgQXBwZW5kKGNvbnN0IHVpbnQ4KiBkYXRhLCBpbnQgc2l6ZSk7Ci0KLSAgLy8gTW92ZXMgdGhlIHJlYWQgcG9zaXRpb24gYnkgfG9mZnNldHwgYnl0ZXMuIElmIHxvZmZzZXR8IGlzIHBvc2l0aXZlLCB0aGUKLSAgLy8gY3VycmVudCByZWFkIHBvc2l0aW9uIGlzIG1vdmVkIGZvcndhcmQuIElmIG5lZ2F0aXZlLCB0aGUgY3VycmVudCByZWFkCi0gIC8vIHBvc2l0aW9uIGlzIG1vdmVkIGJhY2t3YXJkLiBBIHplcm8gfG9mZnNldHwgdmFsdWUgd2lsbCBrZWVwIHRoZSBjdXJyZW50Ci0gIC8vIHJlYWQgcG9zaXRpb24gc3RhdGlvbmFyeS4KLSAgLy8gSWYgfG9mZnNldHwgZXhjZWVkcyBieXRlcyBidWZmZXJlZCBpbiBlaXRoZXIgZGlyZWN0aW9uLCByZXBvcnRlZCBieQotICAvLyBmb3J3YXJkX2J5dGVzKCkgd2hlbiBzZWVraW5nIGZvcndhcmQgYW5kIGJhY2t3YXJkX2J5dGVzKCkgd2hlbiBzZWVraW5nCi0gIC8vIGJhY2t3YXJkLCB0aGUgc2VlayBvcGVyYXRpb24gd2lsbCBmYWlsIGFuZCByZXR1cm4gdmFsdWUgd2lsbCBiZSBmYWxzZS4KLSAgLy8gSWYgdGhlIHNlZWsgb3BlcmF0aW9uIGZhaWxzLCB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIHdpbGwgbm90IGJlIHVwZGF0ZWQuCi0gIC8vIElmIGEgZm9yd2FyZCBzZWVraW5nIGNhdXNlZCBiYWNrd2FyZF9ieXRlcygpIHRvIGV4Y2VlZCBiYWNrd2FyZF9jYXBhY2l0eSgpLAotICAvLyB0aGlzIG1ldGhvZCBjYWxsIHdpbGwgY2F1c2UgYW4gZXZpY3Rpb24gb2YgdGhlIGJhY2t3YXJkIGJ1ZmZlci4KLSAgYm9vbCBTZWVrKGludDMyIG9mZnNldCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGJ1ZmZlcmVkIGJleW9uZCB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uLgotICBpbnQgZm9yd2FyZF9ieXRlcygpIGNvbnN0IHsgcmV0dXJuIGZvcndhcmRfYnl0ZXNfOyB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGJ1ZmZlcmVkIHRoYXQgcHJlY2VkZXMgdGhlIGN1cnJlbnQgcmVhZAotICAvLyBwb3NpdGlvbi4KLSAgaW50IGJhY2t3YXJkX2J5dGVzKCkgY29uc3QgeyByZXR1cm4gYmFja3dhcmRfYnl0ZXNfOyB9Ci0KLSAgLy8gU2V0cyB0aGUgZm9yd2FyZF9jYXBhY2l0eSB0byB8bmV3X2ZvcndhcmRfY2FwYWNpdHl8IGJ5dGVzLgotICB2b2lkIHNldF9mb3J3YXJkX2NhcGFjaXR5KGludCBuZXdfZm9yd2FyZF9jYXBhY2l0eSkgewotICAgIGZvcndhcmRfY2FwYWNpdHlfID0gbmV3X2ZvcndhcmRfY2FwYWNpdHk7Ci0gIH0KLQotICAvLyBTZXRzIHRoZSBiYWNrd2FyZF9jYXBhY2l0eSB0byB8bmV3X2JhY2t3YXJkX2NhcGFjaXR5fCBieXRlcy4KLSAgdm9pZCBzZXRfYmFja3dhcmRfY2FwYWNpdHkoaW50IG5ld19iYWNrd2FyZF9jYXBhY2l0eSkgewotICAgIGJhY2t3YXJkX2NhcGFjaXR5XyA9IG5ld19iYWNrd2FyZF9jYXBhY2l0eTsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgc2hvdWxkIGJlIGtlcHQgaW4gdGhlIGZvcndhcmQKLSAgLy8gZGlyZWN0aW9uLgotICBpbnQgZm9yd2FyZF9jYXBhY2l0eSgpIGNvbnN0IHsgcmV0dXJuIGZvcndhcmRfY2FwYWNpdHlfOyB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBzaG91bGQgYmUga2VwdCBpbiB0aGUgYmFja3dhcmQKLSAgLy8gZGlyZWN0aW9uLgotICBpbnQgYmFja3dhcmRfY2FwYWNpdHkoKSBjb25zdCB7IHJldHVybiBiYWNrd2FyZF9jYXBhY2l0eV87IH0KLQotICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IHRpbWVzdGFtcCwgdGFraW5nIGludG8gYWNjb3VudCBjdXJyZW50IG9mZnNldC4gVGhlCi0gIC8vIHZhbHVlIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIHRpbWVzdGFtcCBvZiB0aGUgY3VycmVudCBidWZmZXIuIElmCi0gIC8vIHRpbWVzdGFtcCBmb3IgdGhlIGN1cnJlbnQgYnVmZmVyIGlzIHNldCB0byAwIG9yIHRoZSBkYXRhIHdhcyBhZGRlZCB3aXRoCi0gIC8vIEFwcGVuZChjb25zdCB1aW50KiwgaW50KSwgdGhlbiByZXR1cm5zIHZhbHVlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlCi0gIC8vIGxhc3QgcG9zaXRpb24gaW4gYSBidWZmZXIgdGhhdCBoYWQgdGltZXN0YW1wIHNldC4KLSAgLy8ga05vVGltZXN0YW1wKCkgaXMgcmV0dXJuZWQgaWYgbm8gYnVmZmVycyB3ZSByZWFkIGZyb20gaGFkIHRpbWVzdGFtcCBzZXQuCi0gIGJhc2U6OlRpbWVEZWx0YSBjdXJyZW50X3RpbWUoKSBjb25zdCB7IHJldHVybiBjdXJyZW50X3RpbWVfOyB9Ci0KLSBwcml2YXRlOgotICAvLyBEZWZpbml0aW9uIG9mIHRoZSBidWZmZXIgcXVldWUuCi0gIHR5cGVkZWYgc3RkOjpsaXN0PHNjb3BlZF9yZWZwdHI8QnVmZmVyPiA+IEJ1ZmZlclF1ZXVlOwotCi0gIC8vIEEgaGVscGVyIG1ldGhvZCB0byBldmljdCBidWZmZXJzIGluIHRoZSBiYWNrd2FyZCBkaXJlY3Rpb24gdW50aWwgYmFja3dhcmQKLSAgLy8gYnl0ZXMgaXMgd2l0aGluIHRoZSBiYWNrd2FyZCBjYXBhY2l0eS4KLSAgdm9pZCBFdmljdEJhY2t3YXJkQnVmZmVycygpOwotCi0gIC8vIEFuIGludGVybmFsIG1ldGhvZCBzaGFyZWQgYnkgUmVhZCgpIGFuZCBTZWVrRm9yd2FyZCgpIHRoYXQgYWN0dWFsbHkgZG9lcwotICAvLyByZWFkaW5nLiBJdCByZWFkcyBhIG1heGltdW0gb2YgfHNpemV8IGJ5dGVzIGludG8gfGRhdGF8LiBSZXR1cm5zIHRoZSBudW1iZXIKLSAgLy8gb2YgYnl0ZXMgcmVhZC4gVGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiB3aWxsIGJlIG1vdmVkIGZvcndhcmQgYnkgdGhlCi0gIC8vIG51bWJlciBvZiBieXRlcyByZWFkLiBJZiB8ZGF0YXwgaXMgTlVMTCwgb25seSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uCi0gIC8vIHdpbGwgYWR2YW5jZSBidXQgbm8gZGF0YSB3aWxsIGJlIGNvcGllZC4KLSAgaW50IEludGVybmFsUmVhZCgKLSAgICAgIHVpbnQ4KiBkYXRhLCBpbnQgc2l6ZSwgYm9vbCBhZHZhbmNlX3Bvc2l0aW9uLCBpbnQgZm9yd2FyZF9vZmZzZXQpOwotCi0gIC8vIEEgaGVscGVyIG1ldGhvZCB0aGF0IG1vdmVzIHRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24gZm9yd2FyZCBieSB8c2l6ZXwKLSAgLy8gYnl0ZXMuCi0gIC8vIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgdHJ1ZSwgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgotICAvLyBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGZhbHNlLCB8c2l6ZXwgaXMgZ3JlYXRlciB0aGFuIGZvcndhcmRfYnl0ZXMoKSBhbmQKLSAgLy8gdGhlIHNlZWsgb3BlcmF0aW9uIGZhaWxlZC4gVGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBpcyBub3QgdXBkYXRlZC4KLSAgYm9vbCBTZWVrRm9yd2FyZChpbnQgc2l6ZSk7Ci0KLSAgLy8gQSBoZWxwZXIgbWV0aG9kIHRoYXQgbW92ZXMgdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBiYWNrd2FyZCBieSB8c2l6ZXwKLSAgLy8gYnl0ZXMuCi0gIC8vIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgdHJ1ZSwgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgotICAvLyBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGZhbHNlLCB8c2l6ZXwgaXMgZ3JlYXRlciB0aGFuIGJhY2t3YXJkX2J5dGVzKCkgYW5kCi0gIC8vIHRoZSBzZWVrIG9wZXJhdGlvbiBmYWlsZWQuIFRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24gaXMgbm90IHVwZGF0ZWQuCi0gIGJvb2wgU2Vla0JhY2t3YXJkKGludCBzaXplKTsKLQotICAvLyBVcGRhdGVzIHxjdXJyZW50X3RpbWVffCB3aXRoIHRoZSB0aW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlCi0gIC8vIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyLgotICB2b2lkIFVwZGF0ZUN1cnJlbnRUaW1lKEJ1ZmZlclF1ZXVlOjppdGVyYXRvciBidWZmZXIsIGludCBvZmZzZXQpOwotCi0gIEJ1ZmZlclF1ZXVlOjppdGVyYXRvciBjdXJyZW50X2J1ZmZlcl87Ci0gIEJ1ZmZlclF1ZXVlIGJ1ZmZlcnNfOwotICBpbnQgY3VycmVudF9idWZmZXJfb2Zmc2V0XzsKLQotICBpbnQgYmFja3dhcmRfY2FwYWNpdHlfOwotICBpbnQgYmFja3dhcmRfYnl0ZXNfOwotCi0gIGludCBmb3J3YXJkX2NhcGFjaXR5XzsKLSAgaW50IGZvcndhcmRfYnl0ZXNfOwotCi0gIC8vIEtlZXBzIHRyYWNrIG9mIHRoZSBtb3N0IHJlY2VudCB0aW1lIHdlJ3ZlIHNlZW4gaW4gY2FzZSB0aGUgfGJ1ZmZlcnNffCBpcwotICAvLyBlbXB0eSB3aGVuIG91ciBvd25lciBhc2tzIHdoYXQgdGltZSBpdCBpcy4KLSAgYmFzZTo6VGltZURlbHRhIGN1cnJlbnRfdGltZV87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNlZWthYmxlQnVmZmVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0JBU0VfU0VFS0FCTEVfQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9zZWVrYWJsZV9idWZmZXJfdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvYmFzZS9zZWVrYWJsZV9idWZmZXJfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZDM2YTYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2Uvc2Vla2FibGVfYnVmZmVyX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAiYmFzZS90aW1lLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kYXRhX2J1ZmZlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2Vla2FibGVfYnVmZmVyLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIFNlZWthYmxlQnVmZmVyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gIFNlZWthYmxlQnVmZmVyVGVzdCgpIDogYnVmZmVyXyhrQnVmZmVyU2l6ZSwga0J1ZmZlclNpemUpIHsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBzdGF0aWMgY29uc3QgaW50IGtEYXRhU2l6ZSA9IDQwOTYwMDsKLSAgc3RhdGljIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IDQwOTY7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1dyaXRlU2l6ZSA9IDUxMjsKLQotICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgLy8gU2V0dXAgc2VlZC4KLSAgICBpbnQgc2VlZCA9IHN0YXRpY19jYXN0PGludDMyPihiYXNlOjpUaW1lOjpOb3coKS5Ub0ludGVybmFsVmFsdWUoKSk7Ci0gICAgc3JhbmQoc2VlZCk7Ci0gICAgVkxPRygxKSA8PCAiUmFuZG9tIHNlZWQ6ICIgPDwgc2VlZDsKLQotICAgIC8vIENyZWF0ZXMgYSB0ZXN0IGRhdGEuCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrRGF0YVNpemU7IGkrKykKLSAgICAgIGRhdGFfW2ldID0gc3RhdGljX2Nhc3Q8Y2hhcj4ocmFuZCgpKTsKLSAgfQotCi0gIGludCBHZXRSYW5kb21JbnQoaW50IG1heGltdW0pIHsKLSAgICByZXR1cm4gcmFuZCgpICUgbWF4aW11bSArIDE7Ci0gIH0KLQotICBTZWVrYWJsZUJ1ZmZlciBidWZmZXJfOwotICB1aW50OCBkYXRhX1trRGF0YVNpemVdOwotICB1aW50OCB3cml0ZV9idWZmZXJfW2tEYXRhU2l6ZV07Ci19OwotCi1URVNUX0YoU2Vla2FibGVCdWZmZXJUZXN0LCBSYW5kb21SZWFkV3JpdGUpIHsKLSAgaW50IHdyaXRlX3Bvc2l0aW9uID0gMDsKLSAgaW50IHJlYWRfcG9zaXRpb24gPSAwOwotICB3aGlsZSAocmVhZF9wb3NpdGlvbiA8IGtEYXRhU2l6ZSkgewotICAgIC8vIFdyaXRlIGEgcmFuZG9tIGFtb3VudCBvZiBkYXRhLgotICAgIGludCB3cml0ZV9zaXplID0gR2V0UmFuZG9tSW50KGtCdWZmZXJTaXplKTsKLSAgICB3cml0ZV9zaXplID0gc3RkOjptaW4od3JpdGVfc2l6ZSwga0RhdGFTaXplIC0gd3JpdGVfcG9zaXRpb24pOwotICAgIGJvb2wgc2hvdWxkX2FwcGVuZCA9IGJ1ZmZlcl8uQXBwZW5kKGRhdGFfICsgd3JpdGVfcG9zaXRpb24sIHdyaXRlX3NpemUpOwotICAgIHdyaXRlX3Bvc2l0aW9uICs9IHdyaXRlX3NpemU7Ci0gICAgRVhQRUNUX0dFKHdyaXRlX3Bvc2l0aW9uLCByZWFkX3Bvc2l0aW9uKTsKLSAgICBFWFBFQ1RfRVEod3JpdGVfcG9zaXRpb24gLSByZWFkX3Bvc2l0aW9uLCBidWZmZXJfLmZvcndhcmRfYnl0ZXMoKSk7Ci0gICAgRVhQRUNUX0VRKHNob3VsZF9hcHBlbmQsIGJ1ZmZlcl8uZm9yd2FyZF9ieXRlcygpIDwga0J1ZmZlclNpemUpCi0gICAgICAgIDw8ICJJbmNvcnJlY3QgYnVmZmVyIGZ1bGwgcmVwb3J0ZWQiOwotCi0gICAgLy8gUGVlayBhIHJhbmRvbSBhbW91bnQgb2YgZGF0YS4KLSAgICBpbnQgY29weV9zaXplID0gR2V0UmFuZG9tSW50KGtCdWZmZXJTaXplKTsKLSAgICBpbnQgYnl0ZXNfY29waWVkID0gYnVmZmVyXy5QZWVrKHdyaXRlX2J1ZmZlcl8sIGNvcHlfc2l6ZSk7Ci0gICAgRVhQRUNUX0dFKGNvcHlfc2l6ZSwgYnl0ZXNfY29waWVkKTsKLSAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKHdyaXRlX2J1ZmZlcl8sIGRhdGFfICsgcmVhZF9wb3NpdGlvbiwgYnl0ZXNfY29waWVkKSk7Ci0KLSAgICAvLyBSZWFkIGEgcmFuZG9tIGFtb3VudCBvZiBkYXRhLgotICAgIGludCByZWFkX3NpemUgPSBHZXRSYW5kb21JbnQoa0J1ZmZlclNpemUpOwotICAgIGludCBieXRlc19yZWFkID0gYnVmZmVyXy5SZWFkKHdyaXRlX2J1ZmZlcl8sIHJlYWRfc2l6ZSk7Ci0gICAgRVhQRUNUX0dFKHJlYWRfc2l6ZSwgYnl0ZXNfcmVhZCk7Ci0gICAgRVhQRUNUX0VRKDAsIG1lbWNtcCh3cml0ZV9idWZmZXJfLCBkYXRhXyArIHJlYWRfcG9zaXRpb24sIGJ5dGVzX3JlYWQpKTsKLSAgICByZWFkX3Bvc2l0aW9uICs9IGJ5dGVzX3JlYWQ7Ci0gICAgRVhQRUNUX0dFKHdyaXRlX3Bvc2l0aW9uLCByZWFkX3Bvc2l0aW9uKTsKLSAgICBFWFBFQ1RfRVEod3JpdGVfcG9zaXRpb24gLSByZWFkX3Bvc2l0aW9uLCBidWZmZXJfLmZvcndhcmRfYnl0ZXMoKSk7Ci0gIH0KLX0KLQotVEVTVF9GKFNlZWthYmxlQnVmZmVyVGVzdCwgUmVhZFdyaXRlU2VlaykgewotICBjb25zdCBpbnQga1JlYWRTaXplID0ga1dyaXRlU2l6ZSAvIDQ7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7Ci0gICAgLy8gV3JpdGUgdW50aWwgYnVmZmVyIGlzIGZ1bGwuCi0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBrQnVmZmVyU2l6ZTsgaiArPSBrV3JpdGVTaXplKSB7Ci0gICAgICBib29sIHNob3VsZF9hcHBlbmQgPSBidWZmZXJfLkFwcGVuZChkYXRhXyArIGosIGtXcml0ZVNpemUpOwotICAgICAgRVhQRUNUX0VRKGogPCBrQnVmZmVyU2l6ZSAtIGtXcml0ZVNpemUsIHNob3VsZF9hcHBlbmQpCi0gICAgICAgICAgPDwgIkluY29ycmVjdCBidWZmZXIgZnVsbCByZXBvcnRlZCI7Ci0gICAgICBFWFBFQ1RfRVEoaiArIGtXcml0ZVNpemUsIGJ1ZmZlcl8uZm9yd2FyZF9ieXRlcygpKTsKLSAgICB9Ci0KLSAgICAvLyBTaW11bGF0ZSBhIHJlYWQgYW5kIHNlZWsgcGF0dGVybi4gRWFjaCBsb29wIHJlYWRzIDQgdGltZXMsIGVhY2ggdGltZQotICAgIC8vIHJlYWRpbmcgYSBxdWFydGVyIG9mIHxrV3JpdGVTaXplfC4KLSAgICBpbnQgcmVhZF9wb3NpdGlvbiA9IDA7Ci0gICAgaW50IGZvcndhcmRfYnl0ZXMgPSBrQnVmZmVyU2l6ZTsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IGtCdWZmZXJTaXplOyBqICs9IGtXcml0ZVNpemUpIHsKLSAgICAgIC8vIFJlYWQuCi0gICAgICBFWFBFQ1RfRVEoa1JlYWRTaXplLCBidWZmZXJfLlJlYWQod3JpdGVfYnVmZmVyXywga1JlYWRTaXplKSk7Ci0gICAgICBmb3J3YXJkX2J5dGVzIC09IGtSZWFkU2l6ZTsKLSAgICAgIEVYUEVDVF9FUShmb3J3YXJkX2J5dGVzLCBidWZmZXJfLmZvcndhcmRfYnl0ZXMoKSk7Ci0gICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKHdyaXRlX2J1ZmZlcl8sIGRhdGFfICsgcmVhZF9wb3NpdGlvbiwga1JlYWRTaXplKSk7Ci0gICAgICByZWFkX3Bvc2l0aW9uICs9IGtSZWFkU2l6ZTsKLQotICAgICAgLy8gU2VlayBmb3J3YXJkLgotICAgICAgRVhQRUNUX1RSVUUoYnVmZmVyXy5TZWVrKDIgKiBrUmVhZFNpemUpKTsKLSAgICAgIGZvcndhcmRfYnl0ZXMgLT0gMiAqIGtSZWFkU2l6ZTsKLSAgICAgIHJlYWRfcG9zaXRpb24gKz0gMiAqIGtSZWFkU2l6ZTsKLSAgICAgIEVYUEVDVF9FUShmb3J3YXJkX2J5dGVzLCBidWZmZXJfLmZvcndhcmRfYnl0ZXMoKSk7Ci0KLSAgICAgIC8vIENvcHkuCi0gICAgICBFWFBFQ1RfRVEoa1JlYWRTaXplLCBidWZmZXJfLlBlZWsod3JpdGVfYnVmZmVyXywga1JlYWRTaXplKSk7Ci0gICAgICBFWFBFQ1RfRVEoZm9yd2FyZF9ieXRlcywgYnVmZmVyXy5mb3J3YXJkX2J5dGVzKCkpOwotICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCh3cml0ZV9idWZmZXJfLCBkYXRhXyArIHJlYWRfcG9zaXRpb24sIGtSZWFkU2l6ZSkpOwotCi0gICAgICAvLyBSZWFkLgotICAgICAgRVhQRUNUX0VRKGtSZWFkU2l6ZSwgYnVmZmVyXy5SZWFkKHdyaXRlX2J1ZmZlcl8sIGtSZWFkU2l6ZSkpOwotICAgICAgZm9yd2FyZF9ieXRlcyAtPSBrUmVhZFNpemU7Ci0gICAgICBFWFBFQ1RfRVEoZm9yd2FyZF9ieXRlcywgYnVmZmVyXy5mb3J3YXJkX2J5dGVzKCkpOwotICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCh3cml0ZV9idWZmZXJfLCBkYXRhXyArIHJlYWRfcG9zaXRpb24sIGtSZWFkU2l6ZSkpOwotICAgICAgcmVhZF9wb3NpdGlvbiArPSBrUmVhZFNpemU7Ci0KLSAgICAgIC8vIFNlZWsgYmFja3dhcmQuCi0gICAgICBFWFBFQ1RfVFJVRShidWZmZXJfLlNlZWsoLTMgKiBzdGF0aWNfY2FzdDxpbnQzMj4oa1JlYWRTaXplKSkpOwotICAgICAgZm9yd2FyZF9ieXRlcyArPSAzICoga1JlYWRTaXplOwotICAgICAgcmVhZF9wb3NpdGlvbiAtPSAzICoga1JlYWRTaXplOwotICAgICAgRVhQRUNUX0VRKGZvcndhcmRfYnl0ZXMsIGJ1ZmZlcl8uZm9yd2FyZF9ieXRlcygpKTsKLQotICAgICAgLy8gQ29weS4KLSAgICAgIEVYUEVDVF9FUShrUmVhZFNpemUsIGJ1ZmZlcl8uUGVlayh3cml0ZV9idWZmZXJfLCBrUmVhZFNpemUpKTsKLSAgICAgIEVYUEVDVF9FUShmb3J3YXJkX2J5dGVzLCBidWZmZXJfLmZvcndhcmRfYnl0ZXMoKSk7Ci0gICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKHdyaXRlX2J1ZmZlcl8sIGRhdGFfICsgcmVhZF9wb3NpdGlvbiwga1JlYWRTaXplKSk7Ci0KLSAgICAgIC8vIFJlYWQuCi0gICAgICBFWFBFQ1RfRVEoa1JlYWRTaXplLCBidWZmZXJfLlJlYWQod3JpdGVfYnVmZmVyXywga1JlYWRTaXplKSk7Ci0gICAgICBmb3J3YXJkX2J5dGVzIC09IGtSZWFkU2l6ZTsKLSAgICAgIEVYUEVDVF9FUShmb3J3YXJkX2J5dGVzLCBidWZmZXJfLmZvcndhcmRfYnl0ZXMoKSk7Ci0gICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKHdyaXRlX2J1ZmZlcl8sIGRhdGFfICsgcmVhZF9wb3NpdGlvbiwga1JlYWRTaXplKSk7Ci0gICAgICByZWFkX3Bvc2l0aW9uICs9IGtSZWFkU2l6ZTsKLQotICAgICAgLy8gQ29weS4KLSAgICAgIEVYUEVDVF9FUShrUmVhZFNpemUsIGJ1ZmZlcl8uUGVlayh3cml0ZV9idWZmZXJfLCBrUmVhZFNpemUpKTsKLSAgICAgIEVYUEVDVF9FUShmb3J3YXJkX2J5dGVzLCBidWZmZXJfLmZvcndhcmRfYnl0ZXMoKSk7Ci0gICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKHdyaXRlX2J1ZmZlcl8sIGRhdGFfICsgcmVhZF9wb3NpdGlvbiwga1JlYWRTaXplKSk7Ci0KLSAgICAgIC8vIFJlYWQuCi0gICAgICBFWFBFQ1RfRVEoa1JlYWRTaXplLCBidWZmZXJfLlJlYWQod3JpdGVfYnVmZmVyXywga1JlYWRTaXplKSk7Ci0gICAgICBmb3J3YXJkX2J5dGVzIC09IGtSZWFkU2l6ZTsKLSAgICAgIEVYUEVDVF9FUShmb3J3YXJkX2J5dGVzLCBidWZmZXJfLmZvcndhcmRfYnl0ZXMoKSk7Ci0gICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKHdyaXRlX2J1ZmZlcl8sIGRhdGFfICsgcmVhZF9wb3NpdGlvbiwga1JlYWRTaXplKSk7Ci0gICAgICByZWFkX3Bvc2l0aW9uICs9IGtSZWFkU2l6ZTsKLQotICAgICAgLy8gU2VlayBmb3J3YXJkLgotICAgICAgRVhQRUNUX1RSVUUoYnVmZmVyXy5TZWVrKGtSZWFkU2l6ZSkpOwotICAgICAgZm9yd2FyZF9ieXRlcyAtPSBrUmVhZFNpemU7Ci0gICAgICByZWFkX3Bvc2l0aW9uICs9IGtSZWFkU2l6ZTsKLSAgICAgIEVYUEVDVF9FUShmb3J3YXJkX2J5dGVzLCBidWZmZXJfLmZvcndhcmRfYnl0ZXMoKSk7Ci0gICAgfQotICB9Ci19Ci0KLVRFU1RfRihTZWVrYWJsZUJ1ZmZlclRlc3QsIEJ1ZmZlckZ1bGwpIHsKLSAgY29uc3QgaW50IGtNYXhXcml0ZVNpemUgPSAyICoga0J1ZmZlclNpemU7Ci0KLSAgLy8gV3JpdGUgYW5kIGV4cGVjdCB0aGUgYnVmZmVyIHRvIGJlIG5vdCBmdWxsLgotICBmb3IgKGludCBpID0gMDsgaSA8IGtCdWZmZXJTaXplIC0ga1dyaXRlU2l6ZTsgaSArPSBrV3JpdGVTaXplKSB7Ci0gICAgRVhQRUNUX1RSVUUoYnVmZmVyXy5BcHBlbmQoZGF0YV8gKyBpLCBrV3JpdGVTaXplKSk7Ci0gICAgRVhQRUNUX0VRKGkgKyBrV3JpdGVTaXplLCBidWZmZXJfLmZvcndhcmRfYnl0ZXMoKSk7Ci0gIH0KLQotICAvLyBXcml0ZSB1bnRpbCB3ZSBoYXZlIGtNYXhXcml0ZVNpemUgYnl0ZXMgaW4gdGhlIGJ1ZmZlci4gQnVmZmVyIGlzIGZ1bGwgaW4KLSAgLy8gdGhlc2Ugd3JpdGVzLgotICBmb3IgKGludCBpID0gYnVmZmVyXy5mb3J3YXJkX2J5dGVzKCk7IGkgPCBrTWF4V3JpdGVTaXplOyBpICs9IGtXcml0ZVNpemUpIHsKLSAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyXy5BcHBlbmQoZGF0YV8gKyBpLCBrV3JpdGVTaXplKSk7Ci0gICAgRVhQRUNUX0VRKGkgKyBrV3JpdGVTaXplLCBidWZmZXJfLmZvcndhcmRfYnl0ZXMoKSk7Ci0gIH0KLQotICAvLyBSZWFkIHVudGlsIHRoZSBidWZmZXIgaXMgZW1wdHkuCi0gIGludCByZWFkX3Bvc2l0aW9uID0gMDsKLSAgd2hpbGUgKGJ1ZmZlcl8uZm9yd2FyZF9ieXRlcygpKSB7Ci0gICAgLy8gUmVhZCBhIHJhbmRvbSBhbW91bnQgb2YgZGF0YS4KLSAgICBpbnQgcmVhZF9zaXplID0gR2V0UmFuZG9tSW50KGtCdWZmZXJTaXplKTsKLSAgICBpbnQgZm9yd2FyZF9ieXRlcyA9IGJ1ZmZlcl8uZm9yd2FyZF9ieXRlcygpOwotICAgIGludCBieXRlc19yZWFkID0gYnVmZmVyXy5SZWFkKHdyaXRlX2J1ZmZlcl8sIHJlYWRfc2l6ZSk7Ci0gICAgRVhQRUNUX0VRKDAsIG1lbWNtcCh3cml0ZV9idWZmZXJfLCBkYXRhXyArIHJlYWRfcG9zaXRpb24sIGJ5dGVzX3JlYWQpKTsKLSAgICBpZiAocmVhZF9zaXplID4gZm9yd2FyZF9ieXRlcykKLSAgICAgIEVYUEVDVF9FUShmb3J3YXJkX2J5dGVzLCBieXRlc19yZWFkKTsKLSAgICBlbHNlCi0gICAgICBFWFBFQ1RfRVEocmVhZF9zaXplLCBieXRlc19yZWFkKTsKLSAgICByZWFkX3Bvc2l0aW9uICs9IGJ5dGVzX3JlYWQ7Ci0gICAgRVhQRUNUX0dFKGtNYXhXcml0ZVNpemUsIHJlYWRfcG9zaXRpb24pOwotICAgIEVYUEVDVF9FUShrTWF4V3JpdGVTaXplIC0gcmVhZF9wb3NpdGlvbiwgYnVmZmVyXy5mb3J3YXJkX2J5dGVzKCkpOwotICB9Ci0KLSAgLy8gRXhwZWN0cyB3ZSBoYXZlIG5vIGJ5dGVzIGxlZnQuCi0gIEVYUEVDVF9FUSgwLCBidWZmZXJfLmZvcndhcmRfYnl0ZXMoKSk7Ci0gIEVYUEVDVF9FUSgwLCBidWZmZXJfLlJlYWQod3JpdGVfYnVmZmVyXywgMSkpOwotfQotCi1URVNUX0YoU2Vla2FibGVCdWZmZXJUZXN0LCBTZWVrQmFja3dhcmQpIHsKLSAgRVhQRUNUX0VRKDAsIGJ1ZmZlcl8uZm9yd2FyZF9ieXRlcygpKTsKLSAgRVhQRUNUX0VRKDAsIGJ1ZmZlcl8uYmFja3dhcmRfYnl0ZXMoKSk7Ci0gIEVYUEVDVF9GQUxTRShidWZmZXJfLlNlZWsoMSkpOwotICBFWFBFQ1RfRkFMU0UoYnVmZmVyXy5TZWVrKC0xKSk7Ci0KLSAgY29uc3QgaW50IGtSZWFkU2l6ZSA9IDI1NjsKLQotICAvLyBXcml0ZSBpbnRvIGJ1ZmZlciB1bnRpbCBpdCdzIGZ1bGwuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwga0J1ZmZlclNpemU7IGkgKz0ga1dyaXRlU2l6ZSkgewotICAgIC8vIFdyaXRlIGEgcmFuZG9tIGFtb3VudCBvZiBkYXRhLgotICAgIGJ1ZmZlcl8uQXBwZW5kKGRhdGFfICsgaSwga1dyaXRlU2l6ZSk7Ci0gIH0KLQotICAvLyBSZWFkIHVudGlsIGJ1ZmZlciBpcyBlbXB0eS4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQnVmZmVyU2l6ZTsgaSArPSBrUmVhZFNpemUpIHsKLSAgICBFWFBFQ1RfRVEoa1JlYWRTaXplLCBidWZmZXJfLlJlYWQod3JpdGVfYnVmZmVyXywga1JlYWRTaXplKSk7Ci0gICAgRVhQRUNUX0VRKDAsIG1lbWNtcCh3cml0ZV9idWZmZXJfLCBkYXRhXyArIGksIGtSZWFkU2l6ZSkpOwotICB9Ci0KLSAgLy8gU2VlayBiYWNrd2FyZC4KLSAgRVhQRUNUX1RSVUUoYnVmZmVyXy5TZWVrKC1zdGF0aWNfY2FzdDxpbnQzMj4oa0J1ZmZlclNpemUpKSk7Ci0gIEVYUEVDVF9GQUxTRShidWZmZXJfLlNlZWsoLTEpKTsKLQotICAvLyBSZWFkIGFnYWluLgotICBmb3IgKGludCBpID0gMDsgaSA8IGtCdWZmZXJTaXplOyBpICs9IGtSZWFkU2l6ZSkgewotICAgIEVYUEVDVF9FUShrUmVhZFNpemUsIGJ1ZmZlcl8uUmVhZCh3cml0ZV9idWZmZXJfLCBrUmVhZFNpemUpKTsKLSAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKHdyaXRlX2J1ZmZlcl8sIGRhdGFfICsgaSwga1JlYWRTaXplKSk7Ci0gIH0KLX0KLQotVEVTVF9GKFNlZWthYmxlQnVmZmVyVGVzdCwgR2V0Q3VycmVudENodW5rKSB7Ci0gIGNvbnN0IGludCBrU2Vla1NpemUgPSBrV3JpdGVTaXplIC8gMzsKLQotICBzY29wZWRfcmVmcHRyPERhdGFCdWZmZXI+IGJ1ZmZlcihuZXcgRGF0YUJ1ZmZlcihkYXRhXywga1dyaXRlU2l6ZSkpOwotCi0gIGNvbnN0IHVpbnQ4KiBkYXRhOwotICBpbnQgc2l6ZTsKLSAgRVhQRUNUX0ZBTFNFKGJ1ZmZlcl8uR2V0Q3VycmVudENodW5rKCZkYXRhLCAmc2l6ZSkpOwotCi0gIGJ1ZmZlcl8uQXBwZW5kKGJ1ZmZlci5nZXQoKSk7Ci0gIEVYUEVDVF9UUlVFKGJ1ZmZlcl8uR2V0Q3VycmVudENodW5rKCZkYXRhLCAmc2l6ZSkpOwotICBFWFBFQ1RfRVEoZGF0YSwgYnVmZmVyLT5HZXREYXRhKCkpOwotICBFWFBFQ1RfRVEoc2l6ZSwgYnVmZmVyLT5HZXREYXRhU2l6ZSgpKTsKLQotICBidWZmZXJfLlNlZWsoa1NlZWtTaXplKTsKLSAgRVhQRUNUX1RSVUUoYnVmZmVyXy5HZXRDdXJyZW50Q2h1bmsoJmRhdGEsICZzaXplKSk7Ci0gIEVYUEVDVF9FUShkYXRhLCBidWZmZXItPkdldERhdGEoKSArIGtTZWVrU2l6ZSk7Ci0gIEVYUEVDVF9FUShzaXplLCBidWZmZXItPkdldERhdGFTaXplKCkgLSBrU2Vla1NpemUpOwotfQotCi1URVNUX0YoU2Vla2FibGVCdWZmZXJUZXN0LCBTZWVrRm9yd2FyZCkgewotICBpbnQgd3JpdGVfcG9zaXRpb24gPSAwOwotICBpbnQgcmVhZF9wb3NpdGlvbiA9IDA7Ci0gIHdoaWxlIChyZWFkX3Bvc2l0aW9uIDwga0RhdGFTaXplKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMCAmJiB3cml0ZV9wb3NpdGlvbiA8IGtEYXRhU2l6ZTsgKytpKSB7Ci0gICAgICAvLyBXcml0ZSBhIHJhbmRvbSBhbW91bnQgb2YgZGF0YS4KLSAgICAgIGludCB3cml0ZV9zaXplID0gR2V0UmFuZG9tSW50KGtCdWZmZXJTaXplKTsKLSAgICAgIHdyaXRlX3NpemUgPSBzdGQ6Om1pbih3cml0ZV9zaXplLCBrRGF0YVNpemUgLSB3cml0ZV9wb3NpdGlvbik7Ci0KLSAgICAgIGJvb2wgc2hvdWxkX2FwcGVuZCA9IGJ1ZmZlcl8uQXBwZW5kKGRhdGFfICsgd3JpdGVfcG9zaXRpb24sIHdyaXRlX3NpemUpOwotICAgICAgd3JpdGVfcG9zaXRpb24gKz0gd3JpdGVfc2l6ZTsKLSAgICAgIEVYUEVDVF9HRSh3cml0ZV9wb3NpdGlvbiwgcmVhZF9wb3NpdGlvbik7Ci0gICAgICBFWFBFQ1RfRVEod3JpdGVfcG9zaXRpb24gLSByZWFkX3Bvc2l0aW9uLCBidWZmZXJfLmZvcndhcmRfYnl0ZXMoKSk7Ci0gICAgICBFWFBFQ1RfRVEoc2hvdWxkX2FwcGVuZCwgYnVmZmVyXy5mb3J3YXJkX2J5dGVzKCkgPCBrQnVmZmVyU2l6ZSkKLSAgICAgICAgICA8PCAiSW5jb3JyZWN0IGJ1ZmZlciBmdWxsIHN0YXR1cyByZXBvcnRlZCI7Ci0gICAgfQotCi0gICAgLy8gUmVhZCBhIHJhbmRvbSBhbW91bnQgb2YgZGF0YS4KLSAgICBpbnQgc2Vla19zaXplID0gR2V0UmFuZG9tSW50KGtCdWZmZXJTaXplKTsKLSAgICBpZiAoYnVmZmVyXy5TZWVrKHNlZWtfc2l6ZSkpCi0gICAgICByZWFkX3Bvc2l0aW9uICs9IHNlZWtfc2l6ZTsKLSAgICBFWFBFQ1RfR0Uod3JpdGVfcG9zaXRpb24sIHJlYWRfcG9zaXRpb24pOwotICAgIEVYUEVDVF9FUSh3cml0ZV9wb3NpdGlvbiAtIHJlYWRfcG9zaXRpb24sIGJ1ZmZlcl8uZm9yd2FyZF9ieXRlcygpKTsKLQotICAgIC8vIFJlYWQgYSByYW5kb20gYW1vdW50IG9mIGRhdGEuCi0gICAgaW50IHJlYWRfc2l6ZSA9IEdldFJhbmRvbUludChrQnVmZmVyU2l6ZSk7Ci0gICAgaW50IGJ5dGVzX3JlYWQgPSBidWZmZXJfLlJlYWQod3JpdGVfYnVmZmVyXywgcmVhZF9zaXplKTsKLSAgICBFWFBFQ1RfR0UocmVhZF9zaXplLCBieXRlc19yZWFkKTsKLSAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKHdyaXRlX2J1ZmZlcl8sIGRhdGFfICsgcmVhZF9wb3NpdGlvbiwgYnl0ZXNfcmVhZCkpOwotICAgIHJlYWRfcG9zaXRpb24gKz0gYnl0ZXNfcmVhZDsKLSAgICBFWFBFQ1RfR0Uod3JpdGVfcG9zaXRpb24sIHJlYWRfcG9zaXRpb24pOwotICAgIEVYUEVDVF9FUSh3cml0ZV9wb3NpdGlvbiAtIHJlYWRfcG9zaXRpb24sIGJ1ZmZlcl8uZm9yd2FyZF9ieXRlcygpKTsKLSAgfQotfQotCi1URVNUX0YoU2Vla2FibGVCdWZmZXJUZXN0LCBBbGxNZXRob2RzKSB7Ci0gIEVYUEVDVF9FUSgwLCBidWZmZXJfLlJlYWQod3JpdGVfYnVmZmVyXywgMCkpOwotICBFWFBFQ1RfRVEoMCwgYnVmZmVyXy5SZWFkKHdyaXRlX2J1ZmZlcl8sIDEpKTsKLSAgRVhQRUNUX1RSVUUoYnVmZmVyXy5TZWVrKDApKTsKLSAgRVhQRUNUX0ZBTFNFKGJ1ZmZlcl8uU2VlaygtMSkpOwotICBFWFBFQ1RfRkFMU0UoYnVmZmVyXy5TZWVrKDEpKTsKLSAgRVhQRUNUX0VRKDAsIGJ1ZmZlcl8uZm9yd2FyZF9ieXRlcygpKTsKLSAgRVhQRUNUX0VRKDAsIGJ1ZmZlcl8uYmFja3dhcmRfYnl0ZXMoKSk7Ci19Ci0KLVRFU1RfRihTZWVrYWJsZUJ1ZmZlclRlc3QsIEdldFRpbWUpIHsKLSAgY29uc3QgaW50NjQga05vVFMgPSBrTm9UaW1lc3RhbXAoKS5Ub0ludGVybmFsVmFsdWUoKTsKLSAgY29uc3Qgc3RydWN0IHsKLSAgICBpbnQ2NCBmaXJzdF90aW1lX3VzZWNvbmRzOwotICAgIGludDY0IGR1cmF0aW9uX3VzZWNvbmRzOwotICAgIGludCBjb25zdW1lX2J5dGVzOwotICAgIGludDY0IGV4cGVjdGVkX3RpbWU7Ci0gIH0gdGVzdHNbXSA9IHsKLSAgICB7IGtOb1RTLCAxMDAwMDAwLCAwLCBrTm9UUyB9LAotICAgIHsga05vVFMsIDQwMDAwMDAsIDAsIGtOb1RTIH0sCi0gICAgeyBrTm9UUywgODAwMDAwMCwgMCwga05vVFMgfSwKLSAgICB7IGtOb1RTLCAxMDAwMDAwLCBrV3JpdGVTaXplIC8gMiwga05vVFMgfSwKLSAgICB7IGtOb1RTLCA0MDAwMDAwLCBrV3JpdGVTaXplIC8gMiwga05vVFMgfSwKLSAgICB7IGtOb1RTLCA4MDAwMDAwLCBrV3JpdGVTaXplIC8gMiwga05vVFMgfSwKLSAgICB7IGtOb1RTLCAxMDAwMDAwLCBrV3JpdGVTaXplLCBrTm9UUyB9LAotICAgIHsga05vVFMsIDQwMDAwMDAsIGtXcml0ZVNpemUsIGtOb1RTIH0sCi0gICAgeyBrTm9UUywgODAwMDAwMCwga1dyaXRlU2l6ZSwga05vVFMgfSwKLSAgICB7IDAsIDEwMDAwMDAsIDAsIDAgfSwKLSAgICB7IDAsIDQwMDAwMDAsIDAsIDAgfSwKLSAgICB7IDAsIDgwMDAwMDAsIDAsIDAgfSwKLSAgICB7IDAsIDEwMDAwMDAsIGtXcml0ZVNpemUgLyAyLCA1MDAwMDAgfSwKLSAgICB7IDAsIDQwMDAwMDAsIGtXcml0ZVNpemUgLyAyLCAyMDAwMDAwIH0sCi0gICAgeyAwLCA4MDAwMDAwLCBrV3JpdGVTaXplIC8gMiwgNDAwMDAwMCB9LAotICAgIHsgMCwgMTAwMDAwMCwga1dyaXRlU2l6ZSwgMTAwMDAwMCB9LAotICAgIHsgMCwgNDAwMDAwMCwga1dyaXRlU2l6ZSwgNDAwMDAwMCB9LAotICAgIHsgMCwgODAwMDAwMCwga1dyaXRlU2l6ZSwgODAwMDAwMCB9LAotICAgIHsgNSwgMTAwMDAwMCwgMCwgNSB9LAotICAgIHsgNSwgNDAwMDAwMCwgMCwgNSB9LAotICAgIHsgNSwgODAwMDAwMCwgMCwgNSB9LAotICAgIHsgNSwgMTAwMDAwMCwga1dyaXRlU2l6ZSAvIDIsIDUwMDAwNSB9LAotICAgIHsgNSwgNDAwMDAwMCwga1dyaXRlU2l6ZSAvIDIsIDIwMDAwMDUgfSwKLSAgICB7IDUsIDgwMDAwMDAsIGtXcml0ZVNpemUgLyAyLCA0MDAwMDA1IH0sCi0gICAgeyA1LCAxMDAwMDAwLCBrV3JpdGVTaXplLCAxMDAwMDA1IH0sCi0gICAgeyA1LCA0MDAwMDAwLCBrV3JpdGVTaXplLCA0MDAwMDA1IH0sCi0gICAgeyA1LCA4MDAwMDAwLCBrV3JpdGVTaXplLCA4MDAwMDA1IH0sCi0gIH07Ci0KLSAgLy8gY3VycmVudF90aW1lKCkgbXVzdCBpbml0aWFsbHkgcmV0dXJuIGtOb1RpbWVzdGFtcCgpLgotICBFWFBFQ1RfRVEoa05vVGltZXN0YW1wKCkuVG9JbnRlcm5hbFZhbHVlKCksCi0gICAgICAgICAgICBidWZmZXJfLmN1cnJlbnRfdGltZSgpLlRvSW50ZXJuYWxWYWx1ZSgpKTsKLQotICBzY29wZWRfcmVmcHRyPERhdGFCdWZmZXI+IGJ1ZmZlcihuZXcgRGF0YUJ1ZmZlcihkYXRhXywga1dyaXRlU2l6ZSkpOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlTSVpFX1VOU0FGRSh0ZXN0cyk7ICsraSkgewotICAgIGJ1ZmZlci0+U2V0VGltZXN0YW1wKGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pY3Jvc2Vjb25kcygKLSAgICAgICAgdGVzdHNbaV0uZmlyc3RfdGltZV91c2Vjb25kcykpOwotICAgIGJ1ZmZlci0+U2V0RHVyYXRpb24oYmFzZTo6VGltZURlbHRhOjpGcm9tTWljcm9zZWNvbmRzKAotICAgICAgICB0ZXN0c1tpXS5kdXJhdGlvbl91c2Vjb25kcykpOwotICAgIGJ1ZmZlcl8uQXBwZW5kKGJ1ZmZlci5nZXQoKSk7Ci0gICAgRVhQRUNUX1RSVUUoYnVmZmVyXy5TZWVrKHRlc3RzW2ldLmNvbnN1bWVfYnl0ZXMpKTsKLQotICAgIGludDY0IGFjdHVhbCA9IGJ1ZmZlcl8uY3VycmVudF90aW1lKCkuVG9JbnRlcm5hbFZhbHVlKCk7Ci0KLSAgICBFWFBFQ1RfRVEodGVzdHNbaV0uZXhwZWN0ZWRfdGltZSwgYWN0dWFsKSA8PCAiV2l0aCB0ZXN0ID0geyBzdGFydDoiCi0gICAgICAgIDw8IHRlc3RzW2ldLmZpcnN0X3RpbWVfdXNlY29uZHMgPDwgIiwgZHVyYXRpb246IgotICAgICAgICA8PCB0ZXN0c1tpXS5kdXJhdGlvbl91c2Vjb25kcyA8PCAiLCBjb25zdW1lZDoiCi0gICAgICAgIDw8IHRlc3RzW2ldLmNvbnN1bWVfYnl0ZXMgPDwgIiB9XG4iOwotCi0gICAgYnVmZmVyXy5DbGVhcigpOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2Uvc2VyaWFsX3J1bm5lci5jYyBiL3NyYy9tZWRpYS9iYXNlL3NlcmlhbF9ydW5uZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNmM2ZWQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2Uvc2VyaWFsX3J1bm5lci5jYworKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL3NlcmlhbF9ydW5uZXIuaCIKLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2tfaGVscGVycy5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3BfcHJveHkuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gQ29udmVydHMgYSBib3VuZCBmdW5jdGlvbiBhY2NlcHRpbmcgYSBDbG9zdXJlIGludG8gYSBib3VuZCBmdW5jdGlvbgotLy8gYWNjZXB0aW5nIGEgUGlwZWxpbmVTdGF0dXNDQi4gU2luY2UgY2xvc3VyZXMgaGF2ZSBubyB3YXkgb2YgcmVwb3J0aW5nIGEKLS8vIHN0YXR1cyB8c3RhdHVzX2NifCBpcyBleGVjdXRlZCB3aXRoIFBJUEVMSU5FX09LLgotc3RhdGljIHZvaWQgUnVuQm91bmRDbG9zdXJlKAotICAgIGNvbnN0IFNlcmlhbFJ1bm5lcjo6Qm91bmRDbG9zdXJlJiBib3VuZF9jbG9zdXJlLAotICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIHN0YXR1c19jYikgewotICBib3VuZF9jbG9zdXJlLlJ1bihiYXNlOjpCaW5kKHN0YXR1c19jYiwgUElQRUxJTkVfT0spKTsKLX0KLQotLy8gUnVucyB8c3RhdHVzX2NifCB3aXRoIHxsYXN0X3N0YXR1c3wgb24gfG1lc3NhZ2VfbG9vcHwuCi1zdGF0aWMgdm9pZCBSdW5Pbk1lc3NhZ2VMb29wKAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4mIG1lc3NhZ2VfbG9vcCwKLSAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBzdGF0dXNfY2IsCi0gICAgUGlwZWxpbmVTdGF0dXMgbGFzdF9zdGF0dXMpIHsKLSAgLy8gRm9yY2UgcG9zdCB0byBwZXJtaXQgY2FuY2VsbGF0aW9uIG9mIGEgc2VyaWVzIGluIHRoZSBzY2VuYXJpbyB3aGVyZSBhbGwKLSAgLy8gYm91bmQgZnVuY3Rpb25zIHJ1biBvbiB0aGUgc2FtZSB0aHJlYWQuCi0gIG1lc3NhZ2VfbG9vcC0+UG9zdFRhc2soRlJPTV9IRVJFLCBiYXNlOjpCaW5kKHN0YXR1c19jYiwgbGFzdF9zdGF0dXMpKTsKLX0KLQotU2VyaWFsUnVubmVyOjpRdWV1ZTo6UXVldWUoKSB7fQotU2VyaWFsUnVubmVyOjpRdWV1ZTo6flF1ZXVlKCkge30KLQotdm9pZCBTZXJpYWxSdW5uZXI6OlF1ZXVlOjpQdXNoKAotICAgIGNvbnN0IEJvdW5kQ2xvc3VyZSYgYm91bmRfY2xvc3VyZSkgewotICBib3VuZF9mbnNfLnB1c2goYmFzZTo6QmluZCgmUnVuQm91bmRDbG9zdXJlLCBib3VuZF9jbG9zdXJlKSk7Ci19Ci0KLXZvaWQgU2VyaWFsUnVubmVyOjpRdWV1ZTo6UHVzaCgKLSAgICBjb25zdCBCb3VuZFBpcGVsaW5lU3RhdHVzQ0ImIGJvdW5kX3N0YXR1c19jYikgewotICBib3VuZF9mbnNfLnB1c2goYm91bmRfc3RhdHVzX2NiKTsKLX0KLQotU2VyaWFsUnVubmVyOjpCb3VuZFBpcGVsaW5lU3RhdHVzQ0IgU2VyaWFsUnVubmVyOjpRdWV1ZTo6UG9wKCkgewotICBCb3VuZFBpcGVsaW5lU3RhdHVzQ0IgYm91bmRfZm4gPSBib3VuZF9mbnNfLmZyb250KCk7Ci0gIGJvdW5kX2Zuc18ucG9wKCk7Ci0gIHJldHVybiBib3VuZF9mbjsKLX0KLQotYm9vbCBTZXJpYWxSdW5uZXI6OlF1ZXVlOjplbXB0eSgpIHsKLSAgcmV0dXJuIGJvdW5kX2Zuc18uZW1wdHkoKTsKLX0KLQotU2VyaWFsUnVubmVyOjpTZXJpYWxSdW5uZXIoCi0gICAgY29uc3QgUXVldWUmIGJvdW5kX2ZucywgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgZG9uZV9jYikKLSAgICA6IHdlYWtfdGhpc18odGhpcyksCi0gICAgICBtZXNzYWdlX2xvb3BfKGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk6OmN1cnJlbnQoKSksCi0gICAgICBib3VuZF9mbnNfKGJvdW5kX2ZucyksCi0gICAgICBkb25lX2NiXyhkb25lX2NiKSB7Ci0gIG1lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKEZST01fSEVSRSwgYmFzZTo6QmluZCgKLSAgICAgICZTZXJpYWxSdW5uZXI6OlJ1bk5leHRJblNlcmllcywgd2Vha190aGlzXy5HZXRXZWFrUHRyKCksCi0gICAgICBQSVBFTElORV9PSykpOwotfQotCi1TZXJpYWxSdW5uZXI6On5TZXJpYWxSdW5uZXIoKSB7fQotCi1zY29wZWRfcHRyPFNlcmlhbFJ1bm5lcj4gU2VyaWFsUnVubmVyOjpSdW4oCi0gICAgY29uc3QgUXVldWUmIGJvdW5kX2ZucywgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgZG9uZV9jYikgewotICBzY29wZWRfcHRyPFNlcmlhbFJ1bm5lcj4gY2FsbGJhY2tfc2VyaWVzKAotICAgICAgbmV3IFNlcmlhbFJ1bm5lcihib3VuZF9mbnMsIGRvbmVfY2IpKTsKLSAgcmV0dXJuIGNhbGxiYWNrX3Nlcmllcy5QYXNzKCk7Ci19Ci0KLXZvaWQgU2VyaWFsUnVubmVyOjpSdW5OZXh0SW5TZXJpZXMoUGlwZWxpbmVTdGF0dXMgbGFzdF9zdGF0dXMpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIERDSEVDSyghZG9uZV9jYl8uaXNfbnVsbCgpKTsKLQotICBpZiAoYm91bmRfZm5zXy5lbXB0eSgpIHx8IGxhc3Rfc3RhdHVzICE9IFBJUEVMSU5FX09LKSB7Ci0gICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJmRvbmVfY2JfKS5SdW4obGFzdF9zdGF0dXMpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEJvdW5kUGlwZWxpbmVTdGF0dXNDQiBib3VuZF9mbiA9IGJvdW5kX2Zuc18uUG9wKCk7Ci0gIGJvdW5kX2ZuLlJ1bihiYXNlOjpCaW5kKCZSdW5Pbk1lc3NhZ2VMb29wLCBtZXNzYWdlX2xvb3BfLCBiYXNlOjpCaW5kKAotICAgICAgJlNlcmlhbFJ1bm5lcjo6UnVuTmV4dEluU2VyaWVzLCB3ZWFrX3RoaXNfLkdldFdlYWtQdHIoKSkpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9zZXJpYWxfcnVubmVyLmggYi9zcmMvbWVkaWEvYmFzZS9zZXJpYWxfcnVubmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZmE2ZjMuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2Uvc2VyaWFsX3J1bm5lci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9CQVNFX1NFUklBTF9SVU5ORVJfSF8KLSNkZWZpbmUgTUVESUFfQkFTRV9TRVJJQUxfUlVOTkVSX0hfCi0KLSNpbmNsdWRlIDxxdWV1ZT4KLQotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS93ZWFrX3B0ci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvcGlwZWxpbmVfc3RhdHVzLmgiCi0KLW5hbWVzcGFjZSBiYXNlIHsKLWNsYXNzIE1lc3NhZ2VMb29wUHJveHk7Ci19Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIFJ1bnMgYSBzZXJpZXMgb2YgYm91bmQgZnVuY3Rpb25zIGFjY2VwdGluZyBDbG9zdXJlcyBvciBQaXBlbGluZVN0YXR1c0NCLgotLy8gU2VyaWFsUnVubmVyIGRvZXNuJ3QgdXNlIHJlZ3VsYXIgQ2xvc3VyZS9QaXBlbGluZVN0YXR1c0NCcyBhcyBpdCBsYXRlIGJpbmRzCi0vLyB0aGUgY29tcGxldGlvbiBjYWxsYmFjayBhcyB0aGUgc2VyaWVzIHByb2dyZXNzZXMuCi1jbGFzcyBTZXJpYWxSdW5uZXIgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKGNvbnN0IGJhc2U6OkNsb3N1cmUmKT4gQm91bmRDbG9zdXJlOwotICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHZvaWQoY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYpPiBCb3VuZFBpcGVsaW5lU3RhdHVzQ0I7Ci0KLSAgLy8gU2VyaWFsIHF1ZXVlIG9mIGJvdW5kIGZ1bmN0aW9ucyB0byBydW4uCi0gIGNsYXNzIFF1ZXVlIHsKLSAgIHB1YmxpYzoKLSAgICBRdWV1ZSgpOwotICAgIH5RdWV1ZSgpOwotCi0gICAgdm9pZCBQdXNoKGNvbnN0IEJvdW5kQ2xvc3VyZSYgYm91bmRfZm4pOwotICAgIHZvaWQgUHVzaChjb25zdCBCb3VuZFBpcGVsaW5lU3RhdHVzQ0ImIGJvdW5kX2ZuKTsKLQotICAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgU2VyaWFsUnVubmVyOwotCi0gICAgQm91bmRQaXBlbGluZVN0YXR1c0NCIFBvcCgpOwotICAgIGJvb2wgZW1wdHkoKTsKLQotICAgIHN0ZDo6cXVldWU8Qm91bmRQaXBlbGluZVN0YXR1c0NCPiBib3VuZF9mbnNfOwotICB9OwotCi0gIC8vIEV4ZWN1dGVzIHRoZSBib3VuZCBmdW5jdGlvbnMgaW4gc2VyaWVzLCBleGVjdXRpbmcgfGRvbmVfY2J8IHdoZW4gZmluaXNoZWQuCi0gIC8vCi0gIC8vIEFsbCBib3VuZCBmdW5jdGlvbnMgYXJlIGV4ZWN1dGVkIG9uIHRoZSB0aHJlYWQgdGhhdCBSdW4oKSBpcyBjYWxsZWQgb24sCi0gIC8vIGluY2x1ZGluZyB8ZG9uZV9jYnwuCi0gIC8vCi0gIC8vIERlbGV0aW5nIHRoZSBvYmplY3Qgd2lsbCBwcmV2ZW50IGV4ZWN1dGlvbiBvZiBhbnkgdW5zdGFydGVkIGJvdW5kCi0gIC8vIGZ1bmN0aW9ucywgaW5jbHVkaW5nIHxkb25lX2NifC4KLSAgc3RhdGljIHNjb3BlZF9wdHI8U2VyaWFsUnVubmVyPiBSdW4oCi0gICAgICBjb25zdCBRdWV1ZSYgYm91bmRfZm5zLCBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBkb25lX2NiKTsKLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBzY29wZWRfcHRyPFNlcmlhbFJ1bm5lcj47Ci0KLSAgU2VyaWFsUnVubmVyKGNvbnN0IFF1ZXVlJiBib3VuZF9mbnMsIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGRvbmVfY2IpOwotICB+U2VyaWFsUnVubmVyKCk7Ci0KLSAgdm9pZCBSdW5OZXh0SW5TZXJpZXMoUGlwZWxpbmVTdGF0dXMgbGFzdF9zdGF0dXMpOwotCi0gIGJhc2U6OldlYWtQdHJGYWN0b3J5PFNlcmlhbFJ1bm5lcj4gd2Vha190aGlzXzsKLSAgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiBtZXNzYWdlX2xvb3BfOwotICBRdWV1ZSBib3VuZF9mbnNfOwotICBQaXBlbGluZVN0YXR1c0NCIGRvbmVfY2JfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTZXJpYWxSdW5uZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQkFTRV9TRVJJQUxfUlVOTkVSX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9zaGVsbF9hdWRpb19idXMuY2MgYi9zcmMvbWVkaWEvYmFzZS9zaGVsbF9hdWRpb19idXMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNWFkNWUuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2Uvc2hlbGxfYXVkaW9fYnVzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL3NoZWxsX2F1ZGlvX2J1cy5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGxpbWl0cz4KLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotbmFtZXNwYWNlIHsKLQotdHlwZWRlZiBTaGVsbEF1ZGlvQnVzOjpTdG9yYWdlVHlwZSBTdG9yYWdlVHlwZTsKLXR5cGVkZWYgU2hlbGxBdWRpb0J1czo6U2FtcGxlVHlwZSBTYW1wbGVUeXBlOwotCi1jb25zdCBmbG9hdCBrRmxvYXQzMlRvSW50MTZGYWN0b3IgPSAzMjc2OC5mOwotCi1pbmxpbmUgdm9pZCBDb252ZXJ0U2FtcGxlKFNoZWxsQXVkaW9CdXM6OlNhbXBsZVR5cGUgc3JjX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBzcmNfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTaGVsbEF1ZGlvQnVzOjpTYW1wbGVUeXBlIGRlc3RfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIGRlc3RfcHRyKSB7Ci0gIGlmIChzcmNfdHlwZSA9PSBkZXN0X3R5cGUpIHsKLSAgICBtZW1jcHkoZGVzdF9wdHIsIHNyY19wdHIsCi0gICAgICAgICAgIHNyY190eXBlID09IFNoZWxsQXVkaW9CdXM6OmtJbnQxNiA/IHNpemVvZihpbnQxNikgOiBzaXplb2YoZmxvYXQpKTsKLSAgfSBlbHNlIGlmIChzcmNfdHlwZSA9PSBTaGVsbEF1ZGlvQnVzOjprRmxvYXQzMikgewotICAgIGZsb2F0IHNhbXBsZV9pbl9mbG9hdCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0Kj4oc3JjX3B0cik7Ci0gICAgaW50MzIgc2FtcGxlX2luX2ludDMyID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzI+KHNhbXBsZV9pbl9mbG9hdCAqIGtGbG9hdDMyVG9JbnQxNkZhY3Rvcik7Ci0gICAgc2FtcGxlX2luX2ludDMyID0KLSAgICAgICAgc3RkOjptYXg8aW50MzI+KHNhbXBsZV9pbl9pbnQzMiwgc3RkOjpudW1lcmljX2xpbWl0czxpbnQxNj46Om1pbigpKTsKLSAgICBzYW1wbGVfaW5faW50MzIgPQotICAgICAgICBzdGQ6Om1pbjxpbnQzMj4oc2FtcGxlX2luX2ludDMyLCBzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2Pjo6bWF4KCkpOwotICAgICpyZWludGVycHJldF9jYXN0PGludDE2Kj4oZGVzdF9wdHIpID0gc3RhdGljX2Nhc3Q8aW50MTY+KHNhbXBsZV9pbl9pbnQzMik7Ci0gIH0gZWxzZSB7Ci0gICAgaW50MTYgc2FtcGxlID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50MTYqPihzcmNfcHRyKTsKLSAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KGRlc3RfcHRyKSA9Ci0gICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihzYW1wbGUpIC8ga0Zsb2F0MzJUb0ludDE2RmFjdG9yOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1TaGVsbEF1ZGlvQnVzOjpTaGVsbEF1ZGlvQnVzKHNpemVfdCBjaGFubmVscywgc2l6ZV90IGZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlVHlwZSBzYW1wbGVfdHlwZSwgU3RvcmFnZVR5cGUgc3RvcmFnZV90eXBlKQotICAgIDogY2hhbm5lbHNfKGNoYW5uZWxzKSwKLSAgICAgIGZyYW1lc18oZnJhbWVzKSwKLSAgICAgIHNhbXBsZV90eXBlXyhzYW1wbGVfdHlwZSksCi0gICAgICBzdG9yYWdlX3R5cGVfKHN0b3JhZ2VfdHlwZSkgewotICBEQ0hFQ0tfR1QoY2hhbm5lbHNfLCAwKTsKLQotICBpZiAoc3RvcmFnZV90eXBlXyA9PSBrSW50ZXJsZWF2ZWQpIHsKLSAgICBkYXRhXy5yZXNldChzdGF0aWNfY2FzdDx1aW50OCo+KGJhc2U6OkFsaWduZWRBbGxvYygKLSAgICAgICAgR2V0U2FtcGxlU2l6ZUluQnl0ZXMoKSAqIGZyYW1lcyAqIGNoYW5uZWxzLCBrQ2hhbm5lbEFsaWdubWVudEluQnl0ZXMpKSk7Ci0gICAgY2hhbm5lbF9kYXRhXy5wdXNoX2JhY2soZGF0YV8uZ2V0KCkpOwotICB9IGVsc2UgewotICAgIERDSEVDS19FUShzdG9yYWdlX3R5cGVfLCBrUGxhbmFyKTsKLSAgICBzaXplX3QgYWxpZ25lZF9wZXJfY2hhbm5lbF9zaXplX2luX2J5dGVzID0KLSAgICAgICAgKEdldFNhbXBsZVNpemVJbkJ5dGVzKCkgKiBmcmFtZXMgKyBrQ2hhbm5lbEFsaWdubWVudEluQnl0ZXMgLSAxKSAvCi0gICAgICAgIGtDaGFubmVsQWxpZ25tZW50SW5CeXRlcyAqIGtDaGFubmVsQWxpZ25tZW50SW5CeXRlczsKLSAgICBkYXRhXy5yZXNldChzdGF0aWNfY2FzdDx1aW50OCo+KAotICAgICAgICBiYXNlOjpBbGlnbmVkQWxsb2MoYWxpZ25lZF9wZXJfY2hhbm5lbF9zaXplX2luX2J5dGVzICogY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBrQ2hhbm5lbEFsaWdubWVudEluQnl0ZXMpKSk7Ci0gICAgY2hhbm5lbF9kYXRhXy5yZXNlcnZlKGNoYW5uZWxzKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNoYW5uZWxzXzsgKytpKSB7Ci0gICAgICBjaGFubmVsX2RhdGFfLnB1c2hfYmFjayhkYXRhXy5nZXQoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbmVkX3Blcl9jaGFubmVsX3NpemVfaW5fYnl0ZXMgKiBpKTsKLSAgICB9Ci0gIH0KLX0KLQotU2hlbGxBdWRpb0J1czo6U2hlbGxBdWRpb0J1cyhzaXplX3QgZnJhbWVzLCBjb25zdCBzdGQ6OnZlY3RvcjxmbG9hdCo+JiBzYW1wbGVzKQotICAgIDogY2hhbm5lbHNfKHNhbXBsZXMuc2l6ZSgpKSwKLSAgICAgIGZyYW1lc18oZnJhbWVzKSwKLSAgICAgIHNhbXBsZV90eXBlXyhrRmxvYXQzMiksCi0gICAgICBzdG9yYWdlX3R5cGVfKGtQbGFuYXIpIHsKLSAgRENIRUNLX0dUKGNoYW5uZWxzXywgMCk7Ci0KLSAgY2hhbm5lbF9kYXRhXy5yZXNlcnZlKHNhbXBsZXMuc2l6ZSgpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzYW1wbGVzLnNpemUoKTsgKytpKSB7Ci0gICAgY2hhbm5lbF9kYXRhXy5wdXNoX2JhY2socmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KHNhbXBsZXNbaV0pKTsKLSAgfQotfQotCi1TaGVsbEF1ZGlvQnVzOjpTaGVsbEF1ZGlvQnVzKHNpemVfdCBjaGFubmVscywgc2l6ZV90IGZyYW1lcywgZmxvYXQqIHNhbXBsZXMpCi0gICAgOiBjaGFubmVsc18oY2hhbm5lbHMpLAotICAgICAgZnJhbWVzXyhmcmFtZXMpLAotICAgICAgc2FtcGxlX3R5cGVfKGtGbG9hdDMyKSwKLSAgICAgIHN0b3JhZ2VfdHlwZV8oa0ludGVybGVhdmVkKSB7Ci0gIERDSEVDS19HVChjaGFubmVsc18sIDApOwotCi0gIGNoYW5uZWxfZGF0YV8ucHVzaF9iYWNrKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihzYW1wbGVzKSk7Ci19Ci0KLVNoZWxsQXVkaW9CdXM6OlNoZWxsQXVkaW9CdXMoc2l6ZV90IGZyYW1lcywgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MTYqPiYgc2FtcGxlcykKLSAgICA6IGNoYW5uZWxzXyhzYW1wbGVzLnNpemUoKSksCi0gICAgICBmcmFtZXNfKGZyYW1lcyksCi0gICAgICBzYW1wbGVfdHlwZV8oa0ludDE2KSwKLSAgICAgIHN0b3JhZ2VfdHlwZV8oa1BsYW5hcikgewotICBEQ0hFQ0tfR1QoY2hhbm5lbHNfLCAwKTsKLQotICBjaGFubmVsX2RhdGFfLnJlc2VydmUoc2FtcGxlcy5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNhbXBsZXMuc2l6ZSgpOyArK2kpIHsKLSAgICBjaGFubmVsX2RhdGFfLnB1c2hfYmFjayhyZWludGVycHJldF9jYXN0PHVpbnQ4Kj4oc2FtcGxlc1tpXSkpOwotICB9Ci19Ci0KLVNoZWxsQXVkaW9CdXM6OlNoZWxsQXVkaW9CdXMoc2l6ZV90IGNoYW5uZWxzLCBzaXplX3QgZnJhbWVzLCBpbnQxNiogc2FtcGxlcykKLSAgICA6IGNoYW5uZWxzXyhjaGFubmVscyksCi0gICAgICBmcmFtZXNfKGZyYW1lcyksCi0gICAgICBzYW1wbGVfdHlwZV8oa0ludDE2KSwKLSAgICAgIHN0b3JhZ2VfdHlwZV8oa0ludGVybGVhdmVkKSB7Ci0gIERDSEVDS19HVChjaGFubmVsc18sIDApOwotCi0gIGNoYW5uZWxfZGF0YV8ucHVzaF9iYWNrKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihzYW1wbGVzKSk7Ci19Ci0KLXNpemVfdCBTaGVsbEF1ZGlvQnVzOjpHZXRTYW1wbGVTaXplSW5CeXRlcygpIGNvbnN0IHsKLSAgaWYgKHNhbXBsZV90eXBlXyA9PSBrSW50MTYpIHsKLSAgICByZXR1cm4gc2l6ZW9mKGludDE2KTsKLSAgfQotICBEQ0hFQ0tfRVEoc2FtcGxlX3R5cGVfLCBrRmxvYXQzMik7Ci0gIHJldHVybiBzaXplb2YoZmxvYXQpOwotfQotCi1jb25zdCB1aW50OCogU2hlbGxBdWRpb0J1czo6aW50ZXJsZWF2ZWRfZGF0YSgpIGNvbnN0IHsKLSAgRENIRUNLX0VRKHN0b3JhZ2VfdHlwZV8sIGtJbnRlcmxlYXZlZCk7Ci0gIHJldHVybiBjaGFubmVsX2RhdGFfWzBdOwotfQotCi1jb25zdCB1aW50OCogU2hlbGxBdWRpb0J1czo6cGxhbmFyX2RhdGEoc2l6ZV90IGNoYW5uZWwpIGNvbnN0IHsKLSAgRENIRUNLX0xUKGNoYW5uZWwsIGNoYW5uZWxzXyk7Ci0gIERDSEVDS19FUShzdG9yYWdlX3R5cGVfLCBrUGxhbmFyKTsKLSAgcmV0dXJuIGNoYW5uZWxfZGF0YV9bY2hhbm5lbF07Ci19Ci0KLXZvaWQgU2hlbGxBdWRpb0J1czo6WmVyb0ZyYW1lcyhzaXplX3Qgc3RhcnRfZnJhbWUsIHNpemVfdCBlbmRfZnJhbWUpIHsKLSAgRENIRUNLX0xFKHN0YXJ0X2ZyYW1lLCBlbmRfZnJhbWUpOwotICBEQ0hFQ0tfTEUoZW5kX2ZyYW1lLCBmcmFtZXNfKTsKLSAgZW5kX2ZyYW1lID0gc3RkOjptaW4oZW5kX2ZyYW1lLCBmcmFtZXNfKTsKLSAgc3RhcnRfZnJhbWUgPSBzdGQ6Om1pbihzdGFydF9mcmFtZSwgZW5kX2ZyYW1lKTsKLSAgaWYgKHN0YXJ0X2ZyYW1lID49IGVuZF9mcmFtZSkgewotICAgIHJldHVybjsKLSAgfQotICBpZiAoc3RvcmFnZV90eXBlXyA9PSBrSW50ZXJsZWF2ZWQpIHsKLSAgICBtZW1zZXQoR2V0U2FtcGxlUHRyKDAsIHN0YXJ0X2ZyYW1lKSwgMCwKLSAgICAgICAgICAgR2V0U2FtcGxlU2l6ZUluQnl0ZXMoKSAqIChlbmRfZnJhbWUgLSBzdGFydF9mcmFtZSkgKiBjaGFubmVsc18pOwotICB9IGVsc2UgewotICAgIGZvciAoc2l6ZV90IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgY2hhbm5lbHNfOyArK2NoYW5uZWwpIHsKLSAgICAgIG1lbXNldChHZXRTYW1wbGVQdHIoY2hhbm5lbCwgc3RhcnRfZnJhbWUpLCAwLAotICAgICAgICAgICAgIEdldFNhbXBsZVNpemVJbkJ5dGVzKCkgKiAoZW5kX2ZyYW1lIC0gc3RhcnRfZnJhbWUpKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBTaGVsbEF1ZGlvQnVzOjpBc3NpZ24oY29uc3QgU2hlbGxBdWRpb0J1cyYgc291cmNlKSB7Ci0gIERDSEVDS19FUShjaGFubmVsc18sIHNvdXJjZS5jaGFubmVsc18pOwotICBpZiAoY2hhbm5lbHNfICE9IHNvdXJjZS5jaGFubmVsc18pIHsKLSAgICBaZXJvQWxsRnJhbWVzKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHNhbXBsZV90eXBlXyA9PSBzb3VyY2Uuc2FtcGxlX3R5cGVfICYmCi0gICAgICBzdG9yYWdlX3R5cGVfID09IHNvdXJjZS5zdG9yYWdlX3R5cGVfKSB7Ci0gICAgc2l6ZV90IGZyYW1lcyA9IHN0ZDo6bWluKGZyYW1lc18sIHNvdXJjZS5mcmFtZXNfKTsKLSAgICBpZiAoc3RvcmFnZV90eXBlXyA9PSBrSW50ZXJsZWF2ZWQpIHsKLSAgICAgIG1lbWNweShHZXRTYW1wbGVQdHIoMCwgMCksIHNvdXJjZS5HZXRTYW1wbGVQdHIoMCwgMCksCi0gICAgICAgICAgICAgR2V0U2FtcGxlU2l6ZUluQnl0ZXMoKSAqIGZyYW1lcyAqIGNoYW5uZWxzXyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZvciAoc2l6ZV90IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgY2hhbm5lbHNfOyArK2NoYW5uZWwpIHsKLSAgICAgICAgbWVtY3B5KEdldFNhbXBsZVB0cihjaGFubmVsLCAwKSwgc291cmNlLkdldFNhbXBsZVB0cihjaGFubmVsLCAwKSwKLSAgICAgICAgICAgICAgIEdldFNhbXBsZVNpemVJbkJ5dGVzKCkgKiBmcmFtZXMpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICBzaXplX3QgZnJhbWVzID0gc3RkOjptaW4oZnJhbWVzXywgc291cmNlLmZyYW1lc18pOwotICBmb3IgKHNpemVfdCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGNoYW5uZWxzXzsgKytjaGFubmVsKSB7Ci0gICAgZm9yIChzaXplX3QgZnJhbWUgPSAwOyBmcmFtZSA8IGZyYW1lczsgKytmcmFtZSkgewotICAgICAgQ29udmVydFNhbXBsZShzb3VyY2Uuc2FtcGxlX3R5cGVfLCBzb3VyY2UuR2V0U2FtcGxlUHRyKGNoYW5uZWwsIGZyYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3R5cGVfLCBHZXRTYW1wbGVQdHIoY2hhbm5lbCwgZnJhbWUpKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBTaGVsbEF1ZGlvQnVzOjpBc3NpZ24oY29uc3QgU2hlbGxBdWRpb0J1cyYgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZmxvYXQ+JiBtYXRyaXgpIHsKLSAgRENIRUNLX0VRKGNoYW5uZWxzKCkgKiBzb3VyY2UuY2hhbm5lbHMoKSwgbWF0cml4LnNpemUoKSk7Ci0gIERDSEVDS19FUShzYW1wbGVfdHlwZV8sIGtGbG9hdDMyKTsKLSAgRENIRUNLX0VRKHNvdXJjZS5zYW1wbGVfdHlwZV8sIGtGbG9hdDMyKTsKLSAgaWYgKGNoYW5uZWxzKCkgKiBzb3VyY2UuY2hhbm5lbHMoKSAhPSBtYXRyaXguc2l6ZSgpIHx8Ci0gICAgICBzYW1wbGVfdHlwZV8gIT0ga0Zsb2F0MzIgfHwgc291cmNlLnNhbXBsZV90eXBlXyAhPSBrRmxvYXQzMikgewotICAgIFplcm9BbGxGcmFtZXMoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzaXplX3QgZnJhbWVzID0gc3RkOjptaW4oZnJhbWVzXywgc291cmNlLmZyYW1lc18pOwotICBmb3IgKHNpemVfdCBkZXN0X2NoYW5uZWwgPSAwOyBkZXN0X2NoYW5uZWwgPCBjaGFubmVsc187ICsrZGVzdF9jaGFubmVsKSB7Ci0gICAgZm9yIChzaXplX3QgZnJhbWUgPSAwOyBmcmFtZSA8IGZyYW1lczsgKytmcmFtZSkgewotICAgICAgZmxvYXQgbWl4ZWRfc2FtcGxlID0gMC5mOwotICAgICAgZm9yIChzaXplX3Qgc3JjX2NoYW5uZWwgPSAwOyBzcmNfY2hhbm5lbCA8IHNvdXJjZS5jaGFubmVsc187Ci0gICAgICAgICAgICsrc3JjX2NoYW5uZWwpIHsKLSAgICAgICAgbWl4ZWRfc2FtcGxlICs9IHNvdXJjZS5HZXRGbG9hdDMyU2FtcGxlKHNyY19jaGFubmVsLCBmcmFtZSkgKgotICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4W2Rlc3RfY2hhbm5lbCAqIHNvdXJjZS5jaGFubmVsc18gKyBzcmNfY2hhbm5lbF07Ci0gICAgICB9Ci0gICAgICBTZXRGbG9hdDMyU2FtcGxlKGRlc3RfY2hhbm5lbCwgZnJhbWUsIG1peGVkX3NhbXBsZSk7Ci0gICAgfQotICB9Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VTYW1wbGVUeXBlLAotICAgICAgICAgIHR5cGVuYW1lIERlc3RTYW1wbGVUeXBlLAotICAgICAgICAgIFN0b3JhZ2VUeXBlIFNvdXJjZVN0b3JhZ2VUeXBlLAotICAgICAgICAgIFN0b3JhZ2VUeXBlIERlc3RTdG9yYWdlVHlwZT4KLXZvaWQgU2hlbGxBdWRpb0J1czo6TWl4Rm9yVHlwZXMoY29uc3QgU2hlbGxBdWRpb0J1cyYgc291cmNlKSB7Ci0gIGNvbnN0IHNpemVfdCBmcmFtZXMgPSBzdGQ6Om1pbihmcmFtZXNfLCBzb3VyY2UuZnJhbWVzXyk7Ci0KLSAgZm9yIChzaXplX3QgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBjaGFubmVsc187ICsrY2hhbm5lbCkgewotICAgIGZvciAoc2l6ZV90IGZyYW1lID0gMDsgZnJhbWUgPCBmcmFtZXM7ICsrZnJhbWUpIHsKLSAgICAgICpyZWludGVycHJldF9jYXN0PERlc3RTYW1wbGVUeXBlKj4oCi0gICAgICAgICAgR2V0U2FtcGxlUHRyRm9yVHlwZTxEZXN0U2FtcGxlVHlwZSwgRGVzdFN0b3JhZ2VUeXBlPihjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUpKSArPQotICAgICAgICAgIHNvdXJjZS5HZXRTYW1wbGVGb3JUeXBlPFNvdXJjZVNhbXBsZVR5cGUsIFNvdXJjZVN0b3JhZ2VUeXBlPihjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgU2hlbGxBdWRpb0J1czo6TWl4KGNvbnN0IFNoZWxsQXVkaW9CdXMmIHNvdXJjZSkgewotICBEQ0hFQ0tfRVEoY2hhbm5lbHNfLCBzb3VyY2UuY2hhbm5lbHNfKTsKLQotICBpZiAoY2hhbm5lbHNfICE9IHNvdXJjZS5jaGFubmVsc18pIHsKLSAgICBaZXJvQWxsRnJhbWVzKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gUHJvZmlsaW5nIGhhcyBpZGVudGlmaWVkIHRoaXMgYXJlYSBvZiBjb2RlIGFzIGhvdCwgc28gaW5zdGVhZCBvZiBjYWxsaW5nCi0gIC8vIEdldFNhbXBsZVB0ciwgd2hpY2ggYnJhbmNoZXMgZWFjaCB0aW1lIGl0IGlzIGNhbGxlZCwgd2UgYnJhbmNoIG9uY2UKLSAgLy8gYmVmb3JlIHdlIGxvb3AgYW5kIGlubGluZSB0aGUgYnJhbmNoIG9mIHRoZSBmdW5jdGlvbiB3ZSB3YW50LgotICBpZiAoc291cmNlLnNhbXBsZV90eXBlXyA9PSBrSW50MTYgJiYgc2FtcGxlX3R5cGVfID09IGtJbnQxNiAmJgotICAgICAgc291cmNlLnN0b3JhZ2VfdHlwZV8gPT0ga0ludGVybGVhdmVkICYmIHN0b3JhZ2VfdHlwZV8gPT0ga0ludGVybGVhdmVkKSB7Ci0gICAgTWl4Rm9yVHlwZXM8aW50MTYsIGludDE2LCBrSW50ZXJsZWF2ZWQsIGtJbnRlcmxlYXZlZD4oc291cmNlKTsKLSAgfSBlbHNlIGlmIChzb3VyY2Uuc2FtcGxlX3R5cGVfID09IGtJbnQxNiAmJiBzYW1wbGVfdHlwZV8gPT0ga0ludDE2ICYmCi0gICAgICAgICAgICAgc291cmNlLnN0b3JhZ2VfdHlwZV8gPT0ga0ludGVybGVhdmVkICYmIHN0b3JhZ2VfdHlwZV8gPT0ga1BsYW5hcikgewotICAgIE1peEZvclR5cGVzPGludDE2LCBpbnQxNiwga0ludGVybGVhdmVkLCBrUGxhbmFyPihzb3VyY2UpOwotICB9IGVsc2UgaWYgKHNvdXJjZS5zYW1wbGVfdHlwZV8gPT0ga0ludDE2ICYmIHNhbXBsZV90eXBlXyA9PSBrSW50MTYgJiYKLSAgICAgICAgICAgICBzb3VyY2Uuc3RvcmFnZV90eXBlXyA9PSBrUGxhbmFyICYmIHN0b3JhZ2VfdHlwZV8gPT0ga0ludGVybGVhdmVkKSB7Ci0gICAgTWl4Rm9yVHlwZXM8aW50MTYsIGludDE2LCBrUGxhbmFyLCBrSW50ZXJsZWF2ZWQ+KHNvdXJjZSk7Ci0gIH0gZWxzZSBpZiAoc291cmNlLnNhbXBsZV90eXBlXyA9PSBrSW50MTYgJiYgc2FtcGxlX3R5cGVfID09IGtJbnQxNiAmJgotICAgICAgICAgICAgIHNvdXJjZS5zdG9yYWdlX3R5cGVfID09IGtQbGFuYXIgJiYgc3RvcmFnZV90eXBlXyA9PSBrUGxhbmFyKSB7Ci0gICAgTWl4Rm9yVHlwZXM8aW50MTYsIGludDE2LCBrUGxhbmFyLCBrUGxhbmFyPihzb3VyY2UpOwotICB9IGVsc2UgaWYgKHNvdXJjZS5zYW1wbGVfdHlwZV8gPT0ga0ludDE2ICYmIHNhbXBsZV90eXBlXyA9PSBrRmxvYXQzMiAmJgotICAgICAgICAgICAgIHNvdXJjZS5zdG9yYWdlX3R5cGVfID09IGtJbnRlcmxlYXZlZCAmJgotICAgICAgICAgICAgIHN0b3JhZ2VfdHlwZV8gPT0ga0ludGVybGVhdmVkKSB7Ci0gICAgTWl4Rm9yVHlwZXM8aW50MTYsIGZsb2F0LCBrSW50ZXJsZWF2ZWQsIGtJbnRlcmxlYXZlZD4oc291cmNlKTsKLSAgfSBlbHNlIGlmIChzb3VyY2Uuc2FtcGxlX3R5cGVfID09IGtJbnQxNiAmJiBzYW1wbGVfdHlwZV8gPT0ga0Zsb2F0MzIgJiYKLSAgICAgICAgICAgICBzb3VyY2Uuc3RvcmFnZV90eXBlXyA9PSBrSW50ZXJsZWF2ZWQgJiYgc3RvcmFnZV90eXBlXyA9PSBrUGxhbmFyKSB7Ci0gICAgTWl4Rm9yVHlwZXM8aW50MTYsIGZsb2F0LCBrSW50ZXJsZWF2ZWQsIGtQbGFuYXI+KHNvdXJjZSk7Ci0gIH0gZWxzZSBpZiAoc291cmNlLnNhbXBsZV90eXBlXyA9PSBrSW50MTYgJiYgc2FtcGxlX3R5cGVfID09IGtGbG9hdDMyICYmCi0gICAgICAgICAgICAgc291cmNlLnN0b3JhZ2VfdHlwZV8gPT0ga1BsYW5hciAmJiBzdG9yYWdlX3R5cGVfID09IGtJbnRlcmxlYXZlZCkgewotICAgIE1peEZvclR5cGVzPGludDE2LCBmbG9hdCwga1BsYW5hciwga0ludGVybGVhdmVkPihzb3VyY2UpOwotICB9IGVsc2UgaWYgKHNvdXJjZS5zYW1wbGVfdHlwZV8gPT0ga0ludDE2ICYmIHNhbXBsZV90eXBlXyA9PSBrRmxvYXQzMiAmJgotICAgICAgICAgICAgIHNvdXJjZS5zdG9yYWdlX3R5cGVfID09IGtQbGFuYXIgJiYgc3RvcmFnZV90eXBlXyA9PSBrUGxhbmFyKSB7Ci0gICAgTWl4Rm9yVHlwZXM8aW50MTYsIGZsb2F0LCBrUGxhbmFyLCBrUGxhbmFyPihzb3VyY2UpOwotICB9IGVsc2UgaWYgKHNvdXJjZS5zYW1wbGVfdHlwZV8gPT0ga0Zsb2F0MzIgJiYgc2FtcGxlX3R5cGVfID09IGtJbnQxNiAmJgotICAgICAgICAgICAgIHNvdXJjZS5zdG9yYWdlX3R5cGVfID09IGtJbnRlcmxlYXZlZCAmJgotICAgICAgICAgICAgIHN0b3JhZ2VfdHlwZV8gPT0ga0ludGVybGVhdmVkKSB7Ci0gICAgTWl4Rm9yVHlwZXM8ZmxvYXQsIGludDE2LCBrSW50ZXJsZWF2ZWQsIGtJbnRlcmxlYXZlZD4oc291cmNlKTsKLSAgfSBlbHNlIGlmIChzb3VyY2Uuc2FtcGxlX3R5cGVfID09IGtGbG9hdDMyICYmIHNhbXBsZV90eXBlXyA9PSBrSW50MTYgJiYKLSAgICAgICAgICAgICBzb3VyY2Uuc3RvcmFnZV90eXBlXyA9PSBrSW50ZXJsZWF2ZWQgJiYgc3RvcmFnZV90eXBlXyA9PSBrUGxhbmFyKSB7Ci0gICAgTWl4Rm9yVHlwZXM8ZmxvYXQsIGludDE2LCBrSW50ZXJsZWF2ZWQsIGtQbGFuYXI+KHNvdXJjZSk7Ci0gIH0gZWxzZSBpZiAoc291cmNlLnNhbXBsZV90eXBlXyA9PSBrRmxvYXQzMiAmJiBzYW1wbGVfdHlwZV8gPT0ga0ludDE2ICYmCi0gICAgICAgICAgICAgc291cmNlLnN0b3JhZ2VfdHlwZV8gPT0ga1BsYW5hciAmJiBzdG9yYWdlX3R5cGVfID09IGtJbnRlcmxlYXZlZCkgewotICAgIE1peEZvclR5cGVzPGZsb2F0LCBpbnQxNiwga1BsYW5hciwga0ludGVybGVhdmVkPihzb3VyY2UpOwotICB9IGVsc2UgaWYgKHNvdXJjZS5zYW1wbGVfdHlwZV8gPT0ga0Zsb2F0MzIgJiYgc2FtcGxlX3R5cGVfID09IGtJbnQxNiAmJgotICAgICAgICAgICAgIHNvdXJjZS5zdG9yYWdlX3R5cGVfID09IGtQbGFuYXIgJiYgc3RvcmFnZV90eXBlXyA9PSBrUGxhbmFyKSB7Ci0gICAgTWl4Rm9yVHlwZXM8ZmxvYXQsIGludDE2LCBrUGxhbmFyLCBrUGxhbmFyPihzb3VyY2UpOwotICB9IGVsc2UgaWYgKHNvdXJjZS5zYW1wbGVfdHlwZV8gPT0ga0Zsb2F0MzIgJiYgc2FtcGxlX3R5cGVfID09IGtGbG9hdDMyICYmCi0gICAgICAgICAgICAgc291cmNlLnN0b3JhZ2VfdHlwZV8gPT0ga0ludGVybGVhdmVkICYmCi0gICAgICAgICAgICAgc3RvcmFnZV90eXBlXyA9PSBrSW50ZXJsZWF2ZWQpIHsKLSAgICBNaXhGb3JUeXBlczxmbG9hdCwgZmxvYXQsIGtJbnRlcmxlYXZlZCwga0ludGVybGVhdmVkPihzb3VyY2UpOwotICB9IGVsc2UgaWYgKHNvdXJjZS5zYW1wbGVfdHlwZV8gPT0ga0Zsb2F0MzIgJiYgc2FtcGxlX3R5cGVfID09IGtGbG9hdDMyICYmCi0gICAgICAgICAgICAgc291cmNlLnN0b3JhZ2VfdHlwZV8gPT0ga0ludGVybGVhdmVkICYmIHN0b3JhZ2VfdHlwZV8gPT0ga1BsYW5hcikgewotICAgIE1peEZvclR5cGVzPGZsb2F0LCBmbG9hdCwga0ludGVybGVhdmVkLCBrUGxhbmFyPihzb3VyY2UpOwotICB9IGVsc2UgaWYgKHNvdXJjZS5zYW1wbGVfdHlwZV8gPT0ga0Zsb2F0MzIgJiYgc2FtcGxlX3R5cGVfID09IGtGbG9hdDMyICYmCi0gICAgICAgICAgICAgc291cmNlLnN0b3JhZ2VfdHlwZV8gPT0ga1BsYW5hciAmJiBzdG9yYWdlX3R5cGVfID09IGtJbnRlcmxlYXZlZCkgewotICAgIE1peEZvclR5cGVzPGZsb2F0LCBmbG9hdCwga1BsYW5hciwga0ludGVybGVhdmVkPihzb3VyY2UpOwotICB9IGVsc2UgaWYgKHNvdXJjZS5zYW1wbGVfdHlwZV8gPT0ga0Zsb2F0MzIgJiYgc2FtcGxlX3R5cGVfID09IGtGbG9hdDMyICYmCi0gICAgICAgICAgICAgc291cmNlLnN0b3JhZ2VfdHlwZV8gPT0ga1BsYW5hciAmJiBzdG9yYWdlX3R5cGVfID09IGtQbGFuYXIpIHsKLSAgICBNaXhGb3JUeXBlczxmbG9hdCwgZmxvYXQsIGtQbGFuYXIsIGtQbGFuYXI+KHNvdXJjZSk7Ci0gIH0gZWxzZSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICB9Ci19Ci0KLXZvaWQgU2hlbGxBdWRpb0J1czo6TWl4KGNvbnN0IFNoZWxsQXVkaW9CdXMmIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0PiYgbWF0cml4KSB7Ci0gIERDSEVDS19FUShjaGFubmVscygpICogc291cmNlLmNoYW5uZWxzKCksIG1hdHJpeC5zaXplKCkpOwotICBEQ0hFQ0tfRVEoc2FtcGxlX3R5cGVfLCBrRmxvYXQzMik7Ci0gIERDSEVDS19FUShzb3VyY2Uuc2FtcGxlX3R5cGVfLCBrRmxvYXQzMik7Ci0gIGlmIChjaGFubmVscygpICogc291cmNlLmNoYW5uZWxzKCkgIT0gbWF0cml4LnNpemUoKSB8fAotICAgICAgc2FtcGxlX3R5cGVfICE9IGtGbG9hdDMyIHx8IHNvdXJjZS5zYW1wbGVfdHlwZV8gIT0ga0Zsb2F0MzIpIHsKLSAgICBaZXJvQWxsRnJhbWVzKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc2l6ZV90IGZyYW1lcyA9IHN0ZDo6bWluKGZyYW1lc18sIHNvdXJjZS5mcmFtZXNfKTsKLSAgZm9yIChzaXplX3QgZGVzdF9jaGFubmVsID0gMDsgZGVzdF9jaGFubmVsIDwgY2hhbm5lbHNfOyArK2Rlc3RfY2hhbm5lbCkgewotICAgIGZvciAoc2l6ZV90IGZyYW1lID0gMDsgZnJhbWUgPCBmcmFtZXM7ICsrZnJhbWUpIHsKLSAgICAgIGZsb2F0IG1peGVkX3NhbXBsZSA9IDAuZjsKLSAgICAgIGZvciAoc2l6ZV90IHNyY19jaGFubmVsID0gMDsgc3JjX2NoYW5uZWwgPCBzb3VyY2UuY2hhbm5lbHNfOwotICAgICAgICAgICArK3NyY19jaGFubmVsKSB7Ci0gICAgICAgIG1peGVkX3NhbXBsZSArPSBzb3VyY2UuR2V0RmxvYXQzMlNhbXBsZShzcmNfY2hhbm5lbCwgZnJhbWUpICoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeFtkZXN0X2NoYW5uZWwgKiBzb3VyY2UuY2hhbm5lbHNfICsgc3JjX2NoYW5uZWxdOwotICAgICAgfQotICAgICAgbWl4ZWRfc2FtcGxlICs9IEdldEZsb2F0MzJTYW1wbGUoZGVzdF9jaGFubmVsLCBmcmFtZSk7Ci0gICAgICBTZXRGbG9hdDMyU2FtcGxlKGRlc3RfY2hhbm5lbCwgZnJhbWUsIG1peGVkX3NhbXBsZSk7Ci0gICAgfQotICB9Ci19Ci0KLXVpbnQ4KiBTaGVsbEF1ZGlvQnVzOjpHZXRTYW1wbGVQdHIoc2l6ZV90IGNoYW5uZWwsIHNpemVfdCBmcmFtZSkgewotICBEQ0hFQ0tfTFQoY2hhbm5lbCwgY2hhbm5lbHNfKTsKLSAgRENIRUNLX0xUKGZyYW1lLCBmcmFtZXNfKTsKLQotICBpZiAoc3RvcmFnZV90eXBlXyA9PSBrSW50ZXJsZWF2ZWQpIHsKLSAgICByZXR1cm4gY2hhbm5lbF9kYXRhX1swXSArCi0gICAgICAgICAgIEdldFNhbXBsZVNpemVJbkJ5dGVzKCkgKiAoY2hhbm5lbHNfICogZnJhbWUgKyBjaGFubmVsKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gY2hhbm5lbF9kYXRhX1tjaGFubmVsXSArIEdldFNhbXBsZVNpemVJbkJ5dGVzKCkgKiBmcmFtZTsKLSAgfQotfQotCi1jb25zdCB1aW50OCogU2hlbGxBdWRpb0J1czo6R2V0U2FtcGxlUHRyKHNpemVfdCBjaGFubmVsLCBzaXplX3QgZnJhbWUpIGNvbnN0IHsKLSAgRENIRUNLX0xUKGNoYW5uZWwsIGNoYW5uZWxzXyk7Ci0gIERDSEVDS19MVChmcmFtZSwgZnJhbWVzXyk7Ci0KLSAgaWYgKHN0b3JhZ2VfdHlwZV8gPT0ga0ludGVybGVhdmVkKSB7Ci0gICAgcmV0dXJuIGNoYW5uZWxfZGF0YV9bMF0gKwotICAgICAgICAgICBHZXRTYW1wbGVTaXplSW5CeXRlcygpICogKGNoYW5uZWxzXyAqIGZyYW1lICsgY2hhbm5lbCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGNoYW5uZWxfZGF0YV9bY2hhbm5lbF0gKyBHZXRTYW1wbGVTaXplSW5CeXRlcygpICogZnJhbWU7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9zaGVsbF9hdWRpb19idXMuaCBiL3NyYy9tZWRpYS9iYXNlL3NoZWxsX2F1ZGlvX2J1cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmVhZjJjLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3NoZWxsX2F1ZGlvX2J1cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQkFTRV9TSEVMTF9BVURJT19CVVNfSF8KLSNkZWZpbmUgTUVESUFfQkFTRV9TSEVMTF9BVURJT19CVVNfSF8KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L2FsaWduZWRfbWVtb3J5LmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIFRoaXMgc3dpc3MgYXJteSBrbmlmZSBjbGFzcyBlbmNhcHN1bGF0ZXMgYXVkaW8gZGF0YSBpbiBtdWx0aXBsZSBjaGFubmVscywgaW4KLS8vIGRpZmZlcmVudCBzdG9yYWdlIHR5cGVzIGFuZCB3aXRoIGRpZmZlcmVudCBzYW1wbGUgc2l6ZXMuICBJdCBhbHNvIHByb3ZpZGVzCi0vLyBvcGVyYXRpb24gdG8gY29udmVydCwgbWl4IGJldHdlZW4gZGlmZmVyZW50IHR5cGVzIG9mIGF1ZGlvIGRhdGEuICBJdCBzaG91bGQKLS8vIGJlIHVzZWQgd2hlbmV2ZXIgc3VjaCBhdWRpbyBkYXRhIGlzIHN0b3JlZCBvciBwYXNzZWQgYXJvdW5kLgotLy8gSW4gdGhpcyBjbGFzcywgInNhbXBsZSIgaXMgb25lIGF1ZGlvIHdhdmUgZm9ybSBkYXRhIGF0IGEgY2VydGFpbiB0aW1lIGZyb20gYQotLy8gY2VydGFpbiBjaGFubmVsLCB3aGlsZSAiZnJhbWUiIHJlZmVycyB0byBhbGwgc2FtcGxlcyBhdCB0aGUgc2FtZSB0aW1lIGZyb20KLS8vIGFsbCBjaGFubmVscy4gIEZvciBleGFtcGxlLCBmb3IgYSA0ODAwMEtIeiBzdGVyZW8gYXVkaW8gd2l0aCBzYW1wbGVzIGluCi0vLyBmbG9hdCwgaXRzIHNhbXBsZSBzaXplIGluIGJ5dGVzIGlzIDQgYnV0IGl0cyBmcmFtZSBzaXplIGluIGJ5dGVzIGlzIDguICBPbmUKLS8vIHNlY29uZCBvZiBzdWNoIGF1ZGlvIGNvbnRhaW5zIDQ4MDAwIGZyYW1lcyAoOTYwMDAgc2FtcGxlcykuCi0vLyBOb3RlOiBUaGlzIGNsYXNzIGRvZXNuJ3QgZG8gZW5kaWFubmVzcyBjb252ZXJzaW9ucy4gIEl0IGFzc3VtZXMgdGhhdCBhbGwgZGF0YQotLy8gaXMgaW4gdGhlIGNvcnJlY3QgZW5kaWFubmVzcy4KLWNsYXNzIE1FRElBX0VYUE9SVCBTaGVsbEF1ZGlvQnVzIHsKLSBwdWJsaWM6Ci0gIC8vIEd1YXJhbnRlZWQgYWxpZ25tZW50IG9mIGVhY2ggY2hhbm5lbCdzIGRhdGE7IHVzZSA2NC1ieXRlIGFsaWdubWVudCBzbyBpdAotICAvLyBzYXRpc2ZpZXMgYWxsIG91ciBjdXJyZW50IHBsYXRmb3Jtcy4gIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgdXNlZCBmb3IKLSAgLy8gYnVmZmVycyB0aGF0IGFyZSBhbGxvY2F0ZWQgYW5kIG93bmVkIGJ5IHRoZSBTaGVsbEF1ZGlvQnVzLiAgV2UgZG9uJ3QKLSAgLy8gZW5mb3JjZSBhbGlnbm1lbnQgZm9yIHRoZSBidWZmZXJzIHBhc3NlZCBpbiBhbmQgZXh0cmEgY2F1dGlvbiBzaG91bGQgYmUKLSAgLy8gdGFrZW4gaWYgdGhleSBhcmUgdXNlZCBhcyBoYXJkd2FyZSBidWZmZXIuCi0gIHN0YXRpYyBjb25zdCBzaXplX3Qga0NoYW5uZWxBbGlnbm1lbnRJbkJ5dGVzID0gNjQ7Ci0KLSAgZW51bSBTYW1wbGVUeXBlIHsga0ludDE2LCBrRmxvYXQzMiB9OwotCi0gIGVudW0gU3RvcmFnZVR5cGUgeyBrSW50ZXJsZWF2ZWQsIGtQbGFuYXIgfTsKLQotICBTaGVsbEF1ZGlvQnVzKHNpemVfdCBjaGFubmVscywgc2l6ZV90IGZyYW1lcywgU2FtcGxlVHlwZSBzYW1wbGVfdHlwZSwKLSAgICAgICAgICAgICAgICBTdG9yYWdlVHlwZSBzdG9yYWdlX3R5cGUpOwotICBTaGVsbEF1ZGlvQnVzKHNpemVfdCBmcmFtZXMsIGNvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0Kj4mIHNhbXBsZXMpOwotICBTaGVsbEF1ZGlvQnVzKHNpemVfdCBjaGFubmVscywgc2l6ZV90IGZyYW1lcywgZmxvYXQqIHNhbXBsZXMpOwotICBTaGVsbEF1ZGlvQnVzKHNpemVfdCBmcmFtZXMsIGNvbnN0IHN0ZDo6dmVjdG9yPGludDE2Kj4mIHNhbXBsZXMpOwotICBTaGVsbEF1ZGlvQnVzKHNpemVfdCBjaGFubmVscywgc2l6ZV90IGZyYW1lcywgaW50MTYqIHNhbXBsZXMpOwotCi0gIHNpemVfdCBjaGFubmVscygpIGNvbnN0IHsgcmV0dXJuIGNoYW5uZWxzXzsgfQotICBzaXplX3QgZnJhbWVzKCkgY29uc3QgeyByZXR1cm4gZnJhbWVzXzsgfQotICBTYW1wbGVUeXBlIHNhbXBsZV90eXBlKCkgY29uc3QgeyByZXR1cm4gc2FtcGxlX3R5cGVfOyB9Ci0gIFN0b3JhZ2VUeXBlIHN0b3JhZ2VfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIHN0b3JhZ2VfdHlwZV87IH0KLSAgc2l6ZV90IEdldFNhbXBsZVNpemVJbkJ5dGVzKCkgY29uc3Q7Ci0gIGNvbnN0IHVpbnQ4KiBpbnRlcmxlYXZlZF9kYXRhKCkgY29uc3Q7Ci0gIGNvbnN0IHVpbnQ4KiBwbGFuYXJfZGF0YShzaXplX3QgY2hhbm5lbCkgY29uc3Q7Ci0KLSAgaW50MTYgR2V0SW50MTZTYW1wbGUoc2l6ZV90IGNoYW5uZWwsIHNpemVfdCBmcmFtZSkgY29uc3QgewotICAgIERDSEVDS19FUShzYW1wbGVfdHlwZV8sIGtJbnQxNik7Ci0gICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IGludDE2Kj4oR2V0U2FtcGxlUHRyKGNoYW5uZWwsIGZyYW1lKSk7Ci0gIH0KLSAgZmxvYXQgR2V0RmxvYXQzMlNhbXBsZShzaXplX3QgY2hhbm5lbCwgc2l6ZV90IGZyYW1lKSBjb25zdCB7Ci0gICAgRENIRUNLX0VRKHNhbXBsZV90eXBlXywga0Zsb2F0MzIpOwotICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCo+KEdldFNhbXBsZVB0cihjaGFubmVsLCBmcmFtZSkpOwotICB9Ci0KLSAgdm9pZCBaZXJvRnJhbWVzKHNpemVfdCBzdGFydF9mcmFtZSwgc2l6ZV90IGVuZF9mcmFtZSk7Ci0gIHZvaWQgWmVyb0FsbEZyYW1lcygpIHsgWmVyb0ZyYW1lcygwLCBmcmFtZXMoKSk7IH0KLQotICAvLyBDb3B5IGZyYW1lcyBmcm9tIHxzb3VyY2V8IHByb3ZpZGVkIHRoYXQgaXQgaGFzIHRoZSBzYW1lIG51bWJlciBvZiBjaGFubmVscwotICAvLyBhcyB0aGUgZGVzdGluYXRpb24gb2JqZWN0ICh0aGlzKS4gIFRoaXMgZnVuY3Rpb24gZG9lcyBhbnkgbmVjZXNzYXJ5Ci0gIC8vIGNvbnZlcnNpb24gYmV0d2VlbiBkaWZmZXJlbnQgc2FtcGxlIHR5cGVzIGFuZCBzdG9yYWdlIHR5cGVzLiAgV2hlbiBzb3VyY2UKLSAgLy8gaGFzIGxlc3MgZnJhbWVzIHRoYW4gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCwgaXQgd2lsbCBvbmx5IGNvcHkgdGhlc2UgZnJhbWVzCi0gIC8vIGFuZCB3aWxsIG5vdCBmaWxsIHRoZSByZXN0IGZyYW1lcyBpbiBvdXIgYnVmZmVyIHdpdGggMC4KLSAgdm9pZCBBc3NpZ24oY29uc3QgU2hlbGxBdWRpb0J1cyYgc291cmNlKTsKLQotICAvLyBUaGUgc2FtZSBhcyB0aGUgYWJvdmUgZnVuY3Rpb24gZXhjZXB0IHRoYXQgdGhpcyBmdW5jdGlvbiBhbHNvIGRvZXMgbWl4aW5nLgotICAvLyB8bWF0cml4fCBpcyBhIHxkZXN0LmNoYW5uZWxzKCl8IHJvdyAqIHxzb3VyY2UuY2hhbm5lbHMoKXwgY29sdW1uIG1hdHJpeCBpbgotICAvLyByb3cgbWFqb3IuCi0gIC8vIGRlc3Quc2FtcGxlW2Rlc3RfY2hhbm5lbF1bZnJhbWVdID0KLSAgLy8gICAgIHNvdXJjZS5zYW1wbGVbMF1bZnJhbWVdICogbWF0cml4W2Rlc3RfY2hhbm5lbCAqIHNvdXJjZS5jaGFubmVscygpICsgMF0KLSAgLy8gICArIHNvdXJjZS5zYW1wbGVbMV1bZnJhbWVdICogbWF0cml4W2Rlc3RfY2hhbm5lbCAqIHNvdXJjZS5jaGFubmVscygpICsgMV0KLSAgLy8gICAgIC4uLgotICAvLyAgICsgc291cmNlLnNhbXBsZVtzb3VyY2UuY2hhbm5lbHMoKSAtIDFdW2ZyYW1lXSAqCi0gIC8vICAgICAgICAgbWF0cml4W2NoYW5uZWxzKCkgKiBzb3VyY2UuY2hhbm5lbHMoKSArIHNvdXJjZS5jaGFubmVscygpIC0gMV07Ci0gIC8vIE5vdGU6IEJvdGggb2JqZWN0cyBtdXN0IGhhdmUgc3RvcmFnZSB0eXBlIG9mIGtGbG9hdDMyLgotICB2b2lkIEFzc2lnbihjb25zdCBTaGVsbEF1ZGlvQnVzJiBzb3VyY2UsIGNvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0PiYgbWF0cml4KTsKLQotICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgdGhlIHNhbWUgYXMgdGhlIEFzc2lnbigpIGZ1bmN0aW9ucyBleGNlcHQgdGhhdAotICAvLyB0aGV5IGFkZCB0aGUgY2FsY3VsYXRlZCBzYW1wbGVzIHRvIHRoZSB0YXJnZXQgc2FtcGxlcyBpbnN0ZWFkIG9mIHJlcGxhY2luZwotICAvLyB0aGUgdGFyZ2V0IHNhbXBsZXMgd2l0aCB0aGUgY2FsY3VsYXRlZCBzYW1wbGVzLgotICAvLyBOb3RlOiBCb3RoIG9iamVjdHMgbXVzdCBoYXZlIHN0b3JhZ2UgdHlwZSBvZiBrRmxvYXQzMi4KLSAgdm9pZCBNaXgoY29uc3QgU2hlbGxBdWRpb0J1cyYgc291cmNlKTsKLSAgdm9pZCBNaXgoY29uc3QgU2hlbGxBdWRpb0J1cyYgc291cmNlLCBjb25zdCBzdGQ6OnZlY3RvcjxmbG9hdD4mIG1hdHJpeCk7Ci0KLSBwdWJsaWM6Ci0gIC8vIFRoZSAuKkZvclR5cGVzPyBmdW5jdGlvbnMgYmVsb3cgYXJlIG9wdGltaXplZCB2ZXJzaW9ucyB0aGF0IGFzc3VtZSB3aGF0Ci0gIC8vIHN0b3JhZ2UgdHlwZSB0aGUgYnVzIGlzIHVzaW5nLiAgVGhleSBhcmUgbWVhbnQgdG8gYmUgY2FsbGVkIGFmdGVyCi0gIC8vIGNoZWNraW5nIHdoYXQgc3RvcmFnZSB0eXBlIHRoZSBidXMgaXMgb25jZSwgYW5kIHRoZW4gcGVyZm9ybWluZyBhIGJhdGNoCi0gIC8vIG9mIG9wZXJhdGlvbnMsIHdoZXJlIGl0IGlzIGtub3duIHRoYXQgdGhlIHR5cGUgd2lsbCBub3QgY2hhbmdlLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2FtcGxlVHlwZU5hbWUsIFN0b3JhZ2VUeXBlIFQ+Ci0gIGlubGluZSB1aW50OCogR2V0U2FtcGxlUHRyRm9yVHlwZShzaXplX3QgY2hhbm5lbCwgc2l6ZV90IGZyYW1lKSBjb25zdCB7Ci0gICAgRENIRUNLX0xUKGNoYW5uZWwsIGNoYW5uZWxzXyk7Ci0gICAgRENIRUNLX0xUKGZyYW1lLCBmcmFtZXNfKTsKLQotICAgIGlmIChUID09IGtJbnRlcmxlYXZlZCkgewotICAgICAgcmV0dXJuIGNoYW5uZWxfZGF0YV9bMF0gKwotICAgICAgICAgICAgIHNpemVvZihTYW1wbGVUeXBlTmFtZSkgKiAoY2hhbm5lbHNfICogZnJhbWUgKyBjaGFubmVsKTsKLSAgICB9IGVsc2UgaWYgKFQgPT0ga1BsYW5hcikgewotICAgICAgcmV0dXJuIGNoYW5uZWxfZGF0YV9bY2hhbm5lbF0gKyBzaXplb2YoU2FtcGxlVHlwZU5hbWUpICogZnJhbWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIE5PVFJFQUNIRUQoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBTYW1wbGVUeXBlTmFtZSwgU3RvcmFnZVR5cGUgVD4KLSAgaW5saW5lIFNhbXBsZVR5cGVOYW1lIEdldFNhbXBsZUZvclR5cGUoc2l6ZV90IGNoYW5uZWwsIHNpemVfdCBmcmFtZSkgY29uc3QgewotICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTYW1wbGVUeXBlTmFtZSo+KAotICAgICAgICBHZXRTYW1wbGVQdHJGb3JUeXBlPFNhbXBsZVR5cGVOYW1lLCBUPihjaGFubmVsLCBmcmFtZSkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVNhbXBsZVR5cGUsCi0gICAgICAgICAgICB0eXBlbmFtZSBEZXN0U2FtcGxlVHlwZSwKLSAgICAgICAgICAgIFN0b3JhZ2VUeXBlIFNvdXJjZVN0b3JhZ2VUeXBlLAotICAgICAgICAgICAgU3RvcmFnZVR5cGUgRGVzdFN0b3JhZ2VUeXBlPgotICB2b2lkIE1peEZvclR5cGVzKGNvbnN0IFNoZWxsQXVkaW9CdXMmIHNvdXJjZSk7Ci0KLSBwcml2YXRlOgotICB2b2lkIFNldEZsb2F0MzJTYW1wbGUoc2l6ZV90IGNoYW5uZWwsIHNpemVfdCBmcmFtZSwgZmxvYXQgc2FtcGxlKSB7Ci0gICAgRENIRUNLX0VRKHNhbXBsZV90eXBlXywga0Zsb2F0MzIpOwotICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0Kj4oR2V0U2FtcGxlUHRyKGNoYW5uZWwsIGZyYW1lKSkgPSBzYW1wbGU7Ci0gIH0KLSAgdWludDgqIEdldFNhbXBsZVB0cihzaXplX3QgY2hhbm5lbCwgc2l6ZV90IGZyYW1lKTsKLSAgY29uc3QgdWludDgqIEdldFNhbXBsZVB0cihzaXplX3QgY2hhbm5lbCwgc2l6ZV90IGZyYW1lKSBjb25zdDsKLQotICAvLyBDb250aWd1b3VzIGJsb2NrIG9mIGNoYW5uZWwgbWVtb3J5IGlmIHRoZSBtZW1vcnkgaXMgb3duZWQgYnkgdGhpcyBvYmplY3QuCi0gIHNjb3BlZF9wdHJfbWFsbG9jPHVpbnQ4LCBiYXNlOjpTY29wZWRQdHJBbGlnbmVkRnJlZT4gZGF0YV87Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDgqPiBjaGFubmVsX2RhdGFfOwotICBzaXplX3QgY2hhbm5lbHNfOwotICBzaXplX3QgZnJhbWVzXzsKLSAgU2FtcGxlVHlwZSBzYW1wbGVfdHlwZV87Ci0gIFN0b3JhZ2VUeXBlIHN0b3JhZ2VfdHlwZV87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNoZWxsQXVkaW9CdXMpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQkFTRV9TSEVMTF9BVURJT19CVVNfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3NoZWxsX2F1ZGlvX2J1c190ZXN0LmNjIGIvc3JjL21lZGlhL2Jhc2Uvc2hlbGxfYXVkaW9fYnVzX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNTI0MGEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2Uvc2hlbGxfYXVkaW9fYnVzX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1ODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2hlbGxfYXVkaW9fYnVzLmgiCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotYm9vbCBWZXJpZnlWYWx1ZXMoY29uc3QgVCogZGF0YSwgc2l6ZV90IHNpemUsIFQgdmFsdWUpIHsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICBpZiAoZGF0YVtpXSAhPSB2YWx1ZSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci12b2lkIEZpbGxWYWx1ZXMoVCogZGF0YSwgc2l6ZV90IHNpemUsIFQgdmFsdWUpIHsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICBkYXRhW2ldID0gdmFsdWU7Ci0gIH0KLX0KLQotdm9pZCBTY3JpYmJsZSh1aW50OCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICBkYXRhW2ldID0gc3RhdGljX2Nhc3Q8dWludDg+KGkgKyAweDM0KTsKLSAgfQotfQotCi1ib29sIFZlcmlmeVNjcmliYmxlKGNvbnN0IHVpbnQ4KiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgIGlmIChkYXRhW2ldICE9IHN0YXRpY19jYXN0PHVpbnQ4PihpICsgMHgzNCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyB3aXRoIGF1ZGlvIGJ1cyBjb250YWluaW5nIGZsb2F0MzIgc2FtcGxlcy4KLWJvb2wgSXNTYW1lQ2hhbm5lbChjb25zdCBTaGVsbEF1ZGlvQnVzJiBhdWRpb19idXNfMSwKLSAgICAgICAgICAgICAgICAgICBzaXplX3QgY2hhbm5lbF8xLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IFNoZWxsQXVkaW9CdXMmIGF1ZGlvX2J1c18yLAotICAgICAgICAgICAgICAgICAgIHNpemVfdCBjaGFubmVsXzIpIHsKLSAgaWYgKGF1ZGlvX2J1c18xLmZyYW1lcygpICE9IGF1ZGlvX2J1c18yLmZyYW1lcygpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGZvciAoc2l6ZV90IGZyYW1lID0gMDsgZnJhbWUgPCBhdWRpb19idXNfMS5mcmFtZXMoKTsgKytmcmFtZSkgewotICAgIGlmIChmYWJzZihhdWRpb19idXNfMS5HZXRGbG9hdDMyU2FtcGxlKGNoYW5uZWxfMSwgZnJhbWUpIC0KLSAgICAgICAgICAgICAgYXVkaW9fYnVzXzIuR2V0RmxvYXQzMlNhbXBsZShjaGFubmVsXzIsIGZyYW1lKSkgPiAwLjAwMSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gVGhpcyBjbGFzcyBhbGxvY2F0ZXMgYnVmZmVyIHdpdGggZXh0cmEgZ3VhcmQgYnl0ZXMgaW4gdGhlIGZyb250IGFuZCBiYWNrIG9mCi0vLyB0aGUgYnVmZmVyLiAgSXQgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IGlmIHRoZSBTaGVsbEF1ZGlvQnVzIGltcGxlbWVudGF0aW9uCi0vLyB3cml0ZXMgYW55IGRhdGEgb3V0IG9mIGJvdW5kYXJ5LgotY2xhc3MgR3VhcmRlZEJ1ZmZlcnMgewotIHB1YmxpYzoKLSAgR3VhcmRlZEJ1ZmZlcnMoc2l6ZV90IG51bWJlcl9vZl9idWZmZXJzLCBzaXplX3QgYnl0ZXNfcGVyX2J1ZmZlcikgewotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4PiBidWZmZXIoYnl0ZXNfcGVyX2J1ZmZlciArIGtHdWFyZEJ5dGVzICogMik7Ci0gICAgYnVmZmVyc18ucmVzaXplKG51bWJlcl9vZl9idWZmZXJzLCBidWZmZXIpOwotICAgIFNjcmliYmxlQ29udGVudCgpOwotICB9Ci0KLSAgdm9pZCBTY3JpYmJsZUNvbnRlbnQoKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBidWZmZXJzXy5zaXplKCk7ICsraSkgewotICAgICAgU2NyaWJibGUoJmJ1ZmZlcnNfW2ldWzBdLCBrR3VhcmRCeXRlcyk7Ci0gICAgICBTY3JpYmJsZSgmYnVmZmVyc19baV1bYnVmZmVyc19baV0uc2l6ZSgpIC0ga0d1YXJkQnl0ZXNdLCBrR3VhcmRCeXRlcyk7Ci0gICAgICBTY3JpYmJsZSgmYnVmZmVyc19baV1ba0d1YXJkQnl0ZXNdLCBidWZmZXJzX1tpXS5zaXplKCkgLSBrR3VhcmRCeXRlcyAqIDIpOwotICAgIH0KLSAgfQotCi0gIGJvb2wgVmVyaWZ5R3VhcmRCeXRlcygpIGNvbnN0IHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZmZlcnNfLnNpemUoKTsgKytpKSB7Ci0gICAgICBpZiAoIVZlcmlmeVNjcmliYmxlKCZidWZmZXJzX1tpXVswXSwga0d1YXJkQnl0ZXMpIHx8Ci0gICAgICAgICAgIVZlcmlmeVNjcmliYmxlKCZidWZmZXJzX1tpXVtidWZmZXJzX1tpXS5zaXplKCkgLSBrR3VhcmRCeXRlc10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGtHdWFyZEJ5dGVzKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIFQqIEdldEJ1ZmZlcihzaXplX3QgaW5kZXgpIHsKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUKj4oJmJ1ZmZlcnNfLmF0KGluZGV4KVtrR3VhcmRCeXRlc10pOwotICB9Ci0KLSBwcml2YXRlOgotICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHVpbnQ4PiBCdWZmZXI7Ci0gIHR5cGVkZWYgc3RkOjp2ZWN0b3I8QnVmZmVyPiBCdWZmZXJzOwotCi0gIHN0YXRpYyBjb25zdCBzaXplX3Qga0d1YXJkQnl0ZXMgPSAyNTY7Ci0KLSAgQnVmZmVycyBidWZmZXJzXzsKLX07Ci0KLWNsYXNzIFNoZWxsQXVkaW9CdXNUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICB0eXBlZGVmIFNoZWxsQXVkaW9CdXM6OlNhbXBsZVR5cGUgU2FtcGxlVHlwZTsKLSAgdHlwZWRlZiBTaGVsbEF1ZGlvQnVzOjpTdG9yYWdlVHlwZSBTdG9yYWdlVHlwZTsKLQotICB+U2hlbGxBdWRpb0J1c1Rlc3QoKSB7Ci0gICAgLy8gV2UgZG8gYW4gZXh0cmEgY2FsbCB0byBWZXJpZnlHdWFyZEJ5dGVzKCkganVzdCBpbiBjYXNlIGlmIGl0IHdhcyBvbWl0dGVkCi0gICAgLy8gaW4gYSB0ZXN0LiAgSXQgaXMgc3RpbGwgcmVjb21tZW5kZWQgdG8gdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgaW4gaW5kaXZpZHVhbAotICAgIC8vIHRlc3RzIHNvIHRoZSBmYWlsdXJlIG1lc3NhZ2UgaXMgbW9yZSBpbmZvcm1hdGlvbmFsLgotICAgIGlmIChndWFyZGVkX2J1ZmZlcnNfKSB7Ci0gICAgICBFWFBFQ1RfVFJVRShndWFyZGVkX2J1ZmZlcnNfLT5WZXJpZnlHdWFyZEJ5dGVzKCkpOwotICAgIH0KLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICB2b2lkIENyZWF0ZUF1ZGlvQnVzKFN0b3JhZ2VUeXBlIHN0b3JhZ2VfdHlwZSkgewotICAgIC8vIFdlIGRvIGFuIGV4dHJhIGNhbGwgdG8gVmVyaWZ5R3VhcmRCeXRlcygpIGp1c3QgaW4gY2FzZSBpZiBpdCB3YXMgb21pdHRlZAotICAgIC8vIGluIGEgdGVzdC4gIEl0IGlzIHN0aWxsIHJlY29tbWVuZGVkIHRvIHZlcmlmeSB0aGUgaW50ZWdyaXR5IGluIGluZGl2aWR1YWwKLSAgICAvLyB0ZXN0cyBzbyB0aGUgZmFpbHVyZSBtZXNzYWdlIGlzIG1vcmUgaW5mb3JtYXRpb25hbC4KLSAgICBpZiAoZ3VhcmRlZF9idWZmZXJzXykgewotICAgICAgRVhQRUNUX1RSVUUoZ3VhcmRlZF9idWZmZXJzXy0+VmVyaWZ5R3VhcmRCeXRlcygpKTsKLSAgICB9Ci0gICAgaWYgKHN0b3JhZ2VfdHlwZSA9PSBTaGVsbEF1ZGlvQnVzOjprUGxhbmFyKSB7Ci0gICAgICBndWFyZGVkX2J1ZmZlcnNfLnJlc2V0KAotICAgICAgICAgIG5ldyBHdWFyZGVkQnVmZmVycyhrQ2hhbm5lbHMsIHNpemVvZihUKSAqIGtGcmFtZXMpKTsKLSAgICAgIHN0ZDo6dmVjdG9yPFQqPiBzYW1wbGVzOwotICAgICAgZm9yIChzaXplX3QgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBrQ2hhbm5lbHM7ICsrY2hhbm5lbCkgewotICAgICAgICBzYW1wbGVzLnB1c2hfYmFjayhndWFyZGVkX2J1ZmZlcnNfLT5HZXRCdWZmZXI8VD4oY2hhbm5lbCkpOwotICAgICAgfQotICAgICAgYXVkaW9fYnVzXy5yZXNldChuZXcgU2hlbGxBdWRpb0J1cyhrRnJhbWVzLCBzYW1wbGVzKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGd1YXJkZWRfYnVmZmVyc18ucmVzZXQoCi0gICAgICAgICAgbmV3IEd1YXJkZWRCdWZmZXJzKDEsIHNpemVvZihUKSAqIGtGcmFtZXMgKiBrQ2hhbm5lbHMpKTsKLSAgICAgIGF1ZGlvX2J1c18ucmVzZXQobmV3IFNoZWxsQXVkaW9CdXMoa0NoYW5uZWxzLCBrRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWFyZGVkX2J1ZmZlcnNfLT5HZXRCdWZmZXI8VD4oMCkpKTsKLSAgICB9Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgc3RhdGljIGNvbnN0IHNpemVfdCBrQ2hhbm5lbHM7Ci0gIHN0YXRpYyBjb25zdCBzaXplX3Qga0ZyYW1lczsKLQotICBzY29wZWRfcHRyPEd1YXJkZWRCdWZmZXJzPiBndWFyZGVkX2J1ZmZlcnNfOwotICBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IGF1ZGlvX2J1c187Ci19OwotCi1jb25zdCBzaXplX3QgU2hlbGxBdWRpb0J1c1Rlc3Q6OmtDaGFubmVscyA9IDM7Ci1jb25zdCBzaXplX3QgU2hlbGxBdWRpb0J1c1Rlc3Q6OmtGcmFtZXMgPSA4MDk7Ci0KLVRFU1RfRihTaGVsbEF1ZGlvQnVzVGVzdCwgQ29uc3RydWN0b3JXaXRoQWxsb2NhdGlvbikgewotICBTaGVsbEF1ZGlvQnVzIGF1ZGlvX2J1cyhrQ2hhbm5lbHMsIGtGcmFtZXMsIFNoZWxsQXVkaW9CdXM6OmtGbG9hdDMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTaGVsbEF1ZGlvQnVzOjprUGxhbmFyKTsKLSAgRVhQRUNUX0VRKGF1ZGlvX2J1cy5jaGFubmVscygpLCBrQ2hhbm5lbHMpOwotICBFWFBFQ1RfRVEoYXVkaW9fYnVzLmZyYW1lcygpLCBrRnJhbWVzKTsKLSAgZm9yIChzaXplX3QgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBhdWRpb19idXMuY2hhbm5lbHMoKTsgKytjaGFubmVsKSB7Ci0gICAgY29uc3QgdWludDgqIHNhbXBsZXMgPSBhdWRpb19idXMucGxhbmFyX2RhdGEoY2hhbm5lbCk7Ci0gICAgRVhQRUNUX0VRKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KHNhbXBsZXMpICUKLSAgICAgICAgICAgICAgICAgIFNoZWxsQXVkaW9CdXM6OmtDaGFubmVsQWxpZ25tZW50SW5CeXRlcywKLSAgICAgICAgICAgICAgMCk7Ci0gIH0KLX0KLQotVEVTVF9GKFNoZWxsQXVkaW9CdXNUZXN0LCBDb25zdHJ1Y3RvcldpdGhvdXRBbGxvY2F0aW9uKSB7Ci0gIENyZWF0ZUF1ZGlvQnVzPGZsb2F0PihTaGVsbEF1ZGlvQnVzOjprSW50ZXJsZWF2ZWQpOwotICBFWFBFQ1RfRVEoYXVkaW9fYnVzXy0+Y2hhbm5lbHMoKSwga0NoYW5uZWxzKTsKLSAgRVhQRUNUX0VRKGF1ZGlvX2J1c18tPmZyYW1lcygpLCBrRnJhbWVzKTsKLSAgY29uc3QgZmxvYXQqIHNhbXBsZXMgPQotICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCo+KGF1ZGlvX2J1c18tPmludGVybGVhdmVkX2RhdGEoKSk7Ci0gIEVYUEVDVF9FUShzYW1wbGVzLCBndWFyZGVkX2J1ZmZlcnNfLT5HZXRCdWZmZXI8ZmxvYXQ+KDApKTsKLSAgRVhQRUNUX1RSVUUoZ3VhcmRlZF9idWZmZXJzXy0+VmVyaWZ5R3VhcmRCeXRlcygpKTsKLQotICBDcmVhdGVBdWRpb0J1czxpbnQxNj4oU2hlbGxBdWRpb0J1czo6a1BsYW5hcik7Ci0gIEVYUEVDVF9FUShhdWRpb19idXNfLT5jaGFubmVscygpLCBrQ2hhbm5lbHMpOwotICBFWFBFQ1RfRVEoYXVkaW9fYnVzXy0+ZnJhbWVzKCksIGtGcmFtZXMpOwotICBmb3IgKHNpemVfdCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGF1ZGlvX2J1c18tPmNoYW5uZWxzKCk7ICsrY2hhbm5lbCkgewotICAgIGNvbnN0IGludDE2KiBzYW1wbGVzID0KLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQxNio+KGF1ZGlvX2J1c18tPnBsYW5hcl9kYXRhKGNoYW5uZWwpKTsKLSAgICBFWFBFQ1RfRVEoc2FtcGxlcywgZ3VhcmRlZF9idWZmZXJzXy0+R2V0QnVmZmVyPGludDE2PihjaGFubmVsKSk7Ci0gIH0KLSAgRVhQRUNUX1RSVUUoZ3VhcmRlZF9idWZmZXJzXy0+VmVyaWZ5R3VhcmRCeXRlcygpKTsKLX0KLQotVEVTVF9GKFNoZWxsQXVkaW9CdXNUZXN0LCBHZXRTYW1wbGVTaXplSW5CeXRlcykgewotICBTaGVsbEF1ZGlvQnVzIGZsb2F0X2F1ZGlvX2J1cygyLCA0LCBTaGVsbEF1ZGlvQnVzOjprRmxvYXQzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGxBdWRpb0J1czo6a1BsYW5hcik7Ci0gIEVYUEVDVF9FUShmbG9hdF9hdWRpb19idXMuR2V0U2FtcGxlU2l6ZUluQnl0ZXMoKSwgc2l6ZW9mKGZsb2F0KSk7Ci0gIFNoZWxsQXVkaW9CdXMgaW50MTZfYXVkaW9fYnVzKDIsIDQsIFNoZWxsQXVkaW9CdXM6OmtJbnQxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGxBdWRpb0J1czo6a1BsYW5hcik7Ci0gIEVYUEVDVF9FUShpbnQxNl9hdWRpb19idXMuR2V0U2FtcGxlU2l6ZUluQnl0ZXMoKSwgc2l6ZW9mKGludDE2KSk7Ci19Ci0KLVRFU1RfRihTaGVsbEF1ZGlvQnVzVGVzdCwgR2V0U2FtcGxlKSB7Ci0gIENyZWF0ZUF1ZGlvQnVzPGZsb2F0PihTaGVsbEF1ZGlvQnVzOjprSW50ZXJsZWF2ZWQpOwotICAvLyBNYXJrIHRoZSBmaXJzdCBzYW1wbGUgb2YgdGhlIGZpcnN0IGNoYW5uZWwgYXMgMS5mLgotICBndWFyZGVkX2J1ZmZlcnNfLT5HZXRCdWZmZXI8ZmxvYXQ+KDApWzBdID0gMS5mOwotICAvLyBNYXJrIHRoZSBsYXN0IHNhbXBsZSBvZiB0aGUgbGFzdCBjaGFubmVsIGFzIDEuZi4KLSAgZ3VhcmRlZF9idWZmZXJzXy0+R2V0QnVmZmVyPGZsb2F0PigwKVtrRnJhbWVzICoga0NoYW5uZWxzIC0gMV0gPSAxLmY7Ci0gIEVYUEVDVF9FUShhdWRpb19idXNfLT5HZXRGbG9hdDMyU2FtcGxlKDAsIDApLCAxLmYpOwotICBFWFBFQ1RfRVEoYXVkaW9fYnVzXy0+R2V0RmxvYXQzMlNhbXBsZShrQ2hhbm5lbHMgLSAxLCBrRnJhbWVzIC0gMSksIDEuZik7Ci0gIEVYUEVDVF9UUlVFKGd1YXJkZWRfYnVmZmVyc18tPlZlcmlmeUd1YXJkQnl0ZXMoKSk7Ci0KLSAgQ3JlYXRlQXVkaW9CdXM8aW50MTY+KFNoZWxsQXVkaW9CdXM6OmtQbGFuYXIpOwotICBmb3IgKHNpemVfdCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGF1ZGlvX2J1c18tPmNoYW5uZWxzKCk7ICsrY2hhbm5lbCkgewotICAgIC8vIE1hcmsgdGhlIGZpcnN0IHNhbXBsZSBvZiB0aGUgY2hhbm5lbCBhcyAxMDAuCi0gICAgZ3VhcmRlZF9idWZmZXJzXy0+R2V0QnVmZmVyPGludDE2PihjaGFubmVsKVswXSA9IDEwMDsKLSAgICAvLyBNYXJrIHRoZSBsYXN0IHNhbXBsZSBvZiB0aGUgY2hhbm5lbCBhcyAxMDAuCi0gICAgZ3VhcmRlZF9idWZmZXJzXy0+R2V0QnVmZmVyPGludDE2PihjaGFubmVsKVtrRnJhbWVzIC0gMV0gPSAxMDA7Ci0gICAgRVhQRUNUX0VRKGF1ZGlvX2J1c18tPkdldEludDE2U2FtcGxlKGNoYW5uZWwsIDApLCAxMDApOwotICAgIEVYUEVDVF9FUShhdWRpb19idXNfLT5HZXRJbnQxNlNhbXBsZShjaGFubmVsLCBrRnJhbWVzIC0gMSksIDEwMCk7Ci0gIH0KLSAgRVhQRUNUX1RSVUUoZ3VhcmRlZF9idWZmZXJzXy0+VmVyaWZ5R3VhcmRCeXRlcygpKTsKLX0KLQotVEVTVF9GKFNoZWxsQXVkaW9CdXNUZXN0LCBaZXJvRnJhbWVzKSB7Ci0gIENyZWF0ZUF1ZGlvQnVzPGZsb2F0PihTaGVsbEF1ZGlvQnVzOjprSW50ZXJsZWF2ZWQpOwotICBTY3JpYmJsZShndWFyZGVkX2J1ZmZlcnNfLT5HZXRCdWZmZXI8dWludDg+KDApLAotICAgICAgICAgICBzaXplb2YoZmxvYXQpICoga0ZyYW1lcyAqIGtDaGFubmVscyk7Ci0gIGF1ZGlvX2J1c18tPlplcm9GcmFtZXMoMCwgMCk7Ci0gIGF1ZGlvX2J1c18tPlplcm9GcmFtZXMoa0ZyYW1lcywga0ZyYW1lcyk7Ci0gIEVYUEVDVF9UUlVFKFZlcmlmeVNjcmliYmxlKGd1YXJkZWRfYnVmZmVyc18tPkdldEJ1ZmZlcjx1aW50OD4oMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihmbG9hdCkgKiBrRnJhbWVzICoga0NoYW5uZWxzKSk7Ci0gIEVYUEVDVF9UUlVFKGd1YXJkZWRfYnVmZmVyc18tPlZlcmlmeUd1YXJkQnl0ZXMoKSk7Ci0KLSAgLy8gTWFyayB0aGUgZmlyc3Qgc2FtcGxlIG9mIGxhc3QgY2hhbm5lbCBhbmQgc2Vjb25kIHNhbXBsZSBvZiB0aGUgZmlyc3QKLSAgLy8gY2hhbm5lbCBhcyAxLmYuCi0gIGd1YXJkZWRfYnVmZmVyc18tPkdldEJ1ZmZlcjxmbG9hdD4oMClba0NoYW5uZWxzIC0gMV0gPSAxLmY7Ci0gIGd1YXJkZWRfYnVmZmVyc18tPkdldEJ1ZmZlcjxmbG9hdD4oMClba0NoYW5uZWxzXSA9IDEuZjsKLSAgYXVkaW9fYnVzXy0+WmVyb0ZyYW1lcygwLCAxKTsKLSAgRVhQRUNUX0VRKGd1YXJkZWRfYnVmZmVyc18tPkdldEJ1ZmZlcjxmbG9hdD4oMClba0NoYW5uZWxzIC0gMV0sIDAuZik7Ci0gIEVYUEVDVF9FUShndWFyZGVkX2J1ZmZlcnNfLT5HZXRCdWZmZXI8ZmxvYXQ+KDApW2tDaGFubmVsc10sIDEuZik7Ci0gIEVYUEVDVF9UUlVFKGd1YXJkZWRfYnVmZmVyc18tPlZlcmlmeUd1YXJkQnl0ZXMoKSk7Ci0KLSAgLy8gTWFyayB0aGUgZmlyc3Qgc2FtcGxlIG9mIGxhc3QgY2hhbm5lbCBhbmQgc2Vjb25kIGJ1dCBsYXN0IHNhbXBsZSBvZiB0aGUKLSAgLy8gZmlyc3QgY2hhbm5lbCBhcyAxLmYuCi0gIGd1YXJkZWRfYnVmZmVyc18tPkdldEJ1ZmZlcjxmbG9hdD4oMClba0NoYW5uZWxzICogKGtGcmFtZXMgLSAxKV0gPSAxLmY7Ci0gIGd1YXJkZWRfYnVmZmVyc18tPkdldEJ1ZmZlcjxmbG9hdD4oMClba0NoYW5uZWxzICogKGtGcmFtZXMgLSAxKSAtIDFdID0gMS5mOwotICBhdWRpb19idXNfLT5aZXJvRnJhbWVzKGtGcmFtZXMgLSAxLCBrRnJhbWVzKTsKLSAgRVhQRUNUX0VRKGd1YXJkZWRfYnVmZmVyc18tPkdldEJ1ZmZlcjxmbG9hdD4oMClba0NoYW5uZWxzICogKGtGcmFtZXMgLSAxKV0sCi0gICAgICAgICAgICAwLmYpOwotICBFWFBFQ1RfRVEoCi0gICAgICBndWFyZGVkX2J1ZmZlcnNfLT5HZXRCdWZmZXI8ZmxvYXQ+KDApW2tDaGFubmVscyAqIChrRnJhbWVzIC0gMSkgLSAxXSwKLSAgICAgIDEuZik7Ci0KLSAgYXVkaW9fYnVzXy0+WmVyb0ZyYW1lcygxLCBrRnJhbWVzIC0gMSk7Ci0gIEVYUEVDVF9UUlVFKFZlcmlmeVZhbHVlcyhndWFyZGVkX2J1ZmZlcnNfLT5HZXRCdWZmZXI8ZmxvYXQ+KDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAga0ZyYW1lcyAqIGtDaGFubmVscywgMC5mKSk7Ci0gIEVYUEVDVF9UUlVFKGd1YXJkZWRfYnVmZmVyc18tPlZlcmlmeUd1YXJkQnl0ZXMoKSk7Ci0KLSAgQ3JlYXRlQXVkaW9CdXM8aW50MTY+KFNoZWxsQXVkaW9CdXM6OmtQbGFuYXIpOwotICBmb3IgKHNpemVfdCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGF1ZGlvX2J1c18tPmNoYW5uZWxzKCk7ICsrY2hhbm5lbCkgewotICAgIC8vIE1hcmsgdGhlIGZpcnN0IHR3byBzYW1wbGVzIG9mIHRoZSBjaGFubmVsIGFzIDEwMC4KLSAgICBndWFyZGVkX2J1ZmZlcnNfLT5HZXRCdWZmZXI8aW50MTY+KGNoYW5uZWwpWzBdID0gMTAwOwotICAgIGd1YXJkZWRfYnVmZmVyc18tPkdldEJ1ZmZlcjxpbnQxNj4oY2hhbm5lbClbMV0gPSAxMDA7Ci0gICAgYXVkaW9fYnVzXy0+WmVyb0ZyYW1lcygwLCAxKTsKLSAgICBFWFBFQ1RfRVEoZ3VhcmRlZF9idWZmZXJzXy0+R2V0QnVmZmVyPGludDE2PihjaGFubmVsKVswXSwgMCk7Ci0gICAgRVhQRUNUX0VRKGd1YXJkZWRfYnVmZmVyc18tPkdldEJ1ZmZlcjxpbnQxNj4oY2hhbm5lbClbMV0sIDEwMCk7Ci0gICAgRVhQRUNUX1RSVUUoZ3VhcmRlZF9idWZmZXJzXy0+VmVyaWZ5R3VhcmRCeXRlcygpKTsKLQotICAgIC8vIE1hcmsgdGhlIGxhc3QgdHdvIHNhbXBsZXMgb2YgdGhlIGNoYW5uZWwgYXMgMTAwLgotICAgIGd1YXJkZWRfYnVmZmVyc18tPkdldEJ1ZmZlcjxpbnQxNj4oY2hhbm5lbClba0ZyYW1lcyAtIDFdID0gMTAwOwotICAgIGd1YXJkZWRfYnVmZmVyc18tPkdldEJ1ZmZlcjxpbnQxNj4oY2hhbm5lbClba0ZyYW1lcyAtIDJdID0gMTAwOwotICAgIGF1ZGlvX2J1c18tPlplcm9GcmFtZXMoa0ZyYW1lcyAtIDEsIGtGcmFtZXMpOwotICAgIEVYUEVDVF9FUShndWFyZGVkX2J1ZmZlcnNfLT5HZXRCdWZmZXI8aW50MTY+KGNoYW5uZWwpW2tGcmFtZXMgLSAxXSwgMCk7Ci0gICAgRVhQRUNUX0VRKGd1YXJkZWRfYnVmZmVyc18tPkdldEJ1ZmZlcjxpbnQxNj4oY2hhbm5lbClba0ZyYW1lcyAtIDJdLCAxMDApOwotICAgIEVYUEVDVF9UUlVFKGd1YXJkZWRfYnVmZmVyc18tPlZlcmlmeUd1YXJkQnl0ZXMoKSk7Ci0KLSAgICBhdWRpb19idXNfLT5aZXJvRnJhbWVzKDEsIGtGcmFtZXMgLSAxKTsKLSAgICBFWFBFQ1RfVFJVRShWZXJpZnlWYWx1ZXMoZ3VhcmRlZF9idWZmZXJzXy0+R2V0QnVmZmVyPGludDE2PihjaGFubmVsKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ZyYW1lcywgc3RhdGljX2Nhc3Q8aW50MTY+KDApKSk7Ci0gICAgRVhQRUNUX1RSVUUoZ3VhcmRlZF9idWZmZXJzXy0+VmVyaWZ5R3VhcmRCeXRlcygpKTsKLSAgfQotfQotCi1URVNUX0YoU2hlbGxBdWRpb0J1c1Rlc3QsIEFzc2lnbldpdGhTYW1lU2FtcGxlVHlwZUFuZFN0b3JhZ2VUeXBlKSB7Ci0gIENyZWF0ZUF1ZGlvQnVzPGZsb2F0PihTaGVsbEF1ZGlvQnVzOjprSW50ZXJsZWF2ZWQpOwotICBGaWxsVmFsdWVzKGd1YXJkZWRfYnVmZmVyc18tPkdldEJ1ZmZlcjxmbG9hdD4oMCksIGtGcmFtZXMgKiBrQ2hhbm5lbHMsIDEuZik7Ci0gIHsKLSAgICBTaGVsbEF1ZGlvQnVzIHNvdXJjZShrQ2hhbm5lbHMsIGtGcmFtZXMgLyAyLCBTaGVsbEF1ZGlvQnVzOjprRmxvYXQzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBTaGVsbEF1ZGlvQnVzOjprSW50ZXJsZWF2ZWQpOwotICAgIHNvdXJjZS5aZXJvQWxsRnJhbWVzKCk7Ci0gICAgYXVkaW9fYnVzXy0+QXNzaWduKHNvdXJjZSk7Ci0gICAgRVhQRUNUX1RSVUUoVmVyaWZ5VmFsdWVzKGd1YXJkZWRfYnVmZmVyc18tPkdldEJ1ZmZlcjxmbG9hdD4oMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtGcmFtZXMgLyAyICoga0NoYW5uZWxzLCAwLmYpKTsKLSAgICBFWFBFQ1RfVFJVRShWZXJpZnlWYWx1ZXMoCi0gICAgICAgIGd1YXJkZWRfYnVmZmVyc18tPkdldEJ1ZmZlcjxmbG9hdD4oMCkgKyBrRnJhbWVzIC8gMiAqIGtDaGFubmVscywKLSAgICAgICAgKGtGcmFtZXMgLSBrRnJhbWVzIC8gMikgKiBrQ2hhbm5lbHMsIDEuZikpOwotICAgIEVYUEVDVF9UUlVFKGd1YXJkZWRfYnVmZmVyc18tPlZlcmlmeUd1YXJkQnl0ZXMoKSk7Ci0gIH0KLQotICB7Ci0gICAgU2hlbGxBdWRpb0J1cyBzb3VyY2Uoa0NoYW5uZWxzLCBrRnJhbWVzLCBTaGVsbEF1ZGlvQnVzOjprRmxvYXQzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBTaGVsbEF1ZGlvQnVzOjprSW50ZXJsZWF2ZWQpOwotICAgIHNvdXJjZS5aZXJvQWxsRnJhbWVzKCk7Ci0gICAgYXVkaW9fYnVzXy0+QXNzaWduKHNvdXJjZSk7Ci0gICAgRVhQRUNUX1RSVUUoVmVyaWZ5VmFsdWVzKGd1YXJkZWRfYnVmZmVyc18tPkdldEJ1ZmZlcjxmbG9hdD4oMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtGcmFtZXMgKiBrQ2hhbm5lbHMsIDAuZikpOwotICAgIEVYUEVDVF9UUlVFKGd1YXJkZWRfYnVmZmVyc18tPlZlcmlmeUd1YXJkQnl0ZXMoKSk7Ci0gIH0KLQotICB7Ci0gICAgU2hlbGxBdWRpb0J1cyBzb3VyY2Uoa0NoYW5uZWxzLCBrRnJhbWVzICogMiwgU2hlbGxBdWRpb0J1czo6a0Zsb2F0MzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGxBdWRpb0J1czo6a0ludGVybGVhdmVkKTsKLSAgICBzb3VyY2UuWmVyb0FsbEZyYW1lcygpOwotICAgIGF1ZGlvX2J1c18tPkFzc2lnbihzb3VyY2UpOwotICAgIEVYUEVDVF9UUlVFKFZlcmlmeVZhbHVlcyhndWFyZGVkX2J1ZmZlcnNfLT5HZXRCdWZmZXI8ZmxvYXQ+KDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRnJhbWVzICoga0NoYW5uZWxzLCAwLmYpKTsKLSAgICBFWFBFQ1RfVFJVRShndWFyZGVkX2J1ZmZlcnNfLT5WZXJpZnlHdWFyZEJ5dGVzKCkpOwotICB9Ci0KLSAgQ3JlYXRlQXVkaW9CdXM8aW50MTY+KFNoZWxsQXVkaW9CdXM6OmtQbGFuYXIpOwotICBmb3IgKHNpemVfdCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGF1ZGlvX2J1c18tPmNoYW5uZWxzKCk7ICsrY2hhbm5lbCkgewotICAgIEZpbGxWYWx1ZXMoZ3VhcmRlZF9idWZmZXJzXy0+R2V0QnVmZmVyPGludDE2PihjaGFubmVsKSwga0ZyYW1lcywKLSAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDE2PigxMDApKTsKLSAgICB7Ci0gICAgICBTaGVsbEF1ZGlvQnVzIHNvdXJjZShrQ2hhbm5lbHMsIGtGcmFtZXMgLyAyLCBTaGVsbEF1ZGlvQnVzOjprSW50MTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTaGVsbEF1ZGlvQnVzOjprUGxhbmFyKTsKLSAgICAgIHNvdXJjZS5aZXJvQWxsRnJhbWVzKCk7Ci0gICAgICBhdWRpb19idXNfLT5Bc3NpZ24oc291cmNlKTsKLSAgICAgIEVYUEVDVF9UUlVFKFZlcmlmeVZhbHVlcyhndWFyZGVkX2J1ZmZlcnNfLT5HZXRCdWZmZXI8aW50MTY+KGNoYW5uZWwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtGcmFtZXMgLyAyLCBzdGF0aWNfY2FzdDxpbnQxNj4oMCkpKTsKLSAgICAgIEVYUEVDVF9UUlVFKFZlcmlmeVZhbHVlcygKLSAgICAgICAgICBndWFyZGVkX2J1ZmZlcnNfLT5HZXRCdWZmZXI8aW50MTY+KGNoYW5uZWwpICsga0ZyYW1lcyAvIDIsCi0gICAgICAgICAga0ZyYW1lcyAtIGtGcmFtZXMgLyAyLCBzdGF0aWNfY2FzdDxpbnQxNj4oMTAwKSkpOwotICAgICAgRVhQRUNUX1RSVUUoZ3VhcmRlZF9idWZmZXJzXy0+VmVyaWZ5R3VhcmRCeXRlcygpKTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICBTaGVsbEF1ZGlvQnVzIHNvdXJjZShrQ2hhbm5lbHMsIGtGcmFtZXMsIFNoZWxsQXVkaW9CdXM6OmtJbnQxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoZWxsQXVkaW9CdXM6OmtQbGFuYXIpOwotICAgICAgc291cmNlLlplcm9BbGxGcmFtZXMoKTsKLSAgICAgIGF1ZGlvX2J1c18tPkFzc2lnbihzb3VyY2UpOwotICAgICAgRVhQRUNUX1RSVUUoVmVyaWZ5VmFsdWVzKGd1YXJkZWRfYnVmZmVyc18tPkdldEJ1ZmZlcjxpbnQxNj4oY2hhbm5lbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ZyYW1lcywgc3RhdGljX2Nhc3Q8aW50MTY+KDApKSk7Ci0gICAgICBFWFBFQ1RfVFJVRShndWFyZGVkX2J1ZmZlcnNfLT5WZXJpZnlHdWFyZEJ5dGVzKCkpOwotICAgIH0KLQotICAgIHsKLSAgICAgIFNoZWxsQXVkaW9CdXMgc291cmNlKGtDaGFubmVscywga0ZyYW1lcyAqIDIsIFNoZWxsQXVkaW9CdXM6OmtJbnQxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoZWxsQXVkaW9CdXM6OmtQbGFuYXIpOwotICAgICAgc291cmNlLlplcm9BbGxGcmFtZXMoKTsKLSAgICAgIGF1ZGlvX2J1c18tPkFzc2lnbihzb3VyY2UpOwotICAgICAgRVhQRUNUX1RSVUUoVmVyaWZ5VmFsdWVzKGd1YXJkZWRfYnVmZmVyc18tPkdldEJ1ZmZlcjxpbnQxNj4oY2hhbm5lbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ZyYW1lcywgc3RhdGljX2Nhc3Q8aW50MTY+KDApKSk7Ci0gICAgICBFWFBFQ1RfVFJVRShndWFyZGVkX2J1ZmZlcnNfLT5WZXJpZnlHdWFyZEJ5dGVzKCkpOwotICAgIH0KLSAgfQotfQotCi1URVNUX0YoU2hlbGxBdWRpb0J1c1Rlc3QsIEFzc2lnbldpdGhEaWZmZXJlbnRTYW1wbGVUeXBlc0FuZFN0b3JhZ2VUeXBlcykgewotICBDcmVhdGVBdWRpb0J1czxmbG9hdD4oU2hlbGxBdWRpb0J1czo6a0ludGVybGVhdmVkKTsKLSAgRmlsbFZhbHVlcyhndWFyZGVkX2J1ZmZlcnNfLT5HZXRCdWZmZXI8ZmxvYXQ+KDApLCBrRnJhbWVzICoga0NoYW5uZWxzLCAxLmYpOwotICB7Ci0gICAgU2hlbGxBdWRpb0J1cyBzb3VyY2Uoa0NoYW5uZWxzLCBrRnJhbWVzIC8gMiwgU2hlbGxBdWRpb0J1czo6a0ludDE2LAotICAgICAgICAgICAgICAgICAgICAgICAgIFNoZWxsQXVkaW9CdXM6OmtQbGFuYXIpOwotICAgIHNvdXJjZS5aZXJvQWxsRnJhbWVzKCk7Ci0gICAgYXVkaW9fYnVzXy0+QXNzaWduKHNvdXJjZSk7Ci0gICAgRVhQRUNUX1RSVUUoVmVyaWZ5VmFsdWVzKGd1YXJkZWRfYnVmZmVyc18tPkdldEJ1ZmZlcjxmbG9hdD4oMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtGcmFtZXMgLyAyICoga0NoYW5uZWxzLCAwLmYpKTsKLSAgICBFWFBFQ1RfVFJVRShWZXJpZnlWYWx1ZXMoCi0gICAgICAgIGd1YXJkZWRfYnVmZmVyc18tPkdldEJ1ZmZlcjxmbG9hdD4oMCkgKyBrRnJhbWVzIC8gMiAqIGtDaGFubmVscywKLSAgICAgICAgKGtGcmFtZXMgLSBrRnJhbWVzIC8gMikgKiBrQ2hhbm5lbHMsIDEuZikpOwotICAgIEVYUEVDVF9UUlVFKGd1YXJkZWRfYnVmZmVyc18tPlZlcmlmeUd1YXJkQnl0ZXMoKSk7Ci0gIH0KLQotICB7Ci0gICAgU2hlbGxBdWRpb0J1cyBzb3VyY2Uoa0NoYW5uZWxzLCBrRnJhbWVzLCBTaGVsbEF1ZGlvQnVzOjprSW50MTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGxBdWRpb0J1czo6a1BsYW5hcik7Ci0gICAgc291cmNlLlplcm9BbGxGcmFtZXMoKTsKLSAgICBhdWRpb19idXNfLT5Bc3NpZ24oc291cmNlKTsKLSAgICBFWFBFQ1RfVFJVRShWZXJpZnlWYWx1ZXMoZ3VhcmRlZF9idWZmZXJzXy0+R2V0QnVmZmVyPGZsb2F0PigwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ZyYW1lcyAqIGtDaGFubmVscywgMC5mKSk7Ci0gICAgRVhQRUNUX1RSVUUoZ3VhcmRlZF9idWZmZXJzXy0+VmVyaWZ5R3VhcmRCeXRlcygpKTsKLSAgfQotCi0gIHsKLSAgICBTaGVsbEF1ZGlvQnVzIHNvdXJjZShrQ2hhbm5lbHMsIGtGcmFtZXMgKiAyLCBTaGVsbEF1ZGlvQnVzOjprSW50MTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGxBdWRpb0J1czo6a1BsYW5hcik7Ci0gICAgc291cmNlLlplcm9BbGxGcmFtZXMoKTsKLSAgICBhdWRpb19idXNfLT5Bc3NpZ24oc291cmNlKTsKLSAgICBFWFBFQ1RfVFJVRShWZXJpZnlWYWx1ZXMoZ3VhcmRlZF9idWZmZXJzXy0+R2V0QnVmZmVyPGZsb2F0PigwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ZyYW1lcyAqIGtDaGFubmVscywgMC5mKSk7Ci0gICAgRVhQRUNUX1RSVUUoZ3VhcmRlZF9idWZmZXJzXy0+VmVyaWZ5R3VhcmRCeXRlcygpKTsKLSAgfQotCi0gIENyZWF0ZUF1ZGlvQnVzPGludDE2PihTaGVsbEF1ZGlvQnVzOjprUGxhbmFyKTsKLSAgZm9yIChzaXplX3QgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBhdWRpb19idXNfLT5jaGFubmVscygpOyArK2NoYW5uZWwpIHsKLSAgICBGaWxsVmFsdWVzKGd1YXJkZWRfYnVmZmVyc18tPkdldEJ1ZmZlcjxpbnQxNj4oY2hhbm5lbCksIGtGcmFtZXMsCi0gICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQxNj4oMTAwKSk7Ci0gICAgewotICAgICAgU2hlbGxBdWRpb0J1cyBzb3VyY2Uoa0NoYW5uZWxzLCBrRnJhbWVzIC8gMiwgU2hlbGxBdWRpb0J1czo6a0Zsb2F0MzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTaGVsbEF1ZGlvQnVzOjprSW50ZXJsZWF2ZWQpOwotICAgICAgc291cmNlLlplcm9BbGxGcmFtZXMoKTsKLSAgICAgIGF1ZGlvX2J1c18tPkFzc2lnbihzb3VyY2UpOwotICAgICAgRVhQRUNUX1RSVUUoVmVyaWZ5VmFsdWVzKGd1YXJkZWRfYnVmZmVyc18tPkdldEJ1ZmZlcjxpbnQxNj4oY2hhbm5lbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ZyYW1lcyAvIDIsIHN0YXRpY19jYXN0PGludDE2PigwKSkpOwotICAgICAgRVhQRUNUX1RSVUUoVmVyaWZ5VmFsdWVzKAotICAgICAgICAgIGd1YXJkZWRfYnVmZmVyc18tPkdldEJ1ZmZlcjxpbnQxNj4oY2hhbm5lbCkgKyBrRnJhbWVzIC8gMiwKLSAgICAgICAgICBrRnJhbWVzIC0ga0ZyYW1lcyAvIDIsIHN0YXRpY19jYXN0PGludDE2PigxMDApKSk7Ci0gICAgICBFWFBFQ1RfVFJVRShndWFyZGVkX2J1ZmZlcnNfLT5WZXJpZnlHdWFyZEJ5dGVzKCkpOwotICAgIH0KLQotICAgIHsKLSAgICAgIFNoZWxsQXVkaW9CdXMgc291cmNlKGtDaGFubmVscywga0ZyYW1lcywgU2hlbGxBdWRpb0J1czo6a0Zsb2F0MzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTaGVsbEF1ZGlvQnVzOjprSW50ZXJsZWF2ZWQpOwotICAgICAgc291cmNlLlplcm9BbGxGcmFtZXMoKTsKLSAgICAgIGF1ZGlvX2J1c18tPkFzc2lnbihzb3VyY2UpOwotICAgICAgRVhQRUNUX1RSVUUoVmVyaWZ5VmFsdWVzKGd1YXJkZWRfYnVmZmVyc18tPkdldEJ1ZmZlcjxpbnQxNj4oY2hhbm5lbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ZyYW1lcywgc3RhdGljX2Nhc3Q8aW50MTY+KDApKSk7Ci0gICAgICBFWFBFQ1RfVFJVRShndWFyZGVkX2J1ZmZlcnNfLT5WZXJpZnlHdWFyZEJ5dGVzKCkpOwotICAgIH0KLQotICAgIHsKLSAgICAgIFNoZWxsQXVkaW9CdXMgc291cmNlKGtDaGFubmVscywga0ZyYW1lcyAqIDIsIFNoZWxsQXVkaW9CdXM6OmtGbG9hdDMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGxBdWRpb0J1czo6a0ludGVybGVhdmVkKTsKLSAgICAgIHNvdXJjZS5aZXJvQWxsRnJhbWVzKCk7Ci0gICAgICBhdWRpb19idXNfLT5Bc3NpZ24oc291cmNlKTsKLSAgICAgIEVYUEVDVF9UUlVFKFZlcmlmeVZhbHVlcyhndWFyZGVkX2J1ZmZlcnNfLT5HZXRCdWZmZXI8aW50MTY+KGNoYW5uZWwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtGcmFtZXMsIHN0YXRpY19jYXN0PGludDE2PigwKSkpOwotICAgICAgRVhQRUNUX1RSVUUoZ3VhcmRlZF9idWZmZXJzXy0+VmVyaWZ5R3VhcmRCeXRlcygpKTsKLSAgICB9Ci0gIH0KLX0KLQotVEVTVF9GKFNoZWxsQXVkaW9CdXNUZXN0LCBBc3NpZ25XaXRoTWF0cml4KSB7Ci0gIENyZWF0ZUF1ZGlvQnVzPGZsb2F0PihTaGVsbEF1ZGlvQnVzOjprSW50ZXJsZWF2ZWQpOwotICAvLyBGaWxsIHRoZSAxc3QgY2hhbm5lbCB3aXRoIGluY3JlbWVudGFsbHkgcG9zaXRpdmUgc2FtcGxlcywgZmlsbCB0aGUgMm5kCi0gIC8vIGNoYW5uZWwgd2l0aCBkZWNyZW1lbnRhbGx5IG5lZ2F0aXZlIHNhbXBsZXMsIGFuZCBmaWxsIHRoZSAzcmQgY2hhbm5lbCB3aXRoCi0gIC8vIDAuCi0gIGZvciAoc2l6ZV90IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwga0NoYW5uZWxzOyArK2NoYW5uZWwpIHsKLSAgICBmb3IgKHNpemVfdCBmcmFtZSA9IDA7IGZyYW1lIDwga0ZyYW1lczsgKytmcmFtZSkgewotICAgICAgZmxvYXQgc2FtcGxlID0gMC5mOwotICAgICAgaWYgKGNoYW5uZWwgPT0gMCkgewotICAgICAgICBzYW1wbGUgPSBzdGF0aWNfY2FzdDxmbG9hdD4oZnJhbWUpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGtGcmFtZXMpOwotICAgICAgfSBlbHNlIGlmIChjaGFubmVsID09IDEpIHsKLSAgICAgICAgc2FtcGxlID0gLXN0YXRpY19jYXN0PGZsb2F0PihmcmFtZSkgLyBzdGF0aWNfY2FzdDxmbG9hdD4oa0ZyYW1lcyk7Ci0gICAgICB9Ci0gICAgICBndWFyZGVkX2J1ZmZlcnNfLT5HZXRCdWZmZXI8ZmxvYXQ+KDApW2ZyYW1lICoga0NoYW5uZWxzICsgY2hhbm5lbF0gPQotICAgICAgICAgIHNhbXBsZTsKLSAgICB9Ci0gIH0KLSAgewotICAgIFNoZWxsQXVkaW9CdXMgb3RoZXIoa0NoYW5uZWxzICogMiwga0ZyYW1lcywgU2hlbGxBdWRpb0J1czo6a0Zsb2F0MzIsCi0gICAgICAgICAgICAgICAgICAgICAgICBTaGVsbEF1ZGlvQnVzOjprUGxhbmFyKTsKLSAgICBjb25zdCBmbG9hdCBrQ29udmVyc2lvbk1hdHJpeFtdID0gewotICAgICAgICAwLmYsIDEuZiwgMC5mLCAgIC8vIGRlc3QgY2hhbm5lbCAwID0gc291cmNlIGNoYW5uZWwgMS4KLSAgICAgICAgMS5mLCAwLmYsIDAuZiwgICAvLyBkZXN0IGNoYW5uZWwgMSA9IHNvdXJjZSBjaGFubmVsIDAuCi0gICAgICAgIDEuZiwgMS5mLCAxLmYsICAgLy8gZGVzdCBjaGFubmVsIDIgPSBzdW0gb2YgYWxsIHNvdXJjZSBjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlZmZlY3RpdmVseSBtYWtlIGl0IGVxdWFsIHRvIHNvdXJjZSBjaGFubmVsIDIuCi0gICAgICAgIC0xLmYsIDAuZiwgMC5mLCAgLy8gZGVzdCBjaGFubmVsIDMgPSBuZWdhdGl2ZSBzb3VyY2UgY2hhbm5lbCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVmZmVjdGl2ZWx5IG1ha2UgaXQgZXF1YWwgdG8gc291cmNlIGNoYW5uZWwgMS4KLSAgICAgICAgMC5mLCAtMS5mLCAwLmYsICAvLyBkZXN0IGNoYW5uZWwgNCA9IG5lZ2F0aXZlIHNvdXJjZSBjaGFubmVsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWZmZWN0aXZlbHkgbWFrZSBpdCBlcXVhbCB0byBzb3VyY2UgY2hhbm5lbCAwLgotICAgICAgICAyLmYsIDEuZiwgLTEuZiwgIC8vIGRlc3QgY2hhbm5lbCA1ID0gMiAqIHNvdXJjZSBjaGFubmVsIDAgKyBzb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFubmVsIDIgLSBzb3VyY2UgY2hhbm5lbCAyLCBlZmZlY3RpdmVseSBtYWtlIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXF1YWwgdG8gc291cmNlIGNoYW5uZWwgMC4KLSAgICB9OwotICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBtYXRyaXgoa0NvbnZlcnNpb25NYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ29udmVyc2lvbk1hdHJpeCArIGFycmF5c2l6ZShrQ29udmVyc2lvbk1hdHJpeCkpOwotICAgIG90aGVyLkFzc2lnbigqYXVkaW9fYnVzXywgbWF0cml4KTsKLQotICAgIEVYUEVDVF9UUlVFKElzU2FtZUNoYW5uZWwob3RoZXIsIDAsICphdWRpb19idXNfLCAxKSk7Ci0gICAgRVhQRUNUX1RSVUUoSXNTYW1lQ2hhbm5lbChvdGhlciwgMSwgKmF1ZGlvX2J1c18sIDApKTsKLSAgICBFWFBFQ1RfVFJVRShJc1NhbWVDaGFubmVsKG90aGVyLCAyLCAqYXVkaW9fYnVzXywgMikpOwotICAgIEVYUEVDVF9UUlVFKElzU2FtZUNoYW5uZWwob3RoZXIsIDMsICphdWRpb19idXNfLCAxKSk7Ci0gICAgRVhQRUNUX1RSVUUoSXNTYW1lQ2hhbm5lbChvdGhlciwgNCwgKmF1ZGlvX2J1c18sIDApKTsKLSAgICBFWFBFQ1RfVFJVRShJc1NhbWVDaGFubmVsKG90aGVyLCA1LCAqYXVkaW9fYnVzXywgMCkpOwotICAgIEVYUEVDVF9UUlVFKGd1YXJkZWRfYnVmZmVyc18tPlZlcmlmeUd1YXJkQnl0ZXMoKSk7Ci0gIH0KLX0KLQotVEVTVF9GKFNoZWxsQXVkaW9CdXNUZXN0LCBNaXhXaXRob3V0TWF0cml4KSB7Ci0gIENyZWF0ZUF1ZGlvQnVzPGZsb2F0PihTaGVsbEF1ZGlvQnVzOjprSW50ZXJsZWF2ZWQpOwotICAvLyBGaWxsIHRoZSAxc3QgY2hhbm5lbCB3aXRoIGluY3JlbWVudGFsbHkgcG9zaXRpdmUgc2FtcGxlcywgZmlsbCB0aGUgMm5kCi0gIC8vIGNoYW5uZWwgd2l0aCBkZWNyZW1lbnRhbGx5IG5lZ2F0aXZlIHNhbXBsZXMsIGFuZCBmaWxsIHRoZSAzcmQgY2hhbm5lbCB3aXRoCi0gIC8vIDAuCi0gIGZvciAoc2l6ZV90IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwga0NoYW5uZWxzOyArK2NoYW5uZWwpIHsKLSAgICBmb3IgKHNpemVfdCBmcmFtZSA9IDA7IGZyYW1lIDwga0ZyYW1lczsgKytmcmFtZSkgewotICAgICAgZmxvYXQgc2FtcGxlID0gMC5mOwotICAgICAgaWYgKGNoYW5uZWwgPT0gMCkgewotICAgICAgICBzYW1wbGUgPSBzdGF0aWNfY2FzdDxmbG9hdD4oZnJhbWUpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGtGcmFtZXMpOwotICAgICAgfSBlbHNlIGlmIChjaGFubmVsID09IDEpIHsKLSAgICAgICAgc2FtcGxlID0gLXN0YXRpY19jYXN0PGZsb2F0PihmcmFtZSkgLyBzdGF0aWNfY2FzdDxmbG9hdD4oa0ZyYW1lcyk7Ci0gICAgICB9Ci0gICAgICBndWFyZGVkX2J1ZmZlcnNfLT5HZXRCdWZmZXI8ZmxvYXQ+KDApW2ZyYW1lICoga0NoYW5uZWxzICsgY2hhbm5lbF0gPQotICAgICAgICAgIHNhbXBsZTsKLSAgICB9Ci0gIH0KLSAgewotICAgIFNoZWxsQXVkaW9CdXMgb3RoZXIoa0NoYW5uZWxzLCBrRnJhbWVzLCBTaGVsbEF1ZGlvQnVzOjprRmxvYXQzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNoZWxsQXVkaW9CdXM6OmtQbGFuYXIpOwotICAgIG90aGVyLkFzc2lnbigqYXVkaW9fYnVzXyk7Ci0gICAgLy8gQnkgY2FsbCBNaXgoKSBoZXJlLCB3ZSBlZmZlY3RpdmVseSBtdWx0aXBsaWVzIGV2ZXJ5IHNhbXBsZSBpbiB8b3RoZXJ8IGJ5Ci0gICAgLy8gMi4KLSAgICBvdGhlci5NaXgoKmF1ZGlvX2J1c18pOwotICAgIC8vIEFkanVzdCB0aGUgb3JpZ2luYWwgYXVkaW8gYnVzIGJ5IG11bHRpcGx5aW5nIGV2ZXJ5IHNhbXBsZSBieSAyLgotICAgIGZvciAoc2l6ZV90IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwga0NoYW5uZWxzOyArK2NoYW5uZWwpIHsKLSAgICAgIGZvciAoc2l6ZV90IGZyYW1lID0gMDsgZnJhbWUgPCBrRnJhbWVzOyArK2ZyYW1lKSB7Ci0gICAgICAgIGd1YXJkZWRfYnVmZmVyc18tPkdldEJ1ZmZlcjxmbG9hdD4oMClbZnJhbWUgKiBrQ2hhbm5lbHMgKyBjaGFubmVsXSAqPSAyOwotICAgICAgfQotICAgIH0KLQotICAgIEVYUEVDVF9UUlVFKElzU2FtZUNoYW5uZWwob3RoZXIsIDAsICphdWRpb19idXNfLCAwKSk7Ci0gICAgRVhQRUNUX1RSVUUoSXNTYW1lQ2hhbm5lbChvdGhlciwgMSwgKmF1ZGlvX2J1c18sIDEpKTsKLSAgICBFWFBFQ1RfVFJVRShJc1NhbWVDaGFubmVsKG90aGVyLCAyLCAqYXVkaW9fYnVzXywgMikpOwotICAgIEVYUEVDVF9UUlVFKGd1YXJkZWRfYnVmZmVyc18tPlZlcmlmeUd1YXJkQnl0ZXMoKSk7Ci0gIH0KLX0KLQotVEVTVF9GKFNoZWxsQXVkaW9CdXNUZXN0LCBNaXhXaXRoTWF0cml4KSB7Ci0gIENyZWF0ZUF1ZGlvQnVzPGZsb2F0PihTaGVsbEF1ZGlvQnVzOjprSW50ZXJsZWF2ZWQpOwotICAvLyBGaWxsIHRoZSAxc3QgY2hhbm5lbCB3aXRoIGluY3JlbWVudGFsbHkgcG9zaXRpdmUgc2FtcGxlcywgZmlsbCB0aGUgMm5kCi0gIC8vIGNoYW5uZWwgd2l0aCBkZWNyZW1lbnRhbGx5IG5lZ2F0aXZlIHNhbXBsZXMsIGFuZCBmaWxsIHRoZSAzcmQgY2hhbm5lbCB3aXRoCi0gIC8vIDAuCi0gIGZvciAoc2l6ZV90IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwga0NoYW5uZWxzOyArK2NoYW5uZWwpIHsKLSAgICBmb3IgKHNpemVfdCBmcmFtZSA9IDA7IGZyYW1lIDwga0ZyYW1lczsgKytmcmFtZSkgewotICAgICAgZmxvYXQgc2FtcGxlID0gMC5mOwotICAgICAgaWYgKGNoYW5uZWwgPT0gMCkgewotICAgICAgICBzYW1wbGUgPSBzdGF0aWNfY2FzdDxmbG9hdD4oZnJhbWUpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGtGcmFtZXMpOwotICAgICAgfSBlbHNlIGlmIChjaGFubmVsID09IDEpIHsKLSAgICAgICAgc2FtcGxlID0gLXN0YXRpY19jYXN0PGZsb2F0PihmcmFtZSkgLyBzdGF0aWNfY2FzdDxmbG9hdD4oa0ZyYW1lcyk7Ci0gICAgICB9Ci0gICAgICBndWFyZGVkX2J1ZmZlcnNfLT5HZXRCdWZmZXI8ZmxvYXQ+KDApW2ZyYW1lICoga0NoYW5uZWxzICsgY2hhbm5lbF0gPQotICAgICAgICAgIHNhbXBsZTsKLSAgICB9Ci0gIH0KLSAgewotICAgIFNoZWxsQXVkaW9CdXMgb3RoZXIoa0NoYW5uZWxzICogMiwga0ZyYW1lcywgU2hlbGxBdWRpb0J1czo6a0Zsb2F0MzIsCi0gICAgICAgICAgICAgICAgICAgICAgICBTaGVsbEF1ZGlvQnVzOjprUGxhbmFyKTsKLSAgICBjb25zdCBmbG9hdCBrQ29udmVyc2lvbk1hdHJpeFtdID0gewotICAgICAgICAwLmYsIDEuZiwgMC5mLCAgIC8vIGRlc3QgY2hhbm5lbCAwID0gc291cmNlIGNoYW5uZWwgMS4KLSAgICAgICAgMS5mLCAwLmYsIDAuZiwgICAvLyBkZXN0IGNoYW5uZWwgMSA9IHNvdXJjZSBjaGFubmVsIDAuCi0gICAgICAgIDEuZiwgMS5mLCAxLmYsICAgLy8gZGVzdCBjaGFubmVsIDIgPSBzdW0gb2YgYWxsIHNvdXJjZSBjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlZmZlY3RpdmVseSBtYWtlIGl0IGVxdWFsIHRvIHNvdXJjZSBjaGFubmVsIDIuCi0gICAgICAgIC0xLmYsIDAuZiwgMC5mLCAgLy8gZGVzdCBjaGFubmVsIDMgPSBuZWdhdGl2ZSBzb3VyY2UgY2hhbm5lbCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVmZmVjdGl2ZWx5IG1ha2UgaXQgZXF1YWwgdG8gc291cmNlIGNoYW5uZWwgMS4KLSAgICAgICAgMC5mLCAtMS5mLCAwLmYsICAvLyBkZXN0IGNoYW5uZWwgNCA9IG5lZ2F0aXZlIHNvdXJjZSBjaGFubmVsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWZmZWN0aXZlbHkgbWFrZSBpdCBlcXVhbCB0byBzb3VyY2UgY2hhbm5lbCAwLgotICAgICAgICAyLmYsIDEuZiwgLTEuZiwgIC8vIGRlc3QgY2hhbm5lbCA1ID0gMiAqIHNvdXJjZSBjaGFubmVsIDAgKyBzb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFubmVsIDIgLSBzb3VyY2UgY2hhbm5lbCAyLCBlZmZlY3RpdmVseSBtYWtlIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXF1YWwgdG8gc291cmNlIGNoYW5uZWwgMC4KLSAgICB9OwotICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBtYXRyaXgoa0NvbnZlcnNpb25NYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ29udmVyc2lvbk1hdHJpeCArIGFycmF5c2l6ZShrQ29udmVyc2lvbk1hdHJpeCkpOwotICAgIG90aGVyLkFzc2lnbigqYXVkaW9fYnVzXywgbWF0cml4KTsKLSAgICAvLyBCeSBjYWxsIE1peCgpIGhlcmUsIHdlIGVmZmVjdGl2ZWx5IG11bHRpcGxpZXMgZXZlcnkgc2FtcGxlIGluIHxvdGhlcnwgYnkKLSAgICAvLyAyLgotICAgIG90aGVyLk1peCgqYXVkaW9fYnVzXywgbWF0cml4KTsKLSAgICAvLyBBZGp1c3QgdGhlIG9yaWdpbmFsIGF1ZGlvIGJ1cyBieSBtdWx0aXBseWluZyBldmVyeSBzYW1wbGUgYnkgMi4KLSAgICBmb3IgKHNpemVfdCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGtDaGFubmVsczsgKytjaGFubmVsKSB7Ci0gICAgICBmb3IgKHNpemVfdCBmcmFtZSA9IDA7IGZyYW1lIDwga0ZyYW1lczsgKytmcmFtZSkgewotICAgICAgICBndWFyZGVkX2J1ZmZlcnNfLT5HZXRCdWZmZXI8ZmxvYXQ+KDApW2ZyYW1lICoga0NoYW5uZWxzICsgY2hhbm5lbF0gKj0gMjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBFWFBFQ1RfVFJVRShJc1NhbWVDaGFubmVsKG90aGVyLCAwLCAqYXVkaW9fYnVzXywgMSkpOwotICAgIEVYUEVDVF9UUlVFKElzU2FtZUNoYW5uZWwob3RoZXIsIDEsICphdWRpb19idXNfLCAwKSk7Ci0gICAgRVhQRUNUX1RSVUUoSXNTYW1lQ2hhbm5lbChvdGhlciwgMiwgKmF1ZGlvX2J1c18sIDIpKTsKLSAgICBFWFBFQ1RfVFJVRShJc1NhbWVDaGFubmVsKG90aGVyLCAzLCAqYXVkaW9fYnVzXywgMSkpOwotICAgIEVYUEVDVF9UUlVFKElzU2FtZUNoYW5uZWwob3RoZXIsIDQsICphdWRpb19idXNfLCAwKSk7Ci0gICAgRVhQRUNUX1RSVUUoSXNTYW1lQ2hhbm5lbChvdGhlciwgNSwgKmF1ZGlvX2J1c18sIDApKTsKLSAgICBFWFBFQ1RfVFJVRShndWFyZGVkX2J1ZmZlcnNfLT5WZXJpZnlHdWFyZEJ5dGVzKCkpOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2Uvc2hlbGxfYnVmZmVyX2ZhY3RvcnkuY2MgYi9zcmMvbWVkaWEvYmFzZS9zaGVsbF9idWZmZXJfZmFjdG9yeS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM3OGZlOS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9zaGVsbF9idWZmZXJfZmFjdG9yeS5jYworKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaGVsbF9idWZmZXJfZmFjdG9yeS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2Uvc3RyaW5ncHJpbnRmLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNyeXB0X2NvbmZpZy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2hlbGxfbWVkaWFfcGxhdGZvcm0uaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3NoZWxsX21lZGlhX3N0YXRpc3RpY3MuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gPT09PSBTaGVsbFNjb3BlZEFycmF5ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotU2hlbGxTY29wZWRBcnJheTo6U2hlbGxTY29wZWRBcnJheSh1aW50OCogcmV1c2FibGVfYnVmZmVyLCBzaXplX3Qgc2l6ZSkKLSAgICA6IGFycmF5XyhyZXVzYWJsZV9idWZmZXIpLCBzaXplXyhzaXplKSB7Ci0gIGlmIChhcnJheV8pIHsKLSAgICAvLyBSZXRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciBmYWN0b3J5LCB0byBlbnN1cmUgdGhhdCB3ZSBkbyBub3QKLSAgICAvLyBvdXRsaXZlIGl0LgotICAgIGJ1ZmZlcl9mYWN0b3J5XyA9IFNoZWxsQnVmZmVyRmFjdG9yeTo6SW5zdGFuY2UoKTsKLSAgfQotfQotCi1TaGVsbFNjb3BlZEFycmF5Ojp+U2hlbGxTY29wZWRBcnJheSgpIHsKLSAgVFJBQ0VfRVZFTlQwKCJtZWRpYV9zdGFjayIsICJTaGVsbFNjb3BlZEFycmF5Ojp+U2hlbGxTY29wZWRBcnJheSgpIik7Ci0gIGlmIChhcnJheV8pIHsKLSAgICBidWZmZXJfZmFjdG9yeV8tPlJlY2xhaW0oYXJyYXlfKTsKLSAgfQotfQotCi0vLyA9PT09IFNoZWxsQnVmZmVyRmFjdG9yeSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1zY29wZWRfcmVmcHRyPFNoZWxsQnVmZmVyRmFjdG9yeT4gU2hlbGxCdWZmZXJGYWN0b3J5OjppbnN0YW5jZV8gPSBOVUxMOwotCi0vLyBzdGF0aWMKLXZvaWQgU2hlbGxCdWZmZXJGYWN0b3J5OjpJbml0aWFsaXplKCkgewotICAvLyBzYWZlIHRvIGNhbGwgbXVsdGlwbGUgdGltZXMKLSAgaWYgKCFpbnN0YW5jZV8pIHsKLSAgICBpbnN0YW5jZV8gPSBuZXcgU2hlbGxCdWZmZXJGYWN0b3J5KCk7Ci0gIH0KLX0KLQotYm9vbCBTaGVsbEJ1ZmZlckZhY3Rvcnk6OkFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfa2V5ZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NDQiBjYikgewotICBUUkFDRV9FVkVOVDEoIm1lZGlhX3N0YWNrIiwgIlNoZWxsQnVmZmVyRmFjdG9yeTo6QWxsb2NhdGVCdWZmZXIoKSIsICJzaXplIiwKLSAgICAgICAgICAgICAgIHNpemUpOwotICAvLyBaZXJvLXNpemUgYnVmZmVycyBhcmUgYWxsb2NhdGlvbiBlcnJvciwgYWxsb2NhdGUgYW4gRU9TIGJ1ZmZlciBleHBsaWNpdHkKLSAgLy8gd2l0aCB0aGUgcHJvdmlkZWQgRU9TIG1ldGhvZC4KLSAgaWYgKHNpemUgPT0gMCkgewotICAgIFRSQUNFX0VWRU5UMCgibWVkaWFfc3RhY2siLAotICAgICAgICAgICAgICAgICAiU2hlbGxCdWZmZXJGYWN0b3J5OjpBbGxvY2F0ZUJ1ZmZlcigpIGZhaWxlZCBhcyBzaXplIGlzIDAuIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gSWYgd2UgY2FuIGFsbG9jYXRlIGEgYnVmZmVyIHJpZ2h0IG5vdyBzYXZlIGEgcG9pbnRlciB0byBpdCBzbyB0aGF0IHdlIGRvbid0Ci0gIC8vIHJ1biB0aGUgY2FsbGJhY2sgd2hpbGUgaG9sZGluZyB0aGUgbWVtb3J5IGxvY2ssIGZvciBzYWZldHkncyBzYWtlLgotICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGluc3RhbnRfYnVmZmVyID0gTlVMTDsKLQotICB7Ci0gICAgYmFzZTo6QXV0b0xvY2sgbG9jayhsb2NrXyk7Ci0gICAgLy8gV2Ugb25seSBzZXJ2aWNlIHJlcXVlc3RzIGRpcmVjdGx5IGlmIHRoZXJlJ3Mgbm8gY2FsbGJhY2tzIHBlbmRpbmcgYW5kCi0gICAgLy8gd2UgY2FuIGFjY29tbW9kYXRlIGEgYnVmZmVyIG9mIHRoZSByZXF1ZXN0ZWQgc2l6ZQotICAgIGlmIChwZW5kaW5nX2FsbG9jc18uc2l6ZSgpID09IDApIHsKLSAgICAgIHVpbnQ4KiBieXRlcyA9IEFsbG9jYXRlX0xvY2tlZChzaXplKTsKLSAgICAgIGlmIChieXRlcykgewotICAgICAgICBpbnN0YW50X2J1ZmZlciA9IG5ldyBEZWNvZGVyQnVmZmVyKGJ5dGVzLCBzaXplLCBpc19rZXlmcmFtZSk7Ci0gICAgICAgIFRSQUNFX0VWRU5UMCgKLSAgICAgICAgICAgICJtZWRpYV9zdGFjayIsCi0gICAgICAgICAgICAiU2hlbGxCdWZmZXJGYWN0b3J5OjpBbGxvY2F0ZUJ1ZmZlcigpIGZpbmlzaGVkIGFsbG9jYXRpb24uIik7Ci0gICAgICAgIERDSEVDSyghaW5zdGFudF9idWZmZXItPklzRW5kT2ZTdHJlYW0oKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICghaW5zdGFudF9idWZmZXIpIHsKLSAgICAgIC8vIEFscmlnaHQsIHdlIGhhdmUgdG8gd2FpdCwgZW5xdWV1ZSB0aGUgYnVmZmVyIGFuZCBzaXplLgotICAgICAgVFJBQ0VfRVZFTlQwKCJtZWRpYV9zdGFjayIsCi0gICAgICAgICAgICAgICAgICAgIlNoZWxsQnVmZmVyRmFjdG9yeTo6QWxsb2NhdGVCdWZmZXIoKSBkZWZlcnJlZC4iKTsKLSAgICAgIHBlbmRpbmdfYWxsb2NzXy5wdXNoX2JhY2soCi0gICAgICAgICAgc3RkOjptYWtlX3BhaXIoY2IsIG5ldyBEZWNvZGVyQnVmZmVyKE5VTEwsIHNpemUsIGlzX2tleWZyYW1lKSkpOwotICAgIH0KLSAgfQotCi0gIC8vIElmIHdlIG1hbmFnZWQgdG8gY3JlYXRlIGEgYnVmZmVyIHJ1biB0aGUgY2FsbGJhY2sgYWZ0ZXIgcmVsZWFzaW5nIHRoZSBsb2NrLgotICBpZiAoaW5zdGFudF9idWZmZXIpIHsKLSAgICBjYi5SdW4oaW5zdGFudF9idWZmZXIpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IFNoZWxsQnVmZmVyRmFjdG9yeTo6QWxsb2NhdGVCdWZmZXJOb3coCi0gICAgc2l6ZV90IHNpemUsCi0gICAgYm9vbCBpc19rZXlmcmFtZSkgewotICBUUkFDRV9FVkVOVDEoIm1lZGlhX3N0YWNrIiwgIlNoZWxsQnVmZmVyRmFjdG9yeTo6QWxsb2NhdGVCdWZmZXJOb3coKSIsICJzaXplIiwKLSAgICAgICAgICAgICAgIHNpemUpOwotICAvLyBaZXJvLXNpemUgYnVmZmVycyBhcmUgYWxsb2NhdGlvbiBlcnJvciwgYWxsb2NhdGUgYW4gRU9TIGJ1ZmZlciBleHBsaWNpdHkKLSAgLy8gd2l0aCB0aGUgcHJvdmlkZWQgRU9TIG1ldGhvZC4KLSAgaWYgKHNpemUgPT0gMCkgewotICAgIFRSQUNFX0VWRU5UMCgKLSAgICAgICAgIm1lZGlhX3N0YWNrIiwKLSAgICAgICAgIlNoZWxsQnVmZmVyRmFjdG9yeTo6QWxsb2NhdGVCdWZmZXJOb3coKSBmYWlsZWQgYXMgc2l6ZSBpcyAwLiIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgYmFzZTo6QXV0b0xvY2sgbG9jayhsb2NrXyk7Ci0gIHVpbnQ4KiBieXRlcyA9IEFsbG9jYXRlX0xvY2tlZChzaXplKTsKLSAgaWYgKCFieXRlcykgewotICAgIFRSQUNFX0VWRU5UMCgKLSAgICAgICAgIm1lZGlhX3N0YWNrIiwKLSAgICAgICAgIlNoZWxsQnVmZmVyRmFjdG9yeTo6QWxsb2NhdGVCdWZmZXJOb3coKSBmYWlsZWQgYXMgc2l6ZSBpcyB0b28gbGFyZ2UuIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBidWZmZXIgPQotICAgICAgbmV3IERlY29kZXJCdWZmZXIoYnl0ZXMsIHNpemUsIGlzX2tleWZyYW1lKTsKLSAgVFJBQ0VfRVZFTlQwKCJtZWRpYV9zdGFjayIsCi0gICAgICAgICAgICAgICAiU2hlbGxCdWZmZXJGYWN0b3J5OjpBbGxvY2F0ZUJ1ZmZlck5vdygpIGZpbmlzaGVkIGFsbG9jYXRpb24uIik7Ci0gIERDSEVDSyghYnVmZmVyLT5Jc0VuZE9mU3RyZWFtKCkpOwotCi0gIHJldHVybiBidWZmZXI7Ci19Ci0KLXVpbnQ4KiBTaGVsbEJ1ZmZlckZhY3Rvcnk6OkFsbG9jYXRlTm93KHNpemVfdCBzaXplKSB7Ci0gIC8vIHdlIHNraXAgdG8gdGhlIGhlYWQgb2YgdGhlIGxpbmUgZm9yIHRoZXNlIGFsbG9jYXRpb25zLCBpZiB0aGVyZSdzCi0gIC8vIHJvb20gd2UgYWxsb2NhdGUgaXQuCi0gIGJhc2U6OkF1dG9Mb2NrIGxvY2sobG9ja18pOwotICB1aW50OCogYnl0ZXMgPSBBbGxvY2F0ZV9Mb2NrZWQoc2l6ZSk7Ci0KLSAgaWYgKCFieXRlcykgewotICAgIERMT0coRVJST1IpIDw8IGJhc2U6OlN0cmluZ1ByaW50ZigiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpc2l6ZSk7Ci0gIH0KLQotICByZXR1cm4gYnl0ZXM7Ci19Ci0KLXNjb3BlZF9yZWZwdHI8U2hlbGxTY29wZWRBcnJheT4gU2hlbGxCdWZmZXJGYWN0b3J5OjpBbGxvY2F0ZUFycmF5KHNpemVfdCBzaXplKSB7Ci0gIFRSQUNFX0VWRU5UMSgibWVkaWFfc3RhY2siLCAiU2hlbGxCdWZmZXJGYWN0b3J5OjpBbGxvY2F0ZUFycmF5KCkiLCAic2l6ZSIsCi0gICAgICAgICAgICAgICBzaXplKTsKLSAgdWludDgqIGFsbG9jYXRlZF9ieXRlcyA9IE5VTEw7Ci0gIGlmIChzaXplID09IDApIHsKLSAgICBUUkFDRV9FVkVOVDAoIm1lZGlhX3N0YWNrIiwKLSAgICAgICAgICAgICAgICAgIlNoZWxsQnVmZmVyRmFjdG9yeTo6QWxsb2NhdGVBcnJheSgpIGZhaWxlZCBhcyBzaXplIGlzIDAuIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBpZiAoc2l6ZSA8PSBrU2hlbGxNYXhBcnJheVNpemUpIHsKLSAgICBiYXNlOjpBdXRvTG9jayBsb2NrKGxvY2tfKTsKLSAgICAvLyB0aGVyZSBzaG91bGQgbm90IGFscmVhZHkgYmUgc29tZWJvZHkgd2FpdGluZyBvbiBhbiBhcnJheQotICAgIGlmIChhcnJheV9yZXF1ZXN0ZWRfc2l6ZV8gPiAwKSB7Ci0gICAgICBUUkFDRV9FVkVOVDAoCi0gICAgICAgICAgIm1lZGlhX3N0YWNrIiwKLSAgICAgICAgICAiU2hlbGxCdWZmZXJGYWN0b3J5OjpBbGxvY2F0ZUFycmF5KCkgZmFpbGVkIGFzIGFub3RoZXIgYWxsb2NhdGlvbiBpcyIKLSAgICAgICAgICAiIGluIHByb2dyZXNzLiIpOwotICAgICAgTk9UUkVBQ0hFRCgpIDw8ICJNYXggb25lIHRocmVhZCBibG9ja2luZyBvbiBhcnJheSBhbGxvY2F0aW9uIGF0IGEgdGltZS4iOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIC8vIEF0dGVtcHQgdG8gYWxsb2NhdGUuCi0gICAgYWxsb2NhdGVkX2J5dGVzID0gQWxsb2NhdGVfTG9ja2VkKHNpemUpOwotICAgIC8vIElmIHdlIGRvbid0IGhhdmUgcm9vbSBzYXZlIHN0YXRlIHdoaWxlIHdlIHN0aWxsIGhhdmUgdGhlIGxvY2sKLSAgICBpZiAoIWFsbG9jYXRlZF9ieXRlcykgewotICAgICAgYXJyYXlfcmVxdWVzdGVkX3NpemVfID0gc2l6ZTsKLSAgICB9Ci0gIH0gZWxzZSB7ICAvLyBvdmVyc2l6ZWQgcmVxdWVzdHMgYWx3YXlzIGZhaWwgaW5zdGFudGx5LgotICAgIFRSQUNFX0VWRU5UMCgKLSAgICAgICAgIm1lZGlhX3N0YWNrIiwKLSAgICAgICAgIlNoZWxsQnVmZmVyRmFjdG9yeTo6QWxsb2NhdGVBcnJheSgpIGZhaWxlZCBhcyBzaXplIGlzIHRvbyBsYXJnZS4iKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICAvLyBMb2NrIGlzIHJlbGVhc2VkLiBOb3cgc2FmZSB0byBibG9jayB0aGlzIHRocmVhZCBpZiB3ZSBuZWVkIHRvLgotICBpZiAoIWFsbG9jYXRlZF9ieXRlcykgewotICAgIFRSQUNFX0VWRU5UMCgibWVkaWFfc3RhY2siLAotICAgICAgICAgICAgICAgICAiU2hlbGxCdWZmZXJGYWN0b3J5OjpBbGxvY2F0ZUFycmF5KCkgZGVmZXJyZWQuIik7Ci0gICAgLy8gV2FpdCB1bnRpbCBlbm91Z2ggbWVtb3J5IGhhcyBiZWVuIHJlbGVhc2VkIHRvIHNlcnZpY2UgdGhpcyBhbGxvY2F0aW9uLgotICAgIGFycmF5X2FsbG9jYXRpb25fZXZlbnRfLldhaXQoKTsKLSAgICB7Ci0gICAgICAvLyBhY3F1aXJlIGxvY2sgdG8gZ2V0IGFkZHJlc3MgYW5kIGNsZWFyIHJlcXVlc3RlZCBzaXplCi0gICAgICBiYXNlOjpBdXRvTG9jayBsb2NrKGxvY2tfKTsKLSAgICAgIC8vIG1ha2Ugc3VyZSB0aGlzIGFsbG9jYXRpb24gbWFrZXMgc2Vuc2UKLSAgICAgIERDSEVDS19FUShzaXplLCBhcnJheV9yZXF1ZXN0ZWRfc2l6ZV8pOwotICAgICAgRENIRUNLKGFycmF5X2FsbG9jYXRpb25fKTsKLSAgICAgIGFsbG9jYXRlZF9ieXRlcyA9IGFycmF5X2FsbG9jYXRpb25fOwotICAgICAgYXJyYXlfYWxsb2NhdGlvbl8gPSBOVUxMOwotICAgICAgYXJyYXlfcmVxdWVzdGVkX3NpemVfID0gMDsKLSAgICB9Ci0gIH0KLSAgLy8gV2hldGhlciB3ZSBibG9ja2VkIG9yIG5vdCB3ZSBzaG91bGQgbm93IGhhdmUgYSBwb2ludGVyCi0gIERDSEVDSyhhbGxvY2F0ZWRfYnl0ZXMpOwotICBUUkFDRV9FVkVOVDAoIm1lZGlhX3N0YWNrIiwKLSAgICAgICAgICAgICAgICJTaGVsbEJ1ZmZlckZhY3Rvcnk6OkFsbG9jYXRlQXJyYXkoKSBmaW5pc2hlZCBhbGxvY2F0aW9uLiIpOwotICByZXR1cm4gc2NvcGVkX3JlZnB0cjxTaGVsbFNjb3BlZEFycmF5PigKLSAgICAgIG5ldyBTaGVsbFNjb3BlZEFycmF5KGFsbG9jYXRlZF9ieXRlcywgc2l6ZSkpOwotfQotCi12b2lkIFNoZWxsQnVmZmVyRmFjdG9yeTo6UmVjbGFpbSh1aW50OCogcCkgewotICBUUkFDRV9FVkVOVDAoIm1lZGlhX3N0YWNrIiwgIlNoZWxsQnVmZmVyRmFjdG9yeTo6UmVjbGFpbSgpIik7Ci0gIHR5cGVkZWYgc3RkOjpsaXN0PHN0ZDo6cGFpcjxBbGxvY0NCLCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+ID4gPgotICAgICAgRmluaXNoTGlzdDsKLSAgRmluaXNoTGlzdCBmaW5pc2hlZF9hbGxvY3M7Ci0KLSAgLy8gUmVjbGFpbSgpIG9uIGEgTlVMTCBidWZmZXIgaXMgYSBuby1vcCwgZG9uJ3QgZXZlbiBhY3F1aXJlIHRoZSBsb2NrLgotICBpZiAocCkgewotICAgIGJhc2U6OkF1dG9Mb2NrIGxvY2sobG9ja18pOwotICAgIFNoZWxsTWVkaWFQbGF0Zm9ybTo6SW5zdGFuY2UoKS0+RnJlZUJ1ZmZlcihwKTsKLQotICAgIC8vIFRyeSB0byBzZXJ2aWNlIGEgYmxvY2tpbmcgYXJyYXkgcmVxdWVzdCBpZiB0aGVyZSBpcyBvbmUsIGFuZCBpdCBoYXNuJ3QKLSAgICAvLyBhbHJlYWR5IGJlZW4gc2VydmljZWQuIElmIHdlIGNhbid0IHNlcnZpY2UgaXQgdGhlbiB3ZSB3b24ndCBhbGxvY2F0ZSBhbnkKLSAgICAvLyBhZGRpdGlvbmFsIFNoZWxsQnVmZmVycyBhcyBhcnJheXMgZ2V0IHByaW9yaXR5IHRyZWF0bWVudC4KLSAgICBib29sIHNlcnZpY2VfYnVmZmVycyA9IHRydWU7Ci0gICAgaWYgKGFycmF5X3JlcXVlc3RlZF9zaXplXyA+IDAgJiYgIWFycmF5X2FsbG9jYXRpb25fKSB7Ci0gICAgICBhcnJheV9hbGxvY2F0aW9uXyA9IEFsbG9jYXRlX0xvY2tlZChhcnJheV9yZXF1ZXN0ZWRfc2l6ZV8pOwotICAgICAgaWYgKGFycmF5X2FsbG9jYXRpb25fKSB7Ci0gICAgICAgIC8vIFdha2UgdXAgYmxvY2tlZCB0aHJlYWQKLSAgICAgICAgYXJyYXlfYWxsb2NhdGlvbl9ldmVudF8uU2lnbmFsKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBOb3QgZW5vdWdoIHJvb20gZm9yIHRoZSBhcnJheSBzbyBkb24ndCBnaXZlIGF3YXkgd2hhdCByb29tIHdlIGhhdmUKLSAgICAgICAgLy8gdG8gdGhlIGJ1ZmZlcnMuCi0gICAgICAgIHNlcnZpY2VfYnVmZmVycyA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICAvLyBUcnkgdG8gcHJvY2VzcyBhbnkgZW5xdWV1ZWQgYWxsb2NzIGluIEZJRk8gb3JkZXIgdW50aWwgd2UgcnVuIG91dCBvZiByb29tCi0gICAgd2hpbGUgKHNlcnZpY2VfYnVmZmVycyAmJiBwZW5kaW5nX2FsbG9jc18uc2l6ZSgpKSB7Ci0gICAgICBzaXplX3Qgc2l6ZSA9IHBlbmRpbmdfYWxsb2NzXy5mcm9udCgpLnNlY29uZC0+R2V0QWxsb2NhdGVkU2l6ZSgpOwotICAgICAgdWludDgqIGJ5dGVzID0gQWxsb2NhdGVfTG9ja2VkKHNpemUpOwotICAgICAgaWYgKGJ5dGVzKSB7Ci0gICAgICAgIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gYWxsb2NfYnVmZiA9Ci0gICAgICAgICAgICBwZW5kaW5nX2FsbG9jc18uZnJvbnQoKS5zZWNvbmQ7Ci0gICAgICAgIGFsbG9jX2J1ZmYtPlNldEJ1ZmZlcihieXRlcyk7Ci0gICAgICAgIFRSQUNFX0VWRU5UMSgibWVkaWFfc3RhY2siLAotICAgICAgICAgICAgICAgICAgICAgIlNoZWxsQnVmZmVyRmFjdG9yeTo6UmVjbGFpbSgpIGZpbmlzaGVkIGFsbG9jYXRpb24uIiwKLSAgICAgICAgICAgICAgICAgICAgICJzaXplIiwgc2l6ZSk7Ci0gICAgICAgIGZpbmlzaGVkX2FsbG9jcy5wdXNoX2JhY2soCi0gICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihwZW5kaW5nX2FsbG9jc18uZnJvbnQoKS5maXJzdCwgYWxsb2NfYnVmZikpOwotICAgICAgICBwZW5kaW5nX2FsbG9jc18ucG9wX2Zyb250KCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzZXJ2aWNlX2J1ZmZlcnMgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgLy8gT0ssIGxvY2sgcmVsZWFzZWQsIGRvIGNhbGxiYWNrcyBmb3IgZmluaXNoZWQgYWxsb2NzCi0gIGZvciAoRmluaXNoTGlzdDo6aXRlcmF0b3IgaXQgPSBmaW5pc2hlZF9hbGxvY3MuYmVnaW4oKTsKLSAgICAgICBpdCAhPSBmaW5pc2hlZF9hbGxvY3MuZW5kKCk7ICsraXQpIHsKLSAgICBpdC0+Zmlyc3QuUnVuKGl0LT5zZWNvbmQpOwotICB9Ci19Ci0KLXVpbnQ4KiBTaGVsbEJ1ZmZlckZhY3Rvcnk6OkFsbG9jYXRlX0xvY2tlZChzaXplX3Qgc2l6ZSkgewotICAvLyBzaG91bGQgaGF2ZSBhY3F1aXJlZCB0aGUgbG9jayBhbHJlYWR5Ci0gIGxvY2tfLkFzc2VydEFjcXVpcmVkKCk7Ci0gIFVQREFURV9NRURJQV9TVEFUSVNUSUNTKFNUQVRfVFlQRV9BTExPQ0FURURfU0hFTExfQlVGRkVSX1NJWkUsIHNpemUpOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDgqPigKLSAgICAgIFNoZWxsTWVkaWFQbGF0Zm9ybTo6SW5zdGFuY2UoKS0+QWxsb2NhdGVCdWZmZXIoc2l6ZSkpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgU2hlbGxCdWZmZXJGYWN0b3J5OjpUZXJtaW5hdGUoKSB7Ci0gIGluc3RhbmNlXyA9IE5VTEw7Ci19Ci0KLVNoZWxsQnVmZmVyRmFjdG9yeTo6U2hlbGxCdWZmZXJGYWN0b3J5KCkKLSAgICA6IGFycmF5X2FsbG9jYXRpb25fZXZlbnRfKGZhbHNlLCBmYWxzZSksCi0gICAgICBhcnJheV9yZXF1ZXN0ZWRfc2l6ZV8oMCksCi0gICAgICBhcnJheV9hbGxvY2F0aW9uXyhOVUxMKSB7fQotCi0vLyBXaWxsIGJlIGNhbGxlZCB3aGVuIGFsbCBTaGVsbEJ1ZmZlcnMgaGF2ZSBiZWVuIGRlbGV0ZWQgQU5EIGluc3RhbmNlXyBoYXMKLS8vIGJlZW4gc2V0IHRvIE5VTEwuCi1TaGVsbEJ1ZmZlckZhY3Rvcnk6On5TaGVsbEJ1ZmZlckZhY3RvcnkoKSB7Ci0gIC8vIGFuZCBubyBvdXRzdGFuZGluZyBhcnJheSByZXF1ZXN0cwotICBEQ0hFQ0tfRVEoYXJyYXlfcmVxdWVzdGVkX3NpemVfLCAwKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9zaGVsbF9idWZmZXJfZmFjdG9yeS5oIGIvc3JjL21lZGlhL2Jhc2Uvc2hlbGxfYnVmZmVyX2ZhY3RvcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGExODE1Ni4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9zaGVsbF9idWZmZXJfZmFjdG9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQkFTRV9TSEVMTF9CVUZGRVJfRkFDVE9SWV9IXwotI2RlZmluZSBNRURJQV9CQVNFX1NIRUxMX0JVRkZFUl9GQUNUT1JZX0hfCi0KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPG1hcD4KLQotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKLSNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi93YWl0YWJsZV9ldmVudC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtTaGVsbE1heEFycmF5U2l6ZSA9IDEwMjQgKiAxMDI0OwotCi1jbGFzcyBEZWNvZGVyQnVmZmVyOwotY2xhc3MgRGVjcnlwdENvbmZpZzsKLWNsYXNzIFNoZWxsQnVmZmVyRmFjdG9yeTsKLQotLy8gQSBzaW1wbGUgc2NvcGVkIGFycmF5IGNsYXNzIGRlc2lnbmVkIHRvIHJlLXVzZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBieQotLy8gU2hlbGxCdWZmZXJGYWN0b3J5LiBJZiBuZWVkZWQgd291bGQgYmUgdHJpdmlhbCB0byBtYWtlIGdlbmVyaWMuCi1jbGFzcyBNRURJQV9FWFBPUlQgU2hlbGxTY29wZWRBcnJheQotICAgIDogcHVibGljIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPFNoZWxsU2NvcGVkQXJyYXk+IHsKLSBwdWJsaWM6Ci0gIHVpbnQ4KiBHZXQoKSB7IHJldHVybiBhcnJheV87IH0KLSAgc2l6ZV90IFNpemUoKSB7IHJldHVybiBzaXplXzsgfQotCi0gcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPFNoZWxsU2NvcGVkQXJyYXk+OwotICBmcmllbmQgY2xhc3MgU2hlbGxCdWZmZXJGYWN0b3J5OwotICAvLyBTaG91bGQgb25seSBiZSBjYWxsZWQgYnkgU2hlbGxCdWZmZXJGYWN0b3J5LCBjb25zdW1lcnMgc2hvdWxkIHVzZQotICAvLyBTaGVsbEJ1ZmZlckZhY3Rvcnk6OkFsbG9jYXRlQXJyYXkgdG8gYWxsb2NhdGUgYSBTaGVsbFNjb3BlZEFycmF5Ci0gIFNoZWxsU2NvcGVkQXJyYXkodWludDgqIHJlc3VhYmxlX2J1ZmZlciwgc2l6ZV90IHNpemUpOwotICB2aXJ0dWFsIH5TaGVsbFNjb3BlZEFycmF5KCk7Ci0gIHVpbnQ4KiBhcnJheV87Ci0gIHNpemVfdCBzaXplXzsKLSAgc2NvcGVkX3JlZnB0cjxTaGVsbEJ1ZmZlckZhY3Rvcnk+IGJ1ZmZlcl9mYWN0b3J5XzsKLQotICBESVNBTExPV19JTVBMSUNJVF9DT05TVFJVQ1RPUlMoU2hlbGxTY29wZWRBcnJheSk7Ci19OwotCi0vLyBTaW5nbGV0b24gaW5zdGFuY2UgY2xhc3MgZm9yIHRoZSBtYW5hZ2VtZW50IGFuZCByZWN5Y2xpbmcgb2YgbWVkaWEtcmVsYXRlZAotLy8gYnVmZmVycy4gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSB1c2FnZSBwYXR0ZXJuIG9mIHRoZXNlIGJ1ZmZlcnMgaXMgdGhhdCB0aGV5Ci0vLyBhcmUgdXNlZCBmb3Igb25seSBhIHNob3J0IGFtb3VudCBvZiB0aW1lLCBhbmQgdGhlaXIgYWxsb2NhdGlvbiBpcyByb3VnaGx5Ci0vLyBjeWNsaWNhbC4gQWxsIGJ1ZmZlcnMgYXJlIGFsbG9jYXRlZCB1c2luZyB0aGUgYWxpZ25tZW50IGNvbnN0YW50cyBkZWZpbmVkCi0vLyBhYm92ZSwgYW5kIGFsbCBidWZmZXJzIGFyZSBhbGxvY2F0ZWQgZnJvbSB0aGUgc2hhcmVkIHBvb2wgb2YgbWVtb3J5IG9mCi0vLyBzaXplIGRlZmluZWQgYWJvdmUuCi1jbGFzcyBNRURJQV9FWFBPUlQgU2hlbGxCdWZmZXJGYWN0b3J5Ci0gICAgOiBwdWJsaWMgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8U2hlbGxCdWZmZXJGYWN0b3J5PiB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCBJbml0aWFsaXplKCk7Ci0gIHN0YXRpYyBpbmxpbmUgc2NvcGVkX3JlZnB0cjxTaGVsbEJ1ZmZlckZhY3Rvcnk+IEluc3RhbmNlKCkgewotICAgIHJldHVybiBpbnN0YW5jZV87Ci0gIH0KLQotICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHZvaWQoc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPik+IEFsbG9jQ0I7Ci0gIC8vIFJldHVybnMgZmFsc2UgaWYgdGhlIGFsbG9jYXRvciB3aWxsIG5ldmVyIGJlIGFibGUgdG8gYWxsb2NhdGUgYSBidWZmZXIKLSAgLy8gb2YgdGhlIHJlcXVlc3RlZCBzaXplLiBOb3RlIHRoYXQgaWYgbWVtb3J5IGlzIGN1cnJlbnRseSBhdmFpbGFibGUgdGhpcwotICAvLyBmdW5jdGlvbiB3aWxsIGNhbGwgdGhlIGNhbGxiYWNrIHByb3ZpZGVkIF9iZWZvcmVfIHJldHVybmluZyB0cnVlLgotICBib29sIEFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplLCBib29sIGlzX2tleWZyYW1lLCBBbGxvY0NCIGNiKTsKLSAgLy8gVGhpcyBmdW5jdGlvbiB0cmllcyB0byBhbGxvY2F0ZSBhIERlY29kZXJCdWZmZXIgaW1tZWRpYXRlbHkuIEl0IHJldHVybnMKLSAgLy8gTlVMTCBvbiBmYWlsdXJlLgotICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IEFsbG9jYXRlQnVmZmVyTm93KHNpemVfdCBzaXplLCBib29sIGlzX2tleWZyYW1lKTsKLSAgLy8gUmV0dXJucyBhIG5ld2x5IGFsbG9jYXRlZCBieXRlIGZpZWxkIGlmIHRoZXJlJ3Mgcm9vbSBmb3IgaXQsIG9yIE5VTEwgaWYKLSAgLy8gdGhlcmUgaXNuJ3QuIE5vdGUgdGhhdCB0aGlzIHJhdyBhbGxvY2F0aW9uIG1ldGhvZCBwcm92aWRlcyBubyBndWFyYW50ZWUKLSAgLy8gdGhhdCBTaGVsbEJ1ZmZlckZhY3Rvcnkgd2lsbCBzdGlsbCBleGlzdCB3aGVuIHRoZSBtZW1vcnkgaXMgdG8gYmUgZnJlZWQuCi0gIC8vIElmIHRoYXQgaXMgaW1wb3J0YW50IHBsZWFzZSByZXRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciBmYWN0b3J5Ci0gIC8vICh1c2luZyBJbnN0YW5jZSgpKSB1bnRpbCB0aGUgbWVtb3J5IGlzIHRvIGJlIHJlY2xhaW1lZC4KLSAgdWludDgqIEFsbG9jYXRlTm93KHNpemVfdCBzaXplKTsKLSAgLy8gQkxPQ0tTIFRIRSBDQUxMSU5HIFRIUkVBRCB1bnRpbCBhbiBhcnJheSBvZiBzaXplIGlzIGF2YWlsYWJsZSBhbmQgY2FuIGJlCi0gIC8vIGFsbG9jYXRlZC4gV2Ugb25seSBhbGxvdyBvbmUgdGhyZWFkIHRvIGJsb2NrIG9uIGFuIGFycmF5IGFsbG9jYXRpb24gYXQgYQotICAvLyB0aW1lLCBhbGwgc3Vic2VxdWVudHMgY2FsbHMgb24gb3RoZXIgdGhyZWFkcyB0byBBbGxvY2F0ZUFycmF5IHdpbGwgYXNzZXJ0Ci0gIC8vIGFuZCByZXR1cm4gTlVMTC4KLSAgc2NvcGVkX3JlZnB0cjxTaGVsbFNjb3BlZEFycmF5PiBBbGxvY2F0ZUFycmF5KHNpemVfdCBzaXplKTsKLQotICAvLyBPbmx5IGNhbGxlZCBieSBEZWNvZGVyQnVmZmVyIGFuZCBTaGVsbFNjb3BlZEFycmF5LCBpbmZvcm1zIHRoZSBmYWN0b3J5Ci0gIC8vIHRoYXQgdGhlc2Ugb2JqZWN0cyBoYXZlIGdvbmUgb3V0IG9mIHNjb3BlZCBhbmQgd2UgY2FuIHJlY2xhaW0gdGhlIG1lbW9yeQotICB2b2lkIFJlY2xhaW0odWludDgqIHApOwotCi0gIHN0YXRpYyB2b2lkIFRlcm1pbmF0ZSgpOwotCi0gcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPFNoZWxsQnVmZmVyRmFjdG9yeT47Ci0gIFNoZWxsQnVmZmVyRmFjdG9yeSgpOwotICB+U2hlbGxCdWZmZXJGYWN0b3J5KCk7Ci0gIHVpbnQ4KiBBbGxvY2F0ZV9Mb2NrZWQoc2l6ZV90IGFsaWduZWRfc2l6ZSk7Ci0KLSAgc3RhdGljIHNjb3BlZF9yZWZwdHI8U2hlbGxCdWZmZXJGYWN0b3J5PiBpbnN0YW5jZV87Ci0KLSAgLy8gcHJvdGVjdHMgYWxsIGZvbGxvd2luZyBtZW1iZXJzLgotICBiYXNlOjpMb2NrIGxvY2tfOwotCi0gIC8vIHF1ZXVlIG9mIHBlbmRpbmcgYnVmZmVyIGFsbG9jYXRpb24gcmVxdWVzdHMgYW5kIHRoZWlyIHNpemVzCi0gIHR5cGVkZWYgc3RkOjpsaXN0PHN0ZDo6cGFpcjxBbGxvY0NCLCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+ID4gPgotICAgICAgQWxsb2NMaXN0OwotICBBbGxvY0xpc3QgcGVuZGluZ19hbGxvY3NfOwotCi0gIC8vIGV2ZW50IHVzZWQgZm9yIGJsb2NraW5nIGNhbGxzIGZvciBhcnJheSBhbGxvY2F0aW9uCi0gIGJhc2U6OldhaXRhYmxlRXZlbnQgYXJyYXlfYWxsb2NhdGlvbl9ldmVudF87Ci0gIC8vIHNldCB0byAwIHdoZW4gbm8gdGhyZWFkIGlzIGJsb2NraW5nIG9uIGFuIGFycmF5IGFsbG9jYXRpb24KLSAgc2l6ZV90IGFycmF5X3JlcXVlc3RlZF9zaXplXzsKLSAgLy8gc2V0IHRvIGFuIGFsbG9jYXRpb24gYWRkcmVzcyB3aGVuIGFsbG9jYXRpb24gaGFzIHN1Y2NlZWRlZAotICB1aW50OCogYXJyYXlfYWxsb2NhdGlvbl87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX1NIRUxMX0JVRkZFUl9GQUNUT1JZX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9zaGVsbF9jYWNoZWRfZGVjb2Rlcl9idWZmZXIuY2MgYi9zcmMvbWVkaWEvYmFzZS9zaGVsbF9jYWNoZWRfZGVjb2Rlcl9idWZmZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ODczYmEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2Uvc2hlbGxfY2FjaGVkX2RlY29kZXJfYnVmZmVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2hlbGxfY2FjaGVkX2RlY29kZXJfYnVmZmVyLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLVNoZWxsQ2FjaGVkRGVjb2RlckJ1ZmZlcjo6U2hlbGxDYWNoZWREZWNvZGVyQnVmZmVyKAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8bWVkaWE6OkRlY29kZXJCdWZmZXI+JiBzb3VyY2VfYnVmZmVyLAotICAgIHZvaWQqIGRlc3RpbmF0aW9uLAotICAgIEZyZWVDQiBmcmVlX2NiKQotICAgIDogbWVkaWE6OkRlY29kZXJCdWZmZXIoTlVMTCwgMCwgc291cmNlX2J1ZmZlci0+SXNLZXlmcmFtZSgpKSwKLSAgICAgIHNvdXJjZV9idWZmZXJfKHNvdXJjZV9idWZmZXIpLAotICAgICAgZnJlZV9jYl8oZnJlZV9jYikgewotICBEQ0hFQ0soc291cmNlX2J1ZmZlcik7Ci0gIERDSEVDSyhkZXN0aW5hdGlvbik7Ci0gIERDSEVDSyghZnJlZV9jYi5pc19udWxsKCkpOwotICBEQ0hFQ0soIXNvdXJjZV9idWZmZXItPklzRW5kT2ZTdHJlYW0oKSk7Ci0KLSAgU2V0VGltZXN0YW1wKHNvdXJjZV9idWZmZXItPkdldFRpbWVzdGFtcCgpKTsKLSAgU2V0RHVyYXRpb24oc291cmNlX2J1ZmZlci0+R2V0RHVyYXRpb24oKSk7Ci0KLSAgYnVmZmVyXyA9IHN0YXRpY19jYXN0PHVpbnQ4Kj4oZGVzdGluYXRpb24pOwotICBtZW1jcHkoYnVmZmVyXywgc291cmNlX2J1ZmZlcl8tPkdldERhdGEoKSwgc291cmNlX2J1ZmZlcl8tPkdldERhdGFTaXplKCkpOwotICBzaXplXyA9IHNvdXJjZV9idWZmZXJfLT5HZXREYXRhU2l6ZSgpOwotCi0gIC8vIFRoZSBidWZmZXIgaXMgbm90IGV4cGFuZGFibGUuCi0gIGFsbG9jYXRlZF9zaXplXyA9IHNvdXJjZV9idWZmZXJfLT5HZXREYXRhU2l6ZSgpOwotICBpc19kZWNyeXB0ZWRfID0gc291cmNlX2J1ZmZlcl8tPklzQWxyZWFkeURlY3J5cHRlZCgpOwotfQotCi1TaGVsbENhY2hlZERlY29kZXJCdWZmZXI6On5TaGVsbENhY2hlZERlY29kZXJCdWZmZXIoKSB7Ci0gIGZyZWVfY2JfLlJ1bihidWZmZXJfKTsKLSAgLy8gU2V0IHRoZSBidWZmZXJfIHRvIE5VTEwgdG8gc3RvcCB0aGUgYmFzZSBjbGFzcyBkdG9yIGZyb20gZnJlZWluZyBpdC4KLSAgYnVmZmVyXyA9IE5VTEw7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2Uvc2hlbGxfY2FjaGVkX2RlY29kZXJfYnVmZmVyLmggYi9zcmMvbWVkaWEvYmFzZS9zaGVsbF9jYWNoZWRfZGVjb2Rlcl9idWZmZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIzYmFhZC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9zaGVsbF9jYWNoZWRfZGVjb2Rlcl9idWZmZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfU0hFTExfQ0FDSEVEX0RFQ09ERVJfQlVGRkVSX0hfCi0jZGVmaW5lIE1FRElBX1NIRUxMX0NBQ0hFRF9ERUNPREVSX0JVRkZFUl9IXwotCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlci5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBUaGlzIGNsYXNzIGNhbiBjYWNoZSB0aGUgY29udGVudCBvZiB8c291cmNlX2J1ZmZlcnwgaW50byBtYWluIG1lbW9yeS4gIFNvIGl0Ci0vLyBpcyBwb3NzaWJsZSB0byBzdG9yZSBEZWNvZGVyQnVmZmVyIGluIG1lbW9yeSBzcGFjZSB0aGF0IGNhbm5vdCBiZSBhY2Nlc3NlZCBieQotLy8gdGhlIGRlY29kZXIgYW5kIGNvcHkgdGhlbSBvdmVyIHRvIG1haW4gbWVtb3J5IGp1c3QgYmVmb3JlIHRoZXkgYXJlIGRlY29kZWQuCi1jbGFzcyBTaGVsbENhY2hlZERlY29kZXJCdWZmZXIgOiBwdWJsaWMgbWVkaWE6OkRlY29kZXJCdWZmZXIgewotIHB1YmxpYzoKLSAgLy8gQ2FsbGJhY2sgdG8gZnJlZSBtZW1vcnkgcGFzc2VkIGluLgotICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHZvaWQodm9pZCopPiBGcmVlQ0I7Ci0KLSAgU2hlbGxDYWNoZWREZWNvZGVyQnVmZmVyKAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxtZWRpYTo6RGVjb2RlckJ1ZmZlcj4mIHNvdXJjZV9idWZmZXIsCi0gICAgICB2b2lkKiBkZXN0aW5hdGlvbiwKLSAgICAgIEZyZWVDQiBmcmVlX2NiKTsKLSAgflNoZWxsQ2FjaGVkRGVjb2RlckJ1ZmZlcigpOwotCi0gIGNvbnN0IG1lZGlhOjpEZWNyeXB0Q29uZmlnKiBHZXREZWNyeXB0Q29uZmlnKCkgY29uc3QgT1ZFUlJJREUgewotICAgIHJldHVybiBzb3VyY2VfYnVmZmVyXy0+R2V0RGVjcnlwdENvbmZpZygpOwotICB9Ci0gIHZvaWQgU2V0RGVjcnlwdENvbmZpZyhzY29wZWRfcHRyPG1lZGlhOjpEZWNyeXB0Q29uZmlnPikgT1ZFUlJJREUgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc2NvcGVkX3JlZnB0cjxtZWRpYTo6RGVjb2RlckJ1ZmZlcj4gc291cmNlX2J1ZmZlcl87Ci0gIEZyZWVDQiBmcmVlX2NiXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX1NIRUxMX0NBQ0hFRF9ERUNPREVSX0JVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2Uvc2hlbGxfZGF0YV9zb3VyY2VfcmVhZGVyLmNjIGIvc3JjL21lZGlhL2Jhc2Uvc2hlbGxfZGF0YV9zb3VyY2VfcmVhZGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGU2NWYxLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3NoZWxsX2RhdGFfc291cmNlX3JlYWRlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaGVsbF9kYXRhX3NvdXJjZV9yZWFkZXIuaCIKLQotI2luY2x1ZGUgPGxpbWl0cy5oPiAgLy8gZm9yIFVMTE9OR19NQVgKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY29uc3QgaW50IFNoZWxsRGF0YVNvdXJjZVJlYWRlcjo6a1JlYWRFcnJvciA9IERhdGFTb3VyY2U6OmtSZWFkRXJyb3I7Ci0KLVNoZWxsRGF0YVNvdXJjZVJlYWRlcjo6U2hlbGxEYXRhU291cmNlUmVhZGVyKCkKLSAgICA6IGRhdGFfc291cmNlXyhOVUxMKSwKLSAgICAgIGJsb2NraW5nX3JlYWRfZXZlbnRfKGZhbHNlLCBmYWxzZSksCi0gICAgICBmaWxlX3NpemVfKC0xKSwKLSAgICAgIHJlYWRfaGFzX2ZhaWxlZF8oZmFsc2UpLAotICAgICAgbGFzdF9ieXRlc19yZWFkXygwKSB7fQotCi1TaGVsbERhdGFTb3VyY2VSZWFkZXI6On5TaGVsbERhdGFTb3VyY2VSZWFkZXIoKSB7fQotCi12b2lkIFNoZWxsRGF0YVNvdXJjZVJlYWRlcjo6U2V0RGF0YVNvdXJjZShEYXRhU291cmNlKiBkYXRhX3NvdXJjZSkgewotICBEQ0hFQ0soZGF0YV9zb3VyY2UpOwotICBkYXRhX3NvdXJjZV8gPSBkYXRhX3NvdXJjZTsKLX0KLQotLy8gY3VycmVudGx5IG9ubHkgc2luZ2xlLXRocmVhZGVkIHJlYWRzIHN1cHBvcnRlZAotaW50IFNoZWxsRGF0YVNvdXJjZVJlYWRlcjo6QmxvY2tpbmdSZWFkKGludDY0IHBvc2l0aW9uLCBpbnQgc2l6ZSwgdWludDgqIGRhdGEpIHsKLSAgLy8gcmVhZCBmYWlsdXJlcyBhcmUgdW5yZWNvdmVyYWJsZSwgYWxsIHN1YnNlcXVlbnQgcmVhZHMgd2lsbCBhbHNvIGZhaWwKLSAgaWYgKHJlYWRfaGFzX2ZhaWxlZF8pIHsKLSAgICByZXR1cm4ga1JlYWRFcnJvcjsKLSAgfQotCi0gIC8vIGNoZWNrIGJvdW5kcyBvZiByZWFkIGF0IG9yIHBhc3QgRU9GCi0gIGlmIChmaWxlX3NpemVfID49IDAgJiYgcG9zaXRpb24gPj0gZmlsZV9zaXplXykgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgaW50IHRvdGFsX2J5dGVzX3JlYWQgPSAwOwotICB3aGlsZSAoc2l6ZSA+IDAgJiYgIXJlYWRfaGFzX2ZhaWxlZF8pIHsKLSAgICB7Ci0gICAgICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICAgICAgaWYgKCFkYXRhX3NvdXJjZV8pIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBkYXRhX3NvdXJjZV8tPlJlYWQoCi0gICAgICAgICAgcG9zaXRpb24sIHNpemUsIGRhdGEsCi0gICAgICAgICAgYmFzZTo6QmluZCgmU2hlbGxEYXRhU291cmNlUmVhZGVyOjpCbG9ja2luZ1JlYWRDb21wbGV0ZWQsIHRoaXMpKTsKLSAgICB9Ci0KLSAgICAvLyB3YWl0IGZvciBjYWxsYmFjayBvbiByZWFkIGNvbXBsZXRpb24KLSAgICBibG9ja2luZ19yZWFkX2V2ZW50Xy5XYWl0KCk7Ci0KLSAgICBpZiAobGFzdF9ieXRlc19yZWFkXyA9PSBEYXRhU291cmNlOjprUmVhZEVycm9yKSB7Ci0gICAgICAvLyBtYWtlIGFsbCBmdXR1cmUgcmVhZHMgZmFpbAotICAgICAgcmVhZF9oYXNfZmFpbGVkXyA9IHRydWU7Ci0gICAgICByZXR1cm4ga1JlYWRFcnJvcjsKLSAgICB9Ci0KLSAgICBEQ0hFQ0tfTEUobGFzdF9ieXRlc19yZWFkXywgc2l6ZSk7Ci0gICAgaWYgKGxhc3RfYnl0ZXNfcmVhZF8gPiBzaXplKSB7Ci0gICAgICAvLyBtYWtlIGFsbCBmdXR1cmUgcmVhZHMgZmFpbAotICAgICAgcmVhZF9oYXNfZmFpbGVkXyA9IHRydWU7Ci0gICAgICByZXR1cm4ga1JlYWRFcnJvcjsKLSAgICB9Ci0KLSAgICAvLyBBdm9pZCBlbnRlcmluZyBhbiBlbmRsZXNzIGxvb3AgaGVyZS4KLSAgICBpZiAobGFzdF9ieXRlc19yZWFkXyA9PSAwKQotICAgICAgYnJlYWs7Ci0KLSAgICB0b3RhbF9ieXRlc19yZWFkICs9IGxhc3RfYnl0ZXNfcmVhZF87Ci0gICAgcG9zaXRpb24gKz0gbGFzdF9ieXRlc19yZWFkXzsKLSAgICBzaXplIC09IGxhc3RfYnl0ZXNfcmVhZF87Ci0gICAgZGF0YSArPSBsYXN0X2J5dGVzX3JlYWRfOwotICB9Ci0KLSAgaWYgKHJlYWRfaGFzX2ZhaWxlZF8pIHsKLSAgICByZXR1cm4ga1JlYWRFcnJvcjsKLSAgfQotICByZXR1cm4gdG90YWxfYnl0ZXNfcmVhZDsKLX0KLQotdm9pZCBTaGVsbERhdGFTb3VyY2VSZWFkZXI6OlN0b3AoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spIHsKLSAgaWYgKGRhdGFfc291cmNlXykgewotICAgIC8vIHN0b3AgdGhlIGRhdGEgc291cmNlLCBpdCBjYW4gY2FsbCB0aGUgY2FsbGJhY2sKLSAgICBkYXRhX3NvdXJjZV8tPlN0b3AoKTsKLQotICAgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gICAgZGF0YV9zb3VyY2VfID0gTlVMTDsKLSAgfQotICBjYWxsYmFjay5SdW4oKTsKLX0KLQotdm9pZCBTaGVsbERhdGFTb3VyY2VSZWFkZXI6OkJsb2NraW5nUmVhZENvbXBsZXRlZChpbnQgYnl0ZXNfcmVhZCkgewotICBsYXN0X2J5dGVzX3JlYWRfID0gYnl0ZXNfcmVhZDsKLSAgLy8gd2FrZSB1cCBibG9ja2VkIHRocmVhZAotICBibG9ja2luZ19yZWFkX2V2ZW50Xy5TaWduYWwoKTsKLX0KLQotaW50NjQgU2hlbGxEYXRhU291cmNlUmVhZGVyOjpGaWxlU2l6ZSgpIHsKLSAgaWYgKGZpbGVfc2l6ZV8gPT0gLTEpIHsKLSAgICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICAgIGlmIChkYXRhX3NvdXJjZV8gJiYgIWRhdGFfc291cmNlXy0+R2V0U2l6ZSgmZmlsZV9zaXplXykpIHsKLSAgICAgIGZpbGVfc2l6ZV8gPSAtMTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZpbGVfc2l6ZV87Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2Uvc2hlbGxfZGF0YV9zb3VyY2VfcmVhZGVyLmggYi9zcmMvbWVkaWEvYmFzZS9zaGVsbF9kYXRhX3NvdXJjZV9yZWFkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU1MGJlNy4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9zaGVsbF9kYXRhX3NvdXJjZV9yZWFkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQkFTRV9TSEVMTF9EQVRBX1NPVVJDRV9SRUFERVJfSF8KLSNkZWZpbmUgTUVESUFfQkFTRV9TSEVMTF9EQVRBX1NPVVJDRV9SRUFERVJfSF8KLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKLSNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKLSNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi93YWl0YWJsZV9ldmVudC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGF0YV9zb3VyY2UuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gQWxsb3dzIHNoYXJpbmcgb2YgYSBEYXRhU291cmNlIG9iamVjdCBiZXR3ZWVuIG11bHRpcGxlIG9iamVjdHMgb24gYSBzaW5nbGUKLS8vIHRocmVhZCwgYW5kIGV4cG9zZXMgYSBzaW1wbGUgQmxvY2tpbmdSZWFkKCkgbWV0aG9kIHRvIGJsb2NrIHRoZSB0aHJlYWQgdW50aWwKLS8vIGRhdGEgaXMgYXZhaWxhYmxlIG9yIGVycm9yLiBUbyBhdm9pZCBjaXJjdWxhciBzbWFydCBwb2ludGVyIHJlZmVyZW5jZXMgdGhpcwotLy8gb2JqZWN0IGlzIGFsc28gdGhlIHNvbGUgb3duZXIgb2YgYSBwb2ludGVyIHRvIERhdGFTb3VyY2UuICBJZiB3ZSB3YW50IHRvIGFkZAotLy8gYXN5bmNocm9ub3VzIHJlYWRpbmcgdG8gdGhpcyBvYmplY3QgaXQgd2lsbCBuZWVkIGl0cyBvd24gdGhyZWFkIGFuZCBhCi0vLyBjYWxsYmFjayBxdWV1ZS4KLWNsYXNzIFNoZWxsRGF0YVNvdXJjZVJlYWRlcgotICAgIDogcHVibGljIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPFNoZWxsRGF0YVNvdXJjZVJlYWRlcj4gewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IGludCBrUmVhZEVycm9yOwotCi0gIFNoZWxsRGF0YVNvdXJjZVJlYWRlcigpOwotICB2aXJ0dWFsIHZvaWQgU2V0RGF0YVNvdXJjZShEYXRhU291cmNlKiBkYXRhX3NvdXJjZSk7Ci0KLSAgLy8gQmxvY2sgdGhlIGNhbGxpbmcgdGhyZWFkJ3MgbWVzc2FnZSBsb29wIHVudGlsIHJlYWQgaXMgY29tcGxldGUuCi0gIC8vIHJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3Iga1JlYWRFcnJvciBvbiBlcnJvci4KLSAgLy8gQ3VycmVudGx5IG9ubHkgc2luZ2xlLXRocmVhZGVkIHN1cHBvcnQuCi0gIHZpcnR1YWwgaW50IEJsb2NraW5nUmVhZChpbnQ2NCBwb3NpdGlvbiwgaW50IHNpemUsIHVpbnQ4KiBkYXRhKTsKLQotICAvLyByZXR1cm5zIHNpemUgb2YgZmlsZSBpbiBieXRlcywgb3IgLTEgaWYgZmlsZSBzaXplIG5vdCBrbm93bi4gSWYgZXJyb3Igd2lsbAotICAvLyByZXRyeSBnZXR0aW5nIGZpbGUgc2l6ZSBvbiBzdWJzZXF1ZW50IGNhbGxzIHRvIEZpbGVTaXplKCkuCi0gIHZpcnR1YWwgaW50NjQgRmlsZVNpemUoKTsKLQotICAvLyBhYm9ydCBhbnkgcGVuZGluZyByZWFkLCB0aGVuIHN0b3AgdGhlIGRhdGEgc291cmNlCi0gIHZpcnR1YWwgdm9pZCBTdG9wKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKTsKLQotIHByb3RlY3RlZDoKLSAgZnJpZW5kIGNsYXNzIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPFNoZWxsRGF0YVNvdXJjZVJlYWRlcj47Ci0gIHZpcnR1YWwgflNoZWxsRGF0YVNvdXJjZVJlYWRlcigpOwotICAvLyBibG9ja2luZyByZWFkIGNhbGxiYWNrCi0gIHZpcnR1YWwgdm9pZCBCbG9ja2luZ1JlYWRDb21wbGV0ZWQoaW50IGJ5dGVzX3JlYWQpOwotCi0gIGJhc2U6OkxvY2sgbG9ja187Ci0gIERhdGFTb3VyY2UqIGRhdGFfc291cmNlXzsKLSAgYmFzZTo6V2FpdGFibGVFdmVudCBibG9ja2luZ19yZWFkX2V2ZW50XzsKLSAgaW50NjQgZmlsZV9zaXplXzsKLSAgYm9vbCByZWFkX2hhc19mYWlsZWRfOwotICBpbnQgbGFzdF9ieXRlc19yZWFkXzsgIC8vIHByb3RlY3RlZCBpbXBsaWNpdGx5IGJ5IGJsb2NraW5nX3JlYWRfZXZlbnRfCi19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX1NIRUxMX0RBVEFfU09VUkNFX1JFQURFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2Uvc2hlbGxfZmlsdGVyX2dyYXBoX2xvZ19jb25zdGFudHMuaCBiL3NyYy9tZWRpYS9iYXNlL3NoZWxsX2ZpbHRlcl9ncmFwaF9sb2dfY29uc3RhbnRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYWExMWQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2Uvc2hlbGxfZmlsdGVyX2dyYXBoX2xvZ19jb25zdGFudHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQkFTRV9TSEVMTF9GSUxURVJfR1JBUEhfTE9HX0NPTlNUQU5UU19IXwotI2RlZmluZSBNRURJQV9CQVNFX1NIRUxMX0ZJTFRFUl9HUkFQSF9MT0dfQ09OU1RBTlRTX0hfCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIDQgYnl0ZXMgZm9yIG9iamVjdCB0eXBlIGFuZCA0IGJ5dGVzIGZvciBzaWduYWwgdHlwZSBmb2xsb3dpbmcgbXA0LWxpa2UKLS8vIGJpbmFyeSBjb252ZW50aW9ucyBvZiBwYWNrZWQgVVRGLTggY2hhcmFjdGVycyBpbiBtYWNoaW5lLWVuZGlhbiBxdWFkcy4KLQotLy8gdGhpcyBmaWxlIGlzIGFsc28gcGFyc2VkIGJ5IHRoZSBweXRob24tYmFzZWQgbG9nIHByZXR0eS1wcmludGVyIHRvb2wuCi0vLyB0byBzdXBwb3J0IGVhc3kgcHl0aG9uIHBhcnNpbmcsIGFsbCB2YWx1ZXMgc2hvdWxkIGJlIGluIGhleCwgYW5kIGFsbAotLy8gbmFtZXMgc2hvdWxkIGJlIHByZWZpeGVkIHdpdGggb25lIG9mIE9iamVjdElkLEV2ZW50LG9yIFN0YXRlLgotCi1zdGF0aWMgY29uc3QgdWludDMyIGtPYmplY3RJZEJ1ZmZlckZhY3RvcnkgPSAweDYyNzU2NjcyOyAgICAgICAvLyAnYnVmcicKLXN0YXRpYyBjb25zdCB1aW50MzIga09iamVjdElkRGVtdXhlciA9IDB4NjQ2ZDc1Nzg7ICAgICAgICAgICAgIC8vICdkbXV4Jwotc3RhdGljIGNvbnN0IHVpbnQzMiBrT2JqZWN0SWRBdWRpb0RlbXV4ZXJTdHJlYW0gPSAweDc1NjE3MzY0OyAgLy8gJ2RzYXUnCi1zdGF0aWMgY29uc3QgdWludDMyIGtPYmplY3RJZFZpZGVvRGVtdXhlclN0cmVhbSA9IDB4Njk3NjczNjQ7ICAvLyAnZHN2aScKLXN0YXRpYyBjb25zdCB1aW50MzIga09iamVjdElkQXVkaW9EZWNvZGVyID0gMHg2MTY0NjU2MzsgICAgICAgIC8vICdhZGVjJwotc3RhdGljIGNvbnN0IHVpbnQzMiBrT2JqZWN0SWRBdWRpb1JlbmRlcmVyID0gMHg2MTcyNmU2NDsgICAgICAgLy8gJ2FybmQnCi1zdGF0aWMgY29uc3QgdWludDMyIGtPYmplY3RJZEF1ZGlvU2luayA9IDB4NmI2ZTY5NzM7ICAgICAgICAgICAvLyAnc2luaycKLXN0YXRpYyBjb25zdCB1aW50MzIga09iamVjdElkVmlkZW9EZWNvZGVyID0gMHg3NjY0NjU2MzsgICAgICAgIC8vICd2ZGVjJwotc3RhdGljIGNvbnN0IHVpbnQzMiBrT2JqZWN0SWRWaWRlb1JlbmRlcmVyID0gMHg3NjcyNmU2NDsgICAgICAgLy8gJ3ZybmQnCi1zdGF0aWMgY29uc3QgdWludDMyIGtPYmplY3RJZEdyYXBoaWNzID0gMHg2NzcyNjE2NjsgICAgICAgICAgICAvLyAnZ3JhZicKLQotc3RhdGljIGNvbnN0IHVpbnQzMiBrRXZlbnRBcnJheUFsbG9jYXRpb25FcnJvciA9IDB4NjE3OTY1NzI7ICAgICAgLy8gJ2F5ZXInCi1zdGF0aWMgY29uc3QgdWludDMyIGtFdmVudEFycmF5QWxsb2NhdGlvbkRlZmVycmVkID0gMHg2MTc5Nzc3NDsgICAvLyAnYXl3dCcKLXN0YXRpYyBjb25zdCB1aW50MzIga0V2ZW50QXJyYXlBbGxvY2F0aW9uUmVjbGFpbSA9IDB4NjE3OTcyNjM7ICAgIC8vICdheXJjJwotc3RhdGljIGNvbnN0IHVpbnQzMiBrRXZlbnRBcnJheUFsbG9jYXRpb25SZXF1ZXN0ID0gMHg2MTc5NzI3MDsgICAgLy8gJ2F5cnEnCi1zdGF0aWMgY29uc3QgdWludDMyIGtFdmVudEFycmF5QWxsb2NhdGlvblN1Y2Nlc3MgPSAweDYxNzk2ZjZiOyAgICAvLyAnYXlvaycKLXN0YXRpYyBjb25zdCB1aW50MzIga0V2ZW50QXVkaW9DbG9jayA9IDB4NjE2MzZjNmI7ICAgICAgICAgICAgICAgIC8vICdhY2xrJwotc3RhdGljIGNvbnN0IHVpbnQzMiBrRXZlbnRCdWZmZXJBbGxvY2F0aW9uRXJyb3IgPSAweDYyNjY2NTcyOyAgICAgLy8gJ2JmZXInCi1zdGF0aWMgY29uc3QgdWludDMyIGtFdmVudEJ1ZmZlckFsbG9jYXRpb25EZWZlcnJlZCA9IDB4NjI2Njc3NzQ7ICAvLyAnYmZ3dCcKLXN0YXRpYyBjb25zdCB1aW50MzIga0V2ZW50QnVmZmVyQWxsb2NhdGlvblJlY2xhaW0gPSAweDYyNjY3MjYzOyAgIC8vICdiZnJjJwotc3RhdGljIGNvbnN0IHVpbnQzMiBrRXZlbnRCdWZmZXJBbGxvY2F0aW9uUmVxdWVzdCA9IDB4NjI2NjcyNzA7ICAgLy8gJ2JmcnEnCi1zdGF0aWMgY29uc3QgdWludDMyIGtFdmVudEJ1ZmZlckFsbG9jYXRpb25TdWNjZXNzID0gMHg2MjY2NmY2YjsgICAvLyAnYmZvaycKLXN0YXRpYyBjb25zdCB1aW50MzIga0V2ZW50Q29uc3RydWN0b3IgPSAweDYzNzQ2ZjcyOyAgICAgICAgICAgICAgIC8vICdjdG9yJwotc3RhdGljIGNvbnN0IHVpbnQzMiBrRXZlbnREYXRhRGVjb2RlZCA9IDB4NjQ2MTc0NjE7ICAgICAgICAgICAgICAgLy8gJ2RhdGEnCi1zdGF0aWMgY29uc3QgdWludDMyIGtFdmVudERlY29kZSA9IDB4NjQ2MzZmNjQ7ICAgICAgICAgICAgICAgICAgICAvLyAnZGNvZCcKLXN0YXRpYyBjb25zdCB1aW50MzIga0V2ZW50RG93bmxvYWRBdWRpbyA9IDB4NmM2NDYxNzU7ICAgICAgICAgICAgIC8vICdsZGF1Jwotc3RhdGljIGNvbnN0IHVpbnQzMiBrRXZlbnREb3dubG9hZFZpZGVvID0gMHg2YzY0NzY2NDsgICAgICAgICAgICAgLy8gJ2xkdmQKLXN0YXRpYyBjb25zdCB1aW50MzIga0V2ZW50RHJvcEZyYW1lID0gMHg2NDcyNmY3MDsgICAgICAgICAgICAgICAgIC8vICdkcm9wJwotc3RhdGljIGNvbnN0IHVpbnQzMiBrRXZlbnRFbmRPZlN0cmVhbVJlY2VpdmVkID0gMHg2NTZmNzM3MjsgICAgICAgLy8gJ2Vvc3InCi1zdGF0aWMgY29uc3QgdWludDMyIGtFdmVudEVuZE9mU3RyZWFtU2VudCA9IDB4NjU2ZjczNzM7ICAgICAgICAgICAvLyAnZW9zcycKLXN0YXRpYyBjb25zdCB1aW50MzIga0V2ZW50RW5xdWV1ZSA9IDB4NmU3MTc1NjU7ICAgICAgICAgICAgICAgICAgIC8vICducXVlJwotc3RhdGljIGNvbnN0IHVpbnQzMiBrRXZlbnRGYXRhbEVycm9yID0gMHg2NTcyNmY3MjsgICAgICAgICAgICAgICAgLy8gJ2Vyb3InCi1zdGF0aWMgY29uc3QgdWludDMyIGtFdmVudEZsdXNoID0gMHg2NjZjNzM2ODsgICAgICAgICAgICAgICAgICAgICAvLyAnZmxzaCcKLXN0YXRpYyBjb25zdCB1aW50MzIga0V2ZW50RnJhbWVDb21wb3NpdGUgPSAweDY0NzI2MTc3OyAgICAgICAgICAgIC8vICdkcmF3Jwotc3RhdGljIGNvbnN0IHVpbnQzMiBrRXZlbnRGcmFtZUZsaXAgPSAweDY2NmM2OTcwOyAgICAgICAgICAgICAgICAgLy8gJ2ZsaXAnCi1zdGF0aWMgY29uc3QgdWludDMyIGtFdmVudEZyZWVJbnB1dEJ1ZmZlciA9IDB4NjY3MjY5NmU7ICAgICAgICAgICAvLyAnZnJpbicKLXN0YXRpYyBjb25zdCB1aW50MzIga0V2ZW50RnJlZU91dHB1dEJ1ZmZlciA9IDB4NjY3MjZmNzU7ICAgICAgICAgIC8vICdmcm91Jwotc3RhdGljIGNvbnN0IHVpbnQzMiBrRXZlbnRJbml0aWFsaXplID0gMHg2OTZlNjk3NDsgICAgICAgICAgICAgICAgLy8gJ2luaXQnCi1zdGF0aWMgY29uc3QgdWludDMyIGtFdmVudE91dHB1dEJ1ZmZlckZ1bGwgPSAweDY2NzU2YzZjOyAgICAgICAgICAvLyAnZnVsbCcKLXN0YXRpYyBjb25zdCB1aW50MzIga0V2ZW50UGF1c2UgPSAweDcwNjE3NTczOyAgICAgICAgICAgICAgICAgICAgIC8vICdwYXVzJwotc3RhdGljIGNvbnN0IHVpbnQzMiBrRXZlbnRQbGF5ID0gMHg3MDZjNjE3OTsgICAgICAgICAgICAgICAgICAgICAgLy8gJ3BsYXknCi1zdGF0aWMgY29uc3QgdWludDMyIGtFdmVudFBvcCA9IDB4NzA2ZjcwMjA7ICAgICAgICAgICAgICAgICAgICAgICAvLyAncG9wICcKLXN0YXRpYyBjb25zdCB1aW50MzIga0V2ZW50UHJlcm9sbCA9IDB4NzA3MjZmNmM7ICAgICAgICAgICAgICAgICAgIC8vICdwcm9sJwotc3RhdGljIGNvbnN0IHVpbnQzMiBrRXZlbnRQdXNoID0gMHg3MDc1NzM2ODsgICAgICAgICAgICAgICAgICAgICAgLy8gJ3B1c2gnCi1zdGF0aWMgY29uc3QgdWludDMyIGtFdmVudFJlYWQgPSAweDcyNjU2MTY0OyAgICAgICAgICAgICAgICAgICAgICAvLyAncmVhZCcKLXN0YXRpYyBjb25zdCB1aW50MzIga0V2ZW50UmVuZGVyID0gMHg3MjZlNjQ3MjsgICAgICAgICAgICAgICAgICAgIC8vICdybmRyJwotc3RhdGljIGNvbnN0IHVpbnQzMiBrRXZlbnRSZXF1ZXN0QXVkaW8gPSAweDcyNjU3MTYxOyAgICAgICAgICAgICAgLy8gJ3JlcWEnCi1zdGF0aWMgY29uc3QgdWludDMyIGtFdmVudFJlcXVlc3RJbnRlcnJ1cHQgPSAweDY5NzI2NTcwOyAgICAgICAgICAvLyAnaXJlcScKLXN0YXRpYyBjb25zdCB1aW50MzIga0V2ZW50UmVxdWVzdFZpZGVvID0gMHg3MjY1NzE3NjsgICAgICAgICAgICAgIC8vICdyZXF2Jwotc3RhdGljIGNvbnN0IHVpbnQzMiBrRXZlbnRSZXNldCA9IDB4NzI3MzY1NzQ7ICAgICAgICAgICAgICAgICAgICAgLy8gJ3JzZXQnCi1zdGF0aWMgY29uc3QgdWludDMyIGtFdmVudFJlc3VtZSA9IDB4NzI3Mzc1NmQ7ICAgICAgICAgICAgICAgICAgICAvLyAncnN1bScKLXN0YXRpYyBjb25zdCB1aW50MzIga0V2ZW50U2VlayA9IDB4NzM2NTY1NmI7ICAgICAgICAgICAgICAgICAgICAgIC8vICdzZWVrJwotc3RhdGljIGNvbnN0IHVpbnQzMiBrRXZlbnRTdGFydCA9IDB4NzM3NDcyNzQ7ICAgICAgICAgICAgICAgICAgICAgLy8gJ3N0cnQnCi1zdGF0aWMgY29uc3QgdWludDMyIGtFdmVudFN0b3AgPSAweDczNzQ2ZjcwOyAgICAgICAgICAgICAgICAgICAgICAvLyAnc3RvcCcKLXN0YXRpYyBjb25zdCB1aW50MzIga0V2ZW50VGltZUNhbGxiYWNrID0gMHg3NDY5NmQ2NTsgICAgICAgICAgICAgIC8vICd0aW1lJwotc3RhdGljIGNvbnN0IHVpbnQzMiBrRXZlbnRVbmRlcmZsb3cgPSAweDc1NjY2Yzc3OyAgICAgICAgICAgICAgICAgLy8gJ3VmbHcnCi1zdGF0aWMgY29uc3QgdWludDMyIGtFdmVudFZpZXdIb3N0Q29tcG9zaXRlID0gMHg3NjY4NjM2NTsgICAgICAgICAvLyAndmhjZScKLXN0YXRpYyBjb25zdCB1aW50MzIga0V2ZW50V2ViS2l0Q29tcG9zaXRlID0gMHg3NzZiNjM2NTsgICAgICAgICAgIC8vICd3a2NlJwotCi0vLyBpbnN0ZWFkIG9mIHRpbWVzdGFtcCB0aGUgZm9sbG93aW5nIHN0YXRlIGZsYWdzIGxvZyBpbmRpdmlkdWFsIHBpcGVsaW5lCi0vLyBzdGF0ZSBpbmZvcm1hdGlvbi4KLS8vIHR3byB1aW50MzJzIG9mIGJ1ZmZlciBxdWV1ZSBzaXplIGFuZCByZWFkIGNiIHF1ZXVlIHNpemUKLXN0YXRpYyBjb25zdCB1aW50MzIga1N0YXRlRGVtdXhlclN0cmVhbVF1ZXVlcyA9IDB4NzM2NTc1NzE7ICAvLyAncXVlcycKLS8vIG9uZSB1aW50MzIgZWl0aGVyIHplcm8gb3Igb25lIGRlcGVuZGluZyBvbiBzdGF0ZSwgYW5kIGEgemVybwotc3RhdGljIGNvbnN0IHVpbnQzMiBrU3RhdGVEZW11eGVyU3RyZWFtQnVmZmVyaW5nID0gMHg2NjY2NzU2MjsgIC8vICdidWZmJwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX1NIRUxMX0ZJTFRFUl9HUkFQSF9MT0dfQ09OU1RBTlRTX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9zaGVsbF9tZWRpYV9wbGF0Zm9ybS5jYyBiL3NyYy9tZWRpYS9iYXNlL3NoZWxsX21lZGlhX3BsYXRmb3JtLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDMzMjg3Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3NoZWxsX21lZGlhX3BsYXRmb3JtLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2hlbGxfbWVkaWFfcGxhdGZvcm0uaCIKLQotbmFtZXNwYWNlIHsKLQotbWVkaWE6OlNoZWxsTWVkaWFQbGF0Zm9ybSogc19zaGVsbF9tZWRpYV9wbGF0Zm9ybV87Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBzdGF0aWMKLVNoZWxsTWVkaWFQbGF0Zm9ybSogU2hlbGxNZWRpYVBsYXRmb3JtOjpJbnN0YW5jZSgpIHsKLSAgcmV0dXJuIHNfc2hlbGxfbWVkaWFfcGxhdGZvcm1fOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgU2hlbGxNZWRpYVBsYXRmb3JtOjpTZXRJbnN0YW5jZShTaGVsbE1lZGlhUGxhdGZvcm0qIHNoZWxsX21lZGlhX3BsYXRmb3JtKSB7Ci0gIHNfc2hlbGxfbWVkaWFfcGxhdGZvcm1fID0gc2hlbGxfbWVkaWFfcGxhdGZvcm07Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2Uvc2hlbGxfbWVkaWFfcGxhdGZvcm0uaCBiL3NyYy9tZWRpYS9iYXNlL3NoZWxsX21lZGlhX3BsYXRmb3JtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZjJkNzkuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2Uvc2hlbGxfbWVkaWFfcGxhdGZvcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX0JBU0VfU0hFTExfTUVESUFfUExBVEZPUk1fSF8KLSNkZWZpbmUgTUVESUFfQkFTRV9TSEVMTF9NRURJQV9QTEFURk9STV9IXwotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9saW1pdHMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2hlbGxfYnVmZmVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3NoZWxsX3ZpZGVvX2RhdGFfYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaGVsbF92aWRlb19mcmFtZV9wcm92aWRlci5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9kZWNvZGVfdGFyZ2V0LmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIHJlbmRlcl90cmVlIHsKLWNsYXNzIFJlc291cmNlUHJvdmlkZXI7Ci19ICAvLyBuYW1lc3BhY2UgcmVuZGVyX3RyZWUKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gVGhpcyBjbGFzcyBpcyBtZWFudCB0byBiZSB0aGUgc2luZ2xlIHBvaW50IHRvIGF0dGFjaCBwbGF0Zm9ybSBzcGVjaWZpYyBtZWRpYQotLy8gY2xhc3NlcyBhbmQgc2V0dGluZ3MuIEVhY2ggcGxhdGZvcm0gc2hvdWxkIGltcGxlbWVudCBpdHMgb3duIGltcGxlbWVudGF0aW9uCi0vLyBhbmQgcHJvdmlkZSBpdCB0aHJvdWdoIFNoZWxsTWVkaWFQbGF0Zm9ybTo6SW5zdGFuY2UuCi1jbGFzcyBNRURJQV9FWFBPUlQgU2hlbGxNZWRpYVBsYXRmb3JtIHsKLSBwdWJsaWM6Ci0gIFNoZWxsTWVkaWFQbGF0Zm9ybSgpIHt9Ci0gIHZpcnR1YWwgflNoZWxsTWVkaWFQbGF0Zm9ybSgpIHt9Ci0KLSAgLy8gSW5kaXZpZHVhbCBwbGF0Zm9ybXMgc2hvdWxkIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgdG8KLSAgLy8gZW5zdXJlIHRoYXQgYSB2YWxpZCBTaGVsbE1lZGlhUGxhdGZvcm0gaW5zdGFuY2UgaXMgYXZhaWxhYmxlIGR1cmluZyB0aGUKLSAgLy8gbGlmZSB0aW1lIG9mIG1lZGlhIHN0YWNrCi0gIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsKLSAgc3RhdGljIHZvaWQgVGVybWluYXRlKCk7Ci0KLSAgc3RhdGljIFNoZWxsTWVkaWFQbGF0Zm9ybSogSW5zdGFuY2UoKTsKLQotICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBlbnRlcnMgb3IKLSAgLy8gbGVhdmVzIHN1c3BlbmRpbmcgc3RhdHVzLgotICB2aXJ0dWFsIHZvaWQgU3VzcGVuZCgpIHt9Ci0gIHZpcnR1YWwgdm9pZCBSZXN1bWUoCi0gICAgICBjb2JhbHQ6OnJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyKiAvKnJlc291cmNlX3Byb3ZpZGVyKi8pIHt9Ci0KLSAgLy8gTWVkaWEgc3RhY2sgYnVmZmVyIGFsbG9jYXRlL2ZyZWUgZnVuY3Rpb25zIGN1cnJlbnRseSBvbmx5IHVzZWQgYnkKLSAgLy8gU2hlbGxCdWZmZXJGYWN0b3J5LgotICB2aXJ0dWFsIHZvaWQqIEFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBGcmVlQnVmZmVyKHZvaWQqIHB0cikgPSAwOwotCi0gIC8vIFRoZSBtYXhpbXVtIGF1ZGlvIGFuZCB2aWRlbyBidWZmZXIgc2l6ZSB1c2VkIGJ5IFNvdXJjZUJ1ZmZlclN0cmVhbS4KLSAgLy8gU2VlIGltcGxlbWVudGF0aW9uIG9mIFNvdXJjZUJ1ZmZlclN0cmVhbSBmb3IgbW9yZSBkZXRhaWxzLgotICB2aXJ0dWFsIHNpemVfdCBHZXRTb3VyY2VCdWZmZXJTdHJlYW1BdWRpb01lbW9yeUxpbWl0KCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIHNpemVfdCBHZXRTb3VyY2VCdWZmZXJTdHJlYW1WaWRlb01lbW9yeUxpbWl0KCkgY29uc3QgPSAwOwotCi0gIHZpcnR1YWwgc2NvcGVkX3JlZnB0cjxTaGVsbFZpZGVvRnJhbWVQcm92aWRlcj4gR2V0VmlkZW9GcmFtZVByb3ZpZGVyKCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0Ci0gIHZpcnR1YWwgU2JEZWNvZGVUYXJnZXRHcmFwaGljc0NvbnRleHRQcm92aWRlcioKLSAgR2V0U2JEZWNvZGVUYXJnZXRHcmFwaGljc0NvbnRleHRQcm92aWRlcigpIHsgcmV0dXJuIE5VTEw7IH0KLSNlbGlmIFNCX0FQSV9WRVJTSU9OID49IDMKLSAgdmlydHVhbCBTYkRlY29kZVRhcmdldFByb3ZpZGVyKiBHZXRTYkRlY29kZVRhcmdldFByb3ZpZGVyKCkgeyByZXR1cm4gTlVMTDsgfQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0Ci0KLSAgLy8gVG90YWwgbnVtYmVyIG9mIHZpZGVvIGZyYW1lcyB3aGljaCBhcmUgcG9wdWxhdGluZyBpbiB0aGUgcGlwZWxpbmUgd2hlbgotICAvLyBwcmVyb2xsaW5nLgotICAvLyBZb3UgY2FuIGV4cGVjdCBtb3JlIHN0YXJ0IGRlbGF5IGJ5IGluY3JlYXNpbmcgdGhpcy4KLSAgdmlydHVhbCBpbnQgR2V0TWF4VmlkZW9QcmVyb2xsRnJhbWVzKCkgY29uc3QgewotICAgIHJldHVybiBsaW1pdHM6OmtNYXhWaWRlb0ZyYW1lczsKLSAgfQotICAvLyBXaGVuIHRoZSB2aWRlbyBmcmFtZSBiYWNrbG9nIGNvbnRhaW5zIGxlc3MgZnJhbWVzIHRoYW4gdGhpcyB2YWx1ZSwgdGhlCi0gIC8vIHZpZGVvIHJlbmRlcmVyIHdpbGwgc2VuZCBvdXQgdW5kZXJmbG93IG5vdGlmaWNhdGlvbiB0byB0aGUgdmlkZW8gZGVjb2Rlci4KLSAgdmlydHVhbCBpbnQgR2V0VmlkZW9VbmRlcmZsb3dGcmFtZXMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEdldE1heFZpZGVvUHJlcm9sbEZyYW1lcygpOwotICB9Ci0gIC8vIFRvdGFsIG51bWJlciBvZiB2aWRlbyBmcmFtZXMgd2hpY2ggYXJlIHBvcHVsYXRpbmcgaW4gdGhlIHBpcGVsaW5lLgotICAvLyBZb3UgY2FuIGV4cGVjdCBtb3JlIG1lbW9yeSB1c2FnZSBhbmQgbGVzcyBqaXR0ZXIgYnkgaW5jcmVhc2luZyB0aGlzLgotICB2aXJ0dWFsIGludCBHZXRNYXhWaWRlb0ZyYW1lcygpIGNvbnN0IHsgcmV0dXJuIGxpbWl0czo6a01heFZpZGVvRnJhbWVzOyB9Ci0KLSAgLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIHRoZSBkZWNvZGVyIGJ1ZmZlciBsZWF2ZXMgdGhlIGRlbXV4ZXIgYW5kCi0gIC8vIGlzIGJlaW5nIHNlbnQgdG8gdGhlIG1lZGlhIHBpcGVsaW5lIGZvciBkZWNyeXB0aW5nIGFuZCBkZWNvZGluZy4gVGhlCi0gIC8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGx5IHJldHVybnMgdGhlIGJ1ZmZlciBpbmRpY2F0ZWluZyB0aGF0IHRoZXJlIGlzCi0gIC8vIG5vIHByb2Nlc3NpbmcgbmVjZXNzYXJ5LgotICB2aXJ0dWFsIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gUHJvY2Vzc0JlZm9yZUxlYXZpbmdEZW11eGVyKAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgYnVmZmVyKSB7Ci0gICAgcmV0dXJuIGJ1ZmZlcjsKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiBvdXRwdXQgaXMgcHJvdGVjdGVkIChpLmUuIEhEQ1AgaXMgcHJlc2VudCkuCi0gIHZpcnR1YWwgYm9vbCBJc091dHB1dFByb3RlY3RlZCgpID0gMDsKLQotIHByb3RlY3RlZDoKLSAgc3RhdGljIHZvaWQgU2V0SW5zdGFuY2UoU2hlbGxNZWRpYVBsYXRmb3JtKiBzaGVsbF9tZWRpYV9wbGF0Zm9ybSk7Ci0KLSBwcml2YXRlOgotICAvLyBQbGF0Zm9ybSBzcGVjaWZpYyBtZWRpYSBJbml0IGFuZCBUZWFyIGRvd24uCi0gIHZpcnR1YWwgdm9pZCBJbnRlcm5hbEluaXRpYWxpemUoKSB7fQotICB2aXJ0dWFsIHZvaWQgSW50ZXJuYWxUZXJtaW5hdGUoKSB7fQotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTaGVsbE1lZGlhUGxhdGZvcm0pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNkZWZpbmUgUkVHSVNURVJfU0hFTExfTUVESUFfUExBVEZPUk0oQ2xhc3NOYW1lKSBcCi0gIG5hbWVzcGFjZSBtZWRpYSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkIFNoZWxsTWVkaWFQbGF0Zm9ybTo6SW5pdGlhbGl6ZSgpIHsgICAgICAgIFwKLSAgICBEQ0hFQ0soIUluc3RhbmNlKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgU2V0SW5zdGFuY2UobmV3IENsYXNzTmFtZSk7ICAgICAgICAgICAgICAgICAgXAotICAgIFNoZWxsQnVmZmVyRmFjdG9yeTo6SW5pdGlhbGl6ZSgpOyAgICAgICAgICAgIFwKLSAgICBJbnN0YW5jZSgpLT5JbnRlcm5hbEluaXRpYWxpemUoKTsgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkIFNoZWxsTWVkaWFQbGF0Zm9ybTo6VGVybWluYXRlKCkgeyAgICAgICAgIFwKLSAgICBEQ0hFQ0soSW5zdGFuY2UoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgSW5zdGFuY2UoKS0+SW50ZXJuYWxUZXJtaW5hdGUoKTsgICAgICAgICAgICAgXAotICAgIFNoZWxsQnVmZmVyRmFjdG9yeTo6VGVybWluYXRlKCk7ICAgICAgICAgICAgIFwKLSAgICBkZWxldGUgSW5zdGFuY2UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgU2V0SW5zdGFuY2UoTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQkFTRV9TSEVMTF9NRURJQV9QTEFURk9STV9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2Uvc2hlbGxfbWVkaWFfc3RhdGlzdGljcy5jYyBiL3NyYy9tZWRpYS9iYXNlL3NoZWxsX21lZGlhX3N0YXRpc3RpY3MuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZjZiODIuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2Uvc2hlbGxfbWVkaWFfc3RhdGlzdGljcy5jYworKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaGVsbF9tZWRpYV9zdGF0aXN0aWNzLmgiCi0KLSNpbmNsdWRlIDxsaW1pdHM+Ci0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotU2hlbGxNZWRpYVN0YXRpc3RpY3M6OlNoZWxsTWVkaWFTdGF0aXN0aWNzKCkgewotICBSZXNldCh0cnVlKTsgIC8vIHJlc2V0IGFsbCBzdGF0cywgaW5jbHVkZSBnbG9iYWwgc3RhdHMuCi19Ci0KLXZvaWQgU2hlbGxNZWRpYVN0YXRpc3RpY3M6Ok9uUGxheWJhY2tCZWdpbigpIHsKLSAgUmVzZXQoZmFsc2UpOyAgLy8gcmVzZXQgbm9uLWdsb2JhbCBzdGF0cy4KLX0KLQotdm9pZCBTaGVsbE1lZGlhU3RhdGlzdGljczo6cmVjb3JkKFN0YXRUeXBlIHR5cGUsIGludDY0IHZhbHVlKSB7Ci0gIGlmICh0eXBlID09IFNUQVRfVFlQRV9WSURFT19XSURUSCkKLSAgICB0eXBlID0gU1RBVF9UWVBFX1ZJREVPX1dJRFRIOwotICArK3N0YXRzX1t0eXBlXS50aW1lc187Ci0gIHN0YXRzX1t0eXBlXS50b3RhbF8gKz0gdmFsdWU7Ci0gIGlmICh2YWx1ZSA+IHN0YXRzX1t0eXBlXS5tYXhfKQotICAgIHN0YXRzX1t0eXBlXS5tYXhfID0gdmFsdWU7Ci0gIGlmICh2YWx1ZSA8IHN0YXRzX1t0eXBlXS5taW5fKQotICAgIHN0YXRzX1t0eXBlXS5taW5fID0gdmFsdWU7Ci0gIHN0YXRzX1t0eXBlXS5jdXJyZW50XyA9IHZhbHVlOwotfQotCi12b2lkIFNoZWxsTWVkaWFTdGF0aXN0aWNzOjpyZWNvcmQoU3RhdFR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpUaW1lRGVsdGEmIGR1cmF0aW9uKSB7Ci0gIHJlY29yZCh0eXBlLCBkdXJhdGlvbi5Ub0ludGVybmFsVmFsdWUoKSk7Ci19Ci0KLWRvdWJsZSBTaGVsbE1lZGlhU3RhdGlzdGljczo6R2V0RWxhcHNlZFRpbWUoKSBjb25zdCB7Ci0gIHJldHVybiAoYmFzZTo6VGltZTo6Tm93KCkgLSBzdGFydF8pLkluU2Vjb25kc0YoKTsKLX0KLQotaW50NjQgU2hlbGxNZWRpYVN0YXRpc3RpY3M6OkdldFRpbWVzKFN0YXRUeXBlIHR5cGUpIGNvbnN0IHsKLSAgcmV0dXJuIHN0YXRzX1t0eXBlXS50aW1lc187Ci19Ci0KLWludDY0IFNoZWxsTWVkaWFTdGF0aXN0aWNzOjpHZXRUb3RhbChTdGF0VHlwZSB0eXBlKSBjb25zdCB7Ci0gIHJldHVybiBzdGF0c19bdHlwZV0udG90YWxfOwotfQotCi1pbnQ2NCBTaGVsbE1lZGlhU3RhdGlzdGljczo6R2V0Q3VycmVudChTdGF0VHlwZSB0eXBlKSBjb25zdCB7Ci0gIHJldHVybiBzdGF0c19bdHlwZV0uY3VycmVudF87Ci19Ci0KLWludDY0IFNoZWxsTWVkaWFTdGF0aXN0aWNzOjpHZXRBdmVyYWdlKFN0YXRUeXBlIHR5cGUpIGNvbnN0IHsKLSAgaWYgKHN0YXRzX1t0eXBlXS50aW1lc18gPT0gMCkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIHN0YXRzX1t0eXBlXS50b3RhbF8gLyBzdGF0c19bdHlwZV0udGltZXNfOwotfQotCi1pbnQ2NCBTaGVsbE1lZGlhU3RhdGlzdGljczo6R2V0TWluKFN0YXRUeXBlIHR5cGUpIGNvbnN0IHsKLSAgcmV0dXJuIHN0YXRzX1t0eXBlXS5taW5fOwotfQotCi1pbnQ2NCBTaGVsbE1lZGlhU3RhdGlzdGljczo6R2V0TWF4KFN0YXRUeXBlIHR5cGUpIGNvbnN0IHsKLSAgcmV0dXJuIHN0YXRzX1t0eXBlXS5tYXhfOwotfQotCi1kb3VibGUgU2hlbGxNZWRpYVN0YXRpc3RpY3M6OkdldFRvdGFsRHVyYXRpb24oU3RhdFR5cGUgdHlwZSkgY29uc3QgewotICByZXR1cm4gYmFzZTo6VGltZURlbHRhOjpGcm9tSW50ZXJuYWxWYWx1ZShHZXRUb3RhbCh0eXBlKSkuSW5TZWNvbmRzRigpOwotfQotCi1kb3VibGUgU2hlbGxNZWRpYVN0YXRpc3RpY3M6OkdldEN1cnJlbnREdXJhdGlvbihTdGF0VHlwZSB0eXBlKSBjb25zdCB7Ci0gIHJldHVybiBiYXNlOjpUaW1lRGVsdGE6OkZyb21JbnRlcm5hbFZhbHVlKEdldEN1cnJlbnQodHlwZSkpLkluU2Vjb25kc0YoKTsKLX0KLQotZG91YmxlIFNoZWxsTWVkaWFTdGF0aXN0aWNzOjpHZXRBdmVyYWdlRHVyYXRpb24oU3RhdFR5cGUgdHlwZSkgY29uc3QgewotICByZXR1cm4gYmFzZTo6VGltZURlbHRhOjpGcm9tSW50ZXJuYWxWYWx1ZShHZXRBdmVyYWdlKHR5cGUpKS5JblNlY29uZHNGKCk7Ci19Ci0KLWRvdWJsZSBTaGVsbE1lZGlhU3RhdGlzdGljczo6R2V0TWluRHVyYXRpb24oU3RhdFR5cGUgdHlwZSkgY29uc3QgewotICByZXR1cm4gYmFzZTo6VGltZURlbHRhOjpGcm9tSW50ZXJuYWxWYWx1ZShHZXRNaW4odHlwZSkpLkluU2Vjb25kc0YoKTsKLX0KLQotZG91YmxlIFNoZWxsTWVkaWFTdGF0aXN0aWNzOjpHZXRNYXhEdXJhdGlvbihTdGF0VHlwZSB0eXBlKSBjb25zdCB7Ci0gIHJldHVybiBiYXNlOjpUaW1lRGVsdGE6OkZyb21JbnRlcm5hbFZhbHVlKEdldE1heCh0eXBlKSkuSW5TZWNvbmRzRigpOwotfQotCi0vLyBzdGF0aWMKLVNoZWxsTWVkaWFTdGF0aXN0aWNzJiBTaGVsbE1lZGlhU3RhdGlzdGljczo6SW5zdGFuY2UoKSB7Ci0gIHN0YXRpYyBTaGVsbE1lZGlhU3RhdGlzdGljcyBtZWRpYV9zdGF0aXN0aWNzOwotICByZXR1cm4gbWVkaWFfc3RhdGlzdGljczsKLX0KLQotdm9pZCBTaGVsbE1lZGlhU3RhdGlzdGljczo6UmVzZXQoYm9vbCBpbmNsdWRlX2dsb2JhbF9zdGF0cykgewotICBzdGFydF8gPSBiYXNlOjpUaW1lOjpOb3coKTsKLSAgaW50IGl0ZW1zX3RvX3Jlc2V0ID0KLSAgICAgIGluY2x1ZGVfZ2xvYmFsX3N0YXRzID8gYXJyYXlzaXplKHN0YXRzXykgOiBTVEFUX1RZUEVfU1RBUlRfT0ZfR0xPQkFMX1NUQVQ7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXNfdG9fcmVzZXQ7ICsraSkgewotICAgIC8vIFdlIGRlbGliZXJhdGVseSBub3QgcmVzZXQgY3VycmVudF8gc28gaXRzIHZhbHVlIGNhbiBiZSBrZXB0IGFmdGVyIHJlc2V0LgotICAgIHN0YXRzX1tpXS50aW1lc18gPSAwOwotICAgIHN0YXRzX1tpXS50b3RhbF8gPSAwOwotICAgIHN0YXRzX1tpXS5taW5fID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2ND46Om1heCgpOwotICAgIHN0YXRzX1tpXS5tYXhfID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2ND46Om1pbigpOwotICB9Ci19Ci0KLVNoZWxsU2NvcGVkTWVkaWFTdGF0OjpTaGVsbFNjb3BlZE1lZGlhU3RhdChTaGVsbE1lZGlhU3RhdGlzdGljczo6U3RhdFR5cGUgdHlwZSkKLSAgICA6IHR5cGVfKHR5cGUpLCBzdGFydF8oYmFzZTo6VGltZTo6Tm93KCkpIHt9Ci0KLVNoZWxsU2NvcGVkTWVkaWFTdGF0Ojp+U2hlbGxTY29wZWRNZWRpYVN0YXQoKSB7Ci0gIFNoZWxsTWVkaWFTdGF0aXN0aWNzOjpJbnN0YW5jZSgpLnJlY29yZCh0eXBlXywgYmFzZTo6VGltZTo6Tm93KCkgLSBzdGFydF8pOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3NoZWxsX21lZGlhX3N0YXRpc3RpY3MuaCBiL3NyYy9tZWRpYS9iYXNlL3NoZWxsX21lZGlhX3N0YXRpc3RpY3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ0YTc5NC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9zaGVsbF9tZWRpYV9zdGF0aXN0aWNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9CQVNFX1NIRUxMX01FRElBX1NUQVRJU1RJQ1NfSF8KLSNkZWZpbmUgTUVESUFfQkFTRV9TSEVMTF9NRURJQV9TVEFUSVNUSUNTX0hfCi0KLSNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi9sb2NrLmgiCi0jaW5jbHVkZSAiYmFzZS90aW1lLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIFRoaXMgY2xhc3MgY29sbGVjdHMgZXZlbnRzIGFuZCB0aGVpciBkdXJhdGlvbnMgaW4gdGhlIG1lZGlhIHN0YWNrLgotLy8gTm90ZSB0aGF0IGl0IGlzIG5vdCB0aHJlYWQgc2FmZSBidXQgYXMgaXRzIHB1cnBvc2UgaXMganVzdCB0byBjb2xsZWN0Ci0vLyBwZXJmb3JtYW5jZSBkYXRhIGl0IGlzIG9rIHRvIGNhbGwgaXQgZnJvbSBkaWZmZXJlbnQgdGhyZWFkcy4KLWNsYXNzIFNoZWxsTWVkaWFTdGF0aXN0aWNzIHsKLSBwdWJsaWM6Ci0gIGVudW0gU3RhdFR5cGUgewotICAgIFNUQVRfVFlQRV9BVURJT19DT0RFQywKLSAgICBTVEFUX1RZUEVfQVVESU9fQ0hBTk5FTFMsCi0gICAgU1RBVF9UWVBFX0FVRElPX1NBTVBMRV9QRVJfU0VDT05ELAotICAgIFNUQVRfVFlQRV9BVURJT19VTkRFUkZMT1csCi0gICAgU1RBVF9UWVBFX1ZJREVPX0NPREVDLAotICAgIFNUQVRfVFlQRV9WSURFT19XSURUSCwKLSAgICBTVEFUX1RZUEVfVklERU9fSEVJR0hULAotICAgIC8vIERlY29kZSBhIHZpZGVvIGZyYW1lCi0gICAgU1RBVF9UWVBFX1ZJREVPX0ZSQU1FX0RFQ09ERSwKLSAgICAvLyBEcm9wIGEgdmlkZW8gZnJhbWUgdGhhdCB3ZSBkb24ndCBoYXZlIGVub3VnaCB0aW1lIHRvIHJlbmRlcgotICAgIFNUQVRfVFlQRV9WSURFT19GUkFNRV9EUk9QLAotICAgIC8vIFRoZSBmcmFtZSBhcnJpdmVzIHRvbyBsYXRlIHRvIHRoZSByZW5kZXJlciwgdXN1YWxseSBpbmRpY2F0ZXMgdGhhdCBpdAotICAgIC8vIHRha2VzIHRvbyBtYW55IHRpbWUgaW4gdGhlIGRlY29kZXIuCi0gICAgU1RBVF9UWVBFX1ZJREVPX0ZSQU1FX0xBVEUsCi0gICAgLy8gSG93IG1hbnkgZnJhbWVzIHdlIGNhY2hlZCBpbiB0aGUgdmlkZW8gcmVuZGVyZXIuIElmIHRoaXMgdmFsdWUgZHJvcHMgaXQKLSAgICAvLyBpcyBtb3JlIGxpa2VseSB0aGF0IHdlIHdpbGwgaGF2ZSBqaXR0ZXIuCi0gICAgU1RBVF9UWVBFX1ZJREVPX1JFTkRFUkVSX0JBQ0tMT0csCi0gICAgLy8gVGltZSBzcGVuZCBpbiBkZWNyeXB0aW5nIGEgYnVmZmVyCi0gICAgU1RBVF9UWVBFX0RFQ1JZUFQsCi0gICAgLy8gVGhlIHN0YXQgdHlwZXMgYWZ0ZXIgdGhlIGZvbGxvd2luZyBhcmUgZ2xvYmFsIHN0YXRzLiBpLmUuIHRoZWlyIHZhbHVlcwotICAgIC8vIHdpbGwgYmUgcHJlc2VydmVkIGJldHdlZW4gcGxheW5nIGJhY2sgb2YgZGlmZmVyZW50IHZpZGVvcy4KLSAgICBTVEFUX1RZUEVfU1RBUlRfT0ZfR0xPQkFMX1NUQVQsCi0gICAgLy8gVGhlIHNpemUgb2YgdGhlIHNoZWxsIGJ1ZmZlciBibG9jayBqdXN0IGFsbG9jYXRlZC4KLSAgICBTVEFUX1RZUEVfQUxMT0NBVEVEX1NIRUxMX0JVRkZFUl9TSVpFLAotICAgIFNUQVRfVFlQRV9NQVgKLSAgfTsKLQotICAvLyBUaGUgc3RydWN0dXJlIGlzIHVzZWQgdG8gdHJhY2sgYWxsIHN0YXRpc3RpY3MuIGludDY0IGlzIHVzZWQgaGVyZSBzbyB3ZQotICAvLyBjYW4gdHJhY2sgYSBUaW1lRGVsdGEuIE5vdGUgdGhhdCBzb21lIG9mIHRoZSBmaWVsZHMgbWF5IG5vdCBiZSBtZWFuaW5nZnVsCi0gIC8vIHRvIGFsbCBTdGF0IHR5cGVzLiBGb3IgZXhhbXBsZSwgYHRvdGFsYCBpcyBub3QgbWVhbmZ1bCB0byB2aWRlbyByZXNvbHV0aW9uCi0gIC8vIGFzIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIHN1bSBvZiB2aWRlbyByZXNvbHVsdGlvbiBvdmVyIHRpbWUuIEJ1dCBmb3IKLSAgLy8gc2ltcGxpY2l0eSB3ZSBqdXN0IGtlZXAgYWxsIHRoZSBpbmZvcm1hdGlvbiBhbmQgaXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5Ci0gIC8vIG9mIHRoZSB1c2VyIG9mIHRoaXMgY2xhc3MgdG8gdXNlIHRoZSBpbmRpdmlkdWFsIHN0YXRpc3RpY3MgY29ycmVjdGx5LgotICBzdHJ1Y3QgU3RhdCB7Ci0gICAgaW50NjQgdGltZXNfOyAgLy8gSG93IG1hbnkgdGltZXMgdGhlIHN0YXQgaGFzIGJlZW4gdXBkYXRlZC4KLSAgICBpbnQ2NCBjdXJyZW50XzsKLSAgICBpbnQ2NCB0b3RhbF87Ci0gICAgaW50NjQgbWluXzsKLSAgICBpbnQ2NCBtYXhfOwotICB9OwotCi0gIFNoZWxsTWVkaWFTdGF0aXN0aWNzKCk7Ci0KLSAgdm9pZCBPblBsYXliYWNrQmVnaW4oKTsKLSAgdm9pZCByZWNvcmQoU3RhdFR5cGUgdHlwZSwgaW50NjQgdmFsdWUpOwotICB2b2lkIHJlY29yZChTdGF0VHlwZSB0eXBlLCBjb25zdCBiYXNlOjpUaW1lRGVsdGEmIGR1cmF0aW9uKTsKLQotICAvLyBSZXR1cm5zIHRoZSB0aW1lIGVsYXBzZWQgc2luY2UgbGFzdCByZXNldCBpbiB0aGUgdW5pdCBvZiBzZWNvbmQuCi0gIGRvdWJsZSBHZXRFbGFwc2VkVGltZSgpIGNvbnN0OwotICBpbnQ2NCBHZXRUaW1lcyhTdGF0VHlwZSB0eXBlKSBjb25zdDsKLQotICBpbnQ2NCBHZXRUb3RhbChTdGF0VHlwZSB0eXBlKSBjb25zdDsKLSAgaW50NjQgR2V0Q3VycmVudChTdGF0VHlwZSB0eXBlKSBjb25zdDsKLSAgaW50NjQgR2V0QXZlcmFnZShTdGF0VHlwZSB0eXBlKSBjb25zdDsKLSAgaW50NjQgR2V0TWluKFN0YXRUeXBlIHR5cGUpIGNvbnN0OwotICBpbnQ2NCBHZXRNYXgoU3RhdFR5cGUgdHlwZSkgY29uc3Q7Ci0KLSAgLy8gVGhlIGZvbGxvd2luZyBhY2Nlc3MgZnVuY3Rpb25zIGFyZSBqdXN0IHByb3ZpZGVkIGZvciBlYXN5IG9mIHVzZS4gVGhleSBhcmUKLSAgLy8gbm90IGFwcGxpY2FibGUgdG8gYWxsIHN0YXRzLiBpdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHVzZXIgb2YgdGhlc2UKLSAgLy8gZnVuY3Rpb25zIHRvIGVuc3VyZSB0aGF0IHRoZSBjYWxsIGlzIHZhbGlkLgotICAvLyBUaGUgdW5pdCBvZiB0aW1lIGlzIHNlY29uZC4KLSAgZG91YmxlIEdldFRvdGFsRHVyYXRpb24oU3RhdFR5cGUgdHlwZSkgY29uc3Q7Ci0gIGRvdWJsZSBHZXRDdXJyZW50RHVyYXRpb24oU3RhdFR5cGUgdHlwZSkgY29uc3Q7Ci0gIGRvdWJsZSBHZXRBdmVyYWdlRHVyYXRpb24oU3RhdFR5cGUgdHlwZSkgY29uc3Q7Ci0gIGRvdWJsZSBHZXRNaW5EdXJhdGlvbihTdGF0VHlwZSB0eXBlKSBjb25zdDsKLSAgZG91YmxlIEdldE1heER1cmF0aW9uKFN0YXRUeXBlIHR5cGUpIGNvbnN0OwotCi0gIHN0YXRpYyBTaGVsbE1lZGlhU3RhdGlzdGljcyYgSW5zdGFuY2UoKTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgUmVzZXQoYm9vbCBpbmNsdWRlX2dsb2JhbF9zdGF0cyk7Ci0KLSAgYmFzZTo6VGltZSBzdGFydF87Ci0gIFN0YXQgc3RhdHNfW1NUQVRfVFlQRV9NQVhdOwotfTsKLQotY2xhc3MgU2hlbGxTY29wZWRNZWRpYVN0YXQgewotIHB1YmxpYzoKLSAgU2hlbGxTY29wZWRNZWRpYVN0YXQoU2hlbGxNZWRpYVN0YXRpc3RpY3M6OlN0YXRUeXBlIHR5cGUpOwotICB+U2hlbGxTY29wZWRNZWRpYVN0YXQoKTsKLQotIHByaXZhdGU6Ci0gIFNoZWxsTWVkaWFTdGF0aXN0aWNzOjpTdGF0VHlwZSB0eXBlXzsKLSAgYmFzZTo6VGltZSBzdGFydF87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2lmIGRlZmluZWQoX19MQl9TSEVMTF9fRk9SX1JFTEVBU0VfXykKLSNkZWZpbmUgVVBEQVRFX01FRElBX1NUQVRJU1RJQ1ModHlwZSwgdmFsdWUpIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoZmFsc2UpCi0KLS8vIFRoaXMgbWFjcm8gcmVwb3J0cyBhIG1lZGlhIHN0YXQgd2l0aCBpdHMgZHVyYXRpb24KLSNkZWZpbmUgU0NPUEVEX01FRElBX1NUQVRJU1RJQ1ModHlwZSkgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKGZhbHNlKQotI2Vsc2UgIC8vIGRlZmluZWQoX19MQl9TSEVMTF9fRk9SX1JFTEVBU0VfXykKLS8vIFRoaXMgbWFjcm8gcmVwb3J0cyBhIG1lZGlhIHN0YXQgd2l0aCBpdHMgbmV3IHZhbHVlCi0jZGVmaW5lIFVQREFURV9NRURJQV9TVEFUSVNUSUNTKHR5cGUsIHZhbHVlKSAgICAgIFwKLSAgbWVkaWE6OlNoZWxsTWVkaWFTdGF0aXN0aWNzOjpJbnN0YW5jZSgpLnJlY29yZCggXAotICAgICAgbWVkaWE6OlNoZWxsTWVkaWFTdGF0aXN0aWNzOjp0eXBlLCB2YWx1ZSkKLQotLy8gVGhpcyBtYWNybyByZXBvcnRzIGEgbWVkaWEgc3RhdCB3aXRoIGl0cyBkdXJhdGlvbgotI2RlZmluZSBTQ09QRURfTUVESUFfU1RBVElTVElDUyh0eXBlKSAgICAgICAgICAgXAotICBtZWRpYTo6U2hlbGxTY29wZWRNZWRpYVN0YXQgc3RhdGlzdGljc19ldmVudCggXAotICAgICAgbWVkaWE6OlNoZWxsTWVkaWFTdGF0aXN0aWNzOjp0eXBlKQotI2VuZGlmICAvLyBkZWZpbmVkKF9fTEJfU0hFTExfX0ZPUl9SRUxFQVNFX18pCi0KLSNlbmRpZiAgLy8gTUVESUFfQkFTRV9TSEVMTF9NRURJQV9TVEFUSVNUSUNTX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9zaGVsbF92aWRlb19kYXRhX2FsbG9jYXRvci5jYyBiL3NyYy9tZWRpYS9iYXNlL3NoZWxsX3ZpZGVvX2RhdGFfYWxsb2NhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDdlNTE4Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3NoZWxsX3ZpZGVvX2RhdGFfYWxsb2NhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2hlbGxfdmlkZW9fZGF0YV9hbGxvY2F0b3IuaCIKLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1TaGVsbFZpZGVvRGF0YUFsbG9jYXRvcjo6WVYxMlBhcmFtOjpZVjEyUGFyYW0oaW50IGRlY29kZWRfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlY29kZWRfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdmeDo6UmVjdCYgdmlzaWJsZV9yZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBkYXRhKQotICAgIDogZGVjb2RlZF93aWR0aF8oZGVjb2RlZF93aWR0aCksCi0gICAgICBkZWNvZGVkX2hlaWdodF8oZGVjb2RlZF9oZWlnaHQpLAotICAgICAgdmlzaWJsZV9yZWN0Xyh2aXNpYmxlX3JlY3QpLAotICAgICAgeV9waXRjaF8oZGVjb2RlZF93aWR0aCksCi0gICAgICB1dl9waXRjaF8oZGVjb2RlZF93aWR0aCAvIDIpLAotICAgICAgeV9kYXRhXyhkYXRhKSwKLSAgICAgIHVfZGF0YV8oeV9kYXRhXyArIHlfcGl0Y2hfICogZGVjb2RlZF9oZWlnaHRfKSwKLSAgICAgIHZfZGF0YV8odV9kYXRhXyArIHV2X3BpdGNoXyAqIGRlY29kZWRfaGVpZ2h0XyAvIDIpIHt9Ci0KLVNoZWxsVmlkZW9EYXRhQWxsb2NhdG9yOjpZVjEyUGFyYW06OllWMTJQYXJhbShpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9waXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXZfcGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHlfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB2X2RhdGEpCi0gICAgOiBkZWNvZGVkX3dpZHRoXyh3aWR0aCksCi0gICAgICBkZWNvZGVkX2hlaWdodF8oaGVpZ2h0KSwKLSAgICAgIHZpc2libGVfcmVjdF8oMCwgMCwgd2lkdGgsIGhlaWdodCksCi0gICAgICB5X3BpdGNoXyh5X3BpdGNoKSwKLSAgICAgIHV2X3BpdGNoXyh1dl9waXRjaCksCi0gICAgICB5X2RhdGFfKHlfZGF0YSksCi0gICAgICB1X2RhdGFfKHVfZGF0YSksCi0gICAgICB2X2RhdGFfKHZfZGF0YSkgewotICBEQ0hFQ0tfTkUoeV9waXRjaF8sIDApOwotICBEQ0hFQ0tfTkUodXZfcGl0Y2hfLCAwKTsKLSAgRENIRUNLKHlfZGF0YV8pOwotICBEQ0hFQ0sodV9kYXRhKTsKLSAgRENIRUNLKHZfZGF0YSk7Ci19Ci0KLVNoZWxsVmlkZW9EYXRhQWxsb2NhdG9yOjpOVjEyUGFyYW06Ok5WMTJQYXJhbShpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9waXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnZng6OlJlY3QmIHZpc2libGVfcmVjdCkKLSAgICA6IGRlY29kZWRfd2lkdGhfKHdpZHRoKSwKLSAgICAgIGRlY29kZWRfaGVpZ2h0XyhoZWlnaHQpLAotICAgICAgeV9waXRjaF8oeV9waXRjaCksCi0gICAgICB2aXNpYmxlX3JlY3RfKHZpc2libGVfcmVjdCkge30KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9zaGVsbF92aWRlb19kYXRhX2FsbG9jYXRvci5oIGIvc3JjL21lZGlhL2Jhc2Uvc2hlbGxfdmlkZW9fZGF0YV9hbGxvY2F0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ExNjRhMi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9zaGVsbF92aWRlb19kYXRhX2FsbG9jYXRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQkFTRV9TSEVMTF9WSURFT19EQVRBX0FMTE9DQVRPUl9IXwotI2RlZmluZSBNRURJQV9CQVNFX1NIRUxMX1ZJREVPX0RBVEFfQUxMT0NBVE9SX0hfCi0KLSNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2ZyYW1lLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIFNoZWxsUmF3VmlkZW9EZWNvZGVyOwotCi0vLyBUaGlzIGNsYXNzIGlzIGludHJvZHVjZWQgdG8gcmVtb3ZlIHRoZSBoaWRkZW4gZGVwZW5kZW5jeSBvbiB0aGUgcGxhdGZvcm0KLS8vIGRlcGVuZGVudCBncmFwaGljcyBjb2RlIGZyb20gbG93IGxldmVsIHZpZGVvIGRlY29kZXJzLiBJdCBpcyBwb3NzaWJsZSB0aGF0Ci0vLyB0aGlzIGNhbiBiZSBhY2hpZXZlZCB2aWEgaW50ZXJmYWNlcyBjcmVhdGVkIG9uIGVhY2ggcGxhdGZvcm0uIEhvd2V2ZXIsIHRvCi0vLyBhYnN0cmFjdCB0aGVtIGludG8gYSBjb21tb24gaW50ZXJmYWNlIGlzIG1vcmUgZXhwbGljaXQuCi1jbGFzcyBNRURJQV9FWFBPUlQgU2hlbGxWaWRlb0RhdGFBbGxvY2F0b3IgewotIHB1YmxpYzoKLSAgY2xhc3MgRnJhbWVCdWZmZXIgOiBwdWJsaWMgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8RnJhbWVCdWZmZXI+IHsKLSAgIHB1YmxpYzoKLSAgICBGcmFtZUJ1ZmZlcigpIHt9Ci0gICAgdmlydHVhbCB+RnJhbWVCdWZmZXIoKSB7fQotICAgIHZpcnR1YWwgdWludDgqIGRhdGEoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0ID0gMDsKLQotICAgcHJpdmF0ZToKLSAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRnJhbWVCdWZmZXIpOwotICB9OwotCi0gIGNsYXNzIFlWMTJQYXJhbSB7Ci0gICBwdWJsaWM6Ci0gICAgWVYxMlBhcmFtKGludCBkZWNvZGVkX3dpZHRoLAotICAgICAgICAgICAgICBpbnQgZGVjb2RlZF9oZWlnaHQsCi0gICAgICAgICAgICAgIGNvbnN0IGdmeDo6UmVjdCYgdmlzaWJsZV9yZWN0LAotICAgICAgICAgICAgICB1aW50OCogZGF0YSk7Ci0KLSAgICAvLyBDcmVhdGUgd2l0aCBkYXRhIHBvaW50ZXIgdG8gaW5kaXZpZHVhbCBwbGFuZXMuIEFsbCBwb2ludGVycyBzaG91bGQgYmUgaW4KLSAgICAvLyB0aGUgc2FtZSBtZW1vcnkgYmxvY2sgY29udHJvbGxlZCBieSB0aGUgYWNjb21wYW5pZWQgRnJhbWVCdWZmZXIgcGFzc2VkIHRvCi0gICAgLy8gQ3JlYXRlWVYxMkZyYW1lLiBUaGUgZGVjb2RlZCBzaXplIGFuZCB2aXNpYmxlIHJlY3QgYXJlIGFzc3VtZWQgdG8gYmUgdGhlCi0gICAgLy8gc2FtZS4gSXQgaXMgb25seSB1c2VkIGZvciBkZWNvZGluZyB2cDkgZnJhbWVzLgotICAgIFlWMTJQYXJhbShpbnQgd2lkdGgsCi0gICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgIGludCB5X3BpdGNoLAotICAgICAgICAgICAgICBpbnQgdXZfcGl0Y2gsCi0gICAgICAgICAgICAgIHVpbnQ4KiB5X2RhdGEsCi0gICAgICAgICAgICAgIHVpbnQ4KiB1X2RhdGEsCi0gICAgICAgICAgICAgIHVpbnQ4KiB2X2RhdGEpOwotICAgIGludCB5X3BpdGNoKCkgY29uc3QgewotICAgICAgRENIRUNLX05FKHlfcGl0Y2hfLCAwKTsKLSAgICAgIHJldHVybiB5X3BpdGNoXzsKLSAgICB9Ci0gICAgaW50IHV2X3BpdGNoKCkgY29uc3QgewotICAgICAgRENIRUNLX05FKHV2X3BpdGNoXywgMCk7Ci0gICAgICByZXR1cm4gdXZfcGl0Y2hfOwotICAgIH0KLSAgICB1aW50OCogeV9kYXRhKCkgY29uc3QgewotICAgICAgRENIRUNLKHlfZGF0YV8pOwotICAgICAgcmV0dXJuIHlfZGF0YV87Ci0gICAgfQotICAgIHVpbnQ4KiB1X2RhdGEoKSBjb25zdCB7Ci0gICAgICBEQ0hFQ0sodV9kYXRhXyk7Ci0gICAgICByZXR1cm4gdV9kYXRhXzsKLSAgICB9Ci0gICAgdWludDgqIHZfZGF0YSgpIGNvbnN0IHsKLSAgICAgIERDSEVDSyh2X2RhdGFfKTsKLSAgICAgIHJldHVybiB2X2RhdGFfOwotICAgIH0KLQotICAgIGludCBkZWNvZGVkX3dpZHRoKCkgY29uc3QgeyByZXR1cm4gZGVjb2RlZF93aWR0aF87IH0KLSAgICBpbnQgZGVjb2RlZF9oZWlnaHQoKSBjb25zdCB7IHJldHVybiBkZWNvZGVkX2hlaWdodF87IH0KLSAgICBjb25zdCBnZng6OlJlY3QmIHZpc2libGVfcmVjdCgpIGNvbnN0IHsgcmV0dXJuIHZpc2libGVfcmVjdF87IH0KLQotICAgcHJpdmF0ZToKLSAgICBpbnQgZGVjb2RlZF93aWR0aF87Ci0gICAgaW50IGRlY29kZWRfaGVpZ2h0XzsKLQotICAgIGdmeDo6UmVjdCB2aXNpYmxlX3JlY3RfOwotCi0gICAgaW50IHlfcGl0Y2hfOwotICAgIGludCB1dl9waXRjaF87Ci0gICAgdWludDgqIHlfZGF0YV87Ci0gICAgdWludDgqIHVfZGF0YV87Ci0gICAgdWludDgqIHZfZGF0YV87Ci0gIH07Ci0KLSAgLy8gT25seSB1c2VkIGZvciBzb21lIHBsYXRmb3JtcycgaGFyZHdhcmUgQVZDIGRlY29kZXIgdGhhdCBvbmx5IHN1cHBvcnQgTlYxMgotICAvLyBvdXRwdXQuCi0gIGNsYXNzIE5WMTJQYXJhbSB7Ci0gICBwdWJsaWM6Ci0gICAgTlYxMlBhcmFtKGludCBkZWNvZGVkX3dpZHRoLAotICAgICAgICAgICAgICBpbnQgZGVjb2RlZF9oZWlnaHQsCi0gICAgICAgICAgICAgIGludCB5X3BpdGNoLAotICAgICAgICAgICAgICBjb25zdCBnZng6OlJlY3QmIHZpc2libGVfcmVjdCk7Ci0KLSAgICBpbnQgZGVjb2RlZF93aWR0aCgpIGNvbnN0IHsgcmV0dXJuIGRlY29kZWRfd2lkdGhfOyB9Ci0gICAgaW50IGRlY29kZWRfaGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gZGVjb2RlZF9oZWlnaHRfOyB9Ci0gICAgaW50IHlfcGl0Y2goKSBjb25zdCB7IHJldHVybiB5X3BpdGNoXzsgfQotICAgIGNvbnN0IGdmeDo6UmVjdCYgdmlzaWJsZV9yZWN0KCkgY29uc3QgeyByZXR1cm4gdmlzaWJsZV9yZWN0XzsgfQotCi0gICBwcml2YXRlOgotICAgIGludCBkZWNvZGVkX3dpZHRoXzsKLSAgICBpbnQgZGVjb2RlZF9oZWlnaHRfOwotICAgIGludCB5X3BpdGNoXzsKLSAgICBnZng6OlJlY3QgdmlzaWJsZV9yZWN0XzsKLSAgfTsKLQotICBTaGVsbFZpZGVvRGF0YUFsbG9jYXRvcigpIHt9Ci0gIHZpcnR1YWwgflNoZWxsVmlkZW9EYXRhQWxsb2NhdG9yKCkge30KLQotICAvLyBBbGxvY2F0ZSBhIGJ1ZmZlciB0byBzdG9yZSB0aGUgdmlkZW8gZnJhbWUgdG8gYmUgZGVjb2RlZC4KLSAgdmlydHVhbCBzY29wZWRfcmVmcHRyPEZyYW1lQnVmZmVyPiBBbGxvY2F0ZUZyYW1lQnVmZmVyKHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFsaWdubWVudCkgPSAwOwotICB2aXJ0dWFsIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gQ3JlYXRlWVYxMkZyYW1lKAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxGcmFtZUJ1ZmZlcj4mIGZyYW1lX2J1ZmZlciwKLSAgICAgIGNvbnN0IFlWMTJQYXJhbSYgcGFyYW0sCi0gICAgICBjb25zdCBiYXNlOjpUaW1lRGVsdGEmIHRpbWVzdGFtcCkgPSAwOwotCi0gIC8vIFNvbWUgaGFyZHdhcmUgQVZDIGRlY29kZXJzIG9ubHkgc3VwcG9ydCBOVjEyIG91dHB1dC4gVGhleSBhcmUgcGVyZmVjdGx5Ci0gIC8vIGFsaWduZWQgZm9yIHJlbmRlcmluZyBhcyB0ZXh0dXJlIHRob3VnaC4KLSAgdmlydHVhbCBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IENyZWF0ZU5WMTJGcmFtZSgKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RnJhbWVCdWZmZXI+JiBmcmFtZV9idWZmZXIsCi0gICAgICBjb25zdCBOVjEyUGFyYW0mIHBhcmFtLAotICAgICAgY29uc3QgYmFzZTo6VGltZURlbHRhJiB0aW1lc3RhbXApIHsKLSAgICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKGZyYW1lX2J1ZmZlcik7Ci0gICAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihwYXJhbSk7Ci0gICAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUih0aW1lc3RhbXApOwotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIC8vIFJldHVybiBhIHZpZGVvIGZyYW1lIGZpbGxlZCB3aXRoIFJHQkEgemVybyBvbiBwbGF0Zm9ybXMgdGhhdCByZXF1aXJlIHB1bmNoCi0gIC8vIG91dC4gIFJldHVybiBOVUxMIG90aGVyd2lzZS4KLSAgdmlydHVhbCBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IEdldFB1bmNoT3V0RnJhbWUoKSB7IHJldHVybiBOVUxMOyB9Ci0KLSAgLy8gTW9zdCBwbGF0Zm9ybXMgbGltaXQgdGhlIG51bWJlciBvZiBhY3RpdmUgcmF3IHZpZGVvIGRlY29kZXJzIHRvIG9uZS4gIFRoZQotICAvLyBmb2xsb3dpbmcgZnVuY3Rpb25zIGVuYWJsZSB0aGUgaW1wbGVtZW50YXRpb25zIG9uIHRoZXNlIHBsYXRmb3JtcyB0byBjaGVjawotICAvLyBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHZpZGVvIGRlY29kZXIgYWN0aXZlLgotICB2aXJ0dWFsIHZvaWQgQWNxdWlyZShTaGVsbFJhd1ZpZGVvRGVjb2Rlciogb3duZXIpIHsKLSAgICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKG93bmVyKTsKLSAgfQotICB2aXJ0dWFsIHZvaWQgUmVsZWFzZShTaGVsbFJhd1ZpZGVvRGVjb2Rlciogb3duZXIpIHsKLSAgICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKG93bmVyKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNoZWxsVmlkZW9EYXRhQWxsb2NhdG9yKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0JBU0VfU0hFTExfVklERU9fREFUQV9BTExPQ0FUT1JfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3NoZWxsX3ZpZGVvX2ZyYW1lX3Byb3ZpZGVyLmNjIGIvc3JjL21lZGlhL2Jhc2Uvc2hlbGxfdmlkZW9fZnJhbWVfcHJvdmlkZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZjJmOTguLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2Uvc2hlbGxfdmlkZW9fZnJhbWVfcHJvdmlkZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2hlbGxfdmlkZW9fZnJhbWVfcHJvdmlkZXIuaCIKLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKLSNpbmNsdWRlICJzdGFyYm9hcmQvZGVjb2RlX3RhcmdldC5oIgotI2VuZGlmICAvLyAjaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1TaGVsbFZpZGVvRnJhbWVQcm92aWRlcjo6U2hlbGxWaWRlb0ZyYW1lUHJvdmlkZXIoCi0gICAgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiBwdW5jaF9vdXQpCi0gICAgOiBwdW5jaF9vdXRfKHB1bmNoX291dCksIGhhc19jb25zdW1lZF9mcmFtZXNfKGZhbHNlKSwgZHJvcHBlZF9mcmFtZXNfKDApLAotICAgICAgb3V0cHV0X21vZGVfKGtPdXRwdXRNb2RlSW52YWxpZCkgewotI2lmICFkZWZpbmVkKF9fTEJfU0hFTExfX0ZPUl9SRUxFQVNFX18pCi0gIG1heF9kZWxheV9pbl9taWNyb3NlY29uZHNfID0gMDsKLSNlbmRpZiAgLy8gIWRlZmluZWQoX19MQl9TSEVMTF9fRk9SX1JFTEVBU0VfXykKLX0KLQotdm9pZCBTaGVsbFZpZGVvRnJhbWVQcm92aWRlcjo6UmVnaXN0ZXJNZWRpYVRpbWVBbmRTZWVraW5nU3RhdGVDQigKLSAgICBjb25zdCBNZWRpYVRpbWVBbmRTZWVraW5nU3RhdGVDQiYgbWVkaWFfdGltZV9hbmRfc2Vla2luZ19zdGF0ZV9jYikgewotICBEQ0hFQ0soIW1lZGlhX3RpbWVfYW5kX3NlZWtpbmdfc3RhdGVfY2IuaXNfbnVsbCgpKTsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGZyYW1lc19sb2NrXyk7Ci0gIG1lZGlhX3RpbWVfYW5kX3NlZWtpbmdfc3RhdGVfY2JfID0gbWVkaWFfdGltZV9hbmRfc2Vla2luZ19zdGF0ZV9jYjsKLX0KLQotdm9pZCBTaGVsbFZpZGVvRnJhbWVQcm92aWRlcjo6VW5yZWdpc3Rlck1lZGlhVGltZUFuZFNlZWtpbmdTdGF0ZUNCKAotICAgIGNvbnN0IE1lZGlhVGltZUFuZFNlZWtpbmdTdGF0ZUNCJiBtZWRpYV90aW1lX2FuZF9zZWVraW5nX3N0YXRlX2NiKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhmcmFtZXNfbG9ja18pOwotICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSByZWdpc3RlciBvZiBhIG5ldyBjYWxsYmFjayBoYXBwZW5zIGVhcmxpZXIgdGhhbiB0aGUKLSAgLy8gdW5yZWdpc3RlciBvZiB0aGUgcHJldmlvdXMgY2FsbGJhY2suICBBbHdheXMgZW5zdXJlIHRoYXQgdGhlIGNhbGxiYWNrCi0gIC8vIHBhc3NlZCBpbiBpcyB0aGUgY3VycmVudCBvbmUgYmVmb3JlIHJlc2V0dGluZy4KLSAgaWYgKG1lZGlhX3RpbWVfYW5kX3NlZWtpbmdfc3RhdGVfY2JfLkVxdWFscygKLSAgICAgICAgICBtZWRpYV90aW1lX2FuZF9zZWVraW5nX3N0YXRlX2NiKSkgewotICAgIG1lZGlhX3RpbWVfYW5kX3NlZWtpbmdfc3RhdGVfY2JfLlJlc2V0KCk7Ci0gIH0KLX0KLQotY29uc3Qgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiYgU2hlbGxWaWRlb0ZyYW1lUHJvdmlkZXI6OkdldEN1cnJlbnRGcmFtZSgpIHsKLSAgaWYgKHB1bmNoX291dF8pIHsKLSAgICBjdXJyZW50X2ZyYW1lXyA9IHB1bmNoX291dF87Ci0gICAgcmV0dXJuIGN1cnJlbnRfZnJhbWVfOwotICB9Ci0KLSAgY29uc3QgaW50IGtFcHNpbG9uSW5NaWNyb3NlY29uZHMgPQotICAgICAgYmFzZTo6VGltZTo6a01pY3Jvc2Vjb25kc1BlclNlY29uZCAvIDYwIC8gMjsKLQotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2soZnJhbWVzX2xvY2tfKTsKLQotICBiYXNlOjpUaW1lRGVsdGEgbWVkaWFfdGltZTsKLSAgYm9vbCBpc19zZWVraW5nOwotICBHZXRNZWRpYVRpbWVBbmRTZWVraW5nU3RhdGVfTG9ja2VkKCZtZWRpYV90aW1lLCAmaXNfc2Vla2luZyk7Ci0gIHdoaWxlICghZnJhbWVzXy5lbXB0eSgpKSB7Ci0gICAgaW50NjRfdCBmcmFtZV90aW1lID0gZnJhbWVzX1swXS0+R2V0VGltZXN0YW1wKCkuSW5NaWNyb3NlY29uZHMoKTsKLSAgICBpZiAoZnJhbWVfdGltZSA+PSBtZWRpYV90aW1lLkluTWljcm9zZWNvbmRzKCkpCi0gICAgICBicmVhazsKLSAgICBpZiAoY3VycmVudF9mcmFtZV8gIT0gZnJhbWVzX1swXSAmJgotICAgICAgICBmcmFtZV90aW1lICsga0Vwc2lsb25Jbk1pY3Jvc2Vjb25kcyA+PSBtZWRpYV90aW1lLkluTWljcm9zZWNvbmRzKCkpCi0gICAgICBicmVhazsKLQotICAgIGlmIChjdXJyZW50X2ZyYW1lXyAhPSBmcmFtZXNfWzBdICYmICFpc19zZWVraW5nKSB7Ci0gICAgICArK2Ryb3BwZWRfZnJhbWVzXzsKLQotI2lmICFkZWZpbmVkKF9fTEJfU0hFTExfX0ZPUl9SRUxFQVNFX18pCi0gICAgICBpZiAobWVkaWFfdGltZS5Jbk1pY3Jvc2Vjb25kcygpIC0gZnJhbWVfdGltZSA+IG1heF9kZWxheV9pbl9taWNyb3NlY29uZHNfKQotICAgICAgICBtYXhfZGVsYXlfaW5fbWljcm9zZWNvbmRzXyA9IG1lZGlhX3RpbWUuSW5NaWNyb3NlY29uZHMoKSAtIGZyYW1lX3RpbWU7Ci0gICAgICBjb25zdCBib29sIGtMb2dGcmFtZURyb3BzIEFMTE9XX1VOVVNFRCA9IGZhbHNlOwotICAgICAgTE9HX0lGKFdBUk5JTkcsIGtMb2dGcmFtZURyb3BzKQotICAgICAgICAgIDw8ICJkcm9wcGVkIG9uZSBmcmFtZSB3aXRoIHRpbWVzdGFtcCAiCi0gICAgICAgICAgPDwgZnJhbWVzX1swXS0+R2V0VGltZXN0YW1wKCkuSW5NaWNyb3NlY29uZHMoKSA8PCAiIGF0IG1lZGlhIHRpbWUgIgotICAgICAgICAgIDw8IG1lZGlhX3RpbWUuSW5NaWNyb3NlY29uZHMoKSA8PCAiIHRvdGFsIGRyb3BwZWQgIiA8PCBkcm9wcGVkX2ZyYW1lc18KLSAgICAgICAgICA8PCAiIGZyYW1lcyB3aXRoIGEgbWF4IGRlbGF5IG9mICIgPDwgbWF4X2RlbGF5X2luX21pY3Jvc2Vjb25kc18KLSAgICAgICAgICA8PCAiIG1zIjsKLSNlbmRpZiAgLy8gIWRlZmluZWQoX19MQl9TSEVMTF9fRk9SX1JFTEVBU0VfXykKLSAgICB9Ci0KLSAgICBpZiAoZnJhbWVzXy5zaXplKCkgPT0gMSkgewotICAgICAgY3VycmVudF9mcmFtZV8gPSBmcmFtZXNfWzBdOwotICAgIH0KLQotICAgIGZyYW1lc18uZXJhc2UoZnJhbWVzXy5iZWdpbigpKTsKLSAgICBoYXNfY29uc3VtZWRfZnJhbWVzXyA9IHRydWU7Ci0gIH0KLSAgaWYgKCFmcmFtZXNfLmVtcHR5KCkpIHsKLSAgICBjdXJyZW50X2ZyYW1lXyA9IGZyYW1lc19bMF07Ci0gIH0KLSAgcmV0dXJuIGN1cnJlbnRfZnJhbWVfOwotfQotCi12b2lkIFNoZWxsVmlkZW9GcmFtZVByb3ZpZGVyOjpTZXRPdXRwdXRNb2RlKE91dHB1dE1vZGUgb3V0cHV0X21vZGUpIHsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGZyYW1lc19sb2NrXyk7Ci0gIG91dHB1dF9tb2RlXyA9IG91dHB1dF9tb2RlOwotfQotCi1TaGVsbFZpZGVvRnJhbWVQcm92aWRlcjo6T3V0cHV0TW9kZSBTaGVsbFZpZGVvRnJhbWVQcm92aWRlcjo6R2V0T3V0cHV0TW9kZSgpCi0gICAgY29uc3QgewotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2soZnJhbWVzX2xvY2tfKTsKLSAgcmV0dXJuIG91dHB1dF9tb2RlXzsKLX0KLQotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKLQotdm9pZCBTaGVsbFZpZGVvRnJhbWVQcm92aWRlcjo6U2V0R2V0Q3VycmVudFNiRGVjb2RlVGFyZ2V0RnVuY3Rpb24oCi0gICAgR2V0Q3VycmVudFNiRGVjb2RlVGFyZ2V0RnVuY3Rpb24gZnVuY3Rpb24pIHsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGZyYW1lc19sb2NrXyk7Ci0gIGdldF9jdXJyZW50X3NiX2RlY29kZV90YXJnZXRfZnVuY3Rpb25fID0gZnVuY3Rpb247Ci19Ci0KLXZvaWQgU2hlbGxWaWRlb0ZyYW1lUHJvdmlkZXI6OlJlc2V0R2V0Q3VycmVudFNiRGVjb2RlVGFyZ2V0RnVuY3Rpb24oKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhmcmFtZXNfbG9ja18pOwotICBnZXRfY3VycmVudF9zYl9kZWNvZGVfdGFyZ2V0X2Z1bmN0aW9uXy5SZXNldCgpOwotfQotCi1TYkRlY29kZVRhcmdldCBTaGVsbFZpZGVvRnJhbWVQcm92aWRlcjo6R2V0Q3VycmVudFNiRGVjb2RlVGFyZ2V0KCkgY29uc3QgewotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2soZnJhbWVzX2xvY2tfKTsKLSAgaWYgKGdldF9jdXJyZW50X3NiX2RlY29kZV90YXJnZXRfZnVuY3Rpb25fLmlzX251bGwoKSkgewotICAgIHJldHVybiBrU2JEZWNvZGVUYXJnZXRJbnZhbGlkOwotICB9IGVsc2UgewotICAgIHJldHVybiBnZXRfY3VycmVudF9zYl9kZWNvZGVfdGFyZ2V0X2Z1bmN0aW9uXy5SdW4oKTsKLSAgfQotfQotCi0jZW5kaWYgIC8vICNpZiBTQl9BUElfVkVSU0lPTiA+PSA0Ci0KLXZvaWQgU2hlbGxWaWRlb0ZyYW1lUHJvdmlkZXI6OkFkZEZyYW1lKGNvbnN0IHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4mIGZyYW1lKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhmcmFtZXNfbG9ja18pOwotICBmcmFtZXNfLnB1c2hfYmFjayhmcmFtZSk7Ci19Ci0KLXZvaWQgU2hlbGxWaWRlb0ZyYW1lUHJvdmlkZXI6OkZsdXNoKCkgewotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2soZnJhbWVzX2xvY2tfKTsKLSAgZnJhbWVzXy5jbGVhcigpOwotfQotCi12b2lkIFNoZWxsVmlkZW9GcmFtZVByb3ZpZGVyOjpTdG9wKCkgewotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2soZnJhbWVzX2xvY2tfKTsKLSAgZnJhbWVzXy5jbGVhcigpOwotICBjdXJyZW50X2ZyYW1lXyA9IE5VTEw7Ci0gIGRyb3BwZWRfZnJhbWVzXyA9IDA7Ci19Ci0KLXNpemVfdCBTaGVsbFZpZGVvRnJhbWVQcm92aWRlcjo6R2V0TnVtT2ZGcmFtZXNDYWNoZWQoKSBjb25zdCB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhmcmFtZXNfbG9ja18pOwotICByZXR1cm4gZnJhbWVzXy5zaXplKCk7Ci19Ci0KLXZvaWQgU2hlbGxWaWRlb0ZyYW1lUHJvdmlkZXI6OkdldE1lZGlhVGltZUFuZFNlZWtpbmdTdGF0ZV9Mb2NrZWQoCi0gICAgYmFzZTo6VGltZURlbHRhKiBtZWRpYV90aW1lLAotICAgIGJvb2wqIGlzX3NlZWtpbmcpIGNvbnN0IHsKLSAgRENIRUNLKG1lZGlhX3RpbWUpOwotICBEQ0hFQ0soaXNfc2Vla2luZyk7Ci0gIGZyYW1lc19sb2NrXy5Bc3NlcnRBY3F1aXJlZCgpOwotICBpZiAobWVkaWFfdGltZV9hbmRfc2Vla2luZ19zdGF0ZV9jYl8uaXNfbnVsbCgpKSB7Ci0gICAgKm1lZGlhX3RpbWUgPSBiYXNlOjpUaW1lRGVsdGEoKTsKLSAgICAqaXNfc2Vla2luZyA9IGZhbHNlOwotICAgIHJldHVybjsKLSAgfQotICBtZWRpYV90aW1lX2FuZF9zZWVraW5nX3N0YXRlX2NiXy5SdW4obWVkaWFfdGltZSwgaXNfc2Vla2luZyk7Ci19Ci0KLWJvb2wgU2hlbGxWaWRlb0ZyYW1lUHJvdmlkZXI6OlF1ZXJ5QW5kUmVzZXRIYXNDb25zdW1lZEZyYW1lcygpIHsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGZyYW1lc19sb2NrXyk7Ci0gIGJvb2wgcHJldmlvdXNfdmFsdWUgPSBoYXNfY29uc3VtZWRfZnJhbWVzXzsKLSAgaGFzX2NvbnN1bWVkX2ZyYW1lc18gPSBmYWxzZTsKLSAgcmV0dXJuIHByZXZpb3VzX3ZhbHVlOwotfQotCi1pbnQgU2hlbGxWaWRlb0ZyYW1lUHJvdmlkZXI6OlJlc2V0QW5kUmV0dXJuRHJvcHBlZEZyYW1lcygpIHsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGZyYW1lc19sb2NrXyk7Ci0gIGludCBkcm9wcGVkX2ZyYW1lcyA9IGRyb3BwZWRfZnJhbWVzXzsKLSAgZHJvcHBlZF9mcmFtZXNfID0gMDsKLSAgcmV0dXJuIGRyb3BwZWRfZnJhbWVzOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3NoZWxsX3ZpZGVvX2ZyYW1lX3Byb3ZpZGVyLmggYi9zcmMvbWVkaWEvYmFzZS9zaGVsbF92aWRlb19mcmFtZV9wcm92aWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTFlMmQwLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3NoZWxsX3ZpZGVvX2ZyYW1lX3Byb3ZpZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9CQVNFX1NIRUxMX1ZJREVPX0ZSQU1FX1BST1ZJREVSX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfU0hFTExfVklERU9fRlJBTUVfUFJPVklERVJfSF8KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKLSNpbmNsdWRlICJiYXNlL3RpbWUuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2ZyYW1lLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2RlY29kZV90YXJnZXQuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gVE9ETzogUmVtb3ZlIFNoZWxsIHByZWZpeC4KLS8vIFRoZSBTaGVsbFZpZGVvRnJhbWVQcm92aWRlciBtYW5hZ2VzIHRoZSBiYWNrbG9nIGZvciB2aWRlbyBmcmFtZXMuIEl0IGhhcyB0aGUKLS8vIGZvbGxvd2luZyBmdW5jdGlvbmFsaXRpZXM6Ci0vLyAxLiBJdCBjYWNoZXMgdGhlIHZpZGVvIGZyYW1lcyByZWFkeSB0byBiZSBkaXNwbGF5ZWQuCi0vLyAyLiBJdCBkZWNpZGVzIHdoaWNoIGZyYW1lIHRvIGJlIGRpc3BsYXllZCBhdCB0aGUgY3VycmVudCB0aW1lLgotLy8gMy4gSXQgcmVtb3ZlcyBmcmFtZXMgdGhhdCB3aWxsIG5vIGxvbmdlciBiZSBkaXNwbGF5ZWQuCi1jbGFzcyBTaGVsbFZpZGVvRnJhbWVQcm92aWRlcgotICAgIDogcHVibGljIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPFNoZWxsVmlkZW9GcmFtZVByb3ZpZGVyPiB7Ci0gcHVibGljOgotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKLSAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazxTYkRlY29kZVRhcmdldCgpPiBHZXRDdXJyZW50U2JEZWNvZGVUYXJnZXRGdW5jdGlvbjsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAotCi0gIGVudW0gT3V0cHV0TW9kZSB7Ci0gICAga091dHB1dE1vZGVQdW5jaE91dCwKLSAgICBrT3V0cHV0TW9kZURlY29kZVRvVGV4dHVyZSwKLSAgICBrT3V0cHV0TW9kZUludmFsaWQsCi0gIH07Ci0KLSAgZXhwbGljaXQgU2hlbGxWaWRlb0ZyYW1lUHJvdmlkZXIoc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiBwdW5jaF9vdXQgPSBOVUxMKTsKLQotICAvLyBUaGUgY2FsbGluZyBiYWNrIHJldHVybnMgdGhlIGN1cnJlbnQgbWVkaWEgdGltZSBhbmQgYSBib29sIHdoaWNoIGlzIHNldCB0bwotICAvLyB0cnVlIHdoZW4gYSBzZWVrIGlzIGluIHByb2dyZXNzLgotICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHZvaWQoYmFzZTo6VGltZURlbHRhKiwgYm9vbCopPgotICAgICAgTWVkaWFUaW1lQW5kU2Vla2luZ1N0YXRlQ0I7Ci0gIC8vIFRoaXMgY2xhc3MgdXNlcyB0aGUgbWVkaWEgdGltZSB0byBkZWNpZGUgd2hpY2ggZnJhbWUgaXMgY3VycmVudC4gIEl0Ci0gIC8vIHJldHJpZXZlcyB0aGUgbWVkaWEgdGltZSBmcm9tIHRoZSByZWdpc3RlcmVkIG1lZGlhX3RpbWVfY2IuICBUaGVyZSBjYW4gb25seQotICAvLyBiZSBvbmUgcmVnaXN0ZXJlZCBtZWRpYV90aW1lX2NiIGF0IGEgY2VydGFpbiB0aW1lLCBhIGNhbGwgdG8KLSAgLy8gUmVnaXN0ZXJNZWRpYVRpbWVBbmRTZWVraW5nU3RhdGVDQigpIHdpbGwgb3ZlcndyaXRlIHRoZSBwcmV2aW91c2x5Ci0gIC8vIHJlZ2lzdGVyZWQgY2FsbGJhY2suCi0gIHZvaWQgUmVnaXN0ZXJNZWRpYVRpbWVBbmRTZWVraW5nU3RhdGVDQigKLSAgICAgIGNvbnN0IE1lZGlhVGltZUFuZFNlZWtpbmdTdGF0ZUNCJiBtZWRpYV90aW1lX2FuZF9zZWVraW5nX3N0YXRlX2NiKTsKLSAgLy8gVGhpcyBmdW5jdGlvbiB1bnJlZ2lzdGVycyB0aGUgbWVkaWEgdGltZSBjYWxsYmFjayBpZiBpdCBoYXNuJ3QgYmVlbgotICAvLyBvdmVyd3JpdHRlbiBieSBhbm90aGVyIGNhbGxiYWNrLgotICB2b2lkIFVucmVnaXN0ZXJNZWRpYVRpbWVBbmRTZWVraW5nU3RhdGVDQigKLSAgICAgIGNvbnN0IE1lZGlhVGltZUFuZFNlZWtpbmdTdGF0ZUNCJiBtZWRpYV90aW1lX2FuZF9zZWVraW5nX3N0YXRlX2NiKTsKLQotICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IGZyYW1lIHRvIGJlIGRpc3BsYXllZCBpZiB0aGVyZSBpcyBvbmUuIE90aGVyd2lzZSBpdAotICAvLyByZXR1cm5zIE5VTEwuCi0gIGNvbnN0IHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4mIEdldEN1cnJlbnRGcmFtZSgpOwotCi0gIHZvaWQgU2V0T3V0cHV0TW9kZShPdXRwdXRNb2RlIG91dHB1dF9tb2RlKTsKLSAgT3V0cHV0TW9kZSBHZXRPdXRwdXRNb2RlKCkgY29uc3Q7Ci0KLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0Ci0gIC8vIEZvciBTdGFyYm9hcmQgcGxhdGZvcm1zIHRoYXQgaGF2ZSBhIGRlY29kZS10by10ZXh0dXJlIHBsYXllciwgd2UgZW5hYmxlCi0gIC8vIHRoaXMgU2hlbGxWaWRlb0ZyYW1lUHJvdmlkZXIgdG8gYWN0IGFzIGEgYnJpZGdlIGZvciBDb2JhbHQgY29kZSB0byBxdWVyeQotICAvLyBmb3IgdGhlIGN1cnJlbnQgU2JEZWNvZGVUYXJnZXQuICBJbiBlZmZlY3QsIHdlIGJ5cGFzcyBhbGwgb2YKLSAgLy8gU2hlbGxWaWRlb0ZyYW1lUHJvdmlkZXIncyBsb2dpYyBpbiB0aGlzIGNhc2UsIGluc3RlYWQgcmVseWluZyBvbiB0aGUKLSAgLy8gU3RhcmJvYXJkIGltcGxlbWVudGF0aW9uIHRvIHByb3ZpZGUgdXMgd2l0aCB0aGUgY3VycmVudCB2aWRlbyBmcmFtZSB3aGVuCi0gIC8vIG5lZWRlZC4KLSAgdm9pZCBTZXRHZXRDdXJyZW50U2JEZWNvZGVUYXJnZXRGdW5jdGlvbigKLSAgICAgIEdldEN1cnJlbnRTYkRlY29kZVRhcmdldEZ1bmN0aW9uIGZ1bmN0aW9uKTsKLQotICB2b2lkIFJlc2V0R2V0Q3VycmVudFNiRGVjb2RlVGFyZ2V0RnVuY3Rpb24oKTsKLQotICBTYkRlY29kZVRhcmdldCBHZXRDdXJyZW50U2JEZWNvZGVUYXJnZXQoKSBjb25zdDsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAotCi0gIHZvaWQgQWRkRnJhbWUoY29uc3Qgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiYgZnJhbWUpOwotICAvLyBGbHVzaCB3aWxsIGNsZWFyIGFsbCBjYWNoZWQgZnJhbWVzIGV4Y2VwdCB0aGUgY3VycmVudCBmcmFtZS4gU28gdGhlIGN1cnJlbnQKLSAgLy8gZnJhbWUgY2FuIHN0aWxsIGJlIGRpc3BsYXllZCBkdXJpbmcgc2Vlay4KLSAgdm9pZCBGbHVzaCgpOwotICAvLyBTdG9wIHdpbGwgY2xlYXIgYWxsIGNhY2hlZCBmcmFtZXMgaW5jbHVkaW5nIHRoZSBjdXJyZW50IGZyYW1lLgotICB2b2lkIFN0b3AoKTsKLSAgc2l6ZV90IEdldE51bU9mRnJhbWVzQ2FjaGVkKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJuIHRydWUgaWYgVmlkZW9GcmFtZXMgaGF2ZSBiZWVuIHJlbGVhc2VkIGZyb20gdGhlIGludGVybmFsIGZyYW1lc18KLSAgLy8gcXVldWUgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIHdhcyBjYWxsZWQuCi0gIGJvb2wgUXVlcnlBbmRSZXNldEhhc0NvbnN1bWVkRnJhbWVzKCk7Ci0KLSAgLy8gUmV0dXJuIHRoZSB2YWx1ZSBvZiB8ZHJvcHBlZF9mcmFtZXNffCBhbmQgcmVzZXQgaXQgdG8gMC4KLSAgaW50IFJlc2V0QW5kUmV0dXJuRHJvcHBlZEZyYW1lcygpOwotCi0gcHJpdmF0ZToKLSAgdm9pZCBHZXRNZWRpYVRpbWVBbmRTZWVraW5nU3RhdGVfTG9ja2VkKGJhc2U6OlRpbWVEZWx0YSogbWVkaWFfdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGlzX3NlZWtpbmcpIGNvbnN0OwotCi0gIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gcHVuY2hfb3V0XzsKLQotICBtdXRhYmxlIGJhc2U6OkxvY2sgZnJhbWVzX2xvY2tfOwotICBNZWRpYVRpbWVBbmRTZWVraW5nU3RhdGVDQiBtZWRpYV90aW1lX2FuZF9zZWVraW5nX3N0YXRlX2NiXzsKLSAgc3RkOjp2ZWN0b3I8c2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiA+IGZyYW1lc187Ci0gIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gY3VycmVudF9mcmFtZV87Ci0gIGJvb2wgaGFzX2NvbnN1bWVkX2ZyYW1lc187Ci0gIGludCBkcm9wcGVkX2ZyYW1lc187Ci0KLSNpZiAhZGVmaW5lZChfX0xCX1NIRUxMX19GT1JfUkVMRUFTRV9fKQotICBpbnQgbWF4X2RlbGF5X2luX21pY3Jvc2Vjb25kc187Ci0jZW5kaWYgIC8vICFkZWZpbmVkKF9fTEJfU0hFTExfX0ZPUl9SRUxFQVNFX18pCi0KLSAgT3V0cHV0TW9kZSBvdXRwdXRfbW9kZV87Ci0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAotICBHZXRDdXJyZW50U2JEZWNvZGVUYXJnZXRGdW5jdGlvbiBnZXRfY3VycmVudF9zYl9kZWNvZGVfdGFyZ2V0X2Z1bmN0aW9uXzsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTaGVsbFZpZGVvRnJhbWVQcm92aWRlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX1NIRUxMX1ZJREVPX0ZSQU1FX1BST1ZJREVSX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9zaW1kL2NvbnZlcnRfcmdiX3RvX3l1di5oIGIvc3JjL21lZGlhL2Jhc2Uvc2ltZC9jb252ZXJ0X3JnYl90b195dXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNmZTExNC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9zaW1kL2NvbnZlcnRfcmdiX3RvX3l1di5oCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDExIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9CQVNFX1NJTURfQ09OVkVSVF9SR0JfVE9fWVVWX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfU0lNRF9DT05WRVJUX1JHQl9UT19ZVVZfSF8KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UveXV2X2NvbnZlcnQuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gQ29udmVydHMgYW4gQVJHQiBpbWFnZSB0byBhIFlWMTIgaW1hZ2UuIFRoaXMgZnVuY3Rpb24gY2FsbHMgQVNNIGZ1bmN0aW9ucwotLy8gaW1wbGVtZW50ZWQgaW4gImNvbnZlcnRfcmdiX3RvX3l1dl9zc3NlMy5hc20iIHRvIGNvbnZlcnQgdGhlIHNwZWNpZmllZCBBUkdCCi0vLyBpbWFnZSB0byBhIFlWMTIgaW1hZ2UuCi12b2lkIENvbnZlcnRSR0IzMlRvWVVWX1NTU0UzKGNvbnN0IHVpbnQ4KiByZ2JmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHlwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHVwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHZwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmdic3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeXN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHV2c3RyaWRlKTsKLQotLy8gQ29udmVydHMgYW4gUkdCIGltYWdlIHRvIGEgWVYxMiBpbWFnZS4gVGhpcyBmdW5jdGlvbiBpcyBhbG1vc3Qgc2FtZSBhcwotLy8gQ29udmVydFJHQjMyVG9ZVVZfU1NTRTMgZXhjZXB0IGl0cyBmaXJzdCBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gUkdCIHBpeGVscy4KLXZvaWQgQ29udmVydFJHQjI0VG9ZVVZfU1NTRTMoY29uc3QgdWludDgqIHJnYmZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogeXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdnBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZ2JzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5c3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXZzdHJpZGUpOwotCi0vLyBTU0UyIHZlcnNpb24gb2YgY29udmVydGluZyBSR0JBIHRvIFlWMTIuCi12b2lkIENvbnZlcnRSR0IzMlRvWVVWX1NTRTIoY29uc3QgdWludDgqIHJnYmZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB5cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHVwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdnBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZ2JzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHV2c3RyaWRlKTsKLQotLy8gVGhpcyBpcyBhIEMgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBhYm92ZSByb3V0aW5lLgotLy8gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiB1bml0IHRlc3QuCi0vLyBUT0RPKGhjbGFtKTogU2hvdWxkIHVzZSB0aGlzIGFzIHRoZSBDIHZlcnNpb24gb2YgUkdCIHRvIFlVVi4KLXZvaWQgQ29udmVydFJHQjMyVG9ZVVZfU1NFMl9SZWZlcmVuY2UoY29uc3QgdWludDgqIHJnYmZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogeXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdnBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZ2JzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5c3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXZzdHJpZGUpOwotCi0vLyBDIHZlcnNpb24gb2YgY29udmVydGluZyBSR0JBIHRvIFlWMTIuCi12b2lkIENvbnZlcnRSR0IzMlRvWVVWX0MoY29uc3QgdWludDgqIHJnYmZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB5cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHVwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdnBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZ2JzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHV2c3RyaWRlKTsKLQotLy8gQyB2ZXJzaW9uIG9mIGNvbnZlcnRpbmcgUkdCMjQgdG8gWVYxMi4KLXZvaWQgQ29udmVydFJHQjI0VG9ZVVZfQyhjb25zdCB1aW50OCogcmdiZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHlwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB2cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJnYnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeXN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXZzdHJpZGUpOwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX1NJTURfQ09OVkVSVF9SR0JfVE9fWVVWX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9zaW1kL2NvbnZlcnRfcmdiX3RvX3l1dl9jLmNjIGIvc3JjL21lZGlhL2Jhc2Uvc2ltZC9jb252ZXJ0X3JnYl90b195dXZfYy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU0YzczMS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9zaW1kL2NvbnZlcnRfcmdiX3RvX3l1dl9jLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDExIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2ltZC9jb252ZXJ0X3JnYl90b195dXYuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotc3RhdGljIGludCBjbGlwX2J5dGUoaW50IHgpIHsKLSAgaWYgKHggPiAyNTUpCi0gICAgcmV0dXJuIDI1NTsKLSAgZWxzZSBpZiAoeCA8IDApCi0gICAgcmV0dXJuIDA7Ci0gIGVsc2UKLSAgICByZXR1cm4geDsKLX0KLQotdm9pZCBDb252ZXJ0UkdCMzJUb1lVVl9DKGNvbnN0IHVpbnQ4KiByZ2JmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogeXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB1cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHZwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmdic3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5c3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1dnN0cmlkZSkgewotICBmb3IgKGludCBpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCB3aWR0aDsgKytqKSB7Ci0gICAgICAvLyBTaW5jZSB0aGUgaW5wdXQgcGl4ZWwgZm9ybWF0IGlzIFJHQjMyLCB0aGVyZSBhcmUgNCBieXRlcyBwZXIgcGl4ZWwuCi0gICAgICBjb25zdCB1aW50OCogcGl4ZWwgPSByZ2JmcmFtZSArIDQgKiBqOwotICAgICAgeXBsYW5lW2pdID0gY2xpcF9ieXRlKCgocGl4ZWxbMl0gKiA2NiArIHBpeGVsWzFdICogMTI5ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxbMF0gKiAyNSArIDEyOCkgPj4gOCkgKyAxNik7Ci0gICAgICBpZiAoaSAlIDIgPT0gMCAmJiBqICUgMiA9PSAwKSB7Ci0gICAgICAgIHVwbGFuZVtqIC8gMl0gPSBjbGlwX2J5dGUoKChwaXhlbFsyXSAqIC0zOCArIHBpeGVsWzFdICogLTc0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxbMF0gKiAxMTIgKyAxMjgpID4+IDgpICsgMTI4KTsKLSAgICAgICAgdnBsYW5lW2ogLyAyXSA9IGNsaXBfYnl0ZSgoKHBpeGVsWzJdICogMTEyICsgcGl4ZWxbMV0gKiAtOTQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxbMF0gKiAtMTggKyAxMjgpID4+IDgpICsgMTI4KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZ2JmcmFtZSArPSByZ2JzdHJpZGU7Ci0gICAgeXBsYW5lICs9IHlzdHJpZGU7Ci0gICAgaWYgKGkgJSAyID09IDApIHsKLSAgICAgIHVwbGFuZSArPSB1dnN0cmlkZTsKLSAgICAgIHZwbGFuZSArPSB1dnN0cmlkZTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDb252ZXJ0UkdCMjRUb1lVVl9DKGNvbnN0IHVpbnQ4KiByZ2JmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogeXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB1cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHZwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmdic3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5c3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1dnN0cmlkZSkgewotICBmb3IgKGludCBpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCB3aWR0aDsgKytqKSB7Ci0gICAgICAvLyBTaW5jZSB0aGUgaW5wdXQgcGl4ZWwgZm9ybWF0IGlzIFJHQjI0LCB0aGVyZSBhcmUgMyBieXRlcyBwZXIgcGl4ZWwuCi0gICAgICBjb25zdCB1aW50OCogcGl4ZWwgPSByZ2JmcmFtZSArIDMgKiBqOwotICAgICAgeXBsYW5lW2pdID0gY2xpcF9ieXRlKCgocGl4ZWxbMl0gKiA2NiArIHBpeGVsWzFdICogMTI5ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsWzBdICogMjUgKyAxMjgpID4+IDgpICsgMTYpOwotICAgICAgaWYgKGkgJSAyID09IDAgJiYgaiAlIDIgPT0gMCkgewotICAgICAgICB1cGxhbmVbaiAvIDJdID0gY2xpcF9ieXRlKCgocGl4ZWxbMl0gKiAtMzggKyBwaXhlbFsxXSAqIC03NCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbFswXSAqIDExMiArIDEyOCkgPj4gOCkgKyAxMjgpOwotICAgICAgICB2cGxhbmVbaiAvIDJdID0gY2xpcF9ieXRlKCgocGl4ZWxbMl0gKiAxMTIgKyBwaXhlbFsxXSAqIC05NCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbFswXSAqIC0xOCArIDEyOCkgPj4gOCkgKyAxMjgpOwotICAgICAgfQotICAgIH0KLQotICAgIHJnYmZyYW1lICs9IHJnYnN0cmlkZTsKLSAgICB5cGxhbmUgKz0geXN0cmlkZTsKLSAgICBpZiAoaSAlIDIgPT0gMCkgewotICAgICAgdXBsYW5lICs9IHV2c3RyaWRlOwotICAgICAgdnBsYW5lICs9IHV2c3RyaWRlOwotICAgIH0KLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3NpbWQvY29udmVydF9yZ2JfdG9feXV2X3NzZTIuY2MgYi9zcmMvbWVkaWEvYmFzZS9zaW1kL2NvbnZlcnRfcmdiX3RvX3l1dl9zc2UyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTlhMmZlLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3NpbWQvY29udmVydF9yZ2JfdG9feXV2X3NzZTIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzOTcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgImJ1aWxkL2J1aWxkX2NvbmZpZy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2ltZC9jb252ZXJ0X3JnYl90b195dXYuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3NpbWQveXV2X3RvX3JnYl90YWJsZS5oIgotCi0jaWYgZGVmaW5lZChDT01QSUxFUl9NU1ZDKQotI2luY2x1ZGUgPGludHJpbi5oPgotI2Vsc2UKLSNpbmNsdWRlIDxtbWludHJpbi5oPgotI2luY2x1ZGUgPGVtbWludHJpbi5oPgotI2VuZGlmCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLSNkZWZpbmUgRklYX1NISUZUIDEyCi0jZGVmaW5lIEZJWCh4KSAoKHgpICogKDEgPDwgRklYX1NISUZUKSkKLQotLy8gRGVmaW5lIGEgY29udmVuaWVudCBtYWNybyB0byBkbyBzdGF0aWMgY2FzdC4KLSNkZWZpbmUgSU5UMTZfRklYKHgpIHN0YXRpY19jYXN0PGludDE2PihGSVgoeCkpCi0KLVNJTURfQUxJR05FRChjb25zdCBpbnQxNiBDb252ZXJ0UkdCQVRvWVVWX2tUYWJsZVs4ICogM10pID0gewotICBJTlQxNl9GSVgoMC4wOTgpLCBJTlQxNl9GSVgoMC41MDQpLCBJTlQxNl9GSVgoMC4yNTcpLCAwLAotICBJTlQxNl9GSVgoMC4wOTgpLCBJTlQxNl9GSVgoMC41MDQpLCBJTlQxNl9GSVgoMC4yNTcpLCAwLAotICBJTlQxNl9GSVgoMC40MzkpLCAtSU5UMTZfRklYKDAuMjkxKSwgLUlOVDE2X0ZJWCgwLjE0OCksIDAsCi0gIElOVDE2X0ZJWCgwLjQzOSksIC1JTlQxNl9GSVgoMC4yOTEpLCAtSU5UMTZfRklYKDAuMTQ4KSwgMCwKLSAgLUlOVDE2X0ZJWCgwLjA3MSksIC1JTlQxNl9GSVgoMC4zNjgpLCBJTlQxNl9GSVgoMC40MzkpLCAwLAotICAtSU5UMTZfRklYKDAuMDcxKSwgLUlOVDE2X0ZJWCgwLjM2OCksIElOVDE2X0ZJWCgwLjQzOSksIDAsCi19OwotCi0jdW5kZWYgSU5UMTZfRklYCi0KLS8vIFRoaXMgaXMgdGhlIGZpbmFsIG9mZnNldCBmb3IgdGhlIGNvbnZlcnNpb24gZnJvbSBzaWduZWQgeXV2IHZhbHVlcyB0bwotLy8gdW5zaWduZWQgdmFsdWVzLiBJdCBpcyBhcnJhbmdlZCBzbyB0aGF0IG9mZnNldCBvZiAxNiBpcyBhcHBsaWVkIHRvIFkKLS8vIGNvbXBvbmVudHMgYW5kIDEyOCBpcyBhZGRlZCB0byBVViBjb21wb25lbnRzIGZvciAyIHBpeGVscy4KLVNJTURfQUxJR05FRChjb25zdCBpbnQzMiBrWU9mZnNldFs0XSkgPSB7MTYsIDE2LCAxNiwgMTZ9OwotCi1zdGF0aWMgaW5saW5lIGludCBDbGFtcChpbnQgdmFsdWUpIHsKLSAgaWYgKHZhbHVlIDwgMCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKHZhbHVlID4gMjU1KQotICAgIHJldHVybiAyNTU7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgUkdCVG9ZKGludCByLCBpbnQgZywgaW50IGIpIHsKLSAgaW50IHkgPSBDb252ZXJ0UkdCQVRvWVVWX2tUYWJsZVswXSAqIGIgKwotICAgICAgQ29udmVydFJHQkFUb1lVVl9rVGFibGVbMV0gKiBnICsKLSAgICAgIENvbnZlcnRSR0JBVG9ZVVZfa1RhYmxlWzJdICogcjsKLSAgeSA+Pj0gRklYX1NISUZUOwotICByZXR1cm4gQ2xhbXAoeSArIDE2KTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgUkdCVG9VKGludCByLCBpbnQgZywgaW50IGIsIGludCBzaGlmdCkgewotICBpbnQgdSA9IENvbnZlcnRSR0JBVG9ZVVZfa1RhYmxlWzhdICogYiArCi0gICAgICBDb252ZXJ0UkdCQVRvWVVWX2tUYWJsZVs5XSAqIGcgKwotICAgICAgQ29udmVydFJHQkFUb1lVVl9rVGFibGVbMTBdICogcjsKLSAgdSA+Pj0gRklYX1NISUZUICsgc2hpZnQ7Ci0gIHJldHVybiBDbGFtcCh1ICsgMTI4KTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgUkdCVG9WKGludCByLCBpbnQgZywgaW50IGIsIGludCBzaGlmdCkgewotICBpbnQgdiA9IENvbnZlcnRSR0JBVG9ZVVZfa1RhYmxlWzE2XSAqIGIgKwotICAgICAgQ29udmVydFJHQkFUb1lVVl9rVGFibGVbMTddICogZyArCi0gICAgICBDb252ZXJ0UkdCQVRvWVVWX2tUYWJsZVsxOF0gKiByOwotICB2ID4+PSBGSVhfU0hJRlQgKyBzaGlmdDsKLSAgcmV0dXJuIENsYW1wKHYgKyAxMjgpOwotfQotCi0jZGVmaW5lIENPTlZFUlRfWShyZ2JfYnVmLCB5X2J1ZikgXAotICBiID0gKnJnYl9idWYrKzsgXAotICBnID0gKnJnYl9idWYrKzsgXAotICByID0gKnJnYl9idWYrKzsgXAotICArK3JnYl9idWY7ICAgICAgXAotICBzdW1fYiArPSBiOyAgICAgXAotICBzdW1fZyArPSBnOyAgICAgXAotICBzdW1fciArPSByOyAgICAgXAotICAqeV9idWYrKyA9IFJHQlRvWShyLCBnLCBiKTsKLQotc3RhdGljIGlubGluZSB2b2lkIENvbnZlcnRSR0JUb1lVVl9WMkgyKGNvbnN0IHVpbnQ4KiByZ2JfYnVmXzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHJnYl9idWZfMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogeV9idWZfMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogeV9idWZfMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdV9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHZfYnVmKSB7Ci0gIGludCBzdW1fYiA9IDA7Ci0gIGludCBzdW1fZyA9IDA7Ci0gIGludCBzdW1fciA9IDA7Ci0gIGludCByLCBnLCBiOwotCi0KLQotICBDT05WRVJUX1kocmdiX2J1Zl8xLCB5X2J1Zl8xKTsKLSAgQ09OVkVSVF9ZKHJnYl9idWZfMSwgeV9idWZfMSk7Ci0gIENPTlZFUlRfWShyZ2JfYnVmXzIsIHlfYnVmXzIpOwotICBDT05WRVJUX1kocmdiX2J1Zl8yLCB5X2J1Zl8yKTsKLSAgKnVfYnVmKysgPSBSR0JUb1Uoc3VtX3IsIHN1bV9nLCBzdW1fYiwgMik7Ci0gICp2X2J1ZisrID0gUkdCVG9WKHN1bV9yLCBzdW1fZywgc3VtX2IsIDIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgQ29udmVydFJHQlRvWVVWX1YySDEoY29uc3QgdWludDgqIHJnYl9idWZfMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogcmdiX2J1Zl8yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB5X2J1Zl8xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB5X2J1Zl8yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB1X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdl9idWYpIHsKLSAgaW50IHN1bV9iID0gMDsKLSAgaW50IHN1bV9nID0gMDsKLSAgaW50IHN1bV9yID0gMDsKLSAgaW50IHIsIGcsIGI7Ci0KLSAgQ09OVkVSVF9ZKHJnYl9idWZfMSwgeV9idWZfMSk7Ci0gIENPTlZFUlRfWShyZ2JfYnVmXzIsIHlfYnVmXzIpOwotICAqdV9idWYrKyA9IFJHQlRvVShzdW1fciwgc3VtX2csIHN1bV9iLCAxKTsKLSAgKnZfYnVmKysgPSBSR0JUb1Yoc3VtX3IsIHN1bV9nLCBzdW1fYiwgMSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBDb252ZXJ0UkdCVG9ZVVZfVjFIMihjb25zdCB1aW50OCogcmdiX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB5X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB1X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB2X2J1ZikgewotICBpbnQgc3VtX2IgPSAwOwotICBpbnQgc3VtX2cgPSAwOwotICBpbnQgc3VtX3IgPSAwOwotICBpbnQgciwgZywgYjsKLQotICBDT05WRVJUX1kocmdiX2J1ZiwgeV9idWYpOwotICBDT05WRVJUX1kocmdiX2J1ZiwgeV9idWYpOwotICAqdV9idWYrKyA9IFJHQlRvVShzdW1fciwgc3VtX2csIHN1bV9iLCAxKTsKLSAgKnZfYnVmKysgPSBSR0JUb1Yoc3VtX3IsIHN1bV9nLCBzdW1fYiwgMSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBDb252ZXJ0UkdCVG9ZVVZfVjFIMShjb25zdCB1aW50OCogcmdiX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB5X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB1X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB2X2J1ZikgewotICBpbnQgc3VtX2IgPSAwOwotICBpbnQgc3VtX2cgPSAwOwotICBpbnQgc3VtX3IgPSAwOwotICBpbnQgciwgZywgYjsKLQotICBDT05WRVJUX1kocmdiX2J1ZiwgeV9idWYpOwotICAqdV9idWYrKyA9IFJHQlRvVShyLCBnLCBiLCAwKTsKLSAgKnZfYnVmKysgPSBSR0JUb1YociwgZywgYiwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIENvbnZlcnRSR0IzMlRvWVVWUm93X1NTRTIoY29uc3QgdWludDgqIHJnYl9idWZfMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHJnYl9idWZfMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHlfYnVmXzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB5X2J1Zl8yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdV9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB2X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKSB7Ci0gIHdoaWxlICh3aWR0aCA+PSA0KSB7Ci0gICAgLy8gTmFtZSBmb3IgdGhlIFkgcGl4ZWxzOgotICAgIC8vIFJvdyAxOiBhIGIgYyBkCi0gICAgLy8gUm93IDI6IGUgZiBnIGgKLSAgICAvLwotICAgIC8vIEZpcnN0IHJvdyA0IHBpeGVscy4KLSAgICBfX20xMjhpIHJnYl9yb3dfMSA9IF9tbV9sb2FkdV9zaTEyOCgKLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX20xMjhpKj4ocmdiX2J1Zl8xKSk7Ci0gICAgX19tMTI4aSB6ZXJvXzEgPSBfbW1feG9yX3NpMTI4KHJnYl9yb3dfMSwgcmdiX3Jvd18xKTsKLQotICAgIF9fbTEyOGkgeV90YWJsZSA9IF9tbV9sb2FkX3NpMTI4KAotICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IF9fbTEyOGkqPihDb252ZXJ0UkdCQVRvWVVWX2tUYWJsZSkpOwotCi0gICAgX19tMTI4aSByZ2JfYV9iID0gX21tX3VucGFja2hpX2VwaTgocmdiX3Jvd18xLCB6ZXJvXzEpOwotICAgIHJnYl9hX2IgPSBfbW1fbWFkZF9lcGkxNihyZ2JfYV9iLCB5X3RhYmxlKTsKLQotICAgIF9fbTEyOGkgcmdiX2NfZCA9IF9tbV91bnBhY2tsb19lcGk4KHJnYl9yb3dfMSwgemVyb18xKTsKLSAgICByZ2JfY19kID0gX21tX21hZGRfZXBpMTYocmdiX2NfZCwgeV90YWJsZSk7Ci0KLSAgICAvLyBEbyBhIGNyYXpoIHNodWZmbGUgc28gdGhhdCB3ZSBnZXQ6Ci0gICAgLy8gIHYtLS0tLS0tLS0tLS0gTXVsdGlwbHkgQWRkCi0gICAgLy8gQkc6IGEgYiBjIGQKLSAgICAvLyBBMDogYSBiIGMgZAotICAgIF9fbTEyOGkgYmdfYWJjZCA9IF9tbV9jYXN0cHNfc2kxMjgoCi0gICAgICAgIF9tbV9zaHVmZmxlX3BzKAotICAgICAgICAgICAgX21tX2Nhc3RzaTEyOF9wcyhyZ2JfY19kKSwKLSAgICAgICAgICAgIF9tbV9jYXN0c2kxMjhfcHMocmdiX2FfYiksCi0gICAgICAgICAgICAoMyA8PCA2KSB8ICgxIDw8IDQpIHwgKDMgPDwgMikgfCAxKSk7Ci0gICAgX19tMTI4aSByX2FiY2QgPSBfbW1fY2FzdHBzX3NpMTI4KAotICAgICAgICBfbW1fc2h1ZmZsZV9wcygKLSAgICAgICAgICAgIF9tbV9jYXN0c2kxMjhfcHMocmdiX2NfZCksCi0gICAgICAgICAgICBfbW1fY2FzdHNpMTI4X3BzKHJnYl9hX2IpLAotICAgICAgICAgICAgKDIgPDwgNikgfCAoMiA8PCAyKSkpOwotICAgIF9fbTEyOGkgeV9hYmNkID0gX21tX2FkZF9lcGkzMihiZ19hYmNkLCByX2FiY2QpOwotCi0gICAgLy8gRG93biBzaGlmdCBiYWNrIHRvIDhiaXRzIHJhbmdlLgotICAgIF9fbTEyOGkgeV9vZmZzZXQgPSBfbW1fbG9hZF9zaTEyOCgKLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX20xMjhpKj4oa1lPZmZzZXQpKTsKLSAgICB5X2FiY2QgPSBfbW1fc3JhaV9lcGkzMih5X2FiY2QsIEZJWF9TSElGVCk7Ci0gICAgeV9hYmNkID0gX21tX2FkZF9lcGkzMih5X2FiY2QsIHlfb2Zmc2V0KTsKLSAgICB5X2FiY2QgPSBfbW1fcGFja3NfZXBpMzIoeV9hYmNkLCB5X2FiY2QpOwotICAgIHlfYWJjZCA9IF9tbV9wYWNrdXNfZXBpMTYoeV9hYmNkLCB5X2FiY2QpOwotICAgICpyZWludGVycHJldF9jYXN0PHVpbnQzMio+KHlfYnVmXzEpID0gX21tX2N2dHNpMTI4X3NpMzIoeV9hYmNkKTsKLSAgICB5X2J1Zl8xICs9IDQ7Ci0KLSAgICAvLyBTZWNvbmQgcm93IDQgcGl4ZWxzLgotICAgIF9fbTEyOGkgcmdiX3Jvd18yID0gX21tX2xvYWR1X3NpMTI4KAotICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IF9fbTEyOGkqPihyZ2JfYnVmXzIpKTsKLSAgICBfX20xMjhpIHplcm9fMiA9IF9tbV94b3Jfc2kxMjgocmdiX3Jvd18yLCByZ2Jfcm93XzIpOwotICAgIF9fbTEyOGkgcmdiX2VfZiA9IF9tbV91bnBhY2toaV9lcGk4KHJnYl9yb3dfMiwgemVyb18yKTsKLSAgICBfX20xMjhpIHJnYl9nX2ggPSBfbW1fdW5wYWNrbG9fZXBpOChyZ2Jfcm93XzIsIHplcm9fMik7Ci0KLSAgICAvLyBBZGQgdHdvIHJvd3MgdG9nZXRoZXIuCi0gICAgX19tMTI4aSByZ2JfYWVfYmYgPQotICAgICAgICBfbW1fYWRkX2VwaTE2KF9tbV91bnBhY2toaV9lcGk4KHJnYl9yb3dfMSwgemVyb18yKSwgcmdiX2VfZik7Ci0gICAgX19tMTI4aSByZ2JfY2dfZGggPQotICAgICAgICBfbW1fYWRkX2VwaTE2KF9tbV91bnBhY2tsb19lcGk4KHJnYl9yb3dfMSwgemVyb18yKSwgcmdiX2dfaCk7Ci0KLSAgICAvLyBNdWx0aXBseSBhZGQgbGlrZSB0aGUgcHJldmlvdXMgcm93LgotICAgIHJnYl9lX2YgPSBfbW1fbWFkZF9lcGkxNihyZ2JfZV9mLCB5X3RhYmxlKTsKLSAgICByZ2JfZ19oID0gX21tX21hZGRfZXBpMTYocmdiX2dfaCwgeV90YWJsZSk7Ci0KLSAgICBfX20xMjhpIGJnX2VmZ2ggPSBfbW1fY2FzdHBzX3NpMTI4KAotICAgICAgICBfbW1fc2h1ZmZsZV9wcyhfbW1fY2FzdHNpMTI4X3BzKHJnYl9nX2gpLAotICAgICAgICAgICAgICAgICAgICAgICBfbW1fY2FzdHNpMTI4X3BzKHJnYl9lX2YpLAotICAgICAgICAgICAgICAgICAgICAgICAoMyA8PCA2KSB8ICgxIDw8IDQpIHwgKDMgPDwgMikgfCAxKSk7Ci0gICAgX19tMTI4aSByX2VmZ2ggPSBfbW1fY2FzdHBzX3NpMTI4KAotICAgICAgICBfbW1fc2h1ZmZsZV9wcyhfbW1fY2FzdHNpMTI4X3BzKHJnYl9nX2gpLAotICAgICAgICAgICAgICAgICAgICAgICBfbW1fY2FzdHNpMTI4X3BzKHJnYl9lX2YpLAotICAgICAgICAgICAgICAgICAgICAgICAoMiA8PCA2KSB8ICgyIDw8IDIpKSk7Ci0gICAgX19tMTI4aSB5X2VmZ2ggPSBfbW1fYWRkX2VwaTMyKGJnX2VmZ2gsIHJfZWZnaCk7Ci0gICAgeV9lZmdoID0gX21tX3NyYWlfZXBpMzIoeV9lZmdoLCBGSVhfU0hJRlQpOwotICAgIHlfZWZnaCA9IF9tbV9hZGRfZXBpMzIoeV9lZmdoLCB5X29mZnNldCk7Ci0gICAgeV9lZmdoID0gX21tX3BhY2tzX2VwaTMyKHlfZWZnaCwgeV9lZmdoKTsKLSAgICB5X2VmZ2ggPSBfbW1fcGFja3VzX2VwaTE2KHlfZWZnaCwgeV9lZmdoKTsKLSAgICAqcmVpbnRlcnByZXRfY2FzdDx1aW50MzIqPih5X2J1Zl8yKSA9IF9tbV9jdnRzaTEyOF9zaTMyKHlfZWZnaCk7Ci0gICAgeV9idWZfMiArPSA0OwotCi0gICAgX19tMTI4aSByZ2JfYWVfY2cgPSBfbW1fY2FzdHBzX3NpMTI4KAotICAgICAgICBfbW1fc2h1ZmZsZV9wcyhfbW1fY2FzdHNpMTI4X3BzKHJnYl9jZ19kaCksCi0gICAgICAgICAgICAgICAgICAgICAgIF9tbV9jYXN0c2kxMjhfcHMocmdiX2FlX2JmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgKDMgPDwgNikgfCAoMiA8PCA0KSB8ICgzIDw8IDIpIHwgMikpOwotICAgIF9fbTEyOGkgcmdiX2JmX2RoID0gX21tX2Nhc3Rwc19zaTEyOCgKLSAgICAgICAgX21tX3NodWZmbGVfcHMoX21tX2Nhc3RzaTEyOF9wcyhyZ2JfY2dfZGgpLAotICAgICAgICAgICAgICAgICAgICAgICBfbW1fY2FzdHNpMTI4X3BzKHJnYl9hZV9iZiksCi0gICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDYpIHwgKDEgPDwgMikpKTsKLQotICAgIC8vIFRoaXMgaXMgYSAyeDIgc3Vic2FtcGxpbmcgZm9yIDIgcGl4ZWxzLgotICAgIF9fbTEyOGkgcmdiX2FiZWZfY2RnaCA9IF9tbV9hZGRfZXBpMTYocmdiX2FlX2NnLCByZ2JfYmZfZGgpOwotCi0gICAgLy8gRG8gYSBtdWx0aXBseSBhZGQgd2l0aCBVIHRhYmxlLgotICAgIF9fbTEyOGkgdV9hX2IgPSBfbW1fbWFkZF9lcGkxNigKLSAgICAgICAgcmdiX2FiZWZfY2RnaCwKLSAgICAgICAgX21tX2xvYWRfc2kxMjgoCi0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IF9fbTEyOGkqPihDb252ZXJ0UkdCQVRvWVVWX2tUYWJsZSArIDgpKSk7Ci0gICAgdV9hX2IgPSBfbW1fYWRkX2VwaTMyKF9tbV9zaHVmZmxlX2VwaTMyKHVfYV9iLCAoKDMgPDwgMikgfCAxKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9zaHVmZmxlX2VwaTMyKHVfYV9iLCAoMiA8PCAyKSkpOwotICAgIC8vIFJpZ2h0IHNoaWZ0IDE0IGJlY2F1c2Ugb2YgMTIgZnJvbSBmaXhlZCBwb2ludCBhbmQgMiBmcm9tIHN1YnNhbXBsaW5nLgotICAgIHVfYV9iID0gX21tX3NyYWlfZXBpMzIodV9hX2IsIEZJWF9TSElGVCArIDIpOwotICAgIF9fbTEyOGkgdXZfb2Zmc2V0ID0gX21tX3NsbGlfZXBpMzIoeV9vZmZzZXQsIDMpOwotICAgIHVfYV9iID0gX21tX2FkZF9lcGkzMih1X2FfYiwgdXZfb2Zmc2V0KTsKLSAgICB1X2FfYiA9IF9tbV9wYWNrc19lcGkzMih1X2FfYiwgdV9hX2IpOwotICAgIHVfYV9iID0gX21tX3BhY2t1c19lcGkxNih1X2FfYiwgdV9hX2IpOwotICAgICpyZWludGVycHJldF9jYXN0PHVpbnQxNio+KHVfYnVmKSA9IF9tbV9leHRyYWN0X2VwaTE2KHVfYV9iLCAwKTsKLSAgICB1X2J1ZiArPSAyOwotCi0gICAgX19tMTI4aSB2X2FfYiA9IF9tbV9tYWRkX2VwaTE2KAotICAgICAgICByZ2JfYWJlZl9jZGdoLAotICAgICAgICBfbW1fbG9hZF9zaTEyOCgKLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgX19tMTI4aSo+KENvbnZlcnRSR0JBVG9ZVVZfa1RhYmxlICsgMTYpKSk7Ci0gICAgdl9hX2IgPSBfbW1fYWRkX2VwaTMyKF9tbV9zaHVmZmxlX2VwaTMyKHZfYV9iLCAoKDMgPDwgMikgfCAxKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9zaHVmZmxlX2VwaTMyKHZfYV9iLCAoMiA8PCAyKSkpOwotICAgIHZfYV9iID0gX21tX3NyYWlfZXBpMzIodl9hX2IsIEZJWF9TSElGVCArIDIpOwotICAgIHZfYV9iID0gX21tX2FkZF9lcGkzMih2X2FfYiwgdXZfb2Zmc2V0KTsKLSAgICB2X2FfYiA9IF9tbV9wYWNrc19lcGkzMih2X2FfYiwgdl9hX2IpOwotICAgIHZfYV9iID0gX21tX3BhY2t1c19lcGkxNih2X2FfYiwgdl9hX2IpOwotICAgICpyZWludGVycHJldF9jYXN0PHVpbnQxNio+KHZfYnVmKSA9IF9tbV9leHRyYWN0X2VwaTE2KHZfYV9iLCAwKTsKLSAgICB2X2J1ZiArPSAyOwotCi0gICAgcmdiX2J1Zl8xICs9IDE2OwotICAgIHJnYl9idWZfMiArPSAxNjsKLQotICAgIC8vIE1vdmUgZm9yd2FyZCBieSA0IHBpeGVscy4KLSAgICB3aWR0aCAtPSA0OwotICB9Ci0KLSAgLy8gSnVzdCB1c2UgQyBjb2RlIHRvIGNvbnZlcnQgdGhlIHJlbWFpbmluZyBwaXhlbHMuCi0gIGlmICh3aWR0aCA+PSAyKSB7Ci0gICAgQ29udmVydFJHQlRvWVVWX1YySDIocmdiX2J1Zl8xLCByZ2JfYnVmXzIsIHlfYnVmXzEsIHlfYnVmXzIsIHVfYnVmLCB2X2J1Zik7Ci0gICAgcmdiX2J1Zl8xICs9IDg7Ci0gICAgcmdiX2J1Zl8yICs9IDg7Ci0gICAgeV9idWZfMSArPSAyOwotICAgIHlfYnVmXzIgKz0gMjsKLSAgICArK3VfYnVmOwotICAgICsrdl9idWY7Ci0gICAgd2lkdGggLT0gMjsKLSAgfQotCi0gIGlmICh3aWR0aCkKLSAgICBDb252ZXJ0UkdCVG9ZVVZfVjJIMShyZ2JfYnVmXzEsIHJnYl9idWZfMiwgeV9idWZfMSwgeV9idWZfMiwgdV9idWYsIHZfYnVmKTsKLX0KLQotZXh0ZXJuIHZvaWQgQ29udmVydFJHQjMyVG9ZVVZfU1NFMihjb25zdCB1aW50OCogcmdiZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB5cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB1cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB2cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJnYnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1dnN0cmlkZSkgewotICB3aGlsZSAoaGVpZ2h0ID49IDIpIHsKLSAgICBDb252ZXJ0UkdCMzJUb1lVVlJvd19TU0UyKHJnYmZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiZnJhbWUgKyByZ2JzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5cGxhbmUgKyB5c3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOwotICAgIHJnYmZyYW1lICs9IDIgKiByZ2JzdHJpZGU7Ci0gICAgeXBsYW5lICs9IDIgKiB5c3RyaWRlOwotICAgIHVwbGFuZSArPSB1dnN0cmlkZTsKLSAgICB2cGxhbmUgKz0gdXZzdHJpZGU7Ci0gICAgaGVpZ2h0IC09IDI7Ci0gIH0KLQotICBpZiAoIWhlaWdodCkKLSAgICByZXR1cm47Ci0KLSAgLy8gSGFuZGxlIHRoZSBsYXN0IHJvdy4KLSAgd2hpbGUgKHdpZHRoID49IDIpIHsKLSAgICBDb252ZXJ0UkdCVG9ZVVZfVjFIMihyZ2JmcmFtZSwgeXBsYW5lLCB1cGxhbmUsIHZwbGFuZSk7Ci0gICAgcmdiZnJhbWUgKz0gODsKLSAgICB5cGxhbmUgKz0gMjsKLSAgICArK3VwbGFuZTsKLSAgICArK3ZwbGFuZTsKLSAgICB3aWR0aCAtPSAyOwotICB9Ci0KLSAgaWYgKHdpZHRoKQotICAgIENvbnZlcnRSR0JUb1lVVl9WMUgxKHJnYmZyYW1lLCB5cGxhbmUsIHVwbGFuZSwgdnBsYW5lKTsKLX0KLQotdm9pZCBDb252ZXJ0UkdCMzJUb1lVVl9TU0UyX1JlZmVyZW5jZShjb25zdCB1aW50OCogcmdiZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB5cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB1cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB2cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJnYnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1dnN0cmlkZSkgewotICB3aGlsZSAoaGVpZ2h0ID49IDIpIHsKLSAgICBpbnQgaSA9IDA7Ci0KLSAgICAvLyBDb252ZXJ0IGEgMngyIGJsb2NrLgotICAgIHdoaWxlIChpICsgMiA8PSB3aWR0aCkgewotICAgICAgQ29udmVydFJHQlRvWVVWX1YySDIocmdiZnJhbWUgKyBpICogNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYmZyYW1lICsgcmdic3RyaWRlICsgaSAqIDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB5cGxhbmUgKyBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeXBsYW5lICsgeXN0cmlkZSArIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1cGxhbmUgKyBpIC8gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwbGFuZSArIGkgLyAyKTsKLSAgICAgIGkgKz0gMjsKLSAgICB9Ci0KLSAgICAvLyBDb252ZXJ0IHRoZSBsYXN0IHBpeGVsIG9mIHR3byByb3dzLgotICAgIGlmIChpIDwgd2lkdGgpIHsKLSAgICAgIENvbnZlcnRSR0JUb1lVVl9WMkgxKHJnYmZyYW1lICsgaSAqIDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JmcmFtZSArIHJnYnN0cmlkZSArIGkgKiA0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeXBsYW5lICsgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHlwbGFuZSArIHlzdHJpZGUgKyBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBsYW5lICsgaSAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2cGxhbmUgKyBpIC8gMik7Ci0gICAgfQotCi0gICAgcmdiZnJhbWUgKz0gMiAqIHJnYnN0cmlkZTsKLSAgICB5cGxhbmUgKz0gMiAqIHlzdHJpZGU7Ci0gICAgdXBsYW5lICs9IHV2c3RyaWRlOwotICAgIHZwbGFuZSArPSB1dnN0cmlkZTsKLSAgICBoZWlnaHQgLT0gMjsKLSAgfQotCi0gIGlmICghaGVpZ2h0KQotICAgIHJldHVybjsKLQotICAvLyBIYW5kbGUgdGhlIGxhc3Qgcm93LgotICB3aGlsZSAod2lkdGggPj0gMikgewotICAgIENvbnZlcnRSR0JUb1lVVl9WMUgyKHJnYmZyYW1lLCB5cGxhbmUsIHVwbGFuZSwgdnBsYW5lKTsKLSAgICByZ2JmcmFtZSArPSA4OwotICAgIHlwbGFuZSArPSAyOwotICAgICsrdXBsYW5lOwotICAgICsrdnBsYW5lOwotICAgIHdpZHRoIC09IDI7Ci0gIH0KLQotICAvLyBIYW5kbGUgdGhlIGxhc3QgcGl4ZWwgaW4gdGhlIGxhc3Qgcm93LgotICBpZiAod2lkdGgpCi0gICAgQ29udmVydFJHQlRvWVVWX1YxSDEocmdiZnJhbWUsIHlwbGFuZSwgdXBsYW5lLCB2cGxhbmUpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3NpbWQvY29udmVydF9yZ2JfdG9feXV2X3Nzc2UzLmFzbSBiL3NyYy9tZWRpYS9iYXNlL3NpbWQvY29udmVydF9yZ2JfdG9feXV2X3Nzc2UzLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ0NWU5OC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9zaW1kL2NvbnZlcnRfcmdiX3RvX3l1dl9zc3NlMy5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwzMTcgKzAsMCBAQAotOyBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi07IFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLTsgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotJWluY2x1ZGUgIng4NmluYy5hc20iCi0KLTsKLTsgVGhpcyBmaWxlIHVzZXMgU1NFLCBTU0UyLCBTU0UzLCBhbmQgU1NTRTMsIHdoaWNoIGFyZSBzdXBwb3J0ZWQgYnkgYWxsIEFUT00KLTsgcHJvY2Vzc29ycy4KLTsKLSAgU0VDVElPTl9URVhUCi0gIENQVSAgICAgICBTU0UsIFNTRTMsIFNTRTMsIFNTU0UzCi0KLTsKLTsgWE1NIHJlZ2lzdGVycyByZXByZXNlbnRpbmcgY29uc3RhbnRzLiBXZSBtdXN0IG5vdCB1c2UgdGhlc2UgcmVnaXN0ZXJzIGFzCi07IGRlc3RpbmF0aW9uIG9wZXJhbmRzLgotOyBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpICs9IDQpIHsKLTsgICB4bW03LmJbaV0gPSAyNTsgIHhtbTcuYltpKzFdID0gMjsgICB4bW03LmJbaSsyXSA9IDY2OyAgeG1tNy5iW2krM10gPSAwOwotOyAgIHhtbTYuYltpXSA9IDA7ICAgeG1tNi5iW2krMV0gPSAxMjc7IHhtbTYuYltpKzJdID0gMDsgICB4bW02LmJbaSszXSA9IDA7Ci07ICAgeG1tNS5iW2ldID0gMTEyOyB4bW01LmJbaSsxXSA9IC03NDsgeG1tNS5iW2krMl0gPSAtMzg7IHhtbTUuYltpKzNdID0gMDsKLTsgICB4bW00LmJbaV0gPSAtMTg7IHhtbTQuYltpKzFdID0gLTk0OyB4bW00LmJbaSsyXSA9IDExMjsgeG1tNC5iW2krM10gPSAwOwotOyB9Ci07Ci0lZGVmaW5lIFhNTV9DT05TVF9ZMCAgICB4bW03Ci0lZGVmaW5lIFhNTV9DT05TVF9ZMSAgICB4bW02Ci0lZGVmaW5lIFhNTV9DT05TVF9VICAgICB4bW01Ci0lZGVmaW5lIFhNTV9DT05TVF9WICAgICB4bW00Ci0lZGVmaW5lIFhNTV9DT05TVF8xMjggICB4bW0zCi0KLTsKLTsgTE9BRF9YTU0gJTEgKHhtbSksICUyIChpbW0zMikKLTsgTG9hZHMgYW4gaW1tZWRpYXRlIHZhbHVlIHRvIGFuIFhNTSByZWdpc3Rlci4KLTsgICAlMS5kWzBdID0gJTEuZFsxXSA9ICAlMS5kWzJdID0gICUxLmRbM10gPSAlMjsKLTsKLSVtYWNybyBMT0FEX1hNTSAyCi0gIG1vdiAgICAgICBURU1QZCwgJTIKLSAgbW92ZCAgICAgICUxLCBURU1QZAotICBwc2h1ZmQgICAgJTEsICUxLCAwMDAwMDAwMEIKLSVlbmRtYWNybwotCi07Ci07IFVOUEFDS1JHQiAlMSAoeG1tKSwgJTIgKGltbTgpCi07IFVucGFja3Mgb25lIFJHQiBwaXhlbCBpbiB0aGUgc3BlY2lmaWVkIFhNTSByZWdpc3Rlci4KLTsgICBmb3IgKGludCBpID0gMTU7IGkgPiAlMjsgLS1pKSAlMS5iW2ldID0gJTEuYltpIC0gMV07Ci07ICAgJTEuYlslMl0gPSAwOwotOyAgIGZvciAoaW50IGkgPSAlMiAtIDE7IGkgPj0gMDsgLS1pKSAlMS5iW2ldID0gJTEuYltpXTsKLTsKLSVtYWNybyBVTlBBQ0tSR0IgMgotICBtb3ZkcWEgICAgeG1tMSwgJTEKLSAgcHNybGRxICAgIHhtbTEsICUyCi0gIHBzbGxkcSAgICB4bW0xLCAlMgotICBweG9yICAgICAgJTEsIHhtbTEKLSAgcHNsbGRxICAgIHhtbTEsIDEKLSAgcG9yICAgICAgICUxLCB4bW0xCi0lZW5kbWFjcm8KLQotOwotOyBSRUFEX0FSR0IgJTEgKHhtbSksICUyIChpbW0pCi07IFJlYWQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgQVJHQiAob3IgUkdCKSBwaXhlbHMgZnJvbSB0aGUgc291cmNlIGFuZCBzdG9yZQotOyB0aGVtIHRvIHRoZSBkZXN0aW5hdGlvbiB4bW0gcmVnaXN0ZXIuIElmIHRoZSBpbnB1dCBmb3JtYXQgaXMgUkdCLCB3ZSByZWFkIFJHQgotOyBwaXhlbHMgYW5kIGNvbnZlcnQgdGhlbSB0byBBUkdCIHBpeGVscy4gKEZvciB0aGlzIGNhc2UsIHRoZSBhbHBoYSB2YWx1ZXMgb2YKLTsgdGhlIG91dHB1dCBwaXhlbHMgYmVjb21lIDAuKQotOwotJW1hY3JvIFJFQURfQVJHQiAyCi0KLSVpZiBQSVhFTFNJWkUgPT0gNAotCi0gIDsgUmVhZCBBUkdCIHBpeGVscyBmcm9tIHRoZSBzb3VyY2UuIChUaGlzIG1hY3JvIGFzc3VtZXMgdGhlIGlucHV0IGJ1ZmZlciBtYXkKLSAgOyBub3QgYmUgYWxpZ25lZCB0byBhIDE2LWJ5dGUgYm91bmRhcnkuKQotJWlmICUyID09IDEKLSAgbW92ZCAgICAgICUxLCBEV09SRCBbQVJHQnEgKyBXSURUSHEgKiA0ICogMl0KLSVlbGlmICUyID09IDIKLSAgbW92cSAgICAgICUxLCBRV09SRCBbQVJHQnEgKyBXSURUSHEgKiA0ICogMl0KLSVlbGlmICUyID09IDQKLSAgbW92ZHF1ICAgICUxLCBEUVdPUkQgW0FSR0JxICsgV0lEVEhxICogNCAqIDJdCi0lZWxzZQotJWVycm9yIHVuc3VwcG9ydGVkIG51bWJlciBvZiBwaXhlbHMuCi0lZW5kaWYKLQotJWVsaWYgUElYRUxTSVpFID09IDMKLQotICA7IFJlYWQgUkdCIHBpeGVscyBmcm9tIHRoZSBzb3VyY2UgYW5kIGNvbnZlcnQgdGhlbSB0byBBUkdCIHBpeGVscy4KLSVpZiAlMiA9PSAxCi0gIDsgUmVhZCBvbmUgUkdCIHBpeGVsIGFuZCBjb252ZXJ0IGl0IHRvIG9uZSBBUkdCIHBpeGVsLgotICA7IFNhdmUgdGhlIFdJRFRIIHJlZ2lzdGVyIHRvIHhtbTEuIChUaGlzIG1hY3JvIG5lZWRzIHRvIGJyZWFrIGl0LikKLSAgTU9WcSAgICAgIHhtbTEsIFdJRFRIcQotCi0gIDsgT25jZSByZWFkIHRocmVlIGJ5dGVzIGZyb20gdGhlIHNvdXJjZSB0byBURU1QZCwgYW5kIGNvcHkgaXQgdG8gdGhlCi0gIDsgZGVzdGluYXRpb24geG1tIHJlZ2lzdGVyLgotICBsZWEgICAgICAgV0lEVEhxLCBbV0lEVEhxICsgV0lEVEhxICogMl0KLSAgbW92enggICAgIFRFTVBkLCBCWVRFIFtBUkdCcSArIFdJRFRIcSAqIDIgKyAyXQotICBzaGwgICAgICAgVEVNUGQsIDE2Ci0gIG1vdiAgICAgICBURU1QdywgV09SRCBbQVJHQnEgKyBXSURUSHEgKiAyXQotICBtb3ZkICAgICAgJTEsIFRFTVBkCi0KLSAgOyBSZXN0b3JlIHRoZSBXSURUSCByZWdpc3Rlci4KLSAgTU9WcSAgICAgIFdJRFRIcSwgeG1tMQotJWVsaWYgJTIgPT0gMgotICA7IFJlYWQgdHdvIFJHQiBwaXhlbHMgYW5kIGNvbnZlcnQgdGhlbSB0byB0d28gQVJHQiBwaXhlbHMuCi0gIDsgUmVhZCBzaXggYnl0ZXMgZnJvbSB0aGUgc291cmNlIHRvIHRoZSBkZXN0aW5hdGlvbiB4bW0gcmVnaXN0ZXIuCi0gIG1vdiAgICAgICBURU1QcSwgV0lEVEhxCi0gIGxlYSAgICAgICBURU1QcSwgW1RFTVBxICsgVEVNUHEgKiAyXQotICBtb3ZkICAgICAgJTEsIERXT1JEIFtBUkdCcSArIFRFTVBxICogMl0KLSAgcGluc3J3ICAgICUxLCBXT1JEIFtBUkdCcSArIFRFTVBxICogMiArIDRdLCAzCi0KLSAgOyBGaWxsIHRoZSBhbHBoYSB2YWx1ZXMgb2YgdGhlc2UgUkdCIHBpeGVscyB3aXRoIDAgYW5kIGNvbnZlcnQgdGhlbSB0byB0d28KLSAgOyBBUkdCIHBpeGVscy4KLSAgVU5QQUNLUkdCICUxLCAzCi0lZWxpZiAlMiA9PSA0Ci0gIDsgUmVhZCBmb3VyIFJHQiBwaXhlbHMgYW5kIGNvbnZlcnQgdGhlbSB0byBmb3VyIEFSR0IgcGl4ZWxzLgotICA7IFJlYWQgdHdlbHZlIGJ5dGVzIGZyb20gdGhlIHNvdXJjZSB0byB0aGUgZGVzdGluYXRpb24geG1tIHJlZ2lzdGVyLgotICBtb3YgICAgICAgVEVNUHEsIFdJRFRIcQotICBsZWEgICAgICAgVEVNUHEsIFtURU1QcSArIFRFTVBxICogMl0KLSAgbW92cSAgICAgICUxLCBRV09SRCBbQVJHQnEgKyBURU1QcSAqIDJdCi0gIG1vdmQgICAgICB4bW0xLCBEV09SRCBbQVJHQnEgKyBURU1QcSAqIDIgKyA4XQotICBzaHVmcHMgICAgJTEsIHhtbTEsIDAxMDAwMTAwQgotCi0gIDsgRmlsbCB0aGUgYWxwaGEgdmFsdWVzIG9mIHRoZXNlIFJHQiBwaXhlbHMgd2l0aCAwIGFuZCBjb252ZXJ0IHRoZW0gdG8gZm91cgotICA7IEFSR0IgcGl4ZWxzLgotICBVTlBBQ0tSR0IgJTEsIDMKLSAgVU5QQUNLUkdCICUxLCA0ICsgMwotICBVTlBBQ0tSR0IgJTEsIDQgKyA0ICsgMwotJWVsc2UKLSVlcnJvciB1bnN1cHBvcnRlZCBudW1iZXIgb2YgcGl4ZWxzLgotJWVuZGlmCi0KLSVlbHNlCi0lZXJyb3IgdW5zdXBwb3J0ZWQgUElYRUxTSVpFIHZhbHVlLgotJWVuZGlmCi0KLSVlbmRtYWNybwotCi07Ci07IENBTENfWSAlMSAoeG1tKSwgJTIgKHhtbSkKLTsgQ2FsY3VsYXRlcyBmb3VyIFkgdmFsdWVzIGZyb20gZm91ciBBUkdCIHBpeGVscyBzdG9yZWQgaW4gJTIuCi07ICAgJTEuYlswXSA9IFRvQnl0ZSgoMjUgKiBCKDApICsgMTI5ICogRygwKSArIDY2ICogUigwKSArIDEyOCkgLyAyNTYgKyAxNik7Ci07ICAgJTEuYlsxXSA9IFRvQnl0ZSgoMjUgKiBCKDEpICsgMTI5ICogRygxKSArIDY2ICogUigxKSArIDEyOCkgLyAyNTYgKyAxNik7Ci07ICAgJTEuYlsyXSA9IFRvQnl0ZSgoMjUgKiBCKDIpICsgMTI5ICogRygyKSArIDY2ICogUigyKSArIDEyOCkgLyAyNTYgKyAxNik7Ci07ICAgJTEuYlszXSA9IFRvQnl0ZSgoMjUgKiBCKDMpICsgMTI5ICogRygzKSArIDY2ICogUigzKSArIDEyOCkgLyAyNTYgKyAxNik7Ci07Ci0lbWFjcm8gQ0FMQ19ZIDIKLSAgOyBUbyBhdm9pZCBzaWduZWQgc2F0dXJhdGlvbiwgd2UgZGl2aWRlIHRoaXMgY29udmVyc2lvbiBmb3JtdWxhIGludG8gdHdvCi0gIDsgZm9ybXVsYWUgYW5kIHN0b3JlIHRoZWlyIHJlc3VsdHMgaW50byB0d28gWE1NIHJlZ2lzdGVycyAlMSBhbmQgeG1tMi4KLSAgOyAlMS53WzBdICAgPSAyNSAgKiAlMi5iWzBdICArIDIgICAqICUyLmJbMV0gICsgNjYgICogJTIuYlsyXSAgKyAwICogJTIuYlszXTsKLSAgOyAlMS53WzFdICAgPSAyNSAgKiAlMi5iWzRdICArIDIgICAqICUyLmJbNV0gICsgNjYgICogJTIuYls2XSAgKyAwICogJTIuYls3XTsKLSAgOyAlMS53WzJdICAgPSAyNSAgKiAlMi5iWzhdICArIDIgICAqICUyLmJbOV0gICsgNjYgICogJTIuYlsxMF0gKyAwICogJTIuYlsxMV07Ci0gIDsgJTEud1szXSAgID0gMjUgICogJTIuYlsxMl0gKyAyICAgKiAlMi5iWzEzXSArIDY2ICAqICUyLmJbMTRdICsgMCAqICUyLmJbMTVdOwotICA7IHhtbTIud1swXSA9IDAgICAqICUyLmJbMF0gICsgMTI3ICogJTIuYlsxXSAgKyAwICAgKiAlMi5iWzJdICArIDAgKiAlMi5iWzNdOwotICA7IHhtbTIud1sxXSA9IDAgICAqICUyLmJbNF0gICsgMTI3ICogJTIuYls1XSAgKyAwICAgKiAlMi5iWzZdICArIDAgKiAlMi5iWzddOwotICA7IHhtbTIud1syXSA9IDAgICAqICUyLmJbOF0gICsgMTI3ICogJTIuYls5XSAgKyAwICAgKiAlMi5iWzEwXSArIDAgKiAlMi5iWzExXTsKLSAgOyB4bW0yLndbM10gPSAwICAgKiAlMi5iWzEyXSArIDEyNyAqICUyLmJbMTNdICsgMCAgICogJTIuYlsxNF0gKyAwICogJTIuYlsxNV07Ci0gIG1vdmRxYSAgICAlMSwgJTIKLSAgcG1hZGR1YnN3ICUxLCBYTU1fQ09OU1RfWTAKLSAgcGhhZGRzdyAgICUxLCAlMQotICBtb3ZkcWEgICAgeG1tMiwgJTIKLSAgcG1hZGR1YnN3IHhtbTIsIFhNTV9DT05TVF9ZMQotICBwaGFkZHN3ICAgeG1tMiwgeG1tMgotCi0gIDsgJTEuYlswXSA9IFRvQnl0ZSgoJTEud1swXSArIHhtbTIud1swXSArIDEyOCkgLyAyNTYgKyAxNik7Ci0gIDsgJTEuYlsxXSA9IFRvQnl0ZSgoJTEud1sxXSArIHhtbTIud1sxXSArIDEyOCkgLyAyNTYgKyAxNik7Ci0gIDsgJTEuYlsyXSA9IFRvQnl0ZSgoJTEud1syXSArIHhtbTIud1syXSArIDEyOCkgLyAyNTYgKyAxNik7Ci0gIDsgJTEuYlszXSA9IFRvQnl0ZSgoJTEud1szXSArIHhtbTIud1szXSArIDEyOCkgLyAyNTYgKyAxNik7Ci0gIHBhZGR3ICAgICAlMSwgeG1tMgotICBtb3ZkcWEgICAgeG1tMiwgWE1NX0NPTlNUXzEyOAotICBwYWRkdyAgICAgJTEsIHhtbTIKLSAgcHNybHcgICAgICUxLCA4Ci0gIHBzcmx3ICAgICB4bW0yLCAzCi0gIHBhZGR3ICAgICAlMSwgeG1tMgotICBwYWNrdXN3YiAgJTEsICUxCi0lZW5kbWFjcm8KLQotOwotOyBJTklUX1VWICUxIChyMzIpLCAlMiAocmVnKSAlMyAoaW1tKQotOwotJW1hY3JvIElOSVRfVVYgMwotCi0laWYgU1VCU0FNUExJTkcgPT0gMSAmJiBMSU5FID09IDEKLSVpZiAlMyA9PSAxIHx8ICUzID09IDIKLSAgbW92enggICAgICUxLCBCWVRFIFslMiArIFdJRFRIcV0KLSVlbGlmICUzID09IDQKLSAgbW92enggICAgICUxLCBXT1JEIFslMiArIFdJRFRIcV0KLSVlbHNlCi0lZXJyb3IgdW5zdXBwb3J0ZWQgbnVtYmVyIG9mIHBpeGVscy4KLSVlbmRpZgotJWVuZGlmCi0KLSVlbmRtYWNybwotCi07Ci07IENBTENfVVYgJTEgKHhtbSksICUyICh4bW0pLCAlMyAoeG1tKSwgJTQgKHIzMikKLTsgQ2FsY3VsYXRlcyB0d28gVSAob3IgVikgdmFsdWVzIGZyb20gZm91ciBBUkdCIHBpeGVscyBzdG9yZWQgaW4gJTIuCi07IGlmICUzID09IFhNTV9DT05TVF9VCi07IGlmIChTVUJTQU1QTElORykgewotOyAgICUxLmJbMF0gPSBUb0J5dGUoKDExMiAqIEIoMCkgLSA3NCAqIEcoMCkgLSAzOCAqIFIoMCkgKyAxMjgpIC8gMjU2ICsgMTI4KTsKLTsgICAlMS5iWzBdID0gVG9CeXRlKCgxMTIgKiBCKDApIC0gNzQgKiBHKDApIC0gMzggKiBSKDApICsgMTI4KSAvIDI1NiArIDEyOCk7Ci07ICAgJTEuYlsxXSA9IFRvQnl0ZSgoMTEyICogQigyKSAtIDc0ICogRygyKSAtIDM4ICogUigyKSArIDEyOCkgLyAyNTYgKyAxMjgpOwotOyAgICUxLmJbMV0gPSBUb0J5dGUoKDExMiAqIEIoMikgLSA3NCAqIEcoMikgLSAzOCAqIFIoMikgKyAxMjgpIC8gMjU2ICsgMTI4KTsKLTsgfSBlbHNlIHsKLTsgICAlMS5iWzBdID0gVG9CeXRlKCgxMTIgKiBCKDApIC0gNzQgKiBHKDApIC0gMzggKiBSKDApICsgMTI4KSAvIDI1NiArIDEyOCk7Ci07ICAgJTEuYlsxXSA9IFRvQnl0ZSgoMTEyICogQigyKSAtIDc0ICogRygyKSAtIDM4ICogUigyKSArIDEyOCkgLyAyNTYgKyAxMjgpOwotOyB9Ci07IGlmICUzID09IFhNTV9DT05TVF9WCi07ICAgJTEuYlswXSA9IFRvQnl0ZSgoLTE4ICogQigwKSAtIDk0ICogRygwKSArIDExMiAqIFIoMCkgKyAxMjgpIC8gMjU2ICsgMTI4KTsKLTsgICAlMS5iWzFdID0gVG9CeXRlKCgtMTggKiBCKDIpIC0gOTQgKiBHKDIpICsgMTEyICogUigyKSArIDEyOCkgLyAyNTYgKyAxMjgpOwotOwotJW1hY3JvIENBTENfVVYgNAotICA7IGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7Ci0gIDsgICAlMS53W2ldID0gMDsKLSAgOyAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgKytqKQotICA7ICAgICAlMS53W2ldICs9ICUzLmJbaSAqIDQgKyBqXSArICUyLmJbaSAqIDQgKyBqXTsKLSAgOyB9Ci0gIG1vdmRxYSAgICAlMSwgJTIKLSAgcG1hZGR1YnN3ICUxLCAlMwotICBwaGFkZHN3ICAgJTEsICUxCi0KLSVpZiBTVUJTQU1QTElORyA9PSAxCi0gIDsgJTEud1swXSA9ICglMS53WzBdICsgJTEud1sxXSArIDEpIC8gMjsKLSAgOyAlMS53WzFdID0gKCUxLndbMV0gKyAlMS53WzBdICsgMSkgLyAyOwotICA7ICUxLndbMl0gPSAoJTEud1syXSArICUxLndbM10gKyAxKSAvIDI7Ci0gIDsgJTEud1szXSA9ICglMS53WzNdICsgJTEud1syXSArIDEpIC8gMjsKLSAgcHNodWZsdyAgIHhtbTIsICUxLCAxMDExMDAwMUIKLSAgcGF2Z3cgICAgICUxLCB4bW0yCi0lZW5kaWYKLQotICA7ICUxLmJbMF0gPSBUb0J5dGUoKCUxLndbMF0gKyAxMjgpIC8gMjU2ICsgMTI4KTsKLSAgOyAlMS5iWzFdID0gVG9CeXRlKCglMS53WzJdICsgMTI4KSAvIDI1NiArIDEyOCk7Ci0gIHBzaHVmbHcgICAlMSwgJTEsIDEwMDAxMDAwQgotICBwYWRkdyAgICAgJTEsIFhNTV9DT05TVF8xMjgKLSAgcHNyYXcgICAgICUxLCA4Ci0gIHBhZGR3ICAgICAlMSwgWE1NX0NPTlNUXzEyOAotICBwYWNrdXN3YiAgJTEsICUxCi0KLSVpZiBTVUJTQU1QTElORyA9PSAxICYmIExJTkUgPT0gMQotICA7ICUxLmJbMF0gPSAoJTEuYlswXSArICUzLmJbMF0gKyAxKSAvIDI7Ci0gIDsgJTEuYlsxXSA9ICglMS5iWzFdICsgJTMuYlsxXSArIDEpIC8gMjsKLSAgbW92ZCAgICAgIHhtbTIsICU0Ci0gIHBhdmdiICAgICAlMSwgeG1tMgotJWVuZGlmCi0lZW5kbWFjcm8KLQotOwotOyBleHRlcm4gIkMiIHZvaWQgQ29udmVydEFSR0JUb1lVVlJvd19TU1NFMyhjb25zdCB1aW50OCogYXJnYiwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHksCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB1LAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdiwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKTsKLTsKLSVkZWZpbmUgU1lNQk9MICAgICAgICAgIENvbnZlcnRBUkdCVG9ZVVZSb3dfU1NTRTMKLSVkZWZpbmUgUElYRUxTSVpFICAgICAgIDQKLSVkZWZpbmUgU1VCU0FNUExJTkcgICAgIDAKLSVkZWZpbmUgTElORSAgICAgICAgICAgIDAKLSVpbmNsdWRlICJjb252ZXJ0X3JnYl90b195dXZfc3NzZTMuaW5jIgotCi07Ci07IGV4dGVybiAiQyIgdm9pZCBDb252ZXJ0UkdCVG9ZVVZSb3dfU1NTRTMoY29uc3QgdWludDgqIHJnYiwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogeSwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdSwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdiwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpOwotOwotJWRlZmluZSBTWU1CT0wgICAgICAgICAgQ29udmVydFJHQlRvWVVWUm93X1NTU0UzCi0lZGVmaW5lIFBJWEVMU0laRSAgICAgICAzCi0lZGVmaW5lIFNVQlNBTVBMSU5HICAgICAwCi0lZGVmaW5lIExJTkUgICAgICAgICAgICAwCi0laW5jbHVkZSAiY29udmVydF9yZ2JfdG9feXV2X3Nzc2UzLmluYyIKLQotOwotOyBleHRlcm4gIkMiIHZvaWQgQ29udmVydEFSR0JUb1lVVkV2ZW5fU1NTRTMoY29uc3QgdWludDgqIGFyZ2IsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogeSwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB1LAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHYsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpOwotOwotJWRlZmluZSBTWU1CT0wgICAgICAgICAgQ29udmVydEFSR0JUb1lVVkV2ZW5fU1NTRTMKLSVkZWZpbmUgUElYRUxTSVpFICAgICAgIDQKLSVkZWZpbmUgU1VCU0FNUExJTkcgICAgIDEKLSVkZWZpbmUgTElORSAgICAgICAgICAgIDAKLSVpbmNsdWRlICJjb252ZXJ0X3JnYl90b195dXZfc3NzZTMuaW5jIgotCi07Ci07IGV4dGVybiAiQyIgdm9pZCBDb252ZXJ0QVJHQlRvWVVWT2RkX1NTU0UzKGNvbnN0IHVpbnQ4KiBhcmdiLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogeSwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHUsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB2LAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpOwotOwotJWRlZmluZSBTWU1CT0wgICAgICAgICAgQ29udmVydEFSR0JUb1lVVk9kZF9TU1NFMwotJWRlZmluZSBQSVhFTFNJWkUgICAgICAgNAotJWRlZmluZSBTVUJTQU1QTElORyAgICAgMQotJWRlZmluZSBMSU5FICAgICAgICAgICAgMQotJWluY2x1ZGUgImNvbnZlcnRfcmdiX3RvX3l1dl9zc3NlMy5pbmMiCi0KLTsKLTsgZXh0ZXJuICJDIiB2b2lkIENvbnZlcnRSR0JUb1lVVkV2ZW5fU1NTRTMoY29uc3QgdWludDgqIHJnYiwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHksCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB1LAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdiwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKTsKLTsKLSVkZWZpbmUgU1lNQk9MICAgICAgICAgIENvbnZlcnRSR0JUb1lVVkV2ZW5fU1NTRTMKLSVkZWZpbmUgUElYRUxTSVpFICAgICAgIDMKLSVkZWZpbmUgU1VCU0FNUExJTkcgICAgIDEKLSVkZWZpbmUgTElORSAgICAgICAgICAgIDAKLSVpbmNsdWRlICJjb252ZXJ0X3JnYl90b195dXZfc3NzZTMuaW5jIgotCi07Ci07IGV4dGVybiAiQyIgdm9pZCBDb252ZXJ0UkdCVG9ZVVZPZGRfU1NTRTMoY29uc3QgdWludDgqIHJnYiwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogeSwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdSwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdiwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpOwotOwotJWRlZmluZSBTWU1CT0wgICAgICAgICAgQ29udmVydFJHQlRvWVVWT2RkX1NTU0UzCi0lZGVmaW5lIFBJWEVMU0laRSAgICAgICAzCi0lZGVmaW5lIFNVQlNBTVBMSU5HICAgICAxCi0lZGVmaW5lIExJTkUgICAgICAgICAgICAxCi0laW5jbHVkZSAiY29udmVydF9yZ2JfdG9feXV2X3Nzc2UzLmluYyIKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3NpbWQvY29udmVydF9yZ2JfdG9feXV2X3Nzc2UzLmNjIGIvc3JjL21lZGlhL2Jhc2Uvc2ltZC9jb252ZXJ0X3JnYl90b195dXZfc3NzZTMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NTY5MjYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2Uvc2ltZC9jb252ZXJ0X3JnYl90b195dXZfc3NzZTMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaW1kL2NvbnZlcnRfcmdiX3RvX3l1di5oIgotCi0jaW5jbHVkZSAiYnVpbGQvYnVpbGRfY29uZmlnLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaW1kL2NvbnZlcnRfcmdiX3RvX3l1dl9zc3NlMy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi12b2lkIENvbnZlcnRSR0IzMlRvWVVWX1NTU0UzKGNvbnN0IHVpbnQ4KiByZ2JmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHlwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHVwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHZwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmdic3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeXN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHV2c3RyaWRlKSB7Ci0gIGZvciAoOyBoZWlnaHQgPj0gMjsgaGVpZ2h0IC09IDIpIHsKLSAgICBDb252ZXJ0QVJHQlRvWVVWUm93X1NTU0UzKHJnYmZyYW1lLCB5cGxhbmUsIHVwbGFuZSwgdnBsYW5lLCB3aWR0aCk7Ci0gICAgcmdiZnJhbWUgKz0gcmdic3RyaWRlOwotICAgIHlwbGFuZSArPSB5c3RyaWRlOwotCi0gICAgQ29udmVydEFSR0JUb1lVVlJvd19TU1NFMyhyZ2JmcmFtZSwgeXBsYW5lLCBOVUxMLCBOVUxMLCB3aWR0aCk7Ci0gICAgcmdiZnJhbWUgKz0gcmdic3RyaWRlOwotICAgIHlwbGFuZSArPSB5c3RyaWRlOwotCi0gICAgdXBsYW5lICs9IHV2c3RyaWRlOwotICAgIHZwbGFuZSArPSB1dnN0cmlkZTsKLSAgfQotCi0gIGlmIChoZWlnaHQpCi0gICAgQ29udmVydEFSR0JUb1lVVlJvd19TU1NFMyhyZ2JmcmFtZSwgeXBsYW5lLCB1cGxhbmUsIHZwbGFuZSwgd2lkdGgpOwotfQotCi12b2lkIENvbnZlcnRSR0IyNFRvWVVWX1NTU0UzKGNvbnN0IHVpbnQ4KiByZ2JmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHlwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHVwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHZwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmdic3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeXN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHV2c3RyaWRlKSB7Ci0gIGZvciAoOyBoZWlnaHQgPj0gMjsgaGVpZ2h0IC09IDIpIHsKLSAgICBDb252ZXJ0UkdCVG9ZVVZSb3dfU1NTRTMocmdiZnJhbWUsIHlwbGFuZSwgdXBsYW5lLCB2cGxhbmUsIHdpZHRoKTsKLSAgICByZ2JmcmFtZSArPSByZ2JzdHJpZGU7Ci0gICAgeXBsYW5lICs9IHlzdHJpZGU7Ci0KLSAgICBDb252ZXJ0UkdCVG9ZVVZSb3dfU1NTRTMocmdiZnJhbWUsIHlwbGFuZSwgTlVMTCwgTlVMTCwgd2lkdGgpOwotICAgIHJnYmZyYW1lICs9IHJnYnN0cmlkZTsKLSAgICB5cGxhbmUgKz0geXN0cmlkZTsKLQotICAgIHVwbGFuZSArPSB1dnN0cmlkZTsKLSAgICB2cGxhbmUgKz0gdXZzdHJpZGU7Ci0gIH0KLQotICBpZiAoaGVpZ2h0KQotICAgIENvbnZlcnRSR0JUb1lVVlJvd19TU1NFMyhyZ2JmcmFtZSwgeXBsYW5lLCB1cGxhbmUsIHZwbGFuZSwgd2lkdGgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3NpbWQvY29udmVydF9yZ2JfdG9feXV2X3Nzc2UzLmggYi9zcmMvbWVkaWEvYmFzZS9zaW1kL2NvbnZlcnRfcmdiX3RvX3l1dl9zc3NlMy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDU1N2QxLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3NpbWQvY29udmVydF9yZ2JfdG9feXV2X3Nzc2UzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0JBU0VfU0lNRF9DT05WRVJUX1JHQl9UT19ZVVZfU1NTRTNfSF8KLSNkZWZpbmUgTUVESUFfQkFTRV9TSU1EX0NPTlZFUlRfUkdCX1RPX1lVVl9TU1NFM19IXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vIFRoZSBoZWFkZXIgZmlsZSBmb3IgQVNNIGZ1bmN0aW9ucyB0aGF0IGNvbnZlcnQgYSByb3cgb2YgUkdCIHBpeGVscyB3aXRoIFNTU0UzCi0vLyBpbnN0cnVjdGlvbnMgc28gd2UgY2FuIGNhbGwgdGhlbSBmcm9tIEMrKyBjb2RlLiBUaGVzZSBmdW5jdGlvbnMgYXJlCi0vLyBpbXBsZW1lbnRlZCBpbiAiY29udmVydF9yZ2JfdG9feXV2X3Nzc2UzLmFzbSIuCi0KLS8vIENvbnZlcnQgYSByb3cgb2YgMjQtYml0IFJHQiBwaXhlbHMgdG8gWVYxMiBwaXhlbHMuCi12b2lkIENvbnZlcnRSR0JUb1lVVlJvd19TU1NFMyhjb25zdCB1aW50OCogcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKTsKLQotLy8gQ29udmVydCBhIHJvdyBvZiAzMi1iaXQgUkdCIHBpeGVscyB0byBZVjEyIHBpeGVscy4KLXZvaWQgQ29udmVydEFSR0JUb1lVVlJvd19TU1NFMyhjb25zdCB1aW50OCogYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgIC8vIE1FRElBX0JBU0VfU0lNRF9DT05WRVJUX1JHQl9UT19ZVVZfU1NTRTNfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3NpbWQvY29udmVydF9yZ2JfdG9feXV2X3Nzc2UzLmluYyBiL3NyYy9tZWRpYS9iYXNlL3NpbWQvY29udmVydF9yZ2JfdG9feXV2X3Nzc2UzLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjMGRiOS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9zaW1kL2NvbnZlcnRfcmdiX3RvX3l1dl9zc3NlMy5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotOyBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi07IFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLTsgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotOwotOyB2b2lkIFNZTUJPTChjb25zdCB1aW50OCogYXJnYiwgdWludDgqIHksIHVpbnQ4KiB1LCB1aW50OCogdiwgaW50IHdpZHRoKTsKLTsKLTsgVGhlIG1haW4gY29kZSB0aGF0IGNvbnZlcnRzIFJHQiBwaXhlbHMgdG8gWVVWIHBpeGVscy4gVGhpcyBmdW5jdGlvbiByb3VnaGx5Ci07IGNvbnNpc3RzIG9mIHRocmVlIHBhcnRzOiBjb252ZXJ0aW5nIG9uZSBBUkdCIHBpeGVsIHRvIFlVViBwaXhlbHMsIGNvbnZlcnRpbmcKLTsgdHdvIEFSR0IgcGl4ZWxzIHRvIFlVViBwaXhlbHMsIGFuZCBjb252ZXJ0aW5nIGZvdXIgQVJHQiBwaXhlbHMgdG8gWVVWIHBpeGVscy4KLTsgVG8gd3JpdGUgdGhlIHN0cnVjdHVyZSBvZiB0aGlzIGZ1bmN0aW9uIGluIEMsIGl0IGJlY29tZXMgdGhlIHNuaXBwZXQgbGlzdGVkCi07IGJlbG93LgotOwotOyAgIGlmICh3aWR0aCAmIDEpIHsKLTsgICAgIC0td2lkdGg7Ci07ICAgICAvLyBDb252ZXJ0IG9uZSBBUkdCIHBpeGVsIHRvIG9uZSBZIHBpeGVsLCBvbmUgVSBwaXhlbCwgYW5kIG9uZSBWIHBpeGVsLgotOyAgIH0KLTsKLTsgICBpZiAod2lkdGggJiAyKSB7Ci07ICAgICB3aWR0aCAtPSAyOwotOyAgICAgLy8gQ29udmVydCB0d28gQVJHQiBwaXhlbHMgdG8gdHdvIFkgcGl4ZWxzLCBvbmUgVSBwaXhlbCwgYW5kIG9uZSBWIHBpeGVsLgotOyAgIH0KLTsKLTsgICB3aGlsZSAod2lkdGgpIHsKLTsgICAgIHdpZHRoIC09IDQ7Ci07ICAgICAvLyBDb252ZXJ0IGZvdXIgQVJHQiBwaXhlbHMgdG8gZm91ciBZIHBpeGVscywgdHdvIFUgcGl4ZWxzLCBhbmQgdHdvIFYKLTsgICAgIC8vIHBpeGVscy4KLTsgICB9Ci07Ci0gIGdsb2JhbCAgICBtYW5nbGUoU1lNQk9MKSBQUklWQVRFCi0gIGFsaWduICAgICBmdW5jdGlvbl9hbGlnbgotCi1tYW5nbGUoU1lNQk9MKToKLSAgJWFzc2lnbiBzdGFja19vZmZzZXQgMAotICBQUk9MT0dVRSA1LCA2LCA4LCBBUkdCLCBZLCBVLCBWLCBXSURUSCwgVEVNUAotCi0gIDsgSW5pdGlhbGl6ZSBjb25zdGFudHMgdXNlZCBpbiB0aGlzIGZ1bmN0aW9uLiAoV2UgdXNlIGltbWVkaWF0ZXMgdG8gYXZvaWQKLSAgOyBkZXBlbmRlbmN5IG9udG8gR09ULikKLSAgTE9BRF9YTU0gIFhNTV9DT05TVF9ZMCwgMHgwMDQyMDIxOQotICBMT0FEX1hNTSAgWE1NX0NPTlNUX1kxLCAweDAwMDA3RjAwCi0gIExPQURfWE1NICBYTU1fQ09OU1RfVSwgMHgwMERBQjY3MAotICBMT0FEX1hNTSAgWE1NX0NPTlNUX1YsIDB4MDA3MEEyRUUKLSAgTE9BRF9YTU0gIFhNTV9DT05TVF8xMjgsIDB4MDA4MDAwODAKLQotLmNvbnZlcnRfb25lX3BpeGVsOgotICA7IERpdmlkZSB0aGUgaW5wdXQgd2lkdGggYnkgdHdvIHNvIGl0IHJlcHJlc2VudHMgdGhlIG9mZnNldHMgZm9yIHVbXSBhbmQgdltdLgotICA7IFdoZW4gdGhlIHdpZHRoIGlzIG9kZCwgV2UgcmVhZCB0aGUgcmlnaHRtb3N0IEFSR0IgcGl4ZWwgYW5kIGNvbnZlcnQgaXRzCi0gIDsgY29sb3JzcGFjZSB0byBZVVYuIFRoaXMgY29kZSBzdG9yZXMgb25lIFkgcGl4ZWwsIG9uZSBVIHBpeGVsLCBhbmQgb25lIFYKLSAgOyBwaXhlbC4KLSAgc2FyICAgICAgIFdJRFRIcSwgMQotICBqbmMgICAgICAgLmNvbnZlcnRfdHdvX3BpeGVscwotCi0gIDsgUmVhZCBvbmUgQVJHQiAob3IgUkdCKSBwaXhlbC4KLSAgUkVBRF9BUkdCIHhtbTAsIDEKLQotICA7IENhbGN1bGF0ZSB5WzBdIGZyb20gb25lIFJHQiBwaXhlbCByZWFkIGFib3ZlLgotICBDQUxDX1kgICAgeG1tMSwgeG1tMAotICBtb3ZkICAgICAgVEVNUGQsIHhtbTEKLSAgbW92ICAgICAgIEJZVEUgW1lxICsgV0lEVEhxICogMl0sIFRFTVBiCi0KLSAgOyBDYWxjdWxhdGUgdVswXSBmcm9tIG9uZSBSR0IgcGl4ZWwgcmVhZCBhYm92ZS4gSWYgdGhpcyBpcyBhbiBvZGQgbGluZSwgdGhlCi0gIDsgb3V0cHV0IHBpeGVsIGNvbnRhaW5zIHRoZSBVIHZhbHVlIGNhbGN1bGF0ZWQgaW4gdGhlIHByZXZpb3VzIGNhbGwuIFdlIGFsc28KLSAgOyByZWFkIHRoaXMgcGl4ZWwgYW5kIGNhbGN1bGF0ZSB0aGVpciBhdmVyYWdlLgotICBJTklUX1VWICAgVEVNUGQsIFVxLCA0Ci0gIENBTENfVVYgICB4bW0xLCB4bW0wLCBYTU1fQ09OU1RfVSwgVEVNUGQKLSAgbW92ZCAgICAgIFRFTVBkLCB4bW0xCi0gIG1vdiAgICAgICBCWVRFIFtVcSArIFdJRFRIcV0sIFRFTVBiCi0KLSAgOyBDYWxjdWxhdGUgdlswXSBmcm9tIG9uZSBSR0IgcGl4ZWwuIFNhbWUgYXMgdVswXSwgd2UgcmVhZCB0aGUgcmVzdWx0IG9mIHRoZQotICA7IHByZXZpb3VzIGNhbGwgYW5kIGdldCB0aGVpciBhdmVyYWdlLgotICBJTklUX1VWICAgVEVNUGQsIFVxLCA0Ci0gIENBTENfVVYgICB4bW0xLCB4bW0wLCBYTU1fQ09OU1RfViwgVEVNUGQKLSAgbW92ZCAgICAgIFRFTVBkLCB4bW0xCi0gIG1vdiAgICAgICBCWVRFIFtWcSArIFdJRFRIcV0sIFRFTVBiCi0KLS5jb252ZXJ0X3R3b19waXhlbHM6Ci0gIDsgSWYgdGhlIGlucHV0IHdpZHRoIGlzIG5vdCBhIG11bHRpcGxlIG9mIGZvdXIsIHJlYWQgdGhlIHJpZ2h0bW9zdCB0d28gQVJHQgotICA7IHBpeGVscyBhbmQgY29udmVydCB0aGVpciBjb2xvcnNwYWNlIHRvIFlVVi4gVGhpcyBjb2RlIHN0b3JlcyB0d28gWSBwaXhlbHMsCi0gIDsgb25lIFUgcGl4ZWwsIGFuZCBvbmUgViBwaXhlbC4KLSAgdGVzdCAgICAgIFdJRFRIYiwgMiAvIDIKLSAganogICAgICAgIC5jb252ZXJ0X2ZvdXJfcGl4ZWxzCi0gIHN1YiAgICAgICBXSURUSGIsIDIgLyAyCi0KLSAgOyBSZWFkIHR3byBBUkdCIChvciBSR0IpIHBpeGVscy4KLSAgUkVBRF9BUkdCIHhtbTAsIDIKLQotICA7IENhbGN1bGF0ZSByWzBdIGFuZCByWzFdIGZyb20gdHdvIFJHQiBwaXhlbHMgcmVhZCBhYm92ZS4KLSAgQ0FMQ19ZICAgIHhtbTEsIHhtbTAKLSAgbW92ZCAgICAgIFRFTVBkLCB4bW0xCi0gIG1vdiAgICAgICBXT1JEIFtZcSArIFdJRFRIcSAqIDJdLCBURU1QdwotCi0gIDsgU2tpcCBjYWxjdWxhdGluZyB1IGFuZCB2IGlmIHRoZSBvdXRwdXQgYnVmZmVyIGlzIE5VTEwuCi0gIHRlc3QgICAgICBVcSwgVXEKLSAganogICAgICAgIC5jb252ZXJ0X2ZvdXJfcGl4ZWxzCi0KLSAgOyBDYWxjdWxhdGUgdVswXSBmcm9tIHR3byBSR0IgcGl4ZWxzIHJlYWQgYWJvdmUuIChGb3IgZGV0YWlscywgcmVhZCB0aGUgYWJvdmUKLSAgOyBjb21tZW50IGluIC5jb252ZXJ0X29uZV9waXhlbCkuCi0gIElOSVRfVVYgICBURU1QZCwgVXEsIDIKLSAgQ0FMQ19VViAgIHhtbTEsIHhtbTAsIFhNTV9DT05TVF9VLCBURU1QZAotICBtb3ZkICAgICAgVEVNUGQsIHhtbTEKLSAgbW92ICAgICAgIEJZVEUgW1VxICsgV0lEVEhxXSwgVEVNUGIKLQotICA7IENhbGN1bGF0ZSB2WzBdIGZyb20gdHdvIFJHQiBwaXhlbHMgcmVhZCBhYm92ZS4KLSAgSU5JVF9VViAgIFRFTVBkLCBWcSwgMgotICBDQUxDX1VWICAgeG1tMSwgeG1tMCwgWE1NX0NPTlNUX1YsIFRFTVBkCi0gIG1vdmQgICAgICBURU1QZCwgeG1tMQotICBtb3YgICAgICAgQllURSBbVnEgKyBXSURUSHFdLCBURU1QYgotCi0uY29udmVydF9mb3VyX3BpeGVsczoKLSAgOyBSZWFkIGZvdXIgQVJHQiBwaXhlbHMgYW5kIGNvbnZlcnQgdGhlaXIgY29sb3JzcGFjZSB0byBZVVYuIFRoaXMgY29kZSBzdG9yZXMKLSAgOyBmb3VyIFkgcGl4ZWxzLCB0d28gVSBwaXhlbHMsIGFuZCB0d28gViBwaXhlbHMuCi0gIHRlc3QgICAgICBXSURUSHEsIFdJRFRIcQotICBqeiAgICAgICAgLmNvbnZlcnRfZmluaXNoCi0KLSVpZiBQSVhFTFNJWkUgPT0gNAotICA7IENoZWNrIGlmIHRoZSBpbnB1dCBidWZmZXIgaXMgYWxpZ25lZCB0byBhIDE2LWJ5dGUgYm91bmRhcnkgYW5kIHVzZSBtb3ZkcWEKLSAgOyBmb3IgcmVhZGluZyB0aGUgQVJHQiBwaXhlbHMuCi0gIHRlc3QgICAgICBBUkdCdywgMTUKLSAgam56ICAgICAgIC5jb252ZXJ0X2ZvdXJfcGl4ZWxzX3VuYWxpZ25lZAotCi0uY29udmVydF9mb3VyX3BpeGVsc19hbGlnbmVkOgotICBzdWIgICAgICAgV0lEVEhxLCA0IC8gMgotCi0gIDsgUmVhZCBmb3VyIEFSR0IgcGl4ZWxzLiAoV2UgY2FuIHVzZSBtb3ZkcWEgaGVyZSBzaW5jZSB3ZSBoYXZlIGNoZWNrZWQgaWYgdGhlCi0gIDsgc291cmNlIGFkZHJlc3MgaXMgYWxpZ25lZC4pCi0gIG1vdmRxYSAgICB4bW0wLCBEUVdPUkQgW0FSR0JxICsgV0lEVEhxICogNCAqIDJdCi0KLSAgOyBDYWxjdWxhdGUgeVswXSwgeVsxXSwgeVsyXSxhbmQsIHlbM10gZnJvbSB0aGUgaW5wdXQgQVJHQiBwaXhlbHMuCi0gIENBTENfWSAgICB4bW0xLCB4bW0wCi0gIG1vdmQgICAgICBEV09SRCBbWXEgKyBXSURUSHEgKiAyXSwgeG1tMQotCi0laWYgU1VCU0FNUExJTkcgPT0gMAotICA7IFNraXAgY2FsY3VsYXRpbmcgdSBhbmQgdiBpZiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBOVUxMLCB3aGljaCBtZWFucyB3ZSBhcmUKLSAgOyBjb252ZXJ0aW5nIGFuIG9kZCBsaW5lLiAoV2hlbiB3ZSBlbmFibGUgc3Vic2FtcGxpbmcsIHRoZXNlIGJ1ZmZlcnMgbXVzdAotICA7IGNvbnRhaW4gdGhlIHUgYW5kIHYgdmFsdWVzIGZvciB0aGUgcHJldmlvdXMgY2FsbCwgaS5lLiB0aGVzZSB2YXJpYWJsZXMgbXVzdAotICA7IG5vdCBiZSBOVUxMLikKLSAgdGVzdCAgICAgIFVxLCBVcQotICBqeiAgICAgICAgLmNvbnZlcnRfZm91cl9waXhlbHNfYWxpZ25lZF9uZXh0Ci0lZW5kaWYKLQotICA7IENhbGN1bGF0ZSB1WzBdIGFuZCB1WzFdIGZyb20gZm91ciBBUkdCIHBpeGVscyByZWFkIGFib3ZlLgotICBJTklUX1VWICAgVEVNUGQsIFVxLCA0Ci0gIENBTENfVVYgICB4bW0xLCB4bW0wLCBYTU1fQ09OU1RfVSwgVEVNUGQKLSAgbW92ZCAgICAgIFRFTVBkLCB4bW0xCi0gIG1vdiAgICAgICBXT1JEIFtVcSArIFdJRFRIcV0sIFRFTVB3Ci0KLSAgOyBDYWxjdWxhdGUgdlswXSBhbmQgdlsxXSBmcm9tIGZvdXIgQVJHQiBwaXhlbHMgcmVhZCBhYm92ZS4KLSAgSU5JVF9VViAgIFRFTVBkLCBWcSwgNAotICBDQUxDX1VWICAgeG1tMSwgeG1tMCwgWE1NX0NPTlNUX1YsIFRFTVBkCi0gIG1vdmQgICAgICBURU1QZCwgeG1tMQotICBtb3YgICAgICAgV09SRCBbVnEgKyBXSURUSHFdLCBURU1QdwotCi0laWYgU1VCU0FNUExJTkcgPT0gMAotLmNvbnZlcnRfZm91cl9waXhlbHNfYWxpZ25lZF9uZXh0OgotJWVuZGlmCi0KLSAgdGVzdCAgICAgIFdJRFRIcSwgV0lEVEhxCi0gIGpueiAgICAgICAuY29udmVydF9mb3VyX3BpeGVsc19hbGlnbmVkCi0KLSAgam1wICAgICAgIC5jb252ZXJ0X2ZpbmlzaAotJWVuZGlmCi0KLS5jb252ZXJ0X2ZvdXJfcGl4ZWxzX3VuYWxpZ25lZDoKLSAgc3ViICAgICAgIFdJRFRIcSwgNCAvIDIKLQotICA7IFJlYWQgZm91ciBBUkdCIChvciBSR0IpIHBpeGVscy4KLSAgUkVBRF9BUkdCIHhtbTAsIDQKLQotICA7IENhbGN1bGF0ZSB5WzBdLCB5WzFdLCB5WzJdLGFuZCwgeVszXSBmcm9tIHRoZSBpbnB1dCBBUkdCIHBpeGVscy4KLSAgQ0FMQ19ZICAgIHhtbTEsIHhtbTAKLSAgbW92ZCAgICAgIERXT1JEIFtZcSArIFdJRFRIcSAqIDJdLCB4bW0xCi0KLSVpZiBTVUJTQU1QTElORyA9PSAwCi0gIDsgU2tpcCBjYWxjdWxhdGluZyB1IGFuZCB2IGlmIHRoZSBvdXRwdXQgYnVmZmVyIGlzIE5VTEwuCi0gIHRlc3QgICAgICBVcSwgVXEKLSAganogICAgICAgIC5jb252ZXJ0X2ZvdXJfcGl4ZWxzX3VuYWxpZ25lZF9uZXh0Ci0lZW5kaWYKLQotICA7IENhbGN1bGF0ZSB1WzBdIGFuZCB1WzFdIGZyb20gdGhlIGlucHV0IEFSR0IgcGl4ZWxzLgotICBJTklUX1VWICAgVEVNUGQsIFVxLCA0Ci0gIENBTENfVVYgICB4bW0xLCB4bW0wLCBYTU1fQ09OU1RfVSwgVEVNUGQKLSAgbW92ZCAgICAgIFRFTVBkLCB4bW0xCi0gIG1vdiAgICAgICBXT1JEIFtVcSArIFdJRFRIcV0sIFRFTVB3Ci0KLSAgOyBDYWxjdWxhdGUgdlswXSBhbmQgdlsxXSBmcm9tIHRoZSBpbnB1dCBBUkdCIHBpeGVscy4KLSAgSU5JVF9VViAgIFRFTVBkLCBWcSwgNAotICBDQUxDX1VWICAgeG1tMSwgeG1tMCwgWE1NX0NPTlNUX1YsIFRFTVBkCi0gIG1vdmQgICAgICBURU1QZCwgeG1tMQotICBtb3YgICAgICAgV09SRCBbVnEgKyBXSURUSHFdLCBURU1QdwotCi0laWYgU1VCU0FNUExJTkcgPT0gMAotLmNvbnZlcnRfZm91cl9waXhlbHNfdW5hbGlnbmVkX25leHQ6Ci0lZW5kaWYKLQotICB0ZXN0ICAgICAgV0lEVEhxLCBXSURUSHEKLSAgam56ICAgICAgIC5jb252ZXJ0X2ZvdXJfcGl4ZWxzX3VuYWxpZ25lZAotCi0uY29udmVydF9maW5pc2g6Ci0gIDsgSnVzdCBleGl0IHRoaXMgZnVuY3Rpb24gc2luY2UgdGhpcyBpcyBhIHZvaWQgZnVuY3Rpb24uCi0gIFJFVApkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2Uvc2ltZC9jb252ZXJ0X3JnYl90b195dXZfdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvYmFzZS9zaW1kL2NvbnZlcnRfcmdiX3RvX3l1dl91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhhYTRkZi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9zaW1kL2NvbnZlcnRfcmdiX3RvX3l1dl91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAiYmFzZS9jcHUuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaW1kL2NvbnZlcnRfcmdiX3RvX3l1di5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgewotCi0vLyBSZWZlcmVuY2UgY29kZSB0aGF0IGNvbnZlcnRzIFJHQiBwaXhlbHMgdG8gWVVWIHBpeGVscy4KLWludCBDb252ZXJ0UkdCVG9ZKGNvbnN0IHVpbnQ4KiByZ2IpIHsKLSAgaW50IHkgPSAyNSAqIHJnYlswXSArIDEyOSAqIHJnYlsxXSArIDY2ICogcmdiWzJdOwotICB5ID0gKCh5ICsgMTI4KSA+PiA4KSArIDE2OwotICByZXR1cm4gc3RkOjptYXgoMCwgc3RkOjptaW4oMjU1LCB5KSk7Ci19Ci0KLWludCBDb252ZXJ0UkdCVG9VKGNvbnN0IHVpbnQ4KiByZ2IsIGludCBzaXplKSB7Ci0gIGludCB1ID0gMTEyICogcmdiWzBdIC0gNzQgKiByZ2JbMV0gLSAzOCAqIHJnYlsyXTsKLSAgdSA9ICgodSArIDEyOCkgPj4gOCkgKyAxMjg7Ci0gIHJldHVybiBzdGQ6Om1heCgwLCBzdGQ6Om1pbigyNTUsIHUpKTsKLX0KLQotaW50IENvbnZlcnRSR0JUb1YoY29uc3QgdWludDgqIHJnYiwgaW50IHNpemUpIHsKLSAgaW50IHYgPSAtMTggKiByZ2JbMF0gLSA5NCAqIHJnYlsxXSArIDExMiAqIHJnYlsyXTsKLSAgdiA9ICgodiArIDEyOCkgPj4gOCkgKyAxMjg7Ci0gIHJldHVybiBzdGQ6Om1heCgwLCBzdGQ6Om1pbigyNTUsIHYpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIEEgc2lkZS1ieS1zaWRlIHRlc3QgdGhhdCB2ZXJpZmllcyBvdXIgQVNNIGZ1bmN0aW9ucyB0aGF0IGNvbnZlcnQgUkdCIHBpeGVscwotLy8gdG8gWVVWIHBpeGVscyBjYW4gb3V0cHV0IHRoZSBleHBlY3RlZCByZXN1bHRzLiBUaGlzIHRlc3QgY29udmVydHMgUkdCIHBpeGVscwotLy8gdG8gWVVWIHBpeGVscyB3aXRoIG91ciBBU00gZnVuY3Rpb25zICh3aGljaCB1c2UgU1NFLCBTU0UyLCBTU0UzLCBhbmQgU1NTRTMpCi0vLyBhbmQgY29tcGFyZSB0aGUgb3V0cHV0IFlVViBwaXhlbHMgd2l0aCB0aGUgb25lcyBjYWxjdWxhdGVkIHdpdGggb3V0IHJlZmVyZW5jZQotLy8gZnVuY3Rpb25zIGltcGxlbWVudGVkIGluIEMrKy4KLVRFU1QoWVVWQ29udmVydFRlc3QsIFNpZGVCeVNpZGVSR0IpIHsKLSAgLy8gV2Ugc2tpcCB0aGlzIHRlc3Qgb24gUENzIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgU1NFMyBiZWNhdXNlIHRoaXMgdGVzdAotICAvLyBuZWVkcyBpdC4KLSAgYmFzZTo6Q1BVIGNwdTsKLSAgaWYgKCFjcHUuaGFzX3Nzc2UzKCkpCi0gICAgcmV0dXJuOwotCi0gIC8vIFRoaXMgdGVzdCBjaGVja3MgYSBzdWJzZXQgb2YgYWxsIFJHQiB2YWx1ZXMgc28gdGhpcyB0ZXN0IGRvZXMgbm90IHRha2Ugc28KLSAgLy8gbG9uZyB0aW1lLgotICBjb25zdCBpbnQga1N0ZXAgPSA4OwotICBjb25zdCBpbnQga1dpZHRoID0gMjU2IC8ga1N0ZXA7Ci0KLSAgZm9yIChpbnQgc2l6ZSA9IDM7IHNpemUgPD0gNDsgKytzaXplKSB7Ci0gICAgLy8gQ3JlYXRlIHRoZSBvdXRwdXQgYnVmZmVycy4KLSAgICBzY29wZWRfYXJyYXk8dWludDg+IHJnYihuZXcgdWludDhba1dpZHRoICogc2l6ZV0pOwotICAgIHNjb3BlZF9hcnJheTx1aW50OD4geShuZXcgdWludDhba1dpZHRoXSk7Ci0gICAgc2NvcGVkX2FycmF5PHVpbnQ4PiB1KG5ldyB1aW50OFtrV2lkdGggLyAyXSk7Ci0gICAgc2NvcGVkX2FycmF5PHVpbnQ4PiB2KG5ldyB1aW50OFtrV2lkdGggLyAyXSk7Ci0KLSAgICAvLyBDaG9vc2UgdGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZnJvbSBSR0IgcGl4ZWxzIHRvIFlVViBvbmVzLgotICAgIHZvaWQgKCpjb252ZXJ0KShjb25zdCB1aW50OCosIHVpbnQ4KiwgdWludDgqLCB1aW50OCosCi0gICAgICAgICAgICAgICAgICAgIGludCwgaW50LCBpbnQsIGludCwgaW50KSA9IE5VTEw7Ci0gICAgaWYgKHNpemUgPT0gMykKLSAgICAgIGNvbnZlcnQgPSBtZWRpYTo6Q29udmVydFJHQjI0VG9ZVVZfU1NTRTM7Ci0gICAgZWxzZQotICAgICAgY29udmVydCA9IG1lZGlhOjpDb252ZXJ0UkdCMzJUb1lVVl9TU1NFMzsKLQotICAgIGludCB0b3RhbF9lcnJvciA9IDA7Ci0gICAgZm9yIChpbnQgciA9IDA7IHIgPCBrV2lkdGg7ICsrcikgewotICAgICAgZm9yIChpbnQgZyA9IDA7IGcgPCBrV2lkdGg7ICsrZykgewotCi0gICAgICAgIC8vIEZpbGwgdGhlIGlucHV0IHBpeGVscy4KLSAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBrV2lkdGg7ICsrYikgewotICAgICAgICAgIHJnYltiICogc2l6ZSArIDBdID0gYiAqIGtTdGVwOwotICAgICAgICAgIHJnYltiICogc2l6ZSArIDFdID0gZyAqIGtTdGVwOwotICAgICAgICAgIHJnYltiICogc2l6ZSArIDJdID0gciAqIGtTdGVwOwotICAgICAgICAgIGlmIChzaXplID09IDQpCi0gICAgICAgICAgICByZ2JbYiAqIHNpemUgKyAzXSA9IDI1NTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENvbnZlcnQgdGhlIGlucHV0IFJHQiBwaXhlbHMgdG8gWVVWIG9uZXMuCi0gICAgICAgIGNvbnZlcnQocmdiLmdldCgpLCB5LmdldCgpLCB1LmdldCgpLCB2LmdldCgpLCBrV2lkdGgsIDEsIGtXaWR0aCAqIHNpemUsCi0gICAgICAgICAgICAgICAga1dpZHRoLCBrV2lkdGggLyAyKTsKLQotICAgICAgICAvLyBDaGVjayB0aGUgb3V0cHV0IFkgcGl4ZWxzLgotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtXaWR0aDsgKytpKSB7Ci0gICAgICAgICAgY29uc3QgdWludDgqIHAgPSAmcmdiW2kgKiBzaXplXTsKLSAgICAgICAgICBpbnQgZXJyb3IgPSBDb252ZXJ0UkdCVG9ZKHApIC0geVtpXTsKLSAgICAgICAgICB0b3RhbF9lcnJvciArPSBlcnJvciA+IDAgPyBlcnJvciA6IC1lcnJvcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoZWNrIHRoZSBvdXRwdXQgVSBwaXhlbHMuCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga1dpZHRoIC8gMjsgKytpKSB7Ci0gICAgICAgICAgY29uc3QgdWludDgqIHAgPSAmcmdiW2kgKiAyICogc2l6ZV07Ci0gICAgICAgICAgaW50IGVycm9yID0gQ29udmVydFJHQlRvVShwLCBzaXplKSAtIHVbaV07Ci0gICAgICAgICAgdG90YWxfZXJyb3IgKz0gZXJyb3IgPiAwID8gZXJyb3IgOiAtZXJyb3I7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayB0aGUgb3V0cHV0IFYgcGl4ZWxzLgotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtXaWR0aCAvIDI7ICsraSkgewotICAgICAgICAgIGNvbnN0IHVpbnQ4KiBwID0gJnJnYltpICogMiAqIHNpemVdOwotICAgICAgICAgIGludCBlcnJvciA9IENvbnZlcnRSR0JUb1YocCwgc2l6ZSkgLSB2W2ldOwotICAgICAgICAgIHRvdGFsX2Vycm9yICs9IGVycm9yID4gMCA/IGVycm9yIDogLWVycm9yOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgRVhQRUNUX0VRKDAsIHRvdGFsX2Vycm9yKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2Uvc2ltZC9jb252ZXJ0X3l1dl90b19yZ2IuaCBiL3NyYy9tZWRpYS9iYXNlL3NpbWQvY29udmVydF95dXZfdG9fcmdiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NGFkMTEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2Uvc2ltZC9jb252ZXJ0X3l1dl90b19yZ2IuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0JBU0VfU0lNRF9DT05WRVJUX1lVVl9UT19SR0JfSF8KLSNkZWZpbmUgTUVESUFfQkFTRV9TSU1EX0NPTlZFUlRfWVVWX1RPX1JHQl9IXwotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS95dXZfY29udmVydC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi10eXBlZGVmIHZvaWQgKCpDb252ZXJ0WVVWVG9SR0IzMlByb2MpKGNvbnN0IHVpbnQ4KiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlVVlR5cGUpOwotCi12b2lkIENvbnZlcnRZVVZUb1JHQjMyX0MoY29uc3QgdWludDgqIHlwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB2cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHJnYmZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5c3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1dnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmdic3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIFlVVlR5cGUgeXV2X3R5cGUpOwotCi12b2lkIENvbnZlcnRZVVZUb1JHQjMyX1NTRShjb25zdCB1aW50OCogeXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHVwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB2cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogcmdiZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXZzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmdic3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgWVVWVHlwZSB5dXZfdHlwZSk7Ci0KLXZvaWQgQ29udmVydFlVVlRvUkdCMzJfTU1YKGNvbnN0IHVpbnQ4KiB5cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHZwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiByZ2JmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeXN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1dnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZ2JzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBZVVZUeXBlIHl1dl90eXBlKTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLS8vIEFzc2VtYmx5IGZ1bmN0aW9ucyBhcmUgZGVjbGFyZWQgd2l0aG91dCBuYW1lc3BhY2UuCi1leHRlcm4gIkMiIHsKLQotdHlwZWRlZiB2b2lkICgqQ29udmVydFlVVlRvUkdCMzJSb3dQcm9jKShjb25zdCB1aW50OCosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQpOwotdHlwZWRlZiB2b2lkICgqU2NhbGVZVVZUb1JHQjMyUm93UHJvYykoY29uc3QgdWludDgqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KTsKLQotdm9pZCBDb252ZXJ0WVVWVG9SR0IzMlJvd19DKGNvbnN0IHVpbnQ4KiB5cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHVwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdnBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiByZ2JmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpOwotCi12b2lkIENvbnZlcnRZVVZUb1JHQjMyUm93X01NWChjb25zdCB1aW50OCogeXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHVwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB2cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogcmdiZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpOwotCi12b2lkIENvbnZlcnRZVVZUb1JHQjMyUm93X1NTRShjb25zdCB1aW50OCogeXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHVwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB2cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogcmdiZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpOwotCi12b2lkIFNjYWxlWVVWVG9SR0IzMlJvd19DKGNvbnN0IHVpbnQ4KiB5X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHVfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdl9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiByZ2JfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2VfZHgpOwotCi12b2lkIFNjYWxlWVVWVG9SR0IzMlJvd19NTVgoY29uc3QgdWludDgqIHlfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB1X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdl9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHJnYl9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2VfZHgpOwotCi12b2lkIFNjYWxlWVVWVG9SR0IzMlJvd19TU0UoY29uc3QgdWludDgqIHlfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB1X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdl9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHJnYl9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2VfZHgpOwotCi12b2lkIFNjYWxlWVVWVG9SR0IzMlJvd19TU0UyX1g2NChjb25zdCB1aW50OCogeV9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdV9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdl9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogcmdiX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2VfZHgpOwotCi12b2lkIExpbmVhclNjYWxlWVVWVG9SR0IzMlJvd19DKGNvbnN0IHVpbnQ4KiB5X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHVfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdl9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiByZ2JfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2VfZHgpOwotCi12b2lkIExpbmVhclNjYWxlWVVWVG9SR0IzMlJvd1dpdGhSYW5nZV9DKGNvbnN0IHVpbnQ4KiB5X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHVfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdl9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiByZ2JfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZV94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlX2R4KTsKLQotdm9pZCBMaW5lYXJTY2FsZVlVVlRvUkdCMzJSb3dfTU1YKGNvbnN0IHVpbnQ4KiB5X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdV9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHZfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiByZ2JfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlX2R4KTsKLQotdm9pZCBMaW5lYXJTY2FsZVlVVlRvUkdCMzJSb3dfU1NFKGNvbnN0IHVpbnQ4KiB5X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdV9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHZfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiByZ2JfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlX2R4KTsKLQotdm9pZCBMaW5lYXJTY2FsZVlVVlRvUkdCMzJSb3dfTU1YX1g2NChjb25zdCB1aW50OCogeV9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB1X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHZfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogcmdiX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlX2R4KTsKLQotfSAgLy8gZXh0ZXJuICJDIgotCi0jZW5kaWYgIC8vIE1FRElBX0JBU0VfU0lNRF9DT05WRVJUX1lVVl9UT19SR0JfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3NpbWQvY29udmVydF95dXZfdG9fcmdiX2MuY2MgYi9zcmMvbWVkaWEvYmFzZS9zaW1kL2NvbnZlcnRfeXV2X3RvX3JnYl9jLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjZlNTU3Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3NpbWQvY29udmVydF95dXZfdG9fcmdiX2MuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2ltZC9jb252ZXJ0X3l1dl90b19yZ2IuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3NpbWQveXV2X3RvX3JnYl90YWJsZS5oIgotCi0jZGVmaW5lIHBhY2t1c3diKHgpICgoeCkgPCAwID8gMCA6ICgoeCkgPiAyNTUgPyAyNTUgOiAoeCkpKQotI2RlZmluZSBwYWRkc3coeCwgeSkgKCgoeCkgKyAoeSkpIDwgLTMyNzY4ID8gLTMyNzY4IDogXAotICAgICgoKHgpICsgKHkpKSA+IDMyNzY3ID8gMzI3NjcgOiAoKHgpICsgKHkpKSkpCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBDb252ZXJ0WVVWVG9SR0IzMl9DKHVpbnQ4IHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCB1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiByZ2JfYnVmKSB7Ci0gIGludCBiID0ga0NvZWZmaWNpZW50c1JnYllbMjU2K3VdWzBdOwotICBpbnQgZyA9IGtDb2VmZmljaWVudHNSZ2JZWzI1Nit1XVsxXTsKLSAgaW50IHIgPSBrQ29lZmZpY2llbnRzUmdiWVsyNTYrdV1bMl07Ci0gIGludCBhID0ga0NvZWZmaWNpZW50c1JnYllbMjU2K3VdWzNdOwotCi0gIGIgPSBwYWRkc3coYiwga0NvZWZmaWNpZW50c1JnYllbNTEyK3ZdWzBdKTsKLSAgZyA9IHBhZGRzdyhnLCBrQ29lZmZpY2llbnRzUmdiWVs1MTIrdl1bMV0pOwotICByID0gcGFkZHN3KHIsIGtDb2VmZmljaWVudHNSZ2JZWzUxMit2XVsyXSk7Ci0gIGEgPSBwYWRkc3coYSwga0NvZWZmaWNpZW50c1JnYllbNTEyK3ZdWzNdKTsKLQotICBiID0gcGFkZHN3KGIsIGtDb2VmZmljaWVudHNSZ2JZW3ldWzBdKTsKLSAgZyA9IHBhZGRzdyhnLCBrQ29lZmZpY2llbnRzUmdiWVt5XVsxXSk7Ci0gIHIgPSBwYWRkc3cociwga0NvZWZmaWNpZW50c1JnYllbeV1bMl0pOwotICBhID0gcGFkZHN3KGEsIGtDb2VmZmljaWVudHNSZ2JZW3ldWzNdKTsKLQotICBiID4+PSA2OwotICBnID4+PSA2OwotICByID4+PSA2OwotICBhID4+PSA2OwotCi0gICpyZWludGVycHJldF9jYXN0PHVpbnQzMio+KHJnYl9idWYpID0gKHBhY2t1c3diKGIpKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhY2t1c3diKGcpIDw8IDgpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFja3Vzd2IocikgPDwgMTYpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFja3Vzd2IoYSkgPDwgMjQpOwotfQotCi1leHRlcm4gIkMiIHsKLQotdm9pZCBDb252ZXJ0WVVWVG9SR0IzMlJvd19DKGNvbnN0IHVpbnQ4KiB5X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdV9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHZfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiByZ2JfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCkgewotICBmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDIpIHsKLSAgICB1aW50OCB1ID0gdV9idWZbeCA+PiAxXTsKLSAgICB1aW50OCB2ID0gdl9idWZbeCA+PiAxXTsKLSAgICB1aW50OCB5MCA9IHlfYnVmW3hdOwotICAgIENvbnZlcnRZVVZUb1JHQjMyX0MoeTAsIHUsIHYsIHJnYl9idWYpOwotICAgIGlmICgoeCArIDEpIDwgd2lkdGgpIHsKLSAgICAgIHVpbnQ4IHkxID0geV9idWZbeCArIDFdOwotICAgICAgQ29udmVydFlVVlRvUkdCMzJfQyh5MSwgdSwgdiwgcmdiX2J1ZiArIDQpOwotICAgIH0KLSAgICByZ2JfYnVmICs9IDg7ICAvLyBBZHZhbmNlIDIgcGl4ZWxzLgotICB9Ci19Ci0KLS8vIDE2LjE2IGZpeGVkIHBvaW50IGlzIHVzZWQuICBBIHNoaWZ0IGJ5IDE2IGlzb2xhdGVzIHRoZSBpbnRlZ2VyLgotLy8gQSBzaGlmdCBieSAxNyBpcyB1c2VkIHRvIGZ1cnRoZXIgc3Vic2FtcGxlIHRoZSBjaHJvbWluZW5jZSBjaGFubmVscy4KLS8vICYgMHhmZmZmIGlzb2xhdGVzIHRoZSBmaXhlZCBwb2ludCBmcmFjdGlvbi4gID4+IDIgdG8gZ2V0IHRoZSB1cHBlciAyIGJpdHMsCi0vLyBmb3IgMS82NTUzNiBwaXhlbCBhY2N1cmF0ZSBpbnRlcnBvbGF0aW9uLgotdm9pZCBTY2FsZVlVVlRvUkdCMzJSb3dfQyhjb25zdCB1aW50OCogeV9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB1X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHZfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogcmdiX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlX2R4KSB7Ci0gIGludCB4ID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aWR0aDsgaSArPSAyKSB7Ci0gICAgaW50IHkgPSB5X2J1Zlt4ID4+IDE2XTsKLSAgICBpbnQgdSA9IHVfYnVmWyh4ID4+IDE3KV07Ci0gICAgaW50IHYgPSB2X2J1ZlsoeCA+PiAxNyldOwotICAgIENvbnZlcnRZVVZUb1JHQjMyX0MoeSwgdSwgdiwgcmdiX2J1Zik7Ci0gICAgeCArPSBzb3VyY2VfZHg7Ci0gICAgaWYgKChpICsgMSkgPCB3aWR0aCkgewotICAgICAgeSA9IHlfYnVmW3ggPj4gMTZdOwotICAgICAgQ29udmVydFlVVlRvUkdCMzJfQyh5LCB1LCB2LCByZ2JfYnVmKzQpOwotICAgICAgeCArPSBzb3VyY2VfZHg7Ci0gICAgfQotICAgIHJnYl9idWYgKz0gODsKLSAgfQotfQotCi12b2lkIExpbmVhclNjYWxlWVVWVG9SR0IzMlJvd19DKGNvbnN0IHVpbnQ4KiB5X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHVfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdl9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiByZ2JfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2VfZHgpIHsKLSAgLy8gQXZvaWQgcG9pbnQtc2FtcGxpbmcgZm9yIGRvd24tc2NhbGluZyBieSA+IDI6MS4KLSAgaW50IHNvdXJjZV94ID0gMDsKLSAgaWYgKHNvdXJjZV9keCA+PSAweDIwMDAwKQotICAgIHNvdXJjZV94ICs9IDB4ODAwMDsKLSAgTGluZWFyU2NhbGVZVVZUb1JHQjMyUm93V2l0aFJhbmdlX0MoeV9idWYsIHVfYnVmLCB2X2J1ZiwgcmdiX2J1Ziwgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV94LCBzb3VyY2VfZHgpOwotfQotCi12b2lkIExpbmVhclNjYWxlWVVWVG9SR0IzMlJvd1dpdGhSYW5nZV9DKGNvbnN0IHVpbnQ4KiB5X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHVfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdl9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiByZ2JfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2VfZHgpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXN0X3dpZHRoOyBpICs9IDIpIHsKLSAgICBpbnQgeTAgPSB5X2J1Zlt4ID4+IDE2XTsKLSAgICBpbnQgeTEgPSB5X2J1ZlsoeCA+PiAxNikgKyAxXTsKLSAgICBpbnQgdTAgPSB1X2J1ZlsoeCA+PiAxNyldOwotICAgIGludCB1MSA9IHVfYnVmWyh4ID4+IDE3KSArIDFdOwotICAgIGludCB2MCA9IHZfYnVmWyh4ID4+IDE3KV07Ci0gICAgaW50IHYxID0gdl9idWZbKHggPj4gMTcpICsgMV07Ci0gICAgaW50IHlfZnJhYyA9ICh4ICYgNjU1MzUpOwotICAgIGludCB1dl9mcmFjID0gKCh4ID4+IDEpICYgNjU1MzUpOwotICAgIGludCB5ID0gKHlfZnJhYyAqIHkxICsgKHlfZnJhYyBeIDY1NTM1KSAqIHkwKSA+PiAxNjsKLSAgICBpbnQgdSA9ICh1dl9mcmFjICogdTEgKyAodXZfZnJhYyBeIDY1NTM1KSAqIHUwKSA+PiAxNjsKLSAgICBpbnQgdiA9ICh1dl9mcmFjICogdjEgKyAodXZfZnJhYyBeIDY1NTM1KSAqIHYwKSA+PiAxNjsKLSAgICBDb252ZXJ0WVVWVG9SR0IzMl9DKHksIHUsIHYsIHJnYl9idWYpOwotICAgIHggKz0gc291cmNlX2R4OwotICAgIGlmICgoaSArIDEpIDwgZGVzdF93aWR0aCkgewotICAgICAgeTAgPSB5X2J1Zlt4ID4+IDE2XTsKLSAgICAgIHkxID0geV9idWZbKHggPj4gMTYpICsgMV07Ci0gICAgICB5X2ZyYWMgPSAoeCAmIDY1NTM1KTsKLSAgICAgIHkgPSAoeV9mcmFjICogeTEgKyAoeV9mcmFjIF4gNjU1MzUpICogeTApID4+IDE2OwotICAgICAgQ29udmVydFlVVlRvUkdCMzJfQyh5LCB1LCB2LCByZ2JfYnVmKzQpOwotICAgICAgeCArPSBzb3VyY2VfZHg7Ci0gICAgfQotICAgIHJnYl9idWYgKz0gODsKLSAgfQotfQotCi19Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLXZvaWQgQ29udmVydFlVVlRvUkdCMzJfQyhjb25zdCB1aW50OCogeXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB1cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHZwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogcmdiZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHV2c3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZ2JzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgWVVWVHlwZSB5dXZfdHlwZSkgewotICB1bnNpZ25lZCBpbnQgeV9zaGlmdCA9IHl1dl90eXBlOwotICBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7Ci0gICAgdWludDgqIHJnYl9yb3cgPSByZ2JmcmFtZSArIHkgKiByZ2JzdHJpZGU7Ci0gICAgY29uc3QgdWludDgqIHlfcHRyID0geXBsYW5lICsgeSAqIHlzdHJpZGU7Ci0gICAgY29uc3QgdWludDgqIHVfcHRyID0gdXBsYW5lICsgKHkgPj4geV9zaGlmdCkgKiB1dnN0cmlkZTsKLSAgICBjb25zdCB1aW50OCogdl9wdHIgPSB2cGxhbmUgKyAoeSA+PiB5X3NoaWZ0KSAqIHV2c3RyaWRlOwotCi0gICAgQ29udmVydFlVVlRvUkdCMzJSb3dfQyh5X3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZ2Jfcm93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2Uvc2ltZC9jb252ZXJ0X3l1dl90b19yZ2JfbW14LmFzbSBiL3NyYy9tZWRpYS9iYXNlL3NpbWQvY29udmVydF95dXZfdG9fcmdiX21teC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNDQ0NzQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2Uvc2ltZC9jb252ZXJ0X3l1dl90b19yZ2JfbW14LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTsgQ29weXJpZ2h0IChjKSAyMDExIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotOyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi07IGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSVpbmNsdWRlICJ4ODZpbmMuYXNtIgotCi07Ci07IFRoaXMgZmlsZSB1c2VzIE1NWCBpbnN0cnVjdGlvbnMuCi07Ci0gIFNFQ1RJT05fVEVYVAotICBDUFUgICAgICAgTU1YCi0KLTsgVXNlIG1vdnEgdG8gc2F2ZSB0aGUgb3V0cHV0LgotJWRlZmluZSBNT1ZRIG1vdnEKLQotOyBleHRlcm4gIkMiIHZvaWQgQ29udmVydFlVVlRvUkdCMzJSb3dfTU1YKGNvbnN0IHVpbnQ4KiB5X2J1ZiwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdV9idWYsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHZfYnVmLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiByZ2JfYnVmLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCk7Ci0lZGVmaW5lIFNZTUJPTCBDb252ZXJ0WVVWVG9SR0IzMlJvd19NTVgKLSVpbmNsdWRlICJjb252ZXJ0X3l1dl90b19yZ2JfbW14LmluYyIKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3NpbWQvY29udmVydF95dXZfdG9fcmdiX21teC5pbmMgYi9zcmMvbWVkaWEvYmFzZS9zaW1kL2NvbnZlcnRfeXV2X3RvX3JnYl9tbXguaW5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTU1NWNlLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3NpbWQvY29udmVydF95dXZfdG9fcmdiX21teC5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotOyBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi07IFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLTsgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotICBnbG9iYWwgICAgbWFuZ2xlKFNZTUJPTCkgUFJJVkFURQotICBhbGlnbiAgICAgZnVuY3Rpb25fYWxpZ24KLQotOyBOb24tUElDIGNvZGUgaXMgdGhlIGZhc3Rlc3Qgc28gdXNlIHRoaXMgaWYgcG9zc2libGUuCi0laWZuZGVmIFBJQwotbWFuZ2xlKFNZTUJPTCk6Ci0gICVhc3NpZ24gICBzdGFja19vZmZzZXQgMAotICBQUk9MT0dVRSAgNSwgNywgMywgWSwgVSwgViwgQVJHQiwgV0lEVEgsIFRFTVBVLCBURU1QVgotICBleHRlcm4gICAgbWFuZ2xlKGtDb2VmZmljaWVudHNSZ2JZKQotICBqbXAgICAgICAgLmNvbnZlcnRlbmQKLQotLmNvbnZlcnRsb29wOgotICBtb3Z6eCAgICAgVEVNUFVkLCBCWVRFIFtVcV0KLSAgYWRkICAgICAgIFVxLCAxCi0gIG1vdnp4ICAgICBURU1QVmQsIEJZVEUgW1ZxXQotICBhZGQgICAgICAgVnEsIDEKLSAgbW92cSAgICAgIG1tMCwgW21hbmdsZShrQ29lZmZpY2llbnRzUmdiWSkgKyAyMDQ4ICsgOCAqIFRFTVBVcV0KLSAgbW92enggICAgIFRFTVBVZCwgQllURSBbWXFdCi0gIHBhZGRzdyAgICBtbTAsIFttYW5nbGUoa0NvZWZmaWNpZW50c1JnYlkpICsgNDA5NiArIDggKiBURU1QVnFdCi0gIG1vdnp4ICAgICBURU1QVmQsIEJZVEUgW1lxICsgMV0KLSAgbW92cSAgICAgIG1tMSwgW21hbmdsZShrQ29lZmZpY2llbnRzUmdiWSkgKyA4ICogVEVNUFVxXQotICBhZGQgICAgICAgWXEsIDIKLSAgbW92cSAgICAgIG1tMiwgW21hbmdsZShrQ29lZmZpY2llbnRzUmdiWSkgKyA4ICogVEVNUFZxXQotICBwYWRkc3cgICAgbW0xLCBtbTAKLSAgcGFkZHN3ICAgIG1tMiwgbW0wCi0gIHBzcmF3ICAgICBtbTEsIDYKLSAgcHNyYXcgICAgIG1tMiwgNgotICBwYWNrdXN3YiAgbW0xLCBtbTIKLSAgTU9WUSAgICAgIFtBUkdCcV0sIG1tMQotICBhZGQgICAgICAgQVJHQnEsIDgKLQotLmNvbnZlcnRlbmQ6Ci0gIHN1YiAgICAgICBXSURUSHEsIDIKLSAgam5zICAgICAgIC5jb252ZXJ0bG9vcAotCi0gIDsgSWYgbnVtYmVyIG9mIHBpeGVscyBpcyBvZGQgdGhlbiBjb21wdXRlIGl0LgotICBhbmQgICAgICAgV0lEVEhxLCAxCi0gIGp6ICAgICAgICAuY29udmVydGRvbmUKLQotICBtb3Z6eCAgICAgVEVNUFVkLCBCWVRFIFtVcV0KLSAgbW92cSAgICAgIG1tMCwgW21hbmdsZShrQ29lZmZpY2llbnRzUmdiWSkgKyAyMDQ4ICsgOCAqIFRFTVBVcV0KLSAgbW92enggICAgIFRFTVBWZCwgQllURSBbVnFdCi0gIHBhZGRzdyAgICBtbTAsIFttYW5nbGUoa0NvZWZmaWNpZW50c1JnYlkpICsgNDA5NiArIDggKiBURU1QVnFdCi0gIG1vdnp4ICAgICBURU1QVWQsIEJZVEUgW1lxXQotICBtb3ZxICAgICAgbW0xLCBbbWFuZ2xlKGtDb2VmZmljaWVudHNSZ2JZKSArIDggKiBURU1QVXFdCi0gIHBhZGRzdyAgICBtbTEsIG1tMAotICBwc3JhdyAgICAgbW0xLCA2Ci0gIHBhY2t1c3diICBtbTEsIG1tMQotICBtb3ZkICAgICAgW0FSR0JxXSwgbW0xCi0KLS5jb252ZXJ0ZG9uZToKLSAgUkVUCi0lZW5kaWYKLQotOyBXaXRoIFBJQyBjb2RlIHdlIG5lZWQgdG8gbG9hZCB0aGUgYWRkcmVzcyBvZiBtYW5nbGUoa0NvZWZmaWNpZW50c1JnYlkpLgotOyBUaGlzIGNvZGUgaXMgc2xvd2VyIHRoYW4gdGhlIGFib3ZlIHZlcnNpb24uCi0laWZkZWYgUElDCi1tYW5nbGUoU1lNQk9MKToKLSAgJWFzc2lnbiAgIHN0YWNrX29mZnNldCAwCi0gIFBST0xPR1VFICA1LCA3LCAzLCBZLCBVLCBWLCBBUkdCLCBXSURUSCwgVEVNUCwgVEFCTEUKLQotICBleHRlcm4gICAgbWFuZ2xlKGtDb2VmZmljaWVudHNSZ2JZKQotICBMT0FEX1NZTSAgVEFCTEVxLCBtYW5nbGUoa0NvZWZmaWNpZW50c1JnYlkpCi0KLSAgam1wICAgICAgIC5jb252ZXJ0ZW5kCi0KLS5jb252ZXJ0bG9vcDoKLSAgbW92enggICAgIFRFTVBkLCBCWVRFIFtVcV0KLSAgbW92cSAgICAgIG1tMCwgW1RBQkxFcSArIDIwNDggKyA4ICogVEVNUHFdCi0gIGFkZCAgICAgICBVcSwgMQotCi0gIG1vdnp4ICAgICBURU1QZCwgQllURSBbVnFdCi0gIHBhZGRzdyAgICBtbTAsIFtUQUJMRXEgKyA0MDk2ICsgOCAqIFRFTVBxXQotICBhZGQgICAgICAgVnEsIDEKLQotICBtb3Z6eCAgICAgVEVNUGQsIEJZVEUgW1lxXQotICBtb3ZxICAgICAgbW0xLCBbVEFCTEVxICsgOCAqIFRFTVBxXQotCi0gIG1vdnp4ICAgICBURU1QZCwgQllURSBbWXEgKyAxXQotICBtb3ZxICAgICAgbW0yLCBbVEFCTEVxICsgOCAqIFRFTVBxXQotICBhZGQgICAgICAgWXEsIDIKLQotICA7IEFkZCBVViBjb21wb25lbnRzIHRvIFkgY29tcG9uZW50LgotICBwYWRkc3cgICAgbW0xLCBtbTAKLSAgcGFkZHN3ICAgIG1tMiwgbW0wCi0KLSAgOyBEb3duIHNoaWZ0IGFuZCB0aGVuIHBhY2suCi0gIHBzcmF3ICAgICBtbTEsIDYKLSAgcHNyYXcgICAgIG1tMiwgNgotICBwYWNrdXN3YiAgbW0xLCBtbTIKLSAgTU9WUSAgICAgIFtBUkdCcV0sIG1tMQotICBhZGQgICAgICAgQVJHQnEsIDgKLQotLmNvbnZlcnRlbmQ6Ci0gIHN1YiAgICAgICBXSURUSHEsIDIKLSAgam5zICAgICAgIC5jb252ZXJ0bG9vcAotCi0gIDsgSWYgbnVtYmVyIG9mIHBpeGVscyBpcyBvZGQgdGhlbiBjb21wdXRlIGl0LgotICBhbmQgICAgICAgV0lEVEhxLCAxCi0gIGp6ICAgICAgICAuY29udmVydGRvbmUKLQotICBtb3Z6eCAgICAgVEVNUGQsIEJZVEUgW1VxXQotICBtb3ZxICAgICAgbW0wLCBbVEFCTEVxICsgMjA0OCArIDggKiBURU1QcV0KLSAgbW92enggICAgIFRFTVBkLCBCWVRFIFtWcV0KLSAgcGFkZHN3ICAgIG1tMCwgW1RBQkxFcSArIDQwOTYgKyA4ICogVEVNUHFdCi0gIG1vdnp4ICAgICBURU1QZCwgQllURSBbWXFdCi0gIG1vdnEgICAgICBtbTEsIFtUQUJMRXEgKyA4ICogVEVNUHFdCi0gIHBhZGRzdyAgICBtbTEsIG1tMAotICBwc3JhdyAgICAgbW0xLCA2Ci0gIHBhY2t1c3diICBtbTEsIG1tMQotICBtb3ZkICAgICAgW0FSR0JxXSwgbW0xCi0KLS5jb252ZXJ0ZG9uZToKLSAgUkVUCi0lZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3NpbWQvY29udmVydF95dXZfdG9fcmdiX3NzZS5hc20gYi9zcmMvbWVkaWEvYmFzZS9zaW1kL2NvbnZlcnRfeXV2X3RvX3JnYl9zc2UuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjE5NjdhLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3NpbWQvY29udmVydF95dXZfdG9fcmdiX3NzZS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi07IENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLTsgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotOyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0laW5jbHVkZSAieDg2aW5jLmFzbSIKLQotOwotOyBUaGlzIGZpbGUgdXNlcyBNTVggYW5kIFNTRSBpbnN0cnVjdGlvbnMuCi07Ci0gIFNFQ1RJT05fVEVYVAotICBDUFUgICAgICAgTU1YLCBTU0UKLQotOyBVc2UgU1NFIGluc3RydWN0aW9uIG1vdm50cSBjYW4gd3JpdGUgZmFzdGVyLgotJWRlZmluZSBNT1ZRIG1vdm50cQotCi07Ci07IGV4dGVybiAiQyIgdm9pZCBDb252ZXJ0WVVWVG9SR0IzMlJvd19TU0UoY29uc3QgdWludDgqIHlfYnVmLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB1X2J1ZiwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdl9idWYsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHJnYl9idWYsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKTsKLSVkZWZpbmUgU1lNQk9MIENvbnZlcnRZVVZUb1JHQjMyUm93X1NTRQotJWluY2x1ZGUgImNvbnZlcnRfeXV2X3RvX3JnYl9tbXguaW5jIgpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2Uvc2ltZC9jb252ZXJ0X3l1dl90b19yZ2JfeDg2LmNjIGIvc3JjL21lZGlhL2Jhc2Uvc2ltZC9jb252ZXJ0X3l1dl90b19yZ2JfeDg2LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODI1YmRiLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3NpbWQvY29udmVydF95dXZfdG9fcmdiX3g4Ni5jYworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKQotI2luY2x1ZGUgPGludHJpbi5oPgotI2Vsc2UKLSNpbmNsdWRlIDxtbWludHJpbi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL3NpbWQvY29udmVydF95dXZfdG9fcmdiLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS95dXZfY29udmVydC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi12b2lkIENvbnZlcnRZVVZUb1JHQjMyX01NWChjb25zdCB1aW50OCogeXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHVwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB2cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogcmdiZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXZzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmdic3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgWVVWVHlwZSB5dXZfdHlwZSkgewotICB1bnNpZ25lZCBpbnQgeV9zaGlmdCA9IHl1dl90eXBlOwotICBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7Ci0gICAgdWludDgqIHJnYl9yb3cgPSByZ2JmcmFtZSArIHkgKiByZ2JzdHJpZGU7Ci0gICAgY29uc3QgdWludDgqIHlfcHRyID0geXBsYW5lICsgeSAqIHlzdHJpZGU7Ci0gICAgY29uc3QgdWludDgqIHVfcHRyID0gdXBsYW5lICsgKHkgPj4geV9zaGlmdCkgKiB1dnN0cmlkZTsKLSAgICBjb25zdCB1aW50OCogdl9wdHIgPSB2cGxhbmUgKyAoeSA+PiB5X3NoaWZ0KSAqIHV2c3RyaWRlOwotCi0gICAgQ29udmVydFlVVlRvUkdCMzJSb3dfTU1YKHlfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl9yb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKLSAgfQotCi0gIF9tbV9lbXB0eSgpOwotfQotCi12b2lkIENvbnZlcnRZVVZUb1JHQjMyX1NTRShjb25zdCB1aW50OCogeXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHVwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB2cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogcmdiZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXZzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmdic3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgWVVWVHlwZSB5dXZfdHlwZSkgewotICB1bnNpZ25lZCBpbnQgeV9zaGlmdCA9IHl1dl90eXBlOwotICBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7Ci0gICAgdWludDgqIHJnYl9yb3cgPSByZ2JmcmFtZSArIHkgKiByZ2JzdHJpZGU7Ci0gICAgY29uc3QgdWludDgqIHlfcHRyID0geXBsYW5lICsgeSAqIHlzdHJpZGU7Ci0gICAgY29uc3QgdWludDgqIHVfcHRyID0gdXBsYW5lICsgKHkgPj4geV9zaGlmdCkgKiB1dnN0cmlkZTsKLSAgICBjb25zdCB1aW50OCogdl9wdHIgPSB2cGxhbmUgKyAoeSA+PiB5X3NoaWZ0KSAqIHV2c3RyaWRlOwotCi0gICAgQ29udmVydFlVVlRvUkdCMzJSb3dfU1NFKHlfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl9yb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKLSAgfQotCi0gIF9tbV9lbXB0eSgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3NpbWQvZmlsdGVyX3l1di5oIGIvc3JjL21lZGlhL2Jhc2Uvc2ltZC9maWx0ZXJfeXV2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOWNmMTEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2Uvc2ltZC9maWx0ZXJfeXV2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0JBU0VfU0lNRF9GSUxURVJfWVVWX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfU0lNRF9GSUxURVJfWVVWX0hfCi0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotdHlwZWRlZiB2b2lkICgqRmlsdGVyWVVWUm93c1Byb2MpKHVpbnQ4KiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQpOwotCi12b2lkIEZpbHRlcllVVlJvd3NfQyh1aW50OCogeWJ1ZiwgY29uc3QgdWludDgqIHkwX3B0ciwgY29uc3QgdWludDgqIHkxX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2Vfd2lkdGgsIGludCBzb3VyY2VfeV9mcmFjdGlvbik7Ci0KLXZvaWQgRmlsdGVyWVVWUm93c19NTVgodWludDgqIHlidWYsIGNvbnN0IHVpbnQ4KiB5MF9wdHIsIGNvbnN0IHVpbnQ4KiB5MV9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2Vfd2lkdGgsIGludCBzb3VyY2VfeV9mcmFjdGlvbik7Ci0KLXZvaWQgRmlsdGVyWVVWUm93c19TU0UyKHVpbnQ4KiB5YnVmLCBjb25zdCB1aW50OCogeTBfcHRyLCBjb25zdCB1aW50OCogeTFfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZV93aWR0aCwgaW50IHNvdXJjZV95X2ZyYWN0aW9uKTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQkFTRV9TSU1EX0ZJTFRFUl9ZVVZfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3NpbWQvZmlsdGVyX3l1dl9jLmNjIGIvc3JjL21lZGlhL2Jhc2Uvc2ltZC9maWx0ZXJfeXV2X2MuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyOTJkMjEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2Uvc2ltZC9maWx0ZXJfeXV2X2MuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaW1kL2ZpbHRlcl95dXYuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotdm9pZCBGaWx0ZXJZVVZSb3dzX0ModWludDgqIHlidWYsIGNvbnN0IHVpbnQ4KiB5MF9wdHIsIGNvbnN0IHVpbnQ4KiB5MV9wdHIsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlX3dpZHRoLCBpbnQgc291cmNlX3lfZnJhY3Rpb24pIHsKLSAgaW50IHkxX2ZyYWN0aW9uID0gc291cmNlX3lfZnJhY3Rpb247Ci0gIGludCB5MF9mcmFjdGlvbiA9IDI1NiAtIHkxX2ZyYWN0aW9uOwotICB1aW50OCogZW5kID0geWJ1ZiArIHNvdXJjZV93aWR0aDsKLSAgdWludDgqIHJvdW5kZWRfZW5kID0geWJ1ZiArIChzb3VyY2Vfd2lkdGggJiB+Nyk7Ci0KLSAgd2hpbGUgKHlidWYgPCByb3VuZGVkX2VuZCkgewotICAgIHlidWZbMF0gPSAoeTBfcHRyWzBdICogeTBfZnJhY3Rpb24gKyB5MV9wdHJbMF0gKiB5MV9mcmFjdGlvbikgPj4gODsKLSAgICB5YnVmWzFdID0gKHkwX3B0clsxXSAqIHkwX2ZyYWN0aW9uICsgeTFfcHRyWzFdICogeTFfZnJhY3Rpb24pID4+IDg7Ci0gICAgeWJ1ZlsyXSA9ICh5MF9wdHJbMl0gKiB5MF9mcmFjdGlvbiArIHkxX3B0clsyXSAqIHkxX2ZyYWN0aW9uKSA+PiA4OwotICAgIHlidWZbM10gPSAoeTBfcHRyWzNdICogeTBfZnJhY3Rpb24gKyB5MV9wdHJbM10gKiB5MV9mcmFjdGlvbikgPj4gODsKLSAgICB5YnVmWzRdID0gKHkwX3B0cls0XSAqIHkwX2ZyYWN0aW9uICsgeTFfcHRyWzRdICogeTFfZnJhY3Rpb24pID4+IDg7Ci0gICAgeWJ1Zls1XSA9ICh5MF9wdHJbNV0gKiB5MF9mcmFjdGlvbiArIHkxX3B0cls1XSAqIHkxX2ZyYWN0aW9uKSA+PiA4OwotICAgIHlidWZbNl0gPSAoeTBfcHRyWzZdICogeTBfZnJhY3Rpb24gKyB5MV9wdHJbNl0gKiB5MV9mcmFjdGlvbikgPj4gODsKLSAgICB5YnVmWzddID0gKHkwX3B0cls3XSAqIHkwX2ZyYWN0aW9uICsgeTFfcHRyWzddICogeTFfZnJhY3Rpb24pID4+IDg7Ci0gICAgeTBfcHRyICs9IDg7Ci0gICAgeTFfcHRyICs9IDg7Ci0gICAgeWJ1ZiArPSA4OwotICB9Ci0KLSAgd2hpbGUgKHlidWYgPCBlbmQpIHsKLSAgICB5YnVmWzBdID0gKHkwX3B0clswXSAqIHkwX2ZyYWN0aW9uICsgeTFfcHRyWzBdICogeTFfZnJhY3Rpb24pID4+IDg7Ci0gICAgKyt5YnVmOwotICAgICsreTBfcHRyOwotICAgICsreTFfcHRyOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2Uvc2ltZC9maWx0ZXJfeXV2X21teC5jYyBiL3NyYy9tZWRpYS9iYXNlL3NpbWQvZmlsdGVyX3l1dl9tbXguY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZDYyZTMuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2Uvc2ltZC9maWx0ZXJfeXV2X21teC5jYworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKQotI2luY2x1ZGUgPGludHJpbi5oPgotI2Vsc2UKLSNpbmNsdWRlIDxtbWludHJpbi5oPgotI2luY2x1ZGUgPGVtbWludHJpbi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJidWlsZC9idWlsZF9jb25maWcuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3NpbWQvZmlsdGVyX3l1di5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0jaWYgZGVmaW5lZChDT01QSUxFUl9NU1ZDKQotLy8gV2FybmluZyA0Nzk5IGlzIGFib3V0IGNhbGxpbmcgZW1tcyBiZWZvcmUgdGhlIGZ1bmN0aW9uIGV4aXRzLgotLy8gV2UgY2FsbHMgZW1tcyBpbiBhIGZyYW1lIGxldmVsIHNvIHN1cHByZXNzIHRoaXMgd2FybmluZy4KLSNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0Nzk5KQotI2VuZGlmCi0KLXZvaWQgRmlsdGVyWVVWUm93c19NTVgodWludDgqIGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBzcmMwLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogc3JjMSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhY3Rpb24pIHsKLSAgaW50IHBpeGVsID0gMDsKLQotICAvLyBQcm9jZXNzIHRoZSB1bmFsaWduZWQgYnl0ZXMgZmlyc3QuCi0gIGludCB1bmFsaWduZWRfd2lkdGggPQotICAgICAgKDggLSAocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGRlc3QpICYgNykpICYgNzsKLSAgd2hpbGUgKHBpeGVsIDwgd2lkdGggJiYgcGl4ZWwgPCB1bmFsaWduZWRfd2lkdGgpIHsKLSAgICBkZXN0W3BpeGVsXSA9IChzcmMwW3BpeGVsXSAqICgyNTYgLSBmcmFjdGlvbikgKwotICAgICAgICAgICAgICAgICAgIHNyYzFbcGl4ZWxdICogZnJhY3Rpb24pID4+IDg7Ci0gICAgKytwaXhlbDsKLSAgfQotCi0gIF9fbTY0IHplcm8gPSBfbW1fc2V0emVyb19zaTY0KCk7Ci0gIF9fbTY0IHNyYzFfZnJhY3Rpb24gPSBfbW1fc2V0MV9waTE2KGZyYWN0aW9uKTsKLSAgX19tNjQgc3JjMF9mcmFjdGlvbiA9IF9tbV9zZXQxX3BpMTYoMjU2IC0gZnJhY3Rpb24pOwotICBjb25zdCBfX202NCogc3JjMF82NCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgX19tNjQqPihzcmMwICsgcGl4ZWwpOwotICBjb25zdCBfX202NCogc3JjMV82NCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgX19tNjQqPihzcmMxICsgcGl4ZWwpOwotICBfX202NCogZGVzdDY0ID0gcmVpbnRlcnByZXRfY2FzdDxfX202NCo+KGRlc3QgKyBwaXhlbCk7Ci0gIF9fbTY0KiBlbmQ2NCA9IHJlaW50ZXJwcmV0X2Nhc3Q8X19tNjQqPigKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihkZXN0ICsgd2lkdGgpICYgfjcpOwotCi0gIHdoaWxlIChkZXN0NjQgPCBlbmQ2NCkgewotICAgIF9fbTY0IHNyYzAgPSAqc3JjMF82NCsrOwotICAgIF9fbTY0IHNyYzEgPSAqc3JjMV82NCsrOwotICAgIF9fbTY0IHNyYzIgPSBfbW1fdW5wYWNraGlfcGk4KHNyYzAsIHplcm8pOwotICAgIF9fbTY0IHNyYzMgPSBfbW1fdW5wYWNraGlfcGk4KHNyYzEsIHplcm8pOwotICAgIHNyYzAgPSBfbW1fdW5wYWNrbG9fcGk4KHNyYzAsIHplcm8pOwotICAgIHNyYzEgPSBfbW1fdW5wYWNrbG9fcGk4KHNyYzEsIHplcm8pOwotICAgIHNyYzAgPSBfbW1fbXVsbG9fcGkxNihzcmMwLCBzcmMwX2ZyYWN0aW9uKTsKLSAgICBzcmMxID0gX21tX211bGxvX3BpMTYoc3JjMSwgc3JjMV9mcmFjdGlvbik7Ci0gICAgc3JjMiA9IF9tbV9tdWxsb19waTE2KHNyYzIsIHNyYzBfZnJhY3Rpb24pOwotICAgIHNyYzMgPSBfbW1fbXVsbG9fcGkxNihzcmMzLCBzcmMxX2ZyYWN0aW9uKTsKLSAgICBzcmMwID0gX21tX2FkZF9waTE2KHNyYzAsIHNyYzEpOwotICAgIHNyYzIgPSBfbW1fYWRkX3BpMTYoc3JjMiwgc3JjMyk7Ci0gICAgc3JjMCA9IF9tbV9zcmxpX3BpMTYoc3JjMCwgOCk7Ci0gICAgc3JjMiA9IF9tbV9zcmxpX3BpMTYoc3JjMiwgOCk7Ci0gICAgc3JjMCA9IF9tbV9wYWNrc19wdTE2KHNyYzAsIHNyYzIpOwotICAgICpkZXN0NjQrKyA9IHNyYzA7Ci0gICAgcGl4ZWwgKz0gODsKLSAgfQotCi0gIHdoaWxlIChwaXhlbCA8IHdpZHRoKSB7Ci0gICAgZGVzdFtwaXhlbF0gPSAoc3JjMFtwaXhlbF0gKiAoMjU2IC0gZnJhY3Rpb24pICsKLSAgICAgICAgICAgICAgICAgICBzcmMxW3BpeGVsXSAqIGZyYWN0aW9uKSA+PiA4OwotICAgICsrcGl4ZWw7Ci0gIH0KLX0KLQotI2lmIGRlZmluZWQoQ09NUElMRVJfTVNWQykKLSNwcmFnbWEgd2FybmluZyhkZWZhdWx0OiA0Nzk5KQotI2VuZGlmCi0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2Uvc2ltZC9maWx0ZXJfeXV2X3NzZTIuY2MgYi9zcmMvbWVkaWEvYmFzZS9zaW1kL2ZpbHRlcl95dXZfc3NlMi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkYmE1YS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9zaW1kL2ZpbHRlcl95dXZfc3NlMi5jYworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKQotI2luY2x1ZGUgPGludHJpbi5oPgotI2Vsc2UKLSNpbmNsdWRlIDxtbWludHJpbi5oPgotI2luY2x1ZGUgPGVtbWludHJpbi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL3NpbWQvZmlsdGVyX3l1di5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi12b2lkIEZpbHRlcllVVlJvd3NfU1NFMih1aW50OCogZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBzcmMwLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhY3Rpb24pIHsKLSAgaW50IHBpeGVsID0gMDsKLQotICAvLyBQcm9jZXNzIHRoZSB1bmFsaWduZWQgYnl0ZXMgZmlyc3QuCi0gIGludCB1bmFsaWduZWRfd2lkdGggPQotICAgICAgKDE2IC0gKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihkZXN0KSAmIDE1KSkgJiAxNTsKLSAgd2hpbGUgKHBpeGVsIDwgd2lkdGggJiYgcGl4ZWwgPCB1bmFsaWduZWRfd2lkdGgpIHsKLSAgICBkZXN0W3BpeGVsXSA9IChzcmMwW3BpeGVsXSAqICgyNTYgLSBmcmFjdGlvbikgKwotICAgICAgICAgICAgICAgICAgIHNyYzFbcGl4ZWxdICogZnJhY3Rpb24pID4+IDg7Ci0gICAgKytwaXhlbDsKLSAgfQotCi0gIF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7Ci0gIF9fbTEyOGkgc3JjMV9mcmFjdGlvbiA9IF9tbV9zZXQxX2VwaTE2KGZyYWN0aW9uKTsKLSAgX19tMTI4aSBzcmMwX2ZyYWN0aW9uID0gX21tX3NldDFfZXBpMTYoMjU2IC0gZnJhY3Rpb24pOwotICBjb25zdCBfX20xMjhpKiBzcmMwXzEyOCA9Ci0gICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IF9fbTEyOGkqPihzcmMwICsgcGl4ZWwpOwotICBjb25zdCBfX20xMjhpKiBzcmMxXzEyOCA9Ci0gICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IF9fbTEyOGkqPihzcmMxICsgcGl4ZWwpOwotICBfX20xMjhpKiBkZXN0MTI4ID0gcmVpbnRlcnByZXRfY2FzdDxfX20xMjhpKj4oZGVzdCArIHBpeGVsKTsKLSAgX19tMTI4aSogZW5kMTI4ID0gcmVpbnRlcnByZXRfY2FzdDxfX20xMjhpKj4oCi0gICAgICByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oZGVzdCArIHdpZHRoKSAmIH4xNSk7Ci0KLSAgd2hpbGUgKGRlc3QxMjggPCBlbmQxMjgpIHsKLSAgICBfX20xMjhpIHNyYzAgPSBfbW1fbG9hZHVfc2kxMjgoc3JjMF8xMjgpOwotICAgIF9fbTEyOGkgc3JjMSA9IF9tbV9sb2FkdV9zaTEyOChzcmMxXzEyOCk7Ci0gICAgX19tMTI4aSBzcmMyID0gX21tX3VucGFja2hpX2VwaTgoc3JjMCwgemVybyk7Ci0gICAgX19tMTI4aSBzcmMzID0gX21tX3VucGFja2hpX2VwaTgoc3JjMSwgemVybyk7Ci0gICAgc3JjMCA9IF9tbV91bnBhY2tsb19lcGk4KHNyYzAsIHplcm8pOwotICAgIHNyYzEgPSBfbW1fdW5wYWNrbG9fZXBpOChzcmMxLCB6ZXJvKTsKLSAgICBzcmMwID0gX21tX211bGxvX2VwaTE2KHNyYzAsIHNyYzBfZnJhY3Rpb24pOwotICAgIHNyYzEgPSBfbW1fbXVsbG9fZXBpMTYoc3JjMSwgc3JjMV9mcmFjdGlvbik7Ci0gICAgc3JjMiA9IF9tbV9tdWxsb19lcGkxNihzcmMyLCBzcmMwX2ZyYWN0aW9uKTsKLSAgICBzcmMzID0gX21tX211bGxvX2VwaTE2KHNyYzMsIHNyYzFfZnJhY3Rpb24pOwotICAgIHNyYzAgPSBfbW1fYWRkX2VwaTE2KHNyYzAsIHNyYzEpOwotICAgIHNyYzIgPSBfbW1fYWRkX2VwaTE2KHNyYzIsIHNyYzMpOwotICAgIHNyYzAgPSBfbW1fc3JsaV9lcGkxNihzcmMwLCA4KTsKLSAgICBzcmMyID0gX21tX3NybGlfZXBpMTYoc3JjMiwgOCk7Ci0gICAgc3JjMCA9IF9tbV9wYWNrdXNfZXBpMTYoc3JjMCwgc3JjMik7Ci0gICAgKmRlc3QxMjgrKyA9IHNyYzA7Ci0gICAgKytzcmMwXzEyODsKLSAgICArK3NyYzFfMTI4OwotICAgIHBpeGVsICs9IDE2OwotICB9Ci0KLSAgd2hpbGUgKHBpeGVsIDwgd2lkdGgpIHsKLSAgICBkZXN0W3BpeGVsXSA9IChzcmMwW3BpeGVsXSAqICgyNTYgLSBmcmFjdGlvbikgKwotICAgICAgICAgICAgICAgICAgIHNyYzFbcGl4ZWxdICogZnJhY3Rpb24pID4+IDg7Ci0gICAgKytwaXhlbDsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3NpbWQvbGluZWFyX3NjYWxlX3l1dl90b19yZ2JfbW14LmFzbSBiL3NyYy9tZWRpYS9iYXNlL3NpbWQvbGluZWFyX3NjYWxlX3l1dl90b19yZ2JfbW14LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y3ZTBlOC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9zaW1kL2xpbmVhcl9zY2FsZV95dXZfdG9fcmdiX21teC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi07IENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLTsgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotOyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0laW5jbHVkZSAieDg2aW5jLmFzbSIKLQotOwotOyBUaGlzIGZpbGUgdXNlcyBNTVggaW5zdHJ1Y3Rpb25zLgotOwotICBTRUNUSU9OX1RFWFQKLSAgQ1BVICAgICAgIE1NWAotCi07IFVzZSBtb3ZxIHRvIHNhdmUgdGhlIG91dHB1dC4KLSVkZWZpbmUgTU9WUSBtb3ZxCi0KLTsgdm9pZCBMaW5lYXJTY2FsZVlVVlRvUkdCMzJSb3dfTU1YKGNvbnN0IHVpbnQ4KiB5X2J1ZiwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB1X2J1ZiwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB2X2J1ZiwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiByZ2JfYnVmLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZV9keCk7Ci0lZGVmaW5lIFNZTUJPTCBMaW5lYXJTY2FsZVlVVlRvUkdCMzJSb3dfTU1YCi0laW5jbHVkZSAibGluZWFyX3NjYWxlX3l1dl90b19yZ2JfbW14LmluYyIKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3NpbWQvbGluZWFyX3NjYWxlX3l1dl90b19yZ2JfbW14LmluYyBiL3NyYy9tZWRpYS9iYXNlL3NpbWQvbGluZWFyX3NjYWxlX3l1dl90b19yZ2JfbW14LmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFjMDZhNS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9zaW1kL2xpbmVhcl9zY2FsZV95dXZfdG9fcmdiX21teC5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotOyBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi07IFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLTsgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotICBnbG9iYWwgICAgbWFuZ2xlKFNZTUJPTCkgUFJJVkFURQotICBhbGlnbiAgICAgZnVuY3Rpb25fYWxpZ24KLQotbWFuZ2xlKFNZTUJPTCk6Ci0gICVhc3NpZ24gICBzdGFja19vZmZzZXQgMAotCi0gIGV4dGVybiAgICBtYW5nbGUoa0NvZWZmaWNpZW50c1JnYlkpCi0KLTsgUGFyYW1ldGVycyBhcmUgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKLTsgMS4gWSBwbGFuZQotOyAyLiBVIHBsYW5lCi07IDMuIFYgcGxhbmUKLTsgNC4gQVJHQiBmcmFtZQotOyA1LiBXaWR0aAotOyA2LiBTb3VyY2UgZHgKLQotUFJPTE9HVUUgIDYsIDcsIDMsIFksIFIwLCBSMSwgQVJHQiwgUjIsIFIzLCBURU1QCi0KLSVpZiBncHJzaXplID09IDgKLSVkZWZpbmUgICAgIFdPUkRfU0laRSAgIFFXT1JECi0lZWxzZQotJWRlZmluZSAgICAgV09SRF9TSVpFICAgRFdPUkQKLSVlbmRpZgotCi07IERlZmluZSByZWdpc3RlciBhbGlhc2VzLgotJWRlZmluZSAgICAgWHEgICAgICAgICAgICAgICAgICBSMXEgICAgIDsgQ3VycmVudCBYIHBvc2l0aW9uCi0lZGVmaW5lICAgICBDT01QTHEgICAgICAgICAgICAgIFIycSAgICAgOyBDb21wb25lbnQgQSB2YWx1ZQotJWRlZmluZSAgICAgQ09NUExkICAgICAgICAgICAgICBSMmQgICAgIDsgQ29tcG9uZW50IEEgdmFsdWUKLSVkZWZpbmUgICAgIFVfQVJHX1JFR3EgICAgICAgICAgUjBxICAgICA7IFUgcGxhbmUgYWRkcmVzcyBhcmd1bWVudAotJWRlZmluZSAgICAgVl9BUkdfUkVHcSAgICAgICAgICBSMXEgICAgIDsgViBwbGFuZSBhZGRyZXNzIGFyZ3VtZW50Ci0lZGVmaW5lICAgICBTT1VSQ0VfRFhfQVJHX1JFR3EgIFIzcSAgICAgOyBTb3VyY2UgZHggYXJndW1lbnQKLSVkZWZpbmUgICAgIFdJRFRIX0FSR19SRUdxICAgICAgUjJxICAgICA7IFdpZHRoIGFyZ3VtZW50Ci0KLSVpZmRlZiBQSUMKLTsgUElDIGNvZGUgc2hhcmVkIENPTVBSLCBVIGFuZCBWIHdpdGggdGhlIHNhbWUgcmVnaXN0ZXIuIE5lZWQgdG8gYmUgY2FyZWZ1bCBpbiB0aGUKLTsgY29kZSB0aGV5IGRvbid0IG1peCB1cC4gVGhpcyBhbGxvd3MgUjNxIHRvIGJlIHVzZWQgZm9yIFlVViB0YWJsZS4KLSVkZWZpbmUgICAgIENPTVBScSAgICAgICAgICAgICAgUjBxICAgICA7IENvbXBvbmVudCBCIHZhbHVlCi0lZGVmaW5lICAgICBDT01QUmQgICAgICAgICAgICAgIFIwZCAgICAgOyBDb21wb25lbnQgQiB2YWx1ZQotJWRlZmluZSAgICAgVXEgICAgICAgICAgICAgICAgICBSMHEgICAgIDsgVSBwbGFuZSBhZGRyZXNzCi0lZGVmaW5lICAgICBWcSAgICAgICAgICAgICAgICAgIFIwcSAgICAgOyBWIHBsYW5lIGFkZHJlc3MKLSVkZWZpbmUgICAgIFVfUExBTkUgICAgICAgICAgICAgV09SRF9TSVpFIFtyc3AgKyAzICogZ3Byc2l6ZV0KLSVkZWZpbmUgICAgIFRBQkxFICAgICAgICAgICAgICAgUjNxICAgICA7IEFkZHJlc3Mgb2YgdGhlIHRhYmxlCi0lZWxzZQotOyBOb24tUElDIGNvZGUgZGVmaW5lcy4KLSVkZWZpbmUgICAgIENPTVBScSAgICAgICAgICAgICAgUjNxICAgICA7IENvbXBvbmVudCBCIHZhbHVlCi0lZGVmaW5lICAgICBDT01QUmQgICAgICAgICAgICAgIFIzZCAgICAgOyBDb21wb25lbnQgQiB2YWx1ZQotJWRlZmluZSAgICAgVXEgICAgICAgICAgICAgICAgICBSMHEgICAgIDsgVSBwbGFuZSBhZGRyZXNzCi0lZGVmaW5lICAgICBWcSAgICAgICAgICAgICAgICAgIFIzcSAgICAgOyBWIHBsYW5lIGFkZHJlc3MKLSVkZWZpbmUgICAgIFRBQkxFICAgICAgICAgICAgICAgbWFuZ2xlKGtDb2VmZmljaWVudHNSZ2JZKQotJWVuZGlmCi0KLTsgRGVmaW5lcyBmb3Igc3RhY2sgdmFyaWFibGVzLiBUaGVzZSBhcmUgdXNlZCBpbiBib3RoIFBJQyBhbmQgbm9uLVBJQyBjb2RlLgotJWRlZmluZSAgICAgVl9QTEFORSAgICAgICAgICAgICBXT1JEX1NJWkUgW3JzcCArIDIgKiBncHJzaXplXQotJWRlZmluZSAgICAgU09VUkNFX0RYICAgICAgICAgICBXT1JEX1NJWkUgW3JzcCArIGdwcnNpemVdCi0lZGVmaW5lICAgICBTT1VSQ0VfV0lEVEggICAgICAgIFdPUkRfU0laRSBbcnNwXQotCi07IEhhbmRsZSBzdGFjayB2YXJpYWJsZXMgZGlmZmVyZW50bHkgZm9yIFBJQyBhbmQgbm9uLVBJQyBjb2RlLgotCi0laWZkZWYgUElDCi07IERlZmluZSBzdGFjayB1c2FnZSBmb3IgUElDIGNvZGUuIFBJQyBjb2RlIHB1c2ggVSBwbGFuZSBvbnRvIHN0YWNrLgotICBQVVNIICAgICAgVV9BUkdfUkVHcQotICBQVVNIICAgICAgVl9BUkdfUkVHcQotICBQVVNIICAgICAgU09VUkNFX0RYX0FSR19SRUdxCi0gIGltdWwgICAgICBXSURUSF9BUkdfUkVHcSwgU09VUkNFX0RYX0FSR19SRUdxICA7IHNvdXJjZV93aWR0aCA9IHdpZHRoICogc291cmNlX2R4Ci0gIFBVU0ggICAgICBXSURUSF9BUkdfUkVHcQotCi07IExvYWQgdGhlIGFkZHJlc3Mgb2Yga0NvZWZmaWNpZW50c1JnYlkgaW50byBUQUJMRQotICBtb3YgICAgICAgVEVNUHEsIFNPVVJDRV9EWF9BUkdfUkVHcSAgICA7IE5lZWQgdG8gc2F2ZSBzb3VyY2VfZHggZmlyc3QKLSAgTE9BRF9TWU0gIFRBQkxFLCBtYW5nbGUoa0NvZWZmaWNpZW50c1JnYlkpCi0lZGVmaW5lICAgICBTT1VSQ0VfRFhfQVJHX1JFR3EgIFRFTVBxICAgOyBPdmVyd3JpdGUgU09VUkNFX0RYX0FSR19SRUdxIHRvIFRFTVBxCi0lZWxzZQotOyBEZWZpbmUgc3RhY2sgdXNhZ2UuIE5vbi1QSUMgY29kZSBqdXN0IHB1c2ggMyByZWdpc3RlcnMgdG8gc3RhY2suCi0gIFBVU0ggICAgICBWX0FSR19SRUdxCi0gIFBVU0ggICAgICBTT1VSQ0VfRFhfQVJHX1JFR3EKLSAgaW11bCAgICAgIFdJRFRIX0FSR19SRUdxLCBTT1VSQ0VfRFhfQVJHX1JFR3EgIDsgc291cmNlX3dpZHRoID0gd2lkdGggKiBzb3VyY2VfZHgKLSAgUFVTSCAgICAgIFdJRFRIX0FSR19SRUdxCi0lZW5kaWYKLQotJW1hY3JvIEVQSUxPR1VFIDAKLSVpZmRlZiBQSUMKLSAgQUREICAgICAgIHJzcCwgNCAqIGdwcnNpemUKLSVlbHNlCi0gIEFERCAgICAgICByc3AsIDMgKiBncHJzaXplCi0lZW5kaWYKLSVlbmRtYWNybwotCi0gIHhvciAgICAgICBYcSwgWHEgICAgICAgICAgICAgICAgICAgICAgIDsgeCA9IDAKLSAgY21wICAgICAgIFNPVVJDRV9EWF9BUkdfUkVHcSwgMHgyMDAwMAotICBqbCAgICAgICAgLmxzY2FsZWVuZAotICBtb3YgICAgICAgWHEsIDB4ODAwMCAgICAgICAgICAgICAgICAgICA7IHggPSAwLjUgZm9yIDEvMiBvciBsZXNzCi0gIGptcCAgICAgICAubHNjYWxlZW5kCi0KLS5sc2NhbGVsb29wOgotJWlmZGVmIFBJQwotICBtb3YgICAgICAgVXEsIFVfUExBTkUgICAgICAgICAgICAgICAgICA7IFBJQyBjb2RlIHNhdmVzIFVfUExBTkUgb24gc3RhY2suCi0lZW5kaWYKLQotOyBEZWZpbmUgbWFjcm9zIGZvciBzY2FsaW5nIFlVViBjb21wb25lbnRzIHNpbmNlIHRoZXkgYXJlIHJldXNlZC4KLSVtYWNybyBTQ0FMRVVWIDEKLSAgbW92ICAgICAgIFRFTVBxLCBYcQotICBzYXIgICAgICAgVEVNUHEsIDB4MTEKLSAgbW92enggICAgIENPTVBMZCwgQllURSBbJTEgKyBURU1QcV0KLSAgbW92enggICAgIENPTVBSZCwgQllURSBbJTEgKyBURU1QcSArIDFdCi0gIG1vdiAgICAgICBURU1QcSwgWHEKLSAgYW5kICAgICAgIFRFTVBxLCAweDFmZmZlCi0gIGltdWwgICAgICBDT01QUnEsIFRFTVBxCi0gIHhvciAgICAgICBURU1QcSwgMHgxZmZmZQotICBpbXVsICAgICAgQ09NUExxLCBURU1QcQotICBhZGQgICAgICAgQ09NUExxLCBDT01QUnEKLSAgc2hyICAgICAgIENPTVBMcSwgMTcKLSVlbmRtYWNybwotICBTQ0FMRVVWICAgVXEgICAgICAgICAgICAgICAgICAgICAgICAgICA7IFVzZSB0aGUgYWJvdmUgbWFjcm8gdG8gc2NhbGUgVQotICBtb3ZxICAgICAgbW0wLCBbVEFCTEUgKyAyMDQ4ICsgOCAqIENPTVBMcV0KLQotICBtb3YgICAgICAgVnEsIFZfUExBTkUgICAgICAgICAgICAgICAgICA7IFJlYWQgViBhZGRyZXNzIGZyb20gc3RhY2sKLSAgU0NBTEVVViAgIFZxICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBVc2UgdGhlIGFib3ZlIG1hY3JvIHRvIHNjYWxlIFYKLSAgcGFkZHN3ICAgIG1tMCwgW1RBQkxFICsgNDA5NiArIDggKiBDT01QTHFdCi0KLSVtYWNybyBTQ0FMRVkgMAotICBtb3YgICAgICAgVEVNUHEsIFhxCi0gIHNhciAgICAgICBURU1QcSwgMHgxMAotICBtb3Z6eCAgICAgQ09NUExkLCBCWVRFIFtZcSArIFRFTVBxXQotICBtb3Z6eCAgICAgQ09NUFJkLCBCWVRFIFtZcSArIFRFTVBxICsgMV0KLSAgbW92ICAgICAgIFRFTVBxLCBYcQotICBhZGQgICAgICAgWHEsIFNPVVJDRV9EWCAgICAgICAgICAgICAgICAgOyBBZGQgc291cmNlX2R4IGZyb20gc3RhY2sKLSAgYW5kICAgICAgIFRFTVBxLCAweGZmZmYKLSAgaW11bCAgICAgIENPTVBScSwgVEVNUHEKLSAgeG9yICAgICAgIFRFTVBxLCAweGZmZmYKLSAgaW11bCAgICAgIENPTVBMcSwgVEVNUHEKLSAgYWRkICAgICAgIENPTVBMcSwgQ09NUFJxCi0gIHNociAgICAgICBDT01QTHEsIDE2Ci0lZW5kbWFjcm8KLSAgU0NBTEVZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgVXNlIHRoZSBhYm92ZSBtYWNybyB0byBzY2FsZSBZMQotICBtb3ZxICAgICAgbW0xLCBbVEFCTEUgKyA4ICogQ09NUExxXQotCi0gIGNtcCAgICAgICBYcSwgU09VUkNFX1dJRFRIICAgICAgICAgICAgICA7IENvbXBhcmUgc291cmNlX3dpZHRoIGZyb20gc3RhY2sKLSAgamdlICAgICAgIC5sc2NhbGVsYXN0cGl4ZWwKLQotICBTQ0FMRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBVc2UgdGhlIGFib3ZlIG1hY3JvIHRvIHNhY2xlIFkyCi0gIG1vdnEgICAgICBtbTIsIFtUQUJMRSArIDggKiBDT01QTHFdCi0KLSAgcGFkZHN3ICAgIG1tMSwgbW0wCi0gIHBhZGRzdyAgICBtbTIsIG1tMAotICBwc3JhdyAgICAgbW0xLCAweDYKLSAgcHNyYXcgICAgIG1tMiwgMHg2Ci0gIHBhY2t1c3diICBtbTEsIG1tMgotICBNT1ZRICAgICAgW0FSR0JxXSwgbW0xCi0gIGFkZCAgICAgICBBUkdCcSwgMHg4Ci0KLS5sc2NhbGVlbmQ6Ci0gIGNtcCAgICAgICBYcSwgU09VUkNFX1dJRFRIICAgICA7IENvbXBhcmUgc291cmNlX3dpZHRoIGZyb20gc3RhY2sKLSAgamwgICAgICAgIC5sc2NhbGVsb29wCi0gIEVQSUxPR1VFCi0gIFJFVAotCi0ubHNjYWxlbGFzdHBpeGVsOgotICBwYWRkc3cgICAgbW0xLCBtbTAKLSAgcHNyYXcgICAgIG1tMSwgNgotICBwYWNrdXN3YiAgbW0xLCBtbTEKLSAgbW92ZCAgICAgIFtBUkdCcV0sIG1tMQotICBFUElMT0dVRQotICBSRVQKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3NpbWQvbGluZWFyX3NjYWxlX3l1dl90b19yZ2JfbW14X3g2NC5hc20gYi9zcmMvbWVkaWEvYmFzZS9zaW1kL2xpbmVhcl9zY2FsZV95dXZfdG9fcmdiX21teF94NjQuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjc4NTQ0Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3NpbWQvbGluZWFyX3NjYWxlX3l1dl90b19yZ2JfbW14X3g2NC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotOyBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi07IFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLTsgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotJWluY2x1ZGUgIng4NmluYy5hc20iCi0KLTsKLTsgVGhpcyBmaWxlIHVzZXMgTU1YIGluc3RydWN0aW9ucy4KLTsKLSAgU0VDVElPTl9URVhUCi0gIENQVSAgICAgICBNTVgKLQotJWRlZmluZSBTWU1CT0wgTGluZWFyU2NhbGVZVVZUb1JHQjMyUm93X01NWF9YNjQKLSAgZ2xvYmFsICAgIG1hbmdsZShTWU1CT0wpIFBSSVZBVEUKLSAgYWxpZ24gICAgIGZ1bmN0aW9uX2FsaWduCi0KLW1hbmdsZShTWU1CT0wpOgotICAlYXNzaWduICAgc3RhY2tfb2Zmc2V0IDAKLSAgZXh0ZXJuICAgIG1hbmdsZShrQ29lZmZpY2llbnRzUmdiWSkKLQotOyBQYXJhbWV0ZXJzIGFyZSBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgotOyAxLiBZIHBsYW5lCi07IDIuIFUgcGxhbmUKLTsgMy4gViBwbGFuZQotOyA0LiBBUkdCIGZyYW1lCi07IDUuIFdpZHRoCi07IDYuIFNvdXJjZSBkeAotCi1QUk9MT0dVRSAgNiwgNywgMywgWSwgVSwgViwgQVJHQiwgV0lEVEgsIFNPVVJDRV9EWCwgQ09NUEwKLQotJWRlZmluZSAgICAgVEFCTEVxICAgICByMTAKLSVkZWZpbmUgICAgIFhxICAgICAgICAgcjExCi0lZGVmaW5lICAgICBJTkRFWHEgICAgIHIxMgotJWRlZmluZSAgICAgQ09NUFJkICAgICByMTNkCi0lZGVmaW5lICAgICBDT01QUnEgICAgIHIxMwotJWRlZmluZSAgICAgRlJBQ1RJT05xICByMTQKLQotICBQVVNIICAgICAgVEFCTEVxCi0gIFBVU0ggICAgICBYcQotICBQVVNIICAgICAgSU5ERVhxCi0gIFBVU0ggICAgICBDT01QUnEKLSAgUFVTSCAgICAgIEZSQUNUSU9OcQotCi0lbWFjcm8gRVBJTE9HVUUgMAotICBQT1AgICAgICAgRlJBQ1RJT05xCi0gIFBPUCAgICAgICBDT01QUnEKLSAgUE9QICAgICAgIElOREVYcQotICBQT1AgICAgICAgWHEKLSAgUE9QICAgICAgIFRBQkxFcQotJWVuZG1hY3JvCi0KLSAgTE9BRF9TWU0gIFRBQkxFcSwgbWFuZ2xlKGtDb2VmZmljaWVudHNSZ2JZKQotCi0gIGltdWwgICAgICBXSURUSHEsIFNPVVJDRV9EWHEgICAgICAgICAgIDsgc291cmNlX3dpZHRoID0gd2lkdGggKiBzb3VyY2VfZHgKLSAgeG9yICAgICAgIFhxLCBYcSAgICAgICAgICAgICAgICAgICAgICAgOyB4ID0gMAotICBjbXAgICAgICAgU09VUkNFX0RYcSwgMHgyMDAwMAotICBqbCAgICAgICAgLmxzY2FsZWVuZAotICBtb3YgICAgICAgWHEsIDB4ODAwMCAgICAgICAgICAgICAgICAgICA7IHggPSAwLjUgZm9yIDEvMiBvciBsZXNzCi0gIGptcCAgICAgICAubHNjYWxlZW5kCi0KLS5sc2NhbGVsb29wOgotICA7IEludGVycG9sYXRlIFUKLSAgbW92ICAgICAgIElOREVYcSwgWHEKLSAgc2FyICAgICAgIElOREVYcSwgMHgxMQotICBtb3Z6eCAgICAgQ09NUExkLCBCWVRFIFtVcSArIElOREVYcV0KLSAgbW92enggICAgIENPTVBSZCwgQllURSBbVXEgKyBJTkRFWHEgKyAxXQotICBtb3YgICAgICAgRlJBQ1RJT05xLCBYcQotICBhbmQgICAgICAgRlJBQ1RJT05xLCAweDFmZmZlCi0gIGltdWwgICAgICBDT01QUnEsIEZSQUNUSU9OcQotICB4b3IgICAgICAgRlJBQ1RJT05xLCAweDFmZmZlCi0gIGltdWwgICAgICBDT01QTHEsIEZSQUNUSU9OcQotICBhZGQgICAgICAgQ09NUExxLCBDT01QUnEKLSAgc2hyICAgICAgIENPTVBMcSwgMTcKLSAgbW92cSAgICAgIG1tMCwgW1RBQkxFcSArIDIwNDggKyA4ICogQ09NUExxXQotCi0gIDsgSW50ZXJwb2xhdGUgVgotICBtb3Z6eCAgICAgQ09NUExkLCBCWVRFIFtWcSArIElOREVYcV0KLSAgbW92enggICAgIENPTVBSZCwgQllURSBbVnEgKyBJTkRFWHEgKyAxXQotICA7IFRyaWNrIGhlcmUgdG8gaW11bCBDT01QTCBmaXJzdCB0aGVuIENPTVBSLgotICA7IFNhdmVzIHR3byBpbnN0cnVjdGlvbi4gOikKLSAgaW11bCAgICAgIENPTVBMcSwgRlJBQ1RJT05xCi0gIHhvciAgICAgICBGUkFDVElPTnEsIDB4MWZmZmUKLSAgaW11bCAgICAgIENPTVBScSwgRlJBQ1RJT05xCi0gIGFkZCAgICAgICBDT01QTHEsIENPTVBScQotICBzaHIgICAgICAgQ09NUExxLCAxNwotICBwYWRkc3cgICAgbW0wLCBbVEFCTEVxICsgNDA5NiArIDggKiBDT01QTHFdCi0KLSAgOyBJbnRlcnBvbGF0ZSBmaXJzdCBZMS4KLSAgbGVhICAgICAgIElOREVYcSwgW1hxICsgU09VUkNFX0RYcV0gICA7IElOREVYcSBub3cgcG9pbnRzIHRvIG5leHQgcGl4ZWwuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBYcSBwb2ludHMgdG8gY3VycmVudCBwaXhlbC4KLSAgbW92ICAgICAgIEZSQUNUSU9OcSwgWHEKLSAgc2FyICAgICAgIFhxLCAweDEwCi0gIG1vdnp4ICAgICBDT01QTGQsIEJZVEUgW1lxICsgWHFdCi0gIG1vdnp4ICAgICBDT01QUmQsIEJZVEUgW1lxICsgWHEgKyAxXQotICBhbmQgICAgICAgRlJBQ1RJT05xLCAweGZmZmYKLSAgaW11bCAgICAgIENPTVBScSwgRlJBQ1RJT05xCi0gIHhvciAgICAgICBGUkFDVElPTnEsIDB4ZmZmZgotICBpbXVsICAgICAgQ09NUExxLCBGUkFDVElPTnEKLSAgYWRkICAgICAgIENPTVBMcSwgQ09NUFJxCi0gIHNociAgICAgICBDT01QTHEsIDE2Ci0gIG1vdnEgICAgICBtbTEsIFtUQUJMRXEgKyA4ICogQ09NUExxXQotCi0gIDsgSW50ZXJwb2xhdGUgWTIgaWYgYXZhaWxhYmxlLgotICBjbXAgICAgICAgSU5ERVhxLCBXSURUSHEKLSAgamdlICAgICAgIC5sc2NhbGVsYXN0cGl4ZWwKLQotICBsZWEgICAgICAgWHEsIFtJTkRFWHEgKyBTT1VSQ0VfRFhxXSAgICA7IFhxIHBvaW50cyB0byBuZXh0IHBpeGVsLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IElOREVYcSBwb2ludHMgdG8gY3VycmVudCBwaXhlbC4KLSAgbW92ICAgICAgIEZSQUNUSU9OcSwgSU5ERVhxCi0gIHNhciAgICAgICBJTkRFWHEsIDB4MTAKLSAgbW92enggICAgIENPTVBMZCwgQllURSBbWXEgKyBJTkRFWHFdCi0gIG1vdnp4ICAgICBDT01QUmQsIEJZVEUgW1lxICsgSU5ERVhxICsgMV0KLSAgYW5kICAgICAgIEZSQUNUSU9OcSwgMHhmZmZmCi0gIGltdWwgICAgICBDT01QUnEsIEZSQUNUSU9OcQotICB4b3IgICAgICAgRlJBQ1RJT05xLCAweGZmZmYKLSAgaW11bCAgICAgIENPTVBMcSwgRlJBQ1RJT05xCi0gIGFkZCAgICAgICBDT01QTHEsIENPTVBScQotICBzaHIgICAgICAgQ09NUExxLCAxNgotICBtb3ZxICAgICAgbW0yLCBbVEFCTEVxICsgOCAqIENPTVBMcV0KLQotICBwYWRkc3cgICAgbW0xLCBtbTAKLSAgcGFkZHN3ICAgIG1tMiwgbW0wCi0gIHBzcmF3ICAgICBtbTEsIDB4NgotICBwc3JhdyAgICAgbW0yLCAweDYKLSAgcGFja3Vzd2IgIG1tMSwgbW0yCi0gIG1vdm50cSAgICBbQVJHQnFdLCBtbTEKLSAgYWRkICAgICAgIEFSR0JxLCAweDgKLQotLmxzY2FsZWVuZDoKLSAgY21wICAgICAgIFhxLCBXSURUSHEKLSAgamwgICAgICAgIC5sc2NhbGVsb29wCi0gIGptcCAgICAgICAuZXBpbG9ndWUKLQotLmxzY2FsZWxhc3RwaXhlbDoKLSAgcGFkZHN3ICAgIG1tMSwgbW0wCi0gIHBzcmF3ICAgICBtbTEsIDYKLSAgcGFja3Vzd2IgIG1tMSwgbW0xCi0gIG1vdmQgICAgICBbQVJHQnFdLCBtbTEKLQotLmVwaWxvZ3VlCi0gIEVQSUxPR1VFCi0gIFJFVApkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2Uvc2ltZC9saW5lYXJfc2NhbGVfeXV2X3RvX3JnYl9zc2UuYXNtIGIvc3JjL21lZGlhL2Jhc2Uvc2ltZC9saW5lYXJfc2NhbGVfeXV2X3RvX3JnYl9zc2UuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDc5MTFjLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3NpbWQvbGluZWFyX3NjYWxlX3l1dl90b19yZ2Jfc3NlLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTsgQ29weXJpZ2h0IChjKSAyMDExIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotOyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi07IGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSVpbmNsdWRlICJ4ODZpbmMuYXNtIgotCi07Ci07IFRoaXMgZmlsZSB1c2VzIE1NWCBhbmQgU1NFIGluc3RydWN0aW9ucy4KLTsKLSAgU0VDVElPTl9URVhUCi0gIENQVSAgICAgICBNTVgsIFNTRQotCi07IFVzZSBtb3ZxIHRvIHNhdmUgdGhlIG91dHB1dC4KLSVkZWZpbmUgTU9WUSBtb3ZudHEKLQotOyB2b2lkIExpbmVhclNjYWxlWVVWVG9SR0IzMlJvd19TU0UoY29uc3QgdWludDgqIHlfYnVmLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHVfYnVmLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHZfYnVmLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHJnYl9idWYsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlX2R4KTsKLSVkZWZpbmUgU1lNQk9MIExpbmVhclNjYWxlWVVWVG9SR0IzMlJvd19TU0UKLSVpbmNsdWRlICJsaW5lYXJfc2NhbGVfeXV2X3RvX3JnYl9tbXguaW5jIgpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2Uvc2ltZC9zY2FsZV95dXZfdG9fcmdiX21teC5hc20gYi9zcmMvbWVkaWEvYmFzZS9zaW1kL3NjYWxlX3l1dl90b19yZ2JfbW14LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE4Mzc1Ny4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9zaW1kL3NjYWxlX3l1dl90b19yZ2JfbW14LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTsgQ29weXJpZ2h0IChjKSAyMDExIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotOyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi07IGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSVpbmNsdWRlICJ4ODZpbmMuYXNtIgotCi07Ci07IFRoaXMgZmlsZSB1c2VzIE1NWCBpbnN0cnVjdGlvbnMuCi07Ci0gIFNFQ1RJT05fVEVYVAotICBDUFUgICAgICAgTU1YCi0KLTsgVXNlIG1vdnEgdG8gc2F2ZSB0aGUgb3V0cHV0LgotJWRlZmluZSBNT1ZRIG1vdnEKLQotOyB2b2lkIFNjYWxlWVVWVG9SR0IzMlJvd19NTVgoY29uc3QgdWludDgqIHlfYnVmLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHVfYnVmLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHZfYnVmLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHJnYl9idWYsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlX2R4KTsKLSVkZWZpbmUgU1lNQk9MIFNjYWxlWVVWVG9SR0IzMlJvd19NTVgKLSVpbmNsdWRlICJzY2FsZV95dXZfdG9fcmdiX21teC5pbmMiCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9zaW1kL3NjYWxlX3l1dl90b19yZ2JfbW14LmluYyBiL3NyYy9tZWRpYS9iYXNlL3NpbWQvc2NhbGVfeXV2X3RvX3JnYl9tbXguaW5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGMxMDFjLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3NpbWQvc2NhbGVfeXV2X3RvX3JnYl9tbXguaW5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLTsgQ29weXJpZ2h0IChjKSAyMDExIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotOyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi07IGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSAgZ2xvYmFsICAgIG1hbmdsZShTWU1CT0wpIFBSSVZBVEUKLSAgYWxpZ24gICAgIGZ1bmN0aW9uX2FsaWduCi0KLW1hbmdsZShTWU1CT0wpOgotICAlYXNzaWduICAgc3RhY2tfb2Zmc2V0IDAKLQotICBleHRlcm4gICAgbWFuZ2xlKGtDb2VmZmljaWVudHNSZ2JZKQotCi07IFBhcmFtZXRlcnMgYXJlIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6Ci07IDEuIFkgcGxhbmUKLTsgMi4gVSBwbGFuZQotOyAzLiBWIHBsYW5lCi07IDQuIEFSR0IgZnJhbWUKLTsgNS4gV2lkdGgKLTsgNi4gU291cmNlIGR4Ci0KLVBST0xPR1VFICA2LCA3LCAzLCBZLCBVLCBWLCBBUkdCLCBSMSwgUjIsIFRFTVAKLQotJWlmZGVmIEFSQ0hfWDg2XzY0Ci0lZGVmaW5lICAgICBXT1JEX1NJWkUgICBRV09SRAotJWVsc2UKLSVkZWZpbmUgICAgIFdPUkRfU0laRSAgIERXT1JECi0lZW5kaWYKLQotJWlmZGVmIFBJQwotICBQVVNIICAgICAgUjFxICA7IFdpZHRoCi0lZW5kaWYKLSAgUFVTSCAgICAgIFIycSAgOyBTb3VyY2UgZHgKLQotJWRlZmluZSAgICAgU09VUkNFX0RYICAgV09SRF9TSVpFIFtyc3BdCi0KLTsgUElDIGNvZGUuCi0laWZkZWYgUElDCi0gIExPQURfU1lNICBSMXEsIG1hbmdsZShrQ29lZmZpY2llbnRzUmdiWSkKLSVkZWZpbmUgICAgIFdJRFRIICAgICAgIFdPUkRfU0laRSBbcnNwICsgZ3Byc2l6ZV0KLSVkZWZpbmUgICAgIFRBQkxFICAgICAgIFIxcSAgCi0lZGVmaW5lICAgICBYcSAgICAgICAgICAgUjJxCi0KLTsgTm9uLVBJQyBjb2RlLgotJWVsc2UKLSVkZWZpbmUgICAgIFdJRFRIICAgICAgIFIxcQotJWRlZmluZSAgICAgVEFCTEUgICAgICAgbWFuZ2xlKGtDb2VmZmljaWVudHNSZ2JZKQotJWRlZmluZSAgICAgWHEgICAgICAgICAgIFIycQotJWVuZGlmCi0KLSAgOyBTZXQgWHEgaW5kZXggdG8gMC4KLSAgeG9yICAgICAgIFhxLCBYcQotICBqbXAgICAgICAgLnNjYWxlZW5kCi0KLS5zY2FsZWxvb3A6Ci0gIDsgVEFCTEUgY2FuIGVpdGhlciBiZSBhIHJlZ2lzdGVyIG9yIGEgc3ltYm9sIGRlcGVuZGluZyBvbiB0aGlzIGlzCi0gIDsgUElDIG9yIG5vdC4KLSAgbW92ICAgICAgIFRFTVBxLCBYcQotICBzYXIgICAgICAgVEVNUHEsIDE3Ci0gIG1vdnp4ICAgICBURU1QZCwgQllURSBbVXEgKyBURU1QcV0KLSAgbW92cSAgICAgIG1tMCwgW1RBQkxFICsgMjA0OCArIDggKiBURU1QcV0KLSAgbW92ICAgICAgIFRFTVBxLCBYcQotICBzYXIgICAgICAgVEVNUHEsIDE3Ci0gIG1vdnp4ICAgICBURU1QZCwgQllURSBbVnEgKyBURU1QcV0KLSAgcGFkZHN3ICAgIG1tMCwgW1RBQkxFICsgNDA5NiArIDggKiBURU1QcV0KLSAgbW92ICAgICAgIFRFTVBxLCBYcQotICBhZGQgICAgICAgWHEsIFNPVVJDRV9EWAotICBzYXIgICAgICAgVEVNUHEsIDE2Ci0gIG1vdnp4ICAgICBURU1QZCwgQllURSBbWXEgKyBURU1QcV0KLSAgbW92cSAgICAgIG1tMSwgW1RBQkxFICsgOCAqIFRFTVBxXQotICBtb3YgICAgICAgVEVNUHEsIFhxCi0gIGFkZCAgICAgICBYcSwgU09VUkNFX0RYCi0gIHNhciAgICAgICBURU1QcSwgMTYKLSAgbW92enggICAgIFRFTVBkLCBCWVRFIFtZcSArIFRFTVBxXQotICBtb3ZxICAgICAgbW0yLCBbVEFCTEUgKyA4ICogVEVNUHFdCi0gIHBhZGRzdyAgICBtbTEsIG1tMAotICBwYWRkc3cgICAgbW0yLCBtbTAKLSAgcHNyYXcgICAgIG1tMSwgNgotICBwc3JhdyAgICAgbW0yLCA2Ci0gIHBhY2t1c3diICBtbTEsIG1tMgotICBNT1ZRICAgICAgUVdPUkQgW0FSR0JxXSwgbW0xCi0gIGFkZCAgICAgICBBUkdCcSwgOAotCi0uc2NhbGVlbmQ6Ci0gIDsgV0lEVEggY2FuIGVpdGhlciBiZSBhIHJlZ2lzdGVyIG9yIG1lbW9yeSBkZXBlbmRpbmcgb24gdGhpcyBpcwotICA7IFBJQyBvciBub3QuCi0gIHN1YiAgICAgICBXSURUSCwgMgotICBqbnMgICAgICAgLnNjYWxlbG9vcAotCi0gIGFuZCAgICAgICBXSURUSCwgMSAgICAgICAgICAgICA7IG9kZCBudW1iZXIgb2YgcGl4ZWxzPwotICBqeiAgICAgICAgLnNjYWxlZG9uZQotCi0gIG1vdiAgICAgICBURU1QcSwgWHEKLSAgc2FyICAgICAgIFRFTVBxLCAxNwotICBtb3Z6eCAgICAgVEVNUGQsIEJZVEUgW1VxICsgVEVNUHFdCi0gIG1vdnEgICAgICBtbTAsIFtUQUJMRSArIDIwNDggKyA4ICogVEVNUHFdCi0gIG1vdiAgICAgICBURU1QcSwgWHEKLSAgc2FyICAgICAgIFRFTVBxLCAxNwotICBtb3Z6eCAgICAgVEVNUGQsIEJZVEUgW1ZxICsgVEVNUHFdCi0gIHBhZGRzdyAgICBtbTAsIFtUQUJMRSArIDQwOTYgKyA4ICogVEVNUHFdCi0gIG1vdiAgICAgICBURU1QcSwgWHEKLSAgc2FyICAgICAgIFRFTVBxLCAxNgotICBtb3Z6eCAgICAgVEVNUGQsIEJZVEUgW1lxICsgVEVNUHFdCi0gIG1vdnEgICAgICBtbTEsIFtUQUJMRSArIDggKiBURU1QcV0KLSAgcGFkZHN3ICAgIG1tMSwgbW0wCi0gIHBzcmF3ICAgICBtbTEsIDYKLSAgcGFja3Vzd2IgIG1tMSwgbW0xCi0gIG1vdmQgICAgICBEV09SRCBbQVJHQnFdLCBtbTEKLQotLnNjYWxlZG9uZToKLSVpZmRlZiBQSUMKLSAgQUREICAgICAgIHJzcCwgMiAqIGdwcnNpemUKLSVlbHNlCi0gIEFERCAgICAgICByc3AsIGdwcnNpemUKLSVlbmRpZgotICBSRVQKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3NpbWQvc2NhbGVfeXV2X3RvX3JnYl9zc2UuYXNtIGIvc3JjL21lZGlhL2Jhc2Uvc2ltZC9zY2FsZV95dXZfdG9fcmdiX3NzZS5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViODQ5YTYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2Uvc2ltZC9zY2FsZV95dXZfdG9fcmdiX3NzZS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi07IENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLTsgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotOyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0laW5jbHVkZSAieDg2aW5jLmFzbSIKLQotOwotOyBUaGlzIGZpbGUgdXNlcyBNTVggYW5kIFNTRSBpbnN0cnVjdGlvbnMuCi07Ci0gIFNFQ1RJT05fVEVYVAotICBDUFUgICAgICAgTU1YLCBTU0UKLQotOyBVc2UgbW92cSB0byBzYXZlIHRoZSBvdXRwdXQuCi0lZGVmaW5lIE1PVlEgbW92bnRxCi0KLTsgdm9pZCBTY2FsZVlVVlRvUkdCMzJSb3dfU1NFKGNvbnN0IHVpbnQ4KiB5X2J1ZiwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB1X2J1ZiwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB2X2J1ZiwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiByZ2JfYnVmLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZV9keCk7Ci0lZGVmaW5lIFNZTUJPTCBTY2FsZVlVVlRvUkdCMzJSb3dfU1NFCi0laW5jbHVkZSAic2NhbGVfeXV2X3RvX3JnYl9tbXguaW5jIgpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2Uvc2ltZC9zY2FsZV95dXZfdG9fcmdiX3NzZTJfeDY0LmFzbSBiL3NyYy9tZWRpYS9iYXNlL3NpbWQvc2NhbGVfeXV2X3RvX3JnYl9zc2UyX3g2NC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNTgxNDYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2Uvc2ltZC9zY2FsZV95dXZfdG9fcmdiX3NzZTJfeDY0LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi07IENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLTsgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotOyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0laW5jbHVkZSAieDg2aW5jLmFzbSIKLQotOwotOyBUaGlzIGZpbGUgdXNlcyBNTVgsIFNTRTIgYW5kIGluc3RydWN0aW9ucy4KLTsKLSAgU0VDVElPTl9URVhUCi0gIENQVSAgICAgICBTU0UyCi0KLTsgdm9pZCBTY2FsZVlVVlRvUkdCMzJSb3dfU1NFMl9YNjQoY29uc3QgdWludDgqIHlfYnVmLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdV9idWYsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB2X2J1ZiwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHJnYl9idWYsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZV9keCk7Ci0lZGVmaW5lIFNZTUJPTCBTY2FsZVlVVlRvUkdCMzJSb3dfU1NFMl9YNjQKLQotICBnbG9iYWwgICAgbWFuZ2xlKFNZTUJPTCkgUFJJVkFURQotICBhbGlnbiAgICAgZnVuY3Rpb25fYWxpZ24KLQotbWFuZ2xlKFNZTUJPTCk6Ci0gICVhc3NpZ24gICBzdGFja19vZmZzZXQgMAotICBleHRlcm4gICAgbWFuZ2xlKGtDb2VmZmljaWVudHNSZ2JZKQotCi07IFBhcmFtZXRlcnMgYXJlIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6Ci07IDEuIFkgcGxhbmUKLTsgMi4gVSBwbGFuZQotOyAzLiBWIHBsYW5lCi07IDQuIEFSR0IgZnJhbWUKLTsgNS4gV2lkdGgKLTsgNi4gU291cmNlIGR4Ci0KLVBST0xPR1VFICA2LCA3LCAzLCBZLCBVLCBWLCBBUkdCLCBXSURUSCwgU09VUkNFX0RYLCBDT01QCi0KLSVkZWZpbmUgICAgIFRBQkxFcSAgIHIxMAotJWRlZmluZSAgICAgWHEgICAgICAgcjExCi0lZGVmaW5lICAgICBJTkRFWHEgICByMTIKLSAgUFVTSCAgICAgIHIxMAotICBQVVNIICAgICAgcjExCi0gIFBVU0ggICAgICByMTIKLQotICBMT0FEX1NZTSAgVEFCTEVxLCBtYW5nbGUoa0NvZWZmaWNpZW50c1JnYlkpCi0KLSAgOyBTZXQgWHEgaW5kZXggdG8gMC4KLSAgeG9yICAgICAgIFhxLCBYcQotICBqbXAgICAgICAgLnNjYWxlZW5kCi0KLS5zY2FsZWxvb3A6Ci0gIDsgUmVhZCBVViBwaXhlbHMuCi0gIG1vdiAgICAgICBJTkRFWHEsIFhxCi0gIHNhciAgICAgICBJTkRFWHEsIDE3Ci0gIG1vdnp4ICAgICBDT01QZCwgQllURSBbVXEgKyBJTkRFWHFdCi0gIG1vdnEgICAgICB4bW0wLCBbVEFCTEVxICsgMjA0OCArIDggKiBDT01QcV0KLSAgbW92enggICAgIENPTVBkLCBCWVRFIFtWcSArIElOREVYcV0KLSAgbW92cSAgICAgIHhtbTEsIFtUQUJMRXEgKyA0MDk2ICsgOCAqIENPTVBxXQotCi0gIDsgUmVhZCBmaXJzdCBZIHBpeGVsLgotICBsZWEgICAgICAgSU5ERVhxLCBbWHEgKyBTT1VSQ0VfRFhxXSA7IElOREVYcSBub3dzIHBvaW50cyB0byBuZXh0IHBpeGVsLgotICBzYXIgICAgICAgWHEsIDE2Ci0gIG1vdnp4ICAgICBDT01QZCwgQllURSBbWXEgKyBYcV0KLSAgcGFkZHN3ICAgIHhtbTAsIHhtbTEJCSAgICAgIDsgSGlkZSBhIEFERCBhZnRlciBtZW1vcnkgbG9hZC4KLSAgbW92cSAgICAgIHhtbTEsIFtUQUJMRXEgKyA4ICogQ09NUHFdCi0KLSAgOyAgUmVhZCBuZXh0IFkgcGl4ZWwuCi0gIGxlYSAgICAgICBYcSwgW0lOREVYcSArIFNPVVJDRV9EWHFdIDsgWHEgbm93IHBvaW50cyB0byBuZXh0IHBpeGVsLgotICBzYXIgICAgICAgSU5ERVhxLCAxNgotICBtb3Z6eCAgICAgQ09NUGQsIEJZVEUgW1lxICsgSU5ERVhxXQotICBtb3ZxICAgICAgeG1tMiwgW1RBQkxFcSArIDggKiBDT01QcV0KLSAgcGFkZHN3ICAgIHhtbTEsIHhtbTAKLSAgcGFkZHN3ICAgIHhtbTIsIHhtbTAKLSAgc2h1ZnBzICAgIHhtbTEsIHhtbTIsIDB4NDQgICAgICAgICAgOyBKb2luIHR3byBwaXhlbHMgaW50byBvbmUgWE1NIHJlZ2lzdGVyCi0gIHBzcmF3ICAgICB4bW0xLCA2Ci0gIHBhY2t1c3diICB4bW0xLCB4bW0xCi0gIG1vdnEgICAgICBRV09SRCBbQVJHQnFdLCB4bW0xCi0gIGFkZCAgICAgICBBUkdCcSwgOAotCi0uc2NhbGVlbmQ6Ci0gIHN1YiAgICAgICBXSURUSHEsIDIKLSAgam5zICAgICAgIC5zY2FsZWxvb3AKLQotICBhbmQgICAgICAgV0lEVEhxLCAxICAgICAgICAgICAgICAgICA7IG9kZCBudW1iZXIgb2YgcGl4ZWxzPwotICBqeiAgICAgICAgLnNjYWxlZG9uZQotCi0gIDsgUmVhZCBVIFYgY29tcG9uZW50cy4KLSAgbW92ICAgICAgIElOREVYcSwgWHEKLSAgc2FyICAgICAgIElOREVYcSwgMTcKLSAgbW92enggICAgIENPTVBkLCBCWVRFIFtVcSArIElOREVYcV0KLSAgbW92cSAgICAgIHhtbTAsIFtUQUJMRXEgKyAyMDQ4ICsgOCAqIENPTVBxXQotICBtb3Z6eCAgICAgQ09NUGQsIEJZVEUgW1ZxICsgSU5ERVhxXQotICBtb3ZxICAgICAgeG1tMSwgW1RBQkxFcSArIDQwOTYgKyA4ICogQ09NUHFdCi0gIHBhZGRzdyAgICB4bW0wLCB4bW0xCi0KLSAgOyBSZWFkIG9uZSBZIGNvbXBvbmVudC4KLSAgbW92ICAgICAgIElOREVYcSwgWHEKLSAgc2FyICAgICAgIElOREVYcSwgMTYKLSAgbW92enggICAgIENPTVBkLCBCWVRFIFtZcSArIElOREVYcV0KLSAgbW92cSAgICAgIHhtbTEsIFtUQUJMRXEgKyA4ICogQ09NUHFdCi0gIHBhZGRzdyAgICB4bW0xLCB4bW0wCi0gIHBzcmF3ICAgICB4bW0xLCA2Ci0gIHBhY2t1c3diICB4bW0xLCB4bW0xCi0gIG1vdmQgICAgICBEV09SRCBbQVJHQnFdLCB4bW0xCi0KLS5zY2FsZWRvbmU6Ci0gIFBPUCAgICAgICByMTIKLSAgUE9QICAgICAgIHIxMQotICBQT1AgICAgICAgcjEwCi0gIFJFVApkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2Uvc2ltZC94ODZpbmMuYXNtIGIvc3JjL21lZGlhL2Jhc2Uvc2ltZC94ODZpbmMuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjNlYTNkLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3NpbWQveDg2aW5jLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDEwMTIgKzAsMCBAQAotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KiB4ODZpbmMuYXNtCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqIENvcHlyaWdodCAoQykgMjAwNS0yMDExIHgyNjQgcHJvamVjdAotOyoKLTsqIEF1dGhvcnM6IExvcmVuIE1lcnJpdHQgPGxvcmVubUB1Lndhc2hpbmd0b24uZWR1PgotOyogICAgICAgICAgQW50b24gTWl0cm9mYW5vdiA8QnVnTWFzdGVyQG5hcm9kLnJ1PgotOyogICAgICAgICAgSmFzb24gR2FycmV0dC1HbGFzZXIgPGRhcmtzaGlrYXJpQGdtYWlsLmNvbT4KLTsqCi07KiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLTsqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLTsqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi07KgotOyogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi07KiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi07KiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotOyogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotOyogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCi07KiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotOyogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi07IFRoaXMgaXMgYSBoZWFkZXIgZmlsZSBmb3IgdGhlIHgyNjRBU00gYXNzZW1ibHkgbGFuZ3VhZ2UsIHdoaWNoIHVzZXMKLTsgTkFTTS9ZQVNNIHN5bnRheCBjb21iaW5lZCB3aXRoIGEgbGFyZ2UgbnVtYmVyIG9mIG1hY3JvcyB0byBwcm92aWRlIGVhc3kKLTsgYWJzdHJhY3Rpb24gYmV0d2VlbiBkaWZmZXJlbnQgY2FsbGluZyBjb252ZW50aW9ucyAoeDg2XzMyLCB3aW42NCwgbGludXg2NCkuCi07IEl0IGFsc28gaGFzIHZhcmlvdXMgb3RoZXIgdXNlZnVsIGZlYXR1cmVzIHRvIHNpbXBsaWZ5IHdyaXRpbmcgdGhlIGtpbmQgb2YKLTsgRFNQIGZ1bmN0aW9ucyB0aGF0IGFyZSBtb3N0IG9mdGVuIHVzZWQgaW4geDI2NC4KLQotOyBVbmxpa2UgdGhlIHJlc3Qgb2YgeDI2NCwgdGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbiBJU0MgbGljZW5zZSwgYXMgaXQKLTsgaGFzIHNpZ25pZmljYW50IHVzZWZ1bG5lc3Mgb3V0c2lkZSBvZiB4MjY0IGFuZCB3ZSB3YW50IGl0IHRvIGJlIGF2YWlsYWJsZQotOyB0byB0aGUgbGFyZ2VzdCBhdWRpZW5jZSBwb3NzaWJsZS4gIE9mIGNvdXJzZSwgaWYgeW91IG1vZGlmeSBpdCBmb3IgeW91ciBvd24KLTsgcHVycG9zZXMgdG8gYWRkIGEgbmV3IGZlYXR1cmUsIHdlIHN0cm9uZ2x5IGVuY291cmFnZSBjb250cmlidXRpbmcgYSBwYXRjaAotOyBhcyB0aGlzIGZlYXR1cmUgbWlnaHQgYmUgdXNlZnVsIGZvciBvdGhlcnMgYXMgd2VsbC4gIFNlbmQgcGF0Y2hlcyBvciBpZGVhcwotOyB0byB4MjY0LWRldmVsQHZpZGVvbGFuLm9yZyAuCi0KLSVpZm5kZWYgTUVESUFfQkFTRV9TSU1EX1g4NklOQ19BU01fCi0lZGVmaW5lIE1FRElBX0JBU0VfU0lNRF9YODZJTkNfQVNNXwotCi0lZGVmaW5lIHByb2dyYW1fbmFtZSBmZgotCi0laWZkZWYgQVJDSF9YODZfNjQKLSAgICAlaWZpZG4gX19PVVRQVVRfRk9STUFUX18sd2luMzIKLSAgICAgICAgJWRlZmluZSBXSU42NAotICAgICVlbHNlCi0gICAgICAgICVkZWZpbmUgVU5JWDY0Ci0gICAgJWVuZGlmCi0lZW5kaWYKLQotJWlmZGVmIFBSRUZJWAotICAgICVkZWZpbmUgbWFuZ2xlKHgpIF8gJSsgeAotJWVsc2UKLSAgICAlZGVmaW5lIG1hbmdsZSh4KSB4Ci0lZW5kaWYKLQotOyBGSVhNRTogQWxsIG9mIHRoZSA2NGJpdCBhc20gZnVuY3Rpb25zIHRoYXQgdGFrZSBhIHN0cmlkZSBhcyBhbiBhcmd1bWVudAotOyB2aWEgcmVnaXN0ZXIsIGFzc3VtZSB0aGF0IHRoZSBoaWdoIGR3b3JkIG9mIHRoYXQgcmVnaXN0ZXIgaXMgZmlsbGVkIHdpdGggMC4KLTsgVGhpcyBpcyB0cnVlIGluIHByYWN0aWNlIChzaW5jZSB3ZSBuZXZlciBkbyBhbnkgNjRiaXQgYXJpdGhtZXRpYyBvbiBzdHJpZGVzLAotOyBhbmQgeDI2NCdzIHN0cmlkZXMgYXJlIGFsbCBwb3NpdGl2ZSksIGJ1dCBpcyBub3QgZ3VhcmFudGVlZCBieSB0aGUgQUJJLgotCi07IE5hbWUgb2YgdGhlIC5yb2RhdGEgc2VjdGlvbi4KLTsgS2x1ZGdlOiBTb21ldGhpbmcgb24gT1MgWCBmYWlscyB0byBhbGlnbiAucm9kYXRhIGV2ZW4gZ2l2ZW4gYW4gYWxpZ24gYXR0cmlidXRlLAotOyBzbyB1c2UgYSBkaWZmZXJlbnQgcmVhZC1vbmx5IHNlY3Rpb24uCi0laWZkZWYgQ0hST01JVU0KLSVtYWNybyBTRUNUSU9OX1JPREFUQSAwLTEgMTYKLSAgICAlaWZpZG4gX19PVVRQVVRfRk9STUFUX18sbWFjaG82NAotICAgICAgICBTRUNUSU9OIC50ZXh0IGFsaWduPSUxCi0gICAgJWVsaWZpZG4gX19PVVRQVVRfRk9STUFUX18sbWFjaG8KLSAgICAgICAgU0VDVElPTiAudGV4dCBhbGlnbj0lMQotICAgICAgICBmYWtlZ290OgotICAgICVlbGlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLGFvdXQKLSAgICAgICAgc2VjdGlvbiAudGV4dAotICAgICVlbHNlCi0gICAgICAgIFNFQ1RJT04gLnJvZGF0YSBhbGlnbj0lMQotICAgICVlbmRpZgotJWVuZG1hY3JvCi0lZWxzZQotJW1hY3JvIFNFQ1RJT05fUk9EQVRBIDAtMSAxNgotICAgICVpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyxhb3V0Ci0gICAgICAgIHNlY3Rpb24gLnRleHQKLSAgICAlZWxzZQotICAgICAgICBTRUNUSU9OIC5yb2RhdGEgYWxpZ249JTEKLSAgICAlZW5kaWYKLSVlbmRtYWNybwotJWVuZGlmCi0KLTsgYW91dCBkb2VzIG5vdCBzdXBwb3J0IGFsaWduPQotJW1hY3JvIFNFQ1RJT05fVEVYVCAwLTEgMTYKLSAgICAlaWZpZG4gX19PVVRQVVRfRk9STUFUX18sYW91dAotICAgICAgICBTRUNUSU9OIC50ZXh0Ci0gICAgJWVsc2UKLSAgICAgICAgU0VDVElPTiAudGV4dCBhbGlnbj0lMQotICAgICVlbmRpZgotJWVuZG1hY3JvCi0KLSVpZmRlZiBXSU42NAotICAgICVkZWZpbmUgUElDCi0lZWxpZm5kZWYgQVJDSF9YODZfNjQKLTsgRm9yIGNocm9taXVtIHdlIG1heSBidWlsZCBQSUMgY29kZSBldmVuIGZvciAzMiBiaXRzIHN5c3RlbS4KLSVpZm5kZWYgQ0hST01JVU0KLTsgeDg2XzMyIGRvZXNuJ3QgcmVxdWlyZSBQSUMuCi07IFNvbWUgZGlzdHJvcyBwcmVmZXIgc2hhcmVkIG9iamVjdHMgdG8gYmUgUElDLCBidXQgbm90aGluZyBicmVha3MgaWYKLTsgdGhlIGNvZGUgY29udGFpbnMgYSBmZXcgdGV4dHJlbHMsIHNvIHdlJ2xsIHNraXAgdGhhdCBjb21wbGV4aXR5LgotICAgICV1bmRlZiBQSUMKLSVlbmRpZgotJWVuZGlmCi0laWZkZWYgUElDCi0gICAgZGVmYXVsdCByZWwKLSVlbmRpZgotCi07IE1hY3JvcyB0byBlbGltaW5hdGUgbW9zdCBjb2RlIGR1cGxpY2F0aW9uIGJldHdlZW4geDg2XzMyIGFuZCB4ODZfNjQ6Ci07IEN1cnJlbnRseSB0aGlzIHdvcmtzIG9ubHkgZm9yIGxlYWYgZnVuY3Rpb25zIHdoaWNoIGxvYWQgYWxsIHRoZWlyIGFyZ3VtZW50cwotOyBpbnRvIHJlZ2lzdGVycyBhdCB0aGUgc3RhcnQsIGFuZCBtYWtlIG5vIG90aGVyIHVzZSBvZiB0aGUgc3RhY2suIEx1Y2tpbHkgdGhhdAotOyBjb3ZlcnMgbW9zdCBvZiB4MjY0J3MgYXNtLgotCi07IFBST0xPR1VFOgotOyAlMSA9IG51bWJlciBvZiBhcmd1bWVudHMuIGxvYWRzIHRoZW0gZnJvbSBzdGFjayBpZiBuZWVkZWQuCi07ICUyID0gbnVtYmVyIG9mIHJlZ2lzdGVycyB1c2VkLiBwdXNoZXMgY2FsbGVlLXNhdmVkIHJlZ3MgaWYgbmVlZGVkLgotOyAlMyA9IG51bWJlciBvZiB4bW0gcmVnaXN0ZXJzIHVzZWQuIHB1c2hlcyBjYWxsZWUtc2F2ZWQgeG1tIHJlZ3MgaWYgbmVlZGVkLgotOyAlNCA9IGxpc3Qgb2YgbmFtZXMgdG8gZGVmaW5lIHRvIHJlZ2lzdGVycwotOyBQUk9MT0dVRSBjYW4gYWxzbyBiZSBpbnZva2VkIGJ5IGFkZGluZyB0aGUgc2FtZSBvcHRpb25zIHRvIGNnbG9iYWwKLQotOyBlLmcuCi07IGNnbG9iYWwgZm9vLCAyLDMsMCwgZHN0LCBzcmMsIHRtcAotOyBkZWNsYXJlcyBhIGZ1bmN0aW9uIChmb28pLCB0YWtpbmcgdHdvIGFyZ3MgKGRzdCBhbmQgc3JjKSBhbmQgb25lIGxvY2FsIHZhcmlhYmxlICh0bXApCi0KLTsgVE9ETyBTb21lIGZ1bmN0aW9ucyBjYW4gdXNlIHNvbWUgYXJncyBkaXJlY3RseSBmcm9tIHRoZSBzdGFjay4gSWYgdGhleSdyZSB0aGUKLTsgbGFzdCBhcmdzIHRoZW4geW91IGNhbiBqdXN0IG5vdCBkZWNsYXJlIHRoZW0sIGJ1dCBpZiB0aGV5J3JlIGluIHRoZSBtaWRkbGUKLTsgd2UgbmVlZCBtb3JlIGZsZXhpYmxlIG1hY3JvLgotCi07IFJFVDoKLTsgUG9wcyBhbnl0aGluZyB0aGF0IHdhcyBwdXNoZWQgYnkgUFJPTE9HVUUKLQotOyBSRVBfUkVUOgotOyBTYW1lLCBidXQgaWYgaXQgZG9lc24ndCBwb3AgYW55dGhpbmcgaXQgYmVjb21lcyBhIDItYnl0ZSByZXQsIGZvciBhdGhsb25zCi07IHdoaWNoIGFyZSBzbG93IHdoZW4gYSBub3JtYWwgcmV0IGZvbGxvd3MgYSBicmFuY2guCi0KLTsgcmVnaXN0ZXJzOgotOyByTiBhbmQgck5xIGFyZSB0aGUgbmF0aXZlLXNpemUgcmVnaXN0ZXIgaG9sZGluZyBmdW5jdGlvbiBhcmd1bWVudCBOCi07IHJOZCwgck53LCByTmIgYXJlIGR3b3JkLCB3b3JkLCBhbmQgYnl0ZSBzaXplCi07IHJObSBpcyB0aGUgb3JpZ2luYWwgbG9jYXRpb24gb2YgYXJnIE4gKGEgcmVnaXN0ZXIgb3Igb24gdGhlIHN0YWNrKSwgZHdvcmQKLTsgck5tcCBpcyBuYXRpdmUgc2l6ZQotCi0lbWFjcm8gREVDTEFSRV9SRUcgNgotICAgICVkZWZpbmUgciUxcSAlMgotICAgICVkZWZpbmUgciUxZCAlMwotICAgICVkZWZpbmUgciUxdyAlNAotICAgICVkZWZpbmUgciUxYiAlNQotICAgICVkZWZpbmUgciUxbSAlNgotICAgICVpZmlkICU2IDsgaS5lLiBpdCdzIGEgcmVnaXN0ZXIKLSAgICAgICAgJWRlZmluZSByJTFtcCAlMgotICAgICVlbGlmZGVmIEFSQ0hfWDg2XzY0IDsgbWVtb3J5Ci0gICAgICAgICVkZWZpbmUgciUxbXAgcXdvcmQgJTYKLSAgICAlZWxzZQotICAgICAgICAlZGVmaW5lIHIlMW1wIGR3b3JkICU2Ci0gICAgJWVuZGlmCi0gICAgJWRlZmluZSByJTEgICUyCi0lZW5kbWFjcm8KLQotJW1hY3JvIERFQ0xBUkVfUkVHX1NJWkUgMgotICAgICVkZWZpbmUgciUxcSByJTEKLSAgICAlZGVmaW5lIGUlMXEgciUxCi0gICAgJWRlZmluZSByJTFkIGUlMQotICAgICVkZWZpbmUgZSUxZCBlJTEKLSAgICAlZGVmaW5lIHIlMXcgJTEKLSAgICAlZGVmaW5lIGUlMXcgJTEKLSAgICAlZGVmaW5lIHIlMWIgJTIKLSAgICAlZGVmaW5lIGUlMWIgJTIKLSVpZm5kZWYgQVJDSF9YODZfNjQKLSAgICAlZGVmaW5lIHIlMSAgZSUxCi0lZW5kaWYKLSVlbmRtYWNybwotCi1ERUNMQVJFX1JFR19TSVpFIGF4LCBhbAotREVDTEFSRV9SRUdfU0laRSBieCwgYmwKLURFQ0xBUkVfUkVHX1NJWkUgY3gsIGNsCi1ERUNMQVJFX1JFR19TSVpFIGR4LCBkbAotREVDTEFSRV9SRUdfU0laRSBzaSwgc2lsCi1ERUNMQVJFX1JFR19TSVpFIGRpLCBkaWwKLURFQ0xBUkVfUkVHX1NJWkUgYnAsIGJwbAotCi07IHQjIGRlZmluZXMgZm9yIHdoZW4gcGVyLWFyY2ggcmVnaXN0ZXIgYWxsb2NhdGlvbiBpcyBtb3JlIGNvbXBsZXggdGhhbiBqdXN0IGZ1bmN0aW9uIGFyZ3VtZW50cwotCi0lbWFjcm8gREVDTEFSRV9SRUdfVE1QIDEtKgotICAgICVhc3NpZ24gJSVpIDAKLSAgICAlcmVwICUwCi0gICAgICAgIENBVF9YREVGSU5FIHQsICUlaSwgciUxCi0gICAgICAgICVhc3NpZ24gJSVpICUlaSsxCi0gICAgICAgICVyb3RhdGUgMQotICAgICVlbmRyZXAKLSVlbmRtYWNybwotCi0lbWFjcm8gREVDTEFSRV9SRUdfVE1QX1NJWkUgMC0qCi0gICAgJXJlcCAlMAotICAgICAgICAlZGVmaW5lIHQlMXEgdCUxICUrIHEKLSAgICAgICAgJWRlZmluZSB0JTFkIHQlMSAlKyBkCi0gICAgICAgICVkZWZpbmUgdCUxdyB0JTEgJSsgdwotICAgICAgICAlZGVmaW5lIHQlMWIgdCUxICUrIGIKLSAgICAgICAgJXJvdGF0ZSAxCi0gICAgJWVuZHJlcAotJWVuZG1hY3JvCi0KLURFQ0xBUkVfUkVHX1RNUF9TSVpFIDAsMSwyLDMsNCw1LDYsNyw4LDkKLQotJWlmZGVmIEFSQ0hfWDg2XzY0Ci0gICAgJWRlZmluZSBncHJzaXplIDgKLSVlbHNlCi0gICAgJWRlZmluZSBncHJzaXplIDQKLSVlbmRpZgotCi0lbWFjcm8gUFVTSCAxCi0gICAgcHVzaCAlMQotICAgICVhc3NpZ24gc3RhY2tfb2Zmc2V0IHN0YWNrX29mZnNldCtncHJzaXplCi0lZW5kbWFjcm8KLQotJW1hY3JvIFBPUCAxCi0gICAgcG9wICUxCi0gICAgJWFzc2lnbiBzdGFja19vZmZzZXQgc3RhY2tfb2Zmc2V0LWdwcnNpemUKLSVlbmRtYWNybwotCi0lbWFjcm8gU1VCIDIKLSAgICBzdWIgJTEsICUyCi0gICAgJWlmaWRuICUxLCByc3AKLSAgICAgICAgJWFzc2lnbiBzdGFja19vZmZzZXQgc3RhY2tfb2Zmc2V0KyglMikKLSAgICAlZW5kaWYKLSVlbmRtYWNybwotCi0lbWFjcm8gQUREIDIKLSAgICBhZGQgJTEsICUyCi0gICAgJWlmaWRuICUxLCByc3AKLSAgICAgICAgJWFzc2lnbiBzdGFja19vZmZzZXQgc3RhY2tfb2Zmc2V0LSglMikKLSAgICAlZW5kaWYKLSVlbmRtYWNybwotCi0lbWFjcm8gbW92aWZuaWRuIDIKLSAgICAlaWZuaWRuICUxLCAlMgotICAgICAgICBtb3YgJTEsICUyCi0gICAgJWVuZGlmCi0lZW5kbWFjcm8KLQotJW1hY3JvIG1vdnN4ZGlmbmlkbiAyCi0gICAgJWlmbmlkbiAlMSwgJTIKLSAgICAgICAgbW92c3hkICUxLCAlMgotICAgICVlbmRpZgotJWVuZG1hY3JvCi0KLSVtYWNybyBBU1NFUlQgMQotICAgICVpZiAoJTEpID09IDAKLSAgICAgICAgJWVycm9yIGFzc2VydCBmYWlsZWQKLSAgICAlZW5kaWYKLSVlbmRtYWNybwotCi0lbWFjcm8gREVGSU5FX0FSR1MgMC0qCi0gICAgJWlmZGVmIG5fYXJnX25hbWVzCi0gICAgICAgICVhc3NpZ24gJSVpIDAKLSAgICAgICAgJXJlcCBuX2FyZ19uYW1lcwotICAgICAgICAgICAgQ0FUX1VOREVGIGFyZ19uYW1lICUrICUlaSwgcQotICAgICAgICAgICAgQ0FUX1VOREVGIGFyZ19uYW1lICUrICUlaSwgZAotICAgICAgICAgICAgQ0FUX1VOREVGIGFyZ19uYW1lICUrICUlaSwgdwotICAgICAgICAgICAgQ0FUX1VOREVGIGFyZ19uYW1lICUrICUlaSwgYgotICAgICAgICAgICAgQ0FUX1VOREVGIGFyZ19uYW1lICUrICUlaSwgbQotICAgICAgICAgICAgQ0FUX1VOREVGIGFyZ19uYW1lLCAlJWkKLSAgICAgICAgICAgICVhc3NpZ24gJSVpICUlaSsxCi0gICAgICAgICVlbmRyZXAKLSAgICAlZW5kaWYKLQotICAgICVhc3NpZ24gJSVpIDAKLSAgICAlcmVwICUwCi0gICAgICAgICV4ZGVmaW5lICUxcSByICUrICUlaSAlKyBxCi0gICAgICAgICV4ZGVmaW5lICUxZCByICUrICUlaSAlKyBkCi0gICAgICAgICV4ZGVmaW5lICUxdyByICUrICUlaSAlKyB3Ci0gICAgICAgICV4ZGVmaW5lICUxYiByICUrICUlaSAlKyBiCi0gICAgICAgICV4ZGVmaW5lICUxbSByICUrICUlaSAlKyBtCi0gICAgICAgIENBVF9YREVGSU5FIGFyZ19uYW1lLCAlJWksICUxCi0gICAgICAgICVhc3NpZ24gJSVpICUlaSsxCi0gICAgICAgICVyb3RhdGUgMQotICAgICVlbmRyZXAKLSAgICAlYXNzaWduIG5fYXJnX25hbWVzICUlaQotJWVuZG1hY3JvCi0KLSVpZmRlZiBXSU42NCA7IFdpbmRvd3MgeDY0IDs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLURFQ0xBUkVfUkVHIDAsIHJjeCwgZWN4LCBjeCwgIGNsLCAgZWN4Ci1ERUNMQVJFX1JFRyAxLCByZHgsIGVkeCwgZHgsICBkbCwgIGVkeAotREVDTEFSRV9SRUcgMiwgcjgsICByOGQsIHI4dywgcjhiLCByOGQKLURFQ0xBUkVfUkVHIDMsIHI5LCAgcjlkLCByOXcsIHI5YiwgcjlkCi1ERUNMQVJFX1JFRyA0LCByZGksIGVkaSwgZGksICBkaWwsIFtyc3AgKyBzdGFja19vZmZzZXQgKyA0MF0KLURFQ0xBUkVfUkVHIDUsIHJzaSwgZXNpLCBzaSwgIHNpbCwgW3JzcCArIHN0YWNrX29mZnNldCArIDQ4XQotREVDTEFSRV9SRUcgNiwgcmF4LCBlYXgsIGF4LCAgYWwsICBbcnNwICsgc3RhY2tfb2Zmc2V0ICsgNTZdCi0lZGVmaW5lIHI3bSBbcnNwICsgc3RhY2tfb2Zmc2V0ICsgNjRdCi0lZGVmaW5lIHI4bSBbcnNwICsgc3RhY2tfb2Zmc2V0ICsgNzJdCi0KLSVtYWNybyBMT0FEX0lGX1VTRUQgMiA7IHJlZ19pZCwgbnVtYmVyX29mX2FyZ3MKLSAgICAlaWYgJTEgPCAlMgotICAgICAgICBtb3YgciUxLCBbcnNwICsgc3RhY2tfb2Zmc2V0ICsgOCArICUxKjhdCi0gICAgJWVuZGlmCi0lZW5kbWFjcm8KLQotJW1hY3JvIFBST0xPR1VFIDItNCsgMCA7ICNhcmdzLCAjcmVncywgI3htbV9yZWdzLCBhcmdfbmFtZXMuLi4KLSAgICBBU1NFUlQgJTIgPj0gJTEKLSAgICAlYXNzaWduIHJlZ3NfdXNlZCAlMgotICAgIEFTU0VSVCByZWdzX3VzZWQgPD0gNwotICAgICVpZiByZWdzX3VzZWQgPiA0Ci0gICAgICAgIHB1c2ggcjQKLSAgICAgICAgcHVzaCByNQotICAgICAgICAlYXNzaWduIHN0YWNrX29mZnNldCBzdGFja19vZmZzZXQrMTYKLSAgICAlZW5kaWYKLSAgICBXSU42NF9TUElMTF9YTU0gJTMKLSAgICBMT0FEX0lGX1VTRUQgNCwgJTEKLSAgICBMT0FEX0lGX1VTRUQgNSwgJTEKLSAgICBMT0FEX0lGX1VTRUQgNiwgJTEKLSAgICBERUZJTkVfQVJHUyAlNAotJWVuZG1hY3JvCi0KLSVtYWNybyBXSU42NF9TUElMTF9YTU0gMQotICAgICVhc3NpZ24geG1tX3JlZ3NfdXNlZCAlMQotICAgIEFTU0VSVCB4bW1fcmVnc191c2VkIDw9IDE2Ci0gICAgJWlmIHhtbV9yZWdzX3VzZWQgPiA2Ci0gICAgICAgIHN1YiByc3AsICh4bW1fcmVnc191c2VkLTYpKjE2KzE2Ci0gICAgICAgICVhc3NpZ24gc3RhY2tfb2Zmc2V0IHN0YWNrX29mZnNldCsoeG1tX3JlZ3NfdXNlZC02KSoxNisxNgotICAgICAgICAlYXNzaWduICUlaSB4bW1fcmVnc191c2VkCi0gICAgICAgICVyZXAgKHhtbV9yZWdzX3VzZWQtNikKLSAgICAgICAgICAgICVhc3NpZ24gJSVpICUlaS0xCi0gICAgICAgICAgICBtb3ZkcWEgW3JzcCArICglJWktNikqMTYrOF0sIHhtbSAlKyAlJWkKLSAgICAgICAgJWVuZHJlcAotICAgICVlbmRpZgotJWVuZG1hY3JvCi0KLSVtYWNybyBXSU42NF9SRVNUT1JFX1hNTV9JTlRFUk5BTCAxCi0gICAgJWlmIHhtbV9yZWdzX3VzZWQgPiA2Ci0gICAgICAgICVhc3NpZ24gJSVpIHhtbV9yZWdzX3VzZWQKLSAgICAgICAgJXJlcCAoeG1tX3JlZ3NfdXNlZC02KQotICAgICAgICAgICAgJWFzc2lnbiAlJWkgJSVpLTEKLSAgICAgICAgICAgIG1vdmRxYSB4bW0gJSsgJSVpLCBbJTEgKyAoJSVpLTYpKjE2KzhdCi0gICAgICAgICVlbmRyZXAKLSAgICAgICAgYWRkICUxLCAoeG1tX3JlZ3NfdXNlZC02KSoxNisxNgotICAgICVlbmRpZgotJWVuZG1hY3JvCi0KLSVtYWNybyBXSU42NF9SRVNUT1JFX1hNTSAxCi0gICAgV0lONjRfUkVTVE9SRV9YTU1fSU5URVJOQUwgJTEKLSAgICAlYXNzaWduIHN0YWNrX29mZnNldCBzdGFja19vZmZzZXQtKHhtbV9yZWdzX3VzZWQtNikqMTYrMTYKLSAgICAlYXNzaWduIHhtbV9yZWdzX3VzZWQgMAotJWVuZG1hY3JvCi0KLSVtYWNybyBSRVQgMAotICAgIFdJTjY0X1JFU1RPUkVfWE1NX0lOVEVSTkFMIHJzcAotICAgICVpZiByZWdzX3VzZWQgPiA0Ci0gICAgICAgIHBvcCByNQotICAgICAgICBwb3AgcjQKLSAgICAlZW5kaWYKLSAgICByZXQKLSVlbmRtYWNybwotCi0lbWFjcm8gUkVQX1JFVCAwCi0gICAgJWlmIHJlZ3NfdXNlZCA+IDQgfHwgeG1tX3JlZ3NfdXNlZCA+IDYKLSAgICAgICAgUkVUCi0gICAgJWVsc2UKLSAgICAgICAgcmVwIHJldAotICAgICVlbmRpZgotJWVuZG1hY3JvCi0KLSVlbGlmZGVmIEFSQ0hfWDg2XzY0IDsgKm5peCB4NjQgOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1ERUNMQVJFX1JFRyAwLCByZGksIGVkaSwgZGksICBkaWwsIGVkaQotREVDTEFSRV9SRUcgMSwgcnNpLCBlc2ksIHNpLCAgc2lsLCBlc2kKLURFQ0xBUkVfUkVHIDIsIHJkeCwgZWR4LCBkeCwgIGRsLCAgZWR4Ci1ERUNMQVJFX1JFRyAzLCByY3gsIGVjeCwgY3gsICBjbCwgIGVjeAotREVDTEFSRV9SRUcgNCwgcjgsICByOGQsIHI4dywgcjhiLCByOGQKLURFQ0xBUkVfUkVHIDUsIHI5LCAgcjlkLCByOXcsIHI5YiwgcjlkCi1ERUNMQVJFX1JFRyA2LCByYXgsIGVheCwgYXgsICBhbCwgIFtyc3AgKyBzdGFja19vZmZzZXQgKyA4XQotJWRlZmluZSByN20gW3JzcCArIHN0YWNrX29mZnNldCArIDE2XQotJWRlZmluZSByOG0gW3JzcCArIHN0YWNrX29mZnNldCArIDI0XQotCi0lbWFjcm8gTE9BRF9JRl9VU0VEIDIgOyByZWdfaWQsIG51bWJlcl9vZl9hcmdzCi0gICAgJWlmICUxIDwgJTIKLSAgICAgICAgbW92IHIlMSwgW3JzcCAtIDQwICsgJTEqOF0KLSAgICAlZW5kaWYKLSVlbmRtYWNybwotCi0lbWFjcm8gUFJPTE9HVUUgMi00KyA7ICNhcmdzLCAjcmVncywgI3htbV9yZWdzLCBhcmdfbmFtZXMuLi4KLSAgICBBU1NFUlQgJTIgPj0gJTEKLSAgICBBU1NFUlQgJTIgPD0gNwotICAgIExPQURfSUZfVVNFRCA2LCAlMQotICAgIERFRklORV9BUkdTICU0Ci0lZW5kbWFjcm8KLQotJW1hY3JvIFJFVCAwCi0gICAgcmV0Ci0lZW5kbWFjcm8KLQotJW1hY3JvIFJFUF9SRVQgMAotICAgIHJlcCByZXQKLSVlbmRtYWNybwotCi0lZWxzZSA7IFg4Nl8zMiA7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotOyBCZWdpbiBjaHJvbWl1bSBlZGl0cwotJWlmZGVmIENIUk9NSVVNCi07IENoYW5nZSB0aGUgb3JkZXIgb2YgcmVnaXN0ZXJzIHNvIHdlIGNhbiBnZXQgdGhlIGxvd2VyIDgtYml0IG9yIHRoZSA1dGggYW5kIDZ0aAotOyBhcmd1bWVudHMuCi1ERUNMQVJFX1JFRyAwLCBlc2ksIGVzaSwgc2ksIG51bGwsIFtlc3AgKyBzdGFja19vZmZzZXQgKyA0XQotREVDTEFSRV9SRUcgMSwgZWRpLCBlZGksIGRpLCBudWxsLCBbZXNwICsgc3RhY2tfb2Zmc2V0ICsgOF0KLURFQ0xBUkVfUkVHIDIsIGVjeCwgZWN4LCBjeCwgY2wsICAgW2VzcCArIHN0YWNrX29mZnNldCArIDEyXQotREVDTEFSRV9SRUcgMywgZWR4LCBlZHgsIGR4LCBkbCwgICBbZXNwICsgc3RhY2tfb2Zmc2V0ICsgMTZdCi1ERUNMQVJFX1JFRyA0LCBlYXgsIGVheCwgYXgsIGFsLCAgIFtlc3AgKyBzdGFja19vZmZzZXQgKyAyMF0KLURFQ0xBUkVfUkVHIDUsIGVieCwgZWJ4LCBieCwgYmwsICAgW2VzcCArIHN0YWNrX29mZnNldCArIDI0XQotJWVsc2UKLURFQ0xBUkVfUkVHIDAsIGVheCwgZWF4LCBheCwgYWwsICAgW2VzcCArIHN0YWNrX29mZnNldCArIDRdCi1ERUNMQVJFX1JFRyAxLCBlY3gsIGVjeCwgY3gsIGNsLCAgIFtlc3AgKyBzdGFja19vZmZzZXQgKyA4XQotREVDTEFSRV9SRUcgMiwgZWR4LCBlZHgsIGR4LCBkbCwgICBbZXNwICsgc3RhY2tfb2Zmc2V0ICsgMTJdCi1ERUNMQVJFX1JFRyAzLCBlYngsIGVieCwgYngsIGJsLCAgIFtlc3AgKyBzdGFja19vZmZzZXQgKyAxNl0KLURFQ0xBUkVfUkVHIDQsIGVzaSwgZXNpLCBzaSwgbnVsbCwgW2VzcCArIHN0YWNrX29mZnNldCArIDIwXQotREVDTEFSRV9SRUcgNSwgZWRpLCBlZGksIGRpLCBudWxsLCBbZXNwICsgc3RhY2tfb2Zmc2V0ICsgMjRdCi0lZW5kaWYKLTsgRW5kIGNocm9taXVtIGVkaXRzCi1ERUNMQVJFX1JFRyA2LCBlYnAsIGVicCwgYnAsIG51bGwsIFtlc3AgKyBzdGFja19vZmZzZXQgKyAyOF0KLSVkZWZpbmUgcjdtIFtlc3AgKyBzdGFja19vZmZzZXQgKyAzMl0KLSVkZWZpbmUgcjhtIFtlc3AgKyBzdGFja19vZmZzZXQgKyAzNl0KLSVkZWZpbmUgcnNwIGVzcAotCi0lbWFjcm8gUFVTSF9JRl9VU0VEIDEgOyByZWdfaWQKLSAgICAlaWYgJTEgPCByZWdzX3VzZWQKLSAgICAgICAgcHVzaCByJTEKLSAgICAgICAgJWFzc2lnbiBzdGFja19vZmZzZXQgc3RhY2tfb2Zmc2V0KzQKLSAgICAlZW5kaWYKLSVlbmRtYWNybwotCi0lbWFjcm8gUE9QX0lGX1VTRUQgMSA7IHJlZ19pZAotICAgICVpZiAlMSA8IHJlZ3NfdXNlZAotICAgICAgICBwb3AgciUxCi0gICAgJWVuZGlmCi0lZW5kbWFjcm8KLQotJW1hY3JvIExPQURfSUZfVVNFRCAyIDsgcmVnX2lkLCBudW1iZXJfb2ZfYXJncwotICAgICVpZiAlMSA8ICUyCi0gICAgICAgIG1vdiByJTEsIFtlc3AgKyBzdGFja19vZmZzZXQgKyA0ICsgJTEqNF0KLSAgICAlZW5kaWYKLSVlbmRtYWNybwotCi0lbWFjcm8gUFJPTE9HVUUgMi00KyA7ICNhcmdzLCAjcmVncywgI3htbV9yZWdzLCBhcmdfbmFtZXMuLi4KLSAgICBBU1NFUlQgJTIgPj0gJTEKLSAgICAlYXNzaWduIHJlZ3NfdXNlZCAlMgotICAgIEFTU0VSVCByZWdzX3VzZWQgPD0gNwotJWlmZGVmIENIUk9NSVVNCi0gICAgUFVTSF9JRl9VU0VEIDAKLSAgICBQVVNIX0lGX1VTRUQgMQotICAgIFBVU0hfSUZfVVNFRCA1Ci0lZWxzZQotICAgIFBVU0hfSUZfVVNFRCAzCi0gICAgUFVTSF9JRl9VU0VEIDQKLSAgICBQVVNIX0lGX1VTRUQgNQotJWVuZGlmCi0gICAgUFVTSF9JRl9VU0VEIDYKLSAgICBMT0FEX0lGX1VTRUQgMCwgJTEKLSAgICBMT0FEX0lGX1VTRUQgMSwgJTEKLSAgICBMT0FEX0lGX1VTRUQgMiwgJTEKLSAgICBMT0FEX0lGX1VTRUQgMywgJTEKLSAgICBMT0FEX0lGX1VTRUQgNCwgJTEKLSAgICBMT0FEX0lGX1VTRUQgNSwgJTEKLSAgICBMT0FEX0lGX1VTRUQgNiwgJTEKLSAgICBERUZJTkVfQVJHUyAlNAotJWVuZG1hY3JvCi0KLSVtYWNybyBSRVQgMAotICAgIFBPUF9JRl9VU0VEIDYKLSVpZmRlZiBDSFJPTUlVTQotICAgIFBPUF9JRl9VU0VEIDUKLSAgICBQT1BfSUZfVVNFRCAxCi0gICAgUE9QX0lGX1VTRUQgMAotJWVsc2UKLSAgICBQT1BfSUZfVVNFRCA1Ci0gICAgUE9QX0lGX1VTRUQgNAotICAgIFBPUF9JRl9VU0VEIDMKLSVlbmRpZgotICAgIHJldAotJWVuZG1hY3JvCi0KLSVtYWNybyBSRVBfUkVUIDAKLSAgICAlaWYgcmVnc191c2VkID4gMwotICAgICAgICBSRVQKLSAgICAlZWxzZQotICAgICAgICByZXAgcmV0Ci0gICAgJWVuZGlmCi0lZW5kbWFjcm8KLQotJWVuZGlmIDs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSVpZm5kZWYgV0lONjQKLSVtYWNybyBXSU42NF9TUElMTF9YTU0gMQotJWVuZG1hY3JvCi0lbWFjcm8gV0lONjRfUkVTVE9SRV9YTU0gMQotJWVuZG1hY3JvCi0lZW5kaWYKLQotCi0KLTs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyBhcmNoLWluZGVwZW5kZW50IHBhcnQKLTs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0lYXNzaWduIGZ1bmN0aW9uX2FsaWduIDE2Ci0KLTsgU3ltYm9sIHByZWZpeCBmb3IgQyBsaW5rYWdlCi0lbWFjcm8gY2dsb2JhbCAxLTIrCi0gICAgJXhkZWZpbmUgJTEgbWFuZ2xlKHByb2dyYW1fbmFtZSAlKyBfICUrICUxKQotICAgICV4ZGVmaW5lICUxLnNraXBfcHJvbG9ndWUgJTEgJSsgLnNraXBfcHJvbG9ndWUKLSAgICAlaWZpZG4gX19PVVRQVVRfRk9STUFUX18sZWxmCi0gICAgICAgIGdsb2JhbCAlMTpmdW5jdGlvbiBoaWRkZW4KLSAgICAlZWxzZQotICAgICAgICBnbG9iYWwgJTEKLSAgICAlZW5kaWYKLSAgICBhbGlnbiBmdW5jdGlvbl9hbGlnbgotICAgICUxOgotICAgIFJFU0VUX01NX1BFUk1VVEFUSU9OIDsgbm90IHJlYWxseSBuZWVkZWQsIGJ1dCBtYWtlcyBkaXNhc3NlbWJseSBzb21ld2hhdCBuaWNlcgotICAgICVhc3NpZ24gc3RhY2tfb2Zmc2V0IDAKLSAgICAlaWYgJTAgPiAxCi0gICAgICAgIFBST0xPR1VFICUyCi0gICAgJWVuZGlmCi0lZW5kbWFjcm8KLQotJW1hY3JvIGNleHRlcm4gMQotICAgICV4ZGVmaW5lICUxIG1hbmdsZShwcm9ncmFtX25hbWUgJSsgXyAlKyAlMSkKLSAgICBleHRlcm4gJTEKLSVlbmRtYWNybwotCi07bGlrZSBjZXh0ZXJuLCBidXQgd2l0aG91dCB0aGUgcHJlZml4Ci0lbWFjcm8gY2V4dGVybl9uYWtlZCAxCi0gICAgJXhkZWZpbmUgJTEgbWFuZ2xlKCUxKQotICAgIGV4dGVybiAlMQotJWVuZG1hY3JvCi0KLSVtYWNybyBjb25zdCAyKwotICAgICV4ZGVmaW5lICUxIG1hbmdsZShwcm9ncmFtX25hbWUgJSsgXyAlKyAlMSkKLSAgICBnbG9iYWwgJTEKLSAgICAlMTogJTIKLSVlbmRtYWNybwotCi07IFRoaXMgaXMgbmVlZGVkIGZvciBFTEYsIG90aGVyd2lzZSB0aGUgR05VIGxpbmtlciBhc3N1bWVzIHRoZSBzdGFjayBpcwotOyBleGVjdXRhYmxlIGJ5IGRlZmF1bHQuCi0laWZpZG4gX19PVVRQVVRfRk9STUFUX18sZWxmCi1TRUNUSU9OIC5ub3RlLkdOVS1zdGFjayBub2FsbG9jIG5vZXhlYyBub3dyaXRlIHByb2diaXRzCi0lZW5kaWYKLQotOyBtZXJnZSBtbXggYW5kIHNzZSoKLQotJW1hY3JvIENBVF9YREVGSU5FIDMKLSAgICAleGRlZmluZSAlMSUyICUzCi0lZW5kbWFjcm8KLQotJW1hY3JvIENBVF9VTkRFRiAyCi0gICAgJXVuZGVmICUxJTIKLSVlbmRtYWNybwotCi0lbWFjcm8gSU5JVF9NTVggMAotICAgICVhc3NpZ24gYXZ4X2VuYWJsZWQgMAotICAgICVkZWZpbmUgUkVTRVRfTU1fUEVSTVVUQVRJT04gSU5JVF9NTVgKLSAgICAlZGVmaW5lIG1tc2l6ZSA4Ci0gICAgJWRlZmluZSBudW1fbW1yZWdzIDgKLSAgICAlZGVmaW5lIG1vdmEgbW92cQotICAgICVkZWZpbmUgbW92dSBtb3ZxCi0gICAgJWRlZmluZSBtb3ZoIG1vdmQKLSAgICAlZGVmaW5lIG1vdm50YSBtb3ZudHEKLSAgICAlYXNzaWduICUlaSAwCi0gICAgJXJlcCA4Ci0gICAgQ0FUX1hERUZJTkUgbSwgJSVpLCBtbSAlKyAlJWkKLSAgICBDQVRfWERFRklORSBubW0sICUlaSwgJSVpCi0gICAgJWFzc2lnbiAlJWkgJSVpKzEKLSAgICAlZW5kcmVwCi0gICAgJXJlcCA4Ci0gICAgQ0FUX1VOREVGIG0sICUlaQotICAgIENBVF9VTkRFRiBubW0sICUlaQotICAgICVhc3NpZ24gJSVpICUlaSsxCi0gICAgJWVuZHJlcAotJWVuZG1hY3JvCi0KLSVtYWNybyBJTklUX1hNTSAwCi0gICAgJWFzc2lnbiBhdnhfZW5hYmxlZCAwCi0gICAgJWRlZmluZSBSRVNFVF9NTV9QRVJNVVRBVElPTiBJTklUX1hNTQotICAgICVkZWZpbmUgbW1zaXplIDE2Ci0gICAgJWRlZmluZSBudW1fbW1yZWdzIDgKLSAgICAlaWZkZWYgQVJDSF9YODZfNjQKLSAgICAlZGVmaW5lIG51bV9tbXJlZ3MgMTYKLSAgICAlZW5kaWYKLSAgICAlZGVmaW5lIG1vdmEgbW92ZHFhCi0gICAgJWRlZmluZSBtb3Z1IG1vdmRxdQotICAgICVkZWZpbmUgbW92aCBtb3ZxCi0gICAgJWRlZmluZSBtb3ZudGEgbW92bnRkcQotICAgICVhc3NpZ24gJSVpIDAKLSAgICAlcmVwIG51bV9tbXJlZ3MKLSAgICBDQVRfWERFRklORSBtLCAlJWksIHhtbSAlKyAlJWkKLSAgICBDQVRfWERFRklORSBueG1tLCAlJWksICUlaQotICAgICVhc3NpZ24gJSVpICUlaSsxCi0gICAgJWVuZHJlcAotJWVuZG1hY3JvCi0KLSVtYWNybyBJTklUX0FWWCAwCi0gICAgSU5JVF9YTU0KLSAgICAlYXNzaWduIGF2eF9lbmFibGVkIDEKLSAgICAlZGVmaW5lIFBBTElHTlIgUEFMSUdOUl9TU1NFMwotICAgICVkZWZpbmUgUkVTRVRfTU1fUEVSTVVUQVRJT04gSU5JVF9BVlgKLSVlbmRtYWNybwotCi0lbWFjcm8gSU5JVF9ZTU0gMAotICAgICVhc3NpZ24gYXZ4X2VuYWJsZWQgMQotICAgICVkZWZpbmUgUkVTRVRfTU1fUEVSTVVUQVRJT04gSU5JVF9ZTU0KLSAgICAlZGVmaW5lIG1tc2l6ZSAzMgotICAgICVkZWZpbmUgbnVtX21tcmVncyA4Ci0gICAgJWlmZGVmIEFSQ0hfWDg2XzY0Ci0gICAgJWRlZmluZSBudW1fbW1yZWdzIDE2Ci0gICAgJWVuZGlmCi0gICAgJWRlZmluZSBtb3ZhIHZtb3ZhcHMKLSAgICAlZGVmaW5lIG1vdnUgdm1vdnVwcwotICAgICVhc3NpZ24gJSVpIDAKLSAgICAlcmVwIG51bV9tbXJlZ3MKLSAgICBDQVRfWERFRklORSBtLCAlJWksIHltbSAlKyAlJWkKLSAgICBDQVRfWERFRklORSBueW1tLCAlJWksICUlaQotICAgICVhc3NpZ24gJSVpICUlaSsxCi0gICAgJWVuZHJlcAotJWVuZG1hY3JvCi0KLUlOSVRfTU1YCi0KLTsgSSBvZnRlbiB3YW50IHRvIHVzZSBtYWNyb3MgdGhhdCBwZXJtdXRlIHRoZWlyIGFyZ3VtZW50cy4gZS5nLiB0aGVyZSdzIG5vCi07IGVmZmljaWVudCB3YXkgdG8gaW1wbGVtZW50IGJ1dHRlcmZseSBvciB0cmFuc3Bvc2Ugb3IgZGN0IHdpdGhvdXQgc3dhcHBpbmcgc29tZQotOyBhcmd1bWVudHMuCi07Ci07IEkgd291bGQgbGlrZSB0byBub3QgaGF2ZSB0byBtYW51YWxseSBrZWVwIHRyYWNrIG9mIHRoZSBwZXJtdXRhdGlvbnM6Ci07IElmIEkgaW5zZXJ0IGEgcGVybXV0YXRpb24gaW4gdGhlIG1pZGRsZSBvZiBhIGZ1bmN0aW9uLCBpdCBzaG91bGQgYXV0b21hdGljYWxseQotOyBjaGFuZ2UgZXZlcnl0aGluZyB0aGF0IGZvbGxvd3MuIEZvciBtb3JlIGNvbXBsZXggbWFjcm9zIEkgbWF5IGFsc28gaGF2ZSBtdWx0aXBsZQotOyBpbXBsZW1lbnRhdGlvbnMsIGUuZy4gdGhlIFNTRTIgYW5kIFNTU0UzIHZlcnNpb25zIG1heSBoYXZlIGRpZmZlcmVudCBwZXJtdXRhdGlvbnMuCi07Ci07IEhlbmNlIHRoZXNlIG1hY3Jvcy4gSW5zZXJ0IGEgUEVSTVVURSBvciBzb21lIFNXQVBzIGF0IHRoZSBlbmQgb2YgYSBtYWNybyB0aGF0Ci07IHBlcm11dGVzIGl0cyBhcmd1bWVudHMuIEl0J3MgZXF1aXZhbGVudCB0byBleGNoYW5naW5nIHRoZSBjb250ZW50cyBvZiB0aGUKLTsgcmVnaXN0ZXJzLCBleGNlcHQgdGhhdCB0aGlzIHdheSB5b3UgZXhjaGFuZ2UgdGhlIHJlZ2lzdGVyIG5hbWVzIGluc3RlYWQsIHNvIGl0Ci07IGRvZXNuJ3QgY29zdCBhbnkgY3ljbGVzLgotCi0lbWFjcm8gUEVSTVVURSAyLSogOyB0YWtlcyBhIGxpc3Qgb2YgcGFpcnMgdG8gc3dhcAotJXJlcCAlMC8yCi0gICAgJXhkZWZpbmUgdG1wJTIgbSUyCi0gICAgJXhkZWZpbmUgbnRtcCUyIG5tJTIKLSAgICAlcm90YXRlIDIKLSVlbmRyZXAKLSVyZXAgJTAvMgotICAgICV4ZGVmaW5lIG0lMSB0bXAlMgotICAgICV4ZGVmaW5lIG5tJTEgbnRtcCUyCi0gICAgJXVuZGVmIHRtcCUyCi0gICAgJXVuZGVmIG50bXAlMgotICAgICVyb3RhdGUgMgotJWVuZHJlcAotJWVuZG1hY3JvCi0KLSVtYWNybyBTV0FQIDItKiA7IHN3YXBzIGEgc2luZ2xlIGNoYWluIChzb21ldGltZXMgbW9yZSBjb25jaXNlIHRoYW4gcGFpcnMpCi0lcmVwICUwLTEKLSVpZmRlZiBtJTEKLSAgICAleGRlZmluZSB0bXAgbSUxCi0gICAgJXhkZWZpbmUgbSUxIG0lMgotICAgICV4ZGVmaW5lIG0lMiB0bXAKLSAgICBDQVRfWERFRklORSBuLCBtJTEsICUxCi0gICAgQ0FUX1hERUZJTkUgbiwgbSUyLCAlMgotJWVsc2UKLSAgICA7IElmIHdlIHdlcmUgY2FsbGVkIGFzICJTV0FQIG0wLG0xIiByYXRoZXIgdGhhbiAiU1dBUCAwLDEiIGluZmVyIHRoZSBvcmlnaW5hbCBudW1iZXJzIGhlcmUuCi0gICAgOyBCZSBjYXJlZnVsIHVzaW5nIHRoaXMgbW9kZSBpbiBuZXN0ZWQgbWFjcm9zIHRob3VnaCwgYXMgaW4gc29tZSBjYXNlcyB0aGVyZSBtYXkgYmUKLSAgICA7IG90aGVyIGNvcGllcyBvZiBtIyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGRlcmVmZXJlbmNlZCBhbmQgZG9uJ3QgZ2V0IHVwZGF0ZWQgY29ycmVjdGx5LgotICAgICV4ZGVmaW5lICUlbjEgbiAlKyAlMQotICAgICV4ZGVmaW5lICUlbjIgbiAlKyAlMgotICAgICV4ZGVmaW5lIHRtcCBtICUrICUlbjEKLSAgICBDQVRfWERFRklORSBtLCAlJW4xLCBtICUrICUlbjIKLSAgICBDQVRfWERFRklORSBtLCAlJW4yLCB0bXAKLSAgICBDQVRfWERFRklORSBuLCBtICUrICUlbjEsICUlbjEKLSAgICBDQVRfWERFRklORSBuLCBtICUrICUlbjIsICUlbjIKLSVlbmRpZgotICAgICV1bmRlZiB0bXAKLSAgICAlcm90YXRlIDEKLSVlbmRyZXAKLSVlbmRtYWNybwotCi07IElmIFNBVkVfTU1fUEVSTVVUQVRJT04gaXMgcGxhY2VkIGF0IHRoZSBlbmQgb2YgYSBmdW5jdGlvbiBhbmQgZ2l2ZW4gdGhlCi07IGZ1bmN0aW9uIG5hbWUsIHRoZW4gYW55IGxhdGVyIGNhbGxzIHRvIHRoYXQgZnVuY3Rpb24gd2lsbCBhdXRvbWF0aWNhbGx5Ci07IGxvYWQgdGhlIHBlcm11dGF0aW9uLCBzbyB2YWx1ZXMgY2FuIGJlIHJldHVybmVkIGluIG1tcmVncy4KLSVtYWNybyBTQVZFX01NX1BFUk1VVEFUSU9OIDEgOyBuYW1lIHRvIHNhdmUgYXMKLSAgICAlYXNzaWduICUlaSAwCi0gICAgJXJlcCBudW1fbW1yZWdzCi0gICAgQ0FUX1hERUZJTkUgJTFfbSwgJSVpLCBtICUrICUlaQotICAgICVhc3NpZ24gJSVpICUlaSsxCi0gICAgJWVuZHJlcAotJWVuZG1hY3JvCi0KLSVtYWNybyBMT0FEX01NX1BFUk1VVEFUSU9OIDEgOyBuYW1lIHRvIGxvYWQgZnJvbQotICAgICVhc3NpZ24gJSVpIDAKLSAgICAlcmVwIG51bV9tbXJlZ3MKLSAgICBDQVRfWERFRklORSBtLCAlJWksICUxX20gJSsgJSVpCi0gICAgQ0FUX1hERUZJTkUgbiwgbSAlKyAlJWksICUlaQotICAgICVhc3NpZ24gJSVpICUlaSsxCi0gICAgJWVuZHJlcAotJWVuZG1hY3JvCi0KLSVtYWNybyBjYWxsIDEKLSAgICBjYWxsICUxCi0gICAgJWlmZGVmICUxX20wCi0gICAgICAgIExPQURfTU1fUEVSTVVUQVRJT04gJTEKLSAgICAlZW5kaWYKLSVlbmRtYWNybwotCi07IFN1YnN0aXR1dGlvbnMgdGhhdCByZWR1Y2UgaW5zdHJ1Y3Rpb24gc2l6ZSBidXQgYXJlIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50Ci0lbWFjcm8gYWRkIDIKLSAgICAlaWZudW0gJTIKLSAgICAgICAgJWlmICUyPT0xMjgKLSAgICAgICAgICAgIHN1YiAlMSwgLTEyOAotICAgICAgICAlZWxzZQotICAgICAgICAgICAgYWRkICUxLCAlMgotICAgICAgICAlZW5kaWYKLSAgICAlZWxzZQotICAgICAgICBhZGQgJTEsICUyCi0gICAgJWVuZGlmCi0lZW5kbWFjcm8KLQotJW1hY3JvIHN1YiAyCi0gICAgJWlmbnVtICUyCi0gICAgICAgICVpZiAlMj09MTI4Ci0gICAgICAgICAgICBhZGQgJTEsIC0xMjgKLSAgICAgICAgJWVsc2UKLSAgICAgICAgICAgIHN1YiAlMSwgJTIKLSAgICAgICAgJWVuZGlmCi0gICAgJWVsc2UKLSAgICAgICAgc3ViICUxLCAlMgotICAgICVlbmRpZgotJWVuZG1hY3JvCi0KLTs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyBBVlggYWJzdHJhY3Rpb24gbGF5ZXIKLTs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0lYXNzaWduIGkgMAotJXJlcCAxNgotICAgICVpZiBpIDwgOAotICAgICAgICBDQVRfWERFRklORSBzaXplb2ZtbSwgaSwgOAotICAgICVlbmRpZgotICAgIENBVF9YREVGSU5FIHNpemVvZnhtbSwgaSwgMTYKLSAgICBDQVRfWERFRklORSBzaXplb2Z5bW0sIGksIDMyCi0lYXNzaWduIGkgaSsxCi0lZW5kcmVwCi0ldW5kZWYgaQotCi07JTEgPT0gaW5zdHJ1Y3Rpb24KLTslMiA9PSAxIGlmIGZsb2F0LCAwIGlmIGludAotOyUzID09IDAgaWYgMy1vcGVyYW5kICh4bW0sIHhtbSwgeG1tKSwgMSBpZiA0LW9wZXJhbmQgKHhtbSwgeG1tLCB4bW0sIGltbSkKLTslNCA9PSBudW1iZXIgb2Ygb3BlcmFuZHMgZ2l2ZW4KLTslNSs6IG9wZXJhbmRzCi0lbWFjcm8gUlVOX0FWWF9JTlNUUiA2LTcrCi0gICAgJWlmIHNpemVvZiU1PT0zMgotICAgICAgICB2JTEgJTUsICU2LCAlNwotICAgICVlbHNlCi0gICAgICAgICVpZiBzaXplb2YlNT09OAotICAgICAgICAgICAgJWRlZmluZSAlJXJlZ21vdiBtb3ZxCi0gICAgICAgICVlbGlmICUyCi0gICAgICAgICAgICAlZGVmaW5lICUlcmVnbW92IG1vdmFwcwotICAgICAgICAlZWxzZQotICAgICAgICAgICAgJWRlZmluZSAlJXJlZ21vdiBtb3ZkcWEKLSAgICAgICAgJWVuZGlmCi0KLSAgICAgICAgJWlmICU0Pj0zKyUzCi0gICAgICAgICAgICAlaWZuaWRuICU1LCAlNgotICAgICAgICAgICAgICAgICVpZiBhdnhfZW5hYmxlZCAmJiBzaXplb2YlNT09MTYKLSAgICAgICAgICAgICAgICAgICAgdiUxICU1LCAlNiwgJTcKLSAgICAgICAgICAgICAgICAlZWxzZQotICAgICAgICAgICAgICAgICAgICAlJXJlZ21vdiAlNSwgJTYKLSAgICAgICAgICAgICAgICAgICAgJTEgJTUsICU3Ci0gICAgICAgICAgICAgICAgJWVuZGlmCi0gICAgICAgICAgICAlZWxzZQotICAgICAgICAgICAgICAgICUxICU1LCAlNwotICAgICAgICAgICAgJWVuZGlmCi0gICAgICAgICVlbGlmICUzCi0gICAgICAgICAgICAlMSAlNSwgJTYsICU3Ci0gICAgICAgICVlbHNlCi0gICAgICAgICAgICAlMSAlNSwgJTYKLSAgICAgICAgJWVuZGlmCi0gICAgJWVuZGlmCi0lZW5kbWFjcm8KLQotOyUxID09IGluc3RydWN0aW9uCi07JTIgPT0gMSBpZiBmbG9hdCwgMCBpZiBpbnQKLTslMyA9PSAwIGlmIDMtb3BlcmFuZCAoeG1tLCB4bW0sIHhtbSksIDEgaWYgNC1vcGVyYW5kICh4bW0sIHhtbSwgeG1tLCBpbW0pCi0lbWFjcm8gQVZYX0lOU1RSIDMKLSAgICAlbWFjcm8gJTEgMi04IGZub3JkLCBmbm9yZCwgZm5vcmQsICUxLCAlMiwgJTMKLSAgICAgICAgJWlmaWRuICUzLCBmbm9yZAotICAgICAgICAgICAgUlVOX0FWWF9JTlNUUiAlNiwgJTcsICU4LCAyLCAlMSwgJTIKLSAgICAgICAgJWVsaWZpZG4gJTQsIGZub3JkCi0gICAgICAgICAgICBSVU5fQVZYX0lOU1RSICU2LCAlNywgJTgsIDMsICUxLCAlMiwgJTMKLSAgICAgICAgJWVsaWZpZG4gJTUsIGZub3JkCi0gICAgICAgICAgICBSVU5fQVZYX0lOU1RSICU2LCAlNywgJTgsIDQsICUxLCAlMiwgJTMsICU0Ci0gICAgICAgICVlbHNlCi0gICAgICAgICAgICBSVU5fQVZYX0lOU1RSICU2LCAlNywgJTgsIDUsICUxLCAlMiwgJTMsICU0LCAlNQotICAgICAgICAlZW5kaWYKLSAgICAlZW5kbWFjcm8KLSVlbmRtYWNybwotCi1BVlhfSU5TVFIgYWRkcGQsIDEsIDAKLUFWWF9JTlNUUiBhZGRwcywgMSwgMAotQVZYX0lOU1RSIGFkZHNkLCAxLCAwCi1BVlhfSU5TVFIgYWRkc3MsIDEsIDAKLUFWWF9JTlNUUiBhZGRzdWJwZCwgMSwgMAotQVZYX0lOU1RSIGFkZHN1YnBzLCAxLCAwCi1BVlhfSU5TVFIgYW5kcGQsIDEsIDAKLUFWWF9JTlNUUiBhbmRwcywgMSwgMAotQVZYX0lOU1RSIGFuZG5wZCwgMSwgMAotQVZYX0lOU1RSIGFuZG5wcywgMSwgMAotQVZYX0lOU1RSIGJsZW5kcGQsIDEsIDAKLUFWWF9JTlNUUiBibGVuZHBzLCAxLCAwCi1BVlhfSU5TVFIgYmxlbmR2cGQsIDEsIDAKLUFWWF9JTlNUUiBibGVuZHZwcywgMSwgMAotQVZYX0lOU1RSIGNtcHBkLCAxLCAwCi1BVlhfSU5TVFIgY21wcHMsIDEsIDAKLUFWWF9JTlNUUiBjbXBzZCwgMSwgMAotQVZYX0lOU1RSIGNtcHNzLCAxLCAwCi1BVlhfSU5TVFIgZGl2cGQsIDEsIDAKLUFWWF9JTlNUUiBkaXZwcywgMSwgMAotQVZYX0lOU1RSIGRpdnNkLCAxLCAwCi1BVlhfSU5TVFIgZGl2c3MsIDEsIDAKLUFWWF9JTlNUUiBkcHBkLCAxLCAwCi1BVlhfSU5TVFIgZHBwcywgMSwgMAotQVZYX0lOU1RSIGhhZGRwZCwgMSwgMAotQVZYX0lOU1RSIGhhZGRwcywgMSwgMAotQVZYX0lOU1RSIGhzdWJwZCwgMSwgMAotQVZYX0lOU1RSIGhzdWJwcywgMSwgMAotQVZYX0lOU1RSIG1heHBkLCAxLCAwCi1BVlhfSU5TVFIgbWF4cHMsIDEsIDAKLUFWWF9JTlNUUiBtYXhzZCwgMSwgMAotQVZYX0lOU1RSIG1heHNzLCAxLCAwCi1BVlhfSU5TVFIgbWlucGQsIDEsIDAKLUFWWF9JTlNUUiBtaW5wcywgMSwgMAotQVZYX0lOU1RSIG1pbnNkLCAxLCAwCi1BVlhfSU5TVFIgbWluc3MsIDEsIDAKLUFWWF9JTlNUUiBtcHNhZGJ3LCAwLCAxCi1BVlhfSU5TVFIgbXVscGQsIDEsIDAKLUFWWF9JTlNUUiBtdWxwcywgMSwgMAotQVZYX0lOU1RSIG11bHNkLCAxLCAwCi1BVlhfSU5TVFIgbXVsc3MsIDEsIDAKLUFWWF9JTlNUUiBvcnBkLCAxLCAwCi1BVlhfSU5TVFIgb3JwcywgMSwgMAotQVZYX0lOU1RSIHBhY2tzc3diLCAwLCAwCi1BVlhfSU5TVFIgcGFja3NzZHcsIDAsIDAKLUFWWF9JTlNUUiBwYWNrdXN3YiwgMCwgMAotQVZYX0lOU1RSIHBhY2t1c2R3LCAwLCAwCi1BVlhfSU5TVFIgcGFkZGIsIDAsIDAKLUFWWF9JTlNUUiBwYWRkdywgMCwgMAotQVZYX0lOU1RSIHBhZGRkLCAwLCAwCi1BVlhfSU5TVFIgcGFkZHEsIDAsIDAKLUFWWF9JTlNUUiBwYWRkc2IsIDAsIDAKLUFWWF9JTlNUUiBwYWRkc3csIDAsIDAKLUFWWF9JTlNUUiBwYWRkdXNiLCAwLCAwCi1BVlhfSU5TVFIgcGFkZHVzdywgMCwgMAotQVZYX0lOU1RSIHBhbGlnbnIsIDAsIDEKLUFWWF9JTlNUUiBwYW5kLCAwLCAwCi1BVlhfSU5TVFIgcGFuZG4sIDAsIDAKLUFWWF9JTlNUUiBwYXZnYiwgMCwgMAotQVZYX0lOU1RSIHBhdmd3LCAwLCAwCi1BVlhfSU5TVFIgcGJsZW5kdmIsIDAsIDAKLUFWWF9JTlNUUiBwYmxlbmR3LCAwLCAxCi1BVlhfSU5TVFIgcGNtcGVzdHJpLCAwLCAwCi1BVlhfSU5TVFIgcGNtcGVzdHJtLCAwLCAwCi1BVlhfSU5TVFIgcGNtcGlzdHJpLCAwLCAwCi1BVlhfSU5TVFIgcGNtcGlzdHJtLCAwLCAwCi1BVlhfSU5TVFIgcGNtcGVxYiwgMCwgMAotQVZYX0lOU1RSIHBjbXBlcXcsIDAsIDAKLUFWWF9JTlNUUiBwY21wZXFkLCAwLCAwCi1BVlhfSU5TVFIgcGNtcGVxcSwgMCwgMAotQVZYX0lOU1RSIHBjbXBndGIsIDAsIDAKLUFWWF9JTlNUUiBwY21wZ3R3LCAwLCAwCi1BVlhfSU5TVFIgcGNtcGd0ZCwgMCwgMAotQVZYX0lOU1RSIHBjbXBndHEsIDAsIDAKLUFWWF9JTlNUUiBwaGFkZHcsIDAsIDAKLUFWWF9JTlNUUiBwaGFkZGQsIDAsIDAKLUFWWF9JTlNUUiBwaGFkZHN3LCAwLCAwCi1BVlhfSU5TVFIgcGhzdWJ3LCAwLCAwCi1BVlhfSU5TVFIgcGhzdWJkLCAwLCAwCi1BVlhfSU5TVFIgcGhzdWJzdywgMCwgMAotQVZYX0lOU1RSIHBtYWRkd2QsIDAsIDAKLUFWWF9JTlNUUiBwbWFkZHVic3csIDAsIDAKLUFWWF9JTlNUUiBwbWF4c2IsIDAsIDAKLUFWWF9JTlNUUiBwbWF4c3csIDAsIDAKLUFWWF9JTlNUUiBwbWF4c2QsIDAsIDAKLUFWWF9JTlNUUiBwbWF4dWIsIDAsIDAKLUFWWF9JTlNUUiBwbWF4dXcsIDAsIDAKLUFWWF9JTlNUUiBwbWF4dWQsIDAsIDAKLUFWWF9JTlNUUiBwbWluc2IsIDAsIDAKLUFWWF9JTlNUUiBwbWluc3csIDAsIDAKLUFWWF9JTlNUUiBwbWluc2QsIDAsIDAKLUFWWF9JTlNUUiBwbWludWIsIDAsIDAKLUFWWF9JTlNUUiBwbWludXcsIDAsIDAKLUFWWF9JTlNUUiBwbWludWQsIDAsIDAKLUFWWF9JTlNUUiBwbXVsaHV3LCAwLCAwCi1BVlhfSU5TVFIgcG11bGhyc3csIDAsIDAKLUFWWF9JTlNUUiBwbXVsaHcsIDAsIDAKLUFWWF9JTlNUUiBwbXVsbHcsIDAsIDAKLUFWWF9JTlNUUiBwbXVsbGQsIDAsIDAKLUFWWF9JTlNUUiBwbXVsdWRxLCAwLCAwCi1BVlhfSU5TVFIgcG11bGRxLCAwLCAwCi1BVlhfSU5TVFIgcG9yLCAwLCAwCi1BVlhfSU5TVFIgcHNhZGJ3LCAwLCAwCi1BVlhfSU5TVFIgcHNodWZiLCAwLCAwCi1BVlhfSU5TVFIgcHNpZ25iLCAwLCAwCi1BVlhfSU5TVFIgcHNpZ253LCAwLCAwCi1BVlhfSU5TVFIgcHNpZ25kLCAwLCAwCi1BVlhfSU5TVFIgcHNsbHcsIDAsIDAKLUFWWF9JTlNUUiBwc2xsZCwgMCwgMAotQVZYX0lOU1RSIHBzbGxxLCAwLCAwCi1BVlhfSU5TVFIgcHNsbGRxLCAwLCAwCi1BVlhfSU5TVFIgcHNyYXcsIDAsIDAKLUFWWF9JTlNUUiBwc3JhZCwgMCwgMAotQVZYX0lOU1RSIHBzcmx3LCAwLCAwCi1BVlhfSU5TVFIgcHNybGQsIDAsIDAKLUFWWF9JTlNUUiBwc3JscSwgMCwgMAotQVZYX0lOU1RSIHBzcmxkcSwgMCwgMAotQVZYX0lOU1RSIHBzdWJiLCAwLCAwCi1BVlhfSU5TVFIgcHN1YncsIDAsIDAKLUFWWF9JTlNUUiBwc3ViZCwgMCwgMAotQVZYX0lOU1RSIHBzdWJxLCAwLCAwCi1BVlhfSU5TVFIgcHN1YnNiLCAwLCAwCi1BVlhfSU5TVFIgcHN1YnN3LCAwLCAwCi1BVlhfSU5TVFIgcHN1YnVzYiwgMCwgMAotQVZYX0lOU1RSIHBzdWJ1c3csIDAsIDAKLUFWWF9JTlNUUiBwdW5wY2toYncsIDAsIDAKLUFWWF9JTlNUUiBwdW5wY2tod2QsIDAsIDAKLUFWWF9JTlNUUiBwdW5wY2toZHEsIDAsIDAKLUFWWF9JTlNUUiBwdW5wY2tocWRxLCAwLCAwCi1BVlhfSU5TVFIgcHVucGNrbGJ3LCAwLCAwCi1BVlhfSU5TVFIgcHVucGNrbHdkLCAwLCAwCi1BVlhfSU5TVFIgcHVucGNrbGRxLCAwLCAwCi1BVlhfSU5TVFIgcHVucGNrbHFkcSwgMCwgMAotQVZYX0lOU1RSIHB4b3IsIDAsIDAKLUFWWF9JTlNUUiBzaHVmcHMsIDAsIDEKLUFWWF9JTlNUUiBzdWJwZCwgMSwgMAotQVZYX0lOU1RSIHN1YnBzLCAxLCAwCi1BVlhfSU5TVFIgc3Vic2QsIDEsIDAKLUFWWF9JTlNUUiBzdWJzcywgMSwgMAotQVZYX0lOU1RSIHVucGNraHBkLCAxLCAwCi1BVlhfSU5TVFIgdW5wY2tocHMsIDEsIDAKLUFWWF9JTlNUUiB1bnBja2xwZCwgMSwgMAotQVZYX0lOU1RSIHVucGNrbHBzLCAxLCAwCi1BVlhfSU5TVFIgeG9ycGQsIDEsIDAKLUFWWF9JTlNUUiB4b3JwcywgMSwgMAotCi07IDNETm93IGluc3RydWN0aW9ucywgZm9yIHNoYXJpbmcgY29kZSBiZXR3ZWVuIEFWWCwgU1NFIGFuZCAzRE4KLUFWWF9JTlNUUiBwZmFkZCwgMSwgMAotQVZYX0lOU1RSIHBmc3ViLCAxLCAwCi1BVlhfSU5TVFIgcGZtdWwsIDEsIDAKLQotOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07IENocm9taXVtIGV4dGVuc2lvbnMKLTs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0laWZkZWYgQ0hST01JVU0KLTsgQWx3YXlzIGJ1aWxkIFBJQyBjb2RlIG9uIE1hYyBvciBMaW51eCBmb3IgQ2hyb21pdW0uCi0laWZkZWYgTUFDSE8KLSVkZWZpbmUgUElDCi0lZW5kaWYKLSVpZmRlZiBFTEYKLSVkZWZpbmUgUElDCi0lZW5kaWYKLQotOwotOyBMT0FEX1NZTSAlMSAocmVnKSwgJTIgKHN5bSkKLTsgQ29waWVzIHRoZSBhZGRyZXNzIHRvIGEgbG9jYWwgc3ltYm9sIHRvIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIuCi07Ci0KLSVtYWNybyBMT0FEX1NZTSAyCi0KLSVpZmRlZiBQSUMKLSAgY2FsbCAgICAgICUlZ2V0ZWlwCi0gIGFkZCAgICAgICAlMSwgJTIgLSAkCi0gIGptcCAgICAgICAlJWVuZAotJSVnZXRlaXA6Ci0gIG1vdiAgICAgICAlMSwgW3JzcF0KLSAgcmV0Ci0lJWVuZDoKLQotJWVsc2UKLSAgbGVhICAgICAgICUxLCBbJTJdCi0lZW5kaWYKLQotJWVuZG1hY3JvCi0KLTsKLTsgTU9WcSAlMSAoeG1tKSwgJTIgKHJlZykKLTsgTU9WcSAlMSAocmVnKSwgJTIgKHhtbSkKLTsgQ29waWVzIGEgZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVyIHRvIGFuIFhNTSByZWdpc3RlciwgYW5kIHZpY2UgdmVyc2EuCi07Ci0lbWFjcm8gTU9WcSAyCi0laWYgZ3Byc2l6ZSA9PSA4Ci0gIG1vdnEgICAgICAlMSwgJTIKLSVlbHNlCi0gIG1vdmQgICAgICAlMSwgJTIKLSVlbmRpZgotJWVuZG1hY3JvCi0KLTsKLTsgUFJJVkFURQotOyBBIGZsYWcgcmVwcmVzZW50aW5nIHRoZSBzcGVjaWZpZWQgc3ltYm9sIGlzIGEgcHJpdmF0ZSBzeW1ib2wuIFRoaXMgZGVmaW5lIGFkZHMKLTsgYSBoaWRkZW4gZmxhZyBvbiBMaW51eCBhbmQgYSBwcml2YXRlX2V4dGVybiBmbGFnIG9uIE1hYy4gKFdlIGNhbiB1c2UgdGhpcwotOyBwcml2YXRlX2V4dGVybiBmbGFnIG9ubHkgb24gdGhlIGxhdGVzdCB5YXNtLikKLTsKLSVpZmRlZiBNQUNITwotJWRlZmluZSBQUklWQVRFIDpwcml2YXRlX2V4dGVybgotJWVsaWZkZWYgRUxGCi0lZGVmaW5lIFBSSVZBVEUgOmhpZGRlbgotJWVsc2UKLSVkZWZpbmUgUFJJVkFURQotJWVuZGlmCi0KLSVlbmRpZiAgOyBDSFJPTUlVTQotCi0lZW5kaWYgIDsgTUVESUFfQkFTRV9TSU1EX1g4NklOQ19BU01fCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9zaW1kL3l1dl90b19yZ2JfdGFibGUuY2MgYi9zcmMvbWVkaWEvYmFzZS9zaW1kL3l1dl90b19yZ2JfdGFibGUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OThlODUuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2Uvc2ltZC95dXZfdG9fcmdiX3RhYmxlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL3NpbWQveXV2X3RvX3JnYl90YWJsZS5oIgotCi1leHRlcm4gIkMiIHsKLQotI2RlZmluZSBSR0JZKGkpIHsgXAotICBzdGF0aWNfY2FzdDxpbnQxNj4oMS4xNjQgKiA2NCAqIChpIC0gMTYpICsgMC41KSwgXAotICBzdGF0aWNfY2FzdDxpbnQxNj4oMS4xNjQgKiA2NCAqIChpIC0gMTYpICsgMC41KSwgXAotICBzdGF0aWNfY2FzdDxpbnQxNj4oMS4xNjQgKiA2NCAqIChpIC0gMTYpICsgMC41KSwgXAotICAwIFwKLX0KLQotI2RlZmluZSBSR0JVKGkpIHsgXAotICBzdGF0aWNfY2FzdDxpbnQxNj4oMi4wMTggKiA2NCAqIChpIC0gMTI4KSArIDAuNSksIFwKLSAgc3RhdGljX2Nhc3Q8aW50MTY+KC0wLjM5MSAqIDY0ICogKGkgLSAxMjgpICsgMC41KSwgXAotICAwLCBcCi0gIHN0YXRpY19jYXN0PGludDE2PigyNTYgKiA2NCAtIDEpIFwKLX0KLQotI2RlZmluZSBSR0JWKGkpIHsgXAotICAwLCBcCi0gIHN0YXRpY19jYXN0PGludDE2PigtMC44MTMgKiA2NCAqIChpIC0gMTI4KSArIDAuNSksIFwKLSAgc3RhdGljX2Nhc3Q8aW50MTY+KDEuNTk2ICogNjQgKiAoaSAtIDEyOCkgKyAwLjUpLCBcCi0gIDAgXAotfQotCi1TSU1EX0FMSUdORUQoaW50MTYga0NvZWZmaWNpZW50c1JnYllbMjU2ICogM11bNF0pID0gewotICBSR0JZKDB4MDApLCBSR0JZKDB4MDEpLCBSR0JZKDB4MDIpLCBSR0JZKDB4MDMpLAotICBSR0JZKDB4MDQpLCBSR0JZKDB4MDUpLCBSR0JZKDB4MDYpLCBSR0JZKDB4MDcpLAotICBSR0JZKDB4MDgpLCBSR0JZKDB4MDkpLCBSR0JZKDB4MEEpLCBSR0JZKDB4MEIpLAotICBSR0JZKDB4MEMpLCBSR0JZKDB4MEQpLCBSR0JZKDB4MEUpLCBSR0JZKDB4MEYpLAotICBSR0JZKDB4MTApLCBSR0JZKDB4MTEpLCBSR0JZKDB4MTIpLCBSR0JZKDB4MTMpLAotICBSR0JZKDB4MTQpLCBSR0JZKDB4MTUpLCBSR0JZKDB4MTYpLCBSR0JZKDB4MTcpLAotICBSR0JZKDB4MTgpLCBSR0JZKDB4MTkpLCBSR0JZKDB4MUEpLCBSR0JZKDB4MUIpLAotICBSR0JZKDB4MUMpLCBSR0JZKDB4MUQpLCBSR0JZKDB4MUUpLCBSR0JZKDB4MUYpLAotICBSR0JZKDB4MjApLCBSR0JZKDB4MjEpLCBSR0JZKDB4MjIpLCBSR0JZKDB4MjMpLAotICBSR0JZKDB4MjQpLCBSR0JZKDB4MjUpLCBSR0JZKDB4MjYpLCBSR0JZKDB4MjcpLAotICBSR0JZKDB4MjgpLCBSR0JZKDB4MjkpLCBSR0JZKDB4MkEpLCBSR0JZKDB4MkIpLAotICBSR0JZKDB4MkMpLCBSR0JZKDB4MkQpLCBSR0JZKDB4MkUpLCBSR0JZKDB4MkYpLAotICBSR0JZKDB4MzApLCBSR0JZKDB4MzEpLCBSR0JZKDB4MzIpLCBSR0JZKDB4MzMpLAotICBSR0JZKDB4MzQpLCBSR0JZKDB4MzUpLCBSR0JZKDB4MzYpLCBSR0JZKDB4MzcpLAotICBSR0JZKDB4MzgpLCBSR0JZKDB4MzkpLCBSR0JZKDB4M0EpLCBSR0JZKDB4M0IpLAotICBSR0JZKDB4M0MpLCBSR0JZKDB4M0QpLCBSR0JZKDB4M0UpLCBSR0JZKDB4M0YpLAotICBSR0JZKDB4NDApLCBSR0JZKDB4NDEpLCBSR0JZKDB4NDIpLCBSR0JZKDB4NDMpLAotICBSR0JZKDB4NDQpLCBSR0JZKDB4NDUpLCBSR0JZKDB4NDYpLCBSR0JZKDB4NDcpLAotICBSR0JZKDB4NDgpLCBSR0JZKDB4NDkpLCBSR0JZKDB4NEEpLCBSR0JZKDB4NEIpLAotICBSR0JZKDB4NEMpLCBSR0JZKDB4NEQpLCBSR0JZKDB4NEUpLCBSR0JZKDB4NEYpLAotICBSR0JZKDB4NTApLCBSR0JZKDB4NTEpLCBSR0JZKDB4NTIpLCBSR0JZKDB4NTMpLAotICBSR0JZKDB4NTQpLCBSR0JZKDB4NTUpLCBSR0JZKDB4NTYpLCBSR0JZKDB4NTcpLAotICBSR0JZKDB4NTgpLCBSR0JZKDB4NTkpLCBSR0JZKDB4NUEpLCBSR0JZKDB4NUIpLAotICBSR0JZKDB4NUMpLCBSR0JZKDB4NUQpLCBSR0JZKDB4NUUpLCBSR0JZKDB4NUYpLAotICBSR0JZKDB4NjApLCBSR0JZKDB4NjEpLCBSR0JZKDB4NjIpLCBSR0JZKDB4NjMpLAotICBSR0JZKDB4NjQpLCBSR0JZKDB4NjUpLCBSR0JZKDB4NjYpLCBSR0JZKDB4NjcpLAotICBSR0JZKDB4NjgpLCBSR0JZKDB4NjkpLCBSR0JZKDB4NkEpLCBSR0JZKDB4NkIpLAotICBSR0JZKDB4NkMpLCBSR0JZKDB4NkQpLCBSR0JZKDB4NkUpLCBSR0JZKDB4NkYpLAotICBSR0JZKDB4NzApLCBSR0JZKDB4NzEpLCBSR0JZKDB4NzIpLCBSR0JZKDB4NzMpLAotICBSR0JZKDB4NzQpLCBSR0JZKDB4NzUpLCBSR0JZKDB4NzYpLCBSR0JZKDB4NzcpLAotICBSR0JZKDB4NzgpLCBSR0JZKDB4NzkpLCBSR0JZKDB4N0EpLCBSR0JZKDB4N0IpLAotICBSR0JZKDB4N0MpLCBSR0JZKDB4N0QpLCBSR0JZKDB4N0UpLCBSR0JZKDB4N0YpLAotICBSR0JZKDB4ODApLCBSR0JZKDB4ODEpLCBSR0JZKDB4ODIpLCBSR0JZKDB4ODMpLAotICBSR0JZKDB4ODQpLCBSR0JZKDB4ODUpLCBSR0JZKDB4ODYpLCBSR0JZKDB4ODcpLAotICBSR0JZKDB4ODgpLCBSR0JZKDB4ODkpLCBSR0JZKDB4OEEpLCBSR0JZKDB4OEIpLAotICBSR0JZKDB4OEMpLCBSR0JZKDB4OEQpLCBSR0JZKDB4OEUpLCBSR0JZKDB4OEYpLAotICBSR0JZKDB4OTApLCBSR0JZKDB4OTEpLCBSR0JZKDB4OTIpLCBSR0JZKDB4OTMpLAotICBSR0JZKDB4OTQpLCBSR0JZKDB4OTUpLCBSR0JZKDB4OTYpLCBSR0JZKDB4OTcpLAotICBSR0JZKDB4OTgpLCBSR0JZKDB4OTkpLCBSR0JZKDB4OUEpLCBSR0JZKDB4OUIpLAotICBSR0JZKDB4OUMpLCBSR0JZKDB4OUQpLCBSR0JZKDB4OUUpLCBSR0JZKDB4OUYpLAotICBSR0JZKDB4QTApLCBSR0JZKDB4QTEpLCBSR0JZKDB4QTIpLCBSR0JZKDB4QTMpLAotICBSR0JZKDB4QTQpLCBSR0JZKDB4QTUpLCBSR0JZKDB4QTYpLCBSR0JZKDB4QTcpLAotICBSR0JZKDB4QTgpLCBSR0JZKDB4QTkpLCBSR0JZKDB4QUEpLCBSR0JZKDB4QUIpLAotICBSR0JZKDB4QUMpLCBSR0JZKDB4QUQpLCBSR0JZKDB4QUUpLCBSR0JZKDB4QUYpLAotICBSR0JZKDB4QjApLCBSR0JZKDB4QjEpLCBSR0JZKDB4QjIpLCBSR0JZKDB4QjMpLAotICBSR0JZKDB4QjQpLCBSR0JZKDB4QjUpLCBSR0JZKDB4QjYpLCBSR0JZKDB4QjcpLAotICBSR0JZKDB4QjgpLCBSR0JZKDB4QjkpLCBSR0JZKDB4QkEpLCBSR0JZKDB4QkIpLAotICBSR0JZKDB4QkMpLCBSR0JZKDB4QkQpLCBSR0JZKDB4QkUpLCBSR0JZKDB4QkYpLAotICBSR0JZKDB4QzApLCBSR0JZKDB4QzEpLCBSR0JZKDB4QzIpLCBSR0JZKDB4QzMpLAotICBSR0JZKDB4QzQpLCBSR0JZKDB4QzUpLCBSR0JZKDB4QzYpLCBSR0JZKDB4QzcpLAotICBSR0JZKDB4QzgpLCBSR0JZKDB4QzkpLCBSR0JZKDB4Q0EpLCBSR0JZKDB4Q0IpLAotICBSR0JZKDB4Q0MpLCBSR0JZKDB4Q0QpLCBSR0JZKDB4Q0UpLCBSR0JZKDB4Q0YpLAotICBSR0JZKDB4RDApLCBSR0JZKDB4RDEpLCBSR0JZKDB4RDIpLCBSR0JZKDB4RDMpLAotICBSR0JZKDB4RDQpLCBSR0JZKDB4RDUpLCBSR0JZKDB4RDYpLCBSR0JZKDB4RDcpLAotICBSR0JZKDB4RDgpLCBSR0JZKDB4RDkpLCBSR0JZKDB4REEpLCBSR0JZKDB4REIpLAotICBSR0JZKDB4REMpLCBSR0JZKDB4REQpLCBSR0JZKDB4REUpLCBSR0JZKDB4REYpLAotICBSR0JZKDB4RTApLCBSR0JZKDB4RTEpLCBSR0JZKDB4RTIpLCBSR0JZKDB4RTMpLAotICBSR0JZKDB4RTQpLCBSR0JZKDB4RTUpLCBSR0JZKDB4RTYpLCBSR0JZKDB4RTcpLAotICBSR0JZKDB4RTgpLCBSR0JZKDB4RTkpLCBSR0JZKDB4RUEpLCBSR0JZKDB4RUIpLAotICBSR0JZKDB4RUMpLCBSR0JZKDB4RUQpLCBSR0JZKDB4RUUpLCBSR0JZKDB4RUYpLAotICBSR0JZKDB4RjApLCBSR0JZKDB4RjEpLCBSR0JZKDB4RjIpLCBSR0JZKDB4RjMpLAotICBSR0JZKDB4RjQpLCBSR0JZKDB4RjUpLCBSR0JZKDB4RjYpLCBSR0JZKDB4RjcpLAotICBSR0JZKDB4RjgpLCBSR0JZKDB4RjkpLCBSR0JZKDB4RkEpLCBSR0JZKDB4RkIpLAotICBSR0JZKDB4RkMpLCBSR0JZKDB4RkQpLCBSR0JZKDB4RkUpLCBSR0JZKDB4RkYpLAotCi0gIC8vIENocm9tYSBVIHRhYmxlLgotICBSR0JVKDB4MDApLCBSR0JVKDB4MDEpLCBSR0JVKDB4MDIpLCBSR0JVKDB4MDMpLAotICBSR0JVKDB4MDQpLCBSR0JVKDB4MDUpLCBSR0JVKDB4MDYpLCBSR0JVKDB4MDcpLAotICBSR0JVKDB4MDgpLCBSR0JVKDB4MDkpLCBSR0JVKDB4MEEpLCBSR0JVKDB4MEIpLAotICBSR0JVKDB4MEMpLCBSR0JVKDB4MEQpLCBSR0JVKDB4MEUpLCBSR0JVKDB4MEYpLAotICBSR0JVKDB4MTApLCBSR0JVKDB4MTEpLCBSR0JVKDB4MTIpLCBSR0JVKDB4MTMpLAotICBSR0JVKDB4MTQpLCBSR0JVKDB4MTUpLCBSR0JVKDB4MTYpLCBSR0JVKDB4MTcpLAotICBSR0JVKDB4MTgpLCBSR0JVKDB4MTkpLCBSR0JVKDB4MUEpLCBSR0JVKDB4MUIpLAotICBSR0JVKDB4MUMpLCBSR0JVKDB4MUQpLCBSR0JVKDB4MUUpLCBSR0JVKDB4MUYpLAotICBSR0JVKDB4MjApLCBSR0JVKDB4MjEpLCBSR0JVKDB4MjIpLCBSR0JVKDB4MjMpLAotICBSR0JVKDB4MjQpLCBSR0JVKDB4MjUpLCBSR0JVKDB4MjYpLCBSR0JVKDB4MjcpLAotICBSR0JVKDB4MjgpLCBSR0JVKDB4MjkpLCBSR0JVKDB4MkEpLCBSR0JVKDB4MkIpLAotICBSR0JVKDB4MkMpLCBSR0JVKDB4MkQpLCBSR0JVKDB4MkUpLCBSR0JVKDB4MkYpLAotICBSR0JVKDB4MzApLCBSR0JVKDB4MzEpLCBSR0JVKDB4MzIpLCBSR0JVKDB4MzMpLAotICBSR0JVKDB4MzQpLCBSR0JVKDB4MzUpLCBSR0JVKDB4MzYpLCBSR0JVKDB4MzcpLAotICBSR0JVKDB4MzgpLCBSR0JVKDB4MzkpLCBSR0JVKDB4M0EpLCBSR0JVKDB4M0IpLAotICBSR0JVKDB4M0MpLCBSR0JVKDB4M0QpLCBSR0JVKDB4M0UpLCBSR0JVKDB4M0YpLAotICBSR0JVKDB4NDApLCBSR0JVKDB4NDEpLCBSR0JVKDB4NDIpLCBSR0JVKDB4NDMpLAotICBSR0JVKDB4NDQpLCBSR0JVKDB4NDUpLCBSR0JVKDB4NDYpLCBSR0JVKDB4NDcpLAotICBSR0JVKDB4NDgpLCBSR0JVKDB4NDkpLCBSR0JVKDB4NEEpLCBSR0JVKDB4NEIpLAotICBSR0JVKDB4NEMpLCBSR0JVKDB4NEQpLCBSR0JVKDB4NEUpLCBSR0JVKDB4NEYpLAotICBSR0JVKDB4NTApLCBSR0JVKDB4NTEpLCBSR0JVKDB4NTIpLCBSR0JVKDB4NTMpLAotICBSR0JVKDB4NTQpLCBSR0JVKDB4NTUpLCBSR0JVKDB4NTYpLCBSR0JVKDB4NTcpLAotICBSR0JVKDB4NTgpLCBSR0JVKDB4NTkpLCBSR0JVKDB4NUEpLCBSR0JVKDB4NUIpLAotICBSR0JVKDB4NUMpLCBSR0JVKDB4NUQpLCBSR0JVKDB4NUUpLCBSR0JVKDB4NUYpLAotICBSR0JVKDB4NjApLCBSR0JVKDB4NjEpLCBSR0JVKDB4NjIpLCBSR0JVKDB4NjMpLAotICBSR0JVKDB4NjQpLCBSR0JVKDB4NjUpLCBSR0JVKDB4NjYpLCBSR0JVKDB4NjcpLAotICBSR0JVKDB4NjgpLCBSR0JVKDB4NjkpLCBSR0JVKDB4NkEpLCBSR0JVKDB4NkIpLAotICBSR0JVKDB4NkMpLCBSR0JVKDB4NkQpLCBSR0JVKDB4NkUpLCBSR0JVKDB4NkYpLAotICBSR0JVKDB4NzApLCBSR0JVKDB4NzEpLCBSR0JVKDB4NzIpLCBSR0JVKDB4NzMpLAotICBSR0JVKDB4NzQpLCBSR0JVKDB4NzUpLCBSR0JVKDB4NzYpLCBSR0JVKDB4NzcpLAotICBSR0JVKDB4NzgpLCBSR0JVKDB4NzkpLCBSR0JVKDB4N0EpLCBSR0JVKDB4N0IpLAotICBSR0JVKDB4N0MpLCBSR0JVKDB4N0QpLCBSR0JVKDB4N0UpLCBSR0JVKDB4N0YpLAotICBSR0JVKDB4ODApLCBSR0JVKDB4ODEpLCBSR0JVKDB4ODIpLCBSR0JVKDB4ODMpLAotICBSR0JVKDB4ODQpLCBSR0JVKDB4ODUpLCBSR0JVKDB4ODYpLCBSR0JVKDB4ODcpLAotICBSR0JVKDB4ODgpLCBSR0JVKDB4ODkpLCBSR0JVKDB4OEEpLCBSR0JVKDB4OEIpLAotICBSR0JVKDB4OEMpLCBSR0JVKDB4OEQpLCBSR0JVKDB4OEUpLCBSR0JVKDB4OEYpLAotICBSR0JVKDB4OTApLCBSR0JVKDB4OTEpLCBSR0JVKDB4OTIpLCBSR0JVKDB4OTMpLAotICBSR0JVKDB4OTQpLCBSR0JVKDB4OTUpLCBSR0JVKDB4OTYpLCBSR0JVKDB4OTcpLAotICBSR0JVKDB4OTgpLCBSR0JVKDB4OTkpLCBSR0JVKDB4OUEpLCBSR0JVKDB4OUIpLAotICBSR0JVKDB4OUMpLCBSR0JVKDB4OUQpLCBSR0JVKDB4OUUpLCBSR0JVKDB4OUYpLAotICBSR0JVKDB4QTApLCBSR0JVKDB4QTEpLCBSR0JVKDB4QTIpLCBSR0JVKDB4QTMpLAotICBSR0JVKDB4QTQpLCBSR0JVKDB4QTUpLCBSR0JVKDB4QTYpLCBSR0JVKDB4QTcpLAotICBSR0JVKDB4QTgpLCBSR0JVKDB4QTkpLCBSR0JVKDB4QUEpLCBSR0JVKDB4QUIpLAotICBSR0JVKDB4QUMpLCBSR0JVKDB4QUQpLCBSR0JVKDB4QUUpLCBSR0JVKDB4QUYpLAotICBSR0JVKDB4QjApLCBSR0JVKDB4QjEpLCBSR0JVKDB4QjIpLCBSR0JVKDB4QjMpLAotICBSR0JVKDB4QjQpLCBSR0JVKDB4QjUpLCBSR0JVKDB4QjYpLCBSR0JVKDB4QjcpLAotICBSR0JVKDB4QjgpLCBSR0JVKDB4QjkpLCBSR0JVKDB4QkEpLCBSR0JVKDB4QkIpLAotICBSR0JVKDB4QkMpLCBSR0JVKDB4QkQpLCBSR0JVKDB4QkUpLCBSR0JVKDB4QkYpLAotICBSR0JVKDB4QzApLCBSR0JVKDB4QzEpLCBSR0JVKDB4QzIpLCBSR0JVKDB4QzMpLAotICBSR0JVKDB4QzQpLCBSR0JVKDB4QzUpLCBSR0JVKDB4QzYpLCBSR0JVKDB4QzcpLAotICBSR0JVKDB4QzgpLCBSR0JVKDB4QzkpLCBSR0JVKDB4Q0EpLCBSR0JVKDB4Q0IpLAotICBSR0JVKDB4Q0MpLCBSR0JVKDB4Q0QpLCBSR0JVKDB4Q0UpLCBSR0JVKDB4Q0YpLAotICBSR0JVKDB4RDApLCBSR0JVKDB4RDEpLCBSR0JVKDB4RDIpLCBSR0JVKDB4RDMpLAotICBSR0JVKDB4RDQpLCBSR0JVKDB4RDUpLCBSR0JVKDB4RDYpLCBSR0JVKDB4RDcpLAotICBSR0JVKDB4RDgpLCBSR0JVKDB4RDkpLCBSR0JVKDB4REEpLCBSR0JVKDB4REIpLAotICBSR0JVKDB4REMpLCBSR0JVKDB4REQpLCBSR0JVKDB4REUpLCBSR0JVKDB4REYpLAotICBSR0JVKDB4RTApLCBSR0JVKDB4RTEpLCBSR0JVKDB4RTIpLCBSR0JVKDB4RTMpLAotICBSR0JVKDB4RTQpLCBSR0JVKDB4RTUpLCBSR0JVKDB4RTYpLCBSR0JVKDB4RTcpLAotICBSR0JVKDB4RTgpLCBSR0JVKDB4RTkpLCBSR0JVKDB4RUEpLCBSR0JVKDB4RUIpLAotICBSR0JVKDB4RUMpLCBSR0JVKDB4RUQpLCBSR0JVKDB4RUUpLCBSR0JVKDB4RUYpLAotICBSR0JVKDB4RjApLCBSR0JVKDB4RjEpLCBSR0JVKDB4RjIpLCBSR0JVKDB4RjMpLAotICBSR0JVKDB4RjQpLCBSR0JVKDB4RjUpLCBSR0JVKDB4RjYpLCBSR0JVKDB4RjcpLAotICBSR0JVKDB4RjgpLCBSR0JVKDB4RjkpLCBSR0JVKDB4RkEpLCBSR0JVKDB4RkIpLAotICBSR0JVKDB4RkMpLCBSR0JVKDB4RkQpLCBSR0JVKDB4RkUpLCBSR0JVKDB4RkYpLAotCi0gIC8vIENocm9tYSBWIHRhYmxlLgotICBSR0JWKDB4MDApLCBSR0JWKDB4MDEpLCBSR0JWKDB4MDIpLCBSR0JWKDB4MDMpLAotICBSR0JWKDB4MDQpLCBSR0JWKDB4MDUpLCBSR0JWKDB4MDYpLCBSR0JWKDB4MDcpLAotICBSR0JWKDB4MDgpLCBSR0JWKDB4MDkpLCBSR0JWKDB4MEEpLCBSR0JWKDB4MEIpLAotICBSR0JWKDB4MEMpLCBSR0JWKDB4MEQpLCBSR0JWKDB4MEUpLCBSR0JWKDB4MEYpLAotICBSR0JWKDB4MTApLCBSR0JWKDB4MTEpLCBSR0JWKDB4MTIpLCBSR0JWKDB4MTMpLAotICBSR0JWKDB4MTQpLCBSR0JWKDB4MTUpLCBSR0JWKDB4MTYpLCBSR0JWKDB4MTcpLAotICBSR0JWKDB4MTgpLCBSR0JWKDB4MTkpLCBSR0JWKDB4MUEpLCBSR0JWKDB4MUIpLAotICBSR0JWKDB4MUMpLCBSR0JWKDB4MUQpLCBSR0JWKDB4MUUpLCBSR0JWKDB4MUYpLAotICBSR0JWKDB4MjApLCBSR0JWKDB4MjEpLCBSR0JWKDB4MjIpLCBSR0JWKDB4MjMpLAotICBSR0JWKDB4MjQpLCBSR0JWKDB4MjUpLCBSR0JWKDB4MjYpLCBSR0JWKDB4MjcpLAotICBSR0JWKDB4MjgpLCBSR0JWKDB4MjkpLCBSR0JWKDB4MkEpLCBSR0JWKDB4MkIpLAotICBSR0JWKDB4MkMpLCBSR0JWKDB4MkQpLCBSR0JWKDB4MkUpLCBSR0JWKDB4MkYpLAotICBSR0JWKDB4MzApLCBSR0JWKDB4MzEpLCBSR0JWKDB4MzIpLCBSR0JWKDB4MzMpLAotICBSR0JWKDB4MzQpLCBSR0JWKDB4MzUpLCBSR0JWKDB4MzYpLCBSR0JWKDB4MzcpLAotICBSR0JWKDB4MzgpLCBSR0JWKDB4MzkpLCBSR0JWKDB4M0EpLCBSR0JWKDB4M0IpLAotICBSR0JWKDB4M0MpLCBSR0JWKDB4M0QpLCBSR0JWKDB4M0UpLCBSR0JWKDB4M0YpLAotICBSR0JWKDB4NDApLCBSR0JWKDB4NDEpLCBSR0JWKDB4NDIpLCBSR0JWKDB4NDMpLAotICBSR0JWKDB4NDQpLCBSR0JWKDB4NDUpLCBSR0JWKDB4NDYpLCBSR0JWKDB4NDcpLAotICBSR0JWKDB4NDgpLCBSR0JWKDB4NDkpLCBSR0JWKDB4NEEpLCBSR0JWKDB4NEIpLAotICBSR0JWKDB4NEMpLCBSR0JWKDB4NEQpLCBSR0JWKDB4NEUpLCBSR0JWKDB4NEYpLAotICBSR0JWKDB4NTApLCBSR0JWKDB4NTEpLCBSR0JWKDB4NTIpLCBSR0JWKDB4NTMpLAotICBSR0JWKDB4NTQpLCBSR0JWKDB4NTUpLCBSR0JWKDB4NTYpLCBSR0JWKDB4NTcpLAotICBSR0JWKDB4NTgpLCBSR0JWKDB4NTkpLCBSR0JWKDB4NUEpLCBSR0JWKDB4NUIpLAotICBSR0JWKDB4NUMpLCBSR0JWKDB4NUQpLCBSR0JWKDB4NUUpLCBSR0JWKDB4NUYpLAotICBSR0JWKDB4NjApLCBSR0JWKDB4NjEpLCBSR0JWKDB4NjIpLCBSR0JWKDB4NjMpLAotICBSR0JWKDB4NjQpLCBSR0JWKDB4NjUpLCBSR0JWKDB4NjYpLCBSR0JWKDB4NjcpLAotICBSR0JWKDB4NjgpLCBSR0JWKDB4NjkpLCBSR0JWKDB4NkEpLCBSR0JWKDB4NkIpLAotICBSR0JWKDB4NkMpLCBSR0JWKDB4NkQpLCBSR0JWKDB4NkUpLCBSR0JWKDB4NkYpLAotICBSR0JWKDB4NzApLCBSR0JWKDB4NzEpLCBSR0JWKDB4NzIpLCBSR0JWKDB4NzMpLAotICBSR0JWKDB4NzQpLCBSR0JWKDB4NzUpLCBSR0JWKDB4NzYpLCBSR0JWKDB4NzcpLAotICBSR0JWKDB4NzgpLCBSR0JWKDB4NzkpLCBSR0JWKDB4N0EpLCBSR0JWKDB4N0IpLAotICBSR0JWKDB4N0MpLCBSR0JWKDB4N0QpLCBSR0JWKDB4N0UpLCBSR0JWKDB4N0YpLAotICBSR0JWKDB4ODApLCBSR0JWKDB4ODEpLCBSR0JWKDB4ODIpLCBSR0JWKDB4ODMpLAotICBSR0JWKDB4ODQpLCBSR0JWKDB4ODUpLCBSR0JWKDB4ODYpLCBSR0JWKDB4ODcpLAotICBSR0JWKDB4ODgpLCBSR0JWKDB4ODkpLCBSR0JWKDB4OEEpLCBSR0JWKDB4OEIpLAotICBSR0JWKDB4OEMpLCBSR0JWKDB4OEQpLCBSR0JWKDB4OEUpLCBSR0JWKDB4OEYpLAotICBSR0JWKDB4OTApLCBSR0JWKDB4OTEpLCBSR0JWKDB4OTIpLCBSR0JWKDB4OTMpLAotICBSR0JWKDB4OTQpLCBSR0JWKDB4OTUpLCBSR0JWKDB4OTYpLCBSR0JWKDB4OTcpLAotICBSR0JWKDB4OTgpLCBSR0JWKDB4OTkpLCBSR0JWKDB4OUEpLCBSR0JWKDB4OUIpLAotICBSR0JWKDB4OUMpLCBSR0JWKDB4OUQpLCBSR0JWKDB4OUUpLCBSR0JWKDB4OUYpLAotICBSR0JWKDB4QTApLCBSR0JWKDB4QTEpLCBSR0JWKDB4QTIpLCBSR0JWKDB4QTMpLAotICBSR0JWKDB4QTQpLCBSR0JWKDB4QTUpLCBSR0JWKDB4QTYpLCBSR0JWKDB4QTcpLAotICBSR0JWKDB4QTgpLCBSR0JWKDB4QTkpLCBSR0JWKDB4QUEpLCBSR0JWKDB4QUIpLAotICBSR0JWKDB4QUMpLCBSR0JWKDB4QUQpLCBSR0JWKDB4QUUpLCBSR0JWKDB4QUYpLAotICBSR0JWKDB4QjApLCBSR0JWKDB4QjEpLCBSR0JWKDB4QjIpLCBSR0JWKDB4QjMpLAotICBSR0JWKDB4QjQpLCBSR0JWKDB4QjUpLCBSR0JWKDB4QjYpLCBSR0JWKDB4QjcpLAotICBSR0JWKDB4QjgpLCBSR0JWKDB4QjkpLCBSR0JWKDB4QkEpLCBSR0JWKDB4QkIpLAotICBSR0JWKDB4QkMpLCBSR0JWKDB4QkQpLCBSR0JWKDB4QkUpLCBSR0JWKDB4QkYpLAotICBSR0JWKDB4QzApLCBSR0JWKDB4QzEpLCBSR0JWKDB4QzIpLCBSR0JWKDB4QzMpLAotICBSR0JWKDB4QzQpLCBSR0JWKDB4QzUpLCBSR0JWKDB4QzYpLCBSR0JWKDB4QzcpLAotICBSR0JWKDB4QzgpLCBSR0JWKDB4QzkpLCBSR0JWKDB4Q0EpLCBSR0JWKDB4Q0IpLAotICBSR0JWKDB4Q0MpLCBSR0JWKDB4Q0QpLCBSR0JWKDB4Q0UpLCBSR0JWKDB4Q0YpLAotICBSR0JWKDB4RDApLCBSR0JWKDB4RDEpLCBSR0JWKDB4RDIpLCBSR0JWKDB4RDMpLAotICBSR0JWKDB4RDQpLCBSR0JWKDB4RDUpLCBSR0JWKDB4RDYpLCBSR0JWKDB4RDcpLAotICBSR0JWKDB4RDgpLCBSR0JWKDB4RDkpLCBSR0JWKDB4REEpLCBSR0JWKDB4REIpLAotICBSR0JWKDB4REMpLCBSR0JWKDB4REQpLCBSR0JWKDB4REUpLCBSR0JWKDB4REYpLAotICBSR0JWKDB4RTApLCBSR0JWKDB4RTEpLCBSR0JWKDB4RTIpLCBSR0JWKDB4RTMpLAotICBSR0JWKDB4RTQpLCBSR0JWKDB4RTUpLCBSR0JWKDB4RTYpLCBSR0JWKDB4RTcpLAotICBSR0JWKDB4RTgpLCBSR0JWKDB4RTkpLCBSR0JWKDB4RUEpLCBSR0JWKDB4RUIpLAotICBSR0JWKDB4RUMpLCBSR0JWKDB4RUQpLCBSR0JWKDB4RUUpLCBSR0JWKDB4RUYpLAotICBSR0JWKDB4RjApLCBSR0JWKDB4RjEpLCBSR0JWKDB4RjIpLCBSR0JWKDB4RjMpLAotICBSR0JWKDB4RjQpLCBSR0JWKDB4RjUpLCBSR0JWKDB4RjYpLCBSR0JWKDB4RjcpLAotICBSR0JWKDB4RjgpLCBSR0JWKDB4RjkpLCBSR0JWKDB4RkEpLCBSR0JWKDB4RkIpLAotICBSR0JWKDB4RkMpLCBSR0JWKDB4RkQpLCBSR0JWKDB4RkUpLCBSR0JWKDB4RkYpLAotfTsKLQotI3VuZGVmIFJHQlkKLSN1bmRlZiBSR0JVCi0jdW5kZWYgUkdCVgotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9zaW1kL3l1dl90b19yZ2JfdGFibGUuaCBiL3NyYy9tZWRpYS9iYXNlL3NpbWQveXV2X3RvX3JnYl90YWJsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzQzYTdhLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3NpbWQveXV2X3RvX3JnYl90YWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDExIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gRGVmaW5lcyBjb252ZXJ0aW9uIHRhYmxlIGZyb20gWVVWIHRvIFJHQi4KLQotI2lmbmRlZiBNRURJQV9CQVNFX1NJTURfWVVWX1RPX1JHQl9UQUJMRV9IXwotI2RlZmluZSBNRURJQV9CQVNFX1NJTURfWVVWX1RPX1JHQl9UQUJMRV9IXwotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYnVpbGQvYnVpbGRfY29uZmlnLmgiCi0KLWV4dGVybiAiQyIgewotCi0jaWYgZGVmaW5lZChDT01QSUxFUl9NU1ZDKQotI2RlZmluZSBTSU1EX0FMSUdORUQodmFyKSBfX2RlY2xzcGVjKGFsaWduKDE2KSkgdmFyCi0jZWxzZQotI2RlZmluZSBTSU1EX0FMSUdORUQodmFyKSB2YXIgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKQotI2VuZGlmCi0KLS8vIEFsaWduIHRoZSB0YWJsZSB0byAxNi1ieXRlcyB0byBhbGxvdyBmYXN0ZXIgcmVhZGluZy4KLWV4dGVybiBTSU1EX0FMSUdORUQoaW50MTYga0NvZWZmaWNpZW50c1JnYllbNzY4XVs0XSk7Ci0KLX0gIC8vIGV4dGVybiAiQyIKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX1NJTURfWVVWX1RPX1JHQl9UQUJMRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2Uvc2luY19yZXNhbXBsZXIuY2MgYi9zcmMvbWVkaWEvYmFzZS9zaW5jX3Jlc2FtcGxlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEwNGExYy4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9zaW5jX3Jlc2FtcGxlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotLy8KLS8vIElucHV0IGJ1ZmZlciBsYXlvdXQsIGRpdmlkaW5nIHRoZSB0b3RhbCBidWZmZXIgaW50byByZWdpb25zIChyMF8gLSByNV8pOgotLy8KLS8vIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18Ci0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtCbG9ja1NpemUgKyBrS2VybmVsU2l6ZSAvIDIKLS8vICAgICAgICAgICAgICAgICAgIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMF8KLS8vCi0vLyAga0tlcm5lbFNpemUgLyAyICAga0tlcm5lbFNpemUgLyAyICAgICAgICAga0tlcm5lbFNpemUgLyAyICAga0tlcm5lbFNpemUgLyAyCi0vLyA8LS0tLS0tLS0tLS0tLS0tPiA8LS0tLS0tLS0tLS0tLS0tPiAgICAgICA8LS0tLS0tLS0tLS0tLS0tPiA8LS0tLS0tLS0tLS0tLS0tPgotLy8gICAgICAgIHIxXyAgICAgICAgICAgICAgIHIyXyAgICAgICAgICAgICAgICAgICAgIHIzXyAgICAgICAgICAgICAgIHI0XwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQmxvY2tTaXplCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHI1XwotLy8KLS8vIFRoZSBhbGdvcml0aG06Ci0vLwotLy8gMSkgQ29uc3VtZSBpbnB1dCBmcmFtZXMgaW50byByMF8gKHIxXyBpcyB6ZXJvLWluaXRpYWxpemVkKS4KLS8vIDIpIFBvc2l0aW9uIGtlcm5lbCBjZW50ZXJlZCBhdCBzdGFydCBvZiByMF8gKHIyXykgYW5kIGdlbmVyYXRlIG91dHB1dCBmcmFtZXMKLS8vICAgIHVudGlsIGtlcm5lbCBpcyBjZW50ZXJlZCBhdCBzdGFydCBvZiByNF8gb3Igd2UndmUgZmluaXNoZWQgZ2VuZXJhdGluZyBhbGwKLS8vICAgIHRoZSBvdXRwdXQgZnJhbWVzLgotLy8gMykgQ29weSByM18gdG8gcjFfIGFuZCByNF8gdG8gcjJfLgotLy8gNCkgQ29uc3VtZSBpbnB1dCBmcmFtZXMgaW50byByNV8gKHplcm8tcGFkIGlmIHdlIHJ1biBvdXQgb2YgaW5wdXQpLgotLy8gNSkgR290byAoMikgdW50aWwgYWxsIG9mIGlucHV0IGlzIGNvbnN1bWVkLgotLy8KLS8vIE5vdGU6IHdlJ3JlIGdsb3NzaW5nIG92ZXIgaG93IHRoZSBzdWItc2FtcGxlIGhhbmRsaW5nIHdvcmtzIHdpdGgKLS8vIHx2aXJ0dWFsX3NvdXJjZV9pZHhffCwgZXRjLgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaW5jX3Jlc2FtcGxlci5oIgotCi0jaW5jbHVkZSA8Y21hdGg+Ci0KLSNpbmNsdWRlICJiYXNlL2NwdS5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJ1aWxkL2J1aWxkX2NvbmZpZy5oIgotCi0jaWYgZGVmaW5lZChBUkNIX0NQVV9YODZfRkFNSUxZKSAmJiBkZWZpbmVkKF9fU1NFX18pCi0jaW5jbHVkZSA8eG1taW50cmluLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQVJDSF9DUFVfQVJNX0ZBTUlMWSkgJiYgZGVmaW5lZChVU0VfTkVPTikKLSNpbmNsdWRlIDxhcm1fbmVvbi5oPgotI2VuZGlmCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWVudW0gewotICAvLyBUaGUga2VybmVsIHNpemUgY2FuIGJlIGFkanVzdGVkIGZvciBxdWFsaXR5IChoaWdoZXIgaXMgYmV0dGVyKSBhdCB0aGUKLSAgLy8gZXhwZW5zZSBvZiBwZXJmb3JtYW5jZS4gIE11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi4KLSAgLy8gVE9ETyhkYWxlY3VydGlzKTogVGVzdCBwZXJmb3JtYW5jZSB0byBzZWUgaWYgd2UgY2FuIGphY2sgdGhpcyB1cCB0byA2NCsuCi0gIGtLZXJuZWxTaXplID0gMzIsCi0KLSAgLy8gVGhlIG51bWJlciBvZiBkZXN0aW5hdGlvbiBmcmFtZXMgZ2VuZXJhdGVkIHBlciBwcm9jZXNzaW5nIHBhc3MuICBBZmZlY3RzCi0gIC8vIGhvdyBvZnRlbiBhbmQgZm9yIGhvdyBtdWNoIFNpbmNSZXNhbXBsZXIgY2FsbHMgYmFjayBmb3IgaW5wdXQuICBNdXN0IGJlCi0gIC8vIGdyZWF0ZXIgdGhhbiBrS2VybmVsU2l6ZS4KLSAga0Jsb2NrU2l6ZSA9IDUxMiwKLQotICAvLyBUaGUga2VybmVsIG9mZnNldCBjb3VudCBpcyB1c2VkIGZvciBpbnRlcnBvbGF0aW9uIGFuZCBpcyB0aGUgbnVtYmVyIG9mCi0gIC8vIHN1Yi1zYW1wbGUga2VybmVsIHNoaWZ0cy4gIENhbiBiZSBhZGp1c3RlZCBmb3IgcXVhbGl0eSAoaGlnaGVyIGlzIGJldHRlcikKLSAgLy8gYXQgdGhlIGV4cGVuc2Ugb2YgYWxsb2NhdGluZyBtb3JlIG1lbW9yeS4KLSAga0tlcm5lbE9mZnNldENvdW50ID0gMzIsCi0gIGtLZXJuZWxTdG9yYWdlU2l6ZSA9IGtLZXJuZWxTaXplICogKGtLZXJuZWxPZmZzZXRDb3VudCArIDEpLAotCi0gIC8vIFRoZSBzaXplIChpbiBzYW1wbGVzKSBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyIHVzZWQgYnkgdGhlIHJlc2FtcGxlci4KLSAga0J1ZmZlclNpemUgPSBrQmxvY2tTaXplICsga0tlcm5lbFNpemUKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1jb25zdCBpbnQgU2luY1Jlc2FtcGxlcjo6a01heGltdW1Mb29rQWhlYWRTaXplID0ga0J1ZmZlclNpemU7Ci0KLVNpbmNSZXNhbXBsZXI6OlNpbmNSZXNhbXBsZXIoZG91YmxlIGlvX3NhbXBsZV9yYXRlX3JhdGlvLCBjb25zdCBSZWFkQ0ImIHJlYWRfY2IpCi0gICAgOiBpb19zYW1wbGVfcmF0ZV9yYXRpb18oaW9fc2FtcGxlX3JhdGVfcmF0aW8pLAotICAgICAgdmlydHVhbF9zb3VyY2VfaWR4XygwKSwKLSAgICAgIGJ1ZmZlcl9wcmltZWRfKGZhbHNlKSwKLSAgICAgIHJlYWRfY2JfKHJlYWRfY2IpLAotICAgICAgLy8gQ3JlYXRlIGlucHV0IGJ1ZmZlcnMgd2l0aCBhIDE2LWJ5dGUgYWxpZ25tZW50IGZvciBTU0Ugb3B0aW1pemF0aW9ucy4KLSAgICAgIGtlcm5lbF9zdG9yYWdlXyhzdGF0aWNfY2FzdDxmbG9hdCo+KAotICAgICAgICAgIGJhc2U6OkFsaWduZWRBbGxvYyhzaXplb2YoZmxvYXQpICoga0tlcm5lbFN0b3JhZ2VTaXplLCAxNikpKSwKLSAgICAgIGlucHV0X2J1ZmZlcl8oc3RhdGljX2Nhc3Q8ZmxvYXQqPigKLSAgICAgICAgICBiYXNlOjpBbGlnbmVkQWxsb2Moc2l6ZW9mKGZsb2F0KSAqIGtCdWZmZXJTaXplLCAxNikpKSwKLSAgICAgIC8vIFNldHVwIHZhcmlvdXMgcmVnaW9uIHBvaW50ZXJzIGluIHRoZSBidWZmZXIgKHNlZSBkaWFncmFtIGFib3ZlKS4KLSAgICAgIHIwXyhpbnB1dF9idWZmZXJfLmdldCgpICsga0tlcm5lbFNpemUgLyAyKSwKLSAgICAgIHIxXyhpbnB1dF9idWZmZXJfLmdldCgpKSwKLSAgICAgIHIyXyhyMF8pLAotICAgICAgcjNfKHIwXyArIGtCbG9ja1NpemUgLSBrS2VybmVsU2l6ZSAvIDIpLAotICAgICAgcjRfKHIwXyArIGtCbG9ja1NpemUpLAotICAgICAgcjVfKHIwXyArIGtLZXJuZWxTaXplIC8gMikgewotICAvLyBFbnN1cmUga0tlcm5lbFNpemUgaXMgYSBtdWx0aXBsZSBvZiAzMiBmb3IgZWFzeSBTU0Ugb3B0aW1pemF0aW9uczsgY2F1c2VzCi0gIC8vIHIwXyBhbmQgcjVfICh1c2VkIGZvciBpbnB1dCkgdG8gYWx3YXlzIGJlIDE2LWJ5dGUgYWxpZ25lZCBieSB2aXJ0dWUgb2YKLSAgLy8gaW5wdXRfYnVmZmVyXyBiZWluZyAxNi1ieXRlIGFsaWduZWQuCi0gIERDSEVDS19FUShrS2VybmVsU2l6ZSAlIDMyLCAwKSA8PCAia0tlcm5lbFNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyISI7Ci0gIERDSEVDS19HVChrQmxvY2tTaXplLCBrS2VybmVsU2l6ZSkKLSAgICAgIDw8ICJrQmxvY2tTaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIGtLZXJuZWxTaXplISI7Ci0gIC8vIEJhc2ljIHNhbml0eSBjaGVja3MgdG8gZW5zdXJlIGJ1ZmZlciByZWdpb25zIGFyZSBsYWlkIG91dCBjb3JyZWN0bHk6Ci0gIC8vIHIwXyBhbmQgcjJfIHNob3VsZCBhbHdheXMgYmUgdGhlIHNhbWUgcG9zaXRpb24uCi0gIERDSEVDS19FUShyMF8sIHIyXyk7Ci0gIC8vIHIxXyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIuCi0gIERDSEVDS19FUShyMV8sIGlucHV0X2J1ZmZlcl8uZ2V0KCkpOwotICAvLyByMV8gbGVmdCBvZiByMl8sIHIyXyBsZWZ0IG9mIHI1XyBhbmQgcjFfLCByMl8gc2l6ZSBjb3JyZWN0LgotICBEQ0hFQ0tfRVEocjJfIC0gcjFfLCByNV8gLSByMl8pOwotICAvLyByM18gbGVmdCBvZiByNF8sIHI1XyBsZWZ0IG9mIHIwXyBhbmQgcjNfIHNpemUgY29ycmVjdC4KLSAgRENIRUNLX0VRKHI0XyAtIHIzXywgcjVfIC0gcjBfKTsKLSAgLy8gcjNfLCByNF8gc2l6ZSBjb3JyZWN0IGFuZCByNF8gYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgotICBEQ0hFQ0tfRVEocjRfICsgKHI0XyAtIHIzXyksIHIxXyArIGtCdWZmZXJTaXplKTsKLSAgLy8gcjVfIHNpemUgY29ycmVjdCBhbmQgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgotICBEQ0hFQ0tfRVEocjVfICsga0Jsb2NrU2l6ZSwgcjFfICsga0J1ZmZlclNpemUpOwotCi0gIG1lbXNldChrZXJuZWxfc3RvcmFnZV8uZ2V0KCksIDAsCi0gICAgICAgICBzaXplb2YoKmtlcm5lbF9zdG9yYWdlXy5nZXQoKSkgKiBrS2VybmVsU3RvcmFnZVNpemUpOwotICBtZW1zZXQoaW5wdXRfYnVmZmVyXy5nZXQoKSwgMCwgc2l6ZW9mKCppbnB1dF9idWZmZXJfLmdldCgpKSAqIGtCdWZmZXJTaXplKTsKLQotICBJbml0aWFsaXplS2VybmVsKCk7Ci19Ci0KLVNpbmNSZXNhbXBsZXI6On5TaW5jUmVzYW1wbGVyKCkge30KLQotdm9pZCBTaW5jUmVzYW1wbGVyOjpJbml0aWFsaXplS2VybmVsKCkgewotICAvLyBCbGFja21hbiB3aW5kb3cgcGFyYW1ldGVycy4KLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBrQWxwaGEgPSAwLjE2OwotICBzdGF0aWMgY29uc3QgZG91YmxlIGtBMCA9IDAuNSAqICgxLjAgLSBrQWxwaGEpOwotICBzdGF0aWMgY29uc3QgZG91YmxlIGtBMSA9IDAuNTsKLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBrQTIgPSAwLjUgKiBrQWxwaGE7Ci0KLSAgLy8gfHNpbmNfc2NhbGVfZmFjdG9yfCBpcyBiYXNpY2FsbHkgdGhlIG5vcm1hbGl6ZWQgY3V0b2ZmIGZyZXF1ZW5jeSBvZiB0aGUKLSAgLy8gbG93LXBhc3MgZmlsdGVyLgotICBkb3VibGUgc2luY19zY2FsZV9mYWN0b3IgPQotICAgICAgaW9fc2FtcGxlX3JhdGVfcmF0aW9fID4gMS4wID8gMS4wIC8gaW9fc2FtcGxlX3JhdGVfcmF0aW9fIDogMS4wOwotCi0gIC8vIFRoZSBzaW5jIGZ1bmN0aW9uIGlzIGFuIGlkZWFsaXplZCBicmljay13YWxsIGZpbHRlciwgYnV0IHNpbmNlIHdlJ3JlCi0gIC8vIHdpbmRvd2luZyBpdCB0aGUgdHJhbnNpdGlvbiBmcm9tIHBhc3MgdG8gc3RvcCBkb2VzIG5vdCBoYXBwZW4gcmlnaHQgYXdheS4KLSAgLy8gU28gd2Ugc2hvdWxkIGFkanVzdCB0aGUgbG93IHBhc3MgZmlsdGVyIGN1dG9mZiBzbGlnaHRseSBkb3dud2FyZCB0byBhdm9pZAotICAvLyBzb21lIGFsaWFzaW5nIGF0IHRoZSB2ZXJ5IGhpZ2gtZW5kLgotICAvLyBUT0RPKGNyb2dlcnMpOiB0aGlzIHZhbHVlIGlzIGVtcGlyaWNhbCBhbmQgdG8gYmUgbW9yZSBleGFjdCBzaG91bGQgdmFyeQotICAvLyBkZXBlbmRpbmcgb24ga0tlcm5lbFNpemUuCi0gIHNpbmNfc2NhbGVfZmFjdG9yICo9IDAuOTsKLQotICAvLyBHZW5lcmF0ZXMgYSBzZXQgb2Ygd2luZG93ZWQgc2luYygpIGtlcm5lbHMuCi0gIC8vIFdlIGdlbmVyYXRlIGEgcmFuZ2Ugb2Ygc3ViLXNhbXBsZSBvZmZzZXRzIGZyb20gMC4wIHRvIDEuMC4KLSAgZm9yIChpbnQgb2Zmc2V0X2lkeCA9IDA7IG9mZnNldF9pZHggPD0ga0tlcm5lbE9mZnNldENvdW50OyArK29mZnNldF9pZHgpIHsKLSAgICBkb3VibGUgc3Vic2FtcGxlX29mZnNldCA9Ci0gICAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4ob2Zmc2V0X2lkeCkgLyBrS2VybmVsT2Zmc2V0Q291bnQ7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGtLZXJuZWxTaXplOyArK2kpIHsKLSAgICAgIC8vIENvbXB1dGUgdGhlIHNpbmMgd2l0aCBvZmZzZXQuCi0gICAgICBkb3VibGUgcyA9Ci0gICAgICAgICAgc2luY19zY2FsZV9mYWN0b3IgKiBNX1BJICogKGkgLSBrS2VybmVsU2l6ZSAvIDIgLSBzdWJzYW1wbGVfb2Zmc2V0KTsKLSAgICAgIGRvdWJsZSBzaW5jID0gKCFzID8gMS4wIDogc2luKHMpIC8gcykgKiBzaW5jX3NjYWxlX2ZhY3RvcjsKLQotICAgICAgLy8gQ29tcHV0ZSBCbGFja21hbiB3aW5kb3csIG1hdGNoaW5nIHRoZSBvZmZzZXQgb2YgdGhlIHNpbmMoKS4KLSAgICAgIGRvdWJsZSB4ID0gKGkgLSBzdWJzYW1wbGVfb2Zmc2V0KSAvIGtLZXJuZWxTaXplOwotICAgICAgZG91YmxlIHdpbmRvdyA9IGtBMCAtIGtBMSAqIGNvcygyLjAgKiBNX1BJICogeCkgKyBrQTIKLSAgICAgICAgICAqIGNvcyg0LjAgKiBNX1BJICogeCk7Ci0KLSAgICAgIC8vIFdpbmRvdyB0aGUgc2luYygpIGZ1bmN0aW9uIGFuZCBzdG9yZSBhdCB0aGUgY29ycmVjdCBvZmZzZXQuCi0gICAgICBrZXJuZWxfc3RvcmFnZV8uZ2V0KClbaSArIG9mZnNldF9pZHggKiBrS2VybmVsU2l6ZV0gPSBzaW5jICogd2luZG93OwotICAgIH0KLSAgfQotfQotCi12b2lkIFNpbmNSZXNhbXBsZXI6OlJlc2FtcGxlKGZsb2F0KiBkZXN0aW5hdGlvbiwgaW50IGZyYW1lcykgewotICBpbnQgcmVtYWluaW5nX2ZyYW1lcyA9IGZyYW1lczsKLQotICAvLyBTdGVwICgxKSAtLSBQcmltZSB0aGUgaW5wdXQgYnVmZmVyIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgc3RyZWFtLgotICBpZiAoIWJ1ZmZlcl9wcmltZWRfKSB7Ci0gICAgcmVhZF9jYl8uUnVuKHIwXywga0Jsb2NrU2l6ZSArIGtLZXJuZWxTaXplIC8gMik7Ci0gICAgYnVmZmVyX3ByaW1lZF8gPSB0cnVlOwotICB9Ci0KLSAgLy8gU3RlcCAoMikgLS0gUmVzYW1wbGUhCi0gIHdoaWxlIChyZW1haW5pbmdfZnJhbWVzKSB7Ci0gICAgd2hpbGUgKHZpcnR1YWxfc291cmNlX2lkeF8gPCBrQmxvY2tTaXplKSB7Ci0gICAgICAvLyB8dmlydHVhbF9zb3VyY2VfaWR4X3wgbGllcyBpbiBiZXR3ZWVuIHR3byBrZXJuZWwgb2Zmc2V0cyBzbyBmaWd1cmUgb3V0Ci0gICAgICAvLyB3aGF0IHRoZXkgYXJlLgotICAgICAgaW50IHNvdXJjZV9pZHggPSBzdGF0aWNfY2FzdDxpbnQ+KHZpcnR1YWxfc291cmNlX2lkeF8pOwotICAgICAgZG91YmxlIHN1YnNhbXBsZV9yZW1haW5kZXIgPSB2aXJ0dWFsX3NvdXJjZV9pZHhfIC0gc291cmNlX2lkeDsKLQotICAgICAgZG91YmxlIHZpcnR1YWxfb2Zmc2V0X2lkeCA9IHN1YnNhbXBsZV9yZW1haW5kZXIgKiBrS2VybmVsT2Zmc2V0Q291bnQ7Ci0gICAgICBpbnQgb2Zmc2V0X2lkeCA9IHN0YXRpY19jYXN0PGludD4odmlydHVhbF9vZmZzZXRfaWR4KTsKLQotICAgICAgLy8gV2UnbGwgY29tcHV0ZSAiY29udm9sdXRpb25zIiBmb3IgdGhlIHR3byBrZXJuZWxzIHdoaWNoIHN0cmFkZGxlCi0gICAgICAvLyB8dmlydHVhbF9zb3VyY2VfaWR4X3wuCi0gICAgICBmbG9hdCogazEgPSBrZXJuZWxfc3RvcmFnZV8uZ2V0KCkgKyBvZmZzZXRfaWR4ICoga0tlcm5lbFNpemU7Ci0gICAgICBmbG9hdCogazIgPSBrMSArIGtLZXJuZWxTaXplOwotCi0gICAgICAvLyBJbml0aWFsaXplIGlucHV0IHBvaW50ZXIgYmFzZWQgb24gcXVhbnRpemVkIHx2aXJ0dWFsX3NvdXJjZV9pZHhffC4KLSAgICAgIGZsb2F0KiBpbnB1dF9wdHIgPSByMV8gKyBzb3VyY2VfaWR4OwotCi0gICAgICAvLyBGaWd1cmUgb3V0IGhvdyBtdWNoIHRvIHdlaWdodCBlYWNoIGtlcm5lbCdzICJjb252b2x1dGlvbiIuCi0gICAgICBkb3VibGUga2VybmVsX2ludGVycG9sYXRpb25fZmFjdG9yID0gdmlydHVhbF9vZmZzZXRfaWR4IC0gb2Zmc2V0X2lkeDsKLSAgICAgICpkZXN0aW5hdGlvbisrID0gQ29udm9sdmUoCi0gICAgICAgICAgaW5wdXRfcHRyLCBrMSwgazIsIGtlcm5lbF9pbnRlcnBvbGF0aW9uX2ZhY3Rvcik7Ci0KLSAgICAgIC8vIEFkdmFuY2UgdGhlIHZpcnR1YWwgaW5kZXguCi0gICAgICB2aXJ0dWFsX3NvdXJjZV9pZHhfICs9IGlvX3NhbXBsZV9yYXRlX3JhdGlvXzsKLQotICAgICAgaWYgKCEtLXJlbWFpbmluZ19mcmFtZXMpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBXcmFwIGJhY2sgYXJvdW5kIHRvIHRoZSBzdGFydC4KLSAgICB2aXJ0dWFsX3NvdXJjZV9pZHhfIC09IGtCbG9ja1NpemU7Ci0KLSAgICAvLyBTdGVwICgzKSBDb3B5IHIzXyB0byByMV8gYW5kIHI0XyB0byByMl8uCi0gICAgLy8gVGhpcyB3cmFwcyB0aGUgbGFzdCBpbnB1dCBmcmFtZXMgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlci4KLSAgICBtZW1jcHkocjFfLCByM18sIHNpemVvZigqaW5wdXRfYnVmZmVyXy5nZXQoKSkgKiAoa0tlcm5lbFNpemUgLyAyKSk7Ci0gICAgbWVtY3B5KHIyXywgcjRfLCBzaXplb2YoKmlucHV0X2J1ZmZlcl8uZ2V0KCkpICogKGtLZXJuZWxTaXplIC8gMikpOwotCi0gICAgLy8gU3RlcCAoNCkKLSAgICAvLyBSZWZyZXNoIHRoZSBidWZmZXIgd2l0aCBtb3JlIGlucHV0LgotICAgIHJlYWRfY2JfLlJ1bihyNV8sIGtCbG9ja1NpemUpOwotICB9Ci19Ci0KLWludCBTaW5jUmVzYW1wbGVyOjpDaHVua1NpemUoKSB7Ci0gIHJldHVybiBrQmxvY2tTaXplIC8gaW9fc2FtcGxlX3JhdGVfcmF0aW9fOwotfQotCi12b2lkIFNpbmNSZXNhbXBsZXI6OkZsdXNoKCkgewotICB2aXJ0dWFsX3NvdXJjZV9pZHhfID0gMDsKLSAgYnVmZmVyX3ByaW1lZF8gPSBmYWxzZTsKLSAgbWVtc2V0KGlucHV0X2J1ZmZlcl8uZ2V0KCksIDAsIHNpemVvZigqaW5wdXRfYnVmZmVyXy5nZXQoKSkgKiBrQnVmZmVyU2l6ZSk7Ci19Ci0KLWZsb2F0IFNpbmNSZXNhbXBsZXI6OkNvbnZvbHZlKGNvbnN0IGZsb2F0KiBpbnB1dF9wdHIsIGNvbnN0IGZsb2F0KiBrMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBrMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBrZXJuZWxfaW50ZXJwb2xhdGlvbl9mYWN0b3IpIHsKLSAgLy8gUmVseSBvbiBmdW5jdGlvbiBsZXZlbCBzdGF0aWMgaW5pdGlhbGl6YXRpb24gdG8ga2VlcCBDb252b2x2ZVByb2Mgc2VsZWN0aW9uCi0gIC8vIHRocmVhZCBzYWZlLgotICB0eXBlZGVmIGZsb2F0ICgqQ29udm9sdmVQcm9jKShjb25zdCBmbG9hdCogc3JjLCBjb25zdCBmbG9hdCogazEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBrMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGtlcm5lbF9pbnRlcnBvbGF0aW9uX2ZhY3Rvcik7Ci0jaWYgZGVmaW5lZChBUkNIX0NQVV9YODZfRkFNSUxZKSAmJiBkZWZpbmVkKF9fU1NFX18pCi0gIHN0YXRpYyBjb25zdCBDb252b2x2ZVByb2Mga0NvbnZvbHZlUHJvYyA9Ci0gICAgICBiYXNlOjpDUFUoKS5oYXNfc3NlKCkgPyBDb252b2x2ZV9TU0UgOiBDb252b2x2ZV9DOwotI2VsaWYgZGVmaW5lZChBUkNIX0NQVV9BUk1fRkFNSUxZKSAmJiBkZWZpbmVkKFVTRV9ORU9OKQotICBzdGF0aWMgY29uc3QgQ29udm9sdmVQcm9jIGtDb252b2x2ZVByb2MgPSBDb252b2x2ZV9ORU9OOwotI2Vsc2UKLSAgc3RhdGljIGNvbnN0IENvbnZvbHZlUHJvYyBrQ29udm9sdmVQcm9jID0gQ29udm9sdmVfQzsKLSNlbmRpZgotCi0gIHJldHVybiBrQ29udm9sdmVQcm9jKGlucHV0X3B0ciwgazEsIGsyLCBrZXJuZWxfaW50ZXJwb2xhdGlvbl9mYWN0b3IpOwotfQotCi1mbG9hdCBTaW5jUmVzYW1wbGVyOjpDb252b2x2ZV9DKGNvbnN0IGZsb2F0KiBpbnB1dF9wdHIsIGNvbnN0IGZsb2F0KiBrMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGsyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUga2VybmVsX2ludGVycG9sYXRpb25fZmFjdG9yKSB7Ci0gIGZsb2F0IHN1bTEgPSAwOwotICBmbG9hdCBzdW0yID0gMDsKLQotICAvLyBHZW5lcmF0ZSBhIHNpbmdsZSBvdXRwdXQgc2FtcGxlLiAgVW5yb2xsaW5nIHRoaXMgbG9vcCBodXJ0IHBlcmZvcm1hbmNlIGluCi0gIC8vIGxvY2FsIHRlc3RpbmcuCi0gIGludCBuID0ga0tlcm5lbFNpemU7Ci0gIHdoaWxlIChuLS0pIHsKLSAgICBzdW0xICs9ICppbnB1dF9wdHIgKiAqazErKzsKLSAgICBzdW0yICs9ICppbnB1dF9wdHIrKyAqICprMisrOwotICB9Ci0KLSAgLy8gTGluZWFybHkgaW50ZXJwb2xhdGUgdGhlIHR3byAiY29udm9sdXRpb25zIi4KLSAgcmV0dXJuICgxLjAgLSBrZXJuZWxfaW50ZXJwb2xhdGlvbl9mYWN0b3IpICogc3VtMQotICAgICAgKyBrZXJuZWxfaW50ZXJwb2xhdGlvbl9mYWN0b3IgKiBzdW0yOwotfQotCi0jaWYgZGVmaW5lZChBUkNIX0NQVV9YODZfRkFNSUxZKSAmJiBkZWZpbmVkKF9fU1NFX18pCi1mbG9hdCBTaW5jUmVzYW1wbGVyOjpDb252b2x2ZV9TU0UoY29uc3QgZmxvYXQqIGlucHV0X3B0ciwgY29uc3QgZmxvYXQqIGsxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBrMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUga2VybmVsX2ludGVycG9sYXRpb25fZmFjdG9yKSB7Ci0gIC8vIEVuc3VyZSB8azF8LCB8azJ8IGFyZSAxNi1ieXRlIGFsaWduZWQgZm9yIFNTRSB1c2FnZS4gIFNob3VsZCBhbHdheXMgYmUgdHJ1ZQotICAvLyBzbyBsb25nIGFzIGtLZXJuZWxTaXplIGlzIGEgbXVsdGlwbGUgb2YgMTYuCi0gIERDSEVDS19FUSgwdSwgcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGsxKSAmIDB4MEYpOwotICBEQ0hFQ0tfRVEoMHUsIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihrMikgJiAweDBGKTsKLQotICBfX20xMjggbV9pbnB1dDsKLSAgX19tMTI4IG1fc3VtczEgPSBfbW1fc2V0emVyb19wcygpOwotICBfX20xMjggbV9zdW1zMiA9IF9tbV9zZXR6ZXJvX3BzKCk7Ci0KLSAgLy8gQmFzZWQgb24gfGlucHV0X3B0cnwgYWxpZ25tZW50LCB3ZSBuZWVkIHRvIHVzZSBsb2FkdSBvciBsb2FkLiAgVW5yb2xsaW5nCi0gIC8vIHRoZXNlIGxvb3BzIGh1cnQgcGVyZm9ybWFuY2UgaW4gbG9jYWwgdGVzdGluZy4KLSAgaWYgKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihpbnB1dF9wdHIpICYgMHgwRikgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0tlcm5lbFNpemU7IGkgKz0gNCkgewotICAgICAgbV9pbnB1dCA9IF9tbV9sb2FkdV9wcyhpbnB1dF9wdHIgKyBpKTsKLSAgICAgIG1fc3VtczEgPSBfbW1fYWRkX3BzKG1fc3VtczEsIF9tbV9tdWxfcHMobV9pbnB1dCwgX21tX2xvYWRfcHMoazEgKyBpKSkpOwotICAgICAgbV9zdW1zMiA9IF9tbV9hZGRfcHMobV9zdW1zMiwgX21tX211bF9wcyhtX2lucHV0LCBfbW1fbG9hZF9wcyhrMiArIGkpKSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0tlcm5lbFNpemU7IGkgKz0gNCkgewotICAgICAgbV9pbnB1dCA9IF9tbV9sb2FkX3BzKGlucHV0X3B0ciArIGkpOwotICAgICAgbV9zdW1zMSA9IF9tbV9hZGRfcHMobV9zdW1zMSwgX21tX211bF9wcyhtX2lucHV0LCBfbW1fbG9hZF9wcyhrMSArIGkpKSk7Ci0gICAgICBtX3N1bXMyID0gX21tX2FkZF9wcyhtX3N1bXMyLCBfbW1fbXVsX3BzKG1faW5wdXQsIF9tbV9sb2FkX3BzKGsyICsgaSkpKTsKLSAgICB9Ci0gIH0KLQotICAvLyBMaW5lYXJseSBpbnRlcnBvbGF0ZSB0aGUgdHdvICJjb252b2x1dGlvbnMiLgotICBtX3N1bXMxID0gX21tX211bF9wcyhtX3N1bXMxLCBfbW1fc2V0X3BzMSgxLjAgLSBrZXJuZWxfaW50ZXJwb2xhdGlvbl9mYWN0b3IpKTsKLSAgbV9zdW1zMiA9IF9tbV9tdWxfcHMobV9zdW1zMiwgX21tX3NldF9wczEoa2VybmVsX2ludGVycG9sYXRpb25fZmFjdG9yKSk7Ci0gIG1fc3VtczEgPSBfbW1fYWRkX3BzKG1fc3VtczEsIG1fc3VtczIpOwotCi0gIC8vIFN1bSBjb21wb25lbnRzIHRvZ2V0aGVyLgotICBmbG9hdCByZXN1bHQ7Ci0gIG1fc3VtczIgPSBfbW1fYWRkX3BzKF9tbV9tb3ZlaGxfcHMobV9zdW1zMSwgbV9zdW1zMSksIG1fc3VtczEpOwotICBfbW1fc3RvcmVfc3MoJnJlc3VsdCwgX21tX2FkZF9zcyhtX3N1bXMyLCBfbW1fc2h1ZmZsZV9wcygKLSAgICAgIG1fc3VtczIsIG1fc3VtczIsIDEpKSk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChBUkNIX0NQVV9BUk1fRkFNSUxZKSAmJiBkZWZpbmVkKFVTRV9ORU9OKQotZmxvYXQgU2luY1Jlc2FtcGxlcjo6Q29udm9sdmVfTkVPTihjb25zdCBmbG9hdCogaW5wdXRfcHRyLCBjb25zdCBmbG9hdCogazEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBrMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGtlcm5lbF9pbnRlcnBvbGF0aW9uX2ZhY3RvcikgewotICBmbG9hdDMyeDRfdCBtX2lucHV0OwotICBmbG9hdDMyeDRfdCBtX3N1bXMxID0gdm1vdnFfbl9mMzIoMCk7Ci0gIGZsb2F0MzJ4NF90IG1fc3VtczIgPSB2bW92cV9uX2YzMigwKTsKLQotICBjb25zdCBmbG9hdCogdXBwZXIgPSBpbnB1dF9wdHIgKyBrS2VybmVsU2l6ZTsKLSAgZm9yICg7IGlucHV0X3B0ciA8IHVwcGVyOyApIHsKLSAgICBtX2lucHV0ID0gdmxkMXFfZjMyKGlucHV0X3B0cik7Ci0gICAgaW5wdXRfcHRyICs9IDQ7Ci0gICAgbV9zdW1zMSA9IHZtbGFxX2YzMihtX3N1bXMxLCBtX2lucHV0LCB2bGQxcV9mMzIoazEpKTsKLSAgICBrMSArPSA0OwotICAgIG1fc3VtczIgPSB2bWxhcV9mMzIobV9zdW1zMiwgbV9pbnB1dCwgdmxkMXFfZjMyKGsyKSk7Ci0gICAgazIgKz0gNDsKLSAgfQotCi0gIC8vIExpbmVhcmx5IGludGVycG9sYXRlIHRoZSB0d28gImNvbnZvbHV0aW9ucyIuCi0gIG1fc3VtczEgPSB2bWxhcV9mMzIoCi0gICAgICB2bXVscV9mMzIobV9zdW1zMSwgdm1vdnFfbl9mMzIoMS4wIC0ga2VybmVsX2ludGVycG9sYXRpb25fZmFjdG9yKSksCi0gICAgICBtX3N1bXMyLCB2bW92cV9uX2YzMihrZXJuZWxfaW50ZXJwb2xhdGlvbl9mYWN0b3IpKTsKLQotICAvLyBTdW0gY29tcG9uZW50cyB0b2dldGhlci4KLSAgZmxvYXQzMngyX3QgbV9oYWxmID0gdmFkZF9mMzIodmdldF9oaWdoX2YzMihtX3N1bXMxKSwgdmdldF9sb3dfZjMyKG1fc3VtczEpKTsKLSAgcmV0dXJuIHZnZXRfbGFuZV9mMzIodnBhZGRfZjMyKG1faGFsZiwgbV9oYWxmKSwgMCk7Ci19Ci0jZW5kaWYKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9zaW5jX3Jlc2FtcGxlci5oIGIvc3JjL21lZGlhL2Jhc2Uvc2luY19yZXNhbXBsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFkM2NmNy4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9zaW5jX3Jlc2FtcGxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfQkFTRV9TSU5DX1JFU0FNUExFUl9IXwotI2RlZmluZSBNRURJQV9CQVNFX1NJTkNfUkVTQU1QTEVSX0hfCi0KLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiYmFzZS9ndGVzdF9wcm9kX3V0aWwuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9hbGlnbmVkX21lbW9yeS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBTaW5jUmVzYW1wbGVyIGlzIGEgaGlnaC1xdWFsaXR5IHNpbmdsZS1jaGFubmVsIHNhbXBsZS1yYXRlIGNvbnZlcnRlci4KLWNsYXNzIE1FRElBX0VYUE9SVCBTaW5jUmVzYW1wbGVyIHsKLSBwdWJsaWM6Ci0gIC8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzYW1wbGVzIHRoYXQgbWF5IGJlIHJlcXVlc3RlZCBmcm9tIHRoZSBjYWxsYmFjayBhaGVhZAotICAvLyBvZiB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgc3RyZWFtLgotICBzdGF0aWMgY29uc3QgaW50IGtNYXhpbXVtTG9va0FoZWFkU2l6ZTsKLQotICAvLyBDYWxsYmFjayB0eXBlIGZvciBwcm92aWRpbmcgbW9yZSBkYXRhIGludG8gdGhlIHJlc2FtcGxlci4gIEV4cGVjdHMgfGZyYW1lc3wKLSAgLy8gb2YgZGF0YSB0byBiZSByZW5kZXJlZCBpbnRvIHxkZXN0aW5hdGlvbnw7IHplcm8gcGFkZGVkIGlmIG5vdCBlbm91Z2ggZnJhbWVzCi0gIC8vIGFyZSBhdmFpbGFibGUgdG8gc2F0aXNmeSB0aGUgcmVxdWVzdC4KLSAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKGZsb2F0KiBkZXN0aW5hdGlvbiwgaW50IGZyYW1lcyk+IFJlYWRDQjsKLQotICAvLyBDb25zdHJ1Y3RzIGEgU2luY1Jlc2FtcGxlciB3aXRoIHRoZSBzcGVjaWZpZWQgfHJlYWRfY2J8LCB3aGljaCBpcyB1c2VkIHRvCi0gIC8vIGFjcXVpcmUgYXVkaW8gZGF0YSBmb3IgcmVzYW1wbGluZy4gIHxpb19zYW1wbGVfcmF0ZV9yYXRpb3wgaXMgdGhlIHJhdGlvIG9mCi0gIC8vIGlucHV0IC8gb3V0cHV0IHNhbXBsZSByYXRlcy4KLSAgU2luY1Jlc2FtcGxlcihkb3VibGUgaW9fc2FtcGxlX3JhdGVfcmF0aW8sIGNvbnN0IFJlYWRDQiYgcmVhZF9jYik7Ci0gIHZpcnR1YWwgflNpbmNSZXNhbXBsZXIoKTsKLQotICAvLyBSZXNhbXBsZSB8ZnJhbWVzfCBvZiBkYXRhIGZyb20gfHJlYWRfY2JffCBpbnRvIHxkZXN0aW5hdGlvbnwuCi0gIHZvaWQgUmVzYW1wbGUoZmxvYXQqIGRlc3RpbmF0aW9uLCBpbnQgZnJhbWVzKTsKLQotICAvLyBUaGUgbWF4aW11bSBzaXplIGluIGZyYW1lcyB0aGF0IGd1YXJhbnRlZXMgUmVzYW1wbGUoKSB3aWxsIG9ubHkgbWFrZSBhCi0gIC8vIHNpbmdsZSBjYWxsIHRvIHxyZWFkX2NiX3wgZm9yIG1vcmUgZGF0YS4KLSAgaW50IENodW5rU2l6ZSgpOwotCi0gIC8vIEZsdXNoIGFsbCBidWZmZXJlZCBkYXRhIGFuZCByZXNldCBpbnRlcm5hbCBpbmRpY2VzLgotICB2b2lkIEZsdXNoKCk7Ci0KLSBwcml2YXRlOgotICBGUklFTkRfVEVTVF9BTExfUFJFRklYRVMoU2luY1Jlc2FtcGxlclRlc3QsIENvbnZvbHZlKTsKLSAgRlJJRU5EX1RFU1RfQUxMX1BSRUZJWEVTKFNpbmNSZXNhbXBsZXJUZXN0LCBDb252b2x2ZUJlbmNobWFyayk7Ci0KLSAgdm9pZCBJbml0aWFsaXplS2VybmVsKCk7Ci0KLSAgLy8gQ29tcHV0ZSBjb252b2x1dGlvbiBvZiB8azF8IGFuZCB8azJ8IG92ZXIgfGlucHV0X3B0cnwsIHJlc3VsdGFudCBzdW1zIGFyZQotICAvLyBsaW5lYXJseSBpbnRlcnBvbGF0ZWQgdXNpbmcgfGtlcm5lbF9pbnRlcnBvbGF0aW9uX2ZhY3RvcnwuICBPbiB4ODYsIHRoZQotICAvLyB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGlzIGNob3NlbiBhdCBydW4gdGltZSBiYXNlZCBvbiBTU0Ugc3VwcG9ydC4gIE9uCi0gIC8vIEFSTSwgTkVPTiBzdXBwb3J0IGlzIGNob3NlbiBhdCBjb21waWxlIHRpbWUgYmFzZWQgb24gY29tcGlsYXRpb24gZmxhZ3MuCi0gIHN0YXRpYyBmbG9hdCBDb252b2x2ZShjb25zdCBmbG9hdCogaW5wdXRfcHRyLCBjb25zdCBmbG9hdCogazEsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogazIsIGRvdWJsZSBrZXJuZWxfaW50ZXJwb2xhdGlvbl9mYWN0b3IpOwotICBzdGF0aWMgZmxvYXQgQ29udm9sdmVfQyhjb25zdCBmbG9hdCogaW5wdXRfcHRyLCBjb25zdCBmbG9hdCogazEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBrMiwgZG91YmxlIGtlcm5lbF9pbnRlcnBvbGF0aW9uX2ZhY3Rvcik7Ci0gIHN0YXRpYyBmbG9hdCBDb252b2x2ZV9TU0UoY29uc3QgZmxvYXQqIGlucHV0X3B0ciwgY29uc3QgZmxvYXQqIGsxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBrMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUga2VybmVsX2ludGVycG9sYXRpb25fZmFjdG9yKTsKLSAgc3RhdGljIGZsb2F0IENvbnZvbHZlX05FT04oY29uc3QgZmxvYXQqIGlucHV0X3B0ciwgY29uc3QgZmxvYXQqIGsxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogazIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBrZXJuZWxfaW50ZXJwb2xhdGlvbl9mYWN0b3IpOwotCi0gIC8vIFRoZSByYXRpbyBvZiBpbnB1dCAvIG91dHB1dCBzYW1wbGUgcmF0ZXMuCi0gIGRvdWJsZSBpb19zYW1wbGVfcmF0ZV9yYXRpb187Ci0KLSAgLy8gQW4gaW5kZXggb24gdGhlIHNvdXJjZSBpbnB1dCBidWZmZXIgd2l0aCBzdWItc2FtcGxlIHByZWNpc2lvbi4gIEl0IG11c3QgYmUKLSAgLy8gZG91YmxlIHByZWNpc2lvbiB0byBhdm9pZCBkcmlmdC4KLSAgZG91YmxlIHZpcnR1YWxfc291cmNlX2lkeF87Ci0KLSAgLy8gVGhlIGJ1ZmZlciBpcyBwcmltZWQgb25jZSBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2YgcHJvY2Vzc2luZy4KLSAgYm9vbCBidWZmZXJfcHJpbWVkXzsKLQotICAvLyBTb3VyY2Ugb2YgZGF0YSBmb3IgcmVzYW1wbGluZy4KLSAgUmVhZENCIHJlYWRfY2JfOwotCi0gIC8vIENvbnRhaW5zIGtLZXJuZWxPZmZzZXRDb3VudCBrZXJuZWxzIGJhY2stdG8tYmFjaywgZWFjaCBvZiBzaXplIGtLZXJuZWxTaXplLgotICAvLyBUaGUga2VybmVsIG9mZnNldHMgYXJlIHN1Yi1zYW1wbGUgc2hpZnRzIG9mIGEgd2luZG93ZWQgc2luYyBzaGlmdGVkIGZyb20KLSAgLy8gMC4wIHRvIDEuMCBzYW1wbGUuCi0gIHNjb3BlZF9wdHJfbWFsbG9jPGZsb2F0LCBiYXNlOjpTY29wZWRQdHJBbGlnbmVkRnJlZT4ga2VybmVsX3N0b3JhZ2VfOwotCi0gIC8vIERhdGEgZnJvbSB0aGUgc291cmNlIGlzIGNvcGllZCBpbnRvIHRoaXMgYnVmZmVyIGZvciBlYWNoIHByb2Nlc3NpbmcgcGFzcy4KLSAgc2NvcGVkX3B0cl9tYWxsb2M8ZmxvYXQsIGJhc2U6OlNjb3BlZFB0ckFsaWduZWRGcmVlPiBpbnB1dF9idWZmZXJfOwotCi0gIC8vIFBvaW50ZXJzIHRvIHRoZSB2YXJpb3VzIHJlZ2lvbnMgaW5zaWRlIHxpbnB1dF9idWZmZXJffC4gIFNlZSB0aGUgZGlhZ3JhbSBhdAotICAvLyB0aGUgdG9wIG9mIHRoZSAuY2MgZmlsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgZmxvYXQqIGNvbnN0IHIwXzsKLSAgZmxvYXQqIGNvbnN0IHIxXzsKLSAgZmxvYXQqIGNvbnN0IHIyXzsKLSAgZmxvYXQqIGNvbnN0IHIzXzsKLSAgZmxvYXQqIGNvbnN0IHI0XzsKLSAgZmxvYXQqIGNvbnN0IHI1XzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU2luY1Jlc2FtcGxlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX1NJTkNfUkVTQU1QTEVSX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9zaW5jX3Jlc2FtcGxlcl91bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9iYXNlL3NpbmNfcmVzYW1wbGVyX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWE5ZjgxLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3NpbmNfcmVzYW1wbGVyX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDA1ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE1TVkMrKyByZXF1aXJlcyB0aGlzIHRvIGJlIHNldCBiZWZvcmUgYW55IG90aGVyIGluY2x1ZGVzIHRvIGdldCBNX1BJLgotI2RlZmluZSBfVVNFX01BVEhfREVGSU5FUwotCi0jaW5jbHVkZSA8Y21hdGg+Ci0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2JpbmRfaGVscGVycy5oIgotI2luY2x1ZGUgImJhc2UvY29tbWFuZF9saW5lLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS9zdHJpbmdfbnVtYmVyX2NvbnZlcnNpb25zLmgiCi0jaW5jbHVkZSAiYmFzZS9zdHJpbmdpemVfbWFjcm9zLmgiCi0jaW5jbHVkZSAiYmFzZS90aW1lLmgiCi0jaW5jbHVkZSAiYnVpbGQvYnVpbGRfY29uZmlnLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaW5jX3Jlc2FtcGxlci5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi11c2luZyB0ZXN0aW5nOjpfOwotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1zdGF0aWMgY29uc3QgZG91YmxlIGtTYW1wbGVSYXRlUmF0aW8gPSAxOTIwMDAuMCAvIDQ0MTAwLjA7Ci1zdGF0aWMgY29uc3QgZG91YmxlIGtLZXJuZWxJbnRlcnBvbGF0aW9uRmFjdG9yID0gMC41OwotCi0vLyBDb21tYW5kIGxpbmUgc3dpdGNoIGZvciBydW50aW1lIGFkanVzdG1lbnQgb2YgQ29udm9sdmVCZW5jaG1hcmsgaXRlcmF0aW9ucy4KLXN0YXRpYyBjb25zdCBjaGFyIGtDb252b2x2ZUl0ZXJhdGlvbnNbXSA9ICJjb252b2x2ZS1pdGVyYXRpb25zIjsKLQotLy8gSGVscGVyIGNsYXNzIHRvIGVuc3VyZSBDaHVua2VkUmVzYW1wbGUoKSBmdW5jdGlvbnMgcHJvcGVybHkuCi1jbGFzcyBNb2NrU291cmNlIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EMihQcm92aWRlSW5wdXQsIHZvaWQoZmxvYXQqIGRlc3RpbmF0aW9uLCBpbnQgZnJhbWVzKSk7Ci19OwotCi1BQ1RJT04oQ2xlYXJCdWZmZXIpIHsKLSAgbWVtc2V0KGFyZzAsIDAsIGFyZzEgKiBzaXplb2YoZmxvYXQpKTsKLX0KLQotQUNUSU9OKEZpbGxCdWZmZXIpIHsKLSAgLy8gVmFsdWUgY2hvc2VuIGFyYml0cmFyaWx5IHN1Y2ggdGhhdCBTaW5jUmVzYW1wbGVyIHJlc2FtcGxlcyBpdCB0byBzb21ldGhpbmcKLSAgLy8gZWFzaWx5IHJlcHJlc2VudGFibGUgb24gYWxsIHBsYXRmb3JtczsgZS5nLiwgdXNpbmcga1NhbXBsZVJhdGVSYXRpbyB0aGlzCi0gIC8vIGJlY29tZXMgMS44MTIxOS4KLSAgbWVtc2V0KGFyZzAsIDY0LCBhcmcxICogc2l6ZW9mKGZsb2F0KSk7Ci19Ci0KLS8vIFRlc3QgcmVxdWVzdGluZyBtdWx0aXBsZXMgb2YgQ2h1bmtTaXplKCkgZnJhbWVzIHJlc3VsdHMgaW4gdGhlIHByb3BlciBudW1iZXIKLS8vIG9mIGNhbGxiYWNrcy4KLVRFU1QoU2luY1Jlc2FtcGxlclRlc3QsIENodW5rZWRSZXNhbXBsZSkgewotICBNb2NrU291cmNlIG1vY2tfc291cmNlOwotCi0gIC8vIENob29zZSBhIGhpZ2ggcmF0aW8gb2YgaW5wdXQgdG8gb3V0cHV0IHNhbXBsZXMgd2hpY2ggd2lsbCByZXN1bHQgaW4gcXVpY2sKLSAgLy8gZXhoYXVzdGlvbiBvZiBTaW5jUmVzYW1wbGVyJ3MgaW50ZXJuYWwgYnVmZmVycy4KLSAgU2luY1Jlc2FtcGxlciByZXNhbXBsZXIoCi0gICAgICBrU2FtcGxlUmF0ZVJhdGlvLAotICAgICAgYmFzZTo6QmluZCgmTW9ja1NvdXJjZTo6UHJvdmlkZUlucHV0LCBiYXNlOjpVbnJldGFpbmVkKCZtb2NrX3NvdXJjZSkpKTsKLQotICBzdGF0aWMgY29uc3QgaW50IGtDaHVua3MgPSAyOwotICBpbnQgbWF4X2NodW5rX3NpemUgPSByZXNhbXBsZXIuQ2h1bmtTaXplKCkgKiBrQ2h1bmtzOwotICBzY29wZWRfYXJyYXk8ZmxvYXQ+IHJlc2FtcGxlZF9kZXN0aW5hdGlvbihuZXcgZmxvYXRbbWF4X2NodW5rX3NpemVdKTsKLQotICAvLyBWZXJpZnkgcmVxdWVzdGluZyBDaHVua1NpemUoKSBmcmFtZXMgY2F1c2VzIGEgc2luZ2xlIGNhbGxiYWNrLgotICBFWFBFQ1RfQ0FMTChtb2NrX3NvdXJjZSwgUHJvdmlkZUlucHV0KF8sIF8pKQotICAgICAgLlRpbWVzKDEpLldpbGxPbmNlKENsZWFyQnVmZmVyKCkpOwotICByZXNhbXBsZXIuUmVzYW1wbGUocmVzYW1wbGVkX2Rlc3RpbmF0aW9uLmdldCgpLCByZXNhbXBsZXIuQ2h1bmtTaXplKCkpOwotCi0gIC8vIFZlcmlmeSByZXF1ZXN0aW5nIGtDaHVua3MgKiBDaHVua1NpemUoKSBmcmFtZXMgY2F1c2VzIGtDaHVua3MgY2FsbGJhY2tzLgotICB0ZXN0aW5nOjpNb2NrOjpWZXJpZnlBbmRDbGVhcigmbW9ja19zb3VyY2UpOwotICBFWFBFQ1RfQ0FMTChtb2NrX3NvdXJjZSwgUHJvdmlkZUlucHV0KF8sIF8pKQotICAgICAgLlRpbWVzKGtDaHVua3MpLldpbGxSZXBlYXRlZGx5KENsZWFyQnVmZmVyKCkpOwotICByZXNhbXBsZXIuUmVzYW1wbGUocmVzYW1wbGVkX2Rlc3RpbmF0aW9uLmdldCgpLCBtYXhfY2h1bmtfc2l6ZSk7Ci19Ci0KLS8vIFRlc3QgZmx1c2ggcmVzZXRzIHRoZSBpbnRlcm5hbCBzdGF0ZSBwcm9wZXJseS4KLVRFU1QoU2luY1Jlc2FtcGxlclRlc3QsIEZsdXNoKSB7Ci0gIE1vY2tTb3VyY2UgbW9ja19zb3VyY2U7Ci0gIFNpbmNSZXNhbXBsZXIgcmVzYW1wbGVyKAotICAgICAga1NhbXBsZVJhdGVSYXRpbywKLSAgICAgIGJhc2U6OkJpbmQoJk1vY2tTb3VyY2U6OlByb3ZpZGVJbnB1dCwgYmFzZTo6VW5yZXRhaW5lZCgmbW9ja19zb3VyY2UpKSk7Ci0gIHNjb3BlZF9hcnJheTxmbG9hdD4gcmVzYW1wbGVkX2Rlc3RpbmF0aW9uKG5ldyBmbG9hdFtyZXNhbXBsZXIuQ2h1bmtTaXplKCldKTsKLQotICAvLyBGaWxsIHRoZSByZXNhbXBsZXIgd2l0aCBqdW5rIGRhdGEuCi0gIEVYUEVDVF9DQUxMKG1vY2tfc291cmNlLCBQcm92aWRlSW5wdXQoXywgXykpCi0gICAgICAuVGltZXMoMSkuV2lsbE9uY2UoRmlsbEJ1ZmZlcigpKTsKLSAgcmVzYW1wbGVyLlJlc2FtcGxlKHJlc2FtcGxlZF9kZXN0aW5hdGlvbi5nZXQoKSwgcmVzYW1wbGVyLkNodW5rU2l6ZSgpIC8gMik7Ci0gIEFTU0VSVF9ORShyZXNhbXBsZWRfZGVzdGluYXRpb25bMF0sIDApOwotCi0gIC8vIEZsdXNoIGFuZCByZXF1ZXN0IG1vcmUgZGF0YSwgd2hpY2ggc2hvdWxkIGFsbCBiZSB6ZXJvcyBub3cuCi0gIHJlc2FtcGxlci5GbHVzaCgpOwotICB0ZXN0aW5nOjpNb2NrOjpWZXJpZnlBbmRDbGVhcigmbW9ja19zb3VyY2UpOwotICBFWFBFQ1RfQ0FMTChtb2NrX3NvdXJjZSwgUHJvdmlkZUlucHV0KF8sIF8pKQotICAgICAgLlRpbWVzKDEpLldpbGxPbmNlKENsZWFyQnVmZmVyKCkpOwotICByZXNhbXBsZXIuUmVzYW1wbGUocmVzYW1wbGVkX2Rlc3RpbmF0aW9uLmdldCgpLCByZXNhbXBsZXIuQ2h1bmtTaXplKCkgLyAyKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNhbXBsZXIuQ2h1bmtTaXplKCkgLyAyOyArK2kpCi0gICAgQVNTRVJUX0ZMT0FUX0VRKHJlc2FtcGxlZF9kZXN0aW5hdGlvbltpXSwgMCk7Ci19Ci0KLS8vIERlZmluZSBwbGF0Zm9ybSBpbmRlcGVuZGVudCBmdW5jdGlvbiBuYW1lIGZvciBDb252b2x2ZSogdGVzdHMuCi0jaWYgZGVmaW5lZChBUkNIX0NQVV9YODZfRkFNSUxZKSAmJiBkZWZpbmVkKF9fU1NFX18pCi0jZGVmaW5lIENPTlZPTFZFX0ZVTkMgQ29udm9sdmVfU1NFCi0jZWxpZiBkZWZpbmVkKEFSQ0hfQ1BVX0FSTV9GQU1JTFkpICYmIGRlZmluZWQoVVNFX05FT04pCi0jZGVmaW5lIENPTlZPTFZFX0ZVTkMgQ29udm9sdmVfTkVPTgotI2VuZGlmCi0KLS8vIEVuc3VyZSB2YXJpb3VzIG9wdGltaXplZCBDb252b2x2ZSgpIG1ldGhvZHMgcmV0dXJuIHRoZSBzYW1lIHZhbHVlLiAgT25seSBydW4KLS8vIHRoaXMgdGVzdCBpZiBvdGhlciBvcHRpbWl6ZWQgbWV0aG9kcyBleGlzdCwgb3RoZXJ3aXNlIHRoZSBkZWZhdWx0IENvbnZvbHZlKCkKLS8vIHdpbGwgYmUgdGVzdGVkIGJ5IHRoZSBwYXJhbWV0ZXJpemVkIFNpbmNSZXNhbXBsZXIgdGVzdHMgYmVsb3cuCi0jaWYgZGVmaW5lZChDT05WT0xWRV9GVU5DKQotVEVTVChTaW5jUmVzYW1wbGVyVGVzdCwgQ29udm9sdmUpIHsKLSAgLy8gSW5pdGlhbGl6ZSBhIGR1bW15IHJlc2FtcGxlci4KLSAgTW9ja1NvdXJjZSBtb2NrX3NvdXJjZTsKLSAgU2luY1Jlc2FtcGxlciByZXNhbXBsZXIoCi0gICAgICBrU2FtcGxlUmF0ZVJhdGlvLAotICAgICAgYmFzZTo6QmluZCgmTW9ja1NvdXJjZTo6UHJvdmlkZUlucHV0LCBiYXNlOjpVbnJldGFpbmVkKCZtb2NrX3NvdXJjZSkpKTsKLQotICAvLyBUaGUgb3B0aW1pemVkIENvbnZvbHZlIG1ldGhvZHMgYXJlIHNsaWdodGx5IG1vcmUgcHJlY2lzZSB0aGFuIENvbnZvbHZlX0MoKSwKLSAgLy8gc28gY29tcGFyaXNvbiBtdXN0IGJlIGRvbmUgdXNpbmcgYW4gZXBzaWxvbi4KLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBrRXBzaWxvbiA9IDAuMDAwMDAwMDU7Ci0KLSAgLy8gVXNlIGEga2VybmVsIGZyb20gU2luY1Jlc2FtcGxlciBhcyBpbnB1dCBhbmQga2VybmVsIGRhdGEsIHRoaXMgaGFzIHRoZQotICAvLyBiZW5lZml0IG9mIGFscmVhZHkgYmVpbmcgcHJvcGVybHkgc2l6ZWQgYW5kIGFsaWduZWQgZm9yIENvbnZvbHZlX1NTRSgpLgotICBkb3VibGUgcmVzdWx0ID0gcmVzYW1wbGVyLkNvbnZvbHZlX0MoCi0gICAgICByZXNhbXBsZXIua2VybmVsX3N0b3JhZ2VfLmdldCgpLCByZXNhbXBsZXIua2VybmVsX3N0b3JhZ2VfLmdldCgpLAotICAgICAgcmVzYW1wbGVyLmtlcm5lbF9zdG9yYWdlXy5nZXQoKSwga0tlcm5lbEludGVycG9sYXRpb25GYWN0b3IpOwotICBkb3VibGUgcmVzdWx0MiA9IHJlc2FtcGxlci5DT05WT0xWRV9GVU5DKAotICAgICAgcmVzYW1wbGVyLmtlcm5lbF9zdG9yYWdlXy5nZXQoKSwgcmVzYW1wbGVyLmtlcm5lbF9zdG9yYWdlXy5nZXQoKSwKLSAgICAgIHJlc2FtcGxlci5rZXJuZWxfc3RvcmFnZV8uZ2V0KCksIGtLZXJuZWxJbnRlcnBvbGF0aW9uRmFjdG9yKTsKLSAgRVhQRUNUX05FQVIocmVzdWx0MiwgcmVzdWx0LCBrRXBzaWxvbik7Ci0KLSAgLy8gVGVzdCBDb252b2x2ZSgpIHcvIHVuYWxpZ25lZCBpbnB1dCBwb2ludGVyLgotICByZXN1bHQgPSByZXNhbXBsZXIuQ29udm9sdmVfQygKLSAgICAgIHJlc2FtcGxlci5rZXJuZWxfc3RvcmFnZV8uZ2V0KCkgKyAxLCByZXNhbXBsZXIua2VybmVsX3N0b3JhZ2VfLmdldCgpLAotICAgICAgcmVzYW1wbGVyLmtlcm5lbF9zdG9yYWdlXy5nZXQoKSwga0tlcm5lbEludGVycG9sYXRpb25GYWN0b3IpOwotICByZXN1bHQyID0gcmVzYW1wbGVyLkNPTlZPTFZFX0ZVTkMoCi0gICAgICByZXNhbXBsZXIua2VybmVsX3N0b3JhZ2VfLmdldCgpICsgMSwgcmVzYW1wbGVyLmtlcm5lbF9zdG9yYWdlXy5nZXQoKSwKLSAgICAgIHJlc2FtcGxlci5rZXJuZWxfc3RvcmFnZV8uZ2V0KCksIGtLZXJuZWxJbnRlcnBvbGF0aW9uRmFjdG9yKTsKLSAgRVhQRUNUX05FQVIocmVzdWx0MiwgcmVzdWx0LCBrRXBzaWxvbik7Ci19Ci0jZW5kaWYKLQotLy8gQmVuY2htYXJrIGZvciB0aGUgdmFyaW91cyBDb252b2x2ZSgpIG1ldGhvZHMuICBNYWtlIHN1cmUgdG8gYnVpbGQgd2l0aAotLy8gYnJhbmRpbmc9Q2hyb21lIHNvIHRoYXQgRENIRUNLcyBhcmUgY29tcGlsZWQgb3V0IHdoZW4gYmVuY2htYXJraW5nLiAgT3JpZ2luYWwKLS8vIGJlbmNobWFya3Mgd2VyZSBydW4gd2l0aCAtLWNvbnZvbHZlLWl0ZXJhdGlvbnM9NTAwMDAwMDAuCi1URVNUKFNpbmNSZXNhbXBsZXJUZXN0LCBDb252b2x2ZUJlbmNobWFyaykgewotICAvLyBJbml0aWFsaXplIGEgZHVtbXkgcmVzYW1wbGVyLgotICBNb2NrU291cmNlIG1vY2tfc291cmNlOwotICBTaW5jUmVzYW1wbGVyIHJlc2FtcGxlcigKLSAgICAgIGtTYW1wbGVSYXRlUmF0aW8sCi0gICAgICBiYXNlOjpCaW5kKCZNb2NrU291cmNlOjpQcm92aWRlSW5wdXQsIGJhc2U6OlVucmV0YWluZWQoJm1vY2tfc291cmNlKSkpOwotCi0gIC8vIFJldHJpZXZlIGJlbmNobWFyayBpdGVyYXRpb25zIGZyb20gY29tbWFuZCBsaW5lLgotICBpbnQgY29udm9sdmVfaXRlcmF0aW9ucyA9IDEwOwotICBzdGQ6OnN0cmluZyBpdGVyYXRpb25zKENvbW1hbmRMaW5lOjpGb3JDdXJyZW50UHJvY2VzcygpLT5HZXRTd2l0Y2hWYWx1ZUFTQ0lJKAotICAgICAga0NvbnZvbHZlSXRlcmF0aW9ucykpOwotICBpZiAoIWl0ZXJhdGlvbnMuZW1wdHkoKSkKLSAgICBiYXNlOjpTdHJpbmdUb0ludChpdGVyYXRpb25zLCAmY29udm9sdmVfaXRlcmF0aW9ucyk7Ci0KLSAgcHJpbnRmKCJCZW5jaG1hcmtpbmcgJWQgaXRlcmF0aW9uczpcbiIsIGNvbnZvbHZlX2l0ZXJhdGlvbnMpOwotCi0gIC8vIEJlbmNobWFyayBDb252b2x2ZV9DKCkuCi0gIGJhc2U6OlRpbWVUaWNrcyBzdGFydCA9IGJhc2U6OlRpbWVUaWNrczo6SGlnaFJlc05vdygpOwotICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnZvbHZlX2l0ZXJhdGlvbnM7ICsraSkgewotICAgIHJlc2FtcGxlci5Db252b2x2ZV9DKAotICAgICAgICByZXNhbXBsZXIua2VybmVsX3N0b3JhZ2VfLmdldCgpLCByZXNhbXBsZXIua2VybmVsX3N0b3JhZ2VfLmdldCgpLAotICAgICAgICByZXNhbXBsZXIua2VybmVsX3N0b3JhZ2VfLmdldCgpLCBrS2VybmVsSW50ZXJwb2xhdGlvbkZhY3Rvcik7Ci0gIH0KLSAgZG91YmxlIHRvdGFsX3RpbWVfY19tcyA9Ci0gICAgICAoYmFzZTo6VGltZVRpY2tzOjpIaWdoUmVzTm93KCkgLSBzdGFydCkuSW5NaWxsaXNlY29uZHNGKCk7Ci0gIHByaW50ZigiQ29udm9sdmVfQyB0b29rICUuMmZtcy5cbiIsIHRvdGFsX3RpbWVfY19tcyk7Ci0KLSNpZiBkZWZpbmVkKENPTlZPTFZFX0ZVTkMpCi0gIC8vIEJlbmNobWFyayB3aXRoIHVuYWxpZ25lZCBpbnB1dCBwb2ludGVyLgotICBzdGFydCA9IGJhc2U6OlRpbWVUaWNrczo6SGlnaFJlc05vdygpOwotICBmb3IgKGludCBqID0gMDsgaiA8IGNvbnZvbHZlX2l0ZXJhdGlvbnM7ICsraikgewotICAgIHJlc2FtcGxlci5DT05WT0xWRV9GVU5DKAotICAgICAgICByZXNhbXBsZXIua2VybmVsX3N0b3JhZ2VfLmdldCgpICsgMSwgcmVzYW1wbGVyLmtlcm5lbF9zdG9yYWdlXy5nZXQoKSwKLSAgICAgICAgcmVzYW1wbGVyLmtlcm5lbF9zdG9yYWdlXy5nZXQoKSwga0tlcm5lbEludGVycG9sYXRpb25GYWN0b3IpOwotICB9Ci0gIGRvdWJsZSB0b3RhbF90aW1lX29wdGltaXplZF91bmFsaWduZWRfbXMgPQotICAgICAgKGJhc2U6OlRpbWVUaWNrczo6SGlnaFJlc05vdygpIC0gc3RhcnQpLkluTWlsbGlzZWNvbmRzRigpOwotICBwcmludGYoU1RSSU5HSVpFKENPTlZPTFZFX0ZVTkMpICIodW5hbGlnbmVkKSB0b29rICUuMmZtczsgd2hpY2ggaXMgJS4yZnggIgotICAgICAgICAgImZhc3RlciB0aGFuIENvbnZvbHZlX0MuXG4iLCB0b3RhbF90aW1lX29wdGltaXplZF91bmFsaWduZWRfbXMsCi0gICAgICAgICB0b3RhbF90aW1lX2NfbXMgLyB0b3RhbF90aW1lX29wdGltaXplZF91bmFsaWduZWRfbXMpOwotCi0gIC8vIEJlbmNobWFyayB3aXRoIGFsaWduZWQgaW5wdXQgcG9pbnRlci4KLSAgc3RhcnQgPSBiYXNlOjpUaW1lVGlja3M6OkhpZ2hSZXNOb3coKTsKLSAgZm9yIChpbnQgaiA9IDA7IGogPCBjb252b2x2ZV9pdGVyYXRpb25zOyArK2opIHsKLSAgICByZXNhbXBsZXIuQ09OVk9MVkVfRlVOQygKLSAgICAgICAgcmVzYW1wbGVyLmtlcm5lbF9zdG9yYWdlXy5nZXQoKSwgcmVzYW1wbGVyLmtlcm5lbF9zdG9yYWdlXy5nZXQoKSwKLSAgICAgICAgcmVzYW1wbGVyLmtlcm5lbF9zdG9yYWdlXy5nZXQoKSwga0tlcm5lbEludGVycG9sYXRpb25GYWN0b3IpOwotICB9Ci0gIGRvdWJsZSB0b3RhbF90aW1lX29wdGltaXplZF9hbGlnbmVkX21zID0KLSAgICAgIChiYXNlOjpUaW1lVGlja3M6OkhpZ2hSZXNOb3coKSAtIHN0YXJ0KS5Jbk1pbGxpc2Vjb25kc0YoKTsKLSAgcHJpbnRmKFNUUklOR0laRShDT05WT0xWRV9GVU5DKSAiIChhbGlnbmVkKSB0b29rICUuMmZtczsgd2hpY2ggaXMgJS4yZnggIgotICAgICAgICAgImZhc3RlciB0aGFuIENvbnZvbHZlX0MgYW5kICUuMmZ4IGZhc3RlciB0aGFuICIKLSAgICAgICAgIFNUUklOR0laRShDT05WT0xWRV9GVU5DKSAiICh1bmFsaWduZWQpLlxuIiwKLSAgICAgICAgIHRvdGFsX3RpbWVfb3B0aW1pemVkX2FsaWduZWRfbXMsCi0gICAgICAgICB0b3RhbF90aW1lX2NfbXMgLyB0b3RhbF90aW1lX29wdGltaXplZF9hbGlnbmVkX21zLAotICAgICAgICAgdG90YWxfdGltZV9vcHRpbWl6ZWRfdW5hbGlnbmVkX21zIC8gdG90YWxfdGltZV9vcHRpbWl6ZWRfYWxpZ25lZF9tcyk7Ci0jZW5kaWYKLX0KLQotI3VuZGVmIENPTlZPTFZFX0ZVTkMKLQotLy8gRmFrZSBhdWRpbyBzb3VyY2UgZm9yIHRlc3RpbmcgdGhlIHJlc2FtcGxlci4gIEdlbmVyYXRlcyBhIHNpbnVzb2lkYWwgbGluZWFyCi0vLyBjaGlycCAoaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DaGlycCkgd2hpY2ggY2FuIGJlIHR1bmVkIHRvIHN0cmVzcyB0aGUKLS8vIHJlc2FtcGxlciBmb3IgdGhlIHNwZWNpZmljIHNhbXBsZSByYXRlIGNvbnZlcnNpb24gYmVpbmcgdXNlZC4KLWNsYXNzIFNpbnVzb2lkYWxMaW5lYXJDaGlycFNvdXJjZSB7Ci0gcHVibGljOgotICBTaW51c29pZGFsTGluZWFyQ2hpcnBTb3VyY2UoaW50IHNhbXBsZV9yYXRlLCBpbnQgc2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXhfZnJlcXVlbmN5KQotICAgICAgOiBzYW1wbGVfcmF0ZV8oc2FtcGxlX3JhdGUpLAotICAgICAgICB0b3RhbF9zYW1wbGVzXyhzYW1wbGVzKSwKLSAgICAgICAgbWF4X2ZyZXF1ZW5jeV8obWF4X2ZyZXF1ZW5jeSksCi0gICAgICAgIGN1cnJlbnRfaW5kZXhfKDApIHsKLSAgICAvLyBDaGlycCByYXRlLgotICAgIGRvdWJsZSBkdXJhdGlvbiA9IHN0YXRpY19jYXN0PGRvdWJsZT4odG90YWxfc2FtcGxlc18pIC8gc2FtcGxlX3JhdGVfOwotICAgIGtfID0gKG1heF9mcmVxdWVuY3lfIC0ga01pbkZyZXF1ZW5jeSkgLyBkdXJhdGlvbjsKLSAgfQotCi0gIHZpcnR1YWwgflNpbnVzb2lkYWxMaW5lYXJDaGlycFNvdXJjZSgpIHt9Ci0KLSAgdm9pZCBQcm92aWRlSW5wdXQoZmxvYXQqIGRlc3RpbmF0aW9uLCBpbnQgZnJhbWVzKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZXM7ICsraSwgKytjdXJyZW50X2luZGV4XykgewotICAgICAgLy8gRmlsdGVyIG91dCBmcmVxdWVuY2llcyBoaWdoZXIgdGhhbiBOeXF1aXN0LgotICAgICAgaWYgKEZyZXF1ZW5jeShjdXJyZW50X2luZGV4XykgPiAwLjUgKiBzYW1wbGVfcmF0ZV8pIHsKLSAgICAgICAgZGVzdGluYXRpb25baV0gPSAwOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQ2FsY3VsYXRlIHRpbWUgaW4gc2Vjb25kcy4KLSAgICAgICAgZG91YmxlIHQgPSBzdGF0aWNfY2FzdDxkb3VibGU+KGN1cnJlbnRfaW5kZXhfKSAvIHNhbXBsZV9yYXRlXzsKLQotICAgICAgICAvLyBTaW51c29pZGFsIGxpbmVhciBjaGlycC4KLSAgICAgICAgZGVzdGluYXRpb25baV0gPSBzaW4oMiAqIE1fUEkgKiAoa01pbkZyZXF1ZW5jeSAqIHQgKyAoa18gLyAyKSAqIHQgKiB0KSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZG91YmxlIEZyZXF1ZW5jeShpbnQgcG9zaXRpb24pIHsKLSAgICByZXR1cm4ga01pbkZyZXF1ZW5jeSArIHBvc2l0aW9uICogKG1heF9mcmVxdWVuY3lfIC0ga01pbkZyZXF1ZW5jeSkKLSAgICAgICAgLyB0b3RhbF9zYW1wbGVzXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgZW51bSB7Ci0gICAga01pbkZyZXF1ZW5jeSA9IDUKLSAgfTsKLQotICBkb3VibGUgc2FtcGxlX3JhdGVfOwotICBpbnQgdG90YWxfc2FtcGxlc187Ci0gIGRvdWJsZSBtYXhfZnJlcXVlbmN5XzsKLSAgZG91YmxlIGtfOwotICBpbnQgY3VycmVudF9pbmRleF87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNpbnVzb2lkYWxMaW5lYXJDaGlycFNvdXJjZSk7Ci19OwotCi10eXBlZGVmIHN0ZDo6dHIxOjp0dXBsZTxpbnQsIGludCwgZG91YmxlLCBkb3VibGU+IFNpbmNSZXNhbXBsZXJUZXN0RGF0YTsKLWNsYXNzIFNpbmNSZXNhbXBsZXJUZXN0Ci0gICAgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxTaW5jUmVzYW1wbGVyVGVzdERhdGE+IHsKLSBwdWJsaWM6Ci0gIFNpbmNSZXNhbXBsZXJUZXN0KCkKLSAgICAgIDogaW5wdXRfcmF0ZV8oc3RkOjp0cjE6OmdldDwwPihHZXRQYXJhbSgpKSksCi0gICAgICAgIG91dHB1dF9yYXRlXyhzdGQ6OnRyMTo6Z2V0PDE+KEdldFBhcmFtKCkpKSwKLSAgICAgICAgcm1zX2Vycm9yXyhzdGQ6OnRyMTo6Z2V0PDI+KEdldFBhcmFtKCkpKSwKLSAgICAgICAgbG93X2ZyZXFfZXJyb3JfKHN0ZDo6dHIxOjpnZXQ8Mz4oR2V0UGFyYW0oKSkpIHsKLSAgfQotCi0gIHZpcnR1YWwgflNpbmNSZXNhbXBsZXJUZXN0KCkge30KLQotIHByb3RlY3RlZDoKLSAgaW50IGlucHV0X3JhdGVfOwotICBpbnQgb3V0cHV0X3JhdGVfOwotICBkb3VibGUgcm1zX2Vycm9yXzsKLSAgZG91YmxlIGxvd19mcmVxX2Vycm9yXzsKLX07Ci0KLS8vIFRlc3RzIHJlc2FtcGxpbmcgdXNpbmcgYSBnaXZlbiBpbnB1dCBhbmQgb3V0cHV0IHNhbXBsZSByYXRlLgotVEVTVF9QKFNpbmNSZXNhbXBsZXJUZXN0LCBSZXNhbXBsZSkgewotICAvLyBNYWtlIGNvbXBhcmlzb25zIHVzaW5nIG9uZSBzZWNvbmQgb2YgZGF0YS4KLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBrVGVzdER1cmF0aW9uU2VjcyA9IDE7Ci0gIGludCBpbnB1dF9zYW1wbGVzID0ga1Rlc3REdXJhdGlvblNlY3MgKiBpbnB1dF9yYXRlXzsKLSAgaW50IG91dHB1dF9zYW1wbGVzID0ga1Rlc3REdXJhdGlvblNlY3MgKiBvdXRwdXRfcmF0ZV87Ci0KLSAgLy8gTnlxdWlzdCBmcmVxdWVuY3kgZm9yIHRoZSBpbnB1dCBzYW1wbGluZyByYXRlLgotICBkb3VibGUgaW5wdXRfbnlxdWlzdF9mcmVxID0gMC41ICogaW5wdXRfcmF0ZV87Ci0KLSAgLy8gU291cmNlIGZvciBkYXRhIHRvIGJlIHJlc2FtcGxlZC4KLSAgU2ludXNvaWRhbExpbmVhckNoaXJwU291cmNlIHJlc2FtcGxlcl9zb3VyY2UoCi0gICAgICBpbnB1dF9yYXRlXywgaW5wdXRfc2FtcGxlcywgaW5wdXRfbnlxdWlzdF9mcmVxKTsKLQotICBTaW5jUmVzYW1wbGVyIHJlc2FtcGxlcigKLSAgICAgIGlucHV0X3JhdGVfIC8gc3RhdGljX2Nhc3Q8ZG91YmxlPihvdXRwdXRfcmF0ZV8pLAotICAgICAgYmFzZTo6QmluZCgmU2ludXNvaWRhbExpbmVhckNoaXJwU291cmNlOjpQcm92aWRlSW5wdXQsCi0gICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoJnJlc2FtcGxlcl9zb3VyY2UpKSk7Ci0KLSAgLy8gVE9ETyhkYWxlY3VydGlzKTogSWYgd2Ugc3dpdGNoIHRvIEFWWC9TU0Ugb3B0aW1pemF0aW9uLCB3ZSdsbCBuZWVkIHRvCi0gIC8vIGFsbG9jYXRlIHRoZXNlIG9uIDMyLWJ5dGUgYm91bmRhcmllcyBhbmQgZW5zdXJlIHRoZXkncmUgc2l6ZWQgJSAzMiBieXRlcy4KLSAgc2NvcGVkX2FycmF5PGZsb2F0PiByZXNhbXBsZWRfZGVzdGluYXRpb24obmV3IGZsb2F0W291dHB1dF9zYW1wbGVzXSk7Ci0gIHNjb3BlZF9hcnJheTxmbG9hdD4gcHVyZV9kZXN0aW5hdGlvbihuZXcgZmxvYXRbb3V0cHV0X3NhbXBsZXNdKTsKLQotICAvLyBHZW5lcmF0ZSByZXNhbXBsZWQgc2lnbmFsLgotICByZXNhbXBsZXIuUmVzYW1wbGUocmVzYW1wbGVkX2Rlc3RpbmF0aW9uLmdldCgpLCBvdXRwdXRfc2FtcGxlcyk7Ci0KLSAgLy8gR2VuZXJhdGUgcHVyZSBzaWduYWwuCi0gIFNpbnVzb2lkYWxMaW5lYXJDaGlycFNvdXJjZSBwdXJlX3NvdXJjZSgKLSAgICAgIG91dHB1dF9yYXRlXywgb3V0cHV0X3NhbXBsZXMsIGlucHV0X255cXVpc3RfZnJlcSk7Ci0gIHB1cmVfc291cmNlLlByb3ZpZGVJbnB1dChwdXJlX2Rlc3RpbmF0aW9uLmdldCgpLCBvdXRwdXRfc2FtcGxlcyk7Ci0KLSAgLy8gUmFuZ2Ugb2YgdGhlIE55cXVpc3QgZnJlcXVlbmN5ICgwLjUgKiBtaW4oaW5wdXQgcmF0ZSwgb3V0cHV0X3JhdGUpKSB3aGljaAotICAvLyB3ZSByZWZlciB0byBhcyBsb3cgYW5kIGhpZ2guCi0gIHN0YXRpYyBjb25zdCBkb3VibGUga0xvd0ZyZXF1ZW5jeU55cXVpc3RSYW5nZSA9IDAuNzsKLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBrSGlnaEZyZXF1ZW5jeU55cXVpc3RSYW5nZSA9IDAuOTsKLQotICAvLyBDYWxjdWxhdGUgUm9vdC1NZWFuLVNxdWFyZS1FcnJvciBhbmQgbWF4aW11bSBlcnJvciBmb3IgdGhlIHJlc2FtcGxpbmcuCi0gIGRvdWJsZSBzdW1fb2Zfc3F1YXJlcyA9IDA7Ci0gIGRvdWJsZSBsb3dfZnJlcV9tYXhfZXJyb3IgPSAwOwotICBkb3VibGUgaGlnaF9mcmVxX21heF9lcnJvciA9IDA7Ci0gIGludCBtaW5pbXVtX3JhdGUgPSBzdGQ6Om1pbihpbnB1dF9yYXRlXywgb3V0cHV0X3JhdGVfKTsKLSAgZG91YmxlIGxvd19mcmVxdWVuY3lfcmFuZ2UgPSBrTG93RnJlcXVlbmN5TnlxdWlzdFJhbmdlICogMC41ICogbWluaW11bV9yYXRlOwotICBkb3VibGUgaGlnaF9mcmVxdWVuY3lfcmFuZ2UgPSBrSGlnaEZyZXF1ZW5jeU55cXVpc3RSYW5nZSAqIDAuNSAqIG1pbmltdW1fcmF0ZTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdXRwdXRfc2FtcGxlczsgKytpKSB7Ci0gICAgZG91YmxlIGVycm9yID0gZmFicyhyZXNhbXBsZWRfZGVzdGluYXRpb25baV0gLSBwdXJlX2Rlc3RpbmF0aW9uW2ldKTsKLQotICAgIGlmIChwdXJlX3NvdXJjZS5GcmVxdWVuY3koaSkgPCBsb3dfZnJlcXVlbmN5X3JhbmdlKSB7Ci0gICAgICBpZiAoZXJyb3IgPiBsb3dfZnJlcV9tYXhfZXJyb3IpCi0gICAgICAgIGxvd19mcmVxX21heF9lcnJvciA9IGVycm9yOwotICAgIH0gZWxzZSBpZiAocHVyZV9zb3VyY2UuRnJlcXVlbmN5KGkpIDwgaGlnaF9mcmVxdWVuY3lfcmFuZ2UpIHsKLSAgICAgIGlmIChlcnJvciA+IGhpZ2hfZnJlcV9tYXhfZXJyb3IpCi0gICAgICAgIGhpZ2hfZnJlcV9tYXhfZXJyb3IgPSBlcnJvcjsKLSAgICB9Ci0gICAgLy8gVE9ETyhkYWxlY3VydGlzKTogU2FuaXR5IGNoZWNrIGZyZXF1ZW5jaWVzID4ga0hpZ2hGcmVxdWVuY3lOeXF1aXN0UmFuZ2UuCi0KLSAgICBzdW1fb2Zfc3F1YXJlcyArPSBlcnJvciAqIGVycm9yOwotICB9Ci0KLSAgZG91YmxlIHJtc19lcnJvciA9IHNxcnQoc3VtX29mX3NxdWFyZXMgLyBvdXRwdXRfc2FtcGxlcyk7Ci0KLSAgLy8gQ29udmVydCBlYWNoIGVycm9yIHRvIGRiRlMuCi0gICNkZWZpbmUgREJGUyh4KSAyMCAqIGxvZzEwKHgpCi0gIHJtc19lcnJvciA9IERCRlMocm1zX2Vycm9yKTsKLSAgbG93X2ZyZXFfbWF4X2Vycm9yID0gREJGUyhsb3dfZnJlcV9tYXhfZXJyb3IpOwotICBoaWdoX2ZyZXFfbWF4X2Vycm9yID0gREJGUyhoaWdoX2ZyZXFfbWF4X2Vycm9yKTsKLQotICBFWFBFQ1RfTEUocm1zX2Vycm9yLCBybXNfZXJyb3JfKTsKLSAgRVhQRUNUX0xFKGxvd19mcmVxX21heF9lcnJvciwgbG93X2ZyZXFfZXJyb3JfKTsKLQotICAvLyBBbGwgY29udmVyc2lvbnMgY3VycmVudGx5IGhhdmUgYSBoaWdoIGZyZXF1ZW5jeSBlcnJvciBhcm91bmQgLTYgZGJGUy4KLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBrSGlnaEZyZXF1ZW5jeU1heEVycm9yID0gLTYuMDI7Ci0gIEVYUEVDVF9MRShoaWdoX2ZyZXFfbWF4X2Vycm9yLCBrSGlnaEZyZXF1ZW5jeU1heEVycm9yKTsKLX0KLQotLy8gQWxtb3N0IGFsbCBjb252ZXJzaW9ucyBoYXZlIGFuIFJNUyBlcnJvciBvZiBhcm91bmQgLTE0IGRiRlMuCi1zdGF0aWMgY29uc3QgZG91YmxlIGtSZXNhbXBsaW5nUk1TRXJyb3IgPSAtMTQuNTg7Ci0KLS8vIFRocmVzaG9sZHMgY2hvc2VuIGFyYml0cmFyaWx5IGJhc2VkIG9uIHdoYXQgZWFjaCByZXNhbXBsaW5nIHJlcG9ydGVkIGR1cmluZwotLy8gdGVzdGluZy4gIEFsbCB0aHJlc2hvbGRzIGFyZSBpbiBkYkZTLCBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0RCRlMuCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUCgKLSAgICBTaW5jUmVzYW1wbGVyVGVzdCwgU2luY1Jlc2FtcGxlclRlc3QsIHRlc3Rpbmc6OlZhbHVlcygKLSAgICAgICAgLy8gVG8gNDQuMWtIegotICAgICAgICBzdGQ6OnRyMTo6bWFrZV90dXBsZSg4MDAwLCA0NDEwMCwga1Jlc2FtcGxpbmdSTVNFcnJvciwgLTYyLjczKSwKLSAgICAgICAgc3RkOjp0cjE6Om1ha2VfdHVwbGUoMTEwMjUsIDQ0MTAwLCBrUmVzYW1wbGluZ1JNU0Vycm9yLCAtNzIuMTkpLAotICAgICAgICBzdGQ6OnRyMTo6bWFrZV90dXBsZSgxNjAwMCwgNDQxMDAsIGtSZXNhbXBsaW5nUk1TRXJyb3IsIC02Mi41NCksCi0gICAgICAgIHN0ZDo6dHIxOjptYWtlX3R1cGxlKDIyMDUwLCA0NDEwMCwga1Jlc2FtcGxpbmdSTVNFcnJvciwgLTczLjUzKSwKLSAgICAgICAgc3RkOjp0cjE6Om1ha2VfdHVwbGUoMzIwMDAsIDQ0MTAwLCBrUmVzYW1wbGluZ1JNU0Vycm9yLCAtNjMuMzIpLAotICAgICAgICBzdGQ6OnRyMTo6bWFrZV90dXBsZSg0NDEwMCwgNDQxMDAsIGtSZXNhbXBsaW5nUk1TRXJyb3IsIC03My41MyksCi0gICAgICAgIHN0ZDo6dHIxOjptYWtlX3R1cGxlKDQ4MDAwLCA0NDEwMCwgLTE1LjAxLCAtNjQuMDQpLAotICAgICAgICBzdGQ6OnRyMTo6bWFrZV90dXBsZSg5NjAwMCwgNDQxMDAsIC0xOC40OSwgLTI1LjUxKSwKLSAgICAgICAgc3RkOjp0cjE6Om1ha2VfdHVwbGUoMTkyMDAwLCA0NDEwMCwgLTIwLjUwLCAtMTMuMzEpLAotCi0gICAgICAgIC8vIFRvIDQ4a0h6Ci0gICAgICAgIHN0ZDo6dHIxOjptYWtlX3R1cGxlKDgwMDAsIDQ4MDAwLCBrUmVzYW1wbGluZ1JNU0Vycm9yLCAtNjMuNDMpLAotICAgICAgICBzdGQ6OnRyMTo6bWFrZV90dXBsZSgxMTAyNSwgNDgwMDAsIGtSZXNhbXBsaW5nUk1TRXJyb3IsIC02Mi42MSksCi0gICAgICAgIHN0ZDo6dHIxOjptYWtlX3R1cGxlKDE2MDAwLCA0ODAwMCwga1Jlc2FtcGxpbmdSTVNFcnJvciwgLTYzLjk2KSwKLSAgICAgICAgc3RkOjp0cjE6Om1ha2VfdHVwbGUoMjIwNTAsIDQ4MDAwLCBrUmVzYW1wbGluZ1JNU0Vycm9yLCAtNjIuNDIpLAotICAgICAgICBzdGQ6OnRyMTo6bWFrZV90dXBsZSgzMjAwMCwgNDgwMDAsIGtSZXNhbXBsaW5nUk1TRXJyb3IsIC02NC4wNCksCi0gICAgICAgIHN0ZDo6dHIxOjptYWtlX3R1cGxlKDQ0MTAwLCA0ODAwMCwga1Jlc2FtcGxpbmdSTVNFcnJvciwgLTYyLjYzKSwKLSAgICAgICAgc3RkOjp0cjE6Om1ha2VfdHVwbGUoNDgwMDAsIDQ4MDAwLCBrUmVzYW1wbGluZ1JNU0Vycm9yLCAtNzMuNTIpLAotICAgICAgICBzdGQ6OnRyMTo6bWFrZV90dXBsZSg5NjAwMCwgNDgwMDAsIC0xOC40MCwgLTI4LjQ0KSwKLSAgICAgICAgc3RkOjp0cjE6Om1ha2VfdHVwbGUoMTkyMDAwLCA0ODAwMCwgLTIwLjQzLCAtMTQuMTEpLAotCi0gICAgICAgIC8vIFRvIDk2a0h6Ci0gICAgICAgIHN0ZDo6dHIxOjptYWtlX3R1cGxlKDgwMDAsIDk2MDAwLCBrUmVzYW1wbGluZ1JNU0Vycm9yLCAtNjMuMTkpLAotICAgICAgICBzdGQ6OnRyMTo6bWFrZV90dXBsZSgxMTAyNSwgOTYwMDAsIGtSZXNhbXBsaW5nUk1TRXJyb3IsIC02Mi42MSksCi0gICAgICAgIHN0ZDo6dHIxOjptYWtlX3R1cGxlKDE2MDAwLCA5NjAwMCwga1Jlc2FtcGxpbmdSTVNFcnJvciwgLTYzLjM5KSwKLSAgICAgICAgc3RkOjp0cjE6Om1ha2VfdHVwbGUoMjIwNTAsIDk2MDAwLCBrUmVzYW1wbGluZ1JNU0Vycm9yLCAtNjIuNDIpLAotICAgICAgICBzdGQ6OnRyMTo6bWFrZV90dXBsZSgzMjAwMCwgOTYwMDAsIGtSZXNhbXBsaW5nUk1TRXJyb3IsIC02My45NSksCi0gICAgICAgIHN0ZDo6dHIxOjptYWtlX3R1cGxlKDQ0MTAwLCA5NjAwMCwga1Jlc2FtcGxpbmdSTVNFcnJvciwgLTYyLjYzKSwKLSAgICAgICAgc3RkOjp0cjE6Om1ha2VfdHVwbGUoNDgwMDAsIDk2MDAwLCBrUmVzYW1wbGluZ1JNU0Vycm9yLCAtNzMuNTIpLAotICAgICAgICBzdGQ6OnRyMTo6bWFrZV90dXBsZSg5NjAwMCwgOTYwMDAsIGtSZXNhbXBsaW5nUk1TRXJyb3IsIC03My41MiksCi0gICAgICAgIHN0ZDo6dHIxOjptYWtlX3R1cGxlKDE5MjAwMCwgOTYwMDAsIGtSZXNhbXBsaW5nUk1TRXJyb3IsIC0yOC40MSksCi0KLSAgICAgICAgLy8gVG8gMTkya0h6Ci0gICAgICAgIHN0ZDo6dHIxOjptYWtlX3R1cGxlKDgwMDAsIDE5MjAwMCwga1Jlc2FtcGxpbmdSTVNFcnJvciwgLTYzLjEwKSwKLSAgICAgICAgc3RkOjp0cjE6Om1ha2VfdHVwbGUoMTEwMjUsIDE5MjAwMCwga1Jlc2FtcGxpbmdSTVNFcnJvciwgLTYyLjYxKSwKLSAgICAgICAgc3RkOjp0cjE6Om1ha2VfdHVwbGUoMTYwMDAsIDE5MjAwMCwga1Jlc2FtcGxpbmdSTVNFcnJvciwgLTYzLjE0KSwKLSAgICAgICAgc3RkOjp0cjE6Om1ha2VfdHVwbGUoMjIwNTAsIDE5MjAwMCwga1Jlc2FtcGxpbmdSTVNFcnJvciwgLTYyLjQyKSwKLSAgICAgICAgc3RkOjp0cjE6Om1ha2VfdHVwbGUoMzIwMDAsIDE5MjAwMCwga1Jlc2FtcGxpbmdSTVNFcnJvciwgLTYzLjM4KSwKLSAgICAgICAgc3RkOjp0cjE6Om1ha2VfdHVwbGUoNDQxMDAsIDE5MjAwMCwga1Jlc2FtcGxpbmdSTVNFcnJvciwgLTYyLjYzKSwKLSAgICAgICAgc3RkOjp0cjE6Om1ha2VfdHVwbGUoNDgwMDAsIDE5MjAwMCwga1Jlc2FtcGxpbmdSTVNFcnJvciwgLTczLjQ0KSwKLSAgICAgICAgc3RkOjp0cjE6Om1ha2VfdHVwbGUoOTYwMDAsIDE5MjAwMCwga1Jlc2FtcGxpbmdSTVNFcnJvciwgLTczLjUyKSwKLSAgICAgICAgc3RkOjp0cjE6Om1ha2VfdHVwbGUoMTkyMDAwLCAxOTIwMDAsIGtSZXNhbXBsaW5nUk1TRXJyb3IsIC03My41MikpKTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9zdHJlYW1fcGFyc2VyLmNjIGIvc3JjL21lZGlhL2Jhc2Uvc3RyZWFtX3BhcnNlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI0MDkxOS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9zdHJlYW1fcGFyc2VyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc3RyZWFtX3BhcnNlci5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1TdHJlYW1QYXJzZXI6OlN0cmVhbVBhcnNlcigpIHt9Ci0KLVN0cmVhbVBhcnNlcjo6flN0cmVhbVBhcnNlcigpIHt9Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2Uvc3RyZWFtX3BhcnNlci5oIGIvc3JjL21lZGlhL2Jhc2Uvc3RyZWFtX3BhcnNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzVlNmU2Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3N0cmVhbV9wYXJzZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0JBU0VfU1RSRUFNX1BBUlNFUl9IXwotI2RlZmluZSBNRURJQV9CQVNFX1NUUkVBTV9QQVJTRVJfSF8KLQotI2luY2x1ZGUgPGRlcXVlPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2tfZm9yd2FyZC5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgImJhc2UvdGltZS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9sb2cuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgQXVkaW9EZWNvZGVyQ29uZmlnOwotY2xhc3MgU3RyZWFtUGFyc2VyQnVmZmVyOwotY2xhc3MgVmlkZW9EZWNvZGVyQ29uZmlnOwotCi0vLyBBYnN0cmFjdCBpbnRlcmZhY2UgZm9yIHBhcnNpbmcgbWVkaWEgYnl0ZSBzdHJlYW1zLgotY2xhc3MgTUVESUFfRVhQT1JUIFN0cmVhbVBhcnNlciB7Ci0gcHVibGljOgotICB0eXBlZGVmIHN0ZDo6ZGVxdWU8c2NvcGVkX3JlZnB0cjxTdHJlYW1QYXJzZXJCdWZmZXI+ID4gQnVmZmVyUXVldWU7Ci0KLSAgU3RyZWFtUGFyc2VyKCk7Ci0gIHZpcnR1YWwgflN0cmVhbVBhcnNlcigpOwotCi0gIC8vIEluZGljYXRlcyBjb21wbGV0aW9uIG9mIHBhcnNlciBpbml0aWFsaXphdGlvbi4KLSAgLy8gRmlyc3QgcGFyYW1ldGVyIC0gSW5kaWNhdGVzIGluaXRpYWxpemF0aW9uIHN1Y2Nlc3MuIFNldCB0byB0cnVlIGlmCi0gIC8vICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIHdhcyBzdWNjZXNzZnVsLiBGYWxzZSBpZiBhbiBlcnJvcgotICAvLyAgICAgICAgICAgICAgICAgICBvY2N1cnJlZC4KLSAgLy8gU2Vjb25kIHBhcmFtZXRlciAtICBJbmRpY2F0ZXMgdGhlIHN0cmVhbSBkdXJhdGlvbi4gT25seSBjb250YWlucyBhIHZhbGlkCi0gIC8vICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaWYgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0cnVlLgotICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHZvaWQoYm9vbCwgYmFzZTo6VGltZURlbHRhKT4gSW5pdENCOwotCi0gIC8vIEluZGljYXRlcyB3aGVuIG5ldyBzdHJlYW0gY29uZmlndXJhdGlvbnMgaGF2ZSBiZWVuIHBhcnNlZC4KLSAgLy8gRmlyc3QgcGFyYW1ldGVyIC0gVGhlIG5ldyBhdWRpbyBjb25maWd1cmF0aW9uLiBJZiB0aGUgY29uZmlnIGlzIG5vdCB2YWxpZAotICAvLyAgICAgICAgICAgICAgICAgICB0aGVuIGl0IG1lYW5zIHRoYXQgdGhlcmUgaXNuJ3QgYW4gYXVkaW8gc3RyZWFtLgotICAvLyBTZWNvbmQgcGFyYW1ldGVyIC0gVGhlIG5ldyB2aWRlbyBjb25maWd1cmF0aW9uLiBJZiB0aGUgY29uZmlnIGlzIG5vdCB2YWxpZAotICAvLyAgICAgICAgICAgICAgICAgICAgdGhlbiBpdCBtZWFucyB0aGF0IHRoZXJlIGlzbid0IGFuIGF1ZGlvIHN0cmVhbS4KLSAgLy8gUmV0dXJuIHZhbHVlIC0gVHJ1ZSBpZiB0aGUgbmV3IGNvbmZpZ3VyYXRpb25zIGFyZSBhY2NlcHRlZC4KLSAgLy8gICAgICAgICAgICAgICAgRmFsc2UgaWYgdGhlIG5ldyBjb25maWd1cmF0aW9ucyBhcmUgbm90IHN1cHBvcnRlZAotICAvLyAgICAgICAgICAgICAgICBhbmQgaW5kaWNhdGVzIHRoYXQgYSBwYXJzaW5nIGVycm9yIHNob3VsZCBiZSBzaWduYWxsZWQuCi0gIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8Ym9vbChjb25zdCBBdWRpb0RlY29kZXJDb25maWcmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJik+IE5ld0NvbmZpZ0NCOwotCi0gIC8vIE5ldyBzdHJlYW0gYnVmZmVycyBoYXZlIGJlZW4gcGFyc2VkLgotICAvLyBGaXJzdCBwYXJhbWV0ZXIgLSBBIHF1ZXVlIG9mIG5ld2x5IHBhcnNlZCBidWZmZXJzLgotICAvLyBSZXR1cm4gdmFsdWUgLSBUcnVlIGluZGljYXRlcyB0aGF0IHRoZSBidWZmZXJzIGFyZSBhY2NlcHRlZC4KLSAgLy8gICAgICAgICAgICAgICAgRmFsc2UgaWYgc29tZXRoaW5nIHdhcyB3cm9uZyB3aXRoIHRoZSBidWZmZXJzIGFuZCBhIHBhcnNpbmcKLSAgLy8gICAgICAgICAgICAgICAgZXJyb3Igc2hvdWxkIGJlIHNpZ25hbGxlZC4KLSAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazxib29sKGNvbnN0IEJ1ZmZlclF1ZXVlJik+IE5ld0J1ZmZlcnNDQjsKLQotICAvLyBTaWduYWxzIHRoZSBiZWdpbm5pbmcgb2YgYSBuZXcgbWVkaWEgc2VnbWVudC4KLSAgLy8gRmlyc3QgcGFyYW1ldGVyIC0gVGhlIGVhcmxpZXN0IHRpbWVzdGFtcCBvZiBhbGwgdGhlIHN0cmVhbXMgaW4gdGhlIHNlZ21lbnQuCi0gIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZChiYXNlOjpUaW1lRGVsdGEpPiBOZXdNZWRpYVNlZ21lbnRDQjsKLQotICAvLyBBIG5ldyBwb3RlbnRpYWxseSBlbmNyeXB0ZWQgc3RyZWFtIGhhcyBiZWVuIHBhcnNlZC4KLSAgLy8gRmlyc3QgcGFyYW1ldGVyIC0gVGhlIHR5cGUgb2YgdGhlIGluaXRpYWxpemF0aW9uIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZQotICAvLyAgICAgICAgICAgICAgICAgICBzdHJlYW0uCi0gIC8vIFNlY29uZCBwYXJhbWV0ZXIgLSBUaGUgaW5pdGlhbGl6YXRpb24gZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHN0cmVhbS4KLSAgLy8gVGhpcmQgcGFyYW1ldGVyIC0gTnVtYmVyIG9mIGJ5dGVzIG9mIHRoZSBpbml0aWFsaXphdGlvbiBkYXRhLgotICAvLyBSZXR1cm4gdmFsdWUgLSBUcnVlIGluZGljYXRlcyB0aGF0IHRoZSBpbml0aWFsaXphdGlvbiBkYXRhIGlzIGFjY2VwdGVkLgotICAvLyAgICAgICAgICAgICAgICBGYWxzZSBpZiBzb21ldGhpbmcgd2FzIHdyb25nIHdpdGggdGhlIGluaXRpYWxpemF0aW9uIGRhdGEKLSAgLy8gICAgICAgICAgICAgICAgYW5kIGEgcGFyc2luZyBlcnJvciBzaG91bGQgYmUgc2lnbmFsbGVkLgotICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPGJvb2woY29uc3Qgc3RkOjpzdHJpbmcmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX2FycmF5PHVpbnQ4PiwgaW50KT4gTmVlZEtleUNCOwotCi0gIC8vIEluaXRpYWxpemUgdGhlIHBhcnNlciB3aXRoIG5lY2Vzc2FyeSBjYWxsYmFja3MuIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkKLSAgLy8gZGF0YSBpcyBwYXNzZWQgdG8gUGFyc2UoKS4gfGluaXRfY2J8IHdpbGwgYmUgY2FsbGVkIG9uY2UgZW5vdWdoIGRhdGEgaGFzCi0gIC8vIGJlZW4gcGFyc2VkIHRvIGRldGVybWluZSB0aGUgaW5pdGlhbCBzdHJlYW0gY29uZmlndXJhdGlvbnMsIHByZXNlbnRhdGlvbgotICAvLyBzdGFydCB0aW1lLCBhbmQgZHVyYXRpb24uCi0gIHZpcnR1YWwgdm9pZCBJbml0KGNvbnN0IEluaXRDQiYgaW5pdF9jYiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgTmV3Q29uZmlnQ0ImIGNvbmZpZ19jYiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgTmV3QnVmZmVyc0NCJiBhdWRpb19jYiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgTmV3QnVmZmVyc0NCJiB2aWRlb19jYiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgTmVlZEtleUNCJiBuZWVkX2tleV9jYiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgTmV3TWVkaWFTZWdtZW50Q0ImIG5ld19zZWdtZW50X2NiLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiBlbmRfb2Zfc2VnbWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9nQ0ImIGxvZ19jYikgPSAwOwotCi0gIC8vIENhbGxlZCB3aGVuIGEgc2VlayBvY2N1cnMuIFRoaXMgZmx1c2hlcyB0aGUgY3VycmVudCBwYXJzZXIgc3RhdGUKLSAgLy8gYW5kIHB1dHMgdGhlIHBhcnNlciBpbiBhIHN0YXRlIHdoZXJlIGl0IGNhbiByZWNlaXZlIGRhdGEgZm9yIHRoZSBuZXcgc2VlawotICAvLyBwb2ludC4KLSAgdmlydHVhbCB2b2lkIEZsdXNoKCkgPSAwOwotCi0gIC8vIENhbGxlZCB3aGVuIHRoZXJlIGlzIG5ldyBkYXRhIHRvIHBhcnNlLgotICAvLwotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHBhcnNlIHN1Y2NlZWRzLgotICB2aXJ0dWFsIGJvb2wgUGFyc2UoY29uc3QgdWludDgqIGJ1ZiwgaW50IHNpemUpID0gMDsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTdHJlYW1QYXJzZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQkFTRV9TVFJFQU1fUEFSU0VSX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9zdHJlYW1fcGFyc2VyX2J1ZmZlci5jYyBiL3NyYy9tZWRpYS9iYXNlL3N0cmVhbV9wYXJzZXJfYnVmZmVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTZjNGE1Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3N0cmVhbV9wYXJzZXJfYnVmZmVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc3RyZWFtX3BhcnNlcl9idWZmZXIuaCIKLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2hlbGxfYnVmZmVyX2ZhY3RvcnkuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotI2lmIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLXNjb3BlZF9yZWZwdHI8U3RyZWFtUGFyc2VyQnVmZmVyPiBTdHJlYW1QYXJzZXJCdWZmZXI6OkNyZWF0ZUVPU0J1ZmZlcigpIHsKLSAgcmV0dXJuIG1ha2Vfc2NvcGVkX3JlZnB0cihuZXcgU3RyZWFtUGFyc2VyQnVmZmVyKE5VTEwsIDAsIGZhbHNlKSk7Ci19Ci0KLXNjb3BlZF9yZWZwdHI8U3RyZWFtUGFyc2VyQnVmZmVyPiBTdHJlYW1QYXJzZXJCdWZmZXI6OkNvcHlGcm9tKAotICAgIGNvbnN0IHVpbnQ4KiBkYXRhLAotICAgIGludCBkYXRhX3NpemUsCi0gICAgYm9vbCBpc19rZXlmcmFtZSkgewotICBpZiAoIWRhdGEgfHwgZGF0YV9zaXplID09IDApIHsKLSAgICByZXR1cm4gQ3JlYXRlRU9TQnVmZmVyKCk7Ci0gIH0KLSAgRENIRUNLKGRhdGEpOwotICBEQ0hFQ0tfR1QoZGF0YV9zaXplLCAwKTsKLQotICB1aW50OCogYnVmZmVyX2J5dGVzID0gU2hlbGxCdWZmZXJGYWN0b3J5OjpJbnN0YW5jZSgpLT5BbGxvY2F0ZU5vdyhkYXRhX3NpemUpOwotICBpZiAoIWJ1ZmZlcl9ieXRlcykgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIC8vIGNvcHkgdGhlIGRhdGEgb3ZlciB0byB0aGUgcmVzdWFibGUgYnVmZmVyIGFyZWEKLSAgbWVtY3B5KGJ1ZmZlcl9ieXRlcywgZGF0YSwgZGF0YV9zaXplKTsKLSAgcmV0dXJuIG1ha2Vfc2NvcGVkX3JlZnB0cigKLSAgICAgIG5ldyBTdHJlYW1QYXJzZXJCdWZmZXIoYnVmZmVyX2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2tleWZyYW1lKSk7Ci19Ci0jZWxzZQotc2NvcGVkX3JlZnB0cjxTdHJlYW1QYXJzZXJCdWZmZXI+IFN0cmVhbVBhcnNlckJ1ZmZlcjo6Q29weUZyb20oCi0gICAgY29uc3QgdWludDgqIGRhdGEsIGludCBkYXRhX3NpemUsIGJvb2wgaXNfa2V5ZnJhbWUpIHsKLSAgcmV0dXJuIG1ha2Vfc2NvcGVkX3JlZnB0cigKLSAgICAgIG5ldyBTdHJlYW1QYXJzZXJCdWZmZXIoZGF0YSwgZGF0YV9zaXplLCBpc19rZXlmcmFtZSkpOwotfQotI2VuZGlmCi0KLWJhc2U6OlRpbWVEZWx0YSBTdHJlYW1QYXJzZXJCdWZmZXI6OkdldERlY29kZVRpbWVzdGFtcCgpIGNvbnN0IHsKLSAgaWYgKGRlY29kZV90aW1lc3RhbXBfID09IGtOb1RpbWVzdGFtcCgpKQotICAgIHJldHVybiBHZXRUaW1lc3RhbXAoKTsKLSAgcmV0dXJuIGRlY29kZV90aW1lc3RhbXBfOwotfQotCi12b2lkIFN0cmVhbVBhcnNlckJ1ZmZlcjo6U2V0RGVjb2RlVGltZXN0YW1wKGNvbnN0IGJhc2U6OlRpbWVEZWx0YSYgdGltZXN0YW1wKSB7Ci0gIGRlY29kZV90aW1lc3RhbXBfID0gdGltZXN0YW1wOwotfQotCi0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotU3RyZWFtUGFyc2VyQnVmZmVyOjpTdHJlYW1QYXJzZXJCdWZmZXIodWludDgqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19rZXlmcmFtZSkKLSAgICA6IERlY29kZXJCdWZmZXIoZGF0YSwgZGF0YV9zaXplLCBpc19rZXlmcmFtZSksCi0gICAgICBkZWNvZGVfdGltZXN0YW1wXyhrTm9UaW1lc3RhbXAoKSksCi0gICAgICBjb25maWdfaWRfKGtJbnZhbGlkQ29uZmlnSWQpIHsKLSAgU2V0RHVyYXRpb24oa05vVGltZXN0YW1wKCkpOwotfQotI2Vsc2UKLVN0cmVhbVBhcnNlckJ1ZmZlcjo6U3RyZWFtUGFyc2VyQnVmZmVyKGNvbnN0IHVpbnQ4KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfa2V5ZnJhbWUpCi0gICAgOiBEZWNvZGVyQnVmZmVyKGRhdGEsIGRhdGFfc2l6ZSwgaXNfa2V5ZnJhbWUpLAotICAgICAgZGVjb2RlX3RpbWVzdGFtcF8oa05vVGltZXN0YW1wKCkpLAotICAgICAgY29uZmlnX2lkXyhrSW52YWxpZENvbmZpZ0lkKSB7Ci0gIFNldER1cmF0aW9uKGtOb1RpbWVzdGFtcCgpKTsKLX0KLSNlbmRpZgotCi1TdHJlYW1QYXJzZXJCdWZmZXI6On5TdHJlYW1QYXJzZXJCdWZmZXIoKSB7Ci19Ci0KLWludCBTdHJlYW1QYXJzZXJCdWZmZXI6OkdldENvbmZpZ0lkKCkgY29uc3QgewotICByZXR1cm4gY29uZmlnX2lkXzsKLX0KLQotdm9pZCBTdHJlYW1QYXJzZXJCdWZmZXI6OlNldENvbmZpZ0lkKGludCBjb25maWdfaWQpIHsKLSAgY29uZmlnX2lkXyA9IGNvbmZpZ19pZDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9zdHJlYW1fcGFyc2VyX2J1ZmZlci5oIGIvc3JjL21lZGlhL2Jhc2Uvc3RyZWFtX3BhcnNlcl9idWZmZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU0NzFkOS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS9zdHJlYW1fcGFyc2VyX2J1ZmZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9CQVNFX1NUUkVBTV9QQVJTRVJfQlVGRkVSX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfU1RSRUFNX1BBUlNFUl9CVUZGRVJfSF8KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBNRURJQV9FWFBPUlQgU3RyZWFtUGFyc2VyQnVmZmVyIDogcHVibGljIERlY29kZXJCdWZmZXIgewotIHB1YmxpYzoKLSAgLy8gVmFsdWUgdXNlZCB0byBzaWduYWwgYW4gaW52YWxpZCBkZWNvZGVyIGNvbmZpZyBJRC4KLSAgZW51bSB7IGtJbnZhbGlkQ29uZmlnSWQgPSAtMSB9OwotCi0gIHN0YXRpYyBzY29wZWRfcmVmcHRyPFN0cmVhbVBhcnNlckJ1ZmZlcj4gQ3JlYXRlRU9TQnVmZmVyKCk7Ci0gIHN0YXRpYyBzY29wZWRfcmVmcHRyPFN0cmVhbVBhcnNlckJ1ZmZlcj4gQ29weUZyb20oCi0gICAgICBjb25zdCB1aW50OCogZGF0YSwgaW50IGRhdGFfc2l6ZSwgYm9vbCBpc19rZXlmcmFtZSk7Ci0KLSAgLy8gRGVjb2RlIHRpbWVzdGFtcC4gSWYgbm90IGV4cGxpY2l0bHkgc2V0LCBvciBzZXQgdG8ga05vVGltZXN0YW1wKCksIHRoZQotICAvLyB2YWx1ZSB3aWxsIGJlIHRha2VuIGZyb20gdGhlIG5vcm1hbCB0aW1lc3RhbXAuCi0gIGJhc2U6OlRpbWVEZWx0YSBHZXREZWNvZGVUaW1lc3RhbXAoKSBjb25zdDsKLSAgdm9pZCBTZXREZWNvZGVUaW1lc3RhbXAoY29uc3QgYmFzZTo6VGltZURlbHRhJiB0aW1lc3RhbXApOwotCi0gIC8vIEdldHMvc2V0cyB0aGUgSUQgb2YgdGhlIGRlY29kZXIgY29uZmlnIGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0gIC8vIGJ1ZmZlci4KLSAgaW50IEdldENvbmZpZ0lkKCkgY29uc3Q7Ci0gIHZvaWQgU2V0Q29uZmlnSWQoaW50IGNvbmZpZ19pZCk7Ci0KLSBwcml2YXRlOgotI2lmIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLSAgU3RyZWFtUGFyc2VyQnVmZmVyKHVpbnQ4KiBkYXRhLCBpbnQgZGF0YV9zaXplLCBib29sIGlzX2tleWZyYW1lKTsKLSNlbHNlCi0gIFN0cmVhbVBhcnNlckJ1ZmZlcihjb25zdCB1aW50OCogZGF0YSwgaW50IGRhdGFfc2l6ZSwgYm9vbCBpc19rZXlmcmFtZSk7Ci0jZW5kaWYKLSAgdmlydHVhbCB+U3RyZWFtUGFyc2VyQnVmZmVyKCk7Ci0KLSAgYmFzZTo6VGltZURlbHRhIGRlY29kZV90aW1lc3RhbXBfOwotICBpbnQgY29uZmlnX2lkXzsKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFN0cmVhbVBhcnNlckJ1ZmZlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX1NUUkVBTV9QQVJTRVJfQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS90ZXN0X2RhdGFfdXRpbC5jYyBiL3NyYy9tZWRpYS9iYXNlL3Rlc3RfZGF0YV91dGlsLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzQ2NTVkLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3Rlc3RfZGF0YV91dGlsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdGVzdF9kYXRhX3V0aWwuaCIKLQotI2luY2x1ZGUgImJhc2UvZmlsZV91dGlsLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS9wYXRoX3NlcnZpY2UuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLUZpbGVQYXRoIEdldFRlc3REYXRhRmlsZVBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKLSAgRmlsZVBhdGggZmlsZV9wYXRoOwotICBDSEVDSyhQYXRoU2VydmljZTo6R2V0KGJhc2U6OkRJUl9TT1VSQ0VfUk9PVCwgJmZpbGVfcGF0aCkpOwotCi0gIGZpbGVfcGF0aCA9IGZpbGVfcGF0aC5BcHBlbmQoRklMRV9QQVRIX0xJVEVSQUwoIm1lZGlhIikpCi0gICAgICAuQXBwZW5kKEZJTEVfUEFUSF9MSVRFUkFMKCJ0ZXN0IikpCi0gICAgICAuQXBwZW5kKEZJTEVfUEFUSF9MSVRFUkFMKCJkYXRhIikpCi0gICAgICAuQXBwZW5kQVNDSUkobmFtZSk7Ci0gIHJldHVybiBmaWxlX3BhdGg7Ci19Ci0KLXNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gUmVhZFRlc3REYXRhRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgewotICBGaWxlUGF0aCBmaWxlX3BhdGg7Ci0gIENIRUNLKFBhdGhTZXJ2aWNlOjpHZXQoYmFzZTo6RElSX1NPVVJDRV9ST09ULCAmZmlsZV9wYXRoKSk7Ci0KLSAgZmlsZV9wYXRoID0gZmlsZV9wYXRoLkFwcGVuZChGSUxFX1BBVEhfTElURVJBTCgibWVkaWEiKSkKLSAgICAgIC5BcHBlbmQoRklMRV9QQVRIX0xJVEVSQUwoInRlc3QiKSkKLSAgICAgIC5BcHBlbmQoRklMRV9QQVRIX0xJVEVSQUwoImRhdGEiKSkKLSAgICAgIC5BcHBlbmRBU0NJSShuYW1lKTsKLQotICBpbnQ2NCB0bXAgPSAwOwotICBDSEVDSyhmaWxlX3V0aWw6OkdldEZpbGVTaXplKGZpbGVfcGF0aCwgJnRtcCkpCi0gICAgICA8PCAiRmFpbGVkIHRvIGdldCBmaWxlIHNpemUgZm9yICciIDw8IG5hbWUgPDwgIiciOwotCi0gIGludCBmaWxlX3NpemUgPSBzdGF0aWNfY2FzdDxpbnQ+KHRtcCk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBidWZmZXIobmV3IERlY29kZXJCdWZmZXIoZmlsZV9zaXplKSk7Ci0gIENIRUNLX0VRKGZpbGVfc2l6ZSwgZmlsZV91dGlsOjpSZWFkRmlsZSgKLSAgICAgIGZpbGVfcGF0aCwgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYnVmZmVyLT5HZXRXcml0YWJsZURhdGEoKSksIGZpbGVfc2l6ZSkpCi0gICAgICA8PCAiRmFpbGVkIHRvIHJlYWQgJyIgPDwgbmFtZSA8PCAiJyI7Ci0KLSAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS90ZXN0X2RhdGFfdXRpbC5oIGIvc3JjL21lZGlhL2Jhc2UvdGVzdF9kYXRhX3V0aWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYyYmJkYS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS90ZXN0X2RhdGFfdXRpbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9CQVNFX1RFU1RfREFUQV9VVElMX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfVEVTVF9EQVRBX1VUSUxfSF8KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgImJhc2UvZmlsZV9wYXRoLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIERlY29kZXJCdWZmZXI7Ci0KLS8vIFJldHVybnMgYSBmaWxlIHBhdGggZm9yIGEgZmlsZSBpbiB0aGUgbWVkaWEvdGVzdC9kYXRhIGRpcmVjdG9yeS4KLUZpbGVQYXRoIEdldFRlc3REYXRhRmlsZVBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpOwotCi0vLyBSZWFkcyBhIHRlc3QgZmlsZSBmcm9tIG1lZGlhL3Rlc3QvZGF0YSBkaXJlY3RvcnkgYW5kIHN0b3JlcyBpdCBpbgotLy8gYSBEZWNvZGVyQnVmZmVyLiAgVXNlIERlY29kZXJCdWZmZXIgdnMgRGF0YUJ1ZmZlciB0byBlbnN1cmUgbm8gbWF0dGVyCi0vLyB3aGF0IGEgdGVzdCBkb2VzLCBpdCdzIHNhZmUgdG8gdXNlIEZGbXBlZyBtZXRob2RzLgotLy8KLS8vICB8bmFtZXwgLSBUaGUgbmFtZSBvZiB0aGUgZmlsZS4KLS8vICB8YnVmZmVyfCAtIFRoZSBjb250ZW50cyBvZiB0aGUgZmlsZS4KLXNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gUmVhZFRlc3REYXRhRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0JBU0VfVEVTVF9EQVRBX1VUSUxfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3Rlc3RfaGVscGVycy5jYyBiL3NyYy9tZWRpYS9iYXNlL3Rlc3RfaGVscGVycy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyYzlkNC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS90ZXN0X2hlbHBlcnMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS90ZXN0X2hlbHBlcnMuaCIKLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wLmgiCi0jaW5jbHVkZSAiYmFzZS90ZXN0L3Rlc3RfdGltZW91dHMuaCIKLSNpbmNsdWRlICJiYXNlL3RpbWVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9iaW5kX3RvX2xvb3AuaCIKLQotdXNpbmcgOjp0ZXN0aW5nOjpfOwotdXNpbmcgOjp0ZXN0aW5nOjpTdHJpY3RNb2NrOwotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBVdGlsaXR5IG1vY2sgZm9yIHRlc3RpbmcgbWV0aG9kcyBleHBlY3RpbmcgQ2xvc3VyZXMgYW5kIFBpcGVsaW5lU3RhdHVzQ0JzLgotY2xhc3MgTW9ja0NhbGxiYWNrIDogcHVibGljIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPE1vY2tDYWxsYmFjaz4gewotIHB1YmxpYzoKLSAgTW9ja0NhbGxiYWNrKCk7Ci0gIE1PQ0tfTUVUSE9EMChSdW4sIHZvaWQoKSk7Ci0gIE1PQ0tfTUVUSE9EMShSdW5XaXRoU3RhdHVzLCB2b2lkKFBpcGVsaW5lU3RhdHVzKSk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGZyaWVuZCBjbGFzcyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxNb2NrQ2FsbGJhY2s+OwotICB2aXJ0dWFsIH5Nb2NrQ2FsbGJhY2soKTsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNb2NrQ2FsbGJhY2spOwotfTsKLQotTW9ja0NhbGxiYWNrOjpNb2NrQ2FsbGJhY2soKSB7fQotTW9ja0NhbGxiYWNrOjp+TW9ja0NhbGxiYWNrKCkge30KLQotYmFzZTo6Q2xvc3VyZSBOZXdFeHBlY3RlZENsb3N1cmUoKSB7Ci0gIFN0cmljdE1vY2s8TW9ja0NhbGxiYWNrPiogY2FsbGJhY2sgPSBuZXcgU3RyaWN0TW9jazxNb2NrQ2FsbGJhY2s+KCk7Ci0gIEVYUEVDVF9DQUxMKCpjYWxsYmFjaywgUnVuKCkpOwotICByZXR1cm4gYmFzZTo6QmluZCgmTW9ja0NhbGxiYWNrOjpSdW4sIGNhbGxiYWNrKTsKLX0KLQotUGlwZWxpbmVTdGF0dXNDQiBOZXdFeHBlY3RlZFN0YXR1c0NCKFBpcGVsaW5lU3RhdHVzIHN0YXR1cykgewotICBTdHJpY3RNb2NrPE1vY2tDYWxsYmFjaz4qIGNhbGxiYWNrID0gbmV3IFN0cmljdE1vY2s8TW9ja0NhbGxiYWNrPigpOwotICBFWFBFQ1RfQ0FMTCgqY2FsbGJhY2ssIFJ1bldpdGhTdGF0dXMoc3RhdHVzKSk7Ci0gIHJldHVybiBiYXNlOjpCaW5kKCZNb2NrQ2FsbGJhY2s6OlJ1bldpdGhTdGF0dXMsIGNhbGxiYWNrKTsKLX0KLQotV2FpdGFibGVNZXNzYWdlTG9vcEV2ZW50OjpXYWl0YWJsZU1lc3NhZ2VMb29wRXZlbnQoKQotICAgIDogbWVzc2FnZV9sb29wXyhNZXNzYWdlTG9vcDo6Y3VycmVudCgpKSwKLSAgICAgIHNpZ25hbGVkXyhmYWxzZSksCi0gICAgICBzdGF0dXNfKFBJUEVMSU5FX09LKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfKTsKLX0KLQotV2FpdGFibGVNZXNzYWdlTG9vcEV2ZW50Ojp+V2FpdGFibGVNZXNzYWdlTG9vcEV2ZW50KCkge30KLQotYmFzZTo6Q2xvc3VyZSBXYWl0YWJsZU1lc3NhZ2VMb29wRXZlbnQ6OkdldENsb3N1cmUoKSB7Ci0gIERDSEVDS19FUShtZXNzYWdlX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLSAgcmV0dXJuIEJpbmRUb0xvb3AobWVzc2FnZV9sb29wXy0+bWVzc2FnZV9sb29wX3Byb3h5KCksIGJhc2U6OkJpbmQoCi0gICAgICAmV2FpdGFibGVNZXNzYWdlTG9vcEV2ZW50OjpPbkNhbGxiYWNrLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLAotICAgICAgUElQRUxJTkVfT0spKTsKLX0KLQotUGlwZWxpbmVTdGF0dXNDQiBXYWl0YWJsZU1lc3NhZ2VMb29wRXZlbnQ6OkdldFBpcGVsaW5lU3RhdHVzQ0IoKSB7Ci0gIERDSEVDS19FUShtZXNzYWdlX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLSAgcmV0dXJuIEJpbmRUb0xvb3AobWVzc2FnZV9sb29wXy0+bWVzc2FnZV9sb29wX3Byb3h5KCksIGJhc2U6OkJpbmQoCi0gICAgICAmV2FpdGFibGVNZXNzYWdlTG9vcEV2ZW50OjpPbkNhbGxiYWNrLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci19Ci0KLXZvaWQgV2FpdGFibGVNZXNzYWdlTG9vcEV2ZW50OjpSdW5BbmRXYWl0KCkgewotICBSdW5BbmRXYWl0Rm9yU3RhdHVzKFBJUEVMSU5FX09LKTsKLX0KLQotdm9pZCBXYWl0YWJsZU1lc3NhZ2VMb29wRXZlbnQ6OlJ1bkFuZFdhaXRGb3JTdGF0dXMoUGlwZWxpbmVTdGF0dXMgZXhwZWN0ZWQpIHsKLSAgRENIRUNLX0VRKG1lc3NhZ2VfbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotICBiYXNlOjpUaW1lciB0aW1lcihmYWxzZSwgZmFsc2UpOwotICB0aW1lci5TdGFydChGUk9NX0hFUkUsIFRlc3RUaW1lb3V0czo6YWN0aW9uX3RpbWVvdXQoKSwgYmFzZTo6QmluZCgKLSAgICAgICZXYWl0YWJsZU1lc3NhZ2VMb29wRXZlbnQ6Ok9uVGltZW91dCwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotCi0gIERDSEVDSyghc2lnbmFsZWRfKSA8PCAiQWxyZWFkeSBzaWduYWxlZCI7Ci0gIG1lc3NhZ2VfbG9vcF8tPlJ1bigpOwotICBFWFBFQ1RfVFJVRShzaWduYWxlZF8pOwotICBFWFBFQ1RfRVEoZXhwZWN0ZWQsIHN0YXR1c18pOwotfQotCi12b2lkIFdhaXRhYmxlTWVzc2FnZUxvb3BFdmVudDo6T25DYWxsYmFjayhQaXBlbGluZVN0YXR1cyBzdGF0dXMpIHsKLSAgRENIRUNLX0VRKG1lc3NhZ2VfbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotICBzaWduYWxlZF8gPSB0cnVlOwotICBzdGF0dXNfID0gc3RhdHVzOwotICBtZXNzYWdlX2xvb3BfLT5RdWl0V2hlbklkbGUoKTsKLX0KLQotdm9pZCBXYWl0YWJsZU1lc3NhZ2VMb29wRXZlbnQ6Ok9uVGltZW91dCgpIHsKLSAgRENIRUNLX0VRKG1lc3NhZ2VfbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotICBBRERfRkFJTFVSRSgpIDw8ICJUaW1lZCBvdXQgd2FpdGluZyBmb3IgbWVzc2FnZSBsb29wIHRvIHF1aXQiOwotICBtZXNzYWdlX2xvb3BfLT5RdWl0V2hlbklkbGUoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS90ZXN0X2hlbHBlcnMuaCBiL3NyYy9tZWRpYS9iYXNlL3Rlc3RfaGVscGVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzM4Njk0Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3Rlc3RfaGVscGVycy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9CQVNFX1RFU1RfSEVMUEVSU19IXwotI2RlZmluZSBNRURJQV9CQVNFX1RFU1RfSEVMUEVSU19IXwotCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvcGlwZWxpbmVfc3RhdHVzLmgiCi0jaW5jbHVkZSAidGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgiCi0KLWNsYXNzIE1lc3NhZ2VMb29wOwotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBSZXR1cm4gYSBjYWxsYmFjayB0aGF0IGV4cGVjdHMgdG8gYmUgcnVuIG9uY2UuCi1iYXNlOjpDbG9zdXJlIE5ld0V4cGVjdGVkQ2xvc3VyZSgpOwotUGlwZWxpbmVTdGF0dXNDQiBOZXdFeHBlY3RlZFN0YXR1c0NCKFBpcGVsaW5lU3RhdHVzIHN0YXR1cyk7Ci0KLS8vIEhlbHBlciBjbGFzcyBmb3IgcnVubmluZyBhIG1lc3NhZ2UgbG9vcCB1bnRpbCBhIGNhbGxiYWNrIGhhcyBydW4uIFVzZWZ1bCBmb3IKLS8vIHRlc3RpbmcgY2xhc3NlcyB0aGF0IHJ1biBvbiBtb3JlIHRoYW4gYSBzaW5nbGUgdGhyZWFkLgotLy8KLS8vIEV2ZW50cyBhcmUgaW50ZW5kZWQgZm9yIHNpbmdsZSB1c2UgYW5kIGNhbm5vdCBiZSByZXNldC4KLWNsYXNzIFdhaXRhYmxlTWVzc2FnZUxvb3BFdmVudCB7Ci0gcHVibGljOgotICBXYWl0YWJsZU1lc3NhZ2VMb29wRXZlbnQoKTsKLSAgfldhaXRhYmxlTWVzc2FnZUxvb3BFdmVudCgpOwotCi0gIC8vIFJldHVybnMgYSB0aHJlYWQtc2FmZSBjbG9zdXJlIHRoYXQgd2lsbCBzaWduYWwgfHRoaXN8IHdoZW4gZXhlY3V0ZWQuCi0gIGJhc2U6OkNsb3N1cmUgR2V0Q2xvc3VyZSgpOwotICBQaXBlbGluZVN0YXR1c0NCIEdldFBpcGVsaW5lU3RhdHVzQ0IoKTsKLQotICAvLyBSdW5zIHRoZSBjdXJyZW50IG1lc3NhZ2UgbG9vcCB1bnRpbCB8dGhpc3wgaGFzIGJlZW4gc2lnbmFsZWQuCi0gIC8vCi0gIC8vIEZhaWxzIHRoZSB0ZXN0IGlmIHRoZSB0aW1lb3V0IGlzIHJlYWNoZWQuCi0gIHZvaWQgUnVuQW5kV2FpdCgpOwotCi0gIC8vIFJ1bnMgdGhlIGN1cnJlbnQgbWVzc2FnZSBsb29wIHVudGlsIHx0aGlzfCBoYXMgYmVlbiBzaWduYWxlZCBhbmQgYXNzZXJ0cwotICAvLyB0aGF0IHRoZSB8ZXhwZWN0ZWR8IHN0YXR1cyB3YXMgcmVjZWl2ZWQuCi0gIC8vCi0gIC8vIEZhaWxzIHRoZSB0ZXN0IGlmIHRoZSB0aW1lb3V0IGlzIHJlYWNoZWQuCi0gIHZvaWQgUnVuQW5kV2FpdEZvclN0YXR1cyhQaXBlbGluZVN0YXR1cyBleHBlY3RlZCk7Ci0KLSBwcml2YXRlOgotICB2b2lkIE9uQ2FsbGJhY2soUGlwZWxpbmVTdGF0dXMgc3RhdHVzKTsKLSAgdm9pZCBPblRpbWVvdXQoKTsKLQotICBNZXNzYWdlTG9vcCogbWVzc2FnZV9sb29wXzsKLSAgYm9vbCBzaWduYWxlZF87Ci0gIFBpcGVsaW5lU3RhdHVzIHN0YXR1c187Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFdhaXRhYmxlTWVzc2FnZUxvb3BFdmVudCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX1RFU1RfSEVMUEVSU19IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvdmVjdG9yX21hdGguY2MgYi9zcmMvbWVkaWEvYmFzZS92ZWN0b3JfbWF0aC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRkOTVjZC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS92ZWN0b3JfbWF0aC5jYworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZlY3Rvcl9tYXRoLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS92ZWN0b3JfbWF0aF90ZXN0aW5nLmgiCi0KLSNpbmNsdWRlICJiYXNlL2NwdS5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJ1aWxkL2J1aWxkX2NvbmZpZy5oIgotCi0jaWYgZGVmaW5lZChBUkNIX0NQVV9YODZfRkFNSUxZKSAmJiBkZWZpbmVkKF9fU1NFX18pCi0jaW5jbHVkZSA8eG1taW50cmluLmg+Ci0jZW5kaWYKLQotbmFtZXNwYWNlIG1lZGlhIHsKLW5hbWVzcGFjZSB2ZWN0b3JfbWF0aCB7Ci0KLXZvaWQgRk1BQyhjb25zdCBmbG9hdCBzcmNbXSwgZmxvYXQgc2NhbGUsIGludCBsZW4sIGZsb2F0IGRlc3RbXSkgewotICAvLyBFbnN1cmUgfHNyY3wgYW5kIHxkZXN0fCBhcmUgMTYtYnl0ZSBhbGlnbmVkLgotICBEQ0hFQ0tfRVEoMHUsIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihzcmMpICYgKGtSZXF1aXJlZEFsaWdubWVudCAtIDEpKTsKLSAgRENIRUNLX0VRKDB1LCByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oZGVzdCkgJiAoa1JlcXVpcmVkQWxpZ25tZW50IC0gMSkpOwotCi0gIC8vIFJlbHkgb24gZnVuY3Rpb24gbGV2ZWwgc3RhdGljIGluaXRpYWxpemF0aW9uIHRvIGtlZXAgVmVjdG9yRk1BQ1Byb2MKLSAgLy8gc2VsZWN0aW9uIHRocmVhZCBzYWZlLgotICB0eXBlZGVmIHZvaWQgKCpWZWN0b3JGTUFDUHJvYykoY29uc3QgZmxvYXQgc3JjW10sIGZsb2F0IHNjYWxlLCBpbnQgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZGVzdFtdKTsKLSNpZiBkZWZpbmVkKEFSQ0hfQ1BVX1g4Nl9GQU1JTFkpICYmIGRlZmluZWQoX19TU0VfXykKLSAgc3RhdGljIGNvbnN0IFZlY3RvckZNQUNQcm9jIGtWZWN0b3JGTUFDUHJvYyA9Ci0gICAgICBiYXNlOjpDUFUoKS5oYXNfc3NlKCkgPyBGTUFDX1NTRSA6IEZNQUNfQzsKLSNlbHNlCi0gIHN0YXRpYyBjb25zdCBWZWN0b3JGTUFDUHJvYyBrVmVjdG9yRk1BQ1Byb2MgPSBGTUFDX0M7Ci0jZW5kaWYKLQotICByZXR1cm4ga1ZlY3RvckZNQUNQcm9jKHNyYywgc2NhbGUsIGxlbiwgZGVzdCk7Ci19Ci0KLXZvaWQgRk1BQ19DKGNvbnN0IGZsb2F0IHNyY1tdLCBmbG9hdCBzY2FsZSwgaW50IGxlbiwgZmxvYXQgZGVzdFtdKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpCi0gICAgZGVzdFtpXSArPSBzcmNbaV0gKiBzY2FsZTsKLX0KLQotI2lmIGRlZmluZWQoQVJDSF9DUFVfWDg2X0ZBTUlMWSkgJiYgZGVmaW5lZChfX1NTRV9fKQotdm9pZCBGTUFDX1NTRShjb25zdCBmbG9hdCBzcmNbXSwgZmxvYXQgc2NhbGUsIGludCBsZW4sIGZsb2F0IGRlc3RbXSkgewotICBfX20xMjggbV9zY2FsZSA9IF9tbV9zZXRfcHMxKHNjYWxlKTsKLSAgaW50IHJlbSA9IGxlbiAlIDQ7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuIC0gcmVtOyBpICs9IDQpIHsKLSAgICBfbW1fc3RvcmVfcHMoZGVzdCArIGksIF9tbV9hZGRfcHMoX21tX2xvYWRfcHMoZGVzdCArIGkpLAotICAgICAgICAgICAgICAgICBfbW1fbXVsX3BzKF9tbV9sb2FkX3BzKHNyYyArIGkpLCBtX3NjYWxlKSkpOwotICB9Ci0KLSAgLy8gSGFuZGxlIGFueSByZW1haW5pbmcgdmFsdWVzIHRoYXQgd291bGRuJ3QgZml0IGluIGFuIFNTRSBwYXNzLgotICBpZiAocmVtKQotICAgIEZNQUNfQyhzcmMgKyBsZW4gLSByZW0sIHNjYWxlLCByZW0sIGRlc3QgKyBsZW4gLSByZW0pOwotfQotI2VuZGlmCi0KLX0gIC8vIG5hbWVzcGFjZSB2ZWN0b3JfbWF0aAotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS92ZWN0b3JfbWF0aC5oIGIvc3JjL21lZGlhL2Jhc2UvdmVjdG9yX21hdGguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBjMzAzOS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS92ZWN0b3JfbWF0aC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9CQVNFX1ZFQ1RPUl9NQVRIX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfVkVDVE9SX01BVEhfSF8KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci1uYW1lc3BhY2UgdmVjdG9yX21hdGggewotCi0vLyBSZXF1aXJlZCBhbGlnbm1lbnQgZm9yIGlucHV0cyBhbmQgb3V0cHV0cyB0byBhbGwgdmVjdG9yIG1hdGggZnVuY3Rpb25zCi1lbnVtIHsga1JlcXVpcmVkQWxpZ25tZW50ID0gMTYgfTsKLQotLy8gTXVsdGlwbHkgZWFjaCBlbGVtZW50IG9mIHxzcmN8ICh1cCB0byB8bGVufCkgYnkgfHNjYWxlfCBhbmQgYWRkIHRvIHxkZXN0fC4KLS8vIHxzcmN8IGFuZCB8ZGVzdHwgbXVzdCBiZSBhbGlnbmVkIGJ5IGtSZXF1aXJlZEFsaWdubWVudC4KLU1FRElBX0VYUE9SVCB2b2lkIEZNQUMoY29uc3QgZmxvYXQgc3JjW10sIGZsb2F0IHNjYWxlLCBpbnQgbGVuLCBmbG9hdCBkZXN0W10pOwotCi19ICAvLyBuYW1lc3BhY2UgdmVjdG9yX21hdGgKLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0JBU0VfVkVDVE9SX01BVEhfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3ZlY3Rvcl9tYXRoX3Rlc3RpbmcuaCBiL3NyYy9tZWRpYS9iYXNlL3ZlY3Rvcl9tYXRoX3Rlc3RpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2NGI3NC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS92ZWN0b3JfbWF0aF90ZXN0aW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0JBU0VfVkVDVE9SX01BVEhfVEVTVElOR19IXwotI2RlZmluZSBNRURJQV9CQVNFX1ZFQ1RPUl9NQVRIX1RFU1RJTkdfSF8KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci1uYW1lc3BhY2UgdmVjdG9yX21hdGggewotCi0vLyBPcHRpbWl6ZWQgdmVyc2lvbnMgb2YgRk1BQygpIGZ1bmN0aW9uIGV4cG9zZWQgZm9yIHRlc3RpbmcuICBTZWUgdmVjdG9yX21hdGguaAotLy8gZm9yIGRldGFpbHMuCi1NRURJQV9FWFBPUlQgdm9pZCBGTUFDX0MoY29uc3QgZmxvYXQgc3JjW10sIGZsb2F0IHNjYWxlLCBpbnQgbGVuLCBmbG9hdCBkZXN0W10pOwotTUVESUFfRVhQT1JUIHZvaWQgRk1BQ19TU0UoY29uc3QgZmxvYXQgc3JjW10sIGZsb2F0IHNjYWxlLCBpbnQgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZGVzdFtdKTsKLQotfSAgLy8gbmFtZXNwYWNlIHZlY3Rvcl9tYXRoCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX1ZFQ1RPUl9NQVRIX1RFU1RJTkdfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3ZlY3Rvcl9tYXRoX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2Jhc2UvdmVjdG9yX21hdGhfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MzM3OGUuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvdmVjdG9yX21hdGhfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gTVNWQysrIHJlcXVpcmVzIHRoaXMgdG8gYmUgc2V0IGJlZm9yZSBhbnkgb3RoZXIgaW5jbHVkZXMgdG8gZ2V0IE1fUEkuCi0jZGVmaW5lIF9VU0VfTUFUSF9ERUZJTkVTCi0jaW5jbHVkZSA8Y21hdGg+Ci0KLSNpbmNsdWRlICJiYXNlL2NvbW1hbmRfbGluZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L2FsaWduZWRfbWVtb3J5LmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgImJhc2Uvc3RyaW5nX251bWJlcl9jb252ZXJzaW9ucy5oIgotI2luY2x1ZGUgImJhc2UvdGltZS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmVjdG9yX21hdGguaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZlY3Rvcl9tYXRoX3Rlc3RpbmcuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgYmFzZTo6VGltZVRpY2tzOwotdXNpbmcgc3RkOjpmaWxsOwotCi0vLyBDb21tYW5kIGxpbmUgc3dpdGNoIGZvciBydW50aW1lIGFkanVzdG1lbnQgb2YgYmVuY2htYXJrIGl0ZXJhdGlvbnMuCi1zdGF0aWMgY29uc3QgY2hhciBrQmVuY2htYXJrSXRlcmF0aW9uc1tdID0gInZlY3Rvci1tYXRoLWl0ZXJhdGlvbnMiOwotc3RhdGljIGNvbnN0IGludCBrRGVmYXVsdEl0ZXJhdGlvbnMgPSAxMDsKLQotLy8gRGVmYXVsdCB0ZXN0IHZhbHVlcy4KLXN0YXRpYyBjb25zdCBmbG9hdCBrU2NhbGUgPSAwLjU7Ci1zdGF0aWMgY29uc3QgZmxvYXQga0lucHV0RmlsbFZhbHVlID0gMS4wOwotc3RhdGljIGNvbnN0IGZsb2F0IGtPdXRwdXRGaWxsVmFsdWUgPSAzLjA7Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIFZlY3Rvck1hdGhUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IGludCBrVmVjdG9yU2l6ZSA9IDgxOTI7Ci0KLSAgVmVjdG9yTWF0aFRlc3QoKSB7Ci0gICAgLy8gSW5pdGlhbGl6ZSBpbnB1dCBhbmQgb3V0cHV0IHZlY3RvcnMuCi0gICAgaW5wdXRfdmVjdG9yLnJlc2V0KHN0YXRpY19jYXN0PGZsb2F0Kj4oYmFzZTo6QWxpZ25lZEFsbG9jKAotICAgICAgICBzaXplb2YoZmxvYXQpICoga1ZlY3RvclNpemUsIHZlY3Rvcl9tYXRoOjprUmVxdWlyZWRBbGlnbm1lbnQpKSk7Ci0gICAgb3V0cHV0X3ZlY3Rvci5yZXNldChzdGF0aWNfY2FzdDxmbG9hdCo+KGJhc2U6OkFsaWduZWRBbGxvYygKLSAgICAgICAgc2l6ZW9mKGZsb2F0KSAqIGtWZWN0b3JTaXplLCB2ZWN0b3JfbWF0aDo6a1JlcXVpcmVkQWxpZ25tZW50KSkpOwotICB9Ci0KLSAgdm9pZCBGaWxsVGVzdFZlY3RvcnMoZmxvYXQgaW5wdXQsIGZsb2F0IG91dHB1dCkgewotICAgIC8vIFNldHVwIGlucHV0IGFuZCBvdXRwdXQgdmVjdG9ycy4KLSAgICBmaWxsKGlucHV0X3ZlY3Rvci5nZXQoKSwgaW5wdXRfdmVjdG9yLmdldCgpICsga1ZlY3RvclNpemUsIGlucHV0KTsKLSAgICBmaWxsKG91dHB1dF92ZWN0b3IuZ2V0KCksIG91dHB1dF92ZWN0b3IuZ2V0KCkgKyBrVmVjdG9yU2l6ZSwgb3V0cHV0KTsKLSAgfQotCi0gIHZvaWQgVmVyaWZ5T3V0cHV0KGZsb2F0IHZhbHVlKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrVmVjdG9yU2l6ZTsgKytpKQotICAgICAgQVNTRVJUX0ZMT0FUX0VRKG91dHB1dF92ZWN0b3IuZ2V0KClbaV0sIHZhbHVlKTsKLSAgfQotCi0gIGludCBCZW5jaG1hcmtJdGVyYXRpb25zKCkgewotICAgIGludCB2ZWN0b3JfbWF0aF9pdGVyYXRpb25zID0ga0RlZmF1bHRJdGVyYXRpb25zOwotICAgIHN0ZDo6c3RyaW5nIGl0ZXJhdGlvbnMoCi0gICAgICAgIENvbW1hbmRMaW5lOjpGb3JDdXJyZW50UHJvY2VzcygpLT5HZXRTd2l0Y2hWYWx1ZUFTQ0lJKAotICAgICAgICAgICAga0JlbmNobWFya0l0ZXJhdGlvbnMpKTsKLSAgICBpZiAoIWl0ZXJhdGlvbnMuZW1wdHkoKSkKLSAgICAgIGJhc2U6OlN0cmluZ1RvSW50KGl0ZXJhdGlvbnMsICZ2ZWN0b3JfbWF0aF9pdGVyYXRpb25zKTsKLSAgICByZXR1cm4gdmVjdG9yX21hdGhfaXRlcmF0aW9uczsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBpbnQgYmVuY2htYXJrX2l0ZXJhdGlvbnM7Ci0gIHNjb3BlZF9wdHJfbWFsbG9jPGZsb2F0LCBiYXNlOjpTY29wZWRQdHJBbGlnbmVkRnJlZT4gaW5wdXRfdmVjdG9yOwotICBzY29wZWRfcHRyX21hbGxvYzxmbG9hdCwgYmFzZTo6U2NvcGVkUHRyQWxpZ25lZEZyZWU+IG91dHB1dF92ZWN0b3I7Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFZlY3Rvck1hdGhUZXN0KTsKLX07Ci0KLS8vIEVuc3VyZSBlYWNoIG9wdGltaXplZCB2ZWN0b3JfbWF0aDo6Rk1BQygpIG1ldGhvZCByZXR1cm5zIHRoZSBzYW1lIHZhbHVlLgotVEVTVF9GKFZlY3Rvck1hdGhUZXN0LCBGTUFDKSB7Ci0gIHN0YXRpYyBjb25zdCBmbG9hdCBrUmVzdWx0ID0ga0lucHV0RmlsbFZhbHVlICoga1NjYWxlICsga091dHB1dEZpbGxWYWx1ZTsKLQotICB7Ci0gICAgU0NPUEVEX1RSQUNFKCJGTUFDIik7Ci0gICAgRmlsbFRlc3RWZWN0b3JzKGtJbnB1dEZpbGxWYWx1ZSwga091dHB1dEZpbGxWYWx1ZSk7Ci0gICAgdmVjdG9yX21hdGg6OkZNQUMoCi0gICAgICAgIGlucHV0X3ZlY3Rvci5nZXQoKSwga1NjYWxlLCBrVmVjdG9yU2l6ZSwgb3V0cHV0X3ZlY3Rvci5nZXQoKSk7Ci0gICAgVmVyaWZ5T3V0cHV0KGtSZXN1bHQpOwotICB9Ci0KLSAgewotICAgIFNDT1BFRF9UUkFDRSgiRk1BQ19DIik7Ci0gICAgRmlsbFRlc3RWZWN0b3JzKGtJbnB1dEZpbGxWYWx1ZSwga091dHB1dEZpbGxWYWx1ZSk7Ci0gICAgdmVjdG9yX21hdGg6OkZNQUNfQygKLSAgICAgICAgaW5wdXRfdmVjdG9yLmdldCgpLCBrU2NhbGUsIGtWZWN0b3JTaXplLCBvdXRwdXRfdmVjdG9yLmdldCgpKTsKLSAgICBWZXJpZnlPdXRwdXQoa1Jlc3VsdCk7Ci0gIH0KLQotI2lmIGRlZmluZWQoQVJDSF9DUFVfWDg2X0ZBTUlMWSkgJiYgZGVmaW5lZChfX1NTRV9fKQotICB7Ci0gICAgU0NPUEVEX1RSQUNFKCJGTUFDX1NTRSIpOwotICAgIEZpbGxUZXN0VmVjdG9ycyhrSW5wdXRGaWxsVmFsdWUsIGtPdXRwdXRGaWxsVmFsdWUpOwotICAgIHZlY3Rvcl9tYXRoOjpGTUFDX1NTRSgKLSAgICAgICAgaW5wdXRfdmVjdG9yLmdldCgpLCBrU2NhbGUsIGtWZWN0b3JTaXplLCBvdXRwdXRfdmVjdG9yLmdldCgpKTsKLSAgICBWZXJpZnlPdXRwdXQoa1Jlc3VsdCk7Ci0gIH0KLSNlbmRpZgotfQotCi0vLyBCZW5jaG1hcmsgZm9yIGVhY2ggb3B0aW1pemVkIHZlY3Rvcl9tYXRoOjpGTUFDKCkgbWV0aG9kLiAgT3JpZ2luYWwgYmVuY2htYXJrcwotLy8gd2VyZSBydW4gd2l0aCAtLXZlY3Rvci1mbWFjLWl0ZXJhdGlvbnM9MjAwMDAwLgotVEVTVF9GKFZlY3Rvck1hdGhUZXN0LCBGTUFDQmVuY2htYXJrKSB7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0JlbmNobWFya0l0ZXJhdGlvbnMgPSBCZW5jaG1hcmtJdGVyYXRpb25zKCk7Ci0KLSAgcHJpbnRmKCJCZW5jaG1hcmtpbmcgJWQgaXRlcmF0aW9uczpcbiIsIGtCZW5jaG1hcmtJdGVyYXRpb25zKTsKLQotICAvLyBCZW5jaG1hcmsgRk1BQ19DKCkuCi0gIEZpbGxUZXN0VmVjdG9ycyhrSW5wdXRGaWxsVmFsdWUsIGtPdXRwdXRGaWxsVmFsdWUpOwotICBUaW1lVGlja3Mgc3RhcnQgPSBUaW1lVGlja3M6OkhpZ2hSZXNOb3coKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQmVuY2htYXJrSXRlcmF0aW9uczsgKytpKSB7Ci0gICAgdmVjdG9yX21hdGg6OkZNQUNfQygKLSAgICAgICAgaW5wdXRfdmVjdG9yLmdldCgpLCBrU2NhbGUsIGtWZWN0b3JTaXplLCBvdXRwdXRfdmVjdG9yLmdldCgpKTsKLSAgfQotICBkb3VibGUgdG90YWxfdGltZV9jX21zID0gKFRpbWVUaWNrczo6SGlnaFJlc05vdygpIC0gc3RhcnQpLkluTWlsbGlzZWNvbmRzRigpOwotICBwcmludGYoIkZNQUNfQyB0b29rICUuMmZtcy5cbiIsIHRvdGFsX3RpbWVfY19tcyk7Ci0KLSNpZiBkZWZpbmVkKEFSQ0hfQ1BVX1g4Nl9GQU1JTFkpICYmIGRlZmluZWQoX19TU0VfXykKLSAgLy8gQmVuY2htYXJrIEZNQUNfU1NFKCkgd2l0aCB1bmFsaWduZWQgc2l6ZS4KLSAgQVNTRVJUX05FKChrVmVjdG9yU2l6ZSAtIDEpICUgKHZlY3Rvcl9tYXRoOjprUmVxdWlyZWRBbGlnbm1lbnQgLwotICAgICAgICAgICAgc2l6ZW9mKGZsb2F0KSksIDBVKTsKLSAgRmlsbFRlc3RWZWN0b3JzKGtJbnB1dEZpbGxWYWx1ZSwga091dHB1dEZpbGxWYWx1ZSk7Ci0gIHN0YXJ0ID0gVGltZVRpY2tzOjpIaWdoUmVzTm93KCk7Ci0gIGZvciAoaW50IGogPSAwOyBqIDwga0JlbmNobWFya0l0ZXJhdGlvbnM7ICsraikgewotICAgIHZlY3Rvcl9tYXRoOjpGTUFDX1NTRSgKLSAgICAgICAgaW5wdXRfdmVjdG9yLmdldCgpLCBrU2NhbGUsIGtWZWN0b3JTaXplIC0gMSwgb3V0cHV0X3ZlY3Rvci5nZXQoKSk7Ci0gIH0KLSAgZG91YmxlIHRvdGFsX3RpbWVfc3NlX3VuYWxpZ25lZF9tcyA9Ci0gICAgICAoVGltZVRpY2tzOjpIaWdoUmVzTm93KCkgLSBzdGFydCkuSW5NaWxsaXNlY29uZHNGKCk7Ci0gIHByaW50ZigiRk1BQ19TU0UgKHVuYWxpZ25lZCBzaXplKSB0b29rICUuMmZtczsgd2hpY2ggaXMgJS4yZnggZmFzdGVyIHRoYW4iCi0gICAgICAgICAiIEZNQUNfQy5cbiIsIHRvdGFsX3RpbWVfc3NlX3VuYWxpZ25lZF9tcywKLSAgICAgICAgIHRvdGFsX3RpbWVfY19tcyAvIHRvdGFsX3RpbWVfc3NlX3VuYWxpZ25lZF9tcyk7Ci0KLSAgLy8gQmVuY2htYXJrIEZNQUNfU1NFKCkgd2l0aCBhbGlnbmVkIHNpemUuCi0gIEFTU0VSVF9FUShrVmVjdG9yU2l6ZSAlICh2ZWN0b3JfbWF0aDo6a1JlcXVpcmVkQWxpZ25tZW50IC8gc2l6ZW9mKGZsb2F0KSksCi0gICAgICAgICAgICAwVSk7Ci0gIEZpbGxUZXN0VmVjdG9ycyhrSW5wdXRGaWxsVmFsdWUsIGtPdXRwdXRGaWxsVmFsdWUpOwotICBzdGFydCA9IFRpbWVUaWNrczo6SGlnaFJlc05vdygpOwotICBmb3IgKGludCBqID0gMDsgaiA8IGtCZW5jaG1hcmtJdGVyYXRpb25zOyArK2opIHsKLSAgICB2ZWN0b3JfbWF0aDo6Rk1BQ19TU0UoCi0gICAgICAgIGlucHV0X3ZlY3Rvci5nZXQoKSwga1NjYWxlLCBrVmVjdG9yU2l6ZSwgb3V0cHV0X3ZlY3Rvci5nZXQoKSk7Ci0gIH0KLSAgZG91YmxlIHRvdGFsX3RpbWVfc3NlX2FsaWduZWRfbXMgPQotICAgICAgKFRpbWVUaWNrczo6SGlnaFJlc05vdygpIC0gc3RhcnQpLkluTWlsbGlzZWNvbmRzRigpOwotICBwcmludGYoIkZNQUNfU1NFIChhbGlnbmVkIHNpemUpIHRvb2sgJS4yZm1zOyB3aGljaCBpcyAlLjJmeCBmYXN0ZXIgdGhhbiIKLSAgICAgICAgICIgRk1BQ19DIGFuZCAlLjJmeCBmYXN0ZXIgdGhhbiBGTUFDX1NTRSAodW5hbGlnbmVkIHNpemUpLlxuIiwKLSAgICAgICAgIHRvdGFsX3RpbWVfc3NlX2FsaWduZWRfbXMsIHRvdGFsX3RpbWVfY19tcyAvIHRvdGFsX3RpbWVfc3NlX2FsaWduZWRfbXMsCi0gICAgICAgICB0b3RhbF90aW1lX3NzZV91bmFsaWduZWRfbXMgLyB0b3RhbF90aW1lX3NzZV9hbGlnbmVkX21zKTsKLSNlbmRpZgotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXIuY2MgYi9zcmMvbWVkaWEvYmFzZS92aWRlb19kZWNvZGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzdjNGI3Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb19kZWNvZGVyLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLVZpZGVvRGVjb2Rlcjo6VmlkZW9EZWNvZGVyKCkge30KLQotVmlkZW9EZWNvZGVyOjp+VmlkZW9EZWNvZGVyKCkge30KLQotYm9vbCBWaWRlb0RlY29kZXI6Okhhc0FscGhhKCkgY29uc3QgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvdmlkZW9fZGVjb2Rlci5oIGIvc3JjL21lZGlhL2Jhc2UvdmlkZW9fZGVjb2Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzgyMWU3Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfQkFTRV9WSURFT19ERUNPREVSX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfVklERU9fREVDT0RFUl9IXwotCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9waXBlbGluZV9zdGF0dXMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotI2luY2x1ZGUgInVpL2dmeC9zaXplLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIERlbXV4ZXJTdHJlYW07Ci1jbGFzcyBWaWRlb0ZyYW1lOwotCi1jbGFzcyBNRURJQV9FWFBPUlQgVmlkZW9EZWNvZGVyCi0gICAgOiBwdWJsaWMgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8VmlkZW9EZWNvZGVyPiB7Ci0gcHVibGljOgotICAvLyBTdGF0dXMgY29kZXMgZm9yIHJlYWQgb3BlcmF0aW9ucyBvbiBWaWRlb0RlY29kZXIuCi0gIGVudW0gU3RhdHVzIHsKLSAgICBrT2ssICAvLyBFdmVyeXRoaW5nIHdlbnQgYXMgcGxhbm5lZC4KLSAgICBrRGVjb2RlRXJyb3IsICAvLyBEZWNvZGluZyBlcnJvciBoYXBwZW5lZC4KLSAgICBrRGVjcnlwdEVycm9yICAvLyBEZWNyeXB0aW5nIGVycm9yIGhhcHBlbmVkLgotICB9OwotCi0gIC8vIEluaXRpYWxpemVzIGEgVmlkZW9EZWNvZGVyIHdpdGggdGhlIGdpdmVuIERlbXV4ZXJTdHJlYW0sIGV4ZWN1dGluZyB0aGUKLSAgLy8gfHN0YXR1c19jYnwgdXBvbiBjb21wbGV0aW9uLgotICAvLyB8c3RhdGlzdGljc19jYnwgaXMgdXNlZCB0byB1cGRhdGUgdGhlIGdsb2JhbCBwaXBlbGluZSBzdGF0aXN0aWNzLgotICAvLyBOb3RlOiBObyBWaWRlb0RlY29kZXIgY2FsbHMgc2hvdWxkIGJlIG1hZGUgYmVmb3JlIHxzdGF0dXNfY2J8IGlzIGV4ZWN1dGVkLgotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShjb25zdCBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+JiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIHN0YXR1c19jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdGlzdGljc0NCJiBzdGF0aXN0aWNzX2NiKSA9IDA7Ci0KLSAgLy8gUmVxdWVzdHMgYSBmcmFtZSB0byBiZSBkZWNvZGVkLiBUaGUgc3RhdHVzIG9mIHRoZSBkZWNvZGVyIGFuZCBkZWNvZGVkIGZyYW1lCi0gIC8vIGFyZSByZXR1cm5lZCB2aWEgdGhlIHByb3ZpZGVkIGNhbGxiYWNrLiBPbmx5IG9uZSByZWFkIG1heSBiZSBpbiBmbGlnaHQgYXQKLSAgLy8gYW55IGdpdmVuIHRpbWUuCi0gIC8vCi0gIC8vIEltcGxlbWVudGF0aW9ucyBndWFyYW50ZWUgdGhhdCB0aGUgY2FsbGJhY2sgd2lsbCBub3QgYmUgY2FsbGVkIGZyb20gd2l0aGluCi0gIC8vIHRoaXMgbWV0aG9kLgotICAvLwotICAvLyBJZiB0aGUgcmV0dXJuZWQgc3RhdHVzIGlzIG5vdCBrT2ssIHNvbWUgZXJyb3IgaGFzIG9jY3VycmVkIGluIHRoZSB2aWRlbwotICAvLyBkZWNvZGVyLiBJbiB0aGlzIGNhc2UsIHRoZSByZXR1cm5lZCBmcmFtZSBzaG91bGQgYWx3YXlzIGJlIE5VTEwuCi0gIC8vCi0gIC8vIE90aGVyd2lzZSwgdGhlIHZpZGVvIGRlY29kZXIgaXMgaW4gZ29vZCBzaGFwZS4gSW4gdGhpcyBjYXNlLCBOb24tTlVMTAotICAvLyBmcmFtZXMgY29udGFpbiBkZWNvZGVkIHZpZGVvIGRhdGEgb3IgbWF5IGluZGljYXRlIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4KLSAgLy8gTlVMTCB2aWRlbyBmcmFtZXMgaW5kaWNhdGUgYW4gYWJvcnRlZCByZWFkLiBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlCi0gIC8vIERlbXV4ZXJTdHJlYW0gZ2V0cyBmbHVzaGVkIGFuZCBkb2Vzbid0IGhhdmUgYW55IG1vcmUgZGF0YSB0byByZXR1cm4uCi0gIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZChTdGF0dXMsIGNvbnN0IHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4mKT4gUmVhZENCOwotICB2aXJ0dWFsIHZvaWQgUmVhZChjb25zdCBSZWFkQ0ImIHJlYWRfY2IpID0gMDsKLQotICAvLyBSZXNldHMgZGVjb2RlciBzdGF0ZSwgZnVsZmlsbGluZyBhbGwgcGVuZGluZyBSZWFkQ0IgYW5kIGRyb3BwaW5nIGV4dHJhCi0gIC8vIHF1ZXVlZCBkZWNvZGVkIGRhdGEuIEFmdGVyIHRoaXMgY2FsbCwgdGhlIGRlY29kZXIgaXMgYmFjayB0byBhbiBpbml0aWFsaXplZAotICAvLyBjbGVhbiBzdGF0ZS4KLSAgLy8gTm90ZTogTm8gVmlkZW9EZWNvZGVyIGNhbGxzIHNob3VsZCBiZSBtYWRlIGJlZm9yZSB8Y2xvc3VyZXwgaXMgZXhlY3V0ZWQuCi0gIHZpcnR1YWwgdm9pZCBSZXNldChjb25zdCBiYXNlOjpDbG9zdXJlJiBjbG9zdXJlKSA9IDA7Ci0KLSAgLy8gU3RvcHMgZGVjb2RlciwgZmlyZXMgYW55IHBlbmRpbmcgY2FsbGJhY2tzIGFuZCBzZXRzIHRoZSBkZWNvZGVyIHRvIGFuCi0gIC8vIHVuaW5pdGlhbGl6ZWQgc3RhdGUuIEEgVmlkZW9EZWNvZGVyIGNhbm5vdCBiZSByZS1pbml0aWFsaXplZCBhZnRlciBpdCBoYXMKLSAgLy8gYmVlbiBzdG9wcGVkLgotICAvLyBOb3RlIHRoYXQgaWYgSW5pdGlhbGl6ZSgpIGhhcyBiZWVuIGNhbGxlZCwgU3RvcCgpIG11c3QgYmUgY2FsbGVkIGFuZAotICAvLyBjb21wbGV0ZSBiZWZvcmUgZGVsZXRpbmcgdGhlIGRlY29kZXIuCi0gIHZpcnR1YWwgdm9pZCBTdG9wKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNsb3N1cmUpID0gMDsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIG91dHB1dCBmb3JtYXQgaGFzIGFuIGFscGhhIGNoYW5uZWwuIE1vc3QgZm9ybWF0cyBkbyBub3QKLSAgLy8gaGF2ZSBhbHBoYSBzbyB0aGUgZGVmYXVsdCBpcyBmYWxzZS4gT3ZlcnJpZGUgYW5kIHJldHVybiB0cnVlIGZvciBkZWNvZGVycwotICAvLyB0aGF0IHJldHVybiBmb3JtYXRzIHdpdGggYW4gYWxwaGEgY2hhbm5lbC4KLSAgdmlydHVhbCBib29sIEhhc0FscGhhKCkgY29uc3Q7Ci0KLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0gIC8vIE5vdGlmeSB0aGUgZGVjb2RlciB0aGF0IHdlIGFyZSBnb2luZyB0byBvdmVyZmxvdyBpZiB0aGUgZGVjb2RlciBrZWVwcwotICAvLyB3b3JraW5nIGF0IHRoZSBjdXJyZW50IHNwZWVkLiAgVGhlIGRlY29kZXIgc2hvdWxkIHRyeSB0byBkZWNvZGUgZmFzdGVyIG9yCi0gIC8vIGV2ZW4gZHJvcCBmcmFtZXMgaWYgcG9zc2libGUuCi0gIHZpcnR1YWwgdm9pZCBOZWFybHlVbmRlcmZsb3coKSB7fQotICAvLyBOb3RpZnkgdGhlIGRlY29kZXIgdGhhdCB3ZSBoYXZlIGVub3VnaCBmcmFtZXMgY2FjaGVkIGFuZCBubyBsb25nZXIgbmVlZCB0bwotICAvLyBzYWNyaWZpY2UgcXVhbGl0eSBmb3Igc3BlZWQuICBOb3RlIHRoYXQgaXQgZG9lc24ndCBtZWFuIHRoYXQgdGhlIGRlY29kZXIgbm8KLSAgLy8gbG9uZ2VyIG5lZWRzIHRvIGRlY29kZSBtb3JlIGZyYW1lcy4gIFRoZSBkZWNvZGluZyBvZiBmcmFtZXMgaXMgY29udHJvbGxlZAotICAvLyBieSBSZWFkKCkgYW5kIHRoZSBkZWNvZGVyIHNob3VsZCBrZWVwIGRlY29kaW5nIHdoZW4gdGhlcmUgaXMgcGVuZGluZyByZWFkLgotICB2aXJ0dWFsIHZvaWQgSGF2ZUVub3VnaEZyYW1lcygpIHt9Ci0jZW5kaWYgIC8vIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLQotIHByb3RlY3RlZDoKLSAgZnJpZW5kIGNsYXNzIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPFZpZGVvRGVjb2Rlcj47Ci0gIHZpcnR1YWwgflZpZGVvRGVjb2RlcigpOwotICBWaWRlb0RlY29kZXIoKTsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihWaWRlb0RlY29kZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQkFTRV9WSURFT19ERUNPREVSX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS92aWRlb19kZWNvZGVyX2NvbmZpZy5jYyBiL3NyYy9tZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXJfY29uZmlnLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDAwNTVmLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXJfY29uZmlnLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXJfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL21ldHJpY3MvaGlzdG9ncmFtLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb190eXBlcy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1WaWRlb0RlY29kZXJDb25maWc6OlZpZGVvRGVjb2RlckNvbmZpZygpCi0gICAgOiBjb2RlY18oa1Vua25vd25WaWRlb0NvZGVjKSwKLSAgICAgIHByb2ZpbGVfKFZJREVPX0NPREVDX1BST0ZJTEVfVU5LTk9XTiksCi0gICAgICBmb3JtYXRfKFZpZGVvRnJhbWU6OklOVkFMSUQpLAotICAgICAgZXh0cmFfZGF0YV9zaXplXygwKSwKLSAgICAgIGlzX2VuY3J5cHRlZF8oZmFsc2UpLAotICAgICAgY29sb3Jfc3BhY2VfKENPTE9SX1NQQUNFX1VOU1BFQ0lGSUVEKSB7fQotCi1WaWRlb0RlY29kZXJDb25maWc6OlZpZGVvRGVjb2RlckNvbmZpZyhWaWRlb0NvZGVjIGNvZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9Db2RlY1Byb2ZpbGUgcHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvRnJhbWU6OkZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclNwYWNlIGNvbG9yX3NwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Z4OjpTaXplJiBjb2RlZF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Z4OjpSZWN0JiB2aXNpYmxlX3JlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnZng6OlNpemUmIG5hdHVyYWxfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBleHRyYV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGV4dHJhX2RhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZW5jcnlwdGVkKSB7Ci0gIEluaXRpYWxpemUoY29kZWMsIHByb2ZpbGUsIGZvcm1hdCwgY29sb3Jfc3BhY2UsIGNvZGVkX3NpemUsIHZpc2libGVfcmVjdCwKLSAgICAgICAgICAgICBuYXR1cmFsX3NpemUsIGV4dHJhX2RhdGEsIGV4dHJhX2RhdGFfc2l6ZSwgaXNfZW5jcnlwdGVkLCB0cnVlKTsKLX0KLQotVmlkZW9EZWNvZGVyQ29uZmlnOjp+VmlkZW9EZWNvZGVyQ29uZmlnKCkge30KLQotLy8gU29tZSB2aWRlb3MganVzdCB3YW50IHRvIHdhdGNoIHRoZSB3b3JsZCBidXJuLCB3aXRoIGEgaGVpZ2h0IG9mIDA7IGNhcCB0aGUKLS8vICJpbmZpbml0ZSIgYXNwZWN0IHJhdGlvIHJlc3VsdGluZy4KLXN0YXRpYyBjb25zdCBpbnQga0luZmluaXRlUmF0aW8gPSA5OTk5OTsKLQotLy8gQ29tbW9uIGFzcGVjdCByYXRpb3MgKG11bHRpcGxpZWQgYnkgMTAwIGFuZCB0cnVuY2F0ZWQpIHVzZWQgZm9yIGhpc3RvZ3JhbW1pbmcKLS8vIHZpZGVvIHNpemVzLiAgVGhlc2Ugd2VyZSB0YWtlbiBvbiAyMDExMTEwMyBmcm9tCi0vLyBodHRwOi8vd2lraXBlZGlhLm9yZy93aWtpL0FzcGVjdF9yYXRpb18oaW1hZ2UpI1ByZXZpb3VzX2FuZF9jdXJyZW50bHlfdXNlZF9hc3BlY3RfcmF0aW9zCi1zdGF0aWMgY29uc3QgaW50IGtDb21tb25Bc3BlY3RSYXRpb3MxMDBbXSA9IHsKLSAgMTAwLCAxMTUsIDEzMywgMTM3LCAxNDMsIDE1MCwgMTU1LCAxNjAsIDE2NiwgMTc1LCAxNzcsIDE4NSwgMjAwLCAyMTAsIDIyMCwKLSAgMjIxLCAyMzUsIDIzNywgMjQwLCAyNTUsIDI1OSwgMjY2LCAyNzYsIDI5MywgNDAwLCAxMjAwLCBrSW5maW5pdGVSYXRpbywKLX07Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+ICAvLyBUIGhhcyBpbnQgd2lkdGgoKSAmIGhlaWdodCgpIG1ldGhvZHMuCi1zdGF0aWMgdm9pZCBVbWFIaXN0b2dyYW1Bc3BlY3RSYXRpbyhjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBUJiBzaXplKSB7Ci0gIFVNQV9ISVNUT0dSQU1fQ1VTVE9NX0VOVU1FUkFUSU9OKAotICAgICAgbmFtZSwKLSAgICAgIC8vIEludGVudGlvbmFsbHkgdXNlIGludGVnZXIgZGl2aXNpb24gdG8gdHJ1bmNhdGUgdGhlIHJlc3VsdC4KLSAgICAgIHNpemUuaGVpZ2h0KCkgPyAoc2l6ZS53aWR0aCgpICogMTAwKSAvIHNpemUuaGVpZ2h0KCkgOiBrSW5maW5pdGVSYXRpbywKLSAgICAgIGJhc2U6OkN1c3RvbUhpc3RvZ3JhbTo6QXJyYXlUb0N1c3RvbVJhbmdlcygKLSAgICAgICAgICBrQ29tbW9uQXNwZWN0UmF0aW9zMTAwLCBhcnJheXNpemUoa0NvbW1vbkFzcGVjdFJhdGlvczEwMCkpKTsKLX0KLQotdm9pZCBWaWRlb0RlY29kZXJDb25maWc6OkluaXRpYWxpemUoVmlkZW9Db2RlYyBjb2RlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvQ29kZWNQcm9maWxlIHByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0ZyYW1lOjpGb3JtYXQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JTcGFjZSBjb2xvcl9zcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgY29kZWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdmeDo6UmVjdCYgdmlzaWJsZV9yZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Z4OjpTaXplJiBuYXR1cmFsX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogZXh0cmFfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBleHRyYV9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2VuY3J5cHRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVjb3JkX3N0YXRzKSB7Ci0gIENIRUNLKChleHRyYV9kYXRhX3NpemUgIT0gMCkgPT0gKGV4dHJhX2RhdGEgIT0gTlVMTCkpOwotCi0gIGlmIChyZWNvcmRfc3RhdHMpIHsKLSAgICBVTUFfSElTVE9HUkFNX0VOVU1FUkFUSU9OKCJNZWRpYS5WaWRlb0NvZGVjIiwgY29kZWMsIGtWaWRlb0NvZGVjTWF4ICsgMSk7Ci0gICAgLy8gRHJvcCBVTktOT1dOIGJlY2F1c2UgVV9IX0UoKSB1c2VzIG9uZSBidWNrZXQgZm9yIGFsbCB2YWx1ZXMgbGVzcyB0aGFuIDEuCi0gICAgaWYgKHByb2ZpbGUgPj0gMCkgewotICAgICAgVU1BX0hJU1RPR1JBTV9FTlVNRVJBVElPTigiTWVkaWEuVmlkZW9Db2RlY1Byb2ZpbGUiLCBwcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWSURFT19DT0RFQ19QUk9GSUxFX01BWCArIDEpOwotICAgIH0KLSAgICBVTUFfSElTVE9HUkFNX0NPVU5UU18xMDAwMCgiTWVkaWEuVmlkZW9Db2RlZFdpZHRoIiwgY29kZWRfc2l6ZS53aWR0aCgpKTsKLSAgICBVbWFIaXN0b2dyYW1Bc3BlY3RSYXRpbygiTWVkaWEuVmlkZW9Db2RlZEFzcGVjdFJhdGlvIiwgY29kZWRfc2l6ZSk7Ci0gICAgVU1BX0hJU1RPR1JBTV9DT1VOVFNfMTAwMDAoIk1lZGlhLlZpZGVvVmlzaWJsZVdpZHRoIiwgdmlzaWJsZV9yZWN0LndpZHRoKCkpOwotICAgIFVtYUhpc3RvZ3JhbUFzcGVjdFJhdGlvKCJNZWRpYS5WaWRlb1Zpc2libGVBc3BlY3RSYXRpbyIsIHZpc2libGVfcmVjdCk7Ci0gIH0KLQotICBjb2RlY18gPSBjb2RlYzsKLSAgcHJvZmlsZV8gPSBwcm9maWxlOwotICBmb3JtYXRfID0gZm9ybWF0OwotICBjb2xvcl9zcGFjZV8gPSBjb2xvcl9zcGFjZTsKLSAgY29kZWRfc2l6ZV8gPSBjb2RlZF9zaXplOwotICB2aXNpYmxlX3JlY3RfID0gdmlzaWJsZV9yZWN0OwotICBuYXR1cmFsX3NpemVfID0gbmF0dXJhbF9zaXplOwotICBleHRyYV9kYXRhX3NpemVfID0gZXh0cmFfZGF0YV9zaXplOwotCi0gIGlmIChleHRyYV9kYXRhX3NpemVfID4gMCkgewotICAgIGV4dHJhX2RhdGFfLnJlc2V0KG5ldyB1aW50OFtleHRyYV9kYXRhX3NpemVfXSk7Ci0gICAgbWVtY3B5KGV4dHJhX2RhdGFfLmdldCgpLCBleHRyYV9kYXRhLCBleHRyYV9kYXRhX3NpemVfKTsKLSAgfSBlbHNlIHsKLSAgICBleHRyYV9kYXRhXy5yZXNldCgpOwotICB9Ci0KLSAgaXNfZW5jcnlwdGVkXyA9IGlzX2VuY3J5cHRlZDsKLQotICBzd2l0Y2ggKGNvbG9yX3NwYWNlKSB7Ci0gICAgY2FzZSBDT0xPUl9TUEFDRV9KUEVHOgotICAgICAgd2VibV9jb2xvcl9tZXRhZGF0YV8uY29sb3Jfc3BhY2UgPSBnZng6OkNvbG9yU3BhY2U6OkNyZWF0ZUpwZWcoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ09MT1JfU1BBQ0VfSERfUkVDNzA5OgotICAgICAgd2VibV9jb2xvcl9tZXRhZGF0YV8uY29sb3Jfc3BhY2UgPSBnZng6OkNvbG9yU3BhY2U6OkNyZWF0ZVJFQzcwOSgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDT0xPUl9TUEFDRV9TRF9SRUM2MDE6Ci0gICAgICB3ZWJtX2NvbG9yX21ldGFkYXRhXy5jb2xvcl9zcGFjZSA9IGdmeDo6Q29sb3JTcGFjZTo6Q3JlYXRlUkVDNjAxKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENPTE9SX1NQQUNFX1VOU1BFQ0lGSUVEOgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIE5PVFJFQUNIRUQoKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgVmlkZW9EZWNvZGVyQ29uZmlnOjpDb3B5RnJvbShjb25zdCBWaWRlb0RlY29kZXJDb25maWcmIHZpZGVvX2NvbmZpZykgewotICBJbml0aWFsaXplKHZpZGVvX2NvbmZpZy5jb2RlYygpLCB2aWRlb19jb25maWcucHJvZmlsZSgpLAotICAgICAgICAgICAgIHZpZGVvX2NvbmZpZy5mb3JtYXQoKSwgdmlkZW9fY29uZmlnLmNvbG9yX3NwYWNlXywKLSAgICAgICAgICAgICB2aWRlb19jb25maWcuY29kZWRfc2l6ZSgpLCB2aWRlb19jb25maWcudmlzaWJsZV9yZWN0KCksCi0gICAgICAgICAgICAgdmlkZW9fY29uZmlnLm5hdHVyYWxfc2l6ZSgpLCB2aWRlb19jb25maWcuZXh0cmFfZGF0YSgpLAotICAgICAgICAgICAgIHZpZGVvX2NvbmZpZy5leHRyYV9kYXRhX3NpemUoKSwgdmlkZW9fY29uZmlnLmlzX2VuY3J5cHRlZCgpLAotICAgICAgICAgICAgIGZhbHNlKTsKLSAgd2VibV9jb2xvcl9tZXRhZGF0YV8gPSB2aWRlb19jb25maWcud2VibV9jb2xvcl9tZXRhZGF0YV87Ci19Ci0KLWJvb2wgVmlkZW9EZWNvZGVyQ29uZmlnOjpJc1ZhbGlkQ29uZmlnKCkgY29uc3QgewotICByZXR1cm4gY29kZWNfICE9IGtVbmtub3duVmlkZW9Db2RlYyAmJgotICAgICAgbmF0dXJhbF9zaXplXy53aWR0aCgpID4gMCAmJgotICAgICAgbmF0dXJhbF9zaXplXy5oZWlnaHQoKSA+IDAgJiYKLSAgICAgIFZpZGVvRnJhbWU6OklzVmFsaWRDb25maWcoZm9ybWF0XywgY29kZWRfc2l6ZV8sIHZpc2libGVfcmVjdF8sCi0gICAgICAgICAgbmF0dXJhbF9zaXplXyk7Ci19Ci0KLWJvb2wgVmlkZW9EZWNvZGVyQ29uZmlnOjpNYXRjaGVzKGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgY29uZmlnKSBjb25zdCB7Ci0gIHJldHVybiAoKGNvZGVjKCkgPT0gY29uZmlnLmNvZGVjKCkpICYmIChmb3JtYXQoKSA9PSBjb25maWcuZm9ybWF0KCkpICYmCi0gICAgICAgICAgKHdlYm1fY29sb3JfbWV0YWRhdGFfID09IGNvbmZpZy53ZWJtX2NvbG9yX21ldGFkYXRhKCkpICYmCi0gICAgICAgICAgKHByb2ZpbGUoKSA9PSBjb25maWcucHJvZmlsZSgpKSAmJgotICAgICAgICAgIChjb2RlZF9zaXplKCkgPT0gY29uZmlnLmNvZGVkX3NpemUoKSkgJiYKLSAgICAgICAgICAodmlzaWJsZV9yZWN0KCkgPT0gY29uZmlnLnZpc2libGVfcmVjdCgpKSAmJgotICAgICAgICAgIChuYXR1cmFsX3NpemUoKSA9PSBjb25maWcubmF0dXJhbF9zaXplKCkpICYmCi0gICAgICAgICAgKGV4dHJhX2RhdGFfc2l6ZSgpID09IGNvbmZpZy5leHRyYV9kYXRhX3NpemUoKSkgJiYKLSAgICAgICAgICAoIWV4dHJhX2RhdGEoKSB8fAotICAgICAgICAgICAhbWVtY21wKGV4dHJhX2RhdGEoKSwgY29uZmlnLmV4dHJhX2RhdGEoKSwgZXh0cmFfZGF0YV9zaXplKCkpKSAmJgotICAgICAgICAgIChpc19lbmNyeXB0ZWQoKSA9PSBjb25maWcuaXNfZW5jcnlwdGVkKCkpKTsKLX0KLQotc3RkOjpzdHJpbmcgVmlkZW9EZWNvZGVyQ29uZmlnOjpBc0h1bWFuUmVhZGFibGVTdHJpbmcoKSBjb25zdCB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBzOwotICBzIDw8ICJjb2RlYzogIiA8PCBjb2RlYygpCi0gICAgPDwgIiBmb3JtYXQ6ICIgPDwgZm9ybWF0KCkKLSAgICA8PCAiIHByb2ZpbGU6ICIgPDwgcHJvZmlsZSgpCi0gICAgPDwgIiBjb2RlZCBzaXplOiBbIiA8PCBjb2RlZF9zaXplKCkud2lkdGgoKQotICAgIDw8ICIsIiA8PCBjb2RlZF9zaXplKCkuaGVpZ2h0KCkgPDwgIl0iCi0gICAgPDwgIiB2aXNpYmxlIHJlY3Q6IFsiIDw8IHZpc2libGVfcmVjdCgpLngoKQotICAgIDw8ICIsIiA8PCB2aXNpYmxlX3JlY3QoKS55KCkKLSAgICA8PCAiLCIgPDwgdmlzaWJsZV9yZWN0KCkud2lkdGgoKQotICAgIDw8ICIsIiA8PCB2aXNpYmxlX3JlY3QoKS5oZWlnaHQoKSA8PCAiXSIKLSAgICA8PCAiIG5hdHVyYWwgc2l6ZTogWyIgPDwgbmF0dXJhbF9zaXplKCkud2lkdGgoKQotICAgIDw8ICIsIiA8PCBuYXR1cmFsX3NpemUoKS5oZWlnaHQoKSA8PCAiXSIKLSAgICA8PCAiIGhhcyBleHRyYSBkYXRhPyAiIDw8IChleHRyYV9kYXRhKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKQotICAgIDw8ICIgZW5jcnlwdGVkPyAiIDw8IChpc19lbmNyeXB0ZWQoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICByZXR1cm4gcy5zdHIoKTsKLX0KLQotVmlkZW9Db2RlYyBWaWRlb0RlY29kZXJDb25maWc6OmNvZGVjKCkgY29uc3QgewotICByZXR1cm4gY29kZWNfOwotfQotCi1WaWRlb0NvZGVjUHJvZmlsZSBWaWRlb0RlY29kZXJDb25maWc6OnByb2ZpbGUoKSBjb25zdCB7Ci0gIHJldHVybiBwcm9maWxlXzsKLX0KLQotVmlkZW9GcmFtZTo6Rm9ybWF0IFZpZGVvRGVjb2RlckNvbmZpZzo6Zm9ybWF0KCkgY29uc3QgewotICByZXR1cm4gZm9ybWF0XzsKLX0KLQotZ2Z4OjpTaXplIFZpZGVvRGVjb2RlckNvbmZpZzo6Y29kZWRfc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGNvZGVkX3NpemVfOwotfQotCi1nZng6OlJlY3QgVmlkZW9EZWNvZGVyQ29uZmlnOjp2aXNpYmxlX3JlY3QoKSBjb25zdCB7Ci0gIHJldHVybiB2aXNpYmxlX3JlY3RfOwotfQotCi1nZng6OlNpemUgVmlkZW9EZWNvZGVyQ29uZmlnOjpuYXR1cmFsX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBuYXR1cmFsX3NpemVfOwotfQotCi11aW50OCogVmlkZW9EZWNvZGVyQ29uZmlnOjpleHRyYV9kYXRhKCkgY29uc3QgewotICByZXR1cm4gZXh0cmFfZGF0YV8uZ2V0KCk7Ci19Ci0KLXNpemVfdCBWaWRlb0RlY29kZXJDb25maWc6OmV4dHJhX2RhdGFfc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGV4dHJhX2RhdGFfc2l6ZV87Ci19Ci0KLWJvb2wgVmlkZW9EZWNvZGVyQ29uZmlnOjppc19lbmNyeXB0ZWQoKSBjb25zdCB7Ci0gIHJldHVybiBpc19lbmNyeXB0ZWRfOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXJfY29uZmlnLmggYi9zcmMvbWVkaWEvYmFzZS92aWRlb19kZWNvZGVyX2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWI2MTIyLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXJfY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9CQVNFX1ZJREVPX0RFQ09ERVJfQ09ORklHX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfVklERU9fREVDT0RFUl9DT05GSUdfSF8KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2NvbG9yX3NwYWNlLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9oZHJfbWV0YWRhdGEuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fZnJhbWUuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX3R5cGVzLmgiCi0jaW5jbHVkZSAibWVkaWEvd2VibS93ZWJtX2NvbG91cl9wYXJzZXIuaCIKLSNpbmNsdWRlICJ1aS9nZngvcmVjdC5oIgotI2luY2x1ZGUgInVpL2dmeC9zaXplLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWVudW0gVmlkZW9Db2RlYyB7Ci0gIC8vIFRoZXNlIHZhbHVlcyBhcmUgaGlzdG9ncmFtbWVkIG92ZXIgdGltZTsgZG8gbm90IGNoYW5nZSB0aGVpciBvcmRpbmFsCi0gIC8vIHZhbHVlcy4gIFdoZW4gZGVsZXRpbmcgYSBjb2RlYyByZXBsYWNlIGl0IHdpdGggYSBkdW1teSB2YWx1ZTsgd2hlbiBhZGRpbmcgYQotICAvLyBjb2RlYywgZG8gc28gYXQgdGhlIGJvdHRvbSAoYW5kIHVwZGF0ZSBrVmlkZW9Db2RlY01heCkuCi0gIGtVbmtub3duVmlkZW9Db2RlYyA9IDAsCi0gIGtDb2RlY0gyNjQsCi0gIGtDb2RlY1ZDMSwKLSAga0NvZGVjTVBFRzIsCi0gIGtDb2RlY01QRUc0LAotICBrQ29kZWNUaGVvcmEsCi0gIGtDb2RlY1ZQOCwKLSAga0NvZGVjVlA5LAotICAvLyBETyBOT1QgQUREIFJBTkRPTSBWSURFTyBDT0RFQ1MhCi0gIC8vCi0gIC8vIFRoZSBvbmx5IGFjY2VwdGFibGUgdGltZSB0byBhZGQgYSBuZXcgY29kZWMgaXMgaWYgdGhlcmUgaXMgcHJvZHVjdGlvbiBjb2RlCi0gIC8vIHRoYXQgdXNlcyBzYWlkIGNvZGVjIGluIHRoZSBzYW1lIENMLgotCi0gIGtWaWRlb0NvZGVjTWF4ID0ga0NvZGVjVlA4ICAvLyBNdXN0IGVxdWFsIHRoZSBsYXN0ICJyZWFsIiBjb2RlYyBhYm92ZS4KLX07Ci0KLS8vIFZpZGVvIHN0cmVhbSBwcm9maWxlLiAgVGhpcyAqbXVzdCogbWF0Y2ggUFBfVmlkZW9EZWNvZGVyX1Byb2ZpbGUuCi0vLyAoZW5mb3JjZWQgaW4gd2Via2l0L3BsdWdpbnMvcHBhcGkvcHBiX3ZpZGVvX2RlY29kZXJfaW1wbC5jYykKLWVudW0gVmlkZW9Db2RlY1Byb2ZpbGUgewotICAvLyBLZWVwIHRoZSB2YWx1ZXMgaW4gdGhpcyBlbnVtIHVuaXF1ZSwgYXMgdGhleSBpbXBseSBmb3JtYXQgKGguMjY0IHZzLiBWUDgsCi0gIC8vIGZvciBleGFtcGxlKSwgYW5kIGtlZXAgdGhlIHZhbHVlcyBmb3IgYSBwYXJ0aWN1bGFyIGZvcm1hdCBncm91cGVkCi0gIC8vIHRvZ2V0aGVyIGZvciBjbGFyaXR5LgotICBWSURFT19DT0RFQ19QUk9GSUxFX1VOS05PV04gPSAtMSwKLSAgSDI2NFBST0ZJTEVfTUlOID0gMCwKLSAgSDI2NFBST0ZJTEVfQkFTRUxJTkUgPSBIMjY0UFJPRklMRV9NSU4sCi0gIEgyNjRQUk9GSUxFX01BSU4gPSAxLAotICBIMjY0UFJPRklMRV9FWFRFTkRFRCA9IDIsCi0gIEgyNjRQUk9GSUxFX0hJR0ggPSAzLAotICBIMjY0UFJPRklMRV9ISUdIMTBQUk9GSUxFID0gNCwKLSAgSDI2NFBST0ZJTEVfSElHSDQyMlBST0ZJTEUgPSA1LAotICBIMjY0UFJPRklMRV9ISUdINDQ0UFJFRElDVElWRVBST0ZJTEUgPSA2LAotICBIMjY0UFJPRklMRV9TQ0FMQUJMRUJBU0VMSU5FID0gNywKLSAgSDI2NFBST0ZJTEVfU0NBTEFCTEVISUdIID0gOCwKLSAgSDI2NFBST0ZJTEVfU1RFUkVPSElHSCA9IDksCi0gIEgyNjRQUk9GSUxFX01VTFRJVklFV0hJR0ggPSAxMCwKLSAgSDI2NFBST0ZJTEVfTUFYID0gSDI2NFBST0ZJTEVfTVVMVElWSUVXSElHSCwKLSAgVlA4UFJPRklMRV9NSU4gPSAxMSwKLSAgVlA4UFJPRklMRV9NQUlOID0gVlA4UFJPRklMRV9NSU4sCi0gIFZQOFBST0ZJTEVfTUFYID0gVlA4UFJPRklMRV9NQUlOLAotICBWUDlQUk9GSUxFX01JTiA9IDEyLAotICBWUDlQUk9GSUxFX01BSU4gPSBWUDlQUk9GSUxFX01JTiwKLSAgVlA5UFJPRklMRV9NQVggPSBWUDlQUk9GSUxFX01BSU4sCi0gIFZJREVPX0NPREVDX1BST0ZJTEVfTUFYID0gVlA5UFJPRklMRV9NQVgsCi19OwotCi1jbGFzcyBNRURJQV9FWFBPUlQgVmlkZW9EZWNvZGVyQ29uZmlnIHsKLSBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdHMgYW4gdW5pbml0aWFsaXplZCBvYmplY3QuIENsaWVudHMgc2hvdWxkIGNhbGwgSW5pdGlhbGl6ZSgpIHdpdGgKLSAgLy8gYXBwcm9wcmlhdGUgdmFsdWVzIGJlZm9yZSB1c2luZy4KLSAgVmlkZW9EZWNvZGVyQ29uZmlnKCk7Ci0KLSAgLy8gQ29uc3RydWN0cyBhbiBpbml0aWFsaXplZCBvYmplY3QuIEl0IGlzIGFjY2VwdGFibGUgdG8gcGFzcyBpbiBOVUxMIGZvcgotICAvLyB8ZXh0cmFfZGF0YXwsIG90aGVyd2lzZSB0aGUgbWVtb3J5IGlzIGNvcGllZC4KLSAgVmlkZW9EZWNvZGVyQ29uZmlnKFZpZGVvQ29kZWMgY29kZWMsCi0gICAgICAgICAgICAgICAgICAgICBWaWRlb0NvZGVjUHJvZmlsZSBwcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgVmlkZW9GcmFtZTo6Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgIENvbG9yU3BhY2UgY29sb3Jfc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBnZng6OlNpemUmIGNvZGVkX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBnZng6OlJlY3QmIHZpc2libGVfcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgbmF0dXJhbF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIGV4dHJhX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICBzaXplX3QgZXh0cmFfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19lbmNyeXB0ZWQpOwotCi0gIH5WaWRlb0RlY29kZXJDb25maWcoKTsKLQotICAvLyBSZXNldHMgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoaXMgb2JqZWN0LgotICB2b2lkIEluaXRpYWxpemUoVmlkZW9Db2RlYyBjb2RlYywKLSAgICAgICAgICAgICAgICAgIFZpZGVvQ29kZWNQcm9maWxlIHByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICBWaWRlb0ZyYW1lOjpGb3JtYXQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgQ29sb3JTcGFjZSBjb2xvcl9zcGFjZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgY29kZWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGdmeDo6UmVjdCYgdmlzaWJsZV9yZWN0LAotICAgICAgICAgICAgICAgICAgY29uc3QgZ2Z4OjpTaXplJiBuYXR1cmFsX3NpemUsCi0gICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogZXh0cmFfZGF0YSwKLSAgICAgICAgICAgICAgICAgIHNpemVfdCBleHRyYV9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICBib29sIGlzX2VuY3J5cHRlZCwKLSAgICAgICAgICAgICAgICAgIGJvb2wgcmVjb3JkX3N0YXRzKTsKLQotICAvLyBEZWVwIGNvcGllcyB8dmlkZW9fY29uZmlnfC4KLSAgdm9pZCBDb3B5RnJvbShjb25zdCBWaWRlb0RlY29kZXJDb25maWcmIHZpZGVvX2NvbmZpZyk7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgb2JqZWN0IGhhcyBhcHByb3ByaWF0ZSBjb25maWd1cmF0aW9uIHZhbHVlcywgZmFsc2UKLSAgLy8gb3RoZXJ3aXNlLgotICBib29sIElzVmFsaWRDb25maWcoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgYWxsIGZpZWxkcyBpbiB8Y29uZmlnfCBtYXRjaCB0aGlzIGNvbmZpZy4KLSAgLy8gTm90ZTogVGhlIGNvbnRlbnRzIG9mIHxleHRyYV9kYXRhX3wgYXJlIGNvbXBhcmVkIG5vdCB0aGUgcmF3IHBvaW50ZXJzLgotICBib29sIE1hdGNoZXMoY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiBjb25maWcpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgZGVzY3JpYmluZyB8KnRoaXN8LiAgRm9yIGRlYnVnZ2luZyAmIHRlc3QKLSAgLy8gb3V0cHV0IG9ubHkuCi0gIHN0ZDo6c3RyaW5nIEFzSHVtYW5SZWFkYWJsZVN0cmluZygpIGNvbnN0OwotCi0gIFZpZGVvQ29kZWMgY29kZWMoKSBjb25zdDsKLSAgVmlkZW9Db2RlY1Byb2ZpbGUgcHJvZmlsZSgpIGNvbnN0OwotCi0gIC8vIFZpZGVvIGZvcm1hdCB1c2VkIHRvIGRldGVybWluZSBZVVYgYnVmZmVyIHNpemVzLgotICBWaWRlb0ZyYW1lOjpGb3JtYXQgZm9ybWF0KCkgY29uc3Q7Ci0KLSAgLy8gV2lkdGggYW5kIGhlaWdodCBvZiB2aWRlbyBmcmFtZSBpbW1lZGlhdGVseSBwb3N0LWRlY29kZS4gTm90IGFsbCBwaXhlbHMKLSAgLy8gaW4gdGhpcyByZWdpb24gYXJlIHZhbGlkLgotICBnZng6OlNpemUgY29kZWRfc2l6ZSgpIGNvbnN0OwotCi0gIC8vIFJlZ2lvbiBvZiB8Y29kZWRfc2l6ZV98IHRoYXQgaXMgdmlzaWJsZS4KLSAgZ2Z4OjpSZWN0IHZpc2libGVfcmVjdCgpIGNvbnN0OwotCi0gIC8vIEZpbmFsIHZpc2libGUgd2lkdGggYW5kIGhlaWdodCBvZiBhIHZpZGVvIGZyYW1lIHdpdGggYXNwZWN0IHJhdGlvIHRha2VuCi0gIC8vIGludG8gYWNjb3VudC4KLSAgZ2Z4OjpTaXplIG5hdHVyYWxfc2l6ZSgpIGNvbnN0OwotCi0gIC8vIE9wdGlvbmFsIGJ5dGUgZGF0YSByZXF1aXJlZCB0byBpbml0aWFsaXplIHZpZGVvIGRlY29kZXJzLCBzdWNoIGFzIEguMjY0Ci0gIC8vIEFBVkMgZGF0YS4KLSAgdWludDgqIGV4dHJhX2RhdGEoKSBjb25zdDsKLSAgc2l6ZV90IGV4dHJhX2RhdGFfc2l6ZSgpIGNvbnN0OwotCi0gIC8vIFdoZXRoZXIgdGhlIHZpZGVvIHN0cmVhbSBpcyBwb3RlbnRpYWxseSBlbmNyeXB0ZWQuCi0gIC8vIE5vdGUgdGhhdCBpbiBhIHBvdGVudGlhbGx5IGVuY3J5cHRlZCB2aWRlbyBzdHJlYW0sIGluZGl2aWR1YWwgYnVmZmVycwotICAvLyBjYW4gYmUgZW5jcnlwdGVkIG9yIG5vdCBlbmNyeXB0ZWQuCi0gIGJvb2wgaXNfZW5jcnlwdGVkKCkgY29uc3Q7Ci0KLSAgdm9pZCBzZXRfd2VibV9jb2xvcl9tZXRhZGF0YShjb25zdCBXZWJNQ29sb3JNZXRhZGF0YSYgd2VibV9jb2xvcl9tZXRhZGF0YSkgewotICAgIHdlYm1fY29sb3JfbWV0YWRhdGFfID0gd2VibV9jb2xvcl9tZXRhZGF0YTsKLSAgfQotCi0gIGNvbnN0IFdlYk1Db2xvck1ldGFkYXRhJiB3ZWJtX2NvbG9yX21ldGFkYXRhKCkgY29uc3QgewotICAgIHJldHVybiB3ZWJtX2NvbG9yX21ldGFkYXRhXzsKLSAgfQotCi0gIGNvbnN0IENvbG9yU3BhY2UmIGNvbG9yX3NwYWNlKCkgY29uc3QgeyByZXR1cm4gY29sb3Jfc3BhY2VfOyB9Ci0KLSBwcml2YXRlOgotICBWaWRlb0NvZGVjIGNvZGVjXzsKLSAgVmlkZW9Db2RlY1Byb2ZpbGUgcHJvZmlsZV87Ci0KLSAgVmlkZW9GcmFtZTo6Rm9ybWF0IGZvcm1hdF87Ci0KLSAgLy8gVE9ETyhzZXJ2b2xrKTogRGVwcmVjYXRlZCwgdXNlIGNvbG9yX3NwYWNlX2luZm9fIGluc3RlYWQuCi0gIENvbG9yU3BhY2UgY29sb3Jfc3BhY2VfOwotCi0gIGdmeDo6U2l6ZSBjb2RlZF9zaXplXzsKLSAgZ2Z4OjpSZWN0IHZpc2libGVfcmVjdF87Ci0gIGdmeDo6U2l6ZSBuYXR1cmFsX3NpemVfOwotCi0gIHNjb3BlZF9hcnJheTx1aW50OD4gZXh0cmFfZGF0YV87Ci0gIHNpemVfdCBleHRyYV9kYXRhX3NpemVfOwotCi0gIGJvb2wgaXNfZW5jcnlwdGVkXzsKLQotICBXZWJNQ29sb3JNZXRhZGF0YSB3ZWJtX2NvbG9yX21ldGFkYXRhXzsKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFZpZGVvRGVjb2RlckNvbmZpZyk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX1ZJREVPX0RFQ09ERVJfQ09ORklHX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS92aWRlb19mcmFtZS5jYyBiL3NyYy9tZWRpYS9iYXNlL3ZpZGVvX2ZyYW1lLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODEyNDZjLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3ZpZGVvX2ZyYW1lLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2ZyYW1lLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9hbGlnbmVkX21lbW9yeS5oIgotI2luY2x1ZGUgImJhc2Uvc3RyaW5nX3BpZWNlLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9saW1pdHMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX3V0aWwuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gc3RhdGljCi1zY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IFZpZGVvRnJhbWU6OkNyZWF0ZUZyYW1lKAotICAgIFZpZGVvRnJhbWU6OkZvcm1hdCBmb3JtYXQsCi0gICAgY29uc3QgZ2Z4OjpTaXplJiBjb2RlZF9zaXplLAotICAgIGNvbnN0IGdmeDo6UmVjdCYgdmlzaWJsZV9yZWN0LAotICAgIGNvbnN0IGdmeDo6U2l6ZSYgbmF0dXJhbF9zaXplLAotICAgIGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXApIHsKLSAgRENIRUNLKElzVmFsaWRDb25maWcoZm9ybWF0LCBjb2RlZF9zaXplLCB2aXNpYmxlX3JlY3QsIG5hdHVyYWxfc2l6ZSkpOwotICBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IGZyYW1lKG5ldyBWaWRlb0ZyYW1lKAotICAgICAgZm9ybWF0LCBjb2RlZF9zaXplLCB2aXNpYmxlX3JlY3QsIG5hdHVyYWxfc2l6ZSwgdGltZXN0YW1wKSk7Ci0gIHN3aXRjaCAoZm9ybWF0KSB7Ci0gICAgY2FzZSBWaWRlb0ZyYW1lOjpSR0IzMjoKLSAgICAgIGZyYW1lLT5BbGxvY2F0ZVJHQig0dSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFZpZGVvRnJhbWU6OllWMTI6Ci0gICAgY2FzZSBWaWRlb0ZyYW1lOjpZVjE2OgotICAgICAgZnJhbWUtPkFsbG9jYXRlWVVWKCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HKEZBVEFMKSA8PCAiVW5zdXBwb3J0ZWQgZnJhbWUgZm9ybWF0OiAiIDw8IGZvcm1hdDsKLSAgfQotICByZXR1cm4gZnJhbWU7Ci19Ci0KLS8vIHN0YXRpYwotYm9vbCBWaWRlb0ZyYW1lOjpJc1ZhbGlkQ29uZmlnKFZpZGVvRnJhbWU6OkZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Z4OjpTaXplJiBjb2RlZF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdmeDo6UmVjdCYgdmlzaWJsZV9yZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgbmF0dXJhbF9zaXplKSB7Ci0gIHJldHVybiAoZm9ybWF0ICE9IFZpZGVvRnJhbWU6OklOVkFMSUQgJiYKLSAgICAgICAgICAhY29kZWRfc2l6ZS5Jc0VtcHR5KCkgJiYKLSAgICAgICAgICBjb2RlZF9zaXplLkdldEFyZWEoKSA8PSBsaW1pdHM6OmtNYXhDYW52YXMgJiYKLSAgICAgICAgICBjb2RlZF9zaXplLndpZHRoKCkgPD0gbGltaXRzOjprTWF4RGltZW5zaW9uICYmCi0gICAgICAgICAgY29kZWRfc2l6ZS5oZWlnaHQoKSA8PSBsaW1pdHM6OmtNYXhEaW1lbnNpb24gJiYKLSAgICAgICAgICAhdmlzaWJsZV9yZWN0LklzRW1wdHkoKSAmJgotICAgICAgICAgIHZpc2libGVfcmVjdC54KCkgPj0gMCAmJiB2aXNpYmxlX3JlY3QueSgpID49IDAgJiYKLSAgICAgICAgICB2aXNpYmxlX3JlY3QucmlnaHQoKSA8PSBjb2RlZF9zaXplLndpZHRoKCkgJiYKLSAgICAgICAgICB2aXNpYmxlX3JlY3QuYm90dG9tKCkgPD0gY29kZWRfc2l6ZS5oZWlnaHQoKSAmJgotICAgICAgICAgICFuYXR1cmFsX3NpemUuSXNFbXB0eSgpICYmCi0gICAgICAgICAgbmF0dXJhbF9zaXplLkdldEFyZWEoKSA8PSBsaW1pdHM6OmtNYXhDYW52YXMgJiYKLSAgICAgICAgICBuYXR1cmFsX3NpemUud2lkdGgoKSA8PSBsaW1pdHM6OmtNYXhEaW1lbnNpb24gJiYKLSAgICAgICAgICBuYXR1cmFsX3NpemUuaGVpZ2h0KCkgPD0gbGltaXRzOjprTWF4RGltZW5zaW9uKTsKLX0KLQotLy8gc3RhdGljCi1zY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IFZpZGVvRnJhbWU6OldyYXBOYXRpdmVUZXh0dXJlKAotICAgIHVpbnRwdHJfdCB0ZXh0dXJlX2lkLAotICAgIHVpbnQzMiB0ZXh0dXJlX3RhcmdldCwKLSAgICBjb25zdCBnZng6OlNpemUmIGNvZGVkX3NpemUsCi0gICAgY29uc3QgZ2Z4OjpSZWN0JiB2aXNpYmxlX3JlY3QsCi0gICAgY29uc3QgZ2Z4OjpTaXplJiBuYXR1cmFsX3NpemUsCi0gICAgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCwKLSAgICBjb25zdCBSZWFkUGl4ZWxzQ0ImIHJlYWRfcGl4ZWxzX2NiLAotICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIG5vX2xvbmdlcl9uZWVkZWRfY2IpIHsKLSAgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiBmcmFtZShuZXcgVmlkZW9GcmFtZSgKLSAgICAgIE5BVElWRV9URVhUVVJFLCBjb2RlZF9zaXplLCB2aXNpYmxlX3JlY3QsIG5hdHVyYWxfc2l6ZSwgdGltZXN0YW1wKSk7Ci0gIGZyYW1lLT50ZXh0dXJlX2lkXyA9IHRleHR1cmVfaWQ7Ci0gIGZyYW1lLT50ZXh0dXJlX3RhcmdldF8gPSB0ZXh0dXJlX3RhcmdldDsKLSAgZnJhbWUtPnJlYWRfcGl4ZWxzX2NiXyA9IHJlYWRfcGl4ZWxzX2NiOwotICBmcmFtZS0+bm9fbG9uZ2VyX25lZWRlZF9jYl8gPSBub19sb25nZXJfbmVlZGVkX2NiOwotICByZXR1cm4gZnJhbWU7Ci19Ci0KLXZvaWQgVmlkZW9GcmFtZTo6UmVhZFBpeGVsc0Zyb21OYXRpdmVUZXh0dXJlKHZvaWQqIHBpeGVscykgewotICBEQ0hFQ0tfRVEoZm9ybWF0XywgTkFUSVZFX1RFWFRVUkUpOwotICBpZiAoIXJlYWRfcGl4ZWxzX2NiXy5pc19udWxsKCkpCi0gICAgcmVhZF9waXhlbHNfY2JfLlJ1bihwaXhlbHMpOwotfQotCi0vLyBzdGF0aWMKLXNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gVmlkZW9GcmFtZTo6V3JhcEV4dGVybmFsWXV2RGF0YSgKLSAgICBGb3JtYXQgZm9ybWF0LAotICAgIGNvbnN0IGdmeDo6U2l6ZSYgY29kZWRfc2l6ZSwKLSAgICBjb25zdCBnZng6OlJlY3QmIHZpc2libGVfcmVjdCwKLSAgICBjb25zdCBnZng6OlNpemUmIG5hdHVyYWxfc2l6ZSwKLSAgICBpbnQzMiB5X3N0cmlkZSwgaW50MzIgdV9zdHJpZGUsIGludDMyIHZfc3RyaWRlLAotICAgIHVpbnQ4KiB5X2RhdGEsIHVpbnQ4KiB1X2RhdGEsIHVpbnQ4KiB2X2RhdGEsCi0gICAgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCwKLSAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiBub19sb25nZXJfbmVlZGVkX2NiKSB7Ci0gIERDSEVDSyhmb3JtYXQgPT0gWVYxMiB8fCBmb3JtYXQgPT0gWVYxNiB8fCBmb3JtYXQgPT0gSTQyMCkgPDwgZm9ybWF0OwotICBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IGZyYW1lKG5ldyBWaWRlb0ZyYW1lKAotICAgICAgZm9ybWF0LCBjb2RlZF9zaXplLCB2aXNpYmxlX3JlY3QsIG5hdHVyYWxfc2l6ZSwgdGltZXN0YW1wKSk7Ci0gIGZyYW1lLT5zdHJpZGVzX1trWVBsYW5lXSA9IHlfc3RyaWRlOwotICBmcmFtZS0+c3RyaWRlc19ba1VQbGFuZV0gPSB1X3N0cmlkZTsKLSAgZnJhbWUtPnN0cmlkZXNfW2tWUGxhbmVdID0gdl9zdHJpZGU7Ci0gIGZyYW1lLT5kYXRhX1trWVBsYW5lXSA9IHlfZGF0YTsKLSAgZnJhbWUtPmRhdGFfW2tVUGxhbmVdID0gdV9kYXRhOwotICBmcmFtZS0+ZGF0YV9ba1ZQbGFuZV0gPSB2X2RhdGE7Ci0gIGZyYW1lLT5ub19sb25nZXJfbmVlZGVkX2NiXyA9IG5vX2xvbmdlcl9uZWVkZWRfY2I7Ci0gIHJldHVybiBmcmFtZTsKLX0KLQotLy8gc3RhdGljCi1zY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IFZpZGVvRnJhbWU6OkNyZWF0ZUVtcHR5RnJhbWUoKSB7Ci0gIHJldHVybiBuZXcgVmlkZW9GcmFtZSgKLSAgICAgIFZpZGVvRnJhbWU6OkVNUFRZLCBnZng6OlNpemUoKSwgZ2Z4OjpSZWN0KCksIGdmeDo6U2l6ZSgpLAotICAgICAgYmFzZTo6VGltZURlbHRhKCkpOwotfQotCi0vLyBzdGF0aWMKLXNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gVmlkZW9GcmFtZTo6Q3JlYXRlQ29sb3JGcmFtZSgKLSAgICBjb25zdCBnZng6OlNpemUmIHNpemUsCi0gICAgdWludDggeSwgdWludDggdSwgdWludDggdiwKLSAgICBiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wKSB7Ci0gIERDSEVDSyhJc1ZhbGlkQ29uZmlnKFZpZGVvRnJhbWU6OllWMTIsIHNpemUsIGdmeDo6UmVjdChzaXplKSwgc2l6ZSkpOwotICBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IGZyYW1lID0gVmlkZW9GcmFtZTo6Q3JlYXRlRnJhbWUoCi0gICAgICBWaWRlb0ZyYW1lOjpZVjEyLCBzaXplLCBnZng6OlJlY3Qoc2l6ZSksIHNpemUsIHRpbWVzdGFtcCk7Ci0gIEZpbGxZVVYoZnJhbWUsIHksIHUsIHYpOwotICByZXR1cm4gZnJhbWU7Ci19Ci0KLS8vIHN0YXRpYwotc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiBWaWRlb0ZyYW1lOjpDcmVhdGVCbGFja0ZyYW1lKGNvbnN0IGdmeDo6U2l6ZSYgc2l6ZSkgewotICBjb25zdCB1aW50OCBrQmxhY2tZID0gMHgwMDsKLSAgY29uc3QgdWludDgga0JsYWNrVVYgPSAweDgwOwotICBjb25zdCBiYXNlOjpUaW1lRGVsdGEga1plcm87Ci0gIHJldHVybiBDcmVhdGVDb2xvckZyYW1lKHNpemUsIGtCbGFja1ksIGtCbGFja1VWLCBrQmxhY2tVViwga1plcm8pOwotfQotCi0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotLy8gc3RhdGljCi1zY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IFZpZGVvRnJhbWU6OkNyZWF0ZVB1bmNoT3V0RnJhbWUoCi0gICAgY29uc3QgZ2Z4OjpTaXplJiBzaXplKSB7Ci0gIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gZnJhbWUobmV3IFZpZGVvRnJhbWUoCi0gICAgICBWaWRlb0ZyYW1lOjpQVU5DSF9PVVQsIGdmeDo6U2l6ZShzaXplKSwgZ2Z4OjpSZWN0KHNpemUpLCBnZng6OlNpemUoc2l6ZSksCi0gICAgICBiYXNlOjpUaW1lRGVsdGEoKSkpOwotICByZXR1cm4gZnJhbWU7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGlubGluZSBzaXplX3QgUm91bmRVcChzaXplX3QgdmFsdWUsIHNpemVfdCBhbGlnbm1lbnQpIHsKLSAgLy8gQ2hlY2sgdGhhdCB8YWxpZ25tZW50fCBpcyBhIHBvd2VyIG9mIDIuCi0gIERDSEVDSygoYWxpZ25tZW50ICsgKGFsaWdubWVudCAtIDEpKSA9PSAoYWxpZ25tZW50IHwgKGFsaWdubWVudCAtIDEpKSk7Ci0gIHJldHVybiAoKHZhbHVlICsgKGFsaWdubWVudCAtIDEpKSAmIH4oYWxpZ25tZW50LTEpKTsKLX0KLQotLy8gUmVsZWFzZSBkYXRhIGFsbG9jYXRlZCBieSBBbGxvY2F0ZVJHQigpIG9yIEFsbG9jYXRlWVVWKCkuCi1zdGF0aWMgdm9pZCBSZWxlYXNlRGF0YSh1aW50OCogZGF0YSkgewotICBEQ0hFQ0soZGF0YSk7Ci0gIGJhc2U6OkFsaWduZWRGcmVlKGRhdGEpOwotfQotCi12b2lkIFZpZGVvRnJhbWU6OkFsbG9jYXRlUkdCKHNpemVfdCBieXRlc19wZXJfcGl4ZWwpIHsKLSAgLy8gUm91bmQgdXAgdG8gYWxpZ24gYXQgbGVhc3QgYXQgYSAxNi1ieXRlIGJvdW5kYXJ5IGZvciBlYWNoIHJvdy4KLSAgLy8gVGhpcyBpcyBzdWZmaWNpZW50IGZvciBNTVggYW5kIFNTRTIgcmVhZHMgKG1vdnEvbW92ZHFhKS4KLSAgc2l6ZV90IGJ5dGVzX3Blcl9yb3cgPSBSb3VuZFVwKGNvZGVkX3NpemVfLndpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRnJhbWVTaXplQWxpZ25tZW50KSAqIGJ5dGVzX3Blcl9waXhlbDsKLSAgc2l6ZV90IGFsaWduZWRfaGVpZ2h0ID0gUm91bmRVcChjb2RlZF9zaXplXy5oZWlnaHQoKSwga0ZyYW1lU2l6ZUFsaWdubWVudCk7Ci0gIHN0cmlkZXNfW1ZpZGVvRnJhbWU6OmtSR0JQbGFuZV0gPSBieXRlc19wZXJfcm93OwotICBkYXRhX1tWaWRlb0ZyYW1lOjprUkdCUGxhbmVdID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KAotICAgICAgYmFzZTo6QWxpZ25lZEFsbG9jKGJ5dGVzX3Blcl9yb3cgKiBhbGlnbmVkX2hlaWdodCArIGtGcmFtZVNpemVQYWRkaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgIGtGcmFtZUFkZHJlc3NBbGlnbm1lbnQpKTsKLSAgbm9fbG9uZ2VyX25lZWRlZF9jYl8gPSBiYXNlOjpCaW5kKCZSZWxlYXNlRGF0YSwgZGF0YV9bVmlkZW9GcmFtZTo6a1JHQlBsYW5lXSk7Ci0gIERDSEVDSyghKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGRhdGFfW1ZpZGVvRnJhbWU6OmtSR0JQbGFuZV0pICYgNykpOwotICBDT01QSUxFX0FTU0VSVCgwID09IFZpZGVvRnJhbWU6OmtSR0JQbGFuZSwgUkdCX2RhdGFfbXVzdF9iZV9pbmRleF8wKTsKLX0KLQotdm9pZCBWaWRlb0ZyYW1lOjpBbGxvY2F0ZVlVVigpIHsKLSAgRENIRUNLKGZvcm1hdF8gPT0gVmlkZW9GcmFtZTo6WVYxMiB8fCBmb3JtYXRfID09IFZpZGVvRnJhbWU6OllWMTYpOwotICAvLyBBbGlnbiBZIHJvd3MgYXQgbGVhc3QgYXQgMTYgYnl0ZSBib3VuZGFyaWVzLiAgVGhlIHN0cmlkZSBmb3IgYm90aAotICAvLyBZVjEyIGFuZCBZVjE2IGlzIDEvMiBvZiB0aGUgc3RyaWRlIG9mIFkuICBGb3IgWVYxMiwgZXZlcnkgcm93IG9mIGJ5dGVzIGZvcgotICAvLyBVIGFuZCBWIGFwcGxpZXMgdG8gdHdvIHJvd3Mgb2YgWSAob25lIGJ5dGUgb2YgVVYgZm9yIDQgYnl0ZXMgb2YgWSksIHNvIGluCi0gIC8vIHRoZSBjYXNlIG9mIFlWMTIgdGhlIHN0cmlkZXMgYXJlIGlkZW50aWNhbCBmb3IgdGhlIHNhbWUgd2lkdGggc3VyZmFjZSwgYnV0Ci0gIC8vIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIGZvciBZVjEyIGlzIDEvMiB0aGUgYW1vdW50IGZvciBVICYgViBhcwotICAvLyBZVjE2LiBXZSBhbHNvIHJvdW5kIHRoZSBoZWlnaHQgb2YgdGhlIHN1cmZhY2UgYWxsb2NhdGVkIHRvIGJlIGFuIGV2ZW4KLSAgLy8gbnVtYmVyIHRvIGF2b2lkIGFueSBwb3RlbnRpYWwgb2YgZmF1bHRpbmcgYnkgY29kZSB0aGF0IGF0dGVtcHRzIHRvIGFjY2VzcwotICAvLyB0aGUgWSB2YWx1ZXMgb2YgdGhlIGZpbmFsIHJvdywgYnV0IGFzc3VtZXMgdGhhdCB0aGUgbGFzdCByb3cgb2YgVSAmIFYKLSAgLy8gYXBwbGllcyB0byBhIGZ1bGwgdHdvIHJvd3Mgb2YgWS4KLSAgc2l6ZV90IHlfc3RyaWRlID0gUm91bmRVcChyb3dfYnl0ZXMoVmlkZW9GcmFtZTo6a1lQbGFuZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga0ZyYW1lU2l6ZUFsaWdubWVudCk7Ci0gIHNpemVfdCB1dl9zdHJpZGUgPSBSb3VuZFVwKHJvd19ieXRlcyhWaWRlb0ZyYW1lOjprVVBsYW5lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ZyYW1lU2l6ZUFsaWdubWVudCk7Ci0gIC8vIFRoZSAqMiBoZXJlIGlzIGJlY2F1c2Ugc29tZSBmb3JtYXRzIChlLmcuIGgyNjQpIGFsbG93IGludGVybGFjZWQgY29kaW5nLAotICAvLyBhbmQgdGhlbiB0aGUgc2l6ZSBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIHR3byBtYWNyb2Jsb2NrcyAodmVydGljYWxseSkuCi0gIC8vIFNlZSBsaWJhdmNvZGVjL3V0aWxzLmM6YXZjb2RlY19hbGlnbl9kaW1lbnNpb25zMigpLgotICBzaXplX3QgeV9oZWlnaHQgPSBSb3VuZFVwKGNvZGVkX3NpemVfLmhlaWdodCgpLCBrRnJhbWVTaXplQWxpZ25tZW50ICogMik7Ci0gIHNpemVfdCB1dl9oZWlnaHQgPSBmb3JtYXRfID09IFZpZGVvRnJhbWU6OllWMTIgPyB5X2hlaWdodCAvIDIgOiB5X2hlaWdodDsKLSAgc2l6ZV90IHlfYnl0ZXMgPSB5X2hlaWdodCAqIHlfc3RyaWRlOwotICBzaXplX3QgdXZfYnl0ZXMgPSB1dl9oZWlnaHQgKiB1dl9zdHJpZGU7Ci0KLSAgLy8gVGhlIGV4dHJhIGxpbmUgb2YgVVYgYmVpbmcgYWxsb2NhdGVkIGlzIGJlY2F1c2UgaDI2NCBjaHJvbWEgTUMKLSAgLy8gb3ZlcnJlYWRzIGJ5IG9uZSBsaW5lIGluIHNvbWUgY2FzZXMsIHNlZSBsaWJhdmNvZGVjL3V0aWxzLmM6Ci0gIC8vIGF2Y29kZWNfYWxpZ25fZGltZW5zaW9uczIoKSBhbmQgbGliYXZjb2RlYy94ODYvaDI2NF9jaHJvbWFtYy5hc206Ci0gIC8vIHB1dF9oMjY0X2Nocm9tYV9tYzRfc3NzZTMoKS4KLSAgdWludDgqIGRhdGEgPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4oCi0gICAgICBiYXNlOjpBbGlnbmVkQWxsb2MoCi0gICAgICAgICAgeV9ieXRlcyArICh1dl9ieXRlcyAqIDIgKyB1dl9zdHJpZGUpICsga0ZyYW1lU2l6ZVBhZGRpbmcsCi0gICAgICAgICAga0ZyYW1lQWRkcmVzc0FsaWdubWVudCkpOwotICBub19sb25nZXJfbmVlZGVkX2NiXyA9IGJhc2U6OkJpbmQoJlJlbGVhc2VEYXRhLCBkYXRhKTsKLSAgQ09NUElMRV9BU1NFUlQoMCA9PSBWaWRlb0ZyYW1lOjprWVBsYW5lLCB5X3BsYW5lX2RhdGFfbXVzdF9iZV9pbmRleF8wKTsKLSAgZGF0YV9bVmlkZW9GcmFtZTo6a1lQbGFuZV0gPSBkYXRhOwotICBkYXRhX1tWaWRlb0ZyYW1lOjprVVBsYW5lXSA9IGRhdGEgKyB5X2J5dGVzOwotICBkYXRhX1tWaWRlb0ZyYW1lOjprVlBsYW5lXSA9IGRhdGEgKyB5X2J5dGVzICsgdXZfYnl0ZXM7Ci0gIHN0cmlkZXNfW1ZpZGVvRnJhbWU6OmtZUGxhbmVdID0geV9zdHJpZGU7Ci0gIHN0cmlkZXNfW1ZpZGVvRnJhbWU6OmtVUGxhbmVdID0gdXZfc3RyaWRlOwotICBzdHJpZGVzX1tWaWRlb0ZyYW1lOjprVlBsYW5lXSA9IHV2X3N0cmlkZTsKLX0KLQotVmlkZW9GcmFtZTo6VmlkZW9GcmFtZShWaWRlb0ZyYW1lOjpGb3JtYXQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnZng6OlNpemUmIGNvZGVkX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdmeDo6UmVjdCYgdmlzaWJsZV9yZWN0LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnZng6OlNpemUmIG5hdHVyYWxfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCkKLSAgICA6IGZvcm1hdF8oZm9ybWF0KSwKLSAgICAgIGNvZGVkX3NpemVfKGNvZGVkX3NpemUpLAotICAgICAgdmlzaWJsZV9yZWN0Xyh2aXNpYmxlX3JlY3QpLAotICAgICAgbmF0dXJhbF9zaXplXyhuYXR1cmFsX3NpemUpLAotICAgICAgdGV4dHVyZV9pZF8oMCksCi0gICAgICB0ZXh0dXJlX3RhcmdldF8oMCksCi0gICAgICB0aW1lc3RhbXBfKHRpbWVzdGFtcCkgewotICBtZW1zZXQoJnN0cmlkZXNfLCAwLCBzaXplb2Yoc3RyaWRlc18pKTsKLSAgbWVtc2V0KCZkYXRhXywgMCwgc2l6ZW9mKGRhdGFfKSk7Ci19Ci0KLVZpZGVvRnJhbWU6On5WaWRlb0ZyYW1lKCkgewotICBpZiAoIW5vX2xvbmdlcl9uZWVkZWRfY2JfLmlzX251bGwoKSkKLSAgICBiYXNlOjpSZXNldEFuZFJldHVybigmbm9fbG9uZ2VyX25lZWRlZF9jYl8pLlJ1bigpOwotfQotCi1ib29sIFZpZGVvRnJhbWU6OklzVmFsaWRQbGFuZShzaXplX3QgcGxhbmUpIGNvbnN0IHsKLSAgc3dpdGNoIChmb3JtYXRfKSB7Ci0gICAgY2FzZSBSR0IzMjoKLSAgICAgIHJldHVybiBwbGFuZSA9PSBrUkdCUGxhbmU7Ci0KLSAgICBjYXNlIFlWMTI6Ci0gICAgY2FzZSBZVjE2OgotICAgICAgcmV0dXJuIHBsYW5lID09IGtZUGxhbmUgfHwgcGxhbmUgPT0ga1VQbGFuZSB8fCBwbGFuZSA9PSBrVlBsYW5lOwotCi0gICAgY2FzZSBOQVRJVkVfVEVYVFVSRToKLSAgICAgIE5PVFJFQUNIRUQoKSA8PCAiTkFUSVZFX1RFWFRVUkVzIGRvbid0IHVzZSBwbGFuZS1yZWxhdGVkIG1ldGhvZHMhIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIC8vIEludGVudGlvbmFsbHkgbGVhdmUgb3V0IG5vbi1wcm9kdWN0aW9uIGZvcm1hdHMuCi0gIE5PVFJFQUNIRUQoKSA8PCAiVW5zdXBwb3J0ZWQgdmlkZW8gZnJhbWUgZm9ybWF0OiAiIDw8IGZvcm1hdF87Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotaW50IFZpZGVvRnJhbWU6OnN0cmlkZShzaXplX3QgcGxhbmUpIGNvbnN0IHsKLSAgRENIRUNLKElzVmFsaWRQbGFuZShwbGFuZSkpOwotICByZXR1cm4gc3RyaWRlc19bcGxhbmVdOwotfQotCi1pbnQgVmlkZW9GcmFtZTo6cm93X2J5dGVzKHNpemVfdCBwbGFuZSkgY29uc3QgewotICBEQ0hFQ0soSXNWYWxpZFBsYW5lKHBsYW5lKSk7Ci0gIGludCB3aWR0aCA9IGNvZGVkX3NpemVfLndpZHRoKCk7Ci0gIHN3aXRjaCAoZm9ybWF0XykgewotICAgIC8vIDMyYnBwLgotICAgIGNhc2UgUkdCMzI6Ci0gICAgICByZXR1cm4gd2lkdGggKiA0OwotCi0gICAgLy8gUGxhbmFyLCA4YnBwLgotICAgIGNhc2UgWVYxMjoKLSAgICBjYXNlIFlWMTY6Ci0gICAgICBpZiAocGxhbmUgPT0ga1lQbGFuZSkKLSAgICAgICAgcmV0dXJuIHdpZHRoOwotICAgICAgcmV0dXJuIFJvdW5kVXAod2lkdGgsIDIpIC8gMjsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIC8vIEludGVudGlvbmFsbHkgbGVhdmUgb3V0IG5vbi1wcm9kdWN0aW9uIGZvcm1hdHMuCi0gIE5PVFJFQUNIRUQoKSA8PCAiVW5zdXBwb3J0ZWQgdmlkZW8gZnJhbWUgZm9ybWF0OiAiIDw8IGZvcm1hdF87Ci0gIHJldHVybiAwOwotfQotCi1pbnQgVmlkZW9GcmFtZTo6cm93cyhzaXplX3QgcGxhbmUpIGNvbnN0IHsKLSAgRENIRUNLKElzVmFsaWRQbGFuZShwbGFuZSkpOwotICBpbnQgaGVpZ2h0ID0gY29kZWRfc2l6ZV8uaGVpZ2h0KCk7Ci0gIHN3aXRjaCAoZm9ybWF0XykgewotICAgIGNhc2UgUkdCMzI6Ci0gICAgY2FzZSBZVjE2OgotICAgICAgcmV0dXJuIGhlaWdodDsKLQotICAgIGNhc2UgWVYxMjoKLSAgICAgIGlmIChwbGFuZSA9PSBrWVBsYW5lKQotICAgICAgICByZXR1cm4gaGVpZ2h0OwotICAgICAgcmV0dXJuIFJvdW5kVXAoaGVpZ2h0LCAyKSAvIDI7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICAvLyBJbnRlbnRpb25hbGx5IGxlYXZlIG91dCBub24tcHJvZHVjdGlvbiBmb3JtYXRzLgotICBOT1RSRUFDSEVEKCkgPDwgIlVuc3VwcG9ydGVkIHZpZGVvIGZyYW1lIGZvcm1hdDogIiA8PCBmb3JtYXRfOwotICByZXR1cm4gMDsKLX0KLQotdWludDgqIFZpZGVvRnJhbWU6OmRhdGEoc2l6ZV90IHBsYW5lKSBjb25zdCB7Ci0gIERDSEVDSyhJc1ZhbGlkUGxhbmUocGxhbmUpKTsKLSAgcmV0dXJuIGRhdGFfW3BsYW5lXTsKLX0KLQotdWludHB0cl90IFZpZGVvRnJhbWU6OnRleHR1cmVfaWQoKSBjb25zdCB7Ci0gIERDSEVDS19FUShmb3JtYXRfLCBOQVRJVkVfVEVYVFVSRSk7Ci0gIHJldHVybiB0ZXh0dXJlX2lkXzsKLX0KLQotdWludDMyIFZpZGVvRnJhbWU6OnRleHR1cmVfdGFyZ2V0KCkgY29uc3QgewotICBEQ0hFQ0tfRVEoZm9ybWF0XywgTkFUSVZFX1RFWFRVUkUpOwotICByZXR1cm4gdGV4dHVyZV90YXJnZXRfOwotfQotCi1ib29sIFZpZGVvRnJhbWU6OklzRW5kT2ZTdHJlYW0oKSBjb25zdCB7Ci0gIHJldHVybiBmb3JtYXRfID09IFZpZGVvRnJhbWU6OkVNUFRZOwotfQotCi12b2lkIFZpZGVvRnJhbWU6Okhhc2hGcmFtZUZvclRlc3RpbmcoYmFzZTo6TUQ1Q29udGV4dCogY29udGV4dCkgewotICBmb3IgKGludCBwbGFuZSA9IDA7IHBsYW5lIDwga01heFBsYW5lczsgKytwbGFuZSkgewotICAgIGlmICghSXNWYWxpZFBsYW5lKHBsYW5lKSkKLSAgICAgIGJyZWFrOwotICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IHJvd3MocGxhbmUpOyArK3JvdykgewotICAgICAgYmFzZTo6TUQ1VXBkYXRlKGNvbnRleHQsIGJhc2U6OlN0cmluZ1BpZWNlKAotICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGRhdGEocGxhbmUpICsgc3RyaWRlKHBsYW5lKSAqIHJvdyksCi0gICAgICAgICAgcm93X2J5dGVzKHBsYW5lKSkpOwotICAgIH0KLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3ZpZGVvX2ZyYW1lLmggYi9zcmMvbWVkaWEvYmFzZS92aWRlb19mcmFtZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzlmZWFjLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9iYXNlL3ZpZGVvX2ZyYW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9CQVNFX1ZJREVPX0ZSQU1FX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfVklERU9fRlJBTUVfSF8KLQotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKLSNpbmNsdWRlICJiYXNlL21kNS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYnVmZmVycy5oIgotI2luY2x1ZGUgInVpL2dmeC9yZWN0LmgiCi0jaW5jbHVkZSAidWkvZ2Z4L3NpemUuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgTUVESUFfRVhQT1JUIFZpZGVvRnJhbWUgOiBwdWJsaWMgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8VmlkZW9GcmFtZT4gewotIHB1YmxpYzoKLSAgZW51bSB7Ci0gICAga0ZyYW1lU2l6ZUFsaWdubWVudCA9IDE2LAotICAgIGtGcmFtZVNpemVQYWRkaW5nID0gMTYsCi0gICAga0ZyYW1lQWRkcmVzc0FsaWdubWVudCA9IDMyCi0gIH07Ci0KLSAgZW51bSB7Ci0gICAga01heFBsYW5lcyA9IDMsCi0KLSAgICBrUkdCUGxhbmUgPSAwLAotCi0gICAga1lQbGFuZSA9IDAsCi0gICAga1VQbGFuZSA9IDEsCi0gICAga1ZQbGFuZSA9IDIsCi0gIH07Ci0KLSAgLy8gU3VyZmFjZSBmb3JtYXRzIHJvdWdobHkgYmFzZWQgb24gRk9VUkNDIGxhYmVscywgc2VlOgotICAvLyBodHRwOi8vd3d3LmZvdXJjYy5vcmcvcmdiLnBocAotICAvLyBodHRwOi8vd3d3LmZvdXJjYy5vcmcveXV2LnBocAotICAvLyBLZWVwIGluIHN5bmMgd2l0aCBXZWJLaXQ6OldlYlZpZGVvRnJhbWUhCi0gIGVudW0gRm9ybWF0IHsKLSAgICBJTlZBTElEID0gMCwgIC8vIEludmFsaWQgZm9ybWF0IHZhbHVlLiAgVXNlZCBmb3IgZXJyb3IgcmVwb3J0aW5nLgotICAgIFJHQjMyID0gNCwgIC8vIDMyYnBwIFJHQiBwYWNrZWQgd2l0aCBleHRyYSBieXRlIDg6ODo4Ci0gICAgWVYxMiA9IDYsICAvLyAxMmJwcCBZVlUgcGxhbmFyIDF4MSBZLCAyeDIgVlUgc2FtcGxlcwotICAgIFlWMTYgPSA3LCAgLy8gMTZicHAgWVZVIHBsYW5hciAxeDEgWSwgMngxIFZVIHNhbXBsZXMKLSAgICBFTVBUWSA9IDksICAvLyBBbiBlbXB0eSBmcmFtZS4KLSAgICBJNDIwID0gMTEsICAvLyAxMmJwcCBZVlUgcGxhbmFyIDF4MSBZLCAyeDIgVVYgc2FtcGxlcy4KLSAgICBOQVRJVkVfVEVYVFVSRSA9IDEyLCAgLy8gTmF0aXZlIHRleHR1cmUuICBQaXhlbC1mb3JtYXQgYWdub3N0aWMuCi0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICAgIFBVTkNIX09VVD0gMTMsIC8vIFB1bmNoIG91dCBmcmFtZQotI2VuZGlmCi0gIH07Ci0KLSAgLy8gQ3JlYXRlcyBhIG5ldyBmcmFtZSBpbiBzeXN0ZW0gbWVtb3J5IHdpdGggZ2l2ZW4gcGFyYW1ldGVycy4gQnVmZmVycyBmb3IKLSAgLy8gdGhlIGZyYW1lIGFyZSBhbGxvY2F0ZWQgYnV0IG5vdCBpbml0aWFsaXplZC4KLSAgLy8gfGNvZGVkX3NpemV8IGlzIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBmcmFtZSBkYXRhIGluIHBpeGVscy4KLSAgLy8gfHZpc2libGVfcmVjdHwgaXMgdGhlIHZpc2libGUgcG9ydGlvbiBvZiB8Y29kZWRfc2l6ZXwsIGFmdGVyIGNyb3BwaW5nIChpZgotICAvLyBhbnkpIGlzIGFwcGxpZWQuCi0gIC8vIHxuYXR1cmFsX3NpemV8IGlzIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBmcmFtZSB3aGVuIHRoZSBmcmFtZSdzIGFzcGVjdAotICAvLyByYXRpbyBpcyBhcHBsaWVkIHRvIHx2aXNpYmxlX3JlY3R8LgotICBzdGF0aWMgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiBDcmVhdGVGcmFtZSgKLSAgICAgIEZvcm1hdCBmb3JtYXQsCi0gICAgICBjb25zdCBnZng6OlNpemUmIGNvZGVkX3NpemUsCi0gICAgICBjb25zdCBnZng6OlJlY3QmIHZpc2libGVfcmVjdCwKLSAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgbmF0dXJhbF9zaXplLAotICAgICAgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCk7Ci0KLSAgLy8gQ2FsbCBwcmlvciB0byBDcmVhdGVGcmFtZSB0byBlbnN1cmUgdmFsaWRpdHkgb2YgZnJhbWUgY29uZmlndXJhdGlvbi4gQ2FsbGVkCi0gIC8vIGF1dG9tYXRpY2FsbHkgYnkgVmlkZW9EZWNvZGVyQ29uZmlnOjpJc1ZhbGlkQ29uZmlnKCkuCi0gIC8vIFRPRE8oc2NoZXJrdXMpOiBWaWRlb0RlY29kZXJDb25maWcgc2hvdWxkbid0IGNhbGwgdGhpcyBtZXRob2QKLSAgc3RhdGljIGJvb2wgSXNWYWxpZENvbmZpZyhGb3JtYXQgZm9ybWF0LCBjb25zdCBnZng6OlNpemUmIGNvZGVkX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Z4OjpSZWN0JiB2aXNpYmxlX3JlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Z4OjpTaXplJiBuYXR1cmFsX3NpemUpOwotCi0gIC8vIENCIHRvIHdyaXRlIHBpeGVscyBmcm9tIHRoZSB0ZXh0dXJlIGJhY2tpbmcgdGhpcyBmcmFtZSBpbnRvIHRoZQotICAvLyB8dm9pZCp8IHBhcmFtZXRlci4KLSAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKHZvaWQqKT4gUmVhZFBpeGVsc0NCOwotCi0gIC8vIFdyYXBzIGEgbmF0aXZlIHRleHR1cmUgb2YgdGhlIGdpdmVuIHBhcmFtZXRlcnMgd2l0aCBhIFZpZGVvRnJhbWUuICBXaGVuIHRoZQotICAvLyBmcmFtZSBpcyBkZXN0cm95ZWQgfG5vX2xvbmdlcl9uZWVkZWRfY2IuUnVuKCl8IHdpbGwgYmUgY2FsbGVkLgotICAvLyB8Y29kZWRfc2l6ZXwgaXMgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGZyYW1lIGRhdGEgaW4gcGl4ZWxzLgotICAvLyB8dmlzaWJsZV9yZWN0fCBpcyB0aGUgdmlzaWJsZSBwb3J0aW9uIG9mIHxjb2RlZF9zaXplfCwgYWZ0ZXIgY3JvcHBpbmcgKGlmCi0gIC8vIGFueSkgaXMgYXBwbGllZC4KLSAgLy8gfG5hdHVyYWxfc2l6ZXwgaXMgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGZyYW1lIHdoZW4gdGhlIGZyYW1lJ3MgYXNwZWN0Ci0gIC8vIHJhdGlvIGlzIGFwcGxpZWQgdG8gfHZpc2libGVfcmVjdHwuCi0gIC8vIHxyZWFkX3BpeGVsc19jYnwgbWF5IGJlIHVzZWQgdG8gZG8gKHNsb3chKSByZWFkYmFja3MgZnJvbSB0aGUKLSAgLy8gdGV4dHVyZSB0byBtYWluIG1lbW9yeS4KLSAgc3RhdGljIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gV3JhcE5hdGl2ZVRleHR1cmUoCi0gICAgICB1aW50cHRyX3QgdGV4dHVyZV9pZCwKLSAgICAgIHVpbnQzMiB0ZXh0dXJlX3RhcmdldCwKLSAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgY29kZWRfc2l6ZSwKLSAgICAgIGNvbnN0IGdmeDo6UmVjdCYgdmlzaWJsZV9yZWN0LAotICAgICAgY29uc3QgZ2Z4OjpTaXplJiBuYXR1cmFsX3NpemUsCi0gICAgICBiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wLAotICAgICAgY29uc3QgUmVhZFBpeGVsc0NCJiByZWFkX3BpeGVsc19jYiwKLSAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIG5vX2xvbmdlcl9uZWVkZWRfY2IpOwotCi0gIC8vIFJlYWQgcGl4ZWxzIGZyb20gdGhlIG5hdGl2ZSB0ZXh0dXJlIGJhY2tpbmcgfCp0aGlzfCBhbmQgd3JpdGUKLSAgLy8gdGhlbSB0byB8KnBpeGVsc3wgYXMgQkdSQS4gIHxwaXhlbHN8IG11c3QgcG9pbnQgdG8gYSBidWZmZXIgYXQKLSAgLy8gbGVhc3QgYXMgbGFyZ2UgYXMgNCp2aXNpYmxlX3JlY3QoKS53aWR0aCgpKnZpc2libGVfcmVjdCgpLmhlaWdodCgpLgotICB2b2lkIFJlYWRQaXhlbHNGcm9tTmF0aXZlVGV4dHVyZSh2b2lkKiBwaXhlbHMpOwotCi0gIC8vIFdyYXBzIGV4dGVybmFsIFlVViBkYXRhIG9mIHRoZSBnaXZlbiBwYXJhbWV0ZXJzIHdpdGggYSBWaWRlb0ZyYW1lLgotICAvLyBUaGUgcmV0dXJuZWQgVmlkZW9GcmFtZSBkb2VzIG5vdCBvd24gdGhlIGRhdGEgcGFzc2VkIGluLiBXaGVuIHRoZSBmcmFtZQotICAvLyBpcyBkZXN0cm95ZWQgfG5vX2xvbmdlcl9uZWVkZWRfY2IuUnVuKCl8IHdpbGwgYmUgY2FsbGVkLgotICBzdGF0aWMgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiBXcmFwRXh0ZXJuYWxZdXZEYXRhKAotICAgICAgRm9ybWF0IGZvcm1hdCwKLSAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgY29kZWRfc2l6ZSwKLSAgICAgIGNvbnN0IGdmeDo6UmVjdCYgdmlzaWJsZV9yZWN0LAotICAgICAgY29uc3QgZ2Z4OjpTaXplJiBuYXR1cmFsX3NpemUsCi0gICAgICBpbnQzMiB5X3N0cmlkZSwKLSAgICAgIGludDMyIHVfc3RyaWRlLAotICAgICAgaW50MzIgdl9zdHJpZGUsCi0gICAgICB1aW50OCogeV9kYXRhLAotICAgICAgdWludDgqIHVfZGF0YSwKLSAgICAgIHVpbnQ4KiB2X2RhdGEsCi0gICAgICBiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wLAotICAgICAgY29uc3QgYmFzZTo6Q2xvc3VyZSYgbm9fbG9uZ2VyX25lZWRlZF9jYik7Ci0KLSAgLy8gQ3JlYXRlcyBhIGZyYW1lIHdpdGggZm9ybWF0IGVxdWFscyB0byBWaWRlb0ZyYW1lOjpFTVBUWSwgd2lkdGgsIGhlaWdodCwKLSAgLy8gYW5kIHRpbWVzdGFtcCBhcmUgYWxsIDAuCi0gIHN0YXRpYyBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IENyZWF0ZUVtcHR5RnJhbWUoKTsKLQotICAvLyBBbGxvY2F0ZXMgWVYxMiBmcmFtZSBiYXNlZCBvbiB8c2l6ZXwsIGFuZCBzZXRzIGl0cyBkYXRhIHRvIHRoZSBZVVYoeSx1LHYpLgotICBzdGF0aWMgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiBDcmVhdGVDb2xvckZyYW1lKAotICAgICAgY29uc3QgZ2Z4OjpTaXplJiBzaXplLAotICAgICAgdWludDggeSwgdWludDggdSwgdWludDggdiwKLSAgICAgIGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXApOwotCi0gIC8vIEFsbG9jYXRlcyBZVjEyIGZyYW1lIGJhc2VkIG9uIHxzaXplfCwgYW5kIHNldHMgaXRzIGRhdGEgdG8gdGhlIFlVVgotICAvLyBlcXVpdmFsZW50IG9mIFJHQigwLDAsMCkuCi0gIHN0YXRpYyBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IENyZWF0ZUJsYWNrRnJhbWUoY29uc3QgZ2Z4OjpTaXplJiBzaXplKTsKLQotI2lmIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLSAgLy8gQWxsb2NhdGVzIGEgcHVuY2ggb3V0IGZyYW1lIHdpdGggYWxsIHN0YXRzIHNldCB0byAwLgotICAvLyBXaGVuIHJlbmRlcmVkLCB0aGUgZnJhbWUgd2lsbCBjYXVzZSBhIGhvbGUgdG8gYmUgcHVuY2hlZCBvdXQgZGlzY2FyZGluZwotICAvLyBldmVyeXRoaW5nIHRoYXQgd2FzIHJlbmRlcmVkIHVuZGVybmVhdGggaXQKLSAgc3RhdGljIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gQ3JlYXRlUHVuY2hPdXRGcmFtZShjb25zdCBnZng6OlNpemUmIHNpemUpOwotI2VuZGlmCi0KLSAgRm9ybWF0IGZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIGZvcm1hdF87IH0KLQotICBjb25zdCBnZng6OlNpemUmIGNvZGVkX3NpemUoKSBjb25zdCB7IHJldHVybiBjb2RlZF9zaXplXzsgfQotICBjb25zdCBnZng6OlJlY3QmIHZpc2libGVfcmVjdCgpIGNvbnN0IHsgcmV0dXJuIHZpc2libGVfcmVjdF87IH0KLSAgY29uc3QgZ2Z4OjpTaXplJiBuYXR1cmFsX3NpemUoKSBjb25zdCB7IHJldHVybiBuYXR1cmFsX3NpemVfOyB9Ci0KLSAgaW50IHN0cmlkZShzaXplX3QgcGxhbmUpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBwZXIgcm93IGFuZCBudW1iZXIgb2Ygcm93cyBmb3IgYSBnaXZlbiBwbGFuZS4KLSAgLy8KLSAgLy8gQXMgb3Bwb3NlZCB0byBzdHJpZGUoKSwgcm93X2J5dGVzKCkgcmVmZXJzIHRvIHRoZSBieXRlcyByZXByZXNlbnRpbmcKLSAgLy8gZnJhbWUgZGF0YSBzY2FubGluZXMgKGNvZGVkX3NpemUud2lkdGgoKSBwaXhlbHMsIHdpdGhvdXQgc3RyaWRlIHBhZGRpbmcpLgotICBpbnQgcm93X2J5dGVzKHNpemVfdCBwbGFuZSkgY29uc3Q7Ci0gIGludCByb3dzKHNpemVfdCBwbGFuZSkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyBwb2ludGVyIHRvIHRoZSBidWZmZXIgZm9yIGEgZ2l2ZW4gcGxhbmUuIFRoZSBtZW1vcnkgaXMgb3duZWQgYnkKLSAgLy8gVmlkZW9GcmFtZSBvYmplY3QgYW5kIG11c3Qgbm90IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCi0gIHVpbnQ4KiBkYXRhKHNpemVfdCBwbGFuZSkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0aGUgSUQgb2YgdGhlIG5hdGl2ZSB0ZXh0dXJlIHdyYXBwZWQgYnkgdGhpcyBmcmFtZS4gIE9ubHkgdmFsaWQgdG8KLSAgLy8gY2FsbCBpZiB0aGlzIGlzIGEgTkFUSVZFX1RFWFRVUkUgZnJhbWUuCi0gIHVpbnRwdHJfdCB0ZXh0dXJlX2lkKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0aGUgdGV4dHVyZSB0YXJnZXQuIE9ubHkgdmFsaWQgZm9yIE5BVElWRV9URVhUVVJFIGZyYW1lcy4KLSAgdWludDMyIHRleHR1cmVfdGFyZ2V0KCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgVmlkZW9GcmFtZSByZXByZXNlbnRzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4KLSAgYm9vbCBJc0VuZE9mU3RyZWFtKCkgY29uc3Q7Ci0KLSAgYmFzZTo6VGltZURlbHRhIEdldFRpbWVzdGFtcCgpIGNvbnN0IHsKLSAgICByZXR1cm4gdGltZXN0YW1wXzsKLSAgfQotICB2b2lkIFNldFRpbWVzdGFtcChjb25zdCBiYXNlOjpUaW1lRGVsdGEmIHRpbWVzdGFtcCkgewotICAgIHRpbWVzdGFtcF8gPSB0aW1lc3RhbXA7Ci0gIH0KLQotICAvLyBVc2VkIHRvIGtlZXAgYSBydW5uaW5nIGhhc2ggb2Ygc2VlbiBmcmFtZXMuICBFeHBlY3RzIGFuIGluaXRpYWxpemVkIE1ENQotICAvLyBjb250ZXh0LiAgQ2FsbHMgTUQ1VXBkYXRlIHdpdGggdGhlIGNvbnRleHQgYW5kIHRoZSBjb250ZW50cyBvZiB0aGUgZnJhbWUuCi0gIHZvaWQgSGFzaEZyYW1lRm9yVGVzdGluZyhiYXNlOjpNRDVDb250ZXh0KiBjb250ZXh0KTsKLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxWaWRlb0ZyYW1lPjsKLSAgLy8gQ2xpZW50cyBtdXN0IHVzZSB0aGUgc3RhdGljIENyZWF0ZUZyYW1lKCkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBmcmFtZS4KLSAgVmlkZW9GcmFtZShGb3JtYXQgZm9ybWF0LAotICAgICAgICAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgY29kZWRfc2l6ZSwKLSAgICAgICAgICAgICBjb25zdCBnZng6OlJlY3QmIHZpc2libGVfcmVjdCwKLSAgICAgICAgICAgICBjb25zdCBnZng6OlNpemUmIG5hdHVyYWxfc2l6ZSwKLSAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wKTsKLSAgdmlydHVhbCB+VmlkZW9GcmFtZSgpOwotCi0gIC8vIFVzZWQgaW50ZXJuYWxseSBieSBDcmVhdGVGcmFtZSgpLgotICB2b2lkIEFsbG9jYXRlUkdCKHNpemVfdCBieXRlc19wZXJfcGl4ZWwpOwotICB2b2lkIEFsbG9jYXRlWVVWKCk7Ci0KLSAgLy8gVXNlZCB0byBEQ0hFQ0soKSBwbGFuZSBwYXJhbWV0ZXJzLgotICBib29sIElzVmFsaWRQbGFuZShzaXplX3QgcGxhbmUpIGNvbnN0OwotCi0gIC8vIEZyYW1lIGZvcm1hdC4KLSAgRm9ybWF0IGZvcm1hdF87Ci0KLSAgLy8gV2lkdGggYW5kIGhlaWdodCBvZiB0aGUgdmlkZW8gZnJhbWUuCi0gIGdmeDo6U2l6ZSBjb2RlZF9zaXplXzsKLQotICAvLyBXaWR0aCwgaGVpZ2h0LCBhbmQgb2Zmc2V0cyBvZiB0aGUgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSB2aWRlbyBmcmFtZS4KLSAgZ2Z4OjpSZWN0IHZpc2libGVfcmVjdF87Ci0KLSAgLy8gV2lkdGggYW5kIGhlaWdodCBvZiB0aGUgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSB2aWRlbyBmcmFtZSB3aXRoIGFzcGVjdAotICAvLyByYXRpbyB0YWtlbiBpbnRvIGFjY291bnQuCi0gIGdmeDo6U2l6ZSBuYXR1cmFsX3NpemVfOwotCi0gIC8vIEFycmF5IG9mIHN0cmlkZXMgZm9yIGVhY2ggcGxhbmUsIHR5cGljYWxseSBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSB3aWR0aAotICAvLyBvZiB0aGUgc3VyZmFjZSBkaXZpZGVkIGJ5IHRoZSBob3Jpem9udGFsIHNhbXBsaW5nIHBlcmlvZC4gIE5vdGUgdGhhdAotICAvLyBzdHJpZGVzIGNhbiBiZSBuZWdhdGl2ZS4KLSAgaW50MzIgc3RyaWRlc19ba01heFBsYW5lc107Ci0KLSAgLy8gQXJyYXkgb2YgZGF0YSBwb2ludGVycyB0byBlYWNoIHBsYW5lLgotICB1aW50OCogZGF0YV9ba01heFBsYW5lc107Ci0KLSAgLy8gTmF0aXZlIHRleHR1cmUgSUQsIGlmIHRoaXMgaXMgYSBOQVRJVkVfVEVYVFVSRSBmcmFtZS4KLSAgdWludHB0cl90IHRleHR1cmVfaWRfOwotICB1aW50MzIgdGV4dHVyZV90YXJnZXRfOwotICBSZWFkUGl4ZWxzQ0IgcmVhZF9waXhlbHNfY2JfOwotCi0gIGJhc2U6OkNsb3N1cmUgbm9fbG9uZ2VyX25lZWRlZF9jYl87Ci0KLSAgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcF87Ci0KLSAgRElTQUxMT1dfSU1QTElDSVRfQ09OU1RSVUNUT1JTKFZpZGVvRnJhbWUpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQkFTRV9WSURFT19GUkFNRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvdmlkZW9fZnJhbWVfdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvYmFzZS92aWRlb19mcmFtZV91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThjYzFkMy4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS92aWRlb19mcmFtZV91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb19mcmFtZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9mb3JtYXRfbWFjcm9zLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgImJhc2Uvc3RyaW5ncHJpbnRmLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9idWZmZXJzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS95dXZfY29udmVydC5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi11c2luZyBiYXNlOjpNRDVEaWdlc3RUb0Jhc2UxNjsKLQotLy8gSGVscGVyIGZ1bmN0aW9uIHRoYXQgaW5pdGlhbGl6ZXMgYSBZVjEyIGZyYW1lIHdpdGggd2hpdGUgYW5kIGJsYWNrIHNjYW4KLS8vIGxpbmVzIGJhc2VkIG9uIHRoZSB8d2hpdGVfdG9fYmxhY2t8IHBhcmFtZXRlci4gIElmIDAsIHRoZW4gdGhlIGVudGlyZQotLy8gZnJhbWUgd2lsbCBiZSBibGFjaywgaWYgMSB0aGVuIHRoZSBlbnRpcmUgZnJhbWUgd2lsbCBiZSB3aGl0ZS4KLXZvaWQgSW5pdGlhbGl6ZVlWMTJGcmFtZShWaWRlb0ZyYW1lKiBmcmFtZSwgZG91YmxlIHdoaXRlX3RvX2JsYWNrKSB7Ci0gIEVYUEVDVF9FUShWaWRlb0ZyYW1lOjpZVjEyLCBmcmFtZS0+Zm9ybWF0KCkpOwotICBpbnQgZmlyc3RfYmxhY2tfcm93ID0gc3RhdGljX2Nhc3Q8aW50PihmcmFtZS0+Y29kZWRfc2l6ZSgpLmhlaWdodCgpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpdGVfdG9fYmxhY2spOwotICB1aW50OCogeV9wbGFuZSA9IGZyYW1lLT5kYXRhKFZpZGVvRnJhbWU6OmtZUGxhbmUpOwotICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBmcmFtZS0+Y29kZWRfc2l6ZSgpLmhlaWdodCgpOyArK3JvdykgewotICAgIGludCBjb2xvciA9IChyb3cgPCBmaXJzdF9ibGFja19yb3cpID8gMHhGRiA6IDB4MDA7Ci0gICAgbWVtc2V0KHlfcGxhbmUsIGNvbG9yLCBmcmFtZS0+c3RyaWRlKFZpZGVvRnJhbWU6OmtZUGxhbmUpKTsKLSAgICB5X3BsYW5lICs9IGZyYW1lLT5zdHJpZGUoVmlkZW9GcmFtZTo6a1lQbGFuZSk7Ci0gIH0KLSAgdWludDgqIHVfcGxhbmUgPSBmcmFtZS0+ZGF0YShWaWRlb0ZyYW1lOjprVVBsYW5lKTsKLSAgdWludDgqIHZfcGxhbmUgPSBmcmFtZS0+ZGF0YShWaWRlb0ZyYW1lOjprVlBsYW5lKTsKLSAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgZnJhbWUtPmNvZGVkX3NpemUoKS5oZWlnaHQoKTsgcm93ICs9IDIpIHsKLSAgICBtZW1zZXQodV9wbGFuZSwgMHg4MCwgZnJhbWUtPnN0cmlkZShWaWRlb0ZyYW1lOjprVVBsYW5lKSk7Ci0gICAgbWVtc2V0KHZfcGxhbmUsIDB4ODAsIGZyYW1lLT5zdHJpZGUoVmlkZW9GcmFtZTo6a1ZQbGFuZSkpOwotICAgIHVfcGxhbmUgKz0gZnJhbWUtPnN0cmlkZShWaWRlb0ZyYW1lOjprVVBsYW5lKTsKLSAgICB2X3BsYW5lICs9IGZyYW1lLT5zdHJpZGUoVmlkZW9GcmFtZTo6a1ZQbGFuZSk7Ci0gIH0KLX0KLQotLy8gR2l2ZW4gYSB8eXYxMl9mcmFtZXwgdGhpcyBtZXRob2QgY29udmVydHMgdGhlIFlWMTIgZnJhbWUgdG8gUkdCQSBhbmQKLS8vIG1ha2VzIHN1cmUgdGhhdCBhbGwgdGhlIHBpeGVscyBvZiB0aGUgUkJHIGZyYW1lIGVxdWFsIHxleHBlY3RfcmdiX2NvbG9yfC4KLXZvaWQgRXhwZWN0RnJhbWVDb2xvcihtZWRpYTo6VmlkZW9GcmFtZSogeXYxMl9mcmFtZSwgdWludDMyIGV4cGVjdF9yZ2JfY29sb3IpIHsKLSAgQVNTRVJUX0VRKFZpZGVvRnJhbWU6OllWMTIsIHl2MTJfZnJhbWUtPmZvcm1hdCgpKTsKLSAgQVNTRVJUX0VRKHl2MTJfZnJhbWUtPnN0cmlkZShWaWRlb0ZyYW1lOjprVVBsYW5lKSwKLSAgICAgICAgICAgIHl2MTJfZnJhbWUtPnN0cmlkZShWaWRlb0ZyYW1lOjprVlBsYW5lKSk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxtZWRpYTo6VmlkZW9GcmFtZT4gcmdiX2ZyYW1lOwotICByZ2JfZnJhbWUgPSBtZWRpYTo6VmlkZW9GcmFtZTo6Q3JlYXRlRnJhbWUoVmlkZW9GcmFtZTo6UkdCMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5djEyX2ZyYW1lLT5jb2RlZF9zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5djEyX2ZyYW1lLT52aXNpYmxlX3JlY3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl2MTJfZnJhbWUtPm5hdHVyYWxfc2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXYxMl9mcmFtZS0+R2V0VGltZXN0YW1wKCkpOwotCi0gIEFTU0VSVF9FUSh5djEyX2ZyYW1lLT5jb2RlZF9zaXplKCkud2lkdGgoKSwKLSAgICAgIHJnYl9mcmFtZS0+Y29kZWRfc2l6ZSgpLndpZHRoKCkpOwotICBBU1NFUlRfRVEoeXYxMl9mcmFtZS0+Y29kZWRfc2l6ZSgpLmhlaWdodCgpLAotICAgICAgcmdiX2ZyYW1lLT5jb2RlZF9zaXplKCkuaGVpZ2h0KCkpOwotCi0gIG1lZGlhOjpDb252ZXJ0WVVWVG9SR0IzMih5djEyX2ZyYW1lLT5kYXRhKFZpZGVvRnJhbWU6OmtZUGxhbmUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeXYxMl9mcmFtZS0+ZGF0YShWaWRlb0ZyYW1lOjprVVBsYW5lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHl2MTJfZnJhbWUtPmRhdGEoVmlkZW9GcmFtZTo6a1ZQbGFuZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfZnJhbWUtPmRhdGEoVmlkZW9GcmFtZTo6a1JHQlBsYW5lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl9mcmFtZS0+Y29kZWRfc2l6ZSgpLndpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfZnJhbWUtPmNvZGVkX3NpemUoKS5oZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHl2MTJfZnJhbWUtPnN0cmlkZShWaWRlb0ZyYW1lOjprWVBsYW5lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHl2MTJfZnJhbWUtPnN0cmlkZShWaWRlb0ZyYW1lOjprVVBsYW5lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl9mcmFtZS0+c3RyaWRlKFZpZGVvRnJhbWU6OmtSR0JQbGFuZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6WVYxMik7Ci0KLSAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgcmdiX2ZyYW1lLT5jb2RlZF9zaXplKCkuaGVpZ2h0KCk7ICsrcm93KSB7Ci0gICAgdWludDMyKiByZ2Jfcm93X2RhdGEgPSByZWludGVycHJldF9jYXN0PHVpbnQzMio+KAotICAgICAgICByZ2JfZnJhbWUtPmRhdGEoVmlkZW9GcmFtZTo6a1JHQlBsYW5lKSArCi0gICAgICAgIChyZ2JfZnJhbWUtPnN0cmlkZShWaWRlb0ZyYW1lOjprUkdCUGxhbmUpICogcm93KSk7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcmdiX2ZyYW1lLT5jb2RlZF9zaXplKCkud2lkdGgoKTsgKytjb2wpIHsKLSAgICAgIFNDT1BFRF9UUkFDRSgKLSAgICAgICAgICBiYXNlOjpTdHJpbmdQcmludGYoIkNoZWNraW5nICglZCwgJWQpIiwgcm93LCBjb2wpKTsKLSAgICAgIEVYUEVDVF9FUShleHBlY3RfcmdiX2NvbG9yLCByZ2Jfcm93X2RhdGFbY29sXSk7Ci0gICAgfQotICB9Ci19Ci0KLS8vIEZpbGwgZWFjaCBwbGFuZSB0byBpdHMgcmVwb3J0ZWQgZXh0ZW50cyBhbmQgdmVyaWZ5IGFjY2Vzc29ycyByZXBvcnQgbm9uCi0vLyB6ZXJvIHZhbHVlcy4gIEFkZGl0aW9uYWxseSwgZm9yIHRoZSBmaXJzdCBwbGFuZSB2ZXJpZnkgdGhlIHJvd3MgYW5kCi0vLyByb3dfYnl0ZXMgdmFsdWVzIGFyZSBjb3JyZWN0Lgotdm9pZCBFeHBlY3RGcmFtZUV4dGVudHMoVmlkZW9GcmFtZTo6Rm9ybWF0IGZvcm1hdCwgaW50IHBsYW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBieXRlc19wZXJfcGl4ZWwsIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2hhc2gpIHsKLSAgY29uc3QgdW5zaWduZWQgY2hhciBrRmlsbEJ5dGUgPSAweDgwOwotICBjb25zdCBpbnQga1dpZHRoID0gNjE7Ci0gIGNvbnN0IGludCBrSGVpZ2h0ID0gMzE7Ci0gIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSBrVGltZXN0YW1wID0gYmFzZTo6VGltZURlbHRhOjpGcm9tTWljcm9zZWNvbmRzKDEzMzcpOwotCi0gIGdmeDo6U2l6ZSBzaXplKGtXaWR0aCwga0hlaWdodCk7Ci0gIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gZnJhbWUgPSBWaWRlb0ZyYW1lOjpDcmVhdGVGcmFtZSgKLSAgICAgIGZvcm1hdCwgc2l6ZSwgZ2Z4OjpSZWN0KHNpemUpLCBzaXplLCBrVGltZXN0YW1wKTsKLSAgQVNTRVJUX1RSVUUoZnJhbWUpOwotCi0gIGZvcihpbnQgcGxhbmUgPSAwOyBwbGFuZSA8IHBsYW5lczsgcGxhbmUrKykgewotICAgIFNDT1BFRF9UUkFDRShiYXNlOjpTdHJpbmdQcmludGYoIkNoZWNraW5nIHBsYW5lICVkIiwgcGxhbmUpKTsKLSAgICBFWFBFQ1RfVFJVRShmcmFtZS0+ZGF0YShwbGFuZSkpOwotICAgIEVYUEVDVF9UUlVFKGZyYW1lLT5zdHJpZGUocGxhbmUpKTsKLSAgICBFWFBFQ1RfVFJVRShmcmFtZS0+cm93cyhwbGFuZSkpOwotICAgIEVYUEVDVF9UUlVFKGZyYW1lLT5yb3dfYnl0ZXMocGxhbmUpKTsKLQotICAgIGlmIChwbGFuZSA9PSAwKSB7Ci0gICAgICBFWFBFQ1RfRVEoZnJhbWUtPnJvd3MocGxhbmUpLCBrSGVpZ2h0KTsKLSAgICAgIEVYUEVDVF9FUShmcmFtZS0+cm93X2J5dGVzKHBsYW5lKSwga1dpZHRoICogYnl0ZXNfcGVyX3BpeGVsKTsKLSAgICB9Ci0KLSAgICBtZW1zZXQoZnJhbWUtPmRhdGEocGxhbmUpLCBrRmlsbEJ5dGUsCi0gICAgICAgICAgIGZyYW1lLT5zdHJpZGUocGxhbmUpICogZnJhbWUtPnJvd3MocGxhbmUpKTsKLSAgfQotCi0gIGJhc2U6Ok1ENUNvbnRleHQgY29udGV4dDsKLSAgYmFzZTo6TUQ1SW5pdCgmY29udGV4dCk7Ci0gIGZyYW1lLT5IYXNoRnJhbWVGb3JUZXN0aW5nKCZjb250ZXh0KTsKLSAgYmFzZTo6TUQ1RGlnZXN0IGRpZ2VzdDsKLSAgYmFzZTo6TUQ1RmluYWwoJmRpZ2VzdCwgJmNvbnRleHQpOwotICBFWFBFQ1RfRVEoTUQ1RGlnZXN0VG9CYXNlMTYoZGlnZXN0KSwgZXhwZWN0ZWRfaGFzaCk7Ci19Ci0KLVRFU1QoVmlkZW9GcmFtZSwgQ3JlYXRlRnJhbWUpIHsKLSAgY29uc3QgaW50IGtXaWR0aCA9IDY0OwotICBjb25zdCBpbnQga0hlaWdodCA9IDQ4OwotICBjb25zdCBiYXNlOjpUaW1lRGVsdGEga1RpbWVzdGFtcCA9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pY3Jvc2Vjb25kcygxMzM3KTsKLQotICAvLyBDcmVhdGUgYSBZVjEyIFZpZGVvIEZyYW1lLgotICBnZng6OlNpemUgc2l6ZShrV2lkdGgsIGtIZWlnaHQpOwotICBzY29wZWRfcmVmcHRyPG1lZGlhOjpWaWRlb0ZyYW1lPiBmcmFtZSA9Ci0gICAgICBWaWRlb0ZyYW1lOjpDcmVhdGVGcmFtZShtZWRpYTo6VmlkZW9GcmFtZTo6WVYxMiwgc2l6ZSwgZ2Z4OjpSZWN0KHNpemUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwga1RpbWVzdGFtcCk7Ci0gIEFTU0VSVF9UUlVFKGZyYW1lKTsKLQotICAvLyBUZXN0IFZpZGVvRnJhbWUgaW1wbGVtZW50YXRpb24uCi0gIEVYUEVDVF9FUShtZWRpYTo6VmlkZW9GcmFtZTo6WVYxMiwgZnJhbWUtPmZvcm1hdCgpKTsKLSAgewotICAgIFNDT1BFRF9UUkFDRSgiIik7Ci0gICAgSW5pdGlhbGl6ZVlWMTJGcmFtZShmcmFtZSwgMC4wZik7Ci0gICAgRXhwZWN0RnJhbWVDb2xvcihmcmFtZSwgMHhGRjAwMDAwMCk7Ci0gIH0KLSAgYmFzZTo6TUQ1RGlnZXN0IGRpZ2VzdDsKLSAgYmFzZTo6TUQ1Q29udGV4dCBjb250ZXh0OwotICBiYXNlOjpNRDVJbml0KCZjb250ZXh0KTsKLSAgZnJhbWUtPkhhc2hGcmFtZUZvclRlc3RpbmcoJmNvbnRleHQpOwotICBiYXNlOjpNRDVGaW5hbCgmZGlnZXN0LCAmY29udGV4dCk7Ci0gIEVYUEVDVF9FUShNRDVEaWdlc3RUb0Jhc2UxNihkaWdlc3QpLCAiOTA2NWM4NDFkOWZjYTQ5MTg2ZWY4YjRlZjU0N2U3OWIiKTsKLSAgewotICAgIFNDT1BFRF9UUkFDRSgiIik7Ci0gICAgSW5pdGlhbGl6ZVlWMTJGcmFtZShmcmFtZSwgMS4wZik7Ci0gICAgRXhwZWN0RnJhbWVDb2xvcihmcmFtZSwgMHhGRkZGRkZGRik7Ci0gIH0KLSAgYmFzZTo6TUQ1SW5pdCgmY29udGV4dCk7Ci0gIGZyYW1lLT5IYXNoRnJhbWVGb3JUZXN0aW5nKCZjb250ZXh0KTsKLSAgYmFzZTo6TUQ1RmluYWwoJmRpZ2VzdCwgJmNvbnRleHQpOwotICBFWFBFQ1RfRVEoTUQ1RGlnZXN0VG9CYXNlMTYoZGlnZXN0KSwgIjkxMTk5MWQ1MTQzOGFkMmUxYTQwZWQ1ZjZmYzdjNzk2Iik7Ci0KLSAgLy8gVGVzdCBhbiBlbXB0eSBmcmFtZS4KLSAgZnJhbWUgPSBWaWRlb0ZyYW1lOjpDcmVhdGVFbXB0eUZyYW1lKCk7Ci0gIEVYUEVDVF9UUlVFKGZyYW1lLT5Jc0VuZE9mU3RyZWFtKCkpOwotfQotCi1URVNUKFZpZGVvRnJhbWUsIENyZWF0ZUJsYWNrRnJhbWUpIHsKLSAgY29uc3QgaW50IGtXaWR0aCA9IDI7Ci0gIGNvbnN0IGludCBrSGVpZ2h0ID0gMjsKLSAgY29uc3QgdWludDgga0V4cGVjdGVkWVJvd1tdID0geyAwLCAwIH07Ci0gIGNvbnN0IHVpbnQ4IGtFeHBlY3RlZFVWUm93W10gPSB7IDEyOCB9OwotCi0gIHNjb3BlZF9yZWZwdHI8bWVkaWE6OlZpZGVvRnJhbWU+IGZyYW1lID0KLSAgICAgIFZpZGVvRnJhbWU6OkNyZWF0ZUJsYWNrRnJhbWUoZ2Z4OjpTaXplKGtXaWR0aCwga0hlaWdodCkpOwotICBBU1NFUlRfVFJVRShmcmFtZSk7Ci0KLSAgLy8gVGVzdCBiYXNpYyBwcm9wZXJ0aWVzLgotICBFWFBFQ1RfRVEoMCwgZnJhbWUtPkdldFRpbWVzdGFtcCgpLkluTWljcm9zZWNvbmRzKCkpOwotICBFWFBFQ1RfRkFMU0UoZnJhbWUtPklzRW5kT2ZTdHJlYW0oKSk7Ci0KLSAgLy8gVGVzdCB8ZnJhbWV8IHByb3BlcnRpZXMuCi0gIEVYUEVDVF9FUShWaWRlb0ZyYW1lOjpZVjEyLCBmcmFtZS0+Zm9ybWF0KCkpOwotICBFWFBFQ1RfRVEoa1dpZHRoLCBmcmFtZS0+Y29kZWRfc2l6ZSgpLndpZHRoKCkpOwotICBFWFBFQ1RfRVEoa0hlaWdodCwgZnJhbWUtPmNvZGVkX3NpemUoKS5oZWlnaHQoKSk7Ci0KLSAgLy8gVGVzdCBmcmFtZXMgdGhlbXNlbHZlcy4KLSAgdWludDgqIHlfcGxhbmUgPSBmcmFtZS0+ZGF0YShWaWRlb0ZyYW1lOjprWVBsYW5lKTsKLSAgZm9yIChpbnQgeSA9IDA7IHkgPCBmcmFtZS0+Y29kZWRfc2l6ZSgpLmhlaWdodCgpOyArK3kpIHsKLSAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKGtFeHBlY3RlZFlSb3csIHlfcGxhbmUsIGFycmF5c2l6ZShrRXhwZWN0ZWRZUm93KSkpOwotICAgIHlfcGxhbmUgKz0gZnJhbWUtPnN0cmlkZShWaWRlb0ZyYW1lOjprWVBsYW5lKTsKLSAgfQotCi0gIHVpbnQ4KiB1X3BsYW5lID0gZnJhbWUtPmRhdGEoVmlkZW9GcmFtZTo6a1VQbGFuZSk7Ci0gIHVpbnQ4KiB2X3BsYW5lID0gZnJhbWUtPmRhdGEoVmlkZW9GcmFtZTo6a1ZQbGFuZSk7Ci0gIGZvciAoaW50IHkgPSAwOyB5IDwgZnJhbWUtPmNvZGVkX3NpemUoKS5oZWlnaHQoKSAvIDI7ICsreSkgewotICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoa0V4cGVjdGVkVVZSb3csIHVfcGxhbmUsIGFycmF5c2l6ZShrRXhwZWN0ZWRVVlJvdykpKTsKLSAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKGtFeHBlY3RlZFVWUm93LCB2X3BsYW5lLCBhcnJheXNpemUoa0V4cGVjdGVkVVZSb3cpKSk7Ci0gICAgdV9wbGFuZSArPSBmcmFtZS0+c3RyaWRlKFZpZGVvRnJhbWU6OmtVUGxhbmUpOwotICAgIHZfcGxhbmUgKz0gZnJhbWUtPnN0cmlkZShWaWRlb0ZyYW1lOjprVlBsYW5lKTsKLSAgfQotfQotCi0vLyBFbnN1cmUgZWFjaCBmcmFtZSBpcyBwcm9wZXJseSBzaXplZCBhbmQgYWxsb2NhdGVkLiAgV2lsbCB0cmlnZ2VyIE9PQiByZWFkcwotLy8gYW5kIHdyaXRlcyBhcyB3ZWxsIGFzIGluY29ycmVjdCBmcmFtZSBoYXNoZXMgb3RoZXJ3aXNlLgotVEVTVChWaWRlb0ZyYW1lLCBDaGVja0ZyYW1lRXh0ZW50cykgewotICAvLyBFYWNoIGNhbGwgY29uc2lzdHMgb2YgYSBWaWRlb0ZyYW1lOjpGb3JtYXQsICMgb2YgcGxhbmVzLCBieXRlcyBwZXIgcGl4ZWwsCi0gIC8vIGFuZCB0aGUgZXhwZWN0ZWQgaGFzaCBvZiBhbGwgcGxhbmVzIGlmIGZpbGxlZCB3aXRoIGtGaWxsQnl0ZSAoZGVmaW5lZCBpbgotICAvLyBFeHBlY3RGcmFtZUV4dGVudHMpLgotICBFeHBlY3RGcmFtZUV4dGVudHMoCi0gICAgICBWaWRlb0ZyYW1lOjpSR0IzMiwgIDEsIDQsICJkZTZkM2Q1NjdlMjgyZjZhMzhkNDc4ZjA0ZmM4MWZiMCIpOwotICBFeHBlY3RGcmFtZUV4dGVudHMoCi0gICAgICBWaWRlb0ZyYW1lOjpZVjEyLCAgIDMsIDEsICI3MTExM2JkZmQ0YzBkZTZjZjYyZjQ4ZmI3NGY3YTBiMSIpOwotICBFeHBlY3RGcmFtZUV4dGVudHMoCi0gICAgICBWaWRlb0ZyYW1lOjpZVjE2LCAgIDMsIDEsICI5YmI5OWFjM2ZmMzUwNjQ0ZWJmZjRkMjhkYzAxYjQ2MSIpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3ZpZGVvX3JlbmRlcmVyLmNjIGIvc3JjL21lZGlhL2Jhc2UvdmlkZW9fcmVuZGVyZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYThmMjEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvdmlkZW9fcmVuZGVyZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb19yZW5kZXJlci5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1WaWRlb1JlbmRlcmVyOjpWaWRlb1JlbmRlcmVyKCkge30KLVZpZGVvUmVuZGVyZXI6On5WaWRlb1JlbmRlcmVyKCkge30KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS92aWRlb19yZW5kZXJlci5oIGIvc3JjL21lZGlhL2Jhc2UvdmlkZW9fcmVuZGVyZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJkMzAyZi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS92aWRlb19yZW5kZXJlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfQkFTRV9WSURFT19SRU5ERVJFUl9IXwotI2RlZmluZSBNRURJQV9CQVNFX1ZJREVPX1JFTkRFUkVSX0hfCi0KLSNpbmNsdWRlIDxsaXN0PgotCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aW1lLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3BpcGVsaW5lX3N0YXR1cy5oIgotI2luY2x1ZGUgInVpL2dmeC9zaXplLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIERlbXV4ZXJTdHJlYW07Ci1jbGFzcyBWaWRlb0RlY29kZXI7Ci0KLWNsYXNzIE1FRElBX0VYUE9SVCBWaWRlb1JlbmRlcmVyCi0gICAgOiBwdWJsaWMgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8VmlkZW9SZW5kZXJlcj4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBzdGQ6Omxpc3Q8c2NvcGVkX3JlZnB0cjxWaWRlb0RlY29kZXI+ID4gVmlkZW9EZWNvZGVyTGlzdDsKLQotICAvLyBVc2VkIHRvIHVwZGF0ZSB0aGUgcGlwZWxpbmUncyBjbG9jayB0aW1lLiBUaGUgcGFyYW1ldGVyIGlzIHRoZSB0aW1lIHRoYXQKLSAgLy8gdGhlIGNsb2NrIHNob3VsZCBub3QgZXhjZWVkLgotICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHZvaWQoYmFzZTo6VGltZURlbHRhKT4gVGltZUNCOwotCi0gIC8vIEV4ZWN1dGVkIHdoZW4gdGhlIG5hdHVyYWwgc2l6ZSBvZiB0aGUgdmlkZW8gaGFzIGNoYW5nZWQuCi0gIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZChjb25zdCBnZng6OlNpemUmIHNpemUpPiBOYXR1cmFsU2l6ZUNoYW5nZWRDQjsKLQotICAvLyBVc2VkIHRvIHF1ZXJ5IHRoZSBjdXJyZW50IHRpbWUgb3IgZHVyYXRpb24gb2YgdGhlIG1lZGlhLgotICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPGJhc2U6OlRpbWVEZWx0YSgpPiBUaW1lRGVsdGFDQjsKLQotICAvLyBJbml0aWFsaXplIGEgVmlkZW9SZW5kZXJlciB3aXRoIHRoZSBnaXZlbiBEZW11eGVyU3RyZWFtIGFuZAotICAvLyBWaWRlb0RlY29kZXJMaXN0LCBleGVjdXRpbmcgfGluaXRfY2J8IGNhbGxiYWNrIHVwb24gY29tcGxldGlvbi4KLSAgLy8KLSAgLy8gfHN0YXRpc3RpY3NfY2J8IGlzIGV4ZWN1dGVkIHBlcmlvZGljYWxseSB3aXRoIHZpZGVvIHJlbmRlcmluZyBzdGF0cywgc3VjaAotICAvLyBhcyBkcm9wcGVkIGZyYW1lcy4KLSAgLy8KLSAgLy8gfHRpbWVfY2J8IGlzIGV4ZWN1dGVkIHdoZW5ldmVyIHRpbWUgaGFzIGFkdmFuY2VkIGJ5IHdheSBvZiB2aWRlbyByZW5kZXJpbmcuCi0gIC8vCi0gIC8vIHxzaXplX2NoYW5nZWRfY2J8IGlzIGV4ZWN1dGVkIHdoZW5ldmVyIHRoZSBkaW1lbnNpb25zIG9mIHRoZSB2aWRlbyBoYXMKLSAgLy8gY2hhbmdlZC4KLSAgLy8KLSAgLy8gfGVuZGVkX2NifCBpcyBleGVjdXRlZCB3aGVuIHZpZGVvIHJlbmRlcmluZyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIHN0cmVhbS4KLSAgLy8KLSAgLy8gfGVycm9yX2NifCBpcyBleGVjdXRlZCBpZiBhbiBlcnJvciB3YXMgZW5jb3VudGVyZWQuCi0gIC8vCi0gIC8vIHxnZXRfdGltZV9jYnwgaXMgdXNlZCB0byBxdWVyeSB0aGUgY3VycmVudCBtZWRpYSBwbGF5YmFjayB0aW1lLgotICAvLwotICAvLyB8Z2V0X2R1cmF0aW9uX2NifCBpcyB1c2VkIHRvIHF1ZXJ5IHRoZSBtZWRpYSBkdXJhdGlvbi4KLSAgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoY29uc3Qgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiYgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWaWRlb0RlY29kZXJMaXN0JiBkZWNvZGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgaW5pdF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdGlzdGljc0NCJiBzdGF0aXN0aWNzX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaW1lQ0ImIHRpbWVfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hdHVyYWxTaXplQ2hhbmdlZENCJiBzaXplX2NoYW5nZWRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIGVuZGVkX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBlcnJvcl9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGltZURlbHRhQ0ImIGdldF90aW1lX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaW1lRGVsdGFDQiYgZ2V0X2R1cmF0aW9uX2NiKSA9IDA7Ci0KLSAgLy8gU3RhcnQgYXVkaW8gZGVjb2RpbmcgYW5kIHJlbmRlcmluZyBhdCB0aGUgY3VycmVudCBwbGF5YmFjayByYXRlLCBleGVjdXRpbmcKLSAgLy8gfGNhbGxiYWNrfCB3aGVuIHBsYXliYWNrIGlzIHVuZGVyd2F5LgotICB2aXJ0dWFsIHZvaWQgUGxheShjb25zdCBiYXNlOjpDbG9zdXJlJiBjYWxsYmFjaykgPSAwOwotCi0gIC8vIFRlbXBvcmFyaWx5IHN1c3BlbmQgZGVjb2RpbmcgYW5kIHJlbmRlcmluZyB2aWRlbywgZXhlY3V0aW5nIHxjYWxsYmFja3wgd2hlbgotICAvLyBwbGF5YmFjayBoYXMgYmVlbiBzdXNwZW5kZWQuCi0gIHZpcnR1YWwgdm9pZCBQYXVzZShjb25zdCBiYXNlOjpDbG9zdXJlJiBjYWxsYmFjaykgPSAwOwotCi0gIC8vIERpc2NhcmQgYW55IHZpZGVvIGRhdGEsIGV4ZWN1dGluZyB8Y2FsbGJhY2t8IHdoZW4gY29tcGxldGVkLgotICB2aXJ0dWFsIHZvaWQgRmx1c2goY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spID0gMDsKLQotICAvLyBTdGFydCBwcmVyb2xsaW5nIHZpZGVvIGRhdGEgZm9yIHNhbXBsZXMgc3RhcnRpbmcgYXQgfHRpbWV8LCBleGVjdXRpbmcKLSAgLy8gfGNhbGxiYWNrfCB3aGVuIGNvbXBsZXRlZC4KLSAgLy8KLSAgLy8gT25seSB2YWxpZCB0byBjYWxsIGFmdGVyIGEgc3VjY2Vzc2Z1bCBJbml0aWFsaXplKCkgb3IgRmx1c2goKS4KLSAgdmlydHVhbCB2b2lkIFByZXJvbGwoYmFzZTo6VGltZURlbHRhIHRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGNhbGxiYWNrKSA9IDA7Ci0KLSAgLy8gU3RvcCBhbGwgb3BlcmF0aW9ucyBpbiBwcmVwYXJhdGlvbiBmb3IgYmVpbmcgZGVsZXRlZCwgZXhlY3V0aW5nIHxjYWxsYmFja3wKLSAgLy8gd2hlbiBjb21wbGV0ZS4KLSAgdmlydHVhbCB2b2lkIFN0b3AoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spID0gMDsKLQotICAvLyBVcGRhdGVzIHRoZSBjdXJyZW50IHBsYXliYWNrIHJhdGUuCi0gIHZpcnR1YWwgdm9pZCBTZXRQbGF5YmFja1JhdGUoZmxvYXQgcGxheWJhY2tfcmF0ZSkgPSAwOwotCi0gcHJvdGVjdGVkOgotICBmcmllbmQgY2xhc3MgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8VmlkZW9SZW5kZXJlcj47Ci0KLSAgVmlkZW9SZW5kZXJlcigpOwotICB2aXJ0dWFsIH5WaWRlb1JlbmRlcmVyKCk7Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oVmlkZW9SZW5kZXJlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX1ZJREVPX1JFTkRFUkVSX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS92aWRlb19yZXNvbHV0aW9uLmggYi9zcmMvbWVkaWEvYmFzZS92aWRlb19yZXNvbHV0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YWU2NWYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvdmlkZW9fcmVzb2x1dGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9CQVNFX1ZJREVPX1JFU09MVVRJT05fSF8KLSNkZWZpbmUgTUVESUFfQkFTRV9WSURFT19SRVNPTFVUSU9OX0hfCi0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotI2luY2x1ZGUgInVpL2dmeC9zaXplLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIEVudW1lcmF0ZXMgdGhlIHZhcmlvdXMgcmVwcmVzZW50YXRpb25zIG9mIHRoZSByZXNvbHV0aW9uIG9mIHZpZGVvcy4gIE5vdGUKLS8vIHRoYXQgZXhjZXB0IHxrVmlkZW9SZXNvbHV0aW9uSW52YWxpZHwsIGFsbCBvdGhlciB2YWx1ZXMgYXJlIGd1YXJhbnRlZWQgdG8gYmUKLS8vIGluIHRoZSBzYW1lIG9yZGVyIGFzIGl0cyAod2lkdGgsIGhlaWdodCkgcGFpci4gTm90ZSwgdW5saWtlIHRoZSBvdGhlciB2YWxpZAotLy8gcmVzb2x1dGlvbiBsZXZlbHMsIHxrVmlkZW9SZXNvbHV0aW9uSGlnaFJlc3wgaXMgbm90IGEgMTY6OSByZXNvbHV0aW9uLgotZW51bSBWaWRlb1Jlc29sdXRpb24gewotICBrVmlkZW9SZXNvbHV0aW9uMTA4MHAsICAgIC8vIDE5MjAgeCAxMDgwCi0gIGtWaWRlb1Jlc29sdXRpb24yaywgICAgICAgLy8gMjU2MCB4IDE0NDAKLSAga1ZpZGVvUmVzb2x1dGlvbjRrLCAgICAgICAvLyAzODQwIHggMjE2MAotICBrVmlkZW9SZXNvbHV0aW9uNWssICAgICAgIC8vIDUxMjAgw5cgMjg4MAotICBrVmlkZW9SZXNvbHV0aW9uOGssICAgICAgIC8vIDc2ODAgeCA0MzIwCi0gIGtWaWRlb1Jlc29sdXRpb25IaWdoUmVzLCAgLy8gODE5MiB4IDgxOTIKLSAga1ZpZGVvUmVzb2x1dGlvbkludmFsaWQKLX07Ci0KLWlubGluZSBWaWRlb1Jlc29sdXRpb24gR2V0VmlkZW9SZXNvbHV0aW9uKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICBpZiAod2lkdGggPD0gMTkyMCAmJiBoZWlnaHQgPD0gMTA4MCkgewotICAgIHJldHVybiBrVmlkZW9SZXNvbHV0aW9uMTA4MHA7Ci0gIH0KLSAgaWYgKHdpZHRoIDw9IDI1NjAgJiYgaGVpZ2h0IDw9IDE0NDApIHsKLSAgICByZXR1cm4ga1ZpZGVvUmVzb2x1dGlvbjJrOwotICB9Ci0gIGlmICh3aWR0aCA8PSAzODQwICYmIGhlaWdodCA8PSAyMTYwKSB7Ci0gICAgcmV0dXJuIGtWaWRlb1Jlc29sdXRpb240azsKLSAgfQotICBpZiAod2lkdGggPD0gNTEyMCAmJiBoZWlnaHQgPD0gMjg4MCkgewotICAgIHJldHVybiBrVmlkZW9SZXNvbHV0aW9uNWs7Ci0gIH0KLSAgaWYgKHdpZHRoIDw9IDc2ODAgJiYgaGVpZ2h0IDw9IDQzMjApIHsKLSAgICByZXR1cm4ga1ZpZGVvUmVzb2x1dGlvbjhrOwotICB9Ci0gIGlmICh3aWR0aCA8PSA4MTkyICYmIGhlaWdodCA8PSA4MTkyKSB7Ci0gICAgcmV0dXJuIGtWaWRlb1Jlc29sdXRpb25IaWdoUmVzOwotICB9Ci0gIERMT0coRkFUQUwpIDw8ICJJbnZhbGlkIFZpZGVvUmVzb2x1dGlvbjogd2lkdGg6ICIgPDwgd2lkdGgKLSAgICAgICAgICAgICAgPDwgIiBoZWlnaHQ6ICIgPDwgaGVpZ2h0OwotICByZXR1cm4ga1ZpZGVvUmVzb2x1dGlvbkludmFsaWQ7Ci19Ci0KLWlubGluZSBWaWRlb1Jlc29sdXRpb24gR2V0VmlkZW9SZXNvbHV0aW9uKGNvbnN0IGdmeDo6U2l6ZSYgc2l6ZSkgewotICByZXR1cm4gR2V0VmlkZW9SZXNvbHV0aW9uKHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0JBU0VfVklERU9fUkVTT0xVVElPTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvdmlkZW9fdHlwZXMuaCBiL3NyYy9tZWRpYS9iYXNlL3ZpZGVvX3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNDA3MTEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UvdmlkZW9fdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE1IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9CQVNFX1ZJREVPX1RZUEVTX0hfCi0jZGVmaW5lIE1FRElBX0JBU0VfVklERU9fVFlQRVNfSF8KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJ1aWxkL2J1aWxkX2NvbmZpZy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIFBpeGVsIGZvcm1hdHMgcm91Z2hseSBiYXNlZCBvbiBGT1VSQ0MgbGFiZWxzLCBzZWU6Ci0vLyBodHRwOi8vd3d3LmZvdXJjYy5vcmcvcmdiLnBocCBhbmQgaHR0cDovL3d3dy5mb3VyY2Mub3JnL3l1di5waHAKLS8vIExvZ2dlZCB0byBVTUEsIHNvIG5ldmVyIHJldXNlIHZhbHVlcy4gTGVhdmUgZ2FwcyBpZiBuZWNlc3NhcnkuCi0vLyBPcmRlcmVkIGFzIHBsYW5hciwgc2VtaS1wbGFuYXIsIFlVVi1wYWNrZWQsIGFuZCBSR0IgZm9ybWF0cy4KLWVudW0gVmlkZW9QaXhlbEZvcm1hdCB7Ci0gIFBJWEVMX0ZPUk1BVF9VTktOT1dOID0gMCwgIC8vIFVua25vd24gb3IgdW5zcGVjaWZpZWQgZm9ybWF0IHZhbHVlLgotICBQSVhFTF9GT1JNQVRfSTQyMCA9Ci0gICAgICAxLCAgLy8gMTJicHAgWVVWIHBsYW5hciAxeDEgWSwgMngyIFVWIHNhbXBsZXMsIGEuay5hLiBZVTEyLgotICBQSVhFTF9GT1JNQVRfWVYxMiA9IDIsICAgLy8gMTJicHAgWVZVIHBsYW5hciAxeDEgWSwgMngyIFZVIHNhbXBsZXMuCi0gIFBJWEVMX0ZPUk1BVF9ZVjE2ID0gMywgICAvLyAxNmJwcCBZVlUgcGxhbmFyIDF4MSBZLCAyeDEgVlUgc2FtcGxlcy4KLSAgUElYRUxfRk9STUFUX1lWMTJBID0gNCwgIC8vIDIwYnBwIFlVVkEgcGxhbmFyIDF4MSBZLCAyeDIgVlUsIDF4MSBBIHNhbXBsZXMuCi0gIFBJWEVMX0ZPUk1BVF9ZVjI0ID0gNSwgICAvLyAyNGJwcCBZVVYgcGxhbmFyLCBubyBzdWJzYW1wbGluZy4KLSAgUElYRUxfRk9STUFUX05WMTIgPQotICAgICAgNiwgIC8vIDEyYnBwIHdpdGggWSBwbGFuZSBmb2xsb3dlZCBieSBhIDJ4MiBpbnRlcmxlYXZlZCBVViBwbGFuZS4KLSAgUElYRUxfRk9STUFUX05WMjEgPQotICAgICAgNywgIC8vIDEyYnBwIHdpdGggWSBwbGFuZSBmb2xsb3dlZCBieSBhIDJ4MiBpbnRlcmxlYXZlZCBWVSBwbGFuZS4KLSAgUElYRUxfRk9STUFUX1VZVlkgPQotICAgICAgOCwgIC8vIDE2YnBwIGludGVybGVhdmVkIDJ4MSBVLCAxeDEgWSwgMngxIFYsIDF4MSBZIHNhbXBsZXMuCi0gIFBJWEVMX0ZPUk1BVF9ZVVkyID0KLSAgICAgIDksICAvLyAxNmJwcCBpbnRlcmxlYXZlZCAxeDEgWSwgMngxIFUsIDF4MSBZLCAyeDEgViBzYW1wbGVzLgotICBQSVhFTF9GT1JNQVRfQVJHQiA9IDEwLCAgIC8vIDMyYnBwIEFSR0IsIDEgcGxhbmUuCi0gIFBJWEVMX0ZPUk1BVF9YUkdCID0gMTEsICAgLy8gMjRicHAgWFJHQiwgMSBwbGFuZS4KLSAgUElYRUxfRk9STUFUX1JHQjI0ID0gMTIsICAvLyAyNGJwcCBCR1IsIDEgcGxhbmUuCi0gIFBJWEVMX0ZPUk1BVF9SR0IzMiA9IDEzLCAgLy8gMzJicHAgQkdSQSwgMSBwbGFuZS4KLSAgUElYRUxfRk9STUFUX01KUEVHID0gMTQsICAvLyBNSlBFRyBjb21wcmVzc2VkLgotICAvLyBNZWRpYVRlayBwcm9wcmlldGFyeSBmb3JtYXQuIE1UMjEgaXMgc2ltaWxhciB0byBOVjIxIGV4Y2VwdCB0aGUgbWVtb3J5Ci0gIC8vIGxheW91dCBhbmQgcGl4ZWwgbGF5b3V0IChzd2l6emxlcykuIDEyYnBwIHdpdGggWSBwbGFuZSBmb2xsb3dlZCBieSBhIDJ4MgotICAvLyBpbnRlcmxlYXZlZCBWVSBwbGFuZS4gRWFjaCBpbWFnZSBjb250YWlucyB0d28gYnVmZmVycyAtLSBZIHBsYW5lIGFuZCBWVQotICAvLyBwbGFuZS4gVHdvIHBsYW5lcyBjYW4gYmUgbm9uLWNvbnRpZ3VvdXMgaW4gbWVtb3J5LiBUaGUgc3RhcnRpbmcgYWRkcmVzc2VzCi0gIC8vIG9mIFkgcGxhbmUgYW5kIFZVIHBsYW5lIGFyZSA0S0IgYWxpZ25tZW50LgotICAvLyBTdXBwb3NlIGltYWdlIGRpbWVuc2lvbiBpcyAod2lkdGgsIGhlaWdodCkuIEZvciBib3RoIFkgcGxhbmUgYW5kIFZVIHBsYW5lOgotICAvLyBSb3cgcGl0Y2ggPSAoKHdpZHRoKzE1KS8xNikgKiAxNi4KLSAgLy8gUGxhbmUgc2l6ZSA9IFJvdyBwaXRjaCAqICgoKGhlaWdodCszMSkvMzIpKjMyKQotICBQSVhFTF9GT1JNQVRfTVQyMSA9IDE1LAotCi0gIFBJWEVMX0ZPUk1BVF9ZVVY0MjBQOSA9IDE2LAotICBQSVhFTF9GT1JNQVRfWVVWNDIwUDEwID0gMTcsCi0gIFBJWEVMX0ZPUk1BVF9ZVVY0MjJQOSA9IDE4LAotICBQSVhFTF9GT1JNQVRfWVVWNDIyUDEwID0gMTksCi0gIFBJWEVMX0ZPUk1BVF9ZVVY0NDRQOSA9IDIwLAotICBQSVhFTF9GT1JNQVRfWVVWNDQ0UDEwID0gMjEsCi0KLSAgUElYRUxfRk9STUFUX1lVVjQyMFAxMiA9IDIyLAotICBQSVhFTF9GT1JNQVRfWVVWNDIyUDEyID0gMjMsCi0gIFBJWEVMX0ZPUk1BVF9ZVVY0NDRQMTIgPSAyNCwKLQotICBQSVhFTF9GT1JNQVRfWTggPSAyNSwgICAvLyBzaW5nbGUgOGJwcCBwbGFuZS4KLSAgUElYRUxfRk9STUFUX1kxNiA9IDI2LCAgLy8gc2luZ2xlIDE2YnBwIHBsYW5lLgotCi0gIFBJWEVMX0ZPUk1BVF9JNDIyID0KLSAgICAgIDI3LCAgLy8gMTZicHAgWVVWIHBsYW5hciAxeDEgWSwgMngxIFVWIHNhbXBsZXMsIGEuay5hLiBZVTE2LgotCi0gIC8vIFBsZWFzZSB1cGRhdGUgVU1BIGhpc3RvZ3JhbSBlbnVtZXJhdGlvbiB3aGVuIGFkZGluZyBuZXcgZm9ybWF0cyBoZXJlLgotICBQSVhFTF9GT1JNQVRfTUFYID0KLSAgICAgIFBJWEVMX0ZPUk1BVF9JNDIyLCAgLy8gTXVzdCBhbHdheXMgYmUgZXF1YWwgdG8gbGFyZ2VzdCBlbnRyeSBsb2dnZWQuCi19OwotCi0vLyBDb2xvciBzcGFjZSBvciBjb2xvciByYW5nZSB1c2VkIGZvciB0aGUgcGl4ZWxzLgotLy8gTG9nZ2VkIHRvIFVNQSwgc28gbmV2ZXIgcmV1c2UgdmFsdWVzLiBMZWF2ZSBnYXBzIGlmIG5lY2Vzc2FyeS4KLWVudW0gQ29sb3JTcGFjZSB7Ci0gIENPTE9SX1NQQUNFX1VOU1BFQ0lGSUVEID0gMCwgIC8vIEluIGdlbmVyYWwgdGhpcyBpcyBSZWM2MDEuCi0gIC8vIFRoZSBKUEVHIGNvbG9yIHNwYWNlIGlzIHRoZSBjb21iaW5hdGlvbiBvZiBSZWMuNjAxIGFuZCBmdWxsIHJhbmdlIGNvbG9ycwotICAvLyAoYWthIHBjIHJhbmdlIGNvbG9ycykuCi0gIENPTE9SX1NQQUNFX0pQRUcgPSAxLAotICBDT0xPUl9TUEFDRV9IRF9SRUM3MDkgPSAyLCAgLy8gUmVjNzA5ICJIRCIgY29sb3Igc3BhY2UuCi0gIENPTE9SX1NQQUNFX1NEX1JFQzYwMSA9IDMsICAvLyBSZWM2MDEgIlNEIiBjb2xvciBzcGFjZS4KLSAgQ09MT1JfU1BBQ0VfTUFYID0gQ09MT1JfU1BBQ0VfU0RfUkVDNjAxLAotfTsKLQotLy8gUmV0dXJucyB0aGUgbmFtZSBvZiBhIEZvcm1hdCBhcyBhIHN0cmluZy4KLU1FRElBX0VYUE9SVCBzdGQ6OnN0cmluZyBWaWRlb1BpeGVsRm9ybWF0VG9TdHJpbmcoVmlkZW9QaXhlbEZvcm1hdCBmb3JtYXQpOwotCi0vLyBSZXR1cm5zIHRydWUgaWYgfGZvcm1hdHwgaXMgYSBZVVYgZm9ybWF0IHdpdGggbXVsdGlwbGUgcGxhbmVzLgotTUVESUFfRVhQT1JUIGJvb2wgSXNZdXZQbGFuYXIoVmlkZW9QaXhlbEZvcm1hdCBmb3JtYXQpOwotCi0vLyBSZXR1cm5zIHRydWUgaWYgfGZvcm1hdHwgaGFzIG5vIEFscGhhIGNoYW5uZWwgKGhlbmNlIGlzIGFsd2F5cyBvcGFxdWUpLgotTUVESUFfRVhQT1JUIGJvb2wgSXNPcGFxdWUoVmlkZW9QaXhlbEZvcm1hdCBmb3JtYXQpOwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9CQVNFX1ZJREVPX1RZUEVTX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS92aWRlb191dGlsLmNjIGIvc3JjL21lZGlhL2Jhc2UvdmlkZW9fdXRpbC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJlZjBhZC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS92aWRlb191dGlsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fdXRpbC5oIgotCi0jaW5jbHVkZSA8Y21hdGg+Ci0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2ZyYW1lLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWdmeDo6U2l6ZSBHZXROYXR1cmFsU2l6ZShjb25zdCBnZng6OlNpemUmIHZpc2libGVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXNwZWN0X3JhdGlvX251bWVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXNwZWN0X3JhdGlvX2Rlbm9taW5hdG9yKSB7Ci0gIGlmIChhc3BlY3RfcmF0aW9fZGVub21pbmF0b3IgPT0gMCB8fAotICAgICAgYXNwZWN0X3JhdGlvX251bWVyYXRvciA8IDAgfHwKLSAgICAgIGFzcGVjdF9yYXRpb19kZW5vbWluYXRvciA8IDApCi0gICAgcmV0dXJuIGdmeDo6U2l6ZSgpOwotCi0gIGRvdWJsZSBhc3BlY3RfcmF0aW8gPSBhc3BlY3RfcmF0aW9fbnVtZXJhdG9yIC8KLSAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4oYXNwZWN0X3JhdGlvX2Rlbm9taW5hdG9yKTsKLQotICBpbnQgd2lkdGggPSBmbG9vcih2aXNpYmxlX3NpemUud2lkdGgoKSAqIGFzcGVjdF9yYXRpbyArIDAuNSk7Ci0gIGludCBoZWlnaHQgPSB2aXNpYmxlX3NpemUuaGVpZ2h0KCk7Ci0KLSAgLy8gQW4gZXZlbiB3aWR0aCBtYWtlcyB0aGluZ3MgZWFzaWVyIGZvciBZVjEyIGFuZCBhcHBlYXJzIHRvIGJlIHRoZSBiZWhhdmlvcgotICAvLyBleHBlY3RlZCBieSBXZWJLaXQgbGF5b3V0IHRlc3RzLgotICByZXR1cm4gZ2Z4OjpTaXplKHdpZHRoICYgfjEsIGhlaWdodCk7Ci19Ci0KLXN0YXRpYyB2b2lkIENvcHlQbGFuZShzaXplX3QgcGxhbmUsIGNvbnN0IHVpbnQ4KiBzb3VyY2UsIGludCBzdHJpZGUsIGludCByb3dzLAotICAgICAgICAgICAgICAgICAgICAgIFZpZGVvRnJhbWUqIGZyYW1lKSB7Ci0gIHVpbnQ4KiBkZXN0ID0gZnJhbWUtPmRhdGEocGxhbmUpOwotICBpbnQgZGVzdF9zdHJpZGUgPSBmcmFtZS0+c3RyaWRlKHBsYW5lKTsKLQotICAvLyBDbGFtcCBpbiBjYXNlIHNvdXJjZSBmcmFtZSBoYXMgc21hbGxlciBzdHJpZGUuCi0gIGludCBieXRlc190b19jb3B5X3Blcl9yb3cgPSBzdGQ6Om1pbihmcmFtZS0+cm93X2J5dGVzKHBsYW5lKSwgc3RyaWRlKTsKLQotICAvLyBDbGFtcCBpbiBjYXNlIHNvdXJjZSBmcmFtZSBoYXMgc21hbGxlciBoZWlnaHQuCi0gIGludCByb3dzX3RvX2NvcHkgPSBzdGQ6Om1pbihmcmFtZS0+cm93cyhwbGFuZSksIHJvd3MpOwotCi0gIC8vIENvcHkhCi0gIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IHJvd3NfdG9fY29weTsgKytyb3cpIHsKLSAgICBtZW1jcHkoZGVzdCwgc291cmNlLCBieXRlc190b19jb3B5X3Blcl9yb3cpOwotICAgIHNvdXJjZSArPSBzdHJpZGU7Ci0gICAgZGVzdCArPSBkZXN0X3N0cmlkZTsKLSAgfQotfQotCi12b2lkIENvcHlZUGxhbmUoY29uc3QgdWludDgqIHNvdXJjZSwgaW50IHN0cmlkZSwgaW50IHJvd3MsIFZpZGVvRnJhbWUqIGZyYW1lKSB7Ci0gIENvcHlQbGFuZShWaWRlb0ZyYW1lOjprWVBsYW5lLCBzb3VyY2UsIHN0cmlkZSwgcm93cywgZnJhbWUpOwotfQotCi12b2lkIENvcHlVUGxhbmUoY29uc3QgdWludDgqIHNvdXJjZSwgaW50IHN0cmlkZSwgaW50IHJvd3MsIFZpZGVvRnJhbWUqIGZyYW1lKSB7Ci0gIENvcHlQbGFuZShWaWRlb0ZyYW1lOjprVVBsYW5lLCBzb3VyY2UsIHN0cmlkZSwgcm93cywgZnJhbWUpOwotfQotCi12b2lkIENvcHlWUGxhbmUoY29uc3QgdWludDgqIHNvdXJjZSwgaW50IHN0cmlkZSwgaW50IHJvd3MsIFZpZGVvRnJhbWUqIGZyYW1lKSB7Ci0gIENvcHlQbGFuZShWaWRlb0ZyYW1lOjprVlBsYW5lLCBzb3VyY2UsIHN0cmlkZSwgcm93cywgZnJhbWUpOwotfQotCi12b2lkIEZpbGxZVVYoVmlkZW9GcmFtZSogZnJhbWUsIHVpbnQ4IHksIHVpbnQ4IHUsIHVpbnQ4IHYpIHsKLSAgLy8gRmlsbCB0aGUgWSBwbGFuZS4KLSAgdWludDgqIHlfcGxhbmUgPSBmcmFtZS0+ZGF0YShWaWRlb0ZyYW1lOjprWVBsYW5lKTsKLSAgaW50IHlfcm93cyA9IGZyYW1lLT5yb3dzKFZpZGVvRnJhbWU6OmtZUGxhbmUpOwotICBpbnQgeV9yb3dfYnl0ZXMgPSBmcmFtZS0+cm93X2J5dGVzKFZpZGVvRnJhbWU6OmtZUGxhbmUpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHlfcm93czsgKytpKSB7Ci0gICAgbWVtc2V0KHlfcGxhbmUsIHksIHlfcm93X2J5dGVzKTsKLSAgICB5X3BsYW5lICs9IGZyYW1lLT5zdHJpZGUoVmlkZW9GcmFtZTo6a1lQbGFuZSk7Ci0gIH0KLQotICAvLyBGaWxsIHRoZSBVIGFuZCBWIHBsYW5lcy4KLSAgdWludDgqIHVfcGxhbmUgPSBmcmFtZS0+ZGF0YShWaWRlb0ZyYW1lOjprVVBsYW5lKTsKLSAgdWludDgqIHZfcGxhbmUgPSBmcmFtZS0+ZGF0YShWaWRlb0ZyYW1lOjprVlBsYW5lKTsKLSAgaW50IHV2X3Jvd3MgPSBmcmFtZS0+cm93cyhWaWRlb0ZyYW1lOjprVVBsYW5lKTsKLSAgaW50IHVfcm93X2J5dGVzID0gZnJhbWUtPnJvd19ieXRlcyhWaWRlb0ZyYW1lOjprVVBsYW5lKTsKLSAgaW50IHZfcm93X2J5dGVzID0gZnJhbWUtPnJvd19ieXRlcyhWaWRlb0ZyYW1lOjprVlBsYW5lKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB1dl9yb3dzOyArK2kpIHsKLSAgICBtZW1zZXQodV9wbGFuZSwgdSwgdV9yb3dfYnl0ZXMpOwotICAgIG1lbXNldCh2X3BsYW5lLCB2LCB2X3Jvd19ieXRlcyk7Ci0gICAgdV9wbGFuZSArPSBmcmFtZS0+c3RyaWRlKFZpZGVvRnJhbWU6OmtVUGxhbmUpOwotICAgIHZfcGxhbmUgKz0gZnJhbWUtPnN0cmlkZShWaWRlb0ZyYW1lOjprVlBsYW5lKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3ZpZGVvX3V0aWwuaCBiL3NyYy9tZWRpYS9iYXNlL3ZpZGVvX3V0aWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYyYWQ3ZC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS92aWRlb191dGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0JBU0VfVklERU9fVVRJTF9IXwotI2RlZmluZSBNRURJQV9CQVNFX1ZJREVPX1VUSUxfSF8KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0jaW5jbHVkZSAidWkvZ2Z4L3NpemUuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgVmlkZW9GcmFtZTsKLQotLy8gQ29tcHV0ZXMgdGhlIHNpemUgb2YgfHZpc2libGVfc2l6ZXwgZm9yIGEgZ2l2ZW4gYXNwZWN0IHJhdGlvLgotTUVESUFfRVhQT1JUIGdmeDo6U2l6ZSBHZXROYXR1cmFsU2l6ZShjb25zdCBnZng6OlNpemUmIHZpc2libGVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFzcGVjdF9yYXRpb19udW1lcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhc3BlY3RfcmF0aW9fZGVub21pbmF0b3IpOwotCi0vLyBDb3BpZXMgYSBwbGFuZSBvZiBZVVYgc291cmNlIGludG8gYSBWaWRlb0ZyYW1lIG9iamVjdCwgdGFraW5nIGludG8gYWNjb3VudAotLy8gc291cmNlIGFuZCBkZXN0aW5hdGlvbnMgZGltZW5zaW9ucy4KLS8vCi0vLyBOT1RFOiByb3dzIGlzICpub3QqIHRoZSBzYW1lIGFzIGhlaWdodCEKLU1FRElBX0VYUE9SVCB2b2lkIENvcHlZUGxhbmUoY29uc3QgdWludDgqIHNvdXJjZSwgaW50IHN0cmlkZSwgaW50IHJvd3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvRnJhbWUqIGZyYW1lKTsKLU1FRElBX0VYUE9SVCB2b2lkIENvcHlVUGxhbmUoY29uc3QgdWludDgqIHNvdXJjZSwgaW50IHN0cmlkZSwgaW50IHJvd3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvRnJhbWUqIGZyYW1lKTsKLU1FRElBX0VYUE9SVCB2b2lkIENvcHlWUGxhbmUoY29uc3QgdWludDgqIHNvdXJjZSwgaW50IHN0cmlkZSwgaW50IHJvd3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvRnJhbWUqIGZyYW1lKTsKLQotLy8gRmlsbHMgfGZyYW1lfCBjb250YWluaW5nIFlVViBkYXRhIHRvIHRoZSBnaXZlbiBjb2xvciB2YWx1ZXMuCi1NRURJQV9FWFBPUlQgdm9pZCBGaWxsWVVWKFZpZGVvRnJhbWUqIGZyYW1lLCB1aW50OCB5LCB1aW50OCB1LCB1aW50OCB2KTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQkFTRV9WSURFT19VVElMX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS92aWRlb191dGlsX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2Jhc2UvdmlkZW9fdXRpbF91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRmMmUyOS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS92aWRlb191dGlsX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2ZyYW1lLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb191dGlsLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIFZpZGVvVXRpbFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICBWaWRlb1V0aWxUZXN0KCkKLSAgICAgIDogaGVpZ2h0XygwKSwKLSAgICAgICAgeV9zdHJpZGVfKDApLAotICAgICAgICB1X3N0cmlkZV8oMCksCi0gICAgICAgIHZfc3RyaWRlXygwKSB7Ci0gIH0KLQotICB2aXJ0dWFsIH5WaWRlb1V0aWxUZXN0KCkge30KLQotICB2b2lkIENyZWF0ZVNvdXJjZUZyYW1lKGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCB1X3N0cmlkZSwgaW50IHZfc3RyaWRlKSB7Ci0gICAgRVhQRUNUX0dFKHlfc3RyaWRlLCB3aWR0aCk7Ci0gICAgRVhQRUNUX0dFKHVfc3RyaWRlLCB3aWR0aCAvIDIpOwotICAgIEVYUEVDVF9HRSh2X3N0cmlkZSwgd2lkdGggLyAyKTsKLQotICAgIGhlaWdodF8gPSBoZWlnaHQ7Ci0gICAgeV9zdHJpZGVfID0geV9zdHJpZGU7Ci0gICAgdV9zdHJpZGVfID0gdV9zdHJpZGU7Ci0gICAgdl9zdHJpZGVfID0gdl9zdHJpZGU7Ci0KLSAgICB5X3BsYW5lXy5yZXNldChuZXcgdWludDhbeV9zdHJpZGUgKiBoZWlnaHRdKTsKLSAgICB1X3BsYW5lXy5yZXNldChuZXcgdWludDhbdV9zdHJpZGUgKiBoZWlnaHQgLyAyXSk7Ci0gICAgdl9wbGFuZV8ucmVzZXQobmV3IHVpbnQ4W3Zfc3RyaWRlICogaGVpZ2h0IC8gMl0pOwotICB9Ci0KLSAgdm9pZCBDcmVhdGVEZXN0aW5hdGlvbkZyYW1lKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgIGdmeDo6U2l6ZSBzaXplKHdpZHRoLCBoZWlnaHQpOwotICAgIGRlc3RpbmF0aW9uX2ZyYW1lXyA9Ci0gICAgICAgIFZpZGVvRnJhbWU6OkNyZWF0ZUZyYW1lKFZpZGVvRnJhbWU6OllWMTIsIHNpemUsIGdmeDo6UmVjdChzaXplKSwgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhKCkpOwotICB9Ci0KLSAgdm9pZCBDb3B5UGxhbmVzKCkgewotICAgIENvcHlZUGxhbmUoeV9wbGFuZV8uZ2V0KCksIHlfc3RyaWRlXywgaGVpZ2h0XywgZGVzdGluYXRpb25fZnJhbWVfKTsKLSAgICBDb3B5VVBsYW5lKHVfcGxhbmVfLmdldCgpLCB1X3N0cmlkZV8sIGhlaWdodF8gLyAyLCBkZXN0aW5hdGlvbl9mcmFtZV8pOwotICAgIENvcHlWUGxhbmUodl9wbGFuZV8uZ2V0KCksIHZfc3RyaWRlXywgaGVpZ2h0XyAvIDIsIGRlc3RpbmF0aW9uX2ZyYW1lXyk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHNjb3BlZF9hcnJheTx1aW50OD4geV9wbGFuZV87Ci0gIHNjb3BlZF9hcnJheTx1aW50OD4gdV9wbGFuZV87Ci0gIHNjb3BlZF9hcnJheTx1aW50OD4gdl9wbGFuZV87Ci0KLSAgaW50IGhlaWdodF87Ci0gIGludCB5X3N0cmlkZV87Ci0gIGludCB1X3N0cmlkZV87Ci0gIGludCB2X3N0cmlkZV87Ci0KLSAgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiBkZXN0aW5hdGlvbl9mcmFtZV87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFZpZGVvVXRpbFRlc3QpOwotfTsKLQotVEVTVF9GKFZpZGVvVXRpbFRlc3QsIENvcHlQbGFuZV9FeGFjdCkgewotICBDcmVhdGVTb3VyY2VGcmFtZSgxNiwgMTYsIDE2LCA4LCA4KTsKLSAgQ3JlYXRlRGVzdGluYXRpb25GcmFtZSgxNiwgMTYpOwotICBDb3B5UGxhbmVzKCk7Ci19Ci0KLVRFU1RfRihWaWRlb1V0aWxUZXN0LCBDb3B5UGxhbmVfU21hbGxlclNvdXJjZSkgewotICBDcmVhdGVTb3VyY2VGcmFtZSg4LCA4LCA4LCA0LCA0KTsKLSAgQ3JlYXRlRGVzdGluYXRpb25GcmFtZSgxNiwgMTYpOwotICBDb3B5UGxhbmVzKCk7Ci19Ci0KLVRFU1RfRihWaWRlb1V0aWxUZXN0LCBDb3B5UGxhbmVfU21hbGxlckRlc3RpbmF0aW9uKSB7Ci0gIENyZWF0ZVNvdXJjZUZyYW1lKDE2LCAxNiwgMTYsIDgsIDgpOwotICBDcmVhdGVEZXN0aW5hdGlvbkZyYW1lKDgsIDgpOwotICBDb3B5UGxhbmVzKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UveXV2X2NvbnZlcnQuY2MgYi9zcmMvbWVkaWEvYmFzZS95dXZfY29udmVydC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk2OWE1Yy4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS95dXZfY29udmVydC5jYworKysgL2Rldi9udWxsCkBAIC0xLDU5NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBUaGlzIHdlYnBhZ2Ugc2hvd3MgbGF5b3V0IG9mIFlWMTIgYW5kIG90aGVyIFlVViBmb3JtYXRzCi0vLyBodHRwOi8vd3d3LmZvdXJjYy5vcmcveXV2LnBocAotLy8gVGhlIGFjdHVhbCBjb252ZXJzaW9uIGlzIGJlc3QgZGVzY3JpYmVkIGhlcmUKLS8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvWVVWCi0vLyBBbiBhcnRpY2xlIG9uIG9wdGltaXppbmcgWVVWIGNvbnZlcnNpb24gdXNpbmcgdGFibGVzIGluc3RlYWQgb2YgbXVsdGlwbGllcwotLy8gaHR0cDovL2xlc3RvdXJ0ZXJlYXV4LmZyZWUuZnIvcGFwZXJzL2RhdGEveXV2cmdiLnBkZgotLy8KLS8vIFlWMTIgaXMgYSBmdWxsIHBsYW5lIG9mIFkgYW5kIGEgaGFsZiBoZWlnaHQsIGhhbGYgd2lkdGggY2hyb21hIHBsYW5lcwotLy8gWVYxNiBpcyBhIGZ1bGwgcGxhbmUgb2YgWSBhbmQgYSBmdWxsIGhlaWdodCwgaGFsZiB3aWR0aCBjaHJvbWEgcGxhbmVzCi0vLwotLy8gQVJHQiBwaXhlbCBmb3JtYXQgaXMgb3V0cHV0LCB3aGljaCBvbiBsaXR0bGUgZW5kaWFuIGlzIHN0b3JlZCBhcyBCR1JBLgotLy8gVGhlIGFscGhhIGlzIHNldCB0byAyNTUsIGFsbG93aW5nIHRoZSBhcHBsaWNhdGlvbiB0byB1c2UgUkdCQSBvciBSR0IzMi4KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UveXV2X2NvbnZlcnQuaCIKLQotI2luY2x1ZGUgImJhc2UvY3B1LmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgImJ1aWxkL2J1aWxkX2NvbmZpZy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2ltZC9jb252ZXJ0X3JnYl90b195dXYuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3NpbWQvY29udmVydF95dXZfdG9fcmdiLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaW1kL2ZpbHRlcl95dXYuaCIKLQotI2lmIGRlZmluZWQoQVJDSF9DUFVfWDg2X0ZBTUlMWSkKLSNpZiBkZWZpbmVkKENPTVBJTEVSX01TVkMpCi0jaW5jbHVkZSA8aW50cmluLmg+Ci0jZWxzZQotI2luY2x1ZGUgPG1taW50cmluLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1zdGF0aWMgRmlsdGVyWVVWUm93c1Byb2MgQ2hvb3NlRmlsdGVyWVVWUm93c1Byb2MoKSB7Ci0jaWYgZGVmaW5lZChBUkNIX0NQVV9YODZfRkFNSUxZKQotICBiYXNlOjpDUFUgY3B1OwotICBpZiAoY3B1Lmhhc19zc2UyKCkpCi0gICAgcmV0dXJuICZGaWx0ZXJZVVZSb3dzX1NTRTI7Ci0gIGlmIChjcHUuaGFzX21teCgpKQotICAgIHJldHVybiAmRmlsdGVyWVVWUm93c19NTVg7Ci0jZW5kaWYKLSAgcmV0dXJuICZGaWx0ZXJZVVZSb3dzX0M7Ci19Ci0KLXN0YXRpYyBDb252ZXJ0WVVWVG9SR0IzMlJvd1Byb2MgQ2hvb3NlQ29udmVydFlVVlRvUkdCMzJSb3dQcm9jKCkgewotI2lmIGRlZmluZWQoQVJDSF9DUFVfWDg2X0ZBTUlMWSkKLSAgYmFzZTo6Q1BVIGNwdTsKLSAgaWYgKGNwdS5oYXNfc3NlKCkpCi0gICAgcmV0dXJuICZDb252ZXJ0WVVWVG9SR0IzMlJvd19TU0U7Ci0gIGlmIChjcHUuaGFzX21teCgpKQotICAgIHJldHVybiAmQ29udmVydFlVVlRvUkdCMzJSb3dfTU1YOwotI2VuZGlmCi0gIHJldHVybiAmQ29udmVydFlVVlRvUkdCMzJSb3dfQzsKLX0KLQotc3RhdGljIFNjYWxlWVVWVG9SR0IzMlJvd1Byb2MgQ2hvb3NlU2NhbGVZVVZUb1JHQjMyUm93UHJvYygpIHsKLSNpZiBkZWZpbmVkKEFSQ0hfQ1BVX1g4Nl82NCkKLSAgLy8gVXNlIDY0LWJpdHMgdmVyc2lvbiBpZiBwb3NzaWJsZS4KLSAgcmV0dXJuICZTY2FsZVlVVlRvUkdCMzJSb3dfU1NFMl9YNjQ7Ci0jZWxpZiBkZWZpbmVkKEFSQ0hfQ1BVX1g4Nl9GQU1JTFkpCi0gIGJhc2U6OkNQVSBjcHU7Ci0gIC8vIENob29zZSB0aGUgYmVzdCBvbmUgb24gMzItYml0cyBzeXN0ZW0uCi0gIGlmIChjcHUuaGFzX3NzZSgpKQotICAgIHJldHVybiAmU2NhbGVZVVZUb1JHQjMyUm93X1NTRTsKLSAgaWYgKGNwdS5oYXNfbW14KCkpCi0gICAgcmV0dXJuICZTY2FsZVlVVlRvUkdCMzJSb3dfTU1YOwotI2VuZGlmICAvLyBkZWZpbmVkKEFSQ0hfQ1BVX1g4Nl82NCkKLSAgcmV0dXJuICZTY2FsZVlVVlRvUkdCMzJSb3dfQzsKLX0KLQotc3RhdGljIFNjYWxlWVVWVG9SR0IzMlJvd1Byb2MgQ2hvb3NlTGluZWFyU2NhbGVZVVZUb1JHQjMyUm93UHJvYygpIHsKLSNpZiBkZWZpbmVkKEFSQ0hfQ1BVX1g4Nl82NCkKLSAgLy8gVXNlIDY0LWJpdHMgdmVyc2lvbiBpZiBwb3NzaWJsZS4KLSAgcmV0dXJuICZMaW5lYXJTY2FsZVlVVlRvUkdCMzJSb3dfTU1YX1g2NDsKLSNlbGlmIGRlZmluZWQoQVJDSF9DUFVfWDg2X0ZBTUlMWSkKLSAgYmFzZTo6Q1BVIGNwdTsKLSAgLy8gMzItYml0cyBzeXN0ZW0uCi0gIGlmIChjcHUuaGFzX3NzZSgpKQotICAgIHJldHVybiAmTGluZWFyU2NhbGVZVVZUb1JHQjMyUm93X1NTRTsKLSAgaWYgKGNwdS5oYXNfbW14KCkpCi0gICAgcmV0dXJuICZMaW5lYXJTY2FsZVlVVlRvUkdCMzJSb3dfTU1YOwotI2VuZGlmICAvLyBkZWZpbmVkKEFSQ0hfQ1BVX1g4Nl82NCkKLSAgcmV0dXJuICZMaW5lYXJTY2FsZVlVVlRvUkdCMzJSb3dfQzsKLX0KLQotLy8gRW1wdHkgU0lNRCByZWdpc3RlcnMgc3RhdGUgYWZ0ZXIgdXNpbmcgdGhlbS4KLXZvaWQgRW1wdHlSZWdpc3RlclN0YXRlKCkgewotI2lmIGRlZmluZWQoQVJDSF9DUFVfWDg2X0ZBTUlMWSkKLSAgc3RhdGljIGJvb2wgY2hlY2tlZCA9IGZhbHNlOwotICBzdGF0aWMgYm9vbCBoYXNfbW14ID0gZmFsc2U7Ci0gIGlmICghY2hlY2tlZCkgewotICAgIGJhc2U6OkNQVSBjcHU7Ci0gICAgaGFzX21teCA9IGNwdS5oYXNfbW14KCk7Ci0gICAgY2hlY2tlZCA9IHRydWU7Ci0gIH0KLSAgaWYgKGhhc19tbXgpCi0gICAgX21tX2VtcHR5KCk7Ci0jZW5kaWYKLX0KLQotLy8gMTYuMTYgZml4ZWQgcG9pbnQgYXJpdGhtZXRpYwotY29uc3QgaW50IGtGcmFjdGlvbkJpdHMgPSAxNjsKLWNvbnN0IGludCBrRnJhY3Rpb25NYXggPSAxIDw8IGtGcmFjdGlvbkJpdHM7Ci1jb25zdCBpbnQga0ZyYWN0aW9uTWFzayA9ICgoMSA8PCBrRnJhY3Rpb25CaXRzKSAtIDEpOwotCi0vLyBTY2FsZSBhIGZyYW1lIG9mIFlVViB0byAzMiBiaXQgQVJHQi4KLXZvaWQgU2NhbGVZVVZUb1JHQjMyKGNvbnN0IHVpbnQ4KiB5X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB1X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB2X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiByZ2JfYnVmLAotICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2VfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgIGludCB5X3BpdGNoLAotICAgICAgICAgICAgICAgICAgICAgaW50IHV2X3BpdGNoLAotICAgICAgICAgICAgICAgICAgICAgaW50IHJnYl9waXRjaCwKLSAgICAgICAgICAgICAgICAgICAgIFlVVlR5cGUgeXV2X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICBSb3RhdGUgdmlld19yb3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICBTY2FsZUZpbHRlciBmaWx0ZXIpIHsKLSAgc3RhdGljIEZpbHRlcllVVlJvd3NQcm9jIGZpbHRlcl9wcm9jID0gTlVMTDsKLSAgc3RhdGljIENvbnZlcnRZVVZUb1JHQjMyUm93UHJvYyBjb252ZXJ0X3Byb2MgPSBOVUxMOwotICBzdGF0aWMgU2NhbGVZVVZUb1JHQjMyUm93UHJvYyBzY2FsZV9wcm9jID0gTlVMTDsKLSAgc3RhdGljIFNjYWxlWVVWVG9SR0IzMlJvd1Byb2MgbGluZWFyX3NjYWxlX3Byb2MgPSBOVUxMOwotCi0gIGlmICghZmlsdGVyX3Byb2MpCi0gICAgZmlsdGVyX3Byb2MgPSBDaG9vc2VGaWx0ZXJZVVZSb3dzUHJvYygpOwotICBpZiAoIWNvbnZlcnRfcHJvYykKLSAgICBjb252ZXJ0X3Byb2MgPSBDaG9vc2VDb252ZXJ0WVVWVG9SR0IzMlJvd1Byb2MoKTsKLSAgaWYgKCFzY2FsZV9wcm9jKQotICAgIHNjYWxlX3Byb2MgPSBDaG9vc2VTY2FsZVlVVlRvUkdCMzJSb3dQcm9jKCk7Ci0gIGlmICghbGluZWFyX3NjYWxlX3Byb2MpCi0gICAgbGluZWFyX3NjYWxlX3Byb2MgPSBDaG9vc2VMaW5lYXJTY2FsZVlVVlRvUkdCMzJSb3dQcm9jKCk7Ci0KLSAgLy8gSGFuZGxlIHplcm8gc2l6ZWQgc291cmNlcyBhbmQgZGVzdGluYXRpb25zLgotICBpZiAoKHl1dl90eXBlID09IFlWMTIgJiYgKHNvdXJjZV93aWR0aCA8IDIgfHwgc291cmNlX2hlaWdodCA8IDIpKSB8fAotICAgICAgKHl1dl90eXBlID09IFlWMTYgJiYgKHNvdXJjZV93aWR0aCA8IDIgfHwgc291cmNlX2hlaWdodCA8IDEpKSB8fAotICAgICAgd2lkdGggPT0gMCB8fCBoZWlnaHQgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgLy8gNDA5NiBhbGxvd3MgMyBidWZmZXJzIHRvIGZpdCBpbiAxMmsuCi0gIC8vIEhlbHBzIHBlcmZvcm1hbmNlIG9uIENQVSB3aXRoIDE2SyBMMSBjYWNoZS4KLSAgLy8gTGFyZ2UgZW5vdWdoIGZvciAzODMweDIxNjAgYW5kIDMwIiBkaXNwbGF5cyB3aGljaCBhcmUgMjU2MHgxNjAwLgotICBjb25zdCBpbnQga0ZpbHRlckJ1ZmZlclNpemUgPSA0MDk2OwotICAvLyBEaXNhYmxlIGZpbHRlcmluZyBpZiB0aGUgc2NyZWVuIGlzIHRvbyBiaWcgKHRvIGF2b2lkIGJ1ZmZlciBvdmVyZmxvd3MpLgotICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gdG8gcmVndWxhciB1c2VyczogdGhleSBkb24ndCBoYXZlIG1vbml0b3JzCi0gIC8vIHdpZGVyIHRoYW4gNDA5NiBwaXhlbHMuCi0gIC8vIFRPRE8oZmJhcmNoYXJkKTogQWxsb3cgcm90YXRlZCB2aWRlb3MgdG8gZmlsdGVyLgotICBpZiAoc291cmNlX3dpZHRoID4ga0ZpbHRlckJ1ZmZlclNpemUgfHwgdmlld19yb3RhdGUpCi0gICAgZmlsdGVyID0gRklMVEVSX05PTkU7Ci0KLSAgdW5zaWduZWQgaW50IHlfc2hpZnQgPSB5dXZfdHlwZTsKLSAgLy8gRGlhZ3JhbSBzaG93aW5nIG9yaWdpbiBhbmQgZGlyZWN0aW9uIG9mIHNvdXJjZSBzYW1wbGluZy4KLSAgLy8gLT4wICAgNDwtCi0gIC8vIDcgICAgICAgMwotICAvLwotICAvLyA2ICAgICAgIDUKLSAgLy8gLT4xICAgMjwtCi0gIC8vIFJvdGF0aW9ucyB0aGF0IHN0YXJ0IGF0IHJpZ2h0IHNpZGUgb2YgaW1hZ2UuCi0gIGlmICgodmlld19yb3RhdGUgPT0gUk9UQVRFXzE4MCkgfHwKLSAgICAgICh2aWV3X3JvdGF0ZSA9PSBST1RBVEVfMjcwKSB8fAotICAgICAgKHZpZXdfcm90YXRlID09IE1JUlJPUl9ST1RBVEVfMCkgfHwKLSAgICAgICh2aWV3X3JvdGF0ZSA9PSBNSVJST1JfUk9UQVRFXzkwKSkgewotICAgIHlfYnVmICs9IHNvdXJjZV93aWR0aCAtIDE7Ci0gICAgdV9idWYgKz0gc291cmNlX3dpZHRoIC8gMiAtIDE7Ci0gICAgdl9idWYgKz0gc291cmNlX3dpZHRoIC8gMiAtIDE7Ci0gICAgc291cmNlX3dpZHRoID0gLXNvdXJjZV93aWR0aDsKLSAgfQotICAvLyBSb3RhdGlvbnMgdGhhdCBzdGFydCBhdCBib3R0b20gb2YgaW1hZ2UuCi0gIGlmICgodmlld19yb3RhdGUgPT0gUk9UQVRFXzkwKSB8fAotICAgICAgKHZpZXdfcm90YXRlID09IFJPVEFURV8xODApIHx8Ci0gICAgICAodmlld19yb3RhdGUgPT0gTUlSUk9SX1JPVEFURV85MCkgfHwKLSAgICAgICh2aWV3X3JvdGF0ZSA9PSBNSVJST1JfUk9UQVRFXzE4MCkpIHsKLSAgICB5X2J1ZiArPSAoc291cmNlX2hlaWdodCAtIDEpICogeV9waXRjaDsKLSAgICB1X2J1ZiArPSAoKHNvdXJjZV9oZWlnaHQgPj4geV9zaGlmdCkgLSAxKSAqIHV2X3BpdGNoOwotICAgIHZfYnVmICs9ICgoc291cmNlX2hlaWdodCA+PiB5X3NoaWZ0KSAtIDEpICogdXZfcGl0Y2g7Ci0gICAgc291cmNlX2hlaWdodCA9IC1zb3VyY2VfaGVpZ2h0OwotICB9Ci0KLSAgaW50IHNvdXJjZV9keCA9IHNvdXJjZV93aWR0aCAqIGtGcmFjdGlvbk1heCAvIHdpZHRoOwotCi0gIGlmICgodmlld19yb3RhdGUgPT0gUk9UQVRFXzkwKSB8fAotICAgICAgKHZpZXdfcm90YXRlID09IFJPVEFURV8yNzApKSB7Ci0gICAgaW50IHRtcCA9IGhlaWdodDsKLSAgICBoZWlnaHQgPSB3aWR0aDsKLSAgICB3aWR0aCA9IHRtcDsKLSAgICB0bXAgPSBzb3VyY2VfaGVpZ2h0OwotICAgIHNvdXJjZV9oZWlnaHQgPSBzb3VyY2Vfd2lkdGg7Ci0gICAgc291cmNlX3dpZHRoID0gdG1wOwotICAgIGludCBzb3VyY2VfZHkgPSBzb3VyY2VfaGVpZ2h0ICoga0ZyYWN0aW9uTWF4IC8gaGVpZ2h0OwotICAgIHNvdXJjZV9keCA9ICgoc291cmNlX2R5ID4+IGtGcmFjdGlvbkJpdHMpICogeV9waXRjaCkgPDwga0ZyYWN0aW9uQml0czsKLSAgICBpZiAodmlld19yb3RhdGUgPT0gUk9UQVRFXzkwKSB7Ci0gICAgICB5X3BpdGNoID0gLTE7Ci0gICAgICB1dl9waXRjaCA9IC0xOwotICAgICAgc291cmNlX2hlaWdodCA9IC1zb3VyY2VfaGVpZ2h0OwotICAgIH0gZWxzZSB7Ci0gICAgICB5X3BpdGNoID0gMTsKLSAgICAgIHV2X3BpdGNoID0gMTsKLSAgICB9Ci0gIH0KLQotICAvLyBOZWVkIHBhZGRpbmcgYmVjYXVzZSBGaWx0ZXJSb3dzKCkgd2lsbCB3cml0ZSAxIHRvIDE2IGV4dHJhIHBpeGVscwotICAvLyBhZnRlciB0aGUgZW5kIGZvciBTU0UyIHZlcnNpb24uCi0gIHVpbnQ4IHl1dmJ1ZlsxNiArIGtGaWx0ZXJCdWZmZXJTaXplICogMyArIDE2XTsKLSAgdWludDgqIHlidWYgPQotICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pih5dXZidWYgKyAxNSkgJiB+MTUpOwotICB1aW50OCogdWJ1ZiA9IHlidWYgKyBrRmlsdGVyQnVmZmVyU2l6ZTsKLSAgdWludDgqIHZidWYgPSB1YnVmICsga0ZpbHRlckJ1ZmZlclNpemU7Ci0KLSAgLy8gVE9ETyhmYmFyY2hhcmQpOiBGaXhlZCBwb2ludCBtYXRoIGlzIG9mZiBieSAxIG9uIG5lZ2F0aXZlcy4KLQotICAvLyBXZSB0YWtlIGEgeS1jb29yZGluYXRlIGluIFswLDFdIHNwYWNlIGluIHRoZSBzb3VyY2UgaW1hZ2Ugc3BhY2UsIGFuZAotICAvLyB0cmFuc2Zvcm0gdG8gYSB5LWNvb3JkaW5hdGUgaW4gWzAsMV0gc3BhY2UgaW4gdGhlIGRlc3RpbmF0aW9uIGltYWdlIHNwYWNlLgotICAvLyBOb3RlIHRoYXQgdGhlIGNvb3JkaW5hdGUgZW5kcG9pbnRzIGxpZSBvbiBwaXhlbCBib3VuZGFyaWVzLCBub3Qgb24gcGl4ZWwKLSAgLy8gY2VudGVyczogZS5nLiBhIHR3by1waXhlbC1oaWdoIGltYWdlIHdpbGwgaGF2ZSBwaXhlbCBjZW50ZXJzIGF0IDAuMjUgYW5kCi0gIC8vIDAuNzUuICBUaGUgZm9ybXVsYSBpcyBhcyBmb2xsb3dzIChpbiBmaXhlZC1wb2ludCBhcml0aG1ldGljKToKLSAgLy8gICB5X2RzdCA9IGRzdF9oZWlnaHQgKiAoKHlfc3JjICsgMC41KSAvIHNyY19oZWlnaHQpCi0gIC8vICAgZHN0X3BpeGVsID0gY2xhbXAoWzAsIGRzdF9oZWlnaHQgLSAxXSwgZmxvb3IoeV9kc3QgLSAwLjUpKQotICAvLyBJbXBsZW1lbnQgdGhpcyBoZXJlIGFzIGFuIGFjY3VtdWxhdG9yICsgZGVsdGEsIHRvIGF2b2lkIGV4cGVuc2l2ZSBtYXRoCi0gIC8vIGluIHRoZSBsb29wLgotICBpbnQgc291cmNlX3lfc3VicGl4ZWxfYWNjdW0gPQotICAgICgoa0ZyYWN0aW9uTWF4IC8gMikgKiBzb3VyY2VfaGVpZ2h0KSAvIGhlaWdodCAtIChrRnJhY3Rpb25NYXggLyAyKTsKLSAgaW50IHNvdXJjZV95X3N1YnBpeGVsX2RlbHRhID0gKCgxIDw8IGtGcmFjdGlvbkJpdHMpICogc291cmNlX2hlaWdodCkgLyBoZWlnaHQ7Ci0KLSAgLy8gVE9ETyhmYmFyY2hhcmQpOiBTcGxpdCB0aGlzIGludG8gc2VwYXJhdGUgZnVuY3Rpb24gZm9yIGJldHRlciBlZmZpY2llbmN5LgotICBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7Ci0gICAgdWludDgqIGRlc3RfcGl4ZWwgPSByZ2JfYnVmICsgeSAqIHJnYl9waXRjaDsKLSAgICBpbnQgc291cmNlX3lfc3VicGl4ZWwgPSBzb3VyY2VfeV9zdWJwaXhlbF9hY2N1bTsKLSAgICBzb3VyY2VfeV9zdWJwaXhlbF9hY2N1bSArPSBzb3VyY2VfeV9zdWJwaXhlbF9kZWx0YTsKLSAgICBpZiAoc291cmNlX3lfc3VicGl4ZWwgPCAwKQotICAgICAgc291cmNlX3lfc3VicGl4ZWwgPSAwOwotICAgIGVsc2UgaWYgKHNvdXJjZV95X3N1YnBpeGVsID4gKChzb3VyY2VfaGVpZ2h0IC0gMSkgPDwga0ZyYWN0aW9uQml0cykpCi0gICAgICBzb3VyY2VfeV9zdWJwaXhlbCA9IChzb3VyY2VfaGVpZ2h0IC0gMSkgPDwga0ZyYWN0aW9uQml0czsKLQotICAgIGNvbnN0IHVpbnQ4KiB5X3B0ciA9IE5VTEw7Ci0gICAgY29uc3QgdWludDgqIHVfcHRyID0gTlVMTDsKLSAgICBjb25zdCB1aW50OCogdl9wdHIgPSBOVUxMOwotICAgIC8vIEFwcGx5IHZlcnRpY2FsIGZpbHRlcmluZyBpZiBuZWNlc3NhcnkuCi0gICAgLy8gVE9ETyhmYmFyY2hhcmQpOiBSZW1vdmUgbWVtY3B5IHdoZW4gbm90IG5lY2Vzc2FyeS4KLSAgICBpZiAoZmlsdGVyICYgbWVkaWE6OkZJTFRFUl9CSUxJTkVBUl9WKSB7Ci0gICAgICBpbnQgc291cmNlX3kgPSBzb3VyY2VfeV9zdWJwaXhlbCA+PiBrRnJhY3Rpb25CaXRzOwotICAgICAgeV9wdHIgPSB5X2J1ZiArIHNvdXJjZV95ICogeV9waXRjaDsKLSAgICAgIHVfcHRyID0gdV9idWYgKyAoc291cmNlX3kgPj4geV9zaGlmdCkgKiB1dl9waXRjaDsKLSAgICAgIHZfcHRyID0gdl9idWYgKyAoc291cmNlX3kgPj4geV9zaGlmdCkgKiB1dl9waXRjaDsKLQotICAgICAgLy8gVmVydGljYWwgc2NhbGVyIHVzZXMgMTYuOCBmaXhlZCBwb2ludC4KLSAgICAgIGludCBzb3VyY2VfeV9mcmFjdGlvbiA9Ci0gICAgICAgICAgKHNvdXJjZV95X3N1YnBpeGVsICYga0ZyYWN0aW9uTWFzaykgPj4gODsKLSAgICAgIGlmIChzb3VyY2VfeV9mcmFjdGlvbiAhPSAwKSB7Ci0gICAgICAgIGZpbHRlcl9wcm9jKHlidWYsIHlfcHRyLCB5X3B0ciArIHlfcGl0Y2gsIHNvdXJjZV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgc291cmNlX3lfZnJhY3Rpb24pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbWVtY3B5KHlidWYsIHlfcHRyLCBzb3VyY2Vfd2lkdGgpOwotICAgICAgfQotICAgICAgeV9wdHIgPSB5YnVmOwotICAgICAgeWJ1Zltzb3VyY2Vfd2lkdGhdID0geWJ1Zltzb3VyY2Vfd2lkdGgtMV07Ci0KLSAgICAgIGludCB1dl9zb3VyY2Vfd2lkdGggPSAoc291cmNlX3dpZHRoICsgMSkgLyAyOwotICAgICAgaW50IHNvdXJjZV91dl9mcmFjdGlvbjsKLQotICAgICAgLy8gRm9yIGZvcm1hdHMgd2l0aCBoYWxmLWhlaWdodCBVViBwbGFuZXMsIGVhY2ggZXZlbi1udW1iZXJlZCBwaXhlbCByb3cKLSAgICAgIC8vIHNob3VsZCBub3QgaW50ZXJwb2xhdGUsIHNpbmNlIHRoZSBuZXh0IHJvdyB0byBpbnRlcnBvbGF0ZSBmcm9tIHNob3VsZAotICAgICAgLy8gYmUgYSBkdXBsaWNhdGUgb2YgdGhlIGN1cnJlbnQgcm93LgotICAgICAgaWYgKHlfc2hpZnQgJiYgKHNvdXJjZV95ICYgMHgxKSA9PSAwKQotICAgICAgICBzb3VyY2VfdXZfZnJhY3Rpb24gPSAwOwotICAgICAgZWxzZQotICAgICAgICBzb3VyY2VfdXZfZnJhY3Rpb24gPSBzb3VyY2VfeV9mcmFjdGlvbjsKLQotICAgICAgaWYgKHNvdXJjZV91dl9mcmFjdGlvbiAhPSAwKSB7Ci0gICAgICAgIGZpbHRlcl9wcm9jKHVidWYsIHVfcHRyLCB1X3B0ciArIHV2X3BpdGNoLCB1dl9zb3VyY2Vfd2lkdGgsCi0gICAgICAgICAgICBzb3VyY2VfdXZfZnJhY3Rpb24pOwotICAgICAgICBmaWx0ZXJfcHJvYyh2YnVmLCB2X3B0ciwgdl9wdHIgKyB1dl9waXRjaCwgdXZfc291cmNlX3dpZHRoLAotICAgICAgICAgICAgc291cmNlX3V2X2ZyYWN0aW9uKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG1lbWNweSh1YnVmLCB1X3B0ciwgdXZfc291cmNlX3dpZHRoKTsKLSAgICAgICAgbWVtY3B5KHZidWYsIHZfcHRyLCB1dl9zb3VyY2Vfd2lkdGgpOwotICAgICAgfQotICAgICAgdV9wdHIgPSB1YnVmOwotICAgICAgdl9wdHIgPSB2YnVmOwotICAgICAgdWJ1Zlt1dl9zb3VyY2Vfd2lkdGhdID0gdWJ1Zlt1dl9zb3VyY2Vfd2lkdGggLSAxXTsKLSAgICAgIHZidWZbdXZfc291cmNlX3dpZHRoXSA9IHZidWZbdXZfc291cmNlX3dpZHRoIC0gMV07Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIE9mZnNldCBieSAxLzIgcGl4ZWwgZm9yIGNlbnRlciBzYW1wbGluZy4KLSAgICAgIGludCBzb3VyY2VfeSA9IChzb3VyY2VfeV9zdWJwaXhlbCArIChrRnJhY3Rpb25NYXggLyAyKSkgPj4ga0ZyYWN0aW9uQml0czsKLSAgICAgIHlfcHRyID0geV9idWYgKyBzb3VyY2VfeSAqIHlfcGl0Y2g7Ci0gICAgICB1X3B0ciA9IHVfYnVmICsgKHNvdXJjZV95ID4+IHlfc2hpZnQpICogdXZfcGl0Y2g7Ci0gICAgICB2X3B0ciA9IHZfYnVmICsgKHNvdXJjZV95ID4+IHlfc2hpZnQpICogdXZfcGl0Y2g7Ci0gICAgfQotICAgIGlmIChzb3VyY2VfZHggPT0ga0ZyYWN0aW9uTWF4KSB7ICAvLyBOb3Qgc2NhbGVkCi0gICAgICBjb252ZXJ0X3Byb2MoeV9wdHIsIHVfcHRyLCB2X3B0ciwgZGVzdF9waXhlbCwgd2lkdGgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoZmlsdGVyICYgRklMVEVSX0JJTElORUFSX0gpIHsKLSAgICAgICAgbGluZWFyX3NjYWxlX3Byb2MoeV9wdHIsIHVfcHRyLCB2X3B0ciwgZGVzdF9waXhlbCwgd2lkdGgsIHNvdXJjZV9keCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzY2FsZV9wcm9jKHlfcHRyLCB1X3B0ciwgdl9wdHIsIGRlc3RfcGl4ZWwsIHdpZHRoLCBzb3VyY2VfZHgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIEVtcHR5UmVnaXN0ZXJTdGF0ZSgpOwotfQotCi0vLyBTY2FsZSBhIGZyYW1lIG9mIFlWMTIgdG8gMzIgYml0IEFSR0IgZm9yIGEgc3BlY2lmaWMgcmVjdGFuZ2xlLgotdm9pZCBTY2FsZVlVVlRvUkdCMzJXaXRoUmVjdChjb25zdCB1aW50OCogeV9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB1X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHZfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogcmdiX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3JlY3RfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcmVjdF90b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3JlY3RfcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3JlY3RfYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9waXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHV2X3BpdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmdiX3BpdGNoKSB7Ci0gIHN0YXRpYyBGaWx0ZXJZVVZSb3dzUHJvYyBmaWx0ZXJfcHJvYyA9IE5VTEw7Ci0gIGlmICghZmlsdGVyX3Byb2MpCi0gICAgZmlsdGVyX3Byb2MgPSBDaG9vc2VGaWx0ZXJZVVZSb3dzUHJvYygpOwotCi0gIC8vIFRoaXMgcm91dGluZSBkb2Vzbid0IGN1cnJlbnRseSBzdXBwb3J0IHVwLXNjYWxpbmcuCi0gIENIRUNLX0xFKGRlc3Rfd2lkdGgsIHNvdXJjZV93aWR0aCk7Ci0gIENIRUNLX0xFKGRlc3RfaGVpZ2h0LCBzb3VyY2VfaGVpZ2h0KTsKLQotICAvLyBTYW5pdHktY2hlY2sgdGhlIGRlc3RpbmF0aW9uIHJlY3RhbmdsZS4KLSAgRENIRUNLKGRlc3RfcmVjdF9sZWZ0ID49IDAgJiYgZGVzdF9yZWN0X3JpZ2h0IDw9IGRlc3Rfd2lkdGgpOwotICBEQ0hFQ0soZGVzdF9yZWN0X3RvcCA+PSAwICYmIGRlc3RfcmVjdF9ib3R0b20gPD0gZGVzdF9oZWlnaHQpOwotICBEQ0hFQ0soZGVzdF9yZWN0X3JpZ2h0ID4gZGVzdF9yZWN0X2xlZnQpOwotICBEQ0hFQ0soZGVzdF9yZWN0X2JvdHRvbSA+IGRlc3RfcmVjdF90b3ApOwotCi0gIC8vIEZpeGVkLXBvaW50IHZhbHVlIG9mIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIHNjYWxlIGRvd24gZmFjdG9yLgotICAvLyBWYWx1ZXMgYXJlIGluIHRoZSBmb3JtYXQgMTYuMTYuCi0gIGludCB5X3N0ZXAgPSBrRnJhY3Rpb25NYXggKiBzb3VyY2VfaGVpZ2h0IC8gZGVzdF9oZWlnaHQ7Ci0gIGludCB4X3N0ZXAgPSBrRnJhY3Rpb25NYXggKiBzb3VyY2Vfd2lkdGggLyBkZXN0X3dpZHRoOwotCi0gIC8vIERldGVybWluZSB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHJlY3RhbmdsZSBpbiAxNi4xNiBjb29yZHMuCi0gIC8vIE5COiBPdXIgb3JpZ2luIGlzIHRoZSAqY2VudGVyKiBvZiB0aGUgdG9wL2xlZnQgcGl4ZWwsIE5PVCBpdHMgdG9wL2xlZnQuCi0gIC8vIElmIHdlJ3JlIGRvd24tc2NhbGluZyBieSBtb3JlIHRoYW4gYSBmYWN0b3Igb2YgdHdvLCB3ZSBzdGFydCB3aXRoIGEgNTAlCi0gIC8vIGZyYWN0aW9uIHRvIGF2b2lkIGRlZ2VuZXJhdGluZyB0byBwb2ludC1zYW1wbGluZyAtIHdlIHNob3VsZCByZWFsbHkganVzdAotICAvLyBmaXggdGhlIGZyYWN0aW9uIGF0IDUwJSBmb3IgYWxsIHBpeGVscyBpbiB0aGF0IGNhc2UuCi0gIGludCBzb3VyY2VfbGVmdCA9IGRlc3RfcmVjdF9sZWZ0ICogeF9zdGVwOwotICBpbnQgc291cmNlX3JpZ2h0ID0gKGRlc3RfcmVjdF9yaWdodCAtIDEpICogeF9zdGVwOwotICBpZiAoeF9zdGVwIDwga0ZyYWN0aW9uTWF4ICogMikgewotICAgIHNvdXJjZV9sZWZ0ICs9ICgoeF9zdGVwIC0ga0ZyYWN0aW9uTWF4KSAvIDIpOwotICAgIHNvdXJjZV9yaWdodCArPSAoKHhfc3RlcCAtIGtGcmFjdGlvbk1heCkgLyAyKTsKLSAgfSBlbHNlIHsKLSAgICBzb3VyY2VfbGVmdCArPSBrRnJhY3Rpb25NYXggLyAyOwotICAgIHNvdXJjZV9yaWdodCArPSBrRnJhY3Rpb25NYXggLyAyOwotICB9Ci0gIGludCBzb3VyY2VfdG9wID0gZGVzdF9yZWN0X3RvcCAqIHlfc3RlcDsKLSAgaWYgKHlfc3RlcCA8IGtGcmFjdGlvbk1heCAqIDIpIHsKLSAgICBzb3VyY2VfdG9wICs9ICgoeV9zdGVwIC0ga0ZyYWN0aW9uTWF4KSAvIDIpOwotICB9IGVsc2UgewotICAgIHNvdXJjZV90b3AgKz0ga0ZyYWN0aW9uTWF4IC8gMjsKLSAgfQotCi0gIC8vIERldGVybWluZSB0aGUgcGFydHMgb2YgdGhlIFksIFUgYW5kIFYgYnVmZmVycyB0byBpbnRlcnBvbGF0ZS4KLSAgaW50IHNvdXJjZV95X2xlZnQgPSBzb3VyY2VfbGVmdCA+PiBrRnJhY3Rpb25CaXRzOwotICBpbnQgc291cmNlX3lfcmlnaHQgPSBzdGQ6Om1pbigKLSAgICAgIChzb3VyY2VfcmlnaHQgPj4ga0ZyYWN0aW9uQml0cykgKyAyLAotICAgICAgc291cmNlX3dpZHRoICsgMSk7Ci0KLSAgaW50IHNvdXJjZV91dl9sZWZ0ID0gc291cmNlX3lfbGVmdCAvIDI7Ci0gIGludCBzb3VyY2VfdXZfcmlnaHQgPSBzdGQ6Om1pbigKLSAgICAgIChzb3VyY2VfcmlnaHQgPj4gKGtGcmFjdGlvbkJpdHMgKyAxKSkgKyAyLAotICAgICAgKHNvdXJjZV93aWR0aCArIDEpIC8gMik7Ci0KLSAgaW50IHNvdXJjZV95X3dpZHRoID0gc291cmNlX3lfcmlnaHQgLSBzb3VyY2VfeV9sZWZ0OwotICBpbnQgc291cmNlX3V2X3dpZHRoID0gc291cmNlX3V2X3JpZ2h0IC0gc291cmNlX3V2X2xlZnQ7Ci0KLSAgLy8gRGV0ZXJtaW5lIG51bWJlciBvZiBwaXhlbHMgaW4gZWFjaCBvdXRwdXQgcm93LgotICBpbnQgZGVzdF9yZWN0X3dpZHRoID0gZGVzdF9yZWN0X3JpZ2h0IC0gZGVzdF9yZWN0X2xlZnQ7Ci0KLSAgLy8gSW50ZXJtZWRpYXRlIGJ1ZmZlciBmb3IgdmVydGljYWwgaW50ZXJwb2xhdGlvbi4KLSAgLy8gNDA5NiBieXRlcyBhbGxvd3MgMyBidWZmZXJzIHRvIGZpdCBpbiAxMmssIHdoaWNoIGZpdHMgaW4gYSAxNksgTDEgY2FjaGUsCi0gIC8vIGFuZCBpcyBiaWdnZXIgdGhhbiBtb3N0IHVzZXJzIHdpbGwgZ2VuZXJhbGx5IG5lZWQuCi0gIC8vIFRoZSBidWZmZXIgaXMgMTYtYnl0ZSBhbGlnbmVkIGFuZCBwYWRkZWQgd2l0aCAxNiBleHRyYSBieXRlczsgc29tZSBvZiB0aGUKLSAgLy8gRmlsdGVyWVVWUm93UHJvY3MgaGF2ZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzLCBhbmQgdGhlIFNTRSB2ZXJzaW9uIGNhbgotICAvLyB3cml0ZSB1cCB0byAxNiBieXRlcyBwYXN0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KLSAgY29uc3QgaW50IGtGaWx0ZXJCdWZmZXJTaXplID0gNDA5NjsKLSAgaWYgKHNvdXJjZV93aWR0aCA+IGtGaWx0ZXJCdWZmZXJTaXplKQotICAgIGZpbHRlcl9wcm9jID0gTlVMTDsKLSAgdWludDggeXV2X3RlbXBbMTYgKyBrRmlsdGVyQnVmZmVyU2l6ZSAqIDMgKyAxNl07Ci0gIHVpbnQ4KiB5X3RlbXAgPQotICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KAotICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pih5dXZfdGVtcCArIDE1KSAmIH4xNSk7Ci0gIHVpbnQ4KiB1X3RlbXAgPSB5X3RlbXAgKyBrRmlsdGVyQnVmZmVyU2l6ZTsKLSAgdWludDgqIHZfdGVtcCA9IHVfdGVtcCArIGtGaWx0ZXJCdWZmZXJTaXplOwotCi0gIC8vIE1vdmUgdG8gdGhlIHRvcC1sZWZ0IHBpeGVsIG9mIG91dHB1dC4KLSAgcmdiX2J1ZiArPSBkZXN0X3JlY3RfdG9wICogcmdiX3BpdGNoOwotICByZ2JfYnVmICs9IGRlc3RfcmVjdF9sZWZ0ICogNDsKLQotICAvLyBGb3IgZWFjaCBkZXN0aW5hdGlvbiByb3cgcGVyZm9ybSBpbnRlcnBvbGF0aW9uIGFuZCBjb2xvciBzcGFjZQotICAvLyBjb252ZXJzaW9uIHRvIHByb2R1Y2UgdGhlIG91dHB1dC4KLSAgZm9yIChpbnQgcm93ID0gZGVzdF9yZWN0X3RvcDsgcm93IDwgZGVzdF9yZWN0X2JvdHRvbTsgKytyb3cpIHsKLSAgICAvLyBSb3VuZCB0aGUgZml4ZWQtcG9pbnQgeSBwb3NpdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgcm93LgotICAgIGludCBzb3VyY2Vfcm93ID0gc291cmNlX3RvcCA+PiBrRnJhY3Rpb25CaXRzOwotICAgIGludCBzb3VyY2VfdXZfcm93ID0gc291cmNlX3JvdyAvIDI7Ci0gICAgRENIRUNLKHNvdXJjZV9yb3cgPCBzb3VyY2VfaGVpZ2h0KTsKLQotICAgIC8vIExvY2F0ZSB0aGUgZmlyc3Qgcm93IGZvciBlYWNoIHBsYW5lIGZvciBpbnRlcnBvbGF0aW9uLgotICAgIGNvbnN0IHVpbnQ4KiB5MF9wdHIgPSB5X2J1ZiArIHlfcGl0Y2ggKiBzb3VyY2Vfcm93ICsgc291cmNlX3lfbGVmdDsKLSAgICBjb25zdCB1aW50OCogdTBfcHRyID0gdV9idWYgKyB1dl9waXRjaCAqIHNvdXJjZV91dl9yb3cgKyBzb3VyY2VfdXZfbGVmdDsKLSAgICBjb25zdCB1aW50OCogdjBfcHRyID0gdl9idWYgKyB1dl9waXRjaCAqIHNvdXJjZV91dl9yb3cgKyBzb3VyY2VfdXZfbGVmdDsKLSAgICBjb25zdCB1aW50OCogeTFfcHRyID0gTlVMTDsKLSAgICBjb25zdCB1aW50OCogdTFfcHRyID0gTlVMTDsKLSAgICBjb25zdCB1aW50OCogdjFfcHRyID0gTlVMTDsKLQotICAgIC8vIExvY2F0ZSB0aGUgc2Vjb25kIHJvdyBmb3IgaW50ZXJwb2xhdGlvbiwgYmVpbmcgY2FyZWZ1bCBub3QgdG8gb3ZlcnJ1bi4KLSAgICBpZiAoc291cmNlX3JvdyArIDEgPj0gc291cmNlX2hlaWdodCkgewotICAgICAgeTFfcHRyID0geTBfcHRyOwotICAgIH0gZWxzZSB7Ci0gICAgICB5MV9wdHIgPSB5MF9wdHIgKyB5X3BpdGNoOwotICAgIH0KLSAgICBpZiAoc291cmNlX3V2X3JvdyArIDEgPj0gKHNvdXJjZV9oZWlnaHQgKyAxKSAvIDIpIHsKLSAgICAgIHUxX3B0ciA9IHUwX3B0cjsKLSAgICAgIHYxX3B0ciA9IHYwX3B0cjsKLSAgICB9IGVsc2UgewotICAgICAgdTFfcHRyID0gdTBfcHRyICsgdXZfcGl0Y2g7Ci0gICAgICB2MV9wdHIgPSB2MF9wdHIgKyB1dl9waXRjaDsKLSAgICB9Ci0KLSAgICBpZiAoZmlsdGVyX3Byb2MpIHsKLSAgICAgIC8vIFZlcnRpY2FsIHNjYWxlciB1c2VzIDE2LjggZml4ZWQgcG9pbnQuCi0gICAgICBpbnQgZnJhY3Rpb24gPSAoc291cmNlX3RvcCAmIGtGcmFjdGlvbk1hc2spID4+IDg7Ci0gICAgICBmaWx0ZXJfcHJvYyh5X3RlbXAgKyBzb3VyY2VfeV9sZWZ0LCB5MF9wdHIsIHkxX3B0ciwKLSAgICAgICAgICAgICAgICAgIHNvdXJjZV95X3dpZHRoLCBmcmFjdGlvbik7Ci0gICAgICBmaWx0ZXJfcHJvYyh1X3RlbXAgKyBzb3VyY2VfdXZfbGVmdCwgdTBfcHRyLCB1MV9wdHIsCi0gICAgICAgICAgICAgICAgICBzb3VyY2VfdXZfd2lkdGgsIGZyYWN0aW9uKTsKLSAgICAgIGZpbHRlcl9wcm9jKHZfdGVtcCArIHNvdXJjZV91dl9sZWZ0LCB2MF9wdHIsIHYxX3B0ciwKLSAgICAgICAgICAgICAgICAgIHNvdXJjZV91dl93aWR0aCwgZnJhY3Rpb24pOwotCi0gICAgICAvLyBQZXJmb3JtIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbiBhbmQgY29sb3Igc3BhY2UgY29udmVyc2lvbi4KLSAgICAgIC8vIFRPRE8oaGNsYW0pOiBVc2UgdGhlIE1NWCB2ZXJzaW9uIGFmdGVyIG1vcmUgdGVzdGluZy4KLSAgICAgIExpbmVhclNjYWxlWVVWVG9SR0IzMlJvd1dpdGhSYW5nZV9DKAotICAgICAgICAgIHlfdGVtcCwgdV90ZW1wLCB2X3RlbXAsIHJnYl9idWYsCi0gICAgICAgICAgZGVzdF9yZWN0X3dpZHRoLCBzb3VyY2VfbGVmdCwgeF9zdGVwKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gSWYgdGhlIGZyYW1lIGlzIHRvbyBsYXJnZSB0aGVuIHdlIGxpbmVhciBzY2FsZSBhIHNpbmdsZSByb3cuCi0gICAgICBMaW5lYXJTY2FsZVlVVlRvUkdCMzJSb3dXaXRoUmFuZ2VfQygKLSAgICAgICAgICB5MF9wdHIsIHUwX3B0ciwgdjBfcHRyLCByZ2JfYnVmLAotICAgICAgICAgIGRlc3RfcmVjdF93aWR0aCwgc291cmNlX2xlZnQsIHhfc3RlcCk7Ci0gICAgfQotCi0gICAgLy8gQWR2YW5jZSB2ZXJ0aWNhbGx5IGluIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGltYWdlLgotICAgIHNvdXJjZV90b3AgKz0geV9zdGVwOwotICAgIHJnYl9idWYgKz0gcmdiX3BpdGNoOwotICB9Ci0KLSAgRW1wdHlSZWdpc3RlclN0YXRlKCk7Ci19Ci0KLXZvaWQgQ29udmVydFJHQjMyVG9ZVVYoY29uc3QgdWludDgqIHJnYmZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogeXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdnBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCByZ2JzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCB5c3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXZzdHJpZGUpIHsKLSAgc3RhdGljIHZvaWQgKCpjb252ZXJ0X3Byb2MpKGNvbnN0IHVpbnQ4KiwgdWludDgqLCB1aW50OCosIHVpbnQ4KiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwgaW50LCBpbnQsIGludCwgaW50KSA9IE5VTEw7Ci0gIGlmICghY29udmVydF9wcm9jKSB7Ci0jaWYgZGVmaW5lZChBUkNIX0NQVV9BUk1fRkFNSUxZKSB8fCBkZWZpbmVkKEFSQ0hfQ1BVX01JUFNfRkFNSUxZKQotICAgIC8vIEZvciBBUk0gYW5kIE1JUFMgcHJvY2Vzc29ycywgYWx3YXlzIHVzZSBDIHZlcnNpb24uCi0gICAgLy8gVE9ETyhoY2xhbSk6IEltcGxlbWVudCBhIE5FT04gdmVyc2lvbi4KLSAgICBjb252ZXJ0X3Byb2MgPSAmQ29udmVydFJHQjMyVG9ZVVZfQzsKLSNlbGlmIGRlZmluZWQoX19MQl9QUzNfXykKLSAgICAvLyBGb3IgdGhlc2UsIGFsd2F5cyB1c2UgQyB2ZXJzaW9uLgotICAgIGNvbnZlcnRfcHJvYyA9ICZDb252ZXJ0UkdCMzJUb1lVVl9DOwotI2Vsc2UKLSAgICAvLyBUT0RPKGhjbGFtKTogU3dpdGNoIHRvIFNTU0UzIHZlcnNpb24gd2hlbiB0aGUgY3lhbiBwcm9ibGVtIGlzIHNvbHZlZC4KLSAgICAvLyBTZWU6IGNyYnVnLmNvbS8xMDA0NjIKLSAgICBiYXNlOjpDUFUgY3B1OwotICAgIGlmIChjcHUuaGFzX3NzZTIoKSkKLSAgICAgIGNvbnZlcnRfcHJvYyA9ICZDb252ZXJ0UkdCMzJUb1lVVl9TU0UyOwotICAgIGVsc2UKLSAgICAgIGNvbnZlcnRfcHJvYyA9ICZDb252ZXJ0UkdCMzJUb1lVVl9DOwotI2VuZGlmCi0gIH0KLQotICBjb252ZXJ0X3Byb2MocmdiZnJhbWUsIHlwbGFuZSwgdXBsYW5lLCB2cGxhbmUsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICByZ2JzdHJpZGUsIHlzdHJpZGUsIHV2c3RyaWRlKTsKLX0KLQotdm9pZCBDb252ZXJ0UkdCMjRUb1lVVihjb25zdCB1aW50OCogcmdiZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB5cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB1cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB2cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IHJnYnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IHlzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCB1dnN0cmlkZSkgewotI2lmIGRlZmluZWQoQVJDSF9DUFVfQVJNX0ZBTUlMWSkgfHwgZGVmaW5lZChBUkNIX0NQVV9NSVBTX0ZBTUlMWSkKLSAgQ29udmVydFJHQjI0VG9ZVVZfQyhyZ2JmcmFtZSwgeXBsYW5lLCB1cGxhbmUsIHZwbGFuZSwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICByZ2JzdHJpZGUsIHlzdHJpZGUsIHV2c3RyaWRlKTsKLSNlbHNlCi0gIHN0YXRpYyB2b2lkICgqY29udmVydF9wcm9jKShjb25zdCB1aW50OCosIHVpbnQ4KiwgdWludDgqLCB1aW50OCosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsIGludCwgaW50LCBpbnQsIGludCkgPSBOVUxMOwotICBpZiAoIWNvbnZlcnRfcHJvYykgewotICAgIGJhc2U6OkNQVSBjcHU7Ci0gICAgaWYgKGNwdS5oYXNfc3NzZTMoKSkKLSAgICAgIGNvbnZlcnRfcHJvYyA9ICZDb252ZXJ0UkdCMjRUb1lVVl9TU1NFMzsKLSAgICBlbHNlCi0gICAgICBjb252ZXJ0X3Byb2MgPSAmQ29udmVydFJHQjI0VG9ZVVZfQzsKLSAgfQotICBjb252ZXJ0X3Byb2MocmdiZnJhbWUsIHlwbGFuZSwgdXBsYW5lLCB2cGxhbmUsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICByZ2JzdHJpZGUsIHlzdHJpZGUsIHV2c3RyaWRlKTsKLSNlbmRpZgotfQotCi12b2lkIENvbnZlcnRZVVkyVG9ZVVYoY29uc3QgdWludDgqIHNyYywKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OCogeXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB1cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDgqIHZwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCkgewotICBmb3IgKGludCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgewotICAgIGZvciAoaW50IGogPSAwOyBqIDwgKHdpZHRoIC8gMik7ICsraikgewotICAgICAgeXBsYW5lWzBdID0gc3JjWzBdOwotICAgICAgKnVwbGFuZSA9IHNyY1sxXTsKLSAgICAgIHlwbGFuZVsxXSA9IHNyY1syXTsKLSAgICAgICp2cGxhbmUgPSBzcmNbM107Ci0gICAgICBzcmMgKz0gNDsKLSAgICAgIHlwbGFuZSArPSAyOwotICAgICAgdXBsYW5lKys7Ci0gICAgICB2cGxhbmUrKzsKLSAgICB9Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCAod2lkdGggLyAyKTsgKytqKSB7Ci0gICAgICB5cGxhbmVbMF0gPSBzcmNbMF07Ci0gICAgICB5cGxhbmVbMV0gPSBzcmNbMl07Ci0gICAgICBzcmMgKz0gNDsKLSAgICAgIHlwbGFuZSArPSAyOwotICAgIH0KLSAgfQotfQotCi12b2lkIENvbnZlcnROVjIxVG9ZVVYoY29uc3QgdWludDgqIHNyYywKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OCogeXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB1cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDgqIHZwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCkgewotICBpbnQgeV9wbGFuZV9zaXplID0gd2lkdGggKiBoZWlnaHQ7Ci0gIG1lbWNweSh5cGxhbmUsIHNyYywgeV9wbGFuZV9zaXplKTsKLQotICBzcmMgKz0geV9wbGFuZV9zaXplOwotICBpbnQgdV9wbGFuZV9zaXplID0geV9wbGFuZV9zaXplID4+IDI7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdV9wbGFuZV9zaXplOyArK2kpIHsKLSAgICAqdnBsYW5lKysgPSAqc3JjKys7Ci0gICAgKnVwbGFuZSsrID0gKnNyYysrOwotICB9Ci19Ci0KLXZvaWQgQ29udmVydFlVVlRvUkdCMzIoY29uc3QgdWludDgqIHlwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHVwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHZwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHJnYmZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCB5c3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXZzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCByZ2JzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIFlVVlR5cGUgeXV2X3R5cGUpIHsKLSNpZiBkZWZpbmVkKEFSQ0hfQ1BVX0FSTV9GQU1JTFkpIHx8IGRlZmluZWQoQVJDSF9DUFVfTUlQU19GQU1JTFkpCi0gIENvbnZlcnRZVVZUb1JHQjMyX0MoeXBsYW5lLCB1cGxhbmUsIHZwbGFuZSwgcmdiZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgeXN0cmlkZSwgdXZzdHJpZGUsIHJnYnN0cmlkZSwgeXV2X3R5cGUpOwotI2Vsc2UKLSAgc3RhdGljIENvbnZlcnRZVVZUb1JHQjMyUHJvYyBjb252ZXJ0X3Byb2MgPSBOVUxMOwotICBpZiAoIWNvbnZlcnRfcHJvYykgewotICAgIGJhc2U6OkNQVSBjcHU7Ci0gICAgaWYgKGNwdS5oYXNfc3NlKCkpCi0gICAgICBjb252ZXJ0X3Byb2MgPSAmQ29udmVydFlVVlRvUkdCMzJfU1NFOwotICAgIGVsc2UgaWYgKGNwdS5oYXNfbW14KCkpCi0gICAgICBjb252ZXJ0X3Byb2MgPSAmQ29udmVydFlVVlRvUkdCMzJfTU1YOwotICAgIGVsc2UKLSAgICAgIGNvbnZlcnRfcHJvYyA9ICZDb252ZXJ0WVVWVG9SR0IzMl9DOwotICB9Ci0KLSAgY29udmVydF9wcm9jKHlwbGFuZSwgdXBsYW5lLCB2cGxhbmUsIHJnYmZyYW1lLAotICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgeXN0cmlkZSwgdXZzdHJpZGUsIHJnYnN0cmlkZSwgeXV2X3R5cGUpOwotI2VuZGlmCi19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UveXV2X2NvbnZlcnQuaCBiL3NyYy9tZWRpYS9iYXNlL3l1dl9jb252ZXJ0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZDQ3ZDcuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2Jhc2UveXV2X2NvbnZlcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0JBU0VfWVVWX0NPTlZFUlRfSF8KLSNkZWZpbmUgTUVESUFfQkFTRV9ZVVZfQ09OVkVSVF9IXwotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIFR5cGUgb2YgWVVWIHN1cmZhY2UuCi0vLyBUaGUgdmFsdWUgb2YgdGhlc2UgZW51bXMgbWF0dGVyIGFzIHRoZXkgYXJlIHVzZWQgdG8gc2hpZnQgdmVydGljYWwgaW5kaWNlcy4KLWVudW0gWVVWVHlwZSB7Ci0gIFlWMTYgPSAwLCAgICAgICAgICAgLy8gWVYxNiBpcyBoYWxmIHdpZHRoIGFuZCBmdWxsIGhlaWdodCBjaHJvbWEgY2hhbm5lbHMuCi0gIFlWMTIgPSAxLCAgICAgICAgICAgLy8gWVYxMiBpcyBoYWxmIHdpZHRoIGFuZCBoYWxmIGhlaWdodCBjaHJvbWEgY2hhbm5lbHMuCi19OwotCi0vLyBNaXJyb3IgbWVhbnMgZmxpcCB0aGUgaW1hZ2UgaG9yaXpvbnRhbGx5LCBhcyBpbiBsb29raW5nIGluIGEgbWlycm9yLgotLy8gUm90YXRlIGhhcHBlbnMgYWZ0ZXIgbWlycm9yaW5nLgotZW51bSBSb3RhdGUgewotICBST1RBVEVfMCwgICAgICAgICAgIC8vIFJvdGF0aW9uIG9mZi4KLSAgUk9UQVRFXzkwLCAgICAgICAgICAvLyBSb3RhdGUgY2xvY2t3aXNlLgotICBST1RBVEVfMTgwLCAgICAgICAgIC8vIFJvdGF0ZSB1cHNpZGUgZG93bi4KLSAgUk9UQVRFXzI3MCwgICAgICAgICAvLyBSb3RhdGUgY291bnRlciBjbG9ja3dpc2UuCi0gIE1JUlJPUl9ST1RBVEVfMCwgICAgLy8gTWlycm9yIGhvcml6b250YWxseS4KLSAgTUlSUk9SX1JPVEFURV85MCwgICAvLyBNaXJyb3IgdGhlbiBSb3RhdGUgY2xvY2t3aXNlLgotICBNSVJST1JfUk9UQVRFXzE4MCwgIC8vIE1pcnJvciB2ZXJ0aWNhbGx5LgotICBNSVJST1JfUk9UQVRFXzI3MCwgIC8vIFRyYW5zcG9zZS4KLX07Ci0KLS8vIEZpbHRlciBhZmZlY3RzIGhvdyBzY2FsaW5nIGxvb2tzLgotZW51bSBTY2FsZUZpbHRlciB7Ci0gIEZJTFRFUl9OT05FID0gMCwgICAgICAgIC8vIE5vIGZpbHRlciAocG9pbnQgc2FtcGxlZCkuCi0gIEZJTFRFUl9CSUxJTkVBUl9IID0gMSwgIC8vIEJpbGluZWFyIGhvcml6b250YWwgZmlsdGVyLgotICBGSUxURVJfQklMSU5FQVJfViA9IDIsICAvLyBCaWxpbmVhciB2ZXJ0aWNhbCBmaWx0ZXIuCi0gIEZJTFRFUl9CSUxJTkVBUiA9IDMsICAgIC8vIEJpbGluZWFyIGZpbHRlci4KLX07Ci0KLS8vIENvbnZlcnQgYSBmcmFtZSBvZiBZVVYgdG8gMzIgYml0IEFSR0IuCi0vLyBQYXNzIGluIFlWMTYvWVYxMiBkZXBlbmRpbmcgb24gc291cmNlIGZvcm1hdAotdm9pZCBDb252ZXJ0WVVWVG9SR0IzMihjb25zdCB1aW50OCogeXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdnBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogcmdiZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IHlzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCB1dnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IHJnYnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgWVVWVHlwZSB5dXZfdHlwZSk7Ci0KLS8vIFNjYWxlIGEgZnJhbWUgb2YgWVVWIHRvIDMyIGJpdCBBUkdCLgotLy8gU3VwcG9ydHMgcm90YXRpb24gYW5kIG1pcnJvcmluZy4KLXZvaWQgU2NhbGVZVVZUb1JHQjMyKGNvbnN0IHVpbnQ4KiB5cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogdXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIHZwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiByZ2JmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2Vfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgeXN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgIGludCB1dnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgIGludCByZ2JzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICBZVVZUeXBlIHl1dl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgUm90YXRlIHZpZXdfcm90YXRlLAotICAgICAgICAgICAgICAgICAgICAgU2NhbGVGaWx0ZXIgZmlsdGVyKTsKLQotLy8gQmlsaW5lciBTY2FsZSBhIGZyYW1lIG9mIFlWMTIgdG8gMzIgYml0cyBBUkdCIG9uIGEgc3BlY2lmaWVkIHJlY3RhbmdsZS4KLS8vIHx5cGxhbmV8LCBldGMgYW5kIHxyZ2JmcmFtZXwgc2hvdWxkIHBvaW50IHRvIHRoZSB0b3AtbGVmdCBwaXhlbHMgb2YgdGhlCi0vLyBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJ1ZmZlcnMuCi12b2lkIFNjYWxlWVVWVG9SR0IzMldpdGhSZWN0KGNvbnN0IHVpbnQ4KiB5cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB1cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiB2cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiByZ2JmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3JlY3RfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcmVjdF90b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3JlY3RfcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3JlY3RfYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeXN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHV2c3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmdic3RyaWRlKTsKLQotdm9pZCBDb252ZXJ0UkdCMzJUb1lVVihjb25zdCB1aW50OCogcmdiZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB5cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB1cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB2cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IHJnYnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IHlzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCB1dnN0cmlkZSk7Ci0KLXZvaWQgQ29udmVydFJHQjI0VG9ZVVYoY29uc3QgdWludDgqIHJnYmZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogeXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdnBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCByZ2JzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCB5c3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXZzdHJpZGUpOwotCi12b2lkIENvbnZlcnRZVVkyVG9ZVVYoY29uc3QgdWludDgqIHNyYywKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OCogeXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB1cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDgqIHZwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCk7Ci0KLXZvaWQgQ29udmVydE5WMjFUb1lVVihjb25zdCB1aW50OCogc3JjLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB5cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDgqIHVwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdnBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KTsKLQotLy8gRW1wdHkgU0lNRCByZWdpc3RlciBzdGF0ZSBhZnRlciBjYWxsaW5nIG9wdGltaXplZCBzY2FsZXIgZnVuY3Rpb25zLgotLy8gVGhpcyBtZXRob2QgaXMgb25seSB1c2VkIGluIHVuaXQgdGVzdCBhZnRlciBjYWxsaW5nIFNJTUQgZnVuY3Rpb25zLgotdm9pZCBFbXB0eVJlZ2lzdGVyU3RhdGUoKTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfQkFTRV9ZVVZfQ09OVkVSVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UveXV2X2NvbnZlcnRfdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvYmFzZS95dXZfY29udmVydF91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU3ZjcxNS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvYmFzZS95dXZfY29udmVydF91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDkzNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAiYmFzZS9iYXNlX3BhdGhzLmgiCi0jaW5jbHVkZSAiYmFzZS9jcHUuaCIKLSNpbmNsdWRlICJiYXNlL2ZpbGVfdXRpbC5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvcGF0aF9zZXJ2aWNlLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kamIyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaW1kL2NvbnZlcnRfcmdiX3RvX3l1di5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2ltZC9jb252ZXJ0X3l1dl90b19yZ2IuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3NpbWQvZmlsdGVyX3l1di5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UveXV2X2NvbnZlcnQuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLSNpbmNsdWRlICJ1aS9nZngvcmVjdC5oIgotCi0vLyBTaXplIG9mIHJhdyBpbWFnZS4KLXN0YXRpYyBjb25zdCBpbnQga1NvdXJjZVdpZHRoID0gNjQwOwotc3RhdGljIGNvbnN0IGludCBrU291cmNlSGVpZ2h0ID0gMzYwOwotc3RhdGljIGNvbnN0IGludCBrU291cmNlWVNpemUgPSBrU291cmNlV2lkdGggKiBrU291cmNlSGVpZ2h0Owotc3RhdGljIGNvbnN0IGludCBrU291cmNlVU9mZnNldCA9IGtTb3VyY2VZU2l6ZTsKLXN0YXRpYyBjb25zdCBpbnQga1NvdXJjZVZPZmZzZXQgPSBrU291cmNlWVNpemUgKiA1IC8gNDsKLXN0YXRpYyBjb25zdCBpbnQga1NjYWxlZFdpZHRoID0gMTAyNDsKLXN0YXRpYyBjb25zdCBpbnQga1NjYWxlZEhlaWdodCA9IDc2ODsKLXN0YXRpYyBjb25zdCBpbnQga0Rvd25TY2FsZWRXaWR0aCA9IDUxMjsKLXN0YXRpYyBjb25zdCBpbnQga0Rvd25TY2FsZWRIZWlnaHQgPSAzMjA7Ci1zdGF0aWMgY29uc3QgaW50IGtCcHAgPSA0OwotCi0vLyBTdXJmYWNlIHNpemVzIGZvciB2YXJpb3VzIHRlc3QgZmlsZXMuCi1zdGF0aWMgY29uc3QgaW50IGtZVVYxMlNpemUgPSBrU291cmNlWVNpemUgKiAxMiAvIDg7Ci1zdGF0aWMgY29uc3QgaW50IGtZVVYxNlNpemUgPSBrU291cmNlWVNpemUgKiAxNiAvIDg7Ci1zdGF0aWMgY29uc3QgaW50IGtZVVkyU2l6ZSA9ICBrU291cmNlWVNpemUgKiAxNiAvIDg7Ci1zdGF0aWMgY29uc3QgaW50IGtSR0JTaXplID0ga1NvdXJjZVlTaXplICoga0JwcDsKLXN0YXRpYyBjb25zdCBpbnQga1JHQlNpemVTY2FsZWQgPSBrU2NhbGVkV2lkdGggKiBrU2NhbGVkSGVpZ2h0ICoga0JwcDsKLXN0YXRpYyBjb25zdCBpbnQga1JHQjI0U2l6ZSA9IGtTb3VyY2VZU2l6ZSAqIDM7Ci1zdGF0aWMgY29uc3QgaW50IGtSR0JTaXplQ29udmVydGVkID0ga1NvdXJjZVlTaXplICoga0JwcDsKLQotLy8gSGVscGVyIGZvciByZWFkaW5nIHRlc3QgZGF0YSBpbnRvIGEgc2NvcGVkX2FycmF5PHVpbnQ4Pi4KLXN0YXRpYyB2b2lkIFJlYWREYXRhKGNvbnN0IEZpbGVQYXRoOjpDaGFyVHlwZSogZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9hcnJheTx1aW50OD4qIGRhdGEpIHsKLSAgZGF0YS0+cmVzZXQobmV3IHVpbnQ4W2V4cGVjdGVkX3NpemVdKTsKLQotICBGaWxlUGF0aCBwYXRoOwotICBDSEVDSyhQYXRoU2VydmljZTo6R2V0KGJhc2U6OkRJUl9TT1VSQ0VfUk9PVCwgJnBhdGgpKTsKLSAgcGF0aCA9IHBhdGguQXBwZW5kKEZJTEVfUEFUSF9MSVRFUkFMKCJtZWRpYSIpKQotICAgICAgICAgICAgIC5BcHBlbmQoRklMRV9QQVRIX0xJVEVSQUwoInRlc3QiKSkKLSAgICAgICAgICAgICAuQXBwZW5kKEZJTEVfUEFUSF9MSVRFUkFMKCJkYXRhIikpCi0gICAgICAgICAgICAgLkFwcGVuZChmaWxlbmFtZSk7Ci0KLSAgLy8gVmVyaWZ5IGZpbGUgc2l6ZSBpcyBjb3JyZWN0LgotICBpbnQ2NCBhY3R1YWxfc2l6ZSA9IDA7Ci0gIGZpbGVfdXRpbDo6R2V0RmlsZVNpemUocGF0aCwgJmFjdHVhbF9zaXplKTsKLSAgQ0hFQ0tfRVEoYWN0dWFsX3NpemUsIGV4cGVjdGVkX3NpemUpOwotCi0gIC8vIFZlcmlmeSBieXRlcyByZWFkIGFyZSBjb3JyZWN0LgotICBpbnQgYnl0ZXNfcmVhZCA9IGZpbGVfdXRpbDo6UmVhZEZpbGUoCi0gICAgICBwYXRoLCByZWludGVycHJldF9jYXN0PGNoYXIqPihkYXRhLT5nZXQoKSksIGV4cGVjdGVkX3NpemUpOwotICBDSEVDS19FUShieXRlc19yZWFkLCBleHBlY3RlZF9zaXplKTsKLX0KLQotc3RhdGljIHZvaWQgUmVhZFlWMTJEYXRhKHNjb3BlZF9hcnJheTx1aW50OD4qIGRhdGEpIHsKLSAgUmVhZERhdGEoRklMRV9QQVRIX0xJVEVSQUwoImJhbGlfNjQweDM2MF9QNDIwLnl1diIpLCBrWVVWMTJTaXplLCBkYXRhKTsKLX0KLQotc3RhdGljIHZvaWQgUmVhZFlWMTZEYXRhKHNjb3BlZF9hcnJheTx1aW50OD4qIGRhdGEpIHsKLSAgUmVhZERhdGEoRklMRV9QQVRIX0xJVEVSQUwoImJhbGlfNjQweDM2MF9QNDIyLnl1diIpLCBrWVVWMTZTaXplLCBkYXRhKTsKLX0KLQotc3RhdGljIHZvaWQgUmVhZFJHQjI0RGF0YShzY29wZWRfYXJyYXk8dWludDg+KiBkYXRhKSB7Ci0gIFJlYWREYXRhKEZJTEVfUEFUSF9MSVRFUkFMKCJiYWxpXzY0MHgzNjBfUkdCMjQucmdiIiksIGtSR0IyNFNpemUsIGRhdGEpOwotfQotCi1zdGF0aWMgdm9pZCBSZWFkWVVZMkRhdGEoc2NvcGVkX2FycmF5PHVpbnQ4PiogZGF0YSkgewotICBSZWFkRGF0YShGSUxFX1BBVEhfTElURVJBTCgiYmFsaV82NDB4MzYwX1lVWTIueXV2IiksIGtZVVkyU2l6ZSwgZGF0YSk7Ci19Ci0KLVRFU1QoWVVWQ29udmVydFRlc3QsIFlWMTIpIHsKLSAgLy8gQWxsb2NhdGUgYWxsIHN1cmZhY2VzLgotICBzY29wZWRfYXJyYXk8dWludDg+IHl1dl9ieXRlczsKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiByZ2JfYnl0ZXMobmV3IHVpbnQ4W2tSR0JTaXplXSk7Ci0gIHNjb3BlZF9hcnJheTx1aW50OD4gcmdiX2NvbnZlcnRlZF9ieXRlcyhuZXcgdWludDhba1JHQlNpemVDb252ZXJ0ZWRdKTsKLQotICAvLyBSZWFkIFlVViByZWZlcmVuY2UgZGF0YSBmcm9tIGZpbGUuCi0gIFJlYWRZVjEyRGF0YSgmeXV2X2J5dGVzKTsKLQotICAvLyBDb252ZXJ0IGEgZnJhbWUgb2YgWVVWIHRvIDMyIGJpdCBBUkdCLgotICBtZWRpYTo6Q29udmVydFlVVlRvUkdCMzIoeXV2X2J5dGVzLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2X2J5dGVzLmdldCgpICsga1NvdXJjZVVPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB5dXZfYnl0ZXMuZ2V0KCkgKyBrU291cmNlVk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl9jb252ZXJ0ZWRfYnl0ZXMuZ2V0KCksICAgICAgICAgICAgLy8gUkdCIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAga1NvdXJjZVdpZHRoLCBrU291cmNlSGVpZ2h0LCAgICAgICAgICAvLyBEaW1lbnNpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBrU291cmNlV2lkdGgsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFlTdHJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTb3VyY2VXaWR0aCAvIDIsICAgICAgICAgICAgICAgICAgICAgLy8gVVZTdHJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTb3VyY2VXaWR0aCAqIGtCcHAsICAgICAgICAgICAgICAgICAgLy8gUkdCU3RyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6WVYxMik7Ci0KLSAgdWludDMyIHJnYl9oYXNoID0gREpCMkhhc2gocmdiX2NvbnZlcnRlZF9ieXRlcy5nZXQoKSwga1JHQlNpemVDb252ZXJ0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtESkIySGFzaFNlZWQpOwotICBFWFBFQ1RfRVEoMjQxMzE3MTIyNnUsIHJnYl9oYXNoKTsKLX0KLQotVEVTVChZVVZDb252ZXJ0VGVzdCwgWVYxNikgewotICAvLyBBbGxvY2F0ZSBhbGwgc3VyZmFjZXMuCi0gIHNjb3BlZF9hcnJheTx1aW50OD4geXV2X2J5dGVzOwotICBzY29wZWRfYXJyYXk8dWludDg+IHJnYl9ieXRlcyhuZXcgdWludDhba1JHQlNpemVdKTsKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiByZ2JfY29udmVydGVkX2J5dGVzKG5ldyB1aW50OFtrUkdCU2l6ZUNvbnZlcnRlZF0pOwotCi0gIC8vIFJlYWQgWVVWIHJlZmVyZW5jZSBkYXRhIGZyb20gZmlsZS4KLSAgUmVhZFlWMTZEYXRhKCZ5dXZfYnl0ZXMpOwotCi0gIC8vIENvbnZlcnQgYSBmcmFtZSBvZiBZVVYgdG8gMzIgYml0IEFSR0IuCi0gIG1lZGlhOjpDb252ZXJ0WVVWVG9SR0IzMih5dXZfYnl0ZXMuZ2V0KCksICAgICAgICAgICAgICAgICAgICAgICAgLy8gWQotICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2X2J5dGVzLmdldCgpICsga1NvdXJjZVVPZmZzZXQsICAgICAgIC8vIFUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1dl9ieXRlcy5nZXQoKSArIGtTb3VyY2VZU2l6ZSAqIDMgLyAyLCAvLyBWCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfY29udmVydGVkX2J5dGVzLmdldCgpLCAgICAgICAgICAgICAgLy8gUkdCIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAga1NvdXJjZVdpZHRoLCBrU291cmNlSGVpZ2h0LCAgICAgICAgICAgIC8vIERpbWVuc2lvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTb3VyY2VXaWR0aCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBZU3RyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBrU291cmNlV2lkdGggLyAyLCAgICAgICAgICAgICAgICAgICAgICAgLy8gVVZTdHJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTb3VyY2VXaWR0aCAqIGtCcHAsICAgICAgICAgICAgICAgICAgICAvLyBSR0JTdHJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpZVjE2KTsKLQotICB1aW50MzIgcmdiX2hhc2ggPSBESkIySGFzaChyZ2JfY29udmVydGVkX2J5dGVzLmdldCgpLCBrUkdCU2l6ZUNvbnZlcnRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RKQjJIYXNoU2VlZCk7Ci0gIEVYUEVDVF9FUSg0MjIyMzQyMDQ3dSwgcmdiX2hhc2gpOwotfQotCi1zdHJ1Y3QgWVVWU2NhbGVUZXN0RGF0YSB7Ci0gIFlVVlNjYWxlVGVzdERhdGEobWVkaWE6OllVVlR5cGUgeSwgbWVkaWE6OlNjYWxlRmlsdGVyIHMsIHVpbnQzMiByKQotICAgICAgOiB5dXZfdHlwZSh5KSwKLSAgICAgICAgc2NhbGVfZmlsdGVyKHMpLAotICAgICAgICByZ2JfaGFzaChyKSB7Ci0gIH0KLQotICBtZWRpYTo6WVVWVHlwZSB5dXZfdHlwZTsKLSAgbWVkaWE6OlNjYWxlRmlsdGVyIHNjYWxlX2ZpbHRlcjsKLSAgdWludDMyIHJnYl9oYXNoOwotfTsKLQotY2xhc3MgWVVWU2NhbGVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxZVVZTY2FsZVRlc3REYXRhPiB7Ci0gcHVibGljOgotICBZVVZTY2FsZVRlc3QoKSB7Ci0gICAgc3dpdGNoIChHZXRQYXJhbSgpLnl1dl90eXBlKSB7Ci0gICAgICBjYXNlIG1lZGlhOjpZVjEyOgotICAgICAgICBSZWFkWVYxMkRhdGEoJnl1dl9ieXRlc18pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgbWVkaWE6OllWMTY6Ci0gICAgICAgIFJlYWRZVjE2RGF0YSgmeXV2X2J5dGVzXyk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJnYl9ieXRlc18ucmVzZXQobmV3IHVpbnQ4W2tSR0JTaXplU2NhbGVkXSk7Ci0gIH0KLQotICAvLyBIZWxwZXJzIGZvciBnZXR0aW5nIHRoZSBwcm9wZXIgWSwgVSBhbmQgViBwbGFuZSBvZmZzZXRzLgotICB1aW50OCogeV9wbGFuZSgpIHsgcmV0dXJuIHl1dl9ieXRlc18uZ2V0KCk7IH0KLSAgdWludDgqIHVfcGxhbmUoKSB7IHJldHVybiB5dXZfYnl0ZXNfLmdldCgpICsga1NvdXJjZVlTaXplOyB9Ci0gIHVpbnQ4KiB2X3BsYW5lKCkgewotICAgIHN3aXRjaCAoR2V0UGFyYW0oKS55dXZfdHlwZSkgewotICAgICAgY2FzZSBtZWRpYTo6WVYxMjoKLSAgICAgICAgcmV0dXJuIHl1dl9ieXRlc18uZ2V0KCkgKyBrU291cmNlVk9mZnNldDsKLSAgICAgIGNhc2UgbWVkaWE6OllWMTY6Ci0gICAgICAgIHJldHVybiB5dXZfYnl0ZXNfLmdldCgpICsga1NvdXJjZVlTaXplICogMyAvIDI7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiB5dXZfYnl0ZXNfOwotICBzY29wZWRfYXJyYXk8dWludDg+IHJnYl9ieXRlc187Ci19OwotCi1URVNUX1AoWVVWU2NhbGVUZXN0LCBOb1NjYWxlKSB7Ci0gIG1lZGlhOjpTY2FsZVlVVlRvUkdCMzIoeV9wbGFuZSgpLCAgICAgICAgICAgICAgICAgICAgLy8gWQotICAgICAgICAgICAgICAgICAgICAgICAgIHVfcGxhbmUoKSwgICAgICAgICAgICAgICAgICAgIC8vIFUKLSAgICAgICAgICAgICAgICAgICAgICAgICB2X3BsYW5lKCksICAgICAgICAgICAgICAgICAgICAvLyBWCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmdiX2J5dGVzXy5nZXQoKSwgICAgICAgICAgICAgLy8gUkdCIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgIGtTb3VyY2VXaWR0aCwga1NvdXJjZUhlaWdodCwgIC8vIERpbWVuc2lvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICBrU291cmNlV2lkdGgsIGtTb3VyY2VIZWlnaHQsICAvLyBEaW1lbnNpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICAga1NvdXJjZVdpZHRoLCAgICAgICAgICAgICAgICAgLy8gWVN0cmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgIGtTb3VyY2VXaWR0aCAvIDIsICAgICAgICAgICAgIC8vIFV2U3RyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAga1NvdXJjZVdpZHRoICoga0JwcCwgICAgICAgICAgLy8gUmdiU3RyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0oKS55dXZfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6Uk9UQVRFXzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0oKS5zY2FsZV9maWx0ZXIpOwotCi0gIHVpbnQzMiB5dXZfaGFzaCA9IERKQjJIYXNoKHJnYl9ieXRlc18uZ2V0KCksIGtSR0JTaXplLCBrREpCMkhhc2hTZWVkKTsKLQotICBtZWRpYTo6Q29udmVydFlVVlRvUkdCMzIoeV9wbGFuZSgpLCAgICAgICAgICAgICAgICAgICAgLy8gWQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9wbGFuZSgpLCAgICAgICAgICAgICAgICAgICAgLy8gVQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9wbGFuZSgpLCAgICAgICAgICAgICAgICAgICAgLy8gVgotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiX2J5dGVzXy5nZXQoKSwgICAgICAgICAgICAgLy8gUkdCIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAga1NvdXJjZVdpZHRoLCBrU291cmNlSGVpZ2h0LCAgLy8gRGltZW5zaW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgICAga1NvdXJjZVdpZHRoLCAgICAgICAgICAgICAgICAgLy8gWVN0cmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAga1NvdXJjZVdpZHRoIC8gMiwgICAgICAgICAgICAgLy8gVVZTdHJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTb3VyY2VXaWR0aCAqIGtCcHAsICAgICAgICAgIC8vIFJHQlN0cmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0oKS55dXZfdHlwZSk7Ci0KLSAgdWludDMyIHJnYl9oYXNoID0gREpCMkhhc2gocmdiX2J5dGVzXy5nZXQoKSwga1JHQlNpemUsIGtESkIySGFzaFNlZWQpOwotCi0gIEVYUEVDVF9FUSh5dXZfaGFzaCwgcmdiX2hhc2gpOwotfQotCi1URVNUX1AoWVVWU2NhbGVUZXN0LCBOb3JtYWwpIHsKLSAgbWVkaWE6OlNjYWxlWVVWVG9SR0IzMih5X3BsYW5lKCksICAgICAgICAgICAgICAgICAgICAvLyBZCi0gICAgICAgICAgICAgICAgICAgICAgICAgdV9wbGFuZSgpLCAgICAgICAgICAgICAgICAgICAgLy8gVQotICAgICAgICAgICAgICAgICAgICAgICAgIHZfcGxhbmUoKSwgICAgICAgICAgICAgICAgICAgIC8vIFYKLSAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfYnl0ZXNfLmdldCgpLCAgICAgICAgICAgICAvLyBSR0Igb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAga1NvdXJjZVdpZHRoLCBrU291cmNlSGVpZ2h0LCAgLy8gRGltZW5zaW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgIGtTY2FsZWRXaWR0aCwga1NjYWxlZEhlaWdodCwgIC8vIERpbWVuc2lvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICBrU291cmNlV2lkdGgsICAgICAgICAgICAgICAgICAvLyBZU3RyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAga1NvdXJjZVdpZHRoIC8gMiwgICAgICAgICAgICAgLy8gVXZTdHJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBrU2NhbGVkV2lkdGggKiBrQnBwLCAgICAgICAgICAvLyBSZ2JTdHJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBHZXRQYXJhbSgpLnl1dl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpST1RBVEVfMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBHZXRQYXJhbSgpLnNjYWxlX2ZpbHRlcik7Ci0KLSAgdWludDMyIHJnYl9oYXNoID0gREpCMkhhc2gocmdiX2J5dGVzXy5nZXQoKSwga1JHQlNpemVTY2FsZWQsIGtESkIySGFzaFNlZWQpOwotICBFWFBFQ1RfRVEoR2V0UGFyYW0oKS5yZ2JfaGFzaCwgcmdiX2hhc2gpOwotfQotCi1URVNUX1AoWVVWU2NhbGVUZXN0LCBaZXJvU291cmNlU2l6ZSkgewotICBtZWRpYTo6U2NhbGVZVVZUb1JHQjMyKHlfcGxhbmUoKSwgICAgICAgICAgICAgICAgICAgIC8vIFkKLSAgICAgICAgICAgICAgICAgICAgICAgICB1X3BsYW5lKCksICAgICAgICAgICAgICAgICAgICAvLyBVCi0gICAgICAgICAgICAgICAgICAgICAgICAgdl9wbGFuZSgpLCAgICAgICAgICAgICAgICAgICAgLy8gVgotICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl9ieXRlc18uZ2V0KCksICAgICAgICAgICAgIC8vIFJHQiBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEaW1lbnNpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICAga1NjYWxlZFdpZHRoLCBrU2NhbGVkSGVpZ2h0LCAgLy8gRGltZW5zaW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgIGtTb3VyY2VXaWR0aCwgICAgICAgICAgICAgICAgIC8vIFlTdHJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBrU291cmNlV2lkdGggLyAyLCAgICAgICAgICAgICAvLyBVdlN0cmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgIGtTY2FsZWRXaWR0aCAqIGtCcHAsICAgICAgICAgIC8vIFJnYlN0cmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgIEdldFBhcmFtKCkueXV2X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OlJPVEFURV8wLAotICAgICAgICAgICAgICAgICAgICAgICAgIEdldFBhcmFtKCkuc2NhbGVfZmlsdGVyKTsKLQotICAvLyBUZXN0aW5nIGZvciBvdXQtb2YtYm91bmQgcmVhZC93cml0ZXMgd2l0aCBBZGRyZXNzU2FuaXRpemVyLgotfQotCi1URVNUX1AoWVVWU2NhbGVUZXN0LCBaZXJvRGVzdGluYXRpb25TaXplKSB7Ci0gIG1lZGlhOjpTY2FsZVlVVlRvUkdCMzIoeV9wbGFuZSgpLCAgICAgICAgICAgICAgICAgICAgLy8gWQotICAgICAgICAgICAgICAgICAgICAgICAgIHVfcGxhbmUoKSwgICAgICAgICAgICAgICAgICAgIC8vIFUKLSAgICAgICAgICAgICAgICAgICAgICAgICB2X3BsYW5lKCksICAgICAgICAgICAgICAgICAgICAvLyBWCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmdiX2J5dGVzXy5nZXQoKSwgICAgICAgICAgICAgLy8gUkdCIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgIGtTb3VyY2VXaWR0aCwga1NvdXJjZUhlaWdodCwgIC8vIERpbWVuc2lvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEaW1lbnNpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICAga1NvdXJjZVdpZHRoLCAgICAgICAgICAgICAgICAgLy8gWVN0cmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgIGtTb3VyY2VXaWR0aCAvIDIsICAgICAgICAgICAgIC8vIFV2U3RyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAga1NjYWxlZFdpZHRoICoga0JwcCwgICAgICAgICAgLy8gUmdiU3RyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0oKS55dXZfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6Uk9UQVRFXzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0oKS5zY2FsZV9maWx0ZXIpOwotCi0gIC8vIFRlc3RpbmcgZm9yIG91dC1vZi1ib3VuZCByZWFkL3dyaXRlcyB3aXRoIEFkZHJlc3NTYW5pdGl6ZXIuCi19Ci0KLVRFU1RfUChZVVZTY2FsZVRlc3QsIE9kZFdpZHRoQW5kSGVpZ2h0Tm90Q3Jhc2gpIHsKLSAgbWVkaWE6OlNjYWxlWVVWVG9SR0IzMih5X3BsYW5lKCksICAgICAgICAgICAgICAgICAgICAvLyBZCi0gICAgICAgICAgICAgICAgICAgICAgICAgdV9wbGFuZSgpLCAgICAgICAgICAgICAgICAgICAgLy8gVQotICAgICAgICAgICAgICAgICAgICAgICAgIHZfcGxhbmUoKSwgICAgICAgICAgICAgICAgICAgIC8vIFYKLSAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfYnl0ZXNfLmdldCgpLCAgICAgICAgICAgICAvLyBSR0Igb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAga1NvdXJjZVdpZHRoLCBrU291cmNlSGVpZ2h0LCAgLy8gRGltZW5zaW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgIDMsIDMsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpbWVuc2lvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICBrU291cmNlV2lkdGgsICAgICAgICAgICAgICAgICAvLyBZU3RyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAga1NvdXJjZVdpZHRoIC8gMiwgICAgICAgICAgICAgLy8gVXZTdHJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBrU2NhbGVkV2lkdGggKiBrQnBwLCAgICAgICAgICAvLyBSZ2JTdHJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBHZXRQYXJhbSgpLnl1dl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpST1RBVEVfMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBHZXRQYXJhbSgpLnNjYWxlX2ZpbHRlcik7Ci19Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKAotICAgIFlVVlNjYWxlRm9ybWF0cywgWVVWU2NhbGVUZXN0LAotICAgIDo6dGVzdGluZzo6VmFsdWVzKAotICAgICAgICBZVVZTY2FsZVRlc3REYXRhKG1lZGlhOjpZVjEyLCBtZWRpYTo6RklMVEVSX05PTkUsIDQxMzY5MDQ5NTJ1KSwKLSAgICAgICAgWVVWU2NhbGVUZXN0RGF0YShtZWRpYTo6WVYxNiwgbWVkaWE6OkZJTFRFUl9OT05FLCAxNTAxNzc3NTQ3dSksCi0gICAgICAgIFlVVlNjYWxlVGVzdERhdGEobWVkaWE6OllWMTIsIG1lZGlhOjpGSUxURVJfQklMSU5FQVIsIDMxNjQyNzQ2ODl1KSwKLSAgICAgICAgWVVWU2NhbGVUZXN0RGF0YShtZWRpYTo6WVYxNiwgbWVkaWE6OkZJTFRFUl9CSUxJTkVBUiwgMzA5NTg3ODA0NnUpKSk7Ci0KLS8vIFRoaXMgdGVzdHMgYSBrbm93biB3b3JzdCBjYXNlIFlVViB2YWx1ZSwgYW5kIGZvciBvdmVyZmxvdy4KLVRFU1QoWVVWQ29udmVydFRlc3QsIENsYW1wKSB7Ci0gIC8vIEFsbG9jYXRlIGFsbCBzdXJmYWNlcy4KLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiB5dXZfYnl0ZXMobmV3IHVpbnQ4WzFdKTsKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiByZ2JfYnl0ZXMobmV3IHVpbnQ4WzFdKTsKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiByZ2JfY29udmVydGVkX2J5dGVzKG5ldyB1aW50OFsxXSk7Ci0KLSAgLy8gVmFsdWVzIHRoYXQgZmFpbGVkIHByZXZpb3VzbHkgaW4gYnVnIHJlcG9ydC4KLSAgdW5zaWduZWQgY2hhciB5ID0gMjU1dTsKLSAgdW5zaWduZWQgY2hhciB1ID0gMjU1dTsKLSAgdW5zaWduZWQgY2hhciB2ID0gMTl1OwotCi0gIC8vIFByZWZpbGwgZXh0cmEgbGFyZ2UgZGVzdGluYXRpb24gYnVmZmVyIHRvIHRlc3QgZm9yIG92ZXJmbG93LgotICB1bnNpZ25lZCBjaGFyIHJnYls4XSA9IHsgMCwgMSwgMiwgMywgNCwgNSwgNiwgNyB9OwotICB1bnNpZ25lZCBjaGFyIGV4cGVjdGVkWzhdID0geyAyNTUsIDI1NSwgMTA0LCAyNTUsIDQsIDUsIDYsIDcgfTsKLSAgLy8gQ29udmVydCBhIGZyYW1lIG9mIFlVViB0byAzMiBiaXQgQVJHQi4KLSAgbWVkaWE6OkNvbnZlcnRZVVZUb1JHQjMyKCZ5LCAgICAgICAvLyBZCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmdSwgICAgICAgLy8gVQotICAgICAgICAgICAgICAgICAgICAgICAgICAgJnYsICAgICAgIC8vIFYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZ2JbMF0sICAvLyBSR0Igb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAxLCAgICAgLy8gRGltZW5zaW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgIC8vIFlTdHJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAvLyBVVlN0cmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgIC8vIFJHQlN0cmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OllWMTIpOwotCi0gIGludCBleHBlY3RlZF90ZXN0ID0gbWVtY21wKHJnYiwgZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCkpOwotICBFWFBFQ1RfRVEoMCwgZXhwZWN0ZWRfdGVzdCk7Ci19Ci0KLVRFU1QoWVVWQ29udmVydFRlc3QsIFJHQjI0VG9ZVVYpIHsKLSAgLy8gQWxsb2NhdGUgYWxsIHN1cmZhY2VzLgotICBzY29wZWRfYXJyYXk8dWludDg+IHJnYl9ieXRlczsKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiB5dXZfY29udmVydGVkX2J5dGVzKG5ldyB1aW50OFtrWVVWMTJTaXplXSk7Ci0KLSAgLy8gUmVhZCBSR0IyNCByZWZlcmVuY2UgZGF0YSBmcm9tIGZpbGUuCi0gIFJlYWRSR0IyNERhdGEoJnJnYl9ieXRlcyk7Ci0KLSAgLy8gQ29udmVydCB0byBJNDIwLgotICBtZWRpYTo6Q29udmVydFJHQjI0VG9ZVVYocmdiX2J5dGVzLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2X2NvbnZlcnRlZF9ieXRlcy5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1dl9jb252ZXJ0ZWRfYnl0ZXMuZ2V0KCkgKyBrU291cmNlVU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1dl9jb252ZXJ0ZWRfYnl0ZXMuZ2V0KCkgKyBrU291cmNlVk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTb3VyY2VXaWR0aCwga1NvdXJjZUhlaWdodCwgICAgICAgIC8vIERpbWVuc2lvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTb3VyY2VXaWR0aCAqIDMsICAgICAgICAgICAgICAgICAgIC8vIFJHQlN0cmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAga1NvdXJjZVdpZHRoLCAgICAgICAgICAgICAgICAgICAgICAgLy8gWVN0cmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAga1NvdXJjZVdpZHRoIC8gMik7ICAgICAgICAgICAgICAgICAgLy8gVVZTdHJpZGUKLQotICB1aW50MzIgcmdiX2hhc2ggPSBESkIySGFzaCh5dXZfY29udmVydGVkX2J5dGVzLmdldCgpLCBrWVVWMTJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrREpCMkhhc2hTZWVkKTsKLSAgRVhQRUNUX0VRKDMyMDgyNDQzMnUsIHJnYl9oYXNoKTsKLX0KLQotVEVTVChZVVZDb252ZXJ0VGVzdCwgUkdCMzJUb1lVVikgewotICAvLyBBbGxvY2F0ZSBhbGwgc3VyZmFjZXMuCi0gIHNjb3BlZF9hcnJheTx1aW50OD4geXV2X2J5dGVzKG5ldyB1aW50OFtrWVVWMTJTaXplXSk7Ci0gIHNjb3BlZF9hcnJheTx1aW50OD4gcmdiX2J5dGVzKG5ldyB1aW50OFtrUkdCU2l6ZV0pOwotICBzY29wZWRfYXJyYXk8dWludDg+IHl1dl9jb252ZXJ0ZWRfYnl0ZXMobmV3IHVpbnQ4W2tZVVYxMlNpemVdKTsKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiByZ2JfY29udmVydGVkX2J5dGVzKG5ldyB1aW50OFtrUkdCU2l6ZV0pOwotCi0gIC8vIFJlYWQgWVVWIHJlZmVyZW5jZSBkYXRhIGZyb20gZmlsZS4KLSAgRmlsZVBhdGggeXV2X3VybDsKLSAgRVhQRUNUX1RSVUUoUGF0aFNlcnZpY2U6OkdldChiYXNlOjpESVJfU09VUkNFX1JPT1QsICZ5dXZfdXJsKSk7Ci0gIHl1dl91cmwgPSB5dXZfdXJsLkFwcGVuZChGSUxFX1BBVEhfTElURVJBTCgibWVkaWEiKSkKLSAgICAgICAgICAgICAgICAgICAuQXBwZW5kKEZJTEVfUEFUSF9MSVRFUkFMKCJ0ZXN0IikpCi0gICAgICAgICAgICAgICAgICAgLkFwcGVuZChGSUxFX1BBVEhfTElURVJBTCgiZGF0YSIpKQotICAgICAgICAgICAgICAgICAgIC5BcHBlbmQoRklMRV9QQVRIX0xJVEVSQUwoImJhbGlfNjQweDM2MF9QNDIwLnl1diIpKTsKLSAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PGludD4oa1lVVjEyU2l6ZSksCi0gICAgICAgICAgICBmaWxlX3V0aWw6OlJlYWRGaWxlKHl1dl91cmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHl1dl9ieXRlcy5nZXQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oa1lVVjEyU2l6ZSkpKTsKLQotICAvLyBDb252ZXJ0IGEgZnJhbWUgb2YgWVVWIHRvIDMyIGJpdCBBUkdCLgotICBtZWRpYTo6Q29udmVydFlVVlRvUkdCMzIoeXV2X2J5dGVzLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2X2J5dGVzLmdldCgpICsga1NvdXJjZVVPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB5dXZfYnl0ZXMuZ2V0KCkgKyBrU291cmNlVk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl9ieXRlcy5nZXQoKSwgICAgICAgICAgICAvLyBSR0Igb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBrU291cmNlV2lkdGgsIGtTb3VyY2VIZWlnaHQsICAgICAgICAgIC8vIERpbWVuc2lvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTb3VyY2VXaWR0aCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWVN0cmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAga1NvdXJjZVdpZHRoIC8gMiwgICAgICAgICAgICAgICAgICAgICAvLyBVVlN0cmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAga1NvdXJjZVdpZHRoICoga0JwcCwgICAgICAgICAgICAgICAgICAvLyBSR0JTdHJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpZVjEyKTsKLQotICAvLyBDb252ZXJ0IFJHQjMyIHRvIFlWMTIuCi0gIG1lZGlhOjpDb252ZXJ0UkdCMzJUb1lVVihyZ2JfYnl0ZXMuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB5dXZfY29udmVydGVkX2J5dGVzLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2X2NvbnZlcnRlZF9ieXRlcy5nZXQoKSArIGtTb3VyY2VVT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2X2NvbnZlcnRlZF9ieXRlcy5nZXQoKSArIGtTb3VyY2VWT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAga1NvdXJjZVdpZHRoLCBrU291cmNlSGVpZ2h0LCAgICAgICAgLy8gRGltZW5zaW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgICAga1NvdXJjZVdpZHRoICogNCwgICAgICAgICAgICAgICAgICAgLy8gUkdCU3RyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBrU291cmNlV2lkdGgsICAgICAgICAgICAgICAgICAgICAgICAvLyBZU3RyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBrU291cmNlV2lkdGggLyAyKTsgICAgICAgICAgICAgICAgICAvLyBVVlN0cmlkZQotCi0gIC8vIENvbnZlcnQgWVYxMiBiYWNrIHRvIFJHQjMyLgotICBtZWRpYTo6Q29udmVydFlVVlRvUkdCMzIoeXV2X2NvbnZlcnRlZF9ieXRlcy5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1dl9jb252ZXJ0ZWRfYnl0ZXMuZ2V0KCkgKyBrU291cmNlVU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1dl9jb252ZXJ0ZWRfYnl0ZXMuZ2V0KCkgKyBrU291cmNlVk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl9jb252ZXJ0ZWRfYnl0ZXMuZ2V0KCksICAgICAgICAgICAgLy8gUkdCIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAga1NvdXJjZVdpZHRoLCBrU291cmNlSGVpZ2h0LCAgICAgICAgICAvLyBEaW1lbnNpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBrU291cmNlV2lkdGgsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFlTdHJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTb3VyY2VXaWR0aCAvIDIsICAgICAgICAgICAgICAgICAgICAgLy8gVVZTdHJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTb3VyY2VXaWR0aCAqIGtCcHAsICAgICAgICAgICAgICAgICAgLy8gUkdCU3RyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6WVYxMik7Ci0KLSAgaW50IGVycm9yID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrUkdCU2l6ZTsgKytpKSB7Ci0gICAgaW50IGRpZmYgPSByZ2JfY29udmVydGVkX2J5dGVzW2ldIC0gcmdiX2J5dGVzW2ldOwotICAgIGlmIChkaWZmIDwgMCkKLSAgICAgIGRpZmYgPSAtZGlmZjsKLSAgICBlcnJvciArPSBkaWZmOwotICB9Ci0KLSAgLy8gTWFrZSBzdXJlIGVycm9yIGlzIHdpdGhpbiBib3VuZC4KLSAgRFZMT0coMSkgPDwgIkF2ZXJhZ2UgZXJyb3IgcGVyIGNoYW5uZWw6ICIgPDwgZXJyb3IgLyBrUkdCU2l6ZTsKLSAgRVhQRUNUX0dUKDUsIGVycm9yIC8ga1JHQlNpemUpOwotfQotCi1URVNUKFlVVkNvbnZlcnRUZXN0LCBZVVkyVG9ZVVYpIHsKLSAgLy8gQWxsb2NhdGUgYWxsIHN1cmZhY2VzLgotICBzY29wZWRfYXJyYXk8dWludDg+IHl1eV9ieXRlczsKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiB5dXZfY29udmVydGVkX2J5dGVzKG5ldyB1aW50OFtrWVVWMTJTaXplXSk7Ci0KLSAgLy8gUmVhZCBZVVkgcmVmZXJlbmNlIGRhdGEgZnJvbSBmaWxlLgotICBSZWFkWVVZMkRhdGEoJnl1eV9ieXRlcyk7Ci0KLSAgLy8gQ29udmVydCB0byBJNDIwLgotICBtZWRpYTo6Q29udmVydFlVWTJUb1lVVih5dXlfYnl0ZXMuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHl1dl9jb252ZXJ0ZWRfYnl0ZXMuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHl1dl9jb252ZXJ0ZWRfYnl0ZXMuZ2V0KCkgKyBrU291cmNlVU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2X2NvbnZlcnRlZF9ieXRlcy5nZXQoKSArIGtTb3VyY2VWT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBrU291cmNlV2lkdGgsIGtTb3VyY2VIZWlnaHQpOwotCi0gIHVpbnQzMiB5dXlfaGFzaCA9IERKQjJIYXNoKHl1dl9jb252ZXJ0ZWRfYnl0ZXMuZ2V0KCksIGtZVVYxMlNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtESkIySGFzaFNlZWQpOwotICBFWFBFQ1RfRVEoNjY2ODIzMTg3dSwgeXV5X2hhc2gpOwotfQotCi1URVNUKFlVVkNvbnZlcnRUZXN0LCBEb3duU2NhbGVZVVZUb1JHQjMyV2l0aFJlY3QpIHsKLSAgLy8gUmVhZCBZVVYgcmVmZXJlbmNlIGRhdGEgZnJvbSBmaWxlLgotICBGaWxlUGF0aCB5dXZfdXJsOwotICBFWFBFQ1RfVFJVRShQYXRoU2VydmljZTo6R2V0KGJhc2U6OkRJUl9TT1VSQ0VfUk9PVCwgJnl1dl91cmwpKTsKLSAgeXV2X3VybCA9IHl1dl91cmwuQXBwZW5kKEZJTEVfUEFUSF9MSVRFUkFMKCJtZWRpYSIpKQotICAgICAgICAgICAgICAgICAgIC5BcHBlbmQoRklMRV9QQVRIX0xJVEVSQUwoInRlc3QiKSkKLSAgICAgICAgICAgICAgICAgICAuQXBwZW5kKEZJTEVfUEFUSF9MSVRFUkFMKCJkYXRhIikpCi0gICAgICAgICAgICAgICAgICAgLkFwcGVuZChGSUxFX1BBVEhfTElURVJBTCgiYmFsaV82NDB4MzYwX1A0MjAueXV2IikpOwotICBjb25zdCBzaXplX3Qgc2l6ZV9vZl95dXYgPSBrU291cmNlWVNpemUgKiAxMiAvIDg7ICAvLyAxMiBicHAuCi0gIHNjb3BlZF9hcnJheTx1aW50OD4geXV2X2J5dGVzKG5ldyB1aW50OFtzaXplX29mX3l1dl0pOwotICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8aW50PihzaXplX29mX3l1diksCi0gICAgICAgICAgICBmaWxlX3V0aWw6OlJlYWRGaWxlKHl1dl91cmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHl1dl9ieXRlcy5nZXQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc2l6ZV9vZl95dXYpKSk7Ci0KLSAgLy8gU2NhbGUgdGhlIGZ1bGwgZnJhbWUgb2YgWVVWIHRvIDMyIGJpdCBBUkdCLgotICAvLyBUaGUgQVBJIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIGRvd24tc2NhbGluZywgc28gd2UgZG9uJ3QgdGVzdCB1cC1zY2FsaW5nLgotICBjb25zdCBzaXplX3Qgc2l6ZV9vZl9yZ2Jfc2NhbGVkID0ga0Rvd25TY2FsZWRXaWR0aCAqIGtEb3duU2NhbGVkSGVpZ2h0ICoga0JwcDsKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiByZ2Jfc2NhbGVkX2J5dGVzKG5ldyB1aW50OFtzaXplX29mX3JnYl9zY2FsZWRdKTsKLSAgZ2Z4OjpSZWN0IHN1Yl9yZWN0KDAsIDAsIGtEb3duU2NhbGVkV2lkdGgsIGtEb3duU2NhbGVkSGVpZ2h0KTsKLQotICAvLyBXZSBjYW4ndCBjb21wYXJlIHdpdGggdGhlIGZ1bGwtZnJhbWUgc2NhbGVyIGJlY2F1c2UgaXQgdXNlcyBzbGlnaHRseQotICAvLyBkaWZmZXJlbnQgc2FtcGxpbmcgY29vcmRpbmF0ZXMuCi0gIG1lZGlhOjpTY2FsZVlVVlRvUkdCMzJXaXRoUmVjdCgKLSAgICAgIHl1dl9ieXRlcy5nZXQoKSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFkKLSAgICAgIHl1dl9ieXRlcy5nZXQoKSArIGtTb3VyY2VVT2Zmc2V0LCAgICAgICAgIC8vIFUKLSAgICAgIHl1dl9ieXRlcy5nZXQoKSArIGtTb3VyY2VWT2Zmc2V0LCAgICAgICAgIC8vIFYKLSAgICAgIHJnYl9zY2FsZWRfYnl0ZXMuZ2V0KCksICAgICAgICAgICAgICAgICAgIC8vIFJnYiBvdXRwdXQKLSAgICAgIGtTb3VyY2VXaWR0aCwga1NvdXJjZUhlaWdodCwgICAgICAgICAgICAgIC8vIERpbWVuc2lvbnMKLSAgICAgIGtEb3duU2NhbGVkV2lkdGgsIGtEb3duU2NhbGVkSGVpZ2h0LCAgICAgIC8vIERpbWVuc2lvbnMKLSAgICAgIHN1Yl9yZWN0LngoKSwgc3ViX3JlY3QueSgpLCAgICAgICAgICAgICAgIC8vIERlc3QgcmVjdAotICAgICAgc3ViX3JlY3QucmlnaHQoKSwgc3ViX3JlY3QuYm90dG9tKCksICAgICAgLy8gRGVzdCByZWN0Ci0gICAgICBrU291cmNlV2lkdGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBZU3RyaWRlCi0gICAgICBrU291cmNlV2lkdGggLyAyLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVdlN0cmlkZQotICAgICAga0Rvd25TY2FsZWRXaWR0aCAqIGtCcHApOyAgICAgICAgICAgICAgICAgLy8gUmdiU3RyaWRlCi0KLSAgdWludDMyIHJnYl9oYXNoX2Z1bGxfcmVjdCA9IERKQjJIYXNoKHJnYl9zY2FsZWRfYnl0ZXMuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX29mX3JnYl9zY2FsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrREpCMkhhc2hTZWVkKTsKLQotICAvLyBSZS1zY2FsZSBzdWItcmVjdGFuZ2xlcyBhbmQgdmVyaWZ5IHRoZSByZXN1bHRzIGFyZSB0aGUgc2FtZS4KLSAgaW50IG5leHRfc3ViX3JlY3QgPSAwOwotICB3aGlsZSAoIXN1Yl9yZWN0LklzRW1wdHkoKSkgewotICAgIC8vIFNjYWxlIGEgcGFydGlhbCByZWN0YW5nbGUuCi0gICAgbWVkaWE6OlNjYWxlWVVWVG9SR0IzMldpdGhSZWN0KAotICAgICAgICB5dXZfYnl0ZXMuZ2V0KCksICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBZCi0gICAgICAgIHl1dl9ieXRlcy5nZXQoKSArIGtTb3VyY2VVT2Zmc2V0LCAgICAgICAgIC8vIFUKLSAgICAgICAgeXV2X2J5dGVzLmdldCgpICsga1NvdXJjZVZPZmZzZXQsICAgICAgICAgLy8gVgotICAgICAgICByZ2Jfc2NhbGVkX2J5dGVzLmdldCgpLCAgICAgICAgICAgICAgICAgICAvLyBSZ2Igb3V0cHV0Ci0gICAgICAgIGtTb3VyY2VXaWR0aCwga1NvdXJjZUhlaWdodCwgICAgICAgICAgICAgIC8vIERpbWVuc2lvbnMKLSAgICAgICAga0Rvd25TY2FsZWRXaWR0aCwga0Rvd25TY2FsZWRIZWlnaHQsICAgICAgLy8gRGltZW5zaW9ucwotICAgICAgICBzdWJfcmVjdC54KCksIHN1Yl9yZWN0LnkoKSwgICAgICAgICAgICAgICAvLyBEZXN0IHJlY3QKLSAgICAgICAgc3ViX3JlY3QucmlnaHQoKSwgc3ViX3JlY3QuYm90dG9tKCksICAgICAgLy8gRGVzdCByZWN0Ci0gICAgICAgIGtTb3VyY2VXaWR0aCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFlTdHJpZGUKLSAgICAgICAga1NvdXJjZVdpZHRoIC8gMiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXZTdHJpZGUKLSAgICAgICAga0Rvd25TY2FsZWRXaWR0aCAqIGtCcHApOyAgICAgICAgICAgICAgICAgLy8gUmdiU3RyaWRlCi0gICAgdWludDMyIHJnYl9oYXNoX3N1Yl9yZWN0ID0gREpCMkhhc2gocmdiX3NjYWxlZF9ieXRlcy5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX29mX3JnYl9zY2FsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RKQjJIYXNoU2VlZCk7Ci0KLSAgICBFWFBFQ1RfRVEocmdiX2hhc2hfZnVsbF9yZWN0LCByZ2JfaGFzaF9zdWJfcmVjdCk7Ci0KLSAgICAvLyBOb3cgcGljayBjaG9vc2UgYSBxdWFydGVyIHJlY3Qgb2YgdGhpcyBzdWItcmVjdC4KLSAgICBpZiAobmV4dF9zdWJfcmVjdCAmIDEpCi0gICAgICBzdWJfcmVjdC5zZXRfeChzdWJfcmVjdC54KCkgKyBzdWJfcmVjdC53aWR0aCgpIC8gMik7Ci0gICAgaWYgKG5leHRfc3ViX3JlY3QgJiAyKQotICAgICAgc3ViX3JlY3Quc2V0X3koc3ViX3JlY3QueSgpICsgc3ViX3JlY3QuaGVpZ2h0KCkgLyAyKTsKLSAgICBzdWJfcmVjdC5zZXRfd2lkdGgoc3ViX3JlY3Qud2lkdGgoKSAvIDIpOwotICAgIHN1Yl9yZWN0LnNldF9oZWlnaHQoc3ViX3JlY3QuaGVpZ2h0KCkgLyAyKTsKLSAgICBuZXh0X3N1Yl9yZWN0Kys7Ci0gIH0KLX0KLQotI2lmICFkZWZpbmVkKEFSQ0hfQ1BVX0FSTV9GQU1JTFkpCi1URVNUKFlVVkNvbnZlcnRUZXN0LCBSR0IzMlRvWVVWX1NTRTJfTWF0Y2hSZWZlcmVuY2UpIHsKLSAgYmFzZTo6Q1BVIGNwdTsKLSAgaWYgKCFjcHUuaGFzX3NzZTIoKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiU3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBTU0UyLCB0ZXN0IG5vdCBleGVjdXRlZC4iOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIEFsbG9jYXRlIGFsbCBzdXJmYWNlcy4KLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiB5dXZfYnl0ZXMobmV3IHVpbnQ4W2tZVVYxMlNpemVdKTsKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiByZ2JfYnl0ZXMobmV3IHVpbnQ4W2tSR0JTaXplXSk7Ci0gIHNjb3BlZF9hcnJheTx1aW50OD4geXV2X2NvbnZlcnRlZF9ieXRlcyhuZXcgdWludDhba1lVVjEyU2l6ZV0pOwotICBzY29wZWRfYXJyYXk8dWludDg+IHl1dl9yZWZlcmVuY2VfYnl0ZXMobmV3IHVpbnQ4W2tZVVYxMlNpemVdKTsKLQotICBSZWFkWVYxMkRhdGEoJnl1dl9ieXRlcyk7Ci0KLSAgLy8gQ29udmVydCBhIGZyYW1lIG9mIFlVViB0byAzMiBiaXQgQVJHQi4KLSAgbWVkaWE6OkNvbnZlcnRZVVZUb1JHQjMyKAotICAgICAgeXV2X2J5dGVzLmdldCgpLAotICAgICAgeXV2X2J5dGVzLmdldCgpICsga1NvdXJjZVVPZmZzZXQsCi0gICAgICB5dXZfYnl0ZXMuZ2V0KCkgKyBrU291cmNlVk9mZnNldCwKLSAgICAgIHJnYl9ieXRlcy5nZXQoKSwgICAgICAgICAgICAvLyBSR0Igb3V0cHV0Ci0gICAgICBrU291cmNlV2lkdGgsIGtTb3VyY2VIZWlnaHQsICAgICAgICAgIC8vIERpbWVuc2lvbnMKLSAgICAgIGtTb3VyY2VXaWR0aCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWVN0cmlkZQotICAgICAga1NvdXJjZVdpZHRoIC8gMiwgICAgICAgICAgICAgICAgICAgICAvLyBVVlN0cmlkZQotICAgICAga1NvdXJjZVdpZHRoICoga0JwcCwgICAgICAgICAgICAgICAgICAvLyBSR0JTdHJpZGUKLSAgICAgIG1lZGlhOjpZVjEyKTsKLQotICAvLyBDb252ZXJ0IFJHQjMyIHRvIFlWMTIgd2l0aCBTU0UyIHZlcnNpb24uCi0gIG1lZGlhOjpDb252ZXJ0UkdCMzJUb1lVVl9TU0UyKAotICAgICAgcmdiX2J5dGVzLmdldCgpLAotICAgICAgeXV2X2NvbnZlcnRlZF9ieXRlcy5nZXQoKSwKLSAgICAgIHl1dl9jb252ZXJ0ZWRfYnl0ZXMuZ2V0KCkgKyBrU291cmNlVU9mZnNldCwKLSAgICAgIHl1dl9jb252ZXJ0ZWRfYnl0ZXMuZ2V0KCkgKyBrU291cmNlVk9mZnNldCwKLSAgICAgIGtTb3VyY2VXaWR0aCwga1NvdXJjZUhlaWdodCwgICAgICAgIC8vIERpbWVuc2lvbnMKLSAgICAgIGtTb3VyY2VXaWR0aCAqIDQsICAgICAgICAgICAgICAgICAgIC8vIFJHQlN0cmlkZQotICAgICAga1NvdXJjZVdpZHRoLCAgICAgICAgICAgICAgICAgICAgICAgLy8gWVN0cmlkZQotICAgICAga1NvdXJjZVdpZHRoIC8gMik7ICAgICAgICAgICAgICAgICAgLy8gVVZTdHJpZGUKLQotICAvLyBDb252ZXJ0IFJHQjMyIHRvIFlWMTIgd2l0aCByZWZlcmVuY2UgdmVyc2lvbi4KLSAgbWVkaWE6OkNvbnZlcnRSR0IzMlRvWVVWX1NTRTJfUmVmZXJlbmNlKAotICAgICAgcmdiX2J5dGVzLmdldCgpLAotICAgICAgeXV2X3JlZmVyZW5jZV9ieXRlcy5nZXQoKSwKLSAgICAgIHl1dl9yZWZlcmVuY2VfYnl0ZXMuZ2V0KCkgKyBrU291cmNlVU9mZnNldCwKLSAgICAgIHl1dl9yZWZlcmVuY2VfYnl0ZXMuZ2V0KCkgKyBrU291cmNlVk9mZnNldCwKLSAgICAgIGtTb3VyY2VXaWR0aCwga1NvdXJjZUhlaWdodCwgICAgICAgIC8vIERpbWVuc2lvbnMKLSAgICAgIGtTb3VyY2VXaWR0aCAqIDQsICAgICAgICAgICAgICAgICAgIC8vIFJHQlN0cmlkZQotICAgICAga1NvdXJjZVdpZHRoLCAgICAgICAgICAgICAgICAgICAgICAgLy8gWVN0cmlkZQotICAgICAga1NvdXJjZVdpZHRoIC8gMik7ICAgICAgICAgICAgICAgICAgLy8gVVZTdHJpZGUKLQotICAvLyBOb3cgY29udmVydCBhIG9kZCB3aWR0aCBhbmQgaGVpZ2h0LCB0aGlzIG92ZXJyaWRlcyBwYXJ0IG9mIHRoZSBidWZmZXIKLSAgLy8gZ2VuZXJhdGVkIGFib3ZlIGJ1dCB0aGF0IGlzIGZpbmUgYmVjYXVzZSB0aGUgcG9pbnQgb2YgdGhpcyB0ZXN0IGlzIHRvCi0gIC8vIG1hdGNoIHRoZSByZXN1bHQgd2l0aCB0aGUgcmVmZXJlbmNlIGNvZGUuCi0KLSAgLy8gQ29udmVydCBSR0IzMiB0byBZVjEyIHdpdGggU1NFMiB2ZXJzaW9uLgotICBtZWRpYTo6Q29udmVydFJHQjMyVG9ZVVZfU1NFMigKLSAgICAgIHJnYl9ieXRlcy5nZXQoKSwKLSAgICAgIHl1dl9jb252ZXJ0ZWRfYnl0ZXMuZ2V0KCksCi0gICAgICB5dXZfY29udmVydGVkX2J5dGVzLmdldCgpICsga1NvdXJjZVVPZmZzZXQsCi0gICAgICB5dXZfY29udmVydGVkX2J5dGVzLmdldCgpICsga1NvdXJjZVZPZmZzZXQsCi0gICAgICA3LCA3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEaW1lbnNpb25zCi0gICAgICBrU291cmNlV2lkdGggKiA0LCAgICAgICAgICAgICAgICAgICAvLyBSR0JTdHJpZGUKLSAgICAgIGtTb3VyY2VXaWR0aCwgICAgICAgICAgICAgICAgICAgICAgIC8vIFlTdHJpZGUKLSAgICAgIGtTb3VyY2VXaWR0aCAvIDIpOyAgICAgICAgICAgICAgICAgIC8vIFVWU3RyaWRlCi0KLSAgLy8gQ29udmVydCBSR0IzMiB0byBZVjEyIHdpdGggcmVmZXJlbmNlIHZlcnNpb24uCi0gIG1lZGlhOjpDb252ZXJ0UkdCMzJUb1lVVl9TU0UyX1JlZmVyZW5jZSgKLSAgICAgIHJnYl9ieXRlcy5nZXQoKSwKLSAgICAgIHl1dl9yZWZlcmVuY2VfYnl0ZXMuZ2V0KCksCi0gICAgICB5dXZfcmVmZXJlbmNlX2J5dGVzLmdldCgpICsga1NvdXJjZVVPZmZzZXQsCi0gICAgICB5dXZfcmVmZXJlbmNlX2J5dGVzLmdldCgpICsga1NvdXJjZVZPZmZzZXQsCi0gICAgICA3LCA3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEaW1lbnNpb25zCi0gICAgICBrU291cmNlV2lkdGggKiA0LCAgICAgICAgICAgICAgICAgICAvLyBSR0JTdHJpZGUKLSAgICAgIGtTb3VyY2VXaWR0aCwgICAgICAgICAgICAgICAgICAgICAgIC8vIFlTdHJpZGUKLSAgICAgIGtTb3VyY2VXaWR0aCAvIDIpOyAgICAgICAgICAgICAgICAgIC8vIFVWU3RyaWRlCi0KLSAgaW50IGVycm9yID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrWVVWMTJTaXplOyArK2kpIHsKLSAgICBpbnQgZGlmZiA9IHl1dl9yZWZlcmVuY2VfYnl0ZXNbaV0gLSB5dXZfY29udmVydGVkX2J5dGVzW2ldOwotICAgIGlmIChkaWZmIDwgMCkKLSAgICAgIGRpZmYgPSAtZGlmZjsKLSAgICBlcnJvciArPSBkaWZmOwotICB9Ci0KLSAgLy8gTWFrZSBzdXJlIHRoZXJlJ3Mgbm8gZGlmZmVyZW5jZSBmcm9tIHRoZSByZWZlcmVuY2UuCi0gIEVYUEVDVF9FUSgwLCBlcnJvcik7Ci19Ci0KLVRFU1QoWVVWQ29udmVydFRlc3QsIENvbnZlcnRZVVZUb1JHQjMyUm93X01NWCkgewotICBiYXNlOjpDUFUgY3B1OwotICBpZiAoIWNwdS5oYXNfbW14KCkpIHsKLSAgICBMT0coV0FSTklORykgPDwgIlN5c3RlbSBub3Qgc3VwcG9ydGVkLiBUZXN0IHNraXBwZWQuIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzY29wZWRfYXJyYXk8dWludDg+IHl1dl9ieXRlcyhuZXcgdWludDhba1lVVjEyU2l6ZV0pOwotICBzY29wZWRfYXJyYXk8dWludDg+IHJnYl9ieXRlc19yZWZlcmVuY2UobmV3IHVpbnQ4W2tSR0JTaXplXSk7Ci0gIHNjb3BlZF9hcnJheTx1aW50OD4gcmdiX2J5dGVzX2NvbnZlcnRlZChuZXcgdWludDhba1JHQlNpemVdKTsKLSAgUmVhZFlWMTJEYXRhKCZ5dXZfYnl0ZXMpOwotCi0gIGNvbnN0IGludCBrV2lkdGggPSAxNjc7Ci0gIENvbnZlcnRZVVZUb1JHQjMyUm93X0MoeXV2X2J5dGVzLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHl1dl9ieXRlcy5nZXQoKSArIGtTb3VyY2VVT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHl1dl9ieXRlcy5nZXQoKSArIGtTb3VyY2VWT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl9ieXRlc19yZWZlcmVuY2UuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAga1dpZHRoKTsKLSAgQ29udmVydFlVVlRvUkdCMzJSb3dfTU1YKHl1dl9ieXRlcy5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1dl9ieXRlcy5nZXQoKSArIGtTb3VyY2VVT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2X2J5dGVzLmdldCgpICsga1NvdXJjZVZPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfYnl0ZXNfY29udmVydGVkLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAga1dpZHRoKTsKLSAgbWVkaWE6OkVtcHR5UmVnaXN0ZXJTdGF0ZSgpOwotICBFWFBFQ1RfRVEoMCwgbWVtY21wKHJnYl9ieXRlc19yZWZlcmVuY2UuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgcmdiX2J5dGVzX2NvbnZlcnRlZC5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICBrV2lkdGggKiBrQnBwKSk7Ci19Ci0KLVRFU1QoWVVWQ29udmVydFRlc3QsIENvbnZlcnRZVVZUb1JHQjMyUm93X1NTRSkgewotICBiYXNlOjpDUFUgY3B1OwotICBpZiAoIWNwdS5oYXNfc3NlKCkpIHsKLSAgICBMT0coV0FSTklORykgPDwgIlN5c3RlbSBub3Qgc3VwcG9ydGVkLiBUZXN0IHNraXBwZWQuIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzY29wZWRfYXJyYXk8dWludDg+IHl1dl9ieXRlcyhuZXcgdWludDhba1lVVjEyU2l6ZV0pOwotICBzY29wZWRfYXJyYXk8dWludDg+IHJnYl9ieXRlc19yZWZlcmVuY2UobmV3IHVpbnQ4W2tSR0JTaXplXSk7Ci0gIHNjb3BlZF9hcnJheTx1aW50OD4gcmdiX2J5dGVzX2NvbnZlcnRlZChuZXcgdWludDhba1JHQlNpemVdKTsKLSAgUmVhZFlWMTJEYXRhKCZ5dXZfYnl0ZXMpOwotCi0gIGNvbnN0IGludCBrV2lkdGggPSAxNjc7Ci0gIENvbnZlcnRZVVZUb1JHQjMyUm93X0MoeXV2X2J5dGVzLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHl1dl9ieXRlcy5nZXQoKSArIGtTb3VyY2VVT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHl1dl9ieXRlcy5nZXQoKSArIGtTb3VyY2VWT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl9ieXRlc19yZWZlcmVuY2UuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAga1dpZHRoKTsKLSAgQ29udmVydFlVVlRvUkdCMzJSb3dfU1NFKHl1dl9ieXRlcy5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1dl9ieXRlcy5nZXQoKSArIGtTb3VyY2VVT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2X2J5dGVzLmdldCgpICsga1NvdXJjZVZPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfYnl0ZXNfY29udmVydGVkLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAga1dpZHRoKTsKLSAgbWVkaWE6OkVtcHR5UmVnaXN0ZXJTdGF0ZSgpOwotICBFWFBFQ1RfRVEoMCwgbWVtY21wKHJnYl9ieXRlc19yZWZlcmVuY2UuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgcmdiX2J5dGVzX2NvbnZlcnRlZC5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICBrV2lkdGggKiBrQnBwKSk7Ci19Ci0KLVRFU1QoWVVWQ29udmVydFRlc3QsIFNjYWxlWVVWVG9SR0IzMlJvd19NTVgpIHsKLSAgYmFzZTo6Q1BVIGNwdTsKLSAgaWYgKCFjcHUuaGFzX21teCgpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJTeXN0ZW0gbm90IHN1cHBvcnRlZC4gVGVzdCBza2lwcGVkLiI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiB5dXZfYnl0ZXMobmV3IHVpbnQ4W2tZVVYxMlNpemVdKTsKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiByZ2JfYnl0ZXNfcmVmZXJlbmNlKG5ldyB1aW50OFtrUkdCU2l6ZV0pOwotICBzY29wZWRfYXJyYXk8dWludDg+IHJnYl9ieXRlc19jb252ZXJ0ZWQobmV3IHVpbnQ4W2tSR0JTaXplXSk7Ci0gIFJlYWRZVjEyRGF0YSgmeXV2X2J5dGVzKTsKLQotICBjb25zdCBpbnQga1dpZHRoID0gMTY3OwotICBjb25zdCBpbnQga1NvdXJjZUR4ID0gODAwMDA7ICAvLyBUaGlzIHZhbHVlIG1lYW5zIGEgc2NhbGUgZG93bi4KLSAgU2NhbGVZVVZUb1JHQjMyUm93X0MoeXV2X2J5dGVzLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICB5dXZfYnl0ZXMuZ2V0KCkgKyBrU291cmNlVU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgeXV2X2J5dGVzLmdldCgpICsga1NvdXJjZVZPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIHJnYl9ieXRlc19yZWZlcmVuY2UuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgIGtXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAga1NvdXJjZUR4KTsKLSAgU2NhbGVZVVZUb1JHQjMyUm93X01NWCh5dXZfYnl0ZXMuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgeXV2X2J5dGVzLmdldCgpICsga1NvdXJjZVVPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeXV2X2J5dGVzLmdldCgpICsga1NvdXJjZVZPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmdiX2J5dGVzX2NvbnZlcnRlZC5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBrV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAga1NvdXJjZUR4KTsKLSAgbWVkaWE6OkVtcHR5UmVnaXN0ZXJTdGF0ZSgpOwotICBFWFBFQ1RfRVEoMCwgbWVtY21wKHJnYl9ieXRlc19yZWZlcmVuY2UuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgcmdiX2J5dGVzX2NvbnZlcnRlZC5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICBrV2lkdGggKiBrQnBwKSk7Ci19Ci0KLVRFU1QoWVVWQ29udmVydFRlc3QsIFNjYWxlWVVWVG9SR0IzMlJvd19TU0UpIHsKLSAgYmFzZTo6Q1BVIGNwdTsKLSAgaWYgKCFjcHUuaGFzX3NzZSgpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJTeXN0ZW0gbm90IHN1cHBvcnRlZC4gVGVzdCBza2lwcGVkLiI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiB5dXZfYnl0ZXMobmV3IHVpbnQ4W2tZVVYxMlNpemVdKTsKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiByZ2JfYnl0ZXNfcmVmZXJlbmNlKG5ldyB1aW50OFtrUkdCU2l6ZV0pOwotICBzY29wZWRfYXJyYXk8dWludDg+IHJnYl9ieXRlc19jb252ZXJ0ZWQobmV3IHVpbnQ4W2tSR0JTaXplXSk7Ci0gIFJlYWRZVjEyRGF0YSgmeXV2X2J5dGVzKTsKLQotICBjb25zdCBpbnQga1dpZHRoID0gMTY3OwotICBjb25zdCBpbnQga1NvdXJjZUR4ID0gODAwMDA7ICAvLyBUaGlzIHZhbHVlIG1lYW5zIGEgc2NhbGUgZG93bi4KLSAgU2NhbGVZVVZUb1JHQjMyUm93X0MoeXV2X2J5dGVzLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICB5dXZfYnl0ZXMuZ2V0KCkgKyBrU291cmNlVU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgeXV2X2J5dGVzLmdldCgpICsga1NvdXJjZVZPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIHJnYl9ieXRlc19yZWZlcmVuY2UuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgIGtXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAga1NvdXJjZUR4KTsKLSAgU2NhbGVZVVZUb1JHQjMyUm93X1NTRSh5dXZfYnl0ZXMuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgeXV2X2J5dGVzLmdldCgpICsga1NvdXJjZVVPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeXV2X2J5dGVzLmdldCgpICsga1NvdXJjZVZPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmdiX2J5dGVzX2NvbnZlcnRlZC5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBrV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAga1NvdXJjZUR4KTsKLSAgbWVkaWE6OkVtcHR5UmVnaXN0ZXJTdGF0ZSgpOwotICBFWFBFQ1RfRVEoMCwgbWVtY21wKHJnYl9ieXRlc19yZWZlcmVuY2UuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgcmdiX2J5dGVzX2NvbnZlcnRlZC5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICBrV2lkdGggKiBrQnBwKSk7Ci19Ci0KLVRFU1QoWVVWQ29udmVydFRlc3QsIExpbmVhclNjYWxlWVVWVG9SR0IzMlJvd19NTVgpIHsKLSAgYmFzZTo6Q1BVIGNwdTsKLSAgaWYgKCFjcHUuaGFzX21teCgpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJTeXN0ZW0gbm90IHN1cHBvcnRlZC4gVGVzdCBza2lwcGVkLiI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiB5dXZfYnl0ZXMobmV3IHVpbnQ4W2tZVVYxMlNpemVdKTsKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiByZ2JfYnl0ZXNfcmVmZXJlbmNlKG5ldyB1aW50OFtrUkdCU2l6ZV0pOwotICBzY29wZWRfYXJyYXk8dWludDg+IHJnYl9ieXRlc19jb252ZXJ0ZWQobmV3IHVpbnQ4W2tSR0JTaXplXSk7Ci0gIFJlYWRZVjEyRGF0YSgmeXV2X2J5dGVzKTsKLQotICBjb25zdCBpbnQga1dpZHRoID0gMTY3OwotICBjb25zdCBpbnQga1NvdXJjZUR4ID0gODAwMDA7ICAvLyBUaGlzIHZhbHVlIG1lYW5zIGEgc2NhbGUgZG93bi4KLSAgTGluZWFyU2NhbGVZVVZUb1JHQjMyUm93X0MoeXV2X2J5dGVzLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXZfYnl0ZXMuZ2V0KCkgKyBrU291cmNlVU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2X2J5dGVzLmdldCgpICsga1NvdXJjZVZPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl9ieXRlc19yZWZlcmVuY2UuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1NvdXJjZUR4KTsKLSAgTGluZWFyU2NhbGVZVVZUb1JHQjMyUm93X01NWCh5dXZfYnl0ZXMuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2X2J5dGVzLmdldCgpICsga1NvdXJjZVVPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2X2J5dGVzLmdldCgpICsga1NvdXJjZVZPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiX2J5dGVzX2NvbnZlcnRlZC5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1NvdXJjZUR4KTsKLSAgbWVkaWE6OkVtcHR5UmVnaXN0ZXJTdGF0ZSgpOwotICBFWFBFQ1RfRVEoMCwgbWVtY21wKHJnYl9ieXRlc19yZWZlcmVuY2UuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgcmdiX2J5dGVzX2NvbnZlcnRlZC5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICBrV2lkdGggKiBrQnBwKSk7Ci19Ci0KLVRFU1QoWVVWQ29udmVydFRlc3QsIExpbmVhclNjYWxlWVVWVG9SR0IzMlJvd19TU0UpIHsKLSAgYmFzZTo6Q1BVIGNwdTsKLSAgaWYgKCFjcHUuaGFzX3NzZSgpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJTeXN0ZW0gbm90IHN1cHBvcnRlZC4gVGVzdCBza2lwcGVkLiI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiB5dXZfYnl0ZXMobmV3IHVpbnQ4W2tZVVYxMlNpemVdKTsKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiByZ2JfYnl0ZXNfcmVmZXJlbmNlKG5ldyB1aW50OFtrUkdCU2l6ZV0pOwotICBzY29wZWRfYXJyYXk8dWludDg+IHJnYl9ieXRlc19jb252ZXJ0ZWQobmV3IHVpbnQ4W2tSR0JTaXplXSk7Ci0gIFJlYWRZVjEyRGF0YSgmeXV2X2J5dGVzKTsKLQotICBjb25zdCBpbnQga1dpZHRoID0gMTY3OwotICBjb25zdCBpbnQga1NvdXJjZUR4ID0gODAwMDA7ICAvLyBUaGlzIHZhbHVlIG1lYW5zIGEgc2NhbGUgZG93bi4KLSAgTGluZWFyU2NhbGVZVVZUb1JHQjMyUm93X0MoeXV2X2J5dGVzLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXZfYnl0ZXMuZ2V0KCkgKyBrU291cmNlVU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2X2J5dGVzLmdldCgpICsga1NvdXJjZVZPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl9ieXRlc19yZWZlcmVuY2UuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1NvdXJjZUR4KTsKLSAgTGluZWFyU2NhbGVZVVZUb1JHQjMyUm93X1NTRSh5dXZfYnl0ZXMuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2X2J5dGVzLmdldCgpICsga1NvdXJjZVVPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2X2J5dGVzLmdldCgpICsga1NvdXJjZVZPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiX2J5dGVzX2NvbnZlcnRlZC5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1NvdXJjZUR4KTsKLSAgbWVkaWE6OkVtcHR5UmVnaXN0ZXJTdGF0ZSgpOwotICBFWFBFQ1RfRVEoMCwgbWVtY21wKHJnYl9ieXRlc19yZWZlcmVuY2UuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgcmdiX2J5dGVzX2NvbnZlcnRlZC5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICBrV2lkdGggKiBrQnBwKSk7Ci19Ci0KLVRFU1QoWVVWQ29udmVydFRlc3QsIEZpbHRlcllVVlJvd3NfQ19PdXRPZkJvdW5kcykgewotICBzY29wZWRfYXJyYXk8dWludDg+IHNyYyhuZXcgdWludDhbMTZdKTsKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiBkc3QobmV3IHVpbnQ4WzE2XSk7Ci0KLSAgbWVtc2V0KHNyYy5nZXQoKSwgMHhmZiwgMTYpOwotICBtZW1zZXQoZHN0LmdldCgpLCAwLCAxNik7Ci0KLSAgbWVkaWE6OkZpbHRlcllVVlJvd3NfQyhkc3QuZ2V0KCksIHNyYy5nZXQoKSwgc3JjLmdldCgpLCAxLCAyNTUpOwotCi0gIEVYUEVDVF9FUSgyNTV1LCBkc3RbMF0pOwotICBmb3IgKGludCBpID0gMTsgaSA8IDE2OyArK2kpIHsKLSAgICBFWFBFQ1RfRVEoMHUsIGRzdFtpXSkgPDwgIiBub3QgZXF1YWwgYXQgIiA8PCBpOwotICB9Ci19Ci0KLVRFU1QoWVVWQ29udmVydFRlc3QsIEZpbHRlcllVVlJvd3NfTU1YX091dE9mQm91bmRzKSB7Ci0gIGJhc2U6OkNQVSBjcHU7Ci0gIGlmICghY3B1Lmhhc19tbXgoKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiU3lzdGVtIG5vdCBzdXBwb3J0ZWQuIFRlc3Qgc2tpcHBlZC4iOwotICAgIHJldHVybjsKLSAgfQotCi0gIHNjb3BlZF9hcnJheTx1aW50OD4gc3JjKG5ldyB1aW50OFsxNl0pOwotICBzY29wZWRfYXJyYXk8dWludDg+IGRzdChuZXcgdWludDhbMTZdKTsKLQotICBtZW1zZXQoc3JjLmdldCgpLCAweGZmLCAxNik7Ci0gIG1lbXNldChkc3QuZ2V0KCksIDAsIDE2KTsKLQotICBtZWRpYTo6RmlsdGVyWVVWUm93c19NTVgoZHN0LmdldCgpLCBzcmMuZ2V0KCksIHNyYy5nZXQoKSwgMSwgMjU1KTsKLSAgbWVkaWE6OkVtcHR5UmVnaXN0ZXJTdGF0ZSgpOwotCi0gIEVYUEVDVF9FUSgyNTV1LCBkc3RbMF0pOwotICBmb3IgKGludCBpID0gMTsgaSA8IDE2OyArK2kpIHsKLSAgICBFWFBFQ1RfRVEoMHUsIGRzdFtpXSk7Ci0gIH0KLX0KLQotVEVTVChZVVZDb252ZXJ0VGVzdCwgRmlsdGVyWVVWUm93c19TU0UyX091dE9mQm91bmRzKSB7Ci0gIGJhc2U6OkNQVSBjcHU7Ci0gIGlmICghY3B1Lmhhc19zc2UyKCkpIHsKLSAgICBMT0coV0FSTklORykgPDwgIlN5c3RlbSBub3Qgc3VwcG9ydGVkLiBUZXN0IHNraXBwZWQuIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzY29wZWRfYXJyYXk8dWludDg+IHNyYyhuZXcgdWludDhbMTZdKTsKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiBkc3QobmV3IHVpbnQ4WzE2XSk7Ci0KLSAgbWVtc2V0KHNyYy5nZXQoKSwgMHhmZiwgMTYpOwotICBtZW1zZXQoZHN0LmdldCgpLCAwLCAxNik7Ci0KLSAgbWVkaWE6OkZpbHRlcllVVlJvd3NfU1NFMihkc3QuZ2V0KCksIHNyYy5nZXQoKSwgc3JjLmdldCgpLCAxLCAyNTUpOwotCi0gIEVYUEVDVF9FUSgyNTV1LCBkc3RbMF0pOwotICBmb3IgKGludCBpID0gMTsgaSA8IDE2OyArK2kpIHsKLSAgICBFWFBFQ1RfRVEoMHUsIGRzdFtpXSk7Ci0gIH0KLX0KLQotVEVTVChZVVZDb252ZXJ0VGVzdCwgRmlsdGVyWVVWUm93c19NTVhfVW5hbGlnbmVkRGVzdGluYXRpb24pIHsKLSAgYmFzZTo6Q1BVIGNwdTsKLSAgaWYgKCFjcHUuaGFzX21teCgpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJTeXN0ZW0gbm90IHN1cHBvcnRlZC4gVGVzdCBza2lwcGVkLiI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgY29uc3QgaW50IGtTaXplID0gMzI7Ci0gIHNjb3BlZF9hcnJheTx1aW50OD4gc3JjKG5ldyB1aW50OFtrU2l6ZV0pOwotICBzY29wZWRfYXJyYXk8dWludDg+IGRzdF9zYW1wbGUobmV3IHVpbnQ4W2tTaXplXSk7Ci0gIHNjb3BlZF9hcnJheTx1aW50OD4gZHN0KG5ldyB1aW50OFtrU2l6ZV0pOwotCi0gIG1lbXNldChkc3Rfc2FtcGxlLmdldCgpLCAwLCBrU2l6ZSk7Ci0gIG1lbXNldChkc3QuZ2V0KCksIDAsIGtTaXplKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrU2l6ZTsgKytpKQotICAgIHNyY1tpXSA9IDEwMCArIGk7Ci0KLSAgbWVkaWE6OkZpbHRlcllVVlJvd3NfQyhkc3Rfc2FtcGxlLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy5nZXQoKSwgc3JjLmdldCgpLCAxNywgMTI4KTsKLQotICAvLyBHZW5lcmF0ZSBhbiB1bmFsaWduZWQgb3V0cHV0IGFkZHJlc3MuCi0gIHVpbnQ4KiBkc3RfcHRyID0KLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPigKLSAgICAgICAgICAocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGRzdC5nZXQoKSArIDgpICYgfjcpICsgMSk7Ci0gIG1lZGlhOjpGaWx0ZXJZVVZSb3dzX01NWChkc3RfcHRyLCBzcmMuZ2V0KCksIHNyYy5nZXQoKSwgMTcsIDEyOCk7Ci0gIG1lZGlhOjpFbXB0eVJlZ2lzdGVyU3RhdGUoKTsKLQotICBFWFBFQ1RfRVEoMCwgbWVtY21wKGRzdF9zYW1wbGUuZ2V0KCksIGRzdF9wdHIsIDE3KSk7Ci19Ci0KLVRFU1QoWVVWQ29udmVydFRlc3QsIEZpbHRlcllVVlJvd3NfU1NFMl9VbmFsaWduZWREZXN0aW5hdGlvbikgewotICBiYXNlOjpDUFUgY3B1OwotICBpZiAoIWNwdS5oYXNfc3NlMigpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJTeXN0ZW0gbm90IHN1cHBvcnRlZC4gVGVzdCBza2lwcGVkLiI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgY29uc3QgaW50IGtTaXplID0gNjQ7Ci0gIHNjb3BlZF9hcnJheTx1aW50OD4gc3JjKG5ldyB1aW50OFtrU2l6ZV0pOwotICBzY29wZWRfYXJyYXk8dWludDg+IGRzdF9zYW1wbGUobmV3IHVpbnQ4W2tTaXplXSk7Ci0gIHNjb3BlZF9hcnJheTx1aW50OD4gZHN0KG5ldyB1aW50OFtrU2l6ZV0pOwotCi0gIG1lbXNldChkc3Rfc2FtcGxlLmdldCgpLCAwLCBrU2l6ZSk7Ci0gIG1lbXNldChkc3QuZ2V0KCksIDAsIGtTaXplKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrU2l6ZTsgKytpKQotICAgIHNyY1tpXSA9IDEwMCArIGk7Ci0KLSAgbWVkaWE6OkZpbHRlcllVVlJvd3NfQyhkc3Rfc2FtcGxlLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy5nZXQoKSwgc3JjLmdldCgpLCAzNywgMTI4KTsKLQotICAvLyBHZW5lcmF0ZSBhbiB1bmFsaWduZWQgb3V0cHV0IGFkZHJlc3MuCi0gIHVpbnQ4KiBkc3RfcHRyID0KLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPigKLSAgICAgICAgICAocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGRzdC5nZXQoKSArIDE2KSAmIH4xNSkgKyAxKTsKLSAgbWVkaWE6OkZpbHRlcllVVlJvd3NfU1NFMihkc3RfcHRyLCBzcmMuZ2V0KCksIHNyYy5nZXQoKSwgMzcsIDEyOCk7Ci0gIG1lZGlhOjpFbXB0eVJlZ2lzdGVyU3RhdGUoKTsKLQotICBFWFBFQ1RfRVEoMCwgbWVtY21wKGRzdF9zYW1wbGUuZ2V0KCksIGRzdF9wdHIsIDM3KSk7Ci19Ci0KLSNpZiBkZWZpbmVkKEFSQ0hfQ1BVX1g4Nl82NCkKLQotVEVTVChZVVZDb252ZXJ0VGVzdCwgU2NhbGVZVVZUb1JHQjMyUm93X1NTRTJfWDY0KSB7Ci0gIHNjb3BlZF9hcnJheTx1aW50OD4geXV2X2J5dGVzKG5ldyB1aW50OFtrWVVWMTJTaXplXSk7Ci0gIHNjb3BlZF9hcnJheTx1aW50OD4gcmdiX2J5dGVzX3JlZmVyZW5jZShuZXcgdWludDhba1JHQlNpemVdKTsKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiByZ2JfYnl0ZXNfY29udmVydGVkKG5ldyB1aW50OFtrUkdCU2l6ZV0pOwotICBSZWFkWVYxMkRhdGEoJnl1dl9ieXRlcyk7Ci0KLSAgY29uc3QgaW50IGtXaWR0aCA9IDE2NzsKLSAgY29uc3QgaW50IGtTb3VyY2VEeCA9IDgwMDAwOyAgLy8gVGhpcyB2YWx1ZSBtZWFucyBhIHNjYWxlIGRvd24uCi0gIFNjYWxlWVVWVG9SR0IzMlJvd19DKHl1dl9ieXRlcy5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgeXV2X2J5dGVzLmdldCgpICsga1NvdXJjZVVPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIHl1dl9ieXRlcy5nZXQoKSArIGtTb3VyY2VWT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICByZ2JfYnl0ZXNfcmVmZXJlbmNlLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICBrV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgIGtTb3VyY2VEeCk7Ci0gIFNjYWxlWVVWVG9SR0IzMlJvd19TU0UyX1g2NCh5dXZfYnl0ZXMuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXZfYnl0ZXMuZ2V0KCkgKyBrU291cmNlVU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1dl9ieXRlcy5nZXQoKSArIGtTb3VyY2VWT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiX2J5dGVzX2NvbnZlcnRlZC5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTb3VyY2VEeCk7Ci0gIG1lZGlhOjpFbXB0eVJlZ2lzdGVyU3RhdGUoKTsKLSAgRVhQRUNUX0VRKDAsIG1lbWNtcChyZ2JfYnl0ZXNfcmVmZXJlbmNlLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgIHJnYl9ieXRlc19jb252ZXJ0ZWQuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAga1dpZHRoICoga0JwcCkpOwotfQotCi1URVNUKFlVVkNvbnZlcnRUZXN0LCBMaW5lYXJTY2FsZVlVVlRvUkdCMzJSb3dfTU1YX1g2NCkgewotICBzY29wZWRfYXJyYXk8dWludDg+IHl1dl9ieXRlcyhuZXcgdWludDhba1lVVjEyU2l6ZV0pOwotICBzY29wZWRfYXJyYXk8dWludDg+IHJnYl9ieXRlc19yZWZlcmVuY2UobmV3IHVpbnQ4W2tSR0JTaXplXSk7Ci0gIHNjb3BlZF9hcnJheTx1aW50OD4gcmdiX2J5dGVzX2NvbnZlcnRlZChuZXcgdWludDhba1JHQlNpemVdKTsKLSAgUmVhZFlWMTJEYXRhKCZ5dXZfYnl0ZXMpOwotCi0gIGNvbnN0IGludCBrV2lkdGggPSAxNjc7Ci0gIGNvbnN0IGludCBrU291cmNlRHggPSA4MDAwMDsgIC8vIFRoaXMgdmFsdWUgbWVhbnMgYSBzY2FsZSBkb3duLgotICBMaW5lYXJTY2FsZVlVVlRvUkdCMzJSb3dfQyh5dXZfYnl0ZXMuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1dl9ieXRlcy5nZXQoKSArIGtTb3VyY2VVT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXZfYnl0ZXMuZ2V0KCkgKyBrU291cmNlVk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiX2J5dGVzX3JlZmVyZW5jZS5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrU291cmNlRHgpOwotICBMaW5lYXJTY2FsZVlVVlRvUkdCMzJSb3dfTU1YX1g2NCh5dXZfYnl0ZXMuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1dl9ieXRlcy5nZXQoKSArIGtTb3VyY2VVT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXZfYnl0ZXMuZ2V0KCkgKyBrU291cmNlVk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiX2J5dGVzX2NvbnZlcnRlZC5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrU291cmNlRHgpOwotICBtZWRpYTo6RW1wdHlSZWdpc3RlclN0YXRlKCk7Ci0gIEVYUEVDVF9FUSgwLCBtZW1jbXAocmdiX2J5dGVzX3JlZmVyZW5jZS5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICByZ2JfYnl0ZXNfY29udmVydGVkLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgIGtXaWR0aCAqIGtCcHApKTsKLX0KLQotI2VuZGlmICAvLyBkZWZpbmVkKEFSQ0hfQ1BVX1g4Nl82NCkKLQotI2VuZGlmICAvLyBkZWZpbmVkKEFSQ0hfQ1BVX1g4Nl9GQU1JTFkpCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvY3J5cHRvL2Flc19kZWNyeXB0b3IuY2MgYi9zcmMvbWVkaWEvY3J5cHRvL2Flc19kZWNyeXB0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MzFhNzYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2NyeXB0by9hZXNfZGVjcnlwdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9jcnlwdG8vYWVzX2RlY3J5cHRvci5oIgotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS9zdGxfdXRpbC5oIgotI2luY2x1ZGUgImJhc2Uvc3RyaW5nX251bWJlcl9jb252ZXJzaW9ucy5oIgotI2luY2x1ZGUgImNyeXB0by9lbmNyeXB0b3IuaCIKLSNpbmNsdWRlICJjcnlwdG8vc3ltbWV0cmljX2tleS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fZGVjb2Rlcl9jb25maWcuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNyeXB0X2NvbmZpZy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVjcnlwdG9yX2NsaWVudC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fZGVjb2Rlcl9jb25maWcuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2ZyYW1lLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLXVpbnQzMiBBZXNEZWNyeXB0b3I6Om5leHRfc2Vzc2lvbl9pZF8gPSAxOwotCi1lbnVtIENsZWFyQnl0ZXNCdWZmZXJTZWwgewotICBrU3JjQ29udGFpbnNDbGVhckJ5dGVzLAotICBrRHN0Q29udGFpbnNDbGVhckJ5dGVzCi19OwotCi1zdGF0aWMgdm9pZCBDb3B5U3Vic2FtcGxlcyhjb25zdCBzdGQ6OnZlY3RvcjxTdWJzYW1wbGVFbnRyeT4mIHN1YnNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDbGVhckJ5dGVzQnVmZmVyU2VsIHNlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogZHN0KSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3Vic2FtcGxlcy5zaXplKCk7IGkrKykgewotICAgIGNvbnN0IFN1YnNhbXBsZUVudHJ5JiBzdWJzYW1wbGUgPSBzdWJzYW1wbGVzW2ldOwotICAgIGlmIChzZWwgPT0ga1NyY0NvbnRhaW5zQ2xlYXJCeXRlcykgewotICAgICAgc3JjICs9IHN1YnNhbXBsZS5jbGVhcl9ieXRlczsKLSAgICB9IGVsc2UgewotICAgICAgZHN0ICs9IHN1YnNhbXBsZS5jbGVhcl9ieXRlczsKLSAgICB9Ci0gICAgbWVtY3B5KGRzdCwgc3JjLCBzdWJzYW1wbGUuY3lwaGVyX2J5dGVzKTsKLSAgICBzcmMgKz0gc3Vic2FtcGxlLmN5cGhlcl9ieXRlczsKLSAgICBkc3QgKz0gc3Vic2FtcGxlLmN5cGhlcl9ieXRlczsKLSAgfQotfQotCi0vLyBEZWNyeXB0cyB8aW5wdXR8IHVzaW5nIHxrZXl8LiAgUmV0dXJucyBhIERlY29kZXJCdWZmZXIgd2l0aCB0aGUgZGVjcnlwdGVkCi0vLyBkYXRhIGlmIGRlY3J5cHRpb24gc3VjY2VlZGVkIG9yIE5VTEwgaWYgZGVjcnlwdGlvbiBmYWlsZWQuCi1zdGF0aWMgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBEZWNyeXB0RGF0YShjb25zdCBEZWNvZGVyQnVmZmVyJiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyeXB0bzo6U3ltbWV0cmljS2V5KiBrZXkpIHsKLSAgQ0hFQ0soaW5wdXQuR2V0RGF0YVNpemUoKSk7Ci0gIENIRUNLKGlucHV0LkdldERlY3J5cHRDb25maWcoKSk7Ci0gIENIRUNLKGtleSk7Ci0KLSAgY3J5cHRvOjpFbmNyeXB0b3IgZW5jcnlwdG9yOwotICBpZiAoIWVuY3J5cHRvci5Jbml0KGtleSwgY3J5cHRvOjpFbmNyeXB0b3I6OkNUUiwgIiIpKSB7Ci0gICAgRFZMT0coMSkgPDwgIkNvdWxkIG5vdCBpbml0aWFsaXplIGRlY3J5cHRvci4iOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgRENIRUNLX0VRKGlucHV0LkdldERlY3J5cHRDb25maWcoKS0+aXYoKS5zaXplKCksCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KERlY3J5cHRDb25maWc6OmtEZWNyeXB0aW9uS2V5U2l6ZSkpOwotICBpZiAoIWVuY3J5cHRvci5TZXRDb3VudGVyKGlucHV0LkdldERlY3J5cHRDb25maWcoKS0+aXYoKSkpIHsKLSAgICBEVkxPRygxKSA8PCAiQ291bGQgbm90IHNldCBjb3VudGVyIGJsb2NrLiI7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBjb25zdCBpbnQgZGF0YV9vZmZzZXQgPSBpbnB1dC5HZXREZWNyeXB0Q29uZmlnKCktPmRhdGFfb2Zmc2V0KCk7Ci0gIGNvbnN0IGNoYXIqIHNhbXBsZSA9Ci0gICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihpbnB1dC5HZXREYXRhKCkgKyBkYXRhX29mZnNldCk7Ci0gIERDSEVDS19HVChpbnB1dC5HZXREYXRhU2l6ZSgpLCBkYXRhX29mZnNldCk7Ci0gIHNpemVfdCBzYW1wbGVfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oaW5wdXQuR2V0RGF0YVNpemUoKSAtIGRhdGFfb2Zmc2V0KTsKLQotICBEQ0hFQ0tfR1Qoc2FtcGxlX3NpemUsIDBVKSA8PCAiTm8gc2FtcGxlIGRhdGEgdG8gYmUgZGVjcnlwdGVkLiI7Ci0gIGlmIChzYW1wbGVfc2l6ZSA9PSAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChpbnB1dC5HZXREZWNyeXB0Q29uZmlnKCktPnN1YnNhbXBsZXMoKS5lbXB0eSgpKSB7Ci0gICAgc3RkOjpzdHJpbmcgZGVjcnlwdGVkX3RleHQ7Ci0gICAgYmFzZTo6U3RyaW5nUGllY2UgZW5jcnlwdGVkX3RleHQoc2FtcGxlLCBzYW1wbGVfc2l6ZSk7Ci0gICAgaWYgKCFlbmNyeXB0b3IuRGVjcnlwdChlbmNyeXB0ZWRfdGV4dCwgJmRlY3J5cHRlZF90ZXh0KSkgewotICAgICAgRFZMT0coMSkgPDwgIkNvdWxkIG5vdCBkZWNyeXB0IGRhdGEuIjsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8vIFRPRE8oeGh3YW5nKTogRmluZCBhIHdheSB0byBhdm9pZCB0aGlzIGRhdGEgY29weS4KLSAgICByZXR1cm4gRGVjb2RlckJ1ZmZlcjo6Q29weUZyb20oCi0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihkZWNyeXB0ZWRfdGV4dC5kYXRhKCkpLAotICAgICAgICBkZWNyeXB0ZWRfdGV4dC5zaXplKCkpOwotICB9Ci0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8U3Vic2FtcGxlRW50cnk+JiBzdWJzYW1wbGVzID0KLSAgICAgIGlucHV0LkdldERlY3J5cHRDb25maWcoKS0+c3Vic2FtcGxlcygpOwotCi0gIHNpemVfdCB0b3RhbF9jbGVhcl9zaXplID0gMDsKLSAgc2l6ZV90IHRvdGFsX2VuY3J5cHRlZF9zaXplID0gMDsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdWJzYW1wbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgdG90YWxfY2xlYXJfc2l6ZSArPSBzdWJzYW1wbGVzW2ldLmNsZWFyX2J5dGVzOwotICAgIHRvdGFsX2VuY3J5cHRlZF9zaXplICs9IHN1YnNhbXBsZXNbaV0uY3lwaGVyX2J5dGVzOwotICAgIC8vIENoZWNrIGZvciBvdmVyZmxvdy4gVGhpcyBjaGVjayBpcyB2YWxpZCBiZWNhdXNlICpfc2l6ZSBpcyB1bnNpZ25lZC4KLSAgICBEQ0hFQ0sodG90YWxfY2xlYXJfc2l6ZSA+PSBzdWJzYW1wbGVzW2ldLmNsZWFyX2J5dGVzKTsKLSAgICBpZiAodG90YWxfZW5jcnlwdGVkX3NpemUgPCBzdWJzYW1wbGVzW2ldLmN5cGhlcl9ieXRlcykKLSAgICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHNpemVfdCB0b3RhbF9zaXplID0gdG90YWxfY2xlYXJfc2l6ZSArIHRvdGFsX2VuY3J5cHRlZF9zaXplOwotICBpZiAodG90YWxfc2l6ZSA8IHRvdGFsX2NsZWFyX3NpemUgfHwgdG90YWxfc2l6ZSAhPSBzYW1wbGVfc2l6ZSkgewotICAgIERWTE9HKDEpIDw8ICJTdWJzYW1wbGUgc2l6ZXMgZG8gbm90IGVxdWFsIGlucHV0IHNpemUiOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgLy8gVGhlIGVuY3J5cHRlZCBwb3J0aW9ucyBvZiBhbGwgc3Vic2FtcGxlcyBtdXN0IGZvcm0gYSBjb250aWd1b3VzIGJsb2NrLAotICAvLyBzdWNoIHRoYXQgYW4gZW5jcnlwdGVkIHN1YnNhbXBsZSB0aGF0IGVuZHMgYXdheSBmcm9tIGEgYmxvY2sgYm91bmRhcnkgaXMKLSAgLy8gaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGVuY3J5cHRlZCBzdWJzYW1wbGUuIFdlCi0gIC8vIGNvcHkgYWxsIGVuY3J5cHRlZCBzdWJzYW1wbGVzIHRvIGEgY29udGlndW91cyBidWZmZXIsIGRlY3J5cHQgdGhlbSwgdGhlbgotICAvLyBjb3B5IHRoZSBkZWNyeXB0ZWQgYnl0ZXMgb3ZlciB0aGUgZW5jcnlwdGVkIGJ5dGVzIGluIHRoZSBvdXRwdXQuCi0gIC8vIFRPRE8oc3Ryb2JlKTogYXR0ZW1wdCB0byByZWR1Y2UgbnVtYmVyIG9mIG1lbW9yeSBjb3BpZXMKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiBlbmNyeXB0ZWRfYnl0ZXMobmV3IHVpbnQ4W3RvdGFsX2VuY3J5cHRlZF9zaXplXSk7Ci0gIENvcHlTdWJzYW1wbGVzKHN1YnNhbXBsZXMsIGtTcmNDb250YWluc0NsZWFyQnl0ZXMsCi0gICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihzYW1wbGUpLCBlbmNyeXB0ZWRfYnl0ZXMuZ2V0KCkpOwotCi0gIGJhc2U6OlN0cmluZ1BpZWNlIGVuY3J5cHRlZF90ZXh0KAotICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZW5jcnlwdGVkX2J5dGVzLmdldCgpKSwKLSAgICAgIHRvdGFsX2VuY3J5cHRlZF9zaXplKTsKLSAgc3RkOjpzdHJpbmcgZGVjcnlwdGVkX3RleHQ7Ci0gIGlmICghZW5jcnlwdG9yLkRlY3J5cHQoZW5jcnlwdGVkX3RleHQsICZkZWNyeXB0ZWRfdGV4dCkpIHsKLSAgICBEVkxPRygxKSA8PCAiQ291bGQgbm90IGRlY3J5cHQgZGF0YS4iOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBvdXRwdXQgPSBEZWNvZGVyQnVmZmVyOjpDb3B5RnJvbSgKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihzYW1wbGUpLCBzYW1wbGVfc2l6ZSk7Ci0gIENvcHlTdWJzYW1wbGVzKHN1YnNhbXBsZXMsIGtEc3RDb250YWluc0NsZWFyQnl0ZXMsCi0gICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihkZWNyeXB0ZWRfdGV4dC5kYXRhKCkpLAotICAgICAgICAgICAgICAgICBvdXRwdXQtPkdldFdyaXRhYmxlRGF0YSgpKTsKLSAgcmV0dXJuIG91dHB1dDsKLX0KLQotQWVzRGVjcnlwdG9yOjpBZXNEZWNyeXB0b3IoRGVjcnlwdG9yQ2xpZW50KiBjbGllbnQpCi0gICAgOiBjbGllbnRfKGNsaWVudCkgewotfQotCi1BZXNEZWNyeXB0b3I6On5BZXNEZWNyeXB0b3IoKSB7Ci0gIFNUTERlbGV0ZVZhbHVlcygma2V5X21hcF8pOwotfQotCi1ib29sIEFlc0RlY3J5cHRvcjo6R2VuZXJhdGVLZXlSZXF1ZXN0KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIGluaXRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluaXRfZGF0YV9sZW5ndGgpIHsKLSAgc3RkOjpzdHJpbmcgc2Vzc2lvbl9pZF9zdHJpbmcoYmFzZTo6VWludFRvU3RyaW5nKG5leHRfc2Vzc2lvbl9pZF8rKykpOwotCi0gIC8vIEZvciBub3csIHRoZSBBZXNEZWNyeXB0b3IgZG9lcyBub3QgY2FyZSBhYm91dCB8a2V5X3N5c3RlbXwgYW5kIHx0eXBlfDsKLSAgLy8ganVzdCBmaXJlIHRoZSBldmVudCB3aXRoIHRoZSB8aW5pdF9kYXRhfCBhcyB0aGUgcmVxdWVzdC4KLSAgc3RkOjpzdHJpbmcgbWVzc2FnZTsKLSAgaWYgKGluaXRfZGF0YSAmJiBpbml0X2RhdGFfbGVuZ3RoKSB7Ci0gICAgbWVzc2FnZSA9IHN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGluaXRfZGF0YSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfZGF0YV9sZW5ndGgpOwotICB9Ci0KLSAgY2xpZW50Xy0+S2V5TWVzc2FnZShrZXlfc3lzdGVtLCBzZXNzaW9uX2lkX3N0cmluZywgbWVzc2FnZSwgIiIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBBZXNEZWNyeXB0b3I6OkFkZEtleShjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGtleV9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBpbml0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbml0X2RhdGFfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCkgewotICBDSEVDSyhrZXkpOwotICBDSEVDS19HVChrZXlfbGVuZ3RoLCAwKTsKLQotICAvLyBUT0RPKHhod2FuZyk6IEFkZCB8c2Vzc2lvbl9pZHwgY2hlY2sgYWZ0ZXIgd2UgZmlndXJlIG91dCBob3c6Ci0gIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9CdWdzL1B1YmxpYy9zaG93X2J1Zy5jZ2k/aWQ9MTY1NTAKLSAgaWYgKGtleV9sZW5ndGggIT0gRGVjcnlwdENvbmZpZzo6a0RlY3J5cHRpb25LZXlTaXplKSB7Ci0gICAgRFZMT0coMSkgPDwgIkludmFsaWQga2V5IGxlbmd0aDogIiA8PCBrZXlfbGVuZ3RoOwotICAgIGNsaWVudF8tPktleUVycm9yKGtleV9zeXN0ZW0sIHNlc3Npb25faWQsIERlY3J5cHRvcjo6a1Vua25vd25FcnJvciwgMCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gVE9ETyh4aHdhbmcpOiBGaXggdGhlIGRlY3J5cHRvciB0byBhY2NlcHQgbm8gfGluaXRfZGF0YXwuIFNlZQotICAvLyBodHRwOi8vY3JidWcuY29tLzEyMzI2NS4gVW50aWwgdGhlbiwgZW5zdXJlIGEgbm9uLWVtcHR5IHZhbHVlIGlzIHBhc3NlZC4KLSAgc3RhdGljIGNvbnN0IHVpbnQ4IGtEdW1teUluaXREYXRhWzFdID0geyAwIH07Ci0gIGlmICghaW5pdF9kYXRhKSB7Ci0gICAgaW5pdF9kYXRhID0ga0R1bW15SW5pdERhdGE7Ci0gICAgaW5pdF9kYXRhX2xlbmd0aCA9IGFycmF5c2l6ZShrRHVtbXlJbml0RGF0YSk7Ci0gIH0KLQotICAvLyBUT0RPKHhod2FuZyk6IEZvciBub3csIHVzZSB8aW5pdF9kYXRhfCBmb3Iga2V5IElELiBNYWtlIHRoaXMgbW9yZSBzcGVjCi0gIC8vIGNvbXBsaWFudCBsYXRlciAoaHR0cDovL2NyYnVnLmNvbS8xMjMyNjIsIGh0dHA6Ly9jcmJ1Zy5jb20vMTIzMjY1KS4KLSAgc3RkOjpzdHJpbmcga2V5X2lkX3N0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihpbml0X2RhdGEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfZGF0YV9sZW5ndGgpOwotICBzdGQ6OnN0cmluZyBrZXlfc3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGtleSkgLCBrZXlfbGVuZ3RoKTsKLSAgc2NvcGVkX3B0cjxEZWNyeXB0aW9uS2V5PiBkZWNyeXB0aW9uX2tleShuZXcgRGVjcnlwdGlvbktleShrZXlfc3RyaW5nKSk7Ci0gIGlmICghZGVjcnlwdGlvbl9rZXkuZ2V0KCkpIHsKLSAgICBEVkxPRygxKSA8PCAiQ291bGQgbm90IGNyZWF0ZSBrZXkuIjsKLSAgICBjbGllbnRfLT5LZXlFcnJvcihrZXlfc3lzdGVtLCBzZXNzaW9uX2lkLCBEZWNyeXB0b3I6OmtVbmtub3duRXJyb3IsIDApOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICghZGVjcnlwdGlvbl9rZXktPkluaXQoKSkgewotICAgIERWTE9HKDEpIDw8ICJDb3VsZCBub3QgaW5pdGlhbGl6ZSBkZWNyeXB0aW9uIGtleS4iOwotICAgIGNsaWVudF8tPktleUVycm9yKGtleV9zeXN0ZW0sIHNlc3Npb25faWQsIERlY3J5cHRvcjo6a1Vua25vd25FcnJvciwgMCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgU2V0S2V5KGtleV9pZF9zdHJpbmcsIGRlY3J5cHRpb25fa2V5LlBhc3MoKSk7Ci0KLSAgaWYgKCFhdWRpb19rZXlfYWRkZWRfY2JfLmlzX251bGwoKSkKLSAgICBhdWRpb19rZXlfYWRkZWRfY2JfLlJ1bigpOwotCi0gIGlmICghdmlkZW9fa2V5X2FkZGVkX2NiXy5pc19udWxsKCkpCi0gICAgdmlkZW9fa2V5X2FkZGVkX2NiXy5SdW4oKTsKLQotICBjbGllbnRfLT5LZXlBZGRlZChrZXlfc3lzdGVtLCBzZXNzaW9uX2lkKTsKLX0KLQotdm9pZCBBZXNEZWNyeXB0b3I6OkNhbmNlbEtleVJlcXVlc3QoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCkgewotfQotCi12b2lkIEFlc0RlY3J5cHRvcjo6UmVnaXN0ZXJLZXlBZGRlZENCKFN0cmVhbVR5cGUgc3RyZWFtX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEtleUFkZGVkQ0ImIGtleV9hZGRlZF9jYikgewotICBzd2l0Y2ggKHN0cmVhbV90eXBlKSB7Ci0gICAgY2FzZSBrQXVkaW86Ci0gICAgICBhdWRpb19rZXlfYWRkZWRfY2JfID0ga2V5X2FkZGVkX2NiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrVmlkZW86Ci0gICAgICB2aWRlb19rZXlfYWRkZWRfY2JfID0ga2V5X2FkZGVkX2NiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIE5PVFJFQUNIRUQoKTsKLSAgfQotfQotCi12b2lkIEFlc0RlY3J5cHRvcjo6RGVjcnlwdChTdHJlYW1UeXBlIHN0cmVhbV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgZW5jcnlwdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjcnlwdENCJiBkZWNyeXB0X2NiKSB7Ci0gIENIRUNLKGVuY3J5cHRlZC0+R2V0RGVjcnlwdENvbmZpZygpKTsKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9pZCA9IGVuY3J5cHRlZC0+R2V0RGVjcnlwdENvbmZpZygpLT5rZXlfaWQoKTsKLQotICBEZWNyeXB0aW9uS2V5KiBrZXkgPSBHZXRLZXkoa2V5X2lkKTsKLSAgaWYgKCFrZXkpIHsKLSAgICBEVkxPRygxKSA8PCAiQ291bGQgbm90IGZpbmQgYSBtYXRjaGluZyBrZXkgZm9yIHRoZSBnaXZlbiBrZXkgSUQuIjsKLSAgICBkZWNyeXB0X2NiLlJ1bihrTm9LZXksIE5VTEwpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gZGVjcnlwdGVkOwotICAvLyBBbiBlbXB0eSBpdiBzdHJpbmcgc2lnbmFscyB0aGF0IHRoZSBmcmFtZSBpcyB1bmVuY3J5cHRlZC4KLSAgaWYgKGVuY3J5cHRlZC0+R2V0RGVjcnlwdENvbmZpZygpLT5pdigpLmVtcHR5KCkpIHsKLSAgICBpbnQgZGF0YV9vZmZzZXQgPSBlbmNyeXB0ZWQtPkdldERlY3J5cHRDb25maWcoKS0+ZGF0YV9vZmZzZXQoKTsKLSAgICBkZWNyeXB0ZWQgPSBEZWNvZGVyQnVmZmVyOjpDb3B5RnJvbShlbmNyeXB0ZWQtPkdldERhdGEoKSArIGRhdGFfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZC0+R2V0RGF0YVNpemUoKSAtIGRhdGFfb2Zmc2V0KTsKLSAgfSBlbHNlIHsKLSAgICBjcnlwdG86OlN5bW1ldHJpY0tleSogZGVjcnlwdGlvbl9rZXkgPSBrZXktPmRlY3J5cHRpb25fa2V5KCk7Ci0gICAgZGVjcnlwdGVkID0gRGVjcnlwdERhdGEoKmVuY3J5cHRlZCwgZGVjcnlwdGlvbl9rZXkpOwotICAgIGlmICghZGVjcnlwdGVkKSB7Ci0gICAgICBEVkxPRygxKSA8PCAiRGVjcnlwdGlvbiBmYWlsZWQuIjsKLSAgICAgIGRlY3J5cHRfY2IuUnVuKGtFcnJvciwgTlVMTCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgZGVjcnlwdGVkLT5TZXRUaW1lc3RhbXAoZW5jcnlwdGVkLT5HZXRUaW1lc3RhbXAoKSk7Ci0gIGRlY3J5cHRlZC0+U2V0RHVyYXRpb24oZW5jcnlwdGVkLT5HZXREdXJhdGlvbigpKTsKLSAgZGVjcnlwdF9jYi5SdW4oa1N1Y2Nlc3MsIGRlY3J5cHRlZCk7Ci19Ci0KLXZvaWQgQWVzRGVjcnlwdG9yOjpDYW5jZWxEZWNyeXB0KFN0cmVhbVR5cGUgc3RyZWFtX3R5cGUpIHsKLSAgLy8gRGVjcnlwdCgpIGNhbGxzIHRoZSBEZWNyeXB0Q0Igc3luY2hyb25vdXNseSBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gY2FuY2VsLgotfQotCi12b2lkIEFlc0RlY3J5cHRvcjo6SW5pdGlhbGl6ZUF1ZGlvRGVjb2RlcihzY29wZWRfcHRyPEF1ZGlvRGVjb2RlckNvbmZpZz4gY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjb2RlckluaXRDQiYgaW5pdF9jYikgewotICAvLyBBZXNEZWNyeXB0b3IgZG9lcyBub3Qgc3VwcG9ydCBhdWRpbyBkZWNvZGluZy4KLSAgaW5pdF9jYi5SdW4oZmFsc2UpOwotfQotCi12b2lkIEFlc0RlY3J5cHRvcjo6SW5pdGlhbGl6ZVZpZGVvRGVjb2RlcihzY29wZWRfcHRyPFZpZGVvRGVjb2RlckNvbmZpZz4gY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjb2RlckluaXRDQiYgaW5pdF9jYikgewotICAvLyBBZXNEZWNyeXB0b3IgZG9lcyBub3Qgc3VwcG9ydCB2aWRlbyBkZWNvZGluZy4KLSAgaW5pdF9jYi5SdW4oZmFsc2UpOwotfQotCi12b2lkIEFlc0RlY3J5cHRvcjo6RGVjcnlwdEFuZERlY29kZUF1ZGlvKAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGVuY3J5cHRlZCwKLSAgICBjb25zdCBBdWRpb0RlY29kZUNCJiBhdWRpb19kZWNvZGVfY2IpIHsKLSAgTk9UUkVBQ0hFRCgpIDw8ICJBZXNEZWNyeXB0b3IgZG9lcyBub3Qgc3VwcG9ydCBhdWRpbyBkZWNvZGluZyI7Ci19Ci0KLXZvaWQgQWVzRGVjcnlwdG9yOjpEZWNyeXB0QW5kRGVjb2RlVmlkZW8oCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgZW5jcnlwdGVkLAotICAgIGNvbnN0IFZpZGVvRGVjb2RlQ0ImIHZpZGVvX2RlY29kZV9jYikgewotICBOT1RSRUFDSEVEKCkgPDwgIkFlc0RlY3J5cHRvciBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIGRlY29kaW5nIjsKLX0KLQotdm9pZCBBZXNEZWNyeXB0b3I6OlJlc2V0RGVjb2RlcihTdHJlYW1UeXBlIHN0cmVhbV90eXBlKSB7Ci0gIE5PVFJFQUNIRUQoKSA8PCAiQWVzRGVjcnlwdG9yIGRvZXMgbm90IHN1cHBvcnQgYXVkaW8vdmlkZW8gZGVjb2RpbmciOwotfQotCi12b2lkIEFlc0RlY3J5cHRvcjo6RGVpbml0aWFsaXplRGVjb2RlcihTdHJlYW1UeXBlIHN0cmVhbV90eXBlKSB7Ci0gIE5PVFJFQUNIRUQoKSA8PCAiQWVzRGVjcnlwdG9yIGRvZXMgbm90IHN1cHBvcnQgYXVkaW8vdmlkZW8gZGVjb2RpbmciOwotfQotCi12b2lkIEFlc0RlY3J5cHRvcjo6U2V0S2V5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9wdHI8RGVjcnlwdGlvbktleT4gZGVjcnlwdGlvbl9rZXkpIHsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGtleV9tYXBfbG9ja18pOwotICBLZXlNYXA6Oml0ZXJhdG9yIGZvdW5kID0ga2V5X21hcF8uZmluZChrZXlfaWQpOwotICBpZiAoZm91bmQgIT0ga2V5X21hcF8uZW5kKCkpIHsKLSAgICBkZWxldGUgZm91bmQtPnNlY29uZDsKLSAgICBrZXlfbWFwXy5lcmFzZShmb3VuZCk7Ci0gIH0KLSAga2V5X21hcF9ba2V5X2lkXSA9IGRlY3J5cHRpb25fa2V5LnJlbGVhc2UoKTsKLX0KLQotQWVzRGVjcnlwdG9yOjpEZWNyeXB0aW9uS2V5KiBBZXNEZWNyeXB0b3I6OkdldEtleSgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5X2lkKSBjb25zdCB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhrZXlfbWFwX2xvY2tfKTsKLSAgS2V5TWFwOjpjb25zdF9pdGVyYXRvciBmb3VuZCA9IGtleV9tYXBfLmZpbmQoa2V5X2lkKTsKLSAgaWYgKGZvdW5kID09IGtleV9tYXBfLmVuZCgpKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJldHVybiBmb3VuZC0+c2Vjb25kOwotfQotCi1BZXNEZWNyeXB0b3I6OkRlY3J5cHRpb25LZXk6OkRlY3J5cHRpb25LZXkoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3JldCkKLSAgICA6IHNlY3JldF8oc2VjcmV0KSB7Ci19Ci0KLUFlc0RlY3J5cHRvcjo6RGVjcnlwdGlvbktleTo6fkRlY3J5cHRpb25LZXkoKSB7fQotCi1ib29sIEFlc0RlY3J5cHRvcjo6RGVjcnlwdGlvbktleTo6SW5pdCgpIHsKLSAgQ0hFQ0soIXNlY3JldF8uZW1wdHkoKSk7Ci0gIGRlY3J5cHRpb25fa2V5Xy5yZXNldChjcnlwdG86OlN5bW1ldHJpY0tleTo6SW1wb3J0KAotICAgICAgY3J5cHRvOjpTeW1tZXRyaWNLZXk6OkFFUywgc2VjcmV0XykpOwotICBpZiAoIWRlY3J5cHRpb25fa2V5Xy5nZXQoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9jcnlwdG8vYWVzX2RlY3J5cHRvci5oIGIvc3JjL21lZGlhL2NyeXB0by9hZXNfZGVjcnlwdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ODM4MDUuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2NyeXB0by9hZXNfZGVjcnlwdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9DUllQVE9fQUVTX0RFQ1JZUFRPUl9IXwotI2RlZmluZSBNRURJQV9DUllQVE9fQUVTX0RFQ1JZUFRPUl9IXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgImJhc2Uvc3RyaW5nX3BpZWNlLmgiCi0jaW5jbHVkZSAiYmFzZS9zeW5jaHJvbml6YXRpb24vbG9jay5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVjcnlwdG9yLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCIKLQotbmFtZXNwYWNlIGNyeXB0byB7Ci1jbGFzcyBTeW1tZXRyaWNLZXk7Ci19Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIERlY3J5cHRvckNsaWVudDsKLQotLy8gRGVjcnlwdHMgYW4gQUVTIGVuY3J5cHRlZCBidWZmZXIgaW50byBhbiB1bmVuY3J5cHRlZCBidWZmZXIuIFRoZSBBRVMKLS8vIGVuY3J5cHRpb24gbXVzdCBiZSBDVFIgd2l0aCBhIGtleSBzaXplIG9mIDEyOGJpdHMuCi1jbGFzcyBNRURJQV9FWFBPUlQgQWVzRGVjcnlwdG9yIDogcHVibGljIERlY3J5cHRvciB7Ci0gcHVibGljOgotICAvLyBUaGUgQWVzRGVjcnlwdG9yIGRvZXMgbm90IHRha2Ugb3duZXJzaGlwIG9mIHRoZSB8Y2xpZW50fC4gVGhlIHxjbGllbnR8Ci0gIC8vIG11c3QgYmUgdmFsaWQgdGhyb3VnaG91dCB0aGUgbGlmZXRpbWUgb2YgdGhlIEFlc0RlY3J5cHRvci4KLSAgZXhwbGljaXQgQWVzRGVjcnlwdG9yKERlY3J5cHRvckNsaWVudCogY2xpZW50KTsKLSAgdmlydHVhbCB+QWVzRGVjcnlwdG9yKCk7Ci0KLSAgLy8gRGVjcnlwdG9yIGltcGxlbWVudGF0aW9uLgotICB2aXJ0dWFsIGJvb2wgR2VuZXJhdGVLZXlSZXF1ZXN0KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBpbml0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluaXRfZGF0YV9sZW5ndGgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgQWRkS2V5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgaW50IGtleV9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIGluaXRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5pdF9kYXRhX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBDYW5jZWxLZXlSZXF1ZXN0KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBSZWdpc3RlcktleUFkZGVkQ0IoU3RyZWFtVHlwZSBzdHJlYW1fdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBLZXlBZGRlZENCJiBrZXlfYWRkZWRfY2IpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgRGVjcnlwdChTdHJlYW1UeXBlIHN0cmVhbV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBlbmNyeXB0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY3J5cHRDQiYgZGVjcnlwdF9jYikgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBDYW5jZWxEZWNyeXB0KFN0cmVhbVR5cGUgc3RyZWFtX3R5cGUpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZUF1ZGlvRGVjb2RlcihzY29wZWRfcHRyPEF1ZGlvRGVjb2RlckNvbmZpZz4gY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNvZGVySW5pdENCJiBpbml0X2NiKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIEluaXRpYWxpemVWaWRlb0RlY29kZXIoc2NvcGVkX3B0cjxWaWRlb0RlY29kZXJDb25maWc+IGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjb2RlckluaXRDQiYgaW5pdF9jYikgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBEZWNyeXB0QW5kRGVjb2RlQXVkaW8oCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBlbmNyeXB0ZWQsCi0gICAgICBjb25zdCBBdWRpb0RlY29kZUNCJiBhdWRpb19kZWNvZGVfY2IpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgRGVjcnlwdEFuZERlY29kZVZpZGVvKAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgZW5jcnlwdGVkLAotICAgICAgY29uc3QgVmlkZW9EZWNvZGVDQiYgdmlkZW9fZGVjb2RlX2NiKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFJlc2V0RGVjb2RlcihTdHJlYW1UeXBlIHN0cmVhbV90eXBlKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIERlaW5pdGlhbGl6ZURlY29kZXIoU3RyZWFtVHlwZSBzdHJlYW1fdHlwZSkgT1ZFUlJJREU7Ci0KLSBwcml2YXRlOgotICAvLyBUT0RPKGZnYWxsaWdhbik6IFJlbW92ZSB0aGlzIGFuZCBjaGFuZ2UgS2V5TWFwIHRvIHVzZSBjcnlwdG86OlN5bW1ldHJpY0tleQotICAvLyBhcyB0aGVyZSBhcmUgbm8gZGVjcnlwdG9ycyB0aGF0IGFyZSBwZXJmb3JtaW5nIGFuIGludGVncml0eSBjaGVjay4KLSAgLy8gSGVscGVyIGNsYXNzIHRoYXQgbWFuYWdlcyB0aGUgZGVjcnlwdGlvbiBrZXkuCi0gIGNsYXNzIERlY3J5cHRpb25LZXkgewotICAgcHVibGljOgotICAgIGV4cGxpY2l0IERlY3J5cHRpb25LZXkoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3JldCk7Ci0gICAgfkRlY3J5cHRpb25LZXkoKTsKLQotICAgIC8vIENyZWF0ZXMgdGhlIGVuY3J5cHRpb24ga2V5LgotICAgIGJvb2wgSW5pdCgpOwotCi0gICAgY3J5cHRvOjpTeW1tZXRyaWNLZXkqIGRlY3J5cHRpb25fa2V5KCkgeyByZXR1cm4gZGVjcnlwdGlvbl9rZXlfLmdldCgpOyB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgLy8gVGhlIGJhc2Ugc2VjcmV0IHRoYXQgaXMgdXNlZCB0byBjcmVhdGUgdGhlIGRlY3J5cHRpb24ga2V5LgotICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHNlY3JldF87Ci0KLSAgICAvLyBUaGUga2V5IHVzZWQgdG8gZGVjcnlwdCB0aGUgZGF0YS4KLSAgICBzY29wZWRfcHRyPGNyeXB0bzo6U3ltbWV0cmljS2V5PiBkZWNyeXB0aW9uX2tleV87Ci0KLSAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRGVjcnlwdGlvbktleSk7Ci0gIH07Ci0KLSAgLy8gU2V0cyB8a2V5fCBmb3IgfGtleV9pZHwuIFRoZSBBZXNEZWNyeXB0b3IgdGFrZXMgdGhlIG93bmVyc2hpcCBvZiB0aGUgfGtleXwuCi0gIHZvaWQgU2V0S2V5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfaWQsIHNjb3BlZF9wdHI8RGVjcnlwdGlvbktleT4ga2V5KTsKLQotICAvLyBHZXRzIGEgRGVjcnlwdGlvbktleSBhc3NvY2lhdGVkIHdpdGggfGtleV9pZHwuIFRoZSBBZXNEZWNyeXB0b3Igc3RpbGwgb3ducwotICAvLyB0aGUga2V5LiBSZXR1cm5zIE5VTEwgaWYgbm8ga2V5IGlzIGFzc29jaWF0ZWQgd2l0aCB8a2V5X2lkfC4KLSAgRGVjcnlwdGlvbktleSogR2V0S2V5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfaWQpIGNvbnN0OwotCi0gIC8vIEtleU1hcCBvd25zIHRoZSBEZWNyeXB0aW9uS2V5KiBhbmQgbXVzdCBkZWxldGUgdGhlbSB3aGVuIHRoZXkgYXJlCi0gIC8vIG5vdCBuZWVkZWQgYW55IG1vcmUuCi0gIHR5cGVkZWYgYmFzZTo6aGFzaF9tYXA8c3RkOjpzdHJpbmcsIERlY3J5cHRpb25LZXkqPiBLZXlNYXA7Ci0KLSAgLy8gU2luY2Ugb25seSBEZWNyeXB0KCkgaXMgY2FsbGVkIG9mZiB0aGUgcmVuZGVyZXIgdGhyZWFkLCB3ZSBvbmx5IG5lZWQgdG8KLSAgLy8gcHJvdGVjdCB8a2V5X21hcF98LCB0aGUgb25seSBtZW1iZXIgdmFyaWFibGUgdGhhdCBpcyBzaGFyZWQgYmV0d2VlbgotICAvLyBEZWNyeXB0KCkgYW5kIG90aGVyIG1ldGhvZHMuCi0gIEtleU1hcCBrZXlfbWFwXzsgIC8vIFByb3RlY3RlZCBieSB0aGUgfGtleV9tYXBfbG9ja198LgotICBtdXRhYmxlIGJhc2U6OkxvY2sga2V5X21hcF9sb2NrXzsgIC8vIFByb3RlY3RzIHRoZSB8a2V5X21hcF98LgotCi0gIC8vIE1ha2Ugc2Vzc2lvbiBJRCB1bmlxdWUgcGVyIHJlbmRlcmVyIGJ5IG1ha2luZyBpdCBzdGF0aWMuCi0gIC8vIFRPRE8oeGh3YW5nKTogTWFrZSBzZXNzaW9uIElEIG1vcmUgc3RyaWN0bHkgZGVmaW5lZCBpZiBuZWVkZWQ6Ci0gIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9CdWdzL1B1YmxpYy9zaG93X2J1Zy5jZ2k/aWQ9MTY3MzkjYzAKLSAgc3RhdGljIHVpbnQzMiBuZXh0X3Nlc3Npb25faWRfOwotCi0gIERlY3J5cHRvckNsaWVudCogY29uc3QgY2xpZW50XzsKLQotICBLZXlBZGRlZENCIGF1ZGlvX2tleV9hZGRlZF9jYl87Ci0gIEtleUFkZGVkQ0IgdmlkZW9fa2V5X2FkZGVkX2NiXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQWVzRGVjcnlwdG9yKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0NSWVBUT19BRVNfREVDUllQVE9SX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvY3J5cHRvL2Flc19kZWNyeXB0b3JfdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvY3J5cHRvL2Flc19kZWNyeXB0b3JfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYWI4NmQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2NyeXB0by9hZXNfZGVjcnlwdG9yX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTk0ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVjcnlwdF9jb25maWcuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21vY2tfZmlsdGVycy5oIgotI2luY2x1ZGUgIm1lZGlhL2NyeXB0by9hZXNfZGVjcnlwdG9yLmgiCi0jaW5jbHVkZSAibWVkaWEvd2VibS93ZWJtX2NvbnN0YW50cy5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi11c2luZyA6OnRlc3Rpbmc6Ol87Ci11c2luZyA6OnRlc3Rpbmc6Okd0OwotdXNpbmcgOjp0ZXN0aW5nOjpJc051bGw7Ci11c2luZyA6OnRlc3Rpbmc6Ok5vdE51bGw7Ci11c2luZyA6OnRlc3Rpbmc6OlNhdmVBcmc7Ci11c2luZyA6OnRlc3Rpbmc6OlN0ckVxOwotdXNpbmcgOjp0ZXN0aW5nOjpTdHJOZTsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gfGVuY3J5cHRlZF9kYXRhfCBpcyBlbmNyeXB0ZWQgZnJvbSB8cGxhaW5fdGV4dHwgdXNpbmcgfGtleXwuIHxrZXlfaWR8IGlzCi0vLyB1c2VkIHRvIGRpc3Rpbmd1aXNoIHxrZXl8Lgotc3RydWN0IFdlYm1FbmNyeXB0ZWREYXRhIHsKLSAgdWludDggcGxhaW5fdGV4dFszMl07Ci0gIGludCBwbGFpbl90ZXh0X3NpemU7Ci0gIHVpbnQ4IGtleV9pZFszMl07Ci0gIGludCBrZXlfaWRfc2l6ZTsKLSAgdWludDgga2V5WzMyXTsKLSAgaW50IGtleV9zaXplOwotICB1aW50OCBlbmNyeXB0ZWRfZGF0YVs2NF07Ci0gIGludCBlbmNyeXB0ZWRfZGF0YV9zaXplOwotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIga0NsZWFyS2V5U3lzdGVtW10gPSAib3JnLnczLmNsZWFya2V5IjsKLQotLy8gRnJhbWVzIDAgJiAxIGFyZSBlbmNyeXB0ZWQgd2l0aCB0aGUgc2FtZSBrZXkuIEZyYW1lIDIgaXMgZW5jcnlwdGVkIHdpdGggYQotLy8gZGlmZmVyZW50IGtleS4gRnJhbWUgMyBpcyB1bmVuY3J5cHRlZC4KLWNvbnN0IFdlYm1FbmNyeXB0ZWREYXRhIGtXZWJtRW5jcnlwdGVkRnJhbWVzW10gPSB7Ci0gIHsKLSAgICAvLyBwbGFpbnRleHQKLSAgICAiT3JpZ2luYWwgZGF0YS4iLCAxNCwKLSAgICAvLyBrZXlfaWQKLSAgICB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCi0gICAgICAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLAotICAgICAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMwotICAgICAgfSwgMjAsCi0gICAgLy8ga2V5Ci0gICAgeyAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDE4LCAweDE5LCAweDFhLCAweDFiLAotICAgICAgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMwotICAgICAgfSwgMTYsCi0gICAgLy8gZW5jcnlwdGVkX2RhdGEKLSAgICB7IDB4MDEsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0gICAgICAweGZmLCAweGYwLCAweGQxLCAweDEyLCAweGQ1LCAweDI0LCAweDgxLCAweDk2LAotICAgICAgMHg1NSwgMHgxYiwgMHg2OCwgMHg5ZiwgMHgzOCwgMHg5MSwgMHg4NQotICAgICAgfSwgMjMKLSAgfSwgewotICAgIC8vIHBsYWludGV4dAotICAgICJDaGFuZ2VkIE9yaWdpbmFsIGRhdGEuIiwgMjIsCi0gICAgLy8ga2V5X2lkCi0gICAgeyAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAotICAgICAgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwKLSAgICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMKLSAgICAgIH0sIDIwLAotICAgIC8vIGtleQotICAgIHsgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwKLSAgICAgIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMKLSAgICAgIH0sIDE2LAotICAgIC8vIGVuY3J5cHRlZF9kYXRhCi0gICAgeyAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgMHgwMCwgMHg1NywgMHg2NiwgMHhmNCwgMHgxMiwgMHgxYSwgMHhlZCwgMHhiNSwKLSAgICAgIDB4NzksIDB4MWMsIDB4OGUsIDB4MjUsIDB4ZDcsIDB4MTcsIDB4ZTcsIDB4NWUsCi0gICAgICAweDE2LCAweGUzLCAweDQwLCAweDA4LCAweDI3LCAweDExLCAweGU5Ci0gICAgICB9LCAzMQotICB9LCB7Ci0gICAgLy8gcGxhaW50ZXh0Ci0gICAgIk9yaWdpbmFsIGRhdGEuIiwgMTQsCi0gICAgLy8ga2V5X2lkCi0gICAgeyAweDI0LCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDJiLAotICAgICAgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgMHgzMAotICAgICAgfSwgMTMsCi0gICAgLy8ga2V5Ci0gICAgeyAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LAotICAgICAgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgMHg0MAotICAgICAgfSwgMTYsCi0gICAgLy8gZW5jcnlwdGVkX2RhdGEKLSAgICB7IDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAweDAwLCAweDljLCAweDcxLCAweDI2LCAweDU3LCAweDNlLCAweDI1LCAweDM3LAotICAgICAgMHhmNywgMHgzMSwgMHg4MSwgMHgxOSwgMHg2NCwgMHhjZSwgMHhiYwotICAgICAgfSwgMjMKLSAgfSwgewotICAgIC8vIHBsYWludGV4dAotICAgICJDaGFuZ2VkIE9yaWdpbmFsIGRhdGEuIiwgMjIsCi0gICAgLy8ga2V5X2lkCi0gICAgeyAweDI0LCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDJiLAotICAgICAgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgMHgzMAotICAgICAgfSwgMTMsCi0gICAgLy8ga2V5Ci0gICAgeyAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LAotICAgICAgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgMHg0MAotICAgICAgfSwgMTYsCi0gICAgLy8gZW5jcnlwdGVkX2RhdGEKLSAgICB7IDB4MDAsIDB4NDMsIDB4NjgsIDB4NjEsIDB4NmUsIDB4NjcsIDB4NjUsIDB4NjQsCi0gICAgICAweDIwLCAweDRmLCAweDcyLCAweDY5LCAweDY3LCAweDY5LCAweDZlLCAweDYxLAotICAgICAgMHg2YywgMHgyMCwgMHg2NCwgMHg2MSwgMHg3NCwgMHg2MSwgMHgyZQotICAgICAgfSwgMjMKLSAgfQotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4IGtXZWJtV3JvbmdTaXplZEtleVtdID0geyAweDIwLCAweDIwIH07Ci0KLXN0YXRpYyBjb25zdCB1aW50OCBrU3Vic2FtcGxlT3JpZ2luYWxEYXRhW10gPSAiT3JpZ2luYWwgc3Vic2FtcGxlIGRhdGEuIjsKLXN0YXRpYyBjb25zdCBpbnQga1N1YnNhbXBsZU9yaWdpbmFsRGF0YVNpemUgPSAyNDsKLQotc3RhdGljIGNvbnN0IHVpbnQ4IGtTdWJzYW1wbGVLZXlJZFtdID0geyAweDAwLCAweDAxLCAweDAyLCAweDAzIH07Ci0KLXN0YXRpYyBjb25zdCB1aW50OCBrU3Vic2FtcGxlS2V5W10gPSB7Ci0gIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsCi0gIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OCBrU3Vic2FtcGxlSXZbXSA9IHsKLSAgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywKLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4IGtTdWJzYW1wbGVEYXRhW10gPSB7Ci0gIDB4NGYsIDB4NzIsIDB4MDksIDB4MTYsIDB4MDksIDB4ZTYsIDB4NzksIDB4YWQsCi0gIDB4NzAsIDB4NzMsIDB4NzUsIDB4NjIsIDB4MDksIDB4YmIsIDB4ODMsIDB4MWQsCi0gIDB4NGQsIDB4MDgsIDB4ZDcsIDB4NzgsIDB4YTQsIDB4YTcsIDB4ZjEsIDB4MmUKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OCBrUGFkZGVkU3Vic2FtcGxlRGF0YVtdID0gewotICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAotICAweDRmLCAweDcyLCAweDA5LCAweDE2LCAweDA5LCAweGU2LCAweDc5LCAweGFkLAotICAweDcwLCAweDczLCAweDc1LCAweDYyLCAweDA5LCAweGJiLCAweDgzLCAweDFkLAotICAweDRkLCAweDA4LCAweGQ3LCAweDc4LCAweGE0LCAweGE3LCAweGYxLCAweDJlCi19OwotCi0vLyBFbmNyeXB0ZWQgd2l0aCBrU3Vic2FtcGxlS2V5IGFuZCBrU3Vic2FtcGxlSXYgYnV0IHdpdGhvdXQgc3Vic2FtcGxlcy4KLXN0YXRpYyBjb25zdCB1aW50OCBrTm9TdWJzYW1wbGVEYXRhW10gPSB7Ci0gIDB4MmYsIDB4MDMsIDB4MDksIDB4ZWYsIDB4NzEsIDB4YWYsIDB4MzEsIDB4MTYsCi0gIDB4ZmEsIDB4OWQsIDB4MTgsIDB4NDMsIDB4MWUsIDB4OTYsIDB4NzEsIDB4YjUsCi0gIDB4YmYsIDB4ZjUsIDB4MzAsIDB4NTMsIDB4OWEsIDB4MjAsIDB4ZGYsIDB4OTUKLX07Ci0KLXN0YXRpYyBjb25zdCBTdWJzYW1wbGVFbnRyeSBrU3Vic2FtcGxlRW50cmllc1tdID0gewotICB7IDIsIDcgfSwKLSAgeyAzLCAxMSB9LAotICB7IDEsIDAgfQotfTsKLQotLy8gR2VuZXJhdGVzIGEgMTYgYnl0ZSBDVFIgY291bnRlciBibG9jay4gVGhlIENUUiBjb3VudGVyIGJsb2NrIGZvcm1hdCBpcyBhCi0vLyBDVFIgSVYgYXBwZW5kZWQgd2l0aCBhIENUUiBibG9jayBjb3VudGVyLiB8aXZ8IGlzIGFuIDggYnl0ZSBDVFIgSVYuCi0vLyB8aXZfc2l6ZXwgaXMgdGhlIHNpemUgb2YgfGl2fCBpbiBidHllcy4gUmV0dXJucyBhIHN0cmluZyBvZgotLy8ga0RlY3J5cHRpb25LZXlTaXplIGJ5dGVzLgotc3RhdGljIHN0ZDo6c3RyaW5nIEdlbmVyYXRlQ291bnRlckJsb2NrKGNvbnN0IHVpbnQ4KiBpdiwgaW50IGl2X3NpemUpIHsKLSAgQ0hFQ0tfR1QoaXZfc2l6ZSwgMCk7Ci0gIENIRUNLX0xFKGl2X3NpemUsIERlY3J5cHRDb25maWc6OmtEZWNyeXB0aW9uS2V5U2l6ZSk7Ci0KLSAgc3RkOjpzdHJpbmcgY291bnRlcl9ibG9jayhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihpdiksIGl2X3NpemUpOwotICBjb3VudGVyX2Jsb2NrLmFwcGVuZChEZWNyeXB0Q29uZmlnOjprRGVjcnlwdGlvbktleVNpemUgLSBpdl9zaXplLCAwKTsKLSAgcmV0dXJuIGNvdW50ZXJfYmxvY2s7Ci19Ci0KLS8vIENyZWF0ZXMgYSBXZWJNIGVuY3J5cHRlZCBidWZmZXIgdGhhdCB0aGUgZGVtdXhlciB3b3VsZCBwYXNzIHRvIHRoZQotLy8gZGVjcnlwdG9yLiB8ZGF0YXwgaXMgdGhlIHBheWxvYWQgb2YgYSBXZWJNIGVuY3J5cHRlZCBCbG9jay4gfGtleV9pZHwgaXMKLS8vIGluaXRpYWxpemF0aW9uIGRhdGEgZnJvbSB0aGUgV2ViTSBmaWxlLiBFdmVyeSBlbmNyeXB0ZWQgQmxvY2sgaGFzCi0vLyBhIHNpZ25hbCBieXRlIHByZXBlbmRlZCB0byBhIGZyYW1lLiBJZiB0aGUgZnJhbWUgaXMgZW5jcnlwdGVkIHRoZW4gYW4gSVYgaXMKLS8vIHByZXBlbmRlZCB0byB0aGUgQmxvY2suIEN1cnJlbnQgZW5jcnlwdGVkIFdlYk0gcmVxdWVzdCBmb3IgY29tbWVudHMKLS8vIHNwZWNpZmljYXRpb24gaXMgaGVyZQotLy8gaHR0cDovL3dpa2kud2VibXByb2plY3Qub3JnL2VuY3J5cHRpb24vd2VibS1lbmNyeXB0aW9uLXJmYwotc3RhdGljIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gQ3JlYXRlV2ViTUVuY3J5cHRlZEJ1ZmZlcigKLSAgICBjb25zdCB1aW50OCogZGF0YSwgaW50IGRhdGFfc2l6ZSwKLSAgICBjb25zdCB1aW50OCoga2V5X2lkLCBpbnQga2V5X2lkX3NpemUpIHsKLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBlbmNyeXB0ZWRfYnVmZmVyID0gRGVjb2RlckJ1ZmZlcjo6Q29weUZyb20oCi0gICAgICBkYXRhLCBkYXRhX3NpemUpOwotICBDSEVDSyhlbmNyeXB0ZWRfYnVmZmVyKTsKLSAgRENIRUNLX0VRKGtXZWJNU2lnbmFsQnl0ZVNpemUsIDEpOwotCi0gIHVpbnQ4IHNpZ25hbF9ieXRlID0gZGF0YVswXTsKLSAgaW50IGRhdGFfb2Zmc2V0ID0ga1dlYk1TaWduYWxCeXRlU2l6ZTsKLQotICAvLyBTZXR0aW5nIHRoZSBEZWNyeXB0Q29uZmlnIG9iamVjdCBvZiB0aGUgYnVmZmVyIHdoaWxlIGxlYXZpbmcgdGhlCi0gIC8vIGluaXRpYWxpemF0aW9uIHZlY3RvciBlbXB0eSB3aWxsIHRlbGwgdGhlIGRlY3J5cHRvciB0aGF0IHRoZSBmcmFtZSBpcwotICAvLyB1bmVuY3J5cHRlZC4KLSAgc3RkOjpzdHJpbmcgY291bnRlcl9ibG9ja19zdHI7Ci0KLSAgaWYgKHNpZ25hbF9ieXRlICYga1dlYk1GbGFnRW5jcnlwdGVkRnJhbWUpIHsKLSAgICBjb3VudGVyX2Jsb2NrX3N0ciA9IEdlbmVyYXRlQ291bnRlckJsb2NrKGRhdGEgKyBkYXRhX29mZnNldCwga1dlYk1JdlNpemUpOwotICAgIGRhdGFfb2Zmc2V0ICs9IGtXZWJNSXZTaXplOwotICB9Ci0KLSAgZW5jcnlwdGVkX2J1ZmZlci0+U2V0RGVjcnlwdENvbmZpZygKLSAgICAgIHNjb3BlZF9wdHI8RGVjcnlwdENvbmZpZz4obmV3IERlY3J5cHRDb25maWcoCi0gICAgICAgICAgc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oa2V5X2lkKSwga2V5X2lkX3NpemUpLAotICAgICAgICAgIGNvdW50ZXJfYmxvY2tfc3RyLAotICAgICAgICAgIGRhdGFfb2Zmc2V0LAotICAgICAgICAgIHN0ZDo6dmVjdG9yPFN1YnNhbXBsZUVudHJ5PigpKSkpOwotICByZXR1cm4gZW5jcnlwdGVkX2J1ZmZlcjsKLX0KLQotc3RhdGljIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gQ3JlYXRlU3Vic2FtcGxlRW5jcnlwdGVkQnVmZmVyKAotICAgIGNvbnN0IHVpbnQ4KiBkYXRhLCBpbnQgZGF0YV9zaXplLAotICAgIGNvbnN0IHVpbnQ4KiBrZXlfaWQsIGludCBrZXlfaWRfc2l6ZSwKLSAgICBjb25zdCB1aW50OCogaXYsIGludCBpdl9zaXplLAotICAgIGludCBkYXRhX29mZnNldCwKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxTdWJzYW1wbGVFbnRyeT4mIHN1YnNhbXBsZV9lbnRyaWVzKSB7Ci0gIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gZW5jcnlwdGVkX2J1ZmZlciA9Ci0gICAgICBEZWNvZGVyQnVmZmVyOjpDb3B5RnJvbShkYXRhLCBkYXRhX3NpemUpOwotICBDSEVDSyhlbmNyeXB0ZWRfYnVmZmVyKTsKLSAgZW5jcnlwdGVkX2J1ZmZlci0+U2V0RGVjcnlwdENvbmZpZygKLSAgICAgIHNjb3BlZF9wdHI8RGVjcnlwdENvbmZpZz4obmV3IERlY3J5cHRDb25maWcoCi0gICAgICAgICAgc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oa2V5X2lkKSwga2V5X2lkX3NpemUpLAotICAgICAgICAgIHN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGl2KSwgaXZfc2l6ZSksCi0gICAgICAgICAgZGF0YV9vZmZzZXQsCi0gICAgICAgICAgc3Vic2FtcGxlX2VudHJpZXMpKSk7Ci0gIHJldHVybiBlbmNyeXB0ZWRfYnVmZmVyOwotfQotCi1jbGFzcyBBZXNEZWNyeXB0b3JUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgQWVzRGVjcnlwdG9yVGVzdCgpCi0gICAgICA6IGRlY3J5cHRvcl8oJmNsaWVudF8pLAotICAgICAgICBkZWNyeXB0X2NiXyhiYXNlOjpCaW5kKCZBZXNEZWNyeXB0b3JUZXN0OjpCdWZmZXJEZWNyeXB0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpLAotICAgICAgICBzdWJzYW1wbGVfZW50cmllc18oa1N1YnNhbXBsZUVudHJpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBrU3Vic2FtcGxlRW50cmllcyArIGFycmF5c2l6ZShrU3Vic2FtcGxlRW50cmllcykpIHsKLSAgfQotCi0gcHJvdGVjdGVkOgotICB2b2lkIEdlbmVyYXRlS2V5UmVxdWVzdChjb25zdCB1aW50OCoga2V5X2lkLCBpbnQga2V5X2lkX3NpemUpIHsKLSAgICBzdGQ6OnN0cmluZyBrZXlfaWRfc3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGtleV9pZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfaWRfc2l6ZSk7Ci0gICAgRVhQRUNUX0NBTEwoY2xpZW50XywgS2V5TWVzc2FnZShrQ2xlYXJLZXlTeXN0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJOZSgiIiksIFN0ckVxKGtleV9pZF9zdHJpbmcpLCAiIikpCi0gICAgICAgIC5XaWxsT25jZShTYXZlQXJnPDE+KCZzZXNzaW9uX2lkX3N0cmluZ18pKTsKLSAgICBFWFBFQ1RfVFJVRShkZWNyeXB0b3JfLkdlbmVyYXRlS2V5UmVxdWVzdChrQ2xlYXJLZXlTeXN0ZW0sICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9pZCwga2V5X2lkX3NpemUpKTsKLSAgfQotCi0gIHZvaWQgQWRkS2V5QW5kRXhwZWN0VG9TdWNjZWVkKGNvbnN0IHVpbnQ4KiBrZXlfaWQsIGludCBrZXlfaWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIGtleSwgaW50IGtleV9zaXplKSB7Ci0gICAgRVhQRUNUX0NBTEwoY2xpZW50XywgS2V5QWRkZWQoa0NsZWFyS2V5U3lzdGVtLCBzZXNzaW9uX2lkX3N0cmluZ18pKTsKLSAgICBkZWNyeXB0b3JfLkFkZEtleShrQ2xlYXJLZXlTeXN0ZW0sIGtleSwga2V5X3NpemUsIGtleV9pZCwga2V5X2lkX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbl9pZF9zdHJpbmdfKTsKLSAgfQotCi0gIHZvaWQgQWRkS2V5QW5kRXhwZWN0VG9GYWlsKGNvbnN0IHVpbnQ4KiBrZXlfaWQsIGludCBrZXlfaWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIGtleSwgaW50IGtleV9zaXplKSB7Ci0gICAgRVhQRUNUX0NBTEwoY2xpZW50XywgS2V5RXJyb3Ioa0NsZWFyS2V5U3lzdGVtLCBzZXNzaW9uX2lkX3N0cmluZ18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdG9yOjprVW5rbm93bkVycm9yLCAwKSk7Ci0gICAgZGVjcnlwdG9yXy5BZGRLZXkoa0NsZWFyS2V5U3lzdGVtLCBrZXksIGtleV9zaXplLCBrZXlfaWQsIGtleV9pZF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25faWRfc3RyaW5nXyk7Ci0gIH0KLQotICBNT0NLX01FVEhPRDIoQnVmZmVyRGVjcnlwdGVkLCB2b2lkKERlY3J5cHRvcjo6U3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mKSk7Ci0KLSAgdm9pZCBEZWNyeXB0QW5kRXhwZWN0VG9TdWNjZWVkKGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGVuY3J5cHRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBwbGFpbl90ZXh0LCBpbnQgcGxhaW5fdGV4dF9zaXplKSB7Ci0gICAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBkZWNyeXB0ZWQ7Ci0gICAgRVhQRUNUX0NBTEwoKnRoaXMsIEJ1ZmZlckRlY3J5cHRlZChBZXNEZWNyeXB0b3I6OmtTdWNjZXNzLCBOb3ROdWxsKCkpKQotICAgICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwxPigmZGVjcnlwdGVkKSk7Ci0KLSAgICBkZWNyeXB0b3JfLkRlY3J5cHQoRGVjcnlwdG9yOjprVmlkZW8sIGVuY3J5cHRlZCwgZGVjcnlwdF9jYl8pOwotICAgIEFTU0VSVF9UUlVFKGRlY3J5cHRlZCk7Ci0gICAgQVNTRVJUX0VRKHBsYWluX3RleHRfc2l6ZSwgZGVjcnlwdGVkLT5HZXREYXRhU2l6ZSgpKTsKLSAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKHBsYWluX3RleHQsIGRlY3J5cHRlZC0+R2V0RGF0YSgpLCBwbGFpbl90ZXh0X3NpemUpKTsKLSAgfQotCi0gIHZvaWQgRGVjcnlwdEFuZEV4cGVjdERhdGFNaXNtYXRjaCgKLSAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgZW5jcnlwdGVkLAotICAgICAgICBjb25zdCB1aW50OCogcGxhaW5fdGV4dCwgaW50IHBsYWluX3RleHRfc2l6ZSkgewotICAgIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gZGVjcnlwdGVkOwotICAgIEVYUEVDVF9DQUxMKCp0aGlzLCBCdWZmZXJEZWNyeXB0ZWQoQWVzRGVjcnlwdG9yOjprU3VjY2VzcywgTm90TnVsbCgpKSkKLSAgICAgICAgLldpbGxPbmNlKFNhdmVBcmc8MT4oJmRlY3J5cHRlZCkpOwotCi0gICAgZGVjcnlwdG9yXy5EZWNyeXB0KERlY3J5cHRvcjo6a1ZpZGVvLCBlbmNyeXB0ZWQsIGRlY3J5cHRfY2JfKTsKLSAgICBBU1NFUlRfVFJVRShkZWNyeXB0ZWQpOwotICAgIEFTU0VSVF9FUShwbGFpbl90ZXh0X3NpemUsIGRlY3J5cHRlZC0+R2V0RGF0YVNpemUoKSk7Ci0gICAgRVhQRUNUX05FKDAsIG1lbWNtcChwbGFpbl90ZXh0LCBkZWNyeXB0ZWQtPkdldERhdGEoKSwgcGxhaW5fdGV4dF9zaXplKSk7Ci0gIH0KLQotICB2b2lkIERlY3J5cHRBbmRFeHBlY3RTaXplRGF0YU1pc21hdGNoKAotICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBlbmNyeXB0ZWQsCi0gICAgICAgIGNvbnN0IHVpbnQ4KiBwbGFpbl90ZXh0LCBpbnQgcGxhaW5fdGV4dF9zaXplKSB7Ci0gICAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBkZWNyeXB0ZWQ7Ci0gICAgRVhQRUNUX0NBTEwoKnRoaXMsIEJ1ZmZlckRlY3J5cHRlZChBZXNEZWNyeXB0b3I6OmtTdWNjZXNzLCBOb3ROdWxsKCkpKQotICAgICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwxPigmZGVjcnlwdGVkKSk7Ci0KLSAgICBkZWNyeXB0b3JfLkRlY3J5cHQoRGVjcnlwdG9yOjprVmlkZW8sIGVuY3J5cHRlZCwgZGVjcnlwdF9jYl8pOwotICAgIEFTU0VSVF9UUlVFKGRlY3J5cHRlZCk7Ci0gICAgRVhQRUNUX05FKHBsYWluX3RleHRfc2l6ZSwgZGVjcnlwdGVkLT5HZXREYXRhU2l6ZSgpKTsKLSAgICBFWFBFQ1RfTkUoMCwgbWVtY21wKHBsYWluX3RleHQsIGRlY3J5cHRlZC0+R2V0RGF0YSgpLCBwbGFpbl90ZXh0X3NpemUpKTsKLSAgfQotCi0gIHZvaWQgRGVjcnlwdEFuZEV4cGVjdFRvRmFpbChjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBlbmNyeXB0ZWQpIHsKLSAgICBFWFBFQ1RfQ0FMTCgqdGhpcywgQnVmZmVyRGVjcnlwdGVkKEFlc0RlY3J5cHRvcjo6a0Vycm9yLCBJc051bGwoKSkpOwotICAgIGRlY3J5cHRvcl8uRGVjcnlwdChEZWNyeXB0b3I6OmtWaWRlbywgZW5jcnlwdGVkLCBkZWNyeXB0X2NiXyk7Ci0gIH0KLQotICBNb2NrRGVjcnlwdG9yQ2xpZW50IGNsaWVudF87Ci0gIEFlc0RlY3J5cHRvciBkZWNyeXB0b3JfOwotICBzdGQ6OnN0cmluZyBzZXNzaW9uX2lkX3N0cmluZ187Ci0gIEFlc0RlY3J5cHRvcjo6RGVjcnlwdENCIGRlY3J5cHRfY2JfOwotICBzdGQ6OnZlY3RvcjxTdWJzYW1wbGVFbnRyeT4gc3Vic2FtcGxlX2VudHJpZXNfOwotfTsKLQotVEVTVF9GKEFlc0RlY3J5cHRvclRlc3QsIEdlbmVyYXRlS2V5UmVxdWVzdFdpdGhOdWxsSW5pdERhdGEpIHsKLSAgRVhQRUNUX0NBTEwoY2xpZW50XywgS2V5TWVzc2FnZShrQ2xlYXJLZXlTeXN0ZW0sIFN0ck5lKCIiKSwgIiIsICIiKSk7Ci0gIEVYUEVDVF9UUlVFKGRlY3J5cHRvcl8uR2VuZXJhdGVLZXlSZXF1ZXN0KGtDbGVhcktleVN5c3RlbSwgIiIsIE5VTEwsIDApKTsKLX0KLQotVEVTVF9GKEFlc0RlY3J5cHRvclRlc3QsIE5vcm1hbFdlYk1EZWNyeXB0aW9uKSB7Ci0gIGNvbnN0IFdlYm1FbmNyeXB0ZWREYXRhJiBmcmFtZSA9IGtXZWJtRW5jcnlwdGVkRnJhbWVzWzBdOwotICBHZW5lcmF0ZUtleVJlcXVlc3QoZnJhbWUua2V5X2lkLCBmcmFtZS5rZXlfaWRfc2l6ZSk7Ci0gIEFkZEtleUFuZEV4cGVjdFRvU3VjY2VlZChmcmFtZS5rZXlfaWQsIGZyYW1lLmtleV9pZF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUua2V5LCBmcmFtZS5rZXlfc2l6ZSk7Ci0gIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gZW5jcnlwdGVkX2RhdGEgPQotICAgICAgQ3JlYXRlV2ViTUVuY3J5cHRlZEJ1ZmZlcihmcmFtZS5lbmNyeXB0ZWRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuZW5jcnlwdGVkX2RhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUua2V5X2lkLCBmcmFtZS5rZXlfaWRfc2l6ZSk7Ci0gIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKERlY3J5cHRBbmRFeHBlY3RUb1N1Y2NlZWQoZW5jcnlwdGVkX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUucGxhaW5fdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5wbGFpbl90ZXh0X3NpemUpKTsKLX0KLQotVEVTVF9GKEFlc0RlY3J5cHRvclRlc3QsIFVuZW5jcnlwdGVkRnJhbWVXZWJNRGVjcnlwdGlvbikgewotICBjb25zdCBXZWJtRW5jcnlwdGVkRGF0YSYgZnJhbWUgPSBrV2VibUVuY3J5cHRlZEZyYW1lc1szXTsKLSAgR2VuZXJhdGVLZXlSZXF1ZXN0KGZyYW1lLmtleV9pZCwgZnJhbWUua2V5X2lkX3NpemUpOwotICBBZGRLZXlBbmRFeHBlY3RUb1N1Y2NlZWQoZnJhbWUua2V5X2lkLCBmcmFtZS5rZXlfaWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLmtleSwgZnJhbWUua2V5X3NpemUpOwotICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGVuY3J5cHRlZF9kYXRhID0KLSAgICAgIENyZWF0ZVdlYk1FbmNyeXB0ZWRCdWZmZXIoZnJhbWUuZW5jcnlwdGVkX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLmVuY3J5cHRlZF9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLmtleV9pZCwgZnJhbWUua2V5X2lkX3NpemUpOwotICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShEZWNyeXB0QW5kRXhwZWN0VG9TdWNjZWVkKGVuY3J5cHRlZF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLnBsYWluX3RleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUucGxhaW5fdGV4dF9zaXplKSk7Ci19Ci0KLVRFU1RfRihBZXNEZWNyeXB0b3JUZXN0LCBXcm9uZ0tleSkgewotICBjb25zdCBXZWJtRW5jcnlwdGVkRGF0YSYgZnJhbWUgPSBrV2VibUVuY3J5cHRlZEZyYW1lc1swXTsKLSAgR2VuZXJhdGVLZXlSZXF1ZXN0KGZyYW1lLmtleV9pZCwgZnJhbWUua2V5X2lkX3NpemUpOwotCi0gIC8vIENoYW5nZSB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUga2V5LgotICBzdGQ6OnZlY3Rvcjx1aW50OD4gd3Jvbmdfa2V5KGZyYW1lLmtleSwgZnJhbWUua2V5ICsgZnJhbWUua2V5X3NpemUpOwotICB3cm9uZ19rZXlbMF0rKzsKLQotICBBZGRLZXlBbmRFeHBlY3RUb1N1Y2NlZWQoZnJhbWUua2V5X2lkLCBmcmFtZS5rZXlfaWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3cm9uZ19rZXlbMF0sIGZyYW1lLmtleV9zaXplKTsKLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBlbmNyeXB0ZWRfZGF0YSA9Ci0gICAgICBDcmVhdGVXZWJNRW5jcnlwdGVkQnVmZmVyKGZyYW1lLmVuY3J5cHRlZF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5lbmNyeXB0ZWRfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5rZXlfaWQsIGZyYW1lLmtleV9pZF9zaXplKTsKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoRGVjcnlwdEFuZEV4cGVjdERhdGFNaXNtYXRjaChlbmNyeXB0ZWRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5wbGFpbl90ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLnBsYWluX3RleHRfc2l6ZSkpOwotfQotCi1URVNUX0YoQWVzRGVjcnlwdG9yVGVzdCwgTm9LZXkpIHsKLSAgY29uc3QgV2VibUVuY3J5cHRlZERhdGEmIGZyYW1lID0ga1dlYm1FbmNyeXB0ZWRGcmFtZXNbMF07Ci0gIEdlbmVyYXRlS2V5UmVxdWVzdChmcmFtZS5rZXlfaWQsIGZyYW1lLmtleV9pZF9zaXplKTsKLQotICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGVuY3J5cHRlZF9kYXRhID0KLSAgICAgIENyZWF0ZVdlYk1FbmNyeXB0ZWRCdWZmZXIoZnJhbWUuZW5jcnlwdGVkX2RhdGEsIGZyYW1lLmVuY3J5cHRlZF9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLmtleV9pZCwgZnJhbWUua2V5X2lkX3NpemUpOwotICBFWFBFQ1RfQ0FMTCgqdGhpcywgQnVmZmVyRGVjcnlwdGVkKEFlc0RlY3J5cHRvcjo6a05vS2V5LCBJc051bGwoKSkpOwotICBkZWNyeXB0b3JfLkRlY3J5cHQoRGVjcnlwdG9yOjprVmlkZW8sIGVuY3J5cHRlZF9kYXRhLCBkZWNyeXB0X2NiXyk7Ci19Ci0KLVRFU1RfRihBZXNEZWNyeXB0b3JUZXN0LCBLZXlSZXBsYWNlbWVudCkgewotICBjb25zdCBXZWJtRW5jcnlwdGVkRGF0YSYgZnJhbWUgPSBrV2VibUVuY3J5cHRlZEZyYW1lc1swXTsKLSAgR2VuZXJhdGVLZXlSZXF1ZXN0KGZyYW1lLmtleV9pZCwgZnJhbWUua2V5X2lkX3NpemUpOwotCi0gIC8vIENoYW5nZSB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUga2V5LgotICBzdGQ6OnZlY3Rvcjx1aW50OD4gd3Jvbmdfa2V5KGZyYW1lLmtleSwgZnJhbWUua2V5ICsgZnJhbWUua2V5X3NpemUpOwotICB3cm9uZ19rZXlbMF0rKzsKLQotICBBZGRLZXlBbmRFeHBlY3RUb1N1Y2NlZWQoZnJhbWUua2V5X2lkLCBmcmFtZS5rZXlfaWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3cm9uZ19rZXlbMF0sIGZyYW1lLmtleV9zaXplKTsKLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBlbmNyeXB0ZWRfZGF0YSA9Ci0gICAgICBDcmVhdGVXZWJNRW5jcnlwdGVkQnVmZmVyKGZyYW1lLmVuY3J5cHRlZF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5lbmNyeXB0ZWRfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5rZXlfaWQsIGZyYW1lLmtleV9pZF9zaXplKTsKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoRGVjcnlwdEFuZEV4cGVjdERhdGFNaXNtYXRjaChlbmNyeXB0ZWRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5wbGFpbl90ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLnBsYWluX3RleHRfc2l6ZSkpOwotICBBZGRLZXlBbmRFeHBlY3RUb1N1Y2NlZWQoZnJhbWUua2V5X2lkLCBmcmFtZS5rZXlfaWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLmtleSwgZnJhbWUua2V5X3NpemUpOwotICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShEZWNyeXB0QW5kRXhwZWN0VG9TdWNjZWVkKGVuY3J5cHRlZF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLnBsYWluX3RleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUucGxhaW5fdGV4dF9zaXplKSk7Ci19Ci0KLVRFU1RfRihBZXNEZWNyeXB0b3JUZXN0LCBXcm9uZ1NpemVkS2V5KSB7Ci0gIGNvbnN0IFdlYm1FbmNyeXB0ZWREYXRhJiBmcmFtZSA9IGtXZWJtRW5jcnlwdGVkRnJhbWVzWzBdOwotICBHZW5lcmF0ZUtleVJlcXVlc3QoZnJhbWUua2V5X2lkLCBmcmFtZS5rZXlfaWRfc2l6ZSk7Ci0gIEFkZEtleUFuZEV4cGVjdFRvRmFpbChmcmFtZS5rZXlfaWQsIGZyYW1lLmtleV9pZF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAga1dlYm1Xcm9uZ1NpemVkS2V5LCBhcnJheXNpemUoa1dlYm1Xcm9uZ1NpemVkS2V5KSk7Ci19Ci0KLVRFU1RfRihBZXNEZWNyeXB0b3JUZXN0LCBNdWx0aXBsZUtleXNBbmRGcmFtZXMpIHsKLSAgY29uc3QgV2VibUVuY3J5cHRlZERhdGEmIGZyYW1lID0ga1dlYm1FbmNyeXB0ZWRGcmFtZXNbMF07Ci0gIEdlbmVyYXRlS2V5UmVxdWVzdChmcmFtZS5rZXlfaWQsIGZyYW1lLmtleV9pZF9zaXplKTsKLSAgQWRkS2V5QW5kRXhwZWN0VG9TdWNjZWVkKGZyYW1lLmtleV9pZCwgZnJhbWUua2V5X2lkX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5rZXksIGZyYW1lLmtleV9zaXplKTsKLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBlbmNyeXB0ZWRfZGF0YSA9Ci0gICAgICBDcmVhdGVXZWJNRW5jcnlwdGVkQnVmZmVyKGZyYW1lLmVuY3J5cHRlZF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5lbmNyeXB0ZWRfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5rZXlfaWQsIGZyYW1lLmtleV9pZF9zaXplKTsKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoRGVjcnlwdEFuZEV4cGVjdFRvU3VjY2VlZChlbmNyeXB0ZWRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5wbGFpbl90ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLnBsYWluX3RleHRfc2l6ZSkpOwotCi0gIGNvbnN0IFdlYm1FbmNyeXB0ZWREYXRhJiBmcmFtZTIgPSBrV2VibUVuY3J5cHRlZEZyYW1lc1syXTsKLSAgR2VuZXJhdGVLZXlSZXF1ZXN0KGZyYW1lMi5rZXlfaWQsIGZyYW1lMi5rZXlfaWRfc2l6ZSk7Ci0gIEFkZEtleUFuZEV4cGVjdFRvU3VjY2VlZChmcmFtZTIua2V5X2lkLCBmcmFtZTIua2V5X2lkX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZTIua2V5LCBmcmFtZTIua2V5X3NpemUpOwotCi0gIGNvbnN0IFdlYm1FbmNyeXB0ZWREYXRhJiBmcmFtZTEgPSBrV2VibUVuY3J5cHRlZEZyYW1lc1sxXTsKLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBlbmNyeXB0ZWRfZGF0YTEgPQotICAgICAgQ3JlYXRlV2ViTUVuY3J5cHRlZEJ1ZmZlcihmcmFtZTEuZW5jcnlwdGVkX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lMS5lbmNyeXB0ZWRfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZTEua2V5X2lkLCBmcmFtZTEua2V5X2lkX3NpemUpOwotICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShEZWNyeXB0QW5kRXhwZWN0VG9TdWNjZWVkKGVuY3J5cHRlZF9kYXRhMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZTEucGxhaW5fdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZTEucGxhaW5fdGV4dF9zaXplKSk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBlbmNyeXB0ZWRfZGF0YTIgPQotICAgICAgQ3JlYXRlV2ViTUVuY3J5cHRlZEJ1ZmZlcihmcmFtZTIuZW5jcnlwdGVkX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lMi5lbmNyeXB0ZWRfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZTIua2V5X2lkLCBmcmFtZTIua2V5X2lkX3NpemUpOwotICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShEZWNyeXB0QW5kRXhwZWN0VG9TdWNjZWVkKGVuY3J5cHRlZF9kYXRhMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZTIucGxhaW5fdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZTIucGxhaW5fdGV4dF9zaXplKSk7Ci19Ci0KLVRFU1RfRihBZXNEZWNyeXB0b3JUZXN0LCBDb3JydXB0ZWRJdikgewotICBjb25zdCBXZWJtRW5jcnlwdGVkRGF0YSYgZnJhbWUgPSBrV2VibUVuY3J5cHRlZEZyYW1lc1swXTsKLSAgR2VuZXJhdGVLZXlSZXF1ZXN0KGZyYW1lLmtleV9pZCwgZnJhbWUua2V5X2lkX3NpemUpOwotICBBZGRLZXlBbmRFeHBlY3RUb1N1Y2NlZWQoZnJhbWUua2V5X2lkLCBmcmFtZS5rZXlfaWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLmtleSwgZnJhbWUua2V5X3NpemUpOwotCi0gIC8vIENoYW5nZSBieXRlIDEzIHRvIG1vZGlmeSB0aGUgSVYuIEJ5dGVzIDEzLTIwIG9mIFdlYk0gZW5jcnlwdGVkIGRhdGEKLSAgLy8gY29udGFpbnMgdGhlIElWLgotICBzdGQ6OnZlY3Rvcjx1aW50OD4gZnJhbWVfd2l0aF9iYWRfaXYoCi0gICAgICBmcmFtZS5lbmNyeXB0ZWRfZGF0YSwgZnJhbWUuZW5jcnlwdGVkX2RhdGEgKyBmcmFtZS5lbmNyeXB0ZWRfZGF0YV9zaXplKTsKLSAgZnJhbWVfd2l0aF9iYWRfaXZbMV0rKzsKLQotICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGVuY3J5cHRlZF9kYXRhID0KLSAgICAgIENyZWF0ZVdlYk1FbmNyeXB0ZWRCdWZmZXIoJmZyYW1lX3dpdGhfYmFkX2l2WzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5lbmNyeXB0ZWRfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5rZXlfaWQsIGZyYW1lLmtleV9pZF9zaXplKTsKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoRGVjcnlwdEFuZEV4cGVjdERhdGFNaXNtYXRjaChlbmNyeXB0ZWRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5wbGFpbl90ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLnBsYWluX3RleHRfc2l6ZSkpOwotfQotCi1URVNUX0YoQWVzRGVjcnlwdG9yVGVzdCwgQ29ycnVwdGVkRGF0YSkgewotICBjb25zdCBXZWJtRW5jcnlwdGVkRGF0YSYgZnJhbWUgPSBrV2VibUVuY3J5cHRlZEZyYW1lc1swXTsKLSAgR2VuZXJhdGVLZXlSZXF1ZXN0KGZyYW1lLmtleV9pZCwgZnJhbWUua2V5X2lkX3NpemUpOwotICBBZGRLZXlBbmRFeHBlY3RUb1N1Y2NlZWQoZnJhbWUua2V5X2lkLCBmcmFtZS5rZXlfaWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLmtleSwgZnJhbWUua2V5X3NpemUpOwotCi0gIC8vIENoYW5nZSBsYXN0IGJ5dGUgdG8gbW9kaWZ5IHRoZSBkYXRhLiBCeXRlcyAyMSsgb2YgV2ViTSBlbmNyeXB0ZWQgZGF0YQotICAvLyBjb250YWlucyB0aGUgZW5jcnlwdGVkIGZyYW1lLgotICBzdGQ6OnZlY3Rvcjx1aW50OD4gZnJhbWVfd2l0aF9iYWRfdnA4X2RhdGEoCi0gICAgICBmcmFtZS5lbmNyeXB0ZWRfZGF0YSwgZnJhbWUuZW5jcnlwdGVkX2RhdGEgKyBmcmFtZS5lbmNyeXB0ZWRfZGF0YV9zaXplKTsKLSAgZnJhbWVfd2l0aF9iYWRfdnA4X2RhdGFbZnJhbWUuZW5jcnlwdGVkX2RhdGFfc2l6ZSAtIDFdKys7Ci0KLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBlbmNyeXB0ZWRfZGF0YSA9Ci0gICAgICBDcmVhdGVXZWJNRW5jcnlwdGVkQnVmZmVyKCZmcmFtZV93aXRoX2JhZF92cDhfZGF0YVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuZW5jcnlwdGVkX2RhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUua2V5X2lkLCBmcmFtZS5rZXlfaWRfc2l6ZSk7Ci0gIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKERlY3J5cHRBbmRFeHBlY3REYXRhTWlzbWF0Y2goZW5jcnlwdGVkX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUucGxhaW5fdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5wbGFpbl90ZXh0X3NpemUpKTsKLX0KLQotVEVTVF9GKEFlc0RlY3J5cHRvclRlc3QsIEVuY3J5cHRlZEFzVW5lbmNyeXB0ZWRGYWlsdXJlKSB7Ci0gIGNvbnN0IFdlYm1FbmNyeXB0ZWREYXRhJiBmcmFtZSA9IGtXZWJtRW5jcnlwdGVkRnJhbWVzWzBdOwotICBHZW5lcmF0ZUtleVJlcXVlc3QoZnJhbWUua2V5X2lkLCBmcmFtZS5rZXlfaWRfc2l6ZSk7Ci0gIEFkZEtleUFuZEV4cGVjdFRvU3VjY2VlZChmcmFtZS5rZXlfaWQsIGZyYW1lLmtleV9pZF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUua2V5LCBmcmFtZS5rZXlfc2l6ZSk7Ci0KLSAgLy8gQ2hhbmdlIHNpZ25hbCBieXRlIGZyb20gYW4gZW5jcnlwdGVkIGZyYW1lIHRvIGFuIHVuZW5jcnlwdGVkIGZyYW1lLiBCeXRlCi0gIC8vIDEyIG9mIFdlYk0gZW5jcnlwdGVkIGRhdGEgY29udGFpbnMgdGhlIHNpZ25hbCBieXRlLgotICBzdGQ6OnZlY3Rvcjx1aW50OD4gZnJhbWVfd2l0aF93cm9uZ19zaWduYWxfYnl0ZSgKLSAgICAgIGZyYW1lLmVuY3J5cHRlZF9kYXRhLCBmcmFtZS5lbmNyeXB0ZWRfZGF0YSArIGZyYW1lLmVuY3J5cHRlZF9kYXRhX3NpemUpOwotICBmcmFtZV93aXRoX3dyb25nX3NpZ25hbF9ieXRlWzBdID0gMDsKLQotICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGVuY3J5cHRlZF9kYXRhID0KLSAgICAgIENyZWF0ZVdlYk1FbmNyeXB0ZWRCdWZmZXIoJmZyYW1lX3dpdGhfd3Jvbmdfc2lnbmFsX2J5dGVbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLmVuY3J5cHRlZF9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLmtleV9pZCwgZnJhbWUua2V5X2lkX3NpemUpOwotICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKLSAgICAgIERlY3J5cHRBbmRFeHBlY3RTaXplRGF0YU1pc21hdGNoKGVuY3J5cHRlZF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUucGxhaW5fdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLnBsYWluX3RleHRfc2l6ZSkpOwotfQotCi1URVNUX0YoQWVzRGVjcnlwdG9yVGVzdCwgVW5lbmNyeXB0ZWRBc0VuY3J5cHRlZEZhaWx1cmUpIHsKLSAgY29uc3QgV2VibUVuY3J5cHRlZERhdGEmIGZyYW1lID0ga1dlYm1FbmNyeXB0ZWRGcmFtZXNbM107Ci0gIEdlbmVyYXRlS2V5UmVxdWVzdChmcmFtZS5rZXlfaWQsIGZyYW1lLmtleV9pZF9zaXplKTsKLSAgQWRkS2V5QW5kRXhwZWN0VG9TdWNjZWVkKGZyYW1lLmtleV9pZCwgZnJhbWUua2V5X2lkX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5rZXksIGZyYW1lLmtleV9zaXplKTsKLQotICAvLyBDaGFuZ2Ugc2lnbmFsIGJ5dGUgZnJvbSBhbiB1bmVuY3J5cHRlZCBmcmFtZSB0byBhbiBlbmNyeXB0ZWQgZnJhbWUuIEJ5dGUKLSAgLy8gMCBvZiBXZWJNIGVuY3J5cHRlZCBkYXRhIGNvbnRhaW5zIHRoZSBzaWduYWwgYnl0ZS4KLSAgc3RkOjp2ZWN0b3I8dWludDg+IGZyYW1lX3dpdGhfd3Jvbmdfc2lnbmFsX2J5dGUoCi0gICAgICBmcmFtZS5lbmNyeXB0ZWRfZGF0YSwgZnJhbWUuZW5jcnlwdGVkX2RhdGEgKyBmcmFtZS5lbmNyeXB0ZWRfZGF0YV9zaXplKTsKLSAgZnJhbWVfd2l0aF93cm9uZ19zaWduYWxfYnl0ZVswXSA9IGtXZWJNRmxhZ0VuY3J5cHRlZEZyYW1lOwotCi0gIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gZW5jcnlwdGVkX2RhdGEgPQotICAgICAgQ3JlYXRlV2ViTUVuY3J5cHRlZEJ1ZmZlcigmZnJhbWVfd2l0aF93cm9uZ19zaWduYWxfYnl0ZVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuZW5jcnlwdGVkX2RhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUua2V5X2lkLCBmcmFtZS5rZXlfaWRfc2l6ZSk7Ci0gIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAotICAgICAgRGVjcnlwdEFuZEV4cGVjdFNpemVEYXRhTWlzbWF0Y2goZW5jcnlwdGVkX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5wbGFpbl90ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUucGxhaW5fdGV4dF9zaXplKSk7Ci19Ci0KLVRFU1RfRihBZXNEZWNyeXB0b3JUZXN0LCBTdWJzYW1wbGVEZWNyeXB0aW9uKSB7Ci0gIEdlbmVyYXRlS2V5UmVxdWVzdChrU3Vic2FtcGxlS2V5SWQsIGFycmF5c2l6ZShrU3Vic2FtcGxlS2V5SWQpKTsKLSAgQWRkS2V5QW5kRXhwZWN0VG9TdWNjZWVkKGtTdWJzYW1wbGVLZXlJZCwgYXJyYXlzaXplKGtTdWJzYW1wbGVLZXlJZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBrU3Vic2FtcGxlS2V5LCBhcnJheXNpemUoa1N1YnNhbXBsZUtleSkpOwotICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGVuY3J5cHRlZF9kYXRhID0gQ3JlYXRlU3Vic2FtcGxlRW5jcnlwdGVkQnVmZmVyKAotICAgICAga1N1YnNhbXBsZURhdGEsIGFycmF5c2l6ZShrU3Vic2FtcGxlRGF0YSksCi0gICAgICBrU3Vic2FtcGxlS2V5SWQsIGFycmF5c2l6ZShrU3Vic2FtcGxlS2V5SWQpLAotICAgICAga1N1YnNhbXBsZUl2LCBhcnJheXNpemUoa1N1YnNhbXBsZUl2KSwKLSAgICAgIDAsCi0gICAgICBzdWJzYW1wbGVfZW50cmllc18pOwotICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShEZWNyeXB0QW5kRXhwZWN0VG9TdWNjZWVkKAotICAgICAgZW5jcnlwdGVkX2RhdGEsIGtTdWJzYW1wbGVPcmlnaW5hbERhdGEsIGtTdWJzYW1wbGVPcmlnaW5hbERhdGFTaXplKSk7Ci19Ci0KLS8vIEVuc3VyZXMgbm9uaW50ZXJmZXJlbmNlIG9mIGRhdGEgb2Zmc2V0IGFuZCBzdWJzYW1wbGUgbWVjaGFuaXNtcy4gV2UgbmV2ZXIKLS8vIGV4cGVjdCB0byBlbmNvdW50ZXIgdGhpcyBpbiB0aGUgd2lsZCwgYnV0IHNpbmNlIHRoZSBEZWNyeXB0Q29uZmlnIGRvZXNuJ3QKLS8vIGRpc2FsbG93IHN1Y2ggYSBjb25maWd1cmF0aW9uLCBpdCBzaG91bGQgYmUgY292ZXJlZC4KLVRFU1RfRihBZXNEZWNyeXB0b3JUZXN0LCBTdWJzYW1wbGVEZWNyeXB0aW9uV2l0aE9mZnNldCkgewotICBHZW5lcmF0ZUtleVJlcXVlc3Qoa1N1YnNhbXBsZUtleUlkLCBhcnJheXNpemUoa1N1YnNhbXBsZUtleUlkKSk7Ci0gIEFkZEtleUFuZEV4cGVjdFRvU3VjY2VlZChrU3Vic2FtcGxlS2V5SWQsIGFycmF5c2l6ZShrU3Vic2FtcGxlS2V5SWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAga1N1YnNhbXBsZUtleSwgYXJyYXlzaXplKGtTdWJzYW1wbGVLZXkpKTsKLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBlbmNyeXB0ZWRfZGF0YSA9IENyZWF0ZVN1YnNhbXBsZUVuY3J5cHRlZEJ1ZmZlcigKLSAgICAgIGtQYWRkZWRTdWJzYW1wbGVEYXRhLCBhcnJheXNpemUoa1BhZGRlZFN1YnNhbXBsZURhdGEpLAotICAgICAga1N1YnNhbXBsZUtleUlkLCBhcnJheXNpemUoa1N1YnNhbXBsZUtleUlkKSwKLSAgICAgIGtTdWJzYW1wbGVJdiwgYXJyYXlzaXplKGtTdWJzYW1wbGVJdiksCi0gICAgICBhcnJheXNpemUoa1BhZGRlZFN1YnNhbXBsZURhdGEpIC0gYXJyYXlzaXplKGtTdWJzYW1wbGVEYXRhKSwKLSAgICAgIHN1YnNhbXBsZV9lbnRyaWVzXyk7Ci0gIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKERlY3J5cHRBbmRFeHBlY3RUb1N1Y2NlZWQoCi0gICAgICBlbmNyeXB0ZWRfZGF0YSwga1N1YnNhbXBsZU9yaWdpbmFsRGF0YSwga1N1YnNhbXBsZU9yaWdpbmFsRGF0YVNpemUpKTsKLX0KLQotLy8gTm8gc3Vic2FtcGxlIG9yIG9mZnNldC4KLVRFU1RfRihBZXNEZWNyeXB0b3JUZXN0LCBOb3JtYWxEZWNyeXB0aW9uKSB7Ci0gIEdlbmVyYXRlS2V5UmVxdWVzdChrU3Vic2FtcGxlS2V5SWQsIGFycmF5c2l6ZShrU3Vic2FtcGxlS2V5SWQpKTsKLSAgQWRkS2V5QW5kRXhwZWN0VG9TdWNjZWVkKGtTdWJzYW1wbGVLZXlJZCwgYXJyYXlzaXplKGtTdWJzYW1wbGVLZXlJZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBrU3Vic2FtcGxlS2V5LCBhcnJheXNpemUoa1N1YnNhbXBsZUtleSkpOwotICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGVuY3J5cHRlZF9kYXRhID0gQ3JlYXRlU3Vic2FtcGxlRW5jcnlwdGVkQnVmZmVyKAotICAgICAga05vU3Vic2FtcGxlRGF0YSwgYXJyYXlzaXplKGtOb1N1YnNhbXBsZURhdGEpLAotICAgICAga1N1YnNhbXBsZUtleUlkLCBhcnJheXNpemUoa1N1YnNhbXBsZUtleUlkKSwKLSAgICAgIGtTdWJzYW1wbGVJdiwgYXJyYXlzaXplKGtTdWJzYW1wbGVJdiksCi0gICAgICAwLAotICAgICAgc3RkOjp2ZWN0b3I8U3Vic2FtcGxlRW50cnk+KCkpOwotICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShEZWNyeXB0QW5kRXhwZWN0VG9TdWNjZWVkKAotICAgICAgZW5jcnlwdGVkX2RhdGEsIGtTdWJzYW1wbGVPcmlnaW5hbERhdGEsIGtTdWJzYW1wbGVPcmlnaW5hbERhdGFTaXplKSk7Ci19Ci0KLVRFU1RfRihBZXNEZWNyeXB0b3JUZXN0LCBJbmNvcnJlY3RTdWJzYW1wbGVTaXplKSB7Ci0gIEdlbmVyYXRlS2V5UmVxdWVzdChrU3Vic2FtcGxlS2V5SWQsIGFycmF5c2l6ZShrU3Vic2FtcGxlS2V5SWQpKTsKLSAgQWRkS2V5QW5kRXhwZWN0VG9TdWNjZWVkKGtTdWJzYW1wbGVLZXlJZCwgYXJyYXlzaXplKGtTdWJzYW1wbGVLZXlJZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBrU3Vic2FtcGxlS2V5LCBhcnJheXNpemUoa1N1YnNhbXBsZUtleSkpOwotICBzdGQ6OnZlY3RvcjxTdWJzYW1wbGVFbnRyeT4gZW50cmllcyA9IHN1YnNhbXBsZV9lbnRyaWVzXzsKLSAgZW50cmllc1syXS5jeXBoZXJfYnl0ZXMgKz0gMTsKLQotICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGVuY3J5cHRlZF9kYXRhID0gQ3JlYXRlU3Vic2FtcGxlRW5jcnlwdGVkQnVmZmVyKAotICAgICAga1N1YnNhbXBsZURhdGEsIGFycmF5c2l6ZShrU3Vic2FtcGxlRGF0YSksCi0gICAgICBrU3Vic2FtcGxlS2V5SWQsIGFycmF5c2l6ZShrU3Vic2FtcGxlS2V5SWQpLAotICAgICAga1N1YnNhbXBsZUl2LCBhcnJheXNpemUoa1N1YnNhbXBsZUl2KSwKLSAgICAgIDAsCi0gICAgICBlbnRyaWVzKTsKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoRGVjcnlwdEFuZEV4cGVjdFRvRmFpbChlbmNyeXB0ZWRfZGF0YSkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9jcnlwdG8vc2hlbGxfZGVjcnlwdG9yX2ZhY3RvcnkuY2MgYi9zcmMvbWVkaWEvY3J5cHRvL3NoZWxsX2RlY3J5cHRvcl9mYWN0b3J5LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWFmNGQyLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9jcnlwdG8vc2hlbGxfZGVjcnlwdG9yX2ZhY3RvcnkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibWVkaWEvY3J5cHRvL3NoZWxsX2RlY3J5cHRvcl9mYWN0b3J5LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIHN0YXRpYwotU2hlbGxEZWNyeXB0b3JGYWN0b3J5OjpEZWNyeXB0b3JSZWdpc3RyeSBTaGVsbERlY3J5cHRvckZhY3Rvcnk6OnJlZ2lzdHJ5XzsKLQotLy8gc3RhdGljCi1ib29sIFNoZWxsRGVjcnlwdG9yRmFjdG9yeTo6U3VwcG9ydHMoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0pIHsKLSAgRGVjcnlwdG9yUmVnaXN0cnk6Oml0ZXJhdG9yIGl0ID0gcmVnaXN0cnlfLmZpbmQoa2V5X3N5c3RlbSk7Ci0gIHJldHVybiBpdCAhPSByZWdpc3RyeV8uZW5kKCk7Ci19Ci0KLS8vIHN0YXRpYwotRGVjcnlwdG9yKiBTaGVsbERlY3J5cHRvckZhY3Rvcnk6OkNyZWF0ZShjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdG9yQ2xpZW50KiBjbGllbnQpIHsKLSAgRGVjcnlwdG9yUmVnaXN0cnk6Oml0ZXJhdG9yIGl0ID0gcmVnaXN0cnlfLmZpbmQoa2V5X3N5c3RlbSk7Ci0gIGlmIChpdCA9PSByZWdpc3RyeV8uZW5kKCkpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gaXQtPnNlY29uZC5SdW4oY2xpZW50KTsKLX0KLQotLy8gc3RhdGljCi12b2lkIFNoZWxsRGVjcnlwdG9yRmFjdG9yeTo6UmVnaXN0ZXJEZWNyeXB0b3IoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3JlYXRlQ0ImIGNyZWF0ZV9jYikgewotICByZWdpc3RyeV9ba2V5X3N5c3RlbV0gPSBjcmVhdGVfY2I7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2NyeXB0by9zaGVsbF9kZWNyeXB0b3JfZmFjdG9yeS5oIGIvc3JjL21lZGlhL2NyeXB0by9zaGVsbF9kZWNyeXB0b3JfZmFjdG9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDg2NzdiLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9jcnlwdG8vc2hlbGxfZGVjcnlwdG9yX2ZhY3RvcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQ1JZUFRPX1NIRUxMX0RFQ1JZUFRPUl9GQUNUT1JZX0hfCi0jZGVmaW5lIE1FRElBX0NSWVBUT19TSEVMTF9ERUNSWVBUT1JfRkFDVE9SWV9IXwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVjcnlwdG9yLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNyeXB0b3JfY2xpZW50LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIFNlcnZlcyBhcyBhIHJlZ2lzdHJ5IGFuZCBmYWN0b3J5IGZvciBkZWNyeXB0b3JzLgotLy8gVGhpcyBhbGxvd3MgYSBjb21wbGV0ZSBkZWNvdXBsaW5nIHNvIHRoYXQgdGhlIG1lZGlhIHN0YWNrIGRvZXMgbm90IG5lZWQKLS8vIGV4cGxpY2l0IGtub3dsZWRnZSBvZiBhbnkgcGFydGljdWxhciBkZWNyeXB0b3Igb3IgaG93IGl0IHNob3VsZCBiZSBjcmVhdGVkLgotY2xhc3MgTUVESUFfRVhQT1JUIFNoZWxsRGVjcnlwdG9yRmFjdG9yeSB7Ci0gcHVibGljOgotICAvLyBDcmVhdGVzIGEgZGVjcnlwdG9yLiAgUmV0dXJucyBOVUxMIG9uIGZhaWx1cmUuCi0gIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8bWVkaWE6OkRlY3J5cHRvcioobWVkaWE6OkRlY3J5cHRvckNsaWVudCopPiBDcmVhdGVDQjsKLQotICBzdGF0aWMgYm9vbCBTdXBwb3J0cyhjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSk7Ci0KLSAgc3RhdGljIERlY3J5cHRvciogQ3JlYXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdG9yQ2xpZW50KiBjbGllbnQpOwotCi0gIHN0YXRpYyB2b2lkIFJlZ2lzdGVyRGVjcnlwdG9yKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDcmVhdGVDQiYgY3JlYXRlX2NiKTsKLQotIHByaXZhdGU6Ci0gIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIENyZWF0ZUNCPiBEZWNyeXB0b3JSZWdpc3RyeTsKLSAgc3RhdGljIERlY3J5cHRvclJlZ2lzdHJ5IHJlZ2lzdHJ5XzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0NSWVBUT19TSEVMTF9ERUNSWVBUT1JfRkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZmbXBlZy9mZm1wZWdfY29tbW9uLmNjIGIvc3JjL21lZGlhL2ZmbXBlZy9mZm1wZWdfY29tbW9uLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmQ1Y2Q5Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9mZm1wZWcvZmZtcGVnX2NvbW1vbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ0NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvZmZtcGVnL2ZmbXBlZ19jb21tb24uaCIKLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2ZyYW1lLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb191dGlsLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIFdoeSBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFPyBGRm1wZWcgYXNzdW1lcyBhbGwgaW5wdXQgYnVmZmVycyBhcmUKLS8vIHBhZGRlZC4gQ2hlY2sgaGVyZSB0byBlbnN1cmUgRkZtcGVnIG9ubHkgcmVjZWl2ZXMgZGF0YSBwYWRkZWQgdG8gaXRzCi0vLyBzcGVjaWZpY2F0aW9ucy4KLUNPTVBJTEVfQVNTRVJUKERlY29kZXJCdWZmZXI6OmtQYWRkaW5nU2l6ZSA+PSBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFLAotICAgICAgICAgICAgICAgZGVjb2Rlcl9idWZmZXJfcGFkZGluZ19zaXplX2RvZXNfbm90X2ZpdF9mZm1wZWdfcmVxdWlyZW1lbnQpOwotCi0vLyBBbGlnbm1lbnQgcmVxdWlyZW1lbnQgYnkgRkZtcGVnIGZvciBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMuIFRoaXMgbmVlZCB0bwotLy8gYmUgdXBkYXRlZCB0byBtYXRjaCBGRm1wZWcgd2hlbiBpdCBjaGFuZ2VzLgotI2lmIGRlZmluZWQoQVJDSF9DUFVfQVJNX0ZBTUlMWSkKLXN0YXRpYyBjb25zdCBpbnQga0ZGbXBlZ0J1ZmZlckFkZHJlc3NBbGlnbm1lbnQgPSAxNjsKLSNlbHNlCi1zdGF0aWMgY29uc3QgaW50IGtGRm1wZWdCdWZmZXJBZGRyZXNzQWxpZ25tZW50ID0gMzI7Ci0jZW5kaWYKLQotLy8gQ2hlY2sgaGVyZSB0byBlbnN1cmUgRkZtcGVnIG9ubHkgcmVjZWl2ZXMgZGF0YSBhbGlnbmVkIHRvIGl0cyBzcGVjaWZpY2F0aW9ucy4KLUNPTVBJTEVfQVNTRVJUKAotICAgIERlY29kZXJCdWZmZXI6OmtBbGlnbm1lbnRTaXplID49IGtGRm1wZWdCdWZmZXJBZGRyZXNzQWxpZ25tZW50ICYmCi0gICAgRGVjb2RlckJ1ZmZlcjo6a0FsaWdubWVudFNpemUgJSBrRkZtcGVnQnVmZmVyQWRkcmVzc0FsaWdubWVudCA9PSAwLAotICAgIGRlY29kZXJfYnVmZmVyX2FsaWdubWVudF9zaXplX2RvZXNfbm90X2ZpdF9mZm1wZWdfcmVxdWlyZW1lbnQpOwotCi0vLyBBbGxvd3MgZmFzdGVyIFNJTUQgWVVWIGNvbnZlcnQuIEFsc28sIEZGbXBlZyBvdmVycmVhZHMvLXdyaXRlcyBvY2Nhc2lvbmFsbHkuCi0vLyBTZWUgdmlkZW9fZ2V0X2J1ZmZlcigpIGluIGxpYmF2Y29kZWMvdXRpbHMuYy4KLXN0YXRpYyBjb25zdCBpbnQga0ZGbXBlZ091dHB1dEJ1ZmZlclBhZGRpbmdTaXplID0gMTY7Ci0KLUNPTVBJTEVfQVNTRVJUKFZpZGVvRnJhbWU6OmtGcmFtZVNpemVQYWRkaW5nID49IGtGRm1wZWdPdXRwdXRCdWZmZXJQYWRkaW5nU2l6ZSwKLSAgICAgICAgICAgICAgIHZpZGVvX2ZyYW1lX3BhZGRpbmdfc2l6ZV9kb2VzX25vdF9maXRfZmZtcGVnX3JlcXVpcmVtZW50KTsKLQotQ09NUElMRV9BU1NFUlQoCi0gICAgVmlkZW9GcmFtZTo6a0ZyYW1lQWRkcmVzc0FsaWdubWVudCA+PSBrRkZtcGVnQnVmZmVyQWRkcmVzc0FsaWdubWVudCAmJgotICAgIFZpZGVvRnJhbWU6OmtGcmFtZUFkZHJlc3NBbGlnbm1lbnQgJSBrRkZtcGVnQnVmZmVyQWRkcmVzc0FsaWdubWVudCA9PSAwLAotICAgIHZpZGVvX2ZyYW1lX2FkZHJlc3NfYWxpZ25tZW50X2RvZXNfbm90X2ZpdF9mZm1wZWdfcmVxdWlyZW1lbnQpOwotCi1zdGF0aWMgY29uc3QgQVZSYXRpb25hbCBrTWljcm9zQmFzZSA9IHsgMSwgYmFzZTo6VGltZTo6a01pY3Jvc2Vjb25kc1BlclNlY29uZCB9OwotCi1iYXNlOjpUaW1lRGVsdGEgQ29udmVydEZyb21UaW1lQmFzZShjb25zdCBBVlJhdGlvbmFsJiB0aW1lX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NCB0aW1lc3RhbXApIHsKLSAgaW50NjQgbWljcm9zZWNvbmRzID0gYXZfcmVzY2FsZV9xKHRpbWVzdGFtcCwgdGltZV9iYXNlLCBrTWljcm9zQmFzZSk7Ci0gIHJldHVybiBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWNyb3NlY29uZHMobWljcm9zZWNvbmRzKTsKLX0KLQotaW50NjQgQ29udmVydFRvVGltZUJhc2UoY29uc3QgQVZSYXRpb25hbCYgdGltZV9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6VGltZURlbHRhJiB0aW1lc3RhbXApIHsKLSAgcmV0dXJuIGF2X3Jlc2NhbGVfcSh0aW1lc3RhbXAuSW5NaWNyb3NlY29uZHMoKSwga01pY3Jvc0Jhc2UsIHRpbWVfYmFzZSk7Ci19Ci0KLUF1ZGlvQ29kZWMgQ29kZWNJRFRvQXVkaW9Db2RlYyhDb2RlY0lEIGNvZGVjX2lkKSB7Ci0gIHN3aXRjaCAoY29kZWNfaWQpIHsKLSAgICBjYXNlIENPREVDX0lEX0FBQzoKLSAgICAgIHJldHVybiBrQ29kZWNBQUM7Ci0gICAgY2FzZSBDT0RFQ19JRF9NUDM6Ci0gICAgICByZXR1cm4ga0NvZGVjTVAzOwotICAgIGNhc2UgQ09ERUNfSURfVk9SQklTOgotICAgICAgcmV0dXJuIGtDb2RlY1ZvcmJpczsKLSAgICBjYXNlIENPREVDX0lEX1BDTV9VODoKLSAgICBjYXNlIENPREVDX0lEX1BDTV9TMTZMRToKLSAgICBjYXNlIENPREVDX0lEX1BDTV9TMjRMRToKLSAgICAgIHJldHVybiBrQ29kZWNQQ007Ci0gICAgY2FzZSBDT0RFQ19JRF9QQ01fUzE2QkU6Ci0gICAgICByZXR1cm4ga0NvZGVjUENNX1MxNkJFOwotICAgIGNhc2UgQ09ERUNfSURfUENNX1MyNEJFOgotICAgICAgcmV0dXJuIGtDb2RlY1BDTV9TMjRCRTsKLSAgICBjYXNlIENPREVDX0lEX0ZMQUM6Ci0gICAgICByZXR1cm4ga0NvZGVjRkxBQzsKLSAgICBjYXNlIENPREVDX0lEX0FNUl9OQjoKLSAgICAgIHJldHVybiBrQ29kZWNBTVJfTkI7Ci0gICAgY2FzZSBDT0RFQ19JRF9BTVJfV0I6Ci0gICAgICByZXR1cm4ga0NvZGVjQU1SX1dCOwotICAgIGNhc2UgQ09ERUNfSURfR1NNX01TOgotICAgICAgcmV0dXJuIGtDb2RlY0dTTV9NUzsKLSAgICBjYXNlIENPREVDX0lEX1BDTV9NVUxBVzoKLSAgICAgIHJldHVybiBrQ29kZWNQQ01fTVVMQVc7Ci0gICAgY2FzZSBDT0RFQ19JRF9PUFVTOgotICAgICAgcmV0dXJuIGtDb2RlY09wdXM7Ci0gICAgZGVmYXVsdDoKLSAgICAgIERWTE9HKDEpIDw8ICJVbmtub3duIGF1ZGlvIENvZGVjSUQ6ICIgPDwgY29kZWNfaWQ7Ci0gIH0KLSAgcmV0dXJuIGtVbmtub3duQXVkaW9Db2RlYzsKLX0KLQotc3RhdGljIENvZGVjSUQgQXVkaW9Db2RlY1RvQ29kZWNJRChBdWRpb0NvZGVjIGF1ZGlvX2NvZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0c19wZXJfY2hhbm5lbCkgewotICBzd2l0Y2ggKGF1ZGlvX2NvZGVjKSB7Ci0gICAgY2FzZSBrQ29kZWNBQUM6Ci0gICAgICByZXR1cm4gQ09ERUNfSURfQUFDOwotICAgIGNhc2Uga0NvZGVjTVAzOgotICAgICAgcmV0dXJuIENPREVDX0lEX01QMzsKLSAgICBjYXNlIGtDb2RlY1BDTToKLSAgICAgIHN3aXRjaCAoYml0c19wZXJfY2hhbm5lbCkgewotICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgcmV0dXJuIENPREVDX0lEX1BDTV9VODsKLSAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICByZXR1cm4gQ09ERUNfSURfUENNX1MxNkxFOwotICAgICAgICBjYXNlIDMyOgotICAgICAgICAgIHJldHVybiBDT0RFQ19JRF9QQ01fUzI0TEU7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgRFZMT0coMSkgPDwgIlVuc3VwcG9ydGVkIGJpdHMgcGVyIGNoYW5uZWw6ICIgPDwgYml0c19wZXJfY2hhbm5lbDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga0NvZGVjUENNX1MxNkJFOgotICAgICAgcmV0dXJuIENPREVDX0lEX1BDTV9TMTZCRTsKLSAgICBjYXNlIGtDb2RlY1BDTV9TMjRCRToKLSAgICAgIHJldHVybiBDT0RFQ19JRF9QQ01fUzI0QkU7Ci0gICAgY2FzZSBrQ29kZWNWb3JiaXM6Ci0gICAgICByZXR1cm4gQ09ERUNfSURfVk9SQklTOwotICAgIGNhc2Uga0NvZGVjRkxBQzoKLSAgICAgIHJldHVybiBDT0RFQ19JRF9GTEFDOwotICAgIGNhc2Uga0NvZGVjQU1SX05COgotICAgICAgcmV0dXJuIENPREVDX0lEX0FNUl9OQjsKLSAgICBjYXNlIGtDb2RlY0FNUl9XQjoKLSAgICAgIHJldHVybiBDT0RFQ19JRF9BTVJfV0I7Ci0gICAgY2FzZSBrQ29kZWNHU01fTVM6Ci0gICAgICByZXR1cm4gQ09ERUNfSURfR1NNX01TOwotICAgIGNhc2Uga0NvZGVjUENNX01VTEFXOgotICAgICAgcmV0dXJuIENPREVDX0lEX1BDTV9NVUxBVzsKLSAgICBjYXNlIGtDb2RlY09wdXM6Ci0gICAgICByZXR1cm4gQ09ERUNfSURfT1BVUzsKLSAgICBkZWZhdWx0OgotICAgICAgRFZMT0coMSkgPDwgIlVua25vd24gQXVkaW9Db2RlYzogIiA8PCBhdWRpb19jb2RlYzsKLSAgfQotICByZXR1cm4gQ09ERUNfSURfTk9ORTsKLX0KLQotVmlkZW9Db2RlYyBDb2RlY0lEVG9WaWRlb0NvZGVjKENvZGVjSUQgY29kZWNfaWQpIHsKLSAgc3dpdGNoIChjb2RlY19pZCkgewotICAgIGNhc2UgQ09ERUNfSURfVkMxOgotICAgICAgcmV0dXJuIGtDb2RlY1ZDMTsKLSAgICBjYXNlIENPREVDX0lEX0gyNjQ6Ci0gICAgICByZXR1cm4ga0NvZGVjSDI2NDsKLSAgICBjYXNlIENPREVDX0lEX1RIRU9SQToKLSAgICAgIHJldHVybiBrQ29kZWNUaGVvcmE7Ci0gICAgY2FzZSBDT0RFQ19JRF9NUEVHMlZJREVPOgotICAgICAgcmV0dXJuIGtDb2RlY01QRUcyOwotICAgIGNhc2UgQ09ERUNfSURfTVBFRzQ6Ci0gICAgICByZXR1cm4ga0NvZGVjTVBFRzQ7Ci0gICAgY2FzZSBDT0RFQ19JRF9WUDg6Ci0gICAgICByZXR1cm4ga0NvZGVjVlA4OwotICAgIGRlZmF1bHQ6Ci0gICAgICBEVkxPRygxKSA8PCAiVW5rbm93biB2aWRlbyBDb2RlY0lEOiAiIDw8IGNvZGVjX2lkOwotICB9Ci0gIHJldHVybiBrVW5rbm93blZpZGVvQ29kZWM7Ci19Ci0KLXN0YXRpYyBDb2RlY0lEIFZpZGVvQ29kZWNUb0NvZGVjSUQoVmlkZW9Db2RlYyB2aWRlb19jb2RlYykgewotICBzd2l0Y2ggKHZpZGVvX2NvZGVjKSB7Ci0gICAgY2FzZSBrQ29kZWNWQzE6Ci0gICAgICByZXR1cm4gQ09ERUNfSURfVkMxOwotICAgIGNhc2Uga0NvZGVjSDI2NDoKLSAgICAgIHJldHVybiBDT0RFQ19JRF9IMjY0OwotICAgIGNhc2Uga0NvZGVjVGhlb3JhOgotICAgICAgcmV0dXJuIENPREVDX0lEX1RIRU9SQTsKLSAgICBjYXNlIGtDb2RlY01QRUcyOgotICAgICAgcmV0dXJuIENPREVDX0lEX01QRUcyVklERU87Ci0gICAgY2FzZSBrQ29kZWNNUEVHNDoKLSAgICAgIHJldHVybiBDT0RFQ19JRF9NUEVHNDsKLSAgICBjYXNlIGtDb2RlY1ZQODoKLSAgICAgIHJldHVybiBDT0RFQ19JRF9WUDg7Ci0gICAgZGVmYXVsdDoKLSAgICAgIERWTE9HKDEpIDw8ICJVbmtub3duIFZpZGVvQ29kZWM6ICIgPDwgdmlkZW9fY29kZWM7Ci0gIH0KLSAgcmV0dXJuIENPREVDX0lEX05PTkU7Ci19Ci0KLXN0YXRpYyBWaWRlb0NvZGVjUHJvZmlsZSBQcm9maWxlSURUb1ZpZGVvQ29kZWNQcm9maWxlKGludCBwcm9maWxlKSB7Ci0gIC8vIENsZWFyIG91dCB0aGUgQ09OU1RSQUlORUQgJiBJTlRSQSBmbGFncyB3aGljaCBhcmUgc3RyaWN0IHN1YnNldHMgb2YgdGhlCi0gIC8vIGNvcnJlc3BvbmRpbmcgcHJvZmlsZXMgd2l0aCB3aGljaCB0aGV5J3JlIHVzZWQuCi0gIHByb2ZpbGUgJj0gfkZGX1BST0ZJTEVfSDI2NF9DT05TVFJBSU5FRDsKLSAgcHJvZmlsZSAmPSB+RkZfUFJPRklMRV9IMjY0X0lOVFJBOwotICBzd2l0Y2ggKHByb2ZpbGUpIHsKLSAgICBjYXNlIEZGX1BST0ZJTEVfSDI2NF9CQVNFTElORToKLSAgICAgIHJldHVybiBIMjY0UFJPRklMRV9CQVNFTElORTsKLSAgICBjYXNlIEZGX1BST0ZJTEVfSDI2NF9NQUlOOgotICAgICAgcmV0dXJuIEgyNjRQUk9GSUxFX01BSU47Ci0gICAgY2FzZSBGRl9QUk9GSUxFX0gyNjRfRVhURU5ERUQ6Ci0gICAgICByZXR1cm4gSDI2NFBST0ZJTEVfRVhURU5ERUQ7Ci0gICAgY2FzZSBGRl9QUk9GSUxFX0gyNjRfSElHSDoKLSAgICAgIHJldHVybiBIMjY0UFJPRklMRV9ISUdIOwotICAgIGNhc2UgRkZfUFJPRklMRV9IMjY0X0hJR0hfMTA6Ci0gICAgICByZXR1cm4gSDI2NFBST0ZJTEVfSElHSDEwUFJPRklMRTsKLSAgICBjYXNlIEZGX1BST0ZJTEVfSDI2NF9ISUdIXzQyMjoKLSAgICAgIHJldHVybiBIMjY0UFJPRklMRV9ISUdINDIyUFJPRklMRTsKLSAgICBjYXNlIEZGX1BST0ZJTEVfSDI2NF9ISUdIXzQ0NF9QUkVESUNUSVZFOgotICAgICAgcmV0dXJuIEgyNjRQUk9GSUxFX0hJR0g0NDRQUkVESUNUSVZFUFJPRklMRTsKLSAgICBkZWZhdWx0OgotICAgICAgRFZMT0coMSkgPDwgIlVua25vd24gcHJvZmlsZSBpZDogIiA8PCBwcm9maWxlOwotICB9Ci0gIHJldHVybiBWSURFT19DT0RFQ19QUk9GSUxFX1VOS05PV047Ci19Ci0KLXN0YXRpYyBpbnQgVmlkZW9Db2RlY1Byb2ZpbGVUb1Byb2ZpbGVJRChWaWRlb0NvZGVjUHJvZmlsZSBwcm9maWxlKSB7Ci0gIHN3aXRjaCAocHJvZmlsZSkgewotICAgIGNhc2UgSDI2NFBST0ZJTEVfQkFTRUxJTkU6Ci0gICAgICByZXR1cm4gRkZfUFJPRklMRV9IMjY0X0JBU0VMSU5FOwotICAgIGNhc2UgSDI2NFBST0ZJTEVfTUFJTjoKLSAgICAgIHJldHVybiBGRl9QUk9GSUxFX0gyNjRfTUFJTjsKLSAgICBjYXNlIEgyNjRQUk9GSUxFX0VYVEVOREVEOgotICAgICAgcmV0dXJuIEZGX1BST0ZJTEVfSDI2NF9FWFRFTkRFRDsKLSAgICBjYXNlIEgyNjRQUk9GSUxFX0hJR0g6Ci0gICAgICByZXR1cm4gRkZfUFJPRklMRV9IMjY0X0hJR0g7Ci0gICAgY2FzZSBIMjY0UFJPRklMRV9ISUdIMTBQUk9GSUxFOgotICAgICAgcmV0dXJuIEZGX1BST0ZJTEVfSDI2NF9ISUdIXzEwOwotICAgIGNhc2UgSDI2NFBST0ZJTEVfSElHSDQyMlBST0ZJTEU6Ci0gICAgICByZXR1cm4gRkZfUFJPRklMRV9IMjY0X0hJR0hfNDIyOwotICAgIGNhc2UgSDI2NFBST0ZJTEVfSElHSDQ0NFBSRURJQ1RJVkVQUk9GSUxFOgotICAgICAgcmV0dXJuIEZGX1BST0ZJTEVfSDI2NF9ISUdIXzQ0NF9QUkVESUNUSVZFOwotICAgIGRlZmF1bHQ6Ci0gICAgICBEVkxPRygxKSA8PCAiVW5rbm93biBWaWRlb0NvZGVjUHJvZmlsZTogIiA8PCBwcm9maWxlOwotICB9Ci0gIHJldHVybiBGRl9QUk9GSUxFX1VOS05PV047Ci19Ci0KLXZvaWQgQVZDb2RlY0NvbnRleHRUb0F1ZGlvRGVjb2RlckNvbmZpZygKLSAgICBjb25zdCBBVkNvZGVjQ29udGV4dCogY29kZWNfY29udGV4dCwKLSAgICBBdWRpb0RlY29kZXJDb25maWcqIGNvbmZpZykgewotICBEQ0hFQ0tfRVEoY29kZWNfY29udGV4dC0+Y29kZWNfdHlwZSwgQVZNRURJQV9UWVBFX0FVRElPKTsKLQotICBBdWRpb0NvZGVjIGNvZGVjID0gQ29kZWNJRFRvQXVkaW9Db2RlYyhjb2RlY19jb250ZXh0LT5jb2RlY19pZCk7Ci0KLSAgQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2Zvcm1hdCA9IGNvZGVjX2NvbnRleHQtPnNhbXBsZV9mbXQ7Ci0gIGlmIChjb2RlYyA9PSBrQ29kZWNPcHVzKSB7Ci0gICAgLy8gVE9ETyh0b21maW5lZ2FuKTogfHNhbXBsZV9mbXR8IGluIHxjb2RlY19jb250ZXh0fCBpcyAtMS4uLiBiZWNhdXNlCi0gICAgLy8gbGlib3B1c2RlYy5jIGlzbid0IGJ1aWx0IGludG8gZmZtcGVnc3Vtby4uLj8gTWF5YmUgaXQncyBub3QgKnRoYXQqIGJpZwotICAgIC8vIGEgZGVhbCBzaW5jZSBsaWJvcHVzIHdpbGwgcHJvZHVjZSBlaXRoZXIgZmxvYXQgb3IgUzE2IHNhbXBsZXMsIGFuZAotICAgIC8vIE9wdXNBdWRpb0RlY29kZXIgaXMgdGhlIG9ubHkgcHJvdmlkZXIgb2YgT3B1cyBzdXBwb3J0LgotICAgIHNhbXBsZV9mb3JtYXQgPSBBVl9TQU1QTEVfRk1UX1MxNjsKLSAgfQotCi0gIGludCBieXRlc19wZXJfY2hhbm5lbCA9IGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKHNhbXBsZV9mb3JtYXQpOwotICBDaGFubmVsTGF5b3V0IGNoYW5uZWxfbGF5b3V0ID0KLSAgICAgIENoYW5uZWxMYXlvdXRUb0Nocm9tZUNoYW5uZWxMYXlvdXQoY29kZWNfY29udGV4dC0+Y2hhbm5lbF9sYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX2NvbnRleHQtPmNoYW5uZWxzKTsKLSAgaW50IHNhbXBsZXNfcGVyX3NlY29uZCA9IGNvZGVjX2NvbnRleHQtPnNhbXBsZV9yYXRlOwotCi0gIGNvbmZpZy0+SW5pdGlhbGl6ZShjb2RlYywKLSAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3Blcl9jaGFubmVsIDw8IDMsCi0gICAgICAgICAgICAgICAgICAgICBjaGFubmVsX2xheW91dCwKLSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNfcGVyX3NlY29uZCwKLSAgICAgICAgICAgICAgICAgICAgIGNvZGVjX2NvbnRleHQtPmV4dHJhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgIGNvZGVjX2NvbnRleHQtPmV4dHJhZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICAvLyBOb3QgZW5jcnlwdGVkLgotICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci19Ci0KLXZvaWQgQXVkaW9EZWNvZGVyQ29uZmlnVG9BVkNvZGVjQ29udGV4dChjb25zdCBBdWRpb0RlY29kZXJDb25maWcmIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCogY29kZWNfY29udGV4dCkgewotICBjb2RlY19jb250ZXh0LT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICBjb2RlY19jb250ZXh0LT5jb2RlY19pZCA9IEF1ZGlvQ29kZWNUb0NvZGVjSUQoY29uZmlnLmNvZGVjKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuYml0c19wZXJfY2hhbm5lbCgpKTsKLQotICBzd2l0Y2ggKGNvbmZpZy5iaXRzX3Blcl9jaGFubmVsKCkpIHsKLSAgICBjYXNlIDg6Ci0gICAgICBjb2RlY19jb250ZXh0LT5zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9VODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICBjb2RlY19jb250ZXh0LT5zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9TMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyOgotICAgICAgY29kZWNfY29udGV4dC0+c2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfUzMyOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIERWTE9HKDEpIDw8ICJVbnN1cHBvcnRlZCBiaXRzIHBlciBjaGFubmVsOiAiIDw8IGNvbmZpZy5iaXRzX3Blcl9jaGFubmVsKCk7Ci0gICAgICBjb2RlY19jb250ZXh0LT5zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9OT05FOwotICB9Ci0KLSAgLy8gVE9ETyhzY2hlcmt1cyk6IHNob3VsZCB3ZSBzZXQgfGNoYW5uZWxfbGF5b3V0fD8gSSdtIG5vdCBzdXJlIGlmIEZGbXBlZyB1c2VzCi0gIC8vIHNhaWQgaW5mb3JtYXRpb24gdG8gZGVjb2RlLgotICBjb2RlY19jb250ZXh0LT5jaGFubmVscyA9Ci0gICAgICBDaGFubmVsTGF5b3V0VG9DaGFubmVsQ291bnQoY29uZmlnLmNoYW5uZWxfbGF5b3V0KCkpOwotICBjb2RlY19jb250ZXh0LT5zYW1wbGVfcmF0ZSA9IGNvbmZpZy5zYW1wbGVzX3Blcl9zZWNvbmQoKTsKLQotICBpZiAoY29uZmlnLmV4dHJhX2RhdGEoKSkgewotICAgIGNvZGVjX2NvbnRleHQtPmV4dHJhZGF0YV9zaXplID0gY29uZmlnLmV4dHJhX2RhdGFfc2l6ZSgpOwotICAgIGNvZGVjX2NvbnRleHQtPmV4dHJhZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KAotICAgICAgICBhdl9tYWxsb2MoY29uZmlnLmV4dHJhX2RhdGFfc2l6ZSgpICsgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSkpOwotICAgIG1lbWNweShjb2RlY19jb250ZXh0LT5leHRyYWRhdGEsIGNvbmZpZy5leHRyYV9kYXRhKCksCi0gICAgICAgICAgIGNvbmZpZy5leHRyYV9kYXRhX3NpemUoKSk7Ci0gICAgbWVtc2V0KGNvZGVjX2NvbnRleHQtPmV4dHJhZGF0YSArIGNvbmZpZy5leHRyYV9kYXRhX3NpemUoKSwgJ1wwJywKLSAgICAgICAgICAgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7Ci0gIH0gZWxzZSB7Ci0gICAgY29kZWNfY29udGV4dC0+ZXh0cmFkYXRhID0gTlVMTDsKLSAgICBjb2RlY19jb250ZXh0LT5leHRyYWRhdGFfc2l6ZSA9IDA7Ci0gIH0KLX0KLQotdm9pZCBBVlN0cmVhbVRvVmlkZW9EZWNvZGVyQ29uZmlnKAotICAgIGNvbnN0IEFWU3RyZWFtKiBzdHJlYW0sCi0gICAgVmlkZW9EZWNvZGVyQ29uZmlnKiBjb25maWcpIHsKLSAgZ2Z4OjpTaXplIGNvZGVkX3NpemUoc3RyZWFtLT5jb2RlYy0+Y29kZWRfd2lkdGgsIHN0cmVhbS0+Y29kZWMtPmNvZGVkX2hlaWdodCk7Ci0KLSAgLy8gVE9ETyh2cmspOiBUaGlzIGFzc3VtZXMgZGVjb2RlZCBmcmFtZSBkYXRhIHN0YXJ0cyBhdCAoMCwgMCksIHdoaWNoIGlzIHRydWUKLSAgLy8gZm9yIG5vdywgYnV0IG1heSBub3QgYWx3YXlzIGJlIHRydWUgZm9yZXZlci4gRml4IHRoaXMgaW4gdGhlIGZ1dHVyZS4KLSAgZ2Z4OjpSZWN0IHZpc2libGVfcmVjdChzdHJlYW0tPmNvZGVjLT53aWR0aCwgc3RyZWFtLT5jb2RlYy0+aGVpZ2h0KTsKLQotICBBVlJhdGlvbmFsIGFzcGVjdF9yYXRpbyA9IHsgMSwgMSB9OwotICBpZiAoc3RyZWFtLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSkKLSAgICBhc3BlY3RfcmF0aW8gPSBzdHJlYW0tPnNhbXBsZV9hc3BlY3RfcmF0aW87Ci0gIGVsc2UgaWYgKHN0cmVhbS0+Y29kZWMtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtKQotICAgIGFzcGVjdF9yYXRpbyA9IHN0cmVhbS0+Y29kZWMtPnNhbXBsZV9hc3BlY3RfcmF0aW87Ci0KLSAgVmlkZW9Db2RlYyBjb2RlYyA9IENvZGVjSURUb1ZpZGVvQ29kZWMoc3RyZWFtLT5jb2RlYy0+Y29kZWNfaWQpOwotICBWaWRlb0NvZGVjUHJvZmlsZSBwcm9maWxlID0gKGNvZGVjID09IGtDb2RlY1ZQOCkgPyBWUDhQUk9GSUxFX01BSU4gOgotICAgICAgUHJvZmlsZUlEVG9WaWRlb0NvZGVjUHJvZmlsZShzdHJlYW0tPmNvZGVjLT5wcm9maWxlKTsKLSAgZ2Z4OjpTaXplIG5hdHVyYWxfc2l6ZSA9IEdldE5hdHVyYWxTaXplKAotICAgICAgdmlzaWJsZV9yZWN0LnNpemUoKSwgYXNwZWN0X3JhdGlvLm51bSwgYXNwZWN0X3JhdGlvLmRlbik7Ci0gIGNvbmZpZy0+SW5pdGlhbGl6ZShjb2RlYywKLSAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdFRvVmlkZW9Gb3JtYXQoc3RyZWFtLT5jb2RlYy0+cGl4X2ZtdCksCi0gICAgICAgICAgICAgICAgICAgICBjb2RlZF9zaXplLCB2aXNpYmxlX3JlY3QsIG5hdHVyYWxfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Y29kZWMtPmV4dHJhZGF0YSwgc3RyZWFtLT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICBmYWxzZSwgIC8vIE5vdCBlbmNyeXB0ZWQuCi0gICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLX0KLQotdm9pZCBWaWRlb0RlY29kZXJDb25maWdUb0FWQ29kZWNDb250ZXh0KAotICAgIGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgY29uZmlnLAotICAgIEFWQ29kZWNDb250ZXh0KiBjb2RlY19jb250ZXh0KSB7Ci0gIGNvZGVjX2NvbnRleHQtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gIGNvZGVjX2NvbnRleHQtPmNvZGVjX2lkID0gVmlkZW9Db2RlY1RvQ29kZWNJRChjb25maWcuY29kZWMoKSk7Ci0gIGNvZGVjX2NvbnRleHQtPnByb2ZpbGUgPSBWaWRlb0NvZGVjUHJvZmlsZVRvUHJvZmlsZUlEKGNvbmZpZy5wcm9maWxlKCkpOwotICBjb2RlY19jb250ZXh0LT5jb2RlZF93aWR0aCA9IGNvbmZpZy5jb2RlZF9zaXplKCkud2lkdGgoKTsKLSAgY29kZWNfY29udGV4dC0+Y29kZWRfaGVpZ2h0ID0gY29uZmlnLmNvZGVkX3NpemUoKS5oZWlnaHQoKTsKLSAgY29kZWNfY29udGV4dC0+cGl4X2ZtdCA9IFZpZGVvRm9ybWF0VG9QaXhlbEZvcm1hdChjb25maWcuZm9ybWF0KCkpOwotCi0gIGlmIChjb25maWcuZXh0cmFfZGF0YSgpKSB7Ci0gICAgY29kZWNfY29udGV4dC0+ZXh0cmFkYXRhX3NpemUgPSBjb25maWcuZXh0cmFfZGF0YV9zaXplKCk7Ci0gICAgY29kZWNfY29udGV4dC0+ZXh0cmFkYXRhID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oCi0gICAgICAgIGF2X21hbGxvYyhjb25maWcuZXh0cmFfZGF0YV9zaXplKCkgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKSk7Ci0gICAgbWVtY3B5KGNvZGVjX2NvbnRleHQtPmV4dHJhZGF0YSwgY29uZmlnLmV4dHJhX2RhdGEoKSwKLSAgICAgICAgICAgY29uZmlnLmV4dHJhX2RhdGFfc2l6ZSgpKTsKLSAgICBtZW1zZXQoY29kZWNfY29udGV4dC0+ZXh0cmFkYXRhICsgY29uZmlnLmV4dHJhX2RhdGFfc2l6ZSgpLCAnXDAnLAotICAgICAgICAgICBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKLSAgfSBlbHNlIHsKLSAgICBjb2RlY19jb250ZXh0LT5leHRyYWRhdGEgPSBOVUxMOwotICAgIGNvZGVjX2NvbnRleHQtPmV4dHJhZGF0YV9zaXplID0gMDsKLSAgfQotfQotCi1DaGFubmVsTGF5b3V0IENoYW5uZWxMYXlvdXRUb0Nocm9tZUNoYW5uZWxMYXlvdXQoaW50NjRfdCBsYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzKSB7Ci0gIHN3aXRjaCAobGF5b3V0KSB7Ci0gICAgY2FzZSBBVl9DSF9MQVlPVVRfTU9OTzoKLSAgICAgIHJldHVybiBDSEFOTkVMX0xBWU9VVF9NT05POwotICAgIGNhc2UgQVZfQ0hfTEFZT1VUX1NURVJFTzoKLSAgICAgIHJldHVybiBDSEFOTkVMX0xBWU9VVF9TVEVSRU87Ci0gICAgY2FzZSBBVl9DSF9MQVlPVVRfMl8xOgotICAgICAgcmV0dXJuIENIQU5ORUxfTEFZT1VUXzJfMTsKLSAgICBjYXNlIEFWX0NIX0xBWU9VVF9TVVJST1VORDoKLSAgICAgIHJldHVybiBDSEFOTkVMX0xBWU9VVF9TVVJST1VORDsKLSAgICBjYXNlIEFWX0NIX0xBWU9VVF80UE9JTlQwOgotICAgICAgcmV0dXJuIENIQU5ORUxfTEFZT1VUXzRfMDsKLSAgICBjYXNlIEFWX0NIX0xBWU9VVF8yXzI6Ci0gICAgICByZXR1cm4gQ0hBTk5FTF9MQVlPVVRfMl8yOwotICAgIGNhc2UgQVZfQ0hfTEFZT1VUX1FVQUQ6Ci0gICAgICByZXR1cm4gQ0hBTk5FTF9MQVlPVVRfUVVBRDsKLSAgICBjYXNlIEFWX0NIX0xBWU9VVF81UE9JTlQwOgotICAgICAgcmV0dXJuIENIQU5ORUxfTEFZT1VUXzVfMDsKLSAgICBjYXNlIEFWX0NIX0xBWU9VVF81UE9JTlQxOgotICAgICAgcmV0dXJuIENIQU5ORUxfTEFZT1VUXzVfMTsKLSAgICBjYXNlIEFWX0NIX0xBWU9VVF81UE9JTlQwX0JBQ0s6Ci0gICAgICByZXR1cm4gQ0hBTk5FTF9MQVlPVVRfNV8wX0JBQ0s7Ci0gICAgY2FzZSBBVl9DSF9MQVlPVVRfNVBPSU5UMV9CQUNLOgotICAgICAgcmV0dXJuIENIQU5ORUxfTEFZT1VUXzVfMV9CQUNLOwotICAgIGNhc2UgQVZfQ0hfTEFZT1VUXzdQT0lOVDA6Ci0gICAgICByZXR1cm4gQ0hBTk5FTF9MQVlPVVRfN18wOwotICAgIGNhc2UgQVZfQ0hfTEFZT1VUXzdQT0lOVDE6Ci0gICAgICByZXR1cm4gQ0hBTk5FTF9MQVlPVVRfN18xOwotICAgIGNhc2UgQVZfQ0hfTEFZT1VUXzdQT0lOVDFfV0lERToKLSAgICAgIHJldHVybiBDSEFOTkVMX0xBWU9VVF83XzFfV0lERTsKLSAgICBjYXNlIEFWX0NIX0xBWU9VVF9TVEVSRU9fRE9XTk1JWDoKLSAgICAgIHJldHVybiBDSEFOTkVMX0xBWU9VVF9TVEVSRU9fRE9XTk1JWDsKLSAgICBjYXNlIEFWX0NIX0xBWU9VVF8yUE9JTlQxOgotICAgICAgcmV0dXJuIENIQU5ORUxfTEFZT1VUXzJQT0lOVDE7Ci0gICAgY2FzZSBBVl9DSF9MQVlPVVRfM1BPSU5UMToKLSAgICAgIHJldHVybiBDSEFOTkVMX0xBWU9VVF8zXzE7Ci0gICAgY2FzZSBBVl9DSF9MQVlPVVRfNFBPSU5UMToKLSAgICAgIHJldHVybiBDSEFOTkVMX0xBWU9VVF80XzE7Ci0gICAgY2FzZSBBVl9DSF9MQVlPVVRfNlBPSU5UMDoKLSAgICAgIHJldHVybiBDSEFOTkVMX0xBWU9VVF82XzA7Ci0gICAgY2FzZSBBVl9DSF9MQVlPVVRfNlBPSU5UMF9GUk9OVDoKLSAgICAgIHJldHVybiBDSEFOTkVMX0xBWU9VVF82XzBfRlJPTlQ7Ci0gICAgY2FzZSBBVl9DSF9MQVlPVVRfSEVYQUdPTkFMOgotICAgICAgcmV0dXJuIENIQU5ORUxfTEFZT1VUX0hFWEFHT05BTDsKLSAgICBjYXNlIEFWX0NIX0xBWU9VVF82UE9JTlQxOgotICAgICAgcmV0dXJuIENIQU5ORUxfTEFZT1VUXzZfMTsKLSAgICBjYXNlIEFWX0NIX0xBWU9VVF82UE9JTlQxX0JBQ0s6Ci0gICAgICByZXR1cm4gQ0hBTk5FTF9MQVlPVVRfNl8xX0JBQ0s7Ci0gICAgY2FzZSBBVl9DSF9MQVlPVVRfNlBPSU5UMV9GUk9OVDoKLSAgICAgIHJldHVybiBDSEFOTkVMX0xBWU9VVF82XzFfRlJPTlQ7Ci0gICAgY2FzZSBBVl9DSF9MQVlPVVRfN1BPSU5UMF9GUk9OVDoKLSAgICAgIHJldHVybiBDSEFOTkVMX0xBWU9VVF83XzBfRlJPTlQ7Ci0gICAgY2FzZSBBVl9DSF9MQVlPVVRfN1BPSU5UMV9XSURFX0JBQ0s6Ci0gICAgICByZXR1cm4gQ0hBTk5FTF9MQVlPVVRfN18xX1dJREVfQkFDSzsKLSAgICBjYXNlIEFWX0NIX0xBWU9VVF9PQ1RBR09OQUw6Ci0gICAgICByZXR1cm4gQ0hBTk5FTF9MQVlPVVRfT0NUQUdPTkFMOwotICAgIGRlZmF1bHQ6Ci0gICAgICAvLyBGRm1wZWcgY2hhbm5lbF9sYXlvdXQgaXMgMCBmb3IgLndhdiBhbmQgLm1wMy4gIFdlIGtub3cgbW9ubyBhbmQgc3RlcmVvCi0gICAgICAvLyBmcm9tIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMsIG90aGVyd2lzZSByZXBvcnQgZXJyb3JzLgotICAgICAgaWYgKGNoYW5uZWxzID09IDEpCi0gICAgICAgIHJldHVybiBDSEFOTkVMX0xBWU9VVF9NT05POwotICAgICAgaWYgKGNoYW5uZWxzID09IDIpCi0gICAgICAgIHJldHVybiBDSEFOTkVMX0xBWU9VVF9TVEVSRU87Ci0gICAgICBMT0coRVJST1IpIDw8ICJVbnN1cHBvcnRlZCBjaGFubmVsIGxheW91dDogIiA8PCBsYXlvdXQ7Ci0gIH0KLSAgcmV0dXJuIENIQU5ORUxfTEFZT1VUX1VOU1VQUE9SVEVEOwotfQotCi1WaWRlb0ZyYW1lOjpGb3JtYXQgUGl4ZWxGb3JtYXRUb1ZpZGVvRm9ybWF0KFBpeGVsRm9ybWF0IHBpeGVsX2Zvcm1hdCkgewotICBzd2l0Y2ggKHBpeGVsX2Zvcm1hdCkgewotICAgIGNhc2UgUElYX0ZNVF9ZVVY0MjJQOgotICAgICAgcmV0dXJuIFZpZGVvRnJhbWU6OllWMTY7Ci0gICAgY2FzZSBQSVhfRk1UX1lVVjQyMFA6Ci0gICAgICByZXR1cm4gVmlkZW9GcmFtZTo6WVYxMjsKLSAgICBkZWZhdWx0OgotICAgICAgRFZMT0coMSkgPDwgIlVuc3VwcG9ydGVkIFBpeGVsRm9ybWF0OiAiIDw8IHBpeGVsX2Zvcm1hdDsKLSAgfQotICByZXR1cm4gVmlkZW9GcmFtZTo6SU5WQUxJRDsKLX0KLQotUGl4ZWxGb3JtYXQgVmlkZW9Gb3JtYXRUb1BpeGVsRm9ybWF0KFZpZGVvRnJhbWU6OkZvcm1hdCB2aWRlb19mb3JtYXQpIHsKLSAgc3dpdGNoICh2aWRlb19mb3JtYXQpIHsKLSAgICBjYXNlIFZpZGVvRnJhbWU6OllWMTY6Ci0gICAgICByZXR1cm4gUElYX0ZNVF9ZVVY0MjJQOwotICAgIGNhc2UgVmlkZW9GcmFtZTo6WVYxMjoKLSAgICAgIHJldHVybiBQSVhfRk1UX1lVVjQyMFA7Ci0gICAgZGVmYXVsdDoKLSAgICAgIERWTE9HKDEpIDw8ICJVbnN1cHBvcnRlZCBWaWRlb0ZyYW1lOjpGb3JtYXQ6ICIgPDwgdmlkZW9fZm9ybWF0OwotICB9Ci0gIHJldHVybiBQSVhfRk1UX05PTkU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZmbXBlZy9mZm1wZWdfY29tbW9uLmggYi9zcmMvbWVkaWEvZmZtcGVnL2ZmbXBlZ19jb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhmNzBkMC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmZtcGVnL2ZmbXBlZ19jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0ZGTVBFR19GRk1QRUdfQ09NTU9OX0hfCi0jZGVmaW5lIE1FRElBX0ZGTVBFR19GRk1QRUdfQ09NTU9OX0hfCi0KLS8vIFVzZWQgZm9yIEZGbXBlZyBlcnJvciBjb2Rlcy4KLSNpbmNsdWRlIDxjZXJybm8+Ci0KLSNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCi0jaW5jbHVkZSAiYmFzZS90aW1lLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19kZWNvZGVyX2NvbmZpZy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvY2hhbm5lbF9sYXlvdXQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fZnJhbWUuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXJfY29uZmlnLmgiCi0KLS8vIEluY2x1ZGUgRkZtcGVnIGhlYWRlciBmaWxlcy4KLWV4dGVybiAiQyIgewotLy8gVGVtcG9yYXJpbHkgZGlzYWJsZSBwb3NzaWJsZSBsb3NzIG9mIGRhdGEgd2FybmluZy4KLS8vIFRPRE8oc2NoZXJrdXMpOiBmaXggYW5kIHVwc3RyZWFtIHRoZSBjb21waWxlciB3YXJuaW5ncy4KLU1TVkNfUFVTSF9ESVNBQkxFX1dBUk5JTkcoNDI0NCk7Ci0jaW5jbHVkZSA8bGliYXZjb2RlYy9hdmNvZGVjLmg+Ci0jaW5jbHVkZSA8bGliYXZmb3JtYXQvYXZmb3JtYXQuaD4KLSNpbmNsdWRlIDxsaWJhdmZvcm1hdC9hdmlvLmg+Ci0jaW5jbHVkZSA8bGliYXZ1dGlsL2F1ZGlvY29udmVydC5oPgotI2luY2x1ZGUgPGxpYmF2dXRpbC9hdnV0aWwuaD4KLSNpbmNsdWRlIDxsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaD4KLSNpbmNsdWRlIDxsaWJhdnV0aWwvbG9nLmg+Ci0jaW5jbHVkZSA8bGliYXZ1dGlsL2ltZ3V0aWxzLmg+Ci1NU1ZDX1BPUF9XQVJOSU5HKCk7Ci19ICAvLyBleHRlcm4gIkMiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIEF1ZGlvRGVjb2RlckNvbmZpZzsKLWNsYXNzIFZpZGVvRGVjb2RlckNvbmZpZzsKLQotLy8gV3JhcHMgRkZtcGVnJ3MgYXZfZnJlZSgpIGluIGEgY2xhc3MgdGhhdCBjYW4gYmUgcGFzc2VkIGFzIGEgdGVtcGxhdGUgYXJndW1lbnQKLS8vIHRvIHNjb3BlZF9wdHJfbWFsbG9jLgotY2xhc3MgU2NvcGVkUHRyQVZGcmVlIHsKLSBwdWJsaWM6Ci0gIGlubGluZSB2b2lkIG9wZXJhdG9yKCkodm9pZCogeCkgY29uc3QgewotICAgIGF2X2ZyZWUoeCk7Ci0gIH0KLX07Ci0KLS8vIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBBVlBhY2tldCBiZWluZyBjYXB0dXJlZCB3YXMgYWxsb2NhdGVkIG91dHNpZGUgb2YKLS8vIEZGbXBlZyB2aWEgdGhlIG5ldyBvcGVyYXRvci4gIERvIG5vdCB1c2UgdGhpcyB3aXRoIEFWUGFja2V0IGluc3RhbmNlcyB0aGF0Ci0vLyBhcmUgYWxsb2NhdGVkIHZpYSBtYWxsb2MoKSBvciBhdl9tYWxsb2MoKS4KLWNsYXNzIFNjb3BlZFB0ckFWRnJlZVBhY2tldCB7Ci0gcHVibGljOgotICBpbmxpbmUgdm9pZCBvcGVyYXRvcigpKHZvaWQqIHgpIGNvbnN0IHsKLSAgICBBVlBhY2tldCogcGFja2V0ID0gc3RhdGljX2Nhc3Q8QVZQYWNrZXQqPih4KTsKLSAgICBhdl9mcmVlX3BhY2tldChwYWNrZXQpOwotICAgIGRlbGV0ZSBwYWNrZXQ7Ci0gIH0KLX07Ci0KLS8vIENvbnZlcnRzIGFuIGludDY0IHRpbWVzdGFtcCBpbiB8dGltZV9iYXNlfCB1bml0cyB0byBhIGJhc2U6OlRpbWVEZWx0YS4KLS8vIEZvciBleGFtcGxlIGlmIHx0aW1lc3RhbXB8IGVxdWFscyAxMTAyNSBhbmQgfHRpbWVfYmFzZXwgZXF1YWxzIHsxLCA0NDEwMH0KLS8vIHRoZW4gdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGEgYmFzZTo6VGltZURlbHRhIGZvciAwLjI1IHNlY29uZHMgc2luY2UgdGhhdAotLy8gaXMgaG93IG11Y2ggdGltZSAxMTAyNS80NDEwMHRocyBvZiBhIHNlY29uZCByZXByZXNlbnRzLgotTUVESUFfRVhQT1JUIGJhc2U6OlRpbWVEZWx0YSBDb252ZXJ0RnJvbVRpbWVCYXNlKGNvbnN0IEFWUmF0aW9uYWwmIHRpbWVfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NCB0aW1lc3RhbXApOwotCi0vLyBDb252ZXJ0cyBhIGJhc2U6OlRpbWVEZWx0YSBpbnRvIGFuIGludDY0IHRpbWVzdGFtcCBpbiB8dGltZV9iYXNlfCB1bml0cy4KLS8vIEZvciBleGFtcGxlIGlmIHx0aW1lc3RhbXB8IGlzIDAuNSBzZWNvbmRzIGFuZCB8dGltZV9iYXNlfCBpcyB7MSwgNDQxMDB9LCB0aGVuCi0vLyB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgMjIwNTAgc2luY2UgdGhhdCBpcyBob3cgbWFueSAxLzQ0MTAwdGhzIG9mIGEgc2Vjb25kCi0vLyByZXByZXNlbnQgMC41IHNlY29uZHMuCi1NRURJQV9FWFBPUlQgaW50NjQgQ29udmVydFRvVGltZUJhc2UoY29uc3QgQVZSYXRpb25hbCYgdGltZV9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSYgdGltZXN0YW1wKTsKLQotdm9pZCBBVkNvZGVjQ29udGV4dFRvQXVkaW9EZWNvZGVyQ29uZmlnKAotICAgIGNvbnN0IEFWQ29kZWNDb250ZXh0KiBjb2RlY19jb250ZXh0LAotICAgIEF1ZGlvRGVjb2RlckNvbmZpZyogY29uZmlnKTsKLXZvaWQgQXVkaW9EZWNvZGVyQ29uZmlnVG9BVkNvZGVjQ29udGV4dCgKLSAgICBjb25zdCBBdWRpb0RlY29kZXJDb25maWcmIGNvbmZpZywKLSAgICBBVkNvZGVjQ29udGV4dCogY29kZWNfY29udGV4dCk7Ci0KLXZvaWQgQVZTdHJlYW1Ub1ZpZGVvRGVjb2RlckNvbmZpZygKLSAgICBjb25zdCBBVlN0cmVhbSogc3RyZWFtLAotICAgIFZpZGVvRGVjb2RlckNvbmZpZyogY29uZmlnKTsKLXZvaWQgVmlkZW9EZWNvZGVyQ29uZmlnVG9BVkNvZGVjQ29udGV4dCgKLSAgICBjb25zdCBWaWRlb0RlY29kZXJDb25maWcmIGNvbmZpZywKLSAgICBBVkNvZGVjQ29udGV4dCogY29kZWNfY29udGV4dCk7Ci0KLS8vIENvbnZlcnRzIEZGbXBlZydzIGNoYW5uZWwgbGF5b3V0IHRvIGNocm9tZSdzIENoYW5uZWxMYXlvdXQuICB8Y2hhbm5lbHN8IGNhbgotLy8gYmUgdXNlZCB3aGVuIEZGbXBlZydzIGNoYW5uZWwgbGF5b3V0IGlzIG5vdCBpbmZvcm1hdGl2ZSBpbiBvcmRlciB0byBtYWtlIGEKLS8vIGdvb2QgZ3Vlc3MgYWJvdXQgdGhlIHBsYXVzaWJsZSBjaGFubmVsIGxheW91dCBiYXNlZCBvbiBudW1iZXIgb2YgY2hhbm5lbHMuCi1DaGFubmVsTGF5b3V0IENoYW5uZWxMYXlvdXRUb0Nocm9tZUNoYW5uZWxMYXlvdXQoaW50NjRfdCBsYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzKTsKLQotLy8gQ29udmVydHMgRkZtcGVnJ3MgcGl4ZWwgZm9ybWF0cyB0byBpdHMgY29ycmVzcG9uZGluZyBzdXBwb3J0ZWQgdmlkZW8gZm9ybWF0LgotVmlkZW9GcmFtZTo6Rm9ybWF0IFBpeGVsRm9ybWF0VG9WaWRlb0Zvcm1hdChQaXhlbEZvcm1hdCBwaXhlbF9mb3JtYXQpOwotCi0vLyBDb252ZXJ0cyB2aWRlbyBmb3JtYXRzIHRvIGl0cyBjb3JyZXNwb25kaW5nIEZGbXBlZydzIHBpeGVsIGZvcm1hdHMuCi1QaXhlbEZvcm1hdCBWaWRlb0Zvcm1hdFRvUGl4ZWxGb3JtYXQoVmlkZW9GcmFtZTo6Rm9ybWF0IHZpZGVvX2Zvcm1hdCk7Ci0KLS8vIENvbnZlcnRzIGFuIEZGbXBlZyB2aWRlbyBjb2RlYyBJRCBpbnRvIGl0cyBjb3JyZXNwb25kaW5nIHN1cHBvcnRlZCBjb2RlYyBpZC4KLVZpZGVvQ29kZWMgQ29kZWNJRFRvVmlkZW9Db2RlYyhDb2RlY0lEIGNvZGVjX2lkKTsKLQotLy8gQ29udmVydHMgYW4gRkZtcGVnIGF1ZGlvIGNvZGVjIElEIGludG8gaXRzIGNvcnJlc3BvbmRpbmcgc3VwcG9ydGVkIGNvZGVjIGlkLgotQXVkaW9Db2RlYyBDb2RlY0lEVG9BdWRpb0NvZGVjKENvZGVjSUQgY29kZWNfaWQpOwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9GRk1QRUdfRkZNUEVHX0NPTU1PTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZmbXBlZy9mZm1wZWdfY29tbW9uX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2ZmbXBlZy9mZm1wZWdfY29tbW9uX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjdlMWZlLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9mZm1wZWcvZmZtcGVnX2NvbW1vbl91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJiYXNlL2ZpbGVfcGF0aC5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvcGF0aF9zZXJ2aWNlLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYS5oIgotI2luY2x1ZGUgIm1lZGlhL2ZmbXBlZy9mZm1wZWdfY29tbW9uLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0KLXVzaW5nIGJhc2U6OlRpbWVEZWx0YTsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotc3RhdGljIEFWSW5kZXhFbnRyeSBrSW5kZXhFbnRyaWVzW10gPSB7Ci0gIC8vIHBvcywgdGltZXN0YW1wLCBmbGFncywgc2l6ZSwgbWluX2Rpc3RhbmNlCi0gIHsgICAgIDAsICAgICAwLCBBVklOREVYX0tFWUZSQU1FLCAwLCAwIH0sCi0gIHsgIDIwMDAsICAxMDAwLCBBVklOREVYX0tFWUZSQU1FLCAwLCAwIH0sCi0gIHsgIDMwMDAsICAyMDAwLCAgICAgICAgICAgICAgICAwLCAwLCAwIH0sCi0gIHsgIDUwMDAsICAzMDAwLCBBVklOREVYX0tFWUZSQU1FLCAwLCAwIH0sCi0gIHsgIDYwMDAsICA0MDAwLCAgICAgICAgICAgICAgICAwLCAwLCAwIH0sCi0gIHsgIDgwMDAsICA1MDAwLCBBVklOREVYX0tFWUZSQU1FLCAwLCAwIH0sCi0gIHsgIDkwMDAsICA2MDAwLCBBVklOREVYX0tFWUZSQU1FLCAwLCAwIH0sCi0gIHsgMTE1MDAsICA3MDAwLCBBVklOREVYX0tFWUZSQU1FLCAwLCAwIH0sCi19OwotCi1zdGF0aWMgY29uc3QgQVZSYXRpb25hbCBrVGltZUJhc2UgPSB7IDEsIDEwMDAgfTsKLQotY2xhc3MgRkZtcGVnQ29tbW9uVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gIEZGbXBlZ0NvbW1vblRlc3QoKTsKLSAgdmlydHVhbCB+RkZtcGVnQ29tbW9uVGVzdCgpOwotCi0gcHJvdGVjdGVkOgotICBBVlN0cmVhbSBzdHJlYW1fOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihGRm1wZWdDb21tb25UZXN0KTsKLX07Ci0KLXN0YXRpYyBib29sIEluaXRGRm1wZWcoKSB7Ci0gIHN0YXRpYyBib29sIGluaXRpYWxpemVkID0gZmFsc2U7Ci0gIGlmIChpbml0aWFsaXplZCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIEZpbGVQYXRoIHBhdGg7Ci0gIFBhdGhTZXJ2aWNlOjpHZXQoYmFzZTo6RElSX01PRFVMRSwgJnBhdGgpOwotICByZXR1cm4gbWVkaWE6OkluaXRpYWxpemVNZWRpYUxpYnJhcnkocGF0aCk7Ci19Ci0KLUZGbXBlZ0NvbW1vblRlc3Q6OkZGbXBlZ0NvbW1vblRlc3QoKSB7Ci0gIENIRUNLKEluaXRGRm1wZWcoKSk7Ci0gIHN0cmVhbV8udGltZV9iYXNlID0ga1RpbWVCYXNlOwotICBzdHJlYW1fLmluZGV4X2VudHJpZXMgPSBrSW5kZXhFbnRyaWVzOwotICBzdHJlYW1fLmluZGV4X2VudHJpZXNfYWxsb2NhdGVkX3NpemUgPSBzaXplb2Yoa0luZGV4RW50cmllcyk7Ci0gIHN0cmVhbV8ubmJfaW5kZXhfZW50cmllcyA9IGFycmF5c2l6ZShrSW5kZXhFbnRyaWVzKTsKLX0KLQotRkZtcGVnQ29tbW9uVGVzdDo6fkZGbXBlZ0NvbW1vblRlc3QoKSB7fQotCi1URVNUX0YoRkZtcGVnQ29tbW9uVGVzdCwgVGVzdFRpbWVCYXNlQ29udmVyc2lvbnMpIHsKLSAgaW50NjQgdGVzdF9kYXRhW11bNV0gPSB7Ci0gICAgezEsIDIsIDEsIDUwMDAwMCwgMSB9LAotICAgIHsxLCAzLCAxLCAzMzMzMzMsIDEgfSwKLSAgICB7MSwgMywgMiwgNjY2NjY3LCAyIH0sCi0gIH07Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheXNpemUodGVzdF9kYXRhKTsgKytpKSB7Ci0gICAgU0NPUEVEX1RSQUNFKGkpOwotCi0gICAgQVZSYXRpb25hbCB0aW1lX2Jhc2U7Ci0gICAgdGltZV9iYXNlLm51bSA9IHN0YXRpY19jYXN0PGludD4odGVzdF9kYXRhW2ldWzBdKTsKLSAgICB0aW1lX2Jhc2UuZGVuID0gc3RhdGljX2Nhc3Q8aW50Pih0ZXN0X2RhdGFbaV1bMV0pOwotCi0gICAgVGltZURlbHRhIHRpbWVfZGVsdGEgPSBDb252ZXJ0RnJvbVRpbWVCYXNlKHRpbWVfYmFzZSwgdGVzdF9kYXRhW2ldWzJdKTsKLQotICAgIEVYUEVDVF9FUSh0aW1lX2RlbHRhLkluTWljcm9zZWNvbmRzKCksIHRlc3RfZGF0YVtpXVszXSk7Ci0gICAgRVhQRUNUX0VRKENvbnZlcnRUb1RpbWVCYXNlKHRpbWVfYmFzZSwgdGltZV9kZWx0YSksIHRlc3RfZGF0YVtpXVs0XSk7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmZtcGVnL2ZmbXBlZ19yZWdyZXNzaW9uX3Rlc3RzLmNjIGIvc3JjL21lZGlhL2ZmbXBlZy9mZm1wZWdfcmVncmVzc2lvbl90ZXN0cy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwZDA4NC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmZtcGVnL2ZmbXBlZ19yZWdyZXNzaW9uX3Rlc3RzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzY3ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0vLwotLy8gUmVncmVzc2lvbiB0ZXN0cyBmb3IgRkZtcGVnLiAgU2VjdXJpdHkgdGVzdCBmaWxlcyBjYW4gYmUgZm91bmQgaW4gdGhlCi0vLyBpbnRlcm5hbCBtZWRpYSB0ZXN0IGRhdGEgZGlyZWN0b3J5OgotLy8KLS8vICAgIHN2bjovL3N2bi5jaHJvbWl1bS5vcmcvY2hyb21lLWludGVybmFsL3RydW5rL2RhdGEvbWVkaWEvc2VjdXJpdHkvCi0vLwotLy8gU2ltcGx5IGFkZCB0aGUgY3VzdG9tX2RlcCBiZWxvdyB0byB5b3VyIGdjbGllbnQgYW5kIHN5bmM6Ci0vLwotLy8gICAgInNyYy9tZWRpYS90ZXN0L2RhdGEvc2VjdXJpdHkiOgotLy8gICAgICAgICJzdm46Ly9jaHJvbWUtc3ZuL2Nocm9tZS1pbnRlcm5hbC90cnVuay9kYXRhL21lZGlhL3NlY3VyaXR5IgotLy8KLS8vIE1hbnkgb2YgdGhlIGZpbGVzIGhlcmUgZG8gbm90IGNhdXNlIGlzc3VlcyBvdXRzaWRlIG9mIHRvb2xpbmcsIHNvIHlvdSdsbCBuZWVkCi0vLyB0byBydW4gdGhpcyB0ZXN0IHVuZGVyIEFTQU4sIFRTQU4sIGFuZCBWYWxncmluZCB0byBlbnN1cmUgdGhhdCBhbGwgaXNzdWVzIGFyZQotLy8gY2F1Z2h0LgotLy8KLS8vIFRlc3QgY2FzZXMgbGFiZWxlZCBGTEFLWSBtYXkgbm90IGFsd2F5cyBwYXNzLCBidXQgdGhleSBzaG91bGQgbmV2ZXIgY3Jhc2ggb3IKLS8vIGNhdXNlIGFueSBraW5kIG9mIHdhcm5pbmdzIG9yIGVycm9ycyB1bmRlciB0b29saW5nLgotLy8KLS8vIEZyYW1lIGhhc2hlcyBtdXN0IGJlIGdlbmVyYXRlZCB3aXRoIC0tdmlkZW8tdGhyZWFkcz0xIGZvciBjb3JyZWN0bmVzcy4KLS8vCi0vLyBLbm93biBpc3N1ZXM6Ci0vLyAgICBDcjQ3MzI1IHdpbGwgZ2VuZXJhdGUgYW4gVW5pbml0VmFsdWUgZXJyb3IgdW5kZXIgVmFsZ3JpbmQgaW5zaWRlIG9mIHRoZQotLy8gICAgTUQ1IGhhc2hpbmcgY29kZS4gIFRoZSBlcnJvciBvY2N1cnMgZHVlIHRvIHNvbWUgcHJvYmxlbWF0aWMgZXJyb3IKLS8vICAgIHJlc2lsZW5jZSBjb2RlIGZvciBIMjY0IGluc2lkZSBvZiBGRm1wZWcuICBTZWUgaHR0cDovL2NyYnVnLmNvbS8xMTkwMjAKLS8vCi0vLyAgICBTb21lIE9HRyBmaWxlcyBsZWFrIH4zMCBieXRlcyBvZiBtZW1vcnksIHVwc3RyZWFtIHRyYWNraW5nIGJ1ZzoKLS8vICAgIGh0dHBzOi8vZmZtcGVnLm9yZy90cmFjL2ZmbXBlZy90aWNrZXQvMTI0NAotLy8KLS8vICAgIFNvbWUgT0dHIGZpbGVzIGxlYWsgaHVuZHJlZHMgb2Yga2lsb2J5dGVzIG9mIG1lbW9yeSwgdXBzdHJlYW0gYnVnOgotLy8gICAgaHR0cHM6Ly9mZm1wZWcub3JnL3RyYWMvZmZtcGVnL3RpY2tldC8xOTMxCi0KLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL3BpcGVsaW5lX2ludGVncmF0aW9uX3Rlc3RfYmFzZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS90ZXN0X2RhdGFfdXRpbC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1zdHJ1Y3QgUmVncmVzc2lvblRlc3REYXRhIHsKLSAgUmVncmVzc2lvblRlc3REYXRhKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBQaXBlbGluZVN0YXR1cyBpbml0X3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lU3RhdHVzIGVuZF9zdGF0dXMsIGNvbnN0IGNoYXIqIHZpZGVvX21kNSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGF1ZGlvX21kNSkKLSAgICAgIDogdmlkZW9fbWQ1KHZpZGVvX21kNSksCi0gICAgICAgIGF1ZGlvX21kNShhdWRpb19tZDUpLAotICAgICAgICBmaWxlbmFtZShmaWxlbmFtZSksCi0gICAgICAgIGluaXRfc3RhdHVzKGluaXRfc3RhdHVzKSwKLSAgICAgICAgZW5kX3N0YXR1cyhlbmRfc3RhdHVzKSB7Ci0gIH0KLQotICBjb25zdCBjaGFyKiB2aWRlb19tZDU7Ci0gIGNvbnN0IGNoYXIqIGF1ZGlvX21kNTsKLSAgY29uc3QgY2hhciogZmlsZW5hbWU7Ci0gIFBpcGVsaW5lU3RhdHVzIGluaXRfc3RhdHVzOwotICBQaXBlbGluZVN0YXR1cyBlbmRfc3RhdHVzOwotfTsKLQotLy8gVXNlZCBmb3IgdGVzdHMgd2hpY2gganVzdCBuZWVkIHRvIHJ1biB3aXRob3V0IGNyYXNoaW5nIG9yIHRvb2xpbmcgZXJyb3JzLCBidXQKLS8vIHdoaWNoIG1heSBoYXZlIHVuZGVmaW5lZCBiZWhhdmlvciBmb3IgaGFzaGluZywgZXRjLgotc3RydWN0IEZsYWt5UmVncmVzc2lvblRlc3REYXRhIHsKLSAgRmxha3lSZWdyZXNzaW9uVGVzdERhdGEoY29uc3QgY2hhciogZmlsZW5hbWUpCi0gICAgICA6IGZpbGVuYW1lKGZpbGVuYW1lKSB7Ci0gIH0KLQotICBjb25zdCBjaGFyKiBmaWxlbmFtZTsKLX07Ci0KLWNsYXNzIEZGbXBlZ1JlZ3Jlc3Npb25UZXN0Ci0gICAgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxSZWdyZXNzaW9uVGVzdERhdGE+LAotICAgICAgcHVibGljIFBpcGVsaW5lSW50ZWdyYXRpb25UZXN0QmFzZSB7Ci19OwotCi1jbGFzcyBGbGFreUZGbXBlZ1JlZ3Jlc3Npb25UZXN0Ci0gICAgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxGbGFreVJlZ3Jlc3Npb25UZXN0RGF0YT4sCi0gICAgICBwdWJsaWMgUGlwZWxpbmVJbnRlZ3JhdGlvblRlc3RCYXNlIHsKLX07Ci0KLSNkZWZpbmUgRkZNUEVHX1RFU1RfQ0FTRShuYW1lLCBmbiwgaW5pdF9zdGF0dXMsIGVuZF9zdGF0dXMsIHZpZGVvX21kNSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21kNSkgXAotICAgIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKG5hbWUsIEZGbXBlZ1JlZ3Jlc3Npb25UZXN0LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGluZzo6VmFsdWVzKFJlZ3Jlc3Npb25UZXN0RGF0YShmbiwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9zdGF0dXMsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9zdGF0dXMsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvX21kNSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbWQ1KSkpOwotCi0jZGVmaW5lIEZMQUtZX0ZGTVBFR19URVNUX0NBU0UobmFtZSwgZm4pIFwKLSAgICBJTlNUQU5USUFURV9URVNUX0NBU0VfUChGTEFLWV8jI25hbWUsIEZsYWt5RkZtcGVnUmVncmVzc2lvblRlc3QsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpWYWx1ZXMoRmxha3lSZWdyZXNzaW9uVGVzdERhdGEoZm4pKSk7Ci0KLS8vIFRlc3QgY2FzZXMgZnJvbSBpc3N1ZXMuCi1GRk1QRUdfVEVTVF9DQVNFKENyNDczMjUsICJzZWN1cml0eS80NzMyNS5tcDQiLCBQSVBFTElORV9PSywgUElQRUxJTkVfT0ssCi0gICAgICAgICAgICAgICAgICIyYTdhOTM4YzZiNTk3OTYyMWNlYzk5OGYwMmQ5YmJiNiIsCi0gICAgICAgICAgICAgICAgICJlZmJjNjNhODUwYzlmOGY1MTk0MmY2YTYwMjllYjAwZiIpOwotRkZNUEVHX1RFU1RfQ0FTRShDcjQ3NzYxLCAiY29udGVudC9jcmJ1ZzQ3NzYxLm9nZyIsIFBJUEVMSU5FX09LLCBQSVBFTElORV9PSywKLSAgICAgICAgICAgICAgICAga051bGxIYXNoLAotICAgICAgICAgICAgICAgICAiZjQ1YjlkNzU1NmYzOWRkODExNzAwZWM3MmNiNzE0ODMiKTsKLUZGTVBFR19URVNUX0NBU0UoQ3I1MDA0NSwgImNvbnRlbnQvY3JidWc1MDA0NS5tcDQiLCBQSVBFTElORV9PSywgUElQRUxJTkVfT0ssCi0gICAgICAgICAgICAgICAgICJjMzQ1ZTllZjllYmZjNmJmYmNiZTNmMGRkYzMxMjViYSIsCi0gICAgICAgICAgICAgICAgICI3M2Q2NWQ5Y2M2Y2UyNTA2MGI3NTEwYmQ3NDY3OGMyNiIpOwotRkZNUEVHX1RFU1RfQ0FTRShDcjYyMTI3LCAiY29udGVudC9jcmJ1ZzYyMTI3LndlYm0iLCBQSVBFTElORV9FUlJPUl9ERUNPREUsCi0gICAgICAgICAgICAgICAgIFBJUEVMSU5FX0VSUk9SX0RFQ09ERSwgImQ0MWQ4Y2Q5OGYwMGIyMDRlOTgwMDk5OGVjZjg0MjdlIiwKLSAgICAgICAgICAgICAgICAga051bGxIYXNoKTsKLUZGTVBFR19URVNUX0NBU0UoQ3I5MzYyMCwgInNlY3VyaXR5LzkzNjIwLm9nZyIsIFBJUEVMSU5FX09LLCBQSVBFTElORV9PSywKLSAgICAgICAgICAgICAgICAga051bGxIYXNoLAotICAgICAgICAgICAgICAgICAiMGNmZjI1MmNkNDY4NjdkMjZjNDJhOTZlNmEyZTIzNzYiKTsKLUZGTVBFR19URVNUX0NBU0UoQ3IxMDA0OTIsICJzZWN1cml0eS8xMDA0OTIud2VibSIsIERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAgICAgREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVELCBrTnVsbEhhc2gsIGtOdWxsSGFzaCk7Ci1GRk1QRUdfVEVTVF9DQVNFKENyMTAwNTQzLCAic2VjdXJpdHkvMTAwNTQzLndlYm0iLCBQSVBFTElORV9PSywgUElQRUxJTkVfT0ssCi0gICAgICAgICAgICAgICAgICJjMTY2OTFjYzkxNzhkYjNhZGJmN2U1NjJjYWRjZDZlNiIsCi0gICAgICAgICAgICAgICAgICI4MTZkOWE3NzJhNDQ5YmMyOWY2NWY1ODI0NGVlMDRjOSIpOwotRkZNUEVHX1RFU1RfQ0FTRShDcjEwMTQ1OCwgInNlY3VyaXR5LzEwMTQ1OC53ZWJtIiwgREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICBERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQsIGtOdWxsSGFzaCwga051bGxIYXNoKTsKLUZGTVBFR19URVNUX0NBU0UoQ3IxMDg0MTYsICJzZWN1cml0eS8xMDg0MTYud2VibSIsIFBJUEVMSU5FX09LLCBQSVBFTElORV9PSywKLSAgICAgICAgICAgICAgICAgIjVjYjNhOTM0Nzk1Y2Q1NTI3NTNkZWM3Njg3OTI4MjkxIiwKLSAgICAgICAgICAgICAgICAgIjNlNTc2YzIxZjgzZjNjMDA3MTlkYmU2Mjk5OGQ3MWNiIik7Ci1GRk1QRUdfVEVTVF9DQVNFKENyMTEwODQ5LCAic2VjdXJpdHkvMTEwODQ5Lm1rdiIsCi0gICAgICAgICAgICAgICAgIERFTVVYRVJfRVJST1JfTk9fU1VQUE9SVEVEX1NUUkVBTVMsCi0gICAgICAgICAgICAgICAgIERFTVVYRVJfRVJST1JfTk9fU1VQUE9SVEVEX1NUUkVBTVMsIGtOdWxsSGFzaCwga051bGxIYXNoKTsKLUZGTVBFR19URVNUX0NBU0UoQ3IxMTIzODQsICJzZWN1cml0eS8xMTIzODQud2VibSIsCi0gICAgICAgICAgICAgICAgIERFTVVYRVJfRVJST1JfQ09VTERfTk9UX1BBUlNFLCBERU1VWEVSX0VSUk9SX0NPVUxEX05PVF9QQVJTRSwKLSAgICAgICAgICAgICAgICAga051bGxIYXNoLCBrTnVsbEhhc2gpOwotRkZNUEVHX1RFU1RfQ0FTRShDcjExMjY3MCwgInNlY3VyaXR5LzExMjY3MC5tcDQiLCBQSVBFTElORV9FUlJPUl9ERUNPREUsCi0gICAgICAgICAgICAgICAgIFBJUEVMSU5FX0VSUk9SX0RFQ09ERSwga051bGxIYXNoLAotICAgICAgICAgICAgICAgICAiNTlhZGIyNGVmM2NkYmUwMjk3ZjA1YjM5NTgyNzQ1M2YiKTsKLUZGTVBFR19URVNUX0NBU0UoQ3IxMTI5NzYsICJzZWN1cml0eS8xMTI5NzYub2dnIiwgUElQRUxJTkVfT0ssCi0gICAgICAgICAgICAgICAgIFBJUEVMSU5FX0VSUk9SX0RFQ09ERSwga051bGxIYXNoLAotICAgICAgICAgICAgICAgICAiZWY3OWY3YzU4MDU1NjE5MDg4MDVlYjBiYjcwOTdiYjQiKTsKLUZGTVBFR19URVNUX0NBU0UoQ3IxMTY5MjcsICJzZWN1cml0eS8xMTY5Mjcub2d2IiwgREVNVVhFUl9FUlJPUl9DT1VMRF9OT1RfT1BFTiwKLSAgICAgICAgICAgICAgICAgREVNVVhFUl9FUlJPUl9DT1VMRF9OT1RfT1BFTiwga051bGxIYXNoLCBrTnVsbEhhc2gpOwotRkZNUEVHX1RFU1RfQ0FTRShDcjExNzkxMiwgInNlY3VyaXR5LzExNzkxMi53ZWJtIiwgREVNVVhFUl9FUlJPUl9DT1VMRF9OT1RfT1BFTiwKLSAgICAgICAgICAgICAgICAgREVNVVhFUl9FUlJPUl9DT1VMRF9OT1RfT1BFTiwga051bGxIYXNoLCBrTnVsbEhhc2gpOwotRkZNUEVHX1RFU1RfQ0FTRShDcjEyMzQ4MSwgInNlY3VyaXR5LzEyMzQ4MS5vZ3YiLCBQSVBFTElORV9PSywKLSAgICAgICAgICAgICAgICAgUElQRUxJTkVfT0ssICJlNmRkODUzZmNiZDc0NmM4YmIyYWIyYjhmYzM3NmZjNyIsCi0gICAgICAgICAgICAgICAgICJjOTZhMTY2YTA5MDYxY2E5NDIwMjkwM2Q3ODI0Y2YwNCIpOwotRkZNUEVHX1RFU1RfQ0FTRShDcjEzMjc3OSwgInNlY3VyaXR5LzEzMjc3OS53ZWJtIiwKLSAgICAgICAgICAgICAgICAgREVNVVhFUl9FUlJPUl9DT1VMRF9OT1RfUEFSU0UsIERFTVVYRVJfRVJST1JfQ09VTERfTk9UX1BBUlNFLAotICAgICAgICAgICAgICAgICBrTnVsbEhhc2gsIGtOdWxsSGFzaCk7Ci1GRk1QRUdfVEVTVF9DQVNFKENyMTQwMTY1LCAic2VjdXJpdHkvMTQwMTY1Lm9nZyIsIFBJUEVMSU5FX0VSUk9SX0RFQ09ERSwKLSAgICAgICAgICAgICAgICAgUElQRUxJTkVfRVJST1JfREVDT0RFLCBrTnVsbEhhc2gsCi0gICAgICAgICAgICAgICAgICJiZDQyNzU3ZTQyYmRhZGExOGNiOTQ0MWVlNGVmODMxMyIpOwotRkZNUEVHX1RFU1RfQ0FTRShDcjE0MDY0NywgInNlY3VyaXR5LzE0MDY0Ny5vZ3YiLCBERU1VWEVSX0VSUk9SX0NPVUxEX05PVF9PUEVOLAotICAgICAgICAgICAgICAgICBERU1VWEVSX0VSUk9SX0NPVUxEX05PVF9PUEVOLCBrTnVsbEhhc2gsIGtOdWxsSGFzaCk7Ci1GRk1QRUdfVEVTVF9DQVNFKENyMTQyNzM4LCAiY29udGVudC9jcmJ1ZzE0MjczOC5vZ2ciLCBQSVBFTElORV9PSywgUElQRUxJTkVfT0ssCi0gICAgICAgICAgICAgICAgIGtOdWxsSGFzaCwKLSAgICAgICAgICAgICAgICAgIjAzYTk1OTFlNWI1OTZlYjg0OGZlZWFmZDc2OTNmMzcxIik7Ci1GRk1QRUdfVEVTVF9DQVNFKENyMTUyNjkxLCAic2VjdXJpdHkvMTUyNjkxLm1wMyIsIFBJUEVMSU5FX0VSUk9SX0RFQ09ERSwKLSAgICAgICAgICAgICAgICAgUElQRUxJTkVfRVJST1JfREVDT0RFLCBrTnVsbEhhc2gsCi0gICAgICAgICAgICAgICAgICI1OWFkYjI0ZWYzY2RiZTAyOTdmMDViMzk1ODI3NDUzZiIpOwotRkZNUEVHX1RFU1RfQ0FTRShDcjE2MTYzOSwgInNlY3VyaXR5LzE2MTYzOS5tNGEiLCBQSVBFTElORV9PSywgUElQRUxJTkVfT0ssCi0gICAgICAgICAgICAgICAgIGtOdWxsSGFzaCwgIjk3YWUyZmEyYTJlOWZmM2MyY2YxN2JlOTZiMDhiYmU4Iik7Ci0KLS8vIEdlbmVyYWwgTUtWIHRlc3QgY2FzZXMuCi1GRk1QRUdfVEVTVF9DQVNFKE1LVl8wLCAic2VjdXJpdHkvbmVzdGVkX3RhZ3NfbGFuZy5ta2EuNjI3LjYyOCIsIFBJUEVMSU5FX09LLAotICAgICAgICAgICAgICAgICBQSVBFTElORV9FUlJPUl9ERUNPREUsIGtOdWxsSGFzaCwKLSAgICAgICAgICAgICAgICAgIjNmYzRlOGVmMjEyZGYwOGM2MWFjY2UzZGIzNGIyZDA5Iik7Ci1GRk1QRUdfVEVTVF9DQVNFKE1LVl8xLCAic2VjdXJpdHkvbmVzdGVkX3RhZ3NfbGFuZy5ta2EuNjY3LjYyOCIsIFBJUEVMSU5FX09LLAotICAgICAgICAgICAgICAgICBQSVBFTElORV9FUlJPUl9ERUNPREUsIGtOdWxsSGFzaCwKLSAgICAgICAgICAgICAgICAgIjJmNWFkM2U3ZGQyNWZhNWMwZThmMjY4Nzk5NTNlZjBmIik7Ci0KLS8vIEdlbmVyYWwgTVA0IHRlc3QgY2FzZXMuCi1GRk1QRUdfVEVTVF9DQVNFKE1QNF8wLCAic2VjdXJpdHkvYWFjLjEwNDE5Lm1wNCIsIERFTVVYRVJfRVJST1JfQ09VTERfTk9UX09QRU4sCi0gICAgICAgICAgICAgICAgIERFTVVYRVJfRVJST1JfQ09VTERfTk9UX09QRU4sIGtOdWxsSGFzaCwga051bGxIYXNoKTsKLUZGTVBFR19URVNUX0NBU0UoTVA0XzEsICJzZWN1cml0eS9jbG9ja2gyNjRhYWNfMjAwMDIxODg5Lm1wNCIsCi0gICAgICAgICAgICAgICAgIERFTVVYRVJfRVJST1JfQ09VTERfTk9UX09QRU4sIERFTVVYRVJfRVJST1JfQ09VTERfTk9UX09QRU4sCi0gICAgICAgICAgICAgICAgIGtOdWxsSGFzaCwga051bGxIYXNoKTsKLUZGTVBFR19URVNUX0NBU0UoTVA0XzIsICJzZWN1cml0eS9jbG9ja2gyNjRhYWNfMjAwNzAxMjU3Lm1wNCIsIFBJUEVMSU5FX09LLAotICAgICAgICAgICAgICAgICBQSVBFTElORV9PSywga051bGxIYXNoLCAiZDQxZDhjZDk4ZjAwYjIwNGU5ODAwOTk4ZWNmODQyN2UiKTsKLUZGTVBFR19URVNUX0NBU0UoTVA0XzUsICJzZWN1cml0eS9jbG9ja2gyNjRhYWNfMzAyMjUwMC5tcDQiLAotICAgICAgICAgICAgICAgICBERU1VWEVSX0VSUk9SX05PX1NVUFBPUlRFRF9TVFJFQU1TLAotICAgICAgICAgICAgICAgICBERU1VWEVSX0VSUk9SX05PX1NVUFBPUlRFRF9TVFJFQU1TLCBrTnVsbEhhc2gsIGtOdWxsSGFzaCk7Ci1GRk1QRUdfVEVTVF9DQVNFKE1QNF82LCAic2VjdXJpdHkvY2xvY2toMjY0YWFjXzM0NDI4OS5tcDQiLCBQSVBFTElORV9PSywKLSAgICAgICAgICAgICAgICAgUElQRUxJTkVfT0ssIGtOdWxsSGFzaCwga051bGxIYXNoKTsKLUZGTVBFR19URVNUX0NBU0UoTVA0XzcsICJzZWN1cml0eS9jbG9ja2gyNjRtcDNfMTg3Njk3Lm1wNCIsCi0gICAgICAgICAgICAgICAgIERFTVVYRVJfRVJST1JfTk9fU1VQUE9SVEVEX1NUUkVBTVMsCi0gICAgICAgICAgICAgICAgIERFTVVYRVJfRVJST1JfTk9fU1VQUE9SVEVEX1NUUkVBTVMsCi0gICAgICAgICAgICAgICAgIGtOdWxsSGFzaCwga051bGxIYXNoKTsKLUZGTVBFR19URVNUX0NBU0UoTVA0XzgsICJzZWN1cml0eS9oMjY0LjcwNTc2Ny5tcDQiLAotICAgICAgICAgICAgICAgICBERU1VWEVSX0VSUk9SX0NPVUxEX05PVF9QQVJTRSwgREVNVVhFUl9FUlJPUl9DT1VMRF9OT1RfUEFSU0UsCi0gICAgICAgICAgICAgICAgIGtOdWxsSGFzaCwga051bGxIYXNoKTsKLUZGTVBFR19URVNUX0NBU0UoTVA0XzksICJzZWN1cml0eS9zbWNsb2NrbXA0YWFjXzFfMC5tcDQiLAotICAgICAgICAgICAgICAgICBERU1VWEVSX0VSUk9SX0NPVUxEX05PVF9PUEVOLCBERU1VWEVSX0VSUk9SX0NPVUxEX05PVF9PUEVOLAotICAgICAgICAgICAgICAgICBrTnVsbEhhc2gsIGtOdWxsSGFzaCk7Ci1GRk1QRUdfVEVTVF9DQVNFKE1QNF8xMSwgInNlY3VyaXR5L251bGwxLm1wNCIsIFBJUEVMSU5FX09LLCBQSVBFTElORV9PSywKLSAgICAgICAgICAgICAgICAga051bGxIYXNoLCAiNzM5NzE4OGYyMjkyMTE5ODcyNjhmMzllZjVhNDViM2MiKTsKLUZGTVBFR19URVNUX0NBU0UoTVA0XzE2LCAic2VjdXJpdHkvbG9vcGluZzIubW92IiwKLSAgICAgICAgICAgICAgICAgREVNVVhFUl9FUlJPUl9DT1VMRF9OT1RfT1BFTiwgREVNVVhFUl9FUlJPUl9DT1VMRF9OT1RfT1BFTiwKLSAgICAgICAgICAgICAgICAga051bGxIYXNoLCBrTnVsbEhhc2gpOwotCi0vLyBHZW5lcmFsIE9HViB0ZXN0IGNhc2VzLgotRkZNUEVHX1RFU1RfQ0FTRShPR1ZfMSwgInNlY3VyaXR5L291dC4xNjMub2d2IiwgREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICBERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQsIGtOdWxsSGFzaCwga051bGxIYXNoKTsKLUZGTVBFR19URVNUX0NBU0UoT0dWXzIsICJzZWN1cml0eS9vdXQuMzkxLm9ndiIsIERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAgICAgREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVELCBrTnVsbEhhc2gsIGtOdWxsSGFzaCk7Ci1GRk1QRUdfVEVTVF9DQVNFKE9HVl81LCAic2VjdXJpdHkvc21jbG9ja3RoZW9yYV8xXzAub2d2IiwKLSAgICAgICAgICAgICAgICAgREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVELCBERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgIGtOdWxsSGFzaCwga051bGxIYXNoKTsKLUZGTVBFR19URVNUX0NBU0UoT0dWXzcsICJzZWN1cml0eS9zbWNsb2NrdGhlb3JhXzFfMTAyLm9ndiIsCi0gICAgICAgICAgICAgICAgIERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCwgREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICBrTnVsbEhhc2gsIGtOdWxsSGFzaCk7Ci1GRk1QRUdfVEVTVF9DQVNFKE9HVl84LCAic2VjdXJpdHkvc21jbG9ja3RoZW9yYV8xXzEwNC5vZ3YiLAotICAgICAgICAgICAgICAgICBERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQsIERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAgICAga051bGxIYXNoLCBrTnVsbEhhc2gpOwotRkZNUEVHX1RFU1RfQ0FTRShPR1ZfOSwgInNlY3VyaXR5L3NtY2xvY2t0aGVvcmFfMV8xMTAub2d2IiwKLSAgICAgICAgICAgICAgICAgREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVELCBERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgIGtOdWxsSGFzaCwga051bGxIYXNoKTsKLUZGTVBFR19URVNUX0NBU0UoT0dWXzEwLCAic2VjdXJpdHkvc21jbG9ja3RoZW9yYV8xXzE3OS5vZ3YiLAotICAgICAgICAgICAgICAgICBERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQsIERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAgICAga051bGxIYXNoLCBrTnVsbEhhc2gpOwotRkZNUEVHX1RFU1RfQ0FTRShPR1ZfMTEsICJzZWN1cml0eS9zbWNsb2NrdGhlb3JhXzFfMjAub2d2IiwKLSAgICAgICAgICAgICAgICAgREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVELCBERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgIGtOdWxsSGFzaCwga051bGxIYXNoKTsKLUZGTVBFR19URVNUX0NBU0UoT0dWXzEyLCAic2VjdXJpdHkvc21jbG9ja3RoZW9yYV8xXzcyMy5vZ3YiLAotICAgICAgICAgICAgICAgICBERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQsIERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAgICAga051bGxIYXNoLCBrTnVsbEhhc2gpOwotRkZNUEVHX1RFU1RfQ0FTRShPR1ZfMTQsICJzZWN1cml0eS9zbWNsb2NrdGhlb3JhXzJfMTA0MDUub2d2IiwKLSAgICAgICAgICAgICAgICAgREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVELCBERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgIGtOdWxsSGFzaCwga051bGxIYXNoKTsKLUZGTVBFR19URVNUX0NBU0UoT0dWXzE1LCAic2VjdXJpdHkvc21jbG9ja3RoZW9yYV8yXzEwNjE5Lm9ndiIsCi0gICAgICAgICAgICAgICAgIERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCwgREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICBrTnVsbEhhc2gsIGtOdWxsSGFzaCk7Ci1GRk1QRUdfVEVTVF9DQVNFKE9HVl8xNiwgInNlY3VyaXR5L3NtY2xvY2t0aGVvcmFfMl8xMDc1Lm9ndiIsCi0gICAgICAgICAgICAgICAgIERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCwgREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICBrTnVsbEhhc2gsIGtOdWxsSGFzaCk7Ci1GRk1QRUdfVEVTVF9DQVNFKE9HVl8xNywgInNlY3VyaXR5L3ZvcmJpcy40ODIwODYub2d2IiwKLSAgICAgICAgICAgICAgICAgREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVELCBERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgIGtOdWxsSGFzaCwga051bGxIYXNoKTsKLUZGTVBFR19URVNUX0NBU0UoT0dWXzE4LCAic2VjdXJpdHkvd2F2LjcxMS5vZ3YiLCBERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgIERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCwga051bGxIYXNoLCBrTnVsbEhhc2gpOwotRkZNUEVHX1RFU1RfQ0FTRShPR1ZfMTksICJzZWN1cml0eS9udWxsMS5vZ3YiLCBERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgIERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCwga051bGxIYXNoLCBrTnVsbEhhc2gpOwotRkZNUEVHX1RFU1RfQ0FTRShPR1ZfMjAsICJzZWN1cml0eS9udWxsMi5vZ3YiLCBERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgIERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCwga051bGxIYXNoLCBrTnVsbEhhc2gpOwotRkZNUEVHX1RFU1RfQ0FTRShPR1ZfMjEsICJzZWN1cml0eS9hc3NlcnQxLm9ndiIsIERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAgICAgREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVELCBrTnVsbEhhc2gsIGtOdWxsSGFzaCk7Ci1GRk1QRUdfVEVTVF9DQVNFKE9HVl8yMiwgInNlY3VyaXR5L2Fzc2VydDIub2d2IiwgREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICBERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQsIGtOdWxsSGFzaCwga051bGxIYXNoKTsKLQotLy8gR2VuZXJhbCBXZWJNIHRlc3QgY2FzZXMuCi1GRk1QRUdfVEVTVF9DQVNFKFdFQk1fMSwgInNlY3VyaXR5L25vLWJ1Zy53ZWJtIiwgUElQRUxJTkVfT0ssIFBJUEVMSU5FX09LLAotICAgICAgICAgICAgICAgICAiMzllOTI3MDBjYmI3NzQ3OGZkNjNmNDlkYjg1NWU3ZTUiLCBrTnVsbEhhc2gpOwotRkZNUEVHX1RFU1RfQ0FTRShXRUJNXzIsICJzZWN1cml0eS91bmluaXRpYWxpemUud2VibSIsIFBJUEVMSU5FX0VSUk9SX0RFQ09ERSwKLSAgICAgICAgICAgICAgICAgUElQRUxJTkVfRVJST1JfREVDT0RFLCBrTnVsbEhhc2gsIGtOdWxsSGFzaCk7Ci1GRk1QRUdfVEVTVF9DQVNFKFdFQk1fMywgInNlY3VyaXR5L291dC53ZWJtLjEzOTc3MS4yOTY1IiwKLSAgICAgICAgICAgICAgICAgREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVELCBERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgIGtOdWxsSGFzaCwga051bGxIYXNoKTsKLUZGTVBFR19URVNUX0NBU0UoV0VCTV80LCAic2VjdXJpdHkvb3V0LndlYm0uNjg3OTguMTkyOSIsCi0gICAgICAgICAgICAgICAgIERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCwgREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICBrTnVsbEhhc2gsIGtOdWxsSGFzaCk7Ci1GRk1QRUdfVEVTVF9DQVNFKFdFQk1fNSwgImNvbnRlbnQvZnJhbWVfc2l6ZV9jaGFuZ2Uud2VibSIsIFBJUEVMSU5FX09LLAotICAgICAgICAgICAgICAgICBQSVBFTElORV9PSywgImQ4ZmNmMjg5NmI3NDAwYTIyNjFiYWM5ZTllYTkzMGY4Iiwga051bGxIYXNoKTsKLQotLy8gQXVkaW8gRnVuY3Rpb25hbCBUZXN0cwotRkZNUEVHX1RFU1RfQ0FTRShBVURJT19HQU1JTkdfMCwgImNvbnRlbnQvZ2FtaW5nL2FfMjIwXzAwLm1wMyIsIFBJUEVMSU5FX09LLAotICAgICAgICAgICAgICAgICBQSVBFTElORV9PSywga051bGxIYXNoLCAiM2MyZTAzNTY5ZTJhZjgzNDE1YThmMzIwNjU0MjVmOGMiKTsKLUZGTVBFR19URVNUX0NBU0UoQVVESU9fR0FNSU5HXzEsICJjb250ZW50L2dhbWluZy9hXzIyMF8wMF92Mi5vZ2ciLCBQSVBFTElORV9PSywKLSAgICAgICAgICAgICAgICAgUElQRUxJTkVfT0ssIGtOdWxsSGFzaCwgIjJmYTBlOWZjYTQ4NzU5YTdkZTFjMjI0MThmYmE3ZWEwIik7Ci1GRk1QRUdfVEVTVF9DQVNFKEFVRElPX0dBTUlOR18yLCAiY29udGVudC9nYW1pbmcvYWlfbGFzZXIxLm9nZyIsIFBJUEVMSU5FX09LLAotICAgICAgICAgICAgICAgICBQSVBFTElORV9PSywga051bGxIYXNoLCAiZDRmMzMxYjBmN2YwNGU5NGNkNzBmMDM3YTEwOTFjMmIiKTsKLUZGTVBFR19URVNUX0NBU0UoQVVESU9fR0FNSU5HXzMsICJjb250ZW50L2dhbWluZy9haV9sYXNlcjIub2dnIiwgUElQRUxJTkVfT0ssCi0gICAgICAgICAgICAgICAgIFBJUEVMSU5FX09LLCBrTnVsbEhhc2gsICI3YjBlY2NiNjUxZTU1NzI3MTFmOWM4ODI2Y2MxNGMzYyIpOwotRkZNUEVHX1RFU1RfQ0FTRShBVURJT19HQU1JTkdfNCwgImNvbnRlbnQvZ2FtaW5nL2FpX2xhc2VyMy5vZ2ciLCBQSVBFTElORV9PSywKLSAgICAgICAgICAgICAgICAgUElQRUxJTkVfT0ssIGtOdWxsSGFzaCwgImNkOTc3YTJkZDRmYTU3MGYxYTczOTJmYzk5NDhmMTg0Iik7Ci1GRk1QRUdfVEVTVF9DQVNFKEFVRElPX0dBTUlOR181LCAiY29udGVudC9nYW1pbmcvYWlfbGFzZXI0Lm9nZyIsIFBJUEVMSU5FX09LLAotICAgICAgICAgICAgICAgICBQSVBFTElORV9PSywga051bGxIYXNoLCAiMTU1Y2FhODVjODc4YWJhZTQzNDI4ZjQyNGNkYzg4NDgiKTsKLUZGTVBFR19URVNUX0NBU0UoQVVESU9fR0FNSU5HXzYsICJjb250ZW50L2dhbWluZy9haV9sYXNlcjUub2dnIiwgUElQRUxJTkVfT0ssCi0gICAgICAgICAgICAgICAgIFBJUEVMSU5FX09LLCBrTnVsbEhhc2gsICJjMGY3NzY4YWMzYzcyYWFmMjZhYzdiNjA3MGQyMzkyYSIpOwotRkZNUEVHX1RFU1RfQ0FTRShBVURJT19HQU1JTkdfNywgImNvbnRlbnQvZ2FtaW5nL2Zvb3RzdGVwMS5vZ2ciLCBQSVBFTElORV9PSywKLSAgICAgICAgICAgICAgICAgUElQRUxJTkVfT0ssIGtOdWxsSGFzaCwgIjQ2ZmFiM2RiNjI1ZjBmOWI2NTViOWFmZmJiMWZmZjI1Iik7Ci1GRk1QRUdfVEVTVF9DQVNFKEFVRElPX0dBTUlOR184LCAiY29udGVudC9nYW1pbmcvZm9vdHN0ZXAzLm9nZyIsIFBJUEVMSU5FX09LLAotICAgICAgICAgICAgICAgICBQSVBFTElORV9PSywga051bGxIYXNoLCAiMzhiODRiMDRlYjNmMTk5M2ViOTdiNWQ0NmZhMmE0NDQiKTsKLUZGTVBFR19URVNUX0NBU0UoQVVESU9fR0FNSU5HXzksICJjb250ZW50L2dhbWluZy9mb290c3RlcDQub2dnIiwgUElQRUxJTkVfT0ssCi0gICAgICAgICAgICAgICAgIFBJUEVMSU5FX09LLCBrTnVsbEhhc2gsICI3YTM5MjdjMzAyNmZhOTY1NjJiNmMxOTk1MGRmMGJlMCIpOwotRkZNUEVHX1RFU1RfQ0FTRShBVURJT19HQU1JTkdfMTAsICJjb250ZW50L2dhbWluZy9sYXNlcjEub2dnIiwgUElQRUxJTkVfT0ssCi0gICAgICAgICAgICAgICAgIFBJUEVMSU5FX09LLCBrTnVsbEhhc2gsICJkMjc1MGYxOGZmY2U1MmYzNzYzZGFiYTUyMTE3YjY2YiIpOwotRkZNUEVHX1RFU1RfQ0FTRShBVURJT19HQU1JTkdfMTEsICJjb250ZW50L2dhbWluZy9sYXNlcjIub2dnIiwgUElQRUxJTkVfT0ssCi0gICAgICAgICAgICAgICAgIFBJUEVMSU5FX09LLCBrTnVsbEhhc2gsICJiYjM5OGRiOWIyODczZTAzYTA2ZDQ4NmQwYTZmNmQzYSIpOwotRkZNUEVHX1RFU1RfQ0FTRShBVURJT19HQU1JTkdfMTIsICJjb250ZW50L2dhbWluZy9sYXNlcjMub2dnIiwgUElQRUxJTkVfT0ssCi0gICAgICAgICAgICAgICAgIFBJUEVMSU5FX09LLCBrTnVsbEhhc2gsICJkZWI5OTZkODE3ZTE1NWVjZDU2NzY2NzQ5ZDg1NmU3NCIpOwotRkZNUEVHX1RFU1RfQ0FTRShBVURJT19HQU1JTkdfMTMsICJjb250ZW50L2dhbWluZy9sZWcxLm9nZyIsIFBJUEVMSU5FX09LLAotICAgICAgICAgICAgICAgICBQSVBFTElORV9PSywga051bGxIYXNoLCAiNTU2ZTMzOWZkMGQxYmRjYjJkOThmNjkwNjM2MTQwNjciKTsKLUZGTVBFR19URVNUX0NBU0UoQVVESU9fR0FNSU5HXzE0LCAiY29udGVudC9nYW1pbmcvbGVnMi5vZ2ciLCBQSVBFTElORV9PSywKLSAgICAgICAgICAgICAgICAgUElQRUxJTkVfT0ssIGtOdWxsSGFzaCwgIjMxMzM0NGNjMmMwMmRiNWIyM2UzMzZhOTUyM2IwYzRhIik7Ci1GRk1QRUdfVEVTVF9DQVNFKEFVRElPX0dBTUlOR18xNSwgImNvbnRlbnQvZ2FtaW5nL2xlZzMub2dnIiwgUElQRUxJTkVfT0ssCi0gICAgICAgICAgICAgICAgIFBJUEVMSU5FX09LLCBrTnVsbEhhc2gsICIyNTczMGYzNmVkNTFiYTA3ZWFjY2E5YzJiNjIzNWU2YyIpOwotRkZNUEVHX1RFU1RfQ0FTRShBVURJT19HQU1JTkdfMTYsICJjb250ZW50L2dhbWluZy9sb2NrX29uLm9nZyIsIFBJUEVMSU5FX09LLAotICAgICAgICAgICAgICAgICBQSVBFTElORV9PSywga051bGxIYXNoLCAiOTJhM2FmMmZjMzU5N2U3YWFmNWIwNjc0OGRhZjVkNmEiKTsKLUZGTVBFR19URVNUX0NBU0UoQVVESU9fR0FNSU5HXzE3LCAiY29udGVudC9nYW1pbmcvZW5lbXlfbG9ja19vbi5vZ2ciLAotICAgICAgICAgICAgICAgICBQSVBFTElORV9PSywgUElQRUxJTkVfT0ssIGtOdWxsSGFzaCwKLSAgICAgICAgICAgICAgICAgIjk2NzBkOGY1YTY2OGNmODVmOGFlOGQ2ZjhlMGZkY2RjIik7Ci1GRk1QRUdfVEVTVF9DQVNFKEFVRElPX0dBTUlOR18xOCwgImNvbnRlbnQvZ2FtaW5nL3JvY2tldF9sYXVuY2hlci5tcDMiLAotICAgICAgICAgICAgICAgICBQSVBFTElORV9PSywgUElQRUxJTkVfT0ssIGtOdWxsSGFzaCwKLSAgICAgICAgICAgICAgICAgIjkxMzU0MzIwNjA2NTg0ZjQ0MDQ1MTRkOTE0ZDAxZWUwIik7Ci0KLS8vIEFsbG9jYXRlIGdpZ2FieXRlcyBvZiBtZW1vcnksIGxpa2VseSBjYW4ndCBiZSBydW4gb24gMzJiaXQgbWFjaGluZXMuCi1GRk1QRUdfVEVTVF9DQVNFKEJJR19NRU1fMSwgInNlY3VyaXR5L2JpZ21lbTEubW92IiwKLSAgICAgICAgICAgICAgICAgREVNVVhFUl9FUlJPUl9DT1VMRF9OT1RfT1BFTiwgREVNVVhFUl9FUlJPUl9DT1VMRF9OT1RfT1BFTiwKLSAgICAgICAgICAgICAgICAga051bGxIYXNoLCBrTnVsbEhhc2gpOwotRkZNUEVHX1RFU1RfQ0FTRShCSUdfTUVNXzIsICJzZWN1cml0eS9sb29waW5nMS5tb3YiLAotICAgICAgICAgICAgICAgICBERU1VWEVSX0VSUk9SX0NPVUxEX05PVF9PUEVOLCBERU1VWEVSX0VSUk9SX0NPVUxEX05PVF9PUEVOLAotICAgICAgICAgICAgICAgICBrTnVsbEhhc2gsIGtOdWxsSGFzaCk7Ci1GRk1QRUdfVEVTVF9DQVNFKEJJR19NRU1fNSwgInNlY3VyaXR5L2xvb3Bpbmc1Lm1vdiIsCi0gICAgICAgICAgICAgICAgIERFTVVYRVJfRVJST1JfQ09VTERfTk9UX09QRU4sIERFTVVYRVJfRVJST1JfQ09VTERfTk9UX09QRU4sCi0gICAgICAgICAgICAgICAgIGtOdWxsSGFzaCwga051bGxIYXNoKTsKLUZMQUtZX0ZGTVBFR19URVNUX0NBU0UoQklHX01FTV8zLCAic2VjdXJpdHkvbG9vcGluZzMubW92Iik7Ci1GTEFLWV9GRk1QRUdfVEVTVF9DQVNFKEJJR19NRU1fNCwgInNlY3VyaXR5L2xvb3Bpbmc0Lm1vdiIpOwotCi0vLyBGbGFreSB1bmRlciB0aHJlYWRpbmcgb3IgZm9yIG90aGVyIHJlYXNvbnMuICBQZXIgcmJ1bHRqZSwgbW9zdCBvZiB0aGVzZSB3aWxsCi0vLyBuZXZlciBiZSByZWxpYWJsZSBzaW5jZSBGRm1wZWcgZG9lcyBub3QgZ3VhcmFudGVlIGNvbnNpc3RlbmN5IGluIGVycm9yIGNhc2VzLgotLy8gV2Ugb25seSByZWFsbHkgY2FyZSB0aGF0IHRoZXNlIGRvbid0IGNhdXNlIGNyYXNoZXMgb3IgZXJyb3JzIHVuZGVyIHRvb2xpbmcuCi1GTEFLWV9GRk1QRUdfVEVTVF9DQVNFKENyOTk2NTIsICJzZWN1cml0eS85OTY1Mi53ZWJtIik7Ci1GTEFLWV9GRk1QRUdfVEVTVF9DQVNFKENyMTAwNDY0LCAic2VjdXJpdHkvMTAwNDY0LndlYm0iKTsKLUZMQUtZX0ZGTVBFR19URVNUX0NBU0UoQ3IxMTEzNDIsICJzZWN1cml0eS8xMTEzNDIub2dtIik7Ci1GTEFLWV9GRk1QRUdfVEVTVF9DQVNFKE9HVl8wLCAic2VjdXJpdHkvYmlnX2RpbXMub2d2Iik7Ci1GTEFLWV9GRk1QRUdfVEVTVF9DQVNFKE9HVl8zLCAic2VjdXJpdHkvc21jbG9ja18xXzAub2d2Iik7Ci1GTEFLWV9GRk1QRUdfVEVTVF9DQVNFKE9HVl80LCAic2VjdXJpdHkvc21jbG9jay5vZ3YuMS4wLm9ndiIpOwotRkxBS1lfRkZNUEVHX1RFU1RfQ0FTRShPR1ZfNiwgInNlY3VyaXR5L3NtY2xvY2t0aGVvcmFfMV8xMDAwMC5vZ3YiKTsKLUZMQUtZX0ZGTVBFR19URVNUX0NBU0UoT0dWXzEzLCAic2VjdXJpdHkvc21jbG9ja3RoZW9yYV8xXzc5MC5vZ3YiKTsKLUZMQUtZX0ZGTVBFR19URVNUX0NBU0UoTVA0XzMsICJzZWN1cml0eS9jbG9ja2gyNjRhYWNfMzAwNDEzOTY5Lm1wNCIpOwotRkxBS1lfRkZNUEVHX1RFU1RfQ0FTRShNUDRfNCwgInNlY3VyaXR5L2Nsb2NraDI2NGFhY18zMDEzNTAxMzkubXA0Iik7Ci1GTEFLWV9GRk1QRUdfVEVTVF9DQVNFKE1QNF8xMiwgInNlY3VyaXR5L2Fzc2VydDEubW92Iik7Ci0vLyBOb3QgcmVhbGx5IGZsYWt5LCBidXQgY2FuJ3QgcGFzcyB0aGUgc2VlayB0ZXN0LgotRkxBS1lfRkZNUEVHX1RFU1RfQ0FTRShNUDRfMTAsICJzZWN1cml0eS9udWxsMS5tNGEiKTsKLQotLy8gVmlkZW9zIHdpdGggbWFzc2l2ZSBnYXBzIGJldHdlZW4gZnJhbWUgdGltZXN0YW1wcyB0aGF0IHJlc3VsdCBpbiBsb25nIGhhbmdzCi0vLyB3aXRoIG91ciBwaXBlbGluZS4gIFNob3VsZCBiZSB1bmNvbW1lbnRlZCB3aGVuIHdlIHN1cHBvcnQgY2xvY2tsZXNzIHBsYXliYWNrLgotLy8gRkZNUEVHX1RFU1RfQ0FTRShXRUJNXzAsICJzZWN1cml0eS9tZW1jcHkud2VibSIsIFBJUEVMSU5FX09LLCBQSVBFTElORV9PSywKLS8vICAgICAgICAgICAgICAgICAga051bGxIYXNoLCBrTnVsbEhhc2gpOwotLy8gRkZNUEVHX1RFU1RfQ0FTRShNUDRfMTcsICJzZWN1cml0eS9hc3NlcnQyLm1vdiIsIFBJUEVMSU5FX09LLCBQSVBFTElORV9PSywKLS8vICAgICAgICAgICAgICAgICAga051bGxIYXNoLCBrTnVsbEhhc2gpOwotLy8gRkZNUEVHX1RFU1RfQ0FTRShPR1ZfMjMsICJzZWN1cml0eS9hc3NlcnQyLm9ndiIsIFBJUEVMSU5FX09LLCBQSVBFTElORV9PSywKLS8vICAgICAgICAgICAgICAgICAga051bGxIYXNoLCBrTnVsbEhhc2gpOwotCi1URVNUX1AoRkZtcGVnUmVncmVzc2lvblRlc3QsIEJhc2ljUGxheWJhY2spIHsKLSAgaWYgKEdldFBhcmFtKCkuaW5pdF9zdGF0dXMgPT0gUElQRUxJTkVfT0spIHsKLSAgICBBU1NFUlRfVFJVRShTdGFydChHZXRUZXN0RGF0YUZpbGVQYXRoKEdldFBhcmFtKCkuZmlsZW5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgIEdldFBhcmFtKCkuaW5pdF9zdGF0dXMsIHRydWUpKTsKLSAgICBQbGF5KCk7Ci0gICAgQVNTRVJUX0VRKFdhaXRVbnRpbEVuZGVkT3JFcnJvcigpLCBHZXRQYXJhbSgpLmVuZF9zdGF0dXMpOwotICAgIEVYUEVDVF9FUShHZXRQYXJhbSgpLnZpZGVvX21kNSwgR2V0VmlkZW9IYXNoKCkpOwotICAgIEVYUEVDVF9FUShHZXRQYXJhbSgpLmF1ZGlvX21kNSwgR2V0QXVkaW9IYXNoKCkpOwotCi0gICAgLy8gQ2hlY2sgZm9yIGVuZGVkIGlmIHRoZSBwaXBlbGluZSBpcyBleHBlY3RlZCB0byBmaW5pc2ggb2theS4KLSAgICBpZiAoR2V0UGFyYW0oKS5lbmRfc3RhdHVzID09IFBJUEVMSU5FX09LKSB7Ci0gICAgICBBU1NFUlRfVFJVRShlbmRlZF8pOwotCi0gICAgICAvLyBUYWNrIGEgc2VlayBvbiB0aGUgZW5kIHRvIGNhdGNoIGFueSBzZWVraW5nIGlzc3Vlcy4KLSAgICAgIFNlZWsoYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDApKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgQVNTRVJUX0ZBTFNFKFN0YXJ0KEdldFRlc3REYXRhRmlsZVBhdGgoR2V0UGFyYW0oKS5maWxlbmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgIEdldFBhcmFtKCkuaW5pdF9zdGF0dXMsIHRydWUpKTsKLSAgICBFWFBFQ1RfRVEoR2V0UGFyYW0oKS52aWRlb19tZDUsIEdldFZpZGVvSGFzaCgpKTsKLSAgICBFWFBFQ1RfRVEoR2V0UGFyYW0oKS5hdWRpb19tZDUsIEdldEF1ZGlvSGFzaCgpKTsKLSAgfQotfQotCi1URVNUX1AoRmxha3lGRm1wZWdSZWdyZXNzaW9uVGVzdCwgQmFzaWNQbGF5YmFjaykgewotICBpZiAoU3RhcnQoR2V0VGVzdERhdGFGaWxlUGF0aChHZXRQYXJhbSgpLmZpbGVuYW1lKSkpIHsKLSAgICBQbGF5KCk7Ci0gICAgV2FpdFVudGlsRW5kZWRPckVycm9yKCk7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmZtcGVnL2ZmbXBlZ191bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9mZm1wZWcvZmZtcGVnX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGU4MGNlLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9mZm1wZWcvZmZtcGVnX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTkwICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIGZmbXBlZ191bml0dGVzdHMgdmVyaWZ5IHRoYXQgdGhlIHBhcnRzIG9mIHRoZSBGRm1wZWcgQVBJIHRoYXQgQ2hyb21pdW0gdXNlcwotLy8gZnVuY3Rpb24gYXMgYWR2ZXJ0aXNlZCBmb3IgZWFjaCBtZWRpYSBmb3JtYXQgdGhhdCBDaHJvbWl1bSBzdXBwb3J0cy4gIFRoaXMKLS8vIG1vc3RseSBpbmNsdWRlcyBzdHVmZiBsaWtlIHJlcG9ydGluZyBwcm9wZXIgdGltZXN0YW1wcywgc2Vla2luZyB0bwotLy8ga2V5ZnJhbWVzLCBhbmQgc3VwcG9ydGluZyBjZXJ0YWluIGZlYXR1cmVzIGxpa2UgcmVvcmRlcmVkX29wYXF1ZS4KLS8vCi0KLSNpbmNsdWRlIDxsaW1pdHM+Ci0jaW5jbHVkZSA8cXVldWU+Ci0KLSNpbmNsdWRlICJiYXNlL2Jhc2VfcGF0aHMuaCIKLSNpbmNsdWRlICJiYXNlL2ZpbGVfcGF0aC5oIgotI2luY2x1ZGUgImJhc2UvZmlsZV91dGlsLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgImJhc2UvcGF0aF9zZXJ2aWNlLmgiCi0jaW5jbHVkZSAiYmFzZS9wZXJmdGltZXIuaCIKLSNpbmNsdWRlICJiYXNlL3N0cmluZ191dGlsLmgiCi0jaW5jbHVkZSAiYmFzZS90ZXN0L3BlcmZfdGVzdF9zdWl0ZS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWEuaCIKLSNpbmNsdWRlICJtZWRpYS9mZm1wZWcvZmZtcGVnX2NvbW1vbi5oIgotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvZmZtcGVnX2dsdWUuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL2luX21lbW9yeV91cmxfcHJvdG9jb2wuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gIHJldHVybiBiYXNlOjpQZXJmVGVzdFN1aXRlKGFyZ2MsIGFyZ3YpLlJ1bigpOwotfQotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBNaXJyb3Igc2V0dGluZyBpbiBmZm1wZWdfdmlkZW9fZGVjb2Rlci4KLXN0YXRpYyBjb25zdCBpbnQga0RlY29kZVRocmVhZHMgPSAyOwotCi1jbGFzcyBBVlBhY2tldFF1ZXVlIHsKLSBwdWJsaWM6Ci0gIEFWUGFja2V0UXVldWUoKSB7Ci0gIH0KLQotICB+QVZQYWNrZXRRdWV1ZSgpIHsKLSAgICBmbHVzaCgpOwotICB9Ci0KLSAgYm9vbCBlbXB0eSgpIHsKLSAgICByZXR1cm4gcGFja2V0c18uZW1wdHkoKTsKLSAgfQotCi0gIEFWUGFja2V0KiBwZWVrKCkgewotICAgIHJldHVybiBwYWNrZXRzXy5mcm9udCgpOwotICB9Ci0KLSAgdm9pZCBwb3AoKSB7Ci0gICAgQVZQYWNrZXQqIHBhY2tldCA9IHBhY2tldHNfLmZyb250KCk7Ci0gICAgcGFja2V0c18ucG9wKCk7Ci0gICAgYXZfZnJlZV9wYWNrZXQocGFja2V0KTsKLSAgICBkZWxldGUgcGFja2V0OwotICB9Ci0KLSAgdm9pZCBwdXNoKEFWUGFja2V0KiBwYWNrZXQpIHsKLSAgICBhdl9kdXBfcGFja2V0KHBhY2tldCk7Ci0gICAgcGFja2V0c18ucHVzaChwYWNrZXQpOwotICB9Ci0KLSAgdm9pZCBmbHVzaCgpIHsKLSAgICB3aGlsZSAoIWVtcHR5KCkpIHsKLSAgICAgIHBvcCgpOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjpxdWV1ZTxBVlBhY2tldCo+IHBhY2tldHNfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBVlBhY2tldFF1ZXVlKTsKLX07Ci0KLS8vIFRPRE8oZGFsZWN1cnRpcyk6IFdlIHNob3VsZCByZWFsbHkganVzdCB1c2UgUGlwZWxpbmVJbnRlZ3JhdGlvblRlc3RzIGluc3RlYWQKLS8vIG9mIGEgb25lLW9mZiBzdGVwIGRlY29kZXIgc28gd2UncmUgZXhlcmNpc2luZyB0aGUgcmVhbCBwaXBlbGluZS4KLWNsYXNzIEZGbXBlZ1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxjb25zdCBjaGFyKj4gewotIHByb3RlY3RlZDoKLSAgRkZtcGVnVGVzdCgpCi0gICAgICA6IGF2X2Zvcm1hdF9jb250ZXh0XyhOVUxMKSwKLSAgICAgICAgYXVkaW9fc3RyZWFtX2luZGV4XygtMSksCi0gICAgICAgIHZpZGVvX3N0cmVhbV9pbmRleF8oLTEpLAotICAgICAgICBhdWRpb19idWZmZXJfKE5VTEwpLAotICAgICAgICB2aWRlb19idWZmZXJfKE5VTEwpLAotICAgICAgICBkZWNvZGVkX2F1ZGlvX3RpbWVfKEFWX05PUFRTX1ZBTFVFKSwKLSAgICAgICAgZGVjb2RlZF9hdWRpb19kdXJhdGlvbl8oQVZfTk9QVFNfVkFMVUUpLAotICAgICAgICBkZWNvZGVkX3ZpZGVvX3RpbWVfKEFWX05PUFRTX1ZBTFVFKSwKLSAgICAgICAgZGVjb2RlZF92aWRlb19kdXJhdGlvbl8oQVZfTk9QVFNfVkFMVUUpLAotICAgICAgICBkdXJhdGlvbl8oQVZfTk9QVFNfVkFMVUUpIHsKLSAgICBJbml0aWFsaXplRkZtcGVnKCk7Ci0KLSAgICBhdWRpb19idWZmZXJfLnJlc2V0KGF2Y29kZWNfYWxsb2NfZnJhbWUoKSk7Ci0gICAgdmlkZW9fYnVmZmVyXy5yZXNldChhdmNvZGVjX2FsbG9jX2ZyYW1lKCkpOwotICB9Ci0KLSAgdmlydHVhbCB+RkZtcGVnVGVzdCgpIHsKLSAgfQotCi0gIHZvaWQgT3BlbkFuZFJlYWRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7Ci0gICAgT3BlbkZpbGUobmFtZSk7Ci0gICAgT3BlbkNvZGVjcygpOwotICAgIFJlYWRSZW1haW5pbmdGaWxlKCk7Ci0gIH0KLQotICB2b2lkIE9wZW5GaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7Ci0gICAgRmlsZVBhdGggcGF0aDsKLSAgICBQYXRoU2VydmljZTo6R2V0KGJhc2U6OkRJUl9TT1VSQ0VfUk9PVCwgJnBhdGgpOwotICAgIHBhdGggPSBwYXRoLkFwcGVuZEFTQ0lJKCJtZWRpYSIpCi0gICAgICAgIC5BcHBlbmRBU0NJSSgidGVzdCIpCi0gICAgICAgIC5BcHBlbmRBU0NJSSgiZGF0YSIpCi0gICAgICAgIC5BcHBlbmRBU0NJSSgiY29udGVudCIpCi0gICAgICAgIC5BcHBlbmRBU0NJSShuYW1lLmNfc3RyKCkpOwotICAgIEVYUEVDVF9UUlVFKGZpbGVfdXRpbDo6UGF0aEV4aXN0cyhwYXRoKSk7Ci0KLSAgICBDSEVDSyhmaWxlX2RhdGFfLkluaXRpYWxpemUocGF0aCkpOwotICAgIHByb3RvY29sXy5yZXNldChuZXcgSW5NZW1vcnlVcmxQcm90b2NvbCgKLSAgICAgICAgZmlsZV9kYXRhXy5kYXRhKCksIGZpbGVfZGF0YV8ubGVuZ3RoKCksIGZhbHNlKSk7Ci0gICAgZ2x1ZV8ucmVzZXQobmV3IEZGbXBlZ0dsdWUocHJvdG9jb2xfLmdldCgpKSk7Ci0KLSAgICBBU1NFUlRfVFJVRShnbHVlXy0+T3BlbkNvbnRleHQoKSkgPDwgIkNvdWxkIG5vdCBvcGVuICIgPDwgcGF0aC52YWx1ZSgpOwotICAgIGF2X2Zvcm1hdF9jb250ZXh0XyA9IGdsdWVfLT5mb3JtYXRfY29udGV4dCgpOwotICAgIEFTU0VSVF9MRSgwLCBhdmZvcm1hdF9maW5kX3N0cmVhbV9pbmZvKGF2X2Zvcm1hdF9jb250ZXh0XywgTlVMTCkpCi0gICAgICAgIDw8ICJDb3VsZCBub3QgZmluZCBzdHJlYW0gaW5mb3JtYXRpb24gZm9yICIgPDwgcGF0aC52YWx1ZSgpOwotCi0gICAgLy8gRGV0ZXJtaW5lIGR1cmF0aW9uIGJ5IHBpY2tpbmcgbWF4IHN0cmVhbSBkdXJhdGlvbi4KLSAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGF2X2Zvcm1hdF9jb250ZXh0Xy0+bmJfc3RyZWFtczsgKytpKSB7Ci0gICAgICBBVlN0cmVhbSogYXZfc3RyZWFtID0gYXZfZm9ybWF0X2NvbnRleHRfLT5zdHJlYW1zW2ldOwotICAgICAgaW50NjQgZHVyYXRpb24gPSBDb252ZXJ0RnJvbVRpbWVCYXNlKAotICAgICAgICAgIGF2X3N0cmVhbS0+dGltZV9iYXNlLCBhdl9zdHJlYW0tPmR1cmF0aW9uKS5Jbk1pY3Jvc2Vjb25kcygpOwotICAgICAgZHVyYXRpb25fID0gc3RkOjptYXgoZHVyYXRpb25fLCBkdXJhdGlvbik7Ci0gICAgfQotCi0gICAgLy8gRmluYWwgY2hlY2sgdG8gc2VlIGlmIHRoZSBjb250YWluZXIgaXRzZWxmIHNwZWNpZmllcyBhIGR1cmF0aW9uLgotICAgIEFWUmF0aW9uYWwgYXZfdGltZV9iYXNlID0gezEsIEFWX1RJTUVfQkFTRX07Ci0gICAgaW50NjQgZHVyYXRpb24gPQotICAgICAgICBDb252ZXJ0RnJvbVRpbWVCYXNlKGF2X3RpbWVfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9mb3JtYXRfY29udGV4dF8tPmR1cmF0aW9uKS5Jbk1pY3Jvc2Vjb25kcygpOwotICAgIGR1cmF0aW9uXyA9IHN0ZDo6bWF4KGR1cmF0aW9uXywgZHVyYXRpb24pOwotICB9Ci0KLSAgdm9pZCBPcGVuQ29kZWNzKCkgewotICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgYXZfZm9ybWF0X2NvbnRleHRfLT5uYl9zdHJlYW1zOyArK2kpIHsKLSAgICAgIEFWU3RyZWFtKiBhdl9zdHJlYW0gPSBhdl9mb3JtYXRfY29udGV4dF8tPnN0cmVhbXNbaV07Ci0gICAgICBBVkNvZGVjQ29udGV4dCogYXZfY29kZWNfY29udGV4dCA9IGF2X3N0cmVhbS0+Y29kZWM7Ci0gICAgICBBVkNvZGVjKiBhdl9jb2RlYyA9IGF2Y29kZWNfZmluZF9kZWNvZGVyKGF2X2NvZGVjX2NvbnRleHQtPmNvZGVjX2lkKTsKLQotICAgICAgRVhQRUNUX1RSVUUoYXZfY29kZWMpCi0gICAgICAgICAgPDwgIkNvdWxkIG5vdCBmaW5kIEFWQ29kZWMgd2l0aCBDb2RlY0lEICIKLSAgICAgICAgICA8PCBhdl9jb2RlY19jb250ZXh0LT5jb2RlY19pZDsKLQotICAgICAgYXZfY29kZWNfY29udGV4dC0+ZXJyb3JfY29uY2VhbG1lbnQgPSBGRl9FQ19HVUVTU19NVlMgfCBGRl9FQ19ERUJMT0NLOwotICAgICAgYXZfY29kZWNfY29udGV4dC0+dGhyZWFkX2NvdW50ID0ga0RlY29kZVRocmVhZHM7Ci0KLSAgICAgIEVYUEVDVF9FUSgwLCBhdmNvZGVjX29wZW4yKGF2X2NvZGVjX2NvbnRleHQsIGF2X2NvZGVjLCBOVUxMKSkKLSAgICAgICAgICA8PCAiQ291bGQgbm90IG9wZW4gQVZDb2RlY0NvbnRleHQgd2l0aCBDb2RlY0lEICIKLSAgICAgICAgICA8PCBhdl9jb2RlY19jb250ZXh0LT5jb2RlY19pZDsKLQotICAgICAgaWYgKGF2X2NvZGVjLT50eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgewotICAgICAgICBFWFBFQ1RfRVEoLTEsIGF1ZGlvX3N0cmVhbV9pbmRleF8pIDw8ICJGb3VuZCBtdWx0aXBsZSBhdWRpbyBzdHJlYW1zLiI7Ci0gICAgICAgIGF1ZGlvX3N0cmVhbV9pbmRleF8gPSBzdGF0aWNfY2FzdDxpbnQ+KGkpOwotICAgICAgfSBlbHNlIGlmIChhdl9jb2RlYy0+dHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKLSAgICAgICAgRVhQRUNUX0VRKC0xLCB2aWRlb19zdHJlYW1faW5kZXhfKSA8PCAiRm91bmQgbXVsdGlwbGUgdmlkZW8gc3RyZWFtcy4iOwotICAgICAgICB2aWRlb19zdHJlYW1faW5kZXhfID0gc3RhdGljX2Nhc3Q8aW50PihpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEFERF9GQUlMVVJFKCkgPDwgIkZvdW5kIHVua25vd24gc3RyZWFtIHR5cGUuIjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2b2lkIEZsdXNoKCkgewotICAgIGlmIChoYXNfYXVkaW8oKSkgewotICAgICAgYXVkaW9fcGFja2V0c18uZmx1c2goKTsKLSAgICAgIGF2Y29kZWNfZmx1c2hfYnVmZmVycyhhdl9hdWRpb19jb250ZXh0KCkpOwotICAgIH0KLSAgICBpZiAoaGFzX3ZpZGVvKCkpIHsKLSAgICAgIHZpZGVvX3BhY2tldHNfLmZsdXNoKCk7Ci0gICAgICBhdmNvZGVjX2ZsdXNoX2J1ZmZlcnMoYXZfdmlkZW9fY29udGV4dCgpKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFJlYWRVbnRpbChpbnQ2NCB0aW1lKSB7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHNjb3BlZF9wdHI8QVZQYWNrZXQ+IHBhY2tldChuZXcgQVZQYWNrZXQoKSk7Ci0gICAgICBpZiAoYXZfcmVhZF9mcmFtZShhdl9mb3JtYXRfY29udGV4dF8sIHBhY2tldC5nZXQoKSkgPCAwKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBpbnQgc3RyZWFtX2luZGV4ID0gc3RhdGljX2Nhc3Q8aW50PihwYWNrZXQtPnN0cmVhbV9pbmRleCk7Ci0gICAgICBpbnQ2NCBwYWNrZXRfdGltZSA9IEFWX05PUFRTX1ZBTFVFOwotICAgICAgaWYgKHN0cmVhbV9pbmRleCA9PSBhdWRpb19zdHJlYW1faW5kZXhfKSB7Ci0gICAgICAgIHBhY2tldF90aW1lID0KLSAgICAgICAgICAgIENvbnZlcnRGcm9tVGltZUJhc2UoYXZfYXVkaW9fc3RyZWFtKCktPnRpbWVfYmFzZSwgcGFja2V0LT5wdHMpCi0gICAgICAgICAgICAgICAgLkluTWljcm9zZWNvbmRzKCk7Ci0gICAgICAgIGF1ZGlvX3BhY2tldHNfLnB1c2gocGFja2V0LnJlbGVhc2UoKSk7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmVhbV9pbmRleCA9PSB2aWRlb19zdHJlYW1faW5kZXhfKSB7Ci0gICAgICAgIHBhY2tldF90aW1lID0KLSAgICAgICAgICAgIENvbnZlcnRGcm9tVGltZUJhc2UoYXZfdmlkZW9fc3RyZWFtKCktPnRpbWVfYmFzZSwgcGFja2V0LT5wdHMpCi0gICAgICAgICAgICAgICAgLkluTWljcm9zZWNvbmRzKCk7Ci0gICAgICAgIHZpZGVvX3BhY2tldHNfLnB1c2gocGFja2V0LnJlbGVhc2UoKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBBRERfRkFJTFVSRSgpIDw8ICJGb3VuZCBwYWNrZXQgdGhhdCBiZWxvbmdzIHRvIHVua25vd24gc3RyZWFtLiI7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwYWNrZXRfdGltZSA+IHRpbWUpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBSZWFkUmVtYWluaW5nRmlsZSgpIHsKLSAgICBSZWFkVW50aWwoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2ND46Om1heCgpKTsKLSAgfQotCi0gIGJvb2wgU3RlcERlY29kZUF1ZGlvKCkgewotICAgIEVYUEVDVF9UUlVFKGhhc19hdWRpbygpKTsKLSAgICBpZiAoIWhhc19hdWRpbygpIHx8IGF1ZGlvX3BhY2tldHNfLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBEZWNvZGUgdW50aWwgb3V0cHV0IGlzIHByb2R1Y2VkLCBlbmQgb2Ygc3RyZWFtLCBvciBlcnJvci4KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgaW50IHJlc3VsdCA9IDA7Ci0gICAgICBpbnQgZ290X2F1ZGlvID0gMDsKLSAgICAgIGJvb2wgZW5kX29mX3N0cmVhbSA9IGZhbHNlOwotCi0gICAgICBBVlBhY2tldCBwYWNrZXQ7Ci0gICAgICBpZiAoYXVkaW9fcGFja2V0c18uZW1wdHkoKSkgewotICAgICAgICBhdl9pbml0X3BhY2tldCgmcGFja2V0KTsKLSAgICAgICAgZW5kX29mX3N0cmVhbSA9IHRydWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBtZW1jcHkoJnBhY2tldCwgYXVkaW9fcGFja2V0c18ucGVlaygpLCBzaXplb2YocGFja2V0KSk7Ci0gICAgICB9Ci0KLSAgICAgIGF2Y29kZWNfZ2V0X2ZyYW1lX2RlZmF1bHRzKGF1ZGlvX2J1ZmZlcl8uZ2V0KCkpOwotICAgICAgcmVzdWx0ID0gYXZjb2RlY19kZWNvZGVfYXVkaW80KGF2X2F1ZGlvX2NvbnRleHQoKSwgYXVkaW9fYnVmZmVyXy5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ290X2F1ZGlvLCAmcGFja2V0KTsKLSAgICAgIGlmICghYXVkaW9fcGFja2V0c18uZW1wdHkoKSkgewotICAgICAgICBhdWRpb19wYWNrZXRzXy5wb3AoKTsKLSAgICAgIH0KLQotICAgICAgRVhQRUNUX0dFKHJlc3VsdCwgMCkgPDwgIkF1ZGlvIGRlY29kZSBlcnJvci4iOwotICAgICAgaWYgKHJlc3VsdCA8IDAgfHwgKGdvdF9hdWRpbyA9PSAwICYmIGVuZF9vZl9zdHJlYW0pKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgaWYgKHJlc3VsdCA+IDApIHsKLSAgICAgICAgZG91YmxlIG1pY3Jvc2Vjb25kcyA9IDEuMEwgKiBhdWRpb19idWZmZXJfLT5uYl9zYW1wbGVzIC8KLSAgICAgICAgICAgIGF2X2F1ZGlvX2NvbnRleHQoKS0+c2FtcGxlX3JhdGUgKgotICAgICAgICAgICAgYmFzZTo6VGltZTo6a01pY3Jvc2Vjb25kc1BlclNlY29uZDsKLSAgICAgICAgZGVjb2RlZF9hdWRpb19kdXJhdGlvbl8gPSBzdGF0aWNfY2FzdDxpbnQ2ND4obWljcm9zZWNvbmRzKTsKLQotICAgICAgICBpZiAocGFja2V0LnB0cyA9PSBzdGF0aWNfY2FzdDxpbnQ2ND4oQVZfTk9QVFNfVkFMVUUpKSB7Ci0gICAgICAgICAgRVhQRUNUX05FKGRlY29kZWRfYXVkaW9fdGltZV8sIHN0YXRpY19jYXN0PGludDY0PihBVl9OT1BUU19WQUxVRSkpCi0gICAgICAgICAgICAgIDw8ICJXZSBuZXZlciByZWNlaXZlZCBhbiBpbml0aWFsIHRpbWVzdGFtcGVkIGF1ZGlvIHBhY2tldCEgIgotICAgICAgICAgICAgICA8PCAiTG9va3MgbGlrZSB0aGVyZSdzIGEgc2Vla2luZy9wYXJzaW5nIGJ1ZyBpbiBGRm1wZWcuIjsKLSAgICAgICAgICBkZWNvZGVkX2F1ZGlvX3RpbWVfICs9IGRlY29kZWRfYXVkaW9fZHVyYXRpb25fOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGRlY29kZWRfYXVkaW9fdGltZV8gPQotICAgICAgICAgICAgICBDb252ZXJ0RnJvbVRpbWVCYXNlKGF2X2F1ZGlvX3N0cmVhbSgpLT50aW1lX2Jhc2UsIHBhY2tldC5wdHMpCi0gICAgICAgICAgICAgICAgICAuSW5NaWNyb3NlY29uZHMoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBib29sIFN0ZXBEZWNvZGVWaWRlbygpIHsKLSAgICBFWFBFQ1RfVFJVRShoYXNfdmlkZW8oKSk7Ci0gICAgaWYgKCFoYXNfdmlkZW8oKSB8fCB2aWRlb19wYWNrZXRzXy5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gRGVjb2RlIHVudGlsIG91dHB1dCBpcyBwcm9kdWNlZCwgZW5kIG9mIHN0cmVhbSwgb3IgZXJyb3IuCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIGludCByZXN1bHQgPSAwOwotICAgICAgaW50IGdvdF9waWN0dXJlID0gMDsKLSAgICAgIGJvb2wgZW5kX29mX3N0cmVhbSA9IGZhbHNlOwotCi0gICAgICBBVlBhY2tldCBwYWNrZXQ7Ci0gICAgICBpZiAodmlkZW9fcGFja2V0c18uZW1wdHkoKSkgewotICAgICAgICBhdl9pbml0X3BhY2tldCgmcGFja2V0KTsKLSAgICAgICAgZW5kX29mX3N0cmVhbSA9IHRydWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBtZW1jcHkoJnBhY2tldCwgdmlkZW9fcGFja2V0c18ucGVlaygpLCBzaXplb2YocGFja2V0KSk7Ci0gICAgICB9Ci0KLSAgICAgIGF2Y29kZWNfZ2V0X2ZyYW1lX2RlZmF1bHRzKHZpZGVvX2J1ZmZlcl8uZ2V0KCkpOwotICAgICAgYXZfdmlkZW9fY29udGV4dCgpLT5yZW9yZGVyZWRfb3BhcXVlID0gcGFja2V0LnB0czsKLSAgICAgIHJlc3VsdCA9IGF2Y29kZWNfZGVjb2RlX3ZpZGVvMihhdl92aWRlb19jb250ZXh0KCksIHZpZGVvX2J1ZmZlcl8uZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdvdF9waWN0dXJlLCAmcGFja2V0KTsKLSAgICAgIGlmICghdmlkZW9fcGFja2V0c18uZW1wdHkoKSkgewotICAgICAgICB2aWRlb19wYWNrZXRzXy5wb3AoKTsKLSAgICAgIH0KLQotICAgICAgRVhQRUNUX0dFKHJlc3VsdCwgMCkgPDwgIlZpZGVvIGRlY29kZSBlcnJvci4iOwotICAgICAgaWYgKHJlc3VsdCA8IDAgfHwgKGdvdF9waWN0dXJlID09IDAgJiYgZW5kX29mX3N0cmVhbSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBpZiAoZ290X3BpY3R1cmUpIHsKLSAgICAgICAgQVZSYXRpb25hbCBkb3VibGVkX3RpbWVfYmFzZTsKLSAgICAgICAgZG91YmxlZF90aW1lX2Jhc2UuZGVuID0gYXZfdmlkZW9fc3RyZWFtKCktPnJfZnJhbWVfcmF0ZS5udW07Ci0gICAgICAgIGRvdWJsZWRfdGltZV9iYXNlLm51bSA9IGF2X3ZpZGVvX3N0cmVhbSgpLT5yX2ZyYW1lX3JhdGUuZGVuOwotICAgICAgICBkb3VibGVkX3RpbWVfYmFzZS5kZW4gKj0gMjsKLQotICAgICAgICBkZWNvZGVkX3ZpZGVvX3RpbWVfID0KLSAgICAgICAgICAgIENvbnZlcnRGcm9tVGltZUJhc2UoYXZfdmlkZW9fc3RyZWFtKCktPnRpbWVfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9fYnVmZmVyXy0+cmVvcmRlcmVkX29wYXF1ZSkKLSAgICAgICAgICAgICAgICAuSW5NaWNyb3NlY29uZHMoKTsKLSAgICAgICAgZGVjb2RlZF92aWRlb19kdXJhdGlvbl8gPQotICAgICAgICAgICAgQ29udmVydEZyb21UaW1lQmFzZShkb3VibGVkX3RpbWVfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiArIHZpZGVvX2J1ZmZlcl8tPnJlcGVhdF9waWN0KQotICAgICAgICAgICAgICAgIC5Jbk1pY3Jvc2Vjb25kcygpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2b2lkIERlY29kZVJlbWFpbmluZ0F1ZGlvKCkgewotICAgIHdoaWxlIChTdGVwRGVjb2RlQXVkaW8oKSkge30KLSAgfQotCi0gIHZvaWQgRGVjb2RlUmVtYWluaW5nVmlkZW8oKSB7Ci0gICAgd2hpbGUgKFN0ZXBEZWNvZGVWaWRlbygpKSB7fQotICB9Ci0KLSAgdm9pZCBTZWVrVG8oZG91YmxlIHBvc2l0aW9uKSB7Ci0gICAgaW50NjQgc2Vla190aW1lID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8aW50NjQ+KHBvc2l0aW9uICogYmFzZTo6VGltZTo6a01pY3Jvc2Vjb25kc1BlclNlY29uZCk7Ci0gICAgaW50IGZsYWdzID0gQVZTRUVLX0ZMQUdfQkFDS1dBUkQ7Ci0KLSAgICAvLyBQYXNzaW5nIC0xIGFzIG91ciBzdHJlYW0gaW5kZXggbGV0cyBGRm1wZWcgcGljayBhIGRlZmF1bHQgc3RyZWFtLgotICAgIC8vIEZGbXBlZyB3aWxsIGF0dGVtcHQgdG8gdXNlIHRoZSBsb3dlc3QtaW5kZXggdmlkZW8gc3RyZWFtLCBpZiBwcmVzZW50LAotICAgIC8vIGZvbGxvd2VkIGJ5IHRoZSBsb3dlc3QtaW5kZXggYXVkaW8gc3RyZWFtLgotICAgIEVYUEVDVF9HRSgwLCBhdl9zZWVrX2ZyYW1lKGF2X2Zvcm1hdF9jb250ZXh0XywgLTEsIHNlZWtfdGltZSwgZmxhZ3MpKQotICAgICAgICA8PCAiRmFpbGVkIHRvIHNlZWsgdG8gcG9zaXRpb24gIiA8PCBwb3NpdGlvbjsKLSAgICBGbHVzaCgpOwotICB9Ci0KLSAgYm9vbCBoYXNfYXVkaW8oKSB7IHJldHVybiBhdWRpb19zdHJlYW1faW5kZXhfID49IDA7IH0KLSAgYm9vbCBoYXNfdmlkZW8oKSB7IHJldHVybiB2aWRlb19zdHJlYW1faW5kZXhfID49IDA7IH0KLSAgaW50NjQgZGVjb2RlZF9hdWRpb190aW1lKCkgeyByZXR1cm4gZGVjb2RlZF9hdWRpb190aW1lXzsgfQotICBpbnQ2NCBkZWNvZGVkX2F1ZGlvX2R1cmF0aW9uKCkgeyByZXR1cm4gZGVjb2RlZF9hdWRpb19kdXJhdGlvbl87IH0KLSAgaW50NjQgZGVjb2RlZF92aWRlb190aW1lKCkgeyByZXR1cm4gZGVjb2RlZF92aWRlb190aW1lXzsgfQotICBpbnQ2NCBkZWNvZGVkX3ZpZGVvX2R1cmF0aW9uKCkgeyByZXR1cm4gZGVjb2RlZF92aWRlb19kdXJhdGlvbl87IH0KLSAgaW50NjQgZHVyYXRpb24oKSB7IHJldHVybiBkdXJhdGlvbl87IH0KLQotICBBVlN0cmVhbSogYXZfYXVkaW9fc3RyZWFtKCkgewotICAgIHJldHVybiBhdl9mb3JtYXRfY29udGV4dF8tPnN0cmVhbXNbYXVkaW9fc3RyZWFtX2luZGV4X107Ci0gIH0KLSAgQVZTdHJlYW0qIGF2X3ZpZGVvX3N0cmVhbSgpIHsKLSAgICByZXR1cm4gYXZfZm9ybWF0X2NvbnRleHRfLT5zdHJlYW1zW3ZpZGVvX3N0cmVhbV9pbmRleF9dOwotICB9Ci0gIEFWQ29kZWNDb250ZXh0KiBhdl9hdWRpb19jb250ZXh0KCkgewotICAgIHJldHVybiBhdl9hdWRpb19zdHJlYW0oKS0+Y29kZWM7Ci0gIH0KLSAgQVZDb2RlY0NvbnRleHQqIGF2X3ZpZGVvX2NvbnRleHQoKSB7Ci0gICAgcmV0dXJuIGF2X3ZpZGVvX3N0cmVhbSgpLT5jb2RlYzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdm9pZCBJbml0aWFsaXplRkZtcGVnKCkgewotICAgIHN0YXRpYyBib29sIGluaXRpYWxpemVkID0gZmFsc2U7Ci0gICAgaWYgKGluaXRpYWxpemVkKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgRmlsZVBhdGggcGF0aDsKLSAgICBQYXRoU2VydmljZTo6R2V0KGJhc2U6OkRJUl9NT0RVTEUsICZwYXRoKTsKLSAgICBFWFBFQ1RfVFJVRShJbml0aWFsaXplTWVkaWFMaWJyYXJ5KHBhdGgpKQotICAgICAgICA8PCAiQ291bGQgbm90IGluaXRpYWxpemUgbWVkaWEgbGlicmFyeS4iOwotCi0gICAgaW5pdGlhbGl6ZWQgPSB0cnVlOwotICB9Ci0KLSAgQVZGb3JtYXRDb250ZXh0KiBhdl9mb3JtYXRfY29udGV4dF87Ci0gIGludCBhdWRpb19zdHJlYW1faW5kZXhfOwotICBpbnQgdmlkZW9fc3RyZWFtX2luZGV4XzsKLSAgQVZQYWNrZXRRdWV1ZSBhdWRpb19wYWNrZXRzXzsKLSAgQVZQYWNrZXRRdWV1ZSB2aWRlb19wYWNrZXRzXzsKLQotICBzY29wZWRfcHRyX21hbGxvYzxBVkZyYW1lLCBtZWRpYTo6U2NvcGVkUHRyQVZGcmVlPiBhdWRpb19idWZmZXJfOwotICBzY29wZWRfcHRyX21hbGxvYzxBVkZyYW1lLCBtZWRpYTo6U2NvcGVkUHRyQVZGcmVlPiB2aWRlb19idWZmZXJfOwotCi0gIGludDY0IGRlY29kZWRfYXVkaW9fdGltZV87Ci0gIGludDY0IGRlY29kZWRfYXVkaW9fZHVyYXRpb25fOwotICBpbnQ2NCBkZWNvZGVkX3ZpZGVvX3RpbWVfOwotICBpbnQ2NCBkZWNvZGVkX3ZpZGVvX2R1cmF0aW9uXzsKLSAgaW50NjQgZHVyYXRpb25fOwotCi0gIGZpbGVfdXRpbDo6TWVtb3J5TWFwcGVkRmlsZSBmaWxlX2RhdGFfOwotICBzY29wZWRfcHRyPEluTWVtb3J5VXJsUHJvdG9jb2w+IHByb3RvY29sXzsKLSAgc2NvcGVkX3B0cjxGRm1wZWdHbHVlPiBnbHVlXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRkZtcGVnVGVzdCk7Ci19OwotCi0jZGVmaW5lIEZGTVBFR19URVNUX0NBU0UobmFtZSwgZXh0ZW5zaW9uKSBcCi0gICAgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AobmFtZSMjXyMjZXh0ZW5zaW9uLCBGRm1wZWdUZXN0LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGluZzo6VmFsdWVzKCNuYW1lICIuIiAjZXh0ZW5zaW9uKSk7Ci0KLS8vIENvdmVycyBhbGwgb3VyIGJhc2ljIGZvcm1hdHMuCi1GRk1QRUdfVEVTVF9DQVNFKHN5bmMwLCBtcDQpOwotRkZNUEVHX1RFU1RfQ0FTRShzeW5jMCwgb2d2KTsKLUZGTVBFR19URVNUX0NBU0Uoc3luYzAsIHdlYm0pOwotRkZNUEVHX1RFU1RfQ0FTRShzeW5jMSwgbTRhKTsKLUZGTVBFR19URVNUX0NBU0Uoc3luYzEsIG1wMyk7Ci1GRk1QRUdfVEVTVF9DQVNFKHN5bmMxLCBtcDQpOwotRkZNUEVHX1RFU1RfQ0FTRShzeW5jMSwgb2dnKTsKLUZGTVBFR19URVNUX0NBU0Uoc3luYzEsIG9ndik7Ci1GRk1QRUdfVEVTVF9DQVNFKHN5bmMxLCB3ZWJtKTsKLUZGTVBFR19URVNUX0NBU0Uoc3luYzIsIG00YSk7Ci1GRk1QRUdfVEVTVF9DQVNFKHN5bmMyLCBtcDMpOwotRkZNUEVHX1RFU1RfQ0FTRShzeW5jMiwgbXA0KTsKLUZGTVBFR19URVNUX0NBU0Uoc3luYzIsIG9nZyk7Ci1GRk1QRUdfVEVTVF9DQVNFKHN5bmMyLCBvZ3YpOwotRkZNUEVHX1RFU1RfQ0FTRShzeW5jMiwgd2VibSk7Ci0KLS8vIENvdmVycyBvdXIgTGF5b3V0VGVzdCBmaWxlLgotRkZNUEVHX1RFU1RfQ0FTRShjb3VudGluZywgb2d2KTsKLQotVEVTVF9QKEZGbXBlZ1Rlc3QsIFBlcmYpIHsKLSAgewotICAgIFBlcmZUaW1lTG9nZ2VyIHRpbWVyKCJPcGVuaW5nIGZpbGUiKTsKLSAgICBPcGVuRmlsZShHZXRQYXJhbSgpKTsKLSAgfQotICB7Ci0gICAgUGVyZlRpbWVMb2dnZXIgdGltZXIoIk9wZW5pbmcgY29kZWNzIik7Ci0gICAgT3BlbkNvZGVjcygpOwotICB9Ci0gIHsKLSAgICBQZXJmVGltZUxvZ2dlciB0aW1lcigiUmVhZGluZyBmaWxlIik7Ci0gICAgUmVhZFJlbWFpbmluZ0ZpbGUoKTsKLSAgfQotICBpZiAoaGFzX2F1ZGlvKCkpIHsKLSAgICBQZXJmVGltZUxvZ2dlciB0aW1lcigiRGVjb2RpbmcgYXVkaW8iKTsKLSAgICBEZWNvZGVSZW1haW5pbmdBdWRpbygpOwotICB9Ci0gIGlmIChoYXNfdmlkZW8oKSkgewotICAgIFBlcmZUaW1lTG9nZ2VyIHRpbWVyKCJEZWNvZGluZyB2aWRlbyIpOwotICAgIERlY29kZVJlbWFpbmluZ1ZpZGVvKCk7Ci0gIH0KLSAgewotICAgIFBlcmZUaW1lTG9nZ2VyIHRpbWVyKCJTZWVraW5nIHRvIHplcm8iKTsKLSAgICBTZWVrVG8oMCk7Ci0gIH0KLX0KLQotVEVTVF9QKEZGbXBlZ1Rlc3QsIExvb3BfQXVkaW8pIHsKLSAgT3BlbkFuZFJlYWRGaWxlKEdldFBhcmFtKCkpOwotICBpZiAoIWhhc19hdWRpbygpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgY29uc3QgaW50IGtTdGVwcyA9IDQ7Ci0gIHN0ZDo6dmVjdG9yPGludDY0PiBleHBlY3RlZF90aW1lc3RhbXBzXzsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrU3RlcHM7ICsraSkgewotICAgIEVYUEVDVF9UUlVFKFN0ZXBEZWNvZGVBdWRpbygpKTsKLSAgICBleHBlY3RlZF90aW1lc3RhbXBzXy5wdXNoX2JhY2soZGVjb2RlZF9hdWRpb190aW1lKCkpOwotICB9Ci0KLSAgU2Vla1RvKDApOwotICBSZWFkUmVtYWluaW5nRmlsZSgpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwga1N0ZXBzOyArK2kpIHsKLSAgICBFWFBFQ1RfVFJVRShTdGVwRGVjb2RlQXVkaW8oKSk7Ci0gICAgRVhQRUNUX0VRKGV4cGVjdGVkX3RpbWVzdGFtcHNfW2ldLCBkZWNvZGVkX2F1ZGlvX3RpbWUoKSkKLSAgICAgICAgPDwgIkZyYW1lICIgPDwgaSA8PCAiIGhhZCBhIG1pc21hdGNoZWQgdGltZXN0YW1wLiI7Ci0gIH0KLX0KLQotVEVTVF9QKEZGbXBlZ1Rlc3QsIExvb3BfVmlkZW8pIHsKLSAgT3BlbkFuZFJlYWRGaWxlKEdldFBhcmFtKCkpOwotICBpZiAoIWhhc192aWRlbygpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgY29uc3QgaW50IGtTdGVwcyA9IDQ7Ci0gIHN0ZDo6dmVjdG9yPGludDY0PiBleHBlY3RlZF90aW1lc3RhbXBzXzsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrU3RlcHM7ICsraSkgewotICAgIEVYUEVDVF9UUlVFKFN0ZXBEZWNvZGVWaWRlbygpKTsKLSAgICBleHBlY3RlZF90aW1lc3RhbXBzXy5wdXNoX2JhY2soZGVjb2RlZF92aWRlb190aW1lKCkpOwotICB9Ci0KLSAgU2Vla1RvKDApOwotICBSZWFkUmVtYWluaW5nRmlsZSgpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwga1N0ZXBzOyArK2kpIHsKLSAgICBFWFBFQ1RfVFJVRShTdGVwRGVjb2RlVmlkZW8oKSk7Ci0gICAgRVhQRUNUX0VRKGV4cGVjdGVkX3RpbWVzdGFtcHNfW2ldLCBkZWNvZGVkX3ZpZGVvX3RpbWUoKSkKLSAgICAgICAgPDwgIkZyYW1lICIgPDwgaSA8PCAiIGhhZCBhIG1pc21hdGNoZWQgdGltZXN0YW1wLiI7Ci0gIH0KLX0KLQotVEVTVF9QKEZGbXBlZ1Rlc3QsIFNlZWtfQXVkaW8pIHsKLSAgT3BlbkFuZFJlYWRGaWxlKEdldFBhcmFtKCkpOwotICBpZiAoIWhhc19hdWRpbygpICYmIGR1cmF0aW9uKCkgPj0gMC41KSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgU2Vla1RvKGR1cmF0aW9uKCkgLSAwLjUpOwotICBSZWFkUmVtYWluaW5nRmlsZSgpOwotCi0gIEVYUEVDVF9UUlVFKFN0ZXBEZWNvZGVBdWRpbygpKTsKLSAgRVhQRUNUX05FKHN0YXRpY19jYXN0PGludDY0PihBVl9OT1BUU19WQUxVRSksIGRlY29kZWRfYXVkaW9fdGltZSgpKTsKLX0KLQotVEVTVF9QKEZGbXBlZ1Rlc3QsIFNlZWtfVmlkZW8pIHsKLSAgT3BlbkFuZFJlYWRGaWxlKEdldFBhcmFtKCkpOwotICBpZiAoIWhhc192aWRlbygpICYmIGR1cmF0aW9uKCkgPj0gMC41KSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgU2Vla1RvKGR1cmF0aW9uKCkgLSAwLjUpOwotICBSZWFkUmVtYWluaW5nRmlsZSgpOwotCi0gIEVYUEVDVF9UUlVFKFN0ZXBEZWNvZGVWaWRlbygpKTsKLSAgRVhQRUNUX05FKHN0YXRpY19jYXN0PGludDY0PihBVl9OT1BUU19WQUxVRSksIGRlY29kZWRfdmlkZW9fdGltZSgpKTsKLX0KLQotVEVTVF9QKEZGbXBlZ1Rlc3QsIERlY29kZV9BdWRpbykgewotICBPcGVuQW5kUmVhZEZpbGUoR2V0UGFyYW0oKSk7Ci0gIGlmICghaGFzX2F1ZGlvKCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpbnQ2NCBsYXN0X2F1ZGlvX3RpbWUgPSBBVl9OT1BUU19WQUxVRTsKLSAgd2hpbGUgKFN0ZXBEZWNvZGVBdWRpbygpKSB7Ci0gICAgQVNTRVJUX0dUKGRlY29kZWRfYXVkaW9fdGltZSgpLCBsYXN0X2F1ZGlvX3RpbWUpOwotICAgIGxhc3RfYXVkaW9fdGltZSA9IGRlY29kZWRfYXVkaW9fdGltZSgpOwotICB9Ci19Ci0KLVRFU1RfUChGRm1wZWdUZXN0LCBEZWNvZGVfVmlkZW8pIHsKLSAgT3BlbkFuZFJlYWRGaWxlKEdldFBhcmFtKCkpOwotICBpZiAoIWhhc192aWRlbygpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW50NjQgbGFzdF92aWRlb190aW1lID0gQVZfTk9QVFNfVkFMVUU7Ci0gIHdoaWxlIChTdGVwRGVjb2RlVmlkZW8oKSkgewotICAgIEFTU0VSVF9HVChkZWNvZGVkX3ZpZGVvX3RpbWUoKSwgbGFzdF92aWRlb190aW1lKTsKLSAgICBsYXN0X3ZpZGVvX3RpbWUgPSBkZWNvZGVkX3ZpZGVvX3RpbWUoKTsKLSAgfQotfQotCi1URVNUX1AoRkZtcGVnVGVzdCwgRHVyYXRpb24pIHsKLSAgT3BlbkFuZFJlYWRGaWxlKEdldFBhcmFtKCkpOwotCi0gIGlmIChoYXNfYXVkaW8oKSkgewotICAgIERlY29kZVJlbWFpbmluZ0F1ZGlvKCk7Ci0gIH0KLQotICBpZiAoaGFzX3ZpZGVvKCkpIHsKLSAgICBEZWNvZGVSZW1haW5pbmdWaWRlbygpOwotICB9Ci0KLSAgZG91YmxlIGV4cGVjdGVkID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihkdXJhdGlvbigpKTsKLSAgZG91YmxlIGFjdHVhbCA9IHN0YXRpY19jYXN0PGRvdWJsZT4oCi0gICAgICBzdGQ6Om1heChkZWNvZGVkX2F1ZGlvX3RpbWUoKSArIGRlY29kZWRfYXVkaW9fZHVyYXRpb24oKSwKLSAgICAgICAgICAgICAgIGRlY29kZWRfdmlkZW9fdGltZSgpICsgZGVjb2RlZF92aWRlb19kdXJhdGlvbigpKSk7Ci0gIEVYUEVDVF9ORUFSKGV4cGVjdGVkLCBhY3R1YWwsIDUwMDAwMCkKLSAgICAgIDw8ICJEdXJhdGlvbiBpcyBvZmYgYnkgbW9yZSB0aGFuIDAuNSBzZWNvbmRzLiI7Ci19Ci0KLVRFU1RfRihGRm1wZWdUZXN0LCBWaWRlb1BsYXllZENvbGxhcHNlKSB7Ci0gIE9wZW5GaWxlKCJ0ZXN0Lm9ndiIpOwotICBPcGVuQ29kZWNzKCk7Ci0KLSAgU2Vla1RvKDAuNSk7Ci0gIFJlYWRSZW1haW5pbmdGaWxlKCk7Ci0gIEVYUEVDVF9UUlVFKFN0ZXBEZWNvZGVWaWRlbygpKTsKLSAgVkxPRygxKSA8PCBkZWNvZGVkX3ZpZGVvX3RpbWUoKTsKLQotICBTZWVrVG8oMi44Myk7Ci0gIFJlYWRSZW1haW5pbmdGaWxlKCk7Ci0gIEVYUEVDVF9UUlVFKFN0ZXBEZWNvZGVWaWRlbygpKTsKLSAgVkxPRygxKSA8PCBkZWNvZGVkX3ZpZGVvX3RpbWUoKTsKLQotICBTZWVrVG8oMC40KTsKLSAgUmVhZFJlbWFpbmluZ0ZpbGUoKTsKLSAgRVhQRUNUX1RSVUUoU3RlcERlY29kZVZpZGVvKCkpOwotICBWTE9HKDEpIDw8IGRlY29kZWRfdmlkZW9fdGltZSgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL2F1ZGlvX2RlY29kZXJfc2VsZWN0b3IuY2MgYi9zcmMvbWVkaWEvZmlsdGVycy9hdWRpb19kZWNvZGVyX3NlbGVjdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzc0ZDBjLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL2F1ZGlvX2RlY29kZXJfc2VsZWN0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvYXVkaW9fZGVjb2Rlcl9zZWxlY3Rvci5oIgotCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFja19oZWxwZXJzLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3BfcHJveHkuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9iaW5kX3RvX2xvb3AuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlbXV4ZXJfc3RyZWFtLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9waXBlbGluZS5oIgotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvZGVjcnlwdGluZ19hdWRpb19kZWNvZGVyLmgiCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9kZWNyeXB0aW5nX2RlbXV4ZXJfc3RyZWFtLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLUF1ZGlvRGVjb2RlclNlbGVjdG9yOjpBdWRpb0RlY29kZXJTZWxlY3RvcigKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+JiBtZXNzYWdlX2xvb3AsCi0gICAgY29uc3QgQXVkaW9EZWNvZGVyTGlzdCYgZGVjb2RlcnMsCi0gICAgY29uc3QgU2V0RGVjcnlwdG9yUmVhZHlDQiYgc2V0X2RlY3J5cHRvcl9yZWFkeV9jYikKLSAgICA6IG1lc3NhZ2VfbG9vcF8obWVzc2FnZV9sb29wKSwKLSAgICAgIGRlY29kZXJzXyhkZWNvZGVycyksCi0gICAgICBzZXRfZGVjcnlwdG9yX3JlYWR5X2NiXyhzZXRfZGVjcnlwdG9yX3JlYWR5X2NiKSwKLSAgICAgIEFMTE9XX1RISVNfSU5fSU5JVElBTElaRVJfTElTVCh3ZWFrX3B0cl9mYWN0b3J5Xyh0aGlzKSkgewotfQotCi1BdWRpb0RlY29kZXJTZWxlY3Rvcjo6fkF1ZGlvRGVjb2RlclNlbGVjdG9yKCkge30KLQotdm9pZCBBdWRpb0RlY29kZXJTZWxlY3Rvcjo6U2VsZWN0QXVkaW9EZWNvZGVyKAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4mIHN0cmVhbSwKLSAgICBjb25zdCBTdGF0aXN0aWNzQ0ImIHN0YXRpc3RpY3NfY2IsCi0gICAgY29uc3QgU2VsZWN0RGVjb2RlckNCJiBzZWxlY3RfZGVjb2Rlcl9jYikgewotICBEVkxPRygyKSA8PCAiU2VsZWN0QXVkaW9EZWNvZGVyKCkiOwotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgRENIRUNLKHN0cmVhbSk7Ci0KLSAgLy8gTWFrZSBzdXJlIHxzZWxlY3RfZGVjb2Rlcl9jYnwgcnVucyBvbiBhIGRpZmZlcmVudCBleGVjdXRpb24gc3RhY2suCi0gIHNlbGVjdF9kZWNvZGVyX2NiXyA9IEJpbmRUb0N1cnJlbnRMb29wKHNlbGVjdF9kZWNvZGVyX2NiKTsKLQotICBjb25zdCBBdWRpb0RlY29kZXJDb25maWcmIGNvbmZpZyA9IHN0cmVhbS0+YXVkaW9fZGVjb2Rlcl9jb25maWcoKTsKLSAgaWYgKCFjb25maWcuSXNWYWxpZENvbmZpZygpKSB7Ci0gICAgRExPRyhFUlJPUikgPDwgIkludmFsaWQgYXVkaW8gc3RyZWFtIGNvbmZpZy4iOwotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZzZWxlY3RfZGVjb2Rlcl9jYl8pLlJ1bihOVUxMLCBOVUxMKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpbnB1dF9zdHJlYW1fID0gc3RyZWFtOwotICBzdGF0aXN0aWNzX2NiXyA9IHN0YXRpc3RpY3NfY2I7Ci0KLSAgaWYgKCFjb25maWcuaXNfZW5jcnlwdGVkKCkpIHsKLSAgICBpZiAoZGVjb2RlcnNfLmVtcHR5KCkpIHsKLSAgICAgIERMT0coRVJST1IpIDw8ICJObyBhdWRpbyBkZWNvZGVyIGNhbiBiZSB1c2VkIHRvIGRlY29kZSB0aGUgaW5wdXQgc3RyZWFtLiI7Ci0gICAgICBiYXNlOjpSZXNldEFuZFJldHVybigmc2VsZWN0X2RlY29kZXJfY2JfKS5SdW4oTlVMTCwgTlVMTCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgSW5pdGlhbGl6ZU5leHREZWNvZGVyKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gVGhpcyBjb3VsZCBoYXBwZW4gaWYgRW5jcnlwdGVkIE1lZGlhIEV4dGVuc2lvbiAoRU1FKSBpcyBub3QgZW5hYmxlZC4KLSAgaWYgKHNldF9kZWNyeXB0b3JfcmVhZHlfY2JfLmlzX251bGwoKSkgewotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZzZWxlY3RfZGVjb2Rlcl9jYl8pLlJ1bihOVUxMLCBOVUxMKTsKLSAgICByZXR1cm47Ci0gIH0KLQotI2lmIGRlZmluZWQoQ09CQUxUKSB8fCBkZWZpbmVkKF9fTEJfU0hFTExfXykKLSAgRGVjcnlwdGluZ0F1ZGlvRGVjb2RlckluaXREb25lKERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCk7Ci0jZWxzZSAgIC8vIGRlZmluZWQoQ09CQUxUKSB8fCBkZWZpbmVkKF9fTEJfU0hFTExfXykKLSAgYXVkaW9fZGVjb2Rlcl8gPSBuZXcgRGVjcnlwdGluZ0F1ZGlvRGVjb2RlcihtZXNzYWdlX2xvb3BfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9kZWNyeXB0b3JfcmVhZHlfY2JfKTsKLQotICBhdWRpb19kZWNvZGVyXy0+SW5pdGlhbGl6ZSgKLSAgICAgIGlucHV0X3N0cmVhbV8sCi0gICAgICBCaW5kVG9DdXJyZW50TG9vcChiYXNlOjpCaW5kKAotICAgICAgICAgICZBdWRpb0RlY29kZXJTZWxlY3Rvcjo6RGVjcnlwdGluZ0F1ZGlvRGVjb2RlckluaXREb25lLAotICAgICAgICAgIHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKSkpLAotICAgICAgc3RhdGlzdGljc19jYl8pOwotI2VuZGlmICAvLyBkZWZpbmVkKENPQkFMVCkgfHwgZGVmaW5lZChfX0xCX1NIRUxMX18pCi19Ci0KLXZvaWQgQXVkaW9EZWNvZGVyU2VsZWN0b3I6OkRlY3J5cHRpbmdBdWRpb0RlY29kZXJJbml0RG9uZSgKLSAgICBQaXBlbGluZVN0YXR1cyBzdGF0dXMpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0KLSAgaWYgKHN0YXR1cyA9PSBQSVBFTElORV9PSykgewotICAgIGRlY29kZXJzXy5jbGVhcigpOwotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZzZWxlY3RfZGVjb2Rlcl9jYl8pLlJ1bihhdWRpb19kZWNvZGVyXywgTlVMTCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYXVkaW9fZGVjb2Rlcl8gPSBOVUxMOwotCi0gIGlmIChkZWNvZGVyc18uZW1wdHkoKSkgewotICAgIERMT0coRVJST1IpIDw8ICJObyBhdWRpbyBkZWNvZGVyIGNhbiBiZSB1c2VkIHRvIGRlY29kZSB0aGUgaW5wdXQgc3RyZWFtLiI7Ci0gICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnNlbGVjdF9kZWNvZGVyX2NiXykuUnVuKE5VTEwsIE5VTEwpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGRlY3J5cHRlZF9zdHJlYW1fID0gbmV3IERlY3J5cHRpbmdEZW11eGVyU3RyZWFtKAotICAgICAgbWVzc2FnZV9sb29wXywgc2V0X2RlY3J5cHRvcl9yZWFkeV9jYl8pOwotCi0gIGRlY3J5cHRlZF9zdHJlYW1fLT5Jbml0aWFsaXplKAotICAgICAgaW5wdXRfc3RyZWFtXywKLSAgICAgIEJpbmRUb0N1cnJlbnRMb29wKGJhc2U6OkJpbmQoCi0gICAgICAgICAgJkF1ZGlvRGVjb2RlclNlbGVjdG9yOjpEZWNyeXB0aW5nRGVtdXhlclN0cmVhbUluaXREb25lLAotICAgICAgICAgIHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKSkpKTsKLX0KLQotdm9pZCBBdWRpb0RlY29kZXJTZWxlY3Rvcjo6RGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW1Jbml0RG9uZSgKLSAgICBQaXBlbGluZVN0YXR1cyBzdGF0dXMpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0KLSAgaWYgKHN0YXR1cyAhPSBQSVBFTElORV9PSykgewotICAgIGRlY3J5cHRlZF9zdHJlYW1fID0gTlVMTDsKLSAgICBiYXNlOjpSZXNldEFuZFJldHVybigmc2VsZWN0X2RlY29kZXJfY2JfKS5SdW4oTlVMTCwgTlVMTCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRENIRUNLKCFkZWNyeXB0ZWRfc3RyZWFtXy0+YXVkaW9fZGVjb2Rlcl9jb25maWcoKS5pc19lbmNyeXB0ZWQoKSk7Ci0gIGlucHV0X3N0cmVhbV8gPSBkZWNyeXB0ZWRfc3RyZWFtXzsKLSAgSW5pdGlhbGl6ZU5leHREZWNvZGVyKCk7Ci19Ci0KLXZvaWQgQXVkaW9EZWNvZGVyU2VsZWN0b3I6OkluaXRpYWxpemVOZXh0RGVjb2RlcigpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIERDSEVDSyghZGVjb2RlcnNfLmVtcHR5KCkpOwotCi0gIGF1ZGlvX2RlY29kZXJfID0gZGVjb2RlcnNfLmZyb250KCk7Ci0gIGRlY29kZXJzXy5wb3BfZnJvbnQoKTsKLSAgRENIRUNLKGF1ZGlvX2RlY29kZXJfKTsKLSAgYXVkaW9fZGVjb2Rlcl8tPkluaXRpYWxpemUoCi0gICAgICBpbnB1dF9zdHJlYW1fLAotICAgICAgQmluZFRvQ3VycmVudExvb3AoYmFzZTo6QmluZCgKLSAgICAgICAgICAmQXVkaW9EZWNvZGVyU2VsZWN0b3I6OkRlY29kZXJJbml0RG9uZSwKLSAgICAgICAgICB3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCkpKSwKLSAgICAgIHN0YXRpc3RpY3NfY2JfKTsKLX0KLQotdm9pZCBBdWRpb0RlY29kZXJTZWxlY3Rvcjo6RGVjb2RlckluaXREb25lKFBpcGVsaW5lU3RhdHVzIHN0YXR1cykgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLQotICBpZiAoc3RhdHVzICE9IFBJUEVMSU5FX09LKSB7Ci0gICAgaWYgKCFkZWNvZGVyc18uZW1wdHkoKSkKLSAgICAgIEluaXRpYWxpemVOZXh0RGVjb2RlcigpOwotICAgIGVsc2UKLSAgICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZzZWxlY3RfZGVjb2Rlcl9jYl8pLlJ1bihOVUxMLCBOVUxMKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBkZWNvZGVyc18uY2xlYXIoKTsKLSAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnNlbGVjdF9kZWNvZGVyX2NiXykuUnVuKGF1ZGlvX2RlY29kZXJfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjcnlwdGVkX3N0cmVhbV8pOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL2F1ZGlvX2RlY29kZXJfc2VsZWN0b3IuaCBiL3NyYy9tZWRpYS9maWx0ZXJzL2F1ZGlvX2RlY29kZXJfc2VsZWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRhNDgzYi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9hdWRpb19kZWNvZGVyX3NlbGVjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0ZJTFRFUlNfQVVESU9fREVDT0RFUl9TRUxFQ1RPUl9IXwotI2RlZmluZSBNRURJQV9GSUxURVJTX0FVRElPX0RFQ09ERVJfU0VMRUNUT1JfSF8KLQotI2luY2x1ZGUgPGxpc3Q+Ci0KLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS93ZWFrX3B0ci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fZGVjb2Rlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVjcnlwdG9yLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZW11eGVyX3N0cmVhbS5oIgotCi1uYW1lc3BhY2UgYmFzZSB7Ci1jbGFzcyBNZXNzYWdlTG9vcFByb3h5OwotfQotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBEZWNvZGVyQnVmZmVyOwotY2xhc3MgRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW07Ci1jbGFzcyBEZWNyeXB0b3I7Ci0KLS8vIEF1ZGlvRGVjb2RlclNlbGVjdG9yIChjcmVhdGVzIGlmIG5lY2Vzc2FyeSBhbmQpIGluaXRpYWxpemVzIHRoZSBwcm9wZXIKLS8vIEF1ZGlvRGVjb2RlciBmb3IgYSBnaXZlbiBEZW11eGVyU3RyZWFtLiBJZiB0aGUgZ2l2ZW4gRGVtdXhlclN0cmVhbSBpcwotLy8gZW5jcnlwdGVkLCBhIERlY3J5cHRpbmdEZW11eGVyU3RyZWFtIG1heSBhbHNvIGJlIGNyZWF0ZWQuCi1jbGFzcyBNRURJQV9FWFBPUlQgQXVkaW9EZWNvZGVyU2VsZWN0b3IgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBzdGQ6Omxpc3Q8c2NvcGVkX3JlZnB0cjxBdWRpb0RlY29kZXI+ID4gQXVkaW9EZWNvZGVyTGlzdDsKLQotICAvLyBJbmRpY2F0ZXMgY29tcGxldGlvbiBvZiBBdWRpb0RlY29kZXIgc2VsZWN0aW9uLgotICAvLyAtIEZpcnN0IHBhcmFtZXRlcjogVGhlIGluaXRpYWxpemVkIEF1ZGlvRGVjb2Rlci4gSWYgaXQncyBzZXQgdG8gTlVMTCwgdGhlbgotICAvLyBBdWRpb0RlY29kZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkLgotICAvLyAtIFNlY29uZCBwYXJhbWV0ZXI6IFRoZSBpbml0aWFsaXplZCBEZWNyeXB0aW5nRGVtdXhlclN0cmVhbS4gSWYgaXQncyBub3QKLSAgLy8gTlVMTCwgdGhlbiBhIERlY3J5cHRpbmdEZW11eGVyU3RyZWFtIGlzIGNyZWF0ZWQgYW5kIGluaXRpYWxpemVkIHRvIGRvCi0gIC8vIGRlY3J5cHRpb24gZm9yIHRoZSBpbml0aWFsaXplZCBBdWRpb0RlY29kZXIuCi0gIC8vIE5vdGU6IFRoZSBjYWxsZXIgb3ducyBzZWxlY3RlZCBBdWRpb0RlY29kZXIgYW5kIERlY3J5cHRpbmdEZW11eGVyU3RyZWFtLgotICAvLyBUaGUgY2FsbGVyIHNob3VsZCBjYWxsIERlY3J5cHRpbmdEZW11eGVyU3RyZWFtOjpSZXNldCgpIGJlZm9yZQotICAvLyBjYWxsaW5nIEF1ZGlvRGVjb2Rlcjo6UmVzZXQoKSB0byByZWxlYXNlIGFueSBwZW5kaW5nIGRlY3J5cHRpb24gb3IgcmVhZC4KLSAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazwKLSAgICAgIHZvaWQoY29uc3Qgc2NvcGVkX3JlZnB0cjxBdWRpb0RlY29kZXI+JiwKLSAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNyeXB0aW5nRGVtdXhlclN0cmVhbT4mKT4gU2VsZWN0RGVjb2RlckNCOwotCi0gIC8vIHxzZXRfZGVjcnlwdG9yX3JlYWR5X2NifCBpcyBvcHRpb25hbC4gSWYgfHNldF9kZWNyeXB0b3JfcmVhZHlfY2J8IGlzIG51bGwsCi0gIC8vIG5vIGRlY3J5cHRvciB3aWxsIGJlIGF2YWlsYWJsZSB0byBwZXJmb3JtIGRlY3J5cHRpb24uCi0gIEF1ZGlvRGVjb2RlclNlbGVjdG9yKAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbWVzc2FnZV9sb29wLAotICAgICAgY29uc3QgQXVkaW9EZWNvZGVyTGlzdCYgZGVjb2RlcnMsCi0gICAgICBjb25zdCBTZXREZWNyeXB0b3JSZWFkeUNCJiBzZXRfZGVjcnlwdG9yX3JlYWR5X2NiKTsKLSAgfkF1ZGlvRGVjb2RlclNlbGVjdG9yKCk7Ci0KLSAgLy8gSW5pdGlhbGl6ZXMgYW5kIHNlbGVjdHMgYW4gQXVkaW9EZWNvZGVyIHRoYXQgY2FuIGRlY29kZSB0aGUgfHN0cmVhbXwuCi0gIC8vIFNlbGVjdGVkIEF1ZGlvRGVjb2RlciAoYW5kIERlY3J5cHRpbmdEZW11eGVyU3RyZWFtKSBpcyByZXR1cm5lZCB2aWEKLSAgLy8gdGhlIHxzZWxlY3RfZGVjb2Rlcl9jYnwuCi0gIHZvaWQgU2VsZWN0QXVkaW9EZWNvZGVyKGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4mIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdGlzdGljc0NCJiBzdGF0aXN0aWNzX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZWxlY3REZWNvZGVyQ0ImIHNlbGVjdF9kZWNvZGVyX2NiKTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgRGVjcnlwdGluZ0F1ZGlvRGVjb2RlckluaXREb25lKFBpcGVsaW5lU3RhdHVzIHN0YXR1cyk7Ci0gIHZvaWQgRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW1Jbml0RG9uZShQaXBlbGluZVN0YXR1cyBzdGF0dXMpOwotICB2b2lkIEluaXRpYWxpemVOZXh0RGVjb2RlcigpOwotICB2b2lkIERlY29kZXJJbml0RG9uZShQaXBlbGluZVN0YXR1cyBzdGF0dXMpOwotCi0gIHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4gbWVzc2FnZV9sb29wXzsKLSAgQXVkaW9EZWNvZGVyTGlzdCBkZWNvZGVyc187Ci0gIFNldERlY3J5cHRvclJlYWR5Q0Igc2V0X2RlY3J5cHRvcl9yZWFkeV9jYl87Ci0KLSAgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiBpbnB1dF9zdHJlYW1fOwotICBTdGF0aXN0aWNzQ0Igc3RhdGlzdGljc19jYl87Ci0gIFNlbGVjdERlY29kZXJDQiBzZWxlY3RfZGVjb2Rlcl9jYl87Ci0KLSAgc2NvcGVkX3JlZnB0cjxBdWRpb0RlY29kZXI+IGF1ZGlvX2RlY29kZXJfOwotICBzY29wZWRfcmVmcHRyPERlY3J5cHRpbmdEZW11eGVyU3RyZWFtPiBkZWNyeXB0ZWRfc3RyZWFtXzsKLQotICBiYXNlOjpXZWFrUHRyRmFjdG9yeTxBdWRpb0RlY29kZXJTZWxlY3Rvcj4gd2Vha19wdHJfZmFjdG9yeV87Ci0KLSAgRElTQUxMT1dfSU1QTElDSVRfQ09OU1RSVUNUT1JTKEF1ZGlvRGVjb2RlclNlbGVjdG9yKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0ZJTFRFUlNfQVVESU9fREVDT0RFUl9TRUxFQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvYXVkaW9fZGVjb2Rlcl9zZWxlY3Rvcl91bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9maWx0ZXJzL2F1ZGlvX2RlY29kZXJfc2VsZWN0b3JfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMDYzMWEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvYXVkaW9fZGVjb2Rlcl9zZWxlY3Rvcl91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2dtb2NrX2NhbGxiYWNrX3N1cHBvcnQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21vY2tfZmlsdGVycy5oIgotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvYXVkaW9fZGVjb2Rlcl9zZWxlY3Rvci5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi11c2luZyA6OnRlc3Rpbmc6Ol87Ci11c2luZyA6OnRlc3Rpbmc6OklzTnVsbDsKLXVzaW5nIDo6dGVzdGluZzo6TmljZU1vY2s7Ci11c2luZyA6OnRlc3Rpbmc6Ok5vdE51bGw7Ci11c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKLXVzaW5nIDo6dGVzdGluZzo6UmV0dXJuUmVmOwotdXNpbmcgOjp0ZXN0aW5nOjpTdHJpY3RNb2NrOwotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBBdWRpb0RlY29kZXJTZWxlY3RvclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gIGVudW0gRGVjcnlwdG9yQ2FwYWJpbGl0eSB7Ci0gICAga05vRGVjcnlwdG9yLAotICAgIGtEZWNyeXB0T25seSwKLSAgICBrRGVjcnlwdEFuZERlY29kZQotICB9OwotCi0gIEF1ZGlvRGVjb2RlclNlbGVjdG9yVGVzdCgpCi0gICAgICA6IGNsZWFyX2F1ZGlvX2NvbmZpZ18oCi0gICAgICAgICAgICBrQ29kZWNWb3JiaXMsIDE2LCBDSEFOTkVMX0xBWU9VVF9TVEVSRU8sIDQ0MTAwLCBOVUxMLCAwLCBmYWxzZSksCi0gICAgICAgIGVuY3J5cHRlZF9hdWRpb19jb25maWdfKAotICAgICAgICAgICAga0NvZGVjVm9yYmlzLCAxNiwgQ0hBTk5FTF9MQVlPVVRfU1RFUkVPLCA0NDEwMCwgTlVMTCwgMCwgdHJ1ZSksCi0gICAgICAgIGRlbXV4ZXJfc3RyZWFtXyhuZXcgU3RyaWN0TW9jazxNb2NrRGVtdXhlclN0cmVhbT4oKSksCi0gICAgICAgIGRlY3J5cHRvcl8obmV3IE5pY2VNb2NrPE1vY2tEZWNyeXB0b3I+KCkpLAotICAgICAgICBkZWNvZGVyXzFfKG5ldyBTdHJpY3RNb2NrPE1vY2tBdWRpb0RlY29kZXI+KCkpLAotICAgICAgICBkZWNvZGVyXzJfKG5ldyBTdHJpY3RNb2NrPE1vY2tBdWRpb0RlY29kZXI+KCkpIHsKLSAgICBhbGxfZGVjb2RlcnNfLnB1c2hfYmFjayhkZWNvZGVyXzFfKTsKLSAgICBhbGxfZGVjb2RlcnNfLnB1c2hfYmFjayhkZWNvZGVyXzJfKTsKLQotICAgIEVYUEVDVF9DQUxMKCpkZW11eGVyX3N0cmVhbV8sIHR5cGUoKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybihEZW11eGVyU3RyZWFtOjpBVURJTykpOwotICB9Ci0KLSAgTU9DS19NRVRIT0QxKE9uU3RhdGlzdGljcywgdm9pZChjb25zdCBQaXBlbGluZVN0YXRpc3RpY3MmKSk7Ci0gIE1PQ0tfTUVUSE9EMShTZXREZWNyeXB0b3JSZWFkeUNhbGxiYWNrLCB2b2lkKGNvbnN0IG1lZGlhOjpEZWNyeXB0b3JSZWFkeUNCJikpOwotICBNT0NLX01FVEhPRDIoT25EZWNvZGVyU2VsZWN0ZWQsCi0gICAgICAgICAgICAgICB2b2lkKGNvbnN0IHNjb3BlZF9yZWZwdHI8QXVkaW9EZWNvZGVyPiYsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW0+JikpOwotCi0gIHZvaWQgVXNlQ2xlYXJTdHJlYW0oKSB7Ci0gICAgRVhQRUNUX0NBTEwoKmRlbXV4ZXJfc3RyZWFtXywgYXVkaW9fZGVjb2Rlcl9jb25maWcoKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVyblJlZihjbGVhcl9hdWRpb19jb25maWdfKSk7Ci0gIH0KLQotICB2b2lkIFVzZUVuY3J5cHRlZFN0cmVhbSgpIHsKLSAgICBFWFBFQ1RfQ0FMTCgqZGVtdXhlcl9zdHJlYW1fLCBhdWRpb19kZWNvZGVyX2NvbmZpZygpKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuUmVmKGVuY3J5cHRlZF9hdWRpb19jb25maWdfKSk7Ci0gIH0KLQotICB2b2lkIEluaXRpYWxpemVEZWNvZGVyU2VsZWN0b3IoRGVjcnlwdG9yQ2FwYWJpbGl0eSBkZWNyeXB0b3JfY2FwYWJpbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fZGVjb2RlcnMpIHsKLSAgICBTZXREZWNyeXB0b3JSZWFkeUNCIHNldF9kZWNyeXB0b3JfcmVhZHlfY2I7Ci0gICAgaWYgKGRlY3J5cHRvcl9jYXBhYmlsaXR5ID09IGtEZWNyeXB0T25seSB8fAotICAgICAgICBkZWNyeXB0b3JfY2FwYWJpbGl0eSA9PSBrRGVjcnlwdEFuZERlY29kZSkgewotICAgICAgc2V0X2RlY3J5cHRvcl9yZWFkeV9jYiA9IGJhc2U6OkJpbmQoCi0gICAgICAgICAgJkF1ZGlvRGVjb2RlclNlbGVjdG9yVGVzdDo6U2V0RGVjcnlwdG9yUmVhZHlDYWxsYmFjaywKLSAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKTsKLQotICAgICAgRVhQRUNUX0NBTEwoKnRoaXMsIFNldERlY3J5cHRvclJlYWR5Q2FsbGJhY2soXykpCi0gICAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJ1bkNhbGxiYWNrPDA+KGRlY3J5cHRvcl8uZ2V0KCkpKTsKLQotICAgICAgaWYgKGRlY3J5cHRvcl9jYXBhYmlsaXR5ID09IGtEZWNyeXB0T25seSkgewotICAgICAgICBFWFBFQ1RfQ0FMTCgqZGVjcnlwdG9yXywgSW5pdGlhbGl6ZUF1ZGlvRGVjb2Rlck1vY2soXywgXykpCi0gICAgICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUnVuQ2FsbGJhY2s8MT4oZmFsc2UpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEVYUEVDVF9DQUxMKCpkZWNyeXB0b3JfLCBJbml0aWFsaXplQXVkaW9EZWNvZGVyTW9jayhfLCBfKSkKLSAgICAgICAgICAgIC5XaWxsUmVwZWF0ZWRseShSdW5DYWxsYmFjazwxPih0cnVlKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgRENIRUNLX0dFKGFsbF9kZWNvZGVyc18uc2l6ZSgpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KG51bV9kZWNvZGVycykpOwotICAgIEF1ZGlvRGVjb2RlclNlbGVjdG9yOjpBdWRpb0RlY29kZXJMaXN0IGRlY29kZXJzKAotICAgICAgICBhbGxfZGVjb2RlcnNfLmJlZ2luKCksIGFsbF9kZWNvZGVyc18uYmVnaW4oKSArIG51bV9kZWNvZGVycyk7Ci0KLSAgICBkZWNvZGVyX3NlbGVjdG9yXy5yZXNldChuZXcgQXVkaW9EZWNvZGVyU2VsZWN0b3IoCi0gICAgICAgIG1lc3NhZ2VfbG9vcF8ubWVzc2FnZV9sb29wX3Byb3h5KCksCi0gICAgICAgIGRlY29kZXJzLAotICAgICAgICBzZXRfZGVjcnlwdG9yX3JlYWR5X2NiKSk7Ci0gIH0KLQotICB2b2lkIFNlbGVjdERlY29kZXIoKSB7Ci0gICAgZGVjb2Rlcl9zZWxlY3Rvcl8tPlNlbGVjdEF1ZGlvRGVjb2RlcigKLSAgICAgICAgZGVtdXhlcl9zdHJlYW1fLAotICAgICAgICBiYXNlOjpCaW5kKCZBdWRpb0RlY29kZXJTZWxlY3RvclRlc3Q6Ok9uU3RhdGlzdGljcywKLSAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgICAgYmFzZTo6QmluZCgmQXVkaW9EZWNvZGVyU2VsZWN0b3JUZXN0OjpPbkRlY29kZXJTZWxlY3RlZCwKLSAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gICAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLSAgfQotCi0gIC8vIEZpeHR1cmUgbWVtYmVycy4KLSAgc2NvcGVkX3B0cjxBdWRpb0RlY29kZXJTZWxlY3Rvcj4gZGVjb2Rlcl9zZWxlY3Rvcl87Ci0gIEF1ZGlvRGVjb2RlckNvbmZpZyBjbGVhcl9hdWRpb19jb25maWdfOwotICBBdWRpb0RlY29kZXJDb25maWcgZW5jcnlwdGVkX2F1ZGlvX2NvbmZpZ187Ci0gIHNjb3BlZF9yZWZwdHI8U3RyaWN0TW9jazxNb2NrRGVtdXhlclN0cmVhbT4gPiBkZW11eGVyX3N0cmVhbV87Ci0gIC8vIFVzZSBOaWNlTW9jayBzaW5jZSB3ZSBkb24ndCBjYXJlIGFib3V0IG1vc3Qgb2YgY2FsbHMgb24gdGhlIGRlY3J5cHRvciwgZS5nLgotICAvLyBSZWdpc3RlcktleUFkZGVkQ0IoKS4KLSAgc2NvcGVkX3B0cjxOaWNlTW9jazxNb2NrRGVjcnlwdG9yPiA+IGRlY3J5cHRvcl87Ci0gIHNjb3BlZF9yZWZwdHI8U3RyaWN0TW9jazxNb2NrQXVkaW9EZWNvZGVyPiA+IGRlY29kZXJfMV87Ci0gIHNjb3BlZF9yZWZwdHI8U3RyaWN0TW9jazxNb2NrQXVkaW9EZWNvZGVyPiA+IGRlY29kZXJfMl87Ci0gIHN0ZDo6dmVjdG9yPHNjb3BlZF9yZWZwdHI8QXVkaW9EZWNvZGVyPiA+IGFsbF9kZWNvZGVyc187Ci0gIE1lc3NhZ2VMb29wIG1lc3NhZ2VfbG9vcF87Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQXVkaW9EZWNvZGVyU2VsZWN0b3JUZXN0KTsKLX07Ci0KLS8vIFRoZSBzdHJlYW0gaXMgbm90IGVuY3J5cHRlZCBidXQgd2UgaGF2ZSBubyBjbGVhciBkZWNvZGVyLiBObyBkZWNvZGVyIGNhbiBiZQotLy8gc2VsZWN0ZWQuCi1URVNUX0YoQXVkaW9EZWNvZGVyU2VsZWN0b3JUZXN0LCBDbGVhclN0cmVhbV9Ob0RlY3J5cHRvcl9Ob0NsZWFyRGVjb2RlcikgewotICBVc2VDbGVhclN0cmVhbSgpOwotICBJbml0aWFsaXplRGVjb2RlclNlbGVjdG9yKGtOb0RlY3J5cHRvciwgMCk7Ci0KLSAgRVhQRUNUX0NBTEwoKnRoaXMsIE9uRGVjb2RlclNlbGVjdGVkKElzTnVsbCgpLCBJc051bGwoKSkpOwotCi0gIFNlbGVjdERlY29kZXIoKTsKLX0KLQotLy8gVGhlIHN0cmVhbSBpcyBub3QgZW5jcnlwdGVkIGFuZCB3ZSBoYXZlIG9uZSBjbGVhciBkZWNvZGVyLiBUaGUgZGVjb2RlcgotLy8gd2lsbCBiZSBzZWxlY3RlZC4KLVRFU1RfRihBdWRpb0RlY29kZXJTZWxlY3RvclRlc3QsIENsZWFyU3RyZWFtX05vRGVjcnlwdG9yX09uZUNsZWFyRGVjb2RlcikgewotICBVc2VDbGVhclN0cmVhbSgpOwotICBJbml0aWFsaXplRGVjb2RlclNlbGVjdG9yKGtOb0RlY3J5cHRvciwgMSk7Ci0KLSAgRVhQRUNUX0NBTEwoKmRlY29kZXJfMV8sIEluaXRpYWxpemUoXywgXywgXykpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MT4oUElQRUxJTkVfT0spKTsKLSAgRVhQRUNUX0NBTEwoKnRoaXMsIE9uRGVjb2RlclNlbGVjdGVkKHNjb3BlZF9yZWZwdHI8QXVkaW9EZWNvZGVyPihkZWNvZGVyXzFfKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzTnVsbCgpKSk7Ci0KLSAgU2VsZWN0RGVjb2RlcigpOwotfQotCi0vLyBUaGUgc3RyZWFtIGlzIG5vdCBlbmNyeXB0ZWQgYW5kIHdlIGhhdmUgbXVsdGlwbGUgY2xlYXIgZGVjb2RlcnMuIFRoZSBmaXJzdAotLy8gZGVjb2RlciB0aGF0IGNhbiBkZWNvZGUgdGhlIGlucHV0IHN0cmVhbSB3aWxsIGJlIHNlbGVjdGVkLgotVEVTVF9GKEF1ZGlvRGVjb2RlclNlbGVjdG9yVGVzdCwgQ2xlYXJTdHJlYW1fTm9EZWNyeXB0b3JfTXVsdGlwbGVDbGVhckRlY29kZXIpIHsKLSAgVXNlQ2xlYXJTdHJlYW0oKTsKLSAgSW5pdGlhbGl6ZURlY29kZXJTZWxlY3RvcihrTm9EZWNyeXB0b3IsIDIpOwotCi0gIEVYUEVDVF9DQUxMKCpkZWNvZGVyXzFfLCBJbml0aWFsaXplKF8sIF8sIF8pKQotICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrPDE+KERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCkpOwotICBFWFBFQ1RfQ0FMTCgqZGVjb2Rlcl8yXywgSW5pdGlhbGl6ZShfLCBfLCBfKSkKLSAgICAgIC5XaWxsT25jZShSdW5DYWxsYmFjazwxPihQSVBFTElORV9PSykpOwotICBFWFBFQ1RfQ0FMTCgqdGhpcywgT25EZWNvZGVyU2VsZWN0ZWQoc2NvcGVkX3JlZnB0cjxBdWRpb0RlY29kZXI+KGRlY29kZXJfMl8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNOdWxsKCkpKTsKLQotICBTZWxlY3REZWNvZGVyKCk7Ci19Ci0KLS8vIFRoZXJlIGlzIGEgZGVjcnlwdG9yIGJ1dCB0aGUgc3RyZWFtIGlzIG5vdCBlbmNyeXB0ZWQuIFRoZSBkZWNvZGVyIHdpbGwgYmUKLS8vIHNlbGVjdGVkLgotVEVTVF9GKEF1ZGlvRGVjb2RlclNlbGVjdG9yVGVzdCwgQ2xlYXJTdHJlYW1fSGFzRGVjcnlwdG9yKSB7Ci0gIFVzZUNsZWFyU3RyZWFtKCk7Ci0gIEluaXRpYWxpemVEZWNvZGVyU2VsZWN0b3Ioa0RlY3J5cHRPbmx5LCAxKTsKLQotICBFWFBFQ1RfQ0FMTCgqZGVjb2Rlcl8xXywgSW5pdGlhbGl6ZShfLCBfLCBfKSkKLSAgICAgIC5XaWxsT25jZShSdW5DYWxsYmFjazwxPihQSVBFTElORV9PSykpOwotICBFWFBFQ1RfQ0FMTCgqdGhpcywgT25EZWNvZGVyU2VsZWN0ZWQoc2NvcGVkX3JlZnB0cjxBdWRpb0RlY29kZXI+KGRlY29kZXJfMV8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNOdWxsKCkpKTsKLQotICBTZWxlY3REZWNvZGVyKCk7Ci19Ci0KLS8vIFRoZSBzdHJlYW0gaXMgZW5jcnlwdGVkIGFuZCB0aGVyZSdzIG5vIGRlY3J5cHRvci4gTm8gZGVjb2RlciBjYW4gYmUgc2VsZWN0ZWQuCi1URVNUX0YoQXVkaW9EZWNvZGVyU2VsZWN0b3JUZXN0LCBFbmNyeXB0ZWRTdHJlYW1fTm9EZWNyeXB0b3IpIHsKLSAgVXNlRW5jcnlwdGVkU3RyZWFtKCk7Ci0gIEluaXRpYWxpemVEZWNvZGVyU2VsZWN0b3Ioa05vRGVjcnlwdG9yLCAxKTsKLQotICBFWFBFQ1RfQ0FMTCgqdGhpcywgT25EZWNvZGVyU2VsZWN0ZWQoSXNOdWxsKCksIElzTnVsbCgpKSk7Ci0KLSAgU2VsZWN0RGVjb2RlcigpOwotfQotCi0vLyBEZWNyeXB0b3IgY2FuIG9ubHkgZG8gZGVjcnlwdGlvbiBhbmQgdGhlcmUncyBubyBkZWNvZGVyIGF2YWlsYWJsZS4gTm8gZGVjb2RlcgotLy8gY2FuIGJlIHNlbGVjdGVkLgotVEVTVF9GKEF1ZGlvRGVjb2RlclNlbGVjdG9yVGVzdCwgRW5jcnlwdGVkU3RyZWFtX0RlY3J5cHRPbmx5X05vQ2xlYXJEZWNvZGVyKSB7Ci0gIFVzZUVuY3J5cHRlZFN0cmVhbSgpOwotICBJbml0aWFsaXplRGVjb2RlclNlbGVjdG9yKGtEZWNyeXB0T25seSwgMCk7Ci0KLSAgRVhQRUNUX0NBTEwoKnRoaXMsIE9uRGVjb2RlclNlbGVjdGVkKElzTnVsbCgpLCBJc051bGwoKSkpOwotCi0gIFNlbGVjdERlY29kZXIoKTsKLX0KLQotLy8gRGVjcnlwdG9yIGNhbiBkbyBkZWNyeXB0aW9uLW9ubHkgYW5kIHRoZXJlJ3MgYSBkZWNvZGVyIGF2YWlsYWJsZS4gVGhlIGRlY29kZXIKLS8vIHdpbGwgYmUgc2VsZWN0ZWQgYW5kIGEgRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW0gd2lsbCBiZSBjcmVhdGVkLgotVEVTVF9GKEF1ZGlvRGVjb2RlclNlbGVjdG9yVGVzdCwgRW5jcnlwdGVkU3RyZWFtX0RlY3J5cHRPbmx5X09uZUNsZWFyRGVjb2RlcikgewotICBVc2VFbmNyeXB0ZWRTdHJlYW0oKTsKLSAgSW5pdGlhbGl6ZURlY29kZXJTZWxlY3RvcihrRGVjcnlwdE9ubHksIDEpOwotCi0gIEVYUEVDVF9DQUxMKCpkZWNvZGVyXzFfLCBJbml0aWFsaXplKF8sIF8sIF8pKQotICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrPDE+KFBJUEVMSU5FX09LKSk7Ci0gIEVYUEVDVF9DQUxMKCp0aGlzLCBPbkRlY29kZXJTZWxlY3RlZChzY29wZWRfcmVmcHRyPEF1ZGlvRGVjb2Rlcj4oZGVjb2Rlcl8xXyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3ROdWxsKCkpKTsKLQotICBTZWxlY3REZWNvZGVyKCk7Ci19Ci0KLS8vIERlY3J5cHRvciBjYW4gb25seSBkbyBkZWNyeXB0aW9uIGFuZCB0aGVyZSBhcmUgbXVsdGlwbGUgZGVjb2RlcnMgYXZhaWxhYmxlLgotLy8gVGhlIGZpcnN0IGRlY29kZXIgdGhhdCBjYW4gZGVjb2RlIHRoZSBpbnB1dCBzdHJlYW0gd2lsbCBiZSBzZWxlY3RlZCBhbmQKLS8vIGEgRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW0gd2lsbCBiZSBjcmVhdGVkLgotVEVTVF9GKEF1ZGlvRGVjb2RlclNlbGVjdG9yVGVzdCwKLSAgICAgICBFbmNyeXB0ZWRTdHJlYW1fRGVjcnlwdE9ubHlfTXVsdGlwbGVDbGVhckRlY29kZXIpIHsKLSAgVXNlRW5jcnlwdGVkU3RyZWFtKCk7Ci0gIEluaXRpYWxpemVEZWNvZGVyU2VsZWN0b3Ioa0RlY3J5cHRPbmx5LCAyKTsKLQotICBFWFBFQ1RfQ0FMTCgqZGVjb2Rlcl8xXywgSW5pdGlhbGl6ZShfLCBfLCBfKSkKLSAgICAgIC5XaWxsT25jZShSdW5DYWxsYmFjazwxPihERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQpKTsKLSAgRVhQRUNUX0NBTEwoKmRlY29kZXJfMl8sIEluaXRpYWxpemUoXywgXywgXykpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MT4oUElQRUxJTkVfT0spKTsKLSAgRVhQRUNUX0NBTEwoKnRoaXMsIE9uRGVjb2RlclNlbGVjdGVkKHNjb3BlZF9yZWZwdHI8QXVkaW9EZWNvZGVyPihkZWNvZGVyXzJfKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdE51bGwoKSkpOwotCi0gIFNlbGVjdERlY29kZXIoKTsKLX0KLQotLy8gRGVjcnlwdG9yIGNhbiBkbyBkZWNyeXB0aW9uIGFuZCBkZWNvZGluZy4gQSBEZWNyeXB0aW5nQXVkaW9EZWNvZGVyIHdpbGwgYmUKLS8vIGNyZWF0ZWQgYW5kIHNlbGVjdGVkLiBUaGUgY2xlYXIgZGVjb2RlcnMgc2hvdWxkIG5vdCBiZSB0b3VjaGVkIGF0IGFsbC4KLS8vIE5vIERlY3J5cHRpbmdEZW11eGVyU3RyZWFtIHNob3VsZCB0byBiZSBjcmVhdGVkLgotVEVTVF9GKEF1ZGlvRGVjb2RlclNlbGVjdG9yVGVzdCwgRW5jcnlwdGVkU3RyZWFtX0RlY3J5cHRBbmREZWNvZGUpIHsKLSAgVXNlRW5jcnlwdGVkU3RyZWFtKCk7Ci0gIEluaXRpYWxpemVEZWNvZGVyU2VsZWN0b3Ioa0RlY3J5cHRBbmREZWNvZGUsIDEpOwotCi0gIEVYUEVDVF9DQUxMKCp0aGlzLCBPbkRlY29kZXJTZWxlY3RlZChOb3ROdWxsKCksIElzTnVsbCgpKSk7Ci0KLSAgU2VsZWN0RGVjb2RlcigpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL2F1ZGlvX2ZpbGVfcmVhZGVyLmNjIGIvc3JjL21lZGlhL2ZpbHRlcnMvYXVkaW9fZmlsZV9yZWFkZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjk1YjYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvYXVkaW9fZmlsZV9yZWFkZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvYXVkaW9fZmlsZV9yZWFkZXIuaCIKLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvdGltZS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fYnVzLmgiCi0jaW5jbHVkZSAibWVkaWEvZmZtcGVnL2ZmbXBlZ19jb21tb24uaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL2ZmbXBlZ19nbHVlLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLUF1ZGlvRmlsZVJlYWRlcjo6QXVkaW9GaWxlUmVhZGVyKEZGbXBlZ1VSTFByb3RvY29sKiBwcm90b2NvbCkKLSAgICA6IGNvZGVjX2NvbnRleHRfKE5VTEwpLAotICAgICAgc3RyZWFtX2luZGV4XygwKSwKLSAgICAgIHByb3RvY29sXyhwcm90b2NvbCkgewotfQotCi1BdWRpb0ZpbGVSZWFkZXI6On5BdWRpb0ZpbGVSZWFkZXIoKSB7Ci0gIENsb3NlKCk7Ci19Ci0KLWludCBBdWRpb0ZpbGVSZWFkZXI6OmNoYW5uZWxzKCkgY29uc3QgewotICByZXR1cm4gY29kZWNfY29udGV4dF8tPmNoYW5uZWxzOwotfQotCi1pbnQgQXVkaW9GaWxlUmVhZGVyOjpzYW1wbGVfcmF0ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGNvZGVjX2NvbnRleHRfLT5zYW1wbGVfcmF0ZTsKLX0KLQotYmFzZTo6VGltZURlbHRhIEF1ZGlvRmlsZVJlYWRlcjo6ZHVyYXRpb24oKSBjb25zdCB7Ci0gIGNvbnN0IEFWUmF0aW9uYWwgYXZfdGltZV9iYXNlID0gezEsIEFWX1RJTUVfQkFTRX07Ci0KLSAgLy8gQWRkIG9uZSBtaWNyb3NlY29uZCB0byBhdm9pZCByb3VuZGluZy1kb3duIGVycm9ycyB3aGljaCBjYW4gb2NjdXIgd2hlbgotICAvLyB8ZHVyYXRpb258IGhhcyBiZWVuIGNhbGN1bGF0ZWQgZnJvbSBhbiBleGFjdCBudW1iZXIgb2Ygc2FtcGxlLWZyYW1lcy4KLSAgLy8gT25lIG1pY3Jvc2Vjb25kIGlzIG11Y2ggbGVzcyB0aGFuIHRoZSB0aW1lIG9mIGEgc2luZ2xlIHNhbXBsZS1mcmFtZQotICAvLyBhdCBhbnkgcmVhbC13b3JsZCBzYW1wbGUtcmF0ZS4KLSAgcmV0dXJuIENvbnZlcnRGcm9tVGltZUJhc2UoCi0gICAgICBhdl90aW1lX2Jhc2UsIGdsdWVfLT5mb3JtYXRfY29udGV4dCgpLT5kdXJhdGlvbiArIDEpOwotfQotCi1pbnQ2NCBBdWRpb0ZpbGVSZWFkZXI6Om51bWJlcl9vZl9mcmFtZXMoKSBjb25zdCB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ2ND4oZHVyYXRpb24oKS5JblNlY29uZHNGKCkgKiBzYW1wbGVfcmF0ZSgpKTsKLX0KLQotYm9vbCBBdWRpb0ZpbGVSZWFkZXI6Ok9wZW4oKSB7Ci0gIGdsdWVfLnJlc2V0KG5ldyBGRm1wZWdHbHVlKHByb3RvY29sXykpOwotICBBVkZvcm1hdENvbnRleHQqIGZvcm1hdF9jb250ZXh0ID0gZ2x1ZV8tPmZvcm1hdF9jb250ZXh0KCk7Ci0KLSAgLy8gT3BlbiBGRm1wZWcgQVZGb3JtYXRDb250ZXh0LgotICBpZiAoIWdsdWVfLT5PcGVuQ29udGV4dCgpKSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCAiQXVkaW9GaWxlUmVhZGVyOjpPcGVuKCkgOiBlcnJvciBpbiBhdmZvcm1hdF9vcGVuX2lucHV0KCkiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIEdldCB0aGUgY29kZWMgY29udGV4dC4KLSAgY29kZWNfY29udGV4dF8gPSBOVUxMOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZvcm1hdF9jb250ZXh0LT5uYl9zdHJlYW1zOyArK2kpIHsKLSAgICBBVkNvZGVjQ29udGV4dCogYyA9IGZvcm1hdF9jb250ZXh0LT5zdHJlYW1zW2ldLT5jb2RlYzsKLSAgICBpZiAoYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKLSAgICAgIGNvZGVjX2NvbnRleHRfID0gYzsKLSAgICAgIHN0cmVhbV9pbmRleF8gPSBpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLy8gR2V0IHRoZSBjb2RlYy4KLSAgaWYgKCFjb2RlY19jb250ZXh0XykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW50IHJlc3VsdCA9IGF2Zm9ybWF0X2ZpbmRfc3RyZWFtX2luZm8oZm9ybWF0X2NvbnRleHQsIE5VTEwpOwotICBpZiAocmVzdWx0IDwgMCkgewotICAgIERMT0coV0FSTklORykKLSAgICAgICAgPDwgIkF1ZGlvRmlsZVJlYWRlcjo6T3BlbigpIDogZXJyb3IgaW4gYXZmb3JtYXRfZmluZF9zdHJlYW1faW5mbygpIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBBVkNvZGVjKiBjb2RlYyA9IGF2Y29kZWNfZmluZF9kZWNvZGVyKGNvZGVjX2NvbnRleHRfLT5jb2RlY19pZCk7Ci0gIGlmIChjb2RlYykgewotICAgIGlmICgocmVzdWx0ID0gYXZjb2RlY19vcGVuMihjb2RlY19jb250ZXh0XywgY29kZWMsIE5VTEwpKSA8IDApIHsKLSAgICAgIERMT0coV0FSTklORykgPDwgIkF1ZGlvRmlsZVJlYWRlcjo6T3BlbigpIDogY291bGQgbm90IG9wZW4gY29kZWMgLSIKLSAgICAgICAgICA8PCAiIHJlc3VsdDogIiA8PCByZXN1bHQ7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9IGVsc2UgewotICAgIERMT0coV0FSTklORykgPDwgIkF1ZGlvRmlsZVJlYWRlcjo6T3BlbigpIDogY291bGQgbm90IGZpbmQgY29kZWMgLSIKLSAgICAgICAgPDwgIiByZXN1bHQ6ICIgPDwgcmVzdWx0OwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEF1ZGlvRmlsZVJlYWRlcjo6Q2xvc2UoKSB7Ci0gIGlmIChjb2RlY19jb250ZXh0XykgewotICAgIGF2Y29kZWNfY2xvc2UoY29kZWNfY29udGV4dF8pOwotICAgIGNvZGVjX2NvbnRleHRfID0gTlVMTDsKLSAgfQotfQotCi1pbnQgQXVkaW9GaWxlUmVhZGVyOjpSZWFkKEF1ZGlvQnVzKiBhdWRpb19idXMpIHsKLSAgRENIRUNLKGdsdWVfLmdldCgpICYmIGNvZGVjX2NvbnRleHRfKSA8PAotICAgICAgIkF1ZGlvRmlsZVJlYWRlcjo6UmVhZCgpIDogcmVhZGVyIGlzIG5vdCBvcGVuZWQhIjsKLQotICBEQ0hFQ0tfRVEoYXVkaW9fYnVzLT5jaGFubmVscygpLCBjaGFubmVscygpKTsKLSAgaWYgKGF1ZGlvX2J1cy0+Y2hhbm5lbHMoKSAhPSBjaGFubmVscygpKQotICAgIHJldHVybiAwOwotCi0gIHNpemVfdCBieXRlc19wZXJfc2FtcGxlID0gYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUoY29kZWNfY29udGV4dF8tPnNhbXBsZV9mbXQpOwotCi0gIC8vIEhvbGRzIGRlY29kZWQgYXVkaW8uCi0gIHNjb3BlZF9wdHJfbWFsbG9jPEFWRnJhbWUsIFNjb3BlZFB0ckFWRnJlZT4gYXZfZnJhbWUoYXZjb2RlY19hbGxvY19mcmFtZSgpKTsKLQotICAvLyBSZWFkIHVudGlsIHdlIGhpdCBFT0Ygb3Igd2UndmUgcmVhZCB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBmcmFtZXMuCi0gIEFWUGFja2V0IHBhY2tldDsKLSAgaW50IGN1cnJlbnRfZnJhbWUgPSAwOwotICBib29sIGNvbnRpbnVlX2RlY29kaW5nID0gdHJ1ZTsKLQotICB3aGlsZSAoY3VycmVudF9mcmFtZSA8IGF1ZGlvX2J1cy0+ZnJhbWVzKCkgJiYgY29udGludWVfZGVjb2RpbmcgJiYKLSAgICAgICAgIGF2X3JlYWRfZnJhbWUoZ2x1ZV8tPmZvcm1hdF9jb250ZXh0KCksICZwYWNrZXQpID49IDAgJiYKLSAgICAgICAgIGF2X2R1cF9wYWNrZXQoJnBhY2tldCkgPj0gMCkgewotICAgIC8vIFNraXAgcGFja2V0cyBmcm9tIG90aGVyIHN0cmVhbXMuCi0gICAgaWYgKHBhY2tldC5zdHJlYW1faW5kZXggIT0gc3RyZWFtX2luZGV4XykgewotICAgICAgYXZfZnJlZV9wYWNrZXQoJnBhY2tldCk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICAvLyBNYWtlIGEgc2hhbGxvdyBjb3B5IG9mIHBhY2tldCBzbyB3ZSBjYW4gc2xpZGUgcGFja2V0LmRhdGEgYXMgZnJhbWVzIGFyZQotICAgIC8vIGRlY29kZWQgZnJvbSB0aGUgcGFja2V0OyBvdGhlcndpc2UgYXZfZnJlZV9wYWNrZXQoKSB3aWxsIGNvcnJ1cHQgbWVtb3J5LgotICAgIEFWUGFja2V0IHBhY2tldF90ZW1wID0gcGFja2V0OwotICAgIGRvIHsKLSAgICAgIGF2Y29kZWNfZ2V0X2ZyYW1lX2RlZmF1bHRzKGF2X2ZyYW1lLmdldCgpKTsKLSAgICAgIGludCBmcmFtZV9kZWNvZGVkID0gMDsKLSAgICAgIGludCByZXN1bHQgPSBhdmNvZGVjX2RlY29kZV9hdWRpbzQoCi0gICAgICAgICAgY29kZWNfY29udGV4dF8sIGF2X2ZyYW1lLmdldCgpLCAmZnJhbWVfZGVjb2RlZCwgJnBhY2tldF90ZW1wKTsKLQotICAgICAgaWYgKHJlc3VsdCA8IDApIHsKLSAgICAgICAgRExPRyhXQVJOSU5HKQotICAgICAgICAgICAgPDwgIkF1ZGlvRmlsZVJlYWRlcjo6UmVhZCgpIDogZXJyb3IgaW4gYXZjb2RlY19kZWNvZGVfYXVkaW80KCkgLSIKLSAgICAgICAgICAgIDw8IHJlc3VsdDsKLSAgICAgICAgY29udGludWVfZGVjb2RpbmcgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFVwZGF0ZSBwYWNrZXQgc2l6ZSBhbmQgZGF0YSBwb2ludGVyIGluIGNhc2Ugd2UgbmVlZCB0byBjYWxsIHRoZSBkZWNvZGVyCi0gICAgICAvLyB3aXRoIHRoZSByZW1haW5pbmcgYnl0ZXMgZnJvbSB0aGlzIHBhY2tldC4KLSAgICAgIHBhY2tldF90ZW1wLnNpemUgLT0gcmVzdWx0OwotICAgICAgcGFja2V0X3RlbXAuZGF0YSArPSByZXN1bHQ7Ci0KLSAgICAgIGlmICghZnJhbWVfZGVjb2RlZCkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIC8vIERldGVybWluZSB0aGUgbnVtYmVyIG9mIHNhbXBsZS1mcmFtZXMgd2UganVzdCBkZWNvZGVkLiAgQ2hlY2sgb3ZlcmZsb3cuCi0gICAgICBpbnQgZnJhbWVzX3JlYWQgPSBhdl9mcmFtZS0+bmJfc2FtcGxlczsKLSAgICAgIGlmIChmcmFtZXNfcmVhZCA8IDApIHsKLSAgICAgICAgY29udGludWVfZGVjb2RpbmcgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFRydW5jYXRlLCBpZiBuZWNlc3NhcnksIGlmIHRoZSBkZXN0aW5hdGlvbiBpc24ndCBiaWcgZW5vdWdoLgotICAgICAgaWYgKGN1cnJlbnRfZnJhbWUgKyBmcmFtZXNfcmVhZCA+IGF1ZGlvX2J1cy0+ZnJhbWVzKCkpCi0gICAgICAgIGZyYW1lc19yZWFkID0gYXVkaW9fYnVzLT5mcmFtZXMoKSAtIGN1cnJlbnRfZnJhbWU7Ci0KLSAgICAgIC8vIERlaW50ZXJsZWF2ZSBlYWNoIGNoYW5uZWwgYW5kIGNvbnZlcnQgdG8gMzJiaXQgZmxvYXRpbmctcG9pbnQKLSAgICAgIC8vIHdpdGggbm9taW5hbCByYW5nZSAtMS4wIC0+ICsxLjAuCi0gICAgICBhdWRpb19idXMtPkZyb21JbnRlcmxlYXZlZFBhcnRpYWwoCi0gICAgICAgICAgYXZfZnJhbWUtPmRhdGFbMF0sIGN1cnJlbnRfZnJhbWUsIGZyYW1lc19yZWFkLCBieXRlc19wZXJfc2FtcGxlKTsKLQotICAgICAgY3VycmVudF9mcmFtZSArPSBmcmFtZXNfcmVhZDsKLSAgICB9IHdoaWxlIChwYWNrZXRfdGVtcC5zaXplID4gMCk7Ci0gICAgYXZfZnJlZV9wYWNrZXQoJnBhY2tldCk7Ci0gIH0KLQotICAvLyBaZXJvIGFueSByZW1haW5pbmcgZnJhbWVzLgotICBhdWRpb19idXMtPlplcm9GcmFtZXNQYXJ0aWFsKAotICAgICAgY3VycmVudF9mcmFtZSwgYXVkaW9fYnVzLT5mcmFtZXMoKSAtIGN1cnJlbnRfZnJhbWUpOwotCi0gIC8vIFJldHVybnMgdGhlIGFjdHVhbCBudW1iZXIgb2Ygc2FtcGxlLWZyYW1lcyBkZWNvZGVkLgotICAvLyBJZGVhbGx5IHRoaXMgcmVwcmVzZW50cyB0aGUgInRydWUiIGV4YWN0IGxlbmd0aCBvZiB0aGUgZmlsZS4KLSAgcmV0dXJuIGN1cnJlbnRfZnJhbWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvYXVkaW9fZmlsZV9yZWFkZXIuaCBiL3NyYy9tZWRpYS9maWx0ZXJzL2F1ZGlvX2ZpbGVfcmVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5OTk2ZjMuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvYXVkaW9fZmlsZV9yZWFkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfRklMVEVSU19BVURJT19GSUxFX1JFQURFUl9IXwotI2RlZmluZSBNRURJQV9GSUxURVJTX0FVRElPX0ZJTEVfUkVBREVSX0hfCi0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCIKLQotc3RydWN0IEFWQ29kZWNDb250ZXh0OwotCi1uYW1lc3BhY2UgYmFzZSB7IGNsYXNzIFRpbWVEZWx0YTsgfQotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBBdWRpb0J1czsKLWNsYXNzIEZGbXBlZ0dsdWU7Ci1jbGFzcyBGRm1wZWdVUkxQcm90b2NvbDsKLQotY2xhc3MgTUVESUFfRVhQT1JUIEF1ZGlvRmlsZVJlYWRlciB7Ci0gcHVibGljOgotICAvLyBBdWRpbyBmaWxlIGRhdGEgd2lsbCBiZSByZWFkIHVzaW5nIHRoZSBnaXZlbiBwcm90b2NvbC4KLSAgLy8gVGhlIEF1ZGlvRmlsZVJlYWRlciBkb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiB8cHJvdG9jb2x8IGFuZAotICAvLyBzaW1wbHkgbWFpbnRhaW5zIGEgd2VhayByZWZlcmVuY2UgdG8gaXQuCi0gIGV4cGxpY2l0IEF1ZGlvRmlsZVJlYWRlcihGRm1wZWdVUkxQcm90b2NvbCogcHJvdG9jb2wpOwotICB2aXJ0dWFsIH5BdWRpb0ZpbGVSZWFkZXIoKTsKLQotICAvLyBPcGVuKCkgcmVhZHMgdGhlIGF1ZGlvIGRhdGEgZm9ybWF0IHNvIHRoYXQgdGhlIHNhbXBsZV9yYXRlKCksCi0gIC8vIGNoYW5uZWxzKCksIGR1cmF0aW9uKCksIGFuZCBudW1iZXJfb2ZfZnJhbWVzKCkgbWV0aG9kcyBjYW4gYmUgY2FsbGVkLgotICAvLyBJdCByZXR1cm5zIHx0cnVlfCBvbiBzdWNjZXNzLgotICBib29sIE9wZW4oKTsKLSAgdm9pZCBDbG9zZSgpOwotCi0gIC8vIEFmdGVyIGEgY2FsbCB0byBPcGVuKCksIGF0dGVtcHRzIHRvIGZ1bGx5IGZpbGwgfGF1ZGlvX2J1c3wgd2l0aCBkZWNvZGVkCi0gIC8vIGF1ZGlvIGRhdGEuICBBbnkgdW5maWxsZWQgZnJhbWVzIHdpbGwgYmUgemVyb2VkIG91dC4KLSAgLy8gfGF1ZGlvX2RhdGF8IG11c3QgYmUgb2YgdGhlIHNhbWUgc2l6ZSBhcyBjaGFubmVscygpLgotICAvLyBUaGUgYXVkaW8gZGF0YSB3aWxsIGJlIGRlY29kZWQgYXMgZmxvYXRpbmctcG9pbnQgbGluZWFyIFBDTSB3aXRoCi0gIC8vIGEgbm9taW5hbCByYW5nZSBvZiAtMS4wIC0+ICsxLjAuCi0gIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBzYW1wbGUtZnJhbWVzIGFjdHVhbGx5IHJlYWQgd2hpY2ggd2lsbCBhbHdheXMgYmUKLSAgLy8gPD0gYXVkaW9fYnVzLT5mcmFtZXMoKQotICBpbnQgUmVhZChBdWRpb0J1cyogYXVkaW9fYnVzKTsKLQotICAvLyBUaGVzZSBtZXRob2RzIGNhbiBiZSBjYWxsZWQgb25jZSBPcGVuKCkgaGFzIGJlZW4gY2FsbGVkLgotICBpbnQgY2hhbm5lbHMoKSBjb25zdDsKLSAgaW50IHNhbXBsZV9yYXRlKCkgY29uc3Q7Ci0KLSAgLy8gUGxlYXNlIG5vdGUgdGhhdCBkdXJhdGlvbigpIGFuZCBudW1iZXJfb2ZfZnJhbWVzKCkgYXR0ZW1wdCB0byBiZSBhY2N1cmF0ZSwKLSAgLy8gYnV0IGFyZSBvbmx5IGVzdGltYXRlcy4gIEZvciBzb21lIGVuY29kZWQgZm9ybWF0cywgdGhlIGFjdHVhbCBkdXJhdGlvbgotICAvLyBvZiB0aGUgZmlsZSBjYW4gb25seSBiZSBkZXRlcm1pbmVkIG9uY2UgYWxsIHRoZSBmaWxlIGRhdGEgaGFzIGJlZW4gcmVhZC4KLSAgLy8gVGhlIFJlYWQoKSBtZXRob2QgcmV0dXJucyB0aGUgYWN0dWFsIG51bWJlciBvZiBzYW1wbGUtZnJhbWVzIGl0IGhhcyByZWFkLgotICBiYXNlOjpUaW1lRGVsdGEgZHVyYXRpb24oKSBjb25zdDsKLSAgaW50NjQgbnVtYmVyX29mX2ZyYW1lcygpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgc2NvcGVkX3B0cjxGRm1wZWdHbHVlPiBnbHVlXzsKLSAgQVZDb2RlY0NvbnRleHQqIGNvZGVjX2NvbnRleHRfOwotICBpbnQgc3RyZWFtX2luZGV4XzsKLSAgRkZtcGVnVVJMUHJvdG9jb2wqIHByb3RvY29sXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQXVkaW9GaWxlUmVhZGVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0ZJTFRFUlNfQVVESU9fRklMRV9SRUFERVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL2F1ZGlvX2ZpbGVfcmVhZGVyX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2ZpbHRlcnMvYXVkaW9fZmlsZV9yZWFkZXJfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyOTAxMzEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvYXVkaW9fZmlsZV9yZWFkZXJfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvbWQ1LmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgImJhc2Uvc3lzX2J5dGVvcmRlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fYnVzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdGVzdF9kYXRhX3V0aWwuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL2F1ZGlvX2ZpbGVfcmVhZGVyLmgiCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9pbl9tZW1vcnlfdXJsX3Byb3RvY29sLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIEF1ZGlvRmlsZVJlYWRlclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICBBdWRpb0ZpbGVSZWFkZXJUZXN0KCkge30KLSAgdmlydHVhbCB+QXVkaW9GaWxlUmVhZGVyVGVzdCgpIHt9Ci0KLSAgdm9pZCBJbml0aWFsaXplKGNvbnN0IGNoYXIqIGZpbGVuYW1lKSB7Ci0gICAgZGF0YV8gPSBSZWFkVGVzdERhdGFGaWxlKGZpbGVuYW1lKTsKLSAgICBwcm90b2NvbF8ucmVzZXQobmV3IEluTWVtb3J5VXJsUHJvdG9jb2woCi0gICAgICAgIGRhdGFfLT5HZXREYXRhKCksIGRhdGFfLT5HZXREYXRhU2l6ZSgpLCBmYWxzZSkpOwotICAgIHJlYWRlcl8ucmVzZXQobmV3IEF1ZGlvRmlsZVJlYWRlcihwcm90b2NvbF8uZ2V0KCkpKTsKLSAgfQotCi0gIHZvaWQgUmVhZEFuZFZlcmlmeShjb25zdCBjaGFyKiBhdWRpb19oYXNoLCBpbnQgZXhwZWN0ZWRfZnJhbWVzKSB7Ci0gICAgc2NvcGVkX3B0cjxBdWRpb0J1cz4gZGVjb2RlZF9hdWRpb19kYXRhID0gQXVkaW9CdXM6OkNyZWF0ZSgKLSAgICAgICAgcmVhZGVyXy0+Y2hhbm5lbHMoKSwgcmVhZGVyXy0+bnVtYmVyX29mX2ZyYW1lcygpKTsKLSAgICBpbnQgYWN0dWFsX2ZyYW1lcyA9IHJlYWRlcl8tPlJlYWQoZGVjb2RlZF9hdWRpb19kYXRhLmdldCgpKTsKLSAgICBBU1NFUlRfTEUoYWN0dWFsX2ZyYW1lcywgZGVjb2RlZF9hdWRpb19kYXRhLT5mcmFtZXMoKSk7Ci0gICAgQVNTRVJUX0VRKGV4cGVjdGVkX2ZyYW1lcywgYWN0dWFsX2ZyYW1lcyk7Ci0KLSAgICBiYXNlOjpNRDVDb250ZXh0IG1kNV9jb250ZXh0OwotICAgIGJhc2U6Ok1ENUluaXQoJm1kNV9jb250ZXh0KTsKLQotICAgIERDSEVDS19FUShzaXplb2YoZmxvYXQpLCBzaXplb2YodWludDMyKSk7Ci0gICAgaW50IGNoYW5uZWxzID0gZGVjb2RlZF9hdWRpb19kYXRhLT5jaGFubmVscygpOwotICAgIGZvciAoaW50IGNoID0gMDsgY2ggPCBjaGFubmVsczsgKytjaCkgewotICAgICAgZmxvYXQqIGNoYW5uZWwgPSBkZWNvZGVkX2F1ZGlvX2RhdGEtPmNoYW5uZWwoY2gpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhY3R1YWxfZnJhbWVzOyArK2kpIHsKLSAgICAgICAgLy8gQ29udmVydCBmbG9hdCB0byB1aW50MzIgdy9vIGNvbnZlcnNpb24gbG9zcy4KLSAgICAgICAgdWludDMyIGZyYW1lID0gYmFzZTo6Qnl0ZVN3YXBUb0xFMzIoYml0X2Nhc3Q8dWludDMyPihjaGFubmVsW2ldKSk7Ci0gICAgICAgIGJhc2U6Ok1ENVVwZGF0ZSgmbWQ1X2NvbnRleHQsIGJhc2U6OlN0cmluZ1BpZWNlKAotICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmZyYW1lKSwgc2l6ZW9mKGZyYW1lKSkpOwotICAgICAgfQotICAgIH0KLQotICAgIGJhc2U6Ok1ENURpZ2VzdCBkaWdlc3Q7Ci0gICAgYmFzZTo6TUQ1RmluYWwoJmRpZ2VzdCwgJm1kNV9jb250ZXh0KTsKLQotICAgIEVYUEVDVF9FUShhdWRpb19oYXNoLCBiYXNlOjpNRDVEaWdlc3RUb0Jhc2UxNihkaWdlc3QpKTsKLSAgfQotCi0gIHZvaWQgUnVuVGVzdChjb25zdCBjaGFyKiBmbiwgY29uc3QgY2hhciogaGFzaCwgaW50IGNoYW5uZWxzLCBpbnQgc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGEgZHVyYXRpb24sIGludCBmcmFtZXMsIGludCB0cmltbWVkX2ZyYW1lcykgewotICAgIEluaXRpYWxpemUoZm4pOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlcl8tPk9wZW4oKSk7Ci0gICAgRVhQRUNUX0VRKGNoYW5uZWxzLCByZWFkZXJfLT5jaGFubmVscygpKTsKLSAgICBFWFBFQ1RfRVEoc2FtcGxlX3JhdGUsIHJlYWRlcl8tPnNhbXBsZV9yYXRlKCkpOwotICAgIEVYUEVDVF9FUShkdXJhdGlvbi5Jbk1pY3Jvc2Vjb25kcygpLCByZWFkZXJfLT5kdXJhdGlvbigpLkluTWljcm9zZWNvbmRzKCkpOwotICAgIEVYUEVDVF9FUShmcmFtZXMsIHJlYWRlcl8tPm51bWJlcl9vZl9mcmFtZXMoKSk7Ci0gICAgUmVhZEFuZFZlcmlmeShoYXNoLCB0cmltbWVkX2ZyYW1lcyk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBkYXRhXzsKLSAgc2NvcGVkX3B0cjxJbk1lbW9yeVVybFByb3RvY29sPiBwcm90b2NvbF87Ci0gIHNjb3BlZF9wdHI8QXVkaW9GaWxlUmVhZGVyPiByZWFkZXJfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBdWRpb0ZpbGVSZWFkZXJUZXN0KTsKLX07Ci0KLVRFU1RfRihBdWRpb0ZpbGVSZWFkZXJUZXN0LCBXaXRob3V0T3BlbikgewotICBJbml0aWFsaXplKCJiZWFyLm9ndiIpOwotfQotCi1URVNUX0YoQXVkaW9GaWxlUmVhZGVyVGVzdCwgSW52YWxpZEZpbGUpIHsKLSAgSW5pdGlhbGl6ZSgidGVuX2J5dGVfZmlsZSIpOwotICBBU1NFUlRfRkFMU0UocmVhZGVyXy0+T3BlbigpKTsKLX0KLQotVEVTVF9GKEF1ZGlvRmlsZVJlYWRlclRlc3QsIFdpdGhWaWRlbykgewotICBSdW5UZXN0KCJiZWFyLm9ndiIsICIzMDJlMTc3M2JhMmY5YTE5NGMzNWEwZjhmMGI3M2YxNSIsIDIsIDQ0MTAwLAotICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pY3Jvc2Vjb25kcygxMDExNTIwKSwgNDQ2MDgsIDQ0NjA4KTsKLX0KLQotVEVTVF9GKEF1ZGlvRmlsZVJlYWRlclRlc3QsIFZvcmJpcykgewotICBSdW5UZXN0KCJzZngub2dnIiwgIjJiODRhZDZkNjA1YWJiYTExMjVjMGRhY2M5YzhkYmRkIiwgMSwgNDQxMDAsCi0gICAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWljcm9zZWNvbmRzKDM1MDAwMSksIDE1NDM1LCAxNTQzNSk7Ci19Ci0KLVRFU1RfRihBdWRpb0ZpbGVSZWFkZXJUZXN0LCBXYXZlVTgpIHsKLSAgUnVuVGVzdCgic2Z4X3U4LndhdiIsICJkN2UyNTVhOGU2MzRmZmZkZjlmNzQ0YzU4MDM2MzJmOCIsIDEsIDQ0MTAwLAotICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pY3Jvc2Vjb25kcygyODg0MTQpLCAxMjcxOSwgMTI3MTkpOwotfQotVEVTVF9GKEF1ZGlvRmlsZVJlYWRlclRlc3QsIFdhdmVTMTZMRSkgewotICBSdW5UZXN0KCJzZnhfczE2bGUud2F2IiwgIjJhNTg0NzIwN2ZkY2JhMWMwNWU1MmY2NWFkMDEwZjY2IiwgMSwgNDQxMDAsCi0gICAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWljcm9zZWNvbmRzKDI4ODQxNCksIDEyNzE5LCAxMjcxOSk7Ci19Ci1URVNUX0YoQXVkaW9GaWxlUmVhZGVyVGVzdCwgV2F2ZVMyNExFKSB7Ci0gIFJ1blRlc3QoInNmeF9zMjRsZS53YXYiLCAiNjYyOTZiNGVjNjMzMjkwNTgxZjlhYmYzYzIxY2Q1ZTciLCAxLCA0NDEwMCwKLSAgICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWNyb3NlY29uZHMoMjg4NDE0KSwgMTI3MTksIDEyNzE5KTsKLX0KLQotI2lmIGRlZmluZWQoR09PR0xFX0NIUk9NRV9CVUlMRCkgfHwgZGVmaW5lZChVU0VfUFJPUFJJRVRBUllfQ09ERUNTKQotVEVTVF9GKEF1ZGlvRmlsZVJlYWRlclRlc3QsIERJU0FCTEVEX01QMykgewotICBSdW5UZXN0KCJzZngubXAzIiwgIjJhNTg0NzIwN2ZkY2JhMWMwNWU1MmY2NWFkMDEwZjY2IiwgMSwgNDQxMDAsCi0gICAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWljcm9zZWNvbmRzKDMxMzQ3MCksIDEzODI0LCAxMjcxOSk7Ci19Ci0KLVRFU1RfRihBdWRpb0ZpbGVSZWFkZXJUZXN0LCBESVNBQkxFRF9BQUMpIHsKLSAgUnVuVGVzdCgic2Z4Lm00YSIsICJkNGQzMjA3NzU4ZDFlOGNiMGFhMTc2ZmY3N2ZhNjkzMiIsIDEsIDQ0MTAwLAotICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pY3Jvc2Vjb25kcygzMTIwMDEpLCAxMzc1OSwgMTMzMTIpOwotfQotI2VuZGlmCi0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvYXVkaW9fcmVuZGVyZXJfYWxnb3JpdGhtLmNjIGIvc3JjL21lZGlhL2ZpbHRlcnMvYXVkaW9fcmVuZGVyZXJfYWxnb3JpdGhtLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTg0YjliLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL2F1ZGlvX3JlbmRlcmVyX2FsZ29yaXRobS5jYworKysgL2Rldi9udWxsCkBAIC0xLDQxOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9hdWRpb19yZW5kZXJlcl9hbGdvcml0aG0uaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxjbWF0aD4KLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9hdWRpb191dGlsLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9idWZmZXJzLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIFRoZSBzdGFydGluZyBzaXplIGluIGJ5dGVzIGZvciB8YXVkaW9fYnVmZmVyX3wuCi0vLyBQcmV2aW91cyB1c2FnZSBtYWludGFpbmVkIGEgZGVxdWUgb2YgMTYgQnVmZmVycywgZWFjaCBvZiBzaXplIDRLYi4gVGhpcwotLy8gd29ya2VkIHdlbGwsIHNvIHdlIG1haW50YWluIHRoaXMgbnVtYmVyIG9mIGJ5dGVzICgxNiAqIDQwOTYpLgotc3RhdGljIGNvbnN0IGludCBrU3RhcnRpbmdCdWZmZXJTaXplSW5CeXRlcyA9IDY1NTM2OwotCi0vLyBUaGUgbWF4aW11bSBzaXplIGluIGJ5dGVzIGZvciB0aGUgfGF1ZGlvX2J1ZmZlcl98LiBBcmJpdHJhcmlseSBkZXRlcm1pbmVkLgotLy8gVGhpcyBudW1iZXIgcmVwcmVzZW50cyAzIHNlY29uZHMgb2YgOTZrSHovMTYgYml0IDcuMSBzdXJyb3VuZCBzb3VuZC4KLXN0YXRpYyBjb25zdCBpbnQga01heEJ1ZmZlclNpemVJbkJ5dGVzID0gNDYwODAwMDsKLQotLy8gRHVyYXRpb24gb2YgYXVkaW8gc2VnbWVudHMgdXNlZCBmb3IgY3Jvc3NmYWRpbmcgKGluIHNlY29uZHMpLgotc3RhdGljIGNvbnN0IGRvdWJsZSBrV2luZG93RHVyYXRpb24gPSAwLjA4OwotCi0vLyBEdXJhdGlvbiBvZiBjcm9zc2ZhZGUgYmV0d2VlbiBhdWRpbyBzZWdtZW50cyAoaW4gc2Vjb25kcykuCi1zdGF0aWMgY29uc3QgZG91YmxlIGtDcm9zc2ZhZGVEdXJhdGlvbiA9IDAuMDA4OwotCi0vLyBNYXgvbWluIHN1cHBvcnRlZCBwbGF5YmFjayByYXRlcyBmb3IgZmFzdC9zbG93IGF1ZGlvLiBBdWRpbyBvdXRzaWRlIG9mIHRoZXNlCi0vLyByYW5nZXMgYXJlIG11dGVkLgotLy8gQXVkaW8gYXQgdGhlc2Ugc3BlZWRzIHdvdWxkIHNvdW5kIGJldHRlciB1bmRlciBhIGZyZXF1ZW5jeSBkb21haW4gYWxnb3JpdGhtLgotc3RhdGljIGNvbnN0IGZsb2F0IGtNaW5QbGF5YmFja1JhdGUgPSAwLjVmOwotc3RhdGljIGNvbnN0IGZsb2F0IGtNYXhQbGF5YmFja1JhdGUgPSA0LjBmOwotCi1BdWRpb1JlbmRlcmVyQWxnb3JpdGhtOjpBdWRpb1JlbmRlcmVyQWxnb3JpdGhtKCkKLSAgICA6IGNoYW5uZWxzXygwKSwKLSAgICAgIHNhbXBsZXNfcGVyX3NlY29uZF8oMCksCi0gICAgICBieXRlc19wZXJfY2hhbm5lbF8oMCksCi0gICAgICBwbGF5YmFja19yYXRlXygwLjBmKSwKLSAgICAgIGF1ZGlvX2J1ZmZlcl8oMCwga1N0YXJ0aW5nQnVmZmVyU2l6ZUluQnl0ZXMpLAotICAgICAgYnl0ZXNfaW5fY3Jvc3NmYWRlXygwKSwKLSAgICAgIGJ5dGVzX3Blcl9mcmFtZV8oMCksCi0gICAgICBpbmRleF9pbnRvX3dpbmRvd18oMCksCi0gICAgICBjcm9zc2ZhZGVfZnJhbWVfbnVtYmVyXygwKSwKLSAgICAgIG11dGVkXyhmYWxzZSksCi0gICAgICBuZWVkc19tb3JlX2RhdGFfKGZhbHNlKSwKLSAgICAgIHdpbmRvd19zaXplXygwKSB7Ci19Ci0KLUF1ZGlvUmVuZGVyZXJBbGdvcml0aG06On5BdWRpb1JlbmRlcmVyQWxnb3JpdGhtKCkge30KLQotdm9pZCBBdWRpb1JlbmRlcmVyQWxnb3JpdGhtOjpJbml0aWFsaXplKGZsb2F0IGluaXRpYWxfcGxheWJhY2tfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiBjYWxsYmFjaykgewotICBDSEVDSyhwYXJhbXMuSXNWYWxpZCgpKTsKLSAgRENIRUNLKCFjYWxsYmFjay5pc19udWxsKCkpOwotCi0gIGNoYW5uZWxzXyA9IHBhcmFtcy5jaGFubmVscygpOwotICBzYW1wbGVzX3Blcl9zZWNvbmRfID0gcGFyYW1zLnNhbXBsZV9yYXRlKCk7Ci0gIGJ5dGVzX3Blcl9jaGFubmVsXyA9IHBhcmFtcy5iaXRzX3Blcl9zYW1wbGUoKSAvIDg7Ci0gIGJ5dGVzX3Blcl9mcmFtZV8gPSBwYXJhbXMuR2V0Qnl0ZXNQZXJGcmFtZSgpOwotICByZXF1ZXN0X3JlYWRfY2JfID0gY2FsbGJhY2s7Ci0gIFNldFBsYXliYWNrUmF0ZShpbml0aWFsX3BsYXliYWNrX3JhdGUpOwotCi0gIHdpbmRvd19zaXplXyA9Ci0gICAgICBzYW1wbGVzX3Blcl9zZWNvbmRfICogYnl0ZXNfcGVyX2NoYW5uZWxfICogY2hhbm5lbHNfICoga1dpbmRvd0R1cmF0aW9uOwotICBBbGlnblRvRnJhbWVCb3VuZGFyeSgmd2luZG93X3NpemVfKTsKLQotICBieXRlc19pbl9jcm9zc2ZhZGVfID0KLSAgICAgIHNhbXBsZXNfcGVyX3NlY29uZF8gKiBieXRlc19wZXJfY2hhbm5lbF8gKiBjaGFubmVsc18gKiBrQ3Jvc3NmYWRlRHVyYXRpb247Ci0gIEFsaWduVG9GcmFtZUJvdW5kYXJ5KCZieXRlc19pbl9jcm9zc2ZhZGVfKTsKLQotICBjcm9zc2ZhZGVfYnVmZmVyXy5yZXNldChuZXcgdWludDhbYnl0ZXNfaW5fY3Jvc3NmYWRlX10pOwotfQotCi1pbnQgQXVkaW9SZW5kZXJlckFsZ29yaXRobTo6RmlsbEJ1ZmZlcigKLSAgICB1aW50OCogZGVzdCwgaW50IHJlcXVlc3RlZF9mcmFtZXMpIHsKLSAgRENIRUNLX05FKGJ5dGVzX3Blcl9mcmFtZV8sIDApOwotCi0gIGlmIChwbGF5YmFja19yYXRlXyA9PSAwLjBmKQotICAgIHJldHVybiAwOwotCi0gIGludCBzbG93ZXJfc3RlcCA9IGNlaWwod2luZG93X3NpemVfICogcGxheWJhY2tfcmF0ZV8pOwotICBpbnQgZmFzdGVyX3N0ZXAgPSBjZWlsKHdpbmRvd19zaXplXyAvIHBsYXliYWNrX3JhdGVfKTsKLSAgQWxpZ25Ub0ZyYW1lQm91bmRhcnkoJnNsb3dlcl9zdGVwKTsKLSAgQWxpZ25Ub0ZyYW1lQm91bmRhcnkoJmZhc3Rlcl9zdGVwKTsKLQotICBpbnQgdG90YWxfZnJhbWVzX3JlbmRlcmVkID0gMDsKLSAgdWludDgqIG91dHB1dF9wdHIgPSBkZXN0OwotICB3aGlsZSAodG90YWxfZnJhbWVzX3JlbmRlcmVkIDwgcmVxdWVzdGVkX2ZyYW1lcykgewotICAgIGlmIChpbmRleF9pbnRvX3dpbmRvd18gPT0gd2luZG93X3NpemVfKQotICAgICAgUmVzZXRXaW5kb3coKTsKLQotICAgIGJvb2wgcmVuZGVyZWRfZnJhbWUgPSB0cnVlOwotICAgIGlmICh3aW5kb3dfc2l6ZV8gPiBmYXN0ZXJfc3RlcCkgewotICAgICAgcmVuZGVyZWRfZnJhbWUgPSBPdXRwdXRGYXN0ZXJQbGF5YmFjaygKLSAgICAgICAgICBvdXRwdXRfcHRyLCB3aW5kb3dfc2l6ZV8sIGZhc3Rlcl9zdGVwKTsKLSAgICB9IGVsc2UgaWYgKHNsb3dlcl9zdGVwIDwgd2luZG93X3NpemVfKSB7Ci0gICAgICByZW5kZXJlZF9mcmFtZSA9IE91dHB1dFNsb3dlclBsYXliYWNrKAotICAgICAgICAgIG91dHB1dF9wdHIsIHNsb3dlcl9zdGVwLCB3aW5kb3dfc2l6ZV8pOwotICAgIH0gZWxzZSB7Ci0gICAgICByZW5kZXJlZF9mcmFtZSA9IE91dHB1dE5vcm1hbFBsYXliYWNrKG91dHB1dF9wdHIpOwotICAgIH0KLQotICAgIGlmICghcmVuZGVyZWRfZnJhbWUpIHsKLSAgICAgIG5lZWRzX21vcmVfZGF0YV8gPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgb3V0cHV0X3B0ciArPSBieXRlc19wZXJfZnJhbWVfOwotICAgIHRvdGFsX2ZyYW1lc19yZW5kZXJlZCsrOwotICB9Ci0gIHJldHVybiB0b3RhbF9mcmFtZXNfcmVuZGVyZWQ7Ci19Ci0KLXZvaWQgQXVkaW9SZW5kZXJlckFsZ29yaXRobTo6UmVzZXRXaW5kb3coKSB7Ci0gIERDSEVDS19MRShpbmRleF9pbnRvX3dpbmRvd18sIHdpbmRvd19zaXplXyk7Ci0gIGluZGV4X2ludG9fd2luZG93XyA9IDA7Ci0gIGNyb3NzZmFkZV9mcmFtZV9udW1iZXJfID0gMDsKLX0KLQotYm9vbCBBdWRpb1JlbmRlcmVyQWxnb3JpdGhtOjpPdXRwdXRGYXN0ZXJQbGF5YmFjayh1aW50OCogZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0X3N0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRwdXRfc3RlcCkgewotICAvLyBFbnN1cmUgd2UgZG9uJ3QgcnVuIGludG8gT09CIHJlYWQvd3JpdGUgc2l0dWF0aW9uLgotICBDSEVDS19HVChpbnB1dF9zdGVwLCBvdXRwdXRfc3RlcCk7Ci0gIERDSEVDS19MVChpbmRleF9pbnRvX3dpbmRvd18sIHdpbmRvd19zaXplXyk7Ci0gIERDSEVDS19HVChwbGF5YmFja19yYXRlXywgMS4wKTsKLQotICBpZiAoYXVkaW9fYnVmZmVyXy5mb3J3YXJkX2J5dGVzKCkgPCBieXRlc19wZXJfZnJhbWVfKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvLyBUaGUgYXVkaW8gZGF0YSBpcyBvdXRwdXQgaW4gYSBzZXJpZXMgb2Ygd2luZG93cy4gRm9yIHNwZWQtdXAgcGxheWJhY2ssCi0gIC8vIHRoZSB3aW5kb3cgaXMgY29tcHJpc2VkIG9mIHRoZSBmb2xsb3dpbmcgcGhhc2VzOgotICAvLwotICAvLyAgYSkgT3V0cHV0IHJhdyBkYXRhLgotICAvLyAgYikgU2F2ZSBieXRlcyBmb3IgY3Jvc3NmYWRlIGluIHxjcm9zc2ZhZGVfYnVmZmVyX3wuCi0gIC8vICBjKSBEcm9wIGRhdGEuCi0gIC8vICBkKSBPdXRwdXQgY3Jvc3NmYWRlZCBhdWRpbyBsZWFkaW5nIHVwIHRvIHRoZSBuZXh0IHdpbmRvdy4KLSAgLy8KLSAgLy8gVGhlIGR1cmF0aW9uIG9mIGVhY2ggcGhhc2UgaXMgY29tcHV0ZWQgYmVsb3cgYmFzZWQgb24gdGhlIHx3aW5kb3dfc2l6ZV98Ci0gIC8vIGFuZCB8cGxheWJhY2tfcmF0ZV98LgotICBpbnQgYnl0ZXNfdG9fY3Jvc3NmYWRlID0gYnl0ZXNfaW5fY3Jvc3NmYWRlXzsKLSAgaWYgKG11dGVkXyB8fCBieXRlc190b19jcm9zc2ZhZGUgPiBvdXRwdXRfc3RlcCkKLSAgICBieXRlc190b19jcm9zc2ZhZGUgPSAwOwotCi0gIC8vIFRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZSBlbmQgb2YgcGhhc2UgYSwgYmVnaW5uaW5nIG9mIHBoYXNlIGIuCi0gIGludCBvdXR0cm9fY3Jvc3NmYWRlX2JlZ2luID0gb3V0cHV0X3N0ZXAgLSBieXRlc190b19jcm9zc2ZhZGU7Ci0KLSAgLy8gVGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIGVuZCBvZiBwaGFzZSBiLCBiZWdpbm5pbmcgb2YgcGhhc2UgYy4KLSAgaW50IG91dHRyb19jcm9zc2ZhZGVfZW5kID0gb3V0cHV0X3N0ZXA7Ci0KLSAgLy8gVGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIGVuZCBvZiBwaGFzZSBjLCBiZWdpbm5pbmcgb2YgcGhhc2UgZC4KLSAgLy8gVGhpcyBwaGFzZSBjb250aW51ZXMgdW50aWwgfGluZGV4X2ludG9fd2luZG93X3wgcmVhY2hlcyB8d2luZG93X3NpemVffCwgYXQKLSAgLy8gd2hpY2ggcG9pbnQgdGhlIHdpbmRvdyByZXN0YXJ0cy4KLSAgaW50IGludHJvX2Nyb3NzZmFkZV9iZWdpbiA9IGlucHV0X3N0ZXAgLSBieXRlc190b19jcm9zc2ZhZGU7Ci0KLSAgLy8gYSkgT3V0cHV0IGEgcmF3IGZyYW1lIGlmIHdlIGhhdmVuJ3QgcmVhY2hlZCB0aGUgY3Jvc3NmYWRlIHNlY3Rpb24uCi0gIGlmIChpbmRleF9pbnRvX3dpbmRvd18gPCBvdXR0cm9fY3Jvc3NmYWRlX2JlZ2luKSB7Ci0gICAgQ29weVdpdGhBZHZhbmNlKGRlc3QpOwotICAgIGluZGV4X2ludG9fd2luZG93XyArPSBieXRlc19wZXJfZnJhbWVfOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLy8gYikgU2F2ZSBvdXR0cm8gY3Jvc3NmYWRlIGZyYW1lcyBpbnRvIGludGVybWVkaWF0ZSBidWZmZXIsIGJ1dCBkbyBub3Qgb3V0cHV0Ci0gIC8vICAgIGFueXRoaW5nIHRvIHxkZXN0fC4KLSAgd2hpbGUgKGluZGV4X2ludG9fd2luZG93XyA8IG91dHRyb19jcm9zc2ZhZGVfZW5kKSB7Ci0gICAgaWYgKGF1ZGlvX2J1ZmZlcl8uZm9yd2FyZF9ieXRlcygpIDwgYnl0ZXNfcGVyX2ZyYW1lXykKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIFRoaXMgcGhhc2Ugb25seSBhcHBsaWVzIGlmIHRoZXJlIGFyZSBieXRlcyB0byBjcm9zc2ZhZGUuCi0gICAgRENIRUNLX0dUKGJ5dGVzX3RvX2Nyb3NzZmFkZSwgMCk7Ci0gICAgdWludDgqIHBsYWNlX3RvX2NvcHkgPSBjcm9zc2ZhZGVfYnVmZmVyXy5nZXQoKSArCi0gICAgICAgIChpbmRleF9pbnRvX3dpbmRvd18gLSBvdXR0cm9fY3Jvc3NmYWRlX2JlZ2luKTsKLSAgICBDb3B5V2l0aEFkdmFuY2UocGxhY2VfdG9fY29weSk7Ci0gICAgaW5kZXhfaW50b193aW5kb3dfICs9IGJ5dGVzX3Blcl9mcmFtZV87Ci0gIH0KLQotICAvLyBjKSBEcm9wIGZyYW1lcyB1bnRpbCB3ZSByZWFjaCB0aGUgaW50cm8gY3Jvc3NmYWRlIHNlY3Rpb24uCi0gIHdoaWxlIChpbmRleF9pbnRvX3dpbmRvd18gPCBpbnRyb19jcm9zc2ZhZGVfYmVnaW4pIHsKLSAgICBpZiAoYXVkaW9fYnVmZmVyXy5mb3J3YXJkX2J5dGVzKCkgPCBieXRlc19wZXJfZnJhbWVfKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgRHJvcEZyYW1lKCk7Ci0gICAgaW5kZXhfaW50b193aW5kb3dfICs9IGJ5dGVzX3Blcl9mcmFtZV87Ci0gIH0KLQotICAvLyBSZXR1cm4gaWYgd2UgaGF2ZSBydW4gb3V0IG9mIGRhdGEgYWZ0ZXIgUGhhc2UgYykuCi0gIGlmIChhdWRpb19idWZmZXJfLmZvcndhcmRfYnl0ZXMoKSA8IGJ5dGVzX3Blcl9mcmFtZV8pCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8vIFBoYXNlIGQpIGRvZXNuJ3QgYXBwbHkgaWYgdGhlcmUgYXJlIG5vIGJ5dGVzIHRvIGNyb3NzZmFkZS4KLSAgaWYgKGJ5dGVzX3RvX2Nyb3NzZmFkZSA9PSAwKSB7Ci0gICAgRENIRUNLX0VRKGluZGV4X2ludG9fd2luZG93Xywgd2luZG93X3NpemVfKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBkKSBDcm9zc2ZhZGUgYW5kIG91dHB1dCBhIGZyYW1lLgotICBEQ0hFQ0tfTFQoaW5kZXhfaW50b193aW5kb3dfLCB3aW5kb3dfc2l6ZV8pOwotICBpbnQgb2Zmc2V0X2ludG9fYnVmZmVyID0gaW5kZXhfaW50b193aW5kb3dfIC0gaW50cm9fY3Jvc3NmYWRlX2JlZ2luOwotICBtZW1jcHkoZGVzdCwgY3Jvc3NmYWRlX2J1ZmZlcl8uZ2V0KCkgKyBvZmZzZXRfaW50b19idWZmZXIsCi0gICAgICAgICBieXRlc19wZXJfZnJhbWVfKTsKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiBpbnRyb19mcmFtZV9wdHIobmV3IHVpbnQ4W2J5dGVzX3Blcl9mcmFtZV9dKTsKLSAgYXVkaW9fYnVmZmVyXy5SZWFkKGludHJvX2ZyYW1lX3B0ci5nZXQoKSwgYnl0ZXNfcGVyX2ZyYW1lXyk7Ci0gIE91dHB1dENyb3NzZmFkZWRGcmFtZShkZXN0LCBpbnRyb19mcmFtZV9wdHIuZ2V0KCkpOwotICBpbmRleF9pbnRvX3dpbmRvd18gKz0gYnl0ZXNfcGVyX2ZyYW1lXzsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQXVkaW9SZW5kZXJlckFsZ29yaXRobTo6T3V0cHV0U2xvd2VyUGxheWJhY2sodWludDgqIGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dF9zdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0cHV0X3N0ZXApIHsKLSAgLy8gRW5zdXJlIHdlIGRvbid0IHJ1biBpbnRvIE9PQiByZWFkL3dyaXRlIHNpdHVhdGlvbi4KLSAgQ0hFQ0tfTFQoaW5wdXRfc3RlcCwgb3V0cHV0X3N0ZXApOwotICBEQ0hFQ0tfTFQoaW5kZXhfaW50b193aW5kb3dfLCB3aW5kb3dfc2l6ZV8pOwotICBEQ0hFQ0tfTFQocGxheWJhY2tfcmF0ZV8sIDEuMCk7Ci0gIERDSEVDS19ORShwbGF5YmFja19yYXRlXywgMC4wKTsKLQotICBpZiAoYXVkaW9fYnVmZmVyXy5mb3J3YXJkX2J5dGVzKCkgPCBieXRlc19wZXJfZnJhbWVfKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvLyBUaGUgYXVkaW8gZGF0YSBpcyBvdXRwdXQgaW4gYSBzZXJpZXMgb2Ygd2luZG93cy4gRm9yIHNsb3dlZCBkb3duIHBsYXliYWNrLAotICAvLyB0aGUgd2luZG93IGlzIGNvbXByaXNlZCBvZiB0aGUgZm9sbG93aW5nIHBoYXNlczoKLSAgLy8KLSAgLy8gIGEpIE91dHB1dCByYXcgZGF0YS4KLSAgLy8gIGIpIE91dHB1dCBhbmQgc2F2ZSBieXRlcyBmb3IgY3Jvc3NmYWRlIGluIHxjcm9zc2ZhZGVfYnVmZmVyX3wuCi0gIC8vICBjKSBPdXRwdXQqIHJhdyBkYXRhLgotICAvLyAgZCkgT3V0cHV0KiBjcm9zc2ZhZGVkIGF1ZGlvIGxlYWRpbmcgdXAgdG8gdGhlIG5leHQgd2luZG93LgotICAvLwotICAvLyAqIFBoYXNlcyBjKSBhbmQgZCkgZG8gbm90IHByb2dyZXNzIHxhdWRpb19idWZmZXJffCdzIGN1cnNvciBzbyB0aGF0IHRoZQotICAvLyB8YXVkaW9fYnVmZmVyX3wncyBjdXJzb3IgaXMgaW4gdGhlIGNvcnJlY3QgcGxhY2UgZm9yIHRoZSBuZXh0IHdpbmRvdy4KLSAgLy8KLSAgLy8gVGhlIGR1cmF0aW9uIG9mIGVhY2ggcGhhc2UgaXMgY29tcHV0ZWQgYmVsb3cgYmFzZWQgb24gdGhlIHx3aW5kb3dfc2l6ZV98Ci0gIC8vIGFuZCB8cGxheWJhY2tfcmF0ZV98LgotICBpbnQgYnl0ZXNfdG9fY3Jvc3NmYWRlID0gYnl0ZXNfaW5fY3Jvc3NmYWRlXzsKLSAgaWYgKG11dGVkXyB8fCBieXRlc190b19jcm9zc2ZhZGUgPiBpbnB1dF9zdGVwKQotICAgIGJ5dGVzX3RvX2Nyb3NzZmFkZSA9IDA7Ci0KLSAgLy8gVGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIGVuZCBvZiBwaGFzZSBhLCBiZWdpbm5pbmcgb2YgcGhhc2UgYi4KLSAgaW50IGludHJvX2Nyb3NzZmFkZV9iZWdpbiA9IGlucHV0X3N0ZXAgLSBieXRlc190b19jcm9zc2ZhZGU7Ci0KLSAgLy8gVGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIGVuZCBvZiBwaGFzZSBiLCBiZWdpbm5pbmcgb2YgcGhhc2UgYy4KLSAgaW50IGludHJvX2Nyb3NzZmFkZV9lbmQgPSBpbnB1dF9zdGVwOwotCi0gIC8vIFRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZSBlbmQgb2YgcGhhc2UgYywgIGJlZ2lubmluZyBvZiBwaGFzZSBkLgotICAvLyBUaGlzIHBoYXNlIGNvbnRpbnVlcyB1bnRpbCB8aW5kZXhfaW50b193aW5kb3dffCByZWFjaGVzIHx3aW5kb3dfc2l6ZV98LCBhdAotICAvLyB3aGljaCBwb2ludCB0aGUgd2luZG93IHJlc3RhcnRzLgotICBpbnQgb3V0dHJvX2Nyb3NzZmFkZV9iZWdpbiA9IG91dHB1dF9zdGVwIC0gYnl0ZXNfdG9fY3Jvc3NmYWRlOwotCi0gIC8vIGEpIE91dHB1dCBhIHJhdyBmcmFtZS4KLSAgaWYgKGluZGV4X2ludG9fd2luZG93XyA8IGludHJvX2Nyb3NzZmFkZV9iZWdpbikgewotICAgIENvcHlXaXRoQWR2YW5jZShkZXN0KTsKLSAgICBpbmRleF9pbnRvX3dpbmRvd18gKz0gYnl0ZXNfcGVyX2ZyYW1lXzsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vIGIpIFNhdmUgdGhlIHJhdyBmcmFtZSBmb3IgdGhlIGludHJvIGNyb3NzZmFkZSBzZWN0aW9uLCB0aGVuIG91dHB1dCB0aGUKLSAgLy8gICAgZnJhbWUgdG8gfGRlc3R8LgotICBpZiAoaW5kZXhfaW50b193aW5kb3dfIDwgaW50cm9fY3Jvc3NmYWRlX2VuZCkgewotICAgIGludCBvZmZzZXQgPSBpbmRleF9pbnRvX3dpbmRvd18gLSBpbnRyb19jcm9zc2ZhZGVfYmVnaW47Ci0gICAgdWludDgqIHBsYWNlX3RvX2NvcHkgPSBjcm9zc2ZhZGVfYnVmZmVyXy5nZXQoKSArIG9mZnNldDsKLSAgICBDb3B5V2l0aG91dEFkdmFuY2UocGxhY2VfdG9fY29weSk7Ci0gICAgQ29weVdpdGhBZHZhbmNlKGRlc3QpOwotICAgIGluZGV4X2ludG9fd2luZG93XyArPSBieXRlc19wZXJfZnJhbWVfOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgaW50IGF1ZGlvX2J1ZmZlcl9vZmZzZXQgPSBpbmRleF9pbnRvX3dpbmRvd18gLSBpbnRyb19jcm9zc2ZhZGVfZW5kOwotCi0gIGlmIChhdWRpb19idWZmZXJfLmZvcndhcmRfYnl0ZXMoKSA8IGF1ZGlvX2J1ZmZlcl9vZmZzZXQgKyBieXRlc19wZXJfZnJhbWVfKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvLyBjKSBPdXRwdXQgYSByYXcgZnJhbWUgaW50byB8ZGVzdHwgd2l0aG91dCBhZHZhbmNpbmcgdGhlIHxhdWRpb19idWZmZXJffAotICAvLyAgICBjdXJzb3IuIFNlZSBmdW5jdGlvbi1sZXZlbCBjb21tZW50LgotICBEQ0hFQ0tfR0UoaW5kZXhfaW50b193aW5kb3dfLCBpbnRyb19jcm9zc2ZhZGVfZW5kKTsKLSAgQ29weVdpdGhvdXRBZHZhbmNlKGRlc3QsIGF1ZGlvX2J1ZmZlcl9vZmZzZXQpOwotCi0gIC8vIGQpIENyb3NzZmFkZSB0aGUgbmV4dCBmcmFtZSBvZiB8Y3Jvc3NmYWRlX2J1ZmZlcl98IGludG8gfGRlc3R8IGlmIHdlJ3ZlCi0gIC8vICAgIHJlYWNoZWQgdGhlIG91dHRybyBjcm9zc2ZhZGUgc2VjdGlvbiBvZiB0aGUgd2luZG93LgotICBpZiAoaW5kZXhfaW50b193aW5kb3dfID49IG91dHRyb19jcm9zc2ZhZGVfYmVnaW4pIHsKLSAgICBpbnQgb2Zmc2V0X2ludG9fY3Jvc3NmYWRlX2J1ZmZlciA9Ci0gICAgICAgIGluZGV4X2ludG9fd2luZG93XyAtIG91dHRyb19jcm9zc2ZhZGVfYmVnaW47Ci0gICAgdWludDgqIGludHJvX2ZyYW1lX3B0ciA9Ci0gICAgICAgIGNyb3NzZmFkZV9idWZmZXJfLmdldCgpICsgb2Zmc2V0X2ludG9fY3Jvc3NmYWRlX2J1ZmZlcjsKLSAgICBPdXRwdXRDcm9zc2ZhZGVkRnJhbWUoZGVzdCwgaW50cm9fZnJhbWVfcHRyKTsKLSAgfQotCi0gIGluZGV4X2ludG9fd2luZG93XyArPSBieXRlc19wZXJfZnJhbWVfOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBBdWRpb1JlbmRlcmVyQWxnb3JpdGhtOjpPdXRwdXROb3JtYWxQbGF5YmFjayh1aW50OCogZGVzdCkgewotICBpZiAoYXVkaW9fYnVmZmVyXy5mb3J3YXJkX2J5dGVzKCkgPj0gYnl0ZXNfcGVyX2ZyYW1lXykgewotICAgIENvcHlXaXRoQWR2YW5jZShkZXN0KTsKLSAgICBpbmRleF9pbnRvX3dpbmRvd18gKz0gYnl0ZXNfcGVyX2ZyYW1lXzsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgQXVkaW9SZW5kZXJlckFsZ29yaXRobTo6Q29weVdpdGhBZHZhbmNlKHVpbnQ4KiBkZXN0KSB7Ci0gIENvcHlXaXRob3V0QWR2YW5jZShkZXN0KTsKLSAgRHJvcEZyYW1lKCk7Ci19Ci0KLXZvaWQgQXVkaW9SZW5kZXJlckFsZ29yaXRobTo6Q29weVdpdGhvdXRBZHZhbmNlKHVpbnQ4KiBkZXN0KSB7Ci0gIENvcHlXaXRob3V0QWR2YW5jZShkZXN0LCAwKTsKLX0KLQotdm9pZCBBdWRpb1JlbmRlcmVyQWxnb3JpdGhtOjpDb3B5V2l0aG91dEFkdmFuY2UoCi0gICAgdWludDgqIGRlc3QsIGludCBvZmZzZXQpIHsKLSAgaWYgKG11dGVkXykgewotICAgIG1lbXNldChkZXN0LCAwLCBieXRlc19wZXJfZnJhbWVfKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW50IGNvcGllZCA9IGF1ZGlvX2J1ZmZlcl8uUGVlayhkZXN0LCBieXRlc19wZXJfZnJhbWVfLCBvZmZzZXQpOwotICBEQ0hFQ0tfRVEoYnl0ZXNfcGVyX2ZyYW1lXywgY29waWVkKTsKLX0KLQotdm9pZCBBdWRpb1JlbmRlcmVyQWxnb3JpdGhtOjpEcm9wRnJhbWUoKSB7Ci0gIGF1ZGlvX2J1ZmZlcl8uU2VlayhieXRlc19wZXJfZnJhbWVfKTsKLQotICBpZiAoIUlzUXVldWVGdWxsKCkpCi0gICAgcmVxdWVzdF9yZWFkX2NiXy5SdW4oKTsKLX0KLQotdm9pZCBBdWRpb1JlbmRlcmVyQWxnb3JpdGhtOjpPdXRwdXRDcm9zc2ZhZGVkRnJhbWUoCi0gICAgdWludDgqIG91dHRybywgY29uc3QgdWludDgqIGludHJvKSB7Ci0gIERDSEVDS19MRShpbmRleF9pbnRvX3dpbmRvd18sIHdpbmRvd19zaXplXyk7Ci0gIERDSEVDSyghbXV0ZWRfKTsKLQotICBzd2l0Y2ggKGJ5dGVzX3Blcl9jaGFubmVsXykgewotICAgIGNhc2UgNDoKLSAgICAgIENyb3NzZmFkZUZyYW1lPGludDMyPihvdXR0cm8sIGludHJvKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIENyb3NzZmFkZUZyYW1lPGludDE2PihvdXR0cm8sIGludHJvKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgIENyb3NzZmFkZUZyYW1lPHVpbnQ4PihvdXR0cm8sIGludHJvKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBOT1RSRUFDSEVEKCkgPDwgIlVuc3VwcG9ydGVkIGF1ZGlvIGJpdCBkZXB0aCBpbiBjcm9zc2ZhZGUuIjsKLSAgfQotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHlwZT4KLXZvaWQgQXVkaW9SZW5kZXJlckFsZ29yaXRobTo6Q3Jvc3NmYWRlRnJhbWUoCi0gICAgdWludDgqIG91dHRyb19ieXRlcywgY29uc3QgdWludDgqIGludHJvX2J5dGVzKSB7Ci0gIFR5cGUqIG91dHRybyA9IHJlaW50ZXJwcmV0X2Nhc3Q8VHlwZSo+KG91dHRyb19ieXRlcyk7Ci0gIGNvbnN0IFR5cGUqIGludHJvID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUeXBlKj4oaW50cm9fYnl0ZXMpOwotCi0gIGludCBmcmFtZXNfaW5fY3Jvc3NmYWRlID0gYnl0ZXNfaW5fY3Jvc3NmYWRlXyAvIGJ5dGVzX3Blcl9mcmFtZV87Ci0gIGZsb2F0IGNyb3NzZmFkZV9yYXRpbyA9Ci0gICAgICBzdGF0aWNfY2FzdDxmbG9hdD4oY3Jvc3NmYWRlX2ZyYW1lX251bWJlcl8pIC8gZnJhbWVzX2luX2Nyb3NzZmFkZTsKLSAgZm9yIChpbnQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBjaGFubmVsc187ICsrY2hhbm5lbCkgewotICAgICpvdXR0cm8gKj0gMS4wIC0gY3Jvc3NmYWRlX3JhdGlvOwotICAgICpvdXR0cm8rKyArPSAoKmludHJvKyspICogY3Jvc3NmYWRlX3JhdGlvOwotICB9Ci0gIGNyb3NzZmFkZV9mcmFtZV9udW1iZXJfKys7Ci19Ci0KLXZvaWQgQXVkaW9SZW5kZXJlckFsZ29yaXRobTo6U2V0UGxheWJhY2tSYXRlKGZsb2F0IG5ld19yYXRlKSB7Ci0gIERDSEVDS19HRShuZXdfcmF0ZSwgMC4wKTsKLSAgcGxheWJhY2tfcmF0ZV8gPSBuZXdfcmF0ZTsKLSAgbXV0ZWRfID0KLSAgICAgIHBsYXliYWNrX3JhdGVfIDwga01pblBsYXliYWNrUmF0ZSB8fCBwbGF5YmFja19yYXRlXyA+IGtNYXhQbGF5YmFja1JhdGU7Ci0KLSAgUmVzZXRXaW5kb3coKTsKLX0KLQotdm9pZCBBdWRpb1JlbmRlcmVyQWxnb3JpdGhtOjpBbGlnblRvRnJhbWVCb3VuZGFyeShpbnQqIHZhbHVlKSB7Ci0gICgqdmFsdWUpIC09ICgoKnZhbHVlKSAlIGJ5dGVzX3Blcl9mcmFtZV8pOwotfQotCi12b2lkIEF1ZGlvUmVuZGVyZXJBbGdvcml0aG06OkZsdXNoQnVmZmVycygpIHsKLSAgUmVzZXRXaW5kb3coKTsKLQotICAvLyBDbGVhciB0aGUgcXVldWUgb2YgZGVjb2RlZCBwYWNrZXRzIChyZWxlYXNpbmcgdGhlIGJ1ZmZlcnMpLgotICBhdWRpb19idWZmZXJfLkNsZWFyKCk7Ci0gIHJlcXVlc3RfcmVhZF9jYl8uUnVuKCk7Ci19Ci0KLWJhc2U6OlRpbWVEZWx0YSBBdWRpb1JlbmRlcmVyQWxnb3JpdGhtOjpHZXRUaW1lKCkgewotICByZXR1cm4gYXVkaW9fYnVmZmVyXy5jdXJyZW50X3RpbWUoKTsKLX0KLQotdm9pZCBBdWRpb1JlbmRlcmVyQWxnb3JpdGhtOjpFbnF1ZXVlQnVmZmVyKEJ1ZmZlciogYnVmZmVyX2luKSB7Ci0gIERDSEVDSyghYnVmZmVyX2luLT5Jc0VuZE9mU3RyZWFtKCkpOwotICBhdWRpb19idWZmZXJfLkFwcGVuZChidWZmZXJfaW4pOwotICBuZWVkc19tb3JlX2RhdGFfID0gZmFsc2U7Ci0KLSAgLy8gSWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSBlbm91Z2ggZGF0YSwgcmVxdWVzdCBtb3JlLgotICBpZiAoIUlzUXVldWVGdWxsKCkpCi0gICAgcmVxdWVzdF9yZWFkX2NiXy5SdW4oKTsKLX0KLQotYm9vbCBBdWRpb1JlbmRlcmVyQWxnb3JpdGhtOjpDYW5GaWxsQnVmZmVyKCkgewotICByZXR1cm4gYXVkaW9fYnVmZmVyXy5mb3J3YXJkX2J5dGVzKCkgPiAwICYmICFuZWVkc19tb3JlX2RhdGFfOwotfQotCi1ib29sIEF1ZGlvUmVuZGVyZXJBbGdvcml0aG06OklzUXVldWVGdWxsKCkgewotICByZXR1cm4gYXVkaW9fYnVmZmVyXy5mb3J3YXJkX2J5dGVzKCkgPj0gYXVkaW9fYnVmZmVyXy5mb3J3YXJkX2NhcGFjaXR5KCk7Ci19Ci0KLWludCBBdWRpb1JlbmRlcmVyQWxnb3JpdGhtOjpRdWV1ZUNhcGFjaXR5KCkgewotICByZXR1cm4gYXVkaW9fYnVmZmVyXy5mb3J3YXJkX2NhcGFjaXR5KCk7Ci19Ci0KLXZvaWQgQXVkaW9SZW5kZXJlckFsZ29yaXRobTo6SW5jcmVhc2VRdWV1ZUNhcGFjaXR5KCkgewotICBhdWRpb19idWZmZXJfLnNldF9mb3J3YXJkX2NhcGFjaXR5KAotICAgICAgc3RkOjptaW4oMiAqIGF1ZGlvX2J1ZmZlcl8uZm9yd2FyZF9jYXBhY2l0eSgpLCBrTWF4QnVmZmVyU2l6ZUluQnl0ZXMpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9hdWRpb19yZW5kZXJlcl9hbGdvcml0aG0uaCBiL3NyYy9tZWRpYS9maWx0ZXJzL2F1ZGlvX3JlbmRlcmVyX2FsZ29yaXRobS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODBhMTFkLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL2F1ZGlvX3JlbmRlcmVyX2FsZ29yaXRobS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIEF1ZGlvUmVuZGVyZXJBbGdvcml0aG0gYnVmZmVycyBhbmQgdHJhbnNmb3JtcyBhdWRpbyBkYXRhLiBUaGUgb3duZXIgb2YKLS8vIHRoaXMgb2JqZWN0IHByb3ZpZGVzIGF1ZGlvIGRhdGEgdG8gdGhlIG9iamVjdCB0aHJvdWdoIEVucXVldWVCdWZmZXIoKSBhbmQKLS8vIHJlcXVlc3RzIGRhdGEgZnJvbSB0aGUgYnVmZmVyIHZpYSBGaWxsQnVmZmVyKCkuIFRoZSBvd25lciBhbHNvIHNldHMgdGhlCi0vLyBwbGF5YmFjayByYXRlLCBhbmQgdGhlIEF1ZGlvUmVuZGVyZXJBbGdvcml0aG0gd2lsbCBzdHJldGNoIG9yIGNvbXByZXNzIHRoZQotLy8gYnVmZmVyZWQgYXVkaW8gYXMgbmVjZXNzYXJ5IHRvIG1hdGNoIHRoZSBwbGF5YmFjayByYXRlIHdoZW4gZnVsZmlsbGluZwotLy8gRmlsbEJ1ZmZlcigpIHJlcXVlc3RzLiBBdWRpb1JlbmRlcmVyQWxnb3JpdGhtIGNhbiByZXF1ZXN0IG1vcmUgZGF0YSB0byBiZQotLy8gYnVmZmVyZWQgdmlhIGEgcmVhZCBjYWxsYmFjayBwYXNzZWQgaW4gZHVyaW5nIGluaXRpYWxpemF0aW9uLgotLy8KLS8vIFRoaXMgY2xhc3MgaXMgKm5vdCogdGhyZWFkLXNhZmUuIENhbGxzIHRvIGVucXVldWUgYW5kIHJldHJpZXZlIGRhdGEgbXVzdCBiZQotLy8gbG9ja2VkIGlmIGNhbGxlZCBmcm9tIG11bHRpcGxlIHRocmVhZHMuCi0vLwotLy8gQXVkaW9SZW5kZXJlckFsZ29yaXRobSB1c2VzIGEgc2ltcGxlIHBpdGNoLXByZXNlcnZhdGlvbiBhbGdvcml0aG0gdG8KLS8vIHN0cmV0Y2ggYW5kIGNvbXByZXNzIGF1ZGlvIGRhdGEgdG8gbWVldCBwbGF5YmFjayBzcGVlZHMgbGVzcyB0aGFuIGFuZAotLy8gZ3JlYXRlciB0aGFuIHRoZSBuYXR1cmFsIHBsYXliYWNrIG9mIHRoZSBhdWRpbyBzdHJlYW0uCi0vLwotLy8gQXVkaW8gYXQgdmVyeSBsb3cgb3IgdmVyeSBoaWdoIHBsYXliYWNrIHJhdGVzIGFyZSBtdXRlZCB0byBwcmVzZXJ2ZSBxdWFsaXR5LgotCi0jaWZuZGVmIE1FRElBX0ZJTFRFUlNfQVVESU9fUkVOREVSRVJfQUxHT1JJVEhNX0hfCi0jZGVmaW5lIE1FRElBX0ZJTFRFUlNfQVVESU9fUkVOREVSRVJfQUxHT1JJVEhNX0hfCi0KLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vYXVkaW9fcGFyYW1ldGVycy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2Vla2FibGVfYnVmZmVyLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIEJ1ZmZlcjsKLQotY2xhc3MgTUVESUFfRVhQT1JUIEF1ZGlvUmVuZGVyZXJBbGdvcml0aG0gewotIHB1YmxpYzoKLSAgQXVkaW9SZW5kZXJlckFsZ29yaXRobSgpOwotICB+QXVkaW9SZW5kZXJlckFsZ29yaXRobSgpOwotCi0gIC8vIEluaXRpYWxpemVzIHRoaXMgb2JqZWN0IHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIGF1ZGlvIHN0cmVhbS4KLSAgLy8gfHJlcXVlc3RfcmVhZF9jYnwgaXMgY2FsbGVkIHRvIHJlcXVlc3QgbW9yZSBkYXRhIGZyb20gdGhlIGNsaWVudCwgcmVxdWVzdHMKLSAgLy8gdGhhdCBhcmUgZnVsZmlsbGVkIHRocm91Z2ggY2FsbHMgdG8gRW5xdWV1ZUJ1ZmZlcigpLgotICB2b2lkIEluaXRpYWxpemUoZmxvYXQgaW5pdGlhbF9wbGF5YmFja19yYXRlLAotICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiByZXF1ZXN0X3JlYWRfY2IpOwotCi0gIC8vIFRyaWVzIHRvIGZpbGwgfHJlcXVlc3RlZF9mcmFtZXN8IGZyYW1lcyBpbnRvIHxkZXN0fCB3aXRoIHBvc3NpYmx5IHNjYWxlZAotICAvLyBkYXRhIGZyb20gb3VyIHxhdWRpb19idWZmZXJffC4gRGF0YSBpcyBzY2FsZWQgYmFzZWQgb24gdGhlIHBsYXliYWNrIHJhdGUsCi0gIC8vIHVzaW5nIGEgdmFyaWF0aW9uIG9mIHRoZSBPdmVybGFwLUFkZCBtZXRob2QgdG8gY29tYmluZSBzYW1wbGUgd2luZG93cy4KLSAgLy8KLSAgLy8gRGF0YSBmcm9tIHxhdWRpb19idWZmZXJffCBpcyBjb25zdW1lZCBpbiBwcm9wb3J0aW9uIHRvIHRoZSBwbGF5YmFjayByYXRlLgotICAvLwotICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZnJhbWVzIGNvcGllZCBpbnRvIHxkZXN0fC4KLSAgLy8gTWF5IHJlcXVlc3QgbW9yZSByZWFkcyB2aWEgfHJlcXVlc3RfcmVhZF9jYl98IGJlZm9yZSByZXR1cm5pbmcuCi0gIGludCBGaWxsQnVmZmVyKHVpbnQ4KiBkZXN0LCBpbnQgcmVxdWVzdGVkX2ZyYW1lcyk7Ci0KLSAgLy8gQ2xlYXJzIHxhdWRpb19idWZmZXJffC4KLSAgdm9pZCBGbHVzaEJ1ZmZlcnMoKTsKLQotICAvLyBSZXR1cm5zIHRoZSB0aW1lIG9mIHRoZSBuZXh0IGJ5dGUgaW4gb3VyIGRhdGEgb3Iga05vVGltZXN0YW1wKCkgaWYgY3VycmVudAotICAvLyB0aW1lIGlzIHVua25vd24uCi0gIGJhc2U6OlRpbWVEZWx0YSBHZXRUaW1lKCk7Ci0KLSAgLy8gRW5xdWV1ZXMgYSBidWZmZXIuIEl0IGlzIGNhbGxlZCBmcm9tIHRoZSBvd25lciBvZiB0aGUgYWxnb3JpdGhtIGFmdGVyIGEKLSAgLy8gcmVhZCBjb21wbGV0ZXMuCi0gIHZvaWQgRW5xdWV1ZUJ1ZmZlcihCdWZmZXIqIGJ1ZmZlcl9pbik7Ci0KLSAgZmxvYXQgcGxheWJhY2tfcmF0ZSgpIGNvbnN0IHsgcmV0dXJuIHBsYXliYWNrX3JhdGVfOyB9Ci0gIHZvaWQgU2V0UGxheWJhY2tSYXRlKGZsb2F0IG5ld19yYXRlKTsKLQotICAvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIGFsZ29yaXRobSBoYXMgZW5vdWdoIGRhdGEgYXQgdGhlIGN1cnJlbnQgcGxheWJhY2sgcmF0ZQotICAvLyBzdWNoIHRoYXQgaXQgY2FuIHdyaXRlIGRhdGEgb24gdGhlIG5leHQgY2FsbCB0byBGaWxsQnVmZmVyKCkuCi0gIGJvb2wgQ2FuRmlsbEJ1ZmZlcigpOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB8YXVkaW9fYnVmZmVyX3wgaXMgYXQgb3IgZXhjZWVkcyBjYXBhY2l0eS4KLSAgYm9vbCBJc1F1ZXVlRnVsbCgpOwotCi0gIC8vIFJldHVybnMgdGhlIGNhcGFjaXR5IG9mIHxhdWRpb19idWZmZXJffC4KLSAgaW50IFF1ZXVlQ2FwYWNpdHkoKTsKLQotICAvLyBJbmNyZWFzZSB0aGUgY2FwYWNpdHkgb2YgfGF1ZGlvX2J1ZmZlcl98IGlmIHBvc3NpYmxlLgotICB2b2lkIEluY3JlYXNlUXVldWVDYXBhY2l0eSgpOwotCi0gIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBsZWZ0IGluIHxhdWRpb19idWZmZXJffCwgd2hpY2ggbWF5IGJlIGxhcmdlcgotICAvLyB0aGFuIFF1ZXVlQ2FwYWNpdHkoKSBpbiB0aGUgZXZlbnQgdGhhdCBhIHJlYWQgY2FsbGJhY2sgZGVsaXZlcmVkIG1vcmUgZGF0YQotICAvLyB0aGFuIHxhdWRpb19idWZmZXJffCB3YXMgaW50ZW5kaW5nIHRvIGhvbGQuCi0gIGludCBieXRlc19idWZmZXJlZCgpIHsgcmV0dXJuIGF1ZGlvX2J1ZmZlcl8uZm9yd2FyZF9ieXRlcygpOyB9Ci0KLSAgaW50IGJ5dGVzX3Blcl9mcmFtZSgpIHsgcmV0dXJuIGJ5dGVzX3Blcl9mcmFtZV87IH0KLQotICBpbnQgYnl0ZXNfcGVyX2NoYW5uZWwoKSB7IHJldHVybiBieXRlc19wZXJfY2hhbm5lbF87IH0KLQotICBpbnQgc2FtcGxlc19wZXJfc2Vjb25kKCkgeyByZXR1cm4gc2FtcGxlc19wZXJfc2Vjb25kXzsgfQotCi0gIGJvb2wgaXNfbXV0ZWQoKSB7IHJldHVybiBtdXRlZF87IH0KLQotIHByaXZhdGU6Ci0gIC8vIEZpbGxzIHxkZXN0fCB3aXRoIG9uZSBmcmFtZSBvZiBhdWRpbyBkYXRhIGF0IG5vcm1hbCBzcGVlZC4gUmV0dXJucyB0cnVlIGlmCi0gIC8vIGEgZnJhbWUgd2FzIHJlbmRlcmVkLCBmYWxzZSBvdGhlcndpc2UuCi0gIGJvb2wgT3V0cHV0Tm9ybWFsUGxheWJhY2sodWludDgqIGRlc3QpOwotCi0gIC8vIEZpbGxzIHxkZXN0fCB3aXRoIG9uZSBmcmFtZSBvZiBhdWRpbyBkYXRhIGF0IGZhc3RlciB0aGFuIG5vcm1hbCBzcGVlZC4KLSAgLy8gUmV0dXJucyB0cnVlIGlmIGEgZnJhbWUgd2FzIHJlbmRlcmVkLCBmYWxzZSBvdGhlcndpc2UuCi0gIC8vCi0gIC8vIFdoZW4gdGhlIGF1ZGlvIHBsYXliYWNrIGlzID4gMS4wLCB3ZSB1c2UgYSB2YXJpYW50IG9mIE92ZXJsYXAtQWRkIHRvIHNxdWlzaAotICAvLyBhdWRpbyBvdXRwdXQgd2hpbGUgcHJlc2VydmluZyBwaXRjaC4gRXNzZW50aWFsbHksIHdlIHBsYXkgYSBiaXQgb2YgYXVkaW8KLSAgLy8gZGF0YSBhdCBub3JtYWwgc3BlZWQsIHRoZW4gd2UgImZhc3QgZm9yd2FyZCIgYnkgZHJvcHBpbmcgdGhlIG5leHQgYml0IG9mCi0gIC8vIGF1ZGlvIGRhdGEsIGFuZCB0aGVuIHdlIHN0aWNoIHRoZSBwaWVjZXMgdG9nZXRoZXIgYnkgY3Jvc3NmYWRpbmcgZnJvbSBvbmUKLSAgLy8gYXVkaW8gY2h1bmsgdG8gdGhlIG5leHQuCi0gIGJvb2wgT3V0cHV0RmFzdGVyUGxheWJhY2sodWludDgqIGRlc3QsIGludCBpbnB1dF9zdGVwLCBpbnQgb3V0cHV0X3N0ZXApOwotCi0gIC8vIEZpbGxzIHxkZXN0fCB3aXRoIG9uZSBmcmFtZSBvZiBhdWRpbyBkYXRhIGF0IHNsb3dlciB0aGFuIG5vcm1hbCBzcGVlZC4KLSAgLy8gUmV0dXJucyB0cnVlIGlmIGEgZnJhbWUgd2FzIHJlbmRlcmVkLCBmYWxzZSBvdGhlcndpc2UuCi0gIC8vCi0gIC8vIFdoZW4gdGhlIGF1ZGlvIHBsYXliYWNrIGlzIDwgMS4wLCB3ZSB1c2UgYSB2YXJpYW50IG9mIE92ZXJsYXAtQWRkIHRvCi0gIC8vIHN0cmV0Y2ggYXVkaW8gb3V0cHV0IHdoaWxlIHByZXNlcnZpbmcgcGl0Y2guIFRoaXMgd29ya3MgYnkgb3V0cHV0dGluZyBhCi0gIC8vIHNlZ21lbnQgb2YgYXVkaW8gZGF0YSBhdCBub3JtYWwgc3BlZWQuIFRoZSBuZXh0IGF1ZGlvIHNlZ21lbnQgdGhlbiBzdGFydHMKLSAgLy8gYnkgcmVwZWF0aW5nIHNvbWUgb2YgdGhlIGF1ZGlvIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgYXVkaW8gc2VnbWVudC4KLSAgLy8gU2VnbWVudHMgYXJlIHN0aWNoZWQgdG9nZXRoZXIgYnkgY3Jvc3NmYWRpbmcgZnJvbSBvbmUgYXVkaW8gY2h1bmsgdG8gdGhlCi0gIC8vIG5leHQuCi0gIGJvb2wgT3V0cHV0U2xvd2VyUGxheWJhY2sodWludDgqIGRlc3QsIGludCBpbnB1dF9zdGVwLCBpbnQgb3V0cHV0X3N0ZXApOwotCi0gIC8vIFJlc2V0cyB0aGUgd2luZG93IHN0YXRlIHRvIHRoZSBzdGFydCBvZiBhIG5ldyB3aW5kb3cuCi0gIHZvaWQgUmVzZXRXaW5kb3coKTsKLQotICAvLyBDb3BpZXMgYSByYXcgZnJhbWUgZnJvbSB8YXVkaW9fYnVmZmVyX3wgaW50byB8ZGVzdHwgd2l0aG91dCBwcm9ncmVzc2luZwotICAvLyB8YXVkaW9fYnVmZmVyX3wncyBpbnRlcm5hbCAiY3VycmVudCIgY3Vyc29yLiBPcHRpb25hbGx5IHBlZWtzIGF0IGEgZm9yd2FyZAotICAvLyBieXRlIHxvZmZzZXR8LgotICB2b2lkIENvcHlXaXRob3V0QWR2YW5jZSh1aW50OCogZGVzdCk7Ci0gIHZvaWQgQ29weVdpdGhvdXRBZHZhbmNlKHVpbnQ4KiBkZXN0LCBpbnQgb2Zmc2V0KTsKLQotICAvLyBDb3BpZXMgYSByYXcgZnJhbWUgZnJvbSB8YXVkaW9fYnVmZmVyX3wgaW50byB8ZGVzdHwgYW5kIHByb2dyZXNzZXMgdGhlCi0gIC8vIHxhdWRpb19idWZmZXJffCBmb3J3YXJkLgotICB2b2lkIENvcHlXaXRoQWR2YW5jZSh1aW50OCogZGVzdCk7Ci0KLSAgLy8gTW92ZXMgdGhlIHxhdWRpb19idWZmZXJffCBmb3J3YXJkIGJ5IG9uZSBmcmFtZS4KLSAgdm9pZCBEcm9wRnJhbWUoKTsKLQotICAvLyBEb2VzIGEgbGluZWFyIGNyb3NzZmFkZSBmcm9tIHxpbnRyb3wgaW50byB8b3V0dHJvfCBmb3Igb25lIGZyYW1lLgotICAvLyBBc3N1bWVzIHBvaW50ZXJzIGFyZSB2YWxpZCBhbmQgYXJlIGF0IGxlYXN0IHNpemUgb2YgfGJ5dGVzX3Blcl9mcmFtZV98LgotICB2b2lkIE91dHB1dENyb3NzZmFkZWRGcmFtZSh1aW50OCogb3V0dHJvLCBjb25zdCB1aW50OCogaW50cm8pOwotICB0ZW1wbGF0ZSA8Y2xhc3MgVHlwZT4KLSAgdm9pZCBDcm9zc2ZhZGVGcmFtZSh1aW50OCogb3V0dHJvLCBjb25zdCB1aW50OCogaW50cm8pOwotCi0gIC8vIFJvdW5kcyB8KnZhbHVlfCBkb3duIHRvIHRoZSBuZWFyZXN0IGZyYW1lIGJvdW5kYXJ5LgotICB2b2lkIEFsaWduVG9GcmFtZUJvdW5kYXJ5KGludCogdmFsdWUpOwotCi0gIC8vIE51bWJlciBvZiBjaGFubmVscyBpbiBhdWRpbyBzdHJlYW0uCi0gIGludCBjaGFubmVsc187Ci0KLSAgLy8gU2FtcGxlIHJhdGUgb2YgYXVkaW8gc3RyZWFtLgotICBpbnQgc2FtcGxlc19wZXJfc2Vjb25kXzsKLQotICAvLyBCeXRlIGRlcHRoIG9mIGF1ZGlvLgotICBpbnQgYnl0ZXNfcGVyX2NoYW5uZWxfOwotCi0gIC8vIFVzZWQgYnkgYWxnb3JpdGhtIHRvIHNjYWxlIG91dHB1dC4KLSAgZmxvYXQgcGxheWJhY2tfcmF0ZV87Ci0KLSAgLy8gVXNlZCB0byByZXF1ZXN0IG1vcmUgZGF0YS4KLSAgYmFzZTo6Q2xvc3VyZSByZXF1ZXN0X3JlYWRfY2JfOwotCi0gIC8vIEJ1ZmZlcmVkIGF1ZGlvIGRhdGEuCi0gIFNlZWthYmxlQnVmZmVyIGF1ZGlvX2J1ZmZlcl87Ci0KLSAgLy8gTGVuZ3RoIGZvciBjcm9zc2ZhZGUgaW4gYnl0ZXMuCi0gIGludCBieXRlc19pbl9jcm9zc2ZhZGVfOwotCi0gIC8vIExlbmd0aCBvZiBmcmFtZSBpbiBieXRlcy4KLSAgaW50IGJ5dGVzX3Blcl9mcmFtZV87Ci0KLSAgLy8gVGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhlIGF1ZGlvIHdpbmRvdywgYmV0d2VlbiAwIGFuZCB8d2luZG93X3NpemVffC4KLSAgLy8gV2hlbiB8aW5kZXhfaW50b193aW5kb3dffCByZWFjaGVzIHx3aW5kb3dfc2l6ZV98LCB0aGUgd2luZG93IHJlc2V0cy4KLSAgLy8gSW5kZXhlZCBieSBieXRlLgotICBpbnQgaW5kZXhfaW50b193aW5kb3dfOwotCi0gIC8vIFRoZSBmcmFtZSBudW1iZXIgaW4gdGhlIGNyb3NzZmFkZS4KLSAgaW50IGNyb3NzZmFkZV9mcmFtZV9udW1iZXJfOwotCi0gIC8vIFRydWUgaWYgdGhlIGF1ZGlvIHNob3VsZCBiZSBtdXRlZC4KLSAgYm9vbCBtdXRlZF87Ci0KLSAgYm9vbCBuZWVkc19tb3JlX2RhdGFfOwotCi0gIC8vIFRlbXBvcmFyeSBidWZmZXIgdG8gaG9sZCBjcm9zc2ZhZGUgZGF0YS4KLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiBjcm9zc2ZhZGVfYnVmZmVyXzsKLQotICAvLyBXaW5kb3cgc2l6ZSwgaW4gYnl0ZXMgKGNhbGN1bGF0ZWQgZnJvbSBhdWRpbyBwcm9wZXJ0aWVzKS4KLSAgaW50IHdpbmRvd19zaXplXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQXVkaW9SZW5kZXJlckFsZ29yaXRobSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9GSUxURVJTX0FVRElPX1JFTkRFUkVSX0FMR09SSVRITV9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvYXVkaW9fcmVuZGVyZXJfYWxnb3JpdGhtX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2ZpbHRlcnMvYXVkaW9fcmVuZGVyZXJfYWxnb3JpdGhtX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2UyZmQwLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL2F1ZGlvX3JlbmRlcmVyX2FsZ29yaXRobV91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotLy8KLS8vIFRoZSBmb3JtYXQgb2YgdGhlc2UgdGVzdHMgYXJlIHRvIGVucXVldWUgYSBrbm93biBhbW91bnQgb2YgZGF0YSBhbmQgdGhlbgotLy8gcmVxdWVzdCB0aGUgZXhhY3QgYW1vdW50IHdlIGV4cGVjdCBpbiBvcmRlciB0byBkZXF1ZXVlIHRoZSBrbm93biBhbW91bnQgb2YKLS8vIGRhdGEuICBUaGlzIGVuc3VyZXMgdGhhdCBmb3IgYW55IHJhdGUgd2UgYXJlIGNvbnN1bWluZyBpbnB1dCBkYXRhIGF0IHRoZQotLy8gY29ycmVjdCByYXRlLiAgV2UgYWx3YXlzIHBhc3MgaW4gYSB2ZXJ5IGxhcmdlIGRlc3RpbmF0aW9uIGJ1ZmZlciB3aXRoIHRoZQotLy8gZXhwZWN0YXRpb24gdGhhdCBGaWxsQnVmZmVyKCkgd2lsbCBmaWxsIGFzIG11Y2ggYXMgaXQgY2FuIGJ1dCBubyBtb3JlLgotCi0jaW5jbHVkZSA8Y21hdGg+Ci0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9jaGFubmVsX2xheW91dC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGF0YV9idWZmZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL2F1ZGlvX3JlbmRlcmVyX2FsZ29yaXRobS5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtSYXdEYXRhU2l6ZSA9IDIwNDg7Ci1zdGF0aWMgY29uc3QgaW50IGtTYW1wbGVzUGVyU2Vjb25kID0gMzAwMDsKLXN0YXRpYyBjb25zdCBDaGFubmVsTGF5b3V0IGtEZWZhdWx0Q2hhbm5lbExheW91dCA9IENIQU5ORUxfTEFZT1VUX1NURVJFTzsKLXN0YXRpYyBjb25zdCBpbnQga0RlZmF1bHRTYW1wbGVCaXRzID0gMTY7Ci0KLWNsYXNzIEF1ZGlvUmVuZGVyZXJBbGdvcml0aG1UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgQXVkaW9SZW5kZXJlckFsZ29yaXRobVRlc3QoKQotICAgICAgOiBieXRlc19lbnF1ZXVlZF8oMCkgewotICB9Ci0KLSAgfkF1ZGlvUmVuZGVyZXJBbGdvcml0aG1UZXN0KCkge30KLQotICB2b2lkIEluaXRpYWxpemUoKSB7Ci0gICAgSW5pdGlhbGl6ZShrRGVmYXVsdENoYW5uZWxMYXlvdXQsIGtEZWZhdWx0U2FtcGxlQml0cywga1NhbXBsZXNQZXJTZWNvbmQpOwotICB9Ci0KLSAgdm9pZCBJbml0aWFsaXplKENoYW5uZWxMYXlvdXQgY2hhbm5lbF9sYXlvdXQsIGludCBiaXRzX3Blcl9jaGFubmVsLAotICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZXNfcGVyX3NlY29uZCkgewotICAgIHN0YXRpYyBjb25zdCBpbnQga0ZyYW1lcyA9IGtSYXdEYXRhU2l6ZSAvICgoa0RlZmF1bHRTYW1wbGVCaXRzIC8gOCkgKgotICAgICAgICBDaGFubmVsTGF5b3V0VG9DaGFubmVsQ291bnQoa0RlZmF1bHRDaGFubmVsTGF5b3V0KSk7Ci0gICAgQXVkaW9QYXJhbWV0ZXJzIHBhcmFtcygKLSAgICAgICAgbWVkaWE6OkF1ZGlvUGFyYW1ldGVyczo6QVVESU9fUENNX0xJTkVBUiwgY2hhbm5lbF9sYXlvdXQsCi0gICAgICAgIHNhbXBsZXNfcGVyX3NlY29uZCwgYml0c19wZXJfY2hhbm5lbCwga0ZyYW1lcyk7Ci0KLSAgICBhbGdvcml0aG1fLkluaXRpYWxpemUoMSwgcGFyYW1zLCBiYXNlOjpCaW5kKAotICAgICAgICAmQXVkaW9SZW5kZXJlckFsZ29yaXRobVRlc3Q6OkVucXVldWVEYXRhLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gICAgRW5xdWV1ZURhdGEoKTsKLSAgfQotCi0gIHZvaWQgRW5xdWV1ZURhdGEoKSB7Ci0gICAgc2NvcGVkX2FycmF5PHVpbnQ4PiBhdWRpb19kYXRhKG5ldyB1aW50OFtrUmF3RGF0YVNpemVdKTsKLSAgICBDSEVDS19FUShrUmF3RGF0YVNpemUgJSBhbGdvcml0aG1fLmJ5dGVzX3Blcl9jaGFubmVsKCksIDB1KTsKLSAgICBDSEVDS19FUShrUmF3RGF0YVNpemUgJSBhbGdvcml0aG1fLmJ5dGVzX3Blcl9mcmFtZSgpLCAwdSk7Ci0gICAgLy8gVGhlIHZhbHVlIG9mIHRoZSBkYXRhIGlzIG1lYW5pbmdsZXNzOyB3ZSBqdXN0IHdhbnQgbm9uLXplcm8gZGF0YSB0bwotICAgIC8vIGRpZmZlcmVudGlhdGUgaXQgZnJvbSBtdXRlZCBkYXRhLgotICAgIG1lbXNldChhdWRpb19kYXRhLmdldCgpLCAxLCBrUmF3RGF0YVNpemUpOwotICAgIGFsZ29yaXRobV8uRW5xdWV1ZUJ1ZmZlcihuZXcgRGF0YUJ1ZmZlcihhdWRpb19kYXRhLlBhc3MoKSwga1Jhd0RhdGFTaXplKSk7Ci0gICAgYnl0ZXNfZW5xdWV1ZWRfICs9IGtSYXdEYXRhU2l6ZTsKLSAgfQotCi0gIHZvaWQgQ2hlY2tGYWtlRGF0YSh1aW50OCogYXVkaW9fZGF0YSwgaW50IGZyYW1lc193cml0dGVuKSB7Ci0gICAgaW50IHN1bSA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZXNfd3JpdHRlbiAqIGFsZ29yaXRobV8uYnl0ZXNfcGVyX2ZyYW1lKCk7ICsraSkKLSAgICAgIHN1bSB8PSBhdWRpb19kYXRhW2ldOwotCi0gICAgaWYgKGFsZ29yaXRobV8uaXNfbXV0ZWQoKSkKLSAgICAgIEFTU0VSVF9FUShzdW0sIDApOwotICAgIGVsc2UKLSAgICAgIEFTU0VSVF9ORShzdW0sIDApOwotICB9Ci0KLSAgaW50IENvbXB1dGVDb25zdW1lZEJ5dGVzKGludCBpbml0aWFsX2J5dGVzX2VucXVldWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluaXRpYWxfYnl0ZXNfYnVmZmVyZWQpIHsKLSAgICBpbnQgYnl0ZV9kZWx0YSA9IGJ5dGVzX2VucXVldWVkXyAtIGluaXRpYWxfYnl0ZXNfZW5xdWV1ZWQ7Ci0gICAgaW50IGJ1ZmZlcmVkX2RlbHRhID0gYWxnb3JpdGhtXy5ieXRlc19idWZmZXJlZCgpIC0gaW5pdGlhbF9ieXRlc19idWZmZXJlZDsKLSAgICBpbnQgY29uc3VtZWQgPSBieXRlX2RlbHRhIC0gYnVmZmVyZWRfZGVsdGE7Ci0gICAgQ0hFQ0tfR0UoY29uc3VtZWQsIDApOwotICAgIHJldHVybiBjb25zdW1lZDsKLSAgfQotCi0gIHZvaWQgVGVzdFBsYXliYWNrUmF0ZShkb3VibGUgcGxheWJhY2tfcmF0ZSkgewotICAgIGNvbnN0IGludCBrRGVmYXVsdEJ1ZmZlclNpemUgPSBhbGdvcml0aG1fLnNhbXBsZXNfcGVyX3NlY29uZCgpIC8gMTA7Ci0gICAgY29uc3QgaW50IGtEZWZhdWx0RnJhbWVzUmVxdWVzdGVkID0gMiAqIGFsZ29yaXRobV8uc2FtcGxlc19wZXJfc2Vjb25kKCk7Ci0KLSAgICBUZXN0UGxheWJhY2tSYXRlKHBsYXliYWNrX3JhdGUsIGtEZWZhdWx0QnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIGtEZWZhdWx0RnJhbWVzUmVxdWVzdGVkKTsKLSAgfQotCi0gIHZvaWQgVGVzdFBsYXliYWNrUmF0ZShkb3VibGUgcGxheWJhY2tfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZmZXJfc2l6ZV9pbl9mcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG90YWxfZnJhbWVzX3JlcXVlc3RlZCkgewotICAgIGludCBpbml0aWFsX2J5dGVzX2VucXVldWVkID0gYnl0ZXNfZW5xdWV1ZWRfOwotICAgIGludCBpbml0aWFsX2J5dGVzX2J1ZmZlcmVkID0gYWxnb3JpdGhtXy5ieXRlc19idWZmZXJlZCgpOwotCi0gICAgYWxnb3JpdGhtXy5TZXRQbGF5YmFja1JhdGUoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHBsYXliYWNrX3JhdGUpKTsKLQotICAgIHNjb3BlZF9hcnJheTx1aW50OD4gYnVmZmVyKAotICAgICAgICBuZXcgdWludDhbYnVmZmVyX3NpemVfaW5fZnJhbWVzICogYWxnb3JpdGhtXy5ieXRlc19wZXJfZnJhbWUoKV0pOwotCi0gICAgaWYgKHBsYXliYWNrX3JhdGUgPT0gMC4wKSB7Ci0gICAgICBpbnQgZnJhbWVzX3dyaXR0ZW4gPQotICAgICAgICAgIGFsZ29yaXRobV8uRmlsbEJ1ZmZlcihidWZmZXIuZ2V0KCksIGJ1ZmZlcl9zaXplX2luX2ZyYW1lcyk7Ci0gICAgICBFWFBFQ1RfRVEoMCwgZnJhbWVzX3dyaXR0ZW4pOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGludCBmcmFtZXNfcmVtYWluaW5nID0gdG90YWxfZnJhbWVzX3JlcXVlc3RlZDsKLSAgICB3aGlsZSAoZnJhbWVzX3JlbWFpbmluZyA+IDApIHsKLSAgICAgIGludCBmcmFtZXNfcmVxdWVzdGVkID0gc3RkOjptaW4oYnVmZmVyX3NpemVfaW5fZnJhbWVzLCBmcmFtZXNfcmVtYWluaW5nKTsKLSAgICAgIGludCBmcmFtZXNfd3JpdHRlbiA9Ci0gICAgICAgICAgYWxnb3JpdGhtXy5GaWxsQnVmZmVyKGJ1ZmZlci5nZXQoKSwgZnJhbWVzX3JlcXVlc3RlZCk7Ci0gICAgICBBU1NFUlRfR1QoZnJhbWVzX3dyaXR0ZW4sIDApOwotICAgICAgQ2hlY2tGYWtlRGF0YShidWZmZXIuZ2V0KCksIGZyYW1lc193cml0dGVuKTsKLSAgICAgIGZyYW1lc19yZW1haW5pbmcgLT0gZnJhbWVzX3dyaXR0ZW47Ci0gICAgfQotCi0gICAgaW50IGJ5dGVzX3JlcXVlc3RlZCA9IHRvdGFsX2ZyYW1lc19yZXF1ZXN0ZWQgKiBhbGdvcml0aG1fLmJ5dGVzX3Blcl9mcmFtZSgpOwotICAgIGludCBieXRlc19jb25zdW1lZCA9IENvbXB1dGVDb25zdW1lZEJ5dGVzKGluaXRpYWxfYnl0ZXNfZW5xdWV1ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF9ieXRlc19idWZmZXJlZCk7Ci0KLSAgICAvLyBJZiBwbGF5aW5nIGJhY2sgYXQgbm9ybWFsIHNwZWVkLCB3ZSBzaG91bGQgYWx3YXlzIGdldCBiYWNrIHRoZSBzYW1lCi0gICAgLy8gbnVtYmVyIG9mIGJ5dGVzIHJlcXVlc3RlZC4KLSAgICBpZiAocGxheWJhY2tfcmF0ZSA9PSAxLjApIHsKLSAgICAgIEVYUEVDVF9FUShieXRlc19yZXF1ZXN0ZWQsIGJ5dGVzX2NvbnN1bWVkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBPdGhlcndpc2UsIGFsbG93IHxrTWF4QWNjZXB0YWJsZURlbHRhfCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHRhcmdldCBhbmQKLSAgICAvLyBhY3R1YWwgcGxheWJhY2sgcmF0ZS4KLSAgICAvLyBXaGVuIHxrU2FtcGxlc1BlclNlY29uZHwgYW5kIHx0b3RhbF9mcmFtZXNfcmVxdWVzdGVkfCBhcmUgcmVhc29uYWJseQotICAgIC8vIGxhcmdlLCBvbmUgY2FuIGV4cGVjdCBsZXNzIHRoYW4gYSAxJSBkaWZmZXJlbmNlIGluIG1vc3QgY2FzZXMuIEluIG91cgotICAgIC8vIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHNwZWQgdXAgcGxheWJhY2sgaXMgbGVzcyBhY2N1cmF0ZSB0aGFuIHNsb3dlZAotICAgIC8vIGRvd24gcGxheWJhY2ssIGFuZCBmb3IgcGxheWJhY2tfcmF0ZSA+IDEsIHBsYXliYWNrIHJhdGUgZ2VuZXJhbGx5IGdldHMKLSAgICAvLyBsZXNzIGFuZCBsZXNzIGFjY3VyYXRlIHRoZSBmYXJ0aGVyIGl0IGRyaWZ0cyBmcm9tIDEgKHRob3VnaCB0aGlzIGlzCi0gICAgLy8gbm9ubGluZWFyKS4KLSAgICBzdGF0aWMgY29uc3QgZG91YmxlIGtNYXhBY2NlcHRhYmxlRGVsdGEgPSAwLjAxOwotICAgIGRvdWJsZSBhY3R1YWxfcGxheWJhY2tfcmF0ZSA9IDEuMCAqIGJ5dGVzX2NvbnN1bWVkIC8gYnl0ZXNfcmVxdWVzdGVkOwotCi0gICAgLy8gQ2FsY3VsYXRlIHRoZSBwZXJjZW50YWdlIGRpZmZlcmVuY2UgZnJvbSB0aGUgdGFyZ2V0IHxwbGF5YmFja19yYXRlfCBhcyBhCi0gICAgLy8gZnJhY3Rpb24gZnJvbSAwLjAgdG8gMS4wLgotICAgIGRvdWJsZSBkZWx0YSA9IHN0ZDo6YWJzKDEuMCAtIChhY3R1YWxfcGxheWJhY2tfcmF0ZSAvIHBsYXliYWNrX3JhdGUpKTsKLQotICAgIEVYUEVDVF9MRShkZWx0YSwga01heEFjY2VwdGFibGVEZWx0YSk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgQXVkaW9SZW5kZXJlckFsZ29yaXRobSBhbGdvcml0aG1fOwotICBpbnQgYnl0ZXNfZW5xdWV1ZWRfOwotfTsKLQotVEVTVF9GKEF1ZGlvUmVuZGVyZXJBbGdvcml0aG1UZXN0LCBGaWxsQnVmZmVyX05vcm1hbFJhdGUpIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBUZXN0UGxheWJhY2tSYXRlKDEuMCk7Ci19Ci0KLVRFU1RfRihBdWRpb1JlbmRlcmVyQWxnb3JpdGhtVGVzdCwgRmlsbEJ1ZmZlcl9OZWFybHlOb3JtYWxGYXN0ZXJSYXRlKSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgVGVzdFBsYXliYWNrUmF0ZSgxLjAwMDEpOwotfQotCi1URVNUX0YoQXVkaW9SZW5kZXJlckFsZ29yaXRobVRlc3QsIEZpbGxCdWZmZXJfTmVhcmx5Tm9ybWFsU2xvd2VyUmF0ZSkgewotICBJbml0aWFsaXplKCk7Ci0gIFRlc3RQbGF5YmFja1JhdGUoMC45OTk5KTsKLX0KLQotVEVTVF9GKEF1ZGlvUmVuZGVyZXJBbGdvcml0aG1UZXN0LCBGaWxsQnVmZmVyX09uZUFuZEFRdWFydGVyUmF0ZSkgewotICBJbml0aWFsaXplKCk7Ci0gIFRlc3RQbGF5YmFja1JhdGUoMS4yNSk7Ci19Ci0KLVRFU1RfRihBdWRpb1JlbmRlcmVyQWxnb3JpdGhtVGVzdCwgRmlsbEJ1ZmZlcl9PbmVBbmRBSGFsZlJhdGUpIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBUZXN0UGxheWJhY2tSYXRlKDEuNSk7Ci19Ci0KLVRFU1RfRihBdWRpb1JlbmRlcmVyQWxnb3JpdGhtVGVzdCwgRmlsbEJ1ZmZlcl9Eb3VibGVSYXRlKSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgVGVzdFBsYXliYWNrUmF0ZSgyLjApOwotfQotCi1URVNUX0YoQXVkaW9SZW5kZXJlckFsZ29yaXRobVRlc3QsIEZpbGxCdWZmZXJfRWlnaHRUaW1lc1JhdGUpIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBUZXN0UGxheWJhY2tSYXRlKDguMCk7Ci19Ci0KLVRFU1RfRihBdWRpb1JlbmRlcmVyQWxnb3JpdGhtVGVzdCwgRmlsbEJ1ZmZlcl9UaHJlZVF1YXJ0ZXJzUmF0ZSkgewotICBJbml0aWFsaXplKCk7Ci0gIFRlc3RQbGF5YmFja1JhdGUoMC43NSk7Ci19Ci0KLVRFU1RfRihBdWRpb1JlbmRlcmVyQWxnb3JpdGhtVGVzdCwgRmlsbEJ1ZmZlcl9IYWxmUmF0ZSkgewotICBJbml0aWFsaXplKCk7Ci0gIFRlc3RQbGF5YmFja1JhdGUoMC41KTsKLX0KLQotVEVTVF9GKEF1ZGlvUmVuZGVyZXJBbGdvcml0aG1UZXN0LCBGaWxsQnVmZmVyX1F1YXJ0ZXJSYXRlKSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgVGVzdFBsYXliYWNrUmF0ZSgwLjI1KTsKLX0KLQotVEVTVF9GKEF1ZGlvUmVuZGVyZXJBbGdvcml0aG1UZXN0LCBGaWxsQnVmZmVyX1BhdXNlKSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgVGVzdFBsYXliYWNrUmF0ZSgwLjApOwotfQotCi1URVNUX0YoQXVkaW9SZW5kZXJlckFsZ29yaXRobVRlc3QsIEZpbGxCdWZmZXJfU2xvd0Rvd24pIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBUZXN0UGxheWJhY2tSYXRlKDQuNSk7Ci0gIFRlc3RQbGF5YmFja1JhdGUoMy4wKTsKLSAgVGVzdFBsYXliYWNrUmF0ZSgyLjApOwotICBUZXN0UGxheWJhY2tSYXRlKDEuMCk7Ci0gIFRlc3RQbGF5YmFja1JhdGUoMC41KTsKLSAgVGVzdFBsYXliYWNrUmF0ZSgwLjI1KTsKLX0KLQotVEVTVF9GKEF1ZGlvUmVuZGVyZXJBbGdvcml0aG1UZXN0LCBGaWxsQnVmZmVyX1NwZWVkVXApIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBUZXN0UGxheWJhY2tSYXRlKDAuMjUpOwotICBUZXN0UGxheWJhY2tSYXRlKDAuNSk7Ci0gIFRlc3RQbGF5YmFja1JhdGUoMS4wKTsKLSAgVGVzdFBsYXliYWNrUmF0ZSgyLjApOwotICBUZXN0UGxheWJhY2tSYXRlKDMuMCk7Ci0gIFRlc3RQbGF5YmFja1JhdGUoNC41KTsKLX0KLQotVEVTVF9GKEF1ZGlvUmVuZGVyZXJBbGdvcml0aG1UZXN0LCBGaWxsQnVmZmVyX0p1bXBBcm91bmRTcGVlZHMpIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBUZXN0UGxheWJhY2tSYXRlKDIuMSk7Ci0gIFRlc3RQbGF5YmFja1JhdGUoMC45KTsKLSAgVGVzdFBsYXliYWNrUmF0ZSgwLjYpOwotICBUZXN0UGxheWJhY2tSYXRlKDEuNCk7Ci0gIFRlc3RQbGF5YmFja1JhdGUoMC4zKTsKLX0KLQotVEVTVF9GKEF1ZGlvUmVuZGVyZXJBbGdvcml0aG1UZXN0LCBGaWxsQnVmZmVyX1NtYWxsQnVmZmVyU2l6ZSkgewotICBJbml0aWFsaXplKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0J1ZmZlclNpemVJbkZyYW1lcyA9IDE7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0ZyYW1lc1JlcXVlc3RlZCA9IDIgKiBrU2FtcGxlc1BlclNlY29uZDsKLSAgVGVzdFBsYXliYWNrUmF0ZSgxLjAsIGtCdWZmZXJTaXplSW5GcmFtZXMsIGtGcmFtZXNSZXF1ZXN0ZWQpOwotICBUZXN0UGxheWJhY2tSYXRlKDAuNSwga0J1ZmZlclNpemVJbkZyYW1lcywga0ZyYW1lc1JlcXVlc3RlZCk7Ci0gIFRlc3RQbGF5YmFja1JhdGUoMS41LCBrQnVmZmVyU2l6ZUluRnJhbWVzLCBrRnJhbWVzUmVxdWVzdGVkKTsKLX0KLQotVEVTVF9GKEF1ZGlvUmVuZGVyZXJBbGdvcml0aG1UZXN0LCBGaWxsQnVmZmVyX0xhcmdlQnVmZmVyU2l6ZSkgewotICBJbml0aWFsaXplKGtEZWZhdWx0Q2hhbm5lbExheW91dCwga0RlZmF1bHRTYW1wbGVCaXRzLCA0NDEwMCk7Ci0gIFRlc3RQbGF5YmFja1JhdGUoMS4wKTsKLSAgVGVzdFBsYXliYWNrUmF0ZSgwLjUpOwotICBUZXN0UGxheWJhY2tSYXRlKDEuNSk7Ci19Ci0KLVRFU1RfRihBdWRpb1JlbmRlcmVyQWxnb3JpdGhtVGVzdCwgRmlsbEJ1ZmZlcl9Mb3dlclF1YWxpdHlBdWRpbykgewotICBzdGF0aWMgY29uc3QgQ2hhbm5lbExheW91dCBrQ2hhbm5lbExheW91dCA9IENIQU5ORUxfTEFZT1VUX01PTk87Ci0gIHN0YXRpYyBjb25zdCBpbnQga1NhbXBsZUJpdHMgPSA4OwotICBJbml0aWFsaXplKGtDaGFubmVsTGF5b3V0LCBrU2FtcGxlQml0cywga1NhbXBsZXNQZXJTZWNvbmQpOwotICBUZXN0UGxheWJhY2tSYXRlKDEuMCk7Ci0gIFRlc3RQbGF5YmFja1JhdGUoMC41KTsKLSAgVGVzdFBsYXliYWNrUmF0ZSgxLjUpOwotfQotCi1URVNUX0YoQXVkaW9SZW5kZXJlckFsZ29yaXRobVRlc3QsIEZpbGxCdWZmZXJfSGlnaGVyUXVhbGl0eUF1ZGlvKSB7Ci0gIHN0YXRpYyBjb25zdCBDaGFubmVsTGF5b3V0IGtDaGFubmVsTGF5b3V0ID0gQ0hBTk5FTF9MQVlPVVRfU1RFUkVPOwotICBzdGF0aWMgY29uc3QgaW50IGtTYW1wbGVCaXRzID0gMzI7Ci0gIEluaXRpYWxpemUoa0NoYW5uZWxMYXlvdXQsIGtTYW1wbGVCaXRzLCBrU2FtcGxlc1BlclNlY29uZCk7Ci0gIFRlc3RQbGF5YmFja1JhdGUoMS4wKTsKLSAgVGVzdFBsYXliYWNrUmF0ZSgwLjUpOwotICBUZXN0UGxheWJhY2tSYXRlKDEuNSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvYXVkaW9fcmVuZGVyZXJfaW1wbC5jYyBiL3NyYy9tZWRpYS9maWx0ZXJzL2F1ZGlvX3JlbmRlcmVyX2ltcGwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNzgyMTguLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvYXVkaW9fcmVuZGVyZXJfaW1wbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDY0NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9hdWRpb19yZW5kZXJlcl9pbXBsLmgiCi0KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFja19oZWxwZXJzLmgiCi0jaW5jbHVkZSAiYmFzZS9jb21tYW5kX2xpbmUuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcF9wcm94eS5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2F1ZGlvX3V0aWwuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX3NwbGljZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2JpbmRfdG9fbG9vcC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVtdXhlcl9zdHJlYW0uaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX3N3aXRjaGVzLmgiCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9hdWRpb19kZWNvZGVyX3NlbGVjdG9yLmgiCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9kZWNyeXB0aW5nX2RlbXV4ZXJfc3RyZWFtLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLUF1ZGlvUmVuZGVyZXJJbXBsOjpBdWRpb1JlbmRlcmVySW1wbCgKLSAgICBtZWRpYTo6QXVkaW9SZW5kZXJlclNpbmsqIHNpbmssCi0gICAgY29uc3QgU2V0RGVjcnlwdG9yUmVhZHlDQiYgc2V0X2RlY3J5cHRvcl9yZWFkeV9jYikKLSAgICA6IHNpbmtfKHNpbmspLAotICAgICAgc2V0X2RlY3J5cHRvcl9yZWFkeV9jYl8oc2V0X2RlY3J5cHRvcl9yZWFkeV9jYiksCi0gICAgICBzdGF0ZV8oa1VuaW5pdGlhbGl6ZWQpLAotICAgICAgcGVuZGluZ19yZWFkXyhmYWxzZSksCi0gICAgICByZWNlaXZlZF9lbmRfb2Zfc3RyZWFtXyhmYWxzZSksCi0gICAgICByZW5kZXJlZF9lbmRfb2Zfc3RyZWFtXyhmYWxzZSksCi0gICAgICBhdWRpb190aW1lX2J1ZmZlcmVkXyhrTm9UaW1lc3RhbXAoKSksCi0gICAgICBjdXJyZW50X3RpbWVfKGtOb1RpbWVzdGFtcCgpKSwKLSAgICAgIHVuZGVyZmxvd19kaXNhYmxlZF8oZmFsc2UpLAotICAgICAgcHJlcm9sbF9hYm9ydGVkXyhmYWxzZSksCi0gICAgICBhY3R1YWxfZnJhbWVzX3Blcl9idWZmZXJfKDApIHsKLSAgLy8gV2UncmUgY3JlYXRlZCBvbiB0aGUgcmVuZGVyIHRocmVhZCwgYnV0IHRoaXMgdGhyZWFkIGNoZWNrZXIgaXMgZm9yIGFub3RoZXIuCi0gIHBpcGVsaW5lX3RocmVhZF9jaGVja2VyXy5EZXRhY2hGcm9tVGhyZWFkKCk7Ci19Ci0KLXZvaWQgQXVkaW9SZW5kZXJlckltcGw6OlBsYXkoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spIHsKLSAgRENIRUNLKHBpcGVsaW5lX3RocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotCi0gIGZsb2F0IHBsYXliYWNrX3JhdGUgPSAwOwotICB7Ci0gICAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgICBEQ0hFQ0tfRVEoa1BhdXNlZCwgc3RhdGVfKTsKLSAgICBzdGF0ZV8gPSBrUGxheWluZzsKLSAgICBjYWxsYmFjay5SdW4oKTsKLSAgICBwbGF5YmFja19yYXRlID0gYWxnb3JpdGhtXy0+cGxheWJhY2tfcmF0ZSgpOwotICB9Ci0KLSAgaWYgKHBsYXliYWNrX3JhdGUgIT0gMC4wZikgewotICAgIERvUGxheSgpOwotICB9IGVsc2UgewotICAgIERvUGF1c2UoKTsKLSAgfQotfQotCi12b2lkIEF1ZGlvUmVuZGVyZXJJbXBsOjpEb1BsYXkoKSB7Ci0gIERDSEVDSyhwaXBlbGluZV90aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLSAgRENIRUNLKHNpbmtfKTsKLSAgewotICAgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gICAgZWFybGllc3RfZW5kX3RpbWVfID0gYmFzZTo6VGltZTo6Tm93KCk7Ci0gIH0KLSAgc2lua18tPlBsYXkoKTsKLX0KLQotdm9pZCBBdWRpb1JlbmRlcmVySW1wbDo6UGF1c2UoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spIHsKLSAgRENIRUNLKHBpcGVsaW5lX3RocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotCi0gIHsKLSAgICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICAgIERDSEVDSyhzdGF0ZV8gPT0ga1BsYXlpbmcgfHwgc3RhdGVfID09IGtVbmRlcmZsb3cgfHwKLSAgICAgICAgICAgc3RhdGVfID09IGtSZWJ1ZmZlcmluZyk7Ci0gICAgcGF1c2VfY2JfID0gY2FsbGJhY2s7Ci0gICAgc3RhdGVfID0ga1BhdXNlZDsKLQotICAgIC8vIFBhdXNlIG9ubHkgd2hlbiB3ZSd2ZSBjb21wbGV0ZWQgb3VyIHBlbmRpbmcgcmVhZC4KLSAgICBpZiAoIXBlbmRpbmdfcmVhZF8pCi0gICAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcGF1c2VfY2JfKS5SdW4oKTsKLSAgfQotCi0gIERvUGF1c2UoKTsKLX0KLQotdm9pZCBBdWRpb1JlbmRlcmVySW1wbDo6RG9QYXVzZSgpIHsKLSAgRENIRUNLKHBpcGVsaW5lX3RocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBEQ0hFQ0soc2lua18pOwotICBzaW5rXy0+UGF1c2UoZmFsc2UpOwotfQotCi12b2lkIEF1ZGlvUmVuZGVyZXJJbXBsOjpGbHVzaChjb25zdCBiYXNlOjpDbG9zdXJlJiBjYWxsYmFjaykgewotICBEQ0hFQ0socGlwZWxpbmVfdGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0KLSAgaWYgKGRlY3J5cHRpbmdfZGVtdXhlcl9zdHJlYW1fKSB7Ci0gICAgZGVjcnlwdGluZ19kZW11eGVyX3N0cmVhbV8tPlJlc2V0KGJhc2U6OkJpbmQoCi0gICAgICAgICZBdWRpb1JlbmRlcmVySW1wbDo6UmVzZXREZWNvZGVyLCB0aGlzLCBjYWxsYmFjaykpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGRlY29kZXJfLT5SZXNldChjYWxsYmFjayk7Ci19Ci0KLXZvaWQgQXVkaW9SZW5kZXJlckltcGw6OlJlc2V0RGVjb2Rlcihjb25zdCBiYXNlOjpDbG9zdXJlJiBjYWxsYmFjaykgewotICBEQ0hFQ0socGlwZWxpbmVfdGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIGRlY29kZXJfLT5SZXNldChjYWxsYmFjayk7Ci19Ci0KLXZvaWQgQXVkaW9SZW5kZXJlckltcGw6OlN0b3AoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spIHsKLSAgRENIRUNLKHBpcGVsaW5lX3RocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBEQ0hFQ0soIWNhbGxiYWNrLmlzX251bGwoKSk7Ci0KLSAgaWYgKHNpbmtfKSB7Ci0gICAgc2lua18tPlN0b3AoKTsKLSAgICBzaW5rXyA9IE5VTEw7Ci0gIH0KLQotICB7Ci0gICAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgICBzdGF0ZV8gPSBrU3RvcHBlZDsKLSAgICBhbGdvcml0aG1fLnJlc2V0KE5VTEwpOwotICAgIGluaXRfY2JfLlJlc2V0KCk7Ci0gICAgdW5kZXJmbG93X2NiXy5SZXNldCgpOwotICAgIHRpbWVfY2JfLlJlc2V0KCk7Ci0gIH0KLQotICBjYWxsYmFjay5SdW4oKTsKLX0KLQotdm9pZCBBdWRpb1JlbmRlcmVySW1wbDo6UHJlcm9sbChiYXNlOjpUaW1lRGVsdGEgdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgY2IpIHsKLSAgRENIRUNLKHBpcGVsaW5lX3RocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBEQ0hFQ0soc2lua18pOwotCi0gIHsKLSAgICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICAgIERDSEVDS19FUShrUGF1c2VkLCBzdGF0ZV8pOwotICAgIERDSEVDSyghcGVuZGluZ19yZWFkXykgPDwgIlBlbmRpbmcgcmVhZCBtdXN0IGNvbXBsZXRlIGJlZm9yZSBzZWVraW5nIjsKLSAgICBEQ0hFQ0socGF1c2VfY2JfLmlzX251bGwoKSk7Ci0gICAgRENIRUNLKHByZXJvbGxfY2JfLmlzX251bGwoKSk7Ci0gICAgc3RhdGVfID0ga1ByZXJvbGxpbmc7Ci0gICAgcHJlcm9sbF9jYl8gPSBjYjsKLSAgICBwcmVyb2xsX3RpbWVzdGFtcF8gPSB0aW1lOwotCi0gICAgLy8gVGhyb3cgYXdheSBldmVyeXRoaW5nIGFuZCBzY2hlZHVsZSBvdXIgcmVhZHMuCi0gICAgYXVkaW9fdGltZV9idWZmZXJlZF8gPSBrTm9UaW1lc3RhbXAoKTsKLSAgICBjdXJyZW50X3RpbWVfID0ga05vVGltZXN0YW1wKCk7Ci0gICAgcmVjZWl2ZWRfZW5kX29mX3N0cmVhbV8gPSBmYWxzZTsKLSAgICByZW5kZXJlZF9lbmRfb2Zfc3RyZWFtXyA9IGZhbHNlOwotICAgIHByZXJvbGxfYWJvcnRlZF8gPSBmYWxzZTsKLQotICAgIHNwbGljZXJfLT5SZXNldCgpOwotCi0gICAgLy8gfGFsZ29yaXRobV98IHdpbGwgcmVxdWVzdCBtb3JlIHJlYWRzLgotICAgIGFsZ29yaXRobV8tPkZsdXNoQnVmZmVycygpOwotICAgIGVhcmxpZXN0X2VuZF90aW1lXyA9IGJhc2U6OlRpbWU6Ok5vdygpOwotICB9Ci0KLSAgLy8gUGF1c2UgYW5kIGZsdXNoIHRoZSBzdHJlYW0gd2hlbiB3ZSBwcmVyb2xsIHRvIGEgbmV3IGxvY2F0aW9uLgotICBzaW5rXy0+UGF1c2UodHJ1ZSk7Ci19Ci0KLXZvaWQgQXVkaW9SZW5kZXJlckltcGw6OkluaXRpYWxpemUoY29uc3Qgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiYgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RlY29kZXJMaXN0JiBkZWNvZGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgaW5pdF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdGlzdGljc0NCJiBzdGF0aXN0aWNzX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiB1bmRlcmZsb3dfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRpbWVDQiYgdGltZV9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6Q2xvc3VyZSYgZW5kZWRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIGRpc2FibGVkX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBlcnJvcl9jYikgewotICBEQ0hFQ0socGlwZWxpbmVfdGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIERDSEVDSyhzdHJlYW0pOwotICBEQ0hFQ0soIWRlY29kZXJzLmVtcHR5KCkpOwotICBEQ0hFQ0tfRVEoc3RyZWFtLT50eXBlKCksIERlbXV4ZXJTdHJlYW06OkFVRElPKTsKLSAgRENIRUNLKCFpbml0X2NiLmlzX251bGwoKSk7Ci0gIERDSEVDSyghc3RhdGlzdGljc19jYi5pc19udWxsKCkpOwotICBEQ0hFQ0soIXVuZGVyZmxvd19jYi5pc19udWxsKCkpOwotICBEQ0hFQ0soIXRpbWVfY2IuaXNfbnVsbCgpKTsKLSAgRENIRUNLKCFlbmRlZF9jYi5pc19udWxsKCkpOwotICBEQ0hFQ0soIWRpc2FibGVkX2NiLmlzX251bGwoKSk7Ci0gIERDSEVDSyghZXJyb3JfY2IuaXNfbnVsbCgpKTsKLSAgRENIRUNLX0VRKGtVbmluaXRpYWxpemVkLCBzdGF0ZV8pOwotICBEQ0hFQ0soc2lua18pOwotCi0gIGluaXRfY2JfID0gaW5pdF9jYjsKLSAgc3RhdGlzdGljc19jYl8gPSBzdGF0aXN0aWNzX2NiOwotICB1bmRlcmZsb3dfY2JfID0gdW5kZXJmbG93X2NiOwotICB0aW1lX2NiXyA9IHRpbWVfY2I7Ci0gIGVuZGVkX2NiXyA9IGVuZGVkX2NiOwotICBkaXNhYmxlZF9jYl8gPSBkaXNhYmxlZF9jYjsKLSAgZXJyb3JfY2JfID0gZXJyb3JfY2I7Ci0KLSAgc2NvcGVkX3B0cjxBdWRpb0RlY29kZXJTZWxlY3Rvcj4gZGVjb2Rlcl9zZWxlY3RvcigKLSAgICAgIG5ldyBBdWRpb0RlY29kZXJTZWxlY3RvcihiYXNlOjpNZXNzYWdlTG9vcFByb3h5OjpjdXJyZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2RlY3J5cHRvcl9yZWFkeV9jYl8pKTsKLQotICAvLyBUbyBhdm9pZCBjYWxsaW5nIHxkZWNvZGVyX3NlbGVjdG9yfCBtZXRob2RzIGFuZCBwYXNzaW5nIG93bmVyc2hpcCBvZgotICAvLyB8ZGVjb2Rlcl9zZWxlY3RvcnwgaW4gdGhlIHNhbWUgbGluZS4KLSAgQXVkaW9EZWNvZGVyU2VsZWN0b3IqIGRlY29kZXJfc2VsZWN0b3JfcHRyID0gZGVjb2Rlcl9zZWxlY3Rvci5nZXQoKTsKLQotICBkZWNvZGVyX3NlbGVjdG9yX3B0ci0+U2VsZWN0QXVkaW9EZWNvZGVyKAotICAgICAgc3RyZWFtLAotICAgICAgc3RhdGlzdGljc19jYiwKLSAgICAgIGJhc2U6OkJpbmQoJkF1ZGlvUmVuZGVyZXJJbXBsOjpPbkRlY29kZXJTZWxlY3RlZCwgdGhpcywKLSAgICAgICAgICAgICAgICAgYmFzZTo6UGFzc2VkKCZkZWNvZGVyX3NlbGVjdG9yKSkpOwotfQotCi12b2lkIEF1ZGlvUmVuZGVyZXJJbXBsOjpPbkRlY29kZXJTZWxlY3RlZCgKLSAgICBzY29wZWRfcHRyPEF1ZGlvRGVjb2RlclNlbGVjdG9yPiBkZWNvZGVyX3NlbGVjdG9yLAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8QXVkaW9EZWNvZGVyPiYgc2VsZWN0ZWRfZGVjb2RlciwKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY3J5cHRpbmdEZW11eGVyU3RyZWFtPiYgZGVjcnlwdGluZ19kZW11eGVyX3N0cmVhbSkgewotICBEQ0hFQ0socGlwZWxpbmVfdGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0KLSAgaWYgKHN0YXRlXyA9PSBrU3RvcHBlZCkgewotICAgIERDSEVDSyghc2lua18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICghc2VsZWN0ZWRfZGVjb2RlcikgewotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZpbml0X2NiXykuUnVuKERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZGVjb2Rlcl8gPSBzZWxlY3RlZF9kZWNvZGVyOwotICBkZWNyeXB0aW5nX2RlbXV4ZXJfc3RyZWFtXyA9IGRlY3J5cHRpbmdfZGVtdXhlcl9zdHJlYW07Ci0KLSAgaW50IHNhbXBsZV9yYXRlID0gZGVjb2Rlcl8tPnNhbXBsZXNfcGVyX3NlY29uZCgpOwotICBpbnQgYnVmZmVyX3NpemUgPSBHZXRIaWdoTGF0ZW5jeU91dHB1dEJ1ZmZlclNpemUoc2FtcGxlX3JhdGUpOwotICBBdWRpb1BhcmFtZXRlcnM6OkZvcm1hdCBmb3JtYXQgPSBBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MSU5FQVI7Ci0KLSAgLy8gT24gV2luZG93cyBhbmQgTWFjIHdlIGNhbiB1c2UgdGhlIGxvdyBsYXRlbmN5IHBpcGVsaW5lIGJlY2F1c2UgdGhleSBwcm92aWRlCi0gIC8vIGFjY3VyYXRlIGFuZCBzbW9vdGggZGVsYXkgaW5mb3JtYXRpb24uICBPbiBvdGhlciBwbGF0Zm9ybXMgbGlrZSBMaW51eCB0aGVyZQotICAvLyBhcmUgaml0dGVyIGlzc3Vlcy4KLSAgLy8gVE9ETyhkYWxlY3VydGlzKTogRml4IGJ1Z3M6IGh0dHA6Ly9jcmJ1Zy5jb20vMTM4MDk4IGh0dHA6Ly9jcmJ1Zy5jb20vMzI3NTcKLSNpZiBkZWZpbmVkKE9TX1dJTikgfHwgZGVmaW5lZChPU19NQUNPU1gpCi0gIGNvbnN0IENvbW1hbmRMaW5lKiBjbWRfbGluZSA9IENvbW1hbmRMaW5lOjpGb3JDdXJyZW50UHJvY2VzcygpOwotICAvLyBFaXRoZXIgQXVkaW9PdXRwdXRSZXNhbXBsZXIgb3IgcmVuZGVyZXIgc2lkZSBtaXhpbmcgbXVzdCBiZSBlbmFibGVkIHRvIHVzZQotICAvLyB0aGUgbG93IGxhdGVuY3kgcGlwZWxpbmUuCi0gIGlmICghY21kX2xpbmUtPkhhc1N3aXRjaChzd2l0Y2hlczo6a0Rpc2FibGVSZW5kZXJlclNpZGVNaXhpbmcpIHx8Ci0gICAgICAhY21kX2xpbmUtPkhhc1N3aXRjaChzd2l0Y2hlczo6a0Rpc2FibGVBdWRpb091dHB1dFJlc2FtcGxlcikpIHsKLSAgICAvLyBUaGVyZSBhcmUgdHdvIGNhc2VzIGhlcmU6Ci0gICAgLy8KLSAgICAvLyAxLiBSZW5kZXJlciBzaWRlIG1peGluZyBpcyBlbmFibGVkIGFuZCB0aGUgYnVmZmVyIHNpemUgaXMgYWN0dWFsbHkKLSAgICAvLyAgICBjb250cm9sbGVkIGJ5IHRoZSBzaXplIG9mIHRoZSBBdWRpb0J1cyBwcm92aWRlZCB0byBSZW5kZXIoKS4gIEluIHRoaXMKLSAgICAvLyAgICBjYXNlIHRoZSBidWZmZXIgc2l6ZSBiZWxvdyBpcyBpZ25vcmVkLgotICAgIC8vCi0gICAgLy8gMi4gUmVuZGVyZXIgc2lkZSBtaXhpbmcgaXMgZGlzYWJsZWQgYW5kIEF1ZGlvT3V0cHV0UmVzYW1wbGVyIG9uIHRoZQotICAgIC8vICAgIGJyb3dzZXIgc2lkZSBpcyByZWJ1ZmZlcmluZyB0byB0aGUgaGFyZHdhcmUgc2l6ZSBvbiB0aGUgZmx5LgotICAgIC8vCi0gICAgLy8gSW4gdGhlIHNlY29uZCBjYXNlIHdlIG5lZWQgdG8gY2hvb3NlIGEgYSBidWZmZXIgc2l6ZSBzbWFsbCBlbm91Z2ggdGhhdAotICAgIC8vIHRoZSBkZWNvZGVyIGNhbiBmdWxmaWxsIHRoZSBoaWdoIGZyZXF1ZW5jeSBsb3cgbGF0ZW5jeSBhdWRpbyBjYWxsYmFja3MsCi0gICAgLy8gYnV0IG5vdCBzbyBzbWFsbCB0aGF0IGl0J3MgbGVzcyB0aGFuIHRoZSBoYXJkd2FyZSBidWZmZXIgc2l6ZSAob3Igd2UnbGwKLSAgICAvLyBydW4gaW50byBpc3N1ZXMgc2luY2UgdGhlIHNoYXJlZCBtZW1vcnkgc3luYyBpcyBub24tYmxvY2tpbmcpLgotICAgIC8vCi0gICAgLy8gVGhlIGJ1ZmZlciBzaXplIGJlbG93IGlzIGFyYml0cmFyaWx5IHRoZSBzYW1lIHNpemUgdXNlZCBieSBQZXBwZXIgRmxhc2gKLSAgICAvLyBmb3IgY29uc2lzdGVuY3kuICBTaW5jZSByZW5kZXJlciBzaWRlIG1peGluZyBpcyBvbmx5IGRpc2FibGVkIGZvciBkZWJ1ZwotICAgIC8vIHB1cnBvc2VzIGl0J3Mgb2theSB0aGF0IHRoaXMgYnVmZmVyIHNpemUgbWlnaHQgbGVhZCB0byBqaXR0ZXIgc2luY2UgaXQncwotICAgIC8vIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBoYXJkd2FyZSBidWZmZXIgc2l6ZS4KLSAgICBmb3JtYXQgPSBBdWRpb1BhcmFtZXRlcnM6OkFVRElPX1BDTV9MT1dfTEFURU5DWTsKLSAgICBidWZmZXJfc2l6ZSA9IDIwNDg7Ci0gIH0KLSNlbmRpZgotCi0gIGF1ZGlvX3BhcmFtZXRlcnNfID0gQXVkaW9QYXJhbWV0ZXJzKAotICAgICAgZm9ybWF0LCBkZWNvZGVyXy0+Y2hhbm5lbF9sYXlvdXQoKSwgc2FtcGxlX3JhdGUsCi0gICAgICBkZWNvZGVyXy0+Yml0c19wZXJfY2hhbm5lbCgpLCBidWZmZXJfc2l6ZSk7Ci0gIGlmICghYXVkaW9fcGFyYW1ldGVyc18uSXNWYWxpZCgpKSB7Ci0gICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJmluaXRfY2JfKS5SdW4oUElQRUxJTkVfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpbnQgY2hhbm5lbHMgPSBDaGFubmVsTGF5b3V0VG9DaGFubmVsQ291bnQoZGVjb2Rlcl8tPmNoYW5uZWxfbGF5b3V0KCkpOwotICBpbnQgYnl0ZXNfcGVyX2ZyYW1lID0gY2hhbm5lbHMgKiBkZWNvZGVyXy0+Yml0c19wZXJfY2hhbm5lbCgpIC8gODsKLSAgc3BsaWNlcl8ucmVzZXQobmV3IEF1ZGlvU3BsaWNlcihieXRlc19wZXJfZnJhbWUsIHNhbXBsZV9yYXRlKSk7Ci0KLSAgLy8gV2UncmUgYWxsIGdvb2QhIENvbnRpbnVlIGluaXRpYWxpemluZyB0aGUgcmVzdCBvZiB0aGUgYXVkaW8gcmVuZGVyZXIgYmFzZWQKLSAgLy8gb24gdGhlIGRlY29kZXIgZm9ybWF0LgotICBhbGdvcml0aG1fLnJlc2V0KG5ldyBBdWRpb1JlbmRlcmVyQWxnb3JpdGhtKCkpOwotICBhbGdvcml0aG1fLT5Jbml0aWFsaXplKDAsIGF1ZGlvX3BhcmFtZXRlcnNfLCBiYXNlOjpCaW5kKAotICAgICAgJkF1ZGlvUmVuZGVyZXJJbXBsOjpTY2hlZHVsZVJlYWRfTG9ja2VkLCB0aGlzKSk7Ci0KLSAgc3RhdGVfID0ga1BhdXNlZDsKLQotICBzaW5rXy0+SW5pdGlhbGl6ZShhdWRpb19wYXJhbWV0ZXJzXywgdGhpcyk7Ci0gIHNpbmtfLT5TdGFydCgpOwotCi0gIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZpbml0X2NiXykuUnVuKFBJUEVMSU5FX09LKTsKLX0KLQotdm9pZCBBdWRpb1JlbmRlcmVySW1wbDo6UmVzdW1lQWZ0ZXJVbmRlcmZsb3coYm9vbCBidWZmZXJfbW9yZV9hdWRpbykgewotICBEQ0hFQ0socGlwZWxpbmVfdGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gIGlmIChzdGF0ZV8gPT0ga1VuZGVyZmxvdykgewotICAgIC8vIFRoZSAiJiYgcHJlcm9sbF9hYm9ydGVkXyIgaXMgYSBoYWNrLiBJZiBwcmVyb2xsIGlzIGFib3J0ZWQsIHRoZW4gd2UKLSAgICAvLyBzaG91bGRuJ3QgZXZlbiByZWFjaCB0aGUga1VuZGVyZmxvdyBzdGF0ZSB0byBiZWdpbiB3aXRoLiBCdXQgZm9yIG5vdwotICAgIC8vIHdlJ3JlIGp1c3QgbWFraW5nIHN1cmUgdGhhdCB0aGUgYXVkaW8gYnVmZmVyIGNhcGFjaXR5IChpLmUuIHRoZQotICAgIC8vIG51bWJlciBvZiBieXRlcyB0aGF0IG5lZWQgdG8gYmUgYnVmZmVyZWQgZm9yIHByZXJvbGwgdG8gY29tcGxldGUpCi0gICAgLy8gZG9lcyBub3QgaW5jcmVhc2UgZHVlIHRvIGFuIGFib3J0ZWQgcHJlcm9sbC4KLSAgICAvLyBUT0RPKHZyayk6IEZpeCB0aGlzIGJ1ZyBjb3JyZWN0bHkhIChjcmJ1Zy5jb20vMTUxMzUyKQotICAgIGlmIChidWZmZXJfbW9yZV9hdWRpbyAmJiAhcHJlcm9sbF9hYm9ydGVkXykKLSAgICAgIGFsZ29yaXRobV8tPkluY3JlYXNlUXVldWVDYXBhY2l0eSgpOwotCi0gICAgc3RhdGVfID0ga1JlYnVmZmVyaW5nOwotICB9Ci19Ci0KLXZvaWQgQXVkaW9SZW5kZXJlckltcGw6OlNldFZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgRENIRUNLKHBpcGVsaW5lX3RocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBEQ0hFQ0soc2lua18pOwotICBzaW5rXy0+U2V0Vm9sdW1lKHZvbHVtZSk7Ci19Ci0KLUF1ZGlvUmVuZGVyZXJJbXBsOjp+QXVkaW9SZW5kZXJlckltcGwoKSB7Ci0gIC8vIFN0b3AoKSBzaG91bGQgaGF2ZSBiZWVuIGNhbGxlZCBhbmQgfGFsZ29yaXRobV98IHNob3VsZCBoYXZlIGJlZW4gZGVzdHJveWVkLgotICBEQ0hFQ0soc3RhdGVfID09IGtVbmluaXRpYWxpemVkIHx8IHN0YXRlXyA9PSBrU3RvcHBlZCk7Ci0gIERDSEVDSyghYWxnb3JpdGhtXy5nZXQoKSk7Ci19Ci0KLXZvaWQgQXVkaW9SZW5kZXJlckltcGw6OkRlY29kZWRBdWRpb1JlYWR5KEF1ZGlvRGVjb2Rlcjo6U3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8QnVmZmVyPiYgYnVmZmVyKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gIERDSEVDSyhzdGF0ZV8gPT0ga1BhdXNlZCB8fCBzdGF0ZV8gPT0ga1ByZXJvbGxpbmcgfHwgc3RhdGVfID09IGtQbGF5aW5nIHx8Ci0gICAgICAgICBzdGF0ZV8gPT0ga1VuZGVyZmxvdyB8fCBzdGF0ZV8gPT0ga1JlYnVmZmVyaW5nIHx8IHN0YXRlXyA9PSBrU3RvcHBlZCk7Ci0KLSAgQ0hFQ0socGVuZGluZ19yZWFkXyk7Ci0gIHBlbmRpbmdfcmVhZF8gPSBmYWxzZTsKLQotICBpZiAoc3RhdHVzID09IEF1ZGlvRGVjb2Rlcjo6a0Fib3J0ZWQpIHsKLSAgICBIYW5kbGVBYm9ydGVkUmVhZE9yRGVjb2RlRXJyb3IoZmFsc2UpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzdGF0dXMgPT0gQXVkaW9EZWNvZGVyOjprRGVjb2RlRXJyb3IpIHsKLSAgICBIYW5kbGVBYm9ydGVkUmVhZE9yRGVjb2RlRXJyb3IodHJ1ZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRENIRUNLX0VRKHN0YXR1cywgQXVkaW9EZWNvZGVyOjprT2spOwotICBEQ0hFQ0soYnVmZmVyKTsKLQotICBpZiAoIXNwbGljZXJfLT5BZGRJbnB1dChidWZmZXIpKSB7Ci0gICAgSGFuZGxlQWJvcnRlZFJlYWRPckRlY29kZUVycm9yKHRydWUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICghc3BsaWNlcl8tPkhhc05leHRCdWZmZXIoKSkgewotICAgIFNjaGVkdWxlUmVhZF9Mb2NrZWQoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBib29sIG5lZWRfYW5vdGhlcl9idWZmZXIgPSBmYWxzZTsKLSAgd2hpbGUgKHNwbGljZXJfLT5IYXNOZXh0QnVmZmVyKCkpCi0gICAgbmVlZF9hbm90aGVyX2J1ZmZlciA9IEhhbmRsZVNwbGljZXJCdWZmZXIoc3BsaWNlcl8tPkdldE5leHRCdWZmZXIoKSk7Ci0KLSAgaWYgKCFuZWVkX2Fub3RoZXJfYnVmZmVyKQotICAgIHJldHVybjsKLQotICBTY2hlZHVsZVJlYWRfTG9ja2VkKCk7Ci19Ci0KLWJvb2wgQXVkaW9SZW5kZXJlckltcGw6OkhhbmRsZVNwbGljZXJCdWZmZXIoCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxCdWZmZXI+JiBidWZmZXIpIHsKLSAgaWYgKGJ1ZmZlci0+SXNFbmRPZlN0cmVhbSgpKSB7Ci0gICAgcmVjZWl2ZWRfZW5kX29mX3N0cmVhbV8gPSB0cnVlOwotCi0gICAgLy8gVHJhbnNpdGlvbiB0byBrUGxheWluZyBpZiB3ZSBhcmUgY3VycmVudGx5IGhhbmRsaW5nIGFuIHVuZGVyZmxvdyBzaW5jZQotICAgIC8vIG5vIG1vcmUgZGF0YSB3aWxsIGJlIGFycml2aW5nLgotICAgIGlmIChzdGF0ZV8gPT0ga1VuZGVyZmxvdyB8fCBzdGF0ZV8gPT0ga1JlYnVmZmVyaW5nKQotICAgICAgc3RhdGVfID0ga1BsYXlpbmc7Ci0gIH0KLQotICBzd2l0Y2ggKHN0YXRlXykgewotICAgIGNhc2Uga1VuaW5pdGlhbGl6ZWQ6Ci0gICAgICBOT1RSRUFDSEVEKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgY2FzZSBrUGF1c2VkOgotICAgICAgaWYgKCFidWZmZXItPklzRW5kT2ZTdHJlYW0oKSkKLSAgICAgICAgYWxnb3JpdGhtXy0+RW5xdWV1ZUJ1ZmZlcihidWZmZXIpOwotICAgICAgRENIRUNLKCFwZW5kaW5nX3JlYWRfKTsKLSAgICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZwYXVzZV9jYl8pLlJ1bigpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGNhc2Uga1ByZXJvbGxpbmc6Ci0gICAgICBpZiAoSXNCZWZvcmVQcmVyb2xsVGltZShidWZmZXIpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgaWYgKCFidWZmZXItPklzRW5kT2ZTdHJlYW0oKSkgewotICAgICAgICBhbGdvcml0aG1fLT5FbnF1ZXVlQnVmZmVyKGJ1ZmZlcik7Ci0gICAgICAgIGlmICghYWxnb3JpdGhtXy0+SXNRdWV1ZUZ1bGwoKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBzdGF0ZV8gPSBrUGF1c2VkOwotICAgICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnByZXJvbGxfY2JfKS5SdW4oUElQRUxJTkVfT0spOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGNhc2Uga1BsYXlpbmc6Ci0gICAgY2FzZSBrVW5kZXJmbG93OgotICAgIGNhc2Uga1JlYnVmZmVyaW5nOgotICAgICAgaWYgKCFidWZmZXItPklzRW5kT2ZTdHJlYW0oKSkKLSAgICAgICAgYWxnb3JpdGhtXy0+RW5xdWV1ZUJ1ZmZlcihidWZmZXIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGNhc2Uga1N0b3BwZWQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEF1ZGlvUmVuZGVyZXJJbXBsOjpTY2hlZHVsZVJlYWRfTG9ja2VkKCkgewotICBsb2NrXy5Bc3NlcnRBY3F1aXJlZCgpOwotICBpZiAocGVuZGluZ19yZWFkXyB8fCBzdGF0ZV8gPT0ga1BhdXNlZCkKLSAgICByZXR1cm47Ci0gIHBlbmRpbmdfcmVhZF8gPSB0cnVlOwotICBkZWNvZGVyXy0+UmVhZChiYXNlOjpCaW5kKCZBdWRpb1JlbmRlcmVySW1wbDo6RGVjb2RlZEF1ZGlvUmVhZHksIHRoaXMpKTsKLX0KLQotdm9pZCBBdWRpb1JlbmRlcmVySW1wbDo6U2V0UGxheWJhY2tSYXRlKGZsb2F0IHBsYXliYWNrX3JhdGUpIHsKLSAgRENIRUNLKHBpcGVsaW5lX3RocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBEQ0hFQ0tfTEUoMC4wZiwgcGxheWJhY2tfcmF0ZSk7Ci0gIERDSEVDSyhzaW5rXyk7Ci0KLSAgLy8gV2UgaGF2ZSB0d28gY2FzZXMgaGVyZToKLSAgLy8gUGxheTogY3VycmVudF9wbGF5YmFja19yYXRlID09IDAuMCAmJiBwbGF5YmFja19yYXRlICE9IDAuMAotICAvLyBQYXVzZTogY3VycmVudF9wbGF5YmFja19yYXRlICE9IDAuMCAmJiBwbGF5YmFja19yYXRlID09IDAuMAotICBmbG9hdCBjdXJyZW50X3BsYXliYWNrX3JhdGUgPSBhbGdvcml0aG1fLT5wbGF5YmFja19yYXRlKCk7Ci0gIGlmIChjdXJyZW50X3BsYXliYWNrX3JhdGUgPT0gMC4wZiAmJiBwbGF5YmFja19yYXRlICE9IDAuMGYpIHsKLSAgICBEb1BsYXkoKTsKLSAgfSBlbHNlIGlmIChjdXJyZW50X3BsYXliYWNrX3JhdGUgIT0gMC4wZiAmJiBwbGF5YmFja19yYXRlID09IDAuMGYpIHsKLSAgICAvLyBQYXVzZSBpcyBlYXN5LCB3ZSBjYW4gYWx3YXlzIHBhdXNlLgotICAgIERvUGF1c2UoKTsKLSAgfQotCi0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gIGFsZ29yaXRobV8tPlNldFBsYXliYWNrUmF0ZShwbGF5YmFja19yYXRlKTsKLX0KLQotYm9vbCBBdWRpb1JlbmRlcmVySW1wbDo6SXNCZWZvcmVQcmVyb2xsVGltZSgKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPEJ1ZmZlcj4mIGJ1ZmZlcikgewotICByZXR1cm4gKHN0YXRlXyA9PSBrUHJlcm9sbGluZykgJiYgYnVmZmVyICYmICFidWZmZXItPklzRW5kT2ZTdHJlYW0oKSAmJgotICAgICAgKGJ1ZmZlci0+R2V0VGltZXN0YW1wKCkgKyBidWZmZXItPkdldER1cmF0aW9uKCkpIDwgcHJlcm9sbF90aW1lc3RhbXBfOwotfQotCi1pbnQgQXVkaW9SZW5kZXJlckltcGw6OlJlbmRlcihBdWRpb0J1cyogYXVkaW9fYnVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvX2RlbGF5X21pbGxpc2Vjb25kcykgewotICBpZiAoYWN0dWFsX2ZyYW1lc19wZXJfYnVmZmVyXyAhPSBhdWRpb19idXMtPmZyYW1lcygpKSB7Ci0gICAgYXVkaW9fYnVmZmVyXy5yZXNldCgKLSAgICAgICAgbmV3IHVpbnQ4W2F1ZGlvX2J1cy0+ZnJhbWVzKCkgKiBhdWRpb19wYXJhbWV0ZXJzXy5HZXRCeXRlc1BlckZyYW1lKCldKTsKLSAgICBhY3R1YWxfZnJhbWVzX3Blcl9idWZmZXJfID0gYXVkaW9fYnVzLT5mcmFtZXMoKTsKLSAgfQotCi0gIGludCBmcmFtZXNfZmlsbGVkID0gRmlsbEJ1ZmZlcigKLSAgICAgIGF1ZGlvX2J1ZmZlcl8uZ2V0KCksIGF1ZGlvX2J1cy0+ZnJhbWVzKCksIGF1ZGlvX2RlbGF5X21pbGxpc2Vjb25kcyk7Ci0gIERDSEVDS19MRShmcmFtZXNfZmlsbGVkLCBhY3R1YWxfZnJhbWVzX3Blcl9idWZmZXJfKTsKLQotICAvLyBEZWludGVybGVhdmUgYXVkaW8gZGF0YSBpbnRvIHRoZSBvdXRwdXQgYnVzLgotICBhdWRpb19idXMtPkZyb21JbnRlcmxlYXZlZCgKLSAgICAgIGF1ZGlvX2J1ZmZlcl8uZ2V0KCksIGZyYW1lc19maWxsZWQsCi0gICAgICBhdWRpb19wYXJhbWV0ZXJzXy5iaXRzX3Blcl9zYW1wbGUoKSAvIDgpOwotCi0gIHJldHVybiBmcmFtZXNfZmlsbGVkOwotfQotCi11aW50MzIgQXVkaW9SZW5kZXJlckltcGw6OkZpbGxCdWZmZXIodWludDgqIGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHJlcXVlc3RlZF9mcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvX2RlbGF5X21pbGxpc2Vjb25kcykgewotICBiYXNlOjpUaW1lRGVsdGEgY3VycmVudF90aW1lID0ga05vVGltZXN0YW1wKCk7Ci0gIGJhc2U6OlRpbWVEZWx0YSBtYXhfdGltZSA9IGtOb1RpbWVzdGFtcCgpOwotCi0gIHNpemVfdCBmcmFtZXNfd3JpdHRlbiA9IDA7Ci0gIGJhc2U6OkNsb3N1cmUgdW5kZXJmbG93X2NiOwotICB7Ci0gICAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLQotICAgIC8vIEVuc3VyZSBTdG9wKCkgaGFzbid0IGRlc3Ryb3llZCBvdXIgfGFsZ29yaXRobV98IG9uIHRoZSBwaXBlbGluZSB0aHJlYWQuCi0gICAgaWYgKCFhbGdvcml0aG1fKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBmbG9hdCBwbGF5YmFja19yYXRlID0gYWxnb3JpdGhtXy0+cGxheWJhY2tfcmF0ZSgpOwotICAgIGlmIChwbGF5YmFja19yYXRlID09IDAuMGYpCi0gICAgICByZXR1cm4gMDsKLQotICAgIC8vIEFkanVzdCB0aGUgZGVsYXkgYWNjb3JkaW5nIHRvIHBsYXliYWNrIHJhdGUuCi0gICAgYmFzZTo6VGltZURlbHRhIHBsYXliYWNrX2RlbGF5ID0KLSAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKGF1ZGlvX2RlbGF5X21pbGxpc2Vjb25kcyk7Ci0gICAgaWYgKHBsYXliYWNrX3JhdGUgIT0gMS4wZikgewotICAgICAgcGxheWJhY2tfZGVsYXkgPSBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWNyb3NlY29uZHMoc3RhdGljX2Nhc3Q8aW50NjQ+KAotICAgICAgICAgIGNlaWwocGxheWJhY2tfZGVsYXkuSW5NaWNyb3NlY29uZHMoKSAqIHBsYXliYWNrX3JhdGUpKSk7Ci0gICAgfQotCi0gICAgaWYgKHN0YXRlXyA9PSBrUmVidWZmZXJpbmcgJiYgYWxnb3JpdGhtXy0+SXNRdWV1ZUZ1bGwoKSkKLSAgICAgIHN0YXRlXyA9IGtQbGF5aW5nOwotCi0gICAgLy8gTXV0ZSBhdWRpbyBieSByZXR1cm5pbmcgMCB3aGVuIG5vdCBwbGF5aW5nLgotICAgIGlmIChzdGF0ZV8gIT0ga1BsYXlpbmcpIHsKLSAgICAgIC8vIFRPRE8oc2NoZXJrdXMpOiBUbyBrZWVwIHRoZSBhdWRpbyBoYXJkd2FyZSBidXN5IHdlIHdyaXRlIGF0IG1vc3QgOGsgb2YKLSAgICAgIC8vIHplcm9zLiAgVGhpcyBnZXRzIGFyb3VuZCB0aGUgdHJpY2t5IHNpdHVhdGlvbiBvZiBwYXVzaW5nIGFuZCByZXN1bWluZwotICAgICAgLy8gdGhlIGF1ZGlvIElQQyBsYXllciBpbiBDaHJvbWUuICBJZGVhbGx5LCB3ZSBzaG91bGQgcmV0dXJuIHplcm8gYW5kIHRoZW4KLSAgICAgIC8vIHRoZSBzdWJjbGFzcyBjYW4gcmVzdGFydCB0aGUgY29udmVyc2F0aW9uLgotICAgICAgLy8KLSAgICAgIC8vIFRoaXMgc2hvdWxkIGdldCBoYW5kbGVkIGJ5IHRoZSBzdWJjbGFzcyBodHRwOi8vY3JidWcuY29tLzEwNjYwMAotICAgICAgY29uc3QgdWludDMyIGtaZXJvTGVuZ3RoID0gODE5MjsKLSAgICAgIHNpemVfdCB6ZXJvc190b193cml0ZSA9IHN0ZDo6bWluKAotICAgICAgICAgIGtaZXJvTGVuZ3RoLCByZXF1ZXN0ZWRfZnJhbWVzICogYXVkaW9fcGFyYW1ldGVyc18uR2V0Qnl0ZXNQZXJGcmFtZSgpKTsKLSAgICAgIG1lbXNldChkZXN0LCAwLCB6ZXJvc190b193cml0ZSk7Ci0gICAgICByZXR1cm4gemVyb3NfdG9fd3JpdGUgLyBhdWRpb19wYXJhbWV0ZXJzXy5HZXRCeXRlc1BlckZyYW1lKCk7Ci0gICAgfQotCi0gICAgLy8gV2UgdXNlIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyB0byBkZXRlcm1pbmUgZW5kIG9mIHBsYXliYWNrOgotICAgIC8vICAgMSkgQWxnb3JpdGhtIGNhbiBub3QgZmlsbCB0aGUgYXVkaW8gY2FsbGJhY2sgYnVmZmVyCi0gICAgLy8gICAyKSBXZSByZWNlaXZlZCBhbiBlbmQgb2Ygc3RyZWFtIGJ1ZmZlcgotICAgIC8vICAgMykgV2UgaGF2ZW4ndCBhbHJlYWR5IHNpZ25hbGxlZCB0aGF0IHdlJ3ZlIGVuZGVkCi0gICAgLy8gICA0KSBPdXIgZXN0aW1hdGVkIGVhcmxpZXN0IGVuZCB0aW1lIGhhcyBleHBpcmVkCi0gICAgLy8KLSAgICAvLyBUT0RPKGVuYWwpOiB3ZSBzaG91bGQgcmVwbGFjZSAoNCkgd2l0aCBhIGNoZWNrIHRoYXQgdGhlIGJyb3dzZXIgaGFzIG5vCi0gICAgLy8gbW9yZSBhdWRpbyBkYXRhIG9yIGF0IGxlYXN0IHVzZSBhIGRlbGF5ZWQgY2FsbGJhY2suCi0gICAgLy8KLSAgICAvLyBXZSB1c2UgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIHRvIGRldGVybWluZSB1bmRlcmZsb3c6Ci0gICAgLy8gICAxKSBBbGdvcml0aG0gY2FuIG5vdCBmaWxsIHRoZSBhdWRpbyBjYWxsYmFjayBidWZmZXIKLSAgICAvLyAgIDIpIFdlIGhhdmUgTk9UIHJlY2VpdmVkIGFuIGVuZCBvZiBzdHJlYW0gYnVmZmVyCi0gICAgLy8gICAzKSBXZSBhcmUgaW4gdGhlIGtQbGF5aW5nIHN0YXRlCi0gICAgLy8KLSAgICAvLyBPdGhlcndpc2UgZmlsbCB0aGUgYnVmZmVyIHdpdGggd2hhdGV2ZXIgZGF0YSB3ZSBjYW4gc2VuZCB0byB0aGUgZGV2aWNlLgotICAgIGlmICghYWxnb3JpdGhtXy0+Q2FuRmlsbEJ1ZmZlcigpICYmIHJlY2VpdmVkX2VuZF9vZl9zdHJlYW1fICYmCi0gICAgICAgICFyZW5kZXJlZF9lbmRfb2Zfc3RyZWFtXyAmJiBiYXNlOjpUaW1lOjpOb3coKSA+PSBlYXJsaWVzdF9lbmRfdGltZV8pIHsKLSAgICAgIHJlbmRlcmVkX2VuZF9vZl9zdHJlYW1fID0gdHJ1ZTsKLSAgICAgIGVuZGVkX2NiXy5SdW4oKTsKLSAgICB9IGVsc2UgaWYgKCFhbGdvcml0aG1fLT5DYW5GaWxsQnVmZmVyKCkgJiYgIXJlY2VpdmVkX2VuZF9vZl9zdHJlYW1fICYmCi0gICAgICAgICAgICAgICBzdGF0ZV8gPT0ga1BsYXlpbmcgJiYgIXVuZGVyZmxvd19kaXNhYmxlZF8pIHsKLSAgICAgIHN0YXRlXyA9IGtVbmRlcmZsb3c7Ci0gICAgICB1bmRlcmZsb3dfY2IgPSB1bmRlcmZsb3dfY2JfOwotICAgIH0gZWxzZSBpZiAoYWxnb3JpdGhtXy0+Q2FuRmlsbEJ1ZmZlcigpKSB7Ci0gICAgICBmcmFtZXNfd3JpdHRlbiA9IGFsZ29yaXRobV8tPkZpbGxCdWZmZXIoZGVzdCwgcmVxdWVzdGVkX2ZyYW1lcyk7Ci0gICAgICBEQ0hFQ0tfR1QoZnJhbWVzX3dyaXR0ZW4sIDB1KTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gV2UgY2FuJ3Qgd3JpdGUgYW55IGRhdGEgdGhpcyBjeWNsZS4gRm9yIGV4YW1wbGUsIHdlIG1heSBoYXZlCi0gICAgICAvLyBzZW50IGFsbCBhdmFpbGFibGUgZGF0YSB0byB0aGUgYXVkaW8gZGV2aWNlIHdoaWxlIG5vdCByZWFjaGluZwotICAgICAgLy8gfGVhcmxpZXN0X2VuZF90aW1lX3wuCi0gICAgfQotCi0gICAgLy8gVGhlIHxhdWRpb190aW1lX2J1ZmZlcmVkX3wgaXMgdGhlIGVuZGluZyB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgZnJhbWUKLSAgICAvLyBidWZmZXJlZCBhdCB0aGUgYXVkaW8gZGV2aWNlLiB8cGxheWJhY2tfZGVsYXl8IGlzIHRoZSBhbW91bnQgb2YgdGltZQotICAgIC8vIGJ1ZmZlcmVkIGF0IHRoZSBhdWRpbyBkZXZpY2UuIFRoZSBjdXJyZW50IHRpbWUgY2FuIGJlIGNvbXB1dGVkIGJ5IHRoZWlyCi0gICAgLy8gZGlmZmVyZW5jZS4KLSAgICBpZiAoYXVkaW9fdGltZV9idWZmZXJlZF8gIT0ga05vVGltZXN0YW1wKCkpIHsKLSAgICAgIGJhc2U6OlRpbWVEZWx0YSBwcmV2aW91c190aW1lID0gY3VycmVudF90aW1lXzsKLSAgICAgIGN1cnJlbnRfdGltZV8gPSBhdWRpb190aW1lX2J1ZmZlcmVkXyAtIHBsYXliYWNrX2RlbGF5OwotCi0gICAgICAvLyBUaW1lIGNhbiBjaGFuZ2UgaW4gb25lIG9mIHR3byB3YXlzOgotICAgICAgLy8gICAxKSBUaGUgdGltZSBvZiB0aGUgYXVkaW8gZGF0YSBhdCB0aGUgYXVkaW8gZGV2aWNlIGNoYW5nZWQsIG9yCi0gICAgICAvLyAgIDIpIFRoZSBwbGF5YmFjayBkZWxheSB2YWx1ZSBoYXMgY2hhbmdlZAotICAgICAgLy8KLSAgICAgIC8vIFdlIG9ubHkgd2FudCB0byBzZXQgfGN1cnJlbnRfdGltZXwgKGFuZCB0aHVzIGV4ZWN1dGUgfHRpbWVfY2JffCkgaWYKLSAgICAgIC8vIHRpbWUgaGFzIHByb2dyZXNzZWQgYW5kIHdlIGhhdmVuJ3Qgc2lnbmFsZWQgZW5kIG9mIHN0cmVhbSB5ZXQuCi0gICAgICAvLwotICAgICAgLy8gV2h5PyBUaGUgY3VycmVudCBsYXRlbmN5IG9mIHRoZSBzeXN0ZW0gcmVzdWx0cyBpbiBnZXR0aW5nIHRoZSBsYXN0IGNhbGwKLSAgICAgIC8vIHRvIEZpbGxCdWZmZXIoKSBsYXRlciB0aGFuIHdlJ2QgbGlrZSwgd2hpY2ggZGVsYXlzIGZpcmluZyB0aGUgJ2VuZGVkJwotICAgICAgLy8gZXZlbnQsIHdoaWNoIGRlbGF5cyB0aGUgbG9vcGluZy90cmlnZ2luZyBwZXJmb3JtYW5jZSBvZiBzaG9ydCBzb3VuZAotICAgICAgLy8gZWZmZWN0cy4KLSAgICAgIC8vCi0gICAgICAvLyBUT0RPKHNjaGVya3VzKTogcmV2aXNpdCB0aGlzIGFuZCBzd2l0Y2ggYmFjayB0byByZWx5aW5nIG9uIHBsYXliYWNrCi0gICAgICAvLyBkZWxheSBhZnRlciB3ZSd2ZSByZXZhbXBlZCBvdXIgYXVkaW8gSVBDIHN1YnN5c3RlbS4KLSAgICAgIGlmIChjdXJyZW50X3RpbWVfID4gcHJldmlvdXNfdGltZSAmJiAhcmVuZGVyZWRfZW5kX29mX3N0cmVhbV8pIHsKLSAgICAgICAgY3VycmVudF90aW1lID0gY3VycmVudF90aW1lXzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUaGUgY2FsbCB0byBGaWxsQnVmZmVyKCkgb24gfGFsZ29yaXRobV98IGhhcyBpbmNyZWFzZWQgdGhlIGFtb3VudCBvZgotICAgIC8vIGJ1ZmZlcmVkIGF1ZGlvIGRhdGEuIFVwZGF0ZSB0aGUgbmV3IGFtb3VudCBvZiB0aW1lIGJ1ZmZlcmVkLgotICAgIG1heF90aW1lID0gYWxnb3JpdGhtXy0+R2V0VGltZSgpOwotICAgIGF1ZGlvX3RpbWVfYnVmZmVyZWRfID0gbWF4X3RpbWU7Ci0KLSAgICBVcGRhdGVFYXJsaWVzdEVuZFRpbWVfTG9ja2VkKAotICAgICAgICBmcmFtZXNfd3JpdHRlbiwgcGxheWJhY2tfcmF0ZSwgcGxheWJhY2tfZGVsYXksIGJhc2U6OlRpbWU6Ok5vdygpKTsKLSAgfQotCi0gIGlmIChjdXJyZW50X3RpbWUgIT0ga05vVGltZXN0YW1wKCkgJiYgbWF4X3RpbWUgIT0ga05vVGltZXN0YW1wKCkpIHsKLSAgICB0aW1lX2NiXy5SdW4oY3VycmVudF90aW1lLCBtYXhfdGltZSk7Ci0gIH0KLQotICBpZiAoIXVuZGVyZmxvd19jYi5pc19udWxsKCkpCi0gICAgdW5kZXJmbG93X2NiLlJ1bigpOwotCi0gIHJldHVybiBmcmFtZXNfd3JpdHRlbjsKLX0KLQotdm9pZCBBdWRpb1JlbmRlcmVySW1wbDo6VXBkYXRlRWFybGllc3RFbmRUaW1lX0xvY2tlZCgKLSAgICBpbnQgZnJhbWVzX2ZpbGxlZCwgZmxvYXQgcGxheWJhY2tfcmF0ZSwgYmFzZTo6VGltZURlbHRhIHBsYXliYWNrX2RlbGF5LAotICAgIGJhc2U6OlRpbWUgdGltZV9ub3cpIHsKLSAgaWYgKGZyYW1lc19maWxsZWQgPD0gMCkKLSAgICByZXR1cm47Ci0KLSAgYmFzZTo6VGltZURlbHRhIHByZWRpY3RlZF9wbGF5X3RpbWUgPSBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWNyb3NlY29uZHMoCi0gICAgICBzdGF0aWNfY2FzdDxmbG9hdD4oZnJhbWVzX2ZpbGxlZCkgKiBiYXNlOjpUaW1lOjprTWljcm9zZWNvbmRzUGVyU2Vjb25kIC8KLSAgICAgIGF1ZGlvX3BhcmFtZXRlcnNfLnNhbXBsZV9yYXRlKCkpOwotCi0gIGlmIChwbGF5YmFja19yYXRlICE9IDEuMGYpIHsKLSAgICBwcmVkaWN0ZWRfcGxheV90aW1lID0gYmFzZTo6VGltZURlbHRhOjpGcm9tTWljcm9zZWNvbmRzKAotICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2ND4oY2VpbChwcmVkaWN0ZWRfcGxheV90aW1lLkluTWljcm9zZWNvbmRzKCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja19yYXRlKSkpOwotICB9Ci0KLSAgbG9ja18uQXNzZXJ0QWNxdWlyZWQoKTsKLSAgZWFybGllc3RfZW5kX3RpbWVfID0gc3RkOjptYXgoCi0gICAgICBlYXJsaWVzdF9lbmRfdGltZV8sIHRpbWVfbm93ICsgcGxheWJhY2tfZGVsYXkgKyBwcmVkaWN0ZWRfcGxheV90aW1lKTsKLX0KLQotdm9pZCBBdWRpb1JlbmRlcmVySW1wbDo6T25SZW5kZXJFcnJvcigpIHsKLSAgZGlzYWJsZWRfY2JfLlJ1bigpOwotfQotCi12b2lkIEF1ZGlvUmVuZGVyZXJJbXBsOjpEaXNhYmxlVW5kZXJmbG93Rm9yVGVzdGluZygpIHsKLSAgdW5kZXJmbG93X2Rpc2FibGVkXyA9IHRydWU7Ci19Ci0KLXZvaWQgQXVkaW9SZW5kZXJlckltcGw6OkhhbmRsZUFib3J0ZWRSZWFkT3JEZWNvZGVFcnJvcihib29sIGlzX2RlY29kZV9lcnJvcikgewotICBQaXBlbGluZVN0YXR1cyBzdGF0dXMgPSBpc19kZWNvZGVfZXJyb3IgPyBQSVBFTElORV9FUlJPUl9ERUNPREUgOiBQSVBFTElORV9PSzsKLSAgc3dpdGNoIChzdGF0ZV8pIHsKLSAgICBjYXNlIGtVbmluaXRpYWxpemVkOgotICAgICAgTk9UUkVBQ0hFRCgpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2Uga1BhdXNlZDoKLSAgICAgIGlmIChzdGF0dXMgIT0gUElQRUxJTkVfT0spCi0gICAgICAgIGVycm9yX2NiXy5SdW4oc3RhdHVzKTsKLSAgICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZwYXVzZV9jYl8pLlJ1bigpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2Uga1ByZXJvbGxpbmc6Ci0gICAgICAvLyBUaGlzIGlzIGEgc2lnbmFsIGZvciBhYm9ydCBpZiBpdCdzIG5vdCBhbiBlcnJvci4KLSAgICAgIHByZXJvbGxfYWJvcnRlZF8gPSAhaXNfZGVjb2RlX2Vycm9yOwotICAgICAgc3RhdGVfID0ga1BhdXNlZDsKLSAgICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZwcmVyb2xsX2NiXykuUnVuKHN0YXR1cyk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBrUGxheWluZzoKLSAgICBjYXNlIGtVbmRlcmZsb3c6Ci0gICAgY2FzZSBrUmVidWZmZXJpbmc6Ci0gICAgY2FzZSBrU3RvcHBlZDoKLSAgICAgIGlmIChzdGF0dXMgIT0gUElQRUxJTkVfT0spCi0gICAgICAgIGVycm9yX2NiXy5SdW4oc3RhdHVzKTsKLSAgICAgIHJldHVybjsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL2F1ZGlvX3JlbmRlcmVyX2ltcGwuaCBiL3NyYy9tZWRpYS9maWx0ZXJzL2F1ZGlvX3JlbmRlcmVyX2ltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE1OGFhMS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9hdWRpb19yZW5kZXJlcl9pbXBsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gQXVkaW8gcmVuZGVyaW5nIHVuaXQgdXRpbGl6aW5nIGFuIEF1ZGlvUmVuZGVyZXJTaW5rIHRvIG91dHB1dCBkYXRhLgotLy8KLS8vIFRoaXMgY2xhc3MgbGl2ZXMgaW5zaWRlIHRocmVlIHRocmVhZHMgZHVyaW5nIGl0J3MgbGlmZXRpbWUsIG5hbWVseToKLS8vIDEuIFJlbmRlciB0aHJlYWQuCi0vLyAgICBUaGlzIG9iamVjdCBpcyBjcmVhdGVkIG9uIHRoZSByZW5kZXIgdGhyZWFkLgotLy8gMi4gUGlwZWxpbmUgdGhyZWFkCi0vLyAgICBJbml0aWFsaXplKCkgaXMgY2FsbGVkIGhlcmUgd2l0aCB0aGUgYXVkaW8gZm9ybWF0LgotLy8gICAgUGxheS9QYXVzZS9QcmVyb2xsKCkgYWxzbyBoYXBwZW5zIGhlcmUuCi0vLyAzLiBBdWRpbyB0aHJlYWQgY3JlYXRlZCBieSB0aGUgQXVkaW9SZW5kZXJlclNpbmsuCi0vLyAgICBSZW5kZXIoKSBpcyBjYWxsZWQgaGVyZSB3aGVyZSBhdWRpbyBkYXRhIGlzIGRlY29kZWQgaW50byByYXcgUENNIGRhdGEuCi0vLwotLy8gQXVkaW9SZW5kZXJlckltcGwgdGFsa3MgdG8gYW4gQXVkaW9SZW5kZXJlckFsZ29yaXRobSB0aGF0IHRha2VzIGNhcmUgb2YKLS8vIHF1ZXVlaW5nIGF1ZGlvIGRhdGEgYW5kIHN0cmV0Y2hpbmcvc2hyaW5raW5nIGF1ZGlvIGRhdGEgd2hlbiBwbGF5YmFjayByYXRlICE9Ci0vLyAxLjAgb3IgMC4wLgotCi0jaWZuZGVmIE1FRElBX0ZJTFRFUlNfQVVESU9fUkVOREVSRVJfSU1QTF9IXwotI2RlZmluZSBNRURJQV9GSUxURVJTX0FVRElPX1JFTkRFUkVSX0lNUExfSF8KLQotI2luY2x1ZGUgPGRlcXVlPgotCi0jaW5jbHVkZSAiYmFzZS9ndGVzdF9wcm9kX3V0aWwuaCIKLSNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi9sb2NrLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX3JlbmRlcmVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19yZW5kZXJlcl9zaW5rLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9idWZmZXJzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNyeXB0b3IuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL2F1ZGlvX3JlbmRlcmVyX2FsZ29yaXRobS5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBBdWRpb0RlY29kZXJTZWxlY3RvcjsKLWNsYXNzIEF1ZGlvU3BsaWNlcjsKLWNsYXNzIERlY3J5cHRpbmdEZW11eGVyU3RyZWFtOwotCi1jbGFzcyBNRURJQV9FWFBPUlQgQXVkaW9SZW5kZXJlckltcGwKLSAgICA6IHB1YmxpYyBBdWRpb1JlbmRlcmVyLAotICAgICAgTk9OX0VYUE9SVEVEX0JBU0UocHVibGljIEF1ZGlvUmVuZGVyZXJTaW5rOjpSZW5kZXJDYWxsYmFjaykgewotIHB1YmxpYzoKLSAgLy8gTWV0aG9kcyBjYWxsZWQgb24gUmVuZGVyIHRocmVhZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gQW4gQXVkaW9SZW5kZXJlclNpbmsgaXMgdXNlZCBhcyB0aGUgZGVzdGluYXRpb24gZm9yIHRoZSByZW5kZXJlZCBhdWRpby4KLSAgQXVkaW9SZW5kZXJlckltcGwoQXVkaW9SZW5kZXJlclNpbmsqIHNpbmssCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFNldERlY3J5cHRvclJlYWR5Q0ImIHNldF9kZWNyeXB0b3JfcmVhZHlfY2IpOwotCi0gIC8vIE1ldGhvZHMgY2FsbGVkIG9uIHBpcGVsaW5lIHRocmVhZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIEF1ZGlvUmVuZGVyZXIgaW1wbGVtZW50YXRpb24uCi0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4mIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZWNvZGVyTGlzdCYgZGVjb2RlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGluaXRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXRpc3RpY3NDQiYgc3RhdGlzdGljc19jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6Q2xvc3VyZSYgdW5kZXJmbG93X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaW1lQ0ImIHRpbWVfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIGVuZGVkX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiBkaXNhYmxlZF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgZXJyb3JfY2IpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgUGxheShjb25zdCBiYXNlOjpDbG9zdXJlJiBjYWxsYmFjaykgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBQYXVzZShjb25zdCBiYXNlOjpDbG9zdXJlJiBjYWxsYmFjaykgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBGbHVzaChjb25zdCBiYXNlOjpDbG9zdXJlJiBjYWxsYmFjaykgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTdG9wKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFNldFBsYXliYWNrUmF0ZShmbG9hdCByYXRlKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFByZXJvbGwoYmFzZTo6VGltZURlbHRhIHRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGNiKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFJlc3VtZUFmdGVyVW5kZXJmbG93KGJvb2wgYnVmZmVyX21vcmVfYXVkaW8pIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSkgT1ZFUlJJREU7Ci0KLSAgLy8gRGlzYWJsZXMgdW5kZXJmbG93IHN1cHBvcnQuICBXaGVuIHVzZWQsIHxzdGF0ZV98IHdpbGwgbmV2ZXIgdHJhbnNpdGlvbiB0bwotICAvLyBrVW5kZXJmbG93IHJlc3VsdGluZyBpbiBSZW5kZXIgY2FsbHMgdGhhdCB1bmRlcmZsb3cgcmV0dXJuaW5nIDAgZnJhbWVzCi0gIC8vIGluc3RlYWQgb2Ygc29tZSBudW1iZXIgb2Ygc2lsZW5jZSBmcmFtZXMuICBNdXN0IGJlIGNhbGxlZCBwcmlvciB0bwotICAvLyBJbml0aWFsaXplKCkuCi0gIHZvaWQgRGlzYWJsZVVuZGVyZmxvd0ZvclRlc3RpbmcoKTsKLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB+QXVkaW9SZW5kZXJlckltcGwoKTsKLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBBdWRpb1JlbmRlcmVySW1wbFRlc3Q7Ci0gIEZSSUVORF9URVNUX0FMTF9QUkVGSVhFUyhBdWRpb1JlbmRlcmVySW1wbFRlc3QsIEVuZE9mU3RyZWFtKTsKLSAgRlJJRU5EX1RFU1RfQUxMX1BSRUZJWEVTKEF1ZGlvUmVuZGVyZXJJbXBsVGVzdCwgVW5kZXJmbG93X0VuZE9mU3RyZWFtKTsKLQotICAvLyBDYWxsYmFjayBmcm9tIHRoZSBhdWRpbyBkZWNvZGVyIGRlbGl2ZXJpbmcgZGVjb2RlZCBhdWRpbyBzYW1wbGVzLgotICB2b2lkIERlY29kZWRBdWRpb1JlYWR5KEF1ZGlvRGVjb2Rlcjo6U3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPEJ1ZmZlcj4mIGJ1ZmZlcik7Ci0KLSAgLy8gSGFuZGxlcyBidWZmZXJzIHRoYXQgY29tZSBvdXQgb2YgfHNwbGljZXJffC4KLSAgLy8gUmV0dXJucyB0cnVlIGlmIG1vcmUgYnVmZmVycyBhcmUgbmVlZGVkLgotICBib29sIEhhbmRsZVNwbGljZXJCdWZmZXIoY29uc3Qgc2NvcGVkX3JlZnB0cjxCdWZmZXI+JiBidWZmZXIpOwotCi0gIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIEF1ZGlvRGVjb2Rlcjo6U3RhdHVzIHZhbHVlcyBwYXNzZWQgdG8KLSAgLy8gRGVjb2RlZEF1ZGlvUmVhZHkoKS4KLSAgdm9pZCBIYW5kbGVBYm9ydGVkUmVhZE9yRGVjb2RlRXJyb3IoYm9vbCBpc19kZWNvZGVfZXJyb3IpOwotCi0gIC8vIEZpbGxzIHRoZSBnaXZlbiBidWZmZXIgd2l0aCBhdWRpbyBkYXRhIGJ5IGRlbGVnYXRpbmcgdG8gaXRzIHxhbGdvcml0aG1ffC4KLSAgLy8gRmlsbEJ1ZmZlcigpIGFsc28gdGFrZXMgY2FyZSBvZiB1cGRhdGluZyB0aGUgY2xvY2suIFJldHVybnMgdGhlIG51bWJlciBvZgotICAvLyBmcmFtZXMgY29waWVkIGludG8gfGRlc3R8LCB3aGljaCBtYXkgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvCi0gIC8vIHxyZXF1ZXN0ZWRfZnJhbWVzfC4KLSAgLy8KLSAgLy8gSWYgdGhpcyBtZXRob2QgcmV0dXJucyBmZXdlciBmcmFtZXMgdGhhbiB8cmVxdWVzdGVkX2ZyYW1lc3wsIGl0IGNvdWxkCi0gIC8vIGJlIGEgc2lnbiB0aGF0IHRoZSBwaXBlbGluZSBpcyBzdGFsbGVkIG9yIHVuYWJsZSB0byBzdHJlYW0gdGhlIGRhdGEgZmFzdAotICAvLyBlbm91Z2guICBJbiBzdWNoIHNjZW5hcmlvcywgdGhlIGNhbGxlZSBzaG91bGQgemVybyBvdXQgdW51c2VkIHBvcnRpb25zCi0gIC8vIG9mIHRoZWlyIGJ1ZmZlciB0byBwbGF5YmFjayBzaWxlbmNlLgotICAvLwotICAvLyBGaWxsQnVmZmVyKCkgdXBkYXRlcyB0aGUgcGlwZWxpbmUncyBwbGF5YmFjayB0aW1lc3RhbXAuIElmIEZpbGxCdWZmZXIoKSBpcwotICAvLyBub3QgY2FsbGVkIGF0IHRoZSBzYW1lIHJhdGUgYXMgYXVkaW8gc2FtcGxlcyBhcmUgcGxheWVkLCB0aGVuIHRoZSByZXBvcnRlZAotICAvLyB0aW1lc3RhbXAgaW4gdGhlIHBpcGVsaW5lIHdpbGwgYmUgYWhlYWQgb2YgdGhlIGFjdHVhbCBhdWRpbyBwbGF5YmFjay4gSW4KLSAgLy8gdGhpcyBjYXNlIHxwbGF5YmFja19kZWxheXwgc2hvdWxkIGJlIHVzZWQgdG8gaW5kaWNhdGUgd2hlbiBpbiB0aGUgZnV0dXJlCi0gIC8vIHNob3VsZCB0aGUgZmlsbGVkIGJ1ZmZlciBiZSBwbGF5ZWQuCi0gIC8vCi0gIC8vIFNhZmUgdG8gY2FsbCBvbiBhbnkgdGhyZWFkLgotICB1aW50MzIgRmlsbEJ1ZmZlcih1aW50OCogZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgdWludDMyIHJlcXVlc3RlZF9mcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIGludCBhdWRpb19kZWxheV9taWxsaXNlY29uZHMpOwotCi0gIC8vIEVzdGltYXRlIGVhcmxpZXN0IHRpbWUgd2hlbiBjdXJyZW50IGJ1ZmZlciBjYW4gc3RvcCBwbGF5aW5nLgotICB2b2lkIFVwZGF0ZUVhcmxpZXN0RW5kVGltZV9Mb2NrZWQoaW50IGZyYW1lc19maWxsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBwbGF5YmFja19yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhIHBsYXliYWNrX2RlbGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZSB0aW1lX25vdyk7Ci0KLSAgLy8gTWV0aG9kcyBjYWxsZWQgb24gcGlwZWxpbmUgdGhyZWFkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgdm9pZCBEb1BsYXkoKTsKLSAgdm9pZCBEb1BhdXNlKCk7Ci0KLSAgLy8gbWVkaWE6OkF1ZGlvUmVuZGVyZXJTaW5rOjpSZW5kZXJDYWxsYmFjayBpbXBsZW1lbnRhdGlvbi4gIENhbGxlZCBvbiB0aGUKLSAgLy8gQXVkaW9EZXZpY2UgdGhyZWFkLgotICB2aXJ0dWFsIGludCBSZW5kZXIoQXVkaW9CdXMqIGF1ZGlvX2J1cywKLSAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb19kZWxheV9taWxsaXNlY29uZHMpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgT25SZW5kZXJFcnJvcigpIE9WRVJSSURFOwotCi0gIC8vIEhlbHBlciBtZXRob2QgdGhhdCBzY2hlZHVsZXMgYW4gYXN5bmNocm9ub3VzIHJlYWQgZnJvbSB0aGUgZGVjb2RlciBhbmQKLSAgLy8gaW5jcmVtZW50cyB8cGVuZGluZ19yZWFkc198LgotICAvLwotICAvLyBTYWZlIHRvIGNhbGwgZnJvbSBhbnkgdGhyZWFkLgotICB2b2lkIFNjaGVkdWxlUmVhZF9Mb2NrZWQoKTsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlciBpcyBhbGwgYmVmb3JlCi0gIC8vIHxwcmVyb2xsX3RpbWVzdGFtcF98LiBUaGlzIGNhbiBvbmx5IHJldHVybiB0cnVlIHdoaWxlCi0gIC8vIGluIHRoZSBrUHJlcm9sbGluZyBzdGF0ZS4KLSAgYm9vbCBJc0JlZm9yZVByZXJvbGxUaW1lKGNvbnN0IHNjb3BlZF9yZWZwdHI8QnVmZmVyPiYgYnVmZmVyKTsKLQotICAvLyBDYWxsZWQgd2hlbiB8ZGVjb2Rlcl9zZWxlY3Rvcl98IHNlbGVjdGVkIHRoZSB8c2VsZWN0ZWRfZGVjb2RlcnwuCi0gIC8vIHxkZWNyeXB0aW5nX2RlbXV4ZXJfc3RyZWFtfCB3YXMgYWxzbyBwb3B1bGF0ZWQgaWYgYSBEZWNyeXB0aW5nRGVtdXhlclN0cmVhbQotICAvLyBjcmVhdGVkIHRvIGhlbHAgZGVjcnlwdCB0aGUgZW5jcnlwdGVkIHN0cmVhbS4KLSAgLy8gTm90ZTogfGRlY29kZXJfc2VsZWN0b3J8IGlzIHBhc3NlZCBoZXJlIHRvIGtlZXAgdGhlIEF1ZGlvRGVjb2RlclNlbGVjdG9yCi0gIC8vIGFsaXZlIHVudGlsIE9uRGVjb2RlclNlbGVjdGVkKCkgZmluaXNoZXMuCi0gIHZvaWQgT25EZWNvZGVyU2VsZWN0ZWQoCi0gICAgICBzY29wZWRfcHRyPEF1ZGlvRGVjb2RlclNlbGVjdG9yPiBkZWNvZGVyX3NlbGVjdG9yLAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxBdWRpb0RlY29kZXI+JiBzZWxlY3RlZF9kZWNvZGVyLAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNyeXB0aW5nRGVtdXhlclN0cmVhbT4mIGRlY3J5cHRpbmdfZGVtdXhlcl9zdHJlYW0pOwotCi0gIHZvaWQgUmVzZXREZWNvZGVyKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKTsKLQotICBzY29wZWRfcHRyPEF1ZGlvU3BsaWNlcj4gc3BsaWNlcl87Ci0KLSAgLy8gVGhlIHNpbmsgKGRlc3RpbmF0aW9uKSBmb3IgcmVuZGVyZWQgYXVkaW8uICB8c2lua198IG11c3Qgb25seSBiZSBhY2Nlc3NlZAotICAvLyBvbiB0aGUgcGlwZWxpbmUgdGhyZWFkICh2ZXJpZnkgd2l0aCB8cGlwZWxpbmVfdGhyZWFkX2NoZWNrZXJffCkuICB8c2lua198Ci0gIC8vIG11c3QgbmV2ZXIgYmUgY2FsbGVkIHVuZGVyIHxsb2NrX3wgb3IgdGhlIDMtd2F5IHRocmVhZCBicmlkZ2UgYmV0d2VlbiB0aGUKLSAgLy8gYXVkaW8sIHBpcGVsaW5lLCBhbmQgZGVjb2RlciB0aHJlYWRzIG1heSBkZWFkbG9jay4KLSAgc2NvcGVkX3JlZnB0cjxtZWRpYTo6QXVkaW9SZW5kZXJlclNpbms+IHNpbmtfOwotCi0gIFNldERlY3J5cHRvclJlYWR5Q0Igc2V0X2RlY3J5cHRvcl9yZWFkeV9jYl87Ci0KLSAgLy8gVGhlc2UgdHdvIHdpbGwgYmUgc2V0IGJ5IEF1ZGlvRGVjb2RlclNlbGVjdG9yOjpTZWxlY3RBdWRpb0RlY29kZXIoKS4KLSAgc2NvcGVkX3JlZnB0cjxBdWRpb0RlY29kZXI+IGRlY29kZXJfOwotICBzY29wZWRfcmVmcHRyPERlY3J5cHRpbmdEZW11eGVyU3RyZWFtPiBkZWNyeXB0aW5nX2RlbXV4ZXJfc3RyZWFtXzsKLQotICAvLyBFbnN1cmVzIGNlcnRhaW4gbWV0aG9kcyBhcmUgYWx3YXlzIGNhbGxlZCBvbiB0aGUgcGlwZWxpbmUgdGhyZWFkLgotICBiYXNlOjpUaHJlYWRDaGVja2VyIHBpcGVsaW5lX3RocmVhZF9jaGVja2VyXzsKLQotICAvLyBBdWRpb1BhcmFtZXRlcnMgY29uc3RydWN0ZWQgZHVyaW5nIEluaXRpYWxpemUoKSBiYXNlZCBvbiB8ZGVjb2Rlcl98LgotICBBdWRpb1BhcmFtZXRlcnMgYXVkaW9fcGFyYW1ldGVyc187Ci0KLSAgLy8gQ2FsbGJhY2tzIHByb3ZpZGVkIGR1cmluZyBJbml0aWFsaXplKCkuCi0gIFBpcGVsaW5lU3RhdHVzQ0IgaW5pdF9jYl87Ci0gIFN0YXRpc3RpY3NDQiBzdGF0aXN0aWNzX2NiXzsKLSAgYmFzZTo6Q2xvc3VyZSB1bmRlcmZsb3dfY2JfOwotICBUaW1lQ0IgdGltZV9jYl87Ci0gIGJhc2U6OkNsb3N1cmUgZW5kZWRfY2JfOwotICBiYXNlOjpDbG9zdXJlIGRpc2FibGVkX2NiXzsKLSAgUGlwZWxpbmVTdGF0dXNDQiBlcnJvcl9jYl87Ci0KLSAgLy8gQ2FsbGJhY2sgcHJvdmlkZWQgdG8gUGF1c2UoKS4KLSAgYmFzZTo6Q2xvc3VyZSBwYXVzZV9jYl87Ci0KLSAgLy8gQ2FsbGJhY2sgcHJvdmlkZWQgdG8gUHJlcm9sbCgpLgotICBQaXBlbGluZVN0YXR1c0NCIHByZXJvbGxfY2JfOwotCi0gIC8vIEFmdGVyIEluaXRpYWxpemUoKSBoYXMgY29tcGxldGVkLCBhbGwgdmFyaWFibGVzIGJlbG93IG11c3QgYmUgYWNjZXNzZWQKLSAgLy8gdW5kZXIgfGxvY2tffC4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIGJhc2U6OkxvY2sgbG9ja187Ci0KLSAgLy8gQWxnb3JpdGhtIGZvciBzY2FsaW5nIGF1ZGlvLgotICBzY29wZWRfcHRyPEF1ZGlvUmVuZGVyZXJBbGdvcml0aG0+IGFsZ29yaXRobV87Ci0KLSAgLy8gU2ltcGxlIHN0YXRlIHRyYWNraW5nIHZhcmlhYmxlLgotICBlbnVtIFN0YXRlIHsKLSAgICBrVW5pbml0aWFsaXplZCwKLSAgICBrUGF1c2VkLAotICAgIGtQcmVyb2xsaW5nLAotICAgIGtQbGF5aW5nLAotICAgIGtTdG9wcGVkLAotICAgIGtVbmRlcmZsb3csCi0gICAga1JlYnVmZmVyaW5nLAotICB9OwotICBTdGF0ZSBzdGF0ZV87Ci0KLSAgLy8gS2VlcCB0cmFjayBvZiBvdXIgb3V0c3RhbmRpbmcgcmVhZCB0byB8ZGVjb2Rlcl98LgotICBib29sIHBlbmRpbmdfcmVhZF87Ci0KLSAgLy8gS2VlcHMgdHJhY2sgb2Ygd2hldGhlciB3ZSByZWNlaXZlZCBhbmQgcmVuZGVyZWQgdGhlIGVuZCBvZiBzdHJlYW0gYnVmZmVyLgotICBib29sIHJlY2VpdmVkX2VuZF9vZl9zdHJlYW1fOwotICBib29sIHJlbmRlcmVkX2VuZF9vZl9zdHJlYW1fOwotCi0gIC8vIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgZnJhbWUgKGkuZS4gZnVydGhlc3QgaW4gdGhlIGZ1dHVyZSkgYnVmZmVyZWQgYXMKLSAgLy8gd2VsbCBhcyB0aGUgY3VycmVudCB0aW1lIHRoYXQgdGFrZXMgY3VycmVudCBwbGF5YmFjayBkZWxheSBpbnRvIGFjY291bnQuCi0gIGJhc2U6OlRpbWVEZWx0YSBhdWRpb190aW1lX2J1ZmZlcmVkXzsKLSAgYmFzZTo6VGltZURlbHRhIGN1cnJlbnRfdGltZV87Ci0KLSAgYmFzZTo6VGltZURlbHRhIHByZXJvbGxfdGltZXN0YW1wXzsKLQotICAvLyBXZSdyZSBzdXBwb3NlZCB0byBrbm93IGFtb3VudCBvZiBhdWRpbyBkYXRhIE9TIG9yIGhhcmR3YXJlIGJ1ZmZlcmVkLCBidXQKLSAgLy8gdGhhdCBpcyBub3QgYWx3YXlzIHNvIC0tIG9uIG15IExpbnV4IGJveAotICAvLyBBdWRpb0J1ZmZlcnNTdGF0ZTo6aGFyZHdhcmVfZGVsYXlfYnl0ZXMgbmV2ZXIgcmVhY2hlcyAwLgotICAvLwotICAvLyBBcyBhIHJlc3VsdCB3ZSBjYW5ub3QgdXNlIGl0IHRvIGZpbmQgd2hlbiBzdHJlYW0gZW5kcy4gSWYgd2UganVzdCBpZ25vcmUKLSAgLy8gYnVmZmVyZWQgZGF0YSB3ZSB3aWxsIG5vdGlmeSBob3N0IHRoYXQgc3RyZWFtIGVuZGVkIGJlZm9yZSBpdCBpcyBhY3R1YWxseQotICAvLyBkaWQgc28sIEkndmUgc2VlbiBpdCBkb25lIH4xNDBtcyB0b28gZWFybHkgd2hlbiBwbGF5aW5nIH4xNTBtcyBmaWxlLgotICAvLwotICAvLyBJbnN0ZWFkIG9mIHRyeWluZyB0byBpbnZlbnQgT1Mtc3BlY2lmaWMgc29sdXRpb24gZm9yIGVhY2ggYW5kIGV2ZXJ5IE9TIHdlCi0gIC8vIGFyZSBzdXBwb3J0aW5nLCB1c2Ugc2ltcGxlIHdvcmthcm91bmQ6IGV2ZXJ5IHRpbWUgd2UgZmlsbCB0aGUgYnVmZmVyIHdlCi0gIC8vIHJlbWVtYmVyIHdoZW4gaXQgc2hvdWxkIHN0b3AgcGxheWluZywgYW5kIGRvIG5vdCBhc3N1bWUgdGhhdCBidWZmZXIgaXMKLSAgLy8gZW1wdHkgdGlsbCB0aGF0IHRpbWUuIFdvcmthcm91bmQgaXMgbm90IGJ1bGxldHByb29mLCBhcyB3ZSBkb24ndCBleGFjdGx5Ci0gIC8vIGtub3cgd2hlbiB0aGF0IHBhcnRpY3VsYXIgZGF0YSB3b3VsZCBzdGFydCBwbGF5aW5nLCBidXQgaXQgaXMgbXVjaCBiZXR0ZXIKLSAgLy8gdGhhbiBub3RoaW5nLgotICBiYXNlOjpUaW1lIGVhcmxpZXN0X2VuZF90aW1lXzsKLQotICBib29sIHVuZGVyZmxvd19kaXNhYmxlZF87Ci0KLSAgLy8gVHJ1ZSBpZiB0aGUgcmVuZGVyZXIgcmVjZWl2ZXMgYSBidWZmZXIgd2l0aCBrQWJvcnRlZCBzdGF0dXMgZHVyaW5nIHByZXJvbGwsCi0gIC8vIGZhbHNlIG90aGVyd2lzZS4gVGhpcyBmbGFnIGlzIGNsZWFyZWQgb24gdGhlIG5leHQgUHJlcm9sbCgpIGNhbGwuCi0gIGJvb2wgcHJlcm9sbF9hYm9ydGVkXzsKLQotICAvLyBFbmQgdmFyaWFibGVzIHdoaWNoIG11c3QgYmUgYWNjZXNzZWQgdW5kZXIgfGxvY2tffC4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vIFZhcmlhYmxlcyB1c2VkIG9ubHkgb24gdGhlIGF1ZGlvIHRocmVhZC4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIGludCBhY3R1YWxfZnJhbWVzX3Blcl9idWZmZXJfOwotICBzY29wZWRfYXJyYXk8dWludDg+IGF1ZGlvX2J1ZmZlcl87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEF1ZGlvUmVuZGVyZXJJbXBsKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0ZJTFRFUlNfQVVESU9fUkVOREVSRVJfSU1QTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvYXVkaW9fcmVuZGVyZXJfaW1wbF91bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9maWx0ZXJzL2F1ZGlvX3JlbmRlcmVyX2ltcGxfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExN2M2YjAuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvYXVkaW9fcmVuZGVyZXJfaW1wbF91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ5MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFja19oZWxwZXJzLmgiCi0jaW5jbHVkZSAiYmFzZS9ndGVzdF9wcm9kX3V0aWwuaCIKLSNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgotI2luY2x1ZGUgImJhc2Uvc3RsX3V0aWwuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX3RpbWVzdGFtcF9oZWxwZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RhdGFfYnVmZmVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9nbW9ja19jYWxsYmFja19zdXBwb3J0LmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tb2NrX2F1ZGlvX3JlbmRlcmVyX3NpbmsuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21vY2tfZmlsdGVycy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdGVzdF9oZWxwZXJzLmgiCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9hdWRpb19yZW5kZXJlcl9pbXBsLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0KLXVzaW5nIDo6dGVzdGluZzo6XzsKLXVzaW5nIDo6dGVzdGluZzo6QW55TnVtYmVyOwotdXNpbmcgOjp0ZXN0aW5nOjpJbnZva2U7Ci11c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKLXVzaW5nIDo6dGVzdGluZzo6UmV0dXJuUmVmOwotdXNpbmcgOjp0ZXN0aW5nOjpOaWNlTW9jazsKLXVzaW5nIDo6dGVzdGluZzo6U3RyaWN0TW9jazsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gQ29uc3RhbnRzIGZvciBkaXN0aW5ndWlzaGluZyBiZXR3ZWVuIG11dGVkIGF1ZGlvIGFuZCBwbGF5aW5nIGF1ZGlvIHdoZW4gdXNpbmcKLS8vIENvbnN1bWVCdWZmZXJlZERhdGEoKS4KLXN0YXRpYyB1aW50OCBrTXV0ZWRBdWRpbyA9IDB4MDA7Ci1zdGF0aWMgdWludDgga1BsYXlpbmdBdWRpbyA9IDB4OTk7Ci0KLWNsYXNzIEF1ZGlvUmVuZGVyZXJJbXBsVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgLy8gR2l2ZSB0aGUgZGVjb2RlciBzb21lIG5vbi1nYXJiYWdlIG1lZGlhIHByb3BlcnRpZXMuCi0gIEF1ZGlvUmVuZGVyZXJJbXBsVGVzdCgpCi0gICAgICA6IHJlbmRlcmVyXyhuZXcgQXVkaW9SZW5kZXJlckltcGwobmV3IE5pY2VNb2NrPE1vY2tBdWRpb1JlbmRlcmVyU2luaz4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXREZWNyeXB0b3JSZWFkeUNCKCkpKSwKLSAgICAgICAgZGVtdXhlcl9zdHJlYW1fKG5ldyBNb2NrRGVtdXhlclN0cmVhbSgpKSwKLSAgICAgICAgZGVjb2Rlcl8obmV3IE1vY2tBdWRpb0RlY29kZXIoKSksCi0gICAgICAgIGF1ZGlvX2NvbmZpZ18oa0NvZGVjVm9yYmlzLCAxNiwgQ0hBTk5FTF9MQVlPVVRfU1RFUkVPLAotICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLCBOVUxMLCAwLCBmYWxzZSkgewotICAgIEVYUEVDVF9DQUxMKCpkZW11eGVyX3N0cmVhbV8sIHR5cGUoKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybihEZW11eGVyU3RyZWFtOjpBVURJTykpOwotICAgIEVYUEVDVF9DQUxMKCpkZW11eGVyX3N0cmVhbV8sIGF1ZGlvX2RlY29kZXJfY29uZmlnKCkpCi0gICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm5SZWYoYXVkaW9fY29uZmlnXykpOwotCi0gICAgLy8gUXVldWUgYWxsIHJlYWRzIGZyb20gdGhlIGRlY29kZXIgYnkgZGVmYXVsdC4KLSAgICBPTl9DQUxMKCpkZWNvZGVyXywgUmVhZChfKSkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoSW52b2tlKHRoaXMsICZBdWRpb1JlbmRlcmVySW1wbFRlc3Q6OlNhdmVSZWFkQ2FsbGJhY2spKTsKLQotICAgIC8vIFNldCB1cCBhdWRpbyBwcm9wZXJ0aWVzLgotICAgIFNldFN1cHBvcnRlZEF1ZGlvRGVjb2RlclByb3BlcnRpZXMoKTsKLSAgICBFWFBFQ1RfQ0FMTCgqZGVjb2Rlcl8sIGJpdHNfcGVyX2NoYW5uZWwoKSkKLSAgICAgICAgLlRpbWVzKEFueU51bWJlcigpKTsKLSAgICBFWFBFQ1RfQ0FMTCgqZGVjb2Rlcl8sIGNoYW5uZWxfbGF5b3V0KCkpCi0gICAgICAgIC5UaW1lcyhBbnlOdW1iZXIoKSk7Ci0gICAgRVhQRUNUX0NBTEwoKmRlY29kZXJfLCBzYW1wbGVzX3Blcl9zZWNvbmQoKSkKLSAgICAgICAgLlRpbWVzKEFueU51bWJlcigpKTsKLQotICAgIGRlY29kZXJzXy5wdXNoX2JhY2soZGVjb2Rlcl8pOwotICB9Ci0KLSAgdmlydHVhbCB+QXVkaW9SZW5kZXJlckltcGxUZXN0KCkgewotICAgIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci0gICAgcmVuZGVyZXJfLT5TdG9wKE5ld0V4cGVjdGVkQ2xvc3VyZSgpKTsKLSAgfQotCi0gIHZvaWQgU2V0U3VwcG9ydGVkQXVkaW9EZWNvZGVyUHJvcGVydGllcygpIHsKLSAgICBPTl9DQUxMKCpkZWNvZGVyXywgYml0c19wZXJfY2hhbm5lbCgpKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMTYpKTsKLSAgICBPTl9DQUxMKCpkZWNvZGVyXywgY2hhbm5lbF9sYXlvdXQoKSkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKENIQU5ORUxfTEFZT1VUX01PTk8pKTsKLSAgICBPTl9DQUxMKCpkZWNvZGVyXywgc2FtcGxlc19wZXJfc2Vjb25kKCkpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybig0NDEwMCkpOwotICB9Ci0KLSAgdm9pZCBTZXRVbnN1cHBvcnRlZEF1ZGlvRGVjb2RlclByb3BlcnRpZXMoKSB7Ci0gICAgT05fQ0FMTCgqZGVjb2Rlcl8sIGJpdHNfcGVyX2NoYW5uZWwoKSkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKDMpKTsKLSAgICBPTl9DQUxMKCpkZWNvZGVyXywgY2hhbm5lbF9sYXlvdXQoKSkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKENIQU5ORUxfTEFZT1VUX1VOU1VQUE9SVEVEKSk7Ci0gICAgT05fQ0FMTCgqZGVjb2Rlcl8sIHNhbXBsZXNfcGVyX3NlY29uZCgpKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMCkpOwotICB9Ci0KLSAgTU9DS19NRVRIT0QxKE9uUHJlcm9sbENvbXBsZXRlLCB2b2lkKFBpcGVsaW5lU3RhdHVzKSk7Ci0gIFBpcGVsaW5lU3RhdHVzQ0IgTmV3UHJlcm9sbENCKCkgewotICAgIHJldHVybiBiYXNlOjpCaW5kKCZBdWRpb1JlbmRlcmVySW1wbFRlc3Q6Ok9uUHJlcm9sbENvbXBsZXRlLAotICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpOwotICB9Ci0KLSAgTU9DS19NRVRIT0QxKE9uU3RhdGlzdGljcywgdm9pZChjb25zdCBQaXBlbGluZVN0YXRpc3RpY3MmKSk7Ci0gIE1PQ0tfTUVUSE9EMChPblVuZGVyZmxvdywgdm9pZCgpKTsKLSAgTU9DS19NRVRIT0QwKE9uRW5kZWQsIHZvaWQoKSk7Ci0gIE1PQ0tfTUVUSE9EMChPbkRpc2FibGVkLCB2b2lkKCkpOwotICBNT0NLX01FVEhPRDEoT25FcnJvciwgdm9pZChQaXBlbGluZVN0YXR1cykpOwotCi0gIHZvaWQgT25BdWRpb1RpbWVDYWxsYmFjaygKLSAgICAgIGJhc2U6OlRpbWVEZWx0YSBjdXJyZW50X3RpbWUsIGJhc2U6OlRpbWVEZWx0YSBtYXhfdGltZSkgewotICAgIENIRUNLKGN1cnJlbnRfdGltZSA8PSBtYXhfdGltZSk7Ci0gIH0KLQotICB2b2lkIEluaXRpYWxpemUoKSB7Ci0gICAgRVhQRUNUX0NBTEwoKmRlY29kZXJfLCBJbml0aWFsaXplKF8sIF8sIF8pKQotICAgICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MT4oUElQRUxJTkVfT0spKTsKLQotICAgIEluaXRpYWxpemVXaXRoU3RhdHVzKFBJUEVMSU5FX09LKTsKLSAgICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotICAgIGludCBjaGFubmVscyA9IENoYW5uZWxMYXlvdXRUb0NoYW5uZWxDb3VudChkZWNvZGVyXy0+Y2hhbm5lbF9sYXlvdXQoKSk7Ci0gICAgaW50IGJ5dGVzX3Blcl9mcmFtZSA9IGRlY29kZXJfLT5iaXRzX3Blcl9jaGFubmVsKCkgKiBjaGFubmVscyAvIDg7Ci0gICAgbmV4dF90aW1lc3RhbXBfLnJlc2V0KG5ldyBBdWRpb1RpbWVzdGFtcEhlbHBlcigKLSAgICAgICAgYnl0ZXNfcGVyX2ZyYW1lLCBkZWNvZGVyXy0+c2FtcGxlc19wZXJfc2Vjb25kKCkpKTsKLSAgfQotCi0gIHZvaWQgSW5pdGlhbGl6ZVdpdGhTdGF0dXMoUGlwZWxpbmVTdGF0dXMgZXhwZWN0ZWQpIHsKLSAgICByZW5kZXJlcl8tPkluaXRpYWxpemUoCi0gICAgICAgIGRlbXV4ZXJfc3RyZWFtXywKLSAgICAgICAgZGVjb2RlcnNfLAotICAgICAgICBOZXdFeHBlY3RlZFN0YXR1c0NCKGV4cGVjdGVkKSwKLSAgICAgICAgYmFzZTo6QmluZCgmQXVkaW9SZW5kZXJlckltcGxUZXN0OjpPblN0YXRpc3RpY3MsCi0gICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICAgIGJhc2U6OkJpbmQoJkF1ZGlvUmVuZGVyZXJJbXBsVGVzdDo6T25VbmRlcmZsb3csCi0gICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICAgIGJhc2U6OkJpbmQoJkF1ZGlvUmVuZGVyZXJJbXBsVGVzdDo6T25BdWRpb1RpbWVDYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgICAgYmFzZTo6QmluZCgmQXVkaW9SZW5kZXJlckltcGxUZXN0OjpPbkVuZGVkLAotICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAotICAgICAgICBiYXNlOjpCaW5kKCZBdWRpb1JlbmRlcmVySW1wbFRlc3Q6Ok9uRGlzYWJsZWQsCi0gICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICAgIGJhc2U6OkJpbmQoJkF1ZGlvUmVuZGVyZXJJbXBsVGVzdDo6T25FcnJvciwKLSAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gIH0KLQotICB2b2lkIFByZXJvbGwoKSB7Ci0gICAgbmV4dF90aW1lc3RhbXBfLT5TZXRCYXNlVGltZXN0YW1wKGJhc2U6OlRpbWVEZWx0YSgpKTsKLQotICAgIC8vIEZpbGwgZW50aXJlIGJ1ZmZlciB0byBjb21wbGV0ZSBwcmVyb2xsaW5nLgotICAgIEVYUEVDVF9DQUxMKCpkZWNvZGVyXywgUmVhZChfKSk7Ci0gICAgcmVuZGVyZXJfLT5QcmVyb2xsKGJhc2U6OlRpbWVEZWx0YSgpLCBOZXdQcmVyb2xsQ0IoKSk7Ci0gICAgRVhQRUNUX0NBTEwoKnRoaXMsIE9uUHJlcm9sbENvbXBsZXRlKFBJUEVMSU5FX09LKSk7Ci0gICAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLSAgICBEZWxpdmVyUmVtYWluaW5nQXVkaW8oKTsKLSAgfQotCi0gIHZvaWQgUGxheSgpIHsKLSAgICByZW5kZXJlcl8tPlBsYXkoTmV3RXhwZWN0ZWRDbG9zdXJlKCkpOwotICAgIHJlbmRlcmVyXy0+U2V0UGxheWJhY2tSYXRlKDEuMGYpOwotICB9Ci0KLSAgdm9pZCBQcmVyb2xsKGJhc2U6OlRpbWVEZWx0YSBwcmVyb2xsX3RpbWUpIHsKLSAgICBuZXh0X3RpbWVzdGFtcF8tPlNldEJhc2VUaW1lc3RhbXAocHJlcm9sbF90aW1lKTsKLQotICAgIC8vIEZpbGwgZW50aXJlIGJ1ZmZlciB0byBjb21wbGV0ZSBwcmVyb2xsaW5nLgotICAgIEVYUEVDVF9DQUxMKCpkZWNvZGVyXywgUmVhZChfKSk7Ci0gICAgcmVuZGVyZXJfLT5QcmVyb2xsKHByZXJvbGxfdGltZSwgTmV3UHJlcm9sbENCKCkpOwotICAgIEVYUEVDVF9DQUxMKCp0aGlzLCBPblByZXJvbGxDb21wbGV0ZShQSVBFTElORV9PSykpOwotICAgIERlbGl2ZXJSZW1haW5pbmdBdWRpbygpOwotICB9Ci0KLSAgLy8gRGVsaXZlcnMgfHNpemV8IGJ5dGVzIHdpdGggdmFsdWUga1BsYXlpbmdBdWRpbyB0byB8cmVuZGVyZXJffC4KLSAgLy8KLSAgLy8gVGhlcmUgbXVzdCBiZSBhIHBlbmRpbmcgcmVhZCBjYWxsYmFjay4KLSAgdm9pZCBGdWxmaWxsUGVuZGluZ1JlYWQoc2l6ZV90IHNpemUpIHsKLSAgICBDSEVDSyghcmVhZF9jYl8uaXNfbnVsbCgpKTsKLSAgICBzY29wZWRfcmVmcHRyPERhdGFCdWZmZXI+IGJ1ZmZlcihuZXcgRGF0YUJ1ZmZlcihzaXplKSk7Ci0gICAgYnVmZmVyLT5TZXREYXRhU2l6ZShzaXplKTsKLSAgICBtZW1zZXQoYnVmZmVyLT5HZXRXcml0YWJsZURhdGEoKSwga1BsYXlpbmdBdWRpbywgYnVmZmVyLT5HZXREYXRhU2l6ZSgpKTsKLQotICAgIGJ1ZmZlci0+U2V0VGltZXN0YW1wKG5leHRfdGltZXN0YW1wXy0+R2V0VGltZXN0YW1wKCkpOwotICAgIGJ1ZmZlci0+U2V0RHVyYXRpb24obmV4dF90aW1lc3RhbXBfLT5HZXREdXJhdGlvbihidWZmZXItPkdldERhdGFTaXplKCkpKTsKLSAgICBuZXh0X3RpbWVzdGFtcF8tPkFkZEJ5dGVzKGJ1ZmZlci0+R2V0RGF0YVNpemUoKSk7Ci0KLSAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcmVhZF9jYl8pLlJ1bihBdWRpb0RlY29kZXI6OmtPaywgYnVmZmVyKTsKLSAgfQotCi0gIHZvaWQgQWJvcnRQZW5kaW5nUmVhZCgpIHsKLSAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcmVhZF9jYl8pLlJ1bihBdWRpb0RlY29kZXI6OmtBYm9ydGVkLCBOVUxMKTsKLSAgfQotCi0gIC8vIERlbGl2ZXJzIGFuIGVuZCBvZiBzdHJlYW0gYnVmZmVyIHRvIHxyZW5kZXJlcl98LgotICAvLwotICAvLyBUaGVyZSBtdXN0IGJlIGEgcGVuZGluZyByZWFkIGNhbGxiYWNrLgotICB2b2lkIERlbGl2ZXJFbmRPZlN0cmVhbSgpIHsKLSAgICBGdWxmaWxsUGVuZGluZ1JlYWQoMCk7Ci0gIH0KLQotICAvLyBEZWxpdmVycyBieXRlcyB1bnRpbCB8cmVuZGVyZXJffCdzIGludGVybmFsIGJ1ZmZlciBpcyBmdWxsIGFuZCBubyBsb25nZXIKLSAgLy8gaGFzIHBlbmRpbmcgcmVhZHMuCi0gIHZvaWQgRGVsaXZlclJlbWFpbmluZ0F1ZGlvKCkgewotICAgIENIRUNLKCFyZWFkX2NiXy5pc19udWxsKCkpOwotICAgIEZ1bGZpbGxQZW5kaW5nUmVhZChieXRlc19yZW1haW5pbmdfaW5fYnVmZmVyKCkpOwotICAgIENIRUNLKHJlYWRfY2JfLmlzX251bGwoKSk7Ci0gIH0KLQotICAvLyBBdHRlbXB0cyB0byBjb25zdW1lIHxzaXplfCBieXRlcyBmcm9tIHxyZW5kZXJlcl98J3MgaW50ZXJuYWwgYnVmZmVyLAotICAvLyByZXR1cm5pbmcgdHJ1ZSBpZiBhbGwgfHNpemV8IGJ5dGVzIHdlcmUgY29uc3VtZWQsIGZhbHNlIGlmIGxlc3MgdGhhbgotICAvLyB8c2l6ZXwgYnl0ZXMgd2VyZSBjb25zdW1lZC4KLSAgLy8KLSAgLy8gfG11dGVkfCBpcyBvcHRpb25hbCBhbmQgaWYgcGFzc2VkIHdpbGwgZ2V0IHNldCBpZiB0aGUgYnl0ZSB2YWx1ZSBvZgotICAvLyB0aGUgY29uc3VtZWQgZGF0YSBpcyBtdXRlZCBhdWRpby4KLSAgYm9vbCBDb25zdW1lQnVmZmVyZWREYXRhKHVpbnQzMiBzaXplLCBib29sKiBtdXRlZCkgewotICAgIHNjb3BlZF9hcnJheTx1aW50OD4gYnVmZmVyKG5ldyB1aW50OFtzaXplXSk7Ci0gICAgdWludDMyIGJ5dGVzX3Blcl9mcmFtZSA9IChkZWNvZGVyXy0+Yml0c19wZXJfY2hhbm5lbCgpIC8gOCkgKgotICAgICAgICBDaGFubmVsTGF5b3V0VG9DaGFubmVsQ291bnQoZGVjb2Rlcl8tPmNoYW5uZWxfbGF5b3V0KCkpOwotICAgIHVpbnQzMiByZXF1ZXN0ZWRfZnJhbWVzID0gc2l6ZSAvIGJ5dGVzX3Blcl9mcmFtZTsKLSAgICB1aW50MzIgZnJhbWVzX3JlYWQgPSByZW5kZXJlcl8tPkZpbGxCdWZmZXIoCi0gICAgICAgIGJ1ZmZlci5nZXQoKSwgcmVxdWVzdGVkX2ZyYW1lcywgMCk7Ci0KLSAgICBpZiAoZnJhbWVzX3JlYWQgPiAwICYmIG11dGVkKSB7Ci0gICAgICAqbXV0ZWQgPSAoYnVmZmVyWzBdID09IGtNdXRlZEF1ZGlvKTsKLSAgICB9Ci0gICAgcmV0dXJuIChmcmFtZXNfcmVhZCA9PSByZXF1ZXN0ZWRfZnJhbWVzKTsKLSAgfQotCi0gIHVpbnQzMiBieXRlc19idWZmZXJlZCgpIHsKLSAgICByZXR1cm4gcmVuZGVyZXJfLT5hbGdvcml0aG1fLT5ieXRlc19idWZmZXJlZCgpOwotICB9Ci0KLSAgdWludDMyIGJ1ZmZlcl9jYXBhY2l0eSgpIHsKLSAgICByZXR1cm4gcmVuZGVyZXJfLT5hbGdvcml0aG1fLT5RdWV1ZUNhcGFjaXR5KCk7Ci0gIH0KLQotICB1aW50MzIgYnl0ZXNfcmVtYWluaW5nX2luX2J1ZmZlcigpIHsKLSAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgdG9vIG11Y2ggZGF0YSB3YXMgZGVsaXZlcmVkLCBpbiB3aGljaCBjYXNlIHRoZSBidWZmZXIKLSAgICAvLyB3aWxsIGFjY2VwdCB0aGUgZGF0YSBidXQgbm90IGluY3JlYXNlIGNhcGFjaXR5LgotICAgIGlmIChieXRlc19idWZmZXJlZCgpID4gYnVmZmVyX2NhcGFjaXR5KCkpIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gYnVmZmVyX2NhcGFjaXR5KCkgLSBieXRlc19idWZmZXJlZCgpOwotICB9Ci0KLSAgdm9pZCBDYWxsUmVzdW1lQWZ0ZXJVbmRlcmZsb3coKSB7Ci0gICAgcmVuZGVyZXJfLT5SZXN1bWVBZnRlclVuZGVyZmxvdyhmYWxzZSk7Ci0gIH0KLQotICAvLyBGaXh0dXJlIG1lbWJlcnMuCi0gIHNjb3BlZF9yZWZwdHI8QXVkaW9SZW5kZXJlckltcGw+IHJlbmRlcmVyXzsKLSAgc2NvcGVkX3JlZnB0cjxNb2NrRGVtdXhlclN0cmVhbT4gZGVtdXhlcl9zdHJlYW1fOwotICBzY29wZWRfcmVmcHRyPE1vY2tBdWRpb0RlY29kZXI+IGRlY29kZXJfOwotICBBdWRpb1JlbmRlcmVySW1wbDo6QXVkaW9EZWNvZGVyTGlzdCBkZWNvZGVyc187Ci0gIEF1ZGlvRGVjb2Rlcjo6UmVhZENCIHJlYWRfY2JfOwotICBzY29wZWRfcHRyPEF1ZGlvVGltZXN0YW1wSGVscGVyPiBuZXh0X3RpbWVzdGFtcF87Ci0gIEF1ZGlvRGVjb2RlckNvbmZpZyBhdWRpb19jb25maWdfOwotICBNZXNzYWdlTG9vcCBtZXNzYWdlX2xvb3BfOwotCi0gcHJpdmF0ZToKLSAgdm9pZCBTYXZlUmVhZENhbGxiYWNrKGNvbnN0IEF1ZGlvRGVjb2Rlcjo6UmVhZENCJiBjYWxsYmFjaykgewotICAgIENIRUNLKHJlYWRfY2JfLmlzX251bGwoKSkgPDwgIk92ZXJsYXBwaW5nIHJlYWRzIGFyZSBub3QgcGVybWl0dGVkIjsKLSAgICByZWFkX2NiXyA9IGNhbGxiYWNrOwotICB9Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEF1ZGlvUmVuZGVyZXJJbXBsVGVzdCk7Ci19OwotCi1URVNUX0YoQXVkaW9SZW5kZXJlckltcGxUZXN0LCBJbml0aWFsaXplX0ZhaWxlZCkgewotICBFWFBFQ1RfQ0FMTCgqZGVjb2Rlcl8sIEluaXRpYWxpemUoXywgXywgXykpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MT4oUElQRUxJTkVfT0spKTsKLSAgU2V0VW5zdXBwb3J0ZWRBdWRpb0RlY29kZXJQcm9wZXJ0aWVzKCk7Ci0KLSAgSW5pdGlhbGl6ZVdpdGhTdGF0dXMoUElQRUxJTkVfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEKTsKLQotICAvLyBXZSBzaG91bGQgaGF2ZSBubyByZWFkcy4KLSAgRVhQRUNUX1RSVUUocmVhZF9jYl8uaXNfbnVsbCgpKTsKLX0KLQotVEVTVF9GKEF1ZGlvUmVuZGVyZXJJbXBsVGVzdCwgSW5pdGlhbGl6ZV9TdWNjZXNzZnVsKSB7Ci0gIEluaXRpYWxpemUoKTsKLQotICAvLyBXZSBzaG91bGQgaGF2ZSBubyByZWFkcy4KLSAgRVhQRUNUX1RSVUUocmVhZF9jYl8uaXNfbnVsbCgpKTsKLX0KLQotVEVTVF9GKEF1ZGlvUmVuZGVyZXJJbXBsVGVzdCwgSW5pdGlhbGl6ZV9EZWNvZGVySW5pdEZhaWx1cmUpIHsKLSAgRVhQRUNUX0NBTEwoKmRlY29kZXJfLCBJbml0aWFsaXplKF8sIF8sIF8pKQotICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrPDE+KERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCkpOwotICBJbml0aWFsaXplV2l0aFN0YXR1cyhERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQpOwotCi0gIC8vIFdlIHNob3VsZCBoYXZlIG5vIHJlYWRzLgotICBFWFBFQ1RfVFJVRShyZWFkX2NiXy5pc19udWxsKCkpOwotfQotCi1URVNUX0YoQXVkaW9SZW5kZXJlckltcGxUZXN0LCBJbml0aWFsaXplX011bHRpcGxlRGVjb2RlcnMpIHsKLSAgc2NvcGVkX3JlZnB0cjxNb2NrQXVkaW9EZWNvZGVyPiBkZWNvZGVyMSA9IG5ldyBNb2NrQXVkaW9EZWNvZGVyKCk7Ci0gIC8vIEluc2VydCB8ZGVjb2RlcjF8IGFzIHRoZSBmaXJzdCBkZWNvZGVyIGluIHRoZSBsaXN0LgotICBkZWNvZGVyc18ucHVzaF9mcm9udChkZWNvZGVyMSk7Ci0gIEVYUEVDVF9DQUxMKCpkZWNvZGVyMSwgSW5pdGlhbGl6ZShfLCBfLCBfKSkKLSAgICAgIC5XaWxsT25jZShSdW5DYWxsYmFjazwxPihERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQpKTsKLSAgRVhQRUNUX0NBTEwoKmRlY29kZXJfLCBJbml0aWFsaXplKF8sIF8sIF8pKQotICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrPDE+KFBJUEVMSU5FX09LKSk7Ci0gIEluaXRpYWxpemVXaXRoU3RhdHVzKFBJUEVMSU5FX09LKTsKLQotICAvLyBXZSBzaG91bGQgaGF2ZSBubyByZWFkcy4KLSAgRVhQRUNUX1RSVUUocmVhZF9jYl8uaXNfbnVsbCgpKTsKLX0KLQotVEVTVF9GKEF1ZGlvUmVuZGVyZXJJbXBsVGVzdCwgUHJlcm9sbCkgewotICBJbml0aWFsaXplKCk7Ci0gIFByZXJvbGwoKTsKLX0KLQotVEVTVF9GKEF1ZGlvUmVuZGVyZXJJbXBsVGVzdCwgUGxheSkgewotICBJbml0aWFsaXplKCk7Ci0gIFByZXJvbGwoKTsKLSAgUGxheSgpOwotCi0gIC8vIERyYWluIGludGVybmFsIGJ1ZmZlciwgd2Ugc2hvdWxkIGhhdmUgYSBwZW5kaW5nIHJlYWQuCi0gIEVYUEVDVF9DQUxMKCpkZWNvZGVyXywgUmVhZChfKSk7Ci0gIEVYUEVDVF9UUlVFKENvbnN1bWVCdWZmZXJlZERhdGEoYnl0ZXNfYnVmZmVyZWQoKSwgTlVMTCkpOwotfQotCi1URVNUX0YoQXVkaW9SZW5kZXJlckltcGxUZXN0LCBFbmRPZlN0cmVhbSkgewotICBJbml0aWFsaXplKCk7Ci0gIFByZXJvbGwoKTsKLSAgUGxheSgpOwotCi0gIC8vIERyYWluIGludGVybmFsIGJ1ZmZlciwgd2Ugc2hvdWxkIGhhdmUgYSBwZW5kaW5nIHJlYWQuCi0gIGludCBhdWRpb19ieXRlc19maWxsZWQgPSBieXRlc19idWZmZXJlZCgpOwotICBFWFBFQ1RfQ0FMTCgqZGVjb2Rlcl8sIFJlYWQoXykpOwotICBFWFBFQ1RfVFJVRShDb25zdW1lQnVmZmVyZWREYXRhKGF1ZGlvX2J5dGVzX2ZpbGxlZCwgTlVMTCkpOwotCi0gIC8vIENoZWNrIGFuZCBjbGVhciB8ZWFybGllc3RfZW5kX3RpbWVffCBzbyB0aGUgZW5kZWQgZXZlbnQgZmlyZXMgb24gdGhlIG5leHQKLSAgLy8gQ29uc3VtZUJ1ZmZlcmVkRGF0YSgpIGNhbGwuCi0gIGJhc2U6OlRpbWVEZWx0YSBhdWRpb19wbGF5X3RpbWUgPSBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWNyb3NlY29uZHMoCi0gICAgICBhdWRpb19ieXRlc19maWxsZWQgKiBiYXNlOjpUaW1lOjprTWljcm9zZWNvbmRzUGVyU2Vjb25kIC8KLSAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihyZW5kZXJlcl8tPmF1ZGlvX3BhcmFtZXRlcnNfLkdldEJ5dGVzUGVyU2Vjb25kKCkpKTsKLSAgYmFzZTo6VGltZURlbHRhIHRpbWVfdW50aWxfZW5kZWQgPQotICAgICAgcmVuZGVyZXJfLT5lYXJsaWVzdF9lbmRfdGltZV8gLSBiYXNlOjpUaW1lOjpOb3coKTsKLSAgRVhQRUNUX1RSVUUodGltZV91bnRpbF9lbmRlZCA+IGJhc2U6OlRpbWVEZWx0YSgpKTsKLSAgRVhQRUNUX1RSVUUodGltZV91bnRpbF9lbmRlZCA8PSBhdWRpb19wbGF5X3RpbWUpOwotICByZW5kZXJlcl8tPmVhcmxpZXN0X2VuZF90aW1lXyA9IGJhc2U6OlRpbWUoKTsKLQotICAvLyBGdWxmaWxsIHRoZSByZWFkIHdpdGggYW4gZW5kLW9mLXN0cmVhbSBwYWNrZXQsIHdlIHNob3VsZG4ndCByZXBvcnQgZW5kZWQKLSAgLy8gbm9yIGhhdmUgYSByZWFkIHVudGlsIHdlIGRyYWluIHRoZSBpbnRlcm5hbCBidWZmZXIuCi0gIERlbGl2ZXJFbmRPZlN0cmVhbSgpOwotCi0gIC8vIERyYWluIGludGVybmFsIGJ1ZmZlciwgbm93IHdlIHNob3VsZCByZXBvcnQgZW5kZWQuCi0gIEVYUEVDVF9DQUxMKCp0aGlzLCBPbkVuZGVkKCkpOwotICBFWFBFQ1RfVFJVRShDb25zdW1lQnVmZmVyZWREYXRhKGJ5dGVzX2J1ZmZlcmVkKCksIE5VTEwpKTsKLX0KLQotVEVTVF9GKEF1ZGlvUmVuZGVyZXJJbXBsVGVzdCwgVW5kZXJmbG93KSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgUHJlcm9sbCgpOwotICBQbGF5KCk7Ci0KLSAgLy8gRHJhaW4gaW50ZXJuYWwgYnVmZmVyLCB3ZSBzaG91bGQgaGF2ZSBhIHBlbmRpbmcgcmVhZC4KLSAgRVhQRUNUX0NBTEwoKmRlY29kZXJfLCBSZWFkKF8pKTsKLSAgRVhQRUNUX1RSVUUoQ29uc3VtZUJ1ZmZlcmVkRGF0YShieXRlc19idWZmZXJlZCgpLCBOVUxMKSk7Ci0KLSAgLy8gVmVyaWZ5IHRoZSBuZXh0IEZpbGxCdWZmZXIoKSBjYWxsIHRyaWdnZXJzIHRoZSB1bmRlcmZsb3cgY2FsbGJhY2sKLSAgLy8gc2luY2UgdGhlIGRlY29kZXIgaGFzbid0IGRlbGl2ZXJlZCBhbnkgZGF0YSBhZnRlciBpdCB3YXMgZHJhaW5lZC4KLSAgY29uc3Qgc2l6ZV90IGtEYXRhU2l6ZSA9IDEwMjQ7Ci0gIEVYUEVDVF9DQUxMKCp0aGlzLCBPblVuZGVyZmxvdygpKTsKLSAgRVhQRUNUX0ZBTFNFKENvbnN1bWVCdWZmZXJlZERhdGEoa0RhdGFTaXplLCBOVUxMKSk7Ci0KLSAgcmVuZGVyZXJfLT5SZXN1bWVBZnRlclVuZGVyZmxvdyhmYWxzZSk7Ci0KLSAgLy8gVmVyaWZ5IGFmdGVyIHJlc3VtaW5nIHRoYXQgd2UncmUgc3RpbGwgbm90IGdldHRpbmcgZGF0YS4KLSAgLy8KLSAgLy8gTk9URTogRmlsbEJ1ZmZlcigpIHNhdGlzZmllcyB0aGUgcmVhZCBidXQgcmV0dXJucyBtdXRlZCBhdWRpbywgd2hpY2gKLSAgLy8gaXMgY3JhenkgaHR0cDovL2NyYnVnLmNvbS8xMDY2MDAKLSAgYm9vbCBtdXRlZCA9IGZhbHNlOwotICBFWFBFQ1RfRVEoMHUsIGJ5dGVzX2J1ZmZlcmVkKCkpOwotICBFWFBFQ1RfVFJVRShDb25zdW1lQnVmZmVyZWREYXRhKGtEYXRhU2l6ZSwgJm11dGVkKSk7Ci0gIEVYUEVDVF9UUlVFKG11dGVkKTsKLQotICAvLyBEZWxpdmVyIGRhdGEsIHdlIHNob3VsZCBnZXQgbm9uLW11dGVkIGF1ZGlvLgotICBEZWxpdmVyUmVtYWluaW5nQXVkaW8oKTsKLSAgRVhQRUNUX0NBTEwoKmRlY29kZXJfLCBSZWFkKF8pKTsKLSAgRVhQRUNUX1RSVUUoQ29uc3VtZUJ1ZmZlcmVkRGF0YShrRGF0YVNpemUsICZtdXRlZCkpOwotICBFWFBFQ1RfRkFMU0UobXV0ZWQpOwotfQotCi1URVNUX0YoQXVkaW9SZW5kZXJlckltcGxUZXN0LCBVbmRlcmZsb3dfRW5kT2ZTdHJlYW0pIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBQcmVyb2xsKCk7Ci0gIFBsYXkoKTsKLQotICAvLyBEcmFpbiBpbnRlcm5hbCBidWZmZXIsIHdlIHNob3VsZCBoYXZlIGEgcGVuZGluZyByZWFkLgotICBFWFBFQ1RfQ0FMTCgqZGVjb2Rlcl8sIFJlYWQoXykpOwotICBFWFBFQ1RfVFJVRShDb25zdW1lQnVmZmVyZWREYXRhKGJ5dGVzX2J1ZmZlcmVkKCksIE5VTEwpKTsKLQotICAvLyBWZXJpZnkgdGhlIG5leHQgRmlsbEJ1ZmZlcigpIGNhbGwgdHJpZ2dlcnMgdGhlIHVuZGVyZmxvdyBjYWxsYmFjawotICAvLyBzaW5jZSB0aGUgZGVjb2RlciBoYXNuJ3QgZGVsaXZlcmVkIGFueSBkYXRhIGFmdGVyIGl0IHdhcyBkcmFpbmVkLgotICBjb25zdCBzaXplX3Qga0RhdGFTaXplID0gMTAyNDsKLSAgRVhQRUNUX0NBTEwoKnRoaXMsIE9uVW5kZXJmbG93KCkpOwotICBFWFBFQ1RfRkFMU0UoQ29uc3VtZUJ1ZmZlcmVkRGF0YShrRGF0YVNpemUsIE5VTEwpKTsKLQotICAvLyBEZWxpdmVyIGEgbGl0dGxlIGJpdCBvZiBkYXRhLgotICBFWFBFQ1RfQ0FMTCgqZGVjb2Rlcl8sIFJlYWQoXykpOwotICBGdWxmaWxsUGVuZGluZ1JlYWQoa0RhdGFTaXplKTsKLQotICAvLyBWZXJpZnkgd2UncmUgZ2V0dGluZyBtdXRlZCBhdWRpbyBkdXJpbmcgdW5kZXJmbG93LgotICAvLwotICAvLyBOT1RFOiBGaWxsQnVmZmVyKCkgc2F0aXNmaWVzIHRoZSByZWFkIGJ1dCByZXR1cm5zIG11dGVkIGF1ZGlvLCB3aGljaAotICAvLyBpcyBjcmF6eSBodHRwOi8vY3JidWcuY29tLzEwNjYwMAotICBib29sIG11dGVkID0gZmFsc2U7Ci0gIEVYUEVDVF9FUShrRGF0YVNpemUsIGJ5dGVzX2J1ZmZlcmVkKCkpOwotICBFWFBFQ1RfVFJVRShDb25zdW1lQnVmZmVyZWREYXRhKGtEYXRhU2l6ZSwgJm11dGVkKSk7Ci0gIEVYUEVDVF9UUlVFKG11dGVkKTsKLQotICAvLyBOb3cgZGVsaXZlciBlbmQgb2Ygc3RyZWFtLCB3ZSBzaG91bGQgZ2V0IG91ciBsaXR0bGUgYml0IG9mIGRhdGEgYmFjay4KLSAgRGVsaXZlckVuZE9mU3RyZWFtKCk7Ci0gIEVYUEVDVF9DQUxMKCpkZWNvZGVyXywgUmVhZChfKSk7Ci0gIEVYUEVDVF9FUShrRGF0YVNpemUsIGJ5dGVzX2J1ZmZlcmVkKCkpOwotICBFWFBFQ1RfVFJVRShDb25zdW1lQnVmZmVyZWREYXRhKGtEYXRhU2l6ZSwgJm11dGVkKSk7Ci0gIEVYUEVDVF9GQUxTRShtdXRlZCk7Ci0KLSAgLy8gRGVsaXZlciBhbm90aGVyIGVuZCBvZiBzdHJlYW0gYnVmZmVyIGFuZCBhdHRlbXB0IHRvIHJlYWQgdG8gbWFrZSBzdXJlCi0gIC8vIHdlJ3JlIHRydWx5IGF0IHRoZSBlbmQgb2Ygc3RyZWFtLgotICAvLwotICAvLyBUT0RPKHNjaGVya3VzKTogZml4IEF1ZGlvUmVuZGVyZXJJbXBsIGFuZCBBdWRpb1JlbmRlcmVyQWxnb3JpdGhtQmFzZSB0bwotICAvLyBzdG9wIHJlYWRpbmcgYWZ0ZXIgcmVjZWl2aW5nIGFuIGVuZCBvZiBzdHJlYW0gYnVmZmVyLiBJdCBzaG91bGQgaGF2ZSBhbHNvCi0gIC8vIGZpcmVkIHRoZSBlbmRlZCBjYWxsYmFjayBodHRwOi8vY3JidWcuY29tLzEwNjY0MQotICBEZWxpdmVyRW5kT2ZTdHJlYW0oKTsKLSAgRVhQRUNUX0NBTEwoKnRoaXMsIE9uRW5kZWQoKSk7Ci0KLSAgLy8gQ2xlYXIgfGVhcmxpZXN0X2VuZF90aW1lX3wgc28gZW5kZWQgZmlyZXMgb24gdGhlIG5leHQgQ29uc3VtZUJ1ZmZlcmVkRGF0YSgpCi0gIC8vIGNhbGwuCi0gIHJlbmRlcmVyXy0+ZWFybGllc3RfZW5kX3RpbWVfID0gYmFzZTo6VGltZSgpOwotCi0gIEVYUEVDVF9GQUxTRShDb25zdW1lQnVmZmVyZWREYXRhKGtEYXRhU2l6ZSwgJm11dGVkKSk7Ci0gIEVYUEVDVF9GQUxTRShtdXRlZCk7Ci19Ci0KLVRFU1RfRihBdWRpb1JlbmRlcmVySW1wbFRlc3QsIFVuZGVyZmxvd19SZXN1bWVGcm9tQ2FsbGJhY2spIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBQcmVyb2xsKCk7Ci0gIFBsYXkoKTsKLQotICAvLyBEcmFpbiBpbnRlcm5hbCBidWZmZXIsIHdlIHNob3VsZCBoYXZlIGEgcGVuZGluZyByZWFkLgotICBFWFBFQ1RfQ0FMTCgqZGVjb2Rlcl8sIFJlYWQoXykpOwotICBFWFBFQ1RfVFJVRShDb25zdW1lQnVmZmVyZWREYXRhKGJ5dGVzX2J1ZmZlcmVkKCksIE5VTEwpKTsKLQotICAvLyBWZXJpZnkgdGhlIG5leHQgRmlsbEJ1ZmZlcigpIGNhbGwgdHJpZ2dlcnMgdGhlIHVuZGVyZmxvdyBjYWxsYmFjawotICAvLyBzaW5jZSB0aGUgZGVjb2RlciBoYXNuJ3QgZGVsaXZlcmVkIGFueSBkYXRhIGFmdGVyIGl0IHdhcyBkcmFpbmVkLgotICBjb25zdCBzaXplX3Qga0RhdGFTaXplID0gMTAyNDsKLSAgRVhQRUNUX0NBTEwoKnRoaXMsIE9uVW5kZXJmbG93KCkpCi0gICAgICAuV2lsbE9uY2UoSW52b2tlKHRoaXMsICZBdWRpb1JlbmRlcmVySW1wbFRlc3Q6OkNhbGxSZXN1bWVBZnRlclVuZGVyZmxvdykpOwotICBFWFBFQ1RfRkFMU0UoQ29uc3VtZUJ1ZmZlcmVkRGF0YShrRGF0YVNpemUsIE5VTEwpKTsKLQotICAvLyBWZXJpZnkgYWZ0ZXIgcmVzdW1pbmcgdGhhdCB3ZSdyZSBzdGlsbCBub3QgZ2V0dGluZyBkYXRhLgotICBib29sIG11dGVkID0gZmFsc2U7Ci0gIEVYUEVDVF9FUSgwdSwgYnl0ZXNfYnVmZmVyZWQoKSk7Ci0gIEVYUEVDVF9UUlVFKENvbnN1bWVCdWZmZXJlZERhdGEoa0RhdGFTaXplLCAmbXV0ZWQpKTsKLSAgRVhQRUNUX1RSVUUobXV0ZWQpOwotCi0gIC8vIERlbGl2ZXIgZGF0YSwgd2Ugc2hvdWxkIGdldCBub24tbXV0ZWQgYXVkaW8uCi0gIERlbGl2ZXJSZW1haW5pbmdBdWRpbygpOwotICBFWFBFQ1RfQ0FMTCgqZGVjb2Rlcl8sIFJlYWQoXykpOwotICBFWFBFQ1RfVFJVRShDb25zdW1lQnVmZmVyZWREYXRhKGtEYXRhU2l6ZSwgJm11dGVkKSk7Ci0gIEVYUEVDVF9GQUxTRShtdXRlZCk7Ci19Ci0KLVRFU1RfRihBdWRpb1JlbmRlcmVySW1wbFRlc3QsIEFib3J0UGVuZGluZ1JlYWRfUHJlcm9sbCkgewotICBJbml0aWFsaXplKCk7Ci0KLSAgLy8gU3RhcnQgcHJlcm9sbGluZy4KLSAgRVhQRUNUX0NBTEwoKmRlY29kZXJfLCBSZWFkKF8pKTsKLSAgcmVuZGVyZXJfLT5QcmVyb2xsKGJhc2U6OlRpbWVEZWx0YSgpLCBOZXdQcmVyb2xsQ0IoKSk7Ci0KLSAgLy8gU2ltdWxhdGUgdGhlIGRlY29kZXIgYWJvcnRpbmcgdGhlIHBlbmRpbmcgcmVhZC4KLSAgRVhQRUNUX0NBTEwoKnRoaXMsIE9uUHJlcm9sbENvbXBsZXRlKFBJUEVMSU5FX09LKSk7Ci0gIEFib3J0UGVuZGluZ1JlYWQoKTsKLQotICAvLyBQcmVyb2xsIGFnYWluIHRvIHZlcmlmeSBpdCBjb21wbGV0ZWQgbm9ybWFsbHkuCi0gIFByZXJvbGwoYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcygxKSk7Ci0KLSAgQVNTRVJUX1RSVUUocmVhZF9jYl8uaXNfbnVsbCgpKTsKLX0KLQotVEVTVF9GKEF1ZGlvUmVuZGVyZXJJbXBsVGVzdCwgQWJvcnRQZW5kaW5nUmVhZF9QYXVzZSkgewotICBJbml0aWFsaXplKCk7Ci0KLSAgUHJlcm9sbCgpOwotICBQbGF5KCk7Ci0KLSAgLy8gUGFydGlhbGx5IGRyYWluIGludGVybmFsIGJ1ZmZlciBzbyB3ZSBnZXQgYSBwZW5kaW5nIHJlYWQuCi0gIEVYUEVDVF9DQUxMKCpkZWNvZGVyXywgUmVhZChfKSk7Ci0gIEVYUEVDVF9UUlVFKENvbnN1bWVCdWZmZXJlZERhdGEoYnl0ZXNfYnVmZmVyZWQoKSAvIDIsIE5VTEwpKTsKLQotICByZW5kZXJlcl8tPlBhdXNlKE5ld0V4cGVjdGVkQ2xvc3VyZSgpKTsKLQotICBBYm9ydFBlbmRpbmdSZWFkKCk7Ci0KLSAgUHJlcm9sbChiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKDEpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9ibG9ja2luZ191cmxfcHJvdG9jb2wuY2MgYi9zcmMvbWVkaWEvZmlsdGVycy9ibG9ja2luZ191cmxfcHJvdG9jb2wuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYjdlOTYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvYmxvY2tpbmdfdXJsX3Byb3RvY29sLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvYmxvY2tpbmdfdXJsX3Byb3RvY29sLmgiCi0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RhdGFfc291cmNlLmgiCi0jaW5jbHVkZSAibWVkaWEvZmZtcGVnL2ZmbXBlZ19jb21tb24uaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotQmxvY2tpbmdVcmxQcm90b2NvbDo6QmxvY2tpbmdVcmxQcm90b2NvbCgKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPERhdGFTb3VyY2U+JiBkYXRhX3NvdXJjZSwKLSAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiBlcnJvcl9jYikKLSAgICA6IGRhdGFfc291cmNlXyhkYXRhX3NvdXJjZSksCi0gICAgICBlcnJvcl9jYl8oZXJyb3JfY2IpLAotICAgICAgYWJvcnRlZF8odHJ1ZSwgZmFsc2UpLCAgLy8gV2UgbmV2ZXIgd2FudCB0byByZXNldCB8YWJvcnRlZF98LgotICAgICAgcmVhZF9jb21wbGV0ZV8oZmFsc2UsIGZhbHNlKSwKLSAgICAgIGxhc3RfcmVhZF9ieXRlc18oMCksCi0gICAgICByZWFkX3Bvc2l0aW9uXygwKSB7Ci19Ci0KLUJsb2NraW5nVXJsUHJvdG9jb2w6On5CbG9ja2luZ1VybFByb3RvY29sKCkge30KLQotdm9pZCBCbG9ja2luZ1VybFByb3RvY29sOjpBYm9ydCgpIHsKLSAgYWJvcnRlZF8uU2lnbmFsKCk7Ci19Ci0KLWludCBCbG9ja2luZ1VybFByb3RvY29sOjpSZWFkKGludCBzaXplLCB1aW50OCogZGF0YSkgewotICAvLyBSZWFkIGVycm9ycyBhcmUgdW5yZWNvdmVyYWJsZS4KLSAgaWYgKGFib3J0ZWRfLklzU2lnbmFsZWQoKSkKLSAgICByZXR1cm4gQVZFUlJPUihFSU8pOwotCi0gIC8vIEV2ZW4gdGhvdWdoIEZGbXBlZyBkZWZpbmVzIEFWRVJST1JfRU9GLCBpdCdzIG5vdCB0byBiZSB1c2VkIHdpdGggSS9PCi0gIC8vIHJvdXRpbmVzLiBJbnN0ZWFkIHJldHVybiAwIGZvciBhbnkgcmVhZCBhdCBvciBwYXN0IEVPRi4KLSAgaW50NjQgZmlsZV9zaXplOwotICBpZiAoZGF0YV9zb3VyY2VfLT5HZXRTaXplKCZmaWxlX3NpemUpICYmIHJlYWRfcG9zaXRpb25fID49IGZpbGVfc2l6ZSkKLSAgICByZXR1cm4gMDsKLQotICAvLyBCbG9ja2luZyByZWFkIGZyb20gZGF0YSBzb3VyY2UgdW50aWwgZWl0aGVyOgotICAvLyAgIDEpIHxsYXN0X3JlYWRfYnl0ZXNffCBpcyBzZXQgYW5kIHxyZWFkX2NvbXBsZXRlX3wgaXMgc2lnbmFsbGVkCi0gIC8vICAgMikgfGFib3J0ZWRffCBpcyBzaWduYWxsZWQKLSAgZGF0YV9zb3VyY2VfLT5SZWFkKHJlYWRfcG9zaXRpb25fLCBzaXplLCBkYXRhLCBiYXNlOjpCaW5kKAotICAgICAgJkJsb2NraW5nVXJsUHJvdG9jb2w6OlNpZ25hbFJlYWRDb21wbGV0ZWQsIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLQotICBiYXNlOjpXYWl0YWJsZUV2ZW50KiBldmVudHNbXSA9IHsgJmFib3J0ZWRfLCAmcmVhZF9jb21wbGV0ZV8gfTsKLSAgc2l6ZV90IGluZGV4ID0gYmFzZTo6V2FpdGFibGVFdmVudDo6V2FpdE1hbnkoZXZlbnRzLCBhcnJheXNpemUoZXZlbnRzKSk7Ci0KLSAgaWYgKGV2ZW50c1tpbmRleF0gPT0gJmFib3J0ZWRfKQotICAgIHJldHVybiBBVkVSUk9SKEVJTyk7Ci0KLSAgaWYgKGxhc3RfcmVhZF9ieXRlc18gPT0gRGF0YVNvdXJjZTo6a1JlYWRFcnJvcikgewotICAgIGFib3J0ZWRfLlNpZ25hbCgpOwotICAgIGVycm9yX2NiXy5SdW4oKTsKLSAgICByZXR1cm4gQVZFUlJPUihFSU8pOwotICB9Ci0KLSAgcmVhZF9wb3NpdGlvbl8gKz0gbGFzdF9yZWFkX2J5dGVzXzsKLSAgcmV0dXJuIGxhc3RfcmVhZF9ieXRlc187Ci19Ci0KLWJvb2wgQmxvY2tpbmdVcmxQcm90b2NvbDo6R2V0UG9zaXRpb24oaW50NjQqIHBvc2l0aW9uX291dCkgewotICAqcG9zaXRpb25fb3V0ID0gcmVhZF9wb3NpdGlvbl87Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEJsb2NraW5nVXJsUHJvdG9jb2w6OlNldFBvc2l0aW9uKGludDY0IHBvc2l0aW9uKSB7Ci0gIGludDY0IGZpbGVfc2l6ZTsKLSAgaWYgKChkYXRhX3NvdXJjZV8tPkdldFNpemUoJmZpbGVfc2l6ZSkgJiYgcG9zaXRpb24gPj0gZmlsZV9zaXplKSB8fAotICAgICAgcG9zaXRpb24gPCAwKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmVhZF9wb3NpdGlvbl8gPSBwb3NpdGlvbjsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQmxvY2tpbmdVcmxQcm90b2NvbDo6R2V0U2l6ZShpbnQ2NCogc2l6ZV9vdXQpIHsKLSAgcmV0dXJuIGRhdGFfc291cmNlXy0+R2V0U2l6ZShzaXplX291dCk7Ci19Ci0KLWJvb2wgQmxvY2tpbmdVcmxQcm90b2NvbDo6SXNTdHJlYW1pbmcoKSB7Ci0gIHJldHVybiBkYXRhX3NvdXJjZV8tPklzU3RyZWFtaW5nKCk7Ci19Ci0KLXZvaWQgQmxvY2tpbmdVcmxQcm90b2NvbDo6U2lnbmFsUmVhZENvbXBsZXRlZChpbnQgc2l6ZSkgewotICBsYXN0X3JlYWRfYnl0ZXNfID0gc2l6ZTsKLSAgcmVhZF9jb21wbGV0ZV8uU2lnbmFsKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvYmxvY2tpbmdfdXJsX3Byb3RvY29sLmggYi9zcmMvbWVkaWEvZmlsdGVycy9ibG9ja2luZ191cmxfcHJvdG9jb2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGViOGViYy4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9ibG9ja2luZ191cmxfcHJvdG9jb2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfRklMVEVSU19CTE9DS0lOR19VUkxfUFJPVE9DT0xfSF8KLSNkZWZpbmUgTUVESUFfRklMVEVSU19CTE9DS0lOR19VUkxfUFJPVE9DT0xfSF8KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKLSNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi93YWl0YWJsZV9ldmVudC5oIgotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvZmZtcGVnX2dsdWUuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgRGF0YVNvdXJjZTsKLQotLy8gQW4gaW1wbGVtZW50YXRpb24gb2YgRkZtcGVnVVJMUHJvdG9jb2wgdGhhdCBibG9ja3MgdW50aWwgdGhlIHVuZGVybHlpbmcKLS8vIGFzeW5jaHJvbm91cyBEYXRhU291cmNlOjpSZWFkKCkgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLWNsYXNzIE1FRElBX0VYUE9SVCBCbG9ja2luZ1VybFByb3RvY29sIDogcHVibGljIEZGbXBlZ1VSTFByb3RvY29sIHsKLSBwdWJsaWM6Ci0gIC8vIEltcGxlbWVudHMgRkZtcGVnVVJMUHJvdG9jb2wgdXNpbmcgdGhlIGdpdmVuIHxkYXRhX3NvdXJjZXwuIHxlcnJvcl9jYnwgaXMKLSAgLy8gZmlyZWQgYW55IHRpbWUgRGF0YVNvdXJjZTo6UmVhZCgpIHJldHVybnMgYW4gZXJyb3IuCi0gIC8vCi0gIC8vIFRPRE8oc2NoZXJrdXMpOiBBZnRlciBhbGwgYmxvY2tpbmcgb3BlcmF0aW9ucyBhcmUgaXNvbGF0ZWQgb24gYSBzZXBhcmF0ZQotICAvLyB0aHJlYWQgd2Ugc2hvdWxkIGJlIGFibGUgdG8gZWxpbWluYXRlIHxlcnJvcl9jYnwuCi0gIEJsb2NraW5nVXJsUHJvdG9jb2woY29uc3Qgc2NvcGVkX3JlZnB0cjxEYXRhU291cmNlPiYgZGF0YV9zb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6Q2xvc3VyZSYgZXJyb3JfY2IpOwotICB2aXJ0dWFsIH5CbG9ja2luZ1VybFByb3RvY29sKCk7Ci0KLSAgLy8gQWJvcnRzIGFueSBwZW5kaW5nIHJlYWRzIGJ5IHJldHVybmluZyBhIHJlYWQgZXJyb3IuIEFmdGVyIHRoaXMgbWV0aG9kCi0gIC8vIHJldHVybnMgYWxsIHN1YnNlcXVlbnQgY2FsbHMgdG8gUmVhZCgpIHdpbGwgaW1tZWRpYXRlbHkgZmFpbC4KLSAgdm9pZCBBYm9ydCgpOwotCi0gIC8vIEZGbXBlZ1VSTFByb3RvY29sIGltcGxlbWVudGF0aW9uLgotICB2aXJ0dWFsIGludCBSZWFkKGludCBzaXplLCB1aW50OCogZGF0YSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgYm9vbCBHZXRQb3NpdGlvbihpbnQ2NCogcG9zaXRpb25fb3V0KSBPVkVSUklERTsKLSAgdmlydHVhbCBib29sIFNldFBvc2l0aW9uKGludDY0IHBvc2l0aW9uKSBPVkVSUklERTsKLSAgdmlydHVhbCBib29sIEdldFNpemUoaW50NjQqIHNpemVfb3V0KSBPVkVSUklERTsKLSAgdmlydHVhbCBib29sIElzU3RyZWFtaW5nKCkgT1ZFUlJJREU7Ci0KLSBwcml2YXRlOgotICAvLyBTZXRzIHxsYXN0X3JlYWRfYnl0ZXNffCBhbmQgc2lnbmFscyB0aGUgYmxvY2tlZCB0aHJlYWQgdGhhdCB0aGUgcmVhZAotICAvLyBoYXMgY29tcGxldGVkLgotICB2b2lkIFNpZ25hbFJlYWRDb21wbGV0ZWQoaW50IHNpemUpOwotCi0gIHNjb3BlZF9yZWZwdHI8RGF0YVNvdXJjZT4gZGF0YV9zb3VyY2VfOwotICBiYXNlOjpDbG9zdXJlIGVycm9yX2NiXzsKLQotICAvLyBVc2VkIHRvIHVuYmxvY2sgdGhlIHRocmVhZCBkdXJpbmcgc2h1dGRvd24gYW5kIHdoZW4gcmVhZHMgY29tcGxldGUuCi0gIGJhc2U6OldhaXRhYmxlRXZlbnQgYWJvcnRlZF87Ci0gIGJhc2U6OldhaXRhYmxlRXZlbnQgcmVhZF9jb21wbGV0ZV87Ci0KLSAgLy8gQ2FjaGVkIG51bWJlciBvZiBieXRlcyBsYXN0IHJlYWQgZnJvbSB0aGUgZGF0YSBzb3VyY2UuCi0gIGludCBsYXN0X3JlYWRfYnl0ZXNfOwotCi0gIC8vIENhY2hlZCBwb3NpdGlvbiB3aXRoaW4gdGhlIGRhdGEgc291cmNlLgotICBpbnQ2NCByZWFkX3Bvc2l0aW9uXzsKLQotICBESVNBTExPV19JTVBMSUNJVF9DT05TVFJVQ1RPUlMoQmxvY2tpbmdVcmxQcm90b2NvbCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9GSUxURVJTX0JMT0NLSU5HX1VSTF9QUk9UT0NPTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvYmxvY2tpbmdfdXJsX3Byb3RvY29sX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2ZpbHRlcnMvYmxvY2tpbmdfdXJsX3Byb3RvY29sX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjg2ZTcyLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL2Jsb2NraW5nX3VybF9wcm90b2NvbF91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiYmFzZS9maWxlX3BhdGguaCIKLSNpbmNsdWRlICJiYXNlL2ZpbGVfdXRpbC5oIgotI2luY2x1ZGUgImJhc2UvcGF0aF9zZXJ2aWNlLmgiCi0jaW5jbHVkZSAiYmFzZS9zeW5jaHJvbml6YXRpb24vd2FpdGFibGVfZXZlbnQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3Rlc3RfZGF0YV91dGlsLmgiCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9ibG9ja2luZ191cmxfcHJvdG9jb2wuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL2ZpbGVfZGF0YV9zb3VyY2UuaCIKLSNpbmNsdWRlICJtZWRpYS9mZm1wZWcvZmZtcGVnX2NvbW1vbi5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBCbG9ja2luZ1VybFByb3RvY29sVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gIEJsb2NraW5nVXJsUHJvdG9jb2xUZXN0KCkgewotICAgIGRhdGFfc291cmNlXyA9IG5ldyBGaWxlRGF0YVNvdXJjZSgpOwotICAgIENIRUNLKGRhdGFfc291cmNlXy0+SW5pdGlhbGl6ZShHZXRUZXN0RGF0YUZpbGVQYXRoKCJiZWFyLTMyMHgyNDAud2VibSIpKSk7Ci0KLSAgICB1cmxfcHJvdG9jb2xfLnJlc2V0KG5ldyBCbG9ja2luZ1VybFByb3RvY29sKGRhdGFfc291cmNlXywgYmFzZTo6QmluZCgKLSAgICAgICAgJkJsb2NraW5nVXJsUHJvdG9jb2xUZXN0OjpPbkRhdGFTb3VyY2VFcnJvciwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpKTsKLSAgfQotCi0gIHZpcnR1YWwgfkJsb2NraW5nVXJsUHJvdG9jb2xUZXN0KCkgewotICAgIGJhc2U6OldhaXRhYmxlRXZlbnQgc3RvcF9ldmVudChmYWxzZSwgZmFsc2UpOwotICAgIGRhdGFfc291cmNlXy0+U3RvcChiYXNlOjpCaW5kKAotICAgICAgICAmYmFzZTo6V2FpdGFibGVFdmVudDo6U2lnbmFsLCBiYXNlOjpVbnJldGFpbmVkKCZzdG9wX2V2ZW50KSkpOwotICAgIHN0b3BfZXZlbnQuV2FpdCgpOwotICB9Ci0KLSAgTU9DS19NRVRIT0QwKE9uRGF0YVNvdXJjZUVycm9yLCB2b2lkKCkpOwotCi0gIHNjb3BlZF9yZWZwdHI8RmlsZURhdGFTb3VyY2U+IGRhdGFfc291cmNlXzsKLSAgc2NvcGVkX3B0cjxCbG9ja2luZ1VybFByb3RvY29sPiB1cmxfcHJvdG9jb2xfOwotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEJsb2NraW5nVXJsUHJvdG9jb2xUZXN0KTsKLX07Ci0KLQotVEVTVF9GKEJsb2NraW5nVXJsUHJvdG9jb2xUZXN0LCBSZWFkKSB7Ci0gIC8vIFNldCByZWFkIGhlYWQgdG8gemVybyBhcyBJbml0aWFsaXplKCkgd2lsbCBoYXZlIHBhcnNlZCBhIGJpdCBvZiB0aGUgZmlsZS4KLSAgaW50NjQgcG9zaXRpb24gPSAwOwotICBFWFBFQ1RfVFJVRSh1cmxfcHJvdG9jb2xfLT5TZXRQb3NpdGlvbigwKSk7Ci0gIEVYUEVDVF9UUlVFKHVybF9wcm90b2NvbF8tPkdldFBvc2l0aW9uKCZwb3NpdGlvbikpOwotICBFWFBFQ1RfRVEoMCwgcG9zaXRpb24pOwotCi0gIC8vIFJlYWQgMzIgYnl0ZXMgZnJvbSBvZmZzZXQgemVybyBhbmQgdmVyaWZ5IHBvc2l0aW9uLgotICB1aW50OCBidWZmZXJbMzJdOwotICBFWFBFQ1RfRVEoMzIsIHVybF9wcm90b2NvbF8tPlJlYWQoMzIsIGJ1ZmZlcikpOwotICBFWFBFQ1RfVFJVRSh1cmxfcHJvdG9jb2xfLT5HZXRQb3NpdGlvbigmcG9zaXRpb24pKTsKLSAgRVhQRUNUX0VRKDMyLCBwb3NpdGlvbik7Ci0KLSAgLy8gUmVhZCBhbiBhZGRpdGlvbmFsIDMyIGJ5dGVzIGFuZCB2ZXJpZnkgcG9zaXRpb24uCi0gIEVYUEVDVF9FUSgzMiwgdXJsX3Byb3RvY29sXy0+UmVhZCgzMiwgYnVmZmVyKSk7Ci0gIEVYUEVDVF9UUlVFKHVybF9wcm90b2NvbF8tPkdldFBvc2l0aW9uKCZwb3NpdGlvbikpOwotICBFWFBFQ1RfRVEoNjQsIHBvc2l0aW9uKTsKLQotICAvLyBTZWVrIHRvIGVuZCBhbmQgcmVhZCB1bnRpbCBFT0YuCi0gIGludDY0IHNpemUgPSAwOwotICBFWFBFQ1RfVFJVRSh1cmxfcHJvdG9jb2xfLT5HZXRTaXplKCZzaXplKSk7Ci0gIEVYUEVDVF9UUlVFKHVybF9wcm90b2NvbF8tPlNldFBvc2l0aW9uKHNpemUgLSA0OCkpOwotICBFWFBFQ1RfRVEoMzIsIHVybF9wcm90b2NvbF8tPlJlYWQoMzIsIGJ1ZmZlcikpOwotICBFWFBFQ1RfVFJVRSh1cmxfcHJvdG9jb2xfLT5HZXRQb3NpdGlvbigmcG9zaXRpb24pKTsKLSAgRVhQRUNUX0VRKHNpemUgLSAxNiwgcG9zaXRpb24pOwotCi0gIEVYUEVDVF9FUSgxNiwgdXJsX3Byb3RvY29sXy0+UmVhZCgzMiwgYnVmZmVyKSk7Ci0gIEVYUEVDVF9UUlVFKHVybF9wcm90b2NvbF8tPkdldFBvc2l0aW9uKCZwb3NpdGlvbikpOwotICBFWFBFQ1RfRVEoc2l6ZSwgcG9zaXRpb24pOwotCi0gIEVYUEVDVF9FUSgwLCB1cmxfcHJvdG9jb2xfLT5SZWFkKDMyLCBidWZmZXIpKTsKLSAgRVhQRUNUX1RSVUUodXJsX3Byb3RvY29sXy0+R2V0UG9zaXRpb24oJnBvc2l0aW9uKSk7Ci0gIEVYUEVDVF9FUShzaXplLCBwb3NpdGlvbik7Ci19Ci0KLVRFU1RfRihCbG9ja2luZ1VybFByb3RvY29sVGVzdCwgUmVhZEVycm9yKSB7Ci0gIGRhdGFfc291cmNlXy0+Zm9yY2VfcmVhZF9lcnJvcnNfZm9yX3Rlc3RpbmcoKTsKLQotICB1aW50OCBidWZmZXJbMzJdOwotICBFWFBFQ1RfQ0FMTCgqdGhpcywgT25EYXRhU291cmNlRXJyb3IoKSk7Ci0gIEVYUEVDVF9FUShBVkVSUk9SKEVJTyksIHVybF9wcm90b2NvbF8tPlJlYWQoMzIsIGJ1ZmZlcikpOwotfQotCi1URVNUX0YoQmxvY2tpbmdVcmxQcm90b2NvbFRlc3QsIEdldFNldFBvc2l0aW9uKSB7Ci0gIGludDY0IHNpemU7Ci0gIGludDY0IHBvc2l0aW9uOwotICBFWFBFQ1RfVFJVRSh1cmxfcHJvdG9jb2xfLT5HZXRTaXplKCZzaXplKSk7Ci0gIEVYUEVDVF9UUlVFKHVybF9wcm90b2NvbF8tPkdldFBvc2l0aW9uKCZwb3NpdGlvbikpOwotCi0gIEVYUEVDVF9UUlVFKHVybF9wcm90b2NvbF8tPlNldFBvc2l0aW9uKDUxMikpOwotICBFWFBFQ1RfRkFMU0UodXJsX3Byb3RvY29sXy0+U2V0UG9zaXRpb24oc2l6ZSkpOwotICBFWFBFQ1RfRkFMU0UodXJsX3Byb3RvY29sXy0+U2V0UG9zaXRpb24oc2l6ZSArIDEpKTsKLSAgRVhQRUNUX0ZBTFNFKHVybF9wcm90b2NvbF8tPlNldFBvc2l0aW9uKC0xKSk7Ci0gIEVYUEVDVF9UUlVFKHVybF9wcm90b2NvbF8tPkdldFBvc2l0aW9uKCZwb3NpdGlvbikpOwotICBFWFBFQ1RfRVEoNTEyLCBwb3NpdGlvbik7Ci19Ci0KLVRFU1RfRihCbG9ja2luZ1VybFByb3RvY29sVGVzdCwgR2V0U2l6ZSkgewotICBpbnQ2NCBkYXRhX3NvdXJjZV9zaXplID0gMDsKLSAgaW50NjQgdXJsX3Byb3RvY29sX3NpemUgPSAwOwotICBFWFBFQ1RfVFJVRShkYXRhX3NvdXJjZV8tPkdldFNpemUoJmRhdGFfc291cmNlX3NpemUpKTsKLSAgRVhQRUNUX1RSVUUodXJsX3Byb3RvY29sXy0+R2V0U2l6ZSgmdXJsX3Byb3RvY29sX3NpemUpKTsKLSAgRVhQRUNUX05FKDAsIGRhdGFfc291cmNlX3NpemUpOwotICBFWFBFQ1RfRVEoZGF0YV9zb3VyY2Vfc2l6ZSwgdXJsX3Byb3RvY29sX3NpemUpOwotfQotCi1URVNUX0YoQmxvY2tpbmdVcmxQcm90b2NvbFRlc3QsIElzU3RyZWFtaW5nKSB7Ci0gIEVYUEVDVF9GQUxTRShkYXRhX3NvdXJjZV8tPklzU3RyZWFtaW5nKCkpOwotICBFWFBFQ1RfRkFMU0UodXJsX3Byb3RvY29sXy0+SXNTdHJlYW1pbmcoKSk7Ci0KLSAgZGF0YV9zb3VyY2VfLT5mb3JjZV9zdHJlYW1pbmdfZm9yX3Rlc3RpbmcoKTsKLSAgRVhQRUNUX1RSVUUoZGF0YV9zb3VyY2VfLT5Jc1N0cmVhbWluZygpKTsKLSAgRVhQRUNUX1RSVUUodXJsX3Byb3RvY29sXy0+SXNTdHJlYW1pbmcoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvY2h1bmtfZGVtdXhlci5jYyBiL3NyYy9tZWRpYS9maWx0ZXJzL2NodW5rX2RlbXV4ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NzYwYjguLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvY2h1bmtfZGVtdXhlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE0MzYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvY2h1bmtfZGVtdXhlci5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGRlcXVlPgotCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFja19oZWxwZXJzLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2NhdGlvbi5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wX3Byb3h5LmgiCi0jaW5jbHVkZSAiYmFzZS9zdHJpbmdfdXRpbC5oIgotI2lmIExPR19NRURJQV9TT1VSQ0VfQUNUSVZJVElFUwotI2luY2x1ZGUgImJhc2Uvc3RyaW5ncHJpbnRmLmgiCi0jZW5kaWYgIC8vIExPR19NRURJQV9TT1VSQ0VfQUNUSVZJVElFUwotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fZGVjb2Rlcl9jb25maWcuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3N0cmVhbV9wYXJzZXJfYnVmZmVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb19kZWNvZGVyX2NvbmZpZy5oIgotI2lmIGRlZmluZWQoR09PR0xFX0NIUk9NRV9CVUlMRCkgfHwgZGVmaW5lZChVU0VfUFJPUFJJRVRBUllfQ09ERUNTKSB8fCBcCi0gICAgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotI2luY2x1ZGUgIm1lZGlhL21wNC9tcDRfc3RyZWFtX3BhcnNlci5oIgotI2VuZGlmCi0jaW5jbHVkZSAibWVkaWEvd2VibS93ZWJtX3N0cmVhbV9wYXJzZXIuaCIKLQotI2lmIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3NoZWxsX2J1ZmZlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaGVsbF9tZWRpYV9wbGF0Zm9ybS5oIgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKE9TX1NUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgotI2lmIFNCX0hBU19RVUlSSyhTRUVLX1RPX0tFWUZSQU1FKQotI2RlZmluZSBDSFVOS19ERU1VWEVSX1NFRUtfVE9fS0VZRlJBTUUKLSNlbmRpZiAgLy8gU0JfSEFTX1FVSVJLKFNFRUtfVE9fS0VZRlJBTUUpCi0jZW5kaWYgIC8vIGRlZmluZWQoT1NfU1RBUkJPQVJEKQotCi11c2luZyBiYXNlOjpUaW1lRGVsdGE7Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLW5hbWVzcGFjZSB7Ci0KLXN0ZDo6c3RyaW5nIEdldE1lZGlhU291cmNlTG9nRGVzYyhjb25zdCBjaGFyKiBkZXNjX3dpdGhfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbXV4ZXJTdHJlYW06OlR5cGUgdHlwZSkgewotI2lmIExPR19NRURJQV9TT1VSQ0VfQUNUSVZJVElFUwotICByZXR1cm4gYmFzZTo6U3RyaW5nUHJpbnRmKGRlc2Nfd2l0aF9mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBEZW11eGVyU3RyZWFtOjpBVURJTyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKLSNlbHNlICAvLyBMT0dfTUVESUFfU09VUkNFX0FDVElWSVRJRVMKLSAgcmV0dXJuICIiOwotI2VuZGlmICAvLyBMT0dfTUVESUFfU09VUkNFX0FDVElWSVRJRVMKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLXN0cnVjdCBDb2RlY0luZm8gewotICBjb25zdCBjaGFyKiBwYXR0ZXJuOwotICBEZW11eGVyU3RyZWFtOjpUeXBlIHR5cGU7Ci19OwotCi10eXBlZGVmIFN0cmVhbVBhcnNlciogKCpQYXJzZXJGYWN0b3J5RnVuY3Rpb24pKAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY29kZWNzKTsKLQotc3RydWN0IFN1cHBvcnRlZFR5cGVJbmZvIHsKLSAgY29uc3QgY2hhciogdHlwZTsKLSAgY29uc3QgUGFyc2VyRmFjdG9yeUZ1bmN0aW9uIGZhY3RvcnlfZnVuY3Rpb247Ci0gIGNvbnN0IENvZGVjSW5mbyoqIGNvZGVjczsKLX07Ci0KLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0jaWYgZGVmaW5lZChPU19TVEFSQk9BUkQpCi0jaWYgU0JfSEFTKE1FRElBX1dFQk1fVlA5X1NVUFBPUlQpCi0KLXN0YXRpYyBjb25zdCBDb2RlY0luZm8ga1ZQOUNvZGVjSW5mbyA9IHsidnA5KiIsIERlbXV4ZXJTdHJlYW06OlZJREVPfTsKLQotc3RhdGljIGNvbnN0IENvZGVjSW5mbyoga1ZpZGVvV2ViTUNvZGVjc1tdID0gewotICAma1ZQOUNvZGVjSW5mbywKLSAgTlVMTAotfTsKLQotI2VuZGlmICAvLyBTQl9IQVMoTUVESUFfV0VCTV9WUDlfU1VQUE9SVCkKLSNlbmRpZiAgLy8gZGVmaW5lZChPU19TVEFSQk9BUkQpCi0jZWxzZSAgIC8vIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLQotc3RhdGljIGNvbnN0IENvZGVjSW5mbyBrVlA4Q29kZWNJbmZvID0geyAidnA4IiwgRGVtdXhlclN0cmVhbTo6VklERU8gfTsKLXN0YXRpYyBjb25zdCBDb2RlY0luZm8ga1ZvcmJpc0NvZGVjSW5mbyA9IHsgInZvcmJpcyIsIERlbXV4ZXJTdHJlYW06OkFVRElPIH07Ci0KLXN0YXRpYyBjb25zdCBDb2RlY0luZm8qIGtWaWRlb1dlYk1Db2RlY3NbXSA9IHsKLSAgJmtWUDhDb2RlY0luZm8sCi0gICZrVm9yYmlzQ29kZWNJbmZvLAotICBOVUxMCi19OwotCi1zdGF0aWMgY29uc3QgQ29kZWNJbmZvKiBrQXVkaW9XZWJNQ29kZWNzW10gPSB7Ci0gICZrVm9yYmlzQ29kZWNJbmZvLAotICBOVUxMCi19OwotCi0jZW5kaWYgIC8vIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLQotc3RhdGljIFN0cmVhbVBhcnNlciogQnVpbGRXZWJNUGFyc2VyKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY29kZWNzKSB7Ci0gIHJldHVybiBuZXcgV2ViTVN0cmVhbVBhcnNlcigpOwotfQotCi0jaWYgZGVmaW5lZChHT09HTEVfQ0hST01FX0JVSUxEKSB8fCBkZWZpbmVkKFVTRV9QUk9QUklFVEFSWV9DT0RFQ1MpIHx8IFwKLSAgICBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi1zdGF0aWMgY29uc3QgQ29kZWNJbmZvIGtIMjY0Q29kZWNJbmZvID0geyAiYXZjMS4qIiwgRGVtdXhlclN0cmVhbTo6VklERU8gfTsKLXN0YXRpYyBjb25zdCBDb2RlY0luZm8ga0FBQ0NvZGVjSW5mbyA9IHsgIm1wNGEuNDAuKiIsIERlbXV4ZXJTdHJlYW06OkFVRElPIH07Ci0KLXN0YXRpYyBjb25zdCBDb2RlY0luZm8qIGtWaWRlb01QNENvZGVjc1tdID0gewotICAma0gyNjRDb2RlY0luZm8sCi0gICZrQUFDQ29kZWNJbmZvLAotICBOVUxMCi19OwotCi1zdGF0aWMgY29uc3QgQ29kZWNJbmZvKiBrQXVkaW9NUDRDb2RlY3NbXSA9IHsKLSAgJmtBQUNDb2RlY0luZm8sCi0gIE5VTEwKLX07Ci0KLS8vIE1pbWV0eXBlIGNvZGVjIHN0cmluZyB0aGF0IGluZGljYXRlcyB0aGUgY29udGVudCBjb250YWlucyBBQUMgU0JSIGZyYW1lcy4KLXN0YXRpYyBjb25zdCBjaGFyKiBrU0JSQ29kZWNJZCA9ICJtcDRhLjQwLjUiOwotCi1zdGF0aWMgU3RyZWFtUGFyc2VyKiBCdWlsZE1QNFBhcnNlcihjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNvZGVjcykgewotICBib29sIGhhc19zYnIgPSBmYWxzZTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb2RlY3Muc2l6ZSgpOyArK2kpIHsKLSAgICBpZiAoY29kZWNzW2ldID09IGtTQlJDb2RlY0lkKSB7Ci0gICAgICBoYXNfc2JyID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBuZXcgbXA0OjpNUDRTdHJlYW1QYXJzZXIoaGFzX3Nicik7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGNvbnN0IFN1cHBvcnRlZFR5cGVJbmZvIGtTdXBwb3J0ZWRUeXBlSW5mb1tdID0gewotI2lmIGRlZmluZWQoT1NfU1RBUkJPQVJEKQotI2lmIFNCX0hBUyhNRURJQV9XRUJNX1ZQOV9TVVBQT1JUKQotICAgIHsidmlkZW8vd2VibSIsICZCdWlsZFdlYk1QYXJzZXIsIGtWaWRlb1dlYk1Db2RlY3N9LAotI2VuZGlmICAvLyBTQl9IQVMoTUVESUFfV0VCTV9WUDlfU1VQUE9SVCkKLSNlbmRpZiAgLy8gZGVmaW5lZChPU19TVEFSQk9BUkQpCi0jaWYgIWRlZmluZWQoX19MQl9TSEVMTF9fKSAmJiAhZGVmaW5lZChDT0JBTFQpCi0gICAgeyJhdWRpby93ZWJtIiwgJkJ1aWxkV2ViTVBhcnNlciwga0F1ZGlvV2ViTUNvZGVjc30sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKEdPT0dMRV9DSFJPTUVfQlVJTEQpIHx8IGRlZmluZWQoVVNFX1BST1BSSUVUQVJZX0NPREVDUykgfHwgXAotICAgIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLSAgICB7InZpZGVvL21wNCIsICZCdWlsZE1QNFBhcnNlciwga1ZpZGVvTVA0Q29kZWNzfSwKLSAgICB7ImF1ZGlvL21wNCIsICZCdWlsZE1QNFBhcnNlciwga0F1ZGlvTVA0Q29kZWNzfSwKLSNlbmRpZgotfTsKLQotLy8gQ2hlY2tzIHRvIHNlZSBpZiB0aGUgc3BlY2lmaWVkIHx0eXBlfCBhbmQgfGNvZGVjc3wgbGlzdCBhcmUgc3VwcG9ydGVkLgotLy8gUmV0dXJucyB0cnVlIGlmIHx0eXBlfCBhbmQgYWxsIGNvZGVjcyBsaXN0ZWQgaW4gfGNvZGVjc3wgYXJlIHN1cHBvcnRlZC4KLS8vICAgICAgICAgfGZhY3RvcnlfZnVuY3Rpb258IGNvbnRhaW5zIGEgZnVuY3Rpb24gdGhhdCBjYW4gYnVpbGQgYSBTdHJlYW1QYXJzZXIKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGlzIHR5cGUuCi0vLyAgICAgICAgIHxoYXNfYXVkaW98IGlzIHRydWUgaWYgYW4gYXVkaW8gY29kZWMgd2FzIHNwZWNpZmllZC4KLS8vICAgICAgICAgfGhhc192aWRlb3wgaXMgdHJ1ZSBpZiBhIHZpZGVvIGNvZGVjIHdhcyBzcGVjaWZpZWQuCi0vLyBSZXR1cm5zIGZhbHNlIG90aGVyd2lzZS4gVGhlIHZhbHVlcyBvZiB8ZmFjdG9yeV9mdW5jdGlvbnwsIHxoYXNfYXVkaW98LAotLy8gICAgICAgICBhbmQgfGhhc192aWRlb3wgYXJlIHVuZGVmaW5lZC4KLXN0YXRpYyBib29sIElzU3VwcG9ydGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjb2RlY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2dDQiYgbG9nX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VyRmFjdG9yeUZ1bmN0aW9uKiBmYWN0b3J5X2Z1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogaGFzX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogaGFzX3ZpZGVvKSB7Ci0gICpmYWN0b3J5X2Z1bmN0aW9uID0gTlVMTDsKLSAgKmhhc19hdWRpbyA9IGZhbHNlOwotICAqaGFzX3ZpZGVvID0gZmFsc2U7Ci0KLSAgLy8gU2VhcmNoIGZvciB0aGUgU3VwcG9ydGVkVHlwZUluZm8gZm9yIHx0eXBlfC4KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheXNpemUoa1N1cHBvcnRlZFR5cGVJbmZvKTsgKytpKSB7Ci0gICAgY29uc3QgU3VwcG9ydGVkVHlwZUluZm8mIHR5cGVfaW5mbyA9IGtTdXBwb3J0ZWRUeXBlSW5mb1tpXTsKLSAgICBpZiAodHlwZSA9PSB0eXBlX2luZm8udHlwZSkgewotICAgICAgLy8gTWFrZSBzdXJlIGFsbCB0aGUgY29kZWNzIHNwZWNpZmllZCBpbiB8Y29kZWNzfCBhcmUKLSAgICAgIC8vIGluIHRoZSBzdXBwb3J0ZWQgdHlwZSBpbmZvLgotICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBjb2RlY3Muc2l6ZSgpOyArK2opIHsKLSAgICAgICAgLy8gU2VhcmNoIHRoZSB0eXBlIGluZm8gZm9yIGEgbWF0Y2guCi0gICAgICAgIGJvb2wgZm91bmRfY29kZWMgPSBmYWxzZTsKLSAgICAgICAgRGVtdXhlclN0cmVhbTo6VHlwZSBjb2RlY190eXBlID0gRGVtdXhlclN0cmVhbTo6VU5LTk9XTjsKLQotICAgICAgICBmb3IgKGludCBrID0gMDsgdHlwZV9pbmZvLmNvZGVjc1trXTsgKytrKSB7Ci0gICAgICAgICAgaWYgKE1hdGNoUGF0dGVybihjb2RlY3Nbal0sIHR5cGVfaW5mby5jb2RlY3Nba10tPnBhdHRlcm4pKSB7Ci0gICAgICAgICAgICBmb3VuZF9jb2RlYyA9IHRydWU7Ci0gICAgICAgICAgICBjb2RlY190eXBlID0gdHlwZV9pbmZvLmNvZGVjc1trXS0+dHlwZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghZm91bmRfY29kZWMpIHsKLSAgICAgICAgICBNRURJQV9MT0cobG9nX2NiKSA8PCAiQ29kZWMgJyIgPDwgY29kZWNzW2pdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwiJyBpcyBub3Qgc3VwcG9ydGVkIGZvciAnIiA8PCB0eXBlIDw8ICInIjsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKGNvZGVjX3R5cGUpIHsKLSAgICAgICAgICBjYXNlIERlbXV4ZXJTdHJlYW06OkFVRElPOgotICAgICAgICAgICAgKmhhc19hdWRpbyA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIERlbXV4ZXJTdHJlYW06OlZJREVPOgotICAgICAgICAgICAgKmhhc192aWRlbyA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTUVESUFfTE9HKGxvZ19jYikgPDwgIlVuc3VwcG9ydGVkIGNvZGVjIHR5cGUgJyI8PCBjb2RlY190eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiJyBmb3IgIiA8PCBjb2RlY3Nbal07Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgKmZhY3RvcnlfZnVuY3Rpb24gPSB0eXBlX2luZm8uZmFjdG9yeV9mdW5jdGlvbjsKLQotICAgICAgLy8gQWxsIGNvZGVjcyB3ZXJlIHN1cHBvcnRlZCBieSB0aGlzIHx0eXBlfC4KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotCi0gIC8vIHx0eXBlfCBkaWRuJ3QgbWF0Y2ggYW55IG9mIHRoZSBzdXBwb3J0ZWQgdHlwZXMuCi0gIHJldHVybiBmYWxzZTsKLX0KLQotY2xhc3MgQ2h1bmtEZW11eGVyU3RyZWFtIDogcHVibGljIERlbXV4ZXJTdHJlYW0gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBzdGQ6OmRlcXVlPHNjb3BlZF9yZWZwdHI8U3RyZWFtUGFyc2VyQnVmZmVyPiA+IEJ1ZmZlclF1ZXVlOwotICB0eXBlZGVmIHN0ZDo6ZGVxdWU8UmVhZENCPiBSZWFkQ0JRdWV1ZTsKLSAgdHlwZWRlZiBzdGQ6OmRlcXVlPGJhc2U6OkNsb3N1cmU+IENsb3N1cmVRdWV1ZTsKLQotICBDaHVua0RlbXV4ZXJTdHJlYW0oY29uc3QgQXVkaW9EZWNvZGVyQ29uZmlnJiBhdWRpb19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2dDQiYgbG9nX2NiKTsKLSAgQ2h1bmtEZW11eGVyU3RyZWFtKGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgdmlkZW9fY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9nQ0ImIGxvZ19jYik7Ci0KLSAgdm9pZCBTdGFydFdhaXRpbmdGb3JTZWVrKCk7Ci0gIHZvaWQgU2VlayhUaW1lRGVsdGEgdGltZSk7Ci0gIHZvaWQgQ2FuY2VsUGVuZGluZ1NlZWsoKTsKLSAgYm9vbCBJc1NlZWtQZW5kaW5nKCkgY29uc3Q7Ci0gIGJhc2U6OlRpbWVEZWx0YSBHZXRTZWVrS2V5ZnJhbWVUaW1lc3RhbXAoKSBjb25zdDsKLQotICAvLyBBZGQgYnVmZmVycyB0byB0aGlzIHN0cmVhbS4gIEJ1ZmZlcnMgYXJlIHN0b3JlZCBpbiBTb3VyY2VCdWZmZXJTdHJlYW1zLAotICAvLyB3aGljaCBoYW5kbGUgb3JkZXJpbmcgYW5kIG92ZXJsYXAgcmVzb2x1dGlvbi4KLSAgLy8gUmV0dXJucyB0cnVlIGlmIGJ1ZmZlcnMgd2VyZSBzdWNjZXNzZnVsbHkgYWRkZWQuCi0gIGJvb2wgQXBwZW5kKGNvbnN0IFN0cmVhbVBhcnNlcjo6QnVmZmVyUXVldWUmIGJ1ZmZlcnMpOwotCi0gIC8vIFNpZ25hbCB0byB0aGUgc3RyZWFtIHRoYXQgZHVyYXRpb24gaGFzIGNoYW5nZWQgdG8gfGR1cmF0aW9ufC4KLSAgdm9pZCBPblNldER1cmF0aW9uKGJhc2U6OlRpbWVEZWx0YSBkdXJhdGlvbik7Ci0KLSAgLy8gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgYnVmZmVyZWQgZGF0YSBpbiB0aGlzIHN0cmVhbSwgY2FwcGVkIGF0IHxkdXJhdGlvbnwuCi0gIFJhbmdlczxUaW1lRGVsdGE+IEdldEJ1ZmZlcmVkUmFuZ2VzKGJhc2U6OlRpbWVEZWx0YSBkdXJhdGlvbikgY29uc3Q7Ci0KLSAgLy8gU2lnbmFsIHRvIHRoZSBzdHJlYW0gdGhhdCBidWZmZXJzIGhhbmRlZCBpbiB0aHJvdWdoIHN1YnNlcXVlbnQgY2FsbHMgdG8KLSAgLy8gQXBwZW5kKCkgYmVsb25nIHRvIGEgbWVkaWEgc2VnbWVudCB0aGF0IHN0YXJ0cyBhdCB8c3RhcnRfdGltZXN0YW1wfC4KLSAgdm9pZCBPbk5ld01lZGlhU2VnbWVudChUaW1lRGVsdGEgc3RhcnRfdGltZXN0YW1wKTsKLQotICAvLyBDYWxsZWQgd2hlbiBtaWQtc3RyZWFtIGNvbmZpZyB1cGRhdGVzIG9jY3VyLgotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIG5ldyBjb25maWcgaXMgYWNjZXB0ZWQuCi0gIC8vIFJldHVybnMgZmFsc2UgaWYgdGhlIG5ldyBjb25maWcgc2hvdWxkIHRyaWdnZXIgYW4gZXJyb3IuCi0gIGJvb2wgVXBkYXRlQXVkaW9Db25maWcoY29uc3QgQXVkaW9EZWNvZGVyQ29uZmlnJiBjb25maWcpOwotICBib29sIFVwZGF0ZVZpZGVvQ29uZmlnKGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgY29uZmlnKTsKLQotICB2b2lkIEVuZE9mU3RyZWFtKCk7Ci0gIHZvaWQgQ2FuY2VsRW5kT2ZTdHJlYW0oKTsKLSAgYm9vbCBDYW5FbmRPZlN0cmVhbSgpIGNvbnN0OwotCi0gIHZvaWQgU2h1dGRvd24oKTsKLQotICAvLyBEZW11eGVyU3RyZWFtIG1ldGhvZHMuCi0gIHZpcnR1YWwgdm9pZCBSZWFkKGNvbnN0IFJlYWRDQiYgcmVhZF9jYikgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgVHlwZSB0eXBlKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBFbmFibGVCaXRzdHJlYW1Db252ZXJ0ZXIoKSBPVkVSUklERTsKLSAgdmlydHVhbCBjb25zdCBBdWRpb0RlY29kZXJDb25maWcmIGF1ZGlvX2RlY29kZXJfY29uZmlnKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiB2aWRlb19kZWNvZGVyX2NvbmZpZygpIE9WRVJSSURFOwotCi0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICBib29sIFN0cmVhbVdhc0VuY3J5cHRlZCgpIGNvbnN0IE9WRVJSSURFOwotI2VuZGlmCi0KLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgfkNodW5rRGVtdXhlclN0cmVhbSgpOwotCi0gcHJpdmF0ZToKLSAgZW51bSBTdGF0ZSB7Ci0gICAgUkVUVVJOSU5HX0RBVEFfRk9SX1JFQURTLAotICAgIFdBSVRJTkdfRk9SX1NFRUssCi0gICAgQ0FOQ0VMRUQsCi0gICAgU0hVVERPV04sCi0gIH07Ci0KLSAgLy8gQXNzaWducyB8c3RhdGVffCB0byB8c3RhdGV8Ci0gIHZvaWQgQ2hhbmdlU3RhdGVfTG9ja2VkKFN0YXRlIHN0YXRlKTsKLQotICAvLyBBZGRzIHRoZSBjYWxsYmFjayB0byB8cmVhZF9jYnNffCBzbyBpdCBjYW4gYmUgY2FsbGVkIGxhdGVyIHdoZW4gd2UKLSAgLy8gaGF2ZSBkYXRhLgotICB2b2lkIERlZmVyUmVhZF9Mb2NrZWQoY29uc3QgUmVhZENCJiByZWFkX2NiKTsKLQotICAvLyBDcmVhdGVzIGNsb3N1cmVzIHRoYXQgYmluZCBSZWFkQ0JzIGluIHxyZWFkX2Nic198IHRvIGRhdGEgaW4KLSAgLy8gfGJ1ZmZlcnNffCBhbmQgcG9wcyB0aGUgY2FsbGJhY2tzICYgYnVmZmVycyBmcm9tIHRoZSByZXNwZWN0aXZlIHF1ZXVlcy4KLSAgdm9pZCBDcmVhdGVSZWFkRG9uZUNsb3N1cmVzX0xvY2tlZChDbG9zdXJlUXVldWUqIGNsb3N1cmVzKTsKLQotICAvLyBHZXRzIHRoZSB2YWx1ZSB0byBwYXNzIHRvIHRoZSBuZXh0IFJlYWQoKSBjYWxsYmFjay4gUmV0dXJucyB0cnVlIGlmCi0gIC8vIHxzdGF0dXN8IGFuZCB8YnVmZmVyfCBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFjay4gRmFsc2UgaW5kaWNhdGVzCi0gIC8vIHRoYXQgfHN0YXR1c3wgYW5kIHxidWZmZXJ8IHdlcmUgbm90IHNldCBhbmQgbW9yZSBkYXRhIGlzIG5lZWRlZC4KLSAgYm9vbCBHZXROZXh0QnVmZmVyX0xvY2tlZChEZW11eGVyU3RyZWFtOjpTdGF0dXMqIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPFN0cmVhbVBhcnNlckJ1ZmZlcj4qIGJ1ZmZlcik7Ci0KLSAgLy8gU3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBzdHJlYW0gKG11c3QgYmUgQVVESU8gb3IgVklERU8gZm9yIG5vdykuCi0gIFR5cGUgdHlwZV87Ci0KLSAgc2NvcGVkX3B0cjxTb3VyY2VCdWZmZXJTdHJlYW0+IHN0cmVhbV87Ci0KLSAgbXV0YWJsZSBiYXNlOjpMb2NrIGxvY2tfOwotICBTdGF0ZSBzdGF0ZV87Ci0gIFJlYWRDQlF1ZXVlIHJlYWRfY2JzXzsKLSAgYm9vbCBlbmRfb2Zfc3RyZWFtXzsKLQotICBESVNBTExPV19JTVBMSUNJVF9DT05TVFJVQ1RPUlMoQ2h1bmtEZW11eGVyU3RyZWFtKTsKLX07Ci0KLQotQ2h1bmtEZW11eGVyU3RyZWFtOjpDaHVua0RlbXV4ZXJTdHJlYW0oY29uc3QgQXVkaW9EZWNvZGVyQ29uZmlnJiBhdWRpb19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2dDQiYgbG9nX2NiKQotICAgIDogdHlwZV8oQVVESU8pLAotICAgICAgc3RhdGVfKFJFVFVSTklOR19EQVRBX0ZPUl9SRUFEUyksCi0gICAgICBlbmRfb2Zfc3RyZWFtXyhmYWxzZSkgewotICBzdHJlYW1fLnJlc2V0KG5ldyBTb3VyY2VCdWZmZXJTdHJlYW0oYXVkaW9fY29uZmlnLCBsb2dfY2IpKTsKLX0KLQotQ2h1bmtEZW11eGVyU3RyZWFtOjpDaHVua0RlbXV4ZXJTdHJlYW0oY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiB2aWRlb19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2dDQiYgbG9nX2NiKQotICAgIDogdHlwZV8oVklERU8pLAotICAgICAgc3RhdGVfKFJFVFVSTklOR19EQVRBX0ZPUl9SRUFEUyksCi0gICAgICBlbmRfb2Zfc3RyZWFtXyhmYWxzZSkgewotICBzdHJlYW1fLnJlc2V0KG5ldyBTb3VyY2VCdWZmZXJTdHJlYW0odmlkZW9fY29uZmlnLCBsb2dfY2IpKTsKLX0KLQotdm9pZCBDaHVua0RlbXV4ZXJTdHJlYW06OlN0YXJ0V2FpdGluZ0ZvclNlZWsoKSB7Ci0gIERWTE9HKDEpIDw8ICJDaHVua0RlbXV4ZXJTdHJlYW06OlN0YXJ0V2FpdGluZ0ZvclNlZWsoKSI7Ci0gIFJlYWRDQlF1ZXVlIHJlYWRfY2JzOwotICB7Ci0gICAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgICBDaGFuZ2VTdGF0ZV9Mb2NrZWQoV0FJVElOR19GT1JfU0VFSyk7Ci0gICAgc3RkOjpzd2FwKHJlYWRfY2JzXywgcmVhZF9jYnMpOwotICB9Ci0KLSAgZm9yIChSZWFkQ0JRdWV1ZTo6aXRlcmF0b3IgaXQgPSByZWFkX2Nicy5iZWdpbigpOyBpdCAhPSByZWFkX2Nicy5lbmQoKTsgKytpdCkKLSAgICBpdC0+UnVuKGtBYm9ydGVkLCBOVUxMKTsKLX0KLQotdm9pZCBDaHVua0RlbXV4ZXJTdHJlYW06OlNlZWsoVGltZURlbHRhIHRpbWUpIHsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLQotICBEQ0hFQ0socmVhZF9jYnNfLmVtcHR5KCkpOwotCi0gIC8vIElnbm9yZSBzZWVrIHJlcXVlc3RzIHdoZW4gY2FuY2VsZWQuCi0gIGlmIChzdGF0ZV8gPT0gQ0FOQ0VMRUQpCi0gICAgcmV0dXJuOwotCi0gIHN0cmVhbV8tPlNlZWsodGltZSk7Ci0KLSAgaWYgKHN0YXRlXyA9PSBXQUlUSU5HX0ZPUl9TRUVLKQotICAgIENoYW5nZVN0YXRlX0xvY2tlZChSRVRVUk5JTkdfREFUQV9GT1JfUkVBRFMpOwotfQotCi12b2lkIENodW5rRGVtdXhlclN0cmVhbTo6Q2FuY2VsUGVuZGluZ1NlZWsoKSB7Ci0gIERWTE9HKDEpIDw8ICJDaHVua0RlbXV4ZXJTdHJlYW06OkNhbmNlbFBlbmRpbmdTZWVrKCkiOwotICBSZWFkQ0JRdWV1ZSByZWFkX2NiczsKLSAgewotICAgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gICAgQ2hhbmdlU3RhdGVfTG9ja2VkKENBTkNFTEVEKTsKLSAgICBzdGQ6OnN3YXAocmVhZF9jYnNfLCByZWFkX2Nicyk7Ci0gIH0KLQotICBmb3IgKFJlYWRDQlF1ZXVlOjppdGVyYXRvciBpdCA9IHJlYWRfY2JzLmJlZ2luKCk7IGl0ICE9IHJlYWRfY2JzLmVuZCgpOyArK2l0KQotICAgIGl0LT5SdW4oa0Fib3J0ZWQsIE5VTEwpOwotfQotCi1ib29sIENodW5rRGVtdXhlclN0cmVhbTo6SXNTZWVrUGVuZGluZygpIGNvbnN0IHsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgcmV0dXJuIHN0cmVhbV8tPklzU2Vla1BlbmRpbmcoKTsKLX0KLQotYmFzZTo6VGltZURlbHRhIENodW5rRGVtdXhlclN0cmVhbTo6R2V0U2Vla0tleWZyYW1lVGltZXN0YW1wKCkgY29uc3QgewotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICByZXR1cm4gc3RyZWFtXy0+R2V0U2Vla0tleWZyYW1lVGltZXN0YW1wKCk7Ci19Ci0KLXZvaWQgQ2h1bmtEZW11eGVyU3RyZWFtOjpPbk5ld01lZGlhU2VnbWVudChUaW1lRGVsdGEgc3RhcnRfdGltZXN0YW1wKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gIERDSEVDSyghZW5kX29mX3N0cmVhbV8pOwotICBzdHJlYW1fLT5Pbk5ld01lZGlhU2VnbWVudChzdGFydF90aW1lc3RhbXApOwotfQotCi1ib29sIENodW5rRGVtdXhlclN0cmVhbTo6QXBwZW5kKGNvbnN0IFN0cmVhbVBhcnNlcjo6QnVmZmVyUXVldWUmIGJ1ZmZlcnMpIHsKLSAgaWYgKGJ1ZmZlcnMuZW1wdHkoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgTG9nTWVkaWFTb3VyY2VUaW1lUmFuZ2VzKAotICAgICAgR2V0TWVkaWFTb3VyY2VMb2dEZXNjKCJiZWZvcmUgYXBwZW5kIGJ1ZmZlcnMgdG8gJXMgc3RyZWFtIiwgdHlwZSgpKSwKLSAgICAgIEdldEJ1ZmZlcmVkUmFuZ2VzKGtJbmZpbml0ZUR1cmF0aW9uKCkpKTsKLQotICBDbG9zdXJlUXVldWUgY2xvc3VyZXM7Ci0gIHsKLSAgICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICAgIERDSEVDSyghZW5kX29mX3N0cmVhbV8pOwotICAgIERDSEVDS19ORShzdGF0ZV8sIFNIVVRET1dOKTsKLSAgICBpZiAoIXN0cmVhbV8tPkFwcGVuZChidWZmZXJzKSkgewotICAgICAgRFZMT0coMSkgPDwgIkNodW5rRGVtdXhlclN0cmVhbTo6QXBwZW5kKCkgOiBzdHJlYW0gYXBwZW5kIGZhaWxlZCI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIENyZWF0ZVJlYWREb25lQ2xvc3VyZXNfTG9ja2VkKCZjbG9zdXJlcyk7Ci0gIH0KLQotICBMb2dNZWRpYVNvdXJjZVRpbWVSYW5nZXMoCi0gICAgICBHZXRNZWRpYVNvdXJjZUxvZ0Rlc2MoImFmdGVyIGFwcGVuZCBidWZmZXJzIHRvICVzIHN0cmVhbSIsIHR5cGUoKSksCi0gICAgICBHZXRCdWZmZXJlZFJhbmdlcyhrSW5maW5pdGVEdXJhdGlvbigpKSk7Ci0KLSNpZiBMT0dfTUVESUFfU09VUkNFX0FDVElWSVRJRVMKLSAgTE9HKElORk8pIDw8ICIiOyAgLy8gRXh0cmEgZW1wdHkgbGluZSB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIGFwcGVuZCBpbiBsb2cuCi0jZW5kaWYgIC8vIExPR19NRURJQV9TT1VSQ0VfQUNUSVZJVElFUwotCi0gIGZvciAoQ2xvc3VyZVF1ZXVlOjppdGVyYXRvciBpdCA9IGNsb3N1cmVzLmJlZ2luKCk7IGl0ICE9IGNsb3N1cmVzLmVuZCgpOyArK2l0KQotICAgIGl0LT5SdW4oKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBDaHVua0RlbXV4ZXJTdHJlYW06Ok9uU2V0RHVyYXRpb24oYmFzZTo6VGltZURlbHRhIGR1cmF0aW9uKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gIHN0cmVhbV8tPk9uU2V0RHVyYXRpb24oZHVyYXRpb24pOwotfQotCi1SYW5nZXM8VGltZURlbHRhPiBDaHVua0RlbXV4ZXJTdHJlYW06OkdldEJ1ZmZlcmVkUmFuZ2VzKAotICAgIGJhc2U6OlRpbWVEZWx0YSBkdXJhdGlvbikgY29uc3QgewotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICBSYW5nZXM8VGltZURlbHRhPiByYW5nZSA9IHN0cmVhbV8tPkdldEJ1ZmZlcmVkVGltZSgpOwotCi0gIGlmIChyYW5nZS5zaXplKCkgPT0gMHUpCi0gICAgcmV0dXJuIHJhbmdlOwotCi0gIC8vIENsYW1wIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSdzIGJ1ZmZlcmVkIHJhbmdlcyB0byBmaXQgd2l0aGluIHRoZSBkdXJhdGlvbi4KLSAgLy8gVGhpcyBjYW4gYmUgZG9uZSBieSBpbnRlcnNlY3RpbmcgdGhlIHN0cmVhbSdzIHJhbmdlIHdpdGggdGhlIHZhbGlkIHRpbWUKLSAgLy8gcmFuZ2UuCi0gIFJhbmdlczxUaW1lRGVsdGE+IHZhbGlkX3RpbWVfcmFuZ2U7Ci0gIHZhbGlkX3RpbWVfcmFuZ2UuQWRkKHJhbmdlLnN0YXJ0KDApLCBkdXJhdGlvbik7Ci0gIHJldHVybiByYW5nZS5JbnRlcnNlY3Rpb25XaXRoKHZhbGlkX3RpbWVfcmFuZ2UpOwotfQotCi1ib29sIENodW5rRGVtdXhlclN0cmVhbTo6VXBkYXRlQXVkaW9Db25maWcoY29uc3QgQXVkaW9EZWNvZGVyQ29uZmlnJiBjb25maWcpIHsKLSAgRENIRUNLKGNvbmZpZy5Jc1ZhbGlkQ29uZmlnKCkpOwotICBEQ0hFQ0tfRVEodHlwZV8sIEFVRElPKTsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgcmV0dXJuIHN0cmVhbV8tPlVwZGF0ZUF1ZGlvQ29uZmlnKGNvbmZpZyk7Ci19Ci0KLWJvb2wgQ2h1bmtEZW11eGVyU3RyZWFtOjpVcGRhdGVWaWRlb0NvbmZpZyhjb25zdCBWaWRlb0RlY29kZXJDb25maWcmIGNvbmZpZykgewotICBEQ0hFQ0soY29uZmlnLklzVmFsaWRDb25maWcoKSk7Ci0gIERDSEVDS19FUSh0eXBlXywgVklERU8pOwotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICByZXR1cm4gc3RyZWFtXy0+VXBkYXRlVmlkZW9Db25maWcoY29uZmlnKTsKLX0KLQotdm9pZCBDaHVua0RlbXV4ZXJTdHJlYW06OkVuZE9mU3RyZWFtKCkgewotICBDbG9zdXJlUXVldWUgY2xvc3VyZXM7Ci0gIHsKLSAgICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICAgIERDSEVDSyghZW5kX29mX3N0cmVhbV8pOwotICAgIERDSEVDSyhzdHJlYW1fLT5Jc0VuZFNlbGVjdGVkKCkpOwotICAgIGVuZF9vZl9zdHJlYW1fID0gdHJ1ZTsKLSAgICBDcmVhdGVSZWFkRG9uZUNsb3N1cmVzX0xvY2tlZCgmY2xvc3VyZXMpOwotICB9Ci0KLSAgZm9yIChDbG9zdXJlUXVldWU6Oml0ZXJhdG9yIGl0ID0gY2xvc3VyZXMuYmVnaW4oKTsgaXQgIT0gY2xvc3VyZXMuZW5kKCk7ICsraXQpCi0gICAgaXQtPlJ1bigpOwotfQotCi12b2lkIENodW5rRGVtdXhlclN0cmVhbTo6Q2FuY2VsRW5kT2ZTdHJlYW0oKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gIERDSEVDSyhlbmRfb2Zfc3RyZWFtXyk7Ci0gIGVuZF9vZl9zdHJlYW1fID0gZmFsc2U7Ci19Ci0KLWJvb2wgQ2h1bmtEZW11eGVyU3RyZWFtOjpDYW5FbmRPZlN0cmVhbSgpIGNvbnN0IHsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgcmV0dXJuIHN0cmVhbV8tPklzRW5kU2VsZWN0ZWQoKTsKLX0KLQotdm9pZCBDaHVua0RlbXV4ZXJTdHJlYW06OlNodXRkb3duKCkgewotICBSZWFkQ0JRdWV1ZSByZWFkX2NiczsKLSAgewotICAgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gICAgQ2hhbmdlU3RhdGVfTG9ja2VkKFNIVVRET1dOKTsKLSAgICBzdGQ6OnN3YXAocmVhZF9jYnNfLCByZWFkX2Nicyk7Ci0gIH0KLQotICAvLyBQYXNzIGVuZCBvZiBzdHJlYW0gYnVmZmVycyB0byBhbGwgY2FsbGJhY2tzIHRvIHNpZ25hbCB0aGF0IG5vIG1vcmUgZGF0YQotICAvLyB3aWxsIGJlIHNlbnQuCi0gIGZvciAoUmVhZENCUXVldWU6Oml0ZXJhdG9yIGl0ID0gcmVhZF9jYnMuYmVnaW4oKTsgaXQgIT0gcmVhZF9jYnMuZW5kKCk7ICsraXQpCi0gICAgaXQtPlJ1bihEZW11eGVyU3RyZWFtOjprT2ssIFN0cmVhbVBhcnNlckJ1ZmZlcjo6Q3JlYXRlRU9TQnVmZmVyKCkpOwotfQotCi0vLyBIZWxwZXIgZnVuY3Rpb24gdGhhdCBtYWtlcyBzdXJlIHxyZWFkX2NifCBydW5zIG9uIHxtZXNzYWdlX2xvb3BfcHJveHl8Lgotc3RhdGljIHZvaWQgUnVuT25NZXNzYWdlTG9vcCgKLSAgICBjb25zdCBEZW11eGVyU3RyZWFtOjpSZWFkQ0ImIHJlYWRfY2IsCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbWVzc2FnZV9sb29wX3Byb3h5LAotICAgIERlbXV4ZXJTdHJlYW06OlN0YXR1cyBzdGF0dXMsCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgYnVmZmVyKSB7Ci0gIGlmICghbWVzc2FnZV9sb29wX3Byb3h5LT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpIHsKLSAgICBtZXNzYWdlX2xvb3BfcHJveHktPlBvc3RUYXNrKEZST01fSEVSRSwgYmFzZTo6QmluZCgKLSAgICAgICAgJlJ1bk9uTWVzc2FnZUxvb3AsIHJlYWRfY2IsIG1lc3NhZ2VfbG9vcF9wcm94eSwgc3RhdHVzLCBidWZmZXIpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICByZWFkX2NiLlJ1bihzdGF0dXMsIGJ1ZmZlcik7Ci19Ci0KLS8vIERlbXV4ZXJTdHJlYW0gbWV0aG9kcy4KLXZvaWQgQ2h1bmtEZW11eGVyU3RyZWFtOjpSZWFkKGNvbnN0IFJlYWRDQiYgcmVhZF9jYikgewotICBEZW11eGVyU3RyZWFtOjpTdGF0dXMgc3RhdHVzID0ga09rOwotICBzY29wZWRfcmVmcHRyPFN0cmVhbVBhcnNlckJ1ZmZlcj4gYnVmZmVyOwotICB7Ci0gICAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgICBpZiAoIXJlYWRfY2JzXy5lbXB0eSgpIHx8ICFHZXROZXh0QnVmZmVyX0xvY2tlZCgmc3RhdHVzLCAmYnVmZmVyKSkgewotICAgICAgRGVmZXJSZWFkX0xvY2tlZChyZWFkX2NiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotI2lmIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLSAgcmVhZF9jYi5SdW4oCi0gICAgICBzdGF0dXMsCi0gICAgICBTaGVsbE1lZGlhUGxhdGZvcm06Okluc3RhbmNlKCktPlByb2Nlc3NCZWZvcmVMZWF2aW5nRGVtdXhlcihidWZmZXIpKTsKLSNlbHNlICAvLyBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0gIHJlYWRfY2IuUnVuKHN0YXR1cywgYnVmZmVyKTsKLSNlbmRpZiAgLy8gZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotfQotCi1EZW11eGVyU3RyZWFtOjpUeXBlIENodW5rRGVtdXhlclN0cmVhbTo6dHlwZSgpIHsgcmV0dXJuIHR5cGVfOyB9Ci0KLXZvaWQgQ2h1bmtEZW11eGVyU3RyZWFtOjpFbmFibGVCaXRzdHJlYW1Db252ZXJ0ZXIoKSB7fQotCi1jb25zdCBBdWRpb0RlY29kZXJDb25maWcmIENodW5rRGVtdXhlclN0cmVhbTo6YXVkaW9fZGVjb2Rlcl9jb25maWcoKSB7Ci0gIENIRUNLX0VRKHR5cGVfLCBBVURJTyk7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gIHJldHVybiBzdHJlYW1fLT5HZXRDdXJyZW50QXVkaW9EZWNvZGVyQ29uZmlnKCk7Ci19Ci0KLWNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgQ2h1bmtEZW11eGVyU3RyZWFtOjp2aWRlb19kZWNvZGVyX2NvbmZpZygpIHsKLSAgQ0hFQ0tfRVEodHlwZV8sIFZJREVPKTsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgcmV0dXJuIHN0cmVhbV8tPkdldEN1cnJlbnRWaWRlb0RlY29kZXJDb25maWcoKTsKLX0KLQotdm9pZCBDaHVua0RlbXV4ZXJTdHJlYW06OkNoYW5nZVN0YXRlX0xvY2tlZChTdGF0ZSBzdGF0ZSkgewotICBsb2NrXy5Bc3NlcnRBY3F1aXJlZCgpOwotICBEVkxPRygxKSA8PCAiQ2h1bmtEZW11eGVyU3RyZWFtOjpDaGFuZ2VTdGF0ZV9Mb2NrZWQoKSA6ICIKLSAgICAgICAgICAgPDwgInR5cGUgIiA8PCB0eXBlXwotICAgICAgICAgICA8PCAiIC0gIiA8PCBzdGF0ZV8gPDwgIiAtPiAiIDw8IHN0YXRlOwotICBzdGF0ZV8gPSBzdGF0ZTsKLX0KLQotQ2h1bmtEZW11eGVyU3RyZWFtOjp+Q2h1bmtEZW11eGVyU3RyZWFtKCkge30KLQotdm9pZCBDaHVua0RlbXV4ZXJTdHJlYW06OkRlZmVyUmVhZF9Mb2NrZWQoY29uc3QgUmVhZENCJiByZWFkX2NiKSB7Ci0gIGxvY2tfLkFzc2VydEFjcXVpcmVkKCk7Ci0gIC8vIFdyYXAgJiBzdG9yZSB8cmVhZF9jYnwgc28gdGhhdCBpdCB3aWxsCi0gIC8vIGdldCBjYWxsZWQgb24gdGhlIGN1cnJlbnQgTWVzc2FnZUxvb3AuCi0gIHJlYWRfY2JzXy5wdXNoX2JhY2soYmFzZTo6QmluZCgmUnVuT25NZXNzYWdlTG9vcCwgcmVhZF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk6OmN1cnJlbnQoKSkpOwotfQotCi12b2lkIENodW5rRGVtdXhlclN0cmVhbTo6Q3JlYXRlUmVhZERvbmVDbG9zdXJlc19Mb2NrZWQoQ2xvc3VyZVF1ZXVlKiBjbG9zdXJlcykgewotICBsb2NrXy5Bc3NlcnRBY3F1aXJlZCgpOwotCi0gIGlmIChzdGF0ZV8gIT0gUkVUVVJOSU5HX0RBVEFfRk9SX1JFQURTKQotICAgIHJldHVybjsKLQotICBEZW11eGVyU3RyZWFtOjpTdGF0dXMgc3RhdHVzID0ga09rOwotICBzY29wZWRfcmVmcHRyPFN0cmVhbVBhcnNlckJ1ZmZlcj4gYnVmZmVyOwotICAvLyBXaGVuIHRoZSBzdGF0dXMgaXMga0NvbmZpZ0NoYW5nZWQsIHdlIHNob3VsZCBzdG9wIHRoZSBsb29wLgotICB3aGlsZSAoIXJlYWRfY2JzXy5lbXB0eSgpICYmIHN0YXR1cyAhPSBrQ29uZmlnQ2hhbmdlZCkgewotICAgIGlmICghR2V0TmV4dEJ1ZmZlcl9Mb2NrZWQoJnN0YXR1cywgJmJ1ZmZlcikpCi0gICAgICByZXR1cm47Ci0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICAgIGNsb3N1cmVzLT5wdXNoX2JhY2soYmFzZTo6QmluZCgKLSAgICAgICAgcmVhZF9jYnNfLmZyb250KCksIHN0YXR1cywKLSAgICAgICAgU2hlbGxNZWRpYVBsYXRmb3JtOjpJbnN0YW5jZSgpLT5Qcm9jZXNzQmVmb3JlTGVhdmluZ0RlbXV4ZXIoYnVmZmVyKSkpOwotI2Vsc2UgIC8vIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLSAgICBjbG9zdXJlcy0+cHVzaF9iYWNrKGJhc2U6OkJpbmQocmVhZF9jYnNfLmZyb250KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYnVmZmVyKSk7Ci0jZW5kaWYgIC8vIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLSAgICByZWFkX2Nic18ucG9wX2Zyb250KCk7Ci0gIH0KLX0KLQotYm9vbCBDaHVua0RlbXV4ZXJTdHJlYW06OkdldE5leHRCdWZmZXJfTG9ja2VkKAotICAgIERlbXV4ZXJTdHJlYW06OlN0YXR1cyogc3RhdHVzLAotICAgIHNjb3BlZF9yZWZwdHI8U3RyZWFtUGFyc2VyQnVmZmVyPiogYnVmZmVyKSB7Ci0gIGxvY2tfLkFzc2VydEFjcXVpcmVkKCk7Ci0KLSAgc3dpdGNoIChzdGF0ZV8pIHsKLSAgICBjYXNlIFJFVFVSTklOR19EQVRBX0ZPUl9SRUFEUzoKLSAgICAgIHN3aXRjaCAoc3RyZWFtXy0+R2V0TmV4dEJ1ZmZlcihidWZmZXIpKSB7Ci0gICAgICAgIGNhc2UgU291cmNlQnVmZmVyU3RyZWFtOjprU3VjY2VzczoKLSAgICAgICAgICAqc3RhdHVzID0gRGVtdXhlclN0cmVhbTo6a09rOwotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBjYXNlIFNvdXJjZUJ1ZmZlclN0cmVhbTo6a05lZWRCdWZmZXI6Ci0gICAgICAgICAgaWYgKGVuZF9vZl9zdHJlYW1fKSB7Ci0gICAgICAgICAgICAqc3RhdHVzID0gRGVtdXhlclN0cmVhbTo6a09rOwotICAgICAgICAgICAgKmJ1ZmZlciA9IFN0cmVhbVBhcnNlckJ1ZmZlcjo6Q3JlYXRlRU9TQnVmZmVyKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjYXNlIFNvdXJjZUJ1ZmZlclN0cmVhbTo6a0NvbmZpZ0NoYW5nZToKLSAgICAgICAgICBEVkxPRygyKSA8PCAiQ29uZmlnIGNoYW5nZSByZXBvcnRlZCB0byBDaHVua0RlbXV4ZXJTdHJlYW0uIjsKLSAgICAgICAgICAqc3RhdHVzID0ga0NvbmZpZ0NoYW5nZWQ7Ci0gICAgICAgICAgKmJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENBTkNFTEVEOgotICAgIGNhc2UgV0FJVElOR19GT1JfU0VFSzoKLSAgICAgIC8vIE51bGwgYnVmZmVycyBzaG91bGQgYmUgcmV0dXJuZWQgaW4gdGhpcyBzdGF0ZSBzaW5jZSB3ZSBhcmUgd2FpdGluZwotICAgICAgLy8gZm9yIGEgc2Vlay4gQW55IGJ1ZmZlcnMgaW4gdGhlIFNvdXJjZUJ1ZmZlciBzaG91bGQgTk9UIGJlIHJldHVybmVkCi0gICAgICAvLyBiZWNhdXNlIHRoZXkgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2Vlay4KLSAgICAgIERDSEVDSyhyZWFkX2Nic18uZW1wdHkoKSk7Ci0gICAgICAqc3RhdHVzID0gRGVtdXhlclN0cmVhbTo6a0Fib3J0ZWQ7Ci0gICAgICAqYnVmZmVyID0gTlVMTDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgU0hVVERPV046Ci0gICAgICBEQ0hFQ0socmVhZF9jYnNfLmVtcHR5KCkpOwotICAgICAgKnN0YXR1cyA9IERlbXV4ZXJTdHJlYW06OmtPazsKLSAgICAgICpidWZmZXIgPSBTdHJlYW1QYXJzZXJCdWZmZXI6OkNyZWF0ZUVPU0J1ZmZlcigpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBOT1RSRUFDSEVEKCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotI2lmIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLWJvb2wgQ2h1bmtEZW11eGVyU3RyZWFtOjpTdHJlYW1XYXNFbmNyeXB0ZWQoKSBjb25zdCB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gIGlmICh0eXBlXyA9PSBWSURFTykKLSAgICByZXR1cm4gc3RyZWFtXy0+R2V0Q3VycmVudFZpZGVvRGVjb2RlckNvbmZpZygpLmlzX2VuY3J5cHRlZCgpOwotICBlbHNlIGlmICh0eXBlXyA9PSBBVURJTykKLSAgICByZXR1cm4gc3RyZWFtXy0+R2V0Q3VycmVudEF1ZGlvRGVjb2RlckNvbmZpZygpLmlzX2VuY3J5cHRlZCgpOwotCi0gIE5PVFJFQUNIRUQoKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0jZW5kaWYKLQotQ2h1bmtEZW11eGVyOjpDaHVua0RlbXV4ZXIoY29uc3QgYmFzZTo6Q2xvc3VyZSYgb3Blbl9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5lZWRLZXlDQiYgbmVlZF9rZXlfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2dDQiYgbG9nX2NiKQotICAgIDogc3RhdGVfKFdBSVRJTkdfRk9SX0lOSVQpLAotICAgICAgZGVsYXllZF9hdWRpb19zZWVrXyhmYWxzZSksCi0gICAgICBob3N0XyhOVUxMKSwKLSAgICAgIG9wZW5fY2JfKG9wZW5fY2IpLAotICAgICAgbmVlZF9rZXlfY2JfKG5lZWRfa2V5X2NiKSwKLSAgICAgIGxvZ19jYl8obG9nX2NiKSwKLSAgICAgIGR1cmF0aW9uXyhrTm9UaW1lc3RhbXAoKSksCi0gICAgICB1c2VyX3NwZWNpZmllZF9kdXJhdGlvbl8oLTEpIHsKLSAgRENIRUNLKCFvcGVuX2NiXy5pc19udWxsKCkpOwotICBEQ0hFQ0soIW5lZWRfa2V5X2NiXy5pc19udWxsKCkpOwotfQotCi12b2lkIENodW5rRGVtdXhlcjo6SW5pdGlhbGl6ZShEZW11eGVySG9zdCogaG9zdCwgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgY2IpIHsKLSAgRFZMT0coMSkgPDwgIkluaXQoKSI7Ci0KLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0gIERMT0coSU5GTykgPDwgInRoaXMgaXMgYSBNRURJQSBTT1VSQ0UgcGxheWJhY2suIjsKLSNlbmRpZgotCi0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0KLSAgaWYgKHN0YXRlXyA9PSBTSFVURE9XTikgewotICAgIGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk6OmN1cnJlbnQoKS0+UG9zdFRhc2soRlJPTV9IRVJFLCBiYXNlOjpCaW5kKAotICAgICAgICBjYiwgREVNVVhFUl9FUlJPUl9DT1VMRF9OT1RfT1BFTikpOwotICAgIHJldHVybjsKLSAgfQotICBEQ0hFQ0tfRVEoc3RhdGVfLCBXQUlUSU5HX0ZPUl9JTklUKTsKLSAgaG9zdF8gPSBob3N0OwotCi0gIENoYW5nZVN0YXRlX0xvY2tlZChJTklUSUFMSVpJTkcpOwotICBpbml0X2NiXyA9IGNiOwotCi0gIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZvcGVuX2NiXykuUnVuKCk7Ci19Ci0KLXZvaWQgQ2h1bmtEZW11eGVyOjpTdG9wKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSB7Ci0gIERWTE9HKDEpIDw8ICJTdG9wKCkiOwotICBTaHV0ZG93bigpOwotICBjYWxsYmFjay5SdW4oKTsKLX0KLQotdm9pZCBDaHVua0RlbXV4ZXI6OlNlZWsoVGltZURlbHRhIHRpbWUsIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGNiKSB7Ci0gIERWTE9HKDEpIDw8ICJTZWVrKCIgPDwgdGltZS5JblNlY29uZHNGKCkgPDwgIikiOwotICBEQ0hFQ0sodGltZSA+PSBUaW1lRGVsdGEoKSk7Ci0gIERDSEVDSyhzZWVrX2NiXy5pc19udWxsKCkpOwotCi0gIFBpcGVsaW5lU3RhdHVzIHN0YXR1cyA9IFBJUEVMSU5FX0VSUk9SX0lOVkFMSURfU1RBVEU7Ci0gIHsKLSAgICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotCi0gICAgaWYgKHN0YXRlXyA9PSBJTklUSUFMSVpFRCB8fCBzdGF0ZV8gPT0gRU5ERUQpIHsKLSAgICAgIGlmICh2aWRlb18pCi0gICAgICAgIHZpZGVvXy0+U2Vlayh0aW1lKTsKLSNpZiBkZWZpbmVkKENIVU5LX0RFTVVYRVJfU0VFS19UT19LRVlGUkFNRSkKLSAgICAgIC8vIFdlIG9ubHkgbmVlZCB0byBkbyBhIGRlbGF5ZWQgYXVkaW8gc2VlayB3aGVuIHRoZXJlIGFyZSBib3RoIGF1ZGlvIGFuZAotICAgICAgLy8gdmlkZW8gc3RyZWFtcyBhbmQgdGhlIHNlZWsgb24gdGhlIHZpZGVvIHN0cmVhbSBpcyBwZW5kaW5nLgotICAgICAgZGVsYXllZF9hdWRpb19zZWVrXyA9IGF1ZGlvXyAmJiB2aWRlb18gJiYgdmlkZW9fLT5Jc1NlZWtQZW5kaW5nKCk7Ci0gICAgICBpZiAoYXVkaW9fICYmICFkZWxheWVkX2F1ZGlvX3NlZWtfKSB7Ci0gICAgICAgIGF1ZGlvXy0+U2Vlayh2aWRlb18tPkdldFNlZWtLZXlmcmFtZVRpbWVzdGFtcCgpKTsKLSAgICAgIH0KLSNlbHNlICAgLy8gZGVmaW5lZChDSFVOS19ERU1VWEVSX1NFRUtfVE9fS0VZRlJBTUUpCi0gICAgICBpZiAoYXVkaW9fKQotICAgICAgICBhdWRpb18tPlNlZWsodGltZSk7Ci0jZW5kaWYgIC8vIGRlZmluZWQoQ0hVTktfREVNVVhFUl9TRUVLX1RPX0tFWUZSQU1FKQotCi0gICAgICBpZiAoSXNTZWVrUGVuZGluZ19Mb2NrZWQoKSkgewotICAgICAgICBEVkxPRygxKSA8PCAiU2VlaygpIDogd2FpdGluZyBmb3IgbW9yZSBkYXRhIHRvIGFycml2ZS4iOwotICAgICAgICBzZWVrX2NiXyA9IGNiOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHN0YXR1cyA9IFBJUEVMSU5FX09LOwotICAgIH0KLSAgfQotCi0gIGNiLlJ1bihzdGF0dXMpOwotfQotCi12b2lkIENodW5rRGVtdXhlcjo6T25BdWRpb1JlbmRlcmVyRGlzYWJsZWQoKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gIGF1ZGlvXyA9IE5VTEw7Ci19Ci0KLS8vIERlbXV4ZXIgaW1wbGVtZW50YXRpb24uCi1zY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IENodW5rRGVtdXhlcjo6R2V0U3RyZWFtKAotICAgIERlbXV4ZXJTdHJlYW06OlR5cGUgdHlwZSkgewotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICBpZiAodHlwZSA9PSBEZW11eGVyU3RyZWFtOjpWSURFTykKLSAgICByZXR1cm4gdmlkZW9fOwotCi0gIGlmICh0eXBlID09IERlbXV4ZXJTdHJlYW06OkFVRElPKQotICAgIHJldHVybiBhdWRpb187Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLVRpbWVEZWx0YSBDaHVua0RlbXV4ZXI6OkdldFN0YXJ0VGltZSgpIGNvbnN0IHsKLSAgcmV0dXJuIFRpbWVEZWx0YSgpOwotfQotCi12b2lkIENodW5rRGVtdXhlcjo6U3RhcnRXYWl0aW5nRm9yU2VlaygpIHsKLSAgRFZMT0coMSkgPDwgIlN0YXJ0V2FpdGluZ0ZvclNlZWsoKSI7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gIERDSEVDSyhzdGF0ZV8gPT0gSU5JVElBTElaRUQgfHwgc3RhdGVfID09IEVOREVEIHx8IHN0YXRlXyA9PSBTSFVURE9XTik7Ci0KLSAgaWYgKHN0YXRlXyA9PSBTSFVURE9XTikKLSAgICByZXR1cm47Ci0KLSAgaWYgKGF1ZGlvXykKLSAgICBhdWRpb18tPlN0YXJ0V2FpdGluZ0ZvclNlZWsoKTsKLQotICBpZiAodmlkZW9fKQotICAgIHZpZGVvXy0+U3RhcnRXYWl0aW5nRm9yU2VlaygpOwotfQotCi12b2lkIENodW5rRGVtdXhlcjo6Q2FuY2VsUGVuZGluZ1NlZWsoKSB7Ci0gIFBpcGVsaW5lU3RhdHVzQ0IgY2I7Ci0gIHsKLSAgICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICAgIGlmIChJc1NlZWtQZW5kaW5nX0xvY2tlZCgpICYmICFzZWVrX2NiXy5pc19udWxsKCkpIHsKLSAgICAgIHN0ZDo6c3dhcChjYiwgc2Vla19jYl8pOwotICAgIH0KLSAgICBpZiAoYXVkaW9fKQotICAgICAgYXVkaW9fLT5DYW5jZWxQZW5kaW5nU2VlaygpOwotCi0gICAgaWYgKHZpZGVvXykKLSAgICAgIHZpZGVvXy0+Q2FuY2VsUGVuZGluZ1NlZWsoKTsKLSAgfQotCi0gIGlmICghY2IuaXNfbnVsbCgpKQotICAgIGNiLlJ1bihQSVBFTElORV9PSyk7Ci19Ci0KLUNodW5rRGVtdXhlcjo6U3RhdHVzIENodW5rRGVtdXhlcjo6QWRkSWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjb2RlY3MpIHsKLSAgRENIRUNLX0dUKGNvZGVjcy5zaXplKCksIDB1KTsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLQotICBpZiAoKHN0YXRlXyAhPSBXQUlUSU5HX0ZPUl9JTklUICYmIHN0YXRlXyAhPSBJTklUSUFMSVpJTkcpIHx8Ci0gICAgICBzdHJlYW1fcGFyc2VyX21hcF8uY291bnQoaWQpID4gMHUpCi0gICAgcmV0dXJuIGtSZWFjaGVkSWRMaW1pdDsKLQotICBib29sIGhhc19hdWRpbyA9IGZhbHNlOwotICBib29sIGhhc192aWRlbyA9IGZhbHNlOwotICBQYXJzZXJGYWN0b3J5RnVuY3Rpb24gZmFjdG9yeV9mdW5jdGlvbiA9IE5VTEw7Ci0gIHN0ZDo6c3RyaW5nIGVycm9yOwotICBpZiAoIUlzU3VwcG9ydGVkKHR5cGUsIGNvZGVjcywgbG9nX2NiXywgJmZhY3RvcnlfZnVuY3Rpb24sICZoYXNfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgJmhhc192aWRlbykpIHsKLSAgICByZXR1cm4ga05vdFN1cHBvcnRlZDsKLSAgfQotCi0gIGlmICgoaGFzX2F1ZGlvICYmICFzb3VyY2VfaWRfYXVkaW9fLmVtcHR5KCkpIHx8Ci0gICAgICAoaGFzX3ZpZGVvICYmICFzb3VyY2VfaWRfdmlkZW9fLmVtcHR5KCkpKQotICAgIHJldHVybiBrUmVhY2hlZElkTGltaXQ7Ci0KLSAgU3RyZWFtUGFyc2VyOjpOZXdCdWZmZXJzQ0IgYXVkaW9fY2I7Ci0gIFN0cmVhbVBhcnNlcjo6TmV3QnVmZmVyc0NCIHZpZGVvX2NiOwotCi0gIGlmIChoYXNfYXVkaW8pIHsKLSAgICBzb3VyY2VfaWRfYXVkaW9fID0gaWQ7Ci0gICAgYXVkaW9fY2IgPSBiYXNlOjpCaW5kKCZDaHVua0RlbXV4ZXI6Ok9uQXVkaW9CdWZmZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKTsKLSAgfQotCi0gIGlmIChoYXNfdmlkZW8pIHsKLSAgICBzb3VyY2VfaWRfdmlkZW9fID0gaWQ7Ci0gICAgdmlkZW9fY2IgPSBiYXNlOjpCaW5kKCZDaHVua0RlbXV4ZXI6Ok9uVmlkZW9CdWZmZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKTsKLSAgfQotCi0gIHNjb3BlZF9wdHI8U3RyZWFtUGFyc2VyPiBzdHJlYW1fcGFyc2VyKGZhY3RvcnlfZnVuY3Rpb24oY29kZWNzKSk7Ci0gIENIRUNLKHN0cmVhbV9wYXJzZXIuZ2V0KCkpOwotCi0gIHN0cmVhbV9wYXJzZXItPkluaXQoCi0gICAgICBiYXNlOjpCaW5kKCZDaHVua0RlbXV4ZXI6Ok9uU3RyZWFtUGFyc2VySW5pdERvbmUsIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAotICAgICAgYmFzZTo6QmluZCgmQ2h1bmtEZW11eGVyOjpPbk5ld0NvbmZpZ3MsIGJhc2U6OlVucmV0YWluZWQodGhpcyksCi0gICAgICAgICAgICAgICAgIGhhc19hdWRpbywgaGFzX3ZpZGVvKSwKLSAgICAgIGF1ZGlvX2NiLAotICAgICAgdmlkZW9fY2IsCi0gICAgICBiYXNlOjpCaW5kKCZDaHVua0RlbXV4ZXI6Ok9uTmVlZEtleSwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICBiYXNlOjpCaW5kKCZDaHVua0RlbXV4ZXI6Ok9uTmV3TWVkaWFTZWdtZW50LCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLCBpZCksCi0gICAgICBiYXNlOjpCaW5kKCZDaHVua0RlbXV4ZXI6Ok9uRW5kT2ZNZWRpYVNlZ21lbnQsCi0gICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksIGlkKSwKLSAgICAgIGxvZ19jYl8pOwotCi0gIHN0cmVhbV9wYXJzZXJfbWFwX1tpZF0gPSBzdHJlYW1fcGFyc2VyLnJlbGVhc2UoKTsKLSAgU291cmNlSW5mbyBpbmZvID0geyBiYXNlOjpUaW1lRGVsdGEoKSwgdHJ1ZSB9OwotICBzb3VyY2VfaW5mb19tYXBfW2lkXSA9IGluZm87Ci0KLSAgcmV0dXJuIGtPazsKLX0KLQotdm9pZCBDaHVua0RlbXV4ZXI6OlJlbW92ZUlkKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCkgewotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICBDSEVDSyhJc1ZhbGlkSWQoaWQpKTsKLQotICBkZWxldGUgc3RyZWFtX3BhcnNlcl9tYXBfW2lkXTsKLSAgc3RyZWFtX3BhcnNlcl9tYXBfLmVyYXNlKGlkKTsKLSAgc291cmNlX2luZm9fbWFwXy5lcmFzZShpZCk7Ci0KLSAgaWYgKHNvdXJjZV9pZF9hdWRpb18gPT0gaWQpIHsKLSAgICBpZiAoYXVkaW9fKQotICAgICAgYXVkaW9fLT5TaHV0ZG93bigpOwotICAgIHNvdXJjZV9pZF9hdWRpb18uY2xlYXIoKTsKLSAgfQotCi0gIGlmIChzb3VyY2VfaWRfdmlkZW9fID09IGlkKSB7Ci0gICAgaWYgKHZpZGVvXykKLSAgICAgIHZpZGVvXy0+U2h1dGRvd24oKTsKLSAgICBzb3VyY2VfaWRfdmlkZW9fLmNsZWFyKCk7Ci0gIH0KLX0KLQotUmFuZ2VzPFRpbWVEZWx0YT4gQ2h1bmtEZW11eGVyOjpHZXRCdWZmZXJlZFJhbmdlcyhjb25zdCBzdGQ6OnN0cmluZyYgaWQpIGNvbnN0IHsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgRENIRUNLKCFpZC5lbXB0eSgpKTsKLSAgRENIRUNLKElzVmFsaWRJZChpZCkpOwotICBEQ0hFQ0soaWQgPT0gc291cmNlX2lkX2F1ZGlvXyB8fCBpZCA9PSBzb3VyY2VfaWRfdmlkZW9fKTsKLQotICBpZiAoaWQgPT0gc291cmNlX2lkX2F1ZGlvXyAmJiBpZCAhPSBzb3VyY2VfaWRfdmlkZW9fKSB7Ci0gICAgLy8gT25seSBpbmNsdWRlIHJhbmdlcyB0aGF0IGhhdmUgYmVlbiBidWZmZXJlZCBpbiB8YXVkaW9ffAotICAgIHJldHVybiBhdWRpb18gPyBhdWRpb18tPkdldEJ1ZmZlcmVkUmFuZ2VzKGR1cmF0aW9uXykgOiBSYW5nZXM8VGltZURlbHRhPigpOwotICB9Ci0KLSAgaWYgKGlkICE9IHNvdXJjZV9pZF9hdWRpb18gJiYgaWQgPT0gc291cmNlX2lkX3ZpZGVvXykgewotICAgIC8vIE9ubHkgaW5jbHVkZSByYW5nZXMgdGhhdCBoYXZlIGJlZW4gYnVmZmVyZWQgaW4gfHZpZGVvX3wKLSAgICByZXR1cm4gdmlkZW9fID8gdmlkZW9fLT5HZXRCdWZmZXJlZFJhbmdlcyhkdXJhdGlvbl8pIDogUmFuZ2VzPFRpbWVEZWx0YT4oKTsKLSAgfQotCi0gIHJldHVybiBDb21wdXRlSW50ZXJzZWN0aW9uKCk7Ci19Ci0KLVJhbmdlczxUaW1lRGVsdGE+IENodW5rRGVtdXhlcjo6Q29tcHV0ZUludGVyc2VjdGlvbigpIGNvbnN0IHsKLSAgbG9ja18uQXNzZXJ0QWNxdWlyZWQoKTsKLQotICBpZiAoIWF1ZGlvXyB8fCAhdmlkZW9fKQotICAgIHJldHVybiBSYW5nZXM8VGltZURlbHRhPigpOwotCi0gIC8vIEluY2x1ZGUgcmFuZ2VzIHRoYXQgaGF2ZSBiZWVuIGJ1ZmZlcmVkIGluIGJvdGggfGF1ZGlvX3wgYW5kIHx2aWRlb198LgotICBSYW5nZXM8VGltZURlbHRhPiBhdWRpb19yYW5nZXMgPSBhdWRpb18tPkdldEJ1ZmZlcmVkUmFuZ2VzKGR1cmF0aW9uXyk7Ci0gIFJhbmdlczxUaW1lRGVsdGE+IHZpZGVvX3JhbmdlcyA9IHZpZGVvXy0+R2V0QnVmZmVyZWRSYW5nZXMoZHVyYXRpb25fKTsKLSAgUmFuZ2VzPFRpbWVEZWx0YT4gcmVzdWx0ID0gYXVkaW9fcmFuZ2VzLkludGVyc2VjdGlvbldpdGgodmlkZW9fcmFuZ2VzKTsKLQotICBpZiAoc3RhdGVfID09IEVOREVEICYmIHJlc3VsdC5zaXplKCkgPiAwKSB7Ci0gICAgLy8gSWYgYXBwZW5kaW5nIGhhcyBlbmRlZCwgZXh0ZW5kIHRoZSBsYXN0IGludGVyc2VjdGlvbiByYW5nZSB0byBpbmNsdWRlIHRoZQotICAgIC8vIG1heCBlbmQgdGltZSBvZiB0aGUgbGFzdCBhdWRpby92aWRlbyByYW5nZS4gVGhpcyBhbGxvd3MgdGhlIGJ1ZmZlcmVkCi0gICAgLy8gaW5mb3JtYXRpb24gdG8gbWF0Y2ggdGhlIGFjdHVhbCB0aW1lIHJhbmdlIHRoYXQgd2lsbCBnZXQgcGxheWVkIG91dCBpZgotICAgIC8vIHRoZSBzdHJlYW1zIGhhdmUgc2xpZ2h0bHkgZGlmZmVyZW50IGxlbmd0aHMuCi0gICAgVGltZURlbHRhIGF1ZGlvX3N0YXJ0ID0gYXVkaW9fcmFuZ2VzLnN0YXJ0KGF1ZGlvX3Jhbmdlcy5zaXplKCkgLSAxKTsKLSAgICBUaW1lRGVsdGEgYXVkaW9fZW5kID0gYXVkaW9fcmFuZ2VzLmVuZChhdWRpb19yYW5nZXMuc2l6ZSgpIC0gMSk7Ci0gICAgVGltZURlbHRhIHZpZGVvX3N0YXJ0ID0gdmlkZW9fcmFuZ2VzLnN0YXJ0KHZpZGVvX3Jhbmdlcy5zaXplKCkgLSAxKTsKLSAgICBUaW1lRGVsdGEgdmlkZW9fZW5kID0gdmlkZW9fcmFuZ2VzLmVuZCh2aWRlb19yYW5nZXMuc2l6ZSgpIC0gMSk7Ci0KLSAgICAvLyBWZXJpZnkgdGhlIGxhc3QgYXVkaW8gcmFuZ2Ugb3ZlcmxhcHMgd2l0aCB0aGUgbGFzdCB2aWRlbyByYW5nZS4KLSAgICAvLyBUaGlzIGlzIGVuZm9yY2VkIGJ5IHRoZSBsb2dpYyB0aGF0IGNvbnRyb2xzIHRoZSB0cmFuc2l0aW9uIHRvIEVOREVELgotICAgIERDSEVDSygoYXVkaW9fc3RhcnQgPD0gdmlkZW9fc3RhcnQgJiYgdmlkZW9fc3RhcnQgPD0gYXVkaW9fZW5kKSB8fAotICAgICAgICAgICAodmlkZW9fc3RhcnQgPD0gYXVkaW9fc3RhcnQgJiYgYXVkaW9fc3RhcnQgPD0gdmlkZW9fZW5kKSk7Ci0gICAgcmVzdWx0LkFkZChyZXN1bHQuZW5kKHJlc3VsdC5zaXplKCktMSksIHN0ZDo6bWF4KGF1ZGlvX2VuZCwgdmlkZW9fZW5kKSk7Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1ib29sIENodW5rRGVtdXhlcjo6QXBwZW5kRGF0YShjb25zdCBzdGQ6OnN0cmluZyYgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpIHsKLSAgRFZMT0coMSkgPDwgIkFwcGVuZERhdGEoIiA8PCBpZCA8PCAiLCAiIDw8IGxlbmd0aCA8PCAiKSI7Ci0KLSNpZiBMT0dfTUVESUFfU09VUkNFX0FDVElWSVRJRVMKLSAgTE9HKElORk8pIDw8ICI9PT09PT09PSBhcHBlbmQgIiA8PCBsZW5ndGggPDwgIiBieXRlcyB0byBzdHJlYW0gIiA8PCBpZAotICAgICAgICAgICAgPDwgIiA9PT09PT09PSI7Ci0jZW5kaWYgIC8vIExPR19NRURJQV9TT1VSQ0VfQUNUSVZJVElFUwotCi0gIERDSEVDSyghaWQuZW1wdHkoKSk7Ci0KLSAgUmFuZ2VzPFRpbWVEZWx0YT4gcmFuZ2VzOwotCi0gIFBpcGVsaW5lU3RhdHVzQ0IgY2I7Ci0gIHsKLSAgICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotCi0gICAgLy8gQ2FwdHVyZSBpZiB0aGUgU291cmNlQnVmZmVyIGhhcyBhIHBlbmRpbmcgc2VlayBiZWZvcmUgd2Ugc3RhcnQgcGFyc2luZy4KLSAgICBib29sIG9sZF9zZWVrX3BlbmRpbmcgPSBJc1NlZWtQZW5kaW5nX0xvY2tlZCgpOwotCi0gICAgaWYgKHN0YXRlXyA9PSBFTkRFRCkgewotICAgICAgQ2hhbmdlU3RhdGVfTG9ja2VkKElOSVRJQUxJWkVEKTsKLQotICAgICAgaWYgKGF1ZGlvXykKLSAgICAgICAgYXVkaW9fLT5DYW5jZWxFbmRPZlN0cmVhbSgpOwotCi0gICAgICBpZiAodmlkZW9fKQotICAgICAgICB2aWRlb18tPkNhbmNlbEVuZE9mU3RyZWFtKCk7Ci0gICAgfQotCi0gICAgaWYgKGxlbmd0aCA9PSAwdSkKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgRENIRUNLKGRhdGEpOwotCi0gICAgc3dpdGNoIChzdGF0ZV8pIHsKLSAgICAgIGNhc2UgSU5JVElBTElaSU5HOgotICAgICAgICBEQ0hFQ0soSXNWYWxpZElkKGlkKSk7Ci0gICAgICAgIGlmICghc3RyZWFtX3BhcnNlcl9tYXBfW2lkXS0+UGFyc2UoZGF0YSwgbGVuZ3RoKSkgewotICAgICAgICAgIFJlcG9ydEVycm9yX0xvY2tlZChERU1VWEVSX0VSUk9SX0NPVUxEX05PVF9PUEVOKTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBJTklUSUFMSVpFRDogewotICAgICAgICBEQ0hFQ0soSXNWYWxpZElkKGlkKSk7Ci0gICAgICAgIGlmICghc3RyZWFtX3BhcnNlcl9tYXBfW2lkXS0+UGFyc2UoZGF0YSwgbGVuZ3RoKSkgewotICAgICAgICAgIFJlcG9ydEVycm9yX0xvY2tlZChQSVBFTElORV9FUlJPUl9ERUNPREUpOwotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9IGJyZWFrOwotCi0gICAgICBjYXNlIFdBSVRJTkdfRk9SX0lOSVQ6Ci0gICAgICBjYXNlIEVOREVEOgotICAgICAgY2FzZSBQQVJTRV9FUlJPUjoKLSAgICAgIGNhc2UgU0hVVERPV046Ci0gICAgICAgIERWTE9HKDEpIDw8ICJBcHBlbmREYXRhKCk6IGNhbGxlZCBpbiB1bmV4cGVjdGVkIHN0YXRlICIgPDwgc3RhdGVfOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKGRlbGF5ZWRfYXVkaW9fc2Vla18gJiYgIXZpZGVvXy0+SXNTZWVrUGVuZGluZygpKSB7Ci0gICAgICBEQ0hFQ0soYXVkaW9fKTsKLSAgICAgIGF1ZGlvXy0+U2Vlayh2aWRlb18tPkdldFNlZWtLZXlmcmFtZVRpbWVzdGFtcCgpKTsKLSAgICAgIGRlbGF5ZWRfYXVkaW9fc2Vla18gPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBDaGVjayB0byBzZWUgaWYgZGF0YSB3YXMgYXBwZW5kZWQgYXQgdGhlIHBlbmRpbmcgc2VlayBwb2ludC4gVGhpcwotICAgIC8vIGluZGljYXRlcyB3ZSBoYXZlIHBhcnNlZCBlbm91Z2ggZGF0YSB0byBjb21wbGV0ZSB0aGUgc2Vlay4KLSAgICBpZiAob2xkX3NlZWtfcGVuZGluZyAmJiAhSXNTZWVrUGVuZGluZ19Mb2NrZWQoKSAmJiAhc2Vla19jYl8uaXNfbnVsbCgpKSB7Ci0gICAgICBzdGQ6OnN3YXAoY2IsIHNlZWtfY2JfKTsKLSAgICB9Ci0KLSAgICByYW5nZXMgPSBHZXRCdWZmZXJlZFJhbmdlcygpOwotICB9Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByYW5nZXMuc2l6ZSgpOyArK2kpCi0gICAgaG9zdF8tPkFkZEJ1ZmZlcmVkVGltZVJhbmdlKHJhbmdlcy5zdGFydChpKSwgcmFuZ2VzLmVuZChpKSk7Ci0KLSAgaWYgKCFjYi5pc19udWxsKCkpCi0gICAgY2IuUnVuKFBJUEVMSU5FX09LKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBDaHVua0RlbXV4ZXI6OkFib3J0KGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCkgewotICBEVkxPRygxKSA8PCAiQWJvcnQoIiA8PCBpZCA8PCAiKSI7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gIERDSEVDSyghaWQuZW1wdHkoKSk7Ci0gIENIRUNLKElzVmFsaWRJZChpZCkpOwotICBzdHJlYW1fcGFyc2VyX21hcF9baWRdLT5GbHVzaCgpOwotICBzb3VyY2VfaW5mb19tYXBfW2lkXS5jYW5fdXBkYXRlX29mZnNldCA9IHRydWU7Ci19Ci0KLWRvdWJsZSBDaHVua0RlbXV4ZXI6OkdldER1cmF0aW9uKCkgY29uc3QgewotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICByZXR1cm4gR2V0RHVyYXRpb25fTG9ja2VkKCk7Ci19Ci0KLXZvaWQgQ2h1bmtEZW11eGVyOjpTZXREdXJhdGlvbihkb3VibGUgZHVyYXRpb24pIHsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgRFZMT0coMSkgPDwgIlNldER1cmF0aW9uKCIgPDwgZHVyYXRpb24gPDwgIikiOwotICBEQ0hFQ0tfR0UoZHVyYXRpb24sIDApOwotCi0gIGlmIChkdXJhdGlvbiA9PSBHZXREdXJhdGlvbl9Mb2NrZWQoKSkKLSAgICByZXR1cm47Ci0KLSAgLy8gQ29tcHV0ZSAmIGJvdW5kcyBjaGVjayB0aGUgVGltZURlbHRhIHJlcHJlc2VudGF0aW9uIG9mIGR1cmF0aW9uLgotICAvLyBUaGlzIGNhbiBiZSBkaWZmZXJlbnQgaWYgdGhlIHZhbHVlIG9mIHxkdXJhdGlvbnwgZG9lc24ndCBmaXQgdGhlIHJhbmdlIG9yCi0gIC8vIHByZWNpc2lvbiBvZiBUaW1lRGVsdGEuCi0gIFRpbWVEZWx0YSBtaW5fZHVyYXRpb24gPSBUaW1lRGVsdGE6OkZyb21JbnRlcm5hbFZhbHVlKDEpOwotICAvLyBEb24ndCB1c2UgVGltZURlbHRhOjpNYXgoKSBoZXJlLCBhcyB3ZSB3YW50IHRoZSBsYXJnZXN0IGZpbml0ZSB0aW1lIGRlbHRhLgotICBUaW1lRGVsdGEgbWF4X2R1cmF0aW9uID0gVGltZURlbHRhOjpGcm9tSW50ZXJuYWxWYWx1ZShraW50NjRtYXggLSAxKTsKLSAgZG91YmxlIG1pbl9kdXJhdGlvbl9pbl9zZWNvbmRzID0gbWluX2R1cmF0aW9uLkluU2Vjb25kc0YoKTsKLSAgZG91YmxlIG1heF9kdXJhdGlvbl9pbl9zZWNvbmRzID0gbWF4X2R1cmF0aW9uLkluU2Vjb25kc0YoKTsKLQotICBUaW1lRGVsdGEgZHVyYXRpb25fdGQ7Ci0gIGlmIChkdXJhdGlvbiA9PSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpIHsKLSAgICBkdXJhdGlvbl90ZCA9IG1lZGlhOjprSW5maW5pdGVEdXJhdGlvbigpOwotICB9IGVsc2UgaWYgKGR1cmF0aW9uIDwgbWluX2R1cmF0aW9uX2luX3NlY29uZHMpIHsKLSAgICBkdXJhdGlvbl90ZCA9IG1pbl9kdXJhdGlvbjsKLSAgfSBlbHNlIGlmIChkdXJhdGlvbiA+IG1heF9kdXJhdGlvbl9pbl9zZWNvbmRzKSB7Ci0gICAgZHVyYXRpb25fdGQgPSBtYXhfZHVyYXRpb247Ci0gIH0gZWxzZSB7Ci0gICAgZHVyYXRpb25fdGQgPSBUaW1lRGVsdGE6OkZyb21NaWNyb3NlY29uZHMoCi0gICAgICAgIGR1cmF0aW9uICogYmFzZTo6VGltZTo6a01pY3Jvc2Vjb25kc1BlclNlY29uZCk7Ci0gIH0KLQotICBEQ0hFQ0soZHVyYXRpb25fdGQgPiBUaW1lRGVsdGEoKSk7Ci0KLSAgdXNlcl9zcGVjaWZpZWRfZHVyYXRpb25fID0gZHVyYXRpb247Ci0gIGR1cmF0aW9uXyA9IGR1cmF0aW9uX3RkOwotICBob3N0Xy0+U2V0RHVyYXRpb24oZHVyYXRpb25fKTsKLQotICBpZiAoYXVkaW9fKQotICAgIGF1ZGlvXy0+T25TZXREdXJhdGlvbihkdXJhdGlvbl8pOwotCi0gIGlmICh2aWRlb18pCi0gICAgdmlkZW9fLT5PblNldER1cmF0aW9uKGR1cmF0aW9uXyk7Ci19Ci0KLWJvb2wgQ2h1bmtEZW11eGVyOjpTZXRUaW1lc3RhbXBPZmZzZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLCBUaW1lRGVsdGEgb2Zmc2V0KSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gIERWTE9HKDEpIDw8ICJTZXRUaW1lc3RhbXBPZmZzZXQoIiA8PCBpZCA8PCAiLCAiIDw8IG9mZnNldC5JblNlY29uZHNGKCkgPDwgIikiOwotICBDSEVDSyhJc1ZhbGlkSWQoaWQpKTsKLQotICBpZiAoIXNvdXJjZV9pbmZvX21hcF9baWRdLmNhbl91cGRhdGVfb2Zmc2V0KQotICAgIHJldHVybiBmYWxzZTsKLQotICBzb3VyY2VfaW5mb19tYXBfW2lkXS50aW1lc3RhbXBfb2Zmc2V0ID0gb2Zmc2V0OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDaHVua0RlbXV4ZXI6OkVuZE9mU3RyZWFtKFBpcGVsaW5lU3RhdHVzIHN0YXR1cykgewotICBEVkxPRygxKSA8PCAiRW5kT2ZTdHJlYW0oIiA8PCBzdGF0dXMgPDwgIikiOwotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICBEQ0hFQ0tfTkUoc3RhdGVfLCBXQUlUSU5HX0ZPUl9JTklUKTsKLSAgRENIRUNLX05FKHN0YXRlXywgRU5ERUQpOwotCi0gIGlmIChzdGF0ZV8gPT0gU0hVVERPV04gfHwgc3RhdGVfID09IFBBUlNFX0VSUk9SKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChzdGF0ZV8gPT0gSU5JVElBTElaSU5HKSB7Ci0gICAgUmVwb3J0RXJyb3JfTG9ja2VkKERFTVVYRVJfRVJST1JfQ09VTERfTk9UX09QRU4pOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgaWYgKCFDYW5FbmRPZlN0cmVhbV9Mb2NrZWQoKSAmJiBzdGF0dXMgPT0gUElQRUxJTkVfT0spCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChhdWRpb18pCi0gICAgYXVkaW9fLT5FbmRPZlN0cmVhbSgpOwotCi0gIGlmICh2aWRlb18pCi0gICAgdmlkZW9fLT5FbmRPZlN0cmVhbSgpOwotCi0gIGlmIChzdGF0dXMgIT0gUElQRUxJTkVfT0spIHsKLSAgICBSZXBvcnRFcnJvcl9Mb2NrZWQoc3RhdHVzKTsKLSAgfSBlbHNlIHsKLSAgICBDaGFuZ2VTdGF0ZV9Mb2NrZWQoRU5ERUQpOwotICAgIERlY3JlYXNlRHVyYXRpb25JZk5lY2Vzc2FyeSgpOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQ2h1bmtEZW11eGVyOjpTaHV0ZG93bigpIHsKLSAgRFZMT0coMSkgPDwgIlNodXRkb3duKCkiOwotICBQaXBlbGluZVN0YXR1c0NCIGNiOwotICB7Ci0gICAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLQotICAgIGlmIChzdGF0ZV8gPT0gU0hVVERPV04pCi0gICAgICByZXR1cm47Ci0KLSAgICBzdGQ6OnN3YXAoY2IsIHNlZWtfY2JfKTsKLQotICAgIGlmIChhdWRpb18pCi0gICAgICBhdWRpb18tPlNodXRkb3duKCk7Ci0KLSAgICBpZiAodmlkZW9fKQotICAgICAgdmlkZW9fLT5TaHV0ZG93bigpOwotCi0gICAgQ2hhbmdlU3RhdGVfTG9ja2VkKFNIVVRET1dOKTsKLSAgfQotCi0gIGlmICghY2IuaXNfbnVsbCgpKQotICAgIGNiLlJ1bihQSVBFTElORV9FUlJPUl9BQk9SVCk7Ci19Ci0KLXZvaWQgQ2h1bmtEZW11eGVyOjpDaGFuZ2VTdGF0ZV9Mb2NrZWQoU3RhdGUgbmV3X3N0YXRlKSB7Ci0gIGxvY2tfLkFzc2VydEFjcXVpcmVkKCk7Ci0gIERWTE9HKDEpIDw8ICJDaHVua0RlbXV4ZXI6OkNoYW5nZVN0YXRlX0xvY2tlZCgpIDogIgotICAgICAgICAgICA8PCBzdGF0ZV8gPDwgIiAtPiAiIDw8IG5ld19zdGF0ZTsKLSAgc3RhdGVfID0gbmV3X3N0YXRlOwotfQotCi1DaHVua0RlbXV4ZXI6On5DaHVua0RlbXV4ZXIoKSB7Ci0gIERDSEVDS19ORShzdGF0ZV8sIElOSVRJQUxJWkVEKTsKLSAgZm9yIChTdHJlYW1QYXJzZXJNYXA6Oml0ZXJhdG9yIGl0ID0gc3RyZWFtX3BhcnNlcl9tYXBfLmJlZ2luKCk7Ci0gICAgICAgaXQgIT0gc3RyZWFtX3BhcnNlcl9tYXBfLmVuZCgpOyArK2l0KSB7Ci0gICAgZGVsZXRlIGl0LT5zZWNvbmQ7Ci0gIH0KLSAgc3RyZWFtX3BhcnNlcl9tYXBfLmNsZWFyKCk7Ci19Ci0KLXZvaWQgQ2h1bmtEZW11eGVyOjpSZXBvcnRFcnJvcl9Mb2NrZWQoUGlwZWxpbmVTdGF0dXMgZXJyb3IpIHsKLSAgRFZMT0coMSkgPDwgIlJlcG9ydEVycm9yX0xvY2tlZCgiIDw8IGVycm9yIDw8ICIpIjsKLSAgbG9ja18uQXNzZXJ0QWNxdWlyZWQoKTsKLSAgRENIRUNLX05FKGVycm9yLCBQSVBFTElORV9PSyk7Ci0KLSAgQ2hhbmdlU3RhdGVfTG9ja2VkKFBBUlNFX0VSUk9SKTsKLQotICBQaXBlbGluZVN0YXR1c0NCIGNiOwotCi0gIGlmICghaW5pdF9jYl8uaXNfbnVsbCgpKSB7Ci0gICAgc3RkOjpzd2FwKGNiLCBpbml0X2NiXyk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKCFzZWVrX2NiXy5pc19udWxsKCkpCi0gICAgICBzdGQ6OnN3YXAoY2IsIHNlZWtfY2JfKTsKLQotICAgIGlmIChhdWRpb18pCi0gICAgICBhdWRpb18tPlNodXRkb3duKCk7Ci0KLSAgICBpZiAodmlkZW9fKQotICAgICAgdmlkZW9fLT5TaHV0ZG93bigpOwotICB9Ci0KLSAgaWYgKCFjYi5pc19udWxsKCkpIHsKLSAgICBiYXNlOjpBdXRvVW5sb2NrIGF1dG9fdW5sb2NrKGxvY2tfKTsKLSAgICBjYi5SdW4oZXJyb3IpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGJhc2U6OkF1dG9VbmxvY2sgYXV0b191bmxvY2sobG9ja18pOwotICBob3N0Xy0+T25EZW11eGVyRXJyb3IoZXJyb3IpOwotfQotCi1ib29sIENodW5rRGVtdXhlcjo6SXNTZWVrUGVuZGluZ19Mb2NrZWQoKSBjb25zdCB7Ci0gIGxvY2tfLkFzc2VydEFjcXVpcmVkKCk7Ci0gIGJvb2wgc2Vla19wZW5kaW5nID0gZmFsc2U7Ci0KLSAgaWYgKGF1ZGlvXykKLSAgICBzZWVrX3BlbmRpbmcgPSBhdWRpb18tPklzU2Vla1BlbmRpbmcoKTsKLQotICBpZiAoIXNlZWtfcGVuZGluZyAmJiB2aWRlb18pCi0gICAgc2Vla19wZW5kaW5nID0gdmlkZW9fLT5Jc1NlZWtQZW5kaW5nKCk7Ci0KLSAgcmV0dXJuIHNlZWtfcGVuZGluZzsKLX0KLQotYm9vbCBDaHVua0RlbXV4ZXI6OkNhbkVuZE9mU3RyZWFtX0xvY2tlZCgpIGNvbnN0IHsKLSAgbG9ja18uQXNzZXJ0QWNxdWlyZWQoKTsKLSAgcmV0dXJuICghYXVkaW9fIHx8IGF1ZGlvXy0+Q2FuRW5kT2ZTdHJlYW0oKSkgJiYKLSAgICAgICAgICghdmlkZW9fIHx8IHZpZGVvXy0+Q2FuRW5kT2ZTdHJlYW0oKSk7Ci19Ci0KLWRvdWJsZSBDaHVua0RlbXV4ZXI6OkdldER1cmF0aW9uX0xvY2tlZCgpIGNvbnN0IHsKLSAgbG9ja18uQXNzZXJ0QWNxdWlyZWQoKTsKLQotICBpZiAoZHVyYXRpb25fID09IGtOb1RpbWVzdGFtcCgpKQotICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OnF1aWV0X05hTigpOwotCi0gIC8vIFJldHVybiBwb3NpdGl2ZSBpbmZpbml0eSBpZiB0aGUgcmVzb3VyY2UgaXMgdW5ib3VuZGVkLgotICAvLyBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS92aWRlby5odG1sI2RvbS1tZWRpYS1kdXJhdGlvbgotICBpZiAoZHVyYXRpb25fID09IGtJbmZpbml0ZUR1cmF0aW9uKCkpCi0gICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKTsKLQotICBpZiAodXNlcl9zcGVjaWZpZWRfZHVyYXRpb25fID49IDApCi0gICAgcmV0dXJuIHVzZXJfc3BlY2lmaWVkX2R1cmF0aW9uXzsKLQotICByZXR1cm4gZHVyYXRpb25fLkluU2Vjb25kc0YoKTsKLX0KLQotdm9pZCBDaHVua0RlbXV4ZXI6Ok9uU3RyZWFtUGFyc2VySW5pdERvbmUoYm9vbCBzdWNjZXNzLCBUaW1lRGVsdGEgZHVyYXRpb24pIHsKLSAgRFZMT0coMSkgPDwgIk9uU3RyZWFtUGFyc2VySW5pdERvbmUoIiA8PCBzdWNjZXNzIDw8ICIsICIKLSAgICAgICAgICAgPDwgZHVyYXRpb24uSW5TZWNvbmRzRigpIDw8ICIpIjsKLSAgbG9ja18uQXNzZXJ0QWNxdWlyZWQoKTsKLSAgRENIRUNLX0VRKHN0YXRlXywgSU5JVElBTElaSU5HKTsKLSAgaWYgKCFzdWNjZXNzIHx8ICghYXVkaW9fICYmICF2aWRlb18pKSB7Ci0gICAgUmVwb3J0RXJyb3JfTG9ja2VkKERFTVVYRVJfRVJST1JfQ09VTERfTk9UX09QRU4pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChkdXJhdGlvbiAhPSBiYXNlOjpUaW1lRGVsdGEoKSAmJiBkdXJhdGlvbl8gPT0gYmFzZTo6VGltZURlbHRhKCkpCi0gICAgVXBkYXRlRHVyYXRpb24oZHVyYXRpb24pOwotCi0gIC8vIFdhaXQgdW50aWwgYWxsIHN0cmVhbXMgaGF2ZSBpbml0aWFsaXplZC4KLSAgaWYgKCghc291cmNlX2lkX2F1ZGlvXy5lbXB0eSgpICYmICFhdWRpb18pIHx8Ci0gICAgICAoIXNvdXJjZV9pZF92aWRlb18uZW1wdHkoKSAmJiAhdmlkZW9fKSkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGF1ZGlvXykKLSAgICBhdWRpb18tPlNlZWsoVGltZURlbHRhKCkpOwotCi0gIGlmICh2aWRlb18pCi0gICAgdmlkZW9fLT5TZWVrKFRpbWVEZWx0YSgpKTsKLQotICBpZiAoZHVyYXRpb25fID09IGtOb1RpbWVzdGFtcCgpKQotICAgIGR1cmF0aW9uXyA9IGtJbmZpbml0ZUR1cmF0aW9uKCk7Ci0KLSAgLy8gVGhlIGRlbXV4ZXIgaXMgbm93IGluaXRpYWxpemVkIGFmdGVyIHRoZSB8c3RhcnRfdGltZXN0YW1wX3wgd2FzIHNldC4KLSAgQ2hhbmdlU3RhdGVfTG9ja2VkKElOSVRJQUxJWkVEKTsKLSAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJmluaXRfY2JfKS5SdW4oUElQRUxJTkVfT0spOwotfQotCi1ib29sIENodW5rRGVtdXhlcjo6T25OZXdDb25maWdzKGJvb2wgaGFzX2F1ZGlvLCBib29sIGhhc192aWRlbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZWNvZGVyQ29uZmlnJiBhdWRpb19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgdmlkZW9fY29uZmlnKSB7Ci0gIERWTE9HKDEpIDw8ICJPbk5ld0NvbmZpZ3MoIiA8PCBoYXNfYXVkaW8gPDwgIiwgIiA8PCBoYXNfdmlkZW8KLSAgICAgICAgICAgPDwgIiwgIiA8PCBhdWRpb19jb25maWcuSXNWYWxpZENvbmZpZygpCi0gICAgICAgICAgIDw8ICIsICIgPDwgdmlkZW9fY29uZmlnLklzVmFsaWRDb25maWcoKSA8PCAiKSI7Ci0gIGxvY2tfLkFzc2VydEFjcXVpcmVkKCk7Ci0KLSAgaWYgKCFhdWRpb19jb25maWcuSXNWYWxpZENvbmZpZygpICYmICF2aWRlb19jb25maWcuSXNWYWxpZENvbmZpZygpKSB7Ci0gICAgRFZMT0coMSkgPDwgIk9uTmV3Q29uZmlncygpIDogQXVkaW8gJiB2aWRlbyBjb25maWcgYXJlIG5vdCB2YWxpZCEiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFNpZ25hbCBhbiBlcnJvciBpZiB3ZSBnZXQgY29uZmlndXJhdGlvbiBpbmZvIGZvciBzdHJlYW0gdHlwZXMgdGhhdCB3ZXJlbid0Ci0gIC8vIHNwZWNpZmllZCBpbiBBZGRJZCgpIG9yIG1vcmUgY29uZmlncyBhZnRlciBhIHN0cmVhbSBpcyBpbml0aWFsaXplZC4KLSAgLy8gT25seSBhbGxvdyBhIHNpbmdsZSBhdWRpbyBjb25maWcgZm9yIG5vdy4KLSAgaWYgKGhhc19hdWRpbyAhPSBhdWRpb19jb25maWcuSXNWYWxpZENvbmZpZygpKSB7Ci0gICAgTUVESUFfTE9HKGxvZ19jYl8pCi0gICAgICAgIDw8ICJJbml0aWFsaXphdGlvbiBzZWdtZW50IgotICAgICAgICA8PCAoYXVkaW9fY29uZmlnLklzVmFsaWRDb25maWcoKSA/ICIgaGFzIiA6ICIgZG9lcyBub3QgaGF2ZSIpCi0gICAgICAgIDw8ICIgYW4gYXVkaW8gdHJhY2ssIGJ1dCB0aGUgbWltZXR5cGUiCi0gICAgICAgIDw8IChoYXNfYXVkaW8gPyAiIHNwZWNpZmllcyIgOiAiIGRvZXMgbm90IHNwZWNpZnkiKQotICAgICAgICA8PCAiIGFuIGF1ZGlvIGNvZGVjLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gT25seSBhbGxvdyBhIHNpbmdsZSB2aWRlbyBjb25maWcgZm9yIG5vdy4KLSAgaWYgKGhhc192aWRlbyAhPSB2aWRlb19jb25maWcuSXNWYWxpZENvbmZpZygpKSB7Ci0gICAgTUVESUFfTE9HKGxvZ19jYl8pCi0gICAgICAgIDw8ICJJbml0aWFsaXphdGlvbiBzZWdtZW50IgotICAgICAgICA8PCAodmlkZW9fY29uZmlnLklzVmFsaWRDb25maWcoKSA/ICIgaGFzIiA6ICIgZG9lcyBub3QgaGF2ZSIpCi0gICAgICAgIDw8ICIgYSB2aWRlbyB0cmFjaywgYnV0IHRoZSBtaW1ldHlwZSIKLSAgICAgICAgPDwgKGhhc192aWRlbyA/ICIgc3BlY2lmaWVzIiA6ICIgZG9lcyBub3Qgc3BlY2lmeSIpCi0gICAgICAgIDw8ICIgYSB2aWRlbyBjb2RlYy4iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGJvb2wgc3VjY2VzcyA9IHRydWU7Ci0gIGlmIChhdWRpb19jb25maWcuSXNWYWxpZENvbmZpZygpKSB7Ci0gICAgaWYgKGF1ZGlvXykgewotICAgICAgc3VjY2VzcyAmPSBhdWRpb18tPlVwZGF0ZUF1ZGlvQ29uZmlnKGF1ZGlvX2NvbmZpZyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGF1ZGlvXyA9IG5ldyBDaHVua0RlbXV4ZXJTdHJlYW0oYXVkaW9fY29uZmlnLCBsb2dfY2JfKTsKLSAgICB9Ci0gIH0KLQotICBpZiAodmlkZW9fY29uZmlnLklzVmFsaWRDb25maWcoKSkgewotICAgIGlmICh2aWRlb18pIHsKLSAgICAgIHN1Y2Nlc3MgJj0gdmlkZW9fLT5VcGRhdGVWaWRlb0NvbmZpZyh2aWRlb19jb25maWcpOwotICAgIH0gZWxzZSB7Ci0gICAgICB2aWRlb18gPSBuZXcgQ2h1bmtEZW11eGVyU3RyZWFtKHZpZGVvX2NvbmZpZywgbG9nX2NiXyk7Ci0gICAgfQotICB9Ci0KLSAgRFZMT0coMSkgPDwgIk9uTmV3Q29uZmlncygpIDogIiA8PCAoc3VjY2VzcyA/ICJzdWNjZXNzIiA6ICJmYWlsZWQiKTsKLSAgcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLWJvb2wgQ2h1bmtEZW11eGVyOjpPbkF1ZGlvQnVmZmVycyhjb25zdCBTdHJlYW1QYXJzZXI6OkJ1ZmZlclF1ZXVlJiBidWZmZXJzKSB7Ci0gIGxvY2tfLkFzc2VydEFjcXVpcmVkKCk7Ci0gIERDSEVDS19ORShzdGF0ZV8sIFNIVVRET1dOKTsKLQotICBpZiAoIWF1ZGlvXykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ0hFQ0soSXNWYWxpZElkKHNvdXJjZV9pZF9hdWRpb18pKTsKLSAgQWRqdXN0QnVmZmVyVGltZXN0YW1wcygKLSAgICAgIGJ1ZmZlcnMsIHNvdXJjZV9pbmZvX21hcF9bc291cmNlX2lkX2F1ZGlvX10udGltZXN0YW1wX29mZnNldCk7Ci0KLSAgaWYgKCFhdWRpb18tPkFwcGVuZChidWZmZXJzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgSW5jcmVhc2VEdXJhdGlvbklmTmVjZXNzYXJ5KGJ1ZmZlcnMsIGF1ZGlvXyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENodW5rRGVtdXhlcjo6T25WaWRlb0J1ZmZlcnMoY29uc3QgU3RyZWFtUGFyc2VyOjpCdWZmZXJRdWV1ZSYgYnVmZmVycykgewotICBsb2NrXy5Bc3NlcnRBY3F1aXJlZCgpOwotICBEQ0hFQ0tfTkUoc3RhdGVfLCBTSFVURE9XTik7Ci0KLSAgaWYgKCF2aWRlb18pCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENIRUNLKElzVmFsaWRJZChzb3VyY2VfaWRfdmlkZW9fKSk7Ci0gIEFkanVzdEJ1ZmZlclRpbWVzdGFtcHMoCi0gICAgICBidWZmZXJzLCBzb3VyY2VfaW5mb19tYXBfW3NvdXJjZV9pZF92aWRlb19dLnRpbWVzdGFtcF9vZmZzZXQpOwotCi0gIGlmICghdmlkZW9fLT5BcHBlbmQoYnVmZmVycykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIEluY3JlYXNlRHVyYXRpb25JZk5lY2Vzc2FyeShidWZmZXJzLCB2aWRlb18pOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gVE9ETyhhY29sd2VsbCk6IFJlbW92ZSBib29sIGZyb20gU3RyZWFtUGFyc2VyOjpOZWVkS2V5Q0Igc28gdGhhdAotLy8gdGhpcyBtZXRob2QgY2FuIGJlIHJlbW92ZWQgYW5kIG5lZWRfa2V5X2NiXyBjYW4gYmUgcGFzc2VkIGRpcmVjdGx5Ci0vLyB0byB0aGUgcGFyc2VyLgotYm9vbCBDaHVua0RlbXV4ZXI6Ok9uTmVlZEtleShjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX2FycmF5PHVpbnQ4PiBpbml0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbml0X2RhdGFfc2l6ZSkgewotICBsb2NrXy5Bc3NlcnRBY3F1aXJlZCgpOwotICBuZWVkX2tleV9jYl8uUnVuKHR5cGUsIGluaXRfZGF0YS5QYXNzKCksIGluaXRfZGF0YV9zaXplKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQ2h1bmtEZW11eGVyOjpPbk5ld01lZGlhU2VnbWVudChjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVEZWx0YSB0aW1lc3RhbXApIHsKLSAgRENIRUNLKHRpbWVzdGFtcCAhPSBrTm9UaW1lc3RhbXAoKSk7Ci0gIERWTE9HKDIpIDw8ICJPbk5ld01lZGlhU2VnbWVudCgiIDw8IHNvdXJjZV9pZCA8PCAiLCAiCi0gICAgICAgICAgIDw8IHRpbWVzdGFtcC5JblNlY29uZHNGKCkgPDwgIikiOwotICBsb2NrXy5Bc3NlcnRBY3F1aXJlZCgpOwotCi0gIENIRUNLKElzVmFsaWRJZChzb3VyY2VfaWQpKTsKLSAgc291cmNlX2luZm9fbWFwX1tzb3VyY2VfaWRdLmNhbl91cGRhdGVfb2Zmc2V0ID0gZmFsc2U7Ci0gIGJhc2U6OlRpbWVEZWx0YSBzdGFydF90aW1lc3RhbXAgPQotICAgICAgdGltZXN0YW1wICsgc291cmNlX2luZm9fbWFwX1tzb3VyY2VfaWRdLnRpbWVzdGFtcF9vZmZzZXQ7Ci0KLSAgaWYgKGF1ZGlvXyAmJiBzb3VyY2VfaWQgPT0gc291cmNlX2lkX2F1ZGlvXykKLSAgICBhdWRpb18tPk9uTmV3TWVkaWFTZWdtZW50KHN0YXJ0X3RpbWVzdGFtcCk7Ci0gIGlmICh2aWRlb18gJiYgc291cmNlX2lkID09IHNvdXJjZV9pZF92aWRlb18pCi0gICAgdmlkZW9fLT5Pbk5ld01lZGlhU2VnbWVudChzdGFydF90aW1lc3RhbXApOwotfQotCi12b2lkIENodW5rRGVtdXhlcjo6T25FbmRPZk1lZGlhU2VnbWVudChjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlX2lkKSB7Ci0gIERWTE9HKDIpIDw8ICJPbkVuZE9mTWVkaWFTZWdtZW50KCIgPDwgc291cmNlX2lkIDw8ICIpIjsKLSAgQ0hFQ0soSXNWYWxpZElkKHNvdXJjZV9pZCkpOwotICBzb3VyY2VfaW5mb19tYXBfW3NvdXJjZV9pZF0uY2FuX3VwZGF0ZV9vZmZzZXQgPSB0cnVlOwotfQotCi12b2lkIENodW5rRGVtdXhlcjo6QWRqdXN0QnVmZmVyVGltZXN0YW1wcygKLSAgICBjb25zdCBTdHJlYW1QYXJzZXI6OkJ1ZmZlclF1ZXVlJiBidWZmZXJzLAotICAgIGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXBfb2Zmc2V0KSB7Ci0gIGlmICh0aW1lc3RhbXBfb2Zmc2V0ID09IGJhc2U6OlRpbWVEZWx0YSgpKQotICAgIHJldHVybjsKLQotICBmb3IgKFN0cmVhbVBhcnNlcjo6QnVmZmVyUXVldWU6OmNvbnN0X2l0ZXJhdG9yIGl0ciA9IGJ1ZmZlcnMuYmVnaW4oKTsKLSAgICAgICBpdHIgIT0gYnVmZmVycy5lbmQoKTsgKytpdHIpIHsKLSAgICAoKml0ciktPlNldERlY29kZVRpbWVzdGFtcCgKLSAgICAgICAgKCppdHIpLT5HZXREZWNvZGVUaW1lc3RhbXAoKSArIHRpbWVzdGFtcF9vZmZzZXQpOwotICAgICgqaXRyKS0+U2V0VGltZXN0YW1wKCgqaXRyKS0+R2V0VGltZXN0YW1wKCkgKyB0aW1lc3RhbXBfb2Zmc2V0KTsKLSAgfQotfQotCi1ib29sIENodW5rRGVtdXhlcjo6SXNWYWxpZElkKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VfaWQpIGNvbnN0IHsKLSAgbG9ja18uQXNzZXJ0QWNxdWlyZWQoKTsKLSAgcmV0dXJuIHNvdXJjZV9pbmZvX21hcF8uY291bnQoc291cmNlX2lkKSA+IDB1ICYmCi0gICAgICBzdHJlYW1fcGFyc2VyX21hcF8uY291bnQoc291cmNlX2lkKSA+IDB1OwotfQotCi12b2lkIENodW5rRGVtdXhlcjo6VXBkYXRlRHVyYXRpb24oYmFzZTo6VGltZURlbHRhIG5ld19kdXJhdGlvbikgewotICBEQ0hFQ0soZHVyYXRpb25fICE9IG5ld19kdXJhdGlvbik7Ci0gIHVzZXJfc3BlY2lmaWVkX2R1cmF0aW9uXyA9IC0xOwotICBkdXJhdGlvbl8gPSBuZXdfZHVyYXRpb247Ci0gIGhvc3RfLT5TZXREdXJhdGlvbihuZXdfZHVyYXRpb24pOwotfQotCi12b2lkIENodW5rRGVtdXhlcjo6SW5jcmVhc2VEdXJhdGlvbklmTmVjZXNzYXJ5KAotICAgIGNvbnN0IFN0cmVhbVBhcnNlcjo6QnVmZmVyUXVldWUmIGJ1ZmZlcnMsCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxDaHVua0RlbXV4ZXJTdHJlYW0+JiBzdHJlYW0pIHsKLSAgRENIRUNLKCFidWZmZXJzLmVtcHR5KCkpOwotICBpZiAoYnVmZmVycy5iYWNrKCktPkdldFRpbWVzdGFtcCgpIDw9IGR1cmF0aW9uXykKLSAgICByZXR1cm47Ci0KLSAgUmFuZ2VzPFRpbWVEZWx0YT4gcmFuZ2VzID0gc3RyZWFtLT5HZXRCdWZmZXJlZFJhbmdlcyhrSW5maW5pdGVEdXJhdGlvbigpKTsKLSAgRENIRUNLX0dUKHJhbmdlcy5zaXplKCksIDB1KTsKLQotICBiYXNlOjpUaW1lRGVsdGEgbGFzdF90aW1lc3RhbXBfYnVmZmVyZWQgPSByYW5nZXMuZW5kKHJhbmdlcy5zaXplKCkgLSAxKTsKLSAgaWYgKGxhc3RfdGltZXN0YW1wX2J1ZmZlcmVkID4gZHVyYXRpb25fKQotICAgIFVwZGF0ZUR1cmF0aW9uKGxhc3RfdGltZXN0YW1wX2J1ZmZlcmVkKTsKLX0KLQotdm9pZCBDaHVua0RlbXV4ZXI6OkRlY3JlYXNlRHVyYXRpb25JZk5lY2Vzc2FyeSgpIHsKLSAgUmFuZ2VzPFRpbWVEZWx0YT4gcmFuZ2VzID0gR2V0QnVmZmVyZWRSYW5nZXMoKTsKLSAgaWYgKHJhbmdlcy5zaXplKCkgPT0gMHUpCi0gICAgcmV0dXJuOwotCi0gIGJhc2U6OlRpbWVEZWx0YSBsYXN0X3RpbWVzdGFtcF9idWZmZXJlZCA9IHJhbmdlcy5lbmQocmFuZ2VzLnNpemUoKSAtIDEpOwotICBpZiAobGFzdF90aW1lc3RhbXBfYnVmZmVyZWQgPCBkdXJhdGlvbl8pCi0gICAgVXBkYXRlRHVyYXRpb24obGFzdF90aW1lc3RhbXBfYnVmZmVyZWQpOwotfQotCi1SYW5nZXM8VGltZURlbHRhPiBDaHVua0RlbXV4ZXI6OkdldEJ1ZmZlcmVkUmFuZ2VzKCkgY29uc3QgewotICBpZiAoYXVkaW9fICYmICF2aWRlb18pCi0gICAgcmV0dXJuIGF1ZGlvXy0+R2V0QnVmZmVyZWRSYW5nZXMoZHVyYXRpb25fKTsKLSAgZWxzZSBpZiAoIWF1ZGlvXyAmJiB2aWRlb18pCi0gICAgcmV0dXJuIHZpZGVvXy0+R2V0QnVmZmVyZWRSYW5nZXMoZHVyYXRpb25fKTsKLSAgcmV0dXJuIENvbXB1dGVJbnRlcnNlY3Rpb24oKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9jaHVua19kZW11eGVyLmggYi9zcmMvbWVkaWEvZmlsdGVycy9jaHVua19kZW11eGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMDkxODEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvY2h1bmtfZGVtdXhlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfRklMVEVSU19DSFVOS19ERU1VWEVSX0hfCi0jZGVmaW5lIE1FRElBX0ZJTFRFUlNfQ0hVTktfREVNVVhFUl9IXwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2J5dGVfcXVldWUuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlbXV4ZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3Jhbmdlcy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc3RyZWFtX3BhcnNlci5oIgotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvc291cmNlX2J1ZmZlcl9zdHJlYW0uaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgQ2h1bmtEZW11eGVyU3RyZWFtOwotY2xhc3MgRkZtcGVnVVJMUHJvdG9jb2w7Ci0KLS8vIERlbXV4ZXIgaW1wbGVtZW50YXRpb24gdGhhdCBhbGxvd3MgY2h1bmtzIG9mIG1lZGlhIGRhdGEgdG8gYmUgcGFzc2VkCi0vLyBmcm9tIEphdmFTY3JpcHQgdG8gdGhlIG1lZGlhIHN0YWNrLgotY2xhc3MgTUVESUFfRVhQT1JUIENodW5rRGVtdXhlciA6IHB1YmxpYyBEZW11eGVyIHsKLSBwdWJsaWM6Ci0gIGVudW0gU3RhdHVzIHsKLSAgICBrT2ssICAgICAgICAgICAgICAvLyBJRCBhZGRlZCB3L28gZXJyb3IuCi0gICAga05vdFN1cHBvcnRlZCwgICAgLy8gVHlwZSBzcGVjaWZpZWQgaXMgbm90IHN1cHBvcnRlZC4KLSAgICBrUmVhY2hlZElkTGltaXQsICAvLyBSZWFjaGVkIElEIGxpbWl0LiBXZSBjYW4ndCBoYW5kbGUgYW55IG1vcmUgSURzLgotICB9OwotCi0gIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZChjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9hcnJheTx1aW50OD4gaW5pdF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluaXRfZGF0YV9zaXplKT4gTmVlZEtleUNCOwotCi0gIC8vIHxvcGVuX2NifCBSdW4gd2hlbiBJbml0aWFsaXplKCkgaXMgY2FsbGVkIHRvIHNpZ25hbCB0aGF0IHRoZSBkZW11eGVyCi0gIC8vICAgaXMgcmVhZHkgdG8gcmVjZWl2ZSBtZWRpYSBkYXRhIHZpYSBBcHBlbkRhdGEoKS4KLSAgLy8gfG5lZWRfa2V5X2NifCBSdW4gd2hlbiB0aGUgZGVtdXhlciBkZXRlcm1pbmVzIHRoYXQgYW4gZW5jcnlwdGlvbiBrZXkgaXMKLSAgLy8gICBuZWVkZWQgdG8gZGVjcnlwdCB0aGUgY29udGVudC4KLSAgLy8gfGxvZ19jYnwgUnVuIHdoZW4gcGFyc2luZyBlcnJvciBtZXNzYWdlcyBuZWVkIHRvIGJlIGxvZ2dlZCB0byB0aGUgZXJyb3IKLSAgLy8gICBjb25zb2xlLgotICBDaHVua0RlbXV4ZXIoY29uc3QgYmFzZTo6Q2xvc3VyZSYgb3Blbl9jYiwgY29uc3QgTmVlZEtleUNCJiBuZWVkX2tleV9jYiwKLSAgICAgICAgICAgICAgIGNvbnN0IExvZ0NCJiBsb2dfY2IpOwotCi0gIC8vIERlbXV4ZXIgaW1wbGVtZW50YXRpb24uCi0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKERlbXV4ZXJIb3N0KiBob3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBjYikgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTdG9wKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFNlZWsoYmFzZTo6VGltZURlbHRhIHRpbWUsIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImICBjYikgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBPbkF1ZGlvUmVuZGVyZXJEaXNhYmxlZCgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gR2V0U3RyZWFtKAotICAgICAgRGVtdXhlclN0cmVhbTo6VHlwZSB0eXBlKSBPVkVSUklERTsKLSAgdmlydHVhbCBiYXNlOjpUaW1lRGVsdGEgR2V0U3RhcnRUaW1lKCkgY29uc3QgT1ZFUlJJREU7Ci0KLSAgLy8gTWV0aG9kcyB1c2VkIGJ5IGFuIGV4dGVybmFsIG9iamVjdCB0byBjb250cm9sIHRoaXMgZGVtdXhlci4KLSAgdm9pZCBTdGFydFdhaXRpbmdGb3JTZWVrKCk7Ci0gIHZvaWQgQ2FuY2VsUGVuZGluZ1NlZWsoKTsKLQotICAvLyBSZWdpc3RlcnMgYSBuZXcgfGlkfCB0byB1c2UgZm9yIEFwcGVuZERhdGEoKSBjYWxscy4gfHR5cGV8IGluZGljYXRlcwotICAvLyB0aGUgTUlNRSB0eXBlIGZvciB0aGUgZGF0YSB0aGF0IHdlIGludGVuZCB0byBhcHBlbmQgZm9yIHRoaXMgSUQuCi0gIC8vIGtPayBpcyByZXR1cm5lZCBpZiB0aGUgZGVtdXhlciBoYXMgZW5vdWdoIHJlc291cmNlcyB0byBzdXBwb3J0IGFub3RoZXIgSUQKLSAgLy8gICAgYW5kIHN1cHBvcnRzIHRoZSBmb3JtYXQgaW5kaWNhdGVkIGJ5IHx0eXBlfC4KLSAgLy8ga05vdFN1cHBvcnRlZCBpcyByZXR1cm5lZCBpZiB8dHlwZXwgaXMgbm90IGEgc3VwcG9ydGVkIGZvcm1hdC4KLSAgLy8ga1JlYWNoZWRJZExpbWl0IGlzIHJldHVybmVkIGlmIHRoZSBkZW11eGVyIGNhbm5vdCBoYW5kbGUgYW5vdGhlciBJRCByaWdodAotICAvLyAgICBub3cuCi0gIFN0YXR1cyBBZGRJZChjb25zdCBzdGQ6OnN0cmluZyYgaWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLAotICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjb2RlY3MpOwotCi0gIC8vIFJlbW92ZWQgYW4gSUQgJiBhc3NvY2lhdGVkIHJlc291cmNlcyB0aGF0IHdlcmUgcHJldmlvdXNseSBhZGRlZCB3aXRoCi0gIC8vIEFkZElkKCkuCi0gIHZvaWQgUmVtb3ZlSWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkKTsKLQotICAvLyBHZXRzIHRoZSBjdXJyZW50bHkgYnVmZmVyZWQgcmFuZ2VzIGZvciB0aGUgc3BlY2lmaWVkIElELgotICBSYW5nZXM8YmFzZTo6VGltZURlbHRhPiBHZXRCdWZmZXJlZFJhbmdlcyhjb25zdCBzdGQ6OnN0cmluZyYgaWQpIGNvbnN0OwotCi0gIC8vIEFwcGVuZHMgbWVkaWEgZGF0YSB0byB0aGUgc291cmNlIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggfGlkfC4gUmV0dXJucwotICAvLyBmYWxzZSBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgaW4gYW4gaW52YWxpZCBzdGF0ZS4KLSAgYm9vbCBBcHBlbmREYXRhKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwgY29uc3QgdWludDgqIGRhdGEsIHNpemVfdCBsZW5ndGgpOwotCi0gIC8vIEFib3J0cyBwYXJzaW5nIHRoZSBjdXJyZW50IHNlZ21lbnQgYW5kIHJlc2V0IHRoZSBwYXJzZXIgdG8gYSBzdGF0ZSB3aGVyZQotICAvLyBpdCBjYW4gYWNjZXB0IGEgbmV3IHNlZ21lbnQuCi0gIHZvaWQgQWJvcnQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkKTsKLQotICAvLyBHZXQgdGhlIGR1cmF0aW9uIG9mIHRoZSBtZWRpYS4gSXQgY2FuIGJlIGFuIGluZmVycmVkIGR1cmF0aW9uIHNldCBieSB0aGUKLSAgLy8gY2xhc3Mgb3IgY2FuIGJlIGEgZHVyYXRpb24gZXhwbGljaXRseSBzZXQgYnkgc2NyaXB0LgotICBkb3VibGUgR2V0RHVyYXRpb24oKSBjb25zdDsKLQotICAvLyBOb3RpZmllcyB0aGUgZGVtdXhlciB0aGF0IHRoZSBkdXJhdGlvbiBvZiB0aGUgbWVkaWEgaGFzIGNoYW5nZWQgdG8KLSAgLy8gfGR1cmF0aW9ufC4KLSAgdm9pZCBTZXREdXJhdGlvbihkb3VibGUgZHVyYXRpb24pOwotCi0gIC8vIFNldHMgYSB0aW1lIHxvZmZzZXR8IHRvIGJlIGFwcGxpZWQgdG8gc3Vic2VxdWVudCBidWZmZXJzIGFwcGVuZGVkIHRvIHRoZQotICAvLyBzb3VyY2UgYnVmZmVyIGFzc2ljYXRlZCB3aXRoIHxpZHwuIFJldHVybnMgdHJ1ZSBpZiB0aGUgb2Zmc2V0IGlzIHNldAotICAvLyBwcm9wZXJseSwgZmFsc2UgaWYgdGhlIG9mZnNldCBjYW5ub3QgYmUgYXBwbGllZCBiZWNhdXNlIHdlJ3JlIGluIHRoZQotICAvLyBtaWRkbGUgb2YgcGFyc2luZyBhIG1lZGlhIHNlZ21lbnQuCi0gIGJvb2wgU2V0VGltZXN0YW1wT2Zmc2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwgYmFzZTo6VGltZURlbHRhIG9mZnNldCk7Ci0KLSAgLy8gU2lnbmFscyBhbiBFbmRPZlN0cmVhbSByZXF1ZXN0LgotICAvLyBSZXR1cm5zIGZhbHNlIGlmIGNhbGxlZCBpbiBhbiB1bmV4cGVjdGVkIHN0YXRlIG9yIGlmIHRoZXJlIGlzIGEgZ2FwIGJldHdlZW4KLSAgLy8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcmVkIGRhdGEuCi0gIGJvb2wgRW5kT2ZTdHJlYW0oUGlwZWxpbmVTdGF0dXMgc3RhdHVzKTsKLSAgdm9pZCBTaHV0ZG93bigpOwotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIH5DaHVua0RlbXV4ZXIoKTsKLQotIHByaXZhdGU6Ci0gIGVudW0gU3RhdGUgewotICAgIFdBSVRJTkdfRk9SX0lOSVQsCi0gICAgSU5JVElBTElaSU5HLAotICAgIElOSVRJQUxJWkVELAotICAgIEVOREVELAotICAgIFBBUlNFX0VSUk9SLAotICAgIFNIVVRET1dOLAotICB9OwotCi0gIHZvaWQgQ2hhbmdlU3RhdGVfTG9ja2VkKFN0YXRlIG5ld19zdGF0ZSk7Ci0KLSAgLy8gUmVwb3J0cyBhbiBlcnJvciBhbmQgcHV0cyB0aGUgZGVtdXhlciBpbiBhIHN0YXRlIHdoZXJlIGl0IHdvbid0IGFjY2VwdCBtb3JlCi0gIC8vIGRhdGEuCi0gIHZvaWQgUmVwb3J0RXJyb3JfTG9ja2VkKFBpcGVsaW5lU3RhdHVzIGVycm9yKTsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgYW55IHN0cmVhbSBoYXMgc2Vla2VkIHRvIGEgdGltZSB3aXRob3V0IGJ1ZmZlcmVkIGRhdGEuCi0gIGJvb2wgSXNTZWVrUGVuZGluZ19Mb2NrZWQoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgYWxsIHN0cmVhbXMgY2FuIHN1Y2Nlc3NmdWxseSBjYWxsIEVuZE9mU3RyZWFtLAotICAvLyBmYWxzZSBpZiBhbnkgY2FuIG5vdC4KLSAgYm9vbCBDYW5FbmRPZlN0cmVhbV9Mb2NrZWQoKSBjb25zdDsKLQotICBkb3VibGUgR2V0RHVyYXRpb25fTG9ja2VkKCkgY29uc3Q7Ci0KLSAgLy8gU3RyZWFtUGFyc2VyIGNhbGxiYWNrcy4KLSAgdm9pZCBPblN0cmVhbVBhcnNlckluaXREb25lKGJvb2wgc3VjY2VzcywgYmFzZTo6VGltZURlbHRhIGR1cmF0aW9uKTsKLSAgYm9vbCBPbk5ld0NvbmZpZ3MoYm9vbCBoYXNfYXVkaW8sIGJvb2wgaGFzX3ZpZGVvLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RlY29kZXJDb25maWcmIGF1ZGlvX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiB2aWRlb19jb25maWcpOwotICBib29sIE9uQXVkaW9CdWZmZXJzKGNvbnN0IFN0cmVhbVBhcnNlcjo6QnVmZmVyUXVldWUmIGJ1ZmZlcnMpOwotICBib29sIE9uVmlkZW9CdWZmZXJzKGNvbnN0IFN0cmVhbVBhcnNlcjo6QnVmZmVyUXVldWUmIGJ1ZmZlcnMpOwotICBib29sIE9uTmVlZEtleShjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwKLSAgICAgICAgICAgICAgICAgc2NvcGVkX2FycmF5PHVpbnQ4PiBpbml0X2RhdGEsCi0gICAgICAgICAgICAgICAgIGludCBpbml0X2RhdGFfc2l6ZSk7Ci0gIHZvaWQgT25OZXdNZWRpYVNlZ21lbnQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGEgc3RhcnRfdGltZXN0YW1wKTsKLSAgdm9pZCBPbkVuZE9mTWVkaWFTZWdtZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VfaWQpOwotCi0gIC8vIENvbXB1dGVzIHRoZSBpbnRlcnNlY3Rpb24gYmV0d2VlbiB0aGUgdmlkZW8gJiBhdWRpbwotICAvLyBidWZmZXJlZCByYW5nZXMuCi0gIFJhbmdlczxiYXNlOjpUaW1lRGVsdGE+IENvbXB1dGVJbnRlcnNlY3Rpb24oKSBjb25zdDsKLQotICAvLyBBcHBsaWVzIHx0aW1lX29mZnNldHwgdG8gdGhlIHRpbWVzdGFtcHMgb2YgfGJ1ZmZlcnN8LgotICB2b2lkIEFkanVzdEJ1ZmZlclRpbWVzdGFtcHMoY29uc3QgU3RyZWFtUGFyc2VyOjpCdWZmZXJRdWV1ZSYgYnVmZmVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXBfb2Zmc2V0KTsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgfHNvdXJjZV9pZHwgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgYm9vbCBJc1ZhbGlkSWQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZV9pZCkgY29uc3Q7Ci0KLSAgLy8gSW5jcmVhc2VzIHxkdXJhdGlvbl98IGlmIHRoZSBuZXdseSBhcHBlbmRlZCB8YnVmZmVyc3wgZXhjZWVkIHRoZSBjdXJyZW50Ci0gIC8vIHxkdXJhdGlvbl98LiBUaGUgfGR1cmF0aW9uX3wgaXMgc2V0IHRvIHRoZSBlbmQgYnVmZmVyZWQgdGltZXN0YW1wIG9mCi0gIC8vIHxzdHJlYW18LgotICB2b2lkIEluY3JlYXNlRHVyYXRpb25JZk5lY2Vzc2FyeSgKLSAgICAgIGNvbnN0IFN0cmVhbVBhcnNlcjo6QnVmZmVyUXVldWUmIGJ1ZmZlcnMsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPENodW5rRGVtdXhlclN0cmVhbT4mIHN0cmVhbSk7Ci0KLSAgLy8gRGVjcmVhc2VzIHxkdXJhdGlvbl98IGlmIHRoZSBidWZmZXJlZCByZWdpb24gaXMgbGVzcyB0aGFuIHxkdXJhdGlvbl98IHdoZW4KLSAgLy8gRW5kT2ZTdHJlYW0oKSBpcyBjYWxsZWQuCi0gIHZvaWQgRGVjcmVhc2VEdXJhdGlvbklmTmVjZXNzYXJ5KCk7Ci0KLSAgLy8gU2V0cyB8ZHVyYXRpb25ffCB0byB8bmV3X2R1cmF0aW9ufCBhbmQgbm90aWZpZXMgfGhvc3RffC4KLSAgdm9pZCBVcGRhdGVEdXJhdGlvbihiYXNlOjpUaW1lRGVsdGEgbmV3X2R1cmF0aW9uKTsKLQotICAvLyBSZXR1cm5zIHRoZSByYW5nZXMgcmVwcmVzZW50aW5nIHRoZSBidWZmZXJlZCBkYXRhIGluIHRoZSBkZW11eGVyLgotICBSYW5nZXM8YmFzZTo6VGltZURlbHRhPiBHZXRCdWZmZXJlZFJhbmdlcygpIGNvbnN0OwotCi0gIG11dGFibGUgYmFzZTo6TG9jayBsb2NrXzsKLSAgU3RhdGUgc3RhdGVfOwotCi0gIERlbXV4ZXJIb3N0KiBob3N0XzsKLSAgYmFzZTo6Q2xvc3VyZSBvcGVuX2NiXzsKLSAgTmVlZEtleUNCIG5lZWRfa2V5X2NiXzsKLSAgLy8gQ2FsbGJhY2sgdXNlZCB0byByZXBvcnQgZXJyb3Igc3RyaW5ncyB0aGF0IGNhbiBoZWxwIHRoZSB3ZWIgZGV2ZWxvcGVyCi0gIC8vIGZpZ3VyZSBvdXQgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZSBjb250ZW50LgotICBMb2dDQiBsb2dfY2JfOwotCi0gIFBpcGVsaW5lU3RhdHVzQ0IgaW5pdF9jYl87Ci0gIFBpcGVsaW5lU3RhdHVzQ0Igc2Vla19jYl87Ci0gIGJvb2wgZGVsYXllZF9hdWRpb19zZWVrXzsKLQotICBzY29wZWRfcmVmcHRyPENodW5rRGVtdXhlclN0cmVhbT4gYXVkaW9fOwotICBzY29wZWRfcmVmcHRyPENodW5rRGVtdXhlclN0cmVhbT4gdmlkZW9fOwotCi0gIGJhc2U6OlRpbWVEZWx0YSBkdXJhdGlvbl87Ci0KLSAgLy8gVGhlIGR1cmF0aW9uIHBhc3NlZCB0byB0aGUgbGFzdCBTZXREdXJhdGlvbigpLiBJZgotICAvLyBTZXREdXJhdGlvbigpIGlzIG5ldmVyIGNhbGxlZCBvciBhbiBBcHBlbmREYXRhKCkgY2FsbCBvcgotICAvLyBhIEVuZE9mU3RyZWFtKCkgY2FsbCBjaGFuZ2VzIHxkdXJhdGlvbl98LCB0aGVuIHRoaXMKLSAgLy8gdmFyaWFibGUgaXMgc2V0IHRvIDwgMCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB8ZHVyYXRpb25ffCByZXByZXNlbnRzCi0gIC8vIHRoZSBhY3R1YWwgZHVyYXRpb24gaW5zdGVhZCBvZiBhIHVzZXIgc3BlY2lmaWVkIHZhbHVlLgotICBkb3VibGUgdXNlcl9zcGVjaWZpZWRfZHVyYXRpb25fOwotCi0gIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFN0cmVhbVBhcnNlcio+IFN0cmVhbVBhcnNlck1hcDsKLSAgU3RyZWFtUGFyc2VyTWFwIHN0cmVhbV9wYXJzZXJfbWFwXzsKLQotICAvLyBDb250YWlucyBzdGF0ZSBiZWxvbmdpbmcgdG8gYSBzb3VyY2UgaWQuCi0gIHN0cnVjdCBTb3VyY2VJbmZvIHsKLSAgICBiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wX29mZnNldDsKLSAgICBib29sIGNhbl91cGRhdGVfb2Zmc2V0OwotICB9OwotICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBTb3VyY2VJbmZvPiBTb3VyY2VJbmZvTWFwOwotICBTb3VyY2VJbmZvTWFwIHNvdXJjZV9pbmZvX21hcF87Ci0KLSAgLy8gVXNlZCB0byBlbnN1cmUgdGhhdCAoMSkgY29uZmlnIGRhdGEgbWF0Y2hlcyB0aGUgdHlwZSBhbmQgY29kZWMgcHJvdmlkZWQgaW4KLSAgLy8gQWRkSWQoKSwgKDIpIG9ubHkgMSBhdWRpbyBhbmQgMSB2aWRlbyBzb3VyY2VzIGFyZSBhZGRlZCwgYW5kICgzKSBpZHMgbWF5IGJlCi0gIC8vIHJlbW92ZWQgd2l0aCBSZW1vdmVJRCgpIGJ1dCBjYW4gbm90IGJlIHJlLWFkZGVkICh5ZXQpLgotICBzdGQ6OnN0cmluZyBzb3VyY2VfaWRfYXVkaW9fOwotICBzdGQ6OnN0cmluZyBzb3VyY2VfaWRfdmlkZW9fOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihDaHVua0RlbXV4ZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfRklMVEVSU19DSFVOS19ERU1VWEVSX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9jaHVua19kZW11eGVyX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2ZpbHRlcnMvY2h1bmtfZGVtdXhlcl91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRmZTdhOC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9jaHVua19kZW11eGVyX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjUwNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbW9ja19kZW11eGVyX2hvc3QuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3Rlc3RfZGF0YV91dGlsLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS90ZXN0X2hlbHBlcnMuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL2NodW5rX2RlbXV4ZXIuaCIKLSNpbmNsdWRlICJtZWRpYS93ZWJtL2NsdXN0ZXJfYnVpbGRlci5oIgotI2luY2x1ZGUgIm1lZGlhL3dlYm0vd2VibV9jb25zdGFudHMuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgOjp0ZXN0aW5nOjpBbnlOdW1iZXI7Ci11c2luZyA6OnRlc3Rpbmc6OkV4YWN0bHk7Ci11c2luZyA6OnRlc3Rpbmc6OkluU2VxdWVuY2U7Ci11c2luZyA6OnRlc3Rpbmc6Ok5vdE51bGw7Ci11c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKLXVzaW5nIDo6dGVzdGluZzo6U2F2ZUFyZzsKLXVzaW5nIDo6dGVzdGluZzo6U2V0QXJndW1lbnRQb2ludGVlOwotdXNpbmcgOjp0ZXN0aW5nOjpfOwotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1zdGF0aWMgY29uc3QgdWludDgga1RyYWNrc0hlYWRlcltdID0gewotICAweDE2LCAweDU0LCAweEFFLCAweDZCLCAgLy8gVHJhY2tzIElECi0gIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyB0cmFja3Moc2l6ZSA9IDApCi19OwotCi1zdGF0aWMgY29uc3QgaW50IGtUcmFja3NIZWFkZXJTaXplID0gc2l6ZW9mKGtUcmFja3NIZWFkZXIpOwotc3RhdGljIGNvbnN0IGludCBrVHJhY2tzU2l6ZU9mZnNldCA9IDQ7Ci0KLS8vIFRoZSBzaXplIG9mIFRyYWNrRW50cnkgZWxlbWVudCBpbiB0ZXN0IGZpbGUgIndlYm1fdm9yYmlzX3RyYWNrX2VudHJ5IiBzdGFydHMKLS8vIGF0IGluZGV4IDEgYW5kIHNwYW5zIDggYnl0ZXMuCi1zdGF0aWMgY29uc3QgaW50IGtBdWRpb1RyYWNrU2l6ZU9mZnNldCA9IDE7Ci1zdGF0aWMgY29uc3QgaW50IGtBdWRpb1RyYWNrU2l6ZVdpZHRoID0gODsKLXN0YXRpYyBjb25zdCBpbnQga0F1ZGlvVHJhY2tFbnRyeUhlYWRlclNpemUgPSBrQXVkaW9UcmFja1NpemVPZmZzZXQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBdWRpb1RyYWNrU2l6ZVdpZHRoOwotCi0vLyBUaGUgc2l6ZSBvZiBUcmFja0VudHJ5IGVsZW1lbnQgaW4gdGVzdCBmaWxlICJ3ZWJtX3ZwOF90cmFja19lbnRyeSIgc3RhcnRzIGF0Ci0vLyBpbmRleCAxIGFuZCBzcGFucyA4IGJ5dGVzLgotc3RhdGljIGNvbnN0IGludCBrVmlkZW9UcmFja1NpemVPZmZzZXQgPSAxOwotc3RhdGljIGNvbnN0IGludCBrVmlkZW9UcmFja1NpemVXaWR0aCA9IDg7Ci1zdGF0aWMgY29uc3QgaW50IGtWaWRlb1RyYWNrRW50cnlIZWFkZXJTaXplID0ga1ZpZGVvVHJhY2tTaXplT2Zmc2V0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVmlkZW9UcmFja1NpemVXaWR0aDsKLQotc3RhdGljIGNvbnN0IGludCBrVmlkZW9UcmFja051bSA9IDE7Ci1zdGF0aWMgY29uc3QgaW50IGtBdWRpb1RyYWNrTnVtID0gMjsKLQotc3RhdGljIGNvbnN0IGludCBrQXVkaW9CbG9ja0R1cmF0aW9uID0gMjM7Ci1zdGF0aWMgY29uc3QgaW50IGtWaWRlb0Jsb2NrRHVyYXRpb24gPSAzMzsKLQotc3RhdGljIGNvbnN0IGNoYXIqIGtTb3VyY2VJZCA9ICJTb3VyY2VJZCI7Ci1zdGF0aWMgY29uc3QgY2hhcioga0RlZmF1bHRGaXJzdENsdXN0ZXJSYW5nZSA9ICJ7IFswLDQ2KSB9IjsKLXN0YXRpYyBjb25zdCBpbnQga0RlZmF1bHRGaXJzdENsdXN0ZXJFbmRUaW1lc3RhbXAgPSA2NjsKLXN0YXRpYyBjb25zdCBpbnQga0RlZmF1bHRTZWNvbmRDbHVzdGVyRW5kVGltZXN0YW1wID0gMTMyOwotCi1zdGF0aWMgY29uc3QgY2hhciBrV2ViTUluaXREYXRhVHlwZVtdID0gInZpZGVvL3dlYm0iOwotCi1iYXNlOjpUaW1lRGVsdGEga0RlZmF1bHREdXJhdGlvbigpIHsKLSAgcmV0dXJuIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygyMDEyMjQpOwotfQotCi0vLyBXcml0ZSBhbiBpbnRlZ2VyIGludG8gYnVmZmVyIGluIHRoZSBmb3JtIG9mIHZpbnQgdGhhdCBzcGFucyA4IGJ5dGVzLgotLy8gVGhlIGRhdGEgcG9pbnRlZCBieSB8YnVmZmVyfCBzaG91bGQgYmUgYXQgbGVhc3QgOCBieXRlcyBsb25nLgotLy8gfG51bWJlcnwgc2hvdWxkIGJlIGluIHRoZSByYW5nZSAwIDw9IG51bWJlciA8IDB4MDBGRkZGRkZGRkZGRkZGRi4KLXN0YXRpYyB2b2lkIFdyaXRlSW50NjQodWludDgqIGJ1ZmZlciwgaW50NjQgbnVtYmVyKSB7Ci0gIERDSEVDSyhudW1iZXIgPj0gMCAmJiBudW1iZXIgPCBHR19MT05HTE9ORygweDAwRkZGRkZGRkZGRkZGRkYpKTsKLSAgYnVmZmVyWzBdID0gMHgwMTsKLSAgaW50NjQgdG1wID0gbnVtYmVyOwotICBmb3IgKGludCBpID0gNzsgaSA+IDA7IGktLSkgewotICAgIGJ1ZmZlcltpXSA9IHRtcCAmIDB4ZmY7Ci0gICAgdG1wID4+PSA4OwotICB9Ci19Ci0KLU1BVENIRVJfUChIYXNUaW1lc3RhbXAsIHRpbWVzdGFtcF9pbl9tcywgIiIpIHsKLSAgcmV0dXJuIGFyZyAmJiAhYXJnLT5Jc0VuZE9mU3RyZWFtKCkgJiYKLSAgICAgIGFyZy0+R2V0VGltZXN0YW1wKCkuSW5NaWxsaXNlY29uZHMoKSA9PSB0aW1lc3RhbXBfaW5fbXM7Ci19Ci0KLU1BVENIRVIoSXNFbmRPZlN0cmVhbSwgIiIpIHsKLSAgcmV0dXJuIGFyZyAmJiBhcmctPklzRW5kT2ZTdHJlYW0oKTsKLX0KLQotc3RhdGljIHZvaWQgT25SZWFkRG9uZShjb25zdCBiYXNlOjpUaW1lRGVsdGEmIGV4cGVjdGVkX3RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGNhbGxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgRGVtdXhlclN0cmVhbTo6U3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgYnVmZmVyKSB7Ci0gIEVYUEVDVF9FUShzdGF0dXMsIERlbXV4ZXJTdHJlYW06OmtPayk7Ci0gIEVYUEVDVF9FUShleHBlY3RlZF90aW1lLCBidWZmZXItPkdldFRpbWVzdGFtcCgpKTsKLSAgKmNhbGxlZCA9IHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkIE9uUmVhZERvbmVfQWJvcnRFeHBlY3RlZCgKLSAgICBib29sKiBjYWxsZWQsIERlbXV4ZXJTdHJlYW06OlN0YXR1cyBzdGF0dXMsCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgYnVmZmVyKSB7Ci0gIEVYUEVDVF9FUShzdGF0dXMsIERlbXV4ZXJTdHJlYW06OmtBYm9ydGVkKTsKLSAgRVhQRUNUX0VRKE5VTEwsIGJ1ZmZlci5nZXQoKSk7Ci0gICpjYWxsZWQgPSB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBPblJlYWREb25lX0VPU0V4cGVjdGVkKGJvb2wqIGNhbGxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVtdXhlclN0cmVhbTo6U3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgYnVmZmVyKSB7Ci0gIEVYUEVDVF9FUShzdGF0dXMsIERlbXV4ZXJTdHJlYW06OmtPayk7Ci0gIEVYUEVDVF9UUlVFKGJ1ZmZlci0+SXNFbmRPZlN0cmVhbSgpKTsKLSAgKmNhbGxlZCA9IHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkIFN0b3JlU3RhdHVzQW5kQnVmZmVyKERlbXV4ZXJTdHJlYW06OlN0YXR1cyogc3RhdHVzX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4qIGJ1ZmZlcl9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW11eGVyU3RyZWFtOjpTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgYnVmZmVyKSB7Ci0gICpzdGF0dXNfb3V0ID0gc3RhdHVzOwotICAqYnVmZmVyX291dCA9IGJ1ZmZlcjsKLX0KLQotc3RhdGljIHZvaWQgUmVhZFVudGlsTm90T2tPckVuZE9mU3RyZWFtKAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4mIHN0cmVhbSwKLSAgICBEZW11eGVyU3RyZWFtOjpTdGF0dXMqIHN0YXR1cywKLSAgICBiYXNlOjpUaW1lRGVsdGEqIGxhc3RfdGltZXN0YW1wKSB7Ci0gIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gYnVmZmVyOwotCi0gICpsYXN0X3RpbWVzdGFtcCA9IGtOb1RpbWVzdGFtcCgpOwotICBkbyB7Ci0gICAgc3RyZWFtLT5SZWFkKGJhc2U6OkJpbmQoJlN0b3JlU3RhdHVzQW5kQnVmZmVyLCBzdGF0dXMsICZidWZmZXIpKTsKLSAgICBpZiAoKnN0YXR1cyA9PSBEZW11eGVyU3RyZWFtOjprT2sgJiYgIWJ1ZmZlci0+SXNFbmRPZlN0cmVhbSgpKQotICAgICAgKmxhc3RfdGltZXN0YW1wID0gYnVmZmVyLT5HZXRUaW1lc3RhbXAoKTsKLSAgfSB3aGlsZSAoKnN0YXR1cyA9PSBEZW11eGVyU3RyZWFtOjprT2sgJiYgIWJ1ZmZlci0+SXNFbmRPZlN0cmVhbSgpKTsKLX0KLQotY2xhc3MgQ2h1bmtEZW11eGVyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIGVudW0gQ29kZWNzSW5kZXggewotICAgIEFVRElPLAotICAgIFZJREVPLAotICAgIE1BWF9DT0RFQ1NfSU5ERVgKLSAgfTsKLQotICAvLyBEZWZhdWx0IGNsdXN0ZXIgdG8gYXBwZW5kIGZpcnN0IGZvciBzaW1wbGUgdGVzdHMuCi0gIHNjb3BlZF9wdHI8Q2x1c3Rlcj4ga0RlZmF1bHRGaXJzdENsdXN0ZXIoKSB7Ci0gICAgcmV0dXJuIEdlbmVyYXRlQ2x1c3RlcigwLCA0KTsKLSAgfQotCi0gIC8vIERlZmF1bHQgY2x1c3RlciB0byBhcHBlbmQgYWZ0ZXIga0RlZmF1bHRGaXJzdENsdXN0ZXIoKQotICAvLyBoYXMgYmVlbiBhcHBlbmRlZC4gVGhpcyBjbHVzdGVyIHN0YXJ0cyB3aXRoIGJsb2NrcyB0aGF0Ci0gIC8vIGhhdmUgdGltZXN0YW1wcyBjb25zaXN0ZW50IHdpdGggdGhlIGVuZCB0aW1lcyBvZiB0aGUgYmxvY2tzCi0gIC8vIGluIGtEZWZhdWx0Rmlyc3RDbHVzdGVyKCkgc28gdGhhdCB0aGVzZSB0d28gY2x1c3RlcnMgcmVwcmVzZW50Ci0gIC8vIGEgY29udGludW91cyByZWdpb24uCi0gIHNjb3BlZF9wdHI8Q2x1c3Rlcj4ga0RlZmF1bHRTZWNvbmRDbHVzdGVyKCkgewotICAgIHJldHVybiBHZW5lcmF0ZUNsdXN0ZXIoNDYsIDY2LCA1KTsKLSAgfQotCi0gIENodW5rRGVtdXhlclRlc3QoKSB7Ci0gICAgQ3JlYXRlTmV3RGVtdXhlcigpOwotICB9Ci0KLSAgdm9pZCBDcmVhdGVOZXdEZW11eGVyKCkgewotICAgIGJhc2U6OkNsb3N1cmUgb3Blbl9jYiA9Ci0gICAgICAgIGJhc2U6OkJpbmQoJkNodW5rRGVtdXhlclRlc3Q6OkRlbXV4ZXJPcGVuZWQsIGJhc2U6OlVucmV0YWluZWQodGhpcykpOwotICAgIENodW5rRGVtdXhlcjo6TmVlZEtleUNCIG5lZWRfa2V5X2NiID0KLSAgICAgICAgYmFzZTo6QmluZCgmQ2h1bmtEZW11eGVyVGVzdDo6RGVtdXhlck5lZWRLZXksIGJhc2U6OlVucmV0YWluZWQodGhpcykpOwotICAgIGRlbXV4ZXJfID0gbmV3IENodW5rRGVtdXhlcihvcGVuX2NiLCBuZWVkX2tleV9jYiwgTG9nQ0IoKSk7Ci0gIH0KLQotICB2aXJ0dWFsIH5DaHVua0RlbXV4ZXJUZXN0KCkgewotICAgIFNodXRkb3duRGVtdXhlcigpOwotICB9Ci0KLSAgdm9pZCBDcmVhdGVJbml0U2VnbWVudChib29sIGhhc19hdWRpbywgYm9vbCBoYXNfdmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19hdWRpb19lbmNyeXB0ZWQsIGJvb2wgaXNfdmlkZW9fZW5jcnlwdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9hcnJheTx1aW50OD4qIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHNpemUpIHsKLSAgICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGVibWxfaGVhZGVyOwotICAgIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gaW5mbzsKLSAgICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGF1ZGlvX3RyYWNrX2VudHJ5OwotICAgIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gdmlkZW9fdHJhY2tfZW50cnk7Ci0gICAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBhdWRpb19jb250ZW50X2VuY29kaW5nczsKLSAgICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IHZpZGVvX2NvbnRlbnRfZW5jb2RpbmdzOwotCi0gICAgZWJtbF9oZWFkZXIgPSBSZWFkVGVzdERhdGFGaWxlKCJ3ZWJtX2VibWxfZWxlbWVudCIpOwotCi0gICAgaW5mbyA9IFJlYWRUZXN0RGF0YUZpbGUoIndlYm1faW5mb19lbGVtZW50Iik7Ci0KLSAgICBpbnQgdHJhY2tzX2VsZW1lbnRfc2l6ZSA9IDA7Ci0KLSAgICBpZiAoaGFzX2F1ZGlvKSB7Ci0gICAgICBhdWRpb190cmFja19lbnRyeSA9IFJlYWRUZXN0RGF0YUZpbGUoIndlYm1fdm9yYmlzX3RyYWNrX2VudHJ5Iik7Ci0gICAgICB0cmFja3NfZWxlbWVudF9zaXplICs9IGF1ZGlvX3RyYWNrX2VudHJ5LT5HZXREYXRhU2l6ZSgpOwotICAgICAgaWYgKGlzX2F1ZGlvX2VuY3J5cHRlZCkgewotICAgICAgICBhdWRpb19jb250ZW50X2VuY29kaW5ncyA9IFJlYWRUZXN0RGF0YUZpbGUoIndlYm1fY29udGVudF9lbmNvZGluZ3MiKTsKLSAgICAgICAgdHJhY2tzX2VsZW1lbnRfc2l6ZSArPSBhdWRpb19jb250ZW50X2VuY29kaW5ncy0+R2V0RGF0YVNpemUoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaGFzX3ZpZGVvKSB7Ci0gICAgICB2aWRlb190cmFja19lbnRyeSA9IFJlYWRUZXN0RGF0YUZpbGUoIndlYm1fdnA4X3RyYWNrX2VudHJ5Iik7Ci0gICAgICB0cmFja3NfZWxlbWVudF9zaXplICs9IHZpZGVvX3RyYWNrX2VudHJ5LT5HZXREYXRhU2l6ZSgpOwotICAgICAgaWYgKGlzX3ZpZGVvX2VuY3J5cHRlZCkgewotICAgICAgICB2aWRlb19jb250ZW50X2VuY29kaW5ncyA9IFJlYWRUZXN0RGF0YUZpbGUoIndlYm1fY29udGVudF9lbmNvZGluZ3MiKTsKLSAgICAgICAgdHJhY2tzX2VsZW1lbnRfc2l6ZSArPSB2aWRlb19jb250ZW50X2VuY29kaW5ncy0+R2V0RGF0YVNpemUoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAqc2l6ZSA9IGVibWxfaGVhZGVyLT5HZXREYXRhU2l6ZSgpICsgaW5mby0+R2V0RGF0YVNpemUoKSArCi0gICAgICAgIGtUcmFja3NIZWFkZXJTaXplICsgdHJhY2tzX2VsZW1lbnRfc2l6ZTsKLQotICAgIGJ1ZmZlci0+cmVzZXQobmV3IHVpbnQ4WypzaXplXSk7Ci0KLSAgICB1aW50OCogYnVmID0gYnVmZmVyLT5nZXQoKTsKLSAgICBtZW1jcHkoYnVmLCBlYm1sX2hlYWRlci0+R2V0RGF0YSgpLCBlYm1sX2hlYWRlci0+R2V0RGF0YVNpemUoKSk7Ci0gICAgYnVmICs9IGVibWxfaGVhZGVyLT5HZXREYXRhU2l6ZSgpOwotCi0gICAgbWVtY3B5KGJ1ZiwgaW5mby0+R2V0RGF0YSgpLCBpbmZvLT5HZXREYXRhU2l6ZSgpKTsKLSAgICBidWYgKz0gaW5mby0+R2V0RGF0YVNpemUoKTsKLQotICAgIG1lbWNweShidWYsIGtUcmFja3NIZWFkZXIsIGtUcmFja3NIZWFkZXJTaXplKTsKLSAgICBXcml0ZUludDY0KGJ1ZiArIGtUcmFja3NTaXplT2Zmc2V0LCB0cmFja3NfZWxlbWVudF9zaXplKTsKLSAgICBidWYgKz0ga1RyYWNrc0hlYWRlclNpemU7Ci0KLSAgICAvLyBUT0RPKHhod2FuZyk6IFNpbXBsaWZ5IHRoaXMhIFByb2JhYmx5IGhhdmUgdGVzdCBkYXRhIGZpbGVzIHRoYXQgY29udGFpbgotICAgIC8vIENvbnRlbnRFbmNvZGluZ3MgZGlyZWN0bHkgaW5zdGVhZCBvZiB0cnlpbmcgdG8gY3JlYXRlIG9uZSBhdCBydW4tdGltZS4KLSAgICBpZiAoaGFzX2F1ZGlvKSB7Ci0gICAgICBtZW1jcHkoYnVmLCBhdWRpb190cmFja19lbnRyeS0+R2V0RGF0YSgpLAotICAgICAgICAgICAgIGF1ZGlvX3RyYWNrX2VudHJ5LT5HZXREYXRhU2l6ZSgpKTsKLSAgICAgIGlmIChpc19hdWRpb19lbmNyeXB0ZWQpIHsKLSAgICAgICAgbWVtY3B5KGJ1ZiArIGF1ZGlvX3RyYWNrX2VudHJ5LT5HZXREYXRhU2l6ZSgpLAotICAgICAgICAgICAgICAgYXVkaW9fY29udGVudF9lbmNvZGluZ3MtPkdldERhdGEoKSwKLSAgICAgICAgICAgICAgIGF1ZGlvX2NvbnRlbnRfZW5jb2RpbmdzLT5HZXREYXRhU2l6ZSgpKTsKLSAgICAgICAgV3JpdGVJbnQ2NChidWYgKyBrQXVkaW9UcmFja1NpemVPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgYXVkaW9fdHJhY2tfZW50cnktPkdldERhdGFTaXplKCkgKwotICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbnRlbnRfZW5jb2RpbmdzLT5HZXREYXRhU2l6ZSgpIC0KLSAgICAgICAgICAgICAgICAgICBrQXVkaW9UcmFja0VudHJ5SGVhZGVyU2l6ZSk7Ci0gICAgICAgIGJ1ZiArPSBhdWRpb19jb250ZW50X2VuY29kaW5ncy0+R2V0RGF0YVNpemUoKTsKLSAgICAgIH0KLSAgICAgIGJ1ZiArPSBhdWRpb190cmFja19lbnRyeS0+R2V0RGF0YVNpemUoKTsKLSAgICB9Ci0KLSAgICBpZiAoaGFzX3ZpZGVvKSB7Ci0gICAgICBtZW1jcHkoYnVmLCB2aWRlb190cmFja19lbnRyeS0+R2V0RGF0YSgpLAotICAgICAgICAgICAgIHZpZGVvX3RyYWNrX2VudHJ5LT5HZXREYXRhU2l6ZSgpKTsKLSAgICAgIGlmIChpc192aWRlb19lbmNyeXB0ZWQpIHsKLSAgICAgICAgbWVtY3B5KGJ1ZiArIHZpZGVvX3RyYWNrX2VudHJ5LT5HZXREYXRhU2l6ZSgpLAotICAgICAgICAgICAgICAgdmlkZW9fY29udGVudF9lbmNvZGluZ3MtPkdldERhdGEoKSwKLSAgICAgICAgICAgICAgIHZpZGVvX2NvbnRlbnRfZW5jb2RpbmdzLT5HZXREYXRhU2l6ZSgpKTsKLSAgICAgICAgV3JpdGVJbnQ2NChidWYgKyBrVmlkZW9UcmFja1NpemVPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgdmlkZW9fdHJhY2tfZW50cnktPkdldERhdGFTaXplKCkgKwotICAgICAgICAgICAgICAgICAgIHZpZGVvX2NvbnRlbnRfZW5jb2RpbmdzLT5HZXREYXRhU2l6ZSgpIC0KLSAgICAgICAgICAgICAgICAgICBrVmlkZW9UcmFja0VudHJ5SGVhZGVyU2l6ZSk7Ci0gICAgICAgIGJ1ZiArPSB2aWRlb19jb250ZW50X2VuY29kaW5ncy0+R2V0RGF0YVNpemUoKTsKLSAgICAgIH0KLSAgICAgIGJ1ZiArPSB2aWRlb190cmFja19lbnRyeS0+R2V0RGF0YVNpemUoKTsKLSAgICB9Ci0gIH0KLQotICBDaHVua0RlbXV4ZXI6OlN0YXR1cyBBZGRJZCgpIHsKLSAgICByZXR1cm4gQWRkSWQoa1NvdXJjZUlkLCB0cnVlLCB0cnVlKTsKLSAgfQotCi0gIENodW5rRGVtdXhlcjo6U3RhdHVzIEFkZElkKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX2F1ZGlvLCBib29sIGhhc192aWRlbykgewotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb2RlY3M7Ci0gICAgc3RkOjpzdHJpbmcgdHlwZTsKLQotICAgIGlmIChoYXNfYXVkaW8pIHsKLSAgICAgIGNvZGVjcy5wdXNoX2JhY2soInZvcmJpcyIpOwotICAgICAgdHlwZSA9ICJhdWRpby93ZWJtIjsKLSAgICB9Ci0KLSAgICBpZiAoaGFzX3ZpZGVvKSB7Ci0gICAgICBjb2RlY3MucHVzaF9iYWNrKCJ2cDgiKTsKLSAgICAgIHR5cGUgPSAidmlkZW8vd2VibSI7Ci0gICAgfQotCi0gICAgaWYgKCFoYXNfYXVkaW8gJiYgIWhhc192aWRlbykgewotICAgICAgcmV0dXJuIEFkZElkKGtTb3VyY2VJZCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGRlbXV4ZXJfLT5BZGRJZChzb3VyY2VfaWQsIHR5cGUsIGNvZGVjcyk7Ci0gIH0KLQotICBib29sIEFwcGVuZERhdGEoY29uc3QgdWludDgqIGRhdGEsIHNpemVfdCBsZW5ndGgpIHsKLSAgICByZXR1cm4gQXBwZW5kRGF0YShrU291cmNlSWQsIGRhdGEsIGxlbmd0aCk7Ci0gIH0KLQotICBib29sIEFwcGVuZENsdXN0ZXIoaW50IHRpbWVjb2RlLCBpbnQgYmxvY2tfY291bnQpIHsKLSAgICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXIoR2VuZXJhdGVDbHVzdGVyKHRpbWVjb2RlLCBibG9ja19jb3VudCkpOwotICAgIHJldHVybiBBcHBlbmREYXRhKGtTb3VyY2VJZCwgY2x1c3Rlci0+ZGF0YSgpLCBjbHVzdGVyLT5zaXplKCkpOwotICB9Ci0KLSAgYm9vbCBBcHBlbmREYXRhKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VfaWQsCi0gICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgewotICAgIEVYUEVDVF9DQUxMKGhvc3RfLCBBZGRCdWZmZXJlZFRpbWVSYW5nZShfLCBfKSkuVGltZXMoQW55TnVtYmVyKCkpOwotICAgIHJldHVybiBkZW11eGVyXy0+QXBwZW5kRGF0YShzb3VyY2VfaWQsIGRhdGEsIGxlbmd0aCk7Ci0gIH0KLQotICBib29sIEFwcGVuZERhdGFJblBpZWNlcyhjb25zdCB1aW50OCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgewotICAgIHJldHVybiBBcHBlbmREYXRhSW5QaWVjZXMoZGF0YSwgbGVuZ3RoLCA3KTsKLSAgfQotCi0gIGJvb2wgQXBwZW5kRGF0YUluUGllY2VzKGNvbnN0IHVpbnQ4KiBkYXRhLCBzaXplX3QgbGVuZ3RoLCBzaXplX3QgcGllY2Vfc2l6ZSkgewotICAgIGNvbnN0IHVpbnQ4KiBzdGFydCA9IGRhdGE7Ci0gICAgY29uc3QgdWludDgqIGVuZCA9IGRhdGEgKyBsZW5ndGg7Ci0gICAgd2hpbGUgKHN0YXJ0IDwgZW5kKSB7Ci0gICAgICBzaXplX3QgYXBwZW5kX3NpemUgPSBzdGQ6Om1pbihwaWVjZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihlbmQgLSBzdGFydCkpOwotICAgICAgaWYgKCFBcHBlbmREYXRhKHN0YXJ0LCBhcHBlbmRfc2l6ZSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIHN0YXJ0ICs9IGFwcGVuZF9zaXplOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGJvb2wgQXBwZW5kSW5pdFNlZ21lbnQoYm9vbCBoYXNfYXVkaW8sIGJvb2wgaGFzX3ZpZGVvKSB7Ci0gICAgcmV0dXJuIEFwcGVuZEluaXRTZWdtZW50V2l0aFNvdXJjZUlkKGtTb3VyY2VJZCwgaGFzX2F1ZGlvLCBoYXNfdmlkZW8pOwotICB9Ci0KLSAgYm9vbCBBcHBlbmRJbml0U2VnbWVudFdpdGhTb3VyY2VJZChjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX2F1ZGlvLCBib29sIGhhc192aWRlbykgewotICAgIHJldHVybiBBcHBlbmRJbml0U2VnbWVudFdpdGhFbmNyeXB0ZWRJbmZvKAotICAgICAgICBzb3VyY2VfaWQsIGhhc19hdWRpbywgaGFzX3ZpZGVvLCBmYWxzZSwgZmFsc2UpOwotICB9Ci0KLSAgYm9vbCBBcHBlbmRJbml0U2VnbWVudFdpdGhFbmNyeXB0ZWRJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19hdWRpbywgYm9vbCBoYXNfdmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2F1ZGlvX2VuY3J5cHRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfdmlkZW9fZW5jcnlwdGVkKSB7Ci0gICAgc2NvcGVkX2FycmF5PHVpbnQ4PiBpbmZvX3RyYWNrczsKLSAgICBpbnQgaW5mb190cmFja3Nfc2l6ZSA9IDA7Ci0gICAgQ3JlYXRlSW5pdFNlZ21lbnQoaGFzX2F1ZGlvLCBoYXNfdmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgaXNfYXVkaW9fZW5jcnlwdGVkLCBpc192aWRlb19lbmNyeXB0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgJmluZm9fdHJhY2tzLCAmaW5mb190cmFja3Nfc2l6ZSk7Ci0gICAgcmV0dXJuIEFwcGVuZERhdGEoc291cmNlX2lkLCBpbmZvX3RyYWNrcy5nZXQoKSwgaW5mb190cmFja3Nfc2l6ZSk7Ci0gIH0KLQotICBib29sIEFwcGVuZEdhcmJhZ2UoKSB7Ci0gICAgLy8gRmlsbCB1cCBhbiBhcnJheSB3aXRoIGdpYmJlcmlzaC4KLSAgICBpbnQgZ2FyYmFnZV9jbHVzdGVyX3NpemUgPSAxMDsKLSAgICBzY29wZWRfYXJyYXk8dWludDg+IGdhcmJhZ2VfY2x1c3RlcihuZXcgdWludDhbZ2FyYmFnZV9jbHVzdGVyX3NpemVdKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGdhcmJhZ2VfY2x1c3Rlcl9zaXplOyArK2kpCi0gICAgICBnYXJiYWdlX2NsdXN0ZXJbaV0gPSBpOwotICAgIHJldHVybiBBcHBlbmREYXRhKGdhcmJhZ2VfY2x1c3Rlci5nZXQoKSwgZ2FyYmFnZV9jbHVzdGVyX3NpemUpOwotICB9Ci0KLSAgdm9pZCBJbml0RG9uZUNhbGxlZChQaXBlbGluZVN0YXR1cyBleHBlY3RlZF9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgUGlwZWxpbmVTdGF0dXMgc3RhdHVzKSB7Ci0gICAgRVhQRUNUX0VRKHN0YXR1cywgZXhwZWN0ZWRfc3RhdHVzKTsKLSAgfQotCi0gIGJvb2wgQXBwZW5kRW1wdHlDbHVzdGVyKGludCB0aW1lY29kZSkgewotICAgIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gZW1wdHlfY2x1c3RlciA9IEdlbmVyYXRlRW1wdHlDbHVzdGVyKHRpbWVjb2RlKTsKLSAgICByZXR1cm4gQXBwZW5kRGF0YShlbXB0eV9jbHVzdGVyLT5kYXRhKCksIGVtcHR5X2NsdXN0ZXItPnNpemUoKSk7Ci0gIH0KLQotICBQaXBlbGluZVN0YXR1c0NCIENyZWF0ZUluaXREb25lQ0IoY29uc3QgYmFzZTo6VGltZURlbHRhJiBleHBlY3RlZF9kdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lU3RhdHVzIGV4cGVjdGVkX3N0YXR1cykgewotICAgIGlmIChleHBlY3RlZF9kdXJhdGlvbiAhPSBrTm9UaW1lc3RhbXAoKSkKLSAgICAgIEVYUEVDVF9DQUxMKGhvc3RfLCBTZXREdXJhdGlvbihleHBlY3RlZF9kdXJhdGlvbikpOwotICAgIHJldHVybiBDcmVhdGVJbml0RG9uZUNCKGV4cGVjdGVkX3N0YXR1cyk7Ci0gIH0KLQotICBQaXBlbGluZVN0YXR1c0NCIENyZWF0ZUluaXREb25lQ0IoUGlwZWxpbmVTdGF0dXMgZXhwZWN0ZWRfc3RhdHVzKSB7Ci0gICAgcmV0dXJuIGJhc2U6OkJpbmQoJkNodW5rRGVtdXhlclRlc3Q6OkluaXREb25lQ2FsbGVkLAotICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksCi0gICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfc3RhdHVzKTsKLSAgfQotCi0gIGJvb2wgSW5pdERlbXV4ZXIoYm9vbCBoYXNfYXVkaW8sIGJvb2wgaGFzX3ZpZGVvKSB7Ci0gICAgcmV0dXJuIEluaXREZW11eGVyV2l0aEVuY3J5cHRpb25JbmZvKGhhc19hdWRpbywgaGFzX3ZpZGVvLCBmYWxzZSwgZmFsc2UpOwotICB9Ci0KLSAgYm9vbCBJbml0RGVtdXhlcldpdGhFbmNyeXB0aW9uSW5mbygKLSAgICAgIGJvb2wgaGFzX2F1ZGlvLCBib29sIGhhc192aWRlbywKLSAgICAgIGJvb2wgaXNfYXVkaW9fZW5jcnlwdGVkLCBib29sIGlzX3ZpZGVvX2VuY3J5cHRlZCkgewotICAgIFBpcGVsaW5lU3RhdHVzIGV4cGVjdGVkX3N0YXR1cyA9Ci0gICAgICAgIChoYXNfYXVkaW8gfHwgaGFzX3ZpZGVvKSA/IFBJUEVMSU5FX09LIDogREVNVVhFUl9FUlJPUl9DT1VMRF9OT1RfT1BFTjsKLQotICAgIGJhc2U6OlRpbWVEZWx0YSBleHBlY3RlZF9kdXJhdGlvbiA9IGtOb1RpbWVzdGFtcCgpOwotICAgIGlmIChleHBlY3RlZF9zdGF0dXMgPT0gUElQRUxJTkVfT0spCi0gICAgICBleHBlY3RlZF9kdXJhdGlvbiA9IGtEZWZhdWx0RHVyYXRpb24oKTsKLQotICAgIEVYUEVDVF9DQUxMKCp0aGlzLCBEZW11eGVyT3BlbmVkKCkpOwotICAgIGRlbXV4ZXJfLT5Jbml0aWFsaXplKAotICAgICAgICAmaG9zdF8sIENyZWF0ZUluaXREb25lQ0IoZXhwZWN0ZWRfZHVyYXRpb24sIGV4cGVjdGVkX3N0YXR1cykpOwotCi0gICAgaWYgKEFkZElkKGtTb3VyY2VJZCwgaGFzX2F1ZGlvLCBoYXNfdmlkZW8pICE9IENodW5rRGVtdXhlcjo6a09rKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuIEFwcGVuZEluaXRTZWdtZW50V2l0aEVuY3J5cHRlZEluZm8oCi0gICAgICAgIGtTb3VyY2VJZCwgaGFzX2F1ZGlvLCBoYXNfdmlkZW8sCi0gICAgICAgIGlzX2F1ZGlvX2VuY3J5cHRlZCwgaXNfdmlkZW9fZW5jcnlwdGVkKTsKLSAgfQotCi0gIGJvb2wgSW5pdERlbXV4ZXJBdWRpb0FuZFZpZGVvU291cmNlcyhjb25zdCBzdGQ6OnN0cmluZyYgYXVkaW9faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmlkZW9faWQpIHsKLSAgICBFWFBFQ1RfQ0FMTCgqdGhpcywgRGVtdXhlck9wZW5lZCgpKTsKLSAgICBkZW11eGVyXy0+SW5pdGlhbGl6ZSgKLSAgICAgICAgJmhvc3RfLCBDcmVhdGVJbml0RG9uZUNCKGtEZWZhdWx0RHVyYXRpb24oKSwgUElQRUxJTkVfT0spKTsKLQotICAgIGlmIChBZGRJZChhdWRpb19pZCwgdHJ1ZSwgZmFsc2UpICE9IENodW5rRGVtdXhlcjo6a09rKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChBZGRJZCh2aWRlb19pZCwgZmFsc2UsIHRydWUpICE9IENodW5rRGVtdXhlcjo6a09rKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgYm9vbCBzdWNjZXNzID0gQXBwZW5kSW5pdFNlZ21lbnRXaXRoU291cmNlSWQoYXVkaW9faWQsIHRydWUsIGZhbHNlKTsKLSAgICBzdWNjZXNzICY9IEFwcGVuZEluaXRTZWdtZW50V2l0aFNvdXJjZUlkKHZpZGVvX2lkLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gIH0KLQotICAvLyBJbml0aWFsaXplcyB0aGUgZGVtdXhlciB3aXRoIGRhdGEgZnJvbSAyIGZpbGVzIHdpdGggZGlmZmVyZW50Ci0gIC8vIGRlY29kZXIgY29uZmlndXJhdGlvbnMuIFRoaXMgaXMgdXNlZCB0byB0ZXN0IHRoZSBkZWNvZGVyIGNvbmZpZyBjaGFuZ2UKLSAgLy8gbG9naWMuCi0gIC8vCi0gIC8vIGJlYXItMzIweDI0MC53ZWJtIFZpZGVvRGVjb2RlckNvbmZpZyByZXR1cm5zIDMyMHgyNDAgZm9yIGl0cyBuYXR1cmFsX3NpemUoKQotICAvLyBiZWFyLTY0MHgzNjAud2VibSBWaWRlb0RlY29kZXJDb25maWcgcmV0dXJucyA2NDB4MzYwIGZvciBpdHMgbmF0dXJhbF9zaXplKCkKLSAgLy8gVGhlIHJlc3VsdGluZyB2aWRlbyBzdHJlYW0gcmV0dXJucyBkYXRhIGZyb20gZWFjaCBmaWxlIGZvciB0aGUgZm9sbG93aW5nCi0gIC8vIHRpbWUgcmFuZ2VzLgotICAvLyBiZWFyLTMyMHgyNDAud2VibSA6IFswLTUwMSkgICAgICAgWzgwMS0yNzM3KQotICAvLyBiZWFyLTY0MHgzNjAud2VibSA6ICAgICAgIFs1MjctNzkzKQotICAvLwotICAvLyBiZWFyLTMyMHgyNDAud2VibSBBdWRpb0RlY29kZXJDb25maWcgcmV0dXJucyAzODYzIGZvciBpdHMgZXh0cmFfZGF0YV9zaXplKCkKLSAgLy8gYmVhci02NDB4MzYwLndlYm0gQXVkaW9EZWNvZGVyQ29uZmlnIHJldHVybnMgMzkzNSBmb3IgaXRzIGV4dHJhX2RhdGFfc2l6ZSgpCi0gIC8vIFRoZSByZXN1bHRpbmcgYXVkaW8gc3RyZWFtIHJldHVybnMgZGF0YSBmcm9tIGVhY2ggZmlsZSBmb3IgdGhlIGZvbGxvd2luZwotICAvLyB0aW1lIHJhbmdlcy4KLSAgLy8gYmVhci0zMjB4MjQwLndlYm0gOiBbMC01MjQpICAgICAgIFs3NzktMjczNykKLSAgLy8gYmVhci02NDB4MzYwLndlYm0gOiAgICAgICBbNTI3LTc1OSkKLSAgYm9vbCBJbml0RGVtdXhlcldpdGhDb25maWdDaGFuZ2VEYXRhKCkgewotICAgIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gYmVhcjEgPSBSZWFkVGVzdERhdGFGaWxlKCJiZWFyLTMyMHgyNDAud2VibSIpOwotICAgIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gYmVhcjIgPSBSZWFkVGVzdERhdGFGaWxlKCJiZWFyLTY0MHgzNjAud2VibSIpOwotCi0gICAgRVhQRUNUX0NBTEwoKnRoaXMsIERlbXV4ZXJPcGVuZWQoKSk7Ci0gICAgZGVtdXhlcl8tPkluaXRpYWxpemUoCi0gICAgICAgICZob3N0XywgQ3JlYXRlSW5pdERvbmVDQihiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMjc0NCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVBFTElORV9PSykpOwotCi0gICAgaWYgKEFkZElkKGtTb3VyY2VJZCwgdHJ1ZSwgdHJ1ZSkgIT0gQ2h1bmtEZW11eGVyOjprT2spCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBBcHBlbmQgdGhlIHdob2xlIGJlYXIxIGZpbGUuCi0gICAgaWYgKCFBcHBlbmREYXRhKGJlYXIxLT5HZXREYXRhKCksIGJlYXIxLT5HZXREYXRhU2l6ZSgpKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBDaGVja0V4cGVjdGVkUmFuZ2VzKGtTb3VyY2VJZCwgInsgWzAsMjczNykgfSIpOwotCi0gICAgLy8gQXBwZW5kIGluaXRpYWxpemF0aW9uIHNlZ21lbnQgZm9yIGJlYXIyLgotICAgIC8vIE5vdGU6IE9mZnNldHMgaGVyZSBhbmQgYmVsb3cgYXJlIGRlcml2ZWQgZnJvbQotICAgIC8vIG1lZGlhL3Rlc3QvZGF0YS9iZWFyLTY0MHgzNjAtbWFuaWZlc3QuanMgYW5kCi0gICAgLy8gbWVkaWEvdGVzdC9kYXRhL2JlYXItMzIweDI0MC1tYW5pZmVzdC5qcyB3aGljaCB3ZXJlCi0gICAgLy8gZ2VuZXJhdGVkIGZyb20gbWVkaWEvdGVzdC9kYXRhL2JlYXItNjQweDM2MC53ZWJtIGFuZAotICAgIC8vIG1lZGlhL3Rlc3QvZGF0YS9iZWFyLTMyMHgyNDAud2VibSByZXNwZWN0aXZlbHkuCi0gICAgaWYgKCFBcHBlbmREYXRhKGJlYXIyLT5HZXREYXRhKCksIDQzNDApKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gQXBwZW5kIGEgbWVkaWEgc2VnbWVudCB0aGF0IGdvZXMgZnJvbSBbMC41MjcwMDAsIDEuMDE0MDAwKS4KLSAgICBpZiAoIUFwcGVuZERhdGEoYmVhcjItPkdldERhdGEoKSArIDU1MjkwLCAxODc4NSkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgQ2hlY2tFeHBlY3RlZFJhbmdlcyhrU291cmNlSWQsICJ7IFswLDEwMjgpIFsxMjAxLDI3MzcpIH0iKTsKLQotICAgIC8vIEFwcGVuZCBpbml0aWFsaXphdGlvbiBzZWdtZW50IGZvciBiZWFyMSAmIGZpbGwgZ2FwIHdpdGggWzc3OS0xMTk3KQotICAgIC8vIHNlZ21lbnQuCi0gICAgaWYgKCFBcHBlbmREYXRhKGJlYXIxLT5HZXREYXRhKCksIDQzNzApIHx8Ci0gICAgICAgICFBcHBlbmREYXRhKGJlYXIxLT5HZXREYXRhKCkgKyA3MjczNywgMjgxODMpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIENoZWNrRXhwZWN0ZWRSYW5nZXMoa1NvdXJjZUlkLCAieyBbMCwyNzM3KSB9Iik7Ci0KLSAgICByZXR1cm4gZGVtdXhlcl8tPkVuZE9mU3RyZWFtKFBJUEVMSU5FX09LKTsKLSAgfQotCi0gIHZvaWQgU2h1dGRvd25EZW11eGVyKCkgewotICAgIGlmIChkZW11eGVyXykKLSAgICAgIGRlbXV4ZXJfLT5TaHV0ZG93bigpOwotICB9Ci0KLSAgdm9pZCBBZGRTaW1wbGVCbG9jayhDbHVzdGVyQnVpbGRlciogY2IsIGludCB0cmFja19udW0sIGludDY0IHRpbWVjb2RlKSB7Ci0gICAgdWludDggZGF0YVtdID0geyAweDAwIH07Ci0gICAgY2ItPkFkZFNpbXBsZUJsb2NrKHRyYWNrX251bSwgdGltZWNvZGUsIDAsIGRhdGEsIHNpemVvZihkYXRhKSk7Ci0gIH0KLQotICBzY29wZWRfcHRyPENsdXN0ZXI+IEdlbmVyYXRlQ2x1c3RlcihpbnQgdGltZWNvZGUsIGludCBibG9ja19jb3VudCkgewotICAgIHJldHVybiBHZW5lcmF0ZUNsdXN0ZXIodGltZWNvZGUsIHRpbWVjb2RlLCBibG9ja19jb3VudCk7Ci0gIH0KLQotICBzY29wZWRfcHRyPENsdXN0ZXI+IEdlbmVyYXRlQ2x1c3RlcihpbnQgZmlyc3RfYXVkaW9fdGltZWNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaXJzdF92aWRlb190aW1lY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrX2NvdW50KSB7Ci0gICAgQ0hFQ0tfR1QoYmxvY2tfY291bnQsIDApOwotCi0gICAgaW50IHNpemUgPSAxMDsKLSAgICBzY29wZWRfYXJyYXk8dWludDg+IGRhdGEobmV3IHVpbnQ4W3NpemVdKTsKLQotICAgIENsdXN0ZXJCdWlsZGVyIGNiOwotICAgIGNiLlNldENsdXN0ZXJUaW1lY29kZShzdGQ6Om1pbihmaXJzdF9hdWRpb190aW1lY29kZSwgZmlyc3RfdmlkZW9fdGltZWNvZGUpKTsKLQotICAgIGlmIChibG9ja19jb3VudCA9PSAxKSB7Ci0gICAgICBjYi5BZGRCbG9ja0dyb3VwKGtBdWRpb1RyYWNrTnVtLCBmaXJzdF9hdWRpb190aW1lY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAga0F1ZGlvQmxvY2tEdXJhdGlvbiwga1dlYk1GbGFnS2V5ZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0KCksIHNpemUpOwotICAgICAgcmV0dXJuIGNiLkZpbmlzaCgpOwotICAgIH0KLQotICAgIGludCBhdWRpb190aW1lY29kZSA9IGZpcnN0X2F1ZGlvX3RpbWVjb2RlOwotICAgIGludCB2aWRlb190aW1lY29kZSA9IGZpcnN0X3ZpZGVvX3RpbWVjb2RlOwotCi0gICAgLy8gQ3JlYXRlIHNpbXBsZSBibG9ja3MgZm9yIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBsYXN0IDIgYmxvY2tzLgotICAgIC8vIFRoZSBmaXJzdCB2aWRlbyBmcmFtZSBtdXN0IGJlIGEga2V5ZnJhbWUuCi0gICAgdWludDggdmlkZW9fZmxhZyA9IGtXZWJNRmxhZ0tleWZyYW1lOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmxvY2tfY291bnQgLSAyOyBpKyspIHsKLSAgICAgIGlmIChhdWRpb190aW1lY29kZSA8PSB2aWRlb190aW1lY29kZSkgewotICAgICAgICBjYi5BZGRTaW1wbGVCbG9jayhrQXVkaW9UcmFja051bSwgYXVkaW9fdGltZWNvZGUsIGtXZWJNRmxhZ0tleWZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldCgpLCBzaXplKTsKLSAgICAgICAgYXVkaW9fdGltZWNvZGUgKz0ga0F1ZGlvQmxvY2tEdXJhdGlvbjsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGNiLkFkZFNpbXBsZUJsb2NrKGtWaWRlb1RyYWNrTnVtLCB2aWRlb190aW1lY29kZSwgdmlkZW9fZmxhZywgZGF0YS5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOwotICAgICAgdmlkZW9fdGltZWNvZGUgKz0ga1ZpZGVvQmxvY2tEdXJhdGlvbjsKLSAgICAgIHZpZGVvX2ZsYWcgPSAwOwotICAgIH0KLQotICAgIC8vIE1ha2UgdGhlIGxhc3QgMiBibG9ja3MgQmxvY2tHcm91cHMgc28gdGhhdCB0aGV5IGRvbid0IGdldCBkZWxheWVkIGJ5IHRoZQotICAgIC8vIGJsb2NrIGR1cmF0aW9uIGNhbGN1bGF0aW9uIGxvZ2ljLgotICAgIGlmIChhdWRpb190aW1lY29kZSA8PSB2aWRlb190aW1lY29kZSkgewotICAgICAgY2IuQWRkQmxvY2tHcm91cChrQXVkaW9UcmFja051bSwgYXVkaW9fdGltZWNvZGUsIGtBdWRpb0Jsb2NrRHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGtXZWJNRmxhZ0tleWZyYW1lLCBkYXRhLmdldCgpLCBzaXplKTsKLSAgICAgIGNiLkFkZEJsb2NrR3JvdXAoa1ZpZGVvVHJhY2tOdW0sIHZpZGVvX3RpbWVjb2RlLCBrVmlkZW9CbG9ja0R1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICB2aWRlb19mbGFnLCBkYXRhLmdldCgpLCBzaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgY2IuQWRkQmxvY2tHcm91cChrVmlkZW9UcmFja051bSwgdmlkZW9fdGltZWNvZGUsIGtWaWRlb0Jsb2NrRHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIHZpZGVvX2ZsYWcsIGRhdGEuZ2V0KCksIHNpemUpOwotICAgICAgY2IuQWRkQmxvY2tHcm91cChrQXVkaW9UcmFja051bSwgYXVkaW9fdGltZWNvZGUsIGtBdWRpb0Jsb2NrRHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGtXZWJNRmxhZ0tleWZyYW1lLCBkYXRhLmdldCgpLCBzaXplKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY2IuRmluaXNoKCk7Ci0gIH0KLQotICBzY29wZWRfcHRyPENsdXN0ZXI+IEdlbmVyYXRlU2luZ2xlU3RyZWFtQ2x1c3RlcihpbnQgdGltZWNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmRfdGltZWNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFja19udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja19kdXJhdGlvbikgewotICAgIENIRUNLX0dUKGVuZF90aW1lY29kZSwgdGltZWNvZGUpOwotCi0gICAgaW50IHNpemUgPSAxMDsKLSAgICBzY29wZWRfYXJyYXk8dWludDg+IGRhdGEobmV3IHVpbnQ4W3NpemVdKTsKLQotICAgIENsdXN0ZXJCdWlsZGVyIGNiOwotICAgIGNiLlNldENsdXN0ZXJUaW1lY29kZSh0aW1lY29kZSk7Ci0KLSAgICAvLyBDcmVhdGUgc2ltcGxlIGJsb2NrcyBmb3IgZXZlcnl0aGluZyBleGNlcHQgdGhlIGxhc3QgYmxvY2suCi0gICAgZm9yIChpbnQgaSA9IDA7IHRpbWVjb2RlIDwgKGVuZF90aW1lY29kZSAtIGJsb2NrX2R1cmF0aW9uKTsgaSsrKSB7Ci0gICAgICBjYi5BZGRTaW1wbGVCbG9jayh0cmFja19udW1iZXIsIHRpbWVjb2RlLCBrV2ViTUZsYWdLZXlmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0KCksIHNpemUpOwotICAgICAgdGltZWNvZGUgKz0gYmxvY2tfZHVyYXRpb247Ci0gICAgfQotCi0gICAgLy8gTWFrZSB0aGUgbGFzdCBibG9jayBhIEJsb2NrR3JvdXAgc28gdGhhdCBpdCBkb2Vzbid0IGdldCBkZWxheWVkIGJ5IHRoZQotICAgIC8vIGJsb2NrIGR1cmF0aW9uIGNhbGN1bGF0aW9uIGxvZ2ljLgotICAgIGNiLkFkZEJsb2NrR3JvdXAodHJhY2tfbnVtYmVyLCB0aW1lY29kZSwgYmxvY2tfZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAga1dlYk1GbGFnS2V5ZnJhbWUsIGRhdGEuZ2V0KCksIHNpemUpOwotICAgIHJldHVybiBjYi5GaW5pc2goKTsKLSAgfQotCi0gIHZvaWQgR2VuZXJhdGVFeHBlY3RlZFJlYWRzKGludCB0aW1lY29kZSwgaW50IGJsb2NrX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW11eGVyU3RyZWFtKiBhdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVtdXhlclN0cmVhbSogdmlkZW8pIHsKLSAgICBHZW5lcmF0ZUV4cGVjdGVkUmVhZHModGltZWNvZGUsIHRpbWVjb2RlLCBibG9ja19jb3VudCwgYXVkaW8sIHZpZGVvKTsKLSAgfQotCi0gIHZvaWQgR2VuZXJhdGVFeHBlY3RlZFJlYWRzKGludCBzdGFydF9hdWRpb190aW1lY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ZpZGVvX3RpbWVjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tfY291bnQsIERlbXV4ZXJTdHJlYW0qIGF1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW11eGVyU3RyZWFtKiB2aWRlbykgewotICAgIENIRUNLX0dUKGJsb2NrX2NvdW50LCAwKTsKLQotICAgIGlmIChibG9ja19jb3VudCA9PSAxKSB7Ci0gICAgICBFeHBlY3RSZWFkKGF1ZGlvLCBzdGFydF9hdWRpb190aW1lY29kZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaW50IGF1ZGlvX3RpbWVjb2RlID0gc3RhcnRfYXVkaW9fdGltZWNvZGU7Ci0gICAgaW50IHZpZGVvX3RpbWVjb2RlID0gc3RhcnRfdmlkZW9fdGltZWNvZGU7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGJsb2NrX2NvdW50OyBpKyspIHsKLSAgICAgIGlmIChhdWRpb190aW1lY29kZSA8PSB2aWRlb190aW1lY29kZSkgewotICAgICAgICBFeHBlY3RSZWFkKGF1ZGlvLCBhdWRpb190aW1lY29kZSk7Ci0gICAgICAgIGF1ZGlvX3RpbWVjb2RlICs9IGtBdWRpb0Jsb2NrRHVyYXRpb247Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBFeHBlY3RSZWFkKHZpZGVvLCB2aWRlb190aW1lY29kZSk7Ci0gICAgICB2aWRlb190aW1lY29kZSArPSBrVmlkZW9CbG9ja0R1cmF0aW9uOwotICAgIH0KLSAgfQotCi0gIHZvaWQgR2VuZXJhdGVTaW5nbGVTdHJlYW1FeHBlY3RlZFJlYWRzKAotICAgICAgaW50IHRpbWVjb2RlLCBpbnQgYmxvY2tfY291bnQsIERlbXV4ZXJTdHJlYW0qIHN0cmVhbSwKLSAgICAgIGludCBibG9ja19kdXJhdGlvbikgewotICAgIENIRUNLX0dUKGJsb2NrX2NvdW50LCAwKTsKLSAgICBpbnQgc3RyZWFtX3RpbWVjb2RlID0gdGltZWNvZGU7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGJsb2NrX2NvdW50OyBpKyspIHsKLSAgICAgIEV4cGVjdFJlYWQoc3RyZWFtLCBzdHJlYW1fdGltZWNvZGUpOwotICAgICAgc3RyZWFtX3RpbWVjb2RlICs9IGJsb2NrX2R1cmF0aW9uOwotICAgIH0KLSAgfQotCi0gIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gR2VuZXJhdGVFbXB0eUNsdXN0ZXIoaW50IHRpbWVjb2RlKSB7Ci0gICAgQ2x1c3RlckJ1aWxkZXIgY2I7Ci0gICAgY2IuU2V0Q2x1c3RlclRpbWVjb2RlKHRpbWVjb2RlKTsKLSAgICByZXR1cm4gY2IuRmluaXNoKCk7Ci0gIH0KLQotICB2b2lkIENoZWNrRXhwZWN0ZWRSYW5nZXMoY29uc3Qgc3RkOjpzdHJpbmcmIGV4cGVjdGVkKSB7Ci0gICAgQ2hlY2tFeHBlY3RlZFJhbmdlcyhrU291cmNlSWQsIGV4cGVjdGVkKTsKLSAgfQotCi0gIHZvaWQgQ2hlY2tFeHBlY3RlZFJhbmdlcyhjb25zdCBzdGQ6OnN0cmluZyYgIGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGV4cGVjdGVkKSB7Ci0gICAgUmFuZ2VzPGJhc2U6OlRpbWVEZWx0YT4gciA9IGRlbXV4ZXJfLT5HZXRCdWZmZXJlZFJhbmdlcyhpZCk7Ci0KLSAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgICBzcyA8PCAieyAiOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgci5zaXplKCk7ICsraSkgewotICAgICAgc3MgPDwgIlsiIDw8IHIuc3RhcnQoaSkuSW5NaWxsaXNlY29uZHMoKSA8PCAiLCIKLSAgICAgICAgIDw8IHIuZW5kKGkpLkluTWlsbGlzZWNvbmRzKCkgPDwgIikgIjsKLSAgICB9Ci0gICAgc3MgPDwgIn0iOwotICAgIEVYUEVDVF9FUShzcy5zdHIoKSwgZXhwZWN0ZWQpOwotICB9Ci0KLSAgTU9DS19NRVRIT0QyKFJlYWREb25lLCB2b2lkKERlbXV4ZXJTdHJlYW06OlN0YXR1cyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JikpOwotCi0gIHZvaWQgRXhwZWN0RW5kT2ZTdHJlYW0oRGVtdXhlclN0cmVhbSogc3RyZWFtKSB7Ci0gICAgRVhQRUNUX0NBTEwoKnRoaXMsIFJlYWREb25lKERlbXV4ZXJTdHJlYW06OmtPaywgSXNFbmRPZlN0cmVhbSgpKSk7Ci0gICAgc3RyZWFtLT5SZWFkKGJhc2U6OkJpbmQoJkNodW5rRGVtdXhlclRlc3Q6OlJlYWREb25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLSAgfQotCi0gIHZvaWQgRXhwZWN0UmVhZChEZW11eGVyU3RyZWFtKiBzdHJlYW0sIGludDY0IHRpbWVzdGFtcF9pbl9tcykgewotICAgIEVYUEVDVF9DQUxMKCp0aGlzLCBSZWFkRG9uZShEZW11eGVyU3RyZWFtOjprT2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc1RpbWVzdGFtcCh0aW1lc3RhbXBfaW5fbXMpKSk7Ci0gICAgc3RyZWFtLT5SZWFkKGJhc2U6OkJpbmQoJkNodW5rRGVtdXhlclRlc3Q6OlJlYWREb25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLSAgfQotCi0gIHZvaWQgRXhwZWN0Q29uZmlnQ2hhbmdlZChEZW11eGVyU3RyZWFtKiBzdHJlYW0pIHsKLSAgICBFWFBFQ1RfQ0FMTCgqdGhpcywgUmVhZERvbmUoRGVtdXhlclN0cmVhbTo6a0NvbmZpZ0NoYW5nZWQsIF8pKTsKLSAgICBzdHJlYW0tPlJlYWQoYmFzZTo6QmluZCgmQ2h1bmtEZW11eGVyVGVzdDo6UmVhZERvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICB9Ci0KLSAgTU9DS19NRVRIT0QxKENoZWNrcG9pbnQsIHZvaWQoaW50IGlkKSk7Ci0KLSAgc3RydWN0IEJ1ZmZlclRpbWVzdGFtcHMgewotICAgIGludCB2aWRlb190aW1lX21zOwotICAgIGludCBhdWRpb190aW1lX21zOwotICB9OwotICBzdGF0aWMgY29uc3QgaW50IGtTa2lwID0gLTE7Ci0KLSAgLy8gVGVzdCBwYXJzaW5nIGEgV2ViTSBmaWxlLgotICAvLyB8ZmlsZW5hbWV8IC0gVGhlIG5hbWUgb2YgdGhlIGZpbGUgaW4gbWVkaWEvdGVzdC9kYXRhIHRvIHBhcnNlLgotICAvLyB8dGltZXN0YW1wc3wgLSBUaGUgZXhwZWN0ZWQgdGltZXN0YW1wcyBvbiB0aGUgcGFyc2VkIGJ1ZmZlcnMuCi0gIC8vICAgIGEgdGltZXN0YW1wIG9mIGtTa2lwIGluZGljYXRlcyB0aGF0IGEgUmVhZCgpIGNhbGwgZm9yIHRoYXQgc3RyZWFtCi0gIC8vICAgIHNob3VsZG4ndCBiZSBtYWRlIG9uIHRoYXQgaXRlcmF0aW9uIG9mIHRoZSBsb29wLiBJZiBib3RoIHN0cmVhbXMgaGF2ZQotICAvLyAgICBhIGtTa2lwIHRoZW4gdGhlIGxvb3Agd2lsbCB0ZXJtaW5hdGUuCi0gIGJvb2wgUGFyc2VXZWJNRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBCdWZmZXJUaW1lc3RhbXBzKiB0aW1lc3RhbXBzLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6VGltZURlbHRhJiBkdXJhdGlvbikgewotICAgIHJldHVybiBQYXJzZVdlYk1GaWxlKGZpbGVuYW1lLCB0aW1lc3RhbXBzLCBkdXJhdGlvbiwgdHJ1ZSwgdHJ1ZSk7Ci0gIH0KLQotICBib29sIFBhcnNlV2ViTUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnVmZmVyVGltZXN0YW1wcyogdGltZXN0YW1wcywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSYgZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICBib29sIGhhc19hdWRpbywgYm9vbCBoYXNfdmlkZW8pIHsKLSAgICBFWFBFQ1RfQ0FMTCgqdGhpcywgRGVtdXhlck9wZW5lZCgpKTsKLSAgICBkZW11eGVyXy0+SW5pdGlhbGl6ZSgKLSAgICAgICAgJmhvc3RfLCBDcmVhdGVJbml0RG9uZUNCKGR1cmF0aW9uLCBQSVBFTElORV9PSykpOwotCi0gICAgaWYgKEFkZElkKGtTb3VyY2VJZCwgaGFzX2F1ZGlvLCBoYXNfdmlkZW8pICE9IENodW5rRGVtdXhlcjo6a09rKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gUmVhZCBhIFdlYk0gZmlsZSBpbnRvIG1lbW9yeSBhbmQgc2VuZCB0aGUgZGF0YSB0byB0aGUgZGVtdXhlci4KLSAgICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGJ1ZmZlciA9IFJlYWRUZXN0RGF0YUZpbGUoZmlsZW5hbWUpOwotICAgIGlmICghQXBwZW5kRGF0YUluUGllY2VzKGJ1ZmZlci0+R2V0RGF0YSgpLCBidWZmZXItPkdldERhdGFTaXplKCksIDUxMikpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IGF1ZGlvID0KLSAgICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpBVURJTyk7Ci0gICAgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiB2aWRlbyA9Ci0gICAgICAgIGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6VklERU8pOwotCi0gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIHRpbWVzdGFtcHMgb24gdGhlIGZpcnN0IGZldyBwYWNrZXRzIG1hdGNoIHdoYXQgd2UKLSAgICAvLyBleHBlY3QuCi0gICAgZm9yIChzaXplX3QgaSA9IDA7Ci0gICAgICAgICAodGltZXN0YW1wc1tpXS5hdWRpb190aW1lX21zICE9IGtTa2lwIHx8Ci0gICAgICAgICAgdGltZXN0YW1wc1tpXS52aWRlb190aW1lX21zICE9IGtTa2lwKTsKLSAgICAgICAgIGkrKykgewotICAgICAgYm9vbCBhdWRpb19yZWFkX2RvbmUgPSBmYWxzZTsKLSAgICAgIGJvb2wgdmlkZW9fcmVhZF9kb25lID0gZmFsc2U7Ci0KLSAgICAgIGlmICh0aW1lc3RhbXBzW2ldLmF1ZGlvX3RpbWVfbXMgIT0ga1NraXApIHsKLSAgICAgICAgRENIRUNLKGF1ZGlvKTsKLSAgICAgICAgYXVkaW8tPlJlYWQoYmFzZTo6QmluZCgmT25SZWFkRG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcHNbaV0uYXVkaW9fdGltZV9tcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1ZGlvX3JlYWRfZG9uZSkpOwotICAgICAgICBFWFBFQ1RfVFJVRShhdWRpb19yZWFkX2RvbmUpOwotICAgICAgfQotCi0gICAgICBpZiAodGltZXN0YW1wc1tpXS52aWRlb190aW1lX21zICE9IGtTa2lwKSB7Ci0gICAgICAgIERDSEVDSyh2aWRlbyk7Ci0gICAgICAgIHZpZGVvLT5SZWFkKGJhc2U6OkJpbmQoJk9uUmVhZERvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBzW2ldLnZpZGVvX3RpbWVfbXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2aWRlb19yZWFkX2RvbmUpKTsKLQotICAgICAgICBFWFBFQ1RfVFJVRSh2aWRlb19yZWFkX2RvbmUpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgTU9DS19NRVRIT0QwKERlbXV4ZXJPcGVuZWQsIHZvaWQoKSk7Ci0gIC8vIFRPRE8oeGh3YW5nKTogVGhpcyBpcyBhIHdvcmthcm91bmQgb2YgdGhlIGlzc3VlIHRoYXQgbW92ZS1vbmx5IHBhcmFtZXRlcnMKLSAgLy8gYXJlIG5vdCBzdXBwb3J0ZWQgaW4gbW9ja2VkIG1ldGhvZHMuIFJlbW92ZSB0aGlzIHdoZW4gdGhlIGlzc3VlIGlzIGZpeGVkCi0gIC8vIChodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9pc3N1ZXMvZGV0YWlsP2lkPTM5NSkgb3Igd2hlbiB3ZSB1c2UKLSAgLy8gc3RkOjpzdHJpbmcgaW5zdGVhZCBvZiBzY29wZWRfYXJyYXk8dWludDg+IChodHRwOi8vY3JidWcuY29tLzEzMDY4OSkuCi0gIE1PQ0tfTUVUSE9EMyhOZWVkS2V5TW9jaywgdm9pZChjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBpbml0X2RhdGEsIGludCBpbml0X2RhdGFfc2l6ZSkpOwotICB2b2lkIERlbXV4ZXJOZWVkS2V5KGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9hcnJheTx1aW50OD4gaW5pdF9kYXRhLCBpbnQgaW5pdF9kYXRhX3NpemUpIHsKLSAgICBOZWVkS2V5TW9jayh0eXBlLCBpbml0X2RhdGEuZ2V0KCksIGluaXRfZGF0YV9zaXplKTsKLSAgfQotCi0gIE1lc3NhZ2VMb29wIG1lc3NhZ2VfbG9vcF87Ci0gIE1vY2tEZW11eGVySG9zdCBob3N0XzsKLQotICBzY29wZWRfcmVmcHRyPENodW5rRGVtdXhlcj4gZGVtdXhlcl87Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQ2h1bmtEZW11eGVyVGVzdCk7Ci19OwotCi1URVNUX0YoQ2h1bmtEZW11eGVyVGVzdCwgVGVzdEluaXQpIHsKLSAgLy8gVGVzdCBubyBzdHJlYW1zLCBhdWRpby1vbmx5LCB2aWRlby1vbmx5LCBhbmQgYXVkaW8gJiB2aWRlbyBzY2VuYXJpb3MuCi0gIC8vIEF1ZGlvIGFuZCB2aWRlbyBzdHJlYW1zIGNhbiBiZSBlbmNyeXB0ZWQgb3Igbm90IGVuY3J5cHRlZC4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0gICAgYm9vbCBoYXNfYXVkaW8gPSAoaSAmIDB4MSkgIT0gMDsKLSAgICBib29sIGhhc192aWRlbyA9IChpICYgMHgyKSAhPSAwOwotICAgIGJvb2wgaXNfYXVkaW9fZW5jcnlwdGVkID0gKGkgJiAweDQpICE9IDA7Ci0gICAgYm9vbCBpc192aWRlb19lbmNyeXB0ZWQgPSAoaSAmIDB4OCkgIT0gMDsKLQotICAgIC8vIE5vIHRlc3Qgb24gaW52YWxpZCBjb21iaW5hdGlvbi4KLSAgICBpZiAoKCFoYXNfYXVkaW8gJiYgaXNfYXVkaW9fZW5jcnlwdGVkKSB8fAotICAgICAgICAoIWhhc192aWRlbyAmJiBpc192aWRlb19lbmNyeXB0ZWQpKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBDcmVhdGVOZXdEZW11eGVyKCk7Ci0KLSAgICBpZiAoaXNfYXVkaW9fZW5jcnlwdGVkIHx8IGlzX3ZpZGVvX2VuY3J5cHRlZCkgewotICAgICAgaW50IG5lZWRfa2V5X2NvdW50ID0gKGlzX2F1ZGlvX2VuY3J5cHRlZCA/IDEgOiAwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNfdmlkZW9fZW5jcnlwdGVkID8gMSA6IDApOwotICAgICAgRVhQRUNUX0NBTEwoKnRoaXMsIE5lZWRLZXlNb2NrKGtXZWJNSW5pdERhdGFUeXBlLCBOb3ROdWxsKCksIDE2KSkKLSAgICAgICAgICAuVGltZXMoRXhhY3RseShuZWVkX2tleV9jb3VudCkpOwotICAgIH0KLQotICAgIEFTU0VSVF9UUlVFKEluaXREZW11eGVyV2l0aEVuY3J5cHRpb25JbmZvKAotICAgICAgICBoYXNfYXVkaW8sIGhhc192aWRlbywgaXNfYXVkaW9fZW5jcnlwdGVkLCBpc192aWRlb19lbmNyeXB0ZWQpKTsKLQotICAgIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gYXVkaW9fc3RyZWFtID0KLSAgICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpBVURJTyk7Ci0gICAgaWYgKGhhc19hdWRpbykgewotICAgICAgQVNTRVJUX1RSVUUoYXVkaW9fc3RyZWFtKTsKLQotICAgICAgY29uc3QgQXVkaW9EZWNvZGVyQ29uZmlnJiBjb25maWcgPSBhdWRpb19zdHJlYW0tPmF1ZGlvX2RlY29kZXJfY29uZmlnKCk7Ci0gICAgICBFWFBFQ1RfRVEoa0NvZGVjVm9yYmlzLCBjb25maWcuY29kZWMoKSk7Ci0gICAgICBFWFBFQ1RfRVEoMTYsIGNvbmZpZy5iaXRzX3Blcl9jaGFubmVsKCkpOwotICAgICAgRVhQRUNUX0VRKENIQU5ORUxfTEFZT1VUX1NURVJFTywgY29uZmlnLmNoYW5uZWxfbGF5b3V0KCkpOwotICAgICAgRVhQRUNUX0VRKDQ0MTAwLCBjb25maWcuc2FtcGxlc19wZXJfc2Vjb25kKCkpOwotICAgICAgRVhQRUNUX1RSVUUoY29uZmlnLmV4dHJhX2RhdGEoKSk7Ci0gICAgICBFWFBFQ1RfR1QoY29uZmlnLmV4dHJhX2RhdGFfc2l6ZSgpLCAwdSk7Ci0gICAgICBFWFBFQ1RfRVEoaXNfYXVkaW9fZW5jcnlwdGVkLAotICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbS0+YXVkaW9fZGVjb2Rlcl9jb25maWcoKS5pc19lbmNyeXB0ZWQoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEVYUEVDVF9GQUxTRShhdWRpb19zdHJlYW0pOwotICAgIH0KLQotICAgIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gdmlkZW9fc3RyZWFtID0KLSAgICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpWSURFTyk7Ci0gICAgaWYgKGhhc192aWRlbykgewotICAgICAgRVhQRUNUX1RSVUUodmlkZW9fc3RyZWFtKTsKLSAgICAgIEVYUEVDVF9FUShpc192aWRlb19lbmNyeXB0ZWQsCi0gICAgICAgICAgICAgICAgdmlkZW9fc3RyZWFtLT52aWRlb19kZWNvZGVyX2NvbmZpZygpLmlzX2VuY3J5cHRlZCgpKTsKLSAgICB9IGVsc2UgewotICAgICAgRVhQRUNUX0ZBTFNFKHZpZGVvX3N0cmVhbSk7Ci0gICAgfQotCi0gICAgU2h1dGRvd25EZW11eGVyKCk7Ci0gICAgZGVtdXhlcl8gPSBOVUxMOwotICB9Ci19Ci0KLS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBkZW11eGVyIHJlcG9ydHMgYW4gZXJyb3IgaWYgU2h1dGRvd24oKQotLy8gaXMgY2FsbGVkIGJlZm9yZSBhbGwgdGhlIGluaXRpYWxpemF0aW9uIHNlZ21lbnRzIGFyZSBhcHBlbmRlZC4KLVRFU1RfRihDaHVua0RlbXV4ZXJUZXN0LCBUZXN0U2h1dGRvd25CZWZvcmVBbGxJbml0U2VnbWVudHNBcHBlbmRlZCkgewotICBFWFBFQ1RfQ0FMTCgqdGhpcywgRGVtdXhlck9wZW5lZCgpKTsKLSAgZGVtdXhlcl8tPkluaXRpYWxpemUoCi0gICAgICAmaG9zdF8sIENyZWF0ZUluaXREb25lQ0IoCi0gICAgICAgICAga0RlZmF1bHREdXJhdGlvbigpLCBERU1VWEVSX0VSUk9SX0NPVUxEX05PVF9PUEVOKSk7Ci0KLSAgRVhQRUNUX0VRKEFkZElkKCJhdWRpbyIsIHRydWUsIGZhbHNlKSwgQ2h1bmtEZW11eGVyOjprT2spOwotICBFWFBFQ1RfRVEoQWRkSWQoInZpZGVvIiwgZmFsc2UsIHRydWUpLCBDaHVua0RlbXV4ZXI6OmtPayk7Ci0KLSAgRVhQRUNUX1RSVUUoQXBwZW5kSW5pdFNlZ21lbnRXaXRoU291cmNlSWQoImF1ZGlvIiwgdHJ1ZSwgZmFsc2UpKTsKLX0KLQotLy8gVGVzdCB0aGF0IFNlZWsoKSBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5IHdoZW4gdGhlIGZpcnN0IGNsdXN0ZXIKLS8vIGFycml2ZXMuCi1URVNUX0YoQ2h1bmtEZW11eGVyVGVzdCwgVGVzdEFwcGVuZERhdGFBZnRlclNlZWspIHsKLSAgQVNTRVJUX1RSVUUoSW5pdERlbXV4ZXIodHJ1ZSwgdHJ1ZSkpOwotICBzY29wZWRfcHRyPENsdXN0ZXI+IGZpcnN0X2NsdXN0ZXIoa0RlZmF1bHRGaXJzdENsdXN0ZXIoKSk7Ci0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEoZmlyc3RfY2x1c3Rlci0+ZGF0YSgpLCBmaXJzdF9jbHVzdGVyLT5zaXplKCkpKTsKLQotICBJblNlcXVlbmNlIHM7Ci0KLSAgRVhQRUNUX0NBTEwoKnRoaXMsIENoZWNrcG9pbnQoMSkpOwotCi0gIGRlbXV4ZXJfLT5TZWVrKGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyg0NiksCi0gICAgICAgICAgICAgICAgIE5ld0V4cGVjdGVkU3RhdHVzQ0IoUElQRUxJTkVfT0spKTsKLQotICBFWFBFQ1RfQ0FMTCgqdGhpcywgQ2hlY2twb2ludCgyKSk7Ci0KLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyKGtEZWZhdWx0U2Vjb25kQ2x1c3RlcigpKTsKLQotICBDaGVja3BvaW50KDEpOwotCi0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEoY2x1c3Rlci0+ZGF0YSgpLCBjbHVzdGVyLT5zaXplKCkpKTsKLQotICBDaGVja3BvaW50KDIpOwotfQotCi0vLyBUZXN0IHRoYXQgcGFyc2luZyBlcnJvcnMgYXJlIGhhbmRsZWQgZm9yIGNsdXN0ZXJzIGFwcGVuZGVkIGFmdGVyIGluaXQuCi1URVNUX0YoQ2h1bmtEZW11eGVyVGVzdCwgVGVzdEVycm9yV2hpbGVQYXJzaW5nQ2x1c3RlckFmdGVySW5pdCkgewotICBBU1NFUlRfVFJVRShJbml0RGVtdXhlcih0cnVlLCB0cnVlKSk7Ci0gIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gZmlyc3RfY2x1c3RlcihrRGVmYXVsdEZpcnN0Q2x1c3RlcigpKTsKLSAgQVNTRVJUX1RSVUUoQXBwZW5kRGF0YShmaXJzdF9jbHVzdGVyLT5kYXRhKCksIGZpcnN0X2NsdXN0ZXItPnNpemUoKSkpOwotCi0gIEVYUEVDVF9DQUxMKGhvc3RfLCBPbkRlbXV4ZXJFcnJvcihQSVBFTElORV9FUlJPUl9ERUNPREUpKTsKLSAgQVNTRVJUX1RSVUUoQXBwZW5kR2FyYmFnZSgpKTsKLX0KLQotLy8gVGVzdCB0aGUgY2FzZSB3aGVyZSBhIFNlZWsoKSBpcyByZXF1ZXN0ZWQgd2hpbGUgdGhlIHBhcnNlcgotLy8gaXMgaW4gdGhlIG1pZGRsZSBvZiBjbHVzdGVyLiBUaGlzIGlzIHRvIHZlcmlmeSB0aGF0IHRoZSBwYXJzZXIKLS8vIGRvZXMgbm90IHJlc2V0IGl0c2VsZiBvbiBhIHNlZWsuCi1URVNUX0YoQ2h1bmtEZW11eGVyVGVzdCwgVGVzdFNlZWtXaGlsZVBhcnNpbmdDbHVzdGVyKSB7Ci0gIEFTU0VSVF9UUlVFKEluaXREZW11eGVyKHRydWUsIHRydWUpKTsKLQotICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IGF1ZGlvID0KLSAgICAgIGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6QVVESU8pOwotICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IHZpZGVvID0KLSAgICAgIGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6VklERU8pOwotCi0gIEluU2VxdWVuY2UgczsKLQotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXJfYShHZW5lcmF0ZUNsdXN0ZXIoMCwgNikpOwotCi0gIC8vIFNwbGl0IHRoZSBjbHVzdGVyIGludG8gdHdvIGFwcGVuZHMgYXQgYW4gYXJiaXRyYXJ5IHBvaW50IG5lYXIgdGhlIGVuZC4KLSAgaW50IGZpcnN0X2FwcGVuZF9zaXplID0gY2x1c3Rlcl9hLT5zaXplKCkgLSAxMTsKLSAgaW50IHNlY29uZF9hcHBlbmRfc2l6ZSA9IGNsdXN0ZXJfYS0+c2l6ZSgpIC0gZmlyc3RfYXBwZW5kX3NpemU7Ci0KLSAgLy8gQXBwZW5kIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBjbHVzdGVyLgotICBBU1NFUlRfVFJVRShBcHBlbmREYXRhKGNsdXN0ZXJfYS0+ZGF0YSgpLCBmaXJzdF9hcHBlbmRfc2l6ZSkpOwotCi0gIEV4cGVjdFJlYWQoYXVkaW8sIDApOwotICBFeHBlY3RSZWFkKHZpZGVvLCAwKTsKLSAgRXhwZWN0UmVhZChhdWRpbywga0F1ZGlvQmxvY2tEdXJhdGlvbik7Ci0gIC8vIE5vdGU6IFdlIHNraXAgdHJ5aW5nIHRvIHJlYWQgYSB2aWRlbyBidWZmZXIgaGVyZSBiZWNhdXNlIGNvbXB1dGluZwotICAvLyB0aGUgZHVyYXRpb24gZm9yIHRoaXMgYmxvY2sgcmVsaWVzIG9uIHN1Y2Nlc3NmdWxseSBwYXJzaW5nIHRoZSBsYXN0IGJsb2NrCi0gIC8vIGluIHRoZSBjbHVzdGVyIHRoZSBjbHVzdGVyLgotICBFeHBlY3RSZWFkKGF1ZGlvLCAyICoga0F1ZGlvQmxvY2tEdXJhdGlvbik7Ci0KLSAgZGVtdXhlcl8tPlN0YXJ0V2FpdGluZ0ZvclNlZWsoKTsKLSAgZGVtdXhlcl8tPlNlZWsoYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcyg1KSwKLSAgICAgICAgICAgICAgICAgTmV3RXhwZWN0ZWRTdGF0dXNDQihQSVBFTElORV9PSykpOwotCi0gIC8vIEFwcGVuZCB0aGUgcmVzdCBvZiB0aGUgY2x1c3Rlci4KLSAgQVNTRVJUX1RSVUUoQXBwZW5kRGF0YShjbHVzdGVyX2EtPmRhdGEoKSArIGZpcnN0X2FwcGVuZF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZF9hcHBlbmRfc2l6ZSkpOwotCi0gIC8vIEFwcGVuZCB0aGUgbmV3IGNsdXN0ZXIgYW5kIHZlcmlmeSB0aGF0IG9ubHkgdGhlIGJsb2NrcwotICAvLyBpbiB0aGUgbmV3IGNsdXN0ZXIgYXJlIHJldHVybmVkLgotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXJfYihHZW5lcmF0ZUNsdXN0ZXIoNTAwMCwgNikpOwotICBBU1NFUlRfVFJVRShBcHBlbmREYXRhKGNsdXN0ZXJfYi0+ZGF0YSgpLCBjbHVzdGVyX2ItPnNpemUoKSkpOwotICBHZW5lcmF0ZUV4cGVjdGVkUmVhZHMoNTAwMCwgNiwgYXVkaW8sIHZpZGVvKTsKLX0KLQotLy8gVGVzdCB0aGUgY2FzZSB3aGVyZSBBcHBlbmREYXRhKCkgaXMgY2FsbGVkIGJlZm9yZSBJbml0KCkuCi1URVNUX0YoQ2h1bmtEZW11eGVyVGVzdCwgVGVzdEFwcGVuZERhdGFCZWZvcmVJbml0KSB7Ci0gIHNjb3BlZF9hcnJheTx1aW50OD4gaW5mb190cmFja3M7Ci0gIGludCBpbmZvX3RyYWNrc19zaXplID0gMDsKLSAgQ3JlYXRlSW5pdFNlZ21lbnQodHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCAmaW5mb190cmFja3MsICZpbmZvX3RyYWNrc19zaXplKTsKLQotICBFWFBFQ1RfRkFMU0UoZGVtdXhlcl8tPkFwcGVuZERhdGEoa1NvdXJjZUlkLCBpbmZvX3RyYWNrcy5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fdHJhY2tzX3NpemUpKTsKLX0KLQotLy8gTWFrZSBzdXJlIFJlYWQoKSBjYWxsYmFja3MgYXJlIGRpc3BhdGNoZWQgd2l0aCB0aGUgcHJvcGVyIGRhdGEuCi1URVNUX0YoQ2h1bmtEZW11eGVyVGVzdCwgVGVzdFJlYWQpIHsKLSAgQVNTRVJUX1RSVUUoSW5pdERlbXV4ZXIodHJ1ZSwgdHJ1ZSkpOwotCi0gIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gY2x1c3RlcihrRGVmYXVsdEZpcnN0Q2x1c3RlcigpKTsKLSAgQVNTRVJUX1RSVUUoQXBwZW5kRGF0YShjbHVzdGVyLT5kYXRhKCksIGNsdXN0ZXItPnNpemUoKSkpOwotCi0gIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gYXVkaW8gPQotICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpBVURJTyk7Ci0gIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gdmlkZW8gPQotICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpWSURFTyk7Ci0KLSAgYm9vbCBhdWRpb19yZWFkX2RvbmUgPSBmYWxzZTsKLSAgYm9vbCB2aWRlb19yZWFkX2RvbmUgPSBmYWxzZTsKLSAgYXVkaW8tPlJlYWQoYmFzZTo6QmluZCgmT25SZWFkRG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgJmF1ZGlvX3JlYWRfZG9uZSkpOwotICB2aWRlby0+UmVhZChiYXNlOjpCaW5kKCZPblJlYWREb25lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmdmlkZW9fcmVhZF9kb25lKSk7Ci0KLSAgRVhQRUNUX1RSVUUoYXVkaW9fcmVhZF9kb25lKTsKLSAgRVhQRUNUX1RSVUUodmlkZW9fcmVhZF9kb25lKTsKLX0KLQotVEVTVF9GKENodW5rRGVtdXhlclRlc3QsIFRlc3RPdXRPZk9yZGVyQ2x1c3RlcnMpIHsKLSAgQVNTRVJUX1RSVUUoSW5pdERlbXV4ZXIodHJ1ZSwgdHJ1ZSkpOwotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXIoa0RlZmF1bHRGaXJzdENsdXN0ZXIoKSk7Ci0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEoY2x1c3Rlci0+ZGF0YSgpLCBjbHVzdGVyLT5zaXplKCkpKTsKLQotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXJfYShHZW5lcmF0ZUNsdXN0ZXIoMTAsIDQpKTsKLSAgQVNTRVJUX1RSVUUoQXBwZW5kRGF0YShjbHVzdGVyX2EtPmRhdGEoKSwgY2x1c3Rlcl9hLT5zaXplKCkpKTsKLQotICAvLyBDbHVzdGVyIEIgc3RhcnRzIGJlZm9yZSBjbHVzdGVyX2EgYW5kIGhhcyBkYXRhCi0gIC8vIHRoYXQgb3ZlcmxhcHMuCi0gIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gY2x1c3Rlcl9iKEdlbmVyYXRlQ2x1c3Rlcig1LCA0KSk7Ci0KLSAgLy8gTWFrZSBzdXJlIHRoYXQgQXBwZW5kRGF0YSgpIGRvZXMgbm90IGZhaWwuCi0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEoY2x1c3Rlcl9iLT5kYXRhKCksIGNsdXN0ZXJfYi0+c2l6ZSgpKSk7Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgQXBwZW5kRGF0YSgpIGNhbiBzdGlsbCBhY2NlcHQgbW9yZSBkYXRhLgotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXJfYyhHZW5lcmF0ZUNsdXN0ZXIoNDUsIDIpKTsKLSAgQVNTRVJUX1RSVUUoZGVtdXhlcl8tPkFwcGVuZERhdGEoa1NvdXJjZUlkLCBjbHVzdGVyX2MtPmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9jLT5zaXplKCkpKTsKLX0KLQotVEVTVF9GKENodW5rRGVtdXhlclRlc3QsIFRlc3ROb25Nb25vdG9uaWNCdXRBYm92ZUNsdXN0ZXJUaW1lY29kZSkgewotICBBU1NFUlRfVFJVRShJbml0RGVtdXhlcih0cnVlLCB0cnVlKSk7Ci0gIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gZmlyc3RfY2x1c3RlcihrRGVmYXVsdEZpcnN0Q2x1c3RlcigpKTsKLSAgQVNTRVJUX1RSVUUoQXBwZW5kRGF0YShmaXJzdF9jbHVzdGVyLT5kYXRhKCksIGZpcnN0X2NsdXN0ZXItPnNpemUoKSkpOwotCi0gIENsdXN0ZXJCdWlsZGVyIGNiOwotCi0gIC8vIFRlc3QgdGhlIGNhc2Ugd2hlcmUgYmxvY2sgdGltZWNvZGVzIGFyZSBub3QgbW9ub3RvbmljYWxseQotICAvLyBpbmNyZWFzaW5nIGJ1dCBzdGF5IGFib3ZlIHRoZSBjbHVzdGVyIHRpbWVjb2RlLgotICBjYi5TZXRDbHVzdGVyVGltZWNvZGUoNSk7Ci0gIEFkZFNpbXBsZUJsb2NrKCZjYiwga0F1ZGlvVHJhY2tOdW0sIDUpOwotICBBZGRTaW1wbGVCbG9jaygmY2IsIGtWaWRlb1RyYWNrTnVtLCAxMCk7Ci0gIEFkZFNpbXBsZUJsb2NrKCZjYiwga0F1ZGlvVHJhY2tOdW0sIDcpOwotICBBZGRTaW1wbGVCbG9jaygmY2IsIGtWaWRlb1RyYWNrTnVtLCAxNSk7Ci0gIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gY2x1c3Rlcl9hKGNiLkZpbmlzaCgpKTsKLQotICBFWFBFQ1RfQ0FMTChob3N0XywgT25EZW11eGVyRXJyb3IoUElQRUxJTkVfRVJST1JfREVDT0RFKSk7Ci0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEoY2x1c3Rlcl9hLT5kYXRhKCksIGNsdXN0ZXJfYS0+c2l6ZSgpKSk7Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgQXBwZW5kRGF0YSgpIGRvZXNuJ3QgYWNjZXB0IG1vcmUgZGF0YSBub3cuCi0gIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gY2x1c3Rlcl9iKEdlbmVyYXRlQ2x1c3RlcigyMCwgMikpOwotICBFWFBFQ1RfRkFMU0UoZGVtdXhlcl8tPkFwcGVuZERhdGEoa1NvdXJjZUlkLCBjbHVzdGVyX2ItPmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfYi0+c2l6ZSgpKSk7Ci19Ci0KLVRFU1RfRihDaHVua0RlbXV4ZXJUZXN0LCBUZXN0QmFja3dhcmRzQW5kQmVmb3JlQ2x1c3RlclRpbWVjb2RlKSB7Ci0gIEFTU0VSVF9UUlVFKEluaXREZW11eGVyKHRydWUsIHRydWUpKTsKLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBmaXJzdF9jbHVzdGVyKGtEZWZhdWx0Rmlyc3RDbHVzdGVyKCkpOwotICBBU1NFUlRfVFJVRShBcHBlbmREYXRhKGZpcnN0X2NsdXN0ZXItPmRhdGEoKSwgZmlyc3RfY2x1c3Rlci0+c2l6ZSgpKSk7Ci0KLSAgQ2x1c3RlckJ1aWxkZXIgY2I7Ci0KLSAgLy8gVGVzdCB0aW1lY29kZXMgZ29pbmcgYmFja3dhcmRzIGFuZCBpbmNsdWRpbmcgdmFsdWVzIGxlc3MgdGhhbiB0aGUgY2x1c3RlcgotICAvLyB0aW1lY29kZS4KLSAgY2IuU2V0Q2x1c3RlclRpbWVjb2RlKDUpOwotICBBZGRTaW1wbGVCbG9jaygmY2IsIGtBdWRpb1RyYWNrTnVtLCA1KTsKLSAgQWRkU2ltcGxlQmxvY2soJmNiLCBrVmlkZW9UcmFja051bSwgNSk7Ci0gIEFkZFNpbXBsZUJsb2NrKCZjYiwga0F1ZGlvVHJhY2tOdW0sIDMpOwotICBBZGRTaW1wbGVCbG9jaygmY2IsIGtWaWRlb1RyYWNrTnVtLCAzKTsKLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyX2EoY2IuRmluaXNoKCkpOwotCi0gIEVYUEVDVF9DQUxMKGhvc3RfLCBPbkRlbXV4ZXJFcnJvcihQSVBFTElORV9FUlJPUl9ERUNPREUpKTsKLSAgQVNTRVJUX1RSVUUoQXBwZW5kRGF0YShjbHVzdGVyX2EtPmRhdGEoKSwgY2x1c3Rlcl9hLT5zaXplKCkpKTsKLQotICAvLyBWZXJpZnkgdGhhdCBBcHBlbmREYXRhKCkgZG9lc24ndCBhY2NlcHQgbW9yZSBkYXRhIG5vdy4KLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyX2IoR2VuZXJhdGVDbHVzdGVyKDYsIDIpKTsKLSAgRVhQRUNUX0ZBTFNFKGRlbXV4ZXJfLT5BcHBlbmREYXRhKGtTb3VyY2VJZCwgY2x1c3Rlcl9iLT5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyX2ItPnNpemUoKSkpOwotfQotCi0KLVRFU1RfRihDaHVua0RlbXV4ZXJUZXN0LCBUZXN0UGVyU3RyZWFtTW9ub3RvbmljYWxseUluY3JlYXNpbmdUaW1lc3RhbXBzKSB7Ci0gIEFTU0VSVF9UUlVFKEluaXREZW11eGVyKHRydWUsIHRydWUpKTsKLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBmaXJzdF9jbHVzdGVyKGtEZWZhdWx0Rmlyc3RDbHVzdGVyKCkpOwotICBBU1NFUlRfVFJVRShBcHBlbmREYXRhKGZpcnN0X2NsdXN0ZXItPmRhdGEoKSwgZmlyc3RfY2x1c3Rlci0+c2l6ZSgpKSk7Ci0KLSAgQ2x1c3RlckJ1aWxkZXIgY2I7Ci0KLSAgLy8gVGVzdCBtb25vdG9uaWMgaW5jcmVhc2luZyB0aW1lc3RhbXBzIG9uIGEgcGVyIHN0cmVhbQotICAvLyBiYXNpcy4KLSAgY2IuU2V0Q2x1c3RlclRpbWVjb2RlKDUpOwotICBBZGRTaW1wbGVCbG9jaygmY2IsIGtBdWRpb1RyYWNrTnVtLCA1KTsKLSAgQWRkU2ltcGxlQmxvY2soJmNiLCBrVmlkZW9UcmFja051bSwgNSk7Ci0gIEFkZFNpbXBsZUJsb2NrKCZjYiwga0F1ZGlvVHJhY2tOdW0sIDQpOwotICBBZGRTaW1wbGVCbG9jaygmY2IsIGtWaWRlb1RyYWNrTnVtLCA3KTsKLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyKGNiLkZpbmlzaCgpKTsKLQotICBFWFBFQ1RfQ0FMTChob3N0XywgT25EZW11eGVyRXJyb3IoUElQRUxJTkVfRVJST1JfREVDT0RFKSk7Ci0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEoY2x1c3Rlci0+ZGF0YSgpLCBjbHVzdGVyLT5zaXplKCkpKTsKLX0KLQotLy8gVGVzdCB0aGUgY2FzZSB3aGVyZSBhIGNsdXN0ZXIgaXMgcGFzc2VkIHRvIEFwcGVuZERhdGEoKSBiZWZvcmUKLS8vIElORk8gJiBUUkFDS1MgZGF0YS4KLVRFU1RfRihDaHVua0RlbXV4ZXJUZXN0LCBUZXN0Q2x1c3RlckJlZm9yZUluaXRTZWdtZW50KSB7Ci0gIEVYUEVDVF9DQUxMKCp0aGlzLCBEZW11eGVyT3BlbmVkKCkpOwotICBkZW11eGVyXy0+SW5pdGlhbGl6ZSgKLSAgICAgICZob3N0XywgTmV3RXhwZWN0ZWRTdGF0dXNDQihERU1VWEVSX0VSUk9SX0NPVUxEX05PVF9PUEVOKSk7Ci0KLSAgQVNTRVJUX0VRKEFkZElkKCksIENodW5rRGVtdXhlcjo6a09rKTsKLQotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXIoR2VuZXJhdGVDbHVzdGVyKDAsIDEpKTsKLQotICBBU1NFUlRfVFJVRShBcHBlbmREYXRhKGNsdXN0ZXItPmRhdGEoKSwgY2x1c3Rlci0+c2l6ZSgpKSk7Ci19Ci0KLS8vIFRlc3QgY2FzZXMgd2hlcmUgd2UgZ2V0IGFuIEVuZE9mU3RyZWFtKCkgY2FsbCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCi1URVNUX0YoQ2h1bmtEZW11eGVyVGVzdCwgVGVzdEVPU0R1cmluZ0luaXQpIHsKLSAgRVhQRUNUX0NBTEwoKnRoaXMsIERlbXV4ZXJPcGVuZWQoKSk7Ci0gIGRlbXV4ZXJfLT5Jbml0aWFsaXplKAotICAgICAgJmhvc3RfLCBOZXdFeHBlY3RlZFN0YXR1c0NCKERFTVVYRVJfRVJST1JfQ09VTERfTk9UX09QRU4pKTsKLSAgZGVtdXhlcl8tPkVuZE9mU3RyZWFtKFBJUEVMSU5FX09LKTsKLX0KLQotVEVTVF9GKENodW5rRGVtdXhlclRlc3QsIFRlc3RFbmRPZlN0cmVhbVdpdGhOb0FwcGVuZCkgewotICBFWFBFQ1RfQ0FMTCgqdGhpcywgRGVtdXhlck9wZW5lZCgpKTsKLSAgZGVtdXhlcl8tPkluaXRpYWxpemUoCi0gICAgICAmaG9zdF8sIE5ld0V4cGVjdGVkU3RhdHVzQ0IoREVNVVhFUl9FUlJPUl9DT1VMRF9OT1RfT1BFTikpOwotCi0gIEFTU0VSVF9FUShBZGRJZCgpLCBDaHVua0RlbXV4ZXI6OmtPayk7Ci0KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyB9Iik7Ci0gIGRlbXV4ZXJfLT5FbmRPZlN0cmVhbShQSVBFTElORV9PSyk7Ci0gIFNodXRkb3duRGVtdXhlcigpOwotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IH0iKTsKLSAgZGVtdXhlcl8tPlJlbW92ZUlkKGtTb3VyY2VJZCk7Ci0gIGRlbXV4ZXJfID0gTlVMTDsKLX0KLQotVEVTVF9GKENodW5rRGVtdXhlclRlc3QsIFRlc3RFbmRPZlN0cmVhbVdpdGhOb01lZGlhQXBwZW5kKSB7Ci0gIEFTU0VSVF9UUlVFKEluaXREZW11eGVyKHRydWUsIHRydWUpKTsKLQotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IH0iKTsKLSAgZGVtdXhlcl8tPkVuZE9mU3RyZWFtKFBJUEVMSU5FX09LKTsKLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyB9Iik7Ci19Ci0KLVRFU1RfRihDaHVua0RlbXV4ZXJUZXN0LCBUZXN0RGVjb2RlRXJyb3JFbmRPZlN0cmVhbSkgewotICBBU1NFUlRfVFJVRShJbml0RGVtdXhlcih0cnVlLCB0cnVlKSk7Ci0KLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyKGtEZWZhdWx0Rmlyc3RDbHVzdGVyKCkpOwotICBBU1NFUlRfVFJVRShBcHBlbmREYXRhKGNsdXN0ZXItPmRhdGEoKSwgY2x1c3Rlci0+c2l6ZSgpKSk7Ci0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoa0RlZmF1bHRGaXJzdENsdXN0ZXJSYW5nZSk7Ci0KLSAgRVhQRUNUX0NBTEwoaG9zdF8sIE9uRGVtdXhlckVycm9yKFBJUEVMSU5FX0VSUk9SX0RFQ09ERSkpOwotICBkZW11eGVyXy0+RW5kT2ZTdHJlYW0oUElQRUxJTkVfRVJST1JfREVDT0RFKTsKLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcyhrRGVmYXVsdEZpcnN0Q2x1c3RlclJhbmdlKTsKLX0KLQotVEVTVF9GKENodW5rRGVtdXhlclRlc3QsIFRlc3ROZXR3b3JrRXJyb3JFbmRPZlN0cmVhbSkgewotICBBU1NFUlRfVFJVRShJbml0RGVtdXhlcih0cnVlLCB0cnVlKSk7Ci0KLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyKGtEZWZhdWx0Rmlyc3RDbHVzdGVyKCkpOwotICBBU1NFUlRfVFJVRShBcHBlbmREYXRhKGNsdXN0ZXItPmRhdGEoKSwgY2x1c3Rlci0+c2l6ZSgpKSk7Ci0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoa0RlZmF1bHRGaXJzdENsdXN0ZXJSYW5nZSk7Ci0KLSAgRVhQRUNUX0NBTEwoaG9zdF8sIE9uRGVtdXhlckVycm9yKFBJUEVMSU5FX0VSUk9SX05FVFdPUkspKTsKLSAgZGVtdXhlcl8tPkVuZE9mU3RyZWFtKFBJUEVMSU5FX0VSUk9SX05FVFdPUkspOwotfQotCi0vLyBIZWxwZXIgY2xhc3MgdG8gcmVkdWNlIGR1cGxpY2F0ZSBjb2RlIHdoZW4gdGVzdGluZyBlbmQgb2Ygc3RyZWFtCi0vLyBSZWFkKCkgYmVoYXZpb3IuCi1jbGFzcyBFbmRPZlN0cmVhbUhlbHBlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBFbmRPZlN0cmVhbUhlbHBlcihjb25zdCBzY29wZWRfcmVmcHRyPERlbXV4ZXI+IGRlbXV4ZXIpCi0gICAgICA6IGRlbXV4ZXJfKGRlbXV4ZXIpLAotICAgICAgICBhdWRpb19yZWFkX2RvbmVfKGZhbHNlKSwKLSAgICAgICAgdmlkZW9fcmVhZF9kb25lXyhmYWxzZSkgewotICB9Ci0KLSAgLy8gUmVxdWVzdCBhIHJlYWQgb24gdGhlIGF1ZGlvIGFuZCB2aWRlbyBzdHJlYW1zLgotICB2b2lkIFJlcXVlc3RSZWFkcygpIHsKLSAgICBFWFBFQ1RfRkFMU0UoYXVkaW9fcmVhZF9kb25lXyk7Ci0gICAgRVhQRUNUX0ZBTFNFKHZpZGVvX3JlYWRfZG9uZV8pOwotCi0gICAgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiBhdWRpbyA9Ci0gICAgICAgIGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6QVVESU8pOwotICAgIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gdmlkZW8gPQotICAgICAgICBkZW11eGVyXy0+R2V0U3RyZWFtKERlbXV4ZXJTdHJlYW06OlZJREVPKTsKLQotICAgIGF1ZGlvLT5SZWFkKGJhc2U6OkJpbmQoJk9uRW5kT2ZTdHJlYW1SZWFkRG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdWRpb19yZWFkX2RvbmVfKSk7Ci0KLSAgICB2aWRlby0+UmVhZChiYXNlOjpCaW5kKCZPbkVuZE9mU3RyZWFtUmVhZERvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmdmlkZW9fcmVhZF9kb25lXykpOwotICB9Ci0KLSAgLy8gQ2hlY2sgdG8gc2VlIGlmIHxhdWRpb19yZWFkX2RvbmVffCBhbmQgfHZpZGVvX3JlYWRfZG9uZV98IHZhcmlhYmxlcwotICAvLyBtYXRjaCB8ZXhwZWN0ZWR8LgotICB2b2lkIENoZWNrSWZSZWFkRG9uZXNXZXJlQ2FsbGVkKGJvb2wgZXhwZWN0ZWQpIHsKLSAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQsIGF1ZGlvX3JlYWRfZG9uZV8pOwotICAgIEVYUEVDVF9FUShleHBlY3RlZCwgdmlkZW9fcmVhZF9kb25lXyk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyB2b2lkIE9uRW5kT2ZTdHJlYW1SZWFkRG9uZSgKLSAgICAgIGJvb2wqIGNhbGxlZCwKLSAgICAgIERlbXV4ZXJTdHJlYW06OlN0YXR1cyBzdGF0dXMsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBidWZmZXIpIHsKLSAgICBFWFBFQ1RfRVEoc3RhdHVzLCBEZW11eGVyU3RyZWFtOjprT2spOwotICAgIEVYUEVDVF9UUlVFKGJ1ZmZlci0+SXNFbmRPZlN0cmVhbSgpKTsKLSAgICAqY2FsbGVkID0gdHJ1ZTsKLSAgfQotCi0gIHNjb3BlZF9yZWZwdHI8RGVtdXhlcj4gZGVtdXhlcl87Ci0gIGJvb2wgYXVkaW9fcmVhZF9kb25lXzsKLSAgYm9vbCB2aWRlb19yZWFkX2RvbmVfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihFbmRPZlN0cmVhbUhlbHBlcik7Ci19OwotCi0vLyBNYWtlIHN1cmUgdGhhdCBhbGwgcGVuZGluZyByZWFkcyB0aGF0IHdlIGRvbid0IGhhdmUgbWVkaWEgZGF0YSBmb3IgZ2V0IGFuCi0vLyAiZW5kIG9mIHN0cmVhbSIgYnVmZmVyIHdoZW4gRW5kT2ZTdHJlYW0oKSBpcyBjYWxsZWQuCi1URVNUX0YoQ2h1bmtEZW11eGVyVGVzdCwgVGVzdEVuZE9mU3RyZWFtV2l0aFBlbmRpbmdSZWFkcykgewotICBBU1NFUlRfVFJVRShJbml0RGVtdXhlcih0cnVlLCB0cnVlKSk7Ci0KLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyKEdlbmVyYXRlQ2x1c3RlcigwLCAyKSk7Ci0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEoY2x1c3Rlci0+ZGF0YSgpLCBjbHVzdGVyLT5zaXplKCkpKTsKLQotICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IGF1ZGlvID0KLSAgICAgIGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6QVVESU8pOwotICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IHZpZGVvID0KLSAgICAgIGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6VklERU8pOwotCi0gIGJvb2wgYXVkaW9fcmVhZF9kb25lXzEgPSBmYWxzZTsKLSAgYm9vbCB2aWRlb19yZWFkX2RvbmVfMSA9IGZhbHNlOwotICBFbmRPZlN0cmVhbUhlbHBlciBlbmRfb2Zfc3RyZWFtX2hlbHBlcl8xKGRlbXV4ZXJfKTsKLSAgRW5kT2ZTdHJlYW1IZWxwZXIgZW5kX29mX3N0cmVhbV9oZWxwZXJfMihkZW11eGVyXyk7Ci0KLSAgYXVkaW8tPlJlYWQoYmFzZTo6QmluZCgmT25SZWFkRG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgJmF1ZGlvX3JlYWRfZG9uZV8xKSk7Ci0KLSAgdmlkZW8tPlJlYWQoYmFzZTo6QmluZCgmT25SZWFkRG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgJnZpZGVvX3JlYWRfZG9uZV8xKSk7Ci0KLSAgZW5kX29mX3N0cmVhbV9oZWxwZXJfMS5SZXF1ZXN0UmVhZHMoKTsKLSAgZW5kX29mX3N0cmVhbV9oZWxwZXJfMi5SZXF1ZXN0UmVhZHMoKTsKLQotICBFWFBFQ1RfVFJVRShhdWRpb19yZWFkX2RvbmVfMSk7Ci0gIEVYUEVDVF9UUlVFKHZpZGVvX3JlYWRfZG9uZV8xKTsKLSAgZW5kX29mX3N0cmVhbV9oZWxwZXJfMS5DaGVja0lmUmVhZERvbmVzV2VyZUNhbGxlZChmYWxzZSk7Ci0gIGVuZF9vZl9zdHJlYW1faGVscGVyXzIuQ2hlY2tJZlJlYWREb25lc1dlcmVDYWxsZWQoZmFsc2UpOwotCi0gIEVYUEVDVF9DQUxMKGhvc3RfLCBTZXREdXJhdGlvbigKLSAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyhrVmlkZW9CbG9ja0R1cmF0aW9uKSkpOwotICBkZW11eGVyXy0+RW5kT2ZTdHJlYW0oUElQRUxJTkVfT0spOwotCi0gIGVuZF9vZl9zdHJlYW1faGVscGVyXzEuQ2hlY2tJZlJlYWREb25lc1dlcmVDYWxsZWQodHJ1ZSk7Ci0gIGVuZF9vZl9zdHJlYW1faGVscGVyXzIuQ2hlY2tJZlJlYWREb25lc1dlcmVDYWxsZWQodHJ1ZSk7Ci19Ci0KLS8vIE1ha2Ugc3VyZSB0aGF0IGFsbCBSZWFkKCkgY2FsbHMgYWZ0ZXIgd2UgZ2V0IGFuIEVuZE9mU3RyZWFtKCkKLS8vIGNhbGwgcmV0dXJuIGFuICJlbmQgb2Ygc3RyZWFtIiBidWZmZXIuCi1URVNUX0YoQ2h1bmtEZW11eGVyVGVzdCwgVGVzdFJlYWRzQWZ0ZXJFbmRPZlN0cmVhbSkgewotICBBU1NFUlRfVFJVRShJbml0RGVtdXhlcih0cnVlLCB0cnVlKSk7Ci0KLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyKEdlbmVyYXRlQ2x1c3RlcigwLCAyKSk7Ci0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEoY2x1c3Rlci0+ZGF0YSgpLCBjbHVzdGVyLT5zaXplKCkpKTsKLQotICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IGF1ZGlvID0KLSAgICAgIGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6QVVESU8pOwotICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IHZpZGVvID0KLSAgICAgIGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6VklERU8pOwotCi0gIGJvb2wgYXVkaW9fcmVhZF9kb25lXzEgPSBmYWxzZTsKLSAgYm9vbCB2aWRlb19yZWFkX2RvbmVfMSA9IGZhbHNlOwotICBFbmRPZlN0cmVhbUhlbHBlciBlbmRfb2Zfc3RyZWFtX2hlbHBlcl8xKGRlbXV4ZXJfKTsKLSAgRW5kT2ZTdHJlYW1IZWxwZXIgZW5kX29mX3N0cmVhbV9oZWxwZXJfMihkZW11eGVyXyk7Ci0gIEVuZE9mU3RyZWFtSGVscGVyIGVuZF9vZl9zdHJlYW1faGVscGVyXzMoZGVtdXhlcl8pOwotCi0gIGF1ZGlvLT5SZWFkKGJhc2U6OkJpbmQoJk9uUmVhZERvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICZhdWRpb19yZWFkX2RvbmVfMSkpOwotCi0gIHZpZGVvLT5SZWFkKGJhc2U6OkJpbmQoJk9uUmVhZERvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICZ2aWRlb19yZWFkX2RvbmVfMSkpOwotCi0gIGVuZF9vZl9zdHJlYW1faGVscGVyXzEuUmVxdWVzdFJlYWRzKCk7Ci0KLSAgRVhQRUNUX1RSVUUoYXVkaW9fcmVhZF9kb25lXzEpOwotICBFWFBFQ1RfVFJVRSh2aWRlb19yZWFkX2RvbmVfMSk7Ci0gIGVuZF9vZl9zdHJlYW1faGVscGVyXzEuQ2hlY2tJZlJlYWREb25lc1dlcmVDYWxsZWQoZmFsc2UpOwotCi0gIEVYUEVDVF9DQUxMKGhvc3RfLCBTZXREdXJhdGlvbigKLSAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyhrVmlkZW9CbG9ja0R1cmF0aW9uKSkpOwotICBFWFBFQ1RfVFJVRShkZW11eGVyXy0+RW5kT2ZTdHJlYW0oUElQRUxJTkVfT0spKTsKLQotICBlbmRfb2Zfc3RyZWFtX2hlbHBlcl8xLkNoZWNrSWZSZWFkRG9uZXNXZXJlQ2FsbGVkKHRydWUpOwotCi0gIC8vIFJlcXVlc3QgYSBmZXcgbW9yZSByZWFkcyBhbmQgbWFrZSBzdXJlIHdlIGltbWVkaWF0ZWx5IGdldAotICAvLyBlbmQgb2Ygc3RyZWFtIGJ1ZmZlcnMuCi0gIGVuZF9vZl9zdHJlYW1faGVscGVyXzIuUmVxdWVzdFJlYWRzKCk7Ci0gIGVuZF9vZl9zdHJlYW1faGVscGVyXzIuQ2hlY2tJZlJlYWREb25lc1dlcmVDYWxsZWQodHJ1ZSk7Ci0KLSAgZW5kX29mX3N0cmVhbV9oZWxwZXJfMy5SZXF1ZXN0UmVhZHMoKTsKLSAgZW5kX29mX3N0cmVhbV9oZWxwZXJfMy5DaGVja0lmUmVhZERvbmVzV2VyZUNhbGxlZCh0cnVlKTsKLX0KLQotVEVTVF9GKENodW5rRGVtdXhlclRlc3QsIFRlc3RFbmRPZlN0cmVhbUR1cmluZ0NhbmNlbGVkU2VlaykgewotICBBU1NFUlRfVFJVRShJbml0RGVtdXhlcih0cnVlLCB0cnVlKSk7Ci0gIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gYXVkaW8gPQotICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpBVURJTyk7Ci0gIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gdmlkZW8gPQotICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpWSURFTyk7Ci0KLSAgQVNTRVJUX1RSVUUoQXBwZW5kQ2x1c3RlcigwLCAxMCkpOwotICBFWFBFQ1RfQ0FMTChob3N0XywgU2V0RHVyYXRpb24oYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDEzOCkpKTsKLSAgRVhQRUNUX1RSVUUoZGVtdXhlcl8tPkVuZE9mU3RyZWFtKFBJUEVMSU5FX09LKSk7Ci0KLSAgLy8gU3RhcnQgdGhlIGZpcnN0IHNlZWsuCi0gIGRlbXV4ZXJfLT5TdGFydFdhaXRpbmdGb3JTZWVrKCk7Ci0KLSAgLy8gU2ltdWxhdGUgdGhlIHBpcGVsaW5lIGZpbmFsbHkgY2FsbGluZyBTZWVrKCkuCi0gIGRlbXV4ZXJfLT5TZWVrKGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygyMCksCi0gICAgICAgICAgICAgICAgIE5ld0V4cGVjdGVkU3RhdHVzQ0IoUElQRUxJTkVfT0spKTsKLQotICAvLyBTaW11bGF0ZSBhbm90aGVyIHNlZWsgYmVpbmcgcmVxdWVzdGVkIGJlZm9yZSB0aGUgZmlyc3QKLSAgLy8gc2VlayBoYXMgZmluaXNoZWQgcHJlcm9sbGluZy4KLSAgZGVtdXhlcl8tPkNhbmNlbFBlbmRpbmdTZWVrKCk7Ci0KLSAgLy8gRmluaXNoIHNlY29uZCBzZWVrLgotICBkZW11eGVyXy0+U3RhcnRXYWl0aW5nRm9yU2VlaygpOwotICBkZW11eGVyXy0+U2VlayhiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMzApLAotICAgICAgICAgICAgICAgICBOZXdFeHBlY3RlZFN0YXR1c0NCKFBJUEVMSU5FX09LKSk7Ci0KLSAgRGVtdXhlclN0cmVhbTo6U3RhdHVzIHN0YXR1czsKLSAgYmFzZTo6VGltZURlbHRhIGxhc3RfdGltZXN0YW1wOwotCi0gIC8vIE1ha2Ugc3VyZSBhdWRpbyBjYW4gcmVhY2ggZW5kIG9mIHN0cmVhbS4KLSAgUmVhZFVudGlsTm90T2tPckVuZE9mU3RyZWFtKGF1ZGlvLCAmc3RhdHVzLCAmbGFzdF90aW1lc3RhbXApOwotICBBU1NFUlRfRVEoc3RhdHVzLCBEZW11eGVyU3RyZWFtOjprT2spOwotCi0gIC8vIE1ha2Ugc3VyZSB2aWRlbyBjYW4gcmVhY2ggZW5kIG9mIHN0cmVhbS4KLSAgUmVhZFVudGlsTm90T2tPckVuZE9mU3RyZWFtKHZpZGVvLCAmc3RhdHVzLCAmbGFzdF90aW1lc3RhbXApOwotICBBU1NFUlRfRVEoc3RhdHVzLCBEZW11eGVyU3RyZWFtOjprT2spOwotfQotCi0vLyBNYWtlIHN1cmUgQXBwZW5kRGF0YSgpIHdpbGwgYWNjZXB0IGVsZW1lbnRzIHRoYXQgc3BhbiBtdWx0aXBsZSBjYWxscy4KLVRFU1RfRihDaHVua0RlbXV4ZXJUZXN0LCBUZXN0QXBwZW5kaW5nSW5QaWVjZXMpIHsKLSAgRVhQRUNUX0NBTEwoKnRoaXMsIERlbXV4ZXJPcGVuZWQoKSk7Ci0gIGRlbXV4ZXJfLT5Jbml0aWFsaXplKAotICAgICAgJmhvc3RfLCBDcmVhdGVJbml0RG9uZUNCKGtEZWZhdWx0RHVyYXRpb24oKSwgUElQRUxJTkVfT0spKTsKLQotICBBU1NFUlRfRVEoQWRkSWQoKSwgQ2h1bmtEZW11eGVyOjprT2spOwotCi0gIHNjb3BlZF9hcnJheTx1aW50OD4gaW5mb190cmFja3M7Ci0gIGludCBpbmZvX3RyYWNrc19zaXplID0gMDsKLSAgQ3JlYXRlSW5pdFNlZ21lbnQodHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCAmaW5mb190cmFja3MsICZpbmZvX3RyYWNrc19zaXplKTsKLQotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXJfYShrRGVmYXVsdEZpcnN0Q2x1c3RlcigpKTsKLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyX2Ioa0RlZmF1bHRTZWNvbmRDbHVzdGVyKCkpOwotCi0gIHNpemVfdCBidWZmZXJfc2l6ZSA9IGluZm9fdHJhY2tzX3NpemUgKyBjbHVzdGVyX2EtPnNpemUoKSArIGNsdXN0ZXJfYi0+c2l6ZSgpOwotICBzY29wZWRfYXJyYXk8dWludDg+IGJ1ZmZlcihuZXcgdWludDhbYnVmZmVyX3NpemVdKTsKLSAgdWludDgqIGRzdCA9IGJ1ZmZlci5nZXQoKTsKLSAgbWVtY3B5KGRzdCwgaW5mb190cmFja3MuZ2V0KCksIGluZm9fdHJhY2tzX3NpemUpOwotICBkc3QgKz0gaW5mb190cmFja3Nfc2l6ZTsKLQotICBtZW1jcHkoZHN0LCBjbHVzdGVyX2EtPmRhdGEoKSwgY2x1c3Rlcl9hLT5zaXplKCkpOwotICBkc3QgKz0gY2x1c3Rlcl9hLT5zaXplKCk7Ci0KLSAgbWVtY3B5KGRzdCwgY2x1c3Rlcl9iLT5kYXRhKCksIGNsdXN0ZXJfYi0+c2l6ZSgpKTsKLSAgZHN0ICs9IGNsdXN0ZXJfYi0+c2l6ZSgpOwotCi0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGFJblBpZWNlcyhidWZmZXIuZ2V0KCksIGJ1ZmZlcl9zaXplKSk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiBhdWRpbyA9Ci0gICAgICBkZW11eGVyXy0+R2V0U3RyZWFtKERlbXV4ZXJTdHJlYW06OkFVRElPKTsKLSAgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiB2aWRlbyA9Ci0gICAgICBkZW11eGVyXy0+R2V0U3RyZWFtKERlbXV4ZXJTdHJlYW06OlZJREVPKTsKLQotICBBU1NFUlRfVFJVRShhdWRpbyk7Ci0gIEFTU0VSVF9UUlVFKHZpZGVvKTsKLQotICBHZW5lcmF0ZUV4cGVjdGVkUmVhZHMoMCwgOSwgYXVkaW8sIHZpZGVvKTsKLX0KLQotVEVTVF9GKENodW5rRGVtdXhlclRlc3QsIFRlc3RXZWJNRmlsZV9BdWRpb0FuZFZpZGVvKSB7Ci0gIHN0cnVjdCBCdWZmZXJUaW1lc3RhbXBzIGJ1ZmZlcl90aW1lc3RhbXBzW10gPSB7Ci0gICAgezAsIDB9LAotICAgIHszMywgM30sCi0gICAgezY3LCA2fSwKLSAgICB7MTAwLCA5fSwKLSAgICB7MTMzLCAxMn0sCi0gICAge2tTa2lwLCBrU2tpcH0sCi0gIH07Ci0KLSAgQVNTRVJUX1RSVUUoUGFyc2VXZWJNRmlsZSgiYmVhci0zMjB4MjQwLndlYm0iLCBidWZmZXJfdGltZXN0YW1wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMjc0NCkpKTsKLX0KLQotVEVTVF9GKENodW5rRGVtdXhlclRlc3QsIFRlc3RXZWJNRmlsZV9MaXZlQXVkaW9BbmRWaWRlbykgewotICBzdHJ1Y3QgQnVmZmVyVGltZXN0YW1wcyBidWZmZXJfdGltZXN0YW1wc1tdID0gewotICAgIHswLCAwfSwKLSAgICB7MzMsIDN9LAotICAgIHs2NywgNn0sCi0gICAgezEwMCwgOX0sCi0gICAgezEzMywgMTJ9LAotICAgIHtrU2tpcCwga1NraXB9LAotICB9OwotCi0gIEFTU0VSVF9UUlVFKFBhcnNlV2ViTUZpbGUoImJlYXItMzIweDI0MC1saXZlLndlYm0iLCBidWZmZXJfdGltZXN0YW1wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSW5maW5pdGVEdXJhdGlvbigpKSk7Ci19Ci0KLVRFU1RfRihDaHVua0RlbXV4ZXJUZXN0LCBUZXN0V2ViTUZpbGVfQXVkaW9Pbmx5KSB7Ci0gIHN0cnVjdCBCdWZmZXJUaW1lc3RhbXBzIGJ1ZmZlcl90aW1lc3RhbXBzW10gPSB7Ci0gICAge2tTa2lwLCAwfSwKLSAgICB7a1NraXAsIDN9LAotICAgIHtrU2tpcCwgNn0sCi0gICAge2tTa2lwLCA5fSwKLSAgICB7a1NraXAsIDEyfSwKLSAgICB7a1NraXAsIGtTa2lwfSwKLSAgfTsKLQotICBBU1NFUlRfVFJVRShQYXJzZVdlYk1GaWxlKCJiZWFyLTMyMHgyNDAtYXVkaW8tb25seS53ZWJtIiwgYnVmZmVyX3RpbWVzdGFtcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDI3NDQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGZhbHNlKSk7Ci19Ci0KLVRFU1RfRihDaHVua0RlbXV4ZXJUZXN0LCBUZXN0V2ViTUZpbGVfVmlkZW9Pbmx5KSB7Ci0gIHN0cnVjdCBCdWZmZXJUaW1lc3RhbXBzIGJ1ZmZlcl90aW1lc3RhbXBzW10gPSB7Ci0gICAgezAsIGtTa2lwfSwKLSAgICB7MzMsIGtTa2lwfSwKLSAgICB7NjcsIGtTa2lwfSwKLSAgICB7MTAwLCBrU2tpcH0sCi0gICAgezEzMywga1NraXB9LAotICAgIHtrU2tpcCwga1NraXB9LAotICB9OwotCi0gIEFTU0VSVF9UUlVFKFBhcnNlV2ViTUZpbGUoImJlYXItMzIweDI0MC12aWRlby1vbmx5LndlYm0iLCBidWZmZXJfdGltZXN0YW1wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMjcwMyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHRydWUpKTsKLX0KLQotVEVTVF9GKENodW5rRGVtdXhlclRlc3QsIFRlc3RXZWJNRmlsZV9BbHRSZWZGcmFtZXMpIHsKLSAgc3RydWN0IEJ1ZmZlclRpbWVzdGFtcHMgYnVmZmVyX3RpbWVzdGFtcHNbXSA9IHsKLSAgICB7MCwgMH0sCi0gICAgezMzLCAzfSwKLSAgICB7MzMsIDZ9LAotICAgIHs2NywgOX0sCi0gICAgezEwMCwgMTJ9LAotICAgIHtrU2tpcCwga1NraXB9LAotICB9OwotCi0gIEFTU0VSVF9UUlVFKFBhcnNlV2ViTUZpbGUoImJlYXItMzIweDI0MC1hbHRyZWYud2VibSIsIGJ1ZmZlcl90aW1lc3RhbXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygyNzY3KSkpOwotfQotCi0vLyBWZXJpZnkgdGhhdCB3ZSBvdXRwdXQgYnVmZmVycyBiZWZvcmUgdGhlIGVudGlyZSBjbHVzdGVyIGhhcyBiZWVuIHBhcnNlZC4KLVRFU1RfRihDaHVua0RlbXV4ZXJUZXN0LCBUZXN0SW5jcmVtZW50YWxDbHVzdGVyUGFyc2luZykgewotICBBU1NFUlRfVFJVRShJbml0RGVtdXhlcih0cnVlLCB0cnVlKSk7Ci0gIEFTU0VSVF9UUlVFKEFwcGVuZEVtcHR5Q2x1c3RlcigwKSk7Ci0KLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyKEdlbmVyYXRlQ2x1c3RlcigwLCA2KSk7Ci0gIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gYXVkaW8gPQotICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpBVURJTyk7Ci0gIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gdmlkZW8gPQotICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpWSURFTyk7Ci0KLSAgYm9vbCBhdWRpb19yZWFkX2RvbmUgPSBmYWxzZTsKLSAgYm9vbCB2aWRlb19yZWFkX2RvbmUgPSBmYWxzZTsKLSAgYXVkaW8tPlJlYWQoYmFzZTo6QmluZCgmT25SZWFkRG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgJmF1ZGlvX3JlYWRfZG9uZSkpOwotCi0gIHZpZGVvLT5SZWFkKGJhc2U6OkJpbmQoJk9uUmVhZERvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICZ2aWRlb19yZWFkX2RvbmUpKTsKLQotICAvLyBNYWtlIHN1cmUgdGhlIHJlYWRzIGhhdmVuJ3QgY29tcGxldGVkIHlldC4KLSAgRVhQRUNUX0ZBTFNFKGF1ZGlvX3JlYWRfZG9uZSk7Ci0gIEVYUEVDVF9GQUxTRSh2aWRlb19yZWFkX2RvbmUpOwotCi0gIC8vIEFwcGVuZCBkYXRhIG9uZSBieXRlIGF0IGEgdGltZSB1bnRpbCB0aGUgYXVkaW8gcmVhZCBjb21wbGV0ZXMuCi0gIGludCBpID0gMDsKLSAgZm9yICg7IGkgPCBjbHVzdGVyLT5zaXplKCkgJiYgIWF1ZGlvX3JlYWRfZG9uZTsgKytpKSB7Ci0gICAgQVNTRVJUX1RSVUUoQXBwZW5kRGF0YShjbHVzdGVyLT5kYXRhKCkgKyBpLCAxKSk7Ci0gIH0KLQotICBFWFBFQ1RfVFJVRShhdWRpb19yZWFkX2RvbmUpOwotICBFWFBFQ1RfRkFMU0UodmlkZW9fcmVhZF9kb25lKTsKLSAgRVhQRUNUX0dUKGksIDApOwotICBFWFBFQ1RfTFQoaSwgY2x1c3Rlci0+c2l6ZSgpKTsKLQotICAvLyBBcHBlbmQgZGF0YSBvbmUgYnl0ZSBhdCBhIHRpbWUgdW50aWwgdGhlIHZpZGVvIHJlYWQgY29tcGxldGVzLgotICBmb3IgKDsgaSA8IGNsdXN0ZXItPnNpemUoKSAmJiAhdmlkZW9fcmVhZF9kb25lOyArK2kpIHsKLSAgICBBU1NFUlRfVFJVRShBcHBlbmREYXRhKGNsdXN0ZXItPmRhdGEoKSArIGksIDEpKTsKLSAgfQotCi0gIEVYUEVDVF9UUlVFKHZpZGVvX3JlYWRfZG9uZSk7Ci0gIEVYUEVDVF9MVChpLCBjbHVzdGVyLT5zaXplKCkpOwotCi0gIGF1ZGlvX3JlYWRfZG9uZSA9IGZhbHNlOwotICB2aWRlb19yZWFkX2RvbmUgPSBmYWxzZTsKLSAgYXVkaW8tPlJlYWQoYmFzZTo6QmluZCgmT25SZWFkRG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMjMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICZhdWRpb19yZWFkX2RvbmUpKTsKLQotICB2aWRlby0+UmVhZChiYXNlOjpCaW5kKCZPblJlYWREb25lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygzMyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgJnZpZGVvX3JlYWRfZG9uZSkpOwotCi0gIC8vIE1ha2Ugc3VyZSB0aGUgcmVhZHMgaGF2ZW4ndCBjb21wbGV0ZWQgeWV0LgotICBFWFBFQ1RfRkFMU0UoYXVkaW9fcmVhZF9kb25lKTsKLSAgRVhQRUNUX0ZBTFNFKHZpZGVvX3JlYWRfZG9uZSk7Ci0KLSAgLy8gQXBwZW5kIHRoZSByZW1haW5pbmcgZGF0YS4KLSAgQVNTRVJUX0xUKGksIGNsdXN0ZXItPnNpemUoKSk7Ci0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEoY2x1c3Rlci0+ZGF0YSgpICsgaSwgY2x1c3Rlci0+c2l6ZSgpIC0gaSkpOwotCi0gIEVYUEVDVF9UUlVFKGF1ZGlvX3JlYWRfZG9uZSk7Ci0gIEVYUEVDVF9UUlVFKHZpZGVvX3JlYWRfZG9uZSk7Ci19Ci0KLVRFU1RfRihDaHVua0RlbXV4ZXJUZXN0LCBUZXN0UGFyc2VFcnJvckR1cmluZ0luaXQpIHsKLSAgRVhQRUNUX0NBTEwoKnRoaXMsIERlbXV4ZXJPcGVuZWQoKSk7Ci0gIGRlbXV4ZXJfLT5Jbml0aWFsaXplKAotICAgICAgJmhvc3RfLCBDcmVhdGVJbml0RG9uZUNCKAotICAgICAgICAgIGtOb1RpbWVzdGFtcCgpLCBERU1VWEVSX0VSUk9SX0NPVUxEX05PVF9PUEVOKSk7Ci0KLSAgQVNTRVJUX0VRKEFkZElkKCksIENodW5rRGVtdXhlcjo6a09rKTsKLQotICB1aW50OCB0bXAgPSAwOwotICBBU1NFUlRfVFJVRShkZW11eGVyXy0+QXBwZW5kRGF0YShrU291cmNlSWQsICZ0bXAsIDEpKTsKLX0KLQotVEVTVF9GKENodW5rRGVtdXhlclRlc3QsIFRlc3RBVkhlYWRlcnNXaXRoQXVkaW9Pbmx5VHlwZSkgewotICBFWFBFQ1RfQ0FMTCgqdGhpcywgRGVtdXhlck9wZW5lZCgpKTsKLSAgZGVtdXhlcl8tPkluaXRpYWxpemUoCi0gICAgICAmaG9zdF8sIENyZWF0ZUluaXREb25lQ0Ioa05vVGltZXN0YW1wKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVNVVhFUl9FUlJPUl9DT1VMRF9OT1RfT1BFTikpOwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb2RlY3MoMSk7Ci0gIGNvZGVjc1swXSA9ICJ2b3JiaXMiOwotICBBU1NFUlRfRVEoZGVtdXhlcl8tPkFkZElkKGtTb3VyY2VJZCwgImF1ZGlvL3dlYm0iLCBjb2RlY3MpLAotICAgICAgICAgICAgQ2h1bmtEZW11eGVyOjprT2spOwotCi0gIEFTU0VSVF9UUlVFKEFwcGVuZEluaXRTZWdtZW50KHRydWUsIHRydWUpKTsKLX0KLQotVEVTVF9GKENodW5rRGVtdXhlclRlc3QsIFRlc3RBVkhlYWRlcnNXaXRoVmlkZW9Pbmx5VHlwZSkgewotICBFWFBFQ1RfQ0FMTCgqdGhpcywgRGVtdXhlck9wZW5lZCgpKTsKLSAgZGVtdXhlcl8tPkluaXRpYWxpemUoCi0gICAgICAmaG9zdF8sIENyZWF0ZUluaXREb25lQ0Ioa05vVGltZXN0YW1wKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVNVVhFUl9FUlJPUl9DT1VMRF9OT1RfT1BFTikpOwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb2RlY3MoMSk7Ci0gIGNvZGVjc1swXSA9ICJ2cDgiOwotICBBU1NFUlRfRVEoZGVtdXhlcl8tPkFkZElkKGtTb3VyY2VJZCwgInZpZGVvL3dlYm0iLCBjb2RlY3MpLAotICAgICAgICAgICAgQ2h1bmtEZW11eGVyOjprT2spOwotCi0gIEFTU0VSVF9UUlVFKEFwcGVuZEluaXRTZWdtZW50KHRydWUsIHRydWUpKTsKLX0KLQotVEVTVF9GKENodW5rRGVtdXhlclRlc3QsIFRlc3RNdWx0aXBsZUhlYWRlcnMpIHsKLSAgQVNTRVJUX1RSVUUoSW5pdERlbXV4ZXIodHJ1ZSwgdHJ1ZSkpOwotCi0gIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gYXVkaW8gPQotICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpBVURJTyk7Ci0gIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gdmlkZW8gPQotICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpWSURFTyk7Ci0KLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyX2Eoa0RlZmF1bHRGaXJzdENsdXN0ZXIoKSk7Ci0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEoY2x1c3Rlcl9hLT5kYXRhKCksIGNsdXN0ZXJfYS0+c2l6ZSgpKSk7Ci0KLSAgLy8gQXBwZW5kIGFub3RoZXIgaWRlbnRpY2FsIGluaXRpYWxpemF0aW9uIHNlZ21lbnQuCi0gIEFTU0VSVF9UUlVFKEFwcGVuZEluaXRTZWdtZW50KHRydWUsIHRydWUpKTsKLQotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXJfYihrRGVmYXVsdFNlY29uZENsdXN0ZXIoKSk7Ci0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEoY2x1c3Rlcl9iLT5kYXRhKCksIGNsdXN0ZXJfYi0+c2l6ZSgpKSk7Ci0KLSAgR2VuZXJhdGVFeHBlY3RlZFJlYWRzKDAsIDksIGF1ZGlvLCB2aWRlbyk7Ci19Ci0KLVRFU1RfRihDaHVua0RlbXV4ZXJUZXN0LCBUZXN0QWRkU2VwYXJhdGVTb3VyY2VzRm9yQXVkaW9BbmRWaWRlbykgewotICBzdGQ6OnN0cmluZyBhdWRpb19pZCA9ICJhdWRpbzEiOwotICBzdGQ6OnN0cmluZyB2aWRlb19pZCA9ICJ2aWRlbzEiOwotICBBU1NFUlRfVFJVRShJbml0RGVtdXhlckF1ZGlvQW5kVmlkZW9Tb3VyY2VzKGF1ZGlvX2lkLCB2aWRlb19pZCkpOwotCi0gIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gYXVkaW8gPQotICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpBVURJTyk7Ci0gIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gdmlkZW8gPQotICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpWSURFTyk7Ci0KLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyX2EoCi0gICAgICBHZW5lcmF0ZVNpbmdsZVN0cmVhbUNsdXN0ZXIoMCwgOTIsIGtBdWRpb1RyYWNrTnVtLCBrQXVkaW9CbG9ja0R1cmF0aW9uKSk7Ci0KLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyX3YoCi0gICAgICBHZW5lcmF0ZVNpbmdsZVN0cmVhbUNsdXN0ZXIoMCwgMTMyLCBrVmlkZW9UcmFja051bSwga1ZpZGVvQmxvY2tEdXJhdGlvbikpOwotCi0gIC8vIEFwcGVuZCBhdWRpbyBhbmQgdmlkZW8gZGF0YSBpbnRvIHNlcGFyYXRlIHNvdXJjZSBpZHMuCi0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEoYXVkaW9faWQsIGNsdXN0ZXJfYS0+ZGF0YSgpLCBjbHVzdGVyX2EtPnNpemUoKSkpOwotICBHZW5lcmF0ZVNpbmdsZVN0cmVhbUV4cGVjdGVkUmVhZHMoMCwgNCwgYXVkaW8sIGtBdWRpb0Jsb2NrRHVyYXRpb24pOwotICBBU1NFUlRfVFJVRShBcHBlbmREYXRhKHZpZGVvX2lkLCBjbHVzdGVyX3YtPmRhdGEoKSwgY2x1c3Rlcl92LT5zaXplKCkpKTsKLSAgR2VuZXJhdGVTaW5nbGVTdHJlYW1FeHBlY3RlZFJlYWRzKDAsIDQsIHZpZGVvLCBrVmlkZW9CbG9ja0R1cmF0aW9uKTsKLX0KLQotVEVTVF9GKENodW5rRGVtdXhlclRlc3QsIFRlc3RBZGRJZEZhaWx1cmVzKSB7Ci0gIEVYUEVDVF9DQUxMKCp0aGlzLCBEZW11eGVyT3BlbmVkKCkpOwotICBkZW11eGVyXy0+SW5pdGlhbGl6ZSgKLSAgICAgICZob3N0XywgQ3JlYXRlSW5pdERvbmVDQihrRGVmYXVsdER1cmF0aW9uKCksIFBJUEVMSU5FX09LKSk7Ci0KLSAgc3RkOjpzdHJpbmcgYXVkaW9faWQgPSAiYXVkaW8xIjsKLSAgc3RkOjpzdHJpbmcgdmlkZW9faWQgPSAidmlkZW8xIjsKLQotICBBU1NFUlRfRVEoQWRkSWQoYXVkaW9faWQsIHRydWUsIGZhbHNlKSwgQ2h1bmtEZW11eGVyOjprT2spOwotCi0gIC8vIEFkZGluZyBhbiBpZCB3aXRoIGF1ZGlvL3ZpZGVvIHNob3VsZCBmYWlsIGJlY2F1c2Ugd2UgYWxyZWFkeSBhZGRlZCBhdWRpby4KLSAgQVNTRVJUX0VRKEFkZElkKCksIENodW5rRGVtdXhlcjo6a1JlYWNoZWRJZExpbWl0KTsKLQotICBBU1NFUlRfVFJVRShBcHBlbmRJbml0U2VnbWVudFdpdGhTb3VyY2VJZChhdWRpb19pZCwgdHJ1ZSwgZmFsc2UpKTsKLQotICAvLyBBZGRpbmcgYW4gaWQgYWZ0ZXIgYXBwZW5kIHNob3VsZCBmYWlsLgotICBBU1NFUlRfRVEoQWRkSWQodmlkZW9faWQsIGZhbHNlLCB0cnVlKSwgQ2h1bmtEZW11eGVyOjprUmVhY2hlZElkTGltaXQpOwotfQotCi0vLyBUZXN0IHRoYXQgUmVhZCgpIGNhbGxzIGFmdGVyIGEgUmVtb3ZlSWQoKSByZXR1cm4gImVuZCBvZiBzdHJlYW0iIGJ1ZmZlcnMuCi1URVNUX0YoQ2h1bmtEZW11eGVyVGVzdCwgVGVzdFJlbW92ZUlkKSB7Ci0gIHN0ZDo6c3RyaW5nIGF1ZGlvX2lkID0gImF1ZGlvMSI7Ci0gIHN0ZDo6c3RyaW5nIHZpZGVvX2lkID0gInZpZGVvMSI7Ci0gIEFTU0VSVF9UUlVFKEluaXREZW11eGVyQXVkaW9BbmRWaWRlb1NvdXJjZXMoYXVkaW9faWQsIHZpZGVvX2lkKSk7Ci0KLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyX2EoCi0gICAgICBHZW5lcmF0ZVNpbmdsZVN0cmVhbUNsdXN0ZXIoMCwgOTIsIGtBdWRpb1RyYWNrTnVtLCBrQXVkaW9CbG9ja0R1cmF0aW9uKSk7Ci0KLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyX3YoCi0gICAgICBHZW5lcmF0ZVNpbmdsZVN0cmVhbUNsdXN0ZXIoMCwgMTMyLCBrVmlkZW9UcmFja051bSwga1ZpZGVvQmxvY2tEdXJhdGlvbikpOwotCi0gIC8vIEFwcGVuZCBhdWRpbyBhbmQgdmlkZW8gZGF0YSBpbnRvIHNlcGFyYXRlIHNvdXJjZSBpZHMuCi0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEoYXVkaW9faWQsIGNsdXN0ZXJfYS0+ZGF0YSgpLCBjbHVzdGVyX2EtPnNpemUoKSkpOwotICBBU1NFUlRfVFJVRShBcHBlbmREYXRhKHZpZGVvX2lkLCBjbHVzdGVyX3YtPmRhdGEoKSwgY2x1c3Rlcl92LT5zaXplKCkpKTsKLQotICAvLyBSZWFkKCkgZnJvbSBhdWRpbyBzaG91bGQgcmV0dXJuIG5vcm1hbCBidWZmZXJzLgotICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IGF1ZGlvID0KLSAgICAgIGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6QVVESU8pOwotICBHZW5lcmF0ZVNpbmdsZVN0cmVhbUV4cGVjdGVkUmVhZHMoMCwgNCwgYXVkaW8sIGtBdWRpb0Jsb2NrRHVyYXRpb24pOwotCi0gIC8vIFJlbW92ZSB0aGUgYXVkaW8gaWQuCi0gIGRlbXV4ZXJfLT5SZW1vdmVJZChhdWRpb19pZCk7Ci0KLSAgLy8gUmVhZCgpIGZyb20gYXVkaW8gc2hvdWxkIHJldHVybiAiZW5kIG9mIHN0cmVhbSIgYnVmZmVycy4KLSAgYm9vbCBhdWRpb19yZWFkX2RvbmUgPSBmYWxzZTsKLSAgYXVkaW8tPlJlYWQoYmFzZTo6QmluZCgmT25SZWFkRG9uZV9FT1NFeHBlY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmYXVkaW9fcmVhZF9kb25lKSk7Ci0gIEVYUEVDVF9UUlVFKGF1ZGlvX3JlYWRfZG9uZSk7Ci0KLSAgLy8gUmVhZCgpIGZyb20gdmlkZW8gc2hvdWxkIHN0aWxsIHJldHVybiBub3JtYWwgYnVmZmVycy4KLSAgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiB2aWRlbyA9Ci0gICAgICBkZW11eGVyXy0+R2V0U3RyZWFtKERlbXV4ZXJTdHJlYW06OlZJREVPKTsKLSAgR2VuZXJhdGVTaW5nbGVTdHJlYW1FeHBlY3RlZFJlYWRzKDAsIDQsIHZpZGVvLCBrVmlkZW9CbG9ja0R1cmF0aW9uKTsKLX0KLQotLy8gVGVzdCB0aGF0IHJlbW92aW5nIGFuIElEIGltbWVkaWF0ZWx5IGFmdGVyIGFkZGluZyBpdCBkb2VzIG5vdCBpbnRlcmZlcmUgd2l0aAotLy8gcXVvdGEgZm9yIG5ldyBJRHMgaW4gdGhlIGZ1dHVyZS4KLVRFU1RfRihDaHVua0RlbXV4ZXJUZXN0LCBUZXN0UmVtb3ZlQW5kQWRkSWQpIHsKLSAgc3RkOjpzdHJpbmcgYXVkaW9faWRfMSA9ICJhdWRpbzEiOwotICBBU1NFUlRfVFJVRShBZGRJZChhdWRpb19pZF8xLCB0cnVlLCBmYWxzZSkgPT0gQ2h1bmtEZW11eGVyOjprT2spOwotICBkZW11eGVyXy0+UmVtb3ZlSWQoYXVkaW9faWRfMSk7Ci0KLSAgc3RkOjpzdHJpbmcgYXVkaW9faWRfMiA9ICJhdWRpbzIiOwotICBBU1NFUlRfVFJVRShBZGRJZChhdWRpb19pZF8yLCB0cnVlLCBmYWxzZSkgPT0gQ2h1bmtEZW11eGVyOjprT2spOwotfQotCi1URVNUX0YoQ2h1bmtEZW11eGVyVGVzdCwgVGVzdFNlZWtDYW5jZWxlZCkgewotICBBU1NFUlRfVFJVRShJbml0RGVtdXhlcih0cnVlLCB0cnVlKSk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiBhdWRpbyA9Ci0gICAgICBkZW11eGVyXy0+R2V0U3RyZWFtKERlbXV4ZXJTdHJlYW06OkFVRElPKTsKLSAgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiB2aWRlbyA9Ci0gICAgICBkZW11eGVyXy0+R2V0U3RyZWFtKERlbXV4ZXJTdHJlYW06OlZJREVPKTsKLQotICAvLyBBcHBlbmQgY2x1c3RlciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0uCi0gIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gc3RhcnRfY2x1c3RlcihHZW5lcmF0ZUNsdXN0ZXIoMCwgNCkpOwotICBBU1NFUlRfVFJVRShBcHBlbmREYXRhKHN0YXJ0X2NsdXN0ZXItPmRhdGEoKSwgc3RhcnRfY2x1c3Rlci0+c2l6ZSgpKSk7Ci0KLSAgLy8gU2VlayB0byBhbiB1bmJ1ZmZlcmVkIHJlZ2lvbi4KLSAgZGVtdXhlcl8tPlN0YXJ0V2FpdGluZ0ZvclNlZWsoKTsKLSAgZGVtdXhlcl8tPlNlZWsoYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcyg1MCksCi0gICAgICAgICAgICAgICAgIE5ld0V4cGVjdGVkU3RhdHVzQ0IoUElQRUxJTkVfT0spKTsKLQotICAvLyBBdHRlbXB0IHRvIHJlYWQgaW4gdW5idWZmZXJlZCBhcmVhOyBzaG91bGQgbm90IGZ1bGZpbGwgdGhlIHJlYWQuCi0gIGJvb2wgYXVkaW9fcmVhZF9kb25lID0gZmFsc2U7Ci0gIGJvb2wgdmlkZW9fcmVhZF9kb25lID0gZmFsc2U7Ci0gIGF1ZGlvLT5SZWFkKGJhc2U6OkJpbmQoJk9uUmVhZERvbmVfQWJvcnRFeHBlY3RlZCwgJmF1ZGlvX3JlYWRfZG9uZSkpOwotICB2aWRlby0+UmVhZChiYXNlOjpCaW5kKCZPblJlYWREb25lX0Fib3J0RXhwZWN0ZWQsICZ2aWRlb19yZWFkX2RvbmUpKTsKLSAgRVhQRUNUX0ZBTFNFKGF1ZGlvX3JlYWRfZG9uZSk7Ci0gIEVYUEVDVF9GQUxTRSh2aWRlb19yZWFkX2RvbmUpOwotCi0gIC8vIE5vdyBjYW5jZWwgdGhlIHBlbmRpbmcgc2Vlaywgd2hpY2ggc2hvdWxkIGZsdXNoIHRoZSByZWFkcyB3aXRoIGVtcHR5Ci0gIC8vIGJ1ZmZlcnMuCi0gIGRlbXV4ZXJfLT5DYW5jZWxQZW5kaW5nU2VlaygpOwotICBFWFBFQ1RfVFJVRShhdWRpb19yZWFkX2RvbmUpOwotICBFWFBFQ1RfVFJVRSh2aWRlb19yZWFkX2RvbmUpOwotCi0gIC8vIEEgc2VlayBiYWNrIHRvIHRoZSBidWZmZXJlZCByZWdpb24gc2hvdWxkIHN1Y2NlZWQuCi0gIGRlbXV4ZXJfLT5TdGFydFdhaXRpbmdGb3JTZWVrKCk7Ci0gIGRlbXV4ZXJfLT5TZWVrKGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoMCksCi0gICAgICAgICAgICAgICAgIE5ld0V4cGVjdGVkU3RhdHVzQ0IoUElQRUxJTkVfT0spKTsKLSAgR2VuZXJhdGVFeHBlY3RlZFJlYWRzKDAsIDQsIGF1ZGlvLCB2aWRlbyk7Ci19Ci0KLVRFU1RfRihDaHVua0RlbXV4ZXJUZXN0LCBUZXN0U2Vla0NhbmNlbGVkV2hpbGVXYWl0aW5nRm9yU2VlaykgewotICBBU1NFUlRfVFJVRShJbml0RGVtdXhlcih0cnVlLCB0cnVlKSk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiBhdWRpbyA9Ci0gICAgICBkZW11eGVyXy0+R2V0U3RyZWFtKERlbXV4ZXJTdHJlYW06OkFVRElPKTsKLSAgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiB2aWRlbyA9Ci0gICAgICBkZW11eGVyXy0+R2V0U3RyZWFtKERlbXV4ZXJTdHJlYW06OlZJREVPKTsKLQotICAvLyBBcHBlbmQgY2x1c3RlciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0uCi0gIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gc3RhcnRfY2x1c3RlcihHZW5lcmF0ZUNsdXN0ZXIoMCwgNCkpOwotICBBU1NFUlRfVFJVRShBcHBlbmREYXRhKHN0YXJ0X2NsdXN0ZXItPmRhdGEoKSwgc3RhcnRfY2x1c3Rlci0+c2l6ZSgpKSk7Ci0KLSAgLy8gU3RhcnQgd2FpdGluZyBmb3IgYSBzZWVrLgotICBkZW11eGVyXy0+U3RhcnRXYWl0aW5nRm9yU2VlaygpOwotCi0gIC8vIE5vdyBjYW5jZWwgdGhlIHVwY29taW5nIHNlZWsgdG8gYW4gdW5idWZmZXJlZCByZWdpb24uCi0gIGRlbXV4ZXJfLT5DYW5jZWxQZW5kaW5nU2VlaygpOwotICBkZW11eGVyXy0+U2VlayhiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKDUwKSwKLSAgICAgICAgICAgICAgICAgTmV3RXhwZWN0ZWRTdGF0dXNDQihQSVBFTElORV9PSykpOwotCi0gIC8vIFJlYWQgcmVxdWVzdHMgc2hvdWxkIGJlIGZ1bGZpbGxlZCB3aXRoIGVtcHR5IGJ1ZmZlcnMuCi0gIGJvb2wgYXVkaW9fcmVhZF9kb25lID0gZmFsc2U7Ci0gIGJvb2wgdmlkZW9fcmVhZF9kb25lID0gZmFsc2U7Ci0gIGF1ZGlvLT5SZWFkKGJhc2U6OkJpbmQoJk9uUmVhZERvbmVfQWJvcnRFeHBlY3RlZCwgJmF1ZGlvX3JlYWRfZG9uZSkpOwotICB2aWRlby0+UmVhZChiYXNlOjpCaW5kKCZPblJlYWREb25lX0Fib3J0RXhwZWN0ZWQsICZ2aWRlb19yZWFkX2RvbmUpKTsKLSAgRVhQRUNUX1RSVUUoYXVkaW9fcmVhZF9kb25lKTsKLSAgRVhQRUNUX1RSVUUodmlkZW9fcmVhZF9kb25lKTsKLQotICAvLyBBIHNlZWsgYmFjayB0byB0aGUgYnVmZmVyZWQgcmVnaW9uIHNob3VsZCBzdWNjZWVkLgotICBkZW11eGVyXy0+U3RhcnRXYWl0aW5nRm9yU2VlaygpOwotICBkZW11eGVyXy0+U2VlayhiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKDApLAotICAgICAgICAgICAgICAgICBOZXdFeHBlY3RlZFN0YXR1c0NCKFBJUEVMSU5FX09LKSk7Ci0gIEdlbmVyYXRlRXhwZWN0ZWRSZWFkcygwLCA0LCBhdWRpbywgdmlkZW8pOwotfQotCi0vLyBUZXN0IHRoYXQgU2VlaygpIHN1Y2Nlc3NmdWxseSBzZWVrcyB0byBhbGwgc291cmNlIElEcy4KLVRFU1RfRihDaHVua0RlbXV4ZXJUZXN0LCBUZXN0U2Vla0F1ZGlvQW5kVmlkZW9Tb3VyY2VzKSB7Ci0gIHN0ZDo6c3RyaW5nIGF1ZGlvX2lkID0gImF1ZGlvMSI7Ci0gIHN0ZDo6c3RyaW5nIHZpZGVvX2lkID0gInZpZGVvMSI7Ci0gIEFTU0VSVF9UUlVFKEluaXREZW11eGVyQXVkaW9BbmRWaWRlb1NvdXJjZXMoYXVkaW9faWQsIHZpZGVvX2lkKSk7Ci0KLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyX2ExKAotICAgICAgR2VuZXJhdGVTaW5nbGVTdHJlYW1DbHVzdGVyKDAsIDkyLCBrQXVkaW9UcmFja051bSwga0F1ZGlvQmxvY2tEdXJhdGlvbikpOwotCi0gIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gY2x1c3Rlcl92MSgKLSAgICAgIEdlbmVyYXRlU2luZ2xlU3RyZWFtQ2x1c3RlcigwLCAxMzIsIGtWaWRlb1RyYWNrTnVtLCBrVmlkZW9CbG9ja0R1cmF0aW9uKSk7Ci0KLSAgQVNTRVJUX1RSVUUoQXBwZW5kRGF0YShhdWRpb19pZCwgY2x1c3Rlcl9hMS0+ZGF0YSgpLCBjbHVzdGVyX2ExLT5zaXplKCkpKTsKLSAgQVNTRVJUX1RSVUUoQXBwZW5kRGF0YSh2aWRlb19pZCwgY2x1c3Rlcl92MS0+ZGF0YSgpLCBjbHVzdGVyX3YxLT5zaXplKCkpKTsKLQotICAvLyBSZWFkKCkgc2hvdWxkIHJldHVybiBidWZmZXJzIGF0IDAuCi0gIGJvb2wgYXVkaW9fcmVhZF9kb25lID0gZmFsc2U7Ci0gIGJvb2wgdmlkZW9fcmVhZF9kb25lID0gZmFsc2U7Ci0gIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gYXVkaW8gPQotICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpBVURJTyk7Ci0gIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gdmlkZW8gPQotICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpWSURFTyk7Ci0KLSAgYXVkaW8tPlJlYWQoYmFzZTo6QmluZCgmT25SZWFkRG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgJmF1ZGlvX3JlYWRfZG9uZSkpOwotICB2aWRlby0+UmVhZChiYXNlOjpCaW5kKCZPblJlYWREb25lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmdmlkZW9fcmVhZF9kb25lKSk7Ci0gIEVYUEVDVF9UUlVFKGF1ZGlvX3JlYWRfZG9uZSk7Ci0gIEVYUEVDVF9UUlVFKHZpZGVvX3JlYWRfZG9uZSk7Ci0KLSAgLy8gU2VlayB0byAzIChhbiB1bmJ1ZmZlcmVkIHJlZ2lvbikuCi0gIGRlbXV4ZXJfLT5TdGFydFdhaXRpbmdGb3JTZWVrKCk7Ci0gIGRlbXV4ZXJfLT5TZWVrKGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoMyksCi0gICAgICAgICAgICAgICAgIE5ld0V4cGVjdGVkU3RhdHVzQ0IoUElQRUxJTkVfT0spKTsKLQotICBhdWRpb19yZWFkX2RvbmUgPSBmYWxzZTsKLSAgdmlkZW9fcmVhZF9kb25lID0gZmFsc2U7Ci0gIGF1ZGlvLT5SZWFkKGJhc2U6OkJpbmQoJk9uUmVhZERvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcygzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmYXVkaW9fcmVhZF9kb25lKSk7Ci0gIHZpZGVvLT5SZWFkKGJhc2U6OkJpbmQoJk9uUmVhZERvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcygzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmdmlkZW9fcmVhZF9kb25lKSk7Ci0KLSAgLy8gUmVhZCgpcyBzaG91bGQgbm90IHJldHVybiB1bnRpbCBhZnRlciBkYXRhIGlzIGFwcGVuZGVkIGF0IHRoZSBTZWVrIHBvaW50LgotICBFWFBFQ1RfRkFMU0UoYXVkaW9fcmVhZF9kb25lKTsKLSAgRVhQRUNUX0ZBTFNFKHZpZGVvX3JlYWRfZG9uZSk7Ci0KLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyX2EyKAotICAgICAgR2VuZXJhdGVTaW5nbGVTdHJlYW1DbHVzdGVyKDMwMDAsIDMwOTIsIGtBdWRpb1RyYWNrTnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBdWRpb0Jsb2NrRHVyYXRpb24pKTsKLQotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXJfdjIoCi0gICAgICBHZW5lcmF0ZVNpbmdsZVN0cmVhbUNsdXN0ZXIoMzAwMCwgMzEzMiwga1ZpZGVvVHJhY2tOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZpZGVvQmxvY2tEdXJhdGlvbikpOwotCi0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEoYXVkaW9faWQsIGNsdXN0ZXJfYTItPmRhdGEoKSwgY2x1c3Rlcl9hMi0+c2l6ZSgpKSk7Ci0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEodmlkZW9faWQsIGNsdXN0ZXJfdjItPmRhdGEoKSwgY2x1c3Rlcl92Mi0+c2l6ZSgpKSk7Ci0KLSAgLy8gUmVhZCgpIHNob3VsZCByZXR1cm4gYnVmZmVycyBhdCAzLgotICBFWFBFQ1RfVFJVRShhdWRpb19yZWFkX2RvbmUpOwotICBFWFBFQ1RfVFJVRSh2aWRlb19yZWFkX2RvbmUpOwotfQotCi0vLyBUZXN0IHJhbmdlcyBpbiBhbiBhdWRpby1vbmx5IHN0cmVhbS4KLVRFU1RfRihDaHVua0RlbXV4ZXJUZXN0LCBHZXRCdWZmZXJlZFJhbmdlc19BdWRpb0lkT25seSkgewotICBFWFBFQ1RfQ0FMTCgqdGhpcywgRGVtdXhlck9wZW5lZCgpKTsKLSAgZGVtdXhlcl8tPkluaXRpYWxpemUoCi0gICAgICAmaG9zdF8sIENyZWF0ZUluaXREb25lQ0Ioa0RlZmF1bHREdXJhdGlvbigpLCBQSVBFTElORV9PSykpOwotCi0gIEFTU0VSVF9FUShBZGRJZChrU291cmNlSWQsIHRydWUsIGZhbHNlKSwgQ2h1bmtEZW11eGVyOjprT2spOwotICBBU1NFUlRfVFJVRShBcHBlbmRJbml0U2VnbWVudCh0cnVlLCBmYWxzZSkpOwotCi0gIC8vIFRlc3QgYSBzaW1wbGUgY2x1c3Rlci4KLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyXzEoR2VuZXJhdGVTaW5nbGVTdHJlYW1DbHVzdGVyKDAsIDkyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9UcmFja051bSwga0F1ZGlvQmxvY2tEdXJhdGlvbikpOwotICBBU1NFUlRfVFJVRShBcHBlbmREYXRhKGNsdXN0ZXJfMS0+ZGF0YSgpLCBjbHVzdGVyXzEtPnNpemUoKSkpOwotCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzAsOTIpIH0iKTsKLQotICAvLyBBcHBlbmQgYSBkaXNqb2ludCBjbHVzdGVyIHRvIGNoZWNrIGZvciB0d28gc2VwYXJhdGUgcmFuZ2VzLgotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXJfMihHZW5lcmF0ZVNpbmdsZVN0cmVhbUNsdXN0ZXIoMTUwLCAyMTksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBdWRpb1RyYWNrTnVtLCBrQXVkaW9CbG9ja0R1cmF0aW9uKSk7Ci0KLSAgQVNTRVJUX1RSVUUoQXBwZW5kRGF0YShjbHVzdGVyXzItPmRhdGEoKSwgY2x1c3Rlcl8yLT5zaXplKCkpKTsKLQotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFswLDkyKSBbMTUwLDIxOSkgfSIpOwotfQotCi0vLyBUZXN0IHJhbmdlcyBpbiBhIHZpZGVvLW9ubHkgc3RyZWFtLgotVEVTVF9GKENodW5rRGVtdXhlclRlc3QsIEdldEJ1ZmZlcmVkUmFuZ2VzX1ZpZGVvSWRPbmx5KSB7Ci0gIEVYUEVDVF9DQUxMKCp0aGlzLCBEZW11eGVyT3BlbmVkKCkpOwotICBkZW11eGVyXy0+SW5pdGlhbGl6ZSgKLSAgICAgICZob3N0XywgQ3JlYXRlSW5pdERvbmVDQihrRGVmYXVsdER1cmF0aW9uKCksIFBJUEVMSU5FX09LKSk7Ci0KLSAgQVNTRVJUX0VRKEFkZElkKGtTb3VyY2VJZCwgZmFsc2UsIHRydWUpLCBDaHVua0RlbXV4ZXI6OmtPayk7Ci0gIEFTU0VSVF9UUlVFKEFwcGVuZEluaXRTZWdtZW50KGZhbHNlLCB0cnVlKSk7Ci0KLSAgLy8gVGVzdCBhIHNpbXBsZSBjbHVzdGVyLgotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXJfMShHZW5lcmF0ZVNpbmdsZVN0cmVhbUNsdXN0ZXIoMCwgMTMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVmlkZW9UcmFja051bSwga1ZpZGVvQmxvY2tEdXJhdGlvbikpOwotCi0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEoY2x1c3Rlcl8xLT5kYXRhKCksIGNsdXN0ZXJfMS0+c2l6ZSgpKSk7Ci0KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbMCwxMzIpIH0iKTsKLQotICAvLyBBcHBlbmQgYSBkaXNqb2ludCBjbHVzdGVyIHRvIGNoZWNrIGZvciB0d28gc2VwYXJhdGUgcmFuZ2VzLgotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXJfMihHZW5lcmF0ZVNpbmdsZVN0cmVhbUNsdXN0ZXIoMjAwLCAyOTksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWaWRlb1RyYWNrTnVtLCBrVmlkZW9CbG9ja0R1cmF0aW9uKSk7Ci0KLSAgQVNTRVJUX1RSVUUoQXBwZW5kRGF0YShjbHVzdGVyXzItPmRhdGEoKSwgY2x1c3Rlcl8yLT5zaXplKCkpKTsKLQotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFswLDEzMikgWzIwMCwyOTkpIH0iKTsKLX0KLQotVEVTVF9GKENodW5rRGVtdXhlclRlc3QsIEdldEJ1ZmZlcmVkUmFuZ2VzX0F1ZGlvVmlkZW8pIHsKLSAgQVNTRVJUX1RSVUUoSW5pdERlbXV4ZXIodHJ1ZSwgdHJ1ZSkpOwotCi0gIC8vIEF1ZGlvOiAwIC0+IDIzCi0gIC8vIFZpZGVvOiAwIC0+IDMzCi0gIC8vIEJ1ZmZlcmVkIFJhbmdlOiAwIC0+IDIzCi0gIC8vIEF1ZGlvIGJsb2NrIGR1cmF0aW9uIGlzIHNtYWxsZXIgdGhhbiB2aWRlbyBibG9jayBkdXJhdGlvbiwKLSAgLy8gc28gdGhlIGJ1ZmZlcmVkIHJhbmdlcyBzaG91bGQgY29ycmVzcG9uZCB0byB0aGUgYXVkaW8gYmxvY2tzLgotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXJfYTAoCi0gICAgICBHZW5lcmF0ZVNpbmdsZVN0cmVhbUNsdXN0ZXIoMCwga0F1ZGlvQmxvY2tEdXJhdGlvbiwga0F1ZGlvVHJhY2tOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0F1ZGlvQmxvY2tEdXJhdGlvbikpOwotCi0gIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gY2x1c3Rlcl92MCgKLSAgICAgIEdlbmVyYXRlU2luZ2xlU3RyZWFtQ2x1c3RlcigwLCBrVmlkZW9CbG9ja0R1cmF0aW9uLCBrVmlkZW9UcmFja051bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVmlkZW9CbG9ja0R1cmF0aW9uKSk7Ci0KLSAgQVNTRVJUX1RSVUUoQXBwZW5kRGF0YShjbHVzdGVyX2EwLT5kYXRhKCksIGNsdXN0ZXJfYTAtPnNpemUoKSkpOwotICBBU1NFUlRfVFJVRShBcHBlbmREYXRhKGNsdXN0ZXJfdjAtPmRhdGEoKSwgY2x1c3Rlcl92MC0+c2l6ZSgpKSk7Ci0KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbMCwyMykgfSIpOwotCi0gIC8vIEF1ZGlvOiAzMDAgLT4gNDAwCi0gIC8vIFZpZGVvOiAzMjAgLT4gNDIwCi0gIC8vIEJ1ZmZlcmVkIFJhbmdlOiAzMjAgLT4gNDAwICAoZW5kIG92ZXJsYXApCi0gIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gY2x1c3Rlcl9hMSgKLSAgICAgIEdlbmVyYXRlU2luZ2xlU3RyZWFtQ2x1c3RlcigzMDAsIDQwMCwga0F1ZGlvVHJhY2tOdW0sIDUwKSk7Ci0KLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyX3YxKAotICAgICAgR2VuZXJhdGVTaW5nbGVTdHJlYW1DbHVzdGVyKDMyMCwgNDIwLCBrVmlkZW9UcmFja051bSwgNTApKTsKLQotICBBU1NFUlRfVFJVRShBcHBlbmREYXRhKGNsdXN0ZXJfYTEtPmRhdGEoKSwgY2x1c3Rlcl9hMS0+c2l6ZSgpKSk7Ci0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEoY2x1c3Rlcl92MS0+ZGF0YSgpLCBjbHVzdGVyX3YxLT5zaXplKCkpKTsKLQotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFswLDIzKSBbMzIwLDQwMCkgfSIpOwotCi0gIC8vIEF1ZGlvOiA1MjAgLT4gNTkwCi0gIC8vIFZpZGVvOiA1MDAgLT4gNTcwCi0gIC8vIEJ1ZmZlcmVkIFJhbmdlOiA1MjAgLT4gNTcwICAoZnJvbnQgb3ZlcmxhcCkKLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyX2EyKAotICAgICAgR2VuZXJhdGVTaW5nbGVTdHJlYW1DbHVzdGVyKDUyMCwgNTkwLCBrQXVkaW9UcmFja051bSwgNzApKTsKLQotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXJfdjIoCi0gICAgICBHZW5lcmF0ZVNpbmdsZVN0cmVhbUNsdXN0ZXIoNTAwLCA1NzAsIGtWaWRlb1RyYWNrTnVtLCA3MCkpOwotCi0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEoY2x1c3Rlcl9hMi0+ZGF0YSgpLCBjbHVzdGVyX2EyLT5zaXplKCkpKTsKLSAgQVNTRVJUX1RSVUUoQXBwZW5kRGF0YShjbHVzdGVyX3YyLT5kYXRhKCksIGNsdXN0ZXJfdjItPnNpemUoKSkpOwotCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzAsMjMpIFszMjAsNDAwKSBbNTIwLDU3MCkgfSIpOwotCi0gIC8vIEF1ZGlvOiA3MjAgLT4gNzUwCi0gIC8vIFZpZGVvOiA3MDAgLT4gNzcwCi0gIC8vIEJ1ZmZlcmVkIFJhbmdlOiA3MjAgLT4gNzUwICAoY29tcGxldGUgb3ZlcmxhcCwgYXVkaW8pCi0gIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gY2x1c3Rlcl9hMygKLSAgICAgIEdlbmVyYXRlU2luZ2xlU3RyZWFtQ2x1c3Rlcig3MjAsIDc1MCwga0F1ZGlvVHJhY2tOdW0sIDMwKSk7Ci0KLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyX3YzKAotICAgICAgR2VuZXJhdGVTaW5nbGVTdHJlYW1DbHVzdGVyKDcwMCwgNzcwLCBrVmlkZW9UcmFja051bSwgNzApKTsKLQotICBBU1NFUlRfVFJVRShBcHBlbmREYXRhKGNsdXN0ZXJfYTMtPmRhdGEoKSwgY2x1c3Rlcl9hMy0+c2l6ZSgpKSk7Ci0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEoY2x1c3Rlcl92My0+ZGF0YSgpLCBjbHVzdGVyX3YzLT5zaXplKCkpKTsKLQotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFswLDIzKSBbMzIwLDQwMCkgWzUyMCw1NzApIFs3MjAsNzUwKSB9Iik7Ci0KLSAgLy8gQXVkaW86IDkwMCAtPiA5NzAKLSAgLy8gVmlkZW86IDkyMCAtPiA5NTAKLSAgLy8gQnVmZmVyZWQgUmFuZ2U6IDkyMCAtPiA5NTAgIChjb21wbGV0ZSBvdmVybGFwLCB2aWRlbykKLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyX2E0KAotICAgICAgR2VuZXJhdGVTaW5nbGVTdHJlYW1DbHVzdGVyKDkwMCwgOTcwLCBrQXVkaW9UcmFja051bSwgNzApKTsKLQotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXJfdjQoCi0gICAgICBHZW5lcmF0ZVNpbmdsZVN0cmVhbUNsdXN0ZXIoOTIwLCA5NTAsIGtWaWRlb1RyYWNrTnVtLCAzMCkpOwotCi0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEoY2x1c3Rlcl9hNC0+ZGF0YSgpLCBjbHVzdGVyX2E0LT5zaXplKCkpKTsKLSAgQVNTRVJUX1RSVUUoQXBwZW5kRGF0YShjbHVzdGVyX3Y0LT5kYXRhKCksIGNsdXN0ZXJfdjQtPnNpemUoKSkpOwotCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzAsMjMpIFszMjAsNDAwKSBbNTIwLDU3MCkgWzcyMCw3NTApIFs5MjAsOTUwKSB9Iik7Ci0KLSAgLy8gQXBwZW5kaW5nIHdpdGhpbiBidWZmZXJlZCByYW5nZSBzaG91bGQgbm90IGFmZmVjdCBidWZmZXJlZCByYW5nZXMuCi0gIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gY2x1c3Rlcl9hNSgKLSAgICAgIEdlbmVyYXRlU2luZ2xlU3RyZWFtQ2x1c3Rlcig5MzAsIDk1MCwga0F1ZGlvVHJhY2tOdW0sIDIwKSk7Ci0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEoY2x1c3Rlcl9hNS0+ZGF0YSgpLCBjbHVzdGVyX2E1LT5zaXplKCkpKTsKLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbMCwyMykgWzMyMCw0MDApIFs1MjAsNTcwKSBbNzIwLDc1MCkgWzkyMCw5NTApIH0iKTsKLQotICAvLyBBcHBlbmRpbmcgdG8gc2luZ2xlIHN0cmVhbSBvdXRzaWRlIGJ1ZmZlcmVkIHJhbmdlcyBzaG91bGQgbm90IGFmZmVjdAotICAvLyBidWZmZXJlZCByYW5nZXMuCi0gIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gY2x1c3Rlcl92NSgKLSAgICAgIEdlbmVyYXRlU2luZ2xlU3RyZWFtQ2x1c3RlcigxMjMwLCAxMjQwLCBrVmlkZW9UcmFja051bSwgMTApKTsKLSAgQVNTRVJUX1RSVUUoQXBwZW5kRGF0YShjbHVzdGVyX3Y1LT5kYXRhKCksIGNsdXN0ZXJfdjUtPnNpemUoKSkpOwotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFswLDIzKSBbMzIwLDQwMCkgWzUyMCw1NzApIFs3MjAsNzUwKSBbOTIwLDk1MCkgfSIpOwotfQotCi0vLyBPbmNlIEVuZE9mU3RyZWFtKCkgaXMgY2FsbGVkLCBHZXRCdWZmZXJlZFJhbmdlcyBzaG91bGQgbm90IGN1dCBvZmYgYW55Ci0vLyBvdmVyLWhhbmdpbmcgdGFpbHMgYXQgdGhlIGVuZCBvZiB0aGUgcmFuZ2VzIGFzIHRoaXMgaXMgbGlrZWx5IGR1ZSB0byBibG9jawotLy8gZHVyYXRpb24gZGlmZmVyZW5jZXMuCi1URVNUX0YoQ2h1bmtEZW11eGVyVGVzdCwgR2V0QnVmZmVyZWRSYW5nZXNfRW5kT2ZTdHJlYW0pIHsKLSAgQVNTRVJUX1RSVUUoSW5pdERlbXV4ZXIodHJ1ZSwgdHJ1ZSkpOwotCi0gIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gY2x1c3Rlcl9hKAotICAgICAgR2VuZXJhdGVTaW5nbGVTdHJlYW1DbHVzdGVyKDAsIDkwLCBrQXVkaW9UcmFja051bSwgOTApKTsKLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyX3YoCi0gICAgICBHZW5lcmF0ZVNpbmdsZVN0cmVhbUNsdXN0ZXIoMCwgMTAwLCBrVmlkZW9UcmFja051bSwgMTAwKSk7Ci0KLSAgQVNTRVJUX1RSVUUoQXBwZW5kRGF0YShjbHVzdGVyX2EtPmRhdGEoKSwgY2x1c3Rlcl9hLT5zaXplKCkpKTsKLSAgQVNTRVJUX1RSVUUoQXBwZW5kRGF0YShjbHVzdGVyX3YtPmRhdGEoKSwgY2x1c3Rlcl92LT5zaXplKCkpKTsKLQotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFswLDkwKSB9Iik7Ci0KLSAgRVhQRUNUX0NBTEwoaG9zdF8sIFNldER1cmF0aW9uKGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygxMDApKSk7Ci0gIGRlbXV4ZXJfLT5FbmRPZlN0cmVhbShQSVBFTElORV9PSyk7Ci0KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbMCwxMDApIH0iKTsKLX0KLQotVEVTVF9GKENodW5rRGVtdXhlclRlc3QsIFRlc3REaWZmZXJlbnRTdHJlYW1UaW1lY29kZXMpIHsKLSAgQVNTRVJUX1RSVUUoSW5pdERlbXV4ZXIodHJ1ZSwgdHJ1ZSkpOwotCi0gIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gYXVkaW8gPQotICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpBVURJTyk7Ci0gIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gdmlkZW8gPQotICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpWSURFTyk7Ci0KLSAgLy8gQ3JlYXRlIGEgY2x1c3RlciB3aGVyZSB0aGUgdmlkZW8gdGltZWNvZGUgYmVnaW5zIDI1bXMgYWZ0ZXIgdGhlIGF1ZGlvLgotICBzY29wZWRfcHRyPENsdXN0ZXI+IHN0YXJ0X2NsdXN0ZXIoR2VuZXJhdGVDbHVzdGVyKDAsIDI1LCA4KSk7Ci0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEoc3RhcnRfY2x1c3Rlci0+ZGF0YSgpLCBzdGFydF9jbHVzdGVyLT5zaXplKCkpKTsKLQotICBkZW11eGVyXy0+U2VlayhiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKDApLAotICAgICAgICAgICAgICAgICBOZXdFeHBlY3RlZFN0YXR1c0NCKFBJUEVMSU5FX09LKSk7Ci0gIEdlbmVyYXRlRXhwZWN0ZWRSZWFkcygwLCAyNSwgOCwgYXVkaW8sIHZpZGVvKTsKLQotICAvLyBTZWVrIHRvIDUgc2Vjb25kcy4KLSAgZGVtdXhlcl8tPlN0YXJ0V2FpdGluZ0ZvclNlZWsoKTsKLSAgZGVtdXhlcl8tPlNlZWsoYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcyg1KSwKLSAgICAgICAgICAgICAgICAgTmV3RXhwZWN0ZWRTdGF0dXNDQihQSVBFTElORV9PSykpOwotCi0gIC8vIEdlbmVyYXRlIGEgY2x1c3RlciB0byBmdWxmaWxsIHRoaXMgc2Vlaywgd2hlcmUgYXVkaW8gdGltZWNvZGUgYmVnaW5zIDI1bXMKLSAgLy8gYWZ0ZXIgdGhlIHZpZGVvLgotICBzY29wZWRfcHRyPENsdXN0ZXI+IG1pZGRsZV9jbHVzdGVyKEdlbmVyYXRlQ2x1c3Rlcig1MDI1LCA1MDAwLCA4KSk7Ci0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEobWlkZGxlX2NsdXN0ZXItPmRhdGEoKSwgbWlkZGxlX2NsdXN0ZXItPnNpemUoKSkpOwotICBHZW5lcmF0ZUV4cGVjdGVkUmVhZHMoNTAyNSwgNTAwMCwgOCwgYXVkaW8sIHZpZGVvKTsKLX0KLQotVEVTVF9GKENodW5rRGVtdXhlclRlc3QsIFRlc3REaWZmZXJlbnRTdHJlYW1UaW1lY29kZXNTZXBhcmF0ZVNvdXJjZXMpIHsKLSAgc3RkOjpzdHJpbmcgYXVkaW9faWQgPSAiYXVkaW8xIjsKLSAgc3RkOjpzdHJpbmcgdmlkZW9faWQgPSAidmlkZW8xIjsKLSAgQVNTRVJUX1RSVUUoSW5pdERlbXV4ZXJBdWRpb0FuZFZpZGVvU291cmNlcyhhdWRpb19pZCwgdmlkZW9faWQpKTsKLQotICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IGF1ZGlvID0KLSAgICAgIGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6QVVESU8pOwotICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IHZpZGVvID0KLSAgICAgIGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6VklERU8pOwotCi0gIC8vIEdlbmVyYXRlIHR3byBzdHJlYW1zIHdoZXJlIHRoZSB2aWRlbyBzdHJlYW0gc3RhcnRzIDVtcyBhZnRlciB0aGUgYXVkaW8KLSAgLy8gc3RyZWFtIGFuZCBhcHBlbmQgdGhlbS4KLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyX3YoCi0gICAgICBHZW5lcmF0ZVNpbmdsZVN0cmVhbUNsdXN0ZXIoMzAsIDQgKiBrVmlkZW9CbG9ja0R1cmF0aW9uICsgMzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZpZGVvVHJhY2tOdW0sIGtWaWRlb0Jsb2NrRHVyYXRpb24pKTsKLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyX2EoCi0gICAgICBHZW5lcmF0ZVNpbmdsZVN0cmVhbUNsdXN0ZXIoMjUsIDQgKiBrQXVkaW9CbG9ja0R1cmF0aW9uICsgMjUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0F1ZGlvVHJhY2tOdW0sIGtBdWRpb0Jsb2NrRHVyYXRpb24pKTsKLSAgQVNTRVJUX1RSVUUoQXBwZW5kRGF0YShhdWRpb19pZCwgY2x1c3Rlcl9hLT5kYXRhKCksIGNsdXN0ZXJfYS0+c2l6ZSgpKSk7Ci0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEodmlkZW9faWQsIGNsdXN0ZXJfdi0+ZGF0YSgpLCBjbHVzdGVyX3YtPnNpemUoKSkpOwotCi0gIC8vIEJvdGggc3RyZWFtcyBzaG91bGQgYmUgYWJsZSB0byBmdWxmaWxsIGEgc2VlayB0byAyNS4KLSAgZGVtdXhlcl8tPlNlZWsoYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDI1KSwKLSAgICAgICAgICAgICAgICAgTmV3RXhwZWN0ZWRTdGF0dXNDQihQSVBFTElORV9PSykpOwotICBHZW5lcmF0ZVNpbmdsZVN0cmVhbUV4cGVjdGVkUmVhZHMoMjUsIDQsIGF1ZGlvLCBrQXVkaW9CbG9ja0R1cmF0aW9uKTsKLSAgR2VuZXJhdGVTaW5nbGVTdHJlYW1FeHBlY3RlZFJlYWRzKDMwLCA0LCB2aWRlbywga1ZpZGVvQmxvY2tEdXJhdGlvbik7Ci19Ci0KLVRFU1RfRihDaHVua0RlbXV4ZXJUZXN0LCBUZXN0RGlmZmVyZW50U3RyZWFtVGltZWNvZGVzT3V0T2ZSYW5nZSkgewotICBzdGQ6OnN0cmluZyBhdWRpb19pZCA9ICJhdWRpbzEiOwotICBzdGQ6OnN0cmluZyB2aWRlb19pZCA9ICJ2aWRlbzEiOwotICBBU1NFUlRfVFJVRShJbml0RGVtdXhlckF1ZGlvQW5kVmlkZW9Tb3VyY2VzKGF1ZGlvX2lkLCB2aWRlb19pZCkpOwotCi0gIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gYXVkaW8gPQotICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpBVURJTyk7Ci0gIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gdmlkZW8gPQotICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpWSURFTyk7Ci0KLSAgLy8gR2VuZXJhdGUgdHdvIHN0cmVhbXMgd2hlcmUgdGhlIHZpZGVvIHN0cmVhbSBzdGFydHMgMTBzIGFmdGVyIHRoZSBhdWRpbwotICAvLyBzdHJlYW0gYW5kIGFwcGVuZCB0aGVtLgotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXJfdigKLSAgICAgIEdlbmVyYXRlU2luZ2xlU3RyZWFtQ2x1c3RlcigxMDAwMCwgNCAqIGtWaWRlb0Jsb2NrRHVyYXRpb24gKyAxMDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVmlkZW9UcmFja051bSwga1ZpZGVvQmxvY2tEdXJhdGlvbikpOwotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXJfYSgKLSAgICAgIEdlbmVyYXRlU2luZ2xlU3RyZWFtQ2x1c3RlcigwLCA0ICoga0F1ZGlvQmxvY2tEdXJhdGlvbiArIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0F1ZGlvVHJhY2tOdW0sIGtBdWRpb0Jsb2NrRHVyYXRpb24pKTsKLSAgQVNTRVJUX1RSVUUoQXBwZW5kRGF0YShhdWRpb19pZCwgY2x1c3Rlcl9hLT5kYXRhKCksIGNsdXN0ZXJfYS0+c2l6ZSgpKSk7Ci0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEodmlkZW9faWQsIGNsdXN0ZXJfdi0+ZGF0YSgpLCBjbHVzdGVyX3YtPnNpemUoKSkpOwotCi0gIC8vIFNob3VsZCBub3QgYmUgYWJsZSB0byBmdWxmaWxsIGEgc2VlayB0byAwLgotICBkZW11eGVyXy0+U2VlayhiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMCksCi0gICAgICAgICAgICAgICAgIE5ld0V4cGVjdGVkU3RhdHVzQ0IoUElQRUxJTkVfRVJST1JfQUJPUlQpKTsKLSAgRXhwZWN0UmVhZChhdWRpbywgMCk7Ci0gIEV4cGVjdEVuZE9mU3RyZWFtKHZpZGVvKTsKLX0KLQotVEVTVF9GKENodW5rRGVtdXhlclRlc3QsIFRlc3RDbHVzdGVyV2l0aE5vQnVmZmVycykgewotICBBU1NFUlRfVFJVRShJbml0RGVtdXhlcih0cnVlLCB0cnVlKSk7Ci0KLSAgLy8gR2VuZXJhdGUgYW5kIGFwcGVuZCBhbiBlbXB0eSBjbHVzdGVyIGJlZ2lubmluZyBhdCAwLgotICBBU1NFUlRfVFJVRShBcHBlbmRFbXB0eUNsdXN0ZXIoMCkpOwotCi0gIC8vIFNhbml0eSBjaGVjayB0aGF0IGRhdGEgY2FuIGJlIGFwcGVuZGVkIGFmdGVyIHRoaXMgY2x1c3RlciBjb3JyZWN0bHkuCi0gIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gbWVkaWFfZGF0YShHZW5lcmF0ZUNsdXN0ZXIoMCwgMikpOwotICBBU1NFUlRfVFJVRShBcHBlbmREYXRhKG1lZGlhX2RhdGEtPmRhdGEoKSwgbWVkaWFfZGF0YS0+c2l6ZSgpKSk7Ci0gIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gYXVkaW8gPQotICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpBVURJTyk7Ci0gIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gdmlkZW8gPQotICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpWSURFTyk7Ci0gIEV4cGVjdFJlYWQoYXVkaW8sIDApOwotICBFeHBlY3RSZWFkKHZpZGVvLCAwKTsKLX0KLQotVEVTVF9GKENodW5rRGVtdXhlclRlc3QsIFRlc3RDb2RlY1ByZWZpeE1hdGNoaW5nKSB7Ci0gIENodW5rRGVtdXhlcjo6U3RhdHVzIGV4cGVjdGVkID0gQ2h1bmtEZW11eGVyOjprTm90U3VwcG9ydGVkOwotCi0jaWYgZGVmaW5lZChHT09HTEVfQ0hST01FX0JVSUxEKSB8fCBkZWZpbmVkKFVTRV9QUk9QUklFVEFSWV9DT0RFQ1MpCi0gIGV4cGVjdGVkID0gQ2h1bmtEZW11eGVyOjprT2s7Ci0jZW5kaWYKLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29kZWNzOwotICBjb2RlY3MucHVzaF9iYWNrKCJhdmMxLjRENDA0MSIpOwotICBjb2RlY3MucHVzaF9iYWNrKCJtcDRhLjQwLjIiKTsKLQotICBFWFBFQ1RfRVEoZGVtdXhlcl8tPkFkZElkKCJzb3VyY2VfaWQiLCAidmlkZW8vbXA0IiwgY29kZWNzKSwgZXhwZWN0ZWQpOwotfQotCi1URVNUX0YoQ2h1bmtEZW11eGVyVGVzdCwgVGVzdEVuZE9mU3RyZWFtRmFpbHVyZXMpIHsKLSAgc3RkOjpzdHJpbmcgYXVkaW9faWQgPSAiYXVkaW8iOwotICBzdGQ6OnN0cmluZyB2aWRlb19pZCA9ICJ2aWRlbyI7Ci0KLSAgQVNTRVJUX1RSVUUoSW5pdERlbXV4ZXJBdWRpb0FuZFZpZGVvU291cmNlcyhhdWRpb19pZCwgdmlkZW9faWQpKTsKLQotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXJfYTEoCi0gICAgICBHZW5lcmF0ZVNpbmdsZVN0cmVhbUNsdXN0ZXIoMCwgMzUsIGtBdWRpb1RyYWNrTnVtLCAzNSkpOwotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXJfdjEoCi0gICAgICBHZW5lcmF0ZVNpbmdsZVN0cmVhbUNsdXN0ZXIoMCwgMTAsIGtWaWRlb1RyYWNrTnVtLCA1KSk7Ci0gIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gY2x1c3Rlcl92MigKLSAgICAgIEdlbmVyYXRlU2luZ2xlU3RyZWFtQ2x1c3RlcigxMCwgMjUsIGtWaWRlb1RyYWNrTnVtLCA1KSk7Ci0gIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gY2x1c3Rlcl92MygKLSAgICAgIEdlbmVyYXRlU2luZ2xlU3RyZWFtQ2x1c3RlcigzMCwgNTAsIGtWaWRlb1RyYWNrTnVtLCAxMCkpOwotCi0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEoYXVkaW9faWQsIGNsdXN0ZXJfYTEtPmRhdGEoKSwgY2x1c3Rlcl9hMS0+c2l6ZSgpKSk7Ci0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEodmlkZW9faWQsIGNsdXN0ZXJfdjEtPmRhdGEoKSwgY2x1c3Rlcl92MS0+c2l6ZSgpKSk7Ci0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEodmlkZW9faWQsIGNsdXN0ZXJfdjMtPmRhdGEoKSwgY2x1c3Rlcl92My0+c2l6ZSgpKSk7Ci0KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcyhhdWRpb19pZCwgInsgWzAsMzUpIH0iKTsKLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcyh2aWRlb19pZCwgInsgWzAsMTApIFszMCw1MCkgfSIpOwotCi0gIC8vIE1ha2Ugc3VyZSB0aGF0IGVuZCBvZiBzdHJlYW0gZmFpbHMgYmVjYXVzZSB0aGVyZSBpcyBhIGdhcCBiZXR3ZWVuCi0gIC8vIHRoZSBjdXJyZW50IHBvc2l0aW9uKDApIGFuZCB0aGUgZW5kIG9mIHRoZSBhcHBlbmRlZCBkYXRhLgotICBFWFBFQ1RfQ0FMTChob3N0XywgU2V0RHVyYXRpb24oYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDUwKSkpOwotICBBU1NFUlRfRkFMU0UoZGVtdXhlcl8tPkVuZE9mU3RyZWFtKFBJUEVMSU5FX09LKSk7Ci0KLSAgLy8gU2VlayB0byBhbiB0aW1lIHRoYXQgaXMgaW5zaWRlIHRoZSBsYXN0IHJhbmdlcyBmb3IgYm90aCBzdHJlYW1zCi0gIC8vIGFuZCB2ZXJpZnkgdGhhdCB0aGUgRW5kT2ZTdHJlYW0oKSBpcyBzdWNjZXNzZnVsLgotICBkZW11eGVyXy0+U3RhcnRXYWl0aW5nRm9yU2VlaygpOwotICBkZW11eGVyXy0+U2VlayhiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMzApLAotICAgICAgICAgICAgICAgICBOZXdFeHBlY3RlZFN0YXR1c0NCKFBJUEVMSU5FX09LKSk7Ci0KLSAgQVNTRVJUX1RSVUUoZGVtdXhlcl8tPkVuZE9mU3RyZWFtKFBJUEVMSU5FX09LKSk7Ci0KLSAgLy8gQXBwZW5kIGFuIHplcm8gbGVuZ3RoIGJ1ZmZlciB0byB0cmFuc2l0aW9uIG91dCBvZiB0aGUgZW5kIG9mIHN0cmVhbSBzdGF0ZS4KLSAgQVNTRVJUX1RSVUUoQXBwZW5kRGF0YShOVUxMLCAwKSk7Ci0KLSAgLy8gU2VlayBiYWNrIHRvIDAgYW5kIHZlcmlmeSB0aGF0IEVuZE9mU3RyZWFtKCkgZmFpbHMgYWdhaW4uCi0gIGRlbXV4ZXJfLT5TdGFydFdhaXRpbmdGb3JTZWVrKCk7Ci0gIGRlbXV4ZXJfLT5TZWVrKGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygwKSwKLSAgICAgICAgICAgICAgICAgTmV3RXhwZWN0ZWRTdGF0dXNDQihQSVBFTElORV9PSykpOwotCi0gIEFTU0VSVF9GQUxTRShkZW11eGVyXy0+RW5kT2ZTdHJlYW0oUElQRUxJTkVfT0spKTsKLQotICAvLyBBcHBlbmQgdGhlIG1pc3NpbmcgcmFuZ2UgYW5kIHZlcmlmeSB0aGF0IEVuZE9mU3RyZWFtKCkgc3VjY2VlZHMgbm93LgotICBBU1NFUlRfVFJVRShBcHBlbmREYXRhKHZpZGVvX2lkLCBjbHVzdGVyX3YyLT5kYXRhKCksIGNsdXN0ZXJfdjItPnNpemUoKSkpOwotCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoYXVkaW9faWQsICJ7IFswLDM1KSB9Iik7Ci0gIENoZWNrRXhwZWN0ZWRSYW5nZXModmlkZW9faWQsICJ7IFswLDUwKSB9Iik7Ci0KLSAgQVNTRVJUX1RSVUUoZGVtdXhlcl8tPkVuZE9mU3RyZWFtKFBJUEVMSU5FX09LKSk7Ci19Ci0KLVRFU1RfRihDaHVua0RlbXV4ZXJUZXN0LCBUZXN0RW5kT2ZTdHJlYW1TdGlsbFNldEFmdGVyU2VlaykgewotICBBU1NFUlRfVFJVRShJbml0RGVtdXhlcih0cnVlLCB0cnVlKSk7Ci0KLSAgRVhQRUNUX0NBTEwoaG9zdF8sIFNldER1cmF0aW9uKF8pKQotICAgICAgLlRpbWVzKEFueU51bWJlcigpKTsKLQotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXJfYShrRGVmYXVsdEZpcnN0Q2x1c3RlcigpKTsKLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyX2Ioa0RlZmF1bHRTZWNvbmRDbHVzdGVyKCkpOwotICBiYXNlOjpUaW1lRGVsdGEga0xhc3RBdWRpb1RpbWVzdGFtcCA9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyg5Mik7Ci0gIGJhc2U6OlRpbWVEZWx0YSBrTGFzdFZpZGVvVGltZXN0YW1wID0gYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDk5KTsKLQotICBBU1NFUlRfVFJVRShBcHBlbmREYXRhKGNsdXN0ZXJfYS0+ZGF0YSgpLCBjbHVzdGVyX2EtPnNpemUoKSkpOwotICBBU1NFUlRfVFJVRShBcHBlbmREYXRhKGNsdXN0ZXJfYi0+ZGF0YSgpLCBjbHVzdGVyX2ItPnNpemUoKSkpOwotICBkZW11eGVyXy0+RW5kT2ZTdHJlYW0oUElQRUxJTkVfT0spOwotCi0gIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gYXVkaW8gPQotICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpBVURJTyk7Ci0gIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gdmlkZW8gPQotICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpWSURFTyk7Ci0gIERlbXV4ZXJTdHJlYW06OlN0YXR1cyBzdGF0dXM7Ci0gIGJhc2U6OlRpbWVEZWx0YSBsYXN0X3RpbWVzdGFtcDsKLQotICAvLyBWZXJpZnkgdGhhdCB3ZSBjYW4gcmVhZCBhdWRpbyAmIHZpZGVvIHRvIHRoZSBlbmQgdy9vIHByb2JsZW1zLgotICBSZWFkVW50aWxOb3RPa09yRW5kT2ZTdHJlYW0oYXVkaW8sICZzdGF0dXMsICZsYXN0X3RpbWVzdGFtcCk7Ci0gIEVYUEVDVF9FUShEZW11eGVyU3RyZWFtOjprT2ssIHN0YXR1cyk7Ci0gIEVYUEVDVF9FUShrTGFzdEF1ZGlvVGltZXN0YW1wLCBsYXN0X3RpbWVzdGFtcCk7Ci0KLSAgUmVhZFVudGlsTm90T2tPckVuZE9mU3RyZWFtKHZpZGVvLCAmc3RhdHVzLCAmbGFzdF90aW1lc3RhbXApOwotICBFWFBFQ1RfRVEoRGVtdXhlclN0cmVhbTo6a09rLCBzdGF0dXMpOwotICBFWFBFQ1RfRVEoa0xhc3RWaWRlb1RpbWVzdGFtcCwgbGFzdF90aW1lc3RhbXApOwotCi0gIC8vIFNlZWsgYmFjayB0byAwIGFuZCB2ZXJpZnkgdGhhdCB3ZSBjYW4gcmVhZCB0byB0aGUgZW5kIGFnYWluLi4KLSAgZGVtdXhlcl8tPlN0YXJ0V2FpdGluZ0ZvclNlZWsoKTsKLSAgZGVtdXhlcl8tPlNlZWsoYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDApLAotICAgICAgICAgICAgICAgICBOZXdFeHBlY3RlZFN0YXR1c0NCKFBJUEVMSU5FX09LKSk7Ci0KLSAgUmVhZFVudGlsTm90T2tPckVuZE9mU3RyZWFtKGF1ZGlvLCAmc3RhdHVzLCAmbGFzdF90aW1lc3RhbXApOwotICBFWFBFQ1RfRVEoRGVtdXhlclN0cmVhbTo6a09rLCBzdGF0dXMpOwotICBFWFBFQ1RfRVEoa0xhc3RBdWRpb1RpbWVzdGFtcCwgbGFzdF90aW1lc3RhbXApOwotCi0gIFJlYWRVbnRpbE5vdE9rT3JFbmRPZlN0cmVhbSh2aWRlbywgJnN0YXR1cywgJmxhc3RfdGltZXN0YW1wKTsKLSAgRVhQRUNUX0VRKERlbXV4ZXJTdHJlYW06OmtPaywgc3RhdHVzKTsKLSAgRVhQRUNUX0VRKGtMYXN0VmlkZW9UaW1lc3RhbXAsIGxhc3RfdGltZXN0YW1wKTsKLX0KLQotVEVTVF9GKENodW5rRGVtdXhlclRlc3QsIFRlc3RHZXRCdWZmZXJlZFJhbmdlc0JlZm9yZUluaXRTZWdtZW50KSB7Ci0gIEVYUEVDVF9DQUxMKCp0aGlzLCBEZW11eGVyT3BlbmVkKCkpOwotICBkZW11eGVyXy0+SW5pdGlhbGl6ZSgmaG9zdF8sIENyZWF0ZUluaXREb25lQ0IoUElQRUxJTkVfT0spKTsKLSAgQVNTRVJUX0VRKEFkZElkKCJhdWRpbyIsIHRydWUsIGZhbHNlKSwgQ2h1bmtEZW11eGVyOjprT2spOwotICBBU1NFUlRfRVEoQWRkSWQoInZpZGVvIiwgZmFsc2UsIHRydWUpLCBDaHVua0RlbXV4ZXI6OmtPayk7Ci0KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygiYXVkaW8iLCAieyB9Iik7Ci0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInZpZGVvIiwgInsgfSIpOwotfQotCi0vLyBUZXN0IHRoYXQgU2VlaygpIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkgd2hlbiB0aGUgZmlyc3QgY2x1c3RlcgotLy8gYXJyaXZlcy4KLVRFU1RfRihDaHVua0RlbXV4ZXJUZXN0LCBUZXN0RW5kT2ZTdHJlYW1EdXJpbmdTZWVrKSB7Ci0gIEluU2VxdWVuY2UgczsKLQotICBBU1NFUlRfVFJVRShJbml0RGVtdXhlcih0cnVlLCB0cnVlKSk7Ci0KLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyX2Eoa0RlZmF1bHRGaXJzdENsdXN0ZXIoKSk7Ci0gIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gY2x1c3Rlcl9iKGtEZWZhdWx0U2Vjb25kQ2x1c3RlcigpKTsKLSAgQVNTRVJUX1RSVUUoQXBwZW5kRGF0YShjbHVzdGVyX2EtPmRhdGEoKSwgY2x1c3Rlcl9hLT5zaXplKCkpKTsKLQotICBkZW11eGVyXy0+U3RhcnRXYWl0aW5nRm9yU2VlaygpOwotCi0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEoY2x1c3Rlcl9iLT5kYXRhKCksIGNsdXN0ZXJfYi0+c2l6ZSgpKSk7Ci0gIEVYUEVDVF9DQUxMKGhvc3RfLCBTZXREdXJhdGlvbigKLSAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyhrRGVmYXVsdFNlY29uZENsdXN0ZXJFbmRUaW1lc3RhbXApKSk7Ci0gIGRlbXV4ZXJfLT5FbmRPZlN0cmVhbShQSVBFTElORV9PSyk7Ci0KLSAgZGVtdXhlcl8tPlNlZWsoYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcygwKSwKLSAgICAgICAgICAgICAgICAgTmV3RXhwZWN0ZWRTdGF0dXNDQihQSVBFTElORV9PSykpOwotCi0gIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gYXVkaW8gPQotICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpBVURJTyk7Ci0gIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gdmlkZW8gPQotICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpWSURFTyk7Ci0KLSAgR2VuZXJhdGVFeHBlY3RlZFJlYWRzKDAsIDQsIGF1ZGlvLCB2aWRlbyk7Ci0gIEdlbmVyYXRlRXhwZWN0ZWRSZWFkcyg0NiwgNjYsIDUsIGF1ZGlvLCB2aWRlbyk7Ci0KLSAgRW5kT2ZTdHJlYW1IZWxwZXIgZW5kX29mX3N0cmVhbV9oZWxwZXIoZGVtdXhlcl8pOwotICBlbmRfb2Zfc3RyZWFtX2hlbHBlci5SZXF1ZXN0UmVhZHMoKTsKLSAgZW5kX29mX3N0cmVhbV9oZWxwZXIuQ2hlY2tJZlJlYWREb25lc1dlcmVDYWxsZWQodHJ1ZSk7Ci19Ci0KLVRFU1RfRihDaHVua0RlbXV4ZXJUZXN0LCBUZXN0Q29uZmlnQ2hhbmdlX1ZpZGVvKSB7Ci0gIEluU2VxdWVuY2UgczsKLQotICBBU1NFUlRfVFJVRShJbml0RGVtdXhlcldpdGhDb25maWdDaGFuZ2VEYXRhKCkpOwotCi0gIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gc3RyZWFtID0KLSAgICAgIGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6VklERU8pOwotICBEZW11eGVyU3RyZWFtOjpTdGF0dXMgc3RhdHVzOwotICBiYXNlOjpUaW1lRGVsdGEgbGFzdF90aW1lc3RhbXA7Ci0KLSAgLy8gRmV0Y2ggaW5pdGlhbCB2aWRlbyBjb25maWcgYW5kIHZlcmlmeSBpdCBtYXRjaGVzIHdoYXQgd2UgZXhwZWN0LgotICBjb25zdCBWaWRlb0RlY29kZXJDb25maWcmIHZpZGVvX2NvbmZpZ18xID0gc3RyZWFtLT52aWRlb19kZWNvZGVyX2NvbmZpZygpOwotICBBU1NFUlRfVFJVRSh2aWRlb19jb25maWdfMS5Jc1ZhbGlkQ29uZmlnKCkpOwotICBFWFBFQ1RfRVEodmlkZW9fY29uZmlnXzEubmF0dXJhbF9zaXplKCkud2lkdGgoKSwgMzIwKTsKLSAgRVhQRUNUX0VRKHZpZGVvX2NvbmZpZ18xLm5hdHVyYWxfc2l6ZSgpLmhlaWdodCgpLCAyNDApOwotCi0gIEV4cGVjdFJlYWQoc3RyZWFtLCAwKTsKLQotICBSZWFkVW50aWxOb3RPa09yRW5kT2ZTdHJlYW0oc3RyZWFtLCAmc3RhdHVzLCAmbGFzdF90aW1lc3RhbXApOwotCi0gIEFTU0VSVF9FUShzdGF0dXMsIERlbXV4ZXJTdHJlYW06OmtDb25maWdDaGFuZ2VkKTsKLSAgRVhQRUNUX0VRKGxhc3RfdGltZXN0YW1wLkluTWlsbGlzZWNvbmRzKCksIDUwMSk7Ci0KLSAgLy8gRmV0Y2ggdGhlIG5ldyBkZWNvZGVyIGNvbmZpZy4KLSAgY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiB2aWRlb19jb25maWdfMiA9IHN0cmVhbS0+dmlkZW9fZGVjb2Rlcl9jb25maWcoKTsKLSAgQVNTRVJUX1RSVUUodmlkZW9fY29uZmlnXzIuSXNWYWxpZENvbmZpZygpKTsKLSAgRVhQRUNUX0VRKHZpZGVvX2NvbmZpZ18yLm5hdHVyYWxfc2l6ZSgpLndpZHRoKCksIDY0MCk7Ci0gIEVYUEVDVF9FUSh2aWRlb19jb25maWdfMi5uYXR1cmFsX3NpemUoKS5oZWlnaHQoKSwgMzYwKTsKLQotICBFeHBlY3RSZWFkKHN0cmVhbSwgNTI3KTsKLQotICAvLyBSZWFkIHVudGlsIHRoZSBuZXh0IGNvbmZpZyBjaGFuZ2UuCi0gIFJlYWRVbnRpbE5vdE9rT3JFbmRPZlN0cmVhbShzdHJlYW0sICZzdGF0dXMsICZsYXN0X3RpbWVzdGFtcCk7Ci0gIEFTU0VSVF9FUShzdGF0dXMsIERlbXV4ZXJTdHJlYW06OmtDb25maWdDaGFuZ2VkKTsKLSAgRVhQRUNUX0VRKGxhc3RfdGltZXN0YW1wLkluTWlsbGlzZWNvbmRzKCksIDc5Myk7Ci0KLSAgLy8gR2V0IHRoZSBuZXcgY29uZmlnIGFuZCB2ZXJpZnkgdGhhdCBpdCBtYXRjaGVzIHRoZSBmaXJzdCBvbmUuCi0gIEFTU0VSVF9UUlVFKHZpZGVvX2NvbmZpZ18xLk1hdGNoZXMoc3RyZWFtLT52aWRlb19kZWNvZGVyX2NvbmZpZygpKSk7Ci0KLSAgRXhwZWN0UmVhZChzdHJlYW0sIDgwMSk7Ci0KLSAgLy8gUmVhZCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0ganVzdCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlbid0IGFueSBvdGhlcgotICAvLyBjb25maWcgY2hhbmdlcy4KLSAgUmVhZFVudGlsTm90T2tPckVuZE9mU3RyZWFtKHN0cmVhbSwgJnN0YXR1cywgJmxhc3RfdGltZXN0YW1wKTsKLSAgQVNTRVJUX0VRKHN0YXR1cywgRGVtdXhlclN0cmVhbTo6a09rKTsKLX0KLQotVEVTVF9GKENodW5rRGVtdXhlclRlc3QsIFRlc3RDb25maWdDaGFuZ2VfQXVkaW8pIHsKLSAgSW5TZXF1ZW5jZSBzOwotCi0gIEFTU0VSVF9UUlVFKEluaXREZW11eGVyV2l0aENvbmZpZ0NoYW5nZURhdGEoKSk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiBzdHJlYW0gPQotICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpBVURJTyk7Ci0gIERlbXV4ZXJTdHJlYW06OlN0YXR1cyBzdGF0dXM7Ci0gIGJhc2U6OlRpbWVEZWx0YSBsYXN0X3RpbWVzdGFtcDsKLQotICAvLyBGZXRjaCBpbml0aWFsIGF1ZGlvIGNvbmZpZyBhbmQgdmVyaWZ5IGl0IG1hdGNoZXMgd2hhdCB3ZSBleHBlY3QuCi0gIGNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYgYXVkaW9fY29uZmlnXzEgPSBzdHJlYW0tPmF1ZGlvX2RlY29kZXJfY29uZmlnKCk7Ci0gIEFTU0VSVF9UUlVFKGF1ZGlvX2NvbmZpZ18xLklzVmFsaWRDb25maWcoKSk7Ci0gIEVYUEVDVF9FUShhdWRpb19jb25maWdfMS5zYW1wbGVzX3Blcl9zZWNvbmQoKSwgNDQxMDApOwotICBFWFBFQ1RfRVEoYXVkaW9fY29uZmlnXzEuZXh0cmFfZGF0YV9zaXplKCksIDM4NjN1KTsKLQotICBFeHBlY3RSZWFkKHN0cmVhbSwgMCk7Ci0KLSAgUmVhZFVudGlsTm90T2tPckVuZE9mU3RyZWFtKHN0cmVhbSwgJnN0YXR1cywgJmxhc3RfdGltZXN0YW1wKTsKLQotICBBU1NFUlRfRVEoc3RhdHVzLCBEZW11eGVyU3RyZWFtOjprQ29uZmlnQ2hhbmdlZCk7Ci0gIEVYUEVDVF9FUShsYXN0X3RpbWVzdGFtcC5Jbk1pbGxpc2Vjb25kcygpLCA1MjQpOwotCi0gIC8vIEZldGNoIHRoZSBuZXcgZGVjb2RlciBjb25maWcuCi0gIGNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYgYXVkaW9fY29uZmlnXzIgPSBzdHJlYW0tPmF1ZGlvX2RlY29kZXJfY29uZmlnKCk7Ci0gIEFTU0VSVF9UUlVFKGF1ZGlvX2NvbmZpZ18yLklzVmFsaWRDb25maWcoKSk7Ci0gIEVYUEVDVF9FUShhdWRpb19jb25maWdfMi5zYW1wbGVzX3Blcl9zZWNvbmQoKSwgNDQxMDApOwotICBFWFBFQ1RfRVEoYXVkaW9fY29uZmlnXzIuZXh0cmFfZGF0YV9zaXplKCksIDM5MzV1KTsKLQotICBFeHBlY3RSZWFkKHN0cmVhbSwgNTI3KTsKLQotICAvLyBSZWFkIHVudGlsIHRoZSBuZXh0IGNvbmZpZyBjaGFuZ2UuCi0gIFJlYWRVbnRpbE5vdE9rT3JFbmRPZlN0cmVhbShzdHJlYW0sICZzdGF0dXMsICZsYXN0X3RpbWVzdGFtcCk7Ci0gIEFTU0VSVF9FUShzdGF0dXMsIERlbXV4ZXJTdHJlYW06OmtDb25maWdDaGFuZ2VkKTsKLSAgRVhQRUNUX0VRKGxhc3RfdGltZXN0YW1wLkluTWlsbGlzZWNvbmRzKCksIDc1OSk7Ci0KLSAgLy8gR2V0IHRoZSBuZXcgY29uZmlnIGFuZCB2ZXJpZnkgdGhhdCBpdCBtYXRjaGVzIHRoZSBmaXJzdCBvbmUuCi0gIEFTU0VSVF9UUlVFKGF1ZGlvX2NvbmZpZ18xLk1hdGNoZXMoc3RyZWFtLT5hdWRpb19kZWNvZGVyX2NvbmZpZygpKSk7Ci0KLSAgRXhwZWN0UmVhZChzdHJlYW0sIDc3OSk7Ci0KLSAgLy8gUmVhZCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0ganVzdCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlbid0IGFueSBvdGhlcgotICAvLyBjb25maWcgY2hhbmdlcy4KLSAgUmVhZFVudGlsTm90T2tPckVuZE9mU3RyZWFtKHN0cmVhbSwgJnN0YXR1cywgJmxhc3RfdGltZXN0YW1wKTsKLSAgQVNTRVJUX0VRKHN0YXR1cywgRGVtdXhlclN0cmVhbTo6a09rKTsKLX0KLQotVEVTVF9GKENodW5rRGVtdXhlclRlc3QsIFRlc3RDb25maWdDaGFuZ2VfU2VlaykgewotICBJblNlcXVlbmNlIHM7Ci0KLSAgQVNTRVJUX1RSVUUoSW5pdERlbXV4ZXJXaXRoQ29uZmlnQ2hhbmdlRGF0YSgpKTsKLQotICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IHN0cmVhbSA9Ci0gICAgICBkZW11eGVyXy0+R2V0U3RyZWFtKERlbXV4ZXJTdHJlYW06OlZJREVPKTsKLQotICAvLyBGZXRjaCBpbml0aWFsIHZpZGVvIGNvbmZpZyBhbmQgdmVyaWZ5IGl0IG1hdGNoZXMgd2hhdCB3ZSBleHBlY3QuCi0gIGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgdmlkZW9fY29uZmlnXzEgPSBzdHJlYW0tPnZpZGVvX2RlY29kZXJfY29uZmlnKCk7Ci0gIEFTU0VSVF9UUlVFKHZpZGVvX2NvbmZpZ18xLklzVmFsaWRDb25maWcoKSk7Ci0gIEVYUEVDVF9FUSh2aWRlb19jb25maWdfMS5uYXR1cmFsX3NpemUoKS53aWR0aCgpLCAzMjApOwotICBFWFBFQ1RfRVEodmlkZW9fY29uZmlnXzEubmF0dXJhbF9zaXplKCkuaGVpZ2h0KCksIDI0MCk7Ci0KLSAgRXhwZWN0UmVhZChzdHJlYW0sIDApOwotCi0gIC8vIFNlZWsgdG8gYSBsb2NhdGlvbiB3aXRoIGEgZGlmZmVyZW50IGNvbmZpZy4KLSAgZGVtdXhlcl8tPlNlZWsoYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDUyNyksCi0gICAgICAgICAgICAgICAgIE5ld0V4cGVjdGVkU3RhdHVzQ0IoUElQRUxJTkVfT0spKTsKLQotICAvLyBWZXJpZnkgdGhhdCB0aGUgY29uZmlnIGNoYW5nZSBpcyBzaWduYWxsZWQuCi0gIEV4cGVjdENvbmZpZ0NoYW5nZWQoc3RyZWFtKTsKLQotICAvLyBGZXRjaCB0aGUgbmV3IGRlY29kZXIgY29uZmlnIGFuZCB2ZXJpZnkgaXQgaXMgd2hhdCB3ZSBleHBlY3QuCi0gIGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgdmlkZW9fY29uZmlnXzIgPSBzdHJlYW0tPnZpZGVvX2RlY29kZXJfY29uZmlnKCk7Ci0gIEFTU0VSVF9UUlVFKHZpZGVvX2NvbmZpZ18yLklzVmFsaWRDb25maWcoKSk7Ci0gIEVYUEVDVF9FUSh2aWRlb19jb25maWdfMi5uYXR1cmFsX3NpemUoKS53aWR0aCgpLCA2NDApOwotICBFWFBFQ1RfRVEodmlkZW9fY29uZmlnXzIubmF0dXJhbF9zaXplKCkuaGVpZ2h0KCksIDM2MCk7Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgUmVhZCgpIHdpbGwgcmV0dXJuIGEgYnVmZmVyIG5vdy4KLSAgRXhwZWN0UmVhZChzdHJlYW0sIDUyNyk7Ci0KLSAgLy8gU2VlayBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgYW5kIHZlcmlmeSB3ZSBnZXQgYW5vdGhlciBjb25maWcgY2hhbmdlLgotICBkZW11eGVyXy0+U2VlayhiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMCksCi0gICAgICAgICAgICAgICAgIE5ld0V4cGVjdGVkU3RhdHVzQ0IoUElQRUxJTkVfT0spKTsKLSAgRXhwZWN0Q29uZmlnQ2hhbmdlZChzdHJlYW0pOwotICBBU1NFUlRfVFJVRSh2aWRlb19jb25maWdfMS5NYXRjaGVzKHN0cmVhbS0+dmlkZW9fZGVjb2Rlcl9jb25maWcoKSkpOwotICBFeHBlY3RSZWFkKHN0cmVhbSwgMCk7Ci0KLSAgLy8gU2VlayB0byBhIGxvY2F0aW9uIHRoYXQgcmVxdWlyZXMgYSBjb25maWcgY2hhbmdlIGFuZCB0aGVuCi0gIC8vIHNlZWsgdG8gYSBuZXcgbG9jYXRpb24gdGhhdCBoYXMgdGhlIHNhbWUgY29uZmlndXJhdGlvbiBhcwotICAvLyB0aGUgc3RhcnQgb2YgdGhlIGZpbGUgd2l0aG91dCBhIFJlYWQoKSBpbiB0aGUgbWlkZGxlLgotICBkZW11eGVyXy0+U2VlayhiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoNTI3KSwKLSAgICAgICAgICAgICAgICAgTmV3RXhwZWN0ZWRTdGF0dXNDQihQSVBFTElORV9PSykpOwotICBkZW11eGVyXy0+U2VlayhiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoODAxKSwKLSAgICAgICAgICAgICAgICAgTmV3RXhwZWN0ZWRTdGF0dXNDQihQSVBFTElORV9PSykpOwotCi0gIC8vIFZlcmlmeSB0aGF0IG5vIGNvbmZpZyBjaGFuZ2UgaXMgc2lnbmFsbGVkLgotICBFeHBlY3RSZWFkKHN0cmVhbSwgODAxKTsKLSAgQVNTRVJUX1RSVUUodmlkZW9fY29uZmlnXzEuTWF0Y2hlcyhzdHJlYW0tPnZpZGVvX2RlY29kZXJfY29uZmlnKCkpKTsKLX0KLQotVEVTVF9GKENodW5rRGVtdXhlclRlc3QsIFRlc3RUaW1lc3RhbXBQb3NpdGl2ZU9mZnNldCkgewotICBBU1NFUlRfVFJVRShJbml0RGVtdXhlcih0cnVlLCB0cnVlKSk7Ci0KLSAgQVNTRVJUX1RSVUUoZGVtdXhlcl8tPlNldFRpbWVzdGFtcE9mZnNldCgKLSAgICAgIGtTb3VyY2VJZCwgYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcygzMCkpKTsKLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyKEdlbmVyYXRlQ2x1c3RlcigwLCAyKSk7Ci0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEoY2x1c3Rlci0+ZGF0YSgpLCBjbHVzdGVyLT5zaXplKCkpKTsKLQotICBkZW11eGVyXy0+U3RhcnRXYWl0aW5nRm9yU2VlaygpOwotICBkZW11eGVyXy0+U2VlayhiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMzAwMDApLAotICAgICAgICAgICAgICAgICBOZXdFeHBlY3RlZFN0YXR1c0NCKFBJUEVMSU5FX09LKSk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiBhdWRpbyA9Ci0gICAgICBkZW11eGVyXy0+R2V0U3RyZWFtKERlbXV4ZXJTdHJlYW06OkFVRElPKTsKLSAgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiB2aWRlbyA9Ci0gICAgICBkZW11eGVyXy0+R2V0U3RyZWFtKERlbXV4ZXJTdHJlYW06OlZJREVPKTsKLSAgR2VuZXJhdGVFeHBlY3RlZFJlYWRzKDMwMDAwLCAyLCBhdWRpbywgdmlkZW8pOwotfQotCi1URVNUX0YoQ2h1bmtEZW11eGVyVGVzdCwgVGVzdFRpbWVzdGFtcE5lZ2F0aXZlT2Zmc2V0KSB7Ci0gIEFTU0VSVF9UUlVFKEluaXREZW11eGVyKHRydWUsIHRydWUpKTsKLQotICBBU1NFUlRfVFJVRShkZW11eGVyXy0+U2V0VGltZXN0YW1wT2Zmc2V0KAotICAgICAga1NvdXJjZUlkLCBiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKC0xKSkpOwotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXIgPSBHZW5lcmF0ZUNsdXN0ZXIoMTAwMCwgMik7Ci0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEoY2x1c3Rlci0+ZGF0YSgpLCBjbHVzdGVyLT5zaXplKCkpKTsKLQotICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IGF1ZGlvID0KLSAgICAgIGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6QVVESU8pOwotICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IHZpZGVvID0KLSAgICAgIGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6VklERU8pOwotICBHZW5lcmF0ZUV4cGVjdGVkUmVhZHMoMCwgMiwgYXVkaW8sIHZpZGVvKTsKLX0KLQotVEVTVF9GKENodW5rRGVtdXhlclRlc3QsIFRlc3RUaW1lc3RhbXBPZmZzZXRTZXBhcmF0ZVN0cmVhbXMpIHsKLSAgc3RkOjpzdHJpbmcgYXVkaW9faWQgPSAiYXVkaW8xIjsKLSAgc3RkOjpzdHJpbmcgdmlkZW9faWQgPSAidmlkZW8xIjsKLSAgQVNTRVJUX1RSVUUoSW5pdERlbXV4ZXJBdWRpb0FuZFZpZGVvU291cmNlcyhhdWRpb19pZCwgdmlkZW9faWQpKTsKLQotICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IGF1ZGlvID0KLSAgICAgIGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6QVVESU8pOwotICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IHZpZGVvID0KLSAgICAgIGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6VklERU8pOwotCi0gIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gY2x1c3Rlcl9hMSgKLSAgICAgIEdlbmVyYXRlU2luZ2xlU3RyZWFtQ2x1c3RlcigKLSAgICAgICAgICAyNTAwLCAyNTAwICsga0F1ZGlvQmxvY2tEdXJhdGlvbiAqIDQsIGtBdWRpb1RyYWNrTnVtLAotICAgICAgICAgIGtBdWRpb0Jsb2NrRHVyYXRpb24pKTsKLQotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXJfdjEoCi0gICAgICBHZW5lcmF0ZVNpbmdsZVN0cmVhbUNsdXN0ZXIoCi0gICAgICAgICAgMjUwMCwgMjUwMCArIGtWaWRlb0Jsb2NrRHVyYXRpb24gKiA0LCBrVmlkZW9UcmFja051bSwKLSAgICAgICAgICBrVmlkZW9CbG9ja0R1cmF0aW9uKSk7Ci0KLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBjbHVzdGVyX2EyKAotICAgICAgR2VuZXJhdGVTaW5nbGVTdHJlYW1DbHVzdGVyKAotICAgICAgICAgIDAsIGtBdWRpb0Jsb2NrRHVyYXRpb24gKiA0LCBrQXVkaW9UcmFja051bSwga0F1ZGlvQmxvY2tEdXJhdGlvbikpOwotCi0gIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gY2x1c3Rlcl92MigKLSAgICAgIEdlbmVyYXRlU2luZ2xlU3RyZWFtQ2x1c3RlcigKLSAgICAgICAgICAwLCBrVmlkZW9CbG9ja0R1cmF0aW9uICogNCwga1ZpZGVvVHJhY2tOdW0sIGtWaWRlb0Jsb2NrRHVyYXRpb24pKTsKLQotICBBU1NFUlRfVFJVRShkZW11eGVyXy0+U2V0VGltZXN0YW1wT2Zmc2V0KAotICAgICAgYXVkaW9faWQsIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygtMjUwMCkpKTsKLSAgQVNTRVJUX1RSVUUoZGVtdXhlcl8tPlNldFRpbWVzdGFtcE9mZnNldCgKLSAgICAgIHZpZGVvX2lkLCBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoLTI1MDApKSk7Ci0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEoYXVkaW9faWQsIGNsdXN0ZXJfYTEtPmRhdGEoKSwgY2x1c3Rlcl9hMS0+c2l6ZSgpKSk7Ci0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEodmlkZW9faWQsIGNsdXN0ZXJfdjEtPmRhdGEoKSwgY2x1c3Rlcl92MS0+c2l6ZSgpKSk7Ci0gIEdlbmVyYXRlU2luZ2xlU3RyZWFtRXhwZWN0ZWRSZWFkcygwLCA0LCBhdWRpbywga0F1ZGlvQmxvY2tEdXJhdGlvbik7Ci0gIEdlbmVyYXRlU2luZ2xlU3RyZWFtRXhwZWN0ZWRSZWFkcygwLCA0LCB2aWRlbywga1ZpZGVvQmxvY2tEdXJhdGlvbik7Ci0KLSAgZGVtdXhlcl8tPlN0YXJ0V2FpdGluZ0ZvclNlZWsoKTsKLSAgZGVtdXhlcl8tPlNlZWsoYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDI3MzAwKSwKLSAgICAgICAgICAgICAgICAgTmV3RXhwZWN0ZWRTdGF0dXNDQihQSVBFTElORV9PSykpOwotCi0gIEFTU0VSVF9UUlVFKGRlbXV4ZXJfLT5TZXRUaW1lc3RhbXBPZmZzZXQoCi0gICAgICBhdWRpb19pZCwgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDI3MzAwKSkpOwotICBBU1NFUlRfVFJVRShkZW11eGVyXy0+U2V0VGltZXN0YW1wT2Zmc2V0KAotICAgICAgdmlkZW9faWQsIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygyNzMwMCkpKTsKLSAgQVNTRVJUX1RSVUUoQXBwZW5kRGF0YShhdWRpb19pZCwgY2x1c3Rlcl9hMi0+ZGF0YSgpLCBjbHVzdGVyX2EyLT5zaXplKCkpKTsKLSAgQVNTRVJUX1RSVUUoQXBwZW5kRGF0YSh2aWRlb19pZCwgY2x1c3Rlcl92Mi0+ZGF0YSgpLCBjbHVzdGVyX3YyLT5zaXplKCkpKTsKLSAgR2VuZXJhdGVTaW5nbGVTdHJlYW1FeHBlY3RlZFJlYWRzKDI3MzAwLCA0LCB2aWRlbywga1ZpZGVvQmxvY2tEdXJhdGlvbik7Ci0gIEdlbmVyYXRlU2luZ2xlU3RyZWFtRXhwZWN0ZWRSZWFkcygyNzMwMCwgNCwgYXVkaW8sIGtBdWRpb0Jsb2NrRHVyYXRpb24pOwotfQotCi1URVNUX0YoQ2h1bmtEZW11eGVyVGVzdCwgVGVzdFRpbWVzdGFtcE9mZnNldE1pZFBhcnNlKSB7Ci0gIEFTU0VSVF9UUlVFKEluaXREZW11eGVyKHRydWUsIHRydWUpKTsKLQotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXIgPSBHZW5lcmF0ZUNsdXN0ZXIoMCwgMik7Ci0gIC8vIEFwcGVuZCBvbmx5IHBhcnQgb2YgdGhlIGNsdXN0ZXIgZGF0YS4KLSAgQVNTRVJUX1RSVUUoQXBwZW5kRGF0YShjbHVzdGVyLT5kYXRhKCksIGNsdXN0ZXItPnNpemUoKSAtIDEzKSk7Ci0KLSAgLy8gU2V0dGluZyBhIHRpbWVzdGFtcCBzaG91bGQgZmFpbCBiZWNhdXNlIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSBjbHVzdGVyLgotICBBU1NFUlRfRkFMU0UoZGVtdXhlcl8tPlNldFRpbWVzdGFtcE9mZnNldCgKLSAgICAgIGtTb3VyY2VJZCwgYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcygyNSkpKTsKLQotICBkZW11eGVyXy0+QWJvcnQoa1NvdXJjZUlkKTsKLSAgLy8gQWZ0ZXIgQWJvcnQoKSwgc2V0dGluZyBhIHRpbWVzdGFtcCBzaG91bGQgc3VjY2VlZCBzaW5jZSB3ZSdyZSBubyBsb25nZXIKLSAgLy8gaW4gdGhlIG1pZGRsZSBvZiBhIGNsdXN0ZXIKLSAgQVNTRVJUX1RSVUUoZGVtdXhlcl8tPlNldFRpbWVzdGFtcE9mZnNldCgKLSAgICAgIGtTb3VyY2VJZCwgYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcygyNSkpKTsKLX0KLQotVEVTVF9GKENodW5rRGVtdXhlclRlc3QsIFRlc3REdXJhdGlvbkNoYW5nZSkgewotICBBU1NFUlRfVFJVRShJbml0RGVtdXhlcih0cnVlLCB0cnVlKSk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1N0cmVhbUR1cmF0aW9uID0ga0RlZmF1bHREdXJhdGlvbigpLkluTWlsbGlzZWNvbmRzKCk7Ci0KLSAgLy8gQWRkIGRhdGEgbGVhZGluZyB1cCB0byB0aGUgY3VycmVudGx5IHNldCBkdXJhdGlvbi4KLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiBmaXJzdF9jbHVzdGVyID0gR2VuZXJhdGVDbHVzdGVyKAotICAgICAga1N0cmVhbUR1cmF0aW9uIC0ga0F1ZGlvQmxvY2tEdXJhdGlvbiwKLSAgICAgIGtTdHJlYW1EdXJhdGlvbiAtIGtWaWRlb0Jsb2NrRHVyYXRpb24sIDIpOwotICBBU1NFUlRfVFJVRShBcHBlbmREYXRhKGZpcnN0X2NsdXN0ZXItPmRhdGEoKSwgZmlyc3RfY2x1c3Rlci0+c2l6ZSgpKSk7Ci0KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcyhrU291cmNlSWQsICJ7IFsyMDExOTEsMjAxMjI0KSB9Iik7Ci0KLSAgLy8gQWRkIGRhdGEgYXQgdGhlIGN1cnJlbnRseSBzZXQgZHVyYXRpb24uIFRoZSBkdXJhdGlvbiBzaG91bGQgbm90IGluY3JlYXNlLgotICBzY29wZWRfcHRyPENsdXN0ZXI+IHNlY29uZF9jbHVzdGVyID0gR2VuZXJhdGVDbHVzdGVyKAotICAgICAga0RlZmF1bHREdXJhdGlvbigpLkluTWlsbGlzZWNvbmRzKCksIDIpOwotICBBU1NFUlRfVFJVRShBcHBlbmREYXRhKHNlY29uZF9jbHVzdGVyLT5kYXRhKCksIHNlY29uZF9jbHVzdGVyLT5zaXplKCkpKTsKLQotICAvLyBSYW5nZSBzaG91bGQgbm90IGJlIGFmZmVjdGVkLgotICBDaGVja0V4cGVjdGVkUmFuZ2VzKGtTb3VyY2VJZCwgInsgWzIwMTE5MSwyMDEyMjQpIH0iKTsKLQotICAvLyBOb3cgYWRkIGRhdGEgcGFzdCB0aGUgZHVyYXRpb24gYW5kIGV4cGVjdCBhIG5ldyBkdXJhdGlvbiB0byBiZSBzaWduYWxsZWQuCi0gIHN0YXRpYyBjb25zdCBpbnQga05ld1N0cmVhbUR1cmF0aW9uID0KLSAgICAgIGtTdHJlYW1EdXJhdGlvbiArIGtBdWRpb0Jsb2NrRHVyYXRpb24gKiAyOwotICBzY29wZWRfcHRyPENsdXN0ZXI+IHRoaXJkX2NsdXN0ZXIgPSBHZW5lcmF0ZUNsdXN0ZXIoCi0gICAgICBrU3RyZWFtRHVyYXRpb24gKyBrQXVkaW9CbG9ja0R1cmF0aW9uLAotICAgICAga1N0cmVhbUR1cmF0aW9uICsga1ZpZGVvQmxvY2tEdXJhdGlvbiwgMik7Ci0gIEVYUEVDVF9DQUxMKGhvc3RfLCBTZXREdXJhdGlvbigKLSAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyhrTmV3U3RyZWFtRHVyYXRpb24pKSk7Ci0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEodGhpcmRfY2x1c3Rlci0+ZGF0YSgpLCB0aGlyZF9jbHVzdGVyLT5zaXplKCkpKTsKLQotICAvLyBTZWUgdGhhdCB0aGUgcmFuZ2UgaGFzIGluY3JlYXNlZCBhcHByb3ByaWF0ZWx5LgotICBDaGVja0V4cGVjdGVkUmFuZ2VzKGtTb3VyY2VJZCwgInsgWzIwMTE5MSwyMDEyNzApIH0iKTsKLX0KLQotVEVTVF9GKENodW5rRGVtdXhlclRlc3QsIFRlc3REdXJhdGlvbkNoYW5nZVRpbWVzdGFtcE9mZnNldCkgewotICBBU1NFUlRfVFJVRShJbml0RGVtdXhlcih0cnVlLCB0cnVlKSk7Ci0KLSAgQVNTRVJUX1RSVUUoZGVtdXhlcl8tPlNldFRpbWVzdGFtcE9mZnNldChrU291cmNlSWQsIGtEZWZhdWx0RHVyYXRpb24oKSkpOwotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXIgPSBHZW5lcmF0ZUNsdXN0ZXIoMCwgNCk7Ci0KLSAgRVhQRUNUX0NBTEwoaG9zdF8sIFNldER1cmF0aW9uKAotICAgICAga0RlZmF1bHREdXJhdGlvbigpICsgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKAotICAgICAgICAgIGtBdWRpb0Jsb2NrRHVyYXRpb24gKiAyKSkpOwotICBBU1NFUlRfVFJVRShBcHBlbmREYXRhKGNsdXN0ZXItPmRhdGEoKSwgY2x1c3Rlci0+c2l6ZSgpKSk7Ci19Ci0KLVRFU1RfRihDaHVua0RlbXV4ZXJUZXN0LCBUZXN0RW5kT2ZTdHJlYW1UcnVuY2F0ZUR1cmF0aW9uKSB7Ci0gIEFTU0VSVF9UUlVFKEluaXREZW11eGVyKHRydWUsIHRydWUpKTsKLQotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXJfYShrRGVmYXVsdEZpcnN0Q2x1c3RlcigpKTsKLSAgQVNTRVJUX1RSVUUoQXBwZW5kRGF0YShjbHVzdGVyX2EtPmRhdGEoKSwgY2x1c3Rlcl9hLT5zaXplKCkpKTsKLQotICBFWFBFQ1RfQ0FMTChob3N0XywgU2V0RHVyYXRpb24oCi0gICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoa0RlZmF1bHRGaXJzdENsdXN0ZXJFbmRUaW1lc3RhbXApKSk7Ci0gIGRlbXV4ZXJfLT5FbmRPZlN0cmVhbShQSVBFTElORV9PSyk7Ci19Ci0KLQotVEVTVF9GKENodW5rRGVtdXhlclRlc3QsIFRlc3RaZXJvTGVuZ3RoQXBwZW5kKSB7Ci0gIEFTU0VSVF9UUlVFKEluaXREZW11eGVyKHRydWUsIHRydWUpKTsKLSAgQVNTRVJUX1RSVUUoQXBwZW5kRGF0YShOVUxMLCAwKSk7Ci19Ci0KLVRFU1RfRihDaHVua0RlbXV4ZXJUZXN0LCBUZXN0QXBwZW5kQWZ0ZXJFbmRPZlN0cmVhbSkgewotICBBU1NFUlRfVFJVRShJbml0RGVtdXhlcih0cnVlLCB0cnVlKSk7Ci0KLSAgRVhQRUNUX0NBTEwoaG9zdF8sIFNldER1cmF0aW9uKF8pKQotICAgICAgLlRpbWVzKEFueU51bWJlcigpKTsKLQotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXJfYShrRGVmYXVsdEZpcnN0Q2x1c3RlcigpKTsKLSAgQVNTRVJUX1RSVUUoQXBwZW5kRGF0YShjbHVzdGVyX2EtPmRhdGEoKSwgY2x1c3Rlcl9hLT5zaXplKCkpKTsKLSAgZGVtdXhlcl8tPkVuZE9mU3RyZWFtKFBJUEVMSU5FX09LKTsKLQotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXJfYihrRGVmYXVsdFNlY29uZENsdXN0ZXIoKSk7Ci0gIEFTU0VSVF9UUlVFKEFwcGVuZERhdGEoY2x1c3Rlcl9iLT5kYXRhKCksIGNsdXN0ZXJfYi0+c2l6ZSgpKSk7Ci0gIGRlbXV4ZXJfLT5FbmRPZlN0cmVhbShQSVBFTElORV9PSyk7Ci19Ci0KLS8vIFRlc3QgcmVjZWl2aW5nIGEgU2h1dGRvd24oKSBjYWxsIGJlZm9yZSB3ZSBnZXQgYW4gSW5pdGlhbGl6ZSgpCi0vLyBjYWxsLiBUaGlzIGNhbiBoYXBwZW4gaWYgdmlkZW8gZWxlbWVudCBnZXRzIGRlc3Ryb3llZCBiZWZvcmUKLS8vIHRoZSBwaXBlbGluZSBoYXMgYSBjaGFuY2UgdG8gaW5pdGlhbGl6ZSB0aGUgZGVtdXhlci4KLVRFU1RfRihDaHVua0RlbXV4ZXJUZXN0LCBUZXN0U2h1dGRvd25CZWZvcmVJbml0aWFsaXplKSB7Ci0gIGRlbXV4ZXJfLT5TaHV0ZG93bigpOwotICBkZW11eGVyXy0+SW5pdGlhbGl6ZSgKLSAgICAgICZob3N0XywgQ3JlYXRlSW5pdERvbmVDQihERU1VWEVSX0VSUk9SX0NPVUxEX05PVF9PUEVOKSk7Ci0gIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvZGVjcnlwdGluZ19hdWRpb19kZWNvZGVyLmNjIGIvc3JjL21lZGlhL2ZpbHRlcnMvZGVjcnlwdGluZ19hdWRpb19kZWNvZGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTk2NGMyLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL2RlY3J5cHRpbmdfYXVkaW9fZGVjb2Rlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDUwMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9kZWNyeXB0aW5nX2F1ZGlvX2RlY29kZXIuaCIKLQotI2luY2x1ZGUgPGNzdGRsaWI+Ci0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJiYXNlL2xvY2F0aW9uLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3BfcHJveHkuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9iaW5kX3RvX2xvb3AuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2J1ZmZlcnMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RhdGFfYnVmZmVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNyeXB0b3IuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlbXV4ZXJfc3RyZWFtLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9waXBlbGluZS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXIuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotI2RlZmluZSBCSU5EX1RPX0xPT1AoZnVuY3Rpb24pIFwKLSAgICBtZWRpYTo6QmluZFRvTG9vcChtZXNzYWdlX2xvb3BfLCBiYXNlOjpCaW5kKGZ1bmN0aW9uLCB0aGlzKSkKLQotc3RhdGljIGlubGluZSBib29sIElzT3V0T2ZTeW5jKGNvbnN0IGJhc2U6OlRpbWVEZWx0YSYgdGltZXN0YW1wXzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6VGltZURlbHRhJiB0aW1lc3RhbXBfMikgewotICAvLyBPdXQgb2Ygc3luYyBvZiAxMDBtcyB3b3VsZCBiZSBwcmV0dHkgbm90aWNlYWJsZSBhbmQgd2Ugc2hvdWxkIGtlZXAgYW55Ci0gIC8vIGRyaWZ0IGJlbG93IHRoYXQuCi0gIGNvbnN0IGludDY0IGtPdXRPZlN5bmNUaHJlc2hvbGRJbk1pY3Jvc2Vjb25kcyA9IDEwMDAwMDsKLSAgcmV0dXJuIHN0ZDo6YWJzKHRpbWVzdGFtcF8xLkluTWljcm9zZWNvbmRzKCkgLSB0aW1lc3RhbXBfMi5Jbk1pY3Jvc2Vjb25kcygpKSA+Ci0gICAgICAgICBrT3V0T2ZTeW5jVGhyZXNob2xkSW5NaWNyb3NlY29uZHM7Ci19Ci0KLURlY3J5cHRpbmdBdWRpb0RlY29kZXI6OkRlY3J5cHRpbmdBdWRpb0RlY29kZXIoCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbWVzc2FnZV9sb29wLAotICAgIGNvbnN0IFNldERlY3J5cHRvclJlYWR5Q0ImIHNldF9kZWNyeXB0b3JfcmVhZHlfY2IpCi0gICAgOiBtZXNzYWdlX2xvb3BfKG1lc3NhZ2VfbG9vcCksCi0gICAgICBzdGF0ZV8oa1VuaW5pdGlhbGl6ZWQpLAotICAgICAgc2V0X2RlY3J5cHRvcl9yZWFkeV9jYl8oc2V0X2RlY3J5cHRvcl9yZWFkeV9jYiksCi0gICAgICBkZWNyeXB0b3JfKE5VTEwpLAotICAgICAga2V5X2FkZGVkX3doaWxlX2RlY29kZV9wZW5kaW5nXyhmYWxzZSksCi0gICAgICBiaXRzX3Blcl9jaGFubmVsXygwKSwKLSAgICAgIGNoYW5uZWxfbGF5b3V0XyhDSEFOTkVMX0xBWU9VVF9OT05FKSwKLSAgICAgIHNhbXBsZXNfcGVyX3NlY29uZF8oMCksCi0gICAgICBieXRlc19wZXJfc2FtcGxlXygwKSwKLSAgICAgIG91dHB1dF90aW1lc3RhbXBfYmFzZV8oa05vVGltZXN0YW1wKCkpLAotICAgICAgdG90YWxfc2FtcGxlc19kZWNvZGVkXygwKSB7Ci19Ci0KLXZvaWQgRGVjcnlwdGluZ0F1ZGlvRGVjb2Rlcjo6SW5pdGlhbGl6ZSgKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+JiBzdHJlYW0sCi0gICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc3RhdHVzX2NiLAotICAgIGNvbnN0IFN0YXRpc3RpY3NDQiYgc3RhdGlzdGljc19jYikgewotICBpZiAoIW1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSkgewotICAgIG1lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKEZST01fSEVSRSwgYmFzZTo6QmluZCgKLSAgICAgICAgJkRlY3J5cHRpbmdBdWRpb0RlY29kZXI6OkRvSW5pdGlhbGl6ZSwgdGhpcywKLSAgICAgICAgc3RyZWFtLCBzdGF0dXNfY2IsIHN0YXRpc3RpY3NfY2IpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgRG9Jbml0aWFsaXplKHN0cmVhbSwgc3RhdHVzX2NiLCBzdGF0aXN0aWNzX2NiKTsKLX0KLQotdm9pZCBEZWNyeXB0aW5nQXVkaW9EZWNvZGVyOjpSZWFkKGNvbnN0IFJlYWRDQiYgcmVhZF9jYikgewotICAvLyBDb21wbGV0ZSBvcGVyYXRpb24gYXN5bmNocm9ub3VzbHkgb24gZGlmZmVyZW50IHN0YWNrIG9mIGV4ZWN1dGlvbiBhcyBwZXIKLSAgLy8gdGhlIEFQSSBjb250cmFjdCBvZiBBdWRpb0RlY29kZXI6OlJlYWQoKQotICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzayhGUk9NX0hFUkUsIGJhc2U6OkJpbmQoCi0gICAgICAmRGVjcnlwdGluZ0F1ZGlvRGVjb2Rlcjo6RG9SZWFkLCB0aGlzLCByZWFkX2NiKSk7Ci19Ci0KLXZvaWQgRGVjcnlwdGluZ0F1ZGlvRGVjb2Rlcjo6UmVzZXQoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2xvc3VyZSkgewotICBpZiAoIW1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSkgewotICAgIG1lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKEZST01fSEVSRSwgYmFzZTo6QmluZCgKLSAgICAgICAgJkRlY3J5cHRpbmdBdWRpb0RlY29kZXI6OlJlc2V0LCB0aGlzLCBjbG9zdXJlKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRFZMT0coMikgPDwgIlJlc2V0KCkgLSBzdGF0ZTogIiA8PCBzdGF0ZV87Ci0gIERDSEVDSyhzdGF0ZV8gPT0ga0lkbGUgfHwKLSAgICAgICAgIHN0YXRlXyA9PSBrUGVuZGluZ0NvbmZpZ0NoYW5nZSB8fAotICAgICAgICAgc3RhdGVfID09IGtQZW5kaW5nRGVtdXhlclJlYWQgfHwKLSAgICAgICAgIHN0YXRlXyA9PSBrUGVuZGluZ0RlY29kZSB8fAotICAgICAgICAgc3RhdGVfID09IGtXYWl0aW5nRm9yS2V5IHx8Ci0gICAgICAgICBzdGF0ZV8gPT0ga0RlY29kZUZpbmlzaGVkKSA8PCBzdGF0ZV87Ci0gIERDSEVDSyhpbml0X2NiXy5pc19udWxsKCkpOyAgLy8gTm8gUmVzZXQoKSBkdXJpbmcgcGVuZGluZyBpbml0aWFsaXphdGlvbi4KLSAgRENIRUNLKHJlc2V0X2NiXy5pc19udWxsKCkpOwotCi0gIHJlc2V0X2NiXyA9IGNsb3N1cmU7Ci0KLSAgZGVjcnlwdG9yXy0+UmVzZXREZWNvZGVyKERlY3J5cHRvcjo6a0F1ZGlvKTsKLQotICAvLyBSZXNldCgpIGNhbm5vdCBjb21wbGV0ZSBpZiB0aGUgcmVhZCBjYWxsYmFjayBpcyBzdGlsbCBwZW5kaW5nLgotICAvLyBEZWZlciB0aGUgcmVzZXR0aW5nIHByb2Nlc3MgaW4gdGhpcyBjYXNlLiBUaGUgfHJlc2V0X2NiX3wgd2lsbCBiZSBmaXJlZAotICAvLyBhZnRlciB0aGUgcmVhZCBjYWxsYmFjayBpcyBmaXJlZCAtIHNlZSBEb0RlY3J5cHRBbmREZWNvZGVCdWZmZXIoKSBhbmQKLSAgLy8gRG9EZWxpdmVyRnJhbWUoKS4KLSAgaWYgKHN0YXRlXyA9PSBrUGVuZGluZ0NvbmZpZ0NoYW5nZSB8fAotICAgICAgc3RhdGVfID09IGtQZW5kaW5nRGVtdXhlclJlYWQgfHwKLSAgICAgIHN0YXRlXyA9PSBrUGVuZGluZ0RlY29kZSkgewotICAgIERDSEVDSyghcmVhZF9jYl8uaXNfbnVsbCgpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoc3RhdGVfID09IGtXYWl0aW5nRm9yS2V5KSB7Ci0gICAgRENIRUNLKCFyZWFkX2NiXy5pc19udWxsKCkpOwotICAgIHBlbmRpbmdfYnVmZmVyX3RvX2RlY29kZV8gPSBOVUxMOwotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZyZWFkX2NiXykuUnVuKGtBYm9ydGVkLCBOVUxMKTsKLSAgfQotCi0gIERDSEVDSyhyZWFkX2NiXy5pc19udWxsKCkpOwotICBEb1Jlc2V0KCk7Ci19Ci0KLWludCBEZWNyeXB0aW5nQXVkaW9EZWNvZGVyOjpiaXRzX3Blcl9jaGFubmVsKCkgewotICByZXR1cm4gYml0c19wZXJfY2hhbm5lbF87Ci19Ci0KLUNoYW5uZWxMYXlvdXQgRGVjcnlwdGluZ0F1ZGlvRGVjb2Rlcjo6Y2hhbm5lbF9sYXlvdXQoKSB7Ci0gIHJldHVybiBjaGFubmVsX2xheW91dF87Ci19Ci0KLWludCBEZWNyeXB0aW5nQXVkaW9EZWNvZGVyOjpzYW1wbGVzX3Blcl9zZWNvbmQoKSB7Ci0gIHJldHVybiBzYW1wbGVzX3Blcl9zZWNvbmRfOwotfQotCi1EZWNyeXB0aW5nQXVkaW9EZWNvZGVyOjp+RGVjcnlwdGluZ0F1ZGlvRGVjb2RlcigpIHsKLX0KLQotdm9pZCBEZWNyeXB0aW5nQXVkaW9EZWNvZGVyOjpEb0luaXRpYWxpemUoCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiYgc3RyZWFtLAotICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIHN0YXR1c19jYiwKLSAgICBjb25zdCBTdGF0aXN0aWNzQ0ImIHN0YXRpc3RpY3NfY2IpIHsKLSAgRFZMT0coMikgPDwgIkRvSW5pdGlhbGl6ZSgpIjsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIERDSEVDS19FUShzdGF0ZV8sIGtVbmluaXRpYWxpemVkKSA8PCBzdGF0ZV87Ci0gIERDSEVDSyhzdHJlYW0pOwotCi0gIGNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYgY29uZmlnID0gc3RyZWFtLT5hdWRpb19kZWNvZGVyX2NvbmZpZygpOwotICBpZiAoIWNvbmZpZy5Jc1ZhbGlkQ29uZmlnKCkpIHsKLSAgICBETE9HKEVSUk9SKSA8PCAiSW52YWxpZCBhdWRpbyBzdHJlYW0gY29uZmlnLiI7Ci0gICAgc3RhdHVzX2NiLlJ1bihQSVBFTElORV9FUlJPUl9ERUNPREUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIERlY3J5cHRpbmdBdWRpb0RlY29kZXIgb25seSBhY2NlcHRzIHBvdGVudGlhbGx5IGVuY3J5cHRlZCBzdHJlYW0uCi0gIGlmICghY29uZmlnLmlzX2VuY3J5cHRlZCgpKSB7Ci0gICAgc3RhdHVzX2NiLlJ1bihERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIERDSEVDSyghZGVtdXhlcl9zdHJlYW1fKTsKLSAgZGVtdXhlcl9zdHJlYW1fID0gc3RyZWFtOwotICBzdGF0aXN0aWNzX2NiXyA9IHN0YXRpc3RpY3NfY2I7Ci0KLSAgaW5pdF9jYl8gPSBzdGF0dXNfY2I7Ci0KLSAgc3RhdGVfID0ga0RlY3J5cHRvclJlcXVlc3RlZDsKLSAgc2V0X2RlY3J5cHRvcl9yZWFkeV9jYl8uUnVuKAotICAgICAgQklORF9UT19MT09QKCZEZWNyeXB0aW5nQXVkaW9EZWNvZGVyOjpTZXREZWNyeXB0b3IpKTsKLX0KLQotdm9pZCBEZWNyeXB0aW5nQXVkaW9EZWNvZGVyOjpTZXREZWNyeXB0b3IoRGVjcnlwdG9yKiBkZWNyeXB0b3IpIHsKLSAgRFZMT0coMikgPDwgIlNldERlY3J5cHRvcigpIjsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIERDSEVDS19FUShzdGF0ZV8sIGtEZWNyeXB0b3JSZXF1ZXN0ZWQpIDw8IHN0YXRlXzsKLSAgRENIRUNLKCFpbml0X2NiXy5pc19udWxsKCkpOwotICBEQ0hFQ0soIXNldF9kZWNyeXB0b3JfcmVhZHlfY2JfLmlzX251bGwoKSk7Ci0KLSAgc2V0X2RlY3J5cHRvcl9yZWFkeV9jYl8uUmVzZXQoKTsKLQotICBpZiAoIWRlY3J5cHRvcikgewotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZpbml0X2NiXykuUnVuKERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCk7Ci0gICAgLy8gVE9ETyh4aHdhbmcpOiBBZGQga0Vycm9yIHN0YXRlLiBTZWUgaHR0cDovL2NyYnVnLmNvbS8yNTE1MDMKLSAgICBzdGF0ZV8gPSBrRGVjb2RlRmluaXNoZWQ7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZGVjcnlwdG9yXyA9IGRlY3J5cHRvcjsKLQotICBzY29wZWRfcHRyPEF1ZGlvRGVjb2RlckNvbmZpZz4gc2NvcGVkX2NvbmZpZyhuZXcgQXVkaW9EZWNvZGVyQ29uZmlnKCkpOwotICBzY29wZWRfY29uZmlnLT5Db3B5RnJvbShkZW11eGVyX3N0cmVhbV8tPmF1ZGlvX2RlY29kZXJfY29uZmlnKCkpOwotCi0gIHN0YXRlXyA9IGtQZW5kaW5nRGVjb2RlckluaXQ7Ci0gIGRlY3J5cHRvcl8tPkluaXRpYWxpemVBdWRpb0RlY29kZXIoCi0gICAgICBzY29wZWRfY29uZmlnLlBhc3MoKSwKLSAgICAgIEJJTkRfVE9fTE9PUCgmRGVjcnlwdGluZ0F1ZGlvRGVjb2Rlcjo6RmluaXNoSW5pdGlhbGl6YXRpb24pKTsKLX0KLQotdm9pZCBEZWNyeXB0aW5nQXVkaW9EZWNvZGVyOjpGaW5pc2hJbml0aWFsaXphdGlvbihib29sIHN1Y2Nlc3MpIHsKLSAgRFZMT0coMikgPDwgIkZpbmlzaEluaXRpYWxpemF0aW9uKCkiOwotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgRENIRUNLX0VRKHN0YXRlXywga1BlbmRpbmdEZWNvZGVySW5pdCkgPDwgc3RhdGVfOwotICBEQ0hFQ0soIWluaXRfY2JfLmlzX251bGwoKSk7Ci0gIERDSEVDSyhyZXNldF9jYl8uaXNfbnVsbCgpKTsgIC8vIE5vIFJlc2V0KCkgYmVmb3JlIGluaXRpYWxpemF0aW9uIGZpbmlzaGVkLgotICBEQ0hFQ0socmVhZF9jYl8uaXNfbnVsbCgpKTsgIC8vIE5vIFJlYWQoKSBiZWZvcmUgaW5pdGlhbGl6YXRpb24gZmluaXNoZWQuCi0KLSAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJmluaXRfY2JfKS5SdW4oREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVEKTsKLSAgICBzdGF0ZV8gPSBrRGVjb2RlRmluaXNoZWQ7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gU3VjY2VzcyEKLSAgY29uc3QgQXVkaW9EZWNvZGVyQ29uZmlnJiBjb25maWcgPSBkZW11eGVyX3N0cmVhbV8tPmF1ZGlvX2RlY29kZXJfY29uZmlnKCk7Ci0gIGJpdHNfcGVyX2NoYW5uZWxfID0gY29uZmlnLmJpdHNfcGVyX2NoYW5uZWwoKTsKLSAgY2hhbm5lbF9sYXlvdXRfID0gY29uZmlnLmNoYW5uZWxfbGF5b3V0KCk7Ci0gIHNhbXBsZXNfcGVyX3NlY29uZF8gPSBjb25maWcuc2FtcGxlc19wZXJfc2Vjb25kKCk7Ci0gIGNvbnN0IGludCBrQml0c1BlckJ5dGUgPSA4OwotICBieXRlc19wZXJfc2FtcGxlXyA9IENoYW5uZWxMYXlvdXRUb0NoYW5uZWxDb3VudChjaGFubmVsX2xheW91dF8pICoKLSAgICAgIGJpdHNfcGVyX2NoYW5uZWxfIC8ga0JpdHNQZXJCeXRlOwotCi0gIGRlY3J5cHRvcl8tPlJlZ2lzdGVyS2V5QWRkZWRDQigKLSAgICAgIERlY3J5cHRvcjo6a0F1ZGlvLCBCSU5EX1RPX0xPT1AoJkRlY3J5cHRpbmdBdWRpb0RlY29kZXI6Ok9uS2V5QWRkZWQpKTsKLQotICBzdGF0ZV8gPSBrSWRsZTsKLSAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJmluaXRfY2JfKS5SdW4oUElQRUxJTkVfT0spOwotfQotCi12b2lkIERlY3J5cHRpbmdBdWRpb0RlY29kZXI6OkZpbmlzaENvbmZpZ0NoYW5nZShib29sIHN1Y2Nlc3MpIHsKLSAgRFZMT0coMikgPDwgIkZpbmlzaENvbmZpZ0NoYW5nZSgpIjsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIERDSEVDS19FUShzdGF0ZV8sIGtQZW5kaW5nQ29uZmlnQ2hhbmdlKSA8PCBzdGF0ZV87Ci0gIERDSEVDSyghcmVhZF9jYl8uaXNfbnVsbCgpKTsKLQotICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcmVhZF9jYl8pLlJ1bihrRGVjb2RlRXJyb3IsIE5VTEwpOwotICAgIHN0YXRlXyA9IGtEZWNvZGVGaW5pc2hlZDsKLSAgICBpZiAoIXJlc2V0X2NiXy5pc19udWxsKCkpCi0gICAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcmVzZXRfY2JfKS5SdW4oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBDb25maWcgY2hhbmdlIHN1Y2NlZWRlZC4KLSAgaWYgKCFyZXNldF9jYl8uaXNfbnVsbCgpKSB7Ci0gICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnJlYWRfY2JfKS5SdW4oa0Fib3J0ZWQsIE5VTEwpOwotICAgIERvUmVzZXQoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGF0ZV8gPSBrUGVuZGluZ0RlbXV4ZXJSZWFkOwotICBSZWFkRnJvbURlbXV4ZXJTdHJlYW0oKTsKLX0KLQotdm9pZCBEZWNyeXB0aW5nQXVkaW9EZWNvZGVyOjpEb1JlYWQoY29uc3QgUmVhZENCJiByZWFkX2NiKSB7Ci0gIERWTE9HKDMpIDw8ICJEb1JlYWQoKSI7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBEQ0hFQ0soc3RhdGVfID09IGtJZGxlIHx8IHN0YXRlXyA9PSBrRGVjb2RlRmluaXNoZWQpIDw8IHN0YXRlXzsKLSAgRENIRUNLKCFyZWFkX2NiLmlzX251bGwoKSk7Ci0gIENIRUNLKHJlYWRfY2JfLmlzX251bGwoKSkgPDwgIk92ZXJsYXBwaW5nIGRlY29kZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIjsKLQotICAvLyBSZXR1cm4gZW1wdHkgKGVuZC1vZi1zdHJlYW0pIGZyYW1lcyBpZiBkZWNvZGluZyBoYXMgZmluaXNoZWQuCi0gIGlmIChzdGF0ZV8gPT0ga0RlY29kZUZpbmlzaGVkKSB7Ci0gICAgcmVhZF9jYi5SdW4oa09rLCBzY29wZWRfcmVmcHRyPEJ1ZmZlcj4obmV3IERhdGFCdWZmZXIoMCkpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoIXF1ZXVlZF9hdWRpb19mcmFtZXNfLmVtcHR5KCkpIHsKLSAgICByZWFkX2NiLlJ1bihrT2ssIHF1ZXVlZF9hdWRpb19mcmFtZXNfLmZyb250KCkpOwotICAgIHF1ZXVlZF9hdWRpb19mcmFtZXNfLnBvcF9mcm9udCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHJlYWRfY2JfID0gcmVhZF9jYjsKLSAgc3RhdGVfID0ga1BlbmRpbmdEZW11eGVyUmVhZDsKLSAgUmVhZEZyb21EZW11eGVyU3RyZWFtKCk7Ci19Ci0KLXZvaWQgRGVjcnlwdGluZ0F1ZGlvRGVjb2Rlcjo6UmVhZEZyb21EZW11eGVyU3RyZWFtKCkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgRENIRUNLX0VRKHN0YXRlXywga1BlbmRpbmdEZW11eGVyUmVhZCkgPDwgc3RhdGVfOwotICBEQ0hFQ0soIXJlYWRfY2JfLmlzX251bGwoKSk7Ci0KLSAgZGVtdXhlcl9zdHJlYW1fLT5SZWFkKAotICAgICAgYmFzZTo6QmluZCgmRGVjcnlwdGluZ0F1ZGlvRGVjb2Rlcjo6RG9EZWNyeXB0QW5kRGVjb2RlQnVmZmVyLCB0aGlzKSk7Ci19Ci0KLXZvaWQgRGVjcnlwdGluZ0F1ZGlvRGVjb2Rlcjo6RG9EZWNyeXB0QW5kRGVjb2RlQnVmZmVyKAotICAgIERlbXV4ZXJTdHJlYW06OlN0YXR1cyBzdGF0dXMsCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgYnVmZmVyKSB7Ci0gIGlmICghbWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKSB7Ci0gICAgbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soRlJPTV9IRVJFLCBiYXNlOjpCaW5kKAotICAgICAgICAmRGVjcnlwdGluZ0F1ZGlvRGVjb2Rlcjo6RG9EZWNyeXB0QW5kRGVjb2RlQnVmZmVyLCB0aGlzLAotICAgICAgICBzdGF0dXMsIGJ1ZmZlcikpOwotICAgIHJldHVybjsKLSAgfQotCi0gIERWTE9HKDMpIDw8ICJEb0RlY3J5cHRBbmREZWNvZGVCdWZmZXIoKSI7Ci0gIERDSEVDS19FUShzdGF0ZV8sIGtQZW5kaW5nRGVtdXhlclJlYWQpIDw8IHN0YXRlXzsKLSAgRENIRUNLKCFyZWFkX2NiXy5pc19udWxsKCkpOwotICBEQ0hFQ0tfRVEoYnVmZmVyICE9IE5VTEwsIHN0YXR1cyA9PSBEZW11eGVyU3RyZWFtOjprT2spIDw8IHN0YXR1czsKLQotICBpZiAoc3RhdHVzID09IERlbXV4ZXJTdHJlYW06OmtDb25maWdDaGFuZ2VkKSB7Ci0gICAgRFZMT0coMikgPDwgIkRvRGVjcnlwdEFuZERlY29kZUJ1ZmZlcigpIC0ga0NvbmZpZ0NoYW5nZWQiOwotCi0gICAgc2NvcGVkX3B0cjxBdWRpb0RlY29kZXJDb25maWc+IHNjb3BlZF9jb25maWcobmV3IEF1ZGlvRGVjb2RlckNvbmZpZygpKTsKLSAgICBzY29wZWRfY29uZmlnLT5Db3B5RnJvbShkZW11eGVyX3N0cmVhbV8tPmF1ZGlvX2RlY29kZXJfY29uZmlnKCkpOwotCi0gICAgc3RhdGVfID0ga1BlbmRpbmdDb25maWdDaGFuZ2U7Ci0gICAgZGVjcnlwdG9yXy0+RGVpbml0aWFsaXplRGVjb2RlcihEZWNyeXB0b3I6OmtBdWRpbyk7Ci0gICAgZGVjcnlwdG9yXy0+SW5pdGlhbGl6ZUF1ZGlvRGVjb2RlcigKLSAgICAgICAgc2NvcGVkX2NvbmZpZy5QYXNzKCksIEJpbmRUb0N1cnJlbnRMb29wKGJhc2U6OkJpbmQoCi0gICAgICAgICAgICAmRGVjcnlwdGluZ0F1ZGlvRGVjb2Rlcjo6RmluaXNoQ29uZmlnQ2hhbmdlLCB0aGlzKSkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICghcmVzZXRfY2JfLmlzX251bGwoKSkgewotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZyZWFkX2NiXykuUnVuKGtBYm9ydGVkLCBOVUxMKTsKLSAgICBEb1Jlc2V0KCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHN0YXR1cyA9PSBEZW11eGVyU3RyZWFtOjprQWJvcnRlZCkgewotICAgIERWTE9HKDIpIDw8ICJEb0RlY3J5cHRBbmREZWNvZGVCdWZmZXIoKSAtIGtBYm9ydGVkIjsKLSAgICBzdGF0ZV8gPSBrSWRsZTsKLSAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcmVhZF9jYl8pLlJ1bihrQWJvcnRlZCwgTlVMTCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRENIRUNLX0VRKHN0YXR1cywgRGVtdXhlclN0cmVhbTo6a09rKTsKLQotICAvLyBJbml0aWFsaXplIHRoZSB8bmV4dF9vdXRwdXRfdGltZXN0YW1wX3wgdG8gYmUgdGhlIHRpbWVzdGFtcCBvZiB0aGUgZmlyc3QKLSAgLy8gbm9uLUVPUyBidWZmZXIuCi0gIGlmIChvdXRwdXRfdGltZXN0YW1wX2Jhc2VfID09IGtOb1RpbWVzdGFtcCgpICYmICFidWZmZXItPklzRW5kT2ZTdHJlYW0oKSkgewotICAgIERDSEVDS19FUSh0b3RhbF9zYW1wbGVzX2RlY29kZWRfLCAwKTsKLSAgICBvdXRwdXRfdGltZXN0YW1wX2Jhc2VfID0gYnVmZmVyLT5HZXRUaW1lc3RhbXAoKTsKLSAgfQotCi0gIHBlbmRpbmdfYnVmZmVyX3RvX2RlY29kZV8gPSBidWZmZXI7Ci0gIHN0YXRlXyA9IGtQZW5kaW5nRGVjb2RlOwotICBEZWNvZGVQZW5kaW5nQnVmZmVyKCk7Ci19Ci0KLXZvaWQgRGVjcnlwdGluZ0F1ZGlvRGVjb2Rlcjo6RGVjb2RlUGVuZGluZ0J1ZmZlcigpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIERDSEVDS19FUShzdGF0ZV8sIGtQZW5kaW5nRGVjb2RlKSA8PCBzdGF0ZV87Ci0gIGRlY3J5cHRvcl8tPkRlY3J5cHRBbmREZWNvZGVBdWRpbygKLSAgICAgIHBlbmRpbmdfYnVmZmVyX3RvX2RlY29kZV8sCi0gICAgICBiYXNlOjpCaW5kKCZEZWNyeXB0aW5nQXVkaW9EZWNvZGVyOjpEZWxpdmVyRnJhbWUsIHRoaXMsCi0gICAgICAgICAgICAgICAgIHBlbmRpbmdfYnVmZmVyX3RvX2RlY29kZV8tPkdldERhdGFTaXplKCkpKTsKLX0KLQotdm9pZCBEZWNyeXB0aW5nQXVkaW9EZWNvZGVyOjpEZWxpdmVyRnJhbWUoCi0gICAgaW50IGJ1ZmZlcl9zaXplLAotICAgIERlY3J5cHRvcjo6U3RhdHVzIHN0YXR1cywKLSAgICBjb25zdCBEZWNyeXB0b3I6OkF1ZGlvQnVmZmVycyYgZnJhbWVzKSB7Ci0gIC8vIFdlIG5lZWQgdG8gZm9yY2UgdGFzayBwb3N0IGhlcmUgYmVjYXVzZSB0aGUgQXVkaW9EZWNvZGVDQiBjYW4gYmUgZXhlY3V0ZWQKLSAgLy8gc3luY2hyb25vdXNseSBpbiBSZXNldCgpLiBJbnN0ZWFkIG9mIHVzaW5nIG1vcmUgY29tcGxpY2F0ZWQgbG9naWMgaW4KLSAgLy8gdGhvc2UgZnVuY3Rpb24gdG8gZml4IGl0LCB3aHkgbm90IGZvcmNlIHRhc2sgcG9zdCBoZXJlIHRvIG1ha2UgZXZlcnl0aGluZwotICAvLyBzaW1wbGUgYW5kIGNsZWFyPwotICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzayhGUk9NX0hFUkUsIGJhc2U6OkJpbmQoCi0gICAgICAmRGVjcnlwdGluZ0F1ZGlvRGVjb2Rlcjo6RG9EZWxpdmVyRnJhbWUsIHRoaXMsCi0gICAgICBidWZmZXJfc2l6ZSwgc3RhdHVzLCBmcmFtZXMpKTsKLX0KLQotdm9pZCBEZWNyeXB0aW5nQXVkaW9EZWNvZGVyOjpEb0RlbGl2ZXJGcmFtZSgKLSAgICBpbnQgYnVmZmVyX3NpemUsCi0gICAgRGVjcnlwdG9yOjpTdGF0dXMgc3RhdHVzLAotICAgIGNvbnN0IERlY3J5cHRvcjo6QXVkaW9CdWZmZXJzJiBmcmFtZXMpIHsKLSAgRFZMT0coMykgPDwgIkRvRGVsaXZlckZyYW1lKCkgLSBzdGF0dXM6ICIgPDwgc3RhdHVzOwotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgRENIRUNLX0VRKHN0YXRlXywga1BlbmRpbmdEZWNvZGUpIDw8IHN0YXRlXzsKLSAgRENIRUNLKCFyZWFkX2NiXy5pc19udWxsKCkpOwotICBEQ0hFQ0socGVuZGluZ19idWZmZXJfdG9fZGVjb2RlXyk7Ci0gIERDSEVDSyhxdWV1ZWRfYXVkaW9fZnJhbWVzXy5lbXB0eSgpKTsKLQotICBib29sIG5lZWRfdG9fdHJ5X2FnYWluX2lmX25va2V5X2lzX3JldHVybmVkID0ga2V5X2FkZGVkX3doaWxlX2RlY29kZV9wZW5kaW5nXzsKLSAga2V5X2FkZGVkX3doaWxlX2RlY29kZV9wZW5kaW5nXyA9IGZhbHNlOwotCi0gIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gc2NvcGVkX3BlbmRpbmdfYnVmZmVyX3RvX2RlY29kZSA9Ci0gICAgICBwZW5kaW5nX2J1ZmZlcl90b19kZWNvZGVfOwotCi0gIHBlbmRpbmdfYnVmZmVyX3RvX2RlY29kZV8gPSBOVUxMOwotCi0gIGlmICghcmVzZXRfY2JfLmlzX251bGwoKSkgewotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZyZWFkX2NiXykuUnVuKGtBYm9ydGVkLCBOVUxMKTsKLSAgICBEb1Jlc2V0KCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRENIRUNLX0VRKHN0YXR1cyA9PSBEZWNyeXB0b3I6OmtTdWNjZXNzLCAhZnJhbWVzLmVtcHR5KCkpOwotCi0gIGlmIChzdGF0dXMgPT0gRGVjcnlwdG9yOjprRXJyb3IpIHsKLSAgICBEVkxPRygyKSA8PCAiRG9EZWxpdmVyRnJhbWUoKSAtIGtFcnJvciI7Ci0gICAgc3RhdGVfID0ga0RlY29kZUZpbmlzaGVkOwotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZyZWFkX2NiXykuUnVuKGtEZWNvZGVFcnJvciwgTlVMTCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHN0YXR1cyA9PSBEZWNyeXB0b3I6OmtOb0tleSkgewotICAgIERWTE9HKDIpIDw8ICJEb0RlbGl2ZXJGcmFtZSgpIC0ga05vS2V5IjsKLSAgICAvLyBTZXQgfHBlbmRpbmdfYnVmZmVyX3RvX2RlY29kZV98IGJhY2sgYXMgd2UgbmVlZCB0byB0cnkgZGVjb2RpbmcgdGhlCi0gICAgLy8gcGVuZGluZyBidWZmZXIgYWdhaW4gd2hlbiBuZXcga2V5IGlzIGFkZGVkIHRvIHRoZSBkZWNyeXB0b3IuCi0gICAgcGVuZGluZ19idWZmZXJfdG9fZGVjb2RlXyA9IHNjb3BlZF9wZW5kaW5nX2J1ZmZlcl90b19kZWNvZGU7Ci0KLSAgICBpZiAobmVlZF90b190cnlfYWdhaW5faWZfbm9rZXlfaXNfcmV0dXJuZWQpIHsKLSAgICAgIC8vIFRoZSB8c3RhdGVffCBpcyBzdGlsbCBrUGVuZGluZ0RlY29kZS4KLSAgICAgIERlY29kZVBlbmRpbmdCdWZmZXIoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdGF0ZV8gPSBrV2FpdGluZ0ZvcktleTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBUaGUgYnVmZmVyIGhhcyBiZWVuIGFjY2VwdGVkIGJ5IHRoZSBkZWNvZGVyLCBsZXQncyByZXBvcnQgc3RhdGlzdGljcy4KLSAgaWYgKGJ1ZmZlcl9zaXplKSB7Ci0gICAgUGlwZWxpbmVTdGF0aXN0aWNzIHN0YXRpc3RpY3M7Ci0gICAgc3RhdGlzdGljcy5hdWRpb19ieXRlc19kZWNvZGVkID0gYnVmZmVyX3NpemU7Ci0gICAgc3RhdGlzdGljc19jYl8uUnVuKHN0YXRpc3RpY3MpOwotICB9Ci0KLSAgaWYgKHN0YXR1cyA9PSBEZWNyeXB0b3I6OmtOZWVkTW9yZURhdGEpIHsKLSAgICBEVkxPRygyKSA8PCAiRG9EZWxpdmVyRnJhbWUoKSAtIGtOZWVkTW9yZURhdGEiOwotICAgIGlmIChzY29wZWRfcGVuZGluZ19idWZmZXJfdG9fZGVjb2RlLT5Jc0VuZE9mU3RyZWFtKCkpIHsKLSAgICAgIHN0YXRlXyA9IGtEZWNvZGVGaW5pc2hlZDsKLSAgICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZyZWFkX2NiXykuUnVuKAotICAgICAgICAgIGtPaywgc2NvcGVkX3JlZnB0cjxCdWZmZXI+KG5ldyBEYXRhQnVmZmVyKDApKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3RhdGVfID0ga1BlbmRpbmdEZW11eGVyUmVhZDsKLSAgICBSZWFkRnJvbURlbXV4ZXJTdHJlYW0oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBEQ0hFQ0tfRVEoc3RhdHVzLCBEZWNyeXB0b3I6OmtTdWNjZXNzKTsKLSAgRENIRUNLKCFmcmFtZXMuZW1wdHkoKSk7Ci0gIEVucXVldWVGcmFtZXMoZnJhbWVzKTsKLQotICBzdGF0ZV8gPSBrSWRsZTsKLSAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnJlYWRfY2JfKS5SdW4oa09rLCBxdWV1ZWRfYXVkaW9fZnJhbWVzXy5mcm9udCgpKTsKLSAgcXVldWVkX2F1ZGlvX2ZyYW1lc18ucG9wX2Zyb250KCk7Ci19Ci0KLXZvaWQgRGVjcnlwdGluZ0F1ZGlvRGVjb2Rlcjo6T25LZXlBZGRlZCgpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0KLSAgaWYgKHN0YXRlXyA9PSBrUGVuZGluZ0RlY29kZSkgewotICAgIGtleV9hZGRlZF93aGlsZV9kZWNvZGVfcGVuZGluZ18gPSB0cnVlOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzdGF0ZV8gPT0ga1dhaXRpbmdGb3JLZXkpIHsKLSAgICBzdGF0ZV8gPSBrUGVuZGluZ0RlY29kZTsKLSAgICBEZWNvZGVQZW5kaW5nQnVmZmVyKCk7Ci0gIH0KLX0KLQotdm9pZCBEZWNyeXB0aW5nQXVkaW9EZWNvZGVyOjpEb1Jlc2V0KCkgewotICBEQ0hFQ0soaW5pdF9jYl8uaXNfbnVsbCgpKTsKLSAgRENIRUNLKHJlYWRfY2JfLmlzX251bGwoKSk7Ci0gIG91dHB1dF90aW1lc3RhbXBfYmFzZV8gPSBrTm9UaW1lc3RhbXAoKTsKLSAgdG90YWxfc2FtcGxlc19kZWNvZGVkXyA9IDA7Ci0gIHN0YXRlXyA9IGtJZGxlOwotICBiYXNlOjpSZXNldEFuZFJldHVybigmcmVzZXRfY2JfKS5SdW4oKTsKLX0KLQotdm9pZCBEZWNyeXB0aW5nQXVkaW9EZWNvZGVyOjpFbnF1ZXVlRnJhbWVzKAotICAgIGNvbnN0IERlY3J5cHRvcjo6QXVkaW9CdWZmZXJzJiBmcmFtZXMpIHsKLSAgcXVldWVkX2F1ZGlvX2ZyYW1lc18gPSBmcmFtZXM7Ci0KLSAgZm9yIChEZWNyeXB0b3I6OkF1ZGlvQnVmZmVyczo6aXRlcmF0b3IgaXRlciA9IHF1ZXVlZF9hdWRpb19mcmFtZXNfLmJlZ2luKCk7Ci0gICAgICBpdGVyICE9IHF1ZXVlZF9hdWRpb19mcmFtZXNfLmVuZCgpOwotICAgICAgKytpdGVyKSB7Ci0gICAgc2NvcGVkX3JlZnB0cjxCdWZmZXI+JiBmcmFtZSA9ICppdGVyOwotCi0gICAgRENIRUNLKCFmcmFtZS0+SXNFbmRPZlN0cmVhbSgpKSA8PCAiRU9TIGZyYW1lIHJldHVybmVkLiI7Ci0gICAgRENIRUNLX0dUKGZyYW1lLT5HZXREYXRhU2l6ZSgpLCAwKSA8PCAiRW1wdHkgZnJhbWUgcmV0dXJuZWQuIjsKLQotICAgIGJhc2U6OlRpbWVEZWx0YSBjdXJfdGltZXN0YW1wID0gb3V0cHV0X3RpbWVzdGFtcF9iYXNlXyArCi0gICAgICAgIE51bWJlck9mU2FtcGxlc1RvRHVyYXRpb24odG90YWxfc2FtcGxlc19kZWNvZGVkXyk7Ci0gICAgaWYgKElzT3V0T2ZTeW5jKGN1cl90aW1lc3RhbXAsIGZyYW1lLT5HZXRUaW1lc3RhbXAoKSkpIHsKLSAgICAgIERWTE9HKDEpICA8PCAiVGltZXN0YW1wIHJldHVybmVkIGJ5IHRoZSBkZWNvZGVyICgiCi0gICAgICAgICAgICAgICAgPDwgZnJhbWUtPkdldFRpbWVzdGFtcCgpLkluTWlsbGlzZWNvbmRzKCkgPDwgIiBtcykiCi0gICAgICAgICAgICAgICAgPDwgIiBkb2VzIG5vdCBtYXRjaCB0aGUgaW5wdXQgdGltZXN0YW1wIGFuZCBudW1iZXIgb2Ygc2FtcGxlcyIKLSAgICAgICAgICAgICAgICA8PCAiIGRlY29kZWQgKCIgPDwgY3VyX3RpbWVzdGFtcC5Jbk1pbGxpc2Vjb25kcygpIDw8ICIgbXMpLiI7Ci0gICAgfQotICAgIGZyYW1lLT5TZXRUaW1lc3RhbXAoY3VyX3RpbWVzdGFtcCk7Ci0KLSAgICBpbnQgZnJhbWVfc2l6ZSA9IGZyYW1lLT5HZXREYXRhU2l6ZSgpOwotICAgIERDSEVDS19FUShmcmFtZV9zaXplICUgYnl0ZXNfcGVyX3NhbXBsZV8sIDApIDw8Ci0gICAgICAgICJEZWNvZGVyIGRpZG4ndCBvdXRwdXQgZnVsbCBzYW1wbGVzIjsKLSAgICBpbnQgc2FtcGxlc19kZWNvZGVkID0gZnJhbWVfc2l6ZSAvIGJ5dGVzX3Blcl9zYW1wbGVfOwotICAgIHRvdGFsX3NhbXBsZXNfZGVjb2RlZF8gKz0gc2FtcGxlc19kZWNvZGVkOwotCi0gICAgYmFzZTo6VGltZURlbHRhIG5leHRfdGltZXN0YW1wID0gb3V0cHV0X3RpbWVzdGFtcF9iYXNlXyArCi0gICAgICAgIE51bWJlck9mU2FtcGxlc1RvRHVyYXRpb24odG90YWxfc2FtcGxlc19kZWNvZGVkXyk7Ci0gICAgYmFzZTo6VGltZURlbHRhIGR1cmF0aW9uID0gbmV4dF90aW1lc3RhbXAgLSBjdXJfdGltZXN0YW1wOwotICAgIGZyYW1lLT5TZXREdXJhdGlvbihkdXJhdGlvbik7Ci0gIH0KLX0KLQotYmFzZTo6VGltZURlbHRhIERlY3J5cHRpbmdBdWRpb0RlY29kZXI6Ok51bWJlck9mU2FtcGxlc1RvRHVyYXRpb24oCi0gICAgaW50IG51bWJlcl9vZl9zYW1wbGVzKSBjb25zdCB7Ci0gIERDSEVDSyhzYW1wbGVzX3Blcl9zZWNvbmRfKTsKLSAgcmV0dXJuIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pY3Jvc2Vjb25kcyhiYXNlOjpUaW1lOjprTWljcm9zZWNvbmRzUGVyU2Vjb25kICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2Zfc2FtcGxlcyAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc19wZXJfc2Vjb25kXyk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvZGVjcnlwdGluZ19hdWRpb19kZWNvZGVyLmggYi9zcmMvbWVkaWEvZmlsdGVycy9kZWNyeXB0aW5nX2F1ZGlvX2RlY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg5MGQyMi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9kZWNyeXB0aW5nX2F1ZGlvX2RlY29kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0ZJTFRFUlNfREVDUllQVElOR19BVURJT19ERUNPREVSX0hfCi0jZGVmaW5lIE1FRElBX0ZJTFRFUlNfREVDUllQVElOR19BVURJT19ERUNPREVSX0hfCi0KLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlY3J5cHRvci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVtdXhlcl9zdHJlYW0uaCIKLQotbmFtZXNwYWNlIGJhc2UgewotY2xhc3MgTWVzc2FnZUxvb3BQcm94eTsKLX0KLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgRGVjb2RlckJ1ZmZlcjsKLWNsYXNzIERlY3J5cHRvcjsKLQotLy8gRGVjcnlwdG9yLWJhc2VkIEF1ZGlvRGVjb2RlciBpbXBsZW1lbnRhdGlvbiB0aGF0IGNhbiBkZWNyeXB0IGFuZCBkZWNvZGUKLS8vIGVuY3J5cHRlZCBhdWRpbyBidWZmZXJzIGFuZCByZXR1cm4gZGVjcnlwdGVkIGFuZCBkZWNvbXByZXNzZWQgYXVkaW8gZnJhbWVzLgotLy8gQWxsIHB1YmxpYyBBUElzIGFuZCBjYWxsYmFja3MgYXJlIHRyYW1wb2xpbmVkIHRvIHRoZSB8bWVzc2FnZV9sb29wX3wgc28KLS8vIHRoYXQgbm8gbG9ja3MgYXJlIHJlcXVpcmVkIGZvciB0aHJlYWQgc2FmZXR5LgotY2xhc3MgTUVESUFfRVhQT1JUIERlY3J5cHRpbmdBdWRpb0RlY29kZXIgOiBwdWJsaWMgQXVkaW9EZWNvZGVyIHsKLSBwdWJsaWM6Ci0gIERlY3J5cHRpbmdBdWRpb0RlY29kZXIoCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+JiBtZXNzYWdlX2xvb3AsCi0gICAgICBjb25zdCBTZXREZWNyeXB0b3JSZWFkeUNCJiBzZXRfZGVjcnlwdG9yX3JlYWR5X2NiKTsKLQotICAvLyBBdWRpb0RlY29kZXIgaW1wbGVtZW50YXRpb24uCi0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4mIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc3RhdHVzX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0aXN0aWNzQ0ImIHN0YXRpc3RpY3NfY2IpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgUmVhZChjb25zdCBSZWFkQ0ImIHJlYWRfY2IpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgUmVzZXQoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2xvc3VyZSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgaW50IGJpdHNfcGVyX2NoYW5uZWwoKSBPVkVSUklERTsKLSAgdmlydHVhbCBDaGFubmVsTGF5b3V0IGNoYW5uZWxfbGF5b3V0KCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgaW50IHNhbXBsZXNfcGVyX3NlY29uZCgpIE9WRVJSSURFOwotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIH5EZWNyeXB0aW5nQXVkaW9EZWNvZGVyKCk7Ci0KLSBwcml2YXRlOgotICAvLyBGb3IgYSBkZXRhaWxlZCBzdGF0ZSBkaWFncmFtIHBsZWFzZSBzZWUgdGhpcyBsaW5rOiBodHRwOi8vZ29vLmdsLzhqQW9rCi0gIC8vIFRPRE8oeGh3YW5nKTogQWRkIGEgQVNDSUkgc3RhdGUgZGlhZ3JhbSBpbiB0aGlzIGZpbGUgYWZ0ZXIgdGhpcyBjbGFzcwotICAvLyBzdGFiaWxpemVzLgotICAvLyBUT0RPKHhod2FuZyk6IFVwZGF0ZSB0aGlzIGRpYWdyYW0gZm9yIERlY3J5cHRpbmdBdWRpb0RlY29kZXIuCi0gIGVudW0gU3RhdGUgewotICAgIGtVbmluaXRpYWxpemVkID0gMCwKLSAgICBrRGVjcnlwdG9yUmVxdWVzdGVkLAotICAgIGtQZW5kaW5nRGVjb2RlckluaXQsCi0gICAga0lkbGUsCi0gICAga1BlbmRpbmdDb25maWdDaGFuZ2UsCi0gICAga1BlbmRpbmdEZW11eGVyUmVhZCwKLSAgICBrUGVuZGluZ0RlY29kZSwKLSAgICBrV2FpdGluZ0ZvcktleSwKLSAgICBrRGVjb2RlRmluaXNoZWQsCi0gIH07Ci0KLSAgLy8gQ2FycmllcyBvdXQgdGhlIGluaXRpYWxpemF0aW9uIG9wZXJhdGlvbiBzY2hlZHVsZWQgYnkgSW5pdGlhbGl6ZSgpLgotICB2b2lkIERvSW5pdGlhbGl6ZShjb25zdCBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+JiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIHN0YXR1c19jYiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdGlzdGljc0NCJiBzdGF0aXN0aWNzX2NiKTsKLQotICAvLyBDYWxsYmFjayBmb3IgRGVjcnlwdG9ySG9zdDo6UmVxdWVzdERlY3J5cHRvcigpLgotICB2b2lkIFNldERlY3J5cHRvcihEZWNyeXB0b3IqIGRlY3J5cHRvcik7Ci0KLSAgLy8gQ2FsbGJhY2sgZm9yIERlY3J5cHRvcjo6SW5pdGlhbGl6ZUF1ZGlvRGVjb2RlcigpIGR1cmluZyBpbml0aWFsaXphdGlvbi4KLSAgdm9pZCBGaW5pc2hJbml0aWFsaXphdGlvbihib29sIHN1Y2Nlc3MpOwotCi0gIC8vIENhbGxiYWNrIGZvciBEZWNyeXB0b3I6OkluaXRpYWxpemVBdWRpb0RlY29kZXIoKSBkdXJpbmcgY29uZmlnIGNoYW5nZS4KLSAgdm9pZCBGaW5pc2hDb25maWdDaGFuZ2UoYm9vbCBzdWNjZXNzKTsKLQotICAvLyBDYXJyaWVzIG91dCB0aGUgYnVmZmVyIHJlYWRpbmcgb3BlcmF0aW9uIHNjaGVkdWxlZCBieSBSZWFkKCkuCi0gIHZvaWQgRG9SZWFkKGNvbnN0IFJlYWRDQiYgcmVhZF9jYik7Ci0KLSAgdm9pZCBSZWFkRnJvbURlbXV4ZXJTdHJlYW0oKTsKLQotICAvLyBDYWxsYmFjayBmb3IgRGVtdXhlclN0cmVhbTo6UmVhZCgpLgotICB2b2lkIERvRGVjcnlwdEFuZERlY29kZUJ1ZmZlcihEZW11eGVyU3RyZWFtOjpTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBidWZmZXIpOwotCi0gIHZvaWQgRGVjb2RlUGVuZGluZ0J1ZmZlcigpOwotCi0gIC8vIENhbGxiYWNrIGZvciBEZWNyeXB0b3I6OkRlY3J5cHRBbmREZWNvZGVBdWRpbygpLgotICB2b2lkIERlbGl2ZXJGcmFtZShpbnQgYnVmZmVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgIERlY3J5cHRvcjo6U3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjcnlwdG9yOjpBdWRpb0J1ZmZlcnMmIGZyYW1lcyk7Ci0KLSAgLy8gQ2FycmllcyBvdXQgdGhlIGZyYW1lIGRlbGl2ZXJ5IG9wZXJhdGlvbiBzY2hlZHVsZWQgYnkgRGVsaXZlckZyYW1lKCkuCi0gIHZvaWQgRG9EZWxpdmVyRnJhbWUoaW50IGJ1ZmZlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRvcjo6U3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNyeXB0b3I6OkF1ZGlvQnVmZmVycyYgZnJhbWVzKTsKLQotICAvLyBDYWxsYmFjayBmb3IgdGhlIHxkZWNyeXB0b3JffCB0byBub3RpZnkgdGhpcyBvYmplY3QgdGhhdCBhIG5ldyBrZXkgaGFzIGJlZW4KLSAgLy8gYWRkZWQuCi0gIHZvaWQgT25LZXlBZGRlZCgpOwotCi0gIC8vIFJlc2V0cyBkZWNvZGVyIGFuZCBjYWxscyB8cmVzZXRfY2JffC4KLSAgdm9pZCBEb1Jlc2V0KCk7Ci0KLSAgLy8gU2V0cyB0aW1lc3RhbXAgYW5kIGR1cmF0aW9uIGZvciB8cXVldWVkX2F1ZGlvX2ZyYW1lc198IHRvIG1ha2Ugc3VyZSB0aGUKLSAgLy8gcmVuZGVyZXIgYWx3YXlzIHJlY2VpdmVzIGNvbnRpbnVvdXMgZnJhbWVzIHdpdGhvdXQgZ2FwcyBhbmQgb3ZlcmxhcHMuCi0gIHZvaWQgRW5xdWV1ZUZyYW1lcyhjb25zdCBEZWNyeXB0b3I6OkF1ZGlvQnVmZmVycyYgZnJhbWVzKTsKLQotICAvLyBDb252ZXJ0cyBudW1iZXIgb2Ygc2FtcGxlcyB0byBkdXJhdGlvbi4KLSAgYmFzZTo6VGltZURlbHRhIE51bWJlck9mU2FtcGxlc1RvRHVyYXRpb24oaW50IG51bWJlcl9vZl9zYW1wbGVzKSBjb25zdDsKLQotICBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+IG1lc3NhZ2VfbG9vcF87Ci0KLSAgU3RhdGUgc3RhdGVfOwotCi0gIFBpcGVsaW5lU3RhdHVzQ0IgaW5pdF9jYl87Ci0gIFN0YXRpc3RpY3NDQiBzdGF0aXN0aWNzX2NiXzsKLSAgUmVhZENCIHJlYWRfY2JfOwotICBiYXNlOjpDbG9zdXJlIHJlc2V0X2NiXzsKLQotICAvLyBQb2ludGVyIHRvIHRoZSBkZW11eGVyIHN0cmVhbSB0aGF0IHdpbGwgZmVlZCB1cyBjb21wcmVzc2VkIGJ1ZmZlcnMuCi0gIHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4gZGVtdXhlcl9zdHJlYW1fOwotCi0gIC8vIENhbGxiYWNrIHRvIHJlcXVlc3QvY2FuY2VsIGRlY3J5cHRvciBjcmVhdGlvbiBub3RpZmljYXRpb24uCi0gIFNldERlY3J5cHRvclJlYWR5Q0Igc2V0X2RlY3J5cHRvcl9yZWFkeV9jYl87Ci0KLSAgRGVjcnlwdG9yKiBkZWNyeXB0b3JfOwotCi0gIC8vIFRoZSBidWZmZXIgcmV0dXJuZWQgYnkgdGhlIGRlbXV4ZXIgdGhhdCBuZWVkcyBkZWNyeXB0aW5nL2RlY29kaW5nLgotICBzY29wZWRfcmVmcHRyPG1lZGlhOjpEZWNvZGVyQnVmZmVyPiBwZW5kaW5nX2J1ZmZlcl90b19kZWNvZGVfOwotCi0gIC8vIEluZGljYXRlcyB0aGUgc2l0dWF0aW9uIHdoZXJlIG5ldyBrZXkgaXMgYWRkZWQgZHVyaW5nIHBlbmRpbmcgZGVjb2RlCi0gIC8vIChpbiBvdGhlciB3b3JkcywgdGhpcyB2YXJpYWJsZSBjYW4gb25seSBiZSBzZXQgaW4gc3RhdGUga1BlbmRpbmdEZWNvZGUpLgotICAvLyBJZiB0aGlzIHZhcmlhYmxlIGlzIHRydWUgYW5kIGtOb0tleSBpcyByZXR1cm5lZCB0aGVuIHdlIG5lZWQgdG8gdHJ5Ci0gIC8vIGRlY3J5cHRpbmcvZGVjb2RpbmcgYWdhaW4gaW4gY2FzZSB0aGUgbmV3bHkgYWRkZWQga2V5IGlzIHRoZSBjb3JyZWN0Ci0gIC8vIGRlY3J5cHRpb24ga2V5LgotICBib29sIGtleV9hZGRlZF93aGlsZV9kZWNvZGVfcGVuZGluZ187Ci0KLSAgRGVjcnlwdG9yOjpBdWRpb0J1ZmZlcnMgcXVldWVkX2F1ZGlvX2ZyYW1lc187Ci0KLSAgLy8gRGVjb2RlZCBhdWRpbyBmb3JtYXQuCi0gIGludCBiaXRzX3Blcl9jaGFubmVsXzsKLSAgQ2hhbm5lbExheW91dCBjaGFubmVsX2xheW91dF87Ci0gIGludCBzYW1wbGVzX3Blcl9zZWNvbmRfOwotCi0gIGludCBieXRlc19wZXJfc2FtcGxlXzsKLQotICBiYXNlOjpUaW1lRGVsdGEgb3V0cHV0X3RpbWVzdGFtcF9iYXNlXzsKLSAgaW50IHRvdGFsX3NhbXBsZXNfZGVjb2RlZF87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKERlY3J5cHRpbmdBdWRpb0RlY29kZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfRklMVEVSU19ERUNSWVBUSU5HX0FVRElPX0RFQ09ERVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL2RlY3J5cHRpbmdfYXVkaW9fZGVjb2Rlcl91bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9maWx0ZXJzL2RlY3J5cHRpbmdfYXVkaW9fZGVjb2Rlcl91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBkNjVjNi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9kZWNyeXB0aW5nX2F1ZGlvX2RlY29kZXJfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NzAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYnVmZmVycy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGF0YV9idWZmZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNyeXB0X2NvbmZpZy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZ21vY2tfY2FsbGJhY2tfc3VwcG9ydC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbW9ja19maWx0ZXJzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS90ZXN0X2hlbHBlcnMuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL2RlY3J5cHRpbmdfYXVkaW9fZGVjb2Rlci5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay5oIgotCi11c2luZyA6OnRlc3Rpbmc6Ol87Ci11c2luZyA6OnRlc3Rpbmc6OkF0TW9zdDsKLXVzaW5nIDo6dGVzdGluZzo6SXNOdWxsOwotdXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm5SZWY7Ci11c2luZyA6OnRlc3Rpbmc6OlNhdmVBcmc7Ci11c2luZyA6OnRlc3Rpbmc6OlN0cmljdE1vY2s7Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLXN0YXRpYyBjb25zdCBpbnQga0Zha2VBdWRpb0ZyYW1lU2l6ZSA9IDE2Owotc3RhdGljIGNvbnN0IHVpbnQ4IGtGYWtlS2V5SWRbXSA9IHsgMHg0YiwgMHg2NSwgMHg3OSwgMHgyMCwgMHg0OSwgMHg0NCB9Owotc3RhdGljIGNvbnN0IHVpbnQ4IGtGYWtlSXZbRGVjcnlwdENvbmZpZzo6a0RlY3J5cHRpb25LZXlTaXplXSA9IHsgMCB9OwotCi0vLyBDcmVhdGUgYSBmYWtlIG5vbi1lbXB0eSBlbmNyeXB0ZWQgYnVmZmVyLgotc3RhdGljIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gQ3JlYXRlRmFrZUVuY3J5cHRlZEJ1ZmZlcigpIHsKLSAgY29uc3QgaW50IGJ1ZmZlcl9zaXplID0gMTY7ICAvLyBOZWVkIGEgbm9uLWVtcHR5IGJ1ZmZlcjsKLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBidWZmZXIobmV3IERlY29kZXJCdWZmZXIoYnVmZmVyX3NpemUpKTsKLSAgYnVmZmVyLT5TZXREZWNyeXB0Q29uZmlnKHNjb3BlZF9wdHI8RGVjcnlwdENvbmZpZz4obmV3IERlY3J5cHRDb25maWcoCi0gICAgICBzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihrRmFrZUtleUlkKSwKLSAgICAgICAgICAgICAgICAgIGFycmF5c2l6ZShrRmFrZUtleUlkKSksCi0gICAgICBzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihrRmFrZUl2KSwgYXJyYXlzaXplKGtGYWtlSXYpKSwKLSAgICAgIDAsCi0gICAgICBzdGQ6OnZlY3RvcjxTdWJzYW1wbGVFbnRyeT4oKSkpKTsKLSAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotLy8gVXNlIGFub255bW91cyBuYW1lc3BhY2UgaGVyZSB0byBwcmV2ZW50IHRoZSBhY3Rpb25zIHRvIGJlIGRlZmluZWQgbXVsdGlwbGUKLS8vIHRpbWVzIGFjcm9zcyBtdWx0aXBsZSB0ZXN0IGZpbGVzLiBTYWRseSB3ZSBjYW4ndCB1c2Ugc3RhdGljIGZvciB0aGVtLgotbmFtZXNwYWNlIHsKLQotQUNUSU9OX1AoUmV0dXJuQnVmZmVyLCBidWZmZXIpIHsKLSAgYXJnMC5SdW4oYnVmZmVyID8gRGVtdXhlclN0cmVhbTo6a09rIDogRGVtdXhlclN0cmVhbTo6a0Fib3J0ZWQsIGJ1ZmZlcik7Ci19Ci0KLUFDVElPTl9QKFJ1bkNhbGxiYWNrSWZOb3ROdWxsLCBwYXJhbSkgewotICBpZiAoIWFyZzAuaXNfbnVsbCgpKQotICAgIGFyZzAuUnVuKHBhcmFtKTsKLX0KLQotQUNUSU9OX1AyKFJlc2V0QW5kUnVuQ2FsbGJhY2ssIGNhbGxiYWNrLCBwYXJhbSkgewotICBiYXNlOjpSZXNldEFuZFJldHVybihjYWxsYmFjaykuUnVuKHBhcmFtKTsKLX0KLQotTUFUQ0hFUihJc0VuZE9mU3RyZWFtLCAiZW5kIG9mIHN0cmVhbSIpIHsKLSAgcmV0dXJuIChhcmctPklzRW5kT2ZTdHJlYW0oKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1jbGFzcyBEZWNyeXB0aW5nQXVkaW9EZWNvZGVyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gIERlY3J5cHRpbmdBdWRpb0RlY29kZXJUZXN0KCkKLSAgICAgIDogZGVjb2Rlcl8obmV3IERlY3J5cHRpbmdBdWRpb0RlY29kZXIoCi0gICAgICAgICAgICBtZXNzYWdlX2xvb3BfLm1lc3NhZ2VfbG9vcF9wcm94eSgpLAotICAgICAgICAgICAgYmFzZTo6QmluZCgKLSAgICAgICAgICAgICAgICAmRGVjcnlwdGluZ0F1ZGlvRGVjb2RlclRlc3Q6OlJlcXVlc3REZWNyeXB0b3JOb3RpZmljYXRpb24sCi0gICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpKSwKLSAgICAgICAgZGVjcnlwdG9yXyhuZXcgU3RyaWN0TW9jazxNb2NrRGVjcnlwdG9yPigpKSwKLSAgICAgICAgZGVtdXhlcl8obmV3IFN0cmljdE1vY2s8TW9ja0RlbXV4ZXJTdHJlYW0+KCkpLAotICAgICAgICBlbmNyeXB0ZWRfYnVmZmVyXyhDcmVhdGVGYWtlRW5jcnlwdGVkQnVmZmVyKCkpLAotICAgICAgICBkZWNvZGVkX2ZyYW1lXyhOVUxMKSwKLSAgICAgICAgZW5kX29mX3N0cmVhbV9mcmFtZV8obmV3IERhdGFCdWZmZXIoMCkpLAotICAgICAgICBkZWNvZGVkX2ZyYW1lX2xpc3RfKCkgewotICAgIHNjb3BlZF9yZWZwdHI8RGF0YUJ1ZmZlcj4gZGF0YV9idWZmZXIgPSBuZXcgRGF0YUJ1ZmZlcihrRmFrZUF1ZGlvRnJhbWVTaXplKTsKLSAgICBkYXRhX2J1ZmZlci0+U2V0RGF0YVNpemUoa0Zha2VBdWRpb0ZyYW1lU2l6ZSk7Ci0gICAgLy8gfGRlY29kZWRfZnJhbWVffCBjb250YWlucyByYW5kb20gZGF0YS4KLSAgICBkZWNvZGVkX2ZyYW1lXyA9IGRhdGFfYnVmZmVyOwotICAgIGRlY29kZWRfZnJhbWVfbGlzdF8ucHVzaF9iYWNrKGRlY29kZWRfZnJhbWVfKTsKLSAgfQotCi0gIHZvaWQgSW5pdGlhbGl6ZUFuZEV4cGVjdFN0YXR1cyhjb25zdCBBdWRpb0RlY29kZXJDb25maWcmIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lU3RhdHVzIHN0YXR1cykgewotICAgIEVYUEVDVF9DQUxMKCpkZW11eGVyXywgYXVkaW9fZGVjb2Rlcl9jb25maWcoKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVyblJlZihjb25maWcpKTsKLQotICAgIGRlY29kZXJfLT5Jbml0aWFsaXplKGRlbXV4ZXJfLCBOZXdFeHBlY3RlZFN0YXR1c0NCKHN0YXR1cyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmTW9ja1N0YXRpc3RpY3NDQjo6T25TdGF0aXN0aWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCgmc3RhdGlzdGljc19jYl8pKSk7Ci0gICAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLSAgfQotCi0gIHZvaWQgSW5pdGlhbGl6ZSgpIHsKLSAgICBFWFBFQ1RfQ0FMTCgqZGVjcnlwdG9yXywgSW5pdGlhbGl6ZUF1ZGlvRGVjb2Rlck1vY2soXywgXykpCi0gICAgICAgIC5UaW1lcyhBdE1vc3QoMSkpCi0gICAgICAgIC5XaWxsT25jZShSdW5DYWxsYmFjazwxPih0cnVlKSk7Ci0gICAgRVhQRUNUX0NBTEwoKnRoaXMsIFJlcXVlc3REZWNyeXB0b3JOb3RpZmljYXRpb24oXykpCi0gICAgICAgIC5XaWxsT25jZShSdW5DYWxsYmFja0lmTm90TnVsbChkZWNyeXB0b3JfLmdldCgpKSk7Ci0gICAgRVhQRUNUX0NBTEwoKmRlY3J5cHRvcl8sIFJlZ2lzdGVyS2V5QWRkZWRDQihEZWNyeXB0b3I6OmtBdWRpbywgXykpCi0gICAgICAgIC5XaWxsT25jZShTYXZlQXJnPDE+KCZrZXlfYWRkZWRfY2JfKSk7Ci0KLSAgICBjb25maWdfLkluaXRpYWxpemUoa0NvZGVjVm9yYmlzLCAxNiwgQ0hBTk5FTF9MQVlPVVRfU1RFUkVPLCA0NDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgSW5pdGlhbGl6ZUFuZEV4cGVjdFN0YXR1cyhjb25maWdfLCBQSVBFTElORV9PSyk7Ci0KLSAgICBFWFBFQ1RfRVEoY29uZmlnXy5iaXRzX3Blcl9jaGFubmVsKCksIGRlY29kZXJfLT5iaXRzX3Blcl9jaGFubmVsKCkpOwotICAgIEVYUEVDVF9FUShjb25maWdfLmNoYW5uZWxfbGF5b3V0KCksIGRlY29kZXJfLT5jaGFubmVsX2xheW91dCgpKTsKLSAgICBFWFBFQ1RfRVEoY29uZmlnXy5zYW1wbGVzX3Blcl9zZWNvbmQoKSwgZGVjb2Rlcl8tPnNhbXBsZXNfcGVyX3NlY29uZCgpKTsKLSAgfQotCi0gIHZvaWQgUmVhZEFuZEV4cGVjdEZyYW1lUmVhZHlXaXRoKAotICAgICAgQXVkaW9EZWNvZGVyOjpTdGF0dXMgc3RhdHVzLAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxCdWZmZXI+JiBhdWRpb19mcmFtZSkgewotICAgIGlmIChzdGF0dXMgIT0gQXVkaW9EZWNvZGVyOjprT2spCi0gICAgICBFWFBFQ1RfQ0FMTCgqdGhpcywgRnJhbWVSZWFkeShzdGF0dXMsIElzTnVsbCgpKSk7Ci0gICAgZWxzZSBpZiAoYXVkaW9fZnJhbWUtPklzRW5kT2ZTdHJlYW0oKSkKLSAgICAgIEVYUEVDVF9DQUxMKCp0aGlzLCBGcmFtZVJlYWR5KHN0YXR1cywgSXNFbmRPZlN0cmVhbSgpKSk7Ci0gICAgZWxzZQotICAgICAgRVhQRUNUX0NBTEwoKnRoaXMsIEZyYW1lUmVhZHkoc3RhdHVzLCBhdWRpb19mcmFtZSkpOwotCi0gICAgZGVjb2Rlcl8tPlJlYWQoYmFzZTo6QmluZCgmRGVjcnlwdGluZ0F1ZGlvRGVjb2RlclRlc3Q6OkZyYW1lUmVhZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gICAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLSAgfQotCi0gIC8vIFNldHMgdXAgZXhwZWN0YXRpb25zIGFuZCBhY3Rpb25zIHRvIHB1dCBEZWNyeXB0aW5nQXVkaW9EZWNvZGVyIGluIGFuCi0gIC8vIGFjdGl2ZSBub3JtYWwgZGVjb2Rpbmcgc3RhdGUuCi0gIHZvaWQgRW50ZXJOb3JtYWxEZWNvZGluZ1N0YXRlKCkgewotICAgIERlY3J5cHRvcjo6QXVkaW9CdWZmZXJzIGVuZF9vZl9zdHJlYW1fZnJhbWVzXygxLCBlbmRfb2Zfc3RyZWFtX2ZyYW1lXyk7Ci0KLSAgICBFWFBFQ1RfQ0FMTCgqZGVtdXhlcl8sIFJlYWQoXykpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm5CdWZmZXIoZW5jcnlwdGVkX2J1ZmZlcl8pKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuQnVmZmVyKERlY29kZXJCdWZmZXI6OkNyZWF0ZUVPU0J1ZmZlcigpKSk7Ci0gICAgRVhQRUNUX0NBTEwoKmRlY3J5cHRvcl8sIERlY3J5cHRBbmREZWNvZGVBdWRpbyhfLCBfKSkKLSAgICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrPDE+KERlY3J5cHRvcjo6a1N1Y2Nlc3MsIGRlY29kZWRfZnJhbWVfbGlzdF8pKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUnVuQ2FsbGJhY2s8MT4oRGVjcnlwdG9yOjprTmVlZE1vcmVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdG9yOjpBdWRpb0J1ZmZlcnMoKSkpOwotICAgIEVYUEVDVF9DQUxMKHN0YXRpc3RpY3NfY2JfLCBPblN0YXRpc3RpY3MoXykpOwotCi0gICAgUmVhZEFuZEV4cGVjdEZyYW1lUmVhZHlXaXRoKEF1ZGlvRGVjb2Rlcjo6a09rLCBkZWNvZGVkX2ZyYW1lXyk7Ci0gIH0KLQotICAvLyBTZXRzIHVwIGV4cGVjdGF0aW9ucyBhbmQgYWN0aW9ucyB0byBwdXQgRGVjcnlwdGluZ0F1ZGlvRGVjb2RlciBpbiBhbiBlbmQKLSAgLy8gb2Ygc3RyZWFtIHN0YXRlLiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyCi0gIC8vIEVudGVyTm9ybWFsRGVjb2RpbmdTdGF0ZSgpIHRvIHdvcmsuCi0gIHZvaWQgRW50ZXJFbmRPZlN0cmVhbVN0YXRlKCkgewotICAgIFJlYWRBbmRFeHBlY3RGcmFtZVJlYWR5V2l0aChBdWRpb0RlY29kZXI6OmtPaywgZW5kX29mX3N0cmVhbV9mcmFtZV8pOwotICB9Ci0KLSAgLy8gTWFrZSB0aGUgcmVhZCBjYWxsYmFjayBwZW5kaW5nIGJ5IHNhdmluZyBhbmQgbm90IGZpcmluZyBpdC4KLSAgdm9pZCBFbnRlclBlbmRpbmdSZWFkU3RhdGUoKSB7Ci0gICAgRVhQRUNUX1RSVUUocGVuZGluZ19kZW11eGVyX3JlYWRfY2JfLmlzX251bGwoKSk7Ci0gICAgRVhQRUNUX0NBTEwoKmRlbXV4ZXJfLCBSZWFkKF8pKQotICAgICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwwPigmcGVuZGluZ19kZW11eGVyX3JlYWRfY2JfKSk7Ci0gICAgZGVjb2Rlcl8tPlJlYWQoYmFzZTo6QmluZCgmRGVjcnlwdGluZ0F1ZGlvRGVjb2RlclRlc3Q6OkZyYW1lUmVhZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gICAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLSAgICAvLyBNYWtlIHN1cmUgdGhlIFJlYWQoKSBvbiB0aGUgZGVjb2RlciB0cmlnZ2VycyBhIFJlYWQoKSBvbiB0aGUgZGVtdXhlci4KLSAgICBFWFBFQ1RfRkFMU0UocGVuZGluZ19kZW11eGVyX3JlYWRfY2JfLmlzX251bGwoKSk7Ci0gIH0KLQotICAvLyBNYWtlIHRoZSBhdWRpbyBkZWNvZGUgY2FsbGJhY2sgcGVuZGluZyBieSBzYXZpbmcgYW5kIG5vdCBmaXJpbmcgaXQuCi0gIHZvaWQgRW50ZXJQZW5kaW5nRGVjb2RlU3RhdGUoKSB7Ci0gICAgRVhQRUNUX1RSVUUocGVuZGluZ19hdWRpb19kZWNvZGVfY2JfLmlzX251bGwoKSk7Ci0gICAgRVhQRUNUX0NBTEwoKmRlbXV4ZXJfLCBSZWFkKF8pKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuQnVmZmVyKGVuY3J5cHRlZF9idWZmZXJfKSk7Ci0gICAgRVhQRUNUX0NBTEwoKmRlY3J5cHRvcl8sIERlY3J5cHRBbmREZWNvZGVBdWRpbyhlbmNyeXB0ZWRfYnVmZmVyXywgXykpCi0gICAgICAgIC5XaWxsT25jZShTYXZlQXJnPDE+KCZwZW5kaW5nX2F1ZGlvX2RlY29kZV9jYl8pKTsKLQotICAgIGRlY29kZXJfLT5SZWFkKGJhc2U6OkJpbmQoJkRlY3J5cHRpbmdBdWRpb0RlY29kZXJUZXN0OjpGcmFtZVJlYWR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICAgIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci0gICAgLy8gTWFrZSBzdXJlIHRoZSBSZWFkKCkgb24gdGhlIGRlY29kZXIgdHJpZ2dlcnMgYSBEZWNyeXB0QW5kRGVjb2RlKCkgb24gdGhlCi0gICAgLy8gZGVjcnlwdG9yLgotICAgIEVYUEVDVF9GQUxTRShwZW5kaW5nX2F1ZGlvX2RlY29kZV9jYl8uaXNfbnVsbCgpKTsKLSAgfQotCi0gIHZvaWQgRW50ZXJXYWl0aW5nRm9yS2V5U3RhdGUoKSB7Ci0gICAgRVhQRUNUX0NBTEwoKmRlbXV4ZXJfLCBSZWFkKF8pKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuQnVmZmVyKGVuY3J5cHRlZF9idWZmZXJfKSk7Ci0gICAgRVhQRUNUX0NBTEwoKmRlY3J5cHRvcl8sIERlY3J5cHRBbmREZWNvZGVBdWRpbyhlbmNyeXB0ZWRfYnVmZmVyXywgXykpCi0gICAgICAgIC5XaWxsUmVwZWF0ZWRseShSdW5DYWxsYmFjazwxPihEZWNyeXB0b3I6OmtOb0tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRvcjo6QXVkaW9CdWZmZXJzKCkpKTsKLSAgICBkZWNvZGVyXy0+UmVhZChiYXNlOjpCaW5kKCZEZWNyeXB0aW5nQXVkaW9EZWNvZGVyVGVzdDo6RnJhbWVSZWFkeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLSAgICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotICB9Ci0KLSAgdm9pZCBBYm9ydFBlbmRpbmdBdWRpb0RlY29kZUNCKCkgewotICAgIGlmICghcGVuZGluZ19hdWRpb19kZWNvZGVfY2JfLmlzX251bGwoKSkgewotICAgICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnBlbmRpbmdfYXVkaW9fZGVjb2RlX2NiXykuUnVuKAotICAgICAgICAgIERlY3J5cHRvcjo6a1N1Y2Nlc3MsIERlY3J5cHRvcjo6QXVkaW9CdWZmZXJzKCkpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgUmVzZXQoKSB7Ci0gICAgRVhQRUNUX0NBTEwoKmRlY3J5cHRvcl8sIFJlc2V0RGVjb2RlcihEZWNyeXB0b3I6OmtBdWRpbykpCi0gICAgICAgIC5XaWxsUmVwZWF0ZWRseShJbnZva2VXaXRob3V0QXJncygKLSAgICAgICAgICAgIHRoaXMsICZEZWNyeXB0aW5nQXVkaW9EZWNvZGVyVGVzdDo6QWJvcnRQZW5kaW5nQXVkaW9EZWNvZGVDQikpOwotCi0gICAgZGVjb2Rlcl8tPlJlc2V0KE5ld0V4cGVjdGVkQ2xvc3VyZSgpKTsKLSAgICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotICB9Ci0KLSAgTU9DS19NRVRIT0QxKFJlcXVlc3REZWNyeXB0b3JOb3RpZmljYXRpb24sIHZvaWQoY29uc3QgRGVjcnlwdG9yUmVhZHlDQiYpKTsKLQotICBNT0NLX01FVEhPRDIoRnJhbWVSZWFkeSwgdm9pZChBdWRpb0RlY29kZXI6OlN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxCdWZmZXI+JikpOwotCi0gIE1lc3NhZ2VMb29wIG1lc3NhZ2VfbG9vcF87Ci0gIHNjb3BlZF9yZWZwdHI8RGVjcnlwdGluZ0F1ZGlvRGVjb2Rlcj4gZGVjb2Rlcl87Ci0gIHNjb3BlZF9wdHI8U3RyaWN0TW9jazxNb2NrRGVjcnlwdG9yPiA+IGRlY3J5cHRvcl87Ci0gIHNjb3BlZF9yZWZwdHI8U3RyaWN0TW9jazxNb2NrRGVtdXhlclN0cmVhbT4gPiBkZW11eGVyXzsKLSAgTW9ja1N0YXRpc3RpY3NDQiBzdGF0aXN0aWNzX2NiXzsKLSAgQXVkaW9EZWNvZGVyQ29uZmlnIGNvbmZpZ187Ci0KLSAgRGVtdXhlclN0cmVhbTo6UmVhZENCIHBlbmRpbmdfZGVtdXhlcl9yZWFkX2NiXzsKLSAgRGVjcnlwdG9yOjpEZWNvZGVySW5pdENCIHBlbmRpbmdfaW5pdF9jYl87Ci0gIERlY3J5cHRvcjo6S2V5QWRkZWRDQiBrZXlfYWRkZWRfY2JfOwotICBEZWNyeXB0b3I6OkF1ZGlvRGVjb2RlQ0IgcGVuZGluZ19hdWRpb19kZWNvZGVfY2JfOwotCi0gIC8vIENvbnN0YW50IGJ1ZmZlci9mcmFtZXMgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIHxkZW11eGVyX3wgYW5kIHxkZWNyeXB0b3JffC4KLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBlbmNyeXB0ZWRfYnVmZmVyXzsKLSAgc2NvcGVkX3JlZnB0cjxCdWZmZXI+IGRlY29kZWRfZnJhbWVfOwotICBzY29wZWRfcmVmcHRyPEJ1ZmZlcj4gZW5kX29mX3N0cmVhbV9mcmFtZV87Ci0gIERlY3J5cHRvcjo6QXVkaW9CdWZmZXJzIGRlY29kZWRfZnJhbWVfbGlzdF87Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRGVjcnlwdGluZ0F1ZGlvRGVjb2RlclRlc3QpOwotfTsKLQotVEVTVF9GKERlY3J5cHRpbmdBdWRpb0RlY29kZXJUZXN0LCBJbml0aWFsaXplX05vcm1hbCkgewotICBJbml0aWFsaXplKCk7Ci19Ci0KLS8vIEVuc3VyZSB0aGF0IERlY3J5cHRpbmdBdWRpb0RlY29kZXIgb25seSBhY2NlcHRzIGVuY3J5cHRlZCBhdWRpby4KLVRFU1RfRihEZWNyeXB0aW5nQXVkaW9EZWNvZGVyVGVzdCwgSW5pdGlhbGl6ZV9VbmVuY3J5cHRlZEF1ZGlvQ29uZmlnKSB7Ci0gIEF1ZGlvRGVjb2RlckNvbmZpZyBjb25maWcoa0NvZGVjVm9yYmlzLCAxNiwgQ0hBTk5FTF9MQVlPVVRfU1RFUkVPLCA0NDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBmYWxzZSk7Ci0KLSAgSW5pdGlhbGl6ZUFuZEV4cGVjdFN0YXR1cyhjb25maWcsIERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCk7Ci19Ci0KLS8vIEVuc3VyZSBkZWNvZGVyIGhhbmRsZXMgaW52YWxpZCBhdWRpbyBjb25maWdzIHdpdGhvdXQgY3Jhc2hpbmcuCi1URVNUX0YoRGVjcnlwdGluZ0F1ZGlvRGVjb2RlclRlc3QsIEluaXRpYWxpemVfSW52YWxpZEF1ZGlvQ29uZmlnKSB7Ci0gIEF1ZGlvRGVjb2RlckNvbmZpZyBjb25maWcoa1Vua25vd25BdWRpb0NvZGVjLCAwLCBDSEFOTkVMX0xBWU9VVF9TVEVSRU8sIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgdHJ1ZSk7Ci0KLSAgSW5pdGlhbGl6ZUFuZEV4cGVjdFN0YXR1cyhjb25maWcsIFBJUEVMSU5FX0VSUk9SX0RFQ09ERSk7Ci19Ci0KLS8vIEVuc3VyZSBkZWNvZGVyIGhhbmRsZXMgdW5zdXBwb3J0ZWQgYXVkaW8gY29uZmlncyB3aXRob3V0IGNyYXNoaW5nLgotVEVTVF9GKERlY3J5cHRpbmdBdWRpb0RlY29kZXJUZXN0LCBJbml0aWFsaXplX1Vuc3VwcG9ydGVkQXVkaW9Db25maWcpIHsKLSAgRVhQRUNUX0NBTEwoKmRlY3J5cHRvcl8sIEluaXRpYWxpemVBdWRpb0RlY29kZXJNb2NrKF8sIF8pKQotICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrPDE+KGZhbHNlKSk7Ci0gIEVYUEVDVF9DQUxMKCp0aGlzLCBSZXF1ZXN0RGVjcnlwdG9yTm90aWZpY2F0aW9uKF8pKQotICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrSWZOb3ROdWxsKGRlY3J5cHRvcl8uZ2V0KCkpKTsKLQotICBBdWRpb0RlY29kZXJDb25maWcgY29uZmlnKGtDb2RlY1ZvcmJpcywgMTYsIENIQU5ORUxfTEFZT1VUX1NURVJFTywgNDQxMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgdHJ1ZSk7Ci0gIEluaXRpYWxpemVBbmRFeHBlY3RTdGF0dXMoY29uZmlnLCBERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQpOwotfQotCi1URVNUX0YoRGVjcnlwdGluZ0F1ZGlvRGVjb2RlclRlc3QsIEluaXRpYWxpemVfTnVsbERlY3J5cHRvcikgewotICBFWFBFQ1RfQ0FMTCgqdGhpcywgUmVxdWVzdERlY3J5cHRvck5vdGlmaWNhdGlvbihfKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSdW5DYWxsYmFja0lmTm90TnVsbChzdGF0aWNfY2FzdDxEZWNyeXB0b3IqPihOVUxMKSkpOwotCi0gIEF1ZGlvRGVjb2RlckNvbmZpZyBjb25maWcoa0NvZGVjVm9yYmlzLCBrU2FtcGxlRm9ybWF0UGxhbmFyRjMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTEFZT1VUX1NURVJFTywgNDQxMDAsIE5VTEwsIDAsIHRydWUpOwotICBJbml0aWFsaXplQW5kRXhwZWN0U3RhdHVzKGNvbmZpZywgREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVEKTsKLX0KLQotLy8gVGVzdCBub3JtYWwgZGVjcnlwdCBhbmQgZGVjb2RlIGNhc2UuCi1URVNUX0YoRGVjcnlwdGluZ0F1ZGlvRGVjb2RlclRlc3QsIERlY3J5cHRBbmREZWNvZGVfTm9ybWFsKSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgRW50ZXJOb3JtYWxEZWNvZGluZ1N0YXRlKCk7Ci19Ci0KLS8vIFRlc3QgdGhlIGNhc2Ugd2hlcmUgdGhlIGRlY3J5cHRvciByZXR1cm5zIGVycm9yIHdoZW4gZG9pbmcgZGVjcnlwdCBhbmQKLS8vIGRlY29kZS4KLVRFU1RfRihEZWNyeXB0aW5nQXVkaW9EZWNvZGVyVGVzdCwgRGVjcnlwdEFuZERlY29kZV9EZWNvZGVFcnJvcikgewotICBJbml0aWFsaXplKCk7Ci0KLSAgRVhQRUNUX0NBTEwoKmRlbXV4ZXJfLCBSZWFkKF8pKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybkJ1ZmZlcihlbmNyeXB0ZWRfYnVmZmVyXykpOwotICBFWFBFQ1RfQ0FMTCgqZGVjcnlwdG9yXywgRGVjcnlwdEFuZERlY29kZUF1ZGlvKF8sIF8pKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJ1bkNhbGxiYWNrPDE+KERlY3J5cHRvcjo6a0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRvcjo6QXVkaW9CdWZmZXJzKCkpKTsKLQotICBSZWFkQW5kRXhwZWN0RnJhbWVSZWFkeVdpdGgoQXVkaW9EZWNvZGVyOjprRGVjb2RlRXJyb3IsIE5VTEwpOwotfQotCi0vLyBUZXN0IHRoZSBjYXNlIHdoZXJlIHRoZSBkZWNyeXB0b3IgcmV0dXJucyBrTmVlZE1vcmVEYXRhIHRvIGFzayBmb3IgbW9yZQotLy8gYnVmZmVycyBiZWZvcmUgaXQgY2FuIHByb2R1Y2UgYSBmcmFtZS4KLVRFU1RfRihEZWNyeXB0aW5nQXVkaW9EZWNvZGVyVGVzdCwgRGVjcnlwdEFuZERlY29kZV9OZWVkTW9yZURhdGEpIHsKLSAgSW5pdGlhbGl6ZSgpOwotCi0gIEVYUEVDVF9DQUxMKCpkZW11eGVyXywgUmVhZChfKSkKLSAgICAgIC5UaW1lcygyKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybkJ1ZmZlcihlbmNyeXB0ZWRfYnVmZmVyXykpOwotICBFWFBFQ1RfQ0FMTCgqZGVjcnlwdG9yXywgRGVjcnlwdEFuZERlY29kZUF1ZGlvKF8sIF8pKQotICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrPDE+KERlY3J5cHRvcjo6a05lZWRNb3JlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0b3I6OkF1ZGlvQnVmZmVycygpKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSdW5DYWxsYmFjazwxPihEZWNyeXB0b3I6OmtTdWNjZXNzLCBkZWNvZGVkX2ZyYW1lX2xpc3RfKSk7Ci0gIEVYUEVDVF9DQUxMKHN0YXRpc3RpY3NfY2JfLCBPblN0YXRpc3RpY3MoXykpCi0gICAgICAuVGltZXMoMik7Ci0KLSAgUmVhZEFuZEV4cGVjdEZyYW1lUmVhZHlXaXRoKEF1ZGlvRGVjb2Rlcjo6a09rLCBkZWNvZGVkX2ZyYW1lXyk7Ci19Ci0KLS8vIFRlc3QgdGhlIGNhc2Ugd2hlcmUgdGhlIGRlY3J5cHRvciByZXR1cm5zIG11bHRpcGxlIGRlY29kZWQgZnJhbWVzLgotVEVTVF9GKERlY3J5cHRpbmdBdWRpb0RlY29kZXJUZXN0LCBEZWNyeXB0QW5kRGVjb2RlX011bHRpcGxlRnJhbWVzKSB7Ci0gIEluaXRpYWxpemUoKTsKLQotICBzY29wZWRfcmVmcHRyPERhdGFCdWZmZXI+IGZyYW1lX2EgPSBuZXcgRGF0YUJ1ZmZlcihrRmFrZUF1ZGlvRnJhbWVTaXplKTsKLSAgZnJhbWVfYS0+U2V0RGF0YVNpemUoa0Zha2VBdWRpb0ZyYW1lU2l6ZSk7Ci0gIHNjb3BlZF9yZWZwdHI8RGF0YUJ1ZmZlcj4gZnJhbWVfYiA9IG5ldyBEYXRhQnVmZmVyKGtGYWtlQXVkaW9GcmFtZVNpemUpOwotICBmcmFtZV9iLT5TZXREYXRhU2l6ZShrRmFrZUF1ZGlvRnJhbWVTaXplKTsKLSAgZGVjb2RlZF9mcmFtZV9saXN0Xy5wdXNoX2JhY2soZnJhbWVfYSk7Ci0gIGRlY29kZWRfZnJhbWVfbGlzdF8ucHVzaF9iYWNrKGZyYW1lX2IpOwotCi0gIEVYUEVDVF9DQUxMKCpkZW11eGVyXywgUmVhZChfKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm5CdWZmZXIoZW5jcnlwdGVkX2J1ZmZlcl8pKTsKLSAgRVhQRUNUX0NBTEwoKmRlY3J5cHRvcl8sIERlY3J5cHRBbmREZWNvZGVBdWRpbyhfLCBfKSkKLSAgICAgIC5XaWxsT25jZShSdW5DYWxsYmFjazwxPihEZWNyeXB0b3I6OmtTdWNjZXNzLCBkZWNvZGVkX2ZyYW1lX2xpc3RfKSk7Ci0gIEVYUEVDVF9DQUxMKHN0YXRpc3RpY3NfY2JfLCBPblN0YXRpc3RpY3MoXykpOwotCi0gIFJlYWRBbmRFeHBlY3RGcmFtZVJlYWR5V2l0aChBdWRpb0RlY29kZXI6OmtPaywgZGVjb2RlZF9mcmFtZV8pOwotICBSZWFkQW5kRXhwZWN0RnJhbWVSZWFkeVdpdGgoQXVkaW9EZWNvZGVyOjprT2ssIGZyYW1lX2EpOwotICBSZWFkQW5kRXhwZWN0RnJhbWVSZWFkeVdpdGgoQXVkaW9EZWNvZGVyOjprT2ssIGZyYW1lX2IpOwotfQotCi0vLyBUZXN0IHRoZSBjYXNlIHdoZXJlIHRoZSBkZWNyeXB0b3IgcmVjZWl2ZXMgZW5kLW9mLXN0cmVhbSBidWZmZXIuCi1URVNUX0YoRGVjcnlwdGluZ0F1ZGlvRGVjb2RlclRlc3QsIERlY3J5cHRBbmREZWNvZGVfRW5kT2ZTdHJlYW0pIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBFbnRlck5vcm1hbERlY29kaW5nU3RhdGUoKTsKLSAgRW50ZXJFbmRPZlN0cmVhbVN0YXRlKCk7Ci19Ci0KLS8vIFRlc3QgYWJvcnRlZCByZWFkIG9uIHRoZSBkZW11eGVyIHN0cmVhbS4KLVRFU1RfRihEZWNyeXB0aW5nQXVkaW9EZWNvZGVyVGVzdCwgRGVtdXhlclJlYWRfQWJvcnRlZCkgewotICBJbml0aWFsaXplKCk7Ci0KLSAgLy8gUmV0dXJuQnVmZmVyKCkgd2l0aCBOVUxMIHRyaWdnZXJzIGFib3J0ZWQgZGVtdXhlciByZWFkLgotICBFWFBFQ1RfQ0FMTCgqZGVtdXhlcl8sIFJlYWQoXykpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuQnVmZmVyKHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4oKSkpOwotCi0gIFJlYWRBbmRFeHBlY3RGcmFtZVJlYWR5V2l0aChBdWRpb0RlY29kZXI6OmtBYm9ydGVkLCBOVUxMKTsKLX0KLQotLy8gVGVzdCBjb25maWcgY2hhbmdlIG9uIHRoZSBkZW11eGVyIHN0cmVhbS4KLVRFU1RfRihEZWNyeXB0aW5nQXVkaW9EZWNvZGVyVGVzdCwgRGVtdXhlclJlYWRfQ29uZmlnQ2hhbmdlKSB7Ci0gIEluaXRpYWxpemUoKTsKLQotICBFWFBFQ1RfQ0FMTCgqZGVjcnlwdG9yXywgRGVpbml0aWFsaXplRGVjb2RlcihEZWNyeXB0b3I6OmtBdWRpbykpOwotICBFWFBFQ1RfQ0FMTCgqZGVjcnlwdG9yXywgSW5pdGlhbGl6ZUF1ZGlvRGVjb2Rlck1vY2soXywgXykpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MT4odHJ1ZSkpOwotICBFWFBFQ1RfQ0FMTCgqZGVtdXhlcl8sIFJlYWQoXykpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MD4oRGVtdXhlclN0cmVhbTo6a0NvbmZpZ0NoYW5nZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPigpKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm5CdWZmZXIoZW5jcnlwdGVkX2J1ZmZlcl8pKTsKLSAgRVhQRUNUX0NBTEwoKmRlY3J5cHRvcl8sIERlY3J5cHRBbmREZWNvZGVBdWRpbyhfLCBfKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSdW5DYWxsYmFjazwxPihEZWNyeXB0b3I6OmtTdWNjZXNzLCBkZWNvZGVkX2ZyYW1lX2xpc3RfKSk7Ci0gIEVYUEVDVF9DQUxMKHN0YXRpc3RpY3NfY2JfLCBPblN0YXRpc3RpY3MoXykpOwotCi0gIFJlYWRBbmRFeHBlY3RGcmFtZVJlYWR5V2l0aChBdWRpb0RlY29kZXI6OmtPaywgZGVjb2RlZF9mcmFtZV8pOwotfQotCi0vLyBUZXN0IGNvbmZpZyBjaGFuZ2UgZmFpbHVyZS4KLVRFU1RfRihEZWNyeXB0aW5nQXVkaW9EZWNvZGVyVGVzdCwgRGVtdXhlclJlYWRfQ29uZmlnQ2hhbmdlRmFpbGVkKSB7Ci0gIEluaXRpYWxpemUoKTsKLQotICBFWFBFQ1RfQ0FMTCgqZGVjcnlwdG9yXywgRGVpbml0aWFsaXplRGVjb2RlcihEZWNyeXB0b3I6OmtBdWRpbykpOwotICBFWFBFQ1RfQ0FMTCgqZGVjcnlwdG9yXywgSW5pdGlhbGl6ZUF1ZGlvRGVjb2Rlck1vY2soXywgXykpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MT4oZmFsc2UpKTsKLSAgRVhQRUNUX0NBTEwoKmRlbXV4ZXJfLCBSZWFkKF8pKQotICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrPDA+KERlbXV4ZXJTdHJlYW06OmtDb25maWdDaGFuZ2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4oKSkpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuQnVmZmVyKGVuY3J5cHRlZF9idWZmZXJfKSk7Ci0KLSAgUmVhZEFuZEV4cGVjdEZyYW1lUmVhZHlXaXRoKEF1ZGlvRGVjb2Rlcjo6a0RlY29kZUVycm9yLCBOVUxMKTsKLX0KLQotLy8gVGVzdCB0aGUgY2FzZSB3aGVyZSB0aGUgYSBrZXkgaXMgYWRkZWQgd2hlbiB0aGUgZGVjcnlwdG9yIGlzIGluCi0vLyBrV2FpdGluZ0ZvcktleSBzdGF0ZS4KLVRFU1RfRihEZWNyeXB0aW5nQXVkaW9EZWNvZGVyVGVzdCwgS2V5QWRkZWRfRHVyaW5nV2FpdGluZ0ZvcktleSkgewotICBJbml0aWFsaXplKCk7Ci0gIEVudGVyV2FpdGluZ0ZvcktleVN0YXRlKCk7Ci0KLSAgRVhQRUNUX0NBTEwoKmRlY3J5cHRvcl8sIERlY3J5cHRBbmREZWNvZGVBdWRpbyhfLCBfKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSdW5DYWxsYmFjazwxPihEZWNyeXB0b3I6OmtTdWNjZXNzLCBkZWNvZGVkX2ZyYW1lX2xpc3RfKSk7Ci0gIEVYUEVDVF9DQUxMKHN0YXRpc3RpY3NfY2JfLCBPblN0YXRpc3RpY3MoXykpOwotICBFWFBFQ1RfQ0FMTCgqdGhpcywgRnJhbWVSZWFkeShBdWRpb0RlY29kZXI6OmtPaywgZGVjb2RlZF9mcmFtZV8pKTsKLSAga2V5X2FkZGVkX2NiXy5SdW4oKTsKLSAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLX0KLQotLy8gVGVzdCB0aGUgY2FzZSB3aGVyZSB0aGUgYSBrZXkgaXMgYWRkZWQgd2hlbiB0aGUgZGVjcnlwdG9yIGlzIGluCi0vLyBrUGVuZGluZ0RlY29kZSBzdGF0ZS4KLVRFU1RfRihEZWNyeXB0aW5nQXVkaW9EZWNvZGVyVGVzdCwgS2V5QWRkZWRfRHJ1aW5nUGVuZGluZ0RlY29kZSkgewotICBJbml0aWFsaXplKCk7Ci0gIEVudGVyUGVuZGluZ0RlY29kZVN0YXRlKCk7Ci0KLSAgRVhQRUNUX0NBTEwoKmRlY3J5cHRvcl8sIERlY3J5cHRBbmREZWNvZGVBdWRpbyhfLCBfKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSdW5DYWxsYmFjazwxPihEZWNyeXB0b3I6OmtTdWNjZXNzLCBkZWNvZGVkX2ZyYW1lX2xpc3RfKSk7Ci0gIEVYUEVDVF9DQUxMKHN0YXRpc3RpY3NfY2JfLCBPblN0YXRpc3RpY3MoXykpOwotICBFWFBFQ1RfQ0FMTCgqdGhpcywgRnJhbWVSZWFkeShBdWRpb0RlY29kZXI6OmtPaywgZGVjb2RlZF9mcmFtZV8pKTsKLSAgLy8gVGhlIGF1ZGlvIGRlY29kZSBjYWxsYmFjayBpcyByZXR1cm5lZCBhZnRlciB0aGUgY29ycmVjdCBkZWNyeXB0aW9uIGtleSBpcwotICAvLyBhZGRlZC4KLSAga2V5X2FkZGVkX2NiXy5SdW4oKTsKLSAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnBlbmRpbmdfYXVkaW9fZGVjb2RlX2NiXykuUnVuKAotICAgICAgRGVjcnlwdG9yOjprTm9LZXksIERlY3J5cHRvcjo6QXVkaW9CdWZmZXJzKCkpOwotICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotfQotCi0vLyBUZXN0IHJlc2V0dGluZyB3aGVuIHRoZSBkZWNvZGVyIGlzIGluIGtJZGxlIHN0YXRlIGJ1dCBoYXMgbm90IGRlY29kZWQgYW55Ci0vLyBmcmFtZS4KLVRFU1RfRihEZWNyeXB0aW5nQXVkaW9EZWNvZGVyVGVzdCwgUmVzZXRfRHVyaW5nSWRsZUFmdGVySW5pdGlhbGl6YXRpb24pIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBSZXNldCgpOwotfQotCi0vLyBUZXN0IHJlc2V0dGluZyB3aGVuIHRoZSBkZWNvZGVyIGlzIGluIGtJZGxlIHN0YXRlIGFmdGVyIGl0IGhhcyBkZWNvZGVkIG9uZQotLy8gZnJhbWUuCi1URVNUX0YoRGVjcnlwdGluZ0F1ZGlvRGVjb2RlclRlc3QsIFJlc2V0X0R1cmluZ0lkbGVBZnRlckRlY29kZWRPbmVGcmFtZSkgewotICBJbml0aWFsaXplKCk7Ci0gIEVudGVyTm9ybWFsRGVjb2RpbmdTdGF0ZSgpOwotICBSZXNldCgpOwotfQotCi0vLyBUZXN0IHJlc2V0dGluZyB3aGVuIHRoZSBkZWNvZGVyIGlzIGluIGtQZW5kaW5nRGVtdXhlclJlYWQgc3RhdGUgYW5kIHRoZSByZWFkCi0vLyBjYWxsYmFjayBpcyByZXR1cm5lZCB3aXRoIGtPay4KLVRFU1RfRihEZWNyeXB0aW5nQXVkaW9EZWNvZGVyVGVzdCwgUmVzZXRfRHVyaW5nRGVtdXhlclJlYWRfT2spIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBFbnRlclBlbmRpbmdSZWFkU3RhdGUoKTsKLQotICBFWFBFQ1RfQ0FMTCgqdGhpcywgRnJhbWVSZWFkeShBdWRpb0RlY29kZXI6OmtBYm9ydGVkLCBJc051bGwoKSkpOwotCi0gIFJlc2V0KCk7Ci0gIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZwZW5kaW5nX2RlbXV4ZXJfcmVhZF9jYl8pLlJ1bihEZW11eGVyU3RyZWFtOjprT2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWRfYnVmZmVyXyk7Ci0gIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci19Ci0KLS8vIFRlc3QgcmVzZXR0aW5nIHdoZW4gdGhlIGRlY29kZXIgaXMgaW4ga1BlbmRpbmdEZW11eGVyUmVhZCBzdGF0ZSBhbmQgdGhlIHJlYWQKLS8vIGNhbGxiYWNrIGlzIHJldHVybmVkIHdpdGgga0Fib3J0ZWQuCi1URVNUX0YoRGVjcnlwdGluZ0F1ZGlvRGVjb2RlclRlc3QsIFJlc2V0X0R1cmluZ0RlbXV4ZXJSZWFkX0Fib3J0ZWQpIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBFbnRlclBlbmRpbmdSZWFkU3RhdGUoKTsKLQotICAvLyBNYWtlIHN1cmUgd2UgZ2V0IGEgTlVMTCBhdWRpbyBmcmFtZSByZXR1cm5lZC4KLSAgRVhQRUNUX0NBTEwoKnRoaXMsIEZyYW1lUmVhZHkoQXVkaW9EZWNvZGVyOjprQWJvcnRlZCwgSXNOdWxsKCkpKTsKLQotICBSZXNldCgpOwotICBiYXNlOjpSZXNldEFuZFJldHVybigmcGVuZGluZ19kZW11eGVyX3JlYWRfY2JfKS5SdW4oRGVtdXhlclN0cmVhbTo6a0Fib3J0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLX0KLQotLy8gVGVzdCByZXNldHRpbmcgd2hlbiB0aGUgZGVjb2RlciBpcyBpbiBrUGVuZGluZ0RlbXV4ZXJSZWFkIHN0YXRlIGFuZCB0aGUgcmVhZAotLy8gY2FsbGJhY2sgaXMgcmV0dXJuZWQgd2l0aCBrQ29uZmlnQ2hhbmdlZC4KLVRFU1RfRihEZWNyeXB0aW5nQXVkaW9EZWNvZGVyVGVzdCwgUmVzZXRfRHVyaW5nRGVtdXhlclJlYWRfQ29uZmlnQ2hhbmdlKSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgRW50ZXJQZW5kaW5nUmVhZFN0YXRlKCk7Ci0KLSAgUmVzZXQoKTsKLQotICAvLyBFdmVuIGR1cmluZyBwZW5kaW5nIHJlc2V0LCB0aGUgZGVjb2RlciBzdGlsbCBuZWVkcyB0byBiZSBpbml0aWFsaXplZCB3aXRoCi0gIC8vIHRoZSBuZXcgY29uZmlnLgotICBFWFBFQ1RfQ0FMTCgqZGVjcnlwdG9yXywgRGVpbml0aWFsaXplRGVjb2RlcihEZWNyeXB0b3I6OmtBdWRpbykpOwotICBFWFBFQ1RfQ0FMTCgqZGVjcnlwdG9yXywgSW5pdGlhbGl6ZUF1ZGlvRGVjb2Rlck1vY2soXywgXykpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MT4odHJ1ZSkpOwotICBFWFBFQ1RfQ0FMTCgqdGhpcywgRnJhbWVSZWFkeShBdWRpb0RlY29kZXI6OmtBYm9ydGVkLCBJc051bGwoKSkpOwotCi0gIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZwZW5kaW5nX2RlbXV4ZXJfcmVhZF9jYl8pCi0gICAgICAuUnVuKERlbXV4ZXJTdHJlYW06OmtDb25maWdDaGFuZ2VkLCBOVUxMKTsKLSAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLX0KLQotLy8gVGVzdCByZXNldHRpbmcgd2hlbiB0aGUgZGVjb2RlciBpcyBpbiBrUGVuZGluZ0RlbXV4ZXJSZWFkIHN0YXRlLCB0aGUgcmVhZAotLy8gY2FsbGJhY2sgaXMgcmV0dXJuZWQgd2l0aCBrQ29uZmlnQ2hhbmdlZCBhbmQgdGhlIGNvbmZpZyBjaGFuZ2UgZmFpbHMuCi1URVNUX0YoRGVjcnlwdGluZ0F1ZGlvRGVjb2RlclRlc3QsIFJlc2V0X0R1cmluZ0RlbXV4ZXJSZWFkX0NvbmZpZ0NoYW5nZUZhaWxlZCkgewotICBJbml0aWFsaXplKCk7Ci0gIEVudGVyUGVuZGluZ1JlYWRTdGF0ZSgpOwotCi0gIFJlc2V0KCk7Ci0KLSAgLy8gRXZlbiBkdXJpbmcgcGVuZGluZyByZXNldCwgdGhlIGRlY29kZXIgc3RpbGwgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQgd2l0aAotICAvLyB0aGUgbmV3IGNvbmZpZy4KLSAgRVhQRUNUX0NBTEwoKmRlY3J5cHRvcl8sIERlaW5pdGlhbGl6ZURlY29kZXIoRGVjcnlwdG9yOjprQXVkaW8pKTsKLSAgRVhQRUNUX0NBTEwoKmRlY3J5cHRvcl8sIEluaXRpYWxpemVBdWRpb0RlY29kZXJNb2NrKF8sIF8pKQotICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrPDE+KGZhbHNlKSk7Ci0gIEVYUEVDVF9DQUxMKCp0aGlzLCBGcmFtZVJlYWR5KEF1ZGlvRGVjb2Rlcjo6a0RlY29kZUVycm9yLCBJc051bGwoKSkpOwotCi0gIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZwZW5kaW5nX2RlbXV4ZXJfcmVhZF9jYl8pCi0gICAgICAuUnVuKERlbXV4ZXJTdHJlYW06OmtDb25maWdDaGFuZ2VkLCBOVUxMKTsKLSAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLX0KLQotLy8gVGVzdCByZXNldHRpbmcgd2hlbiB0aGUgZGVjb2RlciBpcyBpbiBrUGVuZGluZ0NvbmZpZ0NoYW5nZSBzdGF0ZS4KLVRFU1RfRihEZWNyeXB0aW5nQXVkaW9EZWNvZGVyVGVzdCwgUmVzZXRfRHVyaW5nUGVuZGluZ0NvbmZpZ0NoYW5nZSkgewotICBJbml0aWFsaXplKCk7Ci0gIEVudGVyTm9ybWFsRGVjb2RpbmdTdGF0ZSgpOwotCi0gIEVYUEVDVF9DQUxMKCpkZW11eGVyXywgUmVhZChfKSkKLSAgICAgIC5XaWxsT25jZShSdW5DYWxsYmFjazwwPihEZW11eGVyU3RyZWFtOjprQ29uZmlnQ2hhbmdlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+KCkpKTsKLSAgRVhQRUNUX0NBTEwoKmRlY3J5cHRvcl8sIERlaW5pdGlhbGl6ZURlY29kZXIoRGVjcnlwdG9yOjprQXVkaW8pKTsKLSAgRVhQRUNUX0NBTEwoKmRlY3J5cHRvcl8sIEluaXRpYWxpemVBdWRpb0RlY29kZXJNb2NrKF8sIF8pKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8MT4oJnBlbmRpbmdfaW5pdF9jYl8pKTsKLQotICBkZWNvZGVyXy0+UmVhZChiYXNlOjpCaW5kKCZEZWNyeXB0aW5nQXVkaW9EZWNvZGVyVGVzdDo6RnJhbWVSZWFkeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci0gIEVYUEVDVF9GQUxTRShwZW5kaW5nX2luaXRfY2JfLmlzX251bGwoKSk7Ci0KLSAgRVhQRUNUX0NBTEwoKnRoaXMsIEZyYW1lUmVhZHkoQXVkaW9EZWNvZGVyOjprQWJvcnRlZCwgSXNOdWxsKCkpKTsKLQotICBSZXNldCgpOwotICBiYXNlOjpSZXNldEFuZFJldHVybigmcGVuZGluZ19pbml0X2NiXykuUnVuKHRydWUpOwotICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotfQotCi0vLyBUZXN0IHJlc2V0dGluZyB3aGVuIHRoZSBkZWNvZGVyIGlzIGluIGtQZW5kaW5nRGVjb2RlIHN0YXRlLgotVEVTVF9GKERlY3J5cHRpbmdBdWRpb0RlY29kZXJUZXN0LCBSZXNldF9EdXJpbmdQZW5kaW5nRGVjb2RlKSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgRW50ZXJQZW5kaW5nRGVjb2RlU3RhdGUoKTsKLQotICBFWFBFQ1RfQ0FMTCgqdGhpcywgRnJhbWVSZWFkeShBdWRpb0RlY29kZXI6OmtBYm9ydGVkLCBJc051bGwoKSkpOwotCi0gIFJlc2V0KCk7Ci19Ci0KLS8vIFRlc3QgcmVzZXR0aW5nIHdoZW4gdGhlIGRlY29kZXIgaXMgaW4ga1dhaXRpbmdGb3JLZXkgc3RhdGUuCi1URVNUX0YoRGVjcnlwdGluZ0F1ZGlvRGVjb2RlclRlc3QsIFJlc2V0X0R1cmluZ1dhaXRpbmdGb3JLZXkpIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBFbnRlcldhaXRpbmdGb3JLZXlTdGF0ZSgpOwotCi0gIEVYUEVDVF9DQUxMKCp0aGlzLCBGcmFtZVJlYWR5KEF1ZGlvRGVjb2Rlcjo6a0Fib3J0ZWQsIElzTnVsbCgpKSk7Ci0KLSAgUmVzZXQoKTsKLX0KLQotLy8gVGVzdCByZXNldHRpbmcgd2hlbiB0aGUgZGVjb2RlciBoYXMgaGl0IGVuZCBvZiBzdHJlYW0gYW5kIGlzIGluCi0vLyBrRGVjb2RlRmluaXNoZWQgc3RhdGUuCi1URVNUX0YoRGVjcnlwdGluZ0F1ZGlvRGVjb2RlclRlc3QsIFJlc2V0X0FmdGVyRGVjb2RlRmluaXNoZWQpIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBFbnRlck5vcm1hbERlY29kaW5nU3RhdGUoKTsKLSAgRW50ZXJFbmRPZlN0cmVhbVN0YXRlKCk7Ci0gIFJlc2V0KCk7Ci19Ci0KLS8vIFRlc3QgcmVzZXR0aW5nIGFmdGVyIHRoZSBkZWNvZGVyIGhhcyBiZWVuIHJlc2V0LgotVEVTVF9GKERlY3J5cHRpbmdBdWRpb0RlY29kZXJUZXN0LCBSZXNldF9BZnRlclJlc2V0KSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgRW50ZXJOb3JtYWxEZWNvZGluZ1N0YXRlKCk7Ci0gIFJlc2V0KCk7Ci0gIFJlc2V0KCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvZGVjcnlwdGluZ19kZW11eGVyX3N0cmVhbS5jYyBiL3NyYy9tZWRpYS9maWx0ZXJzL2RlY3J5cHRpbmdfZGVtdXhlcl9zdHJlYW0uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ODAzY2EuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvZGVjcnlwdGluZ19kZW11eGVyX3N0cmVhbS5jYworKysgL2Rldi9udWxsCkBAIC0xLDM4NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9kZWNyeXB0aW5nX2RlbXV4ZXJfc3RyZWFtLmgiCi0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJiYXNlL2xvY2F0aW9uLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3BfcHJveHkuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9iaW5kX3RvX2xvb3AuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNyeXB0b3IuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlbXV4ZXJfc3RyZWFtLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9waXBlbGluZS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fZGVjb2Rlcl9jb25maWcuaCIKLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaGVsbF9tZWRpYV9zdGF0aXN0aWNzLmgiCi0jZW5kaWYKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotI2RlZmluZSBCSU5EX1RPX0xPT1AoZnVuY3Rpb24pIFwKLSAgICBtZWRpYTo6QmluZFRvTG9vcChtZXNzYWdlX2xvb3BfLCBiYXNlOjpCaW5kKGZ1bmN0aW9uLCB0aGlzKSkKLQotc3RhdGljIGJvb2wgSXNTdHJlYW1WYWxpZEFuZEVuY3J5cHRlZCgKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+JiBzdHJlYW0pIHsKLSAgcmV0dXJuICgoc3RyZWFtLT50eXBlKCkgPT0gRGVtdXhlclN0cmVhbTo6QVVESU8gJiYKLSAgICAgICAgICAgc3RyZWFtLT5hdWRpb19kZWNvZGVyX2NvbmZpZygpLklzVmFsaWRDb25maWcoKSAmJgotICAgICAgICAgICBzdHJlYW0tPmF1ZGlvX2RlY29kZXJfY29uZmlnKCkuaXNfZW5jcnlwdGVkKCkpIHx8Ci0gICAgICAgICAgKHN0cmVhbS0+dHlwZSgpID09IERlbXV4ZXJTdHJlYW06OlZJREVPICYmCi0gICAgICAgICAgIHN0cmVhbS0+dmlkZW9fZGVjb2Rlcl9jb25maWcoKS5Jc1ZhbGlkQ29uZmlnKCkgJiYKLSAgICAgICAgICAgc3RyZWFtLT52aWRlb19kZWNvZGVyX2NvbmZpZygpLmlzX2VuY3J5cHRlZCgpKSk7Ci19Ci0KLURlY3J5cHRpbmdEZW11eGVyU3RyZWFtOjpEZWNyeXB0aW5nRGVtdXhlclN0cmVhbSgKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+JiBtZXNzYWdlX2xvb3AsCi0gICAgY29uc3QgU2V0RGVjcnlwdG9yUmVhZHlDQiYgc2V0X2RlY3J5cHRvcl9yZWFkeV9jYikKLSAgICA6IG1lc3NhZ2VfbG9vcF8obWVzc2FnZV9sb29wKSwKLSAgICAgIHN0YXRlXyhrVW5pbml0aWFsaXplZCksCi0gICAgICBzdHJlYW1fdHlwZV8oVU5LTk9XTiksCi0gICAgICBzZXRfZGVjcnlwdG9yX3JlYWR5X2NiXyhzZXRfZGVjcnlwdG9yX3JlYWR5X2NiKSwKLSAgICAgIGRlY3J5cHRvcl8oTlVMTCksCi0gICAgICBrZXlfYWRkZWRfd2hpbGVfZGVjcnlwdF9wZW5kaW5nXyhmYWxzZSkgewotfQotCi12b2lkIERlY3J5cHRpbmdEZW11eGVyU3RyZWFtOjpJbml0aWFsaXplKAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4mIHN0cmVhbSwKLSAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBzdGF0dXNfY2IpIHsKLSAgaWYgKCFtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpIHsKLSAgICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzayhGUk9NX0hFUkUsIGJhc2U6OkJpbmQoCi0gICAgICAgICZEZWNyeXB0aW5nRGVtdXhlclN0cmVhbTo6RG9Jbml0aWFsaXplLCB0aGlzLCBzdHJlYW0sIHN0YXR1c19jYikpOwotICAgIHJldHVybjsKLSAgfQotICBEb0luaXRpYWxpemUoc3RyZWFtLCBzdGF0dXNfY2IpOwotfQotCi12b2lkIERlY3J5cHRpbmdEZW11eGVyU3RyZWFtOjpSZWFkKGNvbnN0IFJlYWRDQiYgcmVhZF9jYikgewotICBEVkxPRygzKSA8PCAiUmVhZCgpIjsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIERDSEVDS19FUShzdGF0ZV8sIGtJZGxlKSA8PCBzdGF0ZV87Ci0gIERDSEVDSyghcmVhZF9jYi5pc19udWxsKCkpOwotICBDSEVDSyhyZWFkX2NiXy5pc19udWxsKCkpIDw8ICJPdmVybGFwcGluZyByZWFkcyBhcmUgbm90IHN1cHBvcnRlZC4iOwotCi0gIHJlYWRfY2JfID0gcmVhZF9jYjsKLSAgc3RhdGVfID0ga1BlbmRpbmdEZW11eGVyUmVhZDsKLSAgZGVtdXhlcl9zdHJlYW1fLT5SZWFkKAotICAgICAgYmFzZTo6QmluZCgmRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW06OkRlY3J5cHRCdWZmZXIsIHRoaXMpKTsKLX0KLQotdm9pZCBEZWNyeXB0aW5nRGVtdXhlclN0cmVhbTo6UmVzZXQoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2xvc3VyZSkgewotICBpZiAoIW1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSkgewotICAgIG1lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKEZST01fSEVSRSwgYmFzZTo6QmluZCgKLSAgICAgICAgJkRlY3J5cHRpbmdEZW11eGVyU3RyZWFtOjpSZXNldCwgdGhpcywgY2xvc3VyZSkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIERWTE9HKDIpIDw8ICJSZXNldCgpIC0gc3RhdGU6ICIgPDwgc3RhdGVfOwotICBEQ0hFQ0soc3RhdGVfICE9IGtVbmluaXRpYWxpemVkICYmIHN0YXRlXyAhPSBrRGVjcnlwdG9yUmVxdWVzdGVkKSA8PCBzdGF0ZV87Ci0gIERDSEVDSyhpbml0X2NiXy5pc19udWxsKCkpOyAgLy8gTm8gUmVzZXQoKSBkdXJpbmcgcGVuZGluZyBpbml0aWFsaXphdGlvbi4KLSAgRENIRUNLKHJlc2V0X2NiXy5pc19udWxsKCkpOwotCi0gIHJlc2V0X2NiXyA9IEJpbmRUb0N1cnJlbnRMb29wKGNsb3N1cmUpOwotCi0gIGRlY3J5cHRvcl8tPkNhbmNlbERlY3J5cHQoR2V0RGVjcnlwdG9yU3RyZWFtVHlwZSgpKTsKLQotICAvLyBSZXNldCgpIGNhbm5vdCBjb21wbGV0ZSBpZiB0aGUgcmVhZCBjYWxsYmFjayBpcyBzdGlsbCBwZW5kaW5nLgotICAvLyBEZWZlciB0aGUgcmVzZXR0aW5nIHByb2Nlc3MgaW4gdGhpcyBjYXNlLiBUaGUgfHJlc2V0X2NiX3wgd2lsbCBiZSBmaXJlZAotICAvLyBhZnRlciB0aGUgcmVhZCBjYWxsYmFjayBpcyBmaXJlZCAtIHNlZSBEb0RlY3J5cHRCdWZmZXIoKSBhbmQKLSAgLy8gRG9EZWxpdmVyQnVmZmVyKCkuCi0gIGlmIChzdGF0ZV8gPT0ga1BlbmRpbmdEZW11eGVyUmVhZCB8fCBzdGF0ZV8gPT0ga1BlbmRpbmdEZWNyeXB0KSB7Ci0gICAgRENIRUNLKCFyZWFkX2NiXy5pc19udWxsKCkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzdGF0ZV8gPT0ga1dhaXRpbmdGb3JLZXkpIHsKLSAgICBEQ0hFQ0soIXJlYWRfY2JfLmlzX251bGwoKSk7Ci0gICAgcGVuZGluZ19idWZmZXJfdG9fZGVjcnlwdF8gPSBOVUxMOwotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZyZWFkX2NiXykuUnVuKGtBYm9ydGVkLCBOVUxMKTsKLSAgfQotCi0gIERDSEVDSyhyZWFkX2NiXy5pc19udWxsKCkpOwotICBEb1Jlc2V0KCk7Ci19Ci0KLWNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYgRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW06OmF1ZGlvX2RlY29kZXJfY29uZmlnKCkgewotICBEQ0hFQ0soc3RhdGVfICE9IGtVbmluaXRpYWxpemVkICYmIHN0YXRlXyAhPSBrRGVjcnlwdG9yUmVxdWVzdGVkKSA8PCBzdGF0ZV87Ci0gIENIRUNLX0VRKHN0cmVhbV90eXBlXywgQVVESU8pOwotICByZXR1cm4gKmF1ZGlvX2NvbmZpZ187Ci19Ci0KLWNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW06OnZpZGVvX2RlY29kZXJfY29uZmlnKCkgewotICBEQ0hFQ0soc3RhdGVfICE9IGtVbmluaXRpYWxpemVkICYmIHN0YXRlXyAhPSBrRGVjcnlwdG9yUmVxdWVzdGVkKSA8PCBzdGF0ZV87Ci0gIENIRUNLX0VRKHN0cmVhbV90eXBlXywgVklERU8pOwotICByZXR1cm4gKnZpZGVvX2NvbmZpZ187Ci19Ci0KLURlbXV4ZXJTdHJlYW06OlR5cGUgRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW06OnR5cGUoKSB7Ci0gIERDSEVDSyhzdGF0ZV8gIT0ga1VuaW5pdGlhbGl6ZWQgJiYgc3RhdGVfICE9IGtEZWNyeXB0b3JSZXF1ZXN0ZWQpIDw8IHN0YXRlXzsKLSAgcmV0dXJuIHN0cmVhbV90eXBlXzsKLX0KLQotdm9pZCBEZWNyeXB0aW5nRGVtdXhlclN0cmVhbTo6RW5hYmxlQml0c3RyZWFtQ29udmVydGVyKCkgewotICBkZW11eGVyX3N0cmVhbV8tPkVuYWJsZUJpdHN0cmVhbUNvbnZlcnRlcigpOwotfQotCi1EZWNyeXB0aW5nRGVtdXhlclN0cmVhbTo6fkRlY3J5cHRpbmdEZW11eGVyU3RyZWFtKCkge30KLQotdm9pZCBEZWNyeXB0aW5nRGVtdXhlclN0cmVhbTo6RG9Jbml0aWFsaXplKAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4mIHN0cmVhbSwKLSAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBzdGF0dXNfY2IpIHsKLSAgRFZMT0coMikgPDwgIkRvSW5pdGlhbGl6ZSgpIjsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIERDSEVDS19FUShzdGF0ZV8sIGtVbmluaXRpYWxpemVkKSA8PCBzdGF0ZV87Ci0KLSAgRENIRUNLKCFkZW11eGVyX3N0cmVhbV8pOwotICBkZW11eGVyX3N0cmVhbV8gPSBzdHJlYW07Ci0gIHN0cmVhbV90eXBlXyA9IHN0cmVhbS0+dHlwZSgpOwotICBpbml0X2NiXyA9IHN0YXR1c19jYjsKLQotICBTZXREZWNvZGVyQ29uZmlnKHN0cmVhbSk7Ci0KLSAgc3RhdGVfID0ga0RlY3J5cHRvclJlcXVlc3RlZDsKLSAgc2V0X2RlY3J5cHRvcl9yZWFkeV9jYl8uUnVuKAotICAgICAgQklORF9UT19MT09QKCZEZWNyeXB0aW5nRGVtdXhlclN0cmVhbTo6U2V0RGVjcnlwdG9yKSk7Ci19Ci0KLXZvaWQgRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW06OlNldERlY3J5cHRvcihEZWNyeXB0b3IqIGRlY3J5cHRvcikgewotICBEVkxPRygyKSA8PCAiU2V0RGVjcnlwdG9yKCkiOwotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgRENIRUNLX0VRKHN0YXRlXywga0RlY3J5cHRvclJlcXVlc3RlZCkgPDwgc3RhdGVfOwotICBEQ0hFQ0soIWluaXRfY2JfLmlzX251bGwoKSk7Ci0gIERDSEVDSyghc2V0X2RlY3J5cHRvcl9yZWFkeV9jYl8uaXNfbnVsbCgpKTsKLQotICBzZXRfZGVjcnlwdG9yX3JlYWR5X2NiXy5SZXNldCgpOwotCi0gIGlmICghZGVjcnlwdG9yKSB7Ci0gICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJmluaXRfY2JfKS5SdW4oREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVEKTsKLSAgICBzdGF0ZV8gPSBrVW5pbml0aWFsaXplZDsKLSAgICByZXR1cm47Ci0gIH0KLQotICBkZWNyeXB0b3JfID0gZGVjcnlwdG9yOwotCi0gIGRlY3J5cHRvcl8tPlJlZ2lzdGVyS2V5QWRkZWRDQigKLSAgICAgIEdldERlY3J5cHRvclN0cmVhbVR5cGUoKSwKLSAgICAgIEJJTkRfVE9fTE9PUCgmRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW06Ok9uS2V5QWRkZWQpKTsKLQotICBzdGF0ZV8gPSBrSWRsZTsKLSAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJmluaXRfY2JfKS5SdW4oUElQRUxJTkVfT0spOwotfQotCi12b2lkIERlY3J5cHRpbmdEZW11eGVyU3RyZWFtOjpEZWNyeXB0QnVmZmVyKAotICAgIERlbXV4ZXJTdHJlYW06OlN0YXR1cyBzdGF0dXMsCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgYnVmZmVyKSB7Ci0gIC8vIEluIHRoZW9yeSwgd2UgZG9uJ3QgbmVlZCB0byBmb3JjZSBwb3N0IHRoZSB0YXNrIGhlcmUsIGJlY2F1c2Ugd2UgZG8gYQotICAvLyBmb3JjZSB0YXNrIHBvc3QgaW4gRGVsaXZlckJ1ZmZlcigpLiBUaGVyZWZvcmUsIGV2ZW4gaWYKLSAgLy8gZGVtdXhlcl9zdHJlYW1fLT5SZWFkKCkgZXhlY3V0ZSB0aGUgcmVhZCBjYWxsYmFjayBvbiB0aGUgc2FtZSBleGVjdXRpb24KLSAgLy8gc3RhY2sgd2UgYXJlIHN0aWxsIGZpbmUuIEJ1dCBpdCBsb29rcyBsaWtlIGEgZm9yY2UgcG9zdCB0YXNrIG1ha2VzIHRoZQotICAvLyBsb2dpYyBtb3JlIHVuZGVyc3RhbmRhYmxlIGFuZCBtYW5hZ2VhYmxlLCBzbyB3aHkgbm90PwotICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzayhGUk9NX0hFUkUsIGJhc2U6OkJpbmQoCi0gICAgICAmRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW06OkRvRGVjcnlwdEJ1ZmZlciwgdGhpcywgc3RhdHVzLCBidWZmZXIpKTsKLX0KLQotdm9pZCBEZWNyeXB0aW5nRGVtdXhlclN0cmVhbTo6RG9EZWNyeXB0QnVmZmVyKAotICAgIERlbXV4ZXJTdHJlYW06OlN0YXR1cyBzdGF0dXMsCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgYnVmZmVyKSB7Ci0gIERWTE9HKDMpIDw8ICJEb0RlY3J5cHRCdWZmZXIoKSI7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBEQ0hFQ0tfRVEoc3RhdGVfLCBrUGVuZGluZ0RlbXV4ZXJSZWFkKSA8PCBzdGF0ZV87Ci0gIERDSEVDSyghcmVhZF9jYl8uaXNfbnVsbCgpKTsKLSAgRENIRUNLX0VRKGJ1ZmZlciAhPSBOVUxMLCBzdGF0dXMgPT0ga09rKSA8PCBzdGF0dXM7Ci0KLSAgaWYgKCFyZXNldF9jYl8uaXNfbnVsbCgpKSB7Ci0gICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnJlYWRfY2JfKS5SdW4oa0Fib3J0ZWQsIE5VTEwpOwotICAgIERvUmVzZXQoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoc3RhdHVzID09IGtBYm9ydGVkKSB7Ci0gICAgRFZMT0coMikgPDwgIkRvRGVjcnlwdEJ1ZmZlcigpIC0ga0Fib3J0ZWQuIjsKLSAgICBzdGF0ZV8gPSBrSWRsZTsKLSAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcmVhZF9jYl8pLlJ1bihrQWJvcnRlZCwgTlVMTCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHN0YXR1cyA9PSBrQ29uZmlnQ2hhbmdlZCkgewotICAgIERWTE9HKDIpIDw8ICJEb0RlY3J5cHRCdWZmZXIoKSAtIGtDb25maWdDaGFuZ2VkLiI7Ci0gICAgRENIRUNLX0VRKGRlbXV4ZXJfc3RyZWFtXy0+dHlwZSgpLCBzdHJlYW1fdHlwZV8pOwotCi0gICAgLy8gVXBkYXRlIHRoZSBkZWNvZGVyIGNvbmZpZywgd2hpY2ggdGhlIGRlY29kZXIgd2lsbCB1c2Ugd2hlbiBpdCBpcyBub3RpZmllZAotICAgIC8vIG9mIGtDb25maWdDaGFuZ2VkLgotICAgIFNldERlY29kZXJDb25maWcoZGVtdXhlcl9zdHJlYW1fKTsKLSAgICBzdGF0ZV8gPSBrSWRsZTsKLSAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcmVhZF9jYl8pLlJ1bihrQ29uZmlnQ2hhbmdlZCwgTlVMTCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGJ1ZmZlci0+SXNFbmRPZlN0cmVhbSgpKSB7Ci0gICAgRFZMT0coMikgPDwgIkRvRGVjcnlwdEJ1ZmZlcigpIC0gRU9TIGJ1ZmZlci4iOwotICAgIHN0YXRlXyA9IGtJZGxlOwotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZyZWFkX2NiXykuUnVuKHN0YXR1cywgYnVmZmVyKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBwZW5kaW5nX2J1ZmZlcl90b19kZWNyeXB0XyA9IGJ1ZmZlcjsKLSAgc3RhdGVfID0ga1BlbmRpbmdEZWNyeXB0OwotICBEZWNyeXB0UGVuZGluZ0J1ZmZlcigpOwotfQotCi12b2lkIERlY3J5cHRpbmdEZW11eGVyU3RyZWFtOjpEZWNyeXB0UGVuZGluZ0J1ZmZlcigpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIERDSEVDS19FUShzdGF0ZV8sIGtQZW5kaW5nRGVjcnlwdCkgPDwgc3RhdGVfOwotI2lmIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLSAgZGVjcnlwdGluZ19zdGFydF8gPSBiYXNlOjpUaW1lOjpOb3coKTsKLSNlbmRpZiAgLy8gZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICBkZWNyeXB0b3JfLT5EZWNyeXB0KAotICAgICAgR2V0RGVjcnlwdG9yU3RyZWFtVHlwZSgpLAotICAgICAgcGVuZGluZ19idWZmZXJfdG9fZGVjcnlwdF8sCi0gICAgICBiYXNlOjpCaW5kKCZEZWNyeXB0aW5nRGVtdXhlclN0cmVhbTo6RGVsaXZlckJ1ZmZlciwgdGhpcykpOwotfQotCi12b2lkIERlY3J5cHRpbmdEZW11eGVyU3RyZWFtOjpEZWxpdmVyQnVmZmVyKAotICAgIERlY3J5cHRvcjo6U3RhdHVzIHN0YXR1cywKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBkZWNyeXB0ZWRfYnVmZmVyKSB7Ci0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICBVUERBVEVfTUVESUFfU1RBVElTVElDUyhTVEFUX1RZUEVfREVDUllQVCwKLSAgICAgIChiYXNlOjpUaW1lOjpOb3coKSAtIGRlY3J5cHRpbmdfc3RhcnRfKS5Ub0ludGVybmFsVmFsdWUoKSk7Ci0jZW5kaWYgIC8vIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLSAgLy8gV2UgbmVlZCB0byBmb3JjZSB0YXNrIHBvc3QgaGVyZSBiZWNhdXNlIHRoZSBEZWNyeXB0Q0IgY2FuIGJlIGV4ZWN1dGVkCi0gIC8vIHN5bmNocm9ub3VzbHkgaW4gUmVzZXQoKS4gSW5zdGVhZCBvZiB1c2luZyBtb3JlIGNvbXBsaWNhdGVkIGxvZ2ljIGluCi0gIC8vIHRob3NlIGZ1bmN0aW9uIHRvIGZpeCBpdCwgd2h5IG5vdCBmb3JjZSB0YXNrIHBvc3QgaGVyZSB0byBtYWtlIGV2ZXJ5dGhpbmcKLSAgLy8gc2ltcGxlIGFuZCBjbGVhcj8KLSAgbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soRlJPTV9IRVJFLCBiYXNlOjpCaW5kKAotICAgICAgJkRlY3J5cHRpbmdEZW11eGVyU3RyZWFtOjpEb0RlbGl2ZXJCdWZmZXIsIHRoaXMsCi0gICAgICBzdGF0dXMsIGRlY3J5cHRlZF9idWZmZXIpKTsKLX0KLQotdm9pZCBEZWNyeXB0aW5nRGVtdXhlclN0cmVhbTo6RG9EZWxpdmVyQnVmZmVyKAotICAgIERlY3J5cHRvcjo6U3RhdHVzIHN0YXR1cywKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBkZWNyeXB0ZWRfYnVmZmVyKSB7Ci0gIERWTE9HKDMpIDw8ICJEb0RlbGl2ZXJCdWZmZXIoKSAtIHN0YXR1czogIiA8PCBzdGF0dXM7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBEQ0hFQ0tfRVEoc3RhdGVfLCBrUGVuZGluZ0RlY3J5cHQpIDw8IHN0YXRlXzsKLSAgRENIRUNLX05FKHN0YXR1cywgRGVjcnlwdG9yOjprTmVlZE1vcmVEYXRhKTsKLSAgRENIRUNLKCFyZWFkX2NiXy5pc19udWxsKCkpOwotICBEQ0hFQ0socGVuZGluZ19idWZmZXJfdG9fZGVjcnlwdF8pOwotCi0gIGJvb2wgbmVlZF90b190cnlfYWdhaW5faWZfbm9rZXkgPSBrZXlfYWRkZWRfd2hpbGVfZGVjcnlwdF9wZW5kaW5nXzsKLSAga2V5X2FkZGVkX3doaWxlX2RlY3J5cHRfcGVuZGluZ18gPSBmYWxzZTsKLQotICBpZiAoIXJlc2V0X2NiXy5pc19udWxsKCkpIHsKLSAgICBwZW5kaW5nX2J1ZmZlcl90b19kZWNyeXB0XyA9IE5VTEw7Ci0gICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnJlYWRfY2JfKS5SdW4oa0Fib3J0ZWQsIE5VTEwpOwotICAgIERvUmVzZXQoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBEQ0hFQ0tfRVEoc3RhdHVzID09IERlY3J5cHRvcjo6a1N1Y2Nlc3MsIGRlY3J5cHRlZF9idWZmZXIuZ2V0KCkgIT0gTlVMTCk7Ci0KLSAgaWYgKHN0YXR1cyA9PSBEZWNyeXB0b3I6OmtFcnJvcikgewotICAgIERWTE9HKDIpIDw8ICJEb0RlbGl2ZXJCdWZmZXIoKSAtIGtFcnJvciI7Ci0gICAgcGVuZGluZ19idWZmZXJfdG9fZGVjcnlwdF8gPSBOVUxMOwotICAgIHN0YXRlXyA9IGtJZGxlOwotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZyZWFkX2NiXykuUnVuKGtBYm9ydGVkLCBOVUxMKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoc3RhdHVzID09IERlY3J5cHRvcjo6a05vS2V5KSB7Ci0gICAgRFZMT0coMikgPDwgIkRvRGVsaXZlckJ1ZmZlcigpIC0ga05vS2V5IjsKLSAgICBpZiAobmVlZF90b190cnlfYWdhaW5faWZfbm9rZXkpIHsKLSAgICAgIC8vIFRoZSB8c3RhdGVffCBpcyBzdGlsbCBrUGVuZGluZ0RlY3J5cHQuCi0gICAgICBEZWNyeXB0UGVuZGluZ0J1ZmZlcigpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN0YXRlXyA9IGtXYWl0aW5nRm9yS2V5OwotICAgIHJldHVybjsKLSAgfQotCi0gIERDSEVDS19FUShzdGF0dXMsIERlY3J5cHRvcjo6a1N1Y2Nlc3MpOwotICBwZW5kaW5nX2J1ZmZlcl90b19kZWNyeXB0XyA9IE5VTEw7Ci0gIHN0YXRlXyA9IGtJZGxlOwotICBiYXNlOjpSZXNldEFuZFJldHVybigmcmVhZF9jYl8pLlJ1bihrT2ssIGRlY3J5cHRlZF9idWZmZXIpOwotfQotCi12b2lkIERlY3J5cHRpbmdEZW11eGVyU3RyZWFtOjpPbktleUFkZGVkKCkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLQotICBpZiAoc3RhdGVfID09IGtQZW5kaW5nRGVjcnlwdCkgewotICAgIGtleV9hZGRlZF93aGlsZV9kZWNyeXB0X3BlbmRpbmdfID0gdHJ1ZTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoc3RhdGVfID09IGtXYWl0aW5nRm9yS2V5KSB7Ci0gICAgc3RhdGVfID0ga1BlbmRpbmdEZWNyeXB0OwotICAgIERlY3J5cHRQZW5kaW5nQnVmZmVyKCk7Ci0gIH0KLX0KLQotdm9pZCBEZWNyeXB0aW5nRGVtdXhlclN0cmVhbTo6RG9SZXNldCgpIHsKLSAgRENIRUNLKGluaXRfY2JfLmlzX251bGwoKSk7Ci0gIERDSEVDSyhyZWFkX2NiXy5pc19udWxsKCkpOwotICBzdGF0ZV8gPSBrSWRsZTsKLSAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnJlc2V0X2NiXykuUnVuKCk7Ci19Ci0KLURlY3J5cHRvcjo6U3RyZWFtVHlwZSBEZWNyeXB0aW5nRGVtdXhlclN0cmVhbTo6R2V0RGVjcnlwdG9yU3RyZWFtVHlwZSgpIGNvbnN0IHsKLSAgRENIRUNLKHN0cmVhbV90eXBlXyA9PSBBVURJTyB8fCBzdHJlYW1fdHlwZV8gPT0gVklERU8pOwotICByZXR1cm4gc3RyZWFtX3R5cGVfID09IEFVRElPID8gRGVjcnlwdG9yOjprQXVkaW8gOiBEZWNyeXB0b3I6OmtWaWRlbzsKLX0KLQotdm9pZCBEZWNyeXB0aW5nRGVtdXhlclN0cmVhbTo6U2V0RGVjb2RlckNvbmZpZygKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+JiBzdHJlYW0pIHsKLSAgLy8gVGhlIGRlY29kZXIgc2VsZWN0b3Igb3IgdXBzdHJlYW0gZGVtdXhlciBtYWtlIHN1cmUgdGhlIHN0cmVhbSBpcyB2YWxpZCBhbmQKLSAgLy8gcG90ZW50aWFsbHkgZW5jcnlwdGVkLgotICBEQ0hFQ0soSXNTdHJlYW1WYWxpZEFuZEVuY3J5cHRlZChzdHJlYW0pKTsKLQotICBzd2l0Y2ggKHN0cmVhbV90eXBlXykgewotICAgIGNhc2UgQVVESU86IHsKLSAgICAgIGNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYgaW5wdXRfYXVkaW9fY29uZmlnID0KLSAgICAgICAgICBzdHJlYW0tPmF1ZGlvX2RlY29kZXJfY29uZmlnKCk7Ci0gICAgICBhdWRpb19jb25maWdfLnJlc2V0KG5ldyBBdWRpb0RlY29kZXJDb25maWcoKSk7Ci0gICAgICBhdWRpb19jb25maWdfLT5Jbml0aWFsaXplKGlucHV0X2F1ZGlvX2NvbmZpZy5jb2RlYygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9hdWRpb19jb25maWcuYml0c19wZXJfY2hhbm5lbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9hdWRpb19jb25maWcuY2hhbm5lbF9sYXlvdXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfYXVkaW9fY29uZmlnLnNhbXBsZXNfcGVyX3NlY29uZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9hdWRpb19jb25maWcuZXh0cmFfZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9hdWRpb19jb25maWcuZXh0cmFfZGF0YV9zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAgLy8gT3V0cHV0IGF1ZGlvIGlzIG5vdCBlbmNyeXB0ZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgVklERU86IHsKLSAgICAgIGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgaW5wdXRfdmlkZW9fY29uZmlnID0KLSAgICAgICAgICBzdHJlYW0tPnZpZGVvX2RlY29kZXJfY29uZmlnKCk7Ci0gICAgICB2aWRlb19jb25maWdfLnJlc2V0KG5ldyBWaWRlb0RlY29kZXJDb25maWcoKSk7Ci0gICAgICB2aWRlb19jb25maWdfLT5Jbml0aWFsaXplKAotICAgICAgICAgIGlucHV0X3ZpZGVvX2NvbmZpZy5jb2RlYygpLCBpbnB1dF92aWRlb19jb25maWcucHJvZmlsZSgpLAotICAgICAgICAgIGlucHV0X3ZpZGVvX2NvbmZpZy5mb3JtYXQoKSwgaW5wdXRfdmlkZW9fY29uZmlnLmNvbG9yX3NwYWNlKCksCi0gICAgICAgICAgaW5wdXRfdmlkZW9fY29uZmlnLmNvZGVkX3NpemUoKSwgaW5wdXRfdmlkZW9fY29uZmlnLnZpc2libGVfcmVjdCgpLAotICAgICAgICAgIGlucHV0X3ZpZGVvX2NvbmZpZy5uYXR1cmFsX3NpemUoKSwgaW5wdXRfdmlkZW9fY29uZmlnLmV4dHJhX2RhdGEoKSwKLSAgICAgICAgICBpbnB1dF92aWRlb19jb25maWcuZXh0cmFfZGF0YV9zaXplKCksCi0gICAgICAgICAgZmFsc2UsICAvLyBPdXRwdXQgdmlkZW8gaXMgbm90IGVuY3J5cHRlZC4KLSAgICAgICAgICBmYWxzZSk7Ci0gICAgICB2aWRlb19jb25maWdfLT5zZXRfd2VibV9jb2xvcl9tZXRhZGF0YSgKLSAgICAgICAgICBpbnB1dF92aWRlb19jb25maWcud2VibV9jb2xvcl9tZXRhZGF0YSgpKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGRlZmF1bHQ6Ci0gICAgICBOT1RSRUFDSEVEKCk7Ci0gICAgICByZXR1cm47Ci0gIH0KLX0KLQotI2lmIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLWJvb2wgRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW06OlN0cmVhbVdhc0VuY3J5cHRlZCgpIGNvbnN0IHsKLSAgRENIRUNLKGRlbXV4ZXJfc3RyZWFtXy0+U3RyZWFtV2FzRW5jcnlwdGVkKCkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLSNlbmRpZgotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL2RlY3J5cHRpbmdfZGVtdXhlcl9zdHJlYW0uaCBiL3NyYy9tZWRpYS9maWx0ZXJzL2RlY3J5cHRpbmdfZGVtdXhlcl9zdHJlYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRiMDE5ZC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9kZWNyeXB0aW5nX2RlbXV4ZXJfc3RyZWFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9GSUxURVJTX0RFQ1JZUFRJTkdfREVNVVhFUl9TVFJFQU1fSF8KLSNkZWZpbmUgTUVESUFfRklMVEVSU19ERUNSWVBUSU5HX0RFTVVYRVJfU1RSRUFNX0hfCi0KLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0jaW5jbHVkZSAiYmFzZS90aW1lLmgiCi0jZW5kaWYgIC8vIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlY3J5cHRvci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVtdXhlcl9zdHJlYW0uaCIKLQotbmFtZXNwYWNlIGJhc2UgewotY2xhc3MgTWVzc2FnZUxvb3BQcm94eTsKLX0KLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgRGVjb2RlckJ1ZmZlcjsKLQotLy8gRGVjcnlwdG9yLWJhc2VkIERlbXV4ZXJTdHJlYW0gaW1wbGVtZW50YXRpb24gdGhhdCBjb252ZXJ0cyBhIHBvdGVudGlhbGx5Ci0vLyBlbmNyeXB0ZWQgZGVtdXhlciBzdHJlYW0gdG8gYSBjbGVhciBkZW11eGVyIHN0cmVhbS4KLS8vIEFsbCBwdWJsaWMgQVBJcyBhbmQgY2FsbGJhY2tzIGFyZSB0cmFtcG9saW5lZCB0byB0aGUgfG1lc3NhZ2VfbG9vcF98IHNvCi0vLyB0aGF0IG5vIGxvY2tzIGFyZSByZXF1aXJlZCBmb3IgdGhyZWFkIHNhZmV0eS4KLWNsYXNzIE1FRElBX0VYUE9SVCBEZWNyeXB0aW5nRGVtdXhlclN0cmVhbSA6IHB1YmxpYyBEZW11eGVyU3RyZWFtIHsKLSBwdWJsaWM6Ci0gIERlY3J5cHRpbmdEZW11eGVyU3RyZWFtKAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbWVzc2FnZV9sb29wLAotICAgICAgY29uc3QgU2V0RGVjcnlwdG9yUmVhZHlDQiYgc2V0X2RlY3J5cHRvcl9yZWFkeV9jYik7Ci0KLSAgdm9pZCBJbml0aWFsaXplKGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4mIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIHN0YXR1c19jYik7Ci0gIHZvaWQgUmVzZXQoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2xvc3VyZSk7Ci0KLSAgLy8gRGVtdXhlclN0cmVhbSBpbXBsZW1lbnRhdGlvbi4KLSAgdmlydHVhbCB2b2lkIFJlYWQoY29uc3QgUmVhZENCJiByZWFkX2NiKSBPVkVSUklERTsKLSAgdmlydHVhbCBjb25zdCBBdWRpb0RlY29kZXJDb25maWcmIGF1ZGlvX2RlY29kZXJfY29uZmlnKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiB2aWRlb19kZWNvZGVyX2NvbmZpZygpIE9WRVJSSURFOwotICB2aXJ0dWFsIFR5cGUgdHlwZSgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgRW5hYmxlQml0c3RyZWFtQ29udmVydGVyKCkgT1ZFUlJJREU7Ci0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICB2aXJ0dWFsIGJvb2wgU3RyZWFtV2FzRW5jcnlwdGVkKCkgY29uc3QgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgRGVjcnlwdG9yKiBHZXREZWNyeXB0b3IoKSBjb25zdCBPVkVSUklERSB7IHJldHVybiBkZWNyeXB0b3JfOyB9Ci0jZW5kaWYKLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB+RGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW0oKTsKLQotIHByaXZhdGU6Ci0gIC8vIEZvciBhIGRldGFpbGVkIHN0YXRlIGRpYWdyYW0gcGxlYXNlIHNlZSB0aGlzIGxpbms6IGh0dHA6Ly9nb28uZ2wvOGpBb2sKLSAgLy8gVE9ETyh4aHdhbmcpOiBBZGQgYSBBU0NJSSBzdGF0ZSBkaWFncmFtIGluIHRoaXMgZmlsZSBhZnRlciB0aGlzIGNsYXNzCi0gIC8vIHN0YWJpbGl6ZXMuCi0gIC8vIFRPRE8oeGh3YW5nKTogVXBkYXRlIHRoaXMgZGlhZ3JhbSBmb3IgRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW0uCi0gIGVudW0gU3RhdGUgewotICAgIGtVbmluaXRpYWxpemVkID0gMCwKLSAgICBrRGVjcnlwdG9yUmVxdWVzdGVkLAotICAgIGtJZGxlLAotICAgIGtQZW5kaW5nRGVtdXhlclJlYWQsCi0gICAga1BlbmRpbmdEZWNyeXB0LAotICAgIGtXYWl0aW5nRm9yS2V5LAotICB9OwotCi0gIC8vIENhcnJpZXMgb3V0IHRoZSBpbml0aWFsaXphdGlvbiBvcGVyYXRpb24gc2NoZWR1bGVkIGJ5IEluaXRpYWxpemUoKS4KLSAgdm9pZCBEb0luaXRpYWxpemUoY29uc3Qgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiYgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBzdGF0dXNfY2IpOwotCi0gIC8vIENhbGxiYWNrIGZvciBEZWNyeXB0b3JIb3N0OjpSZXF1ZXN0RGVjcnlwdG9yKCkuCi0gIHZvaWQgU2V0RGVjcnlwdG9yKERlY3J5cHRvciogZGVjcnlwdG9yKTsKLQotICAvLyBDYWxsYmFjayBmb3IgRGVtdXhlclN0cmVhbTo6UmVhZCgpLgotICB2b2lkIERlY3J5cHRCdWZmZXIoRGVtdXhlclN0cmVhbTo6U3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGJ1ZmZlcik7Ci0KLSAgLy8gQ2FycmllcyBvdXQgdGhlIGJ1ZmZlciBkZWNyeXB0aW9uIG9wZXJhdGlvbiBzY2hlZHVsZWQgYnkgRGVjcnlwdEJ1ZmZlcigpLgotICB2b2lkIERvRGVjcnlwdEJ1ZmZlcihEZW11eGVyU3RyZWFtOjpTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBidWZmZXIpOwotCi0gIHZvaWQgRGVjcnlwdFBlbmRpbmdCdWZmZXIoKTsKLQotICAvLyBDYWxsYmFjayBmb3IgRGVjcnlwdG9yOjpEZWNyeXB0KCkuCi0gIHZvaWQgRGVsaXZlckJ1ZmZlcihEZWNyeXB0b3I6OlN0YXR1cyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBkZWNyeXB0ZWRfYnVmZmVyKTsKLQotICAvLyBDYXJyaWVzIG91dCB0aGUgZnJhbWUgZGVsaXZlcnkgb3BlcmF0aW9uIHNjaGVkdWxlZCBieSBEZWxpdmVyQnVmZmVyKCkuCi0gIHZvaWQgRG9EZWxpdmVyQnVmZmVyKERlY3J5cHRvcjo6U3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgZGVjcnlwdGVkX2J1ZmZlcik7Ci0KLSAgLy8gQ2FsbGJhY2sgZm9yIHRoZSB8ZGVjcnlwdG9yX3wgdG8gbm90aWZ5IHRoaXMgb2JqZWN0IHRoYXQgYSBuZXcga2V5IGhhcyBiZWVuCi0gIC8vIGFkZGVkLgotICB2b2lkIE9uS2V5QWRkZWQoKTsKLQotICAvLyBSZXNldHMgZGVjb2RlciBhbmQgY2FsbHMgfHJlc2V0X2NiX3wuCi0gIHZvaWQgRG9SZXNldCgpOwotCi0gIC8vIFJldHVybnMgRGVjcnlwdG9yOjpTdHJlYW1UeXBlIGNvbnZlcnRlZCBmcm9tIHxzdHJlYW1fdHlwZV98LgotICBEZWNyeXB0b3I6OlN0cmVhbVR5cGUgR2V0RGVjcnlwdG9yU3RyZWFtVHlwZSgpIGNvbnN0OwotCi0gIC8vIFNldHMgfHthdWRpb3x2aWRlb31fY29uZmlnX3wgZnJvbSB8c3RyZWFtfC4KLSAgdm9pZCBTZXREZWNvZGVyQ29uZmlnKGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4mIHN0cmVhbSk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiBtZXNzYWdlX2xvb3BfOwotCi0gIFN0YXRlIHN0YXRlXzsKLQotICBQaXBlbGluZVN0YXR1c0NCIGluaXRfY2JfOwotICBSZWFkQ0IgcmVhZF9jYl87Ci0gIGJhc2U6OkNsb3N1cmUgcmVzZXRfY2JfOwotCi0gIC8vIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRlbXV4ZXIgc3RyZWFtIHRoYXQgd2lsbCBmZWVkIHVzIGVuY3J5cHRlZCBidWZmZXJzLgotICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IGRlbXV4ZXJfc3RyZWFtXzsKLQotICBUeXBlIHN0cmVhbV90eXBlXzsKLSAgc2NvcGVkX3B0cjxBdWRpb0RlY29kZXJDb25maWc+IGF1ZGlvX2NvbmZpZ187Ci0gIHNjb3BlZF9wdHI8VmlkZW9EZWNvZGVyQ29uZmlnPiB2aWRlb19jb25maWdfOwotCi0gIC8vIENhbGxiYWNrIHRvIHJlcXVlc3QvY2FuY2VsIGRlY3J5cHRvciBjcmVhdGlvbiBub3RpZmljYXRpb24uCi0gIFNldERlY3J5cHRvclJlYWR5Q0Igc2V0X2RlY3J5cHRvcl9yZWFkeV9jYl87Ci0KLSAgRGVjcnlwdG9yKiBkZWNyeXB0b3JfOwotCi0gIC8vIFRoZSBidWZmZXIgcmV0dXJuZWQgYnkgdGhlIGRlbXV4ZXIgdGhhdCBuZWVkcyB0byBiZSBkZWNyeXB0ZWQuCi0gIHNjb3BlZF9yZWZwdHI8bWVkaWE6OkRlY29kZXJCdWZmZXI+IHBlbmRpbmdfYnVmZmVyX3RvX2RlY3J5cHRfOwotCi0gIC8vIEluZGljYXRlcyB0aGUgc2l0dWF0aW9uIHdoZXJlIG5ldyBrZXkgaXMgYWRkZWQgZHVyaW5nIHBlbmRpbmcgZGVjcnlwdGlvbgotICAvLyAoaW4gb3RoZXIgd29yZHMsIHRoaXMgdmFyaWFibGUgY2FuIG9ubHkgYmUgc2V0IGluIHN0YXRlIGtQZW5kaW5nRGVjcnlwdCkuCi0gIC8vIElmIHRoaXMgdmFyaWFibGUgaXMgdHJ1ZSBhbmQga05vS2V5IGlzIHJldHVybmVkIHRoZW4gd2UgbmVlZCB0byB0cnkKLSAgLy8gZGVjcnlwdGluZyBhZ2FpbiBpbiBjYXNlIHRoZSBuZXdseSBhZGRlZCBrZXkgaXMgdGhlIGNvcnJlY3QgZGVjcnlwdGlvbiBrZXkuCi0gIGJvb2wga2V5X2FkZGVkX3doaWxlX2RlY3J5cHRfcGVuZGluZ187Ci0KLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0gIGJhc2U6OlRpbWUgZGVjcnlwdGluZ19zdGFydF87Ci0jZW5kaWYgIC8vIGRlZmluZWQoX19MQl9TSEVMTF9fKQotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihEZWNyeXB0aW5nRGVtdXhlclN0cmVhbSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9GSUxURVJTX0RFQ1JZUFRJTkdfREVNVVhFUl9TVFJFQU1fSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL2RlY3J5cHRpbmdfZGVtdXhlcl9zdHJlYW1fdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvZmlsdGVycy9kZWNyeXB0aW5nX2RlbXV4ZXJfc3RyZWFtX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmRhNTViLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL2RlY3J5cHRpbmdfZGVtdXhlcl9zdHJlYW1fdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlY3J5cHRfY29uZmlnLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9nbW9ja19jYWxsYmFja19zdXBwb3J0LmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tb2NrX2ZpbHRlcnMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3Rlc3RfaGVscGVycy5oIgotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvZGVjcnlwdGluZ19kZW11eGVyX3N0cmVhbS5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay5oIgotCi11c2luZyA6OnRlc3Rpbmc6Ol87Ci11c2luZyA6OnRlc3Rpbmc6OklzTnVsbDsKLXVzaW5nIDo6dGVzdGluZzo6UmV0dXJuOwotdXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm5SZWY7Ci11c2luZyA6OnRlc3Rpbmc6OlNhdmVBcmc7Ci11c2luZyA6OnRlc3Rpbmc6OlN0cmljdE1vY2s7Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLXN0YXRpYyBjb25zdCBpbnQga0Zha2VCdWZmZXJTaXplID0gMTY7Ci1zdGF0aWMgY29uc3QgVmlkZW9GcmFtZTo6Rm9ybWF0IGtWaWRlb0Zvcm1hdCA9IFZpZGVvRnJhbWU6OllWMTI7Ci1zdGF0aWMgY29uc3QgZ2Z4OjpTaXplIGtDb2RlZFNpemUoMzIwLCAyNDApOwotc3RhdGljIGNvbnN0IGdmeDo6UmVjdCBrVmlzaWJsZVJlY3QoMzIwLCAyNDApOwotc3RhdGljIGNvbnN0IGdmeDo6U2l6ZSBrTmF0dXJhbFNpemUoMzIwLCAyNDApOwotc3RhdGljIGNvbnN0IHVpbnQ4IGtGYWtlS2V5SWRbXSA9IHsgMHg0YiwgMHg2NSwgMHg3OSwgMHgyMCwgMHg0OSwgMHg0NCB9Owotc3RhdGljIGNvbnN0IHVpbnQ4IGtGYWtlSXZbRGVjcnlwdENvbmZpZzo6a0RlY3J5cHRpb25LZXlTaXplXSA9IHsgMCB9OwotCi0vLyBDcmVhdGUgYSBmYWtlIG5vbi1lbXB0eSBlbmNyeXB0ZWQgYnVmZmVyLgotc3RhdGljIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gQ3JlYXRlRmFrZUVuY3J5cHRlZEJ1ZmZlcigpIHsKLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBidWZmZXIobmV3IERlY29kZXJCdWZmZXIoa0Zha2VCdWZmZXJTaXplKSk7Ci0gIGJ1ZmZlci0+U2V0RGVjcnlwdENvbmZpZyhzY29wZWRfcHRyPERlY3J5cHRDb25maWc+KG5ldyBEZWNyeXB0Q29uZmlnKAotICAgICAgc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oa0Zha2VLZXlJZCksCi0gICAgICAgICAgICAgICAgICBhcnJheXNpemUoa0Zha2VLZXlJZCkpLAotICAgICAgc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oa0Zha2VJdiksIGFycmF5c2l6ZShrRmFrZUl2KSksCi0gICAgICAwLAotICAgICAgc3RkOjp2ZWN0b3I8U3Vic2FtcGxlRW50cnk+KCkpKSk7Ci0gIHJldHVybiBidWZmZXI7Ci19Ci0KLS8vIFVzZSBhbm9ueW1vdXMgbmFtZXNwYWNlIGhlcmUgdG8gcHJldmVudCB0aGUgYWN0aW9ucyB0byBiZSBkZWZpbmVkIG11bHRpcGxlCi0vLyB0aW1lcyBhY3Jvc3MgbXVsdGlwbGUgdGVzdCBmaWxlcy4gU2FkbHkgd2UgY2FuJ3QgdXNlIHN0YXRpYyBmb3IgdGhlbS4KLW5hbWVzcGFjZSB7Ci0KLUFDVElPTl9QKFJldHVybkJ1ZmZlciwgYnVmZmVyKSB7Ci0gIGFyZzAuUnVuKGJ1ZmZlciA/IERlbXV4ZXJTdHJlYW06OmtPayA6IERlbXV4ZXJTdHJlYW06OmtBYm9ydGVkLCBidWZmZXIpOwotfQotCi1BQ1RJT05fUChSdW5DYWxsYmFja0lmTm90TnVsbCwgcGFyYW0pIHsKLSAgaWYgKCFhcmcwLmlzX251bGwoKSkKLSAgICBhcmcwLlJ1bihwYXJhbSk7Ci19Ci0KLUFDVElPTl9QMihSZXNldEFuZFJ1bkNhbGxiYWNrLCBjYWxsYmFjaywgcGFyYW0pIHsKLSAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oY2FsbGJhY2spLlJ1bihwYXJhbSk7Ci19Ci0KLU1BVENIRVIoSXNFbmRPZlN0cmVhbSwgImVuZCBvZiBzdHJlYW0iKSB7Ci0gIHJldHVybiAoYXJnLT5Jc0VuZE9mU3RyZWFtKCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotY2xhc3MgRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW1UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW1UZXN0KCkKLSAgICAgIDogZGVtdXhlcl9zdHJlYW1fKG5ldyBEZWNyeXB0aW5nRGVtdXhlclN0cmVhbSgKLSAgICAgICAgICAgIG1lc3NhZ2VfbG9vcF8ubWVzc2FnZV9sb29wX3Byb3h5KCksCi0gICAgICAgICAgICBiYXNlOjpCaW5kKAotICAgICAgICAgICAgICAgICZEZWNyeXB0aW5nRGVtdXhlclN0cmVhbVRlc3Q6OlJlcXVlc3REZWNyeXB0b3JOb3RpZmljYXRpb24sCi0gICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpKSwKLSAgICAgICAgZGVjcnlwdG9yXyhuZXcgU3RyaWN0TW9jazxNb2NrRGVjcnlwdG9yPigpKSwKLSAgICAgICAgaW5wdXRfYXVkaW9fc3RyZWFtXyhuZXcgU3RyaWN0TW9jazxNb2NrRGVtdXhlclN0cmVhbT4oKSksCi0gICAgICAgIGlucHV0X3ZpZGVvX3N0cmVhbV8obmV3IFN0cmljdE1vY2s8TW9ja0RlbXV4ZXJTdHJlYW0+KCkpLAotICAgICAgICBlbmNyeXB0ZWRfYnVmZmVyXyhDcmVhdGVGYWtlRW5jcnlwdGVkQnVmZmVyKCkpLAotICAgICAgICBkZWNyeXB0ZWRfYnVmZmVyXyhuZXcgRGVjb2RlckJ1ZmZlcihrRmFrZUJ1ZmZlclNpemUpKSB7Ci0gIH0KLQotICB2b2lkIEluaXRpYWxpemVBdWRpb0FuZEV4cGVjdFN0YXR1cyhjb25zdCBBdWRpb0RlY29kZXJDb25maWcmIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGlwZWxpbmVTdGF0dXMgc3RhdHVzKSB7Ci0gICAgRVhQRUNUX0NBTEwoKmlucHV0X2F1ZGlvX3N0cmVhbV8sIGF1ZGlvX2RlY29kZXJfY29uZmlnKCkpCi0gICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm5SZWYoY29uZmlnKSk7Ci0gICAgRVhQRUNUX0NBTEwoKmlucHV0X2F1ZGlvX3N0cmVhbV8sIHR5cGUoKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybihEZW11eGVyU3RyZWFtOjpBVURJTykpOwotCi0gICAgZGVtdXhlcl9zdHJlYW1fLT5Jbml0aWFsaXplKGlucHV0X2F1ZGlvX3N0cmVhbV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld0V4cGVjdGVkU3RhdHVzQ0Ioc3RhdHVzKSk7Ci0gICAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLSAgfQotCi0gIHZvaWQgSW5pdGlhbGl6ZVZpZGVvQW5kRXhwZWN0U3RhdHVzKGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXBlbGluZVN0YXR1cyBzdGF0dXMpIHsKLSAgICBFWFBFQ1RfQ0FMTCgqaW5wdXRfdmlkZW9fc3RyZWFtXywgdmlkZW9fZGVjb2Rlcl9jb25maWcoKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVyblJlZihjb25maWcpKTsKLSAgICBFWFBFQ1RfQ0FMTCgqaW5wdXRfdmlkZW9fc3RyZWFtXywgdHlwZSgpKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKERlbXV4ZXJTdHJlYW06OlZJREVPKSk7Ci0KLSAgICBkZW11eGVyX3N0cmVhbV8tPkluaXRpYWxpemUoaW5wdXRfdmlkZW9fc3RyZWFtXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3RXhwZWN0ZWRTdGF0dXNDQihzdGF0dXMpKTsKLSAgICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotICB9Ci0KLSAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gdGVzdCBzdHJlYW0tdHlwZS1uZXV0cmFsIGxvZ2ljIGluCi0gIC8vIERlY3J5cHRpbmdEZW11eGVyU3RyZWFtLiBUaGVyZWZvcmUsIHdlIGRvbid0IHNwZWNpZnkgYXVkaW8gb3IgdmlkZW8gaW4gdGhlCi0gIC8vIGZ1bmN0aW9uIG5hbWVzLiBCdXQgZm9yIHRlc3RpbmcgcHVycG9zZSwgdGhleSBhbGwgdXNlIGFuIGF1ZGlvIGlucHV0Ci0gIC8vIGRlbXV4ZXIgc3RyZWFtLgotCi0gIHZvaWQgSW5pdGlhbGl6ZSgpIHsKLSAgICBFWFBFQ1RfQ0FMTCgqdGhpcywgUmVxdWVzdERlY3J5cHRvck5vdGlmaWNhdGlvbihfKSkKLSAgICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrSWZOb3ROdWxsKGRlY3J5cHRvcl8uZ2V0KCkpKTsKLSAgICBFWFBFQ1RfQ0FMTCgqZGVjcnlwdG9yXywgUmVnaXN0ZXJLZXlBZGRlZENCKERlY3J5cHRvcjo6a0F1ZGlvLCBfKSkKLSAgICAgICAgLldpbGxPbmNlKFNhdmVBcmc8MT4oJmtleV9hZGRlZF9jYl8pKTsKLQotICAgIEF1ZGlvRGVjb2RlckNvbmZpZyBpbnB1dF9jb25maWcoCi0gICAgICAgIGtDb2RlY1ZvcmJpcywgMTYsIENIQU5ORUxfTEFZT1VUX1NURVJFTywgNDQxMDAsIE5VTEwsIDAsIHRydWUpOwotICAgIEluaXRpYWxpemVBdWRpb0FuZEV4cGVjdFN0YXR1cyhpbnB1dF9jb25maWcsIFBJUEVMSU5FX09LKTsKLQotICAgIGNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYgb3V0cHV0X2NvbmZpZyA9Ci0gICAgICAgIGRlbXV4ZXJfc3RyZWFtXy0+YXVkaW9fZGVjb2Rlcl9jb25maWcoKTsKLSAgICBFWFBFQ1RfRVEoRGVtdXhlclN0cmVhbTo6QVVESU8sIGRlbXV4ZXJfc3RyZWFtXy0+dHlwZSgpKTsKLSAgICBFWFBFQ1RfRkFMU0Uob3V0cHV0X2NvbmZpZy5pc19lbmNyeXB0ZWQoKSk7Ci0gICAgRVhQRUNUX0VRKDE2LCBvdXRwdXRfY29uZmlnLmJpdHNfcGVyX2NoYW5uZWwoKSk7Ci0gICAgRVhQRUNUX0VRKENIQU5ORUxfTEFZT1VUX1NURVJFTywgb3V0cHV0X2NvbmZpZy5jaGFubmVsX2xheW91dCgpKTsKLSAgICBFWFBFQ1RfRVEoNDQxMDAsIG91dHB1dF9jb25maWcuc2FtcGxlc19wZXJfc2Vjb25kKCkpOwotICB9Ci0KLSAgdm9pZCBSZWFkQW5kRXhwZWN0QnVmZmVyUmVhZHlXaXRoKAotICAgICAgRGVtdXhlclN0cmVhbTo6U3RhdHVzIHN0YXR1cywKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGRlY3J5cHRlZF9idWZmZXIpIHsKLSAgICBpZiAoc3RhdHVzICE9IERlbXV4ZXJTdHJlYW06OmtPaykKLSAgICAgIEVYUEVDVF9DQUxMKCp0aGlzLCBCdWZmZXJSZWFkeShzdGF0dXMsIElzTnVsbCgpKSk7Ci0gICAgZWxzZSBpZiAoZGVjcnlwdGVkX2J1ZmZlci0+SXNFbmRPZlN0cmVhbSgpKQotICAgICAgRVhQRUNUX0NBTEwoKnRoaXMsIEJ1ZmZlclJlYWR5KHN0YXR1cywgSXNFbmRPZlN0cmVhbSgpKSk7Ci0gICAgZWxzZQotICAgICAgRVhQRUNUX0NBTEwoKnRoaXMsIEJ1ZmZlclJlYWR5KHN0YXR1cywgZGVjcnlwdGVkX2J1ZmZlcikpOwotCi0gICAgZGVtdXhlcl9zdHJlYW1fLT5SZWFkKGJhc2U6OkJpbmQoJkRlY3J5cHRpbmdEZW11eGVyU3RyZWFtVGVzdDo6QnVmZmVyUmVhZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICAgIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci0gIH0KLQotICAvLyBTZXRzIHVwIGV4cGVjdGF0aW9ucyBhbmQgYWN0aW9ucyB0byBwdXQgRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW0gaW4gYW4KLSAgLy8gYWN0aXZlIG5vcm1hbCByZWFkaW5nIHN0YXRlLgotICB2b2lkIEVudGVyTm9ybWFsUmVhZGluZ1N0YXRlKCkgewotICAgIEVYUEVDVF9DQUxMKCppbnB1dF9hdWRpb19zdHJlYW1fLCBSZWFkKF8pKQotICAgICAgICAuV2lsbE9uY2UoUmV0dXJuQnVmZmVyKGVuY3J5cHRlZF9idWZmZXJfKSk7Ci0gICAgRVhQRUNUX0NBTEwoKmRlY3J5cHRvcl8sIERlY3J5cHQoXywgXywgXykpCi0gICAgICAgIC5XaWxsT25jZShSdW5DYWxsYmFjazwyPihEZWNyeXB0b3I6OmtTdWNjZXNzLCBkZWNyeXB0ZWRfYnVmZmVyXykpOwotCi0gICAgUmVhZEFuZEV4cGVjdEJ1ZmZlclJlYWR5V2l0aChEZW11eGVyU3RyZWFtOjprT2ssIGRlY3J5cHRlZF9idWZmZXJfKTsKLSAgfQotCi0gIC8vIE1ha2UgdGhlIHJlYWQgY2FsbGJhY2sgcGVuZGluZyBieSBzYXZpbmcgYW5kIG5vdCBmaXJpbmcgaXQuCi0gIHZvaWQgRW50ZXJQZW5kaW5nUmVhZFN0YXRlKCkgewotICAgIEVYUEVDVF9UUlVFKHBlbmRpbmdfZGVtdXhlcl9yZWFkX2NiXy5pc19udWxsKCkpOwotICAgIEVYUEVDVF9DQUxMKCppbnB1dF9hdWRpb19zdHJlYW1fLCBSZWFkKF8pKQotICAgICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwwPigmcGVuZGluZ19kZW11eGVyX3JlYWRfY2JfKSk7Ci0gICAgZGVtdXhlcl9zdHJlYW1fLT5SZWFkKGJhc2U6OkJpbmQoJkRlY3J5cHRpbmdEZW11eGVyU3RyZWFtVGVzdDo6QnVmZmVyUmVhZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICAgIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci0gICAgLy8gTWFrZSBzdXJlIHRoZSBSZWFkKCkgdHJpZ2dlcnMgYSBSZWFkKCkgb24gdGhlIGlucHV0IGRlbXV4ZXIgc3RyZWFtLgotICAgIEVYUEVDVF9GQUxTRShwZW5kaW5nX2RlbXV4ZXJfcmVhZF9jYl8uaXNfbnVsbCgpKTsKLSAgfQotCi0gIC8vIE1ha2UgdGhlIGRlY3J5cHQgY2FsbGJhY2sgcGVuZGluZyBieSBzYXZpbmcgYW5kIG5vdCBmaXJpbmcgaXQuCi0gIHZvaWQgRW50ZXJQZW5kaW5nRGVjcnlwdFN0YXRlKCkgewotICAgIEVYUEVDVF9UUlVFKHBlbmRpbmdfZGVjcnlwdF9jYl8uaXNfbnVsbCgpKTsKLSAgICBFWFBFQ1RfQ0FMTCgqaW5wdXRfYXVkaW9fc3RyZWFtXywgUmVhZChfKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybkJ1ZmZlcihlbmNyeXB0ZWRfYnVmZmVyXykpOwotICAgIEVYUEVDVF9DQUxMKCpkZWNyeXB0b3JfLCBEZWNyeXB0KF8sIGVuY3J5cHRlZF9idWZmZXJfLCBfKSkKLSAgICAgICAgLldpbGxPbmNlKFNhdmVBcmc8Mj4oJnBlbmRpbmdfZGVjcnlwdF9jYl8pKTsKLQotICAgIGRlbXV4ZXJfc3RyZWFtXy0+UmVhZChiYXNlOjpCaW5kKCZEZWNyeXB0aW5nRGVtdXhlclN0cmVhbVRlc3Q6OkJ1ZmZlclJlYWR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLSAgICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotICAgIC8vIE1ha2Ugc3VyZSBSZWFkKCkgdHJpZ2dlcnMgYSBEZWNyeXB0KCkgb24gdGhlIGRlY3J5cHRvci4KLSAgICBFWFBFQ1RfRkFMU0UocGVuZGluZ19kZWNyeXB0X2NiXy5pc19udWxsKCkpOwotICB9Ci0KLSAgdm9pZCBFbnRlcldhaXRpbmdGb3JLZXlTdGF0ZSgpIHsKLSAgICBFWFBFQ1RfQ0FMTCgqaW5wdXRfYXVkaW9fc3RyZWFtXywgUmVhZChfKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybkJ1ZmZlcihlbmNyeXB0ZWRfYnVmZmVyXykpOwotICAgIEVYUEVDVF9DQUxMKCpkZWNyeXB0b3JfLCBEZWNyeXB0KF8sIGVuY3J5cHRlZF9idWZmZXJfLCBfKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJ1bkNhbGxiYWNrPDI+KERlY3J5cHRvcjo6a05vS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPigpKSk7Ci0gICAgZGVtdXhlcl9zdHJlYW1fLT5SZWFkKGJhc2U6OkJpbmQoJkRlY3J5cHRpbmdEZW11eGVyU3RyZWFtVGVzdDo6QnVmZmVyUmVhZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICAgIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci0gIH0KLQotICB2b2lkIEFib3J0UGVuZGluZ0RlY3J5cHRDQigpIHsKLSAgICBpZiAoIXBlbmRpbmdfZGVjcnlwdF9jYl8uaXNfbnVsbCgpKSB7Ci0gICAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcGVuZGluZ19kZWNyeXB0X2NiXykuUnVuKERlY3J5cHRvcjo6a1N1Y2Nlc3MsIE5VTEwpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgUmVzZXQoKSB7Ci0gICAgRVhQRUNUX0NBTEwoKmRlY3J5cHRvcl8sIENhbmNlbERlY3J5cHQoRGVjcnlwdG9yOjprQXVkaW8pKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoSW52b2tlV2l0aG91dEFyZ3MoCi0gICAgICAgICAgICB0aGlzLCAmRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW1UZXN0OjpBYm9ydFBlbmRpbmdEZWNyeXB0Q0IpKTsKLQotICAgIGRlbXV4ZXJfc3RyZWFtXy0+UmVzZXQoTmV3RXhwZWN0ZWRDbG9zdXJlKCkpOwotICAgIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci0gIH0KLQotICBNT0NLX01FVEhPRDEoUmVxdWVzdERlY3J5cHRvck5vdGlmaWNhdGlvbiwgdm9pZChjb25zdCBEZWNyeXB0b3JSZWFkeUNCJikpOwotCi0gIE1PQ0tfTUVUSE9EMihCdWZmZXJSZWFkeSwgdm9pZChEZW11eGVyU3RyZWFtOjpTdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JikpOwotCi0gIE1lc3NhZ2VMb29wIG1lc3NhZ2VfbG9vcF87Ci0gIHNjb3BlZF9yZWZwdHI8RGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW0+IGRlbXV4ZXJfc3RyZWFtXzsKLSAgc2NvcGVkX3B0cjxTdHJpY3RNb2NrPE1vY2tEZWNyeXB0b3I+ID4gZGVjcnlwdG9yXzsKLSAgc2NvcGVkX3JlZnB0cjxTdHJpY3RNb2NrPE1vY2tEZW11eGVyU3RyZWFtPiA+IGlucHV0X2F1ZGlvX3N0cmVhbV87Ci0gIHNjb3BlZF9yZWZwdHI8U3RyaWN0TW9jazxNb2NrRGVtdXhlclN0cmVhbT4gPiBpbnB1dF92aWRlb19zdHJlYW1fOwotCi0gIERlbXV4ZXJTdHJlYW06OlJlYWRDQiBwZW5kaW5nX2RlbXV4ZXJfcmVhZF9jYl87Ci0gIERlY3J5cHRvcjo6S2V5QWRkZWRDQiBrZXlfYWRkZWRfY2JfOwotICBEZWNyeXB0b3I6OkRlY3J5cHRDQiBwZW5kaW5nX2RlY3J5cHRfY2JfOwotCi0gIC8vIENvbnN0YW50IGJ1ZmZlcnMgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIGlucHV0IGRlbXV4ZXIgc3RyZWFtcyBhbmQgdGhlCi0gIC8vIHxkZWNyeXB0b3JffC4KLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBlbmNyeXB0ZWRfYnVmZmVyXzsKLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBkZWNyeXB0ZWRfYnVmZmVyXzsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihEZWNyeXB0aW5nRGVtdXhlclN0cmVhbVRlc3QpOwotfTsKLQotVEVTVF9GKERlY3J5cHRpbmdEZW11eGVyU3RyZWFtVGVzdCwgSW5pdGlhbGl6ZV9Ob3JtYWxBdWRpbykgewotICBJbml0aWFsaXplKCk7Ci19Ci0KLVRFU1RfRihEZWNyeXB0aW5nRGVtdXhlclN0cmVhbVRlc3QsIEluaXRpYWxpemVfTm9ybWFsVmlkZW8pIHsKLSAgRVhQRUNUX0NBTEwoKnRoaXMsIFJlcXVlc3REZWNyeXB0b3JOb3RpZmljYXRpb24oXykpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2tJZk5vdE51bGwoZGVjcnlwdG9yXy5nZXQoKSkpOwotICBFWFBFQ1RfQ0FMTCgqZGVjcnlwdG9yXywgUmVnaXN0ZXJLZXlBZGRlZENCKERlY3J5cHRvcjo6a1ZpZGVvLCBfKSkKLSAgICAgICAgLldpbGxPbmNlKFNhdmVBcmc8MT4oJmtleV9hZGRlZF9jYl8pKTsKLQotICBWaWRlb0RlY29kZXJDb25maWcgY29uZmlnKGtDb2RlY1ZQOCwgVklERU9fQ09ERUNfUFJPRklMRV9VTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWaWRlb0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ29kZWRTaXplLCBrVmlzaWJsZVJlY3QsIGtOYXR1cmFsU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCB0cnVlKTsKLSAgSW5pdGlhbGl6ZVZpZGVvQW5kRXhwZWN0U3RhdHVzKGNvbmZpZywgUElQRUxJTkVfT0spOwotCi0gIGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgb3V0cHV0X2NvbmZpZyA9Ci0gICAgICBkZW11eGVyX3N0cmVhbV8tPnZpZGVvX2RlY29kZXJfY29uZmlnKCk7Ci0gIEVYUEVDVF9FUShEZW11eGVyU3RyZWFtOjpWSURFTywgZGVtdXhlcl9zdHJlYW1fLT50eXBlKCkpOwotICBFWFBFQ1RfRkFMU0Uob3V0cHV0X2NvbmZpZy5pc19lbmNyeXB0ZWQoKSk7Ci0gIEVYUEVDVF9FUShrQ29kZWNWUDgsIG91dHB1dF9jb25maWcuY29kZWMoKSk7Ci0gIEVYUEVDVF9FUShrVmlkZW9Gb3JtYXQsIG91dHB1dF9jb25maWcuZm9ybWF0KCkpOwotICBFWFBFQ1RfRVEoVklERU9fQ09ERUNfUFJPRklMRV9VTktOT1dOLCBvdXRwdXRfY29uZmlnLnByb2ZpbGUoKSk7Ci0gIEVYUEVDVF9FUShrQ29kZWRTaXplLCBvdXRwdXRfY29uZmlnLmNvZGVkX3NpemUoKSk7Ci0gIEVYUEVDVF9FUShrVmlzaWJsZVJlY3QsIG91dHB1dF9jb25maWcudmlzaWJsZV9yZWN0KCkpOwotICBFWFBFQ1RfRVEoa05hdHVyYWxTaXplLCBvdXRwdXRfY29uZmlnLm5hdHVyYWxfc2l6ZSgpKTsKLSAgRVhQRUNUX0ZBTFNFKG91dHB1dF9jb25maWcuZXh0cmFfZGF0YSgpKTsKLSAgRVhQRUNUX0VRKDB1LCBvdXRwdXRfY29uZmlnLmV4dHJhX2RhdGFfc2l6ZSgpKTsKLX0KLQotVEVTVF9GKERlY3J5cHRpbmdEZW11eGVyU3RyZWFtVGVzdCwgSW5pdGlhbGl6ZV9OdWxsRGVjcnlwdG9yKSB7Ci0gIEVYUEVDVF9DQUxMKCp0aGlzLCBSZXF1ZXN0RGVjcnlwdG9yTm90aWZpY2F0aW9uKF8pKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJ1bkNhbGxiYWNrSWZOb3ROdWxsKHN0YXRpY19jYXN0PERlY3J5cHRvcio+KE5VTEwpKSk7Ci0KLSAgQXVkaW9EZWNvZGVyQ29uZmlnIGlucHV0X2NvbmZpZyhrQ29kZWNWb3JiaXMsIGtTYW1wbGVGb3JtYXRQbGFuYXJGMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9MQVlPVVRfU1RFUkVPLCA0NDEwMCwgTlVMTCwgMCwgdHJ1ZSk7Ci0gIEluaXRpYWxpemVBdWRpb0FuZEV4cGVjdFN0YXR1cyhpbnB1dF9jb25maWcsIERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCk7Ci19Ci0KLS8vIFRlc3Qgbm9ybWFsIHJlYWQgY2FzZS4KLVRFU1RfRihEZWNyeXB0aW5nRGVtdXhlclN0cmVhbVRlc3QsIFJlYWRfTm9ybWFsKSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgRW50ZXJOb3JtYWxSZWFkaW5nU3RhdGUoKTsKLX0KLQotLy8gVGVzdCB0aGUgY2FzZSB3aGVyZSB0aGUgZGVjcnlwdG9yIHJldHVybnMgZXJyb3IgZHVyaW5nIHJlYWQuCi1URVNUX0YoRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW1UZXN0LCBSZWFkX0RlY3J5cHRFcnJvcikgewotICBJbml0aWFsaXplKCk7Ci0KLSAgRVhQRUNUX0NBTEwoKmlucHV0X2F1ZGlvX3N0cmVhbV8sIFJlYWQoXykpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuQnVmZmVyKGVuY3J5cHRlZF9idWZmZXJfKSk7Ci0gIEVYUEVDVF9DQUxMKCpkZWNyeXB0b3JfLCBEZWNyeXB0KF8sIGVuY3J5cHRlZF9idWZmZXJfLCBfKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSdW5DYWxsYmFjazwyPihEZWNyeXB0b3I6OmtFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+KCkpKTsKLSAgUmVhZEFuZEV4cGVjdEJ1ZmZlclJlYWR5V2l0aChEZW11eGVyU3RyZWFtOjprQWJvcnRlZCwgTlVMTCk7Ci19Ci0KLS8vIFRlc3QgdGhlIGNhc2Ugd2hlcmUgdGhlIGlucHV0IGlzIGFuIGVuZC1vZi1zdHJlYW0gYnVmZmVyLgotVEVTVF9GKERlY3J5cHRpbmdEZW11eGVyU3RyZWFtVGVzdCwgUmVhZF9FbmRPZlN0cmVhbSkgewotICBJbml0aWFsaXplKCk7Ci0gIEVudGVyTm9ybWFsUmVhZGluZ1N0YXRlKCk7Ci0KLSAgLy8gTm8gRGVjcnlwdG9yOjpEZWNyeXB0KCkgY2FsbCBpcyBleHBlY3RlZCBmb3IgRU9TIGJ1ZmZlci4KLSAgRVhQRUNUX0NBTEwoKmlucHV0X2F1ZGlvX3N0cmVhbV8sIFJlYWQoXykpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuQnVmZmVyKERlY29kZXJCdWZmZXI6OkNyZWF0ZUVPU0J1ZmZlcigpKSk7Ci0KLSAgUmVhZEFuZEV4cGVjdEJ1ZmZlclJlYWR5V2l0aChEZW11eGVyU3RyZWFtOjprT2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlckJ1ZmZlcjo6Q3JlYXRlRU9TQnVmZmVyKCkpOwotfQotCi0vLyBUZXN0IHRoZSBjYXNlIHdoZXJlIHRoZSBhIGtleSBpcyBhZGRlZCB3aGVuIHRoZSBkZWNyeXB0b3IgaXMgaW4KLS8vIGtXYWl0aW5nRm9yS2V5IHN0YXRlLgotVEVTVF9GKERlY3J5cHRpbmdEZW11eGVyU3RyZWFtVGVzdCwgS2V5QWRkZWRfRHVyaW5nV2FpdGluZ0ZvcktleSkgewotICBJbml0aWFsaXplKCk7Ci0gIEVudGVyV2FpdGluZ0ZvcktleVN0YXRlKCk7Ci0KLSAgRVhQRUNUX0NBTEwoKmRlY3J5cHRvcl8sIERlY3J5cHQoXywgZW5jcnlwdGVkX2J1ZmZlcl8sIF8pKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJ1bkNhbGxiYWNrPDI+KERlY3J5cHRvcjo6a1N1Y2Nlc3MsIGRlY3J5cHRlZF9idWZmZXJfKSk7Ci0gIEVYUEVDVF9DQUxMKCp0aGlzLCBCdWZmZXJSZWFkeShEZW11eGVyU3RyZWFtOjprT2ssIGRlY3J5cHRlZF9idWZmZXJfKSk7Ci0gIGtleV9hZGRlZF9jYl8uUnVuKCk7Ci0gIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci19Ci0KLS8vIFRlc3QgdGhlIGNhc2Ugd2hlcmUgdGhlIGEga2V5IGlzIGFkZGVkIHdoZW4gdGhlIGRlY3J5cHRvciBpcyBpbgotLy8ga1BlbmRpbmdEZWNyeXB0IHN0YXRlLgotVEVTVF9GKERlY3J5cHRpbmdEZW11eGVyU3RyZWFtVGVzdCwgS2V5QWRkZWRfRHJ1aW5nUGVuZGluZ0RlY3J5cHQpIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBFbnRlclBlbmRpbmdEZWNyeXB0U3RhdGUoKTsKLQotICBFWFBFQ1RfQ0FMTCgqZGVjcnlwdG9yXywgRGVjcnlwdChfLCBlbmNyeXB0ZWRfYnVmZmVyXywgXykpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUnVuQ2FsbGJhY2s8Mj4oRGVjcnlwdG9yOjprU3VjY2VzcywgZGVjcnlwdGVkX2J1ZmZlcl8pKTsKLSAgRVhQRUNUX0NBTEwoKnRoaXMsIEJ1ZmZlclJlYWR5KERlbXV4ZXJTdHJlYW06OmtPaywgZGVjcnlwdGVkX2J1ZmZlcl8pKTsKLSAgLy8gVGhlIGRlY3J5cHQgY2FsbGJhY2sgaXMgcmV0dXJuZWQgYWZ0ZXIgdGhlIGNvcnJlY3QgZGVjcnlwdGlvbiBrZXkgaXMgYWRkZWQuCi0gIGtleV9hZGRlZF9jYl8uUnVuKCk7Ci0gIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZwZW5kaW5nX2RlY3J5cHRfY2JfKS5SdW4oRGVjcnlwdG9yOjprTm9LZXksIE5VTEwpOwotICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotfQotCi0vLyBUZXN0IHJlc2V0dGluZyB3aGVuIHRoZSBEZWNyeXB0aW5nRGVtdXhlclN0cmVhbSBpcyBpbiBrSWRsZSBzdGF0ZSBidXQgaGFzCi0vLyBub3QgcmV0dXJuZWQgYW55IGJ1ZmZlci4KLVRFU1RfRihEZWNyeXB0aW5nRGVtdXhlclN0cmVhbVRlc3QsIFJlc2V0X0R1cmluZ0lkbGVBZnRlckluaXRpYWxpemF0aW9uKSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgUmVzZXQoKTsKLX0KLQotLy8gVGVzdCByZXNldHRpbmcgd2hlbiB0aGUgRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW0gaXMgaW4ga0lkbGUgc3RhdGUgYWZ0ZXIgaXQKLS8vIGhhcyByZXR1cm5lZCBvbmUgYnVmZmVyLgotVEVTVF9GKERlY3J5cHRpbmdEZW11eGVyU3RyZWFtVGVzdCwgUmVzZXRfRHVyaW5nSWRsZUFmdGVyUmVhZE9uZUJ1ZmZlcikgewotICBJbml0aWFsaXplKCk7Ci0gIEVudGVyTm9ybWFsUmVhZGluZ1N0YXRlKCk7Ci0gIFJlc2V0KCk7Ci19Ci0KLS8vIFRlc3QgcmVzZXR0aW5nIHdoZW4gRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW0gaXMgaW4ga1BlbmRpbmdEZW11eGVyUmVhZCBzdGF0ZS4KLVRFU1RfRihEZWNyeXB0aW5nRGVtdXhlclN0cmVhbVRlc3QsIFJlc2V0X0R1cmluZ1BlbmRpbmdEZW11eGVyUmVhZCkgewotICBJbml0aWFsaXplKCk7Ci0gIEVudGVyUGVuZGluZ1JlYWRTdGF0ZSgpOwotCi0gIEVYUEVDVF9DQUxMKCp0aGlzLCBCdWZmZXJSZWFkeShEZW11eGVyU3RyZWFtOjprQWJvcnRlZCwgSXNOdWxsKCkpKTsKLQotICBSZXNldCgpOwotICBiYXNlOjpSZXNldEFuZFJldHVybigmcGVuZGluZ19kZW11eGVyX3JlYWRfY2JfKS5SdW4oRGVtdXhlclN0cmVhbTo6a09rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkX2J1ZmZlcl8pOwotICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotfQotCi0vLyBUZXN0IHJlc2V0dGluZyB3aGVuIHRoZSBEZWNyeXB0aW5nRGVtdXhlclN0cmVhbSBpcyBpbiBrUGVuZGluZ0RlY3J5cHQgc3RhdGUuCi1URVNUX0YoRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW1UZXN0LCBSZXNldF9EdXJpbmdQZW5kaW5nRGVjcnlwdCkgewotICBJbml0aWFsaXplKCk7Ci0gIEVudGVyUGVuZGluZ0RlY3J5cHRTdGF0ZSgpOwotCi0gIEVYUEVDVF9DQUxMKCp0aGlzLCBCdWZmZXJSZWFkeShEZW11eGVyU3RyZWFtOjprQWJvcnRlZCwgSXNOdWxsKCkpKTsKLQotICBSZXNldCgpOwotfQotCi0vLyBUZXN0IHJlc2V0dGluZyB3aGVuIHRoZSBEZWNyeXB0aW5nRGVtdXhlclN0cmVhbSBpcyBpbiBrV2FpdGluZ0ZvcktleSBzdGF0ZS4KLVRFU1RfRihEZWNyeXB0aW5nRGVtdXhlclN0cmVhbVRlc3QsIFJlc2V0X0R1cmluZ1dhaXRpbmdGb3JLZXkpIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBFbnRlcldhaXRpbmdGb3JLZXlTdGF0ZSgpOwotCi0gIEVYUEVDVF9DQUxMKCp0aGlzLCBCdWZmZXJSZWFkeShEZW11eGVyU3RyZWFtOjprQWJvcnRlZCwgSXNOdWxsKCkpKTsKLQotICBSZXNldCgpOwotfQotCi0vLyBUZXN0IHJlc2V0dGluZyBhZnRlciB0aGUgRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW0gaGFzIGJlZW4gcmVzZXQuCi1URVNUX0YoRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW1UZXN0LCBSZXNldF9BZnRlclJlc2V0KSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgRW50ZXJOb3JtYWxSZWFkaW5nU3RhdGUoKTsKLSAgUmVzZXQoKTsKLSAgUmVzZXQoKTsKLX0KLQotLy8gVGVzdCBhYm9ydGVkIHJlYWQgb24gdGhlIGRlbXV4ZXIgc3RyZWFtLgotVEVTVF9GKERlY3J5cHRpbmdEZW11eGVyU3RyZWFtVGVzdCwgRGVtdXhlclJlYWRfQWJvcnRlZCkgewotICBJbml0aWFsaXplKCk7Ci0KLSAgLy8gUmV0dXJuQnVmZmVyKCkgd2l0aCBOVUxMIHRyaWdnZXJzIGFib3J0ZWQgZGVtdXhlciByZWFkLgotICBFWFBFQ1RfQ0FMTCgqaW5wdXRfYXVkaW9fc3RyZWFtXywgUmVhZChfKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm5CdWZmZXIoc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPigpKSk7Ci0KLSAgUmVhZEFuZEV4cGVjdEJ1ZmZlclJlYWR5V2l0aChEZW11eGVyU3RyZWFtOjprQWJvcnRlZCwgTlVMTCk7Ci19Ci0KLS8vIFRlc3QgYWJvcnRlZCByZWFkIG9uIHRoZSBpbnB1dCBkZW11eGVyIHN0cmVhbSB3aGVuIHRoZQotLy8gRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW0gaXMgYmVpbmcgcmVzZXQuCi1URVNUX0YoRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW1UZXN0LCBEZW11eGVyUmVhZF9BYm9ydGVkRHVyaW5nUmVzZXQpIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBFbnRlclBlbmRpbmdSZWFkU3RhdGUoKTsKLQotICAvLyBNYWtlIHN1cmUgd2UgZ2V0IGEgTlVMTCBhdWRpbyBmcmFtZSByZXR1cm5lZC4KLSAgRVhQRUNUX0NBTEwoKnRoaXMsIEJ1ZmZlclJlYWR5KERlbXV4ZXJTdHJlYW06OmtBYm9ydGVkLCBJc051bGwoKSkpOwotCi0gIFJlc2V0KCk7Ci0gIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZwZW5kaW5nX2RlbXV4ZXJfcmVhZF9jYl8pLlJ1bihEZW11eGVyU3RyZWFtOjprQWJvcnRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotfQotCi0vLyBUZXN0IGNvbmZpZyBjaGFuZ2Ugb24gdGhlIGlucHV0IGRlbXV4ZXIgc3RyZWFtLgotVEVTVF9GKERlY3J5cHRpbmdEZW11eGVyU3RyZWFtVGVzdCwgRGVtdXhlclJlYWRfQ29uZmlnQ2hhbmdlZCkgewotICBJbml0aWFsaXplKCk7Ci0KLSAgQXVkaW9EZWNvZGVyQ29uZmlnIG5ld19jb25maWcoCi0gICAgICBrQ29kZWNWb3JiaXMsIDMyLCBDSEFOTkVMX0xBWU9VVF9TVEVSRU8sIDg4MjAwLCBOVUxMLCAwLCB0cnVlKTsKLQotICBFWFBFQ1RfQ0FMTCgqaW5wdXRfYXVkaW9fc3RyZWFtXywgYXVkaW9fZGVjb2Rlcl9jb25maWcoKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm5SZWYobmV3X2NvbmZpZykpOwotCi0gIEVYUEVDVF9DQUxMKCppbnB1dF9hdWRpb19zdHJlYW1fLCBSZWFkKF8pKQotICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrPDA+KERlbXV4ZXJTdHJlYW06OmtDb25maWdDaGFuZ2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4oKSkpOwotCi0gIFJlYWRBbmRFeHBlY3RCdWZmZXJSZWFkeVdpdGgoRGVtdXhlclN0cmVhbTo6a0NvbmZpZ0NoYW5nZWQsIE5VTEwpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL2RlY3J5cHRpbmdfdmlkZW9fZGVjb2Rlci5jYyBiL3NyYy9tZWRpYS9maWx0ZXJzL2RlY3J5cHRpbmdfdmlkZW9fZGVjb2Rlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVkYjFjNi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9kZWNyeXB0aW5nX3ZpZGVvX2RlY29kZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvZGVjcnlwdGluZ192aWRlb19kZWNvZGVyLmgiCi0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiYmFzZS9sb2NhdGlvbi5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wX3Byb3h5LmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9iaW5kX3RvX2xvb3AuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNyeXB0b3IuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlbXV4ZXJfc3RyZWFtLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9waXBlbGluZS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fZGVjb2Rlcl9jb25maWcuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2ZyYW1lLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLURlY3J5cHRpbmdWaWRlb0RlY29kZXI6OkRlY3J5cHRpbmdWaWRlb0RlY29kZXIoCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbWVzc2FnZV9sb29wLAotICAgIGNvbnN0IFNldERlY3J5cHRvclJlYWR5Q0ImIHNldF9kZWNyeXB0b3JfcmVhZHlfY2IpCi0gICAgOiBtZXNzYWdlX2xvb3BfKG1lc3NhZ2VfbG9vcCksCi0gICAgICBzdGF0ZV8oa1VuaW5pdGlhbGl6ZWQpLAotICAgICAgc2V0X2RlY3J5cHRvcl9yZWFkeV9jYl8oc2V0X2RlY3J5cHRvcl9yZWFkeV9jYiksCi0gICAgICBkZWNyeXB0b3JfKE5VTEwpLAotICAgICAga2V5X2FkZGVkX3doaWxlX2RlY29kZV9wZW5kaW5nXyhmYWxzZSksCi0gICAgICB0cmFjZV9pZF8oMCkgewotfQotCi12b2lkIERlY3J5cHRpbmdWaWRlb0RlY29kZXI6OkluaXRpYWxpemUoCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiYgc3RyZWFtLAotICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIHN0YXR1c19jYiwKLSAgICBjb25zdCBTdGF0aXN0aWNzQ0ImIHN0YXRpc3RpY3NfY2IpIHsKLSAgRFZMT0coMikgPDwgIkluaXRpYWxpemUoKSI7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBEQ0hFQ0tfRVEoc3RhdGVfLCBrVW5pbml0aWFsaXplZCkgPDwgc3RhdGVfOwotICBEQ0hFQ0soc3RyZWFtKTsKLSAgaW5pdF9jYl8gPSBCaW5kVG9DdXJyZW50TG9vcChzdGF0dXNfY2IpOwotCi0gIGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgY29uZmlnID0gc3RyZWFtLT52aWRlb19kZWNvZGVyX2NvbmZpZygpOwotICBpZiAoIWNvbmZpZy5Jc1ZhbGlkQ29uZmlnKCkpIHsKLSAgICBETE9HKEVSUk9SKSA8PCAiSW52YWxpZCB2aWRlbyBzdHJlYW0gY29uZmlnOiAiCi0gICAgICAgICAgICAgICAgPDwgY29uZmlnLkFzSHVtYW5SZWFkYWJsZVN0cmluZygpOwotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZpbml0X2NiXykuUnVuKFBJUEVMSU5FX0VSUk9SX0RFQ09ERSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gRGVjcnlwdGluZ1ZpZGVvRGVjb2RlciBvbmx5IGFjY2VwdHMgcG90ZW50aWFsbHkgZW5jcnlwdGVkIHN0cmVhbS4KLSAgaWYgKCFjb25maWcuaXNfZW5jcnlwdGVkKCkpIHsKLSAgICBiYXNlOjpSZXNldEFuZFJldHVybigmaW5pdF9jYl8pLlJ1bihERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIERDSEVDSyghZGVtdXhlcl9zdHJlYW1fKTsKLSAgZGVtdXhlcl9zdHJlYW1fID0gc3RyZWFtOwotICBzdGF0aXN0aWNzX2NiXyA9IHN0YXRpc3RpY3NfY2I7Ci0KLSAgc3RhdGVfID0ga0RlY3J5cHRvclJlcXVlc3RlZDsKLSAgc2V0X2RlY3J5cHRvcl9yZWFkeV9jYl8uUnVuKEJpbmRUb0N1cnJlbnRMb29wKGJhc2U6OkJpbmQoCi0gICAgICAmRGVjcnlwdGluZ1ZpZGVvRGVjb2Rlcjo6U2V0RGVjcnlwdG9yLCB0aGlzKSkpOwotfQotCi12b2lkIERlY3J5cHRpbmdWaWRlb0RlY29kZXI6OlJlYWQoY29uc3QgUmVhZENCJiByZWFkX2NiKSB7Ci0gIERWTE9HKDMpIDw8ICJSZWFkKCkiOwotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgRENIRUNLKHN0YXRlXyA9PSBrSWRsZSB8fCBzdGF0ZV8gPT0ga0RlY29kZUZpbmlzaGVkKSA8PCBzdGF0ZV87Ci0gIERDSEVDSyghcmVhZF9jYi5pc19udWxsKCkpOwotICBDSEVDSyhyZWFkX2NiXy5pc19udWxsKCkpIDw8ICJPdmVybGFwcGluZyBkZWNvZGVzIGFyZSBub3Qgc3VwcG9ydGVkLiI7Ci0gIHJlYWRfY2JfID0gQmluZFRvQ3VycmVudExvb3AocmVhZF9jYik7Ci0KLSAgLy8gUmV0dXJuIGVtcHR5IGZyYW1lcyBpZiBkZWNvZGluZyBoYXMgZmluaXNoZWQuCi0gIGlmIChzdGF0ZV8gPT0ga0RlY29kZUZpbmlzaGVkKSB7Ci0gICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnJlYWRfY2JfKS5SdW4oa09rLCBWaWRlb0ZyYW1lOjpDcmVhdGVFbXB0eUZyYW1lKCkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0YXRlXyA9IGtQZW5kaW5nRGVtdXhlclJlYWQ7Ci0gIFJlYWRGcm9tRGVtdXhlclN0cmVhbSgpOwotfQotCi12b2lkIERlY3J5cHRpbmdWaWRlb0RlY29kZXI6OlJlc2V0KGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNsb3N1cmUpIHsKLSAgRFZMT0coMikgPDwgIlJlc2V0KCkgLSBzdGF0ZTogIiA8PCBzdGF0ZV87Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBEQ0hFQ0soc3RhdGVfID09IGtJZGxlIHx8Ci0gICAgICAgICBzdGF0ZV8gPT0ga1BlbmRpbmdDb25maWdDaGFuZ2UgfHwKLSAgICAgICAgIHN0YXRlXyA9PSBrUGVuZGluZ0RlbXV4ZXJSZWFkIHx8Ci0gICAgICAgICBzdGF0ZV8gPT0ga1BlbmRpbmdEZWNvZGUgfHwKLSAgICAgICAgIHN0YXRlXyA9PSBrV2FpdGluZ0ZvcktleSB8fAotICAgICAgICAgc3RhdGVfID09IGtEZWNvZGVGaW5pc2hlZCkgPDwgc3RhdGVfOwotICBEQ0hFQ0soaW5pdF9jYl8uaXNfbnVsbCgpKTsgIC8vIE5vIFJlc2V0KCkgZHVyaW5nIHBlbmRpbmcgaW5pdGlhbGl6YXRpb24uCi0gIERDSEVDSyhyZXNldF9jYl8uaXNfbnVsbCgpKTsKLQotICByZXNldF9jYl8gPSBCaW5kVG9DdXJyZW50TG9vcChjbG9zdXJlKTsKLQotICBkZWNyeXB0b3JfLT5SZXNldERlY29kZXIoRGVjcnlwdG9yOjprVmlkZW8pOwotCi0gIC8vIFJlc2V0KCkgY2Fubm90IGNvbXBsZXRlIGlmIHRoZSByZWFkIGNhbGxiYWNrIGlzIHN0aWxsIHBlbmRpbmcuCi0gIC8vIERlZmVyIHRoZSByZXNldHRpbmcgcHJvY2VzcyBpbiB0aGlzIGNhc2UuIFRoZSB8cmVzZXRfY2JffCB3aWxsIGJlIGZpcmVkCi0gIC8vIGFmdGVyIHRoZSByZWFkIGNhbGxiYWNrIGlzIGZpcmVkIC0gc2VlIERlY3J5cHRBbmREZWNvZGVCdWZmZXIoKSBhbmQKLSAgLy8gRGVsaXZlckZyYW1lKCkuCi0gIGlmIChzdGF0ZV8gPT0ga1BlbmRpbmdDb25maWdDaGFuZ2UgfHwKLSAgICAgIHN0YXRlXyA9PSBrUGVuZGluZ0RlbXV4ZXJSZWFkIHx8Ci0gICAgICBzdGF0ZV8gPT0ga1BlbmRpbmdEZWNvZGUpIHsKLSAgICBEQ0hFQ0soIXJlYWRfY2JfLmlzX251bGwoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHN0YXRlXyA9PSBrV2FpdGluZ0ZvcktleSkgewotICAgIERDSEVDSyghcmVhZF9jYl8uaXNfbnVsbCgpKTsKLSAgICBwZW5kaW5nX2J1ZmZlcl90b19kZWNvZGVfID0gTlVMTDsKLSAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcmVhZF9jYl8pLlJ1bihrT2ssIE5VTEwpOwotICB9Ci0KLSAgRENIRUNLKHJlYWRfY2JfLmlzX251bGwoKSk7Ci0gIERvUmVzZXQoKTsKLX0KLQotdm9pZCBEZWNyeXB0aW5nVmlkZW9EZWNvZGVyOjpTdG9wKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNsb3N1cmUpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIERWTE9HKDIpIDw8ICJTdG9wKCkgLSBzdGF0ZTogIiA8PCBzdGF0ZV87Ci0KLSAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcmVuZGVyIHRocmVhZCBpcyBsaWtlbHkgcGF1c2VkIChpbiBXZWJNZWRpYVBsYXllckltcGwncwotICAvLyBEZXN0cm95KCkpLCBzbyBydW5uaW5nIHxjbG9zdXJlfCBjYW4ndCB3YWl0IGZvciBhbnl0aGluZyB0aGF0IHJlcXVpcmVzIHRoZQotICAvLyByZW5kZXIgdGhyZWFkIHRvIGJlIHByb2Nlc3NpbmcgbWVzc2FnZXMgdG8gY29tcGxldGUgKHN1Y2ggYXMgUFBBUEkKLSAgLy8gY2FsbGJhY2tzKS4KLSAgaWYgKGRlY3J5cHRvcl8pIHsKLSAgICBkZWNyeXB0b3JfLT5SZWdpc3RlcktleUFkZGVkQ0IoRGVjcnlwdG9yOjprVmlkZW8sIERlY3J5cHRvcjo6S2V5QWRkZWRDQigpKTsKLSAgICBkZWNyeXB0b3JfLT5EZWluaXRpYWxpemVEZWNvZGVyKERlY3J5cHRvcjo6a1ZpZGVvKTsKLSAgICBkZWNyeXB0b3JfID0gTlVMTDsKLSAgfQotICBpZiAoIXNldF9kZWNyeXB0b3JfcmVhZHlfY2JfLmlzX251bGwoKSkKLSAgICBiYXNlOjpSZXNldEFuZFJldHVybigmc2V0X2RlY3J5cHRvcl9yZWFkeV9jYl8pLlJ1bihEZWNyeXB0b3JSZWFkeUNCKCkpOwotICBwZW5kaW5nX2J1ZmZlcl90b19kZWNvZGVfID0gTlVMTDsKLSAgaWYgKCFpbml0X2NiXy5pc19udWxsKCkpCi0gICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJmluaXRfY2JfKS5SdW4oREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVEKTsKLSAgaWYgKCFyZWFkX2NiXy5pc19udWxsKCkpCi0gICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnJlYWRfY2JfKS5SdW4oa09rLCBOVUxMKTsKLSAgaWYgKCFyZXNldF9jYl8uaXNfbnVsbCgpKQotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZyZXNldF9jYl8pLlJ1bigpOwotICBzdGF0ZV8gPSBrU3RvcHBlZDsKLSAgQmluZFRvQ3VycmVudExvb3AoY2xvc3VyZSkuUnVuKCk7Ci19Ci0KLURlY3J5cHRpbmdWaWRlb0RlY29kZXI6On5EZWNyeXB0aW5nVmlkZW9EZWNvZGVyKCkgewotICBEQ0hFQ0soc3RhdGVfID09IGtVbmluaXRpYWxpemVkIHx8IHN0YXRlXyA9PSBrU3RvcHBlZCkgPDwgc3RhdGVfOwotfQotCi12b2lkIERlY3J5cHRpbmdWaWRlb0RlY29kZXI6OlNldERlY3J5cHRvcihEZWNyeXB0b3IqIGRlY3J5cHRvcikgewotICBEVkxPRygyKSA8PCAiU2V0RGVjcnlwdG9yKCkiOwotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLQotICBpZiAoc3RhdGVfID09IGtTdG9wcGVkKQotICAgIHJldHVybjsKLQotICBEQ0hFQ0tfRVEoc3RhdGVfLCBrRGVjcnlwdG9yUmVxdWVzdGVkKSA8PCBzdGF0ZV87Ci0gIERDSEVDSyghaW5pdF9jYl8uaXNfbnVsbCgpKTsKLSAgRENIRUNLKCFzZXRfZGVjcnlwdG9yX3JlYWR5X2NiXy5pc19udWxsKCkpOwotICBzZXRfZGVjcnlwdG9yX3JlYWR5X2NiXy5SZXNldCgpOwotCi0gIGlmICghZGVjcnlwdG9yKSB7Ci0gICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJmluaXRfY2JfKS5SdW4oREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVEKTsKLSAgICBzdGF0ZV8gPSBrU3RvcHBlZDsKLSAgICByZXR1cm47Ci0gIH0KLQotICBkZWNyeXB0b3JfID0gZGVjcnlwdG9yOwotCi0gIHNjb3BlZF9wdHI8VmlkZW9EZWNvZGVyQ29uZmlnPiBzY29wZWRfY29uZmlnKG5ldyBWaWRlb0RlY29kZXJDb25maWcoKSk7Ci0gIHNjb3BlZF9jb25maWctPkNvcHlGcm9tKGRlbXV4ZXJfc3RyZWFtXy0+dmlkZW9fZGVjb2Rlcl9jb25maWcoKSk7Ci0KLSAgc3RhdGVfID0ga1BlbmRpbmdEZWNvZGVySW5pdDsKLSAgZGVjcnlwdG9yXy0+SW5pdGlhbGl6ZVZpZGVvRGVjb2RlcigKLSAgICAgIHNjb3BlZF9jb25maWcuUGFzcygpLCBCaW5kVG9DdXJyZW50TG9vcChiYXNlOjpCaW5kKAotICAgICAgICAgICZEZWNyeXB0aW5nVmlkZW9EZWNvZGVyOjpGaW5pc2hJbml0aWFsaXphdGlvbiwgdGhpcykpKTsKLX0KLQotdm9pZCBEZWNyeXB0aW5nVmlkZW9EZWNvZGVyOjpGaW5pc2hJbml0aWFsaXphdGlvbihib29sIHN1Y2Nlc3MpIHsKLSAgRFZMT0coMikgPDwgIkZpbmlzaEluaXRpYWxpemF0aW9uKCkiOwotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLQotICBpZiAoc3RhdGVfID09IGtTdG9wcGVkKQotICAgIHJldHVybjsKLQotICBEQ0hFQ0tfRVEoc3RhdGVfLCBrUGVuZGluZ0RlY29kZXJJbml0KSA8PCBzdGF0ZV87Ci0gIERDSEVDSyghaW5pdF9jYl8uaXNfbnVsbCgpKTsKLSAgRENIRUNLKHJlc2V0X2NiXy5pc19udWxsKCkpOyAgLy8gTm8gUmVzZXQoKSBiZWZvcmUgaW5pdGlhbGl6YXRpb24gZmluaXNoZWQuCi0gIERDSEVDSyhyZWFkX2NiXy5pc19udWxsKCkpOyAgLy8gTm8gUmVhZCgpIGJlZm9yZSBpbml0aWFsaXphdGlvbiBmaW5pc2hlZC4KLQotICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICBiYXNlOjpSZXNldEFuZFJldHVybigmaW5pdF9jYl8pLlJ1bihERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQpOwotICAgIHN0YXRlXyA9IGtTdG9wcGVkOwotICAgIHJldHVybjsKLSAgfQotCi0gIGRlY3J5cHRvcl8tPlJlZ2lzdGVyS2V5QWRkZWRDQihEZWNyeXB0b3I6OmtWaWRlbywgQmluZFRvQ3VycmVudExvb3AoCi0gICAgICBiYXNlOjpCaW5kKCZEZWNyeXB0aW5nVmlkZW9EZWNvZGVyOjpPbktleUFkZGVkLCB0aGlzKSkpOwotCi0gIC8vIFN1Y2Nlc3MhCi0gIHN0YXRlXyA9IGtJZGxlOwotICBiYXNlOjpSZXNldEFuZFJldHVybigmaW5pdF9jYl8pLlJ1bihQSVBFTElORV9PSyk7Ci19Ci0KLXZvaWQgRGVjcnlwdGluZ1ZpZGVvRGVjb2Rlcjo6RmluaXNoQ29uZmlnQ2hhbmdlKGJvb2wgc3VjY2VzcykgewotICBEVkxPRygyKSA8PCAiRmluaXNoQ29uZmlnQ2hhbmdlKCkiOwotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLQotICBpZiAoc3RhdGVfID09IGtTdG9wcGVkKQotICAgIHJldHVybjsKLQotICBEQ0hFQ0tfRVEoc3RhdGVfLCBrUGVuZGluZ0NvbmZpZ0NoYW5nZSkgPDwgc3RhdGVfOwotICBEQ0hFQ0soIXJlYWRfY2JfLmlzX251bGwoKSk7Ci0KLSAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnJlYWRfY2JfKS5SdW4oa0RlY29kZUVycm9yLCBOVUxMKTsKLSAgICBzdGF0ZV8gPSBrRGVjb2RlRmluaXNoZWQ7Ci0gICAgaWYgKCFyZXNldF9jYl8uaXNfbnVsbCgpKQotICAgICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnJlc2V0X2NiXykuUnVuKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gQ29uZmlnIGNoYW5nZSBzdWNjZWVkZWQuCi0gIGlmICghcmVzZXRfY2JfLmlzX251bGwoKSkgewotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZyZWFkX2NiXykuUnVuKGtPaywgTlVMTCk7Ci0gICAgRG9SZXNldCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0YXRlXyA9IGtQZW5kaW5nRGVtdXhlclJlYWQ7Ci0gIFJlYWRGcm9tRGVtdXhlclN0cmVhbSgpOwotfQotCi12b2lkIERlY3J5cHRpbmdWaWRlb0RlY29kZXI6OlJlYWRGcm9tRGVtdXhlclN0cmVhbSgpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIERDSEVDS19FUShzdGF0ZV8sIGtQZW5kaW5nRGVtdXhlclJlYWQpIDw8IHN0YXRlXzsKLSAgRENIRUNLKCFyZWFkX2NiXy5pc19udWxsKCkpOwotCi0gIGRlbXV4ZXJfc3RyZWFtXy0+UmVhZCgKLSAgICAgIGJhc2U6OkJpbmQoJkRlY3J5cHRpbmdWaWRlb0RlY29kZXI6OkRlY3J5cHRBbmREZWNvZGVCdWZmZXIsIHRoaXMpKTsKLX0KLQotdm9pZCBEZWNyeXB0aW5nVmlkZW9EZWNvZGVyOjpEZWNyeXB0QW5kRGVjb2RlQnVmZmVyKAotICAgIERlbXV4ZXJTdHJlYW06OlN0YXR1cyBzdGF0dXMsCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgYnVmZmVyKSB7Ci0gIERWTE9HKDMpIDw8ICJEZWNyeXB0QW5kRGVjb2RlQnVmZmVyKCkiOwotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLQotICBpZiAoc3RhdGVfID09IGtTdG9wcGVkKQotICAgIHJldHVybjsKLQotICBEQ0hFQ0tfRVEoc3RhdGVfLCBrUGVuZGluZ0RlbXV4ZXJSZWFkKSA8PCBzdGF0ZV87Ci0gIERDSEVDSyghcmVhZF9jYl8uaXNfbnVsbCgpKTsKLSAgRENIRUNLX0VRKGJ1ZmZlciAhPSBOVUxMLCBzdGF0dXMgPT0gRGVtdXhlclN0cmVhbTo6a09rKSA8PCBzdGF0dXM7Ci0KLSAgaWYgKHN0YXR1cyA9PSBEZW11eGVyU3RyZWFtOjprQ29uZmlnQ2hhbmdlZCkgewotICAgIERWTE9HKDIpIDw8ICJEZWNyeXB0QW5kRGVjb2RlQnVmZmVyKCkgLSBrQ29uZmlnQ2hhbmdlZCI7Ci0KLSAgICBzY29wZWRfcHRyPFZpZGVvRGVjb2RlckNvbmZpZz4gc2NvcGVkX2NvbmZpZyhuZXcgVmlkZW9EZWNvZGVyQ29uZmlnKCkpOwotICAgIHNjb3BlZF9jb25maWctPkNvcHlGcm9tKGRlbXV4ZXJfc3RyZWFtXy0+dmlkZW9fZGVjb2Rlcl9jb25maWcoKSk7Ci0KLSAgICBzdGF0ZV8gPSBrUGVuZGluZ0NvbmZpZ0NoYW5nZTsKLSAgICBkZWNyeXB0b3JfLT5EZWluaXRpYWxpemVEZWNvZGVyKERlY3J5cHRvcjo6a1ZpZGVvKTsKLSAgICBkZWNyeXB0b3JfLT5Jbml0aWFsaXplVmlkZW9EZWNvZGVyKAotICAgICAgICBzY29wZWRfY29uZmlnLlBhc3MoKSwgQmluZFRvQ3VycmVudExvb3AoYmFzZTo6QmluZCgKLSAgICAgICAgICAgICZEZWNyeXB0aW5nVmlkZW9EZWNvZGVyOjpGaW5pc2hDb25maWdDaGFuZ2UsIHRoaXMpKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKCFyZXNldF9jYl8uaXNfbnVsbCgpKSB7Ci0gICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnJlYWRfY2JfKS5SdW4oa09rLCBOVUxMKTsKLSAgICBEb1Jlc2V0KCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHN0YXR1cyA9PSBEZW11eGVyU3RyZWFtOjprQWJvcnRlZCkgewotICAgIERWTE9HKDIpIDw8ICJEZWNyeXB0QW5kRGVjb2RlQnVmZmVyKCkgLSBrQWJvcnRlZCI7Ci0gICAgc3RhdGVfID0ga0lkbGU7Ci0gICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnJlYWRfY2JfKS5SdW4oa09rLCBOVUxMKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBEQ0hFQ0tfRVEoc3RhdHVzLCBEZW11eGVyU3RyZWFtOjprT2spOwotICBwZW5kaW5nX2J1ZmZlcl90b19kZWNvZGVfID0gYnVmZmVyOwotICBzdGF0ZV8gPSBrUGVuZGluZ0RlY29kZTsKLSAgRGVjb2RlUGVuZGluZ0J1ZmZlcigpOwotfQotCi12b2lkIERlY3J5cHRpbmdWaWRlb0RlY29kZXI6OkRlY29kZVBlbmRpbmdCdWZmZXIoKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBEQ0hFQ0tfRVEoc3RhdGVfLCBrUGVuZGluZ0RlY29kZSkgPDwgc3RhdGVfOwotICBUUkFDRV9FVkVOVF9BU1lOQ19CRUdJTjAoCi0gICAgICAiZW1lIiwgIkRlY3J5cHRpbmdWaWRlb0RlY29kZXI6OkRlY29kZVBlbmRpbmdCdWZmZXIiLCArK3RyYWNlX2lkXyk7Ci0gIGRlY3J5cHRvcl8tPkRlY3J5cHRBbmREZWNvZGVWaWRlbygKLSAgICAgIHBlbmRpbmdfYnVmZmVyX3RvX2RlY29kZV8sIEJpbmRUb0N1cnJlbnRMb29wKGJhc2U6OkJpbmQoCi0gICAgICAgICAgJkRlY3J5cHRpbmdWaWRlb0RlY29kZXI6OkRlbGl2ZXJGcmFtZSwgdGhpcywKLSAgICAgICAgICBwZW5kaW5nX2J1ZmZlcl90b19kZWNvZGVfLT5HZXREYXRhU2l6ZSgpKSkpOwotfQotCi12b2lkIERlY3J5cHRpbmdWaWRlb0RlY29kZXI6OkRlbGl2ZXJGcmFtZSgKLSAgICBpbnQgYnVmZmVyX3NpemUsCi0gICAgRGVjcnlwdG9yOjpTdGF0dXMgc3RhdHVzLAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4mIGZyYW1lKSB7Ci0gIERWTE9HKDMpIDw8ICJEZWxpdmVyRnJhbWUoKSAtIHN0YXR1czogIiA8PCBzdGF0dXM7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBUUkFDRV9FVkVOVF9BU1lOQ19FTkQwKAotICAgICAgImVtZSIsICJEZWNyeXB0aW5nVmlkZW9EZWNvZGVyOjpEZWNvZGVQZW5kaW5nQnVmZmVyIiwgdHJhY2VfaWRfKTsKLQotICBpZiAoc3RhdGVfID09IGtTdG9wcGVkKQotICAgIHJldHVybjsKLQotICBEQ0hFQ0tfRVEoc3RhdGVfLCBrUGVuZGluZ0RlY29kZSkgPDwgc3RhdGVfOwotICBEQ0hFQ0soIXJlYWRfY2JfLmlzX251bGwoKSk7Ci0gIERDSEVDSyhwZW5kaW5nX2J1ZmZlcl90b19kZWNvZGVfKTsKLQotICBib29sIG5lZWRfdG9fdHJ5X2FnYWluX2lmX25va2V5X2lzX3JldHVybmVkID0ga2V5X2FkZGVkX3doaWxlX2RlY29kZV9wZW5kaW5nXzsKLSAga2V5X2FkZGVkX3doaWxlX2RlY29kZV9wZW5kaW5nXyA9IGZhbHNlOwotCi0gIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gc2NvcGVkX3BlbmRpbmdfYnVmZmVyX3RvX2RlY29kZSA9Ci0gICAgICBwZW5kaW5nX2J1ZmZlcl90b19kZWNvZGVfOwotCi0gIHBlbmRpbmdfYnVmZmVyX3RvX2RlY29kZV8gPSBOVUxMOwotCi0gIGlmICghcmVzZXRfY2JfLmlzX251bGwoKSkgewotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZyZWFkX2NiXykuUnVuKGtPaywgTlVMTCk7Ci0gICAgRG9SZXNldCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIERDSEVDS19FUShzdGF0dXMgPT0gRGVjcnlwdG9yOjprU3VjY2VzcywgZnJhbWUgIT0gTlVMTCk7Ci0KLSAgaWYgKHN0YXR1cyA9PSBEZWNyeXB0b3I6OmtFcnJvcikgewotICAgIERWTE9HKDIpIDw8ICJEZWxpdmVyRnJhbWUoKSAtIGtFcnJvciI7Ci0gICAgc3RhdGVfID0ga0RlY29kZUZpbmlzaGVkOwotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZyZWFkX2NiXykuUnVuKGtEZWNvZGVFcnJvciwgTlVMTCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHN0YXR1cyA9PSBEZWNyeXB0b3I6OmtOb0tleSkgewotICAgIERWTE9HKDIpIDw8ICJEZWxpdmVyRnJhbWUoKSAtIGtOb0tleSI7Ci0gICAgLy8gU2V0IHxwZW5kaW5nX2J1ZmZlcl90b19kZWNvZGVffCBiYWNrIGFzIHdlIG5lZWQgdG8gdHJ5IGRlY29kaW5nIHRoZQotICAgIC8vIHBlbmRpbmcgYnVmZmVyIGFnYWluIHdoZW4gbmV3IGtleSBpcyBhZGRlZCB0byB0aGUgZGVjcnlwdG9yLgotICAgIHBlbmRpbmdfYnVmZmVyX3RvX2RlY29kZV8gPSBzY29wZWRfcGVuZGluZ19idWZmZXJfdG9fZGVjb2RlOwotCi0gICAgaWYgKG5lZWRfdG9fdHJ5X2FnYWluX2lmX25va2V5X2lzX3JldHVybmVkKSB7Ci0gICAgICAvLyBUaGUgfHN0YXRlX3wgaXMgc3RpbGwga1BlbmRpbmdEZWNvZGUuCi0gICAgICBEZWNvZGVQZW5kaW5nQnVmZmVyKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3RhdGVfID0ga1dhaXRpbmdGb3JLZXk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gVGhlIGJ1ZmZlciBoYXMgYmVlbiBhY2NlcHRlZCBieSB0aGUgZGVjb2RlciwgbGV0J3MgcmVwb3J0IHN0YXRpc3RpY3MuCi0gIGlmIChidWZmZXJfc2l6ZSkgewotICAgIFBpcGVsaW5lU3RhdGlzdGljcyBzdGF0aXN0aWNzOwotICAgIHN0YXRpc3RpY3MudmlkZW9fYnl0ZXNfZGVjb2RlZCA9IGJ1ZmZlcl9zaXplOwotICAgIHN0YXRpc3RpY3NfY2JfLlJ1bihzdGF0aXN0aWNzKTsKLSAgfQotCi0gIGlmIChzdGF0dXMgPT0gRGVjcnlwdG9yOjprTmVlZE1vcmVEYXRhKSB7Ci0gICAgRFZMT0coMikgPDwgIkRlbGl2ZXJGcmFtZSgpIC0ga05lZWRNb3JlRGF0YSI7Ci0gICAgaWYgKHNjb3BlZF9wZW5kaW5nX2J1ZmZlcl90b19kZWNvZGUtPklzRW5kT2ZTdHJlYW0oKSkgewotICAgICAgc3RhdGVfID0ga0RlY29kZUZpbmlzaGVkOwotICAgICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnJlYWRfY2JfKS5SdW4oCi0gICAgICAgICAga09rLCBtZWRpYTo6VmlkZW9GcmFtZTo6Q3JlYXRlRW1wdHlGcmFtZSgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdGF0ZV8gPSBrUGVuZGluZ0RlbXV4ZXJSZWFkOwotICAgIFJlYWRGcm9tRGVtdXhlclN0cmVhbSgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIERDSEVDS19FUShzdGF0dXMsIERlY3J5cHRvcjo6a1N1Y2Nlc3MpOwotICAvLyBObyBmcmFtZSByZXR1cm5lZCB3aXRoIGtTdWNjZXNzIHNob3VsZCBiZSBlbmQtb2Ytc3RyZWFtIGZyYW1lLgotICBEQ0hFQ0soIWZyYW1lLT5Jc0VuZE9mU3RyZWFtKCkpOwotICBzdGF0ZV8gPSBrSWRsZTsKLSAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnJlYWRfY2JfKS5SdW4oa09rLCBmcmFtZSk7Ci19Ci0KLXZvaWQgRGVjcnlwdGluZ1ZpZGVvRGVjb2Rlcjo6T25LZXlBZGRlZCgpIHsKLSAgRFZMT0coMikgPDwgIk9uS2V5QWRkZWQoKSI7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotCi0gIGlmIChzdGF0ZV8gPT0ga1BlbmRpbmdEZWNvZGUpIHsKLSAgICBrZXlfYWRkZWRfd2hpbGVfZGVjb2RlX3BlbmRpbmdfID0gdHJ1ZTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoc3RhdGVfID09IGtXYWl0aW5nRm9yS2V5KSB7Ci0gICAgc3RhdGVfID0ga1BlbmRpbmdEZWNvZGU7Ci0gICAgRGVjb2RlUGVuZGluZ0J1ZmZlcigpOwotICB9Ci19Ci0KLXZvaWQgRGVjcnlwdGluZ1ZpZGVvRGVjb2Rlcjo6RG9SZXNldCgpIHsKLSAgRENIRUNLKGluaXRfY2JfLmlzX251bGwoKSk7Ci0gIERDSEVDSyhyZWFkX2NiXy5pc19udWxsKCkpOwotICBzdGF0ZV8gPSBrSWRsZTsKLSAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnJlc2V0X2NiXykuUnVuKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvZGVjcnlwdGluZ192aWRlb19kZWNvZGVyLmggYi9zcmMvbWVkaWEvZmlsdGVycy9kZWNyeXB0aW5nX3ZpZGVvX2RlY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRhNTdhMS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9kZWNyeXB0aW5nX3ZpZGVvX2RlY29kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0ZJTFRFUlNfREVDUllQVElOR19WSURFT19ERUNPREVSX0hfCi0jZGVmaW5lIE1FRElBX0ZJTFRFUlNfREVDUllQVElOR19WSURFT19ERUNPREVSX0hfCi0KLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlY3J5cHRvci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVtdXhlcl9zdHJlYW0uaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXIuaCIKLQotbmFtZXNwYWNlIGJhc2UgewotY2xhc3MgTWVzc2FnZUxvb3BQcm94eTsKLX0KLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgRGVjb2RlckJ1ZmZlcjsKLWNsYXNzIERlY3J5cHRvcjsKLQotLy8gRGVjcnlwdG9yLWJhc2VkIFZpZGVvRGVjb2RlciBpbXBsZW1lbnRhdGlvbiB0aGF0IGNhbiBkZWNyeXB0IGFuZCBkZWNvZGUKLS8vIGVuY3J5cHRlZCB2aWRlbyBidWZmZXJzIGFuZCByZXR1cm4gZGVjcnlwdGVkIGFuZCBkZWNvbXByZXNzZWQgdmlkZW8gZnJhbWVzLgotLy8gQWxsIHB1YmxpYyBBUElzIGFuZCBjYWxsYmFja3MgYXJlIHRyYW1wb2xpbmVkIHRvIHRoZSB8bWVzc2FnZV9sb29wX3wgc28KLS8vIHRoYXQgbm8gbG9ja3MgYXJlIHJlcXVpcmVkIGZvciB0aHJlYWQgc2FmZXR5LgotLy8KLS8vIFRPRE8oeGh3YW5nKTogRm9yIG5vdywgRGVjcnlwdGluZ1ZpZGVvRGVjb2RlciByZWxpZXMgb24gdGhlIGRlY3J5cHRvciB0byBkbwotLy8gYm90aCBkZWNyeXB0aW9uIGFuZCB2aWRlbyBkZWNvZGluZy4gQWRkIHRoZSBwYXRoIHRvIHVzZSB0aGUgZGVjcnlwdG9yIGZvcgotLy8gZGVjcnlwdGlvbiBvbmx5IGFuZCB1c2Ugb3RoZXIgVmlkZW9EZWNvZGVyIGltcGxlbWVudGF0aW9ucyB3aXRoaW4KLS8vIERlY3J5cHRpbmdWaWRlb0RlY29kZXIgZm9yIHZpZGVvIGRlY29kaW5nLgotY2xhc3MgTUVESUFfRVhQT1JUIERlY3J5cHRpbmdWaWRlb0RlY29kZXIgOiBwdWJsaWMgVmlkZW9EZWNvZGVyIHsKLSBwdWJsaWM6Ci0gIERlY3J5cHRpbmdWaWRlb0RlY29kZXIoCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+JiBtZXNzYWdlX2xvb3AsCi0gICAgICBjb25zdCBTZXREZWNyeXB0b3JSZWFkeUNCJiBzZXRfZGVjcnlwdG9yX3JlYWR5X2NiKTsKLQotICAvLyBWaWRlb0RlY29kZXIgaW1wbGVtZW50YXRpb24uCi0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4mIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc3RhdHVzX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0aXN0aWNzQ0ImIHN0YXRpc3RpY3NfY2IpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgUmVhZChjb25zdCBSZWFkQ0ImIHJlYWRfY2IpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgUmVzZXQoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2xvc3VyZSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTdG9wKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNsb3N1cmUpIE9WRVJSSURFOwotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIH5EZWNyeXB0aW5nVmlkZW9EZWNvZGVyKCk7Ci0KLSBwcml2YXRlOgotICAvLyBGb3IgYSBkZXRhaWxlZCBzdGF0ZSBkaWFncmFtIHBsZWFzZSBzZWUgdGhpcyBsaW5rOiBodHRwOi8vZ29vLmdsLzhqQW9rCi0gIC8vIFRPRE8oeGh3YW5nKTogQWRkIGEgQVNDSUkgc3RhdGUgZGlhZ3JhbSBpbiB0aGlzIGZpbGUgYWZ0ZXIgdGhpcyBjbGFzcwotICAvLyBzdGFiaWxpemVzLgotICBlbnVtIFN0YXRlIHsKLSAgICBrVW5pbml0aWFsaXplZCA9IDAsCi0gICAga0RlY3J5cHRvclJlcXVlc3RlZCwKLSAgICBrUGVuZGluZ0RlY29kZXJJbml0LAotICAgIGtJZGxlLAotICAgIGtQZW5kaW5nQ29uZmlnQ2hhbmdlLAotICAgIGtQZW5kaW5nRGVtdXhlclJlYWQsCi0gICAga1BlbmRpbmdEZWNvZGUsCi0gICAga1dhaXRpbmdGb3JLZXksCi0gICAga0RlY29kZUZpbmlzaGVkLAotICAgIGtTdG9wcGVkCi0gIH07Ci0KLSAgLy8gQ2FsbGJhY2sgZm9yIERlY3J5cHRvckhvc3Q6OlJlcXVlc3REZWNyeXB0b3IoKS4KLSAgdm9pZCBTZXREZWNyeXB0b3IoRGVjcnlwdG9yKiBkZWNyeXB0b3IpOwotCi0gIC8vIENhbGxiYWNrIGZvciBEZWNyeXB0b3I6OkluaXRpYWxpemVWaWRlb0RlY29kZXIoKSBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCi0gIHZvaWQgRmluaXNoSW5pdGlhbGl6YXRpb24oYm9vbCBzdWNjZXNzKTsKLQotICAvLyBDYWxsYmFjayBmb3IgRGVjcnlwdG9yOjpJbml0aWFsaXplVmlkZW9EZWNvZGVyKCkgZHVyaW5nIGNvbmZpZyBjaGFuZ2UuCi0gIHZvaWQgRmluaXNoQ29uZmlnQ2hhbmdlKGJvb2wgc3VjY2Vzcyk7Ci0KLSAgdm9pZCBSZWFkRnJvbURlbXV4ZXJTdHJlYW0oKTsKLQotICAvLyBDYWxsYmFjayBmb3IgRGVtdXhlclN0cmVhbTo6UmVhZCgpLgotICB2b2lkIERlY3J5cHRBbmREZWNvZGVCdWZmZXIoRGVtdXhlclN0cmVhbTo6U3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGJ1ZmZlcik7Ci0KLSAgdm9pZCBEZWNvZGVQZW5kaW5nQnVmZmVyKCk7Ci0KLSAgLy8gQ2FsbGJhY2sgZm9yIERlY3J5cHRvcjo6RGVjcnlwdEFuZERlY29kZVZpZGVvKCkuCi0gIHZvaWQgRGVsaXZlckZyYW1lKGludCBidWZmZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgRGVjcnlwdG9yOjpTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+JiBmcmFtZSk7Ci0KLSAgLy8gQ2FsbGJhY2sgZm9yIHRoZSB8ZGVjcnlwdG9yX3wgdG8gbm90aWZ5IHRoaXMgb2JqZWN0IHRoYXQgYSBuZXcga2V5IGhhcyBiZWVuCi0gIC8vIGFkZGVkLgotICB2b2lkIE9uS2V5QWRkZWQoKTsKLQotICAvLyBSZXNldCBkZWNvZGVyIGFuZCBjYWxsIHxyZXNldF9jYl98LgotICB2b2lkIERvUmVzZXQoKTsKLQotICAvLyBGcmVlIGRlY29kZXIgcmVzb3VyY2VzIGFuZCBjYWxsIHxzdG9wX2NiX3wuCi0gIHZvaWQgRG9TdG9wKCk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiBtZXNzYWdlX2xvb3BfOwotCi0gIFN0YXRlIHN0YXRlXzsKLQotICBQaXBlbGluZVN0YXR1c0NCIGluaXRfY2JfOwotICBTdGF0aXN0aWNzQ0Igc3RhdGlzdGljc19jYl87Ci0gIFJlYWRDQiByZWFkX2NiXzsKLSAgYmFzZTo6Q2xvc3VyZSByZXNldF9jYl87Ci0KLSAgLy8gUG9pbnRlciB0byB0aGUgZGVtdXhlciBzdHJlYW0gdGhhdCB3aWxsIGZlZWQgdXMgY29tcHJlc3NlZCBidWZmZXJzLgotICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IGRlbXV4ZXJfc3RyZWFtXzsKLQotICAvLyBDYWxsYmFjayB0byByZXF1ZXN0L2NhbmNlbCBkZWNyeXB0b3IgY3JlYXRpb24gbm90aWZpY2F0aW9uLgotICBTZXREZWNyeXB0b3JSZWFkeUNCIHNldF9kZWNyeXB0b3JfcmVhZHlfY2JfOwotCi0gIERlY3J5cHRvciogZGVjcnlwdG9yXzsKLQotICAvLyBUaGUgYnVmZmVyIHJldHVybmVkIGJ5IHRoZSBkZW11eGVyIHRoYXQgbmVlZHMgZGVjcnlwdGluZy9kZWNvZGluZy4KLSAgc2NvcGVkX3JlZnB0cjxtZWRpYTo6RGVjb2RlckJ1ZmZlcj4gcGVuZGluZ19idWZmZXJfdG9fZGVjb2RlXzsKLQotICAvLyBJbmRpY2F0ZXMgdGhlIHNpdHVhdGlvbiB3aGVyZSBuZXcga2V5IGlzIGFkZGVkIGR1cmluZyBwZW5kaW5nIGRlY29kZQotICAvLyAoaW4gb3RoZXIgd29yZHMsIHRoaXMgdmFyaWFibGUgY2FuIG9ubHkgYmUgc2V0IGluIHN0YXRlIGtQZW5kaW5nRGVjb2RlKS4KLSAgLy8gSWYgdGhpcyB2YXJpYWJsZSBpcyB0cnVlIGFuZCBrTm9LZXkgaXMgcmV0dXJuZWQgdGhlbiB3ZSBuZWVkIHRvIHRyeQotICAvLyBkZWNyeXB0aW5nL2RlY29kaW5nIGFnYWluIGluIGNhc2UgdGhlIG5ld2x5IGFkZGVkIGtleSBpcyB0aGUgY29ycmVjdAotICAvLyBkZWNyeXB0aW9uIGtleS4KLSAgYm9vbCBrZXlfYWRkZWRfd2hpbGVfZGVjb2RlX3BlbmRpbmdfOwotCi0gIC8vIEEgdW5pcXVlIElEIHRvIHRyYWNlIERlY3J5cHRvcjo6RGVjcnlwdEFuZERlY29kZVZpZGVvKCkgY2FsbCBhbmQgdGhlCi0gIC8vIG1hdGNoaW5nIERlY3J5cHRDQiBjYWxsIChpbiBEb0RlbGl2ZXJGcmFtZSgpKS4KLSAgdWludDMyIHRyYWNlX2lkXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRGVjcnlwdGluZ1ZpZGVvRGVjb2Rlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9GSUxURVJTX0RFQ1JZUFRJTkdfVklERU9fREVDT0RFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvZGVjcnlwdGluZ192aWRlb19kZWNvZGVyX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2ZpbHRlcnMvZGVjcnlwdGluZ192aWRlb19kZWNvZGVyX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTJjNzlhLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL2RlY3J5cHRpbmdfdmlkZW9fZGVjb2Rlcl91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDcyMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2tfaGVscGVycy5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVjcnlwdF9jb25maWcuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2dtb2NrX2NhbGxiYWNrX3N1cHBvcnQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21vY2tfZmlsdGVycy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdGVzdF9oZWxwZXJzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb19mcmFtZS5oIgotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvZGVjcnlwdGluZ192aWRlb19kZWNvZGVyLmgiCi0jaW5jbHVkZSAidGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgiCi0KLXVzaW5nIDo6dGVzdGluZzo6XzsKLXVzaW5nIDo6dGVzdGluZzo6QXRNb3N0OwotdXNpbmcgOjp0ZXN0aW5nOjpJc051bGw7Ci11c2luZyA6OnRlc3Rpbmc6OlJldHVyblJlZjsKLXVzaW5nIDo6dGVzdGluZzo6U2F2ZUFyZzsKLXVzaW5nIDo6dGVzdGluZzo6U3RyaWN0TW9jazsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotc3RhdGljIGNvbnN0IFZpZGVvRnJhbWU6OkZvcm1hdCBrVmlkZW9Gb3JtYXQgPSBWaWRlb0ZyYW1lOjpZVjEyOwotc3RhdGljIGNvbnN0IGdmeDo6U2l6ZSBrQ29kZWRTaXplKDMyMCwgMjQwKTsKLXN0YXRpYyBjb25zdCBnZng6OlJlY3Qga1Zpc2libGVSZWN0KDMyMCwgMjQwKTsKLXN0YXRpYyBjb25zdCBnZng6OlNpemUga05hdHVyYWxTaXplKDMyMCwgMjQwKTsKLXN0YXRpYyBjb25zdCB1aW50OCBrRmFrZUtleUlkW10gPSB7IDB4NGIsIDB4NjUsIDB4NzksIDB4MjAsIDB4NDksIDB4NDQgfTsKLXN0YXRpYyBjb25zdCB1aW50OCBrRmFrZUl2W0RlY3J5cHRDb25maWc6OmtEZWNyeXB0aW9uS2V5U2l6ZV0gPSB7IDAgfTsKLQotLy8gQ3JlYXRlIGEgZmFrZSBub24tZW1wdHkgZW5jcnlwdGVkIGJ1ZmZlci4KLXN0YXRpYyBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IENyZWF0ZUZha2VFbmNyeXB0ZWRCdWZmZXIoKSB7Ci0gIGNvbnN0IGludCBidWZmZXJfc2l6ZSA9IDE2OyAgLy8gTmVlZCBhIG5vbi1lbXB0eSBidWZmZXI7Ci0gIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gYnVmZmVyKG5ldyBEZWNvZGVyQnVmZmVyKGJ1ZmZlcl9zaXplKSk7Ci0gIGJ1ZmZlci0+U2V0RGVjcnlwdENvbmZpZyhzY29wZWRfcHRyPERlY3J5cHRDb25maWc+KG5ldyBEZWNyeXB0Q29uZmlnKAotICAgICAgc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oa0Zha2VLZXlJZCksCi0gICAgICAgICAgICAgICAgICBhcnJheXNpemUoa0Zha2VLZXlJZCkpLAotICAgICAgc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oa0Zha2VJdiksIGFycmF5c2l6ZShrRmFrZUl2KSksCi0gICAgICAwLAotICAgICAgc3RkOjp2ZWN0b3I8U3Vic2FtcGxlRW50cnk+KCkpKSk7Ci0gIHJldHVybiBidWZmZXI7Ci19Ci0KLS8vIFVzZSBhbm9ueW1vdXMgbmFtZXNwYWNlIGhlcmUgdG8gcHJldmVudCB0aGUgYWN0aW9ucyB0byBiZSBkZWZpbmVkIG11bHRpcGxlCi0vLyB0aW1lcyBhY3Jvc3MgbXVsdGlwbGUgdGVzdCBmaWxlcy4gU2FkbHkgd2UgY2FuJ3QgdXNlIHN0YXRpYyBmb3IgdGhlbS4KLW5hbWVzcGFjZSB7Ci0KLUFDVElPTl9QKFJldHVybkJ1ZmZlciwgYnVmZmVyKSB7Ci0gIGFyZzAuUnVuKGJ1ZmZlciA/IERlbXV4ZXJTdHJlYW06OmtPayA6IERlbXV4ZXJTdHJlYW06OmtBYm9ydGVkLCBidWZmZXIpOwotfQotCi1BQ1RJT05fUChSdW5DYWxsYmFja0lmTm90TnVsbCwgcGFyYW0pIHsKLSAgaWYgKCFhcmcwLmlzX251bGwoKSkKLSAgICBhcmcwLlJ1bihwYXJhbSk7Ci19Ci0KLUFDVElPTl9QMihSZXNldEFuZFJ1bkNhbGxiYWNrLCBjYWxsYmFjaywgcGFyYW0pIHsKLSAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oY2FsbGJhY2spLlJ1bihwYXJhbSk7Ci19Ci0KLU1BVENIRVIoSXNFbmRPZlN0cmVhbSwgImVuZCBvZiBzdHJlYW0iKSB7Ci0gIHJldHVybiAoYXJnLT5Jc0VuZE9mU3RyZWFtKCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotY2xhc3MgRGVjcnlwdGluZ1ZpZGVvRGVjb2RlclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICBEZWNyeXB0aW5nVmlkZW9EZWNvZGVyVGVzdCgpCi0gICAgICA6IGRlY29kZXJfKG5ldyBEZWNyeXB0aW5nVmlkZW9EZWNvZGVyKAotICAgICAgICAgICAgbWVzc2FnZV9sb29wXy5tZXNzYWdlX2xvb3BfcHJveHkoKSwKLSAgICAgICAgICAgIGJhc2U6OkJpbmQoCi0gICAgICAgICAgICAgICAgJkRlY3J5cHRpbmdWaWRlb0RlY29kZXJUZXN0OjpSZXF1ZXN0RGVjcnlwdG9yTm90aWZpY2F0aW9uLAotICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKSksCi0gICAgICAgIGRlY3J5cHRvcl8obmV3IFN0cmljdE1vY2s8TW9ja0RlY3J5cHRvcj4oKSksCi0gICAgICAgIGRlbXV4ZXJfKG5ldyBTdHJpY3RNb2NrPE1vY2tEZW11eGVyU3RyZWFtPigpKSwKLSAgICAgICAgZW5jcnlwdGVkX2J1ZmZlcl8oQ3JlYXRlRmFrZUVuY3J5cHRlZEJ1ZmZlcigpKSwKLSAgICAgICAgZGVjb2RlZF92aWRlb19mcmFtZV8oVmlkZW9GcmFtZTo6Q3JlYXRlQmxhY2tGcmFtZShrQ29kZWRTaXplKSksCi0gICAgICAgIG51bGxfdmlkZW9fZnJhbWVfKHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4oKSksCi0gICAgICAgIGVuZF9vZl9zdHJlYW1fdmlkZW9fZnJhbWVfKFZpZGVvRnJhbWU6OkNyZWF0ZUVtcHR5RnJhbWUoKSkgewotICB9Ci0KLSAgdmlydHVhbCB+RGVjcnlwdGluZ1ZpZGVvRGVjb2RlclRlc3QoKSB7Ci0gICAgU3RvcCgpOwotICB9Ci0KLSAgdm9pZCBJbml0aWFsaXplQW5kRXhwZWN0U3RhdHVzKGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGlwZWxpbmVTdGF0dXMgc3RhdHVzKSB7Ci0gICAgRVhQRUNUX0NBTEwoKmRlbXV4ZXJfLCB2aWRlb19kZWNvZGVyX2NvbmZpZygpKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuUmVmKGNvbmZpZykpOwotICAgIEVYUEVDVF9DQUxMKCp0aGlzLCBSZXF1ZXN0RGVjcnlwdG9yTm90aWZpY2F0aW9uKF8pKQotICAgICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2tJZk5vdE51bGwoZGVjcnlwdG9yXy5nZXQoKSkpOwotCi0gICAgZGVjb2Rlcl8tPkluaXRpYWxpemUoZGVtdXhlcl8sIE5ld0V4cGVjdGVkU3RhdHVzQ0Ioc3RhdHVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKCZNb2NrU3RhdGlzdGljc0NCOjpPblN0YXRpc3RpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKCZzdGF0aXN0aWNzX2NiXykpKTsKLSAgICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotICB9Ci0KLSAgdm9pZCBJbml0aWFsaXplKCkgewotICAgIEVYUEVDVF9DQUxMKCpkZWNyeXB0b3JfLCBJbml0aWFsaXplVmlkZW9EZWNvZGVyTW9jayhfLCBfKSkKLSAgICAgICAgLlRpbWVzKEF0TW9zdCgxKSkKLSAgICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrPDE+KHRydWUpKTsKLSAgICBFWFBFQ1RfQ0FMTCgqZGVjcnlwdG9yXywgUmVnaXN0ZXJLZXlBZGRlZENCKERlY3J5cHRvcjo6a1ZpZGVvLCBfKSkKLSAgICAgICAgLldpbGxPbmNlKFNhdmVBcmc8MT4oJmtleV9hZGRlZF9jYl8pKTsKLQotICAgIGNvbmZpZ18uSW5pdGlhbGl6ZShrQ29kZWNWUDgsIFZJREVPX0NPREVDX1BST0ZJTEVfVU5LTk9XTiwga1ZpZGVvRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICBrQ29kZWRTaXplLCBrVmlzaWJsZVJlY3QsIGtOYXR1cmFsU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgdHJ1ZSwgdHJ1ZSk7Ci0KLSAgICBJbml0aWFsaXplQW5kRXhwZWN0U3RhdHVzKGNvbmZpZ18sIFBJUEVMSU5FX09LKTsKLSAgfQotCi0gIHZvaWQgUmVhZEFuZEV4cGVjdEZyYW1lUmVhZHlXaXRoKAotICAgICAgVmlkZW9EZWNvZGVyOjpTdGF0dXMgc3RhdHVzLAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiYgdmlkZW9fZnJhbWUpIHsKLSAgICBpZiAoc3RhdHVzICE9IFZpZGVvRGVjb2Rlcjo6a09rKQotICAgICAgRVhQRUNUX0NBTEwoKnRoaXMsIEZyYW1lUmVhZHkoc3RhdHVzLCBJc051bGwoKSkpOwotICAgIGVsc2UgaWYgKHZpZGVvX2ZyYW1lICYmIHZpZGVvX2ZyYW1lLT5Jc0VuZE9mU3RyZWFtKCkpCi0gICAgICBFWFBFQ1RfQ0FMTCgqdGhpcywgRnJhbWVSZWFkeShzdGF0dXMsIElzRW5kT2ZTdHJlYW0oKSkpOwotICAgIGVsc2UKLSAgICAgIEVYUEVDVF9DQUxMKCp0aGlzLCBGcmFtZVJlYWR5KHN0YXR1cywgdmlkZW9fZnJhbWUpKTsKLQotICAgIGRlY29kZXJfLT5SZWFkKGJhc2U6OkJpbmQoJkRlY3J5cHRpbmdWaWRlb0RlY29kZXJUZXN0OjpGcmFtZVJlYWR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICAgIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci0gIH0KLQotICAvLyBTZXRzIHVwIGV4cGVjdGF0aW9ucyBhbmQgYWN0aW9ucyB0byBwdXQgRGVjcnlwdGluZ1ZpZGVvRGVjb2RlciBpbiBhbgotICAvLyBhY3RpdmUgbm9ybWFsIGRlY29kaW5nIHN0YXRlLgotICB2b2lkIEVudGVyTm9ybWFsRGVjb2RpbmdTdGF0ZSgpIHsKLSAgICBFWFBFQ1RfQ0FMTCgqZGVtdXhlcl8sIFJlYWQoXykpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm5CdWZmZXIoZW5jcnlwdGVkX2J1ZmZlcl8pKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuQnVmZmVyKERlY29kZXJCdWZmZXI6OkNyZWF0ZUVPU0J1ZmZlcigpKSk7Ci0gICAgRVhQRUNUX0NBTEwoKmRlY3J5cHRvcl8sIERlY3J5cHRBbmREZWNvZGVWaWRlbyhfLCBfKSkKLSAgICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrPDE+KERlY3J5cHRvcjo6a1N1Y2Nlc3MsIGRlY29kZWRfdmlkZW9fZnJhbWVfKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJ1bkNhbGxiYWNrPDE+KERlY3J5cHRvcjo6a05lZWRNb3JlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4oKSkpOwotICAgIEVYUEVDVF9DQUxMKHN0YXRpc3RpY3NfY2JfLCBPblN0YXRpc3RpY3MoXykpOwotCi0gICAgUmVhZEFuZEV4cGVjdEZyYW1lUmVhZHlXaXRoKFZpZGVvRGVjb2Rlcjo6a09rLCBkZWNvZGVkX3ZpZGVvX2ZyYW1lXyk7Ci0gIH0KLQotICAvLyBTZXRzIHVwIGV4cGVjdGF0aW9ucyBhbmQgYWN0aW9ucyB0byBwdXQgRGVjcnlwdGluZ1ZpZGVvRGVjb2RlciBpbiBhbiBlbmQKLSAgLy8gb2Ygc3RyZWFtIHN0YXRlLiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyCi0gIC8vIEVudGVyTm9ybWFsRGVjb2RpbmdTdGF0ZSgpIHRvIHdvcmsuCi0gIHZvaWQgRW50ZXJFbmRPZlN0cmVhbVN0YXRlKCkgewotICAgIFJlYWRBbmRFeHBlY3RGcmFtZVJlYWR5V2l0aChWaWRlb0RlY29kZXI6OmtPaywgZW5kX29mX3N0cmVhbV92aWRlb19mcmFtZV8pOwotICB9Ci0KLSAgLy8gTWFrZSB0aGUgcmVhZCBjYWxsYmFjayBwZW5kaW5nIGJ5IHNhdmluZyBhbmQgbm90IGZpcmluZyBpdC4KLSAgdm9pZCBFbnRlclBlbmRpbmdSZWFkU3RhdGUoKSB7Ci0gICAgRVhQRUNUX1RSVUUocGVuZGluZ19kZW11eGVyX3JlYWRfY2JfLmlzX251bGwoKSk7Ci0gICAgRVhQRUNUX0NBTEwoKmRlbXV4ZXJfLCBSZWFkKF8pKQotICAgICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwwPigmcGVuZGluZ19kZW11eGVyX3JlYWRfY2JfKSk7Ci0gICAgZGVjb2Rlcl8tPlJlYWQoYmFzZTo6QmluZCgmRGVjcnlwdGluZ1ZpZGVvRGVjb2RlclRlc3Q6OkZyYW1lUmVhZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gICAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLSAgICAvLyBNYWtlIHN1cmUgdGhlIFJlYWQoKSBvbiB0aGUgZGVjb2RlciB0cmlnZ2VycyBhIFJlYWQoKSBvbiB0aGUgZGVtdXhlci4KLSAgICBFWFBFQ1RfRkFMU0UocGVuZGluZ19kZW11eGVyX3JlYWRfY2JfLmlzX251bGwoKSk7Ci0gIH0KLQotICAvLyBNYWtlIHRoZSB2aWRlbyBkZWNvZGUgY2FsbGJhY2sgcGVuZGluZyBieSBzYXZpbmcgYW5kIG5vdCBmaXJpbmcgaXQuCi0gIHZvaWQgRW50ZXJQZW5kaW5nRGVjb2RlU3RhdGUoKSB7Ci0gICAgRVhQRUNUX1RSVUUocGVuZGluZ192aWRlb19kZWNvZGVfY2JfLmlzX251bGwoKSk7Ci0gICAgRVhQRUNUX0NBTEwoKmRlbXV4ZXJfLCBSZWFkKF8pKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuQnVmZmVyKGVuY3J5cHRlZF9idWZmZXJfKSk7Ci0gICAgRVhQRUNUX0NBTEwoKmRlY3J5cHRvcl8sIERlY3J5cHRBbmREZWNvZGVWaWRlbyhlbmNyeXB0ZWRfYnVmZmVyXywgXykpCi0gICAgICAgIC5XaWxsT25jZShTYXZlQXJnPDE+KCZwZW5kaW5nX3ZpZGVvX2RlY29kZV9jYl8pKTsKLQotICAgIGRlY29kZXJfLT5SZWFkKGJhc2U6OkJpbmQoJkRlY3J5cHRpbmdWaWRlb0RlY29kZXJUZXN0OjpGcmFtZVJlYWR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICAgIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci0gICAgLy8gTWFrZSBzdXJlIHRoZSBSZWFkKCkgb24gdGhlIGRlY29kZXIgdHJpZ2dlcnMgYSBEZWNyeXB0QW5kRGVjb2RlKCkgb24gdGhlCi0gICAgLy8gZGVjcnlwdG9yLgotICAgIEVYUEVDVF9GQUxTRShwZW5kaW5nX3ZpZGVvX2RlY29kZV9jYl8uaXNfbnVsbCgpKTsKLSAgfQotCi0gIHZvaWQgRW50ZXJXYWl0aW5nRm9yS2V5U3RhdGUoKSB7Ci0gICAgRVhQRUNUX0NBTEwoKmRlbXV4ZXJfLCBSZWFkKF8pKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuQnVmZmVyKGVuY3J5cHRlZF9idWZmZXJfKSk7Ci0gICAgRVhQRUNUX0NBTEwoKmRlY3J5cHRvcl8sIERlY3J5cHRBbmREZWNvZGVWaWRlbyhfLCBfKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJ1bkNhbGxiYWNrPDE+KERlY3J5cHRvcjo6a05vS2V5LCBudWxsX3ZpZGVvX2ZyYW1lXykpOwotICAgIGRlY29kZXJfLT5SZWFkKGJhc2U6OkJpbmQoJkRlY3J5cHRpbmdWaWRlb0RlY29kZXJUZXN0OjpGcmFtZVJlYWR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICAgIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci0gIH0KLQotICB2b2lkIEFib3J0UGVuZGluZ1ZpZGVvRGVjb2RlQ0IoKSB7Ci0gICAgaWYgKCFwZW5kaW5nX3ZpZGVvX2RlY29kZV9jYl8uaXNfbnVsbCgpKSB7Ci0gICAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcGVuZGluZ192aWRlb19kZWNvZGVfY2JfKS5SdW4oCi0gICAgICAgICAgRGVjcnlwdG9yOjprU3VjY2Vzcywgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPihOVUxMKSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBBYm9ydEFsbFBlbmRpbmdDQnMoKSB7Ci0gICAgaWYgKCFwZW5kaW5nX2luaXRfY2JfLmlzX251bGwoKSkgewotICAgICAgQVNTRVJUX1RSVUUocGVuZGluZ192aWRlb19kZWNvZGVfY2JfLmlzX251bGwoKSk7Ci0gICAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcGVuZGluZ19pbml0X2NiXykuUnVuKGZhbHNlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBYm9ydFBlbmRpbmdWaWRlb0RlY29kZUNCKCk7Ci0gIH0KLQotICB2b2lkIFJlc2V0KCkgewotICAgIEVYUEVDVF9DQUxMKCpkZWNyeXB0b3JfLCBSZXNldERlY29kZXIoRGVjcnlwdG9yOjprVmlkZW8pKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoSW52b2tlV2l0aG91dEFyZ3MoCi0gICAgICAgICAgICB0aGlzLCAmRGVjcnlwdGluZ1ZpZGVvRGVjb2RlclRlc3Q6OkFib3J0UGVuZGluZ1ZpZGVvRGVjb2RlQ0IpKTsKLQotICAgIGRlY29kZXJfLT5SZXNldChOZXdFeHBlY3RlZENsb3N1cmUoKSk7Ci0gICAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLSAgfQotCi0gIHZvaWQgU3RvcCgpIHsKLSAgICBFWFBFQ1RfQ0FMTCgqZGVjcnlwdG9yXywgUmVnaXN0ZXJLZXlBZGRlZENCKERlY3J5cHRvcjo6a1ZpZGVvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNOdWxsQ2FsbGJhY2soKSkpCi0gICAgICAgIC5UaW1lcyhBdE1vc3QoMSkpOwotICAgIEVYUEVDVF9DQUxMKCpkZWNyeXB0b3JfLCBEZWluaXRpYWxpemVEZWNvZGVyKERlY3J5cHRvcjo6a1ZpZGVvKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KEludm9rZVdpdGhvdXRBcmdzKAotICAgICAgICAgICAgdGhpcywgJkRlY3J5cHRpbmdWaWRlb0RlY29kZXJUZXN0OjpBYm9ydEFsbFBlbmRpbmdDQnMpKTsKLQotICAgIGRlY29kZXJfLT5TdG9wKE5ld0V4cGVjdGVkQ2xvc3VyZSgpKTsKLSAgICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotICB9Ci0KLSAgTU9DS19NRVRIT0QxKFJlcXVlc3REZWNyeXB0b3JOb3RpZmljYXRpb24sIHZvaWQoY29uc3QgRGVjcnlwdG9yUmVhZHlDQiYpKTsKLQotICBNT0NLX01FVEhPRDIoRnJhbWVSZWFkeSwgdm9pZChWaWRlb0RlY29kZXI6OlN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiYpKTsKLQotICBNZXNzYWdlTG9vcCBtZXNzYWdlX2xvb3BfOwotICBzY29wZWRfcmVmcHRyPERlY3J5cHRpbmdWaWRlb0RlY29kZXI+IGRlY29kZXJfOwotICBzY29wZWRfcHRyPFN0cmljdE1vY2s8TW9ja0RlY3J5cHRvcj4gPiBkZWNyeXB0b3JfOwotICBzY29wZWRfcmVmcHRyPFN0cmljdE1vY2s8TW9ja0RlbXV4ZXJTdHJlYW0+ID4gZGVtdXhlcl87Ci0gIE1vY2tTdGF0aXN0aWNzQ0Igc3RhdGlzdGljc19jYl87Ci0gIFZpZGVvRGVjb2RlckNvbmZpZyBjb25maWdfOwotCi0gIERlbXV4ZXJTdHJlYW06OlJlYWRDQiBwZW5kaW5nX2RlbXV4ZXJfcmVhZF9jYl87Ci0gIERlY3J5cHRvcjo6RGVjb2RlckluaXRDQiBwZW5kaW5nX2luaXRfY2JfOwotICBEZWNyeXB0b3I6OktleUFkZGVkQ0Iga2V5X2FkZGVkX2NiXzsKLSAgRGVjcnlwdG9yOjpWaWRlb0RlY29kZUNCIHBlbmRpbmdfdmlkZW9fZGVjb2RlX2NiXzsKLQotICAvLyBDb25zdGFudCBidWZmZXIvZnJhbWVzIHRvIGJlIHJldHVybmVkIGJ5IHRoZSB8ZGVtdXhlcl98IGFuZCB8ZGVjcnlwdG9yX3wuCi0gIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gZW5jcnlwdGVkX2J1ZmZlcl87Ci0gIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gZGVjb2RlZF92aWRlb19mcmFtZV87Ci0gIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gbnVsbF92aWRlb19mcmFtZV87Ci0gIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gZW5kX29mX3N0cmVhbV92aWRlb19mcmFtZV87Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRGVjcnlwdGluZ1ZpZGVvRGVjb2RlclRlc3QpOwotfTsKLQotVEVTVF9GKERlY3J5cHRpbmdWaWRlb0RlY29kZXJUZXN0LCBJbml0aWFsaXplX05vcm1hbCkgewotICBJbml0aWFsaXplKCk7Ci19Ci0KLVRFU1RfRihEZWNyeXB0aW5nVmlkZW9EZWNvZGVyVGVzdCwgSW5pdGlhbGl6ZV9OdWxsRGVjcnlwdG9yKSB7Ci0gIEVYUEVDVF9DQUxMKCp0aGlzLCBSZXF1ZXN0RGVjcnlwdG9yTm90aWZpY2F0aW9uKF8pKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJ1bkNhbGxiYWNrSWZOb3ROdWxsKHN0YXRpY19jYXN0PERlY3J5cHRvcio+KE5VTEwpKSk7Ci0gIEluaXRpYWxpemVBbmRFeHBlY3RTdGF0dXMoVGVzdFZpZGVvQ29uZmlnOjpOb3JtYWxFbmNyeXB0ZWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQpOwotfQotCi0vLyBFbnN1cmUgdGhhdCBEZWNyeXB0aW5nVmlkZW9EZWNvZGVyIG9ubHkgYWNjZXB0cyBlbmNyeXB0ZWQgdmlkZW8uCi1URVNUX0YoRGVjcnlwdGluZ1ZpZGVvRGVjb2RlclRlc3QsIEluaXRpYWxpemVfVW5lbmNyeXB0ZWRWaWRlb0NvbmZpZykgewotICBWaWRlb0RlY29kZXJDb25maWcgY29uZmlnKGtDb2RlY1ZQOCwgVklERU9fQ09ERUNfUFJPRklMRV9VTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWaWRlb0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ29kZWRTaXplLCBrVmlzaWJsZVJlY3QsIGtOYXR1cmFsU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBmYWxzZSk7Ci0KLSAgSW5pdGlhbGl6ZUFuZEV4cGVjdFN0YXR1cyhjb25maWcsIERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCk7Ci19Ci0KLS8vIEVuc3VyZSBkZWNvZGVyIGhhbmRsZXMgaW52YWxpZCB2aWRlbyBjb25maWdzIHdpdGhvdXQgY3Jhc2hpbmcuCi1URVNUX0YoRGVjcnlwdGluZ1ZpZGVvRGVjb2RlclRlc3QsIEluaXRpYWxpemVfSW52YWxpZFZpZGVvQ29uZmlnKSB7Ci0gIFZpZGVvRGVjb2RlckNvbmZpZyBjb25maWcoa0NvZGVjVlA4LCBWSURFT19DT0RFQ19QUk9GSUxFX1VOS05PV04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9GcmFtZTo6SU5WQUxJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ29kZWRTaXplLCBrVmlzaWJsZVJlY3QsIGtOYXR1cmFsU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCB0cnVlKTsKLQotICBJbml0aWFsaXplQW5kRXhwZWN0U3RhdHVzKGNvbmZpZywgUElQRUxJTkVfRVJST1JfREVDT0RFKTsKLX0KLQotLy8gRW5zdXJlIGRlY29kZXIgaGFuZGxlcyB1bnN1cHBvcnRlZCB2aWRlbyBjb25maWdzIHdpdGhvdXQgY3Jhc2hpbmcuCi1URVNUX0YoRGVjcnlwdGluZ1ZpZGVvRGVjb2RlclRlc3QsIEluaXRpYWxpemVfVW5zdXBwb3J0ZWRWaWRlb0NvbmZpZykgewotICBFWFBFQ1RfQ0FMTCgqZGVjcnlwdG9yXywgSW5pdGlhbGl6ZVZpZGVvRGVjb2Rlck1vY2soXywgXykpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MT4oZmFsc2UpKTsKLQotICBWaWRlb0RlY29kZXJDb25maWcgY29uZmlnKGtDb2RlY1ZQOCwgVklERU9fQ09ERUNfUFJPRklMRV9VTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWaWRlb0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ29kZWRTaXplLCBrVmlzaWJsZVJlY3QsIGtOYXR1cmFsU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCB0cnVlKTsKLQotICBJbml0aWFsaXplQW5kRXhwZWN0U3RhdHVzKGNvbmZpZywgREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVEKTsKLX0KLQotLy8gVGVzdCBub3JtYWwgZGVjcnlwdCBhbmQgZGVjb2RlIGNhc2UuCi1URVNUX0YoRGVjcnlwdGluZ1ZpZGVvRGVjb2RlclRlc3QsIERlY3J5cHRBbmREZWNvZGVfTm9ybWFsKSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgRW50ZXJOb3JtYWxEZWNvZGluZ1N0YXRlKCk7Ci19Ci0KLS8vIFRlc3QgdGhlIGNhc2Ugd2hlcmUgdGhlIGRlY3J5cHRvciByZXR1cm5zIGVycm9yIHdoZW4gZG9pbmcgZGVjcnlwdCBhbmQKLS8vIGRlY29kZS4KLVRFU1RfRihEZWNyeXB0aW5nVmlkZW9EZWNvZGVyVGVzdCwgRGVjcnlwdEFuZERlY29kZV9EZWNvZGVFcnJvcikgewotICBJbml0aWFsaXplKCk7Ci0KLSAgRVhQRUNUX0NBTEwoKmRlbXV4ZXJfLCBSZWFkKF8pKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybkJ1ZmZlcihlbmNyeXB0ZWRfYnVmZmVyXykpOwotICBFWFBFQ1RfQ0FMTCgqZGVjcnlwdG9yXywgRGVjcnlwdEFuZERlY29kZVZpZGVvKF8sIF8pKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJ1bkNhbGxiYWNrPDE+KERlY3J5cHRvcjo6a0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+KE5VTEwpKSk7Ci0KLSAgUmVhZEFuZEV4cGVjdEZyYW1lUmVhZHlXaXRoKFZpZGVvRGVjb2Rlcjo6a0RlY29kZUVycm9yLCBudWxsX3ZpZGVvX2ZyYW1lXyk7Ci19Ci0KLS8vIFRlc3QgdGhlIGNhc2Ugd2hlcmUgdGhlIGRlY3J5cHRvciByZXR1cm5zIGtOZWVkTW9yZURhdGEgdG8gYXNrIGZvciBtb3JlCi0vLyBidWZmZXJzIGJlZm9yZSBpdCBjYW4gcHJvZHVjZSBhIGZyYW1lLgotVEVTVF9GKERlY3J5cHRpbmdWaWRlb0RlY29kZXJUZXN0LCBEZWNyeXB0QW5kRGVjb2RlX05lZWRNb3JlRGF0YSkgewotICBJbml0aWFsaXplKCk7Ci0KLSAgRVhQRUNUX0NBTEwoKmRlbXV4ZXJfLCBSZWFkKF8pKQotICAgICAgLlRpbWVzKDIpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuQnVmZmVyKGVuY3J5cHRlZF9idWZmZXJfKSk7Ci0gIEVYUEVDVF9DQUxMKCpkZWNyeXB0b3JfLCBEZWNyeXB0QW5kRGVjb2RlVmlkZW8oXywgXykpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MT4oRGVjcnlwdG9yOjprTmVlZE1vcmVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+KCkpKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJ1bkNhbGxiYWNrPDE+KERlY3J5cHRvcjo6a1N1Y2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZF92aWRlb19mcmFtZV8pKTsKLSAgRVhQRUNUX0NBTEwoc3RhdGlzdGljc19jYl8sIE9uU3RhdGlzdGljcyhfKSkKLSAgICAgIC5UaW1lcygyKTsKLQotICBSZWFkQW5kRXhwZWN0RnJhbWVSZWFkeVdpdGgoVmlkZW9EZWNvZGVyOjprT2ssIGRlY29kZWRfdmlkZW9fZnJhbWVfKTsKLX0KLQotLy8gVGVzdCB0aGUgY2FzZSB3aGVyZSB0aGUgZGVjcnlwdG9yIHJlY2VpdmVzIGVuZC1vZi1zdHJlYW0gYnVmZmVyLgotVEVTVF9GKERlY3J5cHRpbmdWaWRlb0RlY29kZXJUZXN0LCBEZWNyeXB0QW5kRGVjb2RlX0VuZE9mU3RyZWFtKSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgRW50ZXJOb3JtYWxEZWNvZGluZ1N0YXRlKCk7Ci0gIEVudGVyRW5kT2ZTdHJlYW1TdGF0ZSgpOwotfQotCi0vLyBUZXN0IGFib3J0ZWQgcmVhZCBvbiB0aGUgZGVtdXhlciBzdHJlYW0uCi1URVNUX0YoRGVjcnlwdGluZ1ZpZGVvRGVjb2RlclRlc3QsIERlbXV4ZXJSZWFkX0Fib3J0ZWQpIHsKLSAgSW5pdGlhbGl6ZSgpOwotCi0gIC8vIFJldHVybkJ1ZmZlcigpIHdpdGggTlVMTCB0cmlnZ2VycyBhYm9ydGVkIGRlbXV4ZXIgcmVhZC4KLSAgRVhQRUNUX0NBTEwoKmRlbXV4ZXJfLCBSZWFkKF8pKQotICAgICAgLldpbGxPbmNlKFJldHVybkJ1ZmZlcihzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+KCkpKTsKLQotICBSZWFkQW5kRXhwZWN0RnJhbWVSZWFkeVdpdGgoVmlkZW9EZWNvZGVyOjprT2ssIG51bGxfdmlkZW9fZnJhbWVfKTsKLX0KLQotLy8gVGVzdCBjb25maWcgY2hhbmdlIG9uIHRoZSBkZW11eGVyIHN0cmVhbS4KLVRFU1RfRihEZWNyeXB0aW5nVmlkZW9EZWNvZGVyVGVzdCwgRGVtdXhlclJlYWRfQ29uZmlnQ2hhbmdlKSB7Ci0gIEluaXRpYWxpemUoKTsKLQotICBFWFBFQ1RfQ0FMTCgqZGVjcnlwdG9yXywgRGVpbml0aWFsaXplRGVjb2RlcihEZWNyeXB0b3I6OmtWaWRlbykpOwotICBFWFBFQ1RfQ0FMTCgqZGVjcnlwdG9yXywgSW5pdGlhbGl6ZVZpZGVvRGVjb2Rlck1vY2soXywgXykpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MT4odHJ1ZSkpOwotICBFWFBFQ1RfQ0FMTCgqZGVtdXhlcl8sIFJlYWQoXykpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MD4oRGVtdXhlclN0cmVhbTo6a0NvbmZpZ0NoYW5nZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPigpKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm5CdWZmZXIoZW5jcnlwdGVkX2J1ZmZlcl8pKTsKLSAgRVhQRUNUX0NBTEwoKmRlY3J5cHRvcl8sIERlY3J5cHRBbmREZWNvZGVWaWRlbyhfLCBfKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJ1bkNhbGxiYWNrPDE+KERlY3J5cHRvcjo6a1N1Y2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkX3ZpZGVvX2ZyYW1lXykpOwotICBFWFBFQ1RfQ0FMTChzdGF0aXN0aWNzX2NiXywgT25TdGF0aXN0aWNzKF8pKTsKLQotICBSZWFkQW5kRXhwZWN0RnJhbWVSZWFkeVdpdGgoVmlkZW9EZWNvZGVyOjprT2ssIGRlY29kZWRfdmlkZW9fZnJhbWVfKTsKLX0KLQotLy8gVGVzdCBjb25maWcgY2hhbmdlIGZhaWx1cmUuCi1URVNUX0YoRGVjcnlwdGluZ1ZpZGVvRGVjb2RlclRlc3QsIERlbXV4ZXJSZWFkX0NvbmZpZ0NoYW5nZUZhaWxlZCkgewotICBJbml0aWFsaXplKCk7Ci0KLSAgRVhQRUNUX0NBTEwoKmRlY3J5cHRvcl8sIERlaW5pdGlhbGl6ZURlY29kZXIoRGVjcnlwdG9yOjprVmlkZW8pKTsKLSAgRVhQRUNUX0NBTEwoKmRlY3J5cHRvcl8sIEluaXRpYWxpemVWaWRlb0RlY29kZXJNb2NrKF8sIF8pKQotICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrPDE+KGZhbHNlKSk7Ci0gIEVYUEVDVF9DQUxMKCpkZW11eGVyXywgUmVhZChfKSkKLSAgICAgIC5XaWxsT25jZShSdW5DYWxsYmFjazwwPihEZW11eGVyU3RyZWFtOjprQ29uZmlnQ2hhbmdlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+KCkpKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybkJ1ZmZlcihlbmNyeXB0ZWRfYnVmZmVyXykpOwotCi0gIFJlYWRBbmRFeHBlY3RGcmFtZVJlYWR5V2l0aChWaWRlb0RlY29kZXI6OmtEZWNvZGVFcnJvciwgbnVsbF92aWRlb19mcmFtZV8pOwotfQotCi0vLyBUZXN0IHRoZSBjYXNlIHdoZXJlIHRoZSBhIGtleSBpcyBhZGRlZCB3aGVuIHRoZSBkZWNyeXB0b3IgaXMgaW4KLS8vIGtXYWl0aW5nRm9yS2V5IHN0YXRlLgotVEVTVF9GKERlY3J5cHRpbmdWaWRlb0RlY29kZXJUZXN0LCBLZXlBZGRlZF9EdXJpbmdXYWl0aW5nRm9yS2V5KSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgRW50ZXJXYWl0aW5nRm9yS2V5U3RhdGUoKTsKLQotICBFWFBFQ1RfQ0FMTCgqZGVjcnlwdG9yXywgRGVjcnlwdEFuZERlY29kZVZpZGVvKF8sIF8pKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJ1bkNhbGxiYWNrPDE+KERlY3J5cHRvcjo6a1N1Y2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZF92aWRlb19mcmFtZV8pKTsKLSAgRVhQRUNUX0NBTEwoc3RhdGlzdGljc19jYl8sIE9uU3RhdGlzdGljcyhfKSk7Ci0gIEVYUEVDVF9DQUxMKCp0aGlzLCBGcmFtZVJlYWR5KFZpZGVvRGVjb2Rlcjo6a09rLCBkZWNvZGVkX3ZpZGVvX2ZyYW1lXykpOwotICBrZXlfYWRkZWRfY2JfLlJ1bigpOwotICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotfQotCi0vLyBUZXN0IHRoZSBjYXNlIHdoZXJlIHRoZSBhIGtleSBpcyBhZGRlZCB3aGVuIHRoZSBkZWNyeXB0b3IgaXMgaW4KLS8vIGtQZW5kaW5nRGVjb2RlIHN0YXRlLgotVEVTVF9GKERlY3J5cHRpbmdWaWRlb0RlY29kZXJUZXN0LCBLZXlBZGRlZF9EcnVpbmdQZW5kaW5nRGVjb2RlKSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgRW50ZXJQZW5kaW5nRGVjb2RlU3RhdGUoKTsKLQotICBFWFBFQ1RfQ0FMTCgqZGVjcnlwdG9yXywgRGVjcnlwdEFuZERlY29kZVZpZGVvKF8sIF8pKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJ1bkNhbGxiYWNrPDE+KERlY3J5cHRvcjo6a1N1Y2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZF92aWRlb19mcmFtZV8pKTsKLSAgRVhQRUNUX0NBTEwoc3RhdGlzdGljc19jYl8sIE9uU3RhdGlzdGljcyhfKSk7Ci0gIEVYUEVDVF9DQUxMKCp0aGlzLCBGcmFtZVJlYWR5KFZpZGVvRGVjb2Rlcjo6a09rLCBkZWNvZGVkX3ZpZGVvX2ZyYW1lXykpOwotICAvLyBUaGUgdmlkZW8gZGVjb2RlIGNhbGxiYWNrIGlzIHJldHVybmVkIGFmdGVyIHRoZSBjb3JyZWN0IGRlY3J5cHRpb24ga2V5IGlzCi0gIC8vIGFkZGVkLgotICBrZXlfYWRkZWRfY2JfLlJ1bigpOwotICBiYXNlOjpSZXNldEFuZFJldHVybigmcGVuZGluZ192aWRlb19kZWNvZGVfY2JfKS5SdW4oRGVjcnlwdG9yOjprTm9LZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsX3ZpZGVvX2ZyYW1lXyk7Ci0gIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci19Ci0KLS8vIFRlc3QgcmVzZXR0aW5nIHdoZW4gdGhlIGRlY29kZXIgaXMgaW4ga0lkbGUgc3RhdGUgYnV0IGhhcyBub3QgZGVjb2RlZCBhbnkKLS8vIGZyYW1lLgotVEVTVF9GKERlY3J5cHRpbmdWaWRlb0RlY29kZXJUZXN0LCBSZXNldF9EdXJpbmdJZGxlQWZ0ZXJJbml0aWFsaXphdGlvbikgewotICBJbml0aWFsaXplKCk7Ci0gIFJlc2V0KCk7Ci19Ci0KLS8vIFRlc3QgcmVzZXR0aW5nIHdoZW4gdGhlIGRlY29kZXIgaXMgaW4ga0lkbGUgc3RhdGUgYWZ0ZXIgaXQgaGFzIGRlY29kZWQgb25lCi0vLyBmcmFtZS4KLVRFU1RfRihEZWNyeXB0aW5nVmlkZW9EZWNvZGVyVGVzdCwgUmVzZXRfRHVyaW5nSWRsZUFmdGVyRGVjb2RlZE9uZUZyYW1lKSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgRW50ZXJOb3JtYWxEZWNvZGluZ1N0YXRlKCk7Ci0gIFJlc2V0KCk7Ci19Ci0KLS8vIFRlc3QgcmVzZXR0aW5nIHdoZW4gdGhlIGRlY29kZXIgaXMgaW4ga1BlbmRpbmdEZW11eGVyUmVhZCBzdGF0ZSBhbmQgdGhlIHJlYWQKLS8vIGNhbGxiYWNrIGlzIHJldHVybmVkIHdpdGgga09rLgotVEVTVF9GKERlY3J5cHRpbmdWaWRlb0RlY29kZXJUZXN0LCBSZXNldF9EdXJpbmdEZW11eGVyUmVhZF9PaykgewotICBJbml0aWFsaXplKCk7Ci0gIEVudGVyUGVuZGluZ1JlYWRTdGF0ZSgpOwotCi0gIEVYUEVDVF9DQUxMKCp0aGlzLCBGcmFtZVJlYWR5KFZpZGVvRGVjb2Rlcjo6a09rLCBJc051bGwoKSkpOwotCi0gIFJlc2V0KCk7Ci0gIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZwZW5kaW5nX2RlbXV4ZXJfcmVhZF9jYl8pLlJ1bihEZW11eGVyU3RyZWFtOjprT2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWRfYnVmZmVyXyk7Ci0gIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci19Ci0KLS8vIFRlc3QgcmVzZXR0aW5nIHdoZW4gdGhlIGRlY29kZXIgaXMgaW4ga1BlbmRpbmdEZW11eGVyUmVhZCBzdGF0ZSBhbmQgdGhlIHJlYWQKLS8vIGNhbGxiYWNrIGlzIHJldHVybmVkIHdpdGgga0Fib3J0ZWQuCi1URVNUX0YoRGVjcnlwdGluZ1ZpZGVvRGVjb2RlclRlc3QsIFJlc2V0X0R1cmluZ0RlbXV4ZXJSZWFkX0Fib3J0ZWQpIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBFbnRlclBlbmRpbmdSZWFkU3RhdGUoKTsKLQotICAvLyBNYWtlIHN1cmUgd2UgZ2V0IGEgTlVMTCB2aWRlbyBmcmFtZSByZXR1cm5lZC4KLSAgRVhQRUNUX0NBTEwoKnRoaXMsIEZyYW1lUmVhZHkoVmlkZW9EZWNvZGVyOjprT2ssIElzTnVsbCgpKSk7Ci0KLSAgUmVzZXQoKTsKLSAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnBlbmRpbmdfZGVtdXhlcl9yZWFkX2NiXykuUnVuKERlbXV4ZXJTdHJlYW06OmtBYm9ydGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci19Ci0KLS8vIFRlc3QgcmVzZXR0aW5nIHdoZW4gdGhlIGRlY29kZXIgaXMgaW4ga1BlbmRpbmdEZW11eGVyUmVhZCBzdGF0ZSBhbmQgdGhlIHJlYWQKLS8vIGNhbGxiYWNrIGlzIHJldHVybmVkIHdpdGgga0NvbmZpZ0NoYW5nZWQuCi1URVNUX0YoRGVjcnlwdGluZ1ZpZGVvRGVjb2RlclRlc3QsIFJlc2V0X0R1cmluZ0RlbXV4ZXJSZWFkX0NvbmZpZ0NoYW5nZSkgewotICBJbml0aWFsaXplKCk7Ci0gIEVudGVyUGVuZGluZ1JlYWRTdGF0ZSgpOwotCi0gIFJlc2V0KCk7Ci0KLSAgLy8gRXZlbiBkdXJpbmcgcGVuZGluZyByZXNldCwgdGhlIGRlY29kZXIgc3RpbGwgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQgd2l0aAotICAvLyB0aGUgbmV3IGNvbmZpZy4KLSAgRVhQRUNUX0NBTEwoKmRlY3J5cHRvcl8sIERlaW5pdGlhbGl6ZURlY29kZXIoRGVjcnlwdG9yOjprVmlkZW8pKTsKLSAgRVhQRUNUX0NBTEwoKmRlY3J5cHRvcl8sIEluaXRpYWxpemVWaWRlb0RlY29kZXJNb2NrKF8sIF8pKQotICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrPDE+KHRydWUpKTsKLSAgRVhQRUNUX0NBTEwoKnRoaXMsIEZyYW1lUmVhZHkoVmlkZW9EZWNvZGVyOjprT2ssIG51bGxfdmlkZW9fZnJhbWVfKSk7Ci0KLSAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnBlbmRpbmdfZGVtdXhlcl9yZWFkX2NiXykKLSAgICAgIC5SdW4oRGVtdXhlclN0cmVhbTo6a0NvbmZpZ0NoYW5nZWQsIE5VTEwpOwotICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotfQotCi0vLyBUZXN0IHJlc2V0dGluZyB3aGVuIHRoZSBkZWNvZGVyIGlzIGluIGtQZW5kaW5nRGVtdXhlclJlYWQgc3RhdGUsIHRoZSByZWFkCi0vLyBjYWxsYmFjayBpcyByZXR1cm5lZCB3aXRoIGtDb25maWdDaGFuZ2VkIGFuZCB0aGUgY29uZmlnIGNoYW5nZSBmYWlscy4KLVRFU1RfRihEZWNyeXB0aW5nVmlkZW9EZWNvZGVyVGVzdCwgUmVzZXRfRHVyaW5nRGVtdXhlclJlYWRfQ29uZmlnQ2hhbmdlRmFpbGVkKSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgRW50ZXJQZW5kaW5nUmVhZFN0YXRlKCk7Ci0KLSAgUmVzZXQoKTsKLQotICAvLyBFdmVuIGR1cmluZyBwZW5kaW5nIHJlc2V0LCB0aGUgZGVjb2RlciBzdGlsbCBuZWVkcyB0byBiZSBpbml0aWFsaXplZCB3aXRoCi0gIC8vIHRoZSBuZXcgY29uZmlnLgotICBFWFBFQ1RfQ0FMTCgqZGVjcnlwdG9yXywgRGVpbml0aWFsaXplRGVjb2RlcihEZWNyeXB0b3I6OmtWaWRlbykpOwotICBFWFBFQ1RfQ0FMTCgqZGVjcnlwdG9yXywgSW5pdGlhbGl6ZVZpZGVvRGVjb2Rlck1vY2soXywgXykpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MT4oZmFsc2UpKTsKLSAgRVhQRUNUX0NBTEwoKnRoaXMsIEZyYW1lUmVhZHkoVmlkZW9EZWNvZGVyOjprRGVjb2RlRXJyb3IsIG51bGxfdmlkZW9fZnJhbWVfKSk7Ci0KLSAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnBlbmRpbmdfZGVtdXhlcl9yZWFkX2NiXykKLSAgICAgIC5SdW4oRGVtdXhlclN0cmVhbTo6a0NvbmZpZ0NoYW5nZWQsIE5VTEwpOwotICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotfQotCi0vLyBUZXN0IHJlc2V0dGluZyB3aGVuIHRoZSBkZWNvZGVyIGlzIGluIGtQZW5kaW5nQ29uZmlnQ2hhbmdlIHN0YXRlLgotVEVTVF9GKERlY3J5cHRpbmdWaWRlb0RlY29kZXJUZXN0LCBSZXNldF9EdXJpbmdQZW5kaW5nQ29uZmlnQ2hhbmdlKSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgRW50ZXJOb3JtYWxEZWNvZGluZ1N0YXRlKCk7Ci0KLSAgRVhQRUNUX0NBTEwoKmRlbXV4ZXJfLCBSZWFkKF8pKQotICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrPDA+KERlbXV4ZXJTdHJlYW06OmtDb25maWdDaGFuZ2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4oKSkpOwotICBFWFBFQ1RfQ0FMTCgqZGVjcnlwdG9yXywgRGVpbml0aWFsaXplRGVjb2RlcihEZWNyeXB0b3I6OmtWaWRlbykpOwotICBFWFBFQ1RfQ0FMTCgqZGVjcnlwdG9yXywgSW5pdGlhbGl6ZVZpZGVvRGVjb2Rlck1vY2soXywgXykpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwxPigmcGVuZGluZ19pbml0X2NiXykpOwotCi0gIGRlY29kZXJfLT5SZWFkKGJhc2U6OkJpbmQoJkRlY3J5cHRpbmdWaWRlb0RlY29kZXJUZXN0OjpGcmFtZVJlYWR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLSAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLSAgRVhQRUNUX0ZBTFNFKHBlbmRpbmdfaW5pdF9jYl8uaXNfbnVsbCgpKTsKLQotICBFWFBFQ1RfQ0FMTCgqdGhpcywgRnJhbWVSZWFkeShWaWRlb0RlY29kZXI6OmtPaywgSXNOdWxsKCkpKTsKLQotICBSZXNldCgpOwotICBiYXNlOjpSZXNldEFuZFJldHVybigmcGVuZGluZ19pbml0X2NiXykuUnVuKHRydWUpOwotICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotfQotCi0vLyBUZXN0IHJlc2V0dGluZyB3aGVuIHRoZSBkZWNvZGVyIGlzIGluIGtQZW5kaW5nRGVjb2RlIHN0YXRlLgotVEVTVF9GKERlY3J5cHRpbmdWaWRlb0RlY29kZXJUZXN0LCBSZXNldF9EdXJpbmdQZW5kaW5nRGVjb2RlKSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgRW50ZXJQZW5kaW5nRGVjb2RlU3RhdGUoKTsKLQotICBFWFBFQ1RfQ0FMTCgqdGhpcywgRnJhbWVSZWFkeShWaWRlb0RlY29kZXI6OmtPaywgSXNOdWxsKCkpKTsKLQotICBSZXNldCgpOwotfQotCi0vLyBUZXN0IHJlc2V0dGluZyB3aGVuIHRoZSBkZWNvZGVyIGlzIGluIGtXYWl0aW5nRm9yS2V5IHN0YXRlLgotVEVTVF9GKERlY3J5cHRpbmdWaWRlb0RlY29kZXJUZXN0LCBSZXNldF9EdXJpbmdXYWl0aW5nRm9yS2V5KSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgRW50ZXJXYWl0aW5nRm9yS2V5U3RhdGUoKTsKLQotICBFWFBFQ1RfQ0FMTCgqdGhpcywgRnJhbWVSZWFkeShWaWRlb0RlY29kZXI6OmtPaywgSXNOdWxsKCkpKTsKLQotICBSZXNldCgpOwotfQotCi0vLyBUZXN0IHJlc2V0dGluZyB3aGVuIHRoZSBkZWNvZGVyIGhhcyBoaXQgZW5kIG9mIHN0cmVhbSBhbmQgaXMgaW4KLS8vIGtEZWNvZGVGaW5pc2hlZCBzdGF0ZS4KLVRFU1RfRihEZWNyeXB0aW5nVmlkZW9EZWNvZGVyVGVzdCwgUmVzZXRfQWZ0ZXJEZWNvZGVGaW5pc2hlZCkgewotICBJbml0aWFsaXplKCk7Ci0gIEVudGVyTm9ybWFsRGVjb2RpbmdTdGF0ZSgpOwotICBFbnRlckVuZE9mU3RyZWFtU3RhdGUoKTsKLSAgUmVzZXQoKTsKLX0KLQotLy8gVGVzdCByZXNldHRpbmcgYWZ0ZXIgdGhlIGRlY29kZXIgaGFzIGJlZW4gcmVzZXQuCi1URVNUX0YoRGVjcnlwdGluZ1ZpZGVvRGVjb2RlclRlc3QsIFJlc2V0X0FmdGVyUmVzZXQpIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBFbnRlck5vcm1hbERlY29kaW5nU3RhdGUoKTsKLSAgUmVzZXQoKTsKLSAgUmVzZXQoKTsKLX0KLQotLy8gVGVzdCBzdG9wcGluZyB3aGVuIHRoZSBkZWNvZGVyIGlzIGluIGtEZWNyeXB0b3JSZXF1ZXN0ZWQgc3RhdGUuCi1URVNUX0YoRGVjcnlwdGluZ1ZpZGVvRGVjb2RlclRlc3QsIFN0b3BfRHVyaW5nRGVjcnlwdG9yUmVxdWVzdGVkKSB7Ci0gIGNvbmZpZ18uSW5pdGlhbGl6ZShrQ29kZWNWUDgsIFZJREVPX0NPREVDX1BST0ZJTEVfVU5LTk9XTiwga1ZpZGVvRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAga0NvZGVkU2l6ZSwga1Zpc2libGVSZWN0LCBrTmF0dXJhbFNpemUsCi0gICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCB0cnVlLCB0cnVlKTsKLSAgRVhQRUNUX0NBTEwoKmRlbXV4ZXJfLCB2aWRlb19kZWNvZGVyX2NvbmZpZygpKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVyblJlZihjb25maWdfKSk7Ci0gIERlY3J5cHRvclJlYWR5Q0IgZGVjcnlwdG9yX3JlYWR5X2NiOwotICBFWFBFQ1RfQ0FMTCgqdGhpcywgUmVxdWVzdERlY3J5cHRvck5vdGlmaWNhdGlvbihfKSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDA+KCZkZWNyeXB0b3JfcmVhZHlfY2IpKTsKLSAgZGVjb2Rlcl8tPkluaXRpYWxpemUoZGVtdXhlcl8sCi0gICAgICAgICAgICAgICAgICAgICAgIE5ld0V4cGVjdGVkU3RhdHVzQ0IoREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVEKSwKLSAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmTW9ja1N0YXRpc3RpY3NDQjo6T25TdGF0aXN0aWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoJnN0YXRpc3RpY3NfY2JfKSkpOwotICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotICAvLyB8ZGVjcnlwdG9yX3JlYWR5X2NifCBpcyBzYXZlZCBidXQgbm90IGNhbGxlZCBoZXJlLgotICBFWFBFQ1RfRkFMU0UoZGVjcnlwdG9yX3JlYWR5X2NiLmlzX251bGwoKSk7Ci0KLSAgLy8gRHVyaW5nIHN0b3AsIFJlcXVlc3REZWNyeXB0b3JOb3RpZmljYXRpb24oKSBzaG91bGQgYmUgY2FsbGVkIHdpdGggYSBOVUxMCi0gIC8vIGNhbGxiYWNrIHRvIGNhbmNlbCB0aGUgfGRlY3J5cHRvcl9yZWFkeV9jYnwuCi0gIEVYUEVDVF9DQUxMKCp0aGlzLCBSZXF1ZXN0RGVjcnlwdG9yTm90aWZpY2F0aW9uKElzTnVsbENhbGxiYWNrKCkpKQotICAgICAgLldpbGxPbmNlKFJlc2V0QW5kUnVuQ2FsbGJhY2soJmRlY3J5cHRvcl9yZWFkeV9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8RGVjcnlwdG9yKj4oTlVMTCkpKTsKLSAgU3RvcCgpOwotfQotCi0vLyBUZXN0IHN0b3BwaW5nIHdoZW4gdGhlIGRlY29kZXIgaXMgaW4ga1BlbmRpbmdEZWNvZGVySW5pdCBzdGF0ZS4KLVRFU1RfRihEZWNyeXB0aW5nVmlkZW9EZWNvZGVyVGVzdCwgU3RvcF9EdXJpbmdQZW5kaW5nRGVjb2RlckluaXQpIHsKLSAgRVhQRUNUX0NBTEwoKmRlY3J5cHRvcl8sIEluaXRpYWxpemVWaWRlb0RlY29kZXJNb2NrKF8sIF8pKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8MT4oJnBlbmRpbmdfaW5pdF9jYl8pKTsKLQotICBjb25maWdfLkluaXRpYWxpemUoa0NvZGVjVlA4LCBWSURFT19DT0RFQ19QUk9GSUxFX1VOS05PV04sIGtWaWRlb0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgIGtDb2RlZFNpemUsIGtWaXNpYmxlUmVjdCwga05hdHVyYWxTaXplLCBOVUxMLCAwLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gIEluaXRpYWxpemVBbmRFeHBlY3RTdGF0dXMoY29uZmlnXywgREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVEKTsKLSAgRVhQRUNUX0ZBTFNFKHBlbmRpbmdfaW5pdF9jYl8uaXNfbnVsbCgpKTsKLQotICBTdG9wKCk7Ci19Ci0KLS8vIFRlc3Qgc3RvcHBpbmcgd2hlbiB0aGUgZGVjb2RlciBpcyBpbiBrSWRsZSBzdGF0ZSBidXQgaGFzIG5vdCBkZWNvZGVkIGFueQotLy8gZnJhbWUuCi1URVNUX0YoRGVjcnlwdGluZ1ZpZGVvRGVjb2RlclRlc3QsIFN0b3BfRHVyaW5nSWRsZUFmdGVySW5pdGlhbGl6YXRpb24pIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBTdG9wKCk7Ci19Ci0KLS8vIFRlc3Qgc3RvcHBpbmcgd2hlbiB0aGUgZGVjb2RlciBpcyBpbiBrSWRsZSBzdGF0ZSBhZnRlciBpdCBoYXMgZGVjb2RlZCBvbmUKLS8vIGZyYW1lLgotVEVTVF9GKERlY3J5cHRpbmdWaWRlb0RlY29kZXJUZXN0LCBTdG9wX0R1cmluZ0lkbGVBZnRlckRlY29kZWRPbmVGcmFtZSkgewotICBJbml0aWFsaXplKCk7Ci0gIEVudGVyTm9ybWFsRGVjb2RpbmdTdGF0ZSgpOwotICBTdG9wKCk7Ci19Ci0KLS8vIFRlc3Qgc3RvcHBpbmcgd2hlbiB0aGUgZGVjb2RlciBpcyBpbiBrUGVuZGluZ0NvbmZpZ0NoYW5nZSBzdGF0ZS4KLVRFU1RfRihEZWNyeXB0aW5nVmlkZW9EZWNvZGVyVGVzdCwgU3RvcF9EdXJpbmdQZW5kaW5nQ29uZmlnQ2hhbmdlKSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgRW50ZXJOb3JtYWxEZWNvZGluZ1N0YXRlKCk7Ci0KLSAgRVhQRUNUX0NBTEwoKmRlbXV4ZXJfLCBSZWFkKF8pKQotICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrPDA+KERlbXV4ZXJTdHJlYW06OmtDb25maWdDaGFuZ2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4oKSkpOwotICBFWFBFQ1RfQ0FMTCgqZGVjcnlwdG9yXywgRGVpbml0aWFsaXplRGVjb2RlcihEZWNyeXB0b3I6OmtWaWRlbykpOwotICBFWFBFQ1RfQ0FMTCgqZGVjcnlwdG9yXywgSW5pdGlhbGl6ZVZpZGVvRGVjb2Rlck1vY2soXywgXykpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwxPigmcGVuZGluZ19pbml0X2NiXykpOwotCi0gIGRlY29kZXJfLT5SZWFkKGJhc2U6OkJpbmQoJkRlY3J5cHRpbmdWaWRlb0RlY29kZXJUZXN0OjpGcmFtZVJlYWR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLSAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLSAgRVhQRUNUX0ZBTFNFKHBlbmRpbmdfaW5pdF9jYl8uaXNfbnVsbCgpKTsKLQotICBFWFBFQ1RfQ0FMTCgqdGhpcywgRnJhbWVSZWFkeShWaWRlb0RlY29kZXI6OmtPaywgSXNOdWxsKCkpKTsKLQotICBTdG9wKCk7Ci19Ci0KLS8vIFRlc3Qgc3RvcHBpbmcgd2hlbiB0aGUgZGVjb2RlciBpcyBpbiBrUGVuZGluZ0RlbXV4ZXJSZWFkIHN0YXRlLgotVEVTVF9GKERlY3J5cHRpbmdWaWRlb0RlY29kZXJUZXN0LCBTdG9wX0R1cmluZ1BlbmRpbmdEZW11eGVyUmVhZCkgewotICBJbml0aWFsaXplKCk7Ci0gIEVudGVyUGVuZGluZ1JlYWRTdGF0ZSgpOwotCi0gIEVYUEVDVF9DQUxMKCp0aGlzLCBGcmFtZVJlYWR5KFZpZGVvRGVjb2Rlcjo6a09rLCBJc051bGwoKSkpOwotCi0gIFN0b3AoKTsKLSAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnBlbmRpbmdfZGVtdXhlcl9yZWFkX2NiXykuUnVuKERlbXV4ZXJTdHJlYW06OmtPaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZF9idWZmZXJfKTsKLSAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLX0KLQotLy8gVGVzdCBzdG9wcGluZyB3aGVuIHRoZSBkZWNvZGVyIGlzIGluIGtQZW5kaW5nRGVjb2RlIHN0YXRlLgotVEVTVF9GKERlY3J5cHRpbmdWaWRlb0RlY29kZXJUZXN0LCBTdG9wX0R1cmluZ1BlbmRpbmdEZWNvZGUpIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBFbnRlclBlbmRpbmdEZWNvZGVTdGF0ZSgpOwotCi0gIEVYUEVDVF9DQUxMKCp0aGlzLCBGcmFtZVJlYWR5KFZpZGVvRGVjb2Rlcjo6a09rLCBJc051bGwoKSkpOwotCi0gIFN0b3AoKTsKLX0KLQotLy8gVGVzdCBzdG9wcGluZyB3aGVuIHRoZSBkZWNvZGVyIGlzIGluIGtXYWl0aW5nRm9yS2V5IHN0YXRlLgotVEVTVF9GKERlY3J5cHRpbmdWaWRlb0RlY29kZXJUZXN0LCBTdG9wX0R1cmluZ1dhaXRpbmdGb3JLZXkpIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBFbnRlcldhaXRpbmdGb3JLZXlTdGF0ZSgpOwotCi0gIEVYUEVDVF9DQUxMKCp0aGlzLCBGcmFtZVJlYWR5KFZpZGVvRGVjb2Rlcjo6a09rLCBJc051bGwoKSkpOwotCi0gIFN0b3AoKTsKLX0KLQotLy8gVGVzdCBzdG9wcGluZyB3aGVuIHRoZSBkZWNvZGVyIGhhcyBoaXQgZW5kIG9mIHN0cmVhbSBhbmQgaXMgaW4KLS8vIGtEZWNvZGVGaW5pc2hlZCBzdGF0ZS4KLVRFU1RfRihEZWNyeXB0aW5nVmlkZW9EZWNvZGVyVGVzdCwgU3RvcF9BZnRlckRlY29kZUZpbmlzaGVkKSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgRW50ZXJOb3JtYWxEZWNvZGluZ1N0YXRlKCk7Ci0gIEVudGVyRW5kT2ZTdHJlYW1TdGF0ZSgpOwotICBTdG9wKCk7Ci19Ci0KLS8vIFRlc3Qgc3RvcHBpbmcgd2hlbiB0aGVyZSBpcyBhIHBlbmRpbmcgcmVzZXQgb24gdGhlIGRlY29kZXIuCi0vLyBSZXNldCBpcyBwZW5kaW5nIGJlY2F1c2UgaXQgY2Fubm90IGNvbXBsZXRlIHdoZW4gdGhlIHZpZGVvIGRlY29kZSBjYWxsYmFjawotLy8gaXMgcGVuZGluZy4KLVRFU1RfRihEZWNyeXB0aW5nVmlkZW9EZWNvZGVyVGVzdCwgU3RvcF9EdXJpbmdQZW5kaW5nUmVzZXQpIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBFbnRlclBlbmRpbmdEZWNvZGVTdGF0ZSgpOwotCi0gIEVYUEVDVF9DQUxMKCpkZWNyeXB0b3JfLCBSZXNldERlY29kZXIoRGVjcnlwdG9yOjprVmlkZW8pKTsKLSAgRVhQRUNUX0NBTEwoKnRoaXMsIEZyYW1lUmVhZHkoVmlkZW9EZWNvZGVyOjprT2ssIElzTnVsbCgpKSk7Ci0KLSAgZGVjb2Rlcl8tPlJlc2V0KE5ld0V4cGVjdGVkQ2xvc3VyZSgpKTsKLSAgU3RvcCgpOwotfQotCi0vLyBUZXN0IHN0b3BwaW5nIGFmdGVyIHRoZSBkZWNvZGVyIGhhcyBiZWVuIHJlc2V0LgotVEVTVF9GKERlY3J5cHRpbmdWaWRlb0RlY29kZXJUZXN0LCBTdG9wX0FmdGVyUmVzZXQpIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBFbnRlck5vcm1hbERlY29kaW5nU3RhdGUoKTsKLSAgUmVzZXQoKTsKLSAgU3RvcCgpOwotfQotCi0vLyBUZXN0IHN0b3BwaW5nIGFmdGVyIHRoZSBkZWNvZGVyIGhhcyBiZWVuIHN0b3BwZWQuCi1URVNUX0YoRGVjcnlwdGluZ1ZpZGVvRGVjb2RlclRlc3QsIFN0b3BfQWZ0ZXJTdG9wKSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgRW50ZXJOb3JtYWxEZWNvZGluZ1N0YXRlKCk7Ci0gIFN0b3AoKTsKLSAgU3RvcCgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL2R1bW15X2RlbXV4ZXIuY2MgYi9zcmMvbWVkaWEvZmlsdGVycy9kdW1teV9kZW11eGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGYxMzczLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL2R1bW15X2RlbXV4ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9kdW1teV9kZW11eGVyLmgiCi0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotRHVtbXlEZW11eGVyU3RyZWFtOjpEdW1teURlbXV4ZXJTdHJlYW0oVHlwZSB0eXBlKQotICAgIDogdHlwZV8odHlwZSkgewotfQotCi1EdW1teURlbXV4ZXJTdHJlYW06On5EdW1teURlbXV4ZXJTdHJlYW0oKSB7fQotCi1EZW11eGVyU3RyZWFtOjpUeXBlIER1bW15RGVtdXhlclN0cmVhbTo6dHlwZSgpIHsKLSAgcmV0dXJuIHR5cGVfOwotfQotCi1jb25zdCBBdWRpb0RlY29kZXJDb25maWcmIER1bW15RGVtdXhlclN0cmVhbTo6YXVkaW9fZGVjb2Rlcl9jb25maWcoKSB7Ci0gIENIRUNLX0VRKHR5cGVfLCBBVURJTyk7Ci0gIHJldHVybiBhdWRpb19jb25maWdfOwotfQotCi1jb25zdCBWaWRlb0RlY29kZXJDb25maWcmIER1bW15RGVtdXhlclN0cmVhbTo6dmlkZW9fZGVjb2Rlcl9jb25maWcoKSB7Ci0gIENIRUNLX0VRKHR5cGVfLCBWSURFTyk7Ci0gIHJldHVybiB2aWRlb19jb25maWdfOwotfQotCi12b2lkIER1bW15RGVtdXhlclN0cmVhbTo6UmVhZChjb25zdCBSZWFkQ0ImIHJlYWRfY2IpIHt9Ci0KLXZvaWQgRHVtbXlEZW11eGVyU3RyZWFtOjpFbmFibGVCaXRzdHJlYW1Db252ZXJ0ZXIoKSB7fQotCi1EdW1teURlbXV4ZXI6OkR1bW15RGVtdXhlcihib29sIGhhc192aWRlbywgYm9vbCBoYXNfYXVkaW8pIHsKLSAgc3RyZWFtc18ucmVzaXplKERlbXV4ZXJTdHJlYW06Ok5VTV9UWVBFUyk7Ci0gIGlmIChoYXNfYXVkaW8pIHsKLSAgICBzdHJlYW1zX1tEZW11eGVyU3RyZWFtOjpBVURJT10gPQotICAgICAgICBuZXcgRHVtbXlEZW11eGVyU3RyZWFtKERlbXV4ZXJTdHJlYW06OkFVRElPKTsKLSAgfQotICBpZiAoaGFzX3ZpZGVvKSB7Ci0gICAgc3RyZWFtc19bRGVtdXhlclN0cmVhbTo6VklERU9dID0KLSAgICAgICAgbmV3IER1bW15RGVtdXhlclN0cmVhbShEZW11eGVyU3RyZWFtOjpWSURFTyk7Ci0gIH0KLX0KLQotdm9pZCBEdW1teURlbXV4ZXI6OkluaXRpYWxpemUoRGVtdXhlckhvc3QqIGhvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBzdGF0dXNfY2IpIHsKLSAgaG9zdC0+U2V0RHVyYXRpb24obWVkaWE6OmtJbmZpbml0ZUR1cmF0aW9uKCkpOwotICBzdGF0dXNfY2IuUnVuKFBJUEVMSU5FX09LKTsKLX0KLQotc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiBEdW1teURlbXV4ZXI6OkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpUeXBlIHR5cGUpIHsKLSAgcmV0dXJuIHN0cmVhbXNfW3R5cGVdOwotfQotCi1iYXNlOjpUaW1lRGVsdGEgRHVtbXlEZW11eGVyOjpHZXRTdGFydFRpbWUoKSBjb25zdCB7Ci0gIHJldHVybiBiYXNlOjpUaW1lRGVsdGEoKTsKLX0KLQotRHVtbXlEZW11eGVyOjp+RHVtbXlEZW11eGVyKCkge30KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9kdW1teV9kZW11eGVyLmggYi9zcmMvbWVkaWEvZmlsdGVycy9kdW1teV9kZW11eGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OWJmZWIuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvZHVtbXlfZGVtdXhlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gSW1wbGVtZW50cyB0aGUgRGVtdXhlciBpbnRlcmZhY2UuIER1bW15RGVtdXhlciByZXR1cm5zIGNvcnJlc3BvbmRpbmcKLS8vIER1bW15RGVtdXhlclN0cmVhbSBhcyBzaWduYWwgZm9yIG1lZGlhIHBpcGVsaW5lIHRvIGNvbnN0cnVjdCBjb3JyZWN0Ci0vLyBwbGF5YmFjayBjaGFubmVscy4gVXNlZCBpbiBXZWJSVEMgbG9jYWwgdmlkZW8gY2FwdHVyZSBwaXBlbGluZSwgd2hlcmUKLS8vIGRlbXV4aW5nIGlzIG5vdCBuZWVkZWQuCi0KLSNpZm5kZWYgTUVESUFfRklMVEVSU19EVU1NWV9ERU1VWEVSX0hfCi0jZGVmaW5lIE1FRElBX0ZJTFRFUlNfRFVNTVlfREVNVVhFUl9IXwotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19kZWNvZGVyX2NvbmZpZy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVtdXhlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fZGVjb2Rlcl9jb25maWcuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgRHVtbXlEZW11eGVyU3RyZWFtIDogcHVibGljIERlbXV4ZXJTdHJlYW0gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgRHVtbXlEZW11eGVyU3RyZWFtKFR5cGUgdHlwZSk7Ci0KLSAgLy8gRGVtdXhlclN0cmVhbSBpbXBsZW1lbnRhdGlvbi4KLSAgdmlydHVhbCB2b2lkIFJlYWQoY29uc3QgUmVhZENCJiByZWFkX2NiKSBPVkVSUklERTsKLSAgdmlydHVhbCBUeXBlIHR5cGUoKSBPVkVSUklERTsKLSAgdmlydHVhbCBjb25zdCBBdWRpb0RlY29kZXJDb25maWcmIGF1ZGlvX2RlY29kZXJfY29uZmlnKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiB2aWRlb19kZWNvZGVyX2NvbmZpZygpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgRW5hYmxlQml0c3RyZWFtQ29udmVydGVyKCkgT1ZFUlJJREU7Ci0KLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0gIGJvb2wgU3RyZWFtV2FzRW5jcnlwdGVkKCkgY29uc3QgT1ZFUlJJREUgewotICAgIHJldHVybiB2aWRlb19jb25maWdfLmlzX2VuY3J5cHRlZCgpOwotICB9Ci0jZW5kaWYKLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB+RHVtbXlEZW11eGVyU3RyZWFtKCk7Ci0KLSBwcml2YXRlOgotICBUeXBlIHR5cGVfOwotICBBdWRpb0RlY29kZXJDb25maWcgYXVkaW9fY29uZmlnXzsKLSAgVmlkZW9EZWNvZGVyQ29uZmlnIHZpZGVvX2NvbmZpZ187Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKER1bW15RGVtdXhlclN0cmVhbSk7Ci19OwotCi1jbGFzcyBNRURJQV9FWFBPUlQgRHVtbXlEZW11eGVyIDogcHVibGljIERlbXV4ZXIgewotIHB1YmxpYzoKLSAgRHVtbXlEZW11eGVyKGJvb2wgaGFzX3ZpZGVvLCBib29sIGhhc19hdWRpbyk7Ci0KLSAgLy8gRGVtdXhlciBpbXBsZW1lbnRhdGlvbi4KLSAgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoRGVtdXhlckhvc3QqIGhvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIHN0YXR1c19jYikgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiBHZXRTdHJlYW0oCi0gICAgICBEZW11eGVyU3RyZWFtOjpUeXBlIHR5cGUpIE9WRVJSSURFOwotICB2aXJ0dWFsIGJhc2U6OlRpbWVEZWx0YSBHZXRTdGFydFRpbWUoKSBjb25zdCBPVkVSUklERTsKLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB+RHVtbXlEZW11eGVyKCk7Ci0KLSBwcml2YXRlOgotICBzdGQ6OnZlY3Rvcjwgc2NvcGVkX3JlZnB0cjxEdW1teURlbXV4ZXJTdHJlYW0+ID4gc3RyZWFtc187Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKER1bW15RGVtdXhlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9GSUxURVJTX0RVTU1ZX0RFTVVYRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL2ZmbXBlZ19hdWRpb19kZWNvZGVyLmNjIGIvc3JjL21lZGlhL2ZpbHRlcnMvZmZtcGVnX2F1ZGlvX2RlY29kZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzODRkNjMuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvZmZtcGVnX2F1ZGlvX2RlY29kZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvZmZtcGVnX2F1ZGlvX2RlY29kZXIuaCIKLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2tfaGVscGVycy5oIgotI2luY2x1ZGUgImJhc2UvbG9jYXRpb24uaCIKLSNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcF9wcm94eS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fZGVjb2Rlcl9jb25maWcuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX3RpbWVzdGFtcF9oZWxwZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RhdGFfYnVmZmVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVtdXhlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvcGlwZWxpbmUuaCIKLSNpbmNsdWRlICJtZWRpYS9mZm1wZWcvZmZtcGVnX2NvbW1vbi5oIgotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvZmZtcGVnX2dsdWUuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gSGVscGVyIHN0cnVjdHVyZSBmb3IgbWFuYWdpbmcgbXVsdGlwbGUgZGVjb2RlZCBhdWRpbyBmcmFtZXMgcGVyIHBhY2tldC4KLXN0cnVjdCBRdWV1ZWRBdWRpb0J1ZmZlciB7Ci0gIEF1ZGlvRGVjb2Rlcjo6U3RhdHVzIHN0YXR1czsKLSAgc2NvcGVkX3JlZnB0cjxCdWZmZXI+IGJ1ZmZlcjsKLX07Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGVjb2RlIHJlc3VsdCB3YXMgZW5kIG9mIHN0cmVhbS4KLXN0YXRpYyBpbmxpbmUgYm9vbCBJc0VuZE9mU3RyZWFtKGludCByZXN1bHQsIGludCBkZWNvZGVkX3NpemUsIEJ1ZmZlciogaW5wdXQpIHsKLSAgLy8gVGhyZWUgY29uZGl0aW9ucyB0byBtZWV0IHRvIGRlY2xhcmUgZW5kIG9mIHN0cmVhbSBmb3IgdGhpcyBkZWNvZGVyOgotICAvLyAxLiBGRm1wZWcgZGlkbid0IHJlYWQgYW55dGhpbmcuCi0gIC8vIDIuIEZGbXBlZyBkaWRuJ3Qgb3V0cHV0IGFueXRoaW5nLgotICAvLyAzLiBBbiBlbmQgb2Ygc3RyZWFtIGJ1ZmZlciBpcyByZWNlaXZlZC4KLSAgcmV0dXJuIHJlc3VsdCA9PSAwICYmIGRlY29kZWRfc2l6ZSA9PSAwICYmIGlucHV0LT5Jc0VuZE9mU3RyZWFtKCk7Ci19Ci0KLUZGbXBlZ0F1ZGlvRGVjb2Rlcjo6RkZtcGVnQXVkaW9EZWNvZGVyKAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4mIG1lc3NhZ2VfbG9vcCkKLSAgICA6IG1lc3NhZ2VfbG9vcF8obWVzc2FnZV9sb29wKSwKLSAgICAgIGNvZGVjX2NvbnRleHRfKE5VTEwpLAotICAgICAgYml0c19wZXJfY2hhbm5lbF8oMCksCi0gICAgICBjaGFubmVsX2xheW91dF8oQ0hBTk5FTF9MQVlPVVRfTk9ORSksCi0gICAgICBzYW1wbGVzX3Blcl9zZWNvbmRfKDApLAotICAgICAgYnl0ZXNfcGVyX2ZyYW1lXygwKSwKLSAgICAgIGxhc3RfaW5wdXRfdGltZXN0YW1wXyhrTm9UaW1lc3RhbXAoKSksCi0gICAgICBvdXRwdXRfYnl0ZXNfdG9fZHJvcF8oMCksCi0gICAgICBhdl9mcmFtZV8oTlVMTCkgewotfQotCi12b2lkIEZGbXBlZ0F1ZGlvRGVjb2Rlcjo6SW5pdGlhbGl6ZSgKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+JiBzdHJlYW0sCi0gICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc3RhdHVzX2NiLAotICAgIGNvbnN0IFN0YXRpc3RpY3NDQiYgc3RhdGlzdGljc19jYikgewotICBpZiAoIW1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSkgewotICAgIG1lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKEZST01fSEVSRSwgYmFzZTo6QmluZCgKLSAgICAgICAgJkZGbXBlZ0F1ZGlvRGVjb2Rlcjo6RG9Jbml0aWFsaXplLCB0aGlzLAotICAgICAgICBzdHJlYW0sIHN0YXR1c19jYiwgc3RhdGlzdGljc19jYikpOwotICAgIHJldHVybjsKLSAgfQotICBEb0luaXRpYWxpemUoc3RyZWFtLCBzdGF0dXNfY2IsIHN0YXRpc3RpY3NfY2IpOwotfQotCi12b2lkIEZGbXBlZ0F1ZGlvRGVjb2Rlcjo6UmVhZChjb25zdCBSZWFkQ0ImIHJlYWRfY2IpIHsKLSAgLy8gQ29tcGxldGUgb3BlcmF0aW9uIGFzeW5jaHJvbm91c2x5IG9uIGRpZmZlcmVudCBzdGFjayBvZiBleGVjdXRpb24gYXMgcGVyCi0gIC8vIHRoZSBBUEkgY29udHJhY3Qgb2YgQXVkaW9EZWNvZGVyOjpSZWFkKCkKLSAgbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soRlJPTV9IRVJFLCBiYXNlOjpCaW5kKAotICAgICAgJkZGbXBlZ0F1ZGlvRGVjb2Rlcjo6RG9SZWFkLCB0aGlzLCByZWFkX2NiKSk7Ci19Ci0KLWludCBGRm1wZWdBdWRpb0RlY29kZXI6OmJpdHNfcGVyX2NoYW5uZWwoKSB7Ci0gIHJldHVybiBiaXRzX3Blcl9jaGFubmVsXzsKLX0KLQotQ2hhbm5lbExheW91dCBGRm1wZWdBdWRpb0RlY29kZXI6OmNoYW5uZWxfbGF5b3V0KCkgewotICByZXR1cm4gY2hhbm5lbF9sYXlvdXRfOwotfQotCi1pbnQgRkZtcGVnQXVkaW9EZWNvZGVyOjpzYW1wbGVzX3Blcl9zZWNvbmQoKSB7Ci0gIHJldHVybiBzYW1wbGVzX3Blcl9zZWNvbmRfOwotfQotCi12b2lkIEZGbXBlZ0F1ZGlvRGVjb2Rlcjo6UmVzZXQoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2xvc3VyZSkgewotICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzayhGUk9NX0hFUkUsIGJhc2U6OkJpbmQoCi0gICAgICAmRkZtcGVnQXVkaW9EZWNvZGVyOjpEb1Jlc2V0LCB0aGlzLCBjbG9zdXJlKSk7Ci19Ci0KLUZGbXBlZ0F1ZGlvRGVjb2Rlcjo6fkZGbXBlZ0F1ZGlvRGVjb2RlcigpIHsKLSAgLy8gVE9ETyhzY2hlcmt1cyk6IHNob3VsZCB3ZSByZXF1aXJlIFN0b3AoKSB0byBiZSBjYWxsZWQ/IHRoaXMgbWlnaHQgZW5kIHVwCi0gIC8vIGdldHRpbmcgY2FsbGVkIG9uIGEgcmFuZG9tIHRocmVhZCBkdWUgdG8gcmVmY291bnRpbmcuCi0gIFJlbGVhc2VGRm1wZWdSZXNvdXJjZXMoKTsKLX0KLQotdm9pZCBGRm1wZWdBdWRpb0RlY29kZXI6OkRvSW5pdGlhbGl6ZSgKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+JiBzdHJlYW0sCi0gICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc3RhdHVzX2NiLAotICAgIGNvbnN0IFN0YXRpc3RpY3NDQiYgc3RhdGlzdGljc19jYikgewotICBGRm1wZWdHbHVlOjpJbml0aWFsaXplRkZtcGVnKCk7Ci0KLSAgaWYgKGRlbXV4ZXJfc3RyZWFtXykgewotICAgIC8vIFRPRE8oc2NoZXJrdXMpOiBpbml0aWFsaXphdGlvbiBjdXJyZW50bHkgaGFwcGVucyBtb3JlIHRoYW4gb25jZSBpbgotICAgIC8vIFBpcGVsaW5lSW50ZWdyYXRpb25UZXN0LkJhc2ljUGxheWJhY2suCi0gICAgTE9HKEVSUk9SKSA8PCAiSW5pdGlhbGl6ZSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZC4iOwotICAgIENIRUNLKGZhbHNlKTsKLSAgfQotCi0gIGRlbXV4ZXJfc3RyZWFtXyA9IHN0cmVhbTsKLQotICBpZiAoIUNvbmZpZ3VyZURlY29kZXIoKSkgewotICAgIHN0YXR1c19jYi5SdW4oREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVEKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGF0aXN0aWNzX2NiXyA9IHN0YXRpc3RpY3NfY2I7Ci0gIHN0YXR1c19jYi5SdW4oUElQRUxJTkVfT0spOwotfQotCi12b2lkIEZGbXBlZ0F1ZGlvRGVjb2Rlcjo6RG9SZXNldChjb25zdCBiYXNlOjpDbG9zdXJlJiBjbG9zdXJlKSB7Ci0gIGF2Y29kZWNfZmx1c2hfYnVmZmVycyhjb2RlY19jb250ZXh0Xyk7Ci0gIFJlc2V0VGltZXN0YW1wU3RhdGUoKTsKLSAgcXVldWVkX2F1ZGlvXy5jbGVhcigpOwotICBjbG9zdXJlLlJ1bigpOwotfQotCi12b2lkIEZGbXBlZ0F1ZGlvRGVjb2Rlcjo6RG9SZWFkKGNvbnN0IFJlYWRDQiYgcmVhZF9jYikgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgRENIRUNLKCFyZWFkX2NiLmlzX251bGwoKSk7Ci0gIENIRUNLKHJlYWRfY2JfLmlzX251bGwoKSkgPDwgIk92ZXJsYXBwaW5nIGRlY29kZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIjsKLQotICByZWFkX2NiXyA9IHJlYWRfY2I7Ci0KLSAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgcXVldWVkIGF1ZGlvIGZyb20gdGhlIGxhc3QgcGFja2V0IHdlIGRlY29kZWQsIGFzayBmb3IKLSAgLy8gbW9yZSBkYXRhIGZyb20gdGhlIGRlbXV4ZXIgdG8gc2F0aXNmeSB0aGlzIHJlYWQuCi0gIGlmIChxdWV1ZWRfYXVkaW9fLmVtcHR5KCkpIHsKLSAgICBSZWFkRnJvbURlbXV4ZXJTdHJlYW0oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBiYXNlOjpSZXNldEFuZFJldHVybigmcmVhZF9jYl8pLlJ1bigKLSAgICAgIHF1ZXVlZF9hdWRpb18uZnJvbnQoKS5zdGF0dXMsIHF1ZXVlZF9hdWRpb18uZnJvbnQoKS5idWZmZXIpOwotICBxdWV1ZWRfYXVkaW9fLnBvcF9mcm9udCgpOwotfQotCi12b2lkIEZGbXBlZ0F1ZGlvRGVjb2Rlcjo6RG9EZWNvZGVCdWZmZXIoCi0gICAgRGVtdXhlclN0cmVhbTo6U3RhdHVzIHN0YXR1cywKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBpbnB1dCkgewotICBpZiAoIW1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSkgewotICAgIG1lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKEZST01fSEVSRSwgYmFzZTo6QmluZCgKLSAgICAgICAgJkZGbXBlZ0F1ZGlvRGVjb2Rlcjo6RG9EZWNvZGVCdWZmZXIsIHRoaXMsIHN0YXR1cywgaW5wdXQpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBEQ0hFQ0soIXJlYWRfY2JfLmlzX251bGwoKSk7Ci0gIERDSEVDSyhxdWV1ZWRfYXVkaW9fLmVtcHR5KCkpOwotICBEQ0hFQ0tfRVEoc3RhdHVzICE9IERlbXV4ZXJTdHJlYW06OmtPaywgIWlucHV0KSA8PCBzdGF0dXM7Ci0KLSAgaWYgKHN0YXR1cyA9PSBEZW11eGVyU3RyZWFtOjprQWJvcnRlZCkgewotICAgIERDSEVDSyghaW5wdXQpOwotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZyZWFkX2NiXykuUnVuKGtBYm9ydGVkLCBOVUxMKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoc3RhdHVzID09IERlbXV4ZXJTdHJlYW06OmtDb25maWdDaGFuZ2VkKSB7Ci0gICAgRENIRUNLKCFpbnB1dCk7Ci0KLSAgICAvLyBTZW5kIGEgImVuZCBvZiBzdHJlYW0iIGJ1ZmZlciB0byB0aGUgZGVjb2RlIGxvb3AKLSAgICAvLyB0byBvdXRwdXQgYW55IHJlbWFpbmluZyBkYXRhIHN0aWxsIGluIHRoZSBkZWNvZGVyLgotICAgIFJ1bkRlY29kZUxvb3AoRGVjb2RlckJ1ZmZlcjo6Q3JlYXRlRU9TQnVmZmVyKCksIHRydWUpOwotCi0gICAgRFZMT0coMSkgPDwgIkNvbmZpZyBjaGFuZ2VkLiI7Ci0KLSAgICBpZiAoIUNvbmZpZ3VyZURlY29kZXIoKSkgewotICAgICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnJlYWRfY2JfKS5SdW4oa0RlY29kZUVycm9yLCBOVUxMKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBSZXNldFRpbWVzdGFtcFN0YXRlKCk7Ci0KLSAgICBpZiAocXVldWVkX2F1ZGlvXy5lbXB0eSgpKSB7Ci0gICAgICBSZWFkRnJvbURlbXV4ZXJTdHJlYW0oKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcmVhZF9jYl8pLlJ1bigKLSAgICAgICAgcXVldWVkX2F1ZGlvXy5mcm9udCgpLnN0YXR1cywgcXVldWVkX2F1ZGlvXy5mcm9udCgpLmJ1ZmZlcik7Ci0gICAgcXVldWVkX2F1ZGlvXy5wb3BfZnJvbnQoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBEQ0hFQ0tfRVEoc3RhdHVzLCBEZW11eGVyU3RyZWFtOjprT2spOwotICBEQ0hFQ0soaW5wdXQpOwotCi0gIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgbm90aWZpZWQgaWYgaHR0cDovL2NyYnVnLmNvbS80OTcwOSByZXR1cm5zLiAgSXNzdWUgYWxzbwotICAvLyBvY2N1cnMgd2l0aCBzb21lIGRhbWFnZWQgZmlsZXMuCi0gIGlmICghaW5wdXQtPklzRW5kT2ZTdHJlYW0oKSAmJiBpbnB1dC0+R2V0VGltZXN0YW1wKCkgPT0ga05vVGltZXN0YW1wKCkgJiYKLSAgICAgIG91dHB1dF90aW1lc3RhbXBfaGVscGVyXy0+YmFzZV90aW1lc3RhbXAoKSA9PSBrTm9UaW1lc3RhbXAoKSkgewotICAgIERWTE9HKDEpIDw8ICJSZWNlaXZlZCBhIGJ1ZmZlciB3aXRob3V0IHRpbWVzdGFtcHMhIjsKLSAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcmVhZF9jYl8pLlJ1bihrRGVjb2RlRXJyb3IsIE5VTEwpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGJvb2wgaXNfdm9yYmlzID0gY29kZWNfY29udGV4dF8tPmNvZGVjX2lkID09IENPREVDX0lEX1ZPUkJJUzsKLSAgaWYgKCFpbnB1dC0+SXNFbmRPZlN0cmVhbSgpKSB7Ci0gICAgaWYgKGxhc3RfaW5wdXRfdGltZXN0YW1wXyA9PSBrTm9UaW1lc3RhbXAoKSkgewotICAgICAgaWYgKGlzX3ZvcmJpcyAmJiAoaW5wdXQtPkdldFRpbWVzdGFtcCgpIDwgYmFzZTo6VGltZURlbHRhKCkpKSB7Ci0gICAgICAgIC8vIERyb3BwaW5nIGZyYW1lcyBmb3IgbmVnYXRpdmUgdGltZXN0YW1wcyBhcyBvdXRsaW5lZCBpbiBzZWN0aW9uIEEuMgotICAgICAgICAvLyBpbiB0aGUgVm9yYmlzIHNwZWMuIGh0dHA6Ly94aXBoLm9yZy92b3JiaXMvZG9jL1ZvcmJpc19JX3NwZWMuaHRtbAotICAgICAgICBpbnQgZnJhbWVzX3RvX2Ryb3AgPSBmbG9vcigKLSAgICAgICAgICAgIDAuNSArIC1pbnB1dC0+R2V0VGltZXN0YW1wKCkuSW5TZWNvbmRzRigpICogc2FtcGxlc19wZXJfc2Vjb25kXyk7Ci0gICAgICAgIG91dHB1dF9ieXRlc190b19kcm9wXyA9IGJ5dGVzX3Blcl9mcmFtZV8gKiBmcmFtZXNfdG9fZHJvcDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGxhc3RfaW5wdXRfdGltZXN0YW1wXyA9IGlucHV0LT5HZXRUaW1lc3RhbXAoKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGlucHV0LT5HZXRUaW1lc3RhbXAoKSAhPSBrTm9UaW1lc3RhbXAoKSkgewotICAgICAgaWYgKGlucHV0LT5HZXRUaW1lc3RhbXAoKSA8IGxhc3RfaW5wdXRfdGltZXN0YW1wXykgewotICAgICAgICBiYXNlOjpUaW1lRGVsdGEgZGlmZiA9IGlucHV0LT5HZXRUaW1lc3RhbXAoKSAtIGxhc3RfaW5wdXRfdGltZXN0YW1wXzsKLSAgICAgICAgRFZMT0coMSkgPDwgIklucHV0IHRpbWVzdGFtcHMgYXJlIG5vdCBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmchICIKLSAgICAgICAgICAgICAgICAgPDwgIiB0cyAiIDw8IGlucHV0LT5HZXRUaW1lc3RhbXAoKS5Jbk1pY3Jvc2Vjb25kcygpIDw8ICIgdXMiCi0gICAgICAgICAgICAgICAgIDw8ICIgZGlmZiAiIDw8IGRpZmYuSW5NaWNyb3NlY29uZHMoKSA8PCAiIHVzIjsKLSAgICAgICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnJlYWRfY2JfKS5SdW4oa0RlY29kZUVycm9yLCBOVUxMKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBsYXN0X2lucHV0X3RpbWVzdGFtcF8gPSBpbnB1dC0+R2V0VGltZXN0YW1wKCk7Ci0gICAgfQotICB9Ci0KLSAgUnVuRGVjb2RlTG9vcChpbnB1dCwgZmFsc2UpOwotCi0gIC8vIFdlIGV4aGF1c3RlZCB0aGUgcHJvdmlkZWQgcGFja2V0LCBidXQgaXQgd2Fzbid0IGVub3VnaCBmb3IgYSBmcmFtZS4gIEFzawotICAvLyBmb3IgbW9yZSBkYXRhIGluIG9yZGVyIHRvIGZ1bGZpbGwgdGhpcyByZWFkLgotICBpZiAocXVldWVkX2F1ZGlvXy5lbXB0eSgpKSB7Ci0gICAgUmVhZEZyb21EZW11eGVyU3RyZWFtKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gRXhlY3V0ZSBjYWxsYmFjayB0byByZXR1cm4gdGhlIGZpcnN0IGZyYW1lIHdlIGRlY29kZWQuCi0gIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZyZWFkX2NiXykuUnVuKAotICAgICAgcXVldWVkX2F1ZGlvXy5mcm9udCgpLnN0YXR1cywgcXVldWVkX2F1ZGlvXy5mcm9udCgpLmJ1ZmZlcik7Ci0gIHF1ZXVlZF9hdWRpb18ucG9wX2Zyb250KCk7Ci19Ci0KLXZvaWQgRkZtcGVnQXVkaW9EZWNvZGVyOjpSZWFkRnJvbURlbXV4ZXJTdHJlYW0oKSB7Ci0gIERDSEVDSyghcmVhZF9jYl8uaXNfbnVsbCgpKTsKLQotICBkZW11eGVyX3N0cmVhbV8tPlJlYWQoYmFzZTo6QmluZCgmRkZtcGVnQXVkaW9EZWNvZGVyOjpEb0RlY29kZUJ1ZmZlciwgdGhpcykpOwotfQotCi1ib29sIEZGbXBlZ0F1ZGlvRGVjb2Rlcjo6Q29uZmlndXJlRGVjb2RlcigpIHsKLSAgY29uc3QgQXVkaW9EZWNvZGVyQ29uZmlnJiBjb25maWcgPSBkZW11eGVyX3N0cmVhbV8tPmF1ZGlvX2RlY29kZXJfY29uZmlnKCk7Ci0KLSAgaWYgKCFjb25maWcuSXNWYWxpZENvbmZpZygpKSB7Ci0gICAgRExPRyhFUlJPUikgPDwgIkludmFsaWQgYXVkaW8gc3RyZWFtIC0iCi0gICAgICAgICAgICAgICAgPDwgIiBjb2RlYzogIiA8PCBjb25maWcuY29kZWMoKQotICAgICAgICAgICAgICAgIDw8ICIgY2hhbm5lbCBsYXlvdXQ6ICIgPDwgY29uZmlnLmNoYW5uZWxfbGF5b3V0KCkKLSAgICAgICAgICAgICAgICA8PCAiIGJpdHMgcGVyIGNoYW5uZWw6ICIgPDwgY29uZmlnLmJpdHNfcGVyX2NoYW5uZWwoKQotICAgICAgICAgICAgICAgIDw8ICIgc2FtcGxlcyBwZXIgc2Vjb25kOiAiIDw8IGNvbmZpZy5zYW1wbGVzX3Blcl9zZWNvbmQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoY29uZmlnLmlzX2VuY3J5cHRlZCgpKSB7Ci0gICAgRExPRyhFUlJPUikgPDwgIkVuY3J5cHRlZCBhdWRpbyBzdHJlYW0gbm90IHN1cHBvcnRlZCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGNvZGVjX2NvbnRleHRfICYmCi0gICAgICAoYml0c19wZXJfY2hhbm5lbF8gIT0gY29uZmlnLmJpdHNfcGVyX2NoYW5uZWwoKSB8fAotICAgICAgIGNoYW5uZWxfbGF5b3V0XyAhPSBjb25maWcuY2hhbm5lbF9sYXlvdXQoKSB8fAotICAgICAgIHNhbXBsZXNfcGVyX3NlY29uZF8gIT0gY29uZmlnLnNhbXBsZXNfcGVyX3NlY29uZCgpKSkgewotICAgIERWTE9HKDEpIDw8ICJVbnN1cHBvcnRlZCBjb25maWcgY2hhbmdlIDoiOwotICAgIERWTE9HKDEpIDw8ICJcdGJpdHNfcGVyX2NoYW5uZWwgOiAiIDw8IGJpdHNfcGVyX2NoYW5uZWxfCi0gICAgICAgICAgICAgPDwgIiAtPiAiIDw8IGNvbmZpZy5iaXRzX3Blcl9jaGFubmVsKCk7Ci0gICAgRFZMT0coMSkgPDwgIlx0Y2hhbm5lbF9sYXlvdXQgOiAiIDw8IGNoYW5uZWxfbGF5b3V0XwotICAgICAgICAgICAgIDw8ICIgLT4gIiA8PCBjb25maWcuY2hhbm5lbF9sYXlvdXQoKTsKLSAgICBEVkxPRygxKSA8PCAiXHRzYW1wbGVfcmF0ZSA6ICIgPDwgc2FtcGxlc19wZXJfc2Vjb25kXwotICAgICAgICAgICAgIDw8ICIgLT4gIiA8PCBjb25maWcuc2FtcGxlc19wZXJfc2Vjb25kKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gUmVsZWFzZSBleGlzdGluZyBkZWNvZGVyIHJlc291cmNlcyBpZiBuZWNlc3NhcnkuCi0gIFJlbGVhc2VGRm1wZWdSZXNvdXJjZXMoKTsKLQotICAvLyBJbml0aWFsaXplIEFWQ29kZWNDb250ZXh0IHN0cnVjdHVyZS4KLSAgY29kZWNfY29udGV4dF8gPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKE5VTEwpOwotICBBdWRpb0RlY29kZXJDb25maWdUb0FWQ29kZWNDb250ZXh0KGNvbmZpZywgY29kZWNfY29udGV4dF8pOwotCi0gIEFWQ29kZWMqIGNvZGVjID0gYXZjb2RlY19maW5kX2RlY29kZXIoY29kZWNfY29udGV4dF8tPmNvZGVjX2lkKTsKLSAgaWYgKCFjb2RlYyB8fCBhdmNvZGVjX29wZW4yKGNvZGVjX2NvbnRleHRfLCBjb2RlYywgTlVMTCkgPCAwKSB7Ci0gICAgRExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBpbml0aWFsaXplIGF1ZGlvIGRlY29kZXI6ICIKLSAgICAgICAgICAgICAgICA8PCBjb2RlY19jb250ZXh0Xy0+Y29kZWNfaWQ7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gU3VjY2VzcyEKLSAgYXZfZnJhbWVfID0gYXZjb2RlY19hbGxvY19mcmFtZSgpOwotICBiaXRzX3Blcl9jaGFubmVsXyA9IGNvbmZpZy5iaXRzX3Blcl9jaGFubmVsKCk7Ci0gIGNoYW5uZWxfbGF5b3V0XyA9IGNvbmZpZy5jaGFubmVsX2xheW91dCgpOwotICBzYW1wbGVzX3Blcl9zZWNvbmRfID0gY29uZmlnLnNhbXBsZXNfcGVyX3NlY29uZCgpOwotICBvdXRwdXRfdGltZXN0YW1wX2hlbHBlcl8ucmVzZXQobmV3IEF1ZGlvVGltZXN0YW1wSGVscGVyKAotICAgICAgY29uZmlnLmJ5dGVzX3Blcl9mcmFtZSgpLCBjb25maWcuc2FtcGxlc19wZXJfc2Vjb25kKCkpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgRkZtcGVnQXVkaW9EZWNvZGVyOjpSZWxlYXNlRkZtcGVnUmVzb3VyY2VzKCkgewotICBpZiAoY29kZWNfY29udGV4dF8pIHsKLSAgICBhdl9mcmVlKGNvZGVjX2NvbnRleHRfLT5leHRyYWRhdGEpOwotICAgIGF2Y29kZWNfY2xvc2UoY29kZWNfY29udGV4dF8pOwotICAgIGF2X2ZyZWUoY29kZWNfY29udGV4dF8pOwotICB9Ci0KLSAgaWYgKGF2X2ZyYW1lXykgewotICAgIGF2X2ZyZWUoYXZfZnJhbWVfKTsKLSAgICBhdl9mcmFtZV8gPSBOVUxMOwotICB9Ci19Ci0KLXZvaWQgRkZtcGVnQXVkaW9EZWNvZGVyOjpSZXNldFRpbWVzdGFtcFN0YXRlKCkgewotICBvdXRwdXRfdGltZXN0YW1wX2hlbHBlcl8tPlNldEJhc2VUaW1lc3RhbXAoa05vVGltZXN0YW1wKCkpOwotICBsYXN0X2lucHV0X3RpbWVzdGFtcF8gPSBrTm9UaW1lc3RhbXAoKTsKLSAgb3V0cHV0X2J5dGVzX3RvX2Ryb3BfID0gMDsKLX0KLQotdm9pZCBGRm1wZWdBdWRpb0RlY29kZXI6OlJ1bkRlY29kZUxvb3AoCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgaW5wdXQsCi0gICAgYm9vbCBza2lwX2Vvc19hcHBlbmQpIHsKLSAgQVZQYWNrZXQgcGFja2V0OwotICBhdl9pbml0X3BhY2tldCgmcGFja2V0KTsKLSAgcGFja2V0LmRhdGEgPSBjb25zdF9jYXN0PHVpbnQ4Kj4oaW5wdXQtPkdldERhdGEoKSk7Ci0gIHBhY2tldC5zaXplID0gaW5wdXQtPkdldERhdGFTaXplKCk7Ci0KLSAgLy8gRWFjaCBhdWRpbyBwYWNrZXQgbWF5IGNvbnRhaW4gc2V2ZXJhbCBmcmFtZXMsIHNvIHdlIG11c3QgY2FsbCB0aGUgZGVjb2RlcgotICAvLyB1bnRpbCB3ZSd2ZSBleGhhdXN0ZWQgdGhlIHBhY2tldC4gIFJlZ2FyZGxlc3Mgb2YgdGhlIHBhY2tldCBzaXplIHdlIGFsd2F5cwotICAvLyB3YW50IHRvIGhhbmQgaXQgdG8gdGhlIGRlY29kZXIgYXQgbGVhc3Qgb25jZSwgb3RoZXJ3aXNlIHdlIHdvdWxkIGVuZCB1cAotICAvLyBza2lwcGluZyBlbmQgb2Ygc3RyZWFtIHBhY2tldHMgc2luY2UgdGhleSBoYXZlIGEgc2l6ZSBvZiB6ZXJvLgotICBkbyB7Ci0gICAgLy8gUmVzZXQgZnJhbWUgdG8gZGVmYXVsdCB2YWx1ZXMuCi0gICAgYXZjb2RlY19nZXRfZnJhbWVfZGVmYXVsdHMoYXZfZnJhbWVfKTsKLQotICAgIGludCBmcmFtZV9kZWNvZGVkID0gMDsKLSAgICBpbnQgcmVzdWx0ID0gYXZjb2RlY19kZWNvZGVfYXVkaW80KAotICAgICAgICBjb2RlY19jb250ZXh0XywgYXZfZnJhbWVfLCAmZnJhbWVfZGVjb2RlZCwgJnBhY2tldCk7Ci0KLSAgICBpZiAocmVzdWx0IDwgMCkgewotICAgICAgRENIRUNLKCFpbnB1dC0+SXNFbmRPZlN0cmVhbSgpKQotICAgICAgICAgIDw8ICJFbmQgb2Ygc3RyZWFtIGJ1ZmZlciBwcm9kdWNlZCBhbiBlcnJvciEgIgotICAgICAgICAgIDw8ICJUaGlzIGlzIHF1aXRlIHBvc3NpYmx5IGEgYnVnIGluIHRoZSBhdWRpbyBkZWNvZGVyIG5vdCBoYW5kbGluZyAiCi0gICAgICAgICAgPDwgImVuZCBvZiBzdHJlYW0gQVZQYWNrZXRzIGNvcnJlY3RseS4iOwotCi0gICAgICBETE9HKEVSUk9SKQotICAgICAgICAgIDw8ICJFcnJvciBkZWNvZGluZyBhbiBhdWRpbyBmcmFtZSB3aXRoIHRpbWVzdGFtcDogIgotICAgICAgICAgIDw8IGlucHV0LT5HZXRUaW1lc3RhbXAoKS5Jbk1pY3Jvc2Vjb25kcygpIDw8ICIgdXMsIGR1cmF0aW9uOiAiCi0gICAgICAgICAgPDwgaW5wdXQtPkdldER1cmF0aW9uKCkuSW5NaWNyb3NlY29uZHMoKSA8PCAiIHVzLCBwYWNrZXQgc2l6ZTogIgotICAgICAgICAgIDw8IGlucHV0LT5HZXREYXRhU2l6ZSgpIDw8ICIgYnl0ZXMiOwotCi0gICAgICAvLyBUT0RPKGRhbGVjdXJ0aXMpOiBXZSBzaG91bGQgcmV0dXJuIGEga0RlY29kZUVycm9yIGhlcmUgaW5zdGVhZDoKLSAgICAgIC8vIGh0dHA6Ly9jcmJ1Zy5jb20vMTQ1Mjc2Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyBVcGRhdGUgcGFja2V0IHNpemUgYW5kIGRhdGEgcG9pbnRlciBpbiBjYXNlIHdlIG5lZWQgdG8gY2FsbCB0aGUgZGVjb2RlcgotICAgIC8vIHdpdGggdGhlIHJlbWFpbmluZyBieXRlcyBmcm9tIHRoaXMgcGFja2V0LgotICAgIHBhY2tldC5zaXplIC09IHJlc3VsdDsKLSAgICBwYWNrZXQuZGF0YSArPSByZXN1bHQ7Ci0KLSAgICBpZiAob3V0cHV0X3RpbWVzdGFtcF9oZWxwZXJfLT5iYXNlX3RpbWVzdGFtcCgpID09IGtOb1RpbWVzdGFtcCgpICYmCi0gICAgICAgICFpbnB1dC0+SXNFbmRPZlN0cmVhbSgpKSB7Ci0gICAgICBEQ0hFQ0soaW5wdXQtPkdldFRpbWVzdGFtcCgpICE9IGtOb1RpbWVzdGFtcCgpKTsKLSAgICAgIGlmIChvdXRwdXRfYnl0ZXNfdG9fZHJvcF8gPiAwKSB7Ci0gICAgICAgIC8vIEN1cnJlbnRseSBWb3JiaXMgaXMgdGhlIG9ubHkgY29kZWMgdGhhdCBjYXVzZXMgdXMgdG8gZHJvcCBzYW1wbGVzLgotICAgICAgICAvLyBJZiB3ZSBoYXZlIHRvIGRyb3Agc2FtcGxlcyBpdCBhbHdheXMgbWVhbnMgdGhlIHRpbWVsaW5lIHN0YXJ0cyBhdCAwLgotICAgICAgICBEQ0hFQ0tfRVEoY29kZWNfY29udGV4dF8tPmNvZGVjX2lkLCBDT0RFQ19JRF9WT1JCSVMpOwotICAgICAgICBvdXRwdXRfdGltZXN0YW1wX2hlbHBlcl8tPlNldEJhc2VUaW1lc3RhbXAoYmFzZTo6VGltZURlbHRhKCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0cHV0X3RpbWVzdGFtcF9oZWxwZXJfLT5TZXRCYXNlVGltZXN0YW1wKGlucHV0LT5HZXRUaW1lc3RhbXAoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgY29uc3QgdWludDgqIGRlY29kZWRfYXVkaW9fZGF0YSA9IE5VTEw7Ci0gICAgaW50IGRlY29kZWRfYXVkaW9fc2l6ZSA9IDA7Ci0gICAgaWYgKGZyYW1lX2RlY29kZWQpIHsKLSAgICAgIGludCBvdXRwdXRfc2FtcGxlX3JhdGUgPSBhdl9mcmFtZV8tPnNhbXBsZV9yYXRlOwotICAgICAgaWYgKG91dHB1dF9zYW1wbGVfcmF0ZSAhPSBzYW1wbGVzX3Blcl9zZWNvbmRfKSB7Ci0gICAgICAgIERMT0coRVJST1IpIDw8ICJPdXRwdXQgc2FtcGxlIHJhdGUgKCIgPDwgb3V0cHV0X3NhbXBsZV9yYXRlCi0gICAgICAgICAgICAgICAgICAgIDw8ICIpIGRvZXNuJ3QgbWF0Y2ggZXhwZWN0ZWQgcmF0ZSAiIDw8IHNhbXBsZXNfcGVyX3NlY29uZF87Ci0KLSAgICAgICAgLy8gVGhpcyBpcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yLCBzbyBiYWlsIG91dC4KLSAgICAgICAgUXVldWVkQXVkaW9CdWZmZXIgcXVldWVfZW50cnkgPSB7IGtEZWNvZGVFcnJvciwgTlVMTCB9OwotICAgICAgICBxdWV1ZWRfYXVkaW9fLnB1c2hfYmFjayhxdWV1ZV9lbnRyeSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBkZWNvZGVkX2F1ZGlvX2RhdGEgPSBhdl9mcmFtZV8tPmRhdGFbMF07Ci0gICAgICBkZWNvZGVkX2F1ZGlvX3NpemUgPSBhdl9zYW1wbGVzX2dldF9idWZmZXJfc2l6ZSgKLSAgICAgICAgICBOVUxMLCBjb2RlY19jb250ZXh0Xy0+Y2hhbm5lbHMsIGF2X2ZyYW1lXy0+bmJfc2FtcGxlcywKLSAgICAgICAgICBjb2RlY19jb250ZXh0Xy0+c2FtcGxlX2ZtdCwgMSk7Ci0gICAgfQotCi0gICAgc2NvcGVkX3JlZnB0cjxEYXRhQnVmZmVyPiBvdXRwdXQ7Ci0KLSAgICBpZiAoZGVjb2RlZF9hdWRpb19zaXplID4gMCAmJiBvdXRwdXRfYnl0ZXNfdG9fZHJvcF8gPiAwKSB7Ci0gICAgICBpbnQgZHJvcHBlZF9zaXplID0gc3RkOjptaW4oZGVjb2RlZF9hdWRpb19zaXplLCBvdXRwdXRfYnl0ZXNfdG9fZHJvcF8pOwotICAgICAgZGVjb2RlZF9hdWRpb19kYXRhICs9IGRyb3BwZWRfc2l6ZTsKLSAgICAgIGRlY29kZWRfYXVkaW9fc2l6ZSAtPSBkcm9wcGVkX3NpemU7Ci0gICAgICBvdXRwdXRfYnl0ZXNfdG9fZHJvcF8gLT0gZHJvcHBlZF9zaXplOwotICAgIH0KLQotICAgIGlmIChkZWNvZGVkX2F1ZGlvX3NpemUgPiAwKSB7Ci0gICAgICAvLyBDb3B5IHRoZSBhdWRpbyBzYW1wbGVzIGludG8gYW4gb3V0cHV0IGJ1ZmZlci4KLSAgICAgIG91dHB1dCA9IG5ldyBEYXRhQnVmZmVyKGRlY29kZWRfYXVkaW9fZGF0YSwgZGVjb2RlZF9hdWRpb19zaXplKTsKLSAgICAgIG91dHB1dC0+U2V0VGltZXN0YW1wKG91dHB1dF90aW1lc3RhbXBfaGVscGVyXy0+R2V0VGltZXN0YW1wKCkpOwotICAgICAgb3V0cHV0LT5TZXREdXJhdGlvbigKLSAgICAgICAgICBvdXRwdXRfdGltZXN0YW1wX2hlbHBlcl8tPkdldER1cmF0aW9uKGRlY29kZWRfYXVkaW9fc2l6ZSkpOwotICAgICAgb3V0cHV0X3RpbWVzdGFtcF9oZWxwZXJfLT5BZGRCeXRlcyhkZWNvZGVkX2F1ZGlvX3NpemUpOwotICAgIH0gZWxzZSBpZiAoSXNFbmRPZlN0cmVhbShyZXN1bHQsIGRlY29kZWRfYXVkaW9fc2l6ZSwgaW5wdXQpICYmCi0gICAgICAgICAgICAgICAhc2tpcF9lb3NfYXBwZW5kKSB7Ci0gICAgICBEQ0hFQ0tfRVEocGFja2V0LnNpemUsIDApOwotICAgICAgLy8gQ3JlYXRlIGFuIGVuZCBvZiBzdHJlYW0gb3V0cHV0IGJ1ZmZlci4KLSAgICAgIG91dHB1dCA9IG5ldyBEYXRhQnVmZmVyKDApOwotICAgIH0KLQotICAgIGlmIChvdXRwdXQpIHsKLSAgICAgIFF1ZXVlZEF1ZGlvQnVmZmVyIHF1ZXVlX2VudHJ5ID0geyBrT2ssIG91dHB1dCB9OwotICAgICAgcXVldWVkX2F1ZGlvXy5wdXNoX2JhY2socXVldWVfZW50cnkpOwotICAgIH0KLQotICAgIC8vIERlY29kaW5nIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseSwgdXBkYXRlIHN0YXRpc3RpY3MuCi0gICAgaWYgKHJlc3VsdCA+IDApIHsKLSAgICAgIFBpcGVsaW5lU3RhdGlzdGljcyBzdGF0aXN0aWNzOwotICAgICAgc3RhdGlzdGljcy5hdWRpb19ieXRlc19kZWNvZGVkID0gcmVzdWx0OwotICAgICAgc3RhdGlzdGljc19jYl8uUnVuKHN0YXRpc3RpY3MpOwotICAgIH0KLSAgfSB3aGlsZSAocGFja2V0LnNpemUgPiAwKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9mZm1wZWdfYXVkaW9fZGVjb2Rlci5oIGIvc3JjL21lZGlhL2ZpbHRlcnMvZmZtcGVnX2F1ZGlvX2RlY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UwOTZlZS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9mZm1wZWdfYXVkaW9fZGVjb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9GSUxURVJTX0ZGTVBFR19BVURJT19ERUNPREVSX0hfCi0jZGVmaW5lIE1FRElBX0ZJTFRFUlNfRkZNUEVHX0FVRElPX0RFQ09ERVJfSF8KLQotI2luY2x1ZGUgPGxpc3Q+Ci0KLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19kZWNvZGVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZW11eGVyX3N0cmVhbS5oIgotCi1zdHJ1Y3QgQVZDb2RlY0NvbnRleHQ7Ci1zdHJ1Y3QgQVZGcmFtZTsKLQotbmFtZXNwYWNlIGJhc2UgewotY2xhc3MgTWVzc2FnZUxvb3BQcm94eTsKLX0KLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgQXVkaW9UaW1lc3RhbXBIZWxwZXI7Ci1jbGFzcyBEYXRhQnVmZmVyOwotY2xhc3MgRGVjb2RlckJ1ZmZlcjsKLXN0cnVjdCBRdWV1ZWRBdWRpb0J1ZmZlcjsKLQotY2xhc3MgTUVESUFfRVhQT1JUIEZGbXBlZ0F1ZGlvRGVjb2RlciA6IHB1YmxpYyBBdWRpb0RlY29kZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgRkZtcGVnQXVkaW9EZWNvZGVyKAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbWVzc2FnZV9sb29wKTsKLQotICAvLyBBdWRpb0RlY29kZXIgaW1wbGVtZW50YXRpb24uCi0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4mIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc3RhdHVzX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0aXN0aWNzQ0ImIHN0YXRpc3RpY3NfY2IpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgUmVhZChjb25zdCBSZWFkQ0ImIHJlYWRfY2IpIE9WRVJSSURFOwotICB2aXJ0dWFsIGludCBiaXRzX3Blcl9jaGFubmVsKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgQ2hhbm5lbExheW91dCBjaGFubmVsX2xheW91dCgpIE9WRVJSSURFOwotICB2aXJ0dWFsIGludCBzYW1wbGVzX3Blcl9zZWNvbmQoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFJlc2V0KGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNsb3N1cmUpIE9WRVJSSURFOwotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIH5GRm1wZWdBdWRpb0RlY29kZXIoKTsKLQotIHByaXZhdGU6Ci0gIC8vIE1ldGhvZHMgcnVubmluZyBvbiBkZWNvZGVyIHRocmVhZC4KLSAgdm9pZCBEb0luaXRpYWxpemUoY29uc3Qgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiYgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBzdGF0dXNfY2IsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXRpc3RpY3NDQiYgc3RhdGlzdGljc19jYik7Ci0gIHZvaWQgRG9SZXNldChjb25zdCBiYXNlOjpDbG9zdXJlJiBjbG9zdXJlKTsKLSAgdm9pZCBEb1JlYWQoY29uc3QgUmVhZENCJiByZWFkX2NiKTsKLSAgdm9pZCBEb0RlY29kZUJ1ZmZlcihEZW11eGVyU3RyZWFtOjpTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGlucHV0KTsKLQotICAvLyBSZWFkcyBmcm9tIHRoZSBkZW11eGVyIHN0cmVhbSB3aXRoIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgbWV0aG9kLgotICB2b2lkIFJlYWRGcm9tRGVtdXhlclN0cmVhbSgpOwotCi0gIGJvb2wgQ29uZmlndXJlRGVjb2RlcigpOwotICB2b2lkIFJlbGVhc2VGRm1wZWdSZXNvdXJjZXMoKTsKLSAgdm9pZCBSZXNldFRpbWVzdGFtcFN0YXRlKCk7Ci0gIHZvaWQgUnVuRGVjb2RlTG9vcChjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2tpcF9lb3NfYXBwZW5kKTsKLQotICBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+IG1lc3NhZ2VfbG9vcF87Ci0KLSAgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiBkZW11eGVyX3N0cmVhbV87Ci0gIFN0YXRpc3RpY3NDQiBzdGF0aXN0aWNzX2NiXzsKLSAgQVZDb2RlY0NvbnRleHQqIGNvZGVjX2NvbnRleHRfOwotCi0gIC8vIERlY29kZWQgYXVkaW8gZm9ybWF0LgotICBpbnQgYml0c19wZXJfY2hhbm5lbF87Ci0gIENoYW5uZWxMYXlvdXQgY2hhbm5lbF9sYXlvdXRfOwotICBpbnQgc2FtcGxlc19wZXJfc2Vjb25kXzsKLQotICAvLyBVc2VkIGZvciBjb21wdXRpbmcgb3V0cHV0IHRpbWVzdGFtcHMuCi0gIHNjb3BlZF9wdHI8QXVkaW9UaW1lc3RhbXBIZWxwZXI+IG91dHB1dF90aW1lc3RhbXBfaGVscGVyXzsKLSAgaW50IGJ5dGVzX3Blcl9mcmFtZV87Ci0gIGJhc2U6OlRpbWVEZWx0YSBsYXN0X2lucHV0X3RpbWVzdGFtcF87Ci0KLSAgLy8gTnVtYmVyIG9mIG91dHB1dCBzYW1wbGUgYnl0ZXMgdG8gZHJvcCBiZWZvcmUgZ2VuZXJhdGluZwotICAvLyBvdXRwdXQgYnVmZmVycy4KLSAgaW50IG91dHB1dF9ieXRlc190b19kcm9wXzsKLQotICAvLyBIb2xkcyBkZWNvZGVkIGF1ZGlvLgotICBBVkZyYW1lKiBhdl9mcmFtZV87Ci0KLSAgUmVhZENCIHJlYWRfY2JfOwotCi0gIC8vIFNpbmNlIG11bHRpcGxlIGZyYW1lcyBtYXkgYmUgZGVjb2RlZCBmcm9tIHRoZSBzYW1lIHBhY2tldCB3ZSBuZWVkIHRvIHF1ZXVlCi0gIC8vIHRoZW0gdXAgYW5kIGhhbmQgdGhlbSBvdXQgYXMgd2UgcmVjZWl2ZSBSZWFkKCkgY2FsbHMuCi0gIHN0ZDo6bGlzdDxRdWV1ZWRBdWRpb0J1ZmZlcj4gcXVldWVkX2F1ZGlvXzsKLQotICBESVNBTExPV19JTVBMSUNJVF9DT05TVFJVQ1RPUlMoRkZtcGVnQXVkaW9EZWNvZGVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0ZJTFRFUlNfRkZNUEVHX0FVRElPX0RFQ09ERVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL2ZmbXBlZ19hdWRpb19kZWNvZGVyX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2ZpbHRlcnMvZmZtcGVnX2F1ZGlvX2RlY29kZXJfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDI5M2QuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvZmZtcGVnX2F1ZGlvX2RlY29kZXJfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgPGRlcXVlPgotCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJiYXNlL3N0cmluZ3ByaW50Zi5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21vY2tfZmlsdGVycy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdGVzdF9kYXRhX3V0aWwuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3Rlc3RfaGVscGVycy5oIgotI2luY2x1ZGUgIm1lZGlhL2ZmbXBlZy9mZm1wZWdfY29tbW9uLmgiCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9mZm1wZWdfYXVkaW9fZGVjb2Rlci5oIgotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvZmZtcGVnX2dsdWUuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgOjp0ZXN0aW5nOjpfOwotdXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm5SZWY7Ci11c2luZyA6OnRlc3Rpbmc6OlN0cmljdE1vY2s7Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLUFDVElPTl9QKEludm9rZVJlYWRQYWNrZXQsIHRlc3QpIHsKLSAgdGVzdC0+UmVhZFBhY2tldChhcmcwKTsKLX0KLQotY2xhc3MgRkZtcGVnQXVkaW9EZWNvZGVyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gIEZGbXBlZ0F1ZGlvRGVjb2RlclRlc3QoKQotICAgICAgOiBkZWNvZGVyXyhuZXcgRkZtcGVnQXVkaW9EZWNvZGVyKG1lc3NhZ2VfbG9vcF8ubWVzc2FnZV9sb29wX3Byb3h5KCkpKSwKLSAgICAgICAgZGVtdXhlcl8obmV3IFN0cmljdE1vY2s8TW9ja0RlbXV4ZXJTdHJlYW0+KCkpIHsKLSAgICBGRm1wZWdHbHVlOjpJbml0aWFsaXplRkZtcGVnKCk7Ci0KLSAgICB2b3JiaXNfZXh0cmFkYXRhXyA9IFJlYWRUZXN0RGF0YUZpbGUoInZvcmJpcy1leHRyYWRhdGEiKTsKLQotICAgIC8vIFJlZmVyIHRvIG1lZGlhL3Rlc3QvZGF0YS9SRUFETUUgZm9yIGRldGFpbHMgb24gdm9yYmlzIHRlc3QgZGF0YS4KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgewotICAgICAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBidWZmZXIgPQotICAgICAgICAgIFJlYWRUZXN0RGF0YUZpbGUoYmFzZTo6U3RyaW5nUHJpbnRmKCJ2b3JiaXMtcGFja2V0LSVkIiwgaSkpOwotCi0gICAgICBpZiAoaSA8IDMpIHsKLSAgICAgICAgYnVmZmVyLT5TZXRUaW1lc3RhbXAoYmFzZTo6VGltZURlbHRhKCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYnVmZmVyLT5TZXRUaW1lc3RhbXAoYmFzZTo6VGltZURlbHRhOjpGcm9tTWljcm9zZWNvbmRzKDI5MDIpKTsKLSAgICAgIH0KLQotICAgICAgYnVmZmVyLT5TZXREdXJhdGlvbihiYXNlOjpUaW1lRGVsdGEoKSk7Ci0gICAgICBlbmNvZGVkX2F1ZGlvXy5wdXNoX2JhY2soYnVmZmVyKTsKLSAgICB9Ci0KLSAgICAvLyBQdXNoIGluIGFuIEVPUyBidWZmZXIuCi0gICAgZW5jb2RlZF9hdWRpb18ucHVzaF9iYWNrKERlY29kZXJCdWZmZXI6OkNyZWF0ZUVPU0J1ZmZlcigpKTsKLQotICAgIGNvbmZpZ18uSW5pdGlhbGl6ZShrQ29kZWNWb3JiaXMsCi0gICAgICAgICAgICAgICAgICAgICAgIDE2LAotICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX0xBWU9VVF9TVEVSRU8sCi0gICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAotICAgICAgICAgICAgICAgICAgICAgICB2b3JiaXNfZXh0cmFkYXRhXy0+R2V0RGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICB2b3JiaXNfZXh0cmFkYXRhXy0+R2V0RGF0YVNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICAvLyBOb3QgZW5jcnlwdGVkLgotICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgfQotCi0gIHZpcnR1YWwgfkZGbXBlZ0F1ZGlvRGVjb2RlclRlc3QoKSB7fQotCi0gIHZvaWQgSW5pdGlhbGl6ZSgpIHsKLSAgICBFWFBFQ1RfQ0FMTCgqZGVtdXhlcl8sIGF1ZGlvX2RlY29kZXJfY29uZmlnKCkpCi0gICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm5SZWYoY29uZmlnXykpOwotCi0gICAgZGVjb2Rlcl8tPkluaXRpYWxpemUoZGVtdXhlcl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgTmV3RXhwZWN0ZWRTdGF0dXNDQihQSVBFTElORV9PSyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmTW9ja1N0YXRpc3RpY3NDQjo6T25TdGF0aXN0aWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCgmc3RhdGlzdGljc19jYl8pKSk7Ci0KLSAgICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotICB9Ci0KLSAgdm9pZCBSZWFkUGFja2V0KGNvbnN0IERlbXV4ZXJTdHJlYW06OlJlYWRDQiYgcmVhZF9jYikgewotICAgIENIRUNLKCFlbmNvZGVkX2F1ZGlvXy5lbXB0eSgpKSA8PCAiUmVhZFBhY2tldCgpIGNhbGxlZCB0b28gbWFueSB0aW1lcyI7Ci0KLSAgICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGJ1ZmZlcihlbmNvZGVkX2F1ZGlvXy5mcm9udCgpKTsKLSAgICBEZW11eGVyU3RyZWFtOjpTdGF0dXMgc3RhdHVzID0KLSAgICAgICAgYnVmZmVyID8gRGVtdXhlclN0cmVhbTo6a09rIDogRGVtdXhlclN0cmVhbTo6a0Fib3J0ZWQ7Ci0gICAgZW5jb2RlZF9hdWRpb18ucG9wX2Zyb250KCk7Ci0gICAgcmVhZF9jYi5SdW4oc3RhdHVzLCBidWZmZXIpOwotICB9Ci0KLSAgdm9pZCBSZWFkKCkgewotICAgIGRlY29kZXJfLT5SZWFkKGJhc2U6OkJpbmQoCi0gICAgICAgICZGRm1wZWdBdWRpb0RlY29kZXJUZXN0OjpEZWNvZGVGaW5pc2hlZCwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICAgIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci0gIH0KLQotICB2b2lkIERlY29kZUZpbmlzaGVkKEF1ZGlvRGVjb2Rlcjo6U3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPEJ1ZmZlcj4mIGJ1ZmZlcikgewotICAgIGRlY29kZWRfYXVkaW9fLnB1c2hfYmFjayhidWZmZXIpOwotICB9Ci0KLSAgdm9pZCBFeHBlY3REZWNvZGVkQXVkaW8oc2l6ZV90IGksIGludDY0IHRpbWVzdGFtcCwgaW50NjQgZHVyYXRpb24pIHsKLSAgICBFWFBFQ1RfTFQoaSwgZGVjb2RlZF9hdWRpb18uc2l6ZSgpKTsKLSAgICBFWFBFQ1RfRVEodGltZXN0YW1wLCBkZWNvZGVkX2F1ZGlvX1tpXS0+R2V0VGltZXN0YW1wKCkuSW5NaWNyb3NlY29uZHMoKSk7Ci0gICAgRVhQRUNUX0VRKGR1cmF0aW9uLCBkZWNvZGVkX2F1ZGlvX1tpXS0+R2V0RHVyYXRpb24oKS5Jbk1pY3Jvc2Vjb25kcygpKTsKLSAgICBFWFBFQ1RfRkFMU0UoZGVjb2RlZF9hdWRpb19baV0tPklzRW5kT2ZTdHJlYW0oKSk7Ci0gIH0KLQotICB2b2lkIEV4cGVjdEVuZE9mU3RyZWFtKHNpemVfdCBpKSB7Ci0gICAgRVhQRUNUX0xUKGksIGRlY29kZWRfYXVkaW9fLnNpemUoKSk7Ci0gICAgRVhQRUNUX0VRKDAsIGRlY29kZWRfYXVkaW9fW2ldLT5HZXRUaW1lc3RhbXAoKS5Jbk1pY3Jvc2Vjb25kcygpKTsKLSAgICBFWFBFQ1RfRVEoMCwgZGVjb2RlZF9hdWRpb19baV0tPkdldER1cmF0aW9uKCkuSW5NaWNyb3NlY29uZHMoKSk7Ci0gICAgRVhQRUNUX1RSVUUoZGVjb2RlZF9hdWRpb19baV0tPklzRW5kT2ZTdHJlYW0oKSk7Ci0gIH0KLQotICBNZXNzYWdlTG9vcCBtZXNzYWdlX2xvb3BfOwotICBzY29wZWRfcmVmcHRyPEZGbXBlZ0F1ZGlvRGVjb2Rlcj4gZGVjb2Rlcl87Ci0gIHNjb3BlZF9yZWZwdHI8U3RyaWN0TW9jazxNb2NrRGVtdXhlclN0cmVhbT4gPiBkZW11eGVyXzsKLSAgTW9ja1N0YXRpc3RpY3NDQiBzdGF0aXN0aWNzX2NiXzsKLQotICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IHZvcmJpc19leHRyYWRhdGFfOwotCi0gIHN0ZDo6ZGVxdWU8c2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiA+IGVuY29kZWRfYXVkaW9fOwotICBzdGQ6OmRlcXVlPHNjb3BlZF9yZWZwdHI8QnVmZmVyPiA+IGRlY29kZWRfYXVkaW9fOwotCi0gIEF1ZGlvRGVjb2RlckNvbmZpZyBjb25maWdfOwotfTsKLQotVEVTVF9GKEZGbXBlZ0F1ZGlvRGVjb2RlclRlc3QsIEluaXRpYWxpemUpIHsKLSAgSW5pdGlhbGl6ZSgpOwotCi0gIEVYUEVDVF9FUSgxNiwgZGVjb2Rlcl8tPmJpdHNfcGVyX2NoYW5uZWwoKSk7Ci0gIEVYUEVDVF9FUShDSEFOTkVMX0xBWU9VVF9TVEVSRU8sIGRlY29kZXJfLT5jaGFubmVsX2xheW91dCgpKTsKLSAgRVhQRUNUX0VRKDQ0MTAwLCBkZWNvZGVyXy0+c2FtcGxlc19wZXJfc2Vjb25kKCkpOwotfQotCi1URVNUX0YoRkZtcGVnQXVkaW9EZWNvZGVyVGVzdCwgUHJvZHVjZUF1ZGlvU2FtcGxlcykgewotICBJbml0aWFsaXplKCk7Ci0KLSAgLy8gVm9yYmlzIHJlcXVpcmVzIE4rMSBwYWNrZXRzIHRvIHByb2R1Y2UgYXVkaW8gZGF0YSBmb3IgTiBwYWNrZXRzLgotICAvLwotICAvLyBUaGlzIHdpbGwgc2hvdWxkIHJlc3VsdCBpbiB0aGUgZGVtdXhlciByZWNlaXZpbmcgdGhyZWUgcmVhZHMgZm9yIHR3bwotICAvLyByZXF1ZXN0cyB0byBwcm9kdWNlIGF1ZGlvIHNhbXBsZXMuCi0gIEVYUEVDVF9DQUxMKCpkZW11eGVyXywgUmVhZChfKSkKLSAgICAgIC5UaW1lcyg1KQotICAgICAgLldpbGxSZXBlYXRlZGx5KEludm9rZVJlYWRQYWNrZXQodGhpcykpOwotICBFWFBFQ1RfQ0FMTChzdGF0aXN0aWNzX2NiXywgT25TdGF0aXN0aWNzKF8pKQotICAgICAgLlRpbWVzKDQpOwotCi0gIFJlYWQoKTsKLSAgUmVhZCgpOwotICBSZWFkKCk7Ci0KLSAgQVNTRVJUX0VRKDN1LCBkZWNvZGVkX2F1ZGlvXy5zaXplKCkpOwotICBFeHBlY3REZWNvZGVkQXVkaW8oMCwgMCwgMjkwMik7Ci0gIEV4cGVjdERlY29kZWRBdWRpbygxLCAyOTAyLCAxMzA2MSk7Ci0gIEV4cGVjdERlY29kZWRBdWRpbygyLCAxNTk2MywgMjMyMjApOwotCi0gIC8vIENhbGwgb25lIG1vcmUgdGltZSB0byB0cmlnZ2VyIEVPUy4KLSAgUmVhZCgpOwotICBBU1NFUlRfRVEoNHUsIGRlY29kZWRfYXVkaW9fLnNpemUoKSk7Ci0gIEV4cGVjdEVuZE9mU3RyZWFtKDMpOwotfQotCi1URVNUX0YoRkZtcGVnQXVkaW9EZWNvZGVyVGVzdCwgUmVhZEFib3J0KSB7Ci0gIEluaXRpYWxpemUoKTsKLQotICBlbmNvZGVkX2F1ZGlvXy5jbGVhcigpOwotICBlbmNvZGVkX2F1ZGlvXy5wdXNoX2JhY2soTlVMTCk7Ci0KLSAgRVhQRUNUX0NBTEwoKmRlbXV4ZXJfLCBSZWFkKF8pKQotICAgICAgLldpbGxPbmNlKEludm9rZVJlYWRQYWNrZXQodGhpcykpOwotICBSZWFkKCk7Ci0KLSAgRVhQRUNUX0VRKGRlY29kZWRfYXVkaW9fLnNpemUoKSwgMXUpOwotICBFWFBFQ1RfVFJVRShkZWNvZGVkX2F1ZGlvX1swXS5nZXQoKSA9PSAgTlVMTCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvZmZtcGVnX2RlbXV4ZXIuY2MgYi9zcmMvbWVkaWEvZmlsdGVycy9mZm1wZWdfZGVtdXhlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5MjliYy4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9mZm1wZWdfZGVtdXhlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDY4NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9mZm1wZWdfZGVtdXhlci5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJiYXNlL2NvbW1hbmRfbGluZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgotI2luY2x1ZGUgImJhc2Uvc3RsX3V0aWwuaCIKLSNpbmNsdWRlICJiYXNlL3N0cmluZ191dGlsLmgiCi0jaW5jbHVkZSAiYmFzZS90YXNrX3J1bm5lcl91dGlsLmgiCi0jaW5jbHVkZSAiYmFzZS90aW1lLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19kZWNvZGVyX2NvbmZpZy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYmluZF90b19sb29wLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbGltaXRzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9zd2l0Y2hlcy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fZGVjb2Rlcl9jb25maWcuaCIKLSNpbmNsdWRlICJtZWRpYS9mZm1wZWcvZmZtcGVnX2NvbW1vbi5oIgotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvZmZtcGVnX2dsdWUuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL2ZmbXBlZ19oMjY0X3RvX2FubmV4X2JfYml0c3RyZWFtX2NvbnZlcnRlci5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLwotLy8gRkZtcGVnRGVtdXhlclN0cmVhbQotLy8KLUZGbXBlZ0RlbXV4ZXJTdHJlYW06OkZGbXBlZ0RlbXV4ZXJTdHJlYW0oCi0gICAgRkZtcGVnRGVtdXhlciogZGVtdXhlciwKLSAgICBBVlN0cmVhbSogc3RyZWFtKQotICAgIDogZGVtdXhlcl8oZGVtdXhlciksCi0gICAgICBtZXNzYWdlX2xvb3BfKGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk6OmN1cnJlbnQoKSksCi0gICAgICBzdHJlYW1fKHN0cmVhbSksCi0gICAgICB0eXBlXyhVTktOT1dOKSwKLSAgICAgIHN0b3BwZWRfKGZhbHNlKSwKLSAgICAgIGVuZF9vZl9zdHJlYW1fKGZhbHNlKSwKLSAgICAgIGxhc3RfcGFja2V0X3RpbWVzdGFtcF8oa05vVGltZXN0YW1wKCkpLAotICAgICAgYml0c3RyZWFtX2NvbnZlcnRlcl9lbmFibGVkXyhmYWxzZSkgewotICBEQ0hFQ0soZGVtdXhlcl8pOwotCi0gIC8vIERldGVybWluZSBvdXIgbWVkaWEgZm9ybWF0LgotICBzd2l0Y2ggKHN0cmVhbS0+Y29kZWMtPmNvZGVjX3R5cGUpIHsKLSAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKLSAgICAgIHR5cGVfID0gQVVESU87Ci0gICAgICBBVkNvZGVjQ29udGV4dFRvQXVkaW9EZWNvZGVyQ29uZmlnKHN0cmVhbS0+Y29kZWMsICZhdWRpb19jb25maWdfKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgotICAgICAgdHlwZV8gPSBWSURFTzsKLSAgICAgIEFWU3RyZWFtVG9WaWRlb0RlY29kZXJDb25maWcoc3RyZWFtLCAmdmlkZW9fY29uZmlnXyk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTk9UUkVBQ0hFRCgpOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICAvLyBDYWxjdWxhdGUgdGhlIGR1cmF0aW9uLgotICBkdXJhdGlvbl8gPSBDb252ZXJ0U3RyZWFtVGltZXN0YW1wKHN0cmVhbS0+dGltZV9iYXNlLCBzdHJlYW0tPmR1cmF0aW9uKTsKLQotICBpZiAoc3RyZWFtXy0+Y29kZWMtPmNvZGVjX2lkID09IENPREVDX0lEX0gyNjQpIHsKLSAgICBiaXRzdHJlYW1fY29udmVydGVyXy5yZXNldCgKLSAgICAgICAgbmV3IEZGbXBlZ0gyNjRUb0FubmV4QkJpdHN0cmVhbUNvbnZlcnRlcihzdHJlYW1fLT5jb2RlYykpOwotICB9Ci19Ci0KLXZvaWQgRkZtcGVnRGVtdXhlclN0cmVhbTo6RW5xdWV1ZVBhY2tldChTY29wZWRBVlBhY2tldCBwYWNrZXQpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0KLSAgaWYgKHN0b3BwZWRfIHx8IGVuZF9vZl9zdHJlYW1fKSB7Ci0gICAgTk9UUkVBQ0hFRCgpIDw8ICJBdHRlbXB0ZWQgdG8gZW5xdWV1ZSBwYWNrZXQgb24gYSBzdG9wcGVkIHN0cmVhbSI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gQ29udmVydCB0aGUgcGFja2V0IGlmIHRoZXJlIGlzIGEgYml0c3RyZWFtIGZpbHRlci4KLSAgaWYgKHBhY2tldC0+ZGF0YSAmJiBiaXRzdHJlYW1fY29udmVydGVyX2VuYWJsZWRfICYmCi0gICAgICAhYml0c3RyZWFtX2NvbnZlcnRlcl8tPkNvbnZlcnRQYWNrZXQocGFja2V0LmdldCgpKSkgewotICAgIExPRyhFUlJPUikgPDwgIkZvcm1hdCBjb252ZXJzaW9uIGZhaWxlZC4iOwotICB9Ci0KLSAgLy8gSWYgYSBwYWNrZXQgaXMgcmV0dXJuZWQgYnkgRkZtcGVnJ3MgYXZfcGFyc2VyX3BhcnNlMigpIHRoZSBwYWNrZXQgd2lsbAotICAvLyByZWZlcmVuY2UgaW5uZXIgbWVtb3J5IG9mIEZGbXBlZy4gIEFzIHN1Y2ggd2Ugc2hvdWxkIHRyYW5zZmVyIHRoZSBwYWNrZXQKLSAgLy8gaW50byBtZW1vcnkgd2UgY29udHJvbC4KLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBidWZmZXI7Ci0gIGJ1ZmZlciA9IERlY29kZXJCdWZmZXI6OkNvcHlGcm9tKHBhY2tldC0+ZGF0YSwgcGFja2V0LT5zaXplKTsKLSAgYnVmZmVyLT5TZXRUaW1lc3RhbXAoQ29udmVydFN0cmVhbVRpbWVzdGFtcCgKLSAgICAgIHN0cmVhbV8tPnRpbWVfYmFzZSwgcGFja2V0LT5wdHMpKTsKLSAgYnVmZmVyLT5TZXREdXJhdGlvbihDb252ZXJ0U3RyZWFtVGltZXN0YW1wKAotICAgICAgc3RyZWFtXy0+dGltZV9iYXNlLCBwYWNrZXQtPmR1cmF0aW9uKSk7Ci0gIGlmIChidWZmZXItPkdldFRpbWVzdGFtcCgpICE9IGtOb1RpbWVzdGFtcCgpICYmCi0gICAgICBsYXN0X3BhY2tldF90aW1lc3RhbXBfICE9IGtOb1RpbWVzdGFtcCgpICYmCi0gICAgICBsYXN0X3BhY2tldF90aW1lc3RhbXBfIDwgYnVmZmVyLT5HZXRUaW1lc3RhbXAoKSkgewotICAgIGJ1ZmZlcmVkX3Jhbmdlc18uQWRkKGxhc3RfcGFja2V0X3RpbWVzdGFtcF8sIGJ1ZmZlci0+R2V0VGltZXN0YW1wKCkpOwotICAgIGRlbXV4ZXJfLT5Ob3RpZnlCdWZmZXJpbmdDaGFuZ2VkKCk7Ci0gIH0KLSAgbGFzdF9wYWNrZXRfdGltZXN0YW1wXyA9IGJ1ZmZlci0+R2V0VGltZXN0YW1wKCk7Ci0KLSAgYnVmZmVyX3F1ZXVlXy5QdXNoKGJ1ZmZlcik7Ci0gIFNhdGlzZnlQZW5kaW5nUmVhZCgpOwotfQotCi12b2lkIEZGbXBlZ0RlbXV4ZXJTdHJlYW06OlNldEVuZE9mU3RyZWFtKCkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgZW5kX29mX3N0cmVhbV8gPSB0cnVlOwotICBTYXRpc2Z5UGVuZGluZ1JlYWQoKTsKLX0KLQotdm9pZCBGRm1wZWdEZW11eGVyU3RyZWFtOjpGbHVzaEJ1ZmZlcnMoKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBEQ0hFQ0socmVhZF9jYl8uaXNfbnVsbCgpKSA8PCAiVGhlcmUgc2hvdWxkIGJlIG5vIHBlbmRpbmcgcmVhZCI7Ci0gIGJ1ZmZlcl9xdWV1ZV8uQ2xlYXIoKTsKLSAgZW5kX29mX3N0cmVhbV8gPSBmYWxzZTsKLSAgbGFzdF9wYWNrZXRfdGltZXN0YW1wXyA9IGtOb1RpbWVzdGFtcCgpOwotfQotCi12b2lkIEZGbXBlZ0RlbXV4ZXJTdHJlYW06OlN0b3AoKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBidWZmZXJfcXVldWVfLkNsZWFyKCk7Ci0gIGlmICghcmVhZF9jYl8uaXNfbnVsbCgpKSB7Ci0gICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnJlYWRfY2JfKS5SdW4oCi0gICAgICAgIERlbXV4ZXJTdHJlYW06OmtPaywgRGVjb2RlckJ1ZmZlcjo6Q3JlYXRlRU9TQnVmZmVyKCkpOwotICB9Ci0gIHN0b3BwZWRfID0gdHJ1ZTsKLSAgZW5kX29mX3N0cmVhbV8gPSB0cnVlOwotfQotCi1iYXNlOjpUaW1lRGVsdGEgRkZtcGVnRGVtdXhlclN0cmVhbTo6ZHVyYXRpb24oKSB7Ci0gIHJldHVybiBkdXJhdGlvbl87Ci19Ci0KLURlbXV4ZXJTdHJlYW06OlR5cGUgRkZtcGVnRGVtdXhlclN0cmVhbTo6dHlwZSgpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIHJldHVybiB0eXBlXzsKLX0KLQotdm9pZCBGRm1wZWdEZW11eGVyU3RyZWFtOjpSZWFkKGNvbnN0IFJlYWRDQiYgcmVhZF9jYikgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgQ0hFQ0socmVhZF9jYl8uaXNfbnVsbCgpKSA8PCAiT3ZlcmxhcHBpbmcgcmVhZHMgYXJlIG5vdCBzdXBwb3J0ZWQiOwotICByZWFkX2NiXyA9IEJpbmRUb0N1cnJlbnRMb29wKHJlYWRfY2IpOwotCi0gIC8vIERvbid0IGFjY2VwdCBhbnkgYWRkaXRpb25hbCByZWFkcyBpZiB3ZSd2ZSBiZWVuIHRvbGQgdG8gc3RvcC4KLSAgLy8gVGhlIHxkZW11eGVyX3wgbWF5IGhhdmUgYmVlbiBkZXN0cm95ZWQgaW4gdGhlIHBpcGVsaW5lIHRocmVhZC4KLSAgLy8KLSAgLy8gVE9ETyhzY2hlcmt1cyk6IGl0IHdvdWxkIGJlIGNsZWFuZXIgdG8gcmVwbHkgd2l0aCBhbiBlcnJvciBtZXNzYWdlLgotICBpZiAoc3RvcHBlZF8pIHsKLSAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcmVhZF9jYl8pLlJ1bigKLSAgICAgICAgRGVtdXhlclN0cmVhbTo6a09rLCBEZWNvZGVyQnVmZmVyOjpDcmVhdGVFT1NCdWZmZXIoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgU2F0aXNmeVBlbmRpbmdSZWFkKCk7Ci19Ci0KLXZvaWQgRkZtcGVnRGVtdXhlclN0cmVhbTo6RW5hYmxlQml0c3RyZWFtQ29udmVydGVyKCkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgQ0hFQ0soYml0c3RyZWFtX2NvbnZlcnRlcl8uZ2V0KCkpOwotICBiaXRzdHJlYW1fY29udmVydGVyX2VuYWJsZWRfID0gdHJ1ZTsKLX0KLQotY29uc3QgQXVkaW9EZWNvZGVyQ29uZmlnJiBGRm1wZWdEZW11eGVyU3RyZWFtOjphdWRpb19kZWNvZGVyX2NvbmZpZygpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIENIRUNLX0VRKHR5cGVfLCBBVURJTyk7Ci0gIHJldHVybiBhdWRpb19jb25maWdfOwotfQotCi1jb25zdCBWaWRlb0RlY29kZXJDb25maWcmIEZGbXBlZ0RlbXV4ZXJTdHJlYW06OnZpZGVvX2RlY29kZXJfY29uZmlnKCkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgQ0hFQ0tfRVEodHlwZV8sIFZJREVPKTsKLSAgcmV0dXJuIHZpZGVvX2NvbmZpZ187Ci19Ci0KLUZGbXBlZ0RlbXV4ZXJTdHJlYW06On5GRm1wZWdEZW11eGVyU3RyZWFtKCkgewotICBEQ0hFQ0soc3RvcHBlZF8pOwotICBEQ0hFQ0socmVhZF9jYl8uaXNfbnVsbCgpKTsKLSAgRENIRUNLKGJ1ZmZlcl9xdWV1ZV8uSXNFbXB0eSgpKTsKLX0KLQotYmFzZTo6VGltZURlbHRhIEZGbXBlZ0RlbXV4ZXJTdHJlYW06OkdldEVsYXBzZWRUaW1lKCkgY29uc3QgewotICByZXR1cm4gQ29udmVydFN0cmVhbVRpbWVzdGFtcChzdHJlYW1fLT50aW1lX2Jhc2UsIHN0cmVhbV8tPmN1cl9kdHMpOwotfQotCi1SYW5nZXM8YmFzZTo6VGltZURlbHRhPiBGRm1wZWdEZW11eGVyU3RyZWFtOjpHZXRCdWZmZXJlZFJhbmdlcygpIGNvbnN0IHsKLSAgcmV0dXJuIGJ1ZmZlcmVkX3Jhbmdlc187Ci19Ci0KLXZvaWQgRkZtcGVnRGVtdXhlclN0cmVhbTo6U2F0aXNmeVBlbmRpbmdSZWFkKCkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgaWYgKCFyZWFkX2NiXy5pc19udWxsKCkpIHsKLSAgICBpZiAoIWJ1ZmZlcl9xdWV1ZV8uSXNFbXB0eSgpKSB7Ci0gICAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcmVhZF9jYl8pLlJ1bigKLSAgICAgICAgICBEZW11eGVyU3RyZWFtOjprT2ssIGJ1ZmZlcl9xdWV1ZV8uUG9wKCkpOwotICAgIH0gZWxzZSBpZiAoZW5kX29mX3N0cmVhbV8pIHsKLSAgICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZyZWFkX2NiXykuUnVuKAotICAgICAgICAgIERlbXV4ZXJTdHJlYW06OmtPaywgRGVjb2RlckJ1ZmZlcjo6Q3JlYXRlRU9TQnVmZmVyKCkpOwotICAgIH0KLSAgfQotCi0gIC8vIEhhdmUgY2FwYWNpdHk/IEFzayBmb3IgbW9yZSEKLSAgaWYgKEhhc0F2YWlsYWJsZUNhcGFjaXR5KCkgJiYgIWVuZF9vZl9zdHJlYW1fKSB7Ci0gICAgZGVtdXhlcl8tPk5vdGlmeUNhcGFjaXR5QXZhaWxhYmxlKCk7Ci0gIH0KLX0KLQotYm9vbCBGRm1wZWdEZW11eGVyU3RyZWFtOjpIYXNBdmFpbGFibGVDYXBhY2l0eSgpIHsKLSAgLy8gVE9ETyhzY2hlcmt1cyk6IFJlbW92ZSBlYXJseSByZXR1cm4gYW5kIHJlZW5hYmxlIHRpbWUtYmFzZWQgY2FwYWNpdHkKLSAgLy8gYWZ0ZXIgb3VyIGRhdGEgc291cmNlcyBzdXBwb3J0IGNhbmNlbGluZy9jb25jdXJyZW50IHJlYWRzLCBzZWUKLSAgLy8gaHR0cDovL2NyYnVnLmNvbS8xNjU3NjIgZm9yIGRldGFpbHMuCi0gIHJldHVybiAhcmVhZF9jYl8uaXNfbnVsbCgpOwotCi0gIC8vIFRyeSB0byBoYXZlIG9uZSBzZWNvbmQncyB3b3J0aCBvZiBlbmNvZGVkIGRhdGEgcGVyIHN0cmVhbS4KLSAgY29uc3QgYmFzZTo6VGltZURlbHRhIGtDYXBhY2l0eSA9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoMSk7Ci0gIHJldHVybiBidWZmZXJfcXVldWVfLklzRW1wdHkoKSB8fCBidWZmZXJfcXVldWVfLkR1cmF0aW9uKCkgPCBrQ2FwYWNpdHk7Ci19Ci0KLS8vIHN0YXRpYwotYmFzZTo6VGltZURlbHRhIEZGbXBlZ0RlbXV4ZXJTdHJlYW06OkNvbnZlcnRTdHJlYW1UaW1lc3RhbXAoCi0gICAgY29uc3QgQVZSYXRpb25hbCYgdGltZV9iYXNlLCBpbnQ2NCB0aW1lc3RhbXApIHsKLSAgaWYgKHRpbWVzdGFtcCA9PSBzdGF0aWNfY2FzdDxpbnQ2ND4oQVZfTk9QVFNfVkFMVUUpKQotICAgIHJldHVybiBrTm9UaW1lc3RhbXAoKTsKLQotICByZXR1cm4gQ29udmVydEZyb21UaW1lQmFzZSh0aW1lX2Jhc2UsIHRpbWVzdGFtcCk7Ci19Ci0KLS8vCi0vLyBGRm1wZWdEZW11eGVyCi0vLwotRkZtcGVnRGVtdXhlcjo6RkZtcGVnRGVtdXhlcigKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+JiBtZXNzYWdlX2xvb3AsCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEYXRhU291cmNlPiYgZGF0YV9zb3VyY2UpCi0gICAgOiBob3N0XyhOVUxMKSwKLSAgICAgIG1lc3NhZ2VfbG9vcF8obWVzc2FnZV9sb29wKSwKLSAgICAgIGJsb2NraW5nX3RocmVhZF8oIkZGbXBlZ0RlbXV4ZXIiKSwKLSAgICAgIHBlbmRpbmdfcmVhZF8oZmFsc2UpLAotICAgICAgcGVuZGluZ19zZWVrXyhmYWxzZSksCi0gICAgICBkYXRhX3NvdXJjZV8oZGF0YV9zb3VyY2UpLAotICAgICAgYml0cmF0ZV8oMCksCi0gICAgICBzdGFydF90aW1lXyhrTm9UaW1lc3RhbXAoKSksCi0gICAgICBhdWRpb19kaXNhYmxlZF8oZmFsc2UpLAotICAgICAgZHVyYXRpb25fa25vd25fKGZhbHNlKSwKLSAgICAgIHVybF9wcm90b2NvbF8oZGF0YV9zb3VyY2UsIEJpbmRUb0xvb3AobWVzc2FnZV9sb29wXywgYmFzZTo6QmluZCgKLSAgICAgICAgICAmRkZtcGVnRGVtdXhlcjo6T25EYXRhU291cmNlRXJyb3IsIGJhc2U6OlVucmV0YWluZWQodGhpcykpKSkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXyk7Ci0gIERDSEVDSyhkYXRhX3NvdXJjZV8pOwotfQotCi1GRm1wZWdEZW11eGVyOjp+RkZtcGVnRGVtdXhlcigpIHt9Ci0KLXZvaWQgRkZtcGVnRGVtdXhlcjo6U3RvcChjb25zdCBiYXNlOjpDbG9zdXJlJiBjYWxsYmFjaykgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgdXJsX3Byb3RvY29sXy5BYm9ydCgpOwotICBkYXRhX3NvdXJjZV8tPlN0b3AoQmluZFRvQ3VycmVudExvb3AoYmFzZTo6QmluZCgKLSAgICAgICZGRm1wZWdEZW11eGVyOjpPbkRhdGFTb3VyY2VTdG9wcGVkLCB0aGlzLCBCaW5kVG9DdXJyZW50TG9vcChjYWxsYmFjaykpKSk7Ci19Ci0KLXZvaWQgRkZtcGVnRGVtdXhlcjo6U2VlayhiYXNlOjpUaW1lRGVsdGEgdGltZSwgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgY2IpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIENIRUNLKCFwZW5kaW5nX3NlZWtfKTsKLQotICAvLyBUT0RPKHNjaGVya3VzKTogSW5zcGVjdCB8cGVuZGluZ19yZWFkX3wgYW5kIGNhbmNlbCBJTyB2aWEgfGJsb2NraW5nX3VybF98LAotICAvLyBvdGhlcndpc2Ugd2UgY2FuIGVuZCB1cCB3YWl0aW5nIGZvciBhIHByZS1zZWVrIHJlYWQgdG8gY29tcGxldGUgZXZlbiB0aG91Z2gKLSAgLy8gd2Uga25vdyB3ZSdyZSBnb2luZyB0byBkcm9wIGl0IG9uIHRoZSBmbG9vci4KLQotICAvLyBBbHdheXMgc2VlayB0byBhIHRpbWVzdGFtcCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGRlc2lyZWQgdGltZXN0YW1wLgotICBpbnQgZmxhZ3MgPSBBVlNFRUtfRkxBR19CQUNLV0FSRDsKLQotICAvLyBQYXNzaW5nIC0xIGFzIG91ciBzdHJlYW0gaW5kZXggbGV0cyBGRm1wZWcgcGljayBhIGRlZmF1bHQgc3RyZWFtLiAgRkZtcGVnCi0gIC8vIHdpbGwgYXR0ZW1wdCB0byB1c2UgdGhlIGxvd2VzdC1pbmRleCB2aWRlbyBzdHJlYW0sIGlmIHByZXNlbnQsIGZvbGxvd2VkIGJ5Ci0gIC8vIHRoZSBsb3dlc3QtaW5kZXggYXVkaW8gc3RyZWFtLgotICBwZW5kaW5nX3NlZWtfID0gdHJ1ZTsKLSAgYmFzZTo6UG9zdFRhc2tBbmRSZXBseVdpdGhSZXN1bHQoCi0gICAgICBibG9ja2luZ190aHJlYWRfLm1lc3NhZ2VfbG9vcF9wcm94eSgpLCBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kKCZhdl9zZWVrX2ZyYW1lLCBnbHVlXy0+Zm9ybWF0X2NvbnRleHQoKSwgLTEsCi0gICAgICAgICAgICAgICAgIHRpbWUuSW5NaWNyb3NlY29uZHMoKSwgZmxhZ3MpLAotICAgICAgYmFzZTo6QmluZCgmRkZtcGVnRGVtdXhlcjo6T25TZWVrRnJhbWVEb25lLCB0aGlzLCBjYikpOwotfQotCi12b2lkIEZGbXBlZ0RlbXV4ZXI6OlNldFBsYXliYWNrUmF0ZShmbG9hdCBwbGF5YmFja19yYXRlKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBkYXRhX3NvdXJjZV8tPlNldFBsYXliYWNrUmF0ZShwbGF5YmFja19yYXRlKTsKLX0KLQotdm9pZCBGRm1wZWdEZW11eGVyOjpPbkF1ZGlvUmVuZGVyZXJEaXNhYmxlZCgpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIGF1ZGlvX2Rpc2FibGVkXyA9IHRydWU7Ci0gIFN0cmVhbVZlY3Rvcjo6aXRlcmF0b3IgaXRlcjsKLSAgZm9yIChpdGVyID0gc3RyZWFtc18uYmVnaW4oKTsgaXRlciAhPSBzdHJlYW1zXy5lbmQoKTsgKytpdGVyKSB7Ci0gICAgaWYgKCppdGVyICYmICgqaXRlciktPnR5cGUoKSA9PSBEZW11eGVyU3RyZWFtOjpBVURJTykgewotICAgICAgKCppdGVyKS0+U3RvcCgpOwotICAgIH0KLSAgfQotfQotCi12b2lkIEZGbXBlZ0RlbXV4ZXI6OkluaXRpYWxpemUoRGVtdXhlckhvc3QqIGhvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc3RhdHVzX2NiKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBob3N0XyA9IGhvc3Q7Ci0KLSAgLy8gVE9ETyhzY2hlcmt1cyk6IERhdGFTb3VyY2Ugc2hvdWxkIGhhdmUgYSBob3N0IGJ5IHRoaXMgcG9pbnQsCi0gIC8vIHNlZSBodHRwOi8vY3JidWcuY29tLzEyMjA3MQotICBkYXRhX3NvdXJjZV8tPnNldF9ob3N0KGhvc3QpOwotCi0gIGdsdWVfLnJlc2V0KG5ldyBGRm1wZWdHbHVlKCZ1cmxfcHJvdG9jb2xfKSk7Ci0gIEFWRm9ybWF0Q29udGV4dCogZm9ybWF0X2NvbnRleHQgPSBnbHVlXy0+Zm9ybWF0X2NvbnRleHQoKTsKLQotICAvLyBEaXNhYmxlIElEM3YxIHRhZyByZWFkaW5nIHRvIGF2b2lkIGNvc3RseSBzZWVrcyB0byBlbmQgb2YgZmlsZSBmb3IgZGF0YSB3ZQotICAvLyBkb24ndCB1c2UuICBGRm1wZWcgd2lsbCBvbmx5IHJlYWQgSUQzdjEgdGFncyBpZiBubyBvdGhlciBtZXRhZGF0YSBpcwotICAvLyBhdmFpbGFibGUsIHNvIGFkZCBhIG1ldGFkYXRhIGVudHJ5IHRvIGVuc3VyZSBzb21lIGlzIGFsd2F5cyBwcmVzZW50LgotICBhdl9kaWN0X3NldCgmZm9ybWF0X2NvbnRleHQtPm1ldGFkYXRhLCAic2tpcF9pZDN2MV90YWdzIiwgIiIsIDApOwotCi0gIC8vIE9wZW4gdGhlIEFWRm9ybWF0Q29udGV4dCB1c2luZyBvdXIgZ2x1ZSBsYXllci4KLSAgQ0hFQ0soYmxvY2tpbmdfdGhyZWFkXy5TdGFydCgpKTsKLSAgYmFzZTo6UG9zdFRhc2tBbmRSZXBseVdpdGhSZXN1bHQoCi0gICAgICBibG9ja2luZ190aHJlYWRfLm1lc3NhZ2VfbG9vcF9wcm94eSgpLCBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kKCZGRm1wZWdHbHVlOjpPcGVuQ29udGV4dCwgYmFzZTo6VW5yZXRhaW5lZChnbHVlXy5nZXQoKSkpLAotICAgICAgYmFzZTo6QmluZCgmRkZtcGVnRGVtdXhlcjo6T25PcGVuQ29udGV4dERvbmUsIHRoaXMsIHN0YXR1c19jYikpOwotfQotCi1zY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IEZGbXBlZ0RlbXV4ZXI6OkdldFN0cmVhbSgKLSAgICBEZW11eGVyU3RyZWFtOjpUeXBlIHR5cGUpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIHJldHVybiBHZXRGRm1wZWdTdHJlYW0odHlwZSk7Ci19Ci0KLXNjb3BlZF9yZWZwdHI8RkZtcGVnRGVtdXhlclN0cmVhbT4gRkZtcGVnRGVtdXhlcjo6R2V0RkZtcGVnU3RyZWFtKAotICAgIERlbXV4ZXJTdHJlYW06OlR5cGUgdHlwZSkgY29uc3QgewotICBTdHJlYW1WZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0gIGZvciAoaXRlciA9IHN0cmVhbXNfLmJlZ2luKCk7IGl0ZXIgIT0gc3RyZWFtc18uZW5kKCk7ICsraXRlcikgewotICAgIGlmICgqaXRlciAmJiAoKml0ZXIpLT50eXBlKCkgPT0gdHlwZSkgewotICAgICAgcmV0dXJuICppdGVyOwotICAgIH0KLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotYmFzZTo6VGltZURlbHRhIEZGbXBlZ0RlbXV4ZXI6OkdldFN0YXJ0VGltZSgpIGNvbnN0IHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIHJldHVybiBzdGFydF90aW1lXzsKLX0KLQotLy8gSGVscGVyIGZvciBjYWxjdWxhdGluZyB0aGUgYml0cmF0ZSBvZiB0aGUgbWVkaWEgYmFzZWQgb24gaW5mb3JtYXRpb24gc3RvcmVkCi0vLyBpbiB8Zm9ybWF0X2NvbnRleHR8IG9yIGZhaWxpbmcgdGhhdCB0aGUgc2l6ZSBhbmQgZHVyYXRpb24gb2YgdGhlIG1lZGlhLgotLy8KLS8vIFJldHVybnMgMCBpZiBhIGJpdHJhdGUgY291bGQgbm90IGJlIGRldGVybWluZWQuCi1zdGF0aWMgaW50IENhbGN1bGF0ZUJpdHJhdGUoCi0gICAgQVZGb3JtYXRDb250ZXh0KiBmb3JtYXRfY29udGV4dCwKLSAgICBjb25zdCBiYXNlOjpUaW1lRGVsdGEmIGR1cmF0aW9uLAotICAgIGludDY0IGZpbGVzaXplX2luX2J5dGVzKSB7Ci0gIC8vIElmIHRoZXJlIGlzIGEgYml0cmF0ZSBzZXQgb24gdGhlIGNvbnRhaW5lciwgdXNlIGl0LgotICBpZiAoZm9ybWF0X2NvbnRleHQtPmJpdF9yYXRlID4gMCkKLSAgICByZXR1cm4gZm9ybWF0X2NvbnRleHQtPmJpdF9yYXRlOwotCi0gIC8vIFRoZW4gdHJ5IHRvIHN1bSB0aGUgYml0cmF0ZXMgaW5kaXZpZHVhbGx5IHBlciBzdHJlYW0uCi0gIGludCBiaXRyYXRlID0gMDsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmb3JtYXRfY29udGV4dC0+bmJfc3RyZWFtczsgKytpKSB7Ci0gICAgQVZDb2RlY0NvbnRleHQqIGNvZGVjX2NvbnRleHQgPSBmb3JtYXRfY29udGV4dC0+c3RyZWFtc1tpXS0+Y29kZWM7Ci0gICAgYml0cmF0ZSArPSBjb2RlY19jb250ZXh0LT5iaXRfcmF0ZTsKLSAgfQotICBpZiAoYml0cmF0ZSA+IDApCi0gICAgcmV0dXJuIGJpdHJhdGU7Ci0KLSAgLy8gU2VlIGlmIHdlIGNhbiBhcHByb3hpbWF0ZSB0aGUgYml0cmF0ZSBhcyBsb25nIGFzIHdlIGhhdmUgYSBmaWxlc2l6ZSBhbmQKLSAgLy8gdmFsaWQgZHVyYXRpb24uCi0gIGlmIChkdXJhdGlvbi5Jbk1pY3Jvc2Vjb25kcygpIDw9IDAgfHwKLSAgICAgIGR1cmF0aW9uID09IGtJbmZpbml0ZUR1cmF0aW9uKCkgfHwKLSAgICAgIGZpbGVzaXplX2luX2J5dGVzID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIERvIG1hdGggaW4gZmxvYXRpbmcgcG9pbnQgYXMgd2UnZCBvdmVyZmxvdyBhbiBpbnQ2NCBpZiB0aGUgZmlsZXNpemUgd2FzCi0gIC8vIGxhcmdlciB0aGFuIH4xMDczR0IuCi0gIGRvdWJsZSBieXRlcyA9IGZpbGVzaXplX2luX2J5dGVzOwotICBkb3VibGUgZHVyYXRpb25fdXMgPSBkdXJhdGlvbi5Jbk1pY3Jvc2Vjb25kcygpOwotICByZXR1cm4gYnl0ZXMgKiA4MDAwMDAwLjAgLyBkdXJhdGlvbl91czsKLX0KLQotdm9pZCBGRm1wZWdEZW11eGVyOjpPbk9wZW5Db250ZXh0RG9uZShjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBzdGF0dXNfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVzdWx0KSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBpZiAoIWJsb2NraW5nX3RocmVhZF8uSXNSdW5uaW5nKCkpIHsKLSAgICBzdGF0dXNfY2IuUnVuKFBJUEVMSU5FX0VSUk9SX0FCT1JUKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoIXJlc3VsdCkgewotICAgIHN0YXR1c19jYi5SdW4oREVNVVhFUl9FUlJPUl9DT1VMRF9OT1RfT1BFTik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gRnVsbHkgaW5pdGlhbGl6ZSBBVkZvcm1hdENvbnRleHQgYnkgcGFyc2luZyB0aGUgc3RyZWFtIGEgbGl0dGxlLgotICBiYXNlOjpQb3N0VGFza0FuZFJlcGx5V2l0aFJlc3VsdCgKLSAgICAgIGJsb2NraW5nX3RocmVhZF8ubWVzc2FnZV9sb29wX3Byb3h5KCksIEZST01fSEVSRSwKLSAgICAgIGJhc2U6OkJpbmQoJmF2Zm9ybWF0X2ZpbmRfc3RyZWFtX2luZm8sIGdsdWVfLT5mb3JtYXRfY29udGV4dCgpLAotICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBVkRpY3Rpb25hcnkqKj4oTlVMTCkpLAotICAgICAgYmFzZTo6QmluZCgmRkZtcGVnRGVtdXhlcjo6T25GaW5kU3RyZWFtSW5mb0RvbmUsIHRoaXMsIHN0YXR1c19jYikpOwotfQotCi12b2lkIEZGbXBlZ0RlbXV4ZXI6Ok9uRmluZFN0cmVhbUluZm9Eb25lKGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIHN0YXR1c19jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc3VsdCkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgaWYgKCFibG9ja2luZ190aHJlYWRfLklzUnVubmluZygpKSB7Ci0gICAgc3RhdHVzX2NiLlJ1bihQSVBFTElORV9FUlJPUl9BQk9SVCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHJlc3VsdCA8IDApIHsKLSAgICBzdGF0dXNfY2IuUnVuKERFTVVYRVJfRVJST1JfQ09VTERfTk9UX1BBUlNFKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBDcmVhdGUgZGVtdXhlciBzdHJlYW0gZW50cmllcyBmb3IgZWFjaCBwb3NzaWJsZSBBVlN0cmVhbS4KLSAgQVZGb3JtYXRDb250ZXh0KiBmb3JtYXRfY29udGV4dCA9IGdsdWVfLT5mb3JtYXRfY29udGV4dCgpOwotICBzdHJlYW1zXy5yZXNpemUoZm9ybWF0X2NvbnRleHQtPm5iX3N0cmVhbXMpOwotICBib29sIGZvdW5kX2F1ZGlvX3N0cmVhbSA9IGZhbHNlOwotICBib29sIGZvdW5kX3ZpZGVvX3N0cmVhbSA9IGZhbHNlOwotCi0gIGJhc2U6OlRpbWVEZWx0YSBtYXhfZHVyYXRpb247Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZm9ybWF0X2NvbnRleHQtPm5iX3N0cmVhbXM7ICsraSkgewotICAgIEFWQ29kZWNDb250ZXh0KiBjb2RlY19jb250ZXh0ID0gZm9ybWF0X2NvbnRleHQtPnN0cmVhbXNbaV0tPmNvZGVjOwotICAgIEFWTWVkaWFUeXBlIGNvZGVjX3R5cGUgPSBjb2RlY19jb250ZXh0LT5jb2RlY190eXBlOwotCi0gICAgaWYgKGNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7Ci0gICAgICBpZiAoZm91bmRfYXVkaW9fc3RyZWFtKQotICAgICAgICBjb250aW51ZTsKLSAgICAgIC8vIEVuc3VyZSB0aGUgY29kZWMgaXMgc3VwcG9ydGVkLgotICAgICAgaWYgKENvZGVjSURUb0F1ZGlvQ29kZWMoY29kZWNfY29udGV4dC0+Y29kZWNfaWQpID09IGtVbmtub3duQXVkaW9Db2RlYykKLSAgICAgICAgY29udGludWU7Ci0gICAgICBmb3VuZF9hdWRpb19zdHJlYW0gPSB0cnVlOwotICAgIH0gZWxzZSBpZiAoY29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKLSAgICAgIGlmIChmb3VuZF92aWRlb19zdHJlYW0pCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgLy8gRW5zdXJlIHRoZSBjb2RlYyBpcyBzdXBwb3J0ZWQuCi0gICAgICBpZiAoQ29kZWNJRFRvVmlkZW9Db2RlYyhjb2RlY19jb250ZXh0LT5jb2RlY19pZCkgPT0ga1Vua25vd25WaWRlb0NvZGVjKQotICAgICAgICBjb250aW51ZTsKLSAgICAgIGZvdW5kX3ZpZGVvX3N0cmVhbSA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIEFWU3RyZWFtKiBzdHJlYW0gPSBmb3JtYXRfY29udGV4dC0+c3RyZWFtc1tpXTsKLSAgICBzY29wZWRfcmVmcHRyPEZGbXBlZ0RlbXV4ZXJTdHJlYW0+IGRlbXV4ZXJfc3RyZWFtKAotICAgICAgICBuZXcgRkZtcGVnRGVtdXhlclN0cmVhbSh0aGlzLCBzdHJlYW0pKTsKLQotICAgIHN0cmVhbXNfW2ldID0gZGVtdXhlcl9zdHJlYW07Ci0gICAgbWF4X2R1cmF0aW9uID0gc3RkOjptYXgobWF4X2R1cmF0aW9uLCBkZW11eGVyX3N0cmVhbS0+ZHVyYXRpb24oKSk7Ci0KLSAgICBpZiAoc3RyZWFtLT5maXJzdF9kdHMgIT0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oQVZfTk9QVFNfVkFMVUUpKSB7Ci0gICAgICBjb25zdCBiYXNlOjpUaW1lRGVsdGEgZmlyc3RfZHRzID0gQ29udmVydEZyb21UaW1lQmFzZSgKLSAgICAgICAgICBzdHJlYW0tPnRpbWVfYmFzZSwgc3RyZWFtLT5maXJzdF9kdHMpOwotICAgICAgaWYgKHN0YXJ0X3RpbWVfID09IGtOb1RpbWVzdGFtcCgpIHx8IGZpcnN0X2R0cyA8IHN0YXJ0X3RpbWVfKQotICAgICAgICBzdGFydF90aW1lXyA9IGZpcnN0X2R0czsKLSAgICB9Ci0gIH0KLQotICBpZiAoIWZvdW5kX2F1ZGlvX3N0cmVhbSAmJiAhZm91bmRfdmlkZW9fc3RyZWFtKSB7Ci0gICAgc3RhdHVzX2NiLlJ1bihERU1VWEVSX0VSUk9SX05PX1NVUFBPUlRFRF9TVFJFQU1TKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoZm9ybWF0X2NvbnRleHQtPmR1cmF0aW9uICE9IHN0YXRpY19jYXN0PGludDY0X3Q+KEFWX05PUFRTX1ZBTFVFKSkgewotICAgIC8vIElmIHRoZXJlIGlzIGEgZHVyYXRpb24gdmFsdWUgaW4gdGhlIGNvbnRhaW5lciB1c2UgdGhhdCB0byBmaW5kIHRoZQotICAgIC8vIG1heGltdW0gYmV0d2VlbiBpdCBhbmQgdGhlIGR1cmF0aW9uIGZyb20gQS9WIHN0cmVhbXMuCi0gICAgY29uc3QgQVZSYXRpb25hbCBhdl90aW1lX2Jhc2UgPSB7MSwgQVZfVElNRV9CQVNFfTsKLSAgICBtYXhfZHVyYXRpb24gPQotICAgICAgICBzdGQ6Om1heChtYXhfZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgIENvbnZlcnRGcm9tVGltZUJhc2UoYXZfdGltZV9iYXNlLCBmb3JtYXRfY29udGV4dC0+ZHVyYXRpb24pKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBUaGUgZHVyYXRpb24gaXMgdW5rbm93biwgaW4gd2hpY2ggY2FzZSB0aGlzIGlzIGxpa2VseSBhIGxpdmUgc3RyZWFtLgotICAgIG1heF9kdXJhdGlvbiA9IGtJbmZpbml0ZUR1cmF0aW9uKCk7Ci0gIH0KLQotICAvLyBTb21lIGRlbXV4ZXJzLCBsaWtlIFdBViwgZG8gbm90IHB1dCB0aW1lc3RhbXBzIG9uIHRoZWlyIGZyYW1lcy4gV2UKLSAgLy8gYXNzdW1lIHRoZSB0aGUgc3RhcnQgdGltZSBpcyAwLgotICBpZiAoc3RhcnRfdGltZV8gPT0ga05vVGltZXN0YW1wKCkpCi0gICAgc3RhcnRfdGltZV8gPSBiYXNlOjpUaW1lRGVsdGEoKTsKLQotICAvLyBHb29kIHRvIGdvOiBzZXQgdGhlIGR1cmF0aW9uIGFuZCBiaXRyYXRlIGFuZCBub3RpZnkgd2UncmUgZG9uZQotICAvLyBpbml0aWFsaXppbmcuCi0gIGhvc3RfLT5TZXREdXJhdGlvbihtYXhfZHVyYXRpb24pOwotICBkdXJhdGlvbl9rbm93bl8gPSAobWF4X2R1cmF0aW9uICE9IGtJbmZpbml0ZUR1cmF0aW9uKCkpOwotCi0gIGludDY0IGZpbGVzaXplX2luX2J5dGVzID0gMDsKLSAgdXJsX3Byb3RvY29sXy5HZXRTaXplKCZmaWxlc2l6ZV9pbl9ieXRlcyk7Ci0gIGJpdHJhdGVfID0gQ2FsY3VsYXRlQml0cmF0ZShmb3JtYXRfY29udGV4dCwgbWF4X2R1cmF0aW9uLCBmaWxlc2l6ZV9pbl9ieXRlcyk7Ci0gIGlmIChiaXRyYXRlXyA+IDApCi0gICAgZGF0YV9zb3VyY2VfLT5TZXRCaXRyYXRlKGJpdHJhdGVfKTsKLQotICBzdGF0dXNfY2IuUnVuKFBJUEVMSU5FX09LKTsKLX0KLQotdm9pZCBGRm1wZWdEZW11eGVyOjpPblNlZWtGcmFtZURvbmUoY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgY2IsIGludCByZXN1bHQpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIENIRUNLKHBlbmRpbmdfc2Vla18pOwotICBwZW5kaW5nX3NlZWtfID0gZmFsc2U7Ci0KLSAgaWYgKCFibG9ja2luZ190aHJlYWRfLklzUnVubmluZygpKSB7Ci0gICAgY2IuUnVuKFBJUEVMSU5FX0VSUk9SX0FCT1JUKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAocmVzdWx0IDwgMCkgewotICAgIC8vIFVzZSBWTE9HKDEpIGluc3RlYWQgb2YgTk9USU1QTEVNRU5URUQoKSB0byBwcmV2ZW50IHRoZSBtZXNzYWdlIGJlaW5nCi0gICAgLy8gY2FwdHVyZWQgZnJvbSBzdGRvdXQgYW5kIGNvbnRhbWluYXRlcyB0ZXN0aW5nLgotICAgIC8vIFRPRE8oc2NoZXJrdXMpOiBJbXBsZW1lbnQgdGhpcyBwcm9wZXJseSBhbmQgc2lnbmFsIGVycm9yIChCVUc9MjM0NDcpLgotICAgIFZMT0coMSkgPDwgIk5vdCBpbXBsZW1lbnRlZCI7Ci0gIH0KLQotICAvLyBUZWxsIHN0cmVhbXMgdG8gZmx1c2ggYnVmZmVycyBkdWUgdG8gc2Vla2luZy4KLSAgU3RyZWFtVmVjdG9yOjppdGVyYXRvciBpdGVyOwotICBmb3IgKGl0ZXIgPSBzdHJlYW1zXy5iZWdpbigpOyBpdGVyICE9IHN0cmVhbXNfLmVuZCgpOyArK2l0ZXIpIHsKLSAgICBpZiAoKml0ZXIpCi0gICAgICAoKml0ZXIpLT5GbHVzaEJ1ZmZlcnMoKTsKLSAgfQotCi0gIC8vIFJlc3VtZSByZWFkaW5nIHVudGlsIGNhcGFjaXR5LgotICBSZWFkRnJhbWVJZk5lZWRlZCgpOwotCi0gIC8vIE5vdGlmeSB3ZSdyZSBmaW5pc2hlZCBzZWVraW5nLgotICBjYi5SdW4oUElQRUxJTkVfT0spOwotfQotCi12b2lkIEZGbXBlZ0RlbXV4ZXI6OlJlYWRGcmFtZUlmTmVlZGVkKCkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLQotICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSB3b3JrIHRvIGRvIGJlZm9yZSByZWFkaW5nLgotICBpZiAoIWJsb2NraW5nX3RocmVhZF8uSXNSdW5uaW5nKCkgfHwgIVN0cmVhbXNIYXZlQXZhaWxhYmxlQ2FwYWNpdHkoKSB8fAotICAgICAgcGVuZGluZ19yZWFkXyB8fCBwZW5kaW5nX3NlZWtfKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gQWxsb2NhdGUgYW5kIHJlYWQgYW4gQVZQYWNrZXQgZnJvbSB0aGUgbWVkaWEuIFNhdmUgfHBhY2tldF9wdHJ8IHNpbmNlCi0gIC8vIGV2YWx1YXRpb24gb3JkZXIgb2YgcGFja2V0LmdldCgpIGFuZCBiYXNlOjpQYXNzZWQoJnBhY2tldCkgaXMKLSAgLy8gdW5kZWZpbmVkLgotICBTY29wZWRBVlBhY2tldCBwYWNrZXQobmV3IEFWUGFja2V0KCkpOwotICBBVlBhY2tldCogcGFja2V0X3B0ciA9IHBhY2tldC5nZXQoKTsKLQotICBwZW5kaW5nX3JlYWRfID0gdHJ1ZTsKLSAgYmFzZTo6UG9zdFRhc2tBbmRSZXBseVdpdGhSZXN1bHQoCi0gICAgICBibG9ja2luZ190aHJlYWRfLm1lc3NhZ2VfbG9vcF9wcm94eSgpLCBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kKCZhdl9yZWFkX2ZyYW1lLCBnbHVlXy0+Zm9ybWF0X2NvbnRleHQoKSwgcGFja2V0X3B0ciksCi0gICAgICBiYXNlOjpCaW5kKCZGRm1wZWdEZW11eGVyOjpPblJlYWRGcmFtZURvbmUsIHRoaXMsIGJhc2U6OlBhc3NlZCgmcGFja2V0KSkpOwotfQotCi12b2lkIEZGbXBlZ0RlbXV4ZXI6Ok9uUmVhZEZyYW1lRG9uZShTY29wZWRBVlBhY2tldCBwYWNrZXQsIGludCByZXN1bHQpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIERDSEVDSyhwZW5kaW5nX3JlYWRfKTsKLSAgcGVuZGluZ19yZWFkXyA9IGZhbHNlOwotCi0gIGlmICghYmxvY2tpbmdfdGhyZWFkXy5Jc1J1bm5pbmcoKSB8fCBwZW5kaW5nX3NlZWtfKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHJlc3VsdCA8IDApIHsKLSAgICAvLyBVcGRhdGUgdGhlIGR1cmF0aW9uIGJhc2VkIG9uIHRoZSBhdWRpbyBzdHJlYW0gaWYKLSAgICAvLyBpdCB3YXMgcHJldmlvdXNseSB1bmtub3duIGh0dHA6Ly9jcmJ1Zy5jb20vODY4MzAKLSAgICBpZiAoIWR1cmF0aW9uX2tub3duXykgewotICAgICAgLy8gU2VhcmNoIHN0cmVhbXMgZm9yIEFVRElPIG9uZS4KLSAgICAgIGZvciAoU3RyZWFtVmVjdG9yOjppdGVyYXRvciBpdGVyID0gc3RyZWFtc18uYmVnaW4oKTsKLSAgICAgICAgICAgaXRlciAhPSBzdHJlYW1zXy5lbmQoKTsKLSAgICAgICAgICAgKytpdGVyKSB7Ci0gICAgICAgIGlmICgqaXRlciAmJiAoKml0ZXIpLT50eXBlKCkgPT0gRGVtdXhlclN0cmVhbTo6QVVESU8pIHsKLSAgICAgICAgICBiYXNlOjpUaW1lRGVsdGEgZHVyYXRpb24gPSAoKml0ZXIpLT5HZXRFbGFwc2VkVGltZSgpOwotICAgICAgICAgIGlmIChkdXJhdGlvbiAhPSBrTm9UaW1lc3RhbXAoKSAmJiBkdXJhdGlvbiA+IGJhc2U6OlRpbWVEZWx0YSgpKSB7Ci0gICAgICAgICAgICBob3N0Xy0+U2V0RHVyYXRpb24oZHVyYXRpb24pOwotICAgICAgICAgICAgZHVyYXRpb25fa25vd25fID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gSWYgd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2Ygc3RyZWFtLCB0ZWxsIHRoZSBkb3duc3RyZWFtIGZpbHRlcnMgYWJvdXQKLSAgICAvLyB0aGUgZXZlbnQuCi0gICAgU3RyZWFtSGFzRW5kZWQoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBRdWV1ZSB0aGUgcGFja2V0IHdpdGggdGhlIGFwcHJvcHJpYXRlIHN0cmVhbS4KLSAgRENIRUNLX0dFKHBhY2tldC0+c3RyZWFtX2luZGV4LCAwKTsKLSAgRENIRUNLX0xUKHBhY2tldC0+c3RyZWFtX2luZGV4LCBzdGF0aWNfY2FzdDxpbnQ+KHN0cmVhbXNfLnNpemUoKSkpOwotCi0gIC8vIERlZmVuZCBhZ2FpbnN0IGZmbXBlZyBnaXZpbmcgdXMgYSBiYWQgc3RyZWFtIGluZGV4LgotICBpZiAocGFja2V0LT5zdHJlYW1faW5kZXggPj0gMCAmJgotICAgICAgcGFja2V0LT5zdHJlYW1faW5kZXggPCBzdGF0aWNfY2FzdDxpbnQ+KHN0cmVhbXNfLnNpemUoKSkgJiYKLSAgICAgIHN0cmVhbXNfW3BhY2tldC0+c3RyZWFtX2luZGV4XSAmJgotICAgICAgKCFhdWRpb19kaXNhYmxlZF8gfHwKLSAgICAgICBzdHJlYW1zX1twYWNrZXQtPnN0cmVhbV9pbmRleF0tPnR5cGUoKSAhPSBEZW11eGVyU3RyZWFtOjpBVURJTykpIHsKLQotICAgIC8vIFRPRE8oc2NoZXJrdXMpOiBGaXggZGVtdXhpbmcgdXBzdHJlYW0gdG8gbmV2ZXIgcmV0dXJuIHBhY2tldHMgdy9vIGRhdGEKLSAgICAvLyB3aGVuIGF2X3JlYWRfZnJhbWUoKSByZXR1cm5zIHN1Y2Nlc3MgY29kZS4gU2VlIGJ1ZyBjb21tZW50IGZvciBpZGVhczoKLSAgICAvLwotICAgIC8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0xNjkxMzMjYzEwCi0gICAgaWYgKCFwYWNrZXQtPmRhdGEpIHsKLSAgICAgIFNjb3BlZEFWUGFja2V0IG5ld19wYWNrZXQobmV3IEFWUGFja2V0KCkpOwotICAgICAgYXZfbmV3X3BhY2tldChuZXdfcGFja2V0LmdldCgpLCAwKTsKLQotICAgICAgbmV3X3BhY2tldC0+cHRzID0gcGFja2V0LT5wdHM7Ci0gICAgICBuZXdfcGFja2V0LT5kdHMgPSBwYWNrZXQtPmR0czsKLSAgICAgIG5ld19wYWNrZXQtPnBvcyA9IHBhY2tldC0+cG9zOwotICAgICAgbmV3X3BhY2tldC0+ZHVyYXRpb24gPSBwYWNrZXQtPmR1cmF0aW9uOwotICAgICAgbmV3X3BhY2tldC0+Y29udmVyZ2VuY2VfZHVyYXRpb24gPSBwYWNrZXQtPmNvbnZlcmdlbmNlX2R1cmF0aW9uOwotICAgICAgbmV3X3BhY2tldC0+ZmxhZ3MgPSBwYWNrZXQtPmZsYWdzOwotICAgICAgbmV3X3BhY2tldC0+c3RyZWFtX2luZGV4ID0gcGFja2V0LT5zdHJlYW1faW5kZXg7Ci0KLSAgICAgIHBhY2tldC5zd2FwKG5ld19wYWNrZXQpOwotICAgIH0KLQotICAgIEZGbXBlZ0RlbXV4ZXJTdHJlYW0qIGRlbXV4ZXJfc3RyZWFtID0gc3RyZWFtc19bcGFja2V0LT5zdHJlYW1faW5kZXhdOwotICAgIGRlbXV4ZXJfc3RyZWFtLT5FbnF1ZXVlUGFja2V0KHBhY2tldC5QYXNzKCkpOwotICB9Ci0KLSAgLy8gS2VlcCByZWFkaW5nIHVudGlsIHdlJ3ZlIHJlYWNoZWQgY2FwYWNpdHkuCi0gIFJlYWRGcmFtZUlmTmVlZGVkKCk7Ci19Ci0KLXZvaWQgRkZtcGVnRGVtdXhlcjo6T25EYXRhU291cmNlU3RvcHBlZChjb25zdCBiYXNlOjpDbG9zdXJlJiBjYWxsYmFjaykgewotICAvLyBUaGlzIHdpbGwgYmxvY2sgdW50aWwgYWxsIHRhc2tzIGNvbXBsZXRlLiBOb3RlIHRoYXQgYWZ0ZXIgdGhpcyByZXR1cm5zIGl0J3MKLSAgLy8gcG9zc2libGUgZm9yIHJlcGx5IHRhc2tzIChlLmcuLCBPblJlYWRGcmFtZURvbmUoKSkgdG8gYmUgcXVldWVkIG9uIHRoaXMKLSAgLy8gdGhyZWFkLiBFYWNoIG9mIHRoZSByZXBseSB0YXNrIG1ldGhvZHMgbXVzdCBjaGVjayB3aGV0aGVyIHdlJ3ZlIHN0b3BwZWQgdGhlCi0gIC8vIHRocmVhZCBhbmQgZHJvcCB0aGVpciByZXN1bHRzIG9uIHRoZSBmbG9vci4KLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIGJsb2NraW5nX3RocmVhZF8uU3RvcCgpOwotCi0gIFN0cmVhbVZlY3Rvcjo6aXRlcmF0b3IgaXRlcjsKLSAgZm9yIChpdGVyID0gc3RyZWFtc18uYmVnaW4oKTsgaXRlciAhPSBzdHJlYW1zXy5lbmQoKTsgKytpdGVyKSB7Ci0gICAgaWYgKCppdGVyKQotICAgICAgKCppdGVyKS0+U3RvcCgpOwotICB9Ci0KLSAgY2FsbGJhY2suUnVuKCk7Ci19Ci0KLWJvb2wgRkZtcGVnRGVtdXhlcjo6U3RyZWFtc0hhdmVBdmFpbGFibGVDYXBhY2l0eSgpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIFN0cmVhbVZlY3Rvcjo6aXRlcmF0b3IgaXRlcjsKLSAgZm9yIChpdGVyID0gc3RyZWFtc18uYmVnaW4oKTsgaXRlciAhPSBzdHJlYW1zXy5lbmQoKTsgKytpdGVyKSB7Ci0gICAgaWYgKCppdGVyICYmICgqaXRlciktPkhhc0F2YWlsYWJsZUNhcGFjaXR5KCkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgRkZtcGVnRGVtdXhlcjo6U3RyZWFtSGFzRW5kZWQoKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBTdHJlYW1WZWN0b3I6Oml0ZXJhdG9yIGl0ZXI7Ci0gIGZvciAoaXRlciA9IHN0cmVhbXNfLmJlZ2luKCk7IGl0ZXIgIT0gc3RyZWFtc18uZW5kKCk7ICsraXRlcikgewotICAgIGlmICghKml0ZXIgfHwKLSAgICAgICAgKGF1ZGlvX2Rpc2FibGVkXyAmJiAoKml0ZXIpLT50eXBlKCkgPT0gRGVtdXhlclN0cmVhbTo6QVVESU8pKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgKCppdGVyKS0+U2V0RW5kT2ZTdHJlYW0oKTsKLSAgfQotfQotCi12b2lkIEZGbXBlZ0RlbXV4ZXI6Ok5vdGlmeUNhcGFjaXR5QXZhaWxhYmxlKCkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgUmVhZEZyYW1lSWZOZWVkZWQoKTsKLX0KLQotdm9pZCBGRm1wZWdEZW11eGVyOjpOb3RpZnlCdWZmZXJpbmdDaGFuZ2VkKCkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgUmFuZ2VzPGJhc2U6OlRpbWVEZWx0YT4gYnVmZmVyZWQ7Ci0gIHNjb3BlZF9yZWZwdHI8RkZtcGVnRGVtdXhlclN0cmVhbT4gYXVkaW8gPQotICAgICAgYXVkaW9fZGlzYWJsZWRfID8gTlVMTCA6IEdldEZGbXBlZ1N0cmVhbShEZW11eGVyU3RyZWFtOjpBVURJTyk7Ci0gIHNjb3BlZF9yZWZwdHI8RkZtcGVnRGVtdXhlclN0cmVhbT4gdmlkZW8gPQotICAgICAgR2V0RkZtcGVnU3RyZWFtKERlbXV4ZXJTdHJlYW06OlZJREVPKTsKLSAgaWYgKGF1ZGlvICYmIHZpZGVvKSB7Ci0gICAgYnVmZmVyZWQgPSBhdWRpby0+R2V0QnVmZmVyZWRSYW5nZXMoKS5JbnRlcnNlY3Rpb25XaXRoKAotICAgICAgICB2aWRlby0+R2V0QnVmZmVyZWRSYW5nZXMoKSk7Ci0gIH0gZWxzZSBpZiAoYXVkaW8pIHsKLSAgICBidWZmZXJlZCA9IGF1ZGlvLT5HZXRCdWZmZXJlZFJhbmdlcygpOwotICB9IGVsc2UgaWYgKHZpZGVvKSB7Ci0gICAgYnVmZmVyZWQgPSB2aWRlby0+R2V0QnVmZmVyZWRSYW5nZXMoKTsKLSAgfQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZmZlcmVkLnNpemUoKTsgKytpKQotICAgIGhvc3RfLT5BZGRCdWZmZXJlZFRpbWVSYW5nZShidWZmZXJlZC5zdGFydChpKSwgYnVmZmVyZWQuZW5kKGkpKTsKLX0KLQotdm9pZCBGRm1wZWdEZW11eGVyOjpPbkRhdGFTb3VyY2VFcnJvcigpIHsKLSAgaG9zdF8tPk9uRGVtdXhlckVycm9yKFBJUEVMSU5FX0VSUk9SX1JFQUQpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL2ZmbXBlZ19kZW11eGVyLmggYi9zcmMvbWVkaWEvZmlsdGVycy9mZm1wZWdfZGVtdXhlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDU2ZDA3Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL2ZmbXBlZ19kZW11eGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gSW1wbGVtZW50cyB0aGUgRGVtdXhlciBpbnRlcmZhY2UgdXNpbmcgRkZtcGVnJ3MgbGliYXZmb3JtYXQuICBBdCB0aGlzIHRpbWUKLS8vIHdpbGwgc3VwcG9ydCBkZW11eGluZyBhbnkgYXVkaW8vdmlkZW8gZm9ybWF0IHRocm93biBhdCBpdC4gIFRoZSBzdHJlYW1zCi0vLyBvdXRwdXQgbWltZSB0eXBlcyBhdWRpby94LWZmbXBlZyBhbmQgdmlkZW8veC1mZm1wZWcgYW5kIGluY2x1ZGUgYW4gaW50ZWdlcgotLy8ga2V5IEZGbXBlZ0NvZGVjSUQgd2hpY2ggY29udGFpbnMgdGhlIENvZGVjSUQgZW51bWVyYXRpb24gdmFsdWUuICBUaGUgQ29kZWNJRHMKLS8vIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgY29ycmVzcG9uZGluZyBGRm1wZWcgZGVjb2Rlci4KLS8vCi0vLyBGRm1wZWdEZW11eGVyIHNldHMgdGhlIGR1cmF0aW9uIG9mIHBpcGVsaW5lIGR1cmluZyBpbml0aWFsaXphdGlvbiBieSB1c2luZwotLy8gdGhlIGR1cmF0aW9uIG9mIHRoZSBsb25nZXN0IGF1ZGlvL3ZpZGVvIHN0cmVhbS4KLS8vCi0vLyBOT1RFOiBzaW5jZSBGRm1wZWdEZW11eGVyIHJlYWRzIHBhY2tldHMgc2VxdWVudGlhbGx5IHdpdGhvdXQgc2Vla2luZywgbWVkaWEKLS8vIGZpbGVzIHdpdGggdmVyeSBsYXJnZSBkcmlmdCBiZXR3ZWVuIGF1ZGlvL3ZpZGVvIHN0cmVhbXMgbWF5IHJlc3VsdCBpbgotLy8gZXhjZXNzaXZlIG1lbW9yeSBjb25zdW1wdGlvbi4KLS8vCi0vLyBXaGVuIHN0b3BwZWQsIEZGbXBlZ0RlbXV4ZXIgYW5kIEZGbXBlZ0RlbXV4ZXJTdHJlYW0gcmVsZWFzZSBhbGwgY2FsbGJhY2tzCi0vLyBhbmQgYnVmZmVyZWQgcGFja2V0cy4gIFJlYWRzIGZyb20gYSBzdG9wcGVkIEZGbXBlZ0RlbXV4ZXJTdHJlYW0gd2lsbCBub3QgYmUKLS8vIHJlcGxpZWQgdG8uCi0KLSNpZm5kZWYgTUVESUFfRklMVEVSU19GRk1QRUdfREVNVVhFUl9IXwotI2RlZmluZSBNRURJQV9GSUxURVJTX0ZGTVBFR19ERU1VWEVSX0hfCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiYmFzZS9ndGVzdF9wcm9kX3V0aWwuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXJfcXVldWUuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlbXV4ZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3BpcGVsaW5lLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb19kZWNvZGVyX2NvbmZpZy5oIgotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvYmxvY2tpbmdfdXJsX3Byb3RvY29sLmgiCi0KLS8vIEZGbXBlZyBmb3J3YXJkIGRlY2xhcmF0aW9ucy4KLXN0cnVjdCBBVlBhY2tldDsKLXN0cnVjdCBBVlJhdGlvbmFsOwotc3RydWN0IEFWU3RyZWFtOwotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBGRm1wZWdEZW11eGVyOwotY2xhc3MgRkZtcGVnR2x1ZTsKLWNsYXNzIEZGbXBlZ0gyNjRUb0FubmV4QkJpdHN0cmVhbUNvbnZlcnRlcjsKLWNsYXNzIFNjb3BlZFB0ckFWRnJlZVBhY2tldDsKLQotdHlwZWRlZiBzY29wZWRfcHRyX21hbGxvYzxBVlBhY2tldCwgU2NvcGVkUHRyQVZGcmVlUGFja2V0PiBTY29wZWRBVlBhY2tldDsKLQotY2xhc3MgRkZtcGVnRGVtdXhlclN0cmVhbSA6IHB1YmxpYyBEZW11eGVyU3RyZWFtIHsKLSBwdWJsaWM6Ci0gIC8vIEtlZXBzIGEgY29weSBvZiB8ZGVtdXhlcnwgYW5kIGluaXRpYWxpemVzIGl0c2VsZiB1c2luZyBpbmZvcm1hdGlvbgotICAvLyBpbnNpZGUgfHN0cmVhbXwuICBCb3RoIHBhcmFtZXRlcnMgbXVzdCBvdXRsaXZlIHx0aGlzfC4KLSAgRkZtcGVnRGVtdXhlclN0cmVhbShGRm1wZWdEZW11eGVyKiBkZW11eGVyLCBBVlN0cmVhbSogc3RyZWFtKTsKLQotICAvLyBFbnF1ZXVlcyB0aGUgZ2l2ZW4gQVZQYWNrZXQuIEl0IGlzIGludmFsaWQgdG8gcXVldWUgYSB8cGFja2V0fCBhZnRlcgotICAvLyBTZXRFbmRPZlN0cmVhbSgpIGhhcyBiZWVuIGNhbGxlZC4KLSAgdm9pZCBFbnF1ZXVlUGFja2V0KFNjb3BlZEFWUGFja2V0IHBhY2tldCk7Ci0KLSAgLy8gRW50ZXJzIHRoZSBlbmQgb2Ygc3RyZWFtIHN0YXRlLiBBZnRlciBkZWxpdmVyaW5nIHJlbWFpbmluZyBxdWV1ZWQgYnVmZmVycwotICAvLyBvbmx5IGVuZCBvZiBzdHJlYW0gYnVmZmVycyB3aWxsIGJlIGRlbGl2ZXJlZC4KLSAgdm9pZCBTZXRFbmRPZlN0cmVhbSgpOwotCi0gIC8vIERyb3BzIHF1ZXVlZCBidWZmZXJzIGFuZCBjbGVhcnMgZW5kIG9mIHN0cmVhbSBzdGF0ZS4KLSAgdm9pZCBGbHVzaEJ1ZmZlcnMoKTsKLQotICAvLyBFbXB0aWVzIHRoZSBxdWV1ZXMgYW5kIGlnbm9yZXMgYW55IGFkZGl0aW9uYWwgY2FsbHMgdG8gUmVhZCgpLgotICB2b2lkIFN0b3AoKTsKLQotICAvLyBSZXR1cm5zIHRoZSBkdXJhdGlvbiBvZiB0aGlzIHN0cmVhbS4KLSAgYmFzZTo6VGltZURlbHRhIGR1cmF0aW9uKCk7Ci0KLSAgLy8gRGVtdXhlclN0cmVhbSBpbXBsZW1lbnRhdGlvbi4KLSAgdmlydHVhbCBUeXBlIHR5cGUoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFJlYWQoY29uc3QgUmVhZENCJiByZWFkX2NiKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIEVuYWJsZUJpdHN0cmVhbUNvbnZlcnRlcigpIE9WRVJSSURFOwotICB2aXJ0dWFsIGNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYgYXVkaW9fZGVjb2Rlcl9jb25maWcoKSBPVkVSUklERTsKLSAgdmlydHVhbCBjb25zdCBWaWRlb0RlY29kZXJDb25maWcmIHZpZGVvX2RlY29kZXJfY29uZmlnKCkgT1ZFUlJJREU7Ci0KLSAgLy8gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgYnVmZmVyZWQgZGF0YSBpbiB0aGlzIHN0cmVhbS4KLSAgUmFuZ2VzPGJhc2U6OlRpbWVEZWx0YT4gR2V0QnVmZmVyZWRSYW5nZXMoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIGVsYXBzZWQgdGltZSBiYXNlZCBvbiB0aGUgYWxyZWFkeSBxdWV1ZWQgcGFja2V0cy4KLSAgLy8gVXNlZCB0byBkZXRlcm1pbmUgc3RyZWFtIGR1cmF0aW9uIHdoZW4gaXQncyBub3Qga25vd24gYWhlYWQgb2YgdGltZS4KLSAgYmFzZTo6VGltZURlbHRhIEdldEVsYXBzZWRUaW1lKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgc3RyZWFtIGhhcyBjYXBhY2l0eSBmb3IgYWRkaXRpb25hbCBkYXRhLgotICBib29sIEhhc0F2YWlsYWJsZUNhcGFjaXR5KCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgfkZGbXBlZ0RlbXV4ZXJTdHJlYW0oKTsKLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBGRm1wZWdEZW11eGVyVGVzdDsKLQotICAvLyBSdW5zIHxyZWFkX2NiX3wgaWYgcHJlc2VudCB3aXRoIHRoZSBmcm9udCBvZiB8YnVmZmVyX3F1ZXVlX3wsIGNhbGxpbmcKLSAgLy8gTm90aWZ5Q2FwYWNpdHlBdmFpbGFibGUoKSBpZiBjYXBhY2l0eSBpcyBzdGlsbCBhdmFpbGFibGUuCi0gIHZvaWQgU2F0aXNmeVBlbmRpbmdSZWFkKCk7Ci0KLSAgLy8gQ29udmVydHMgYW4gRkZtcGVnIHN0cmVhbSB0aW1lc3RhbXAgaW50byBhIGJhc2U6OlRpbWVEZWx0YS4KLSAgc3RhdGljIGJhc2U6OlRpbWVEZWx0YSBDb252ZXJ0U3RyZWFtVGltZXN0YW1wKGNvbnN0IEFWUmF0aW9uYWwmIHRpbWVfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0IHRpbWVzdGFtcCk7Ci0KLSAgRkZtcGVnRGVtdXhlciogZGVtdXhlcl87Ci0gIHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4gbWVzc2FnZV9sb29wXzsKLSAgQVZTdHJlYW0qIHN0cmVhbV87Ci0gIEF1ZGlvRGVjb2RlckNvbmZpZyBhdWRpb19jb25maWdfOwotICBWaWRlb0RlY29kZXJDb25maWcgdmlkZW9fY29uZmlnXzsKLSAgVHlwZSB0eXBlXzsKLSAgYmFzZTo6VGltZURlbHRhIGR1cmF0aW9uXzsKLSAgYm9vbCBzdG9wcGVkXzsKLSAgYm9vbCBlbmRfb2Zfc3RyZWFtXzsKLSAgYmFzZTo6VGltZURlbHRhIGxhc3RfcGFja2V0X3RpbWVzdGFtcF87Ci0gIFJhbmdlczxiYXNlOjpUaW1lRGVsdGE+IGJ1ZmZlcmVkX3Jhbmdlc187Ci0KLSAgRGVjb2RlckJ1ZmZlclF1ZXVlIGJ1ZmZlcl9xdWV1ZV87Ci0gIFJlYWRDQiByZWFkX2NiXzsKLQotICBzY29wZWRfcHRyPEZGbXBlZ0gyNjRUb0FubmV4QkJpdHN0cmVhbUNvbnZlcnRlcj4gYml0c3RyZWFtX2NvbnZlcnRlcl87Ci0gIGJvb2wgYml0c3RyZWFtX2NvbnZlcnRlcl9lbmFibGVkXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRkZtcGVnRGVtdXhlclN0cmVhbSk7Ci19OwotCi1jbGFzcyBNRURJQV9FWFBPUlQgRkZtcGVnRGVtdXhlciA6IHB1YmxpYyBEZW11eGVyIHsKLSBwdWJsaWM6Ci0gIEZGbXBlZ0RlbXV4ZXIoY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbWVzc2FnZV9sb29wLAotICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGF0YVNvdXJjZT4mIGRhdGFfc291cmNlKTsKLQotICAvLyBEZW11eGVyIGltcGxlbWVudGF0aW9uLgotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShEZW11eGVySG9zdCogaG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc3RhdHVzX2NiKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0b3AoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU2VlayhiYXNlOjpUaW1lRGVsdGEgdGltZSwgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgY2IpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgT25BdWRpb1JlbmRlcmVyRGlzYWJsZWQoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFNldFBsYXliYWNrUmF0ZShmbG9hdCBwbGF5YmFja19yYXRlKSBPVkVSUklERTsKLSAgdmlydHVhbCBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IEdldFN0cmVhbSgKLSAgICAgIERlbXV4ZXJTdHJlYW06OlR5cGUgdHlwZSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgYmFzZTo6VGltZURlbHRhIEdldFN0YXJ0VGltZSgpIGNvbnN0IE9WRVJSSURFOwotCi0gIC8vIEFsbG93IEZGbXBlZ0RlbXV4ZXJTdHJlYW0gdG8gbm90aWZ5IHVzIHdoZW4gdGhlcmUgaXMgdXBkYXRlZCBpbmZvcm1hdGlvbgotICAvLyBhYm91dCBjYXBhY2l0eSBhbmQgd2hhdCBidWZmZXJlZCBkYXRhIGlzIGF2YWlsYWJsZS4KLSAgdm9pZCBOb3RpZnlDYXBhY2l0eUF2YWlsYWJsZSgpOwotICB2b2lkIE5vdGlmeUJ1ZmZlcmluZ0NoYW5nZWQoKTsKLQotIHByaXZhdGU6Ci0gIC8vIFRvIGFsbG93IHRlc3RzIGFjY2VzcyB0byBwcml2YXRlcy4KLSAgZnJpZW5kIGNsYXNzIEZGbXBlZ0RlbXV4ZXJUZXN0OwotCi0gIHZpcnR1YWwgfkZGbXBlZ0RlbXV4ZXIoKTsKLQotICAvLyBGRm1wZWcgY2FsbGJhY2tzIGR1cmluZyBpbml0aWFsaXphdGlvbi4KLSAgdm9pZCBPbk9wZW5Db250ZXh0RG9uZShjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBzdGF0dXNfY2IsIGJvb2wgcmVzdWx0KTsKLSAgdm9pZCBPbkZpbmRTdHJlYW1JbmZvRG9uZShjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBzdGF0dXNfY2IsIGludCByZXN1bHQpOwotCi0gIC8vIEZGbXBlZyBjYWxsYmFja3MgZHVyaW5nIHNlZWtpbmcuCi0gIHZvaWQgT25TZWVrRnJhbWVEb25lKGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGNiLCBpbnQgcmVzdWx0KTsKLQotICAvLyBGRm1wZWcgY2FsbGJhY2tzIGR1cmluZyByZWFkaW5nICsgaGVscGVyIG1ldGhvZCB0byBpbml0aWF0ZSByZWFkcy4KLSAgdm9pZCBSZWFkRnJhbWVJZk5lZWRlZCgpOwotICB2b2lkIE9uUmVhZEZyYW1lRG9uZShTY29wZWRBVlBhY2tldCBwYWNrZXQsIGludCByZXN1bHQpOwotCi0gIC8vIERhdGFTb3VyY2UgY2FsbGJhY2tzIGR1cmluZyBzdG9wcGluZy4KLSAgdm9pZCBPbkRhdGFTb3VyY2VTdG9wcGVkKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKTsKLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIGFueSBzdHJlYW0gaGFzIGFkZGl0aW9uYWwgY2FwYWNpdHkuIE5vdGUgdGhhdCBzdHJlYW1zIGNhbgotICAvLyBnbyBvdmVyIGNhcGFjaXR5IGRlcGVuZGluZyBvbiBob3cgdGhlIGZpbGUgaXMgbXV4ZWQuCi0gIGJvb2wgU3RyZWFtc0hhdmVBdmFpbGFibGVDYXBhY2l0eSgpOwotCi0gIC8vIFNpZ25hbCBhbGwgRkZtcGVnRGVtdXhlclN0cmVhbXMgdGhhdCB0aGUgc3RyZWFtIGhhcyBlbmRlZC4KLSAgdm9pZCBTdHJlYW1IYXNFbmRlZCgpOwotCi0gIC8vIENhbGxlZCBieSB8dXJsX3Byb3RvY29sX3wgd2hlbmV2ZXIgfGRhdGFfc291cmNlX3wgcmV0dXJucyBhIHJlYWQgZXJyb3IuCi0gIHZvaWQgT25EYXRhU291cmNlRXJyb3IoKTsKLQotICAvLyBSZXR1cm5zIHRoZSBzdHJlYW0gZnJvbSB8c3RyZWFtc198IHRoYXQgbWF0Y2hlcyB8dHlwZXwgYXMgYW4KLSAgLy8gRkZtcGVnRGVtdXhlclN0cmVhbS4KLSAgc2NvcGVkX3JlZnB0cjxGRm1wZWdEZW11eGVyU3RyZWFtPiBHZXRGRm1wZWdTdHJlYW0oCi0gICAgICBEZW11eGVyU3RyZWFtOjpUeXBlIHR5cGUpIGNvbnN0OwotCi0gIERlbXV4ZXJIb3N0KiBob3N0XzsKLQotICBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+IG1lc3NhZ2VfbG9vcF87Ci0KLSAgLy8gVGhyZWFkIG9uIHdoaWNoIGFsbCBibG9ja2luZyBGRm1wZWcgb3BlcmF0aW9ucyBhcmUgZXhlY3V0ZWQuCi0gIGJhc2U6OlRocmVhZCBibG9ja2luZ190aHJlYWRfOwotCi0gIC8vIFRyYWNrcyBpZiB0aGVyZSdzIGFuIG91dHN0YW5kaW5nIGF2X3JlYWRfZnJhbWUoKSBvcGVyYXRpb24uCi0gIC8vCi0gIC8vIFRPRE8oc2NoZXJrdXMpOiBBbGxvdyBtb3JlIHRoYW4gb25lIHJlYWQgaW4gZmxpZ2h0IGZvciBoaWdoZXIgcmVhZAotICAvLyB0aHJvdWdocHV0IHVzaW5nIGRlbXV4ZXJfYmVuY2ggdG8gdmVyaWZ5IGltcHJvdmVtZW50cy4KLSAgYm9vbCBwZW5kaW5nX3JlYWRfOwotCi0gIC8vIFRyYWNrcyBpZiB0aGVyZSdzIGFuIG91dHN0YW5kaW5nIGF2X3NlZWtfZnJhbWUoKSBvcGVyYXRpb24uIFVzZWQgdG8gZGlzY2FyZAotICAvLyByZXN1bHRzIG9mIHByZS1zZWVrIGF2X3JlYWRfZnJhbWUoKSBvcGVyYXRpb25zLgotICBib29sIHBlbmRpbmdfc2Vla187Ci0KLSAgLy8gfHN0cmVhbXNffCBtaXJyb3JzIHRoZSBBVlN0cmVhbSBhcnJheSBpbiB8Zm9ybWF0X2NvbnRleHRffC4gSXQgY29udGFpbnMKLSAgLy8gRkZtcGVnRGVtdXhlclN0cmVhbXMgZW5jYXBzbHVhdGluZyBBVlN0cmVhbSBvYmplY3RzIGF0IHRoZSBzYW1lIGluZGV4LgotICAvLwotICAvLyBTaW5jZSB3ZSBvbmx5IHN1cHBvcnQgYSBzaW5nbGUgYXVkaW8gYW5kIHZpZGVvIHN0cmVhbSwgfHN0cmVhbXNffCB3aWxsCi0gIC8vIGNvbnRhaW4gTlVMTCBlbnRyaWVzIGZvciBhZGRpdGlvbmFsIGF1ZGlvL3ZpZGVvIHN0cmVhbXMgYXMgd2VsbCBhcyBmb3IKLSAgLy8gc3RyZWFtIHR5cGVzIHRoYXQgd2UgZG8gbm90IGN1cnJlbnRseSBzdXBwb3J0LgotICAvLwotICAvLyBPbmNlIGluaXRpYWxpemVkLCBvcGVyYXRpb25zIG9uIEZGbXBlZ0RlbXV4ZXJTdHJlYW1zIHNob3VsZCBiZSBjYXJyaWVkIG91dAotICAvLyBvbiB0aGUgZGVtdXhlciB0aHJlYWQuCi0gIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c2NvcGVkX3JlZnB0cjxGRm1wZWdEZW11eGVyU3RyZWFtPiA+IFN0cmVhbVZlY3RvcjsKLSAgU3RyZWFtVmVjdG9yIHN0cmVhbXNfOwotCi0gIC8vIFJlZmVyZW5jZSB0byB0aGUgZGF0YSBzb3VyY2UuIEFzeW5jaHJvbm91cyByZWFkIHJlcXVlc3RzIGFyZSBzdWJtaXR0ZWQgdG8KLSAgLy8gdGhpcyBvYmplY3QuCi0gIHNjb3BlZF9yZWZwdHI8RGF0YVNvdXJjZT4gZGF0YV9zb3VyY2VfOwotCi0gIC8vIERlcml2ZWQgYml0cmF0ZSBhZnRlciBpbml0aWFsaXphdGlvbiBoYXMgY29tcGxldGVkLgotICBpbnQgYml0cmF0ZV87Ci0KLSAgLy8gVGhlIGZpcnN0IHRpbWVzdGFtcCBvZiB0aGUgb3BlbmVkIG1lZGlhIGZpbGUuIFRoaXMgaXMgdXNlZCB0byBzZXQgdGhlCi0gIC8vIHN0YXJ0aW5nIGNsb2NrIHZhbHVlIHRvIG1hdGNoIHRoZSB0aW1lc3RhbXBzIGluIHRoZSBtZWRpYSBmaWxlLiBEZWZhdWx0Ci0gIC8vIGlzIDAuCi0gIGJhc2U6OlRpbWVEZWx0YSBzdGFydF90aW1lXzsKLQotICAvLyBXaGV0aGVyIGF1ZGlvIGhhcyBiZWVuIGRpc2FibGVkIGZvciB0aGlzIGRlbXV4ZXIgKGluIHdoaWNoIGNhc2UgdGhpcyBjbGFzcwotICAvLyBkcm9wcyBwYWNrZXRzIGRlc3RpbmVkIGZvciBBVURJTyBkZW11eGVyIHN0cmVhbXMgb24gdGhlIGZsb29yKS4KLSAgYm9vbCBhdWRpb19kaXNhYmxlZF87Ci0KLSAgLy8gU2V0IGlmIHdlIGtub3cgZHVyYXRpb24gb2YgdGhlIGF1ZGlvIHN0cmVhbS4gVXNlZCB3aGVuIHByb2Nlc3NpbmcgZW5kIG9mCi0gIC8vIHN0cmVhbSAtLSBhdCB0aGlzIG1vbWVudCB3ZSBkZWZpbml0ZWx5IGtub3cgZHVyYXRpb24uCi0gIGJvb2wgZHVyYXRpb25fa25vd25fOwotCi0gIC8vIEZGbXBlZ1VSTFByb3RvY29sIGltcGxlbWVudGF0aW9uIGFuZCBjb3JyZXNwb25kaW5nIGdsdWUgYml0cy4KLSAgQmxvY2tpbmdVcmxQcm90b2NvbCB1cmxfcHJvdG9jb2xfOwotICBzY29wZWRfcHRyPEZGbXBlZ0dsdWU+IGdsdWVfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihGRm1wZWdEZW11eGVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0ZJTFRFUlNfRkZNUEVHX0RFTVVYRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL2ZmbXBlZ19kZW11eGVyX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2ZpbHRlcnMvZmZtcGVnX2RlbXV4ZXJfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYmNkMDAuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvZmZtcGVnX2RlbXV4ZXJfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MzEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxkZXF1ZT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2ZpbGVfcGF0aC5oIgotI2luY2x1ZGUgImJhc2UvZmlsZV91dGlsLmgiCi0jaW5jbHVkZSAiYmFzZS9wYXRoX3NlcnZpY2UuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21vY2tfZGVtdXhlcl9ob3N0LmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS90ZXN0X2hlbHBlcnMuaCIKLSNpbmNsdWRlICJtZWRpYS9mZm1wZWcvZmZtcGVnX2NvbW1vbi5oIgotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvZmZtcGVnX2RlbXV4ZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL2ZpbGVfZGF0YV9zb3VyY2UuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgOjp0ZXN0aW5nOjpBbnlOdW1iZXI7Ci11c2luZyA6OnRlc3Rpbmc6OkRvQWxsOwotdXNpbmcgOjp0ZXN0aW5nOjpJblNlcXVlbmNlOwotdXNpbmcgOjp0ZXN0aW5nOjpJbnZva2U7Ci11c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKLXVzaW5nIDo6dGVzdGluZzo6U2F2ZUFyZzsKLXVzaW5nIDo6dGVzdGluZzo6U2V0QXJnUG9pbnRlZTsKLXVzaW5nIDo6dGVzdGluZzo6U3RyaWN0TW9jazsKLXVzaW5nIDo6dGVzdGluZzo6V2l0aEFyZ3M7Ci11c2luZyA6OnRlc3Rpbmc6Ol87Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLU1BVENIRVIoSXNFbmRPZlN0cmVhbUJ1ZmZlciwKLSAgICAgICAgc3RkOjpzdHJpbmcobmVnYXRpb24gPyAiaXNuJ3QiIDogImlzIikgKyAiIGVuZCBvZiBzdHJlYW0iKSB7Ci0gIHJldHVybiBhcmctPklzRW5kT2ZTdHJlYW0oKTsKLX0KLQotc3RhdGljIHZvaWQgRW9zT25SZWFkRG9uZShib29sKiBnb3RfZW9zX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRGVtdXhlclN0cmVhbTo6U3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgYnVmZmVyKSB7Ci0gIE1lc3NhZ2VMb29wOjpjdXJyZW50KCktPlBvc3RUYXNrKAotICAgICAgRlJPTV9IRVJFLCBNZXNzYWdlTG9vcDo6UXVpdFdoZW5JZGxlQ2xvc3VyZSgpKTsKLQotICBFWFBFQ1RfRVEoc3RhdHVzLCBEZW11eGVyU3RyZWFtOjprT2spOwotICBpZiAoYnVmZmVyLT5Jc0VuZE9mU3RyZWFtKCkpIHsKLSAgICAqZ290X2Vvc19idWZmZXIgPSB0cnVlOwotICAgIEVYUEVDVF9UUlVFKCFidWZmZXItPkdldERhdGEoKSk7Ci0gICAgRVhQRUNUX0VRKGJ1ZmZlci0+R2V0RGF0YVNpemUoKSwgMCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRVhQRUNUX1RSVUUoYnVmZmVyLT5HZXREYXRhKCkpOwotICBFWFBFQ1RfR1QoYnVmZmVyLT5HZXREYXRhU2l6ZSgpLCAwKTsKLSAgKmdvdF9lb3NfYnVmZmVyID0gZmFsc2U7Ci19OwotCi0KLS8vIEZpeHR1cmUgY2xhc3MgdG8gZmFjaWxpdGF0ZSB3cml0aW5nIHRlc3RzLiAgVGFrZXMgY2FyZSBvZiBzZXR0aW5nIHVwIHRoZQotLy8gRkZtcGVnLCBwaXBlbGluZSBhbmQgZmlsdGVyIGhvc3QgbW9ja3MuCi1jbGFzcyBGRm1wZWdEZW11eGVyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIEZGbXBlZ0RlbXV4ZXJUZXN0KCkge30KLQotICB2aXJ0dWFsIH5GRm1wZWdEZW11eGVyVGVzdCgpIHsKLSAgICBpZiAoZGVtdXhlcl8pIHsKLSAgICAgIGRlbXV4ZXJfLT5TdG9wKE1lc3NhZ2VMb29wOjpRdWl0V2hlbklkbGVDbG9zdXJlKCkpOwotICAgICAgbWVzc2FnZV9sb29wXy5SdW4oKTsKLSAgICB9Ci0KLSAgICBkZW11eGVyXyA9IE5VTEw7Ci0gIH0KLQotICB2b2lkIENyZWF0ZURlbXV4ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKLSAgICBDSEVDSyghZGVtdXhlcl8pOwotCi0gICAgRVhQRUNUX0NBTEwoaG9zdF8sIFNldFRvdGFsQnl0ZXMoXykpLlRpbWVzKEFueU51bWJlcigpKTsKLSAgICBFWFBFQ1RfQ0FMTChob3N0XywgQWRkQnVmZmVyZWRCeXRlUmFuZ2UoXywgXykpLlRpbWVzKEFueU51bWJlcigpKTsKLSAgICBFWFBFQ1RfQ0FMTChob3N0XywgQWRkQnVmZmVyZWRUaW1lUmFuZ2UoXywgXykpLlRpbWVzKEFueU51bWJlcigpKTsKLQotICAgIENyZWF0ZURhdGFTb3VyY2UobmFtZSk7Ci0gICAgZGVtdXhlcl8gPSBuZXcgRkZtcGVnRGVtdXhlcihtZXNzYWdlX2xvb3BfLm1lc3NhZ2VfbG9vcF9wcm94eSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9zb3VyY2VfKTsKLSAgfQotCi0gIE1PQ0tfTUVUSE9EMShDaGVja1BvaW50LCB2b2lkKGludCB2KSk7Ci0KLSAgdm9pZCBJbml0aWFsaXplRGVtdXhlcigpIHsKLSAgICBFWFBFQ1RfQ0FMTChob3N0XywgU2V0RHVyYXRpb24oXykpOwotICAgIFdhaXRhYmxlTWVzc2FnZUxvb3BFdmVudCBldmVudDsKLSAgICBkZW11eGVyXy0+SW5pdGlhbGl6ZSgmaG9zdF8sIGV2ZW50LkdldFBpcGVsaW5lU3RhdHVzQ0IoKSk7Ci0gICAgZXZlbnQuUnVuQW5kV2FpdEZvclN0YXR1cyhQSVBFTElORV9PSyk7Ci0gIH0KLQotICBNT0NLX01FVEhPRDIoT25SZWFkRG9uZUNhbGxlZCwgdm9pZChpbnQsIGludDY0KSk7Ci0KLSAgLy8gVmVyaWZpZXMgdGhhdCB8YnVmZmVyfCBoYXMgYSBzcGVjaWZpYyB8c2l6ZXwgYW5kIHx0aW1lc3RhbXB8LgotICAvLyB8bG9jYXRpb258IHNpbXBseSBpbmRpY2F0ZXMgd2hlcmUgdGhlIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiB3YXMgbWFkZS4KLSAgLy8gVGhpcyBtYWtlcyBpdCBlYXNpZXIgdG8gdHJhY2sgZG93biB3aGVyZSB0ZXN0IGZhaWx1cmVzIG9jY3VyLgotICB2b2lkIE9uUmVhZERvbmUoY29uc3QgdHJhY2tlZF9vYmplY3RzOjpMb2NhdGlvbiYgbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgaW50NjQgdGltZXN0YW1wSW5NaWNyb3NlY29uZHMsCi0gICAgICAgICAgICAgICAgICBEZW11eGVyU3RyZWFtOjpTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgYnVmZmVyKSB7Ci0gICAgc3RkOjpzdHJpbmcgbG9jYXRpb25fc3RyOwotICAgIGxvY2F0aW9uLldyaXRlKHRydWUsIGZhbHNlLCAmbG9jYXRpb25fc3RyKTsKLSAgICBsb2NhdGlvbl9zdHIgKz0gIlxuIjsKLSAgICBTQ09QRURfVFJBQ0UobG9jYXRpb25fc3RyKTsKLSAgICBFWFBFQ1RfRVEoc3RhdHVzLCBEZW11eGVyU3RyZWFtOjprT2spOwotICAgIE9uUmVhZERvbmVDYWxsZWQoc2l6ZSwgdGltZXN0YW1wSW5NaWNyb3NlY29uZHMpOwotICAgIEVYUEVDVF9UUlVFKGJ1ZmZlci5nZXQoKSAhPSBOVUxMKTsKLSAgICBFWFBFQ1RfRVEoc2l6ZSwgYnVmZmVyLT5HZXREYXRhU2l6ZSgpKTsKLSAgICBFWFBFQ1RfRVEoYmFzZTo6VGltZURlbHRhOjpGcm9tTWljcm9zZWNvbmRzKHRpbWVzdGFtcEluTWljcm9zZWNvbmRzKSwKLSAgICAgICAgICAgICAgYnVmZmVyLT5HZXRUaW1lc3RhbXAoKSk7Ci0KLSAgICBEQ0hFQ0tfRVEoJm1lc3NhZ2VfbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotICAgIG1lc3NhZ2VfbG9vcF8uUG9zdFRhc2soRlJPTV9IRVJFLCBNZXNzYWdlTG9vcDo6UXVpdFdoZW5JZGxlQ2xvc3VyZSgpKTsKLSAgfQotCi0gIERlbXV4ZXJTdHJlYW06OlJlYWRDQiBOZXdSZWFkQ0IoY29uc3QgdHJhY2tlZF9vYmplY3RzOjpMb2NhdGlvbiYgbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsIGludDY0IHRpbWVzdGFtcEluTWljcm9zZWNvbmRzKSB7Ci0gICAgRVhQRUNUX0NBTEwoKnRoaXMsIE9uUmVhZERvbmVDYWxsZWQoc2l6ZSwgdGltZXN0YW1wSW5NaWNyb3NlY29uZHMpKTsKLSAgICByZXR1cm4gYmFzZTo6QmluZCgmRkZtcGVnRGVtdXhlclRlc3Q6Ok9uUmVhZERvbmUsIGJhc2U6OlVucmV0YWluZWQodGhpcyksCi0gICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sIHNpemUsIHRpbWVzdGFtcEluTWljcm9zZWNvbmRzKTsKLSAgfQotCi0gIC8vIEFjY2Vzc29yIHRvIGRlbXV4ZXIgaW50ZXJuYWxzLgotICB2b2lkIHNldF9kdXJhdGlvbl9rbm93bihib29sIGR1cmF0aW9uX2tub3duKSB7Ci0gICAgZGVtdXhlcl8tPmR1cmF0aW9uX2tub3duXyA9IGR1cmF0aW9uX2tub3duOwotICB9Ci0KLSAgYm9vbCBJc1N0cmVhbVN0b3BwZWQoRGVtdXhlclN0cmVhbTo6VHlwZSB0eXBlKSB7Ci0gICAgRGVtdXhlclN0cmVhbSogc3RyZWFtID0gZGVtdXhlcl8tPkdldFN0cmVhbSh0eXBlKTsKLSAgICBDSEVDSyhzdHJlYW0pOwotICAgIHJldHVybiBzdGF0aWNfY2FzdDxGRm1wZWdEZW11eGVyU3RyZWFtKj4oc3RyZWFtKS0+c3RvcHBlZF87Ci0gIH0KLQotICAvLyBGaXh0dXJlIG1lbWJlcnMuCi0gIHNjb3BlZF9yZWZwdHI8RmlsZURhdGFTb3VyY2U+IGRhdGFfc291cmNlXzsKLSAgc2NvcGVkX3JlZnB0cjxGRm1wZWdEZW11eGVyPiBkZW11eGVyXzsKLSAgU3RyaWN0TW9jazxNb2NrRGVtdXhlckhvc3Q+IGhvc3RfOwotICBNZXNzYWdlTG9vcCBtZXNzYWdlX2xvb3BfOwotCi0gIEFWRm9ybWF0Q29udGV4dCogZm9ybWF0X2NvbnRleHQoKSB7Ci0gICAgcmV0dXJuIGRlbXV4ZXJfLT5nbHVlXy0+Zm9ybWF0X2NvbnRleHQoKTsKLSAgfQotCi0gIHZvaWQgUmVhZFVudGlsRW5kT2ZTdHJlYW0oKSB7Ci0gICAgLy8gV2Ugc2hvdWxkIGV4cGVjdCBhbiBlbmQgb2Ygc3RyZWFtIGJ1ZmZlci4KLSAgICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IGF1ZGlvID0KLSAgICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpBVURJTyk7Ci0KLSAgICBib29sIGdvdF9lb3NfYnVmZmVyID0gZmFsc2U7Ci0gICAgY29uc3QgaW50IGtNYXhCdWZmZXJzID0gMTcwOwotICAgIGZvciAoaW50IGkgPSAwOyAhZ290X2Vvc19idWZmZXIgJiYgaSA8IGtNYXhCdWZmZXJzOyBpKyspIHsKLSAgICAgIGF1ZGlvLT5SZWFkKGJhc2U6OkJpbmQoJkVvc09uUmVhZERvbmUsICZnb3RfZW9zX2J1ZmZlcikpOwotICAgICAgbWVzc2FnZV9sb29wXy5SdW4oKTsKLSAgICB9Ci0KLSAgICBFWFBFQ1RfVFJVRShnb3RfZW9zX2J1ZmZlcik7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHZvaWQgQ3JlYXRlRGF0YVNvdXJjZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgewotICAgIENIRUNLKCFkYXRhX3NvdXJjZV8pOwotCi0gICAgRmlsZVBhdGggZmlsZV9wYXRoOwotICAgIEVYUEVDVF9UUlVFKFBhdGhTZXJ2aWNlOjpHZXQoYmFzZTo6RElSX1NPVVJDRV9ST09ULCAmZmlsZV9wYXRoKSk7Ci0KLSAgICBmaWxlX3BhdGggPSBmaWxlX3BhdGguQXBwZW5kKEZJTEVfUEFUSF9MSVRFUkFMKCJtZWRpYSIpKQotICAgICAgICAuQXBwZW5kKEZJTEVfUEFUSF9MSVRFUkFMKCJ0ZXN0IikpCi0gICAgICAgIC5BcHBlbmQoRklMRV9QQVRIX0xJVEVSQUwoImRhdGEiKSkKLSAgICAgICAgLkFwcGVuZEFTQ0lJKG5hbWUpOwotCi0gICAgZGF0YV9zb3VyY2VfID0gbmV3IEZpbGVEYXRhU291cmNlKCk7Ci0gICAgRVhQRUNUX1RSVUUoZGF0YV9zb3VyY2VfLT5Jbml0aWFsaXplKGZpbGVfcGF0aCkpOwotICB9Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEZGbXBlZ0RlbXV4ZXJUZXN0KTsKLX07Ci0KLVRFU1RfRihGRm1wZWdEZW11eGVyVGVzdCwgSW5pdGlhbGl6ZV9PcGVuRmFpbHMpIHsKLSAgLy8gU2ltdWxhdGUgYXZmb3JtYXRfb3Blbl9pbnB1dCgpIGZhaWxpbmcuCi0gIENyZWF0ZURlbXV4ZXIoInRlbl9ieXRlX2ZpbGUiKTsKLSAgV2FpdGFibGVNZXNzYWdlTG9vcEV2ZW50IGV2ZW50OwotICBkZW11eGVyXy0+SW5pdGlhbGl6ZSgmaG9zdF8sIGV2ZW50LkdldFBpcGVsaW5lU3RhdHVzQ0IoKSk7Ci0gIGV2ZW50LlJ1bkFuZFdhaXRGb3JTdGF0dXMoREVNVVhFUl9FUlJPUl9DT1VMRF9OT1RfT1BFTik7Ci19Ci0KLS8vIFRPRE8oYWNvbHdlbGwpOiBVbmNvbW1lbnQgdGhpcyB0ZXN0IHdoZW4gd2UgZGlzY292ZXIgYSBmaWxlIHRoYXQgcGFzc2VzCi0vLyBhdmZvcm1hdF9vcGVuX2lucHV0KCksIGJ1dCBoYXMgYXZmb3JtYXRfZmluZF9zdHJlYW1faW5mbygpIGZhaWwuCi0vLwotLy9URVNUX0YoRkZtcGVnRGVtdXhlclRlc3QsIEluaXRpYWxpemVfUGFyc2VGYWlscykgewotLy8gICgiZmluZF9zdHJlYW1faW5mb19mYWlsLndlYm0iKTsKLS8vICBkZW11eGVyXy0+SW5pdGlhbGl6ZSgKLS8vICAgICAgJmhvc3RfLCBOZXdFeHBlY3RlZFN0YXR1c0NCKERFTVVYRVJfRVJST1JfQ09VTERfTk9UX1BBUlNFKSk7Ci0vLyAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLS8vfQotCi1URVNUX0YoRkZtcGVnRGVtdXhlclRlc3QsIEluaXRpYWxpemVfTm9TdHJlYW1zKSB7Ci0gIC8vIE9wZW4gYSBmaWxlIHdpdGggbm8gc3RyZWFtcyB3aGF0c29ldmVyLgotICBDcmVhdGVEZW11eGVyKCJub19zdHJlYW1zLndlYm0iKTsKLSAgV2FpdGFibGVNZXNzYWdlTG9vcEV2ZW50IGV2ZW50OwotICBkZW11eGVyXy0+SW5pdGlhbGl6ZSgmaG9zdF8sIGV2ZW50LkdldFBpcGVsaW5lU3RhdHVzQ0IoKSk7Ci0gIGV2ZW50LlJ1bkFuZFdhaXRGb3JTdGF0dXMoREVNVVhFUl9FUlJPUl9OT19TVVBQT1JURURfU1RSRUFNUyk7Ci19Ci0KLVRFU1RfRihGRm1wZWdEZW11eGVyVGVzdCwgSW5pdGlhbGl6ZV9Ob0F1ZGlvVmlkZW8pIHsKLSAgLy8gT3BlbiBhIGZpbGUgY29udGFpbmluZyBzdHJlYW1zIGJ1dCBub25lIG9mIHdoaWNoIGFyZSBhdWRpby92aWRlbyBzdHJlYW1zLgotICBDcmVhdGVEZW11eGVyKCJub19hdWRpb192aWRlby53ZWJtIik7Ci0gIFdhaXRhYmxlTWVzc2FnZUxvb3BFdmVudCBldmVudDsKLSAgZGVtdXhlcl8tPkluaXRpYWxpemUoJmhvc3RfLCBldmVudC5HZXRQaXBlbGluZVN0YXR1c0NCKCkpOwotICBldmVudC5SdW5BbmRXYWl0Rm9yU3RhdHVzKERFTVVYRVJfRVJST1JfTk9fU1VQUE9SVEVEX1NUUkVBTVMpOwotfQotCi1URVNUX0YoRkZtcGVnRGVtdXhlclRlc3QsIEluaXRpYWxpemVfU3VjY2Vzc2Z1bCkgewotICBDcmVhdGVEZW11eGVyKCJiZWFyLTMyMHgyNDAud2VibSIpOwotICBJbml0aWFsaXplRGVtdXhlcigpOwotCi0gIC8vIFZpZGVvIHN0cmVhbSBzaG91bGQgYmUgcHJlc2VudC4KLSAgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiBzdHJlYW0gPQotICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpWSURFTyk7Ci0gIEFTU0VSVF9UUlVFKHN0cmVhbSk7Ci0gIEVYUEVDVF9FUShEZW11eGVyU3RyZWFtOjpWSURFTywgc3RyZWFtLT50eXBlKCkpOwotCi0gIGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgdmlkZW9fY29uZmlnID0gc3RyZWFtLT52aWRlb19kZWNvZGVyX2NvbmZpZygpOwotICBFWFBFQ1RfRVEoa0NvZGVjVlA4LCB2aWRlb19jb25maWcuY29kZWMoKSk7Ci0gIEVYUEVDVF9FUShWaWRlb0ZyYW1lOjpZVjEyLCB2aWRlb19jb25maWcuZm9ybWF0KCkpOwotICBFWFBFQ1RfRVEoMzIwLCB2aWRlb19jb25maWcuY29kZWRfc2l6ZSgpLndpZHRoKCkpOwotICBFWFBFQ1RfRVEoMjQwLCB2aWRlb19jb25maWcuY29kZWRfc2l6ZSgpLmhlaWdodCgpKTsKLSAgRVhQRUNUX0VRKDAsIHZpZGVvX2NvbmZpZy52aXNpYmxlX3JlY3QoKS54KCkpOwotICBFWFBFQ1RfRVEoMCwgdmlkZW9fY29uZmlnLnZpc2libGVfcmVjdCgpLnkoKSk7Ci0gIEVYUEVDVF9FUSgzMjAsIHZpZGVvX2NvbmZpZy52aXNpYmxlX3JlY3QoKS53aWR0aCgpKTsKLSAgRVhQRUNUX0VRKDI0MCwgdmlkZW9fY29uZmlnLnZpc2libGVfcmVjdCgpLmhlaWdodCgpKTsKLSAgRVhQRUNUX0VRKDMyMCwgdmlkZW9fY29uZmlnLm5hdHVyYWxfc2l6ZSgpLndpZHRoKCkpOwotICBFWFBFQ1RfRVEoMjQwLCB2aWRlb19jb25maWcubmF0dXJhbF9zaXplKCkuaGVpZ2h0KCkpOwotICBFWFBFQ1RfRkFMU0UodmlkZW9fY29uZmlnLmV4dHJhX2RhdGEoKSk7Ci0gIEVYUEVDVF9FUSgwdSwgdmlkZW9fY29uZmlnLmV4dHJhX2RhdGFfc2l6ZSgpKTsKLQotICAvLyBBdWRpbyBzdHJlYW0gc2hvdWxkIGJlIHByZXNlbnQuCi0gIHN0cmVhbSA9IGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6QVVESU8pOwotICBBU1NFUlRfVFJVRShzdHJlYW0pOwotICBFWFBFQ1RfRVEoRGVtdXhlclN0cmVhbTo6QVVESU8sIHN0cmVhbS0+dHlwZSgpKTsKLQotICBjb25zdCBBdWRpb0RlY29kZXJDb25maWcmIGF1ZGlvX2NvbmZpZyA9IHN0cmVhbS0+YXVkaW9fZGVjb2Rlcl9jb25maWcoKTsKLSAgRVhQRUNUX0VRKGtDb2RlY1ZvcmJpcywgYXVkaW9fY29uZmlnLmNvZGVjKCkpOwotICBFWFBFQ1RfRVEoMTYsIGF1ZGlvX2NvbmZpZy5iaXRzX3Blcl9jaGFubmVsKCkpOwotICBFWFBFQ1RfRVEoQ0hBTk5FTF9MQVlPVVRfU1RFUkVPLCBhdWRpb19jb25maWcuY2hhbm5lbF9sYXlvdXQoKSk7Ci0gIEVYUEVDVF9FUSg0NDEwMCwgYXVkaW9fY29uZmlnLnNhbXBsZXNfcGVyX3NlY29uZCgpKTsKLSAgRVhQRUNUX1RSVUUoYXVkaW9fY29uZmlnLmV4dHJhX2RhdGEoKSk7Ci0gIEVYUEVDVF9HVChhdWRpb19jb25maWcuZXh0cmFfZGF0YV9zaXplKCksIDB1KTsKLQotICAvLyBVbmtub3duIHN0cmVhbSBzaG91bGQgbmV2ZXIgYmUgcHJlc2VudC4KLSAgRVhQRUNUX0ZBTFNFKGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6VU5LTk9XTikpOwotfQotCi1URVNUX0YoRkZtcGVnRGVtdXhlclRlc3QsIEluaXRpYWxpemVfTXVsdGl0cmFjaykgewotICAvLyBPcGVuIGEgZmlsZSBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgc3RyZWFtczoKLSAgLy8gICBTdHJlYW0gIzA6IFZpZGVvIChWUDgpCi0gIC8vICAgU3RyZWFtICMxOiBBdWRpbyAoVm9yYmlzKQotICAvLyAgIFN0cmVhbSAjMjogU3VidGl0bGVzIChTUlQpCi0gIC8vICAgU3RyZWFtICMzOiBWaWRlbyAoVGhlb3JhKQotICAvLyAgIFN0cmVhbSAjNDogQXVkaW8gKDE2LWJpdCBzaWduZWQgbGl0dGxlIGVuZGlhbiBQQ00pCi0gIC8vCi0gIC8vIFdlIHNob3VsZCBvbmx5IHBpY2sgdGhlIGZpcnN0IGF1ZGlvL3ZpZGVvIHN0cmVhbXMgd2UgY29tZSBhY3Jvc3MuCi0gIENyZWF0ZURlbXV4ZXIoImJlYXItMzIweDI0MC1tdWx0aXRyYWNrLndlYm0iKTsKLSAgSW5pdGlhbGl6ZURlbXV4ZXIoKTsKLQotICAvLyBWaWRlbyBzdHJlYW0gc2hvdWxkIGJlIFZQOC4KLSAgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiBzdHJlYW0gPQotICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpWSURFTyk7Ci0gIEFTU0VSVF9UUlVFKHN0cmVhbSk7Ci0gIEVYUEVDVF9FUShEZW11eGVyU3RyZWFtOjpWSURFTywgc3RyZWFtLT50eXBlKCkpOwotICBFWFBFQ1RfRVEoa0NvZGVjVlA4LCBzdHJlYW0tPnZpZGVvX2RlY29kZXJfY29uZmlnKCkuY29kZWMoKSk7Ci0KLSAgLy8gQXVkaW8gc3RyZWFtIHNob3VsZCBiZSBWb3JiaXMuCi0gIHN0cmVhbSA9IGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6QVVESU8pOwotICBBU1NFUlRfVFJVRShzdHJlYW0pOwotICBFWFBFQ1RfRVEoRGVtdXhlclN0cmVhbTo6QVVESU8sIHN0cmVhbS0+dHlwZSgpKTsKLSAgRVhQRUNUX0VRKGtDb2RlY1ZvcmJpcywgc3RyZWFtLT5hdWRpb19kZWNvZGVyX2NvbmZpZygpLmNvZGVjKCkpOwotCi0gIC8vIFVua25vd24gc3RyZWFtIHNob3VsZCBuZXZlciBiZSBwcmVzZW50LgotICBFWFBFQ1RfRkFMU0UoZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpVTktOT1dOKSk7Ci19Ci0KLVRFU1RfRihGRm1wZWdEZW11eGVyVGVzdCwgUmVhZF9BdWRpbykgewotICAvLyBXZSB0ZXN0IHRoYXQgb24gYSBzdWNjZXNzZnVsIGF1ZGlvIHBhY2tldCByZWFkLgotICBDcmVhdGVEZW11eGVyKCJiZWFyLTMyMHgyNDAud2VibSIpOwotICBJbml0aWFsaXplRGVtdXhlcigpOwotCi0gIC8vIEF0dGVtcHQgYSByZWFkIGZyb20gdGhlIGF1ZGlvIHN0cmVhbSBhbmQgcnVuIHRoZSBtZXNzYWdlIGxvb3AgdW50aWwgZG9uZS4KLSAgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiBhdWRpbyA9Ci0gICAgICBkZW11eGVyXy0+R2V0U3RyZWFtKERlbXV4ZXJTdHJlYW06OkFVRElPKTsKLQotICBhdWRpby0+UmVhZChOZXdSZWFkQ0IoRlJPTV9IRVJFLCAyOSwgMCkpOwotICBtZXNzYWdlX2xvb3BfLlJ1bigpOwotCi0gIGF1ZGlvLT5SZWFkKE5ld1JlYWRDQihGUk9NX0hFUkUsIDI3LCAzMDAwKSk7Ci0gIG1lc3NhZ2VfbG9vcF8uUnVuKCk7Ci19Ci0KLVRFU1RfRihGRm1wZWdEZW11eGVyVGVzdCwgUmVhZF9WaWRlbykgewotICAvLyBXZSB0ZXN0IHRoYXQgb24gYSBzdWNjZXNzZnVsIHZpZGVvIHBhY2tldCByZWFkLgotICBDcmVhdGVEZW11eGVyKCJiZWFyLTMyMHgyNDAud2VibSIpOwotICBJbml0aWFsaXplRGVtdXhlcigpOwotCi0gIC8vIEF0dGVtcHQgYSByZWFkIGZyb20gdGhlIHZpZGVvIHN0cmVhbSBhbmQgcnVuIHRoZSBtZXNzYWdlIGxvb3AgdW50aWwgZG9uZS4KLSAgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiB2aWRlbyA9Ci0gICAgICBkZW11eGVyXy0+R2V0U3RyZWFtKERlbXV4ZXJTdHJlYW06OlZJREVPKTsKLQotICB2aWRlby0+UmVhZChOZXdSZWFkQ0IoRlJPTV9IRVJFLCAyMjA4NCwgMCkpOwotICBtZXNzYWdlX2xvb3BfLlJ1bigpOwotCi0gIHZpZGVvLT5SZWFkKE5ld1JlYWRDQihGUk9NX0hFUkUsIDEwNTcsIDMzMDAwKSk7Ci0gIG1lc3NhZ2VfbG9vcF8uUnVuKCk7Ci19Ci0KLVRFU1RfRihGRm1wZWdEZW11eGVyVGVzdCwgUmVhZF9WaWRlb05vblplcm9TdGFydCkgewotICAvLyBUZXN0IHRoZSBzdGFydCB0aW1lIGlzIHRoZSBmaXJzdCB0aW1lc3RhbXAgb2YgdGhlIHZpZGVvIGFuZCBhdWRpbyBzdHJlYW0uCi0gIENyZWF0ZURlbXV4ZXIoIm5vbnplcm8tc3RhcnQtdGltZS53ZWJtIik7Ci0gIEluaXRpYWxpemVEZW11eGVyKCk7Ci0KLSAgLy8gQXR0ZW1wdCBhIHJlYWQgZnJvbSB0aGUgdmlkZW8gc3RyZWFtIGFuZCBydW4gdGhlIG1lc3NhZ2UgbG9vcCB1bnRpbCBkb25lLgotICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IHZpZGVvID0KLSAgICAgIGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6VklERU8pOwotICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IGF1ZGlvID0KLSAgICAgIGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6QVVESU8pOwotCi0gIC8vIENoZWNrIGZpcnN0IGJ1ZmZlciBpbiB2aWRlbyBzdHJlYW0uCi0gIHZpZGVvLT5SZWFkKE5ld1JlYWRDQihGUk9NX0hFUkUsIDU2MzYsIDQwMDAwMCkpOwotICBtZXNzYWdlX2xvb3BfLlJ1bigpOwotCi0gIC8vIENoZWNrIGZpcnN0IGJ1ZmZlciBpbiBhdWRpbyBzdHJlYW0uCi0gIGF1ZGlvLT5SZWFkKE5ld1JlYWRDQihGUk9NX0hFUkUsIDE2NSwgMzk2MDAwKSk7Ci0gIG1lc3NhZ2VfbG9vcF8uUnVuKCk7Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgdGhlIHN0YXJ0IHRpbWUgaXMgZXF1YWwgdG8gdGhlIGxvd2VzdCB0aW1lc3RhbXAgKGllIHRoZSBhdWRpbykuCi0gIEVYUEVDVF9FUShkZW11eGVyXy0+R2V0U3RhcnRUaW1lKCkuSW5NaWNyb3NlY29uZHMoKSwgMzk2MDAwKTsKLX0KLQotVEVTVF9GKEZGbXBlZ0RlbXV4ZXJUZXN0LCBSZWFkX0VuZE9mU3RyZWFtKSB7Ci0gIC8vIFZlcmlmeSB0aGF0IGVuZCBvZiBzdHJlYW0gYnVmZmVycyBhcmUgY3JlYXRlZC4KLSAgQ3JlYXRlRGVtdXhlcigiYmVhci0zMjB4MjQwLndlYm0iKTsKLSAgSW5pdGlhbGl6ZURlbXV4ZXIoKTsKLSAgUmVhZFVudGlsRW5kT2ZTdHJlYW0oKTsKLX0KLQotVEVTVF9GKEZGbXBlZ0RlbXV4ZXJUZXN0LCBSZWFkX0VuZE9mU3RyZWFtX05vRHVyYXRpb24pIHsKLSAgLy8gVmVyaWZ5IHRoYXQgZW5kIG9mIHN0cmVhbSBidWZmZXJzIGFyZSBjcmVhdGVkLgotICBDcmVhdGVEZW11eGVyKCJiZWFyLTMyMHgyNDAud2VibSIpOwotICBJbml0aWFsaXplRGVtdXhlcigpOwotICBzZXRfZHVyYXRpb25fa25vd24oZmFsc2UpOwotICBFWFBFQ1RfQ0FMTChob3N0XywgU2V0RHVyYXRpb24oXykpOwotICBSZWFkVW50aWxFbmRPZlN0cmVhbSgpOwotfQotCi1URVNUX0YoRkZtcGVnRGVtdXhlclRlc3QsIFNlZWspIHsKLSAgLy8gV2UncmUgdGVzdGluZyB0aGF0IHRoZSBkZW11eGVyIGZyZWVzIGFsbCBxdWV1ZWQgcGFja2V0cyB3aGVuIGl0IHJlY2VpdmVzCi0gIC8vIGEgU2VlaygpLgotICBDcmVhdGVEZW11eGVyKCJiZWFyLTMyMHgyNDAud2VibSIpOwotICBJbml0aWFsaXplRGVtdXhlcigpOwotCi0gIC8vIEdldCBvdXIgc3RyZWFtcy4KLSAgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiB2aWRlbyA9Ci0gICAgICBkZW11eGVyXy0+R2V0U3RyZWFtKERlbXV4ZXJTdHJlYW06OlZJREVPKTsKLSAgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiBhdWRpbyA9Ci0gICAgICBkZW11eGVyXy0+R2V0U3RyZWFtKERlbXV4ZXJTdHJlYW06OkFVRElPKTsKLSAgQVNTRVJUX1RSVUUodmlkZW8pOwotICBBU1NFUlRfVFJVRShhdWRpbyk7Ci0KLSAgLy8gUmVhZCBhIHZpZGVvIHBhY2tldCBhbmQgcmVsZWFzZSBpdC4KLSAgdmlkZW8tPlJlYWQoTmV3UmVhZENCKEZST01fSEVSRSwgMjIwODQsIDApKTsKLSAgbWVzc2FnZV9sb29wXy5SdW4oKTsKLQotICAvLyBJc3N1ZSBhIHNpbXBsZSBmb3J3YXJkIHNlZWssIHdoaWNoIHNob3VsZCBkaXNjYXJkIHF1ZXVlZCBwYWNrZXRzLgotICBXYWl0YWJsZU1lc3NhZ2VMb29wRXZlbnQgZXZlbnQ7Ci0gIGRlbXV4ZXJfLT5TZWVrKGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pY3Jvc2Vjb25kcygxMDAwMDAwKSwKLSAgICAgICAgICAgICAgICAgZXZlbnQuR2V0UGlwZWxpbmVTdGF0dXNDQigpKTsKLSAgZXZlbnQuUnVuQW5kV2FpdEZvclN0YXR1cyhQSVBFTElORV9PSyk7Ci0KLSAgLy8gQXVkaW8gcmVhZCAjMS4KLSAgYXVkaW8tPlJlYWQoTmV3UmVhZENCKEZST01fSEVSRSwgMTQ1LCA4MDMwMDApKTsKLSAgbWVzc2FnZV9sb29wXy5SdW4oKTsKLQotICAvLyBBdWRpbyByZWFkICMyLgotICBhdWRpby0+UmVhZChOZXdSZWFkQ0IoRlJPTV9IRVJFLCAxNDgsIDgyNjAwMCkpOwotICBtZXNzYWdlX2xvb3BfLlJ1bigpOwotCi0gIC8vIFZpZGVvIHJlYWQgIzEuCi0gIHZpZGVvLT5SZWFkKE5ld1JlYWRDQihGUk9NX0hFUkUsIDU0MjUsIDgwMTAwMCkpOwotICBtZXNzYWdlX2xvb3BfLlJ1bigpOwotCi0gIC8vIFZpZGVvIHJlYWQgIzIuCi0gIHZpZGVvLT5SZWFkKE5ld1JlYWRDQihGUk9NX0hFUkUsIDE5MDYsIDgzNDAwMCkpOwotICBtZXNzYWdlX2xvb3BfLlJ1bigpOwotfQotCi0vLyBBIG1vY2tlZCBjYWxsYmFjayBzcGVjaWFsaXphdGlvbiBmb3IgY2FsbGluZyBSZWFkKCkuICBTaW5jZSBSdW5XaXRoUGFyYW1zKCkKLS8vIGlzIG1vY2tlZCB3ZSBkb24ndCBuZWVkIHRvIHBhc3MgaW4gb2JqZWN0IG9yIG1ldGhvZCBwb2ludGVycy4KLWNsYXNzIE1vY2tSZWFkQ0IgOiBwdWJsaWMgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8TW9ja1JlYWRDQj4gewotIHB1YmxpYzoKLSAgTW9ja1JlYWRDQigpIHt9Ci0KLSAgTU9DS19NRVRIT0QwKE9uRGVsZXRlLCB2b2lkKCkpOwotICBNT0NLX01FVEhPRDIoUnVuLCB2b2lkKERlbXV4ZXJTdHJlYW06OlN0YXR1cyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgYnVmZmVyKSk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgfk1vY2tSZWFkQ0IoKSB7Ci0gICAgT25EZWxldGUoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPE1vY2tSZWFkQ0I+OwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNb2NrUmVhZENCKTsKLX07Ci0KLVRFU1RfRihGRm1wZWdEZW11eGVyVGVzdCwgU3RvcCkgewotICAvLyBUZXN0cyB0aGF0IGNhbGxpbmcgUmVhZCgpIG9uIGEgc3RvcHBlZCBkZW11eGVyIHN0cmVhbSBpbW1lZGlhdGVseSBkZWxldGVzCi0gIC8vIHRoZSBjYWxsYmFjay4KLSAgQ3JlYXRlRGVtdXhlcigiYmVhci0zMjB4MjQwLndlYm0iKTsKLSAgSW5pdGlhbGl6ZURlbXV4ZXIoKTsKLQotICAvLyBHZXQgb3VyIHN0cmVhbS4KLSAgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiBhdWRpbyA9Ci0gICAgICBkZW11eGVyXy0+R2V0U3RyZWFtKERlbXV4ZXJTdHJlYW06OkFVRElPKTsKLSAgQVNTRVJUX1RSVUUoYXVkaW8pOwotCi0gIGRlbXV4ZXJfLT5TdG9wKE5ld0V4cGVjdGVkQ2xvc3VyZSgpKTsKLQotICAvLyBFeHBlY3QgYWxsIGNhbGxzIGluIHNlcXVlbmNlLgotICBJblNlcXVlbmNlIHM7Ci0KLSAgLy8gQ3JlYXRlIG91ciBtb2NrZWQgY2FsbGJhY2suIFRoZSBDYWxsYmFjayBjcmVhdGVkIGJ5IGJhc2U6OkJpbmQoKSB3aWxsIHRha2UKLSAgLy8gb3duZXJzaGlwIG9mIHRoaXMgcG9pbnRlci4KLSAgU3RyaWN0TW9jazxNb2NrUmVhZENCPiogY2FsbGJhY2sgPSBuZXcgU3RyaWN0TW9jazxNb2NrUmVhZENCPigpOwotCi0gIC8vIFRoZSBjYWxsYmFjayBzaG91bGQgYmUgaW1tZWRpYXRlbHkgZGVsZXRlZC4gIFdlJ2xsIHVzZSBhIGNoZWNrcG9pbnQgdG8KLSAgLy8gdmVyaWZ5IHRoYXQgaXQgaGFzIGluZGVlZCBiZWVuIGRlbGV0ZWQuCi0gIEVYUEVDVF9DQUxMKCpjYWxsYmFjaywgUnVuKERlbXV4ZXJTdHJlYW06OmtPaywgSXNFbmRPZlN0cmVhbUJ1ZmZlcigpKSk7Ci0gIEVYUEVDVF9DQUxMKCpjYWxsYmFjaywgT25EZWxldGUoKSk7Ci0gIEVYUEVDVF9DQUxMKCp0aGlzLCBDaGVja1BvaW50KDEpKTsKLQotICAvLyBBdHRlbXB0IHRoZSByZWFkLi4uCi0gIGF1ZGlvLT5SZWFkKGJhc2U6OkJpbmQoJk1vY2tSZWFkQ0I6OlJ1biwgY2FsbGJhY2spKTsKLQotICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotCi0gIC8vIC4uLmFuZCB2ZXJpZnkgdGhhdCB8Y2FsbGJhY2t8IHdhcyBkZWxldGVkLgotICBDaGVja1BvaW50KDEpOwotfQotCi0vLyBUaGUgc3RyZWFtcyBjYW4gb3V0bGl2ZSB0aGUgZGVtdXhlciBiZWNhdXNlIHRoZSBzdHJlYW1zIG1heSBzdGlsbCBiZSBpbiB1c2UKLS8vIGJ5IHRoZSBkZWNvZGVyIHdoZW4gdGhlIGRlbXV4ZXIgaXMgZGVzdHJveWVkLgotLy8gVGhpcyB0ZXN0IHZlcmlmaWVzIHRoYXQgRGVtdXhlclN0cmVhbTo6UmVhZCgpIGRvZXMgbm90IHVzZSBhbiBpbnZhbGlkIGRlbXV4ZXIKLS8vIHBvaW50ZXIgKG5vIGNyYXNoIG9jY3VycykgYW5kIGNhbGxzIHRoZSBjYWxsYmFjayB3aXRoIGFuIEVuZE9mU3RyZWFtIGJ1ZmZlci4KLVRFU1RfRihGRm1wZWdEZW11eGVyVGVzdCwgU3RyZWFtUmVhZEFmdGVyU3RvcEFuZERlbXV4ZXJEZXN0cnVjdGlvbikgewotICBDcmVhdGVEZW11eGVyKCJiZWFyLTMyMHgyNDAud2VibSIpOwotICBJbml0aWFsaXplRGVtdXhlcigpOwotCi0gIC8vIEdldCBvdXIgc3RyZWFtLgotICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IGF1ZGlvID0KLSAgICAgIGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6QVVESU8pOwotICBBU1NFUlRfVFJVRShhdWRpbyk7Ci0KLSAgZGVtdXhlcl8tPlN0b3AoTWVzc2FnZUxvb3A6OlF1aXRXaGVuSWRsZUNsb3N1cmUoKSk7Ci0gIG1lc3NhZ2VfbG9vcF8uUnVuKCk7Ci0KLSAgLy8gRXhwZWN0IGFsbCBjYWxscyBpbiBzZXF1ZW5jZS4KLSAgSW5TZXF1ZW5jZSBzOwotCi0gIC8vIENyZWF0ZSBvdXIgbW9ja2VkIGNhbGxiYWNrLiBUaGUgQ2FsbGJhY2sgY3JlYXRlZCBieSBiYXNlOjpCaW5kKCkgd2lsbCB0YWtlCi0gIC8vIG93bmVyc2hpcCBvZiB0aGlzIHBvaW50ZXIuCi0gIFN0cmljdE1vY2s8TW9ja1JlYWRDQj4qIGNhbGxiYWNrID0gbmV3IFN0cmljdE1vY2s8TW9ja1JlYWRDQj4oKTsKLQotICAvLyBUaGUgY2FsbGJhY2sgc2hvdWxkIGJlIGltbWVkaWF0ZWx5IGRlbGV0ZWQuICBXZSdsbCB1c2UgYSBjaGVja3BvaW50IHRvCi0gIC8vIHZlcmlmeSB0aGF0IGl0IGhhcyBpbmRlZWQgYmVlbiBkZWxldGVkLgotICBFWFBFQ1RfQ0FMTCgqY2FsbGJhY2ssIFJ1bihEZW11eGVyU3RyZWFtOjprT2ssIElzRW5kT2ZTdHJlYW1CdWZmZXIoKSkpOwotICBFWFBFQ1RfQ0FMTCgqY2FsbGJhY2ssIE9uRGVsZXRlKCkpOwotICBFWFBFQ1RfQ0FMTCgqdGhpcywgQ2hlY2tQb2ludCgxKSk7Ci0KLSAgLy8gUmVsZWFzZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBkZW11eGVyLiBUaGlzIHNob3VsZCBhbHNvIGRlc3Ryb3kgaXQuCi0gIGRlbXV4ZXJfID0gTlVMTDsKLSAgLy8gfGF1ZGlvfCBub3cgaGFzIGEgZGVtdXhlcl8gcG9pbnRlciB0byBpbnZhbGlkIG1lbW9yeS4KLQotICAvLyBBdHRlbXB0IHRoZSByZWFkLi4uCi0gIGF1ZGlvLT5SZWFkKGJhc2U6OkJpbmQoJk1vY2tSZWFkQ0I6OlJ1biwgY2FsbGJhY2spKTsKLQotICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotCi0gIC8vIC4uLmFuZCB2ZXJpZnkgdGhhdCB8Y2FsbGJhY2t8IHdhcyBkZWxldGVkLgotICBDaGVja1BvaW50KDEpOwotfQotCi1URVNUX0YoRkZtcGVnRGVtdXhlclRlc3QsIERpc2FibGVBdWRpb1N0cmVhbSkgewotICAvLyBXZSBhcmUgZG9pbmcgdGhlIGZvbGxvd2luZyB0aGluZ3MgaGVyZToKLSAgLy8gMS4gSW5pdGlhbGl6ZSB0aGUgZGVtdXhlciB3aXRoIGF1ZGlvIGFuZCB2aWRlbyBzdHJlYW0uCi0gIC8vIDIuIFNlbmQgYSAiZGlzYWJsZSBhdWRpbyBzdHJlYW0iIG1lc3NhZ2UgdG8gdGhlIGRlbXV4ZXIuCi0gIC8vIDMuIERlbXV4ZXIgd2lsbCBmcmVlIGF1ZGlvIHBhY2tldHMgZXZlbiBpZiBhdWRpbyBzdHJlYW0gd2FzIGluaXRpYWxpemVkLgotICBDcmVhdGVEZW11eGVyKCJiZWFyLTMyMHgyNDAud2VibSIpOwotICBJbml0aWFsaXplRGVtdXhlcigpOwotCi0gIC8vIFN1Ym1pdCBhICJkaXNhYmxlIGF1ZGlvIHN0cmVhbSIgbWVzc2FnZSB0byB0aGUgZGVtdXhlci4KLSAgZGVtdXhlcl8tPk9uQXVkaW9SZW5kZXJlckRpc2FibGVkKCk7Ci0gIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci0KLSAgLy8gR2V0IG91ciBzdHJlYW1zLgotICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IHZpZGVvID0KLSAgICAgIGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6VklERU8pOwotICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IGF1ZGlvID0KLSAgICAgIGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6QVVESU8pOwotICBBU1NFUlRfVFJVRSh2aWRlbyk7Ci0gIEFTU0VSVF9UUlVFKGF1ZGlvKTsKLQotICAvLyBUaGUgYXVkaW8gc3RyZWFtIHNob3VsZCBoYXZlIGJlZW4gcHJlbWF0dXJlbHkgc3RvcHBlZC4KLSAgRVhQRUNUX0ZBTFNFKElzU3RyZWFtU3RvcHBlZChEZW11eGVyU3RyZWFtOjpWSURFTykpOwotICBFWFBFQ1RfVFJVRShJc1N0cmVhbVN0b3BwZWQoRGVtdXhlclN0cmVhbTo6QVVESU8pKTsKLQotICAvLyBBdHRlbXB0IGEgcmVhZCBmcm9tIHRoZSB2aWRlbyBzdHJlYW06IGl0IHNob3VsZCByZXR1cm4gdmFsaWQgZGF0YS4KLSAgdmlkZW8tPlJlYWQoTmV3UmVhZENCKEZST01fSEVSRSwgMjIwODQsIDApKTsKLSAgbWVzc2FnZV9sb29wXy5SdW4oKTsKLQotICAvLyBBdHRlbXB0IGEgcmVhZCBmcm9tIHRoZSBhdWRpbyBzdHJlYW06IGl0IHNob3VsZCBpbW1lZGlhdGVseSByZXR1cm4gZW5kIG9mCi0gIC8vIHN0cmVhbSB3aXRob3V0IHJlcXVpcmluZyB0aGUgbWVzc2FnZSBsb29wIHRvIHJlYWQgZGF0YS4KLSAgYm9vbCBnb3RfZW9zX2J1ZmZlciA9IGZhbHNlOwotICBhdWRpby0+UmVhZChiYXNlOjpCaW5kKCZFb3NPblJlYWREb25lLCAmZ290X2Vvc19idWZmZXIpKTsKLSAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLSAgRVhQRUNUX1RSVUUoZ290X2Vvc19idWZmZXIpOwotfQotCi0vLyBWZXJpZnkgdGhhdCBzZWVrIHdvcmtzIHByb3Blcmx5IHdoZW4gdGhlIFdlYk0gY3VlcyBkYXRhIGlzIGF0IHRoZSBzdGFydCBvZgotLy8gdGhlIGZpbGUgaW5zdGVhZCBvZiBhdCB0aGUgZW5kLgotVEVTVF9GKEZGbXBlZ0RlbXV4ZXJUZXN0LCBTZWVrV2l0aEN1ZXNCZWZvcmVGaXJzdENsdXN0ZXIpIHsKLSAgQ3JlYXRlRGVtdXhlcigiYmVhci0zMjB4MjQwLWN1ZXMtaW4tZnJvbnQud2VibSIpOwotICBJbml0aWFsaXplRGVtdXhlcigpOwotCi0gIC8vIEdldCBvdXIgc3RyZWFtcy4KLSAgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiB2aWRlbyA9Ci0gICAgICBkZW11eGVyXy0+R2V0U3RyZWFtKERlbXV4ZXJTdHJlYW06OlZJREVPKTsKLSAgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiBhdWRpbyA9Ci0gICAgICBkZW11eGVyXy0+R2V0U3RyZWFtKERlbXV4ZXJTdHJlYW06OkFVRElPKTsKLSAgQVNTRVJUX1RSVUUodmlkZW8pOwotICBBU1NFUlRfVFJVRShhdWRpbyk7Ci0KLSAgLy8gUmVhZCBhIHZpZGVvIHBhY2tldCBhbmQgcmVsZWFzZSBpdC4KLSAgdmlkZW8tPlJlYWQoTmV3UmVhZENCKEZST01fSEVSRSwgMjIwODQsIDApKTsKLSAgbWVzc2FnZV9sb29wXy5SdW4oKTsKLQotICAvLyBJc3N1ZSBhIHNpbXBsZSBmb3J3YXJkIHNlZWssIHdoaWNoIHNob3VsZCBkaXNjYXJkIHF1ZXVlZCBwYWNrZXRzLgotICBXYWl0YWJsZU1lc3NhZ2VMb29wRXZlbnQgZXZlbnQ7Ci0gIGRlbXV4ZXJfLT5TZWVrKGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pY3Jvc2Vjb25kcygyNTAwMDAwKSwKLSAgICAgICAgICAgICAgICAgZXZlbnQuR2V0UGlwZWxpbmVTdGF0dXNDQigpKTsKLSAgZXZlbnQuUnVuQW5kV2FpdEZvclN0YXR1cyhQSVBFTElORV9PSyk7Ci0KLSAgLy8gQXVkaW8gcmVhZCAjMS4KLSAgYXVkaW8tPlJlYWQoTmV3UmVhZENCKEZST01fSEVSRSwgNDAsIDI0MDMwMDApKTsKLSAgbWVzc2FnZV9sb29wXy5SdW4oKTsKLQotICAvLyBBdWRpbyByZWFkICMyLgotICBhdWRpby0+UmVhZChOZXdSZWFkQ0IoRlJPTV9IRVJFLCA0MiwgMjQwNjAwMCkpOwotICBtZXNzYWdlX2xvb3BfLlJ1bigpOwotCi0gIC8vIFZpZGVvIHJlYWQgIzEuCi0gIHZpZGVvLT5SZWFkKE5ld1JlYWRDQihGUk9NX0hFUkUsIDUyNzYsIDI0MDIwMDApKTsKLSAgbWVzc2FnZV9sb29wXy5SdW4oKTsKLQotICAvLyBWaWRlbyByZWFkICMyLgotICB2aWRlby0+UmVhZChOZXdSZWFkQ0IoRlJPTV9IRVJFLCAxNzQwLCAyNDM2MDAwKSk7Ci0gIG1lc3NhZ2VfbG9vcF8uUnVuKCk7Ci19Ci0KLS8vIEVuc3VyZSBJRDN2MSB0YWcgcmVhZGluZyBpcyBkaXNhYmxlZC4gIGlkM190ZXN0Lm1wMyBoYXMgYW4gSUQzdjEgdGFnIHdpdGggdGhlCi0vLyBmaWVsZCAidGl0bGUiIHNldCB0byAic2FtcGxlIGZvciBpZDMgdGVzdCIuCi1URVNUX0YoRkZtcGVnRGVtdXhlclRlc3QsIE5vSUQzVGFnRGF0YSkgewotI2lmICFkZWZpbmVkKFVTRV9QUk9QUklFVEFSWV9DT0RFQ1MpCi0gIHJldHVybjsKLSNlbmRpZgotICBDcmVhdGVEZW11eGVyKCJpZDNfdGVzdC5tcDMiKTsKLSAgSW5pdGlhbGl6ZURlbXV4ZXIoKTsKLSAgRVhQRUNUX0ZBTFNFKGF2X2RpY3RfZ2V0KGZvcm1hdF9jb250ZXh0KCktPm1ldGFkYXRhLCAidGl0bGUiLCBOVUxMLCAwKSk7Ci19Ci0KLS8vIEVuc3VyZSBNUDMgZmlsZXMgd2l0aCBsYXJnZSBpbWFnZS92aWRlbyBiYXNlZCBJRDMgdGFncyBkZW11eCBva2F5LiAgRkZtcGVnCi0vLyB3aWxsIGhhbmQgdXMgYSB2aWRlbyBzdHJlYW0gdG8gdGhlIGRhdGEgd2hpY2ggd2lsbCBsaWtlbHkgYmUgaW4gYSBmb3JtYXQgd2UKLS8vIGRvbid0IGFjY2VwdCBhcyB2aWRlbzsgZS5nLiBQTkcuCi1URVNUX0YoRkZtcGVnRGVtdXhlclRlc3QsIE1wM1dpdGhWaWRlb1N0cmVhbUlEM1RhZ0RhdGEpIHsKLSNpZiAhZGVmaW5lZChVU0VfUFJPUFJJRVRBUllfQ09ERUNTKQotICByZXR1cm47Ci0jZW5kaWYKLSAgQ3JlYXRlRGVtdXhlcigiaWQzX3BuZ190ZXN0Lm1wMyIpOwotICBJbml0aWFsaXplRGVtdXhlcigpOwotCi0gIC8vIEVuc3VyZSB0aGUgZXhwZWN0ZWQgc3RyZWFtcyBhcmUgcHJlc2VudC4KLSAgRVhQRUNUX0ZBTFNFKGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6VklERU8pKTsKLSAgRVhQRUNUX1RSVUUoZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpBVURJTykpOwotfQotCi0vLyBFbnN1cmUgYSB2aWRlbyB3aXRoIGFuIHVuc3VwcG9ydGVkIGF1ZGlvIHRyYWNrIHN0aWxsIHJlc3VsdHMgaW4gdGhlIHZpZGVvCi0vLyBzdHJlYW0gYmVpbmcgZGVtdXhlZC4KLVRFU1RfRihGRm1wZWdEZW11eGVyVGVzdCwgVW5zdXBwb3J0ZWRBdWRpb1N1cHBvcnRlZFZpZGVvRGVtdXgpIHsKLSAgQ3JlYXRlRGVtdXhlcigic3BlZXhfYXVkaW9fdm9yYmlzX3ZpZGVvLm9ndiIpOwotICBJbml0aWFsaXplRGVtdXhlcigpOwotCi0gIC8vIEVuc3VyZSB0aGUgZXhwZWN0ZWQgc3RyZWFtcyBhcmUgcHJlc2VudC4KLSAgRVhQRUNUX1RSVUUoZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpWSURFTykpOwotICBFWFBFQ1RfRkFMU0UoZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpBVURJTykpOwotfQotCi0vLyBFbnN1cmUgYSB2aWRlbyB3aXRoIGFuIHVuc3VwcG9ydGVkIHZpZGVvIHRyYWNrIHN0aWxsIHJlc3VsdHMgaW4gdGhlIGF1ZGlvCi0vLyBzdHJlYW0gYmVpbmcgZGVtdXhlZC4KLVRFU1RfRihGRm1wZWdEZW11eGVyVGVzdCwgVW5zdXBwb3J0ZWRWaWRlb1N1cHBvcnRlZEF1ZGlvRGVtdXgpIHsKLSAgQ3JlYXRlRGVtdXhlcigidm9yYmlzX2F1ZGlvX3dtdl92aWRlby5ta3YiKTsKLSAgSW5pdGlhbGl6ZURlbXV4ZXIoKTsKLQotICAvLyBFbnN1cmUgdGhlIGV4cGVjdGVkIHN0cmVhbXMgYXJlIHByZXNlbnQuCi0gIEVYUEVDVF9GQUxTRShkZW11eGVyXy0+R2V0U3RyZWFtKERlbXV4ZXJTdHJlYW06OlZJREVPKSk7Ci0gIEVYUEVDVF9UUlVFKGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6QVVESU8pKTsKLX0KLQotLy8gRkZtcGVnIHJldHVybnMgbnVsbCBkYXRhIHBvaW50ZXJzIHdoZW4gc2FtcGxlcyBoYXZlIHplcm8gc2l6ZSwgbGVhZGluZyB0bwotLy8gbWlzdGFrZW5seSBjcmVhdGluZyBlbmQgb2Ygc3RyZWFtIGJ1ZmZlcnMgaHR0cDovL2NyYnVnLmNvbS8xNjkxMzMKLVRFU1RfRihGRm1wZWdEZW11eGVyVGVzdCwgTVA0X1plcm9TdHN6RW50cnkpIHsKLSNpZiAhZGVmaW5lZChVU0VfUFJPUFJJRVRBUllfQ09ERUNTKQotICByZXR1cm47Ci0jZW5kaWYKLSAgQ3JlYXRlRGVtdXhlcigiYmVhci0xMjgweDcyMC16ZXJvLXN0c3otZW50cnkubXA0Iik7Ci0gIEluaXRpYWxpemVEZW11eGVyKCk7Ci0gIFJlYWRVbnRpbEVuZE9mU3RyZWFtKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvZmZtcGVnX2dsdWUuY2MgYi9zcmMvbWVkaWEvZmlsdGVycy9mZm1wZWdfZ2x1ZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiMjI3Yi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9mZm1wZWdfZ2x1ZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9mZm1wZWdfZ2x1ZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS9zeW5jaHJvbml6YXRpb24vbG9jay5oIgotI2luY2x1ZGUgIm1lZGlhL2ZmbXBlZy9mZm1wZWdfY29tbW9uLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIEludGVybmFsIGJ1ZmZlciBzaXplIHVzZWQgYnkgQVZJTyBmb3IgcmVhZGluZy4KLS8vIFRPRE8oZGFsZWN1cnRpcyk6IEV4cGVyaW1lbnQgd2l0aCB0aGlzIGJ1ZmZlciBzaXplIGFuZCBtZWFzdXJlIGltcGFjdCBvbgotLy8gcGVyZm9ybWFuY2UuICBDdXJyZW50bHkgd2Ugd2FudCB0byB1c2UgMzJrYiB0byBwcmVzZXJ2ZSBleGlzdGluZyBiZWhhdmlvcgotLy8gd2l0aCB0aGUgcHJldmlvdXMgVVJMUHJvdG9jb2wgYmFzZWQgYXBwcm9hY2guCi1lbnVtIHsga0J1ZmZlclNpemUgPSAzMiAqIDEwMjQgfTsKLQotc3RhdGljIGludCBBVklPUmVhZE9wZXJhdGlvbih2b2lkKiBvcGFxdWUsIHVpbnQ4X3QqIGJ1ZiwgaW50IGJ1Zl9zaXplKSB7Ci0gIEZGbXBlZ1VSTFByb3RvY29sKiBwcm90b2NvbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8RkZtcGVnVVJMUHJvdG9jb2wqPihvcGFxdWUpOwotICBpbnQgcmVzdWx0ID0gcHJvdG9jb2wtPlJlYWQoYnVmX3NpemUsIGJ1Zik7Ci0gIGlmIChyZXN1bHQgPCAwKQotICAgIHJlc3VsdCA9IEFWRVJST1IoRUlPKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGludDY0IEFWSU9TZWVrT3BlcmF0aW9uKHZvaWQqIG9wYXF1ZSwgaW50NjQgb2Zmc2V0LCBpbnQgd2hlbmNlKSB7Ci0gIEZGbXBlZ1VSTFByb3RvY29sKiBwcm90b2NvbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8RkZtcGVnVVJMUHJvdG9jb2wqPihvcGFxdWUpOwotICBpbnQ2NCBuZXdfb2Zmc2V0ID0gQVZFUlJPUihFSU8pOwotICBzd2l0Y2ggKHdoZW5jZSkgewotICAgIGNhc2UgU0VFS19TRVQ6Ci0gICAgICBpZiAocHJvdG9jb2wtPlNldFBvc2l0aW9uKG9mZnNldCkpCi0gICAgICAgIHByb3RvY29sLT5HZXRQb3NpdGlvbigmbmV3X29mZnNldCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU0VFS19DVVI6Ci0gICAgICBpbnQ2NCBwb3M7Ci0gICAgICBpZiAoIXByb3RvY29sLT5HZXRQb3NpdGlvbigmcG9zKSkKLSAgICAgICAgYnJlYWs7Ci0gICAgICBpZiAocHJvdG9jb2wtPlNldFBvc2l0aW9uKHBvcyArIG9mZnNldCkpCi0gICAgICAgIHByb3RvY29sLT5HZXRQb3NpdGlvbigmbmV3X29mZnNldCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU0VFS19FTkQ6Ci0gICAgICBpbnQ2NCBzaXplOwotICAgICAgaWYgKCFwcm90b2NvbC0+R2V0U2l6ZSgmc2l6ZSkpCi0gICAgICAgIGJyZWFrOwotICAgICAgaWYgKHByb3RvY29sLT5TZXRQb3NpdGlvbihzaXplICsgb2Zmc2V0KSkKLSAgICAgICAgcHJvdG9jb2wtPkdldFBvc2l0aW9uKCZuZXdfb2Zmc2V0KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVlNFRUtfU0laRToKLSAgICAgIHByb3RvY29sLT5HZXRTaXplKCZuZXdfb2Zmc2V0KTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIE5PVFJFQUNIRUQoKTsKLSAgfQotICBpZiAobmV3X29mZnNldCA8IDApCi0gICAgbmV3X29mZnNldCA9IEFWRVJST1IoRUlPKTsKLSAgcmV0dXJuIG5ld19vZmZzZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgTG9ja01hbmFnZXJPcGVyYXRpb24odm9pZCoqIGxvY2ssIGVudW0gQVZMb2NrT3Agb3ApIHsKLSAgc3dpdGNoIChvcCkgewotICAgIGNhc2UgQVZfTE9DS19DUkVBVEU6Ci0gICAgICAqbG9jayA9IG5ldyBiYXNlOjpMb2NrKCk7Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgQVZfTE9DS19PQlRBSU46Ci0gICAgICBzdGF0aWNfY2FzdDxiYXNlOjpMb2NrKj4oKmxvY2spLT5BY3F1aXJlKCk7Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgQVZfTE9DS19SRUxFQVNFOgotICAgICAgc3RhdGljX2Nhc3Q8YmFzZTo6TG9jayo+KCpsb2NrKS0+UmVsZWFzZSgpOwotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXNlIEFWX0xPQ0tfREVTVFJPWToKLSAgICAgIGRlbGV0ZSBzdGF0aWNfY2FzdDxiYXNlOjpMb2NrKj4oKmxvY2spOwotICAgICAgKmxvY2sgPSBOVUxMOwotICAgICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8vIEZGbXBlZyBtdXN0IG9ubHkgYmUgaW5pdGlhbGl6ZWQgb25jZSwgc28gdXNlIGEgTGF6eUluc3RhbmNlIHRvIGVuc3VyZSB0aGlzLgotY2xhc3MgRkZtcGVnSW5pdGlhbGl6ZXIgewotIHB1YmxpYzoKLSAgYm9vbCBpbml0aWFsaXplZCgpIHsgcmV0dXJuIGluaXRpYWxpemVkXzsgfQotCi0gcHJpdmF0ZToKLSAgZnJpZW5kIHN0cnVjdCBiYXNlOjpEZWZhdWx0TGF6eUluc3RhbmNlVHJhaXRzPEZGbXBlZ0luaXRpYWxpemVyPjsKLQotICBGRm1wZWdJbml0aWFsaXplcigpCi0gICAgICA6IGluaXRpYWxpemVkXyhmYWxzZSkgewotICAgIC8vIEJlZm9yZSBkb2luZyBhbnl0aGluZyBkaXNhYmxlIGxvZ2dpbmcgYXMgaXQgaW50ZXJmZXJlcyB3aXRoIGxheW91dCB0ZXN0cy4KLSAgICBhdl9sb2dfc2V0X2xldmVsKEFWX0xPR19RVUlFVCk7Ci0KLSAgICAvLyBSZWdpc3RlciBvdXIgcHJvdG9jb2wgZ2x1ZSBjb2RlIHdpdGggRkZtcGVnLgotICAgIGlmIChhdl9sb2NrbWdyX3JlZ2lzdGVyKCZMb2NrTWFuYWdlck9wZXJhdGlvbikgIT0gMCkKLSAgICAgIHJldHVybjsKLQotICAgIC8vIE5vdyByZWdpc3RlciB0aGUgcmVzdCBvZiBGRm1wZWcuCi0gICAgYXZfcmVnaXN0ZXJfYWxsKCk7Ci0KLSAgICBpbml0aWFsaXplZF8gPSB0cnVlOwotICB9Ci0KLSAgfkZGbXBlZ0luaXRpYWxpemVyKCkgewotICAgIE5PVFJFQUNIRUQoKSA8PCAiRkZtcGVnSW5pdGlhbGl6ZXIgc2hvdWxkIGJlIGxlYWt5ISI7Ci0gIH0KLQotICBib29sIGluaXRpYWxpemVkXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRkZtcGVnSW5pdGlhbGl6ZXIpOwotfTsKLQotdm9pZCBGRm1wZWdHbHVlOjpJbml0aWFsaXplRkZtcGVnKCkgewotICBzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPEZGbXBlZ0luaXRpYWxpemVyPjo6TGVha3kgbGkgPQotICAgICAgTEFaWV9JTlNUQU5DRV9JTklUSUFMSVpFUjsKLSAgQ0hFQ0sobGkuR2V0KCkuaW5pdGlhbGl6ZWQoKSk7Ci19Ci0KLUZGbXBlZ0dsdWU6OkZGbXBlZ0dsdWUoRkZtcGVnVVJMUHJvdG9jb2wqIHByb3RvY29sKQotICAgIDogb3Blbl9jYWxsZWRfKGZhbHNlKSB7Ci0gIEluaXRpYWxpemVGRm1wZWcoKTsKLQotICAvLyBJbml0aWFsaXplIGFuIEFWSU9Db250ZXh0IHVzaW5nIG91ciBjdXN0b20gcmVhZCBhbmQgc2VlayBvcGVyYXRpb25zLiAgRG9uJ3QKLSAgLy8ga2VlcCBwb2ludGVycyB0byB0aGUgYnVmZmVyIHNpbmNlIEZGbXBlZyBtYXkgcmVhbGxvY2F0ZSBpdCBvbiB0aGUgZmx5LiAgSXQKLSAgLy8gd2lsbCBiZSBjbGVhbmVkIHVwCi0gIGZvcm1hdF9jb250ZXh0XyA9IGF2Zm9ybWF0X2FsbG9jX2NvbnRleHQoKTsKLSAgYXZpb19jb250ZXh0Xy5yZXNldChhdmlvX2FsbG9jX2NvbnRleHQoCi0gICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyKj4oYXZfbWFsbG9jKGtCdWZmZXJTaXplKSksIGtCdWZmZXJTaXplLCAwLAotICAgICAgcHJvdG9jb2wsICZBVklPUmVhZE9wZXJhdGlvbiwgTlVMTCwgJkFWSU9TZWVrT3BlcmF0aW9uKSk7Ci0KLSAgLy8gRW5zdXJlIEZGbXBlZyBvbmx5IHRyaWVzIHRvIHNlZWsgb24gcmVzb3VyY2VzIHdlIGtub3cgdG8gYmUgc2Vla2FibGUuCi0gIGF2aW9fY29udGV4dF8tPnNlZWthYmxlID0KLSAgICAgIHByb3RvY29sLT5Jc1N0cmVhbWluZygpID8gMCA6IEFWSU9fU0VFS0FCTEVfTk9STUFMOwotCi0gIC8vIEVuc3VyZSB3cml0aW5nIGlzIGRpc2FibGVkLgotICBhdmlvX2NvbnRleHRfLT53cml0ZV9mbGFnID0gMDsKLQotICAvLyBUZWxsIHRoZSBmb3JtYXQgY29udGV4dCBhYm91dCBvdXIgY3VzdG9tIElPIGNvbnRleHQuICBhdmZvcm1hdF9vcGVuX2lucHV0KCkKLSAgLy8gd2lsbCBzZXQgdGhlIEFWRk1UX0ZMQUdfQ1VTVE9NX0lPIGZsYWcgZm9yIHVzLCBidXQgZG8gc28gaGVyZSB0byBlbnN1cmUgYW4KLSAgLy8gZWFybHkgZXJyb3Igc3RhdGUgZG9lc24ndCBjYXVzZSBGRm1wZWcgdG8gZnJlZSBvdXIgcmVzb3VyY2VzIGluIGVycm9yLgotICBmb3JtYXRfY29udGV4dF8tPmZsYWdzIHw9IEFWRk1UX0ZMQUdfQ1VTVE9NX0lPOwotICBmb3JtYXRfY29udGV4dF8tPnBiID0gYXZpb19jb250ZXh0Xy5nZXQoKTsKLX0KLQotYm9vbCBGRm1wZWdHbHVlOjpPcGVuQ29udGV4dCgpIHsKLSAgRENIRUNLKCFvcGVuX2NhbGxlZF8pIDw8ICJPcGVuQ29udGV4dCgpIHNob3VsZCd0IGJlIGNhbGxlZCB0d2ljZS4iOwotCi0gIC8vIElmIGF2Zm9ybWF0X29wZW5faW5wdXQoKSBpcyBjYWxsZWQgd2UgaGF2ZSB0byB0YWtlIGEgc2xpZ2h0bHkgZGlmZmVyZW50Ci0gIC8vIGRlc3RydWN0aW9uIHBhdGggdG8gYXZvaWQgZG91YmxlIGZyZWVzLgotICBvcGVuX2NhbGxlZF8gPSB0cnVlOwotCi0gIC8vIEJ5IHBhc3NpbmcgTlVMTCBmb3IgdGhlIGZpbGVuYW1lIChzZWNvbmQgcGFyYW1ldGVyKSB3ZSBhcmUgdGVsbGluZyBGRm1wZWcKLSAgLy8gdG8gdXNlIHRoZSBBVklPIGNvbnRleHQgd2Ugc2V0dXAgZnJvbSB0aGUgQVZGb3JtYXRDb250ZXh0IHN0cnVjdHVyZS4KLSAgcmV0dXJuIGF2Zm9ybWF0X29wZW5faW5wdXQoJmZvcm1hdF9jb250ZXh0XywgTlVMTCwgTlVMTCwgTlVMTCkgPT0gMDsKLX0KLQotRkZtcGVnR2x1ZTo6fkZGbXBlZ0dsdWUoKSB7Ci0gIC8vIEluIHRoZSBldmVudCBvZiBhdmZvcm1hdF9vcGVuX2lucHV0KCkgZmFpbHVyZSwgRkZtcGVnIG1heSBzb21ldGltZXMgZnJlZQotICAvLyBvdXIgQVZGb3JtYXRDb250ZXh0IGJlaGluZCB0aGUgc2NlbmVzLCBidXQgbGVhdmUgdGhlIGJ1ZmZlciBhbGl2ZS4gIEl0IHdpbGwKLSAgLy8gaGVscGZ1bGx5IHNldCB8Zm9ybWF0X2NvbnRleHRffCB0byBOVUxMIGluIHRoaXMgY2FzZS4KLSAgaWYgKCFmb3JtYXRfY29udGV4dF8pIHsKLSAgICBhdl9mcmVlKGF2aW9fY29udGV4dF8tPmJ1ZmZlcik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gSWYgYXZmb3JtYXRfb3Blbl9pbnB1dCgpIGhhc24ndCBiZWVuIGNhbGxlZCwgd2Ugc2hvdWxkIHNpbXBseSBmcmVlIHRoZQotICAvLyBBVkZvcm1hdENvbnRleHQgYW5kIGJ1ZmZlciBpbnN0ZWFkIG9mIHVzaW5nIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCkuCi0gIGlmICghb3Blbl9jYWxsZWRfKSB7Ci0gICAgYXZmb3JtYXRfZnJlZV9jb250ZXh0KGZvcm1hdF9jb250ZXh0Xyk7Ci0gICAgYXZfZnJlZShhdmlvX2NvbnRleHRfLT5idWZmZXIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIElmIGF2Zm9ybWF0X29wZW5faW5wdXQoKSBoYXMgYmVlbiBjYWxsZWQgd2l0aCB0aGlzIGNvbnRleHQsIHdlIG5lZWQgdG8KLSAgLy8gY2xvc2Ugb3V0IGFueSBjb2RlY3Mvc3RyZWFtcyBiZWZvcmUgY2xvc2luZyB0aGUgY29udGV4dC4KLSAgaWYgKGZvcm1hdF9jb250ZXh0Xy0+c3RyZWFtcykgewotICAgIGZvciAoaW50IGkgPSBmb3JtYXRfY29udGV4dF8tPm5iX3N0cmVhbXMgLSAxOyBpID49IDA7IC0taSkgewotICAgICAgQVZTdHJlYW0qIHN0cmVhbSA9IGZvcm1hdF9jb250ZXh0Xy0+c3RyZWFtc1tpXTsKLQotICAgICAgLy8gVGhlIGNvbmRpdGlvbnMgZm9yIGNhbGxpbmcgYXZjb2RlY19jbG9zZSgpOgotICAgICAgLy8gMS4gQVZTdHJlYW0gaXMgYWxpdmUuCi0gICAgICAvLyAyLiBBVkNvZGVjQ29udGV4dCBpbiBBVlN0cmVhbSBpcyBhbGl2ZS4KLSAgICAgIC8vIDMuIEFWQ29kZWMgaW4gQVZDb2RlY0NvbnRleHQgaXMgYWxpdmUuCi0gICAgICAvLwotICAgICAgLy8gQ2xvc2luZyBhIGNvZGVjIGNvbnRleHQgd2l0aG91dCBwcmlvciBhdmNvZGVjX29wZW4yKCkgd2lsbCByZXN1bHQgaW4KLSAgICAgIC8vIGEgY3Jhc2ggaW4gRkZtcGVnLgotICAgICAgaWYgKHN0cmVhbSAmJiBzdHJlYW0tPmNvZGVjICYmIHN0cmVhbS0+Y29kZWMtPmNvZGVjKSB7Ci0gICAgICAgIHN0cmVhbS0+ZGlzY2FyZCA9IEFWRElTQ0FSRF9BTEw7Ci0gICAgICAgIGF2Y29kZWNfY2xvc2Uoc3RyZWFtLT5jb2RlYyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgYXZmb3JtYXRfY2xvc2VfaW5wdXQoJmZvcm1hdF9jb250ZXh0Xyk7Ci0gIGF2X2ZyZWUoYXZpb19jb250ZXh0Xy0+YnVmZmVyKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9mZm1wZWdfZ2x1ZS5oIGIvc3JjL21lZGlhL2ZpbHRlcnMvZmZtcGVnX2dsdWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcyNDFiOS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9mZm1wZWdfZ2x1ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gRkZtcGVnR2x1ZSBpcyBhbiBpbnRlcmZhY2UgYmV0d2VlbiBGRm1wZWcgYW5kIENocm9tZSB1c2VkIHRvIHByb3h5IEZGbXBlZydzCi0vLyByZWFkIGFuZCBzZWVrIHJlcXVlc3RzIHRvIENocm9tZSdzIGludGVybmFsIGRhdGEgc3RydWN0dXJlcy4gIFRoZSBnbHVlIHdvcmtzCi0vLyB0aHJvdWdoIHRoZSBBVklPIGludGVyZmFjZSBwcm92aWRlZCBieSBGRm1wZWcuCi0vLwotLy8gQVZJTyB3b3JrcyB0aHJvdWdoIGEgc3BlY2lhbCBBVklPQ29udGV4dCBjcmVhdGVkIHRocm91Z2ggYXZpb19hbGxvY19jb250ZXh0KCkKLS8vIHdoaWNoIGlzIGF0dGFjaGVkIHRvIHRoZSBBVkZvcm1hdENvbnRleHQgdXNlZCBmb3IgZGVtdXhpbmcuICBUaGUgQVZJTyBjb250ZXh0Ci0vLyBpcyBpbml0aWFsaXplZCB3aXRoIHJlYWQgYW5kIHNlZWsgbWV0aG9kcyB3aGljaCBGRm1wZWcgY2FsbHMgd2hlbiBuZWNlc3NhcnkuCi0vLwotLy8gRHVyaW5nIE9wZW5Db250ZXh0KCkgRkZtcGVnR2x1ZSB3aWxsIHRlbGwgRkZtcGVnIHRvIHVzZSBDaHJvbWUncyBBVklPIGNvbnRleHQKLS8vIGJ5IHBhc3NpbmcgTlVMTCBpbiBmb3IgdGhlIGZpbGVuYW1lIHBhcmFtZXRlciB0byBhdmZvcm1hdF9vcGVuX2lucHV0KCkuICBBbGwKLS8vIEZGbXBlZyBvcGVyYXRpb25zIHVzaW5nIHRoZSBjb25maWd1cmVkIEFWRm9ybWF0Q29udGV4dCB3aWxsIHRoZW4gcmVkaXJlY3QKLS8vIHJlYWRzIGFuZCBzZWVrcyB0aHJvdWdoIHRoZSBnbHVlLgotLy8KLS8vIFRoZSBnbHVlIGluIHR1cm4gcHJvY2Vzc2VzIHRob3NlIHJlYWQgYW5kIHNlZWsgcmVxdWVzdHMgdXNpbmcgdGhlCi0vLyBGRm1wZWdVUkxQcm90b2NvbCBwcm92aWRlZCBkdXJpbmcgY29uc3RydWN0aW9uLgotLy8KLS8vIEZGbXBlZ0dsdWUgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgaW5pdGlhbGl6aW5nIEZGbXBlZywgd2hpY2ggaXMgZG9uZSBvbmNlCi0vLyBwZXIgcHJvY2Vzcy4gIEluaXRpYWxpemF0aW9uIGluY2x1ZGVzOiB0dXJuaW5nIG9mZiBsb2cgbWVzc2FnZXMsIHJlZ2lzdGVyaW5nCi0vLyBhIGxvY2sgbWFuYWdlciwgYW5kIGZpbmFsbHkgcmVnaXN0ZXJpbmcgYWxsIGRlbXV4ZXJzIGFuZCBjb2RlY3MuCi0KLSNpZm5kZWYgTUVESUFfRklMVEVSU19GRk1QRUdfR0xVRV9IXwotI2RlZmluZSBNRURJQV9GSUxURVJTX0ZGTVBFR19HTFVFX0hfCi0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCIKLQotc3RydWN0IEFWRm9ybWF0Q29udGV4dDsKLXN0cnVjdCBBVklPQ29udGV4dDsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgU2NvcGVkUHRyQVZGcmVlOwotCi1jbGFzcyBNRURJQV9FWFBPUlQgRkZtcGVnVVJMUHJvdG9jb2wgewotIHB1YmxpYzoKLSAgLy8gUmVhZCB0aGUgZ2l2ZW4gYW1vdW50IG9mIGJ5dGVzIGludG8gZGF0YSwgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQKLSAgLy8gaWYgc3VjY2Vzc2Z1bCwga1JlYWRFcnJvciBvdGhlcndpc2UuCi0gIHZpcnR1YWwgaW50IFJlYWQoaW50IHNpemUsIHVpbnQ4KiBkYXRhKSA9IDA7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGFuZCB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uIGZvciB0aGlzIGZpbGUsIGZhbHNlIGlmIHRoZQotICAvLyBmaWxlIHBvc2l0aW9uIGNvdWxkIG5vdCBiZSByZXRyaWV2ZWQuCi0gIHZpcnR1YWwgYm9vbCBHZXRQb3NpdGlvbihpbnQ2NCogcG9zaXRpb25fb3V0KSA9IDA7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlIHBvc2l0aW9uIGNvdWxkIGJlIHNldCwgZmFsc2Ugb3RoZXJ3aXNlLgotICB2aXJ0dWFsIGJvb2wgU2V0UG9zaXRpb24oaW50NjQgcG9zaXRpb24pID0gMDsKLQotICAvLyBSZXR1cm5zIHRydWUgYW5kIHRoZSBmaWxlIHNpemUsIGZhbHNlIGlmIHRoZSBmaWxlIHNpemUgY291bGQgbm90IGJlCi0gIC8vIHJldHJpZXZlZC4KLSAgdmlydHVhbCBib29sIEdldFNpemUoaW50NjQqIHNpemVfb3V0KSA9IDA7Ci0KLSAgLy8gUmV0dXJucyBmYWxzZSBpZiB0aGlzIHByb3RvY29sIHN1cHBvcnRzIHJhbmRvbSBzZWVraW5nLgotICB2aXJ0dWFsIGJvb2wgSXNTdHJlYW1pbmcoKSA9IDA7Ci19OwotCi1jbGFzcyBNRURJQV9FWFBPUlQgRkZtcGVnR2x1ZSB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCBJbml0aWFsaXplRkZtcGVnKCk7Ci0KLSAgLy8gU2VlIGZpbGUgZG9jdW1lbnRhdGlvbiBmb3IgdXNhZ2UuICB8cHJvdG9jb2x8IG11c3Qgb3V0bGl2ZSBGRm1wZWdHbHVlLgotICBleHBsaWNpdCBGRm1wZWdHbHVlKEZGbXBlZ1VSTFByb3RvY29sKiBwcm90b2NvbCk7Ci0gIH5GRm1wZWdHbHVlKCk7Ci0KLSAgLy8gT3BlbnMgYW4gQVZGb3JtYXRDb250ZXh0IHNwZWNpYWxseSBwcmVwYXJlZCB0byBwcm9jZXNzIHJlYWRzIGFuZCBzZWVrcwotICAvLyB0aHJvdWdoIHRoZSBGRm1wZWdVUkxQcm90b2NvbCBwcm92aWRlZCBkdXJpbmcgY29uc3RydWN0aW9uLgotICBib29sIE9wZW5Db250ZXh0KCk7Ci0gIEFWRm9ybWF0Q29udGV4dCogZm9ybWF0X2NvbnRleHQoKSB7IHJldHVybiBmb3JtYXRfY29udGV4dF87IH0KLQotIHByaXZhdGU6Ci0gIGJvb2wgb3Blbl9jYWxsZWRfOwotICBBVkZvcm1hdENvbnRleHQqIGZvcm1hdF9jb250ZXh0XzsKLSAgc2NvcGVkX3B0cl9tYWxsb2M8QVZJT0NvbnRleHQsIFNjb3BlZFB0ckFWRnJlZT4gYXZpb19jb250ZXh0XzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRkZtcGVnR2x1ZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9GSUxURVJTX0ZGTVBFR19HTFVFX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9mZm1wZWdfZ2x1ZV91bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9maWx0ZXJzL2ZmbXBlZ19nbHVlX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGQ1NmY5Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL2ZmbXBlZ19nbHVlX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tb2NrX2ZpbHRlcnMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3Rlc3RfZGF0YV91dGlsLmgiCi0jaW5jbHVkZSAibWVkaWEvZmZtcGVnL2ZmbXBlZ19jb21tb24uaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL2ZmbXBlZ19nbHVlLmgiCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9pbl9tZW1vcnlfdXJsX3Byb3RvY29sLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0KLXVzaW5nIDo6dGVzdGluZzo6XzsKLXVzaW5nIDo6dGVzdGluZzo6RG9BbGw7Ci11c2luZyA6OnRlc3Rpbmc6OkluU2VxdWVuY2U7Ci11c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKLXVzaW5nIDo6dGVzdGluZzo6U2V0QXJndW1lbnRQb2ludGVlOwotdXNpbmcgOjp0ZXN0aW5nOjpTdHJpY3RNb2NrOwotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBNb2NrUHJvdG9jb2wgOiBwdWJsaWMgRkZtcGVnVVJMUHJvdG9jb2wgewotIHB1YmxpYzoKLSAgTW9ja1Byb3RvY29sKCkge30KLQotICBNT0NLX01FVEhPRDIoUmVhZCwgaW50KGludCBzaXplLCB1aW50OCogZGF0YSkpOwotICBNT0NLX01FVEhPRDEoR2V0UG9zaXRpb24sIGJvb2woaW50NjQqIHBvc2l0aW9uX291dCkpOwotICBNT0NLX01FVEhPRDEoU2V0UG9zaXRpb24sIGJvb2woaW50NjQgcG9zaXRpb24pKTsKLSAgTU9DS19NRVRIT0QxKEdldFNpemUsIGJvb2woaW50NjQqIHNpemVfb3V0KSk7Ci0gIE1PQ0tfTUVUSE9EMChJc1N0cmVhbWluZywgYm9vbCgpKTsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNb2NrUHJvdG9jb2wpOwotfTsKLQotY2xhc3MgRkZtcGVnR2x1ZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gIEZGbXBlZ0dsdWVUZXN0KCkKLSAgICAgIDogcHJvdG9jb2xfKG5ldyBTdHJpY3RNb2NrPE1vY2tQcm90b2NvbD4oKSkgewotICAgIC8vIElzU3RyZWFtaW5nKCkgaXMgY2FsbGVkIHdoZW4gb3BlbmluZy4KLSAgICBFWFBFQ1RfQ0FMTCgqcHJvdG9jb2xfLmdldCgpLCBJc1N0cmVhbWluZygpKS5XaWxsT25jZShSZXR1cm4odHJ1ZSkpOwotICAgIGdsdWVfLnJlc2V0KG5ldyBGRm1wZWdHbHVlKHByb3RvY29sXy5nZXQoKSkpOwotICAgIENIRUNLKGdsdWVfLT5mb3JtYXRfY29udGV4dCgpKTsKLSAgICBDSEVDSyhnbHVlXy0+Zm9ybWF0X2NvbnRleHQoKS0+cGIpOwotICB9Ci0KLSAgdmlydHVhbCB+RkZtcGVnR2x1ZVRlc3QoKSB7Ci0gICAgLy8gRW5zdXJlIHxnbHVlX3wgYW5kIHxwcm90b2NvbF98IGFyZSBzdGlsbCBhbGl2ZS4KLSAgICBDSEVDSyhnbHVlXy5nZXQoKSk7Ci0gICAgQ0hFQ0socHJvdG9jb2xfLmdldCgpKTsKLQotICAgIC8vIHxwcm90b2NvbF98IHNob3VsZCBvdXRsaXZlIHxnbHVlX3wsIHNvIGVuc3VyZSBpdCdzIGRlc3RydWN0ZWQgZmlyc3QuCi0gICAgZ2x1ZV8ucmVzZXQoKTsKLSAgfQotCi0gIGludCBSZWFkUGFja2V0KGludCBzaXplLCB1aW50OCogZGF0YSkgewotICAgIHJldHVybiBnbHVlXy0+Zm9ybWF0X2NvbnRleHQoKS0+cGItPnJlYWRfcGFja2V0KAotICAgICAgICBwcm90b2NvbF8uZ2V0KCksIGRhdGEsIHNpemUpOwotICB9Ci0KLSAgaW50NjQgU2VlayhpbnQ2NCBvZmZzZXQsIGludCB3aGVuY2UpIHsKLSAgICByZXR1cm4gZ2x1ZV8tPmZvcm1hdF9jb250ZXh0KCktPnBiLT5zZWVrKHByb3RvY29sXy5nZXQoKSwgb2Zmc2V0LCB3aGVuY2UpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHNjb3BlZF9wdHI8RkZtcGVnR2x1ZT4gZ2x1ZV87Ci0gIHNjb3BlZF9wdHI8IFN0cmljdE1vY2s8TW9ja1Byb3RvY29sPiA+IHByb3RvY29sXzsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihGRm1wZWdHbHVlVGVzdCk7Ci19OwotCi1jbGFzcyBGRm1wZWdHbHVlRGVzdHJ1Y3Rpb25UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICBGRm1wZWdHbHVlRGVzdHJ1Y3Rpb25UZXN0KCkge30KLQotICB2b2lkIEluaXRpYWxpemUoY29uc3QgY2hhciogZmlsZW5hbWUpIHsKLSAgICBkYXRhXyA9IFJlYWRUZXN0RGF0YUZpbGUoZmlsZW5hbWUpOwotICAgIHByb3RvY29sXy5yZXNldChuZXcgSW5NZW1vcnlVcmxQcm90b2NvbCgKLSAgICAgICAgZGF0YV8tPkdldERhdGEoKSwgZGF0YV8tPkdldERhdGFTaXplKCksIGZhbHNlKSk7Ci0gICAgZ2x1ZV8ucmVzZXQobmV3IEZGbXBlZ0dsdWUocHJvdG9jb2xfLmdldCgpKSk7Ci0gICAgQ0hFQ0soZ2x1ZV8tPmZvcm1hdF9jb250ZXh0KCkpOwotICAgIENIRUNLKGdsdWVfLT5mb3JtYXRfY29udGV4dCgpLT5wYik7Ci0gIH0KLQotICB2aXJ0dWFsIH5GRm1wZWdHbHVlRGVzdHJ1Y3Rpb25UZXN0KCkgewotICAgIC8vIEVuc3VyZSBJbml0aWFsaXplKCkgd2FzIGNhbGxlZC4KLSAgICBDSEVDSyhnbHVlXy5nZXQoKSk7Ci0gICAgQ0hFQ0socHJvdG9jb2xfLmdldCgpKTsKLQotICAgIC8vIHxnbHVlX3wgc2hvdWxkIGJlIGRlc3Ryb3llZCBiZWZvcmUgfHByb3RvY29sX3wuCi0gICAgZ2x1ZV8ucmVzZXQoKTsKLQotICAgIC8vIHxwcm90b2NvbF98IHNob3VsZCBiZSBkZXN0cm95ZWQgYmVmb3JlIHxkYXRhX3wuCi0gICAgcHJvdG9jb2xfLnJlc2V0KCk7Ci0gICAgZGF0YV8gPSBOVUxMOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHNjb3BlZF9wdHI8RkZtcGVnR2x1ZT4gZ2x1ZV87Ci0KLSBwcml2YXRlOgotICBzY29wZWRfcHRyPEluTWVtb3J5VXJsUHJvdG9jb2w+IHByb3RvY29sXzsKLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBkYXRhXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRkZtcGVnR2x1ZURlc3RydWN0aW9uVGVzdCk7Ci19OwotCi0vLyBFbnN1cmUgd3JpdGluZyBoYXMgYmVlbiBkaXNhYmxlZC4KLVRFU1RfRihGRm1wZWdHbHVlVGVzdCwgV3JpdGUpIHsKLSAgQVNTRVJUX0ZBTFNFKGdsdWVfLT5mb3JtYXRfY29udGV4dCgpLT5wYi0+d3JpdGVfcGFja2V0KTsKLSAgQVNTRVJUX0ZBTFNFKGdsdWVfLT5mb3JtYXRfY29udGV4dCgpLT5wYi0+d3JpdGVfZmxhZyk7Ci19Ci0KLS8vIFRlc3QgYm90aCBzdWNjZXNzZnVsIGFuZCB1bnN1Y2Nlc3NmdWwgcmVhZHMgcGFzcyB0aHJvdWdoIGNvcnJlY3RseS4KLVRFU1RfRihGRm1wZWdHbHVlVGVzdCwgUmVhZCkgewotICBjb25zdCBpbnQga0J1ZmZlclNpemUgPSAxNjsKLSAgdWludDggYnVmZmVyW2tCdWZmZXJTaXplXTsKLQotICAvLyBSZWFkcyBhcmUgZm9yIHRoZSBtb3N0IHBhcnQgc3RyYWlnaHQtdGhyb3VnaCBjYWxscyB0byBSZWFkKCkuCi0gIEluU2VxdWVuY2UgczsKLSAgRVhQRUNUX0NBTEwoKnByb3RvY29sXywgUmVhZCgwLCBidWZmZXIpKQotICAgICAgLldpbGxPbmNlKFJldHVybigwKSk7Ci0gIEVYUEVDVF9DQUxMKCpwcm90b2NvbF8sIFJlYWQoa0J1ZmZlclNpemUsIGJ1ZmZlcikpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKGtCdWZmZXJTaXplKSk7Ci0gIEVYUEVDVF9DQUxMKCpwcm90b2NvbF8sIFJlYWQoa0J1ZmZlclNpemUsIGJ1ZmZlcikpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKERhdGFTb3VyY2U6OmtSZWFkRXJyb3IpKTsKLQotICBFWFBFQ1RfRVEoMCwgUmVhZFBhY2tldCgwLCBidWZmZXIpKTsKLSAgRVhQRUNUX0VRKGtCdWZmZXJTaXplLCBSZWFkUGFja2V0KGtCdWZmZXJTaXplLCBidWZmZXIpKTsKLSAgRVhQRUNUX0VRKEFWRVJST1IoRUlPKSwgUmVhZFBhY2tldChrQnVmZmVyU2l6ZSwgYnVmZmVyKSk7Ci19Ci0KLS8vIFRlc3QgYSB2YXJpZXR5IG9mIHNlZWsgb3BlcmF0aW9ucy4KLVRFU1RfRihGRm1wZWdHbHVlVGVzdCwgU2VlaykgewotICAvLyBTRUVLX1NFVCBzaG91bGQgYmUgYSBzdHJhaWdodC10aHJvdWdoIGNhbGwgdG8gU2V0UG9zaXRpb24oKSwgd2hpY2ggd2hlbgotICAvLyBzdWNjZXNzZnVsIHdpbGwgcmV0dXJuIHRoZSByZXN1bHQgZnJvbSBHZXRQb3NpdGlvbigpLgotICBJblNlcXVlbmNlIHM7Ci0gIEVYUEVDVF9DQUxMKCpwcm90b2NvbF8sIFNldFBvc2l0aW9uKC0xNikpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKGZhbHNlKSk7Ci0KLSAgRVhQRUNUX0NBTEwoKnByb3RvY29sXywgU2V0UG9zaXRpb24oMTYpKQotICAgICAgLldpbGxPbmNlKFJldHVybih0cnVlKSk7Ci0gIEVYUEVDVF9DQUxMKCpwcm90b2NvbF8sIEdldFBvc2l0aW9uKF8pKQotICAgICAgLldpbGxPbmNlKERvQWxsKFNldEFyZ3VtZW50UG9pbnRlZTwwPig4KSwgUmV0dXJuKHRydWUpKSk7Ci0KLSAgRVhQRUNUX0VRKEFWRVJST1IoRUlPKSwgU2VlaygtMTYsIFNFRUtfU0VUKSk7Ci0gIEVYUEVDVF9FUSg4LCBTZWVrKDE2LCBTRUVLX1NFVCkpOwotCi0gIC8vIFNFRUtfQ1VSIHNob3VsZCBjYWxsIEdldFBvc2l0aW9uKCkgZmlyc3QsIGFuZCBpZiBpdCBzdWNjZWVkcyBhZGQgdGhlIG9mZnNldAotICAvLyB0byB0aGUgcmVzdWx0IHRoZW4gY2FsbCBTZXRQb3NpdGlvbigpK0dldFBvc2l0aW9uKCkuCi0gIEVYUEVDVF9DQUxMKCpwcm90b2NvbF8sIEdldFBvc2l0aW9uKF8pKQotICAgICAgLldpbGxPbmNlKFJldHVybihmYWxzZSkpOwotCi0gIEVYUEVDVF9DQUxMKCpwcm90b2NvbF8sIEdldFBvc2l0aW9uKF8pKQotICAgICAgLldpbGxPbmNlKERvQWxsKFNldEFyZ3VtZW50UG9pbnRlZTwwPig4KSwgUmV0dXJuKHRydWUpKSk7Ci0gIEVYUEVDVF9DQUxMKCpwcm90b2NvbF8sIFNldFBvc2l0aW9uKDE2KSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oZmFsc2UpKTsKLQotICBFWFBFQ1RfQ0FMTCgqcHJvdG9jb2xfLCBHZXRQb3NpdGlvbihfKSkKLSAgICAgIC5XaWxsT25jZShEb0FsbChTZXRBcmd1bWVudFBvaW50ZWU8MD4oOCksIFJldHVybih0cnVlKSkpOwotICBFWFBFQ1RfQ0FMTCgqcHJvdG9jb2xfLCBTZXRQb3NpdGlvbigxNikpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKLSAgRVhQRUNUX0NBTEwoKnByb3RvY29sXywgR2V0UG9zaXRpb24oXykpCi0gICAgICAuV2lsbE9uY2UoRG9BbGwoU2V0QXJndW1lbnRQb2ludGVlPDA+KDE2KSwgUmV0dXJuKHRydWUpKSk7Ci0KLSAgRVhQRUNUX0VRKEFWRVJST1IoRUlPKSwgU2Vlayg4LCBTRUVLX0NVUikpOwotICBFWFBFQ1RfRVEoQVZFUlJPUihFSU8pLCBTZWVrKDgsIFNFRUtfQ1VSKSk7Ci0gIEVYUEVDVF9FUSgxNiwgU2Vlayg4LCBTRUVLX0NVUikpOwotCi0gIC8vIFNFRUtfRU5EIHNob3VsZCBjYWxsIEdldFNpemUoKSBmaXJzdCwgYW5kIGlmIGl0IHN1Y2NlZWRzIGFkZCB0aGUgb2Zmc2V0Ci0gIC8vIHRvIHRoZSByZXN1bHQgdGhlbiBjYWxsIFNldFBvc2l0aW9uKCkrR2V0UG9zaXRpb24oKS4KLSAgRVhQRUNUX0NBTEwoKnByb3RvY29sXywgR2V0U2l6ZShfKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oZmFsc2UpKTsKLQotICBFWFBFQ1RfQ0FMTCgqcHJvdG9jb2xfLCBHZXRTaXplKF8pKQotICAgICAgLldpbGxPbmNlKERvQWxsKFNldEFyZ3VtZW50UG9pbnRlZTwwPigxNiksIFJldHVybih0cnVlKSkpOwotICBFWFBFQ1RfQ0FMTCgqcHJvdG9jb2xfLCBTZXRQb3NpdGlvbig4KSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oZmFsc2UpKTsKLQotICBFWFBFQ1RfQ0FMTCgqcHJvdG9jb2xfLCBHZXRTaXplKF8pKQotICAgICAgLldpbGxPbmNlKERvQWxsKFNldEFyZ3VtZW50UG9pbnRlZTwwPigxNiksIFJldHVybih0cnVlKSkpOwotICBFWFBFQ1RfQ0FMTCgqcHJvdG9jb2xfLCBTZXRQb3NpdGlvbig4KSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4odHJ1ZSkpOwotICBFWFBFQ1RfQ0FMTCgqcHJvdG9jb2xfLCBHZXRQb3NpdGlvbihfKSkKLSAgICAgIC5XaWxsT25jZShEb0FsbChTZXRBcmd1bWVudFBvaW50ZWU8MD4oOCksIFJldHVybih0cnVlKSkpOwotCi0gIEVYUEVDVF9FUShBVkVSUk9SKEVJTyksIFNlZWsoLTgsIFNFRUtfRU5EKSk7Ci0gIEVYUEVDVF9FUShBVkVSUk9SKEVJTyksIFNlZWsoLTgsIFNFRUtfRU5EKSk7Ci0gIEVYUEVDVF9FUSg4LCBTZWVrKC04LCBTRUVLX0VORCkpOwotCi0gIC8vIEFWU0VFS19TSVpFIHNob3VsZCBiZSBhIHN0cmFpZ2h0LXRocm91Z2ggY2FsbCB0byBHZXRTaXplKCkuCi0gIEVYUEVDVF9DQUxMKCpwcm90b2NvbF8sIEdldFNpemUoXykpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKGZhbHNlKSk7Ci0KLSAgRVhQRUNUX0NBTEwoKnByb3RvY29sXywgR2V0U2l6ZShfKSkKLSAgICAgIC5XaWxsT25jZShEb0FsbChTZXRBcmd1bWVudFBvaW50ZWU8MD4oMTYpLCBSZXR1cm4odHJ1ZSkpKTsKLQotICBFWFBFQ1RfRVEoQVZFUlJPUihFSU8pLCBTZWVrKDAsIEFWU0VFS19TSVpFKSk7Ci0gIEVYUEVDVF9FUSgxNiwgU2VlaygwLCBBVlNFRUtfU0laRSkpOwotfQotCi0vLyBFbnN1cmUgZGVzdHJ1Y3Rpb24gcmVsZWFzZSB0aGUgYXBwcm9wcmlhdGUgcmVzb3VyY2VzIHdoZW4gT3BlbkNvbnRleHQoKSBpcwotLy8gbmV2ZXIgY2FsbGVkLgotVEVTVF9GKEZGbXBlZ0dsdWVEZXN0cnVjdGlvblRlc3QsIFdpdGhvdXRPcGVuKSB7Ci0gIEluaXRpYWxpemUoInRlbl9ieXRlX2ZpbGUiKTsKLX0KLQotLy8gRW5zdXJlIGRlc3RydWN0aW9uIHJlbGVhc2VzIHRoZSBhcHByb3ByaWF0ZSByZXNvdXJjZXMgd2hlbgotLy8gYXZmb3JtYXRfb3Blbl9pbnB1dCgpIGZhaWxzLgotVEVTVF9GKEZGbXBlZ0dsdWVEZXN0cnVjdGlvblRlc3QsIFdpdGhPcGVuRmFpbHVyZSkgewotICBJbml0aWFsaXplKCJ0ZW5fYnl0ZV9maWxlIik7Ci0gIEFTU0VSVF9GQUxTRShnbHVlXy0+T3BlbkNvbnRleHQoKSk7Ci19Ci0KLS8vIEVuc3VyZSBkZXN0cnVjdGlvbiByZWxlYXNlIHRoZSBhcHByb3ByaWF0ZSByZXNvdXJjZXMgd2hlbiBPcGVuQ29udGV4dCgpIGlzCi0vLyBjYWxsZWQsIGJ1dCBubyBzdHJlYW1zIGhhdmUgYmVlbiBvcGVuZWQuCi1URVNUX0YoRkZtcGVnR2x1ZURlc3RydWN0aW9uVGVzdCwgV2l0aE9wZW5Ob1N0cmVhbXMpIHsKLSAgSW5pdGlhbGl6ZSgibm9fc3RyZWFtcy53ZWJtIik7Ci0gIEFTU0VSVF9UUlVFKGdsdWVfLT5PcGVuQ29udGV4dCgpKTsKLX0KLQotLy8gRW5zdXJlIGRlc3RydWN0aW9uIHJlbGVhc2UgdGhlIGFwcHJvcHJpYXRlIHJlc291cmNlcyB3aGVuIE9wZW5Db250ZXh0KCkgaXMKLS8vIGNhbGxlZCBhbmQgc3RyZWFtcyBleGlzdC4KLVRFU1RfRihGRm1wZWdHbHVlRGVzdHJ1Y3Rpb25UZXN0LCBXaXRoT3BlbldpdGhTdHJlYW1zKSB7Ci0gIEluaXRpYWxpemUoImJlYXItMzIweDI0MC53ZWJtIik7Ci0gIEFTU0VSVF9UUlVFKGdsdWVfLT5PcGVuQ29udGV4dCgpKTsKLX0KLQotLy8gRW5zdXJlIGRlc3RydWN0aW9uIHJlbGVhc2UgdGhlIGFwcHJvcHJpYXRlIHJlc291cmNlcyB3aGVuIE9wZW5Db250ZXh0KCkgaXMKLS8vIGNhbGxlZCBhbmQgc3RyZWFtcyBoYXZlIGJlZW4gb3BlbmVkLgotVEVTVF9GKEZGbXBlZ0dsdWVEZXN0cnVjdGlvblRlc3QsIFdpdGhPcGVuV2l0aE9wZW5TdHJlYW1zKSB7Ci0gIEluaXRpYWxpemUoImJlYXItMzIweDI0MC53ZWJtIik7Ci0gIEFTU0VSVF9UUlVFKGdsdWVfLT5PcGVuQ29udGV4dCgpKTsKLSAgQVNTRVJUX0dUKGdsdWVfLT5mb3JtYXRfY29udGV4dCgpLT5uYl9zdHJlYW1zLCAwdSk7Ci0KLSAgQVZDb2RlY0NvbnRleHQqIGNvbnRleHQgPSBnbHVlXy0+Zm9ybWF0X2NvbnRleHQoKS0+c3RyZWFtc1swXS0+Y29kZWM7Ci0gIEFTU0VSVF9FUShhdmNvZGVjX29wZW4yKAotICAgICAgY29udGV4dCwgYXZjb2RlY19maW5kX2RlY29kZXIoY29udGV4dC0+Y29kZWNfaWQpLCBOVUxMKSwgMCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvZmZtcGVnX2gyNjRfdG9fYW5uZXhfYl9iaXRzdHJlYW1fY29udmVydGVyLmNjIGIvc3JjL21lZGlhL2ZpbHRlcnMvZmZtcGVnX2gyNjRfdG9fYW5uZXhfYl9iaXRzdHJlYW1fY29udmVydGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWYwM2Y1Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL2ZmbXBlZ19oMjY0X3RvX2FubmV4X2JfYml0c3RyZWFtX2NvbnZlcnRlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL2ZmbXBlZ19oMjY0X3RvX2FubmV4X2JfYml0c3RyZWFtX2NvbnZlcnRlci5oIgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAibWVkaWEvZmZtcGVnL2ZmbXBlZ19jb21tb24uaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotRkZtcGVnSDI2NFRvQW5uZXhCQml0c3RyZWFtQ29udmVydGVyOjpGRm1wZWdIMjY0VG9Bbm5leEJCaXRzdHJlYW1Db252ZXJ0ZXIoCi0gICAgQVZDb2RlY0NvbnRleHQqIHN0cmVhbV9jb250ZXh0KQotICAgIDogY29uZmlndXJhdGlvbl9wcm9jZXNzZWRfKGZhbHNlKSwKLSAgICAgIHN0cmVhbV9jb250ZXh0XyhzdHJlYW1fY29udGV4dCkgewotICBDSEVDSyhzdHJlYW1fY29udGV4dF8pOwotfQotCi1GRm1wZWdIMjY0VG9Bbm5leEJCaXRzdHJlYW1Db252ZXJ0ZXI6On5GRm1wZWdIMjY0VG9Bbm5leEJCaXRzdHJlYW1Db252ZXJ0ZXIoKSB7fQotCi1ib29sIEZGbXBlZ0gyNjRUb0FubmV4QkJpdHN0cmVhbUNvbnZlcnRlcjo6Q29udmVydFBhY2tldChBVlBhY2tldCogcGFja2V0KSB7Ci0gIHVpbnQzMiBvdXRwdXRfcGFja2V0X3NpemUgPSAwOwotICB1aW50MzIgY29uZmlndXJhdGlvbl9zaXplID0gMDsKLSAgdWludDMyIGlvX3NpemUgPSAwOwotICBpZiAocGFja2V0ID09IE5VTEwpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBDYWxjdWxhdGUgdGhlIG5lZWRlZCBvdXRwdXQgYnVmZmVyIHNpemUuCi0gIGlmICghY29uZmlndXJhdGlvbl9wcm9jZXNzZWRfKSB7Ci0gICAgLy8gRkZtcGVnJ3MgQVZDb2RlY0NvbnRleHQncyBleHRyYWRhdGEgZmllbGQgY29udGFpbnMgdGhlIERlY29kZXIKLSAgICAvLyBTcGVjaWZpYyBJbmZvcm1hdGlvbiBmcm9tIE1QNCBoZWFkZXJzIHRoYXQgY29udGFpbiB0aGUgSC4yNjQgU1BTIGFuZAotICAgIC8vIFBQUyBtZW1iZXJzLiBTZWUgSVNPL0lFQyAxNDQ5Ni0xNSBDaGFwdGVyIDUuMi40Ci0gICAgLy8gQVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQgZm9yIGV4YWN0IHNwZWNpZmljYXRpb24uCi0gICAgLy8gRXh0cmFkYXRhIG11c3QgYmUgYXQgbGVhc3QgNyBieXRlcyBsb25nLgotICAgIGlmIChzdHJlYW1fY29udGV4dF8tPmV4dHJhZGF0YSA9PSBOVUxMIHx8Ci0gICAgICAgIHN0cmVhbV9jb250ZXh0Xy0+ZXh0cmFkYXRhX3NpemUgPD0gNykgewotICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gQ2FuJ3QgZ28gb24gd2l0aCBjb252ZXJzaW9uIHdpdGhvdXQgY29uZmlndXJhdGlvbi4KLSAgICB9Ci0gICAgY29uZmlndXJhdGlvbl9zaXplICs9IGNvbnZlcnRlcl8uUGFyc2VDb25maWd1cmF0aW9uQW5kQ2FsY3VsYXRlU2l6ZSgKLSAgICAgICAgc3RyZWFtX2NvbnRleHRfLT5leHRyYWRhdGEsCi0gICAgICAgIHN0cmVhbV9jb250ZXh0Xy0+ZXh0cmFkYXRhX3NpemUpOwotICAgIGlmIChjb25maWd1cmF0aW9uX3NpemUgPT0gMCkgewotICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gTm90IHBvc3NpYmxlIHRvIHBhcnNlIHRoZSBjb25maWd1cmF0aW9uLgotICAgIH0KLSAgfQotICB1aW50MzIgb3V0cHV0X25hbF9zaXplID0KLSAgICAgIGNvbnZlcnRlcl8uQ2FsY3VsYXRlTmVlZGVkT3V0cHV0QnVmZmVyU2l6ZShwYWNrZXQtPmRhdGEsIHBhY2tldC0+c2l6ZSk7Ci0gIGlmIChvdXRwdXRfbmFsX3NpemUgPT0gMCkgewotICAgIHJldHVybiBmYWxzZTsgIC8vIEludmFsaWQgaW5wdXQgcGFja2V0LgotICB9Ci0gIG91dHB1dF9wYWNrZXRfc2l6ZSA9IGNvbmZpZ3VyYXRpb25fc2l6ZSArIG91dHB1dF9uYWxfc2l6ZTsKLQotICAvLyBBbGxvY2F0ZSBuZXcgcGFja2V0IGZvciB0aGUgb3V0cHV0LgotICBBVlBhY2tldCBkZXN0X3BhY2tldDsKLSAgaWYgKGF2X25ld19wYWNrZXQoJmRlc3RfcGFja2V0LCBvdXRwdXRfcGFja2V0X3NpemUpICE9IDApIHsKLSAgICByZXR1cm4gZmFsc2U7ICAvLyBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLgotICB9Ci0gIC8vIFRoaXMgaXMgYSBiaXQgdHJpY2t5OiBzaW5jZSB0aGUgaW50ZXJmYWNlIGRvZXMgbm90IGFsbG93IHVzIHRvIHJlcGxhY2UKLSAgLy8gdGhlIHBvaW50ZXIgb2YgdGhlIG9sZCBwYWNrZXQgd2l0aCBhIG5ldyBvbmUsIHdlIHdpbGwgaW5pdGlhbGx5IGNvcHkgdGhlCi0gIC8vIG1ldGFkYXRhIGZyb20gb2xkIHBhY2tldCB0byBuZXcgYmlnZ2VyIHBhY2tldC4KLSAgZGVzdF9wYWNrZXQucHRzID0gcGFja2V0LT5wdHM7Ci0gIGRlc3RfcGFja2V0LmR0cyA9IHBhY2tldC0+ZHRzOwotICBkZXN0X3BhY2tldC5wb3MgPSBwYWNrZXQtPnBvczsKLSAgZGVzdF9wYWNrZXQuZHVyYXRpb24gPSBwYWNrZXQtPmR1cmF0aW9uOwotICBkZXN0X3BhY2tldC5jb252ZXJnZW5jZV9kdXJhdGlvbiA9IHBhY2tldC0+Y29udmVyZ2VuY2VfZHVyYXRpb247Ci0gIGRlc3RfcGFja2V0LmZsYWdzID0gcGFja2V0LT5mbGFnczsKLSAgZGVzdF9wYWNrZXQuc3RyZWFtX2luZGV4ID0gcGFja2V0LT5zdHJlYW1faW5kZXg7Ci0KLSAgLy8gUHJvY2VzcyB0aGUgY29uZmlndXJhdGlvbiBpZiBub3QgZG9uZSBlYXJsaWVyLgotICBpZiAoIWNvbmZpZ3VyYXRpb25fcHJvY2Vzc2VkXykgewotICAgIGlmICghY29udmVydGVyXy5Db252ZXJ0QVZDRGVjb2RlckNvbmZpZ1RvQnl0ZVN0cmVhbSgKLSAgICAgICAgICAgIHN0cmVhbV9jb250ZXh0Xy0+ZXh0cmFkYXRhLCBzdHJlYW1fY29udGV4dF8tPmV4dHJhZGF0YV9zaXplLAotICAgICAgICAgICAgZGVzdF9wYWNrZXQuZGF0YSwgJmNvbmZpZ3VyYXRpb25fc2l6ZSkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsgIC8vIEZhaWxlZCB0byBjb252ZXJ0IHRoZSBidWZmZXIuCi0gICAgfQotICAgIGNvbmZpZ3VyYXRpb25fcHJvY2Vzc2VkXyA9IHRydWU7Ci0gIH0KLQotICAvLyBQcm9jZWVkIHdpdGggdGhlIGNvbnZlcnNpb24gb2YgdGhlIGFjdHVhbCBpbi1iYW5kIE5BTCB1bml0cywgbGVhdmUgcm9vbQotICAvLyBmb3IgY29uZmlndXJhdGlvbiBpbiB0aGUgYmVnaW5uaW5nLgotICBpb19zaXplID0gZGVzdF9wYWNrZXQuc2l6ZSAtIGNvbmZpZ3VyYXRpb25fc2l6ZTsKLSAgaWYgKCFjb252ZXJ0ZXJfLkNvbnZlcnROYWxVbml0U3RyZWFtVG9CeXRlU3RyZWFtKAotICAgICAgICAgIHBhY2tldC0+ZGF0YSwgcGFja2V0LT5zaXplLAotICAgICAgICAgIGRlc3RfcGFja2V0LmRhdGEgKyBjb25maWd1cmF0aW9uX3NpemUsICZpb19zaXplKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIEF0IHRoZSBlbmQgd2UgbXVzdCBkZXN0cm95IHRoZSBvbGQgcGFja2V0LgotICBhdl9mcmVlX3BhY2tldChwYWNrZXQpOwotICAqcGFja2V0ID0gZGVzdF9wYWNrZXQ7ICAvLyBGaW5hbGx5LCByZXBsYWNlIHRoZSB2YWx1ZXMgaW4gdGhlIGlucHV0IHBhY2tldC4KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL2ZmbXBlZ19oMjY0X3RvX2FubmV4X2JfYml0c3RyZWFtX2NvbnZlcnRlci5oIGIvc3JjL21lZGlhL2ZpbHRlcnMvZmZtcGVnX2gyNjRfdG9fYW5uZXhfYl9iaXRzdHJlYW1fY29udmVydGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZDBhNDguLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvZmZtcGVnX2gyNjRfdG9fYW5uZXhfYl9iaXRzdHJlYW1fY29udmVydGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0ZJTFRFUlNfRkZNUEVHX0gyNjRfVE9fQU5ORVhfQl9CSVRTVFJFQU1fQ09OVkVSVEVSX0hfCi0jZGVmaW5lIE1FRElBX0ZJTFRFUlNfRkZNUEVHX0gyNjRfVE9fQU5ORVhfQl9CSVRTVFJFQU1fQ09OVkVSVEVSX0hfCi0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL2gyNjRfdG9fYW5uZXhfYl9iaXRzdHJlYW1fY29udmVydGVyLmgiCi0KLS8vIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBGRm1wZWcgZGF0YXR5cGVzIHVzZWQuCi1zdHJ1Y3QgQVZDb2RlY0NvbnRleHQ7Ci1zdHJ1Y3QgQVZQYWNrZXQ7Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIEJpdHN0cmVhbSBjb252ZXJ0ZXIgdGhhdCBjb252ZXJ0cyBILjI2NCBiaXRzdHJlYW0gYmFzZWQgRkZtcGVnIHBhY2tldHMgaW50bwotLy8gSC4yNjQgQW5uZXggQiBieXRlc3RyZWFtIGZvcm1hdC4KLWNsYXNzIE1FRElBX0VYUE9SVCBGRm1wZWdIMjY0VG9Bbm5leEJCaXRzdHJlYW1Db252ZXJ0ZXIgewotIHB1YmxpYzoKLSAgLy8gVGhlIHxzdHJlYW1fY29udGV4dHwgd2lsbCBiZSB1c2VkIGR1cmluZyBjb252ZXJzaW9uIGFuZCBzaG91bGQgYmUgdGhlCi0gIC8vIEFWQ29kZWNDb250ZXh0IGZvciB0aGUgc3RyZWFtIHNvdXJjaW5nIHRoZXNlIHBhY2tldHMuIEEgcmVmZXJlbmNlIHRvCi0gIC8vIHxzdHJlYW1fY29udGV4dHwgaXMgcmV0YWluZWQsIHNvIGl0IG11c3Qgb3V0bGl2ZSB0aGlzIGNsYXNzLgotICBleHBsaWNpdCBGRm1wZWdIMjY0VG9Bbm5leEJCaXRzdHJlYW1Db252ZXJ0ZXIoQVZDb2RlY0NvbnRleHQqIHN0cmVhbV9jb250ZXh0KTsKLSAgfkZGbXBlZ0gyNjRUb0FubmV4QkJpdHN0cmVhbUNvbnZlcnRlcigpOwotCi0gIC8vIENvbnZlcnRzIHxwYWNrZXR8IHRvIEguMjY0IEFubmV4IEIgYnl0ZXN0cmVhbSBmb3JtYXQuIFRoaXMgY29udmVyc2lvbiBpcwotICAvLyBvbiBzaW5nbGUgTkFMIHVuaXQgYmFzaXMgd2hpY2ggaXMgY29udGFpbmVkIHdpdGhpbiB0aGUgfHBhY2tldHwgd2l0aCB0aGUKLSAgLy8gZXhjZXB0aW9uIG9mIHRoZSBmaXJzdCBwYWNrZXQgd2hpY2ggaXMgcHJlcGVuZGVkIHdpdGggdGhlIEFWQyBkZWNvZGVyCi0gIC8vIGNvbmZpZ3VyYXRpb24gcmVjb3JkIGluZm9ybWF0aW9uLiBGb3IgZXhhbXBsZToKLSAgLy8KLSAgLy8gICAgTkFMIHVuaXQgIzEgPT0+IGJ5dGVzdHJlYW0gYnVmZmVyICMxIChBVkMgY29uZmlndXJhaW9uICsgTkFMIHVuaXQgIzEpCi0gIC8vICAgIE5BTCB1bml0ICMyID09PiBieXRlc3RyZWFtIGJ1ZmZlciAjMiAoTkFMIHVuaXQgIzIpCi0gIC8vICAgIC4uLgotICAvLyAgICBOQUwgdW5pdCAjbiA9PT4gYnl0ZXN0cmVhbSBidWZmZXIgI24gKE5BTCB1bml0ICNuKQotICAvLwotICAvLyBSZXR1cm5zIHRydWUgaWYgY29udmVyc2lvbiBzdWNjZWVkZWQuIEluIHRoaXMgY2FzZSwgdGhlIG91dHB1dCB3aWxsIGJlCi0gIC8vIHN0b3JlZCBpbnRvIHRoZSB8cGFja2V0fC4gQnV0IHVzZXIgc2hvdWxkIGJlIGF3YXJlIHRoYXQgdGhpcyBjb252ZXJzaW9uIGNhbgotICAvLyBmcmVlIGFuZCByZWFsbG9jYXRlIHRoZSB8cGFja2V0fCwgaWYgaXQgbmVlZHMgdG8gZG8gc28gdG8gZml0IGl0IGluLgotICAvLyBGRm1wZWcgYWxsb2NhdGlvbiBtZXRob2RzIHdpbGwgYmUgdXNlZCBmb3IgYnVmZmVyIGFsbG9jYXRpb24gdG8gZW5zdXJlCi0gIC8vIGNvbXBhdGliaWxpdHkgd2l0aCBGRm1wZWcncyBtZW1vcnkgbWFuYWdlbWVudC4KLSAgLy8KLSAgLy8gUmV0dXJucyBmYWxzZSBpZiBjb252ZXJzaW9uIGZhaWxlZC4gSW4gdGhpcyBjYXNlLCB0aGUgfHBhY2tldHwgd2lsbCBub3QKLSAgLy8gYmUgY2hhbmdlZC4KLSAgYm9vbCBDb252ZXJ0UGFja2V0KEFWUGFja2V0KiBwYWNrZXQpOwotCi0gcHJpdmF0ZToKLSAgLy8gQWN0dWFsIGNvbnZlcnRlciBjbGFzcy4KLSAgSDI2NFRvQW5uZXhCQml0c3RyZWFtQ29udmVydGVyIGNvbnZlcnRlcl87Ci0KLSAgLy8gRmxhZyBmb3IgaW5kaWNhdGluZyB3aGV0aGVyIGdsb2JhbCBwYXJhbWV0ZXIgc2V0cyBoYXZlIGJlZW4gcHJvY2Vzc2VkLgotICBib29sIGNvbmZpZ3VyYXRpb25fcHJvY2Vzc2VkXzsKLQotICAvLyBWYXJpYWJsZSB0byBob2xkIGEgcG9pbnRlciB0byBtZW1vcnkgd2hlcmUgd2UgY2FuIGFjY2VzcyB0aGUgZ2xvYmFsCi0gIC8vIGRhdGEgZnJvbSB0aGUgRkZtcGVnIGZpbGUgZm9ybWF0J3MgZ2xvYmFsIGhlYWRlcnMuCi0gIEFWQ29kZWNDb250ZXh0KiBzdHJlYW1fY29udGV4dF87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEZGbXBlZ0gyNjRUb0FubmV4QkJpdHN0cmVhbUNvbnZlcnRlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9GSUxURVJTX0ZGTVBFR19IMjY0X1RPX0FOTkVYX0JfQklUU1RSRUFNX0NPTlZFUlRFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvZmZtcGVnX2gyNjRfdG9fYW5uZXhfYl9iaXRzdHJlYW1fY29udmVydGVyX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2ZpbHRlcnMvZmZtcGVnX2gyNjRfdG9fYW5uZXhfYl9iaXRzdHJlYW1fY29udmVydGVyX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODMxODgzLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL2ZmbXBlZ19oMjY0X3RvX2FubmV4X2JfYml0c3RyZWFtX2NvbnZlcnRlcl91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDM0NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvZmZtcGVnL2ZmbXBlZ19jb21tb24uaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL2ZmbXBlZ19oMjY0X3RvX2FubmV4X2JfYml0c3RyZWFtX2NvbnZlcnRlci5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBUZXN0IGRhdGEgYXJyYXlzLgotc3RhdGljIGNvbnN0IHVpbnQ4IGtIZWFkZXJEYXRhT2tXaXRoRmllbGRMZW40W10gPSB7Ci0gIDB4MDEsIDB4NDIsIDB4MDAsIDB4MjgsIDB4RkYsIDB4RTEsIDB4MDAsIDB4MDgsIDB4NjcsIDB4NDIsIDB4MDAsIDB4MjgsCi0gIDB4RTksIDB4MDUsIDB4ODksIDB4QzgsIDB4MDEsIDB4MDAsIDB4MDQsIDB4NjgsIDB4Q0UsIDB4MDYsIDB4RjIsIDB4MDAKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OCBrUGFja2V0RGF0YU9rV2l0aEZpZWxkTGVuNFtdID0gewotICAweDAwLCAweDAwLCAweDBCLCAweEY3LCAweDY1LCAweEI4LCAweDQwLCAweDU3LCAweDBCLCAweEYwLAotICAweERGLCAweEY4LCAweDAwLCAweDFGLCAweDc4LCAweDk4LCAweDU0LCAweEFDLCAweEYyLCAweDAwLCAweDA0LCAweDlELCAweDI2LAotICAweEUwLCAweDNCLCAweDVDLCAweDAwLCAweDBBLCAweDAwLCAweDhGLCAweDlFLCAweDg2LCAweDYzLCAweDFCLCAweDQ2LCAweEU3LAotICAweEQ2LCAweDQ1LCAweDg4LCAweDg4LCAweEVBLCAweDEwLCAweDg5LCAweDc5LCAweDAxLCAweDM0LCAweDMwLCAweDAxLCAweDhFLAotICAweDdELCAweDFBLCAweDM5LCAweDQ1LCAweDRFLCAweDY5LCAweDg2LCAweDEyLCAweEYyLCAweEU3LCAweENGLCAweDUwLCAweEY4LAotICAweDI2LCAweDU0LCAweDE3LCAweEJFLCAweDNGLCAweEM0LCAweDgwLCAweDMyLCAweEQ4LCAweDAyLCAweDMyLCAweEU0LCAweEFFLAotICAweERELCAweDM5LCAweDExLCAweDhFLCAweDU0LCAweDQyLCAweEFFLCAweEJELCAweDEyLCAweEE0LCAweENFLCAweEUyLCAweDk4LAotICAweDkxLCAweDA1LCAweEM0LCAweEE4LCAweDIwLCAweEM3LCAweEIzLCAweEQ5LCAweDQ3LCAweDczLCAweDA5LCAweEQ1LCAweENGLAotICAweDYyLCAweDU3LCAweDNGLCAweEZGLCAweEZELCAweEI5LCAweDk0LCAweDJCLCAweDNELCAweDEyLCAweDFBLCAweDg0LCAweDBCLAotICAweDI4LCAweEFELCAweDVDLCAweDlFLCAweDVDLCAweEMzLCAweEJCLCAweEJELCAweDdGLCAweEZFLCAweDA5LCAweDg3LCAweDc0LAotICAweDM5LCAweDFDLCAweEE1LCAweDBFLCAweDQ0LCAweEQ4LCAweDVELCAweDQxLCAweERCLCAweEFBLCAweEJDLCAweDA1LCAweDE2LAotICAweEEzLCAweDk4LCAweEVFLCAweEVFLCAweDlDLCAweEEwLCAweEYxLCAweDIzLCAweDkwLCAweEYwLCAweDVFLCAweDlGLCAweEY0LAotICAweEZBLCAweDdGLCAweDRCLCAweDY5LCAweDY2LCAweDQ5LCAweDUyLCAweERELCAweEQ2LCAweEMwLCAweDBGLCAweDhDLCAweDZFLAotICAweDgwLCAweERELCAweDdBLCAweERGLCAweDEwLCAweENELCAweDRCLCAweDU0LCAweDZGLCAweEZDLCAweDdELCAweDM0LCAweEJBLAotICAweDhCLCAweEQ0LCAweEQ5LCAweDMwLCAweDE4LCAweDlGLCAweDM5LCAweDA0LCAweDlGLCAweENCLCAweERCLCAweDFCLCAweEE3LAotICAweDcwLCAweDk2LCAweEFGLCAweEZGLCAweDZGLCAweEI1LCAweEJGLCAweDU4LCAweDAxLCAweDk4LCAweENELCAweEYyLCAweDY2LAotICAweDI4LCAweDFBLCAweEM0LCAweDlFLCAweDU4LCAweDQwLCAweDM5LCAweEFFLCAweDA3LCAweDExLCAweDNGLCAweEYyLCAweDlCLAotICAweDA2LCAweDlDLCAweEI4LCAweEM5LCAweDE2LCAweDEyLCAweDA5LCAweDhFLCAweEQyLCAweEQ0LCAweEY1LCAweEM2LCAweDc3LAotICAweDQwLCAweDBGLCAweEZELCAweDEyLCAweDE5LCAweDU1LCAweDFBLCAweDhFLCAweDlDLCAweDE4LCAweDhCLCAweDBELCAweDE4LAotICAweEZBLCAweEJBLCAweDdGLCAweEJCLCAweDgzLCAweEJCLCAweDg1LCAweEEwLCAweENDLCAweEFGLCAweEY2LCAweEVBLCAweDgxLAotICAweDEwLCAweDE4LCAweDhFLCAweDEwLCAweDAwLCAweENCLCAweDdGLCAweDI3LCAweDA4LCAweDA2LCAweERFLCAweDNDLCAweDIwLAotICAweEU1LCAweEZFLCAweENDLCAweDRGLCAweEIzLCAweDQxLCAweEUwLCAweENDLCAweDRDLCAweDI2LCAweEMxLCAweEMwLCAweDJDLAotICAweDE2LCAweDEyLCAweEFBLCAweDA0LCAweDgzLCAweDUxLCAweDRFLCAweENBLCAweDAwLCAweENGLCAweDQyLCAweDlDLCAweDA2LAotICAweDJELCAweDA2LCAweERELCAweDFELCAweDA4LCAweDc1LCAweEUwLCAweDg5LCAweEM3LCAweDYyLCAweDY4LCAweDJFLCAweEJGLAotICAweDRELCAweDJELCAweDBBLCAweEM0LCAweDg2LCAweEY2LCAweDJGLCAweEExLCAweDQ5LCAweEE3LCAweDBGLCAweERCLCAweDFGLAotICAweDgyLCAweEVDLCAweEMxLCAweDYyLCAweEZCLCAweDdGLCAweEYxLCAweEFFLCAweEE2LCAweDFBLCAweEQ1LCAweDZCLCAweDA2LAotICAweDVFLCAweEI2LCAweDAyLCAweDUwLCAweEFFLCAweDJELCAweEY5LCAweEQ5LCAweDk1LCAweEFELCAweDAxLCAweDhDLCAweDUzLAotICAweDAxLCAweEFGLCAweENFLCAweEU1LCAweEE1LCAweEJCLCAweDk1LCAweDhBLCAweDg1LCAweDcwLCAweDc3LCAweEUzLCAweDlBLAotICAweDY4LCAweDFCLCAweERGLCAweDQ3LCAweEY5LCAweEY0LCAweEJELCAweDgwLCAweDdELCAweDc2LCAweDlBLCAweDY5LCAweEZDLAotICAweEJFLCAweDE0LCAweDBELCAweDg3LCAweDA5LCAweDEyLCAweDk4LCAweDIwLCAweDA1LCAweDQ2LCAweEI3LCAweEFFLCAweDEwLAotICAweEI3LCAweDAxLCAweEI3LCAweERFLCAweDNCLCAweERELCAweDdBLCAweDhBLCAweDU1LCAweDczLCAweEFELCAweERGLCAweDY5LAotICAweERFLCAweEQwLCAweDUxLCAweDk3LCAweEEwLCAweEU2LCAweDVFLCAweEJBLCAweEJBLCAweDgwLCAweDBGLCAweDRFLCAweDlBLAotICAweDY4LCAweDM2LCAweEU2LCAweDlGLCAweDVCLCAweDM5LCAweEMwLCAweDkwLCAweEExLCAweEMwLCAweEMzLCAweDgyLCAweEU0LAotICAweDUwLCAweEVBLCAweDYwLCAweDdBLCAweERELCAweDVGLCAweDhCLCAweDVGLCAweEFGLCAweEZDLCAweDc0LCAweEFGLCAweERDLAotICAweDU2LCAweEY3LCAweDJFLCAweDNFLCAweDk3LCAweDZFLCAweDJCLCAweEYzLCAweEFGLCAweEZFLCAweDdELCAweDMyLCAweERDLAotICAweDU2LCAweEY4LCAweEFGLCAweEI1LCAweEEzLCAweEJCLCAweDAwLCAweDVCLCAweDg0LCAweDNELCAweDlGLCAweDBCLCAweDQwLAotICAweDg4LCAweDYxLCAweDVGLCAweDRGLCAweDRGLCAweEIwLCAweEIzLCAweDA3LCAweDgxLCAweDNFLCAweEYyLCAweEZCLCAweDUwLAotICAweENBLCAweDc3LCAweDQwLCAweDEyLCAweEE4LCAweEU2LCAweDExLCAweDhFLCAweEQ2LCAweDhBLCAweEM2LCAweEQ2LCAweDhDLAotICAweDFELCAweDYzLCAweDU1LCAweDNELCAweDM0LCAweEVBLCAweEMzLCAweEM2LCAweDZBLCAweEQyLCAweDhDLCAweEIwLCAweDFELAotICAweDVFLCAweDRBLCAweDdBLCAweDhCLCAweEQ1LCAweDk5LCAweDgwLCAweDg0LCAweDMyLCAweEZCLCAweEI3LCAweDAyLCAweDZFLAotICAweDYxLCAweEZFLCAweEFDLCAweDFCLCAweDVELCAweDEwLCAweDIzLCAweDI0LCAweEMzLCAweDhDLCAweDdCLCAweDU4LCAweDJDLAotICAweDRELCAweDA0LCAweDc0LCAweDg0LCAweDI1LCAweDEwLCAweDRFLCAweDk0LCAweDI5LCAweDRELCAweDg4LCAweEFFLCAweDY1LAotICAweDUzLCAweEI5LCAweDk1LCAweDRFLCAweEU3LCAweERELCAweEVFLCAweEYyLCAweDcwLCAweDFGLCAweDI2LCAweDRGLCAweEE4LAotICAweEJDLCAweDNELCAweDM1LCAweDAyLCAweDNCLCAweEMwLCAweDk4LCAweDcwLCAweDM4LCAweDE4LCAweEU1LCAweDFFLCAweDA1LAotICAweEFDLCAweDI4LCAweEFBLCAweDQ2LCAweDFBLCAweEIwLCAweDE5LCAweDk5LCAweDE4LCAweDM1LCAweDc4LCAweDFFLCAweDQxLAotICAweDYwLCAweDBELCAweDRGLCAweDdFLCAweEVDLCAweDM3LCAweEMzLCAweDMwLCAweDczLCAweDJBLCAweDY5LCAweEZFLCAweEVGLAotICAweDI3LCAweEVFLCAweDEzLCAweENDLCAweEQwLCAweERCLCAweEU2LCAweDQ1LCAweEVDLCAweDVDLCAweEI1LCAweDcxLCAweDU0LAotICAweDJFLCAweEIxLCAweEU5LCAweDg4LCAweEI0LCAweDNGLCAweDZGLCAweEZELCAweEY3LCAweEZGLCAweDlELCAweDJELCAweDUyLAotICAweDJFLCAweEFFLCAweEM5LCAweDk1LCAweERFLCAweEJGLCAweERGLCAweEZGLCAweEJGLCAweDIxLCAweEIzLCAweDJCLCAweEY1LAotICAweEY3LCAweEY3LCAweEQxLCAweEEwLCAweEYwLCAweDc2LCAweDY4LCAweDM3LCAweERCLCAweDhGLCAweDg1LCAweDRELCAweEE4LAotICAweDFBLCAweEY5LCAweDdGLCAweDc1LCAweEE3LCAweDkzLCAweEY1LCAweDAzLCAweEMxLCAweEYyLCAweDYwLCAweDhBLCAweDkyLAotICAweDUzLCAweEY1LCAweEQxLCAweEMxLCAweDU2LCAweDRCLCAweDY4LCAweDA1LCAweDE2LCAweDg4LCAweDYxLCAweEU3LCAweDE0LAotICAweEM4LCAweDBELCAweEYwLCAweERGLCAweEVGLCAweDQ2LCAweDRBLCAweEVELCAweDBCLCAweEQxLCAweEQxLCAweEQxLCAweEE0LAotICAweDg1LCAweEEzLCAweDJDLCAweDFELCAweERFLCAweDQ1LCAweDE0LCAweEExLCAweDhFLCAweEE4LCAweEQ5LCAweDhDLCAweEFCLAotICAweDQ3LCAweDMxLCAweEYxLCAweDAwLCAweDE1LCAweEFELCAweDgwLCAweDIwLCAweEFBLCAweEU0LCAweDU3LCAweEY4LCAweDA1LAotICAweDE0LCAweDU4LCAweDBCLCAweEQzLCAweDYzLCAweDAwLCAweDhGLCAweDQ0LCAweDE1LCAweDdGLCAweDE5LCAweEM3LCAweDBBLAotICAweEUwLCAweDQ5LCAweDMyLCAweEZFLCAweDM2LCAweDBFLCAweEYzLCAweDY2LCAweDEwLCAweDJCLCAweDExLCAweDczLCAweDNELAotICAweDE5LCAweDkyLCAweDIyLCAweDIwLCAweDc1LCAweDFGLCAweEYxLCAweERCLCAweDk2LCAweDczLCAweENGLCAweDFCLCAweDUzLAotICAweEZGLCAweEQyLCAweDIzLCAweEYyLCAweEI2LCAweEFBLCAweEI2LCAweDQ0LCAweEEzLCAweDczLCAweDdFLCAweDAwLCAweDJELAotICAweDRELCAweDRELCAweDg3LCAweEUwLCAweDg0LCAweDU1LCAweEQ2LCAweDAzLCAweEI4LCAweEQ4LCAweDkwLCAweEVGLCAweEMwLAotICAweDc2LCAweDVELCAweDY5LCAweDAyLCAweDAwLCAweDBFLCAweDE3LCAweEQwLCAweDAyLCAweDk2LCAweDUwLCAweEVBLCAweEFCLAotICAweEJGLCAweDBELCAweEFGLCAweENCLCAweEQzLCAweEZGLCAweEFBLCAweDlELCAweDdGLCAweEQ2LCAweEJELCAweDJDLCAweDE0LAotICAweEI0LCAweENELCAweDIwLCAweDczLCAweEI0LCAweEY0LCAweDM4LCAweDk2LCAweERFLCAweEIwLCAweDZCLCAweEU1LCAweDFCLAotICAweEZELCAweDBFLCAweDBCLCAweEE0LCAweDgxLCAweEJGLCAweEM4LCAweEEwLCAweDIxLCAweDc2LCAweDdCLCAweDI1LCAweDNGLAotICAweEU2LCAweDg0LCAweDQwLCAweDFBLCAweERBLCAweDI1LCAweDVBLCAweEZGLCAweDczLCAweDZCLCAweDE0LCAweDFCLCAweEY3LAotICAweDA4LCAweEZBLCAweDI2LCAweDczLCAweDdBLCAweDU4LCAweDAyLCAweDFBLCAweEU2LCAweDYzLCAweEI2LCAweDQ1LCAweDdCLAotICAweEUzLCAweEUwLCAweDgwLCAweDE0LCAweDQyLCAweEE4LCAweDdELCAweEYzLCAweDgwLCAweDlCLCAweDAxLCAweDQzLCAweDgyLAotICAweDgyLCAweDhDLCAweEJFLCAweDBELCAweEZELCAweEFFLCAweDg4LCAweEE4LCAweEI5LCAweEMzLCAweEVFLCAweEZGLCAweDQ2LAotICAweDAwLCAweDg0LCAweEU2LCAweEI0LCAweDBDLCAweEE5LCAweDY2LCAweEM2LCAweDc0LCAweDcyLCAweEFBLCAweEE0LCAweDNBLAotICAweEIwLCAweDFCLCAweDA2LCAweEI0LCAweERCLCAweEU4LCAweEMyLCAweDE3LCAweEEyLCAweEJDLCAweEJFLCAweDVDLCAweDBGLAotICAweDJBLCAweDc2LCAweEQ1LCAweEVFLCAweDM5LCAweDM2LCAweDdDLCAweDI1LCAweDk0LCAweDE1LCAweDNDLCAweEM5LCAweEI5LAotICAweDkzLCAweDA3LCAweDE5LCAweEFGLCAweEU2LCAweDcwLCAweEMzLCAweEY1LCAweEQ0LCAweDE3LCAweDg3LCAweDU3LCAweDc3LAotICAweDdELCAweENGLCAweDBELCAweERELCAweERFLCAweEI3LCAweEZGLCAweEI0LCAweERBLCAweDIwLCAweDQ1LCAweDFBLCAweDQ1LAotICAweEY0LCAweDU4LCAweDAxLCAweEJDLCAweEVCLCAweDNGLCAweDE2LCAweDdGLCAweDRDLCAweDE1LCAweDg0LCAweDhDLCAweEU1LAotICAweEY2LCAweDk2LCAweEE2LCAweEExLCAweEI5LCAweEIyLCAweDdGLCAweDZCLCAweEZGLCAweDMxLCAweEYyLCAweEY1LCAweEM5LAotICAweEZGLCAweDYxLCAweEVFLCAweEI1LCAweDg0LCAweEFFLCAweDY4LCAweDQxLCAweEVBLCAweEQwLCAweEYwLCAweEE1LCAweENFLAotICAweDBDLCAweEU2LCAweDRDLCAweDZELCAweDZELCAweDk0LCAweDA4LCAweEM5LCAweEE5LCAweDRBLCAweDYwLCAweDZELCAweDAxLAotICAweDNCLCAweEVGLCAweDRELCAweDk5LCAweDhELCAweDQyLCAweDJBLCAweDZCLCAweDhBLCAweEM3LCAweEZBLCAweEE5LCAweDkwLAotICAweDQwLCAweDAwLCAweDkwLCAweEYzLCAweEEwLCAweDc1LCAweDhFLCAweEQ1LCAweEZFLCAweEU3LCAweEJELCAweDAyLCAweDg3LAotICAweDBDLCAweDdELCAweEYwLCAweEFGLCAweDFFLCAweDVGLCAweDhELCAweEM4LCAweEUxLCAweEQ0LCAweDU2LCAweDA4LCAweEJGLAotICAweDc2LCAweDgwLCAweEQ0LCAweDE4LCAweDg5LCAweDJELCAweDU3LCAweERGLCAweDY2LCAweEQwLCAweDQ2LCAweDY4LCAweDc3LAotICAweDU1LCAweDQ3LCAweEY1LCAweDdDLCAweEY3LCAweEE2LCAweDY2LCAweEQ2LCAweDVBLCAweDY0LCAweDU1LCAweEQ0LCAweDgwLAotICAweEM0LCAweDU1LCAweEU5LCAweDM2LCAweDNGLCAweDVFLCAweEUyLCAweDVDLCAweDdGLCAweDVGLCAweENFLCAweDdGLCAweEUxLAotICAweDBDLCAweDgyLCAweDNELCAweDZCLCAweDZFLCAweEEyLCAweEVBLCAweDNCLCAweDFGLCAweEU4LCAweDlFLCAweEM3LCAweDRFLAotICAweDI0LCAweDNELCAweERELCAweEZBLCAweEVCLCAweDcxLCAweERGLCAweEZFLCAweDE1LCAweEZFLCAweDQxLCAweDlCLCAweEI0LAotICAweDRFLCAweEFCLCAweDUxLCAweEU1LCAweDFGLCAweDdELCAweDJELCAweEFDLCAweEQwLCAweDY2LCAweEQ5LCAweEExLCAweDU5LAotICAweDc4LCAweEM2LCAweEVGLCAweEM0LCAweDQzLCAweDA4LCAweDY1LCAweDE4LCAweDczLCAweERFLCAweDJBLCAweEFELCAweDcyLAotICAweEU3LCAweDVBLCAweDdFLCAweDMzLCAweDA0LCAweDcyLCAweDM4LCAweDU3LCAweDQ3LCAweDczLCAweDEwLCAweDFELCAweDg4LAotICAweDU3LCAweDRDLCAweERGLCAweEE3LCAweDc4LCAweDE2LCAweEZCLCAweDAxLCAweDIxLCAweDI4LCAweDJELCAweEI2LCAweDdFLAotICAweDA1LCAweDE4LCAweDMyLCAweDUyLCAweEMzLCAweDQ5LCAweDBCLCAweDMyLCAweDE4LCAweDEyLCAweDkzLCAweDU0LCAweDE1LAotICAweDNCLCAweEM4LCAweDZELCAweDRBLCAweDc3LCAweEVGLCAweDBBLCAweDQ2LCAweDgzLCAweDg5LCAweDVDLCAweDhCLCAweENCLAotICAweDE4LCAweEE2LCAweERDLCAweDk3LCAweDZGLCAweEVFLCAweEVFLCAweDAwLCAweDZBLCAweEYxLCAweDEwLCAweEZFLCAweDA3LAotICAweDBDLCAweEUwLCAweDUzLCAweEQyLCAweEI4LCAweDQ1LCAweEY0LCAweDZFLCAweDE2LCAweDRCLCAweEM5LCAweDlDLCAweEM3LAotICAweDkzLCAweDgzLCAweDIzLCAweDFELCAweDRELCAweDAwLCAweEI5LCAweDRGLCAweDg2LCAweDUxLCAweEYwLCAweDI5LCAweDY5LAotICAweDQxLCAweDIxLCAweEM1LCAweDRBLCAweEM2LCAweDZELCAweEQxLCAweDgxLCAweDM4LCAweERCLCAweDdDLCAweDA2LCAweEE4LAotICAweDI2LCAweDhFLCAweDcxLCAweDAwLCAweDRDLCAweDQ0LCAweDE0LCAweDA1LCAweEYyLCAweDFDLCAweDAwLCAweDQ5LCAweEZDLAotICAweDI5LCAweDZBLCAweEY5LCAweDlFLCAweEQxLCAweDM1LCAweDRCLCAweEI3LCAweEU1LCAweERCLCAweEZDLCAweDAxLCAweDA0LAotICAweDNGLCAweDcwLCAweDMzLCAweDU2LCAweDg3LCAweDY5LCAweDAxLCAweEI0LCAweENFLCAweDFDLCAweDRELCAweDJFLCAweDgzLAotICAweDUxLCAweDUxLCAweEQwLCAweDM3LCAweDNCLCAweEI0LCAweEJBLCAweDQ3LCAweEY1LCAweEZGLCAweEJGLCAweEZBLCAweEQ1LAotICAweDAzLCAweDY1LCAweEQzLCAweDI4LCAweDlGLCAweDM4LCAweDU3LCAweEZFLCAweDcxLCAweEQ4LCAweDlDLCAweDE2LCAweEVFLAotICAweDcyLCAweDE5LCAweDAzLCAweDE3LCAweDZFLCAweEMwLCAweEVDLCAweDQ5LCAweDNELCAweDk2LCAweEUyLCAweDMwLCAweDk3LAotICAweDk3LCAweDg0LCAweDM4LCAweDZCLCAweEU4LCAweDJFLCAweEFCLCAweDBFLCAweDJFLCAweDAzLCAweDUyLCAweEJBLCAweDY4LAotICAweDU1LCAweEJBLCAweDFELCAweDJDLCAweDQ3LCAweEFBLCAweDcyLCAweEFFLCAweDAyLCAweDMxLCAweDZFLCAweEExLCAweERDLAotICAweEFELCAweDBGLCAweDRBLCAweDQ2LCAweEM5LCAweEYyLCAweEE5LCAweEFCLCAweEZELCAweDg3LCAweDg5LCAweDVDLCAweEIzLAotICAweDc1LCAweDdFLCAweEUzLCAweERFLCAweDlGLCAweEM0LCAweDAyLCAweDFFLCAweEEyLCAweEY4LCAweDhCLCAweEQzLCAweDAwLAotICAweDgzLCAweDk2LCAweEM0LCAweEQwLCAweEI5LCAweDYyLCAweEI5LCAweDY5LCAweEVDLCAweDU2LCAweERGLCAweDdELCAweDkxLAotICAweDRCLCAweDY4LCAweDI3LCAweEE4LCAweDYxLCAweDc4LCAweEE3LCAweDk1LCAweDY2LCAweDUxLCAweDQxLCAweEY2LCAweENFLAotICAweDc4LCAweEQzLCAweDlBLCAweDkxLCAweEEwLCAweDMxLCAweDA5LCAweDQ3LCAweEI4LCAweDQ3LCAweEI4LCAweDQ0LCAweEUxLAotICAweDEzLCAweDg2LCAweDdFLCAweDkyLCAweDgwLCAweEM2LCAweDFBLCAweEY3LCAweDc5LCAweDdFLCAweEYxLCAweDVELCAweDlGLAotICAweDE3LCAweDJELCAweDgwLCAweDAwLCAweDc5LCAweDM0LCAweDdELCAweEUzLCAweEFELCAweDYwLCAweDAwLCAweDIwLCAweDA3LAotICAweDgwLCAweDAwLCAweDQwLCAweDAxLCAweEY4LCAweEExLCAweDg2LCAweEIxLCAweEVFLCAweDIxLCAweDYzLCAweDg1LCAweDYwLAotICAweDUxLCAweDg0LCAweDkwLCAweDdFLCAweDkyLCAweDA5LCAweDM5LCAweDFDLCAweDE2LCAweDg3LCAweDVDLCAweEE2LCAweDA5LAotICAweDkwLCAweDA2LCAweDM0LCAweDZFLCAweEI4LCAweDhELCAweDVELCAweEFDLCAweDc3LCAweDk3LCAweEI1LCAweDRELCAweDMwLAotICAweEZELCAweDM5LCAweEQwLCAweDUwLCAweDAwLCAweEM5LCAweDk4LCAweDA0LCAweDg2LCAweDAwLCAweDBELCAweEQ4LCAweDNFLAotICAweDM0LCAweEMyLCAweEE2LCAweDI1LCAweEY4LCAweDIwLCAweENDLCAweDZELCAweDlFLCAweDYzLCAweDA1LCAweDMwLCAweEM0LAotICAweEM2LCAweENDLCAweDU0LCAweDMxLCAweDlGLCAweDNDLCAweEY1LCAweDg2LCAweEI5LCAweDA4LCAweDE4LCAweEMzLCAweDFFLAotICAweEI5LCAweEEwLCAweDBDLCAweDQ1LCAweDJDLCAweDU0LCAweDMyLCAweDhCLCAweDg1LCAweDg2LCAweDU5LCAweEMzLCAweEIzLAotICAweDUwLCAweDVBLCAweEZFLCAweEJBLCAweEY3LCAweDRELCAweEM5LCAweDlDLCAweDlFLCAweDAxLCAweERGLCAweEQ3LCAweDZFLAotICAweEI1LCAweDE1LCAweDUzLCAweDA4LCAweDU3LCAweEE0LCAweDcxLCAweDM2LCAweDgwLCAweDQ2LCAweDA1LCAweDIxLCAweDQ4LAotICAweDdCLCAweDkxLCAweEM4LCAweEFBLCAweEZGLCAweDA3LCAweDlGLCAweDc4LCAweDY4LCAweENGLCAweDNDLCAweEVGLCAweEZGLAotICAweEJDLCAweEI2LCAweEEyLCAweDM2LCAweEI3LCAweDlGLCAweDU0LCAweEY2LCAweDZGLCAweDVELCAweERELCAweDc1LCAweEQ0LAotICAweDNDLCAweDc1LCAweEU4LCAweENGLCAweDE1LCAweDAyLCAweDVCLCAweDk0LCAweEMzLCAweEEyLCAweDQxLCAweDYzLCAweEExLAotICAweDE0LCAweEY2LCAweEMwLCAweDU3LCAweDE1LCAweDlGLCAweDBDLCAweDNGLCAweDgwLCAweEYyLCAweDk4LCAweEVFLCAweDQxLAotICAweDg1LCAweEVFLCAweEJDLCAweEFBLCAweEU5LCAweDU5LCAweEFBLCAweEEwLCAweDkyLCAweENBLCAweDAwLCAweEYzLCAweDUwLAotICAweENDLCAweEZGLCAweEFELCAweDk3LCAweDY5LCAweEE3LCAweEYyLCAweDBCLCAweDhGLCAweEQ3LCAweEQ3LCAweDgyLCAweDNBLAotICAweEJCLCAweDk4LCAweDFELCAweENCLCAweDg5LCAweDBCLCAweDlCLCAweDA1LCAweEY3LCAweEQwLCAweDFBLCAweDYwLCAweEYzLAotICAweDI5LCAweDE2LCAweDEyLCAweEY4LCAweEY0LCAweEYxLCAweDRBLCAweDA1LCAweDlCLCAweDU3LCAweDEyLCAweDdFLCAweDNBLAotICAweDRBLCAweDhELCAweEE2LCAweERGLCAweEI2LCAweERELCAweERGLCAweEMzLCAweEYwLCAweEQyLCAweEQ0LCAweEQ3LCAweDQxLAotICAweEE2LCAweDAwLCAweDc2LCAweDhDLCAweDc1LCAweDA4LCAweEYwLCAweDE5LCAweEQ4LCAweDE0LCAweDYzLCAweDU1LCAweDUyLAotICAweDE4LCAweDMwLCAweDk4LCAweEQwLCAweDNGLCAweDY1LCAweDUyLCAweEIzLCAweDg4LCAweDZELCAweDE3LCAweDM5LCAweDkzLAotICAweENBLCAweDNCLCAweEI0LCAweDFELCAweDhELCAweERGLCAweERGLCAweEFELCAweDcyLCAweERBLCAweDc0LCAweEFGLCAweEJELAotICAweDMxLCAweEY5LCAweDEyLCAweDYxLCAweDQ1LCAweDI5LCAweDRDLCAweDJCLCAweDYxLCAweEExLCAweDEyLCAweDkwLCAweDUzLAotICAweEU3LCAweDVBLCAweDlELCAweDQ0LCAweEM4LCAweDNBLCAweDgzLCAweERDLCAweDM0LCAweDRDLCAweDA3LCAweEFGLCAweERCLAotICAweDkwLCAweENELCAweDAzLCAweEE0LCAweDY0LCAweDc4LCAweEJELCAweDU1LCAweEIyLCAweDU2LCAweDU5LCAweDMyLCAweEFCLAotICAweDEzLCAweDJDLCAweEM5LCAweDc3LCAweEY4LCAweDNCLCAweERGLCAweEZGLCAweEFDLCAweDA3LCAweEI5LCAweDA4LCAweDdCLAotICAweEU5LCAweDgyLCAweEI5LCAweDU5LCAweEM3LCAweEZGLCAweDg2LCAweDJDLCAweDEyLCAweDdDLCAweEM2LCAweDY1LCAweDNDLAotICAweDcxLCAweEI4LCAweDk4LCAweDlGLCAweEEyLCAweDQ1LCAweDAzLCAweEE1LCAweEQ5LCAweEMzLCAweENGLCAweEZBLCAweEVCLAotICAweDg5LCAweEFELCAweDAzLCAweEVFLCAweERELCAweDc2LCAweEQzLCAweDRGLCAweDEwLCAweDZGLCAweEYwLCAweEMxLCAweDYwLAotICAweDBDLCAweDAwLCAweEQ0LCAweDc2LCAweDEyLCAweDBBLCAweDhELCAweERDLCAweEZELCAweDVFLCAweDBCLCAweDI2LCAweDJGLAotICAweDAxLCAweDFELCAweEI5LCAweEU3LCAweDczLCAweEQ0LCAweEYyLCAweENCLCAweEQ4LCAweDc4LCAweDIxLCAweDUyLCAweDRCLAotICAweDgzLCAweDNDLCAweDQ0LCAweDcyLCAweDBFLCAweEIxLCAweDRFLCAweDM3LCAweEJDLCAweEM3LCAweDUwLCAweEZBLCAweDA3LAotICAweDgwLCAweDcxLCAweDEwLCAweDBCLCAweDI0LCAweEQxLCAweDdFLCAweERBLCAweDdGLCAweEE3LCAweDJGLCAweDQwLCAweEFBLAotICAweEQzLCAweEY1LCAweDQ0LCAweDEwLCAweDU2LCAweDRFLCAweDNCLCAweEYxLCAweDZFLCAweDlBLCAweEEwLCAweEVBLCAweDg1LAotICAweDY2LCAweDE2LCAweEZCLCAweDVDLCAweDBCLCAweDJCLCAweDc0LCAweDE4LCAweEFGLCAweDNELCAweDA0LCAweDNFLCAweENFLAotICAweDg4LCAweDlCLCAweDNFLCAweEY0LCAweEI5LCAweDAwLCAweDYwLCAweDBFLCAweEUxLCAweEUyLCAweENCLCAweDEyLCAweEI5LAotICAweDZELCAweDVBLCAweEM3LCAweDU1LCAweDFELCAweEI5LCAweDc5LCAweEFDLCAweDQzLCAweDQzLCAweEU2LCAweDNCLCAweERELAotICAweDdFLCAweDlGLCAweDc4LCAweEQzLCAweEVBLCAweEEzLCAweDExLCAweEZGLCAweERCLCAweEJCLCAweEI4LCAweDk3LCAweDM3LAotICAweDE1LCAweERCLCAweEYxLCAweDk3LCAweDk2LCAweEM3LCAweEZDLCAweEU1LCAweEJGLCAweEYyLCAweDg2LCAweEMwLCAweEZBLAotICAweDlCLCAweDRDLCAweDAwLCAweDA0LCAweDAzLCAweEE1LCAweEI2LCAweEI3LCAweDlDLCAweEQ5LCAweEFCLCAweDA5LCAweDc3LAotICAweDUxLCAweDE4LCAweDNCLCAweEFELCAweDYxLCAweDZDLCAweEZDLCAweDUxLCAweDk2LCAweEZCLCAweDE5LCAweEM4LCAweDUyLAotICAweDM1LCAweDA3LCAweDAwLCAweDYzLCAweDg3LCAweDE0LCAweDA0LCAweEZBLCAweDdBLCAweDQ4LCAweDNFLCAweDAwLCAweDQ3LAotICAweDI5LCAweDA3LCAweDc0LCAweDk3LCAweDc0LCAweDg0LCAweEVCLCAweEIyLCAweDE2LCAweEIyLCAweDMxLCAweDgxLCAweENFLAotICAweDJBLCAweDMxLCAweEE3LCAweEIxLCAweEVCLCAweDgzLCAweDM0LCAweDdBLCAweDczLCAweEQ3LCAweDJGLCAweEZGLCAweEJDLAotICAweEZGLCAweEU1LCAweEFBLCAweEYyLCAweEI1LCAweDZFLCAweDlFLCAweEE1LCAweDcwLCAweDhBLCAweDhDLCAweERGLCAweDZBLAotICAweDA2LCAweDE2LCAweEMxLCAweEFCLCAweDU5LCAweDcwLCAweEQ5LCAweDNELCAweDQ3LCAweDdDLCAweERELCAweEVGLCAweERGLAotICAweDJGLCAweEZGLCAweDQyLCAweDZCLCAweEJBLCAweDRCLCAweEJGLCAweEY4LCAweDdGLCAweEYyLCAweDAzLCAweDBELCAweDc5LAotICAweEJDLCAweDAzLCAweDc2LCAweDY0LCAweDFDLCAweDBELCAweDdCLCAweEQ3LCAweEJELCAweEIwLCAweDZDLCAweEQ4LCAweDYxLAotICAweDE3LCAweDE3LCAweDhDLCAweEVELCAweDRFLCAweDIwLCAweEVCLCAweDU1LCAweDMzLCAweDM5LCAweEU5LCAweDdFLCAweEJFLAotICAweDhFLCAweDA1LCAweDRCLCAweDc4LCAweDk2LCAweDg1LCAweENDLCAweDY4LCAweEM5LCAweDc4LCAweEFGLCAweEFFLCAweDQ0LAotICAweDM2LCAweDYxLCAweEQzLCAweDUzLCAweEVCLCAweEIzLCAweDNFLCAweDRGLCAweDk3LCAweEUyLCAweDhELCAweEFFLCAweDkwLAotICAweEVELCAweEI1LCAweDRGLCAweDhFLCAweEU0LCAweDdBLCAweDQ0LCAweENGLCAweDlELCAweEM1LCAweDc3LCAweDRELCAweEFCLAotICAweDRGLCAweEU1LCAweEM1LCAweDczLCAweEEwLCAweEM4LCAweEE1LCAweEJCLCAweDRCLCAweDdELCAweEQ1LCAweEZCLCAweEZCLAotICAweEZGLCAweDYxLCAweEZELCAweEFBLCAweDFBLCAweDYyLCAweDdFLCAweDNDLCAweDY2LCAweDM0LCAweDE1LCAweDY0LCAweDI1LAotICAweEVDLCAweDdDLCAweDlELCAweDZBLCAweDY0LCAweDRELCAweDgwLCAweEQ1LCAweDRGLCAweEZFLCAweDhFLCAweEVFLCAweDE4LAotICAweDUzLCAweEMxLCAweDA5LCAweDUxLCAweEY3LCAweEMwLCAweEE2LCAweEIyLCAweDlCLCAweDE5LCAweDJCLCAweDE0LCAweDY2LAotICAweDY2LCAweDRCLCAweDM5LCAweDYyLCAweDFELCAweDg0LCAweEI5LCAweDAyLCAweDg0LCAweEFDLCAweEMxLCAweERBLCAweDZDLAotICAweDgwLCAweENELCAweDQwLCAweDIwLCAweDIwLCAweDE5LCAweDUxLCAweERDLCAweDJCLCAweDdELCAweDVELCAweDdGLCAweEUzLAotICAweDg2LCAweDhFLCAweEMzLCAweDM1LCAweEZFLCAweDVDLCAweEY2LCAweDFDLCAweEZGLCAweDA1LCAweDlFLCAweEI1LCAweEI2LAotICAweEJCLCAweEJFLCAweEY3LCAweDJGLCAweEI3LCAweEUxLCAweEY1LCAweDMzLCAweDg2LCAweEEwLCAweDQ3LCAweERFLCAweEY3LAotICAweEU5LCAweDNCLCAweEJFLCAweDdFLCAweDlCLCAweDE3LCAweEZDLCAweEZELCAweDJFLCAweDQwLCAweDg2LCAweDQxLCAweDc1LAotICAweEYxLCAweEIyLCAweDE4LCAweEE5LCAweERFLCAweDJELCAweEQ2LCAweDA0LCAweDIwLCAweEE0LCAweEJBLCAweDgxLCAweEJDLAotICAweDFELCAweDVBLCAweEQ2LCAweEY3LCAweEY2LCAweEI4LCAweDQyLCAweEY3LCAweEY1LCAweDNELCAweDk3LCAweEFDLCAweENELAotICAweDZGLCAweEFELCAweERCLCAweDRGLCAweDVBLCAweDJFLCAweDY0LCAweEI5LCAweDVELCAweERELCAweDhCLCAweDRBLCAweDM1LAotICAweDQ0LCAweEZFLCAweDNELCAweEM2LCAweDc3LCAweDdBLCAweEJGLCAweERBLCAweEFDLCAweDlFLCAweEIwLCAweEEyLCAweEI5LAotICAweDZDLCAweEFGLCAweDAyLCAweERELCAweEYyLCAweDcxLCAweDJCLCAweEVGLCAweEQzLCAweDUxLCAweDBFLCAweDA3LCAweDExLAotICAweEJELCAweEVELCAweDM5LCAweDdGLCAweEQ5LCAweEI4LCAweEJELCAweEVFLCAweDM1LCAweEU5LCAweDVDLCAweDY3LCAweDQyLAotICAweERBLCAweDA1LCAweDZFLCAweDM5LCAweENFLCAweDU1LCAweEZCLCAweDI2LCAweEI3LCAweDkwLCAweDRCLCAweERBLCAweDkxLAotICAweDQ4LCAweEZELCAweERFLCAweEIyLCAweEVDLCAweDg4LCAweDlBLCAweDQ2LCAweDFBLCAweDRDLCAweEQ0LCAweDA1LCAweDEyLAotICAweDg1LCAweDU3LCAweDM3LCAweDIyLCAweEQzLCAweDBFLCAweDRGLCAweDc5LCAweEUzLCAweDgxLCAweEE5LCAweDJCLCAweDVGLAotICAweEQ3LCAweDZELCAweEJELCAweDIxLCAweDk4LCAweDZGLCAweDdELCAweEY1LCAweDMyLCAweDdBLCAweDZFLCAweEY4LCAweDIwLAotICAweDAxLCAweDUwLCAweDkwLCAweDdBLCAweDg4LCAweDNFLCAweDBELCAweDU3LCAweEIxLCAweDU4LCAweDY1LCAweEU2LCAweDgyLAotICAweENFLCAweDA4LCAweDY5LCAweDhCLCAweDg3LCAweDYyLCAweDM2LCAweEIxLCAweDdCLCAweERFLCAweDc0LCAweEJELCAweEZFLAotICAweDEwLCAweEJFLCAweDI2LCAweEFCLCAweDdFLCAweEI3LCAweDhELCAweEY3LCAweDgzLCAweDJFLCAweDBGLCAweEFGLCAweDdFLAotICAweEJDLCAweDE3LCAweDMxLCAweEZGLCAweEIwLCAweDRGLCAweDdGLCAweDRCLCAweDEzLCAweDgzLCAweERGLCAweEVFLCAweDIzLAotICAweEQzLCAweEU3LCAweEM4LCAweEFGLCAweDc1LCAweEFCLCAweEVBLCAweEJELCAweDdELCAweEQyLCAweDlELCAweEU5LCAweEMxLAotICAweDE4LCAweDhCLCAweDdDLCAweDlGLCAweDUxLCAweERDLCAweDM3LCAweEEzLCAweERCLCAweEZDLCAweEQ0LCAweDZBLCAweDkxLAotICAweDQ0LCAweDdGLCAweDcyLCAweEM1LCAweEQ5LCAweEM4LCAweDM3LCAweDM4LCAweDYzLCAweDBELCAweDU5LCAweDhCLCAweDdGLAotICAweDdELCAweDk2LCAweEMxLCAweDVGLCAweDRDLCAweDdDLCAweDg4LCAweENCLCAweDY1LCAweDA3LCAweDJCLCAweDBFLCAweDFELAotICAweDI0LCAweEFBLCAweDIwLCAweDJFLCAweDZDLCAweDMzLCAweEFCLCAweEVGLCAweDIzLCAweEU1LCAweEUzLCAweDZDLCAweEEzLAotICAweEE1LCAweDJELCAweDAxLCAweERGLCAweDI2LCAweDkyLCAweDUyLCAweEY1LCAweEU2LCAweDNFLCAweEUzLCAweERELCAweEM2LAotICAweEVELCAweDQyLCAweDBGLCAweDcxLCAweDdCLCAweEQxLCAweEY0LCAweDA2LCAweEY2LCAweDgyLCAweEQ1LCAweDEzLCAweEIzLAotICAweDYwLCAweDMxLCAweDA5LCAweDg5LCAweDYzLCAweDE1LCAweEQyLCAweENCLCAweEFBLCAweDc3LCAweEZELCAweEY0LCAweEVCLAotICAweEY0LCAweEVELCAweDJFLCAweEUyLCAweEJBLCAweDI3LCAweDJFLCAweDc0LCAweEQyLCAweDkxLCAweDdGLCAweDBGLCAweERFLAotICAweDI1LCAweEZFLCAweDc4LCAweDIwLCAweDA1LCAweDBBLCAweDZBLCAweEZFLCAweDg5LCAweDE0LCAweDIzLCAweEYzLCAweEY1LAotICAweDNBLCAweDFFLCAweEYzLCAweDIyLCAweENFLCAweDEyLCAweDgyLCAweDI0LCAweDExLCAweDA1LCAweDA0LCAweDcxLCAweDk5LAotICAweEU1LCAweEYwLCAweEE2LCAweERCLCAweDdCLCAweEY1LCAweDhGLCAweEY5LCAweDNDLCAweDAyLCAweDBDLCAweDQ2LCAweEZELAotICAweEI2LCAweEVBLCAweDA2LCAweDExLCAweEY0LCAweDFFLCAweDdBLCAweDIwLCAweDZBLCAweDU0LCAweEJCLCAweDRBLCAweDYwLAotICAweEIwLCAweDMwLCAweDI4LCAweDlBLCAweEYzLCAweDNCLCAweEU5LCAweEJELCAweEQ2LCAweDA0LCAweENBLCAweDNBLCAweDMzLAotICAweDM3LCAweDVGLCAweEI3LCAweEFELCAweEU3LCAweDlDLCAweEUyLCAweDk1LCAweDIxLCAweEY3LCAweEI1LCAweEM0LCAweEYwLAotICAweEQxLCAweDUxLCAweDA5LCAweDQ0LCAweDNGLCAweDA3LCAweEZDLCAweDVGLCAweDM3LCAweEZELCAweDdELCAweDdFLCAweEQ1LAotICAweEY3LCAweEVCLCAweDY5LCAweEI5LCAweDU0LCAweDk4LCAweDVBLCAweDJBLCAweDU2LCAweEUzLCAweEMwLCAweDIxLCAweDU3LAotICAweEQxLCAweEVCLCAweDc1LCAweDE1LCAweEVELCAweEFDLCAweEFGLCAweDVELCAweEZGLCAweEMyLCAweEZFLCAweDRFLCAweEZCLAotICAweEJBLCAweDEzLCAweEI4LCAweDg3LCAweEZBLCAweDRFLCAweDVFLCAweDVDLCAweDI0LCAweDE1LCAweDVCLCAweDJCLCAweDJDLAotICAweDMyLCAweDY4LCAweDFGLCAweDMwLCAweDVGLCAweEMxLCAweEY3LCAweEU3LCAweEUxLCAweDlDLCAweDAwLCAweEMxLCAweDlDLAotICAweEIxLCAweEFCLCAweEZBLCAweEZGLCAweEMxLCAweDFFLCAweDcyLCAweEExLCAweDQ2LCAweDlFLCAweDJFLCAweENELCAweDc2LAotICAweDk2LCAweDRGLCAweDE0LCAweERDLCAweDY4LCAweEMxLCAweDEwLCAweDlGLCAweERGLCAweEVCLCAweDVBLCAweEJBLCAweDhELAotICAweDkxLCAweDRFLCAweDc2LCAweEU5LCAweDNBLCAweDQzLCAweDJELCAweDg4LCAweEQyLCAweDgxLCAweDBDLCAweEVDLCAweDZGLAotICAweEI3LCAweEE0LCAweDhCLCAweDk3LCAweDRGLCAweEM0LCAweDFFLCAweEYzLCAweDBGLCAweEY1LCAweDY2LCAweDY2LCAweEJGLAotICAweDZDLCAweDNGLCAweEZCLCAweDZFLCAweDJCLCAweDQ4LCAweDZDLCAweDdCLCAweEQxLCAweDJFLCAweDY0LCAweEQxLCAweDBCLAotICAweDZFLCAweDVCLCAweDA1LCAweDE2LCAweERELCAweENCLCAweDFCLCAweERFLCAweEEyLCAweEI5LCAweEE4LCAweDk0LCAweEQ2LAotICAweDVBLCAweDVCLCAweEUyLCAweEM5LCAweEJDLCAweEQ1LCAweEFCLCAweDY0LCAweDVCLCAweDBGLCAweDlBLCAweEZELCAweEM3LAotICAweDJFLCAweEI3LCAweEVGLCAweEFFLCAweEU5LCAweDFGLCAweDMyLCAweEQyLCAweENBLCAweEEwLCAweDM3LCAweDYzLCAweDg2LAotICAweDcyLCAweDQxLCAweDA3LCAweEJDLCAweEFCLCAweDZGLCAweEZGLCAweEI3LCAweDE2LCAweEFBLCAweEE5LCAweDU4LCAweDlFLAotICAweDQzLCAweDlDLCAweDIyLCAweDhELCAweDQ4LCAweENFLCAweEU1LCAweEVGLCAweEUwLCAweDdELCAweDQ3LCAweDg3LCAweDVBLAotICAweEE4LCAweDVCLCAweDA2LCAweEE5LCAweDQ3LCAweEYwLCAweDI2LCAweEI0LCAweDk5LCAweEQ4LCAweEEzLCAweDY0LCAweEVELAotICAweDczLCAweEIzLCAweDk2LCAweEI0LCAweDIxLCAweDE5LCAweEE1LCAweEMxLCAweERDLCAweDg4LCAweDJFLCAweEVFLCAweEYyLAotICAweDc3LCAweDkxLCAweEVDLCAweEZCLCAweEQ1LCAweEY5LCAweEY4LCAweDkwLCAweDQ3LCAweEFELCAweEY1LCAweEVCLCAweDk2LAotICAweDZELCAweEYxLCAweDFDLCAweEUwLCAweERDLCAweDc0LCAweDFDLCAweEU2LCAweDJFLCAweEUxLCAweDc2LCAweDlELCAweEVFLAotICAweEY0LCAweEVGLCAweEE1LCAweDMxLCAweDAzLCAweDg3LCAweDBFLCAweDJDLCAweDg0LCAweEE1LCAweEYxLCAweDIyLCAweEJFLAotICAweDQ4LCAweEE5LCAweENELCAweDA5LCAweDA3LCAweEMxLCAweEYwLCAweEQ0LCAweEU3LCAweDAzLCAweDgyLCAweDM5LCAweEUyLAotICAweEEwLCAweDBCLCAweERFLCAweEFDLCAweDM3LCAweEFDLCAweDYyLCAweDk3LCAweDhFLCAweDc5LCAweENFLCAweDUyLCAweDI0LAotICAweDc4LCAweEY5LCAweDE3LCAweEQyLCAweEYxLCAweDVELCAweDJELCAweEExLCAweERGLCAweDEyLCAweDJDLCAweDgzLCAweEU1LAotICAweDFBLCAweDI4LCAweDlBLCAweDJELCAweEVELCAweDhBLCAweEJGLCAweEZDLCAweDQxLCAweEMzLCAweEVCLCAweDBFLCAweDkxLAotICAweERCLCAweEYyLCAweEExLCAweEM4LCAweEE4LCAweDAxLCAweDhCLCAweEYyLCAweEYzLCAweDU5LCAweEI3LCAweEE3LCAweDZGLAotICAweDgwLCAweEZGLCAweDBCLCAweDQ2LCAweEUxLCAweDYzLCAweEE3LCAweDVGLCAweDZCLCAweEJFLCAweDMzLCAweDcxLCAweEJFLAotICAweDNBLCAweEFGLCAweEE5LCAweDUzLCAweDVELCAweDNCLCAweEIyLCAweEY2LCAweEVCLCAweDQyLCAweDFDLCAweDNFLCAweDNGLAotICAweDFELCAweDZBLCAweDM0LCAweEFFLCAweEIxLCAweDA1LCAweEExLCAweDMyLCAweDZDLCAweEI1LCAweEU0LCAweEQzLCAweEJCLAotICAweEU4LCAweDEwLCAweDE0LCAweDlFLCAweDY4LCAweDZBLCAweDI0LCAweDUxLCAweEE1LCAweDY2LCAweDY0LCAweENDLCAweEM0LAotICAweDJELCAweDk2LCAweEEyLCAweEM3LCAweDJELCAweDFGLCAweDBBLCAweDBGLCAweDZCLCAweEQ5LCAweEFELCAweEEzLCAweDExLAotICAweDhGLCAweDAwLCAweEFBLCAweDA2LCAweEMyLCAweDFFLCAweEYzLCAweEU4LCAweDVBLCAweDM3LCAweDRDLCAweEQ2LCAweDRCLAotICAweDZCLCAweDAxLCAweEM5LCAweEIwLCAweEI2LCAweEI5LCAweDkyLCAweEVELCAweDFELCAweDA4LCAweEIwLCAweDgwLCAweDA2LAotICAweDIwLCAweEVBLCAweEVFLCAweEY5LCAweDFELCAweEE0LCAweDU3LCAweDczLCAweDJFLCAweDFCLCAweEE1LCAweEFGLCAweEY2LAotICAweEFGLCAweEFFLCAweDA0LCAweDdDLCAweDRDLCAweDdFLCAweEM4LCAweERCLCAweEMwLCAweEZCLCAweDM3LCAweEM4LCAweDdFLAotICAweEZFLCAweDQ3LCAweDBBLCAweDNDLCAweEZBLCAweDYxLCAweEU3LCAweEVCLCAweDFCLCAweEYzLCAweDdDLCAweDMyLCAweEUzLAotICAweDdDLCAweDM3LCAweDY2LCAweDdDLCAweDUzLCAweDA3LCAweEMyLCAweDM3LCAweEEzLCAweEJELCAweEY3LCAweEZBLCAweEUzLAotICAweDhBLCAweDc2LCAweENCLCAweDZDLCAweEM4LCAweDEzLCAweEM0LCAweDUzLCAweDUzLCAweERCLCAweEFELCAweDM3LCAweDFBLAotICAweEVCLCAweEUwCi19OwotCi0vLyBDbGFzcyBmb3IgdGVzdGluZyB0aGUgRkZtcGVnSDI2NFRvQW5uZXhCQml0c3RyZWFtQ29udmVydGVyLgotY2xhc3MgRkZtcGVnSDI2NFRvQW5uZXhCQml0c3RyZWFtQ29udmVydGVyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIEZGbXBlZ0gyNjRUb0FubmV4QkJpdHN0cmVhbUNvbnZlcnRlclRlc3QoKSB7Ci0gICAgLy8gU2V0IHVwIEFWQ0NvbmZpZ3VyYXRpb25SZWNvcmQgY29ycmVjdGx5IGZvciB0ZXN0cy4KLSAgICAvLyBJdCdzIG9rIHRvIGRvIGNvbnN0IGNhc3QgaGVyZSBhcyBkYXRhIGluIGtIZWFkZXJEYXRhT2tXaXRoRmllbGRMZW40IGlzCi0gICAgLy8gbmV2ZXIgd3JpdHRlbiB0by4KLSAgICBtZW1zZXQoJnRlc3RfY29udGV4dF8sIDAsIHNpemVvZihBVkNvZGVjQ29udGV4dCkpOwotICAgIHRlc3RfY29udGV4dF8uZXh0cmFkYXRhID0gY29uc3RfY2FzdDx1aW50OCo+KGtIZWFkZXJEYXRhT2tXaXRoRmllbGRMZW40KTsKLSAgICB0ZXN0X2NvbnRleHRfLmV4dHJhZGF0YV9zaXplID0gc2l6ZW9mKGtIZWFkZXJEYXRhT2tXaXRoRmllbGRMZW40KTsKLSAgfQotCi0gIHZpcnR1YWwgfkZGbXBlZ0gyNjRUb0FubmV4QkJpdHN0cmVhbUNvbnZlcnRlclRlc3QoKSB7fQotCi0gIHZvaWQgQ3JlYXRlUGFja2V0KEFWUGFja2V0KiBwYWNrZXQsIGNvbnN0IHVpbnQ4KiBkYXRhLCB1aW50MzIgZGF0YV9zaXplKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwYWNrZXQgc2l6ZWQgb2YgfGRhdGFfc2l6ZXwgZnJvbSB8ZGF0YXwuCi0gICAgRVhQRUNUX0VRKGF2X25ld19wYWNrZXQocGFja2V0LCBkYXRhX3NpemUpLCAwKTsKLSAgICBtZW1jcHkocGFja2V0LT5kYXRhLCBkYXRhLCBkYXRhX3NpemUpOwotICB9Ci0KLSAgLy8gVmFyaWFibGUgdG8gaG9sZCB2YWxpZCBkdW1teSBjb250ZXh0IGZvciB0ZXN0aW5nLgotICBBVkNvZGVjQ29udGV4dCB0ZXN0X2NvbnRleHRfOwotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEZGbXBlZ0gyNjRUb0FubmV4QkJpdHN0cmVhbUNvbnZlcnRlclRlc3QpOwotfTsKLQotVEVTVF9GKEZGbXBlZ0gyNjRUb0FubmV4QkJpdHN0cmVhbUNvbnZlcnRlclRlc3QsIENvbnZlcnNpb25fU3VjY2VzcykgewotICBGRm1wZWdIMjY0VG9Bbm5leEJCaXRzdHJlYW1Db252ZXJ0ZXIgY29udmVydGVyKCZ0ZXN0X2NvbnRleHRfKTsKLQotICBBVlBhY2tldCB0ZXN0X3BhY2tldDsKLSAgQ3JlYXRlUGFja2V0KCZ0ZXN0X3BhY2tldCwga1BhY2tldERhdGFPa1dpdGhGaWVsZExlbjQsCi0gICAgICAgICAgICAgICBzaXplb2Yoa1BhY2tldERhdGFPa1dpdGhGaWVsZExlbjQpKTsKLQotICAvLyBUcnkgb3V0IHRoZSBhY3R1YWwgY29udmVyc2lvbiAoc2hvdWxkIGJlIHN1Y2Nlc3NmdWwgYW5kIGFsbG9jYXRlIG5ldwotICAvLyBwYWNrZXQgYW5kIGRlc3Ryb3kgdGhlIG9sZCBvbmUpLgotICBFWFBFQ1RfVFJVRShjb252ZXJ0ZXIuQ29udmVydFBhY2tldCgmdGVzdF9wYWNrZXQpKTsKLQotICAvLyBDbGVhbi11cCB0aGUgdGVzdCBwYWNrZXQuCi0gIGF2X2Rlc3RydWN0X3BhY2tldCgmdGVzdF9wYWNrZXQpOwotCi0gIC8vIENvbnZlcnRlciB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY2xlYW5lZCB1cC4KLX0KLQotVEVTVF9GKEZGbXBlZ0gyNjRUb0FubmV4QkJpdHN0cmVhbUNvbnZlcnRlclRlc3QsIENvbnZlcnNpb25fU3VjY2Vzc0JpZ1BhY2tldCkgewotICBGRm1wZWdIMjY0VG9Bbm5leEJCaXRzdHJlYW1Db252ZXJ0ZXIgY29udmVydGVyKCZ0ZXN0X2NvbnRleHRfKTsKLQotICAvLyBDcmVhdGUgbmV3IHBhY2tldCB3aXRoIDEwMDAgZXhjZXNzIGJ5dGVzLgotICBBVlBhY2tldCB0ZXN0X3BhY2tldDsKLSAgc3RhdGljIHVpbnQ4IGV4Y2Vzc19kYXRhW3NpemVvZihrUGFja2V0RGF0YU9rV2l0aEZpZWxkTGVuNCkgKyAxMDAwXSA9IHswfTsKLSAgbWVtY3B5KGV4Y2Vzc19kYXRhLCBrUGFja2V0RGF0YU9rV2l0aEZpZWxkTGVuNCwKLSAgICAgICAgIHNpemVvZihrUGFja2V0RGF0YU9rV2l0aEZpZWxkTGVuNCkpOwotICBDcmVhdGVQYWNrZXQoJnRlc3RfcGFja2V0LCBleGNlc3NfZGF0YSwgc2l6ZW9mKGV4Y2Vzc19kYXRhKSk7Ci0KLSAgLy8gVHJ5IG91dCB0aGUgYWN0dWFsIGNvbnZlcnNpb24gKHNob3VsZCBiZSBzdWNjZXNzZnVsIGFuZCBhbGxvY2F0ZSBuZXcKLSAgLy8gcGFja2V0IGFuZCBkZXN0cm95IHRoZSBvbGQgb25lIGFzIHdlIGRvIE5PVCBzdXBwb3J0IGluIHBsYWNlIHRyYW5zZm9ybSkuCi0gIEVYUEVDVF9UUlVFKGNvbnZlcnRlci5Db252ZXJ0UGFja2V0KCZ0ZXN0X3BhY2tldCkpOwotCi0gIC8vIENsZWFuLXVwIHRoZSB0ZXN0IHBhY2tldC4KLSAgYXZfZGVzdHJ1Y3RfcGFja2V0KCZ0ZXN0X3BhY2tldCk7Ci0KLSAgLy8gQ29udmVydGVyIHdpbGwgYmUgYXV0b21hdGljYWxseSBjbGVhbmVkIHVwLgotfQotCi1URVNUX0YoRkZtcGVnSDI2NFRvQW5uZXhCQml0c3RyZWFtQ29udmVydGVyVGVzdCwgQ29udmVyc2lvbl9GYWlsdXJlTnVsbFBhcmFtcykgewotICAvLyBTZXQgdXAgQVZDQ29uZmlndXJhdGlvblJlY29yZCB0byByZXByZXNlbnQgTlVMTCBkYXRhLgotICBBVkNvZGVjQ29udGV4dCBkdW1teV9jb250ZXh0OwotICBkdW1teV9jb250ZXh0LmV4dHJhZGF0YSA9IE5VTEw7Ci0gIGR1bW15X2NvbnRleHQuZXh0cmFkYXRhX3NpemUgPSAwOwotICBGRm1wZWdIMjY0VG9Bbm5leEJCaXRzdHJlYW1Db252ZXJ0ZXIgY29udmVydGVyKCZkdW1teV9jb250ZXh0KTsKLQotICAvLyBUcnkgb3V0IHRoZSBhY3R1YWwgY29udmVyc2lvbiB3aXRoIE5VTEwgcGFyYW1ldGVyLgotICBFWFBFQ1RfRkFMU0UoY29udmVydGVyLkNvbnZlcnRQYWNrZXQoTlVMTCkpOwotCi0gIC8vIENyZWF0ZSBuZXcgcGFja2V0IHRvIHRlc3QgYWN0dWFsIGNvbnZlcnNpb24uCi0gIEFWUGFja2V0IHRlc3RfcGFja2V0OwotICBDcmVhdGVQYWNrZXQoJnRlc3RfcGFja2V0LCBrUGFja2V0RGF0YU9rV2l0aEZpZWxkTGVuNCwKLSAgICAgICAgICAgICAgIHNpemVvZihrUGFja2V0RGF0YU9rV2l0aEZpZWxkTGVuNCkpOwotCi0gIC8vIFRyeSBvdXQgdGhlIGFjdHVhbCBjb252ZXJzaW9uIChzaG91bGQgYmUgc3VjY2Vzc2Z1bCBhbmQgYWxsb2NhdGUgbmV3Ci0gIC8vIHBhY2tldCBhbmQgZGVzdHJveSB0aGUgb2xkIG9uZSkuIFRoaXMgc2hvdWxkIGZhaWwgZHVlIHRvIG1pc3NpbmcgZXh0cmFkYXRhLgotICBFWFBFQ1RfRkFMU0UoY29udmVydGVyLkNvbnZlcnRQYWNrZXQoJnRlc3RfcGFja2V0KSk7Ci0KLSAgLy8gQ2xlYW4tdXAgdGhlIHRlc3QgcGFja2V0LgotICBhdl9kZXN0cnVjdF9wYWNrZXQoJnRlc3RfcGFja2V0KTsKLQotICAvLyBDb252ZXJ0ZWQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNsZWFuZWQgdXAuCi19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvZmZtcGVnX3ZpZGVvX2RlY29kZXIuY2MgYi9zcmMvbWVkaWEvZmlsdGVycy9mZm1wZWdfdmlkZW9fZGVjb2Rlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiYmY4Mi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9mZm1wZWdfdmlkZW9fZGVjb2Rlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ1NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9mZm1wZWdfdmlkZW9fZGVjb2Rlci5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2tfaGVscGVycy5oIgotI2luY2x1ZGUgImJhc2UvY29tbWFuZF9saW5lLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2NhdGlvbi5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wX3Byb3h5LmgiCi0jaW5jbHVkZSAiYmFzZS9zdHJpbmdfbnVtYmVyX2NvbnZlcnNpb25zLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9iaW5kX3RvX2xvb3AuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZW11eGVyX3N0cmVhbS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbGltaXRzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9zd2l0Y2hlcy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvcGlwZWxpbmUuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXJfY29uZmlnLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb19mcmFtZS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fdXRpbC5oIgotI2luY2x1ZGUgIm1lZGlhL2ZmbXBlZy9mZm1wZWdfY29tbW9uLmgiCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9mZm1wZWdfZ2x1ZS5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBBbHdheXMgdHJ5IHRvIHVzZSB0aHJlZSB0aHJlYWRzIGZvciB2aWRlbyBkZWNvZGluZy4gIFRoZXJlIGlzIGxpdHRsZSByZWFzb24KLS8vIG5vdCB0byBzaW5jZSBjdXJyZW50IGRheSBDUFVzIHRlbmQgdG8gYmUgbXVsdGktY29yZSBhbmQgd2UgbWVhc3VyZWQKLS8vIHBlcmZvcm1hbmNlIGJlbmVmaXRzIG9uIG9sZGVyIG1hY2hpbmVzIHN1Y2ggYXMgUDRzIHdpdGggaHlwZXJ0aHJlYWRpbmcuCi0vLwotLy8gSGFuZGxpbmcgZGVjb2Rpbmcgb24gc2VwYXJhdGUgdGhyZWFkcyBhbHNvIGZyZWVzIHVwIHRoZSBwaXBlbGluZSB0aHJlYWQgdG8KLS8vIGNvbnRpbnVlIHByb2Nlc3NpbmcuIEFsdGhvdWdoIGl0J2QgYmUgbmljZSB0byBoYXZlIHRoZSBvcHRpb24gb2YgYSBzaW5nbGUKLS8vIGRlY29kaW5nIHRocmVhZCwgRkZtcGVnIHRyZWF0cyBoYXZpbmcgb25lIHRocmVhZCB0aGUgc2FtZSBhcyBoYXZpbmcgemVybwotLy8gdGhyZWFkcyAoaS5lLiwgYXZjb2RlY19kZWNvZGVfdmlkZW8oKSB3aWxsIGV4ZWN1dGUgb24gdGhlIGNhbGxpbmcgdGhyZWFkKS4KLS8vIFlldCBhbm90aGVyIHJlYXNvbiBmb3IgaGF2aW5nIHR3byB0aHJlYWRzIDopCi1zdGF0aWMgY29uc3QgaW50IGtEZWNvZGVUaHJlYWRzID0gMjsKLXN0YXRpYyBjb25zdCBpbnQga01heERlY29kZVRocmVhZHMgPSAxNjsKLQotLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgZ2l2ZW4gdGhlIEZGbXBlZyBDb2RlY0lELiBBbHNvIGluc3BlY3RzIHRoZQotLy8gY29tbWFuZCBsaW5lIGZvciBhIHZhbGlkIC0tdmlkZW8tdGhyZWFkcyBmbGFnLgotc3RhdGljIGludCBHZXRUaHJlYWRDb3VudChDb2RlY0lEIGNvZGVjX2lkKSB7Ci0gIC8vIFJlZmVyIHRvIGh0dHA6Ly9jcmJ1Zy5jb20vOTM5MzIgZm9yIHRzYW4gc3VwcHJlc3Npb25zIG9uIGRlY29kaW5nLgotICBpbnQgZGVjb2RlX3RocmVhZHMgPSBrRGVjb2RlVGhyZWFkczsKLQotICBjb25zdCBDb21tYW5kTGluZSogY21kX2xpbmUgPSBDb21tYW5kTGluZTo6Rm9yQ3VycmVudFByb2Nlc3MoKTsKLSAgc3RkOjpzdHJpbmcgdGhyZWFkcyhjbWRfbGluZS0+R2V0U3dpdGNoVmFsdWVBU0NJSShzd2l0Y2hlczo6a1ZpZGVvVGhyZWFkcykpOwotICBpZiAodGhyZWFkcy5lbXB0eSgpIHx8ICFiYXNlOjpTdHJpbmdUb0ludCh0aHJlYWRzLCAmZGVjb2RlX3RocmVhZHMpKQotICAgIHJldHVybiBkZWNvZGVfdGhyZWFkczsKLQotICBkZWNvZGVfdGhyZWFkcyA9IHN0ZDo6bWF4KGRlY29kZV90aHJlYWRzLCAwKTsKLSAgZGVjb2RlX3RocmVhZHMgPSBzdGQ6Om1pbihkZWNvZGVfdGhyZWFkcywga01heERlY29kZVRocmVhZHMpOwotICByZXR1cm4gZGVjb2RlX3RocmVhZHM7Ci19Ci0KLUZGbXBlZ1ZpZGVvRGVjb2Rlcjo6RkZtcGVnVmlkZW9EZWNvZGVyKAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4mIG1lc3NhZ2VfbG9vcCkKLSAgICA6IG1lc3NhZ2VfbG9vcF8obWVzc2FnZV9sb29wKSwKLSAgICAgIHN0YXRlXyhrVW5pbml0aWFsaXplZCksCi0gICAgICBjb2RlY19jb250ZXh0XyhOVUxMKSwKLSAgICAgIGF2X2ZyYW1lXyhOVUxMKSB7Ci19Ci0KLWludCBGRm1wZWdWaWRlb0RlY29kZXI6OkdldFZpZGVvQnVmZmVyKEFWQ29kZWNDb250ZXh0KiBjb2RlY19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSogZnJhbWUpIHsKLSAgLy8gRG9uJ3QgdXNlIHxjb2RlY19jb250ZXh0X3wgaGVyZSEgV2l0aCB0aHJlYWRlZCBkZWNvZGluZywKLSAgLy8gaXQgd2lsbCBjb250YWluIHVuc3luY2hyb25pemVkIHdpZHRoL2hlaWdodC9waXhfZm10IHZhbHVlcywKLSAgLy8gd2hlcmVhcyB8Y29kZWNfY29udGV4dHwgY29udGFpbnMgdGhlIGN1cnJlbnQgdGhyZWFkcydzCi0gIC8vIHVwZGF0ZWQgd2lkdGgvaGVpZ2h0L3BpeF9mbXQsIHdoaWNoIGNhbiBjaGFuZ2UgZm9yIGFkYXB0aXZlCi0gIC8vIGNvbnRlbnQuCi0gIFZpZGVvRnJhbWU6OkZvcm1hdCBmb3JtYXQgPSBQaXhlbEZvcm1hdFRvVmlkZW9Gb3JtYXQoY29kZWNfY29udGV4dC0+cGl4X2ZtdCk7Ci0gIGlmIChmb3JtYXQgPT0gVmlkZW9GcmFtZTo6SU5WQUxJRCkKLSAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICBEQ0hFQ0soZm9ybWF0ID09IFZpZGVvRnJhbWU6OllWMTIgfHwgZm9ybWF0ID09IFZpZGVvRnJhbWU6OllWMTYpOwotCi0gIGdmeDo6U2l6ZSBzaXplKGNvZGVjX2NvbnRleHQtPndpZHRoLCBjb2RlY19jb250ZXh0LT5oZWlnaHQpOwotICBpbnQgcmV0OwotICBpZiAoKHJldCA9IGF2X2ltYWdlX2NoZWNrX3NpemUoc2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpLCAwLCBOVUxMKSkgPCAwKQotICAgIHJldHVybiByZXQ7Ci0KLSAgZ2Z4OjpTaXplIG5hdHVyYWxfc2l6ZTsKLSAgaWYgKGNvZGVjX2NvbnRleHQtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtID4gMCkgewotICAgIG5hdHVyYWxfc2l6ZSA9IEdldE5hdHVyYWxTaXplKHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfY29udGV4dC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfY29udGV4dC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4pOwotICB9IGVsc2UgewotICAgIG5hdHVyYWxfc2l6ZSA9IGRlbXV4ZXJfc3RyZWFtXy0+dmlkZW9fZGVjb2Rlcl9jb25maWcoKS5uYXR1cmFsX3NpemUoKTsKLSAgfQotCi0gIGlmICghVmlkZW9GcmFtZTo6SXNWYWxpZENvbmZpZyhmb3JtYXQsIHNpemUsIGdmeDo6UmVjdChzaXplKSwgbmF0dXJhbF9zaXplKSkKLSAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotCi0gIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gdmlkZW9fZnJhbWUgPQotICAgICAgVmlkZW9GcmFtZTo6Q3JlYXRlRnJhbWUoZm9ybWF0LCBzaXplLCBnZng6OlJlY3Qoc2l6ZSksIG5hdHVyYWxfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtOb1RpbWVzdGFtcCgpKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotICAgIGZyYW1lLT5iYXNlW2ldID0gdmlkZW9fZnJhbWUtPmRhdGEoaSk7Ci0gICAgZnJhbWUtPmRhdGFbaV0gPSB2aWRlb19mcmFtZS0+ZGF0YShpKTsKLSAgICBmcmFtZS0+bGluZXNpemVbaV0gPSB2aWRlb19mcmFtZS0+c3RyaWRlKGkpOwotICB9Ci0KLSAgZnJhbWUtPm9wYXF1ZSA9IE5VTEw7Ci0gIHZpZGVvX2ZyYW1lLnN3YXAocmVpbnRlcnByZXRfY2FzdDxWaWRlb0ZyYW1lKio+KCZmcmFtZS0+b3BhcXVlKSk7Ci0gIGZyYW1lLT50eXBlID0gRkZfQlVGRkVSX1RZUEVfVVNFUjsKLSAgZnJhbWUtPnBrdF9wdHMgPSBjb2RlY19jb250ZXh0LT5wa3QgPyBjb2RlY19jb250ZXh0LT5wa3QtPnB0cyA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfTk9QVFNfVkFMVUU7Ci0gIGZyYW1lLT53aWR0aCA9IGNvZGVjX2NvbnRleHQtPndpZHRoOwotICBmcmFtZS0+aGVpZ2h0ID0gY29kZWNfY29udGV4dC0+aGVpZ2h0OwotICBmcmFtZS0+Zm9ybWF0ID0gY29kZWNfY29udGV4dC0+cGl4X2ZtdDsKLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBHZXRWaWRlb0J1ZmZlckltcGwoQVZDb2RlY0NvbnRleHQqIHMsIEFWRnJhbWUqIGZyYW1lKSB7Ci0gIEZGbXBlZ1ZpZGVvRGVjb2RlciogdmQgPSBzdGF0aWNfY2FzdDxGRm1wZWdWaWRlb0RlY29kZXIqPihzLT5vcGFxdWUpOwotICByZXR1cm4gdmQtPkdldFZpZGVvQnVmZmVyKHMsIGZyYW1lKTsKLX0KLQotc3RhdGljIHZvaWQgUmVsZWFzZVZpZGVvQnVmZmVySW1wbChBVkNvZGVjQ29udGV4dCogcywgQVZGcmFtZSogZnJhbWUpIHsKLSAgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiB2aWRlb19mcmFtZTsKLSAgdmlkZW9fZnJhbWUuc3dhcChyZWludGVycHJldF9jYXN0PFZpZGVvRnJhbWUqKj4oJmZyYW1lLT5vcGFxdWUpKTsKLQotICAvLyBUaGUgRkZtcGVnIEFQSSBleHBlY3RzIHVzIHRvIHplcm8gdGhlIGRhdGEgcG9pbnRlcnMgaW4KLSAgLy8gdGhpcyBjYWxsYmFjawotICBtZW1zZXQoZnJhbWUtPmRhdGEsIDAsIHNpemVvZihmcmFtZS0+ZGF0YSkpOwotICBmcmFtZS0+b3BhcXVlID0gTlVMTDsKLX0KLQotdm9pZCBGRm1wZWdWaWRlb0RlY29kZXI6OkluaXRpYWxpemUoY29uc3Qgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiYgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc3RhdHVzX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdGlzdGljc0NCJiBzdGF0aXN0aWNzX2NiKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBQaXBlbGluZVN0YXR1c0NCIGluaXRpYWxpemVfY2IgPSBCaW5kVG9DdXJyZW50TG9vcChzdGF0dXNfY2IpOwotCi0gIEZGbXBlZ0dsdWU6OkluaXRpYWxpemVGRm1wZWcoKTsKLSAgRENIRUNLKCFkZW11eGVyX3N0cmVhbV8pIDw8ICJBbHJlYWR5IGluaXRpYWxpemVkLiI7Ci0KLSAgaWYgKCFzdHJlYW0pIHsKLSAgICBpbml0aWFsaXplX2NiLlJ1bihQSVBFTElORV9FUlJPUl9ERUNPREUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGRlbXV4ZXJfc3RyZWFtXyA9IHN0cmVhbTsKLSAgc3RhdGlzdGljc19jYl8gPSBzdGF0aXN0aWNzX2NiOwotCi0gIGlmICghQ29uZmlndXJlRGVjb2RlcigpKSB7Ci0gICAgaW5pdGlhbGl6ZV9jYi5SdW4oREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVEKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBTdWNjZXNzIQotICBzdGF0ZV8gPSBrTm9ybWFsOwotICBpbml0aWFsaXplX2NiLlJ1bihQSVBFTElORV9PSyk7Ci19Ci0KLXZvaWQgRkZtcGVnVmlkZW9EZWNvZGVyOjpSZWFkKGNvbnN0IFJlYWRDQiYgcmVhZF9jYikgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgRENIRUNLKCFyZWFkX2NiLmlzX251bGwoKSk7Ci0gIENIRUNLX05FKHN0YXRlXywga1VuaW5pdGlhbGl6ZWQpOwotICBDSEVDSyhyZWFkX2NiXy5pc19udWxsKCkpIDw8ICJPdmVybGFwcGluZyBkZWNvZGVzIGFyZSBub3Qgc3VwcG9ydGVkLiI7Ci0gIHJlYWRfY2JfID0gQmluZFRvQ3VycmVudExvb3AocmVhZF9jYik7Ci0KLSAgLy8gUmV0dXJuIGVtcHR5IGZyYW1lcyBpZiBkZWNvZGluZyBoYXMgZmluaXNoZWQuCi0gIGlmIChzdGF0ZV8gPT0ga0RlY29kZUZpbmlzaGVkKSB7Ci0gICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnJlYWRfY2JfKS5SdW4oa09rLCBWaWRlb0ZyYW1lOjpDcmVhdGVFbXB0eUZyYW1lKCkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIFJlYWRGcm9tRGVtdXhlclN0cmVhbSgpOwotfQotCi12b2lkIEZGbXBlZ1ZpZGVvRGVjb2Rlcjo6UmVzZXQoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2xvc3VyZSkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgRENIRUNLKHJlc2V0X2NiXy5pc19udWxsKCkpOwotICByZXNldF9jYl8gPSBCaW5kVG9DdXJyZW50TG9vcChjbG9zdXJlKTsKLQotICAvLyBEZWZlciB0aGUgcmVzZXQgaWYgYSByZWFkIGlzIHBlbmRpbmcuCi0gIGlmICghcmVhZF9jYl8uaXNfbnVsbCgpKQotICAgIHJldHVybjsKLQotICBEb1Jlc2V0KCk7Ci19Ci0KLXZvaWQgRkZtcGVnVmlkZW9EZWNvZGVyOjpEb1Jlc2V0KCkgewotICBEQ0hFQ0socmVhZF9jYl8uaXNfbnVsbCgpKTsKLQotICBhdmNvZGVjX2ZsdXNoX2J1ZmZlcnMoY29kZWNfY29udGV4dF8pOwotICBzdGF0ZV8gPSBrTm9ybWFsOwotICBiYXNlOjpSZXNldEFuZFJldHVybigmcmVzZXRfY2JfKS5SdW4oKTsKLX0KLQotdm9pZCBGRm1wZWdWaWRlb0RlY29kZXI6OlN0b3AoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2xvc3VyZSkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgYmFzZTo6U2NvcGVkQ2xvc3VyZVJ1bm5lciBydW5uZXIoQmluZFRvQ3VycmVudExvb3AoY2xvc3VyZSkpOwotCi0gIGlmIChzdGF0ZV8gPT0ga1VuaW5pdGlhbGl6ZWQpCi0gICAgcmV0dXJuOwotCi0gIGlmICghcmVhZF9jYl8uaXNfbnVsbCgpKQotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZyZWFkX2NiXykuUnVuKGtPaywgTlVMTCk7Ci0KLSAgUmVsZWFzZUZGbXBlZ1Jlc291cmNlcygpOwotICBzdGF0ZV8gPSBrVW5pbml0aWFsaXplZDsKLX0KLQotRkZtcGVnVmlkZW9EZWNvZGVyOjp+RkZtcGVnVmlkZW9EZWNvZGVyKCkgewotICBEQ0hFQ0tfRVEoa1VuaW5pdGlhbGl6ZWQsIHN0YXRlXyk7Ci0gIERDSEVDSyghY29kZWNfY29udGV4dF8pOwotICBEQ0hFQ0soIWF2X2ZyYW1lXyk7Ci19Ci0KLXZvaWQgRkZtcGVnVmlkZW9EZWNvZGVyOjpSZWFkRnJvbURlbXV4ZXJTdHJlYW0oKSB7Ci0gIERDSEVDS19ORShzdGF0ZV8sIGtVbmluaXRpYWxpemVkKTsKLSAgRENIRUNLX05FKHN0YXRlXywga0RlY29kZUZpbmlzaGVkKTsKLSAgRENIRUNLKCFyZWFkX2NiXy5pc19udWxsKCkpOwotCi0gIGRlbXV4ZXJfc3RyZWFtXy0+UmVhZChiYXNlOjpCaW5kKCZGRm1wZWdWaWRlb0RlY29kZXI6OkJ1ZmZlclJlYWR5LCB0aGlzKSk7Ci19Ci0KLXZvaWQgRkZtcGVnVmlkZW9EZWNvZGVyOjpCdWZmZXJSZWFkeSgKLSAgICBEZW11eGVyU3RyZWFtOjpTdGF0dXMgc3RhdHVzLAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGJ1ZmZlcikgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgRENIRUNLX05FKHN0YXRlXywga0RlY29kZUZpbmlzaGVkKTsKLSAgRENIRUNLX0VRKHN0YXR1cyAhPSBEZW11eGVyU3RyZWFtOjprT2ssICFidWZmZXIpIDw8IHN0YXR1czsKLQotICBpZiAoc3RhdGVfID09IGtVbmluaXRpYWxpemVkKQotICAgIHJldHVybjsKLQotICBEQ0hFQ0soIXJlYWRfY2JfLmlzX251bGwoKSk7Ci0KLSAgaWYgKHN0YXR1cyA9PSBEZW11eGVyU3RyZWFtOjprQ29uZmlnQ2hhbmdlZCkgewotICAgIGlmICghQ29uZmlndXJlRGVjb2RlcigpKSB7Ci0gICAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcmVhZF9jYl8pLlJ1bihrRGVjb2RlRXJyb3IsIE5VTEwpOwotICAgICAgc3RhdGVfID0ga0RlY29kZUZpbmlzaGVkOwotICAgICAgaWYgKCFyZXNldF9jYl8uaXNfbnVsbCgpKQotICAgICAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcmVzZXRfY2JfKS5SdW4oKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocmVzZXRfY2JfLmlzX251bGwoKSkgewotICAgICAgUmVhZEZyb21EZW11eGVyU3RyZWFtKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFyZXNldF9jYl8uaXNfbnVsbCgpKSB7Ci0gICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnJlYWRfY2JfKS5SdW4oa09rLCBOVUxMKTsKLSAgICBEb1Jlc2V0KCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHN0YXR1cyA9PSBEZW11eGVyU3RyZWFtOjprQWJvcnRlZCkgewotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZyZWFkX2NiXykuUnVuKGtPaywgTlVMTCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRENIRUNLX0VRKHN0YXR1cywgRGVtdXhlclN0cmVhbTo6a09rKTsKLSAgRGVjb2RlQnVmZmVyKGJ1ZmZlcik7Ci19Ci0KLXZvaWQgRkZtcGVnVmlkZW9EZWNvZGVyOjpEZWNvZGVCdWZmZXIoCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgYnVmZmVyKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBEQ0hFQ0tfTkUoc3RhdGVfLCBrVW5pbml0aWFsaXplZCk7Ci0gIERDSEVDS19ORShzdGF0ZV8sIGtEZWNvZGVGaW5pc2hlZCk7Ci0gIERDSEVDSyhyZXNldF9jYl8uaXNfbnVsbCgpKTsKLSAgRENIRUNLKCFyZWFkX2NiXy5pc19udWxsKCkpOwotICBEQ0hFQ0soYnVmZmVyKTsKLQotICAvLyBEdXJpbmcgZGVjb2RlLCBiZWNhdXNlIHJlYWRzIGFyZSBpc3N1ZWQgYXN5bmNocm9ub3VzbHksIGl0IGlzIHBvc3NpYmxlIHRvCi0gIC8vIHJlY2VpdmUgbXVsdGlwbGUgZW5kIG9mIHN0cmVhbSBidWZmZXJzIHNpbmNlIGVhY2ggcmVhZCBpcyBhY2tlZC4gV2hlbiB0aGUKLSAgLy8gZmlyc3QgZW5kIG9mIHN0cmVhbSBidWZmZXIgaXMgcmVhZCwgRkZtcGVnIG1heSBzdGlsbCBoYXZlIGZyYW1lcyBxdWV1ZWQKLSAgLy8gdXAgaW4gdGhlIGRlY29kZXIgc28gd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSBkZWNvZGUgbG9vcCB1bnRpbCBpdCBzdG9wcwotICAvLyBnaXZpbmcgc2Vuc2libGUgZGF0YS4gIEFmdGVyIHRoYXQsIHRoZSBkZWNvZGVyIHNob3VsZCBvdXRwdXQgZW1wdHkKLSAgLy8gZnJhbWVzLiAgVGhlcmUgYXJlIHRocmVlIHN0YXRlcyB0aGUgZGVjb2RlciBjYW4gYmUgaW46Ci0gIC8vCi0gIC8vICAga05vcm1hbDogVGhpcyBpcyB0aGUgc3RhcnRpbmcgc3RhdGUuIEJ1ZmZlcnMgYXJlIGRlY29kZWQuIERlY29kZSBlcnJvcnMKLSAgLy8gICAgICAgICAgICBhcmUgZGlzY2FyZGVkLgotICAvLyAgIGtGbHVzaENvZGVjOiBUaGVyZSBpc24ndCBhbnkgbW9yZSBpbnB1dCBkYXRhLiBDYWxsIGF2Y29kZWNfZGVjb2RlX3ZpZGVvMgotICAvLyAgICAgICAgICAgICAgICB1bnRpbCBubyBtb3JlIGRhdGEgaXMgcmV0dXJuZWQgdG8gZmx1c2ggb3V0IHJlbWFpbmluZwotICAvLyAgICAgICAgICAgICAgICBmcmFtZXMuIFRoZSBpbnB1dCBidWZmZXIgaXMgaWdub3JlZCBhdCB0aGlzIHBvaW50LgotICAvLyAgIGtEZWNvZGVGaW5pc2hlZDogQWxsIGNhbGxzIHJldHVybiBlbXB0eSBmcmFtZXMuCi0gIC8vCi0gIC8vIFRoZXNlIGFyZSB0aGUgcG9zc2libGUgc3RhdGUgdHJhbnNpdGlvbnMuCi0gIC8vCi0gIC8vIGtOb3JtYWwgLT4ga0ZsdXNoQ29kZWM6Ci0gIC8vICAgICBXaGVuIGJ1ZmZlci0+SXNFbmRPZlN0cmVhbSgpIGlzIGZpcnN0IHRydWUuCi0gIC8vIGtOb3JtYWwgLT4ga0RlY29kZUZpbmlzaGVkOgotICAvLyAgICAgQSBkZWNvZGluZyBlcnJvciBvY2N1cnMgYW5kIGRlY29kaW5nIG5lZWRzIHRvIHN0b3AuCi0gIC8vIGtGbHVzaENvZGVjIC0+IGtEZWNvZGVGaW5pc2hlZDoKLSAgLy8gICAgIFdoZW4gYXZjb2RlY19kZWNvZGVfdmlkZW8yKCkgcmV0dXJucyAwIGRhdGEgb3IgZXJyb3JzIG91dC4KLSAgLy8gKGFueSBzdGF0ZSkgLT4ga05vcm1hbDoKLSAgLy8gICAgIEFueSB0aW1lIFJlc2V0KCkgaXMgY2FsbGVkLgotCi0gIC8vIFRyYW5zaXRpb24gdG8ga0ZsdXNoQ29kZWMgb24gdGhlIGZpcnN0IGVuZCBvZiBzdHJlYW0gYnVmZmVyLgotICBpZiAoc3RhdGVfID09IGtOb3JtYWwgJiYgYnVmZmVyLT5Jc0VuZE9mU3RyZWFtKCkpIHsKLSAgICBzdGF0ZV8gPSBrRmx1c2hDb2RlYzsKLSAgfQotCi0gIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gdmlkZW9fZnJhbWU7Ci0gIGlmICghRGVjb2RlKGJ1ZmZlciwgJnZpZGVvX2ZyYW1lKSkgewotICAgIHN0YXRlXyA9IGtEZWNvZGVGaW5pc2hlZDsKLSAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcmVhZF9jYl8pLlJ1bihrRGVjb2RlRXJyb3IsIE5VTEwpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIEFueSBzdWNjZXNzZnVsIGRlY29kZSBjb3VudHMhCi0gIGlmIChidWZmZXItPkdldERhdGFTaXplKCkpIHsKLSAgICBQaXBlbGluZVN0YXRpc3RpY3Mgc3RhdGlzdGljczsKLSAgICBzdGF0aXN0aWNzLnZpZGVvX2J5dGVzX2RlY29kZWQgPSBidWZmZXItPkdldERhdGFTaXplKCk7Ci0gICAgc3RhdGlzdGljc19jYl8uUnVuKHN0YXRpc3RpY3MpOwotICB9Ci0KLSAgLy8gSWYgd2UgZGlkbid0IGdldCBhIGZyYW1lIHRoZW4gd2UndmUgZWl0aGVyIGNvbXBsZXRlbHkgZmluaXNoZWQgZGVjb2Rpbmcgb3IKLSAgLy8gd2UgbmVlZCBtb3JlIGRhdGEuCi0gIGlmICghdmlkZW9fZnJhbWUpIHsKLSAgICBpZiAoc3RhdGVfID09IGtGbHVzaENvZGVjKSB7Ci0gICAgICBzdGF0ZV8gPSBrRGVjb2RlRmluaXNoZWQ7Ci0gICAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcmVhZF9jYl8pLlJ1bihrT2ssIFZpZGVvRnJhbWU6OkNyZWF0ZUVtcHR5RnJhbWUoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgUmVhZEZyb21EZW11eGVyU3RyZWFtKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnJlYWRfY2JfKS5SdW4oa09rLCB2aWRlb19mcmFtZSk7Ci19Ci0KLWJvb2wgRkZtcGVnVmlkZW9EZWNvZGVyOjpEZWNvZGUoCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgYnVmZmVyLAotICAgIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4qIHZpZGVvX2ZyYW1lKSB7Ci0gIERDSEVDSyh2aWRlb19mcmFtZSk7Ci0KLSAgLy8gQ3JlYXRlIGEgcGFja2V0IGZvciBpbnB1dCBkYXRhLgotICAvLyBEdWUgdG8gRkZtcGVnIEFQSSBjaGFuZ2VzIHdlIG5vIGxvbmdlciBoYXZlIGNvbnN0IHJlYWQtb25seSBwb2ludGVycy4KLSAgQVZQYWNrZXQgcGFja2V0OwotICBhdl9pbml0X3BhY2tldCgmcGFja2V0KTsKLSAgcGFja2V0LmRhdGEgPSBjb25zdF9jYXN0PHVpbnQ4Kj4oYnVmZmVyLT5HZXREYXRhKCkpOwotICBwYWNrZXQuc2l6ZSA9IGJ1ZmZlci0+R2V0RGF0YVNpemUoKTsKLQotICAvLyBMZXQgRkZtcGVnIGhhbmRsZSBwcmVzZW50YXRpb24gdGltZXN0YW1wIHJlb3JkZXJpbmcuCi0gIGNvZGVjX2NvbnRleHRfLT5yZW9yZGVyZWRfb3BhcXVlID0gYnVmZmVyLT5HZXRUaW1lc3RhbXAoKS5Jbk1pY3Jvc2Vjb25kcygpOwotCi0gIC8vIFJlc2V0IGZyYW1lIHRvIGRlZmF1bHQgdmFsdWVzLgotICBhdmNvZGVjX2dldF9mcmFtZV9kZWZhdWx0cyhhdl9mcmFtZV8pOwotCi0gIC8vIFRoaXMgaXMgZm9yIGNvZGVjcyBub3QgdXNpbmcgZ2V0X2J1ZmZlciB0byBpbml0aWFsaXplCi0gIC8vIHxhdl9mcmFtZV8tPnJlb3JkZXJlZF9vcGFxdWV8Ci0gIGF2X2ZyYW1lXy0+cmVvcmRlcmVkX29wYXF1ZSA9IGNvZGVjX2NvbnRleHRfLT5yZW9yZGVyZWRfb3BhcXVlOwotCi0gIGludCBmcmFtZV9kZWNvZGVkID0gMDsKLSAgaW50IHJlc3VsdCA9IGF2Y29kZWNfZGVjb2RlX3ZpZGVvMihjb2RlY19jb250ZXh0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9mcmFtZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lX2RlY29kZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhY2tldCk7Ci0gIC8vIExvZyB0aGUgcHJvYmxlbSBpZiB3ZSBjYW4ndCBkZWNvZGUgYSB2aWRlbyBmcmFtZSBhbmQgZXhpdCBlYXJseS4KLSAgaWYgKHJlc3VsdCA8IDApIHsKLSAgICBMT0coRVJST1IpIDw8ICJFcnJvciBkZWNvZGluZyBhIHZpZGVvIGZyYW1lIHdpdGggdGltZXN0YW1wOiAiCi0gICAgICAgICAgICAgICA8PCBidWZmZXItPkdldFRpbWVzdGFtcCgpLkluTWljcm9zZWNvbmRzKCkgPDwgIiB1cywgZHVyYXRpb246ICIKLSAgICAgICAgICAgICAgIDw8IGJ1ZmZlci0+R2V0RHVyYXRpb24oKS5Jbk1pY3Jvc2Vjb25kcygpIDw8ICIgdXMsIHBhY2tldCBzaXplOiAiCi0gICAgICAgICAgICAgICA8PCBidWZmZXItPkdldERhdGFTaXplKCkgPDwgIiBieXRlcyI7Ci0gICAgKnZpZGVvX2ZyYW1lID0gTlVMTDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBJZiBubyBmcmFtZSB3YXMgcHJvZHVjZWQgdGhlbiBzaWduYWwgdGhhdCBtb3JlIGRhdGEgaXMgcmVxdWlyZWQgdG8KLSAgLy8gcHJvZHVjZSBtb3JlIGZyYW1lcy4gVGhpcyBjYW4gaGFwcGVuIHVuZGVyIHR3byBjaXJjdW1zdGFuY2VzOgotICAvLyAgIDEpIERlY29kZXIgd2FzIHJlY2VudGx5IGluaXRpYWxpemVkL2ZsdXNoZWQKLSAgLy8gICAyKSBFbmQgb2Ygc3RyZWFtIHdhcyByZWFjaGVkIGFuZCBhbGwgaW50ZXJuYWwgZnJhbWVzIGhhdmUgYmVlbiBvdXRwdXQKLSAgaWYgKGZyYW1lX2RlY29kZWQgPT0gMCkgewotICAgICp2aWRlb19mcmFtZSA9IE5VTEw7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvLyBUT0RPKGZiYXJjaGFyZCk6IFdvcmsgYXJvdW5kIGZvciBGRm1wZWcgaHR0cDovL2NyYnVnLmNvbS8yNzY3NQotICAvLyBUaGUgZGVjb2RlciBpcyBpbiBhIGJhZCBzdGF0ZSBhbmQgbm90IGRlY29kaW5nIGNvcnJlY3RseS4KLSAgLy8gQ2hlY2tpbmcgZm9yIE5VTEwgYXZvaWRzIGEgY3Jhc2ggaW4gQ29weVBsYW5lKCkuCi0gIGlmICghYXZfZnJhbWVfLT5kYXRhW1ZpZGVvRnJhbWU6OmtZUGxhbmVdIHx8Ci0gICAgICAhYXZfZnJhbWVfLT5kYXRhW1ZpZGVvRnJhbWU6OmtVUGxhbmVdIHx8Ci0gICAgICAhYXZfZnJhbWVfLT5kYXRhW1ZpZGVvRnJhbWU6OmtWUGxhbmVdKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiVmlkZW8gZnJhbWUgd2FzIHByb2R1Y2VkIHlldCBoYXMgaW52YWxpZCBmcmFtZSBkYXRhLiI7Ci0gICAgKnZpZGVvX2ZyYW1lID0gTlVMTDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIWF2X2ZyYW1lXy0+b3BhcXVlKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiVmlkZW9GcmFtZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGZyYW1lIGRhdGEgbm90IHNldC4iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAqdmlkZW9fZnJhbWUgPSBzdGF0aWNfY2FzdDxWaWRlb0ZyYW1lKj4oYXZfZnJhbWVfLT5vcGFxdWUpOwotCi0gICgqdmlkZW9fZnJhbWUpLT5TZXRUaW1lc3RhbXAoCi0gICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWNyb3NlY29uZHMoYXZfZnJhbWVfLT5yZW9yZGVyZWRfb3BhcXVlKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgRkZtcGVnVmlkZW9EZWNvZGVyOjpSZWxlYXNlRkZtcGVnUmVzb3VyY2VzKCkgewotICBpZiAoY29kZWNfY29udGV4dF8pIHsKLSAgICBhdl9mcmVlKGNvZGVjX2NvbnRleHRfLT5leHRyYWRhdGEpOwotICAgIGF2Y29kZWNfY2xvc2UoY29kZWNfY29udGV4dF8pOwotICAgIGF2X2ZyZWUoY29kZWNfY29udGV4dF8pOwotICAgIGNvZGVjX2NvbnRleHRfID0gTlVMTDsKLSAgfQotICBpZiAoYXZfZnJhbWVfKSB7Ci0gICAgYXZfZnJlZShhdl9mcmFtZV8pOwotICAgIGF2X2ZyYW1lXyA9IE5VTEw7Ci0gIH0KLX0KLQotYm9vbCBGRm1wZWdWaWRlb0RlY29kZXI6OkNvbmZpZ3VyZURlY29kZXIoKSB7Ci0gIGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgY29uZmlnID0gZGVtdXhlcl9zdHJlYW1fLT52aWRlb19kZWNvZGVyX2NvbmZpZygpOwotCi0gIGlmICghY29uZmlnLklzVmFsaWRDb25maWcoKSkgewotICAgIERMT0coRVJST1IpIDw8ICJJbnZhbGlkIHZpZGVvIHN0cmVhbSAtICIgPDwgY29uZmlnLkFzSHVtYW5SZWFkYWJsZVN0cmluZygpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChjb25maWcuaXNfZW5jcnlwdGVkKCkpIHsKLSAgICBETE9HKEVSUk9SKSA8PCAiRW5jcnlwdGVkIHZpZGVvIHN0cmVhbSBub3Qgc3VwcG9ydGVkLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gUmVsZWFzZSBleGlzdGluZyBkZWNvZGVyIHJlc291cmNlcyBpZiBuZWNlc3NhcnkuCi0gIFJlbGVhc2VGRm1wZWdSZXNvdXJjZXMoKTsKLQotICAvLyBJbml0aWFsaXplIEFWQ29kZWNDb250ZXh0IHN0cnVjdHVyZS4KLSAgY29kZWNfY29udGV4dF8gPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKE5VTEwpOwotICBWaWRlb0RlY29kZXJDb25maWdUb0FWQ29kZWNDb250ZXh0KGNvbmZpZywgY29kZWNfY29udGV4dF8pOwotCi0gIC8vIEVuYWJsZSBtb3Rpb24gdmVjdG9yIHNlYXJjaCAocG90ZW50aWFsbHkgc2xvdyksIHN0cm9uZyBkZWJsb2NraW5nIGZpbHRlcgotICAvLyBmb3IgZGFtYWdlZCBtYWNyb2Jsb2NrcywgYW5kIHNldCBvdXIgZXJyb3IgZGV0ZWN0aW9uIHNlbnNpdGl2aXR5LgotICBjb2RlY19jb250ZXh0Xy0+ZXJyb3JfY29uY2VhbG1lbnQgPSBGRl9FQ19HVUVTU19NVlMgfCBGRl9FQ19ERUJMT0NLOwotICBjb2RlY19jb250ZXh0Xy0+dGhyZWFkX2NvdW50ID0gR2V0VGhyZWFkQ291bnQoY29kZWNfY29udGV4dF8tPmNvZGVjX2lkKTsKLSAgY29kZWNfY29udGV4dF8tPm9wYXF1ZSA9IHRoaXM7Ci0gIGNvZGVjX2NvbnRleHRfLT5mbGFncyB8PSBDT0RFQ19GTEFHX0VNVV9FREdFOwotICBjb2RlY19jb250ZXh0Xy0+Z2V0X2J1ZmZlciA9IEdldFZpZGVvQnVmZmVySW1wbDsKLSAgY29kZWNfY29udGV4dF8tPnJlbGVhc2VfYnVmZmVyID0gUmVsZWFzZVZpZGVvQnVmZmVySW1wbDsKLQotICBBVkNvZGVjKiBjb2RlYyA9IGF2Y29kZWNfZmluZF9kZWNvZGVyKGNvZGVjX2NvbnRleHRfLT5jb2RlY19pZCk7Ci0gIGlmICghY29kZWMgfHwgYXZjb2RlY19vcGVuMihjb2RlY19jb250ZXh0XywgY29kZWMsIE5VTEwpIDwgMCkgewotICAgIFJlbGVhc2VGRm1wZWdSZXNvdXJjZXMoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBhdl9mcmFtZV8gPSBhdmNvZGVjX2FsbG9jX2ZyYW1lKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL2ZmbXBlZ192aWRlb19kZWNvZGVyLmggYi9zcmMvbWVkaWEvZmlsdGVycy9mZm1wZWdfdmlkZW9fZGVjb2Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjZhMTk0Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL2ZmbXBlZ192aWRlb19kZWNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0ZJTFRFUlNfRkZNUEVHX1ZJREVPX0RFQ09ERVJfSF8KLSNkZWZpbmUgTUVESUFfRklMVEVSU19GRk1QRUdfVklERU9fREVDT0RFUl9IXwotCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZW11eGVyX3N0cmVhbS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fZGVjb2Rlci5oIgotCi1zdHJ1Y3QgQVZDb2RlY0NvbnRleHQ7Ci1zdHJ1Y3QgQVZGcmFtZTsKLQotbmFtZXNwYWNlIGJhc2UgewotY2xhc3MgTWVzc2FnZUxvb3BQcm94eTsKLX0KLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgRGVjb2RlckJ1ZmZlcjsKLQotY2xhc3MgTUVESUFfRVhQT1JUIEZGbXBlZ1ZpZGVvRGVjb2RlciA6IHB1YmxpYyBWaWRlb0RlY29kZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgRkZtcGVnVmlkZW9EZWNvZGVyKAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbWVzc2FnZV9sb29wKTsKLQotICAvLyBWaWRlb0RlY29kZXIgaW1wbGVtZW50YXRpb24uCi0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4mIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc3RhdHVzX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0aXN0aWNzQ0ImIHN0YXRpc3RpY3NfY2IpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgUmVhZChjb25zdCBSZWFkQ0ImIHJlYWRfY2IpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgUmVzZXQoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2xvc3VyZSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTdG9wKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNsb3N1cmUpIE9WRVJSSURFOwotCi0gIC8vIENhbGxiYWNrIGNhbGxlZCBmcm9tIHdpdGhpbiBGRm1wZWcgdG8gYWxsb2NhdGUgYSBidWZmZXIgYmFzZWQgb24KLSAgLy8gdGhlIGRpbWVuc2lvbnMgb2YgfGNvZGVjX2NvbnRleHR8LiBTZWUgQVZDb2RlY0NvbnRleHQuZ2V0X2J1ZmZlcgotICAvLyBkb2N1bWVudGF0aW9uIGluc2lkZSBGRm1wZWcuCi0gIGludCBHZXRWaWRlb0J1ZmZlcihBVkNvZGVjQ29udGV4dCAqY29kZWNfY29udGV4dCwgQVZGcmFtZSogZnJhbWUpOwotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIH5GRm1wZWdWaWRlb0RlY29kZXIoKTsKLQotIHByaXZhdGU6Ci0gIGVudW0gRGVjb2RlclN0YXRlIHsKLSAgICBrVW5pbml0aWFsaXplZCwKLSAgICBrTm9ybWFsLAotICAgIGtGbHVzaENvZGVjLAotICAgIGtEZWNvZGVGaW5pc2hlZAotICB9OwotCi0gIC8vIFJlYWRzIGZyb20gdGhlIGRlbXV4ZXIgc3RyZWFtIGFuZCBjb3JyZXNwb25kaW5nIHJlYWQgY2FsbGJhY2suCi0gIHZvaWQgUmVhZEZyb21EZW11eGVyU3RyZWFtKCk7Ci0gIHZvaWQgQnVmZmVyUmVhZHkoRGVtdXhlclN0cmVhbTo6U3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBidWZmZXIpOwotCi0gIC8vIEhhbmRsZXMgZGVjb2RpbmcgYW4gdW5lbmNyeXB0ZWQgZW5jb2RlZCBidWZmZXIuCi0gIHZvaWQgRGVjb2RlQnVmZmVyKGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGJ1ZmZlcik7Ci0gIGJvb2wgRGVjb2RlKGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGJ1ZmZlciwKLSAgICAgICAgICAgICAgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiogdmlkZW9fZnJhbWUpOwotCi0gIC8vIEhhbmRsZXMgKHJlLSlpbml0aWFsaXppbmcgdGhlIGRlY29kZXIgd2l0aCBhIChuZXcpIGNvbmZpZy4KLSAgLy8gUmV0dXJucyB0cnVlIGlmIGluaXRpYWxpemF0aW9uIHdhcyBzdWNjZXNzZnVsLgotICBib29sIENvbmZpZ3VyZURlY29kZXIoKTsKLQotICAvLyBSZWxlYXNlcyByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHxjb2RlY19jb250ZXh0X3wgYW5kIHxhdl9mcmFtZV98Ci0gIC8vIGFuZCByZXNldHMgdGhlbSB0byBOVUxMLgotICB2b2lkIFJlbGVhc2VGRm1wZWdSZXNvdXJjZXMoKTsKLQotICAvLyBSZXNldCBkZWNvZGVyIGFuZCBjYWxsIHxyZXNldF9jYl98LgotICB2b2lkIERvUmVzZXQoKTsKLQotICBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+IG1lc3NhZ2VfbG9vcF87Ci0KLSAgRGVjb2RlclN0YXRlIHN0YXRlXzsKLQotICBTdGF0aXN0aWNzQ0Igc3RhdGlzdGljc19jYl87Ci0KLSAgUmVhZENCIHJlYWRfY2JfOwotICBiYXNlOjpDbG9zdXJlIHJlc2V0X2NiXzsKLQotICAvLyBGRm1wZWcgc3RydWN0dXJlcyBvd25lZCBieSB0aGlzIG9iamVjdC4KLSAgQVZDb2RlY0NvbnRleHQqIGNvZGVjX2NvbnRleHRfOwotICBBVkZyYW1lKiBhdl9mcmFtZV87Ci0KLSAgLy8gUG9pbnRlciB0byB0aGUgZGVtdXhlciBzdHJlYW0gdGhhdCB3aWxsIGZlZWQgdXMgY29tcHJlc3NlZCBidWZmZXJzLgotICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IGRlbXV4ZXJfc3RyZWFtXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRkZtcGVnVmlkZW9EZWNvZGVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0ZJTFRFUlNfRkZNUEVHX1ZJREVPX0RFQ09ERVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL2ZmbXBlZ192aWRlb19kZWNvZGVyX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2ZpbHRlcnMvZmZtcGVnX3ZpZGVvX2RlY29kZXJfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMWI1MzguLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvZmZtcGVnX3ZpZGVvX2RlY29kZXJfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2NzEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2tfaGVscGVycy5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2luZ2xldG9uLmgiCi0jaW5jbHVkZSAiYmFzZS9zdHJpbmdfdXRpbC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2dtb2NrX2NhbGxiYWNrX3N1cHBvcnQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2xpbWl0cy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbW9ja19maWx0ZXJzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS90ZXN0X2RhdGFfdXRpbC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdGVzdF9oZWxwZXJzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb19kZWNvZGVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb19mcmFtZS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fdXRpbC5oIgotI2luY2x1ZGUgIm1lZGlhL2ZmbXBlZy9mZm1wZWdfY29tbW9uLmgiCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9mZm1wZWdfZ2x1ZS5oIgotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvZmZtcGVnX3ZpZGVvX2RlY29kZXIuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKLQotdXNpbmcgOjp0ZXN0aW5nOjpfOwotdXNpbmcgOjp0ZXN0aW5nOjpBdExlYXN0OwotdXNpbmcgOjp0ZXN0aW5nOjpJblNlcXVlbmNlOwotdXNpbmcgOjp0ZXN0aW5nOjpJc051bGw7Ci11c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKLXVzaW5nIDo6dGVzdGluZzo6UmV0dXJuUmVmOwotdXNpbmcgOjp0ZXN0aW5nOjpTYXZlQXJnOwotdXNpbmcgOjp0ZXN0aW5nOjpTdHJpY3RNb2NrOwotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1zdGF0aWMgY29uc3QgVmlkZW9GcmFtZTo6Rm9ybWF0IGtWaWRlb0Zvcm1hdCA9IFZpZGVvRnJhbWU6OllWMTI7Ci1zdGF0aWMgY29uc3QgZ2Z4OjpTaXplIGtDb2RlZFNpemUoMzIwLCAyNDApOwotc3RhdGljIGNvbnN0IGdmeDo6UmVjdCBrVmlzaWJsZVJlY3QoMzIwLCAyNDApOwotc3RhdGljIGNvbnN0IGdmeDo6U2l6ZSBrTmF0dXJhbFNpemUoMzIwLCAyNDApOwotc3RhdGljIGNvbnN0IFZpZGVvRnJhbWU6OkZvcm1hdCBrSW5pdFZpZGVvRm9ybWF0ID0gVmlkZW9GcmFtZTo6UkdCMzI7Ci1zdGF0aWMgY29uc3QgZ2Z4OjpTaXplIGtJbml0Q29kZWRTaXplKDEwMCwgMTAwKTsKLXN0YXRpYyBjb25zdCBnZng6OlJlY3Qga0luaXRWaXNpYmxlUmVjdCgxMDAsIDEwMCk7Ci1zdGF0aWMgY29uc3QgZ2Z4OjpTaXplIGtJbml0TmF0dXJhbFNpemUoMTAwLCAxMDApOwotCi1BQ1RJT05fUChSZXR1cm5CdWZmZXIsIGJ1ZmZlcikgewotICBhcmcwLlJ1bihidWZmZXIgPyBEZW11eGVyU3RyZWFtOjprT2sgOiBEZW11eGVyU3RyZWFtOjprQWJvcnRlZCwgYnVmZmVyKTsKLX0KLQotY2xhc3MgRkZtcGVnVmlkZW9EZWNvZGVyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gIEZGbXBlZ1ZpZGVvRGVjb2RlclRlc3QoKQotICAgICAgOiBkZWNvZGVyXyhOVUxMKSwKLSAgICAgICAgZGVtdXhlcl8obmV3IFN0cmljdE1vY2s8TW9ja0RlbXV4ZXJTdHJlYW0+KCkpLAotICAgICAgICByZWFkX2NiXyhiYXNlOjpCaW5kKCZGRm1wZWdWaWRlb0RlY29kZXJUZXN0OjpGcmFtZVJlYWR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKSB7Ci0gICAgRkZtcGVnR2x1ZTo6SW5pdGlhbGl6ZUZGbXBlZygpOwotCi0gICAgZGVjb2Rlcl8gPSBuZXcgRkZtcGVnVmlkZW9EZWNvZGVyKG1lc3NhZ2VfbG9vcF8ubWVzc2FnZV9sb29wX3Byb3h5KCkpOwotCi0gICAgLy8gSW5pdGlhbGl6ZSB2YXJpb3VzIHRlc3QgYnVmZmVycy4KLSAgICBmcmFtZV9idWZmZXJfLnJlc2V0KG5ldyB1aW50OFtrQ29kZWRTaXplLkdldEFyZWEoKV0pOwotICAgIGVuZF9vZl9zdHJlYW1fYnVmZmVyXyA9IERlY29kZXJCdWZmZXI6OkNyZWF0ZUVPU0J1ZmZlcigpOwotICAgIGlfZnJhbWVfYnVmZmVyXyA9IFJlYWRUZXN0RGF0YUZpbGUoInZwOC1JLWZyYW1lLTMyMHgyNDAiKTsKLSAgICBjb3JydXB0X2lfZnJhbWVfYnVmZmVyXyA9IFJlYWRUZXN0RGF0YUZpbGUoInZwOC1jb3JydXB0LUktZnJhbWUiKTsKLSAgfQotCi0gIHZpcnR1YWwgfkZGbXBlZ1ZpZGVvRGVjb2RlclRlc3QoKSB7Ci0gICAgU3RvcCgpOwotICB9Ci0KLSAgdm9pZCBJbml0aWFsaXplKCkgewotICAgIGNvbmZpZ18uSW5pdGlhbGl6ZShrQ29kZWNWUDgsIFZJREVPX0NPREVDX1BST0ZJTEVfVU5LTk9XTiwga1ZpZGVvRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICBrQ29kZWRTaXplLCBrVmlzaWJsZVJlY3QsIGtOYXR1cmFsU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgZmFsc2UsIHRydWUpOwotICAgIEluaXRpYWxpemVXaXRoQ29uZmlnKGNvbmZpZ18pOwotICB9Ci0KLSAgdm9pZCBJbml0aWFsaXplV2l0aEVuY3J5cHRlZENvbmZpZygpIHsKLSAgICBjb25maWdfLkluaXRpYWxpemUoa0NvZGVjVlA4LCBWSURFT19DT0RFQ19QUk9GSUxFX1VOS05PV04sIGtWaWRlb0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAga0NvZGVkU2l6ZSwga1Zpc2libGVSZWN0LCBrTmF0dXJhbFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIHRydWUsIHRydWUpOwotICAgIEluaXRpYWxpemVXaXRoQ29uZmlnKGNvbmZpZ18pOwotICB9Ci0KLSAgdm9pZCBJbml0aWFsaXplV2l0aENvbmZpZ0FuZFN0YXR1cyhjb25zdCBWaWRlb0RlY29kZXJDb25maWcmIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXBlbGluZVN0YXR1cyBzdGF0dXMpIHsKLSAgICBFWFBFQ1RfQ0FMTCgqZGVtdXhlcl8sIHZpZGVvX2RlY29kZXJfY29uZmlnKCkpCi0gICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm5SZWYoY29uZmlnKSk7Ci0KLSAgICBkZWNvZGVyXy0+SW5pdGlhbGl6ZShkZW11eGVyXywgTmV3RXhwZWN0ZWRTdGF0dXNDQihzdGF0dXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoJk1vY2tTdGF0aXN0aWNzQ0I6Ok9uU3RhdGlzdGljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoJnN0YXRpc3RpY3NfY2JfKSkpOwotCi0gICAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLSAgfQotCi0gIHZvaWQgSW5pdGlhbGl6ZVdpdGhDb25maWcoY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiBjb25maWcpIHsKLSAgICBJbml0aWFsaXplV2l0aENvbmZpZ0FuZFN0YXR1cyhjb25maWcsIFBJUEVMSU5FX09LKTsKLSAgfQotCi0gIHZvaWQgUmVzZXQoKSB7Ci0gICAgZGVjb2Rlcl8tPlJlc2V0KE5ld0V4cGVjdGVkQ2xvc3VyZSgpKTsKLSAgICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotICB9Ci0KLSAgdm9pZCBTdG9wKCkgewotICAgIGRlY29kZXJfLT5TdG9wKE5ld0V4cGVjdGVkQ2xvc3VyZSgpKTsKLSAgICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotICB9Ci0KLSAgLy8gU2V0cyB1cCBleHBlY3RhdGlvbnMgYW5kIGFjdGlvbnMgdG8gcHV0IEZGbXBlZ1ZpZGVvRGVjb2RlciBpbiBhbiBhY3RpdmUKLSAgLy8gZGVjb2Rpbmcgc3RhdGUuCi0gIHZvaWQgRW50ZXJEZWNvZGluZ1N0YXRlKCkgewotICAgIFZpZGVvRGVjb2Rlcjo6U3RhdHVzIHN0YXR1czsKLSAgICBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IHZpZGVvX2ZyYW1lOwotICAgIERlY29kZVNpbmdsZUZyYW1lKGlfZnJhbWVfYnVmZmVyXywgJnN0YXR1cywgJnZpZGVvX2ZyYW1lKTsKLQotICAgIEVYUEVDVF9FUShWaWRlb0RlY29kZXI6OmtPaywgc3RhdHVzKTsKLSAgICBBU1NFUlRfVFJVRSh2aWRlb19mcmFtZSk7Ci0gICAgRVhQRUNUX0ZBTFNFKHZpZGVvX2ZyYW1lLT5Jc0VuZE9mU3RyZWFtKCkpOwotICB9Ci0KLSAgLy8gU2V0cyB1cCBleHBlY3RhdGlvbnMgYW5kIGFjdGlvbnMgdG8gcHV0IEZGbXBlZ1ZpZGVvRGVjb2RlciBpbiBhbiBlbmQKLSAgLy8gb2Ygc3RyZWFtIHN0YXRlLgotICB2b2lkIEVudGVyRW5kT2ZTdHJlYW1TdGF0ZSgpIHsKLSAgICBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IHZpZGVvX2ZyYW1lOwotICAgIFZpZGVvRGVjb2Rlcjo6U3RhdHVzIHN0YXR1czsKLSAgICBSZWFkKCZzdGF0dXMsICZ2aWRlb19mcmFtZSk7Ci0gICAgRVhQRUNUX0VRKFZpZGVvRGVjb2Rlcjo6a09rLCBzdGF0dXMpOwotICAgIEFTU0VSVF9UUlVFKHZpZGVvX2ZyYW1lKTsKLSAgICBFWFBFQ1RfVFJVRSh2aWRlb19mcmFtZS0+SXNFbmRPZlN0cmVhbSgpKTsKLSAgfQotCi0gIC8vIERlY29kZXMgdGhlIHNpbmdsZSBjb21wcmVzc2VkIGZyYW1lIGluIHxidWZmZXJ8IGFuZCB3cml0ZXMgdGhlCi0gIC8vIHVuY29tcHJlc3NlZCBvdXRwdXQgdG8gfHZpZGVvX2ZyYW1lfC4gVGhpcyBtZXRob2Qgd29ya3Mgd2l0aCBzaW5nbGUKLSAgLy8gYW5kIG11bHRpdGhyZWFkZWQgZGVjb2RlcnMuIEVuZCBvZiBzdHJlYW0gYnVmZmVycyBhcmUgdXNlZCB0byB0cmlnZ2VyCi0gIC8vIHRoZSBmcmFtZSB0byBiZSByZXR1cm5lZCBpbiB0aGUgbXVsdGl0aHJlYWRlZCBkZWNvZGVyIGNhc2UuCi0gIHZvaWQgRGVjb2RlU2luZ2xlRnJhbWUoY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvRGVjb2Rlcjo6U3RhdHVzKiBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiogdmlkZW9fZnJhbWUpIHsKLSAgICBFWFBFQ1RfQ0FMTCgqZGVtdXhlcl8sIFJlYWQoXykpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm5CdWZmZXIoYnVmZmVyKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybkJ1ZmZlcihlbmRfb2Zfc3RyZWFtX2J1ZmZlcl8pKTsKLQotICAgIEVYUEVDVF9DQUxMKHN0YXRpc3RpY3NfY2JfLCBPblN0YXRpc3RpY3MoXykpOwotCi0gICAgUmVhZChzdGF0dXMsIHZpZGVvX2ZyYW1lKTsKLSAgfQotCi0gIC8vIERlY29kZXMgfGlfZnJhbWVfYnVmZmVyX3wgYW5kIHRoZW4gZGVjb2RlcyB0aGUgZGF0YSBjb250YWluZWQgaW4KLSAgLy8gdGhlIGZpbGUgbmFtZWQgfHRlc3RfZmlsZV9uYW1lfC4gVGhpcyBmdW5jdGlvbiBleHBlY3RzIGJvdGggYnVmZmVycwotICAvLyB0byBkZWNvZGUgdG8gZnJhbWVzIHRoYXQgYXJlIHRoZSBzYW1lIHNpemUuCi0gIHZvaWQgRGVjb2RlSUZyYW1lVGhlblRlc3RGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXN0X2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWRfaGVpZ2h0KSB7Ci0gICAgSW5pdGlhbGl6ZSgpOwotCi0gICAgVmlkZW9EZWNvZGVyOjpTdGF0dXMgc3RhdHVzX2E7Ci0gICAgVmlkZW9EZWNvZGVyOjpTdGF0dXMgc3RhdHVzX2I7Ci0gICAgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiB2aWRlb19mcmFtZV9hOwotICAgIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gdmlkZW9fZnJhbWVfYjsKLQotICAgIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gYnVmZmVyID0gUmVhZFRlc3REYXRhRmlsZSh0ZXN0X2ZpbGVfbmFtZSk7Ci0KLSAgICBFWFBFQ1RfQ0FMTCgqZGVtdXhlcl8sIFJlYWQoXykpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm5CdWZmZXIoaV9mcmFtZV9idWZmZXJfKSkKLSAgICAgICAgLldpbGxPbmNlKFJldHVybkJ1ZmZlcihidWZmZXIpKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuQnVmZmVyKGVuZF9vZl9zdHJlYW1fYnVmZmVyXykpOwotCi0gICAgRVhQRUNUX0NBTEwoc3RhdGlzdGljc19jYl8sIE9uU3RhdGlzdGljcyhfKSkKLSAgICAgICAgLlRpbWVzKDIpOwotCi0gICAgUmVhZCgmc3RhdHVzX2EsICZ2aWRlb19mcmFtZV9hKTsKLSAgICBSZWFkKCZzdGF0dXNfYiwgJnZpZGVvX2ZyYW1lX2IpOwotCi0gICAgZ2Z4OjpTaXplIG9yaWdpbmFsX3NpemUgPSBrVmlzaWJsZVJlY3Quc2l6ZSgpOwotICAgIEVYUEVDVF9FUShWaWRlb0RlY29kZXI6OmtPaywgc3RhdHVzX2EpOwotICAgIEVYUEVDVF9FUShWaWRlb0RlY29kZXI6OmtPaywgc3RhdHVzX2IpOwotICAgIEFTU0VSVF9UUlVFKHZpZGVvX2ZyYW1lX2EpOwotICAgIEFTU0VSVF9UUlVFKHZpZGVvX2ZyYW1lX2IpOwotICAgIEVYUEVDVF9FUShvcmlnaW5hbF9zaXplLndpZHRoKCksCi0gICAgICAgIHZpZGVvX2ZyYW1lX2EtPnZpc2libGVfcmVjdCgpLnNpemUoKS53aWR0aCgpKTsKLSAgICBFWFBFQ1RfRVEob3JpZ2luYWxfc2l6ZS5oZWlnaHQoKSwKLSAgICAgICAgdmlkZW9fZnJhbWVfYS0+dmlzaWJsZV9yZWN0KCkuc2l6ZSgpLmhlaWdodCgpKTsKLSAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfd2lkdGgsIHZpZGVvX2ZyYW1lX2ItPnZpc2libGVfcmVjdCgpLnNpemUoKS53aWR0aCgpKTsKLSAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfaGVpZ2h0LCB2aWRlb19mcmFtZV9iLT52aXNpYmxlX3JlY3QoKS5zaXplKCkuaGVpZ2h0KCkpOwotICB9Ci0KLSAgdm9pZCBSZWFkKFZpZGVvRGVjb2Rlcjo6U3RhdHVzKiBzdGF0dXMsCi0gICAgICAgICAgICBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+KiB2aWRlb19mcmFtZSkgewotICAgIEVYUEVDVF9DQUxMKCp0aGlzLCBGcmFtZVJlYWR5KF8sIF8pKQotICAgICAgICAuV2lsbE9uY2UoRG9BbGwoU2F2ZUFyZzwwPihzdGF0dXMpLCBTYXZlQXJnPDE+KHZpZGVvX2ZyYW1lKSkpOwotCi0gICAgZGVjb2Rlcl8tPlJlYWQocmVhZF9jYl8pOwotCi0gICAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKLSAgfQotCi0gIE1PQ0tfTUVUSE9EMihGcmFtZVJlYWR5LCB2b2lkKFZpZGVvRGVjb2Rlcjo6U3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+JikpOwotCi0gIE1lc3NhZ2VMb29wIG1lc3NhZ2VfbG9vcF87Ci0gIHNjb3BlZF9yZWZwdHI8RkZtcGVnVmlkZW9EZWNvZGVyPiBkZWNvZGVyXzsKLSAgc2NvcGVkX3JlZnB0cjxTdHJpY3RNb2NrPE1vY2tEZW11eGVyU3RyZWFtPiA+IGRlbXV4ZXJfOwotICBNb2NrU3RhdGlzdGljc0NCIHN0YXRpc3RpY3NfY2JfOwotICBWaWRlb0RlY29kZXJDb25maWcgY29uZmlnXzsKLQotICBWaWRlb0RlY29kZXI6OlJlYWRDQiByZWFkX2NiXzsKLQotICAvLyBWYXJpb3VzIGJ1ZmZlcnMgZm9yIHRlc3RpbmcuCi0gIHNjb3BlZF9hcnJheTx1aW50OF90PiBmcmFtZV9idWZmZXJfOwotICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGVuZF9vZl9zdHJlYW1fYnVmZmVyXzsKLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBpX2ZyYW1lX2J1ZmZlcl87Ci0gIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gY29ycnVwdF9pX2ZyYW1lX2J1ZmZlcl87Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRkZtcGVnVmlkZW9EZWNvZGVyVGVzdCk7Ci19OwotCi1URVNUX0YoRkZtcGVnVmlkZW9EZWNvZGVyVGVzdCwgSW5pdGlhbGl6ZV9Ob3JtYWwpIHsKLSAgSW5pdGlhbGl6ZSgpOwotfQotCi1URVNUX0YoRkZtcGVnVmlkZW9EZWNvZGVyVGVzdCwgSW5pdGlhbGl6ZV9VbnN1cHBvcnRlZERlY29kZXIpIHsKLSAgLy8gVGVzdCBhdmNvZGVjX2ZpbmRfZGVjb2RlcigpIHJldHVybmluZyBOVUxMLgotICBWaWRlb0RlY29kZXJDb25maWcgY29uZmlnKGtVbmtub3duVmlkZW9Db2RlYywgVklERU9fQ09ERUNfUFJPRklMRV9VTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWaWRlb0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ29kZWRTaXplLCBrVmlzaWJsZVJlY3QsIGtOYXR1cmFsU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBmYWxzZSk7Ci0gIEluaXRpYWxpemVXaXRoQ29uZmlnQW5kU3RhdHVzKGNvbmZpZywgREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVEKTsKLX0KLQotVEVTVF9GKEZGbXBlZ1ZpZGVvRGVjb2RlclRlc3QsIEluaXRpYWxpemVfVW5zdXBwb3J0ZWRQaXhlbEZvcm1hdCkgewotICAvLyBFbnN1cmUgZGVjb2RlciBoYW5kbGVzIHVuc3VwcG9ydCBwaXhlbCBmb3JtYXRzIHdpdGhvdXQgY3Jhc2hpbmcuCi0gIFZpZGVvRGVjb2RlckNvbmZpZyBjb25maWcoa0NvZGVjVlA4LCBWSURFT19DT0RFQ19QUk9GSUxFX1VOS05PV04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9GcmFtZTo6SU5WQUxJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ29kZWRTaXplLCBrVmlzaWJsZVJlY3QsIGtOYXR1cmFsU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBmYWxzZSk7Ci0gIEluaXRpYWxpemVXaXRoQ29uZmlnQW5kU3RhdHVzKGNvbmZpZywgREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVEKTsKLX0KLQotVEVTVF9GKEZGbXBlZ1ZpZGVvRGVjb2RlclRlc3QsIEluaXRpYWxpemVfT3BlbkRlY29kZXJGYWlscykgewotICAvLyBTcGVjaWZ5IFRoZW9yYSB3L28gZXh0cmEgZGF0YSBzbyB0aGF0IGF2Y29kZWNfb3BlbjIoKSBmYWlscy4KLSAgVmlkZW9EZWNvZGVyQ29uZmlnIGNvbmZpZyhrQ29kZWNUaGVvcmEsIFZJREVPX0NPREVDX1BST0ZJTEVfVU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVmlkZW9Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga0NvZGVkU2l6ZSwga1Zpc2libGVSZWN0LCBrTmF0dXJhbFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgZmFsc2UpOwotICBJbml0aWFsaXplV2l0aENvbmZpZ0FuZFN0YXR1cyhjb25maWcsIERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCk7Ci19Ci0KLVRFU1RfRihGRm1wZWdWaWRlb0RlY29kZXJUZXN0LCBJbml0aWFsaXplX0FzcGVjdFJhdGlvTnVtZXJhdG9yWmVybykgewotICBnZng6OlNpemUgbmF0dXJhbF9zaXplID0gR2V0TmF0dXJhbFNpemUoa1Zpc2libGVSZWN0LnNpemUoKSwgMCwgMSk7Ci0gIFZpZGVvRGVjb2RlckNvbmZpZyBjb25maWcoa0NvZGVjVlA4LCBWUDhQUk9GSUxFX01BSU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZpZGVvRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDb2RlZFNpemUsIGtWaXNpYmxlUmVjdCwgbmF0dXJhbF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIGZhbHNlKTsKLSAgSW5pdGlhbGl6ZVdpdGhDb25maWdBbmRTdGF0dXMoY29uZmlnLCBERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQpOwotfQotCi1URVNUX0YoRkZtcGVnVmlkZW9EZWNvZGVyVGVzdCwgSW5pdGlhbGl6ZV9Bc3BlY3RSYXRpb0Rlbm9taW5hdG9yWmVybykgewotICBnZng6OlNpemUgbmF0dXJhbF9zaXplID0gR2V0TmF0dXJhbFNpemUoa1Zpc2libGVSZWN0LnNpemUoKSwgMSwgMCk7Ci0gIFZpZGVvRGVjb2RlckNvbmZpZyBjb25maWcoa0NvZGVjVlA4LCBWUDhQUk9GSUxFX01BSU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZpZGVvRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDb2RlZFNpemUsIGtWaXNpYmxlUmVjdCwgbmF0dXJhbF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIGZhbHNlKTsKLSAgSW5pdGlhbGl6ZVdpdGhDb25maWdBbmRTdGF0dXMoY29uZmlnLCBERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQpOwotfQotCi1URVNUX0YoRkZtcGVnVmlkZW9EZWNvZGVyVGVzdCwgSW5pdGlhbGl6ZV9Bc3BlY3RSYXRpb051bWVyYXRvck5lZ2F0aXZlKSB7Ci0gIGdmeDo6U2l6ZSBuYXR1cmFsX3NpemUgPSBHZXROYXR1cmFsU2l6ZShrVmlzaWJsZVJlY3Quc2l6ZSgpLCAtMSwgMSk7Ci0gIFZpZGVvRGVjb2RlckNvbmZpZyBjb25maWcoa0NvZGVjVlA4LCBWUDhQUk9GSUxFX01BSU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZpZGVvRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDb2RlZFNpemUsIGtWaXNpYmxlUmVjdCwgbmF0dXJhbF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIGZhbHNlKTsKLSAgSW5pdGlhbGl6ZVdpdGhDb25maWdBbmRTdGF0dXMoY29uZmlnLCBERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQpOwotfQotCi1URVNUX0YoRkZtcGVnVmlkZW9EZWNvZGVyVGVzdCwgSW5pdGlhbGl6ZV9Bc3BlY3RSYXRpb0Rlbm9taW5hdG9yTmVnYXRpdmUpIHsKLSAgZ2Z4OjpTaXplIG5hdHVyYWxfc2l6ZSA9IEdldE5hdHVyYWxTaXplKGtWaXNpYmxlUmVjdC5zaXplKCksIDEsIC0xKTsKLSAgVmlkZW9EZWNvZGVyQ29uZmlnIGNvbmZpZyhrQ29kZWNWUDgsIFZQOFBST0ZJTEVfTUFJTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVmlkZW9Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga0NvZGVkU2l6ZSwga1Zpc2libGVSZWN0LCBuYXR1cmFsX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgZmFsc2UpOwotICBJbml0aWFsaXplV2l0aENvbmZpZ0FuZFN0YXR1cyhjb25maWcsIERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCk7Ci19Ci0KLVRFU1RfRihGRm1wZWdWaWRlb0RlY29kZXJUZXN0LCBJbml0aWFsaXplX0FzcGVjdFJhdGlvTnVtZXJhdG9yVG9vTGFyZ2UpIHsKLSAgaW50IHdpZHRoID0ga1Zpc2libGVSZWN0LnNpemUoKS53aWR0aCgpOwotICBpbnQgbnVtID0gY2VpbChzdGF0aWNfY2FzdDxkb3VibGU+KGxpbWl0czo6a01heERpbWVuc2lvbiArIDEpIC8gd2lkdGgpOwotICBnZng6OlNpemUgbmF0dXJhbF9zaXplID0gR2V0TmF0dXJhbFNpemUoa1Zpc2libGVSZWN0LnNpemUoKSwgbnVtLCAxKTsKLSAgVmlkZW9EZWNvZGVyQ29uZmlnIGNvbmZpZyhrQ29kZWNWUDgsIFZQOFBST0ZJTEVfTUFJTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVmlkZW9Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga0NvZGVkU2l6ZSwga1Zpc2libGVSZWN0LCBuYXR1cmFsX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgZmFsc2UpOwotICBJbml0aWFsaXplV2l0aENvbmZpZ0FuZFN0YXR1cyhjb25maWcsIERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCk7Ci19Ci0KLVRFU1RfRihGRm1wZWdWaWRlb0RlY29kZXJUZXN0LCBJbml0aWFsaXplX0FzcGVjdFJhdGlvRGVub21pbmF0b3JUb29MYXJnZSkgewotICBpbnQgZGVuID0ga1Zpc2libGVSZWN0LnNpemUoKS53aWR0aCgpICsgMTsKLSAgZ2Z4OjpTaXplIG5hdHVyYWxfc2l6ZSA9IEdldE5hdHVyYWxTaXplKGtWaXNpYmxlUmVjdC5zaXplKCksIDEsIGRlbik7Ci0gIFZpZGVvRGVjb2RlckNvbmZpZyBjb25maWcoa0NvZGVjVlA4LCBWUDhQUk9GSUxFX01BSU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZpZGVvRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDb2RlZFNpemUsIGtWaXNpYmxlUmVjdCwgbmF0dXJhbF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIGZhbHNlKTsKLSAgSW5pdGlhbGl6ZVdpdGhDb25maWdBbmRTdGF0dXMoY29uZmlnLCBERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQpOwotfQotCi1URVNUX0YoRkZtcGVnVmlkZW9EZWNvZGVyVGVzdCwgRGVjb2RlRnJhbWVfTm9ybWFsKSB7Ci0gIEluaXRpYWxpemUoKTsKLQotICAvLyBTaW11bGF0ZSBkZWNvZGluZyBhIHNpbmdsZSBmcmFtZS4KLSAgVmlkZW9EZWNvZGVyOjpTdGF0dXMgc3RhdHVzOwotICBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IHZpZGVvX2ZyYW1lOwotICBEZWNvZGVTaW5nbGVGcmFtZShpX2ZyYW1lX2J1ZmZlcl8sICZzdGF0dXMsICZ2aWRlb19mcmFtZSk7Ci0KLSAgRVhQRUNUX0VRKFZpZGVvRGVjb2Rlcjo6a09rLCBzdGF0dXMpOwotICBBU1NFUlRfVFJVRSh2aWRlb19mcmFtZSk7Ci0gIEVYUEVDVF9GQUxTRSh2aWRlb19mcmFtZS0+SXNFbmRPZlN0cmVhbSgpKTsKLX0KLQotLy8gVmVyaWZ5IGN1cnJlbnQgYmVoYXZpb3IgZm9yIDAgYnl0ZSBmcmFtZXMuIEZGbXBlZyBzaW1wbHkgaWdub3JlcwotLy8gdGhlIDAgYnl0ZSBmcmFtZXMuCi1URVNUX0YoRkZtcGVnVmlkZW9EZWNvZGVyVGVzdCwgRGVjb2RlRnJhbWVfMEJ5dGVGcmFtZSkgewotICBJbml0aWFsaXplKCk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiB6ZXJvX2J5dGVfYnVmZmVyID0gbmV3IERlY29kZXJCdWZmZXIoMCk7Ci0KLSAgVmlkZW9EZWNvZGVyOjpTdGF0dXMgc3RhdHVzX2E7Ci0gIFZpZGVvRGVjb2Rlcjo6U3RhdHVzIHN0YXR1c19iOwotICBWaWRlb0RlY29kZXI6OlN0YXR1cyBzdGF0dXNfYzsKLSAgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiB2aWRlb19mcmFtZV9hOwotICBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IHZpZGVvX2ZyYW1lX2I7Ci0gIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gdmlkZW9fZnJhbWVfYzsKLQotICBFWFBFQ1RfQ0FMTCgqZGVtdXhlcl8sIFJlYWQoXykpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuQnVmZmVyKGlfZnJhbWVfYnVmZmVyXykpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuQnVmZmVyKHplcm9fYnl0ZV9idWZmZXIpKQotICAgICAgLldpbGxPbmNlKFJldHVybkJ1ZmZlcihpX2ZyYW1lX2J1ZmZlcl8pKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybkJ1ZmZlcihlbmRfb2Zfc3RyZWFtX2J1ZmZlcl8pKTsKLQotICBFWFBFQ1RfQ0FMTChzdGF0aXN0aWNzX2NiXywgT25TdGF0aXN0aWNzKF8pKQotICAgICAgLlRpbWVzKDIpOwotCi0gIFJlYWQoJnN0YXR1c19hLCAmdmlkZW9fZnJhbWVfYSk7Ci0gIFJlYWQoJnN0YXR1c19iLCAmdmlkZW9fZnJhbWVfYik7Ci0gIFJlYWQoJnN0YXR1c19jLCAmdmlkZW9fZnJhbWVfYyk7Ci0KLSAgRVhQRUNUX0VRKFZpZGVvRGVjb2Rlcjo6a09rLCBzdGF0dXNfYSk7Ci0gIEVYUEVDVF9FUShWaWRlb0RlY29kZXI6OmtPaywgc3RhdHVzX2IpOwotICBFWFBFQ1RfRVEoVmlkZW9EZWNvZGVyOjprT2ssIHN0YXR1c19jKTsKLQotICBBU1NFUlRfVFJVRSh2aWRlb19mcmFtZV9hKTsKLSAgQVNTRVJUX1RSVUUodmlkZW9fZnJhbWVfYik7Ci0gIEFTU0VSVF9UUlVFKHZpZGVvX2ZyYW1lX2MpOwotCi0gIEVYUEVDVF9GQUxTRSh2aWRlb19mcmFtZV9hLT5Jc0VuZE9mU3RyZWFtKCkpOwotICBFWFBFQ1RfRkFMU0UodmlkZW9fZnJhbWVfYi0+SXNFbmRPZlN0cmVhbSgpKTsKLSAgRVhQRUNUX1RSVUUodmlkZW9fZnJhbWVfYy0+SXNFbmRPZlN0cmVhbSgpKTsKLX0KLQotVEVTVF9GKEZGbXBlZ1ZpZGVvRGVjb2RlclRlc3QsIERlY29kZUZyYW1lX0RlY29kZUVycm9yKSB7Ci0gIEluaXRpYWxpemUoKTsKLQotICBFWFBFQ1RfQ0FMTCgqZGVtdXhlcl8sIFJlYWQoXykpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuQnVmZmVyKGNvcnJ1cHRfaV9mcmFtZV9idWZmZXJfKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm5CdWZmZXIoaV9mcmFtZV9idWZmZXJfKSk7Ci0KLSAgLy8gVGhlIGVycm9yIGlzIG9ubHkgcmFpc2VkIG9uIHRoZSBzZWNvbmQgZGVjb2RlIGF0dGVtcHQsIHNvIHdlIGV4cGVjdCBhdAotICAvLyBsZWFzdCBvbmUgc3VjY2Vzc2Z1bCBkZWNvZGUgYnV0IHdlIGRvbid0IGV4cGVjdCBGcmFtZVJlYWR5KCkgdG8gYmUKLSAgLy8gZXhlY3V0ZWQgYXMgYW4gZXJyb3IgaXMgcmFpc2VkIGluc3RlYWQuCi0gIEVYUEVDVF9DQUxMKHN0YXRpc3RpY3NfY2JfLCBPblN0YXRpc3RpY3MoXykpOwotCi0gIC8vIE91ciByZWFkIHNob3VsZCBzdGlsbCBnZXQgc2F0aXNmaWVkIHdpdGggZW5kIG9mIHN0cmVhbSBmcmFtZSBkdXJpbmcgYW4KLSAgLy8gZXJyb3IuCi0gIFZpZGVvRGVjb2Rlcjo6U3RhdHVzIHN0YXR1czsKLSAgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiB2aWRlb19mcmFtZTsKLSAgUmVhZCgmc3RhdHVzLCAmdmlkZW9fZnJhbWUpOwotICBFWFBFQ1RfRVEoVmlkZW9EZWNvZGVyOjprRGVjb2RlRXJyb3IsIHN0YXR1cyk7Ci0gIEVYUEVDVF9GQUxTRSh2aWRlb19mcmFtZSk7Ci19Ci0KLS8vIE11bHRpLXRocmVhZGVkIGRlY29kZXJzIGhhdmUgZGlmZmVyZW50IGJlaGF2aW9yIHRoYW4gc2luZ2xlLXRocmVhZGVkCi0vLyBkZWNvZGVycyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uIE11bHRpdGhyZWFkZWQgZGVjb2RlcnMgaGlkZSBlcnJvcnMKLS8vIHRoYXQgaGFwcGVuIG9uIHRoZSBsYXN0IHxjb2RlY19jb250ZXh0Xy0+dGhyZWFkX2NvdW50fCBmcmFtZXMgdG8gYXZvaWQKLS8vIHByZW1hdHVyZWx5IHNpZ25hbGxpbmcgRU9TLiBUaGlzIHRlc3QganVzdCBleHBvc2VzIHRoYXQgYmVoYXZpb3Igc28gd2UgY2FuCi0vLyBkZXRlY3QgaWYgaXQgY2hhbmdlcy4KLVRFU1RfRihGRm1wZWdWaWRlb0RlY29kZXJUZXN0LCBEZWNvZGVGcmFtZV9EZWNvZGVFcnJvckF0RW5kT2ZTdHJlYW0pIHsKLSAgSW5pdGlhbGl6ZSgpOwotCi0gIFZpZGVvRGVjb2Rlcjo6U3RhdHVzIHN0YXR1czsKLSAgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiB2aWRlb19mcmFtZTsKLSAgRGVjb2RlU2luZ2xlRnJhbWUoY29ycnVwdF9pX2ZyYW1lX2J1ZmZlcl8sICZzdGF0dXMsICZ2aWRlb19mcmFtZSk7Ci0KLSAgRVhQRUNUX0VRKFZpZGVvRGVjb2Rlcjo6a09rLCBzdGF0dXMpOwotICBBU1NFUlRfVFJVRSh2aWRlb19mcmFtZSk7Ci0gIEVYUEVDVF9UUlVFKHZpZGVvX2ZyYW1lLT5Jc0VuZE9mU3RyZWFtKCkpOwotfQotCi0vLyBEZWNvZGUgfGlfZnJhbWVfYnVmZmVyX3wgYW5kIHRoZW4gYSBmcmFtZSB3aXRoIGEgbGFyZ2VyIHdpZHRoIGFuZCB2ZXJpZnkKLS8vIHRoZSBvdXRwdXQgc2l6ZSB3YXMgYWRqdXN0ZWQuCi1URVNUX0YoRkZtcGVnVmlkZW9EZWNvZGVyVGVzdCwgRGVjb2RlRnJhbWVfTGFyZ2VyV2lkdGgpIHsKLSAgRGVjb2RlSUZyYW1lVGhlblRlc3RGaWxlKCJ2cDgtSS1mcmFtZS02NDB4MjQwIiwgNjQwLCAyNDApOwotfQotCi0vLyBEZWNvZGUgfGlfZnJhbWVfYnVmZmVyX3wgYW5kIHRoZW4gYSBmcmFtZSB3aXRoIGEgc21hbGxlciB3aWR0aCBhbmQgdmVyaWZ5Ci0vLyB0aGUgb3V0cHV0IHNpemUgd2FzIGFkanVzdGVkLgotVEVTVF9GKEZGbXBlZ1ZpZGVvRGVjb2RlclRlc3QsIERlY29kZUZyYW1lX1NtYWxsZXJXaWR0aCkgewotICBEZWNvZGVJRnJhbWVUaGVuVGVzdEZpbGUoInZwOC1JLWZyYW1lLTE2MHgyNDAiLCAxNjAsIDI0MCk7Ci19Ci0KLS8vIERlY29kZSB8aV9mcmFtZV9idWZmZXJffCBhbmQgdGhlbiBhIGZyYW1lIHdpdGggYSBsYXJnZXIgaGVpZ2h0IGFuZCB2ZXJpZnkKLS8vIHRoZSBvdXRwdXQgc2l6ZSB3YXMgYWRqdXN0ZWQuCi1URVNUX0YoRkZtcGVnVmlkZW9EZWNvZGVyVGVzdCwgRGVjb2RlRnJhbWVfTGFyZ2VySGVpZ2h0KSB7Ci0gIERlY29kZUlGcmFtZVRoZW5UZXN0RmlsZSgidnA4LUktZnJhbWUtMzIweDQ4MCIsIDMyMCwgNDgwKTsKLX0KLQotLy8gRGVjb2RlIHxpX2ZyYW1lX2J1ZmZlcl98IGFuZCB0aGVuIGEgZnJhbWUgd2l0aCBhIHNtYWxsZXIgaGVpZ2h0IGFuZCB2ZXJpZnkKLS8vIHRoZSBvdXRwdXQgc2l6ZSB3YXMgYWRqdXN0ZWQuCi1URVNUX0YoRkZtcGVnVmlkZW9EZWNvZGVyVGVzdCwgRGVjb2RlRnJhbWVfU21hbGxlckhlaWdodCkgewotICBEZWNvZGVJRnJhbWVUaGVuVGVzdEZpbGUoInZwOC1JLWZyYW1lLTMyMHgxMjAiLCAzMjAsIDEyMCk7Ci19Ci0KLS8vIFRlc3QgcmVzZXR0aW5nIHdoZW4gZGVjb2RlciBoYXMgaW5pdGlhbGl6ZWQgYnV0IG5vdCBkZWNvZGVkLgotVEVTVF9GKEZGbXBlZ1ZpZGVvRGVjb2RlclRlc3QsIFJlc2V0X0luaXRpYWxpemVkKSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgUmVzZXQoKTsKLX0KLQotLy8gVGVzdCByZXNldHRpbmcgd2hlbiBkZWNvZGVyIGhhcyBkZWNvZGVkIHNpbmdsZSBmcmFtZS4KLVRFU1RfRihGRm1wZWdWaWRlb0RlY29kZXJUZXN0LCBSZXNldF9EZWNvZGluZykgewotICBJbml0aWFsaXplKCk7Ci0gIEVudGVyRGVjb2RpbmdTdGF0ZSgpOwotICBSZXNldCgpOwotfQotCi0vLyBUZXN0IHJlc2V0dGluZyB3aGVuIGRlY29kZXIgaGFzIGhpdCBlbmQgb2Ygc3RyZWFtLgotVEVTVF9GKEZGbXBlZ1ZpZGVvRGVjb2RlclRlc3QsIFJlc2V0X0VuZE9mU3RyZWFtKSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgRW50ZXJEZWNvZGluZ1N0YXRlKCk7Ci0gIEVudGVyRW5kT2ZTdHJlYW1TdGF0ZSgpOwotICBSZXNldCgpOwotfQotCi0vLyBUZXN0IHJlc2V0dGluZyB3aGVuIHRoZXJlIGlzIGEgcGVuZGluZyByZWFkIG9uIHRoZSBkZW11eGVyLgotVEVTVF9GKEZGbXBlZ1ZpZGVvRGVjb2RlclRlc3QsIFJlc2V0X0R1cmluZ1BlbmRpbmdSZWFkKSB7Ci0gIEluaXRpYWxpemUoKTsKLQotICAvLyBSZXF1ZXN0IGEgcmVhZCBvbiB0aGUgZGVjb2RlciBhbmQgZW5zdXJlIHRoZSBkZW11eGVyIGhhcyBiZWVuIGNhbGxlZC4KLSAgRGVtdXhlclN0cmVhbTo6UmVhZENCIHJlYWRfY2I7Ci0gIEVYUEVDVF9DQUxMKCpkZW11eGVyXywgUmVhZChfKSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDA+KCZyZWFkX2NiKSk7Ci0gIGRlY29kZXJfLT5SZWFkKHJlYWRfY2JfKTsKLSAgQVNTRVJUX0ZBTFNFKHJlYWRfY2IuaXNfbnVsbCgpKTsKLQotICAvLyBSZXNldCB0aGUgZGVjb2Rlci4KLSAgUmVzZXQoKTsKLQotICBFWFBFQ1RfQ0FMTCgqdGhpcywgRnJhbWVSZWFkeShWaWRlb0RlY29kZXI6OmtPaywgSXNOdWxsKCkpKTsKLQotICByZWFkX2NiLlJ1bihEZW11eGVyU3RyZWFtOjprT2ssIGlfZnJhbWVfYnVmZmVyXyk7Ci19Ci0KLS8vIFRlc3Qgc3RvcHBpbmcgd2hlbiBkZWNvZGVyIGhhcyBpbml0aWFsaXplZCBidXQgbm90IGRlY29kZWQuCi1URVNUX0YoRkZtcGVnVmlkZW9EZWNvZGVyVGVzdCwgU3RvcF9Jbml0aWFsaXplZCkgewotICBJbml0aWFsaXplKCk7Ci0gIFN0b3AoKTsKLX0KLQotLy8gVGVzdCBzdG9wcGluZyB3aGVuIGRlY29kZXIgaGFzIGRlY29kZWQgc2luZ2xlIGZyYW1lLgotVEVTVF9GKEZGbXBlZ1ZpZGVvRGVjb2RlclRlc3QsIFN0b3BfRGVjb2RpbmcpIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBFbnRlckRlY29kaW5nU3RhdGUoKTsKLSAgU3RvcCgpOwotfQotCi0vLyBUZXN0IHN0b3BwaW5nIHdoZW4gZGVjb2RlciBoYXMgaGl0IGVuZCBvZiBzdHJlYW0uCi1URVNUX0YoRkZtcGVnVmlkZW9EZWNvZGVyVGVzdCwgU3RvcF9FbmRPZlN0cmVhbSkgewotICBJbml0aWFsaXplKCk7Ci0gIEVudGVyRGVjb2RpbmdTdGF0ZSgpOwotICBFbnRlckVuZE9mU3RyZWFtU3RhdGUoKTsKLSAgU3RvcCgpOwotfQotCi0vLyBUZXN0IHN0b3BwaW5nIHdoZW4gdGhlcmUgaXMgYSBwZW5kaW5nIHJlYWQgb24gdGhlIGRlbXV4ZXIuCi1URVNUX0YoRkZtcGVnVmlkZW9EZWNvZGVyVGVzdCwgU3RvcF9EdXJpbmdQZW5kaW5nUmVhZCkgewotICBJbml0aWFsaXplKCk7Ci0KLSAgLy8gUmVxdWVzdCBhIHJlYWQgb24gdGhlIGRlY29kZXIgYW5kIGVuc3VyZSB0aGUgZGVtdXhlciBoYXMgYmVlbiBjYWxsZWQuCi0gIERlbXV4ZXJTdHJlYW06OlJlYWRDQiByZWFkX2NiOwotICBFWFBFQ1RfQ0FMTCgqZGVtdXhlcl8sIFJlYWQoXykpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwwPigmcmVhZF9jYikpOwotICBkZWNvZGVyXy0+UmVhZChyZWFkX2NiXyk7Ci0gIEFTU0VSVF9GQUxTRShyZWFkX2NiLmlzX251bGwoKSk7Ci0KLSAgRVhQRUNUX0NBTEwoKnRoaXMsIEZyYW1lUmVhZHkoVmlkZW9EZWNvZGVyOjprT2ssIElzTnVsbCgpKSk7Ci0KLSAgU3RvcCgpOwotCi0gIHJlYWRfY2IuUnVuKERlbXV4ZXJTdHJlYW06OmtPaywgaV9mcmFtZV9idWZmZXJfKTsKLX0KLQotLy8gVGVzdCBhYm9ydGVkIHJlYWQgb24gdGhlIGRlbXV4ZXIgc3RyZWFtLgotVEVTVF9GKEZGbXBlZ1ZpZGVvRGVjb2RlclRlc3QsIERlbXV4ZXJSZWFkX0Fib3J0ZWQpIHsKLSAgSW5pdGlhbGl6ZSgpOwotCi0gIEVYUEVDVF9DQUxMKCpkZW11eGVyXywgUmVhZChfKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm5CdWZmZXIoc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPigpKSk7Ci0KLSAgVmlkZW9EZWNvZGVyOjpTdGF0dXMgc3RhdHVzOwotICBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IHZpZGVvX2ZyYW1lOwotCi0gIFJlYWQoJnN0YXR1cywgJnZpZGVvX2ZyYW1lKTsKLQotICBFWFBFQ1RfRVEoVmlkZW9EZWNvZGVyOjprT2ssIHN0YXR1cyk7Ci0gIEVYUEVDVF9GQUxTRSh2aWRlb19mcmFtZSk7Ci19Ci0KLS8vIFRlc3QgYWJvcnRlZCByZWFkIG9uIHRoZSBkZW11eGVyIHN0cmVhbSBkdXJpbmcgcGVuZGluZyByZXNldC4KLVRFU1RfRihGRm1wZWdWaWRlb0RlY29kZXJUZXN0LCBEZW11eGVyUmVhZF9BYm9ydGVkRHVyaW5nUmVzZXQpIHsKLSAgSW5pdGlhbGl6ZSgpOwotCi0gIC8vIFJlcXVlc3QgYSByZWFkIG9uIHRoZSBkZWNvZGVyIGFuZCBlbnN1cmUgdGhlIGRlbXV4ZXIgaGFzIGJlZW4gY2FsbGVkLgotICBEZW11eGVyU3RyZWFtOjpSZWFkQ0IgcmVhZF9jYjsKLSAgRVhQRUNUX0NBTEwoKmRlbXV4ZXJfLCBSZWFkKF8pKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8MD4oJnJlYWRfY2IpKTsKLSAgZGVjb2Rlcl8tPlJlYWQocmVhZF9jYl8pOwotICBBU1NFUlRfRkFMU0UocmVhZF9jYi5pc19udWxsKCkpOwotCi0gIC8vIFJlc2V0IHdoaWxlIHRoZXJlIGlzIHN0aWxsIGFuIG91dHN0YW5kaW5nIHJlYWQgb24gdGhlIGRlbXV4ZXIuCi0gIFJlc2V0KCk7Ci0KLSAgLy8gU2lnbmFsIGFuIGFib3J0ZWQgZGVtdXhlciByZWFkOiBhIE5VTEwgdmlkZW8gZnJhbWUgc2hvdWxkIGJlIHJldHVybmVkLgotICBFWFBFQ1RfQ0FMTCgqdGhpcywgRnJhbWVSZWFkeShWaWRlb0RlY29kZXI6OmtPaywgSXNOdWxsKCkpKTsKLSAgcmVhZF9jYi5SdW4oRGVtdXhlclN0cmVhbTo6a0Fib3J0ZWQsIE5VTEwpOwotICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotfQotCi0vLyBUZXN0IGNvbmZpZyBjaGFuZ2Ugb24gdGhlIGRlbXV4ZXIgc3RyZWFtLgotVEVTVF9GKEZGbXBlZ1ZpZGVvRGVjb2RlclRlc3QsIERlbXV4ZXJSZWFkX0NvbmZpZ0NoYW5nZSkgewotICAvLyBUT0RPKHhod2FuZyk6IElkZWFsbHkgd2Ugc2hvdWxkIHVzZSBhIGNvZGVjIG90aGVyIHRoYW4gVlA4IGluIHRoZSBpbml0Ci0gIC8vIGNvbmZpZy4gVGhlb3JhIGlzIHRoZSBvbmx5IGNvZGVjIHRoYXQncyBzdXBwb3J0ZWQgb24gYWxsIHBsYXRmb3JtcyBidXQgaXQKLSAgLy8gbmVlZHMgZXh0cmEgZGF0YSB0byBiZSBpbml0aWFsaXplZCBwcm9wZXJseS4KLSAgVmlkZW9EZWNvZGVyQ29uZmlnIGluaXRfY29uZmlnKAotICAgICAga0NvZGVjVlA4LCBWSURFT19DT0RFQ19QUk9GSUxFX1VOS05PV04sIGtJbml0VmlkZW9Gb3JtYXQsCi0gICAgICBrSW5pdENvZGVkU2l6ZSwga0luaXRWaXNpYmxlUmVjdCwga0luaXROYXR1cmFsU2l6ZSwgTlVMTCwgMCwgZmFsc2UpOwotICBJbml0aWFsaXplV2l0aENvbmZpZyhpbml0X2NvbmZpZyk7Ci0KLSAgVmlkZW9EZWNvZGVyQ29uZmlnIG5ld19jb25maWcoCi0gICAgICBrQ29kZWNWUDgsIFZJREVPX0NPREVDX1BST0ZJTEVfVU5LTk9XTiwga1ZpZGVvRm9ybWF0LAotICAgICAga0NvZGVkU2l6ZSwga1Zpc2libGVSZWN0LCBrTmF0dXJhbFNpemUsIE5VTEwsIDAsIGZhbHNlKTsKLSAgRVhQRUNUX0NBTEwoKmRlbXV4ZXJfLCB2aWRlb19kZWNvZGVyX2NvbmZpZygpKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVyblJlZihuZXdfY29uZmlnKSk7Ci0gIEVYUEVDVF9DQUxMKCpkZW11eGVyXywgUmVhZChfKSkKLSAgICAgIC5XaWxsT25jZShSdW5DYWxsYmFjazwwPihEZW11eGVyU3RyZWFtOjprQ29uZmlnQ2hhbmdlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+KCkpKQotICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrPDA+KERlbXV4ZXJTdHJlYW06OmtPaywgaV9mcmFtZV9idWZmZXJfKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSdW5DYWxsYmFjazwwPihEZW11eGVyU3RyZWFtOjprT2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX29mX3N0cmVhbV9idWZmZXJfKSk7Ci0gIEVYUEVDVF9DQUxMKHN0YXRpc3RpY3NfY2JfLCBPblN0YXRpc3RpY3MoXykpOwotCi0gIFZpZGVvRGVjb2Rlcjo6U3RhdHVzIHN0YXR1czsKLSAgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiB2aWRlb19mcmFtZTsKLQotICBSZWFkKCZzdGF0dXMsICZ2aWRlb19mcmFtZSk7Ci0KLSAgRVhQRUNUX0VRKFZpZGVvRGVjb2Rlcjo6a09rLCBzdGF0dXMpOwotICBBU1NFUlRfVFJVRSh2aWRlb19mcmFtZSk7Ci0gIEVYUEVDVF9GQUxTRSh2aWRlb19mcmFtZS0+SXNFbmRPZlN0cmVhbSgpKTsKLX0KLQotLy8gVGVzdCBjb25maWcgY2hhbmdlIGZhaWx1cmUuCi1URVNUX0YoRkZtcGVnVmlkZW9EZWNvZGVyVGVzdCwgRGVtdXhlclJlYWRfQ29uZmlnQ2hhbmdlRmFpbGVkKSB7Ci0gIEluaXRpYWxpemUoKTsKLQotICBWaWRlb0RlY29kZXJDb25maWcgaW52YWxpZF9jb25maWcoCi0gICAgICBrVW5rbm93blZpZGVvQ29kZWMsIFZJREVPX0NPREVDX1BST0ZJTEVfVU5LTk9XTiwgVmlkZW9GcmFtZTo6SU5WQUxJRCwKLSAgICAgIGtDb2RlZFNpemUsIGtWaXNpYmxlUmVjdCwga05hdHVyYWxTaXplLCBOVUxMLCAwLCBmYWxzZSk7Ci0gIEVYUEVDVF9DQUxMKCpkZW11eGVyXywgdmlkZW9fZGVjb2Rlcl9jb25maWcoKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm5SZWYoaW52YWxpZF9jb25maWcpKTsKLSAgRVhQRUNUX0NBTEwoKmRlbXV4ZXJfLCBSZWFkKF8pKQotICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrPDA+KERlbXV4ZXJTdHJlYW06OmtDb25maWdDaGFuZ2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4oKSkpOwotCi0gIFZpZGVvRGVjb2Rlcjo6U3RhdHVzIHN0YXR1czsKLSAgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiB2aWRlb19mcmFtZTsKLQotICBSZWFkKCZzdGF0dXMsICZ2aWRlb19mcmFtZSk7Ci0KLSAgRVhQRUNUX0VRKFZpZGVvRGVjb2Rlcjo6a0RlY29kZUVycm9yLCBzdGF0dXMpOwotICBBU1NFUlRfRkFMU0UodmlkZW9fZnJhbWUpOwotfQotCi0vLyBUZXN0IGNvbmZpZyBjaGFuZ2Ugb24gdGhlIGRlbXV4ZXIgc3RyZWFtIGR1cmluZyBwZW5kaW5nIHJlc2V0LgotVEVTVF9GKEZGbXBlZ1ZpZGVvRGVjb2RlclRlc3QsIERlbXV4ZXJSZWFkX0NvbmZpZ0NoYW5nZUR1cmluZ1Jlc2V0KSB7Ci0gIC8vIFRPRE8oeGh3YW5nKTogSWRlYWxseSB3ZSBzaG91bGQgdXNlIGEgY29kZWMgb3RoZXIgdGhhbiBWUDggaW4gdGhlIGluaXQKLSAgLy8gY29uZmlnLiBUaGVvcmEgaXMgdGhlIG9ubHkgY29kZWMgdGhhdCdzIHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zIGJ1dCBpdAotICAvLyBuZWVkcyBleHRyYSBkYXRhIHRvIGJlIGluaXRpYWxpemVkIHByb3Blcmx5LgotICBWaWRlb0RlY29kZXJDb25maWcgaW5pdF9jb25maWcoCi0gICAgICBrQ29kZWNWUDgsIFZJREVPX0NPREVDX1BST0ZJTEVfVU5LTk9XTiwga0luaXRWaWRlb0Zvcm1hdCwKLSAgICAgIGtJbml0Q29kZWRTaXplLCBrSW5pdFZpc2libGVSZWN0LCBrSW5pdE5hdHVyYWxTaXplLCBOVUxMLCAwLCBmYWxzZSk7Ci0gIEluaXRpYWxpemVXaXRoQ29uZmlnKGluaXRfY29uZmlnKTsKLQotICAvLyBSZXF1ZXN0IGEgcmVhZCBvbiB0aGUgZGVjb2RlciBhbmQgZW5zdXJlIHRoZSBkZW11eGVyIGhhcyBiZWVuIGNhbGxlZC4KLSAgRGVtdXhlclN0cmVhbTo6UmVhZENCIHJlYWRfY2I7Ci0gIEVYUEVDVF9DQUxMKCpkZW11eGVyXywgUmVhZChfKSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDA+KCZyZWFkX2NiKSk7Ci0gIGRlY29kZXJfLT5SZWFkKHJlYWRfY2JfKTsKLSAgQVNTRVJUX0ZBTFNFKHJlYWRfY2IuaXNfbnVsbCgpKTsKLQotICAvLyBSZXNldCB3aGlsZSB0aGVyZSBpcyBzdGlsbCBhbiBvdXRzdGFuZGluZyByZWFkIG9uIHRoZSBkZW11eGVyLgotICBSZXNldCgpOwotCi0gIFZpZGVvRGVjb2RlckNvbmZpZyBuZXdfY29uZmlnKAotICAgICAga0NvZGVjVlA4LCBWSURFT19DT0RFQ19QUk9GSUxFX1VOS05PV04sIGtWaWRlb0Zvcm1hdCwKLSAgICAgIGtDb2RlZFNpemUsIGtWaXNpYmxlUmVjdCwga05hdHVyYWxTaXplLCBOVUxMLCAwLCBmYWxzZSk7Ci0gIEVYUEVDVF9DQUxMKCpkZW11eGVyXywgdmlkZW9fZGVjb2Rlcl9jb25maWcoKSkKLSAgICAgIC5UaW1lcyhBdExlYXN0KDEpKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVyblJlZihuZXdfY29uZmlnKSk7Ci0gIEVYUEVDVF9DQUxMKCp0aGlzLCBGcmFtZVJlYWR5KFZpZGVvRGVjb2Rlcjo6a09rLCBJc051bGwoKSkpOwotCi0gIC8vIFNpZ25hbCBhIGNvbmZpZyBjaGFuZ2UuCi0gIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZyZWFkX2NiKS5SdW4oRGVtdXhlclN0cmVhbTo6a0NvbmZpZ0NoYW5nZWQsIE5VTEwpOwotICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotCi0gIC8vIE5vdyB0aGUgZGVjb2RlciBzaG91bGQgYmUgaW4gYSBjbGVhbiBpbml0aWFsaXplZCBzdGF0ZSAoaW5pdGlhbGl6ZWQgd2l0aAotICAvLyB8bmV3X2NvbmZpZ3wpIGFuZCBiZSByZWFkeSB0byBkZWNvZGUgfGlfZnJhbWVfYnVmZmVyX3wuCi0gIEVYUEVDVF9DQUxMKCpkZW11eGVyXywgUmVhZChfKSkKLSAgICAgIC5XaWxsT25jZShSdW5DYWxsYmFjazwwPihEZW11eGVyU3RyZWFtOjprT2ssIGlfZnJhbWVfYnVmZmVyXykpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUnVuQ2FsbGJhY2s8MD4oRGVtdXhlclN0cmVhbTo6a09rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9vZl9zdHJlYW1fYnVmZmVyXykpOwotICBFWFBFQ1RfQ0FMTChzdGF0aXN0aWNzX2NiXywgT25TdGF0aXN0aWNzKF8pKTsKLQotICBWaWRlb0RlY29kZXI6OlN0YXR1cyBzdGF0dXM7Ci0gIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gdmlkZW9fZnJhbWU7Ci0KLSAgUmVhZCgmc3RhdHVzLCAmdmlkZW9fZnJhbWUpOwotCi0gIEVYUEVDVF9FUShWaWRlb0RlY29kZXI6OmtPaywgc3RhdHVzKTsKLSAgQVNTRVJUX1RSVUUodmlkZW9fZnJhbWUpOwotICBFWFBFQ1RfRkFMU0UodmlkZW9fZnJhbWUtPklzRW5kT2ZTdHJlYW0oKSk7Ci19Ci0KLS8vIFRlc3QgZmFpbGVkIGNvbmZpZyBjaGFuZ2UgZHVyaW5nIHBlbmRpbmcgcmVzZXQuCi1URVNUX0YoRkZtcGVnVmlkZW9EZWNvZGVyVGVzdCwgRGVtdXhlclJlYWRfQ29uZmlnQ2hhbmdlRmFpbGVkRHVyaW5nUmVzZXQpIHsKLSAgSW5pdGlhbGl6ZSgpOwotCi0gIC8vIFJlcXVlc3QgYSByZWFkIG9uIHRoZSBkZWNvZGVyIGFuZCBlbnN1cmUgdGhlIGRlbXV4ZXIgaGFzIGJlZW4gY2FsbGVkLgotICBEZW11eGVyU3RyZWFtOjpSZWFkQ0IgcmVhZF9jYjsKLSAgRVhQRUNUX0NBTEwoKmRlbXV4ZXJfLCBSZWFkKF8pKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8MD4oJnJlYWRfY2IpKTsKLSAgZGVjb2Rlcl8tPlJlYWQocmVhZF9jYl8pOwotICBBU1NFUlRfRkFMU0UocmVhZF9jYi5pc19udWxsKCkpOwotCi0gIC8vIFJlc2V0IHdoaWxlIHRoZXJlIGlzIHN0aWxsIGFuIG91dHN0YW5kaW5nIHJlYWQgb24gdGhlIGRlbXV4ZXIuCi0gIFJlc2V0KCk7Ci0KLSAgVmlkZW9EZWNvZGVyQ29uZmlnIGludmFsaWRfY29uZmlnKAotICAgICAga1Vua25vd25WaWRlb0NvZGVjLCBWSURFT19DT0RFQ19QUk9GSUxFX1VOS05PV04sIFZpZGVvRnJhbWU6OklOVkFMSUQsCi0gICAgICBrQ29kZWRTaXplLCBrVmlzaWJsZVJlY3QsIGtOYXR1cmFsU2l6ZSwgTlVMTCwgMCwgZmFsc2UpOwotICBFWFBFQ1RfQ0FMTCgqZGVtdXhlcl8sIHZpZGVvX2RlY29kZXJfY29uZmlnKCkpCi0gICAgICAuVGltZXMoQXRMZWFzdCgxKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm5SZWYoaW52YWxpZF9jb25maWcpKTsKLSAgRVhQRUNUX0NBTEwoKnRoaXMsIEZyYW1lUmVhZHkoVmlkZW9EZWNvZGVyOjprRGVjb2RlRXJyb3IsIElzTnVsbCgpKSk7Ci0KLSAgLy8gU2lnbmFsIGEgY29uZmlnIGNoYW5nZS4KLSAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnJlYWRfY2IpLlJ1bihEZW11eGVyU3RyZWFtOjprQ29uZmlnQ2hhbmdlZCwgTlVMTCk7Ci0gIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvZmlsZV9kYXRhX3NvdXJjZS5jYyBiL3NyYy9tZWRpYS9maWx0ZXJzL2ZpbGVfZGF0YV9zb3VyY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYjVjNTguLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvZmlsZV9kYXRhX3NvdXJjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL2ZpbGVfZGF0YV9zb3VyY2UuaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1GaWxlRGF0YVNvdXJjZTo6RmlsZURhdGFTb3VyY2UoKQotICAgIDogZm9yY2VfcmVhZF9lcnJvcnNfKGZhbHNlKSwKLSAgICAgIGZvcmNlX3N0cmVhbWluZ18oZmFsc2UpIHsKLX0KLQotYm9vbCBGaWxlRGF0YVNvdXJjZTo6SW5pdGlhbGl6ZShjb25zdCBGaWxlUGF0aCYgZmlsZV9wYXRoKSB7Ci0gIERDSEVDSyghZmlsZV8uSXNWYWxpZCgpKTsKLQotICBpZiAoIWZpbGVfLkluaXRpYWxpemUoZmlsZV9wYXRoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgVXBkYXRlSG9zdEJ5dGVzKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEZpbGVEYXRhU291cmNlOjpzZXRfaG9zdChEYXRhU291cmNlSG9zdCogaG9zdCkgewotICBEYXRhU291cmNlOjpzZXRfaG9zdChob3N0KTsKLSAgVXBkYXRlSG9zdEJ5dGVzKCk7Ci19Ci0KLXZvaWQgRmlsZURhdGFTb3VyY2U6OlN0b3AoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spIHsKLSAgY2FsbGJhY2suUnVuKCk7Ci19Ci0KLXZvaWQgRmlsZURhdGFTb3VyY2U6OlJlYWQoaW50NjQgcG9zaXRpb24sIGludCBzaXplLCB1aW50OCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YVNvdXJjZTo6UmVhZENCJiByZWFkX2NiKSB7Ci0gIGlmIChmb3JjZV9yZWFkX2Vycm9yc18gfHwgIWZpbGVfLklzVmFsaWQoKSkgewotICAgIHJlYWRfY2IuUnVuKGtSZWFkRXJyb3IpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGludDY0IGZpbGVfc2l6ZSA9IGZpbGVfLmxlbmd0aCgpOwotCi0gIENIRUNLX0dFKGZpbGVfc2l6ZSwgMCk7Ci0gIENIRUNLX0dFKHBvc2l0aW9uLCAwKTsKLSAgQ0hFQ0tfR0Uoc2l6ZSwgMCk7Ci0KLSAgLy8gQ2FwIHBvc2l0aW9uIGFuZCBzaXplIHdpdGhpbiBib3VuZHMuCi0gIHBvc2l0aW9uID0gc3RkOjptaW4ocG9zaXRpb24sIGZpbGVfc2l6ZSk7Ci0gIGludDY0IGNsYW1wZWRfc2l6ZSA9IHN0ZDo6bWluKHN0YXRpY19jYXN0PGludDY0PihzaXplKSwgZmlsZV9zaXplIC0gcG9zaXRpb24pOwotCi0gIG1lbWNweShkYXRhLCBmaWxlXy5kYXRhKCkgKyBwb3NpdGlvbiwgY2xhbXBlZF9zaXplKTsKLSAgcmVhZF9jYi5SdW4oY2xhbXBlZF9zaXplKTsKLX0KLQotYm9vbCBGaWxlRGF0YVNvdXJjZTo6R2V0U2l6ZShpbnQ2NCogc2l6ZV9vdXQpIHsKLSAgKnNpemVfb3V0ID0gZmlsZV8ubGVuZ3RoKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEZpbGVEYXRhU291cmNlOjpJc1N0cmVhbWluZygpIHsKLSAgcmV0dXJuIGZvcmNlX3N0cmVhbWluZ187Ci19Ci0KLXZvaWQgRmlsZURhdGFTb3VyY2U6OlNldEJpdHJhdGUoaW50IGJpdHJhdGUpIHt9Ci0KLUZpbGVEYXRhU291cmNlOjp+RmlsZURhdGFTb3VyY2UoKSB7fQotCi12b2lkIEZpbGVEYXRhU291cmNlOjpVcGRhdGVIb3N0Qnl0ZXMoKSB7Ci0gIGlmIChob3N0KCkgJiYgZmlsZV8uSXNWYWxpZCgpKSB7Ci0gICAgaG9zdCgpLT5TZXRUb3RhbEJ5dGVzKGZpbGVfLmxlbmd0aCgpKTsKLSAgICBob3N0KCktPkFkZEJ1ZmZlcmVkQnl0ZVJhbmdlKDAsIGZpbGVfLmxlbmd0aCgpKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL2ZpbGVfZGF0YV9zb3VyY2UuaCBiL3NyYy9tZWRpYS9maWx0ZXJzL2ZpbGVfZGF0YV9zb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM0NmJmNy4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9maWxlX2RhdGFfc291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0ZJTFRFUlNfRklMRV9EQVRBX1NPVVJDRV9IXwotI2RlZmluZSBNRURJQV9GSUxURVJTX0ZJTEVfREFUQV9TT1VSQ0VfSF8KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvZmlsZV9wYXRoLmgiCi0jaW5jbHVkZSAiYmFzZS9maWxlX3V0aWwuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RhdGFfc291cmNlLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIEJhc2ljIGRhdGEgc291cmNlIHRoYXQgdHJlYXRzIHRoZSBVUkwgYXMgYSBmaWxlIHBhdGgsIGFuZCB1c2VzIHRoZSBmaWxlCi0vLyBzeXN0ZW0gdG8gcmVhZCBkYXRhIGZvciBhIG1lZGlhIHBpcGVsaW5lLgotY2xhc3MgTUVESUFfRVhQT1JUIEZpbGVEYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgewotIHB1YmxpYzoKLSAgRmlsZURhdGFTb3VyY2UoKTsKLQotICBib29sIEluaXRpYWxpemUoY29uc3QgRmlsZVBhdGgmIGZpbGVfcGF0aCk7Ci0KLSAgLy8gSW1wbGVtZW50YXRpb24gb2YgRGF0YVNvdXJjZS4KLSAgdmlydHVhbCB2b2lkIHNldF9ob3N0KERhdGFTb3VyY2VIb3N0KiBob3N0KSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0b3AoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgUmVhZChpbnQ2NCBwb3NpdGlvbiwgaW50IHNpemUsIHVpbnQ4KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhU291cmNlOjpSZWFkQ0ImIHJlYWRfY2IpIE9WRVJSSURFOwotICB2aXJ0dWFsIGJvb2wgR2V0U2l6ZShpbnQ2NCogc2l6ZV9vdXQpIE9WRVJSSURFOwotICB2aXJ0dWFsIGJvb2wgSXNTdHJlYW1pbmcoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFNldEJpdHJhdGUoaW50IGJpdHJhdGUpIE9WRVJSSURFOwotCi0gIC8vIFVuaXQgdGVzdCBoZWxwZXJzLiBSZWNyZWF0ZSB0aGUgb2JqZWN0IGlmIHlvdSB3YW50IHRoZSBkZWZhdWx0IGJlaGF2aW91ci4KLSAgdm9pZCBmb3JjZV9yZWFkX2Vycm9yc19mb3JfdGVzdGluZygpIHsgZm9yY2VfcmVhZF9lcnJvcnNfID0gdHJ1ZTsgfQotICB2b2lkIGZvcmNlX3N0cmVhbWluZ19mb3JfdGVzdGluZygpIHsgZm9yY2Vfc3RyZWFtaW5nXyA9IHRydWU7IH0KLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB+RmlsZURhdGFTb3VyY2UoKTsKLQotIHByaXZhdGU6Ci0gIC8vIEluZm9ybXMgdGhlIGhvc3Qgb2YgY2hhbmdlcyBpbiB0b3RhbCBhbmQgYnVmZmVyZWQgYnl0ZXMuCi0gIHZvaWQgVXBkYXRlSG9zdEJ5dGVzKCk7Ci0KLSAgZmlsZV91dGlsOjpNZW1vcnlNYXBwZWRGaWxlIGZpbGVfOwotCi0gIGJvb2wgZm9yY2VfcmVhZF9lcnJvcnNfOwotICBib29sIGZvcmNlX3N0cmVhbWluZ187Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEZpbGVEYXRhU291cmNlKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0ZJTFRFUlNfRklMRV9EQVRBX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvZmlsZV9kYXRhX3NvdXJjZV91bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9maWx0ZXJzL2ZpbGVfZGF0YV9zb3VyY2VfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZWFhZDAuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvZmlsZV9kYXRhX3NvdXJjZV91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYmFzZS9iYXNlX3BhdGhzLmgiCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiYmFzZS9maWxlX3BhdGguaCIKLSNpbmNsdWRlICJiYXNlL3BhdGhfc2VydmljZS5oIgotI2luY2x1ZGUgImJhc2UvdXRmX3N0cmluZ19jb252ZXJzaW9ucy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbW9ja19kYXRhX3NvdXJjZV9ob3N0LmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS90ZXN0X2hlbHBlcnMuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL2ZpbGVfZGF0YV9zb3VyY2UuaCIKLQotdXNpbmcgOjp0ZXN0aW5nOjpOaWNlTW9jazsKLXVzaW5nIDo6dGVzdGluZzo6U3RyaWN0TW9jazsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgUmVhZENCSGFuZGxlciB7Ci0gcHVibGljOgotICBSZWFkQ0JIYW5kbGVyKCkge30KLQotICBNT0NLX01FVEhPRDEoUmVhZENCLCB2b2lkKGludCBzaXplKSk7Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oUmVhZENCSGFuZGxlcik7Ci19OwotCi0vLyBSZXR1cm5zIGEgcGF0aCB0byB0aGUgdGVzdCBmaWxlIHdoaWNoIGNvbnRhaW5zIHRoZSBzdHJpbmcgIjAxMjM0NTY3ODkiCi0vLyB3aXRob3V0IHRoZSBxdW90ZXMgb3IgYW55IHRyYWlsaW5nIHNwYWNlIG9yIG51bGwgdGVybWluYXRpb24uICBUaGUgZmlsZSBsaXZlcwotLy8gdW5kZXIgdGhlIG1lZGlhL3Rlc3QvZGF0YSBkaXJlY3RvcnkuICBVbmRlciBXaW5kb3dzLCBzdHJpbmdzIGZvciB0aGUKLS8vIEZpbGVQYXRoIGNsYXNzIGFyZSB1bmljb2RlLCBhbmQgdGhlIHBpcGVsaW5lIHdhbnRzIGNoYXIgc3RyaW5ncy4gIENvbnZlcnQKLS8vIHRoZSBzdHJpbmcgdG8gVVRGOCB1bmRlciBXaW5kb3dzLiAgRm9yIE1hYyBhbmQgTGludXgsIGZpbGUgcGF0aHMgYXJlIGFscmVhZHkKLS8vIGNoYXJzIHNvIGp1c3QgcmV0dXJuIHRoZSBzdHJpbmcgZnJvbSB0aGUgRmlsZVBhdGguCi1GaWxlUGF0aCBUZXN0RmlsZVVSTCgpIHsKLSAgRmlsZVBhdGggZGF0YV9kaXI7Ci0gIEVYUEVDVF9UUlVFKFBhdGhTZXJ2aWNlOjpHZXQoYmFzZTo6RElSX1NPVVJDRV9ST09ULCAmZGF0YV9kaXIpKTsKLSAgZGF0YV9kaXIgPSBkYXRhX2Rpci5BcHBlbmQoRklMRV9QQVRIX0xJVEVSQUwoIm1lZGlhIikpCi0gICAgICAgICAgICAgICAgICAgICAuQXBwZW5kKEZJTEVfUEFUSF9MSVRFUkFMKCJ0ZXN0IikpCi0gICAgICAgICAgICAgICAgICAgICAuQXBwZW5kKEZJTEVfUEFUSF9MSVRFUkFMKCJkYXRhIikpCi0gICAgICAgICAgICAgICAgICAgICAuQXBwZW5kKEZJTEVfUEFUSF9MSVRFUkFMKCJ0ZW5fYnl0ZV9maWxlIikpOwotICByZXR1cm4gZGF0YV9kaXI7Ci19Ci0KLS8vIFRlc3QgdGhhdCBGaWxlRGF0YVNvdXJjZSBjYWxsIHRoZSBhcHByb3ByaWF0ZSBtZXRob2RzIG9uIGl0cyBmaWx0ZXIgaG9zdC4KLVRFU1QoRmlsZURhdGFTb3VyY2VUZXN0LCBPcGVuRmlsZSkgewotICBTdHJpY3RNb2NrPE1vY2tEYXRhU291cmNlSG9zdD4gaG9zdDsKLSAgRVhQRUNUX0NBTEwoaG9zdCwgU2V0VG90YWxCeXRlcygxMCkpOwotICBFWFBFQ1RfQ0FMTChob3N0LCBBZGRCdWZmZXJlZEJ5dGVSYW5nZSgwLCAxMCkpOwotCi0gIHNjb3BlZF9yZWZwdHI8RmlsZURhdGFTb3VyY2U+IGZpbHRlcihuZXcgRmlsZURhdGFTb3VyY2UoKSk7Ci0gIGZpbHRlci0+c2V0X2hvc3QoJmhvc3QpOwotICBFWFBFQ1RfVFJVRShmaWx0ZXItPkluaXRpYWxpemUoVGVzdEZpbGVVUkwoKSkpOwotCi0gIGZpbHRlci0+U3RvcChOZXdFeHBlY3RlZENsb3N1cmUoKSk7Ci19Ci0KLS8vIFVzZSB0aGUgbW9jayBmaWx0ZXIgaG9zdCB0byBkaXJlY3RseSBjYWxsIHRoZSBSZWFkIGFuZCBHZXRQb3NpdGlvbiBtZXRob2RzLgotVEVTVChGaWxlRGF0YVNvdXJjZVRlc3QsIFJlYWREYXRhKSB7Ci0gIGludDY0IHNpemU7Ci0gIHVpbnQ4IHRlbl9ieXRlc1sxMF07Ci0KLSAgLy8gQ3JlYXRlIG91ciBtb2NrIGZpbHRlciBob3N0IGFuZCBpbml0aWFsaXplIHRoZSBkYXRhIHNvdXJjZS4KLSAgTmljZU1vY2s8TW9ja0RhdGFTb3VyY2VIb3N0PiBob3N0OwotICBzY29wZWRfcmVmcHRyPEZpbGVEYXRhU291cmNlPiBmaWx0ZXIobmV3IEZpbGVEYXRhU291cmNlKCkpOwotCi0gIGZpbHRlci0+c2V0X2hvc3QoJmhvc3QpOwotICBFWFBFQ1RfVFJVRShmaWx0ZXItPkluaXRpYWxpemUoVGVzdEZpbGVVUkwoKSkpOwotCi0gIEVYUEVDVF9UUlVFKGZpbHRlci0+R2V0U2l6ZSgmc2l6ZSkpOwotICBFWFBFQ1RfRVEoMTAsIHNpemUpOwotCi0gIFJlYWRDQkhhbmRsZXIgaGFuZGxlcjsKLSAgRVhQRUNUX0NBTEwoaGFuZGxlciwgUmVhZENCKDEwKSk7Ci0gIGZpbHRlci0+UmVhZCgwLCAxMCwgdGVuX2J5dGVzLCBiYXNlOjpCaW5kKAotICAgICAgJlJlYWRDQkhhbmRsZXI6OlJlYWRDQiwgYmFzZTo6VW5yZXRhaW5lZCgmaGFuZGxlcikpKTsKLSAgRVhQRUNUX0VRKCcwJywgdGVuX2J5dGVzWzBdKTsKLSAgRVhQRUNUX0VRKCc1JywgdGVuX2J5dGVzWzVdKTsKLSAgRVhQRUNUX0VRKCc5JywgdGVuX2J5dGVzWzldKTsKLQotICBFWFBFQ1RfQ0FMTChoYW5kbGVyLCBSZWFkQ0IoMSkpOwotICBmaWx0ZXItPlJlYWQoOSwgMSwgdGVuX2J5dGVzLCBiYXNlOjpCaW5kKAotICAgICAgJlJlYWRDQkhhbmRsZXI6OlJlYWRDQiwgYmFzZTo6VW5yZXRhaW5lZCgmaGFuZGxlcikpKTsKLSAgRVhQRUNUX0VRKCc5JywgdGVuX2J5dGVzWzBdKTsKLQotICBFWFBFQ1RfQ0FMTChoYW5kbGVyLCBSZWFkQ0IoMCkpOwotICBmaWx0ZXItPlJlYWQoMTAsIDEwLCB0ZW5fYnl0ZXMsIGJhc2U6OkJpbmQoCi0gICAgICAmUmVhZENCSGFuZGxlcjo6UmVhZENCLCBiYXNlOjpVbnJldGFpbmVkKCZoYW5kbGVyKSkpOwotCi0gIEVYUEVDVF9DQUxMKGhhbmRsZXIsIFJlYWRDQig1KSk7Ci0gIGZpbHRlci0+UmVhZCg1LCAxMCwgdGVuX2J5dGVzLCBiYXNlOjpCaW5kKAotICAgICAgJlJlYWRDQkhhbmRsZXI6OlJlYWRDQiwgYmFzZTo6VW5yZXRhaW5lZCgmaGFuZGxlcikpKTsKLSAgRVhQRUNUX0VRKCc1JywgdGVuX2J5dGVzWzBdKTsKLQotICBmaWx0ZXItPlN0b3AoTmV3RXhwZWN0ZWRDbG9zdXJlKCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL2gyNjRfdG9fYW5uZXhfYl9iaXRzdHJlYW1fY29udmVydGVyLmNjIGIvc3JjL21lZGlhL2ZpbHRlcnMvaDI2NF90b19hbm5leF9iX2JpdHN0cmVhbV9jb252ZXJ0ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhODMwZWEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvaDI2NF90b19hbm5leF9iX2JpdHN0cmVhbV9jb252ZXJ0ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvaDI2NF90b19hbm5leF9iX2JpdHN0cmVhbV9jb252ZXJ0ZXIuaCIKLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1zdGF0aWMgY29uc3QgdWludDgga1N0YXJ0Q29kZVByZWZpeFszXSA9IHswLCAwLCAxfTsKLQotLy8gSGVscGVyIGZ1bmN0aW9uIHdoaWNoIGRldGVybWluZXMgd2hldGhlciBOQUwgdW5pdCBvZiBnaXZlbiB0eXBlIG1hcmtzCi0vLyBhY2Nlc3MgdW5pdCBib3VuZGFyeS4KLXN0YXRpYyBib29sIElzQWNjZXNzVW5pdEJvdW5kYXJ5TmFsKGludCBuYWxfdW5pdF90eXBlKSB7Ci0gIC8vIENoZWNrIGlmIHRoaXMgcGFja2V0IG1hcmtzIGFjY2VzcyB1bml0IGJvdW5kYXJ5IGJ5IGNoZWNraW5nIHRoZQotICAvLyBwYWNrZXQgdHlwZS4KLSAgaWYgKG5hbF91bml0X3R5cGUgPT0gNiB8fCAgLy8gU3VwcGxlbWVudGFsIGVuaGFuY2VtZW50IGluZm9ybWF0aW9uCi0gICAgICBuYWxfdW5pdF90eXBlID09IDcgfHwgIC8vIFBpY3R1cmUgcGFyYW1ldGVyIHNldAotICAgICAgbmFsX3VuaXRfdHlwZSA9PSA4IHx8ICAvLyBTZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0Ci0gICAgICBuYWxfdW5pdF90eXBlID09IDkgfHwgIC8vIEFjY2VzcyB1bml0IGRlbGltaXRlcgotICAgICAgKG5hbF91bml0X3R5cGUgPj0gMTQgJiYgbmFsX3VuaXRfdHlwZSA8PSAxOCkpIHsgIC8vIFJlc2VydmVkIHR5cGVzCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1IMjY0VG9Bbm5leEJCaXRzdHJlYW1Db252ZXJ0ZXI6OkgyNjRUb0FubmV4QkJpdHN0cmVhbUNvbnZlcnRlcigpCi0gICAgOiBjb25maWd1cmF0aW9uX3Byb2Nlc3NlZF8oZmFsc2UpLAotICAgICAgZmlyc3RfbmFsX3VuaXRfaW5fYWNjZXNzX3VuaXRfKHRydWUpLAotICAgICAgbmFsX3VuaXRfbGVuZ3RoX2ZpZWxkX3dpZHRoXygwKSB7Ci19Ci0KLUgyNjRUb0FubmV4QkJpdHN0cmVhbUNvbnZlcnRlcjo6fkgyNjRUb0FubmV4QkJpdHN0cmVhbUNvbnZlcnRlcigpIHt9Ci0KLXVpbnQzMiBIMjY0VG9Bbm5leEJCaXRzdHJlYW1Db252ZXJ0ZXI6OlBhcnNlQ29uZmlndXJhdGlvbkFuZENhbGN1bGF0ZVNpemUoCi0gICAgY29uc3QgdWludDgqIGNvbmZpZ3VyYXRpb25fcmVjb3JkLAotICAgIHVpbnQzMiBjb25maWd1cmF0aW9uX3JlY29yZF9zaXplKSB7Ci0gIC8vIEZGbXBlZydzIEFWQ29kZWNDb250ZXh0J3MgZXh0cmFkYXRhIGZpZWxkIGNvbnRhaW5zIHRoZSBEZWNvZGVyIFNwZWNpZmljCi0gIC8vIEluZm9ybWF0aW9uIGZyb20gTVA0IGhlYWRlcnMgdGhhdCBjb250YWluIHRoZSBILjI2NCBTUFMgYW5kIFBQUyBtZW1iZXJzLgotICAvLyBJU08gMTQ0OTYtMTUgQ2hhcHRlciA1LjIuNCBBVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZC4KLSAgLy8gQVZDQ29uZmlndXJhdGlvblJlY29yZCBtdXN0IGJlIGF0IGxlYXN0IDcgYnl0ZXMgbG9uZy4KLSAgaWYgKGNvbmZpZ3VyYXRpb25fcmVjb3JkID09IE5VTEwgfHwgY29uZmlndXJhdGlvbl9yZWNvcmRfc2l6ZSA8IDcpIHsKLSAgICByZXR1cm4gMDsgIC8vIEVycm9yOiBpbnZhbGlkIGlucHV0Ci0gIH0KLSAgY29uc3QgdWludDgqIGRlY29kZXJfY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25fcmVjb3JkOwotICB1aW50MzIgcGFyYW1ldGVyX3NldF9zaXplX2J5dGVzID0gMDsKLQotICAvLyBXZSBjYW4gc2tpcCB0aGUgZm91ciBmaXJzdCBieXRlcyBhcyB0aGV5J3JlIG9ubHkgcHJvZmlsZSBpbmZvcm1hdGlvbgotICBkZWNvZGVyX2NvbmZpZ3VyYXRpb24gKz0gNDsKLSAgLy8gRmlmdGggYnl0ZSdzIHR3byBMU0JzIGNvbnRhaW4gdGhlIGludGVybGVhdmluZyBmaWVsZCdzIHNpemUgbWludXMgb25lCi0gIHVpbnQ4IHNpemVfb2ZfbGVuX2ZpZWxkID0gKCpkZWNvZGVyX2NvbmZpZ3VyYXRpb24gJiAweDMpICsgMTsKLSAgaWYgKHNpemVfb2ZfbGVuX2ZpZWxkICE9IDEgJiYgc2l6ZV9vZl9sZW5fZmllbGQgIT0gMiAmJgotICAgICAgc2l6ZV9vZl9sZW5fZmllbGQgIT0gNCkgewotICAgIHJldHVybiAwOyAgLy8gRXJyb3I6IGludmFsaWQgaW5wdXQsIE5BTCB1bml0IGZpZWxkIGxlbiBpcyBub3QgY29ycmVjdAotICB9Ci0gIGRlY29kZXJfY29uZmlndXJhdGlvbisrOwotICAvLyBTaXh0aCBieXRlJ3MgZml2ZSBMU0JzIGNvbnRhaW4gdGhlIG51bWJlciBvZiBTUFNzCi0gIHVpbnQ4IHNwc19jb3VudCA9ICpkZWNvZGVyX2NvbmZpZ3VyYXRpb24gJiAweDFGOwotICBkZWNvZGVyX2NvbmZpZ3VyYXRpb24rKzsKLSAgLy8gVGhlbiB3ZSBoYXZlIE4gKiBTUFMncyB3aXRoIHR3byBieXRlIGxlbmd0aCBmaWVsZCBhbmQgYWN0dWFsIFNQUwotICB3aGlsZSAoc3BzX2NvdW50LS0gPiAwKSB7Ci0gICAgaWYgKChkZWNvZGVyX2NvbmZpZ3VyYXRpb24gLSBjb25maWd1cmF0aW9uX3JlY29yZCkgKyAyID4KLSAgICAgICAgIHN0YXRpY19jYXN0PGludDMyPihjb25maWd1cmF0aW9uX3JlY29yZF9zaXplKSkgewotICAgICAgcmV0dXJuIDA7ICAvLyBFcnJvcjogcmFuIG91dCBvZiBkYXRhCi0gICAgfQotICAgIHVpbnQxNiBzcHNfbGVuID0gZGVjb2Rlcl9jb25maWd1cmF0aW9uWzBdIDw8IDggfCBkZWNvZGVyX2NvbmZpZ3VyYXRpb25bMV07Ci0gICAgZGVjb2Rlcl9jb25maWd1cmF0aW9uICs9IDI7Ci0gICAgLy8gd3JpdGUgdGhlIFNQUyB0byBvdXRwdXQsIGFsd2F5cyB3aXRoIHplcm8gYnl0ZSArIHN0YXJ0IGNvZGUgcHJlZml4Ci0gICAgcGFyYW1ldGVyX3NldF9zaXplX2J5dGVzICs9IDEgKyBzaXplb2Yoa1N0YXJ0Q29kZVByZWZpeCk7Ci0gICAgZGVjb2Rlcl9jb25maWd1cmF0aW9uICs9IHNwc19sZW47Ci0gICAgcGFyYW1ldGVyX3NldF9zaXplX2J5dGVzICs9IHNwc19sZW47Ci0gIH0KLSAgLy8gVGhlbiB3ZSBoYXZlIHRoZSBudW1uZXIgb2YgcHBzIGluIG9uZSBieXRlCi0gIHVpbnQ4IHBwc19jb3VudCA9ICpkZWNvZGVyX2NvbmZpZ3VyYXRpb247Ci0gIGRlY29kZXJfY29uZmlndXJhdGlvbisrOwotICAvLyBBbmQgZmluYWxseSwgd2UgaGF2ZSBOICogUFBTIHdpdGggdHdvIGJ5dGUgbGVuZ3RoIGZpZWxkIGFuZCBhY3R1YWwgUFBTCi0gIHdoaWxlIChwcHNfY291bnQtLSA+IDApIHsKLSAgICBpZiAoKGRlY29kZXJfY29uZmlndXJhdGlvbiAtIGNvbmZpZ3VyYXRpb25fcmVjb3JkKSArIDIgPgotICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzI+KGNvbmZpZ3VyYXRpb25fcmVjb3JkX3NpemUpKSB7Ci0gICAgICByZXR1cm4gMDsgIC8vIEVycm9yOiByYW4gb3V0IG9mIGRhdGEKLSAgICB9Ci0gICAgdWludDE2IHBwc19sZW4gPSBkZWNvZGVyX2NvbmZpZ3VyYXRpb25bMF0gPDwgOCB8IGRlY29kZXJfY29uZmlndXJhdGlvblsxXTsKLSAgICBkZWNvZGVyX2NvbmZpZ3VyYXRpb24gKz0gMjsKLSAgICAvLyB3cml0ZSB0aGUgU1BTIHRvIG91dHB1dCwgYWx3YXlzIHdpdGggemVybyBieXRlICsgc3RhcnQgY29kZSBwcmVmaXgKLSAgICBwYXJhbWV0ZXJfc2V0X3NpemVfYnl0ZXMgKz0gMSArIHNpemVvZihrU3RhcnRDb2RlUHJlZml4KTsKLSAgICBkZWNvZGVyX2NvbmZpZ3VyYXRpb24gKz0gcHBzX2xlbjsKLSAgICBwYXJhbWV0ZXJfc2V0X3NpemVfYnl0ZXMgKz0gcHBzX2xlbjsKLSAgfQotICAvLyBXZSdyZSBkb25lIHByb2Nlc3NpbmcgdGhlIEFWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkLAotICAvLyBzdG9yZSB0aGUgbmVlZGVkIGluZm9ybWF0aW9uIGZvciBwYXJzaW5nIGFjdHVhbCBwYXlsb2FkCi0gIG5hbF91bml0X2xlbmd0aF9maWVsZF93aWR0aF8gPSBzaXplX29mX2xlbl9maWVsZDsKLSAgY29uZmlndXJhdGlvbl9wcm9jZXNzZWRfID0gdHJ1ZTsKLSAgcmV0dXJuIHBhcmFtZXRlcl9zZXRfc2l6ZV9ieXRlczsKLX0KLQotdWludDMyIEgyNjRUb0FubmV4QkJpdHN0cmVhbUNvbnZlcnRlcjo6Q2FsY3VsYXRlTmVlZGVkT3V0cHV0QnVmZmVyU2l6ZSgKLSAgICBjb25zdCB1aW50OCogaW5wdXQsCi0gICAgdWludDMyIGlucHV0X3NpemUpIGNvbnN0IHsKLSAgdWludDMyIG91dHB1dF9zaXplID0gMDsKLSAgdWludDMyIGRhdGFfbGVmdCA9IGlucHV0X3NpemU7Ci0gIGJvb2wgZmlyc3RfbmFsX2luX3RoaXNfYWNjZXNzX3VuaXQgPSBmaXJzdF9uYWxfdW5pdF9pbl9hY2Nlc3NfdW5pdF87Ci0KLSAgaWYgKGlucHV0ID09IE5VTEwgfHwgaW5wdXRfc2l6ZSA9PSAwKSB7Ci0gICAgcmV0dXJuIDA7ICAvLyBFcnJvcjogaW52YWxpZCBpbnB1dCBkYXRhCi0gIH0KLSAgaWYgKCFjb25maWd1cmF0aW9uX3Byb2Nlc3NlZF8pIHsKLSAgICByZXR1cm4gMDsgIC8vIEVycm9yOiBjb25maWd1cmF0aW9uIG5vdCBoYW5kbGVkLCB3ZSBkb24ndCBrbm93IG5hbCB1bml0IHdpZHRoCi0gIH0KLSAgQ0hFQ0sobmFsX3VuaXRfbGVuZ3RoX2ZpZWxkX3dpZHRoXyA9PSAxIHx8Ci0gICAgICAgIG5hbF91bml0X2xlbmd0aF9maWVsZF93aWR0aF8gPT0gMiB8fAotICAgICAgICBuYWxfdW5pdF9sZW5ndGhfZmllbGRfd2lkdGhfID09IDQpOwotCi0gIC8vIFRoZW4gYWRkIHRoZSBuZWVkZWQgc2l6ZSBmb3IgdGhlIGFjdHVhbCBwYWNrZXQKLSAgd2hpbGUgKGRhdGFfbGVmdCA+IDApIHsKLSAgICAvLyBSZWFkIHRoZSBuZXh0IE5BTCB1bml0IGxlbmd0aCBmcm9tIHRoZSBpbnB1dCBidWZmZXIKLSAgICB1aW50OCBzaXplX29mX2xlbl9maWVsZDsKLSAgICB1aW50MzIgbmFsX3VuaXRfbGVuZ3RoOwotICAgIGZvciAobmFsX3VuaXRfbGVuZ3RoID0gMCwgc2l6ZV9vZl9sZW5fZmllbGQgPSBuYWxfdW5pdF9sZW5ndGhfZmllbGRfd2lkdGhfOwotICAgICAgICAgc2l6ZV9vZl9sZW5fZmllbGQgPiAwOwotICAgICAgICAgaW5wdXQrKywgc2l6ZV9vZl9sZW5fZmllbGQtLSwgZGF0YV9sZWZ0LS0pIHsKLSAgICAgIG5hbF91bml0X2xlbmd0aCA8PD0gODsKLSAgICAgIG5hbF91bml0X2xlbmd0aCB8PSAqaW5wdXQ7Ci0gICAgfQotCi0gICAgaWYgKG5hbF91bml0X2xlbmd0aCA9PSAwKSB7Ci0gICAgICBicmVhazsgIC8vIFNpZ25pZmllcyB0aGF0IG5vIG1vcmUgZGF0YSBsZWZ0IGluIHRoZSBidWZmZXIKLSAgICB9IGVsc2UgaWYgKG5hbF91bml0X2xlbmd0aCA+IGRhdGFfbGVmdCkgewotICAgICAgcmV0dXJuIDA7ICAvLyBFcnJvcjogTm90IGVub3VnaCBkYXRhIGZvciBjb3JyZWN0IGNvbnZlcnNpb24KLSAgICB9Ci0gICAgZGF0YV9sZWZ0IC09IG5hbF91bml0X2xlbmd0aDsKLQotICAgIC8vIGZpdmUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiBmaXJzdCBOQUwgdW5pdCBieXRlIHNpZ25pZnkgbmFsX3VuaXRfdHlwZQotICAgIGludCBuYWxfdW5pdF90eXBlID0gKmlucHV0ICYgMHgxRjsKLSAgICBpZiAoZmlyc3RfbmFsX2luX3RoaXNfYWNjZXNzX3VuaXQgfHwKLSAgICAgICAgSXNBY2Nlc3NVbml0Qm91bmRhcnlOYWwobmFsX3VuaXRfdHlwZSkpIHsKLSAgICAgIG91dHB1dF9zaXplICs9IDE7ICAvLyBFeHRyYSB6ZXJvX2J5dGUgZm9yIHRoZXNlIG5hbCB1bml0cwotICAgICAgZmlyc3RfbmFsX2luX3RoaXNfYWNjZXNzX3VuaXQgPSBmYWxzZTsKLSAgICB9Ci0gICAgLy8gU3RhcnQgY29kZSBwcmVmaXgKLSAgICBvdXRwdXRfc2l6ZSArPSBzaXplb2Yoa1N0YXJ0Q29kZVByZWZpeCk7Ci0gICAgLy8gQWN0dWFsIE5BTCB1bml0IHNpemUKLSAgICBvdXRwdXRfc2l6ZSArPSBuYWxfdW5pdF9sZW5ndGg7Ci0gICAgaW5wdXQgKz0gbmFsX3VuaXRfbGVuZ3RoOwotICAgIC8vIE5vIG5lZWQgZm9yIHRyYWlsaW5nIHplcm8gYml0cwotICB9Ci0gIHJldHVybiBvdXRwdXRfc2l6ZTsKLX0KLQotYm9vbCBIMjY0VG9Bbm5leEJCaXRzdHJlYW1Db252ZXJ0ZXI6OkNvbnZlcnRBVkNEZWNvZGVyQ29uZmlnVG9CeXRlU3RyZWFtKAotICAgIGNvbnN0IHVpbnQ4KiBpbnB1dCwKLSAgICB1aW50MzIgaW5wdXRfc2l6ZSwKLSAgICB1aW50OCogb3V0cHV0LAotICAgIHVpbnQzMiogb3V0cHV0X3NpemUpIHsKLSAgdWludDgqIG91dHNjYW4gPSBvdXRwdXQ7Ci0gIC8vIEZGbXBlZydzIEFWQ29kZWNDb250ZXh0J3MgZXh0cmFkYXRhIGZpZWxkIGNvbnRhaW5zIHRoZSBEZWNvZGVyIFNwZWNpZmljCi0gIC8vIEluZm9ybWF0aW9uIGZyb20gTVA0IGhlYWRlcnMgdGhhdCBjb250YWluIHRoZSBILjI2NCBTUFMgYW5kIFBQUyBtZW1iZXJzLgotICAvLyBJU08gMTQ0OTYtMTUgQ2hhcHRlciA1LjIuNCBBVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZC4KLSAgY29uc3QgdWludDgqIGRlY29kZXJfY29uZmlndXJhdGlvbiA9IGlucHV0OwotICB1aW50MzIgZGVjb2RlcmNvbmZpZ3VyYXRpb25fc2l6ZSA9IGlucHV0X3NpemU7Ci0gIHVpbnQzMiBvdXRfc2l6ZSA9IDA7Ci0KLSAgaWYgKGRlY29kZXJfY29uZmlndXJhdGlvbiA9PSBOVUxMIHx8IGRlY29kZXJjb25maWd1cmF0aW9uX3NpemUgPT0gMCkgewotICAgIHJldHVybiAwOyAgLy8gRXJyb3I6IGlucHV0IGludmFsaWQKLSAgfQotCi0gIC8vIFdlIGNhbiBza2lwIHRoZSBmb3VyIGZpcnN0IGJ5dGVzIGFzIHRoZXkncmUgb25seSBwcm9maWxlIGluZm9ybWF0aW9uLgotICBkZWNvZGVyX2NvbmZpZ3VyYXRpb24gKz0gNDsKLSAgLy8gRmlmdGggYnl0ZSdzIHR3byBMU0JzIGNvbnRhaW4gdGhlIGludGVybGVhdmluZyBmaWVsZCdzIHNpemUgbWludXMgb25lCi0gIHVpbnQ4IHNpemVfb2ZfbGVuX2ZpZWxkID0gKCpkZWNvZGVyX2NvbmZpZ3VyYXRpb24gJiAweDMpICsgMTsKLSAgaWYgKHNpemVfb2ZfbGVuX2ZpZWxkICE9IDEgJiYgc2l6ZV9vZl9sZW5fZmllbGQgIT0gMiAmJgotICAgICAgc2l6ZV9vZl9sZW5fZmllbGQgIT0gNCkgewotICAgIHJldHVybiAwOyAgLy8gRXJyb3I6IGludmFsaWQgaW5wdXQsIE5BTCB1bml0IGZpZWxkIGxlbiBpcyBub3QgY29ycmVjdAotICB9Ci0gIGRlY29kZXJfY29uZmlndXJhdGlvbisrOwotICAvLyBTaXh0aCBieXRlJ3MgZml2ZSBMU0JzIGNvbnRhaW4gdGhlIG51bWJlciBvZiBTUFNzCi0gIHVpbnQ4IHNwc19jb3VudCA9ICpkZWNvZGVyX2NvbmZpZ3VyYXRpb24gJiAweDFGOwotICBkZWNvZGVyX2NvbmZpZ3VyYXRpb24rKzsKLSAgLy8gVGhlbiB3ZSBoYXZlIE4gKiBTUFMncyB3aXRoIHR3byBieXRlIGxlbmd0aCBmaWVsZCBhbmQgYWN0dWFsIFNQUwotICB3aGlsZSAoc3BzX2NvdW50LS0gPiAwKSB7Ci0gICAgdWludDE2IHNwc19sZW4gPSBkZWNvZGVyX2NvbmZpZ3VyYXRpb25bMF0gPDwgOCB8Ci0gICAgICAgICAgICAgICAgICAgICBkZWNvZGVyX2NvbmZpZ3VyYXRpb25bMV07Ci0gICAgZGVjb2Rlcl9jb25maWd1cmF0aW9uICs9IDI7Ci0gICAgaWYgKG91dF9zaXplICsgMSArIHNpemVvZihrU3RhcnRDb2RlUHJlZml4KSArIHNwc19sZW4gPgotICAgICAgICAqb3V0cHV0X3NpemUpIHsKLSAgICAgICpvdXRwdXRfc2l6ZSA9IDA7Ci0gICAgICByZXR1cm4gMDsgIC8vIHRvbyBzbWFsbCBvdXRwdXQgYnVmZmVyOwotICAgIH0KLSAgICAvLyB3cml0ZSB0aGUgU1BTIHRvIG91dHB1dCwgYWx3YXlzIHdpdGggemVybyBieXRlICsgc3RhcnQgY29kZSBwcmVmaXgKLSAgICAqb3V0c2NhbiA9IDA7ICAvLyB6ZXJvIGJ5dGUKLSAgICBvdXRzY2FuICs9IDE7Ci0gICAgbWVtY3B5KG91dHNjYW4sIGtTdGFydENvZGVQcmVmaXgsIHNpemVvZihrU3RhcnRDb2RlUHJlZml4KSk7Ci0gICAgb3V0c2NhbiArPSBzaXplb2Yoa1N0YXJ0Q29kZVByZWZpeCk7Ci0gICAgbWVtY3B5KG91dHNjYW4sIGRlY29kZXJfY29uZmlndXJhdGlvbiwgc3BzX2xlbik7Ci0gICAgZGVjb2Rlcl9jb25maWd1cmF0aW9uICs9IHNwc19sZW47Ci0gICAgb3V0c2NhbiArPSBzcHNfbGVuOwotICAgIG91dF9zaXplICs9IDEgKyBzaXplb2Yoa1N0YXJ0Q29kZVByZWZpeCkgKyBzcHNfbGVuOwotICB9Ci0gIC8vIFRoZW4gd2UgaGF2ZSB0aGUgbnVtbmVyIG9mIHBwcyBpbiBvbmUgYnl0ZQotICB1aW50OCBwcHNfY291bnQgPSAqZGVjb2Rlcl9jb25maWd1cmF0aW9uOwotICBkZWNvZGVyX2NvbmZpZ3VyYXRpb24rKzsKLSAgLy8gQW5kIGZpbmFsbHksIHdlIGhhdmUgTiAqIFBQUyB3aXRoIHR3byBieXRlIGxlbmd0aCBmaWVsZCBhbmQgYWN0dWFsIFBQUwotICB3aGlsZSAocHBzX2NvdW50LS0gPiAwKSB7Ci0gICAgdWludDE2IHBwc19sZW4gPSBkZWNvZGVyX2NvbmZpZ3VyYXRpb25bMF0gPDwgOCB8IGRlY29kZXJfY29uZmlndXJhdGlvblsxXTsKLSAgICBkZWNvZGVyX2NvbmZpZ3VyYXRpb24gKz0gMjsKLSAgICBpZiAob3V0X3NpemUgKyAxICsgc2l6ZW9mKGtTdGFydENvZGVQcmVmaXgpICsgcHBzX2xlbiA+Ci0gICAgICAgICpvdXRwdXRfc2l6ZSkgewotICAgICAgKm91dHB1dF9zaXplID0gMDsKLSAgICAgIHJldHVybiAwOyAgLy8gdG9vIHNtYWxsIG91dHB1dCBidWZmZXI7Ci0gICAgfQotICAgIC8vIHdyaXRlIHRoZSBTUFMgdG8gb3V0cHV0LCBhbHdheXMgd2l0aCB6ZXJvIGJ5dGUgKyBzdGFydCBjb2RlIHByZWZpeAotICAgICpvdXRzY2FuID0gMDsgIC8vIHplcm8gYnl0ZQotICAgIG91dHNjYW4gKz0gMTsKLSAgICBtZW1jcHkob3V0c2Nhbiwga1N0YXJ0Q29kZVByZWZpeCwgc2l6ZW9mKGtTdGFydENvZGVQcmVmaXgpKTsKLSAgICBvdXRzY2FuICs9IHNpemVvZihrU3RhcnRDb2RlUHJlZml4KTsKLSAgICBtZW1jcHkob3V0c2NhbiwgZGVjb2Rlcl9jb25maWd1cmF0aW9uLCBwcHNfbGVuKTsKLSAgICBkZWNvZGVyX2NvbmZpZ3VyYXRpb24gKz0gcHBzX2xlbjsKLSAgICBvdXRzY2FuICs9IHBwc19sZW47Ci0gICAgb3V0X3NpemUgKz0gMSArIHNpemVvZihrU3RhcnRDb2RlUHJlZml4KSArIHBwc19sZW47Ci0gIH0KLSAgLy8gV2UncmUgZG9uZSBwcm9jZXNzaW5nIHRoZSBBVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZCwgc3RvcmUgdGhlIG5lZWRlZAotICAvLyBpbmZvcm1hdGlvbgotICBuYWxfdW5pdF9sZW5ndGhfZmllbGRfd2lkdGhfID0gc2l6ZV9vZl9sZW5fZmllbGQ7Ci0gIGNvbmZpZ3VyYXRpb25fcHJvY2Vzc2VkXyA9IHRydWU7Ci0gICpvdXRwdXRfc2l6ZSA9IG91dF9zaXplOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBIMjY0VG9Bbm5leEJCaXRzdHJlYW1Db252ZXJ0ZXI6OkNvbnZlcnROYWxVbml0U3RyZWFtVG9CeXRlU3RyZWFtKAotICAgIGNvbnN0IHVpbnQ4KiBpbnB1dCwgdWludDMyIGlucHV0X3NpemUsCi0gICAgdWludDgqIG91dHB1dCwgdWludDMyKiBvdXRwdXRfc2l6ZSkgewotICBjb25zdCB1aW50OCogaW5zY2FuID0gaW5wdXQ7ICAvLyBXZSByZWFkIHRoZSBpbnB1dCBmcm9tIGhlcmUgcHJvZ3Jlc3NpdmVseQotICB1aW50OCogb3V0c2NhbiA9IG91dHB1dDsgIC8vIFdlIHdyaXRlIHRoZSBvdXRwdXQgdG8gaGVyZSBwcm9ncmVzc2l2ZWx5Ci0gIHVpbnQzMiBkYXRhX2xlZnQgPSBpbnB1dF9zaXplOwotCi0gIGlmIChpbnNjYW4gPT0gTlVMTCB8fCBpbnB1dF9zaXplID09IDAgfHwKLSAgICAgIG91dHNjYW4gPT0gTlVMTCB8fCAqb3V0cHV0X3NpemUgPT0gMCkgewotICAgICpvdXRwdXRfc2l6ZSA9IDA7Ci0gICAgcmV0dXJuIGZhbHNlOyAgLy8gRXJyb3I6IGludmFsaWQgaW5wdXQKLSAgfQotCi0gIC8vIE5BTCB1bml0IHdpZHRoIHNob3VsZCBiZSBrbm93biBhdCB0aGlzIHBvaW50Ci0gIENIRUNLKG5hbF91bml0X2xlbmd0aF9maWVsZF93aWR0aF8gPT0gMSB8fAotICAgICAgICBuYWxfdW5pdF9sZW5ndGhfZmllbGRfd2lkdGhfID09IDIgfHwKLSAgICAgICAgbmFsX3VuaXRfbGVuZ3RoX2ZpZWxkX3dpZHRoXyA9PSA0KTsKLQotICAvLyBEbyB0aGUgYWN0dWFsIGNvbnZlcnNpb24gZm9yIHRoZSBhY3R1YWwgaW5wdXQgcGFja2V0Ci0gIHdoaWxlIChkYXRhX2xlZnQgPiAwKSB7Ci0gICAgdWludDggaTsKLSAgICB1aW50MzIgbmFsX3VuaXRfbGVuZ3RoOwotCi0gICAgLy8gUmVhZCB0aGUgbmV4dCBOQUwgdW5pdCBsZW5ndGggZnJvbSB0aGUgaW5wdXQgYnVmZmVyIGJ5IHNjYW5uaW5nCi0gICAgLy8gdGhlIGlucHV0IHN0cmVhbSB3aXRoIHRoZSBzcGVjaWZpYyBsZW5ndGggZmllbGQgd2lkdGgKLSAgICBmb3IgKG5hbF91bml0X2xlbmd0aCA9IDAsIGkgPSBuYWxfdW5pdF9sZW5ndGhfZmllbGRfd2lkdGhfOwotICAgICAgICAgaSA+IDAgJiYgZGF0YV9sZWZ0ID4gMDsKLSAgICAgICAgIGluc2NhbisrLCBpLS0sIGRhdGFfbGVmdC0tKSB7Ci0gICAgICBuYWxfdW5pdF9sZW5ndGggPDw9IDg7Ci0gICAgICBuYWxfdW5pdF9sZW5ndGggfD0gKmluc2NhbjsKLSAgICB9Ci0KLSAgICBpZiAobmFsX3VuaXRfbGVuZ3RoID09IDApIHsKLSAgICAgIGJyZWFrOyAgLy8gU3VjY2Vzc2Z1bCBjb252ZXJzaW9uLCBlbmQgb2YgYnVmZmVyCi0gICAgfSBlbHNlIGlmIChuYWxfdW5pdF9sZW5ndGggPiBkYXRhX2xlZnQpIHsKLSAgICAgICpvdXRwdXRfc2l6ZSA9IDA7Ci0gICAgICByZXR1cm4gZmFsc2U7ICAvLyBFcnJvcjogbm90IGVub3VnaCBkYXRhIGZvciBjb3JyZWN0IGNvbnZlcnNpb24KLSAgICB9Ci0KLSAgICB1aW50MzIgc3RhcnRfY29kZV9sZW47Ci0gICAgZmlyc3RfbmFsX3VuaXRfaW5fYWNjZXNzX3VuaXRfID8KLSAgICAgICAgc3RhcnRfY29kZV9sZW4gPSBzaXplb2Yoa1N0YXJ0Q29kZVByZWZpeCkgKyAxIDoKLSAgICAgICAgc3RhcnRfY29kZV9sZW4gPSBzaXplb2Yoa1N0YXJ0Q29kZVByZWZpeCk7Ci0gICAgaWYgKHN0YXRpY19jYXN0PHVpbnQzMj4ob3V0c2NhbiAtIG91dHB1dCkgKwotICAgICAgICBzdGFydF9jb2RlX2xlbiArIG5hbF91bml0X2xlbmd0aCA+ICpvdXRwdXRfc2l6ZSkgewotICAgICAgKm91dHB1dF9zaXplID0gMDsKLSAgICAgIHJldHVybiBmYWxzZTsgIC8vIEVycm9yOiB0b28gc21hbGwgb3V0cHV0IGJ1ZmZlcgotICAgIH0KLQotICAgIC8vIEZpdmUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiBmaXJzdCBOQUwgdW5pdCBieXRlIHNpZ25pZnkKLSAgICAvLyBuYWxfdW5pdF90eXBlLgotICAgIGludCBuYWxfdW5pdF90eXBlID0gKmluc2NhbiAmIDB4MUY7Ci0KLSAgICAvLyBDaGVjayBpZiB0aGlzIHBhY2tldCBtYXJrcyBhY2Nlc3MgdW5pdCBib3VuZGFyeSBieSBjaGVja2luZyB0aGUKLSAgICAvLyBwYWNrZXQgdHlwZS4KLSAgICBpZiAoSXNBY2Nlc3NVbml0Qm91bmRhcnlOYWwobmFsX3VuaXRfdHlwZSkpIHsKLSAgICAgIGZpcnN0X25hbF91bml0X2luX2FjY2Vzc191bml0XyA9IHRydWU7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgZXh0cmEgemVyby1ieXRlIGJlZm9yZSBzdGFydCBjb2RlIHByZWZpeCBpZiB0aGlzIHBhY2tldAotICAgIC8vIHNpZ25hbHMgbmV4dCBhY2Nlc3MgdW5pdC4KLSAgICBpZiAoZmlyc3RfbmFsX3VuaXRfaW5fYWNjZXNzX3VuaXRfKSB7Ci0gICAgICAqb3V0c2NhbiA9IDA7Ci0gICAgICBvdXRzY2FuKys7Ci0gICAgICBmaXJzdF9uYWxfdW5pdF9pbl9hY2Nlc3NfdW5pdF8gPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBObyBuZWVkIHRvIHdyaXRlIGxlYWRpbmcgemVybyBiaXRzLgotICAgIC8vIFdyaXRlIHN0YXJ0LWNvZGUgcHJlZml4LgotICAgIG1lbWNweShvdXRzY2FuLCBrU3RhcnRDb2RlUHJlZml4LCBzaXplb2Yoa1N0YXJ0Q29kZVByZWZpeCkpOwotICAgIG91dHNjYW4gKz0gc2l6ZW9mKGtTdGFydENvZGVQcmVmaXgpOwotICAgIC8vIFRoZW4gd3JpdGUgdGhlIGFjdHVhbCBOQUwgdW5pdCBmcm9tIHRoZSBpbnB1dCBidWZmZXIuCi0gICAgbWVtY3B5KG91dHNjYW4sIGluc2NhbiwgbmFsX3VuaXRfbGVuZ3RoKTsKLSAgICBpbnNjYW4gKz0gbmFsX3VuaXRfbGVuZ3RoOwotICAgIGRhdGFfbGVmdCAtPSBuYWxfdW5pdF9sZW5ndGg7Ci0gICAgb3V0c2NhbiArPSBuYWxfdW5pdF9sZW5ndGg7Ci0gICAgLy8gTm8gbmVlZCBmb3IgdHJhaWxpbmcgemVybyBiaXRzLgotICB9Ci0gIC8vIFN1Y2Nlc3NmdWwgY29udmVyc2lvbiwgb3V0cHV0IHRoZSBmcmVzaGx5IGFsbG9jYXRlZCBiaXRzdHJlYW0gYnVmZmVyLgotICAqb3V0cHV0X3NpemUgPSBzdGF0aWNfY2FzdDx1aW50MzI+KG91dHNjYW4gLSBvdXRwdXQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9oMjY0X3RvX2FubmV4X2JfYml0c3RyZWFtX2NvbnZlcnRlci5oIGIvc3JjL21lZGlhL2ZpbHRlcnMvaDI2NF90b19hbm5leF9iX2JpdHN0cmVhbV9jb252ZXJ0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZiMjA0YS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9oMjY0X3RvX2FubmV4X2JfYml0c3RyZWFtX2NvbnZlcnRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfRklMVEVSU19IMjY0X1RPX0FOTkVYX0JfQklUU1RSRUFNX0NPTlZFUlRFUl9IXwotI2RlZmluZSBNRURJQV9GSUxURVJTX0gyNjRfVE9fQU5ORVhfQl9CSVRTVFJFQU1fQ09OVkVSVEVSX0hfCi0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBIMjY0VG9Bbm5leEJCaXRzdHJlYW1Db252ZXJ0ZXIgaXMgYSBjbGFzcyB0byBjb252ZXJ0IEguMjY0IGJpdHN0cmVhbSBmcm9tCi0vLyBNUDQgZm9ybWF0IChhcyBzcGVjaWZpZWQgaW4gSVNPL0lFQyAxNDQ5Ni0xNSkgaW50byBILjI2NCBieXRlc3RyZWFtCi0vLyAoYXMgc3BlY2lmaWVkIGluIElTTy9JRUMgMTQ0OTYtMTAgQW5uZXggQikuCi1jbGFzcyBNRURJQV9FWFBPUlQgSDI2NFRvQW5uZXhCQml0c3RyZWFtQ29udmVydGVyIHsKLSBwdWJsaWM6Ci0gIEgyNjRUb0FubmV4QkJpdHN0cmVhbUNvbnZlcnRlcigpOwotICB+SDI2NFRvQW5uZXhCQml0c3RyZWFtQ29udmVydGVyKCk7Ci0KLSAgLy8gUGFyc2VzIHRoZSBnbG9iYWwgQVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQgZnJvbSB0aGUgZmlsZSBmb3JtYXQncwotICAvLyBoZWFkZXJzLiBDb252ZXJ0ZXIgd2lsbCByZW1lbWJlciB0aGUgZmllbGQgbGVuZ3RoIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24KLSAgLy8gaGVhZGVycyBhZnRlciB0aGlzLgotICAvLwotICAvLyBQYXJhbWV0ZXJzCi0gIC8vICAgY29uZmlndXJhdGlvbl9yZWNvcmQKLSAgLy8gICAgIFBvaW50ZXIgdG8gYnVmZmVyIGNvbnRhaW5pbmcgQVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQuCi0gIC8vICAgY29uZmlndXJhdGlvbl9yZWNvcmRfc2l6ZQotICAvLyAgICAgU2l6ZSBvZiB0aGUgYnVmZmVyIGluIGJ5dGVzLgotICAvLwotICAvLyBSZXR1cm5zCi0gIC8vICAgUmVxdWlyZWQgYnVmZmVyIHNpemUgZm9yIEFWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkIHdoZW4gY29udmVydGVkCi0gIC8vICAgdG8gYnl0ZXN0cmVhbSBmb3JtYXQsIG9yIDAgaWYgY291bGQgbm90IGRldGVybWluZSB0aGUgY29uZmlndXJhdGlvbgotICAvLyAgIGZyb20gdGhlIGlucHV0IGJ1ZmZlci4KLSAgdWludDMyIFBhcnNlQ29uZmlndXJhdGlvbkFuZENhbGN1bGF0ZVNpemUoY29uc3QgdWludDgqIGNvbmZpZ3VyYXRpb25fcmVjb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgY29uZmlndXJhdGlvbl9yZWNvcmRfc2l6ZSk7Ci0KLSAgLy8gQ2FsY3VsYXRlcyBuZWVkZWQgYnVmZmVyIHNpemUgZm9yIHRoZSBiaXRzdHJlYW0gY29udmVydGVkIGludG8gYnl0ZXN0cmVhbS4KLSAgLy8gTGlnaHR3ZWlnaHQgaW1wbGVtZW50YXRpb24gdGhhdCBkb2VzIG5vdCBkbyB0aGUgYWN0dWFsIGNvbnZlcnNpb24uCi0gIC8vCi0gIC8vIFBhcmFtZXRlcnMKLSAgLy8gICBjb25maWd1cmF0aW9uX3JlY29yZAotICAvLyAgICAgUG9pbnRlciB0byBidWZmZXIgY29udGFpbmluZyBBVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZC4KLSAgLy8gICBjb25maWd1cmF0aW9uX3JlY29yZF9zaXplCi0gIC8vICAgICBTaXplIG9mIHRoZSBidWZmZXIgaW4gYnl0ZXMuCi0gIC8vCi0gIC8vIFJldHVybnMKLSAgLy8gICBSZXF1aXJlZCBidWZmZXIgc2l6ZSBmb3IgdGhlIGlucHV0IE5BTCB1bml0IGJ1ZmZlciB3aGVuIGNvbnZlcnRlZAotICAvLyAgIHRvIGJ5dGVzdHJlYW0gZm9ybWF0LCBvciAwIGlmIGNvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIGNvbmZpZ3VyYXRpb24KLSAgLy8gICBmcm9tIHRoZSBpbnB1dCBidWZmZXIuCi0gIHVpbnQzMiBDYWxjdWxhdGVOZWVkZWRPdXRwdXRCdWZmZXJTaXplKGNvbnN0IHVpbnQ4KiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIGlucHV0X3NpemUpIGNvbnN0OwotCi0gIC8vIENvbnZlcnRBVkNEZWNvZGVyQ29uZmlnVG9CeXRlU3RyZWFtIGNvbnZlcnRzIHRoZQotICAvLyBBVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZCBmcm9tIHRoZSBNUDQgaGVhZGVycyB0byBieXRlc3RyZWFtIGZvcm1hdC4KLSAgLy8gQ2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgc3VyZSB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2gKLSAgLy8gdG8gaG9sZCB0aGUgb3V0cHV0IGRhdGEuIENsaWVudCBjYW4gcHJlY2FsY3VsYXRlIHRoZSBuZWVkZWQgb3V0cHV0IGJ1ZmZlcgotICAvLyBzaXplIGJ5IHVzaW5nIFBhcnNlQ29uZmlndXJhdGlvbkFuZENhbGN1bGF0ZVNpemUuCi0gIC8vCi0gIC8vIEluIGNhc2Ugb2YgZmFpbGVkIGNvbnZlcnNpb24gb2JqZWN0IEgyNjRCaXRzdHJlYW1Db252ZXJ0ZXIgbWF5IGhhdmUgd3JpdHRlbgotICAvLyBzb21lIGJ5dGVzIHRvIGJ1ZmZlciBwb2ludGVkIGJ5IHBpbnB1dCBidXQgdXNlciBzaG91bGQgaWdub3JlIHRob3NlIGJ5dGVzLgotICAvLyBOb25lIG9mIHRoZSBvdXRwdXRzIHNob3VsZCBiZSBjb25zaWRlcmVkIHZhbGlkLgotICAvLwotICAvLyBQYXJhbWV0ZXJzCi0gIC8vICAgcGlucHV0Ci0gIC8vICAgICBQb2ludGVyIHRvIGJ1ZmZlciBjb250YWluaW5nIEFWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkLgotICAvLyAgIGlucHV0X3NpemUKLSAgLy8gICAgIFNpemUgb2YgdGhlIGJ1ZmZlciBpbiBieXRlcy4KLSAgLy8gICBwb3V0cHV0Ci0gIC8vICAgICBQb2ludGVyIHRvIGJ1ZmZlciB3aGVyZSB0aGUgb3V0cHV0IHNob3VsZCBiZSB3cml0dGVuIHRvLgotICAvLyAgIHBvdXRwdXRfc2l6ZSAoaS9vKQotICAvLyAgICAgUG9pbnRlciB0byB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlci4gV2lsbCBjb250YWluIHRoZSBudW1iZXIgb2YKLSAgLy8gICAgIGJ5dGVzIHdyaXR0ZW4gdG8gb3V0cHV0IGFmdGVyIHN1Y2Nlc3NmdWwgY2FsbC4KLSAgLy8KLSAgLy8gUmV0dXJucwotICAvLyAgICB0cnVlICBpZiBzdWNjZXNzZnVsIGNvbnZlcnNpb24KLSAgLy8gICAgZmFsc2UgaWYgY29udmVyc2lvbiBub3Qgc3VjY2Vzc2Z1bCAocG91dHB1dF9zaXplIHdpbGwgaG9sZCB0aGUgYW1vdW50Ci0gIC8vICAgICAgICAgIG9mIGNvbnZlcnRlZCBkYXRhKQotICBib29sIENvbnZlcnRBVkNEZWNvZGVyQ29uZmlnVG9CeXRlU3RyZWFtKGNvbnN0IHVpbnQ4KiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgaW5wdXRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiogb3V0cHV0X3NpemUpOwotCi0gIC8vIENvbnZlcnROYWxVbml0U3RyZWFtVG9CeXRlU3RyZWFtIGNvbnZlcnRzIHRoZSBOQUwgdW5pdCBmcm9tIE1QNCBmb3JtYXQKLSAgLy8gdG8gYnl0ZXN0cmVhbSBmb3JtYXQuIENsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgbWFraW5nIHN1cmUgdGhlIG91dHB1dAotICAvLyBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIG91dHB1dCBkYXRhLiBDbGllbnQgY2FuIHByZWNhbGN1bGF0ZSB0aGUKLSAgLy8gbmVlZGVkIG91dHB1dCBidWZmZXIgc2l6ZSBieSB1c2luZyBDYWxjdWxhdGVOZWVkZWRPdXRwdXRCdWZmZXJTaXplLgotICAvLwotICAvLyBJbiBjYXNlIG9mIGZhaWxlZCBjb252ZXJzaW9uIG9iamVjdCBIMjY0Qml0c3RyZWFtQ29udmVydGVyIG1heSBoYXZlIHdyaXR0ZW4KLSAgLy8gc29tZSBieXRlcyB0byBidWZmZXIgcG9pbnRlZCBieSBwaW5wdXQgYnV0IHVzZXIgc2hvdWxkIGlnbm9yZSB0aG9zZSBieXRlcy4KLSAgLy8gTm9uZSBvZiB0aGUgb3V0cHV0cyBzaG91bGQgYmUgY29uc2lkZXJlZCB2YWxpZC4KLSAgLy8KLSAgLy8gUGFyYW1ldGVycwotICAvLyAgIHBpbnB1dAotICAvLyAgICAgUG9pbnRlciB0byBidWZmZXIgY29udGFpbmluZyBBVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZC4KLSAgLy8gICBpbnB1dF9zaXplCi0gIC8vICAgICBTaXplIG9mIHRoZSBidWZmZXIgaW4gYnl0ZXMuCi0gIC8vICAgcG91dHB1dAotICAvLyAgICAgUG9pbnRlciB0byBidWZmZXIgd2hlcmUgdGhlIG91dHB1dCBzaG91bGQgYmUgd3JpdHRlbiB0by4KLSAgLy8gICBwb3V0cHV0X3NpemUgKGkvbykKLSAgLy8gICAgIFBvaW50ZXIgdG8gdGhlIHNpemUgb2YgdGhlIG91dHB1dCBidWZmZXIuIFdpbGwgY29udGFpbiB0aGUgbnVtYmVyIG9mCi0gIC8vICAgICBieXRlcyB3cml0dGVuIHRvIG91dHB1dCBhZnRlciBzdWNjZXNzZnVsIGNhbGwuCi0gIC8vCi0gIC8vIFJldHVybnMKLSAgLy8gICAgdHJ1ZSAgaWYgc3VjY2Vzc2Z1bCBjb252ZXJzaW9uCi0gIC8vICAgIGZhbHNlIGlmIGNvbnZlcnNpb24gbm90IHN1Y2Nlc3NmdWwgKHBvdXRwdXRfc2l6ZSB3aWxsIGhvbGQgdGhlIGFtb3VudAotICAvLyAgICAgICAgICBvZiBjb252ZXJ0ZWQgZGF0YSkKLSAgYm9vbCBDb252ZXJ0TmFsVW5pdFN0cmVhbVRvQnl0ZVN0cmVhbShjb25zdCB1aW50OCogaW5wdXQsIHVpbnQzMiBpbnB1dF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBvdXRwdXQsIHVpbnQzMiogb3V0cHV0X3NpemUpOwotCi0gcHJpdmF0ZToKLSAgLy8gRmxhZyBmb3IgaW5kaWNhdGluZyB3aGV0aGVyIGdsb2JhbCBwYXJhbWV0ZXIgc2V0cyBoYXZlIGJlZW4gcHJvY2Vzc2VkLgotICBib29sIGNvbmZpZ3VyYXRpb25fcHJvY2Vzc2VkXzsKLSAgLy8gRmxhZyBmb3IgaW5kaWNhdGluZyB3aGV0aGVyIG5leHQgTkFMIHVuaXQgc3RhcnRzIG5ldyBhY2Nlc3MgdW5pdC4KLSAgYm9vbCBmaXJzdF9uYWxfdW5pdF9pbl9hY2Nlc3NfdW5pdF87Ci0gIC8vIFZhcmlhYmxlIHRvIGhvbGQgaW50ZXJsZWF2aW5nIGZpZWxkJ3MgbGVuZ3RoIGluIGJ5dGVzLgotICB1aW50OCBuYWxfdW5pdF9sZW5ndGhfZmllbGRfd2lkdGhfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihIMjY0VG9Bbm5leEJCaXRzdHJlYW1Db252ZXJ0ZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfRklMVEVSU19IMjY0X1RPX0FOTkVYX0JfQklUU1RSRUFNX0NPTlZFUlRFUl9IXwotCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9oMjY0X3RvX2FubmV4X2JfYml0c3RyZWFtX2NvbnZlcnRlcl91bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9maWx0ZXJzL2gyNjRfdG9fYW5uZXhfYl9iaXRzdHJlYW1fY29udmVydGVyX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjM2ZTc3Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL2gyNjRfdG9fYW5uZXhfYl9iaXRzdHJlYW1fY29udmVydGVyX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDcwICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9oMjY0X3RvX2FubmV4X2JfYml0c3RyZWFtX2NvbnZlcnRlci5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBIMjY0VG9Bbm5leEJCaXRzdHJlYW1Db252ZXJ0ZXJUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgSDI2NFRvQW5uZXhCQml0c3RyZWFtQ29udmVydGVyVGVzdCgpIHt9Ci0KLSAgdmlydHVhbCB+SDI2NFRvQW5uZXhCQml0c3RyZWFtQ29udmVydGVyVGVzdCgpIHt9Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oSDI2NFRvQW5uZXhCQml0c3RyZWFtQ29udmVydGVyVGVzdCk7Ci19OwotCi1zdGF0aWMgY29uc3QgdWludDgga0hlYWRlckRhdGFPa1dpdGhGaWVsZExlbjRbXSA9IHsKLSAgMHgwMSwgMHg0MiwgMHgwMCwgMHgyOCwgMHhGRiwgMHhFMSwgMHgwMCwgMHgwOCwgMHg2NywgMHg0MiwgMHgwMCwgMHgyOCwKLSAgMHhFOSwgMHgwNSwgMHg4OSwgMHhDOCwgMHgwMSwgMHgwMCwgMHgwNCwgMHg2OCwgMHhDRSwgMHgwNiwgMHhGMiwgMHgwMAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4IGtQYWNrZXREYXRhT2tXaXRoRmllbGRMZW40W10gPSB7Ci0gIDB4MDAsIDB4MDAsIDB4MEIsIDB4RjcsIDB4NjUsIDB4QjgsIDB4NDAsIDB4NTcsIDB4MEIsIDB4RjAsCi0gIDB4REYsIDB4RjgsIDB4MDAsIDB4MUYsIDB4NzgsIDB4OTgsIDB4NTQsIDB4QUMsIDB4RjIsIDB4MDAsIDB4MDQsIDB4OUQsIDB4MjYsCi0gIDB4RTAsIDB4M0IsIDB4NUMsIDB4MDAsIDB4MEEsIDB4MDAsIDB4OEYsIDB4OUUsIDB4ODYsIDB4NjMsIDB4MUIsIDB4NDYsIDB4RTcsCi0gIDB4RDYsIDB4NDUsIDB4ODgsIDB4ODgsIDB4RUEsIDB4MTAsIDB4ODksIDB4NzksIDB4MDEsIDB4MzQsIDB4MzAsIDB4MDEsIDB4OEUsCi0gIDB4N0QsIDB4MUEsIDB4MzksIDB4NDUsIDB4NEUsIDB4NjksIDB4ODYsIDB4MTIsIDB4RjIsIDB4RTcsIDB4Q0YsIDB4NTAsIDB4RjgsCi0gIDB4MjYsIDB4NTQsIDB4MTcsIDB4QkUsIDB4M0YsIDB4QzQsIDB4ODAsIDB4MzIsIDB4RDgsIDB4MDIsIDB4MzIsIDB4RTQsIDB4QUUsCi0gIDB4REQsIDB4MzksIDB4MTEsIDB4OEUsIDB4NTQsIDB4NDIsIDB4QUUsIDB4QkQsIDB4MTIsIDB4QTQsIDB4Q0UsIDB4RTIsIDB4OTgsCi0gIDB4OTEsIDB4MDUsIDB4QzQsIDB4QTgsIDB4MjAsIDB4QzcsIDB4QjMsIDB4RDksIDB4NDcsIDB4NzMsIDB4MDksIDB4RDUsIDB4Q0YsCi0gIDB4NjIsIDB4NTcsIDB4M0YsIDB4RkYsIDB4RkQsIDB4QjksIDB4OTQsIDB4MkIsIDB4M0QsIDB4MTIsIDB4MUEsIDB4ODQsIDB4MEIsCi0gIDB4MjgsIDB4QUQsIDB4NUMsIDB4OUUsIDB4NUMsIDB4QzMsIDB4QkIsIDB4QkQsIDB4N0YsIDB4RkUsIDB4MDksIDB4ODcsIDB4NzQsCi0gIDB4MzksIDB4MUMsIDB4QTUsIDB4MEUsIDB4NDQsIDB4RDgsIDB4NUQsIDB4NDEsIDB4REIsIDB4QUEsIDB4QkMsIDB4MDUsIDB4MTYsCi0gIDB4QTMsIDB4OTgsIDB4RUUsIDB4RUUsIDB4OUMsIDB4QTAsIDB4RjEsIDB4MjMsIDB4OTAsIDB4RjAsIDB4NUUsIDB4OUYsIDB4RjQsCi0gIDB4RkEsIDB4N0YsIDB4NEIsIDB4NjksIDB4NjYsIDB4NDksIDB4NTIsIDB4REQsIDB4RDYsIDB4QzAsIDB4MEYsIDB4OEMsIDB4NkUsCi0gIDB4ODAsIDB4REQsIDB4N0EsIDB4REYsIDB4MTAsIDB4Q0QsIDB4NEIsIDB4NTQsIDB4NkYsIDB4RkMsIDB4N0QsIDB4MzQsIDB4QkEsCi0gIDB4OEIsIDB4RDQsIDB4RDksIDB4MzAsIDB4MTgsIDB4OUYsIDB4MzksIDB4MDQsIDB4OUYsIDB4Q0IsIDB4REIsIDB4MUIsIDB4QTcsCi0gIDB4NzAsIDB4OTYsIDB4QUYsIDB4RkYsIDB4NkYsIDB4QjUsIDB4QkYsIDB4NTgsIDB4MDEsIDB4OTgsIDB4Q0QsIDB4RjIsIDB4NjYsCi0gIDB4MjgsIDB4MUEsIDB4QzQsIDB4OUUsIDB4NTgsIDB4NDAsIDB4MzksIDB4QUUsIDB4MDcsIDB4MTEsIDB4M0YsIDB4RjIsIDB4OUIsCi0gIDB4MDYsIDB4OUMsIDB4QjgsIDB4QzksIDB4MTYsIDB4MTIsIDB4MDksIDB4OEUsIDB4RDIsIDB4RDQsIDB4RjUsIDB4QzYsIDB4NzcsCi0gIDB4NDAsIDB4MEYsIDB4RkQsIDB4MTIsIDB4MTksIDB4NTUsIDB4MUEsIDB4OEUsIDB4OUMsIDB4MTgsIDB4OEIsIDB4MEQsIDB4MTgsCi0gIDB4RkEsIDB4QkEsIDB4N0YsIDB4QkIsIDB4ODMsIDB4QkIsIDB4ODUsIDB4QTAsIDB4Q0MsIDB4QUYsIDB4RjYsIDB4RUEsIDB4ODEsCi0gIDB4MTAsIDB4MTgsIDB4OEUsIDB4MTAsIDB4MDAsIDB4Q0IsIDB4N0YsIDB4MjcsIDB4MDgsIDB4MDYsIDB4REUsIDB4M0MsIDB4MjAsCi0gIDB4RTUsIDB4RkUsIDB4Q0MsIDB4NEYsIDB4QjMsIDB4NDEsIDB4RTAsIDB4Q0MsIDB4NEMsIDB4MjYsIDB4QzEsIDB4QzAsIDB4MkMsCi0gIDB4MTYsIDB4MTIsIDB4QUEsIDB4MDQsIDB4ODMsIDB4NTEsIDB4NEUsIDB4Q0EsIDB4MDAsIDB4Q0YsIDB4NDIsIDB4OUMsIDB4MDYsCi0gIDB4MkQsIDB4MDYsIDB4REQsIDB4MUQsIDB4MDgsIDB4NzUsIDB4RTAsIDB4ODksIDB4QzcsIDB4NjIsIDB4NjgsIDB4MkUsIDB4QkYsCi0gIDB4NEQsIDB4MkQsIDB4MEEsIDB4QzQsIDB4ODYsIDB4RjYsIDB4MkYsIDB4QTEsIDB4NDksIDB4QTcsIDB4MEYsIDB4REIsIDB4MUYsCi0gIDB4ODIsIDB4RUMsIDB4QzEsIDB4NjIsIDB4RkIsIDB4N0YsIDB4RjEsIDB4QUUsIDB4QTYsIDB4MUEsIDB4RDUsIDB4NkIsIDB4MDYsCi0gIDB4NUUsIDB4QjYsIDB4MDIsIDB4NTAsIDB4QUUsIDB4MkQsIDB4RjksIDB4RDksIDB4OTUsIDB4QUQsIDB4MDEsIDB4OEMsIDB4NTMsCi0gIDB4MDEsIDB4QUYsIDB4Q0UsIDB4RTUsIDB4QTUsIDB4QkIsIDB4OTUsIDB4OEEsIDB4ODUsIDB4NzAsIDB4NzcsIDB4RTMsIDB4OUEsCi0gIDB4NjgsIDB4MUIsIDB4REYsIDB4NDcsIDB4RjksIDB4RjQsIDB4QkQsIDB4ODAsIDB4N0QsIDB4NzYsIDB4OUEsIDB4NjksIDB4RkMsCi0gIDB4QkUsIDB4MTQsIDB4MEQsIDB4ODcsIDB4MDksIDB4MTIsIDB4OTgsIDB4MjAsIDB4MDUsIDB4NDYsIDB4QjcsIDB4QUUsIDB4MTAsCi0gIDB4QjcsIDB4MDEsIDB4QjcsIDB4REUsIDB4M0IsIDB4REQsIDB4N0EsIDB4OEEsIDB4NTUsIDB4NzMsIDB4QUQsIDB4REYsIDB4NjksCi0gIDB4REUsIDB4RDAsIDB4NTEsIDB4OTcsIDB4QTAsIDB4RTYsIDB4NUUsIDB4QkEsIDB4QkEsIDB4ODAsIDB4MEYsIDB4NEUsIDB4OUEsCi0gIDB4NjgsIDB4MzYsIDB4RTYsIDB4OUYsIDB4NUIsIDB4MzksIDB4QzAsIDB4OTAsIDB4QTEsIDB4QzAsIDB4QzMsIDB4ODIsIDB4RTQsCi0gIDB4NTAsIDB4RUEsIDB4NjAsIDB4N0EsIDB4REQsIDB4NUYsIDB4OEIsIDB4NUYsIDB4QUYsIDB4RkMsIDB4NzQsIDB4QUYsIDB4REMsCi0gIDB4NTYsIDB4RjcsIDB4MkUsIDB4M0UsIDB4OTcsIDB4NkUsIDB4MkIsIDB4RjMsIDB4QUYsIDB4RkUsIDB4N0QsIDB4MzIsIDB4REMsCi0gIDB4NTYsIDB4RjgsIDB4QUYsIDB4QjUsIDB4QTMsIDB4QkIsIDB4MDAsIDB4NUIsIDB4ODQsIDB4M0QsIDB4OUYsIDB4MEIsIDB4NDAsCi0gIDB4ODgsIDB4NjEsIDB4NUYsIDB4NEYsIDB4NEYsIDB4QjAsIDB4QjMsIDB4MDcsIDB4ODEsIDB4M0UsIDB4RjIsIDB4RkIsIDB4NTAsCi0gIDB4Q0EsIDB4NzcsIDB4NDAsIDB4MTIsIDB4QTgsIDB4RTYsIDB4MTEsIDB4OEUsIDB4RDYsIDB4OEEsIDB4QzYsIDB4RDYsIDB4OEMsCi0gIDB4MUQsIDB4NjMsIDB4NTUsIDB4M0QsIDB4MzQsIDB4RUEsIDB4QzMsIDB4QzYsIDB4NkEsIDB4RDIsIDB4OEMsIDB4QjAsIDB4MUQsCi0gIDB4NUUsIDB4NEEsIDB4N0EsIDB4OEIsIDB4RDUsIDB4OTksIDB4ODAsIDB4ODQsIDB4MzIsIDB4RkIsIDB4QjcsIDB4MDIsIDB4NkUsCi0gIDB4NjEsIDB4RkUsIDB4QUMsIDB4MUIsIDB4NUQsIDB4MTAsIDB4MjMsIDB4MjQsIDB4QzMsIDB4OEMsIDB4N0IsIDB4NTgsIDB4MkMsCi0gIDB4NEQsIDB4MDQsIDB4NzQsIDB4ODQsIDB4MjUsIDB4MTAsIDB4NEUsIDB4OTQsIDB4MjksIDB4NEQsIDB4ODgsIDB4QUUsIDB4NjUsCi0gIDB4NTMsIDB4QjksIDB4OTUsIDB4NEUsIDB4RTcsIDB4REQsIDB4RUUsIDB4RjIsIDB4NzAsIDB4MUYsIDB4MjYsIDB4NEYsIDB4QTgsCi0gIDB4QkMsIDB4M0QsIDB4MzUsIDB4MDIsIDB4M0IsIDB4QzAsIDB4OTgsIDB4NzAsIDB4MzgsIDB4MTgsIDB4RTUsIDB4MUUsIDB4MDUsCi0gIDB4QUMsIDB4MjgsIDB4QUEsIDB4NDYsIDB4MUEsIDB4QjAsIDB4MTksIDB4OTksIDB4MTgsIDB4MzUsIDB4NzgsIDB4MUUsIDB4NDEsCi0gIDB4NjAsIDB4MEQsIDB4NEYsIDB4N0UsIDB4RUMsIDB4MzcsIDB4QzMsIDB4MzAsIDB4NzMsIDB4MkEsIDB4NjksIDB4RkUsIDB4RUYsCi0gIDB4MjcsIDB4RUUsIDB4MTMsIDB4Q0MsIDB4RDAsIDB4REIsIDB4RTYsIDB4NDUsIDB4RUMsIDB4NUMsIDB4QjUsIDB4NzEsIDB4NTQsCi0gIDB4MkUsIDB4QjEsIDB4RTksIDB4ODgsIDB4QjQsIDB4M0YsIDB4NkYsIDB4RkQsIDB4RjcsIDB4RkYsIDB4OUQsIDB4MkQsIDB4NTIsCi0gIDB4MkUsIDB4QUUsIDB4QzksIDB4OTUsIDB4REUsIDB4QkYsIDB4REYsIDB4RkYsIDB4QkYsIDB4MjEsIDB4QjMsIDB4MkIsIDB4RjUsCi0gIDB4RjcsIDB4RjcsIDB4RDEsIDB4QTAsIDB4RjAsIDB4NzYsIDB4NjgsIDB4MzcsIDB4REIsIDB4OEYsIDB4ODUsIDB4NEQsIDB4QTgsCi0gIDB4MUEsIDB4RjksIDB4N0YsIDB4NzUsIDB4QTcsIDB4OTMsIDB4RjUsIDB4MDMsIDB4QzEsIDB4RjIsIDB4NjAsIDB4OEEsIDB4OTIsCi0gIDB4NTMsIDB4RjUsIDB4RDEsIDB4QzEsIDB4NTYsIDB4NEIsIDB4NjgsIDB4MDUsIDB4MTYsIDB4ODgsIDB4NjEsIDB4RTcsIDB4MTQsCi0gIDB4QzgsIDB4MEQsIDB4RjAsIDB4REYsIDB4RUYsIDB4NDYsIDB4NEEsIDB4RUQsIDB4MEIsIDB4RDEsIDB4RDEsIDB4RDEsIDB4QTQsCi0gIDB4ODUsIDB4QTMsIDB4MkMsIDB4MUQsIDB4REUsIDB4NDUsIDB4MTQsIDB4QTEsIDB4OEUsIDB4QTgsIDB4RDksIDB4OEMsIDB4QUIsCi0gIDB4NDcsIDB4MzEsIDB4RjEsIDB4MDAsIDB4MTUsIDB4QUQsIDB4ODAsIDB4MjAsIDB4QUEsIDB4RTQsIDB4NTcsIDB4RjgsIDB4MDUsCi0gIDB4MTQsIDB4NTgsIDB4MEIsIDB4RDMsIDB4NjMsIDB4MDAsIDB4OEYsIDB4NDQsIDB4MTUsIDB4N0YsIDB4MTksIDB4QzcsIDB4MEEsCi0gIDB4RTAsIDB4NDksIDB4MzIsIDB4RkUsIDB4MzYsIDB4MEUsIDB4RjMsIDB4NjYsIDB4MTAsIDB4MkIsIDB4MTEsIDB4NzMsIDB4M0QsCi0gIDB4MTksIDB4OTIsIDB4MjIsIDB4MjAsIDB4NzUsIDB4MUYsIDB4RjEsIDB4REIsIDB4OTYsIDB4NzMsIDB4Q0YsIDB4MUIsIDB4NTMsCi0gIDB4RkYsIDB4RDIsIDB4MjMsIDB4RjIsIDB4QjYsIDB4QUEsIDB4QjYsIDB4NDQsIDB4QTMsIDB4NzMsIDB4N0UsIDB4MDAsIDB4MkQsCi0gIDB4NEQsIDB4NEQsIDB4ODcsIDB4RTAsIDB4ODQsIDB4NTUsIDB4RDYsIDB4MDMsIDB4QjgsIDB4RDgsIDB4OTAsIDB4RUYsIDB4QzAsCi0gIDB4NzYsIDB4NUQsIDB4NjksIDB4MDIsIDB4MDAsIDB4MEUsIDB4MTcsIDB4RDAsIDB4MDIsIDB4OTYsIDB4NTAsIDB4RUEsIDB4QUIsCi0gIDB4QkYsIDB4MEQsIDB4QUYsIDB4Q0IsIDB4RDMsIDB4RkYsIDB4QUEsIDB4OUQsIDB4N0YsIDB4RDYsIDB4QkQsIDB4MkMsIDB4MTQsCi0gIDB4QjQsIDB4Q0QsIDB4MjAsIDB4NzMsIDB4QjQsIDB4RjQsIDB4MzgsIDB4OTYsIDB4REUsIDB4QjAsIDB4NkIsIDB4RTUsIDB4MUIsCi0gIDB4RkQsIDB4MEUsIDB4MEIsIDB4QTQsIDB4ODEsIDB4QkYsIDB4QzgsIDB4QTAsIDB4MjEsIDB4NzYsIDB4N0IsIDB4MjUsIDB4M0YsCi0gIDB4RTYsIDB4ODQsIDB4NDAsIDB4MUEsIDB4REEsIDB4MjUsIDB4NUEsIDB4RkYsIDB4NzMsIDB4NkIsIDB4MTQsIDB4MUIsIDB4RjcsCi0gIDB4MDgsIDB4RkEsIDB4MjYsIDB4NzMsIDB4N0EsIDB4NTgsIDB4MDIsIDB4MUEsIDB4RTYsIDB4NjMsIDB4QjYsIDB4NDUsIDB4N0IsCi0gIDB4RTMsIDB4RTAsIDB4ODAsIDB4MTQsIDB4NDIsIDB4QTgsIDB4N0QsIDB4RjMsIDB4ODAsIDB4OUIsIDB4MDEsIDB4NDMsIDB4ODIsCi0gIDB4ODIsIDB4OEMsIDB4QkUsIDB4MEQsIDB4RkQsIDB4QUUsIDB4ODgsIDB4QTgsIDB4QjksIDB4QzMsIDB4RUUsIDB4RkYsIDB4NDYsCi0gIDB4MDAsIDB4ODQsIDB4RTYsIDB4QjQsIDB4MEMsIDB4QTksIDB4NjYsIDB4QzYsIDB4NzQsIDB4NzIsIDB4QUEsIDB4QTQsIDB4M0EsCi0gIDB4QjAsIDB4MUIsIDB4MDYsIDB4QjQsIDB4REIsIDB4RTgsIDB4QzIsIDB4MTcsIDB4QTIsIDB4QkMsIDB4QkUsIDB4NUMsIDB4MEYsCi0gIDB4MkEsIDB4NzYsIDB4RDUsIDB4RUUsIDB4MzksIDB4MzYsIDB4N0MsIDB4MjUsIDB4OTQsIDB4MTUsIDB4M0MsIDB4QzksIDB4QjksCi0gIDB4OTMsIDB4MDcsIDB4MTksIDB4QUYsIDB4RTYsIDB4NzAsIDB4QzMsIDB4RjUsIDB4RDQsIDB4MTcsIDB4ODcsIDB4NTcsIDB4NzcsCi0gIDB4N0QsIDB4Q0YsIDB4MEQsIDB4REQsIDB4REUsIDB4QjcsIDB4RkYsIDB4QjQsIDB4REEsIDB4MjAsIDB4NDUsIDB4MUEsIDB4NDUsCi0gIDB4RjQsIDB4NTgsIDB4MDEsIDB4QkMsIDB4RUIsIDB4M0YsIDB4MTYsIDB4N0YsIDB4NEMsIDB4MTUsIDB4ODQsIDB4OEMsIDB4RTUsCi0gIDB4RjYsIDB4OTYsIDB4QTYsIDB4QTEsIDB4QjksIDB4QjIsIDB4N0YsIDB4NkIsIDB4RkYsIDB4MzEsIDB4RjIsIDB4RjUsIDB4QzksCi0gIDB4RkYsIDB4NjEsIDB4RUUsIDB4QjUsIDB4ODQsIDB4QUUsIDB4NjgsIDB4NDEsIDB4RUEsIDB4RDAsIDB4RjAsIDB4QTUsIDB4Q0UsCi0gIDB4MEMsIDB4RTYsIDB4NEMsIDB4NkQsIDB4NkQsIDB4OTQsIDB4MDgsIDB4QzksIDB4QTksIDB4NEEsIDB4NjAsIDB4NkQsIDB4MDEsCi0gIDB4M0IsIDB4RUYsIDB4NEQsIDB4OTksIDB4OEQsIDB4NDIsIDB4MkEsIDB4NkIsIDB4OEEsIDB4QzcsIDB4RkEsIDB4QTksIDB4OTAsCi0gIDB4NDAsIDB4MDAsIDB4OTAsIDB4RjMsIDB4QTAsIDB4NzUsIDB4OEUsIDB4RDUsIDB4RkUsIDB4RTcsIDB4QkQsIDB4MDIsIDB4ODcsCi0gIDB4MEMsIDB4N0QsIDB4RjAsIDB4QUYsIDB4MUUsIDB4NUYsIDB4OEQsIDB4QzgsIDB4RTEsIDB4RDQsIDB4NTYsIDB4MDgsIDB4QkYsCi0gIDB4NzYsIDB4ODAsIDB4RDQsIDB4MTgsIDB4ODksIDB4MkQsIDB4NTcsIDB4REYsIDB4NjYsIDB4RDAsIDB4NDYsIDB4NjgsIDB4NzcsCi0gIDB4NTUsIDB4NDcsIDB4RjUsIDB4N0MsIDB4RjcsIDB4QTYsIDB4NjYsIDB4RDYsIDB4NUEsIDB4NjQsIDB4NTUsIDB4RDQsIDB4ODAsCi0gIDB4QzQsIDB4NTUsIDB4RTksIDB4MzYsIDB4M0YsIDB4NUUsIDB4RTIsIDB4NUMsIDB4N0YsIDB4NUYsIDB4Q0UsIDB4N0YsIDB4RTEsCi0gIDB4MEMsIDB4ODIsIDB4M0QsIDB4NkIsIDB4NkUsIDB4QTIsIDB4RUEsIDB4M0IsIDB4MUYsIDB4RTgsIDB4OUUsIDB4QzcsIDB4NEUsCi0gIDB4MjQsIDB4M0QsIDB4REQsIDB4RkEsIDB4RUIsIDB4NzEsIDB4REYsIDB4RkUsIDB4MTUsIDB4RkUsIDB4NDEsIDB4OUIsIDB4QjQsCi0gIDB4NEUsIDB4QUIsIDB4NTEsIDB4RTUsIDB4MUYsIDB4N0QsIDB4MkQsIDB4QUMsIDB4RDAsIDB4NjYsIDB4RDksIDB4QTEsIDB4NTksCi0gIDB4NzgsIDB4QzYsIDB4RUYsIDB4QzQsIDB4NDMsIDB4MDgsIDB4NjUsIDB4MTgsIDB4NzMsIDB4REUsIDB4MkEsIDB4QUQsIDB4NzIsCi0gIDB4RTcsIDB4NUEsIDB4N0UsIDB4MzMsIDB4MDQsIDB4NzIsIDB4MzgsIDB4NTcsIDB4NDcsIDB4NzMsIDB4MTAsIDB4MUQsIDB4ODgsCi0gIDB4NTcsIDB4NEMsIDB4REYsIDB4QTcsIDB4NzgsIDB4MTYsIDB4RkIsIDB4MDEsIDB4MjEsIDB4MjgsIDB4MkQsIDB4QjYsIDB4N0UsCi0gIDB4MDUsIDB4MTgsIDB4MzIsIDB4NTIsIDB4QzMsIDB4NDksIDB4MEIsIDB4MzIsIDB4MTgsIDB4MTIsIDB4OTMsIDB4NTQsIDB4MTUsCi0gIDB4M0IsIDB4QzgsIDB4NkQsIDB4NEEsIDB4NzcsIDB4RUYsIDB4MEEsIDB4NDYsIDB4ODMsIDB4ODksIDB4NUMsIDB4OEIsIDB4Q0IsCi0gIDB4MTgsIDB4QTYsIDB4REMsIDB4OTcsIDB4NkYsIDB4RUUsIDB4RUUsIDB4MDAsIDB4NkEsIDB4RjEsIDB4MTAsIDB4RkUsIDB4MDcsCi0gIDB4MEMsIDB4RTAsIDB4NTMsIDB4RDIsIDB4QjgsIDB4NDUsIDB4RjQsIDB4NkUsIDB4MTYsIDB4NEIsIDB4QzksIDB4OUMsIDB4QzcsCi0gIDB4OTMsIDB4ODMsIDB4MjMsIDB4MUQsIDB4NEQsIDB4MDAsIDB4QjksIDB4NEYsIDB4ODYsIDB4NTEsIDB4RjAsIDB4MjksIDB4NjksCi0gIDB4NDEsIDB4MjEsIDB4QzUsIDB4NEEsIDB4QzYsIDB4NkQsIDB4RDEsIDB4ODEsIDB4MzgsIDB4REIsIDB4N0MsIDB4MDYsIDB4QTgsCi0gIDB4MjYsIDB4OEUsIDB4NzEsIDB4MDAsIDB4NEMsIDB4NDQsIDB4MTQsIDB4MDUsIDB4RjIsIDB4MUMsIDB4MDAsIDB4NDksIDB4RkMsCi0gIDB4MjksIDB4NkEsIDB4RjksIDB4OUUsIDB4RDEsIDB4MzUsIDB4NEIsIDB4QjcsIDB4RTUsIDB4REIsIDB4RkMsIDB4MDEsIDB4MDQsCi0gIDB4M0YsIDB4NzAsIDB4MzMsIDB4NTYsIDB4ODcsIDB4NjksIDB4MDEsIDB4QjQsIDB4Q0UsIDB4MUMsIDB4NEQsIDB4MkUsIDB4ODMsCi0gIDB4NTEsIDB4NTEsIDB4RDAsIDB4MzcsIDB4M0IsIDB4QjQsIDB4QkEsIDB4NDcsIDB4RjUsIDB4RkYsIDB4QkYsIDB4RkEsIDB4RDUsCi0gIDB4MDMsIDB4NjUsIDB4RDMsIDB4MjgsIDB4OUYsIDB4MzgsIDB4NTcsIDB4RkUsIDB4NzEsIDB4RDgsIDB4OUMsIDB4MTYsIDB4RUUsCi0gIDB4NzIsIDB4MTksIDB4MDMsIDB4MTcsIDB4NkUsIDB4QzAsIDB4RUMsIDB4NDksIDB4M0QsIDB4OTYsIDB4RTIsIDB4MzAsIDB4OTcsCi0gIDB4OTcsIDB4ODQsIDB4MzgsIDB4NkIsIDB4RTgsIDB4MkUsIDB4QUIsIDB4MEUsIDB4MkUsIDB4MDMsIDB4NTIsIDB4QkEsIDB4NjgsCi0gIDB4NTUsIDB4QkEsIDB4MUQsIDB4MkMsIDB4NDcsIDB4QUEsIDB4NzIsIDB4QUUsIDB4MDIsIDB4MzEsIDB4NkUsIDB4QTEsIDB4REMsCi0gIDB4QUQsIDB4MEYsIDB4NEEsIDB4NDYsIDB4QzksIDB4RjIsIDB4QTksIDB4QUIsIDB4RkQsIDB4ODcsIDB4ODksIDB4NUMsIDB4QjMsCi0gIDB4NzUsIDB4N0UsIDB4RTMsIDB4REUsIDB4OUYsIDB4QzQsIDB4MDIsIDB4MUUsIDB4QTIsIDB4RjgsIDB4OEIsIDB4RDMsIDB4MDAsCi0gIDB4ODMsIDB4OTYsIDB4QzQsIDB4RDAsIDB4QjksIDB4NjIsIDB4QjksIDB4NjksIDB4RUMsIDB4NTYsIDB4REYsIDB4N0QsIDB4OTEsCi0gIDB4NEIsIDB4NjgsIDB4MjcsIDB4QTgsIDB4NjEsIDB4NzgsIDB4QTcsIDB4OTUsIDB4NjYsIDB4NTEsIDB4NDEsIDB4RjYsIDB4Q0UsCi0gIDB4NzgsIDB4RDMsIDB4OUEsIDB4OTEsIDB4QTAsIDB4MzEsIDB4MDksIDB4NDcsIDB4QjgsIDB4NDcsIDB4QjgsIDB4NDQsIDB4RTEsCi0gIDB4MTMsIDB4ODYsIDB4N0UsIDB4OTIsIDB4ODAsIDB4QzYsIDB4MUEsIDB4RjcsIDB4NzksIDB4N0UsIDB4RjEsIDB4NUQsIDB4OUYsCi0gIDB4MTcsIDB4MkQsIDB4ODAsIDB4MDAsIDB4NzksIDB4MzQsIDB4N0QsIDB4RTMsIDB4QUQsIDB4NjAsIDB4MDAsIDB4MjAsIDB4MDcsCi0gIDB4ODAsIDB4MDAsIDB4NDAsIDB4MDEsIDB4RjgsIDB4QTEsIDB4ODYsIDB4QjEsIDB4RUUsIDB4MjEsIDB4NjMsIDB4ODUsIDB4NjAsCi0gIDB4NTEsIDB4ODQsIDB4OTAsIDB4N0UsIDB4OTIsIDB4MDksIDB4MzksIDB4MUMsIDB4MTYsIDB4ODcsIDB4NUMsIDB4QTYsIDB4MDksCi0gIDB4OTAsIDB4MDYsIDB4MzQsIDB4NkUsIDB4QjgsIDB4OEQsIDB4NUQsIDB4QUMsIDB4NzcsIDB4OTcsIDB4QjUsIDB4NEQsIDB4MzAsCi0gIDB4RkQsIDB4MzksIDB4RDAsIDB4NTAsIDB4MDAsIDB4QzksIDB4OTgsIDB4MDQsIDB4ODYsIDB4MDAsIDB4MEQsIDB4RDgsIDB4M0UsCi0gIDB4MzQsIDB4QzIsIDB4QTYsIDB4MjUsIDB4RjgsIDB4MjAsIDB4Q0MsIDB4NkQsIDB4OUUsIDB4NjMsIDB4MDUsIDB4MzAsIDB4QzQsCi0gIDB4QzYsIDB4Q0MsIDB4NTQsIDB4MzEsIDB4OUYsIDB4M0MsIDB4RjUsIDB4ODYsIDB4QjksIDB4MDgsIDB4MTgsIDB4QzMsIDB4MUUsCi0gIDB4QjksIDB4QTAsIDB4MEMsIDB4NDUsIDB4MkMsIDB4NTQsIDB4MzIsIDB4OEIsIDB4ODUsIDB4ODYsIDB4NTksIDB4QzMsIDB4QjMsCi0gIDB4NTAsIDB4NUEsIDB4RkUsIDB4QkEsIDB4RjcsIDB4NEQsIDB4QzksIDB4OUMsIDB4OUUsIDB4MDEsIDB4REYsIDB4RDcsIDB4NkUsCi0gIDB4QjUsIDB4MTUsIDB4NTMsIDB4MDgsIDB4NTcsIDB4QTQsIDB4NzEsIDB4MzYsIDB4ODAsIDB4NDYsIDB4MDUsIDB4MjEsIDB4NDgsCi0gIDB4N0IsIDB4OTEsIDB4QzgsIDB4QUEsIDB4RkYsIDB4MDcsIDB4OUYsIDB4NzgsIDB4NjgsIDB4Q0YsIDB4M0MsIDB4RUYsIDB4RkYsCi0gIDB4QkMsIDB4QjYsIDB4QTIsIDB4MzYsIDB4QjcsIDB4OUYsIDB4NTQsIDB4RjYsIDB4NkYsIDB4NUQsIDB4REQsIDB4NzUsIDB4RDQsCi0gIDB4M0MsIDB4NzUsIDB4RTgsIDB4Q0YsIDB4MTUsIDB4MDIsIDB4NUIsIDB4OTQsIDB4QzMsIDB4QTIsIDB4NDEsIDB4NjMsIDB4QTEsCi0gIDB4MTQsIDB4RjYsIDB4QzAsIDB4NTcsIDB4MTUsIDB4OUYsIDB4MEMsIDB4M0YsIDB4ODAsIDB4RjIsIDB4OTgsIDB4RUUsIDB4NDEsCi0gIDB4ODUsIDB4RUUsIDB4QkMsIDB4QUEsIDB4RTksIDB4NTksIDB4QUEsIDB4QTAsIDB4OTIsIDB4Q0EsIDB4MDAsIDB4RjMsIDB4NTAsCi0gIDB4Q0MsIDB4RkYsIDB4QUQsIDB4OTcsIDB4NjksIDB4QTcsIDB4RjIsIDB4MEIsIDB4OEYsIDB4RDcsIDB4RDcsIDB4ODIsIDB4M0EsCi0gIDB4QkIsIDB4OTgsIDB4MUQsIDB4Q0IsIDB4ODksIDB4MEIsIDB4OUIsIDB4MDUsIDB4RjcsIDB4RDAsIDB4MUEsIDB4NjAsIDB4RjMsCi0gIDB4MjksIDB4MTYsIDB4MTIsIDB4RjgsIDB4RjQsIDB4RjEsIDB4NEEsIDB4MDUsIDB4OUIsIDB4NTcsIDB4MTIsIDB4N0UsIDB4M0EsCi0gIDB4NEEsIDB4OEQsIDB4QTYsIDB4REYsIDB4QjYsIDB4REQsIDB4REYsIDB4QzMsIDB4RjAsIDB4RDIsIDB4RDQsIDB4RDcsIDB4NDEsCi0gIDB4QTYsIDB4MDAsIDB4NzYsIDB4OEMsIDB4NzUsIDB4MDgsIDB4RjAsIDB4MTksIDB4RDgsIDB4MTQsIDB4NjMsIDB4NTUsIDB4NTIsCi0gIDB4MTgsIDB4MzAsIDB4OTgsIDB4RDAsIDB4M0YsIDB4NjUsIDB4NTIsIDB4QjMsIDB4ODgsIDB4NkQsIDB4MTcsIDB4MzksIDB4OTMsCi0gIDB4Q0EsIDB4M0IsIDB4QjQsIDB4MUQsIDB4OEQsIDB4REYsIDB4REYsIDB4QUQsIDB4NzIsIDB4REEsIDB4NzQsIDB4QUYsIDB4QkQsCi0gIDB4MzEsIDB4RjksIDB4MTIsIDB4NjEsIDB4NDUsIDB4MjksIDB4NEMsIDB4MkIsIDB4NjEsIDB4QTEsIDB4MTIsIDB4OTAsIDB4NTMsCi0gIDB4RTcsIDB4NUEsIDB4OUQsIDB4NDQsIDB4QzgsIDB4M0EsIDB4ODMsIDB4REMsIDB4MzQsIDB4NEMsIDB4MDcsIDB4QUYsIDB4REIsCi0gIDB4OTAsIDB4Q0QsIDB4MDMsIDB4QTQsIDB4NjQsIDB4NzgsIDB4QkQsIDB4NTUsIDB4QjIsIDB4NTYsIDB4NTksIDB4MzIsIDB4QUIsCi0gIDB4MTMsIDB4MkMsIDB4QzksIDB4NzcsIDB4RjgsIDB4M0IsIDB4REYsIDB4RkYsIDB4QUMsIDB4MDcsIDB4QjksIDB4MDgsIDB4N0IsCi0gIDB4RTksIDB4ODIsIDB4QjksIDB4NTksIDB4QzcsIDB4RkYsIDB4ODYsIDB4MkMsIDB4MTIsIDB4N0MsIDB4QzYsIDB4NjUsIDB4M0MsCi0gIDB4NzEsIDB4QjgsIDB4OTgsIDB4OUYsIDB4QTIsIDB4NDUsIDB4MDMsIDB4QTUsIDB4RDksIDB4QzMsIDB4Q0YsIDB4RkEsIDB4RUIsCi0gIDB4ODksIDB4QUQsIDB4MDMsIDB4RUUsIDB4REQsIDB4NzYsIDB4RDMsIDB4NEYsIDB4MTAsIDB4NkYsIDB4RjAsIDB4QzEsIDB4NjAsCi0gIDB4MEMsIDB4MDAsIDB4RDQsIDB4NzYsIDB4MTIsIDB4MEEsIDB4OEQsIDB4REMsIDB4RkQsIDB4NUUsIDB4MEIsIDB4MjYsIDB4MkYsCi0gIDB4MDEsIDB4MUQsIDB4QjksIDB4RTcsIDB4NzMsIDB4RDQsIDB4RjIsIDB4Q0IsIDB4RDgsIDB4NzgsIDB4MjEsIDB4NTIsIDB4NEIsCi0gIDB4ODMsIDB4M0MsIDB4NDQsIDB4NzIsIDB4MEUsIDB4QjEsIDB4NEUsIDB4MzcsIDB4QkMsIDB4QzcsIDB4NTAsIDB4RkEsIDB4MDcsCi0gIDB4ODAsIDB4NzEsIDB4MTAsIDB4MEIsIDB4MjQsIDB4RDEsIDB4N0UsIDB4REEsIDB4N0YsIDB4QTcsIDB4MkYsIDB4NDAsIDB4QUEsCi0gIDB4RDMsIDB4RjUsIDB4NDQsIDB4MTAsIDB4NTYsIDB4NEUsIDB4M0IsIDB4RjEsIDB4NkUsIDB4OUEsIDB4QTAsIDB4RUEsIDB4ODUsCi0gIDB4NjYsIDB4MTYsIDB4RkIsIDB4NUMsIDB4MEIsIDB4MkIsIDB4NzQsIDB4MTgsIDB4QUYsIDB4M0QsIDB4MDQsIDB4M0UsIDB4Q0UsCi0gIDB4ODgsIDB4OUIsIDB4M0UsIDB4RjQsIDB4QjksIDB4MDAsIDB4NjAsIDB4MEUsIDB4RTEsIDB4RTIsIDB4Q0IsIDB4MTIsIDB4QjksCi0gIDB4NkQsIDB4NUEsIDB4QzcsIDB4NTUsIDB4MUQsIDB4QjksIDB4NzksIDB4QUMsIDB4NDMsIDB4NDMsIDB4RTYsIDB4M0IsIDB4REQsCi0gIDB4N0UsIDB4OUYsIDB4NzgsIDB4RDMsIDB4RUEsIDB4QTMsIDB4MTEsIDB4RkYsIDB4REIsIDB4QkIsIDB4QjgsIDB4OTcsIDB4MzcsCi0gIDB4MTUsIDB4REIsIDB4RjEsIDB4OTcsIDB4OTYsIDB4QzcsIDB4RkMsIDB4RTUsIDB4QkYsIDB4RjIsIDB4ODYsIDB4QzAsIDB4RkEsCi0gIDB4OUIsIDB4NEMsIDB4MDAsIDB4MDQsIDB4MDMsIDB4QTUsIDB4QjYsIDB4QjcsIDB4OUMsIDB4RDksIDB4QUIsIDB4MDksIDB4NzcsCi0gIDB4NTEsIDB4MTgsIDB4M0IsIDB4QUQsIDB4NjEsIDB4NkMsIDB4RkMsIDB4NTEsIDB4OTYsIDB4RkIsIDB4MTksIDB4QzgsIDB4NTIsCi0gIDB4MzUsIDB4MDcsIDB4MDAsIDB4NjMsIDB4ODcsIDB4MTQsIDB4MDQsIDB4RkEsIDB4N0EsIDB4NDgsIDB4M0UsIDB4MDAsIDB4NDcsCi0gIDB4MjksIDB4MDcsIDB4NzQsIDB4OTcsIDB4NzQsIDB4ODQsIDB4RUIsIDB4QjIsIDB4MTYsIDB4QjIsIDB4MzEsIDB4ODEsIDB4Q0UsCi0gIDB4MkEsIDB4MzEsIDB4QTcsIDB4QjEsIDB4RUIsIDB4ODMsIDB4MzQsIDB4N0EsIDB4NzMsIDB4RDcsIDB4MkYsIDB4RkYsIDB4QkMsCi0gIDB4RkYsIDB4RTUsIDB4QUEsIDB4RjIsIDB4QjUsIDB4NkUsIDB4OUUsIDB4QTUsIDB4NzAsIDB4OEEsIDB4OEMsIDB4REYsIDB4NkEsCi0gIDB4MDYsIDB4MTYsIDB4QzEsIDB4QUIsIDB4NTksIDB4NzAsIDB4RDksIDB4M0QsIDB4NDcsIDB4N0MsIDB4REQsIDB4RUYsIDB4REYsCi0gIDB4MkYsIDB4RkYsIDB4NDIsIDB4NkIsIDB4QkEsIDB4NEIsIDB4QkYsIDB4RjgsIDB4N0YsIDB4RjIsIDB4MDMsIDB4MEQsIDB4NzksCi0gIDB4QkMsIDB4MDMsIDB4NzYsIDB4NjQsIDB4MUMsIDB4MEQsIDB4N0IsIDB4RDcsIDB4QkQsIDB4QjAsIDB4NkMsIDB4RDgsIDB4NjEsCi0gIDB4MTcsIDB4MTcsIDB4OEMsIDB4RUQsIDB4NEUsIDB4MjAsIDB4RUIsIDB4NTUsIDB4MzMsIDB4MzksIDB4RTksIDB4N0UsIDB4QkUsCi0gIDB4OEUsIDB4MDUsIDB4NEIsIDB4NzgsIDB4OTYsIDB4ODUsIDB4Q0MsIDB4NjgsIDB4QzksIDB4NzgsIDB4QUYsIDB4QUUsIDB4NDQsCi0gIDB4MzYsIDB4NjEsIDB4RDMsIDB4NTMsIDB4RUIsIDB4QjMsIDB4M0UsIDB4NEYsIDB4OTcsIDB4RTIsIDB4OEQsIDB4QUUsIDB4OTAsCi0gIDB4RUQsIDB4QjUsIDB4NEYsIDB4OEUsIDB4RTQsIDB4N0EsIDB4NDQsIDB4Q0YsIDB4OUQsIDB4QzUsIDB4NzcsIDB4NEQsIDB4QUIsCi0gIDB4NEYsIDB4RTUsIDB4QzUsIDB4NzMsIDB4QTAsIDB4QzgsIDB4QTUsIDB4QkIsIDB4NEIsIDB4N0QsIDB4RDUsIDB4RkIsIDB4RkIsCi0gIDB4RkYsIDB4NjEsIDB4RkQsIDB4QUEsIDB4MUEsIDB4NjIsIDB4N0UsIDB4M0MsIDB4NjYsIDB4MzQsIDB4MTUsIDB4NjQsIDB4MjUsCi0gIDB4RUMsIDB4N0MsIDB4OUQsIDB4NkEsIDB4NjQsIDB4NEQsIDB4ODAsIDB4RDUsIDB4NEYsIDB4RkUsIDB4OEUsIDB4RUUsIDB4MTgsCi0gIDB4NTMsIDB4QzEsIDB4MDksIDB4NTEsIDB4RjcsIDB4QzAsIDB4QTYsIDB4QjIsIDB4OUIsIDB4MTksIDB4MkIsIDB4MTQsIDB4NjYsCi0gIDB4NjYsIDB4NEIsIDB4MzksIDB4NjIsIDB4MUQsIDB4ODQsIDB4QjksIDB4MDIsIDB4ODQsIDB4QUMsIDB4QzEsIDB4REEsIDB4NkMsCi0gIDB4ODAsIDB4Q0QsIDB4NDAsIDB4MjAsIDB4MjAsIDB4MTksIDB4NTEsIDB4REMsIDB4MkIsIDB4N0QsIDB4NUQsIDB4N0YsIDB4RTMsCi0gIDB4ODYsIDB4OEUsIDB4QzMsIDB4MzUsIDB4RkUsIDB4NUMsIDB4RjYsIDB4MUMsIDB4RkYsIDB4MDUsIDB4OUUsIDB4QjUsIDB4QjYsCi0gIDB4QkIsIDB4QkUsIDB4RjcsIDB4MkYsIDB4QjcsIDB4RTEsIDB4RjUsIDB4MzMsIDB4ODYsIDB4QTAsIDB4NDcsIDB4REUsIDB4RjcsCi0gIDB4RTksIDB4M0IsIDB4QkUsIDB4N0UsIDB4OUIsIDB4MTcsIDB4RkMsIDB4RkQsIDB4MkUsIDB4NDAsIDB4ODYsIDB4NDEsIDB4NzUsCi0gIDB4RjEsIDB4QjIsIDB4MTgsIDB4QTksIDB4REUsIDB4MkQsIDB4RDYsIDB4MDQsIDB4MjAsIDB4QTQsIDB4QkEsIDB4ODEsIDB4QkMsCi0gIDB4MUQsIDB4NUEsIDB4RDYsIDB4RjcsIDB4RjYsIDB4QjgsIDB4NDIsIDB4RjcsIDB4RjUsIDB4M0QsIDB4OTcsIDB4QUMsIDB4Q0QsCi0gIDB4NkYsIDB4QUQsIDB4REIsIDB4NEYsIDB4NUEsIDB4MkUsIDB4NjQsIDB4QjksIDB4NUQsIDB4REQsIDB4OEIsIDB4NEEsIDB4MzUsCi0gIDB4NDQsIDB4RkUsIDB4M0QsIDB4QzYsIDB4NzcsIDB4N0EsIDB4QkYsIDB4REEsIDB4QUMsIDB4OUUsIDB4QjAsIDB4QTIsIDB4QjksCi0gIDB4NkMsIDB4QUYsIDB4MDIsIDB4REQsIDB4RjIsIDB4NzEsIDB4MkIsIDB4RUYsIDB4RDMsIDB4NTEsIDB4MEUsIDB4MDcsIDB4MTEsCi0gIDB4QkQsIDB4RUQsIDB4MzksIDB4N0YsIDB4RDksIDB4QjgsIDB4QkQsIDB4RUUsIDB4MzUsIDB4RTksIDB4NUMsIDB4NjcsIDB4NDIsCi0gIDB4REEsIDB4MDUsIDB4NkUsIDB4MzksIDB4Q0UsIDB4NTUsIDB4RkIsIDB4MjYsIDB4QjcsIDB4OTAsIDB4NEIsIDB4REEsIDB4OTEsCi0gIDB4NDgsIDB4RkQsIDB4REUsIDB4QjIsIDB4RUMsIDB4ODgsIDB4OUEsIDB4NDYsIDB4MUEsIDB4NEMsIDB4RDQsIDB4MDUsIDB4MTIsCi0gIDB4ODUsIDB4NTcsIDB4MzcsIDB4MjIsIDB4RDMsIDB4MEUsIDB4NEYsIDB4NzksIDB4RTMsIDB4ODEsIDB4QTksIDB4MkIsIDB4NUYsCi0gIDB4RDcsIDB4NkQsIDB4QkQsIDB4MjEsIDB4OTgsIDB4NkYsIDB4N0QsIDB4RjUsIDB4MzIsIDB4N0EsIDB4NkUsIDB4RjgsIDB4MjAsCi0gIDB4MDEsIDB4NTAsIDB4OTAsIDB4N0EsIDB4ODgsIDB4M0UsIDB4MEQsIDB4NTcsIDB4QjEsIDB4NTgsIDB4NjUsIDB4RTYsIDB4ODIsCi0gIDB4Q0UsIDB4MDgsIDB4NjksIDB4OEIsIDB4ODcsIDB4NjIsIDB4MzYsIDB4QjEsIDB4N0IsIDB4REUsIDB4NzQsIDB4QkQsIDB4RkUsCi0gIDB4MTAsIDB4QkUsIDB4MjYsIDB4QUIsIDB4N0UsIDB4QjcsIDB4OEQsIDB4RjcsIDB4ODMsIDB4MkUsIDB4MEYsIDB4QUYsIDB4N0UsCi0gIDB4QkMsIDB4MTcsIDB4MzEsIDB4RkYsIDB4QjAsIDB4NEYsIDB4N0YsIDB4NEIsIDB4MTMsIDB4ODMsIDB4REYsIDB4RUUsIDB4MjMsCi0gIDB4RDMsIDB4RTcsIDB4QzgsIDB4QUYsIDB4NzUsIDB4QUIsIDB4RUEsIDB4QkQsIDB4N0QsIDB4RDIsIDB4OUQsIDB4RTksIDB4QzEsCi0gIDB4MTgsIDB4OEIsIDB4N0MsIDB4OUYsIDB4NTEsIDB4REMsIDB4MzcsIDB4QTMsIDB4REIsIDB4RkMsIDB4RDQsIDB4NkEsIDB4OTEsCi0gIDB4NDQsIDB4N0YsIDB4NzIsIDB4QzUsIDB4RDksIDB4QzgsIDB4MzcsIDB4MzgsIDB4NjMsIDB4MEQsIDB4NTksIDB4OEIsIDB4N0YsCi0gIDB4N0QsIDB4OTYsIDB4QzEsIDB4NUYsIDB4NEMsIDB4N0MsIDB4ODgsIDB4Q0IsIDB4NjUsIDB4MDcsIDB4MkIsIDB4MEUsIDB4MUQsCi0gIDB4MjQsIDB4QUEsIDB4MjAsIDB4MkUsIDB4NkMsIDB4MzMsIDB4QUIsIDB4RUYsIDB4MjMsIDB4RTUsIDB4RTMsIDB4NkMsIDB4QTMsCi0gIDB4QTUsIDB4MkQsIDB4MDEsIDB4REYsIDB4MjYsIDB4OTIsIDB4NTIsIDB4RjUsIDB4RTYsIDB4M0UsIDB4RTMsIDB4REQsIDB4QzYsCi0gIDB4RUQsIDB4NDIsIDB4MEYsIDB4NzEsIDB4N0IsIDB4RDEsIDB4RjQsIDB4MDYsIDB4RjYsIDB4ODIsIDB4RDUsIDB4MTMsIDB4QjMsCi0gIDB4NjAsIDB4MzEsIDB4MDksIDB4ODksIDB4NjMsIDB4MTUsIDB4RDIsIDB4Q0IsIDB4QUEsIDB4NzcsIDB4RkQsIDB4RjQsIDB4RUIsCi0gIDB4RjQsIDB4RUQsIDB4MkUsIDB4RTIsIDB4QkEsIDB4MjcsIDB4MkUsIDB4NzQsIDB4RDIsIDB4OTEsIDB4N0YsIDB4MEYsIDB4REUsCi0gIDB4MjUsIDB4RkUsIDB4NzgsIDB4MjAsIDB4MDUsIDB4MEEsIDB4NkEsIDB4RkUsIDB4ODksIDB4MTQsIDB4MjMsIDB4RjMsIDB4RjUsCi0gIDB4M0EsIDB4MUUsIDB4RjMsIDB4MjIsIDB4Q0UsIDB4MTIsIDB4ODIsIDB4MjQsIDB4MTEsIDB4MDUsIDB4MDQsIDB4NzEsIDB4OTksCi0gIDB4RTUsIDB4RjAsIDB4QTYsIDB4REIsIDB4N0IsIDB4RjUsIDB4OEYsIDB4RjksIDB4M0MsIDB4MDIsIDB4MEMsIDB4NDYsIDB4RkQsCi0gIDB4QjYsIDB4RUEsIDB4MDYsIDB4MTEsIDB4RjQsIDB4MUUsIDB4N0EsIDB4MjAsIDB4NkEsIDB4NTQsIDB4QkIsIDB4NEEsIDB4NjAsCi0gIDB4QjAsIDB4MzAsIDB4MjgsIDB4OUEsIDB4RjMsIDB4M0IsIDB4RTksIDB4QkQsIDB4RDYsIDB4MDQsIDB4Q0EsIDB4M0EsIDB4MzMsCi0gIDB4MzcsIDB4NUYsIDB4QjcsIDB4QUQsIDB4RTcsIDB4OUMsIDB4RTIsIDB4OTUsIDB4MjEsIDB4RjcsIDB4QjUsIDB4QzQsIDB4RjAsCi0gIDB4RDEsIDB4NTEsIDB4MDksIDB4NDQsIDB4M0YsIDB4MDcsIDB4RkMsIDB4NUYsIDB4MzcsIDB4RkQsIDB4N0QsIDB4N0UsIDB4RDUsCi0gIDB4RjcsIDB4RUIsIDB4NjksIDB4QjksIDB4NTQsIDB4OTgsIDB4NUEsIDB4MkEsIDB4NTYsIDB4RTMsIDB4QzAsIDB4MjEsIDB4NTcsCi0gIDB4RDEsIDB4RUIsIDB4NzUsIDB4MTUsIDB4RUQsIDB4QUMsIDB4QUYsIDB4NUQsIDB4RkYsIDB4QzIsIDB4RkUsIDB4NEUsIDB4RkIsCi0gIDB4QkEsIDB4MTMsIDB4QjgsIDB4ODcsIDB4RkEsIDB4NEUsIDB4NUUsIDB4NUMsIDB4MjQsIDB4MTUsIDB4NUIsIDB4MkIsIDB4MkMsCi0gIDB4MzIsIDB4NjgsIDB4MUYsIDB4MzAsIDB4NUYsIDB4QzEsIDB4RjcsIDB4RTcsIDB4RTEsIDB4OUMsIDB4MDAsIDB4QzEsIDB4OUMsCi0gIDB4QjEsIDB4QUIsIDB4RkEsIDB4RkYsIDB4QzEsIDB4MUUsIDB4NzIsIDB4QTEsIDB4NDYsIDB4OUUsIDB4MkUsIDB4Q0QsIDB4NzYsCi0gIDB4OTYsIDB4NEYsIDB4MTQsIDB4REMsIDB4NjgsIDB4QzEsIDB4MTAsIDB4OUYsIDB4REYsIDB4RUIsIDB4NUEsIDB4QkEsIDB4OEQsCi0gIDB4OTEsIDB4NEUsIDB4NzYsIDB4RTksIDB4M0EsIDB4NDMsIDB4MkQsIDB4ODgsIDB4RDIsIDB4ODEsIDB4MEMsIDB4RUMsIDB4NkYsCi0gIDB4QjcsIDB4QTQsIDB4OEIsIDB4OTcsIDB4NEYsIDB4QzQsIDB4MUUsIDB4RjMsIDB4MEYsIDB4RjUsIDB4NjYsIDB4NjYsIDB4QkYsCi0gIDB4NkMsIDB4M0YsIDB4RkIsIDB4NkUsIDB4MkIsIDB4NDgsIDB4NkMsIDB4N0IsIDB4RDEsIDB4MkUsIDB4NjQsIDB4RDEsIDB4MEIsCi0gIDB4NkUsIDB4NUIsIDB4MDUsIDB4MTYsIDB4REQsIDB4Q0IsIDB4MUIsIDB4REUsIDB4QTIsIDB4QjksIDB4QTgsIDB4OTQsIDB4RDYsCi0gIDB4NUEsIDB4NUIsIDB4RTIsIDB4QzksIDB4QkMsIDB4RDUsIDB4QUIsIDB4NjQsIDB4NUIsIDB4MEYsIDB4OUEsIDB4RkQsIDB4QzcsCi0gIDB4MkUsIDB4QjcsIDB4RUYsIDB4QUUsIDB4RTksIDB4MUYsIDB4MzIsIDB4RDIsIDB4Q0EsIDB4QTAsIDB4MzcsIDB4NjMsIDB4ODYsCi0gIDB4NzIsIDB4NDEsIDB4MDcsIDB4QkMsIDB4QUIsIDB4NkYsIDB4RkYsIDB4QjcsIDB4MTYsIDB4QUEsIDB4QTksIDB4NTgsIDB4OUUsCi0gIDB4NDMsIDB4OUMsIDB4MjIsIDB4OEQsIDB4NDgsIDB4Q0UsIDB4RTUsIDB4RUYsIDB4RTAsIDB4N0QsIDB4NDcsIDB4ODcsIDB4NUEsCi0gIDB4QTgsIDB4NUIsIDB4MDYsIDB4QTksIDB4NDcsIDB4RjAsIDB4MjYsIDB4QjQsIDB4OTksIDB4RDgsIDB4QTMsIDB4NjQsIDB4RUQsCi0gIDB4NzMsIDB4QjMsIDB4OTYsIDB4QjQsIDB4MjEsIDB4MTksIDB4QTUsIDB4QzEsIDB4REMsIDB4ODgsIDB4MkUsIDB4RUUsIDB4RjIsCi0gIDB4NzcsIDB4OTEsIDB4RUMsIDB4RkIsIDB4RDUsIDB4RjksIDB4RjgsIDB4OTAsIDB4NDcsIDB4QUQsIDB4RjUsIDB4RUIsIDB4OTYsCi0gIDB4NkQsIDB4RjEsIDB4MUMsIDB4RTAsIDB4REMsIDB4NzQsIDB4MUMsIDB4RTYsIDB4MkUsIDB4RTEsIDB4NzYsIDB4OUQsIDB4RUUsCi0gIDB4RjQsIDB4RUYsIDB4QTUsIDB4MzEsIDB4MDMsIDB4ODcsIDB4MEUsIDB4MkMsIDB4ODQsIDB4QTUsIDB4RjEsIDB4MjIsIDB4QkUsCi0gIDB4NDgsIDB4QTksIDB4Q0QsIDB4MDksIDB4MDcsIDB4QzEsIDB4RjAsIDB4RDQsIDB4RTcsIDB4MDMsIDB4ODIsIDB4MzksIDB4RTIsCi0gIDB4QTAsIDB4MEIsIDB4REUsIDB4QUMsIDB4MzcsIDB4QUMsIDB4NjIsIDB4OTcsIDB4OEUsIDB4NzksIDB4Q0UsIDB4NTIsIDB4MjQsCi0gIDB4NzgsIDB4RjksIDB4MTcsIDB4RDIsIDB4RjEsIDB4NUQsIDB4MkQsIDB4QTEsIDB4REYsIDB4MTIsIDB4MkMsIDB4ODMsIDB4RTUsCi0gIDB4MUEsIDB4MjgsIDB4OUEsIDB4MkQsIDB4RUQsIDB4OEEsIDB4QkYsIDB4RkMsIDB4NDEsIDB4QzMsIDB4RUIsIDB4MEUsIDB4OTEsCi0gIDB4REIsIDB4RjIsIDB4QTEsIDB4QzgsIDB4QTgsIDB4MDEsIDB4OEIsIDB4RjIsIDB4RjMsIDB4NTksIDB4QjcsIDB4QTcsIDB4NkYsCi0gIDB4ODAsIDB4RkYsIDB4MEIsIDB4NDYsIDB4RTEsIDB4NjMsIDB4QTcsIDB4NUYsIDB4NkIsIDB4QkUsIDB4MzMsIDB4NzEsIDB4QkUsCi0gIDB4M0EsIDB4QUYsIDB4QTksIDB4NTMsIDB4NUQsIDB4M0IsIDB4QjIsIDB4RjYsIDB4RUIsIDB4NDIsIDB4MUMsIDB4M0UsIDB4M0YsCi0gIDB4MUQsIDB4NkEsIDB4MzQsIDB4QUUsIDB4QjEsIDB4MDUsIDB4QTEsIDB4MzIsIDB4NkMsIDB4QjUsIDB4RTQsIDB4RDMsIDB4QkIsCi0gIDB4RTgsIDB4MTAsIDB4MTQsIDB4OUUsIDB4NjgsIDB4NkEsIDB4MjQsIDB4NTEsIDB4QTUsIDB4NjYsIDB4NjQsIDB4Q0MsIDB4QzQsCi0gIDB4MkQsIDB4OTYsIDB4QTIsIDB4QzcsIDB4MkQsIDB4MUYsIDB4MEEsIDB4MEYsIDB4NkIsIDB4RDksIDB4QUQsIDB4QTMsIDB4MTEsCi0gIDB4OEYsIDB4MDAsIDB4QUEsIDB4MDYsIDB4QzIsIDB4MUUsIDB4RjMsIDB4RTgsIDB4NUEsIDB4MzcsIDB4NEMsIDB4RDYsIDB4NEIsCi0gIDB4NkIsIDB4MDEsIDB4QzksIDB4QjAsIDB4QjYsIDB4QjksIDB4OTIsIDB4RUQsIDB4MUQsIDB4MDgsIDB4QjAsIDB4ODAsIDB4MDYsCi0gIDB4MjAsIDB4RUEsIDB4RUUsIDB4RjksIDB4MUQsIDB4QTQsIDB4NTcsIDB4NzMsIDB4MkUsIDB4MUIsIDB4QTUsIDB4QUYsIDB4RjYsCi0gIDB4QUYsIDB4QUUsIDB4MDQsIDB4N0MsIDB4NEMsIDB4N0UsIDB4QzgsIDB4REIsIDB4QzAsIDB4RkIsIDB4MzcsIDB4QzgsIDB4N0UsCi0gIDB4RkUsIDB4NDcsIDB4MEEsIDB4M0MsIDB4RkEsIDB4NjEsIDB4RTcsIDB4RUIsIDB4MUIsIDB4RjMsIDB4N0MsIDB4MzIsIDB4RTMsCi0gIDB4N0MsIDB4MzcsIDB4NjYsIDB4N0MsIDB4NTMsIDB4MDcsIDB4QzIsIDB4MzcsIDB4QTMsIDB4QkQsIDB4RjcsIDB4RkEsIDB4RTMsCi0gIDB4OEEsIDB4NzYsIDB4Q0IsIDB4NkMsIDB4QzgsIDB4MTMsIDB4QzQsIDB4NTMsIDB4NTMsIDB4REIsIDB4QUQsIDB4MzcsIDB4MUEsCi0gIDB4RUIsIDB4RTAKLX07Ci0KLVRFU1RfRihIMjY0VG9Bbm5leEJCaXRzdHJlYW1Db252ZXJ0ZXJUZXN0LCBTdWNjZXNzKSB7Ci0gIC8vIEluaXRpYWxpemUgY29udmVydGVyLgotICBzY29wZWRfYXJyYXk8dWludDg+IG91dHB1dDsKLSAgSDI2NFRvQW5uZXhCQml0c3RyZWFtQ29udmVydGVyIGNvbnZlcnRlcjsKLQotICAvLyBQYXJzZSB0aGUgaGVhZGVycy4KLSAgdWludDMyIGNvbmZpZ19zaXplID0gY29udmVydGVyLlBhcnNlQ29uZmlndXJhdGlvbkFuZENhbGN1bGF0ZVNpemUoCi0gICAgICBrSGVhZGVyRGF0YU9rV2l0aEZpZWxkTGVuNCwKLSAgICAgIHNpemVvZihrSGVhZGVyRGF0YU9rV2l0aEZpZWxkTGVuNCkpOwotICBFWFBFQ1RfR1QoY29uZmlnX3NpemUsIDBVKTsKLQotICAvLyBHbyBvbiB3aXRoIGNvbnZlcnRpbmcgdGhlIGhlYWRlcnMuCi0gIG91dHB1dC5yZXNldChuZXcgdWludDhbY29uZmlnX3NpemVdKTsKLSAgRVhQRUNUX1RSVUUob3V0cHV0LmdldCgpICE9IE5VTEwpOwotICBFWFBFQ1RfVFJVRShjb252ZXJ0ZXIuQ29udmVydEFWQ0RlY29kZXJDb25maWdUb0J5dGVTdHJlYW0oCi0gICAgICAgICAgICAgICAgICBrSGVhZGVyRGF0YU9rV2l0aEZpZWxkTGVuNCwKLSAgICAgICAgICAgICAgICAgIHNpemVvZihrSGVhZGVyRGF0YU9rV2l0aEZpZWxkTGVuNCksCi0gICAgICAgICAgICAgICAgICBvdXRwdXQuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAmY29uZmlnX3NpemUpKTsKLQotICAvLyBDYWxjdWxhdGUgYnVmZmVyIHNpemUgZm9yIGFjdHVhbCBOQUwgdW5pdC4KLSAgdWludDMyIG91dHB1dF9zaXplID0gY29udmVydGVyLkNhbGN1bGF0ZU5lZWRlZE91dHB1dEJ1ZmZlclNpemUoCi0gICAgICBrUGFja2V0RGF0YU9rV2l0aEZpZWxkTGVuNCwKLSAgICAgIHNpemVvZihrUGFja2V0RGF0YU9rV2l0aEZpZWxkTGVuNCkpOwotICBFWFBFQ1RfR1Qob3V0cHV0X3NpemUsIDBVKTsKLSAgb3V0cHV0X3NpemUgKz0gY29uZmlnX3NpemU7Ci0gIG91dHB1dC5yZXNldChuZXcgdWludDhbb3V0cHV0X3NpemVdKTsKLSAgRVhQRUNUX1RSVUUob3V0cHV0LmdldCgpICE9IE5VTEwpOwotCi0gIHVpbnQzMiBvdXRwdXRfc2l6ZV9sZWZ0X2Zvcl9uYWxfdW5pdCA9IG91dHB1dF9zaXplIC0gY29uZmlnX3NpemU7Ci0gIC8vIERvIHRoZSBjb252ZXJzaW9uIGZvciBhY3R1YWwgTkFMIHVuaXQuCi0gIEVYUEVDVF9UUlVFKGNvbnZlcnRlci5Db252ZXJ0TmFsVW5pdFN0cmVhbVRvQnl0ZVN0cmVhbSgKLSAgICAgICAgICAgICAgICAgIGtQYWNrZXREYXRhT2tXaXRoRmllbGRMZW40LAotICAgICAgICAgICAgICAgICAgc2l6ZW9mKGtQYWNrZXREYXRhT2tXaXRoRmllbGRMZW40KSwKLSAgICAgICAgICAgICAgICAgIG91dHB1dC5nZXQoKSArIGNvbmZpZ19zaXplLAotICAgICAgICAgICAgICAgICAgJm91dHB1dF9zaXplX2xlZnRfZm9yX25hbF91bml0KSk7Ci0KLSAgLy8gQ2xhc3NlcyBhbGxvY2F0ZWQgaW4gc3RhY2sgYXJlIGF1dG9tYXRpY2FsbHkgZGVzdHJveWVkLgotfQotCi1URVNUX0YoSDI2NFRvQW5uZXhCQml0c3RyZWFtQ29udmVydGVyVGVzdCwgRmFpbHVyZU51bGxEYXRhKSB7Ci0gIC8vIEluaXRpYWxpemUgY29udmVydGVyLgotICBIMjY0VG9Bbm5leEJCaXRzdHJlYW1Db252ZXJ0ZXIgY29udmVydGVyOwotCi0gIC8vIFNpbXVsYXRlIHNpdHVhdGlvbiB3aGVyZSB0aGVyZSBpcyBubyBoZWFkZXIgZGF0YS4KLSAgdWludDMyIGNvbmZpZ19zaXplID0gY29udmVydGVyLlBhcnNlQ29uZmlndXJhdGlvbkFuZENhbGN1bGF0ZVNpemUoTlVMTCwgMCk7Ci0gIEVYUEVDVF9FUShjb25maWdfc2l6ZSwgMFUpOwotCi0gIC8vIEdvIG9uIHdpdGggY29udmVydGluZyB0aGUgaGVhZGVycyB3aXRoIE5VTEwgcGFyYW1ldGVycy4KLSAgRVhQRUNUX0ZBTFNFKGNvbnZlcnRlci5Db252ZXJ0QVZDRGVjb2RlckNvbmZpZ1RvQnl0ZVN0cmVhbShOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnX3NpemUpKTsKLQotICAvLyBTaW11bGF0ZSBOVUxMIHBhcmFtZXRlcnMgZm9yIGJ1ZmZlciBjYWxjdWxhdGlvbi4KLSAgdWludDMyIG91dHB1dF9zaXplID0gY29udmVydGVyLkNhbGN1bGF0ZU5lZWRlZE91dHB1dEJ1ZmZlclNpemUoTlVMTCwgMCk7Ci0gIEVYUEVDVF9FUShvdXRwdXRfc2l6ZSwgMFUpOwotCi0gIC8vIERvIHRoZSBjb252ZXJzaW9uIGZvciBhY3R1YWwgTkFMIHVuaXQgd2l0aCBOVUxMIHBhcmFtYXRlcnMuCi0gIEVYUEVDVF9GQUxTRShjb252ZXJ0ZXIuQ29udmVydE5hbFVuaXRTdHJlYW1Ub0J5dGVTdHJlYW0oTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dF9zaXplKSk7Ci0KLSAgLy8gQ2xhc3NlcyBhbGxvY2F0ZWQgaW4gc3RhY2sgYXJlIGF1dG9tYXRpY2FsbHkgZGVzdHJveWVkLgotfQotCi1URVNUX0YoSDI2NFRvQW5uZXhCQml0c3RyZWFtQ29udmVydGVyVGVzdCwgRmFpbHVyZUhlYWRlckJ1ZmZlck92ZXJmbG93KSB7Ci0gIC8vIEluaXRpYWxpemUgY29udmVydGVyCi0gIEgyNjRUb0FubmV4QkJpdHN0cmVhbUNvbnZlcnRlciBjb252ZXJ0ZXI7Ci0KLSAgLy8gU2ltdWxhdGUgMTAgc3BzIEFWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkLAotICAvLyB3aGljaCB3b3VsZCBleHRlbmQgYmV5b25kIHRoZSBidWZmZXIuCi0gIHVpbnQ4IGNvcnJ1cHRlZF9oZWFkZXJbc2l6ZW9mKGtIZWFkZXJEYXRhT2tXaXRoRmllbGRMZW40KV07Ci0gIG1lbWNweShjb3JydXB0ZWRfaGVhZGVyLCBrSGVhZGVyRGF0YU9rV2l0aEZpZWxkTGVuNCwKLSAgICAgICAgIHNpemVvZihrSGVhZGVyRGF0YU9rV2l0aEZpZWxkTGVuNCkpOwotICAvLyA2dGggYnl0ZSwgNSBMU0JzIGNvbnRhaW4gdGhlIG51bWJlciBvZiBzcHMncy4KLSAgY29ycnVwdGVkX2hlYWRlcls1XSA9IGNvcnJ1cHRlZF9oZWFkZXJbNV0gfCAweEE7Ci0KLSAgLy8gUGFyc2UgdGhlIGhlYWRlcnMKLSAgdWludDMyIGNvbmZpZ19zaXplID0gY29udmVydGVyLlBhcnNlQ29uZmlndXJhdGlvbkFuZENhbGN1bGF0ZVNpemUoCi0gICAgICBjb3JydXB0ZWRfaGVhZGVyLAotICAgICAgc2l6ZW9mKGNvcnJ1cHRlZF9oZWFkZXIpKTsKLSAgRVhQRUNUX0VRKGNvbmZpZ19zaXplLCAwVSk7ICAvLyBGYWlsdXJlIGFzIGEgcmVzdWx0IG9mIGJ1ZmZlciBvdmVyZmxvd3MuCi0KLSAgLy8gQ2xhc3NlcyBhbGxvY2F0ZWQgaW4gc3RhY2sgYXJlIGF1dG9tYXRpY2FsbHkgZGVzdHJveWVkLgotfQotCi1URVNUX0YoSDI2NFRvQW5uZXhCQml0c3RyZWFtQ29udmVydGVyVGVzdCwgRmFpbHVyZU5hbFVuaXRCcmVha2FnZSkgewotICAvLyBJbml0aWFsaXplIGNvbnZlcnRlci4KLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiBvdXRwdXQ7Ci0gIEgyNjRUb0FubmV4QkJpdHN0cmVhbUNvbnZlcnRlciBjb252ZXJ0ZXI7Ci0KLSAgLy8gUGFyc2UgdGhlIGhlYWRlcnMuCi0gIHVpbnQzMiBjb25maWdfc2l6ZSA9IGNvbnZlcnRlci5QYXJzZUNvbmZpZ3VyYXRpb25BbmRDYWxjdWxhdGVTaXplKAotICAgICAga0hlYWRlckRhdGFPa1dpdGhGaWVsZExlbjQsCi0gICAgICBzaXplb2Yoa0hlYWRlckRhdGFPa1dpdGhGaWVsZExlbjQpKTsKLSAgRVhQRUNUX0dUKGNvbmZpZ19zaXplLCAwVSk7Ci0KLSAgLy8gR28gb24gd2l0aCBjb252ZXJ0aW5nIHRoZSBoZWFkZXJzLgotICBvdXRwdXQucmVzZXQobmV3IHVpbnQ4W2NvbmZpZ19zaXplXSk7Ci0gIEVYUEVDVF9UUlVFKG91dHB1dC5nZXQoKSAhPSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUoY29udmVydGVyLkNvbnZlcnRBVkNEZWNvZGVyQ29uZmlnVG9CeXRlU3RyZWFtKAotICAgICAgICAgICAgICAgICAga0hlYWRlckRhdGFPa1dpdGhGaWVsZExlbjQsCi0gICAgICAgICAgICAgICAgICBzaXplb2Yoa0hlYWRlckRhdGFPa1dpdGhGaWVsZExlbjQpLAotICAgICAgICAgICAgICAgICAgb3V0cHV0LmdldCgpLAotICAgICAgICAgICAgICAgICAgJmNvbmZpZ19zaXplKSk7Ci0KLSAgLy8gU2ltdWxhdGUgTkFMIHVuaXQgYnJva2VuIGluIG1pZGRsZSBieSB3cml0aW5nIG9ubHkgc29tZSBvZiB0aGUgZGF0YS4KLSAgdWludDggY29ycnVwdGVkX25hbF91bml0W3NpemVvZihrUGFja2V0RGF0YU9rV2l0aEZpZWxkTGVuNCkgLSAxMDBdOwotICBtZW1jcHkoY29ycnVwdGVkX25hbF91bml0LCBrUGFja2V0RGF0YU9rV2l0aEZpZWxkTGVuNCwKLSAgICAgICAgIHNpemVvZihrUGFja2V0RGF0YU9rV2l0aEZpZWxkTGVuNCkgLSAxMDApOwotCi0gIC8vIENhbGN1bGF0ZSBidWZmZXIgc2l6ZSBmb3IgYWN0dWFsIE5BTCB1bml0LCBzaG91bGQgcmV0dXJuIDAgYmVjYXVzZSBvZgotICAvLyBpbmNvbXBsZXRlIGlucHV0IGJ1ZmZlci4KLSAgdWludDMyIG91dHB1dF9zaXplID0gY29udmVydGVyLkNhbGN1bGF0ZU5lZWRlZE91dHB1dEJ1ZmZlclNpemUoCi0gICAgICBjb3JydXB0ZWRfbmFsX3VuaXQsCi0gICAgICBzaXplb2YoY29ycnVwdGVkX25hbF91bml0KSk7Ci0gIEVYUEVDVF9FUShvdXRwdXRfc2l6ZSwgMFUpOwotCi0gIC8vIElnbm9yZSB0aGUgZXJyb3IgYW5kIHRyeSB0byBnbyBvbiB3aXRoIGNvbnZlcnNpb24gc2ltdWxhdGluZyB3cm9uZyB1c2FnZS4KLSAgb3V0cHV0X3NpemUgPSBzaXplb2Yoa1BhY2tldERhdGFPa1dpdGhGaWVsZExlbjQpICsgY29uZmlnX3NpemU7Ci0gIG91dHB1dC5yZXNldChuZXcgdWludDhbb3V0cHV0X3NpemVdKTsKLSAgRVhQRUNUX1RSVUUob3V0cHV0LmdldCgpICE9IE5VTEwpOwotCi0gIHVpbnQzMiBvdXRwdXRfc2l6ZV9sZWZ0X2Zvcl9uYWxfdW5pdCA9IG91dHB1dF9zaXplIC0gY29uZmlnX3NpemU7Ci0gIC8vIERvIHRoZSBjb252ZXJzaW9uIGZvciBhY3R1YWwgTkFMIHVuaXQsIGV4cGVjdGluZyBmYWlsdXJlLgotICBFWFBFQ1RfRkFMU0UoY29udmVydGVyLkNvbnZlcnROYWxVbml0U3RyZWFtVG9CeXRlU3RyZWFtKAotICAgICAgICAgICAgICAgICAgIGNvcnJ1cHRlZF9uYWxfdW5pdCwKLSAgICAgICAgICAgICAgICAgICBzaXplb2YoY29ycnVwdGVkX25hbF91bml0KSwKLSAgICAgICAgICAgICAgICAgICBvdXRwdXQuZ2V0KCkgKyBjb25maWdfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAmb3V0cHV0X3NpemVfbGVmdF9mb3JfbmFsX3VuaXQpKTsKLSAgRVhQRUNUX0VRKG91dHB1dF9zaXplX2xlZnRfZm9yX25hbF91bml0LCAwVSk7Ci0KLSAgLy8gQ2xhc3NlcyBhbGxvY2F0ZWQgaW4gc3RhY2sgYXJlIGF1dG9tYXRpY2FsbHkgZGVzdHJveWVkLgotfQotCi1URVNUX0YoSDI2NFRvQW5uZXhCQml0c3RyZWFtQ29udmVydGVyVGVzdCwgRmFpbHVyZVRvb1NtYWxsT3V0cHV0QnVmZmVyKSB7Ci0gIC8vIEluaXRpYWxpemUgY29udmVydGVyLgotICBzY29wZWRfYXJyYXk8dWludDg+IG91dHB1dDsKLSAgSDI2NFRvQW5uZXhCQml0c3RyZWFtQ29udmVydGVyIGNvbnZlcnRlcjsKLQotICAvLyBQYXJzZSB0aGUgaGVhZGVycy4KLSAgdWludDMyIGNvbmZpZ19zaXplID0gY29udmVydGVyLlBhcnNlQ29uZmlndXJhdGlvbkFuZENhbGN1bGF0ZVNpemUoCi0gICAgICBrSGVhZGVyRGF0YU9rV2l0aEZpZWxkTGVuNCwKLSAgICAgIHNpemVvZihrSGVhZGVyRGF0YU9rV2l0aEZpZWxkTGVuNCkpOwotICBFWFBFQ1RfR1QoY29uZmlnX3NpemUsIDBVKTsKLSAgdWludDMyIHJlYWxfY29uZmlnX3NpemUgPSBjb25maWdfc2l6ZTsKLQotICAvLyBHbyBvbiB3aXRoIGNvbnZlcnRpbmcgdGhlIGhlYWRlcnMgd2l0aCB0b28gc21hbGwgYnVmZmVyLgotICBjb25maWdfc2l6ZSAtPSAxMDsKLSAgb3V0cHV0LnJlc2V0KG5ldyB1aW50OFtjb25maWdfc2l6ZV0pOwotICBFWFBFQ1RfVFJVRShvdXRwdXQuZ2V0KCkgIT0gTlVMTCk7Ci0gIEVYUEVDVF9GQUxTRShjb252ZXJ0ZXIuQ29udmVydEFWQ0RlY29kZXJDb25maWdUb0J5dGVTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAga0hlYWRlckRhdGFPa1dpdGhGaWVsZExlbjQsCi0gICAgICAgICAgICAgICAgICAgc2l6ZW9mKGtIZWFkZXJEYXRhT2tXaXRoRmllbGRMZW40KSwKLSAgICAgICAgICAgICAgICAgICBvdXRwdXQuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgJmNvbmZpZ19zaXplKSk7Ci0gIEVYUEVDVF9FUShjb25maWdfc2l6ZSwgMFUpOwotCi0gIC8vIFN0aWxsIHRvbyBzbWFsbCAoYnV0IG9ubHkgMSBieXRlIHNob3J0KS4KLSAgY29uZmlnX3NpemUgPSByZWFsX2NvbmZpZ19zaXplIC0gMTsKLSAgb3V0cHV0LnJlc2V0KG5ldyB1aW50OFtjb25maWdfc2l6ZV0pOwotICBFWFBFQ1RfVFJVRShvdXRwdXQuZ2V0KCkgIT0gTlVMTCk7Ci0gIEVYUEVDVF9GQUxTRShjb252ZXJ0ZXIuQ29udmVydEFWQ0RlY29kZXJDb25maWdUb0J5dGVTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAga0hlYWRlckRhdGFPa1dpdGhGaWVsZExlbjQsCi0gICAgICAgICAgICAgICAgICAgc2l6ZW9mKGtIZWFkZXJEYXRhT2tXaXRoRmllbGRMZW40KSwKLSAgICAgICAgICAgICAgICAgICBvdXRwdXQuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgJmNvbmZpZ19zaXplKSk7Ci0gIEVYUEVDVF9FUShjb25maWdfc2l6ZSwgMFUpOwotCi0gIC8vIEZpbmFsbHksIHJldHJ5IHdpdGggdmFsaWQgYnVmZmVyLgotICBjb25maWdfc2l6ZSA9IHJlYWxfY29uZmlnX3NpemU7Ci0gIG91dHB1dC5yZXNldChuZXcgdWludDhbY29uZmlnX3NpemVdKTsKLSAgRVhQRUNUX1RSVUUob3V0cHV0LmdldCgpICE9IE5VTEwpOwotICBFWFBFQ1RfVFJVRShjb252ZXJ0ZXIuQ29udmVydEFWQ0RlY29kZXJDb25maWdUb0J5dGVTdHJlYW0oCi0gICAgICAgICAgICAgICAgICBrSGVhZGVyRGF0YU9rV2l0aEZpZWxkTGVuNCwKLSAgICAgICAgICAgICAgICAgIHNpemVvZihrSGVhZGVyRGF0YU9rV2l0aEZpZWxkTGVuNCksCi0gICAgICAgICAgICAgICAgICBvdXRwdXQuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAmY29uZmlnX3NpemUpKTsKLQotICAvLyBDYWxjdWxhdGUgYnVmZmVyIHNpemUgZm9yIGFjdHVhbCBOQUwgdW5pdC4KLSAgdWludDMyIG91dHB1dF9zaXplID0gY29udmVydGVyLkNhbGN1bGF0ZU5lZWRlZE91dHB1dEJ1ZmZlclNpemUoCi0gICAgICBrUGFja2V0RGF0YU9rV2l0aEZpZWxkTGVuNCwKLSAgICAgIHNpemVvZihrUGFja2V0RGF0YU9rV2l0aEZpZWxkTGVuNCkpOwotICBFWFBFQ1RfR1Qob3V0cHV0X3NpemUsIDBVKTsKLSAgb3V0cHV0X3NpemUgKz0gY29uZmlnX3NpemU7Ci0gIC8vIFNpbXVsYXRlIHRvbyBzbWFsbCBvdXRwdXQgYnVmZmVyLgotICBvdXRwdXRfc2l6ZSAtPSAxOwotICBvdXRwdXQucmVzZXQobmV3IHVpbnQ4W291dHB1dF9zaXplXSk7Ci0gIEVYUEVDVF9UUlVFKG91dHB1dC5nZXQoKSAhPSBOVUxMKTsKLQotICB1aW50MzIgb3V0cHV0X3NpemVfbGVmdF9mb3JfbmFsX3VuaXQgPSBvdXRwdXRfc2l6ZSAtIGNvbmZpZ19zaXplOwotICAvLyBEbyB0aGUgY29udmVyc2lvbiBmb3IgYWN0dWFsIE5BTCB1bml0IChleHBlY3QgZmFpbHVyZSkuCi0gIEVYUEVDVF9GQUxTRShjb252ZXJ0ZXIuQ29udmVydE5hbFVuaXRTdHJlYW1Ub0J5dGVTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAga1BhY2tldERhdGFPa1dpdGhGaWVsZExlbjQsCi0gICAgICAgICAgICAgICAgICAgc2l6ZW9mKGtQYWNrZXREYXRhT2tXaXRoRmllbGRMZW40KSwKLSAgICAgICAgICAgICAgICAgICBvdXRwdXQuZ2V0KCkgKyBjb25maWdfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAmb3V0cHV0X3NpemVfbGVmdF9mb3JfbmFsX3VuaXQpKTsKLSAgRVhQRUNUX0VRKG91dHB1dF9zaXplX2xlZnRfZm9yX25hbF91bml0LCAwVSk7Ci0KLSAgLy8gQ2xhc3NlcyBhbGxvY2F0ZWQgaW4gc3RhY2sgYXJlIGF1dG9tYXRpY2FsbHkgZGVzdHJveWVkLgotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL2luX21lbW9yeV91cmxfcHJvdG9jb2wuY2MgYi9zcmMvbWVkaWEvZmlsdGVycy9pbl9tZW1vcnlfdXJsX3Byb3RvY29sLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTU0MzhjLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL2luX21lbW9yeV91cmxfcHJvdG9jb2wuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9pbl9tZW1vcnlfdXJsX3Byb3RvY29sLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLUluTWVtb3J5VXJsUHJvdG9jb2w6OkluTWVtb3J5VXJsUHJvdG9jb2woY29uc3QgdWludDgqIGRhdGEsIGludDY0IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nKQotICAgIDogZGF0YV8oZGF0YSksCi0gICAgICBzaXplXyhzaXplID49IDAgPyBzaXplIDogMCksCi0gICAgICBwb3NpdGlvbl8oMCksCi0gICAgICBzdHJlYW1pbmdfKHN0cmVhbWluZykgewotfQotCi1Jbk1lbW9yeVVybFByb3RvY29sOjp+SW5NZW1vcnlVcmxQcm90b2NvbCgpIHt9Ci0KLWludCBJbk1lbW9yeVVybFByb3RvY29sOjpSZWFkKGludCBzaXplLCB1aW50OCogZGF0YSkgewotICBpbnQgYXZhaWxhYmxlX2J5dGVzID0gc2l6ZV8gLSBwb3NpdGlvbl87Ci0gIGlmIChzaXplID4gYXZhaWxhYmxlX2J5dGVzKQotICAgIHNpemUgPSBhdmFpbGFibGVfYnl0ZXM7Ci0KLSAgbWVtY3B5KGRhdGEsIGRhdGFfICsgcG9zaXRpb25fLCBzaXplKTsKLSAgcG9zaXRpb25fICs9IHNpemU7Ci0gIHJldHVybiBzaXplOwotfQotCi1ib29sIEluTWVtb3J5VXJsUHJvdG9jb2w6OkdldFBvc2l0aW9uKGludDY0KiBwb3NpdGlvbl9vdXQpIHsKLSAgaWYgKCFwb3NpdGlvbl9vdXQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gICpwb3NpdGlvbl9vdXQgPSBwb3NpdGlvbl87Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEluTWVtb3J5VXJsUHJvdG9jb2w6OlNldFBvc2l0aW9uKGludDY0IHBvc2l0aW9uKSB7Ci0gIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gc2l6ZV8pCi0gICAgcmV0dXJuIGZhbHNlOwotICBwb3NpdGlvbl8gPSBwb3NpdGlvbjsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgSW5NZW1vcnlVcmxQcm90b2NvbDo6R2V0U2l6ZShpbnQ2NCogc2l6ZV9vdXQpIHsKLSAgaWYgKCFzaXplX291dCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgKnNpemVfb3V0ID0gc2l6ZV87Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEluTWVtb3J5VXJsUHJvdG9jb2w6OklzU3RyZWFtaW5nKCkgewotICByZXR1cm4gc3RyZWFtaW5nXzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9pbl9tZW1vcnlfdXJsX3Byb3RvY29sLmggYi9zcmMvbWVkaWEvZmlsdGVycy9pbl9tZW1vcnlfdXJsX3Byb3RvY29sLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMzIzYzEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvaW5fbWVtb3J5X3VybF9wcm90b2NvbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDExIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9GSUxURVJTX0lOX01FTU9SWV9VUkxfUFJPVE9DT0xfSF8KLSNkZWZpbmUgTUVESUFfRklMVEVSU19JTl9NRU1PUllfVVJMX1BST1RPQ09MX0hfCi0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9mZm1wZWdfZ2x1ZS5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBTaW1wbGUgRkZtcGVnVVJMUHJvdG9jb2wgdGhhdCByZWFkcyBmcm9tIGEgYnVmZmVyLgotLy8gTk9URTogVGhpcyBvYmplY3QgZG9lcyBub3QgY29weSB0aGUgYnVmZmVyIHNvIHRoZQotLy8gICAgICAgYnVmZmVyIHBvaW50ZXIgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yCi0vLyAgICAgICBuZWVkcyB0byByZW1haW4gdmFsaWQgZm9yIHRoZSBlbnRpcmUgbGlmZXRpbWUgb2YKLS8vICAgICAgIHRoaXMgb2JqZWN0LgotY2xhc3MgTUVESUFfRVhQT1JUIEluTWVtb3J5VXJsUHJvdG9jb2wgOiBwdWJsaWMgRkZtcGVnVVJMUHJvdG9jb2wgewotIHB1YmxpYzoKLSAgSW5NZW1vcnlVcmxQcm90b2NvbChjb25zdCB1aW50OCogYnVmLCBpbnQ2NCBzaXplLCBib29sIHN0cmVhbWluZyk7Ci0gIHZpcnR1YWwgfkluTWVtb3J5VXJsUHJvdG9jb2woKTsKLQotICAvLyBGRm1wZWdVUkxQcm90b2NvbCBtZXRob2RzLgotICB2aXJ0dWFsIGludCBSZWFkKGludCBzaXplLCB1aW50OCogZGF0YSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgYm9vbCBHZXRQb3NpdGlvbihpbnQ2NCogcG9zaXRpb25fb3V0KSBPVkVSUklERTsKLSAgdmlydHVhbCBib29sIFNldFBvc2l0aW9uKGludDY0IHBvc2l0aW9uKSBPVkVSUklERTsKLSAgdmlydHVhbCBib29sIEdldFNpemUoaW50NjQqIHNpemVfb3V0KSBPVkVSUklERTsKLSAgdmlydHVhbCBib29sIElzU3RyZWFtaW5nKCkgT1ZFUlJJREU7Ci0KLSBwcml2YXRlOgotICBjb25zdCB1aW50OCogZGF0YV87Ci0gIGludDY0IHNpemVfOwotICBpbnQ2NCBwb3NpdGlvbl87Ci0gIGJvb2wgc3RyZWFtaW5nXzsKLQotICBESVNBTExPV19JTVBMSUNJVF9DT05TVFJVQ1RPUlMoSW5NZW1vcnlVcmxQcm90b2NvbCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9GSUxURVJTX0lOX01FTU9SWV9VUkxfUFJPVE9DT0xfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL29wdXNfYXVkaW9fZGVjb2Rlci5jYyBiL3NyYy9tZWRpYS9maWx0ZXJzL29wdXNfYXVkaW9fZGVjb2Rlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgzN2QyYy4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9vcHVzX2F1ZGlvX2RlY29kZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NjEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvb3B1c19hdWRpb19kZWNvZGVyLmgiCi0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJiYXNlL2xvY2F0aW9uLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3BfcHJveHkuaCIKLSNpbmNsdWRlICJiYXNlL3N5c19ieXRlb3JkZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb190aW1lc3RhbXBfaGVscGVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kYXRhX2J1ZmZlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlbXV4ZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3BpcGVsaW5lLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvb3B1cy9zcmMvaW5jbHVkZS9vcHVzLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvb3B1cy9zcmMvaW5jbHVkZS9vcHVzX211bHRpc3RyZWFtLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLXN0YXRpYyB1aW50MTYgUmVhZExFMTYoY29uc3QgdWludDgqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsIGludCByZWFkX29mZnNldCkgewotICBEQ0hFQ0soZGF0YSk7Ci0gIHVpbnQxNiB2YWx1ZSA9IDA7Ci0gIERDSEVDS19MRShyZWFkX29mZnNldCArIHNpemVvZih2YWx1ZSksIGRhdGFfc2l6ZSk7Ci0gIG1lbWNweSgmdmFsdWUsIGRhdGEgKyByZWFkX29mZnNldCwgc2l6ZW9mKHZhbHVlKSk7Ci0gIHJldHVybiBiYXNlOjpCeXRlU3dhcFRvTEUxNih2YWx1ZSk7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGVjb2RlIHJlc3VsdCB3YXMgZW5kIG9mIHN0cmVhbS4KLXN0YXRpYyBpbmxpbmUgYm9vbCBJc0VuZE9mU3RyZWFtKGludCBkZWNvZGVkX3NpemUsIEJ1ZmZlciogaW5wdXQpIHsKLSAgLy8gVHdvIGNvbmRpdGlvbnMgdG8gbWVldCB0byBkZWNsYXJlIGVuZCBvZiBzdHJlYW0gZm9yIHRoaXMgZGVjb2RlcjoKLSAgLy8gMS4gT3B1cyBkaWRuJ3Qgb3V0cHV0IGFueXRoaW5nLgotICAvLyAyLiBBbiBlbmQgb2Ygc3RyZWFtIGJ1ZmZlciBpcyByZWNlaXZlZC4KLSAgcmV0dXJuIGRlY29kZWRfc2l6ZSA9PSAwICYmIGlucHV0LT5Jc0VuZE9mU3RyZWFtKCk7Ci19Ci0KLS8vIFRoZSBPcHVzIHNwZWNpZmljYXRpb24gaXMgcGFydCBvZiBJRVRGIFJGQyA2NzE2OgotLy8gaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjcxNgotCi0vLyBPcHVzIHVzZXMgVm9yYmlzIGNoYW5uZWwgbWFwcGluZywgYW5kIFZvcmJpcyBjaGFubmVsIG1hcHBpbmcgc3BlY2lmaWVzCi0vLyBtYXBwaW5ncyBmb3IgdXAgdG8gOCBjaGFubmVscy4gU2VlIHNlY3Rpb24gNC4zLjkgb2YgdGhlIHZvcmJpcwotLy8gc3BlY2lmaWNhdGlvbjoKLS8vIGh0dHA6Ly93d3cueGlwaC5vcmcvdm9yYmlzL2RvYy9Wb3JiaXNfSV9zcGVjLmh0bWwKLXN0YXRpYyBjb25zdCBpbnQga01heFZvcmJpc0NoYW5uZWxzID0gODsKLQotLy8gT3B1cyBhbGxvd3MgZm9yIGRlY29kZSBvZiBTMTYgb3IgZmxvYXQgc2FtcGxlcy4gT3B1c0F1ZGlvRGVjb2RlciBhbHdheXMgdXNlcwotLy8gUzE2IHNhbXBsZXMuCi1zdGF0aWMgY29uc3QgaW50IGtCaXRzUGVyQ2hhbm5lbCA9IDE2Owotc3RhdGljIGNvbnN0IGludCBrQnl0ZXNQZXJDaGFubmVsID0ga0JpdHNQZXJDaGFubmVsIC8gODsKLQotLy8gTWF4aW11bSBwYWNrZXQgc2l6ZSB1c2VkIGluIFhpcGgncyBvcHVzZGVjIGFuZCBGRm1wZWcncyBsaWJvcHVzZGVjLgotc3RhdGljIGNvbnN0IGludCBrTWF4T3B1c091dHB1dFBhY2tldFNpemVTYW1wbGVzID0gOTYwICogNjsKLXN0YXRpYyBjb25zdCBpbnQga01heE9wdXNPdXRwdXRQYWNrZXRTaXplQnl0ZXMgPQotICAgIGtNYXhPcHVzT3V0cHV0UGFja2V0U2l6ZVNhbXBsZXMgKiBrQnl0ZXNQZXJDaGFubmVsOwotCi1zdGF0aWMgdm9pZCBSZW1hcE9wdXNDaGFubmVsTGF5b3V0KGNvbnN0IHVpbnQ4KiBvcHVzX21hcHBpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBjaGFubmVsX2xheW91dCkgewotICBEQ0hFQ0tfTEUobnVtX2NoYW5uZWxzLCBrTWF4Vm9yYmlzQ2hhbm5lbHMpOwotCi0gIC8vIE9wdXMgdXNlcyBWb3JiaXMgY2hhbm5lbCBsYXlvdXQuCi0gIGNvbnN0IGludDMyIG51bV9sYXlvdXRzID0ga01heFZvcmJpc0NoYW5uZWxzOwotICBjb25zdCBpbnQzMiBudW1fbGF5b3V0X3ZhbHVlcyA9IGtNYXhWb3JiaXNDaGFubmVsczsKLSAgY29uc3QgdWludDgga1ZvcmJpc0NoYW5uZWxMYXlvdXRzW251bV9sYXlvdXRzXVtudW1fbGF5b3V0X3ZhbHVlc10gPSB7Ci0gICAgeyAwIH0sCi0gICAgeyAwLCAxIH0sCi0gICAgeyAwLCAyLCAxIH0sCi0gICAgeyAwLCAxLCAyLCAzIH0sCi0gICAgeyAwLCAyLCAxLCAzLCA0IH0sCi0gICAgeyAwLCAyLCAxLCA1LCAzLCA0IH0sCi0gICAgeyAwLCAyLCAxLCA2LCA1LCAzLCA0IH0sCi0gICAgeyAwLCAyLCAxLCA3LCA1LCA2LCAzLCA0IH0sCi0gIH07Ci0KLSAgLy8gUmVvcmRlciB0aGUgY2hhbm5lbHMgdG8gcHJvZHVjZSB0aGUgc2FtZSBvcmRlcmluZyBhcyBGRm1wZWcsIHdoaWNoIGlzCi0gIC8vIHdoYXQgdGhlIHBpcGVsaW5lIGV4cGVjdHMuCi0gIGNvbnN0IHVpbnQ4KiB2b3JiaXNfbGF5b3V0X29mZnNldCA9IGtWb3JiaXNDaGFubmVsTGF5b3V0c1tudW1fY2hhbm5lbHMgLSAxXTsKLSAgZm9yIChpbnQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBudW1fY2hhbm5lbHM7ICsrY2hhbm5lbCkKLSAgICBjaGFubmVsX2xheW91dFtjaGFubmVsXSA9IG9wdXNfbWFwcGluZ1t2b3JiaXNfbGF5b3V0X29mZnNldFtjaGFubmVsXV07Ci19Ci0KLS8vIE9wdXMgSGVhZGVyIGNvbnRlbnRzOgotLy8gLSAiT3B1c0hlYWQiICg2NCBiaXRzKQotLy8gLSB2ZXJzaW9uIG51bWJlciAoOCBiaXRzKQotLy8gLSBDaGFubmVscyBDICg4IGJpdHMpCi0vLyAtIFByZS1za2lwICgxNiBiaXRzKQotLy8gLSBTYW1wbGluZyByYXRlICgzMiBiaXRzKQotLy8gLSBHYWluIGluIGRCICgxNiBiaXRzLCBTNy44KQotLy8gLSBNYXBwaW5nICg4IGJpdHMsIDA9c2luZ2xlIHN0cmVhbSAobW9uby9zdGVyZW8pIDE9Vm9yYmlzIG1hcHBpbmcsCi0vLyAgICAgICAgICAgIDIuLjI1NDogcmVzZXJ2ZWQsIDI1NTogbXVsdGlzdHJlYW0gd2l0aCBubyBtYXBwaW5nKQotLy8KLS8vIC0gaWYgKG1hcHBpbmcgIT0gMCkKLS8vICAgIC0gTiA9IHRvdGVsIG51bWJlciBvZiBzdHJlYW1zICg4IGJpdHMpCi0vLyAgICAtIE0gPSBudW1iZXIgb2YgcGFpcmVkIHN0cmVhbXMgKDggYml0cykKLS8vICAgIC0gQyB0aW1lcyBjaGFubmVsIG9yaWdpbgotLy8gICAgICAgICAtIGlmIChDPDIqTSkKLS8vICAgICAgICAgICAgLSBzdHJlYW0gPSBieXRlLzIKLS8vICAgICAgICAgICAgLSBpZiAoYnl0ZSYweDEgPT0gMCkKLS8vICAgICAgICAgICAgICAgIC0gbGVmdAotLy8gICAgICAgICAgICAgIGVsc2UKLS8vICAgICAgICAgICAgICAgIC0gcmlnaHQKLS8vICAgICAgICAgLSBlbHNlCi0vLyAgICAgICAgICAgIC0gc3RyZWFtID0gYnl0ZS1NCi0KLS8vIERlZmF1bHQgYXVkaW8gb3V0cHV0IGNoYW5uZWwgbGF5b3V0LiBVc2VkIHRvIGluaXRpYWxpemUgfHN0cmVhbV9tYXB8IGluCi0vLyBPcHVzSGVhZGVyLCBhbmQgcGFzc2VkIHRvIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jcmVhdGUoKSB3aGVuIHRoZSBoZWFkZXIKLS8vIGRvZXMgbm90IGNvbnRhaW4gbWFwcGluZyBpbmZvcm1hdGlvbi4gVGhlIHZhbHVlcyBhcmUgdmFsaWQgb25seSBmb3IgbW9ubyBhbmQKLS8vIHN0ZXJlbyBvdXRwdXQ6IE9wdXMgc3RyZWFtcyB3aXRoIG1vcmUgdGhhbiAyIGNoYW5uZWxzIHJlcXVpcmUgYSBzdHJlYW0gbWFwLgotc3RhdGljIGNvbnN0IGludCBrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dCA9IDI7Ci1zdGF0aWMgY29uc3QgdWludDgga0RlZmF1bHRPcHVzQ2hhbm5lbExheW91dFtrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dF0gPSB7Ci0gICAgMCwgMSB9OwotCi0vLyBTaXplIG9mIHRoZSBPcHVzIGhlYWRlciBleGNsdWRpbmcgb3B0aW9uYWwgbWFwcGluZyBpbmZvcm1hdGlvbi4KLXN0YXRpYyBjb25zdCBpbnQga09wdXNIZWFkZXJTaXplID0gMTk7Ci0KLS8vIE9mZnNldCB0byB0aGUgY2hhbm5lbCBjb3VudCBieXRlIGluIHRoZSBPcHVzIGhlYWRlci4KLXN0YXRpYyBjb25zdCBpbnQga09wdXNIZWFkZXJDaGFubmVsc09mZnNldCA9IDk7Ci0KLS8vIE9mZnNldCB0byB0aGUgcHJlLXNraXAgdmFsdWUgaW4gdGhlIE9wdXMgaGVhZGVyLgotc3RhdGljIGNvbnN0IGludCBrT3B1c0hlYWRlclNraXBTYW1wbGVzT2Zmc2V0ID0gMTA7Ci0KLS8vIE9mZnNldCB0byB0aGUgY2hhbm5lbCBtYXBwaW5nIGJ5dGUgaW4gdGhlIE9wdXMgaGVhZGVyLgotc3RhdGljIGNvbnN0IGludCBrT3B1c0hlYWRlckNoYW5uZWxNYXBwaW5nT2Zmc2V0ID0gMTg7Ci0KLS8vIEhlYWRlciBjb250YWlucyBhIHN0cmVhbSBtYXAuIFRoZSBtYXBwaW5nIHZhbHVlcyBhcmUgaW4gZXh0cmEgZGF0YSBiZXlvbmQKLS8vIHRoZSBhbHdheXMgcHJlc2VudCB8a09wdXNIZWFkZXJTaXplfCBieXRlcyBvZiBkYXRhLiBUaGUgbWFwcGluZyBkYXRhCi0vLyBjb250YWlucyBzdHJlYW0gY291bnQsIGNvdXBsaW5nIGluZm9ybWF0aW9uLCBhbmQgcGVyIGNoYW5uZWwgbWFwcGluZyB2YWx1ZXM6Ci0vLyAgIC0gQnl0ZSAwOiBOdW1iZXIgb2Ygc3RyZWFtcy4KLS8vICAgLSBCeXRlIDE6IE51bWJlciBjb3VwbGVkLgotLy8gICAtIEJ5dGUgMjogU3RhcnRpbmcgYXQgYnl0ZSAyIGFyZSB8aGVhZGVyLT5jaGFubmVsc3wgdWludDggbWFwcGluZyB2YWx1ZXMuCi1zdGF0aWMgY29uc3QgaW50IGtPcHVzSGVhZGVyTnVtU3RyZWFtc09mZnNldCA9IGtPcHVzSGVhZGVyU2l6ZTsKLXN0YXRpYyBjb25zdCBpbnQga09wdXNIZWFkZXJOdW1Db3VwbGVkT2Zmc2V0ID0ga09wdXNIZWFkZXJOdW1TdHJlYW1zT2Zmc2V0ICsgMTsKLXN0YXRpYyBjb25zdCBpbnQga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgPSBrT3B1c0hlYWRlck51bVN0cmVhbXNPZmZzZXQgKyAyOwotCi1zdHJ1Y3QgT3B1c0hlYWRlciB7Ci0gIE9wdXNIZWFkZXIoKQotICAgICAgOiBjaGFubmVscygwKSwKLSAgICAgICAgc2tpcF9zYW1wbGVzKDApLAotICAgICAgICBjaGFubmVsX21hcHBpbmcoMCksCi0gICAgICAgIG51bV9zdHJlYW1zKDApLAotICAgICAgICBudW1fY291cGxlZCgwKSB7Ci0gICAgbWVtY3B5KHN0cmVhbV9tYXAsCi0gICAgICAgICAgIGtEZWZhdWx0T3B1c0NoYW5uZWxMYXlvdXQsCi0gICAgICAgICAgIGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0KTsKLSAgfQotICBpbnQgY2hhbm5lbHM7Ci0gIGludCBza2lwX3NhbXBsZXM7Ci0gIGludCBjaGFubmVsX21hcHBpbmc7Ci0gIGludCBudW1fc3RyZWFtczsKLSAgaW50IG51bV9jb3VwbGVkOwotICB1aW50OCBzdHJlYW1fbWFwW2tNYXhWb3JiaXNDaGFubmVsc107Ci19OwotCi0vLyBSZXR1cm5zIHRydWUgd2hlbiBhYmxlIHRvIHN1Y2Nlc3NmdWxseSBwYXJzZSBhbmQgc3RvcmUgT3B1cyBoZWFkZXIgZGF0YSBpbgotLy8gZGF0YSBwYXJzZWQgaW4gfGhlYWRlcnwuIEJhc2VkIG9uIG9wdXMgaGVhZGVyIHBhcnNpbmcgY29kZSBpbiBsaWJvcHVzZGVjCi0vLyBmcm9tIEZGbXBlZywgYW5kIG9wdXNfaGVhZGVyIGZyb20gWGlwaCdzIG9wdXMtdG9vbHMgcHJvamVjdC4KLXN0YXRpYyB2b2lkIFBhcnNlT3B1c0hlYWRlcihjb25zdCB1aW50OCogZGF0YSwgaW50IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RlY29kZXJDb25maWcmIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHVzSGVhZGVyKiBoZWFkZXIpIHsKLSAgQ0hFQ0tfR0UoZGF0YV9zaXplLCBrT3B1c0hlYWRlclNpemUpOwotCi0gIGhlYWRlci0+Y2hhbm5lbHMgPSAqKGRhdGEgKyBrT3B1c0hlYWRlckNoYW5uZWxzT2Zmc2V0KTsKLQotICBDSEVDSyhoZWFkZXItPmNoYW5uZWxzID4gMCAmJiBoZWFkZXItPmNoYW5uZWxzIDw9IGtNYXhWb3JiaXNDaGFubmVscykKLSAgICAgIDw8ICJpbnZhbGlkIGNoYW5uZWwgY291bnQgaW4gaGVhZGVyOiAiIDw8IGhlYWRlci0+Y2hhbm5lbHM7Ci0KLSAgaGVhZGVyLT5za2lwX3NhbXBsZXMgPQotICAgICAgUmVhZExFMTYoZGF0YSwgZGF0YV9zaXplLCBrT3B1c0hlYWRlclNraXBTYW1wbGVzT2Zmc2V0KTsKLQotICBoZWFkZXItPmNoYW5uZWxfbWFwcGluZyA9ICooZGF0YSArIGtPcHVzSGVhZGVyQ2hhbm5lbE1hcHBpbmdPZmZzZXQpOwotCi0gIGlmICghaGVhZGVyLT5jaGFubmVsX21hcHBpbmcpIHsKLSAgICBDSEVDS19MRShoZWFkZXItPmNoYW5uZWxzLCBrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dCkKLSAgICAgICAgPDwgIkludmFsaWQgaGVhZGVyLCBtaXNzaW5nIHN0cmVhbSBtYXAuIjsKLQotICAgIGhlYWRlci0+bnVtX3N0cmVhbXMgPSAxOwotICAgIGhlYWRlci0+bnVtX2NvdXBsZWQgPQotICAgICAgICAoQ2hhbm5lbExheW91dFRvQ2hhbm5lbENvdW50KGNvbmZpZy5jaGFubmVsX2xheW91dCgpKSA+IDEpID8gMSA6IDA7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ0hFQ0tfR0UoZGF0YV9zaXplLCBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGhlYWRlci0+Y2hhbm5lbHMpCi0gICAgICA8PCAiSW52YWxpZCBzdHJlYW0gbWFwLiI7Ci0KLSAgaGVhZGVyLT5udW1fc3RyZWFtcyA9ICooZGF0YSArIGtPcHVzSGVhZGVyTnVtU3RyZWFtc09mZnNldCk7Ci0gIGhlYWRlci0+bnVtX2NvdXBsZWQgPSAqKGRhdGEgKyBrT3B1c0hlYWRlck51bUNvdXBsZWRPZmZzZXQpOwotCi0gIGlmIChoZWFkZXItPm51bV9zdHJlYW1zICsgaGVhZGVyLT5udW1fY291cGxlZCAhPSBoZWFkZXItPmNoYW5uZWxzKQotICAgIExPRyhXQVJOSU5HKSA8PCAiSW5jb25zaXN0ZW50IGNoYW5uZWwgbWFwcGluZy4iOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwga01heFZvcmJpc0NoYW5uZWxzOyArK2kpCi0gICAgaGVhZGVyLT5zdHJlYW1fbWFwW2ldID0gKihkYXRhICsga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgKyBpKTsKLX0KLQotT3B1c0F1ZGlvRGVjb2Rlcjo6T3B1c0F1ZGlvRGVjb2RlcigKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+JiBtZXNzYWdlX2xvb3ApCi0gICAgOiBtZXNzYWdlX2xvb3BfKG1lc3NhZ2VfbG9vcCksCi0gICAgICBvcHVzX2RlY29kZXJfKE5VTEwpLAotICAgICAgYml0c19wZXJfY2hhbm5lbF8oMCksCi0gICAgICBjaGFubmVsX2xheW91dF8oQ0hBTk5FTF9MQVlPVVRfTk9ORSksCi0gICAgICBzYW1wbGVzX3Blcl9zZWNvbmRfKDApLAotICAgICAgbGFzdF9pbnB1dF90aW1lc3RhbXBfKGtOb1RpbWVzdGFtcCgpKSwKLSAgICAgIG91dHB1dF9ieXRlc190b19kcm9wXygwKSwKLSAgICAgIHNraXBfc2FtcGxlc18oMCkgewotfQotCi12b2lkIE9wdXNBdWRpb0RlY29kZXI6OkluaXRpYWxpemUoCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiYgc3RyZWFtLAotICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIHN0YXR1c19jYiwKLSAgICBjb25zdCBTdGF0aXN0aWNzQ0ImIHN0YXRpc3RpY3NfY2IpIHsKLSAgaWYgKCFtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpIHsKLSAgICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzayhGUk9NX0hFUkUsIGJhc2U6OkJpbmQoCi0gICAgICAgICZPcHVzQXVkaW9EZWNvZGVyOjpEb0luaXRpYWxpemUsIHRoaXMsCi0gICAgICAgIHN0cmVhbSwgc3RhdHVzX2NiLCBzdGF0aXN0aWNzX2NiKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIERvSW5pdGlhbGl6ZShzdHJlYW0sIHN0YXR1c19jYiwgc3RhdGlzdGljc19jYik7Ci19Ci0KLXZvaWQgT3B1c0F1ZGlvRGVjb2Rlcjo6UmVhZChjb25zdCBSZWFkQ0ImIHJlYWRfY2IpIHsKLSAgLy8gQ29tcGxldGUgb3BlcmF0aW9uIGFzeW5jaHJvbm91c2x5IG9uIGRpZmZlcmVudCBzdGFjayBvZiBleGVjdXRpb24gYXMgcGVyCi0gIC8vIHRoZSBBUEkgY29udHJhY3Qgb2YgQXVkaW9EZWNvZGVyOjpSZWFkKCkKLSAgbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soRlJPTV9IRVJFLCBiYXNlOjpCaW5kKAotICAgICAgJk9wdXNBdWRpb0RlY29kZXI6OkRvUmVhZCwgdGhpcywgcmVhZF9jYikpOwotfQotCi1pbnQgT3B1c0F1ZGlvRGVjb2Rlcjo6Yml0c19wZXJfY2hhbm5lbCgpIHsKLSAgcmV0dXJuIGJpdHNfcGVyX2NoYW5uZWxfOwotfQotCi1DaGFubmVsTGF5b3V0IE9wdXNBdWRpb0RlY29kZXI6OmNoYW5uZWxfbGF5b3V0KCkgewotICByZXR1cm4gY2hhbm5lbF9sYXlvdXRfOwotfQotCi1pbnQgT3B1c0F1ZGlvRGVjb2Rlcjo6c2FtcGxlc19wZXJfc2Vjb25kKCkgewotICByZXR1cm4gc2FtcGxlc19wZXJfc2Vjb25kXzsKLX0KLQotdm9pZCBPcHVzQXVkaW9EZWNvZGVyOjpSZXNldChjb25zdCBiYXNlOjpDbG9zdXJlJiBjbG9zdXJlKSB7Ci0gIG1lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKEZST01fSEVSRSwgYmFzZTo6QmluZCgKLSAgICAgICZPcHVzQXVkaW9EZWNvZGVyOjpEb1Jlc2V0LCB0aGlzLCBjbG9zdXJlKSk7Ci19Ci0KLU9wdXNBdWRpb0RlY29kZXI6On5PcHVzQXVkaW9EZWNvZGVyKCkgewotICAvLyBUT0RPKHNjaGVya3VzKTogc2hvdWxkIHdlIHJlcXVpcmUgU3RvcCgpIHRvIGJlIGNhbGxlZD8gdGhpcyBtaWdodCBlbmQgdXAKLSAgLy8gZ2V0dGluZyBjYWxsZWQgb24gYSByYW5kb20gdGhyZWFkIGR1ZSB0byByZWZjb3VudGluZy4KLSAgQ2xvc2VEZWNvZGVyKCk7Ci19Ci0KLXZvaWQgT3B1c0F1ZGlvRGVjb2Rlcjo6RG9Jbml0aWFsaXplKAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4mIHN0cmVhbSwKLSAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBzdGF0dXNfY2IsCi0gICAgY29uc3QgU3RhdGlzdGljc0NCJiBzdGF0aXN0aWNzX2NiKSB7Ci0gIGlmIChkZW11eGVyX3N0cmVhbV8pIHsKLSAgICAvLyBUT0RPKHNjaGVya3VzKTogaW5pdGlhbGl6YXRpb24gY3VycmVudGx5IGhhcHBlbnMgbW9yZSB0aGFuIG9uY2UgaW4KLSAgICAvLyBQaXBlbGluZUludGVncmF0aW9uVGVzdC5CYXNpY1BsYXliYWNrLgotICAgIExPRyhFUlJPUikgPDwgIkluaXRpYWxpemUgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQuIjsKLSAgICBDSEVDSyhmYWxzZSk7Ci0gIH0KLQotICBkZW11eGVyX3N0cmVhbV8gPSBzdHJlYW07Ci0KLSAgaWYgKCFDb25maWd1cmVEZWNvZGVyKCkpIHsKLSAgICBzdGF0dXNfY2IuUnVuKERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RhdGlzdGljc19jYl8gPSBzdGF0aXN0aWNzX2NiOwotICBzdGF0dXNfY2IuUnVuKFBJUEVMSU5FX09LKTsKLX0KLQotdm9pZCBPcHVzQXVkaW9EZWNvZGVyOjpEb1Jlc2V0KGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNsb3N1cmUpIHsKLSAgb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2N0bChvcHVzX2RlY29kZXJfLCBPUFVTX1JFU0VUX1NUQVRFKTsKLSAgUmVzZXRUaW1lc3RhbXBTdGF0ZSgpOwotICBjbG9zdXJlLlJ1bigpOwotfQotCi12b2lkIE9wdXNBdWRpb0RlY29kZXI6OkRvUmVhZChjb25zdCBSZWFkQ0ImIHJlYWRfY2IpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIERDSEVDSyghcmVhZF9jYi5pc19udWxsKCkpOwotICBDSEVDSyhyZWFkX2NiXy5pc19udWxsKCkpIDw8ICJPdmVybGFwcGluZyBkZWNvZGVzIGFyZSBub3Qgc3VwcG9ydGVkLiI7Ci0KLSAgcmVhZF9jYl8gPSByZWFkX2NiOwotICBSZWFkRnJvbURlbXV4ZXJTdHJlYW0oKTsKLX0KLQotdm9pZCBPcHVzQXVkaW9EZWNvZGVyOjpEb0RlY29kZUJ1ZmZlcigKLSAgICBEZW11eGVyU3RyZWFtOjpTdGF0dXMgc3RhdHVzLAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGlucHV0KSB7Ci0gIGlmICghbWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKSB7Ci0gICAgbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soRlJPTV9IRVJFLCBiYXNlOjpCaW5kKAotICAgICAgICAmT3B1c0F1ZGlvRGVjb2Rlcjo6RG9EZWNvZGVCdWZmZXIsIHRoaXMsIHN0YXR1cywgaW5wdXQpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBEQ0hFQ0soIXJlYWRfY2JfLmlzX251bGwoKSk7Ci0gIERDSEVDS19FUShzdGF0dXMgIT0gRGVtdXhlclN0cmVhbTo6a09rLCAhaW5wdXQpIDw8IHN0YXR1czsKLQotICBpZiAoc3RhdHVzID09IERlbXV4ZXJTdHJlYW06OmtBYm9ydGVkKSB7Ci0gICAgRENIRUNLKCFpbnB1dCk7Ci0gICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnJlYWRfY2JfKS5SdW4oa0Fib3J0ZWQsIE5VTEwpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzdGF0dXMgPT0gRGVtdXhlclN0cmVhbTo6a0NvbmZpZ0NoYW5nZWQpIHsKLSAgICBEQ0hFQ0soIWlucHV0KTsKLQotICAgIHNjb3BlZF9yZWZwdHI8RGF0YUJ1ZmZlcj4gb3V0cHV0X2J1ZmZlcjsKLQotICAgIC8vIFNlbmQgYSAiZW5kIG9mIHN0cmVhbSIgYnVmZmVyIHRvIHRoZSBkZWNvZGUgbG9vcAotICAgIC8vIHRvIG91dHB1dCBhbnkgcmVtYWluaW5nIGRhdGEgc3RpbGwgaW4gdGhlIGRlY29kZXIuCi0gICAgaWYgKCFEZWNvZGUoRGVjb2RlckJ1ZmZlcjo6Q3JlYXRlRU9TQnVmZmVyKCksIHRydWUsICZvdXRwdXRfYnVmZmVyKSkgewotICAgICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnJlYWRfY2JfKS5SdW4oa0RlY29kZUVycm9yLCBOVUxMKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBEVkxPRygxKSA8PCAiQ29uZmlnIGNoYW5nZWQuIjsKLQotICAgIGlmICghQ29uZmlndXJlRGVjb2RlcigpKSB7Ci0gICAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcmVhZF9jYl8pLlJ1bihrRGVjb2RlRXJyb3IsIE5VTEwpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFJlc2V0VGltZXN0YW1wU3RhdGUoKTsKLQotICAgIGlmIChvdXRwdXRfYnVmZmVyKSB7Ci0gICAgICAvLyBFeGVjdXRlIGNhbGxiYWNrIHRvIHJldHVybiB0aGUgZGVjb2RlZCBhdWRpby4KLSAgICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZyZWFkX2NiXykuUnVuKGtPaywgb3V0cHV0X2J1ZmZlcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFdlIGV4aGF1c3RlZCB0aGUgaW5wdXQgZGF0YSwgYnV0IGl0IHdhc24ndCBlbm91Z2ggZm9yIGEgZnJhbWUuICBBc2sgZm9yCi0gICAgICAvLyBtb3JlIGRhdGEgaW4gb3JkZXIgdG8gZnVsZmlsbCB0aGlzIHJlYWQuCi0gICAgICBSZWFkRnJvbURlbXV4ZXJTdHJlYW0oKTsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci0gIH0KLQotICBEQ0hFQ0tfRVEoc3RhdHVzLCBEZW11eGVyU3RyZWFtOjprT2spOwotICBEQ0hFQ0soaW5wdXQpOwotCi0gIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgbm90aWZpZWQgaWYgaHR0cDovL2NyYnVnLmNvbS80OTcwOSByZXR1cm5zLiAgSXNzdWUgYWxzbwotICAvLyBvY2N1cnMgd2l0aCBzb21lIGRhbWFnZWQgZmlsZXMuCi0gIGlmICghaW5wdXQtPklzRW5kT2ZTdHJlYW0oKSAmJiBpbnB1dC0+R2V0VGltZXN0YW1wKCkgPT0ga05vVGltZXN0YW1wKCkgJiYKLSAgICAgIG91dHB1dF90aW1lc3RhbXBfaGVscGVyXy0+YmFzZV90aW1lc3RhbXAoKSA9PSBrTm9UaW1lc3RhbXAoKSkgewotICAgIERWTE9HKDEpIDw8ICJSZWNlaXZlZCBhIGJ1ZmZlciB3aXRob3V0IHRpbWVzdGFtcHMhIjsKLSAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcmVhZF9jYl8pLlJ1bihrRGVjb2RlRXJyb3IsIE5VTEwpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICghaW5wdXQtPklzRW5kT2ZTdHJlYW0oKSkgewotICAgIGlmIChsYXN0X2lucHV0X3RpbWVzdGFtcF8gIT0ga05vVGltZXN0YW1wKCkgJiYKLSAgICAgICAgaW5wdXQtPkdldFRpbWVzdGFtcCgpICE9IGtOb1RpbWVzdGFtcCgpICYmCi0gICAgICAgIGlucHV0LT5HZXRUaW1lc3RhbXAoKSA8IGxhc3RfaW5wdXRfdGltZXN0YW1wXykgewotICAgICAgYmFzZTo6VGltZURlbHRhIGRpZmYgPSBpbnB1dC0+R2V0VGltZXN0YW1wKCkgLSBsYXN0X2lucHV0X3RpbWVzdGFtcF87Ci0gICAgICBEVkxPRygxKSA8PCAiSW5wdXQgdGltZXN0YW1wcyBhcmUgbm90IG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyEgIgotICAgICAgICAgICAgICAgPDwgIiB0cyAiIDw8IGlucHV0LT5HZXRUaW1lc3RhbXAoKS5Jbk1pY3Jvc2Vjb25kcygpIDw8ICIgdXMiCi0gICAgICAgICAgICAgICA8PCAiIGRpZmYgIiA8PCBkaWZmLkluTWljcm9zZWNvbmRzKCkgPDwgIiB1cyI7Ci0gICAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcmVhZF9jYl8pLlJ1bihrRGVjb2RlRXJyb3IsIE5VTEwpOwotICAgIH0KLQotICAgIGxhc3RfaW5wdXRfdGltZXN0YW1wXyA9IGlucHV0LT5HZXRUaW1lc3RhbXAoKTsKLSAgfQotCi0gIHNjb3BlZF9yZWZwdHI8RGF0YUJ1ZmZlcj4gb3V0cHV0X2J1ZmZlcjsKLQotICBpZiAoIURlY29kZShpbnB1dCwgZmFsc2UsICZvdXRwdXRfYnVmZmVyKSkgewotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZyZWFkX2NiXykuUnVuKGtEZWNvZGVFcnJvciwgTlVMTCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKG91dHB1dF9idWZmZXIpIHsKLSAgICAvLyBFeGVjdXRlIGNhbGxiYWNrIHRvIHJldHVybiB0aGUgZGVjb2RlZCBhdWRpby4KLSAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcmVhZF9jYl8pLlJ1bihrT2ssIG91dHB1dF9idWZmZXIpOwotICB9IGVsc2UgewotICAgIC8vIFdlIGV4aGF1c3RlZCB0aGUgaW5wdXQgZGF0YSwgYnV0IGl0IHdhc24ndCBlbm91Z2ggZm9yIGEgZnJhbWUuICBBc2sgZm9yCi0gICAgLy8gbW9yZSBkYXRhIGluIG9yZGVyIHRvIGZ1bGZpbGwgdGhpcyByZWFkLgotICAgIFJlYWRGcm9tRGVtdXhlclN0cmVhbSgpOwotICB9Ci19Ci0KLXZvaWQgT3B1c0F1ZGlvRGVjb2Rlcjo6UmVhZEZyb21EZW11eGVyU3RyZWFtKCkgewotICBEQ0hFQ0soIXJlYWRfY2JfLmlzX251bGwoKSk7Ci0KLSAgZGVtdXhlcl9zdHJlYW1fLT5SZWFkKGJhc2U6OkJpbmQoJk9wdXNBdWRpb0RlY29kZXI6OkRvRGVjb2RlQnVmZmVyLCB0aGlzKSk7Ci19Ci0KLWJvb2wgT3B1c0F1ZGlvRGVjb2Rlcjo6Q29uZmlndXJlRGVjb2RlcigpIHsKLSAgY29uc3QgQXVkaW9EZWNvZGVyQ29uZmlnJiBjb25maWcgPSBkZW11eGVyX3N0cmVhbV8tPmF1ZGlvX2RlY29kZXJfY29uZmlnKCk7Ci0KLSAgaWYgKGNvbmZpZy5jb2RlYygpICE9IGtDb2RlY09wdXMpIHsKLSAgICBETE9HKEVSUk9SKSA8PCAiQ29uZmlndXJlRGVjb2RlcigpOiBjb2RlYyBtdXN0IGJlIGtDb2RlY09wdXMuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBjb25zdCBpbnQgY2hhbm5lbF9jb3VudCA9Ci0gICAgICBDaGFubmVsTGF5b3V0VG9DaGFubmVsQ291bnQoY29uZmlnLmNoYW5uZWxfbGF5b3V0KCkpOwotICBpZiAoIWNvbmZpZy5Jc1ZhbGlkQ29uZmlnKCkgfHwgY2hhbm5lbF9jb3VudCA+IGtNYXhWb3JiaXNDaGFubmVscykgewotICAgIERMT0coRVJST1IpIDw8ICJDb25maWd1cmVEZWNvZGVyKCk6IEludmFsaWQgb3IgdW5zdXBwb3J0ZWQgYXVkaW8gc3RyZWFtIC0iCi0gICAgICAgICAgICAgICAgPDwgIiBjb2RlYzogIiA8PCBjb25maWcuY29kZWMoKQotICAgICAgICAgICAgICAgIDw8ICIgY2hhbm5lbCBjb3VudDogIiA8PCBjaGFubmVsX2NvdW50Ci0gICAgICAgICAgICAgICAgPDwgIiBjaGFubmVsIGxheW91dDogIiA8PCBjb25maWcuY2hhbm5lbF9sYXlvdXQoKQotICAgICAgICAgICAgICAgIDw8ICIgYml0cyBwZXIgY2hhbm5lbDogIiA8PCBjb25maWcuYml0c19wZXJfY2hhbm5lbCgpCi0gICAgICAgICAgICAgICAgPDwgIiBzYW1wbGVzIHBlciBzZWNvbmQ6ICIgPDwgY29uZmlnLnNhbXBsZXNfcGVyX3NlY29uZCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChjb25maWcuYml0c19wZXJfY2hhbm5lbCgpICE9IGtCaXRzUGVyQ2hhbm5lbCkgewotICAgIERMT0coRVJST1IpIDw8ICJDb25maWd1cmVEZWNvZGVyKCk6IDE2IGJpdCBzYW1wbGVzIHJlcXVpcmVkLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGNvbmZpZy5pc19lbmNyeXB0ZWQoKSkgewotICAgIERMT0coRVJST1IpIDw8ICJDb25maWd1cmVEZWNvZGVyKCk6IEVuY3J5cHRlZCBhdWRpbyBzdHJlYW0gbm90IHN1cHBvcnRlZC4iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChvcHVzX2RlY29kZXJfICYmCi0gICAgICAoYml0c19wZXJfY2hhbm5lbF8gIT0gY29uZmlnLmJpdHNfcGVyX2NoYW5uZWwoKSB8fAotICAgICAgIGNoYW5uZWxfbGF5b3V0XyAhPSBjb25maWcuY2hhbm5lbF9sYXlvdXQoKSB8fAotICAgICAgIHNhbXBsZXNfcGVyX3NlY29uZF8gIT0gY29uZmlnLnNhbXBsZXNfcGVyX3NlY29uZCgpKSkgewotICAgIERWTE9HKDEpIDw8ICJVbnN1cHBvcnRlZCBjb25maWcgY2hhbmdlIDoiOwotICAgIERWTE9HKDEpIDw8ICJcdGJpdHNfcGVyX2NoYW5uZWwgOiAiIDw8IGJpdHNfcGVyX2NoYW5uZWxfCi0gICAgICAgICAgICAgPDwgIiAtPiAiIDw8IGNvbmZpZy5iaXRzX3Blcl9jaGFubmVsKCk7Ci0gICAgRFZMT0coMSkgPDwgIlx0Y2hhbm5lbF9sYXlvdXQgOiAiIDw8IGNoYW5uZWxfbGF5b3V0XwotICAgICAgICAgICAgIDw8ICIgLT4gIiA8PCBjb25maWcuY2hhbm5lbF9sYXlvdXQoKTsKLSAgICBEVkxPRygxKSA8PCAiXHRzYW1wbGVfcmF0ZSA6ICIgPDwgc2FtcGxlc19wZXJfc2Vjb25kXwotICAgICAgICAgICAgIDw8ICIgLT4gIiA8PCBjb25maWcuc2FtcGxlc19wZXJfc2Vjb25kKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gQ2xlYW4gdXAgZXhpc3RpbmcgZGVjb2RlciBpZiBuZWNlc3NhcnkuCi0gIENsb3NlRGVjb2RlcigpOwotCi0gIC8vIEFsbG9jYXRlIHRoZSBvdXRwdXQgYnVmZmVyIGlmIG5lY2Vzc2FyeS4KLSAgaWYgKCFvdXRwdXRfYnVmZmVyXykKLSAgICBvdXRwdXRfYnVmZmVyXy5yZXNldChuZXcgaW50MTZba01heE9wdXNPdXRwdXRQYWNrZXRTaXplU2FtcGxlc10pOwotCi0gIC8vIFBhcnNlIHRoZSBPcHVzIGhlYWRlci4KLSAgT3B1c0hlYWRlciBvcHVzX2hlYWRlcjsKLSAgUGFyc2VPcHVzSGVhZGVyKGNvbmZpZy5leHRyYV9kYXRhKCksIGNvbmZpZy5leHRyYV9kYXRhX3NpemUoKSwKLSAgICAgICAgICAgICAgICAgIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICZvcHVzX2hlYWRlcik7Ci0KLSAgc2tpcF9zYW1wbGVzXyA9IG9wdXNfaGVhZGVyLnNraXBfc2FtcGxlczsKLQotICBpZiAoc2tpcF9zYW1wbGVzXyA+IDApCi0gICAgb3V0cHV0X2J5dGVzX3RvX2Ryb3BfID0gc2tpcF9zYW1wbGVzXyAqIGNvbmZpZy5ieXRlc19wZXJfZnJhbWUoKTsKLQotICB1aW50OCBjaGFubmVsX21hcHBpbmdba01heFZvcmJpc0NoYW5uZWxzXTsKLSAgbWVtY3B5KCZjaGFubmVsX21hcHBpbmcsCi0gICAgICAgICBrRGVmYXVsdE9wdXNDaGFubmVsTGF5b3V0LAotICAgICAgICAga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpOwotCi0gIGlmIChjaGFubmVsX2NvdW50ID4ga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpIHsKLSAgICBSZW1hcE9wdXNDaGFubmVsTGF5b3V0KG9wdXNfaGVhZGVyLnN0cmVhbV9tYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9tYXBwaW5nKTsKLSAgfQotCi0gIC8vIEluaXQgT3B1cy4KLSAgaW50IHN0YXR1cyA9IE9QVVNfSU5WQUxJRF9TVEFURTsKLSAgb3B1c19kZWNvZGVyXyA9IG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jcmVhdGUoY29uZmlnLnNhbXBsZXNfcGVyX3NlY29uZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHVzX2hlYWRlci5udW1fc3RyZWFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B1c19oZWFkZXIubnVtX2NvdXBsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfbWFwcGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7Ci0gIGlmICghb3B1c19kZWNvZGVyXyB8fCBzdGF0dXMgIT0gT1BVU19PSykgewotICAgIExPRyhFUlJPUikgPDwgIkNvbmZpZ3VyZURlY29kZXIoKTogb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZSBmYWlsZWQiCi0gICAgICAgICAgICAgICA8PCAiIHN0YXR1cz0iIDw8IG9wdXNfc3RyZXJyb3Ioc3RhdHVzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBUT0RPKHRvbWZpbmVnYW4pOiBIYW5kbGUgYXVkaW8gZGVsYXkgb25jZSB0aGUgbWF0cm9za2Egc3BlYyBpcyB1cGRhdGVkCi0gIC8vIHRvIHJlcHJlc2VudCB0aGUgdmFsdWUuCi0KLSAgYml0c19wZXJfY2hhbm5lbF8gPSBjb25maWcuYml0c19wZXJfY2hhbm5lbCgpOwotICBjaGFubmVsX2xheW91dF8gPSBjb25maWcuY2hhbm5lbF9sYXlvdXQoKTsKLSAgc2FtcGxlc19wZXJfc2Vjb25kXyA9IGNvbmZpZy5zYW1wbGVzX3Blcl9zZWNvbmQoKTsKLSAgb3V0cHV0X3RpbWVzdGFtcF9oZWxwZXJfLnJlc2V0KG5ldyBBdWRpb1RpbWVzdGFtcEhlbHBlcigKLSAgICAgIGNvbmZpZy5ieXRlc19wZXJfZnJhbWUoKSwgY29uZmlnLnNhbXBsZXNfcGVyX3NlY29uZCgpKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIE9wdXNBdWRpb0RlY29kZXI6OkNsb3NlRGVjb2RlcigpIHsKLSAgaWYgKG9wdXNfZGVjb2Rlcl8pIHsKLSAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfZGVzdHJveShvcHVzX2RlY29kZXJfKTsKLSAgICBvcHVzX2RlY29kZXJfID0gTlVMTDsKLSAgfQotfQotCi12b2lkIE9wdXNBdWRpb0RlY29kZXI6OlJlc2V0VGltZXN0YW1wU3RhdGUoKSB7Ci0gIG91dHB1dF90aW1lc3RhbXBfaGVscGVyXy0+U2V0QmFzZVRpbWVzdGFtcChrTm9UaW1lc3RhbXAoKSk7Ci0gIGxhc3RfaW5wdXRfdGltZXN0YW1wXyA9IGtOb1RpbWVzdGFtcCgpOwotICBvdXRwdXRfYnl0ZXNfdG9fZHJvcF8gPSAwOwotfQotCi1ib29sIE9wdXNBdWRpb0RlY29kZXI6OkRlY29kZShjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2tpcF9lb3NfYXBwZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3JlZnB0cjxEYXRhQnVmZmVyPiogb3V0cHV0X2J1ZmZlcikgewotICBpbnQgc2FtcGxlc19kZWNvZGVkID0KLSAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2RlKG9wdXNfZGVjb2Rlcl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC0+R2V0RGF0YSgpLCBpbnB1dC0+R2V0RGF0YVNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRfYnVmZmVyX1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtNYXhPcHVzT3V0cHV0UGFja2V0U2l6ZVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgaWYgKHNhbXBsZXNfZGVjb2RlZCA8IDApIHsKLSAgICBEQ0hFQ0soIWlucHV0LT5Jc0VuZE9mU3RyZWFtKCkpCi0gICAgICAgIDw8ICJEZWNvZGUoKTogRW5kIG9mIHN0cmVhbSBidWZmZXIgcHJvZHVjZWQgYW4gZXJyb3IhIjsKLQotICAgIExPRyhFUlJPUikgPDwgIkNvbmZpZ3VyZURlY29kZXIoKTogb3B1c19tdWx0aXN0cmVhbV9kZWNvZGUgZmFpbGVkIGZvciIKLSAgICAgICAgICAgICAgIDw8ICIgdGltZXN0YW1wOiAiIDw8IGlucHV0LT5HZXRUaW1lc3RhbXAoKS5Jbk1pY3Jvc2Vjb25kcygpCi0gICAgICAgICAgICAgICA8PCAiIHVzLCBkdXJhdGlvbjogIiA8PCBpbnB1dC0+R2V0RHVyYXRpb24oKS5Jbk1pY3Jvc2Vjb25kcygpCi0gICAgICAgICAgICAgICA8PCAiIHVzLCBwYWNrZXQgc2l6ZTogIiA8PCBpbnB1dC0+R2V0RGF0YVNpemUoKSA8PCAiIGJ5dGVzIHdpdGgiCi0gICAgICAgICAgICAgICA8PCAiIHN0YXR1czogIiA8PCBvcHVzX3N0cmVycm9yKHNhbXBsZXNfZGVjb2RlZCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdWludDgqIGRlY29kZWRfYXVkaW9fZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPigmb3V0cHV0X2J1ZmZlcl9bMF0pOwotICBpbnQgZGVjb2RlZF9hdWRpb19zaXplID0gc2FtcGxlc19kZWNvZGVkICoKLSAgICAgIGRlbXV4ZXJfc3RyZWFtXy0+YXVkaW9fZGVjb2Rlcl9jb25maWcoKS5ieXRlc19wZXJfZnJhbWUoKTsKLSAgRENIRUNLX0xFKGRlY29kZWRfYXVkaW9fc2l6ZSwga01heE9wdXNPdXRwdXRQYWNrZXRTaXplQnl0ZXMpOwotCi0gIGlmIChvdXRwdXRfdGltZXN0YW1wX2hlbHBlcl8tPmJhc2VfdGltZXN0YW1wKCkgPT0ga05vVGltZXN0YW1wKCkgJiYKLSAgICAgICFpbnB1dC0+SXNFbmRPZlN0cmVhbSgpKSB7Ci0gICAgRENIRUNLKGlucHV0LT5HZXRUaW1lc3RhbXAoKSAhPSBrTm9UaW1lc3RhbXAoKSk7Ci0gICAgb3V0cHV0X3RpbWVzdGFtcF9oZWxwZXJfLT5TZXRCYXNlVGltZXN0YW1wKGlucHV0LT5HZXRUaW1lc3RhbXAoKSk7Ci0gIH0KLQotICBpZiAoZGVjb2RlZF9hdWRpb19zaXplID4gMCAmJiBvdXRwdXRfYnl0ZXNfdG9fZHJvcF8gPiAwKSB7Ci0gICAgaW50IGRyb3BwZWRfc2l6ZSA9IHN0ZDo6bWluKGRlY29kZWRfYXVkaW9fc2l6ZSwgb3V0cHV0X2J5dGVzX3RvX2Ryb3BfKTsKLSAgICBEQ0hFQ0tfRVEoZHJvcHBlZF9zaXplICUga0J5dGVzUGVyQ2hhbm5lbCwgMCk7Ci0gICAgZGVjb2RlZF9hdWRpb19kYXRhICs9IGRyb3BwZWRfc2l6ZTsKLSAgICBkZWNvZGVkX2F1ZGlvX3NpemUgLT0gZHJvcHBlZF9zaXplOwotICAgIG91dHB1dF9ieXRlc190b19kcm9wXyAtPSBkcm9wcGVkX3NpemU7Ci0gIH0KLQotICBpZiAoZGVjb2RlZF9hdWRpb19zaXplID4gMCkgewotICAgIC8vIENvcHkgdGhlIGF1ZGlvIHNhbXBsZXMgaW50byBhbiBvdXRwdXQgYnVmZmVyLgotICAgICpvdXRwdXRfYnVmZmVyID0gbmV3IERhdGFCdWZmZXIoZGVjb2RlZF9hdWRpb19kYXRhLCBkZWNvZGVkX2F1ZGlvX3NpemUpOwotICAgICgqb3V0cHV0X2J1ZmZlciktPlNldFRpbWVzdGFtcChvdXRwdXRfdGltZXN0YW1wX2hlbHBlcl8tPkdldFRpbWVzdGFtcCgpKTsKLSAgICAoKm91dHB1dF9idWZmZXIpLT5TZXREdXJhdGlvbigKLSAgICAgICAgb3V0cHV0X3RpbWVzdGFtcF9oZWxwZXJfLT5HZXREdXJhdGlvbihkZWNvZGVkX2F1ZGlvX3NpemUpKTsKLSAgICBvdXRwdXRfdGltZXN0YW1wX2hlbHBlcl8tPkFkZEJ5dGVzKGRlY29kZWRfYXVkaW9fc2l6ZSk7Ci0gIH0gZWxzZSBpZiAoSXNFbmRPZlN0cmVhbShkZWNvZGVkX2F1ZGlvX3NpemUsIGlucHV0KSAmJiAhc2tpcF9lb3NfYXBwZW5kKSB7Ci0gICAgRENIRUNLX0VRKGlucHV0LT5HZXREYXRhU2l6ZSgpLCAwKTsKLSAgICAvLyBDcmVhdGUgYW4gZW5kIG9mIHN0cmVhbSBvdXRwdXQgYnVmZmVyLgotICAgICpvdXRwdXRfYnVmZmVyID0gbmV3IERhdGFCdWZmZXIoMCk7Ci0gIH0KLQotICAvLyBEZWNvZGluZyBmaW5pc2hlZCBzdWNjZXNzZnVsbHksIHVwZGF0ZSBzdGF0aXN0aWNzLgotICBQaXBlbGluZVN0YXRpc3RpY3Mgc3RhdGlzdGljczsKLSAgc3RhdGlzdGljcy5hdWRpb19ieXRlc19kZWNvZGVkID0gZGVjb2RlZF9hdWRpb19zaXplOwotICBzdGF0aXN0aWNzX2NiXy5SdW4oc3RhdGlzdGljcyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvb3B1c19hdWRpb19kZWNvZGVyLmggYi9zcmMvbWVkaWEvZmlsdGVycy9vcHVzX2F1ZGlvX2RlY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRiOGE1My4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9vcHVzX2F1ZGlvX2RlY29kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfRklMVEVSU19PUFVTX0FVRElPX0RFQ09ERVJfSF8KLSNkZWZpbmUgTUVESUFfRklMVEVSU19PUFVTX0FVRElPX0RFQ09ERVJfSF8KLQotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlbXV4ZXJfc3RyZWFtLmgiCi0KLXN0cnVjdCBPcHVzTVNEZWNvZGVyOwotCi1uYW1lc3BhY2UgYmFzZSB7Ci1jbGFzcyBNZXNzYWdlTG9vcFByb3h5OwotfQotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBBdWRpb1RpbWVzdGFtcEhlbHBlcjsKLWNsYXNzIERhdGFCdWZmZXI7Ci1jbGFzcyBEZWNvZGVyQnVmZmVyOwotc3RydWN0IFF1ZXVlZEF1ZGlvQnVmZmVyOwotCi1jbGFzcyBNRURJQV9FWFBPUlQgT3B1c0F1ZGlvRGVjb2RlciA6IHB1YmxpYyBBdWRpb0RlY29kZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgT3B1c0F1ZGlvRGVjb2RlcigKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4mIG1lc3NhZ2VfbG9vcCk7Ci0KLSAgLy8gQXVkaW9EZWNvZGVyIGltcGxlbWVudGF0aW9uLgotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShjb25zdCBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+JiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIHN0YXR1c19jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdGlzdGljc0NCJiBzdGF0aXN0aWNzX2NiKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFJlYWQoY29uc3QgUmVhZENCJiByZWFkX2NiKSBPVkVSUklERTsKLSAgdmlydHVhbCBpbnQgYml0c19wZXJfY2hhbm5lbCgpIE9WRVJSSURFOwotICB2aXJ0dWFsIENoYW5uZWxMYXlvdXQgY2hhbm5lbF9sYXlvdXQoKSBPVkVSUklERTsKLSAgdmlydHVhbCBpbnQgc2FtcGxlc19wZXJfc2Vjb25kKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBSZXNldChjb25zdCBiYXNlOjpDbG9zdXJlJiBjbG9zdXJlKSBPVkVSUklERTsKLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB+T3B1c0F1ZGlvRGVjb2RlcigpOwotCi0gcHJpdmF0ZToKLSAgLy8gTWV0aG9kcyBydW5uaW5nIG9uIGRlY29kZXIgdGhyZWFkLgotICB2b2lkIERvSW5pdGlhbGl6ZShjb25zdCBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+JiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIHN0YXR1c19jYiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdGlzdGljc0NCJiBzdGF0aXN0aWNzX2NiKTsKLSAgdm9pZCBEb1Jlc2V0KGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNsb3N1cmUpOwotICB2b2lkIERvUmVhZChjb25zdCBSZWFkQ0ImIHJlYWRfY2IpOwotICB2b2lkIERvRGVjb2RlQnVmZmVyKERlbXV4ZXJTdHJlYW06OlN0YXR1cyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgaW5wdXQpOwotCi0gIC8vIFJlYWRzIGZyb20gdGhlIGRlbXV4ZXIgc3RyZWFtIHdpdGggY29ycmVzcG9uZGluZyBjYWxsYmFjayBtZXRob2QuCi0gIHZvaWQgUmVhZEZyb21EZW11eGVyU3RyZWFtKCk7Ci0KLSAgYm9vbCBDb25maWd1cmVEZWNvZGVyKCk7Ci0gIHZvaWQgQ2xvc2VEZWNvZGVyKCk7Ci0gIHZvaWQgUmVzZXRUaW1lc3RhbXBTdGF0ZSgpOwotICBib29sIERlY29kZShjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBpbnB1dCwKLSAgICAgICAgICAgICAgYm9vbCBza2lwX2Vvc19hcHBlbmQsCi0gICAgICAgICAgICAgIHNjb3BlZF9yZWZwdHI8RGF0YUJ1ZmZlcj4qIG91dHB1dF9idWZmZXIpOwotCi0gIHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4gbWVzc2FnZV9sb29wXzsKLQotICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IGRlbXV4ZXJfc3RyZWFtXzsKLSAgU3RhdGlzdGljc0NCIHN0YXRpc3RpY3NfY2JfOwotICBPcHVzTVNEZWNvZGVyKiBvcHVzX2RlY29kZXJfOwotCi0gIC8vIERlY29kZWQgYXVkaW8gZm9ybWF0LgotICBpbnQgYml0c19wZXJfY2hhbm5lbF87Ci0gIENoYW5uZWxMYXlvdXQgY2hhbm5lbF9sYXlvdXRfOwotICBpbnQgc2FtcGxlc19wZXJfc2Vjb25kXzsKLQotICAvLyBVc2VkIGZvciBjb21wdXRpbmcgb3V0cHV0IHRpbWVzdGFtcHMuCi0gIHNjb3BlZF9wdHI8QXVkaW9UaW1lc3RhbXBIZWxwZXI+IG91dHB1dF90aW1lc3RhbXBfaGVscGVyXzsKLSAgYmFzZTo6VGltZURlbHRhIGxhc3RfaW5wdXRfdGltZXN0YW1wXzsKLQotICAvLyBOdW1iZXIgb2Ygb3V0cHV0IHNhbXBsZSBieXRlcyB0byBkcm9wIGJlZm9yZSBnZW5lcmF0aW5nCi0gIC8vIG91dHB1dCBidWZmZXJzLgotICBpbnQgb3V0cHV0X2J5dGVzX3RvX2Ryb3BfOwotCi0gIFJlYWRDQiByZWFkX2NiXzsKLQotICBpbnQgc2tpcF9zYW1wbGVzXzsKLQotICAvLyBCdWZmZXIgZm9yIG91dHB1dCBmcm9tIGxpYm9wdXMuCi0gIHNjb3BlZF9hcnJheTxpbnQxNj4gb3V0cHV0X2J1ZmZlcl87Ci0KLSAgRElTQUxMT1dfSU1QTElDSVRfQ09OU1RSVUNUT1JTKE9wdXNBdWRpb0RlY29kZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfRklMVEVSU19PUFVTX0FVRElPX0RFQ09ERVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL3BpcGVsaW5lX2ludGVncmF0aW9uX3Rlc3QuY2MgYi9zcmMvbWVkaWEvZmlsdGVycy9waXBlbGluZV9pbnRlZ3JhdGlvbl90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODhkOTkxLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL3BpcGVsaW5lX2ludGVncmF0aW9uX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvcGlwZWxpbmVfaW50ZWdyYXRpb25fdGVzdF9iYXNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL3N0cmluZ191dGlsLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVjcnlwdG9yX2NsaWVudC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdGVzdF9kYXRhX3V0aWwuaCIKLSNpbmNsdWRlICJtZWRpYS9jcnlwdG8vYWVzX2RlY3J5cHRvci5oIgotCi11c2luZyB0ZXN0aW5nOjpBdE1vc3Q7Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGtTb3VyY2VJZFtdID0gIlNvdXJjZUlkIjsKLXN0YXRpYyBjb25zdCBjaGFyIGtDbGVhcktleVN5c3RlbVtdID0gIm9yZy53My5jbGVhcmtleSI7Ci1zdGF0aWMgY29uc3QgdWludDgga0luaXREYXRhW10gPSB7IDB4NjksIDB4NmUsIDB4NjksIDB4NzQgfTsKLQotc3RhdGljIGNvbnN0IGNoYXIga1dlYk1bXSA9ICJ2aWRlby93ZWJtOyBjb2RlY3M9XCJ2cDgsdm9yYmlzXCIiOwotc3RhdGljIGNvbnN0IGNoYXIga0F1ZGlvT25seVdlYk1bXSA9ICJ2aWRlby93ZWJtOyBjb2RlY3M9XCJ2b3JiaXNcIiI7Ci1zdGF0aWMgY29uc3QgY2hhciBrVmlkZW9Pbmx5V2ViTVtdID0gInZpZGVvL3dlYm07IGNvZGVjcz1cInZwOFwiIjsKLXN0YXRpYyBjb25zdCBjaGFyIGtNUDRbXSA9ICJ2aWRlby9tcDQ7IGNvZGVjcz1cImF2YzEuNEQ0MDQxLG1wNGEuNDAuMlwiIjsKLQotLy8gS2V5IHVzZWQgdG8gZW5jcnlwdCB2aWRlbyB0cmFjayBpbiB0ZXN0IGZpbGUgImJlYXItMzIweDI0MC1lbmNyeXB0ZWQud2VibSIuCi1zdGF0aWMgY29uc3QgdWludDgga1NlY3JldEtleVtdID0gewotICAweGViLCAweGRkLCAweDYyLCAweGYxLCAweDY4LCAweDE0LCAweGQyLCAweDdiLAotICAweDY4LCAweGVmLCAweDEyLCAweDJhLCAweGZjLCAweGU0LCAweGFlLCAweDNjCi19OwotCi1zdGF0aWMgY29uc3QgaW50IGtBcHBlbmRXaG9sZUZpbGUgPSAtMTsKLQotLy8gSGVscGVyIGNsYXNzIHRoYXQgZW11bGF0ZXMgY2FsbHMgbWFkZSBvbiB0aGUgQ2h1bmtEZW11eGVyIGJ5IHRoZQotLy8gTWVkaWEgU291cmNlIEFQSS4KLWNsYXNzIE1vY2tNZWRpYVNvdXJjZSB7Ci0gcHVibGljOgotICBNb2NrTWVkaWFTb3VyY2UoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgbWltZXR5cGUsCi0gICAgICAgICAgICAgICAgICBpbnQgaW5pdGlhbF9hcHBlbmRfc2l6ZSkKLSAgICAgIDogZmlsZV9wYXRoXyhHZXRUZXN0RGF0YUZpbGVQYXRoKGZpbGVuYW1lKSksCi0gICAgICAgIGN1cnJlbnRfcG9zaXRpb25fKDApLAotICAgICAgICBpbml0aWFsX2FwcGVuZF9zaXplXyhpbml0aWFsX2FwcGVuZF9zaXplKSwKLSAgICAgICAgbWltZXR5cGVfKG1pbWV0eXBlKSB7Ci0gICAgY2h1bmtfZGVtdXhlcl8gPSBuZXcgQ2h1bmtEZW11eGVyKAotICAgICAgICBiYXNlOjpCaW5kKCZNb2NrTWVkaWFTb3VyY2U6OkRlbXV4ZXJPcGVuZWQsIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAotICAgICAgICBiYXNlOjpCaW5kKCZNb2NrTWVkaWFTb3VyY2U6OkRlbXV4ZXJOZWVkS2V5LCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgICAgTG9nQ0IoKSk7Ci0KLSAgICBmaWxlX2RhdGFfID0gUmVhZFRlc3REYXRhRmlsZShmaWxlbmFtZSk7Ci0KLSAgICBpZiAoaW5pdGlhbF9hcHBlbmRfc2l6ZV8gPT0ga0FwcGVuZFdob2xlRmlsZSkKLSAgICAgIGluaXRpYWxfYXBwZW5kX3NpemVfID0gZmlsZV9kYXRhXy0+R2V0RGF0YVNpemUoKTsKLQotICAgIERDSEVDS19HVChpbml0aWFsX2FwcGVuZF9zaXplXywgMCk7Ci0gICAgRENIRUNLX0xFKGluaXRpYWxfYXBwZW5kX3NpemVfLCBmaWxlX2RhdGFfLT5HZXREYXRhU2l6ZSgpKTsKLSAgfQotCi0gIHZpcnR1YWwgfk1vY2tNZWRpYVNvdXJjZSgpIHt9Ci0KLSAgY29uc3Qgc2NvcGVkX3JlZnB0cjxDaHVua0RlbXV4ZXI+JiBkZW11eGVyKCkgY29uc3QgeyByZXR1cm4gY2h1bmtfZGVtdXhlcl87IH0KLSAgdm9pZCBzZXRfZGVjcnlwdG9yX2NsaWVudChEZWNyeXB0b3JDbGllbnQqIGRlY3J5cHRvcl9jbGllbnQpIHsKLSAgICBkZWNyeXB0b3JfY2xpZW50XyA9IGRlY3J5cHRvcl9jbGllbnQ7Ci0gIH0KLQotICB2b2lkIFNlZWsoaW50IG5ld19wb3NpdGlvbiwgaW50IHNlZWtfYXBwZW5kX3NpemUpIHsKLSAgICBjaHVua19kZW11eGVyXy0+U3RhcnRXYWl0aW5nRm9yU2VlaygpOwotCi0gICAgY2h1bmtfZGVtdXhlcl8tPkFib3J0KGtTb3VyY2VJZCk7Ci0KLSAgICBEQ0hFQ0tfR0UobmV3X3Bvc2l0aW9uLCAwKTsKLSAgICBEQ0hFQ0tfTFQobmV3X3Bvc2l0aW9uLCBmaWxlX2RhdGFfLT5HZXREYXRhU2l6ZSgpKTsKLSAgICBjdXJyZW50X3Bvc2l0aW9uXyA9IG5ld19wb3NpdGlvbjsKLQotICAgIEFwcGVuZERhdGEoc2Vla19hcHBlbmRfc2l6ZSk7Ci0gIH0KLQotICB2b2lkIEFwcGVuZERhdGEoaW50IHNpemUpIHsKLSAgICBEQ0hFQ0soY2h1bmtfZGVtdXhlcl8uZ2V0KCkpOwotICAgIERDSEVDS19MVChjdXJyZW50X3Bvc2l0aW9uXywgZmlsZV9kYXRhXy0+R2V0RGF0YVNpemUoKSk7Ci0gICAgRENIRUNLX0xFKGN1cnJlbnRfcG9zaXRpb25fICsgc2l6ZSwgZmlsZV9kYXRhXy0+R2V0RGF0YVNpemUoKSk7Ci0gICAgQ0hFQ0soY2h1bmtfZGVtdXhlcl8tPkFwcGVuZERhdGEoCi0gICAgICAgIGtTb3VyY2VJZCwgZmlsZV9kYXRhXy0+R2V0RGF0YSgpICsgY3VycmVudF9wb3NpdGlvbl8sIHNpemUpKTsKLSAgICBjdXJyZW50X3Bvc2l0aW9uXyArPSBzaXplOwotICB9Ci0KLSAgdm9pZCBBcHBlbmRBdFRpbWUoY29uc3QgYmFzZTo6VGltZURlbHRhJiB0aW1lc3RhbXBPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBwRGF0YSwgaW50IHNpemUpIHsKLSAgICBDSEVDSyhjaHVua19kZW11eGVyXy0+U2V0VGltZXN0YW1wT2Zmc2V0KGtTb3VyY2VJZCwgdGltZXN0YW1wT2Zmc2V0KSk7Ci0gICAgQ0hFQ0soY2h1bmtfZGVtdXhlcl8tPkFwcGVuZERhdGEoa1NvdXJjZUlkLCBwRGF0YSwgc2l6ZSkpOwotICAgIENIRUNLKGNodW5rX2RlbXV4ZXJfLT5TZXRUaW1lc3RhbXBPZmZzZXQoa1NvdXJjZUlkLCBiYXNlOjpUaW1lRGVsdGEoKSkpOwotICB9Ci0KLSAgdm9pZCBFbmRPZlN0cmVhbSgpIHsKLSAgICBjaHVua19kZW11eGVyXy0+RW5kT2ZTdHJlYW0oUElQRUxJTkVfT0spOwotICB9Ci0KLSAgdm9pZCBBYm9ydCgpIHsKLSAgICBpZiAoIWNodW5rX2RlbXV4ZXJfLmdldCgpKQotICAgICAgcmV0dXJuOwotICAgIGNodW5rX2RlbXV4ZXJfLT5TaHV0ZG93bigpOwotICAgIGNodW5rX2RlbXV4ZXJfID0gTlVMTDsKLSAgfQotCi0gIHZvaWQgRGVtdXhlck9wZW5lZCgpIHsKLSAgICBNZXNzYWdlTG9vcDo6Y3VycmVudCgpLT5Qb3N0VGFzaygKLSAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZNb2NrTWVkaWFTb3VyY2U6OkRlbXV4ZXJPcGVuZWRUYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICB9Ci0KLSAgdm9pZCBEZW11eGVyT3BlbmVkVGFzaygpIHsKLSAgICBzaXplX3Qgc2VtaWNvbG9uID0gbWltZXR5cGVfLmZpbmQoIjsiKTsKLSAgICBzdGQ6OnN0cmluZyB0eXBlID0gbWltZXR5cGVfLnN1YnN0cigwLCBzZW1pY29sb24pOwotICAgIHNpemVfdCBxdW90ZTEgPSBtaW1ldHlwZV8uZmluZCgiXCIiKTsKLSAgICBzaXplX3QgcXVvdGUyID0gbWltZXR5cGVfLmZpbmQoIlwiIiwgcXVvdGUxICsgMSk7Ci0gICAgc3RkOjpzdHJpbmcgY29kZWNTdHIgPSBtaW1ldHlwZV8uc3Vic3RyKHF1b3RlMSArIDEsIHF1b3RlMiAtIHF1b3RlMSAtIDEpOwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb2RlY3M7Ci0gICAgVG9rZW5pemUoY29kZWNTdHIsICIsIiwgJmNvZGVjcyk7Ci0KLSAgICBDSEVDS19FUShjaHVua19kZW11eGVyXy0+QWRkSWQoa1NvdXJjZUlkLCB0eXBlLCBjb2RlY3MpLCBDaHVua0RlbXV4ZXI6OmtPayk7Ci0gICAgQXBwZW5kRGF0YShpbml0aWFsX2FwcGVuZF9zaXplXyk7Ci0gIH0KLQotICB2b2lkIERlbXV4ZXJOZWVkS2V5KGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9hcnJheTx1aW50OD4gaW5pdF9kYXRhLCBpbnQgaW5pdF9kYXRhX3NpemUpIHsKLSAgICBEQ0hFQ0soaW5pdF9kYXRhLmdldCgpKTsKLSAgICBEQ0hFQ0tfR1QoaW5pdF9kYXRhX3NpemUsIDApOwotICAgIERDSEVDSyhkZWNyeXB0b3JfY2xpZW50Xyk7Ci0gICAgZGVjcnlwdG9yX2NsaWVudF8tPk5lZWRLZXkoIiIsICIiLCB0eXBlLCBpbml0X2RhdGEuUGFzcygpLCBpbml0X2RhdGFfc2l6ZSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIEZpbGVQYXRoIGZpbGVfcGF0aF87Ci0gIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gZmlsZV9kYXRhXzsKLSAgaW50IGN1cnJlbnRfcG9zaXRpb25fOwotICBpbnQgaW5pdGlhbF9hcHBlbmRfc2l6ZV87Ci0gIHN0ZDo6c3RyaW5nIG1pbWV0eXBlXzsKLSAgc2NvcGVkX3JlZnB0cjxDaHVua0RlbXV4ZXI+IGNodW5rX2RlbXV4ZXJfOwotICBEZWNyeXB0b3JDbGllbnQqIGRlY3J5cHRvcl9jbGllbnRfOwotfTsKLQotY2xhc3MgRmFrZURlY3J5cHRvckNsaWVudCA6IHB1YmxpYyBEZWNyeXB0b3JDbGllbnQgewotIHB1YmxpYzoKLSAgRmFrZURlY3J5cHRvckNsaWVudCgpIDogZGVjcnlwdG9yXyh0aGlzKSB7fQotCi0gIEFlc0RlY3J5cHRvciogZGVjcnlwdG9yKCkgewotICAgIHJldHVybiAmZGVjcnlwdG9yXzsKLSAgfQotCi0gIC8vIERlY3J5cHRvckNsaWVudCBpbXBsZW1lbnRhdGlvbi4KLSAgdmlydHVhbCB2b2lkIEtleUFkZGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25faWQpIHsKLSAgICBFWFBFQ1RfRVEoa0NsZWFyS2V5U3lzdGVtLCBrZXlfc3lzdGVtKTsKLSAgICBFWFBFQ1RfRkFMU0Uoc2Vzc2lvbl9pZC5lbXB0eSgpKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBLZXlFcnJvcihjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgQWVzRGVjcnlwdG9yOjpLZXlFcnJvciBlcnJvcl9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN5c3RlbV9jb2RlKSB7Ci0gICAgTk9USU1QTEVNRU5URUQoKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBLZXlNZXNzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZWZhdWx0X3VybCkgewotICAgIEVYUEVDVF9FUShrQ2xlYXJLZXlTeXN0ZW0sIGtleV9zeXN0ZW0pOwotICAgIEVYUEVDVF9GQUxTRShzZXNzaW9uX2lkLmVtcHR5KCkpOwotICAgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmVtcHR5KCkpOwotCi0gICAgY3VycmVudF9rZXlfc3lzdGVtXyA9IGtleV9zeXN0ZW07Ci0gICAgY3VycmVudF9zZXNzaW9uX2lkXyA9IHNlc3Npb25faWQ7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgTmVlZEtleShjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25faWQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfYXJyYXk8dWludDg+IGluaXRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IGluaXRfZGF0YV9sZW5ndGgpIHsKLSAgICBjdXJyZW50X2tleV9zeXN0ZW1fID0ga2V5X3N5c3RlbTsKLSAgICBjdXJyZW50X3Nlc3Npb25faWRfID0gc2Vzc2lvbl9pZDsKLQotICAgIC8vIFdoZW4gTmVlZEtleSBpcyBjYWxsZWQgZnJvbSB0aGUgZGVtdXhlciwgdGhlIHxrZXlfc3lzdGVtfCB3aWxsIGJlIGVtcHR5LgotICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgbmVlZCB0byBjYWxsIEdlbmVyYXRlS2V5UmVxdWVzdCgpIHRvIGluaXRpYWxpemUgYQotICAgIC8vIHNlc3Npb24gKHdoaWNoIHdpbGwgY2FsbCBLZXlNZXNzYWdlKS4KLSAgICBpZiAoY3VycmVudF9rZXlfc3lzdGVtXy5lbXB0eSgpKSB7Ci0gICAgICBEQ0hFQ0soY3VycmVudF9zZXNzaW9uX2lkXy5lbXB0eSgpKTsKLSAgICAgIEVYUEVDVF9UUlVFKGRlY3J5cHRvcl8uR2VuZXJhdGVLZXlSZXF1ZXN0KAotICAgICAgICAgIGtDbGVhcktleVN5c3RlbSwgdHlwZSwga0luaXREYXRhLCBhcnJheXNpemUoa0luaXREYXRhKSkpOwotICAgIH0KLQotICAgIEVYUEVDVF9GQUxTRShjdXJyZW50X2tleV9zeXN0ZW1fLmVtcHR5KCkpOwotICAgIEVYUEVDVF9GQUxTRShjdXJyZW50X3Nlc3Npb25faWRfLmVtcHR5KCkpOwotICAgIGRlY3J5cHRvcl8uQWRkS2V5KGN1cnJlbnRfa2V5X3N5c3RlbV8sIGtTZWNyZXRLZXksIGFycmF5c2l6ZShrU2VjcmV0S2V5KSwKLSAgICAgICAgICAgICAgICAgICAgICBpbml0X2RhdGEuZ2V0KCksIGluaXRfZGF0YV9sZW5ndGgsIGN1cnJlbnRfc2Vzc2lvbl9pZF8pOwotICB9Ci0KLSBwcml2YXRlOgotICBBZXNEZWNyeXB0b3IgZGVjcnlwdG9yXzsKLSAgc3RkOjpzdHJpbmcgY3VycmVudF9rZXlfc3lzdGVtXzsKLSAgc3RkOjpzdHJpbmcgY3VycmVudF9zZXNzaW9uX2lkXzsKLX07Ci0KLWNsYXNzIFBpcGVsaW5lSW50ZWdyYXRpb25UZXN0Ci0gICAgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCwKLSAgICAgIHB1YmxpYyBQaXBlbGluZUludGVncmF0aW9uVGVzdEJhc2UgewotIHB1YmxpYzoKLSAgdm9pZCBTdGFydFBpcGVsaW5lV2l0aE1lZGlhU291cmNlKE1vY2tNZWRpYVNvdXJjZSogc291cmNlKSB7Ci0gICAgRVhQRUNUX0NBTEwoKnRoaXMsIE9uQnVmZmVyaW5nU3RhdGUoUGlwZWxpbmU6OmtIYXZlTWV0YWRhdGEpKQotICAgICAgICAuVGltZXMoQXRNb3N0KDEpKTsKLSAgICBFWFBFQ1RfQ0FMTCgqdGhpcywgT25CdWZmZXJpbmdTdGF0ZShQaXBlbGluZTo6a1ByZXJvbGxDb21wbGV0ZWQpKQotICAgICAgICAuVGltZXMoQXRNb3N0KDEpKTsKLSAgICBwaXBlbGluZV8tPlN0YXJ0KAotICAgICAgICBDcmVhdGVGaWx0ZXJDb2xsZWN0aW9uKHNvdXJjZS0+ZGVtdXhlcigpLCBOVUxMKSwKLSAgICAgICAgYmFzZTo6QmluZCgmUGlwZWxpbmVJbnRlZ3JhdGlvblRlc3Q6Ok9uRW5kZWQsIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAotICAgICAgICBiYXNlOjpCaW5kKCZQaXBlbGluZUludGVncmF0aW9uVGVzdDo6T25FcnJvciwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICAgIFF1aXRPblN0YXR1c0NCKFBJUEVMSU5FX09LKSwKLSAgICAgICAgYmFzZTo6QmluZCgmUGlwZWxpbmVJbnRlZ3JhdGlvblRlc3Q6Ok9uQnVmZmVyaW5nU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotCi0gICAgbWVzc2FnZV9sb29wXy5SdW4oKTsKLSAgfQotCi0gIHZvaWQgU3RhcnRQaXBlbGluZVdpdGhFbmNyeXB0ZWRNZWRpYSgKLSAgICAgIE1vY2tNZWRpYVNvdXJjZSogc291cmNlLAotICAgICAgRmFrZURlY3J5cHRvckNsaWVudCogZW5jcnlwdGVkX21lZGlhKSB7Ci0gICAgRVhQRUNUX0NBTEwoKnRoaXMsIE9uQnVmZmVyaW5nU3RhdGUoUGlwZWxpbmU6OmtIYXZlTWV0YWRhdGEpKQotICAgICAgICAuVGltZXMoQXRNb3N0KDEpKTsKLSAgICBFWFBFQ1RfQ0FMTCgqdGhpcywgT25CdWZmZXJpbmdTdGF0ZShQaXBlbGluZTo6a1ByZXJvbGxDb21wbGV0ZWQpKQotICAgICAgICAuVGltZXMoQXRNb3N0KDEpKTsKLSAgICBwaXBlbGluZV8tPlN0YXJ0KAotICAgICAgICBDcmVhdGVGaWx0ZXJDb2xsZWN0aW9uKHNvdXJjZS0+ZGVtdXhlcigpLCBlbmNyeXB0ZWRfbWVkaWEtPmRlY3J5cHRvcigpKSwKLSAgICAgICAgYmFzZTo6QmluZCgmUGlwZWxpbmVJbnRlZ3JhdGlvblRlc3Q6Ok9uRW5kZWQsIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAotICAgICAgICBiYXNlOjpCaW5kKCZQaXBlbGluZUludGVncmF0aW9uVGVzdDo6T25FcnJvciwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICAgIFF1aXRPblN0YXR1c0NCKFBJUEVMSU5FX09LKSwKLSAgICAgICAgYmFzZTo6QmluZCgmUGlwZWxpbmVJbnRlZ3JhdGlvblRlc3Q6Ok9uQnVmZmVyaW5nU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotCi0gICAgc291cmNlLT5zZXRfZGVjcnlwdG9yX2NsaWVudChlbmNyeXB0ZWRfbWVkaWEpOwotCi0gICAgbWVzc2FnZV9sb29wXy5SdW4oKTsKLSAgfQotCi0gIC8vIFZlcmlmaWVzIHRoYXQgc2Vla2luZyB3b3JrcyBwcm9wZXJseSBmb3IgQ2h1bmtEZW11eGVyIHdoZW4gdGhlCi0gIC8vIHNlZWsgaGFwcGVucyB3aGlsZSB0aGVyZSBpcyBhIHBlbmRpbmcgcmVhZCBvbiB0aGUgQ2h1bmtEZW11eGVyCi0gIC8vIGFuZCBubyBkYXRhIGlzIGF2YWlsYWJsZS4KLSAgYm9vbCBUZXN0U2Vla0R1cmluZ1JlYWQoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWltZXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbml0aWFsX2FwcGVuZF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGEgc3RhcnRfc2Vla190aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGEgc2Vla190aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vla19maWxlX3Bvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vla19hcHBlbmRfc2l6ZSkgewotICAgIE1vY2tNZWRpYVNvdXJjZSBzb3VyY2UoZmlsZW5hbWUsIG1pbWV0eXBlLCBpbml0aWFsX2FwcGVuZF9zaXplKTsKLSAgICBTdGFydFBpcGVsaW5lV2l0aE1lZGlhU291cmNlKCZzb3VyY2UpOwotCi0gICAgaWYgKHBpcGVsaW5lX3N0YXR1c18gIT0gUElQRUxJTkVfT0spCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBQbGF5KCk7Ci0gICAgaWYgKCFXYWl0VW50aWxDdXJyZW50VGltZUlzQWZ0ZXIoc3RhcnRfc2Vla190aW1lKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHNvdXJjZS5TZWVrKHNlZWtfZmlsZV9wb3NpdGlvbiwgc2Vla19hcHBlbmRfc2l6ZSk7Ci0gICAgaWYgKCFTZWVrKHNlZWtfdGltZSkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBzb3VyY2UuRW5kT2ZTdHJlYW0oKTsKLQotICAgIHNvdXJjZS5BYm9ydCgpOwotICAgIFN0b3AoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfTsKLQotCi1URVNUX0YoUGlwZWxpbmVJbnRlZ3JhdGlvblRlc3QsIEJhc2ljUGxheWJhY2spIHsKLSAgQVNTRVJUX1RSVUUoU3RhcnQoR2V0VGVzdERhdGFGaWxlUGF0aCgiYmVhci0zMjB4MjQwLndlYm0iKSwgUElQRUxJTkVfT0spKTsKLQotICBQbGF5KCk7Ci0KLSAgQVNTRVJUX1RSVUUoV2FpdFVudGlsT25FbmRlZCgpKTsKLX0KLQotVEVTVF9GKFBpcGVsaW5lSW50ZWdyYXRpb25UZXN0LCBCYXNpY1BsYXliYWNrSGFzaGVkKSB7Ci0gIEFTU0VSVF9UUlVFKFN0YXJ0KEdldFRlc3REYXRhRmlsZVBhdGgoImJlYXItMzIweDI0MC53ZWJtIiksCi0gICAgICAgICAgICAgICAgICAgIFBJUEVMSU5FX09LLCB0cnVlKSk7Ci0KLSAgUGxheSgpOwotCi0gIEFTU0VSVF9UUlVFKFdhaXRVbnRpbE9uRW5kZWQoKSk7Ci0KLSAgRVhQRUNUX0VRKEdldFZpZGVvSGFzaCgpLCAiZjBiZTEyMGE5MGE4MTE1MDY3NzdjOTlhMmNkZjdjYzEiKTsKLSAgRVhQRUNUX0VRKEdldEF1ZGlvSGFzaCgpLCAiNTY5OWE0NDE1YjYyMGU0NWI5ZDBhYWU1MzFjOWRmNzYiKTsKLX0KLQotVEVTVF9GKFBpcGVsaW5lSW50ZWdyYXRpb25UZXN0LCBCYXNpY1BsYXliYWNrX01lZGlhU291cmNlKSB7Ci0gIE1vY2tNZWRpYVNvdXJjZSBzb3VyY2UoImJlYXItMzIweDI0MC53ZWJtIiwga1dlYk0sIDIxOTIyOSk7Ci0gIFN0YXJ0UGlwZWxpbmVXaXRoTWVkaWFTb3VyY2UoJnNvdXJjZSk7Ci0gIHNvdXJjZS5FbmRPZlN0cmVhbSgpOwotICBBU1NFUlRfRVEocGlwZWxpbmVfc3RhdHVzXywgUElQRUxJTkVfT0spOwotCi0gIEVYUEVDVF9FUShwaXBlbGluZV8tPkdldEJ1ZmZlcmVkVGltZVJhbmdlcygpLnNpemUoKSwgMXUpOwotICBFWFBFQ1RfRVEocGlwZWxpbmVfLT5HZXRCdWZmZXJlZFRpbWVSYW5nZXMoKS5zdGFydCgwKS5Jbk1pbGxpc2Vjb25kcygpLCAwKTsKLSAgRVhQRUNUX0VRKHBpcGVsaW5lXy0+R2V0QnVmZmVyZWRUaW1lUmFuZ2VzKCkuZW5kKDApLkluTWlsbGlzZWNvbmRzKCksIDI3MzcpOwotCi0gIFBsYXkoKTsKLQotICBBU1NFUlRfVFJVRShXYWl0VW50aWxPbkVuZGVkKCkpOwotICBzb3VyY2UuQWJvcnQoKTsKLSAgU3RvcCgpOwotfQotCi1URVNUX0YoUGlwZWxpbmVJbnRlZ3JhdGlvblRlc3QsIE1lZGlhU291cmNlX0NvbmZpZ0NoYW5nZV9XZWJNKSB7Ci0gIE1vY2tNZWRpYVNvdXJjZSBzb3VyY2UoImJlYXItMzIweDI0MC0xNng5LWFzcGVjdC53ZWJtIiwga1dlYk0sCi0gICAgICAgICAgICAgICAgICAgICAgICAga0FwcGVuZFdob2xlRmlsZSk7Ci0gIFN0YXJ0UGlwZWxpbmVXaXRoTWVkaWFTb3VyY2UoJnNvdXJjZSk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBzZWNvbmRfZmlsZSA9Ci0gICAgICBSZWFkVGVzdERhdGFGaWxlKCJiZWFyLTY0MHgzNjAud2VibSIpOwotCi0gIHNvdXJjZS5BcHBlbmRBdFRpbWUoYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcygyKSwKLSAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRfZmlsZS0+R2V0RGF0YSgpLCBzZWNvbmRfZmlsZS0+R2V0RGF0YVNpemUoKSk7Ci0KLSAgc291cmNlLkVuZE9mU3RyZWFtKCk7Ci0gIEFTU0VSVF9FUShwaXBlbGluZV9zdGF0dXNfLCBQSVBFTElORV9PSyk7Ci0KLSAgRVhQRUNUX0VRKHBpcGVsaW5lXy0+R2V0QnVmZmVyZWRUaW1lUmFuZ2VzKCkuc2l6ZSgpLCAxdSk7Ci0gIEVYUEVDVF9FUShwaXBlbGluZV8tPkdldEJ1ZmZlcmVkVGltZVJhbmdlcygpLnN0YXJ0KDApLkluTWlsbGlzZWNvbmRzKCksIDApOwotICBFWFBFQ1RfRVEocGlwZWxpbmVfLT5HZXRCdWZmZXJlZFRpbWVSYW5nZXMoKS5lbmQoMCkuSW5NaWxsaXNlY29uZHMoKSwgNDc2Myk7Ci0KLSAgUGxheSgpOwotCi0gIEFTU0VSVF9UUlVFKFdhaXRVbnRpbE9uRW5kZWQoKSk7Ci0gIHNvdXJjZS5BYm9ydCgpOwotICBTdG9wKCk7Ci19Ci0KLSNpZiBkZWZpbmVkKEdPT0dMRV9DSFJPTUVfQlVJTEQpIHx8IGRlZmluZWQoVVNFX1BST1BSSUVUQVJZX0NPREVDUykKLVRFU1RfRihQaXBlbGluZUludGVncmF0aW9uVGVzdCwgTWVkaWFTb3VyY2VfQ29uZmlnQ2hhbmdlX01QNCkgewotICBNb2NrTWVkaWFTb3VyY2Ugc291cmNlKCJiZWFyLjY0MHgzNjBfZGFzaC5tcDQiLCBrTVA0LCBrQXBwZW5kV2hvbGVGaWxlKTsKLSAgU3RhcnRQaXBlbGluZVdpdGhNZWRpYVNvdXJjZSgmc291cmNlKTsKLQotICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IHNlY29uZF9maWxlID0KLSAgICAgIFJlYWRUZXN0RGF0YUZpbGUoImJlYXIuMTI4MHg3MjBfZGFzaC5tcDQiKTsKLQotICBzb3VyY2UuQXBwZW5kQXRUaW1lKGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoMiksCi0gICAgICAgICAgICAgICAgICAgICAgc2Vjb25kX2ZpbGUtPkdldERhdGEoKSwgc2Vjb25kX2ZpbGUtPkdldERhdGFTaXplKCkpOwotCi0gIHNvdXJjZS5FbmRPZlN0cmVhbSgpOwotICBBU1NFUlRfRVEocGlwZWxpbmVfc3RhdHVzXywgUElQRUxJTkVfT0spOwotCi0gIEVYUEVDVF9FUShwaXBlbGluZV8tPkdldEJ1ZmZlcmVkVGltZVJhbmdlcygpLnNpemUoKSwgMXUpOwotICBFWFBFQ1RfRVEocGlwZWxpbmVfLT5HZXRCdWZmZXJlZFRpbWVSYW5nZXMoKS5zdGFydCgwKS5Jbk1pbGxpc2Vjb25kcygpLCAwKTsKLSAgRVhQRUNUX0VRKHBpcGVsaW5lXy0+R2V0QnVmZmVyZWRUaW1lUmFuZ2VzKCkuZW5kKDApLkluTWlsbGlzZWNvbmRzKCksIDQ3MzYpOwotCi0gIFBsYXkoKTsKLQotICBBU1NFUlRfVFJVRShXYWl0VW50aWxPbkVuZGVkKCkpOwotICBzb3VyY2UuQWJvcnQoKTsKLSAgU3RvcCgpOwotfQotI2VuZGlmCi0KLVRFU1RfRihQaXBlbGluZUludGVncmF0aW9uVGVzdCwgQmFzaWNQbGF5YmFja18xNng5QXNwZWN0UmF0aW8pIHsKLSAgQVNTRVJUX1RSVUUoU3RhcnQoR2V0VGVzdERhdGFGaWxlUGF0aCgiYmVhci0zMjB4MjQwLTE2eDktYXNwZWN0LndlYm0iKSwKLSAgICAgICAgICAgICAgICAgICAgUElQRUxJTkVfT0spKTsKLSAgUGxheSgpOwotICBBU1NFUlRfVFJVRShXYWl0VW50aWxPbkVuZGVkKCkpOwotfQotCi1URVNUX0YoUGlwZWxpbmVJbnRlZ3JhdGlvblRlc3QsIEVuY3J5cHRlZFBsYXliYWNrKSB7Ci0gIE1vY2tNZWRpYVNvdXJjZSBzb3VyY2UoImJlYXItMzIweDI0MC1lbmNyeXB0ZWQud2VibSIsIGtXZWJNLCAyMTk4MTYpOwotICBGYWtlRGVjcnlwdG9yQ2xpZW50IGVuY3J5cHRlZF9tZWRpYTsKLSAgU3RhcnRQaXBlbGluZVdpdGhFbmNyeXB0ZWRNZWRpYSgmc291cmNlLCAmZW5jcnlwdGVkX21lZGlhKTsKLQotICBzb3VyY2UuRW5kT2ZTdHJlYW0oKTsKLSAgQVNTRVJUX0VRKFBJUEVMSU5FX09LLCBwaXBlbGluZV9zdGF0dXNfKTsKLQotICBQbGF5KCk7Ci0KLSAgQVNTRVJUX1RSVUUoV2FpdFVudGlsT25FbmRlZCgpKTsKLSAgc291cmNlLkFib3J0KCk7Ci0gIFN0b3AoKTsKLX0KLQotLy8gVE9ETyhhY29sd2VsbCk6IEZpeCBmbGFraW5lc3MgaHR0cDovL2NyYnVnLmNvbS8xMTc5MjEKLVRFU1RfRihQaXBlbGluZUludGVncmF0aW9uVGVzdCwgRElTQUJMRURfU2Vla1doaWxlUGF1c2VkKSB7Ci0gIEFTU0VSVF9UUlVFKFN0YXJ0KEdldFRlc3REYXRhRmlsZVBhdGgoImJlYXItMzIweDI0MC53ZWJtIiksIFBJUEVMSU5FX09LKSk7Ci0KLSAgYmFzZTo6VGltZURlbHRhIGR1cmF0aW9uKHBpcGVsaW5lXy0+R2V0TWVkaWFEdXJhdGlvbigpKTsKLSAgYmFzZTo6VGltZURlbHRhIHN0YXJ0X3NlZWtfdGltZShkdXJhdGlvbiAvIDQpOwotICBiYXNlOjpUaW1lRGVsdGEgc2Vla190aW1lKGR1cmF0aW9uICogMyAvIDQpOwotCi0gIFBsYXkoKTsKLSAgQVNTRVJUX1RSVUUoV2FpdFVudGlsQ3VycmVudFRpbWVJc0FmdGVyKHN0YXJ0X3NlZWtfdGltZSkpOwotICBQYXVzZSgpOwotICBBU1NFUlRfVFJVRShTZWVrKHNlZWtfdGltZSkpOwotICBFWFBFQ1RfRVEocGlwZWxpbmVfLT5HZXRNZWRpYVRpbWUoKSwgc2Vla190aW1lKTsKLSAgUGxheSgpOwotICBBU1NFUlRfVFJVRShXYWl0VW50aWxPbkVuZGVkKCkpOwotCi0gIC8vIE1ha2Ugc3VyZSBzZWVraW5nIGFmdGVyIHJlYWNoaW5nIHRoZSBlbmQgd29ya3MgYXMgZXhwZWN0ZWQuCi0gIFBhdXNlKCk7Ci0gIEFTU0VSVF9UUlVFKFNlZWsoc2Vla190aW1lKSk7Ci0gIEVYUEVDVF9FUShwaXBlbGluZV8tPkdldE1lZGlhVGltZSgpLCBzZWVrX3RpbWUpOwotICBQbGF5KCk7Ci0gIEFTU0VSVF9UUlVFKFdhaXRVbnRpbE9uRW5kZWQoKSk7Ci19Ci0KLS8vIFRPRE8oYWNvbHdlbGwpOiBGaXggZmxha2luZXNzIGh0dHA6Ly9jcmJ1Zy5jb20vMTE3OTIxCi1URVNUX0YoUGlwZWxpbmVJbnRlZ3JhdGlvblRlc3QsIERJU0FCTEVEX1NlZWtXaGlsZVBsYXlpbmcpIHsKLSAgQVNTRVJUX1RSVUUoU3RhcnQoR2V0VGVzdERhdGFGaWxlUGF0aCgiYmVhci0zMjB4MjQwLndlYm0iKSwgUElQRUxJTkVfT0spKTsKLQotICBiYXNlOjpUaW1lRGVsdGEgZHVyYXRpb24ocGlwZWxpbmVfLT5HZXRNZWRpYUR1cmF0aW9uKCkpOwotICBiYXNlOjpUaW1lRGVsdGEgc3RhcnRfc2Vla190aW1lKGR1cmF0aW9uIC8gNCk7Ci0gIGJhc2U6OlRpbWVEZWx0YSBzZWVrX3RpbWUoZHVyYXRpb24gKiAzIC8gNCk7Ci0KLSAgUGxheSgpOwotICBBU1NFUlRfVFJVRShXYWl0VW50aWxDdXJyZW50VGltZUlzQWZ0ZXIoc3RhcnRfc2Vla190aW1lKSk7Ci0gIEFTU0VSVF9UUlVFKFNlZWsoc2Vla190aW1lKSk7Ci0gIEVYUEVDVF9HRShwaXBlbGluZV8tPkdldE1lZGlhVGltZSgpLCBzZWVrX3RpbWUpOwotICBBU1NFUlRfVFJVRShXYWl0VW50aWxPbkVuZGVkKCkpOwotCi0gIC8vIE1ha2Ugc3VyZSBzZWVraW5nIGFmdGVyIHJlYWNoaW5nIHRoZSBlbmQgd29ya3MgYXMgZXhwZWN0ZWQuCi0gIEFTU0VSVF9UUlVFKFNlZWsoc2Vla190aW1lKSk7Ci0gIEVYUEVDVF9HRShwaXBlbGluZV8tPkdldE1lZGlhVGltZSgpLCBzZWVrX3RpbWUpOwotICBBU1NFUlRfVFJVRShXYWl0VW50aWxPbkVuZGVkKCkpOwotfQotCi0vLyBWZXJpZnkgYXVkaW8gZGVjb2RlciAmIHJlbmRlcmVyIGNhbiBoYW5kbGUgYWJvcnRlZCBkZW11eGVyIHJlYWRzLgotVEVTVF9GKFBpcGVsaW5lSW50ZWdyYXRpb25UZXN0LCBDaHVua0RlbXV4ZXJBYm9ydFJlYWRfQXVkaW9Pbmx5KSB7Ci0gIEFTU0VSVF9UUlVFKFRlc3RTZWVrRHVyaW5nUmVhZCgiYmVhci0zMjB4MjQwLWF1ZGlvLW9ubHkud2VibSIsIGtBdWRpb09ubHlXZWJNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODE5MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyg0NjQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDYxNyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwQ0EsIDE5NzMwKSk7Ci19Ci0KLS8vIFZlcmlmeSB2aWRlbyBkZWNvZGVyICYgcmVuZGVyZXIgY2FuIGhhbmRsZSBhYm9ydGVkIGRlbXV4ZXIgcmVhZHMuCi1URVNUX0YoUGlwZWxpbmVJbnRlZ3JhdGlvblRlc3QsIENodW5rRGVtdXhlckFib3J0UmVhZF9WaWRlb09ubHkpIHsKLSAgQVNTRVJUX1RSVUUoVGVzdFNlZWtEdXJpbmdSZWFkKCJiZWFyLTMyMHgyNDAtdmlkZW8tb25seS53ZWJtIiwga1ZpZGVvT25seVdlYk0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjc2OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygyMDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDE2NjgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzg5NiwgNjU1MzYpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9waXBlbGluZV9pbnRlZ3JhdGlvbl90ZXN0X2Jhc2UuY2MgYi9zcmMvbWVkaWEvZmlsdGVycy9waXBlbGluZV9pbnRlZ3JhdGlvbl90ZXN0X2Jhc2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MjllMGEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvcGlwZWxpbmVfaW50ZWdyYXRpb25fdGVzdF9iYXNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL3BpcGVsaW5lX2ludGVncmF0aW9uX3Rlc3RfYmFzZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9sb2cuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL2F1ZGlvX3JlbmRlcmVyX2ltcGwuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL2NodW5rX2RlbXV4ZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL2ZmbXBlZ19hdWRpb19kZWNvZGVyLmgiCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9mZm1wZWdfZGVtdXhlci5oIgotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvZmZtcGVnX3ZpZGVvX2RlY29kZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL2ZpbGVfZGF0YV9zb3VyY2UuaCIKLQotdXNpbmcgOjp0ZXN0aW5nOjpBbnlOdW1iZXI7Ci11c2luZyA6OnRlc3Rpbmc6OkF0TW9zdDsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY29uc3QgY2hhciBrTnVsbEhhc2hbXSA9ICJkNDFkOGNkOThmMDBiMjA0ZTk4MDA5OThlY2Y4NDI3ZSI7Ci0KLVBpcGVsaW5lSW50ZWdyYXRpb25UZXN0QmFzZTo6UGlwZWxpbmVJbnRlZ3JhdGlvblRlc3RCYXNlKCkKLSAgICA6IGhhc2hpbmdfZW5hYmxlZF8oZmFsc2UpLAotICAgICAgcGlwZWxpbmVfKG5ldyBQaXBlbGluZShtZXNzYWdlX2xvb3BfLm1lc3NhZ2VfbG9vcF9wcm94eSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWVkaWFMb2coKSkpLAotICAgICAgZW5kZWRfKGZhbHNlKSwKLSAgICAgIHBpcGVsaW5lX3N0YXR1c18oUElQRUxJTkVfT0spIHsKLSAgYmFzZTo6TUQ1SW5pdCgmbWQ1X2NvbnRleHRfKTsKLSAgRVhQRUNUX0NBTEwoKnRoaXMsIE9uU2V0T3BhcXVlKHRydWUpKS5UaW1lcyhBbnlOdW1iZXIoKSk7Ci19Ci0KLVBpcGVsaW5lSW50ZWdyYXRpb25UZXN0QmFzZTo6flBpcGVsaW5lSW50ZWdyYXRpb25UZXN0QmFzZSgpIHsKLSAgaWYgKCFwaXBlbGluZV8tPklzUnVubmluZygpKQotICAgIHJldHVybjsKLQotICBTdG9wKCk7Ci19Ci0KLXZvaWQgUGlwZWxpbmVJbnRlZ3JhdGlvblRlc3RCYXNlOjpPblN0YXR1c0NhbGxiYWNrKAotICAgIFBpcGVsaW5lU3RhdHVzIHN0YXR1cykgewotICBwaXBlbGluZV9zdGF0dXNfID0gc3RhdHVzOwotICBtZXNzYWdlX2xvb3BfLlBvc3RUYXNrKEZST01fSEVSRSwgTWVzc2FnZUxvb3A6OlF1aXRDbG9zdXJlKCkpOwotfQotCi12b2lkIFBpcGVsaW5lSW50ZWdyYXRpb25UZXN0QmFzZTo6T25TdGF0dXNDYWxsYmFja0NoZWNrZWQoCi0gICAgUGlwZWxpbmVTdGF0dXMgZXhwZWN0ZWRfc3RhdHVzLAotICAgIFBpcGVsaW5lU3RhdHVzIHN0YXR1cykgewotICBFWFBFQ1RfRVEoZXhwZWN0ZWRfc3RhdHVzLCBzdGF0dXMpOwotICBPblN0YXR1c0NhbGxiYWNrKHN0YXR1cyk7Ci19Ci0KLVBpcGVsaW5lU3RhdHVzQ0IgUGlwZWxpbmVJbnRlZ3JhdGlvblRlc3RCYXNlOjpRdWl0T25TdGF0dXNDQigKLSAgICBQaXBlbGluZVN0YXR1cyBleHBlY3RlZF9zdGF0dXMpIHsKLSAgcmV0dXJuIGJhc2U6OkJpbmQoJlBpcGVsaW5lSW50ZWdyYXRpb25UZXN0QmFzZTo6T25TdGF0dXNDYWxsYmFja0NoZWNrZWQsCi0gICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksCi0gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3N0YXR1cyk7Ci19Ci0KLXZvaWQgUGlwZWxpbmVJbnRlZ3JhdGlvblRlc3RCYXNlOjpPbkVuZGVkKFBpcGVsaW5lU3RhdHVzIHN0YXR1cykgewotICBEQ0hFQ0tfRVEoc3RhdHVzLCBQSVBFTElORV9PSyk7Ci0gIERDSEVDSyghZW5kZWRfKTsKLSAgZW5kZWRfID0gdHJ1ZTsKLSAgcGlwZWxpbmVfc3RhdHVzXyA9IHN0YXR1czsKLSAgbWVzc2FnZV9sb29wXy5Qb3N0VGFzayhGUk9NX0hFUkUsIE1lc3NhZ2VMb29wOjpRdWl0Q2xvc3VyZSgpKTsKLX0KLQotYm9vbCBQaXBlbGluZUludGVncmF0aW9uVGVzdEJhc2U6OldhaXRVbnRpbE9uRW5kZWQoKSB7Ci0gIGlmIChlbmRlZF8pCi0gICAgcmV0dXJuIChwaXBlbGluZV9zdGF0dXNfID09IFBJUEVMSU5FX09LKTsKLSAgbWVzc2FnZV9sb29wXy5SdW4oKTsKLSAgRVhQRUNUX1RSVUUoZW5kZWRfKTsKLSAgcmV0dXJuIGVuZGVkXyAmJiAocGlwZWxpbmVfc3RhdHVzXyA9PSBQSVBFTElORV9PSyk7Ci19Ci0KLVBpcGVsaW5lU3RhdHVzIFBpcGVsaW5lSW50ZWdyYXRpb25UZXN0QmFzZTo6V2FpdFVudGlsRW5kZWRPckVycm9yKCkgewotICBpZiAoZW5kZWRfIHx8IHBpcGVsaW5lX3N0YXR1c18gIT0gUElQRUxJTkVfT0spCi0gICAgcmV0dXJuIHBpcGVsaW5lX3N0YXR1c187Ci0gIG1lc3NhZ2VfbG9vcF8uUnVuKCk7Ci0gIHJldHVybiBwaXBlbGluZV9zdGF0dXNfOwotfQotCi12b2lkIFBpcGVsaW5lSW50ZWdyYXRpb25UZXN0QmFzZTo6T25FcnJvcihQaXBlbGluZVN0YXR1cyBzdGF0dXMpIHsKLSAgRENIRUNLX05FKHN0YXR1cywgUElQRUxJTkVfT0spOwotICBwaXBlbGluZV9zdGF0dXNfID0gc3RhdHVzOwotICBtZXNzYWdlX2xvb3BfLlBvc3RUYXNrKEZST01fSEVSRSwgTWVzc2FnZUxvb3A6OlF1aXRDbG9zdXJlKCkpOwotfQotCi1ib29sIFBpcGVsaW5lSW50ZWdyYXRpb25UZXN0QmFzZTo6U3RhcnQoY29uc3QgRmlsZVBhdGgmIGZpbGVfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXBlbGluZVN0YXR1cyBleHBlY3RlZF9zdGF0dXMpIHsKLSAgRVhQRUNUX0NBTEwoKnRoaXMsIE9uQnVmZmVyaW5nU3RhdGUoUGlwZWxpbmU6OmtIYXZlTWV0YWRhdGEpKQotICAgICAgLlRpbWVzKEF0TW9zdCgxKSk7Ci0gIEVYUEVDVF9DQUxMKCp0aGlzLCBPbkJ1ZmZlcmluZ1N0YXRlKFBpcGVsaW5lOjprUHJlcm9sbENvbXBsZXRlZCkpCi0gICAgICAuVGltZXMoQXRNb3N0KDEpKTsKLSAgcGlwZWxpbmVfLT5TdGFydCgKLSAgICAgIENyZWF0ZUZpbHRlckNvbGxlY3Rpb24oZmlsZV9wYXRoKSwKLSAgICAgIGJhc2U6OkJpbmQoJlBpcGVsaW5lSW50ZWdyYXRpb25UZXN0QmFzZTo6T25FbmRlZCwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICBiYXNlOjpCaW5kKCZQaXBlbGluZUludGVncmF0aW9uVGVzdEJhc2U6Ok9uRXJyb3IsIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAotICAgICAgUXVpdE9uU3RhdHVzQ0IoZXhwZWN0ZWRfc3RhdHVzKSwKLSAgICAgIGJhc2U6OkJpbmQoJlBpcGVsaW5lSW50ZWdyYXRpb25UZXN0QmFzZTo6T25CdWZmZXJpbmdTdGF0ZSwKLSAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICBtZXNzYWdlX2xvb3BfLlJ1bigpOwotICByZXR1cm4gKHBpcGVsaW5lX3N0YXR1c18gPT0gUElQRUxJTkVfT0spOwotfQotCi1ib29sIFBpcGVsaW5lSW50ZWdyYXRpb25UZXN0QmFzZTo6U3RhcnQoY29uc3QgRmlsZVBhdGgmIGZpbGVfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXBlbGluZVN0YXR1cyBleHBlY3RlZF9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNoaW5nX2VuYWJsZWQpIHsKLSAgaGFzaGluZ19lbmFibGVkXyA9IGhhc2hpbmdfZW5hYmxlZDsKLSAgcmV0dXJuIFN0YXJ0KGZpbGVfcGF0aCwgZXhwZWN0ZWRfc3RhdHVzKTsKLX0KLQotYm9vbCBQaXBlbGluZUludGVncmF0aW9uVGVzdEJhc2U6OlN0YXJ0KGNvbnN0IEZpbGVQYXRoJiBmaWxlX3BhdGgpIHsKLSAgRVhQRUNUX0NBTEwoKnRoaXMsIE9uQnVmZmVyaW5nU3RhdGUoUGlwZWxpbmU6OmtIYXZlTWV0YWRhdGEpKQotICAgICAgLlRpbWVzKEF0TW9zdCgxKSk7Ci0gIEVYUEVDVF9DQUxMKCp0aGlzLCBPbkJ1ZmZlcmluZ1N0YXRlKFBpcGVsaW5lOjprUHJlcm9sbENvbXBsZXRlZCkpCi0gICAgICAuVGltZXMoQXRNb3N0KDEpKTsKLSAgcGlwZWxpbmVfLT5TdGFydCgKLSAgICAgIENyZWF0ZUZpbHRlckNvbGxlY3Rpb24oZmlsZV9wYXRoKSwKLSAgICAgIGJhc2U6OkJpbmQoJlBpcGVsaW5lSW50ZWdyYXRpb25UZXN0QmFzZTo6T25FbmRlZCwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICBiYXNlOjpCaW5kKCZQaXBlbGluZUludGVncmF0aW9uVGVzdEJhc2U6Ok9uRXJyb3IsIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAotICAgICAgYmFzZTo6QmluZCgmUGlwZWxpbmVJbnRlZ3JhdGlvblRlc3RCYXNlOjpPblN0YXR1c0NhbGxiYWNrLAotICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgIGJhc2U6OkJpbmQoJlBpcGVsaW5lSW50ZWdyYXRpb25UZXN0QmFzZTo6T25CdWZmZXJpbmdTdGF0ZSwKLSAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICBtZXNzYWdlX2xvb3BfLlJ1bigpOwotICByZXR1cm4gKHBpcGVsaW5lX3N0YXR1c18gPT0gUElQRUxJTkVfT0spOwotfQotCi12b2lkIFBpcGVsaW5lSW50ZWdyYXRpb25UZXN0QmFzZTo6UGxheSgpIHsKLSAgcGlwZWxpbmVfLT5TZXRQbGF5YmFja1JhdGUoMSk7Ci19Ci0KLXZvaWQgUGlwZWxpbmVJbnRlZ3JhdGlvblRlc3RCYXNlOjpQYXVzZSgpIHsKLSAgcGlwZWxpbmVfLT5TZXRQbGF5YmFja1JhdGUoMCk7Ci19Ci0KLWJvb2wgUGlwZWxpbmVJbnRlZ3JhdGlvblRlc3RCYXNlOjpTZWVrKGJhc2U6OlRpbWVEZWx0YSBzZWVrX3RpbWUpIHsKLSAgZW5kZWRfID0gZmFsc2U7Ci0KLSAgRVhQRUNUX0NBTEwoKnRoaXMsIE9uQnVmZmVyaW5nU3RhdGUoUGlwZWxpbmU6OmtQcmVyb2xsQ29tcGxldGVkKSk7Ci0gIHBpcGVsaW5lXy0+U2VlayhzZWVrX3RpbWUsIFF1aXRPblN0YXR1c0NCKFBJUEVMSU5FX09LKSk7Ci0gIG1lc3NhZ2VfbG9vcF8uUnVuKCk7Ci0gIHJldHVybiAocGlwZWxpbmVfc3RhdHVzXyA9PSBQSVBFTElORV9PSyk7Ci19Ci0KLXZvaWQgUGlwZWxpbmVJbnRlZ3JhdGlvblRlc3RCYXNlOjpTdG9wKCkgewotICBEQ0hFQ0socGlwZWxpbmVfLT5Jc1J1bm5pbmcoKSk7Ci0gIHBpcGVsaW5lXy0+U3RvcChNZXNzYWdlTG9vcDo6UXVpdENsb3N1cmUoKSk7Ci0gIG1lc3NhZ2VfbG9vcF8uUnVuKCk7Ci19Ci0KLXZvaWQgUGlwZWxpbmVJbnRlZ3JhdGlvblRlc3RCYXNlOjpRdWl0QWZ0ZXJDdXJyZW50VGltZVRhc2soCi0gICAgY29uc3QgYmFzZTo6VGltZURlbHRhJiBxdWl0X3RpbWUpIHsKLSAgaWYgKHBpcGVsaW5lXy0+R2V0TWVkaWFUaW1lKCkgPj0gcXVpdF90aW1lIHx8Ci0gICAgICBwaXBlbGluZV9zdGF0dXNfICE9IFBJUEVMSU5FX09LKSB7Ci0gICAgbWVzc2FnZV9sb29wXy5RdWl0KCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgbWVzc2FnZV9sb29wXy5Qb3N0RGVsYXllZFRhc2soCi0gICAgICBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kKCZQaXBlbGluZUludGVncmF0aW9uVGVzdEJhc2U6OlF1aXRBZnRlckN1cnJlbnRUaW1lVGFzaywKLSAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwgcXVpdF90aW1lKSwKLSAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygxMCkpOwotfQotCi1ib29sIFBpcGVsaW5lSW50ZWdyYXRpb25UZXN0QmFzZTo6V2FpdFVudGlsQ3VycmVudFRpbWVJc0FmdGVyKAotICAgIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSYgd2FpdF90aW1lKSB7Ci0gIERDSEVDSyhwaXBlbGluZV8tPklzUnVubmluZygpKTsKLSAgRENIRUNLX0dUKHBpcGVsaW5lXy0+R2V0UGxheWJhY2tSYXRlKCksIDApOwotICBEQ0hFQ0sod2FpdF90aW1lIDw9IHBpcGVsaW5lXy0+R2V0TWVkaWFEdXJhdGlvbigpKTsKLQotICBtZXNzYWdlX2xvb3BfLlBvc3REZWxheWVkVGFzaygKLSAgICAgIEZST01fSEVSRSwKLSAgICAgIGJhc2U6OkJpbmQoJlBpcGVsaW5lSW50ZWdyYXRpb25UZXN0QmFzZTo6UXVpdEFmdGVyQ3VycmVudFRpbWVUYXNrLAotICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLAotICAgICAgICAgICAgICAgICB3YWl0X3RpbWUpLAotICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDEwKSk7Ci0gIG1lc3NhZ2VfbG9vcF8uUnVuKCk7Ci0gIHJldHVybiAocGlwZWxpbmVfc3RhdHVzXyA9PSBQSVBFTElORV9PSyk7Ci19Ci0KLXNjb3BlZF9wdHI8RmlsdGVyQ29sbGVjdGlvbj4KLVBpcGVsaW5lSW50ZWdyYXRpb25UZXN0QmFzZTo6Q3JlYXRlRmlsdGVyQ29sbGVjdGlvbihjb25zdCBGaWxlUGF0aCYgZmlsZV9wYXRoKSB7Ci0gIHNjb3BlZF9yZWZwdHI8RmlsZURhdGFTb3VyY2U+IGRhdGFfc291cmNlID0gbmV3IEZpbGVEYXRhU291cmNlKCk7Ci0gIENIRUNLKGRhdGFfc291cmNlLT5Jbml0aWFsaXplKGZpbGVfcGF0aCkpOwotICByZXR1cm4gQ3JlYXRlRmlsdGVyQ29sbGVjdGlvbigKLSAgICAgIG5ldyBGRm1wZWdEZW11eGVyKG1lc3NhZ2VfbG9vcF8ubWVzc2FnZV9sb29wX3Byb3h5KCksIGRhdGFfc291cmNlKSwKLSAgICAgIE5VTEwpOwotfQotCi1zY29wZWRfcHRyPEZpbHRlckNvbGxlY3Rpb24+Ci1QaXBlbGluZUludGVncmF0aW9uVGVzdEJhc2U6OkNyZWF0ZUZpbHRlckNvbGxlY3Rpb24oCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZW11eGVyPiYgZGVtdXhlciwKLSAgICBEZWNyeXB0b3IqIGRlY3J5cHRvcikgewotICBzY29wZWRfcHRyPEZpbHRlckNvbGxlY3Rpb24+IGNvbGxlY3Rpb24obmV3IEZpbHRlckNvbGxlY3Rpb24oKSk7Ci0gIGNvbGxlY3Rpb24tPlNldERlbXV4ZXIoZGVtdXhlcik7Ci0gIHNjb3BlZF9yZWZwdHI8QXVkaW9EZWNvZGVyPiBhdWRpb19kZWNvZGVyID0gbmV3IEZGbXBlZ0F1ZGlvRGVjb2RlcigKLSAgICAgIG1lc3NhZ2VfbG9vcF8ubWVzc2FnZV9sb29wX3Byb3h5KCkpOwotICBzY29wZWRfcmVmcHRyPFZpZGVvRGVjb2Rlcj4gdmlkZW9fZGVjb2RlciA9IG5ldyBGRm1wZWdWaWRlb0RlY29kZXIoCi0gICAgICBtZXNzYWdlX2xvb3BfLm1lc3NhZ2VfbG9vcF9wcm94eSgpKTsKLSAgY29sbGVjdGlvbi0+R2V0QXVkaW9EZWNvZGVycygpLT5wdXNoX2JhY2soYXVkaW9fZGVjb2Rlcik7Ci0gIGNvbGxlY3Rpb24tPkdldFZpZGVvRGVjb2RlcnMoKS0+cHVzaF9iYWNrKHZpZGVvX2RlY29kZXIpOwotCi0gIC8vIERpc2FibGUgZnJhbWUgZHJvcHBpbmcgaWYgaGFzaGluZyBpcyBlbmFibGVkLgotICByZW5kZXJlcl8gPSBuZXcgVmlkZW9SZW5kZXJlckJhc2UoCi0gICAgICBtZXNzYWdlX2xvb3BfLm1lc3NhZ2VfbG9vcF9wcm94eSgpLAotICAgICAgYmFzZTo6QmluZCgmUGlwZWxpbmVJbnRlZ3JhdGlvblRlc3RCYXNlOjpTZXREZWNyeXB0b3IsCi0gICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksIGRlY3J5cHRvciksCi0gICAgICBiYXNlOjpCaW5kKCZQaXBlbGluZUludGVncmF0aW9uVGVzdEJhc2U6Ok9uVmlkZW9SZW5kZXJlclBhaW50LAotICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgIGJhc2U6OkJpbmQoJlBpcGVsaW5lSW50ZWdyYXRpb25UZXN0QmFzZTo6T25TZXRPcGFxdWUsCi0gICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAotICAgICAgIWhhc2hpbmdfZW5hYmxlZF8pOwotICBjb2xsZWN0aW9uLT5BZGRWaWRlb1JlbmRlcmVyKHJlbmRlcmVyXyk7Ci0gIGF1ZGlvX3NpbmtfID0gbmV3IE51bGxBdWRpb1NpbmsoKTsKLSAgaWYgKGhhc2hpbmdfZW5hYmxlZF8pCi0gICAgYXVkaW9fc2lua18tPlN0YXJ0QXVkaW9IYXNoRm9yVGVzdGluZygpOwotICBzY29wZWRfcmVmcHRyPEF1ZGlvUmVuZGVyZXJJbXBsPiBhdWRpb19yZW5kZXJlcihuZXcgQXVkaW9SZW5kZXJlckltcGwoCi0gICAgICBhdWRpb19zaW5rXywKLSAgICAgIGJhc2U6OkJpbmQoJlBpcGVsaW5lSW50ZWdyYXRpb25UZXN0QmFzZTo6U2V0RGVjcnlwdG9yLAotICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLCBkZWNyeXB0b3IpKSk7Ci0gIC8vIERpc2FibGUgdW5kZXJmbG93IGlmIGhhc2hpbmcgaXMgZW5hYmxlZC4KLSAgaWYgKGhhc2hpbmdfZW5hYmxlZF8pCi0gICAgYXVkaW9fcmVuZGVyZXItPkRpc2FibGVVbmRlcmZsb3dGb3JUZXN0aW5nKCk7Ci0gIGNvbGxlY3Rpb24tPkFkZEF1ZGlvUmVuZGVyZXIoYXVkaW9fcmVuZGVyZXIpOwotICByZXR1cm4gY29sbGVjdGlvbi5QYXNzKCk7Ci19Ci0KLXZvaWQgUGlwZWxpbmVJbnRlZ3JhdGlvblRlc3RCYXNlOjpTZXREZWNyeXB0b3IoCi0gICAgRGVjcnlwdG9yKiBkZWNyeXB0b3IsCi0gICAgY29uc3QgRGVjcnlwdG9yUmVhZHlDQiYgZGVjcnlwdG9yX3JlYWR5X2NiKSB7Ci0gIGRlY3J5cHRvcl9yZWFkeV9jYi5SdW4oZGVjcnlwdG9yKTsKLX0KLQotdm9pZCBQaXBlbGluZUludGVncmF0aW9uVGVzdEJhc2U6Ok9uVmlkZW9SZW5kZXJlclBhaW50KCkgewotICBpZiAoIWhhc2hpbmdfZW5hYmxlZF8pCi0gICAgcmV0dXJuOwotICBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IGZyYW1lOwotICByZW5kZXJlcl8tPkdldEN1cnJlbnRGcmFtZSgmZnJhbWUpOwotICBpZiAoZnJhbWUpCi0gICAgZnJhbWUtPkhhc2hGcmFtZUZvclRlc3RpbmcoJm1kNV9jb250ZXh0Xyk7Ci0gIHJlbmRlcmVyXy0+UHV0Q3VycmVudEZyYW1lKGZyYW1lKTsKLX0KLQotc3RkOjpzdHJpbmcgUGlwZWxpbmVJbnRlZ3JhdGlvblRlc3RCYXNlOjpHZXRWaWRlb0hhc2goKSB7Ci0gIERDSEVDSyhoYXNoaW5nX2VuYWJsZWRfKTsKLSAgYmFzZTo6TUQ1RGlnZXN0IGRpZ2VzdDsKLSAgYmFzZTo6TUQ1RmluYWwoJmRpZ2VzdCwgJm1kNV9jb250ZXh0Xyk7Ci0gIHJldHVybiBiYXNlOjpNRDVEaWdlc3RUb0Jhc2UxNihkaWdlc3QpOwotfQotCi1zdGQ6OnN0cmluZyBQaXBlbGluZUludGVncmF0aW9uVGVzdEJhc2U6OkdldEF1ZGlvSGFzaCgpIHsKLSAgRENIRUNLKGhhc2hpbmdfZW5hYmxlZF8pOwotICByZXR1cm4gYXVkaW9fc2lua18tPkdldEF1ZGlvSGFzaEZvclRlc3RpbmcoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9waXBlbGluZV9pbnRlZ3JhdGlvbl90ZXN0X2Jhc2UuaCBiL3NyYy9tZWRpYS9maWx0ZXJzL3BpcGVsaW5lX2ludGVncmF0aW9uX3Rlc3RfYmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzY3ZTgwLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL3BpcGVsaW5lX2ludGVncmF0aW9uX3Rlc3RfYmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9GSUxURVJTX1BJUEVMSU5FX0lOVEVHUkFUSU9OX1RFU1RfQkFTRV9IXwotI2RlZmluZSBNRURJQV9GSUxURVJTX1BJUEVMSU5FX0lOVEVHUkFUSU9OX1RFU1RfQkFTRV9IXwotCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJiYXNlL21kNS5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL251bGxfYXVkaW9fc2luay5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZmlsdGVyX2NvbGxlY3Rpb24uaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3BpcGVsaW5lLmgiCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9jaHVua19kZW11eGVyLmgiCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy92aWRlb19yZW5kZXJlcl9iYXNlLmgiCi0jaW5jbHVkZSAidGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgiCi0KLWNsYXNzIEZpbGVQYXRoOwotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBEZWNyeXB0b3I7Ci0KLS8vIEVtcHR5IE1ENSBoYXNoIHN0cmluZy4gIFVzZWQgdG8gdmVyaWZ5IGVtcHR5IGF1ZGlvIG9yIHZpZGVvIHRyYWNrcy4KLWV4dGVybiBjb25zdCBjaGFyIGtOdWxsSGFzaFtdOwotCi0vLyBJbnRlZ3JhdGlvbiB0ZXN0cyBmb3IgUGlwZWxpbmUuIFJlYWwgZGVtdXhlcnMsIHJlYWwgZGVjb2RlcnMsIGFuZAotLy8gYmFzZSByZW5kZXJlciBpbXBsZW1lbnRhdGlvbnMgYXJlIHVzZWQgdG8gdmVyaWZ5IHBpcGVsaW5lIGZ1bmN0aW9uYWxpdHkuIFRoZQotLy8gcmVuZGVyZXJzIHVzZWQgaW4gdGhlc2UgdGVzdHMgcmVseSBoZWF2aWx5IG9uIHRoZSBBdWRpb1JlbmRlcmVyQmFzZSAmCi0vLyBWaWRlb1JlbmRlcmVyQmFzZSBpbXBsZW1lbnRhdGlvbnMgd2hpY2ggY29udGFpbiBhIG1ham9yaXR5IG9mIHRoZSBjb2RlIHVzZWQKLS8vIGluIHRoZSByZWFsIEF1ZGlvUmVuZGVyZXJJbXBsICYgU2tDYW52YXNWaWRlb1JlbmRlcmVyIGltcGxlbWVudGF0aW9ucyB1c2VkIGluCi0vLyB0aGUgYnJvd3Nlci4gVGhlIHJlbmRlcmVycyBpbiB0aGlzIHRlc3QgZG9uJ3QgYWN0dWFsbHkgd3JpdGUgZGF0YSB0byBhCi0vLyBkaXNwbGF5IG9yIGF1ZGlvIGRldmljZS4gQm90aCBvZiB0aGVzZSBkZXZpY2VzIGFyZSBzaW11bGF0ZWQgc2luY2UgdGhleSBoYXZlCi0vLyBsaXR0bGUgZWZmZWN0IG9uIHZlcmlmeWluZyBwaXBlbGluZSBiZWhhdmlvciBhbmQgYWxsb3cgdGVzdHMgdG8gcnVuIGZhc3RlcgotLy8gdGhhbiByZWFsLXRpbWUuCi1jbGFzcyBQaXBlbGluZUludGVncmF0aW9uVGVzdEJhc2UgewotIHB1YmxpYzoKLSAgUGlwZWxpbmVJbnRlZ3JhdGlvblRlc3RCYXNlKCk7Ci0gIHZpcnR1YWwgflBpcGVsaW5lSW50ZWdyYXRpb25UZXN0QmFzZSgpOwotCi0gIGJvb2wgV2FpdFVudGlsT25FbmRlZCgpOwotICBQaXBlbGluZVN0YXR1cyBXYWl0VW50aWxFbmRlZE9yRXJyb3IoKTsKLSAgYm9vbCBTdGFydChjb25zdCBGaWxlUGF0aCYgZmlsZV9wYXRoLCBQaXBlbGluZVN0YXR1cyBleHBlY3RlZF9zdGF0dXMpOwotICAvLyBFbmFibGUgcGxheWJhY2sgd2l0aCBhdWRpbyBhbmQgdmlkZW8gaGFzaGluZyBlbmFibGVkLiAgRnJhbWUgZHJvcHBpbmcgYW5kCi0gIC8vIGF1ZGlvIHVuZGVyZmxvdyB3aWxsIGJlIGRpc2FibGVkIHRvIGVuc3VyZSBjb25zaXN0ZW50IGhhc2hlcy4KLSAgYm9vbCBTdGFydChjb25zdCBGaWxlUGF0aCYgZmlsZV9wYXRoLCBQaXBlbGluZVN0YXR1cyBleHBlY3RlZF9zdGF0dXMsCi0gICAgICAgICAgICAgYm9vbCBoYXNoaW5nX2VuYWJsZWQpOwotICAvLyBJbml0aWFsaXplIHRoZSBwaXBlbGluZSBhbmQgaWdub3JlIGFueSBzdGF0dXMgdXBkYXRlcy4gIFVzZWZ1bCBmb3IgdGVzdGluZwotICAvLyBpbnZhbGlkIGF1ZGlvL3ZpZGVvIGNsaXBzIHdoaWNoIGRvbid0IGhhdmUgZGV0ZXJtaW5pc3RpYyByZXN1bHRzLgotICBib29sIFN0YXJ0KGNvbnN0IEZpbGVQYXRoJiBmaWxlX3BhdGgpOwotCi0gIHZvaWQgUGxheSgpOwotICB2b2lkIFBhdXNlKCk7Ci0gIGJvb2wgU2VlayhiYXNlOjpUaW1lRGVsdGEgc2Vla190aW1lKTsKLSAgdm9pZCBTdG9wKCk7Ci0gIGJvb2wgV2FpdFVudGlsQ3VycmVudFRpbWVJc0FmdGVyKGNvbnN0IGJhc2U6OlRpbWVEZWx0YSYgd2FpdF90aW1lKTsKLSAgc2NvcGVkX3B0cjxGaWx0ZXJDb2xsZWN0aW9uPiBDcmVhdGVGaWx0ZXJDb2xsZWN0aW9uKAotICAgICAgY29uc3QgRmlsZVBhdGgmIGZpbGVfcGF0aCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgTUQ1IGhhc2ggb2YgYWxsIHZpZGVvIGZyYW1lcyBzZWVuLiAgU2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2UKLSAgLy8gYWZ0ZXIgcGxheWJhY2sgY29tcGxldGVzLiAgRmlyc3QgdGltZSBoYXNoZXMgc2hvdWxkIGJlIGdlbmVyYXRlZCB3aXRoCi0gIC8vIC0tdmlkZW8tdGhyZWFkcz0xIHRvIGVuc3VyZSBjb3JyZWN0bmVzcy4gIFBpcGVsaW5lIG11c3QgaGF2ZSBiZWVuIHN0YXJ0ZWQKLSAgLy8gd2l0aCBoYXNoaW5nIGVuYWJsZWQuCi0gIHN0ZDo6c3RyaW5nIEdldFZpZGVvSGFzaCgpOwotCi0gIC8vIFJldHVybnMgdGhlIE1ENSBoYXNoIG9mIGFsbCBhdWRpbyBmcmFtZXMgc2Vlbi4gIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlCi0gIC8vIGFmdGVyIHBsYXliYWNrIGNvbXBsZXRlcy4gIFBpcGVsaW5lIG11c3QgaGF2ZSBiZWVuIHN0YXJ0ZWQgd2l0aCBoYXNoaW5nCi0gIC8vIGVuYWJsZWQuCi0gIHN0ZDo6c3RyaW5nIEdldEF1ZGlvSGFzaCgpOwotCi0gcHJvdGVjdGVkOgotICBNZXNzYWdlTG9vcCBtZXNzYWdlX2xvb3BfOwotICBiYXNlOjpNRDVDb250ZXh0IG1kNV9jb250ZXh0XzsKLSAgYm9vbCBoYXNoaW5nX2VuYWJsZWRfOwotICBzY29wZWRfcmVmcHRyPFBpcGVsaW5lPiBwaXBlbGluZV87Ci0gIHNjb3BlZF9yZWZwdHI8VmlkZW9SZW5kZXJlckJhc2U+IHJlbmRlcmVyXzsKLSAgc2NvcGVkX3JlZnB0cjxOdWxsQXVkaW9TaW5rPiBhdWRpb19zaW5rXzsKLSAgYm9vbCBlbmRlZF87Ci0gIFBpcGVsaW5lU3RhdHVzIHBpcGVsaW5lX3N0YXR1c187Ci0KLSAgdm9pZCBPblN0YXR1c0NhbGxiYWNrQ2hlY2tlZChQaXBlbGluZVN0YXR1cyBleHBlY3RlZF9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGlwZWxpbmVTdGF0dXMgc3RhdHVzKTsKLSAgdm9pZCBPblN0YXR1c0NhbGxiYWNrKFBpcGVsaW5lU3RhdHVzIHN0YXR1cyk7Ci0gIFBpcGVsaW5lU3RhdHVzQ0IgUXVpdE9uU3RhdHVzQ0IoUGlwZWxpbmVTdGF0dXMgZXhwZWN0ZWRfc3RhdHVzKTsKLSAgdm9pZCBPbkVuZGVkKFBpcGVsaW5lU3RhdHVzIHN0YXR1cyk7Ci0gIHZvaWQgT25FcnJvcihQaXBlbGluZVN0YXR1cyBzdGF0dXMpOwotICB2b2lkIFF1aXRBZnRlckN1cnJlbnRUaW1lVGFzayhjb25zdCBiYXNlOjpUaW1lRGVsdGEmIHF1aXRfdGltZSk7Ci0gIHNjb3BlZF9wdHI8RmlsdGVyQ29sbGVjdGlvbj4gQ3JlYXRlRmlsdGVyQ29sbGVjdGlvbigKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVtdXhlcj4mIGRlbXV4ZXIsIERlY3J5cHRvciogZGVjcnlwdG9yKTsKLSAgdm9pZCBTZXREZWNyeXB0b3IoRGVjcnlwdG9yKiBkZWNyeXB0b3IsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY3J5cHRvclJlYWR5Q0ImIGRlY3J5cHRvcl9yZWFkeV9jYik7Ci0gIHZvaWQgT25WaWRlb1JlbmRlcmVyUGFpbnQoKTsKLQotICBNT0NLX01FVEhPRDEoT25TZXRPcGFxdWUsIHZvaWQoYm9vbCkpOwotICBNT0NLX01FVEhPRDEoT25CdWZmZXJpbmdTdGF0ZSwgdm9pZChQaXBlbGluZTo6QnVmZmVyaW5nU3RhdGUpKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0ZJTFRFUlNfUElQRUxJTkVfSU5URUdSQVRJT05fVEVTVF9CQVNFX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9hdS5jYyBiL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX2F1LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjllODhiLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX2F1LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL2VuZGlhbl91dGlsLmgiCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9zaGVsbF9hdS5oIgotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvc2hlbGxfcGFyc2VyLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBtZWRpYTsKLQotYm9vbCBSZWFkQnl0ZXModWludDY0IG9mZnNldCwKLSAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgdWludDgqIGJ1ZmZlciwKLSAgICAgICAgICAgICAgIFNoZWxsRGF0YVNvdXJjZVJlYWRlciogcmVhZGVyKSB7Ci0gIGlmIChyZWFkZXItPkJsb2NraW5nUmVhZChvZmZzZXQsIHNpemUsIGJ1ZmZlcikgIT0gc2l6ZSkgewotICAgIERMT0coRVJST1IpIDw8ICJ1bmFibGUgdG8gZG93bmxvYWQgQVUiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gPT09PSBTaGVsbEVuZE9mU3RyZWFtQVUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotY2xhc3MgU2hlbGxFbmRPZlN0cmVhbUFVIDogcHVibGljIG1lZGlhOjpTaGVsbEFVIHsKLSBwdWJsaWM6Ci0gIFNoZWxsRW5kT2ZTdHJlYW1BVShUeXBlIHR5cGUsIFRpbWVEZWx0YSB0aW1lc3RhbXApCi0gICAgICA6IHR5cGVfKHR5cGUpLCB0aW1lc3RhbXBfKHRpbWVzdGFtcCksIGR1cmF0aW9uXyhrSW5maW5pdGVEdXJhdGlvbigpKSB7fQotCi0gcHJpdmF0ZToKLSAgYm9vbCBJc0VuZE9mU3RyZWFtKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gdHJ1ZTsgfQotICBib29sIElzVmFsaWQoKSBjb25zdCBPVkVSUklERSB7IHJldHVybiB0cnVlOyB9Ci0gIGJvb2wgUmVhZChTaGVsbERhdGFTb3VyY2VSZWFkZXIqIHJlYWRlciwKLSAgICAgICAgICAgIG1lZGlhOjpEZWNvZGVyQnVmZmVyKiBidWZmZXIpIE9WRVJSSURFIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIFR5cGUgR2V0VHlwZSgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIHR5cGVfOyB9Ci0gIGJvb2wgSXNLZXlmcmFtZSgpIGNvbnN0IE9WRVJSSURFIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGJvb2wgQWRkUHJlcGVuZCgpIGNvbnN0IE9WRVJSSURFIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHNpemVfdCBHZXRTaXplKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gMDsgfQotICBzaXplX3QgR2V0TWF4U2l6ZSgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIDA7IH0KLSAgVGltZURlbHRhIEdldFRpbWVzdGFtcCgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIHRpbWVzdGFtcF87IH0KLSAgVGltZURlbHRhIEdldER1cmF0aW9uKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gZHVyYXRpb25fOyB9Ci0gIHZvaWQgU2V0RHVyYXRpb24oVGltZURlbHRhIGR1cmF0aW9uKSBPVkVSUklERSB7IGR1cmF0aW9uXyA9IGR1cmF0aW9uOyB9Ci0gIHZvaWQgU2V0VGltZXN0YW1wKFRpbWVEZWx0YSB0aW1lc3RhbXApIE9WRVJSSURFIHsgdGltZXN0YW1wXyA9IHRpbWVzdGFtcDsgfQotCi0gIFR5cGUgdHlwZV87Ci0gIFRpbWVEZWx0YSB0aW1lc3RhbXBfOwotICBUaW1lRGVsdGEgZHVyYXRpb25fOwotfTsKLQotLy8gPT09PSBTaGVsbEF1ZGlvQVUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1jbGFzcyBTaGVsbEF1ZGlvQVUgOiBwdWJsaWMgbWVkaWE6OlNoZWxsQVUgewotIHB1YmxpYzoKLSAgU2hlbGxBdWRpb0FVKHVpbnQ2NCBvZmZzZXQsCi0gICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgIHNpemVfdCBwcmVwZW5kX3NpemUsCi0gICAgICAgICAgICAgICBib29sIGlzX2tleWZyYW1lLAotICAgICAgICAgICAgICAgVGltZURlbHRhIHRpbWVzdGFtcCwKLSAgICAgICAgICAgICAgIFRpbWVEZWx0YSBkdXJhdGlvbiwKLSAgICAgICAgICAgICAgIFNoZWxsUGFyc2VyKiBwYXJzZXIpOwotCi0gcHJpdmF0ZToKLSAgYm9vbCBJc0VuZE9mU3RyZWFtKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gZmFsc2U7IH0KLSAgYm9vbCBJc1ZhbGlkKCkgY29uc3QgT1ZFUlJJREUgewotICAgIHJldHVybiBvZmZzZXRfICE9IDAgJiYgc2l6ZV8gIT0gMCAmJiB0aW1lc3RhbXBfICE9IG1lZGlhOjprTm9UaW1lc3RhbXAoKTsKLSAgfQotICBib29sIFJlYWQoU2hlbGxEYXRhU291cmNlUmVhZGVyKiByZWFkZXIsIERlY29kZXJCdWZmZXIqIGJ1ZmZlcikgT1ZFUlJJREU7Ci0gIFR5cGUgR2V0VHlwZSgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIG1lZGlhOjpEZW11eGVyU3RyZWFtOjpBVURJTzsgfQotICBib29sIElzS2V5ZnJhbWUoKSBjb25zdCBPVkVSUklERSB7IHJldHVybiBpc19rZXlmcmFtZV87IH0KLSAgYm9vbCBBZGRQcmVwZW5kKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gdHJ1ZTsgfQotICBzaXplX3QgR2V0U2l6ZSgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIHNpemVfOyB9Ci0gIHNpemVfdCBHZXRNYXhTaXplKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gc2l6ZV8gKyBwcmVwZW5kX3NpemVfOyB9Ci0gIFRpbWVEZWx0YSBHZXRUaW1lc3RhbXAoKSBjb25zdCBPVkVSUklERSB7IHJldHVybiB0aW1lc3RhbXBfOyB9Ci0gIFRpbWVEZWx0YSBHZXREdXJhdGlvbigpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIGR1cmF0aW9uXzsgfQotICB2b2lkIFNldER1cmF0aW9uKFRpbWVEZWx0YSBkdXJhdGlvbikgT1ZFUlJJREUgeyBkdXJhdGlvbl8gPSBkdXJhdGlvbjsgfQotICB2b2lkIFNldFRpbWVzdGFtcChUaW1lRGVsdGEgdGltZXN0YW1wKSBPVkVSUklERSB7IHRpbWVzdGFtcF8gPSB0aW1lc3RhbXA7IH0KLQotICB1aW50NjQgb2Zmc2V0XzsKLSAgc2l6ZV90IHNpemVfOwotICBzaXplX3QgcHJlcGVuZF9zaXplXzsKLSAgYm9vbCBpc19rZXlmcmFtZV87Ci0gIFRpbWVEZWx0YSB0aW1lc3RhbXBfOwotICBUaW1lRGVsdGEgZHVyYXRpb25fOwotICBtZWRpYTo6U2hlbGxQYXJzZXIqIHBhcnNlcl87Ci19OwotCi1TaGVsbEF1ZGlvQVU6OlNoZWxsQXVkaW9BVSh1aW50NjQgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcHJlcGVuZF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19rZXlmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVEZWx0YSB0aW1lc3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lRGVsdGEgZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTaGVsbFBhcnNlciogcGFyc2VyKQotICAgIDogb2Zmc2V0XyhvZmZzZXQpLAotICAgICAgc2l6ZV8oc2l6ZSksCi0gICAgICBwcmVwZW5kX3NpemVfKHByZXBlbmRfc2l6ZSksCi0gICAgICBpc19rZXlmcmFtZV8oaXNfa2V5ZnJhbWUpLAotICAgICAgdGltZXN0YW1wXyh0aW1lc3RhbXApLAotICAgICAgZHVyYXRpb25fKGR1cmF0aW9uKSwKLSAgICAgIHBhcnNlcl8ocGFyc2VyKSB7fQotCi1ib29sIFNoZWxsQXVkaW9BVTo6UmVhZChTaGVsbERhdGFTb3VyY2VSZWFkZXIqIHJlYWRlciwgRGVjb2RlckJ1ZmZlciogYnVmZmVyKSB7Ci0gIERDSEVDS19MRShzaXplXyArIHByZXBlbmRfc2l6ZV8sIGJ1ZmZlci0+R2V0RGF0YVNpemUoKSk7Ci0gIGlmICghUmVhZEJ5dGVzKG9mZnNldF8sIHNpemVfLCBidWZmZXItPkdldFdyaXRhYmxlRGF0YSgpICsgcHJlcGVuZF9zaXplXywKLSAgICAgICAgICAgICAgICAgcmVhZGVyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFwYXJzZXJfLT5QcmVwZW5kKHRoaXMsIGJ1ZmZlcikpIHsKLSAgICBETE9HKEVSUk9SKSA8PCAicHJlcGVuZCBmYWlsIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gPT09PSBTaGVsbFZpZGVvQVUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1jbGFzcyBTaGVsbFZpZGVvQVUgOiBwdWJsaWMgbWVkaWE6OlNoZWxsQVUgewotIHB1YmxpYzoKLSAgU2hlbGxWaWRlb0FVKHVpbnQ2NCBvZmZzZXQsCi0gICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgIHNpemVfdCBwcmVwZW5kX3NpemUsCi0gICAgICAgICAgICAgICB1aW50OCBsZW5ndGhfb2ZfbmFsdV9zaXplLAotICAgICAgICAgICAgICAgYm9vbCBpc19rZXlmcmFtZSwKLSAgICAgICAgICAgICAgIFRpbWVEZWx0YSB0aW1lc3RhbXAsCi0gICAgICAgICAgICAgICBUaW1lRGVsdGEgZHVyYXRpb24sCi0gICAgICAgICAgICAgICBTaGVsbFBhcnNlciogcGFyc2VyKTsKLQotIHByaXZhdGU6Ci0gIGJvb2wgSXNFbmRPZlN0cmVhbSgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIGZhbHNlOyB9Ci0gIGJvb2wgSXNWYWxpZCgpIGNvbnN0IE9WRVJSSURFIHsKLSAgICByZXR1cm4gb2Zmc2V0XyAhPSAwICYmIHNpemVfICE9IDAgJiYgdGltZXN0YW1wXyAhPSBtZWRpYTo6a05vVGltZXN0YW1wKCk7Ci0gIH0KLSAgYm9vbCBSZWFkKFNoZWxsRGF0YVNvdXJjZVJlYWRlciogcmVhZGVyLCBEZWNvZGVyQnVmZmVyKiBidWZmZXIpIE9WRVJSSURFOwotICBUeXBlIEdldFR5cGUoKSBjb25zdCBPVkVSUklERSB7IHJldHVybiBtZWRpYTo6RGVtdXhlclN0cmVhbTo6VklERU87IH0KLSAgYm9vbCBJc0tleWZyYW1lKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gaXNfa2V5ZnJhbWVfOyB9Ci0gIGJvb2wgQWRkUHJlcGVuZCgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIGlzX2tleWZyYW1lXzsgfQotICBzaXplX3QgR2V0U2l6ZSgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIHNpemVfOyB9Ci0gIHNpemVfdCBHZXRNYXhTaXplKCkgY29uc3QgT1ZFUlJJREUgewotICAgIC8vIFRPRE8gOiBUaGlzIGNvZGUgaXMgYSBwcm9vZiBvZiBjb25jZXB0LiBJdCBzaG91bGQgYmUgZml4ZWQKLSAgICAvLyB3aXRoIG1vcmUgcmVhc29uYWJsZSB2YWx1ZSBvbmNlIHdlIGhhdmUgZW5vdWdoIGRhdGEuCi0gICAgcmV0dXJuIHNpemVfICsgcHJlcGVuZF9zaXplXyArIHNpemVfIC8gMTAyNCArIDEwMjQ7Ci0gIH0KLSAgVGltZURlbHRhIEdldFRpbWVzdGFtcCgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIHRpbWVzdGFtcF87IH0KLSAgVGltZURlbHRhIEdldER1cmF0aW9uKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gZHVyYXRpb25fOyB9Ci0gIHZvaWQgU2V0RHVyYXRpb24oVGltZURlbHRhIGR1cmF0aW9uKSBPVkVSUklERSB7IGR1cmF0aW9uXyA9IGR1cmF0aW9uOyB9Ci0gIHZvaWQgU2V0VGltZXN0YW1wKFRpbWVEZWx0YSB0aW1lc3RhbXApIE9WRVJSSURFIHsgdGltZXN0YW1wXyA9IHRpbWVzdGFtcDsgfQotCi0gIHVpbnQ2NCBvZmZzZXRfOwotICBzaXplX3Qgc2l6ZV87Ci0gIHNpemVfdCBwcmVwZW5kX3NpemVfOwotICB1aW50OCBsZW5ndGhfb2ZfbmFsdV9zaXplXzsKLSAgYm9vbCBpc19rZXlmcmFtZV87Ci0gIFRpbWVEZWx0YSB0aW1lc3RhbXBfOwotICBUaW1lRGVsdGEgZHVyYXRpb25fOwotICBtZWRpYTo6U2hlbGxQYXJzZXIqIHBhcnNlcl87Ci19OwotCi1TaGVsbFZpZGVvQVU6OlNoZWxsVmlkZW9BVSh1aW50NjQgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcHJlcGVuZF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggbGVuZ3RoX29mX25hbHVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfa2V5ZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lRGVsdGEgdGltZXN0YW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZURlbHRhIGR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGxQYXJzZXIqIHBhcnNlcikKLSAgICA6IG9mZnNldF8ob2Zmc2V0KSwKLSAgICAgIHNpemVfKHNpemUpLAotICAgICAgcHJlcGVuZF9zaXplXyhwcmVwZW5kX3NpemUpLAotICAgICAgbGVuZ3RoX29mX25hbHVfc2l6ZV8obGVuZ3RoX29mX25hbHVfc2l6ZSksCi0gICAgICBpc19rZXlmcmFtZV8oaXNfa2V5ZnJhbWUpLAotICAgICAgdGltZXN0YW1wXyh0aW1lc3RhbXApLAotICAgICAgZHVyYXRpb25fKGR1cmF0aW9uKSwKLSAgICAgIHBhcnNlcl8ocGFyc2VyKSB7Ci0gIENIRUNLX0xFKGxlbmd0aF9vZl9uYWx1X3NpemVfLCA0KTsKLSAgQ0hFQ0tfTkUobGVuZ3RoX29mX25hbHVfc2l6ZV8sIDMpOwotfQotCi1ib29sIFNoZWxsVmlkZW9BVTo6UmVhZChTaGVsbERhdGFTb3VyY2VSZWFkZXIqIHJlYWRlciwgRGVjb2RlckJ1ZmZlciogYnVmZmVyKSB7Ci0gIHNpemVfdCBhdV9sZWZ0ID0gc2l6ZV87ICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZXMgbGVmdCBpbiB0aGUgQVUKLSAgdWludDY0IGF1X29mZnNldCA9IG9mZnNldF87ICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgdG8gcmVhZCBpbiB0aGUgcmVhZGVyCi0gIHNpemVfdCBidWZfbGVmdCA9IGJ1ZmZlci0+R2V0QWxsb2NhdGVkU2l6ZSgpOyAgLy8gYnl0ZXMgbGVmdCBpbiB0aGUgYnVmZmVyCi0gIC8vIFRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uIGluIHRoZSBidWZmZXIKLSAgdWludDgqIGJ1ZiA9IGJ1ZmZlci0+R2V0V3JpdGFibGVEYXRhKCkgKyBwcmVwZW5kX3NpemVfOwotCi0gIC8vIFRoZSBOQUxVIGlzIHN0b3JlZCBhcyBbc2l6ZV1bZGF0YV1bc2l6ZV1bZGF0YV0uLi4uIFdlIGFyZSBnb2luZyB0bwotICAvLyB0cmFuc2Zvcm0gaXQgaW50byBbc3RhcnQgY29kZV1bZGF0YV1bc3RhcnQgY29kZV1bZGF0YV0uLi4uCi0gIC8vIFRoZSBsZW5ndGggb2Ygc2l6ZSBpcyBpbmRpY2F0ZWQgYnkgbGVuZ3RoX29mX25hbHVfc2l6ZV8KLSAgd2hpbGUgKGF1X2xlZnQgPj0gbGVuZ3RoX29mX25hbHVfc2l6ZV8gJiYgYnVmX2xlZnQgPj0ga0FubmV4QlN0YXJ0Q29kZSkgewotICAgIHVpbnQ4IHNpemVfYnVmWzRdOwotICAgIHVpbnQzMiBuYWxfc2l6ZTsKLQotICAgIC8vIFN0b3JlIFtzdGFydCBjb2RlXQotICAgIGVuZGlhbl91dGlsOjpzdG9yZV91aW50MzJfYmlnX2VuZGlhbihrQW5uZXhCU3RhcnRDb2RlLCBidWYpOwotICAgIGJ1ZiArPSBrQW5uZXhCU3RhcnRDb2RlU2l6ZTsKLSAgICBidWZfbGVmdCAtPSBrQW5uZXhCU3RhcnRDb2RlU2l6ZTsKLQotICAgIC8vIFJlYWQgW3NpemVdCi0gICAgaWYgKCFSZWFkQnl0ZXMoYXVfb2Zmc2V0LCBsZW5ndGhfb2ZfbmFsdV9zaXplXywgc2l6ZV9idWYsIHJlYWRlcikpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBhdV9vZmZzZXQgKz0gbGVuZ3RoX29mX25hbHVfc2l6ZV87Ci0gICAgYXVfbGVmdCAtPSBsZW5ndGhfb2ZfbmFsdV9zaXplXzsKLQotICAgIGlmIChsZW5ndGhfb2ZfbmFsdV9zaXplXyA9PSAxKSB7Ci0gICAgICBuYWxfc2l6ZSA9IHNpemVfYnVmWzBdOwotICAgIH0gZWxzZSBpZiAobGVuZ3RoX29mX25hbHVfc2l6ZV8gPT0gMikgewotICAgICAgbmFsX3NpemUgPSBlbmRpYW5fdXRpbDo6bG9hZF91aW50MTZfYmlnX2VuZGlhbihzaXplX2J1Zik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIERDSEVDS19FUShsZW5ndGhfb2ZfbmFsdV9zaXplXywgNCk7Ci0gICAgICBuYWxfc2l6ZSA9IGVuZGlhbl91dGlsOjpsb2FkX3VpbnQzMl9iaWdfZW5kaWFuKHNpemVfYnVmKTsKLSAgICB9Ci0KLSAgICBpZiAoYXVfbGVmdCA8IG5hbF9zaXplIHx8IGJ1Zl9sZWZ0IDwgbmFsX3NpemUpCi0gICAgICBicmVhazsKLQotICAgIC8vIFJlYWQgdGhlIFtkYXRhXSBmcm9tIHJlYWRlciBpbnRvIGJ1ZgotICAgIGlmICghUmVhZEJ5dGVzKGF1X29mZnNldCwgbmFsX3NpemUsIGJ1ZiwgcmVhZGVyKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGJ1ZiArPSBuYWxfc2l6ZTsKLSAgICBhdV9vZmZzZXQgKz0gbmFsX3NpemU7Ci0gICAgYXVfbGVmdCAtPSBuYWxfc2l6ZTsKLSAgICBidWZfbGVmdCAtPSBuYWxfc2l6ZTsKLSAgfQotCi0gIGlmIChhdV9sZWZ0ICE9IDApIHsKLSAgICBETE9HKEVSUk9SKSA8PCAiY29ycnVwdGVkIE5BTFUiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHNpemVfID0gYnVmIC0gYnVmZmVyLT5HZXRXcml0YWJsZURhdGEoKTsKLSAgYnVmZmVyLT5TaHJpbmtUbyhzaXplXyk7Ci0KLSAgaWYgKCFwYXJzZXJfLT5QcmVwZW5kKHRoaXMsIGJ1ZmZlcikpIHsKLSAgICBETE9HKEVSUk9SKSA8PCAicHJlcGVuZCBmYWlsIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vID09PT0gU2hlbGxBVSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVNoZWxsQVU6OlNoZWxsQVUoKSB7fQotCi1TaGVsbEFVOjp+U2hlbGxBVSgpIHt9Ci0KLS8vIHN0YXRpYwotc2NvcGVkX3JlZnB0cjxTaGVsbEFVPiBTaGVsbEFVOjpDcmVhdGVFbmRPZlN0cmVhbUFVKERlbXV4ZXJTdHJlYW06OlR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lRGVsdGEgdGltZXN0YW1wKSB7Ci0gIHJldHVybiBuZXcgU2hlbGxFbmRPZlN0cmVhbUFVKHR5cGUsIHRpbWVzdGFtcCk7Ci19Ci0KLS8vIHN0YXRpYwotc2NvcGVkX3JlZnB0cjxTaGVsbEFVPiBTaGVsbEFVOjpDcmVhdGVBdWRpb0FVKHVpbnQ2NCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHByZXBlbmRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2tleWZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVEZWx0YSB0aW1lc3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZURlbHRhIGR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoZWxsUGFyc2VyKiBwYXJzZXIpIHsKLSAgcmV0dXJuIG5ldyBTaGVsbEF1ZGlvQVUob2Zmc2V0LCBzaXplLCBwcmVwZW5kX3NpemUsIGlzX2tleWZyYW1lLCB0aW1lc3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLCBwYXJzZXIpOwotfQotCi0vLyBzdGF0aWMKLXNjb3BlZF9yZWZwdHI8U2hlbGxBVT4gU2hlbGxBVTo6Q3JlYXRlVmlkZW9BVSh1aW50NjQgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwcmVwZW5kX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggbGVuZ3RoX29mX25hbHVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2tleWZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVEZWx0YSB0aW1lc3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZURlbHRhIGR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoZWxsUGFyc2VyKiBwYXJzZXIpIHsKLSAgcmV0dXJuIG5ldyBTaGVsbFZpZGVvQVUob2Zmc2V0LCBzaXplLCBwcmVwZW5kX3NpemUsIGxlbmd0aF9vZl9uYWx1X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2tleWZyYW1lLCB0aW1lc3RhbXAsIGR1cmF0aW9uLCBwYXJzZXIpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX2F1LmggYi9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9hdS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDhjYTM5Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX2F1LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX0ZJTFRFUlNfU0hFTExfQVVfSF8KLSNkZWZpbmUgTUVESUFfRklMVEVSU19TSEVMTF9BVV9IXwotCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlbXV4ZXJfc3RyZWFtLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaGVsbF9idWZmZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2hlbGxfZGF0YV9zb3VyY2VfcmVhZGVyLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIFNoZWxsUGFyc2VyOwotCi0vLyBBbm5leEIgc3RhcnQgY29kZSBpcyA0IGJ5dGVzIDB4MDAwMDAwMDEgYmlnLWVuZGlhbgotc3RhdGljIGNvbnN0IGludCBrQW5uZXhCU3RhcnRDb2RlU2l6ZSA9IDQ7Ci1zdGF0aWMgY29uc3QgdWludDMyIGtBbm5leEJTdGFydENvZGUgPSAweDAwMDAwMDAxOwotCi0vLyBUaGUgYmFzaWMgdW5pdCBvZiBjdXJyZW5jeSBiZXR3ZWVuIFNoZWxsRGVtdXhlciBhbmQgU2hlbGxQYXJzZXIsIHRoZSBTaGVsbEFVCi0vLyBkZWZpbmVzIGFsbCBuZWVkZWQgaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gQWNjZXNzVW5pdCAoRnJhbWUpIG9mIGVuY29kZWQKLS8vIG1lZGlhIGRhdGEuCi1jbGFzcyBTaGVsbEFVIDogcHVibGljIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPFNoZWxsQVU+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgYmFzZTo6VGltZURlbHRhIFRpbWVEZWx0YTsKLSAgdHlwZWRlZiBEZW11eGVyU3RyZWFtOjpUeXBlIFR5cGU7Ci0KLSAgc3RhdGljIHNjb3BlZF9yZWZwdHI8U2hlbGxBVT4gQ3JlYXRlRW5kT2ZTdHJlYW1BVShUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZURlbHRhIHRpbWVzdGFtcCk7Ci0gIHN0YXRpYyBzY29wZWRfcmVmcHRyPFNoZWxsQVU+IENyZWF0ZUF1ZGlvQVUodWludDY0IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcHJlcGVuZF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfa2V5ZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZURlbHRhIHRpbWVzdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lRGVsdGEgZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGxQYXJzZXIqIHBhcnNlcik7Ci0gIHN0YXRpYyBzY29wZWRfcmVmcHRyPFNoZWxsQVU+IENyZWF0ZVZpZGVvQVUodWludDY0IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcHJlcGVuZF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4IGxlbmd0aF9vZl9uYWx1X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19rZXlmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lRGVsdGEgdGltZXN0YW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVEZWx0YSBkdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaGVsbFBhcnNlciogcGFyc2VyKTsKLQotICB2aXJ0dWFsIGJvb2wgSXNFbmRPZlN0cmVhbSgpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCBib29sIElzVmFsaWQoKSBjb25zdCA9IDA7Ci0gIC8vIFJlYWQgYW4gQVUgZnJvbSByZWFkZXIgdG8gYnVmZmVyIGFuZCBhbHNvIGRvIGFsbCB0aGUgbmVjZXNzYXJ5IG9wZXJhdGlvbnMKLSAgLy8gbGlrZSBwcmVwZW5kaW5nIGhlYWQgdG8gbWFrZSBpdCByZWFkeSB0byBkZWNvZGUuCi0gIHZpcnR1YWwgYm9vbCBSZWFkKFNoZWxsRGF0YVNvdXJjZVJlYWRlciogcmVhZGVyLCBEZWNvZGVyQnVmZmVyKiBidWZmZXIpID0gMDsKLSAgdmlydHVhbCBUeXBlIEdldFR5cGUoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBJc0tleWZyYW1lKCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIGJvb2wgQWRkUHJlcGVuZCgpIGNvbnN0ID0gMDsKLSAgLy8gR2V0IHRoZSBzaXplIG9mIHRoaXMgQVUsIGl0IGlzIGFsd2F5cyBubyBsYXJnZXIgdGhhbiBpdHMgbWF4IHNpemUuCi0gIHZpcnR1YWwgc2l6ZV90IEdldFNpemUoKSBjb25zdCA9IDA7Ci0gIC8vIEdldCB0aGUgbWF4IHJlcXVpcmVkIGJ1ZmZlciBvZiB0aGlzIEFVCi0gIHZpcnR1YWwgc2l6ZV90IEdldE1heFNpemUoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgVGltZURlbHRhIEdldFRpbWVzdGFtcCgpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCBUaW1lRGVsdGEgR2V0RHVyYXRpb24oKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBTZXREdXJhdGlvbihUaW1lRGVsdGEgZHVyYXRpb24pID0gMDsKLSAgdmlydHVhbCB2b2lkIFNldFRpbWVzdGFtcChUaW1lRGVsdGEgdGltZXN0YW1wKSA9IDA7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGZyaWVuZCBjbGFzcyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxTaGVsbEFVPjsKLQotICBTaGVsbEFVKCk7Ci0gIHZpcnR1YWwgflNoZWxsQVUoKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0ZJTFRFUlNfU0hFTExfQVVfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX2F1ZGlvX2RlY29kZXJfaW1wbC5jYyBiL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX2F1ZGlvX2RlY29kZXJfaW1wbC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE0MWRmMy4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9hdWRpb19kZWNvZGVyX2ltcGwuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvc2hlbGxfYXVkaW9fZGVjb2Rlcl9pbXBsLmgiCi0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9iaW5kX3RvX2xvb3AuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3BpcGVsaW5lX3N0YXR1cy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2hlbGxfbWVkaWFfc3RhdGlzdGljcy5oIgotI2luY2x1ZGUgIm1lZGlhL21wNC9hYWMuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotdXNpbmcgYmFzZTo6VGltZTsKLXVzaW5nIGJhc2U6OlRpbWVEZWx0YTsKLQotY29uc3Qgc2l6ZV90IGtGcmFtZXNQZXJBY2Nlc3NVbml0ID0gbXA0OjpBQUM6OmtGcmFtZXNQZXJBY2Nlc3NVbml0OwotCi1uYW1lc3BhY2UgewotCi1ib29sIFZhbGlkYXRlQ29uZmlnKGNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYgY29uZmlnKSB7Ci0gIGlmICghY29uZmlnLklzVmFsaWRDb25maWcoKSkgewotICAgIE5PVFJFQUNIRUQoKSA8PCAiSW52YWxpZCBhdWRpbyBzdHJlYW0gLSIKLSAgICAgICAgICAgICAgICAgPDwgIiBjb2RlYzogIiA8PCBjb25maWcuY29kZWMoKQotICAgICAgICAgICAgICAgICA8PCAiIGNoYW5uZWwgbGF5b3V0OiAiIDw8IGNvbmZpZy5jaGFubmVsX2xheW91dCgpCi0gICAgICAgICAgICAgICAgIDw8ICIgYml0cyBwZXIgY2hhbm5lbDogIiA8PCBjb25maWcuYml0c19wZXJfY2hhbm5lbCgpCi0gICAgICAgICAgICAgICAgIDw8ICIgc2FtcGxlcyBwZXIgc2Vjb25kOiAiIDw8IGNvbmZpZy5zYW1wbGVzX3Blcl9zZWNvbmQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBjaGVjayB0aGlzIGlzIGEgY29uZmlnIHdlIGNhbiBkZWNvZGUgYW5kIHBsYXkgYmFjawotICBpZiAoY29uZmlnLmNvZGVjKCkgIT0ga0NvZGVjQUFDKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFNoZWxsQXVkaW9EZWNvZGVySW1wbAotLy8KLVNoZWxsQXVkaW9EZWNvZGVySW1wbDo6U2hlbGxBdWRpb0RlY29kZXJJbXBsKAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4mIG1lc3NhZ2VfbG9vcCwKLSAgICBTaGVsbFJhd0F1ZGlvRGVjb2RlckZhY3RvcnkqIHJhd19hdWRpb19kZWNvZGVyX2ZhY3RvcnkpCi0gICAgOiBtZXNzYWdlX2xvb3BfKG1lc3NhZ2VfbG9vcCksCi0gICAgICByYXdfYXVkaW9fZGVjb2Rlcl9mYWN0b3J5XyhyYXdfYXVkaW9fZGVjb2Rlcl9mYWN0b3J5KSwKLSAgICAgIGRlbXV4ZXJfcmVhZF9hbmRfZGVjb2RlX2luX3Byb2dyZXNzXyhmYWxzZSksCi0gICAgICBzYW1wbGVzX3Blcl9zZWNvbmRfKDApLAotICAgICAgbnVtX2NoYW5uZWxzXygwKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfKTsKLSAgRENIRUNLKHJhd19hdWRpb19kZWNvZGVyX2ZhY3RvcnkpOwotfQotCi1TaGVsbEF1ZGlvRGVjb2RlckltcGw6On5TaGVsbEF1ZGlvRGVjb2RlckltcGwoKSB7Ci0gIERDSEVDSyhyZWFkX2NiXy5pc19udWxsKCkpOwotICBEQ0hFQ0socmVzZXRfY2JfLmlzX251bGwoKSk7Ci19Ci0KLXZvaWQgU2hlbGxBdWRpb0RlY29kZXJJbXBsOjpJbml0aWFsaXplKAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4mIHN0cmVhbSwKLSAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBzdGF0dXNfY2IsCi0gICAgY29uc3QgU3RhdGlzdGljc0NCJiBzdGF0aXN0aWNzX2NiKSB7Ci0gIFRSQUNFX0VWRU5UMCgibWVkaWFfc3RhY2siLCAiU2hlbGxBdWRpb0RlY29kZXJJbXBsOjpJbml0aWFsaXplKCkiKTsKLQotICBEQ0hFQ0soc3RyZWFtKTsKLSAgRENIRUNLKCFzdGF0dXNfY2IuaXNfbnVsbCgpKTsKLSAgRENIRUNLKCFzdGF0aXN0aWNzX2NiLmlzX251bGwoKSk7Ci0gIERDSEVDSyghZGVtdXhlcl9zdHJlYW1fKTsKLQotICBkZW11eGVyX3N0cmVhbV8gPSBzdHJlYW07Ci0gIHN0YXRpc3RpY3NfY2JfID0gc3RhdGlzdGljc19jYjsKLSAgY29uc3QgQXVkaW9EZWNvZGVyQ29uZmlnJiBjb25maWcgPSBkZW11eGVyX3N0cmVhbV8tPmF1ZGlvX2RlY29kZXJfY29uZmlnKCk7Ci0KLSAgLy8gY2hlY2sgY29uZmlnIGZvciBzdXBwb3J0Ci0gIGlmICghVmFsaWRhdGVDb25maWcoY29uZmlnKSkgewotICAgIHN0YXR1c19jYi5SdW4oREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVEKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzYW1wbGVzX3Blcl9zZWNvbmRfID0gY29uZmlnLnNhbXBsZXNfcGVyX3NlY29uZCgpOwotICBudW1fY2hhbm5lbHNfID0gQ2hhbm5lbExheW91dFRvQ2hhbm5lbENvdW50KGNvbmZpZy5jaGFubmVsX2xheW91dCgpKTsKLQotI2lmIF9fU0FWRV9ERUNPREVSX09VVFBVVF9fCi0gIHRlc3RfcHJvYmVfLkluaXRpYWxpemUoInNoZWxsX2F1ZGlvX2RlY29kZXJfcHJvYmUud2F2IiwgbnVtX2NoYW5uZWxzXywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlc19wZXJfc2Vjb25kKCksIGJpdHNfcGVyX2NoYW5uZWwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzX3Blcl9jaGFubmVsKCkgPT0gc2l6ZW9mKGZsb2F0KSk7ICAvLyB1c2VfZmxvYXRzPwotICB0ZXN0X3Byb2JlXy5DbG9zZUFmdGVyKDMwICogMTAwMCk7Ci0jZW5kaWYKLQotICBVUERBVEVfTUVESUFfU1RBVElTVElDUyhTVEFUX1RZUEVfQVVESU9fQ09ERUMsIGNvbmZpZy5jb2RlYygpKTsKLSAgVVBEQVRFX01FRElBX1NUQVRJU1RJQ1MoU1RBVF9UWVBFX0FVRElPX0NIQU5ORUxTLCBudW1fY2hhbm5lbHNfKTsKLSAgVVBEQVRFX01FRElBX1NUQVRJU1RJQ1MoU1RBVF9UWVBFX0FVRElPX1NBTVBMRV9QRVJfU0VDT05ELAotICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzX3Blcl9zZWNvbmRfKTsKLQotICBMT0coSU5GTykgPDwgIkNvbmZpZ3VyYXRpb24gYXQgU3RhcnQ6ICIKLSAgICAgICAgICAgIDw8IGRlbXV4ZXJfc3RyZWFtXy0+YXVkaW9fZGVjb2Rlcl9jb25maWcoKS5Bc0h1bWFuUmVhZGFibGVTdHJpbmcoKTsKLSAgcmF3X2RlY29kZXJfID0gcmF3X2F1ZGlvX2RlY29kZXJfZmFjdG9yeV8tPkNyZWF0ZShjb25maWcpOwotCi0gIGlmICghcmF3X2RlY29kZXJfKSB7Ci0gICAgc3RhdHVzX2NiLlJ1bihERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0YXR1c19jYi5SdW4oUElQRUxJTkVfT0spOwotfQotCi12b2lkIFNoZWxsQXVkaW9EZWNvZGVySW1wbDo6UmVhZChjb25zdCBBdWRpb0RlY29kZXI6OlJlYWRDQiYgcmVhZF9jYikgewotICBUUkFDRV9FVkVOVDAoIm1lZGlhX3N0YWNrIiwgIlNoZWxsQXVkaW9EZWNvZGVySW1wbDo6UmVhZCgpIik7Ci0KLSAgLy8gVGhpcyBtYXkgYmUgY2FsbGVkIGZyb20gYW5vdGhlciB0aHJlYWQgKEgvVyBhdWRpbyB0aHJlYWQpIHNvIHJlZGlyZWN0Ci0gIC8vIHRoaXMgcmVxdWVzdCB0byB0aGUgZGVjb2RlcidzIG1lc3NhZ2UgbG9vcAotICBpZiAoIW1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSkgewotICAgIG1lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKAotICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJlNoZWxsQXVkaW9EZWNvZGVySW1wbDo6UmVhZCwgdGhpcywgcmVhZF9jYikpOwotICAgIHJldHVybjsKLSAgfQotCi0gIERDSEVDSyhkZW11eGVyX3N0cmVhbV8pOyAgLy8gSW5pdGlhbGl6ZSgpIGhhcyBiZWVuIGNhbGxlZC4KLSAgRENIRUNLKCFyZWFkX2NiLmlzX251bGwoKSk7Ci0gIERDSEVDSyhyZWFkX2NiXy5pc19udWxsKCkpOyAgIC8vIE5vIFJlYWQoKSBpbiBwcm9ncmVzcy4KLSAgRENIRUNLKHJlc2V0X2NiXy5pc19udWxsKCkpOyAgLy8gIE5vIFJlc2V0KCkgaW4gcHJvZ3Jlc3MuCi0KLSAgaWYgKHF1ZXVlZF9idWZmZXJzXy5lbXB0eSgpKSB7Ci0gICAgcmVhZF9jYl8gPSByZWFkX2NiOwotICB9IGVsc2UgewotICAgIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gYnVmZmVyID0gcXVldWVkX2J1ZmZlcnNfLmZyb250KCk7Ci0gICAgcXVldWVkX2J1ZmZlcnNfLnBvcCgpOwotICAgIFRSQUNFX0VWRU5UMSgibWVkaWFfc3RhY2siLAotICAgICAgICAgICAgICAgICAiU2hlbGxBdWRpb0RlY29kZXJJbXBsOjpSZWFkKCkgZGVsaXZlciBhdWRpbyBkYXRhLiIsCi0gICAgICAgICAgICAgICAgICJ0aW1lc3RhbXAiLCBidWZmZXItPkdldFRpbWVzdGFtcCgpLkluTWljcm9zZWNvbmRzKCkpOwotCi0gICAgQnVmZmVycyBidWZmZXJzOwotICAgIGJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7Ci0gICAgcmVhZF9jYi5SdW4oa09rLCBidWZmZXJzKTsKLSAgfQotCi0gIFRyeVRvUmVhZEZyb21EZW11eGVyU3RyZWFtKCk7Ci19Ci0KLWludCBTaGVsbEF1ZGlvRGVjb2RlckltcGw6OmJpdHNfcGVyX2NoYW5uZWwoKSB7Ci0gIERDSEVDSyhyYXdfZGVjb2Rlcl8pOwotCi0gIGlmIChyYXdfZGVjb2Rlcl8pIHsKLSAgICByZXR1cm4gcmF3X2RlY29kZXJfLT5HZXRCeXRlc1BlclNhbXBsZSgpICogODsKLSAgfQotCi0gIHJldHVybiBzaXplb2YoZmxvYXQpICogODsKLX0KLQotQ2hhbm5lbExheW91dCBTaGVsbEF1ZGlvRGVjb2RlckltcGw6OmNoYW5uZWxfbGF5b3V0KCkgewotICBEQ0hFQ0soZGVtdXhlcl9zdHJlYW1fKTsKLSAgY29uc3QgQXVkaW9EZWNvZGVyQ29uZmlnJiBjb25maWcgPSBkZW11eGVyX3N0cmVhbV8tPmF1ZGlvX2RlY29kZXJfY29uZmlnKCk7Ci0gIHJldHVybiBjb25maWcuY2hhbm5lbF9sYXlvdXQoKTsKLX0KLQotaW50IFNoZWxsQXVkaW9EZWNvZGVySW1wbDo6c2FtcGxlc19wZXJfc2Vjb25kKCkgewotICByZXR1cm4gc2FtcGxlc19wZXJfc2Vjb25kXzsKLX0KLQotdm9pZCBTaGVsbEF1ZGlvRGVjb2RlckltcGw6OlJlc2V0KGNvbnN0IGJhc2U6OkNsb3N1cmUmIHJlc2V0X2NiKSB7Ci0gIFRSQUNFX0VWRU5UMCgibWVkaWFfc3RhY2siLCAiU2hlbGxBdWRpb0RlY29kZXJJbXBsOjpSZXNldCgpIik7Ci0KLSAgaWYgKCFtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpIHsKLSAgICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzaygKLSAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZTaGVsbEF1ZGlvRGVjb2RlckltcGw6OlJlc2V0LCB0aGlzLCByZXNldF9jYikpOwotICAgIHJldHVybjsKLSAgfQotCi0gIERDSEVDSyhkZW11eGVyX3N0cmVhbV8pOyAgLy8gSW5pdGlhbGl6ZSgpIGhhcyBiZWVuIGNhbGxlZC4KLSAgRENIRUNLKCFyZXNldF9jYi5pc19udWxsKCkpOwotICBEQ0hFQ0socmVzZXRfY2JfLmlzX251bGwoKSk7ICAvLyBObyBSZXNldCgpIGluIHByb2dyZXNzLgotCi0gIGlmIChkZW11eGVyX3JlYWRfYW5kX2RlY29kZV9pbl9wcm9ncmVzc18pIHsKLSAgICByZXNldF9jYl8gPSByZXNldF9jYjsKLSAgICByZXR1cm47Ci0gIH0KLQotI2lmIF9fU0FWRV9ERUNPREVSX09VVFBVVF9fCi0gIHRlc3RfcHJvYmVfLkNsb3NlKCk7Ci0jZW5kaWYKLQotICBEQ0hFQ0socmVhZF9jYl8uaXNfbnVsbCgpKTsgIC8vIE5vIFJlYWQoKSBpbiBwcm9ncmVzcy4KLQotICAvLyBSZWxlYXNlIHRoZSBidWZmZXJzIHdlIHF1ZXVlZCBpbnRlcm5hbGx5Ci0gIHdoaWxlICghcXVldWVkX2J1ZmZlcnNfLmVtcHR5KCkpIHsKLSAgICBxdWV1ZWRfYnVmZmVyc18ucG9wKCk7Ci0gIH0KLSAgcmF3X2RlY29kZXJfLT5GbHVzaCgpOwotICBlb3NfYnVmZmVyXyA9IE5VTEw7Ci0gIHJlc2V0X2NiLlJ1bigpOwotfQotCi12b2lkIFNoZWxsQXVkaW9EZWNvZGVySW1wbDo6VHJ5VG9SZWFkRnJvbURlbXV4ZXJTdHJlYW0oKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotCi0gIGlmICghZGVtdXhlcl9yZWFkX2FuZF9kZWNvZGVfaW5fcHJvZ3Jlc3NfICYmCi0gICAgICBxdWV1ZWRfYnVmZmVyc18uc2l6ZSgpIDwga01heFF1ZXVlZEJ1ZmZlcnMpIHsKLSAgICBkZW11eGVyX3JlYWRfYW5kX2RlY29kZV9pbl9wcm9ncmVzc18gPSB0cnVlOwotICAgIGlmIChlb3NfYnVmZmVyXykgewotICAgICAgLy8gV2UgaGF2ZSBhbHJlYWR5IHJlY2VpdmVkIEVPUyBmcm9tIGRlbXV4ZXIgc3RyZWFtLCBzbyB3ZSBubyBsb25nZXIgbmVlZAotICAgICAgLy8gdG8gcmVxdWVzdCBmcm9tIERlbXV4ZXJTdHJlYW0uICBIb3dldmVyLCB3ZSBzdGlsbCBoYXZlIHRvIHNlbmQgdGhlIGVvcwotICAgICAgLy8gYnVmZmVyIHRvIHJhdyBkZWNvZGVyIHNvIGl0IGNhbiBrZWVwIGRlY29kaW5nIGFueSBsZWZ0IG92ZXIgYnVmZmVycy4KLSAgICAgIFRSQUNFX0VWRU5UMCgibWVkaWFfc3RhY2siLAotICAgICAgICAgICAgICAgICAgICJTaGVsbEF1ZGlvRGVjb2RlckltcGw6OlRyeVRvUmVhZEZyb21EZW11eGVyU3RyZWFtKCkgRU9TIik7Ci0gICAgICBEQ0hFQ0soZW9zX2J1ZmZlcl8pOwotICAgICAgbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soCi0gICAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZTaGVsbEF1ZGlvRGVjb2RlckltcGw6Ok9uRGVtdXhlclJlYWQsIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbXV4ZXJTdHJlYW06OmtPaywgZW9zX2J1ZmZlcl8pKTsKLSAgICB9IGVsc2UgewotICAgICAgVFJBQ0VfRVZFTlQwKCJtZWRpYV9zdGFjayIsCi0gICAgICAgICAgICAgICAgICAgIlNoZWxsQXVkaW9EZWNvZGVySW1wbDo6VHJ5VG9SZWFkRnJvbURlbXV4ZXJTdHJlYW0oKSBSZWFkIik7Ci0gICAgICBkZW11eGVyX3N0cmVhbV8tPlJlYWQoQmluZFRvQ3VycmVudExvb3AoCi0gICAgICAgICAgYmFzZTo6QmluZCgmU2hlbGxBdWRpb0RlY29kZXJJbXBsOjpPbkRlbXV4ZXJSZWFkLCB0aGlzKSkpOwotICAgIH0KLSAgfQotfQotCi12b2lkIFNoZWxsQXVkaW9EZWNvZGVySW1wbDo6T25EZW11eGVyUmVhZCgKLSAgICBEZW11eGVyU3RyZWFtOjpTdGF0dXMgc3RhdHVzLAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGJ1ZmZlcikgewotICBUUkFDRV9FVkVOVDAoIm1lZGlhX3N0YWNrIiwgIlNoZWxsQXVkaW9EZWNvZGVySW1wbDo6T25EZW11eGVyUmVhZCgpIik7Ci0KLSAgaWYgKCFtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpIHsKLSAgICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzaygKLSAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZTaGVsbEF1ZGlvRGVjb2RlckltcGw6Ok9uRGVtdXhlclJlYWQsIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGJ1ZmZlcikpOwotICAgIHJldHVybjsKLSAgfQotCi0jaWYgIWRlZmluZWQoX19MQl9TSEVMTF9fRk9SX1JFTEVBU0VfXykKLSAgLy8gV2hhdCB0aGUgdGVzdCBkb2VzIGlzOgotICAvLyAgIFBsYXkgZm9yIGtUaW1lQmV0d2VlblVuZGVyZmxvdyArIGtUaW1lVG9VbmRlcmZsb3c7Ci0gIC8vICAgZm9yICg7OykgewotICAvLyAgICAgUGxheSBmb3Iga1RpbWVCZXR3ZWVuVW5kZXJmbG93OwotICAvLyAgICAgVW5kZXJmbG93IGZvciBrVGltZVRvVW5kZXJmbG93OwotICAvLyAgIH0KLSAgY29uc3QgYm9vbCBrRW5hYmxlVW5kZXJmbG93VGVzdCA9IGZhbHNlOwotICBpZiAoa0VuYWJsZVVuZGVyZmxvd1Rlc3QpIHsKLSAgICBzdGF0aWMgY29uc3QgVGltZURlbHRhIGtUaW1lQmV0d2VlblVuZGVyZmxvdyA9Ci0gICAgICAgIFRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygyNzI5Myk7Ci0gICAgc3RhdGljIGNvbnN0IFRpbWVEZWx0YSBrVGltZVRvVW5kZXJmbG93ID0gVGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDQ4MzcpOwotICAgIHN0YXRpYyBUaW1lIGxhc3RfaGl0OwotCi0gICAgaWYgKHN0YXR1cyA9PSBEZW11eGVyU3RyZWFtOjprT2sgJiYgIWJ1ZmZlci0+SXNFbmRPZlN0cmVhbSgpICYmCi0gICAgICAgIGJ1ZmZlci0+R2V0VGltZXN0YW1wKCkuSW5NaWNyb3NlY29uZHMoKSA9PSAwKSB7Ci0gICAgICBsYXN0X2hpdCA9IFRpbWU6Ok5vdygpOwotICAgIH0KLSAgICBpZiAoVGltZTo6Tm93KCkgLSBsYXN0X2hpdCA+IGtUaW1lQmV0d2VlblVuZGVyZmxvdyArIGtUaW1lVG9VbmRlcmZsb3cpIHsKLSAgICAgIGxhc3RfaGl0ID0gVGltZTo6Tm93KCk7Ci0gICAgICBtZXNzYWdlX2xvb3BfLT5Qb3N0RGVsYXllZFRhc2soCi0gICAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZTaGVsbEF1ZGlvRGVjb2RlckltcGw6Ok9uRGVtdXhlclJlYWQsIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYnVmZmVyKSwKLSAgICAgICAgICBrVGltZVRvVW5kZXJmbG93KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLSNlbmRpZiAgLy8gIWRlZmluZWQoX19MQl9TSEVMTF9fRk9SX1JFTEVBU0VfXykKLQotICBEQ0hFQ0soZGVtdXhlcl9yZWFkX2FuZF9kZWNvZGVfaW5fcHJvZ3Jlc3NfKTsKLQotICBpZiAoc3RhdHVzID09IERlbXV4ZXJTdHJlYW06OmtPaykgewotICAgIGlmIChidWZmZXItPklzRW5kT2ZTdHJlYW0oKSkgewotICAgICAgVFJBQ0VfRVZFTlQwKCJtZWRpYV9zdGFjayIsCi0gICAgICAgICAgICAgICAgICAgIlNoZWxsQXVkaW9EZWNvZGVySW1wbDo6RGVjb2RlQnVmZmVyKCkgRU9TIHJlYWNoZWQuIik7Ci0gICAgICBlb3NfYnVmZmVyXyA9IGJ1ZmZlcjsKLSAgICB9Ci0gICAgcmF3X2RlY29kZXJfLT5EZWNvZGUoCi0gICAgICAgIGJ1ZmZlciwgYmFzZTo6QmluZCgmU2hlbGxBdWRpb0RlY29kZXJJbXBsOjpPbkJ1ZmZlckRlY29kZWQsIHRoaXMpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBEQ0hFQ0soIWJ1ZmZlcik7Ci0gIGRlbXV4ZXJfcmVhZF9hbmRfZGVjb2RlX2luX3Byb2dyZXNzXyA9IGZhbHNlOwotCi0gIGlmIChzdGF0dXMgPT0gRGVtdXhlclN0cmVhbTo6a0NvbmZpZ0NoYW5nZWQpIHsKLSAgICAvLyBXZSBkb24ndCBzdXBwb3J0IGF1ZGlvIGNvbmZpZyBjaGFuZ2UuCi0gICAgLy8gV2UgbXVzdCBjYWxsIGF1ZGlvX2RlY29kZXJfY29uZmlnKCkgdG8gYWNrbm93bGVkZ2UgdGhlIGNvbmZpZyBjaGFuZ2UuCi0gICAgLy8gT3RoZXJ3aXNlLCB0aGUgZGVtdXhlciB3aWxsIGtlZXAgc2VuZGluZyBiYWNrIGtDb25maWdDaGFuZ2UgZm9yIGFueQotICAgIC8vIFJlYWQoKSBjYWxsIHVudGlsIHRoZSBjb25maWcgY2hhbmdlIGlzIGFja25vd2xlZGdlZC4KLSAgICBkZW11eGVyX3N0cmVhbV8tPmF1ZGlvX2RlY29kZXJfY29uZmlnKCk7Ci0gICAgVHJ5VG9SZWFkRnJvbURlbXV4ZXJTdHJlYW0oKTsKLSAgfSBlbHNlIHsKLSAgICBEQ0hFQ0tfRVEoc3RhdHVzLCBEZW11eGVyU3RyZWFtOjprQWJvcnRlZCk7Ci0gICAgLy8gV2UgYXJlIHNlZWtpbmcgb3Igc3RvcHBpbmcsIGZ1bGZpbGwgYW55IG91dHN0YW5kaW5nIGNhbGxiYWNrcy4KLSAgICBpZiAoIXJlYWRfY2JfLmlzX251bGwoKSkgewotICAgICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnJlYWRfY2JfKS5SdW4oa0Fib3J0ZWQsIEJ1ZmZlcnMoKSk7Ci0gICAgfQotICAgIGlmICghcmVzZXRfY2JfLmlzX251bGwoKSkgewotICAgICAgUmVzZXQoYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnJlc2V0X2NiXykpOwotICAgIH0KLSAgfQotfQotCi12b2lkIFNoZWxsQXVkaW9EZWNvZGVySW1wbDo6T25CdWZmZXJEZWNvZGVkKAotICAgIFNoZWxsUmF3QXVkaW9EZWNvZGVyOjpEZWNvZGVTdGF0dXMgc3RhdHVzLAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGJ1ZmZlcikgewotICBpZiAoIW1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSkgewotICAgIG1lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKAotICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJlNoZWxsQXVkaW9EZWNvZGVySW1wbDo6T25CdWZmZXJEZWNvZGVkLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBidWZmZXIpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBEQ0hFQ0soZGVtdXhlcl9yZWFkX2FuZF9kZWNvZGVfaW5fcHJvZ3Jlc3NfKTsKLSAgZGVtdXhlcl9yZWFkX2FuZF9kZWNvZGVfaW5fcHJvZ3Jlc3NfID0gZmFsc2U7Ci0KLSAgYm9vbCBlb3NfZGVjb2RlZCA9IGZhbHNlOwotICBpZiAoc3RhdHVzID09IFNoZWxsUmF3QXVkaW9EZWNvZGVyOjpCVUZGRVJfREVDT0RFRCkgewotICAgIERDSEVDSyhidWZmZXIpOwotICAgIHF1ZXVlZF9idWZmZXJzXy5wdXNoKGJ1ZmZlcik7Ci0KLSAgICBlb3NfZGVjb2RlZCA9IGJ1ZmZlci0+SXNFbmRPZlN0cmVhbSgpOwotICAgIGlmICghZW9zX2RlY29kZWQpIHsKLSAgICAgIFRSQUNFX0VWRU5UMSgibWVkaWFfc3RhY2siLAotICAgICAgICAgICAgICAgICAgICJTaGVsbEF1ZGlvRGVjb2RlckltcGw6OkRlY29kZUJ1ZmZlcigpIGRhdGEgZGVjb2RlZC4iLAotICAgICAgICAgICAgICAgICAgICJ0aW1lc3RhbXAiLCBidWZmZXItPkdldFRpbWVzdGFtcCgpLkluTWljcm9zZWNvbmRzKCkpOwotICAgICAgRENIRUNLX0VRKGJ1ZmZlci0+R2V0RGF0YVNpemUoKSwKLSAgICAgICAgICAgICAgICBrRnJhbWVzUGVyQWNjZXNzVW5pdCAqIGJpdHNfcGVyX2NoYW5uZWwoKSAvIDggKiBudW1fY2hhbm5lbHNfKTsKLQotICAgICAgUGlwZWxpbmVTdGF0aXN0aWNzIHN0YXRpc3RpY3M7Ci0gICAgICBzdGF0aXN0aWNzLmF1ZGlvX2J5dGVzX2RlY29kZWQgPSBidWZmZXItPkdldERhdGFTaXplKCk7Ci0gICAgICBzdGF0aXN0aWNzX2NiXy5SdW4oc3RhdGlzdGljcyk7Ci0KLSNpZiBfX1NBVkVfREVDT0RFUl9PVVRQVVRfXwotICAgICAgdGVzdF9wcm9iZV8uQWRkRGF0YShidWZmZXItPkdldERhdGEoKSk7Ci0jZW5kaWYKLSAgICB9Ci0gIH0gZWxzZSBpZiAoc3RhdHVzID09IFNoZWxsUmF3QXVkaW9EZWNvZGVyOjpORUVEX01PUkVfREFUQSkgewotICAgIERDSEVDS19FUShzdGF0dXMsIFNoZWxsUmF3QXVkaW9EZWNvZGVyOjpORUVEX01PUkVfREFUQSk7Ci0gICAgRENIRUNLKCFidWZmZXIpOwotICAgIGlmIChyZXNldF9jYl8uaXNfbnVsbCgpKSB7Ci0gICAgICBUcnlUb1JlYWRGcm9tRGVtdXhlclN0cmVhbSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBSZXNldChiYXNlOjpSZXNldEFuZFJldHVybigmcmVzZXRfY2JfKSk7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICghcmVhZF9jYl8uaXNfbnVsbCgpKSB7Ci0gICAgRENIRUNLKCFxdWV1ZWRfYnVmZmVyc18uZW1wdHkoKSk7Ci0gICAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBidWZmZXIgPSBxdWV1ZWRfYnVmZmVyc18uZnJvbnQoKTsKLSAgICBxdWV1ZWRfYnVmZmVyc18ucG9wKCk7Ci0gICAgVFJBQ0VfRVZFTlQxKCJtZWRpYV9zdGFjayIsCi0gICAgICAgICAgICAgICAgICJTaGVsbEF1ZGlvRGVjb2RlckltcGw6Ok9uQnVmZmVyRGVjb2RlZCgpIGRlbGl2ZXIgYXVkaW8gZGF0YS4iLAotICAgICAgICAgICAgICAgICAidGltZXN0YW1wIiwgYnVmZmVyLT5HZXRUaW1lc3RhbXAoKS5Jbk1pY3Jvc2Vjb25kcygpKTsKLQotICAgIEJ1ZmZlcnMgYnVmZmVyczsKLSAgICBidWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOwotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZyZWFkX2NiXykuUnVuKGtPaywgYnVmZmVycyk7Ci0gIH0KLQotICBpZiAocmVzZXRfY2JfLmlzX251bGwoKSkgewotICAgIGlmICghZW9zX2RlY29kZWQpIHsKLSAgICAgIFRyeVRvUmVhZEZyb21EZW11eGVyU3RyZWFtKCk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIFJlc2V0KGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZyZXNldF9jYl8pKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX2F1ZGlvX2RlY29kZXJfaW1wbC5oIGIvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfYXVkaW9fZGVjb2Rlcl9pbXBsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYTlhMmMuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfYXVkaW9fZGVjb2Rlcl9pbXBsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9GSUxURVJTX1NIRUxMX0FVRElPX0RFQ09ERVJfSU1QTF9IXwotI2RlZmluZSBNRURJQV9GSUxURVJTX1NIRUxMX0FVRElPX0RFQ09ERVJfSU1QTF9IXwotCi0jaW5jbHVkZSA8cXVldWU+Ci0KLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19kZWNvZGVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19kZWNvZGVyX2NvbmZpZy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlbXV4ZXJfc3RyZWFtLmgiCi0KLS8vIHNldCBtZSB0byAxIHRvIHNhdmUgZGVjb2RlZCBhdWRpbyBvdXRwdXQgdG8gZGlzayBmb3IgZGVidWdnaW5nCi0jZGVmaW5lIF9fU0FWRV9ERUNPREVSX09VVFBVVF9fIDAKLQotI2lmIF9fU0FWRV9ERUNPREVSX09VVFBVVF9fCi0jaW5jbHVkZSAibWVkaWEvYXVkaW8vc2hlbGxfd2F2X3Rlc3RfcHJvYmUuaCIKLSNlbmRpZgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBTaGVsbFJhd0F1ZGlvRGVjb2RlciB7Ci0gcHVibGljOgotICBlbnVtIERlY29kZVN0YXR1cyB7Ci0gICAgQlVGRkVSX0RFQ09ERUQsICAvLyBTdWNjZXNzZnVsbHkgZGVjb2RlZCBhdWRpbyBkYXRhLgotICAgIE5FRURfTU9SRV9EQVRBICAgLy8gTmVlZCBtb3JlIGRhdGEgdG8gcHJvZHVjZSBkZWNvZGVkIGF1ZGlvIGRhdGEuCi0gIH07Ci0gIHR5cGVkZWYgbWVkaWE6OkRlY29kZXJCdWZmZXIgRGVjb2RlckJ1ZmZlcjsKLSAgdHlwZWRlZiBtZWRpYTo6QXVkaW9EZWNvZGVyQ29uZmlnIEF1ZGlvRGVjb2RlckNvbmZpZzsKLSAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKERlY29kZVN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mKT4gRGVjb2RlQ0I7Ci0KLSAgdmlydHVhbCB+U2hlbGxSYXdBdWRpb0RlY29kZXIoKSB7fQotICB2aXJ0dWFsIGludCBHZXRCeXRlc1BlclNhbXBsZSgpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCB2b2lkIERlY29kZShjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjb2RlQ0ImIGRlY29kZV9jYikgPSAwOwotICB2aXJ0dWFsIGJvb2wgRmx1c2goKSA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBVcGRhdGVDb25maWcoY29uc3QgQXVkaW9EZWNvZGVyQ29uZmlnJiBjb25maWcpID0gMDsKLQotIHByb3RlY3RlZDoKLSAgU2hlbGxSYXdBdWRpb0RlY29kZXIoKSB7fQotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNoZWxsUmF3QXVkaW9EZWNvZGVyKTsKLX07Ci0KLWNsYXNzIFNoZWxsUmF3QXVkaW9EZWNvZGVyRmFjdG9yeSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5TaGVsbFJhd0F1ZGlvRGVjb2RlckZhY3RvcnkoKSB7fQotCi0gIHZpcnR1YWwgc2NvcGVkX3B0cjxTaGVsbFJhd0F1ZGlvRGVjb2Rlcj4gQ3JlYXRlKAotICAgICAgY29uc3QgQXVkaW9EZWNvZGVyQ29uZmlnJiBjb25maWcpID0gMDsKLX07Ci0KLS8vIFRoZSBhdWRpbyBkZWNvZGVyIG1haW5seSBoYXMgdHdvIGZlYXR1cmVzOgotLy8gMS4gSXQgdHJpZXMgdG8gcmVhZCBidWZmZXJzIGZyb20gdGhlIGRlbXV4ZXIsIHRoZW4gZGVjb2RlIHRoZSBidWZmZXJzIGFuZCBwdXQKLS8vICAgIGRlY29kZWQgYnVmZmVycyBpbnRvIGEgcXVldWUuICBJbiB0aGlzIHdheSB0aGUgZGVjb2RlciBjYW4gY2FjaGUgc29tZQotLy8gICAgYnVmZmVycyB0byBzcGVlZCB1cCBhdWRpbyBjYWNoaW5nLgotLy8gMi4gV2hlbiBpdHMgUmVhZCgpIGZ1bmN0aW9uIGlzIGNhbGxlZCwgaXQgdHJpZXMgdG8gZnVsZmlsbCB0aGUgUmVhZCgpIHdpdGgKLS8vICAgIGRlY29kZWQgZGF0YS4KLS8vIEEgUmVzZXQoKSBjYWxsIHdpbGwgYnJlYWsgYm90aCBvZiB0aGVtIGFuZCBoYWx0IHRoZSBkZWNvZGVyIHVudGlsIGFub3RoZXIKLS8vIFJlYWQoKSBpcyBjYWxsZWQuCi0vLyBUaGUgU2hlbGxBdWRpb0RlY29kZXJJbXBsIGlzIG9ubHkgdXNlZCBieSB0aGUgQXVkaW9SZW5kZXJlci4gIFRoZSByZW5kZXJlcgotLy8gd2lsbCBjYWxsIEluaXRpYWxpemUoKSBiZWZvcmUgYW55IG90aGVyIGZ1bmN0aW9uIGlzIGNhbGxlZC4gIFRoZSByZW5kZXJlciBtYXkKLS8vIHRoZW4gY2FsbCBSZWFkKCkgcmVwZWF0bHkgdG8gcmVxdWVzdCBkZWNvZGVkIGF1ZGlvIGRhdGEuICBSZXNldCgpIGlzIGNhbGxlZAotLy8gd2hlbiBhIHNlZWsgaXMgaW5pdGlhdGVkIHRvIGNsZWFyIGFueSBpbnRlcm5hbCBkYXRhIG9mIHRoZSBkZWNvZGVyLgotLy8gTm90ZSB0aGF0IHRoZSByZW5kZXJlciB3aWxsIG5vdCBleHBsaWNpdGx5IGRlc3Ryb3kgdGhlIGRlY29kZXIgd2hlbiBwbGF5YmFjawotLy8gaXMgZmluaXNoZWQuICBJdCBzaW1wbHkgcmVsZWFzZSBpdHMgcmVmZXJlbmNlIHRvIHRoZSBkZWNvZGVyIGFuZCB0aGUgZGVjb2RlcgotLy8gbWF5IGJlIGFsaXZlIGZvciBhIHNob3J0IHRpbWUuICBXaGVuIHBsYXliYWNrIGlzIGZpbmlzaGVkLCB0aGUgZGVtdXhlciB3aWxsCi0vLyBrZWVwIHJldHVybiBFT1MgYnVmZmVyLiAgU28gdGhlIGRlY29kZXIgd2lsbCBzdG9wIHJlYWRpbmcgcXVpY2tseS4gIE9uY2Ugbm8KLS8vIGNhbGxiYWNrIGlzIGluIHByb2dyZXNzLCBpdCB3aWxsIGJlIGRlc3Ryb3llZCBhdXRvbWF0aWNhbGx5IGJlY2F1c2UgdGhlcmUgaXMKLS8vIG5vIHJlZmVyZW5jZSB0byBpdC4KLWNsYXNzIE1FRElBX0VYUE9SVCBTaGVsbEF1ZGlvRGVjb2RlckltcGwgOiBwdWJsaWMgQXVkaW9EZWNvZGVyIHsKLSBwdWJsaWM6Ci0gIFNoZWxsQXVkaW9EZWNvZGVySW1wbCgKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4mIG1lc3NhZ2VfbG9vcCwKLSAgICAgIFNoZWxsUmF3QXVkaW9EZWNvZGVyRmFjdG9yeSogcmF3X2F1ZGlvX2RlY29kZXJfZmFjdG9yeSk7Ci0gIH5TaGVsbEF1ZGlvRGVjb2RlckltcGwoKSBPVkVSUklERTsKLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBjb25zdCBpbnQga01heFF1ZXVlZEJ1ZmZlcnMgPSAzMjsKLQotICAvLyBBdWRpb0RlY29kZXIgaW1wbGVtZW50YXRpb24uCi0gIHZvaWQgSW5pdGlhbGl6ZShjb25zdCBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+JiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBzdGF0dXNfY2IsCi0gICAgICAgICAgICAgICAgICBjb25zdCBTdGF0aXN0aWNzQ0ImIHN0YXRpc3RpY3NfY2IpIE9WRVJSSURFOwotICB2b2lkIFJlYWQoY29uc3QgUmVhZENCJiByZWFkX2NiKSBPVkVSUklERTsKLSAgaW50IGJpdHNfcGVyX2NoYW5uZWwoKSBPVkVSUklERTsKLSAgQ2hhbm5lbExheW91dCBjaGFubmVsX2xheW91dCgpIE9WRVJSSURFOwotICBpbnQgc2FtcGxlc19wZXJfc2Vjb25kKCkgT1ZFUlJJREU7Ci0gIHZvaWQgUmVzZXQoY29uc3QgYmFzZTo6Q2xvc3VyZSYgcmVzZXRfY2IpIE9WRVJSSURFOwotCi0gIHZvaWQgVHJ5VG9SZWFkRnJvbURlbXV4ZXJTdHJlYW0oKTsKLSAgdm9pZCBPbkRlbXV4ZXJSZWFkKERlbXV4ZXJTdHJlYW06OlN0YXR1cyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBidWZmZXIpOwotICAvLyB0aGUgY2FsbGJhY2sgZnJvbSB0aGUgcmF3IGRlY29kZXIgaW5kaWNhdGVzIGFuIG9wZXJhdGlvbiBoYXMgYmVlbiBmaW5pc2hlZC4KLSAgdm9pZCBPbkJ1ZmZlckRlY29kZWQoU2hlbGxSYXdBdWRpb0RlY29kZXI6OkRlY29kZVN0YXR1cyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGJ1ZmZlcik7Ci0KLSAgLy8gVGhlIG1lc3NhZ2UgbG9vcCB0aGF0IGFsbCBmdW5jdGlvbnMgcnVuIG9uIHRvIGF2b2lkIGV4cGxpY2l0IHN5bmMuCi0gIHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4gbWVzc2FnZV9sb29wXzsKLSAgU2hlbGxSYXdBdWRpb0RlY29kZXJGYWN0b3J5KiByYXdfYXVkaW9fZGVjb2Rlcl9mYWN0b3J5XzsKLSAgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiBkZW11eGVyX3N0cmVhbV87Ci0gIFN0YXRpc3RpY3NDQiBzdGF0aXN0aWNzX2NiXzsKLQotICBzY29wZWRfcHRyPFNoZWxsUmF3QXVkaW9EZWNvZGVyPiByYXdfZGVjb2Rlcl87Ci0KLSAgLy8gQXJlIHdlIGN1cnJlbnRseSBpbiBhIHJlYWQvZGVjb2RlIGN5Y2xlPyAgT25lIHRoaW5nIHdvcnRoIG5vdGluZyBpcywgUmVhZCgpCi0gIC8vIGFuZCBSZXNldCgpIHdpbGwgb25seSBiZSBkZWZlcnJlZCB3aGVuIGRlbXV4ZXJfcmVhZF9hbmRfZGVjb2RlX2luX3Byb2dyZXNzXwotICAvLyBpcyB0cnVlLCAgc28gaWYgZGVtdXhlcl9yZWFkX2FuZF9kZWNvZGVfaW5fcHJvZ3Jlc3NfIGlzIGZhbHNlLCByZWFkX2NiXyBhbmQKLSAgLy8gcmVzZXRfY2JfIHdpbGwgYmUgTlVMTC4KLSAgYm9vbCBkZW11eGVyX3JlYWRfYW5kX2RlY29kZV9pbl9wcm9ncmVzc187Ci0gIC8vIFNhdmUgdGhlIEVPUyBidWZmZXIgcmVjZWl2ZWQgc28gd2UgY2FuIHNlbmQgaXQgYWdhaW4gdG8gdGhlIHJhdyBkZWNvZGVyCi0gIC8vIHdpdGggY29ycmVjdCB0aW1lc3RhbXAuICBXaGVuIHRoaXMgaXMgbm9uIE5VTEwsIHdlIHNob3VsZG4ndCByZWFkIGZyb20gdGhlCi0gIC8vIGRlbXV4ZXIgYWdhaW4gdW50aWwgaXQgaXMgcmVzZXQgaW4gUmVzZXQoKS4KLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBlb3NfYnVmZmVyXzsKLQotI2lmIF9fU0FWRV9ERUNPREVSX09VVFBVVF9fCi0gIFNoZWxsV2F2VGVzdFByb2JlIHRlc3RfcHJvYmVfOwotI2VuZGlmCi0KLSAgaW50IHNhbXBsZXNfcGVyX3NlY29uZF87Ci0gIGludCBudW1fY2hhbm5lbHNfOwotCi0gIFJlYWRDQiByZWFkX2NiXzsKLSAgYmFzZTo6Q2xvc3VyZSByZXNldF9jYl87Ci0KLSAgc3RkOjpxdWV1ZTxzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+ID4gcXVldWVkX2J1ZmZlcnNfOwotCi0gIERJU0FMTE9XX0lNUExJQ0lUX0NPTlNUUlVDVE9SUyhTaGVsbEF1ZGlvRGVjb2RlckltcGwpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfRklMVEVSU19TSEVMTF9BVURJT19ERUNPREVSX0lNUExfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX2F1ZGlvX3JlbmRlcmVyLmggYi9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9hdWRpb19yZW5kZXJlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjhhY2U4Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX2F1ZGlvX3JlbmRlcmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX0ZJTFRFUlNfU0hFTExfQVVESU9fUkVOREVSRVJfSF8KLSNkZWZpbmUgTUVESUFfRklMVEVSU19TSEVMTF9BVURJT19SRU5ERVJFUl9IXwotCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3BfcHJveHkuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX3JlbmRlcmVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19yZW5kZXJlcl9zaW5rLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNyeXB0b3IuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgTUVESUFfRVhQT1JUIFNoZWxsQXVkaW9SZW5kZXJlcgotICAgIDogcHVibGljIEF1ZGlvUmVuZGVyZXIsCi0gICAgICBwdWJsaWMgbWVkaWE6OkF1ZGlvUmVuZGVyZXJTaW5rOjpSZW5kZXJDYWxsYmFjayB7Ci0gcHVibGljOgotICAvLyBwbGF0Zm9ybS1zcGVjaWZpYyBmYWN0b3J5IG1ldGhvZAotICBzdGF0aWMgU2hlbGxBdWRpb1JlbmRlcmVyKiBDcmVhdGUoCi0gICAgICBtZWRpYTo6QXVkaW9SZW5kZXJlclNpbmsqIHNpbmssCi0gICAgICBjb25zdCBTZXREZWNyeXB0b3JSZWFkeUNCJiBzZXRfZGVjcnlwdG9yX3JlYWR5X2NiLAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbWVzc2FnZV9sb29wKTsKLQotICAvLyA9PT09PT09PSBBdWRpb1JlbmRlcmVyIEltcGxlbWVudGF0aW9uCi0KLSAgLy8gPT09PT09PT0gRmlsdGVyIEltcGxlbWVudGF0aW9uCi0KLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgflNoZWxsQXVkaW9SZW5kZXJlcigpIHt9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9GSUxURVJTX1NIRUxMX0FVRElPX1JFTkRFUkVSX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9hdWRpb19yZW5kZXJlcl9hbGdvcml0aG0uaCBiL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX2F1ZGlvX3JlbmRlcmVyX2FsZ29yaXRobS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTY3MzYyLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX2F1ZGlvX3JlbmRlcmVyX2FsZ29yaXRobS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfRklMVEVSU19TSEVMTF9BVURJT19SRU5ERVJFUl9BTEdPUklUSE1fSF8KLSNkZWZpbmUgTUVESUFfRklMVEVSU19TSEVMTF9BVURJT19SRU5ERVJFUl9BTEdPUklUSE1fSF8KLQotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3NlZWthYmxlX2J1ZmZlci5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBCdWZmZXI7Ci0KLS8vIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGFuIGFic3RyYWN0IGludGVyZmFjZSBmb3IgYSBwbGF0Zm9ybS1zcGVjaWZpYwotLy8gaW1wbGVtZW50YXRpb24uCi1jbGFzcyBNRURJQV9FWFBPUlQgQXVkaW9SZW5kZXJlckFsZ29yaXRobSB7Ci0gcHVibGljOgotICAvLyByZXR1cm5zIGEgcGxhdGZvcm0tc3BlY2lmaWMgQXVkaW9SZW5kZXJlckFsZ29yaXRobSBpbXBsZW1lbnRhdGlvbgotICBzdGF0aWMgQXVkaW9SZW5kZXJlckFsZ29yaXRobSogQ3JlYXRlKCk7Ci0KLSAgLy8gQ2FsbCBwcmlvciB0byBJbml0aWFsaXplKCkgdG8gdmFsaWRhdGUgY29uZmlndXJhdGlvbi4gIFJldHVybnMgZmFsc2UgaWYgdGhlCi0gIC8vIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZC4KLSAgc3RhdGljIGJvb2wgVmFsaWRhdGVDb25maWcoaW50IGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlc19wZXJfc2Vjb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0c19wZXJfY2hhbm5lbCk7Ci0KLSAgLy8gSW5pdGlhbGl6ZXMgdGhpcyBvYmplY3Qgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXVkaW8gc3RyZWFtLgotICAvLyB8c2FtcGxlc19wZXJfc2Vjb25kfCBpcyBpbiBIei4gfHJlYWRfcmVxdWVzdF9jYWxsYmFja3wgaXMgY2FsbGVkIHRvCi0gIC8vIHJlcXVlc3QgbW9yZSBkYXRhIGZyb20gdGhlIGNsaWVudCwgcmVxdWVzdHMgdGhhdCBhcmUgZnVsZmlsbGVkIHRocm91Z2gKLSAgLy8gY2FsbHMgdG8gRW5xdWV1ZUJ1ZmZlcigpLgotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShpbnQgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVzX3Blcl9zZWNvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzX3Blcl9jaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBpbml0aWFsX3BsYXliYWNrX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIHJlcXVlc3RfcmVhZF9jYikgPSAwOwotCi0gIC8vIFRyaWVzIHRvIGZpbGwgfHJlcXVlc3RlZF9mcmFtZXN8IGZyYW1lcyBpbnRvIHxkZXN0fCB3aXRoIG91dHB1dC4KLSAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBjb3BpZWQgaW50byB8ZGVzdHwuCi0gIC8vIE1heSByZXF1ZXN0IG1vcmUgcmVhZHMgdmlhIHxyZXF1ZXN0X3JlYWRfY2JffCBiZWZvcmUgcmV0dXJuaW5nLgotICB2aXJ0dWFsIGludCBGaWxsQnVmZmVyKHVpbnQ4KiBkZXN0LCBpbnQgcmVxdWVzdGVkX2ZyYW1lcykgPSAwOwotCi0gIC8vIENsZWFycyBpbnRlcm5hbCBhdWRpbyBidWZmZXJzCi0gIHZpcnR1YWwgdm9pZCBGbHVzaEJ1ZmZlcnMoKSA9IDA7Ci0KLSAgLy8gUmV0dXJucyB0aGUgdGltZSBvZiB0aGUgbmV4dCBieXRlIGluIG91ciBkYXRhIG9yIGtOb1RpbWVzdGFtcCgpIGlmIGN1cnJlbnQKLSAgLy8gdGltZSBpcyB1bmtub3duLgotICB2aXJ0dWFsIGJhc2U6OlRpbWVEZWx0YSBHZXRUaW1lKCkgPSAwOwotCi0gIC8vIEVucXVldWVzIGEgYnVmZmVyLiBJdCBpcyBjYWxsZWQgZnJvbSB0aGUgb3duZXIgb2YgdGhlIGFsZ29yaXRobSBhZnRlciBhCi0gIC8vIHJlYWQgY29tcGxldGVzLgotICB2aXJ0dWFsIHZvaWQgRW5xdWV1ZUJ1ZmZlcihCdWZmZXIqIGJ1ZmZlcl9pbikgPSAwOwotCi0gIC8vIHdlIGN1cnJlbnRseSBkb24ndCBzdXBwb3J0IHBsYXliYWNrIHJhdGVzIHRoYXQgYXJlbid0IDAuMCBvciAxLjAKLSAgdmlydHVhbCBmbG9hdCBwbGF5YmFja19yYXRlKCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgU2V0UGxheWJhY2tSYXRlKGZsb2F0IG5ld19yYXRlKSA9IDA7Ci0KLSAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBhbGdvcml0aG0gaGFzIGVub3VnaCBkYXRhIGF0IHRoZSBjdXJyZW50IHBsYXliYWNrIHJhdGUKLSAgLy8gc3VjaCB0aGF0IGl0IGNhbiB3cml0ZSBkYXRhIG9uIHRoZSBuZXh0IGNhbGwgdG8gRmlsbEJ1ZmZlcigpLgotICB2aXJ0dWFsIGJvb2wgQ2FuRmlsbEJ1ZmZlcigpID0gMDsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgaW5wdXQgYnVmZmVyIGlzIGZ1bGwuCi0gIHZpcnR1YWwgYm9vbCBJc1F1ZXVlRnVsbCgpID0gMDsKLQotICAvLyBSZXR1cm5zIHRoZSBjYXBhY2l0eSBvZiBpbnB1dCBidWZmZXIuCi0gIHZpcnR1YWwgaW50IFF1ZXVlQ2FwYWNpdHkoKSA9IDA7Ci0KLSAgLy8gSW5jcmVhc2UgdGhlIGNhcGFjaXR5IG9mIGlucHV0IGJ1ZmZlciBpZiBwb3NzaWJsZS4KLSAgdmlydHVhbCB2b2lkIEluY3JlYXNlUXVldWVDYXBhY2l0eSgpID0gMDsKLQotICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgbGVmdCBpbiBpbnB1dCBidWZmZXIsIHdoaWNoIG1heSBiZSBsYXJnZXIKLSAgLy8gdGhhbiBRdWV1ZUNhcGFjaXR5KCkgaW4gdGhlIGV2ZW50IHRoYXQgYSByZWFkIGNhbGxiYWNrIGRlbGl2ZXJlZCBtb3JlIGRhdGEKLSAgLy8gdGhhbiBpbnB1dCBidWZmZXIgd2FzIGludGVuZGVkIHRvIGhvbGQuCi0gIHZpcnR1YWwgaW50IGJ5dGVzX2J1ZmZlcmVkKCkgPSAwOwotCi0gIHZpcnR1YWwgaW50IGJ5dGVzX3Blcl9mcmFtZSgpID0gMDsKLQotICB2aXJ0dWFsIGludCBieXRlc19wZXJfY2hhbm5lbCgpID0gMDsKLQotICB2aXJ0dWFsIGJvb2wgaXNfbXV0ZWQoKSA9IDA7Ci0KLSAgLy8gTk9UIHBhcnQgb2YgQ2hyb21pdW0ncyBBdWRpb1JlbmRlcmVyQWxnb3JpdGhtLiBBZGRlZCBiZWNhdXNlIG91ciBhbGdvcml0aG0KLSAgLy8gc29tZXRpbWVzIGhhcyB0byByZXNhbXBsZSB0byBhIGRpZmZlcmVudCBzYW1wbGUgcmF0ZSBhcyBwYXJ0IG9mIHByb2Nlc3NpbmcuCi0gIHZpcnR1YWwgaW50IG91dHB1dF9zYW1wbGVfcmF0ZSgpID0gMDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0ZJTFRFUlNfU0hFTExfQVVESU9fUkVOREVSRVJfQUxHT1JJVEhNX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9hdWRpb19yZW5kZXJlcl9pbXBsLmNjIGIvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfYXVkaW9fcmVuZGVyZXJfaW1wbC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFiNTExNS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9hdWRpb19yZW5kZXJlcl9pbXBsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL3NoZWxsX2F1ZGlvX3JlbmRlcmVyX2ltcGwuaCIKLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvYmluZF9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2tfaGVscGVycy5oIgotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL3N0cmluZ3ByaW50Zi5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fZGVjb2Rlcl9jb25maWcuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2JpbmRfdG9fbG9vcC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYnVmZmVycy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVtdXhlcl9zdHJlYW0uaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL2F1ZGlvX2RlY29kZXJfc2VsZWN0b3IuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL2RlY3J5cHRpbmdfZGVtdXhlcl9zdHJlYW0uaCIKLSNpbmNsdWRlICJtZWRpYS9tcDQvYWFjLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIHN0YXRpYwotU2hlbGxBdWRpb1JlbmRlcmVyKiBTaGVsbEF1ZGlvUmVuZGVyZXI6OkNyZWF0ZSgKLSAgICBBdWRpb1JlbmRlcmVyU2luayogc2luaywKLSAgICBjb25zdCBTZXREZWNyeXB0b3JSZWFkeUNCJiBzZXRfZGVjcnlwdG9yX3JlYWR5X2NiLAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4mIG1lc3NhZ2VfbG9vcCkgewotICByZXR1cm4gbmV3IFNoZWxsQXVkaW9SZW5kZXJlckltcGwoc2luaywgc2V0X2RlY3J5cHRvcl9yZWFkeV9jYiwgbWVzc2FnZV9sb29wKTsKLX0KLQotU2hlbGxBdWRpb1JlbmRlcmVySW1wbDo6U2hlbGxBdWRpb1JlbmRlcmVySW1wbCgKLSAgICBBdWRpb1JlbmRlcmVyU2luayogc2luaywKLSAgICBjb25zdCBTZXREZWNyeXB0b3JSZWFkeUNCJiBzZXRfZGVjcnlwdG9yX3JlYWR5X2NiLAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4mIG1lc3NhZ2VfbG9vcCkKLSAgICA6IHNpbmtfKHNpbmspLAotICAgICAgc2V0X2RlY3J5cHRvcl9yZWFkeV9jYl8oc2V0X2RlY3J5cHRvcl9yZWFkeV9jYiksCi0gICAgICBtZXNzYWdlX2xvb3BfKG1lc3NhZ2VfbG9vcCksCi0gICAgICBzdGF0ZV8oa1VuaW5pdGlhbGl6ZWQpLAotICAgICAgZW5kX29mX3N0cmVhbV9zdGF0ZV8oa1dhaXRpbmdGb3JFT1MpLAotICAgICAgZGVjb2RlZF9hdWRpb19idXNfKE5VTEwpLAotICAgICAgZGVjb2RlX2NvbXBsZXRlXyhmYWxzZSkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXyAhPSBOVUxMKTsKLX0KLQotU2hlbGxBdWRpb1JlbmRlcmVySW1wbDo6flNoZWxsQXVkaW9SZW5kZXJlckltcGwoKSB7Ci0gIC8vIFN0b3AoKSBkb2VzIHRoZSBtYWluIHRlYXJkb3duIHdvcmssIGFuZCBzaG91bGQgYWx3YXlzIGJlIGNhbGxlZAotICAvLyBiZWZvcmUgdGhlIG9iamVjdCBpcyBkZXN0cm95ZWQuCi0gIERDSEVDSyhzdGF0ZV8gPT0ga1VuaW5pdGlhbGl6ZWQgfHwgc3RhdGVfID09IGtTdG9wcGVkKTsKLX0KLQotdm9pZCBTaGVsbEF1ZGlvUmVuZGVyZXJJbXBsOjpQbGF5KGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSB7Ci0gIFRSQUNFX0VWRU5UMCgibWVkaWFfc3RhY2siLCAiU2hlbGxBdWRpb1JlbmRlcmVySW1wbDo6UGxheSgpIik7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBEQ0hFQ0tfRVEoc3RhdGVfLCBrUGF1c2VkKTsKLSAgc3RhdGVfID0ga1BsYXlpbmc7Ci0gIGNhbGxiYWNrLlJ1bigpOwotCi0gIERvUGxheSgpOwotfQotCi12b2lkIFNoZWxsQXVkaW9SZW5kZXJlckltcGw6OkRvUGxheSgpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIERDSEVDS19FUShzdGF0ZV8sIGtQbGF5aW5nKTsKLSAgaWYgKHBsYXliYWNrX3JhdGVfID4gMC4wZikgewotICAgIHNpbmtfLT5QbGF5KCk7Ci0gIH0KLX0KLQotdm9pZCBTaGVsbEF1ZGlvUmVuZGVyZXJJbXBsOjpQYXVzZShjb25zdCBiYXNlOjpDbG9zdXJlJiBjYWxsYmFjaykgewotICBUUkFDRV9FVkVOVDAoIm1lZGlhX3N0YWNrIiwgIlNoZWxsQXVkaW9SZW5kZXJlckltcGw6OlBhdXNlKCkiKTsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIERDSEVDSyhzdGF0ZV8gPT0ga1BsYXlpbmcgfHwgc3RhdGVfID09IGtVbmRlcmZsb3cgfHwgc3RhdGVfID09IGtSZWJ1ZmZlcmluZyk7Ci0gIHNpbmtfLT5QYXVzZShmYWxzZSk7Ci0KLSAgc3RhdGVfID0ga1BhdXNlZDsKLSAgewotICAgIGJhc2U6OkF1dG9Mb2NrIGxvY2socmVuZGVyZXJfY2JfbG9ja18pOwotICAgIERDSEVDSyhyZW5kZXJlcl9pZGxlX2NiXy5pc19udWxsKCkpOwotICAgIHJlbmRlcmVyX2lkbGVfY2JfID0gQmluZFRvQ3VycmVudExvb3AoY2FsbGJhY2spOwotICB9Ci19Ci0KLXZvaWQgU2hlbGxBdWRpb1JlbmRlcmVySW1wbDo6Rmx1c2goY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spIHsKLSAgVFJBQ0VfRVZFTlQwKCJtZWRpYV9zdGFjayIsICJTaGVsbEF1ZGlvUmVuZGVyZXJJbXBsOjpGbHVzaCgpIik7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBEQ0hFQ0tfRVEoc3RhdGVfLCBrUGF1c2VkKTsKLSAgRENIRUNLX0VRKGRlY29kZWRfYXVkaW9fYnVzXywgKEF1ZGlvQnVzKilOVUxMKTsKLQotICAvLyBQYXVzZSBhbmQgZmx1c2ggdGhlIHNpbmsuIERvIHRoaXMgb25seSBpZiB0aGVyZSBpcyBub3QgYSBkZWNvZGUgcGVuZGluZwotICAvLyBiZWNhdXNlIHRoZSBzaW5rIGV4cGVjdHMgdGhhdCBpdCB3aWxsIG5vdCBiZSBmbHVzaGVkIHdoaWxlIGEgcmVhZCBpcwotICAvLyBpbiBwcm9jZXNzCi0gIHNpbmtfLT5QYXVzZSh0cnVlKTsKLQotICAvLyBSZXNldCB0aGUgZGVjb2Rlci4gSXQgd2lsbCBjYWxsIHRoZSBjYWxsYmFjayB3aGVuIGl0IGhhcyBmaW5pc2hlZC4KLSAgZGVjb2Rlcl8tPlJlc2V0KGNhbGxiYWNrKTsKLX0KLQotdm9pZCBTaGVsbEF1ZGlvUmVuZGVyZXJJbXBsOjpTdG9wKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotCi0gIC8vIENhbGxlZCBieSB0aGUgRGVjb2RlciBvbmNlIGl0IGZpbmlzaGVzIHJlc2V0dGluZwotICBiYXNlOjpDbG9zdXJlIHJlc2V0X2NvbXBsZXRlX2NiID0KLSAgICAgIGJhc2U6OkJpbmQoJlNoZWxsQXVkaW9SZW5kZXJlckltcGw6Ok9uRGVjb2RlclJlc2V0LCB0aGlzLCBjYWxsYmFjayk7Ci0KLSAgc3dpdGNoIChzdGF0ZV8pIHsKLSAgICBjYXNlIGtVbmluaXRpYWxpemVkOgotICAgIGNhc2Uga1N0b3BwZWQ6Ci0gICAgICBEQ0hFQ0tfRVEoZGVjb2Rlcl8sIHJlaW50ZXJwcmV0X2Nhc3Q8QXVkaW9EZWNvZGVyKj4oTlVMTCkpOwotICAgICAgLy8gSnVzdCBwb3N0IHRoaXMgdG8gdGhlIG1lc3NhZ2UgbG9vcCwgc2luY2UgdGhlIFNpbmsKLSAgICAgIC8vIGlzIG5vdCB5ZXQgcnVubmluZwotICAgICAgbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soRlJPTV9IRVJFLCByZXNldF9jb21wbGV0ZV9jYik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtQcmVyb2xsaW5nOgotICAgIGNhc2Uga1BsYXlpbmc6Ci0gICAgY2FzZSBrUmVidWZmZXJpbmc6Ci0gICAgY2FzZSBrVW5kZXJmbG93OgotICAgIGNhc2Uga1BhdXNlZDogewotICAgICAgLy8gU2V0IHRvIGtTdG9wcGluZyBzdGF0ZSB0byBzdG9wIGZ1cnRoZXIgcmVxdWVzdHMgZm9yIGF1ZGlvLCBhbmQgc2V0Ci0gICAgICAvLyBhIGNhbGxiYWNrIHRoYXQgdGhlIEgvVyByZW5kZXJlciB0aHJlYWQgd2lsbCBjYWxsIHdoZW4gaXQgaXMgaWRsZS4KLSAgICAgIHN0YXRlXyA9IGtTdG9wcGluZzsKLSAgICAgIHNpbmtfLT5QYXVzZShmYWxzZSk7Ci0gICAgICB7Ci0gICAgICAgIGJhc2U6OkF1dG9Mb2NrIGxvY2socmVuZGVyZXJfY2JfbG9ja18pOwotICAgICAgICAvLyBDYWxsZWQgd2hlbiB0aGUgc2luayBpcyBubyBsb25nZXIgcmVxdWVzdGluZyBhdWRpbwotICAgICAgICByZW5kZXJlcl9pZGxlX2NiXyA9IEJpbmRUb0N1cnJlbnRMb29wKAotICAgICAgICAgICAgYmFzZTo6QmluZCgmQXVkaW9EZWNvZGVyOjpSZXNldCwgZGVjb2Rlcl8sIHJlc2V0X2NvbXBsZXRlX2NiKSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBrU3RvcHBpbmc6Ci0gICAgZGVmYXVsdDoKLSAgICAgIE5PVFJFQUNIRUQoKTsKLSAgICAgIGVycm9yX2NiXy5SdW4oUElQRUxJTkVfRVJST1JfSU5WQUxJRF9TVEFURSk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIFNoZWxsQXVkaW9SZW5kZXJlckltcGw6Ok9uRGVjb2RlclJlc2V0KGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSB7Ci0gIFRSQUNFX0VWRU5UMCgibWVkaWFfc3RhY2siLCAiU2hlbGxBdWRpb1JlbmRlcmVySW1wbDo6T25EZWNvZGVyUmVzZXQoKSIpOwotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgRENIRUNLKHN0YXRlXyA9PSBrU3RvcHBpbmcgfHwgc3RhdGVfID09IGtVbmluaXRpYWxpemVkKTsKLSAgRENIRUNLX0VRKGRlY29kZWRfYXVkaW9fYnVzXywgKEF1ZGlvQnVzKilOVUxMKTsKLSAgRENIRUNLKHJlbmRlcmVyX2lkbGVfY2JfLmlzX251bGwoKSk7Ci0KLSAgZGVjb2Rlcl8gPSBOVUxMOwotICBpZiAoc3RhdGVfICE9IGtVbmluaXRpYWxpemVkICYmIHN0YXRlXyAhPSBrU3RvcHBlZCkgewotICAgIERDSEVDS19ORShzaW5rXywgKEF1ZGlvUmVuZGVyZXJTaW5rKilOVUxMKTsKLSAgICBzaW5rXy0+U3RvcCgpOwotICB9Ci0gIHNpbmtfID0gTlVMTDsKLSAgZGVjb2RlZF9hdWRpb19idXNfID0gTlVMTDsKLSAgZGVjb2RlX2NvbXBsZXRlXyA9IGZhbHNlOwotICBidWZmZXJlZF90aW1lc3RhbXBfID0gYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcygwKTsKLSAgcmVuZGVyZWRfdGltZXN0YW1wXyA9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoMCk7Ci0gIHNpbGVuY2VfcmVuZGVyZWRfID0gYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcygwKTsKLSAgZW5kX29mX3N0cmVhbV9zdGF0ZV8gPSBrV2FpdGluZ0ZvckVPUzsKLSAgcGxheWJhY2tfcmF0ZV8gPSAxLjBmOwotICBzdGF0ZV8gPSBrU3RvcHBlZDsKLSAgY2FsbGJhY2suUnVuKCk7Ci19Ci0KLXZvaWQgU2hlbGxBdWRpb1JlbmRlcmVySW1wbDo6U2V0UGxheWJhY2tSYXRlKGZsb2F0IHJhdGUpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIHBsYXliYWNrX3JhdGVfID0gcmF0ZTsKLSAgaWYgKHBsYXliYWNrX3JhdGVfID09IDAuMGYpCi0gICAgc2lua18tPlBhdXNlKGZhbHNlKTsKLSAgZWxzZSBpZiAoc3RhdGVfID09IGtQbGF5aW5nKQotICAgIERvUGxheSgpOwotfQotCi12b2lkIFNoZWxsQXVkaW9SZW5kZXJlckltcGw6OkluaXRpYWxpemUoCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiYgc3RyZWFtLAotICAgIGNvbnN0IEF1ZGlvRGVjb2Rlckxpc3QmIGRlY29kZXJzLAotICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGluaXRfY2IsCi0gICAgY29uc3QgU3RhdGlzdGljc0NCJiBzdGF0aXN0aWNzX2NiLAotICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIHVuZGVyZmxvd19jYiwKLSAgICBjb25zdCBUaW1lQ0ImIHRpbWVfY2IsCi0gICAgY29uc3QgYmFzZTo6Q2xvc3VyZSYgZW5kZWRfY2IsCi0gICAgY29uc3QgYmFzZTo6Q2xvc3VyZSYgZGlzYWJsZWRfY2IsCi0gICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgZXJyb3JfY2IpIHsKLSAgVFJBQ0VfRVZFTlQwKCJtZWRpYV9zdGFjayIsICJTaGVsbEF1ZGlvUmVuZGVyZXJJbXBsOjpPbkRlY29kZXJSZXNldCgpIik7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICB1bmRlcmZsb3dfY2JfID0gdW5kZXJmbG93X2NiOwotICB0aW1lX2NiXyA9IHRpbWVfY2I7Ci0gIGluaXRfY2JfID0gaW5pdF9jYjsKLSAgZW5kZWRfY2JfID0gZW5kZWRfY2I7Ci0gIGVycm9yX2NiXyA9IGVycm9yX2NiOwotCi0gIHN0YXRlXyA9IGtVbmluaXRpYWxpemVkOwotICBwbGF5YmFja19yYXRlXyA9IDEuMGY7Ci0gIGVuZF9vZl9zdHJlYW1fc3RhdGVfID0ga1dhaXRpbmdGb3JFT1M7Ci0gIERDSEVDS19FUShkZWNvZGVkX2F1ZGlvX2J1c18sIChBdWRpb0J1cyopTlVMTCk7Ci0gIGRlY29kZWRfYXVkaW9fYnVzXyA9IE5VTEw7Ci0gIGRlY29kZV9jb21wbGV0ZV8gPSBmYWxzZTsKLQotICBzY29wZWRfcHRyPEF1ZGlvRGVjb2RlclNlbGVjdG9yPiBkZWNvZGVyX3NlbGVjdG9yKG5ldyBBdWRpb0RlY29kZXJTZWxlY3RvcigKLSAgICAgIGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk6OmN1cnJlbnQoKSwgZGVjb2RlcnMsIHNldF9kZWNyeXB0b3JfcmVhZHlfY2JfKSk7Ci0gIEF1ZGlvRGVjb2RlclNlbGVjdG9yKiBkZWNvZGVyX3NlbGVjdG9yX3B0ciA9IGRlY29kZXJfc2VsZWN0b3IuZ2V0KCk7Ci0gIGRlY29kZXJfc2VsZWN0b3JfcHRyLT5TZWxlY3RBdWRpb0RlY29kZXIoCi0gICAgICBzdHJlYW0sIHN0YXRpc3RpY3NfY2IsCi0gICAgICBiYXNlOjpCaW5kKCZTaGVsbEF1ZGlvUmVuZGVyZXJJbXBsOjpPbkRlY29kZXJTZWxlY3RlZCwgdGhpcywKLSAgICAgICAgICAgICAgICAgYmFzZTo6UGFzc2VkKCZkZWNvZGVyX3NlbGVjdG9yKSkpOwotfQotCi12b2lkIFNoZWxsQXVkaW9SZW5kZXJlckltcGw6Ok9uRGVjb2RlclNlbGVjdGVkKAotICAgIHNjb3BlZF9wdHI8QXVkaW9EZWNvZGVyU2VsZWN0b3I+IGRlY29kZXJfc2VsZWN0b3IsCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxBdWRpb0RlY29kZXI+JiBzZWxlY3RlZF9kZWNvZGVyLAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW0+JiBkZWNyeXB0aW5nX2RlbXV4ZXJfc3RyZWFtKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotCi0gIGlmIChzaW5rXyA9PSBOVUxMKSB7Ci0gICAgLy8gU3RvcCBoYXMgYmVlbiBjYWxsZWQsIHdlIHNob3VsZG4ndCBkbyBhbnl0aGluZyBmdXJ0aGVyLgotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzZWxlY3RlZF9kZWNvZGVyID09IE5VTEwpIHsKLSAgICBETE9HKFdBUk5JTkcpIDw8ICJOVUxMIGRlY29kZXIgc2VsZWN0ZWQiOwotICAgIGluaXRfY2JfLlJ1bihERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIGV4dHJhY3QgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBkZW11eGVyCi0gIENoYW5uZWxMYXlvdXQgY2hhbm5lbF9sYXlvdXQgPSBzZWxlY3RlZF9kZWNvZGVyLT5jaGFubmVsX2xheW91dCgpOwotICBpbnQgY2hhbm5lbHMgPSBDaGFubmVsTGF5b3V0VG9DaGFubmVsQ291bnQoY2hhbm5lbF9sYXlvdXQpOwotICAvLyBUT0RPOiBGaW5kIGEgcHJvcGVyIHdheSB0byBjaGVjayBuYXRpdmUgY2hhbm5lbCBzdXBwb3J0IGhlcmUsIGluY2x1ZGluZwotICAvLyBwcm9wZXIgd2F5IHRvIGRldGVybWluYXRlIGlmIDUuMSBvciA3LjEgaXMgcHJlc2VudC4KLSAgaWYgKGNoYW5uZWxzICE9IDEgJiYgY2hhbm5lbHMgIT0gMiAmJiBjaGFubmVscyAhPSA2KSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCAid2Ugb25seSBzdXBwb3J0IDEsIDIgYW5kIDYgY2hhbm5lbCBhdWRpbyI7Ci0gICAgaW5pdF9jYl8uUnVuKERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZGVjb2Rlcl8gPSBzZWxlY3RlZF9kZWNvZGVyOwotICBkZWNyeXB0aW5nX2RlbXV4ZXJfc3RyZWFtXyA9IGRlY3J5cHRpbmdfZGVtdXhlcl9zdHJlYW07Ci0KLSAgLy8gY29uc3RydWN0IGF1ZGlvIHBhcmFtZXRlcnMgZm9yIHRoZSBzaW5rCi0gIGF1ZGlvX3BhcmFtZXRlcnNfID0gQXVkaW9QYXJhbWV0ZXJzKAotICAgICAgQXVkaW9QYXJhbWV0ZXJzOjpBVURJT19QQ01fTE9XX0xBVEVOQ1ksIGNoYW5uZWxfbGF5b3V0LAotICAgICAgZGVjb2Rlcl8tPnNhbXBsZXNfcGVyX3NlY29uZCgpLCBkZWNvZGVyXy0+Yml0c19wZXJfY2hhbm5lbCgpLAotICAgICAgbXA0OjpBQUM6OmtGcmFtZXNQZXJBY2Nlc3NVbml0KTsKLQotICBzdGF0ZV8gPSBrUGF1c2VkOwotCi0gIERDSEVDSyhzaW5rXy5nZXQoKSk7Ci0gIC8vIGluaXRpYWxpemUgYW5kIHN0YXJ0IHRoZSBzaW5rCi0gIHNpbmtfLT5Jbml0aWFsaXplKGF1ZGlvX3BhcmFtZXRlcnNfLCB0aGlzKTsKLSAgc2lua18tPlN0YXJ0KCk7Ci0KLSAgLy8gcnVuIHRoZSBzdGFydHVwIGNhbGxiYWNrLCB3ZSdyZSByZWFkeSB0byBnbwotICBpbml0X2NiXy5SdW4oUElQRUxJTkVfT0spOwotfQotCi12b2lkIFNoZWxsQXVkaW9SZW5kZXJlckltcGw6OlByZXJvbGwoYmFzZTo6VGltZURlbHRhIHRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgY2FsbGJhY2spIHsKLSAgbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soCi0gICAgICBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kKCZTaGVsbEF1ZGlvUmVuZGVyZXJJbXBsOjpEb1ByZXJvbGwsIHRoaXMsIHRpbWUsIGNhbGxiYWNrKSk7Ci19Ci0KLXZvaWQgU2hlbGxBdWRpb1JlbmRlcmVySW1wbDo6RG9QcmVyb2xsKGJhc2U6OlRpbWVEZWx0YSB0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgY2FsbGJhY2spIHsKLSAgLy8gU3RvcCgpIGNhbiBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgUHJlcm9sbCgpIHdoaWNoIHdpbGwgc2V0IHRoZSBzdGF0ZQotICAvLyB0byBrU3RvcHBpbmcgb3Iga1N0b3BwZWQuIFdlIHNob3VsZG4ndCBjb250aW51ZSB0aGUgcHJlcm9sbCBwcm9jZXNzIGluIHRoaXMKLSAgLy8gY2FzZS4KLSAgaWYgKHN0YXRlXyA9PSBrU3RvcHBpbmcgfHwgc3RhdGVfID09IGtTdG9wcGVkKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gU3RhcnQgd2lsbCBiZWdpbiBmaWxsaW5nIHRoZSBBdWRpb0J1cyB3aXRoIGRhdGEsIGFuZCB0aGUgU3RyZWFtZXIKLSAgLy8gd2lsbCBiZSBwYXVzZWQgdW50aWwgZGF0YSBpcyBmdWxsCi0gIGJ1ZmZlcmVkX3RpbWVzdGFtcF8gPSBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWNyb3NlY29uZHMoMCk7Ci0gIHByZXJvbGxfY2JfID0gY2FsbGJhY2s7Ci0gIHByZXJvbGxfdGltZXN0YW1wXyA9IHRpbWU7Ci0gIHN0YXRlXyA9IGtQcmVyb2xsaW5nOwotICBlbmRfb2Zfc3RyZWFtX3N0YXRlXyA9IGtXYWl0aW5nRm9yRU9TOwotfQotCi12b2lkIFNoZWxsQXVkaW9SZW5kZXJlckltcGw6OkRvVW5kZXJmbG93KCkgewotICBUUkFDRV9FVkVOVDAoIm1lZGlhX3N0YWNrIiwgIlNoZWxsQXVkaW9SZW5kZXJlckltcGw6OkRvVW5kZXJmbG93KCkiKTsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIC8vIGRvbid0IHJlcHJvY2VzcyBpZiB3ZSd2ZSBhbHJlYWR5IHNldCBvdXIgc3RhdGUsIG9yIGFscmVhZHkgZ290IEVPUwotICBpZiAoc3RhdGVfID09IGtVbmRlcmZsb3cgfHwgZW5kX29mX3N0cmVhbV9zdGF0ZV8gPj0ga1JlY2VpdmVkRU9TKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIERMT0coSU5GTykgPDwgImF1ZGlvIHJlbmRlcmVyIHJlZ2lzdGVyZWQgdW5kZXJmbG93IjsKLSAgLy8gbm93IHNldCB0aGUgc3RhdGUgZmxhZwotICBzdGF0ZV8gPSBrVW5kZXJmbG93OwotICAvLyBwYXVzZSB0aGUgc2luaywgd2hpY2ggd29uJ3Qgc3RvcCByZXF1ZXN0cyBidXQgd2lsbCBzdG9wIGNvbnN1bXB0aW9uCi0gIC8vIG9mIGF1ZGlvIGJ5IHRoZSByZW5kZXJpbmcgaGFyZHdhcmUuCi0gIHNpbmtfLT5QYXVzZShmYWxzZSk7Ci0gIC8vIGluZm9ybSB0aGUgcGlwZWxpbmUgdGhhdCB3ZSd2ZSB1bmRlcmZsb3dlZAotICB1bmRlcmZsb3dfY2JfLlJ1bigpOwotfQotCi0vLyBjYWxsZWQgYnkgdGhlIFBpcGVsaW5lIHRvIGluZGljYXRlIHRoYXQgaXQgaGFzIHByb2Nlc3NlZCB0aGUgdW5kZXJmbG93Ci0vLyB3ZSBhbm5vdW5jZWQsIGFuZCB0aGF0IHdlIHNob3VsZCBiZWdpbiByZWJ1ZmZlcmluZwotdm9pZCBTaGVsbEF1ZGlvUmVuZGVyZXJJbXBsOjpSZXN1bWVBZnRlclVuZGVyZmxvdyhib29sIGJ1ZmZlcl9tb3JlX2F1ZGlvKSB7Ci0gIG1lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZTaGVsbEF1ZGlvUmVuZGVyZXJJbXBsOjpEb1Jlc3VtZUFmdGVyVW5kZXJmbG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIGJ1ZmZlcl9tb3JlX2F1ZGlvKSk7Ci19Ci0KLXZvaWQgU2hlbGxBdWRpb1JlbmRlcmVySW1wbDo6RG9SZXN1bWVBZnRlclVuZGVyZmxvdyhib29sIGJ1ZmZlcl9tb3JlX2F1ZGlvKSB7Ci0gIFRSQUNFX0VWRU5UMCgibWVkaWFfc3RhY2siLAotICAgICAgICAgICAgICAgIlNoZWxsQXVkaW9SZW5kZXJlckltcGw6OkRvUmVzdW1lQWZ0ZXJVbmRlcmZsb3coKSIpOwotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgaWYgKHN0YXRlXyA9PSBrVW5kZXJmbG93KSB7Ci0gICAgc3RhdGVfID0ga1JlYnVmZmVyaW5nOwotICAgIHNpbmtfLT5SZXN1bWVBZnRlclVuZGVyZmxvdyhidWZmZXJfbW9yZV9hdWRpbyk7Ci0gIH0KLX0KLQotdm9pZCBTaGVsbEF1ZGlvUmVuZGVyZXJJbXBsOjpTaW5rRnVsbCgpIHsKLSAgbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJlNoZWxsQXVkaW9SZW5kZXJlckltcGw6OkRvU2lua0Z1bGwsIHRoaXMpKTsKLX0KLQotdm9pZCBTaGVsbEF1ZGlvUmVuZGVyZXJJbXBsOjpEb1NpbmtGdWxsKCkgewotICBUUkFDRV9FVkVOVDAoIm1lZGlhX3N0YWNrIiwgIlNoZWxsQXVkaW9SZW5kZXJlckltcGw6OkRvU2lua0Z1bGwoKSIpOwotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgaWYgKHN0YXRlXyA9PSBrUHJlcm9sbGluZykgewotICAgIERDSEVDSyghcHJlcm9sbF9jYl8uaXNfbnVsbCgpKTsKLSAgICAvLyB3ZSB0cmFuc2l0aW9uIGZyb20gcHJlcm9sbCB0byBhIHBhdXNlCi0gICAgc3RhdGVfID0ga1BhdXNlZDsKLSAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcHJlcm9sbF9jYl8pLlJ1bihQSVBFTElORV9PSyk7Ci0gIH0gZWxzZSBpZiAoc3RhdGVfID09IGtVbmRlcmZsb3cgfHwgc3RhdGVfID09IGtSZWJ1ZmZlcmluZykgewotICAgIC8vIHdlIHBhdXNlIHRoZSBzaW5rIGR1cmluZyBhbiB1bmRlcmZsb3csIHNvIG5vdyByZXN1bWUKLSAgICBzdGF0ZV8gPSBrUGxheWluZzsKLSAgICBEb1BsYXkoKTsKLSAgfQotfQotCi12b2lkIFNoZWxsQXVkaW9SZW5kZXJlckltcGw6OlNpbmtVbmRlcmZsb3coKSB7Ci0gIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgYnkgdGhlIEF1ZGlvIFJlbmRlcmVyIHRocmVhZAotICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzaygKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmU2hlbGxBdWRpb1JlbmRlcmVySW1wbDo6RG9VbmRlcmZsb3csIHRoaXMpKTsKLX0KLQotdm9pZCBTaGVsbEF1ZGlvUmVuZGVyZXJJbXBsOjpTZXRWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBpZiAoc2lua18pCi0gICAgc2lua18tPlNldFZvbHVtZSh2b2x1bWUpOwotfQotCi12b2lkIFNoZWxsQXVkaW9SZW5kZXJlckltcGw6OkRlY29kZWRBdWRpb1JlYWR5KAotICAgIEF1ZGlvRGVjb2Rlcjo6U3RhdHVzIHN0YXR1cywKLSAgICBjb25zdCBBdWRpb0RlY29kZXI6OkJ1ZmZlcnMmIGJ1ZmZlcnMpIHsKLSAgVFJBQ0VfRVZFTlQxKCJtZWRpYV9zdGFjayIsICJTaGVsbEF1ZGlvUmVuZGVyZXJJbXBsOjpEZWNvZGVkQXVkaW9SZWFkeSgpIiwKLSAgICAgICAgICAgICAgICJzdGF0dXMiLCBzdGF0dXMpOwotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgLy8gU2hlbGxBdWRpb1JlbmRlcmVySW1wbCBkb2Vzbid0IHN1cHBvcnQgZGVjb2Rpbmcgb3V0cHV0IG9mIG1vcmUgdGhhbiBvbmUKLSAgLy8gYnVmZmVyLgotICBEQ0hFQ0tfTEUoYnVmZmVycy5zaXplKCksIDEpOwotICBEQ0hFQ0soIWRlY29kZV9jb21wbGV0ZV8pOwotICBEQ0hFQ0tfTkUoZGVjb2RlZF9hdWRpb19idXNfLCAoQXVkaW9CdXMqKU5VTEwpOwotCi0gIGlmIChzdGF0dXMgPT0gQXVkaW9EZWNvZGVyOjprT2spIHsKLSAgICBpZiAoYnVmZmVycy5lbXB0eSgpKSB7Ci0gICAgICBETE9HKFdBUk5JTkcpIDw8ICJnb3QgZW1wdHkgYnVmZmVycyBmcm9tIGRlY29kZXIiOwotICAgIH0gZWxzZSBpZiAoc3RhdGVfID09IGtTdG9wcGVkKSB7Ci0gICAgICBETE9HKFdBUk5JTkcpIDw8ICJlbnF1ZXVlIGFmdGVyIHN0b3AuIjsKLSAgICB9IGVsc2UgewotICAgICAgc2NvcGVkX3JlZnB0cjxCdWZmZXI+IGJ1ZmZlciA9IGJ1ZmZlcnNbMF07Ci0gICAgICBpZiAoYnVmZmVyLT5Jc0VuZE9mU3RyZWFtKCkpIHsKLSAgICAgICAgaWYgKGVuZF9vZl9zdHJlYW1fc3RhdGVfID09IGtXYWl0aW5nRm9yRU9TKQotICAgICAgICAgIGVuZF9vZl9zdHJlYW1fc3RhdGVfID0ga1JlY2VpdmVkRU9TOwotICAgICAgICAvLyAgaWYgd2Ugd2VyZSByZWJ1ZmZlcmluZyB0cmFuc2l0aW9uIGJhY2sgdG8gcGxheWluZyBhcyB3ZQotICAgICAgICAvLyAgd2lsbCBuZXZlciByZWNlaXZlIGFkZGl0aW9uYWwgZGF0YQotICAgICAgICBpZiAoc3RhdGVfID09IGtVbmRlcmZsb3cgfHwgc3RhdGVfID09IGtSZWJ1ZmZlcmluZykgewotICAgICAgICAgIHN0YXRlXyA9IGtQbGF5aW5nOwotICAgICAgICAgIERvUGxheSgpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBIZXJlIHdlIGFzc3VtZSB0aGF0IGEgbm9uLWludGVybGVhdmVkIGF1ZGlvX2J1cyBtZWFucyB0aGF0IHRoZQotICAgICAgICAvLyBkZWNvZGVyIG91dHB1dCBpcyBpbiBwbGFuYXIgZm9ybSwgd2hlcmUgZWFjaCBjaGFubmVsIGZvbGxvd3MgdGhlCi0gICAgICAgIC8vIG90aGVyIGluIHRoZSBkZWNvZGVkIGJ1ZmZlci4KLSAgICAgICAgaW50IGF1ZGlvX2J1c19zaXplX3Blcl9jaGFubmVsX2luX2J5dGVzID0KLSAgICAgICAgICAgIGJ1ZmZlci0+R2V0RGF0YVNpemUoKSAvIGRlY29kZWRfYXVkaW9fYnVzXy0+Y2hhbm5lbHMoKTsKLSAgICAgICAgLy8gVE9ETzogQ2hhbmdlIHRoaXMgdG8gRENIRUNLX0xFIG9uY2Ugd2Ugc3VwcG9ydCBSZWFkIHdpdGggYXJiaXRyYXJ5Ci0gICAgICAgIC8vIHNpemUuCi0gICAgICAgIERDSEVDS19FUShhdWRpb19idXNfc2l6ZV9wZXJfY2hhbm5lbF9pbl9ieXRlcywKLSAgICAgICAgICAgICAgICAgIGRlY29kZWRfYXVkaW9fYnVzXy0+ZnJhbWVzKCkgKiBzaXplb2YoZmxvYXQpKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWNvZGVkX2F1ZGlvX2J1c18tPmNoYW5uZWxzKCk7ICsraSkgewotICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRlY29kZWRfY2hhbm5lbF9kYXRhID0KLSAgICAgICAgICAgICAgYnVmZmVyLT5HZXREYXRhKCkgKyAoaSAqIGF1ZGlvX2J1c19zaXplX3Blcl9jaGFubmVsX2luX2J5dGVzKTsKLSAgICAgICAgICBtZW1jcHkoZGVjb2RlZF9hdWRpb19idXNfLT5jaGFubmVsKGkpLCBkZWNvZGVkX2NoYW5uZWxfZGF0YSwKLSAgICAgICAgICAgICAgICAgYXVkaW9fYnVzX3NpemVfcGVyX2NoYW5uZWxfaW5fYnl0ZXMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBUaGlzIGlzIHJlYWQgYnkgdGhlIHJlbmRlcmVyIHRocmVhZCBpbiBSZW5kZXIoKSwgYnV0IHdpbGwgb25seSBiZSByZWFkCi0gICAgICAvLyB3aGVuIGRlY29kZV9jb21wbGV0ZV8gaXMgc2V0IHRvIHRydWUuCi0gICAgICBidWZmZXJlZF90aW1lc3RhbXBfID0gYnVmZmVyLT5HZXRUaW1lc3RhbXAoKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgRENIRUNLKHN0YXR1cyA9PSBBdWRpb0RlY29kZXI6OmtBYm9ydGVkIHx8Ci0gICAgICAgICAgIHN0YXR1cyA9PSBBdWRpb0RlY29kZXI6OmtEZWNvZGVFcnJvcik7Ci0gICAgRExPR19JRihXQVJOSU5HLCBzdGF0dXMgPT0gQXVkaW9EZWNvZGVyOjprRGVjb2RlRXJyb3IpCi0gICAgICAgIDw8ICJhdWRpbyBkZWNvZGVyIHJldHVybmVkIGRlY29kZSBlcnJvciI7Ci0gICAgRExPR19JRihJTkZPLCBzdGF0dXMgPT0gQXVkaW9EZWNvZGVyOjprQWJvcnRlZCkKLSAgICAgICAgPDwgImF1ZGlvIGRlY29kZXIgcmV0dXJuZWQgYWJvcnQiOwotICAgIC8vIFdlIG5lZWQgdG8gY2FsbCB0aGUgcHJlcm9sbCBjYWxsYmFjayB0byB1bndlZGdlIHRoZSBwaXBlbGluZSBvbiBmYWlsdXJlCi0gICAgaWYgKHN0YXRlXyA9PSBrUHJlcm9sbGluZykgewotICAgICAgLy8ga0Fib3J0ZWQgZG9lcyBub3Qgc2lnbmlmeSBhbiBlcnJvciBpbiB0aGUgcGlwZWxpbmUsIHNvIHJldHVybiBPSyBmb3IKLSAgICAgIC8vIHRoYXQgY2FzZSBhbmQgRVJST1IgZm9yIGFsbCBvdGhlcnMKLSAgICAgIHN0YXRlXyA9IGtQYXVzZWQ7Ci0gICAgICBQaXBlbGluZVN0YXR1cyBwaXBlbGluZV9zdGF0dXMgPSBzdGF0dXMgPT0gQXVkaW9EZWNvZGVyOjprQWJvcnRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUElQRUxJTkVfT0sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFBJUEVMSU5FX0VSUk9SX0RFQ09ERTsKLSAgICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZwcmVyb2xsX2NiXykuUnVuKHBpcGVsaW5lX3N0YXR1cyk7Ci0gICAgfQotICB9Ci0KLSAgLy8gU2lnbmFsIHRoYXQgdGhlIGRhdGEgaW4gcGVuZGluZ19kZWNvZGVfIGlzIG5vdyB2YWxpZDsKLSAgZGVjb2RlX3N0YXR1c18gPSBzdGF0dXM7Ci0gIGRlY29kZV9jb21wbGV0ZV8gPSB0cnVlOwotfQotCi0vLyBDQVVUSU9OOiB0aGlzIG1ldGhvZCB3aWxsIG5vdCB1c3VhbGx5IGV4ZWN1dGUgb24gdGhlIHJlbmRlcmVyIHRocmVhZCEKLS8vIFRoaXMgaXMgbm9ybWFsbHkgY2FsbGVkIGJ5IHRoZSBzeXN0ZW0gYXVkaW8gdGhyZWFkLCBhbmQgbXVzdCBub3QgYmxvY2sgb3IKLS8vIHBlcmZvcm0gaGlnaC1sYXRlbmN5IG9wZXJhdGlvbnMuCi1pbnQgU2hlbGxBdWRpb1JlbmRlcmVySW1wbDo6UmVuZGVyKEF1ZGlvQnVzKiBkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9fZGVsYXlfbWlsbGlzZWNvbmRzKSB7Ci0gIC8vIFVzZSB0aGUgcHJldmlvdXMgdmFsdWUgZm9yIHJlbmRlcmVkX3RpbWVzdGFtcF8gYW5kIGF1ZGlvX2RlbGF5X21pbGxpc2Vjb25kcwotICAvLyB0byBjYWxjdWxhdGUgdGhlIGN1cnJlbnQgcGxheWJhY2sgdGltZSBvZiB0aGUgYXVkaW8gc3RyZWFtZXIKLSAgY29uc3QgYmFzZTo6VGltZURlbHRhIGF1ZGlvX2RlbGF5ID0KLSAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyhhdWRpb19kZWxheV9taWxsaXNlY29uZHMpOwotCi0gIC8vIE9uY2UgdGhlIGRlbGF5IGlzIGxlc3MgdGhhbiB0aGUgYW1vdW50IG9mIHNpbGVuY2Ugd2UgaGF2ZSByZW5kZXJlZCwgdGhlbgotICAvLyB3ZSBrbm93IHRoYXQgd2UgaGF2ZSBwbGF5ZWQgdGhlIGxhc3Qgc2FtcGxlCi0gIGlmIChlbmRfb2Zfc3RyZWFtX3N0YXRlXyA9PSBrUmVuZGVyZWRFT1MpIHsKLSAgICBpZiAoc2lsZW5jZV9yZW5kZXJlZF8gPiBhdWRpb19kZWxheSkgewotICAgICAgZW5kX29mX3N0cmVhbV9zdGF0ZV8gPSBrUGxheWVkRU9TOwotICAgICAgbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soRlJPTV9IRVJFLCBlbmRlZF9jYl8pOwotICAgIH0KLSAgfQotCi0gIC8vIE9uY2Ugd2UndmUgY2FsbGVkIHRoZSBlbmRlZF9jYl8sIHdlIHNob3VsZCBubyBsb25nZXIgY2FsbCB0aGUgdGltZV9jYl8KLSAgaWYgKGVuZF9vZl9zdHJlYW1fc3RhdGVfIDwga1BsYXllZEVPUyAmJiBzdGF0ZV8gIT0ga1BhdXNlZCkgewotICAgIC8vIGFkanVzdCB0aGUgZGVsYXkgbGVuZ3RoIHRvIGFjY291bnQgZm9yIHRoZSBhbW91bnQgb2Ygc2lsZW5jZSB0aGF0IGhhcwotICAgIC8vIGJlZW4gcmVuZGVyZWQgdG8gdGhlIHNpbmsKLSAgICBjb25zdCBiYXNlOjpUaW1lRGVsdGEga1plcm9UaW1lRGVsdGEgPSBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMCk7Ci0gICAgYmFzZTo6VGltZURlbHRhIGFkanVzdGVkX2RlbGF5ID0gKGF1ZGlvX2RlbGF5IC0gc2lsZW5jZV9yZW5kZXJlZF8pOwotICAgIGlmIChhZGp1c3RlZF9kZWxheSA8IGtaZXJvVGltZURlbHRhKQotICAgICAgYWRqdXN0ZWRfZGVsYXkgPSBrWmVyb1RpbWVEZWx0YTsKLQotICAgIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSBjdXJyZW50X3RpbWUgPSByZW5kZXJlZF90aW1lc3RhbXBfIC0gYWRqdXN0ZWRfZGVsYXk7Ci0gICAgdGltZV9jYl8uUnVuKGN1cnJlbnRfdGltZSwgcmVuZGVyZWRfdGltZXN0YW1wXyk7Ci0gIH0KLQotICAvLyAwIGluZGljYXRlcyB0aGUgcmVhZCBpcyBzdGlsbCBwZW5kaW5nCi0gIGludCBmcmFtZXNfcmVuZGVyZWQgPSAwOwotCi0gIC8vIGRlc3QgaXMgTlVMTCwgdGhpcyBtZWFucyB0aGUgc2luayBkb2Vzbid0IG5lZWQgZGF0YSBhbmQgaXMganVzdAotICAvLyBwaW5naW5nIHVzIHdpdGggYW4gdXBkYXRlZCB0aW1lc3RhbXAKLSAgaWYgKGRlc3QgIT0gTlVMTCkgewotICAgIC8vIE5vIHBlbmRpbmcgZGVjb2RlLCBzbyBmaXJlIG9mZiB0aGUgUmVhZCBpZiB3ZSBhcmUgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUKLSAgICBpZiAoU2hvdWxkUXVldWVSZWFkKHN0YXRlXykgJiYgZGVjb2RlZF9hdWRpb19idXNfID09IE5VTEwpIHsKLSAgICAgIERDSEVDS19ORShkZXN0LCAoQXVkaW9CdXMqKU5VTEwpOwotICAgICAgZGVjb2RlX2NvbXBsZXRlXyA9IGZhbHNlOwotICAgICAgZGVjb2RlZF9hdWRpb19idXNfID0gZGVzdDsKLSAgICAgIGRlY29kZXJfLT5SZWFkKAotICAgICAgICAgIGJhc2U6OkJpbmQoJlNoZWxsQXVkaW9SZW5kZXJlckltcGw6OkRlY29kZWRBdWRpb1JlYWR5LCB0aGlzKSk7Ci0gICAgfQotCi0gICAgLy8gTXVzdCBiZSBwb2xsaW5nIGZvciB0aGUgUmVhZCB0aGF0IGlzIGN1cnJlbnRseSBpbiBwcm9ncmVzcwotICAgIGlmIChkZWNvZGVkX2F1ZGlvX2J1c18gIT0gTlVMTCAmJiBkZWNvZGVfY29tcGxldGVfKSB7Ci0gICAgICBEQ0hFQ0tfRVEoZGVzdCwgZGVjb2RlZF9hdWRpb19idXNfKTsKLSAgICAgIGRlY29kZWRfYXVkaW9fYnVzXyA9IE5VTEw7Ci0gICAgICBpZiAoZGVjb2RlX3N0YXR1c18gIT0gQXVkaW9EZWNvZGVyOjprT2spIHsKLSAgICAgICAgLy8gQW4gZXJyb3IgaGFzIG9jY3VycmVkLiBJbmRpY2F0ZSB0aGlzIHRvIHRoZSBzaW5rCi0gICAgICAgIGZyYW1lc19yZW5kZXJlZCA9IC0xOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGVuZF9vZl9zdHJlYW1fc3RhdGVfID09IGtXYWl0aW5nRm9yRU9TKSB7Ci0gICAgICAgICAgLy8gTm9ybWFsIGRlY29kZSBldmVudAotICAgICAgICAgIHJlbmRlcmVkX3RpbWVzdGFtcF8gPSBidWZmZXJlZF90aW1lc3RhbXBfOwotICAgICAgICAgIGZyYW1lc19yZW5kZXJlZCA9IG1wNDo6QUFDOjprRnJhbWVzUGVyQWNjZXNzVW5pdDsKLSAgICAgICAgfQotICAgICAgICBpZiAoZW5kX29mX3N0cmVhbV9zdGF0ZV8gPT0ga1JlY2VpdmVkRU9TKSB7Ci0gICAgICAgICAgZW5kX29mX3N0cmVhbV9zdGF0ZV8gPSBrUmVuZGVyZWRFT1M7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVuZF9vZl9zdHJlYW1fc3RhdGVfID09IGtSZW5kZXJlZEVPUykgewotICAgICAgICAgIGNvbnN0IGludCBieXRlc19wZXJfc2FtcGxlID0gYXVkaW9fcGFyYW1ldGVyc18uYml0c19wZXJfc2FtcGxlKCkgLyA4OwotICAgICAgICAgIC8vIFRPRE86IENoYW5nZSB0aGlzIHRvIERDSEVDS19MRSBhbmQgZmlsbCBvbmx5IGtGcmFtZXNQZXJBY2Nlc3NVbml0Ci0gICAgICAgICAgLy8gaW5zdGVhZCBvZiBkZXN0LT5mcmFtZXMoKSBvbmNlIHdlIHN1cHBvcnQgUmVhZCB3aXRoIGFyYml0cmFyeSBzaXplLgotICAgICAgICAgIERDSEVDS19FUShtcDQ6OkFBQzo6a0ZyYW1lc1BlckFjY2Vzc1VuaXQgKiBieXRlc19wZXJfc2FtcGxlICoKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhcmFtZXRlcnNfLmNoYW5uZWxzKCksCi0gICAgICAgICAgICAgICAgICAgIGRlc3QtPmZyYW1lcygpICogZGVzdC0+Y2hhbm5lbHMoKSAqIHNpemVvZihmbG9hdCkpOwotICAgICAgICAgIC8vIFdyaXRlIHplcm9zIChzaWxlbmNlKSB0byBlYWNoIGNoYW5uZWwKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc3QtPmNoYW5uZWxzKCk7ICsraSkgewotICAgICAgICAgICAgdm9pZCogY2hhbm5lbF9kYXRhID0gZGVzdC0+Y2hhbm5lbChpKTsKLSAgICAgICAgICAgIHNpemVfdCBudW1fYnl0ZXMgPQotICAgICAgICAgICAgICAgIGRlc3QtPmZyYW1lcygpICogc2l6ZW9mKGZsb2F0KTsgIC8vIE5PTElOVChydW50aW1lL3NpemVvZikKLSAgICAgICAgICAgIG1lbXNldChjaGFubmVsX2RhdGEsIDAsIG51bV9ieXRlcyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGZyYW1lc19yZW5kZXJlZCA9IG1wNDo6QUFDOjprRnJhbWVzUGVyQWNjZXNzVW5pdDsKLSAgICAgICAgICB1aW50NjRfdCBzaWxlbmNlX21zID0gbXA0OjpBQUM6OmtGcmFtZXNQZXJBY2Nlc3NVbml0ICogMTAwMCAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhcmFtZXRlcnNfLnNhbXBsZV9yYXRlKCk7Ci0gICAgICAgICAgc2lsZW5jZV9yZW5kZXJlZF8gKz0gYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKHNpbGVuY2VfbXMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKHN0YXRlXyA9PSBrU3RvcHBpbmcgJiYgZGVjcnlwdGluZ19kZW11eGVyX3N0cmVhbV8gIT0gTlVMTCkgewotICAgIC8vIFVzZSBhIGR1bW15IGNhbGxiYWNrIGFzIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIGV4YWN0IHRpbWUgdGhhdCBSZXNldCgpCi0gICAgLy8gZmluaXNoZXMuIE9uY2UgUmVzZXQoKSBpcyBkb25lIHRoZSBkZWNvZGVkX2F1ZGlvX2J1c18gd2lsbCBiZSBzZXQgdG8gTlVMTAotICAgIC8vIGFuZCB0aGUgcmVuZGVyZXJfaWRsZV9jYl8gd2lsbCBiZSBjYWxsZWQgaW4gdGhlIG5leHQgaWYgYmxvY2suIFRoaXMgd2lsbAotICAgIC8vIHJlc2V0IHRoZSBkZWNvZGVyIGFuZCBmaW5pc2ggdGhlIFN0b3AoKS4KLSAgICBkZWNyeXB0aW5nX2RlbXV4ZXJfc3RyZWFtXy0+UmVzZXQoYmFzZTo6QmluZChiYXNlOjpEb05vdGhpbmcpKTsKLSAgICBkZWNyeXB0aW5nX2RlbXV4ZXJfc3RyZWFtXyA9IE5VTEw7Ci0gIH0KLSAgaWYgKGRlY29kZWRfYXVkaW9fYnVzXyA9PSBOVUxMKSB7Ci0gICAgLy8gTm8gcGVuZGluZyBkZWNvZGUsIHNvIHdlIGFyZSBpZGxlLiBDYWxsIGFuZCBjbGVhcgotICAgIC8vIHRoZSBjYWxsYmFjayBpZiBpdCBpcyBzZXQuCi0gICAgcmVuZGVyZXJfY2JfbG9ja18uQWNxdWlyZSgpOwotICAgIGJhc2U6OkNsb3N1cmUgY2FsbGJhY2sgPSByZW5kZXJlcl9pZGxlX2NiXzsKLSAgICByZW5kZXJlcl9pZGxlX2NiXy5SZXNldCgpOwotICAgIHJlbmRlcmVyX2NiX2xvY2tfLlJlbGVhc2UoKTsKLSAgICBpZiAoIWNhbGxiYWNrLmlzX251bGwoKSkKLSAgICAgIGNhbGxiYWNrLlJ1bigpOwotICB9Ci0KLSAgcmV0dXJuIGZyYW1lc19yZW5kZXJlZDsKLX0KLQotdm9pZCBTaGVsbEF1ZGlvUmVuZGVyZXJJbXBsOjpPblJlbmRlckVycm9yKCkgewotICBzdGF0ZV8gPSBrVW5pbml0aWFsaXplZDsKLSAgZXJyb3JfY2JfLlJ1bihQSVBFTElORV9FUlJPUl9DT1VMRF9OT1RfUkVOREVSKTsKLX0KLQotYm9vbCBTaGVsbEF1ZGlvUmVuZGVyZXJJbXBsOjpTaG91bGRRdWV1ZVJlYWQoU3RhdGUgc3RhdGUpIHsKLSAgc3dpdGNoIChzdGF0ZSkgewotICAgIGNhc2Uga1ByZXJvbGxpbmc6Ci0gICAgY2FzZSBrUGxheWluZzoKLSAgICBjYXNlIGtSZWJ1ZmZlcmluZzoKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2Uga1VuZGVyZmxvdzoKLSAgICBjYXNlIGtQYXVzZWQ6Ci0gICAgY2FzZSBrVW5pbml0aWFsaXplZDoKLSAgICBjYXNlIGtTdG9wcGluZzoKLSAgICBjYXNlIGtTdG9wcGVkOgotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE5PVFJFQUNIRUQoKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX2F1ZGlvX3JlbmRlcmVyX2ltcGwuaCBiL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX2F1ZGlvX3JlbmRlcmVyX2ltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMxNTRlMy4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9hdWRpb19yZW5kZXJlcl9pbXBsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9GSUxURVJTX1NIRUxMX0FVRElPX1JFTkRFUkVSX0lNUExfSF8KLSNkZWZpbmUgTUVESUFfRklMVEVSU19TSEVMTF9BVURJT19SRU5ERVJFUl9JTVBMX0hfCi0KLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL3NoZWxsX2F1ZGlvX3JlbmRlcmVyLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIEF1ZGlvRGVjb2RlclNlbGVjdG9yOwotY2xhc3MgRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW07Ci0KLWNsYXNzIE1FRElBX0VYUE9SVCBTaGVsbEF1ZGlvUmVuZGVyZXJJbXBsIDogcHVibGljIFNoZWxsQXVkaW9SZW5kZXJlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBTaGVsbEF1ZGlvUmVuZGVyZXJJbXBsKAotICAgICAgQXVkaW9SZW5kZXJlclNpbmsqIHNpbmssCi0gICAgICBjb25zdCBTZXREZWNyeXB0b3JSZWFkeUNCJiBzZXRfZGVjcnlwdG9yX3JlYWR5X2NiLAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbWVzc2FnZV9sb29wKTsKLQotICAvLyA9PT09PT09PSBBdWRpb1JlbmRlcmVyIEltcGxlbWVudGF0aW9uCi0KLSAgLy8gSW5pdGlhbGl6ZSBhIEF1ZGlvUmVuZGVyZXIgd2l0aCB0aGUgZ2l2ZW4gQXVkaW9EZWNvZGVyLCBleGVjdXRpbmcgdGhlCi0gIC8vIHxpbml0X2NifCB1cG9uIGNvbXBsZXRpb24uCi0gIC8vCi0gIC8vIHxzdGF0aXN0aWNzX2NifCBpcyBleGVjdXRlZCBwZXJpb2RpY2FsbHkgd2l0aCBhdWRpbyByZW5kZXJpbmcgc3RhdHMuCi0gIC8vCi0gIC8vIHx1bmRlcmZsb3dfY2J8IGlzIGV4ZWN1dGVkIHdoZW4gdGhlIHJlbmRlcmVyIHJ1bnMgb3V0IG9mIGRhdGEgdG8gcGFzcyB0bwotICAvLyB0aGUgYXVkaW8gY2FyZCBkdXJpbmcgcGxheWJhY2suIFJlc3VtZUFmdGVyVW5kZXJmbG93KCkgbXVzdCBiZSBjYWxsZWQKLSAgLy8gdG8gcmVzdW1lIHBsYXliYWNrLiBQYXVzZSgpLCBQcmVyb2xsKCksIG9yIFN0b3AoKSBjYW5jZWxzIHRoZSB1bmRlcmZsb3cKLSAgLy8gY29uZGl0aW9uLgotICAvLwotICAvLyB8dGltZV9jYnwgaXMgZXhlY3V0ZWQgd2hlbmV2ZXIgdGltZSBoYXMgYWR2YW5jZWQgYnkgd2F5IG9mIGF1ZGlvIHJlbmRlcmluZy4KLSAgLy8KLSAgLy8gfGVuZGVkX2NifCBpcyBleGVjdXRlZCB3aGVuIGF1ZGlvIHJlbmRlcmluZyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIHN0cmVhbS4KLSAgLy8KLSAgLy8gfGRpc2FibGVkX2NifCBpcyBleGVjdXRlZCB3aGVuIGF1ZGlvIHJlbmRlcmluZyBoYXMgYmVlbiBkaXNhYmxlZCBkdWUgdG8KLSAgLy8gZXh0ZXJuYWwgZmFjdG9ycyAoaS5lLiwgZGV2aWNlIHdhcyByZW1vdmVkKS4gfHRpbWVfY2J8IHdpbGwgbm8gbG9uZ2VyIGJlCi0gIC8vIGV4ZWN1dGVkLgotICAvLwotICAvLyB8ZXJyb3JfY2J8IGlzIGV4ZWN1dGVkIGlmIGFuIGVycm9yIHdhcyBlbmNvdW50ZXJlZC4KLSAgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoY29uc3Qgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiYgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RlY29kZXJMaXN0JiBkZWNvZGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgaW5pdF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdGlzdGljc0NCJiBzdGF0aXN0aWNzX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiB1bmRlcmZsb3dfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRpbWVDQiYgdGltZV9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6Q2xvc3VyZSYgZW5kZWRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIGRpc2FibGVkX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBlcnJvcl9jYikgT1ZFUlJJREU7Ci0KLSAgLy8gU3RhcnQgcHJlcm9sbGluZyBhdWRpbyBkYXRhIGZvciBzYW1wbGVzIHN0YXJ0aW5nIGF0IHx0aW1lfCwgZXhlY3V0aW5nCi0gIC8vIHxjYWxsYmFja3wgd2hlbiBjb21wbGV0ZWQuCi0gIC8vCi0gIC8vIE9ubHkgdmFsaWQgdG8gY2FsbCBhZnRlciBhIHN1Y2Nlc3NmdWwgSW5pdGlhbGl6ZSgpIG9yIEZsdXNoKCkuCi0gIHZpcnR1YWwgdm9pZCBQcmVyb2xsKGJhc2U6OlRpbWVEZWx0YSB0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBjYWxsYmFjaykgT1ZFUlJJREU7Ci0KLSAgLy8gU2V0cyB0aGUgb3V0cHV0IHZvbHVtZS4KLSAgdmlydHVhbCB2b2lkIFNldFZvbHVtZShmbG9hdCB2b2x1bWUpIE9WRVJSSURFOwotCi0gIC8vIFJlc3VtZXMgcGxheWJhY2sgYWZ0ZXIgdW5kZXJmbG93IG9jY3Vycy4KLSAgLy8KLSAgLy8gfGJ1ZmZlcl9tb3JlX2F1ZGlvfCBpcyBzZXQgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0byBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUKLSAgLy8gZGVjb2RlZCBhdWRpbyBidWZmZXIuCi0gIHZpcnR1YWwgdm9pZCBSZXN1bWVBZnRlclVuZGVyZmxvdyhib29sIGJ1ZmZlcl9tb3JlX2F1ZGlvKSBPVkVSUklERTsKLQotICAvLyBUaGUgcGlwZWxpbmUgaGFzIHJlc3VtZWQgcGxheWJhY2suICBGaWx0ZXJzIGNhbiBjb250aW51ZSByZXF1ZXN0aW5nIHJlYWRzLgotICAvLyBGaWx0ZXJzIG1heSBpbXBsZW1lbnQgdGhpcyBtZXRob2QgaWYgdGhleSBuZWVkIHRvIHJlc3BvbmQgdG8gdGhpcyBjYWxsLgotICB2aXJ0dWFsIHZvaWQgUGxheShjb25zdCBiYXNlOjpDbG9zdXJlJiBjYWxsYmFjaykgT1ZFUlJJREU7Ci0KLSAgLy8gVGhlIHBpcGVsaW5lIGhhcyBwYXVzZWQgcGxheWJhY2suICBGaWx0ZXJzIHNob3VsZCBzdG9wIGJ1ZmZlciBleGNoYW5nZS4KLSAgLy8gRmlsdGVycyBtYXkgaW1wbGVtZW50IHRoaXMgbWV0aG9kIGlmIHRoZXkgbmVlZCB0byByZXNwb25kIHRvIHRoaXMgY2FsbC4KLSAgdmlydHVhbCB2b2lkIFBhdXNlKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSBPVkVSUklERTsKLQotICAvLyBUaGUgcGlwZWxpbmUgaGFzIGJlZW4gZmx1c2hlZC4gIEZpbHRlcnMgc2hvdWxkIHJldHVybiBidWZmZXIgdG8gb3duZXJzLgotICAvLyBGaWx0ZXJzIG1heSBpbXBsZW1lbnQgdGhpcyBtZXRob2QgaWYgdGhleSBuZWVkIHRvIHJlc3BvbmQgdG8gdGhpcyBjYWxsLgotICB2aXJ0dWFsIHZvaWQgRmx1c2goY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spIE9WRVJSSURFOwotCi0gIC8vIFRoZSBwaXBlbGluZSBpcyBiZWluZyBzdG9wcGVkIGVpdGhlciBhcyBhIHJlc3VsdCBvZiBhbiBlcnJvciBvciBiZWNhdXNlCi0gIC8vIHRoZSBjbGllbnQgY2FsbGVkIFN0b3AoKS4KLSAgdmlydHVhbCB2b2lkIFN0b3AoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spIE9WRVJSSURFOwotCi0gIC8vIFRoZSBwaXBlbGluZSBwbGF5YmFjayByYXRlIGhhcyBiZWVuIGNoYW5nZWQuICBGaWx0ZXJzIG1heSBpbXBsZW1lbnQgdGhpcwotICAvLyBtZXRob2QgaWYgdGhleSBuZWVkIHRvIHJlc3BvbmQgdG8gdGhpcyBjYWxsLgotICB2aXJ0dWFsIHZvaWQgU2V0UGxheWJhY2tSYXRlKGZsb2F0IHBsYXliYWNrX3JhdGUpIE9WRVJSSURFOwotCi0gIC8vIENhcnJ5IG91dCBhbnkgYWN0aW9ucyByZXF1aXJlZCB0byBzZWVrIHRvIHRoZSBnaXZlbiB0aW1lLCBleGVjdXRpbmcgdGhlCi0gIC8vIGNhbGxiYWNrIHVwb24gY29tcGxldGlvbi4KLSAgLy8gdmlydHVhbCB2b2lkIFNlZWsoYmFzZTo6VGltZURlbHRhIHRpbWUsCi0gIC8vICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGNhbGxiYWNrKSBPVkVSUklERTsKLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB+U2hlbGxBdWRpb1JlbmRlcmVySW1wbCgpOwotCi0gIHZvaWQgRG9QbGF5KCk7Ci0gIHZvaWQgRG9QcmVyb2xsKGJhc2U6OlRpbWVEZWx0YSB0aW1lLCBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBjYWxsYmFjayk7Ci0gIHZvaWQgRG9VbmRlcmZsb3coKTsKLSAgdm9pZCBEb1Jlc3VtZUFmdGVyVW5kZXJmbG93KGJvb2wgYnVmZmVyX21vcmVfYXVkaW8pOwotICB2b2lkIERvU2lua0Z1bGwoKTsKLQotICAvLyBBdWRpb1JlbmRlcmVyU2luazo6UmVuZGVyQ2FsbGJhY2sgaW1wbGVtZW50YXRpb24uCi0gIC8vIEF0dGVtcHRzIHRvIGNvbXBsZXRlbHkgZmlsbCBhbGwgY2hhbm5lbHMgb2YgfGRlc3R8LCByZXR1cm5zIGFjdHVhbAotICAvLyBudW1iZXIgb2YgZnJhbWVzIGZpbGxlZC4KLSAgLy8gUmVuZGVyKCkgaXMgcnVuIG9uIHRoZSBzeXN0ZW0gYXVkaW8gdGhyZWFkCi0gIHZpcnR1YWwgaW50IFJlbmRlcihBdWRpb0J1cyogZGVzdCwgaW50IGF1ZGlvX2RlbGF5X21pbGxpc2Vjb25kcykgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBPblJlbmRlckVycm9yKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTaW5rRnVsbCgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU2lua1VuZGVyZmxvdygpIE9WRVJSSURFOwotCi0gIHZvaWQgRGVjb2RlZEF1ZGlvUmVhZHkoQXVkaW9EZWNvZGVyOjpTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGVjb2Rlcjo6QnVmZmVycyYgYnVmZmVycyk7Ci0KLSAgdm9pZCBPbkRlY29kZXJTZWxlY3RlZCgKLSAgICAgIHNjb3BlZF9wdHI8QXVkaW9EZWNvZGVyU2VsZWN0b3I+IGRlY29kZXJfc2VsZWN0b3IsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPEF1ZGlvRGVjb2Rlcj4mIHNlbGVjdGVkX2RlY29kZXIsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY3J5cHRpbmdEZW11eGVyU3RyZWFtPiYgZGVjcnlwdGluZ19kZW11eGVyX3N0cmVhbSk7Ci0KLSAgdm9pZCBPbkRlY29kZXJSZXNldChjb25zdCBiYXNlOjpDbG9zdXJlJiBjYWxsYmFjayk7Ci0KLSAgZW51bSBTdGF0ZSB7Ci0gICAga1VuaW5pdGlhbGl6ZWQsCi0gICAga1BhdXNlZCwKLSAgICBrUHJlcm9sbGluZywKLSAgICBrUGxheWluZywKLSAgICBrVW5kZXJmbG93LAotICAgIGtSZWJ1ZmZlcmluZywKLSAgICBrU3RvcHBpbmcsCi0gICAga1N0b3BwZWQsCi0gIH07Ci0KLSAgYm9vbCBTaG91bGRRdWV1ZVJlYWQoU3RhdGUgc3RhdGUpOwotCi0gIC8vIG9iamVjdHMgY29tbXVuaWNhdGluZyB3aXRoIHRoZSByZXN0IG9mIHRoZSBmaWx0ZXIgZ3JhcGgKLSAgc2NvcGVkX3JlZnB0cjxBdWRpb1JlbmRlcmVyU2luaz4gc2lua187Ci0gIFNldERlY3J5cHRvclJlYWR5Q0Igc2V0X2RlY3J5cHRvcl9yZWFkeV9jYl87Ci0gIHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4gbWVzc2FnZV9sb29wXzsKLSAgc2NvcGVkX3JlZnB0cjxBdWRpb0RlY29kZXI+IGRlY29kZXJfOwotICBiYXNlOjpDbG9zdXJlIHVuZGVyZmxvd19jYl87Ci0gIFRpbWVDQiB0aW1lX2NiXzsKLSAgYmFzZTo6Q2xvc3VyZSBlbmRlZF9jYl87Ci0gIFBpcGVsaW5lU3RhdHVzQ0IgcHJlcm9sbF9jYl87Ci0gIGJhc2U6OlRpbWVEZWx0YSBwcmVyb2xsX3RpbWVzdGFtcF87Ci0gIFBpcGVsaW5lU3RhdHVzQ0IgaW5pdF9jYl87Ci0gIFBpcGVsaW5lU3RhdHVzQ0IgZXJyb3JfY2JfOwotCi0gIFN0YXRlIHN0YXRlXzsKLQotICBlbnVtIEVPU1N0YXRlIHsKLSAgICBrV2FpdGluZ0ZvckVPUywKLSAgICBrUmVjZWl2ZWRFT1MsCi0gICAga1JlbmRlcmVkRU9TLAotICAgIGtQbGF5ZWRFT1MsCi0gIH07Ci0gIEVPU1N0YXRlIGVuZF9vZl9zdHJlYW1fc3RhdGVfOwotICBmbG9hdCBwbGF5YmFja19yYXRlXzsKLSAgQXVkaW9QYXJhbWV0ZXJzIGF1ZGlvX3BhcmFtZXRlcnNfOwotCi0gIEF1ZGlvQnVzKiBkZWNvZGVkX2F1ZGlvX2J1c187Ci0gIEF1ZGlvRGVjb2Rlcjo6U3RhdHVzIGRlY29kZV9zdGF0dXNfOwotICBib29sIGRlY29kZV9jb21wbGV0ZV87Ci0KLSAgLy8gQ2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgZnJvbSB0aGUgSC9XIHJlbmRlcmVyIHRocmVhZCB3aGVuIGl0IGlzIGZpbmlzaGVkCi0gIC8vIHJlcXVlc3RpbmcgYXVkaW8gc2FtcGxlcwotICBiYXNlOjpMb2NrIHJlbmRlcmVyX2NiX2xvY2tfOwotICBiYXNlOjpDbG9zdXJlIHJlbmRlcmVyX2lkbGVfY2JfOwotCi0gIC8vIG1vZGlmaWVkIG9ubHkgYnkgTWVkaWFQaXBlbGluZSB0aHJlYWQgd2hpbGUgZGVjb2RlX2NvbXBsZXRlIGlzIGZhbHNlCi0gIC8vIENhbiBiZSByZWFkIGJ5IGFueSB0aHJlYWQgd2hlbiBpdCBpcyB0cnVlCi0gIGJhc2U6OlRpbWVEZWx0YSBidWZmZXJlZF90aW1lc3RhbXBfOwotICAvLyBSZWFkL3dyaXR0ZW4gb25seSBpbiBSZW5kZXIgY2FsbGJhY2sKLSAgYmFzZTo6VGltZURlbHRhIHJlbmRlcmVkX3RpbWVzdGFtcF87Ci0gIC8vIFJlYWQvd3JpdHRlbiBvbmx5IGluIFJlbmRlciBjYWxsYmFjay4gSW5kaWNhdGVzIGhvdyBtdWNoIHNpbGVuY2UgaGFzIGJlZW4KLSAgLy8gd3JpdHRlbiB0byB0aGUgc2luayBhZnRlciBFT1Mgd2FzIGVuY291bnRlcmVkCi0gIGJhc2U6OlRpbWVEZWx0YSBzaWxlbmNlX3JlbmRlcmVkXzsKLQotICAvLyBTdG9yZSB0aGUgRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW0gc28gd2UgY2FuIHJlc2V0IGl0IHdoZW4gU3RvcCBpcwotICAvLyByZXF1ZXN0ZWQuIEFzIHRoZSB0b3AgbGV2ZWwgZGVtdXhlciBoYXMgbm8ga25vd2xlZGdlIG9mIHRoZSBkZWNyeXB0aW5nCi0gIC8vIGRlbXV4ZXIgc3RyZWFtLCB0aGUgcGlwZWxpbmUgd2lsbCBub3QgYmUgYWJsZSB0byByZXNldCB0aGUgc3RyZWFtcyBkdXJpbmcKLSAgLy8gc3RvcHBpbmcuIFNvIHdlIGhhdmUgdG8gcmVzZXQgaXQuCi0gIHNjb3BlZF9yZWZwdHI8RGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW0+IGRlY3J5cHRpbmdfZGVtdXhlcl9zdHJlYW1fOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfRklMVEVSU19TSEVMTF9BVURJT19SRU5ERVJFUl9JTVBMX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9hdWRpb19yZW5kZXJlcl91bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX2F1ZGlvX3JlbmRlcmVyX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2E0ZTA5Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX2F1ZGlvX3JlbmRlcmVyX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL3NoZWxsX2F1ZGlvX3JlbmRlcmVyLmgiCi0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wX3Byb3h5LmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2J1cy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fZGVjb2Rlcl9jb25maWcuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2dtb2NrX2NhbGxiYWNrX3N1cHBvcnQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21vY2tfYXVkaW9fcmVuZGVyZXJfc2luay5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbW9ja19maWx0ZXJzLmgiCi0KLSNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgOjp0ZXN0aW5nOjpfOwotdXNpbmcgOjp0ZXN0aW5nOjpBdE1vc3Q7Ci11c2luZyA6OnRlc3Rpbmc6OkluU2VxdWVuY2U7Ci11c2luZyA6OnRlc3Rpbmc6Ok5pY2VNb2NrOwotdXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47Ci11c2luZyA6OnRlc3Rpbmc6OlJldHVyblJlZjsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgU2hlbGxBdWRpb1JlbmRlcmVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgU2hlbGxBdWRpb1JlbmRlcmVyVGVzdCgpCi0gICAgICA6IGF1ZGlvX2RlY29kZXJfY29uZmlnXyhrQ29kZWNWb3JiaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTEFZT1VUX01PTk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpLAotICAgICAgICBzaW5rXyhuZXcgTmljZU1vY2s8TW9ja0F1ZGlvUmVuZGVyZXJTaW5rPiksCi0gICAgICAgIGRlbXV4ZXJfc3RyZWFtXyhuZXcgTmljZU1vY2s8TW9ja0RlbXV4ZXJTdHJlYW0+KSwKLSAgICAgICAgZGVjb2Rlcl8obmV3IE5pY2VNb2NrPE1vY2tBdWRpb0RlY29kZXI+KSB7Ci0gICAgcmVuZGVyZXJfID0gU2hlbGxBdWRpb1JlbmRlcmVyOjpDcmVhdGUoc2lua18sIFNldERlY3J5cHRvclJlYWR5Q0IoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpNZXNzYWdlTG9vcFByb3h5OjpjdXJyZW50KCkpOwotCi0gICAgT05fQ0FMTCgqZGVtdXhlcl9zdHJlYW1fLCB0eXBlKCkpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybihEZW11eGVyU3RyZWFtOjpBVURJTykpOwotICAgIE9OX0NBTEwoKmRlbXV4ZXJfc3RyZWFtXywgYXVkaW9fZGVjb2Rlcl9jb25maWcoKSkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuUmVmKGF1ZGlvX2RlY29kZXJfY29uZmlnXykpOwotCi0gICAgT05fQ0FMTCgqZGVjb2Rlcl8sIGJpdHNfcGVyX2NoYW5uZWwoKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMzIpKTsKLSAgICBPTl9DQUxMKCpkZWNvZGVyXywgY2hhbm5lbF9sYXlvdXQoKSkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKENIQU5ORUxfTEFZT1VUX01PTk8pKTsKLSAgICBPTl9DQUxMKCpkZWNvZGVyXywgc2FtcGxlc19wZXJfc2Vjb25kKCkpLldpbGxCeURlZmF1bHQoUmV0dXJuKDQ0MTAwKSk7Ci0gICAgT05fQ0FMTCgqZGVjb2Rlcl8sIFJlc2V0KF8pKS5XaWxsQnlEZWZhdWx0KFJ1bkNhbGxiYWNrPDA+KCkpOwotICB9Ci0KLSAgTU9DS19NRVRIT0QxKE9uUGlwZWxpbmVTdGF0dXMsIHZvaWQoUGlwZWxpbmVTdGF0dXMpKTsKLSAgTU9DS19NRVRIT0QxKE9uUGlwZWxpbmVTdGF0aXN0aWNzLCB2b2lkKGNvbnN0IFBpcGVsaW5lU3RhdGlzdGljcyYpKTsKLSAgTU9DS19NRVRIT0QwKE9uVW5kZXJmbG93LCB2b2lkKCkpOwotICBNT0NLX01FVEhPRDAoT25FbmRlZCwgdm9pZCgpKTsKLSAgTU9DS19NRVRIT0QwKE9uRGlzYWJsZWQsIHZvaWQoKSk7Ci0gIE1PQ0tfTUVUSE9EMShPbkVycm9yLCB2b2lkKFBpcGVsaW5lU3RhdHVzKSk7Ci0gIE1PQ0tfTUVUSE9EMChPblN0b3BwZWQsIHZvaWQoKSk7Ci0KLSAgdm9pZCBPbkF1ZGlvVGltZUNhbGxiYWNrKGJhc2U6OlRpbWVEZWx0YSBjdXJyZW50X3RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGEgbWF4X3RpbWUpIHsKLSAgICBDSEVDSyhjdXJyZW50X3RpbWUgPD0gbWF4X3RpbWUpOwotICB9Ci0KLSAgdm9pZCBJbml0aWFsaXplV2l0aG91dFdhaXRGb3JQZW5kaW5nVGFza3MoKSB7IEluaXRpYWxpemUoZmFsc2UpOyB9Ci0KLSAgdm9pZCBJbml0aWFsaXplQW5kV2FpdEZvclBlbmRpbmdUYXNrcygpIHsgSW5pdGlhbGl6ZSh0cnVlKTsgfQotCi0gIHZvaWQgUHJlcm9sbCgpIHsKLSAgICByZW5kZXJlcl8tPlByZXJvbGwoYmFzZTo6VGltZURlbHRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoJlNoZWxsQXVkaW9SZW5kZXJlclRlc3Q6Ok9uUGlwZWxpbmVTdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICB9Ci0KLSAgdm9pZCBTdG9wQW5kV2FpdEZvclBlbmRpbmdUYXNrcygpIHsKLSAgICBFWFBFQ1RfQ0FMTCgqdGhpcywgT25TdG9wcGVkKCkpLlRpbWVzKDEpOwotICAgIHJlbmRlcmVyXy0+U3RvcCgKLSAgICAgICAgYmFzZTo6QmluZCgmU2hlbGxBdWRpb1JlbmRlcmVyVGVzdDo6T25TdG9wcGVkLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0jaWYgIWRlZmluZWQoX19MQl9QUzNfXykKLSAgICAvLyBUaGUgZXh0cmEgUmVuZGVyIGNhbGwgaXMgcmVxdWlyZWQgYnkgdGhlIFNoZWxsQXVkaW9SZW5kZXJlckltcGwgd2hlbiB0aGUKLSAgICAvLyByZW5kZXJlciBzdGFydHMgdG8gcnVubmluZy4KLSAgICBzY29wZWRfcHRyPEF1ZGlvQnVzPiBhdWRpb19idXMgPSBBdWRpb0J1czo6Q3JlYXRlKDEsIDEwMjQsIDQsIGZhbHNlKTsKLSAgICByZW5kZXJlcl8tPlJlbmRlcihhdWRpb19idXMuZ2V0KCksIDApOwotI2VuZGlmICAvLyAhZGVmaW5lZChfX0xCX1BTM19fKQotICAgIEZpbmlzaFBlbmRpbmdUYXNrcygpOwotICB9Ci0KLSAgdm9pZCBGaW5pc2hQZW5kaW5nVGFza3MoKSB7IG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7IH0KLQotIHByaXZhdGU6Ci0gIHZvaWQgSW5pdGlhbGl6ZShib29sIHdhaXRfdW50aWxfZmluaXNoZWQpIHsKLSAgICBFWFBFQ1RfQ0FMTCgqZGVjb2Rlcl8sIEluaXRpYWxpemUoXywgXywgXykpCi0gICAgICAgIC5XaWxsT25jZShSdW5DYWxsYmFjazwxPihQSVBFTElORV9PSykpOwotICAgIGlmICh3YWl0X3VudGlsX2ZpbmlzaGVkKSB7Ci0gICAgICBFWFBFQ1RfQ0FMTCgqdGhpcywgT25QaXBlbGluZVN0YXR1cyhfKSkuVGltZXMoMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEVYUEVDVF9DQUxMKCp0aGlzLCBPblBpcGVsaW5lU3RhdHVzKF8pKS5UaW1lcyhBdE1vc3QoMSkpOwotICAgIH0KLSAgICBBdWRpb1JlbmRlcmVyOjpBdWRpb0RlY29kZXJMaXN0IGRlY29kZXJzOwotICAgIGRlY29kZXJzLnB1c2hfYmFjayhkZWNvZGVyXyk7Ci0gICAgcmVuZGVyZXJfLT5Jbml0aWFsaXplKAotICAgICAgICBkZW11eGVyX3N0cmVhbV8sIGRlY29kZXJzLAotICAgICAgICBiYXNlOjpCaW5kKCZTaGVsbEF1ZGlvUmVuZGVyZXJUZXN0OjpPblBpcGVsaW5lU3RhdHVzLAotICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAotICAgICAgICBiYXNlOjpCaW5kKCZTaGVsbEF1ZGlvUmVuZGVyZXJUZXN0OjpPblBpcGVsaW5lU3RhdGlzdGljcywKLSAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgICAgYmFzZTo6QmluZCgmU2hlbGxBdWRpb1JlbmRlcmVyVGVzdDo6T25VbmRlcmZsb3csCi0gICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICAgIGJhc2U6OkJpbmQoJlNoZWxsQXVkaW9SZW5kZXJlclRlc3Q6Ok9uQXVkaW9UaW1lQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICAgIGJhc2U6OkJpbmQoJlNoZWxsQXVkaW9SZW5kZXJlclRlc3Q6Ok9uRW5kZWQsIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAotICAgICAgICBiYXNlOjpCaW5kKCZTaGVsbEF1ZGlvUmVuZGVyZXJUZXN0OjpPbkRpc2FibGVkLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgICAgYmFzZTo6QmluZCgmU2hlbGxBdWRpb1JlbmRlcmVyVGVzdDo6T25FcnJvciwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICAgIGlmICh3YWl0X3VudGlsX2ZpbmlzaGVkKSB7Ci0gICAgICBGaW5pc2hQZW5kaW5nVGFza3MoKTsKLSAgICB9Ci0gIH0KLQotICBBdWRpb0RlY29kZXJDb25maWcgYXVkaW9fZGVjb2Rlcl9jb25maWdfOwotICBzY29wZWRfcmVmcHRyPE5pY2VNb2NrPE1vY2tBdWRpb1JlbmRlcmVyU2luaz4gPiBzaW5rXzsKLSAgc2NvcGVkX3JlZnB0cjxOaWNlTW9jazxNb2NrRGVtdXhlclN0cmVhbT4gPiBkZW11eGVyX3N0cmVhbV87Ci0gIHNjb3BlZF9yZWZwdHI8TmljZU1vY2s8TW9ja0F1ZGlvRGVjb2Rlcj4gPiBkZWNvZGVyXzsKLSAgc2NvcGVkX3JlZnB0cjxTaGVsbEF1ZGlvUmVuZGVyZXI+IHJlbmRlcmVyXzsKLSAgTWVzc2FnZUxvb3AgbWVzc2FnZV9sb29wXzsKLX07Ci0KLVRFU1RfRihTaGVsbEF1ZGlvUmVuZGVyZXJUZXN0LCBJbml0aWFsaXplKSB7Ci0gIEluU2VxdWVuY2UgaW5fc2VxdWVuY2U7Ci0gIEluaXRpYWxpemVBbmRXYWl0Rm9yUGVuZGluZ1Rhc2tzKCk7Ci0gIFN0b3BBbmRXYWl0Rm9yUGVuZGluZ1Rhc2tzKCk7Ci19Ci0KLVRFU1RfRihTaGVsbEF1ZGlvUmVuZGVyZXJUZXN0LCBTdG9wSW1tZWRpYXRlbHlBZnRlckluaXRpYWxpemUpIHsKLSAgLy8gTm90IHVzaW5nIEluU2VxdWVuY2UgaGVyZSBhcyB0aGUgYXVkaW8gcmVuZGVyZXIgbWF5IGNhbGwgaW5pdF9jYiBhZnRlcgotICAvLyBzdG9wX2NiIGlzIGNhbGxlZC4KLSAgSW5pdGlhbGl6ZVdpdGhvdXRXYWl0Rm9yUGVuZGluZ1Rhc2tzKCk7Ci0gIFN0b3BBbmRXYWl0Rm9yUGVuZGluZ1Rhc2tzKCk7Ci19Ci0KLVRFU1RfRihTaGVsbEF1ZGlvUmVuZGVyZXJUZXN0LCBQcmVyb2xsKSB7Ci0gIEluU2VxdWVuY2UgaW5fc2VxdWVuY2U7Ci0gIEluaXRpYWxpemVBbmRXYWl0Rm9yUGVuZGluZ1Rhc2tzKCk7Ci0gIFByZXJvbGwoKTsKLSAgRmluaXNoUGVuZGluZ1Rhc2tzKCk7Ci0gIFN0b3BBbmRXYWl0Rm9yUGVuZGluZ1Rhc2tzKCk7Ci19Ci0KLVRFU1RfRihTaGVsbEF1ZGlvUmVuZGVyZXJUZXN0LCBTdG9wSW1tZWRpYXRlbHlBZnRlclByZXJvbGwpIHsKLSAgSW5TZXF1ZW5jZSBpbl9zZXF1ZW5jZTsKLSAgSW5pdGlhbGl6ZUFuZFdhaXRGb3JQZW5kaW5nVGFza3MoKTsKLSAgUHJlcm9sbCgpOwotICBTdG9wQW5kV2FpdEZvclBlbmRpbmdUYXNrcygpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX2F2Y19wYXJzZXIuY2MgYi9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9hdmNfcGFyc2VyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzNhZWNlLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX2F2Y19wYXJzZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0OTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvc2hlbGxfYXZjX3BhcnNlci5oIgotCi0jaW5jbHVkZSA8bGltaXRzPgotCi0jaW5jbHVkZSAiYmFzZS9zdHJpbmdwcmludGYuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2VuZGlhbl91dGlsLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaGVsbF9idWZmZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fdHlwZXMuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL3NoZWxsX2F1LmgiCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9zaGVsbF9yYnNwX3N0cmVhbS5oIgotI2luY2x1ZGUgIm1lZGlhL21wNC9hYWMuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gd2hhdCdzIHRoZSBzbWFsbGVzdCBtZWFuaW5nZnVsIEFWQyBjb25maWcgd2UgY2FuIHBhcnNlPwotc3RhdGljIGNvbnN0IGludCBrQVZDQ29uZmlnTWluU2l6ZSA9IDg7Ci0vLyBsb3dlciBmaXZlIGJpdHMgb2YgZmlyc3QgYnl0ZSBpbiBTUFMgc2hvdWxkIGJlIDcKLXN0YXRpYyBjb25zdCB1aW50OCBrU1BTTkFMVHlwZSA9IDc7Ci0KLVNoZWxsQVZDUGFyc2VyOjpTaGVsbEFWQ1BhcnNlcihzY29wZWRfcmVmcHRyPFNoZWxsRGF0YVNvdXJjZVJlYWRlcj4gcmVhZGVyKQotICAgIDogU2hlbGxQYXJzZXIocmVhZGVyKSwgbmFsX2hlYWRlcl9zaXplXygwKSwgdmlkZW9fcHJlcGVuZF9zaXplXygwKSB7fQotCi1TaGVsbEFWQ1BhcnNlcjo6flNoZWxsQVZDUGFyc2VyKCkge30KLQotYm9vbCBTaGVsbEFWQ1BhcnNlcjo6UHJlcGVuZChzY29wZWRfcmVmcHRyPFNoZWxsQVU+IGF1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGJ1ZmZlcikgewotICAvLyBzYW5pdHktY2hlY2sgaW5wdXRzCi0gIGlmICghYXUgfHwgIWJ1ZmZlcikgewotICAgIE5PVFJFQUNIRUQoKSA8PCAiYmFkIGlucHV0IHRvIFByZXBlbmQoKSI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHVpbnQ4KiBwcmVwZW5kX2J1ZmZlciA9IGJ1ZmZlci0+R2V0V3JpdGFibGVEYXRhKCk7Ci0gIGlmICghcHJlcGVuZF9idWZmZXIpIHsKLSAgICBOT1RSRUFDSEVEKCkgPDwgImVtcHR5L3VuZGVyc2l6ZWQgYnVmZmVyIHRvIFByZXBlbmQoKSI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChhdS0+R2V0VHlwZSgpID09IERlbXV4ZXJTdHJlYW06OlZJREVPKSB7Ci0gICAgaWYgKGF1LT5BZGRQcmVwZW5kKCkpCi0gICAgICBtZW1jcHkocHJlcGVuZF9idWZmZXIsIHZpZGVvX3ByZXBlbmRfLCB2aWRlb19wcmVwZW5kX3NpemVfKTsKLSAgfSBlbHNlIGlmIChhdS0+R2V0VHlwZSgpID09IERlbXV4ZXJTdHJlYW06OkFVRElPKSB7Ci0jaWYgZGVmaW5lZChDT0JBTFRfV0lOKQotICAgIC8vIFdlIHVzZSByYXcgQUFDIGluc3RlYWQgb2YgQURUUyBvbiB0aGVzZSBwbGF0Zm9ybXMuCi0gICAgRENIRUNLKGF1ZGlvX3ByZXBlbmRfLmVtcHR5KCkpOwotICAgIHJldHVybiB0cnVlOwotI2VuZGlmCi0gICAgaWYgKGF1ZGlvX3ByZXBlbmRfLmVtcHR5KCkpICAvLyB2YWxpZCBBRFRTIGhlYWRlciBub3QgYXZhaWxhYmxlCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgLy8gYXVkaW8sIG5lZWQgdG8gY29weSBBRFRTIGhlYWRlciBhbmQgdGhlbiBhZGQgYnVmZmVyIHNpemUKLSAgICB1aW50MzIgYnVmZmVyX3NpemUgPSBhdS0+R2V0U2l6ZSgpICsgYXVkaW9fcHJlcGVuZF8uc2l6ZSgpOwotICAgIC8vIHdlIGNhbid0IGV4cHJlc3MgYW4gQVUgc2l6ZSBsYXJnZXIgdGhhbiAxMyBiaXRzLCBzb21ldGhpbmcncyBiYWQgaGVyZS4KLSAgICBpZiAoYnVmZmVyX3NpemUgJiAweGZmZmZlMDAwKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIG1lbWNweShwcmVwZW5kX2J1ZmZlciwgJmF1ZGlvX3ByZXBlbmRfWzBdLCBhdWRpb19wcmVwZW5kXy5zaXplKCkpOwotICAgIC8vIE9SIHNpemUgaW50byBidWZmZXIsIGJ5dGUgMyBnZXRzIDIgTVNiIG9mIDEzLWJpdCBzaXplCi0gICAgcHJlcGVuZF9idWZmZXJbM10gfD0gKHVpbnQ4KSgoYnVmZmVyX3NpemUgJiAweDAwMDAxODAwKSA+PiAxMSk7Ci0gICAgLy8gYnl0ZSA0IGdldHMgYml0cyAxMC0zIG9mIHNpemUKLSAgICBwcmVwZW5kX2J1ZmZlcls0XSA9ICh1aW50OCkoKGJ1ZmZlcl9zaXplICYgMHgwMDAwMDdmOCkgPj4gMyk7Ci0gICAgLy8gYnl0ZSA1IGdldHMgYml0cyAyLTAgb2Ygc2l6ZQotICAgIHByZXBlbmRfYnVmZmVyWzVdIHw9ICh1aW50OCkoKGJ1ZmZlcl9zaXplICYgMHgwMDAwMDAwNykgPDwgNSk7Ci0gIH0gZWxzZSB7Ci0gICAgTk9UUkVBQ0hFRCgpIDw8ICJ1bnN1cHBvcnRlZCBkZW11eGVyIHN0cmVhbSB0eXBlLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU2hlbGxBVkNQYXJzZXI6OkRvd25sb2FkQW5kUGFyc2VBVkNDb25maWdSZWNvcmQodWludDY0IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHNpemUpIHsKLSAgc2NvcGVkX3JlZnB0cjxTaGVsbFNjb3BlZEFycmF5PiByZWNvcmRfYnVmZmVyID0KLSAgICAgIFNoZWxsQnVmZmVyRmFjdG9yeTo6SW5zdGFuY2UoKS0+QWxsb2NhdGVBcnJheShzaXplKTsKLSAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBzaXplIG9mIHRoaXMgcmVjb3JkIGJ1ZmZlciBtYXkgZXhjZWVkIHRoZQotICAvLyBtZW1vcnkgYXZhaWxhYmxlIHRvIHRoZSBtZWRpYSBzdGFjaywgaW4gd2hpY2ggY2FzZSB3ZSBza2lwIGl0LgotICBpZiAoIXJlY29yZF9idWZmZXIgfHwgIXJlY29yZF9idWZmZXItPkdldCgpKSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCBiYXNlOjpTdHJpbmdQcmludGYoCi0gICAgICAgICJpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGRvd25sb2FkIEFWQ0NvbmZpZ1JlY29yZCBvZiAlZCBieXRlcyIsIHNpemUpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpbnQgYnl0ZXNfcmVhZCA9IHJlYWRlcl8tPkJsb2NraW5nUmVhZChvZmZzZXQsIHNpemUsIHJlY29yZF9idWZmZXItPkdldCgpKTsKLSAgRENIRUNLX0xFKHNpemUsIHN0YXRpY19jYXN0PHVpbnQzMj4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMj46Om1heCgpKSk7Ci0gIGlmIChieXRlc19yZWFkIDwgc3RhdGljX2Nhc3Q8aW50PihzaXplKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBvaywgc3VjY2Vzc2Z1bGx5IGRvd25sb2FkZWQgdGhlIHJlY29yZCwgcGFyc2UgaXQKLSAgcmV0dXJuIFBhcnNlQVZDQ29uZmlnUmVjb3JkKHJlY29yZF9idWZmZXItPkdldCgpLCBzaXplKTsKLX0KLQotLy8gc3RhdGljCi1ib29sIFNoZWxsQVZDUGFyc2VyOjpQYXJzZVNQUyhjb25zdCB1aW50OCogc3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNwc19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGxTUFNSZWNvcmQqIHJlY29yZF9vdXQpIHsKLSAgRENIRUNLKHNwcykgPDwgIm5vIHNwcyBwcm92aWRlZCI7Ci0gIERDSEVDSyhyZWNvcmRfb3V0KSA8PCAibm8gb3V0cHV0IHN0cnVjdHVyZSBwcm92aWRlZCI7Ci0gIC8vIGZpcnN0IGJ5dGUgaXMgTkFMIHR5cGUgaWQsIGNoZWNrIHRoYXQgaXQgaXMgU1BTCi0gIGlmICgoKnNwcyAmIDB4MWYpICE9IGtTUFNOQUxUeXBlKSB7Ci0gICAgRExPRyhFUlJPUikgPDwgImJhZCBOQUwgdHlwZSBvbiBTUFMiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBjb252ZXJ0IFNQUyBOQUxVIHRvIFJCU1Agc3RyZWFtCi0gIFNoZWxsUkJTUFN0cmVhbSBzcHNfcmJzcChzcHMgKyAxLCBzcHNfc2l6ZSAtIDEpOwotICB1aW50OCBwcm9maWxlX2lkYyA9IDA7Ci0gIGlmICghc3BzX3Jic3AuUmVhZEJ5dGUocHJvZmlsZV9pZGMpKSB7Ci0gICAgRExPRyhFUlJPUikgPDwgImZhaWx1cmUgcmVhZGluZyBwcm9maWxlX2lkYyBmcm9tIHNwcyBSQlNQIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gc2tpcCAzIGNvbnN0cmFpbnQgZmxhZ3MsIDUgcmVzZXJ2ZWQgYml0cywgYW5kIGxldmVsX2lkYyAoMTYgYml0cykKLSAgc3BzX3Jic3AuU2tpcEJ5dGVzKDIpOwotICAvLyBSZWFkVUVWL1JlYWRTRVYgcmVxdWlyZSBhIHZhbHVlIHRvIGJlIHBhc3NlZCBieSByZWZlcmVuY2UgYnV0Ci0gIC8vIHRoZXJlIGFyZSBtYW55IHRpbWVzIGluIHdoaWNoIHdlIGlnbm9yZSB0aGlzIHZhbHVlLgotICB1aW50MzIgZGlzcG9zYWJsZV91ZXYgPSAwOwotICBpbnQzMiBkaXNwb3NhYmxlX3NldiA9IDA7Ci0gIC8vIHNlcV9wYXJhbWV0ZXJfc2V0X2lkCi0gIHNwc19yYnNwLlJlYWRVRVYoZGlzcG9zYWJsZV91ZXYpOwotICAvLyBza2lwIHByb2ZpbGUtc3BlY2lmaWMgZW5jb2RpbmcgaW5mb3JtYXRpb24gaWYgdGhlcmUKLSAgaWYgKHByb2ZpbGVfaWRjID09IDEwMCB8fCBwcm9maWxlX2lkYyA9PSAxMDMgfHwgcHJvZmlsZV9pZGMgPT0gMTEwIHx8Ci0gICAgICBwcm9maWxlX2lkYyA9PSAxMjIgfHwgcHJvZmlsZV9pZGMgPT0gMjQ0IHx8IHByb2ZpbGVfaWRjID09IDQ0IHx8Ci0gICAgICBwcm9maWxlX2lkYyA9PSA4MyB8fCBwcm9maWxlX2lkYyA9PSA4NiB8fCBwcm9maWxlX2lkYyA9PSAxMTgpIHsKLSAgICB1aW50MzIgY2hyb21hX2Zvcm1hdF9pZGMgPSAwOwotICAgIGlmICghc3BzX3Jic3AuUmVhZFVFVihjaHJvbWFfZm9ybWF0X2lkYykpIHsKLSAgICAgIERMT0coV0FSTklORykgPDwgImZhaWx1cmUgcmVhZGluZyBjaHJvbWFfZm9ybWF0X2lkYyBmcm9tIHNwcyBSQlNQIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKGNocm9tYV9mb3JtYXRfaWRjID09IDMpIHsKLSAgICAgIC8vIHNlcGFyYXRlX2NvbG9yX3BsYW5lX2ZsYWcKLSAgICAgIHNwc19yYnNwLlNraXBCaXRzKDEpOwotICAgIH0KLSAgICAvLyBiaXRfZGVwdGhfbHVtYV9taW51czgKLSAgICBzcHNfcmJzcC5SZWFkVUVWKGRpc3Bvc2FibGVfdWV2KTsKLSAgICAvLyBiaXRfZGVwdGhfY2hyb21hX21pbnVzOAotICAgIHNwc19yYnNwLlJlYWRVRVYoZGlzcG9zYWJsZV91ZXYpOwotICAgIC8vIHFwcHJpbWVfeV96ZXJvX3RyYW5zZm9ybV9ieXBhc3NfZmxhZwotICAgIHNwc19yYnNwLlNraXBCaXRzKDEpOwotICAgIC8vIHNlcV9zY2FsaW5nX21hdHJpeF9wcmVzZW50X2ZsYWcKLSAgICB1aW50OCBzZXFfc2NhbGluZ19tYXRyaXhfcHJlc2VudF9mbGFnID0gMDsKLSAgICBpZiAoIXNwc19yYnNwLlJlYWRCaXQoc2VxX3NjYWxpbmdfbWF0cml4X3ByZXNlbnRfZmxhZykpIHsKLSAgICAgIERMT0coRVJST1IpCi0gICAgICAgICAgPDwgImZhaWx1cmUgcmVhZGluZyBzZXFfc2NhbGluZ19tYXRyaXhfcHJlc2VudF9mbGFnIGZyb20gc3BzIFJCU1AiOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoc2VxX3NjYWxpbmdfbWF0cml4X3ByZXNlbnRfZmxhZykgewotICAgICAgLy8gc2VxX3NjYWxpbmdfbGlzdF9wcmVzZW50X2ZsYWdbXQotICAgICAgc3BzX3Jic3AuU2tpcEJpdHMoY2hyb21hX2Zvcm1hdF9pZGMgIT0gMyA/IDggOiAxMik7Ci0gICAgfQotICB9Ci0gIC8vIGxvZzJfbWF4X2ZyYW1lX251bV9taW51czQKLSAgc3BzX3Jic3AuUmVhZFVFVihkaXNwb3NhYmxlX3Vldik7Ci0gIC8vIHBpY19vcmRlcl9jbnRfdHlwZQotICB1aW50MzIgcGljX29yZGVyX2NudF90eXBlID0gMDsKLSAgaWYgKCFzcHNfcmJzcC5SZWFkVUVWKHBpY19vcmRlcl9jbnRfdHlwZSkpIHsKLSAgICBETE9HKEVSUk9SKSA8PCAiZmFpbHVyZSByZWFkaW5nIHBpY19vcmRlcl9jbnRfdHlwZSBmcm9tIHNwcyBSQlNQIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKHBpY19vcmRlcl9jbnRfdHlwZSA9PSAwKSB7Ci0gICAgLy8gbG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0Ci0gICAgc3BzX3Jic3AuUmVhZFVFVihkaXNwb3NhYmxlX3Vldik7Ci0gIH0gZWxzZSBpZiAocGljX29yZGVyX2NudF90eXBlID09IDEpIHsKLSAgICAvLyBkZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZwotICAgIHNwc19yYnNwLlNraXBCaXRzKDEpOwotICAgIC8vIG9mZnNldF9mb3Jfbm9uX3JlZl9waWMKLSAgICBzcHNfcmJzcC5SZWFkU0VWKGRpc3Bvc2FibGVfc2V2KTsKLSAgICAvLyBvZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQKLSAgICBzcHNfcmJzcC5SZWFkU0VWKGRpc3Bvc2FibGVfc2V2KTsKLSAgICAvLyBudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlCi0gICAgdWludDMyIG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUgPSAwOwotICAgIGlmICghc3BzX3Jic3AuUmVhZFVFVihudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlKSkgewotICAgICAgRExPRyhFUlJPUikKLSAgICAgICAgICA8PCAiZmFpbHVyZSByZWFkaW5nIG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUgZnJvbSBzcHMiOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGU7ICsraSkgewotICAgICAgc3BzX3Jic3AuUmVhZFNFVihkaXNwb3NhYmxlX3Nldik7Ci0gICAgfQotICB9Ci0gIC8vIG51bWJlciBvZiByZWZlcmVuY2UgZnJhbWVzIHVzZWQgdG8gZGVjb2RlCi0gIHVpbnQzMiBudW1fcmVmX2ZyYW1lcyA9IDA7Ci0gIGlmICghc3BzX3Jic3AuUmVhZFVFVihudW1fcmVmX2ZyYW1lcykpIHsKLSAgICBETE9HKEVSUk9SKSA8PCAiZmFpbHVyZSByZWFkaW5nIG51bWJlciBvZiByZWYgZnJhbWVzIGZyb20gc3BzIFJCU1AiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBnYXBzX2luX2ZyYW1lX251bV92YWx1ZV9hbGxvd2VkX2ZsYWcKLSAgc3BzX3Jic3AuU2tpcEJpdHMoMSk7Ci0gIC8vIHdpZHRoIGlzIGNhbGN1bGF0ZWQgZnJvbSBwaWNfd2lkdGhfaW5fbWJzX21pbnVzMQotICB1aW50MzIgcGljX3dpZHRoX2luX21ic19taW51czEgPSAwOwotICBpZiAoIXNwc19yYnNwLlJlYWRVRVYocGljX3dpZHRoX2luX21ic19taW51czEpKSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCAiZmFpbHVyZSByZWFkaW5nIGltYWdlIHdpZHRoIGZyb20gc3BzIFJCU1AiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyAxNiBweHMgcGVyIG1hY3JvYmxvY2sKLSAgdWludDMyIHdpZHRoID0gKHBpY193aWR0aF9pbl9tYnNfbWludXMxICsgMSkgKiAxNjsKLSAgLy8gcGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxCi0gIHVpbnQzMiBwaWNfaGVpZ2h0X2luX21hcF91bml0c19taW51czEgPSAwOwotICBpZiAoIXNwc19yYnNwLlJlYWRVRVYocGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxKSkgewotICAgIERMT0coRVJST1IpCi0gICAgICAgIDw8ICJmYWlsdXJlIHJlYWRpbmcgcGljX2hlaWdodF9pbl9tYXBfdWludHNfbWludXMxIGZyb20gc3BzIFJCU1AiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICB1aW50OCBmcmFtZV9tYnNfb25seV9mbGFnID0gMDsKLSAgaWYgKCFzcHNfcmJzcC5SZWFkQml0KGZyYW1lX21ic19vbmx5X2ZsYWcpKSB7Ci0gICAgRExPRyhFUlJPUikgPDwgImZhaWx1cmUgcmVhZGluZyBmcmFtZV9tYnNfb25seV9mbGFnIGZyb20gc3BzIFJCU1AiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICB1aW50MzIgaGVpZ2h0ID0gKDIgLSAodWludDMyKWZyYW1lX21ic19vbmx5X2ZsYWcpICoKLSAgICAgICAgICAgICAgICAgIChwaWNfaGVpZ2h0X2luX21hcF91bml0c19taW51czEgKyAxKSAqIDE2OwotICBpZiAoIWZyYW1lX21ic19vbmx5X2ZsYWcpIHsKLSAgICBzcHNfcmJzcC5Ta2lwQml0cygxKTsKLSAgfQotICAvLyBkaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnCi0gIHNwc19yYnNwLlNraXBCaXRzKDEpOwotICAvLyBmcmFtZSBjcm9wcGluZyBmbGFnCi0gIHVpbnQ4IGZyYW1lX2Nyb3BwaW5nX2ZsYWcgPSAwOwotICBpZiAoIXNwc19yYnNwLlJlYWRCaXQoZnJhbWVfY3JvcHBpbmdfZmxhZykpIHsKLSAgICBETE9HKEVSUk9SKSA8PCAiZmFpbHVyZSByZWFkaW5nIGZyYW1lX2Nyb3BwaW5nX2ZsYWcgZnJvbSBzcHMgUkJTUCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIGRpc3RhbmNlIGluIHBpeGVscyBmcm9tIHRoZSBhc3NvY2lhdGVkIGVkZ2Ugb2YgdGhlIG1lZGlhOgotICAvLwotICAvLyA8LS0tY29kZWRfc2l6ZS0tLXdpZHRoLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgotICAvLwotICAvLyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgIF4KLSAgLy8gfCAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICAgIHwgICB8Ci0gIC8vIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgfAotICAvLyB8ICAgICAgICAgICAgICBjcm9wX3RvcCAgICAgICAgICAgICAgICAgICAgfCAgIHwKLSAgLy8gfCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICB8Ci0gIC8vIHwgICAgICAgICAgICAgICAgIHYgICAgICAgICAgICAgICAgICAgICAgICB8IGhlaWdodAotICAvLyB8ICAgICAgICAgICAgICAgKy0tLS0tLS0tLSsgICAgICAgICAgICAgICAgfCAgIHwKLSAgLy8gfDwtLWNyb3BfbGVmdC0tPnwgdmlzaWJsZSB8ICAgICAgICAgICAgICAgIHwgICB8Ci0gIC8vIHwgICAgICAgICAgICAgICB8ICAgcmVjdCAgfDwtLWNyb3BfcmlnaHQtLT58ICAgfAotICAvLyB8ICAgICAgICAgICAgICAgKy0tLS0tLS0tLSsgICAgICAgICAgICAgICAgfCAgIHwKLSAgLy8gfCAgICAgICAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgICAgIHwgICB8Ci0gIC8vIHwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8ICAgfAotICAvLyB8ICAgICAgICAgICAgICBjcm9wX2JvdHRvbSAgICAgICAgICAgICAgICAgfCAgIHwKLSAgLy8gfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwgICB8Ci0gIC8vIHwgICAgICAgICAgICAgICAgICB2ICAgICAgICAgICAgICAgICAgICAgICB8ICAgfAotICAvLyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgIHYKLSAgLy8KLSAgdWludDMyIGNyb3BfbGVmdCA9IDA7Ci0gIHVpbnQzMiBjcm9wX3JpZ2h0ID0gMDsKLSAgdWludDMyIGNyb3BfdG9wID0gMDsKLSAgdWludDMyIGNyb3BfYm90dG9tID0gMDsKLSAgLy8gY3JvcHBpbmcgdmFsdWVzIGFyZSBzdG9yZWQgZGl2aWRlZCBieSB0d28KLSAgaWYgKGZyYW1lX2Nyb3BwaW5nX2ZsYWcpIHsKLSAgICBpZiAoIXNwc19yYnNwLlJlYWRVRVYoY3JvcF9sZWZ0KSkgewotICAgICAgRExPRyhFUlJPUikgPDwgImZhaWx1cmUgcmVhZGluZyBjcm9wX2xlZnQgZnJvbSBzcHMgUkJTUCI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICghc3BzX3Jic3AuUmVhZFVFVihjcm9wX3JpZ2h0KSkgewotICAgICAgRExPRyhFUlJPUikgPDwgImZhaWx1cmUgcmVhZGluZyBjcm9wX3JpZ2h0IGZyb20gc3BzIFJCU1AiOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoIXNwc19yYnNwLlJlYWRVRVYoY3JvcF90b3ApKSB7Ci0gICAgICBETE9HKEVSUk9SKSA8PCAiZmFpbHVyZSByZWFkaW5nIGNyb3BfdG9wIGZyb20gc3BzIFJCU1AiOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoIXNwc19yYnNwLlJlYWRVRVYoY3JvcF9ib3R0b20pKSB7Ci0gICAgICBETE9HKEVSUk9SKSA8PCAiZmFpbHVyZSByZWFkaW5nIGNyb3BfYm90dG9tIGZyb20gc3BzIFJCU1AiOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBjcm9wX2xlZnQgKj0gMjsKLSAgICBjcm9wX3JpZ2h0ICo9IDI7Ci0gICAgY3JvcF90b3AgKj0gMjsKLSAgICBjcm9wX2JvdHRvbSAqPSAyOwotICB9Ci0gIC8vIHJlbWFpbmRlciBvZiBTUFMgYXJlIHZhbHVlcyB3ZSBjYW4gc2FmZWx5IGlnbm9yZSwgZXZlcnl0aGluZwotICAvLyBjaGVja3Mgb3V0LCB3cml0ZSBvdXRwdXQgc3RydWN0dXJlCi0gIGludCB2aXNpYmxlX3dpZHRoID0gd2lkdGggLSAoY3JvcF9sZWZ0ICsgY3JvcF9yaWdodCk7Ci0gIGludCB2aXNpYmxlX2hlaWdodCA9IGhlaWdodCAtIChjcm9wX3RvcCArIGNyb3BfYm90dG9tKTsKLSAgcmVjb3JkX291dC0+Y29kZWRfc2l6ZSA9IGdmeDo6U2l6ZSh3aWR0aCwgaGVpZ2h0KSwKLSAgcmVjb3JkX291dC0+dmlzaWJsZV9yZWN0ID0KLSAgICAgIGdmeDo6UmVjdChjcm9wX2xlZnQsIGNyb3BfdG9wLCB2aXNpYmxlX3dpZHRoLCB2aXNpYmxlX2hlaWdodCksCi0gIHJlY29yZF9vdXQtPm5hdHVyYWxfc2l6ZSA9IGdmeDo6U2l6ZSh2aXNpYmxlX3dpZHRoLCB2aXNpYmxlX2hlaWdodCk7Ci0gIHJlY29yZF9vdXQtPm51bV9yZWZfZnJhbWVzID0gbnVtX3JlZl9mcmFtZXM7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFNoZWxsQVZDUGFyc2VyOjpQYXJzZUFWQ0NvbmZpZ1JlY29yZCh1aW50OCogYnVmZmVyLCB1aW50MzIgc2l6ZSkgewotICBpZiAoc2l6ZSA8IGtBVkNDb25maWdNaW5TaXplKSB7Ci0gICAgRExPRyhFUlJPUikgPDwgYmFzZTo6U3RyaW5nUHJpbnRmKCJBVkMgY29uZmlnIHJlY29yZCBiYWQgc2l6ZTogJWQiLCBzaXplKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBnZXQgdGhlIE5BTFUgaGVhZGVyIHNpemUKLSAgbmFsX2hlYWRlcl9zaXplXyA9IChidWZmZXJbNF0gJiAweDAzKSArIDE7Ci0gIC8vIHZhbGlkYXRlIHNpemUsIG5lZWRzIHRvIGJlIDEsIDIgb3IgNCBieXRlcyBvbmx5Ci0gIGlmIChuYWxfaGVhZGVyX3NpemVfICE9IDQgJiYgbmFsX2hlYWRlcl9zaXplXyAhPSAyICYmIG5hbF9oZWFkZXJfc2l6ZV8gIT0gMSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBBVkNDb25maWdSZWNvcmRzIGNvbnRhaW4gYSB2YXJpYWJsZSBudW1iZXIgb2YgU1BTIE5BTFUKLSAgLy8gKFNlcXVlbmNlIFBhcmFtZXRlciBTZXQpIChOZXR3b3JrIEFic3RyYWN0aW9uIExheWVyIFVuaXRzKQotICAvLyBmcm9tIHdoaWNoIHdlIGNhbiBleHRyYWN0IHdpZHRoLCBoZWlnaHQsIGFuZCBjcm9wcGluZyBpbmZvLgotICAvLyBUaGF0IG1lYW5zIHdlIG5lZWQgYXQgbGVhc3QgMSBTUFMgTkFMVSBpbiB0aGlzIHN0cmVhbSBmb3IgZXh0cmFjdGlvbi4KLSAgdWludDggbnVtYmVyX29mX3Nwc19uYWx1cyA9IGJ1ZmZlcls1XSAmIDB4MWY7Ci0gIGlmIChudW1iZXJfb2Zfc3BzX25hbHVzID09IDApIHsKLSAgICBETE9HKFdBUk5JTkcpIDw8ICJnb3QgQVZDQ29uZmlnUmVjb3JkIHdpdGhvdXQgYW55IFNQUyBOQUxVcyEiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBpdGVyYXRlIHRocm91Z2ggU1BTIE5BTFVzIGZpbmRpbmcgb25lIG9mIHZhbGlkIHNpemUgZm9yIG91ciBwdXJwb3NlcwotICAvLyAodGhpcyBzaG91bGQgdXN1YWxseSBiZSB0aGUgZmlyc3Qgb25lKSwgYnV0IGFsc28gYWR2YW5jaW5nIHRocm91Z2gKLSAgLy8gdGhlIENvbmZpZ1JlY29yZCB1bnRpbCB3ZSBlbmNvdW50ZXIgdGhlIFBQUyBzZXRzCi0gIGJvb2wgaGF2ZV92YWxpZF9zcHMgPSBmYWxzZTsKLSAgaW50IHJlY29yZF9vZmZzZXQgPSA2OwotICBzaXplX3QgdXNhYmxlX3Nwc19zaXplID0gMDsKLSAgaW50IHVzYWJsZV9zcHNfb2Zmc2V0ID0gMDsKLSAgZm9yICh1aW50OCBpID0gMDsgaSA8IG51bWJlcl9vZl9zcHNfbmFsdXM7IGkrKykgewotICAgIC8vIG1ha2Ugc3VyZSB3ZSBoYXZlbid0IHJ1biBvdXQgb2YgcmVjb3JkIGZvciB0aGUgMi1ieXRlIHNpemUgcmVjb3JkCi0gICAgRENIRUNLX0xFKHNpemUsIHN0YXRpY19jYXN0PHVpbnQzMj4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMj46Om1heCgpKSk7Ci0gICAgaWYgKHJlY29yZF9vZmZzZXQgKyAyID4gc3RhdGljX2Nhc3Q8aW50PihzaXplKSkgewotICAgICAgRExPRyhXQVJOSU5HKSA8PCAicmFuIG91dCBvZiBBVkNDb25maWcgcmVjb3JkIHdoaWxlIHBhcnNpbmcgU1BTIHNpemUuIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgLy8gZXh0cmFjdCAyLWJ5dGUgc2l6ZSBvZiB0aGlzIFNQUwotICAgIHNpemVfdCBzcHNfc2l6ZSA9Ci0gICAgICAgIGVuZGlhbl91dGlsOjpsb2FkX3VpbnQxNl9iaWdfZW5kaWFuKGJ1ZmZlciArIHJlY29yZF9vZmZzZXQpOwotICAgIC8vIGFkdmFuY2UgcGFzdCB0aGUgMi1ieXRlIHNpemUgcmVjb3JkCi0gICAgcmVjb3JkX29mZnNldCArPSAyOwotICAgIC8vIHNlZSBpZiB3ZSBqdW1wZWQgb3ZlciByZWNvcmQgc2l6ZQotICAgIGlmIChyZWNvcmRfb2Zmc2V0ICsgc3BzX3NpemUgPiBzaXplKSB7Ci0gICAgICBETE9HKFdBUk5JTkcpIDw8ICJyYW4gb3V0IG9mIEFWQ0NvbmZpZyByZWNvcmQgd2hpbGUgcGFyc2luZyBTUFMgYmxvY2tzLiI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICghaGF2ZV92YWxpZF9zcHMpIHsKLSAgICAgIGhhdmVfdmFsaWRfc3BzID0gdHJ1ZTsKLSAgICAgIC8vIHNhdmUgc2l6ZSBhbmQgb2Zmc2V0IGZvciBsYXRlciBjb3B5aW5nIGFuZCBwYXJzaW5nCi0gICAgICB1c2FibGVfc3BzX3NpemUgPSBzcHNfc2l6ZTsKLSAgICAgIHVzYWJsZV9zcHNfb2Zmc2V0ID0gcmVjb3JkX29mZnNldDsKLSAgICAgIC8vIGNvbnRpbnVlIHRvIGl0ZXJhdGUgdGhyb3VnaCBzcHMgcmVjb3JkcyB0byBnZXQgdG8gcHBzIHdoaWNoIGZvbGxvdwotICAgIH0KLSAgICByZWNvcmRfb2Zmc2V0ICs9IHNwc19zaXplOwotICB9Ci0gIGlmICghaGF2ZV92YWxpZF9zcHMpIHsKLSAgICBETE9HKFdBUk5JTkcpCi0gICAgICAgIDw8ICJ1bmFibGUgdG8gcGFyc2UgYSBzdWl0YWJsZSBTUFMuIFBlcmhhcHMgaW5jcmVhc2UgbWF4IHNpemU/IjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gd2UgZG9uJ3Qgc3RyaWN0bHkgcmVxdWlyZSBhIFBQUywgc28gd2UncmUgZXZlbiB3aWxsaW5nIHRvIGFjY2VwdCB0aGF0Ci0gIC8vIHRoaXMgY291bGQgYmUgdGhlIGVuZCBvZiB0aGUgYnl0ZXN0cmVhbSwgYnV0IGlmIG5vdCB0aGUgbmV4dCBieXRlIHNob3VsZAotICAvLyBkZWZpbmUgdGhlIG51bWJlciBvZiBQUFMgb2JqZWN0cyBpbiB0aGUgcmVjb3JkLiBOb3Qgc3VyZSBpZgotICAvLyBzcGVjaWZpYyBkZWNvZGVycyBjb3VsZCBkZWNvZGUgc29tZXRoaW5nIHdpdGhvdXQgYSBQUFMgcHJlcGVuZCBidXQgdGhpcwotICAvLyBkb2Vzbid0IGJyZWFrIGRlbXV4aW5nIHNvIHdlJ2xsIGxldCB0aGVtIGNvbXBsYWluIGlmIHRoYXQgaXNuJ3QgZ29pbmcKLSAgLy8gdG8gd29yayBmb3IgdGhlbSA6KQotICBzaXplX3QgdXNhYmxlX3Bwc19zaXplID0gMDsKLSAgc2l6ZV90IHVzYWJsZV9wcHNfb2Zmc2V0ID0gMDsKLSAgYm9vbCBoYXZlX3ZhbGlkX3BwcyA9IGZhbHNlOwotICBEQ0hFQ0tfTEUoc2l6ZSwgc3RhdGljX2Nhc3Q8dWludDMyPihzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyPjo6bWF4KCkpKTsKLSAgaWYgKHJlY29yZF9vZmZzZXQgKyAxIDwgc3RhdGljX2Nhc3Q8aW50PihzaXplKSkgewotICAgIHVpbnQ4IG51bWJlcl9vZl9wcHNfbmFsdXMgPSBidWZmZXJbcmVjb3JkX29mZnNldF07Ci0gICAgcmVjb3JkX29mZnNldCsrOwotICAgIGZvciAodWludDggaSA9IDA7IGkgPCBudW1iZXJfb2ZfcHBzX25hbHVzOyBpKyspIHsKLSAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBkb24ndCBydW4gb3V0IG9mIHJvb20gZm9yIDItYnl0ZSBzaXplIHJlY29yZAotICAgICAgRENIRUNLX0xFKHNpemUsIHN0YXRpY19jYXN0PHVpbnQzMj4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMj46Om1heCgpKSk7Ci0gICAgICBpZiAocmVjb3JkX29mZnNldCArIDIgPj0gc3RhdGljX2Nhc3Q8aW50PihzaXplKSkgewotICAgICAgICBETE9HKFdBUk5JTkcpIDw8ICJyYW4gb3V0IG9mIEFWQ0NvbmZpZyByZWNvcmQgd2hpbGUgcGFyc2luZyBQUFMgc2l6ZS4iOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICAvLyBleHRyYWN0IDItYnl0ZSBzaXplIG9mIHRoaXMgUFBTCi0gICAgICBzaXplX3QgcHBzX3NpemUgPQotICAgICAgICAgIGVuZGlhbl91dGlsOjpsb2FkX3VpbnQxNl9iaWdfZW5kaWFuKGJ1ZmZlciArIHJlY29yZF9vZmZzZXQpOwotICAgICAgcmVjb3JkX29mZnNldCArPSAyOwotICAgICAgLy8gc2VlIGlmIHRoZXJlJ3MgYWN0dWFsbHkgcm9vbSBmb3IgdGhpcyByZWNvcmQgaW4gdGhlIGJ1ZmZlcgotICAgICAgaWYgKHJlY29yZF9vZmZzZXQgKyBwcHNfc2l6ZSA+IHNpemUpIHsKLSAgICAgICAgRExPRyhXQVJOSU5HKQotICAgICAgICAgICAgPDwgInJhbiBvdXQgb2YgQVZDQ29uZmlnIHJlY29yZCB3aGlsZSBzY2FubmluZyBQUFMgYmxvY2tzLiI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmICghaGF2ZV92YWxpZF9wcHMpIHsKLSAgICAgICAgaGF2ZV92YWxpZF9wcHMgPSB0cnVlOwotICAgICAgICB1c2FibGVfcHBzX3NpemUgPSBwcHNfc2l6ZTsKLSAgICAgICAgdXNhYmxlX3Bwc19vZmZzZXQgPSByZWNvcmRfb2Zmc2V0OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgLy8gbm93IHdlIHBhcnNlIHRoZSB2YWxpZCBTUFMgd2UgZXh0cmFjdGVkIGZyb20gYnl0ZSBzdHJlYW0gZWFybGllci4KLSAgU2hlbGxTUFNSZWNvcmQgc3BzX3JlY29yZDsKLSAgaWYgKCFQYXJzZVNQUyhidWZmZXIgKyB1c2FibGVfc3BzX29mZnNldCwgdXNhYmxlX3Nwc19zaXplLCAmc3BzX3JlY29yZCkpIHsKLSAgICBETE9HKFdBUk5JTkcpIDw8ICJlcnJvciBwYXJzaW5nIFNQUyI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIHdlIGNhbiBub3cgaW5pdGlhbGl6ZSBvdXIgdmlkZW8gZGVjb2RlciBjb25maWcKLSAgdmlkZW9fY29uZmlnXy5Jbml0aWFsaXplKAotICAgICAga0NvZGVjSDI2NCwKLSAgICAgIEgyNjRQUk9GSUxFX01BSU4sICAgICAgICAgICAgLy8gcHJvZmlsZSBpcyBpZ25vcmVkIGN1cnJlbnRseQotICAgICAgVmlkZW9GcmFtZTo6TkFUSVZFX1RFWFRVUkUsICAvLyB3ZSBhbHdheXMgZGVjb2RlIGRpcmVjdGx5IHRvIHRleHR1cmUKLSAgICAgIENPTE9SX1NQQUNFX0hEX1JFQzcwOSwKLSAgICAgIHNwc19yZWNvcmQuY29kZWRfc2l6ZSwgc3BzX3JlY29yZC52aXNpYmxlX3JlY3QsIHNwc19yZWNvcmQubmF0dXJhbF9zaXplLAotICAgICAgLy8gbm8gZXh0cmEgZGF0YSBuZWVkZWQKLSAgICAgIE5VTEwsIDAsCi0gICAgICAvLyBpcyBub3QgY3VycmVudGx5IGVuY3J5cHRlZAotICAgICAgZmFsc2UsCi0gICAgICAvLyBpZ25vcmUgc3RhdHMgZm9yIG5vdwotICAgICAgZmFsc2UpOwotCi0gIHJldHVybiBCdWlsZEFubmV4QlByZXBlbmQoYnVmZmVyICsgdXNhYmxlX3Nwc19vZmZzZXQsIHVzYWJsZV9zcHNfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgKyB1c2FibGVfcHBzX29mZnNldCwgdXNhYmxlX3Bwc19zaXplKTsKLX0KLQotYm9vbCBTaGVsbEFWQ1BhcnNlcjo6QnVpbGRBbm5leEJQcmVwZW5kKHVpbnQ4KiBzcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHNwc19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBwcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHBwc19zaXplKSB7Ci0gIC8vIFdlIHdpbGwgbmVlZCB0byBhdHRhY2ggdGhlIHNwcyBhbmQgcHBzIChpZiBwcm92aWRlZCkgdG8gZWFjaCBrZXlmcmFtZQotICAvLyB2aWRlbyBwYWNrZXQsIHdpdGggdGhlIEFubmV4QiBzdGFydCBjb2RlIGluIGZyb250IG9mIGVhY2guIFN0YXJ0IHdpdGgKLSAgLy8gc3BzIHNpemUgYW5kIHN0YXJ0IGNvZGUKLSAgdmlkZW9fcHJlcGVuZF9zaXplXyA9IHNwc19zaXplICsga0FubmV4QlN0YXJ0Q29kZVNpemU7Ci0gIGlmIChwcHNfc2l6ZSA+IDApIHsKLSAgICAvLyBBZGQgcHBzIGFuZCBwcHMgc3RhcnQgY29kZSBzaXplIGlmIG5lZWRlZC4KLSAgICB2aWRlb19wcmVwZW5kX3NpemVfICs9IHBwc19zaXplICsga0FubmV4QlN0YXJ0Q29kZVNpemU7Ci0gIH0KLSAgLy8gdGhpcyBzaG91bGQgYmUgYSB2ZXJ5IHJhcmUgY2FzZSBmb3IgdHlwaWNhbCB2aWRlb3MKLSAgaWYgKHZpZGVvX3ByZXBlbmRfc2l6ZV8gPiBrQW5uZXhCUHJlcGVuZE1heFNpemUpIHsKLSAgICBOT1RSRUFDSEVEKCkgPDwgYmFzZTo6U3RyaW5nUHJpbnRmKCJCYWQgQW5uZXhCIHByZXBlbmQgc2l6ZTogJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9fcHJlcGVuZF9zaXplXyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIHN0YXJ0IGNvZGUgZm9yIHNwcyBjb21lcyBmaXJzdAotICBlbmRpYW5fdXRpbDo6c3RvcmVfdWludDMyX2JpZ19lbmRpYW4oa0FubmV4QlN0YXJ0Q29kZSwgdmlkZW9fcHJlcGVuZF8pOwotICAvLyBmb2xsb3dlZCBieSBzcHMgYm9keQotICBtZW1jcHkodmlkZW9fcHJlcGVuZF8gKyBrQW5uZXhCU3RhcnRDb2RlU2l6ZSwgc3BzLCBzcHNfc2l6ZSk7Ci0gIGludCBwcmVwZW5kX29mZnNldCA9IGtBbm5leEJTdGFydENvZGVTaXplICsgc3BzX3NpemU7Ci0gIGlmIChwcHNfc2l6ZSA+IDApIHsKLSAgICAvLyBwcHMgc3RhcnQgY29kZSBjb21lcyBuZXh0Ci0gICAgZW5kaWFuX3V0aWw6OnN0b3JlX3VpbnQzMl9iaWdfZW5kaWFuKGtBbm5leEJTdGFydENvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvX3ByZXBlbmRfICsgcHJlcGVuZF9vZmZzZXQpOwotICAgIHByZXBlbmRfb2Zmc2V0ICs9IGtBbm5leEJTdGFydENvZGVTaXplOwotICAgIC8vIGZvbGxvd2VkIGJ5IHBwcwotICAgIG1lbWNweSh2aWRlb19wcmVwZW5kXyArIHByZXBlbmRfb2Zmc2V0LCBwcHMsIHBwc19zaXplKTsKLSAgICBwcmVwZW5kX29mZnNldCArPSBwcHNfc2l6ZTsKLSAgfQotCi0gIC8vIG1ha2Ugc3VyZSB3ZSBoYXZlbid0IHdhbmRlcmVkIG9mZiBpbnRvIG1lbW9yeSBzb21ld2hlcmUKLSAgRENIRUNLX0VRKHByZXBlbmRfb2Zmc2V0LCB2aWRlb19wcmVwZW5kX3NpemVfKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU2hlbGxBVkNQYXJzZXI6OlBhcnNlQXVkaW9TcGVjaWZpY0NvbmZpZyh1aW50OCBiMCwgdWludDggYjEpIHsKLSAgbWVkaWE6Om1wNDo6QUFDIGFhYzsKLSAgc3RkOjp2ZWN0b3I8dWludDg+IGFhY19jb25maWcoMik7Ci0KLSAgYWFjX2NvbmZpZ1swXSA9IGIwOwotICBhYWNfY29uZmlnWzFdID0gYjE7Ci0gIGF1ZGlvX3ByZXBlbmRfLmNsZWFyKCk7Ci0KLSAgaWYgKCFhYWMuUGFyc2UoYWFjX2NvbmZpZykgfHwgIWFhYy5Db252ZXJ0RXNkc1RvQURUUygmYXVkaW9fcHJlcGVuZF8pKSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCAiRXJyb3IgaW4gcGFyc2luZyBBdWRpb1NwZWNpZmljQ29uZmlnLiI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gQ2xlYXIgdGhlIGxlbmd0aCwgaXQgaXMgMTMgYml0cyBhbmQgc3RvcmVkIGFzICoqKioqKkxMIExMTExMTExMIExMTCoqKioqCi0gIC8vIGluIGJ5dGVzIDMgdG8gNS4KLSAgYXVkaW9fcHJlcGVuZF9bM10gJj0gMHhmYzsKLSAgYXVkaW9fcHJlcGVuZF9bNF0gPSAwOwotICBhdWRpb19wcmVwZW5kX1s1XSAmPSAweDFmOwotCi0jaWYgZGVmaW5lZChDT0JBTFRfV0lOKQotICAvLyBXZSB1c2UgcmF3IEFBQyBpbnN0ZWFkIG9mIEFEVFMgb24gdGhlc2UgcGxhdGZvcm1zLgotICBhdWRpb19wcmVwZW5kXy5jbGVhcigpOwotI2VuZGlmICAvLyBkZWZpbmVkKENPQkFMVF9XSU4pCi0KLSAgYXVkaW9fY29uZmlnXy5Jbml0aWFsaXplKAotICAgICAga0NvZGVjQUFDLAotICAgICAgMTYsICAvLyBBQUMgaXMgYWx3YXlzIDE2IGJpdAotICAgICAgYWFjLmNoYW5uZWxfbGF5b3V0KCksIGFhYy5HZXRPdXRwdXRTYW1wbGVzUGVyU2Vjb25kKGZhbHNlKSwKLSAgICAgIGFhYy5yYXdfZGF0YSgpLmVtcHR5KCkgPyBOVUxMIDogJmFhYy5yYXdfZGF0YSgpLmZyb250KCksCi0gICAgICBhYWMucmF3X2RhdGEoKS5zaXplKCksIGZhbHNlLCBmYWxzZSk7Ci19Ci0KLXNpemVfdCBTaGVsbEFWQ1BhcnNlcjo6Q2FsY3VsYXRlUHJlcGVuZFNpemUoRGVtdXhlclN0cmVhbTo6VHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2tleWZyYW1lKSB7Ci0gIHNpemVfdCBwcmVwZW5kX3NpemUgPSAwOwotICBpZiAodHlwZSA9PSBEZW11eGVyU3RyZWFtOjpWSURFTykgewotICAgIGJvb2wgbmVlZHNfcHJlcGVuZCA9IGlzX2tleWZyYW1lOwotICAgIGlmIChuZWVkc19wcmVwZW5kKQotICAgICAgcHJlcGVuZF9zaXplID0gdmlkZW9fcHJlcGVuZF9zaXplXzsKLSAgfSBlbHNlIGlmICh0eXBlID09IERlbXV4ZXJTdHJlYW06OkFVRElPKSB7Ci0gICAgcHJlcGVuZF9zaXplID0gYXVkaW9fcHJlcGVuZF8uc2l6ZSgpOwotICB9IGVsc2UgewotICAgIE5PVFJFQUNIRUQoKSA8PCAidW5zdXBwb3J0ZWQgc3RyZWFtIHR5cGUiOwotICB9Ci0gIHJldHVybiBwcmVwZW5kX3NpemU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfYXZjX3BhcnNlci5oIGIvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfYXZjX3BhcnNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDc2NDFiLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX2F2Y19wYXJzZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfRklMVEVSU19TSEVMTF9BVkNfUEFSU0VSX0hfCi0jZGVmaW5lIE1FRElBX0ZJTFRFUlNfU0hFTExfQVZDX1BBUlNFUl9IXwotCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9zaGVsbF9wYXJzZXIuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gVHlwaWNhbCBzaXplIG9mIGFuIGFubmV4QiBwcmVwZW5kIHdpbGwgYmUgYXJvdW5kIDYwIGJ5dGVzLiBXZSBtYWtlIG1vcmUgcm9vbQotLy8gdG8gZW5zdXJlIHRoYXQgb25seSBhIHZlcnkgZmV3IHZpZGVvcyB3aWxsIGZhaWwgdG8gcGxheSBmb3IgbGFjayBvZiByb29tCi0vLyBpbiB0aGUgcHJlcGVuZC4KLXN0YXRpYyBjb25zdCBpbnQga0FubmV4QlByZXBlbmRNYXhTaXplID0gMTAyNDsKLQotLy8gd2hpbGUgbm90IGFuIGFjdHVhbCBwYXJzZXIsIHByb3ZpZGVzIHNoYXJlZCBmdW5jdGlvbmFsaXR5IHRvIGJvdGggdGhlCi0vLyBtcDQgYW5kIGZsdiBwYXJzZXJzIHdoaWNoIGRlcml2ZSBmcm9tIGl0LiBJbXBsZW1lbnRzIHBhcnQgb2YgU2hlbGxQYXJzZXIKLS8vIHdoaWxlIGxlYXZpbmcgdGhlIHJlc3QgZm9yIGl0cyBjaGlsZHJlbi4KLWNsYXNzIFNoZWxsQVZDUGFyc2VyIDogcHVibGljIFNoZWxsUGFyc2VyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFNoZWxsQVZDUGFyc2VyKHNjb3BlZF9yZWZwdHI8U2hlbGxEYXRhU291cmNlUmVhZGVyPiByZWFkZXIpOwotICB2aXJ0dWFsIH5TaGVsbEFWQ1BhcnNlcigpOwotCi0gIHN0cnVjdCBTaGVsbFNQU1JlY29yZCB7Ci0gICAgZ2Z4OjpTaXplIGNvZGVkX3NpemU7Ci0gICAgZ2Z4OjpSZWN0IHZpc2libGVfcmVjdDsKLSAgICBnZng6OlNpemUgbmF0dXJhbF9zaXplOwotICAgIHVpbnQzMiBudW1fcmVmX2ZyYW1lczsKLSAgfTsKLSAgc3RhdGljIGJvb2wgUGFyc2VTUFMoY29uc3QgdWludDgqIHNwcywKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNwc19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICBTaGVsbFNQU1JlY29yZCogcmVjb3JkX291dCk7Ci0KLSAgLy8gR2V0TmV4dEFVIHdlIG11c3QgcGFzcyBvbiB0byBGTFYgb3IgTVA0IGNoaWxkcmVuLgotICB2aXJ0dWFsIHNjb3BlZF9yZWZwdHI8U2hlbGxBVT4gR2V0TmV4dEFVKERlbXV4ZXJTdHJlYW06OlR5cGUgdHlwZSkgPSAwOwotICAvLyBQcmVwZW5kcyBhcmUgY29tbW9uIHRvIGFsbCBBVkMvQUFDIGNvbnRhaW5lcnMgc28gd2UgY2FuIGRvIHRoaXMgb25lIGhlcmUuCi0gIHZpcnR1YWwgYm9vbCBQcmVwZW5kKHNjb3BlZF9yZWZwdHI8U2hlbGxBVT4gYXUsCi0gICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gYnVmZmVyKSBPVkVSUklERTsKLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCBib29sIERvd25sb2FkQW5kUGFyc2VBVkNDb25maWdSZWNvcmQodWludDY0IG9mZnNldCwgdWludDMyIHNpemUpOwotICB2aXJ0dWFsIGJvb2wgUGFyc2VBVkNDb25maWdSZWNvcmQodWludDgqIGJ1ZmZlciwgdWludDMyIHNpemUpOwotICAvLyBwcHNfc2l6ZSBjYW4gYmUgMC4gUmV0dXJucyBmYWxzZSBvbiB1bmFibGUgdG8gY29uc3RydWN0LgotICB2aXJ0dWFsIGJvb2wgQnVpbGRBbm5leEJQcmVwZW5kKHVpbnQ4KiBzcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHNwc19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBwcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHBwc19zaXplKTsKLSAgdmlydHVhbCB2b2lkIFBhcnNlQXVkaW9TcGVjaWZpY0NvbmZpZyh1aW50OCBiMCwgdWludDggYjEpOwotICB2aXJ0dWFsIHNpemVfdCBDYWxjdWxhdGVQcmVwZW5kU2l6ZShEZW11eGVyU3RyZWFtOjpUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfa2V5ZnJhbWUpOwotCi0gIHVpbnQ4IG5hbF9oZWFkZXJfc2l6ZV87Ci0gIC8vIGF1ZGlvIGZyYW1lcyBoYXZlIGEgZml4ZWQtc2l6ZSBzbWFsbCBwcmVwZW5kIHRoYXQgd2UgYXR0YWNoIHRvIGV2ZXJ5Ci0gIC8vIGF1ZGlvIGJ1ZmZlciBjcmVhdGVkIGJ5IERvd25sb2FkQnVmZmVyKCkKLSAgc3RkOjp2ZWN0b3I8dWludDg+IGF1ZGlvX3ByZXBlbmRfOwotICAvLyB2aWRlbyBmcmFtZXMgaGF2ZSBhIHZhcmlhYmxlLXNpemUgcHJlcGVuZCB0aGF0IHdlIGxpbWl0IHRvIGEgcmVhc29uYWJsZQotICAvLyB1cHBlciBib3VuZC4gV2Ugb25seSBuZWVkIHRvIGF0dGFjaCBpdCB0byBrZXlmcmFtZXMsIGhvd2V2ZXIsIHRoZSByZXN0Ci0gIC8vIG9mIHRoZSBmcmFtZXMgbmVlZCBvbmx5IGFuIEFubmV4QiBzdGFydCBjb2RlLgotICB1aW50OCB2aWRlb19wcmVwZW5kX1trQW5uZXhCUHJlcGVuZE1heFNpemVdOwotICB1aW50MzIgdmlkZW9fcHJlcGVuZF9zaXplXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0ZJTFRFUlNfU0hFTExfQVZDX1BBUlNFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfZGVtdXhlci5jYyBiL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX2RlbXV4ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZDdhYjcuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfZGVtdXhlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDU1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9zaGVsbF9kZW11eGVyLmgiCi0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFja19oZWxwZXJzLmgiCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgotI2luY2x1ZGUgImJhc2Uvc3RyaW5ncHJpbnRmLmgiCi0jaW5jbHVkZSAiYmFzZS90YXNrX3J1bm5lcl91dGlsLmgiCi0jaW5jbHVkZSAiYmFzZS90aW1lLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9iaW5kX3RvX2xvb3AuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RhdGFfc291cmNlLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaGVsbF9tZWRpYV9wbGF0Zm9ybS5oIgotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotU2hlbGxEZW11eGVyU3RyZWFtOjpTaGVsbERlbXV4ZXJTdHJlYW0oU2hlbGxEZW11eGVyKiBkZW11eGVyLCBUeXBlIHR5cGUpCi0gICAgOiBkZW11eGVyXyhkZW11eGVyKSwKLSAgICAgIHR5cGVfKHR5cGUpLAotICAgICAgbGFzdF9idWZmZXJfdGltZXN0YW1wXyhrTm9UaW1lc3RhbXAoKSksCi0gICAgICBzdG9wcGVkXyhmYWxzZSkgewotICBUUkFDRV9FVkVOVDAoIm1lZGlhX3N0YWNrIiwgIlNoZWxsRGVtdXhlclN0cmVhbTo6U2hlbGxEZW11eGVyU3RyZWFtKCkiKTsKLSAgRENIRUNLKGRlbXV4ZXJfKTsKLX0KLQotYm9vbCBTaGVsbERlbXV4ZXJTdHJlYW06OlN0cmVhbVdhc0VuY3J5cHRlZCgpIGNvbnN0IHsKLSAgaWYgKHR5cGVfID09IFZJREVPKQotICAgIHJldHVybiBkZW11eGVyXy0+VmlkZW9Db25maWcoKS5pc19lbmNyeXB0ZWQoKTsKLSAgZWxzZSBpZiAodHlwZV8gPT0gQVVESU8pCi0gICAgcmV0dXJuIGRlbXV4ZXJfLT5BdWRpb0NvbmZpZygpLmlzX2VuY3J5cHRlZCgpOwotCi0gIE5PVFJFQUNIRUQoKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFNoZWxsRGVtdXhlclN0cmVhbTo6UmVhZChjb25zdCBSZWFkQ0ImIHJlYWRfY2IpIHsKLSAgVFJBQ0VfRVZFTlQwKCJtZWRpYV9zdGFjayIsICJTaGVsbERlbXV4ZXJTdHJlYW06OlJlYWQoKSIpOwotICBEQ0hFQ0soIXJlYWRfY2IuaXNfbnVsbCgpKTsKLQotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotCi0gIC8vIERvbid0IGFjY2VwdCBhbnkgYWRkaXRpb25hbCByZWFkcyBpZiB3ZSd2ZSBiZWVuIHRvbGQgdG8gc3RvcC4KLSAgLy8gVGhlIGRlbXV4ZXJfIG1heSBoYXZlIGJlZW4gZGVzdHJveWVkIGluIHRoZSBwaXBsZWluZSB0aHJlYWQuCi0gIGlmIChzdG9wcGVkXykgewotICAgIFRSQUNFX0VWRU5UMCgibWVkaWFfc3RhY2siLCAiU2hlbGxEZW11eGVyU3RyZWFtOjpSZWFkKCkgRU9TIHNlbnQuIik7Ci0gICAgcmVhZF9jYi5SdW4oRGVtdXhlclN0cmVhbTo6a09rLAotICAgICAgICAgICAgICAgIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4oCi0gICAgICAgICAgICAgICAgICAgIERlY29kZXJCdWZmZXI6OkNyZWF0ZUVPU0J1ZmZlcihrTm9UaW1lc3RhbXAoKSkpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBCdWZmZXJzIGFyZSBvbmx5IHF1ZXVlZCB3aGVuIHRoZXJlIGFyZSBubyBwZW5kaW5nIHJlYWRzLgotICBEQ0hFQ0soYnVmZmVyX3F1ZXVlXy5lbXB0eSgpIHx8IHJlYWRfcXVldWVfLmVtcHR5KCkpOwotCi0gIGlmICghYnVmZmVyX3F1ZXVlXy5lbXB0eSgpKSB7Ci0gICAgLy8gU2VuZCB0aGUgb2xkZXN0IGJ1ZmZlciBiYWNrLgotICAgIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gYnVmZmVyID0gYnVmZmVyX3F1ZXVlXy5mcm9udCgpOwotICAgIGlmIChidWZmZXItPklzRW5kT2ZTdHJlYW0oKSkgewotICAgICAgVFJBQ0VfRVZFTlQwKCJtZWRpYV9zdGFjayIsICJTaGVsbERlbXV4ZXJTdHJlYW06OlJlYWQoKSBFT1Mgc2VudC4iKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gRG8gbm90IHBvcCBFT1MgYnVmZmVycywgc28gdGhhdCBzdWJzZXF1ZW50IHJlYWQgcmVxdWVzdHMgYWxzbyBnZXQgRU9TCi0gICAgICBidWZmZXJfcXVldWVfLnBvcF9mcm9udCgpOwotICAgIH0KLSAgICByZWFkX2NiLlJ1bigKLSAgICAgICAgRGVtdXhlclN0cmVhbTo6a09rLAotICAgICAgICBTaGVsbE1lZGlhUGxhdGZvcm06Okluc3RhbmNlKCktPlByb2Nlc3NCZWZvcmVMZWF2aW5nRGVtdXhlcihidWZmZXIpKTsKLSAgfSBlbHNlIHsKLSAgICBUUkFDRV9FVkVOVDAoIm1lZGlhX3N0YWNrIiwgIlNoZWxsRGVtdXhlclN0cmVhbTo6UmVhZCgpIHJlcXVlc3QgcXVldWVkLiIpOwotICAgIHJlYWRfcXVldWVfLnB1c2hfYmFjayhyZWFkX2NiKTsKLSAgfQotfQotCi1jb25zdCBBdWRpb0RlY29kZXJDb25maWcmIFNoZWxsRGVtdXhlclN0cmVhbTo6YXVkaW9fZGVjb2Rlcl9jb25maWcoKSB7Ci0gIHJldHVybiBkZW11eGVyXy0+QXVkaW9Db25maWcoKTsKLX0KLQotY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiBTaGVsbERlbXV4ZXJTdHJlYW06OnZpZGVvX2RlY29kZXJfY29uZmlnKCkgewotICByZXR1cm4gZGVtdXhlcl8tPlZpZGVvQ29uZmlnKCk7Ci19Ci0KLVJhbmdlczxiYXNlOjpUaW1lRGVsdGE+IFNoZWxsRGVtdXhlclN0cmVhbTo6R2V0QnVmZmVyZWRSYW5nZXMoKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gIHJldHVybiBidWZmZXJlZF9yYW5nZXNfOwotfQotCi1EZW11eGVyU3RyZWFtOjpUeXBlIFNoZWxsRGVtdXhlclN0cmVhbTo6dHlwZSgpIHsKLSAgcmV0dXJuIHR5cGVfOwotfQotCi12b2lkIFNoZWxsRGVtdXhlclN0cmVhbTo6RW5hYmxlQml0c3RyZWFtQ29udmVydGVyKCkgewotICBOT1RJTVBMRU1FTlRFRCgpOwotfQotCi12b2lkIFNoZWxsRGVtdXhlclN0cmVhbTo6RW5xdWV1ZUJ1ZmZlcihzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGJ1ZmZlcikgewotICBUUkFDRV9FVkVOVDEoIm1lZGlhX3N0YWNrIiwgIlNoZWxsRGVtdXhlclN0cmVhbTo6RW5xdWV1ZUJ1ZmZlcigpIiwKLSAgICAgICAgICAgICAgICJ0aW1lc3RhbXAiLCBidWZmZXItPkdldFRpbWVzdGFtcCgpLkluTWljcm9zZWNvbmRzKCkpOwotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICBpZiAoc3RvcHBlZF8pIHsKLSAgICAvLyBpdCdzIHBvc3NpYmxlIGR1ZSB0byBwaXBlbGluaW5nIGJvdGggZG93bnN0cmVhbSBhbmQgd2l0aGluIHRoZQotICAgIC8vIGRlbXV4ZXIgdGhhdCBzZXZlcmFsIHBpcGVsaW5lZCByZWFkcyB3aWxsIGJlIGVucXVldWluZyBwYWNrZXRzCi0gICAgLy8gb24gYSBzdG9wcGVkIHN0cmVhbS4gRHJvcCB0aGVtIGFmdGVyIGNvbXBsYWluaW5nLgotICAgIERMT0coV0FSTklORykgPDwgImF0dGVtcHRlZCB0byBlbnF1ZXVlIHBhY2tldCBvbiBzdG9wcGVkIHN0cmVhbSI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGJ1ZmZlci0+SXNFbmRPZlN0cmVhbSgpKSB7Ci0gICAgVFJBQ0VfRVZFTlQwKCJtZWRpYV9zdGFjayIsCi0gICAgICAgICAgICAgICAgICJTaGVsbERlbXV4ZXJTdHJlYW06OkVucXVldWVCdWZmZXIoKSBFT1MgcmVjZWl2ZWQuIik7Ci0gIH0gZWxzZSBpZiAoYnVmZmVyLT5HZXRUaW1lc3RhbXAoKSAhPSBrTm9UaW1lc3RhbXAoKSkgewotICAgIGlmIChsYXN0X2J1ZmZlcl90aW1lc3RhbXBfICE9IGtOb1RpbWVzdGFtcCgpICYmCi0gICAgICAgIGxhc3RfYnVmZmVyX3RpbWVzdGFtcF8gPCBidWZmZXItPkdldFRpbWVzdGFtcCgpKSB7Ci0gICAgICBidWZmZXJlZF9yYW5nZXNfLkFkZChsYXN0X2J1ZmZlcl90aW1lc3RhbXBfLCBidWZmZXItPkdldFRpbWVzdGFtcCgpKTsKLSAgICB9Ci0gICAgbGFzdF9idWZmZXJfdGltZXN0YW1wXyA9IGJ1ZmZlci0+R2V0VGltZXN0YW1wKCk7Ci0gIH0gZWxzZSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCAiYmFkIHRpbWVzdGFtcCBpbmZvIG9uIGVucXVldWVkIGJ1ZmZlci4iOwotICB9Ci0KLSAgLy8gQ2hlY2sgZm9yIGFueSBhbHJlYWR5IHdhaXRpbmcgcmVhZHMsIHNlcnZpY2Ugb2xkZXN0IHJlYWQgaWYgdGhlcmUKLSAgaWYgKHJlYWRfcXVldWVfLnNpemUoKSkgewotICAgIC8vIGFzc3VtcHRpb24gaGVyZSBpcyB0aGF0IGJ1ZmZlciBxdWV1ZSBpcyBlbXB0eQotICAgIERDSEVDS19FUShidWZmZXJfcXVldWVfLnNpemUoKSwgMCk7Ci0gICAgUmVhZENCIHJlYWRfY2IocmVhZF9xdWV1ZV8uZnJvbnQoKSk7Ci0gICAgcmVhZF9xdWV1ZV8ucG9wX2Zyb250KCk7Ci0gICAgcmVhZF9jYi5SdW4oCi0gICAgICAgIERlbXV4ZXJTdHJlYW06OmtPaywKLSAgICAgICAgU2hlbGxNZWRpYVBsYXRmb3JtOjpJbnN0YW5jZSgpLT5Qcm9jZXNzQmVmb3JlTGVhdmluZ0RlbXV4ZXIoYnVmZmVyKSk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gc2F2ZSB0aGUgYnVmZmVyIGZvciBuZXh0IHJlYWQgcmVxdWVzdAotICAgIGJ1ZmZlcl9xdWV1ZV8ucHVzaF9iYWNrKGJ1ZmZlcik7Ci0gIH0KLX0KLQotYmFzZTo6VGltZURlbHRhIFNoZWxsRGVtdXhlclN0cmVhbTo6R2V0TGFzdEJ1ZmZlclRpbWVzdGFtcCgpIGNvbnN0IHsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgcmV0dXJuIGxhc3RfYnVmZmVyX3RpbWVzdGFtcF87Ci19Ci0KLXZvaWQgU2hlbGxEZW11eGVyU3RyZWFtOjpGbHVzaEJ1ZmZlcnMoKSB7Ci0gIFRSQUNFX0VWRU5UMCgibWVkaWFfc3RhY2siLCAiU2hlbGxEZW11eGVyU3RyZWFtOjpGbHVzaEJ1ZmZlcnMoKSIpOwotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICAvLyBUT0RPOiBJbnZlc3RpZ2F0ZSBpZiB0aGUgZm9sbG93aW5nIHdhcm5pbmcgaXMgdmFsaWQuCi0gIERMT0dfSUYoV0FSTklORywgIXJlYWRfcXVldWVfLmVtcHR5KCkpIDw8ICJSZWFkIHJlcXVlc3RzIHNob3VsZCBiZSBlbXB0eSI7Ci0gIGJ1ZmZlcl9xdWV1ZV8uY2xlYXIoKTsKLSAgbGFzdF9idWZmZXJfdGltZXN0YW1wXyA9IGtOb1RpbWVzdGFtcCgpOwotfQotCi12b2lkIFNoZWxsRGVtdXhlclN0cmVhbTo6U3RvcCgpIHsKLSAgVFJBQ0VfRVZFTlQwKCJtZWRpYV9zdGFjayIsICJTaGVsbERlbXV4ZXJTdHJlYW06OlN0b3AoKSIpOwotICBEQ0hFQ0soZGVtdXhlcl8tPk1lc3NhZ2VMb29wQmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgYnVmZmVyX3F1ZXVlXy5jbGVhcigpOwotICBsYXN0X2J1ZmZlcl90aW1lc3RhbXBfID0ga05vVGltZXN0YW1wKCk7Ci0gIC8vIGZ1bGZpbGwgYW55IHBlbmRpbmcgY2FsbGJhY2tzIHdpdGggRU9TIGJ1ZmZlcnMgc2V0IHRvIGVuZCB0aW1lc3RhbXAKLSAgZm9yIChSZWFkUXVldWU6Oml0ZXJhdG9yIGl0ID0gcmVhZF9xdWV1ZV8uYmVnaW4oKTsgaXQgIT0gcmVhZF9xdWV1ZV8uZW5kKCk7Ci0gICAgICAgKytpdCkgewotICAgIFRSQUNFX0VWRU5UMCgibWVkaWFfc3RhY2siLCAiU2hlbGxEZW11eGVyU3RyZWFtOjpTdG9wKCkgRU9TIHNlbnQuIik7Ci0gICAgaXQtPlJ1bihEZW11eGVyU3RyZWFtOjprT2ssCi0gICAgICAgICAgICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+KAotICAgICAgICAgICAgICAgIERlY29kZXJCdWZmZXI6OkNyZWF0ZUVPU0J1ZmZlcihrTm9UaW1lc3RhbXAoKSkpKTsKLSAgfQotICByZWFkX3F1ZXVlXy5jbGVhcigpOwotICBzdG9wcGVkXyA9IHRydWU7Ci19Ci0KLS8vCi0vLyBTaGVsbERlbXV4ZXIKLS8vCi1TaGVsbERlbXV4ZXI6OlNoZWxsRGVtdXhlcigKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+JiBtZXNzYWdlX2xvb3AsCi0gICAgRGF0YVNvdXJjZSogZGF0YV9zb3VyY2UpCi0gICAgOiBtZXNzYWdlX2xvb3BfKG1lc3NhZ2VfbG9vcCksCi0gICAgICBob3N0XyhOVUxMKSwKLSAgICAgIGJsb2NraW5nX3RocmVhZF8oIlNoZWxsRGVtdXhlckJsb2NraW5nVGhyZWFkIiksCi0gICAgICBkYXRhX3NvdXJjZV8oZGF0YV9zb3VyY2UpLAotICAgICAgc3RvcHBlZF8oZmFsc2UpLAotICAgICAgZmx1c2hpbmdfKGZhbHNlKSwKLSAgICAgIGF1ZGlvX3JlYWNoZWRfZW9zXyhmYWxzZSksCi0gICAgICB2aWRlb19yZWFjaGVkX2Vvc18oZmFsc2UpIHsKLSAgRENIRUNLKGRhdGFfc291cmNlXyk7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfKTsKLSAgcmVhZGVyXyA9IG5ldyBTaGVsbERhdGFTb3VyY2VSZWFkZXIoKTsKLSAgcmVhZGVyXy0+U2V0RGF0YVNvdXJjZShkYXRhX3NvdXJjZV8pOwotfQotCi1TaGVsbERlbXV4ZXI6On5TaGVsbERlbXV4ZXIoKSB7fQotCi12b2lkIFNoZWxsRGVtdXhlcjo6SW5pdGlhbGl6ZShEZW11eGVySG9zdCogaG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIHN0YXR1c19jYikgewotICBUUkFDRV9FVkVOVDAoIm1lZGlhX3N0YWNrIiwgIlNoZWxsRGVtdXhlcjo6SW5pdGlhbGl6ZSgpIik7Ci0gIERDSEVDSyhNZXNzYWdlTG9vcEJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIERDSEVDSyhyZWFkZXJfKTsKLSAgRENIRUNLKCFwYXJzZXJfKTsKLQotICBETE9HKElORk8pIDw8ICJ0aGlzIGlzIGEgUFJPR1JFU1NJVkUgcGxheWJhY2suIjsKLQotICBob3N0XyA9IGhvc3Q7Ci0gIGRhdGFfc291cmNlXy0+c2V0X2hvc3QoaG9zdCk7Ci0KLSAgLy8gY3JlYXRlIGF1ZGlvIGFuZCB2aWRlbyBkZW11eGVyIHN0cmVhbSBvYmplY3RzCi0gIGF1ZGlvX2RlbXV4ZXJfc3RyZWFtXyA9IG5ldyBTaGVsbERlbXV4ZXJTdHJlYW0odGhpcywgRGVtdXhlclN0cmVhbTo6QVVESU8pOwotICB2aWRlb19kZW11eGVyX3N0cmVhbV8gPSBuZXcgU2hlbGxEZW11eGVyU3RyZWFtKHRoaXMsIERlbXV4ZXJTdHJlYW06OlZJREVPKTsKLQotICAvLyBzdGFydCB0aGUgYmxvY2tpbmcgdGhyZWFkIGFuZCBoYXZlIGl0IGRvd25sb2FkIGFuZCBwYXJzZSB0aGUgbWVkaWEgY29uZmlnCi0gIGlmICghYmxvY2tpbmdfdGhyZWFkXy5TdGFydCgpKSB7Ci0gICAgc3RhdHVzX2NiLlJ1bihERU1VWEVSX0VSUk9SX0NPVUxEX05PVF9QQVJTRSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYmFzZTo6UG9zdFRhc2tBbmRSZXBseVdpdGhSZXN1bHQoCi0gICAgICBibG9ja2luZ190aHJlYWRfLm1lc3NhZ2VfbG9vcF9wcm94eSgpLCBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kKCZTaGVsbERlbXV4ZXI6OlBhcnNlQ29uZmlnQmxvY2tpbmcsIHRoaXMsIHN0YXR1c19jYiksCi0gICAgICBiYXNlOjpCaW5kKCZTaGVsbERlbXV4ZXI6OlBhcnNlQ29uZmlnRG9uZSwgdGhpcywgc3RhdHVzX2NiKSk7Ci19Ci0KLVBpcGVsaW5lU3RhdHVzIFNoZWxsRGVtdXhlcjo6UGFyc2VDb25maWdCbG9ja2luZygKLSAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBzdGF0dXNfY2IpIHsKLSAgRENIRUNLKGJsb2NraW5nX3RocmVhZF8ubWVzc2FnZV9sb29wX3Byb3h5KCktPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIERDSEVDSyghcGFyc2VyXyk7Ci0KLSAgLy8gY29uc3RydWN0IHN0cmVhbSBwYXJzZXIgd2l0aCBlcnJvciBjYWxsYmFjawotICBQaXBlbGluZVN0YXR1cyBzdGF0dXMgPSBTaGVsbFBhcnNlcjo6Q29uc3RydWN0KHJlYWRlcl8sICZwYXJzZXJfKTsKLSAgLy8gaWYgd2UgY2FuJ3QgY29uc3RydWN0IGEgcGFyc2VyIGZvciB0aGlzIHN0cmVhbSBpdCdzIGEgZmF0YWwgZXJyb3IsIHJldHVybgotICAvLyBmYWxzZSBzbyBQYXJzZUNvbmZpZ0RvbmUgd2lsbCBub3RpZnkgdGhlIGNhbGxlciB0byBJbml0aWFsaXplKCkgdmlhCi0gIC8vIHN0YXR1c19jYi4KLSAgaWYgKCFwYXJzZXJfIHx8IHN0YXR1cyAhPSBQSVBFTElORV9PSykgewotICAgIERDSEVDSyghcGFyc2VyXyk7Ci0gICAgRENIRUNLX05FKHN0YXR1cywgUElQRUxJTkVfT0spOwotICAgIGlmIChzdGF0dXMgPT0gUElQRUxJTkVfT0spIHsKLSAgICAgIHN0YXR1cyA9IERFTVVYRVJfRVJST1JfQ09VTERfTk9UX1BBUlNFOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgLy8gaW5zdHJ1Y3QgdGhlIHBhcnNlciB0byBleHRyYWN0IGF1ZGlvIGFuZCB2aWRlbyBjb25maWcgZnJvbSB0aGUgZmlsZQotICBpZiAoIXBhcnNlcl8tPlBhcnNlQ29uZmlnKCkpIHsKLSAgICByZXR1cm4gREVNVVhFUl9FUlJPUl9DT1VMRF9OT1RfUEFSU0U7Ci0gIH0KLQotICAvLyBtYWtlIHN1cmUgd2UgZ290IGEgdmFsaWQgYW5kIGNvbXBsZXRlIGNvbmZpZ3VyYXRpb24KLSAgaWYgKCFwYXJzZXJfLT5Jc0NvbmZpZ0NvbXBsZXRlKCkpIHsKLSAgICByZXR1cm4gREVNVVhFUl9FUlJPUl9DT1VMRF9OT1RfUEFSU0U7Ci0gIH0KLQotICAvLyBJc0NvbmZpZ0NvbXBsZXRlKCkgc2hvdWxkIGd1YXJhbnRlZSB3ZSBrbm93IHRoZSBkdXJhdGlvbgotICBEQ0hFQ0socGFyc2VyXy0+RHVyYXRpb24oKSAhPSBrSW5maW5pdGVEdXJhdGlvbigpKTsKLSAgaG9zdF8tPlNldER1cmF0aW9uKHBhcnNlcl8tPkR1cmF0aW9uKCkpOwotICAvLyBCaXRyYXRlIG1heSBub3QgYmUga25vd24sIGhvd2V2ZXIKLSAgdWludDMyIGJpdHJhdGUgPSBwYXJzZXJfLT5CaXRzUGVyU2Vjb25kKCk7Ci0gIGlmIChiaXRyYXRlID4gMCkgewotICAgIGRhdGFfc291cmNlXy0+U2V0Qml0cmF0ZShiaXRyYXRlKTsKLSAgfQotCi0gIC8vIHN1Y2Nlc3NmdWwgcGFyc2Ugb2YgY29uZmlnIGRhdGEsIGluZm9ybSB0aGUgbm9uYmxvY2tpbmcgZGVtdXhlciB0aHJlYWQKLSAgRENIRUNLX0VRKHN0YXR1cywgUElQRUxJTkVfT0spOwotICByZXR1cm4gUElQRUxJTkVfT0s7Ci19Ci0KLXZvaWQgU2hlbGxEZW11eGVyOjpQYXJzZUNvbmZpZ0RvbmUoY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc3RhdHVzX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXBlbGluZVN0YXR1cyBzdGF0dXMpIHsKLSAgRENIRUNLKE1lc3NhZ2VMb29wQmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgLy8gaWYgdGhlIGJsb2NraW5nIHBhcnNlciB0aHJlYWQgY2Fubm90IHBhcnNlIGNvbmZpZyB3ZSdyZSBkb25lLgotICBpZiAoc3RhdHVzICE9IFBJUEVMSU5FX09LKSB7Ci0gICAgc3RhdHVzX2NiLlJ1bihzdGF0dXMpOwotICAgIHJldHVybjsKLSAgfQotICBEQ0hFQ0socGFyc2VyXyk7Ci0gIC8vIHN0YXJ0IGRvd25sb2FkaW5nIGRhdGEKLSAgUmVxdWVzdChEZW11eGVyU3RyZWFtOjpBVURJTyk7Ci0KLSAgc3RhdHVzX2NiLlJ1bihQSVBFTElORV9PSyk7Ci19Ci0KLXZvaWQgU2hlbGxEZW11eGVyOjpSZXF1ZXN0KERlbXV4ZXJTdHJlYW06OlR5cGUgdHlwZSkgewotICAvLyBwb3N0IHRhc2sgdG8gb3VyIGJsb2NraW5nIHRocmVhZAotICBibG9ja2luZ190aHJlYWRfLm1lc3NhZ2VfbG9vcF9wcm94eSgpLT5Qb3N0VGFzaygKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmU2hlbGxEZW11eGVyOjpSZXF1ZXN0VGFzaywgdGhpcywgdHlwZSkpOwotfQotCi12b2lkIFNoZWxsRGVtdXhlcjo6UmVxdWVzdFRhc2soRGVtdXhlclN0cmVhbTo6VHlwZSB0eXBlKSB7Ci0gIERDSEVDSyhibG9ja2luZ190aHJlYWRfLm1lc3NhZ2VfbG9vcF9wcm94eSgpLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBEQ0hFQ0soIXJlcXVlc3RlZF9hdV8pIDw8ICJvdmVybGFwcGluZyByZXF1ZXN0cyBub3Qgc3VwcG9ydGVkISI7Ci0gIGZsdXNoaW5nXyA9IGZhbHNlOwotICAvLyBBc2sgcGFyc2VyIGZvciBuZXh0IEFVCi0gIHNjb3BlZF9yZWZwdHI8U2hlbGxBVT4gYXUgPSBwYXJzZXJfLT5HZXROZXh0QVUodHlwZSk7Ci0gIC8vIGZhdGFsIHBhcnNpbmcgZXJyb3IgcmV0dXJucyBOVUxMIG9yIG1hbGZvcm1lZCBBVQotICBpZiAoIWF1IHx8ICFhdS0+SXNWYWxpZCgpKSB7Ci0gICAgaWYgKCFzdG9wcGVkXykgewotICAgICAgRExPRyhFUlJPUikgPDwgImdvdCBiYWNrIGJhZCBBVSBmcm9tIHBhcnNlciI7Ci0gICAgICBob3N0Xy0+T25EZW11eGVyRXJyb3IoREVNVVhFUl9FUlJPUl9DT1VMRF9OT1RfUEFSU0UpOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBtYWtlIHN1cmUgd2UgZ290IGJhY2sgYW4gQVUgb2YgdGhlIGNvcnJlY3QgdHlwZQotICBEQ0hFQ0soYXUtPkdldFR5cGUoKSA9PSB0eXBlKTsKLQotICBjb25zdCBjaGFyKiBBTExPV19VTlVTRUQgZXZlbnRfdHlwZSA9Ci0gICAgICB0eXBlID09IERlbXV4ZXJTdHJlYW06OkFVRElPID8gImF1ZGlvIiA6ICJ2aWRlbyI7Ci0gIFRSQUNFX0VWRU5UMigibWVkaWFfc3RhY2siLCAiU2hlbGxEZW11eGVyOjpSZXF1ZXN0VGFzaygpIiwgInR5cGUiLCBldmVudF90eXBlLAotICAgICAgICAgICAgICAgInRpbWVzdGFtcCIsIGF1LT5HZXRUaW1lc3RhbXAoKS5Jbk1pY3Jvc2Vjb25kcygpKTsKLQotICAvLyBkb24ndCBpc3N1ZSBhbGxvY2F0aW9uIHJlcXVlc3RzIGZvciBFT1MgQVVzCi0gIGlmIChhdS0+SXNFbmRPZlN0cmVhbSgpKSB7Ci0gICAgVFJBQ0VfRVZFTlQwKCJtZWRpYV9zdGFjayIsICJTaGVsbERlbXV4ZXI6OlJlcXVlc3RUYXNrKCkgRU9TIHNlbnQiKTsKLSAgICAvLyBlbnF1ZXVlIEVPUyBidWZmZXIgd2l0aCBjb3JyZWN0IHN0cmVhbQotICAgIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gZW9zX2J1ZmZlciA9Ci0gICAgICAgIERlY29kZXJCdWZmZXI6OkNyZWF0ZUVPU0J1ZmZlcihhdS0+R2V0VGltZXN0YW1wKCkpOwotICAgIGlmICh0eXBlID09IERlbXV4ZXJTdHJlYW06OkFVRElPKSB7Ci0gICAgICBhdWRpb19yZWFjaGVkX2Vvc18gPSB0cnVlOwotICAgICAgYXVkaW9fZGVtdXhlcl9zdHJlYW1fLT5FbnF1ZXVlQnVmZmVyKGVvc19idWZmZXIpOwotICAgIH0gZWxzZSBpZiAodHlwZSA9PSBEZW11eGVyU3RyZWFtOjpWSURFTykgewotICAgICAgdmlkZW9fcmVhY2hlZF9lb3NfID0gdHJ1ZTsKLSAgICAgIHZpZGVvX2RlbXV4ZXJfc3RyZWFtXy0+RW5xdWV1ZUJ1ZmZlcihlb3NfYnVmZmVyKTsKLSAgICB9Ci0gICAgSXNzdWVOZXh0UmVxdWVzdFRhc2soKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBlbnF1ZXVlIHRoZSByZXF1ZXN0Ci0gIHJlcXVlc3RlZF9hdV8gPSBhdTsKLQotICAvLyBBbGxvY2F0ZUJ1ZmZlciB3aWxsIHJldHVybiBmYWxzZSBpZiB0aGUgcmVxdWVzdGVkIHNpemUgaXMgbGFyZ2VyCi0gIC8vIHRoYW4gdGhlIG1heGltdW0gbGltaXQgZm9yIGEgc2luZ2xlIGJ1ZmZlci4KLSAgaWYgKCFTaGVsbEJ1ZmZlckZhY3Rvcnk6Okluc3RhbmNlKCktPkFsbG9jYXRlQnVmZmVyKAotICAgICAgICAgIGF1LT5HZXRNYXhTaXplKCksIGF1LT5Jc0tleWZyYW1lKCksCi0gICAgICAgICAgYmFzZTo6QmluZCgmU2hlbGxEZW11eGVyOjpCdWZmZXJBbGxvY2F0ZWQsIHRoaXMpKSkgewotICAgIERMT0coRVJST1IpIDw8ICJidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWQuIjsKLSAgICBob3N0Xy0+T25EZW11eGVyRXJyb3IoUElQRUxJTkVfRVJST1JfQ09VTERfTk9UX1JFTkRFUik7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLS8vIGNhbGxiYWNrIGZyb20gU2hlbGxCdWZmZXJBbGxvY2F0ZWQsIHBvc3QgYSB0YXNrIHRvIHRoZSBibG9ja2luZyB0aHJlYWQKLXZvaWQgU2hlbGxEZW11eGVyOjpCdWZmZXJBbGxvY2F0ZWQoc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBidWZmZXIpIHsKLSAgaWYgKCFzdG9wcGVkXykgewotICAgIGJsb2NraW5nX3RocmVhZF8ubWVzc2FnZV9sb29wX3Byb3h5KCktPlBvc3RUYXNrKAotICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJlNoZWxsRGVtdXhlcjo6RG93bmxvYWRUYXNrLCB0aGlzLCBidWZmZXIpKTsKLSAgfQotfQotCi12b2lkIFNoZWxsRGVtdXhlcjo6RG93bmxvYWRUYXNrKHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gYnVmZmVyKSB7Ci0gIERDSEVDSyhibG9ja2luZ190aHJlYWRfLm1lc3NhZ2VfbG9vcF9wcm94eSgpLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICAvLyBXZSBuZWVkIGEgcmVxdWVzdGVkX2F1XyBvciB0byBoYXZlIGNhbmNlbGVkIHRoaXMgcmVxdWVzdCBhbmQKLSAgLy8gYXJlIGJ1ZmZlcmluZyB0byBhIG5ldyBsb2NhdGlvbiBmb3IgdGhpcyB0byBtYWtlIHNlbnNlCi0gIERDSEVDSyhyZXF1ZXN0ZWRfYXVfKTsKLQotICBjb25zdCBjaGFyKiBBTExPV19VTlVTRUQgZXZlbnRfdHlwZSA9Ci0gICAgICByZXF1ZXN0ZWRfYXVfLT5HZXRUeXBlKCkgPT0gRGVtdXhlclN0cmVhbTo6QVVESU8gPyAiYXVkaW8iIDogInZpZGVvIjsKLSAgVFJBQ0VfRVZFTlQyKCJtZWRpYV9zdGFjayIsICJTaGVsbERlbXV4ZXI6OkRvd25sb2FkVGFzaygpIiwgInR5cGUiLAotICAgICAgICAgICAgICAgZXZlbnRfdHlwZSwgInRpbWVzdGFtcCIsCi0gICAgICAgICAgICAgICByZXF1ZXN0ZWRfYXVfLT5HZXRUaW1lc3RhbXAoKS5Jbk1pY3Jvc2Vjb25kcygpKTsKLSAgLy8gZG8gbm90aGluZyBpZiBzdG9wcGVkCi0gIGlmIChzdG9wcGVkXykgewotICAgIERMT0coSU5GTykgPDwgImFib3J0aW5nIGRvd25sb2FkIHRhc2ssIHN0b3BwZWQiOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIEZsdXNoaW5nIGlzIGEgc2lnbmFsIHRvIHJlc3RhcnQgdGhlIHJlcXVlc3QtPmRvd25sb2FkIGN5Y2xlIHdpdGgKLSAgLy8gYSBuZXcgcmVxdWVzdC4gRHJvcCBjdXJyZW50IHJlcXVlc3QgYW5kIGlzc3VlIGEgbmV3IG9uZS4KLSAgLy8gZmx1c2hpbmdfIHdpbGwgYmUgcmVzZXQgYnkgdGhlIG5leHQgY2FsbCB0byBSZXF1ZXN0VGFzaygpCi0gIGlmIChmbHVzaGluZ18pIHsKLSAgICBETE9HKElORk8pIDw8ICJza2lwcGVkIEFVIGRvd25sb2FkIGR1ZSB0byBmbHVzaCI7Ci0gICAgcmVxdWVzdGVkX2F1XyA9IE5VTEw7Ci0gICAgSXNzdWVOZXh0UmVxdWVzdFRhc2soKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoIXJlcXVlc3RlZF9hdV8tPlJlYWQocmVhZGVyXywgYnVmZmVyKSkgewotICAgIERMT0coRVJST1IpIDw8ICJhdSByZWFkIGZhaWxlZCI7Ci0gICAgaG9zdF8tPk9uRGVtdXhlckVycm9yKFBJUEVMSU5FX0VSUk9SX1JFQUQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIGNvcHkgdGltZXN0YW1wIGFuZCBkdXJhdGlvbiB2YWx1ZXMKLSAgYnVmZmVyLT5TZXRUaW1lc3RhbXAocmVxdWVzdGVkX2F1Xy0+R2V0VGltZXN0YW1wKCkpOwotICBidWZmZXItPlNldER1cmF0aW9uKHJlcXVlc3RlZF9hdV8tPkdldER1cmF0aW9uKCkpOwotCi0gIC8vIGVucXVldWUgYnVmZmVyIGludG8gYXBwcm9wcmlhdGUgc3RyZWFtCi0gIGlmIChyZXF1ZXN0ZWRfYXVfLT5HZXRUeXBlKCkgPT0gRGVtdXhlclN0cmVhbTo6QVVESU8pIHsKLSAgICBhdWRpb19kZW11eGVyX3N0cmVhbV8tPkVucXVldWVCdWZmZXIoYnVmZmVyKTsKLSAgfSBlbHNlIGlmIChyZXF1ZXN0ZWRfYXVfLT5HZXRUeXBlKCkgPT0gRGVtdXhlclN0cmVhbTo6VklERU8pIHsKLSAgICB2aWRlb19kZW11eGVyX3N0cmVhbV8tPkVucXVldWVCdWZmZXIoYnVmZmVyKTsKLSAgfSBlbHNlIHsKLSAgICBOT1RSRUFDSEVEKCkgPDwgImludmFsaWQgYnVmZmVyIHR5cGUgZW5xdWV1ZWQiOwotICB9Ci0KLSAgLy8gZmluaXNoZWQgd2l0aCB0aGlzIGF1LCBkZXJlZgotICByZXF1ZXN0ZWRfYXVfID0gTlVMTDsKLQotICAvLyBDYWxjdWxhdGUgdG90YWwgcmFuZ2Ugb2YgYnVmZmVyZWQgZGF0YSBmb3IgYm90aCBhdWRpbyBhbmQgdmlkZW8uCi0gIFJhbmdlczxiYXNlOjpUaW1lRGVsdGE+IGJ1ZmZlcmVkKAotICAgICAgYXVkaW9fZGVtdXhlcl9zdHJlYW1fLT5HZXRCdWZmZXJlZFJhbmdlcygpLkludGVyc2VjdGlvbldpdGgoCi0gICAgICAgICAgdmlkZW9fZGVtdXhlcl9zdHJlYW1fLT5HZXRCdWZmZXJlZFJhbmdlcygpKSk7Ci0gIC8vIE5vdGlmeSBob3N0IG9mIGVhY2ggZGlzam9pbnQgcmFuZ2UuCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnVmZmVyZWQuc2l6ZSgpOyArK2kpIHsKLSAgICBob3N0Xy0+QWRkQnVmZmVyZWRUaW1lUmFuZ2UoYnVmZmVyZWQuc3RhcnQoaSksIGJ1ZmZlcmVkLmVuZChpKSk7Ci0gIH0KLQotICBJc3N1ZU5leHRSZXF1ZXN0VGFzaygpOwotfQotCi12b2lkIFNoZWxsRGVtdXhlcjo6SXNzdWVOZXh0UmVxdWVzdFRhc2soKSB7Ci0gIERDSEVDSyghcmVxdWVzdGVkX2F1Xyk7Ci0gIC8vIGlmIHdlJ3JlIHN0b3BwZWQgZG9uJ3QgZG93bmxvYWQgYW55bW9yZQotICBpZiAoc3RvcHBlZF8pIHsKLSAgICBETE9HKElORk8pIDw8ICJzdG9wcGVkIHNvIHJlcXVlc3QgbG9vcCBpcyBzdG9wcGluZyI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIC8vIGlmIHdlIGhhdmUgZW9zIGluIG9uZSBvciBib3RoIGJ1ZmZlcnMgdGhlIGRlY2lzaW9uIGlzIGVhc3kKLSAgaWYgKGF1ZGlvX3JlYWNoZWRfZW9zXyB8fCB2aWRlb19yZWFjaGVkX2Vvc18pIHsKLSAgICBpZiAoYXVkaW9fcmVhY2hlZF9lb3NfKSB7Ci0gICAgICBpZiAodmlkZW9fcmVhY2hlZF9lb3NfKSB7Ci0gICAgICAgIC8vIGJvdGggYXJlIHRydWUsIGlzc3VlIG5vIG1vcmUgcmVxdWVzdHMhCi0gICAgICAgIERMT0coSU5GTykgPDwgImJvdGggc3RyZWFtcyBhdCBFT1MsIHJlcXVlc3QgbG9vcCBzdG9wcGluZyI7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGF1ZGlvIGlzIGF0IGVvcywgdmlkZW8gaXNuJ3QsIGdldCBtb3JlIHZpZGVvCi0gICAgICAgIFJlcXVlc3QoRGVtdXhlclN0cmVhbTo6VklERU8pOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBhdWRpbyBpcyBub3QgYXQgZW9zLCB2aWRlbyBpcywgZ2V0IG1vcmUgYXVkaW8KLSAgICAgIFJlcXVlc3QoRGVtdXhlclN0cmVhbTo6QVVESU8pOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBwcmlvcml0eSBvcmRlciBmb3IgZmlndXJpbmcgb3V0IHdoYXQgdG8gZG93bmxvYWQgbmV4dAotICBiYXNlOjpUaW1lRGVsdGEgYXVkaW9fc3RhbXAgPSBhdWRpb19kZW11eGVyX3N0cmVhbV8tPkdldExhc3RCdWZmZXJUaW1lc3RhbXAoKTsKLSAgYmFzZTo6VGltZURlbHRhIHZpZGVvX3N0YW1wID0gdmlkZW9fZGVtdXhlcl9zdHJlYW1fLT5HZXRMYXN0QnVmZmVyVGltZXN0YW1wKCk7Ci0gIC8vIGlmIHRoZSBhdWRpbyBkZW11eGVyIHN0cmVhbSBpcyBlbXB0eSwgYWx3YXlzIGZpbGwgaXQgZmlyc3QKLSAgaWYgKGF1ZGlvX3N0YW1wID09IGtOb1RpbWVzdGFtcCgpKSB7Ci0gICAgUmVxdWVzdChEZW11eGVyU3RyZWFtOjpBVURJTyk7Ci0gIH0gZWxzZSBpZiAodmlkZW9fc3RhbXAgPT0ga05vVGltZXN0YW1wKCkpIHsKLSAgICAvLyB0aGUgdmlkZW8gZGVtdXhlciBzdHJlYW0gaXMgZW1wdHksIHdlIG5lZWQgZGF0YSBmb3IgaXQKLSAgICBSZXF1ZXN0KERlbXV4ZXJTdHJlYW06OlZJREVPKTsKLSAgfSBlbHNlIGlmICh2aWRlb19zdGFtcCA8IGF1ZGlvX3N0YW1wKSB7Ci0gICAgLy8gdmlkZW8gaXMgZWFybGllciwgZmlsbCBpdCBmaXJzdAotICAgIFJlcXVlc3QoRGVtdXhlclN0cmVhbTo6VklERU8pOwotICB9IGVsc2UgewotICAgIFJlcXVlc3QoRGVtdXhlclN0cmVhbTo6QVVESU8pOwotICB9Ci19Ci0KLXZvaWQgU2hlbGxEZW11eGVyOjpTdG9wKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSB7Ci0gIERDSEVDSyhNZXNzYWdlTG9vcEJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIC8vIHNldCBvdXIgaW50ZXJuYWwgc3RvcCBmbGFnLCB0byBub3QgdHJlYXQgcmVhZCBmYWlsdXJlcyBhcwotICAvLyBlcnJvcnMgYW55bW9yZSBidXQgYXMgYSBuYXR1cmFsIHBhcnQgb2Ygc3RvcHBpbmcKLSAgc3RvcHBlZF8gPSB0cnVlOwotICAvLyBzdG9wIHRoZSByZWFkZXIsIHdoaWNoIHdpbGwgc3RvcCB0aGUgZGF0YXNvdXJjZSBhbmQgY2FsbCBiYWNrCi0gIHJlYWRlcl8tPlN0b3AoYmFzZTo6QmluZCgmU2hlbGxEZW11eGVyOjpEYXRhU291cmNlU3RvcHBlZCwgdGhpcywgY2FsbGJhY2spKTsKLX0KLQotdm9pZCBTaGVsbERlbXV4ZXI6OkRhdGFTb3VyY2VTdG9wcGVkKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSB7Ci0gIFRSQUNFX0VWRU5UMCgibWVkaWFfc3RhY2siLCAiU2hlbGxEZW11eGVyOjpEYXRhU291cmNlU3RvcHBlZCgpIik7Ci0gIERDSEVDSyhNZXNzYWdlTG9vcEJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIC8vIHN0b3AgdGhlIGRvd25sb2FkIHRocmVhZAotICBibG9ja2luZ190aHJlYWRfLlN0b3AoKTsKLQotICAvLyB0ZWxsIGRvd25zdHJlYW0gd2UndmUgc3RvcHBlZAotICBpZiAoYXVkaW9fZGVtdXhlcl9zdHJlYW1fKQotICAgIGF1ZGlvX2RlbXV4ZXJfc3RyZWFtXy0+U3RvcCgpOwotICBpZiAodmlkZW9fZGVtdXhlcl9zdHJlYW1fKQotICAgIHZpZGVvX2RlbXV4ZXJfc3RyZWFtXy0+U3RvcCgpOwotCi0gIGNhbGxiYWNrLlJ1bigpOwotfQotCi12b2lkIFNoZWxsRGVtdXhlcjo6U2VlayhiYXNlOjpUaW1lRGVsdGEgdGltZSwgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgY2IpIHsKLSAgYmxvY2tpbmdfdGhyZWFkXy5tZXNzYWdlX2xvb3AoKS0+UG9zdFRhc2soCi0gICAgICBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kKCZTaGVsbERlbXV4ZXI6OlNlZWtUYXNrLCB0aGlzLCB0aW1lLCBCaW5kVG9DdXJyZW50TG9vcChjYikpKTsKLX0KLQotLy8gcnVucyBvbiBibG9ja2luZyB0aHJlYWQKLXZvaWQgU2hlbGxEZW11eGVyOjpTZWVrVGFzayhiYXNlOjpUaW1lRGVsdGEgdGltZSwgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgY2IpIHsKLSAgVFJBQ0VfRVZFTlQxKCJtZWRpYV9zdGFjayIsICJTaGVsbERlbXV4ZXI6OlNlZWtUYXNrKCkiLCAidGltZXN0YW1wIiwKLSAgICAgICAgICAgICAgIHRpbWUuSW5NaWNyb3NlY29uZHMoKSk7Ci0gIERMT0coSU5GTykgPDwgYmFzZTo6U3RyaW5nUHJpbnRmKCJzZWVrIHRvOiAlIiBQUklkNjQgIiBtcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUuSW5NaWxsaXNlY29uZHMoKSk7Ci0gIC8vIGNsZWFyIGFueSBlbnF1ZXVlZCBidWZmZXJzIG9uIGRlbXV4ZXIgc3RyZWFtcwotICBhdWRpb19kZW11eGVyX3N0cmVhbV8tPkZsdXNoQnVmZmVycygpOwotICB2aWRlb19kZW11eGVyX3N0cmVhbV8tPkZsdXNoQnVmZmVycygpOwotICAvLyBhZHZhbmNlIHBhcnNlciB0byBuZXcgdGltZXN0YW1wCi0gIGlmICghcGFyc2VyXy0+U2Vla1RvKHRpbWUpKSB7Ci0gICAgRExPRyhFUlJPUikgPDwgInBhcnNlciBzZWVrIGZhaWxlZC4iOwotICAgIGNiLlJ1bihQSVBFTElORV9FUlJPUl9SRUFEKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy8gaWYgYm90aCBzdHJlYW1zIGhhZCBmaW5pc2hlZCBkb3dubG9hZGluZywgd2UgbmVlZCB0byByZXN0YXJ0IHRoZSByZXF1ZXN0Ci0gIGlmIChhdWRpb19yZWFjaGVkX2Vvc18gJiYgdmlkZW9fcmVhY2hlZF9lb3NfKSB7Ci0gICAgRExPRyhJTkZPKSA8PCAicmVzdGFydGluZyBzdG9wcGVkIHJlcXVlc3QgbG9vcCI7Ci0gICAgUmVxdWVzdChEZW11eGVyU3RyZWFtOjpBVURJTyk7Ci0gIH0KLSAgYXVkaW9fcmVhY2hlZF9lb3NfID0gZmFsc2U7Ci0gIHZpZGVvX3JlYWNoZWRfZW9zXyA9IGZhbHNlOwotICBmbHVzaGluZ18gPSB0cnVlOwotICBjYi5SdW4oUElQRUxJTkVfT0spOwotfQotCi12b2lkIFNoZWxsRGVtdXhlcjo6T25BdWRpb1JlbmRlcmVyRGlzYWJsZWQoKSB7Ci0gIE5PVElNUExFTUVOVEVEKCk7Ci19Ci0KLXZvaWQgU2hlbGxEZW11eGVyOjpTZXRQbGF5YmFja1JhdGUoZmxvYXQgcGxheWJhY2tfcmF0ZSkgewotICBkYXRhX3NvdXJjZV8tPlNldFBsYXliYWNrUmF0ZShwbGF5YmFja19yYXRlKTsKLX0KLQotc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiBTaGVsbERlbXV4ZXI6OkdldFN0cmVhbSgKLSAgICBtZWRpYTo6RGVtdXhlclN0cmVhbTo6VHlwZSB0eXBlKSB7Ci0gIGlmICh0eXBlID09IERlbXV4ZXJTdHJlYW06OkFVRElPKSB7Ci0gICAgcmV0dXJuIGF1ZGlvX2RlbXV4ZXJfc3RyZWFtXzsKLSAgfSBlbHNlIGlmICh0eXBlID09IERlbXV4ZXJTdHJlYW06OlZJREVPKSB7Ci0gICAgcmV0dXJuIHZpZGVvX2RlbXV4ZXJfc3RyZWFtXzsKLSAgfSBlbHNlIHsKLSAgICBETE9HKFdBUk5JTkcpIDw8ICJ1bnN1cHBvcnRlZCBzdHJlYW0gdHlwZSByZXF1ZXN0ZWQiOwotICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1iYXNlOjpUaW1lRGVsdGEgU2hlbGxEZW11eGVyOjpHZXRTdGFydFRpbWUoKSBjb25zdCB7Ci0gIC8vIHdlIGFsd2F5cyBhc3N1bWUgYSBzdGFydCB0aW1lIG9mIDAKLSAgcmV0dXJuIGJhc2U6OlRpbWVEZWx0YSgpOwotfQotCi1jb25zdCBBdWRpb0RlY29kZXJDb25maWcmIFNoZWxsRGVtdXhlcjo6QXVkaW9Db25maWcoKSB7Ci0gIHJldHVybiBwYXJzZXJfLT5BdWRpb0NvbmZpZygpOwotfQotCi1jb25zdCBWaWRlb0RlY29kZXJDb25maWcmIFNoZWxsRGVtdXhlcjo6VmlkZW9Db25maWcoKSB7Ci0gIHJldHVybiBwYXJzZXJfLT5WaWRlb0NvbmZpZygpOwotfQotCi1ib29sIFNoZWxsRGVtdXhlcjo6TWVzc2FnZUxvb3BCZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkgY29uc3QgewotICByZXR1cm4gbWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX2RlbXV4ZXIuaCBiL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX2RlbXV4ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZjMzgxZS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9kZW11eGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9GSUxURVJTX1NIRUxMX0RFTVVYRVJfSF8KLSNkZWZpbmUgTUVESUFfRklMVEVSU19TSEVMTF9ERU1VWEVSX0hfCi0KLSNpbmNsdWRlIDxkZXF1ZT4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlbXV4ZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlbXV4ZXJfc3RyZWFtLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9yYW5nZXMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3NoZWxsX2J1ZmZlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9zaGVsbF9wYXJzZXIuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgRGVjb2RlckJ1ZmZlcjsKLWNsYXNzIFNoZWxsRGVtdXhlcjsKLQotY2xhc3MgU2hlbGxEZW11eGVyU3RyZWFtIDogcHVibGljIERlbXV4ZXJTdHJlYW0gewotIHB1YmxpYzoKLSAgU2hlbGxEZW11eGVyU3RyZWFtKFNoZWxsRGVtdXhlciogZGVtdXhlciwgVHlwZSB0eXBlKTsKLQotICAvLyBEZW11eGVyU3RyZWFtIGltcGxlbWVudGF0aW9uCi0gIHZpcnR1YWwgdm9pZCBSZWFkKGNvbnN0IFJlYWRDQiYgcmVhZF9jYikgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgY29uc3QgQXVkaW9EZWNvZGVyQ29uZmlnJiBhdWRpb19kZWNvZGVyX2NvbmZpZygpIE9WRVJSSURFOwotICB2aXJ0dWFsIGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgdmlkZW9fZGVjb2Rlcl9jb25maWcoKSBPVkVSUklERTsKLSAgdmlydHVhbCBUeXBlIHR5cGUoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIEVuYWJsZUJpdHN0cmVhbUNvbnZlcnRlcigpIE9WRVJSSURFOwotICB2aXJ0dWFsIGJvb2wgU3RyZWFtV2FzRW5jcnlwdGVkKCkgY29uc3QgT1ZFUlJJREU7Ci0KLSAgLy8gRnVuY3Rpb25zIHVzZWQgYnkgU2hlbGxEZW11eGVyCi0gIFJhbmdlczxiYXNlOjpUaW1lRGVsdGE+IEdldEJ1ZmZlcmVkUmFuZ2VzKCk7Ci0gIHZvaWQgRW5xdWV1ZUJ1ZmZlcihzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGJ1ZmZlcik7Ci0gIHZvaWQgRmx1c2hCdWZmZXJzKCk7Ci0gIHZvaWQgU3RvcCgpOwotICBiYXNlOjpUaW1lRGVsdGEgR2V0TGFzdEJ1ZmZlclRpbWVzdGFtcCgpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgLy8gVGhlIFJhbmdlcyBvYmplY3QgZG9lc24ndCBvZmZlciBhIGNvbXBsZW1lbnQgb2JqZWN0IHNvIHdlIHJlYnVpbGQKLSAgLy8gZW5xdWV1ZWQgcmFuZ2VzIGZyb20gdGhlIHVuaW9uIG9mIGFsbCBvZiB0aGUgYnVmZmVycyBpbiB0aGUgcXVldWUuCi0gIC8vIENhbGwgbWUgd2hlbmV2ZXIgX3JlbW92aW5nXyBkYXRhIGZyb20gYnVmZmVyX3F1ZXVlXy4KLSAgdm9pZCBSZWJ1aWxkRW5xdWV1ZWRSYW5nZXNfTG9ja2VkKCk7Ci0KLSAgLy8gbm9uLW93bmluZyBwb2ludGVyIHRvIGF2b2lkIGNpcmN1bGFyIHJlZmVyZW5jZQotICBTaGVsbERlbXV4ZXIqIGRlbXV4ZXJfOwotICBUeXBlIHR5cGVfOwotCi0gIC8vIFVzZWQgdG8gcHJvdGVjdCBldmVyeXRoaW5nIGJlbG93LgotICBtdXRhYmxlIGJhc2U6OkxvY2sgbG9ja187Ci0gIC8vIEtlZXBzIHRyYWNrIG9mIGFsbCB0aW1lIHJhbmdlcyB0aGlzIG9iamVjdCBoYXMgc2VlbiBzaW5jZSBjcmVhdGlvbi4KLSAgLy8gVGhlIGRlbXV4ZXIgdXNlcyB0aGVzZSByYW5nZXMgdG8gdXBkYXRlIHRoZSBwaXBlbGluZSBhYm91dCB3aGF0IGRhdGEKLSAgLy8gaXQgaGFzIGRlbXV4ZWQuCi0gIFJhbmdlczxiYXNlOjpUaW1lRGVsdGE+IGJ1ZmZlcmVkX3Jhbmdlc187Ci0gIC8vIFRoZSBsYXN0IHRpbWVzdGFtcCBvZiBidWZmZXIgZW5xdWV1ZWQuIFRoaXMgaXMgdXNlZCBpbiB0d28gcGxhY2VzOgotICAvLyAgIDEuIFVzZWQgd2l0aCB0aGUgdGltZXN0YW1wIG9mIHRoZSBjdXJyZW50IGZyYW1lIHRvIGNhbGN1bGF0ZSB0aGUKLSAgLy8gICAgICBidWZmZXIgcmFuZ2UuCi0gIC8vICAgMi4gVXNlZCBieSB0aGUgZGVtdXhlciB0byBkZXRlbWluYXRlIHdoYXQgdHlwZSBvZiBmcmFtZSB0byBnZXQgbmV4dC4KLSAgYmFzZTo6VGltZURlbHRhIGxhc3RfYnVmZmVyX3RpbWVzdGFtcF87Ci0gIGJvb2wgc3RvcHBlZF87Ci0KLSAgdHlwZWRlZiBzdGQ6OmRlcXVlPHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gPiBCdWZmZXJRdWV1ZTsKLSAgQnVmZmVyUXVldWUgYnVmZmVyX3F1ZXVlXzsKLQotICB0eXBlZGVmIHN0ZDo6ZGVxdWU8UmVhZENCPiBSZWFkUXVldWU7Ci0gIFJlYWRRdWV1ZSByZWFkX3F1ZXVlXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU2hlbGxEZW11eGVyU3RyZWFtKTsKLX07Ci0KLWNsYXNzIE1FRElBX0VYUE9SVCBTaGVsbERlbXV4ZXIgOiBwdWJsaWMgRGVtdXhlciB7Ci0gcHVibGljOgotICBTaGVsbERlbXV4ZXIoY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbWVzc2FnZV9sb29wLAotICAgICAgICAgICAgICAgRGF0YVNvdXJjZSogZGF0YV9zb3VyY2UpOwotICB2aXJ0dWFsIH5TaGVsbERlbXV4ZXIoKTsKLQotICAvLyBEZW11eGVyIGltcGxlbWVudGF0aW9uLgotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShEZW11eGVySG9zdCogaG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc3RhdHVzX2NiKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0b3AoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU2VlayhiYXNlOjpUaW1lRGVsdGEgdGltZSwgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgY2IpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgT25BdWRpb1JlbmRlcmVyRGlzYWJsZWQoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFNldFBsYXliYWNrUmF0ZShmbG9hdCBwbGF5YmFja19yYXRlKSBPVkVSUklERTsKLSAgdmlydHVhbCBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IEdldFN0cmVhbSgKLSAgICAgIERlbXV4ZXJTdHJlYW06OlR5cGUgdHlwZSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgYmFzZTo6VGltZURlbHRhIEdldFN0YXJ0VGltZSgpIGNvbnN0IE9WRVJSSURFOwotCi0gIC8vIFRPRE86IENvbnNpZGVyIG1vdmUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgdG8gcHJpdmF0ZSBzZWN0aW9uLgotCi0gIC8vIElzc3VlcyBhIHRhc2sgdG8gdGhlIGRlbXV4ZXIgdG8gaWRlbnRpZnkgdGhlIG5leHQgYnVmZmVyIG9mIHByb3ZpZGVkIHR5cGUKLSAgLy8gaW4gdGhlIHN0cmVhbSwgYWxsb2NhdGUgbWVtb3J5IHRvIGNvbnRhaW4gdGhhdCBidWZmZXIsIGRvd25sb2FkIHRoZSBieXRlcwotICAvLyBpbiB0byBpdCwgYW5kIGVucXVldWUgdGhlIGRhdGEgaW4gdGhlIGFwcHJvcHJpYXRlIGRlbXV4ZXIgc3RyZWFtLgotICB2b2lkIFJlcXVlc3QoRGVtdXhlclN0cmVhbTo6VHlwZSB0eXBlKTsKLQotICAvLyBUaGUgRGVtdXhlclN0cmVhbSBvYmplY3RzIGFzayB0aGVpciBwYXJlbnQgU2hlbGxEZW11eGVyIHN0cmVhbSBjbGFzcwotICAvLyBmb3IgdGhlc2UgY29uZmlndXJhdGlvbiBkYXRhIHJhdGhlciB0aGFuIGR1cGxpY2F0aW5nIGluIHRoZSBjaGlsZCBjbGFzc2VzCi0gIGNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYgQXVkaW9Db25maWcoKTsKLSAgY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiBWaWRlb0NvbmZpZygpOwotCi0gIC8vIFByb3ZpZGUgYWNjZXNzIHRvIFNoZWxsRGVtdXhlclN0cmVhbS4KLSAgYm9vbCBNZXNzYWdlTG9vcEJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSBjb25zdDsKLQotICAvLyBDYWxsYmFjayBmcm9tIFNoZWxsQnVmZmVyRmFjdG9yeQotICB2b2lkIEJ1ZmZlckFsbG9jYXRlZChzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGJ1ZmZlcik7Ci0KLSBwcml2YXRlOgotICB2b2lkIFBhcnNlQ29uZmlnRG9uZShjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBzdGF0dXNfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgIFBpcGVsaW5lU3RhdHVzIHN0YXR1cyk7Ci0gIHZvaWQgRGF0YVNvdXJjZVN0b3BwZWQoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spOwotCi0gIC8vIG1ldGhvZHMgdGhhdCBwZXJmb3JtIGJsb2NraW5nIEkvTywgYW5kIGFyZSB0aGVyZWZvcmUgcnVuIG9uIHRoZQotICAvLyBibG9ja2luZ190aHJlYWRfCi0gIC8vIGRvd25sb2FkIGVub3VnaCBvZiB0aGUgc3RyZWFtIHRvIHBhcnNlIHRoZSBjb25maWd1cmF0aW9uLiByZXR1cm5zCi0gIC8vIGZhbHNlIG9uIGVycm9yLgotICBQaXBlbGluZVN0YXR1cyBQYXJzZUNvbmZpZ0Jsb2NraW5nKGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIHN0YXR1c19jYik7Ci0gIHZvaWQgUmVxdWVzdFRhc2soRGVtdXhlclN0cmVhbTo6VHlwZSB0eXBlKTsKLSAgdm9pZCBEb3dubG9hZFRhc2soc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBidWZmZXIpOwotICB2b2lkIElzc3VlTmV4dFJlcXVlc3RUYXNrKCk7Ci0gIHZvaWQgU2Vla1Rhc2soYmFzZTo6VGltZURlbHRhIHRpbWUsIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGNiKTsKLQotICBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+IG1lc3NhZ2VfbG9vcF87Ci0gIERlbXV4ZXJIb3N0KiBob3N0XzsKLQotICAvLyBUaHJlYWQgb24gd2hpY2ggYWxsIGJsb2NraW5nIG9wZXJhdGlvbnMgYXJlIGV4ZWN1dGVkLgotICBiYXNlOjpUaHJlYWQgYmxvY2tpbmdfdGhyZWFkXzsKLSAgRGF0YVNvdXJjZSogZGF0YV9zb3VyY2VfOwotICBzY29wZWRfcmVmcHRyPFNoZWxsRGF0YVNvdXJjZVJlYWRlcj4gcmVhZGVyXzsKLQotICBib29sIHN0b3BwZWRfOwotICBib29sIGZsdXNoaW5nXzsKLQotICBzY29wZWRfcmVmcHRyPFNoZWxsRGVtdXhlclN0cmVhbT4gYXVkaW9fZGVtdXhlcl9zdHJlYW1fOwotICBzY29wZWRfcmVmcHRyPFNoZWxsRGVtdXhlclN0cmVhbT4gdmlkZW9fZGVtdXhlcl9zdHJlYW1fOwotICBzY29wZWRfcmVmcHRyPFNoZWxsUGFyc2VyPiBwYXJzZXJfOwotCi0gIHNjb3BlZF9yZWZwdHI8U2hlbGxBVT4gcmVxdWVzdGVkX2F1XzsKLSAgYm9vbCBhdWRpb19yZWFjaGVkX2Vvc187Ci0gIGJvb2wgdmlkZW9fcmVhY2hlZF9lb3NfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfRklMVEVSU19TSEVMTF9ERU1VWEVSX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9mZm1wZWcuY2MgYi9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9mZm1wZWcuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxOGU2YmQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfZmZtcGVnLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvc2hlbGxfZmZtcGVnLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLW5hbWVzcGFjZSB7Ci1ib29sIGZmbXBlZ19pbml0aWFsaXplZCA9IGZhbHNlOwotfSAgLy8gbmFtZXNwYWNlCi0KLXZvaWQgRW5zdXJlRmZtcGVnSW5pdGlhbGl6ZWQoKSB7Ci0gIGlmICghZmZtcGVnX2luaXRpYWxpemVkKSB7Ci0gICAgYXZfcmVnaXN0ZXJfYWxsKCk7Ci0gICAgZmZtcGVnX2luaXRpYWxpemVkID0gdHJ1ZTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX2ZmbXBlZy5oIGIvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfZmZtcGVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNmQ0N2QuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfZmZtcGVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX0ZJTFRFUlNfU0hFTExfRkZNUEVHX0hfCi0jZGVmaW5lIE1FRElBX0ZJTFRFUlNfU0hFTExfRkZNUEVHX0hfCi0KLWV4dGVybiAiQyIgewotI2luY2x1ZGUgPGxpYmF2Y29kZWMvYXZjb2RlYy5oPgotI2luY2x1ZGUgPGxpYmF2Zm9ybWF0L2F2Zm9ybWF0Lmg+Ci0jaW5jbHVkZSA8bGliYXZyZXNhbXBsZS9hdnJlc2FtcGxlLmg+Ci0jaW5jbHVkZSA8bGliYXZ1dGlsL2F2dXRpbC5oPgotI2luY2x1ZGUgPGxpYmF2dXRpbC9pbWd1dGlscy5oPgotI2luY2x1ZGUgPGxpYmF2dXRpbC9vcHQuaD4KLX0gIC8vIGV4dGVybiAiQyIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotdm9pZCBFbnN1cmVGZm1wZWdJbml0aWFsaXplZCgpOwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9GSUxURVJTX1NIRUxMX0ZGTVBFR19IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfZmx2X3BhcnNlci5jYyBiL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX2Zsdl9wYXJzZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OTJhNDkuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfZmx2X3BhcnNlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDUyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9zaGVsbF9mbHZfcGFyc2VyLmgiCi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPGxpbWl0cz4KLQotI2luY2x1ZGUgImJhc2Uvc3RyaW5ncHJpbnRmLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9lbmRpYW5fdXRpbC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyAiRkxWIiBhcyBoZXggQVNDSUkgY29kZXMKLXN0YXRpYyBjb25zdCB1aW50MzIga0ZMViA9IDB4MDA0NjRjNTY7Ci0KLS8vIEZMViBjb25maWd1cmF0aW9uLCBzdWNoIGFzIHRoZSBBVkNDb25maWdSZWNvcmQgYW5kIHRoZSBBdWRpb1NwZWNpZmljQ29uZmlnLAotLy8gc2hvdWxkIHByb2NlZWQgYW55IGFjdHVhbCBlbmNvZGVkIGRhdGEsIGFuZCBzaG91bGQgYmUgaW4gdGhlIHRvcCBvZiB0aGUgZmlsZS4KLS8vIFRoaXMgY29uc3RhbnQgZGVzY3JpYmVzIGhvdyBmYXIgaW50byB0aGUgZmlsZSB3ZSdyZSB3aWxsaW5nIHRvIHRyYXZlcnNlCi0vLyB3aXRob3V0IGVuY291bnRlcmluZyBtZXRhZGF0YSBvciBlbmNvZGVkIHZpZGVvIGtleWZyYW1lIGRhdGEgYmVmb3JlIGdpdmluZwotLy8gdXAuCi1zdGF0aWMgY29uc3QgdWludDY0IGtNZXRhZGF0YU1heEJ5dGVzID0gNCAqIDEwMjQgKiAxMDI0OwotCi1zdGF0aWMgY29uc3QgdWludDgga0F1ZGlvVGFnVHlwZSA9IDg7Ci1zdGF0aWMgY29uc3QgdWludDgga1ZpZGVvVGFnVHlwZSA9IDk7Ci1zdGF0aWMgY29uc3QgdWludDgga1NjcmlwdERhdGFPYmplY3RUYWdUeXBlID0gMTg7Ci0KLS8vIHNpemUgb2Ygc3RhbmRhcmQgRkxWIHRhZwotc3RhdGljIGNvbnN0IGludCBrVGFnU2l6ZSA9IDExOwotLy8gVG8gbGltaXQgcmVhZHMgd2UgZG93bmxvYWQgYSBiaXQgb2YgZXh0cmEgZGF0YSBpbiBmbGFzaCBoZWFkZXJzIHRvIG1ha2UKLS8vIHN1cmUgd2UgZ2V0IGFsbCBvZiB0aGUgdGFnIGluZm9ybWF0aW9uIHdlIG1pZ2h0IG5lZWQsIGFsbG93aW5nIHVzCi0vLyB0byBkb3dubG9hZCB0aGUgYWN0dWFsIGVuY29kZWQgZGF0YSBkaXJlY3RseSBpbnRvIGEgZGVjb2RlciBidWZmZXIgd2l0aAotLy8gcHJvcGVyIGFsaWdubWVudCBvbiBhIHN1YnNlcXVlbnQgcmVhZC4gVGhpcyB2YWx1ZSBpcyBjYWxjdWxhdGVkIGFzIHRoZSBzdW0gb2YKLS8vIHRoZSBGTFYgdGFnIHNpemUsIHRoZSBWSURFT0RBVEEgdGFnIHNpemUsIGFuZCB0aGUgQVZDVklERU9QQUNLRVQgdGFnIHNpemUsCi0vLyB3aGljaCBpcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgdGFnIGRhdGEgdGhhdCB3ZSB3aWxsIG5lZWQgdG8gcGFyc2UgYmVmb3JlCi0vLyBkb3dubG9hZCBlbmNvZGVkIEEvViBkYXRhLgotc3RhdGljIGNvbnN0IGludCBrVGFnRG93bmxvYWRTaXplID0ga1RhZ1NpemUgKyAxICsgNDsKLS8vIHRoZXNlIGNvbnN0YW50cyBkZXNjcmliZSB0b3RhbCB0YWcgc2l6ZXMgZm9yIEFBQy9BVkMgYWRkZW5kdW1zIHRvIHRhZ3MKLXN0YXRpYyBjb25zdCBpbnQga0F1ZGlvVGFnU2l6ZSA9IDI7Ci1zdGF0aWMgY29uc3QgaW50IGtWaWRlb1RhZ1NpemUgPSA1OwotCi0vLyBGTFYgQVVESU9EQVRBIHRhZyBjb25zdGFudHMKLXN0YXRpYyBjb25zdCB1aW50OCBrU291bmRGb3JtYXRUeXBlQUFDID0gMTA7Ci0vLyBGTFYgQUFDQVVESU9EQVRBIHRhZyBjb25zdGFudHMKLXN0YXRpYyBjb25zdCB1aW50OCBrQUFDUGFja2V0VHlwZVNlcXVlbmNlID0gMDsKLXN0YXRpYyBjb25zdCB1aW50OCBrQUFDUGFja2V0VHlwZVJhdyA9IDE7Ci0vLyBGTFYgVklERU9EQVRBIHRhZyBjb25zdGFudHMKLXN0YXRpYyBjb25zdCB1aW50OCBrQ29kZWNJREFWQyA9IDc7Ci0vLyBGTFYgQVZDVklERU9EQVRBIHRhZyBjb25zdGFudHMKLXN0YXRpYyBjb25zdCB1aW50OCBrQVZDUGFja2V0VHlwZVNlcXVlbmNlSGVhZGVyID0gMDsKLXN0YXRpYyBjb25zdCB1aW50OCBrQVZDUGFja2V0VHlwZU5BTFUgPSAxOwotLy8gVW51c2VkOgotLy8gc3RhdGljIGNvbnN0IHVpbnQ4IGtBVkNQYWNrZXRUeXBlRW5kT2ZTZXF1ZW5jZSA9IDI7Ci0KLS8vIFNDUklQVERBVEEgcGFyc2luZyBjb25zdGFudHMKLXN0YXRpYyBjb25zdCB1aW50OCBrQU1GME51bWJlclR5cGUgPSAweDAwOwotc3RhdGljIGNvbnN0IGludCBrQU1GME51bWJlckxlbmd0aCA9IDk7Ci0KLS8vIHN0YXRpYwotUGlwZWxpbmVTdGF0dXMgU2hlbGxGTFZQYXJzZXI6OkNvbnN0cnVjdCgKLSAgICBzY29wZWRfcmVmcHRyPFNoZWxsRGF0YVNvdXJjZVJlYWRlcj4gcmVhZGVyLAotICAgIGNvbnN0IHVpbnQ4KiBjb25zdHJ1Y3Rpb25faGVhZGVyLAotICAgIHNjb3BlZF9yZWZwdHI8U2hlbGxQYXJzZXI+KiBwYXJzZXIpIHsKLSAgRENIRUNLKHBhcnNlcik7Ci0gICpwYXJzZXIgPSBOVUxMOwotCi0gIC8vIGxvb2sgZm9yICJGTFYiIHN0cmluZyBhdCB0b3Agb2YgZmlsZSwgbWFzayBvZmYgTFNCCi0gIHVpbnQzMiBGTFYgPSBlbmRpYW5fdXRpbDo6bG9hZF91aW50MzJfYmlnX2VuZGlhbihjb25zdHJ1Y3Rpb25faGVhZGVyKSA+PiA4OwotICBpZiAoRkxWICE9IGtGTFYpIHsKLSAgICAvLyBOb3QgYW4gZmx2LgotICAgIHJldHVybiBERU1VWEVSX0VSUk9SX0NPVUxEX05PVF9QQVJTRTsKLSAgfQotICAvLyBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIGJvdGggYW4gYXVkaW8gYW5kIHZpZGVvIHN0cmVhbS4gQXVkaW8gc3RyZWFtIGlzCi0gIC8vIHRoaXJkIGJpdCwgdmlkZW8gc3RyZWFtIGlzIGZpcnN0IGJpdCBpbiA1dGggYnl0ZSBvZiBmaWxlIGhlYWRlcgotICBpZiAoKGNvbnN0cnVjdGlvbl9oZWFkZXJbNF0gJiAweDA1KSAhPSAweDA1KSB7Ci0gICAgcmV0dXJuIERFTVVYRVJfRVJST1JfTk9fU1VQUE9SVEVEX1NUUkVBTVM7Ci0gIH0KLSAgLy8gb2Zmc2V0IG9mIGZpcnN0IGRhdGEgdGFnIGluIHN0cmVhbSBpcyBuZXh0IDQgYnl0ZXMKLSAgdWludDMyIGRhdGFfb2Zmc2V0ID0KLSAgICAgIGVuZGlhbl91dGlsOjpsb2FkX3VpbnQzMl9iaWdfZW5kaWFuKGNvbnN0cnVjdGlvbl9oZWFkZXIgKyA1KTsKLSAgLy8gYWRkIGZvdXIgYnl0ZXMgdG8gc2tpcCBvdmVyIFByZXZpb3VzVGFnU2l6ZTAKLSAgZGF0YV9vZmZzZXQgKz0gNDsKLQotICAvLyBjb25zdHJ1Y3QgYW4gRkxWIHBhcnNlcgotICAqcGFyc2VyID0gbmV3IFNoZWxsRkxWUGFyc2VyKHJlYWRlciwgZGF0YV9vZmZzZXQpOwotICByZXR1cm4gUElQRUxJTkVfT0s7Ci19Ci0KLVNoZWxsRkxWUGFyc2VyOjpTaGVsbEZMVlBhcnNlcihzY29wZWRfcmVmcHRyPFNoZWxsRGF0YVNvdXJjZVJlYWRlcj4gcmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiB0YWdfc3RhcnRfb2Zmc2V0KQotICAgIDogU2hlbGxBVkNQYXJzZXIocmVhZGVyKSwKLSAgICAgIHRhZ19vZmZzZXRfKHRhZ19zdGFydF9vZmZzZXQpLAotICAgICAgYXRfZW5kX29mX2ZpbGVfKGZhbHNlKSB7fQotCi1TaGVsbEZMVlBhcnNlcjo6flNoZWxsRkxWUGFyc2VyKCkge30KLQotYm9vbCBTaGVsbEZMVlBhcnNlcjo6UGFyc2VDb25maWcoKSB7Ci0gIC8vIHRyYXZlcnNlIGZpbGUgdW50aWwgd2UgZWl0aGVyIHJlYWNoIHRoZSBsaW1pdCBvZiBieXRlcyB3ZSdyZSB3aWxsaW5nIHRvCi0gIC8vIHBhcnNlIG9mIGNvbmZpZyBpbmZvIG9yIHdlJ3ZlIGVuY291bnRlcmVkIGFjdHVhbCBrZXlmcmFtZSB2aWRlbyBkYXRhLgotICB3aGlsZSAodGFnX29mZnNldF8gPCBrTWV0YWRhdGFNYXhCeXRlcyAmJiB0aW1lX3RvX2J5dGVfbWFwXy5zaXplKCkgPT0gMCkgewotICAgIGlmICghUGFyc2VOZXh0VGFnKCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBpZiAoZHVyYXRpb25fLkluTWlsbGlzZWNvbmRzKCkgPT0gMCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFdlIG1heSBoYXZlIGEgdmFsaWQgZHVyYXRpb24gYnkgbm93IGFuZCB0aGUgcmVhZGVyIG1heSBrbm93IHRoZQotICAvLyBsZW5ndGggb2YgdGhlIGZpbGUgaW4gYnl0ZXMsIHNlZSBpZiB3ZSBjYW4gZXh0cmFwb2xhdGUgYSBiaXRyYXRlIGZyb20KLSAgLy8gdGhpcy4KLSAgaWYgKGR1cmF0aW9uXyAhPSBrSW5maW5pdGVEdXJhdGlvbigpICYmIHJlYWRlcl8tPkZpbGVTaXplKCkgPiAwKSB7Ci0gICAgYml0c19wZXJfc2Vjb25kXyA9ICh1aW50MzIpKAotICAgICAgICAoKHJlYWRlcl8tPkZpbGVTaXplKCkgKiA4MDAwVUxMKSAvIChkdXJhdGlvbl8uSW5NaWxsaXNlY29uZHMoKSkpKTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zY29wZWRfcmVmcHRyPFNoZWxsQVU+IFNoZWxsRkxWUGFyc2VyOjpHZXROZXh0QVUoRGVtdXhlclN0cmVhbTo6VHlwZSB0eXBlKSB7Ci0gIGlmICh0eXBlID09IERlbXV4ZXJTdHJlYW06OkFVRElPKSB7Ci0gICAgcmV0dXJuIEdldE5leHRBdWRpb0FVKCk7Ci0gIH0gZWxzZSBpZiAodHlwZSA9PSBEZW11eGVyU3RyZWFtOjpWSURFTykgewotICAgIHJldHVybiBHZXROZXh0VmlkZW9BVSgpOwotICB9IGVsc2UgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotLy8gc2Vla2luZyBhbiBmbHY6Ci0vLyAxKSBmaW5kaW5nIG5lYXJlc3QgdmlkZW8ga2V5ZnJhbWUgYmVmb3JlIHRpbWVzdGFtcDoKLS8vICBhKSBJZiB3ZSBhcmUgc2Vla2luZyBpbiB0byBhbiBhcmVhIHdlIGhhdmUgYWxyZWFkeSBwYXJzZWQgdGhlbiB3ZQotLy8gICAgICB3aWxsIGZpbmQgdGhlIGJvdW5kaW5nIGtleWZyYW1lLgotLy8gIGIpIElmIG5vdCwgd2UgcGFyc2UgdGhlIEZMViB1bnRpbCBhKSBpcyB0cnVlLgotLy8gMikgc2V0IHRhZ19vZmZzZXRfIHRvIHRoZSBieXRlIG9mZnNldCBvZiB0aGUga2V5ZnJhbWUgZm91bmQgaW4gMSkKLWJvb2wgU2hlbGxGTFZQYXJzZXI6OlNlZWtUbyhiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wKSB7Ci0gIC8vIGNvbnZlcnQgdGltZXN0YW1wIHRvIG1pbGxpc2Vjb25kIEZMViB0aW1lc3RhbXAKLSAgdWludDMyIHRpbWVzdGFtcF9mbHYgPSAodWludDMyKXRpbWVzdGFtcC5Jbk1pbGxpc2Vjb25kcygpOwotICBib29sIGZvdW5kX3VwcGVyX2JvdW5kID0gZmFsc2U7Ci0gIHVpbnQ2NCBzZWVrX2J5dGVfb2Zmc2V0ID0gdGFnX29mZnNldF87Ci0gIHVpbnQzMiBzZWVrX3RpbWVzdGFtcCA9IDA7Ci0gIC8vIHVwcGVyX2JvdW5kIHJldHVybnMgaXRlcmF0b3Igb2YgZmlyc3QgZWxlbWVudCBpbiBjb250YWluZXIgd2l0aCBrZXkgPiBhcmcKLSAgVGltZVRvQnl0ZU1hcDo6aXRlcmF0b3Iga2V5ZnJhbWVfaW5fbWFwID0KLSAgICAgIHRpbWVfdG9fYnl0ZV9tYXBfLnVwcGVyX2JvdW5kKHRpbWVzdGFtcF9mbHYpOwotICAvLyB0aGlzIGlzIGNhc2UgMWEpLCBvciBrZXlmcmFtZSBpcyBsYXN0IGtleWZyYW1lIGJlZm9yZSBFT1MsCi0gIC8vIG9yIG1hcCBpcyBlbXB0eSAoZXJyb3Igc3RhdGUpCi0gIGlmIChrZXlmcmFtZV9pbl9tYXAgPT0gdGltZV90b19ieXRlX21hcF8uZW5kKCkpIHsKLSAgICAvLyBpcyBtYXAgZW1wdHk/IFRoaXMgaXMgYW4gZXJyb3IgY2FzZSwgd2Ugc2hvdWxkIGFsd2F5cyBoYXZlIGZvdW5kIGEKLSAgICAvLyBrZXlmcmFtZSBkdXJpbmcgUGFyc2VDb25maWcoKQotICAgIGlmICh0aW1lX3RvX2J5dGVfbWFwXy5zaXplKCkgPT0gMCkgewotICAgICAgTk9UUkVBQ0hFRCgpIDw8ICJlbXB0eSB0aW1lIHRvIGJ5dGUgbWFwIG9uIEZMViBzZWVrIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gc3RhcnQgYXQgbGFzdCBrZXlmcmFtZSBpbiB0aGUgbWFwIGFuZCBwYXJzZSBmcm9tIHRoZXJlCi0gICAgICBzZWVrX2J5dGVfb2Zmc2V0ID0gdGltZV90b19ieXRlX21hcF8ucmJlZ2luKCktPnNlY29uZDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgZm91bmRfdXBwZXJfYm91bmQgPSB0cnVlOwotICAgIC8vIGl0J3MgcG9zc2libGUgdGltZXN0YW1wIDw9IGZpcnN0IGtleWZyYW1lIGluIG1hcCwgaW4gd2hpY2ggY2FzZSB3ZQotICAgIC8vIHVzZSB0aGUgZmlyc3Qga2V5ZnJhbWUgaW4gbWFwLgotICAgIGlmIChrZXlmcmFtZV9pbl9tYXAgIT0gdGltZV90b19ieXRlX21hcF8uYmVnaW4oKSkgewotICAgICAga2V5ZnJhbWVfaW5fbWFwLS07Ci0gICAgfQotICAgIHNlZWtfYnl0ZV9vZmZzZXQgPSBrZXlmcmFtZV9pbl9tYXAtPnNlY29uZDsKLSAgICBzZWVrX3RpbWVzdGFtcCA9IGtleWZyYW1lX2luX21hcC0+Zmlyc3Q7Ci0gIH0KLSAgLy8gaWYgc2VlayBoYXMgY2hhbmdlZCBvdXIgcG9zaXRpb24gaW4gdGhlIGZpbGUganVtcCB0aGVyZSBub3cKLSAgaWYgKHNlZWtfYnl0ZV9vZmZzZXQgIT0gdGFnX29mZnNldF8pIHsKLSAgICBKdW1wUGFyc2VyVG8oc2Vla19ieXRlX29mZnNldCk7Ci0gIH0KLSAgLy8gaWYgZm91bmRfdXBwZXJfYm91bmQgaXMgc3RpbGwgZmFsc2Ugd2UgYXJlIGluIGNhc2UgMWIpLCBwYXJzZSBhaGVhZCB1bnRpbAotICAvLyB3ZSBlbmNvdW50ZXIgYW4gdXBwZXIgYm91bmQgb3IgYW4gZW9mCi0gIHdoaWxlICghZm91bmRfdXBwZXJfYm91bmQgJiYgIWF0X2VuZF9vZl9maWxlXykgewotICAgIC8vIHNhdmUgaGlnaGVzdCBrZXlmcmFtZSBpbiBmaWxlIGluIGNhc2UgaXQgYmVjb21lcyB0aGUgb25lIHdlIHdhbnQKLSAgICBzZWVrX2J5dGVfb2Zmc2V0ID0gdGltZV90b19ieXRlX21hcF8ucmJlZ2luKCktPnNlY29uZDsKLSAgICBzZWVrX3RpbWVzdGFtcCA9IHRpbWVfdG9fYnl0ZV9tYXBfLnJiZWdpbigpLT5maXJzdDsKLSAgICAvLyBwYXJzZSBuZXh0IHRhZyBpbiB0aGUgZmlsZQotICAgIGlmICghUGFyc2VOZXh0VGFnKCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgLy8gY2hlY2sgbGFzdCBrZXlmcmFtZSB0aW1lc3RhbXAsIGlmIGl0J3MgZ3JlYXRlciB0aGFuIG91ciB0YXJnZXQgdGltZXN0YW1wCi0gICAgLy8gd2UgY2FuIHN0b3AKLSAgICBmb3VuZF91cHBlcl9ib3VuZCA9ICh0aW1lX3RvX2J5dGVfbWFwXy5yYmVnaW4oKS0+Zmlyc3QgPiB0aW1lc3RhbXBfZmx2KTsKLSAgfQotICAvLyBtYWtlIHN1cmUgd2UgaGF2ZSBkb25lIHN0ZXAgMiksIGp1bXAgcGFyc2VyIHRvIG5ldyBrZXlmcmFtZQotICBpZiAoc2Vla19ieXRlX29mZnNldCAhPSB0YWdfb2Zmc2V0XykgewotICAgIEp1bXBQYXJzZXJUbyhzZWVrX2J5dGVfb2Zmc2V0KTsKLSAgfQotICBETE9HKElORk8pIDw8IGJhc2U6OlN0cmluZ1ByaW50ZigiZmx2IHBhcnNlciBzZWVraW5nIHRvIHRpbWVzdGFtcDogJSIgUFJJZDY0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgY2hvc2Uga2V5ZnJhbWUgYXQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAuSW5NaWxsaXNlY29uZHMoKSwgc2Vla190aW1lc3RhbXApOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc2NvcGVkX3JlZnB0cjxTaGVsbEFVPiBTaGVsbEZMVlBhcnNlcjo6R2V0TmV4dEF1ZGlvQVUoKSB7Ci0gIC8vIEFzIGF1ZGlvIHRpbWVzdGFtcHMgYXJlIHN1cHBvc2VkIHRvIGluY3JlYXNlIG1vbm90b25pY2FsbHkgd2UgbmVlZAotICAvLyBvbmx5IDIgdG8gY2FsY3VsYXRlIGEgZHVyYXRpb24uCi0gIHdoaWxlIChuZXh0X2F1ZGlvX2F1c18uc2l6ZSgpIDwgMikgewotICAgIGlmICghUGFyc2VOZXh0VGFnKCkpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgfQotICAvLyBUaGVyZSBzaG91bGQgYWx3YXlzIGJlIDIgQVVzIGluIHRoZSBxdWV1ZSBub3csIGV2ZW4gaWYgdGhleSBhcmUgYm90aCBFT1MuCi0gIERDSEVDS19HRShuZXh0X2F1ZGlvX2F1c18uc2l6ZSgpLCAyKTsKLQotICAvLyBFeHRyYWN0IGZpcnN0IEFVIGluIHF1ZXVlCi0gIHNjb3BlZF9yZWZwdHI8U2hlbGxBVT4gYXUobmV4dF9hdWRpb19hdXNfLmZyb250KCkpOwotICBuZXh0X2F1ZGlvX2F1c18ucG9wX2Zyb250KCk7Ci0gIC8vIE5leHQgdGltZXN0YW1wIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gb3VycywgaWYgbm90IHNvbWV0aGluZyBpcyB2ZXJ5IGZ1bm55Ci0gIC8vIHdpdGggdGhpcyBGTFYgYW5kIHdlIHdvbid0IGJlIGFibGUgdG8gY2FsY3VsYXRlIGR1cmF0aW9uLgotICBpZiAobmV4dF9hdWRpb19hdXNfLmZyb250KCktPkdldFRpbWVzdGFtcCgpID49IGF1LT5HZXRUaW1lc3RhbXAoKSkgewotICAgIGF1LT5TZXREdXJhdGlvbihuZXh0X2F1ZGlvX2F1c18uZnJvbnQoKS0+R2V0VGltZXN0YW1wKCkgLQotICAgICAgICAgICAgICAgICAgICBhdS0+R2V0VGltZXN0YW1wKCkpOwotICB9IGVsc2UgewotICAgIERMT0coRVJST1IpIDw8ICJvdXQgb2Ygb3JkZXIgYXVkaW8gdGltZXN0YW1wcyBlbmNvdW50ZXJlZCBvbiBGTFYgcGFyc2luZy4iOwotICB9Ci0gIHJldHVybiBhdTsKLX0KLQotc2NvcGVkX3JlZnB0cjxTaGVsbEFVPiBTaGVsbEZMVlBhcnNlcjo6R2V0TmV4dFZpZGVvQVUoKSB7Ci0gIHdoaWxlIChuZXh0X3ZpZGVvX2F1c18uZW1wdHkoKSkgewotICAgIGlmICghUGFyc2VOZXh0VGFnKCkpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgfQotICAvLyBleHRyYWN0IG5leHQgdmlkZW8gQVUKLSAgc2NvcGVkX3JlZnB0cjxTaGVsbEFVPiBhdShuZXh0X3ZpZGVvX2F1c18uZnJvbnQoKSk7Ci0gIG5leHRfdmlkZW9fYXVzXy5wb3BfZnJvbnQoKTsKLQotICByZXR1cm4gYXU7Ci19Ci0KLS8vCi0vLyBieXRlIGxheW91dCBvZiBhbiBGTFZUQUcgaXM6Ci0vLyBmaWVsZCAgICAgICAgICAgICB8IHR5cGUgICB8IGNvbW1lbnQKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0KLS8vIHByZXZpb3VzIHRhZyBzaXplIHwgdWludDMyIHwgd2Ugc2tpcCBwYXN0IHRoZXNlIHdoZW4gcGFyc2luZyBsYXN0IHRhZwotLy8gdGFnIHR5cGUgICAgICAgICAgfCB1aW50OCAgfCBwYXJzaW5nIHN0YXJ0cyBoZXJlLiBkZXNjcmliZXMgdGFnIHR5cGUKLS8vIHRhZyBkYXRhIHNpemUgICAgIHwgdWludDI0IHwgc2l6ZSBvZiB0YWcgZGF0YSBwYXlsb2FkIChldmVyeXRoaW5nIGFmdGVyIHRoaXMpCi0vLyB0aW1lc3RhbXAgICAgICAgICB8IHVpbnQyNCB8IGxvd2VyIDI0IGJpdHMgb2YgdGltZXN0YW1wIGluIG1pbGxpc2Vjb25kcwotLy8gdGltZXN0YW1wIGV4dCAgICAgfCB1aW50OCAgfCB1cHBlciA4IGJpdHMgb2YgdGltZXN0YW1wIGluIG1pbGxpc2Vjb25kcwotLy8gc3RyZWFtIGlkICAgICAgICAgfCB1aW50MjQgfCBhbHdheXMgMAotLy8KLWJvb2wgU2hlbGxGTFZQYXJzZXI6OlBhcnNlTmV4dFRhZygpIHsKLSAgdWludDggdGFnX2J1ZmZlcltrVGFnRG93bmxvYWRTaXplXTsKLQotICBpZiAoYXRfZW5kX29mX2ZpbGVfKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gZ2V0IHByZXZpb3VzIHRhZyBzaXplIGFuZCBoZWFkZXIgZm9yIG5leHQgb25lCi0gIGludCBieXRlc19yZWFkID0KLSAgICAgIHJlYWRlcl8tPkJsb2NraW5nUmVhZCh0YWdfb2Zmc2V0Xywga1RhZ0Rvd25sb2FkU2l6ZSwgdGFnX2J1ZmZlcik7Ci0KLSAgLy8gaWYgdGhhdCB3YXMgdGhlIGxhc3QgdGFnIGluIHRoZSBzdHJlYW0gZGV0ZWN0IHRoZSBFT1MgYW5kIHJldHVybi4gVGhpcwotICAvLyBpcyB3aGVyZSBub3JtYWwgdGVybWluYXRpb24gb2YgYW4gRkxWIHN0cmVhbSB3aWxsIG9jY3VyLgotICBpZiAoYnl0ZXNfcmVhZCA8IGtUYWdEb3dubG9hZFNpemUpIHsKLSAgICBhdF9lbmRfb2ZfZmlsZV8gPSB0cnVlOwotICAgIC8vIE5vcm1hbCB0ZXJtaW5hdGlvbiBvZiBhbiBGTFYuIEVucXVldWUgRU9TIEFVcyBpbiBib3RoIHN0cmVhbXMuCi0gICAgbmV4dF92aWRlb19hdXNfLnB1c2hfYmFjayhTaGVsbEFVOjpDcmVhdGVFbmRPZlN0cmVhbUFVKAotICAgICAgICBEZW11eGVyU3RyZWFtOjpWSURFTywgdmlkZW9fdHJhY2tfZHVyYXRpb25fKSk7Ci0gICAgbmV4dF9hdWRpb19hdXNfLnB1c2hfYmFjayhTaGVsbEFVOjpDcmVhdGVFbmRPZlN0cmVhbUFVKAotICAgICAgICBEZW11eGVyU3RyZWFtOjpBVURJTywgYXVkaW9fdHJhY2tfZHVyYXRpb25fKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvLyBleHRyYWN0IHRoZSB0YWcgZGF0YSBzaXplIGZyb20gdGhlIHRhZyBoZWFkZXIgYXMgdWludDI0Ci0gIC8vIHRoaXMgaXMgc2l6ZSBvZiBhdHRhY2hlZCBkYXRhIGZpZWxkIG9ubHkgbm90IGluY2x1ZGluZyB0aGlzIGhlYWRlcgotICAvLyBidXQgaW5jbHVkaW5nIHRoZSBhdWRpbyBhbmQgdmlkZW8gc3ViLWhlYWRlcnMKLSAgdWludDMyIHRhZ19kYXRhX3NpemUgPQotICAgICAgZW5kaWFuX3V0aWw6OmxvYWRfdWludDMyX2JpZ19lbmRpYW4odGFnX2J1ZmZlciArIDEpID4+IDg7Ci0KLSAgLy8gZXh0cmFjdCB0aW1lc3RhbXAsIHdvbmt5IGJ5dGUgb3JkZXIgY29tZXMgZnJvbSB0aGUgc3RhbmRhcmQKLSAgaW50MzIgdGltZXN0YW1wID0gdGFnX2J1ZmZlcls0XSA8PCAxNiB8IHRhZ19idWZmZXJbNV0gPDwgOCB8IHRhZ19idWZmZXJbNl0gfAotICAgICAgICAgICAgICAgICAgICB0YWdfYnVmZmVyWzddIDw8IDI0OwotCi0gIC8vIGNob29zZSB3aGljaCB0YWcgdHlwZSB0byBwYXJzZQotICBib29sIHBhcnNlX3Jlc3VsdCA9IHRydWU7Ci0gIHVpbnQ4KiB0YWdfYm9keSA9IHRhZ19idWZmZXIgKyBrVGFnU2l6ZTsKLSAgc3dpdGNoICh0YWdfYnVmZmVyWzBdKSB7Ci0gICAgY2FzZSBrQXVkaW9UYWdUeXBlOgotICAgICAgcGFyc2VfcmVzdWx0ID0gUGFyc2VBdWRpb0RhdGFUYWcodGFnX2JvZHksIHRhZ19kYXRhX3NpemUsIHRpbWVzdGFtcCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2Uga1ZpZGVvVGFnVHlwZToKLSAgICAgIHBhcnNlX3Jlc3VsdCA9IFBhcnNlVmlkZW9EYXRhVGFnKHRhZ19ib2R5LCB0YWdfZGF0YV9zaXplLCB0aW1lc3RhbXApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGtTY3JpcHREYXRhT2JqZWN0VGFnVHlwZToKLSAgICAgIHBhcnNlX3Jlc3VsdCA9Ci0gICAgICAgICAgUGFyc2VTY3JpcHREYXRhT2JqZWN0VGFnKHRhZ19ib2R5LCB0YWdfZGF0YV9zaXplLCB0aW1lc3RhbXApOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgRExPRyhXQVJOSU5HKSA8PCBiYXNlOjpTdHJpbmdQcmludGYoInVuc3VwcG9ydGVkIEZMViBUYWdUeXBlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ19idWZmZXJbMF0pOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICAvLyBhZHZhbmNlIHJlYWQgcG9pbnRlciB0byBuZXh0IHRhZyBoZWFkZXIKLSAgdGFnX29mZnNldF8gKz0ga1RhZ1NpemUgKyB0YWdfZGF0YV9zaXplICsgNDsKLSAgcmV0dXJuIHBhcnNlX3Jlc3VsdDsKLX0KLQotLy8gRkxWIEFVRElPREFUQSB0YWdzIGFyZSBwYWNrZWQgaW50byBhIHNpbmdsZSBieXRlLCBiaXQgbGF5b3V0IGlzOgotLy8gICAgYWFhYWJiY2QKLS8vIGFhYWE6IDQgYml0cyBmb3JtYXQgZW51bSwgQUFDIGlzIDEwIGRlY2ltYWwKLS8vIGJiOiAyIGJpdHMgc2FtcGxlIHJhdGUgZW51bSwgQUFDIGlzIGFsd2F5cyAzIGRlY2ltYWwgKDQ0IEtIeikKLS8vIGM6ICAxIGJpdCBzb3VuZCBzaXplLCAwIG1lYW5zIDggYml0LCAxIG1lYW5zIDE2IGJpdCwgQUFDIGlzIGFsd2F5cyAxCi0vLyBkOiAgMSBiaXQgc291bmQgdHlwZSwgMCBtZWFucyBtb25vLCAxIG1lYW5zIHN0ZXJlbywgQUFDIGlzIGFsd2F5cyAxCi0vLyBpZiB0aGlzIGlzIGFuIEFBQ0FVRElPREFUQSB0YWcgdGhlIG5leHQgYnl0ZSBpbiB0aGUgc2VxdWVuY2UgMCBpZgotLy8gdGhpcyBpcyBhbiBBdWRpb1NwZWNpZmljQ29uZmlnIHRhZyBvciAxIGlmIGl0IGlzIHJhdyBBQUMgZnJhbWUgZGF0YS4KLS8vCi0vLyAqIE5PVEUgdGhhdCBGTFYgc3RhbmRhcmQgZGVmaW5lcyBmaXhlZCB2YWx1ZXMgZm9yIHNhbXBsZSByYXRlLCBiaXQKLS8vIHdpZHRoLCBhbmQgY2hhbm5lbCBjb3VudCBmb3IgQUFDIHNhbXBsZXMgYnV0IHRoZSBBdWRpb1NwZWNpZmljQ29uZmlnIG1heQotLy8gZGVmaW5lIHRob3NlIHZhbHVlcyBkaWZmZXJlbnRseSBhbmQgaXMgYXV0aG9yaXRhdGl2ZSwgc28gd2UgaWdub3JlIHRoZQotLy8gRkxWLXByb3ZpZGVkIGNvbmZpZyB2YWx1ZXMuCi1ib29sIFNoZWxsRkxWUGFyc2VyOjpQYXJzZUF1ZGlvRGF0YVRhZyh1aW50OCogdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgdGltZXN0YW1wKSB7Ci0gIC8vIFNtYWxsZXN0IG1lYW5pbmdmdWwgc2l6ZSBmb3IgYW4gYXVkaW8gZGF0YSB0YWcgaXMgNCBieXRlcywgb25lIGZvciB0aGUKLSAgLy8gQVVESU9EQVRBIHRhZywgb25lIGZvciB0aGUgQUFDQVVESU9EQVRBIHRhZy4gYW5kIG1pbmltdW0gMiBieXRlcyBvZiBkYXRhLgotICBpZiAoc2l6ZSA8IGtBdWRpb1RhZ1NpemUgKyAyKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIHdlIG9ubHkgc3VwcG9ydCBwYXJzaW5nIEFBQyBhdWRpbyBkYXRhIHRhZ3MKLSAgaWYgKCgodGFnWzBdID4+IDQpICYgMHgwZikgIT0ga1NvdW5kRm9ybWF0VHlwZUFBQykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBub3cgc2VlIGlmIHRoaXMgaXMgYSBjb25maWcgcGFja2V0IG9yIGEgZGF0YSBwYWNrZXQKLSAgaWYgKHRhZ1sxXSA9PSBrQUFDUGFja2V0VHlwZVNlcXVlbmNlKSB7ICAvLyBhdWRpbyBjb25maWcgaW5mbwotICAgIC8vIEF1ZGlvU3BlY2lmaWNDb25maWcgcmVjb3JkcyBjYW4gYmUgbG9uZ2VyIHRoYW4gdHdvIGJ5dGVzIGJ1dCB3ZSBleHRyYWN0Ci0gICAgLy8gZXZlcnl0aGluZyB3ZSBuZWVkIGZyb20gdGhlIGZpcnN0IHR3byBieXRlcywgcG9zaXRpb25lZCBoZXJlIGF0IGluZGV4IDIKLSAgICAvLyBhbmQgMyBpbiB0aGUgdGFnIGJ1ZmZlcgotICAgIFBhcnNlQXVkaW9TcGVjaWZpY0NvbmZpZyh0YWdbMl0sIHRhZ1szXSk7Ci0gIH0gZWxzZSBpZiAodGFnWzFdID09IGtBQUNQYWNrZXRUeXBlUmF3KSB7ICAvLyByYXcgQUFDIGF1ZGlvCi0gICAgLy8gdGhpcyBpcyBhdWRpbyBkYXRhLCBjaGVjayB0aW1lc3RhbXAKLSAgICBiYXNlOjpUaW1lRGVsdGEgdHMgPSBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHModGltZXN0YW1wKTsKLSAgICBpZiAodHMgPiBhdWRpb190cmFja19kdXJhdGlvbl8pIHsKLSAgICAgIGF1ZGlvX3RyYWNrX2R1cmF0aW9uXyA9IHRzOwotICAgIH0KLSAgICAvLyBidWlsZCB0aGUgQVUKLSAgICBzaXplX3QgcHJlcGVuZF9zaXplID0gQ2FsY3VsYXRlUHJlcGVuZFNpemUoRGVtdXhlclN0cmVhbTo6QVVESU8sIHRydWUpOwotICAgIHNjb3BlZF9yZWZwdHI8U2hlbGxBVT4gYXUgPSBTaGVsbEFVOjpDcmVhdGVBdWRpb0FVKAotICAgICAgICB0YWdfb2Zmc2V0XyArIGtUYWdTaXplICsga0F1ZGlvVGFnU2l6ZSwgc2l6ZSAtIGtBdWRpb1RhZ1NpemUsCi0gICAgICAgIHByZXBlbmRfc2l6ZSwgdHJ1ZSwgdHMsIGtJbmZpbml0ZUR1cmF0aW9uKCksIHRoaXMpOwotICAgIG5leHRfYXVkaW9fYXVzXy5wdXNoX2JhY2soYXUpOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIEZMViBWSURFT0RBVEEgdGFncyBhcmUgcGFja2VkIGludG8gYSBzaW5nbGUgYnl0ZSwgYml0IGxheW91dCBpczoKLS8vIGFhYWFiYmJiCi0vLyBhYWFhOiA0IGJpdHMgZnJhbWUgdHlwZSBlbnVtLCAxIGlzIEFWQyBrZXlmcmFtZSwgMiBpcyBBVkMgaW50ZXItZnJhbWUKLS8vIGJiYmI6IDQgYml0cyBjb2RlY0lELCA3IGlzIEFWQwotLy8gaWYgdGhpcyBpcyBhbiBBVkNWSURFT1BBQ0tFVCB0YWcgdGhlIG5leHQgNCBieXRlcyBjb21wcmlzZSB0aGUgQVZDVklERU9QQUNLRVQKLS8vIHRhZyBoZWFkZXI6Ci0vLyBmaWVsZCAgICAgICAgICAgICB8IHR5cGUgICB8IGNvbW1lbnQKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0KLS8vIEFWQ1BhY2tldFR5cGUgICAgIHwgdWludDggIHwgMCBpcyBjb25maWcsIDEgaXMgZGF0YSwgMiBpcyBFT1MgKGlnbm9yZWQpCi0vLyBDb21wb3NpdGlvblRpbWUgICB8IGludDI0ICB8IHNpZ25lZCB0aW1lIG9mZnNldCwgYWRkIHRvIEZMViB0aW1lc3RhbXAgZm9yIHB0cwotLy8KLS8vIE5PVEUgdGhhdCBGTFYgdmlkZW8gZGF0YSBpcyBhbHdheXMgcHJlc2VudGVkIGluIGRlY29kZSBvcmRlciBhbmQKLS8vIENvbXBvc2l0aW9uVGltZSBpcyBub3QgZW50aXJlbHkgcmVsaWFibGUgZm9yIGRldGVybWluaW5nIHB0cywgYXMgc29tZQotLy8gZW5jb2RlcnMgYWx3YXlzIHNldCBpdCB0byB6ZXJvLgotYm9vbCBTaGVsbEZMVlBhcnNlcjo6UGFyc2VWaWRlb0RhdGFUYWcodWludDgqIHRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHRpbWVzdGFtcCkgewotICAvLyBuZWVkIGF0IGxlYXN0IDUgYnl0ZXMgb2YgdGFnIGRhdGEsIG9uZSBmb3IgdGhlIFZJREVPREFUQSB0YWcgYW5kIDQgZm9yCi0gIC8vIHRoZSBBVkNWSURFT0RBVEEgdGFnIHRoYXQgc2hvdWxkIGFsd2F5cyBmb2xsb3cgaXQKLSAgaWYgKHNpemUgPCBrVmlkZW9UYWdTaXplKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIGNoZWNrIGZvciBBVkMgZm9ybWF0Ci0gIGlmICgodGFnWzBdICYgMHgwZikgIT0ga0NvZGVjSURBVkMpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gZGV0ZXJtaW5lIHBhY2tldCB0eXBlCi0gIGlmICh0YWdbMV0gPT0ga0FWQ1BhY2tldFR5cGVTZXF1ZW5jZUhlYWRlcikgeyAgLy8gdmlkZW8gY29uZmlnIGluZm8KLSAgICAvLyBBVkMgY29uZmlnIHJlY29yZCwgZG93bmxvYWQgYW5kIHBhcnNlCi0gICAgcmV0dXJuIERvd25sb2FkQW5kUGFyc2VBVkNDb25maWdSZWNvcmQoCi0gICAgICAgIHRhZ19vZmZzZXRfICsga1RhZ1NpemUgKyBrVmlkZW9UYWdTaXplLCBzaXplKTsKLSAgfSBlbHNlIGlmICh0YWdbMV0gPT0ga0FWQ1BhY2tldFR5cGVOQUxVKSB7ICAvLyByYXcgQVZDIGRhdGEKLSAgICAvLyBzaG91bGQgd2UgYWRkIHRoaXMgdG8gb3VyIGtleWZyYW1lIG1hcD8KLSAgICBib29sIGlzX2tleWZyYW1lID0gKHRhZ1swXSAmIDB4ZjApID09IDB4MTA7Ci0gICAgLy8gVE9ETzogd2hlbiB3ZSBhZGQgc3VwcG9ydCBmb3Igc2Vla2luZywgbWFrZSBzdXJlIHRoZXNlIG51bWJlcnMgYXJlCi0gICAgLy8gY29uc2lzdGVudCB3aXRoIHRoZSBudW1iZXJzIHByb3ZpZGVkIGJ5IHRoZSB0aW1lLXRvLWJ5dGUgbWFuaWZlc3QuCi0gICAgaWYgKGlzX2tleWZyYW1lKSB7Ci0gICAgICB0aW1lX3RvX2J5dGVfbWFwX1t0aW1lc3RhbXBdID0gdGFnX29mZnNldF87Ci0gICAgfQotICAgIC8vIGV4dHJhY3QgMjQtYml0IGNvbXBvc2l0aW9uIHRpbWUgb2Zmc2V0IGluIGJpZy1lbmRpYW4gZm9yIHRoaXMgZnJhbWUKLSAgICBpbnQzMiBjb21wb3NpdGlvbl90aW1lX29mZnNldCA9IHRhZ1syXSAqIDY1NTM2ICsgdGFnWzNdICogMjU2ICsgdGFnWzRdOwotICAgIC8vIGNhbGN1bGF0ZSBwdHMgZnJvbSBmbHYgdGltZXN0YW1wIGFuZCBjdHMKLSAgICB1aW50MzIgcHRzID0gdGltZXN0YW1wICsgY29tcG9zaXRpb25fdGltZV9vZmZzZXQ7Ci0gICAgLy8gRkxWIHN0YW5kYXJkIHNheXMgdGhhdCB0aGVyZSBjYW4gYmUgbXVsdGlwbGUgQVZDIE5BTFVzIHBhY2tlZCBoZXJlLCBzbwotICAgIC8vIHdlIGl0ZXJhdGUgdGhyb3VnaCB0aGUgdGFnIGRhdGEgcGF5bG9hZCBhbmQgZW5xdWV1ZSBieXRlIG9mZnNldHMgZm9yCi0gICAgLy8gZWFjaCBOQUxVIHdlIGVuY291bnRlci4gVGhlIE5BTFVzIGFyZSBwYWNrZWQgYnkgc2l6ZSBjb3VudGVyIHRoYXQgaXMKLSAgICAvLyBuYWxfaGVhZGVyX3NpemVfIGJ5dGVzIGxvbmcgZm9sbG93ZWQgYnkgdGhlIE5BTFUgb2YgdGhhdCBzaXplLgotICAgIHVpbnQzMiBhdmNfZGF0YV9zaXplID0gc2l6ZSAtIGtWaWRlb1RhZ1NpemU7Ci0gICAgdWludDMyIGF2Y190YWdfb2Zmc2V0ID0gMDsKLSAgICBiYXNlOjpUaW1lRGVsdGEgdHMgPSBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMocHRzKTsKLSAgICBpZiAodHMgPiB2aWRlb190cmFja19kdXJhdGlvbl8pIHsKLSAgICAgIHZpZGVvX3RyYWNrX2R1cmF0aW9uXyA9IHRzOwotICAgIH0KLQotICAgIHNpemVfdCBwcmVwZW5kX3NpemUgPQotICAgICAgICBDYWxjdWxhdGVQcmVwZW5kU2l6ZShEZW11eGVyU3RyZWFtOjpWSURFTywgaXNfa2V5ZnJhbWUpOwotICAgIHNjb3BlZF9yZWZwdHI8U2hlbGxBVT4gYXUgPSBTaGVsbEFVOjpDcmVhdGVWaWRlb0FVKAotICAgICAgICB0YWdfb2Zmc2V0XyArIGtUYWdTaXplICsga1ZpZGVvVGFnU2l6ZSArIGF2Y190YWdfb2Zmc2V0LCBhdmNfZGF0YV9zaXplLAotICAgICAgICBwcmVwZW5kX3NpemUsIG5hbF9oZWFkZXJfc2l6ZV8sIGlzX2tleWZyYW1lLCB0cywga0luZmluaXRlRHVyYXRpb24oKSwKLSAgICAgICAgdGhpcyk7Ci0gICAgLy8gZW5xdWV1ZSBkYXRhIHRhZwotICAgIG5leHRfdmlkZW9fYXVzXy5wdXNoX2JhY2soYXUpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBGTFYgU0NSSVBUREFUQSB0YWdzIGFyZSBpbiBzZXJpYWxpemVkIHR5cGljYWxseSBpbiBBY3Rpb24gTWVzc2FnZSBGb3JtYXQgMCBhcwotLy8gYSBjb2xsZWN0aW9uIG9mIGtleS92YWx1ZSBwYWlycyB0ZXJtaW5hdGVkIGJ5IGEgc3BlY2lhbCBjb2RlLiBXZSBvbmx5IHdpc2ggdG8KLS8vIHBhcnNlIHRoZSBkdXJhdGlvbiBhbmQgYnl0ZXJhdGUgZnJvbSB0aGUgc2NyaXB0ZGF0YSBzbyB3ZSB1c2UgYSB2ZXJ5IGxpZ2h0Ci0vLyB3ZWlnaHQgcGFyc2VyIGluIEV4dHJhY3RBTUYwTnVtYmVyKCk7Ci1ib29sIFNoZWxsRkxWUGFyc2VyOjpQYXJzZVNjcmlwdERhdGFPYmplY3RUYWcodWludDgqIHRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgdGltZXN0YW1wKSB7Ci0gIHNjb3BlZF9yZWZwdHI8U2hlbGxTY29wZWRBcnJheT4gc2NyaXB0X2J1ZmZlciA9Ci0gICAgICBTaGVsbEJ1ZmZlckZhY3Rvcnk6Okluc3RhbmNlKCktPkFsbG9jYXRlQXJyYXkoc2l6ZSk7Ci0gIGlmICghc2NyaXB0X2J1ZmZlciB8fCAhc2NyaXB0X2J1ZmZlci0+R2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaW50IGJ5dGVzX3JlYWQgPQotICAgICAgcmVhZGVyXy0+QmxvY2tpbmdSZWFkKHRhZ19vZmZzZXRfICsga1RhZ1NpemUsIHNpemUsIHNjcmlwdF9idWZmZXItPkdldCgpKTsKLSAgRENIRUNLX0xFKHNpemUsIHN0YXRpY19jYXN0PHVpbnQzMj4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMj46Om1heCgpKSk7Ci0gIGlmIChieXRlc19yZWFkIDwgc3RhdGljX2Nhc3Q8aW50PihzaXplKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBBdHRlbXB0IHRvIGV4dHJhY3QgdGhlIGR1cmF0aW9uIGZyb20gdGhlIEZMViBtZXRhZGF0YS4KLSAgZG91YmxlIGR1cmF0aW9uX3NlY29uZHMgPSAwOwotICBpZiAoIUV4dHJhY3RBTUYwTnVtYmVyKHNjcmlwdF9idWZmZXIsICJkdXJhdGlvbiIsICZkdXJhdGlvbl9zZWNvbmRzKSkgewotICAgIC8vIG1pZ2h0IGJlIHdvcnRoIHRyeWluZyB0byBwYXJzZSB0aGlzIGFzIEFNRjM/Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGR1cmF0aW9uXyA9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pY3Jvc2Vjb25kcygKLSAgICAgIGR1cmF0aW9uX3NlY29uZHMgKiBiYXNlOjpUaW1lOjprTWljcm9zZWNvbmRzUGVyU2Vjb25kKTsKLQotICAvLyBUcnkgZm9yIHRoZSBieXRlcmF0ZSB0b28sIGJ1dCB0aGlzIGlzIG5vbmZhdGFsIGlmIHdlIGNhbid0IGdldCBpdC4KLSAgZG91YmxlIGJ5dGVyYXRlID0gMDsKLSAgaWYgKEV4dHJhY3RBTUYwTnVtYmVyKHNjcmlwdF9idWZmZXIsICJ0b3RhbGRhdGFyYXRlIiwgJmJ5dGVyYXRlKSkgewotICAgIGJpdHNfcGVyX3NlY29uZF8gPSAodWludDMyKShieXRlcmF0ZSAqIDguMCk7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gVGhlIFNDUklQVERBVEEgdGFnIGNvbnRhaW5zIGEgbGlzdCBvZiBvcmRlcmVkIHBhaXJzIG9mIEFNRjAgc3RyaW5ncyBmb2xsb3dlZAotLy8gYnkgYW4gYXJiaXRyYXJ5IEFNRjAgb2JqZWN0LiBUeXBpY2FsbHkgdGhlcmUncyBvbmUgb2JqZWN0IG9mIGludGVyZXN0IHdpdGgKLS8vIHN0cmluZyBuYW1lICdvbk1ldGFEYXRhJyBmb2xsb3dlZCBieSBhbiBhbm9ueW1vdXMgb2JqZWN0LiBJbiBhbnkgZXZlbnQgd2UKLS8vIHdpbGwgc2NhbiB0aGUgYnVmZmVyIGxvb2tpbmcgb25seSBmb3IgdGhlIHByb3ZpZGVkIHN0cmluZywgdmVyaWZ5IHRoZSBuZXh0Ci0vLyBieXRlcyBpbiB0aGUgc3RyZWFtIGRlc2NyaWJlIGFuIEFNRjAgbnVtYmVyLCBleHRyYWN0IGFuZCByZXR1cm4gaXQuCi0vLyBUT0RPOiBSZXBsYWNlIHRoaXMgKGJyaXR0bGUpIGNvZGUgd2l0aCBhIHByb3BlciBBTUYwIHBhcnNlci4KLWJvb2wgU2hlbGxGTFZQYXJzZXI6OkV4dHJhY3RBTUYwTnVtYmVyKHNjb3BlZF9yZWZwdHI8U2hlbGxTY29wZWRBcnJheT4gYW1mMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIG51bWJlcl9vdXQpIHsKLSAgRENIRUNLKG51bWJlcl9vdXQpOwotICAvLyB0aGUgc3RyaW5nIHdpbGwgYmUgcHJvY2VlZGVkIGJ5IGEgdTE2IGJpZy1lbmRpYW4gc3RyaW5nIGxlbmd0aAotICB1aW50MTYgbmFtZV9sZW5ndGggPSBzdHJsZW4obmFtZSk7Ci0gIC8vIHRoZXJlJ3MgbG90cyBvZiBub25wcmludGluZyBjaGFyYWN0ZXJzIGFuZCB6ZXJvcyBpbiBhbWYwLCBzbyB3ZSdsbCBuZWVkCi0gIC8vIHRvIHNlYXJjaCBmb3IgdGhlIHN0cmluZyB1c2luZyBvdXIgb3duIG1ldGhvZAotICBpbnQgbWF0Y2hfb2Zmc2V0ID0gMDsKLSAgaW50IG5hbWVfb2Zmc2V0ID0gMDsKLSAgLy8gdGhlIGxhc3QgaW5kZXggaW4gdGhlIGJ1ZmZlciB3ZSBjb3VsZCBleHRyYWN0IGEgc3RyaW5nIGZvbGxvd2VkIGJ5IE51bWJlcgotICBpbnQgc2VhcmNoX2xlbmd0aCA9IGFtZjAtPlNpemUoKSAtIChuYW1lX2xlbmd0aCArIGtBTUYwTnVtYmVyTGVuZ3RoKTsKLSAgdWludDgqIHNlYXJjaF9idWZmZXIgPSBhbWYwLT5HZXQoKTsKLSAgd2hpbGUgKG1hdGNoX29mZnNldCA8PSBzZWFyY2hfbGVuZ3RoICYmIG5hbWVfb2Zmc2V0IDwgbmFtZV9sZW5ndGgpIHsKLSAgICBpZiAoc2VhcmNoX2J1ZmZlclttYXRjaF9vZmZzZXRdID09IG5hbWVbbmFtZV9vZmZzZXRdKSB7Ci0gICAgICBuYW1lX29mZnNldCsrOyAgLy8gYWR2YW5jZSBvdXIgc3Vic3RyaW5nIHBvaW50ZXIgaW4gdGhlIGV2ZW50IG9mIGEgbWF0Y2gKLSAgICB9IGVsc2UgewotICAgICAgbmFtZV9vZmZzZXQgPSAwOyAgLy8gcmVzZXQgb3VyIHN1YnN0cmluZyBwb2ludGVyIG9uIGEgbWlzcwotICAgIH0KLSAgICBtYXRjaF9vZmZzZXQrKzsgIC8vIGFsd2F5cyBhZHZhbmNlIG91ciBsYXJnZXIgc3RyaW5nIHBvaW50ZXIKLSAgfQotICAvLyBJZiB3ZSBnb3QgYSBtYXRjaCBuYW1lX29mZnNldCB3aWxsIGJlIHBvaW50aW5nIHBhc3QgdGhlIGVuZCBvZiB0aGUgc2VhcmNoCi0gIC8vIHN0cmluZyBhbmQgbWF0Y2hfb2Zmc2V0IHdpbGwgYmUgcG9pbnRpbmcgdG8gdmFsaWQgbWVtb3J5IHdpdGggcm9vbSB0bwotICAvLyBleHRyYWN0IGEgTnVtYmVyCi0gIGlmICgobmFtZV9vZmZzZXQgPT0gbmFtZV9sZW5ndGgpICYmCi0gICAgICAobWF0Y2hfb2Zmc2V0IDw9IGFtZjAtPlNpemUoKSAtIGtBTUYwTnVtYmVyTGVuZ3RoKSkgewotICAgIC8vIG1ha2Ugc3VyZSB0aGUgZmlyc3QgYnl0ZSBtYXRjaGVzIHRoZSBudW1iZXIgdHlwZSBjb2RlCi0gICAgaWYgKHNlYXJjaF9idWZmZXJbbWF0Y2hfb2Zmc2V0XSAhPSBrQU1GME51bWJlclR5cGUpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgLy8gYWR2YW5jZSBwb2ludGVyIHBhc3QgdGhlIG51bWJlciB0eXBlIHRvIHRoZSBudW1iZXIgaXRzZWxmCi0gICAgbWF0Y2hfb2Zmc2V0Kys7Ci0gICAgLy8gbG9hZCBiaWctZW5kaWFuIGRvdWJsZSBhcyB1aW50LCB0aGVuIGNhc3QgdG8gY29ycmVjdCB0eXBlCi0gICAgdWludDY0IG51bV9hc191aW50ID0KLSAgICAgICAgZW5kaWFuX3V0aWw6OmxvYWRfdWludDY0X2JpZ19lbmRpYW4oc2VhcmNoX2J1ZmZlciArIG1hdGNoX29mZnNldCk7Ci0gICAgKm51bWJlcl9vdXQgPSAqKChkb3VibGUqKSgmbnVtX2FzX3VpbnQpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgU2hlbGxGTFZQYXJzZXI6Okp1bXBQYXJzZXJUbyh1aW50NjQgYnl0ZV9vZmZzZXQpIHsKLSAgbmV4dF92aWRlb19hdXNfLmNsZWFyKCk7Ci0gIG5leHRfYXVkaW9fYXVzXy5jbGVhcigpOwotICBhdF9lbmRfb2ZfZmlsZV8gPSBmYWxzZTsKLSAgdGFnX29mZnNldF8gPSBieXRlX29mZnNldDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9mbHZfcGFyc2VyLmggYi9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9mbHZfcGFyc2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNTEyYzAuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfZmx2X3BhcnNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9GSUxURVJTX1NIRUxMX0ZMVl9QQVJTRVJfSF8KLSNkZWZpbmUgTUVESUFfRklMVEVSU19TSEVMTF9GTFZfUEFSU0VSX0hfCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8bGlzdD4KLQotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2hlbGxfYnVmZmVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL3NoZWxsX2F2Y19wYXJzZXIuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgU2hlbGxGTFZQYXJzZXIgOiBwdWJsaWMgU2hlbGxBVkNQYXJzZXIgewotIHB1YmxpYzoKLSAgLy8gQXR0ZW1wdHMgdG8gbWFrZSBzZW5zZSBvZiB0aGUgcHJvdmlkZWQgYnl0ZXMgb2YgdGhlIHRvcCBvZiBhIGZpbGUgYXMgYW4KLSAgLy8gZmx2LCBhbmQgaWYgaXQgZG9lcyBtYWtlIHNlbnNlIHJldHVybnMgUElQRUxJTkVfT0sgYW5kIHwqcGFyc2VyfCBjb250YWlucyBhCi0gIC8vIFNoZWxsRkxWUGFyc2VyIGluaXRpYWxpemVkIHdpdGggc29tZSBiYXNpYyBzdGF0ZS4gIElmIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZQotICAvLyB0aGlzIHJldHVybnMgYW4gZXJyb3Igc3RhdHVzIGFuZCB8KnBhcnNlcnwgY29udGFpbnMgTlVMTC4KLSAgc3RhdGljIFBpcGVsaW5lU3RhdHVzIENvbnN0cnVjdChzY29wZWRfcmVmcHRyPFNoZWxsRGF0YVNvdXJjZVJlYWRlcj4gcmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBjb25zdHJ1Y3Rpb25faGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9yZWZwdHI8U2hlbGxQYXJzZXI+KiBwYXJzZXIpOwotICBTaGVsbEZMVlBhcnNlcihzY29wZWRfcmVmcHRyPFNoZWxsRGF0YVNvdXJjZVJlYWRlcj4gcmVhZGVyLAotICAgICAgICAgICAgICAgICB1aW50MzIgdGFnX3N0YXJ0X29mZnNldCk7Ci0gIHZpcnR1YWwgflNoZWxsRkxWUGFyc2VyKCk7Ci0KLSAgLy8gPT09IFNoZWxsUGFyc2VyIEltcGxlbWVudGF0aW9uCi0gIHZpcnR1YWwgYm9vbCBQYXJzZUNvbmZpZygpIE9WRVJSSURFOwotICB2aXJ0dWFsIHNjb3BlZF9yZWZwdHI8U2hlbGxBVT4gR2V0TmV4dEFVKERlbXV4ZXJTdHJlYW06OlR5cGUgdHlwZSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgYm9vbCBTZWVrVG8oYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCkgT1ZFUlJJREU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHNjb3BlZF9yZWZwdHI8U2hlbGxBVT4gR2V0TmV4dEF1ZGlvQVUoKTsKLSAgc2NvcGVkX3JlZnB0cjxTaGVsbEFVPiBHZXROZXh0VmlkZW9BVSgpOwotCi0gIC8vIEFkdmFuY2UgYnkgb25lIHRhZyB0aHJvdWdoIHRoZSBGTFYuIElmIGVuY291bnRlcmluZyBhIGtleWZyYW1lLCB1cGRhdGUgdGhlCi0gIC8vIHRpbWUtdG8tYnl0ZSBtYXAuIElmIGEgcmVndWxhciB2aWRlbyBvciBhdWRpbyBkYXRhIHRhZywgdXBkYXRlIHRoZSBuZXh0IHRhZwotICAvLyBzdHJ1Y3R1cmVzLiBPdGhlcndpc2UgaXQgd2lsbCBkb3dubG9hZCBhbmQgcGFyc2UgdGhlIHRhZyBhcyBpdCBtdXN0IGNvbnRhaW4KLSAgLy8gdmlkZW8gbWV0YWRhdGEuIFJldHVybnMgZmFsc2Ugb24gZmF0YWwgZXJyb3IuIFdpbGwgY2FsbCBvbmUgb2YgdGhlIFBhcnNlCi0gIC8vIGhlbHBlciBtZXRob2RzIGRlZmluZWQgYmVsb3cuCi0gIGJvb2wgUGFyc2VOZXh0VGFnKCk7Ci0gIGJvb2wgUGFyc2VBdWRpb0RhdGFUYWcodWludDgqIHRhZywgdWludDMyIHNpemUsIHVpbnQzMiB0aW1lc3RhbXApOwotICBib29sIFBhcnNlVmlkZW9EYXRhVGFnKHVpbnQ4KiB0YWcsIHVpbnQzMiBzaXplLCB1aW50MzIgdGltZXN0YW1wKTsKLSAgYm9vbCBQYXJzZVNjcmlwdERhdGFPYmplY3RUYWcodWludDgqIHRhZywgdWludDMyIHNpemUsIHVpbnQzMiB0aW1lc3RhbXApOwotCi0gIC8vIFNDUklQVERBVEFPQkpFQ1QgcGFyc2luZwotICBib29sIEV4dHJhY3RBTUYwTnVtYmVyKHNjb3BlZF9yZWZwdHI8U2hlbGxTY29wZWRBcnJheT4gYW1mMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogbnVtYmVyX291dCk7Ci0KLSAgLy8gZmx1c2ggaW50ZXJuYWwgcGFyc2luZyBzdGF0ZSBhbmQgbW92ZSB0YWdfb2Zmc2V0XyB0byB0aGUgcHJvdmlkZWQgYXJndW1lbnQuCi0gIHZvaWQgSnVtcFBhcnNlclRvKHVpbnQ2NCBieXRlX29mZnNldCk7Ci0KLSAgLy8gVGhlIGJ5dGUgcG9zaXRpb24gaW4gdGhlIHN0cmVhbSBvZiB0aGUgdGFnIHBhcnNlci4gQmV0d2VlbiBjYWxscyB0bwotICAvLyBQYXJzZU5leHRUYWcoKSBzaG91bGQgcG9pbnQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IEZMViB0YWcgaW4gdGhlIGZpbGUuCi0gIHVpbnQ2NCB0YWdfb2Zmc2V0XzsKLQotICAvLyBTdG9yZXMgYSBtYXAgb2YgdmlkZW8ga2V5ZnJhbWUgdGltZXMgdG8gYnl0ZSBvZmZzZXRzIGluIHRoZSBGTFYgZmlsZS4gQXQKLSAgLy8gcGVhayBrZXlmcmFtZSByYXRlcyBvZiAxIHBlciBzZWNvbmQgb2YgdmlkZW8sIGFuZCAxNiBieXRlcyBwZXIgZW50cnkKLSAgLy8gdGhpcyBtYXAgd2lsbCBjb25zdW1lIGFwcHJveGltYXRlbHkgMSBNQiBvZiBtZW1vcnkgZm9yIDE4IGhvdXJzCi0gIC8vIG9mIHZpZGVvIHdvcnN0LWNhc2UuIFdlIGJ1aWxkIHRoZSBkYXRhIHN0cnVjdHVyZSB3aGlsZSB0cmF2ZXJzaW5nIHRoZQotICAvLyBGTFYgdGFnLXRvLXRhZy4gVGhlIHN0cmVhbSBwb3NpdGlvbnMgcG9pbnQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBGTFYgdGFnCi0gIC8vIGp1c3QgbGlrZSB0aGUgZW50cnkgY29uZGl0aW9ucyBmb3IgdGFnX29mZnNldF8gaW4gUGFyc2VOZXh0VGFnKCkuCi0gIHR5cGVkZWYgc3RkOjptYXA8dWludDMyLCB1aW50NjQ+IFRpbWVUb0J5dGVNYXA7Ci0gIFRpbWVUb0J5dGVNYXAgdGltZV90b19ieXRlX21hcF87Ci0KLSAgLy8gV2UgbWFpbnRhaW4gYSByZWNvcmQgb2YgZGF0YSB0YWdzIHdlIGhhdmUgcGFyc2VkIGhlYWRlcnMgZm9yIGJ1dCBub3QKLSAgLy8gZG93bmxvYWRlZCB0aGUgYWN0dWFsIGJ5dGUgY29udGVudHMgb2YuCi0gIHR5cGVkZWYgc3RkOjpsaXN0PHNjb3BlZF9yZWZwdHI8U2hlbGxBVT4gPiBBVUxpc3Q7Ci0gIEFVTGlzdCBuZXh0X3ZpZGVvX2F1c187Ci0gIEFVTGlzdCBuZXh0X2F1ZGlvX2F1c187Ci0KLSAgLy8gV2hlbiB0cnVlLCBhbGwgc3Vic2VxdWVudCByZWFkcyB0byBQYXJzZU5leHRUYWcoKSB3aWxsIGVucXVldWUgRU9TIEFVcwotICAvLyBpbiBib3RoIGF1ZGlvIGFuZCB2aWRlbyBBVSBxdWV1ZXMuCi0gIGJvb2wgYXRfZW5kX29mX2ZpbGVfOwotCi0gIGJhc2U6OlRpbWVEZWx0YSBhdWRpb190cmFja19kdXJhdGlvbl87Ci0gIGJhc2U6OlRpbWVEZWx0YSB2aWRlb190cmFja19kdXJhdGlvbl87Ci0KLSAgRElTQUxMT1dfSU1QTElDSVRfQ09OU1RSVUNUT1JTKFNoZWxsRkxWUGFyc2VyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0ZJTFRFUlNfU0hFTExfRkxWX1BBUlNFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfbXA0X21hcC5jYyBiL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX21wNF9tYXAuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkOGI4ZDYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfbXA0X21hcC5jYworKysgL2Rldi9udWxsCkBAIC0xLDExNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvc2hlbGxfbXA0X21hcC5oIgotCi0jaW5jbHVkZSAiYmFzZS9zdHJpbmdwcmludGYuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2VuZGlhbl91dGlsLmgiCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9zaGVsbF9tcDRfcGFyc2VyLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vID09PT0gVGFibGVDYWNoZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVNoZWxsTVA0TWFwOjpUYWJsZUNhY2hlOjpUYWJsZUNhY2hlKHVpbnQ2NCB0YWJsZV9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgZW50cnlfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgZW50cnlfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBjYWNoZV9zaXplX2VudHJpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPFNoZWxsRGF0YVNvdXJjZVJlYWRlcj4gcmVhZGVyKQotICAgIDogZW50cnlfc2l6ZV8oZW50cnlfc2l6ZSksCi0gICAgICBlbnRyeV9jb3VudF8oZW50cnlfY291bnQpLAotICAgICAgY2FjaGVfc2l6ZV9lbnRyaWVzXyhjYWNoZV9zaXplX2VudHJpZXMpLAotICAgICAgdGFibGVfb2Zmc2V0Xyh0YWJsZV9vZmZzZXQpLAotICAgICAgcmVhZGVyXyhyZWFkZXIpLAotICAgICAgY2FjaGVfZmlyc3RfZW50cnlfbnVtYmVyXygtMSksCi0gICAgICBjYWNoZV9lbnRyeV9jb3VudF8oMCkge30KLQotdWludDgqIFNoZWxsTVA0TWFwOjpUYWJsZUNhY2hlOjpHZXRCeXRlc0F0RW50cnkodWludDMyIGVudHJ5X251bWJlcikgewotICAvLyBkb24ndCBmZXRjaCB0aGUgdW5mZXRjaGFibGUKLSAgaWYgKGVudHJ5X251bWJlciA+PSBlbnRyeV9jb3VudF8pIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICAvLyB0aGlzIHF1ZXJ5IHdpdGhpbiB2YWxpZCByYW5nZSBmb3IgdGhlIGN1cnJlbnQgY2FjaGUgdGFibGU/Ci0gIGlmIChlbnRyeV9udW1iZXIgPCBjYWNoZV9maXJzdF9lbnRyeV9udW1iZXJfIHx8Ci0gICAgICBlbnRyeV9udW1iZXIgPj0gY2FjaGVfZmlyc3RfZW50cnlfbnVtYmVyXyArIGNhY2hlX2VudHJ5X2NvdW50XykgewotICAgIC8vIENhbGN1bGF0ZSBmaXJzdCBlbnRyeSBpbiB0YWJsZSBrZWVwaW5nIGNhY2hlIHNpemUgYWxpZ25tZW50IGluIHRhYmxlLgotICAgIC8vIEFsd2F5cyBjYWNoZSBvbmUgbW9yZSBlbnRyeSBhcyBpbiBzdHNzIHdlIG5lZWQgdG8gdXNlIHRoZSBmaXJzdCBlbnRyeQotICAgIC8vIG9mIHRoZSBuZXh0IGNhY2hlIHNsb3QgYXMgYW4gdXBwZXIgYm91bmQuCi0gICAgY2FjaGVfZW50cnlfY291bnRfID0gY2FjaGVfc2l6ZV9lbnRyaWVzXyArIDE7Ci0gICAgY2FjaGVfZmlyc3RfZW50cnlfbnVtYmVyXyA9Ci0gICAgICAgIChlbnRyeV9udW1iZXIgLyBjYWNoZV9zaXplX2VudHJpZXNfKSAqIGNhY2hlX3NpemVfZW50cmllc187Ci0gICAgLy8gc2VlIGlmIHdlIGhhdmUgZXhjZWVkZWQgb3VyIHRhYmxlIGJvdW5kcwotICAgIGlmIChjYWNoZV9maXJzdF9lbnRyeV9udW1iZXJfICsgY2FjaGVfZW50cnlfY291bnRfID4gZW50cnlfY291bnRfKSB7Ci0gICAgICBjYWNoZV9lbnRyeV9jb3VudF8gPSBlbnRyeV9jb3VudF8gLSBjYWNoZV9maXJzdF9lbnRyeV9udW1iZXJfOwotICAgIH0KLSAgICAvLyBkcm9wIG9sZCBkYXRhIHRvIGFsbG93IFNoZWxsQnVmZmVyRmFjdG9yeSB0byBkZWZyYWcKLSAgICBjYWNoZV8gPSBOVUxMOwotICAgIGludCBieXRlc190b19yZWFkID0gY2FjaGVfZW50cnlfY291bnRfICogZW50cnlfc2l6ZV87Ci0gICAgY2FjaGVfID0gU2hlbGxCdWZmZXJGYWN0b3J5OjpJbnN0YW5jZSgpLT5BbGxvY2F0ZUFycmF5KGJ5dGVzX3RvX3JlYWQpOwotICAgIGlmICghY2FjaGVfIHx8ICFjYWNoZV8tPkdldCgpKSB7Ci0gICAgICBjYWNoZV9lbnRyeV9jb3VudF8gPSAwOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHVpbnQ2NCBmaWxlX29mZnNldCA9Ci0gICAgICAgIHRhYmxlX29mZnNldF8gKyAoY2FjaGVfZmlyc3RfZW50cnlfbnVtYmVyXyAqIGVudHJ5X3NpemVfKTsKLSAgICBpbnQgYnl0ZXNfcmVhZCA9Ci0gICAgICAgIHJlYWRlcl8tPkJsb2NraW5nUmVhZChmaWxlX29mZnNldCwgYnl0ZXNfdG9fcmVhZCwgY2FjaGVfLT5HZXQoKSk7Ci0gICAgaWYgKGJ5dGVzX3JlYWQgPCBieXRlc190b19yZWFkKSB7Ci0gICAgICBjYWNoZV9lbnRyeV9jb3VudF8gPSAwOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICB9Ci0gIC8vIGNhY2hlIGlzIGFzc3VtZWQgdG8gYmUgdmFsaWQgYW5kIHRvIGNvbnRhaW4gdGhlIGVudHJ5IGZyb20gaGVyZSBvbgotICBEQ0hFQ0soY2FjaGVfLT5HZXQoKSk7Ci0gIERDSEVDS19HRShlbnRyeV9udW1iZXIsIGNhY2hlX2ZpcnN0X2VudHJ5X251bWJlcl8pOwotICBEQ0hFQ0tfTFQoZW50cnlfbnVtYmVyLCBjYWNoZV9maXJzdF9lbnRyeV9udW1iZXJfICsgY2FjaGVfZW50cnlfY291bnRfKTsKLQotICB1aW50MzIgY2FjaGVfb2Zmc2V0ID0gZW50cnlfbnVtYmVyIC0gY2FjaGVfZmlyc3RfZW50cnlfbnVtYmVyXzsKLSAgcmV0dXJuIGNhY2hlXy0+R2V0KCkgKyAoY2FjaGVfb2Zmc2V0ICogZW50cnlfc2l6ZV8pOwotfQotCi1ib29sIFNoZWxsTVA0TWFwOjpUYWJsZUNhY2hlOjpSZWFkVTMyRW50cnkodWludDMyIGVudHJ5X251bWJlciwgdWludDMyKiBlbnRyeSkgewotICBpZiAodWludDgqIGRhdGEgPSBHZXRCeXRlc0F0RW50cnkoZW50cnlfbnVtYmVyKSkgewotICAgICplbnRyeSA9IGVuZGlhbl91dGlsOjpsb2FkX3VpbnQzMl9iaWdfZW5kaWFuKGRhdGEpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIFNoZWxsTVA0TWFwOjpUYWJsZUNhY2hlOjpSZWFkVTMyUGFpckVudHJ5KHVpbnQzMiBlbnRyeV9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiogZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiogc2Vjb25kKSB7Ci0gIGlmICh1aW50OCogZGF0YSA9IEdldEJ5dGVzQXRFbnRyeShlbnRyeV9udW1iZXIpKSB7Ci0gICAgaWYgKGZpcnN0KQotICAgICAgKmZpcnN0ID0gZW5kaWFuX3V0aWw6OmxvYWRfdWludDMyX2JpZ19lbmRpYW4oZGF0YSk7Ci0gICAgaWYgKHNlY29uZCkKLSAgICAgICpzZWNvbmQgPSBlbmRpYW5fdXRpbDo6bG9hZF91aW50MzJfYmlnX2VuZGlhbihkYXRhICsgNCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgU2hlbGxNUDRNYXA6OlRhYmxlQ2FjaGU6OlJlYWRVMzJFbnRyeUludG9VNjQodWludDMyIGVudHJ5X251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0KiBlbnRyeSkgewotICBpZiAodWludDgqIGRhdGEgPSBHZXRCeXRlc0F0RW50cnkoZW50cnlfbnVtYmVyKSkgewotICAgICplbnRyeSA9IGVuZGlhbl91dGlsOjpsb2FkX3VpbnQzMl9iaWdfZW5kaWFuKGRhdGEpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIFNoZWxsTVA0TWFwOjpUYWJsZUNhY2hlOjpSZWFkVTY0RW50cnkodWludDMyIGVudHJ5X251bWJlciwgdWludDY0KiBlbnRyeSkgewotICBpZiAodWludDgqIGRhdGEgPSBHZXRCeXRlc0F0RW50cnkoZW50cnlfbnVtYmVyKSkgewotICAgICplbnRyeSA9IGVuZGlhbl91dGlsOjpsb2FkX3VpbnQ2NF9iaWdfZW5kaWFuKGRhdGEpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyA9PT09IFNoZWxsTVA0TWFwID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vLyBhdG9tIHwgbmFtZSAgICAgICAgICAgICAgICAgIHwgc2l6ZSB8IGRlc2NyaXB0aW9uLCAoKikgbWVhbnMgb3B0aW9uYWwgdGFibGUKLS8vIC0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjbzY0IHwgY2h1bmsgb2Zmc2V0ICg2NC1iaXQpIHwgOCAgICB8IHBlci1jaHVuayBsaXN0IG9mIGNodW5rIGZpbGUgb2Zmc2V0cwotLy8gY3R0cyB8IGNvbXBvc2l0aW9uIG9mZnNldCAgICB8IDggICAgfCAoKikgcnVuLWxlbmd0aCBzYW1wbGUgbnVtYmVyIHRvIGN0cwotLy8gc3RjbyB8IGNodW5rIG9mZnNldCAoMzItYml0KSB8IDQgICAgfCBwZXItY2h1bmsgbGlzdCBvZiBjaHVuayBmaWxlIG9mZnNldHMKLS8vIHN0c2MgfCBzYW1wbGUtdG8tY2h1bmsgICAgICAgfCAxMiAgIHwgY2h1bmsgbnVtYmVyIHRvIHNhbXBsZXMgcGVyIGNodW5rCi0vLyBzdHNzIHwgc3luYyBzYW1wbGUgICAgICAgICAgIHwgNCAgICB8ICgqKSBsaXN0IG9mIGtleWZyYW1lIHNhbXBsZSBudW1iZXJzCi0vLyBzdHRzIHwgdGltZS10by1zYW1wbGUgICAgICAgIHwgOCAgICB8IHJ1bi1sZW5ndGggc2FtcGxlIG51bWJlciB0byBkdXJhdGlvbgotLy8gc3RzeiB8IHNhbXBsZSBzaXplICAgICAgICAgICB8IDQgICAgfCBwZXItc2FtcGxlIGxpc3Qgb2Ygc2FtcGxlIHNpemVzCi0KLVNoZWxsTVA0TWFwOjpTaGVsbE1QNE1hcChzY29wZWRfcmVmcHRyPFNoZWxsRGF0YVNvdXJjZVJlYWRlcj4gcmVhZGVyKQotICAgIDogcmVhZGVyXyhyZWFkZXIpLAotICAgICAgY3VycmVudF9jaHVua19zYW1wbGVfKDApLAotICAgICAgbmV4dF9jaHVua19zYW1wbGVfKDApLAotICAgICAgY3VycmVudF9jaHVua19vZmZzZXRfKDApLAotICAgICAgaGlnaGVzdF92YWxpZF9zYW1wbGVfbnVtYmVyXyhVSU5UMzJfTUFYKSwKLSAgICAgIGN0dHNfZmlyc3Rfc2FtcGxlXygwKSwKLSAgICAgIGN0dHNfc2FtcGxlX29mZnNldF8oMCksCi0gICAgICBjdHRzX25leHRfZmlyc3Rfc2FtcGxlXygwKSwKLSAgICAgIGN0dHNfdGFibGVfaW5kZXhfKDApLAotICAgICAgc3RzY19maXJzdF9jaHVua18oMCksCi0gICAgICBzdHNjX2ZpcnN0X2NodW5rX3NhbXBsZV8oMCksCi0gICAgICBzdHNjX3NhbXBsZXNfcGVyX2NodW5rXygwKSwKLSAgICAgIHN0c2NfbmV4dF9maXJzdF9jaHVua18oMCksCi0gICAgICBzdHNjX25leHRfZmlyc3RfY2h1bmtfc2FtcGxlXygwKSwKLSAgICAgIHN0c2NfdGFibGVfaW5kZXhfKDApLAotICAgICAgc3Rzc19sYXN0X2tleWZyYW1lXygwKSwKLSAgICAgIHN0c3NfbmV4dF9rZXlmcmFtZV8oMCksCi0gICAgICBzdHNzX3RhYmxlX2luZGV4XygwKSwKLSAgICAgIHN0dHNfZmlyc3Rfc2FtcGxlXygwKSwKLSAgICAgIHN0dHNfZmlyc3Rfc2FtcGxlX3RpbWVfKDApLAotICAgICAgc3R0c19zYW1wbGVfZHVyYXRpb25fKDApLAotICAgICAgc3R0c19uZXh0X2ZpcnN0X3NhbXBsZV8oMCksCi0gICAgICBzdHRzX25leHRfZmlyc3Rfc2FtcGxlX3RpbWVfKDApLAotICAgICAgc3R0c190YWJsZV9pbmRleF8oMCksCi0gICAgICBzdHN6X2RlZmF1bHRfc2l6ZV8oMCkge30KLQotYm9vbCBTaGVsbE1QNE1hcDo6SXNDb21wbGV0ZSgpIHsKLSAgLy8gYWxsIHJlcXVpcmVkIHRhYmxlIHBvaW50ZXJzIG11c3QgYmUgdmFsaWQgZm9yIG1hcCB0byBmdW5jdGlvbgotICByZXR1cm4gKGNvNjRfIHx8IHN0Y29fKSAmJiBzdHNjXyAmJiBzdHRzXyAmJiAoc3Rzel8gfHwgc3Rzel9kZWZhdWx0X3NpemVfKTsKLX0KLQotLy8gVGhlIHNhbXBsZSBzaXplIGlzIGEgbG9va3VwIGluIHRoZSBzdHN6IHRhYmxlLCB3aGljaCBpcyBpbmRleGVkIHBlciBzYW1wbGUKLS8vIG51bWJlci4KLWJvb2wgU2hlbGxNUDRNYXA6OkdldFNpemUodWludDMyIHNhbXBsZV9udW1iZXIsIHVpbnQzMiYgc2l6ZV9vdXQpIHsKLSAgRENIRUNLKHN0c3pfIHx8IHN0c3pfZGVmYXVsdF9zaXplXyk7Ci0KLSAgaWYgKHNhbXBsZV9udW1iZXIgPiBoaWdoZXN0X3ZhbGlkX3NhbXBsZV9udW1iZXJfKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKHN0c3pfZGVmYXVsdF9zaXplXykgewotICAgIHNpemVfb3V0ID0gc3Rzel9kZWZhdWx0X3NpemVfOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcmV0dXJuIHN0c3pfLT5SZWFkVTMyRW50cnkoc2FtcGxlX251bWJlciwgJnNpemVfb3V0KTsKLX0KLQotLy8gV2UgZmlyc3QgbXVzdCBpbnRlZ3JhdGUgdGhlIHN0c2MgdGFibGUgdG8gZmluZCB0aGUgY2h1bmsgbnVtYmVyIHRoYXQgdGhlCi0vLyBzYW1wbGUgcmVzaWRlcyBpbiwgYW5kIHRoZSBmaXJzdCBzYW1wbGUgbnVtYmVyIGluIHRoYXQgY2h1bmsuIFdlIGxvb2sgdXAgdGhhdAotLy8gY2h1bmsgb2Zmc2V0IGZyb20gdGhlIHN0Y28gb3IgY282NCwgd2hpY2ggYXJlIGluZGV4ZWQgYnkgY2h1bmsgbnVtYmVyLiBXZQotLy8gdGhlbiB1c2UgdGhlIHN0c3ogdG8gc3VtIHNhbXBsZXMgdG8gdGhlIGJ5dGUgb2Zmc2V0IHdpdGggdGhhdCBjaHVuay4gVGhlIHN1bQotLy8gb2YgdGhlIGNodW5rIG9mZnNldCBhbmQgdGhlIGJ5dGUgb2Zmc2V0IHdpdGhpbiB0aGUgY2h1bmsgaXMgdGhlIG9mZnNldCBvZgotLy8gdGhlIHNhbXBsZS4KLWJvb2wgU2hlbGxNUDRNYXA6OkdldE9mZnNldCh1aW50MzIgc2FtcGxlX251bWJlciwgdWludDY0JiBvZmZzZXRfb3V0KSB7Ci0gIERDSEVDSyhzdHNjXyk7Ci0gIERDSEVDSyhzdGNvXyB8fCBjbzY0Xyk7Ci0gIERDSEVDSyhzdHN6XyB8fCBzdHN6X2RlZmF1bHRfc2l6ZV8pOwotCi0gIGlmIChzYW1wbGVfbnVtYmVyID4gaGlnaGVzdF92YWxpZF9zYW1wbGVfbnVtYmVyXykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIGNoZWNrIGZvciBzZXF1ZW50aWFsIGFjY2VzcyBvZiBzYW1wbGUgbnVtYmVycyB3aXRoaW4gdGhlIHNhbWUgY2h1bmsKLSAgaWYgKHNhbXBsZV9udW1iZXIgPCBjdXJyZW50X2NodW5rX3NhbXBsZV8gfHwKLSAgICAgIHNhbXBsZV9udW1iZXIgPj0gbmV4dF9jaHVua19zYW1wbGVfKSB7Ci0gICAgLy8gaW50ZWdyYXRlIHRocm91Z2ggc3RzYyB1bnRpbCB3ZSBmaW5kIHRoZSBjaHVuayByYW5nZSBjb250YWluaW5nIHNhbXBsZQotICAgIGlmICghc3RzY19BZHZhbmNlVG9TYW1wbGUoc2FtcGxlX251bWJlcikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgLy8gbWFrZSBzdXJlIHN0c2MgYWR2YW5jZSBkaWQgaXRzIGpvYiBjb3JyZWN0bHkKLSAgICBEQ0hFQ0tfR0Uoc2FtcGxlX251bWJlciwgc3RzY19maXJzdF9jaHVua19zYW1wbGVfKTsKLQotICAgIC8vIGNhbGN1bGF0ZSBjaHVuayBudW1iZXIgYmFzZWQgb24gY2h1bmsgc2FtcGxlIHNpemUgZm9yIHRoaXMgcmFuZ2UKLSAgICB1aW50MzIgc2FtcGxlX29mZnNldCA9IHNhbXBsZV9udW1iZXIgLSBzdHNjX2ZpcnN0X2NodW5rX3NhbXBsZV87Ci0gICAgdWludDMyIGNodW5rX3JhbmdlX29mZnNldCA9IHNhbXBsZV9vZmZzZXQgLyBzdHNjX3NhbXBsZXNfcGVyX2NodW5rXzsKLSAgICB1aW50MzIgY2h1bmtfbnVtYmVyID0gc3RzY19maXJzdF9jaHVua18gKyBjaHVua19yYW5nZV9vZmZzZXQ7Ci0gICAgLy8gc2hvdWxkIGJlIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgY2h1bmtzIHdpdGggdGhpcyBzYW1wbGUgc2l6ZQotICAgIERDSEVDS19MVChjaHVua19udW1iZXIsIHN0c2NfbmV4dF9maXJzdF9jaHVua18pOwotICAgIC8vIHVwZGF0ZSBmaXJzdCBzYW1wbGUgbnVtYmVyIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjaHVuawotICAgIGN1cnJlbnRfY2h1bmtfc2FtcGxlXyA9IHN0c2NfZmlyc3RfY2h1bmtfc2FtcGxlXyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNodW5rX3JhbmdlX29mZnNldCAqIHN0c2Nfc2FtcGxlc19wZXJfY2h1bmtfKTsKLSAgICAvLyB1cGRhdGUgZmlyc3Qgc2FtcGxlIG51bWJlciBvZiBuZXh0IGNodW5rCi0gICAgbmV4dF9jaHVua19zYW1wbGVfID0gY3VycmVudF9jaHVua19zYW1wbGVfICsgc3RzY19zYW1wbGVzX3Blcl9jaHVua187Ci0gICAgLy8gZmluZCBvZmZzZXQgb2YgdGhpcyBjaHVuayB3aXRoaW4gdGhlIGZpbGUgZnJvbSBjbzY0L3N0Y28KLSAgICBpZiAoY282NF8pIHsKLSAgICAgIGlmICghY282NF8tPlJlYWRVNjRFbnRyeShjaHVua19udW1iZXIsICZjdXJyZW50X2NodW5rX29mZnNldF8pKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBlbHNlIGlmICghc3Rjb18tPlJlYWRVMzJFbnRyeUludG9VNjQoY2h1bmtfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdXJyZW50X2NodW5rX29mZnNldF8pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLy8gYXQgdGhpcyBwb2ludCB3ZSBzaG91bGQgaGF2ZSBzYW1wbGVfbnVtYmVyIHdpdGhpbiB0aGUgcmFuZ2Ugb2Ygb3VyIGNodW5rCi0gIC8vIG9mZnNldCBzdW1tYXRpb24gc2F2ZWQgc3RhdGUKLSAgRENIRUNLX0xFKGN1cnJlbnRfY2h1bmtfc2FtcGxlXywgc2FtcGxlX251bWJlcik7Ci0gIERDSEVDS19MVChzYW1wbGVfbnVtYmVyLCBuZXh0X2NodW5rX3NhbXBsZV8pOwotCi0gIGlmIChzdHN6X2RlZmF1bHRfc2l6ZV8gPiAwKSB7Ci0gICAgY3VycmVudF9jaHVua19vZmZzZXRfICs9Ci0gICAgICAgIChzYW1wbGVfbnVtYmVyIC0gY3VycmVudF9jaHVua19zYW1wbGVfKSAqIHN0c3pfZGVmYXVsdF9zaXplXzsKLSAgICBjdXJyZW50X2NodW5rX3NhbXBsZV8gPSBzYW1wbGVfbnVtYmVyOwotICB9IGVsc2UgewotICAgIC8vIHN1bSBzYW1wbGUgc2l6ZXMgd2l0aGluIGNodW5rIHRvIGdldCB0byBieXRlIG9mZnNldCBvZiBzYW1wbGUKLSAgICB3aGlsZSAoY3VycmVudF9jaHVua19zYW1wbGVfIDwgc2FtcGxlX251bWJlcikgewotICAgICAgdWludDMyIHNhbXBsZV9zaXplID0gMDsKLSAgICAgIGlmICghR2V0U2l6ZShjdXJyZW50X2NodW5rX3NhbXBsZV8sIHNhbXBsZV9zaXplKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBjdXJyZW50X2NodW5rX29mZnNldF8gKz0gc2FtcGxlX3NpemU7Ci0gICAgICBjdXJyZW50X2NodW5rX3NhbXBsZV8rKzsKLSAgICB9Ci0gIH0KLQotICBvZmZzZXRfb3V0ID0gY3VycmVudF9jaHVua19vZmZzZXRfOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gR2l2ZW4gYSBjdXJyZW50IHNhbXBsZSBudW1iZXIgd2UgaW50ZWdyYXRlIHRocm91Z2ggdGhlIHN0dHMgdG8gZmluZCB0aGUKLS8vIGR1cmF0aW9uIG9mIHRoZSBjdXJyZW50IHNhbXBsZSwgYW5kIGF0IHRoZSBzYW1lIHRpbWUgaW50ZWdyYXRlIHRocm91Z2ggdGhlCi0vLyBkdXJhdGlvbnMgdG8gZmluZCB0aGUgZHRzIG9mIHRoYXQgc2FtcGxlIG51bWJlci4gV2UgdGhlbiBpbnRlZ3JhdGUgc2FtcGxlCi0vLyBudW1iZXJzIHRocm91Z2ggdGhlIGN0dHMgdG8gZmluZCB0aGUgY29tcG9zaXRpb24gdGltZSBvZmZzZXQsIHdoaWNoIHdlIGFkZCB0bwotLy8gdGhlIGR0cyB0byByZXR1cm4gdGhlIHB0cy4KLWJvb2wgU2hlbGxNUDRNYXA6OkdldFRpbWVzdGFtcCh1aW50MzIgc2FtcGxlX251bWJlciwgdWludDY0JiB0aW1lc3RhbXBfb3V0KSB7Ci0gIGlmIChzYW1wbGVfbnVtYmVyID4gaGlnaGVzdF92YWxpZF9zYW1wbGVfbnVtYmVyXykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghc3R0c19BZHZhbmNlVG9TYW1wbGUoc2FtcGxlX251bWJlcikpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgRENIRUNLX0xUKHNhbXBsZV9udW1iZXIsIHN0dHNfbmV4dF9maXJzdF9zYW1wbGVfKTsKLSAgRENIRUNLX0dFKHNhbXBsZV9udW1iZXIsIHN0dHNfZmlyc3Rfc2FtcGxlXyk7Ci0gIHVpbnQ2NCBkdHMgPSBzdHRzX2ZpcnN0X3NhbXBsZV90aW1lXyArCi0gICAgICAgICAgICAgICAoc2FtcGxlX251bWJlciAtIHN0dHNfZmlyc3Rfc2FtcGxlXykgKiBzdHRzX3NhbXBsZV9kdXJhdGlvbl87Ci0gIGlmIChjdHRzXykgewotICAgIGlmICghY3R0c19BZHZhbmNlVG9TYW1wbGUoc2FtcGxlX251bWJlcikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgRENIRUNLX0xUKHNhbXBsZV9udW1iZXIsIGN0dHNfbmV4dF9maXJzdF9zYW1wbGVfKTsKLSAgICBEQ0hFQ0tfR0Uoc2FtcGxlX251bWJlciwgY3R0c19maXJzdF9zYW1wbGVfKTsKLSAgfQotICB0aW1lc3RhbXBfb3V0ID0gZHRzICsgY3R0c19zYW1wbGVfb2Zmc2V0XzsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFN1bSB0aHJvdWdoIHRoZSBzdHRzIHRvIGZpbmQgdGhlIGR1cmF0aW9uIG9mIHRoZSBnaXZlbiBzYW1wbGVfbnVtYmVyLgotYm9vbCBTaGVsbE1QNE1hcDo6R2V0RHVyYXRpb24odWludDMyIHNhbXBsZV9udW1iZXIsIHVpbnQzMiYgZHVyYXRpb25fb3V0KSB7Ci0gIGlmIChzYW1wbGVfbnVtYmVyID4gaGlnaGVzdF92YWxpZF9zYW1wbGVfbnVtYmVyXykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghc3R0c19BZHZhbmNlVG9TYW1wbGUoc2FtcGxlX251bWJlcikpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgRENIRUNLX0xUKHNhbXBsZV9udW1iZXIsIHN0dHNfbmV4dF9maXJzdF9zYW1wbGVfKTsKLSAgRENIRUNLX0dFKHNhbXBsZV9udW1iZXIsIHN0dHNfZmlyc3Rfc2FtcGxlXyk7Ci0gIGR1cmF0aW9uX291dCA9IHN0dHNfc2FtcGxlX2R1cmF0aW9uXzsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU2hlbGxNUDRNYXA6OkdldElzS2V5ZnJhbWUodWludDMyIHNhbXBsZV9udW1iZXIsIGJvb2wmIGlzX2tleWZyYW1lX291dCkgewotICBpZiAoc2FtcGxlX251bWJlciA+IGhpZ2hlc3RfdmFsaWRfc2FtcGxlX251bWJlcl8pIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBubyBzdHRzIG1lYW5zIGV2ZXJ5IGZyYW1lIGlzIGEga2V5ZnJhbWUKLSAgaWYgKCFzdHNzXykgewotICAgIGlzX2tleWZyYW1lX291dCA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvLyBjaGVjayBmb3Iga2V5ZnJhbWUgbWF0Y2ggb24gZWl0aGVyIHJhbmdlIHZhbHVlCi0gIGlmIChzYW1wbGVfbnVtYmVyID09IHN0c3NfbmV4dF9rZXlmcmFtZV8pIHsKLSAgICBpc19rZXlmcmFtZV9vdXQgPSB0cnVlOwotICAgIHJldHVybiBzdHNzX0FkdmFuY2VTdGVwKCk7Ci0gIH0gZWxzZSBpZiAoc2FtcGxlX251bWJlciA9PSBzdHNzX2xhc3Rfa2V5ZnJhbWVfKSB7Ci0gICAgaXNfa2V5ZnJhbWVfb3V0ID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vIHRoaXMgY291bGQgYmUgZm9yIGEgbXVjaCBlYXJsaWVyIHNhbXBsZSBudW1iZXIsIGNoZWNrIGlmIHdlIGFyZSB3aXRoaW4KLSAgLy8gY3VycmVudCByYW5nZSBvZiBzYW1wbGUgbnVtYmVycwotICBpZiAoc2FtcGxlX251bWJlciA8IHN0c3NfbGFzdF9rZXlmcmFtZV8gfHwKLSAgICAgIHNhbXBsZV9udW1iZXIgPiBzdHNzX25leHRfa2V5ZnJhbWVfKSB7Ci0gICAgLy8gc2VhcmNoIGZvciBjb250YWluaW5nIGVudHJ5Ci0gICAgaWYgKCFzdHNzX0ZpbmROZWFyZXN0S2V5ZnJhbWUoc2FtcGxlX251bWJlcikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgLy8gc2FtcGxlIG51bWJlciBtdXN0IGJlIGluIHJhbmdlIG9mIGtleWZyYW1lIHN0YXRlcwotICBEQ0hFQ0tfR0Uoc2FtcGxlX251bWJlciwgc3Rzc19sYXN0X2tleWZyYW1lXyk7Ci0gIERDSEVDS19MVChzYW1wbGVfbnVtYmVyLCBzdHNzX25leHRfa2V5ZnJhbWVfKTsKLSAgLy8gc3Rzc19GaW5kTmVhcmVzdEtleWZyYW1lIHJldHVybnMgZXhhY3QgbWF0Y2hlcyB0bwotICAvLyBzYW1wbGVfbnVtYmVyIGluIHRoZSBzdHNzX2xhc3Rfa2V5ZnJhbWVfIHZhcmlhYmxlLCBzbwotICAvLyB3ZSBjaGVjayB0aGF0IGZvciBlcXVhbGl0eQotICBpc19rZXlmcmFtZV9vdXQgPSAoc2FtcGxlX251bWJlciA9PSBzdHNzX2xhc3Rfa2V5ZnJhbWVfKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTaGVsbE1QNE1hcDo6SXNFT1ModWludDMyIHNhbXBsZV9udW1iZXIpIHsKLSAgcmV0dXJuIChzYW1wbGVfbnVtYmVyID4gaGlnaGVzdF92YWxpZF9zYW1wbGVfbnVtYmVyXyk7Ci19Ci0KLS8vIEZpcnN0IGxvb2sgdXAgdGhlIHNhbXBsZSBudW1iZXIgZm9yIHRoZSBwcm92aWRlZCB0aW1lc3RhbXAgYnkgaW50ZWdyYXRpbmcKLS8vIHRpbWVzdGFtcHMgdGhyb3VnaCB0aGUgc3R0cy4gVGhlbiBkbyBhIGJpbmFyeSBzZWFyY2ggb24gdGhlIHN0c3MgdG8gZmluZCB0aGUKLS8vIGtleWZyYW1lIG5lYXJlc3QgdGhhdCBzYW1wbGUgbnVtYmVyLgotYm9vbCBTaGVsbE1QNE1hcDo6R2V0S2V5ZnJhbWUodWludDY0IHRpbWVzdGFtcCwgdWludDMyJiBzYW1wbGVfb3V0KSB7Ci0gIC8vIEFkdmFuY2Ugc3R0cyB0byB0aGUgcHJvdmlkZWQgdGltZXN0YW1wIHJhbmdlCi0gIGlmICghc3R0c19BZHZhbmNlVG9UaW1lKHRpbWVzdGFtcCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gZW5zdXJlIHdlIGdvdCB0aGUgY29ycmVjdCBzYW1wbGUgZHVyYXRpb24gcmFuZ2UKLSAgRENIRUNLX0xUKHRpbWVzdGFtcCwgc3R0c19uZXh0X2ZpcnN0X3NhbXBsZV90aW1lXyk7Ci0gIERDSEVDS19HRSh0aW1lc3RhbXAsIHN0dHNfZmlyc3Rfc2FtcGxlX3RpbWVfKTsKLSAgLy8gY2FsY3VsYXRlIHNhbXBsZSBudW1iZXIgY29udGFpbmluZyB0aGlzIHRpbWVzdGFtcAotICB1aW50NjQgdGltZV9vZmZzZXRfd2l0aGluX3JhbmdlID0gdGltZXN0YW1wIC0gc3R0c19maXJzdF9zYW1wbGVfdGltZV87Ci0gIHVpbnQzMiBzYW1wbGVfbnVtYmVyID0KLSAgICAgIHN0dHNfZmlyc3Rfc2FtcGxlXyArICh0aW1lX29mZnNldF93aXRoaW5fcmFuZ2UgLyBzdHRzX3NhbXBsZV9kdXJhdGlvbl8pOwotCi0gIC8vIFRPRE86IGN0dHM/Ci0KLSAgLy8gYmluYXJ5IHNlYXJjaCBvbiBzdHRzIHRvIGZpbmQgbmVhcmVzdCBrZXlmcmFtZSBiZW5lYXRoIHRoaXMgc2FtcGxlIG51bWJlcgotICBpZiAoc3Rzc18pIHsKLSAgICBpZiAoIXN0c3NfRmluZE5lYXJlc3RLZXlmcmFtZShzYW1wbGVfbnVtYmVyKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBzYW1wbGVfb3V0ID0gc3Rzc19sYXN0X2tleWZyYW1lXzsKLSAgfSBlbHNlIHsKLSAgICAvLyBhbiBhYnNlbnQgc3R0cyBtZWFucyBldmVyeSBmcmFtZSBpcyBhIGtleSBmcmFtZSwgd2UgY2FuIHByb3ZpZGUgc2FtcGxlCi0gICAgLy8gZGlyZWN0bHkuCi0gICAgc2FtcGxlX291dCA9IHNhbXBsZV9udW1iZXI7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFNldCB1cCBtYXAgc3RhdGUgYW5kIGxvYWQgZmlyc3QgcGFydCBvZiB0YWJsZSwgb3IgZW50aXJlIHRhYmxlIGlmIGl0IGlzIHNtYWxsCi0vLyBlbm91Z2gsIGZvciBlYWNoIG9mIHRoZSBzdXBwb3JhdGVkIGF0b21zLgotYm9vbCBTaGVsbE1QNE1hcDo6U2V0QXRvbSh1aW50MzIgZm91cl9jYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBjYWNoZV9zaXplX2VudHJpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBhdG9tKSB7Ci0gIC8vIEFsbCBtYXAgYXRvbXMgYXJlIHZhcmlhYmxlLWxlbmd0aCB0YWJsZXMgc3RhcnRpbmcgd2l0aCA0IGJ5dGVzIG9mCi0gIC8vIHZlcnNpb24vZmxhZyBpbmZvIGZvbGxvd2VkIGJ5IGEgdWludDMyIGluZGljYXRpbmcgdGhlIG51bWJlciBvZiBpdGVtcyBpbgotICAvLyB0YWJsZS4gVGhlIHN0c3ogYXRvbSBidWNrcyB0cmFkaXRpb24gYnkgcHV0dGluZyBhbiBvcHRpb25hbCBkZWZhdWx0IHZhbHVlCi0gIC8vIGF0IGluZGV4IDQuCi0gIHVpbnQzMiBjb3VudCA9IDA7Ci0gIHVpbnQ2NCB0YWJsZV9vZmZzZXQgPSBvZmZzZXQgKyA4OwotICBpZiAoZm91cl9jYyA9PSBrQXRvbVR5cGVfc3RzeikgewotICAgIGlmIChzaXplIDwgMTIpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgc3Rzel9kZWZhdWx0X3NpemVfID0gZW5kaWFuX3V0aWw6OmxvYWRfdWludDMyX2JpZ19lbmRpYW4oYXRvbSArIDQpOwotICAgIGNvdW50ID0gZW5kaWFuX3V0aWw6OmxvYWRfdWludDMyX2JpZ19lbmRpYW4oYXRvbSArIDgpOwotICAgIGhpZ2hlc3RfdmFsaWRfc2FtcGxlX251bWJlcl8gPQotICAgICAgICBzdGQ6Om1pbihjb3VudCAtIDEsIGhpZ2hlc3RfdmFsaWRfc2FtcGxlX251bWJlcl8pOwotICAgIC8vIGlmIGEgbm9uLXplcm8gZGVmYXVsdCBzaXplIGlzIHByb3ZpZGVkIGRvbid0IGJvdGhlciBsb2FkaW5nIHRoZSB0YWJsZQotICAgIGlmIChzdHN6X2RlZmF1bHRfc2l6ZV8pIHsKLSAgICAgIHN0c3pfID0gTlVMTDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHRhYmxlX29mZnNldCArPSA0OwotICB9IGVsc2UgewotICAgIGlmIChzaXplIDwgOCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBjb3VudCA9IGVuZGlhbl91dGlsOjpsb2FkX3VpbnQzMl9iaWdfZW5kaWFuKGF0b20gKyA0KTsKLSAgfQotCi0gIC8vIGlmIGNhY2hlX3NpemVfZW50cmllcyBpcyAwIHdlIGFyZSB0byBjYWNoZSB0aGUgZW50aXJlIHRhYmxlCi0gIGlmIChjYWNoZV9zaXplX2VudHJpZXMgPT0gMCkgewotICAgIGNhY2hlX3NpemVfZW50cmllcyA9IGNvdW50OwotICB9Ci0KLSAgYm9vbCBhdG9tX2luaXQgPSBmYWxzZTsKLSAgLy8gaW5pdGlhbGl6ZSB0aGUgYXBwcm9wcmlhdGUgdGFibGUgY2FjaGUgZGVwZW5kZW50IG9uIHRhYmxlIHR5cGUKLSAgc3dpdGNoIChmb3VyX2NjKSB7Ci0gICAgY2FzZSBrQXRvbVR5cGVfY282NDoKLSAgICAgIGNvNjRfID0gbmV3IFRhYmxlQ2FjaGUodGFibGVfb2Zmc2V0LCBjb3VudCwga0VudHJ5U2l6ZV9jbzY0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZV9zaXplX2VudHJpZXMsIHJlYWRlcl8pOwotICAgICAgaWYgKGNvNjRfKQotICAgICAgICBhdG9tX2luaXQgPSBjbzY0X0luaXQoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBrQXRvbVR5cGVfY3R0czoKLSAgICAgIGN0dHNfID0gbmV3IFRhYmxlQ2FjaGUodGFibGVfb2Zmc2V0LCBjb3VudCwga0VudHJ5U2l6ZV9jdHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZV9zaXplX2VudHJpZXMsIHJlYWRlcl8pOwotICAgICAgaWYgKGN0dHNfKQotICAgICAgICBhdG9tX2luaXQgPSBjdHRzX0luaXQoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBrQXRvbVR5cGVfc3RjbzoKLSAgICAgIHN0Y29fID0gbmV3IFRhYmxlQ2FjaGUodGFibGVfb2Zmc2V0LCBjb3VudCwga0VudHJ5U2l6ZV9zdGNvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZV9zaXplX2VudHJpZXMsIHJlYWRlcl8pOwotICAgICAgaWYgKHN0Y29fKQotICAgICAgICBhdG9tX2luaXQgPSBzdGNvX0luaXQoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBrQXRvbVR5cGVfc3RzYzoKLSAgICAgIHN0c2NfID0gbmV3IFRhYmxlQ2FjaGUodGFibGVfb2Zmc2V0LCBjb3VudCwga0VudHJ5U2l6ZV9zdHNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZV9zaXplX2VudHJpZXMsIHJlYWRlcl8pOwotICAgICAgaWYgKHN0c2NfKQotICAgICAgICBhdG9tX2luaXQgPSBzdHNjX0luaXQoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBrQXRvbVR5cGVfc3RzczoKLSAgICAgIHN0c3NfID0gbmV3IFRhYmxlQ2FjaGUodGFibGVfb2Zmc2V0LCBjb3VudCwga0VudHJ5U2l6ZV9zdHNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZV9zaXplX2VudHJpZXMsIHJlYWRlcl8pOwotICAgICAgaWYgKHN0c3NfKQotICAgICAgICBhdG9tX2luaXQgPSBzdHNzX0luaXQoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBrQXRvbVR5cGVfc3R0czoKLSAgICAgIHN0dHNfID0gbmV3IFRhYmxlQ2FjaGUodGFibGVfb2Zmc2V0LCBjb3VudCwga0VudHJ5U2l6ZV9zdHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZV9zaXplX2VudHJpZXMsIHJlYWRlcl8pOwotICAgICAgaWYgKHN0dHNfKQotICAgICAgICBhdG9tX2luaXQgPSBzdHRzX0luaXQoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBrQXRvbVR5cGVfc3RzejoKLSAgICAgIHN0c3pfID0gbmV3IFRhYmxlQ2FjaGUodGFibGVfb2Zmc2V0LCBjb3VudCwga0VudHJ5U2l6ZV9zdHN6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZV9zaXplX2VudHJpZXMsIHJlYWRlcl8pOwotICAgICAgaWYgKHN0c3pfKQotICAgICAgICBhdG9tX2luaXQgPSBzdHN6X0luaXQoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIE5PVFJFQUNIRUQoKSA8PCAidW5rbm93biBhdG9tIHR5cGUgcHJvdmlkZWQgdG8gbXA0IG1hcCI7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBhdG9tX2luaXQ7Ci19Ci0KLWJvb2wgU2hlbGxNUDRNYXA6OmNvNjRfSW5pdCgpIHsKLSAgRENIRUNLKGNvNjRfKTsKLSAgLy8gbG9hZCBvZmZzZXQgb2YgZmlyc3QgY2h1bmsgaW50byBjdXJyZW50X2NodW5rX29mZnNldF8KLSAgaWYgKGNvNjRfLT5HZXRFbnRyeUNvdW50KCkgPiAwKSB7Ci0gICAgLy8gY2FuIGRyb3AgYW55IHN0Y28gdGFibGUgYWxyZWFkeSBhbGxvY2F0ZWQKLSAgICBzdGNvXyA9IE5VTEw7Ci0gICAgLy8gbG9hZCBpbml0aWFsIHZhbHVlIG9mIGN1cnJlbnRfY2h1bmtfb2Zmc2V0XyBmb3IgMHRoIGNodW5rCi0gICAgcmV0dXJuIGNvNjRfLT5SZWFkVTY0RW50cnkoMCwgJmN1cnJlbnRfY2h1bmtfb2Zmc2V0Xyk7Ci0gIH0KLQotICBjbzY0XyA9IE5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFRoZSBjdHRzIHRhYmxlIGhhcyB0aGUgZm9sbG93aW5nIHBlci1lbnRyeSBsYXlvdXQ6Ci0vLyB1aW50MzIgc2FtcGxlIGNvdW50Ci0vLyB1aW50MzIgY29tcG9zaXRpb24gb2Zmc2V0IGluIHRpY2tzCi0vLwotYm9vbCBTaGVsbE1QNE1hcDo6Y3R0c19Jbml0KCkgewotICBEQ0hFQ0soY3R0c18pOwotICAvLyBnZXQgY2FjaGUgc2VnbWVudCB2ZWN0b3IgdG8gcmVzZXJ2ZSB0YWJsZSBlbnRyaWVzIGluIGFkdmFuY2UKLSAgaW50IGNhY2hlX3NlZ21lbnRzID0KLSAgICAgIChjdHRzXy0+R2V0RW50cnlDb3VudCgpIC8gY3R0c18tPkdldENhY2hlU2l6ZUVudHJpZXMoKSkgKyAxOwotICBjdHRzX3NhbXBsZXNfLnJlc2VydmUoY2FjaGVfc2VnbWVudHMpOwotICBpZiAoY3R0c18tPkdldEVudHJ5Q291bnQoKSA+IDApIHsKLSAgICAvLyBzYXZlIHRoZSBzdGFydCBvZiB0aGUgZmlyc3QgdGFibGUgaW50ZWdyYXRpb24gYXQgMAotICAgIGN0dHNfc2FtcGxlc18ucHVzaF9iYWNrKDApOwotICAgIGN0dHNfdGFibGVfaW5kZXhfID0gMDsKLSAgICBjdHRzX2ZpcnN0X3NhbXBsZV8gPSAwOwotICAgIC8vIGxvYWQgZmlyc3QgZW50cnkgaW4gdGFibGUsIHRvIHN0YXJ0IGludGVncmF0aW9uCi0gICAgcmV0dXJuIGN0dHNfLT5SZWFkVTMyUGFpckVudHJ5KDAsICZjdHRzX25leHRfZmlyc3Rfc2FtcGxlXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0dHNfc2FtcGxlX29mZnNldF8pOwotICB9Ci0gIC8vIGRyb3AgZW1wdHkgY3R0c18gdGFibGUKLSAgY3R0c18gPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vLyBUbyBmaW5kIHRoZSBjb21wb3NpdGlvbiBvZmZzZXQgb2YgYSBnaXZlbiBzYW1wbGUgbnVtYmVyIHdlIG11c3QgaW50ZWdyYXRlCi0vLyB0aHJvdWdoIHRoZSBjdHRzIHRvIGZpbmQgdGhlIHJhbmdlIG9mIHNhbXBsZXMgY29udGFpbmluZyBzYW1wbGVfbnVtYmVyLiBOb3RlCi0vLyB0aGF0IHRoZSBjdHRzIGlzIGFuIG9wdGlvbmFsIHRhYmxlLgotYm9vbCBTaGVsbE1QNE1hcDo6Y3R0c19BZHZhbmNlVG9TYW1wbGUodWludDMyIHNhbXBsZV9udW1iZXIpIHsKLSAgLy8gY3R0cyB0YWJsZSBpcyBvcHRpb25hbCwgc28gdHJlYXQgbm90IGhhdmluZyBvbmUgYXMgbm9uLWZhdGFsCi0gIGlmICghY3R0c18pIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAvLyBzYW1wbGUgbnVtYmVyIGNvdWxkIGJlIGJlZm9yZSBvdXIgc2F2ZWQgZmlyc3Qgc2FtcGxlLCBtZWFuaW5nIHdlJ3ZlCi0gIC8vIGdvbmUgYmFja3dhcmQgaW4gc2FtcGxlIG51bWJlcnMgYW5kIHdpbGwgbmVlZCB0byByZXN0YXJ0IGludGVncmF0aW9uIGF0Ci0gIC8vIHRoZSBuZWFyZXN0IHNhdmVkIHNhbXBsZSBjb3VudCBzdGFydGluZyBhdCBhIGNhY2hlIGVudHJ5Ci0gIGlmIChzYW1wbGVfbnVtYmVyIDwgY3R0c19maXJzdF9zYW1wbGVfKSB7Ci0gICAgaWYgKCFjdHRzX1NsaXBDYWNoZVRvU2FtcGxlKHNhbXBsZV9udW1iZXIsIDApKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLy8gc2FtcGxlX251bWJlciBjb3VsZCBhbHNvIGJlIGFoZWFkIG9mIG91ciBjdXJyZW50IHJhbmdlLCBmb3IgZXhhbXBsZSB3aGVuCi0gIC8vIHNlZWtpbmcgZm9yd2FyZC4gU2VlIGlmIHdlJ3ZlIGNhbGN1bGF0ZWQgdGhlc2UgdmFsdWVzIGFoZWFkIG9mIHVzIGJlZm9yZSwKLSAgLy8gYW5kIGlmIHdlIGNhbiBzbGlwIGZvcndhcmQgdG8gdGhlbQotICBpbnQgbmV4dF9jYWNoZV9pbmRleCA9IChjdHRzX3RhYmxlX2luZGV4XyAvIGN0dHNfLT5HZXRDYWNoZVNpemVFbnRyaWVzKCkpICsgMTsKLSAgaWYgKChuZXh0X2NhY2hlX2luZGV4IDwgY3R0c19zYW1wbGVzXy5zaXplKCkpICYmCi0gICAgICAoc2FtcGxlX251bWJlciA+PSBjdHRzX3NhbXBsZXNfW25leHRfY2FjaGVfaW5kZXhdKSkgewotICAgIGlmICghY3R0c19TbGlwQ2FjaGVUb1NhbXBsZShzYW1wbGVfbnVtYmVyLCBuZXh0X2NhY2hlX2luZGV4KSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIC8vIHBlcmZvcm0gaW50ZWdyYXRpb24gdW50aWwgc2FtcGxlIG51bWJlciBpcyB3aXRoaW4gY29ycmVjdCBjdHRzIHJhbmdlCi0gIHdoaWxlIChjdHRzX25leHRfZmlyc3Rfc2FtcGxlXyA8PSBzYW1wbGVfbnVtYmVyKSB7Ci0gICAgLy8gbmV4dCBmaXJzdCBzYW1wbGUgaXMgbm93IG91ciB0aGUgZmlyc3Qgc2FtcGxlCi0gICAgY3R0c19maXJzdF9zYW1wbGVfID0gY3R0c19uZXh0X2ZpcnN0X3NhbXBsZV87Ci0gICAgLy8gYWR2YW5jZSB0byBuZXh0IGVudHJ5IGluIHRhYmxlCi0gICAgY3R0c190YWJsZV9pbmRleF8rKzsKLSAgICAvLyBJZiB0aGlzIHdvdWxkIGJlIGEgbmV3IGNhY2hlIGVudHJ5LCBrZWVwIGEgcmVjb3JkIG9mIGludGVncmF0aW9uIHVwCi0gICAgLy8gdG8gdGhpcyBwb2ludCBzbyB3ZSBkb24ndCBoYXZlIHRvIHN0YXJ0IGZyb20gMCBvbiBzZWVraW5nIGJhY2sKLSAgICBpZiAoIShjdHRzX3RhYmxlX2luZGV4XyAlIGN0dHNfLT5HZXRDYWNoZVNpemVFbnRyaWVzKCkpKSB7Ci0gICAgICBpbnQgY2FjaGVfaW5kZXggPSBjdHRzX3RhYmxlX2luZGV4XyAvIGN0dHNfLT5HZXRDYWNoZVNpemVFbnRyaWVzKCk7Ci0gICAgICAvLyBjaGVjayB0aGF0IHRoaXMgaXMgb3VyIGZpcnN0IHRpbWUgd2l0aCB0aGVzZSBkYXRhCi0gICAgICBpZiAoY2FjaGVfaW5kZXggPT0gY3R0c19zYW1wbGVzXy5zaXplKCkpIHsKLSAgICAgICAgY3R0c19zYW1wbGVzXy5wdXNoX2JhY2soY3R0c19maXJzdF9zYW1wbGVfKTsKLSAgICAgIH0KLSAgICAgIC8vIG91ciBpbnRlZ3JhdGlvbiBhdCB0aGlzIHBvaW50IHNob3VsZCBhbHdheXMgbWF0Y2ggYW55IHN0b3JlZCByZWNvcmQKLSAgICAgIERDSEVDS19FUShjdHRzX2ZpcnN0X3NhbXBsZV8sIGN0dHNfc2FtcGxlc19bY2FjaGVfaW5kZXhdKTsKLSAgICB9Ci0KLSAgICBpZiAoY3R0c190YWJsZV9pbmRleF8gPCBjdHRzXy0+R2V0RW50cnlDb3VudCgpKSB7Ci0gICAgICAvLyBsb2FkIHRoZSBzYW1wbGUgY291bnQgdG8gZGV0ZXJtaW5lIG5leHQgZmlyc3Qgc2FtcGxlCi0gICAgICB1aW50MzIgc2FtcGxlX2NvdW50OwotICAgICAgaWYgKCFjdHRzXy0+UmVhZFUzMlBhaXJFbnRyeShjdHRzX3RhYmxlX2luZGV4XywgJnNhbXBsZV9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0dHNfc2FtcGxlX29mZnNldF8pKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBjdHRzX25leHRfZmlyc3Rfc2FtcGxlXyA9IGN0dHNfZmlyc3Rfc2FtcGxlXyArIHNhbXBsZV9jb3VudDsKLSAgICB9IGVsc2UgewotICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBsYXN0IGVudHJ5IGluIHRoZSB0YWJsZSBzcGVjaWZpZWQgYSBzYW1wbGUgcmFuZ2UKLSAgICAgIC8vIHRoYXQgdGhpcyBzYW1wbGUgbnVtYmVyIGhhcyBleGNlZWRlZCwgYW5kIHNvIHRoZSBjdHRzIG9mIHRoaXMgc2FtcGxlCi0gICAgICAvLyBudW1iZXIgaXMgdW5kZWZpbmVkLiBXaGlsZSBub3QgYSBmYXRhbCBlcnJvciBpdCdzIGtpbmQgb2YgYSB3ZWlyZAotICAgICAgLy8gc3RhdGUsIHdlIHNldCB0aGUgb2Zmc2V0IGJhY2sgdG8gemVybyBhbmQgZXh0ZW5kIHRoZSBuZXh0X2ZpcnN0X3NhbXBsZQotICAgICAgLy8gdG8gaW5maW5pdHkKLSAgICAgIERMT0coV0FSTklORykgPDwgYmFzZTo6U3RyaW5nUHJpbnRmKAotICAgICAgICAgICJvdXQgb2YgcmFuZ2Ugc2FtcGxlIG51bWJlciAlZCBpbiBjdHRzLCBsYXN0IHZhbGlkIHNhbXBsZSBudW1iZXI6ICVkIiwKLSAgICAgICAgICBzYW1wbGVfbnVtYmVyLCBjdHRzX25leHRfZmlyc3Rfc2FtcGxlXyk7Ci0gICAgICBjdHRzX3NhbXBsZV9vZmZzZXRfID0gMDsKLSAgICAgIGN0dHNfbmV4dF9maXJzdF9zYW1wbGVfID0gVUlOVDMyX01BWDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTaGVsbE1QNE1hcDo6Y3R0c19TbGlwQ2FjaGVUb1NhbXBsZSh1aW50MzIgc2FtcGxlX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0aW5nX2NhY2hlX2luZGV4KSB7Ci0gIERDSEVDS19MVChzdGFydGluZ19jYWNoZV9pbmRleCwgY3R0c19zYW1wbGVzXy5zaXplKCkpOwotICBpbnQgY2FjaGVfaW5kZXggPSBzdGFydGluZ19jYWNoZV9pbmRleDsKLSAgZm9yICg7IGNhY2hlX2luZGV4ICsgMSA8IGN0dHNfc2FtcGxlc18uc2l6ZSgpOyBjYWNoZV9pbmRleCsrKSB7Ci0gICAgaWYgKHNhbXBsZV9udW1iZXIgPCBjdHRzX3NhbXBsZXNfW2NhY2hlX2luZGV4ICsgMV0pIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBjdHRzX2ZpcnN0X3NhbXBsZV8gPSBjdHRzX3NhbXBsZXNfW2NhY2hlX2luZGV4XTsKLSAgY3R0c190YWJsZV9pbmRleF8gPSBjYWNoZV9pbmRleCAqIGN0dHNfLT5HZXRDYWNoZVNpemVFbnRyaWVzKCk7Ci0gIC8vIHJlYWQgc2FtcGxlIGNvdW50IGFuZCBkdXJhdGlvbiB0byBzZXQgbmV4dCB2YWx1ZXMKLSAgdWludDMyIHNhbXBsZV9jb3VudDsKLSAgaWYgKCFjdHRzXy0+UmVhZFUzMlBhaXJFbnRyeShjdHRzX3RhYmxlX2luZGV4XywgJnNhbXBsZV9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R0c19zYW1wbGVfb2Zmc2V0XykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBjdHRzX25leHRfZmlyc3Rfc2FtcGxlXyA9IGN0dHNfZmlyc3Rfc2FtcGxlXyArIHNhbXBsZV9jb3VudDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU2hlbGxNUDRNYXA6OnN0Y29fSW5pdCgpIHsKLSAgRENIRUNLKHN0Y29fKTsKLSAgLy8gbG9hZCBvZmZzZXQgb2YgZmlyc3QgY2h1bmsgaW50byBjdXJyZW50X2NodW5rX29mZnNldF8KLSAgaWYgKHN0Y29fLT5HZXRFbnRyeUNvdW50KCkgPiAwKSB7Ci0gICAgY282NF8gPSBOVUxMOwotICAgIHJldHVybiBzdGNvXy0+UmVhZFUzMkVudHJ5SW50b1U2NCgwLCAmY3VycmVudF9jaHVua19vZmZzZXRfKTsKLSAgfQotCi0gIHN0Y29fID0gTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gVGhlIHN0c2MgdGFibGUgaGFzIHRoZSBmb2xsb3dpbmcgcGVyLWVudHJ5IGxheW91dDoKLS8vIHVpbnQzMiBmaXJzdCBjaHVuayBudW1iZXIgd2l0aCB0aGlzIHNhbXBsZSBjb3VudAotLy8gdWludDMyIHNhbXBsZXMtcGVyLWNodW5rCi0vLyB1aW50MzIgc2FtcGxlIGRlc2NyaXB0aW9uIGlkICh1bnVzZWQpCi1ib29sIFNoZWxsTVA0TWFwOjpzdHNjX0luaXQoKSB7Ci0gIERDSEVDSyhzdHNjXyk7Ci0gIC8vIHNldCB1cCB2ZWN0b3IgdG8gY29ycmVjdCBmaW5hbCBzaXplCi0gIGludCBjYWNoZV9zZWdtZW50cyA9Ci0gICAgICAoc3RzY18tPkdldEVudHJ5Q291bnQoKSAvIHN0c2NfLT5HZXRDYWNoZVNpemVFbnRyaWVzKCkpICsgMTsKLSAgc3RzY19zYW1wbGVfc3Vtc18ucmVzZXJ2ZShjYWNoZV9zZWdtZW50cyk7Ci0gIC8vIHRoZXJlIG11c3QgYWx3YXlzIGJlIGF0IGxlYXN0IDEgZW50cnkgaW4gYSB2YWxpZCBzdHNjIHRhYmxlCi0gIGlmIChzdHNjXy0+R2V0RW50cnlDb3VudCgpID4gMCkgewotICAgIHN0c2NfZmlyc3RfY2h1bmtfID0gMDsKLSAgICBzdHNjX2ZpcnN0X2NodW5rX3NhbXBsZV8gPSAwOwotICAgIC8vIGZpcnN0IGNhY2hlZCBlbnRyeSBpcyBhbHdheXMgMAotICAgIHN0c2Nfc2FtcGxlX3N1bXNfLnB1c2hfYmFjaygwKTsKLSAgICBpZiAoIXN0c2NfLT5SZWFkVTMyUGFpckVudHJ5KDAsIE5VTEwsICZzdHNjX3NhbXBsZXNfcGVyX2NodW5rXykpIHsKLSAgICAgIHN0c2NfID0gTlVMTDsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgLy8gbG9vayB1cCBuZXh0IGZpcnN0IGNodW5rIGF0IG5leHQgaW5kZXggaW4gdGFibGUKLSAgICBpZiAoc3RzY18tPkdldEVudHJ5Q291bnQoKSA+IDEpIHsKLSAgICAgIGlmICghc3RzY18tPlJlYWRVMzJQYWlyRW50cnkoMSwgJnN0c2NfbmV4dF9maXJzdF9jaHVua18sIE5VTEwpKSB7Ci0gICAgICAgIHN0c2NfID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgLS1zdHNjX25leHRfZmlyc3RfY2h1bmtfOwotICAgICAgc3RzY19uZXh0X2ZpcnN0X2NodW5rX3NhbXBsZV8gPQotICAgICAgICAgIHN0c2NfbmV4dF9maXJzdF9jaHVua18gKiBzdHNjX3NhbXBsZXNfcGVyX2NodW5rXzsKLSAgICB9IGVsc2UgewotICAgICAgLy8gZXZlcnkgY2h1bmsgaW4gdGhlIGZpbGUgaGFzIHRoZSBzYW1wbGUgc2FtcGxlIGNvdW50LCBzZXQgbmV4dCBmaXJzdAotICAgICAgLy8gY2h1bmsgdG8gaGlnaGVzdCB2YWxpZCBjaHVuayBudW1iZXIuCi0gICAgICBzdHNjX25leHRfZmlyc3RfY2h1bmtfID0gVUlOVDMyX01BWDsKLSAgICAgIHN0c2NfbmV4dF9maXJzdF9jaHVua19zYW1wbGVfID0gVUlOVDMyX01BWDsKLSAgICB9Ci0gICAgc3RzY190YWJsZV9pbmRleF8gPSAwOwotCi0gICAgLy8gc2luY2Ugd2Uga25vd24gdGhlIHNpemUgb2YgdGhlIGZpcnN0IGNodW5rIHdlIGNhbiBzZXQgbmV4dF9jaHVua19zYW1wbGVfCi0gICAgbmV4dF9jaHVua19zYW1wbGVfID0gc3RzY19zYW1wbGVzX3Blcl9jaHVua187Ci0KLSAgfSBlbHNlIHsKLSAgICBzdHNjXyA9IE5VTEw7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gVG8gZmluZCB0aGUgY2h1bmsgbnVtYmVyIG9mIGFuIGFicml0cmFyeSBzYW1wbGUgd2UgaGF2ZSB0byBzdW0gdGhlCi0vLyBzYW1wbGVzLXBlci1jaHVuayB2YWx1ZSBtdWx0aXBsaWVkIGJ5IHRoZSBudW1iZXIgb2YgY2h1bmtzIHdpdGggdGhhdCBzYW1wbGUKLS8vIGNvdW50IHVudGlsIHRoZSBzdW0gZXhjZWVkcyB0aGUgc2FtcGxlIG51bWJlciwgdGhlbiBjYWxjdWxhdGUgdGhlIGNodW5rCi0vLyBudW1iZXIgZnJvbSB0aGF0IHJhbmdlIG9mIHBlci1zYW1wbGUgY2h1bmsgc2l6ZXMuIFNpbmNlIHRoaXMgbWFwIGlzIG1lYW50Ci0vLyB0byBiZSBjb25zdW1lZCBpbmNyZW1lbnRhbGx5IGFuZCB3aXRoIG1pbmltYWwgbWVtb3J5IGNvbnN1bXB0aW9uIHdlIGNhbGN1bGF0ZQotLy8gdGhpcyBpbnRlZ3JhdGlvbiBzdGVwIG9ubHkgd2hlbiBuZWVkZWQsIGFuZCBzYXZlIHJlc3VsdHMgZm9yIGVhY2ggY2FjaGVkCi0vLyBwaWVjZSBvZiB0aGUgdGFibGUsIHRvIGF2b2lkIGhhdmluZyB0byByZWNhbGN1bGF0ZSBuZWVkZWQgZGF0YS4KLWJvb2wgU2hlbGxNUDRNYXA6OnN0c2NfQWR2YW5jZVRvU2FtcGxlKHVpbnQzMiBzYW1wbGVfbnVtYmVyKSB7Ci0gIERDSEVDSyhzdHNjXyk7Ci0gIC8vIHNhbXBsZV9udW1iZXIgY291bGQgYmUgYmVmb3JlIGZpcnN0IGNodW5rLCBtZWFuaW5nIHRoYXQgd2UgYXJlIHNlZWtpbmcKLSAgLy8gYmFja3dhcmRzIGFuZCBoYXZlIGxlZnQgdGhlIGN1cnJlbnQgY2h1bmsuIEZpbmQgdGhlIGNsb3Nlc3QgcGFydCBvZiB0aGUKLSAgLy8gY2FjaGVkIHRhYmxlIGFuZCBpbnRlZ3JhdGUgZm9yd2FyZCBmcm9tIHRoZXJlLgotICBpZiAoc2FtcGxlX251bWJlciA8IHN0c2NfZmlyc3RfY2h1bmtfc2FtcGxlXykgewotICAgIGlmICghc3RzY19TbGlwQ2FjaGVUb1NhbXBsZShzYW1wbGVfbnVtYmVyLCAwKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIC8vIHNhbXBsZV9udW1iZXIgY291bGQgYWxzbyBiZSB3ZWxsIGhlYWQgb2Ygb3VyIGN1cnJlbnQgcGllY2Ugb2YgdGhlCi0gIC8vIGNhY2hlLCBzbyBzZWUgaWYgd2UgY2FuIHJlLXVzZSBhbnkgcHJldmlvdXNseSBjYWxjdWxhdGVkIHN1bW1hdGlvbnMgdG8KLSAgLy8gc2tpcCB0byB0aGUgbmVhcmVzdCBjYWNoZSBlbnRyeQotICBpbnQgbmV4dF9jYWNoZV9pbmRleCA9IChzdHNjX3RhYmxlX2luZGV4XyAvIHN0c2NfLT5HZXRDYWNoZVNpemVFbnRyaWVzKCkpICsgMTsKLSAgaWYgKChuZXh0X2NhY2hlX2luZGV4IDwgc3RzY19zYW1wbGVfc3Vtc18uc2l6ZSgpKSAmJgotICAgICAgKHNhbXBsZV9udW1iZXIgPj0gc3RzY19zYW1wbGVfc3Vtc19bbmV4dF9jYWNoZV9pbmRleF0pKSB7Ci0gICAgaWYgKCFzdHNjX1NsaXBDYWNoZVRvU2FtcGxlKHNhbXBsZV9udW1iZXIsIG5leHRfY2FjaGVfaW5kZXgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLy8gSW50ZWdyYXRlIHRocm91Z2ggZWFjaCB0YWJsZSBlbnRyeSB1bnRpbCB3ZSBmaW5kIHNhbXBsZV9udW1iZXIgaW4gcmFuZ2UKLSAgd2hpbGUgKHN0c2NfbmV4dF9maXJzdF9jaHVua19zYW1wbGVfIDw9IHNhbXBsZV9udW1iZXIpIHsKLSAgICAvLyBhZHZhbmNlIHRvIG5leHQgY2h1bmsgc2FtcGxlIHJhbmdlCi0gICAgc3RzY19maXJzdF9jaHVua19zYW1wbGVfID0gc3RzY19uZXh0X2ZpcnN0X2NodW5rX3NhbXBsZV87Ci0gICAgLy8gb3VyIG5leHRfZmlyc3RfY2h1bmsgaXMgbm93IG91ciBmaXJzdCBjaHVuawotICAgIHN0c2NfZmlyc3RfY2h1bmtfID0gc3RzY19uZXh0X2ZpcnN0X2NodW5rXzsKLSAgICAvLyBhZHZhbmNlIHRvIG5leHQgZW50cnkgaW4gdGFibGUKLSAgICBzdHNjX3RhYmxlX2luZGV4XysrOwotICAgIC8vIGlmIHdlJ3ZlIGFkdmFuY2VkIHRvIGEgbmV3IHNlZ21lbnQgb2YgdGhlIGNhY2hlLCB1cGRhdGUgdGhlIHNhdmVkCi0gICAgLy8gaW50ZWdyYXRpb24gdmFsdWVzCi0gICAgaWYgKCEoc3RzY190YWJsZV9pbmRleF8gJSBzdHNjXy0+R2V0Q2FjaGVTaXplRW50cmllcygpKSkgewotICAgICAgaW50IGNhY2hlX2luZGV4ID0gc3RzY190YWJsZV9pbmRleF8gLyBzdHNjXy0+R2V0Q2FjaGVTaXplRW50cmllcygpOwotICAgICAgLy8gY2hlY2sgdGhhdCB0aGlzIGlzIG91ciBmaXJzdCB0aW1lIHdpdGggdGhlc2UgZGF0YQotICAgICAgaWYgKGNhY2hlX2luZGV4ID09IHN0c2Nfc2FtcGxlX3N1bXNfLnNpemUoKSkgewotICAgICAgICBzdHNjX3NhbXBsZV9zdW1zXy5wdXNoX2JhY2soc3RzY19maXJzdF9jaHVua19zYW1wbGVfKTsKLSAgICAgIH0KLSAgICAgIC8vIG91ciBpbnRlZ3JhdGlvbiBhdCB0aGlzIHBvaW50IHNob3VsZCBhbHdheXMgbWF0Y2ggYW55IHN0b3JlZCByZWNvcmQKLSAgICAgIERDSEVDS19FUShzdHNjX2ZpcnN0X2NodW5rX3NhbXBsZV8sIHN0c2Nfc2FtcGxlX3N1bXNfW2NhY2hlX2luZGV4XSk7Ci0gICAgfQotICAgIGlmIChzdHNjX3RhYmxlX2luZGV4XyA8IHN0c2NfLT5HZXRFbnRyeUNvdW50KCkpIHsKLSAgICAgIC8vIGxvb2sgdXAgb3VyIG5ldyBzYW1wbGUgcmF0ZQotICAgICAgaWYgKCFzdHNjXy0+UmVhZFUzMlBhaXJFbnRyeShzdHNjX3RhYmxlX2luZGV4XywgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0c2Nfc2FtcGxlc19wZXJfY2h1bmtfKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICAvLyB3ZSBuZWVkIHRvIGxvb2sgdXAgbmV4dCB0YWJsZSBlbnRyeSB0byBkZXRlcm1pbmUgbmV4dCBmaXJzdCBjaHVuawotICAgICAgaWYgKHN0c2NfdGFibGVfaW5kZXhfICsgMSA8IHN0c2NfLT5HZXRFbnRyeUNvdW50KCkpIHsKLSAgICAgICAgLy8gbG9vayB1cCBuZXh0IGZpcnN0IGNodW5rCi0gICAgICAgIGlmICghc3RzY18tPlJlYWRVMzJQYWlyRW50cnkoc3RzY190YWJsZV9pbmRleF8gKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHNjX25leHRfZmlyc3RfY2h1bmtfLCBOVUxMKSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAtLXN0c2NfbmV4dF9maXJzdF9jaHVua187Ci0gICAgICAgIC8vIGNhcnJ5IHN1bSBvZiBmaXJzdF9zYW1wbGVzIGZvcndhcmQgdG8gbmV4dCBjaHVuayByYW5nZQotICAgICAgICBzdHNjX25leHRfZmlyc3RfY2h1bmtfc2FtcGxlXyArPQotICAgICAgICAgICAgKHN0c2NfbmV4dF9maXJzdF9jaHVua18gLSBzdHNjX2ZpcnN0X2NodW5rXykgKgotICAgICAgICAgICAgc3RzY19zYW1wbGVzX3Blcl9jaHVua187Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyB0aGlzIGlzIHRoZSBub3JtYWwgcGxhY2UgdG8gZW5jb3VudGVyIHRoZSBlbmQgb2YgdGhlIGNodW5rIHRhYmxlLgotICAgICAgICAvLyBzZXQgdGhlIG5leHQgY2h1bmsgdG8gdGhlIGhpZ2hlc3QgdmFsaWQgY2h1bmsgbnVtYmVyCi0gICAgICAgIHN0c2NfbmV4dF9maXJzdF9jaHVua18gPSBVSU5UMzJfTUFYOwotICAgICAgICBzdHNjX25leHRfZmlyc3RfY2h1bmtfc2FtcGxlXyA9IFVJTlQzMl9NQVg7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFdlIHNob3VsZCBub3JtYWxseSBlbmNvdW50ZXIgdGhlIGVuZCBvZiB0aGUgY2h1bmsgdGFibGUgb24gbG9va3VwCi0gICAgICAvLyBvZiB0aGUgbmV4dF9maXJzdF9jaHVua18gd2l0aGluIHRoZSBpZiBjbGF1c2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMKLSAgICAgIC8vIGVsc2UuIFNvbWV0aGluZyBoYXMgZ29uZSB3cm9uZy4KLSAgICAgIE5PVFJFQUNIRUQoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU2hlbGxNUDRNYXA6OnN0c2NfU2xpcENhY2hlVG9TYW1wbGUodWludDMyIHNhbXBsZV9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGluZ19jYWNoZV9pbmRleCkgewotICBEQ0hFQ0tfTFQoc3RhcnRpbmdfY2FjaGVfaW5kZXgsIHN0c2Nfc2FtcGxlX3N1bXNfLnNpemUoKSk7Ci0gIC8vIGxvb2sgdGhyb3VnaCBvbGQgc2FtcGxlIHN1bXMgZm9yIHRoZSBmaXJzdCBlbnRyeSB0aGF0IGV4Y2VlZHMgc2FtcGxlCi0gIC8vIHNhbXBsZV9udW1iZXIsIHdlIHdhbnQgdGhlIGVudHJ5IHJpZ2h0IGJlZm9yZSB0aGF0Ci0gIGludCBjYWNoZV9pbmRleCA9IHN0YXJ0aW5nX2NhY2hlX2luZGV4OwotICBmb3IgKDsgY2FjaGVfaW5kZXggKyAxIDwgc3RzY19zYW1wbGVfc3Vtc18uc2l6ZSgpOyBjYWNoZV9pbmRleCsrKSB7Ci0gICAgaWYgKHNhbXBsZV9udW1iZXIgPCBzdHNjX3NhbXBsZV9zdW1zX1tjYWNoZV9pbmRleCArIDFdKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgLy8ganVtcCB0byBuZXcgc3BvdCBpbiB0YWJsZQotICBzdHNjX2ZpcnN0X2NodW5rX3NhbXBsZV8gPSBzdHNjX3NhbXBsZV9zdW1zX1tjYWNoZV9pbmRleF07Ci0gIHN0c2NfdGFibGVfaW5kZXhfID0gY2FjaGVfaW5kZXggKiBzdHNjXy0+R2V0Q2FjaGVTaXplRW50cmllcygpOwotICBpZiAoIXN0c2NfLT5SZWFkVTMyUGFpckVudHJ5KHN0c2NfdGFibGVfaW5kZXhfLCAmc3RzY19maXJzdF9jaHVua18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0c2Nfc2FtcGxlc19wZXJfY2h1bmtfKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBsb2FkIGN1cnJlbnQgYW5kIG5leHQgdmFsdWVzCi0gIC0tc3RzY19maXJzdF9jaHVua187Ci0gIGlmIChzdHNjX3RhYmxlX2luZGV4XyArIDEgPCBzdHNjXy0+R2V0RW50cnlDb3VudCgpKSB7Ci0gICAgaWYgKCFzdHNjXy0+UmVhZFUzMlBhaXJFbnRyeShzdHNjX3RhYmxlX2luZGV4XyArIDEsICZzdHNjX25leHRfZmlyc3RfY2h1bmtfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgLS1zdHNjX25leHRfZmlyc3RfY2h1bmtfOwotICAgIHN0c2NfbmV4dF9maXJzdF9jaHVua19zYW1wbGVfID0KLSAgICAgICAgc3RzY19maXJzdF9jaHVua19zYW1wbGVfICsKLSAgICAgICAgKChzdHNjX25leHRfZmlyc3RfY2h1bmtfIC0gc3RzY19maXJzdF9jaHVua18pICoKLSAgICAgICAgIHN0c2Nfc2FtcGxlc19wZXJfY2h1bmtfKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBXZSBzZWVtIHRvIGhhdmUgY2FjaGVkIGFuIGVudHJ5IDEgZW50cnkgYmVmb3JlIGVuZCBvZiB0aGUgdGFibGUsIGFuZAotICAgIC8vIGFyZSBzZWVraW5nIHRvIGEgcmVnaW9uIGNvbnRhaW5lZCBpbiB0aGF0IGxhc3QgZW50cnkgaW4gdGhlIHRhYmxlLgotICAgIHN0c2NfbmV4dF9maXJzdF9jaHVua18gPSBVSU5UMzJfTUFYOwotICAgIHN0c2NfbmV4dF9maXJzdF9jaHVua19zYW1wbGVfID0gVUlOVDMyX01BWDsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gc3RzcyBpcyBhIGxpc3Qgb2Ygc2FtcGxlIG51bWJlcnMgdGhhdCBhcmUga2V5ZnJhbWVzLgotYm9vbCBTaGVsbE1QNE1hcDo6c3Rzc19Jbml0KCkgewotICBpbnQgY2FjaGVfc2VnbWVudHMgPQotICAgICAgKHN0c3NfLT5HZXRFbnRyeUNvdW50KCkgLyBzdHNzXy0+R2V0Q2FjaGVTaXplRW50cmllcygpKSArIDE7Ci0gIHN0c3Nfa2V5ZnJhbWVzXy5yZXNlcnZlKGNhY2hlX3NlZ21lbnRzKTsKLSAgLy8gZW1wdHkgc3RzcyBtZWFucyBldmVyeSBmcmFtZSBpcyBhIGtleWZyYW1lLCBzYW1lIGFzIG5vdAotICAvLyBwcm92aWRpbmcgb25lCi0gIGlmIChzdHNzXy0+R2V0RW50cnlDb3VudCgpID4gMCkgewotICAgIC8vIGlkZW50aWZ5IGZpcnN0IGtleWZyYW1lIGZyb20gZmlyc3QgZW50cnkgaW4gc3RzcwotICAgIGlmICghc3Rzc18tPlJlYWRVMzJFbnRyeSgwLCAmc3Rzc19sYXN0X2tleWZyYW1lXykpIHsKLSAgICAgIHN0c3NfID0gTlVMTDsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgLS1zdHNzX2xhc3Rfa2V5ZnJhbWVfOwotICAgIHN0c3Nfa2V5ZnJhbWVzXy5wdXNoX2JhY2soc3Rzc19sYXN0X2tleWZyYW1lXyk7Ci0gICAgc3Rzc19uZXh0X2tleWZyYW1lXyA9IHN0c3NfbGFzdF9rZXlmcmFtZV87Ci0gICAgc3Rzc190YWJsZV9pbmRleF8gPSAwOwotICB9IGVsc2UgewotICAgIHN0c3NfID0gTlVMTDsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vLyBhZHZhbmNlIGJ5IG9uZSB0YWJsZSBlbnRyeSB0aHJvdWdoIHN0c3MsIHVwZGF0aW5nIGNhY2hlIGlmIG5lY2Vzc2FyeQotYm9vbCBTaGVsbE1QNE1hcDo6c3Rzc19BZHZhbmNlU3RlcCgpIHsKLSAgRENIRUNLKHN0c3NfKTsKLSAgc3Rzc19sYXN0X2tleWZyYW1lXyA9IHN0c3NfbmV4dF9rZXlmcmFtZV87Ci0gIHN0c3NfdGFibGVfaW5kZXhfKys7Ci0gIGlmIChzdHNzX3RhYmxlX2luZGV4XyA8IHN0c3NfLT5HZXRFbnRyeUNvdW50KCkpIHsKLSAgICBpZiAoIXN0c3NfLT5SZWFkVTMyRW50cnkoc3Rzc190YWJsZV9pbmRleF8sICZzdHNzX25leHRfa2V5ZnJhbWVfKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAtLXN0c3NfbmV4dF9rZXlmcmFtZV87Ci0gICAgaWYgKCEoc3Rzc190YWJsZV9pbmRleF8gJSBzdHNzXy0+R2V0Q2FjaGVTaXplRW50cmllcygpKSkgewotICAgICAgaW50IGNhY2hlX2luZGV4ID0gc3Rzc190YWJsZV9pbmRleF8gLyBzdHNzXy0+R2V0Q2FjaGVTaXplRW50cmllcygpOwotICAgICAgLy8gb25seSBhZGQgaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSd2ZSBlbmNvdW50ZXJlZCB0aGlzIG51bWJlcgotICAgICAgaWYgKGNhY2hlX2luZGV4ID09IHN0c3Nfa2V5ZnJhbWVzXy5zaXplKCkpIHsKLSAgICAgICAgc3Rzc19rZXlmcmFtZXNfLnB1c2hfYmFjayhzdHNzX25leHRfa2V5ZnJhbWVfKTsKLSAgICAgIH0KLSAgICAgIERDSEVDS19FUShzdHNzX25leHRfa2V5ZnJhbWVfLCBzdHNzX2tleWZyYW1lc19bY2FjaGVfaW5kZXhdKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgc3Rzc19uZXh0X2tleWZyYW1lXyA9IFVJTlQzMl9NQVg7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU2hlbGxNUDRNYXA6OnN0c3NfRmluZE5lYXJlc3RLZXlmcmFtZSh1aW50MzIgc2FtcGxlX251bWJlcikgewotICBEQ0hFQ0soc3Rzc18pOwotICAvLyBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlcmUncyBhdCBsZWFzdCBvbmUgY2FjaGUgZW50cnkgY3JlYXRlZCBieQotICAvLyBzdHNzX0luaXQoKTsKLSAgRENIRUNLX0dUKHN0c3Nfa2V5ZnJhbWVzXy5zaXplKCksIDApOwotICBpbnQgY2FjaGVfZW50cnlfbnVtYmVyID0gc3Rzc19rZXlmcmFtZXNfLnNpemUoKSAtIDE7Ci0gIGludCB0b3RhbF9jYWNoZV9lbnRyaWVzID0KLSAgICAgIChzdHNzXy0+R2V0RW50cnlDb3VudCgpICsgc3Rzc18tPkdldENhY2hlU2l6ZUVudHJpZXMoKSAtIDEpIC8KLSAgICAgIHN0c3NfLT5HZXRDYWNoZVNpemVFbnRyaWVzKCk7Ci0gIC8vIGlmIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZSBjYWNoZSBlbnRyeSB3ZSBjYW4gc2VhcmNoIHRoZSBjYWNoZWQKLSAgLy8gZW50cmllcyBmb3IgdGhlIGVudHJ5IGNvbnRhaW5pbmcgb3VyIGtleWZyYW1lLCBvdGhlcndpc2Ugd2Ugc2tpcAotICAvLyBkaXJlY3RseSB0byB0aGUgYmluYXJ5IHNlYXJjaCBvZiB0aGUgc2luZ2xlIGNhY2hlZCBlbnRyeQotICBpZiAodG90YWxfY2FjaGVfZW50cmllcyA+IDEpIHsKLSAgICAvLyBpZiB0aGUgc2FtcGxlIG51bWJlciByZXNpZGVzIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgY2FjaGVkIGVudHJpZXMKLSAgICAvLyB3ZSBzZWFyY2ggdGhvc2UgdG8gZmluZCByaWdodCB0YWJsZSBjYWNoZSBlbnRyeSB0byBsb2FkCi0gICAgaWYgKHNhbXBsZV9udW1iZXIgPCBzdHNzX2tleWZyYW1lc19bY2FjaGVfZW50cnlfbnVtYmVyXSkgewotICAgICAgaW50IGxvd2VyX2JvdW5kID0gMDsKLSAgICAgIGludCB1cHBlcl9ib3VuZCA9IHN0c3Nfa2V5ZnJhbWVzXy5zaXplKCk7Ci0gICAgICAvLyBiaW5hcnkgc2VhcmNoIHRvIGZpbmQgcmFuZ2UKLSAgICAgIHdoaWxlIChsb3dlcl9ib3VuZCA8PSB1cHBlcl9ib3VuZCkgewotICAgICAgICBjYWNoZV9lbnRyeV9udW1iZXIgPSBsb3dlcl9ib3VuZCArICgodXBwZXJfYm91bmQgLSBsb3dlcl9ib3VuZCkgLyAyKTsKLSAgICAgICAgaWYgKHNhbXBsZV9udW1iZXIgPCBzdHNzX2tleWZyYW1lc19bY2FjaGVfZW50cnlfbnVtYmVyXSkgewotICAgICAgICAgIHVwcGVyX2JvdW5kID0gY2FjaGVfZW50cnlfbnVtYmVyIC0gMTsKLSAgICAgICAgfSBlbHNlIHsgIC8vIHNhbXBsZV9udW1iZXIgPj0gc3Rzc19rZXlmcmFtZXNfW2NhY2hlX2VudHJ5X251bWJlcl0KLSAgICAgICAgICAvLyBpZiB3ZSBhcmUgYXQgZW5kIG9mIGxpc3Qgb3IgbmV4dCBjYWNoZSBlbnRyeSBpcyBoaWdoZXIgdGhhbiBzYW1wbGUKLSAgICAgICAgICAvLyBudW1iZXIgd2UgY29uc2lkZXIgaXQgYSBtYXRjaAotICAgICAgICAgIGlmIChjYWNoZV9lbnRyeV9udW1iZXIgPT0gc3Rzc19rZXlmcmFtZXNfLnNpemUoKSAtIDEgfHwKLSAgICAgICAgICAgICAgc2FtcGxlX251bWJlciA8IHN0c3Nfa2V5ZnJhbWVzX1tjYWNoZV9lbnRyeV9udW1iZXIgKyAxXSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGxvd2VyX2JvdW5kID0gY2FjaGVfZW50cnlfbnVtYmVyICsgMTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvLyBXZSd2ZSBnb3R0ZW4gYXMgY2xvc2UgYXMgd2UgY2FuIHVzaW5nIHRoZSBjYWNoZWQgdmFsdWVzIGFuZCBtdXN0IGhhbmRsZQotICAgIC8vIHR3byBjYXNlcy4gKGEpIGlzIHRoYXQgd2Uga25vdyB0aGF0IHNhbXBsZV9udW1iZXIgaXMgY29udGFpbmVkIGluIHRoZQotICAgIC8vIGNhY2hlX2VudHJ5X251bWJlciwgYmVjYXVzZSB3ZSBrbm93IHRoYXQ6Ci0gICAgLy8gc3R0c19rZXlmcmFtZXNfW2NhY2hlX2VudHJ5X251bWJlcl0gPD0gc2FtcGxlX251bWJlciA8Ci0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHRzX2tleWZyYW1lc19bY2FjaGVfZW50cnlfbnVtYmVyICsgMV0KLSAgICAvLyAoYikgaXMgdGhhdCB3ZSBvbmx5IGtub3c6Ci0gICAgLy8gc3R0c19rZXlmcmFtZXNfW3N0dHNfa2V5ZnJhbWVzXy5zaXplKCkgLSAxXSA8PSBzYW1wbGVfbnVtYmVyCi0gICAgLy8gYmVjYXVzZSB3ZSBoYXZlIG5vdCBjYWNoZWQgYW4gdXBwZXIgYm91bmQgdG8gc2FtcGxlX251bWJlci4KLSAgICAvLyBGaXJzdCBzdGVwIGlzIHRvIG1ha2UgKGIpIGluIHRvIChhKSBieSBhZHZhbmNpbmcgdGhyb3VnaCBjYWNoZSBlbnRyaWVzCi0gICAgLy8gdW50aWwgbGFzdCB0YWJsZSBlbnRyeSBpbiBjYWNoZSA+IHNhbXBsZV9udW1iZXIgb3IgdW50aWwgd2UgYXJyaXZlCi0gICAgLy8gYXQgdGhlIGNhY2hlIGVudHJ5IGluIHRoZSB0YWJsZS4KLSAgICB3aGlsZSAoKGNhY2hlX2VudHJ5X251bWJlciA9PSBzdHNzX2tleWZyYW1lc18uc2l6ZSgpIC0gMSkgJiYKLSAgICAgICAgICAgY2FjaGVfZW50cnlfbnVtYmVyIDwgdG90YWxfY2FjaGVfZW50cmllcyAtIDEpIHsKLSAgICAgIC8vIFVzZSB0aGUgZmlyc3Qga2V5IGZyYW1lIGluIG5leHQgY2FjaGUgYXMgdXBwZXIgYm91bmQuCi0gICAgICBpbnQgbmV4dF9jYWNoZWRfZW50cnlfbnVtYmVyID0KLSAgICAgICAgICAoY2FjaGVfZW50cnlfbnVtYmVyICsgMSkgKiBzdHNzXy0+R2V0Q2FjaGVTaXplRW50cmllcygpOwotICAgICAgdWludDMyIG5leHRfY2FjaGVkX2tleWZyYW1lOwotICAgICAgaWYgKCFzdHNzXy0+UmVhZFUzMkVudHJ5KG5leHRfY2FjaGVkX2VudHJ5X251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV4dF9jYWNoZWRfa2V5ZnJhbWUpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIC0tbmV4dF9jYWNoZWRfa2V5ZnJhbWU7Ci0gICAgICAvLyBpZiB0aGlzIGtleWZyYW1lIGlzIGhpZ2hlciB0aGFuIG91ciBzYW1wbGUgbnVtYmVyIHdlJ3JlIGluIHRoZSByaWdodAotICAgICAgLy8gdGFibGUsIHN0b3AKLSAgICAgIGlmIChzYW1wbGVfbnVtYmVyIDwgbmV4dF9jYWNoZWRfa2V5ZnJhbWUpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAvLyBvaywgd2UgbmVlZCB0byBsb29rIGluIHRvIHRoZSBuZXh0IGNhY2hlIGVudHJ5LCBhZHZhbmNlCi0gICAgICBjYWNoZV9lbnRyeV9udW1iZXIrKzsKLSAgICAgIGludCBmaXJzdF90YWJsZV9lbnRyeV9udW1iZXIgPQotICAgICAgICAgIGNhY2hlX2VudHJ5X251bWJlciAqIHN0c3NfLT5HZXRDYWNoZVNpemVFbnRyaWVzKCk7Ci0gICAgICB1aW50MzIgZmlyc3Rfa2V5ZnJhbWVfaW5fY2FjaGVfZW50cnk7Ci0gICAgICBpZiAoIXN0c3NfLT5SZWFkVTMyRW50cnkoZmlyc3RfdGFibGVfZW50cnlfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaXJzdF9rZXlmcmFtZV9pbl9jYWNoZV9lbnRyeSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgLS1maXJzdF9rZXlmcmFtZV9pbl9jYWNoZV9lbnRyeTsKLSAgICAgIC8vIHNhdmUgZmlyc3QgZW50cnkgaW4ga2V5ZnJhbWUgY2FjaGUKLSAgICAgIHN0c3Nfa2V5ZnJhbWVzXy5wdXNoX2JhY2soZmlyc3Rfa2V5ZnJhbWVfaW5fY2FjaGVfZW50cnkpOwotICAgIH0KLSAgICAvLyBtYWtlIHN1cmUgd2UgaGF2ZSBhbiB1cHBlciBib3VuZAotICAgIGlmIChjYWNoZV9lbnRyeV9udW1iZXIgIT0gdG90YWxfY2FjaGVfZW50cmllcyAtIDEgJiYKLSAgICAgICAgY2FjaGVfZW50cnlfbnVtYmVyID09IHN0c3Nfa2V5ZnJhbWVzXy5zaXplKCkgLSAxKSB7Ci0gICAgICBpbnQgbmV4dF9jYWNoZWRfZW50cnlfbnVtYmVyID0KLSAgICAgICAgICAoKGNhY2hlX2VudHJ5X251bWJlciArIDEpICogc3Rzc18tPkdldENhY2hlU2l6ZUVudHJpZXMoKSk7Ci0gICAgICB1aW50MzIgbmV4dF9jYWNoZWRfa2V5ZnJhbWU7Ci0gICAgICBpZiAoIXN0c3NfLT5SZWFkVTMyRW50cnkobmV4dF9jYWNoZWRfZW50cnlfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXh0X2NhY2hlZF9rZXlmcmFtZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgLS1uZXh0X2NhY2hlZF9rZXlmcmFtZTsKLSAgICAgIHN0c3Nfa2V5ZnJhbWVzXy5wdXNoX2JhY2sobmV4dF9jYWNoZWRfa2V5ZnJhbWUpOwotICAgIH0KLSAgICAvLyBvaywgbm93IHdlIGFzc3VtZSB3ZSBhcmUgaW4gc3RhdGUgKGEpLCBhbmQgdGhhdCB3ZSdyZSBlaXRoZXIKLSAgICAvLyBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZSBvciB3aXRoaW4gdGhlIGNhY2hlIGVudHJ5IGJvdW5kcyBmb3Igb3VyCi0gICAgLy8gc2FtcGxlIG51bWJlcgotICAgIERDSEVDSyhzdHNzX2tleWZyYW1lc19bY2FjaGVfZW50cnlfbnVtYmVyXSA8PSBzYW1wbGVfbnVtYmVyICYmCi0gICAgICAgICAgIChjYWNoZV9lbnRyeV9udW1iZXIgPT0gdG90YWxfY2FjaGVfZW50cmllcyAtIDEgfHwKLSAgICAgICAgICAgIHNhbXBsZV9udW1iZXIgPCBzdHNzX2tleWZyYW1lc19bY2FjaGVfZW50cnlfbnVtYmVyICsgMV0pKTsKLSAgfQotICAvLyBiaW5hcnkgc2VhcmNoIHdpdGhpbiBzdHNzIGNhY2hlIGVudHJ5IGZvciBrZXlmcmFtZXMgYm91bmRpbmcgc2FtcGxlX251bWJlcgotICBpbnQgbG93ZXJfYm91bmQgPSBjYWNoZV9lbnRyeV9udW1iZXIgKiBzdHNzXy0+R2V0Q2FjaGVTaXplRW50cmllcygpOwotICBpbnQgdXBwZXJfYm91bmQgPSBzdGQ6Om1pbihsb3dlcl9ib3VuZCArIHN0c3NfLT5HZXRDYWNoZVNpemVFbnRyaWVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0c3NfLT5HZXRFbnRyeUNvdW50KCkpOwotCi0gIHdoaWxlIChsb3dlcl9ib3VuZCA8PSB1cHBlcl9ib3VuZCkgewotICAgIHN0c3NfdGFibGVfaW5kZXhfID0gbG93ZXJfYm91bmQgKyAoKHVwcGVyX2JvdW5kIC0gbG93ZXJfYm91bmQpIC8gMik7Ci0gICAgaWYgKCFzdHNzXy0+UmVhZFUzMkVudHJ5KHN0c3NfdGFibGVfaW5kZXhfLCAmc3Rzc19sYXN0X2tleWZyYW1lXykpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgLS1zdHNzX2xhc3Rfa2V5ZnJhbWVfOwotICAgIGlmIChzYW1wbGVfbnVtYmVyIDwgc3Rzc19sYXN0X2tleWZyYW1lXykgewotICAgICAgdXBwZXJfYm91bmQgPSBzdHNzX3RhYmxlX2luZGV4XyAtIDE7Ci0gICAgfSBlbHNlIHsgIC8vIHNhbXBsZV9udW1iZXIgPj0gbGFzdF9rZXlmcmFtZQotICAgICAgbG93ZXJfYm91bmQgPSBzdHNzX3RhYmxlX2luZGV4XyArIDE7Ci0gICAgICAvLyBpZiB0aGlzIGlzIHRoZSBsYXN0IGVudHJ5IGluIHRoZSB0YWJsZSwgd2UgY2FuIHN0b3AgaGVyZS4KLSAgICAgIGlmIChsb3dlcl9ib3VuZCA9PSBzdHNzXy0+R2V0RW50cnlDb3VudCgpKSB7Ci0gICAgICAgIHN0c3NfbmV4dF9rZXlmcmFtZV8gPSBVSU5UMzJfTUFYOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIC8vIGxvYWQgbmV4dCBlbnRyeSBpbiB0YWJsZSwgc2VlIGlmIHdlIGFjdHVhbGx5IGZvdW5kIHRoZSB1cHBlciBib3VuZAotICAgICAgaWYgKCFzdHNzXy0+UmVhZFUzMkVudHJ5KGxvd2VyX2JvdW5kLCAmc3Rzc19uZXh0X2tleWZyYW1lXykpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgLS1zdHNzX25leHRfa2V5ZnJhbWVfOwotICAgICAgaWYgKHNhbXBsZV9udW1iZXIgPCBzdHNzX25leHRfa2V5ZnJhbWVfKSB7Ci0gICAgICAgIHN0c3NfdGFibGVfaW5kZXhfID0gbG93ZXJfYm91bmQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gc2FtcGxlX251bWJlciA+PSBzdHNzX2xhc3Rfa2V5ZnJhbWVfICYmCi0gICAgICAgICBzYW1wbGVfbnVtYmVyIDwgc3Rzc19uZXh0X2tleWZyYW1lXzsKLX0KLQotLy8gVGhlIHN0dHMgdGFibGUgaGFzIHRoZSBmb2xsb3dpbmcgcGVyLWVudHJ5IGxheW91dDoKLS8vIHVpbnQzMiBzYW1wbGUgY291bnQgLSBudW1iZXIgb2Ygc2VxdWVudGlhbCBzYW1wbGVzIHdpdGggdGhpcyBkdXJhdGlvbgotLy8gdWludDMyIHNhbXBsZSBkdXJhdGlvbiAtIGR1cmF0aW9uIGluIHRpY2tzIG9mIHRoaXMgc2FtcGxlIHJhbmdlCi1ib29sIFNoZWxsTVA0TWFwOjpzdHRzX0luaXQoKSB7Ci0gIGludCBjYWNoZV9zZWdtZW50cyA9Ci0gICAgICAoc3R0c18tPkdldEVudHJ5Q291bnQoKSAvIHN0dHNfLT5HZXRDYWNoZVNpemVFbnRyaWVzKCkpICsgMTsKLSAgc3R0c19zYW1wbGVzXy5yZXNlcnZlKGNhY2hlX3NlZ21lbnRzKTsKLSAgc3R0c190aW1lc3RhbXBzXy5yZXNlcnZlKGNhY2hlX3NlZ21lbnRzKTsKLSAgLy8gbmVlZCBhdCBsZWFzdCBvbmUgZW50cnkgaW4gdmFsaWQgc3R0cwotICBpZiAoc3R0c18tPkdldEVudHJ5Q291bnQoKSA+IDApIHsKLSAgICAvLyBpbnRlZ3JhdGlvbiBzdGFydHMgYXQgMCBmb3IgYm90aCBjYWNoZSBlbnRyaWVzCi0gICAgc3R0c19zYW1wbGVzXy5wdXNoX2JhY2soMCk7Ci0gICAgc3R0c190aW1lc3RhbXBzXy5wdXNoX2JhY2soMCk7Ci0gICAgaWYgKCFzdHRzXy0+UmVhZFUzMlBhaXJFbnRyeSgwLCAmc3R0c19uZXh0X2ZpcnN0X3NhbXBsZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3R0c19zYW1wbGVfZHVyYXRpb25fKSkgewotICAgICAgc3R0c18gPSBOVUxMOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBzdHRzX2ZpcnN0X3NhbXBsZV8gPSAwOwotICAgIHN0dHNfZmlyc3Rfc2FtcGxlX3RpbWVfID0gMDsKLSAgICBzdHRzX25leHRfZmlyc3Rfc2FtcGxlX3RpbWVfID0KLSAgICAgICAgc3R0c19uZXh0X2ZpcnN0X3NhbXBsZV8gKiBzdHRzX3NhbXBsZV9kdXJhdGlvbl87Ci0gICAgc3R0c190YWJsZV9pbmRleF8gPSAwOwotICB9IGVsc2UgewotICAgIHN0dHNfID0gTlVMTDsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFNoZWxsTVA0TWFwOjpzdHRzX0FkdmFuY2VUb1NhbXBsZSh1aW50MzIgc2FtcGxlX251bWJlcikgewotICBEQ0hFQ0soc3R0c18pOwotICAvLyBzYW1wbGVfbnVtYmVyIGNvdWxkIGJlIGJlZm9yZSBvdXIgY3VycmVudCBzYW1wbGUgcmFuZ2UsIGluIHdoaWNoIGNhc2UKLSAgLy8gd2Ugc2tpcCB0byB0aGUgbmVhcmVzdCB0YWJsZSBlbnRyeSBiZWZvcmUgc2FtcGxlX251bWJlciBhbmQgaW50ZWdyYXRlCi0gIC8vIGZvcndhcmQgdG8gdGhlIHNhbXBsZV9udW1iZXIgYWdhaW4uCi0gIGlmIChzYW1wbGVfbnVtYmVyIDwgc3R0c19maXJzdF9zYW1wbGVfKSB7Ci0gICAgaWYgKCFzdHRzX1NsaXBDYWNoZVRvU2FtcGxlKHNhbXBsZV9udW1iZXIsIDApKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLy8gc2FtcGxlIG51bWJlciBjb3VsZCBhbHNvIGJlIHdlbGwgYWhlYWQgb2YgdGhpcyBjYWNoZSBzZWdtZW50LCBpZiB3ZSd2ZQotICAvLyBwcmV2aW91c2x5IGNhbGN1bGF0ZWQgc3VtbWF0aW9ucyBhaGVhZCBsZXQncyBza2lwIHRvIHRoZSBjb3JyZWN0IG9uZQotICBpbnQgbmV4dF9jYWNoZV9pbmRleCA9IChzdHRzX3RhYmxlX2luZGV4XyAvIHN0dHNfLT5HZXRDYWNoZVNpemVFbnRyaWVzKCkpICsgMTsKLSAgaWYgKChuZXh0X2NhY2hlX2luZGV4IDwgc3R0c19zYW1wbGVzXy5zaXplKCkpICYmCi0gICAgICAoc2FtcGxlX251bWJlciA+PSBzdHRzX3NhbXBsZXNfW25leHRfY2FjaGVfaW5kZXhdKSkgewotICAgIGlmICghc3R0c19TbGlwQ2FjaGVUb1NhbXBsZShzYW1wbGVfbnVtYmVyLCBuZXh0X2NhY2hlX2luZGV4KSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIC8vIGludGVncmF0ZSB0aHJvdWdoIHRoZSBzdHRzIHVudGlsIHNhbXBsZV9udW1iZXIgaXMgd2l0aGluIGN1cnJlbnQgcmFuZ2UKLSAgd2hpbGUgKHN0dHNfbmV4dF9maXJzdF9zYW1wbGVfIDw9IHNhbXBsZV9udW1iZXIpIHsKLSAgICBpZiAoIXN0dHNfSW50ZWdyYXRlU3RlcCgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBNb3ZlIG91ciBpbnRlZ3JhdGlvbiBzdGVwcyB0byBhIHByZXZpb3VzbHkgc2F2ZWQgZW50cnkgaW4gdGhlIGNhY2hlIHRhYmxlcy4KLS8vIFNlYXJjaGVzIGxpbmVhcmx5IHRocm91Z2ggdGhlIHZlY3RvciBvZiBvbGQgY2FjaGVkIHZhbHVlcywgc28gY2FuIGFjY2VwdCBhCi0vLyBzdGFydGluZyBpbmRleCB0byBkbyB0aGUgc2VhcmNoIGZyb20uCi1ib29sIFNoZWxsTVA0TWFwOjpzdHRzX1NsaXBDYWNoZVRvU2FtcGxlKHVpbnQzMiBzYW1wbGVfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRpbmdfY2FjaGVfaW5kZXgpIHsKLSAgRENIRUNLX0xUKHN0YXJ0aW5nX2NhY2hlX2luZGV4LCBzdHRzX3NhbXBsZXNfLnNpemUoKSk7Ci0gIGludCBjYWNoZV9pbmRleCA9IHN0YXJ0aW5nX2NhY2hlX2luZGV4OwotICBmb3IgKDsgY2FjaGVfaW5kZXggKyAxIDwgc3R0c19zYW1wbGVzXy5zaXplKCk7IGNhY2hlX2luZGV4KyspIHsKLSAgICBpZiAoc2FtcGxlX251bWJlciA8IHN0dHNfc2FtcGxlc19bY2FjaGVfaW5kZXggKyAxXSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHN0dHNfZmlyc3Rfc2FtcGxlXyA9IHN0dHNfc2FtcGxlc19bY2FjaGVfaW5kZXhdOwotICBzdHRzX2ZpcnN0X3NhbXBsZV90aW1lXyA9IHN0dHNfdGltZXN0YW1wc19bY2FjaGVfaW5kZXhdOwotICBzdHRzX3RhYmxlX2luZGV4XyA9IGNhY2hlX2luZGV4ICogc3R0c18tPkdldENhY2hlU2l6ZUVudHJpZXMoKTsKLSAgdWludDMyIHNhbXBsZV9jb3VudDsKLSAgLy8gcmVhZCBzYW1wbGUgY291bnQgYW5kIGR1cmF0aW9uIHRvIHNldCBuZXh0IHZhbHVlcwotICBpZiAoIXN0dHNfLT5SZWFkVTMyUGFpckVudHJ5KHN0dHNfdGFibGVfaW5kZXhfLCAmc2FtcGxlX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHRzX3NhbXBsZV9kdXJhdGlvbl8pKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHN0dHNfbmV4dF9maXJzdF9zYW1wbGVfID0gc3R0c19maXJzdF9zYW1wbGVfICsgc2FtcGxlX2NvdW50OwotICBzdHRzX25leHRfZmlyc3Rfc2FtcGxlX3RpbWVfID0KLSAgICAgIHN0dHNfZmlyc3Rfc2FtcGxlX3RpbWVfICsgKHNhbXBsZV9jb3VudCAqIHN0dHNfc2FtcGxlX2R1cmF0aW9uXyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFNoZWxsTVA0TWFwOjpzdHRzX0FkdmFuY2VUb1RpbWUodWludDY0IHRpbWVzdGFtcCkgewotICBEQ0hFQ0soc3R0c18pOwotCi0gIGlmICh0aW1lc3RhbXAgPCBzdHRzX2ZpcnN0X3NhbXBsZV90aW1lXykgewotICAgIGlmICghc3R0c19TbGlwQ2FjaGVUb1RpbWUodGltZXN0YW1wLCAwKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIC8vIHNhbXBsZSBudW1iZXIgY291bGQgYWxzbyBiZSB3ZWxsIGFoZWFkIG9mIHRoaXMgY2FjaGUgc2VnbWVudCwgaWYgd2UndmUKLSAgLy8gcHJldmlvdXNseSBjYWxjdWxhdGVkIHN1bW1hdGlvbnMgYWhlYWQgbGV0J3Mgc2tpcCB0byB0aGUgY29ycmVjdCBvbmUKLSAgaW50IG5leHRfY2FjaGVfaW5kZXggPSAoc3R0c190YWJsZV9pbmRleF8gLyBzdHRzXy0+R2V0Q2FjaGVTaXplRW50cmllcygpKSArIDE7Ci0gIGlmICgobmV4dF9jYWNoZV9pbmRleCA8IHN0dHNfdGltZXN0YW1wc18uc2l6ZSgpKSAmJgotICAgICAgKHRpbWVzdGFtcCA+PSBzdHRzX3RpbWVzdGFtcHNfW25leHRfY2FjaGVfaW5kZXhdKSkgewotICAgIGlmICghc3R0c19TbGlwQ2FjaGVUb1RpbWUodGltZXN0YW1wLCBuZXh0X2NhY2hlX2luZGV4KSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIC8vIGludGVncmF0ZSB0aHJvdWdoIHRoZSBzdHRzIHVudGlsIHNhbXBsZV9udW1iZXIgaXMgd2l0aGluIGN1cnJlbnQgcmFuZ2UKLSAgd2hpbGUgKHN0dHNfbmV4dF9maXJzdF9zYW1wbGVfdGltZV8gPD0gdGltZXN0YW1wKSB7Ci0gICAgaWYgKCFzdHRzX0ludGVncmF0ZVN0ZXAoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTaGVsbE1QNE1hcDo6c3R0c19JbnRlZ3JhdGVTdGVwKCkgewotICAvLyBhZHZhbmNlIHRpbWUgdG8gbmV4dCBzYW1wbGUgcmFuZ2UKLSAgdWludDMyIHJhbmdlX3NpemUgPSBzdHRzX25leHRfZmlyc3Rfc2FtcGxlXyAtIHN0dHNfZmlyc3Rfc2FtcGxlXzsKLSAgc3R0c19maXJzdF9zYW1wbGVfdGltZV8gKz0gKHJhbmdlX3NpemUgKiBzdHRzX3NhbXBsZV9kdXJhdGlvbl8pOwotICAvLyBhZHZhbmNlIHNhbXBsZSBjb3VudGVyIHRvIG5leHQgcmFuZ2UKLSAgc3R0c19maXJzdF9zYW1wbGVfID0gc3R0c19uZXh0X2ZpcnN0X3NhbXBsZV87Ci0gIC8vIGJ1bXAgdGFibGUgY291bnRlciB0byBuZXh0IGVudHJ5Ci0gIHN0dHNfdGFibGVfaW5kZXhfKys7Ci0gIC8vIHNlZSBpZiB3ZSBqdXN0IGNyb3NzZWQgYSBjYWNoZSBib3VuZGFyeSBhbmQgc2hvdWxkIGNhY2hlIHJlc3VsdHMKLSAgaWYgKCEoc3R0c190YWJsZV9pbmRleF8gJSBzdHRzXy0+R2V0Q2FjaGVTaXplRW50cmllcygpKSkgewotICAgIGludCBjYWNoZV9pbmRleCA9IHN0dHNfdGFibGVfaW5kZXhfIC8gc3R0c18tPkdldENhY2hlU2l6ZUVudHJpZXMoKTsKLSAgICAvLyBjaGVjayB0aGF0IHRoaXMgaXMgb3VyIGZpcnN0IHRpbWUgd2l0aCB0aGVzZSBkYXRhCi0gICAgaWYgKGNhY2hlX2luZGV4ID09IHN0dHNfc2FtcGxlc18uc2l6ZSgpKSB7Ci0gICAgICAvLyBib3RoIHRhYmxlcyBzaG91bGQgYWx3YXlzIGdyb3cgdG9nZXRoZXIKLSAgICAgIERDSEVDS19FUShzdHRzX3NhbXBsZXNfLnNpemUoKSwgc3R0c190aW1lc3RhbXBzXy5zaXplKCkpOwotICAgICAgc3R0c19zYW1wbGVzXy5wdXNoX2JhY2soc3R0c19maXJzdF9zYW1wbGVfKTsKLSAgICAgIHN0dHNfdGltZXN0YW1wc18ucHVzaF9iYWNrKHN0dHNfZmlyc3Rfc2FtcGxlX3RpbWVfKTsKLSAgICB9Ci0gICAgLy8gb3VyIGludGVncmF0aW9uIGF0IHRoaXMgcG9pbnQgc2hvdWxkIGFsd2F5cyBtYXRjaCBhbnkgc3RvcmVkIHJlY29yZAotICAgIERDSEVDS19FUShzdHRzX2ZpcnN0X3NhbXBsZV8sIHN0dHNfc2FtcGxlc19bY2FjaGVfaW5kZXhdKTsKLSAgICBEQ0hFQ0tfRVEoc3R0c19maXJzdF9zYW1wbGVfdGltZV8sIHN0dHNfdGltZXN0YW1wc19bY2FjaGVfaW5kZXhdKTsKLSAgfQotICBpZiAoc3R0c190YWJsZV9pbmRleF8gPCBzdHRzXy0+R2V0RW50cnlDb3VudCgpKSB7Ci0gICAgLy8gbG9hZCBuZXh0IGVudHJ5IGRhdGEKLSAgICB1aW50MzIgc2FtcGxlX2NvdW50OwotICAgIGlmICghc3R0c18tPlJlYWRVMzJQYWlyRW50cnkoc3R0c190YWJsZV9pbmRleF8sICZzYW1wbGVfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3R0c19zYW1wbGVfZHVyYXRpb25fKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAvLyBjYWxjdWxhdGUgbmV4dCBzYW1wbGUgbnVtYmVyIGZyb20gcmFuZ2Ugc2l6ZQotICAgIHN0dHNfbmV4dF9maXJzdF9zYW1wbGVfID0gc3R0c19maXJzdF9zYW1wbGVfICsgc2FtcGxlX2NvdW50OwotICAgIC8vIGFuZCBsb2FkIGR1cmF0aW9uIG9mIHRoaXMgc2FtcGxlIHJhbmdlCi0gICAgc3R0c19uZXh0X2ZpcnN0X3NhbXBsZV90aW1lXyA9Ci0gICAgICAgIHN0dHNfZmlyc3Rfc2FtcGxlX3RpbWVfICsgKHNhbXBsZV9jb3VudCAqIHN0dHNfc2FtcGxlX2R1cmF0aW9uXyk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gV2UndmUgZ29uZSBiZXlvbmQgdGhlIHJhbmdlIGRlZmluZWQgYnkgdGhlIGxhc3QgZW50cnkgaW4gdGhlIHN0dHMuCi0gICAgLy8gdGhpcyBpcyBhbiBlcnJvci4KLSAgICBoaWdoZXN0X3ZhbGlkX3NhbXBsZV9udW1iZXJfID0KLSAgICAgICAgc3RkOjptaW4oaGlnaGVzdF92YWxpZF9zYW1wbGVfbnVtYmVyXywgc3R0c19maXJzdF9zYW1wbGVfIC0gMSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFNoZWxsTVA0TWFwOjpzdHRzX1NsaXBDYWNoZVRvVGltZSh1aW50NjQgdGltZXN0YW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0aW5nX2NhY2hlX2luZGV4KSB7Ci0gIERDSEVDS19MVChzdGFydGluZ19jYWNoZV9pbmRleCwgc3R0c190aW1lc3RhbXBzXy5zaXplKCkpOwotICBpbnQgY2FjaGVfaW5kZXggPSBzdGFydGluZ19jYWNoZV9pbmRleDsKLSAgZm9yICg7IGNhY2hlX2luZGV4ICsgMSA8IHN0dHNfdGltZXN0YW1wc18uc2l6ZSgpOyBjYWNoZV9pbmRleCsrKSB7Ci0gICAgaWYgKHRpbWVzdGFtcCA8IHN0dHNfdGltZXN0YW1wc19bY2FjaGVfaW5kZXggKyAxXSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHN0dHNfZmlyc3Rfc2FtcGxlXyA9IHN0dHNfc2FtcGxlc19bY2FjaGVfaW5kZXhdOwotICBzdHRzX2ZpcnN0X3NhbXBsZV90aW1lXyA9IHN0dHNfdGltZXN0YW1wc19bY2FjaGVfaW5kZXhdOwotICBzdHRzX3RhYmxlX2luZGV4XyA9IGNhY2hlX2luZGV4ICogc3R0c18tPkdldENhY2hlU2l6ZUVudHJpZXMoKTsKLSAgLy8gcmVhZCBzYW1wbGUgY291bnQgYW5kIGR1cmF0aW9uIHRvIHNldCBuZXh0IHZhbHVlcwotICB1aW50MzIgc2FtcGxlX2NvdW50OwotICBpZiAoIXN0dHNfLT5SZWFkVTMyUGFpckVudHJ5KHN0dHNfdGFibGVfaW5kZXhfLCAmc2FtcGxlX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHRzX3NhbXBsZV9kdXJhdGlvbl8pKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHN0dHNfbmV4dF9maXJzdF9zYW1wbGVfID0gc3R0c19maXJzdF9zYW1wbGVfICsgc2FtcGxlX2NvdW50OwotICBzdHRzX25leHRfZmlyc3Rfc2FtcGxlX3RpbWVfID0KLSAgICAgIHN0dHNfZmlyc3Rfc2FtcGxlX3RpbWVfICsgKHNhbXBsZV9jb3VudCAqIHN0dHNfc2FtcGxlX2R1cmF0aW9uXyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFNoZWxsTVA0TWFwOjpzdHN6X0luaXQoKSB7Ci0gIHJldHVybiBzdHN6Xy0+R2V0Qnl0ZXNBdEVudHJ5KDApICE9IE5VTEw7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfbXA0X21hcC5oIGIvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfbXA0X21hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWM5MjEyLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX21wNF9tYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX0ZJTFRFUlNfU0hFTExfTVA0X01BUF9IXwotI2RlZmluZSBNRURJQV9GSUxURVJTX1NIRUxMX01QNF9NQVBfSF8KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2hlbGxfYnVmZmVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3NoZWxsX2RhdGFfc291cmNlX3JlYWRlci5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBwZXItYXRvbSBzaXplcyBvZiBpbmRpdmlkdWFsIHRhYmxlIGVudHJpZXMKLXN0YXRpYyBjb25zdCBpbnQga0VudHJ5U2l6ZV9jbzY0ID0gODsKLXN0YXRpYyBjb25zdCBpbnQga0VudHJ5U2l6ZV9jdHRzID0gODsKLXN0YXRpYyBjb25zdCBpbnQga0VudHJ5U2l6ZV9zdGNvID0gNDsKLXN0YXRpYyBjb25zdCBpbnQga0VudHJ5U2l6ZV9zdHRzID0gODsKLXN0YXRpYyBjb25zdCBpbnQga0VudHJ5U2l6ZV9zdHNjID0gMTI7Ci1zdGF0aWMgY29uc3QgaW50IGtFbnRyeVNpemVfc3RzcyA9IDQ7Ci1zdGF0aWMgY29uc3QgaW50IGtFbnRyeVNpemVfc3RzeiA9IDQ7Ci0KLS8vIFV0aWxpdHkgY2xhc3MgdG8gcGFyc2UgdGhlIHZhcmlvdXMgc3ViYXRvbXMgb2YgdGhlIHN0YmwgbXA0IGF0b20gYW5kIHVzZQotLy8gdGhlbSB0byBwcm92aWRlIGJ5dGUgb2Zmc2V0cywgc2l6ZXMsIGFuZCB0aW1lc3RhbXBzIG9mIGEgbXA0IGF0b20gd2hpbGUKLS8vIHJldXNpbmcgbWVtb3J5IGlzc3VlZCBieSBTaGVsbEJ1ZmZlckZhY3RvcnkuIFRoZSBjYWNoaW5nIGRlc2lnbiBiZW5lZml0cwotLy8gZnJvbSwgYnV0IGRvZXMgbm90IHJlcXVpcmUsIHNlcXVlbnRpYWwgYWNjZXNzIGluIHNhbXBsZSBudW1iZXJzLgotY2xhc3MgU2hlbGxNUDRNYXAgOiBwdWJsaWMgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8U2hlbGxNUDRNYXA+IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFNoZWxsTVA0TWFwKHNjb3BlZF9yZWZwdHI8U2hlbGxEYXRhU291cmNlUmVhZGVyPiByZWFkZXIpOwotCi0gIGJvb2wgSXNDb21wbGV0ZSgpOwotCi0gIC8vIEFsbCBHZXQoKSBtZXRob2RzIHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MgYW5kIHNhdmUgdGhlaXIgdmFsdWVzIGJ5Ci0gIC8vIHJlZmVyZW5jZSBpbiB0aGUgbGF0dGVyIGFyZ3VtZW50LgotICBib29sIEdldFNpemUodWludDMyIHNhbXBsZV9udW1iZXIsIHVpbnQzMiYgc2l6ZV9vdXQpOwotICBib29sIEdldE9mZnNldCh1aW50MzIgc2FtcGxlX251bWJlciwgdWludDY0JiBvZmZzZXRfb3V0KTsKLSAgLy8gYWxsIHRpbWUgdmFsdWVzIGluICp0aWNrcyogYXMgZGVmaW5lZCBieSB0aGUgbXA0IGNvbnRhaW5lcgotICBib29sIEdldFRpbWVzdGFtcCh1aW50MzIgc2FtcGxlX251bWJlciwgdWludDY0JiB0aW1lc3RhbXBfb3V0KTsKLSAgYm9vbCBHZXREdXJhdGlvbih1aW50MzIgc2FtcGxlX251bWJlciwgdWludDMyJiBkdXJhdGlvbl9vdXQpOwotICBib29sIEdldElzS2V5ZnJhbWUodWludDMyIHNhbXBsZV9udW1iZXIsIGJvb2wmIGlzX2tleWZyYW1lX291dCk7Ci0gIC8vIFVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBmYWlsdXJlIHJlcG9ydGVkIGJ5IGFueSBvZiB0aGUgYWJvdmUgbWV0aG9kcwotICAvLyBpcyBkdWUgdG8gRU9TIG9yIG90aGVyIChmYXRhbCkgZXJyb3IuIFRoZSBsZW5ndGggb2YgYSBtcDQgZmlsZSBpbiBzYW1wbGVzCi0gIC8vIG1heSBub3QgYmUga25vd24gdW50aWwgaXRlcmF0aW5nIHRocm91Z2ggYWxtb3N0IHRoZSBlbnRpcmUgbWFwLCBpbiB0aGUKLSAgLy8gY2FzZSBvZiBhIGRlZmF1bHQgc2FtcGxlIHNpemUgKHJhcmUgaW4gY29tcHJlc3NlZCBtZWRpYSkKLSAgYm9vbCBJc0VPUyh1aW50MzIgc2FtcGxlX251bWJlcik7Ci0KLSAgLy8gUmV0dXJucyB0aGUga2V5ZnJhbWUgc2FtcGxlIG51bWJlciBuZWFyZXN0IHRoZSBwcm92aWRlZCB0aW1lc3RhbXAKLSAgYm9vbCBHZXRLZXlmcmFtZSh1aW50NjQgdGltZXN0YW1wLCB1aW50MzImIHNhbXBsZV9vdXQpOwotCi0gIC8vIHBhc3MgMCBhcyBjYWNoZV9zaXplX2VudHJpZXMgdG8gZm9yY2UgY2FjaGluZyBvZiB0aGUgZW50aXJlIG1hcC4KLSAgYm9vbCBTZXRBdG9tKHVpbnQzMiBmb3VyX2NjLCAgLy8gZm91ckNDIGNvZGUgYXNjaWkgY29kZSBhcyBiaWctZW5kaWFuIHVpbnQzMgotICAgICAgICAgICAgICAgdWludDY0IG9mZnNldCwgICAvLyBvZmZzZXQgb2YgYXRvbSBib2R5IGluIGZpbGUKLSAgICAgICAgICAgICAgIHVpbnQ2NCBzaXplLCAgICAgLy8gdG90YWwgc2l6ZSBvZiBhdG9tIGluIGJ5dGVzCi0gICAgICAgICAgICAgICB1aW50MzIgY2FjaGVfc2l6ZV9lbnRyaWVzLCAgLy8gbnVtIG9mIGVudHJpZXMgdG8gY2FjaGUgaW4gbWVtb3J5Ci0gICAgICAgICAgICAgICBjb25zdCB1aW50OCogYXRvbSk7ICAgICAgICAgLy8gcG9pbnRlciB0byBhdG9tIGJvZHkgc3RhcnQKLQotIHByaXZhdGU6Ci0gIGJvb2wgY282NF9Jbml0KCk7Ci0KLSAgYm9vbCBjdHRzX0luaXQoKTsKLSAgLy8gYWR2YW5jZSB0aGUgY3R0cyBjYWNoZSBhbmQgaW50ZWdyYXRpb24gc3RhdGUgdG8gY29udGFpbiBzYW1wbGUgbnVtYmVyLgotICBib29sIGN0dHNfQWR2YW5jZVRvU2FtcGxlKHVpbnQzMiBzYW1wbGVfbnVtYmVyKTsKLSAgYm9vbCBjdHRzX1NsaXBDYWNoZVRvU2FtcGxlKHVpbnQzMiBzYW1wbGVfbnVtYmVyLCBpbnQgc3RhcnRpbmdfY2FjaGVfaW5kZXgpOwotCi0gIGJvb2wgc3Rjb19Jbml0KCk7Ci0KLSAgYm9vbCBzdHNjX0luaXQoKTsKLSAgLy8gYWR2YW5jZSB0aGUgc3RzYyBjYWNoZSBhbmQgaW50ZWdyYXRpb24gc3RhdGUgdG8gY29udGFpbiBzYW1wbGUgbnVtYmVyLgotICBib29sIHN0c2NfQWR2YW5jZVRvU2FtcGxlKHVpbnQzMiBzYW1wbGVfbnVtYmVyKTsKLSAgLy8gcmUtdXNlIHByZXZpb3VzbHkgY2FsY3VsYXRlZCBzdW1zIHRvIGp1bXAgdGhyb3VnaCB0aGUgdGFibGUgdG8gZ2V0IHRvIHRoZQotICAvLyBuZWFyZXN0IGNhY2hlIGVudHJ5IHRoYXQgY29udGFpbnMgZ2l2ZW4gc2FtcGxlIG51bWJlci4gU3RhcnRzIHRoZSBzZWFyY2gKLSAgLy8gZnJvbSB0aGUgc3RhcnRpbmdfY2FjaGVfaW5kZXguCi0gIGJvb2wgc3RzY19TbGlwQ2FjaGVUb1NhbXBsZSh1aW50MzIgc2FtcGxlX251bWJlciwgaW50IHN0YXJ0aW5nX2NhY2hlX2luZGV4KTsKLQotICBib29sIHN0c3NfSW5pdCgpOwotICAvLyBzdGVwIHRocm91Z2ggdGFibGUgYnkgb25lIHRhYmxlIGVudHJ5LCByZXR1cm4gZmFsc2Ugb24gZXJyb3IKLSAgYm9vbCBzdHNzX0FkdmFuY2VTdGVwKCk7Ci0gIC8vIHNlYXJjaCBmb3IgbmVhcmVzdCBrZXlmcmFtZSwgdXBkYXRlIHN0YXRlIHRvIGNvbnRhaW4gaXQKLSAgYm9vbCBzdHNzX0ZpbmROZWFyZXN0S2V5ZnJhbWUodWludDMyIHNhbXBsZV9udW1iZXIpOwotCi0gIGJvb2wgc3R0c19Jbml0KCk7Ci0gIGJvb2wgc3R0c19BZHZhbmNlVG9TYW1wbGUodWludDMyIHNhbXBsZV9udW1iZXIpOwotICBib29sIHN0dHNfU2xpcENhY2hlVG9TYW1wbGUodWludDMyIHNhbXBsZV9udW1iZXIsIGludCBzdGFydGluZ19jYWNoZV9pbmRleCk7Ci0gIGJvb2wgc3R0c19BZHZhbmNlVG9UaW1lKHVpbnQ2NCB0aW1lc3RhbXApOwotICBib29sIHN0dHNfU2xpcENhY2hlVG9UaW1lKHVpbnQ2NCB0aW1lc3RhbXAsIGludCBzdGFydGluZ19jYWNoZV9pbmRleCk7Ci0gIC8vIHN0ZXAgdGhyb3VnaCB0aGUgc3R0cyB0YWJsZSBieSBvbmUgdGFibGUgZW50cnksIHJldHVybiBmYWxzZSBvbiBlcnJvcgotICBib29sIHN0dHNfSW50ZWdyYXRlU3RlcCgpOwotCi0gIGJvb2wgc3Rzel9Jbml0KCk7Ci0KLSAgLy8gVGFibGVDYWNoZSBtYW5hZ2VzIHRoZSBjYWNoaW5nIG9mIGVhY2ggYXRvbSB0YWJsZSBpbiBhIHNlcGFyYXRlIGluc3RhbmNlLgotICAvLyBBcyBlYWNoIGF0b20gaGFzIGEgZGlmZmVyZW50IHBlci1lbnRyeSBieXRlIHNpemUsIGFuZCBtYXkgd2FudCBkaWZmZXJlbnQKLSAgLy8gY2FjaGluZyBiZWhhdmlvciBiYXNlZCBvbiBjb25zdW1wdGlvbiByYXRlIG9mIGVudHJpZXMgYW5kIHRoZSBvdmVyYWxsIHNpemUKLSAgLy8gb2YgdGhlIHRhYmxlLCBpdCBhbGxvd3MgZWFjaCBhdG9tIHRvIHVzZSBpdHMgb3duIHBvbGljeSBmb3IgY2FjaGluZy4KLSAgLy8gVG8ga2VlcCB0aGluZ3MgcmVsYXRpdmVseSBzaW1wbGUgaXQgYWx3YXlzIGtlZXAgYSB0YWJsZSBvZiBzaXplIG9mIHRoZQotICAvLyBtaW5pbXVtIG9mIGNhY2hlX3NpemVfZW50cmllcyBvciBlbnRyeV9jb3VudCBpbiBtZW1vcnksIGFuZCB0aGF0IGNhY2hlZAotICAvLyB0YWJsZSBpcyBhbHdheXMgYWxpZ25lZCB3aXRoIHRoZSBmdWxsIHRhYmxlIGluIGNhY2hlX3NpemVfZW50cmllcywgc28KLSAgLy8gdGhhdCB0aGUgcG9zaXRpb24gaW4gdGhlIGNhY2hlIGlzIHRyaXZpYWxseSBjYWxjdWxhdGVkIGZyb20KLSAgLy8gZW50cnlfbnVtYmVyICUgY2FjaGVfc2l6ZV9lbnRyaWVzLCBhbmQgdGhlIGNhY2hlIGluZGV4IGlzIHNpbWlsYXJseQotICAvLyBjYWN1bGF0ZWQgZnJvbSBlbnRyeV9udW1iZXIgLyBjYWNoZV9zaXplX2VudHJpZXMuCi0gIGNsYXNzIFRhYmxlQ2FjaGUgOiBwdWJsaWMgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8VGFibGVDYWNoZT4gewotICAgcHVibGljOgotICAgIFRhYmxlQ2FjaGUodWludDY0IHRhYmxlX29mZnNldCwgIC8vIGJ5dGUgb2Zmc2V0IG9mIHN0YXJ0IG9mIHRhYmxlIGluIGZpbGUKLSAgICAgICAgICAgICAgIHVpbnQzMiBlbnRyeV9jb3VudCwgICAvLyBudW1iZXIgb2YgZW50cmllcyBpbiB0YWJsZQotICAgICAgICAgICAgICAgdWludDMyIGVudHJ5X3NpemUsICAgIC8vIHNpemUgaW4gYnl0ZXMgb2YgZWFjaCBlbnRyeSBpbiB0YWJsZQotICAgICAgICAgICAgICAgdWludDMyIGNhY2hlX3NpemVfZW50cmllcywgIC8vIG51bWJlciBvZiBlbnRyaWVzIHRvIGNhY2hlIGluIG1lbQotICAgICAgICAgICAgICAgc2NvcGVkX3JlZnB0cjxTaGVsbERhdGFTb3VyY2VSZWFkZXI+IHJlYWRlcik7ICAvLyByZWFkZXIgdG8gdXNlCi0KLSAgICAvLyBUaGUgZm9sbG93aW5nIFJlYWQqIGZ1bmN0aW9ucyBhbGwgcmVhZCB2YWx1ZXMgaW4gYmlnIGVuZGlhbi4KLSAgICBib29sIFJlYWRVMzJFbnRyeSh1aW50MzIgZW50cnlfbnVtYmVyLCB1aW50MzIqIGVudHJ5KTsKLSAgICBib29sIFJlYWRVMzJQYWlyRW50cnkodWludDMyIGVudHJ5X251bWJlciwgdWludDMyKiBmaXJzdCwgdWludDMyKiBzZWNvbmQpOwotICAgIGJvb2wgUmVhZFUzMkVudHJ5SW50b1U2NCh1aW50MzIgZW50cnlfbnVtYmVyLCB1aW50NjQqIGVudHJ5KTsKLSAgICBib29sIFJlYWRVNjRFbnRyeSh1aW50MzIgZW50cnlfbnVtYmVyLCB1aW50NjQqIGVudHJ5KTsKLQotICAgIHVpbnQ4KiBHZXRCeXRlc0F0RW50cnkodWludDMyIGVudHJ5X251bWJlcik7Ci0KLSAgICAvLyBob3cgbWFueSBlbnRyaWVzIHRvdGFsIGluIHRoZSB0YWJsZT8KLSAgICBpbmxpbmUgdWludDMyIEdldEVudHJ5Q291bnQoKSBjb25zdCB7IHJldHVybiBlbnRyeV9jb3VudF87IH0KLSAgICAvLyBob3cgbWFueSBlbnRyaWVzIGFyZSB3ZSBjYWNoaW5nIGluIG1lbW9yeSBhdCBvbmNlPwotICAgIGlubGluZSB1aW50MzIgR2V0Q2FjaGVTaXplRW50cmllcygpIGNvbnN0IHsgcmV0dXJuIGNhY2hlX3NpemVfZW50cmllc187IH0KLQotICAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8VGFibGVDYWNoZT47Ci0gICAgdWludDMyIGVudHJ5X3NpemVfOyAgICAgICAgICAvLyBzaXplIG9mIGVudHJ5IGluIGJ5dGVzCi0gICAgdWludDMyIGVudHJ5X2NvdW50XzsgICAgICAgICAvLyBzaXplIG9mIHRhYmxlIGluIGVudHJpZXMKLSAgICB1aW50MzIgY2FjaGVfc2l6ZV9lbnRyaWVzXzsgIC8vIG1heCBudW1iZXIgb2YgZW50cmllcyB0byBmaXQgaW4gbWVtb3J5Ci0gICAgdWludDY0IHRhYmxlX29mZnNldF87ICAgICAgICAvLyBvZmZzZXQgb2YgdGFibGUgaW4gc3RyZWFtCi0gICAgc2NvcGVkX3JlZnB0cjxTaGVsbERhdGFTb3VyY2VSZWFkZXI+IHJlYWRlcl87ICAvLyBtZWFucyB0byByZWFkIG1vcmUgdGFibGUKLQotICAgIC8vIGN1cnJlbnQgY2FjaGUgc3RhdGUKLSAgICBzY29wZWRfcmVmcHRyPFNoZWxsU2NvcGVkQXJyYXk+IGNhY2hlXzsgIC8vIHRoZSBjYWNoZWQgcGFydCBvZiB0aGUgdGFibGUKLSAgICB1aW50MzIgY2FjaGVfZmlyc3RfZW50cnlfbnVtYmVyXzsgIC8vIGZpcnN0IHRhYmxlIGVudHJ5IG51bWJlciBpbiBjYWNoZQotICAgIHVpbnQzMiBjYWNoZV9lbnRyeV9jb3VudF87ICAgICAgICAgLy8gbnVtYmVyIG9mIHZhbGlkIGVudHJpZXMgaW4gY2FjaGUKLSAgfTsKLQotICBzY29wZWRfcmVmcHRyPFNoZWxsRGF0YVNvdXJjZVJlYWRlcj4gcmVhZGVyXzsKLQotICAvLyBjdXJyZW50IGludGVncmF0aW9uIHN0YXRlIGZvciBHZXRPZmZzZXQoKSwgd2Ugc2F2ZSB0aGUgc3VtIG9mIHNhbXBsZSBzaXplcwotICAvLyB3aXRoaW4gdGhlIGN1cnJlbnQgY2h1bmsuCi0gIHVpbnQzMiBjdXJyZW50X2NodW5rX3NhbXBsZV87ICAvLyBzYW1wbGUgbnVtYmVyIGxhc3QgaW5jbHVkZWQgaW4gc3VtbWF0aW9uCi0gIHVpbnQzMiBuZXh0X2NodW5rX3NhbXBsZV87ICAgICAvLyBmaXJzdCBzYW1wbGUgbnVtYmVyIG9mIG5leHQgY2h1bmsKLSAgdWludDY0IGN1cnJlbnRfY2h1bmtfb2Zmc2V0XzsgIC8vIGZpbGUgYnl0ZSBvZmZzZXQgb2YgY3VycmVudF9jaHVua19zYW1wbGVfCi0KLSAgLy8gQ2FuIGJlIHNldCBieSBhIHN0c3ogZW50cnkgY291bnQgYnV0IGFuIHN0c3ogbWF5IHByb3ZpZGUgYSBkZWZhdWx0IHNpemUsCi0gIC8vIGluIHdoaWNoIGNhc2UgdGhpcyBudW1iZXIgbWF5IG5vdCBiZSBrbm93biB1bnRpbCBpdGVncmF0aW9uIHRocm91Z2gKLSAgLy8gdGhlIGN0dHMsIG9yIHN0dHMgaGFzIGNvbXBsZXRlZC4gSW4gdGhlIGV2ZW50IHRoYXQgb25lIG9mIHRob3NlIHRhYmxlcwotICAvLyBlbmRzIGF0IGEgbG93ZXIgbnVtYmVyIHRoYW4gdGhlIG90aGVycyB0aGlzIG51bWJlciB3aWxsIGJlIGFtZW5kZWQKLSAgLy8gdG8gcmV0dXJuIHRoZSBsb3dlciBudW1iZXIuCi0gIHVpbnQzMiBoaWdoZXN0X3ZhbGlkX3NhbXBsZV9udW1iZXJfOwotCi0gIC8vID09PT0gYzA2NCAtIHBlci1jaHVuayBsaXN0IG9mIGZpbGUgb2Zmc2V0cyAoNjQtYml0KQotICBzY29wZWRfcmVmcHRyPFRhYmxlQ2FjaGU+IGNvNjRfOwotCi0gIC8vID09PT0gY3R0cyAtIHJ1bi1sZW5ndGggc2FtcGxlIG51bWJlciB0byBjb21wb3NpdGlvbiB0aW1lIG9mZnNldAotICBzY29wZWRfcmVmcHRyPFRhYmxlQ2FjaGU+IGN0dHNfOwotICB1aW50MzIgY3R0c19maXJzdF9zYW1wbGVfOwotICB1aW50MzIgY3R0c19zYW1wbGVfb2Zmc2V0XzsKLSAgdWludDMyIGN0dHNfbmV4dF9maXJzdF9zYW1wbGVfOwotICB1aW50MzIgY3R0c190YWJsZV9pbmRleF87Ci0gIHN0ZDo6dmVjdG9yPHVpbnQzMj4gY3R0c19zYW1wbGVzXzsKLQotICAvLyA9PT09IHN0Y28gLSBwZXItY2h1bmsgbGlzdCBvZiBjaHVuayBmaWxlIG9mZnNldHMgKDMyLWJpdCkKLSAgc2NvcGVkX3JlZnB0cjxUYWJsZUNhY2hlPiBzdGNvXzsKLQotICAvLyA9PT09IHN0c2MgLSBjaHVuay1udW1iZXIgdG8gc2FtcGxlcy1wZXItY2h1bmsKLSAgc2NvcGVkX3JlZnB0cjxUYWJsZUNhY2hlPiBzdHNjXzsKLSAgdWludDMyIHN0c2NfZmlyc3RfY2h1bmtfOyAgLy8gZmlyc3QgY2h1bmsgb2YgdGhlIGN1cnJlbnQgc2FtcGxlIHNpemUgcmFuZ2UKLSAgdWludDMyIHN0c2NfZmlyc3RfY2h1bmtfc2FtcGxlXzsgIC8vIHN1bSBvZiBzYW1wbGVzIG9mIGFsbCBwcmV2IGNodW5rIHJhbmdlcwotICB1aW50MzIgc3RzY19zYW1wbGVzX3Blcl9jaHVua187ICAgLy8gY3VycmVudCBzYW1wbGVzLXBlci1jaHVuayBpbiB0aGlzIHJhbmdlCi0gIHVpbnQzMiBzdHNjX25leHRfZmlyc3RfY2h1bmtfOyAgLy8gdGhlIGNodW5rIG51bWJlciB0aGUgbmV4dCByZWdpb24gYmVnaW5zIGluCi0gIHVpbnQzMiBzdHNjX25leHRfZmlyc3RfY2h1bmtfc2FtcGxlXzsgIC8vIHNhbXBsZSBudW1iZXIgbmV4dCByZWdpb24gYmVnaW5zIGluCi0gIHVpbnQzMiBzdHNjX3RhYmxlX2luZGV4XzsgIC8vIHRoZSBpbmRleCBpbiB0aGUgdGFibGUgb2YgdGhlIGN1cnJlbnQgcmFuZ2UKLSAgc3RkOjp2ZWN0b3I8dWludDMyPiBzdHNjX3NhbXBsZV9zdW1zXzsgIC8vIHNhdmVkIHN1bXMgb2YgY2FjaGUgc2VnbWVudHMKLQotICAvLyA9PT09IHN0c3MgLSBsaXN0IG9mIGtleWZyYW1lIHNhbXBsZSBudW1iZXJzCi0gIHNjb3BlZF9yZWZwdHI8VGFibGVDYWNoZT4gc3Rzc187Ci0gIHVpbnQzMiBzdHNzX2xhc3Rfa2V5ZnJhbWVfOwotICB1aW50MzIgc3Rzc19uZXh0X2tleWZyYW1lXzsKLSAgdWludDMyIHN0c3NfdGFibGVfaW5kZXhfOyAgLy8gaW5kZXggb2Ygc3Rzc19uZXh0X2tleWZyYW1lXyBpbiB0YWJsZQotICBzdGQ6OnZlY3Rvcjx1aW50MzI+IHN0c3Nfa2V5ZnJhbWVzXzsKLQotICAvLyA9PT09IHN0dHMgLSBydW4tbGVuZ3RoIHNhbXBsZSBudW1iZXIgdG8gdGltZSBkdXJhdGlvbgotICBzY29wZWRfcmVmcHRyPFRhYmxlQ2FjaGU+IHN0dHNfOwotICB1aW50MzIgc3R0c19maXJzdF9zYW1wbGVfOyAgICAgICAvLyBmaXJzdCBzYW1wbGUgb2YgdGhlIGN1cnJlbnQgZHVyYXRpb24gcmFuZ2UKLSAgdWludDY0IHN0dHNfZmlyc3Rfc2FtcGxlX3RpbWVfOyAgLy8gc3VtIG9mIGFsbCBkdXJhdGlvbnMgb2YgcHJldmlvdXMgcmFuZ2VzCi0gIHVpbnQzMiBzdHRzX3NhbXBsZV9kdXJhdGlvbl87ICAgIC8vIGN1cnJlbnQgZHVyYXRpb24gb2Ygc2FtcGxlcyBpbiB0aGlzIHJhbmdlCi0gIHVpbnQzMiBzdHRzX25leHRfZmlyc3Rfc2FtcGxlXzsgIC8vIGZpcnN0IHNhbXBsZSBudW1iZXIgb2YgbmV4dCByYW5nZQotICB1aW50NjQgc3R0c19uZXh0X2ZpcnN0X3NhbXBsZV90aW1lXzsgIC8vIGZpcnN0IHRpbWVzdGFtcCBvZiBuZXh0IHJhbmdlCi0gIHVpbnQzMiBzdHRzX3RhYmxlX2luZGV4XzsgICAgICAgICAgICAgLy8gaW5kZXggaW4gdGhlIHRhYmxlIG9mIHRoZSBuZXh0IGVudHJ5Ci0gIHN0ZDo6dmVjdG9yPHVpbnQzMj4gc3R0c19zYW1wbGVzXzsKLSAgc3RkOjp2ZWN0b3I8dWludDY0PiBzdHRzX3RpbWVzdGFtcHNfOwotCi0gIC8vID09PT0gc3RzeiAtIHBlci1zYW1wbGUgbGlzdCBvZiBzYW1wbGUgc2l6ZXMKLSAgc2NvcGVkX3JlZnB0cjxUYWJsZUNhY2hlPiBzdHN6XzsKLSAgdWludDMyIHN0c3pfZGVmYXVsdF9zaXplXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0ZJTFRFUlNfU0hFTExfTVA0X01BUF9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfbXA0X21hcF91bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX21wNF9tYXBfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmY2EyM2MuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfbXA0X21hcF91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDExMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvc2hlbGxfbXA0X21hcC5oIgotCi0jaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBmb3IgcmFuZCBhbmQgc3JhbmQKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4gIC8vIGZvciBzdGQ6Om1pbgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImxiX3BsYXRmb3JtLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaGVsbF9idWZmZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbW9ja19zaGVsbF9kYXRhX3NvdXJjZV9yZWFkZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL3NoZWxsX21wNF9wYXJzZXIuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgOjpMQjo6UGxhdGZvcm06OmxvYWRfdWludDMyX2JpZ19lbmRpYW47Ci11c2luZyA6OkxCOjpQbGF0Zm9ybTo6c3RvcmVfdWludDMyX2JpZ19lbmRpYW47Ci11c2luZyA6OkxCOjpQbGF0Zm9ybTo6c3RvcmVfdWludDY0X2JpZ19lbmRpYW47Ci0KLXVzaW5nIDo6bWVkaWE6OmtBdG9tVHlwZV9jbzY0OwotdXNpbmcgOjptZWRpYTo6a0F0b21UeXBlX2N0dHM7Ci11c2luZyA6Om1lZGlhOjprQXRvbVR5cGVfc3RjbzsKLXVzaW5nIDo6bWVkaWE6OmtBdG9tVHlwZV9zdHNjOwotdXNpbmcgOjptZWRpYTo6a0F0b21UeXBlX3N0c3M7Ci11c2luZyA6Om1lZGlhOjprQXRvbVR5cGVfc3RzejsKLXVzaW5nIDo6bWVkaWE6OmtBdG9tVHlwZV9zdHRzOwotdXNpbmcgOjptZWRpYTo6a0VudHJ5U2l6ZV9jbzY0OwotdXNpbmcgOjptZWRpYTo6a0VudHJ5U2l6ZV9jdHRzOwotdXNpbmcgOjptZWRpYTo6a0VudHJ5U2l6ZV9zdGNvOwotdXNpbmcgOjptZWRpYTo6a0VudHJ5U2l6ZV9zdHNjOwotdXNpbmcgOjptZWRpYTo6a0VudHJ5U2l6ZV9zdHNzOwotdXNpbmcgOjptZWRpYTo6a0VudHJ5U2l6ZV9zdHN6OwotdXNpbmcgOjptZWRpYTo6a0VudHJ5U2l6ZV9zdHRzOwotdXNpbmcgOjptZWRpYTo6TW9ja1NoZWxsRGF0YVNvdXJjZVJlYWRlcjsKLXVzaW5nIDo6bWVkaWE6OlNoZWxsQnVmZmVyRmFjdG9yeTsKLXVzaW5nIDo6bWVkaWE6OlNoZWxsTVA0TWFwOwotCi11c2luZyA6OnRlc3Rpbmc6Ol87Ci11c2luZyA6OnRlc3Rpbmc6OkFsbE9mOwotdXNpbmcgOjp0ZXN0aW5nOjpBbnlOdW1iZXI7Ci11c2luZyA6OnRlc3Rpbmc6OkRvQWxsOwotdXNpbmcgOjp0ZXN0aW5nOjpHZTsKLXVzaW5nIDo6dGVzdGluZzo6SW52b2tlOwotdXNpbmcgOjp0ZXN0aW5nOjpMdDsKLXVzaW5nIDo6dGVzdGluZzo6UmV0dXJuOwotdXNpbmcgOjp0ZXN0aW5nOjpTZXRBcnJheUFyZ3VtZW50OwotCi1uYW1lc3BhY2UgewotCi1pbnQgUmFuZG9tUmFuZ2UoaW50IG1pbiwgaW50IG1heCkgewotICByZXR1cm4gbWluICsgcmFuZCgpICUgKG1heCAtIG1pbiArIDEpOwotfQotCi0vLyBEYXRhIHN0cnVjdHVyZSByZXByZXNlbnQgYSBzYW1wbGUgaW5zaWRlIHN0YmwuIEl0IGhhcyByZWR1bmRhbnQgZGF0YSBmb3IKLS8vIGVhc3kgYWNjZXNzLgotc3RydWN0IFNhbXBsZSB7Ci0gIGJvb2wgaXNfa2V5X2ZyYW1lOwotICBpbnQgc2l6ZTsKLSAgaW50IG9mZnNldDsKLSAgaW50IGNodW5rX2luZGV4OwotICBpbnQgZHRzX2R1cmF0aW9uOwotICBpbnQgZHRzOwotICBpbnQgY3RzOwotfTsKLQotdHlwZWRlZiBzdGQ6OnZlY3RvcjxTYW1wbGU+IFNhbXBsZVZlY3RvcjsKLQotY2xhc3MgU2FtcGxlVGFibGUgewotIHB1YmxpYzoKLSAgLy8gQWxsIHJhbmdlcyBhcmUgaW5jbHVzaXZlIGF0IGJvdGggZW5kcy4KLSAgLy8gU2V0IHJhbmdlIG9mIGNvbXBvc2l0aW9uIHRpbWVzdGFtcCB0byBbMCwgMF0gdG8gZGlzYWJsZSBjdHRzLgotICBTYW1wbGVUYWJsZSh1bnNpZ25lZCBpbnQgc2VlZCwKLSAgICAgICAgICAgICAgaW50IG51bV9vZl9zYW1wbGVzLAotICAgICAgICAgICAgICBpbnQgbWluX3NhbXBsZV9zaXplLAotICAgICAgICAgICAgICBpbnQgbWF4X3NhbXBsZV9zaXplLAotICAgICAgICAgICAgICBpbnQgbWluX3NhbXBsZXNfcGVyX2NodW5rLAotICAgICAgICAgICAgICBpbnQgbWF4X3NhbXBsZXNfcGVyX2NodW5rLAotICAgICAgICAgICAgICBpbnQgbWluX2tleV9mcmFtZV9nYXAsCi0gICAgICAgICAgICAgIGludCBtYXhfa2V5X2ZyYW1lX2dhcCwKLSAgICAgICAgICAgICAgaW50IG1pbl9zYW1wbGVfZGVjb2RlX3RpbWVzdGFtcF9vZmZzZXQsCi0gICAgICAgICAgICAgIGludCBtYXhfc2FtcGxlX2RlY29kZV90aW1lc3RhbXBfb2Zmc2V0LAotICAgICAgICAgICAgICBpbnQgbWluX3NhbXBsZV9jb21wb3NpdGlvbl90aW1lc3RhbXBfb2Zmc2V0LAotICAgICAgICAgICAgICBpbnQgbWF4X3NhbXBsZV9jb21wb3NpdGlvbl90aW1lc3RhbXBfb2Zmc2V0KQotICAgICAgOiByZWFkX2NvdW50XygwKSwgcmVhZF9ieXRlc18oMCkgewotICAgIHNyYW5kKHNlZWQpOwotICAgIENIRUNLX0dUKG51bV9vZl9zYW1wbGVzLCAwKTsKLSAgICBDSEVDS19HVChtaW5fc2FtcGxlX3NpemUsIDApOwotICAgIENIRUNLX0xFKG1pbl9zYW1wbGVfc2l6ZSwgbWF4X3NhbXBsZV9zaXplKTsKLSAgICBDSEVDS19HVChtaW5fc2FtcGxlc19wZXJfY2h1bmssIDApOwotICAgIENIRUNLX0xFKG1pbl9zYW1wbGVzX3Blcl9jaHVuaywgbWF4X3NhbXBsZXNfcGVyX2NodW5rKTsKLSAgICBDSEVDS19HVChtaW5fa2V5X2ZyYW1lX2dhcCwgMCk7Ci0gICAgQ0hFQ0tfTEUobWluX2tleV9mcmFtZV9nYXAsIG1heF9rZXlfZnJhbWVfZ2FwKTsKLSAgICBDSEVDS19HVChtaW5fc2FtcGxlX2RlY29kZV90aW1lc3RhbXBfb2Zmc2V0LCAwKTsKLSAgICBDSEVDS19MRShtaW5fc2FtcGxlX2RlY29kZV90aW1lc3RhbXBfb2Zmc2V0LAotICAgICAgICAgICAgIG1heF9zYW1wbGVfZGVjb2RlX3RpbWVzdGFtcF9vZmZzZXQpOwotICAgIENIRUNLX0xFKG1pbl9zYW1wbGVfY29tcG9zaXRpb25fdGltZXN0YW1wX29mZnNldCwKLSAgICAgICAgICAgICBtYXhfc2FtcGxlX2NvbXBvc2l0aW9uX3RpbWVzdGFtcF9vZmZzZXQpOwotCi0gICAgc2FtcGxlc18ucmVzaXplKG51bV9vZl9zYW1wbGVzKTsKLQotICAgIGludCByZW1haW5pbmdfc2FtcGxlX2luX2NodW5rID0gMDsKLSAgICBpbnQgY3VycmVudF9jaHVua19pbmRleCA9IC0xOwotICAgIGludCBuZXh0X2tleV9mcmFtZSA9IDA7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9vZl9zYW1wbGVzOyArK2kpIHsKLSAgICAgIHNhbXBsZXNfW2ldLnNpemUgPSBSYW5kb21SYW5nZShtaW5fc2FtcGxlX3NpemUsIG1heF9zYW1wbGVfc2l6ZSk7Ci0gICAgICBzYW1wbGVzX1tpXS5vZmZzZXQgPQotICAgICAgICAgIGkgPT0gMCA/IHJhbmQoKSA6IHNhbXBsZXNfW2kgLSAxXS5vZmZzZXQgKyBzYW1wbGVzX1tpIC0gMV0uc2l6ZTsKLSAgICAgIHNhbXBsZXNfW2ldLmR0cyA9Ci0gICAgICAgICAgaSA9PSAwID8gMCA6IHNhbXBsZXNfW2kgLSAxXS5kdHMgKyBzYW1wbGVzX1tpIC0gMV0uZHRzX2R1cmF0aW9uOwotICAgICAgc2FtcGxlc19baV0uZHRzX2R1cmF0aW9uID0KLSAgICAgICAgICBSYW5kb21SYW5nZShtaW5fc2FtcGxlX2RlY29kZV90aW1lc3RhbXBfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgIG1heF9zYW1wbGVfZGVjb2RlX3RpbWVzdGFtcF9vZmZzZXQpOwotICAgICAgOwotICAgICAgc2FtcGxlc19baV0uY3RzID0gc2FtcGxlc19baV0uZHRzICsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJhbmRvbVJhbmdlKG1pbl9zYW1wbGVfY29tcG9zaXRpb25fdGltZXN0YW1wX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9zYW1wbGVfY29tcG9zaXRpb25fdGltZXN0YW1wX29mZnNldCk7Ci0gICAgICBpZiAoIXJlbWFpbmluZ19zYW1wbGVfaW5fY2h1bmspIHsKLSAgICAgICAgKytjdXJyZW50X2NodW5rX2luZGV4OwotICAgICAgICByZW1haW5pbmdfc2FtcGxlX2luX2NodW5rID0KLSAgICAgICAgICAgIFJhbmRvbVJhbmdlKG1pbl9zYW1wbGVzX3Blcl9jaHVuaywgbWF4X3NhbXBsZXNfcGVyX2NodW5rKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGkgPj0gbmV4dF9rZXlfZnJhbWUpIHsKLSAgICAgICAgc2FtcGxlc19baV0uaXNfa2V5X2ZyYW1lID0gdHJ1ZTsKLSAgICAgICAgbmV4dF9rZXlfZnJhbWUgKz0gUmFuZG9tUmFuZ2UobWluX2tleV9mcmFtZV9nYXAsIG1heF9rZXlfZnJhbWVfZ2FwKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNhbXBsZXNfW2ldLmlzX2tleV9mcmFtZSA9IGZhbHNlOwotICAgICAgfQotCi0gICAgICBzYW1wbGVzX1tpXS5jaHVua19pbmRleCA9IGN1cnJlbnRfY2h1bmtfaW5kZXg7Ci0gICAgICAtLXJlbWFpbmluZ19zYW1wbGVfaW5fY2h1bms7Ci0gICAgfQotCi0gICAgUG9wdWxhdGVCb3hlcygpOwotICB9Ci0KLSAgaW50NjQgR2V0Qm94T2Zmc2V0KHVpbnQzMiBhdG9tX3R5cGUpIGNvbnN0IHsKLSAgICBzd2l0Y2ggKGF0b21fdHlwZSkgewotICAgICAgY2FzZSBrQXRvbVR5cGVfc3RzejoKLSAgICAgICAgcmV0dXJuIHN0c3pfb2Zmc2V0XzsKLSAgICAgIGNhc2Uga0F0b21UeXBlX3N0Y286Ci0gICAgICAgIHJldHVybiBzdGNvX29mZnNldF87Ci0gICAgICBjYXNlIGtBdG9tVHlwZV9jbzY0OgotICAgICAgICByZXR1cm4gY282NF9vZmZzZXRfOwotICAgICAgY2FzZSBrQXRvbVR5cGVfc3RzYzoKLSAgICAgICAgcmV0dXJuIHN0c2Nfb2Zmc2V0XzsKLSAgICAgIGNhc2Uga0F0b21UeXBlX2N0dHM6Ci0gICAgICAgIHJldHVybiBjdHRzX29mZnNldF87Ci0gICAgICBjYXNlIGtBdG9tVHlwZV9zdHRzOgotICAgICAgICByZXR1cm4gc3R0c19vZmZzZXRfOwotICAgICAgY2FzZSBrQXRvbVR5cGVfc3RzczoKLSAgICAgICAgcmV0dXJuIHN0c3Nfb2Zmc2V0XzsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIE5PVFJFQUNIRUQoKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9Ci0KLSAgaW50NjQgR2V0Qm94U2l6ZSh1aW50MzIgYXRvbV90eXBlKSBjb25zdCB7Ci0gICAgc3dpdGNoIChhdG9tX3R5cGUpIHsKLSAgICAgIGNhc2Uga0F0b21UeXBlX3N0c3o6Ci0gICAgICAgIHJldHVybiBzdHN6Xy5zaXplKCk7Ci0gICAgICBjYXNlIGtBdG9tVHlwZV9zdGNvOgotICAgICAgICByZXR1cm4gc3Rjb18uc2l6ZSgpOwotICAgICAgY2FzZSBrQXRvbVR5cGVfY282NDoKLSAgICAgICAgcmV0dXJuIGNvNjRfLnNpemUoKTsKLSAgICAgIGNhc2Uga0F0b21UeXBlX3N0c2M6Ci0gICAgICAgIHJldHVybiBzdHNjXy5zaXplKCk7Ci0gICAgICBjYXNlIGtBdG9tVHlwZV9jdHRzOgotICAgICAgICByZXR1cm4gY3R0c18uc2l6ZSgpOwotICAgICAgY2FzZSBrQXRvbVR5cGVfc3R0czoKLSAgICAgICAgcmV0dXJuIHN0dHNfLnNpemUoKTsKLSAgICAgIGNhc2Uga0F0b21UeXBlX3N0c3M6Ci0gICAgICAgIHJldHVybiBzdHNzXy5zaXplKCk7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBOT1RSRUFDSEVEKCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgfQotCi0gIGNvbnN0IHVpbnQ4X3QqIEdldEJveERhdGEodWludDMyIGF0b21fdHlwZSkgY29uc3QgewotICAgIHJldHVybiAmY29tYmluZWRfWzBdICsgR2V0Qm94T2Zmc2V0KGF0b21fdHlwZSkgLSBmaWxlX29mZnNldF87Ci0gIH0KLQotICBzaXplX3Qgc2FtcGxlX2NvdW50KCkgY29uc3QgeyByZXR1cm4gc2FtcGxlc18uc2l6ZSgpOyB9Ci0gIGNvbnN0IFNhbXBsZSYgc2FtcGxlKGludCBpKSBjb25zdCB7IHJldHVybiBzYW1wbGVzXy5hdChpKTsgfQotCi0gIHNpemVfdCBrZXlmcmFtZV9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIChzdHNzXy5zaXplKCkgLSA4KSAvIGtFbnRyeVNpemVfc3RzczsgfQotCi0gIGludCBCbG9ja2luZ1JlYWQoaW50NjQgcG9zaXRpb24sIGludCBzaXplLCB1aW50OCogZGF0YSkgewotICAgIENIRUNLX0dFKHBvc2l0aW9uLCBmaWxlX29mZnNldF8pOwotICAgIENIRUNLX0xFKHBvc2l0aW9uICsgc2l6ZSwgZmlsZV9vZmZzZXRfICsgY29tYmluZWRfLnNpemUoKSk7Ci0gICAgdWludDMyIG9mZnNldCA9IHBvc2l0aW9uIC0gZmlsZV9vZmZzZXRfOwotICAgIG1lbWNweShkYXRhLCAmY29tYmluZWRfWzBdICsgb2Zmc2V0LCBzaXplKTsKLSAgICArK3JlYWRfY291bnRfOwotICAgIHJlYWRfYnl0ZXNfICs9IHNpemU7Ci0gICAgcmV0dXJuIHNpemU7Ci0gIH0KLQotICB2b2lkIENsZWFyUmVhZFN0YXRpc3RpY3MoKSB7Ci0gICAgcmVhZF9jb3VudF8gPSAwOwotICAgIHJlYWRfYnl0ZXNfID0gMDsKLSAgfQotCi0gIGludCByZWFkX2NvdW50KCkgY29uc3QgeyByZXR1cm4gcmVhZF9jb3VudF87IH0KLSAgaW50IHJlYWRfYnl0ZXMoKSBjb25zdCB7IHJldHVybiByZWFkX2J5dGVzXzsgfQotCi0gIHZvaWQgRHVtcCgpIGNvbnN0IHsKLSAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgICB1aW50MzIgYm94ZXNbXSA9IHtrQXRvbVR5cGVfc3Rzeiwga0F0b21UeXBlX3N0Y28sIGtBdG9tVHlwZV9jbzY0LAotICAgICAgICAgICAgICAgICAgICAgIGtBdG9tVHlwZV9zdHNjLCBrQXRvbVR5cGVfY3R0cywga0F0b21UeXBlX3N0dHMsCi0gICAgICAgICAgICAgICAgICAgICAga0F0b21UeXBlX3N0c3N9OwotICAgIGNvbnN0IGNoYXIqIG5hbWVzW10gPSB7InN0c3oiLCAic3RjbyIsICJjbzY0IiwgInN0c2MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImN0dHMiLCAic3R0cyIsICJzdHNzIn07Ci0gICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBzaXplb2YoYm94ZXMpIC8gc2l6ZW9mKCpib3hlcyk7ICsraSkgewotICAgICAgc3MgPDwgIlxuPT09PT09PT09PT09PT09PT09PT09PT09ICIgPDwgbmFtZXNbaV0KLSAgICAgICAgIDw8ICIgPT09PT09PT09PT09PT09PT09PT09PT09XG4iOwotICAgICAgaW50NjQgc2l6ZSA9IEdldEJveFNpemUoYm94ZXNbaV0pOwotICAgICAgY29uc3QgdWludDhfdCogZGF0YSA9IEdldEJveERhdGEoYm94ZXNbaV0pOwotICAgICAgZm9yIChpbnQ2NCBqID0gMDsgaiA8IHNpemU7ICsraikgewotICAgICAgICBzcyA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGRhdGFbal0pIDw8ICcgJzsKLSAgICAgICAgaWYgKGogIT0gMCAmJiBqICUgMzIgPT0gMCkKLSAgICAgICAgICBzcyA8PCAnXG4nOwotICAgICAgfQotICAgIH0KLSAgICBMT0coSU5GTykgPDwgc3Muc3RyKCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIFNhbXBsZVZlY3RvciBzYW1wbGVzXzsKLQotICBpbnQ2NCBmaWxlX29mZnNldF87Ci0gIGludDY0IHN0c3pfb2Zmc2V0XzsKLSAgaW50NjQgc3Rjb19vZmZzZXRfOwotICBpbnQ2NCBjbzY0X29mZnNldF87Ci0gIGludDY0IHN0c2Nfb2Zmc2V0XzsKLSAgaW50NjQgY3R0c19vZmZzZXRfOwotICBpbnQ2NCBzdHRzX29mZnNldF87Ci0gIGludDY0IHN0c3Nfb2Zmc2V0XzsKLQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjb21iaW5lZF87Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHN0c3pfOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzdGNvXzsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY282NF87Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHN0c2NfOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjdHRzXzsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc3R0c187Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHN0c3NfOwotCi0gIGludCByZWFkX2NvdW50XzsKLSAgaW50IHJlYWRfYnl0ZXNfOwotCi0gIHN0YXRpYyB2b2lkIGluY191aW50MzJfYmlnX2VuZGlhbih1aW50OF90KiBkYXRhKSB7Ci0gICAgdWludDMyIHZhbHVlID0gbG9hZF91aW50MzJfYmlnX2VuZGlhbihkYXRhKTsKLSAgICBzdG9yZV91aW50MzJfYmlnX2VuZGlhbih2YWx1ZSArIDEsIGRhdGEpOwotICB9Ci0KLSAgdm9pZCBQb3B1bGF0ZUJveGVzKCkgewotICAgIENIRUNLKCFzYW1wbGVzXy5lbXB0eSgpKTsKLSAgICBib29sIGFsbF9rZXlfZnJhbWVzID0gdHJ1ZTsKLSAgICBib29sIGFsbF9jdHRzX29mZnNldF9pc196ZXJvID0gdHJ1ZTsKLSAgICBib29sIGFsbF9zYW1wbGVfaGFzX3NhbWVfc2l6ZSA9IHRydWU7Ci0KLSAgICBmb3IgKFNhbXBsZVZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IHNhbXBsZXNfLmJlZ2luKCk7Ci0gICAgICAgICBpdGVyICE9IHNhbXBsZXNfLmVuZCgpOyArK2l0ZXIpIHsKLSAgICAgIGlmICghaXRlci0+aXNfa2V5X2ZyYW1lKQotICAgICAgICBhbGxfa2V5X2ZyYW1lcyA9IGZhbHNlOwotICAgICAgaWYgKGl0ZXItPmR0cyAhPSBpdGVyLT5jdHMpCi0gICAgICAgIGFsbF9jdHRzX29mZnNldF9pc196ZXJvID0gZmFsc2U7Ci0gICAgICBpZiAoaXRlci0+c2l6ZSAhPSBzYW1wbGVzX1swXS5zaXplKQotICAgICAgICBhbGxfc2FtcGxlX2hhc19zYW1lX3NpemUgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBwb3B1bGF0ZSB0aGUgc3RzeiBib3g6IDQgYnl0ZXMgZmxhZ3MgKyA0IGJ5dGVzIGRlZmF1bHQgc2l6ZQotICAgIC8vICAgICArIDQgYnl0ZXMgY291bnQgKyBzaXplIHRhYmxlIGlmIGRlZmF1bHQgc2l6ZSBpcyAwCi0gICAgaWYgKGFsbF9zYW1wbGVfaGFzX3NhbWVfc2l6ZSkgewotICAgICAgc3Rzel8ucmVzaXplKDEyKTsKLSAgICAgIHN0b3JlX3VpbnQzMl9iaWdfZW5kaWFuKHNhbXBsZXNfWzBdLnNpemUsICZzdHN6X1s0XSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN0c3pfLnJlc2l6ZShzYW1wbGVzXy5zaXplKCkgKiBrRW50cnlTaXplX3N0c3ogKyAxMik7Ci0gICAgICBzdG9yZV91aW50MzJfYmlnX2VuZGlhbigwLCAmc3Rzel9bNF0pOwotCi0gICAgICB1aW50OF90KiB0YWJsZV9vZmZzZXQgPSAmc3Rzel9bMTJdOwotCi0gICAgICBmb3IgKFNhbXBsZVZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IHNhbXBsZXNfLmJlZ2luKCk7Ci0gICAgICAgICAgIGl0ZXIgIT0gc2FtcGxlc18uZW5kKCk7ICsraXRlcikgewotICAgICAgICBzdG9yZV91aW50MzJfYmlnX2VuZGlhbihpdGVyLT5zaXplLCB0YWJsZV9vZmZzZXQpOwotICAgICAgICB0YWJsZV9vZmZzZXQgKz0ga0VudHJ5U2l6ZV9zdHN6OwotICAgICAgfQotICAgIH0KLSAgICBzdG9yZV91aW50MzJfYmlnX2VuZGlhbihzYW1wbGVzXy5zaXplKCksICZzdHN6X1s4XSk7Ci0KLSAgICAvLyBwb3B1bGF0ZSBzdGNvLCBjbzY0IGFuZCBzdHNjCi0gICAgLy8gc3RjbyA9IDQgYnl0ZXMgY291bnQgKyAoNCBieXRlcyBvZmZzZXQpKgotICAgIC8vIGNvNjQgPSA0IGJ5dGVzIGNvdW50ICsgKDggYnl0ZXMgb2Zmc2V0KSoKLSAgICAvLyBzdHNjID0gNCBieXRlcyBjb3VudCArICg0IGJ5dGVzIGNodW5rIGluZGV4ICsgNCBieXRlcyBzYW1wbGUgcGVyIGNodW5rCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgKyA0IGJ5dGVzIHNhbXBsZSBkZXNjcmlwdGlvbiBpbmRleCkqCi0gICAgc3Rjb18ucmVzaXplKDgpOwotICAgIGNvNjRfLnJlc2l6ZSg4KTsKLSAgICBzdHNjXy5yZXNpemUoOCk7Ci0gICAgdWludDMyIGNodW5rX29mZnNldCA9IHNhbXBsZXNfWzBdLm9mZnNldDsKLSAgICBpbnQgY3VycmVudF9jaHVua19pbmRleCA9IC0xOwotICAgIGZvciAoU2FtcGxlVmVjdG9yOjpjb25zdF9pdGVyYXRvciBpdGVyID0gc2FtcGxlc18uYmVnaW4oKTsKLSAgICAgICAgIGl0ZXIgIT0gc2FtcGxlc18uZW5kKCk7ICsraXRlcikgewotICAgICAgaWYgKGN1cnJlbnRfY2h1bmtfaW5kZXggIT0gaXRlci0+Y2h1bmtfaW5kZXgpIHsKLSAgICAgICAgY3VycmVudF9jaHVua19pbmRleCA9IGl0ZXItPmNodW5rX2luZGV4OwotICAgICAgICBzdGNvXy5yZXNpemUoc3Rjb18uc2l6ZSgpICsga0VudHJ5U2l6ZV9zdGNvKTsKLSAgICAgICAgc3RvcmVfdWludDMyX2JpZ19lbmRpYW4oY2h1bmtfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3Rjb19bc3Rjb18uc2l6ZSgpIC0ga0VudHJ5U2l6ZV9zdGNvXSk7Ci0gICAgICAgIGNvNjRfLnJlc2l6ZShjbzY0Xy5zaXplKCkgKyBrRW50cnlTaXplX2NvNjQpOwotICAgICAgICBzdG9yZV91aW50NjRfYmlnX2VuZGlhbihjaHVua19vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbzY0X1tjbzY0Xy5zaXplKCkgLSBrRW50cnlTaXplX2NvNjRdKTsKLSAgICAgICAgc3RzY18ucmVzaXplKHN0c2NfLnNpemUoKSArIGtFbnRyeVNpemVfc3RzYyk7Ci0gICAgICAgIHN0b3JlX3VpbnQzMl9iaWdfZW5kaWFuKGN1cnJlbnRfY2h1bmtfaW5kZXggKyAxLCAgLy8gc3RhcnQgZnJvbSAxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHNjX1tzdHNjXy5zaXplKCkgLSBrRW50cnlTaXplX3N0c2NdKTsKLSAgICAgIH0KLSAgICAgIGluY191aW50MzJfYmlnX2VuZGlhbigmc3RzY19bc3RzY18uc2l6ZSgpIC0ga0VudHJ5U2l6ZV9zdHNjICsgNF0pOwotICAgICAgY2h1bmtfb2Zmc2V0ICs9IGl0ZXItPnNpemU7Ci0gICAgfQotICAgIHN0b3JlX3VpbnQzMl9iaWdfZW5kaWFuKChzdGNvXy5zaXplKCkgLSA4KSAvIGtFbnRyeVNpemVfc3RjbywgJnN0Y29fWzRdKTsKLSAgICBzdG9yZV91aW50MzJfYmlnX2VuZGlhbigoY282NF8uc2l6ZSgpIC0gOCkgLyBrRW50cnlTaXplX2NvNjQsICZjbzY0X1s0XSk7Ci0gICAgc3RvcmVfdWludDMyX2JpZ19lbmRpYW4oKHN0c2NfLnNpemUoKSAtIDgpIC8ga0VudHJ5U2l6ZV9zdHNjLCAmc3RzY19bNF0pOwotCi0gICAgLy8gcG9wdWxhdGUgc3R0cyBhbmQgY3R0cy4KLSAgICAvLyBzdHRzID0gNCBieXRlcyBjb3VudCArICg0IGJ5dGVzIHNhbXBsZSBjb3VudCArIDQgYnl0ZXMgc2FtcGxlIGRlbHRhKSoKLSAgICAvLyBjdHRzID0gNCBieXRlcyBjb3VudCArICg0IGJ5dGVzIHNhbXBsZSBjb3VudCArIDQgYnl0ZXMgc2FtcGxlIG9mZnNldCkqCi0gICAgLy8gICAgICAgIHRoZSBvZmZzZXQgaXMgdG8gc3R0cy4KLSAgICBzdHRzXy5yZXNpemUoOCk7Ci0gICAgY3R0c18ucmVzaXplKGFsbF9jdHRzX29mZnNldF9pc196ZXJvID8gMCA6IDgpOwotICAgIGludDMyIGxhc3Rfc3R0c19kdXJhdGlvbiA9IC0xOwotICAgIGludDMyIGxhc3RfY3R0c19vZmZzZXQgPSBzYW1wbGVzX1swXS5jdHMgLSBzYW1wbGVzX1swXS5kdHMgLSAxOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzYW1wbGVzXy5zaXplKCk7ICsraSkgewotICAgICAgaW50MzIgY3R0c19vZmZzZXQgPSBzYW1wbGVzX1tpXS5jdHMgLSBzYW1wbGVzX1tpXS5kdHM7Ci0gICAgICBpZiAobGFzdF9zdHRzX2R1cmF0aW9uICE9IHNhbXBsZXNfW2ldLmR0c19kdXJhdGlvbikgewotICAgICAgICBzdHRzXy5yZXNpemUoc3R0c18uc2l6ZSgpICsga0VudHJ5U2l6ZV9zdHRzKTsKLSAgICAgICAgbGFzdF9zdHRzX2R1cmF0aW9uID0gc2FtcGxlc19baV0uZHRzX2R1cmF0aW9uOwotICAgICAgICBzdG9yZV91aW50MzJfYmlnX2VuZGlhbihsYXN0X3N0dHNfZHVyYXRpb24sICZzdHRzX1tzdHRzXy5zaXplKCkgLSA0XSk7Ci0gICAgICB9Ci0gICAgICBpbmNfdWludDMyX2JpZ19lbmRpYW4oJnN0dHNfW3N0dHNfLnNpemUoKSAtIDhdKTsKLSAgICAgIGlmICghYWxsX2N0dHNfb2Zmc2V0X2lzX3plcm8pIHsKLSAgICAgICAgaWYgKGxhc3RfY3R0c19vZmZzZXQgIT0gY3R0c19vZmZzZXQpIHsKLSAgICAgICAgICBjdHRzXy5yZXNpemUoY3R0c18uc2l6ZSgpICsga0VudHJ5U2l6ZV9jdHRzKTsKLSAgICAgICAgICBzdG9yZV91aW50MzJfYmlnX2VuZGlhbihjdHRzX29mZnNldCwgJmN0dHNfW2N0dHNfLnNpemUoKSAtIDRdKTsKLSAgICAgICAgICBsYXN0X2N0dHNfb2Zmc2V0ID0gY3R0c19vZmZzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgaW5jX3VpbnQzMl9iaWdfZW5kaWFuKCZjdHRzX1tjdHRzXy5zaXplKCkgLSA4XSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHN0b3JlX3VpbnQzMl9iaWdfZW5kaWFuKChzdHRzXy5zaXplKCkgLSA4KSAvIGtFbnRyeVNpemVfc3R0cywgJnN0dHNfWzRdKTsKLSAgICBpZiAoIWFsbF9jdHRzX29mZnNldF9pc196ZXJvKQotICAgICAgc3RvcmVfdWludDMyX2JpZ19lbmRpYW4oKGN0dHNfLnNpemUoKSAtIDgpIC8ga0VudHJ5U2l6ZV9jdHRzLCAmY3R0c19bNF0pOwotCi0gICAgLy8gcG9wdWxhdGUgc3RzcyBib3gKLSAgICAvLyBzdHNzID0gNCBieXRlcyBjb3VudCArICg0IGJ5dGVzIHNhbXBsZSBpbmRleCkqCi0gICAgaWYgKCFhbGxfa2V5X2ZyYW1lcykgewotICAgICAgc3Rzc18ucmVzaXplKDgpOwotICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzYW1wbGVzXy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAoc2FtcGxlc19baV0uaXNfa2V5X2ZyYW1lKSB7Ci0gICAgICAgICAgc3Rzc18ucmVzaXplKHN0c3NfLnNpemUoKSArIGtFbnRyeVNpemVfc3Rzcyk7Ci0gICAgICAgICAgc3RvcmVfdWludDMyX2JpZ19lbmRpYW4oaSArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0c3NfW3N0c3NfLnNpemUoKSAtIGtFbnRyeVNpemVfc3Rzc10pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBzdG9yZV91aW50MzJfYmlnX2VuZGlhbigoc3Rzc18uc2l6ZSgpIC0gOCkgLyBrRW50cnlTaXplX3N0c3MsICZzdHNzX1s0XSk7Ci0gICAgfQotCi0gICAgY29uc3QgaW50IGtHYXJiYWdlU2l6ZSA9IDEwMjQ7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZ2FyYmFnZTsKLSAgICBnYXJiYWdlLnJlc2VydmUoa0dhcmJhZ2VTaXplKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGtHYXJiYWdlU2l6ZTsgKytpKQotICAgICAgZ2FyYmFnZS5wdXNoX2JhY2soUmFuZG9tUmFuZ2UoMHhlZiwgMHhmZSkpOwotICAgIGNvbWJpbmVkXy5pbnNlcnQoY29tYmluZWRfLmVuZCgpLCBnYXJiYWdlLmJlZ2luKCksIGdhcmJhZ2UuZW5kKCkpOwotICAgIGNvbWJpbmVkXy5pbnNlcnQoY29tYmluZWRfLmVuZCgpLCBzdHN6Xy5iZWdpbigpLCBzdHN6Xy5lbmQoKSk7Ci0gICAgY29tYmluZWRfLmluc2VydChjb21iaW5lZF8uZW5kKCksIGdhcmJhZ2UuYmVnaW4oKSwgZ2FyYmFnZS5lbmQoKSk7Ci0gICAgY29tYmluZWRfLmluc2VydChjb21iaW5lZF8uZW5kKCksIHN0Y29fLmJlZ2luKCksIHN0Y29fLmVuZCgpKTsKLSAgICBjb21iaW5lZF8uaW5zZXJ0KGNvbWJpbmVkXy5lbmQoKSwgZ2FyYmFnZS5iZWdpbigpLCBnYXJiYWdlLmVuZCgpKTsKLSAgICBjb21iaW5lZF8uaW5zZXJ0KGNvbWJpbmVkXy5lbmQoKSwgY282NF8uYmVnaW4oKSwgY282NF8uZW5kKCkpOwotICAgIGNvbWJpbmVkXy5pbnNlcnQoY29tYmluZWRfLmVuZCgpLCBnYXJiYWdlLmJlZ2luKCksIGdhcmJhZ2UuZW5kKCkpOwotICAgIGNvbWJpbmVkXy5pbnNlcnQoY29tYmluZWRfLmVuZCgpLCBzdHNjXy5iZWdpbigpLCBzdHNjXy5lbmQoKSk7Ci0gICAgY29tYmluZWRfLmluc2VydChjb21iaW5lZF8uZW5kKCksIGdhcmJhZ2UuYmVnaW4oKSwgZ2FyYmFnZS5lbmQoKSk7Ci0gICAgY29tYmluZWRfLmluc2VydChjb21iaW5lZF8uZW5kKCksIGN0dHNfLmJlZ2luKCksIGN0dHNfLmVuZCgpKTsKLSAgICBjb21iaW5lZF8uaW5zZXJ0KGNvbWJpbmVkXy5lbmQoKSwgZ2FyYmFnZS5iZWdpbigpLCBnYXJiYWdlLmVuZCgpKTsKLSAgICBjb21iaW5lZF8uaW5zZXJ0KGNvbWJpbmVkXy5lbmQoKSwgc3R0c18uYmVnaW4oKSwgc3R0c18uZW5kKCkpOwotICAgIGNvbWJpbmVkXy5pbnNlcnQoY29tYmluZWRfLmVuZCgpLCBnYXJiYWdlLmJlZ2luKCksIGdhcmJhZ2UuZW5kKCkpOwotICAgIGNvbWJpbmVkXy5pbnNlcnQoY29tYmluZWRfLmVuZCgpLCBzdHNzXy5iZWdpbigpLCBzdHNzXy5lbmQoKSk7Ci0gICAgY29tYmluZWRfLmluc2VydChjb21iaW5lZF8uZW5kKCksIGdhcmJhZ2UuYmVnaW4oKSwgZ2FyYmFnZS5lbmQoKSk7Ci0KLSAgICBmaWxlX29mZnNldF8gPSBhYnMocmFuZCgpKTsKLSAgICBzdHN6X29mZnNldF8gPSBmaWxlX29mZnNldF8gKyBrR2FyYmFnZVNpemU7Ci0gICAgc3Rjb19vZmZzZXRfID0gc3Rzel9vZmZzZXRfICsgc3Rzel8uc2l6ZSgpICsga0dhcmJhZ2VTaXplOwotICAgIGNvNjRfb2Zmc2V0XyA9IHN0Y29fb2Zmc2V0XyArIHN0Y29fLnNpemUoKSArIGtHYXJiYWdlU2l6ZTsKLSAgICBzdHNjX29mZnNldF8gPSBjbzY0X29mZnNldF8gKyBjbzY0Xy5zaXplKCkgKyBrR2FyYmFnZVNpemU7Ci0gICAgY3R0c19vZmZzZXRfID0gc3RzY19vZmZzZXRfICsgc3RzY18uc2l6ZSgpICsga0dhcmJhZ2VTaXplOwotICAgIHN0dHNfb2Zmc2V0XyA9IGN0dHNfb2Zmc2V0XyArIGN0dHNfLnNpemUoKSArIGtHYXJiYWdlU2l6ZTsKLSAgICBzdHNzX29mZnNldF8gPSBzdHRzX29mZnNldF8gKyBzdHRzXy5zaXplKCkgKyBrR2FyYmFnZVNpemU7Ci0gIH0KLX07Ci0KLWNsYXNzIFNoZWxsTVA0TWFwVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIFNoZWxsTVA0TWFwVGVzdCgpIHsKLSAgICAvLyB3ZSBjcmVhdGUgYW5kIGRlc3Ryb3kgYnVmZmVyIGZhY3RvcnkgYWZ0ZXIgZWFjaCB0ZXN0IHRvIGRldGVjdCBhbnkKLSAgICAvLyBsZWFrZWQgcmVmZXJlbmNlLWNvdW50ZWQgb2JqZWN0cyBvciBwZW5kaW5nIGNhbGxiYWNrcwotICAgIFNoZWxsQnVmZmVyRmFjdG9yeTo6SW5pdGlhbGl6ZSgpOwotICAgIC8vIG1ha2UgYSBuZXcgbW9jayByZWFkZXIKLSAgICByZWFkZXJfID0gbmV3IDo6dGVzdGluZzo6TmljZU1vY2s8TW9ja1NoZWxsRGF0YVNvdXJjZVJlYWRlcj4oKTsKLSAgICAvLyBtYWtlIGEgbmV3IG1hcCB3aXRoIGEgbW9jayByZWFkZXIuCi0gICAgbWFwXyA9IG5ldyBTaGVsbE1QNE1hcChyZWFkZXJfKTsKLSAgfQotCi0gIHZpcnR1YWwgflNoZWxsTVA0TWFwVGVzdCgpIHsKLSAgICAvLyB3aXBlIG91dCB0aGUgbWFwIG9yIFNoZWxsQnVmZmVyRmFjdG9yeSBtYXkgY29tcGxhaW4gb2YgdW5mcmVlZCBhbGxvY3MKLSAgICBEQ0hFQ0sobWFwXy0+SGFzT25lUmVmKCkpOwotICAgIG1hcF8gPSBOVUxMOwotCi0gICAgcmVhZGVyXy0+U3RvcChiYXNlOjpDbG9zdXJlKCkpOwotICAgIERDSEVDSyhyZWFkZXJfLT5IYXNPbmVSZWYoKSk7Ci0gICAgcmVhZGVyXyA9IE5VTEw7Ci0KLSAgICBTaGVsbEJ1ZmZlckZhY3Rvcnk6OlRlcm1pbmF0ZSgpOwotICB9Ci0KLSAgdm9pZCBSZXNldE1hcCgpIHsgbWFwXyA9IG5ldyBTaGVsbE1QNE1hcChyZWFkZXJfKTsgfQotCi0gIHZvaWQgQ3JlYXRlVGVzdFNhbXBsZVRhYmxlKHVuc2lnbmVkIGludCBzZWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX29mX3NhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5fc2FtcGxlX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfc2FtcGxlX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5fc2FtcGxlc19wZXJfY2h1bmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfc2FtcGxlc19wZXJfY2h1bmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5fa2V5X2ZyYW1lX2dhcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9rZXlfZnJhbWVfZ2FwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluX3NhbXBsZV9kZWNvZGVfdGltZXN0YW1wX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9zYW1wbGVfZGVjb2RlX3RpbWVzdGFtcF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5fc2FtcGxlX2NvbXBvc2l0aW9uX3RpbWVzdGFtcF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfc2FtcGxlX2NvbXBvc2l0aW9uX3RpbWVzdGFtcF9vZmZzZXQpIHsKLSAgICBzYW1wbGVfdGFibGVfLnJlc2V0KG5ldyBTYW1wbGVUYWJsZSgKLSAgICAgICAgc2VlZCwgbnVtX29mX3NhbXBsZXMsIG1pbl9zYW1wbGVfc2l6ZSwgbWF4X3NhbXBsZV9zaXplLAotICAgICAgICBtaW5fc2FtcGxlc19wZXJfY2h1bmssIG1heF9zYW1wbGVzX3Blcl9jaHVuaywgbWluX2tleV9mcmFtZV9nYXAsCi0gICAgICAgIG1heF9rZXlfZnJhbWVfZ2FwLCBtaW5fc2FtcGxlX2RlY29kZV90aW1lc3RhbXBfb2Zmc2V0LAotICAgICAgICBtYXhfc2FtcGxlX2RlY29kZV90aW1lc3RhbXBfb2Zmc2V0LAotICAgICAgICBtaW5fc2FtcGxlX2NvbXBvc2l0aW9uX3RpbWVzdGFtcF9vZmZzZXQsCi0gICAgICAgIG1heF9zYW1wbGVfY29tcG9zaXRpb25fdGltZXN0YW1wX29mZnNldCkpOwotICAgIE9OX0NBTEwoKnJlYWRlcl8sIEJsb2NraW5nUmVhZChfLCBfLCBfKSkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoSW52b2tlKHNhbXBsZV90YWJsZV8uZ2V0KCksICZTYW1wbGVUYWJsZTo6QmxvY2tpbmdSZWFkKSk7Ci0gIH0KLQotICB2b2lkIFNldFRlc3RUYWJsZSh1aW50MzIgZm91cl9jYywgdWludDMyIGNhY2hlX3NpemVfZW50cmllcykgewotICAgIG1hcF8tPlNldEF0b20oZm91cl9jYywgc2FtcGxlX3RhYmxlXy0+R2V0Qm94T2Zmc2V0KGZvdXJfY2MpLAotICAgICAgICAgICAgICAgICAgc2FtcGxlX3RhYmxlXy0+R2V0Qm94U2l6ZShmb3VyX2NjKSwgY2FjaGVfc2l6ZV9lbnRyaWVzLAotICAgICAgICAgICAgICAgICAgc2FtcGxlX3RhYmxlXy0+R2V0Qm94RGF0YShmb3VyX2NjKSk7Ci0gIH0KLQotICBjb25zdCBTYW1wbGUmIEdldFRlc3RTYW1wbGUodWludDMyIHNhbXBsZV9udW1iZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gc2FtcGxlX3RhYmxlXy0+c2FtcGxlKHNhbXBsZV9udW1iZXIpOwotICB9Ci0KLSAgLy8gPT09PSBUZXN0IEZpeHR1cmUgTWVtYmVycwotICBzY29wZWRfcmVmcHRyPFNoZWxsTVA0TWFwPiBtYXBfOwotICBzY29wZWRfcmVmcHRyPE1vY2tTaGVsbERhdGFTb3VyY2VSZWFkZXI+IHJlYWRlcl87Ci0gIHNjb3BlZF9wdHI8U2FtcGxlVGFibGU+IHNhbXBsZV90YWJsZV87Ci19OwotCi0vLyA9PT09IFNldEF0b20oKSBUZXN0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLyoKLVRFU1RfRihTaGVsbE1QNE1hcFRlc3QsIFNldEF0b21XaXRoWmVyb0RlZmF1bHRTaXplKSB7Ci0gIC8vIFNldEF0b20oKSBzaG91bGQgZmFpbCB3aXRoIGEgemVybyBkZWZhdWx0IHNpemUgb24gYW4gc3RzYy4KLSAgTk9USU1QTEVNRU5URUQoKTsKLX0KLSovCi0vLyA9PT09IEdldFNpemUoKSBUZXN0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1URVNUX0YoU2hlbGxNUDRNYXBUZXN0LCBHZXRTaXplV2l0aERlZmF1bHRTaXplKSB7Ci0gIENyZWF0ZVRlc3RTYW1wbGVUYWJsZSgxMDAsIDEwMDAsIDB4YjBkZjAwZCwgMHhiMGRmMDBkLCA1LCAxMCwgNSwgMTAsIDEwLCAyMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDEwLCAyMCk7Ci0gIHNhbXBsZV90YWJsZV8tPkNsZWFyUmVhZFN0YXRpc3RpY3MoKTsKLQotICBmb3IgKGludCBpID0gMTM7IGkgPCAyMTsgKytpKSB7Ci0gICAgUmVzZXRNYXAoKTsKLSAgICBTZXRUZXN0VGFibGUoa0F0b21UeXBlX3N0c3osIGkpOwotCi0gICAgdWludDMyIHJldHVybmVkX3NpemU7Ci0gICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0U2l6ZSgwLCByZXR1cm5lZF9zaXplKSk7Ci0gICAgQVNTRVJUX0VRKHJldHVybmVkX3NpemUsIDB4YjBkZjAwZCk7Ci0gICAgQVNTRVJUX0ZBTFNFKG1hcF8tPkdldFNpemUoMjAwMCwgcmV0dXJuZWRfc2l6ZSkpOwotICAgIEFTU0VSVF9UUlVFKG1hcF8tPkdldFNpemUoMiwgcmV0dXJuZWRfc2l6ZSkpOwotICAgIEFTU0VSVF9FUShyZXR1cm5lZF9zaXplLCAweGIwZGYwMGQpOwotICAgIEFTU0VSVF9UUlVFKG1hcF8tPkdldFNpemUoMTIwLCByZXR1cm5lZF9zaXplKSk7Ci0gICAgQVNTRVJUX0VRKHJldHVybmVkX3NpemUsIDB4YjBkZjAwZCk7Ci0gIH0KLQotICBBU1NFUlRfRVEoc2FtcGxlX3RhYmxlXy0+cmVhZF9jb3VudCgpLCAwKTsKLX0KLQotVEVTVF9GKFNoZWxsTVA0TWFwVGVzdCwgR2V0U2l6ZUl0ZXJhdGlvbldpdGhIdWdlQ2FjaGUpIHsKLSAgZm9yIChpbnQgbWF4X3NhbXBsZV9zaXplID0gMTA7IG1heF9zYW1wbGVfc2l6ZSA8IDIwOyArK21heF9zYW1wbGVfc2l6ZSkgewotICAgIENyZWF0ZVRlc3RTYW1wbGVUYWJsZSgyMDAgKyBtYXhfc2FtcGxlX3NpemUsIDEwMDAsIDEwLCBtYXhfc2FtcGxlX3NpemUsIDUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDEwLCA1LCAxMCwgMTAsIDIwLCAxMCwgMjApOwotICAgIGZvciAoaW50IGkgPSAxNTAwOyBpIDwgMTAwMDA7IGkgPSBpICogMiArIDEpIHsKLSAgICAgIFJlc2V0TWFwKCk7Ci0gICAgICBzYW1wbGVfdGFibGVfLT5DbGVhclJlYWRTdGF0aXN0aWNzKCk7Ci0gICAgICBTZXRUZXN0VGFibGUoa0F0b21UeXBlX3N0c3osIGkpOwotCi0gICAgICBmb3IgKHVpbnQzMiBqID0gMDsgaiA8IHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpOyBqKyspIHsKLSAgICAgICAgdWludDMyIG1hcF9yZXBvcnRlZF9zaXplID0gMDsKLSAgICAgICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0U2l6ZShqLCBtYXBfcmVwb3J0ZWRfc2l6ZSkpOwotICAgICAgICB1aW50MzIgdGFibGVfc2l6ZSA9IEdldFRlc3RTYW1wbGUoaikuc2l6ZTsKLSAgICAgICAgLy8gcmVwb3J0ZWQgc2l6ZSBzaG91bGQgbWF0Y2ggdGFibGUgc2l6ZQotICAgICAgICBBU1NFUlRfRVEobWFwX3JlcG9ydGVkX3NpemUsIHRhYmxlX3NpemUpOwotICAgICAgfQotCi0gICAgICAvLyBjYWxsIHRvIGEgc2FtcGxlIHBhc3QgdGhlIHNpemUgb2YgdGhlIHRhYmxlIHNob3VsZCBmYWlsCi0gICAgICB1aW50MzIgZmFpbGVkX3NpemUgPSAwOwotICAgICAgQVNTRVJUX0ZBTFNFKG1hcF8tPkdldFNpemUoc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCksIGZhaWxlZF9zaXplKSk7Ci0gICAgICBBU1NFUlRfTEUoc2FtcGxlX3RhYmxlXy0+cmVhZF9jb3VudCgpLCAxKTsKLSAgICAgIEFTU0VSVF9MRShzYW1wbGVfdGFibGVfLT5yZWFkX2J5dGVzKCksCi0gICAgICAgICAgICAgICAgc2FtcGxlX3RhYmxlXy0+R2V0Qm94U2l6ZShrQXRvbVR5cGVfc3RzeikpOwotICAgIH0KLSAgfQotfQotCi1URVNUX0YoU2hlbGxNUDRNYXBUZXN0LCBHZXRTaXplSXRlcmF0aW9uVGlueUNhY2hlKSB7Ci0gIGZvciAoaW50IG1heF9zYW1wbGVfc2l6ZSA9IDEwOyBtYXhfc2FtcGxlX3NpemUgPCAyMDsgKyttYXhfc2FtcGxlX3NpemUpIHsKLSAgICBDcmVhdGVUZXN0U2FtcGxlVGFibGUoMzAwICsgbWF4X3NhbXBsZV9zaXplLCAxMDAwLCAxMCwgbWF4X3NhbXBsZV9zaXplLCA1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwgNSwgMTAsIDEwLCAyMCwgMTAsIDIwKTsKLSAgICBmb3IgKGludCBpID0gNTsgaSA8IDEyOyArK2kpIHsKLSAgICAgIFJlc2V0TWFwKCk7Ci0gICAgICBTZXRUZXN0VGFibGUoa0F0b21UeXBlX3N0c3osIGkpOwotICAgICAgc2FtcGxlX3RhYmxlXy0+Q2xlYXJSZWFkU3RhdGlzdGljcygpOwotICAgICAgZm9yICh1aW50MzIgaiA9IDA7IGogPCBzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKTsgaisrKSB7Ci0gICAgICAgIHVpbnQzMiBtYXBfcmVwb3J0ZWRfc2l6ZSA9IDA7Ci0gICAgICAgIEFTU0VSVF9UUlVFKG1hcF8tPkdldFNpemUoaiwgbWFwX3JlcG9ydGVkX3NpemUpKTsKLSAgICAgICAgdWludDMyIHRhYmxlX3NpemUgPSBHZXRUZXN0U2FtcGxlKGopLnNpemU7Ci0gICAgICAgIEFTU0VSVF9FUShtYXBfcmVwb3J0ZWRfc2l6ZSwgdGFibGVfc2l6ZSk7Ci0gICAgICB9Ci0gICAgICBBU1NFUlRfTEUoc2FtcGxlX3RhYmxlXy0+cmVhZF9jb3VudCgpLAotICAgICAgICAgICAgICAgIHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpIC8gaSArIDEpOwotICAgICAgaWYgKHNhbXBsZV90YWJsZV8tPnJlYWRfY291bnQoKSkKLSAgICAgICAgQVNTRVJUX0xFKHNhbXBsZV90YWJsZV8tPnJlYWRfYnl0ZXMoKSAvIHNhbXBsZV90YWJsZV8tPnJlYWRfY291bnQoKSwKLSAgICAgICAgICAgICAgICAgIChpICsgMSkgKiBrRW50cnlTaXplX3N0c3opOwotICAgICAgLy8gY2FsbCB0byBzYW1wbGUgcGFzdCB0aGUgdGFibGUgc2l6ZSBzaG91bGQgc3RpbGwgZmFpbGUKLSAgICAgIHVpbnQzMiBmYWlsZWRfc2l6ZSA9IDA7Ci0gICAgICBBU1NFUlRfRkFMU0UobWFwXy0+R2V0U2l6ZShzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKSwgZmFpbGVkX3NpemUpKTsKLSAgICB9Ci0gIH0KLX0KLQotVEVTVF9GKFNoZWxsTVA0TWFwVGVzdCwgR2V0U2l6ZVJhbmRvbUFjY2VzcykgewotICBDcmVhdGVUZXN0U2FtcGxlVGFibGUoMTAxLCAyMDAwLCAyMCwgMjQsIDUsIDEwLCA1LCAxMCwgMTAsIDIwLCAxMCwgMjApOwotICBmb3IgKGludCBpID0gMjQ7IGkgPCAyNzsgKytpKSB7Ci0gICAgUmVzZXRNYXAoKTsKLSAgICBTZXRUZXN0VGFibGUoa0F0b21UeXBlX3N0c3osIGkpOwotICAgIHNhbXBsZV90YWJsZV8tPkNsZWFyUmVhZFN0YXRpc3RpY3MoKTsKLSAgICAvLyB0ZXN0IGZpcnN0IHNhbXBsZSBxdWVyeSBzb21ld2hlcmUgbGF0ZXIgaW4gdGhlIHRhYmxlLCBzYW1wbGUgMTA1Ci0gICAgdWludDMyIG1hcF9yZXBvcnRlZF9zaXplID0gMDsKLSAgICBBU1NFUlRfVFJVRShtYXBfLT5HZXRTaXplKGkgKiA0ICsgNSwgbWFwX3JlcG9ydGVkX3NpemUpKTsKLSAgICB1aW50MzIgdGFibGVfc2l6ZSA9IEdldFRlc3RTYW1wbGUoaSAqIDQgKyA1KS5zaXplOwotICAgIEFTU0VSVF9FUShtYXBfcmVwb3J0ZWRfc2l6ZSwgdGFibGVfc2l6ZSk7Ci0gICAgQVNTRVJUX0VRKHNhbXBsZV90YWJsZV8tPnJlYWRfY291bnQoKSwgMSk7Ci0gICAgQVNTRVJUX0xFKHNhbXBsZV90YWJsZV8tPnJlYWRfYnl0ZXMoKSwgKGkgKyAxKSAqIGtFbnRyeVNpemVfc3Rzeik7Ci0KLSAgICAvLyBub3cganVtcCBiYWNrIHRvIHNhbXBsZSAwCi0gICAgc2FtcGxlX3RhYmxlXy0+Q2xlYXJSZWFkU3RhdGlzdGljcygpOwotICAgIEFTU0VSVF9UUlVFKG1hcF8tPkdldFNpemUoMCwgbWFwX3JlcG9ydGVkX3NpemUpKTsKLSAgICB0YWJsZV9zaXplID0gR2V0VGVzdFNhbXBsZSgwKS5zaXplOwotICAgIEFTU0VSVF9FUShtYXBfcmVwb3J0ZWRfc2l6ZSwgdGFibGVfc2l6ZSk7Ci0gICAgQVNTRVJUX0VRKHNhbXBsZV90YWJsZV8tPnJlYWRfY291bnQoKSwgMSk7Ci0gICAgQVNTRVJUX0xFKHNhbXBsZV90YWJsZV8tPnJlYWRfYnl0ZXMoKSwgKGkgKyAxKSAqIGtFbnRyeVNpemVfc3Rzeik7Ci0KLSAgICAvLyBub3cgc2VlayB3ZWxsIHBhc3QgdGhlIGVuZCwgdGhpcyBxdWVyeSBzaG91bGQgZmFpbCBidXQgbm90IGJyZWFrCi0gICAgLy8gc3Vic2VxdWVudCBxdWVyaWVzIG9yIGlzc3VlIGEgcmVjYWNoZQotICAgIEFTU0VSVF9GQUxTRSgKLSAgICAgICAgbWFwXy0+R2V0U2l6ZShzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKSwgbWFwX3JlcG9ydGVkX3NpemUpKTsKLQotICAgIC8vIGEgcXVlcnkgYmFjayB3aXRoaW4gdGhlIGZpcnN0IHRhYmxlIHNob3VsZCBub3QgY2F1c2UgcmVjYWNoZQotICAgIEFTU0VSVF9UUlVFKG1hcF8tPkdldFNpemUoMTAsIG1hcF9yZXBvcnRlZF9zaXplKSk7Ci0gICAgdGFibGVfc2l6ZSA9IEdldFRlc3RTYW1wbGUoMTApLnNpemU7Ci0gICAgQVNTRVJUX0VRKG1hcF9yZXBvcnRlZF9zaXplLCB0YWJsZV9zaXplKTsKLQotICAgIC8vIGNoZWNrIHNhbXBsZSBxdWVyaWVzIHJpZ2h0IG9uIGNhY2hlIGJvdW5kYXJpZXMgb3V0LW9mLW9yZGVyCi0gICAgc2FtcGxlX3RhYmxlXy0+Q2xlYXJSZWFkU3RhdGlzdGljcygpOwotICAgIEFTU0VSVF9UUlVFKG1hcF8tPkdldFNpemUoMiAqIGksIG1hcF9yZXBvcnRlZF9zaXplKSk7Ci0gICAgdGFibGVfc2l6ZSA9IEdldFRlc3RTYW1wbGUoMiAqIGkpLnNpemU7Ci0gICAgQVNTRVJUX0VRKG1hcF9yZXBvcnRlZF9zaXplLCB0YWJsZV9zaXplKTsKLSAgICBBU1NFUlRfRVEoc2FtcGxlX3RhYmxlXy0+cmVhZF9jb3VudCgpLCAxKTsKLSAgICBBU1NFUlRfVFJVRShtYXBfLT5HZXRTaXplKDIgKiBpIC0gMSwgbWFwX3JlcG9ydGVkX3NpemUpKTsKLSAgICB0YWJsZV9zaXplID0gR2V0VGVzdFNhbXBsZSgyICogaSAtIDEpLnNpemU7Ci0gICAgQVNTRVJUX0VRKG1hcF9yZXBvcnRlZF9zaXplLCB0YWJsZV9zaXplKTsKLSAgICBBU1NFUlRfVFJVRShtYXBfLT5HZXRTaXplKDIgKiBpIC0gMiwgbWFwX3JlcG9ydGVkX3NpemUpKTsKLSAgICB0YWJsZV9zaXplID0gR2V0VGVzdFNhbXBsZSgyICogaSAtIDIpLnNpemU7Ci0gICAgQVNTRVJUX0VRKG1hcF9yZXBvcnRlZF9zaXplLCB0YWJsZV9zaXplKTsKLSAgICBBU1NFUlRfRVEoc2FtcGxlX3RhYmxlXy0+cmVhZF9jb3VudCgpLCAyKTsKLSAgfQotfQotCi0vLyA9PT09IEdldE9mZnNldCgpIFRlc3RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1URVNUX0YoU2hlbGxNUDRNYXBUZXN0LCBHZXRPZmZzZXRJdGVyYXRpb25IdWdlQ2FjaGUpIHsKLSAgZm9yIChpbnQgY29pbmRleCA9IDA7IGNvaW5kZXggPCAyOyArK2NvaW5kZXgpIHsKLSAgICBDcmVhdGVUZXN0U2FtcGxlVGFibGUoMTAyICsgY29pbmRleCwgMTAwMCwgMjAsIDI1LCA1LCAxMCwgNSwgMTAsIDEwLCAyMCwgMTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDIwKTsKLSAgICBSZXNldE1hcCgpOwotICAgIFNldFRlc3RUYWJsZShrQXRvbVR5cGVfc3RzeiwgMTAwMCk7Ci0gICAgU2V0VGVzdFRhYmxlKGtBdG9tVHlwZV9zdHNjLCAxMDAwKTsKLSAgICBTZXRUZXN0VGFibGUoY29pbmRleCA/IGtBdG9tVHlwZV9zdGNvIDoga0F0b21UeXBlX2NvNjQsIDEwMDApOwotCi0gICAgLy8gbm8gZXhwZWN0YXRpb25zIG9uIHJlYWRlcl8sIGFsbCB0YWJsZXMgc2hvdWxkIG5vdyBiZSBpbiBtZW1vcnkKLSAgICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpOyArK2kpIHsKLSAgICAgIHVpbnQ2NCBtYXBfcmVwb3J0ZWRfb2Zmc2V0ID0gMDsKLSAgICAgIEFTU0VSVF9UUlVFKG1hcF8tPkdldE9mZnNldChpLCBtYXBfcmVwb3J0ZWRfb2Zmc2V0KSk7Ci0gICAgICB1aW50NjQgdGFibGVfb2Zmc2V0ID0gR2V0VGVzdFNhbXBsZShpKS5vZmZzZXQ7Ci0gICAgICBBU1NFUlRfRVEobWFwX3JlcG9ydGVkX29mZnNldCwgdGFibGVfb2Zmc2V0KTsKLSAgICB9Ci0KLSAgICAvLyBjYWxscyB0byBzYW1wbGUgbnVtYmVycyBvdXRzaWRlIGZpbGUgcmFuZ2Ugc2hvdWxkIGZhaWwgbm9uLWZhdGFsbHkKLSAgICB1aW50NjQgZmFpbGVkX29mZnNldDsKLSAgICBBU1NFUlRfRkFMU0UobWFwXy0+R2V0T2Zmc2V0KHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpLCBmYWlsZWRfb2Zmc2V0KSk7Ci0gIH0KLX0KLQotVEVTVF9GKFNoZWxsTVA0TWFwVGVzdCwgR2V0T2Zmc2V0SXRlcmF0aW9uVGlueUNhY2hlKSB7Ci0gIGZvciAoaW50IGNvaW5kZXggPSAwOyBjb2luZGV4IDwgMjsgKytjb2luZGV4KSB7Ci0gICAgQ3JlYXRlVGVzdFNhbXBsZVRhYmxlKDEwMywgMzAsIDIwLCAyNSwgNSwgMTAsIDUsIDEwLCAxMCwgMjAsIDEwLCAyMCk7Ci0gICAgZm9yIChpbnQgaSA9IDE7IGkgPCAxMjsgKytpKSB7Ci0gICAgICBSZXNldE1hcCgpOwotICAgICAgU2V0VGVzdFRhYmxlKGtBdG9tVHlwZV9zdHN6LCBpKTsKLSAgICAgIFNldFRlc3RUYWJsZShrQXRvbVR5cGVfc3RzYywgaSk7Ci0gICAgICBTZXRUZXN0VGFibGUoY29pbmRleCA/IGtBdG9tVHlwZV9zdGNvIDoga0F0b21UeXBlX2NvNjQsIGkpOwotCi0gICAgICAvLyBpdGVyYXRlIHRocm91Z2ggYWxsIHNhbXBsZXMgaW4gcmFuZ2UKLSAgICAgIGZvciAodWludDMyIGogPSAwOyBqIDwgc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCk7IGogKz0gMikgewotICAgICAgICB1aW50NjQgbWFwX3JlcG9ydGVkX29mZnNldCA9IDA7Ci0gICAgICAgIEFTU0VSVF9UUlVFKG1hcF8tPkdldE9mZnNldChqLCBtYXBfcmVwb3J0ZWRfb2Zmc2V0KSk7Ci0gICAgICAgIHVpbnQ2NCB0YWJsZV9vZmZzZXQgPSBHZXRUZXN0U2FtcGxlKGopLm9mZnNldDsKLSAgICAgICAgQVNTRVJUX0VRKG1hcF9yZXBvcnRlZF9vZmZzZXQsIHRhYmxlX29mZnNldCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIGNhbGxzIHRvIHNhbXBsZSBudW1iZXJzIG91dHNpZGUgZmlsZSByYW5nZSBzaG91bGQgZmFpbCBub24tZmF0YWxseQotICAgICAgdWludDY0IGZhaWxlZF9vZmZzZXQ7Ci0gICAgICBBU1NFUlRfRkFMU0UoCi0gICAgICAgICAgbWFwXy0+R2V0T2Zmc2V0KHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpLCBmYWlsZWRfb2Zmc2V0KSk7Ci0gICAgfQotICB9Ci19Ci0KLS8vIFJhbmRvbSBhY2Nlc3Mgd2l0aGluIGNhY2hlIHNob3VsZCBqdXN0IHJlc3VsdCBpbiBjb3JyZWN0IHJlLWludGVncmF0aW9uCi0vLyB0aHJvdWdoIHRoZSBzdHNjLgotVEVTVF9GKFNoZWxsTVA0TWFwVGVzdCwgR2V0T2Zmc2V0UmFuZG9tQWNjZXNzSHVnZUNhY2hlKSB7Ci0gIGZvciAoaW50IGNvaW5kZXggPSAwOyBjb2luZGV4IDwgMjsgKytjb2luZGV4KSB7Ci0gICAgQ3JlYXRlVGVzdFNhbXBsZVRhYmxlKDEwNCwgMzAwLCAyMCwgMjUsIDUsIDEwLCA1LCAxMCwgMTAsIDIwLCAxMCwgMjApOwotICAgIFJlc2V0TWFwKCk7Ci0gICAgU2V0VGVzdFRhYmxlKGtBdG9tVHlwZV9zdHN6LCAzMDApOwotICAgIFNldFRlc3RUYWJsZShrQXRvbVR5cGVfc3RzYywgMzAwKTsKLSAgICBTZXRUZXN0VGFibGUoY29pbmRleCA/IGtBdG9tVHlwZV9zdGNvIDoga0F0b21UeXBlX2NvNjQsIDMwMCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7ICsraSkgewotICAgICAgdWludDMyIHNhbXBsZV9udW1iZXIgPSByYW5kKCkgJSBzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKTsKLSAgICAgIHVpbnQ2NCBtYXBfcmVwb3J0ZWRfb2Zmc2V0ID0gMDsKLSAgICAgIEFTU0VSVF9UUlVFKG1hcF8tPkdldE9mZnNldChzYW1wbGVfbnVtYmVyLCBtYXBfcmVwb3J0ZWRfb2Zmc2V0KSk7Ci0gICAgICB1aW50NjQgdGFibGVfb2Zmc2V0ID0gR2V0VGVzdFNhbXBsZShzYW1wbGVfbnVtYmVyKS5vZmZzZXQ7Ci0gICAgICBBU1NFUlRfRVEobWFwX3JlcG9ydGVkX29mZnNldCwgdGFibGVfb2Zmc2V0KTsKLSAgICB9Ci0gIH0KLX0KLQotLy8gUmFuZG9tIGFjY2VzcyBhY3Jvc3MgY2FjaGUgYm91bmRhcmllcyBzaG91bGQgbm90IGJyZWFrIGNvbXB1dGF0aW9uIG9mCi0vLyBvZmZzZXRzLgotVEVTVF9GKFNoZWxsTVA0TWFwVGVzdCwgR2V0T2Zmc2V0UmFuZG9tQWNjZXNzVGlueUNhY2hlKSB7Ci0gIGZvciAoaW50IGNvaW5kZXggPSAwOyBjb2luZGV4IDwgMjsgKytjb2luZGV4KSB7Ci0gICAgQ3JlYXRlVGVzdFNhbXBsZVRhYmxlKDEwNSwgMzAwLCAyMCwgMjUsIDUsIDEwLCA1LCAxMCwgMTAsIDIwLCAxMCwgMjApOwotICAgIFJlc2V0TWFwKCk7Ci0gICAgU2V0VGVzdFRhYmxlKGtBdG9tVHlwZV9zdHN6LCA3KTsKLSAgICBTZXRUZXN0VGFibGUoa0F0b21UeXBlX3N0c2MsIDcpOwotICAgIFNldFRlc3RUYWJsZShjb2luZGV4ID8ga0F0b21UeXBlX3N0Y28gOiBrQXRvbVR5cGVfY282NCwgNyk7Ci0KLSAgICAvLyBjYWxscyB0byBzYW1wbGUgbnVtYmVycyBvdXRzaWRlIGZpbGUgcmFuZ2Ugc2hvdWxkIGZhaWwgbm9uLWZhdGFsbHkKLSAgICB1aW50NjQgZmFpbGVkX29mZnNldDsKLSAgICBBU1NFUlRfRkFMU0UobWFwXy0+R2V0T2Zmc2V0KHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpLCBmYWlsZWRfb2Zmc2V0KSk7Ci0KLSAgICAvLyBzZWNvbmQgc2FtcGxlIGluIHRoZSBmaWxlCi0gICAgdWludDMyIHNhbXBsZV9udW1iZXIgPSAxOwotICAgIHVpbnQ2NCBtYXBfcmVwb3J0ZWRfb2Zmc2V0ID0gMDsKLSAgICBBU1NFUlRfVFJVRShtYXBfLT5HZXRPZmZzZXQoc2FtcGxlX251bWJlciwgbWFwX3JlcG9ydGVkX29mZnNldCkpOwotICAgIHVpbnQ2NCB0YWJsZV9vZmZzZXQgPSBHZXRUZXN0U2FtcGxlKHNhbXBsZV9udW1iZXIpLm9mZnNldDsKLSAgICBBU1NFUlRfRVEobWFwX3JlcG9ydGVkX29mZnNldCwgdGFibGVfb2Zmc2V0KTsKLQotICAgIGZvciAoaW50IGkgPSAxOyBpIDwgMTU7ICsraSkgewotICAgICAgUmVzZXRNYXAoKTsKLSAgICAgIFNldFRlc3RUYWJsZShrQXRvbVR5cGVfc3RzeiwgNyk7Ci0gICAgICBTZXRUZXN0VGFibGUoa0F0b21UeXBlX3N0c2MsIDcpOwotICAgICAgU2V0VGVzdFRhYmxlKGtBdG9tVHlwZV9zdGNvLCA3KTsKLQotICAgICAgc2FtcGxlX251bWJlciA9IHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpIC0gaTsKLSAgICAgIEFTU0VSVF9UUlVFKG1hcF8tPkdldE9mZnNldChzYW1wbGVfbnVtYmVyLCBtYXBfcmVwb3J0ZWRfb2Zmc2V0KSk7Ci0gICAgICB0YWJsZV9vZmZzZXQgPSBHZXRUZXN0U2FtcGxlKHNhbXBsZV9udW1iZXIpLm9mZnNldDsKLSAgICAgIEFTU0VSVF9FUShtYXBfcmVwb3J0ZWRfb2Zmc2V0LCB0YWJsZV9vZmZzZXQpOwotCi0gICAgICBzYW1wbGVfbnVtYmVyLS07Ci0gICAgICBBU1NFUlRfVFJVRShtYXBfLT5HZXRPZmZzZXQoc2FtcGxlX251bWJlciwgbWFwX3JlcG9ydGVkX29mZnNldCkpOwotICAgICAgdGFibGVfb2Zmc2V0ID0gR2V0VGVzdFNhbXBsZShzYW1wbGVfbnVtYmVyKS5vZmZzZXQ7Ci0gICAgICBBU1NFUlRfRVEobWFwX3JlcG9ydGVkX29mZnNldCwgdGFibGVfb2Zmc2V0KTsKLQotICAgICAgLy8gbm93IGl0ZXJhdGUgdGhyb3VnaCBhIGZldyBzYW1wbGVzIGluIHRoZSBtaWRkbGUKLSAgICAgIHNhbXBsZV9udW1iZXIgLz0gMjsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDA7IGorKykgewotICAgICAgICBBU1NFUlRfVFJVRShtYXBfLT5HZXRPZmZzZXQoc2FtcGxlX251bWJlciArIGosIG1hcF9yZXBvcnRlZF9vZmZzZXQpKTsKLSAgICAgICAgdGFibGVfb2Zmc2V0ID0gR2V0VGVzdFNhbXBsZShzYW1wbGVfbnVtYmVyICsgaikub2Zmc2V0OwotICAgICAgICBBU1NFUlRfRVEobWFwX3JlcG9ydGVkX29mZnNldCwgdGFibGVfb2Zmc2V0KTsKLSAgICAgIH0KLQotICAgICAgLy8gbm93IGl0ZXJhdGUgYmFja3dhcmRzIGZyb20gdGhlIHNhbWUgc3RhcnRpbmcgcG9pbnQKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDA7IGorKykgewotICAgICAgICBBU1NFUlRfVFJVRShtYXBfLT5HZXRPZmZzZXQoc2FtcGxlX251bWJlciAtIGosIG1hcF9yZXBvcnRlZF9vZmZzZXQpKTsKLSAgICAgICAgdGFibGVfb2Zmc2V0ID0gR2V0VGVzdFNhbXBsZShzYW1wbGVfbnVtYmVyIC0gaikub2Zmc2V0OwotICAgICAgICBBU1NFUlRfRVEobWFwX3JlcG9ydGVkX29mZnNldCwgdGFibGVfb2Zmc2V0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotVEVTVF9GKFNoZWxsTVA0TWFwVGVzdCwgR2V0T2Zmc2V0UmFuZG9tQWNjZXNzV2l0aERlZmF1bHRTaXplKSB7Ci0gIGZvciAoaW50IGNvaW5kZXggPSAwOyBjb2luZGV4IDwgMjsgKytjb2luZGV4KSB7Ci0gICAgQ3JlYXRlVGVzdFNhbXBsZVRhYmxlKDEwNiwgMzAwLCAyMCwgMjAsIDUsIDEwLCA1LCAxMCwgMTAsIDIwLCAxMCwgMjApOwotICAgIFJlc2V0TWFwKCk7Ci0gICAgU2V0VGVzdFRhYmxlKGtBdG9tVHlwZV9zdHN6LCA3KTsKLSAgICBTZXRUZXN0VGFibGUoa0F0b21UeXBlX3N0c2MsIDcpOwotICAgIFNldFRlc3RUYWJsZShjb2luZGV4ID8ga0F0b21UeXBlX3N0Y28gOiBrQXRvbVR5cGVfY282NCwgNyk7Ci0KLSAgICAvLyBDYWxjdWxhdGluZyBvZmZzZXQgb2YgYW4gb3V0LW9mLXJhbmdlIHNhbXBsZSBzaG91bGQgc3RpbGwgcmV0dXJuIGFuCi0gICAgLy8gZXJyb3IuCi0gICAgdWludDY0IG1hcF9yZXBvcnRlZF9vZmZzZXQgPSAwOwotICAgIEFTU0VSVF9GQUxTRShtYXBfLT5HZXRPZmZzZXQoc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCkgKyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX3JlcG9ydGVkX29mZnNldCkpOwotCi0gICAgLy8gRmlyc3Qgc2FtcGxlIGluIGZpbGUgc2hvdWxkIHN0aWxsIHdvcmssIHRob3VnaC4KLSAgICBBU1NFUlRfVFJVRShtYXBfLT5HZXRPZmZzZXQoMCwgbWFwX3JlcG9ydGVkX29mZnNldCkpOwotICAgIHVpbnQ2NCB0YWJsZV9vZmZzZXQgPSBHZXRUZXN0U2FtcGxlKDApLm9mZnNldDsKLSAgICBBU1NFUlRfRVEobWFwX3JlcG9ydGVkX29mZnNldCwgdGFibGVfb2Zmc2V0KTsKLQotICAgIC8vIExhc3Qgc2FtcGxlIHNob3VsZCBhbHNvIHdvcmsuCi0gICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0T2Zmc2V0KHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpIC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX3JlcG9ydGVkX29mZnNldCkpOwotICAgIHRhYmxlX29mZnNldCA9IEdldFRlc3RTYW1wbGUoc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCkgLSAxKS5vZmZzZXQ7Ci0gICAgQVNTRVJUX0VRKG1hcF9yZXBvcnRlZF9vZmZzZXQsIHRhYmxlX29mZnNldCk7Ci0KLSAgICAvLyBTa2lwIGJ5IDMgdGhyb3VnaCB0aGUgZmlsZSBhIGZldyB0aW1lcwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCk7ICsraSkgewotICAgICAgaW50IHNhbXBsZV9pbmRleCA9IChpICogMykgJSBzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKTsKLSAgICAgIEFTU0VSVF9UUlVFKG1hcF8tPkdldE9mZnNldChzYW1wbGVfaW5kZXgsIG1hcF9yZXBvcnRlZF9vZmZzZXQpKTsKLSAgICAgIHRhYmxlX29mZnNldCA9IEdldFRlc3RTYW1wbGUoc2FtcGxlX2luZGV4KS5vZmZzZXQ7Ci0gICAgICBBU1NFUlRfRVEobWFwX3JlcG9ydGVkX29mZnNldCwgdGFibGVfb2Zmc2V0KTsKLSAgICB9Ci0gIH0KLX0KLQotLy8gPT09PSBHZXREdXJhdGlvbigpIFRlc3RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVEVTVF9GKFNoZWxsTVA0TWFwVGVzdCwgR2V0RHVyYXRpb25JdGVyYXRpb24pIHsKLSAgQ3JlYXRlVGVzdFNhbXBsZVRhYmxlKDEwNywgNjAsIDIwLCAyNSwgNSwgMTAsIDUsIDEwLCAxMCwgMjAsIDEwLCAyMCk7Ci0gIFJlc2V0TWFwKCk7Ci0gIFNldFRlc3RUYWJsZShrQXRvbVR5cGVfc3R0cywgMik7Ci0KLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKTsgKytpKSB7Ci0gICAgdWludDMyIG1hcF9yZXBvcnRlZF9kdXJhdGlvbiA9IDA7Ci0gICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0RHVyYXRpb24oaSwgbWFwX3JlcG9ydGVkX2R1cmF0aW9uKSk7Ci0gICAgdWludDMyIHRhYmxlX2R1cmF0aW9uID0gR2V0VGVzdFNhbXBsZShpKS5kdHNfZHVyYXRpb247Ci0gICAgQVNTRVJUX0VRKG1hcF9yZXBvcnRlZF9kdXJhdGlvbiwgdGFibGVfZHVyYXRpb24pOwotICB9Ci0KLSAgLy8gZW50cmllcyBwYXN0IGVuZCBvZiB0YWJsZSBzaG91bGQgZmFpbAotICB1aW50MzIgZmFpbGVkX2R1cmF0aW9uID0gMDsKLSAgQVNTRVJUX0ZBTFNFKAotICAgICAgbWFwXy0+R2V0RHVyYXRpb24oc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCksIGZhaWxlZF9kdXJhdGlvbikpOwotfQotCi1URVNUX0YoU2hlbGxNUDRNYXBUZXN0LCBHZXREdXJhdGlvblJhbmRvbUFjY2VzcykgewotICBDcmVhdGVUZXN0U2FtcGxlVGFibGUoMTA4LCA2MCwgMjAsIDI1LCA1LCAxMCwgNSwgMTAsIDEwLCAyMCwgMTAsIDIwKTsKLSAgUmVzZXRNYXAoKTsKLSAgU2V0VGVzdFRhYmxlKGtBdG9tVHlwZV9zdHRzLCAzKTsKLQotICAvLyBmaXJzdCBzYW1wbGUgaW4gdGFibGUKLSAgdWludDMyIG1hcF9yZXBvcnRlZF9kdXJhdGlvbiA9IDA7Ci0gIEFTU0VSVF9UUlVFKG1hcF8tPkdldER1cmF0aW9uKDAsIG1hcF9yZXBvcnRlZF9kdXJhdGlvbikpOwotICB1aW50MzIgdGFibGVfZHVyYXRpb24gPSBHZXRUZXN0U2FtcGxlKDApLmR0c19kdXJhdGlvbjsKLSAgQVNTRVJUX0VRKG1hcF9yZXBvcnRlZF9kdXJhdGlvbiwgdGFibGVfZHVyYXRpb24pOwotCi0gIC8vIGxhc3Qgc2FtcGxlIGluIHRhYmxlCi0gIEFTU0VSVF9UUlVFKG1hcF8tPkdldER1cmF0aW9uKHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpIC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX3JlcG9ydGVkX2R1cmF0aW9uKSk7Ci0gIHRhYmxlX2R1cmF0aW9uID0KLSAgICAgIEdldFRlc3RTYW1wbGUoc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCkgLSAxKS5kdHNfZHVyYXRpb247Ci0gIEFTU0VSVF9FUShtYXBfcmVwb3J0ZWRfZHVyYXRpb24sIHRhYmxlX2R1cmF0aW9uKTsKLQotICAvLyBzYW1wbGUganVzdCBwYXN0IGVuZCBzaG91bGQgZmFpbAotICBBU1NFUlRfRkFMU0UoCi0gICAgICBtYXBfLT5HZXREdXJhdGlvbihzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKSwgbWFwX3JlcG9ydGVkX2R1cmF0aW9uKSk7Ci0KLSAgLy8gYnV0IHNob3VsZG4ndCBicmVhayBvdGhlciBzYW1wbGUgbG9va3VwcwotICBBU1NFUlRfVFJVRShtYXBfLT5HZXREdXJhdGlvbigyLCBtYXBfcmVwb3J0ZWRfZHVyYXRpb24pKTsKLSAgdGFibGVfZHVyYXRpb24gPSBHZXRUZXN0U2FtcGxlKDIpLmR0c19kdXJhdGlvbjsKLSAgQVNTRVJUX0VRKG1hcF9yZXBvcnRlZF9kdXJhdGlvbiwgdGFibGVfZHVyYXRpb24pOwotCi0gIC8vIG5vdyBpdGVyYXRlIGJhY2t3YXJkcyB0aHJvdWdoIGVudGlyZSB0YWJsZSBiYWNrIHRvIGZpcnN0IHNhbXBsZQotICBmb3IgKGludCBpID0gc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCkgLSAxOyBpID49IDE7IGktLSkgewotICAgIEFTU0VSVF9UUlVFKG1hcF8tPkdldER1cmF0aW9uKGksIG1hcF9yZXBvcnRlZF9kdXJhdGlvbikpOwotICAgIHRhYmxlX2R1cmF0aW9uID0gR2V0VGVzdFNhbXBsZShpKS5kdHNfZHVyYXRpb247Ci0gICAgQVNTRVJUX0VRKG1hcF9yZXBvcnRlZF9kdXJhdGlvbiwgdGFibGVfZHVyYXRpb24pOwotICB9Ci19Ci0KLS8vID09PT0gR2V0VGltZXN0YW1wKCkgVGVzdHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRFU1RfRihTaGVsbE1QNE1hcFRlc3QsIEdldFRpbWVzdGFtcEl0ZXJhdGlvbk5vQ29tcG9zaXRpb25UaW1lKSB7Ci0gIENyZWF0ZVRlc3RTYW1wbGVUYWJsZSgxMDksIDYwLCAyMCwgMjUsIDUsIDEwLCA1LCAxMCwgMTAsIDIwLCAxMCwgMjApOwotICBSZXNldE1hcCgpOwotICBTZXRUZXN0VGFibGUoa0F0b21UeXBlX3N0dHMsIDcpOwotCi0gIGZvciAodWludDMyIGkgPSAwOyBpIDwgc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCk7ICsraSkgewotICAgIHVpbnQ2NCBtYXBfcmVwb3J0ZWRfdGltZXN0YW1wID0gMDsKLSAgICBBU1NFUlRfVFJVRShtYXBfLT5HZXRUaW1lc3RhbXAoaSwgbWFwX3JlcG9ydGVkX3RpbWVzdGFtcCkpOwotICAgIHVpbnQ2NCB0YWJsZV90aW1lc3RhbXAgPSBHZXRUZXN0U2FtcGxlKGkpLmR0czsKLSAgICBBU1NFUlRfRVEobWFwX3JlcG9ydGVkX3RpbWVzdGFtcCwgdGFibGVfdGltZXN0YW1wKTsKLSAgfQotCi0gIC8vIGVudHJpZXMgcGFzdCBlbmQgb2YgdGFibGUgc2hvdWxkIGZhaWwKLSAgdWludDY0IGZhaWxlZF90aW1lc3RhbXAgPSAwOwotICBBU1NFUlRfRkFMU0UoCi0gICAgICBtYXBfLT5HZXRUaW1lc3RhbXAoc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCksIGZhaWxlZF90aW1lc3RhbXApKTsKLX0KLQotVEVTVF9GKFNoZWxsTVA0TWFwVGVzdCwgR2V0VGltZXN0YW1wUmFuZG9tQWNjZXNzTm9Db21wb3NpdGlvblRpbWUpIHsKLSAgQ3JlYXRlVGVzdFNhbXBsZVRhYmxlKDExMCwgNjAsIDIwLCAyNSwgNSwgMTAsIDUsIDEwLCAxMCwgMjAsIDEwLCAyMCk7Ci0gIFJlc2V0TWFwKCk7Ci0gIFNldFRlc3RUYWJsZShrQXRvbVR5cGVfc3R0cywgMTApOwotCi0gIC8vIHNraXAgYnkgc2V2ZW5zIHRocm91Z2ggdGhlIGZpbGUsIHNldmVuIHRpbWVzCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCk7ICsraSkgewotICAgIHVpbnQzMiBzYW1wbGVfbnVtYmVyID0gKGkgKiA3KSAlIHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpOwotICAgIHVpbnQ2NCBtYXBfcmVwb3J0ZWRfdGltZXN0YW1wID0gMDsKLSAgICBBU1NFUlRfVFJVRShtYXBfLT5HZXRUaW1lc3RhbXAoc2FtcGxlX251bWJlciwgbWFwX3JlcG9ydGVkX3RpbWVzdGFtcCkpOwotICAgIHVpbnQ2NCB0YWJsZV90aW1lc3RhbXAgPSBHZXRUZXN0U2FtcGxlKHNhbXBsZV9udW1iZXIpLmR0czsKLSAgICBBU1NFUlRfRVEobWFwX3JlcG9ydGVkX3RpbWVzdGFtcCwgdGFibGVfdGltZXN0YW1wKTsKLSAgfQotCi0gIC8vIGNoZWNrIGEgZmFpbGVkIGVudHJ5Ci0gIHVpbnQ2NCBmYWlsZWRfdGltZXN0YW1wID0gMDsKLSAgQVNTRVJUX0ZBTFNFKAotICAgICAgbWFwXy0+R2V0VGltZXN0YW1wKHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpICogMiwgZmFpbGVkX3RpbWVzdGFtcCkpOwotCi0gIC8vIHNob3VsZCBzdGlsbCBiZSBhYmxlIHRvIHJlY292ZXIgd2l0aCB2YWxpZCBpbnB1dCwgdGhpcyB0aW1lIHNraXAgYnkgMjFzCi0gIC8vIGJhY2t3YXJkIHRocm91Z2ggdGhlIGZpbGUgMjEgdGltZXMKLSAgZm9yIChpbnQgaSA9IHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICB1aW50MzIgc2FtcGxlX251bWJlciA9IChpICogMjEpICUgc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCk7Ci0gICAgdWludDY0IG1hcF9yZXBvcnRlZF90aW1lc3RhbXAgPSAwOwotICAgIEFTU0VSVF9UUlVFKG1hcF8tPkdldFRpbWVzdGFtcChzYW1wbGVfbnVtYmVyLCBtYXBfcmVwb3J0ZWRfdGltZXN0YW1wKSk7Ci0gICAgdWludDY0IHRhYmxlX3RpbWVzdGFtcCA9IEdldFRlc3RTYW1wbGUoc2FtcGxlX251bWJlcikuZHRzOwotICAgIEFTU0VSVF9FUShtYXBfcmVwb3J0ZWRfdGltZXN0YW1wLCB0YWJsZV90aW1lc3RhbXApOwotICB9Ci19Ci0KLVRFU1RfRihTaGVsbE1QNE1hcFRlc3QsIEdldFRpbWVzdGFtcEl0ZXJhdGlvbikgewotICBDcmVhdGVUZXN0U2FtcGxlVGFibGUoMTExLCAzMDAsIDIwLCAyNSwgNSwgMTAsIDUsIDEwLCAxMCwgMjAsIDEwLCAyMCk7Ci0gIGZvciAoaW50IGkgPSAxOyBpIDwgMjA7ICsraSkgewotICAgIFJlc2V0TWFwKCk7Ci0gICAgU2V0VGVzdFRhYmxlKGtBdG9tVHlwZV9jdHRzLCBpKTsKLSAgICBTZXRUZXN0VGFibGUoa0F0b21UeXBlX3N0dHMsIGkpOwotCi0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKTsgKytqKSB7Ci0gICAgICB1aW50NjQgbWFwX3JlcG9ydGVkX3RpbWVzdGFtcCA9IDA7Ci0gICAgICBBU1NFUlRfVFJVRShtYXBfLT5HZXRUaW1lc3RhbXAoaiwgbWFwX3JlcG9ydGVkX3RpbWVzdGFtcCkpOwotICAgICAgdWludDY0IHRhYmxlX3RpbWVzdGFtcCA9IEdldFRlc3RTYW1wbGUoaikuY3RzOwotICAgICAgQVNTRVJUX0VRKG1hcF9yZXBvcnRlZF90aW1lc3RhbXAsIHRhYmxlX3RpbWVzdGFtcCk7Ci0KLSAgICAgIHVpbnQzMiBtYXBfcmVwb3J0ZWRfZHVyYXRpb24gPSAwOwotICAgICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0RHVyYXRpb24oaiwgbWFwX3JlcG9ydGVkX2R1cmF0aW9uKSk7Ci0gICAgICB1aW50MzIgdGFibGVfZHVyYXRpb24gPSBHZXRUZXN0U2FtcGxlKGopLmR0c19kdXJhdGlvbjsKLSAgICAgIEFTU0VSVF9FUShtYXBfcmVwb3J0ZWRfZHVyYXRpb24sIHRhYmxlX2R1cmF0aW9uKTsKLSAgICB9Ci0gIH0KLX0KLQotVEVTVF9GKFNoZWxsTVA0TWFwVGVzdCwgR2V0VGltZXN0YW1wUmFuZG9tQWNjZXNzKSB7Ci0gIENyZWF0ZVRlc3RTYW1wbGVUYWJsZSgxMTIsIDMwMCwgMjAsIDI1LCA1LCAxMCwgNSwgMTAsIDEwLCAyMCwgMTAsIDIwKTsKLSAgZm9yIChpbnQgaSA9IDE7IGkgPCAyMDsgKytpKSB7Ci0gICAgUmVzZXRNYXAoKTsKLSAgICBTZXRUZXN0VGFibGUoa0F0b21UeXBlX2N0dHMsIGkpOwotICAgIFNldFRlc3RUYWJsZShrQXRvbVR5cGVfc3R0cywgaSk7Ci0KLSAgICBmb3IgKGludCBqID0gMDsgaiA8IDEwMDsgKytqKSB7Ci0gICAgICB1aW50MzIgc2FtcGxlX251bWJlciA9IHJhbmQoKSAlIHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpOwotICAgICAgdWludDY0IG1hcF9yZXBvcnRlZF90aW1lc3RhbXAgPSAwOwotICAgICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0VGltZXN0YW1wKHNhbXBsZV9udW1iZXIsIG1hcF9yZXBvcnRlZF90aW1lc3RhbXApKTsKLSAgICAgIHVpbnQ2NCB0YWJsZV90aW1lc3RhbXAgPSBHZXRUZXN0U2FtcGxlKHNhbXBsZV9udW1iZXIpLmN0czsKLSAgICAgIEFTU0VSVF9FUShtYXBfcmVwb3J0ZWRfdGltZXN0YW1wLCB0YWJsZV90aW1lc3RhbXApOwotCi0gICAgICB1aW50MzIgbWFwX3JlcG9ydGVkX2R1cmF0aW9uID0gMDsKLSAgICAgIEFTU0VSVF9UUlVFKG1hcF8tPkdldER1cmF0aW9uKHNhbXBsZV9udW1iZXIsIG1hcF9yZXBvcnRlZF9kdXJhdGlvbikpOwotICAgICAgdWludDMyIHRhYmxlX2R1cmF0aW9uID0gR2V0VGVzdFNhbXBsZShzYW1wbGVfbnVtYmVyKS5kdHNfZHVyYXRpb247Ci0gICAgICBBU1NFUlRfRVEobWFwX3JlcG9ydGVkX2R1cmF0aW9uLCB0YWJsZV9kdXJhdGlvbik7Ci0gICAgfQotICB9Ci19Ci0KLS8vID09PT0gR2V0SXNLZXlmcmFtZSgpIFRlc3RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIHRoZSBtYXAgc2hvdWxkIGNvbnNpZGVyIGV2ZXJ5IHZhbGlkIHNhbXBsZSBudW1iZXIgYSBrZXlmcmFtZSB3aXRob3V0IGFuIHN0c3MKLVRFU1RfRihTaGVsbE1QNE1hcFRlc3QsIEdldElzS2V5ZnJhbWVOb0tleWZyYW1lVGFibGUpIHsKLSAgUmVzZXRNYXAoKTsKLSAgYm9vbCBpc19rZXlmcmFtZV9vdXQgPSBmYWxzZTsKLSAgQVNTRVJUX1RSVUUobWFwXy0+R2V0SXNLZXlmcmFtZSgxMDAsIGlzX2tleWZyYW1lX291dCkpOwotICBBU1NFUlRfVFJVRShpc19rZXlmcmFtZV9vdXQpOwotCi0gIGlzX2tleWZyYW1lX291dCA9IGZhbHNlOwotICBBU1NFUlRfVFJVRShtYXBfLT5HZXRJc0tleWZyYW1lKDUsIGlzX2tleWZyYW1lX291dCkpOwotICBBU1NFUlRfVFJVRShpc19rZXlmcmFtZV9vdXQpOwotCi0gIGZvciAoaW50IGkgPSAxNzsgaSA8IDE3NDsgaSArPSAzKSB7Ci0gICAgaXNfa2V5ZnJhbWVfb3V0ID0gZmFsc2U7Ci0gICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0SXNLZXlmcmFtZShpLCBpc19rZXlmcmFtZV9vdXQpKTsKLSAgICBBU1NFUlRfVFJVRShpc19rZXlmcmFtZV9vdXQpOwotICB9Ci19Ci0KLVRFU1RfRihTaGVsbE1QNE1hcFRlc3QsIEdldElzS2V5ZnJhbWVJdGVyYXRpb24pIHsKLSAgQ3JlYXRlVGVzdFNhbXBsZVRhYmxlKDExMywgMTAwMCwgMHhiMGRmMDBkLCAweGIwZGYwMGQsIDUsIDEwLCA1LCAxMCwgMTAsIDIwLAotICAgICAgICAgICAgICAgICAgICAgICAgMTAsIDIwKTsKLSAgUmVzZXRNYXAoKTsKLSAgc2FtcGxlX3RhYmxlXy0+Q2xlYXJSZWFkU3RhdGlzdGljcygpOwotICBTZXRUZXN0VGFibGUoa0F0b21UeXBlX3N0c3MsIHNhbXBsZV90YWJsZV8tPmtleWZyYW1lX2NvdW50KCkgLyAyICsgNSk7Ci0KLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKTsgKytpKSB7Ci0gICAgYm9vbCBtYXBfaXNfa2V5ZnJhbWVfb3V0ID0gZmFsc2U7Ci0gICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0SXNLZXlmcmFtZShpLCBtYXBfaXNfa2V5ZnJhbWVfb3V0KSk7Ci0gICAgYm9vbCB0YWJsZV9pc19rZXlmcmFtZSA9IEdldFRlc3RTYW1wbGUoaSkuaXNfa2V5X2ZyYW1lOwotICAgIEFTU0VSVF9FUShtYXBfaXNfa2V5ZnJhbWVfb3V0LCB0YWJsZV9pc19rZXlmcmFtZSk7Ci0gIH0KLX0KLQotVEVTVF9GKFNoZWxsTVA0TWFwVGVzdCwgR2V0SXNLZXlmcmFtZVJhbmRvbUFjY2VzcykgewotICBDcmVhdGVUZXN0U2FtcGxlVGFibGUoMTE0LCAxMDAwLCAweGIwZGYwMGQsIDB4YjBkZjAwZCwgNSwgMTAsIDUsIDEwLCAxMCwgMjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAxMCwgMjApOwotICBSZXNldE1hcCgpOwotICBzYW1wbGVfdGFibGVfLT5DbGVhclJlYWRTdGF0aXN0aWNzKCk7Ci0gIFNldFRlc3RUYWJsZShrQXRvbVR5cGVfc3Rzcywgc2FtcGxlX3RhYmxlXy0+a2V5ZnJhbWVfY291bnQoKSAvIDIgKyA1KTsKLQotICAvLyBwaWNrIGEga2V5ZnJhbWUgYWJvdXQgaGFsZndheQotICB1aW50MzIgc2FtcGxlX251bWJlciA9IHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpIC8gMjsKLSAgd2hpbGUgKCFHZXRUZXN0U2FtcGxlKHNhbXBsZV9udW1iZXIpLmlzX2tleV9mcmFtZSkKLSAgICArK3NhbXBsZV9udW1iZXI7Ci0gIC8vIHNhbXBsZSBvbmUgcGFzdCBpdCBzaG91bGQgbm90IGJlIGEga2V5ZnJhbWUKLSAgYm9vbCBtYXBfaXNfa2V5ZnJhbWVfb3V0ID0gZmFsc2U7Ci0gIEFTU0VSVF9UUlVFKG1hcF8tPkdldElzS2V5ZnJhbWUoc2FtcGxlX251bWJlciArIDEsIG1hcF9pc19rZXlmcmFtZV9vdXQpKTsKLSAgQVNTRVJUX0ZBTFNFKG1hcF9pc19rZXlmcmFtZV9vdXQpOwotICAvLyBzYW1wbGUgb25lIGJlZm9yZSBrZXlmcmFtZSBzaG91bGQgbm90IGJlIGEga2V5ZnJhbWUgZWl0aGVyCi0gIEFTU0VSVF9UUlVFKG1hcF8tPkdldElzS2V5ZnJhbWUoc2FtcGxlX251bWJlciAtIDEsIG1hcF9pc19rZXlmcmFtZV9vdXQpKTsKLSAgQVNTRVJUX0ZBTFNFKG1hcF9pc19rZXlmcmFtZV9vdXQpOwotICAvLyBob3dldmVyIGl0IHNob3VsZCBiZSBhIGtleWZyYW1lCi0gIEFTU0VSVF9UUlVFKG1hcF8tPkdldElzS2V5ZnJhbWUoc2FtcGxlX251bWJlciwgbWFwX2lzX2tleWZyYW1lX291dCkpOwotICBBU1NFUlRfVFJVRShtYXBfaXNfa2V5ZnJhbWVfb3V0KTsKLQotICAvLyBmaXJzdCBrZXlmcmFtZQotICBzYW1wbGVfbnVtYmVyID0gMDsKLSAgd2hpbGUgKCFHZXRUZXN0U2FtcGxlKHNhbXBsZV9udW1iZXIpLmlzX2tleV9mcmFtZSkKLSAgICArK3NhbXBsZV9udW1iZXI7Ci0gIC8vIG5leHQgc2FtcGxlIHNob3VsZCBub3QgYmUgYSBrZXlmcmFtZQotICBBU1NFUlRfVFJVRShtYXBfLT5HZXRJc0tleWZyYW1lKHNhbXBsZV9udW1iZXIgKyAxLCBtYXBfaXNfa2V5ZnJhbWVfb3V0KSk7Ci0gIEFTU0VSVF9GQUxTRShtYXBfaXNfa2V5ZnJhbWVfb3V0KTsKLSAgLy8gYnV0IGl0IHNob3VsZCBiZQotICBBU1NFUlRfVFJVRShtYXBfLT5HZXRJc0tleWZyYW1lKHNhbXBsZV9udW1iZXIsIG1hcF9pc19rZXlmcmFtZV9vdXQpKTsKLSAgQVNTRVJUX1RSVUUobWFwX2lzX2tleWZyYW1lX291dCk7Ci0KLSAgLy8gaXRlcmF0ZSBiYWNrd2FyZHMgZnJvbSBlbmQgb2YgZmlsZSB0byBiZWdpbm5pbmcKLSAgZm9yIChpbnQgaSA9IHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICBBU1NFUlRfVFJVRShtYXBfLT5HZXRJc0tleWZyYW1lKGksIG1hcF9pc19rZXlmcmFtZV9vdXQpKTsKLSAgICBBU1NFUlRfRVEobWFwX2lzX2tleWZyYW1lX291dCwgR2V0VGVzdFNhbXBsZShpKS5pc19rZXlfZnJhbWUpOwotICB9Ci0KLSAgLy8gaXRlcmF0ZSBiYWNrd2FyZHMgdGhyb3VnaCBrZXlmcmFtZXMgb25seQotICBmb3IgKGludCBpID0gc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCkgLSAxOyBpID49IDA7IC0taSkgewotICAgIGlmIChHZXRUZXN0U2FtcGxlKGkpLmlzX2tleV9mcmFtZSkgewotICAgICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0SXNLZXlmcmFtZShpLCBtYXBfaXNfa2V5ZnJhbWVfb3V0KSk7Ci0gICAgICBBU1NFUlRfVFJVRShtYXBfaXNfa2V5ZnJhbWVfb3V0KTsKLSAgICB9Ci0gIH0KLQotICAvLyBpdGVyYXRlIGZvcndhcmRzIGJ1dCBza2lwIGFsbCBrZXlmcmFtZXMKLSAgZm9yIChpbnQgaSA9IHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICBpZiAoIUdldFRlc3RTYW1wbGUoaSkuaXNfa2V5X2ZyYW1lKSB7Ci0gICAgICBBU1NFUlRfVFJVRShtYXBfLT5HZXRJc0tleWZyYW1lKGksIG1hcF9pc19rZXlmcmFtZV9vdXQpKTsKLSAgICAgIEFTU0VSVF9GQUxTRShtYXBfaXNfa2V5ZnJhbWVfb3V0KTsKLSAgICB9Ci0gIH0KLQotICBSZXNldE1hcCgpOwotICBzYW1wbGVfdGFibGVfLT5DbGVhclJlYWRTdGF0aXN0aWNzKCk7Ci0gIFNldFRlc3RUYWJsZShrQXRvbVR5cGVfc3RzcywgNyk7Ci0KLSAgLy8gcmFuZG9tIGFjY2VzcwotICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7ICsraSkgewotICAgIHNhbXBsZV9udW1iZXIgPSByYW5kKCkgJSBzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKTsKLSAgICBBU1NFUlRfVFJVRShtYXBfLT5HZXRJc0tleWZyYW1lKHNhbXBsZV9udW1iZXIsIG1hcF9pc19rZXlmcmFtZV9vdXQpKTsKLSAgICBBU1NFUlRfRVEobWFwX2lzX2tleWZyYW1lX291dCwgR2V0VGVzdFNhbXBsZShzYW1wbGVfbnVtYmVyKS5pc19rZXlfZnJhbWUpOwotICB9Ci19Ci0KLS8vID09PT0gR2V0S2V5ZnJhbWUoKSBUZXN0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIGV2ZXJ5IGZyYW1lIHNob3VsZCBiZSByZXR1cm5lZCBhcyBhIGtleWZyYW1lLiBUaGlzIHRlc3RzIGlmIG91ciBjb21wdXRhdGlvbgotLy8gb2YgdGltZXN0YW1wcyA9PiBzYW1wbGUgbnVtYmVycyBpcyBlcXVpdmFsZW50IHRvIHNhbXBsZSBudW1iZXJzID0+IHRpbWVzdGFtcHMKLVRFU1RfRihTaGVsbE1QNE1hcFRlc3QsIEdldEtleWZyYW1lTm9LZXlmcmFtZVRhYmxlSXRlcmF0aW9uKSB7Ci0gIENyZWF0ZVRlc3RTYW1wbGVUYWJsZSgxMTUsIDMwLCAyMCwgMjUsIDUsIDEwLCA1LCAxMCwgMTAsIDIwLCAxMCwgMjApOwotICBSZXNldE1hcCgpOwotICBTZXRUZXN0VGFibGUoa0F0b21UeXBlX3N0dHMsIDcpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCk7ICsraSkgewotICAgIC8vIGdldCBhY3R1YWwgdGltZXN0YW1wIGFuZCBkdXJhdGlvbiBvZiB0aGlzIHNhbXBsZQotICAgIHVpbnQ2NCBzYW1wbGVfdGltZXN0YW1wID0gR2V0VGVzdFNhbXBsZShpKS5kdHM7Ci0gICAgdWludDMyIHNhbXBsZV9kdXJhdGlvbiA9IEdldFRlc3RTYW1wbGUoaSkuZHRzX2R1cmF0aW9uOwotICAgIC8vIGFkZCBhIGJpdCBvZiB0aW1lIHRvIHNhbXBsZSB0aW1lc3RhbXAsIGJ1dCBrZWVwIHRpbWUgd2l0aGluIHRoaXMgZnJhbWUKLSAgICBzYW1wbGVfdGltZXN0YW1wICs9IGkgJSBzYW1wbGVfZHVyYXRpb247Ci0gICAgdWludDMyIG1hcF9rZXlmcmFtZSA9IDA7Ci0gICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0S2V5ZnJhbWUoc2FtcGxlX3RpbWVzdGFtcCwgbWFwX2tleWZyYW1lKSk7Ci0gICAgQVNTRVJUX0VRKG1hcF9rZXlmcmFtZSwgaSk7Ci0gIH0KLX0KLQotVEVTVF9GKFNoZWxsTVA0TWFwVGVzdCwgR2V0S2V5ZnJhbWVOb0tleWZyYW1lVGFibGVSYW5kb21BY2Nlc3MpIHsKLSAgQ3JlYXRlVGVzdFNhbXBsZVRhYmxlKDExNiwgMzAsIDIwLCAyNSwgNSwgMTAsIDUsIDEwLCAxMCwgMjAsIDEwLCAyMCk7Ci0gIFJlc2V0TWFwKCk7Ci0gIFNldFRlc3RUYWJsZShrQXRvbVR5cGVfc3R0cywgNSk7Ci0KLSAgLy8gYmFja3dhcmRzIHRocm91Z2ggdGhlIG1pZGRsZSB0aGlyZCBvZiBzYW1wbGVzCi0gIGZvciAoaW50IGkgPSAoc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCkgKiAyKSAvIDM7Ci0gICAgICAgaSA+PSBzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKSAvIDM7IC0taSkgewotICAgIHVpbnQ2NCBzYW1wbGVfdGltZXN0YW1wID0gR2V0VGVzdFNhbXBsZShpKS5kdHM7Ci0gICAgdWludDMyIHNhbXBsZV9kdXJhdGlvbiA9IEdldFRlc3RTYW1wbGUoaSkuZHRzX2R1cmF0aW9uOwotICAgIHNhbXBsZV90aW1lc3RhbXAgKz0gc2FtcGxlX2R1cmF0aW9uIC0gMSAtIChpICUgc2FtcGxlX2R1cmF0aW9uKTsKLSAgICB1aW50MzIgbWFwX2tleWZyYW1lID0gMDsKLSAgICBBU1NFUlRfVFJVRShtYXBfLT5HZXRLZXlmcmFtZShzYW1wbGVfdGltZXN0YW1wLCBtYXBfa2V5ZnJhbWUpKTsKLSAgICBBU1NFUlRfRVEobWFwX2tleWZyYW1lLCBpKTsKLSAgfQotCi0gIC8vIGhpZ2hlc3QgdmFsaWQgdGltZXN0YW1wIGluIGZpbGUKLSAgdWludDY0IGhpZ2hlc3RfdGltZXN0YW1wID0KLSAgICAgIEdldFRlc3RTYW1wbGUoc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCkgLSAxKS5kdHM7Ci0gIGhpZ2hlc3RfdGltZXN0YW1wICs9Ci0gICAgICBHZXRUZXN0U2FtcGxlKHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpIC0gMSkuZHRzX2R1cmF0aW9uIC0gMTsKLSAgdWludDMyIG1hcF9rZXlmcmFtZSA9IDA7Ci0gIEFTU0VSVF9UUlVFKG1hcF8tPkdldEtleWZyYW1lKGhpZ2hlc3RfdGltZXN0YW1wLCBtYXBfa2V5ZnJhbWUpKTsKLSAgQVNTRVJUX0VRKG1hcF9rZXlmcmFtZSwgc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCkgLSAxKTsKLQotICAvLyBsb3dlc3QgdmFsaWQgdGltZXN0YW1wIGluIGZpbGUKLSAgQVNTRVJUX1RSVUUobWFwXy0+R2V0S2V5ZnJhbWUoMCwgbWFwX2tleWZyYW1lKSk7Ci0gIEFTU0VSVF9FUShtYXBfa2V5ZnJhbWUsIDApOwotCi0gIC8vIHNob3VsZCBmYWlsIG9uIGhpZ2hlciB0aW1lc3RhbXBzCi0gIEFTU0VSVF9GQUxTRShtYXBfLT5HZXRLZXlmcmFtZShoaWdoZXN0X3RpbWVzdGFtcCArIDEsIG1hcF9rZXlmcmFtZSkpOwotfQotCi0vLyBHZXRLZXlmcmFtZSBpcyBub3Qgbm9ybWFsbHkgY2FsbGVkIGl0ZXJhdGl2ZWx5LCBzbyB3ZSB0ZXN0IHJhbmRvbSBhY2Nlc3MKLVRFU1RfRihTaGVsbE1QNE1hcFRlc3QsIEdldEtleWZyYW1lKSB7Ci0gIENyZWF0ZVRlc3RTYW1wbGVUYWJsZSgxMTcsIDYwLCAyMCwgMjUsIDUsIDEwLCA1LCAxMCwgMTAsIDIwLCAxMCwgMjApOwotICBSZXNldE1hcCgpOwotICBTZXRUZXN0VGFibGUoa0F0b21UeXBlX3N0c3MsIDMpOwotICBTZXRUZXN0VGFibGUoa0F0b21UeXBlX3N0dHMsIDcpOwotCi0gIC8vIGZpbmQgZmlyc3Qga2V5ZnJhbWUgaW4gZmlsZSwgc2hvdWxkIGJlIGZpcnN0IGZyYW1lCi0gIHVpbnQzMiBtYXBfa2V5ZnJhbWUgPSAwOwotICBBU1NFUlRfVFJVRShtYXBfLT5HZXRLZXlmcmFtZSgwLCBtYXBfa2V5ZnJhbWUpKTsKLSAgQVNTRVJUX0VRKG1hcF9rZXlmcmFtZSwgMCk7Ci0KLSAgLy8gZmluZCBhIGZpcnN0IHF1YXJ0ZXIga2V5ZnJhbWUgaW4gZmlsZQotICB1aW50MzIgcXRyX2tleWZyYW1lID0gc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCkgLyA0OwotICB3aGlsZSAoIUdldFRlc3RTYW1wbGUocXRyX2tleWZyYW1lKS5pc19rZXlfZnJhbWUpCi0gICAgKytxdHJfa2V5ZnJhbWU7Ci0gIHVpbnQzMiBuZXh0X2tleWZyYW1lID0gcXRyX2tleWZyYW1lICsgMTsKLSAgd2hpbGUgKCFHZXRUZXN0U2FtcGxlKG5leHRfa2V5ZnJhbWUpLmlzX2tleV9mcmFtZSkKLSAgICArK25leHRfa2V5ZnJhbWU7Ci0gIHVpbnQzMiBwcmV2X2tleWZyYW1lID0gcXRyX2tleWZyYW1lIC0gMTsKLSAgd2hpbGUgKCFHZXRUZXN0U2FtcGxlKHByZXZfa2V5ZnJhbWUpLmlzX2tleV9mcmFtZSkKLSAgICAtLXByZXZfa2V5ZnJhbWU7Ci0gIHVpbnQzMiBsYXN0X2tleWZyYW1lID0gc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCkgLSAxOwotICB3aGlsZSAoIUdldFRlc3RTYW1wbGUobGFzdF9rZXlmcmFtZSkuaXNfa2V5X2ZyYW1lKQotICAgIC0tbGFzdF9rZXlmcmFtZTsKLSAgLy8gbWlkd2F5IGJldHdlZW4gdGhpcyBrZXlmcmFtZSBhbmQgdGhlIG5leHQgb25lCi0gIHVpbnQzMiB0ZXN0X2ZyYW1lID0gcXRyX2tleWZyYW1lICsgKChuZXh0X2tleWZyYW1lIC0gcXRyX2tleWZyYW1lKSAvIDIpOwotICAvLyBnZXQgdGltZSBmb3IgdGhpcyBmcmFtZQotICB1aW50NjQgdGVzdF9mcmFtZV90aW1lc3RhbXAgPSBHZXRUZXN0U2FtcGxlKHRlc3RfZnJhbWUpLmR0czsKLSAgLy8gZ2V0IGR1cmF0aW9uIGZvciB0aGlzIGZyYW1lCi0gIHVpbnQzMiB0ZXN0X2ZyYW1lX2R1cmF0aW9uID0gR2V0VGVzdFNhbXBsZSh0ZXN0X2ZyYW1lKS5kdHNfZHVyYXRpb247Ci0gIC8vIG1pZHdheSB0aHJvdWdoIHRoaXMgZnJhbWUKLSAgdGVzdF9mcmFtZV90aW1lc3RhbXAgKz0gdGVzdF9mcmFtZV9kdXJhdGlvbiAvIDI7Ci0gIC8vIGZpbmQgbG93ZXIgYm91bmQga2V5ZnJhbWUsIHNob3VsZCBiZSBxdHJfa2V5ZnJhbWUKLSAgQVNTRVJUX1RSVUUobWFwXy0+R2V0S2V5ZnJhbWUodGVzdF9mcmFtZV90aW1lc3RhbXAsIG1hcF9rZXlmcmFtZSkpOwotICBBU1NFUlRfRVEobWFwX2tleWZyYW1lLCBxdHJfa2V5ZnJhbWUpOwotCi0gIC8vIHRpbWVzdGFtcCBvbmUgdGljayBiZWZvcmUgcXRyX2tleWZyYW1lIHNob3VsZCBmaW5kIHByZXZpb3VzIGtleWZyYW1lCi0gIHRlc3RfZnJhbWVfdGltZXN0YW1wID0gR2V0VGVzdFNhbXBsZShxdHJfa2V5ZnJhbWUpLmR0cyAtIDE7Ci0gIEFTU0VSVF9UUlVFKG1hcF8tPkdldEtleWZyYW1lKHRlc3RfZnJhbWVfdGltZXN0YW1wLCBtYXBfa2V5ZnJhbWUpKTsKLSAgQVNTRVJUX0VRKG1hcF9rZXlmcmFtZSwgcHJldl9rZXlmcmFtZSk7Ci0KLSAgLy8gdmVyeSBoaWdoZXN0IHRpbWVzdGFtcCBpbiBmaWxlIHNob3VsZCByZXR1cm4gbGFzdCBrZXlmcmFtZQotICB1aW50NjQgaGlnaGVzdF90aW1lc3RhbXAgPQotICAgICAgR2V0VGVzdFNhbXBsZShzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKSAtIDEpLmR0czsKLSAgaGlnaGVzdF90aW1lc3RhbXAgKz0KLSAgICAgIEdldFRlc3RTYW1wbGUoc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCkgLSAxKS5kdHNfZHVyYXRpb24gLSAxOwotICBBU1NFUlRfVFJVRShtYXBfLT5HZXRLZXlmcmFtZShoaWdoZXN0X3RpbWVzdGFtcCwgbWFwX2tleWZyYW1lKSk7Ci0gIEFTU0VSVF9FUShtYXBfa2V5ZnJhbWUsIGxhc3Rfa2V5ZnJhbWUpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX21wNF9wYXJzZXIuY2MgYi9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9tcDRfcGFyc2VyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzYwODU4Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX21wNF9wYXJzZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3MzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvc2hlbGxfbXA0X3BhcnNlci5oIgotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxsaW1pdHM+Ci0KLSNpbmNsdWRlICJiYXNlL3N0cmluZ3ByaW50Zi5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZW5kaWFuX3V0aWwuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3NoZWxsX2J1ZmZlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAibWVkaWEvbXA0L2VzX2Rlc2NyaXB0b3IuaCIKLQotI2lmIFNIRUxMX01QNF9QQVJTRVJfRFVNUF9BVE9NUwotI2luY2x1ZGUgPHN0cmluZz4KLWV4dGVybiBjb25zdCBzdGQ6OnN0cmluZyogZ2xvYmFsX2dhbWVfY29udGVudF9wYXRoOwotI2VuZGlmCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIGhvdyBtYW55IGJ5dGVzIHRvIHNraXAgd2l0aGluIGFuIGF2YzEgYmVmb3JlIHRoZSBjb25maWcgYXRvbXMgc3RhcnQ/Ci1zdGF0aWMgY29uc3QgaW50IGtTa2lwQnl0ZXNfYXZjMSA9IDc4OwotCi0vLyB3aGF0J3MgdGhlIHNtYWxsZXN0IG1lYW5pbmdmdWwgbXA0IGF0b20gc2l6ZT8KLXN0YXRpYyBjb25zdCBpbnQga0F0b21NaW5TaXplID0gODsKLQotLy8gRnVsbCBCb3ggaGFzIGEgb25lIGJ5dGUgdmVyc2lvbiBhbmQgdGhyZWUgYnl0ZXMgZmxhZ3MgYWZ0ZXIgdGhlIGhlYWRlcgotc3RhdGljIGNvbnN0IGludCBrRnVsbEJveEhlYWRlckFuZEZsYWdTaXplID0gNDsKLQotLy8gaG93IG11Y2ggdG8gZG93bmxvYWQgb2YgYW4gaGRsciB0byBnZXQgdGhlIHRyYWsgdHlwZT8KLXN0YXRpYyBjb25zdCBpbnQga0Rlc2lyZWRCeXRlc19oZGxyID0gMTI7Ci1zdGF0aWMgY29uc3QgdWludDMyIGtBdWRpb1N1YnR5cGVfaGRscl9zb3VuID0gMHg3MzZmNzU2ZTsKLXN0YXRpYyBjb25zdCB1aW50MzIga1ZpZGVvU3VidHlwZV9oZGxyX3ZpZGUgPSAweDc2Njk2NDY1OwotCi0vLyBob3cgbXVjaCB0byBkb3dubG9hZCBvZiBhbiBtcDRhIHRvIGRldGVybWluZSB2ZXJzaW9uIG51bWJlcj8KLXN0YXRpYyBjb25zdCBpbnQga0Rlc2lyZWRCeXRlc19tcDRhID0gMjsKLS8vIGhvdyBiaWcgaXMgdGhlIG1wNGEgYXRvbSBiZWZvcmUgb3B0aW9uYWwgZXh0ZW5zaW9uIGF0b21zPwotc3RhdGljIGNvbnN0IGludCBrVG90YWxTaXplX21wNGFfdjAgPSAyODsKLXN0YXRpYyBjb25zdCBpbnQga1RvdGFsU2l6ZV9tcDRhX3YxID0gNDQ7Ci1zdGF0aWMgY29uc3QgaW50IGtUb3RhbFNpemVfbXA0YV92MiA9IDY0OwotCi0vLyBob3cgbWFueSBieXRlcyBzaG91bGQgd2UgZG93bmxvYWQgZnJvbSBhbiBtZGhkPwotc3RhdGljIGNvbnN0IGludCBrRGVzaXJlZEJ5dGVzX21kaGQgPSAyMDsKLQotLy8gaG93IG1hbnkgYnl0ZXMgc2hvdWxkIHdlIGRvd25sb2FkIGZyb20gYW4gbXZoZD8KLXN0YXRpYyBjb25zdCBpbnQga0Rlc2lyZWRCeXRlc19tdmhkID0gMjA7Ci0KLS8vIGhvdyBtYW55IGJ5dGVzIHRvIHNraXAgd2l0aGluIGFuIHN0c2QgYmVmb3JlIHRoZSBjb25maWcgYXRvbXMgc3RhcnQ/Ci1zdGF0aWMgY29uc3QgaW50IGtTa2lwQnl0ZXNfc3RzZCA9IDg7Ci0KLS8vIHVzZSBhdmVyYWdlIHZhbHVlcyBvZiBtcDQgbWV0YWRhdGEgdGFibGVzIHBsdXMgMiBzdGFuZGFyZCBkZXZpYXRpb25zIHRvCi0vLyBob2xkIG1vc3QgbWV0YWRhdGEgYXRvbXMgZW50aXJlbHkgaW4gbWVtb3J5Lgotc3RhdGljIGNvbnN0IGludCBrTWFwVGFibGVBdG9tQ2FjaGVFbnRyaWVzX3N0c3ogPSAyNjA1OTEgLyBrRW50cnlTaXplX3N0c3o7Ci1zdGF0aWMgY29uc3QgaW50IGtNYXBUYWJsZUF0b21DYWNoZUVudHJpZXNfc3RjbyA9IDIyODU5IC8ga0VudHJ5U2l6ZV9zdGNvOwotc3RhdGljIGNvbnN0IGludCBrTWFwVGFibGVBdG9tQ2FjaGVFbnRyaWVzX3N0c3MgPSAzNzg2IC8ga0VudHJ5U2l6ZV9zdHNzOwotc3RhdGljIGNvbnN0IGludCBrTWFwVGFibGVBdG9tQ2FjaGVFbnRyaWVzX3N0dHMgPSAxNjQ5MTUgLyBrRW50cnlTaXplX3N0dHM7Ci1zdGF0aWMgY29uc3QgaW50IGtNYXBUYWJsZUF0b21DYWNoZUVudHJpZXNfc3RzYyA9IDMyMTk5IC8ga0VudHJ5U2l6ZV9zdHNjOwotc3RhdGljIGNvbnN0IGludCBrTWFwVGFibGVBdG9tQ2FjaGVFbnRyaWVzX2NvNjQgPSA3NDAyMTIgLyBrRW50cnlTaXplX2NvNjQ7Ci1zdGF0aWMgY29uc3QgaW50IGtNYXBUYWJsZUF0b21DYWNoZUVudHJpZXNfY3R0cyA9IDUxNTQzIC8ga0VudHJ5U2l6ZV9jdHRzOwotCi0vLyBzdGF0aWMKLVBpcGVsaW5lU3RhdHVzIFNoZWxsTVA0UGFyc2VyOjpDb25zdHJ1Y3QoCi0gICAgc2NvcGVkX3JlZnB0cjxTaGVsbERhdGFTb3VyY2VSZWFkZXI+IHJlYWRlciwKLSAgICBjb25zdCB1aW50OCogY29uc3RydWN0aW9uX2hlYWRlciwKLSAgICBzY29wZWRfcmVmcHRyPFNoZWxsUGFyc2VyPiogcGFyc2VyKSB7Ci0gIERDSEVDSyhwYXJzZXIpOwotICAqcGFyc2VyID0gTlVMTDsKLQotICAvLyBkZXRlY3QgbXA0IHN0cmVhbSBieSBsb29raW5nIGZvciBmdHlwIGF0b20gYXQgdG9wIG9mIGZpbGUKLSAgdWludDMyIGZ0eXAgPSBlbmRpYW5fdXRpbDo6bG9hZF91aW50MzJfYmlnX2VuZGlhbihjb25zdHJ1Y3Rpb25faGVhZGVyICsgNCk7Ci0gIGlmIChmdHlwICE9IGtBdG9tVHlwZV9mdHlwKSB7Ci0gICAgLy8gbm90IGFuIG1wNAotICAgIHJldHVybiBERU1VWEVSX0VSUk9SX0NPVUxEX05PVF9QQVJTRTsKLSAgfQotCi0gIC8vIGZpcnN0IDQgYnl0ZXMgd2lsbCBiZSB0aGUgc2l6ZSBvZiB0aGUgZnR5cCBhdG9tCi0gIHVpbnQzMiBmdHlwX2F0b21fc2l6ZSA9Ci0gICAgICBlbmRpYW5fdXRpbDo6bG9hZF91aW50MzJfYmlnX2VuZGlhbihjb25zdHJ1Y3Rpb25faGVhZGVyKTsKLSAgaWYgKGZ0eXBfYXRvbV9zaXplIDwga0F0b21NaW5TaXplKSB7Ci0gICAgcmV0dXJuIERFTVVYRVJfRVJST1JfQ09VTERfTk9UX1BBUlNFOwotICB9Ci0KLSAgLy8gY29uc3RydWN0IG5ldyBtcDQgcGFyc2VyCi0gICpwYXJzZXIgPSBuZXcgU2hlbGxNUDRQYXJzZXIocmVhZGVyLCBmdHlwX2F0b21fc2l6ZSk7Ci0gIHJldHVybiBQSVBFTElORV9PSzsKLX0KLQotU2hlbGxNUDRQYXJzZXI6OlNoZWxsTVA0UGFyc2VyKHNjb3BlZF9yZWZwdHI8U2hlbGxEYXRhU291cmNlUmVhZGVyPiByZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIGZ0eXBfYXRvbV9zaXplKQotICAgIDogU2hlbGxBVkNQYXJzZXIocmVhZGVyKSwKLSAgICAgIGF0b21fb2Zmc2V0XyhmdHlwX2F0b21fc2l6ZSksICAvLyBzdGFydCBhdCBuZXh0IGF0b20sIHNraXBwaW5nIG92ZXIgZnR5cAotICAgICAgY3VycmVudF90cmFrX2lzX3ZpZGVvXyhmYWxzZSksCi0gICAgICBjdXJyZW50X3RyYWtfaXNfYXVkaW9fKGZhbHNlKSwKLSAgICAgIGN1cnJlbnRfdHJha190aW1lX3NjYWxlXygwKSwKLSAgICAgIHZpZGVvX3RpbWVfc2NhbGVfaHpfKDApLAotICAgICAgYXVkaW9fdGltZV9zY2FsZV9oel8oMCksCi0gICAgICBhdWRpb19tYXBfKG5ldyBTaGVsbE1QNE1hcChyZWFkZXIpKSwKLSAgICAgIHZpZGVvX21hcF8obmV3IFNoZWxsTVA0TWFwKHJlYWRlcikpLAotICAgICAgYXVkaW9fc2FtcGxlXygwKSwKLSAgICAgIHZpZGVvX3NhbXBsZV8oMCksCi0gICAgICBmaXJzdF9hdWRpb19ob2xlX3RpY2tzXygwKSwKLSAgICAgIGZpcnN0X2F1ZGlvX2hvbGVfKGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoMCkpIHt9Ci0KLVNoZWxsTVA0UGFyc2VyOjp+U2hlbGxNUDRQYXJzZXIoKSB7fQotCi0vLyBGb3IgTVA0IHdlIHRyYXZlcnNlIHRoZSBmaWxlJ3MgYXRvbSBzdHJ1Y3R1cmUgYXR0ZW1wdGluZyB0byBmaW5kIHRoZSBhdWRpbwotLy8gYW5kIHZpZGVvIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYW5kIHRoZSBsb2NhdGlvbnMgaW4gdGhlIGZpbGUgb2YgdGhlCi0vLyB2YXJpb3VzIHN0Ymwgc3ViYXRvbXMgd2hpY2ggZGV0YWlsIHRoZSBwb3NpdGlvbiBvZiB0aGUgYXVkaW8gYW5kIHZpZGVvCi0vLyBOQUxVcyBpbiB0aGUgZmlsZS4gQXMgc29tZSBvZiB0aGUgc3RibCBzdWJhdG9tcyBjYW4gYmUgcXVpdGUgbGFyZ2Ugd2UgY2FjaGUKLS8vIGEgZml4ZWQgbWF4aW11bSBxdWFudGl0eSBvZiBlYWNoIHN0Ymwgc3ViYXRvbSBhbmQgdXBkYXRlIHRoZSBjYWNoZSBvbmx5IG9uCi0vLyBtaXNzLgotYm9vbCBTaGVsbE1QNFBhcnNlcjo6UGFyc2VDb25maWcoKSB7Ci0gIHdoaWxlICghSXNDb25maWdDb21wbGV0ZSgpIHx8ICFhdWRpb19tYXBfLT5Jc0NvbXBsZXRlKCkgfHwKLSAgICAgICAgICF2aWRlb19tYXBfLT5Jc0NvbXBsZXRlKCkpIHsKLSAgICBpZiAoIVBhcnNlTmV4dEF0b20oKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc2NvcGVkX3JlZnB0cjxTaGVsbEFVPiBTaGVsbE1QNFBhcnNlcjo6R2V0TmV4dEFVKERlbXV4ZXJTdHJlYW06OlR5cGUgdHlwZSkgewotICB1aW50MzIgc2l6ZSA9IDA7Ci0gIHVpbnQzMiBkdXJhdGlvbl90aWNrcyA9IDA7Ci0gIHVpbnQ2NCB0aW1lc3RhbXBfdGlja3MgPSAwOwotICB1aW50NjQgb2Zmc2V0ID0gMDsKLSAgYm9vbCBpc19rZXlmcmFtZSA9IGZhbHNlOwotICBiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wOwotICBiYXNlOjpUaW1lRGVsdGEgZHVyYXRpb247Ci0gIGlmICh0eXBlID09IERlbXV4ZXJTdHJlYW06OkFVRElPKSB7Ci0gICAgaWYgKGF1ZGlvX3RpbWVfc2NhbGVfaHpfID09IDApIHsKLSAgICAgIERMT0coRVJST1IpIDw8ICJ8YXVkaW9fdGltZV9zY2FsZV9oel98IGNhbm5vdCBiZSAwLiI7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKCFhdWRpb19tYXBfLT5HZXRTaXplKGF1ZGlvX3NhbXBsZV8sIHNpemUpIHx8Ci0gICAgICAgICFhdWRpb19tYXBfLT5HZXRPZmZzZXQoYXVkaW9fc2FtcGxlXywgb2Zmc2V0KSB8fAotICAgICAgICAhYXVkaW9fbWFwXy0+R2V0RHVyYXRpb24oYXVkaW9fc2FtcGxlXywgZHVyYXRpb25fdGlja3MpIHx8Ci0gICAgICAgICFhdWRpb19tYXBfLT5HZXRUaW1lc3RhbXAoYXVkaW9fc2FtcGxlXywgdGltZXN0YW1wX3RpY2tzKSkgewotICAgICAgLy8gZGV0ZXJtaW5lIGlmIEVPUyBvciBlcnJvcgotICAgICAgaWYgKGF1ZGlvX21hcF8tPklzRU9TKGF1ZGlvX3NhbXBsZV8pKSB7Ci0gICAgICAgIHJldHVybiBTaGVsbEFVOjpDcmVhdGVFbmRPZlN0cmVhbUFVKERlbXV4ZXJTdHJlYW06OkFVRElPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb190cmFja19kdXJhdGlvbl8pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgRExPRyhFUlJPUikgPDwgInBhcnNlZCBiYWQgYXVkaW8gQVUiOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gYWxsIGFhYyBmcmFtZXMgYXJlIHJhbmRvbS1hY2Nlc3MsIHNvIGFsbCBhcmUga2V5ZnJhbWVzCi0gICAgaXNfa2V5ZnJhbWUgPSB0cnVlOwotICAgIGF1ZGlvX3NhbXBsZV8rKzsKLSAgICB0aW1lc3RhbXAgPSBUaWNrc1RvVGltZSh0aW1lc3RhbXBfdGlja3MsIGF1ZGlvX3RpbWVfc2NhbGVfaHpfKTsKLSAgICBkdXJhdGlvbiA9IFRpY2tzVG9UaW1lKGR1cmF0aW9uX3RpY2tzLCBhdWRpb190aW1lX3NjYWxlX2h6Xyk7Ci0KLSAgICAvLyBJdCB3b3VsZCBiZSB2ZXJ5IHVudXN1YWwgdG8gZW5jb3VudGVyIG5vbi1jb250aWd1b3VzIGF1ZGlvCi0gICAgLy8gaW4gYW4gbXA0LCBidXQgeW91IG5ldmVyIGtub3cuIE1ha2Ugc3VyZSB0aGlzIHRpbWVzdGFtcCBpcwotICAgIC8vIGNvbnRpZ3VvdXMgaW4gdGlja3MgZnJvbSB0aGUgbGFzdCBvbmUKLSAgICBpZiAoZmlyc3RfYXVkaW9faG9sZV90aWNrc18gPT0gdGltZXN0YW1wX3RpY2tzKSB7Ci0gICAgICAvLyBNdWNoIG9mIHRoZSBhdWRpbyBzdGFjayBhc3N1bWVzIHRoYXQgYXVkaW8gdGltZXN0YW1wcyBhcmUKLSAgICAgIC8vIGNvbnRpZ3VvdXMuIFdoaWxlIHRoZSB0aW1lc3RhbXBzIGNvbWluZyBvdXQgb2YgdGhlIG1hcCBhcmUKLSAgICAgIC8vIG5vcm1hbGx5IGNvbnRpbnVvdXMsIHRoZXkgYXJlIG9uIGEgZGlmZmVyZW50IHRpbWUgc2NhbGUuIER1ZQotICAgICAgLy8gdG8gcm91bmRvZmYgZXJyb3IgaW4gY29udmVyc2lvbiB0aGUgdGltZXN0YW1wcyBwcm9kdWNlZCBtYXkKLSAgICAgIC8vIGJlIGRpc2NvbnRpbnVvdXMuIFRvIGNvcnJlY3QgdGhpcyB3ZSBjb3JyZWN0IHRoZSB0aW1lc3RhbXAKLSAgICAgIC8vIHRvIHRoZSBvbmUgdGhlIHN5c3RlbSBpcyBleHBlY3RpbmcgZm9yIGNvbnRpbnVpdHksIHRoZW4gbW9kaWZ5Ci0gICAgICAvLyB0aGUgZHVyYXRpb24gYnkgdGhlIG5lZ2F0aXZlIG9mIHRoYXQgc2FtZSAoc21hbGwpIHZhbHVlLAotICAgICAgLy8gc28gYXMgdG8gbm90IGFjY3VtdWxhdGUgcm91bmRvZmYgZXJyb3Igb3ZlciB0aW1lLgotICAgICAgYmFzZTo6VGltZURlbHRhIHRpbWVfZGlmZmVyZW5jZSA9IHRpbWVzdGFtcCAtIGZpcnN0X2F1ZGlvX2hvbGVfOwotICAgICAgdGltZXN0YW1wID0gZmlyc3RfYXVkaW9faG9sZV87Ci0gICAgICBkdXJhdGlvbiArPSB0aW1lX2RpZmZlcmVuY2U7Ci0gICAgICBmaXJzdF9hdWRpb19ob2xlXyA9IHRpbWVzdGFtcCArIGR1cmF0aW9uOwotICAgICAgZmlyc3RfYXVkaW9faG9sZV90aWNrc18gKz0gZHVyYXRpb25fdGlja3M7Ci0gICAgfSBlbHNlIHsKLSAgICAgIERMT0coV0FSTklORykgPDwgInBhcnNlZCBub24tY29udGlndW91cyBtcDQgYXVkaW8gdGltZXN0YW1wIjsKLSAgICAgIC8vIHJlc2V0IGhvbGUgdHJhY2tpbmcgcGFzdCBnYXAKLSAgICAgIGZpcnN0X2F1ZGlvX2hvbGVfdGlja3NfID0gdGltZXN0YW1wX3RpY2tzICsgZHVyYXRpb25fdGlja3M7Ci0gICAgICBmaXJzdF9hdWRpb19ob2xlXyA9IHRpbWVzdGFtcCArIGR1cmF0aW9uOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlID09IERlbXV4ZXJTdHJlYW06OlZJREVPKSB7Ci0gICAgaWYgKHZpZGVvX3RpbWVfc2NhbGVfaHpfID09IDApIHsKLSAgICAgIERMT0coRVJST1IpIDw8ICJ8dmlkZW9fdGltZV9zY2FsZV9oel98IGNhbm5vdCBiZSAwLiI7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKCF2aWRlb19tYXBfLT5HZXRTaXplKHZpZGVvX3NhbXBsZV8sIHNpemUpIHx8Ci0gICAgICAgICF2aWRlb19tYXBfLT5HZXRPZmZzZXQodmlkZW9fc2FtcGxlXywgb2Zmc2V0KSB8fAotICAgICAgICAhdmlkZW9fbWFwXy0+R2V0RHVyYXRpb24odmlkZW9fc2FtcGxlXywgZHVyYXRpb25fdGlja3MpIHx8Ci0gICAgICAgICF2aWRlb19tYXBfLT5HZXRUaW1lc3RhbXAodmlkZW9fc2FtcGxlXywgdGltZXN0YW1wX3RpY2tzKSB8fAotICAgICAgICAhdmlkZW9fbWFwXy0+R2V0SXNLZXlmcmFtZSh2aWRlb19zYW1wbGVfLCBpc19rZXlmcmFtZSkpIHsKLSAgICAgIGlmICh2aWRlb19tYXBfLT5Jc0VPUyh2aWRlb19zYW1wbGVfKSkgewotICAgICAgICByZXR1cm4gU2hlbGxBVTo6Q3JlYXRlRW5kT2ZTdHJlYW1BVShEZW11eGVyU3RyZWFtOjpWSURFTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9fdHJhY2tfZHVyYXRpb25fKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIERMT0coRVJST1IpIDw8ICJwYXJzZWQgYmFkIHZpZGVvIEFVIjsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgfQotICAgIHZpZGVvX3NhbXBsZV8rKzsKLSAgICB0aW1lc3RhbXAgPSBUaWNrc1RvVGltZSh0aW1lc3RhbXBfdGlja3MsIHZpZGVvX3RpbWVfc2NhbGVfaHpfKTsKLSAgICBkdXJhdGlvbiA9IFRpY2tzVG9UaW1lKGR1cmF0aW9uX3RpY2tzLCB2aWRlb190aW1lX3NjYWxlX2h6Xyk7Ci0gICAgLy8gZHVlIHRvIGItZnJhbWVzIGl0J3MgbXVjaCBtb3JlIGxpa2VseSB3ZSdsbCBlbmNvdW50ZXIgZGlzY29udGludW91cwotICAgIC8vIHZpZGVvIGJ1ZmZlcnMuIEFzIGEgcmVzdWx0IHdlIGFkZCBhIHNtYWxsIGR1cmF0aW9uIHRvIGVhY2ggdmlkZW8KLSAgICAvLyBidWZmZXIsIGVxdWFsIGluIHZhbHVlIHRvIG9uZSBmdWxsIHRpY2sgYXQgdGhlIHZpZGVvIHRpbWVzY2FsZS4gVGhlCi0gICAgLy8gc2hvd2luZyBvZiB2aWRlbyBmcmFtZXMgaXMgYWN0dWFsbHkga2V5ZWQgb24gdGhlIGF1ZGlvIGNsb2NrLCBzbyB0aGlzCi0gICAgLy8gc2hvdWxkbid0IGNyZWF0ZSB0b28gbXVjaCBqaXR0ZXIgaW4gdGhlIG91dHB1dC4KLSAgICBkdXJhdGlvbiArPSBvbmVfdmlkZW9fdGlja187Ci0gIH0gZWxzZSB7Ci0gICAgTk9UUkVBQ0hFRCgpIDw8ICJ1bnN1cHBvcnRlZCBzdHJlYW0gdHlwZSI7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBzaXplX3QgcHJlcGVuZF9zaXplID0gQ2FsY3VsYXRlUHJlcGVuZFNpemUodHlwZSwgaXNfa2V5ZnJhbWUpOwotCi0gIGlmICh0eXBlID09IERlbXV4ZXJTdHJlYW06OkFVRElPKQotICAgIHJldHVybiBTaGVsbEFVOjpDcmVhdGVBdWRpb0FVKG9mZnNldCwgc2l6ZSwgcHJlcGVuZF9zaXplLCBpc19rZXlmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAsIGR1cmF0aW9uLCB0aGlzKTsKLSAgcmV0dXJuIFNoZWxsQVU6OkNyZWF0ZVZpZGVvQVUob2Zmc2V0LCBzaXplLCBwcmVwZW5kX3NpemUsIG5hbF9oZWFkZXJfc2l6ZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2tleWZyYW1lLCB0aW1lc3RhbXAsIGR1cmF0aW9uLCB0aGlzKTsKLX0KLQotYm9vbCBTaGVsbE1QNFBhcnNlcjo6U2Vla1RvKGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXApIHsKLSAgaWYgKGF1ZGlvX3RpbWVfc2NhbGVfaHpfID09IDAgfHwgdmlkZW9fdGltZV9zY2FsZV9oel8gPT0gMCkgewotICAgIERMT0dfSUYoRVJST1IsIGF1ZGlvX3RpbWVfc2NhbGVfaHpfID09IDApCi0gICAgICAgIDw8ICJ8YXVkaW9fdGltZV9zY2FsZV9oel98IGNhbm5vdCBiZSAwLiI7Ci0gICAgRExPR19JRihFUlJPUiwgdmlkZW9fdGltZV9zY2FsZV9oel8gPT0gMCkKLSAgICAgICAgPDwgInx2aWRlb190aW1lX3NjYWxlX2h6X3wgY2Fubm90IGJlIDAuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBnZXQgdmlkZW8gdGltZXN0YW1wIGluIHZpZGVvIHRpbWUgdW5pdHMKLSAgdWludDY0IHZpZGVvX3RpY2tzID0gVGltZVRvVGlja3ModGltZXN0YW1wLCB2aWRlb190aW1lX3NjYWxlX2h6Xyk7Ci0gIC8vIGZpbmQgbmVhcmVzdCBrZXlmcmFtZSBmcm9tIG1hcCwgbWFrZSBpdCBvdXIgbmV4dCB2aWRlbyBzYW1wbGUKLSAgaWYgKCF2aWRlb19tYXBfLT5HZXRLZXlmcmFtZSh2aWRlb190aWNrcywgdmlkZW9fc2FtcGxlXykpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gZ2V0IHRoZSB0aW1lc3RhbXAgZm9yIHRoaXMgdmlkZW8ga2V5ZnJhbWUKLSAgdWludDY0IHZpZGVvX2tleWZyYW1lX3RpbWVfdGlja3MgPSAwOwotICBpZiAoIXZpZGVvX21hcF8tPkdldFRpbWVzdGFtcCh2aWRlb19zYW1wbGVfLCB2aWRlb19rZXlmcmFtZV90aW1lX3RpY2tzKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBiYXNlOjpUaW1lRGVsdGEgdmlkZW9fa2V5ZnJhbWVfdGltZSA9Ci0gICAgICBUaWNrc1RvVGltZSh2aWRlb19rZXlmcmFtZV90aW1lX3RpY2tzLCB2aWRlb190aW1lX3NjYWxlX2h6Xyk7Ci0gIC8vIGZpbmQgdGhlIGNsb3Nlc3QgYXVkaW8gZnJhbWUgdGhhdCBib3VuZHMgdGhhdCB0aW1lc3RhbXAKLSAgdWludDY0IGF1ZGlvX3RpY2tzID0gVGltZVRvVGlja3ModmlkZW9fa2V5ZnJhbWVfdGltZSwgYXVkaW9fdGltZV9zY2FsZV9oel8pOwotICBpZiAoIWF1ZGlvX21hcF8tPkdldEtleWZyYW1lKGF1ZGlvX3RpY2tzLCBhdWRpb19zYW1wbGVfKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBETE9HKElORk8pIDw8IGJhc2U6OlN0cmluZ1ByaW50ZigKLSAgICAgICJzZWVraW5nIHRvIHRpbWVzdGFtcDogJSIgUFJJZDY0ICIsIHZpZGVvIHNhbXBsZTogJWQsIGF1ZGlvIHNhbXBsZTogJWQiLAotICAgICAgdGltZXN0YW1wLkluTWlsbGlzZWNvbmRzKCksIHZpZGVvX3NhbXBsZV8sIGF1ZGlvX3NhbXBsZV8pOwotICAvLyBjaGVhdCBvdXIgYnVmZmVyIGNvbnRpbnVpdHkgc3lzdGVtCi0gIGlmICghYXVkaW9fbWFwXy0+R2V0VGltZXN0YW1wKGF1ZGlvX3NhbXBsZV8sIGZpcnN0X2F1ZGlvX2hvbGVfdGlja3NfKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBmaXJzdF9hdWRpb19ob2xlXyA9Ci0gICAgICBUaWNrc1RvVGltZShmaXJzdF9hdWRpb19ob2xlX3RpY2tzXywgYXVkaW9fdGltZV9zY2FsZV9oel8pOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gcGFyc2UgdGhlIGF0b20gc3RhcnRpbmcgYXQgYXRvbV9vZmZzZXRfLCB1cGRhdGUgYXBwcm9wcmlhdGUgaW50ZXJuYWwgc3RhdGUsCi0vLyByZXR1cm4gZmFsc2Ugb24gZmF0YWwgZXJyb3IuIEdlbmVyYWwgc3RydWN0dXJlIG9mIGFuIE1QNCBhdG9tIGlzOgotLy8gZmllbGQgICAgICAgICAgICAgfCB0eXBlICAgfCBjb21tZW50Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tCi0vLyBhdG9tIHNpemUgICAgICAgICB8IHVpbnQzMiB8IGlmIDAgbWVhbnMgInJlc3Qgb2YgZmlsZSIsIGlmIDEgbWVhbnMgZXh0ZW5kZWQKLS8vIGZvdXJDQyBjb2RlICAgICAgIHwgQVNDSUkgIHwgZm91ci1ieXRlIEFTQ0lJIGNvZGUgd2UgdHJlYXQgYXMgdWludDMyCi0vLyBleHRlbmRlZCBzaXplICAgICB8IHVpbnQ2NCB8IG9wdGlvbmFsIHNpemUgZmllbGQsIG9ubHkgaGVyZSBpZiBhdG9tIHNpemUgaXMgMQotLy8gPC0tLSByZXN0IG9mIGF0b20gYm9keSBzdGFydHMgaGVyZQotYm9vbCBTaGVsbE1QNFBhcnNlcjo6UGFyc2VOZXh0QXRvbSgpIHsKLSAgdWludDggYXRvbVtrQXRvbURvd25sb2FkXTsKLSAgaW50IGJ5dGVzX3JlYWQgPSByZWFkZXJfLT5CbG9ja2luZ1JlYWQoYXRvbV9vZmZzZXRfLCBrQXRvbURvd25sb2FkLCBhdG9tKTsKLSAgaWYgKGJ5dGVzX3JlYWQgPCBrQXRvbURvd25sb2FkKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIGZpcnN0IDQgYnl0ZXMgYXJlIHNpemUgb2YgYXRvbSB1aW50MzIKLSAgdWludDY0IGF0b21fc2l6ZSA9ICh1aW50NjQpZW5kaWFuX3V0aWw6OmxvYWRfdWludDMyX2JpZ19lbmRpYW4oYXRvbSk7Ci0gIC8vIG5vcm1hbGx5IGF0b20gYm9keSBzdGFydHMganVzdCBwYXN0IGZvdXJDQyBjb2RlCi0gIHVpbnQzMiBhdG9tX2JvZHkgPSBrQXRvbU1pblNpemU7Ci0gIC8vIGlmIDEgd2UgbmVlZCB0byBsb2FkIHRoZSBleHRlbmRlZCBzaXplIHdoaWNoIHdpbGwgYmUgYXBwZW5kZWQganVzdCBwYXN0Ci0gIC8vIHRoZSBmb3VyQ0MgY29kZQotICBpZiAoYXRvbV9zaXplID09IDEpIHsKLSAgICBhdG9tX3NpemUgPSBlbmRpYW5fdXRpbDo6bG9hZF91aW50NjRfYmlnX2VuZGlhbihhdG9tICsgOCk7Ci0gICAgLy8gYWR2YW5jZSBhdG9tX2JvZHkgcGFzdCB0aGUgOCBieXRlcyBvZiBzaXplIHdlIGp1c3QgcGFyc2VkCi0gICAgYXRvbV9ib2R5ICs9IDg7Ci0gIH0gZWxzZSBpZiAoYXRvbV9zaXplID09IDApIHsKLSAgICAvLyBjYWxjdWxhdGUgc2l6ZSBvZiB0aGlzIGF0b20gZnJvbSByZW1haW5kZXIgb2YgZmlsZQotICAgIERDSEVDS19MRShhdG9tX29mZnNldF8sCi0gICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ2ND4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2ND46Om1heCgpKSk7Ci0gICAgaWYgKHJlYWRlcl8tPkZpbGVTaXplKCkgPiBzdGF0aWNfY2FzdDxpbnQ2ND4oYXRvbV9vZmZzZXRfKSkgewotICAgICAgYXRvbV9zaXplID0gcmVhZGVyXy0+RmlsZVNpemUoKSAtIGF0b21fb2Zmc2V0XzsKLSAgICB9Ci0gIH0KLSAgLy8gYXRvbSBzaXplcyBhbHNvIGluY2x1ZGUgdGhlIHNpemUgb2YgdGhlIHN0YXJ0IG9mIHRoZSBhdG9tLCBzbyBzYW5pdHktY2hlY2sKLSAgLy8gdGhlIHNpemUgd2UganVzdCBwYXJzZWQgYWdhaW5zdCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIG5lZWRlZCB0byBwYXJzZSBpdAotICBpZiAoYXRvbV9zaXplIDwgYXRvbV9ib2R5KSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCBiYXNlOjpTdHJpbmdQcmludGYoImF0b20gc2l6ZTogJSIgUFJJZDY0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBsZXNzIHRoYW4gbWluIGJvZHkgc2l6ZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRvbV9zaXplLCBhdG9tX2JvZHkpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIGV4dHJhY3QgZm91ckNDIGNvZGUgYXMgYmlnLWVuZGlhbiB1aW50MzIKLSAgdWludDMyIGZvdXJfY2MgPSBlbmRpYW5fdXRpbDo6bG9hZF91aW50MzJfYmlnX2VuZGlhbihhdG9tICsgNCk7Ci0gIERMT0coSU5GTykgPDwgYmFzZTo6U3RyaW5nUHJpbnRmKCJmb3VyX2NjOiAlYyVjJWMlYyIsIGF0b21bNF0sIGF0b21bNV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0b21bNl0sIGF0b21bN10pOwotCi0jaWYgU0hFTExfTVA0X1BBUlNFUl9EVU1QX0FUT01TCi0gIER1bXBBdG9tVG9EaXNrKGZvdXJfY2MsIGF0b21fc2l6ZSwgYXRvbV9vZmZzZXRfKTsKLSNlbmRpZgotCi0gIC8vIGFkdmFuY2UgcmVhZCBwb2ludGVyIHRvIGF0b20gYm9keQotICBhdG9tX29mZnNldF8gKz0gYXRvbV9ib2R5OwotICAvLyBhZGp1c3Qgc2l6ZSBvZiBib2R5IG9mIGF0b20gZnJvbSBzaXplIG9mIGhlYWRlcgotICB1aW50NjQgYXRvbV9kYXRhX3NpemUgPSBhdG9tX3NpemUgLSBhdG9tX2JvZHk7Ci0KLSAgYm9vbCBhdG9tX3BhcnNlX3N1Y2Nlc3MgPSB0cnVlOwotCi0gIC8vIFdlIHVzZSA5NSUgY2VydGFpbnR5IGludGVydmFscyBmb3IgdmlkZW8gbWV0YWRhdGEgYXRvbSBzaXplcy4gVGhlIG1hcAotICAvLyBpcyB3cml0dGVuIHRvIGhhbmRsZSBsYXJnZXIgYXRvbSBzaXplcyBidXQgaGF2aW5nIHRvIHJlY2FjaGUgbWV0YWRhdGEKLSAgLy8gaW5jcmVhc2VzIGxhdGVuY2llcyBvbiB0aGluZ3MgbGlrZSBzZWVrcy4KLSAgaW50IG1hcF90YWJsZV9hdG9tX2NhY2hlX2VudHJpZXMgPSAwOwotCi0gIC8vIG5vdyB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiBiYXNlZCBvbiBhdG9tIHR5cGUKLSAgc3dpdGNoIChmb3VyX2NjKSB7Ci0gICAgLy8gYXZjMSBhdG9tcyBhcmUgY29udGFpbmVkIHdpdGhpbiBzdHNkIGF0b21zIGFuZCBjYXJyeSB0aGVpciBvd24KLSAgICAvLyBjb25maWd1cmF0aW9uIGJhZ2dhZ2UgbG9hZCwgd2hpY2ggd2Ugc2tpcCBvdmVyIGFuZCBwYXJzZSB0aGUgYXRvbXMKLSAgICAvLyB3aXRoaW4sIG5vcm1hbGx5IGFuIGF2Y0MgYXRvbS4KLSAgICBjYXNlIGtBdG9tVHlwZV9hdmMxOgotICAgICAgYXRvbV9vZmZzZXRfICs9IGtTa2lwQnl0ZXNfYXZjMTsKLSAgICAgIGJyZWFrOwotCi0gICAgLy8gYXZjQyBhdG9tcyBjb250YWluIHRoZSBBVkNDb25maWdSZWNvcmQsIG91ciB2aWRlbyBjb25maWd1cmF0aW9uIGluZm8KLSAgICBjYXNlIGtBdG9tVHlwZV9hdmNDOgotICAgICAgYXRvbV9wYXJzZV9zdWNjZXNzID0KLSAgICAgICAgICBEb3dubG9hZEFuZFBhcnNlQVZDQ29uZmlnUmVjb3JkKGF0b21fb2Zmc2V0XywgYXRvbV9kYXRhX3NpemUpOwotICAgICAgaWYgKGF0b21fcGFyc2Vfc3VjY2VzcykKLSAgICAgICAgYXRvbV9vZmZzZXRfICs9IGF0b21fZGF0YV9zaXplOwotICAgICAgYnJlYWs7Ci0KLSAgICAvLyBlc2RzIGF0b21zIGNvbnRhaW4gYWN0dWFsbHkgdXNhYmxlIGF1ZGlvIGNvbmZpZ3VyYXRpb24gaW5mbyBmb3IgQUFDLgotICAgIGNhc2Uga0F0b21UeXBlX2VzZHM6Ci0gICAgICByZXR1cm4gUGFyc2VNUDRfZXNkcyhhdG9tX2RhdGFfc2l6ZSk7Ci0KLSAgICAvLyBjYW4gdGVsbCB1cyBpZiBtZGlhIGFuZCBtZGhkIGF0b21zIHJlbGF0ZSB0byBhdWRpbyBvciB2aWRlbyBtZXRhZGF0YQotICAgIGNhc2Uga0F0b21UeXBlX2hkbHI6Ci0gICAgICByZXR1cm4gUGFyc2VNUDRfaGRscihhdG9tX2RhdGFfc2l6ZSwgYXRvbSArIGF0b21fYm9keSk7Ci0KLSAgICAvLyBwcm92aWRlcyBhIGR1cmF0aW9uIGFuZCBhIHRpbWVzY2FsZSB1bmlxdWUgdG8gYSBnaXZlbiB0cmFjawotICAgIGNhc2Uga0F0b21UeXBlX21kaGQ6Ci0gICAgICByZXR1cm4gUGFyc2VNUDRfbWRoZChhdG9tX2RhdGFfc2l6ZSwgYXRvbSArIGF0b21fYm9keSk7Ci0KLSAgICAvLyBtcDRhIGF0b21zIGNvbnRhaW4gYXVkaW8gY29uZmlndXJhdGlvbiBpbmZvLCBidXQgd2Ugb25seSB3YW50IHRvIGtub3cKLSAgICAvLyB3aGljaCB2ZXJzaW9uIGl0IGlzIHNvIHdlIGNhbiBza2lwIHRvIHRoZSBlc2RzLCB3aGljaCB3ZSBtdXN0IGJlIHByZXNlbnQKLSAgICAvLyB3aGVuIHVzaW5nIEFBQwotICAgIGNhc2Uga0F0b21UeXBlX21wNGE6Ci0gICAgICByZXR1cm4gUGFyc2VNUDRfbXA0YShhdG9tX2RhdGFfc2l6ZSwgYXRvbSArIGF0b21fYm9keSk7Ci0KLSAgICAvLyBtb3ZpZSBoZWFkZXIgYXRvbSBjb250YWlucyB0cmFjayBkdXJhdGlvbiBhbmQgdGltZSB1bml0IHNjYWxlLCB3ZSB0cnVzdAotICAgIC8vIHRoZXNlIGRhdGEgYXMgdGhlIGF1dGhvcml0YXRpdmUgZHVyYXRpb24gZGF0YSBmb3IgdGhlIG1wNAotICAgIGNhc2Uga0F0b21UeXBlX212aGQ6Ci0gICAgICByZXR1cm4gUGFyc2VNUDRfbXZoZChhdG9tX2RhdGFfc2l6ZSwgYXRvbSArIGF0b21fYm9keSk7Ci0KLSAgICAvLyBzdHNkIGF0b21zIG1heSBjb250YWluIGF2YzEgYXRvbXMsIHdoaWNoIHRoZW1zZWx2ZXMgbWF5IGNvbnRhaW4gYXZjQwotICAgIC8vIGF0b21zLCB3aGljaCBjb250YWluIGFjdHVhbGx5IHVzYWJsZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiBza2lwIHRvCi0gICAgLy8gc3ViYXRvbS4KLSAgICBjYXNlIGtBdG9tVHlwZV9zdHNkOgotICAgICAgYXRvbV9vZmZzZXRfICs9IGtTa2lwQnl0ZXNfc3RzZDsKLSAgICAgIGJyZWFrOwotCi0gICAgLy8gV2UncmUgdmVyeSBtdWNoIGludGVyZXN0ZWQgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSB0cmFrIGNvbnRhaW5lciBhdG9tLAotICAgIC8vIGJsb3cgYXdheSBzdGF0ZSB0aGF0IHdlIG1heSBoYXZlIGJlZW4ga2VlcGluZyBhYm91dCBhbnkgcHJpb3IgdHJhawotICAgIC8vIGF0b21zIHdlJ3ZlIHBhcnNlZC4KLSAgICBjYXNlIGtBdG9tVHlwZV90cmFrOgotICAgICAgY3VycmVudF90cmFrX2lzX3ZpZGVvXyA9IGZhbHNlOwotICAgICAgY3VycmVudF90cmFrX2lzX2F1ZGlvXyA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICAvLyBpZiBvbmUgb2YgdGhlIHN0Ymwgc3ViYXRvbXMgYWRkIGl0IHRvIHRoZSBhcHByb3ByaWF0ZSBhdWRpbyBvciB2aWRlbyBtYXAKLSAgICAvLyBhbmQgdGhlbiBhZHZhbmNlIHBhc3QgaXQuCi0gICAgY2FzZSBrQXRvbVR5cGVfY282NDoKLSAgICAgIG1hcF90YWJsZV9hdG9tX2NhY2hlX2VudHJpZXMgPSBrTWFwVGFibGVBdG9tQ2FjaGVFbnRyaWVzX2NvNjQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2Uga0F0b21UeXBlX2N0dHM6Ci0gICAgICBtYXBfdGFibGVfYXRvbV9jYWNoZV9lbnRyaWVzID0ga01hcFRhYmxlQXRvbUNhY2hlRW50cmllc19jdHRzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGtBdG9tVHlwZV9zdGNvOgotICAgICAgbWFwX3RhYmxlX2F0b21fY2FjaGVfZW50cmllcyA9IGtNYXBUYWJsZUF0b21DYWNoZUVudHJpZXNfc3RjbzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBrQXRvbVR5cGVfc3R0czoKLSAgICAgIG1hcF90YWJsZV9hdG9tX2NhY2hlX2VudHJpZXMgPSBrTWFwVGFibGVBdG9tQ2FjaGVFbnRyaWVzX3N0dHM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2Uga0F0b21UeXBlX3N0c2M6Ci0gICAgICBtYXBfdGFibGVfYXRvbV9jYWNoZV9lbnRyaWVzID0ga01hcFRhYmxlQXRvbUNhY2hlRW50cmllc19zdHNjOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGtBdG9tVHlwZV9zdHNzOgotICAgICAgbWFwX3RhYmxlX2F0b21fY2FjaGVfZW50cmllcyA9IGtNYXBUYWJsZUF0b21DYWNoZUVudHJpZXNfc3RzczsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBrQXRvbVR5cGVfc3RzejoKLSAgICAgIG1hcF90YWJsZV9hdG9tX2NhY2hlX2VudHJpZXMgPSBrTWFwVGFibGVBdG9tQ2FjaGVFbnRyaWVzX3N0c3o7Ci0gICAgICBicmVhazsKLQotICAgIC8vIHRoZXNlIGFyZSBjb250YWluZXIgYXRvbXMsIHNvIHdlIGRvbnQgd2FudCB0byBhZHZhbmNlIHBhc3QgdGhlIGhlYWRlcgotICAgIC8vIGFzIHdlIGFyZSBpbnRlcmVzdGVkIGluIHRoZWlyIGNvbnRlbnRzLiBQYXJzaW5nIHRoZW0gaXMgdHJpdmlhbAotICAgIC8vIGFzIGFsbCB0aGV5IGFyZSBpcyBhIHNpemUgaGVhZGVyIGFuZCBhIGZvdXJDQyB0eXBlIHRhZywgd2hpY2ggd2UndmUKLSAgICAvLyBhbHJlYWR5IHBhcnNlZCBhbmQgYWR2YW5jZWQgcGFzdC4KLSAgICBjYXNlIGtBdG9tVHlwZV9tZGlhOgotICAgIGNhc2Uga0F0b21UeXBlX21pbmY6Ci0gICAgY2FzZSBrQXRvbVR5cGVfbW9vdjoKLSAgICBjYXNlIGtBdG9tVHlwZV9zdGJsOgotICAgICAgLy8gbm8tb3AKLSAgICAgIGJyZWFrOwotCi0gICAgLy8ga25vd24gYXRvbSB0eXBlcyB0aGF0IHdlIHdpc2ggdG8ganVzdCBza2lwIHBhc3QgdGhlIGJvZHkgd2l0aG91dCB3YXJuaW5nCi0gICAgY2FzZSBrQXRvbVR5cGVfZGluZjoKLSAgICBjYXNlIGtBdG9tVHlwZV9kcmVmOgotICAgIGNhc2Uga0F0b21UeXBlX3NtaGQ6Ci0gICAgY2FzZSBrQXRvbVR5cGVfdGtoZDoKLSAgICBjYXNlIGtBdG9tVHlwZV92bWhkOgotICAgICAgYXRvbV9vZmZzZXRfICs9IGF0b21fZGF0YV9zaXplOwotICAgICAgYnJlYWs7Ci0KLSAgICAvLyBwYXJzZSBmdW5jdGlvbnMgYXJlIGFzc3VtZWQgdG8gYWR2YW5jZSByZWFkX3Bvc2l0aW9uXyB0aGVtc2VsdmVzLAotICAgIC8vIGFzIHdlIGFyZSBmbGF0dGVuaW5nIGEgdHJlZSBvZiBhdG9tcyBzbyB0aGF0IHRoZSBhdG9tX3NpemUgd2UgcGFyc2VkCi0gICAgLy8gdGhpcyB0aW1lLCBpZiBpdCdzIGEgY29udGFpbmVyLCBtYXkgbm90IGhhdmUgYmVlbiBlbnRpcmVseSBjb25zdW1lZAotICAgIC8vIGluIHRoaXMgc2luZ2xlIGNhbGwuIEhvd2V2ZXIgZm9yIHVuc3VwcG9ydGVkIGF0b21zIHdlIGp1c3Qgc2tpcCB0aGVtCi0gICAgLy8gZW50aXJlbHksIG1lYW5pbmcgd2Ugd2lsbCBza2lwIHRoZWlyIGNvbnRlbnRzIHRvby4KLSAgICBkZWZhdWx0OgotICAgICAgYXRvbV9vZmZzZXRfICs9IGF0b21fZGF0YV9zaXplOwotICAgICAgRExPRyhJTkZPKSA8PCBiYXNlOjpTdHJpbmdQcmludGYoCi0gICAgICAgICAgInNraXBwaW5nIHVuc3VwcG9ydGVkIE1QNCBhdG9tOiAlYyVjJWMlYyIsIGF0b21bNF0sIGF0b21bNV0sIGF0b21bNl0sCi0gICAgICAgICAgYXRvbVs3XSk7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIGlmIChtYXBfdGFibGVfYXRvbV9jYWNoZV9lbnRyaWVzID4gMCkgewotICAgIGlmIChjdXJyZW50X3RyYWtfaXNfdmlkZW9fKSB7Ci0gICAgICBhdG9tX3BhcnNlX3N1Y2Nlc3MgPQotICAgICAgICAgIHZpZGVvX21hcF8tPlNldEF0b20oZm91cl9jYywgYXRvbV9vZmZzZXRfLCBhdG9tX2RhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF90YWJsZV9hdG9tX2NhY2hlX2VudHJpZXMsIGF0b20gKyBhdG9tX2JvZHkpOwotICAgIH0gZWxzZSBpZiAoY3VycmVudF90cmFrX2lzX2F1ZGlvXykgewotICAgICAgYXRvbV9wYXJzZV9zdWNjZXNzID0KLSAgICAgICAgICBhdWRpb19tYXBfLT5TZXRBdG9tKGZvdXJfY2MsIGF0b21fb2Zmc2V0XywgYXRvbV9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfdGFibGVfYXRvbV9jYWNoZV9lbnRyaWVzLCBhdG9tICsgYXRvbV9ib2R5KTsKLSAgICB9Ci0gICAgYXRvbV9vZmZzZXRfICs9IGF0b21fZGF0YV9zaXplOwotICB9Ci0KLSAgaWYgKCFhdG9tX3BhcnNlX3N1Y2Nlc3MpIHsKLSAgICBETE9HKEVSUk9SKSA8PCBiYXNlOjpTdHJpbmdQcmludGYoIlVuYWJsZSB0byBwYXJzZSBNUDQgYXRvbTogJWMlYyVjJWMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdG9tWzRdLCBhdG9tWzVdLCBhdG9tWzZdLCBhdG9tWzddKTsKLSAgfQotCi0gIHJldHVybiBhdG9tX3BhcnNlX3N1Y2Nlc3M7Ci19Ci0KLSNpZiBTSEVMTF9NUDRfUEFSU0VSX0RVTVBfQVRPTVMKLQotdm9pZCBTaGVsbE1QNFBhcnNlcjo6RHVtcEF0b21Ub0Rpc2sodWludDMyIGZvdXJfY2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgYXRvbV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0IGF0b21fb2Zmc2V0KSB7Ci0gIC8vIGRvd25sb2FkIGVudGlyZSBhdG9tIGludG8gYnVmZmVyCi0gIHNjb3BlZF9yZWZwdHI8U2hlbGxTY29wZWRBcnJheT4gc2NvcGVkX2J1ZmZlciA9Ci0gICAgICBTaGVsbEJ1ZmZlckZhY3Rvcnk6Okluc3RhbmNlKCktPkFsbG9jYXRlQXJyYXkoYXRvbV9zaXplKTsKLSAgdWludDgqIGJ1ZmZlciA9IHNjb3BlZF9idWZmZXItPkdldCgpOwotICBpbnQgYnl0ZXNfcmVhZCA9IHJlYWRlcl8tPkJsb2NraW5nUmVhZChhdG9tX29mZnNldCwgYXRvbV9zaXplLCBidWZmZXIpOwotICBEQ0hFQ0tfRVEoYnl0ZXNfcmVhZCwgYXRvbV9zaXplKTsKLSAgLy8gY2FsY3VsYXRlIGZpbGUgYW5kIHRhYmxlIG5hbWVzCi0gIHN0ZDo6c3RyaW5nIGF2X3ByZWZpeF9maWxlOwotICBpZiAoY3VycmVudF90cmFrX2lzX3ZpZGVvXykgewotICAgIGF2X3ByZWZpeF9maWxlID0gIi9tcDRfdmlkZW9fYXRvbV8iOwotICB9IGVsc2UgaWYgKGN1cnJlbnRfdHJha19pc19hdWRpb18pIHsKLSAgICBhdl9wcmVmaXhfZmlsZSA9ICIvbXA0X2F1ZGlvX2F0b21fIjsKLSAgfSBlbHNlIHsKLSAgICBhdl9wcmVmaXhfZmlsZSA9ICIvbXA0X2F0b21fIjsKLSAgfQotICBzdGQ6OnN0cmluZyBhdG9tX25hbWUgPSBiYXNlOjpTdHJpbmdQcmludGYoCi0gICAgICAiJWMlYyVjJWMiLCAoY2hhcikoZm91cl9jYyA+PiAyNCksIChjaGFyKShmb3VyX2NjID4+IDE2KSwKLSAgICAgIChjaGFyKShmb3VyX2NjID4+IDgpLCAoY2hhcilmb3VyX2NjKTsKLSAgLy8gYnVpbGQgcGF0aAotICBzdGQ6OnN0cmluZyBwYXRoID0gYmFzZTo6U3RyaW5nUHJpbnRmKAotICAgICAgIiVzJXMlc18lbGxkLnR4dCIsIGdsb2JhbF9nYW1lX2NvbnRlbnRfcGF0aC0+Y19zdHIoKSwKLSAgICAgIGF2X3ByZWZpeF9maWxlLmNfc3RyKCksIGF0b21fbmFtZS5jX3N0cigpLCBhdG9tX29mZnNldCk7Ci0gIC8vIGdldCBmaWxlIGZvciB3cml0aW5nCi0gIEZJTEUqIGF0b21fZmlsZSA9IGZvcGVuKHBhdGguY19zdHIoKSwgInciKTsKLSAgRENIRUNLKGF0b21fZmlsZSk7Ci0gIC8vIDEzIGJ5dGVzIHBlciBsaW5lIG1hdGNoZXMgODAtY29sdW1uIHJ1bGUgd2l0aCBpbmRlbnRpbmcgOikKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdG9tX3NpemU7IGkgKz0gMTMpIHsKLSAgICBzdGQ6OnN0cmluZyBhdG9tX2NoYXJzOwotICAgIC8vIGRvIHdob2xlIGxpbmVzIGF0IGEgdGltZQotICAgIGlmIChhdG9tX3NpemUgLSBpID4gMTMpIHsKLSAgICAgIGF0b21fY2hhcnMgPSBiYXNlOjpTdHJpbmdQcmludGYoCi0gICAgICAgICAgIiAgMHglMDJ4LCAweCUwMngsIDB4JTAyeCwgMHglMDJ4LCAweCUwMngsIDB4JTAyeCwgMHglMDJ4LCAiCi0gICAgICAgICAgIjB4JTAyeCwgMHglMDJ4LCAweCUwMngsIDB4JTAyeCwgMHglMDJ4LCAweCUwMngsXG4iLAotICAgICAgICAgIGJ1ZmZlcltpXSwgYnVmZmVyW2kgKyAxXSwgYnVmZmVyW2kgKyAyXSwgYnVmZmVyW2kgKyAzXSwgYnVmZmVyW2kgKyA0XSwKLSAgICAgICAgICBidWZmZXJbaSArIDVdLCBidWZmZXJbaSArIDZdLCBidWZmZXJbaSArIDddLCBidWZmZXJbaSArIDhdLAotICAgICAgICAgIGJ1ZmZlcltpICsgOV0sIGJ1ZmZlcltpICsgMTBdLCBidWZmZXJbaSArIDExXSwgYnVmZmVyW2kgKyAxMl0pOwotICAgIH0gZWxzZSB7Ci0gICAgICBhdG9tX2NoYXJzID0gIiAgIjsgIC8vIHN0YXJ0IHN0cmluZyB3aXRoIGluZGVudGF0aW9uCi0gICAgICAvLyBkbyBsYXN0IGxpbmUgb25lIGNoYXIgYXQgYSB0aW1lCi0gICAgICBmb3IgKGludCBqID0gaTsgaiA8IGF0b21fc2l6ZSAtIDE7IGorKykgewotICAgICAgICBhdG9tX2NoYXJzICs9IGJhc2U6OlN0cmluZ1ByaW50ZigiMHglMDJ4LCAiLCBidWZmZXJbal0pOwotICAgICAgfQotICAgICAgLy8gZmluYWwgY2hhciBnZXRzIG5vIGNvbW1hIGFuZCBhIG5ld2xpbmUKLSAgICAgIGF0b21fY2hhcnMgKz0gYmFzZTo6U3RyaW5nUHJpbnRmKCIweCUwMnhcbiIsIGJ1ZmZlclthdG9tX3NpemUgLSAxXSk7Ci0gICAgfQotICAgIC8vIHNhdmUgbGluZQotICAgIGZ3cml0ZShhdG9tX2NoYXJzLmNfc3RyKCksIDEsIGF0b21fY2hhcnMubGVuZ3RoKCksIGF0b21fZmlsZSk7Ci0gIH0KLSAgLy8gY2xvc2UgZmlsZQotICBmY2xvc2UoYXRvbV9maWxlKTsKLX0KLQotI2VuZGlmCi0KLWJvb2wgU2hlbGxNUDRQYXJzZXI6OlBhcnNlTVA0X2VzZHModWludDY0IGF0b21fZGF0YV9zaXplKSB7Ci0gIGlmIChhdG9tX2RhdGFfc2l6ZSA8IGtGdWxsQm94SGVhZGVyQW5kRmxhZ1NpemUpIHsKLSAgICBETE9HKFdBUk5JTkcpIDw8IGJhc2U6OlN0cmluZ1ByaW50ZigKLSAgICAgICAgImVzZHMgYm94IHNob3VsZCBhdCBsZWFzdCBiZSAlZCBieXRlcyBidXQgbm93IGl0IGlzICUiIFBSSWQ2NCAiIGJ5dGVzIiwKLSAgICAgICAga0Z1bGxCb3hIZWFkZXJBbmRGbGFnU2l6ZSwgYXRvbV9kYXRhX3NpemUpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHVpbnQ2NCBlc2RzX29mZnNldCA9IGF0b21fb2Zmc2V0XyArIGtGdWxsQm94SGVhZGVyQW5kRmxhZ1NpemU7Ci0gIHVpbnQ2NCBlc2RzX3NpemUgPSBhdG9tX2RhdGFfc2l6ZSAtIGtGdWxsQm94SGVhZGVyQW5kRmxhZ1NpemU7Ci0gIC8vIHdlJ2xsIG5lZWQgdG8gZG93bmxvYWQgZW50aXJlIGVzZHMsIGFsbG9jYXRlIGJ1ZmZlciBmb3IgaXQKLSAgc2NvcGVkX3JlZnB0cjxTaGVsbFNjb3BlZEFycmF5PiBlc2RzX3N0b3JhZ2UgPQotICAgICAgU2hlbGxCdWZmZXJGYWN0b3J5OjpJbnN0YW5jZSgpLT5BbGxvY2F0ZUFycmF5KGVzZHNfc2l6ZSk7Ci0gIHVpbnQ4KiBlc2RzID0gTlVMTDsKLSAgaWYgKCFlc2RzX3N0b3JhZ2UgfHwgIShlc2RzID0gZXNkc19zdG9yYWdlLT5HZXQoKSkpIHsKLSAgICBETE9HKFdBUk5JTkcpIDw8IGJhc2U6OlN0cmluZ1ByaW50ZigKLSAgICAgICAgInVuYWJsZSB0byBhbGxvY2F0ZSBlc2RzIHRlbXAgYXJyYXkgb2YgJSIgUFJJZDY0ICIgYnl0ZXMiLCBlc2RzX3NpemUpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBkb3dubG9hZCBlc2RzCi0gIGludCBieXRlc19yZWFkID0gcmVhZGVyXy0+QmxvY2tpbmdSZWFkKGVzZHNfb2Zmc2V0LCBlc2RzX3NpemUsIGVzZHMpOwotICBpZiAoYnl0ZXNfcmVhZCA8IGVzZHNfc2l6ZSkgewotICAgIERMT0coV0FSTklORykgPDwgImZhaWxlZCB0byBkb3dubG9hZCBlc2RzIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgbXA0OjpFU0Rlc2NyaXB0b3IgZXNfZGVzY3JpcHRvcjsKLSAgc3RkOjp2ZWN0b3I8dWludDg+IGRhdGEoZXNkcywgZXNkcyArIGVzZHNfc2l6ZSk7Ci0gIGlmIChlc19kZXNjcmlwdG9yLlBhcnNlKGRhdGEpKSB7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDg+JiBkc2kgPSBlc19kZXNjcmlwdG9yLmRlY29kZXJfc3BlY2lmaWNfaW5mbygpOwotICAgIGlmIChkc2kuc2l6ZSgpID49IDIpIHsKLSAgICAgIFBhcnNlQXVkaW9TcGVjaWZpY0NvbmZpZyhkc2lbMF0sIGRzaVsxXSk7Ci0gICAgICBhdG9tX29mZnNldF8gKz0gYXRvbV9kYXRhX3NpemU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgRExPRyhXQVJOSU5HKSA8PCAiZXNkcyBhdWRpbyBzcGVjaWZpYyBjb25maWcgc2hvcnRlciB0aGFuIDIgYnl0ZXMiOwotICB9IGVsc2UgewotICAgIERMT0coV0FSTklORykgPDwgImVycm9yIGluIHBhcnNlIGVzZHMgYm94IjsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBTaGVsbE1QNFBhcnNlcjo6UGFyc2VNUDRfaGRscih1aW50NjQgYXRvbV9kYXRhX3NpemUsIHVpbnQ4KiBoZGxyKSB7Ci0gIC8vIGVuc3VyZSB3ZSdyZSBkb3dubG9hZGluZyBlbm91Z2ggb2YgdGhlIGhkbHIgdG8gcGFyc2UKLSAgRENIRUNLX0xFKGtEZXNpcmVkQnl0ZXNfaGRsciArIDE2LCBrQXRvbURvd25sb2FkKTsKLSAgLy8gc2FuaXR5LWNoZWNrIGZvciBtaW5pbXVtIHNpemUKLSAgaWYgKGF0b21fZGF0YV9zaXplIDwga0Rlc2lyZWRCeXRlc19oZGxyKSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCBiYXNlOjpTdHJpbmdQcmludGYoImJhZCBzaXplICUiIFBSSWQ2NCAiIG9uIGhkbHIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0b21fZGF0YV9zaXplKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gbGFzdCA0IGJ5dGVzIG9mIHRoZSAxMiB3ZSBuZWVkIGFyZSBhbiBhc2NpaSBjb2RlIGZvciB0aGUgdHJhayB0eXBlLCB3ZQotICAvLyB3YW50ICd2aWRlJyBmb3IgdmlkZW8gb3IgJ3NvdW4nIGZvciBhdWRpby4gaWdub3JlIHRoZSByZXN0LgotICB1aW50MzIgaGRscl9zdWJ0eXBlID0gZW5kaWFuX3V0aWw6OmxvYWRfdWludDMyX2JpZ19lbmRpYW4oaGRsciArIDgpOwotICAvLyB1cGRhdGUgc3RhdGUgZmxhZ3MKLSAgY3VycmVudF90cmFrX2lzX3ZpZGVvXyA9IChoZGxyX3N1YnR5cGUgPT0ga1ZpZGVvU3VidHlwZV9oZGxyX3ZpZGUpOwotICBjdXJyZW50X3RyYWtfaXNfYXVkaW9fID0gKGhkbHJfc3VidHlwZSA9PSBrQXVkaW9TdWJ0eXBlX2hkbHJfc291bik7Ci0gIC8vIHNhdmUgYSB0aW1lIHNjYWxlIGlmIHBlbmRpbmcKLSAgaWYgKGN1cnJlbnRfdHJha190aW1lX3NjYWxlXyA+IDAgJiYgY3VycmVudF90cmFrX2lzX3ZpZGVvXykgewotICAgIHZpZGVvX3RpbWVfc2NhbGVfaHpfID0gY3VycmVudF90cmFrX3RpbWVfc2NhbGVfOwotICAgIGN1cnJlbnRfdHJha190aW1lX3NjYWxlXyA9IDA7Ci0gICAgdmlkZW9fdHJhY2tfZHVyYXRpb25fID0gY3VycmVudF90cmFrX2R1cmF0aW9uXzsKLSAgICBvbmVfdmlkZW9fdGlja18gPQotICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWNyb3NlY29uZHMoMTAwMDAwMCAvIHZpZGVvX3RpbWVfc2NhbGVfaHpfKTsKLSAgfQotICBpZiAoY3VycmVudF90cmFrX3RpbWVfc2NhbGVfID4gMCAmJiBjdXJyZW50X3RyYWtfaXNfYXVkaW9fKSB7Ci0gICAgYXVkaW9fdGltZV9zY2FsZV9oel8gPSBjdXJyZW50X3RyYWtfdGltZV9zY2FsZV87Ci0gICAgY3VycmVudF90cmFrX3RpbWVfc2NhbGVfID0gMDsKLSAgICBhdWRpb190cmFja19kdXJhdGlvbl8gPSBjdXJyZW50X3RyYWtfZHVyYXRpb25fOwotICB9Ci0gIC8vIHNraXAgcmVzdCBvZiBhdG9tCi0gIGF0b21fb2Zmc2V0XyArPSBhdG9tX2RhdGFfc2l6ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU2hlbGxNUDRQYXJzZXI6OlBhcnNlTVA0X21kaGQodWludDY0IGF0b21fZGF0YV9zaXplLCB1aW50OCogbWRoZCkgewotICBEQ0hFQ0tfTEUoa0Rlc2lyZWRCeXRlc19tZGhkICsgMTYsIGtBdG9tRG93bmxvYWQpOwotICBpZiAoYXRvbV9kYXRhX3NpemUgPCBrRGVzaXJlZEJ5dGVzX21kaGQpIHsKLSAgICBETE9HKFdBUk5JTkcpIDw8IGJhc2U6OlN0cmluZ1ByaW50ZigiYmFkIHNpemUgJSIgUFJJZDY0ICIgb24gbWRoZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRvbV9kYXRhX3NpemUpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICB1aW50MzIgdGltZV9zY2FsZSA9IGVuZGlhbl91dGlsOjpsb2FkX3VpbnQzMl9iaWdfZW5kaWFuKG1kaGQgKyAxMik7Ci0gIGlmKHRpbWVfc2NhbGUgPT0gMCkgewotICAgIERMT0coV0FSTklORykgPDwgImdvdCAwIHRpbWUgc2NhbGUgZm9yIG12aGQiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBkb3VibGUtY2hlY2sgdHJhY2sgZHVyYXRpb24sIGl0IG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgbW92aWUgZHVyYXRpb24KLSAgdWludDMyIHRyYWNrX2R1cmF0aW9uX3RpY2tzID0gZW5kaWFuX3V0aWw6OmxvYWRfdWludDMyX2JpZ19lbmRpYW4obWRoZCArIDE2KTsKLSAgYmFzZTo6VGltZURlbHRhIHRyYWNrX2R1cmF0aW9uID0KLSAgICAgIFRpY2tzVG9UaW1lKHRyYWNrX2R1cmF0aW9uX3RpY2tzLCB0aW1lX3NjYWxlKTsKLSAgaWYgKHRyYWNrX2R1cmF0aW9uID4gZHVyYXRpb25fKSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCBiYXNlOjpTdHJpbmdQcmludGYoIm1kaGQgaGFzIGxvbmdlciBkdXJhdGlvbjogJSIgUFJJZDY0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBtcyB0aGFuIG9sZCB2YWx1ZTogJSIgUFJJZDY0ICIgbXMuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19kdXJhdGlvbi5Jbk1pY3Jvc2Vjb25kcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uXy5Jbk1pY3Jvc2Vjb25kcygpKTsKLSAgICBkdXJhdGlvbl8gPSB0cmFja19kdXJhdGlvbjsKLSAgfQotICBpZiAoY3VycmVudF90cmFrX2lzX3ZpZGVvXykgewotICAgIHZpZGVvX3RpbWVfc2NhbGVfaHpfID0gdGltZV9zY2FsZTsKLSAgICBjdXJyZW50X3RyYWtfdGltZV9zY2FsZV8gPSAwOwotICAgIHZpZGVvX3RyYWNrX2R1cmF0aW9uXyA9IHRyYWNrX2R1cmF0aW9uOwotICAgIG9uZV92aWRlb190aWNrXyA9Ci0gICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pY3Jvc2Vjb25kcygxMDAwMDAwIC8gdmlkZW9fdGltZV9zY2FsZV9oel8pOwotICB9IGVsc2UgaWYgKGN1cnJlbnRfdHJha19pc19hdWRpb18pIHsKLSAgICBhdWRpb190aW1lX3NjYWxlX2h6XyA9IHRpbWVfc2NhbGU7Ci0gICAgY3VycmVudF90cmFrX3RpbWVfc2NhbGVfID0gMDsKLSAgICBhdWRpb190cmFja19kdXJhdGlvbl8gPSB0cmFja19kdXJhdGlvbjsKLSAgfSBlbHNlIHsKLSAgICAvLyBpdCdzIHBvc3NpYmxlIHdlIHdpbGwgZW5jb3VudGVyIHRoZSBtZGhkIGJlZm9yZSB3ZSBlbmNvdW50ZXIgdGhlIGhkbHIsCi0gICAgLy8gaW4gdGhhdCBldmVudCB3ZSBzYXZlIHRoZSB0aW1lIHNjYWxlIHZhbHVlIHVudGlsIHdlIGtub3cuCi0gICAgY3VycmVudF90cmFrX3RpbWVfc2NhbGVfID0gdGltZV9zY2FsZTsKLSAgICBjdXJyZW50X3RyYWtfZHVyYXRpb25fID0gdHJhY2tfZHVyYXRpb247Ci0gIH0KLSAgYXRvbV9vZmZzZXRfICs9IGF0b21fZGF0YV9zaXplOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTaGVsbE1QNFBhcnNlcjo6UGFyc2VNUDRfbXA0YSh1aW50NjQgYXRvbV9kYXRhX3NpemUsIHVpbnQ4KiBtcDRhKSB7Ci0gIERDSEVDS19MRShrRGVzaXJlZEJ5dGVzX21wNGEgKyAxNiwga0F0b21Eb3dubG9hZCk7Ci0gIC8vIHdlIG9ubHkgbmVlZCB0aGUgZmlyc3QgdHdvIGJ5dGVzIG9mIHRoZSBoZWFkZXIsIHdoaWNoIGRldGFpbHMgdGhlIHZlcnNpb24KLSAgLy8gbnVtYmVyIG9mIHRoaXMgYXRvbSwgd2hpY2ggdGVsbHMgdXMgdGhlIHNpemUgb2YgdGhlIHJlc3Qgb2YgdGhlIGhlYWRlciwKLSAgLy8gdGVsbGluZyB1cyBob3cgbXVjaCB3ZSBzaG91bGQgc2tpcCB0byBnZXQgdG8gdGhlIGV4dGVuc2lvbiBjb250ZW50cy4KLSAgaWYgKGF0b21fZGF0YV9zaXplIDwga0Rlc2lyZWRCeXRlc19tcDRhKSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCBiYXNlOjpTdHJpbmdQcmludGYoImJhZCBzaXplICUiIFBSSWQ2NCAiIG9uIG1wNGEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0b21fZGF0YV9zaXplKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgdWludDE2IG1wNGFfdmVyc2lvbiA9IGVuZGlhbl91dGlsOjpsb2FkX3VpbnQxNl9iaWdfZW5kaWFuKG1wNGEpOwotICBzd2l0Y2ggKG1wNGFfdmVyc2lvbikgewotICAgIGNhc2UgMDoKLSAgICAgIGF0b21fb2Zmc2V0XyArPSBrVG90YWxTaXplX21wNGFfdjA7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGNhc2UgMToKLSAgICAgIGF0b21fb2Zmc2V0XyArPSBrVG90YWxTaXplX21wNGFfdjE7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGNhc2UgMjoKLSAgICAgIGF0b21fb2Zmc2V0XyArPSBrVG90YWxTaXplX21wNGFfdjI7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAvLyB1bmtub3duIG1wNGEgYXRvbSB2ZXJzaW9uLCBwYXJzZSBmYWlsdXJlCi0gICAgICBETE9HKEVSUk9SKSA8PCBiYXNlOjpTdHJpbmdQcmludGYoInBhcnNlZCBiYWQgbXA0YSB2ZXJzaW9uICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcDRhX3ZlcnNpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLS8vIHBhcnRpYWwgbGF5b3V0IG9mIG12aGQgaGVhZGVyIGlzOgotLy8gb2Zmc2V0IHwgbmFtZSAgICAgICAgICAgICAgfCBzaXplIGluIGJ5dGVzCi0vLyAtLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tCi0vLyAwICAgICAgfCB2ZXJzaW9uICAgICAgICAgICB8IDEgKGlnbm9yZWQpCi0vLyAxICAgICAgfCBmbGFncyAgICAgICAgICAgICB8IDMgKGlnbm9yZWQpCi0vLyA0ICAgICAgfCBjcmVhdGlvbiB0aW1lICAgICB8IDQgKGlnbm9yZWQpCi0vLyA4ICAgICAgfCBtb2RpZmljYXRpb24gdGltZSB8IDQgKGlnbm9yZWQpCi0vLyAxMiAgICAgfCB0aW1lIHNjYWxlICAgICAgICB8IDQKLS8vIDE2ICAgICB8IGR1cmF0aW9uOiAgICAgICAgIHwgNAotLy8KLWJvb2wgU2hlbGxNUDRQYXJzZXI6OlBhcnNlTVA0X212aGQodWludDY0IGF0b21fZGF0YV9zaXplLCB1aW50OCogbXZoZCkgewotICBEQ0hFQ0tfTEUoa0Rlc2lyZWRCeXRlc19tdmhkICsgMTYsIGtBdG9tRG93bmxvYWQpOwotICAvLyBpdCBzaG91bGQgYmUgYXQgbGVhc3QgbG9uZyBlbm91Z2ggZm9yIHVzIHRvIGV4dHJhY3QgdGhlIHBhcnRzIHdlIHdhbnQKLSAgaWYgKGF0b21fZGF0YV9zaXplIDwga0Rlc2lyZWRCeXRlc19tdmhkKSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCBiYXNlOjpTdHJpbmdQcmludGYoImJhZCBzaXplICUiIFBSSWQ2NCAiIG9uIG12aGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0b21fZGF0YV9zaXplKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgdWludDMyIHRpbWVfc2NhbGVfaHogPSBlbmRpYW5fdXRpbDo6bG9hZF91aW50MzJfYmlnX2VuZGlhbihtdmhkICsgMTIpOwotICBpZiAodGltZV9zY2FsZV9oeiA9PSAwKSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCAiZ290IDAgdGltZSBzY2FsZSBmb3IgbXZoZCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIGR1cmF0aW9uIGlzIGluIHVuaXRzIG9mIHRoZSB0aW1lIHNjYWxlIHdlIGp1c3QgZXh0cmFjdGVkCi0gIHVpbnQ2NCBkdXJhdGlvbl90aWNrcyA9IGVuZGlhbl91dGlsOjpsb2FkX3VpbnQzMl9iaWdfZW5kaWFuKG12aGQgKyAxNik7Ci0gIC8vIGNhbGN1bGF0ZSBhY3R1YWwgZHVyYXRpb24gZnJvbSB0aGF0IGFuZCB0aGUgdGltZSBzY2FsZQotICBkdXJhdGlvbl8gPSBUaWNrc1RvVGltZShkdXJhdGlvbl90aWNrcywgdGltZV9zY2FsZV9oeik7Ci0gIC8vIGFkdmFuY2UgcmVhZCBwb3NpdGlvbgotICBhdG9tX29mZnNldF8gKz0gYXRvbV9kYXRhX3NpemU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1iYXNlOjpUaW1lRGVsdGEgU2hlbGxNUDRQYXJzZXI6OlRpY2tzVG9UaW1lKHVpbnQ2NCB0aWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHRpbWVfc2NhbGVfaHopIHsKLSAgRENIRUNLX05FKHRpbWVfc2NhbGVfaHosIDApOwotCi0gIGlmICh0aW1lX3NjYWxlX2h6ID09IDApIHsKLSAgICByZXR1cm4gYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcygwKTsKLSAgfQotICByZXR1cm4gYmFzZTo6VGltZURlbHRhOjpGcm9tTWljcm9zZWNvbmRzKCh0aWNrcyAqIDEwMDAwMDBVTEwpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX3NjYWxlX2h6KTsKLX0KLQotdWludDY0IFNoZWxsTVA0UGFyc2VyOjpUaW1lVG9UaWNrcyhiYXNlOjpUaW1lRGVsdGEgdGltZSwgdWludDMyIHRpbWVfc2NhbGVfaHopIHsKLSAgRENIRUNLX05FKHRpbWVfc2NhbGVfaHosIDApOwotCi0gIGlmICh0aW1lX3NjYWxlX2h6ID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gKHRpbWUuSW5NaWNyb3NlY29uZHMoKSAqIHRpbWVfc2NhbGVfaHopIC8gMTAwMDAwMFVMTDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9tcDRfcGFyc2VyLmggYi9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9tcDRfcGFyc2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmN2VhNjguLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfbXA0X3BhcnNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfRklMVEVSU19TSEVMTF9NUDRfUEFSU0VSX0hfCi0jZGVmaW5lIE1FRElBX0ZJTFRFUlNfU0hFTExfTVA0X1BBUlNFUl9IXwotCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9zaGVsbF9hdmNfcGFyc2VyLmgiCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9zaGVsbF9tcDRfbWFwLmgiCi0KLS8vIElmIHRydWUgdGhlIHBhcnNlciB3aWxsIHNhdmUgZXZlcnkgYXRvbSBpdCBwYXJzZXMgdG8gZGlzay4gTm90ZSB0aGF0IHNpbmNlCi0vLyB0aGUgcGFyc2VyIGlzIGxhenkgYW5kIG9ubHkgcGFyc2VzIHdoYXQgaXQgbmVlZHMgdG8gYnVpbGQgdGhlIG1hcCBhbmQga25vdwotLy8gdGhlIHJlcXVpcmVkIHZpZGVvIGNvbmZpZyBpbmZvcm1hdGlvbiBpdCBpcyBsaWtlbHkgdG8gbm90IGJ1aWxkIGEgY29tcGxldGUKLS8vIGF0b20gdGFibGUgZm9yIGEgZ2l2ZW4gZmlsZS4KLSNkZWZpbmUgU0hFTExfTVA0X1BBUlNFUl9EVU1QX0FUT01TIDAKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gSG93IG1hbnkgYnl0ZXMgdG8gZG93bmxvYWQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGF0b20/IFNob3VsZCBiZSBsYXJnZQotLy8gZW5vdWdoIHRoYXQgd2UgY2FuIGV4dHJhY3QgYWxsIHRoZSBkYXRhIHdlIG5lZWQgZnJvbSB0aGUgYXRvbSB3aXRob3V0Ci0vLyBzZWNvbmQgZG93bmxvYWQgKHR5cGljYWxseSksIGJ1dCBubyBsYXJnZXIuIFRoaXMgaXMgY3VycmVudGx5IHNldCBhdCAxNgotLy8gYnl0ZXMgZm9yIHRoZSA4IGJ5dGUgaGVhZGVyICsgb3B0aW9uYWwgOCBieXRlIHNpemUgZXh0ZW5zaW9uIHBsdXMgMjAgYnl0ZXMKLS8vIGZvciB0aGUgbmVlZGVkIHZhbHVlcyB3aXRoaW4gYW4gbXZoZCBoZWFkZXIuIFdlIGxlYXZlIHRoaXMgaXMgdGhlIGhlYWRlciBzbwotLy8gdGhhdCBTaGVsbE1QNE1hcCBjYW4gcmUtdXNlLAotc3RhdGljIGNvbnN0IGludCBrQXRvbURvd25sb2FkID0gMzY7Ci0KLS8vIG1wNCBhdG9tIGZvdXJDQyBjb2RlcyBhcyBiaWctZW5kaWFuIHVuc2lnbmVkIGludHMKLXN0YXRpYyBjb25zdCB1aW50MzIga0F0b21UeXBlX2F2YzEgPSAweDYxNzY2MzMxOyAgLy8gc2tpcCBpbiB0byBzdWJhdG9tCi1zdGF0aWMgY29uc3QgdWludDMyIGtBdG9tVHlwZV9hdmNDID0gMHg2MTc2NjM0MzsgIC8vIGRvd25sb2FkIGFuZCBwYXJzZQotc3RhdGljIGNvbnN0IHVpbnQzMiBrQXRvbVR5cGVfY282NCA9IDB4NjM2ZjM2MzQ7ICAvLyBjYWNoZSBpbiB0YWJsZQotc3RhdGljIGNvbnN0IHVpbnQzMiBrQXRvbVR5cGVfY3R0cyA9IDB4NjM3NDc0NzM7ICAvLyBjYWNoZSBpbiB0YWJsZQotc3RhdGljIGNvbnN0IHVpbnQzMiBrQXRvbVR5cGVfZGluZiA9IDB4NjQ2OTZlNjY7ICAvLyBza2lwIHdob2xlIGF0b20KLXN0YXRpYyBjb25zdCB1aW50MzIga0F0b21UeXBlX2RyZWYgPSAweDY0NzI2NTY2OyAgLy8gc2tpcCB3aG9sZSBhdG9tCi1zdGF0aWMgY29uc3QgdWludDMyIGtBdG9tVHlwZV9lc2RzID0gMHg2NTczNjQ3MzsgIC8vIGRvd25sb2FkIGFuZCBwYXJzZQotc3RhdGljIGNvbnN0IHVpbnQzMiBrQXRvbVR5cGVfZnR5cCA9IDB4NjY3NDc5NzA7ICAvLyB0b3Agb2YgdGhlIGZpbGUgb25seQotc3RhdGljIGNvbnN0IHVpbnQzMiBrQXRvbVR5cGVfaGRsciA9IDB4Njg2NDZjNzI7ICAvLyBwYXJzZSBmaXJzdCAxMiBieXRlcwotc3RhdGljIGNvbnN0IHVpbnQzMiBrQXRvbVR5cGVfbWRoZCA9IDB4NmQ2NDY4NjQ7ICAvLyBwYXJzZSBmaXJzdCAyMCBieXRlcwotc3RhdGljIGNvbnN0IHVpbnQzMiBrQXRvbVR5cGVfbWRpYSA9IDB4NmQ2NDY5NjE7ICAvLyBjb250YWluZXIgYXRvbSwgbm8tb3AKLXN0YXRpYyBjb25zdCB1aW50MzIga0F0b21UeXBlX21pbmYgPSAweDZkNjk2ZTY2OyAgLy8gY29udGFpbmVyIGF0b20sIG5vLW9wCi1zdGF0aWMgY29uc3QgdWludDMyIGtBdG9tVHlwZV9tb292ID0gMHg2ZDZmNmY3NjsgIC8vIGNvbnRhaW5lciBhdG9tLCBuby1vcAotc3RhdGljIGNvbnN0IHVpbnQzMiBrQXRvbVR5cGVfbXA0YSA9IDB4NmQ3MDM0NjE7ICAvLyBwYXJzZSBmaXJzdCAxMCBieXRlcwotc3RhdGljIGNvbnN0IHVpbnQzMiBrQXRvbVR5cGVfbXZoZCA9IDB4NmQ3NjY4NjQ7ICAvLyBwYXJzZSBmaXJzdCAyMCBieXRlcwotc3RhdGljIGNvbnN0IHVpbnQzMiBrQXRvbVR5cGVfc21oZCA9IDB4NzM2ZDY4NjI7ICAvLyBza2lwIHdob2xlIGF0b20KLXN0YXRpYyBjb25zdCB1aW50MzIga0F0b21UeXBlX3N0YmwgPSAweDczNzQ2MjZjOyAgLy8gY29udGFpbmVyIGF0b20sIG5vLW9wCi1zdGF0aWMgY29uc3QgdWludDMyIGtBdG9tVHlwZV9zdGNvID0gMHg3Mzc0NjM2ZjsgIC8vIGNhY2hlIGluIHRhYmxlCi1zdGF0aWMgY29uc3QgdWludDMyIGtBdG9tVHlwZV9zdHRzID0gMHg3Mzc0NzQ3MzsgIC8vIGNhY2hlIGluIHRhYmxlCi1zdGF0aWMgY29uc3QgdWludDMyIGtBdG9tVHlwZV9zdHNjID0gMHg3Mzc0NzM2MzsgIC8vIGNhY2hlIGluIHRhYmxlCi1zdGF0aWMgY29uc3QgdWludDMyIGtBdG9tVHlwZV9zdHNkID0gMHg3Mzc0NzM2NDsgIC8vIHNraXAgaW4gdG8gc3ViYXRvbQotc3RhdGljIGNvbnN0IHVpbnQzMiBrQXRvbVR5cGVfc3RzcyA9IDB4NzM3NDczNzM7ICAvLyBjYWNoZSBpbiB0YWJsZQotc3RhdGljIGNvbnN0IHVpbnQzMiBrQXRvbVR5cGVfc3RzeiA9IDB4NzM3NDczN2E7ICAvLyBjYWNoZSBpbiB0YWJsZQotc3RhdGljIGNvbnN0IHVpbnQzMiBrQXRvbVR5cGVfdHJhayA9IDB4NzQ3MjYxNmI7ICAvLyBjb250YWluZXIgYXRvbSwgbm8tb3AKLXN0YXRpYyBjb25zdCB1aW50MzIga0F0b21UeXBlX3RraGQgPSAweDc0NmI2ODY0OyAgLy8gc2tpcCB3aG9sZSBhdG9tCi1zdGF0aWMgY29uc3QgdWludDMyIGtBdG9tVHlwZV92bWhkID0gMHg3NjZkNjg2NDsgIC8vIHNraXAgd2hvbGUgYXRvbQotLy8gVE9ETzogbXA0diEhCi0KLWNsYXNzIFNoZWxsTVA0UGFyc2VyIDogcHVibGljIFNoZWxsQVZDUGFyc2VyIHsKLSBwdWJsaWM6Ci0gIC8vIEF0dGVtcHRzIHRvIG1ha2Ugc2Vuc2Ugb2YgdGhlIHByb3ZpZGVkIGJ5dGVzIG9mIHRoZSB0b3Agb2YgYSBmaWxlIGFzIGFuCi0gIC8vIGZsdiwgYW5kIGlmIGl0IGRvZXMgbWFrZSBzZW5zZSByZXR1cm5zIFBJUEVMSU5FX09LIGFuZCB8KnBhcnNlcnwgY29udGFpbnMgYQotICAvLyBTaGVsbE1QNFBhcnNlciBpbml0aWFsaXplZCB3aXRoIHNvbWUgYmFzaWMgc3RhdGUuICBJZiBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UKLSAgLy8gdGhpcyByZXR1cm5zIGFuIGVycm9yIHN0YXR1cyBhbmQgfCpwYXJzZXJ8IGNvbnRhaW5zIE5VTEwuCi0gIHN0YXRpYyBQaXBlbGluZVN0YXR1cyBDb25zdHJ1Y3Qoc2NvcGVkX3JlZnB0cjxTaGVsbERhdGFTb3VyY2VSZWFkZXI+IHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogY29uc3RydWN0aW9uX2hlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPFNoZWxsUGFyc2VyPiogcGFyc2VyKTsKLSAgU2hlbGxNUDRQYXJzZXIoc2NvcGVkX3JlZnB0cjxTaGVsbERhdGFTb3VyY2VSZWFkZXI+IHJlYWRlciwKLSAgICAgICAgICAgICAgICAgdWludDMyIGZ0eXBfYXRvbV9zaXplKTsKLSAgdmlydHVhbCB+U2hlbGxNUDRQYXJzZXIoKTsKLQotICAvLyA9PT0gU2hlbGxQYXJzZXIgaW1wbGVtZW50YXRpb24KLSAgdmlydHVhbCBib29sIFBhcnNlQ29uZmlnKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgc2NvcGVkX3JlZnB0cjxTaGVsbEFVPiBHZXROZXh0QVUoRGVtdXhlclN0cmVhbTo6VHlwZSB0eXBlKSBPVkVSUklERTsKLSAgdmlydHVhbCBib29sIFNlZWtUbyhiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wKSBPVkVSUklERTsKLQotIHByaXZhdGU6Ci0gIGJvb2wgUGFyc2VOZXh0QXRvbSgpOwotICBib29sIFBhcnNlTVA0X2VzZHModWludDY0IGF0b21fZGF0YV9zaXplKTsKLSAgYm9vbCBQYXJzZU1QNF9oZGxyKHVpbnQ2NCBhdG9tX2RhdGFfc2l6ZSwgdWludDgqIGhkbHIpOwotICBib29sIFBhcnNlTVA0X21kaGQodWludDY0IGF0b21fZGF0YV9zaXplLCB1aW50OCogbWRoZCk7Ci0gIGJvb2wgUGFyc2VNUDRfbXA0YSh1aW50NjQgYXRvbV9kYXRhX3NpemUsIHVpbnQ4KiBtcDRhKTsKLSAgYm9vbCBQYXJzZU1QNF9tdmhkKHVpbnQ2NCBhdG9tX2RhdGFfc2l6ZSwgdWludDgqIG12aGQpOwotICBiYXNlOjpUaW1lRGVsdGEgVGlja3NUb1RpbWUodWludDY0IHRpY2tzLCB1aW50MzIgdGltZV9zY2FsZV9oeik7Ci0gIHVpbnQ2NCBUaW1lVG9UaWNrcyhiYXNlOjpUaW1lRGVsdGEgdGltZSwgdWludDMyIHRpbWVfc2NhbGVfaHopOwotCi0jaWYgU0hFTExfTVA0X1BBUlNFUl9EVU1QX0FUT01TCi0gIHZvaWQgRHVtcEF0b21Ub0Rpc2sodWludDMyIGZvdXJfY2MsIHVpbnQzMiBhdG9tX3NpemUsIHVpbnQ2NCBhdG9tX29mZnNldCk7Ci0jZW5kaWYKLQotICB1aW50NjQgYXRvbV9vZmZzZXRfOwotICBib29sIGN1cnJlbnRfdHJha19pc192aWRlb187Ci0gIGJvb2wgY3VycmVudF90cmFrX2lzX2F1ZGlvXzsKLSAgdWludDMyIGN1cnJlbnRfdHJha190aW1lX3NjYWxlXzsKLSAgYmFzZTo6VGltZURlbHRhIGN1cnJlbnRfdHJha19kdXJhdGlvbl87Ci0gIHVpbnQzMiB2aWRlb190aW1lX3NjYWxlX2h6XzsKLSAgYmFzZTo6VGltZURlbHRhIG9uZV92aWRlb190aWNrXzsKLSAgdWludDMyIGF1ZGlvX3RpbWVfc2NhbGVfaHpfOwotICBiYXNlOjpUaW1lRGVsdGEgYXVkaW9fdHJhY2tfZHVyYXRpb25fOwotICBiYXNlOjpUaW1lRGVsdGEgdmlkZW9fdHJhY2tfZHVyYXRpb25fOwotICBzY29wZWRfcmVmcHRyPFNoZWxsTVA0TWFwPiBhdWRpb19tYXBfOwotICBzY29wZWRfcmVmcHRyPFNoZWxsTVA0TWFwPiB2aWRlb19tYXBfOwotICB1aW50MzIgYXVkaW9fc2FtcGxlXzsKLSAgdWludDMyIHZpZGVvX3NhbXBsZV87Ci0gIC8vIGZvciBrZWVwaW5nIGJ1ZmZlcnMgY29udGludW91cyBhY3Jvc3MgdGltZSBzY2FsZXMKLSAgdWludDY0IGZpcnN0X2F1ZGlvX2hvbGVfdGlja3NfOwotICBiYXNlOjpUaW1lRGVsdGEgZmlyc3RfYXVkaW9faG9sZV87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9GSUxURVJTX1NIRUxMX01QNF9QQVJTRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX3BhcnNlci5jYyBiL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX3BhcnNlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFkNDk1OC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9wYXJzZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9zaGVsbF9wYXJzZXIuaCIKLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvc2hlbGxfZmx2X3BhcnNlci5oIgotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvc2hlbGxfbXA0X3BhcnNlci5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyA9PT09IFNoZWxsUGFyc2VyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vLyBob3cgbWFueSBieXRlcyB0byBkb3dubG9hZCBvZiB0aGUgZmlsZSB0byBkZXRlcm1pbmUgdHlwZT8KLWNvbnN0IGludCBTaGVsbFBhcnNlcjo6a0luaXRpYWxIZWFkZXJTaXplID0gOTsKLQotLy8gc3RhdGljCi1QaXBlbGluZVN0YXR1cyBTaGVsbFBhcnNlcjo6Q29uc3RydWN0KAotICAgIHNjb3BlZF9yZWZwdHI8U2hlbGxEYXRhU291cmNlUmVhZGVyPiByZWFkZXIsCi0gICAgc2NvcGVkX3JlZnB0cjxTaGVsbFBhcnNlcj4qIHBhcnNlcikgewotICBEQ0hFQ0socGFyc2VyKTsKLSAgKnBhcnNlciA9IE5VTEw7Ci0KLSAgLy8gZG93bmxvYWQgZmlyc3QgMTYgYnl0ZXMgb2Ygc3RyZWFtIHRvIGRldGVybWluZSBmaWxlIHR5cGUgYW5kIGV4dHJhY3QgYmFzaWMKLSAgLy8gY29udGFpbmVyLXNwZWNpZmljIHN0cmVhbSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCi0gIHVpbnQ4IGhlYWRlcltrSW5pdGlhbEhlYWRlclNpemVdOwotICBpbnQgYnl0ZXNfcmVhZCA9IHJlYWRlci0+QmxvY2tpbmdSZWFkKDAsIGtJbml0aWFsSGVhZGVyU2l6ZSwgaGVhZGVyKTsKLSAgaWYgKGJ5dGVzX3JlYWQgIT0ga0luaXRpYWxIZWFkZXJTaXplKSB7Ci0gICAgcmV0dXJuIERFTVVYRVJfRVJST1JfQ09VTERfTk9UX1BBUlNFOwotICB9Ci0KLSAgLy8gYXR0ZW1wdCB0byBjb25zdHJ1Y3QgbXA0IHBhcnNlciBmcm9tIHRoaXMgaGVhZGVyCi0gIFBpcGVsaW5lU3RhdHVzIHN0YXR1cyA9IFNoZWxsTVA0UGFyc2VyOjpDb25zdHJ1Y3QocmVhZGVyLCBoZWFkZXIsIHBhcnNlcik7Ci0gIGlmIChzdGF0dXMgPT0gUElQRUxJTkVfT0spIHsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0gIC8vIG9rLCBhdHRlbXB0IEZMVgotICByZXR1cm4gU2hlbGxGTFZQYXJzZXI6OkNvbnN0cnVjdChyZWFkZXIsIGhlYWRlciwgcGFyc2VyKTsKLX0KLQotU2hlbGxQYXJzZXI6OlNoZWxsUGFyc2VyKHNjb3BlZF9yZWZwdHI8U2hlbGxEYXRhU291cmNlUmVhZGVyPiByZWFkZXIpCi0gICAgOiByZWFkZXJfKHJlYWRlciksIGR1cmF0aW9uXyhrSW5maW5pdGVEdXJhdGlvbigpKSwgYml0c19wZXJfc2Vjb25kXygwKSB7fQotCi1TaGVsbFBhcnNlcjo6flNoZWxsUGFyc2VyKCkge30KLQotYm9vbCBTaGVsbFBhcnNlcjo6SXNDb25maWdDb21wbGV0ZSgpIHsKLSAgcmV0dXJuICh2aWRlb19jb25maWdfLklzVmFsaWRDb25maWcoKSkgJiYgKGF1ZGlvX2NvbmZpZ18uSXNWYWxpZENvbmZpZygpKSAmJgotICAgICAgICAgKGR1cmF0aW9uXyAhPSBrSW5maW5pdGVEdXJhdGlvbigpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9wYXJzZXIuaCBiL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX3BhcnNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDM0OWIwLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX3BhcnNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9GSUxURVJTX1NIRUxMX1BBUlNFUl9IXwotI2RlZmluZSBNRURJQV9GSUxURVJTX1NIRUxMX1BBUlNFUl9IXwotCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZW11eGVyX3N0cmVhbS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvcGlwZWxpbmUuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3NoZWxsX2J1ZmZlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaGVsbF9kYXRhX3NvdXJjZV9yZWFkZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXJfY29uZmlnLmgiCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9zaGVsbF9hdS5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBhYnN0cmFjdCBiYXNlIGNsYXNzIHRvIGRlZmluZSBhIHN0cmVhbSBwYXJzZXIgaW50ZXJmYWNlIHVzZWQgYnkgU2hlbGxEZW11eGVyLgotY2xhc3MgU2hlbGxQYXJzZXIgOiBwdWJsaWMgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8U2hlbGxQYXJzZXI+IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBjb25zdCBpbnQga0luaXRpYWxIZWFkZXJTaXplOwotICAvLyBEZXRlcm1pbmUgc3RyZWFtIHR5cGUsIGNvbnN0cnVjdCBhcHByb3ByaWF0ZSBwYXJzZXIgb2JqZWN0LCBhbmQgcmV0dXJucwotICAvLyBQSVBFTElORV9PSyBvbiBzdWNjZXNzIG9yIGVycm9yIGNvZGUuCi0gIHN0YXRpYyBQaXBlbGluZVN0YXR1cyBDb25zdHJ1Y3Qoc2NvcGVkX3JlZnB0cjxTaGVsbERhdGFTb3VyY2VSZWFkZXI+IHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPFNoZWxsUGFyc2VyPiogcGFyc2VyKTsKLSAgZXhwbGljaXQgU2hlbGxQYXJzZXIoc2NvcGVkX3JlZnB0cjxTaGVsbERhdGFTb3VyY2VSZWFkZXI+IHJlYWRlcik7Ci0KLSAgLy8gU2VlayB0aHJvdWdoIHRoZSBmaWxlIGxvb2tpbmcgZm9yIGF1ZGlvIGFuZCB2aWRlbyBjb25maWd1cmF0aW9uIGluZm8sCi0gIC8vIHNhdmluZyBhcyBtdWNoIGNvbmZpZyBzdGF0ZSBhcyBpcyBwb3NzaWJsZS4gU2hvdWxkIHRyeSB0byBiZSBmYXN0IGJ1dCB0aGlzCi0gIC8vIG1heSByZXN1bHQgaW4gdGhlIGRvd25sb2FkaW5nIG9mIE1CIG9mIGRhdGEuIFJldHVybnMgZmFsc2Ugb24gZmF0YWwgZXJyb3IuCi0gIHZpcnR1YWwgYm9vbCBQYXJzZUNvbmZpZygpID0gMDsKLQotICAvLyBSZXR1cm5zIGEgcG9wdWxhdGVkLCB2YWxpZCBBVSBpbmRpY2F0aW5nIHRoZSBuZWVkZWQgaW5mb3JtYXRpb24gZm9yCi0gIC8vIGRvd25sb2RpbmcgYW5kIGRlY29kaW5nIHRoZSBuZXh0IGFjY2VzcyB1bml0IGluIHRoZSBzdHJlYW0sIG9yIE5VTEwgb24KLSAgLy8gZmF0YWwgZXJyb3IuIE9uIHN1Y2Nlc3MgdGhpcyBhZHZhbmNlcyB0aGUgcmVzcGVjdGl2ZSBhdWRpbyBvciB2aWRlbyBjdXJzb3IKLSAgLy8gdG8gdGhlIG5leHQgQVUuCi0gIHZpcnR1YWwgc2NvcGVkX3JlZnB0cjxTaGVsbEFVPiBHZXROZXh0QVUoRGVtdXhlclN0cmVhbTo6VHlwZSB0eXBlKSA9IDA7Ci0gIC8vIFdyaXRlIHRoZSBhcHByb3ByaWF0ZSBwcmVwZW5kIGhlYWRlciBmb3IgdGhlIHN1cHBsaWVkIGF1IGludG8gdGhlIHN1cHBsaWVkCi0gIC8vIGJ1ZmZlci4gUmV0dXJuIGZhbHNlIG9uIGVycm9yLgotICB2aXJ0dWFsIGJvb2wgUHJlcGVuZChzY29wZWRfcmVmcHRyPFNoZWxsQVU+IGF1LAotICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGJ1ZmZlcikgPSAwOwotICAvLyBBZHZhbmNlIGludGVybmFsIHN0YXRlIHRvIHByb3ZpZGVkIHRpbWVzdGFtcC4gUmV0dXJuIGZhbHNlIG9uIGVycm9yLgotICB2aXJ0dWFsIGJvb2wgU2Vla1RvKGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXApID0gMDsKLQotICAvLyA9PT09PT09IGNvbmZpZyBzdGF0ZSBtZXRob2RzLCB2YWx1ZXMgc2hvdWxkIGJlIHNldCBieSBQYXJzZUNvbmZpZygpCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiBhbGwgb2YgdGhlIHJlcXVpcmVkIHZhcmlhYmxlcyBkZWZpbmVkIGJlbG93IGFyZSB2YWxpZC4KLSAgLy8gQml0c1BlclNlY29uZCgpIGlzIG9wdGlvbmFsLgotICB2aXJ0dWFsIGJvb2wgSXNDb25maWdDb21wbGV0ZSgpOwotICAvLyB0aW1lLWR1cmF0aW9uIG9mIGZpbGUsIG1heSByZXR1cm4ga0luZmluaXRlRHVyYXRpb24oKSBpZiB1bmtub3duCi0gIHZpcnR1YWwgYmFzZTo6VGltZURlbHRhIER1cmF0aW9uKCkgeyByZXR1cm4gZHVyYXRpb25fOyB9Ci0gIC8vIGJpdHMgcGVyIHNlY29uZCBvZiBtZWRpYSwgaWYga25vd24sIG90aGVyd2lzZSAwCi0gIHZpcnR1YWwgdWludDMyIEJpdHNQZXJTZWNvbmQoKSB7IHJldHVybiBiaXRzX3Blcl9zZWNvbmRfOyB9Ci0gIHZpcnR1YWwgY29uc3QgQXVkaW9EZWNvZGVyQ29uZmlnJiBBdWRpb0NvbmZpZygpIHsgcmV0dXJuIGF1ZGlvX2NvbmZpZ187IH0KLSAgdmlydHVhbCBjb25zdCBWaWRlb0RlY29kZXJDb25maWcmIFZpZGVvQ29uZmlnKCkgeyByZXR1cm4gdmlkZW9fY29uZmlnXzsgfQotCi0gcHJvdGVjdGVkOgotICAvLyBvbmx5IGFsbG93IFJlZkNvdW50ZWRUaHJlYWRTYWZlIHRvIGRlbGV0ZSB1cwotICBmcmllbmQgY2xhc3MgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8U2hlbGxQYXJzZXI+OwotICB2aXJ0dWFsIH5TaGVsbFBhcnNlcigpOwotICBzY29wZWRfcmVmcHRyPFNoZWxsRGF0YVNvdXJjZVJlYWRlcj4gcmVhZGVyXzsKLSAgQXVkaW9EZWNvZGVyQ29uZmlnIGF1ZGlvX2NvbmZpZ187Ci0gIFZpZGVvRGVjb2RlckNvbmZpZyB2aWRlb19jb25maWdfOwotICBiYXNlOjpUaW1lRGVsdGEgZHVyYXRpb25fOwotICB1aW50MzIgYml0c19wZXJfc2Vjb25kXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0ZJTFRFUlNfU0hFTExfUEFSU0VSX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9yYXdfYXVkaW9fZGVjb2Rlcl9saW51eC5jYyBiL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX3Jhd19hdWRpb19kZWNvZGVyX2xpbnV4LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDc4NWM1Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX3Jhd19hdWRpb19kZWNvZGVyX2xpbnV4LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL3NoZWxsX3Jhd19hdWRpb19kZWNvZGVyX2xpbnV4LmgiCi0KLSNpbmNsdWRlIDxtZW1vcnkuaD4KLQotI2luY2x1ZGUgPGxpc3Q+Ci0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb190aW1lc3RhbXBfaGVscGVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlcl9wb29sLmgiCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9zaGVsbF9mZm1wZWcuaCIKLSNpbmNsdWRlICJtZWRpYS9tcDQvYWFjLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0IHNpemVfdCBrU2FtcGxlU2l6ZUluQnl0ZXMgPSBzaXplb2YoZmxvYXQpOwotCi1zdHJ1Y3QgUXVldWVkQXVkaW9CdWZmZXIgewotICAvLyAgQXVkaW9EZWNvZGVyOjpTdGF0dXMgc3RhdHVzOyAgLy8gc3RhdHVzIGlzIHVzZWQgdG8gcmVwcmVzZW50IGRlY29kZSBlcnJvcnMKLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBidWZmZXI7Ci19OwotCi1ib29sIElzRW5kT2ZTdHJlYW0oaW50IHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICBpbnQgZGVjb2RlZF9zaXplLAotICAgICAgICAgICAgICAgICAgIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gYnVmZmVyKSB7Ci0gIHJldHVybiByZXN1bHQgPT0gMCAmJiBkZWNvZGVkX3NpemUgPT0gMCAmJiBidWZmZXItPklzRW5kT2ZTdHJlYW0oKTsKLX0KLQotdm9pZCBSZXNhbXBsZVRvSW50ZXJsZWF2ZWRGbG9hdChpbnQgc291cmNlX3NhbXBsZV9mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsX2xheW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlc19wZXJfY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqKiBpbnB1dF9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiBvdXRwdXRfYnVmZmVyKSB7Ci0gIEFWQXVkaW9SZXNhbXBsZUNvbnRleHQqIGNvbnRleHQgPSBhdnJlc2FtcGxlX2FsbG9jX2NvbnRleHQoKTsKLSAgRENIRUNLKGNvbnRleHQpOwotCi0gIGF2X29wdF9zZXRfaW50KGNvbnRleHQsICJpbl9jaGFubmVsX2xheW91dCIsIGNoYW5uZWxfbGF5b3V0LCAwKTsKLSAgYXZfb3B0X3NldF9pbnQoY29udGV4dCwgIm91dF9jaGFubmVsX2xheW91dCIsIGNoYW5uZWxfbGF5b3V0LCAwKTsKLSAgYXZfb3B0X3NldF9pbnQoY29udGV4dCwgImluX3NhbXBsZV9yYXRlIiwgc2FtcGxlX3JhdGUsIDApOwotICBhdl9vcHRfc2V0X2ludChjb250ZXh0LCAib3V0X3NhbXBsZV9yYXRlIiwgc2FtcGxlX3JhdGUsIDApOwotICBhdl9vcHRfc2V0X2ludChjb250ZXh0LCAiaW5fc2FtcGxlX2ZtdCIsIHNvdXJjZV9zYW1wbGVfZm9ybWF0LCAwKTsKLSAgYXZfb3B0X3NldF9pbnQoY29udGV4dCwgIm91dF9zYW1wbGVfZm10IiwgQVZfU0FNUExFX0ZNVF9GTFQsIDApOwotICBhdl9vcHRfc2V0X2ludChjb250ZXh0LCAiaW50ZXJuYWxfc2FtcGxlX2ZtdCIsIHNvdXJjZV9zYW1wbGVfZm9ybWF0LCAwKTsKLQotICBpbnQgcmVzdWx0ID0gYXZyZXNhbXBsZV9vcGVuKGNvbnRleHQpOwotICBEQ0hFQ0soIXJlc3VsdCk7Ci0KLSAgaW50IHNhbXBsZXNfcmVzYW1wbGVkID0KLSAgICAgIGF2cmVzYW1wbGVfY29udmVydChjb250ZXh0LCAmb3V0cHV0X2J1ZmZlciwgMTAyNCwgc2FtcGxlc19wZXJfY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9idWZmZXIsIDAsIHNhbXBsZXNfcGVyX2NoYW5uZWwpOwotICBEQ0hFQ0tfRVEoc2FtcGxlc19yZXNhbXBsZWQsIHNhbXBsZXNfcGVyX2NoYW5uZWwpOwotCi0gIGF2cmVzYW1wbGVfY2xvc2UoY29udGV4dCk7Ci0gIGF2X2ZyZWUoY29udGV4dCk7Ci19Ci0KLWNsYXNzIFNoZWxsUmF3QXVkaW9EZWNvZGVyTGludXggOiBwdWJsaWMgU2hlbGxSYXdBdWRpb0RlY29kZXIgewotIHB1YmxpYzoKLSAgU2hlbGxSYXdBdWRpb0RlY29kZXJMaW51eCgpOwotICB+U2hlbGxSYXdBdWRpb0RlY29kZXJMaW51eCgpIE9WRVJSSURFOwotCi0gIGludCBHZXRCeXRlc1BlclNhbXBsZSgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIGtTYW1wbGVTaXplSW5CeXRlczsgfQotICAvLyBXaGVuIHRoZSBpbnB1dCBidWZmZXIgaXMgbm90IE5VTEwsIGl0IGNhbiBiZSBhIG5vcm1hbCBidWZmZXIgb3IgYW4gRU9TCi0gIC8vIGJ1ZmZlci4gSW4gdGhpcyBjYXNlIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgZGVjb2RlZCBidWZmZXIgaWYgdGhlcmUKLSAgLy8gaXMgYW55LgotICAvLyBUaGUgaW5wdXQgYnVmZmVyIGNhbiBiZSBOVUxMLCBpbiB0aGlzIGNhc2UgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEKLSAgLy8gcXVldWVkIGJ1ZmZlciBpZiB0aGVyZSBpcyBhbnkgb3IgcmV0dXJuIE5VTEwgaWYgdGhlcmUgaXMgbm8gcXVldWVkIGJ1ZmZlci4KLSAgdm9pZCBEZWNvZGUoY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgYnVmZmVyLAotICAgICAgICAgICAgICBjb25zdCBEZWNvZGVDQiYgZGVjb2Rlcl9jYikgT1ZFUlJJREU7Ci0gIGJvb2wgRmx1c2goKSBPVkVSUklERTsKLSAgYm9vbCBVcGRhdGVDb25maWcoY29uc3QgQXVkaW9EZWNvZGVyQ29uZmlnJiBjb25maWcpIE9WRVJSSURFOwotCi0gcHJpdmF0ZToKLSAgdm9pZCBSZWxlYXNlUmVzb3VyY2UoKTsKLSAgdm9pZCBSZXNldFRpbWVzdGFtcFN0YXRlKCk7Ci0gIHZvaWQgUnVuRGVjb2RlTG9vcChjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2tpcF9lb3NfYXBwZW5kKTsKLQotICBEZWNvZGVyQnVmZmVyUG9vbCBkZWNvZGVyX2J1ZmZlcl9wb29sXzsKLQotICBBVkNvZGVjQ29udGV4dCogY29kZWNfY29udGV4dF87Ci0gIEFWRnJhbWUqIGF2X2ZyYW1lXzsKLQotICAvLyBEZWNvZGVkIGF1ZGlvIGZvcm1hdC4KLSAgaW50IGJpdHNfcGVyX2NoYW5uZWxfOwotICBDaGFubmVsTGF5b3V0IGNoYW5uZWxfbGF5b3V0XzsKLSAgaW50IHNhbXBsZXNfcGVyX3NlY29uZF87Ci0KLSAgLy8gVXNlZCBmb3IgY29tcHV0aW5nIG91dHB1dCB0aW1lc3RhbXBzLgotICBzY29wZWRfcHRyPEF1ZGlvVGltZXN0YW1wSGVscGVyPiBvdXRwdXRfdGltZXN0YW1wX2hlbHBlcl87Ci0gIGludCBieXRlc19wZXJfZnJhbWVfOwotICBiYXNlOjpUaW1lRGVsdGEgbGFzdF9pbnB1dF90aW1lc3RhbXBfOwotCi0gIC8vIFNpbmNlIG11bHRpcGxlIGZyYW1lcyBtYXkgYmUgZGVjb2RlZCBmcm9tIHRoZSBzYW1lIHBhY2tldCB3ZSBuZWVkIHRvCi0gIC8vIHF1ZXVlIHRoZW0gdXAgYW5kIGhhbmQgdGhlbSBvdXQgYXMgd2UgcmVjZWl2ZSBSZWFkKCkgY2FsbHMuCi0gIHN0ZDo6bGlzdDxRdWV1ZWRBdWRpb0J1ZmZlcj4gcXVldWVkX2F1ZGlvXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU2hlbGxSYXdBdWRpb0RlY29kZXJMaW51eCk7Ci19OwotCi1TaGVsbFJhd0F1ZGlvRGVjb2RlckxpbnV4OjpTaGVsbFJhd0F1ZGlvRGVjb2RlckxpbnV4KCkKLSAgICA6IGRlY29kZXJfYnVmZmVyX3Bvb2xfKEdldEJ5dGVzUGVyU2FtcGxlKCkpLAotICAgICAgY29kZWNfY29udGV4dF8oTlVMTCksCi0gICAgICBhdl9mcmFtZV8oTlVMTCksCi0gICAgICBiaXRzX3Blcl9jaGFubmVsXygwKSwKLSAgICAgIGNoYW5uZWxfbGF5b3V0XyhDSEFOTkVMX0xBWU9VVF9OT05FKSwKLSAgICAgIHNhbXBsZXNfcGVyX3NlY29uZF8oMCksCi0gICAgICBieXRlc19wZXJfZnJhbWVfKDApLAotICAgICAgbGFzdF9pbnB1dF90aW1lc3RhbXBfKGtOb1RpbWVzdGFtcCgpKSB7Ci0gIEVuc3VyZUZmbXBlZ0luaXRpYWxpemVkKCk7Ci19Ci0KLVNoZWxsUmF3QXVkaW9EZWNvZGVyTGludXg6On5TaGVsbFJhd0F1ZGlvRGVjb2RlckxpbnV4KCkgewotICBSZWxlYXNlUmVzb3VyY2UoKTsKLX0KLQotdm9pZCBTaGVsbFJhd0F1ZGlvRGVjb2RlckxpbnV4OjpEZWNvZGUoCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgYnVmZmVyLAotICAgIGNvbnN0IERlY29kZUNCJiBkZWNvZGVyX2NiKSB7Ci0gIGlmIChidWZmZXIgJiYgIWJ1ZmZlci0+SXNFbmRPZlN0cmVhbSgpKSB7Ci0gICAgaWYgKGxhc3RfaW5wdXRfdGltZXN0YW1wXyA9PSBrTm9UaW1lc3RhbXAoKSkgewotICAgICAgbGFzdF9pbnB1dF90aW1lc3RhbXBfID0gYnVmZmVyLT5HZXRUaW1lc3RhbXAoKTsKLSAgICB9IGVsc2UgaWYgKGJ1ZmZlci0+R2V0VGltZXN0YW1wKCkgIT0ga05vVGltZXN0YW1wKCkpIHsKLSAgICAgIERDSEVDS19HRShidWZmZXItPkdldFRpbWVzdGFtcCgpLlRvSW50ZXJuYWxWYWx1ZSgpLAotICAgICAgICAgICAgICAgIGxhc3RfaW5wdXRfdGltZXN0YW1wXy5Ub0ludGVybmFsVmFsdWUoKSk7Ci0gICAgICBsYXN0X2lucHV0X3RpbWVzdGFtcF8gPSBidWZmZXItPkdldFRpbWVzdGFtcCgpOwotICAgIH0KLSAgfQotCi0gIGlmIChidWZmZXIgJiYgcXVldWVkX2F1ZGlvXy5lbXB0eSgpKQotICAgIFJ1bkRlY29kZUxvb3AoYnVmZmVyLCBmYWxzZSk7Ci0KLSAgaWYgKHF1ZXVlZF9hdWRpb18uZW1wdHkoKSkgewotICAgIGRlY29kZXJfY2IuUnVuKE5FRURfTU9SRV9EQVRBLCBOVUxMKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiByZXN1bHQgPSBxdWV1ZWRfYXVkaW9fLmZyb250KCkuYnVmZmVyOwotICBxdWV1ZWRfYXVkaW9fLnBvcF9mcm9udCgpOwotICBkZWNvZGVyX2NiLlJ1bihCVUZGRVJfREVDT0RFRCwgcmVzdWx0KTsKLX0KLQotYm9vbCBTaGVsbFJhd0F1ZGlvRGVjb2RlckxpbnV4OjpGbHVzaCgpIHsKLSAgYXZjb2RlY19mbHVzaF9idWZmZXJzKGNvZGVjX2NvbnRleHRfKTsKLSAgUmVzZXRUaW1lc3RhbXBTdGF0ZSgpOwotICBxdWV1ZWRfYXVkaW9fLmNsZWFyKCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU2hlbGxSYXdBdWRpb0RlY29kZXJMaW51eDo6VXBkYXRlQ29uZmlnKGNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYgY29uZmlnKSB7Ci0gIGlmICghY29uZmlnLklzVmFsaWRDb25maWcoKSkgewotICAgIERMT0coRVJST1IpIDw8ICJJbnZhbGlkIGF1ZGlvIHN0cmVhbSAtIgotICAgICAgICAgICAgICAgIDw8ICIgY29kZWM6ICIgPDwgY29uZmlnLmNvZGVjKCkKLSAgICAgICAgICAgICAgICA8PCAiIGNoYW5uZWwgbGF5b3V0OiAiIDw8IGNvbmZpZy5jaGFubmVsX2xheW91dCgpCi0gICAgICAgICAgICAgICAgPDwgIiBiaXRzIHBlciBjaGFubmVsOiAiIDw8IGNvbmZpZy5iaXRzX3Blcl9jaGFubmVsKCkKLSAgICAgICAgICAgICAgICA8PCAiIHNhbXBsZXMgcGVyIHNlY29uZDogIiA8PCBjb25maWcuc2FtcGxlc19wZXJfc2Vjb25kKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGNvZGVjX2NvbnRleHRfICYmIChiaXRzX3Blcl9jaGFubmVsXyAhPSBjb25maWcuYml0c19wZXJfY2hhbm5lbCgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9sYXlvdXRfICE9IGNvbmZpZy5jaGFubmVsX2xheW91dCgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc19wZXJfc2Vjb25kXyAhPSBjb25maWcuc2FtcGxlc19wZXJfc2Vjb25kKCkpKSB7Ci0gICAgRFZMT0coMSkgPDwgIlVuc3VwcG9ydGVkIGNvbmZpZyBjaGFuZ2UgOiI7Ci0gICAgRFZMT0coMSkgPDwgIlx0Yml0c19wZXJfY2hhbm5lbCA6ICIgPDwgYml0c19wZXJfY2hhbm5lbF8gPDwgIiAtPiAiCi0gICAgICAgICAgICAgPDwgY29uZmlnLmJpdHNfcGVyX2NoYW5uZWwoKTsKLSAgICBEVkxPRygxKSA8PCAiXHRjaGFubmVsX2xheW91dCA6ICIgPDwgY2hhbm5lbF9sYXlvdXRfIDw8ICIgLT4gIgotICAgICAgICAgICAgIDw8IGNvbmZpZy5jaGFubmVsX2xheW91dCgpOwotICAgIERWTE9HKDEpIDw8ICJcdHNhbXBsZV9yYXRlIDogIiA8PCBzYW1wbGVzX3Blcl9zZWNvbmRfIDw8ICIgLT4gIgotICAgICAgICAgICAgIDw8IGNvbmZpZy5zYW1wbGVzX3Blcl9zZWNvbmQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBSZWxlYXNlUmVzb3VyY2UoKTsKLQotICBjb2RlY19jb250ZXh0XyA9IGF2Y29kZWNfYWxsb2NfY29udGV4dDMoTlVMTCk7Ci0gIERDSEVDSyhjb2RlY19jb250ZXh0Xyk7Ci0gIGNvZGVjX2NvbnRleHRfLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICBjb2RlY19jb250ZXh0Xy0+Y29kZWNfaWQgPSBDT0RFQ19JRF9BQUM7Ci0gIC8vIHJlcXVlc3Rfc2FtcGxlX2ZtdCBpcyBzZXQgYnkgdXMsIGJ1dCBzYW1wbGVfZm10IGlzIHNldCBieSB0aGUgZGVjb2Rlci4KLSAgY29kZWNfY29udGV4dF8tPnJlcXVlc3Rfc2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfRkxUOyAgLy8gaW50ZXJsZWF2ZWQgZmxvYXQKLQotICBjb2RlY19jb250ZXh0Xy0+Y2hhbm5lbHMgPQotICAgICAgQ2hhbm5lbExheW91dFRvQ2hhbm5lbENvdW50KGNvbmZpZy5jaGFubmVsX2xheW91dCgpKTsKLSAgY29kZWNfY29udGV4dF8tPnNhbXBsZV9yYXRlID0gY29uZmlnLnNhbXBsZXNfcGVyX3NlY29uZCgpOwotCi0gIGlmIChjb25maWcuZXh0cmFfZGF0YSgpKSB7Ci0gICAgY29kZWNfY29udGV4dF8tPmV4dHJhZGF0YV9zaXplID0gY29uZmlnLmV4dHJhX2RhdGFfc2l6ZSgpOwotICAgIGNvZGVjX2NvbnRleHRfLT5leHRyYWRhdGEgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigKLSAgICAgICAgYXZfbWFsbG9jKGNvbmZpZy5leHRyYV9kYXRhX3NpemUoKSArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpKTsKLSAgICBtZW1jcHkoY29kZWNfY29udGV4dF8tPmV4dHJhZGF0YSwgY29uZmlnLmV4dHJhX2RhdGEoKSwKLSAgICAgICAgICAgY29uZmlnLmV4dHJhX2RhdGFfc2l6ZSgpKTsKLSAgICBtZW1zZXQoY29kZWNfY29udGV4dF8tPmV4dHJhZGF0YSArIGNvbmZpZy5leHRyYV9kYXRhX3NpemUoKSwgJ1wwJywKLSAgICAgICAgICAgRkZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7Ci0gIH0gZWxzZSB7Ci0gICAgY29kZWNfY29udGV4dF8tPmV4dHJhZGF0YSA9IE5VTEw7Ci0gICAgY29kZWNfY29udGV4dF8tPmV4dHJhZGF0YV9zaXplID0gMDsKLSAgfQotCi0gIEFWQ29kZWMqIGNvZGVjID0gYXZjb2RlY19maW5kX2RlY29kZXIoY29kZWNfY29udGV4dF8tPmNvZGVjX2lkKTsKLSAgRENIRUNLKGNvZGVjKTsKLQotICBpbnQgcnYgPSBhdmNvZGVjX29wZW4yKGNvZGVjX2NvbnRleHRfLCBjb2RlYywgTlVMTCk7Ci0gIERDSEVDS19HRShydiwgMCk7Ci0gIGlmIChydiA8IDApIHsKLSAgICBETE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIG9wZW4gY29kZWMsIHJlc3VsdCA9ICIgPDwgcnY7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gRW5zdXJlIGF2Y29kZWNfb3BlbjIoKSByZXNwZWN0ZWQgb3VyIGZvcm1hdCByZXF1ZXN0LgotICBpZiAoY29kZWNfY29udGV4dF8tPnNhbXBsZV9mbXQgIT0gY29kZWNfY29udGV4dF8tPnJlcXVlc3Rfc2FtcGxlX2ZtdCkgewotICAgIERMT0coSU5GTykgPDwgIlVuYWJsZSB0byBjb25maWd1cmUgYSBzdXBwb3J0ZWQgc2FtcGxlIGZvcm1hdCwiCi0gICAgICAgICAgICAgICA8PCAiIHNhbXBsZV9mbXQgPSAiIDw8IGNvZGVjX2NvbnRleHRfLT5zYW1wbGVfZm10Ci0gICAgICAgICAgICAgICA8PCAiIGluc3RlYWQgb2YgIiA8PCBjb2RlY19jb250ZXh0Xy0+cmVxdWVzdF9zYW1wbGVfZm10Ci0gICAgICAgICAgICAgICA8PCAiLiBVc2UgbGliYXZyZXNhbXBsZSB0byByZXNhbXBsZSB0aGUgZGVjb2RlZCByZXN1bHQgdG8gRkxUIjsKLSAgICBETE9HKElORk8pIDw8ICJTdXBwb3J0ZWQgZm9ybWF0czoiOwotICAgIGNvbnN0IEFWU2FtcGxlRm9ybWF0KiBmbXQ7Ci0gICAgZm9yIChmbXQgPSBjb2RlY19jb250ZXh0Xy0+Y29kZWMtPnNhbXBsZV9mbXRzOyAqZm10ICE9IC0xOyArK2ZtdCkgewotICAgICAgRExPRyhJTkZPKSA8PCAiICAiIDw8ICpmbXQgPDwgIiAoIiA8PCBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKCpmbXQpIDw8ICIpIjsKLSAgICB9Ci0gIH0KLQotICBhdl9mcmFtZV8gPSBhdmNvZGVjX2FsbG9jX2ZyYW1lKCk7Ci0gIERDSEVDSyhhdl9mcmFtZV8pOwotCi0gIGJpdHNfcGVyX2NoYW5uZWxfID0gY29uZmlnLmJpdHNfcGVyX2NoYW5uZWwoKTsKLSAgY2hhbm5lbF9sYXlvdXRfID0gY29uZmlnLmNoYW5uZWxfbGF5b3V0KCk7Ci0gIHNhbXBsZXNfcGVyX3NlY29uZF8gPSBjb25maWcuc2FtcGxlc19wZXJfc2Vjb25kKCk7Ci0gIG91dHB1dF90aW1lc3RhbXBfaGVscGVyXy5yZXNldChuZXcgQXVkaW9UaW1lc3RhbXBIZWxwZXIoCi0gICAgICBrU2FtcGxlU2l6ZUluQnl0ZXMsIGNvbmZpZy5zYW1wbGVzX3Blcl9zZWNvbmQoKSkpOwotCi0gIFJlc2V0VGltZXN0YW1wU3RhdGUoKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBTaGVsbFJhd0F1ZGlvRGVjb2RlckxpbnV4OjpSZWxlYXNlUmVzb3VyY2UoKSB7Ci0gIGlmIChjb2RlY19jb250ZXh0XykgewotICAgIGF2X2ZyZWUoY29kZWNfY29udGV4dF8tPmV4dHJhZGF0YSk7Ci0gICAgYXZjb2RlY19jbG9zZShjb2RlY19jb250ZXh0Xyk7Ci0gICAgYXZfZnJlZShjb2RlY19jb250ZXh0Xyk7Ci0gICAgY29kZWNfY29udGV4dF8gPSBOVUxMOwotICB9Ci0gIGlmIChhdl9mcmFtZV8pIHsKLSAgICBhdl9mcmVlKGF2X2ZyYW1lXyk7Ci0gICAgYXZfZnJhbWVfID0gTlVMTDsKLSAgfQotfQotCi12b2lkIFNoZWxsUmF3QXVkaW9EZWNvZGVyTGludXg6OlJlc2V0VGltZXN0YW1wU3RhdGUoKSB7Ci0gIG91dHB1dF90aW1lc3RhbXBfaGVscGVyXy0+U2V0QmFzZVRpbWVzdGFtcChrTm9UaW1lc3RhbXAoKSk7Ci0gIGxhc3RfaW5wdXRfdGltZXN0YW1wXyA9IGtOb1RpbWVzdGFtcCgpOwotfQotCi12b2lkIFNoZWxsUmF3QXVkaW9EZWNvZGVyTGludXg6OlJ1bkRlY29kZUxvb3AoCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgaW5wdXQsCi0gICAgYm9vbCBza2lwX2Vvc19hcHBlbmQpIHsKLSAgQVZQYWNrZXQgcGFja2V0OwotICBhdl9pbml0X3BhY2tldCgmcGFja2V0KTsKLSAgcGFja2V0LmRhdGEgPSBpbnB1dC0+R2V0V3JpdGFibGVEYXRhKCk7Ci0gIHBhY2tldC5zaXplID0gaW5wdXQtPkdldERhdGFTaXplKCk7Ci0KLSAgZG8gewotICAgIGF2Y29kZWNfZ2V0X2ZyYW1lX2RlZmF1bHRzKGF2X2ZyYW1lXyk7Ci0gICAgaW50IGZyYW1lX2RlY29kZWQgPSAwOwotICAgIGludCByZXN1bHQgPSBhdmNvZGVjX2RlY29kZV9hdWRpbzQoY29kZWNfY29udGV4dF8sIGF2X2ZyYW1lXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFtZV9kZWNvZGVkLCAmcGFja2V0KTsKLSAgICBEQ0hFQ0tfR0UocmVzdWx0LCAwKTsKLQotICAgIC8vIFVwZGF0ZSBwYWNrZXQgc2l6ZSBhbmQgZGF0YSBwb2ludGVyIGluIGNhc2Ugd2UgbmVlZCB0byBjYWxsIHRoZSBkZWNvZGVyCi0gICAgLy8gd2l0aCB0aGUgcmVtYWluaW5nIGJ5dGVzIGZyb20gdGhpcyBwYWNrZXQuCi0gICAgcGFja2V0LnNpemUgLT0gcmVzdWx0OwotICAgIHBhY2tldC5kYXRhICs9IHJlc3VsdDsKLQotICAgIGlmIChvdXRwdXRfdGltZXN0YW1wX2hlbHBlcl8tPmJhc2VfdGltZXN0YW1wKCkgPT0ga05vVGltZXN0YW1wKCkgJiYKLSAgICAgICAgIWlucHV0LT5Jc0VuZE9mU3RyZWFtKCkpIHsKLSAgICAgIERDSEVDS19ORShpbnB1dC0+R2V0VGltZXN0YW1wKCkuVG9JbnRlcm5hbFZhbHVlKCksCi0gICAgICAgICAgICAgICAga05vVGltZXN0YW1wKCkuVG9JbnRlcm5hbFZhbHVlKCkpOwotICAgICAgb3V0cHV0X3RpbWVzdGFtcF9oZWxwZXJfLT5TZXRCYXNlVGltZXN0YW1wKGlucHV0LT5HZXRUaW1lc3RhbXAoKSk7Ci0gICAgfQotCi0gICAgY29uc3QgdWludDgqIGRlY29kZWRfYXVkaW9fZGF0YSA9IE5VTEw7Ci0gICAgaW50IGRlY29kZWRfYXVkaW9fc2l6ZSA9IDA7Ci0gICAgaWYgKGZyYW1lX2RlY29kZWQpIHsKLSAgICAgIGRlY29kZWRfYXVkaW9fZGF0YSA9IGF2X2ZyYW1lXy0+ZGF0YVswXTsKLSAgICAgIGRlY29kZWRfYXVkaW9fc2l6ZSA9IGF2X3NhbXBsZXNfZ2V0X2J1ZmZlcl9zaXplKAotICAgICAgICAgIE5VTEwsIGNvZGVjX2NvbnRleHRfLT5jaGFubmVscywgYXZfZnJhbWVfLT5uYl9zYW1wbGVzLAotICAgICAgICAgIGNvZGVjX2NvbnRleHRfLT5zYW1wbGVfZm10LCAxKTsKLSAgICB9Ci0KLSAgICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IG91dHB1dDsKLQotICAgIGlmIChkZWNvZGVkX2F1ZGlvX3NpemUgPiAwKSB7Ci0gICAgICAvLyBDb3B5IHRoZSBhdWRpbyBzYW1wbGVzIGludG8gYW4gb3V0cHV0IGJ1ZmZlci4KLSAgICAgIGludCBidWZmZXJfc2l6ZSA9IGtTYW1wbGVTaXplSW5CeXRlcyAqIG1wNDo6QUFDOjprRnJhbWVzUGVyQWNjZXNzVW5pdCAqCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19jb250ZXh0Xy0+Y2hhbm5lbHM7Ci0gICAgICBvdXRwdXQgPSBkZWNvZGVyX2J1ZmZlcl9wb29sXy5BbGxvY2F0ZShidWZmZXJfc2l6ZSk7Ci0gICAgICBEQ0hFQ0sob3V0cHV0KTsKLSAgICAgIC8vIEludGVybGVhdmUgdGhlIHBsYW5hciBzYW1wbGVzIHRvIGNvbmZvcm0gdG8gdGhlIGdlbmVyYWwgZGVjb2RlcgotICAgICAgLy8gcmVxdWlyZW1lbnQuIFRoaXMgc2hvdWxkIGV2ZW50dWFsbHkgYmUgbGlmdGVkLgotICAgICAgUmVzYW1wbGVUb0ludGVybGVhdmVkRmxvYXQoCi0gICAgICAgICAgY29kZWNfY29udGV4dF8tPnNhbXBsZV9mbXQsIGNvZGVjX2NvbnRleHRfLT5jaGFubmVsX2xheW91dCwKLSAgICAgICAgICBzYW1wbGVzX3Blcl9zZWNvbmRfLCBtcDQ6OkFBQzo6a0ZyYW1lc1BlckFjY2Vzc1VuaXQsCi0gICAgICAgICAgYXZfZnJhbWVfLT5leHRlbmRlZF9kYXRhLAotICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihvdXRwdXQtPkdldFdyaXRhYmxlRGF0YSgpKSk7Ci0gICAgICBvdXRwdXQtPlNldFRpbWVzdGFtcChvdXRwdXRfdGltZXN0YW1wX2hlbHBlcl8tPkdldFRpbWVzdGFtcCgpKTsKLSAgICAgIG91dHB1dC0+U2V0RHVyYXRpb24oCi0gICAgICAgICAgb3V0cHV0X3RpbWVzdGFtcF9oZWxwZXJfLT5HZXREdXJhdGlvbihkZWNvZGVkX2F1ZGlvX3NpemUpKTsKLSAgICAgIG91dHB1dF90aW1lc3RhbXBfaGVscGVyXy0+QWRkQnl0ZXMoZGVjb2RlZF9hdWRpb19zaXplIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfY29udGV4dF8tPmNoYW5uZWxzKTsKLSAgICB9IGVsc2UgaWYgKElzRW5kT2ZTdHJlYW0ocmVzdWx0LCBkZWNvZGVkX2F1ZGlvX3NpemUsIGlucHV0KSAmJgotICAgICAgICAgICAgICAgIXNraXBfZW9zX2FwcGVuZCkgewotICAgICAgRENIRUNLX0VRKHBhY2tldC5zaXplLCAwKTsKLSAgICAgIC8vIENyZWF0ZSBhbiBlbmQgb2Ygc3RyZWFtIG91dHB1dCBidWZmZXIuCi0gICAgICBvdXRwdXQgPSBEZWNvZGVyQnVmZmVyOjpDcmVhdGVFT1NCdWZmZXIoa05vVGltZXN0YW1wKCkpOwotICAgIH0KLQotICAgIGlmIChvdXRwdXQpIHsKLSAgICAgIFF1ZXVlZEF1ZGlvQnVmZmVyIHF1ZXVlX2VudHJ5ID0ge291dHB1dH07Ci0gICAgICBxdWV1ZWRfYXVkaW9fLnB1c2hfYmFjayhxdWV1ZV9lbnRyeSk7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogdXBkYXRlIHN0YXRpc3RpY3MuCi0gIH0gd2hpbGUgKHBhY2tldC5zaXplID4gMCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1zY29wZWRfcHRyPFNoZWxsUmF3QXVkaW9EZWNvZGVyPiBDcmVhdGVTaGVsbFJhd0F1ZGlvRGVjb2RlckxpbnV4KAotICAgIGNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYgY29uZmlnKSB7Ci0gIHNjb3BlZF9wdHI8U2hlbGxSYXdBdWRpb0RlY29kZXI+IGRlY29kZXIobmV3IFNoZWxsUmF3QXVkaW9EZWNvZGVyTGludXgpOwotICBpZiAoIWRlY29kZXItPlVwZGF0ZUNvbmZpZyhjb25maWcpKSB7Ci0gICAgZGVjb2Rlci5yZXNldCgpOwotICB9Ci0gIHJldHVybiBkZWNvZGVyLlBhc3MoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9yYXdfYXVkaW9fZGVjb2Rlcl9saW51eC5oIGIvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfcmF3X2F1ZGlvX2RlY29kZXJfbGludXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMzMTRhZC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9yYXdfYXVkaW9fZGVjb2Rlcl9saW51eC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9GSUxURVJTX1NIRUxMX1JBV19BVURJT19ERUNPREVSX0xJTlVYX0hfCi0jZGVmaW5lIE1FRElBX0ZJTFRFUlNfU0hFTExfUkFXX0FVRElPX0RFQ09ERVJfTElOVVhfSF8KLQotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvc2hlbGxfYXVkaW9fZGVjb2Rlcl9pbXBsLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLXNjb3BlZF9wdHI8U2hlbGxSYXdBdWRpb0RlY29kZXI+IENyZWF0ZVNoZWxsUmF3QXVkaW9EZWNvZGVyTGludXgoCi0gICAgY29uc3QgQXVkaW9EZWNvZGVyQ29uZmlnJiBjb25maWcpOwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9GSUxURVJTX1NIRUxMX1JBV19BVURJT19ERUNPREVSX0xJTlVYX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9yYXdfYXVkaW9fZGVjb2Rlcl9zdHViLmNjIGIvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfcmF3X2F1ZGlvX2RlY29kZXJfc3R1Yi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIzMWNjMi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9yYXdfYXVkaW9fZGVjb2Rlcl9zdHViLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvc2hlbGxfcmF3X2F1ZGlvX2RlY29kZXJfc3R1Yi5oIgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fZGVjb2Rlcl9jb25maWcuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyX3Bvb2wuaCIKLSNpbmNsdWRlICJtZWRpYS9tcDQvYWFjLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0IHNpemVfdCBrU2FtcGxlU2l6ZUluQnl0ZXMgPSBzaXplb2YoZmxvYXQpOwotCi1jbGFzcyBTaGVsbFJhd0F1ZGlvRGVjb2RlclN0dWIgOiBwdWJsaWMgU2hlbGxSYXdBdWRpb0RlY29kZXIgewotIHB1YmxpYzoKLSAgU2hlbGxSYXdBdWRpb0RlY29kZXJTdHViKCk7Ci0KLSAgaW50IEdldEJ5dGVzUGVyU2FtcGxlKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4ga1NhbXBsZVNpemVJbkJ5dGVzOyB9Ci0gIHZvaWQgRGVjb2RlKGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGJ1ZmZlciwKLSAgICAgICAgICAgICAgY29uc3QgRGVjb2RlQ0ImIGRlY29kZXJfY2IpIE9WRVJSSURFOwotICBib29sIEZsdXNoKCkgT1ZFUlJJREU7Ci0gIGJvb2wgVXBkYXRlQ29uZmlnKGNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYgY29uZmlnKSBPVkVSUklERTsKLQotIHByaXZhdGU6Ci0gIERlY29kZXJCdWZmZXJQb29sIGRlY29kZXJfYnVmZmVyX3Bvb2xfOwotICBzaXplX3QgZGVjb2RlZF9idWZmZXJfc2l6ZV87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNoZWxsUmF3QXVkaW9EZWNvZGVyU3R1Yik7Ci19OwotCi1TaGVsbFJhd0F1ZGlvRGVjb2RlclN0dWI6OlNoZWxsUmF3QXVkaW9EZWNvZGVyU3R1YigpCi0gICAgOiBkZWNvZGVyX2J1ZmZlcl9wb29sXyhHZXRCeXRlc1BlclNhbXBsZSgpKSwgZGVjb2RlZF9idWZmZXJfc2l6ZV8oMCkge30KLQotdm9pZCBTaGVsbFJhd0F1ZGlvRGVjb2RlclN0dWI6OkRlY29kZSgKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBidWZmZXIsCi0gICAgY29uc3QgRGVjb2RlQ0ImIGRlY29kZXJfY2IpIHsKLSAgRENIRUNLX05FKGRlY29kZWRfYnVmZmVyX3NpemVfLCAwKTsKLSAgRENIRUNLKGJ1ZmZlcik7Ci0gIGlmIChidWZmZXItPklzRW5kT2ZTdHJlYW0oKSkgewotICAgIGRlY29kZXJfY2IuUnVuKEJVRkZFUl9ERUNPREVELCBidWZmZXIpOwotICAgIHJldHVybjsKLSAgfQotICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGRlY29kZWRfYnVmZmVyID0KLSAgICAgIGRlY29kZXJfYnVmZmVyX3Bvb2xfLkFsbG9jYXRlKGRlY29kZWRfYnVmZmVyX3NpemVfKTsKLSAgZGVjb2RlZF9idWZmZXItPlNldFRpbWVzdGFtcChidWZmZXItPkdldFRpbWVzdGFtcCgpKTsKLSAgZGVjb2Rlcl9jYi5SdW4oQlVGRkVSX0RFQ09ERUQsIGRlY29kZWRfYnVmZmVyKTsKLX0KLQotYm9vbCBTaGVsbFJhd0F1ZGlvRGVjb2RlclN0dWI6OkZsdXNoKCkgewotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTaGVsbFJhd0F1ZGlvRGVjb2RlclN0dWI6OlVwZGF0ZUNvbmZpZyhjb25zdCBBdWRpb0RlY29kZXJDb25maWcmIGNvbmZpZykgewotICBEQ0hFQ0soY29uZmlnLklzVmFsaWRDb25maWcoKSAmJiBjb25maWcuY29kZWMoKSA9PSBrQ29kZWNBQUMpOwotICBDaGFubmVsTGF5b3V0IGNoYW5uZWxfbGF5b3V0ID0gY29uZmlnLmNoYW5uZWxfbGF5b3V0KCk7Ci0gIGludCBjaGFubmVsX2NvdW50ID0gQ2hhbm5lbExheW91dFRvQ2hhbm5lbENvdW50KGNoYW5uZWxfbGF5b3V0KTsKLSAgaWYgKGNoYW5uZWxfY291bnQgIT0gMSAmJiBjaGFubmVsX2NvdW50ICE9IDIgJiYgY2hhbm5lbF9jb3VudCAhPSA2ICYmCi0gICAgICBjaGFubmVsX2NvdW50ICE9IDgpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZWNvZGVkX2J1ZmZlcl9zaXplXyA9Ci0gICAgICBrU2FtcGxlU2l6ZUluQnl0ZXMgKiBjaGFubmVsX2NvdW50ICogbXA0OjpBQUM6OmtGcmFtZXNQZXJBY2Nlc3NVbml0OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLXNjb3BlZF9wdHI8U2hlbGxSYXdBdWRpb0RlY29kZXI+IENyZWF0ZVNoZWxsUmF3QXVkaW9EZWNvZGVyU3R1YigKLSAgICBjb25zdCBBdWRpb0RlY29kZXJDb25maWcmIGNvbmZpZykgewotICBzY29wZWRfcHRyPFNoZWxsUmF3QXVkaW9EZWNvZGVyPiBkZWNvZGVyKG5ldyBTaGVsbFJhd0F1ZGlvRGVjb2RlclN0dWIpOwotICBpZiAoIWRlY29kZXItPlVwZGF0ZUNvbmZpZyhjb25maWcpKSB7Ci0gICAgZGVjb2Rlci5yZXNldCgpOwotICB9Ci0gIHJldHVybiBkZWNvZGVyLlBhc3MoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9yYXdfYXVkaW9fZGVjb2Rlcl9zdHViLmggYi9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9yYXdfYXVkaW9fZGVjb2Rlcl9zdHViLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NzllMDIuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfcmF3X2F1ZGlvX2RlY29kZXJfc3R1Yi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9GSUxURVJTX1NIRUxMX1JBV19BVURJT19ERUNPREVSX1NUVUJfSF8KLSNkZWZpbmUgTUVESUFfRklMVEVSU19TSEVMTF9SQVdfQVVESU9fREVDT0RFUl9TVFVCX0hfCi0KLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL3NoZWxsX2F1ZGlvX2RlY29kZXJfaW1wbC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1zY29wZWRfcHRyPFNoZWxsUmF3QXVkaW9EZWNvZGVyPiBDcmVhdGVTaGVsbFJhd0F1ZGlvRGVjb2RlclN0dWIoCi0gICAgY29uc3QgQXVkaW9EZWNvZGVyQ29uZmlnJiBjb25maWcpOwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9GSUxURVJTX1NIRUxMX1JBV19BVURJT19ERUNPREVSX1NUVUJfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX3Jhd192aWRlb19kZWNvZGVyX2xpbnV4LmNjIGIvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfcmF3X3ZpZGVvX2RlY29kZXJfbGludXguY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwM2FjNDYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfcmF3X3ZpZGVvX2RlY29kZXJfbGludXguY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvc2hlbGxfcmF3X3ZpZGVvX2RlY29kZXJfbGludXguaCIKLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX3V0aWwuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL3NoZWxsX2ZmbXBlZy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi11c2luZyBiYXNlOjpUaW1lRGVsdGE7Ci10eXBlZGVmIFNoZWxsVmlkZW9EYXRhQWxsb2NhdG9yOjpGcmFtZUJ1ZmZlciBGcmFtZUJ1ZmZlcjsKLXR5cGVkZWYgU2hlbGxWaWRlb0RhdGFBbGxvY2F0b3I6OllWMTJQYXJhbSBZVjEyUGFyYW07Ci0KLW5hbWVzcGFjZSB7Ci0KLS8vIEZGbXBlZyByZXF1aXJlcyBpdHMgZGVjb2RpbmcgYnVmZmVycyB0byBhbGlnbiB3aXRoIHBsYXRmb3JtIGFsaWdubWVudC4gIEl0Ci0vLyBtZW50aW9ucyBpbnNpZGUKLS8vIGh0dHA6Ly9mZm1wZWcub3JnL2RveHlnZW4vdHJ1bmsvc3RydWN0QVZGcmFtZS5odG1sI2FhNTJiZmM2NjA1ZjZhMzA1OWEwYzMyMjZjYzBmNjU2NwotLy8gdGhhdCB0aGUgYWxpZ25tZW50IG9uIG1vc3QgbW9kZXJuIGRlc2t0b3Agc3lzdGVtcyBhcmUgMTYgb3IgMzIuICBXZSB1c2UgNjQgdG8KLS8vIGJlIHNhZmUuCi1jb25zdCBpbnQga1BsYXRmb3JtQWxpZ25tZW50ID0gMzI7Ci0KLXNpemVfdCBBbGlnblVwKHNpemVfdCBzaXplLCBpbnQgYWxpZ25tZW50KSB7Ci0gIERDSEVDS19FUShhbGlnbm1lbnQgJiAoYWxpZ25tZW50IC0gMSksIDApOwotICByZXR1cm4gKHNpemUgKyBhbGlnbm1lbnQgLSAxKSAmIH4oYWxpZ25tZW50IC0gMSk7Ci19Ci0KLXNpemVfdCBHZXRZVjEyU2l6ZUluQnl0ZXMoaW50MzIgd2lkdGgsIGludDMyIGhlaWdodCkgewotICByZXR1cm4gd2lkdGggKiBoZWlnaHQgKiAzIC8gMjsKLX0KLQotVmlkZW9GcmFtZTo6Rm9ybWF0IFBpeGVsRm9ybWF0VG9WaWRlb0Zvcm1hdChQaXhlbEZvcm1hdCBwaXhlbF9mb3JtYXQpIHsKLSAgc3dpdGNoIChwaXhlbF9mb3JtYXQpIHsKLSAgICBjYXNlIFBJWF9GTVRfWVVWNDIwUDoKLSAgICAgIHJldHVybiBWaWRlb0ZyYW1lOjpZVjEyOwotICAgIGNhc2UgUElYX0ZNVF9ZVVZKNDIwUDoKLSAgICAgIHJldHVybiBWaWRlb0ZyYW1lOjpZVjEyOwotICAgIGRlZmF1bHQ6Ci0gICAgICBETE9HKEVSUk9SKSA8PCAiVW5zdXBwb3J0ZWQgUGl4ZWxGb3JtYXQ6ICIgPDwgcGl4ZWxfZm9ybWF0OwotICB9Ci0gIHJldHVybiBWaWRlb0ZyYW1lOjpJTlZBTElEOwotfQotCi1pbnQgVmlkZW9Db2RlY1Byb2ZpbGVUb1Byb2ZpbGVJRChWaWRlb0NvZGVjUHJvZmlsZSBwcm9maWxlKSB7Ci0gIHN3aXRjaCAocHJvZmlsZSkgewotICAgIGNhc2UgSDI2NFBST0ZJTEVfQkFTRUxJTkU6Ci0gICAgICByZXR1cm4gRkZfUFJPRklMRV9IMjY0X0JBU0VMSU5FOwotICAgIGNhc2UgSDI2NFBST0ZJTEVfTUFJTjoKLSAgICAgIHJldHVybiBGRl9QUk9GSUxFX0gyNjRfTUFJTjsKLSAgICBjYXNlIEgyNjRQUk9GSUxFX0VYVEVOREVEOgotICAgICAgcmV0dXJuIEZGX1BST0ZJTEVfSDI2NF9FWFRFTkRFRDsKLSAgICBjYXNlIEgyNjRQUk9GSUxFX0hJR0g6Ci0gICAgICByZXR1cm4gRkZfUFJPRklMRV9IMjY0X0hJR0g7Ci0gICAgY2FzZSBIMjY0UFJPRklMRV9ISUdIMTBQUk9GSUxFOgotICAgICAgcmV0dXJuIEZGX1BST0ZJTEVfSDI2NF9ISUdIXzEwOwotICAgIGNhc2UgSDI2NFBST0ZJTEVfSElHSDQyMlBST0ZJTEU6Ci0gICAgICByZXR1cm4gRkZfUFJPRklMRV9IMjY0X0hJR0hfNDIyOwotICAgIGNhc2UgSDI2NFBST0ZJTEVfSElHSDQ0NFBSRURJQ1RJVkVQUk9GSUxFOgotICAgICAgcmV0dXJuIEZGX1BST0ZJTEVfSDI2NF9ISUdIXzQ0NF9QUkVESUNUSVZFOwotICAgIGRlZmF1bHQ6Ci0gICAgICBETE9HKEVSUk9SKSA8PCAiVW5rbm93biBWaWRlb0NvZGVjUHJvZmlsZTogIiA8PCBwcm9maWxlOwotICB9Ci0gIHJldHVybiBGRl9QUk9GSUxFX1VOS05PV047Ci19Ci0KLVBpeGVsRm9ybWF0IFZpZGVvRm9ybWF0VG9QaXhlbEZvcm1hdChWaWRlb0ZyYW1lOjpGb3JtYXQgdmlkZW9fZm9ybWF0KSB7Ci0gIHN3aXRjaCAodmlkZW9fZm9ybWF0KSB7Ci0gICAgY2FzZSBWaWRlb0ZyYW1lOjpZVjEyOgotICAgICAgcmV0dXJuIFBJWF9GTVRfWVVWNDIwUDsKLSAgICBkZWZhdWx0OgotICAgICAgRExPRyhFUlJPUikgPDwgIlVuc3VwcG9ydGVkIFZpZGVvRnJhbWU6OkZvcm1hdDogIiA8PCB2aWRlb19mb3JtYXQ7Ci0gIH0KLSAgcmV0dXJuIFBJWF9GTVRfTk9ORTsKLX0KLQotdm9pZCBDb3B5Q29sb3JQbGFuZShjb25zdCB1aW50OCogc3JjLAotICAgICAgICAgICAgICAgICAgICBpbnQzMiB3aWR0aF9pbl9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgaW50MzIgcGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgIGludDMyIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgdWludDgqIGRlc3QpIHsKLSAgd2hpbGUgKGhlaWdodCA+IDApIHsKLSAgICBtZW1jcHkoZGVzdCwgc3JjLCB3aWR0aF9pbl9ieXRlcyk7Ci0gICAgc3JjICs9IHBpdGNoOwotICAgIGRlc3QgKz0gd2lkdGhfaW5fYnl0ZXM7Ci0gICAgLS1oZWlnaHQ7Ci0gIH0KLX0KLQotLy8gQ29udmVydCBhIGZyYW1lIGJ1ZmZlciB3aG9zZSBwaXRjaCBtaWdodCBiZSBkaWZmZXJlbnQgdGhhbiBpdHMgd2lkdGggdG8gYQotLy8gZnJhbWUgYnVmZmVyIHdob3NlIHBpdGNoIGlzIHRoZSBzYW1lIGFzIGl0cyB3aWR0aC4gIFRoaXMgaW52b2x2ZXMgbGluZSBieQotLy8gbGluZSBjb3B5IG9mIGFsbCB0aHJlZSBjb2xvciBwbGFuZXMuCi1zY29wZWRfcmVmcHRyPEZyYW1lQnVmZmVyPiBDb252ZXJ0RnJhbWVCdWZmZXIoCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxGcmFtZUJ1ZmZlcj4mIHNyYywKLSAgICBpbnQzMiB3aWR0aCwKLSAgICBpbnQzMiBoZWlnaHQpIHsKLSAgRENIRUNLKHdpZHRoICUgMiA9PSAwKSA8PCAiSW52YWxpZCB3aWR0aCAiIDw8IHdpZHRoOwotICBEQ0hFQ0soaGVpZ2h0ICUgMiA9PSAwKSA8PCAiSW52YWxpZCBoZWlnaHQgIiA8PCBoZWlnaHQ7Ci0KLSAgU2hlbGxWaWRlb0RhdGFBbGxvY2F0b3IqIGFsbG9jYXRvciA9Ci0gICAgICBTaGVsbE1lZGlhUGxhdGZvcm06Okluc3RhbmNlKCktPkdldFZpZGVvRGF0YUFsbG9jYXRvcigpOwotICBEQ0hFQ0soYWxsb2NhdG9yKTsKLSAgc2l6ZV90IHl2MTJfZnJhbWVfc2l6ZSA9IEdldFlWMTJTaXplSW5CeXRlcyh3aWR0aCwgaGVpZ2h0KTsKLSAgc2NvcGVkX3JlZnB0cjxGcmFtZUJ1ZmZlcj4gZGVzdCA9Ci0gICAgICBhbGxvY2F0b3ItPkFsbG9jYXRlRnJhbWVCdWZmZXIoeXYxMl9mcmFtZV9zaXplLCBrUGxhdGZvcm1BbGlnbm1lbnQpOwotCi0gIC8vIEdldCB0aGUgc3JjIHBpdGNoIGFuZCBoZWlnaHQgYXMgd2hhdCB3ZSBkaWQgaW4gR2V0VmlkZW9CdWZmZXIoKS4KLSAgaW50MzIgc3JjX3BpdGNoID0gQWxpZ25VcCh3aWR0aCwga1BsYXRmb3JtQWxpZ25tZW50ICogMik7Ci0gIGludDMyIHNyY19oZWlnaHQgPSBBbGlnblVwKGhlaWdodCwga1BsYXRmb3JtQWxpZ25tZW50ICogMik7Ci0gIERDSEVDS19MRShHZXRZVjEyU2l6ZUluQnl0ZXMoc3JjX3BpdGNoLCBzcmNfaGVpZ2h0KSwgc3JjLT5zaXplKCkpOwotICBEQ0hFQ0tfTEUoR2V0WVYxMlNpemVJbkJ5dGVzKHdpZHRoLCBoZWlnaHQpLCBkZXN0LT5zaXplKCkpOwotCi0gIHVpbnQ4KiBzcmNfZGF0YSA9IHNyYy0+ZGF0YSgpOwotICB1aW50OCogZGVzdF9kYXRhID0gZGVzdC0+ZGF0YSgpOwotICBDb3B5Q29sb3JQbGFuZShzcmNfZGF0YSwgd2lkdGgsIHNyY19waXRjaCwgaGVpZ2h0LCBkZXN0X2RhdGEpOwotICBzcmNfZGF0YSArPSBzcmNfcGl0Y2ggKiBzcmNfaGVpZ2h0OwotICBkZXN0X2RhdGEgKz0gd2lkdGggKiBoZWlnaHQ7Ci0gIENvcHlDb2xvclBsYW5lKHNyY19kYXRhLCB3aWR0aCAvIDIsIHNyY19waXRjaCAvIDIsIGhlaWdodCAvIDIsIGRlc3RfZGF0YSk7Ci0gIHNyY19kYXRhICs9IHNyY19waXRjaCAvIDIgKiBzcmNfaGVpZ2h0IC8gMjsKLSAgZGVzdF9kYXRhICs9IHdpZHRoIC8gMiAqIGhlaWdodCAvIDI7Ci0gIENvcHlDb2xvclBsYW5lKHNyY19kYXRhLCB3aWR0aCAvIDIsIHNyY19waXRjaCAvIDIsIGhlaWdodCAvIDIsIGRlc3RfZGF0YSk7Ci0gIHJldHVybiBkZXN0OwotfQotCi0vLyBUT0RPOiBNYWtlIHRoaXMgZGVjb2RlciBoYW5kbGUgZGVjb2RlciBlcnJvcnMuIE5vdyBpdCBhc3N1bWVzCi0vLyB0aGF0IHRoZSBpbnB1dCBzdHJlYW0gaXMgYWx3YXlzIGNvcnJlY3QuCi1jbGFzcyBTaGVsbFJhd1ZpZGVvRGVjb2RlckxpbnV4IDogcHVibGljIFNoZWxsUmF3VmlkZW9EZWNvZGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFNoZWxsUmF3VmlkZW9EZWNvZGVyTGludXgoU2hlbGxWaWRlb0RhdGFBbGxvY2F0b3IqIGFsbG9jYXRvcik7Ci0gIH5TaGVsbFJhd1ZpZGVvRGVjb2RlckxpbnV4KCk7Ci0KLSAgdmlydHVhbCB2b2lkIERlY29kZShjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjb2RlQ0ImIGRlY29kZV9jYikgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgYm9vbCBGbHVzaCgpIE9WRVJSSURFOwotICB2aXJ0dWFsIGJvb2wgVXBkYXRlQ29uZmlnKGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgY29uZmlnKSBPVkVSUklERTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgUmVsZWFzZVJlc291cmNlKCk7Ci0gIHN0YXRpYyBpbnQgR2V0VmlkZW9CdWZmZXIoQVZDb2RlY0NvbnRleHQqIGNvZGVjX2NvbnRleHQsIEFWRnJhbWUqIGZyYW1lKTsKLSAgc3RhdGljIHZvaWQgUmVsZWFzZVZpZGVvQnVmZmVyKEFWQ29kZWNDb250ZXh0KiwgQVZGcmFtZSogZnJhbWUpOwotCi0gIFNoZWxsVmlkZW9EYXRhQWxsb2NhdG9yKiBhbGxvY2F0b3JfOwotICBBVkNvZGVjQ29udGV4dCogY29kZWNfY29udGV4dF87Ci0gIEFWRnJhbWUqIGF2X2ZyYW1lXzsKLSAgZ2Z4OjpTaXplIG5hdHVyYWxfc2l6ZV87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNoZWxsUmF3VmlkZW9EZWNvZGVyTGludXgpOwotfTsKLQotU2hlbGxSYXdWaWRlb0RlY29kZXJMaW51eDo6U2hlbGxSYXdWaWRlb0RlY29kZXJMaW51eCgKLSAgICBTaGVsbFZpZGVvRGF0YUFsbG9jYXRvciogYWxsb2NhdG9yKQotICAgIDogYWxsb2NhdG9yXyhhbGxvY2F0b3IpLCBjb2RlY19jb250ZXh0XyhOVUxMKSwgYXZfZnJhbWVfKE5VTEwpIHsKLSAgRW5zdXJlRmZtcGVnSW5pdGlhbGl6ZWQoKTsKLX0KLQotU2hlbGxSYXdWaWRlb0RlY29kZXJMaW51eDo6flNoZWxsUmF3VmlkZW9EZWNvZGVyTGludXgoKSB7Ci0gIFJlbGVhc2VSZXNvdXJjZSgpOwotfQotCi12b2lkIFNoZWxsUmF3VmlkZW9EZWNvZGVyTGludXg6OkRlY29kZSgKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBidWZmZXIsCi0gICAgY29uc3QgRGVjb2RlQ0ImIGRlY29kZV9jYikgewotICBEQ0hFQ0soYnVmZmVyKTsKLSAgRENIRUNLKCFkZWNvZGVfY2IuaXNfbnVsbCgpKTsKLQotICBBVlBhY2tldCBwYWNrZXQ7Ci0gIGF2X2luaXRfcGFja2V0KCZwYWNrZXQpOwotICBhdmNvZGVjX2dldF9mcmFtZV9kZWZhdWx0cyhhdl9mcmFtZV8pOwotICBwYWNrZXQuZGF0YSA9IGJ1ZmZlci0+R2V0V3JpdGFibGVEYXRhKCk7Ci0gIHBhY2tldC5zaXplID0gYnVmZmVyLT5HZXREYXRhU2l6ZSgpOwotICBwYWNrZXQucHRzID0gYnVmZmVyLT5HZXRUaW1lc3RhbXAoKS5Jbk1pbGxpc2Vjb25kcygpOwotCi0gIGludCBmcmFtZV9kZWNvZGVkID0gMDsKLSAgaW50IHJlc3VsdCA9Ci0gICAgICBhdmNvZGVjX2RlY29kZV92aWRlbzIoY29kZWNfY29udGV4dF8sIGF2X2ZyYW1lXywgJmZyYW1lX2RlY29kZWQsICZwYWNrZXQpOwotICBEQ0hFQ0tfR0UocmVzdWx0LCAwKTsKLSAgaWYgKGZyYW1lX2RlY29kZWQgPT0gMCkgewotICAgIGRlY29kZV9jYi5SdW4oTkVFRF9NT1JFX0RBVEEsIE5VTEwpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFRPRE8oZmJhcmNoYXJkKTogV29yayBhcm91bmQgZm9yIEZGbXBlZyBodHRwOi8vY3JidWcuY29tLzI3Njc1Ci0gIC8vIFRoZSBkZWNvZGVyIGlzIGluIGEgYmFkIHN0YXRlIGFuZCBub3QgZGVjb2RpbmcgY29ycmVjdGx5LgotICAvLyBDaGVja2luZyBmb3IgTlVMTCBhdm9pZHMgYSBjcmFzaCBpbiBDb3B5UGxhbmUoKS4KLSAgaWYgKCFhdl9mcmFtZV8tPmRhdGFbVmlkZW9GcmFtZTo6a1lQbGFuZV0gfHwKLSAgICAgICFhdl9mcmFtZV8tPmRhdGFbVmlkZW9GcmFtZTo6a1VQbGFuZV0gfHwKLSAgICAgICFhdl9mcmFtZV8tPmRhdGFbVmlkZW9GcmFtZTo6a1ZQbGFuZV0pIHsKLSAgICBETE9HKEVSUk9SKSA8PCAiVmlkZW8gZnJhbWUgd2FzIHByb2R1Y2VkIHlldCBoYXMgaW52YWxpZCBmcmFtZSBkYXRhLiI7Ci0gICAgZGVjb2RlX2NiLlJ1bihGQVRBTF9FUlJPUiwgTlVMTCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKCFhdl9mcmFtZV8tPm9wYXF1ZSkgewotICAgIERMT0coRVJST1IpIDw8ICJWaWRlb0ZyYW1lIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggZnJhbWUgZGF0YSBub3Qgc2V0LiI7Ci0gICAgZGVjb2RlX2NiLlJ1bihGQVRBTF9FUlJPUiwgTlVMTCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc2NvcGVkX3JlZnB0cjxGcmFtZUJ1ZmZlcj4gZnJhbWVfYnVmZmVyID0KLSAgICAgIHN0YXRpY19jYXN0PEZyYW1lQnVmZmVyKj4oYXZfZnJhbWVfLT5vcGFxdWUpOwotICBEQ0hFQ0soZnJhbWVfYnVmZmVyKTsKLQotICBUaW1lRGVsdGEgdGltZXN0YW1wID0gVGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKGF2X2ZyYW1lXy0+cGt0X3B0cyk7Ci0gIC8vIFRPRE86IEN1cnJlbnRseSB0aGUgTGludXggZWdsIGJhY2tlbmQgZG9lc24ndCBzdXBwb3J0IHRleHR1cmUKLSAgLy8gd2l0aCBwaXRjaCBkaWZmZXJlbnQgdGhhbiBpdHMgd2lkdGguICBTbyB3ZSBjcmVhdGUgYSBuZXcgdmlkZW8gZnJhbWUgd2hvc2UKLSAgLy8gdmlzaWJsZSBzaXplIGlzIHRoZSBzYW1lIGFzIGl0cyBjb2RlZCBzaXplIHRvIGVuc3VyZSB0aGF0IHRoZSB1bmRlcmx5aW5nCi0gIC8vIHRleHR1cmUgaGFzIHRoZSBzYW1lIHBpdGNoIGFzIGl0cyB3aWR0aC4gIFRoaXMgbWFrZXMgY29kZSBjb21wbGV4LCB0aG91Z2gKLSAgLy8gaXQgZG9lc24ndCBuZWNlc3NhcnkgbWVhbiB0aGF0IHRoZSBuZXcgY29kZSBpcyBzbG93ZXIgYXMgd2UgaGF2ZSB0byBtYWtlIGEKLSAgLy8gY29weSBhbnl3YXkgdG8gYXZvaWQgdXNpbmcgdGhlIGZyYW1lIGJ1ZmZlciB3aGlsZSBGZm1wZWcgaXMgc3RpbGwgdXNpbmcgaXQuCi0gIC8vIEl0IGlzIHdvcnRoIHJldmlzaXRpbmcgaWYgd2UgYXJlIGdvaW5nIHRvIHJlbGVhc2UgTGludXggYXMgYSBwcm9kdWN0aW9uCi0gIC8vIHBsYXRmb3JtLgotICBZVjEyUGFyYW0gcGFyYW0oYXZfZnJhbWVfLT53aWR0aCwgYXZfZnJhbWVfLT5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICBnZng6OlJlY3QoYXZfZnJhbWVfLT53aWR0aCwgYXZfZnJhbWVfLT5oZWlnaHQpLAotICAgICAgICAgICAgICAgICAgZnJhbWVfYnVmZmVyLT5kYXRhKCkpOwotICAvLyBXZSBoYXZlIHRvIG1ha2UgYSBjb3B5IG9mIHRoZSBmcmFtZSBidWZmZXIgYXMgdGhlIGZyYW1lIGJ1ZmZlciByZXRyaWV2ZWQKLSAgLy8gZnJvbSB8YXZfZnJhbWVfLT5vcGFxdWV8IG1heSBzdGlsbCBiZSB1c2VkIGJ5IEZmbXBlZy4KLSAgc2l6ZV90IHl2MTJfZnJhbWVfc2l6ZSA9Ci0gICAgICBHZXRZVjEyU2l6ZUluQnl0ZXMoYXZfZnJhbWVfLT53aWR0aCwgYXZfZnJhbWVfLT5oZWlnaHQpOwotICBzY29wZWRfcmVmcHRyPEZyYW1lQnVmZmVyPiBjb252ZXJ0ZWRfZnJhbWVfYnVmZmVyID0KLSAgICAgIENvbnZlcnRGcmFtZUJ1ZmZlcihmcmFtZV9idWZmZXIsIGF2X2ZyYW1lXy0+d2lkdGgsIGF2X2ZyYW1lXy0+aGVpZ2h0KTsKLSAgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiBmcmFtZSA9Ci0gICAgICBhbGxvY2F0b3JfLT5DcmVhdGVZVjEyRnJhbWUoY29udmVydGVkX2ZyYW1lX2J1ZmZlciwgcGFyYW0sIHRpbWVzdGFtcCk7Ci0KLSAgZGVjb2RlX2NiLlJ1bihGUkFNRV9ERUNPREVELCBmcmFtZSk7Ci19Ci0KLWJvb2wgU2hlbGxSYXdWaWRlb0RlY29kZXJMaW51eDo6Rmx1c2goKSB7Ci0gIGF2Y29kZWNfZmx1c2hfYnVmZmVycyhjb2RlY19jb250ZXh0Xyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU2hlbGxSYXdWaWRlb0RlY29kZXJMaW51eDo6VXBkYXRlQ29uZmlnKGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgY29uZmlnKSB7Ci0gIFJlbGVhc2VSZXNvdXJjZSgpOwotCi0gIG5hdHVyYWxfc2l6ZV8gPSBjb25maWcubmF0dXJhbF9zaXplKCk7Ci0KLSAgY29kZWNfY29udGV4dF8gPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKE5VTEwpOwotICBEQ0hFQ0soY29kZWNfY29udGV4dF8pOwotICBjb2RlY19jb250ZXh0Xy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgY29kZWNfY29udGV4dF8tPmNvZGVjX2lkID0gQ09ERUNfSURfSDI2NDsKLSAgY29kZWNfY29udGV4dF8tPnByb2ZpbGUgPSBWaWRlb0NvZGVjUHJvZmlsZVRvUHJvZmlsZUlEKGNvbmZpZy5wcm9maWxlKCkpOwotICBjb2RlY19jb250ZXh0Xy0+Y29kZWRfd2lkdGggPSBjb25maWcuY29kZWRfc2l6ZSgpLndpZHRoKCk7Ci0gIGNvZGVjX2NvbnRleHRfLT5jb2RlZF9oZWlnaHQgPSBjb25maWcuY29kZWRfc2l6ZSgpLmhlaWdodCgpOwotICBjb2RlY19jb250ZXh0Xy0+cGl4X2ZtdCA9IFZpZGVvRm9ybWF0VG9QaXhlbEZvcm1hdChjb25maWcuZm9ybWF0KCkpOwotCi0gIGNvZGVjX2NvbnRleHRfLT5lcnJvcl9jb25jZWFsbWVudCA9IEZGX0VDX0dVRVNTX01WUyB8IEZGX0VDX0RFQkxPQ0s7Ci0gIGNvZGVjX2NvbnRleHRfLT50aHJlYWRfY291bnQgPSAyOwotICBjb2RlY19jb250ZXh0Xy0+b3BhcXVlID0gdGhpczsKLSAgY29kZWNfY29udGV4dF8tPmZsYWdzIHw9IENPREVDX0ZMQUdfRU1VX0VER0U7Ci0gIGNvZGVjX2NvbnRleHRfLT5nZXRfYnVmZmVyID0gR2V0VmlkZW9CdWZmZXI7Ci0gIGNvZGVjX2NvbnRleHRfLT5yZWxlYXNlX2J1ZmZlciA9IFJlbGVhc2VWaWRlb0J1ZmZlcjsKLQotICBpZiAoY29uZmlnLmV4dHJhX2RhdGEoKSkgewotICAgIGNvZGVjX2NvbnRleHRfLT5leHRyYWRhdGFfc2l6ZSA9IGNvbmZpZy5leHRyYV9kYXRhX3NpemUoKTsKLSAgICBjb2RlY19jb250ZXh0Xy0+ZXh0cmFkYXRhID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oCi0gICAgICAgIGF2X21hbGxvYyhjb25maWcuZXh0cmFfZGF0YV9zaXplKCkgKyBGRl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKSk7Ci0gICAgbWVtY3B5KGNvZGVjX2NvbnRleHRfLT5leHRyYWRhdGEsIGNvbmZpZy5leHRyYV9kYXRhKCksCi0gICAgICAgICAgIGNvbmZpZy5leHRyYV9kYXRhX3NpemUoKSk7Ci0gICAgbWVtc2V0KGNvZGVjX2NvbnRleHRfLT5leHRyYWRhdGEgKyBjb25maWcuZXh0cmFfZGF0YV9zaXplKCksICdcMCcsCi0gICAgICAgICAgIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwotICB9IGVsc2UgewotICAgIGNvZGVjX2NvbnRleHRfLT5leHRyYWRhdGEgPSBOVUxMOwotICAgIGNvZGVjX2NvbnRleHRfLT5leHRyYWRhdGFfc2l6ZSA9IDA7Ci0gIH0KLQotICBBVkNvZGVjKiBjb2RlYyA9IGF2Y29kZWNfZmluZF9kZWNvZGVyKGNvZGVjX2NvbnRleHRfLT5jb2RlY19pZCk7Ci0gIERDSEVDSyhjb2RlYyk7Ci0gIGludCBydiA9IGF2Y29kZWNfb3BlbjIoY29kZWNfY29udGV4dF8sIGNvZGVjLCBOVUxMKTsKLSAgRENIRUNLX0dFKHJ2LCAwKTsKLSAgaWYgKHJ2IDwgMCkgewotICAgIERMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gb3BlbiBjb2RlYywgcmVzdWx0ID0gIiA8PCBydjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBhdl9mcmFtZV8gPSBhdmNvZGVjX2FsbG9jX2ZyYW1lKCk7Ci0gIERDSEVDSyhhdl9mcmFtZV8pOwotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFNoZWxsUmF3VmlkZW9EZWNvZGVyTGludXg6OlJlbGVhc2VSZXNvdXJjZSgpIHsKLSAgaWYgKGNvZGVjX2NvbnRleHRfKSB7Ci0gICAgYXZfZnJlZShjb2RlY19jb250ZXh0Xy0+ZXh0cmFkYXRhKTsKLSAgICBhdmNvZGVjX2Nsb3NlKGNvZGVjX2NvbnRleHRfKTsKLSAgICBhdl9mcmVlKGNvZGVjX2NvbnRleHRfKTsKLSAgICBjb2RlY19jb250ZXh0XyA9IE5VTEw7Ci0gIH0KLSAgaWYgKGF2X2ZyYW1lXykgewotICAgIGF2X2ZyZWUoYXZfZnJhbWVfKTsKLSAgICBhdl9mcmFtZV8gPSBOVUxMOwotICB9Ci19Ci0KLWludCBTaGVsbFJhd1ZpZGVvRGVjb2RlckxpbnV4OjpHZXRWaWRlb0J1ZmZlcihBVkNvZGVjQ29udGV4dCogY29kZWNfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lKiBmcmFtZSkgewotICBWaWRlb0ZyYW1lOjpGb3JtYXQgZm9ybWF0ID0gUGl4ZWxGb3JtYXRUb1ZpZGVvRm9ybWF0KGNvZGVjX2NvbnRleHQtPnBpeF9mbXQpOwotICBpZiAoZm9ybWF0ID09IFZpZGVvRnJhbWU6OklOVkFMSUQpCi0gICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgRENIRUNLX0VRKGZvcm1hdCwgVmlkZW9GcmFtZTo6WVYxMik7Ci0KLSAgZ2Z4OjpTaXplIHNpemUoY29kZWNfY29udGV4dC0+d2lkdGgsIGNvZGVjX2NvbnRleHQtPmhlaWdodCk7Ci0gIGludCByZXQgPSBhdl9pbWFnZV9jaGVja19zaXplKHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSwgMCwgTlVMTCk7Ci0gIGlmIChyZXQgPCAwKSB7Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotCi0gIGlmICghVmlkZW9GcmFtZTo6SXNWYWxpZENvbmZpZyhmb3JtYXQsIHNpemUsIGdmeDo6UmVjdChzaXplKSwgc2l6ZSkpIHsKLSAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICB9Ci0KLSAgLy8gQWxpZ24gdG8ga1BsYXRmb3JtQWxpZ25tZW50ICogMiBhcyB3ZSB3aWxsIGRpdmlkZSB0aGUgeV9zdHJpZGUgYnkgMiBmb3IgdQotICAvLyBhbmQgdiBwbGFuZXMuCi0gIHNpemVfdCB5X3N0cmlkZSA9IEFsaWduVXAoc2l6ZS53aWR0aCgpLCBrUGxhdGZvcm1BbGlnbm1lbnQgKiAyKTsKLSAgc2l6ZV90IHV2X3N0cmlkZSA9IHlfc3RyaWRlIC8gMjsKLSAgc2l6ZV90IGFsaWduZWRfaGVpZ2h0ID0gQWxpZ25VcChzaXplLmhlaWdodCgpLCBrUGxhdGZvcm1BbGlnbm1lbnQgKiAyKTsKLSAgc2NvcGVkX3JlZnB0cjxGcmFtZUJ1ZmZlcj4gZnJhbWVfYnVmZmVyID0gYWxsb2NhdG9yXy0+QWxsb2NhdGVGcmFtZUJ1ZmZlcigKLSAgICAgIEdldFlWMTJTaXplSW5CeXRlcyh5X3N0cmlkZSwgYWxpZ25lZF9oZWlnaHQpLCBrUGxhdGZvcm1BbGlnbm1lbnQpOwotCi0gIC8vIHkgcGxhbmUKLSAgZnJhbWUtPmJhc2VbMF0gPSBmcmFtZV9idWZmZXItPmRhdGEoKTsKLSAgZnJhbWUtPmRhdGFbMF0gPSBmcmFtZS0+YmFzZVswXTsKLSAgZnJhbWUtPmxpbmVzaXplWzBdID0geV9zdHJpZGU7Ci0gIC8vIHUgcGxhbmUKLSAgZnJhbWUtPmJhc2VbMV0gPSBmcmFtZS0+YmFzZVswXSArIHlfc3RyaWRlICogYWxpZ25lZF9oZWlnaHQ7Ci0gIGZyYW1lLT5kYXRhWzFdID0gZnJhbWUtPmJhc2VbMV07Ci0gIG1lbXNldChmcmFtZS0+ZGF0YVsxXSwgMCwgdXZfc3RyaWRlICogKGFsaWduZWRfaGVpZ2h0IC8gMikpOwotICBmcmFtZS0+bGluZXNpemVbMV0gPSB1dl9zdHJpZGU7Ci0gIC8vIHYgcGxhbmUKLSAgZnJhbWUtPmJhc2VbMl0gPSBmcmFtZS0+YmFzZVsxXSArIHV2X3N0cmlkZSAqIGFsaWduZWRfaGVpZ2h0IC8gMjsKLSAgZnJhbWUtPmRhdGFbMl0gPSBmcmFtZS0+YmFzZVsyXTsKLSAgbWVtc2V0KGZyYW1lLT5kYXRhWzJdLCAwLCB1dl9zdHJpZGUgKiAoYWxpZ25lZF9oZWlnaHQgLyAyKSk7Ci0gIGZyYW1lLT5saW5lc2l6ZVsyXSA9IHV2X3N0cmlkZTsKLQotICBmcmFtZS0+b3BhcXVlID0gTlVMTDsKLSAgZnJhbWVfYnVmZmVyLnN3YXAocmVpbnRlcnByZXRfY2FzdDxGcmFtZUJ1ZmZlcioqPigmZnJhbWUtPm9wYXF1ZSkpOwotICBmcmFtZS0+dHlwZSA9IEZGX0JVRkZFUl9UWVBFX1VTRVI7Ci0gIGZyYW1lLT5wa3RfcHRzID0KLSAgICAgIGNvZGVjX2NvbnRleHQtPnBrdCA/IGNvZGVjX2NvbnRleHQtPnBrdC0+cHRzIDogQVZfTk9QVFNfVkFMVUU7Ci0gIGZyYW1lLT53aWR0aCA9IGNvZGVjX2NvbnRleHQtPndpZHRoOwotICBmcmFtZS0+aGVpZ2h0ID0gY29kZWNfY29udGV4dC0+aGVpZ2h0OwotICBmcmFtZS0+Zm9ybWF0ID0gY29kZWNfY29udGV4dC0+cGl4X2ZtdDsKLQotICByZXR1cm4gMDsKLX0KLQotdm9pZCBTaGVsbFJhd1ZpZGVvRGVjb2RlckxpbnV4OjpSZWxlYXNlVmlkZW9CdWZmZXIoQVZDb2RlY0NvbnRleHQqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSogZnJhbWUpIHsKLSAgc2NvcGVkX3JlZnB0cjxGcmFtZUJ1ZmZlcj4gZnJhbWVfYnVmZmVyOwotICBmcmFtZV9idWZmZXIuc3dhcChyZWludGVycHJldF9jYXN0PEZyYW1lQnVmZmVyKio+KCZmcmFtZS0+b3BhcXVlKSk7Ci0KLSAgLy8gVGhlIEZGbXBlZyBBUEkgZXhwZWN0cyB1cyB0byB6ZXJvIHRoZSBkYXRhIHBvaW50ZXJzIGluCi0gIC8vIHRoaXMgY2FsbGJhY2sKLSAgbWVtc2V0KGZyYW1lLT5kYXRhLCAwLCBzaXplb2YoZnJhbWUtPmRhdGEpKTsKLSAgZnJhbWUtPm9wYXF1ZSA9IE5VTEw7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1zY29wZWRfcHRyPFNoZWxsUmF3VmlkZW9EZWNvZGVyPiBDcmVhdGVTaGVsbFJhd1ZpZGVvRGVjb2RlckxpbnV4KAotICAgIFNoZWxsVmlkZW9EYXRhQWxsb2NhdG9yKiBhbGxvY2F0b3IsCi0gICAgY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiBjb25maWcsCi0gICAgRGVjcnlwdG9yKiBkZWNyeXB0b3IsCi0gICAgYm9vbCB3YXNfZW5jcnlwdGVkKSB7Ci0gIERDSEVDSyhhbGxvY2F0b3IpOwotICBEQ0hFQ0tfRVEoY29uZmlnLmNvZGVjKCksIGtDb2RlY0gyNjQpIDw8ICJWaWRlbyBjb2RlYyAiIDw8IGNvbmZpZy5jb2RlYygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBpcyBub3Qgc3VwcG9ydGVkLiI7Ci0gIHNjb3BlZF9wdHI8U2hlbGxSYXdWaWRlb0RlY29kZXI+IGRlY29kZXIoCi0gICAgICBuZXcgU2hlbGxSYXdWaWRlb0RlY29kZXJMaW51eChhbGxvY2F0b3IpKTsKLSAgaWYgKGRlY29kZXItPlVwZGF0ZUNvbmZpZyhjb25maWcpKQotICAgIHJldHVybiBkZWNvZGVyLlBhc3MoKTsKLSAgcmV0dXJuIHNjb3BlZF9wdHI8U2hlbGxSYXdWaWRlb0RlY29kZXI+KCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfcmF3X3ZpZGVvX2RlY29kZXJfbGludXguaCBiL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX3Jhd192aWRlb19kZWNvZGVyX2xpbnV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNjQyMjMuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfcmF3X3ZpZGVvX2RlY29kZXJfbGludXguaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfRklMVEVSU19TSEVMTF9SQVdfVklERU9fREVDT0RFUl9MSU5VWF9IXwotI2RlZmluZSBNRURJQV9GSUxURVJTX1NIRUxMX1JBV19WSURFT19ERUNPREVSX0xJTlVYX0hfCi0KLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaGVsbF92aWRlb19kYXRhX2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fZGVjb2Rlcl9jb25maWcuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL3NoZWxsX3ZpZGVvX2RlY29kZXJfaW1wbC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1zY29wZWRfcHRyPFNoZWxsUmF3VmlkZW9EZWNvZGVyPiBDcmVhdGVTaGVsbFJhd1ZpZGVvRGVjb2RlckxpbnV4KAotICAgIFNoZWxsVmlkZW9EYXRhQWxsb2NhdG9yKiBhbGxvY2F0b3IsCi0gICAgY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiBjb25maWcsCi0gICAgRGVjcnlwdG9yKiBkZWNyeXB0b3IsCi0gICAgYm9vbCB3YXNfZW5jcnlwdGVkKTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfRklMVEVSU19TSEVMTF9SQVdfVklERU9fREVDT0RFUl9MSU5VWF9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfcmF3X3ZpZGVvX2RlY29kZXJfc3R1Yi5jYyBiL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX3Jhd192aWRlb19kZWNvZGVyX3N0dWIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzM2NkZWMuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfcmF3X3ZpZGVvX2RlY29kZXJfc3R1Yi5jYworKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL3NoZWxsX3Jhd192aWRlb19kZWNvZGVyX3N0dWIuaCIKLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1uYW1lc3BhY2UgewotCi10eXBlZGVmIFNoZWxsVmlkZW9EYXRhQWxsb2NhdG9yOjpGcmFtZUJ1ZmZlciBGcmFtZUJ1ZmZlcjsKLXR5cGVkZWYgU2hlbGxWaWRlb0RhdGFBbGxvY2F0b3I6OllWMTJQYXJhbSBZVjEyUGFyYW07Ci0KLWNsYXNzIFNoZWxsUmF3VmlkZW9EZWNvZGVyU3R1YiA6IHB1YmxpYyBTaGVsbFJhd1ZpZGVvRGVjb2RlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBTaGVsbFJhd1ZpZGVvRGVjb2RlclN0dWIoU2hlbGxWaWRlb0RhdGFBbGxvY2F0b3IqIGFsbG9jYXRvcikKLSAgICAgIDogYWxsb2NhdG9yXyhhbGxvY2F0b3IpIHt9Ci0gIHZvaWQgRGVjb2RlKGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGJ1ZmZlciwKLSAgICAgICAgICAgICAgY29uc3QgRGVjb2RlQ0ImIGRlY29kZV9jYikgT1ZFUlJJREU7Ci0gIGJvb2wgRmx1c2goKSBPVkVSUklERTsKLSAgYm9vbCBVcGRhdGVDb25maWcoY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiBjb25maWcpIE9WRVJSSURFOwotCi0gcHJpdmF0ZToKLSAgU2hlbGxWaWRlb0RhdGFBbGxvY2F0b3IqIGFsbG9jYXRvcl87Ci0gIGdmeDo6U2l6ZSBuYXR1cmFsX3NpemVfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTaGVsbFJhd1ZpZGVvRGVjb2RlclN0dWIpOwotfTsKLQotdm9pZCBTaGVsbFJhd1ZpZGVvRGVjb2RlclN0dWI6OkRlY29kZSgKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBidWZmZXIsCi0gICAgY29uc3QgRGVjb2RlQ0ImIGRlY29kZV9jYikgewotICBpZiAoYnVmZmVyLT5Jc0VuZE9mU3RyZWFtKCkpIHsKLSAgICBkZWNvZGVfY2IuUnVuKEZSQU1FX0RFQ09ERUQsIFZpZGVvRnJhbWU6OkNyZWF0ZUVtcHR5RnJhbWUoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc2l6ZV90IHl1dl9zaXplID0gbmF0dXJhbF9zaXplXy53aWR0aCgpICogbmF0dXJhbF9zaXplXy5oZWlnaHQoKSAqIDMgLyAyOwotICBzY29wZWRfcmVmcHRyPEZyYW1lQnVmZmVyPiBmcmFtZV9idWZmZXIgPQotICAgICAgYWxsb2NhdG9yXy0+QWxsb2NhdGVGcmFtZUJ1ZmZlcih5dXZfc2l6ZSwgMSk7Ci0gIFlWMTJQYXJhbSBwYXJhbShuYXR1cmFsX3NpemVfLndpZHRoKCksIG5hdHVyYWxfc2l6ZV8uaGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgICBnZng6OlJlY3QobmF0dXJhbF9zaXplXyksIGZyYW1lX2J1ZmZlci0+ZGF0YSgpKTsKLSAgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiBmcmFtZSA9Ci0gICAgICBhbGxvY2F0b3JfLT5DcmVhdGVZVjEyRnJhbWUoZnJhbWVfYnVmZmVyLCBwYXJhbSwgYnVmZmVyLT5HZXRUaW1lc3RhbXAoKSk7Ci0gIGRlY29kZV9jYi5SdW4oRlJBTUVfREVDT0RFRCwgZnJhbWUpOwotfQotCi1ib29sIFNoZWxsUmF3VmlkZW9EZWNvZGVyU3R1Yjo6Rmx1c2goKSB7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFNoZWxsUmF3VmlkZW9EZWNvZGVyU3R1Yjo6VXBkYXRlQ29uZmlnKGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgY29uZmlnKSB7Ci0gIG5hdHVyYWxfc2l6ZV8gPSBjb25maWcubmF0dXJhbF9zaXplKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotc2NvcGVkX3B0cjxTaGVsbFJhd1ZpZGVvRGVjb2Rlcj4gQ3JlYXRlU2hlbGxSYXdWaWRlb0RlY29kZXJTdHViKAotICAgIFNoZWxsVmlkZW9EYXRhQWxsb2NhdG9yKiBhbGxvY2F0b3IsCi0gICAgY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiBjb25maWcsCi0gICAgRGVjcnlwdG9yKiBkZWNyeXB0b3IsCi0gICAgYm9vbCB3YXNfZW5jcnlwdGVkKSB7Ci0gIERDSEVDSyhhbGxvY2F0b3IpOwotICBzY29wZWRfcHRyPFNoZWxsUmF3VmlkZW9EZWNvZGVyPiBkZWNvZGVyKAotICAgICAgbmV3IFNoZWxsUmF3VmlkZW9EZWNvZGVyU3R1YihhbGxvY2F0b3IpKTsKLSAgaWYgKGRlY29kZXItPlVwZGF0ZUNvbmZpZyhjb25maWcpKQotICAgIHJldHVybiBkZWNvZGVyLlBhc3MoKTsKLSAgcmV0dXJuIHNjb3BlZF9wdHI8U2hlbGxSYXdWaWRlb0RlY29kZXI+KCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfcmF3X3ZpZGVvX2RlY29kZXJfc3R1Yi5oIGIvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfcmF3X3ZpZGVvX2RlY29kZXJfc3R1Yi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWJlYWRiLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX3Jhd192aWRlb19kZWNvZGVyX3N0dWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfRklMVEVSU19TSEVMTF9SQVdfVklERU9fREVDT0RFUl9TVFVCX0hfCi0jZGVmaW5lIE1FRElBX0ZJTFRFUlNfU0hFTExfUkFXX1ZJREVPX0RFQ09ERVJfU1RVQl9IXwotCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2hlbGxfdmlkZW9fZGF0YV9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL3NoZWxsX3ZpZGVvX2RlY29kZXJfaW1wbC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1zY29wZWRfcHRyPFNoZWxsUmF3VmlkZW9EZWNvZGVyPiBDcmVhdGVTaGVsbFJhd1ZpZGVvRGVjb2RlclN0dWIoCi0gICAgU2hlbGxWaWRlb0RhdGFBbGxvY2F0b3IqIGFsbG9jYXRvciwKLSAgICBjb25zdCBWaWRlb0RlY29kZXJDb25maWcmIGNvbmZpZywKLSAgICBEZWNyeXB0b3IqIGRlY3J5cHRvciwKLSAgICBib29sIHdhc19lbmNyeXB0ZWQpOwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9GSUxURVJTX1NIRUxMX1JBV19WSURFT19ERUNPREVSX1NUVUJfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX3Jic3Bfc3RyZWFtLmNjIGIvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfcmJzcF9zdHJlYW0uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MDI4NjIuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfcmJzcF9zdHJlYW0uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvc2hlbGxfcmJzcF9zdHJlYW0uaCIKLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1TaGVsbFJCU1BTdHJlYW06OlNoZWxsUkJTUFN0cmVhbShjb25zdCB1aW50OCogbmFsdV9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmFsdV9idWZmZXJfc2l6ZSkKLSAgICA6IG5hbHVfYnVmZmVyXyhuYWx1X2J1ZmZlciksCi0gICAgICBuYWx1X2J1ZmZlcl9zaXplXyhuYWx1X2J1ZmZlcl9zaXplKSwKLSAgICAgIG5hbHVfYnVmZmVyX2J5dGVfb2Zmc2V0XygwKSwKLSAgICAgIGN1cnJlbnRfbmFsdV9ieXRlXygwKSwKLSAgICAgIG51bWJlcl9jb25zZWN1dGl2ZV96ZXJvc18oMCksCi0gICAgICByYnNwX2JpdF9vZmZzZXRfKDApIHt9Ci0KLS8vIHJlYWQgdW5zaWduZWQgRXhwLUdvbG9tYiBjb2RlZCBpbnRlZ2VyLCBJU08gMTQ0OTYtMTAgU2VjdGlvbiA5LjEKLWJvb2wgU2hlbGxSQlNQU3RyZWFtOjpSZWFkVUVWKHVpbnQzMiYgdWV2X291dCkgewotICBpbnQgbGVhZGluZ196ZXJvX2JpdHMgPSAtMTsKLSAgZm9yICh1aW50OCBiID0gMDsgYiA9PSAwOyBsZWFkaW5nX3plcm9fYml0cysrKSB7Ci0gICAgaWYgKCFSZWFkUkJTUEJpdChiKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICAvLyB3ZSBjYW4gb25seSBmaXQgMzEgYml0cyBvZiBFeHAtR29sb21iIGNvZGVkIGRhdGEgaW50byBhIDMyLWJpdCBudW1iZXIKLSAgaWYgKGxlYWRpbmdfemVyb19iaXRzID49IDMyKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHVpbnQzMiByZXN1bHQgPSAoMSA8PCBsZWFkaW5nX3plcm9fYml0cykgLSAxOwotICB1aW50MzIgcmVtYWluZGVyID0gMDsKLSAgaWYgKCFSZWFkQml0cyhsZWFkaW5nX3plcm9fYml0cywgcmVtYWluZGVyKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXN1bHQgKz0gcmVtYWluZGVyOwotICB1ZXZfb3V0ID0gcmVzdWx0OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gcmVhZCBzaWduZWQgRXhwLUdvbG9tYiBjb2RlZCBpbnRlZ2VyLCBJU08gMTQ0OTYtMTAgU2VjdGlvbiA5LjEKLWJvb2wgU2hlbGxSQlNQU3RyZWFtOjpSZWFkU0VWKGludDMyJiBzZXZfb3V0KSB7Ci0gIC8vIHdlIHN0YXJ0IG9mZiBieSByZWFkaW5nIGFuIHVuc2lnbmVkIEV4cC1Hb2xvbWIgY29kZWQgbnVtYmVyCi0gIHVpbnQzMiB1ZXYgPSAwOwotICBpZiAoIVJlYWRVRVYodWV2KSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyB0aGUgTFNiIGluIHRoaXMgbnVtYmVyIGlzIHRyZWF0ZWQgYXMgdGhlIGludmVydGVkIHNpZ24gYml0Ci0gIGJvb2wgaXNfbmVnYXRpdmUgPSAhKHVldiAmIDEpOwotICBpbnQzMiByZXN1bHQgPSAoaW50MzIpKCh1ZXYgKyAxKSA+PiAxKTsKLSAgaWYgKGlzX25lZ2F0aXZlKSB7Ci0gICAgcmVzdWx0ICo9IC0xOwotICB9Ci0gIHNldl9vdXQgPSByZXN1bHQ7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyByZWFkIGFuZCByZXR1cm4gdXAgdG8gMzIgYml0cywgZmlsbGluZyBmcm9tIHRoZSByaWdodCwgbWVhbmluZyB0aGF0Ci0vLyBSZWFkQml0cygxNykgb24gYSBzdHJlYW0gb2YgYWxsIDFzIHdvdWxkIHJldHVybiAweDAxZmZmZgotYm9vbCBTaGVsbFJCU1BTdHJlYW06OlJlYWRCaXRzKHNpemVfdCBiaXRzLCB1aW50MzImIGJpdHNfb3V0KSB7Ci0gIGlmIChiaXRzID4gMzIpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKGJpdHMgPT0gMCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHVpbnQzMiByZXN1bHQgPSAwOwotICBzaXplX3QgYnl0ZXMgPSBiaXRzID4+IDM7Ci0gIC8vIHJlYWQgYnl0ZXMgZmlyc3QKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlczsgaSsrKSB7Ci0gICAgdWludDggbmV3X2J5dGUgPSAwOwotICAgIGlmICghUmVhZFJCU1BCeXRlKG5ld19ieXRlKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXN1bHQgPSByZXN1bHQgPDwgODsKLSAgICByZXN1bHQgPSByZXN1bHQgfCAodWludDMyKW5ld19ieXRlOwotICB9Ci0gIC8vIHNjb290IGFueSBsZWZ0b3ZlciBiaXRzIGluCi0gIGJpdHMgPSBiaXRzICUgODsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBiaXRzOyBpKyspIHsKLSAgICB1aW50OCBuZXdfYml0ID0gMDsKLSAgICBpZiAoIVJlYWRSQlNQQml0KG5ld19iaXQpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJlc3VsdCA9IHJlc3VsdCA8PCAxOwotICAgIHJlc3VsdCA9IHJlc3VsdCB8ICh1aW50MzIpbmV3X2JpdDsKLSAgfQotICBiaXRzX291dCA9IHJlc3VsdDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIGp1bXAgb3ZlciBieXRlcyBpbiB0aGUgUkJTUCBzdHJlYW0KLWJvb2wgU2hlbGxSQlNQU3RyZWFtOjpTa2lwQnl0ZXMoc2l6ZV90IGJ5dGVzKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXM7ICsraSkgewotICAgIGlmICghQ29uc3VtZU5BTFVCeXRlKCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIGp1bXAgb3ZlciBiaXRzIGluIHRoZSBSQlNQIHN0cmVhbQotYm9vbCBTaGVsbFJCU1BTdHJlYW06OlNraXBCaXRzKHNpemVfdCBiaXRzKSB7Ci0gIC8vIHNraXAgYnl0ZXMgZmlyc3QKLSAgc2l6ZV90IGJ5dGVzID0gYml0cyA+PiAzOwotICBpZiAoYnl0ZXMgPiAwKSB7Ci0gICAgaWYgKCFTa2lwQnl0ZXMoYnl0ZXMpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIC8vIG1hc2sgb2ZmIGJ5dGUgc2tpcHMKLSAgYml0cyA9IGJpdHMgJiA3OwotICAvLyBpZiBubyBiaXRzIGxlZnQgdG8gc2tpcCBqdXN0IHJldHVybgotICBpZiAoYml0cyA9PSAwKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgLy8gb2JleSB0aGUgY29udmVudGlvbiB0aGF0IGlmIG91ciBiaXQgb2Zmc2V0IGlzIDAgd2UgaGF2ZW4ndCBsb2FkZWQgdGhlCi0gIC8vIGN1cnJlbnQgYnl0ZSwgZXh0cmFjdCBpdCBmcm9tIE5BTFUgc3RyZWFtIGFzIHdlIGFyZSBnb2luZyB0byBhZHZhbmNlCi0gIC8vIHRoZSBiaXQgY3Vyc29yIGluIHRvIGl0IChvciBwb3RlbnRpYWxseSBwYXN0IGl0KQotICBpZiAocmJzcF9iaXRfb2Zmc2V0XyA9PSAwKSB7Ci0gICAgaWYgKCFDb25zdW1lTkFMVUJ5dGUoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICAvLyBhZGQgdG8gb3VyIGJpdCBvZmZzZXQKLSAgcmJzcF9iaXRfb2Zmc2V0XyArPSBiaXRzOwotICAvLyBpZiB3ZSBqdW1wZWQgaW4gdG8gdGhlIG5leHQgYnl0ZSBhZHZhbmNlIHRoZSBOQUxVIHN0cmVhbSwgcmVzcGVjdGluZyB0aGUKLSAgLy8gY29udmVudGlvbiB0aGF0IGlmIHdlJ3JlIGF0IDggYml0cyBzdGF5IG9uIHRoZSBjdXJyZW50IGJ5dGUKLSAgaWYgKHJic3BfYml0X29mZnNldF8gPj0gOSkgewotICAgIGlmICghQ29uc3VtZU5BTFVCeXRlKCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgcmJzcF9iaXRfb2Zmc2V0XyA9IHJic3BfYml0X29mZnNldF8gJSA4OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gYWR2YW5jZSBieSBvbmUgYnl0ZSB0aHJvdWdoIHRoZSBOQUxVIGJ1ZmZlciwgcmVzcGVjdGluZyB0aGUgZW5jb2Rpbmcgb2YKLS8vIDAwIDAwIDAzID0+IDAwIDAwLiBVcGRhdGVzIHRoZSBzdGF0ZSBvZiBjdXJyZW50X25hbHVfYnl0ZV8gdG8gdGhlIG5ldyB2YWx1ZS4KLWJvb2wgU2hlbGxSQlNQU3RyZWFtOjpDb25zdW1lTkFMVUJ5dGUoKSB7Ci0gIGlmIChuYWx1X2J1ZmZlcl9ieXRlX29mZnNldF8gPj0gbmFsdV9idWZmZXJfc2l6ZV8pIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgY3VycmVudF9uYWx1X2J5dGVfID0gbmFsdV9idWZmZXJfW25hbHVfYnVmZmVyX2J5dGVfb2Zmc2V0X107Ci0gIGlmIChjdXJyZW50X25hbHVfYnl0ZV8gPT0gMHgwMyAmJiBudW1iZXJfY29uc2VjdXRpdmVfemVyb3NfID49IDIpIHsKLSAgICArK25hbHVfYnVmZmVyX2J5dGVfb2Zmc2V0XzsKLSAgICBjdXJyZW50X25hbHVfYnl0ZV8gPSBuYWx1X2J1ZmZlcl9bbmFsdV9idWZmZXJfYnl0ZV9vZmZzZXRfXTsKLSAgICBudW1iZXJfY29uc2VjdXRpdmVfemVyb3NfID0gMDsKLSAgfQotCi0gIGlmIChjdXJyZW50X25hbHVfYnl0ZV8gPT0gMCkgewotICAgICsrbnVtYmVyX2NvbnNlY3V0aXZlX3plcm9zXzsKLSAgfSBlbHNlIHsKLSAgICBudW1iZXJfY29uc2VjdXRpdmVfemVyb3NfID0gMDsKLSAgfQotICArK25hbHVfYnVmZmVyX2J5dGVfb2Zmc2V0XzsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIHJldHVybiBzaW5nbGUgYml0IGluIHRoZSBMU2IgZnJvbSB0aGUgUkJTUCBzdHJlYW0uIEJpdHMgYXJlIHJlYWQgZnJvbSBNU2IKLS8vIHRvIExTYiBpbiB0aGUgc3RyZWFtLgotYm9vbCBTaGVsbFJCU1BTdHJlYW06OlJlYWRSQlNQQml0KHVpbnQ4JiBiaXRfb3V0KSB7Ci0gIC8vIGNoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGNvbnN1bWUgYSBmcmVzaCBieXRlCi0gIGlmIChyYnNwX2JpdF9vZmZzZXRfID09IDApIHsKLSAgICBpZiAoIUNvbnN1bWVOQUxVQnl0ZSgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIC8vIHNpbmNlIHdlIHJlYWQgZnJvbSBNU2IgdG8gTFNiIGluIHN0cmVhbSB3ZSBzaGlmdCByaWdodAotICB1aW50OCBiaXQgPSAoY3VycmVudF9uYWx1X2J5dGVfID4+ICg3IC0gcmJzcF9iaXRfb2Zmc2V0XykpICYgMTsKLSAgLy8gaW5jcmVtZW50IGJpdCBvZmZzZXQKLSAgcmJzcF9iaXRfb2Zmc2V0XyA9IChyYnNwX2JpdF9vZmZzZXRfICsgMSkgJSA4OwotICBiaXRfb3V0ID0gYml0OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTaGVsbFJCU1BTdHJlYW06OlJlYWRSQlNQQnl0ZSh1aW50OCYgYnl0ZV9vdXQpIHsKLSAgLy8gZmFzdCBwYXRoIGZvciBieXRlLWFsaWduZWQgYWNjZXNzCi0gIGlmIChyYnNwX2JpdF9vZmZzZXRfID09IDApIHsKLSAgICBpZiAoIUNvbnN1bWVOQUxVQnl0ZSgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGJ5dGVfb3V0ID0gY3VycmVudF9uYWx1X2J5dGVfOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIC8vIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGJpdHMgaW4gdGhlIGN1cnJlbnQgYnl0ZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoaXMKLSAgLy8gbmV4dCBieXRlLCBhYnNvcmIgdGhlbQotICB1aW50OCB1cHBlcl9wYXJ0ID0gY3VycmVudF9uYWx1X2J5dGVfOwotICAvLyByZWFkIG5leHQgYnl0ZSBmcm9tIHN0cmVhbQotICBpZiAoIUNvbnN1bWVOQUxVQnl0ZSgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIGZvcm0gdGhlIGJ5dGUgZnJvbSB0aGUgdHdvIGJ5dGVzCi0gIGJ5dGVfb3V0ID0gKHVwcGVyX3BhcnQgPDwgcmJzcF9iaXRfb2Zmc2V0XykgfAotICAgICAgICAgICAgIChjdXJyZW50X25hbHVfYnl0ZV8gPj4gKDggLSByYnNwX2JpdF9vZmZzZXRfKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX3Jic3Bfc3RyZWFtLmggYi9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9yYnNwX3N0cmVhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmZkNGViLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX3Jic3Bfc3RyZWFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX0ZJTFRFUlNfU0hFTExfUkJTUF9TVFJFQU1fSF8KLSNkZWZpbmUgTUVESUFfRklMVEVSU19TSEVMTF9SQlNQX1NUUkVBTV9IXwotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIElTTyAxNDQ5Ni0xMCBkZXNjcmliZXMgYSBieXRlIGVuY29kaW5nIGZvcm1hdCBmb3IgTkFMVXMgKG5ldHdvcmsgYWJzdHJhY3Rpb24KLS8vIGxheWVyIHVuaXRzKSBhbmQgcnVsZXMgdG8gY29udmVydCBpdCBpbnRvIGEgUkJTUCBzdHJlYW0sIHdoaWNoIGlzIHRoZSBmb3JtYXQKLS8vIHRoYXQgc29tZSBvdGhlciBhdG9tcyBhcmUgZGVmaW5lZC4gVGhpcyBjbGFzcyB0YWtlcyBhIG5vbi1vd25pbmcgcmVmZXJlbmNlCi0vLyB0byBhIGJ1ZmZlciBhbmQgZXh0cmFjdCB2YXJpb3VzIHR5cGVzIGZyb20gdGhlIHN0cmVhbSB3aGlsZSBzaWxlbnRseQotLy8gY29uc3VtaW5nIHRoZSBleHRyYSBlbmNvZGluZyBieXRlcyBhbmQgYWR2YW5jaW5nIGEgYml0IHN0cmVhbSBwb2ludGVyLgotY2xhc3MgU2hlbGxSQlNQU3RyZWFtIHsKLSBwdWJsaWM6Ci0gIC8vIE5PTi1PV05JTkcgcG9pbnRlciB0byBidWZmZXIuIEl0IGlzIGFzc3VtZWQgdGhlIGNsaWVudCB3aWxsIGRpc3Bvc2Ugb2YKLSAgLy8gdGhpcyBidWZmZXIuCi0gIFNoZWxsUkJTUFN0cmVhbShjb25zdCB1aW50OCogbmFsdV9idWZmZXIsIHNpemVfdCBuYWx1X2J1ZmZlcl9zaXplKTsKLSAgLy8gYWxsIFJlYWQvU2tpcCBtZXRob2RzIHJldHVybiB0aGUgdmFsdWUgYnkgcmVmZXJlbmNlIGFuZCByZXR1cm4gdHJ1ZQotICAvLyBvbiBzdWNjZXNzLCBmYWxzZSBvbiByZWFkIGVycm9yL0VPQi4gT25jZSB0aGUgb2JqZWN0IGhhcyByZXR1cm5lZAotICAvLyBmYWxzZSB0aGUgY29uc2lzdGVuY3kgb2YgdGhlIGRhdGEgaXMgbm90IGd1YXJhbnRlZWQuCi0gIC8vIHJlYWQgdW5zaWduZWQgRXhwLUdvbG9tYiBjb2RlZCBpbnRlZ2VyLCBJU08gMTQ0OTYtMTAgU2VjdGlvbiA5LjEKLSAgYm9vbCBSZWFkVUVWKHVpbnQzMiYgdWV2X291dCk7Ci0gIC8vIHJlYWQgc2lnbmVkIEV4cC1Hb2xvbWIgY29kZWQgaW50ZWdlciwgSVNPIDE0NDk2LTEwIFNlY3Rpb24gOS4xCi0gIGJvb2wgUmVhZFNFVihpbnQzMiYgc2V2X291dCk7Ci0gIC8vIHJlYWQgYW5kIHJldHVybiB1cCB0byAzMiBiaXRzLCBmaWxsaW5nIGZyb20gdGhlIHJpZ2h0LCBtZWFuaW5nIHRoYXQKLSAgLy8gUmVhZEJpdHMoMTcpIG9uIGEgc3RyZWFtIG9mIGFsbCAxcyB3b3VsZCByZXR1cm4gMHgwMWZmZmYKLSAgYm9vbCBSZWFkQml0cyhzaXplX3QgYml0cywgdWludDMyJiBiaXRzX291dCk7Ci0gIGJvb2wgUmVhZEJ5dGUodWludDgmIGJ5dGVfb3V0KSB7IHJldHVybiBSZWFkUkJTUEJ5dGUoYnl0ZV9vdXQpOyB9Ci0gIGJvb2wgUmVhZEJpdCh1aW50OCYgYml0X291dCkgeyByZXR1cm4gUmVhZFJCU1BCaXQoYml0X291dCk7IH0KLSAgLy8ganVtcCBvdmVyIGJ5dGVzIGluIHRoZSBSQlNQIHN0cmVhbQotICBib29sIFNraXBCeXRlcyhzaXplX3QgYnl0ZXMpOwotICAvLyBqdW1wIG92ZXIgYml0cyBpbiB0aGUgUkJTUCBzdHJlYW0KLSAgYm9vbCBTa2lwQml0cyhzaXplX3QgYml0cyk7Ci0KLSBwcml2YXRlOgotICAvLyBhZHZhbmNlIGJ5IG9uZSBieXRlIHRocm91Z2ggdGhlIE5BTFUgYnVmZmVyLCByZXNwZWN0aW5nIHRoZSBlbmNvZGluZyBvZgotICAvLyAwMCAwMCAwMyA9PiAwMCAwMC4gVXBkYXRlcyB0aGUgc3RhdGUgb2YgY3VycmVudF9uYWx1X2J5dGVfIHRvIHRoZSBuZXcKLSAgLy8gdmFsdWUuCi0gIC8vIHJldHVybnMgZmFsZSBpZiB3ZSBoYXZlIG1vdmVkIHBhc3QgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgotICBib29sIENvbnN1bWVOQUxVQnl0ZSgpOwotICAvLyByZXR1cm4gc2luZ2xlIGJpdCBpbiB0aGUgTFNiIGZyb20gdGhlIFJCU1Agc3RyZWFtLiBCaXRzIGFyZSByZWFkIGZyb20gTVNiCi0gIC8vIHRvIExTYiBpbiB0aGUgc3RyZWFtLgotICBib29sIFJlYWRSQlNQQml0KHVpbnQ4JiBiaXRfb3V0KTsKLSAgYm9vbCBSZWFkUkJTUEJ5dGUodWludDgmIGJ5dGVfb3V0KTsKLQotICBjb25zdCB1aW50OCogbmFsdV9idWZmZXJfOwotICBzaXplX3QgbmFsdV9idWZmZXJfc2l6ZV87Ci0gIHNpemVfdCBuYWx1X2J1ZmZlcl9ieXRlX29mZnNldF87Ci0gIHVpbnQ4IGN1cnJlbnRfbmFsdV9ieXRlXzsKLSAgaW50IG51bWJlcl9jb25zZWN1dGl2ZV96ZXJvc187Ci0gIC8vIGxvY2F0aW9uIG9mIHJic3AgYml0IGN1cnNvciB3aXRoaW4gY3VycmVudF9uYWx1X2J5dGVfCi0gIHNpemVfdCByYnNwX2JpdF9vZmZzZXRfOwotfTsKLX07Ci0KLSNlbmRpZiAgLy8gTUVESUFfRklMVEVSU19TSEVMTF9SQlNQX1NUUkVBTV9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfcmJzcF9zdHJlYW1fdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9yYnNwX3N0cmVhbV91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ4ZGRhZC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9yYnNwX3N0cmVhbV91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDYzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9zaGVsbF9yYnNwX3N0cmVhbS5oIgotCi0jaW5jbHVkZSA8bGlzdD4KLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJiYXNlL3N0cmluZ3ByaW50Zi5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBTaGVsbFJCU1BTdHJlYW1UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgU2hlbGxSQlNQU3RyZWFtVGVzdCgpIHt9Ci0KLSAgdmlydHVhbCB+U2hlbGxSQlNQU3RyZWFtVGVzdCgpIHt9Ci0KLSAgLy8gR2l2ZW4gbnVtIGVuY29kZSB0aGUgdmFsdWUgaW4gc2lnbmVkIGV4cC1nb2xvbWIgc3ludGF4IGFuZCBwdXNoCi0gIC8vIHRoZSB2YWx1ZSBvbiB0aGUgcHJvdmlkZWQgYml0bGlzdAotICB2b2lkIEVuY29kZVNFVihpbnQzMiBudW0sIHN0ZDo6bGlzdDxib29sPiYgYml0cykgewotICAgIGJvb2wgaXNfbmVnYXRpdmUgPSAobnVtIDwgMCk7Ci0gICAgdWludDMyIHVudW0gPSAwOwotICAgIGlmIChpc19uZWdhdGl2ZSkgewotICAgICAgdW51bSA9ICh1aW50MzIpKG51bSAqIC0xKTsKLSAgICB9IGVsc2UgewotICAgICAgdW51bSA9ICh1aW50MzIpbnVtOwotICAgIH0KLSAgICAvLyBtdWx0aXBseSB1bnNpZ25lZCB2YWx1ZSBieSAyCi0gICAgdW51bSA9IHVudW0gPDwgMTsKLSAgICAvLyBzdWJ0cmFjdCBvbmUgZnJvbSB0aGUgcG9zaXRpdmUgdmFsdWVzCi0gICAgaWYgKCFpc19uZWdhdGl2ZSkgewotICAgICAgLS11bnVtOwotICAgIH0KLSAgICAvLyBlbmNvZGUgdGhlIHJlc3VsdGluZyB1ZXYKLSAgICBFbmNvZGVVRVYodW51bSwgYml0cyk7Ci0gIH0KLQotICAvLyBHaXZlbiBudW0gZW5jb2RlIHRoZSB2YWx1ZSBpbiB1bnNpZ25lZCBleHAtZ29sb21iIHN5bnRheCBhbmQgcHVzaAotICAvLyB0aGUgdmFsdWUgb24gdG8gdGhlIHByb3ZpZGVkIGJpdGxpc3QKLSAgdm9pZCBFbmNvZGVVRVYodWludDMyIG51bSwgc3RkOjpsaXN0PGJvb2w+JiBiaXRzKSB7Ci0gICAgLy8gZmluZCBsYXJnZXN0ICgyXnBvdykgLSAxIHNtYWxsZXIgdGhhbiBudW0KLSAgICB1aW50MzIgcG93ID0gMzE7Ci0gICAgdWludDMyIGJhc2UgPSAweDdmZmZmZmZmOwotICAgIHdoaWxlIChiYXNlID4gbnVtKSB7Ci0gICAgICBwb3ctLTsKLSAgICAgIGJhc2UgPSBiYXNlID4+IDE7Ci0gICAgfQotICAgIC8vIGVuY29kaW5nIGNhbGxzIGZvciBwb3cgbGVhZGluZyB6ZXJvcywgZm9sbG93ZWQgYnkgYSAxLCBmb2xsb3dlZAotICAgIC8vIGJ5IHBvdyBkaWdpdHMgb2YgdGhlIGlucHV0IG51bWJlciAtICgoMl5wb3cpIC0gMSkuCi0gICAgLy8gd2UgbW92ZSBmcm9tIE1TYiB0byBMU2IsIHNvIHN0YXJ0IGJ5IHB1c2hpbmcgYmFjayB0aGUgbGVhZGluZyAwcwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG93OyBpKyspIHsKLSAgICAgIGJpdHMucHVzaF9iYWNrKGZhbHNlKTsKLSAgICB9Ci0gICAgLy8gbm93IHB1c2ggdGhlIHNlcGFyYXRpbmcgb25lCi0gICAgYml0cy5wdXNoX2JhY2sodHJ1ZSk7Ci0gICAgLy8gYW5kIG5vdyBwb3cgYml0cyBvZiB0aGUgcmVtYWluZGVyIGJpdGZpZWxkIE1TYiB0byBMU2IKLSAgICB1aW50MzIgcmVtYWluZGVyID0gbnVtIC0gYmFzZTsKLSAgICBmb3IgKGludCBpID0gcG93IC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgIGJpdHMucHVzaF9iYWNrKChyZW1haW5kZXIgPj4gaSkgJiAweDAxKTsKLSAgICB9Ci0gIH0KLQotICAvLyBhZnRlciBidWlsZGluZyBhIGJpdGxpc3QgaW4gdmFyaW91cyBmdW4gd2F5cyBjYWxsIHRoaXMgbWV0aG9kIHRvCi0gIC8vIGNyZWF0ZSBhIGJ1ZmZlciBvbiB0aGUgaGVhcCB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gU2hlbGxSQlNQU3RyZWFtCi0gIC8vIGZvciBkZXNlcmlhbGl6YXRpb24uCi0gIHNjb3BlZF9hcnJheTx1aW50OD4gU2VyaWFsaXplVG9CdWZmZXIoY29uc3Qgc3RkOjpsaXN0PGJvb2w+JiBiaXRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWRkX3NlcXVlbmNlX2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCYgYnVmZmVyX3NpemVfb3V0KSB7Ci0gICAgLy8gc3RhcnQgYnkgYnVpbGRpbmcgYSBsaXN0IG9mIGJ5dGVzLCBzbyB3ZSBjYW4gYWRkIHRoZQotICAgIC8vIDAwIDAwID0+IDAwIDAwIDAzIHNlcXVlbmNlIGJ5dGVzCi0gICAgc3RkOjpsaXN0PHVpbnQ4PiBieXRlbGlzdDsKLSAgICB1aW50OCBwdXNoX2J5dGUgPSAwOwotICAgIHVpbnQzMiBiaXRfY291bnRlciA9IDA7Ci0gICAgZm9yIChzdGQ6Omxpc3Q8Ym9vbD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYml0bGlzdC5iZWdpbigpOwotICAgICAgICAgaXQgIT0gYml0bGlzdC5lbmQoKTsgKytpdCkgewotICAgICAgYml0X2NvdW50ZXIrKzsKLSAgICAgIHB1c2hfYnl0ZSA9IHB1c2hfYnl0ZSA8PCAxOwotICAgICAgaWYgKCppdCkgewotICAgICAgICBwdXNoX2J5dGUgfD0gMTsKLSAgICAgIH0KLSAgICAgIGlmICghKGJpdF9jb3VudGVyICUgOCkpIHsKLSAgICAgICAgYnl0ZWxpc3QucHVzaF9iYWNrKHB1c2hfYnl0ZSk7Ci0gICAgICAgIHB1c2hfYnl0ZSA9IDA7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIHB1c2ggYW55IHJlbWFpbmluZyBiaXRzIG9uIGFzIHRoZSBmaW5hbCBieXRlCi0gICAgaWYgKGJpdF9jb3VudGVyICUgOCkgewotICAgICAgYnl0ZWxpc3QucHVzaF9iYWNrKHB1c2hfYnl0ZSA8PCAoOCAtIChiaXRfY291bnRlciAlIDgpKSk7Ci0gICAgfQotICAgIC8vIGlmIHdlIHNob3VsZCBhZGQgc2VxdWVuY2UgYnl0ZXMgd2UgaXRlcmF0ZSB0aHJvdWdoIHRoZSBuZXcKLSAgICAvLyBieXRlIGxpc3QgbG9va2luZyBmb3IgMDAgMDAgYW5kIGluc2VydGluZyBhIDAzIGFmdGVyIGVhY2guCi0gICAgaWYgKGFkZF9zZXF1ZW5jZV9ieXRlcykgewotICAgICAgaW50IG51bV96ZXJvcyA9IDA7Ci0gICAgICBmb3IgKHN0ZDo6bGlzdDx1aW50OD46Oml0ZXJhdG9yIGl0ID0gYnl0ZWxpc3QuYmVnaW4oKTsKLSAgICAgICAgICAgaXQgIT0gYnl0ZWxpc3QuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgLy8gaWYgd2UganVzdCBwYXNzZWQgdHdvIHNlcXVlbnRpYWwgemVyb3MgaW5zZXJ0IGEgMDMKLSAgICAgICAgaWYgKG51bV96ZXJvcyA9PSAyKSB7Ci0gICAgICAgICAgYnl0ZWxpc3QuaW5zZXJ0KGl0LCAweDAzKTsKLSAgICAgICAgICAvLyByZXNldCB0aGUgY291bnRlcgotICAgICAgICAgIG51bV96ZXJvcyA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCppdCA9PSAwKSB7Ci0gICAgICAgICAgKytudW1femVyb3M7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbnVtX3plcm9zID0gMDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvLyB3ZSB3aWxsIG5lZWQgdG8gZGV0ZWN0IGFueSBuYXR1cmFsbHkgb2N1cnJpbmcgMDAgMDAgMDNzCi0gICAgICAvLyBhbmQgcHJvdGVjdCB0aGVtIGZyb20gcmVtb3ZhbCBvZiB0aGUgMDMsIGJ5IGluc2VydGluZyBhCi0gICAgICAvLyBzZWNvbmQgMDMKLSAgICAgIGludCBudW1femVyb3MgPSAwOwotICAgICAgZm9yIChzdGQ6Omxpc3Q8dWludDg+OjppdGVyYXRvciBpdCA9IGJ5dGVsaXN0LmJlZ2luKCk7Ci0gICAgICAgICAgIGl0ICE9IGJ5dGVsaXN0LmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIGlmICgobnVtX3plcm9zID49IDIpICYmICgqaXQgPT0gMHgwMykpIHsKLSAgICAgICAgICBieXRlbGlzdC5pbnNlcnQoaXQsIDB4MDMpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgqaXQgPT0gMCkgewotICAgICAgICAgICsrbnVtX3plcm9zOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG51bV96ZXJvcyA9IDA7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gYWxyaWdodCB3ZSBjYW4gbWFrZSB0aGUgZmluYWwgb3V0cHV0IGJ1ZmZlcgotICAgIHNjb3BlZF9hcnJheTx1aW50OD4gYnVmKG5ldyB1aW50OFtieXRlbGlzdC5zaXplKCldKTsKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIGZvciAoc3RkOjpsaXN0PHVpbnQ4Pjo6aXRlcmF0b3IgaXQgPSBieXRlbGlzdC5iZWdpbigpOyBpdCAhPSBieXRlbGlzdC5lbmQoKTsKLSAgICAgICAgIGl0KyspIHsKLSAgICAgIGJ1ZltpbmRleF0gPSAqaXQ7Ci0gICAgICBpbmRleCsrOwotICAgIH0KLSAgICBidWZmZXJfc2l6ZV9vdXQgPSBieXRlbGlzdC5zaXplKCk7Ci0gICAgcmV0dXJuIGJ1Zi5QYXNzKCk7Ci0gIH0KLX07Ci0KLVRFU1RfRihTaGVsbFJCU1BTdHJlYW1UZXN0LCBSZWFkVUVWKSB7Ci0gIHN0ZDo6bGlzdDxib29sPiBmaWJiaXRzOwotICAvLyBlbmNvZGUgZmlyc3QgNDcgRmlib25hY2NpIG51bWJlcnMKLSAgdWludDMyIGZfbl9taW51c18yID0gMDsKLSAgRW5jb2RlVUVWKGZfbl9taW51c18yLCBmaWJiaXRzKTsKLSAgdWludDMyIGZfbl9taW51c18xID0gMTsKLSAgRW5jb2RlVUVWKGZfbl9taW51c18xLCBmaWJiaXRzKTsKLSAgZm9yIChpbnQgaSA9IDI7IGkgPCA0NzsgaSsrKSB7Ci0gICAgdWludDMyIGZfbiA9IGZfbl9taW51c18xICsgZl9uX21pbnVzXzI7Ci0gICAgRW5jb2RlVUVWKGZfbiwgZmliYml0cyk7Ci0gICAgLy8gdXBkYXRlIHZhbHVlcwotICAgIGZfbl9taW51c18yID0gZl9uX21pbnVzXzE7Ci0gICAgZl9uX21pbnVzXzEgPSBmX247Ci0gIH0KLSAgLy8gY29udmVydCB0byBidWZmZXIKLSAgc2l6ZV90IGZpYl9idWZmZXJfc2l6ZSA9IDA7Ci0gIHNjb3BlZF9hcnJheTx1aW50OD4gZmliX2J1ZmZlciA9Ci0gICAgICBTZXJpYWxpemVUb0J1ZmZlcihmaWJiaXRzLCB0cnVlLCBmaWJfYnVmZmVyX3NpemUpOwotICBzaXplX3QgZmliX2J1ZmZlcl9ub19zZXF1ZW5jZV9zaXplOwotICBzY29wZWRfYXJyYXk8dWludDg+IGZpYl9idWZmZXJfbm9fc2VxdWVuY2UgPQotICAgICAgU2VyaWFsaXplVG9CdWZmZXIoZmliYml0cywgZmFsc2UsIGZpYl9idWZmZXJfbm9fc2VxdWVuY2Vfc2l6ZSk7Ci0gIFNoZWxsUkJTUFN0cmVhbSBmaWJfc3RyZWFtKGZpYl9idWZmZXIuZ2V0KCksIGZpYl9idWZmZXJfc2l6ZSk7Ci0gIFNoZWxsUkJTUFN0cmVhbSBmaWJfc3RyZWFtX25vX3NlcXVlbmNlKGZpYl9idWZmZXJfbm9fc2VxdWVuY2UuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpYl9idWZmZXJfbm9fc2VxdWVuY2Vfc2l6ZSk7Ci0gIC8vIGRlc2VyaWFsaXplIHRoZSBzYW1lIHNlcXVlbmNlIGZyb20gYm90aCBidWZmZXJzCi0gIHVpbnQzMiB1ZXYgPSAwOwotICB1aW50MzIgdWV2X24gPSAwOwotICBmX25fbWludXNfMiA9IDA7Ci0gIEFTU0VSVF9UUlVFKGZpYl9zdHJlYW0uUmVhZFVFVih1ZXYpKTsKLSAgQVNTRVJUX0VRKHVldiwgZl9uX21pbnVzXzIpOwotICBBU1NFUlRfVFJVRShmaWJfc3RyZWFtX25vX3NlcXVlbmNlLlJlYWRVRVYodWV2X24pKTsKLSAgQVNTRVJUX0VRKHVldl9uLCBmX25fbWludXNfMik7Ci0KLSAgZl9uX21pbnVzXzEgPSAxOwotICBBU1NFUlRfVFJVRShmaWJfc3RyZWFtLlJlYWRVRVYodWV2KSk7Ci0gIEFTU0VSVF9FUSh1ZXYsIGZfbl9taW51c18xKTsKLSAgQVNTRVJUX1RSVUUoZmliX3N0cmVhbV9ub19zZXF1ZW5jZS5SZWFkVUVWKHVldl9uKSk7Ci0gIEFTU0VSVF9FUSh1ZXZfbiwgZl9uX21pbnVzXzEpOwotCi0gIGZvciAoaW50IGkgPSAyOyBpIDwgNDc7IGkrKykgewotICAgIHVpbnQzMiBmX24gPSBmX25fbWludXNfMSArIGZfbl9taW51c18yOwotICAgIEFTU0VSVF9UUlVFKGZpYl9zdHJlYW0uUmVhZFVFVih1ZXYpKTsKLSAgICBBU1NFUlRfRVEodWV2LCBmX24pOwotICAgIEFTU0VSVF9UUlVFKGZpYl9zdHJlYW1fbm9fc2VxdWVuY2UuUmVhZFVFVih1ZXZfbikpOwotICAgIEFTU0VSVF9FUSh1ZXZfbiwgZl9uKTsKLSAgICBmX25fbWludXNfMiA9IGZfbl9taW51c18xOwotICAgIGZfbl9taW51c18xID0gZl9uOwotICB9Ci0gIC8vIHN1YnNlcXVlbnQgY2FsbCB0byBSZWFkVUVWIHNob3VsZCBmYWlsCi0gIEFTU0VSVF9GQUxTRShmaWJfc3RyZWFtLlJlYWRVRVYodWV2KSk7Ci0gIEFTU0VSVF9GQUxTRShmaWJfc3RyZWFtX25vX3NlcXVlbmNlLlJlYWRVRVYodWV2X24pKTsKLX0KLQotVEVTVF9GKFNoZWxsUkJTUFN0cmVhbVRlc3QsIFJlYWRTRVYpIHsKLSAgc3RkOjpsaXN0PGJvb2w+IGx1Y2FzYml0czsKLSAgLy8gZW5jb2RlIGZpcnN0IDQ0IEx1Y2FzIG51bWJlcnMgd2l0aCBhbHRlcm5hdGluZyBzaWduCi0gIGludDMyIGxfbl9taW51c18yID0gMTsKLSAgRW5jb2RlU0VWKGxfbl9taW51c18yLCBsdWNhc2JpdHMpOwotICBpbnQzMiBsX25fbWludXNfMSA9IDI7Ci0gIEVuY29kZVNFVigtbF9uX21pbnVzXzEsIGx1Y2FzYml0cyk7Ci0gIGZvciAoaW50IGkgPSAyOyBpIDwgNDQ7ICsraSkgewotICAgIGludDMyIGxfbiA9IGxfbl9taW51c18xICsgbF9uX21pbnVzXzI7Ci0gICAgaWYgKGkgJSAyKSB7Ci0gICAgICBFbmNvZGVTRVYoLWxfbiwgbHVjYXNiaXRzKTsKLSAgICB9IGVsc2UgewotICAgICAgRW5jb2RlU0VWKGxfbiwgbHVjYXNiaXRzKTsKLSAgICB9Ci0gICAgbF9uX21pbnVzXzIgPSBsX25fbWludXNfMTsKLSAgICBsX25fbWludXNfMSA9IGxfbjsKLSAgfQotICAvLyBjb252ZXJ0IHRvIGJ1ZmZlcnMKLSAgc2l6ZV90IGx1Y2FzX3NlcV9idWZmZXJfc2l6ZSA9IDA7Ci0gIHNjb3BlZF9hcnJheTx1aW50OD4gbHVjYXNfc2VxX2J1ZmZlciA9Ci0gICAgICBTZXJpYWxpemVUb0J1ZmZlcihsdWNhc2JpdHMsIHRydWUsIGx1Y2FzX3NlcV9idWZmZXJfc2l6ZSk7Ci0gIHNpemVfdCBsdWNhc19kZXNlcV9idWZmZXJfc2l6ZSA9IDA7Ci0gIHNjb3BlZF9hcnJheTx1aW50OD4gbHVjYXNfZGVzZXFfYnVmZmVyID0KLSAgICAgIFNlcmlhbGl6ZVRvQnVmZmVyKGx1Y2FzYml0cywgZmFsc2UsIGx1Y2FzX2Rlc2VxX2J1ZmZlcl9zaXplKTsKLSAgU2hlbGxSQlNQU3RyZWFtIGx1Y2FzX3NlcV9zdHJlYW0obHVjYXNfc2VxX2J1ZmZlci5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHVjYXNfc2VxX2J1ZmZlcl9zaXplKTsKLSAgU2hlbGxSQlNQU3RyZWFtIGx1Y2FzX2Rlc2VxX3N0cmVhbShsdWNhc19kZXNlcV9idWZmZXIuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHVjYXNfZGVzZXFfYnVmZmVyX3NpemUpOwotICBsX25fbWludXNfMiA9IDE7Ci0gIGxfbl9taW51c18xID0gMjsKLSAgaW50MzIgc2V2ID0gMDsKLSAgaW50MzIgc2V2X24gPSAwOwotICBBU1NFUlRfVFJVRShsdWNhc19zZXFfc3RyZWFtLlJlYWRTRVYoc2V2KSk7Ci0gIEFTU0VSVF9FUShzZXYsIDEpOwotICBBU1NFUlRfVFJVRShsdWNhc19kZXNlcV9zdHJlYW0uUmVhZFNFVihzZXZfbikpOwotICBBU1NFUlRfRVEoc2V2X24sIDEpOwotICBBU1NFUlRfVFJVRShsdWNhc19zZXFfc3RyZWFtLlJlYWRTRVYoc2V2KSk7Ci0gIEFTU0VSVF9FUShzZXYsIC0yKTsKLSAgQVNTRVJUX1RSVUUobHVjYXNfZGVzZXFfc3RyZWFtLlJlYWRTRVYoc2V2X24pKTsKLSAgQVNTRVJUX0VRKHNldl9uLCAtMik7Ci0gIGZvciAoaW50IGkgPSAyOyBpIDwgNDQ7ICsraSkgewotICAgIGludDMyIGxfbiA9IGxfbl9taW51c18xICsgbF9uX21pbnVzXzI7Ci0gICAgQVNTRVJUX1RSVUUobHVjYXNfc2VxX3N0cmVhbS5SZWFkU0VWKHNldikpOwotICAgIEFTU0VSVF9UUlVFKGx1Y2FzX2Rlc2VxX3N0cmVhbS5SZWFkU0VWKHNldl9uKSk7Ci0gICAgaWYgKGkgJSAyKSB7Ci0gICAgICBBU1NFUlRfRVEoLXNldiwgbF9uKTsKLSAgICAgIEFTU0VSVF9FUSgtc2V2X24sIGxfbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFTU0VSVF9FUShzZXYsIGxfbik7Ci0gICAgICBBU1NFUlRfRVEoc2V2X24sIGxfbik7Ci0gICAgfQotICAgIGxfbl9taW51c18yID0gbF9uX21pbnVzXzE7Ci0gICAgbF9uX21pbnVzXzEgPSBsX247Ci0gIH0KLSAgLy8gc3Vic2VxdWVudCBjYWxscyB0byBSZWFkU0VWIHNob3VsZCBmYWlsCi0gIEFTU0VSVF9GQUxTRShsdWNhc19zZXFfc3RyZWFtLlJlYWRTRVYoc2V2KSk7Ci0gIEFTU0VSVF9GQUxTRShsdWNhc19kZXNlcV9zdHJlYW0uUmVhZFNFVihzZXZfbikpOwotfQotCi1zdGF0aWMgY29uc3QgdWludDgga1Rlc3RSQlNQRXhwR29sb21iVG9vQmlnW10gPSB7Ci0gICAgLy8gMTUgbGVhZGluZyB6ZXJvcywgc2hvdWxkIGJlIGZpbmUKLSAgICAvLyAwMDAwMDAwMDAwMDAwMDAxMDEwMTAxMDEwMTAxMDEwCi0gICAgLy8gID0gMl4xNSAtIDEgICsgcmVhZF9iaXRzKDAxMDEwMTAxMDEwMTAxMCkKLSAgICAvLyAgPSAzMjc2OCAtIDEgKyAxMDkyMiA9IDQzNjg5IHVuc2lnbmVkLCAyMTg0NSBzaWduZWQKLSAgICAvLyAwMDAwIDAwMDAgMDAwMCAwMDAxIDAxMDEgMDEwMSAwMTAxIDAxMCswIChmaXJzdCAwIG9mIG5leHQgbnVtYmVyKQotICAgIDB4MDAsIDB4MDEsIDB4NTUsIDB4NTQsCi0gICAgLy8gMzEgbGVhZGluZyB6ZXJvcywgc2hvdWxkIGJlIGZpbmUKLSAgICAvLyAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKLSAgICAvLyAgPSAyXjMxIC0gMSArIDEgPSAyMTQ3NDgzNjQ4IHVuc2lnbmVkLCAtMTA3Mzc0MTgyNCBzaWduZWQKLSAgICAvLyAwIGFwcGVuZGVkIG9uIHRvIGxhc3QgYnl0ZQotICAgIC8vIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAxMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMAotICAgIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsCi0gICAgLy8gMDAwMCAwMSswMCAoZmlyc3QgMiB6ZXJvcyBvZiBuZXh0IG51bWJlcikKLSAgICAweDA0LAotICAgIC8vIDMyIGxlYWRpbmcgemVyb3MsIHNob3VsZCBub3QgYmUgb2sKLSAgICAvLyAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQotICAgIC8vID0gMl4zMiAtIDEgKyAyXjMyID0gMl4zMyAtIDEgPSA4NTg5OTM0NTkxCi0gICAgLy8gMDAgYXBwZW5kZWQgb24gdG8gbGFzdCBieXRlCi0gICAgLy8gMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDExIDExMTEgMTExMSAxMTExIDExMTEgMTExMSAxMTExCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMywgMHhmZiwgMHhmZiwgMHhmZiwKLSAgICAvLyAxMTExIDExMSswICh0byBjb21wbGV0ZSB0aGUgYnl0ZSkKLSAgICAweGZlfTsKLQotVEVTVF9GKFNoZWxsUkJTUFN0cmVhbVRlc3QsIFJlYWRVRVZUb29MYXJnZSkgewotICAvLyBjb25zdHJ1Y3QgYSBzdHJlYW0gZnJvbSB0aGUgc3VwcGxpZWQgdGVzdCBkYXRhCi0gIFNoZWxsUkJTUFN0cmVhbSB1ZXZfdG9vX2JpZyhrVGVzdFJCU1BFeHBHb2xvbWJUb29CaWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa1Rlc3RSQlNQRXhwR29sb21iVG9vQmlnKSk7Ci0gIC8vIGZpcnN0IGNhbGwgc2hvdWxkIHN1Y2NlZWQKLSAgdWludDMyIHVldiA9IDA7Ci0gIEFTU0VSVF9UUlVFKHVldl90b29fYmlnLlJlYWRVRVYodWV2KSk7Ci0gIEFTU0VSVF9FUSh1ZXYsIDQzNjg5KTsKLSAgLy8gYXMgc2hvdWxkIHRoZSBzZWNvbmQgY2FsbAotICBBU1NFUlRfVFJVRSh1ZXZfdG9vX2JpZy5SZWFkVUVWKHVldikpOwotICBBU1NFUlRfRVEodWV2LCAyMTQ3NDgzNjQ4dSk7Ci0gIC8vIHRoaXJkIHNob3VsZCBmYWlsCi0gIEFTU0VSVF9GQUxTRSh1ZXZfdG9vX2JpZy5SZWFkVUVWKHVldikpOwotfQotCi1URVNUX0YoU2hlbGxSQlNQU3RyZWFtVGVzdCwgUmVhZFNFVlRvb0xhcmdlKSB7Ci0gIC8vIGNvbnN0cnVjdCBhIHN0cmVhbSBmcm9tIHRoZSBzdXBwbGllZCB0ZXN0IGRhdGEKLSAgU2hlbGxSQlNQU3RyZWFtIHNldl90b29fYmlnKGtUZXN0UkJTUEV4cEdvbG9tYlRvb0JpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrVGVzdFJCU1BFeHBHb2xvbWJUb29CaWcpKTsKLSAgLy8gZmlyc3QgY2FsbCBzaG91bGQgc3VjY2VlZAotICBpbnQzMiBzZXYgPSAwOwotICBBU1NFUlRfVFJVRShzZXZfdG9vX2JpZy5SZWFkU0VWKHNldikpOwotICBBU1NFUlRfRVEoc2V2LCAyMTg0NSk7Ci0gIC8vIGFzIHNob3VsZCB0aGUgc2Vjb25kIGNhbGwKLSAgQVNTRVJUX1RSVUUoc2V2X3Rvb19iaWcuUmVhZFNFVihzZXYpKTsKLSAgQVNTRVJUX0VRKHNldiwgLTEwNzM3NDE4MjQpOwotICAvLyB0aGlyZCBzaG91bGQgZmFpbAotICBBU1NFUlRfRkFMU0Uoc2V2X3Rvb19iaWcuUmVhZFNFVihzZXYpKTsKLX0KLQotVEVTVF9GKFNoZWxsUkJTUFN0cmVhbVRlc3QsIFJlYWRCaXQpIHsKLSAgc3RkOjpsaXN0PGJvb2w+IHBhZGRlZF9vbmVzOwotICAvLyBidWlsZCBhIGJpdGZpZWxkIG9mIDEgcGFkZGVkIGJ5IG4gemVyb3MsIGZvciBuIGluIHJhbmdlWzAsIDEwMjRdCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTAyNDsgaSsrKSB7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKLSAgICAgIHBhZGRlZF9vbmVzLnB1c2hfYmFjayhmYWxzZSk7Ci0gICAgfQotICAgIHBhZGRlZF9vbmVzLnB1c2hfYmFjayh0cnVlKTsKLSAgfQotICAvLyBidWlsZCB0aGUgYnVmZmVyIHdpdGggc2VxdWVuY2UgYml0cyBhbmQgd2l0aG91dAotICBzaXplX3Qgc2VxdWVuY2VfYnVmZl9zaXplID0gMDsKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiBzZXF1ZW5jZV9idWZmID0KLSAgICAgIFNlcmlhbGl6ZVRvQnVmZmVyKHBhZGRlZF9vbmVzLCB0cnVlLCBzZXF1ZW5jZV9idWZmX3NpemUpOwotICBTaGVsbFJCU1BTdHJlYW0gc2VxX3N0cmVhbShzZXF1ZW5jZV9idWZmLmdldCgpLCBzZXF1ZW5jZV9idWZmX3NpemUpOwotCi0gIHNpemVfdCBkZXNlcXVlbmNlX2J1ZmZfc2l6ZSA9IDA7Ci0gIHNjb3BlZF9hcnJheTx1aW50OD4gZGVzZXF1ZW5jZV9idWZmID0KLSAgICAgIFNlcmlhbGl6ZVRvQnVmZmVyKHBhZGRlZF9vbmVzLCBmYWxzZSwgZGVzZXF1ZW5jZV9idWZmX3NpemUpOwotICBTaGVsbFJCU1BTdHJlYW0gZGVzZXFfc3RyZWFtKGRlc2VxdWVuY2VfYnVmZi5nZXQoKSwgZGVzZXF1ZW5jZV9idWZmX3NpemUpOwotICBmb3IgKHN0ZDo6bGlzdDxib29sPjo6aXRlcmF0b3IgaXQgPSBwYWRkZWRfb25lcy5iZWdpbigpOwotICAgICAgIGl0ICE9IHBhZGRlZF9vbmVzLmVuZCgpOyArK2l0KSB7Ci0gICAgdWludDggYml0ID0gMDsKLSAgICBBU1NFUlRfVFJVRShzZXFfc3RyZWFtLlJlYWRCaXQoYml0KSk7Ci0gICAgQVNTRVJUX0VRKCppdCwgYml0KTsKLSAgICB1aW50OCBkZXNlcV9iaXQgPSAwOwotICAgIEFTU0VSVF9UUlVFKGRlc2VxX3N0cmVhbS5SZWFkQml0KGRlc2VxX2JpdCkpOwotICAgIEFTU0VSVF9FUSgqaXQsIGRlc2VxX2JpdCk7Ci0gIH0KLQotICAvLyB0aGVyZSBzaG91bGQgYmUgbGVzcyB0aGFuIGEgYnl0ZSBpbiB0aGUgZWl0aGVyIHN0cmVhbQotICB1aW50OCBmYWlsX2J5dGUgPSAwOwotICBBU1NFUlRfRkFMU0Uoc2VxX3N0cmVhbS5SZWFkQnl0ZShmYWlsX2J5dGUpKTsKLSAgQVNTRVJUX0ZBTFNFKGRlc2VxX3N0cmVhbS5SZWFkQnl0ZShmYWlsX2J5dGUpKTsKLX0KLQotVEVTVF9GKFNoZWxsUkJTUFN0cmVhbVRlc3QsIFJlYWRCeXRlKSB7Ci0gIC8vIGJ1aWxkIGEgZmllbGQgb2YgMTYgeCAoMHhhYSBieXRlIGZvbGxvd2VkIGJ5IDAgYml0KQotICBzdGQ6Omxpc3Q8Ym9vbD4gYWFfZmllbGQ7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7ICsraSkgewotICAgIGZvciAoaW50IGogPSAwOyBqIDwgODsgKytqKSB7Ci0gICAgICBhYV9maWVsZC5wdXNoX2JhY2soIShqICUgMikpOwotICAgIH0KLSAgICBhYV9maWVsZC5wdXNoX2JhY2soZmFsc2UpOwotICB9Ci0gIC8vIGRlc2VxYnVmZiB3aWxsIGJlIGlkZW50aWNhbCBkdWUgdG8gZGVuc2UgcGFja2luZyBvZiAwMSBwYXR0ZXJuCi0gIHNpemVfdCBhYWJ1ZmZfc2l6ZSA9IDA7Ci0gIHNjb3BlZF9hcnJheTx1aW50OD4gYWFidWZmID0gU2VyaWFsaXplVG9CdWZmZXIoYWFfZmllbGQsIHRydWUsIGFhYnVmZl9zaXplKTsKLSAgU2hlbGxSQlNQU3RyZWFtIGFhX3N0cmVhbShhYWJ1ZmYuZ2V0KCksIGFhYnVmZl9zaXplKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgKytpKSB7Ci0gICAgdWludDggYWEgPSAwOwotICAgIEFTU0VSVF9UUlVFKGFhX3N0cmVhbS5SZWFkQnl0ZShhYSkpOwotICAgIEFTU0VSVF9FUShhYSwgMHhhYSk7Ci0gICAgLy8gcmVhZCB0aGUgemVybyBzZXBhcmF0b3IgYml0Ci0gICAgdWludDggemVybyA9IDA7Ci0gICAgQVNTRVJUX1RSVUUoYWFfc3RyZWFtLlJlYWRCaXQoemVybykpOwotICAgIEFTU0VSVF9FUSh6ZXJvLCAwKTsKLSAgfQotCi0gIC8vIGJ1aWxkIGEgZmllbGQgb2YgMjQgeCAoMSBiaXQsIDQgYnl0ZXMgb2YgMCwgb25lIDAzIGJ5dGUsIDQgYnl0ZXMgb2YgMCkKLSAgc3RkOjpsaXN0PGJvb2w+IHplcm9fZmllbGQ7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMjQ7ICsraSkgewotICAgIHplcm9fZmllbGQucHVzaF9iYWNrKHRydWUpOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzI7ICsraikgewotICAgICAgemVyb19maWVsZC5wdXNoX2JhY2soZmFsc2UpOwotICAgIH0KLSAgICB6ZXJvX2ZpZWxkLnB1c2hfYmFjayhmYWxzZSk7Ci0gICAgemVyb19maWVsZC5wdXNoX2JhY2soZmFsc2UpOwotICAgIHplcm9fZmllbGQucHVzaF9iYWNrKGZhbHNlKTsKLSAgICB6ZXJvX2ZpZWxkLnB1c2hfYmFjayhmYWxzZSk7Ci0gICAgemVyb19maWVsZC5wdXNoX2JhY2soZmFsc2UpOwotICAgIHplcm9fZmllbGQucHVzaF9iYWNrKGZhbHNlKTsKLSAgICB6ZXJvX2ZpZWxkLnB1c2hfYmFjayh0cnVlKTsKLSAgICB6ZXJvX2ZpZWxkLnB1c2hfYmFjayh0cnVlKTsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IDMyOyArK2opIHsKLSAgICAgIHplcm9fZmllbGQucHVzaF9iYWNrKGZhbHNlKTsKLSAgICB9Ci0gIH0KLSAgc2l6ZV90IHpzZXFidWZmX3NpemUgPSAwOwotICBzY29wZWRfYXJyYXk8dWludDg+IHpzZXFidWZmID0KLSAgICAgIFNlcmlhbGl6ZVRvQnVmZmVyKHplcm9fZmllbGQsIHRydWUsIHpzZXFidWZmX3NpemUpOwotICBTaGVsbFJCU1BTdHJlYW0genNlcV9zdHJlYW0oenNlcWJ1ZmYuZ2V0KCksIHpzZXFidWZmX3NpemUpOwotICBzaXplX3QgemRzZXFidWZmX3NpemUgPSAwOwotICBzY29wZWRfYXJyYXk8dWludDg+IHpkc2VxYnVmZiA9Ci0gICAgICBTZXJpYWxpemVUb0J1ZmZlcih6ZXJvX2ZpZWxkLCBmYWxzZSwgemRzZXFidWZmX3NpemUpOwotICBTaGVsbFJCU1BTdHJlYW0gemRzZXFfc3RyZWFtKHpkc2VxYnVmZi5nZXQoKSwgemRzZXFidWZmX3NpemUpOwotICBmb3IgKGludCBpID0gMDsgaSA8IDI0OyArK2kpIHsKLSAgICAvLyByZWFkIHRoZSBsZWFkaW5nIDEgYml0Ci0gICAgdWludDggc2VxX2JpdCA9IDA7Ci0gICAgQVNTRVJUX1RSVUUoenNlcV9zdHJlYW0uUmVhZEJpdChzZXFfYml0KSk7Ci0gICAgQVNTRVJUX0VRKHNlcV9iaXQsIDEpOwotICAgIHVpbnQ4IGRzZXFfYml0ID0gMDsKLSAgICBBU1NFUlRfVFJVRSh6ZHNlcV9zdHJlYW0uUmVhZEJpdChkc2VxX2JpdCkpOwotICAgIEFTU0VSVF9FUShkc2VxX2JpdCwgMSk7Ci0gICAgLy8gcmVhZCA0IHplcm9zCi0gICAgdWludDggc2VxX2J5dGUgPSAwOwotICAgIEFTU0VSVF9UUlVFKHpzZXFfc3RyZWFtLlJlYWRCeXRlKHNlcV9ieXRlKSk7Ci0gICAgQVNTRVJUX0VRKHNlcV9ieXRlLCAwKTsKLSAgICBBU1NFUlRfVFJVRSh6c2VxX3N0cmVhbS5SZWFkQnl0ZShzZXFfYnl0ZSkpOwotICAgIEFTU0VSVF9FUShzZXFfYnl0ZSwgMCk7Ci0gICAgQVNTRVJUX1RSVUUoenNlcV9zdHJlYW0uUmVhZEJ5dGUoc2VxX2J5dGUpKTsKLSAgICBBU1NFUlRfRVEoc2VxX2J5dGUsIDApOwotICAgIEFTU0VSVF9UUlVFKHpzZXFfc3RyZWFtLlJlYWRCeXRlKHNlcV9ieXRlKSk7Ci0gICAgQVNTRVJUX0VRKHNlcV9ieXRlLCAwKTsKLSAgICB1aW50OCBkc2VxX2J5dGUgPSAwOwotICAgIEFTU0VSVF9UUlVFKHpkc2VxX3N0cmVhbS5SZWFkQnl0ZShkc2VxX2J5dGUpKTsKLSAgICBBU1NFUlRfRVEoZHNlcV9ieXRlLCAwKTsKLSAgICBBU1NFUlRfVFJVRSh6ZHNlcV9zdHJlYW0uUmVhZEJ5dGUoZHNlcV9ieXRlKSk7Ci0gICAgQVNTRVJUX0VRKGRzZXFfYnl0ZSwgMCk7Ci0gICAgQVNTRVJUX1RSVUUoemRzZXFfc3RyZWFtLlJlYWRCeXRlKGRzZXFfYnl0ZSkpOwotICAgIEFTU0VSVF9FUShkc2VxX2J5dGUsIDApOwotICAgIEFTU0VSVF9UUlVFKHpkc2VxX3N0cmVhbS5SZWFkQnl0ZShkc2VxX2J5dGUpKTsKLSAgICBBU1NFUlRfRVEoZHNlcV9ieXRlLCAwKTsKLSAgICAvLyByZWFkIHRoZSAzCi0gICAgQVNTRVJUX1RSVUUoenNlcV9zdHJlYW0uUmVhZEJ5dGUoc2VxX2J5dGUpKTsKLSAgICBBU1NFUlRfRVEoc2VxX2J5dGUsIDB4MDMpOwotICAgIEFTU0VSVF9UUlVFKHpkc2VxX3N0cmVhbS5SZWFkQnl0ZShkc2VxX2J5dGUpKTsKLSAgICBBU1NFUlRfRVEoZHNlcV9ieXRlLCAweDAzKTsKLSAgICAvLyByZWFkIHRoZSByZW1haW5pbmcgNCB6ZXJvcwotICAgIEFTU0VSVF9UUlVFKHpzZXFfc3RyZWFtLlJlYWRCeXRlKHNlcV9ieXRlKSk7Ci0gICAgQVNTRVJUX0VRKHNlcV9ieXRlLCAwKTsKLSAgICBBU1NFUlRfVFJVRSh6c2VxX3N0cmVhbS5SZWFkQnl0ZShzZXFfYnl0ZSkpOwotICAgIEFTU0VSVF9FUShzZXFfYnl0ZSwgMCk7Ci0gICAgQVNTRVJUX1RSVUUoenNlcV9zdHJlYW0uUmVhZEJ5dGUoc2VxX2J5dGUpKTsKLSAgICBBU1NFUlRfRVEoc2VxX2J5dGUsIDApOwotICAgIEFTU0VSVF9UUlVFKHpzZXFfc3RyZWFtLlJlYWRCeXRlKHNlcV9ieXRlKSk7Ci0gICAgQVNTRVJUX0VRKHNlcV9ieXRlLCAwKTsKLSAgICBBU1NFUlRfVFJVRSh6ZHNlcV9zdHJlYW0uUmVhZEJ5dGUoZHNlcV9ieXRlKSk7Ci0gICAgQVNTRVJUX0VRKGRzZXFfYnl0ZSwgMCk7Ci0gICAgQVNTRVJUX1RSVUUoemRzZXFfc3RyZWFtLlJlYWRCeXRlKGRzZXFfYnl0ZSkpOwotICAgIEFTU0VSVF9FUShkc2VxX2J5dGUsIDApOwotICAgIEFTU0VSVF9UUlVFKHpkc2VxX3N0cmVhbS5SZWFkQnl0ZShkc2VxX2J5dGUpKTsKLSAgICBBU1NFUlRfRVEoZHNlcV9ieXRlLCAwKTsKLSAgICBBU1NFUlRfVFJVRSh6ZHNlcV9zdHJlYW0uUmVhZEJ5dGUoZHNlcV9ieXRlKSk7Ci0gICAgQVNTRVJUX0VRKGRzZXFfYnl0ZSwgMCk7Ci0gIH0KLX0KLQotVEVTVF9GKFNoZWxsUkJTUFN0cmVhbVRlc3QsIFJlYWRCaXRzKSB7Ci0gIC8vIHRlc3QgdGhlIGFzc2VydGlvbiBpbiB0aGUgUmVhZEJpdHMgY29tbWVudCwgYXMgaXQgaGFkIGEgYnVnIDopCi0gIHN0ZDo6bGlzdDxib29sPiBzZXZlbnRlZW5fb25lczsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNzsgKytpKSB7Ci0gICAgc2V2ZW50ZWVuX29uZXMucHVzaF9iYWNrKHRydWUpOwotICB9Ci0gIHNpemVfdCBzZXZlbnRlZW5fb25lc19zaXplID0gMDsKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiBzZXZlbnRlZW5fb25lc19idWZmID0KLSAgICAgIFNlcmlhbGl6ZVRvQnVmZmVyKHNldmVudGVlbl9vbmVzLCBmYWxzZSwgc2V2ZW50ZWVuX29uZXNfc2l6ZSk7Ci0gIFNoZWxsUkJTUFN0cmVhbSBzZXZlbnRlZW5fb25lc19zdHJlYW0oc2V2ZW50ZWVuX29uZXNfYnVmZi5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXZlbnRlZW5fb25lc19zaXplKTsKLSAgdWludDMyIHNldmVudGVlbl9vbmVzX3dvcmQgPSAwOwotICBBU1NFUlRfVFJVRShzZXZlbnRlZW5fb25lc19zdHJlYW0uUmVhZEJpdHMoMTcsIHNldmVudGVlbl9vbmVzX3dvcmQpKTsKLSAgQVNTRVJUX0VRKHNldmVudGVlbl9vbmVzX3dvcmQsIDB4MDAwMWZmZmYpOwotCi0gIC8vIHNlcmlhbGl6ZSBhbGwgcG93ZXJzIG9mIHR3byBmcm9tIDJeMCB0byAyXjMxCi0gIHN0ZDo6bGlzdDxib29sPiBwb3dzOwotICBmb3IgKGludCBpID0gMDsgaSA8IDMyOyArK2kpIHsKLSAgICBwb3dzLnB1c2hfYmFjayh0cnVlKTsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IGk7ICsraikgewotICAgICAgcG93cy5wdXNoX2JhY2soZmFsc2UpOwotICAgIH0KLSAgfQotICBzaXplX3QgcG93c19zaXplID0gMDsKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiBwb3dzX2J1ZmYgPSBTZXJpYWxpemVUb0J1ZmZlcihwb3dzLCB0cnVlLCBwb3dzX3NpemUpOwotICBTaGVsbFJCU1BTdHJlYW0gcG93c19zdHJlYW0ocG93c19idWZmLmdldCgpLCBwb3dzX3NpemUpOwotICAvLyBSZWFkQml0cygwKSBzaG91bGQgc3VjY2VlZCBhbmQgbm90IG1vZGlmeSB0aGUgdmFsdWUgb2YgdGhlIHJlZiBvdXRwdXQgb3IKLSAgLy8gaW50ZXJuYWwgYml0IGl0ZXJhdG9yCi0gIHVpbnQzMiBkb250X3RvdWNoID0gMHhmZWVkZmVlZDsKLSAgQVNTRVJUX1RSVUUocG93c19zdHJlYW0uUmVhZEJpdHMoMCwgZG9udF90b3VjaCkpOwotICBBU1NFUlRfRVEoZG9udF90b3VjaCwgMHhmZWVkZmVlZCk7Ci0gIC8vIGNvbXBhcmUgZGVzZXJpYWxpemF0aW9ucwotICBmb3IgKGludCBpID0gMDsgaSA8IDMyOyArK2kpIHsKLSAgICB1aW50MzIgYml0cyA9IDA7Ci0gICAgQVNTRVJUX1RSVUUocG93c19zdHJlYW0uUmVhZEJpdHMoaSArIDEsIGJpdHMpKTsKLSAgICBBU1NFUlRfRVEoYml0cywgKHVpbnQzMikoMSA8PCBpKSk7Ci0gIH0KLX0KLQotVEVTVF9GKFNoZWxsUkJTUFN0cmVhbVRlc3QsIFNraXBCeXRlcykgewotICAvLyBzZXJpYWxpemUgYWxsIG5pbmUtYml0IHZhbHVlcyBmcm9tIHplcm8gdG8gNTEyCi0gIHN0ZDo6bGlzdDxib29sPiBuaW5lczsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MTI7ICsraSkgewotICAgIGZvciAoaW50IGogPSA4OyBqID49IDA7IC0taikgewotICAgICAgbmluZXMucHVzaF9iYWNrKChpID4+IGopICYgMSk7Ci0gICAgfQotICB9Ci0gIHNpemVfdCBuaW5lc19zaXplID0gMDsKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiBuaW5lc19idWZmID0gU2VyaWFsaXplVG9CdWZmZXIobmluZXMsIHRydWUsIG5pbmVzX3NpemUpOwotICBzaXplX3QgbmluZXNfZGVzZXFfc2l6ZSA9IDA7Ci0gIHNjb3BlZF9hcnJheTx1aW50OD4gbmluZXNfZGVzZXFfYnVmZiA9Ci0gICAgICBTZXJpYWxpemVUb0J1ZmZlcihuaW5lcywgZmFsc2UsIG5pbmVzX2Rlc2VxX3NpemUpOwotICBTaGVsbFJCU1BTdHJlYW0gbmluZXNfc3RyZWFtKG5pbmVzX2J1ZmYuZ2V0KCksIG5pbmVzX3NpemUpOwotICBTaGVsbFJCU1BTdHJlYW0gbmluZXNfZGVzZXFfc3RyZWFtKG5pbmVzX2Rlc2VxX2J1ZmYuZ2V0KCksIG5pbmVzX2Rlc2VxX3NpemUpOwotICAvLyBpdGVyYXRlIHRocm91Z2ggc3RyZWFtcywgc2tpcHBpbmcgaW4gb25lIGFuZCByZWFkaW5nIGluIHRoZSBvdGhlciwgYWx3YXlzCi0gIC8vIGNvbXBhcmluZyB2YWx1ZXMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgNTEyOyArK2kpIHsKLSAgICBpZiAoaSAlIDIpIHsKLSAgICAgIEFTU0VSVF9UUlVFKG5pbmVzX3N0cmVhbS5Ta2lwQnl0ZXMoMSkpOwotICAgICAgdWludDggYml0ID0gMDsKLSAgICAgIEFTU0VSVF9UUlVFKG5pbmVzX3N0cmVhbS5SZWFkQml0KGJpdCkpOwotICAgICAgdWludDMyIG5pbmViaXRzID0gMDsKLSAgICAgIEFTU0VSVF9UUlVFKG5pbmVzX2Rlc2VxX3N0cmVhbS5SZWFkQml0cyg5LCBuaW5lYml0cykpOwotICAgICAgQVNTRVJUX0VRKG5pbmViaXRzLCBpKTsKLSAgICAgIEFTU0VSVF9FUShuaW5lYml0cyAmIDEsIGJpdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFTU0VSVF9UUlVFKG5pbmVzX2Rlc2VxX3N0cmVhbS5Ta2lwQnl0ZXMoMSkpOwotICAgICAgdWludDggYml0ID0gMDsKLSAgICAgIEFTU0VSVF9UUlVFKG5pbmVzX2Rlc2VxX3N0cmVhbS5SZWFkQml0KGJpdCkpOwotICAgICAgdWludDMyIG5pbmViaXRzID0gMDsKLSAgICAgIEFTU0VSVF9UUlVFKG5pbmVzX3N0cmVhbS5SZWFkQml0cyg5LCBuaW5lYml0cykpOwotICAgICAgQVNTRVJUX0VRKG5pbmViaXRzLCBpKTsKLSAgICAgIEFTU0VSVF9FUShuaW5lYml0cyAmIDEsIGJpdCk7Ci0gICAgfQotICB9Ci0gIC8vIDEgdHJ1ZSBiaXQgZm9sbG93ZWQgYnkgMSBieXRlIHdpdGggMSwgZm9sbG93ZWQgYnkgMSB0cnVlIGJpdCwgdGhlbiAyIGJ5dGVzCi0gIC8vIHdpdGggMiwgZm9sbG93ZWQgYnkgMSBiaXQsIHRoZW4gMyBieXRlcyB3aXRoIDMsIGV0YyB1cCB0byAyNTYKLSAgc3RkOjpsaXN0PGJvb2w+IHJ1bl9sZW5ndGg7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IGk7ICsraikgewotICAgICAgZm9yIChpbnQgayA9IDc7IGsgPj0gMDsgLS1rKSB7Ci0gICAgICAgIHJ1bl9sZW5ndGgucHVzaF9iYWNrKChpID4+IGspICYgMSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJ1bl9sZW5ndGgucHVzaF9iYWNrKHRydWUpOwotICB9Ci0gIHNpemVfdCBydW5fbGVuZ3RoX3NpemUgPSAwOwotICBzY29wZWRfYXJyYXk8dWludDg+IHJ1bl9sZW5ndGhfYnVmZiA9Ci0gICAgICBTZXJpYWxpemVUb0J1ZmZlcihydW5fbGVuZ3RoLCB0cnVlLCBydW5fbGVuZ3RoX3NpemUpOwotICBzaXplX3QgcnVuX2xlbmd0aF9kZXNlcV9zaXplID0gMDsKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiBydW5fbGVuZ3RoX2Rlc2VxX2J1ZmYgPQotICAgICAgU2VyaWFsaXplVG9CdWZmZXIocnVuX2xlbmd0aCwgZmFsc2UsIHJ1bl9sZW5ndGhfZGVzZXFfc2l6ZSk7Ci0gIFNoZWxsUkJTUFN0cmVhbSBydW5fbGVuZ3RoX3N0cmVhbShydW5fbGVuZ3RoX2J1ZmYuZ2V0KCksIHJ1bl9sZW5ndGhfc2l6ZSk7Ci0gIFNoZWxsUkJTUFN0cmVhbSBydW5fbGVuZ3RoX2Rlc2VxX3N0cmVhbShydW5fbGVuZ3RoX2Rlc2VxX2J1ZmYuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5fbGVuZ3RoX2Rlc2VxX3NpemUpOwotICAvLyByZWFkIGZpcnN0IGJpdCwgc2tpcCBmaXJzdCBieXRlIGZyb20gZWFjaCBzdHJlYW0sIHJlYWQgbmV4dCBiaXQKLSAgdWludDggYml0ID0gMDsKLSAgQVNTRVJUX1RSVUUocnVuX2xlbmd0aF9zdHJlYW0uUmVhZEJpdChiaXQpKTsKLSAgQVNTRVJUX0VRKGJpdCwgMSk7Ci0gIGJpdCA9IDA7Ci0gIEFTU0VSVF9UUlVFKHJ1bl9sZW5ndGhfZGVzZXFfc3RyZWFtLlJlYWRCaXQoYml0KSk7Ci0gIEFTU0VSVF9FUShiaXQsIDEpOwotICBBU1NFUlRfVFJVRShydW5fbGVuZ3RoX3N0cmVhbS5Ta2lwQnl0ZXMoMSkpOwotICBBU1NFUlRfVFJVRShydW5fbGVuZ3RoX2Rlc2VxX3N0cmVhbS5Ta2lwQnl0ZXMoMSkpOwotICBiaXQgPSAwOwotICBBU1NFUlRfVFJVRShydW5fbGVuZ3RoX3N0cmVhbS5SZWFkQml0KGJpdCkpOwotICBBU1NFUlRfRVEoYml0LCAxKTsKLSAgYml0ID0gMDsKLSAgQVNTRVJUX1RSVUUocnVuX2xlbmd0aF9kZXNlcV9zdHJlYW0uUmVhZEJpdChiaXQpKTsKLSAgQVNTRVJUX0VRKGJpdCwgMSk7Ci0KLSAgZm9yIChpbnQgaSA9IDI7IGkgPCAyNTY7ICsraSkgewotICAgIC8vIHJlYWQgZmlyc3QgYnl0ZSBpbiBzZXEgc3RyZWFtLCBtYWtlIHN1cmUgaXQgbWF0Y2hlcyB2YWx1ZQotICAgIHVpbnQ4IGJ5dGUgPSAwOwotICAgIEFTU0VSVF9UUlVFKHJ1bl9sZW5ndGhfc3RyZWFtLlJlYWRCeXRlKGJ5dGUpKTsKLSAgICBBU1NFUlRfRVEoYnl0ZSwgaSk7Ci0gICAgLy8gc2tpcCB0aGUgcmVzdCBvZiB0aGUgYnl0ZSBmaWVsZAotICAgIEFTU0VSVF9UUlVFKHJ1bl9sZW5ndGhfc3RyZWFtLlNraXBCeXRlcyhpIC0gMSkpOwotICAgIGJpdCA9IDA7Ci0gICAgLy8gcmVhZCB0aGUgc2VwYXJhdGluZyBvbmUgYml0Ci0gICAgQVNTRVJUX1RSVUUocnVuX2xlbmd0aF9zdHJlYW0uUmVhZEJpdChiaXQpKTsKLSAgICBBU1NFUlRfRVEoYml0LCAxKTsKLSAgICAvLyByZWFkIGxhc3QgYnl0ZSBpbiBkZXNlcSBzdHJlYW0sIHNvIHNraXAgYnl0ZXMgZmlyc3QKLSAgICBBU1NFUlRfVFJVRShydW5fbGVuZ3RoX2Rlc2VxX3N0cmVhbS5Ta2lwQnl0ZXMoaSAtIDEpKTsKLSAgICBieXRlID0gMDsKLSAgICBBU1NFUlRfVFJVRShydW5fbGVuZ3RoX2Rlc2VxX3N0cmVhbS5SZWFkQnl0ZShieXRlKSk7Ci0gICAgQVNTRVJUX0VRKGJ5dGUsIGkpOwotICAgIC8vIHJlYWQgdGhlIHNlcGFyYXRpbmcgb25lIGJpdAotICAgIGJpdCA9IDA7Ci0gICAgQVNTRVJUX1RSVUUocnVuX2xlbmd0aF9kZXNlcV9zdHJlYW0uUmVhZEJpdChiaXQpKTsKLSAgICBBU1NFUlRfRVEoYml0LCAxKTsKLSAgfQotCi0gIC8vIGZ1cnRoZXIgc2tpcHMgc2hvdWxkIGZhaWwKLSAgQVNTRVJUX0ZBTFNFKHJ1bl9sZW5ndGhfc3RyZWFtLlNraXBCeXRlcygxKSk7Ci0gIEFTU0VSVF9GQUxTRShydW5fbGVuZ3RoX2Rlc2VxX3N0cmVhbS5Ta2lwQnl0ZXMoMSkpOwotfQotCi1URVNUX0YoU2hlbGxSQlNQU3RyZWFtVGVzdCwgU2tpcEJpdHMpIHsKLSAgc3RkOjpsaXN0PGJvb2w+IG9uZV9vaHM7Ci0gIC8vIGVuY29kZSBvbmUgMSwgZm9sbG93ZWQgYnkgb25lIHplcm8sIGZvbGxvd2VkIGJ5IDIgMXMsIGZvbGxvd2VkIGJ5IDIgemVyb3MsCi0gIC8vIGV0YwotICBmb3IgKGludCBpID0gMTsgaSA8PSA2NDsgKytpKSB7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyArK2opIHsKLSAgICAgIG9uZV9vaHMucHVzaF9iYWNrKHRydWUpOwotICAgIH0KLSAgICBmb3IgKGludCBqID0gMDsgaiA8IGk7ICsraikgewotICAgICAgb25lX29ocy5wdXNoX2JhY2soZmFsc2UpOwotICAgIH0KLSAgfQotICBzaXplX3Qgc2tpcF9vbmVzX3NpemUgPSAwOwotICBzY29wZWRfYXJyYXk8dWludDg+IHNraXBfb25lc19idWZmID0KLSAgICAgIFNlcmlhbGl6ZVRvQnVmZmVyKG9uZV9vaHMsIHRydWUsIHNraXBfb25lc19zaXplKTsKLSAgc2l6ZV90IHNraXBfb2hzX3NpemUgPSAwOwotICBzY29wZWRfYXJyYXk8dWludDg+IHNraXBfb2hzX2J1ZmYgPQotICAgICAgU2VyaWFsaXplVG9CdWZmZXIob25lX29ocywgZmFsc2UsIHNraXBfb2hzX3NpemUpOwotICBTaGVsbFJCU1BTdHJlYW0gc2tpcF9vbmVzKHNraXBfb25lc19idWZmLmdldCgpLCBza2lwX29uZXNfc2l6ZSk7Ci0gIFNoZWxsUkJTUFN0cmVhbSBza2lwX29ocyhza2lwX29oc19idWZmLmdldCgpLCBza2lwX29oc19zaXplKTsKLSAgZm9yIChpbnQgaSA9IDE7IGkgPCA2NDsgKytpKSB7Ci0gICAgLy8gc2tpcCB0aGUgb25lcwotICAgIEFTU0VSVF9UUlVFKHNraXBfb25lcy5Ta2lwQml0cyhpKSk7Ci0gICAgLy8gcmVhZCB0aGUgb25lcyBmcm9tIHRoZSB6ZXJvcyBzdHJlYW0KLSAgICBmb3IgKGludCBqID0gMDsgaiA8IGk7ICsraikgewotICAgICAgdWludDggYml0ID0gMDsKLSAgICAgIEFTU0VSVF9UUlVFKHNraXBfb2hzLlJlYWRCaXQoYml0KSk7Ci0gICAgICBBU1NFUlRfRVEoYml0LCAxKTsKLSAgICB9Ci0gICAgLy8gc2tpcCB0aGUgb2hzCi0gICAgQVNTRVJUX1RSVUUoc2tpcF9vaHMuU2tpcEJpdHMoaSkpOwotICAgIC8vIHJlYWQgdGhlIG9ocyBmcm9tIHRoZSBvbmVzIHN0cmVhbQotICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgKytqKSB7Ci0gICAgICB1aW50OCBiaXQgPSAwOwotICAgICAgQVNTRVJUX1RSVUUoc2tpcF9vbmVzLlJlYWRCaXQoYml0KSk7Ci0gICAgICBBU1NFUlRfRVEoYml0LCAwKTsKLSAgICB9Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF92aWRlb19kZWNvZGVyX2ltcGwuY2MgYi9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF92aWRlb19kZWNvZGVyX2ltcGwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZTI0YjcuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfdmlkZW9fZGVjb2Rlcl9pbXBsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9zaGVsbF92aWRlb19kZWNvZGVyX2ltcGwuaCIKLQotI2luY2x1ZGUgPGxpbWl0cy5oPiAgLy8gZm9yIFVMTE9OR19NQVgKLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2tfaGVscGVycy5oIgotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJidWlsZC9idWlsZF9jb25maWcuaCIgIC8vIE11c3QgY29tZSBiZWZvcmUgT1NfU1RBUkJPQVJELgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYmluZF90b19sb29wLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9waXBlbGluZV9zdGF0dXMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3NoZWxsX2J1ZmZlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaGVsbF9tZWRpYV9zdGF0aXN0aWNzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb19kZWNvZGVyX2NvbmZpZy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fZnJhbWUuaCIKLQotI2lmIGRlZmluZWQoT1NfU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9jb25maWd1cmF0aW9uLmgiCi0jZW5kaWYgIC8vIGRlZmluZWQoT1NfU1RBUkJPQVJEKQotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gU2hlbGxWaWRlb0RlY29kZXJJbXBsCi0vLwotCi1TaGVsbFZpZGVvRGVjb2RlckltcGw6OlNoZWxsVmlkZW9EZWNvZGVySW1wbCgKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+JiBtZXNzYWdlX2xvb3AsCi0gICAgU2hlbGxSYXdWaWRlb0RlY29kZXJGYWN0b3J5KiByYXdfdmlkZW9fZGVjb2Rlcl9mYWN0b3J5KQotICAgIDogc3RhdGVfKGtVbmluaXRpYWxpemVkKSwKLSAgICAgIG1lZGlhX3BpcGVsaW5lX21lc3NhZ2VfbG9vcF8obWVzc2FnZV9sb29wKSwKLSAgICAgIHJhd192aWRlb19kZWNvZGVyX2ZhY3RvcnlfKHJhd192aWRlb19kZWNvZGVyX2ZhY3RvcnkpLAotICAgICAgZGVjb2Rlcl90aHJlYWRfKCJWaWRlbyBEZWNvZGVyIikgewotICBEQ0hFQ0socmF3X3ZpZGVvX2RlY29kZXJfZmFjdG9yeV8pOwotfQotCi1TaGVsbFZpZGVvRGVjb2RlckltcGw6On5TaGVsbFZpZGVvRGVjb2RlckltcGwoKSB7fQotCi12b2lkIFNoZWxsVmlkZW9EZWNvZGVySW1wbDo6SW5pdGlhbGl6ZSgKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+JiBzdHJlYW0sCi0gICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc3RhdHVzX2NiLAotICAgIGNvbnN0IFN0YXRpc3RpY3NDQiYgc3RhdGlzdGljc19jYikgewotICBUUkFDRV9FVkVOVDAoIm1lZGlhX3N0YWNrIiwgIlNoZWxsVmlkZW9EZWNvZGVySW1wbDo6SW5pdGlhbGl6ZSgpIik7Ci0gIERDSEVDSyghZGVjb2Rlcl90aHJlYWRfLklzUnVubmluZygpKTsKLSAgRENIRUNLKG1lZGlhX3BpcGVsaW5lX21lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIC8vIGNoZWNrIGZvciBubyBhbHJlYWR5IGF0dGFjaGVkIHN0cmVhbSwgdmFsaWQgaW5wdXQgc3RyZWFtLCBhbmQgc2F2ZSBpdAotICBEQ0hFQ0soIWRlbXV4ZXJfc3RyZWFtXyk7Ci0KLSAgaWYgKCFzdHJlYW0pIHsKLSAgICBzdGF0dXNfY2IuUnVuKFBJUEVMSU5FX0VSUk9SX0RFQ09ERSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGRlbXV4ZXJfc3RyZWFtXyA9IHN0cmVhbTsKLQotICBWaWRlb0RlY29kZXJDb25maWcgZGVjb2Rlcl9jb25maWc7Ci0gIGRlY29kZXJfY29uZmlnLkNvcHlGcm9tKGRlbXV4ZXJfc3RyZWFtXy0+dmlkZW9fZGVjb2Rlcl9jb25maWcoKSk7Ci0gIExPRyhJTkZPKSA8PCAiQ29uZmlndXJhdGlvbiBhdCBTdGFydDogIgotICAgICAgICAgICAgPDwgZGVjb2Rlcl9jb25maWcuQXNIdW1hblJlYWRhYmxlU3RyaW5nKCk7Ci0KLSAgcmF3X2RlY29kZXJfID0gcmF3X3ZpZGVvX2RlY29kZXJfZmFjdG9yeV8tPkNyZWF0ZSgKLSAgICAgIGRlY29kZXJfY29uZmlnLCBkZW11eGVyX3N0cmVhbV8tPkdldERlY3J5cHRvcigpLAotICAgICAgZGVtdXhlcl9zdHJlYW1fLT5TdHJlYW1XYXNFbmNyeXB0ZWQoKSk7Ci0KLSAgaWYgKCFyYXdfZGVjb2Rlcl8pIHsKLSAgICBzdGF0dXNfY2IuUnVuKERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgVVBEQVRFX01FRElBX1NUQVRJU1RJQ1MoU1RBVF9UWVBFX1ZJREVPX0NPREVDLCBkZWNvZGVyX2NvbmZpZy5jb2RlYygpKTsKLSAgVVBEQVRFX01FRElBX1NUQVRJU1RJQ1MoU1RBVF9UWVBFX1ZJREVPX1dJRFRILAotICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyX2NvbmZpZy5uYXR1cmFsX3NpemUoKS53aWR0aCgpKTsKLSAgVVBEQVRFX01FRElBX1NUQVRJU1RJQ1MoU1RBVF9UWVBFX1ZJREVPX0hFSUdIVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlcl9jb25maWcubmF0dXJhbF9zaXplKCkuaGVpZ2h0KCkpOwotCi0gIGJhc2U6OlRocmVhZDo6T3B0aW9ucyBvcHRpb25zOwotCi0jaWYgZGVmaW5lZChPU19TVEFSQk9BUkQpICYmIGRlZmluZWQoU0JfTUVESUFfVEhSRUFEX1NUQUNLX1NJWkUpCi0gIG9wdGlvbnMuc3RhY2tfc2l6ZSA9IFNCX01FRElBX1RIUkVBRF9TVEFDS19TSVpFOwotI2VuZGlmICAvLyBkZWZpbmVkKE9TX1NUQVJCT0FSRCkgJiYgZGVmaW5lZChTQl9NRURJQV9USFJFQURfU1RBQ0tfU0laRSkKLQotICBpZiAoZGVjb2Rlcl90aHJlYWRfLlN0YXJ0V2l0aE9wdGlvbnMob3B0aW9ucykpIHsKLSAgICBzdGF0ZV8gPSBrTm9ybWFsOwotICAgIHN0YXR1c19jYi5SdW4oUElQRUxJTkVfT0spOwotICB9IGVsc2UgewotICAgIHN0YXR1c19jYi5SdW4oUElQRUxJTkVfRVJST1JfREVDT0RFKTsKLSAgfQotfQotCi12b2lkIFNoZWxsVmlkZW9EZWNvZGVySW1wbDo6UmVhZChjb25zdCBSZWFkQ0ImIHJlYWRfY2IpIHsKLSAgVFJBQ0VfRVZFTlQwKCJtZWRpYV9zdGFjayIsICJTaGVsbFZpZGVvRGVjb2RlckltcGw6OkRvUmVhZCgpIik7Ci0gIGlmICghZGVjb2Rlcl90aHJlYWRfLm1lc3NhZ2VfbG9vcF9wcm94eSgpLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpIHsKLSAgICBkZWNvZGVyX3RocmVhZF8ubWVzc2FnZV9sb29wX3Byb3h5KCktPlBvc3RUYXNrKAotICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJlNoZWxsVmlkZW9EZWNvZGVySW1wbDo6UmVhZCwgdGhpcywgcmVhZF9jYikpOwotICAgIHJldHVybjsKLSAgfQotCi0gIERDSEVDSyghcmVhZF9jYi5pc19udWxsKCkpOwotICBEQ0hFQ0socmVhZF9jYl8uaXNfbnVsbCgpKSA8PCAib3ZlcmxhcHBpbmcgcmVhZHMgbm90IHN1cHBvcnRlZCI7Ci0gIERDSEVDS19ORShzdGF0ZV8sIGtVbmluaXRpYWxpemVkKTsKLQotICByZWFkX2NiXyA9IEJpbmRUb0xvb3AobWVkaWFfcGlwZWxpbmVfbWVzc2FnZV9sb29wXywgcmVhZF9jYik7Ci0KLSAgLy8gaWYgYW4gZXJyb3IgaGFzIG9jY3VycmVkLCByZXR1cm4gZXJyb3IKLSAgaWYgKHN0YXRlXyA9PSBrU2hlbGxEZWNvZGVFcnJvcikgewotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZyZWFkX2NiXykuUnVuKGtEZWNvZGVFcnJvciwgTlVMTCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gaWYgZGVjb2RpbmcgaXMgZG9uZSByZXR1cm4gZW1wdHkgZnJhbWUKLSAgaWYgKHN0YXRlXyA9PSBrRGVjb2RlRmluaXNoZWQpIHsKLSAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcmVhZF9jYl8pLlJ1bihrT2ssIFZpZGVvRnJhbWU6OkNyZWF0ZUVtcHR5RnJhbWUoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGJ1ZmZlcl90b19kZWNvZGVfKSB7Ci0gICAgRGVjb2RlQnVmZmVyKGJ1ZmZlcl90b19kZWNvZGVfKTsKLSAgfSBlbHNlIGlmIChzdGF0ZV8gPT0ga0ZsdXNoQ29kZWMpIHsKLSAgICBEZWNvZGVCdWZmZXIoZW9mX2J1ZmZlcl8pOwotICB9IGVsc2UgewotICAgIFJlYWRGcm9tRGVtdXhlclN0cmVhbSgpOyAgLy8gS2ljayBvZmYgYSByZWFkCi0gIH0KLX0KLQotdm9pZCBTaGVsbFZpZGVvRGVjb2RlckltcGw6OlJlYWRGcm9tRGVtdXhlclN0cmVhbSgpIHsKLSAgRENIRUNLKGRlY29kZXJfdGhyZWFkXy5tZXNzYWdlX2xvb3BfcHJveHkoKS0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgRENIRUNLX05FKHN0YXRlXywga0RlY29kZUZpbmlzaGVkKTsKLQotICBtZWRpYV9waXBlbGluZV9tZXNzYWdlX2xvb3BfLT5Qb3N0VGFzaygKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmRGVtdXhlclN0cmVhbTo6UmVhZCwgZGVtdXhlcl9zdHJlYW1fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRUb0N1cnJlbnRMb29wKGJhc2U6OkJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTaGVsbFZpZGVvRGVjb2RlckltcGw6OkJ1ZmZlclJlYWR5LCB0aGlzKSkpKTsKLX0KLQotdm9pZCBTaGVsbFZpZGVvRGVjb2RlckltcGw6OkJ1ZmZlclJlYWR5KAotICAgIERlbXV4ZXJTdHJlYW06OlN0YXR1cyBkZW11eGVyX3N0YXR1cywKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBidWZmZXIpIHsKLSAgRENIRUNLKGRlY29kZXJfdGhyZWFkXy5tZXNzYWdlX2xvb3BfcHJveHkoKS0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgLy8gbXVzdCBlaXRoZXIgYmUgT2sgYW5kIGhhdmUgYSBidWZmZXIgb3Igbm90IE9rIGFuZCBubyBidWZmZXIKLSAgRENIRUNLX0VRKGRlbXV4ZXJfc3RhdHVzICE9IERlbXV4ZXJTdHJlYW06OmtPaywgIWJ1ZmZlcikgPDwgZGVtdXhlcl9zdGF0dXM7Ci0KLSAgaWYgKHN0YXRlXyA9PSBrVW5pbml0aWFsaXplZCkgewotICAgIC8vIFN0b3AgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSBCdWZmZXJSZWFkeSBpcyBwb3N0ZWQuIHJlYWRfY2JfIHNob3VsZCBiZQotICAgIC8vIGNhbGxlZCBhbmQgY2xlYXJlZCBpbnNpZGUgU3RvcCgpLgotICAgIERDSEVDSyhyZWFkX2NiXy5pc19udWxsKCkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzdGF0ZV8gPT0ga1NoZWxsRGVjb2RlRXJyb3IpIHsKLSAgICBETE9HKFdBUk5JTkcpIDw8ICJyZWFkIHJldHVybmVkIGJ1dCBkZWNvZGVyIGlzIGluIGVycm9yIHN0YXRlIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBpZiB3ZSBkZWZlcnJlZCByZXNldCBiYXNlZCBvbiBhIHBlbmRpbmcgcmVhZCwgcHJvY2VzcyB0aGF0IHJlc2V0IG5vdwotICAvLyBhZnRlciByZXR1cm5pbmcgYW4gZW1wdHkgZnJhbWUKLSAgaWYgKCFyZXNldF9jYl8uaXNfbnVsbCgpKSB7Ci0gICAgRG9SZXNldCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChkZW11eGVyX3N0YXR1cyA9PSBEZW11eGVyU3RyZWFtOjprQ29uZmlnQ2hhbmdlZCkgewotICAgIFZpZGVvRGVjb2RlckNvbmZpZyBkZWNvZGVyX2NvbmZpZzsKLSAgICBkZWNvZGVyX2NvbmZpZy5Db3B5RnJvbShkZW11eGVyX3N0cmVhbV8tPnZpZGVvX2RlY29kZXJfY29uZmlnKCkpOwotICAgIExPRyhJTkZPKSA8PCAiQ29uZmlndXJhdGlvbiBDaGFuZ2VkOiAiCi0gICAgICAgICAgICAgIDw8IGRlY29kZXJfY29uZmlnLkFzSHVtYW5SZWFkYWJsZVN0cmluZygpOwotICAgIC8vIE9uZSBzaWRlIGVmZmVjdCBvZiBhc2tpbmcgZm9yIHRoZSB2aWRlbyBjb25maWd1cmF0aW9uIGlzIHRoYXQKLSAgICAvLyB0aGUgTWVkaWFTb3VyY2UgZGVtdXhlciBzdGFjayB1c2VzIHRoYXQgcmVxdWVzdCB0byBkZXRlcm1pbmUKLSAgICAvLyB0aGF0IHRoZSB2aWRlbyBkZWNvZGVyIGhhcyB1cGRhdGVkIGl0cyBjb25maWd1cmF0aW9uLgotICAgIC8vIFdlIHRoZXJlZm9yZSBtdXN0IGFzayBmb3IgdGhlIHVwZGF0ZWQgdmlkZW8gY29uZmlndXJhdGlvbgotICAgIC8vIGJlZm9yZSByZXF1ZXN0aW5nIGFueSBkYXRhLCBvciB0aGUgTWVkaWFTb3VyY2Ugc3RhY2sgd2lsbAotICAgIC8vIGFzc2VydC4KLSAgICBpZiAoIXJhd19kZWNvZGVyXy0+VXBkYXRlQ29uZmlnKGRlY29kZXJfY29uZmlnKSkgewotICAgICAgRExPRyhFUlJPUikgPDwgIkVycm9yIFJlY29uZmlnIEgyNjQgZGVjb2RlciI7Ci0gICAgICBEZWNvZGVyRmF0YWxFcnJvcigpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFVQREFURV9NRURJQV9TVEFUSVNUSUNTKFNUQVRfVFlQRV9WSURFT19DT0RFQywgZGVjb2Rlcl9jb25maWcuY29kZWMoKSk7Ci0gICAgVVBEQVRFX01FRElBX1NUQVRJU1RJQ1MoU1RBVF9UWVBFX1ZJREVPX1dJRFRILAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJfY29uZmlnLm5hdHVyYWxfc2l6ZSgpLndpZHRoKCkpOwotICAgIFVQREFURV9NRURJQV9TVEFUSVNUSUNTKFNUQVRfVFlQRV9WSURFT19IRUlHSFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlcl9jb25maWcubmF0dXJhbF9zaXplKCkuaGVpZ2h0KCkpOwotCi0gICAgUmVhZEZyb21EZW11eGVyU3RyZWFtKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gaWYgc3RyZWFtIGlzIGFib3J0ZWQgc2VydmljZSB0aGlzIGFuZCBhbnkgcGVuZGluZyByZWFkcyB3aXRoCi0gIC8vIGVtcHR5IGZyYW1lcwotICBpZiAoZGVtdXhlcl9zdGF0dXMgPT0gRGVtdXhlclN0cmVhbTo6a0Fib3J0ZWQpIHsKLSAgICBpZiAoIXJlYWRfY2JfLmlzX251bGwoKSkgewotICAgICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnJlYWRfY2JfKS5SdW4oa09rLCBOVUxMKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRENIRUNLKGJ1ZmZlcik7Ci0gIGlmICghYnVmZmVyKSB7Ci0gICAgRGVjb2RlckZhdGFsRXJyb3IoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBhdCB0aGlzIHBvaW50IGRlbXV4ZXJzdHJlYW0gc3RhdGUgc2hvdWxkIGJlIE9LCi0gIERDSEVDS19FUShkZW11eGVyX3N0YXR1cywgRGVtdXhlclN0cmVhbTo6a09rKTsKLQotICAvLyBEZWNvZGUgdGhpcyBvbmUKLSAgRGVjb2RlQnVmZmVyKGJ1ZmZlcik7Ci19Ci0KLXZvaWQgU2hlbGxWaWRlb0RlY29kZXJJbXBsOjpEZWNvZGVCdWZmZXIoCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgYnVmZmVyKSB7Ci0gIFRSQUNFX0VWRU5UMCgibWVkaWFfc3RhY2siLCAiU2hlbGxWaWRlb0RlY29kZXJJbXBsOjpEZWNvZGVCdWZmZXIoKSIpOwotICBTQ09QRURfTUVESUFfU1RBVElTVElDUyhTVEFUX1RZUEVfVklERU9fRlJBTUVfREVDT0RFKTsKLQotICBEQ0hFQ0soZGVjb2Rlcl90aHJlYWRfLm1lc3NhZ2VfbG9vcF9wcm94eSgpLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBEQ0hFQ0tfTkUoc3RhdGVfLCBrVW5pbml0aWFsaXplZCk7Ci0gIERDSEVDS19ORShzdGF0ZV8sIGtEZWNvZGVGaW5pc2hlZCk7Ci0gIERDSEVDSyhidWZmZXIpOwotICBpZiAoYnVmZmVyX3RvX2RlY29kZV8pCi0gICAgRENIRUNLX0VRKGJ1ZmZlcl90b19kZWNvZGVfLCBidWZmZXIpOwotCi0gIGJ1ZmZlcl90b19kZWNvZGVfID0gYnVmZmVyOwotCi0gIC8vIGlmIHdlIGRlZmVycmVkIHJlc2V0IGJhc2VkIG9uIGEgcGVuZGluZyByZWFkLCBwcm9jZXNzIHRoYXQgcmVzZXQgbm93Ci0gIC8vIGFmdGVyIHJldHVybmluZyBhbiBlbXB0eSBmcmFtZQotICBpZiAoIXJlc2V0X2NiXy5pc19udWxsKCkpIHsKLSAgICBEb1Jlc2V0KCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gaWYgd2UndmUgZW5jb3VudGVyZWQgYW4gRU9TIGJ1ZmZlciB0aGVuIGF0dGVtcHQgbm8gbW9yZSByZWFkcyBmcm9tIHVwc3RyZWFtCi0gIC8vIGVtcHR5IHF1ZXVlIGFuZCBwcmVwYXJlIHRvIHRyYW5zaXRpb24gdG8ga0RlY29kZUZpbmlzaGVkLgotICBpZiAoYnVmZmVyLT5Jc0VuZE9mU3RyZWFtKCkpIHsKLSAgICBUUkFDRV9FVkVOVDAoIm1lZGlhX3N0YWNrIiwKLSAgICAgICAgICAgICAgICAgIlNoZWxsVmlkZW9EZWNvZGVySW1wbDo6RGVjb2RlQnVmZmVyKCkgRU9TIHJlY2VpdmVkIik7Ci0gICAgZW9mX2J1ZmZlcl8gPSBidWZmZXI7Ci0gICAgLy8gV2UgcGlwZWxpbmUgcmVhZHMsIHNvIGl0IGlzIHBvc3NpYmxlIHRoYXQgd2Ugd2lsbCByZWNlaXZlIG1vcmUgdGhhbiBvbmUKLSAgICAvLyByZWFkIGNhbGxiYWNrIHdpdGggRU9TIGFmdGVyIHRoZSBmaXJzdAotICAgIGlmIChzdGF0ZV8gPT0ga05vcm1hbCkgewotICAgICAgc3RhdGVfID0ga0ZsdXNoQ29kZWM7Ci0gICAgfQotICB9Ci0KLSAgU2hlbGxSYXdWaWRlb0RlY29kZXI6OkRlY29kZUNCIGRlY29kZV9jYiA9Ci0gICAgICBiYXNlOjpCaW5kKCZTaGVsbFZpZGVvRGVjb2RlckltcGw6OkRlY29kZUNhbGxiYWNrLCB0aGlzKTsKLSAgcmF3X2RlY29kZXJfLT5EZWNvZGUoYnVmZmVyLCBCaW5kVG9DdXJyZW50TG9vcChkZWNvZGVfY2IpKTsKLX0KLQotdm9pZCBTaGVsbFZpZGVvRGVjb2RlckltcGw6OkRlY29kZUNhbGxiYWNrKAotICAgIFNoZWxsUmF3VmlkZW9EZWNvZGVyOjpEZWNvZGVTdGF0dXMgc3RhdHVzLAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4mIGZyYW1lKSB7Ci0gIERDSEVDSyhidWZmZXJfdG9fZGVjb2RlXyk7Ci0KLSAgaWYgKCFyZXNldF9jYl8uaXNfbnVsbCgpKSB7Ci0gICAgRG9SZXNldCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzdGF0dXMgPT0gU2hlbGxSYXdWaWRlb0RlY29kZXI6OlJFVFJZX1dJVEhfU0FNRV9CVUZGRVIpIHsKLSAgICBpZiAoZnJhbWUpIHsKLSAgICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZyZWFkX2NiXykuUnVuKGtPaywgZnJhbWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBkZWNvZGVyX3RocmVhZF8ubWVzc2FnZV9sb29wX3Byb3h5KCktPlBvc3RUYXNrKAotICAgICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmU2hlbGxWaWRlb0RlY29kZXJJbXBsOjpEZWNvZGVCdWZmZXIsIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl90b19kZWNvZGVfKSk7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotCi0gIGJ1ZmZlcl90b19kZWNvZGVfID0gTlVMTDsKLQotICBpZiAoc3RhdHVzID09IFNoZWxsUmF3VmlkZW9EZWNvZGVyOjpGUkFNRV9ERUNPREVEKSB7Ci0gICAgVFJBQ0VfRVZFTlQxKCJtZWRpYV9zdGFjayIsICJTaGVsbFZpZGVvRGVjb2RlckltcGwgZnJhbWUgZGVjb2RlZCIsCi0gICAgICAgICAgICAgICAgICJ0aW1lc3RhbXAiLCBmcmFtZS0+R2V0VGltZXN0YW1wKCkuSW5NaWNyb3NlY29uZHMoKSk7Ci0gICAgRENIRUNLKGZyYW1lKTsKLSAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcmVhZF9jYl8pLlJ1bihrT2ssIGZyYW1lKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoc3RhdHVzID09IFNoZWxsUmF3VmlkZW9EZWNvZGVyOjpORUVEX01PUkVfREFUQSkgewotICAgIERDSEVDSyghZnJhbWUpOwotICAgIGlmIChzdGF0ZV8gPT0ga0ZsdXNoQ29kZWMpIHsKLSAgICAgIHN0YXRlXyA9IGtEZWNvZGVGaW5pc2hlZDsKLSAgICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZyZWFkX2NiXykuUnVuKGtPaywgVmlkZW9GcmFtZTo6Q3JlYXRlRW1wdHlGcmFtZSgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBSZWFkRnJvbURlbXV4ZXJTdHJlYW0oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoc3RhdHVzID09IFNoZWxsUmF3VmlkZW9EZWNvZGVyOjpGQVRBTF9FUlJPUikgewotICAgIERlY29kZXJGYXRhbEVycm9yKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgTk9UUkVBQ0hFRCgpOwotfQotCi12b2lkIFNoZWxsVmlkZW9EZWNvZGVySW1wbDo6UmVzZXQoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2xvc3VyZSkgewotICBUUkFDRV9FVkVOVDAoIm1lZGlhX3N0YWNrIiwgIlNoZWxsVmlkZW9EZWNvZGVySW1wbDo6UmVzZXQoKSIpOwotICBpZiAoIWRlY29kZXJfdGhyZWFkXy5tZXNzYWdlX2xvb3BfcHJveHkoKS0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKSB7Ci0gICAgZGVjb2Rlcl90aHJlYWRfLm1lc3NhZ2VfbG9vcF9wcm94eSgpLT5Qb3N0VGFzaygKLSAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZTaGVsbFZpZGVvRGVjb2RlckltcGw6OlJlc2V0LCB0aGlzLCBjbG9zdXJlKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcmVzZXRfY2JfID0gQmluZFRvTG9vcChtZWRpYV9waXBlbGluZV9tZXNzYWdlX2xvb3BfLCBjbG9zdXJlKTsKLQotICAvLyBEZWZlciB0aGUgcmVzZXQgaWYgYSByZWFkIGlzIHBlbmRpbmcuCi0gIGlmICghcmVhZF9jYl8uaXNfbnVsbCgpKQotICAgIHJldHVybjsKLQotICBEb1Jlc2V0KCk7Ci19Ci0KLXZvaWQgU2hlbGxWaWRlb0RlY29kZXJJbXBsOjpEb1Jlc2V0KCkgewotICBEQ0hFQ0soIXJlc2V0X2NiXy5pc19udWxsKCkpOwotICBEQ0hFQ0soZGVjb2Rlcl90aHJlYWRfLm1lc3NhZ2VfbG9vcF9wcm94eSgpLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotCi0gIC8vIHNlcnZpY2UgYW55IHBlbmRpbmcgcmVhZCBjYWxsIHdpdGggYSBOVUxMIGJ1ZmZlcgotICBpZiAoIXJlYWRfY2JfLmlzX251bGwoKSkgewotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZyZWFkX2NiXykuUnVuKGtPaywgTlVMTCk7Ci0gIH0KLQotICBpZiAoIXJhd19kZWNvZGVyXy0+Rmx1c2goKSkgewotICAgIERMT0coRVJST1IpIDw8ICJFcnJvciBGbHVzaCBEZWNvZGVyIjsKLSAgICBEZWNvZGVyRmF0YWxFcnJvcigpOwotICB9Ci0KLSAgaWYgKHN0YXRlXyAhPSBrU2hlbGxEZWNvZGVFcnJvcikKLSAgICBzdGF0ZV8gPSBrTm9ybWFsOwotICBlb2ZfYnVmZmVyXyA9IE5VTEw7Ci0gIGJ1ZmZlcl90b19kZWNvZGVfID0gTlVMTDsKLQotICBiYXNlOjpSZXNldEFuZFJldHVybigmcmVzZXRfY2JfKS5SdW4oKTsKLX0KLQotdm9pZCBTaGVsbFZpZGVvRGVjb2RlckltcGw6OkRlY29kZXJGYXRhbEVycm9yKCkgewotICBUUkFDRV9FVkVOVDAoIm1lZGlhX3N0YWNrIiwgIlNoZWxsVmlkZW9EZWNvZGVySW1wbDo6RGVjb2RlckZhdGFsRXJyb3IoKSIpOwotICBEQ0hFQ0soZGVjb2Rlcl90aHJlYWRfLm1lc3NhZ2VfbG9vcF9wcm94eSgpLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICAvLyBmYXRhbCBlcnJvciB3aXRoaW4gdGhlIGRlY29kZXIKLSAgRExPRyhFUlJPUikgPDwgImZhdGFsIHZpZGVvIGRlY29kZXIgZXJyb3IuIjsKLSAgLy8gc2VydmljZSBhbnkgcmVhZCBjYWxsYmFja3Mgd2l0aCBlcnJvcgotICBpZiAoIXJlYWRfY2JfLmlzX251bGwoKSkgewotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZyZWFkX2NiXykuUnVuKGtEZWNvZGVFcnJvciwgTlVMTCk7Ci0gIH0KLSAgLy8gdGVybWluYXRlIHBsYXliYWNrCi0gIHN0YXRlXyA9IGtTaGVsbERlY29kZUVycm9yOwotfQotCi12b2lkIFNoZWxsVmlkZW9EZWNvZGVySW1wbDo6U3RvcChjb25zdCBiYXNlOjpDbG9zdXJlJiBjbG9zdXJlKSB7Ci0gIERDSEVDSyhtZWRpYV9waXBlbGluZV9tZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotCi0gIGRlY29kZXJfdGhyZWFkXy5TdG9wKCk7Ci0gIHJhd19kZWNvZGVyXy5yZXNldChOVUxMKTsKLQotICAvLyB0ZXJtaW5hdGUgcGxheWJhY2sKLSAgc3RhdGVfID0ga1VuaW5pdGlhbGl6ZWQ7Ci0KLSAgaWYgKCFyZWFkX2NiXy5pc19udWxsKCkpCi0gICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnJlYWRfY2JfKS5SdW4oa09rLCBOVUxMKTsKLQotICBjbG9zdXJlLlJ1bigpOwotfQotCi12b2lkIFNoZWxsVmlkZW9EZWNvZGVySW1wbDo6TmVhcmx5VW5kZXJmbG93KCkgewotICBEQ0hFQ0sobWVkaWFfcGlwZWxpbmVfbWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgaWYgKHJhd19kZWNvZGVyXykgewotICAgIHJhd19kZWNvZGVyXy0+TmVhcmx5VW5kZXJmbG93KCk7Ci0gIH0KLX0KLQotdm9pZCBTaGVsbFZpZGVvRGVjb2RlckltcGw6OkhhdmVFbm91Z2hGcmFtZXMoKSB7Ci0gIERDSEVDSyhtZWRpYV9waXBlbGluZV9tZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBpZiAocmF3X2RlY29kZXJfKSB7Ci0gICAgcmF3X2RlY29kZXJfLT5IYXZlRW5vdWdoRnJhbWVzKCk7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF92aWRlb19kZWNvZGVyX2ltcGwuaCBiL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX3ZpZGVvX2RlY29kZXJfaW1wbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTllMTdkLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX3ZpZGVvX2RlY29kZXJfaW1wbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaWZuZGVmIE1FRElBX0ZJTFRFUlNfU0hFTExfVklERU9fREVDT0RFUl9JTVBMX0hfCi0jZGVmaW5lIE1FRElBX0ZJTFRFUlNfU0hFTExfVklERU9fREVDT0RFUl9JTVBMX0hfCi0KLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlbXV4ZXJfc3RyZWFtLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaGVsbF9idWZmZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fZGVjb2Rlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fZGVjb2Rlcl9jb25maWcuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgU2hlbGxSYXdWaWRlb0RlY29kZXIgewotIHB1YmxpYzoKLSAgZW51bSBEZWNvZGVTdGF0dXMgewotICAgIEZSQU1FX0RFQ09ERUQsICAgICAgICAgICAvLyBTdWNjZXNzZnVsbHkgZGVjb2RlZCBhIGZyYW1lLgotICAgIE5FRURfTU9SRV9EQVRBLCAgICAgICAgICAvLyBOZWVkIG1vcmUgZGF0YSB0byBkZWNvZGUgdGhlIG5leHQgZnJhbWUuCi0gICAgUkVUUllfV0lUSF9TQU1FX0JVRkZFUiwgIC8vIFJldHJ5IGxhdGVyIHdpdGggdGhlIHNhbWUgaW5wdXQuIE5vdGUgdGhhdCBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNhc2UgdGhlIGRlY29kZXIgbWF5IHN0aWxsIHJldHVybiBhIHZhbGlkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlcmVkIGZyYW1lLgotICAgIEZBVEFMX0VSUk9SICAgICAgICAgICAgICAvLyBEZWNvZGVyIGVuY291bnRlcnMgZmF0YWwgZXJyb3IsIGFib3J0IHBsYXliYWNrLgotICB9OwotICB0eXBlZGVmIG1lZGlhOjpEZWNvZGVyQnVmZmVyIERlY29kZXJCdWZmZXI7Ci0gIHR5cGVkZWYgbWVkaWE6OlZpZGVvRGVjb2RlckNvbmZpZyBWaWRlb0RlY29kZXJDb25maWc7Ci0gIHR5cGVkZWYgbWVkaWE6OlZpZGVvRnJhbWUgVmlkZW9GcmFtZTsKLSAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKERlY29kZVN0YXR1cywgY29uc3Qgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiYpPgotICAgICAgRGVjb2RlQ0I7Ci0KLSAgU2hlbGxSYXdWaWRlb0RlY29kZXIoKSB7fQotICB2aXJ0dWFsIH5TaGVsbFJhd1ZpZGVvRGVjb2RlcigpIHt9Ci0gIHZpcnR1YWwgdm9pZCBEZWNvZGUoY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY29kZUNCJiBkZWNvZGVfY2IpID0gMDsKLSAgdmlydHVhbCBib29sIEZsdXNoKCkgPSAwOwotICB2aXJ0dWFsIGJvb2wgVXBkYXRlQ29uZmlnKGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgY29uZmlnKSA9IDA7Ci0gIC8vIFNlZSBTaGVsbFZpZGVvRGVjb2RlciBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucy4KLSAgdmlydHVhbCB2b2lkIE5lYXJseVVuZGVyZmxvdygpIHt9Ci0gIHZpcnR1YWwgdm9pZCBIYXZlRW5vdWdoRnJhbWVzKCkge30KLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTaGVsbFJhd1ZpZGVvRGVjb2Rlcik7Ci19OwotCi1jbGFzcyBTaGVsbFJhd1ZpZGVvRGVjb2RlckZhY3RvcnkgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+U2hlbGxSYXdWaWRlb0RlY29kZXJGYWN0b3J5KCkge30KLQotICB2aXJ0dWFsIHNjb3BlZF9wdHI8U2hlbGxSYXdWaWRlb0RlY29kZXI+IENyZWF0ZSgKLSAgICAgIGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgY29uZmlnLAotICAgICAgRGVjcnlwdG9yKiBkZWNyeXB0b3IsCi0gICAgICBib29sIHdhc19lbmNyeXB0ZWQpID0gMDsKLX07Ci0KLWNsYXNzIE1FRElBX0VYUE9SVCBTaGVsbFZpZGVvRGVjb2RlckltcGwgOiBwdWJsaWMgVmlkZW9EZWNvZGVyIHsKLSBwdWJsaWM6Ci0gIFNoZWxsVmlkZW9EZWNvZGVySW1wbCgKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4mIG1lc3NhZ2VfbG9vcCwKLSAgICAgIFNoZWxsUmF3VmlkZW9EZWNvZGVyRmFjdG9yeSogcmF3X3ZpZGVvX2RlY29kZXJfZmFjdG9yeSk7Ci0gIH5TaGVsbFZpZGVvRGVjb2RlckltcGwoKSBPVkVSUklERTsKLQotICAvLyBTaGVsbFZpZGVvRGVjb2RlciBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBJbml0aWFsaXplKGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4mIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIHN0YXR1c19jYiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXRpc3RpY3NDQiYgc3RhdGlzdGljc19jYikgT1ZFUlJJREU7Ci0gIHZvaWQgUmVhZChjb25zdCBSZWFkQ0ImIHJlYWRfY2IpIE9WRVJSSURFOwotICB2b2lkIFJlc2V0KGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNsb3N1cmUpIE9WRVJSSURFOwotICB2b2lkIFN0b3AoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2xvc3VyZSkgT1ZFUlJJREU7Ci0gIHZvaWQgTmVhcmx5VW5kZXJmbG93KCkgT1ZFUlJJREU7Ci0gIHZvaWQgSGF2ZUVub3VnaEZyYW1lcygpIE9WRVJSSURFOwotCi0gcHJpdmF0ZToKLSAgZW51bSBEZWNvZGVyU3RhdGUgewotICAgIGtVbmluaXRpYWxpemVkLAotICAgIGtOb3JtYWwsCi0gICAga0ZsdXNoQ29kZWMsCi0gICAga0RlY29kZUZpbmlzaGVkLAotICAgIGtTaGVsbERlY29kZUVycm9yCi0gIH07Ci0KLSAgdm9pZCBCdWZmZXJSZWFkeShEZW11eGVyU3RyZWFtOjpTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGJ1ZmZlcik7Ci0KLSAgLy8gYWN0dWFsbHkgbWFrZXMgdGhlIGNhbGwgdG8gdGhlIHBsYXRmb3JtIGRlY29kZXIgdG8gZGVjb2RlCi0gIHZvaWQgRGVjb2RlQnVmZmVyKGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGJ1ZmZlcik7Ci0gIC8vIHRoZSBjYWxsYmFjayBmcm9tIHRoZSByYXcgZGVjb2RlciBpbmRpY2F0ZXMgYW4gb3BlcmF0aW9uIGhhcyBiZWVuIGZpbmlzaGVkLgotICB2b2lkIERlY29kZUNhbGxiYWNrKFNoZWxsUmF3VmlkZW9EZWNvZGVyOjpEZWNvZGVTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4mIGZyYW1lKTsKLSAgLy8gUG9zdHMgYSB0YXNrIHRvIHJlYWQgZnJvbSB0aGUgZGVtdXhlciBzdHJlYW0uCi0gIHZvaWQgUmVhZEZyb21EZW11eGVyU3RyZWFtKCk7Ci0gIC8vIFJlc2V0IGRlY29kZXIgYW5kIGNhbGwgfHJlc2V0X2NiX3wuCi0gIHZvaWQgRG9SZXNldCgpOwotICAvLyBjYWxsZWQgb24gZGVjb2RlciB0aHJlYWQsIGZhdGFsIGVycm9yIG9uIGRlY29kZSwgd2Ugc2h1dCBkb3duIGRlY29kZQotICB2b2lkIERlY29kZXJGYXRhbEVycm9yKCk7Ci0KLSAgRGVjb2RlclN0YXRlIHN0YXRlXzsKLSAgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiBtZWRpYV9waXBlbGluZV9tZXNzYWdlX2xvb3BfOwotICBTaGVsbFJhd1ZpZGVvRGVjb2RlckZhY3RvcnkqIHJhd192aWRlb19kZWNvZGVyX2ZhY3RvcnlfOwotICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IGRlbXV4ZXJfc3RyZWFtXzsKLSAgUmVhZENCIHJlYWRfY2JfOwotICBiYXNlOjpDbG9zdXJlIHJlc2V0X2NiXzsKLQotICBzY29wZWRfcHRyPFNoZWxsUmF3VmlkZW9EZWNvZGVyPiByYXdfZGVjb2Rlcl87Ci0KLSAgLy8gVE9ETzogZW5zdXJlIHRoZSBkZW11eGVyIGNhbiBoYW5kbGUgbXVsdGlwbGUgRU9TIHJlcXVlc3RzIHRoZW4gcmVtb3ZlIHRoaXMKLSAgLy8gaGFjay4KLSAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBlb2ZfYnVmZmVyXzsKLQotICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGJ1ZmZlcl90b19kZWNvZGVfOwotCi0gIC8vIEFsbCBkZWNvZGluZyB0YXNrcyB3aWxsIGJlIHBlcmZvcm1lZCBvbiB0aGlzIHRocmVhZCdzIG1lc3NhZ2UgbG9vcAotICBiYXNlOjpUaHJlYWQgZGVjb2Rlcl90aHJlYWRfOwotCi0gIERJU0FMTE9XX0lNUExJQ0lUX0NPTlNUUlVDVE9SUyhTaGVsbFZpZGVvRGVjb2RlckltcGwpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfRklMVEVSU19TSEVMTF9WSURFT19ERUNPREVSX0lNUExfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL3NrY2FudmFzX3ZpZGVvX3JlbmRlcmVyLmNjIGIvc3JjL21lZGlhL2ZpbHRlcnMvc2tjYW52YXNfdmlkZW9fcmVuZGVyZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNzE4ZGUuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvc2tjYW52YXNfdmlkZW9fcmVuZGVyZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvc2tjYW52YXNfdmlkZW9fcmVuZGVyZXIuaCIKLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotCi0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotCi1uYW1lc3BhY2UgbWVkaWEgewotCi12b2lkIFNrQ2FudmFzVmlkZW9SZW5kZXJlcjo6UGFpbnQoVmlkZW9GcmFtZSogdmlkZW9fZnJhbWUsIFNrQ2FudmFzKiBjYW52YXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Z4OjpSZWN0RiYgZGVzdF9yZWN0LCB1aW50OF90IGFscGhhKSB7Ci0gIE5PVFJFQUNIRUQoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbHNlICAvLyBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2ZyYW1lLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS95dXZfY29udmVydC5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9jb3JlL1NrQ2FudmFzLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL2NvcmUvU2tEZXZpY2UuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotc3RhdGljIGJvb2wgSXNFaXRoZXJZVjEyT3JZVjE2KG1lZGlhOjpWaWRlb0ZyYW1lOjpGb3JtYXQgZm9ybWF0KSB7Ci0gIHJldHVybiBmb3JtYXQgPT0gbWVkaWE6OlZpZGVvRnJhbWU6OllWMTIgfHwgZm9ybWF0ID09IG1lZGlhOjpWaWRlb0ZyYW1lOjpZVjE2OwotfQotCi1zdGF0aWMgYm9vbCBJc0VpdGhlcllWMTJPcllWMTZPck5hdGl2ZShtZWRpYTo6VmlkZW9GcmFtZTo6Rm9ybWF0IGZvcm1hdCkgewotICByZXR1cm4gSXNFaXRoZXJZVjEyT3JZVjE2KGZvcm1hdCkgfHwKLSAgICAgIGZvcm1hdCA9PSBtZWRpYTo6VmlkZW9GcmFtZTo6TkFUSVZFX1RFWFRVUkU7Ci19Ci0KLS8vIENhbkZhc3RQYWludCBpcyBhIGhlbHBlciBtZXRob2QgdG8gZGV0ZXJtaW5lIHRoZSBjb25kaXRpb25zIGZvciBmYXN0Ci0vLyBwYWludGluZy4gVGhlIGNvbmRpdGlvbnMgYXJlOgotLy8gMS4gTm8gc2tldyBpbiBjYW52YXMgbWF0cml4LgotLy8gMi4gTm8gZmxpcHBpbmcgbm9yIG1pcnJvcmluZy4KLS8vIDMuIENhbnZhcyBoYXMgcGl4ZWwgZm9ybWF0IEFSR0I4ODg4LgotLy8gNC4gQ2FudmFzIGlzIG9wYXF1ZS4KLS8vIDUuIEZyYW1lIGZvcm1hdCBpcyBZVjEyIG9yIFlWMTYuCi0vLwotLy8gVE9ETyhoY2xhbSk6IFRoZSBmYXN0IHBhaW50IG1ldGhvZCBzaG91bGQgc3VwcG9ydCBmbGlwcGluZyBhbmQgbWlycm9yaW5nLgotLy8gRGlzYWJsZSB0aGUgZmxpcHBpbmcgYW5kIG1pcnJvcmluZyBjaGVja3Mgb25jZSB3ZSBoYXZlIGl0Lgotc3RhdGljIGJvb2wgQ2FuRmFzdFBhaW50KFNrQ2FudmFzKiBjYW52YXMsIHVpbnQ4X3QgYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OlZpZGVvRnJhbWU6OkZvcm1hdCBmb3JtYXQpIHsKLSAgaWYgKGFscGhhICE9IDB4RkYgfHwgIUlzRWl0aGVyWVYxMk9yWVYxNihmb3JtYXQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBjb25zdCBTa01hdHJpeCYgdG90YWxfbWF0cml4ID0gY2FudmFzLT5nZXRUb3RhbE1hdHJpeCgpOwotICAvLyBQZXJmb3JtIHRoZSBmb2xsb3dpbmcgY2hlY2tzIGhlcmU6Ci0gIC8vIDEuIENoZWNrIGZvciBza2V3aW5nIGZhY3RvcnMgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4gVGhleSBzaG91bGQgYmUKLSAgLy8gICAgemVyby4KLSAgLy8gMi4gQ2hlY2sgZm9yIG1pcnJvcmluZyBhbmQgZmxpcHBpbmcuIE1ha2Ugc3VyZSB0aGV5IGFyZSBncmVhdGVyIHRoYW4gemVyby4KLSAgaWYgKFNrU2NhbGFyTmVhcmx5WmVybyh0b3RhbF9tYXRyaXguZ2V0U2tld1goKSkgJiYKLSAgICAgIFNrU2NhbGFyTmVhcmx5WmVybyh0b3RhbF9tYXRyaXguZ2V0U2tld1koKSkgJiYKLSAgICAgIHRvdGFsX21hdHJpeC5nZXRTY2FsZVgoKSA+IDAgJiYKLSAgICAgIHRvdGFsX21hdHJpeC5nZXRTY2FsZVkoKSA+IDApIHsKLSAgICBTa0RldmljZSogZGV2aWNlID0gY2FudmFzLT5nZXREZXZpY2UoKTsKLSAgICBjb25zdCBTa0JpdG1hcDo6Q29uZmlnIGNvbmZpZyA9IGRldmljZS0+Y29uZmlnKCk7Ci0KLSAgICBpZiAoY29uZmlnID09IFNrQml0bWFwOjprQVJHQl84ODg4X0NvbmZpZyAmJiBkZXZpY2UtPmlzT3BhcXVlKCkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLy8gRmFzdCBwYWludCBkb2VzIFlVViA9PiBSR0IsIHNjYWxpbmcsIGJsaXR0aW5nIGFsbCBpbiBvbmUgc3RlcCBpbnRvIHRoZQotLy8gY2FudmFzLiBJdCdzIG5vdCBhbHdheXMgc2FmZSBhbmQgYXBwcm9wcmlhdGUgdG8gcGVyZm9ybSBmYXN0IHBhaW50LgotLy8gQ2FuRmFzdFBhaW50KCkgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGNvbmRpdGlvbnMuCi1zdGF0aWMgdm9pZCBGYXN0UGFpbnQoCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxtZWRpYTo6VmlkZW9GcmFtZT4mIHZpZGVvX2ZyYW1lLAotICAgIFNrQ2FudmFzKiBjYW52YXMsCi0gICAgY29uc3QgU2tSZWN0JiBkZXN0X3JlY3QpIHsKLSAgRENIRUNLKElzRWl0aGVyWVYxMk9yWVYxNih2aWRlb19mcmFtZS0+Zm9ybWF0KCkpKSA8PCB2aWRlb19mcmFtZS0+Zm9ybWF0KCk7Ci0gIERDSEVDS19FUSh2aWRlb19mcmFtZS0+c3RyaWRlKG1lZGlhOjpWaWRlb0ZyYW1lOjprVVBsYW5lKSwKLSAgICAgICAgICAgIHZpZGVvX2ZyYW1lLT5zdHJpZGUobWVkaWE6OlZpZGVvRnJhbWU6OmtWUGxhbmUpKTsKLQotICBjb25zdCBTa0JpdG1hcCYgYml0bWFwID0gY2FudmFzLT5nZXREZXZpY2UoKS0+YWNjZXNzQml0bWFwKHRydWUpOwotICBtZWRpYTo6WVVWVHlwZSB5dXZfdHlwZSA9IG1lZGlhOjpZVjE2OwotICBpbnQgeV9zaGlmdCA9IDA7Ci0gIGlmICh2aWRlb19mcmFtZS0+Zm9ybWF0KCkgPT0gbWVkaWE6OlZpZGVvRnJhbWU6OllWMTIpIHsKLSAgICB5dXZfdHlwZSA9IG1lZGlhOjpZVjEyOwotICAgIHlfc2hpZnQgPSAxOwotICB9Ci0KLSAgLy8gVHJhbnNmb3JtIHRoZSBkZXN0aW5hdGlvbiByZWN0YW5nbGUgdG8gbG9jYWwgY29vcmRpbmF0ZXMuCi0gIGNvbnN0IFNrTWF0cml4JiBsb2NhbF9tYXRyaXggPSBjYW52YXMtPmdldFRvdGFsTWF0cml4KCk7Ci0gIFNrUmVjdCBsb2NhbF9kZXN0X3JlY3Q7Ci0gIGxvY2FsX21hdHJpeC5tYXBSZWN0KCZsb2NhbF9kZXN0X3JlY3QsIGRlc3RfcmVjdCk7Ci0KLSAgLy8gQWZ0ZXIgcHJvamVjdGluZyB0aGUgZGVzdGluYXRpb24gcmVjdGFuZ2xlIHRvIGxvY2FsIGNvb3JkaW5hdGVzLCByb3VuZAotICAvLyB0aGUgcHJvamVjdGVkIHJlY3RhbmdsZSB0byBpbnRlZ2VyIHZhbHVlcywgdGhpcyB3aWxsIGdpdmUgdXMgcGl4ZWwgdmFsdWVzCi0gIC8vIG9mIHRoZSByZWN0YW5nbGUuCi0gIFNrSVJlY3QgbG9jYWxfZGVzdF9pcmVjdCwgbG9jYWxfZGVzdF9pcmVjdF9zYXZlZDsKLSAgbG9jYWxfZGVzdF9yZWN0LnJvdW5kKCZsb2NhbF9kZXN0X2lyZWN0KTsKLSAgbG9jYWxfZGVzdF9yZWN0LnJvdW5kKCZsb2NhbF9kZXN0X2lyZWN0X3NhdmVkKTsKLQotICAvLyBObyBwb2ludCBwYWludGluZyBpZiB0aGUgZGVzdGluYXRpb24gcmVjdCBkb2Vzbid0IGludGVyc2VjdCB3aXRoIHRoZQotICAvLyBjbGlwIHJlY3QuCi0gIGlmICghbG9jYWxfZGVzdF9pcmVjdC5pbnRlcnNlY3QoY2FudmFzLT5nZXRUb3RhbENsaXAoKS5nZXRCb3VuZHMoKSkpCi0gICAgcmV0dXJuOwotCi0gIC8vIEF0IHRoaXMgcG9pbnQgfGxvY2FsX2Rlc3RfaXJlY3R8IGNvbnRhaW5zIHRoZSByZWN0IHRoYXQgd2Ugc2hvdWxkIGRyYXcKLSAgLy8gdG8gd2l0aGluIHRoZSBjbGlwcGluZyByZWN0LgotCi0gIC8vIENhbGN1bGF0ZSB0aGUgYWRkcmVzcyBmb3IgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiBkZXN0aW5hdGlvbiByZWN0IGluCi0gIC8vIHRoZSBjYW52YXMgdGhhdCB3ZSB3aWxsIGRyYXcgdG8uIFRoZSBhZGRyZXNzIGlzIG9idGFpbmVkIGJ5IHRoZSBiYXNlCi0gIC8vIGFkZHJlc3Mgb2YgdGhlIGNhbnZhcyBzaGlmdGVkIGJ5ICJsZWZ0IiBhbmQgInRvcCIgb2YgdGhlIHJlY3QuCi0gIHVpbnQ4KiBkZXN0X3JlY3RfcG9pbnRlciA9IHN0YXRpY19jYXN0PHVpbnQ4Kj4oYml0bWFwLmdldFBpeGVscygpKSArCi0gICAgICBsb2NhbF9kZXN0X2lyZWN0LmZUb3AgKiBiaXRtYXAucm93Qnl0ZXMoKSArCi0gICAgICBsb2NhbF9kZXN0X2lyZWN0LmZMZWZ0ICogNDsKLQotICAvLyBQcm9qZWN0IHRoZSBjbGlwIHJlY3QgdG8gdGhlIG9yaWdpbmFsIHZpZGVvIGZyYW1lLCBvYnRhaW5zIHRoZQotICAvLyBkaW1lbnNpb25zIG9mIHRoZSBwcm9qZWN0ZWQgY2xpcCByZWN0LCAibGVmdCIgYW5kICJ0b3AiIG9mIHRoZSByZWN0LgotICAvLyBUaGUgbWF0aCBoZXJlIGFyZSBhbGwgaW50ZWdlciBtYXRoIHNvIHdlIHdvbid0IGhhdmUgcm91bmRpbmcgZXJyb3IgYW5kCi0gIC8vIHdyaXRlIG91dHNpZGUgb2YgdGhlIGNhbnZhcy4KLSAgLy8gV2UgaGF2ZSB0aGUgYXNzdW1wdGlvbnMgb2YgZGVzdF9yZWN0LndpZHRoKCkgYW5kIGRlc3RfcmVjdC5oZWlnaHQoKQotICAvLyBiZWluZyBub24temVybywgdGhlc2UgYXJlIHZhbGlkIGFzc3VtcHRpb25zIHNpbmNlIGZpbmRpbmcgaW50ZXJzZWN0aW9uCi0gIC8vIGFib3ZlIHJlamVjdHMgZW1wdHkgcmVjdGFuZ2xlIHNvIHdlIGp1c3QgZG8gYSBEQ0hFQ0sgaGVyZS4KLSAgRENIRUNLX05FKDAsIGRlc3RfcmVjdC53aWR0aCgpKTsKLSAgRENIRUNLX05FKDAsIGRlc3RfcmVjdC5oZWlnaHQoKSk7Ci0gIHNpemVfdCBmcmFtZV9jbGlwX3dpZHRoID0gbG9jYWxfZGVzdF9pcmVjdC53aWR0aCgpICoKLSAgICAgIHZpZGVvX2ZyYW1lLT52aXNpYmxlX3JlY3QoKS53aWR0aCgpIC8gbG9jYWxfZGVzdF9pcmVjdF9zYXZlZC53aWR0aCgpOwotICBzaXplX3QgZnJhbWVfY2xpcF9oZWlnaHQgPSBsb2NhbF9kZXN0X2lyZWN0LmhlaWdodCgpICoKLSAgICAgIHZpZGVvX2ZyYW1lLT52aXNpYmxlX3JlY3QoKS5oZWlnaHQoKSAvIGxvY2FsX2Rlc3RfaXJlY3Rfc2F2ZWQuaGVpZ2h0KCk7Ci0KLSAgLy8gUHJvamVjdCB0aGUgImxlZnQiIGFuZCAidG9wIiBvZiB0aGUgZmluYWwgZGVzdGluYXRpb24gcmVjdCB0byBsb2NhbAotICAvLyBjb29yZGluYXRlcyBvZiB0aGUgdmlkZW8gZnJhbWUsIHVzZSB0aGVzZSB2YWx1ZXMgdG8gZmluZCB0aGUgb2Zmc2V0cwotICAvLyBpbiB0aGUgdmlkZW8gZnJhbWUgdG8gc3RhcnQgcmVhZGluZy4KLSAgc2l6ZV90IGZyYW1lX2NsaXBfbGVmdCA9Ci0gICAgICB2aWRlb19mcmFtZS0+dmlzaWJsZV9yZWN0KCkueCgpICsKLSAgICAgIChsb2NhbF9kZXN0X2lyZWN0LmZMZWZ0IC0gbG9jYWxfZGVzdF9pcmVjdF9zYXZlZC5mTGVmdCkgKgotICAgICAgdmlkZW9fZnJhbWUtPnZpc2libGVfcmVjdCgpLndpZHRoKCkgLyBsb2NhbF9kZXN0X2lyZWN0X3NhdmVkLndpZHRoKCk7Ci0gIHNpemVfdCBmcmFtZV9jbGlwX3RvcCA9Ci0gICAgICB2aWRlb19mcmFtZS0+dmlzaWJsZV9yZWN0KCkueSgpICsKLSAgICAgIChsb2NhbF9kZXN0X2lyZWN0LmZUb3AgLSBsb2NhbF9kZXN0X2lyZWN0X3NhdmVkLmZUb3ApICoKLSAgICAgIHZpZGVvX2ZyYW1lLT52aXNpYmxlX3JlY3QoKS5oZWlnaHQoKSAvIGxvY2FsX2Rlc3RfaXJlY3Rfc2F2ZWQuaGVpZ2h0KCk7Ci0KLSAgLy8gVXNlIHRoZSAibGVmdCIgYW5kICJ0b3AiIG9mIHRoZSBkZXN0aW5hdGlvbiByZWN0IHRvIGxvY2F0ZSB0aGUgb2Zmc2V0Ci0gIC8vIGluIFksIFUgYW5kIFYgcGxhbmVzLgotICBzaXplX3QgeV9vZmZzZXQgPSAodmlkZW9fZnJhbWUtPnN0cmlkZShtZWRpYTo6VmlkZW9GcmFtZTo6a1lQbGFuZSkgKgotICAgICAgICAgICAgICAgICAgICAgZnJhbWVfY2xpcF90b3ApICsgZnJhbWVfY2xpcF9sZWZ0OwotCi0gIC8vIEZvciBmb3JtYXQgWVYxMiwgdGhlcmUgaXMgb25lIFUsIFYgdmFsdWUgcGVyIDJ4MiBibG9jay4KLSAgLy8gRm9yIGZvcm1hdCBZVjE2LCB0aGVyZSBpcyBvbmUgVSwgViB2YWx1ZSBwZXIgMngxIGJsb2NrLgotICBzaXplX3QgdXZfb2Zmc2V0ID0gKHZpZGVvX2ZyYW1lLT5zdHJpZGUobWVkaWE6OlZpZGVvRnJhbWU6OmtVUGxhbmUpICoKLSAgICAgICAgICAgICAgICAgICAgICAoZnJhbWVfY2xpcF90b3AgPj4geV9zaGlmdCkpICsgKGZyYW1lX2NsaXBfbGVmdCA+PiAxKTsKLSAgdWludDgqIGZyYW1lX2NsaXBfeSA9Ci0gICAgICB2aWRlb19mcmFtZS0+ZGF0YShtZWRpYTo6VmlkZW9GcmFtZTo6a1lQbGFuZSkgKyB5X29mZnNldDsKLSAgdWludDgqIGZyYW1lX2NsaXBfdSA9Ci0gICAgICB2aWRlb19mcmFtZS0+ZGF0YShtZWRpYTo6VmlkZW9GcmFtZTo6a1VQbGFuZSkgKyB1dl9vZmZzZXQ7Ci0gIHVpbnQ4KiBmcmFtZV9jbGlwX3YgPQotICAgICAgdmlkZW9fZnJhbWUtPmRhdGEobWVkaWE6OlZpZGVvRnJhbWU6OmtWUGxhbmUpICsgdXZfb2Zmc2V0OwotCi0vLyBUT0RPOiB0aGlzIGNsYXNzIG5lZWRzIHRvIGRpZSBpbiBhIGZpcmUuCi0jaWYgIWRlZmluZWQoX19MQl9TSEVMTF9fKSAmJiAhZGVmaW5lZChDT0JBTFQpCi0gIC8vIFRPRE8oaGNsYW0pOiBkbyByb3RhdGlvbiBhbmQgbWlycm9yaW5nIGhlcmUuCi0gIC8vIFRPRE8oZmJhcmNoYXJkKTogc3dpdGNoIGZpbHRlcmluZyBiYXNlZCBvbiBwZXJmb3JtYW5jZS4KLSAgYml0bWFwLmxvY2tQaXhlbHMoKTsKLSAgbWVkaWE6OlNjYWxlWVVWVG9SR0IzMihmcmFtZV9jbGlwX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfY2xpcF91LAotICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX2NsaXBfdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3JlY3RfcG9pbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9jbGlwX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX2NsaXBfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX2Rlc3RfaXJlY3Qud2lkdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9kZXN0X2lyZWN0LmhlaWdodCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvX2ZyYW1lLT5zdHJpZGUobWVkaWE6OlZpZGVvRnJhbWU6OmtZUGxhbmUpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvX2ZyYW1lLT5zdHJpZGUobWVkaWE6OlZpZGVvRnJhbWU6OmtVUGxhbmUpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcC5yb3dCeXRlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHl1dl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpST1RBVEVfMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6RklMVEVSX0JJTElORUFSKTsKLSAgYml0bWFwLnVubG9ja1BpeGVscygpOwotI2VuZGlmCi19Ci0KLS8vIENvbnZlcnRzIGEgVmlkZW9GcmFtZSBjb250YWluaW5nIFlVViBkYXRhIHRvIGEgU2tCaXRtYXAgY29udGFpbmluZyBSR0IgZGF0YS4KLS8vCi0vLyB8Yml0bWFwfCB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gbWF0Y2ggdGhlIGRpbWVuc2lvbnMgb2YgfHZpZGVvX2ZyYW1lfC4KLXN0YXRpYyB2b2lkIENvbnZlcnRWaWRlb0ZyYW1lVG9CaXRtYXAoCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxtZWRpYTo6VmlkZW9GcmFtZT4mIHZpZGVvX2ZyYW1lLAotICAgIFNrQml0bWFwKiBiaXRtYXApIHsKLSAgRENIRUNLKElzRWl0aGVyWVYxMk9yWVYxNk9yTmF0aXZlKHZpZGVvX2ZyYW1lLT5mb3JtYXQoKSkpCi0gICAgICA8PCB2aWRlb19mcmFtZS0+Zm9ybWF0KCk7Ci0gIGlmIChJc0VpdGhlcllWMTJPcllWMTYodmlkZW9fZnJhbWUtPmZvcm1hdCgpKSkgewotICAgIERDSEVDS19FUSh2aWRlb19mcmFtZS0+c3RyaWRlKG1lZGlhOjpWaWRlb0ZyYW1lOjprVVBsYW5lKSwKLSAgICAgICAgICAgICAgdmlkZW9fZnJhbWUtPnN0cmlkZShtZWRpYTo6VmlkZW9GcmFtZTo6a1ZQbGFuZSkpOwotICB9Ci0KLSAgLy8gQ2hlY2sgaWYgfGJpdG1hcHwgbmVlZHMgdG8gYmUgKHJlKWFsbG9jYXRlZC4KLSAgaWYgKGJpdG1hcC0+aXNOdWxsKCkgfHwKLSAgICAgIGJpdG1hcC0+d2lkdGgoKSAhPSB2aWRlb19mcmFtZS0+dmlzaWJsZV9yZWN0KCkud2lkdGgoKSB8fAotICAgICAgYml0bWFwLT5oZWlnaHQoKSAhPSB2aWRlb19mcmFtZS0+dmlzaWJsZV9yZWN0KCkuaGVpZ2h0KCkpIHsKLSAgICBiaXRtYXAtPnNldENvbmZpZyhTa0JpdG1hcDo6a0FSR0JfODg4OF9Db25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgdmlkZW9fZnJhbWUtPnZpc2libGVfcmVjdCgpLndpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgdmlkZW9fZnJhbWUtPnZpc2libGVfcmVjdCgpLmhlaWdodCgpKTsKLSAgICBiaXRtYXAtPmFsbG9jUGl4ZWxzKCk7Ci0gICAgYml0bWFwLT5zZXRJc1ZvbGF0aWxlKHRydWUpOwotICB9Ci0KLSNpZiAhZGVmaW5lZChfX0xCX1NIRUxMX18pICYmICFkZWZpbmVkKENPQkFMVCkKLSAgYml0bWFwLT5sb2NrUGl4ZWxzKCk7Ci0gIGlmIChJc0VpdGhlcllWMTJPcllWMTYodmlkZW9fZnJhbWUtPmZvcm1hdCgpKSkgewotICAgIG1lZGlhOjpZVVZUeXBlIHl1dl90eXBlID0gbWVkaWE6OllWMTY7Ci0gICAgaW50IHlfc2hpZnQgPSAwOwotICAgIGlmICh2aWRlb19mcmFtZS0+Zm9ybWF0KCkgPT0gbWVkaWE6OlZpZGVvRnJhbWU6OllWMTIpIHsKLSAgICAgIHl1dl90eXBlID0gbWVkaWE6OllWMTI7Ci0gICAgICB5X3NoaWZ0ID0gMTsKLSAgICB9Ci0KLSAgICAvLyBVc2UgdGhlICJsZWZ0IiBhbmQgInRvcCIgb2YgdGhlIGRlc3RpbmF0aW9uIHJlY3QgdG8gbG9jYXRlIHRoZSBvZmZzZXQKLSAgICAvLyBpbiBZLCBVIGFuZCBWIHBsYW5lcy4KLSAgICBzaXplX3QgeV9vZmZzZXQgPSAodmlkZW9fZnJhbWUtPnN0cmlkZShtZWRpYTo6VmlkZW9GcmFtZTo6a1lQbGFuZSkgKgotICAgICAgICAgICAgICAgICAgICAgICB2aWRlb19mcmFtZS0+dmlzaWJsZV9yZWN0KCkueSgpKSArCi0gICAgICAgICAgICAgICAgICAgICAgdmlkZW9fZnJhbWUtPnZpc2libGVfcmVjdCgpLngoKTsKLQotICAgIC8vIEZvciBmb3JtYXQgWVYxMiwgdGhlcmUgaXMgb25lIFUsIFYgdmFsdWUgcGVyIDJ4MiBibG9jay4KLSAgICAvLyBGb3IgZm9ybWF0IFlWMTYsIHRoZXJlIGlzIG9uZSBVLCBWIHZhbHVlIHBlciAyeDEgYmxvY2suCi0gICAgc2l6ZV90IHV2X29mZnNldCA9ICh2aWRlb19mcmFtZS0+c3RyaWRlKG1lZGlhOjpWaWRlb0ZyYW1lOjprVVBsYW5lKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAodmlkZW9fZnJhbWUtPnZpc2libGVfcmVjdCgpLnkoKSA+PiB5X3NoaWZ0KSkgKwotICAgICAgICAgICAgICAgICAgICAgICAodmlkZW9fZnJhbWUtPnZpc2libGVfcmVjdCgpLngoKSA+PiAxKTsKLSAgICB1aW50OCogZnJhbWVfY2xpcF95ID0KLSAgICAgICAgdmlkZW9fZnJhbWUtPmRhdGEobWVkaWE6OlZpZGVvRnJhbWU6OmtZUGxhbmUpICsgeV9vZmZzZXQ7Ci0gICAgdWludDgqIGZyYW1lX2NsaXBfdSA9Ci0gICAgICAgIHZpZGVvX2ZyYW1lLT5kYXRhKG1lZGlhOjpWaWRlb0ZyYW1lOjprVVBsYW5lKSArIHV2X29mZnNldDsKLSAgICB1aW50OCogZnJhbWVfY2xpcF92ID0KLSAgICAgICAgdmlkZW9fZnJhbWUtPmRhdGEobWVkaWE6OlZpZGVvRnJhbWU6OmtWUGxhbmUpICsgdXZfb2Zmc2V0OwotCi0gICAgbWVkaWE6OkNvbnZlcnRZVVZUb1JHQjMyKGZyYW1lX2NsaXBfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfY2xpcF91LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9jbGlwX3YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4Kj4oYml0bWFwLT5nZXRQaXhlbHMoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvX2ZyYW1lLT52aXNpYmxlX3JlY3QoKS53aWR0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb19mcmFtZS0+dmlzaWJsZV9yZWN0KCkuaGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvX2ZyYW1lLT5zdHJpZGUobWVkaWE6OlZpZGVvRnJhbWU6OmtZUGxhbmUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb19mcmFtZS0+c3RyaWRlKG1lZGlhOjpWaWRlb0ZyYW1lOjprVVBsYW5lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwLT5yb3dCeXRlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXZfdHlwZSk7Ci0gIH0gZWxzZSB7Ci0gICAgRENIRUNLX0VRKHZpZGVvX2ZyYW1lLT5mb3JtYXQoKSwgbWVkaWE6OlZpZGVvRnJhbWU6Ok5BVElWRV9URVhUVVJFKTsKLSAgICB2aWRlb19mcmFtZS0+UmVhZFBpeGVsc0Zyb21OYXRpdmVUZXh0dXJlKGJpdG1hcC0+Z2V0UGl4ZWxzKCkpOwotICB9Ci0gIGJpdG1hcC0+bm90aWZ5UGl4ZWxzQ2hhbmdlZCgpOwotICBiaXRtYXAtPnVubG9ja1BpeGVscygpOwotI2VuZGlmCi19Ci0KLVNrQ2FudmFzVmlkZW9SZW5kZXJlcjo6U2tDYW52YXNWaWRlb1JlbmRlcmVyKCkKLSAgICA6IGxhc3RfZnJhbWVfdGltZXN0YW1wXyhtZWRpYTo6a05vVGltZXN0YW1wKCkpIHsKLX0KLQotU2tDYW52YXNWaWRlb1JlbmRlcmVyOjp+U2tDYW52YXNWaWRlb1JlbmRlcmVyKCkge30KLQotdm9pZCBTa0NhbnZhc1ZpZGVvUmVuZGVyZXI6OlBhaW50KG1lZGlhOjpWaWRlb0ZyYW1lKiB2aWRlb19mcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa0NhbnZhcyogY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdmeDo6UmVjdEYmIGRlc3RfcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFscGhhKSB7Ci0gIGlmIChhbHBoYSA9PSAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgU2tSZWN0IGRlc3Q7Ci0gIGRlc3Quc2V0KGRlc3RfcmVjdC54KCksIGRlc3RfcmVjdC55KCksIGRlc3RfcmVjdC5yaWdodCgpLCBkZXN0X3JlY3QuYm90dG9tKCkpOwotCi0gIFNrUGFpbnQgcGFpbnQ7Ci0gIHBhaW50LnNldEFscGhhKGFscGhhKTsKLQotICAvLyBQYWludCBibGFjayByZWN0YW5nbGUgaWYgdGhlcmUgaXNuJ3QgYSBmcmFtZSBhdmFpbGFibGUgb3IgdGhlCi0gIC8vIGZyYW1lIGhhcyBhbiB1bmV4cGVjdGVkIGZvcm1hdC4KLSAgaWYgKCF2aWRlb19mcmFtZSB8fCAhSXNFaXRoZXJZVjEyT3JZVjE2T3JOYXRpdmUodmlkZW9fZnJhbWUtPmZvcm1hdCgpKSkgewotICAgIGNhbnZhcy0+ZHJhd1JlY3QoZGVzdCwgcGFpbnQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFNjYWxlIGFuZCBjb252ZXJ0IHRvIFJHQiBpbiBvbmUgc3RlcCBpZiB3ZSBjYW4uCi0gIGlmIChDYW5GYXN0UGFpbnQoY2FudmFzLCBhbHBoYSwgdmlkZW9fZnJhbWUtPmZvcm1hdCgpKSkgewotICAgIEZhc3RQYWludCh2aWRlb19mcmFtZSwgY2FudmFzLCBkZXN0KTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBDaGVjayBpZiB3ZSBzaG91bGQgY29udmVydCBhbmQgdXBkYXRlIHxsYXN0X2ZyYW1lX3wuCi0gIGlmIChsYXN0X2ZyYW1lXy5pc051bGwoKSB8fAotICAgICAgdmlkZW9fZnJhbWUtPkdldFRpbWVzdGFtcCgpICE9IGxhc3RfZnJhbWVfdGltZXN0YW1wXykgewotICAgIENvbnZlcnRWaWRlb0ZyYW1lVG9CaXRtYXAodmlkZW9fZnJhbWUsICZsYXN0X2ZyYW1lXyk7Ci0gICAgbGFzdF9mcmFtZV90aW1lc3RhbXBfID0gdmlkZW9fZnJhbWUtPkdldFRpbWVzdGFtcCgpOwotICB9Ci0KLSAgLy8gRG8gYSBzbG93ZXIgcGFpbnQgdXNpbmcgfGxhc3RfZnJhbWVffC4KLSAgcGFpbnQuc2V0RmlsdGVyQml0bWFwKHRydWUpOwotICBjYW52YXMtPmRyYXdCaXRtYXBSZWN0KGxhc3RfZnJhbWVfLCBOVUxMLCBkZXN0LCAmcGFpbnQpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9za2NhbnZhc192aWRlb19yZW5kZXJlci5oIGIvc3JjL21lZGlhL2ZpbHRlcnMvc2tjYW52YXNfdmlkZW9fcmVuZGVyZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRhZmNmMy4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9za2NhbnZhc192aWRlb19yZW5kZXJlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9GSUxURVJTX1NLQ0FOVkFTX1ZJREVPX1JFTkRFUkVSX0hfCi0jZGVmaW5lIE1FRElBX0ZJTFRFUlNfU0tDQU5WQVNfVklERU9fUkVOREVSRVJfSF8KLQotI2luY2x1ZGUgImJhc2UvdGltZS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0jaW5jbHVkZSAidWkvZ2Z4L3JlY3QuaCIKLQotI2lmIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLQotY2xhc3MgU2tDYW52YXM7Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIFZpZGVvRnJhbWU7Ci0KLWNsYXNzIE1FRElBX0VYUE9SVCBTa0NhbnZhc1ZpZGVvUmVuZGVyZXIgewotIHB1YmxpYzoKLSAgdm9pZCBQYWludChWaWRlb0ZyYW1lKiB2aWRlb19mcmFtZSwgU2tDYW52YXMqIGNhbnZhcywKLSAgICAgICAgICAgICBjb25zdCBnZng6OlJlY3RGJiBkZXN0X3JlY3QsIHVpbnQ4X3QgYWxwaGEpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbHNlICAvLyBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvY29yZS9Ta0JpdG1hcC5oIgotCi1jbGFzcyBTa0NhbnZhczsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgVmlkZW9GcmFtZTsKLQotLy8gSGFuZGxlcyByZW5kZXJpbmcgb2YgVmlkZW9GcmFtZXMgdG8gU2tDYW52YXNlcywgZG9pbmcgYW55IG5lY2Vzc2FyeSBZVVYKLS8vIGNvbnZlcnNpb24gYW5kIGNhY2hpbmcgb2YgcmVzdWx0aW5nIFJHQiBiaXRtYXBzLgotY2xhc3MgTUVESUFfRVhQT1JUIFNrQ2FudmFzVmlkZW9SZW5kZXJlciB7Ci0gcHVibGljOgotICBTa0NhbnZhc1ZpZGVvUmVuZGVyZXIoKTsKLSAgflNrQ2FudmFzVmlkZW9SZW5kZXJlcigpOwotCi0gIC8vIFBhaW50cyB8dmlkZW9fZnJhbWV8IG9uIHxjYW52YXN8LCBzY2FsaW5nIHRoZSByZXN1bHQgdG8gZml0IGRpbWVuc2lvbnMKLSAgLy8gc3BlY2lmaWVkIGJ5IHxkZXN0X3JlY3R8LgotICAvLwotICAvLyBCbGFjayB3aWxsIGJlIHBhaW50ZWQgb24gfGNhbnZhc3wgaWYgfHZpZGVvX2ZyYW1lfCBpcyBudWxsLgotICB2b2lkIFBhaW50KG1lZGlhOjpWaWRlb0ZyYW1lKiB2aWRlb19mcmFtZSwKLSAgICAgICAgICAgICBTa0NhbnZhcyogY2FudmFzLAotICAgICAgICAgICAgIGNvbnN0IGdmeDo6UmVjdEYmIGRlc3RfcmVjdCwKLSAgICAgICAgICAgICB1aW50OF90IGFscGhhKTsKLQotIHByaXZhdGU6Ci0gIC8vIEFuIFJHQiBiaXRtYXAgYW5kIGNvcnJlc3BvbmRpbmcgdGltZXN0YW1wIG9mIHRoZSBwcmV2aW91c2x5IGNvbnZlcnRlZAotICAvLyB2aWRlbyBmcmFtZSBkYXRhLgotICBTa0JpdG1hcCBsYXN0X2ZyYW1lXzsKLSAgYmFzZTo6VGltZURlbHRhIGxhc3RfZnJhbWVfdGltZXN0YW1wXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU2tDYW52YXNWaWRlb1JlbmRlcmVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLQotI2VuZGlmICAvLyBNRURJQV9GSUxURVJTX1NLQ0FOVkFTX1ZJREVPX1JFTkRFUkVSX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9za2NhbnZhc192aWRlb19yZW5kZXJlcl91bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9maWx0ZXJzL3NrY2FudmFzX3ZpZGVvX3JlbmRlcmVyX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTBmMjY2Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL3NrY2FudmFzX3ZpZGVvX3JlbmRlcmVyX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2ZyYW1lLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb191dGlsLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL2NvcmUvU2tDYW52YXMuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvY29yZS9Ta0RldmljZS5oIgotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvc2tjYW52YXNfdmlkZW9fcmVuZGVyZXIuaCIKLQotdXNpbmcgbWVkaWE6OlZpZGVvRnJhbWU7Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLXN0YXRpYyBjb25zdCBpbnQga1dpZHRoID0gMzIwOwotc3RhdGljIGNvbnN0IGludCBrSGVpZ2h0ID0gMjQwOwotc3RhdGljIGNvbnN0IGdmeDo6UmVjdCBrTmF0dXJhbFJlY3QoMCwgMCwga1dpZHRoLCBrSGVpZ2h0KTsKLQotLy8gSGVscGVyIGZvciBmaWxsaW5nIGEgfGNhbnZhc3wgd2l0aCBhIHNvbGlkIHxjb2xvcnwuCi12b2lkIEZpbGxDYW52YXMoU2tDYW52YXMqIGNhbnZhcywgU2tDb2xvciBjb2xvcikgewotICBjb25zdCBTa0JpdG1hcCYgYml0bWFwID0gY2FudmFzLT5nZXREZXZpY2UoKS0+YWNjZXNzQml0bWFwKHRydWUpOwotICBiaXRtYXAubG9ja1BpeGVscygpOwotICBiaXRtYXAuZXJhc2VDb2xvcihjb2xvcik7Ci0gIGJpdG1hcC51bmxvY2tQaXhlbHMoKTsKLX0KLQotLy8gSGVscGVyIGZvciByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIGEgc29saWQgfGNhbnZhc3wuCi1Ta0NvbG9yIEdldENvbG9yQXQoU2tDYW52YXMqIGNhbnZhcywgaW50IHgsIGludCB5KSB7Ci0gIGNvbnN0IFNrQml0bWFwJiBiaXRtYXAgPSBjYW52YXMtPmdldERldmljZSgpLT5hY2Nlc3NCaXRtYXAoZmFsc2UpOwotICBiaXRtYXAubG9ja1BpeGVscygpOwotICBTa0NvbG9yIGMgPSBiaXRtYXAuZ2V0Q29sb3IoeCwgeSk7Ci0gIGJpdG1hcC51bmxvY2tQaXhlbHMoKTsKLSAgcmV0dXJuIGM7Ci19Ci0KLVNrQ29sb3IgR2V0Q29sb3IoU2tDYW52YXMqIGNhbnZhcykgewotICByZXR1cm4gR2V0Q29sb3JBdChjYW52YXMsIDAsIDApOwotfQotCi1jbGFzcyBTa0NhbnZhc1ZpZGVvUmVuZGVyZXJUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgZW51bSBDb2xvciB7Ci0gICAga05vbmUsCi0gICAga1JlZCwKLSAgICBrR3JlZW4sCi0gICAga0JsdWUsCi0gIH07Ci0KLSAgU2tDYW52YXNWaWRlb1JlbmRlcmVyVGVzdCgpOwotICB2aXJ0dWFsIH5Ta0NhbnZhc1ZpZGVvUmVuZGVyZXJUZXN0KCk7Ci0KLSAgLy8gUGFpbnRzIHRvIHxjYW52YXN8IHVzaW5nIHxyZW5kZXJlcl98IHdpdGhvdXQgYW55IGZyYW1lIGRhdGEuCi0gIHZvaWQgUGFpbnRXaXRob3V0RnJhbWUoU2tDYW52YXMqIGNhbnZhcyk7Ci0KLSAgLy8gUGFpbnRzIHRoZSB8dmlkZW9fZnJhbWV8IHRvIHRoZSB8Y2FudmFzfCB1c2luZyB8cmVuZGVyZXJffCwgc2V0dGluZyB0aGUKLSAgLy8gY29sb3Igb2YgfHZpZGVvX2ZyYW1lfCB0byB8Y29sb3J8IGZpcnN0LgotICB2b2lkIFBhaW50KFZpZGVvRnJhbWUqIHZpZGVvX2ZyYW1lLCBTa0NhbnZhcyogY2FudmFzLCBDb2xvciBjb2xvcik7Ci0KLSAgLy8gR2V0dGVycyBmb3IgdmFyaW91cyBmcmFtZSBzaXplcy4KLSAgVmlkZW9GcmFtZSogbmF0dXJhbF9mcmFtZSgpIHsgcmV0dXJuIG5hdHVyYWxfZnJhbWVfOyB9Ci0gIFZpZGVvRnJhbWUqIGxhcmdlcl9mcmFtZSgpIHsgcmV0dXJuIGxhcmdlcl9mcmFtZV87IH0KLSAgVmlkZW9GcmFtZSogc21hbGxlcl9mcmFtZSgpIHsgcmV0dXJuIHNtYWxsZXJfZnJhbWVfOyB9Ci0gIFZpZGVvRnJhbWUqIGNyb3BwZWRfZnJhbWUoKSB7IHJldHVybiBjcm9wcGVkX2ZyYW1lXzsgfQotCi0gIC8vIEdldHRlcnMgZm9yIGNhbnZhc2VzIHRoYXQgdHJpZ2dlciB0aGUgdmFyaW91cyBwYWludGluZyBwYXRocy4KLSAgU2tDYW52YXMqIGZhc3RfcGF0aF9jYW52YXMoKSB7IHJldHVybiAmZmFzdF9wYXRoX2NhbnZhc187IH0KLSAgU2tDYW52YXMqIHNsb3dfcGF0aF9jYW52YXMoKSB7IHJldHVybiAmc2xvd19wYXRoX2NhbnZhc187IH0KLQotIHByaXZhdGU6Ci0gIFNrQ2FudmFzVmlkZW9SZW5kZXJlciByZW5kZXJlcl87Ci0KLSAgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiBuYXR1cmFsX2ZyYW1lXzsKLSAgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiBsYXJnZXJfZnJhbWVfOwotICBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IHNtYWxsZXJfZnJhbWVfOwotICBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IGNyb3BwZWRfZnJhbWVfOwotCi0gIFNrRGV2aWNlIGZhc3RfcGF0aF9kZXZpY2VfOwotICBTa0NhbnZhcyBmYXN0X3BhdGhfY2FudmFzXzsKLSAgU2tEZXZpY2Ugc2xvd19wYXRoX2RldmljZV87Ci0gIFNrQ2FudmFzIHNsb3dfcGF0aF9jYW52YXNfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTa0NhbnZhc1ZpZGVvUmVuZGVyZXJUZXN0KTsKLX07Ci0KLVNrQ2FudmFzVmlkZW9SZW5kZXJlclRlc3Q6OlNrQ2FudmFzVmlkZW9SZW5kZXJlclRlc3QoKQotICAgIDogbmF0dXJhbF9mcmFtZV8oVmlkZW9GcmFtZTo6Q3JlYXRlQmxhY2tGcmFtZShnZng6OlNpemUoa1dpZHRoLCBrSGVpZ2h0KSkpLAotICAgICAgbGFyZ2VyX2ZyYW1lXyhWaWRlb0ZyYW1lOjpDcmVhdGVCbGFja0ZyYW1lKAotICAgICAgICAgIGdmeDo6U2l6ZShrV2lkdGggKiAyLCBrSGVpZ2h0ICogMikpKSwKLSAgICAgIHNtYWxsZXJfZnJhbWVfKFZpZGVvRnJhbWU6OkNyZWF0ZUJsYWNrRnJhbWUoCi0gICAgICAgICAgZ2Z4OjpTaXplKGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKSkpLAotICAgICAgY3JvcHBlZF9mcmFtZV8oVmlkZW9GcmFtZTo6Q3JlYXRlRnJhbWUoCi0gICAgICAgICAgVmlkZW9GcmFtZTo6WVYxMiwKLSAgICAgICAgICBnZng6OlNpemUoMTYsIDE2KSwKLSAgICAgICAgICBnZng6OlJlY3QoNiwgNiwgOCwgNiksCi0gICAgICAgICAgZ2Z4OjpTaXplKDgsIDYpLAotICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyg0KSkpLAotICAgICAgZmFzdF9wYXRoX2RldmljZV8oU2tCaXRtYXA6OmtBUkdCXzg4ODhfQ29uZmlnLCBrV2lkdGgsIGtIZWlnaHQsIHRydWUpLAotICAgICAgZmFzdF9wYXRoX2NhbnZhc18oJmZhc3RfcGF0aF9kZXZpY2VfKSwKLSAgICAgIHNsb3dfcGF0aF9kZXZpY2VfKFNrQml0bWFwOjprQVJHQl84ODg4X0NvbmZpZywga1dpZHRoLCBrSGVpZ2h0LCBmYWxzZSksCi0gICAgICBzbG93X3BhdGhfY2FudmFzXygmc2xvd19wYXRoX2RldmljZV8pIHsKLSAgLy8gR2l2ZSBlYWNoIGZyYW1lIGEgdW5pcXVlIHRpbWVzdGFtcC4KLSAgbmF0dXJhbF9mcmFtZV8tPlNldFRpbWVzdGFtcChiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMSkpOwotICBsYXJnZXJfZnJhbWVfLT5TZXRUaW1lc3RhbXAoYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDIpKTsKLSAgc21hbGxlcl9mcmFtZV8tPlNldFRpbWVzdGFtcChiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMykpOwotCi0gIC8vIE1ha2Ugc3VyZSB0aGUgY3JvcHBlZCB2aWRlbyBmcmFtZSdzIGFzcGVjdCByYXRpbyBtYXRjaGVzIHRoZSBvdXRwdXQgZGV2aWNlLgotICAvLyBVcGRhdGUgY3JvcHBlZF9mcmFtZV8ncyBjcm9wIGRpbWVuc2lvbnMgaWYgdGhpcyBpcyBub3QgdGhlIGNhc2UuCi0gIEVYUEVDVF9FUShjcm9wcGVkX2ZyYW1lKCktPm5hdHVyYWxfc2l6ZSgpLndpZHRoKCkgKiBrSGVpZ2h0LAotICAgICAgY3JvcHBlZF9mcmFtZSgpLT5uYXR1cmFsX3NpemUoKS5oZWlnaHQoKSAqIGtXaWR0aCk7Ci0KLSAgLy8gRmlsbCBpbiB0aGUgY3JvcHBlZCBmcmFtZSdzIGVudGlyZSBkYXRhIHdpdGggY29sb3JzOgotICAvLwotICAvLyAgIEJsIEJsIEJsIEJsIEJsIEJsIEJsIEJsIFIgIFIgIFIgIFIgIFIgIFIgIFIgIFIKLSAgLy8gICBCbCBCbCBCbCBCbCBCbCBCbCBCbCBCbCBSICBSICBSICBSICBSICBSICBSICBSCi0gIC8vICAgQmwgQmwgQmwgQmwgQmwgQmwgQmwgQmwgUiAgUiAgUiAgUiAgUiAgUiAgUiAgUgotICAvLyAgIEJsIEJsIEJsIEJsIEJsIEJsIEJsIEJsIFIgIFIgIFIgIFIgIFIgIFIgIFIgIFIKLSAgLy8gICBCbCBCbCBCbCBCbCBCbCBCbCBCbCBCbCBSICBSICBSICBSICBSICBSICBSICBSCi0gIC8vICAgQmwgQmwgQmwgQmwgQmwgQmwgQmwgQmwgUiAgUiAgUiAgUiAgUiAgUiAgUiAgUgotICAvLyAgIEJsIEJsIEJsIEJsIEJsIEJsIEJsIEJsIFIgIFIgIFIgIFIgIFIgIFIgIFIgIFIKLSAgLy8gICBCbCBCbCBCbCBCbCBCbCBCbCBCbCBCbCBSICBSICBSICBSICBSICBSICBSICBSCi0gIC8vICAgRyAgRyAgRyAgRyAgRyAgRyAgRyAgRyAgQiAgQiAgQiAgQiAgQiAgQiAgQiAgQgotICAvLyAgIEcgIEcgIEcgIEcgIEcgIEcgIEcgIEcgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIKLSAgLy8gICBHICBHICBHICBHICBHICBHICBHICBHICBCICBCICBCICBCICBCICBCICBCICBCCi0gIC8vICAgRyAgRyAgRyAgRyAgRyAgRyAgRyAgRyAgQiAgQiAgQiAgQiAgQiAgQiAgQiAgQgotICAvLyAgIEcgIEcgIEcgIEcgIEcgIEcgIEcgIEcgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIKLSAgLy8gICBHICBHICBHICBHICBHICBHICBHICBHICBCICBCICBCICBCICBCICBCICBCICBCCi0gIC8vICAgRyAgRyAgRyAgRyAgRyAgRyAgRyAgRyAgQiAgQiAgQiAgQiAgQiAgQiAgQiAgQgotICAvLyAgIEcgIEcgIEcgIEcgIEcgIEcgIEcgIEcgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIKLSAgLy8KLSAgLy8gVGhlIHZpc2libGUgY3JvcCBvZiB0aGUgZnJhbWUgKGFzIHNldCBieSBpdHMgdmlzaWJsZV9yZWN0XykgaGFzIGNvbnRlbnRzOgotICAvLwotICAvLyAgIEJsIEJsIFIgIFIgIFIgIFIgIFIgIFIKLSAgLy8gICBCbCBCbCBSICBSICBSICBSICBSICBSCi0gIC8vICAgRyAgRyAgQiAgQiAgQiAgQiAgQiAgQgotICAvLyAgIEcgIEcgIEIgIEIgIEIgIEIgIEIgIEIKLSAgLy8gICBHICBHICBCICBCICBCICBCICBCICBCCi0gIC8vICAgRyAgRyAgQiAgQiAgQiAgQiAgQiAgQgotICAvLwotICAvLyBFYWNoIGNvbG9yIHJlZ2lvbiBpbiB0aGUgY3JvcHBlZCBmcmFtZSBpcyBvbiBhIDJ4MiBibG9jayBncmFudWxhcml0eSwgdG8KLSAgLy8gYXZvaWQgc2hhcmluZyBVViBzYW1wbGVzIGJldHdlZW4gcmVnaW9ucy4KLQotICBzdGF0aWMgY29uc3QgdWludDggY3JvcHBlZF95X3BsYW5lW10gPSB7Ci0gICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDc2LCA3NiwgNzYsIDc2LCA3NiwgNzYsIDc2LCA3NiwKLSAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgNzYsIDc2LCA3NiwgNzYsIDc2LCA3NiwgNzYsIDc2LAotICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCA3NiwgNzYsIDc2LCA3NiwgNzYsIDc2LCA3NiwgNzYsCi0gICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDc2LCA3NiwgNzYsIDc2LCA3NiwgNzYsIDc2LCA3NiwKLSAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgNzYsIDc2LCA3NiwgNzYsIDc2LCA3NiwgNzYsIDc2LAotICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCA3NiwgNzYsIDc2LCA3NiwgNzYsIDc2LCA3NiwgNzYsCi0gICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDc2LCA3NiwgNzYsIDc2LCA3NiwgNzYsIDc2LCA3NiwKLSAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgNzYsIDc2LCA3NiwgNzYsIDc2LCA3NiwgNzYsIDc2LAotICAgIDE0OSwgMTQ5LCAxNDksIDE0OSwgMTQ5LCAxNDksIDE0OSwgMTQ5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksCi0gICAgMTQ5LCAxNDksIDE0OSwgMTQ5LCAxNDksIDE0OSwgMTQ5LCAxNDksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwKLSAgICAxNDksIDE0OSwgMTQ5LCAxNDksIDE0OSwgMTQ5LCAxNDksIDE0OSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LAotICAgIDE0OSwgMTQ5LCAxNDksIDE0OSwgMTQ5LCAxNDksIDE0OSwgMTQ5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksCi0gICAgMTQ5LCAxNDksIDE0OSwgMTQ5LCAxNDksIDE0OSwgMTQ5LCAxNDksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwKLSAgICAxNDksIDE0OSwgMTQ5LCAxNDksIDE0OSwgMTQ5LCAxNDksIDE0OSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LAotICAgIDE0OSwgMTQ5LCAxNDksIDE0OSwgMTQ5LCAxNDksIDE0OSwgMTQ5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksCi0gICAgMTQ5LCAxNDksIDE0OSwgMTQ5LCAxNDksIDE0OSwgMTQ5LCAxNDksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwKLSAgfTsKLQotICBzdGF0aWMgY29uc3QgdWludDggY3JvcHBlZF91X3BsYW5lW10gPSB7Ci0gICAgMTI4LCAxMjgsIDEyOCwgMTI4LCAgODQsICA4NCwgIDg0LCAgODQsCi0gICAgMTI4LCAxMjgsIDEyOCwgMTI4LCAgODQsICA4NCwgIDg0LCAgODQsCi0gICAgMTI4LCAxMjgsIDEyOCwgMTI4LCAgODQsICA4NCwgIDg0LCAgODQsCi0gICAgMTI4LCAxMjgsIDEyOCwgMTI4LCAgODQsICA4NCwgIDg0LCAgODQsCi0gICAgIDQzLCAgNDMsICA0MywgIDQzLCAyNTUsIDI1NSwgMjU1LCAyNTUsCi0gICAgIDQzLCAgNDMsICA0MywgIDQzLCAyNTUsIDI1NSwgMjU1LCAyNTUsCi0gICAgIDQzLCAgNDMsICA0MywgIDQzLCAyNTUsIDI1NSwgMjU1LCAyNTUsCi0gICAgIDQzLCAgNDMsICA0MywgIDQzLCAyNTUsIDI1NSwgMjU1LCAyNTUsCi0gIH07Ci0gIHN0YXRpYyBjb25zdCB1aW50OCBjcm9wcGVkX3ZfcGxhbmVbXSA9IHsKLSAgICAxMjgsIDEyOCwgMTI4LCAxMjgsIDI1NSwgMjU1LCAyNTUsIDI1NSwKLSAgICAxMjgsIDEyOCwgMTI4LCAxMjgsIDI1NSwgMjU1LCAyNTUsIDI1NSwKLSAgICAxMjgsIDEyOCwgMTI4LCAxMjgsIDI1NSwgMjU1LCAyNTUsIDI1NSwKLSAgICAxMjgsIDEyOCwgMTI4LCAxMjgsIDI1NSwgMjU1LCAyNTUsIDI1NSwKLSAgICAgMjEsICAyMSwgIDIxLCAgMjEsIDEwNywgMTA3LCAxMDcsIDEwNywKLSAgICAgMjEsICAyMSwgIDIxLCAgMjEsIDEwNywgMTA3LCAxMDcsIDEwNywKLSAgICAgMjEsICAyMSwgIDIxLCAgMjEsIDEwNywgMTA3LCAxMDcsIDEwNywKLSAgICAgMjEsICAyMSwgIDIxLCAgMjEsIDEwNywgMTA3LCAxMDcsIDEwNywKLSAgfTsKLQotICBtZWRpYTo6Q29weVlQbGFuZShjcm9wcGVkX3lfcGxhbmUsIDE2LCAxNiwgY3JvcHBlZF9mcmFtZSgpKTsKLSAgbWVkaWE6OkNvcHlVUGxhbmUoY3JvcHBlZF91X3BsYW5lLCA4LCA4LCBjcm9wcGVkX2ZyYW1lKCkpOwotICBtZWRpYTo6Q29weVZQbGFuZShjcm9wcGVkX3ZfcGxhbmUsIDgsIDgsIGNyb3BwZWRfZnJhbWUoKSk7Ci19Ci0KLVNrQ2FudmFzVmlkZW9SZW5kZXJlclRlc3Q6On5Ta0NhbnZhc1ZpZGVvUmVuZGVyZXJUZXN0KCkge30KLQotdm9pZCBTa0NhbnZhc1ZpZGVvUmVuZGVyZXJUZXN0OjpQYWludFdpdGhvdXRGcmFtZShTa0NhbnZhcyogY2FudmFzKSB7Ci0gIHJlbmRlcmVyXy5QYWludChOVUxMLCBjYW52YXMsIGtOYXR1cmFsUmVjdCwgMHhGRik7Ci19Ci0KLXZvaWQgU2tDYW52YXNWaWRlb1JlbmRlcmVyVGVzdDo6UGFpbnQoVmlkZW9GcmFtZSogdmlkZW9fZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrQ2FudmFzKiBjYW52YXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yIGNvbG9yKSB7Ci0gIHN3aXRjaCAoY29sb3IpIHsKLSAgICBjYXNlIGtOb25lOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrUmVkOgotICAgICAgbWVkaWE6OkZpbGxZVVYodmlkZW9fZnJhbWUsIDc2LCA4NCwgMjU1KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga0dyZWVuOgotICAgICAgbWVkaWE6OkZpbGxZVVYodmlkZW9fZnJhbWUsIDE0OSwgNDMsIDIxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga0JsdWU6Ci0gICAgICBtZWRpYTo6RmlsbFlVVih2aWRlb19mcmFtZSwgMjksIDI1NSwgMTA3KTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJlbmRlcmVyXy5QYWludCh2aWRlb19mcmFtZSwgY2FudmFzLCBrTmF0dXJhbFJlY3QsIDB4RkYpOwotfQotCi1URVNUX0YoU2tDYW52YXNWaWRlb1JlbmRlcmVyVGVzdCwgRmFzdFBhaW50X05vRnJhbWUpIHsKLSAgLy8gVGVzdCB0aGF0IGJsYWNrIGdldHMgcGFpbnRlZCBvdmVyIGNhbnZhcy4KLSAgRmlsbENhbnZhcyhmYXN0X3BhdGhfY2FudmFzKCksIFNLX0NvbG9yUkVEKTsKLSAgUGFpbnRXaXRob3V0RnJhbWUoZmFzdF9wYXRoX2NhbnZhcygpKTsKLSAgRVhQRUNUX0VRKFNLX0NvbG9yQkxBQ0ssIEdldENvbG9yKGZhc3RfcGF0aF9jYW52YXMoKSkpOwotfQotCi1URVNUX0YoU2tDYW52YXNWaWRlb1JlbmRlcmVyVGVzdCwgU2xvd1BhaW50X05vRnJhbWUpIHsKLSAgLy8gVGVzdCB0aGF0IGJsYWNrIGdldHMgcGFpbnRlZCBvdmVyIGNhbnZhcy4KLSAgRmlsbENhbnZhcyhzbG93X3BhdGhfY2FudmFzKCksIFNLX0NvbG9yUkVEKTsKLSAgUGFpbnRXaXRob3V0RnJhbWUoc2xvd19wYXRoX2NhbnZhcygpKTsKLSAgRVhQRUNUX0VRKFNLX0NvbG9yQkxBQ0ssIEdldENvbG9yKHNsb3dfcGF0aF9jYW52YXMoKSkpOwotfQotCi1URVNUX0YoU2tDYW52YXNWaWRlb1JlbmRlcmVyVGVzdCwgRmFzdFBhaW50X05hdHVyYWwpIHsKLSAgUGFpbnQobmF0dXJhbF9mcmFtZSgpLCBmYXN0X3BhdGhfY2FudmFzKCksIGtSZWQpOwotICBFWFBFQ1RfRVEoU0tfQ29sb3JSRUQsIEdldENvbG9yKGZhc3RfcGF0aF9jYW52YXMoKSkpOwotfQotCi1URVNUX0YoU2tDYW52YXNWaWRlb1JlbmRlcmVyVGVzdCwgU2xvd1BhaW50X05hdHVyYWwpIHsKLSAgUGFpbnQobmF0dXJhbF9mcmFtZSgpLCBzbG93X3BhdGhfY2FudmFzKCksIGtSZWQpOwotICBFWFBFQ1RfRVEoU0tfQ29sb3JSRUQsIEdldENvbG9yKHNsb3dfcGF0aF9jYW52YXMoKSkpOwotfQotCi1URVNUX0YoU2tDYW52YXNWaWRlb1JlbmRlcmVyVGVzdCwgRmFzdFBhaW50X0xhcmdlcikgewotICBQYWludChuYXR1cmFsX2ZyYW1lKCksIGZhc3RfcGF0aF9jYW52YXMoKSwga1JlZCk7Ci0gIEVYUEVDVF9FUShTS19Db2xvclJFRCwgR2V0Q29sb3IoZmFzdF9wYXRoX2NhbnZhcygpKSk7Ci0KLSAgUGFpbnQobGFyZ2VyX2ZyYW1lKCksIGZhc3RfcGF0aF9jYW52YXMoKSwga0JsdWUpOwotICBFWFBFQ1RfRVEoU0tfQ29sb3JCTFVFLCBHZXRDb2xvcihmYXN0X3BhdGhfY2FudmFzKCkpKTsKLX0KLQotVEVTVF9GKFNrQ2FudmFzVmlkZW9SZW5kZXJlclRlc3QsIFNsb3dQYWludF9MYXJnZXIpIHsKLSAgUGFpbnQobmF0dXJhbF9mcmFtZSgpLCBzbG93X3BhdGhfY2FudmFzKCksIGtSZWQpOwotICBFWFBFQ1RfRVEoU0tfQ29sb3JSRUQsIEdldENvbG9yKHNsb3dfcGF0aF9jYW52YXMoKSkpOwotCi0gIFBhaW50KGxhcmdlcl9mcmFtZSgpLCBzbG93X3BhdGhfY2FudmFzKCksIGtCbHVlKTsKLSAgRVhQRUNUX0VRKFNLX0NvbG9yQkxVRSwgR2V0Q29sb3Ioc2xvd19wYXRoX2NhbnZhcygpKSk7Ci19Ci0KLVRFU1RfRihTa0NhbnZhc1ZpZGVvUmVuZGVyZXJUZXN0LCBGYXN0UGFpbnRfU21hbGxlcikgewotICBQYWludChuYXR1cmFsX2ZyYW1lKCksIGZhc3RfcGF0aF9jYW52YXMoKSwga1JlZCk7Ci0gIEVYUEVDVF9FUShTS19Db2xvclJFRCwgR2V0Q29sb3IoZmFzdF9wYXRoX2NhbnZhcygpKSk7Ci0KLSAgUGFpbnQoc21hbGxlcl9mcmFtZSgpLCBmYXN0X3BhdGhfY2FudmFzKCksIGtCbHVlKTsKLSAgRVhQRUNUX0VRKFNLX0NvbG9yQkxVRSwgR2V0Q29sb3IoZmFzdF9wYXRoX2NhbnZhcygpKSk7Ci19Ci0KLVRFU1RfRihTa0NhbnZhc1ZpZGVvUmVuZGVyZXJUZXN0LCBTbG93UGFpbnRfU21hbGxlcikgewotICBQYWludChuYXR1cmFsX2ZyYW1lKCksIHNsb3dfcGF0aF9jYW52YXMoKSwga1JlZCk7Ci0gIEVYUEVDVF9FUShTS19Db2xvclJFRCwgR2V0Q29sb3Ioc2xvd19wYXRoX2NhbnZhcygpKSk7Ci0KLSAgUGFpbnQoc21hbGxlcl9mcmFtZSgpLCBzbG93X3BhdGhfY2FudmFzKCksIGtCbHVlKTsKLSAgRVhQRUNUX0VRKFNLX0NvbG9yQkxVRSwgR2V0Q29sb3Ioc2xvd19wYXRoX2NhbnZhcygpKSk7Ci19Ci0KLVRFU1RfRihTa0NhbnZhc1ZpZGVvUmVuZGVyZXJUZXN0LCBGYXN0UGFpbnRfTm9UaW1lc3RhbXApIHsKLSAgVmlkZW9GcmFtZSogdmlkZW9fZnJhbWUgPSBuYXR1cmFsX2ZyYW1lKCk7Ci0gIHZpZGVvX2ZyYW1lLT5TZXRUaW1lc3RhbXAobWVkaWE6OmtOb1RpbWVzdGFtcCgpKTsKLSAgUGFpbnQodmlkZW9fZnJhbWUsIGZhc3RfcGF0aF9jYW52YXMoKSwga1JlZCk7Ci0gIEVYUEVDVF9FUShTS19Db2xvclJFRCwgR2V0Q29sb3IoZmFzdF9wYXRoX2NhbnZhcygpKSk7Ci19Ci0KLVRFU1RfRihTa0NhbnZhc1ZpZGVvUmVuZGVyZXJUZXN0LCBTbG93UGFpbnRfTm9UaW1lc3RhbXApIHsKLSAgVmlkZW9GcmFtZSogdmlkZW9fZnJhbWUgPSBuYXR1cmFsX2ZyYW1lKCk7Ci0gIHZpZGVvX2ZyYW1lLT5TZXRUaW1lc3RhbXAobWVkaWE6OmtOb1RpbWVzdGFtcCgpKTsKLSAgUGFpbnQodmlkZW9fZnJhbWUsIHNsb3dfcGF0aF9jYW52YXMoKSwga1JlZCk7Ci0gIEVYUEVDVF9FUShTS19Db2xvclJFRCwgR2V0Q29sb3Ioc2xvd19wYXRoX2NhbnZhcygpKSk7Ci19Ci0KLVRFU1RfRihTa0NhbnZhc1ZpZGVvUmVuZGVyZXJUZXN0LCBGYXN0UGFpbnRfU2FtZVZpZGVvRnJhbWUpIHsKLSAgUGFpbnQobmF0dXJhbF9mcmFtZSgpLCBmYXN0X3BhdGhfY2FudmFzKCksIGtSZWQpOwotICBFWFBFQ1RfRVEoU0tfQ29sb3JSRUQsIEdldENvbG9yKGZhc3RfcGF0aF9jYW52YXMoKSkpOwotCi0gIC8vIEZhc3QgcGFpbnRzIGFsd2F5cyBnZXQgcGFpbnRlZCB0byB0aGUgY2FudmFzLgotICBQYWludChuYXR1cmFsX2ZyYW1lKCksIGZhc3RfcGF0aF9jYW52YXMoKSwga0JsdWUpOwotICBFWFBFQ1RfRVEoU0tfQ29sb3JCTFVFLCBHZXRDb2xvcihmYXN0X3BhdGhfY2FudmFzKCkpKTsKLX0KLQotVEVTVF9GKFNrQ2FudmFzVmlkZW9SZW5kZXJlclRlc3QsIFNsb3dQYWludF9TYW1lVmlkZW9GcmFtZSkgewotICBQYWludChuYXR1cmFsX2ZyYW1lKCksIHNsb3dfcGF0aF9jYW52YXMoKSwga1JlZCk7Ci0gIEVYUEVDVF9FUShTS19Db2xvclJFRCwgR2V0Q29sb3Ioc2xvd19wYXRoX2NhbnZhcygpKSk7Ci0KLSAgLy8gU2xvdyBwYWludHMgY2FuIGdldCBjYWNoZWQsIGV4cGVjdCB0aGUgb2xkIGNvbG9yIHZhbHVlLgotICBQYWludChuYXR1cmFsX2ZyYW1lKCksIHNsb3dfcGF0aF9jYW52YXMoKSwga0JsdWUpOwotICBFWFBFQ1RfRVEoU0tfQ29sb3JSRUQsIEdldENvbG9yKHNsb3dfcGF0aF9jYW52YXMoKSkpOwotfQotCi1URVNUX0YoU2tDYW52YXNWaWRlb1JlbmRlcmVyVGVzdCwgRmFzdFBhaW50X0Nyb3BwZWRGcmFtZSkgewotICBQYWludChjcm9wcGVkX2ZyYW1lKCksIGZhc3RfcGF0aF9jYW52YXMoKSwga05vbmUpOwotICAvLyBDaGVjayB0aGUgY29ybmVycy4KLSAgRVhQRUNUX0VRKFNLX0NvbG9yQkxBQ0ssIEdldENvbG9yQXQoZmFzdF9wYXRoX2NhbnZhcygpLCAwLCAwKSk7Ci0gIEVYUEVDVF9FUShTS19Db2xvclJFRCwgICBHZXRDb2xvckF0KGZhc3RfcGF0aF9jYW52YXMoKSwga1dpZHRoIC0gMSwgMCkpOwotICBFWFBFQ1RfRVEoU0tfQ29sb3JHUkVFTiwgR2V0Q29sb3JBdChmYXN0X3BhdGhfY2FudmFzKCksIDAsIGtIZWlnaHQgLSAxKSk7Ci0gIEVYUEVDVF9FUShTS19Db2xvckJMVUUsICBHZXRDb2xvckF0KGZhc3RfcGF0aF9jYW52YXMoKSwga1dpZHRoIC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSGVpZ2h0IC0gMSkpOwotICAvLyBDaGVjayB0aGUgaW50ZXJpb3IgYWxvbmcgdGhlIGJvcmRlciBiZXR3ZWVuIGNvbG9yIHJlZ2lvbnMuICBOb3RlIHRoYXQgd2UncmUKLSAgLy8gYmlsaW5lYXJseSB1cHNjYWxpbmcsIHNvIHdlJ2xsIG5lZWQgdG8gdGFrZSBjYXJlIHRvIHBpY2sgc2FtcGxlIHBvaW50cyB0aGF0Ci0gIC8vIGFyZSBqdXN0IG91dHNpZGUgdGhlICJ6b25lIG9mIHJlc2FtcGxpbmciLgotICAvLyBUT0RPKHNoZXUpOiBjb21tZW50aW5nIG91dCB0d28gY2hlY2tzIGR1ZSB0byBodHRwOi8vY3JidWcuY29tLzE1ODQ2Mi4KLSNpZiAwCi0gIEVYUEVDVF9FUShTS19Db2xvckJMQUNLLCBHZXRDb2xvckF0KGZhc3RfcGF0aF9jYW52YXMoKSwga1dpZHRoICAqIDEgLyA4IC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSGVpZ2h0ICogMSAvIDYgLSAxKSk7Ci0jZW5kaWYKLSAgRVhQRUNUX0VRKFNLX0NvbG9yUkVELCAgIEdldENvbG9yQXQoZmFzdF9wYXRoX2NhbnZhcygpLCBrV2lkdGggICogMyAvIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0hlaWdodCAqIDEgLyA2IC0gMSkpOwotI2lmIDAKLSAgRVhQRUNUX0VRKFNLX0NvbG9yR1JFRU4sIEdldENvbG9yQXQoZmFzdF9wYXRoX2NhbnZhcygpLCBrV2lkdGggICogMSAvIDggLSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtIZWlnaHQgKiAzIC8gNikpOwotI2VuZGlmCi0gIEVYUEVDVF9FUShTS19Db2xvckJMVUUsICBHZXRDb2xvckF0KGZhc3RfcGF0aF9jYW52YXMoKSwga1dpZHRoICAqIDMgLyA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtIZWlnaHQgKiAzIC8gNikpOwotfQotCi1URVNUX0YoU2tDYW52YXNWaWRlb1JlbmRlcmVyVGVzdCwgU2xvd1BhaW50X0Nyb3BwZWRGcmFtZSkgewotICBQYWludChjcm9wcGVkX2ZyYW1lKCksIHNsb3dfcGF0aF9jYW52YXMoKSwga05vbmUpOwotICAvLyBDaGVjayB0aGUgY29ybmVycy4KLSAgRVhQRUNUX0VRKFNLX0NvbG9yQkxBQ0ssIEdldENvbG9yQXQoc2xvd19wYXRoX2NhbnZhcygpLCAwLCAwKSk7Ci0gIEVYUEVDVF9FUShTS19Db2xvclJFRCwgICBHZXRDb2xvckF0KHNsb3dfcGF0aF9jYW52YXMoKSwga1dpZHRoIC0gMSwgMCkpOwotICBFWFBFQ1RfRVEoU0tfQ29sb3JHUkVFTiwgR2V0Q29sb3JBdChzbG93X3BhdGhfY2FudmFzKCksIDAsIGtIZWlnaHQgLSAxKSk7Ci0gIEVYUEVDVF9FUShTS19Db2xvckJMVUUsICBHZXRDb2xvckF0KHNsb3dfcGF0aF9jYW52YXMoKSwga1dpZHRoIC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSGVpZ2h0IC0gMSkpOwotICAvLyBDaGVjayB0aGUgaW50ZXJpb3IgYWxvbmcgdGhlIGJvcmRlciBiZXR3ZWVuIGNvbG9yIHJlZ2lvbnMuICBOb3RlIHRoYXQgd2UncmUKLSAgLy8gYmlsaW5lYXJseSB1cHNjYWxpbmcsIHNvIHdlJ2xsIG5lZWQgdG8gdGFrZSBjYXJlIHRvIHBpY2sgc2FtcGxlIHBvaW50cyB0aGF0Ci0gIC8vIGFyZSBqdXN0IG91dHNpZGUgdGhlICJ6b25lIG9mIHJlc2FtcGxpbmciLgotICBFWFBFQ1RfRVEoU0tfQ29sb3JCTEFDSywgR2V0Q29sb3JBdChzbG93X3BhdGhfY2FudmFzKCksIGtXaWR0aCAgKiAxIC8gOCAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0hlaWdodCAqIDEgLyA2IC0gMSkpOwotICBFWFBFQ1RfRVEoU0tfQ29sb3JSRUQsICAgR2V0Q29sb3JBdChzbG93X3BhdGhfY2FudmFzKCksIGtXaWR0aCAgKiAzIC8gOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSGVpZ2h0ICogMSAvIDYgLSAxKSk7Ci0gIEVYUEVDVF9FUShTS19Db2xvckdSRUVOLCBHZXRDb2xvckF0KHNsb3dfcGF0aF9jYW52YXMoKSwga1dpZHRoICAqIDEgLyA4IC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSGVpZ2h0ICogMyAvIDYpKTsKLSAgRVhQRUNUX0VRKFNLX0NvbG9yQkxVRSwgIEdldENvbG9yQXQoc2xvd19wYXRoX2NhbnZhcygpLCBrV2lkdGggICogMyAvIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0hlaWdodCAqIDMgLyA2KSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvc291cmNlX2J1ZmZlcl9zdHJlYW0uY2MgYi9zcmMvbWVkaWEvZmlsdGVycy9zb3VyY2VfYnVmZmVyX3N0cmVhbS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZkMTU5Ni4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9zb3VyY2VfYnVmZmVyX3N0cmVhbS5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3MzAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvc291cmNlX2J1ZmZlcl9zdHJlYW0uaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxtYXA+Ci0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL3N0bF91dGlsLmgiCi0KLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaGVsbF9tZWRpYV9wbGF0Zm9ybS5oIgotI2VuZGlmCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIEhlbHBlciBjbGFzcyByZXByZXNlbnRpbmcgYSByYW5nZSBvZiBidWZmZXJlZCBkYXRhLiBBbGwgYnVmZmVycyBpbiBhCi0vLyBTb3VyY2VCdWZmZXJSYW5nZSBhcmUgb3JkZXJlZCBzZXF1ZW50aWFsbHkgaW4gcHJlc2VudGF0aW9uIG9yZGVyIHdpdGggbm8KLS8vIGdhcHMuCi1jbGFzcyBTb3VyY2VCdWZmZXJSYW5nZSB7Ci0gcHVibGljOgotICB0eXBlZGVmIHN0ZDo6ZGVxdWU8c2NvcGVkX3JlZnB0cjxTdHJlYW1QYXJzZXJCdWZmZXI+ID4gQnVmZmVyUXVldWU7Ci0KLSAgLy8gUmV0dXJucyB0aGUgbWF4aW11bSBkaXN0YW5jZSBpbiB0aW1lIGJldHdlZW4gYW55IGJ1ZmZlciBzZWVuIGluIHRoaXMKLSAgLy8gc3RyZWFtLiBVc2VkIHRvIGVzdGltYXRlIHRoZSBkdXJhdGlvbiBvZiBhIGJ1ZmZlciBpZiBpdHMgZHVyYXRpb24gaXMgbm90Ci0gIC8vIGtub3duLgotICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPGJhc2U6OlRpbWVEZWx0YSgpPiBJbnRlcmJ1ZmZlckRpc3RhbmNlQ0I7Ci0KLSAgLy8gQ3JlYXRlcyBhIHNvdXJjZSBidWZmZXIgcmFuZ2Ugd2l0aCB8bmV3X2J1ZmZlcnN8LiB8bmV3X2J1ZmZlcnN8IGNhbm5vdCBiZQotICAvLyBlbXB0eSBhbmQgdGhlIGZyb250IG9mIHxuZXdfYnVmZmVyc3wgbXVzdCBiZSBhIGtleWZyYW1lLgotICAvLyB8bWVkaWFfc2VnbWVudF9zdGFydF90aW1lfCByZWZlcnMgdG8gdGhlIHN0YXJ0aW5nIHRpbWVzdGFtcCBmb3IgdGhlIG1lZGlhCi0gIC8vIHNlZ21lbnQgdG8gd2hpY2ggdGhlc2UgYnVmZmVycyBiZWxvbmcuCi0gIFNvdXJjZUJ1ZmZlclJhbmdlKGNvbnN0IEJ1ZmZlclF1ZXVlJiBuZXdfYnVmZmVycywKLSAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhIG1lZGlhX3NlZ21lbnRfc3RhcnRfdGltZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgSW50ZXJidWZmZXJEaXN0YW5jZUNCJiBpbnRlcmJ1ZmZlcl9kaXN0YW5jZV9jYik7Ci0KLSAgLy8gQXBwZW5kcyB8YnVmZmVyc3wgdG8gdGhlIGVuZCBvZiB0aGUgcmFuZ2UgYW5kIHVwZGF0ZXMgfGtleWZyYW1lX21hcF98IGFzCi0gIC8vIGl0IGVuY291bnRlcnMgbmV3IGtleWZyYW1lcy4gQXNzdW1lcyB8YnVmZmVyc3wgYmVsb25ncyBhdCB0aGUgZW5kIG9mIHRoZQotICAvLyByYW5nZS4KLSAgdm9pZCBBcHBlbmRCdWZmZXJzVG9FbmQoY29uc3QgQnVmZmVyUXVldWUmIGJ1ZmZlcnMpOwotICBib29sIENhbkFwcGVuZEJ1ZmZlcnNUb0VuZChjb25zdCBCdWZmZXJRdWV1ZSYgYnVmZmVycykgY29uc3Q7Ci0KLSAgLy8gQXBwZW5kcyB0aGUgYnVmZmVycyBmcm9tIHxyYW5nZXwgaW50byB0aGlzIHJhbmdlLgotICAvLyBUaGUgZmlyc3QgYnVmZmVyIGluIHxyYW5nZXwgbXVzdCBjb21lIGRpcmVjdGx5IGFmdGVyIHRoZSBsYXN0IGJ1ZmZlcgotICAvLyBpbiB0aGlzIHJhbmdlLgotICAvLyBJZiB8dHJhbnNmZXJfY3VycmVudF9wb3NpdGlvbnwgaXMgdHJ1ZSwgfHJhbmdlfCdzIHxuZXh0X2J1ZmZlcl9pbmRleF98Ci0gIC8vIGlzIHRyYW5zZmVyZWQgdG8gdGhpcyBTb3VyY2VCdWZmZXJSYW5nZS4KLSAgdm9pZCBBcHBlbmRSYW5nZVRvRW5kKGNvbnN0IFNvdXJjZUJ1ZmZlclJhbmdlJiByYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdHJhbnNmZXJfY3VycmVudF9wb3NpdGlvbik7Ci0gIGJvb2wgQ2FuQXBwZW5kUmFuZ2VUb0VuZChjb25zdCBTb3VyY2VCdWZmZXJSYW5nZSYgcmFuZ2UpIGNvbnN0OwotCi0gIC8vIFVwZGF0ZXMgfG5leHRfYnVmZmVyX2luZGV4X3wgdG8gcG9pbnQgdG8gdGhlIEJ1ZmZlciBjb250YWluaW5nIHx0aW1lc3RhbXB8LgotICAvLyBBc3N1bWVzIHx0aW1lc3RhbXB8IGlzIHZhbGlkIGFuZCBpbiB0aGlzIHJhbmdlLgotICB2b2lkIFNlZWsoYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCk7Ci0KLSAgLy8gVXBkYXRlcyB8bmV4dF9idWZmZXJfaW5kZXhffCB0byBwb2ludCB0byBuZXh0IGtleWZyYW1lIGFmdGVyIG9yIGVxdWFsIHRvCi0gIC8vIHx0aW1lc3RhbXB8LgotICB2b2lkIFNlZWtBaGVhZFRvKGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXApOwotCi0gIC8vIFVwZGF0ZXMgfG5leHRfYnVmZmVyX2luZGV4X3wgdG8gcG9pbnQgdG8gbmV4dCBrZXlmcmFtZSBzdHJpY3RseSBhZnRlcgotICAvLyB8dGltZXN0YW1wfC4KLSAgdm9pZCBTZWVrQWhlYWRQYXN0KGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXApOwotCi0gIC8vIFNlZWtzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJhbmdlLgotICB2b2lkIFNlZWtUb1N0YXJ0KCk7Ci0KLSAgLy8gRmluZHMgdGhlIG5leHQga2V5ZnJhbWUgZnJvbSB8YnVmZmVyc198IGFmdGVyIHx0aW1lc3RhbXB8IChvciBhdAotICAvLyB8dGltZXN0YW1wfCBpZiB8aXNfZXhjbHVzaXZlfCBpcyBmYWxzZSkgYW5kIGNyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcKLSAgLy8gU291cmNlQnVmZmVyUmFuZ2Ugd2l0aCB0aGUgYnVmZmVycyBmcm9tIHRoYXQga2V5ZnJhbWUgb253YXJkLgotICAvLyBUaGUgYnVmZmVycyBpbiB0aGUgbmV3IFNvdXJjZUJ1ZmZlclJhbmdlIGFyZSBtb3ZlZCBvdXQgb2YgdGhpcyByYW5nZS4gSWYKLSAgLy8gdGhlcmUgaXMgbm8ga2V5ZnJhbWUgYWZ0ZXIgfHRpbWVzdGFtcHwsIFNwbGl0UmFuZ2UoKSByZXR1cm5zIG51bGwgYW5kIHRoaXMKLSAgLy8gcmFuZ2UgaXMgdW5tb2RpZmllZC4KLSAgU291cmNlQnVmZmVyUmFuZ2UqIFNwbGl0UmFuZ2UoYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCwgYm9vbCBpc19leGNsdXNpdmUpOwotCi0gIC8vIERlbGV0ZXMgdGhlIGJ1ZmZlcnMgZnJvbSB0aGlzIHJhbmdlIHN0YXJ0aW5nIGF0IHx0aW1lc3RhbXB8LCBleGNsdXNpdmUgaWYKLSAgLy8gfGlzX2V4Y2x1c2l2ZXwgaXMgdHJ1ZSwgaW5jbHVzaXZlIG90aGVyd2lzZS4KLSAgLy8gUmVzZXRzIHxuZXh0X2J1ZmZlcl9pbmRleF98IGlmIHRoZSBidWZmZXIgYXQgfG5leHRfYnVmZmVyX2luZGV4X3wgd2FzCi0gIC8vIGRlbGV0ZWQsIGFuZCBkZWxldGVzIHRoZSB8a2V5ZnJhbWVfbWFwX3wgZW50cmllcyBmb3IgdGhlIGJ1ZmZlcnMgdGhhdAotICAvLyB3ZXJlIHJlbW92ZWQuCi0gIC8vIHxkZWxldGVkX2J1ZmZlcnN8IGNvbnRhaW5zIHRoZSBidWZmZXJzIHRoYXQgd2VyZSBkZWxldGVkIGZyb20gdGhpcyByYW5nZSwKLSAgLy8gc3RhcnRpbmcgYXQgdGhlIGJ1ZmZlciB0aGF0IGhhZCBiZWVuIGF0IHxuZXh0X2J1ZmZlcl9pbmRleF98LgotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHxuZXh0X2J1ZmZlcl9pbmRleF98IGlzIHJlc2V0LiBOb3RlIHRoYXQgdGhpcyBtZXRob2QKLSAgLy8gbWF5IHJldHVybiB0cnVlIGV2ZW4gaWYgaXQgZG9lcyBub3QgYWRkIGFueSBidWZmZXJzIHRvIHxkZWxldGVkX2J1ZmZlcnN8LgotICAvLyBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSByYW5nZSBoYWQgbm90IGJ1ZmZlcmVkIHxuZXh0X2J1ZmZlcl9pbmRleF98LCBidXQKLSAgLy8gYSBidWZmZXIgYXQgdGhhdCBwb3NpdGlvbiB3b3VsZCBoYXZlIGJlZW4gZGVsZXRlZC4KLSAgYm9vbCBUcnVuY2F0ZUF0KGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXAsCi0gICAgICAgICAgICAgICAgICBCdWZmZXJRdWV1ZSogZGVsZXRlZF9idWZmZXJzLCBib29sIGlzX2V4Y2x1c2l2ZSk7Ci0gIC8vIERlbGV0ZXMgYWxsIGJ1ZmZlcnMgaW4gcmFuZ2UuCi0gIGJvb2wgRGVsZXRlQWxsKEJ1ZmZlclF1ZXVlKiBkZWxldGVkX2J1ZmZlcnMpOwotCi0gIC8vIERlbGV0ZXMgYSBHT1AgZnJvbSB0aGUgZnJvbnQgb3IgYmFjayBvZiB0aGUgcmFuZ2UgYW5kIG1vdmVzIHRoZXNlCi0gIC8vIGJ1ZmZlcnMgaW50byB8ZGVsZXRlZF9idWZmZXJzfC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGRlbGV0ZWQgZnJvbQotICAvLyB0aGUgcmFuZ2UgKGkuZS4gdGhlIHNpemUgaW4gYnl0ZXMgb2YgfGRlbGV0ZWRfYnVmZmVyc3wpLgotICBpbnQgRGVsZXRlR09QRnJvbUZyb250KEJ1ZmZlclF1ZXVlKiBkZWxldGVkX2J1ZmZlcnMpOwotICBpbnQgRGVsZXRlR09QRnJvbUJhY2soQnVmZmVyUXVldWUqIGRlbGV0ZWRfYnVmZmVycyk7Ci0KLSAgLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIEdPUCBhdCB0aGUgYmVnaW5uaW5nIG9yIGVuZCBvZiB0aGUgcmFuZ2UgY29udGFpbnMgdGhlCi0gIC8vIG5leHQgYnVmZmVyIHBvc2l0aW9uLgotICBib29sIEZpcnN0R09QQ29udGFpbnNOZXh0QnVmZmVyUG9zaXRpb24oKSBjb25zdDsKLSAgYm9vbCBMYXN0R09QQ29udGFpbnNOZXh0QnVmZmVyUG9zaXRpb24oKSBjb25zdDsKLQotICAvLyBVcGRhdGVzIHxvdXRfYnVmZmVyfCB3aXRoIHRoZSBuZXh0IGJ1ZmZlciBpbiBwcmVzZW50YXRpb24gb3JkZXIuIFNlZWsoKQotICAvLyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2FsbHMgdG8gR2V0TmV4dEJ1ZmZlcigpLCBhbmQgYnVmZmVycyBhcmUgcmV0dXJuZWQKLSAgLy8gaW4gb3JkZXIgZnJvbSB0aGUgbGFzdCBjYWxsIHRvIFNlZWsoKS4gUmV0dXJucyB0cnVlIGlmIHxvdXRfYnVmZmVyfCBpcwotICAvLyBmaWxsZWQgd2l0aCBhIHZhbGlkIGJ1ZmZlciwgZmFsc2UgaWYgdGhlcmUgaXMgbm90IGVub3VnaCBkYXRhIHRvIGZ1bGZpbGwKLSAgLy8gdGhlIHJlcXVlc3QuCi0gIGJvb2wgR2V0TmV4dEJ1ZmZlcihzY29wZWRfcmVmcHRyPFN0cmVhbVBhcnNlckJ1ZmZlcj4qIG91dF9idWZmZXIpOwotICBib29sIEhhc05leHRCdWZmZXIoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRoZSBjb25maWcgSUQgZm9yIHRoZSBidWZmZXIgdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5Ci0gIC8vIEdldE5leHRCdWZmZXIoKS4KLSAgaW50IEdldE5leHRDb25maWdJZCgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmFuZ2Uga25vd3MgdGhlIHBvc2l0aW9uIG9mIHRoZSBuZXh0IGJ1ZmZlciBpdCBzaG91bGQKLSAgLy8gcmV0dXJuLCBpLmUuIGl0IGhhcyBiZWVuIFNlZWsoKWVkLiBUaGlzIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1lYW4gdGhhdCBpdAotICAvLyBoYXMgdGhlIG5leHQgYnVmZmVyIHlldC4KLSAgYm9vbCBIYXNOZXh0QnVmZmVyUG9zaXRpb24oKSBjb25zdDsKLQotICAvLyBSZXNldHMgdGhpcyByYW5nZSB0byBhbiAidW5zZWVrZWQiIHN0YXRlLgotICB2b2lkIFJlc2V0TmV4dEJ1ZmZlclBvc2l0aW9uKCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgdGltZXN0YW1wIG9mIHRoZSBuZXh0IGJ1ZmZlciB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgZnJvbQotICAvLyBHZXROZXh0QnVmZmVyKCksIG9yIGtOb1RpbWVzdGFtcCgpIGlmIHRoZSB0aW1lc3RhbXAgaXMgdW5rbm93bi4KLSAgYmFzZTo6VGltZURlbHRhIEdldE5leHRUaW1lc3RhbXAoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRoZSBzdGFydCB0aW1lc3RhbXAgb2YgdGhlIHJhbmdlLgotICBiYXNlOjpUaW1lRGVsdGEgR2V0U3RhcnRUaW1lc3RhbXAoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgYnVmZmVyIGluIHRoZSByYW5nZS4KLSAgYmFzZTo6VGltZURlbHRhIEdldEVuZFRpbWVzdGFtcCgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdGhlIHRpbWVzdGFtcCBmb3IgdGhlIGVuZCBvZiB0aGUgYnVmZmVyZWQgcmVnaW9uIGluIHRoaXMgcmFuZ2UuCi0gIC8vIFRoaXMgaXMgYW4gYXBwcm94aW1hdGlvbiBpZiB0aGUgZHVyYXRpb24gZm9yIHRoZSBsYXN0IGJ1ZmZlciBpbiB0aGUgcmFuZ2UKLSAgLy8gaXMgdW5zZXQuCi0gIGJhc2U6OlRpbWVEZWx0YSBHZXRCdWZmZXJlZEVuZFRpbWVzdGFtcCgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgd2hldGhlciBhIGJ1ZmZlciB3aXRoIGEgc3RhcnRpbmcgdGltZXN0YW1wIG9mIHx0aW1lc3RhbXB8IHdvdWxkCi0gIC8vIGJlbG9uZyBpbiB0aGlzIHJhbmdlLiBUaGlzIGluY2x1ZGVzIGEgYnVmZmVyIHRoYXQgd291bGQgYmUgYXBwZW5kZWQgdG8KLSAgLy8gdGhlIGVuZCBvZiB0aGUgcmFuZ2UuCi0gIGJvb2wgQmVsb25nc1RvUmFuZ2UoYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSByYW5nZSBoYXMgZW5vdWdoIGRhdGEgdG8gc2VlayB0byB0aGUgc3BlY2lmaWVkCi0gIC8vIHx0aW1lc3RhbXB8LCBmYWxzZSBvdGhlcndpc2UuCi0gIGJvb2wgQ2FuU2Vla1RvKGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXApIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJhbmdlJ3MgYnVmZmVyZWQgdGltZXNwYW4gY29tcGxldGVseSBvdmVybGFwcyB0aGUKLSAgLy8gYnVmZmVyZWQgdGltZXNwYW4gb2YgfHJhbmdlfC4KLSAgYm9vbCBDb21wbGV0ZWx5T3ZlcmxhcHMoY29uc3QgU291cmNlQnVmZmVyUmFuZ2UmIHJhbmdlKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZCBvZiB0aGlzIHJhbmdlIGNvbnRhaW5zIGJ1ZmZlcnMgdGhhdCBvdmVybGFwcyB3aXRoCi0gIC8vIHRoZSBiZWdpbm5pbmcgb2YgfHJhbmdlfC4KLSAgYm9vbCBFbmRPdmVybGFwcyhjb25zdCBTb3VyY2VCdWZmZXJSYW5nZSYgcmFuZ2UpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB8dGltZXN0YW1wfCBpcyB0aGUgdGltZXN0YW1wIG9mIHRoZSBuZXh0IGJ1ZmZlciBpbgotICAvLyBzZXF1ZW5jZSBhZnRlciB8YnVmZmVyfCwgZmFsc2Ugb3RoZXJ3aXNlLgotICBib29sIElzTmV4dEluU2VxdWVuY2UoCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPG1lZGlhOjpTdHJlYW1QYXJzZXJCdWZmZXI+JiBidWZmZXIsCi0gICAgICBiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wKSBjb25zdDsKLQotICBpbnQgc2l6ZV9pbl9ieXRlcygpIGNvbnN0IHsgcmV0dXJuIHNpemVfaW5fYnl0ZXNfOyB9Ci0KLSBwcml2YXRlOgotICB0eXBlZGVmIHN0ZDo6bWFwPGJhc2U6OlRpbWVEZWx0YSwgaW50PiBLZXlmcmFtZU1hcDsKLQotICAvLyBTZWVrcyB0aGUgcmFuZ2UgdG8gdGhlIG5leHQga2V5ZnJhbWUgYWZ0ZXIgfHRpbWVzdGFtcHwuIElmCi0gIC8vIHxza2lwX2dpdmVuX3RpbWVzdGFtcHwgaXMgdHJ1ZSwgdGhlIHNlZWsgd2lsbCBnbyB0byBhIGtleWZyYW1lIHdpdGggYQotICAvLyB0aW1lc3RhbXAgc3RyaWN0bHkgZ3JlYXRlciB0aGFuIHx0aW1lc3RhbXB8LgotICB2b2lkIFNlZWtBaGVhZChiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wLCBib29sIHNraXBfZ2l2ZW5fdGltZXN0YW1wKTsKLQotICAvLyBSZXR1cm5zIGFuIGl0ZXJhdG9yIGluIHxidWZmZXJzX3wgcG9pbnRpbmcgdG8gdGhlIGJ1ZmZlciBhdCB8dGltZXN0YW1wfC4KLSAgLy8gSWYgfHNraXBfZ2l2ZW5fdGltZXN0YW1wfCBpcyB0cnVlLCB0aGlzIHJldHVybnMgdGhlIGZpcnN0IGJ1ZmZlciB3aXRoCi0gIC8vIHRpbWVzdGFtcCBncmVhdGVyIHRoYW4gfHRpbWVzdGFtcHwuCi0gIEJ1ZmZlclF1ZXVlOjppdGVyYXRvciBHZXRCdWZmZXJJdHJBdCgKLSAgICAgIGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXAsIGJvb2wgc2tpcF9naXZlbl90aW1lc3RhbXApOwotCi0gIC8vIFJldHVybnMgYW4gaXRlcmF0b3IgaW4gfGtleWZyYW1lX21hcF98IHBvaW50aW5nIHRvIHRoZSBuZXh0IGtleWZyYW1lIGFmdGVyCi0gIC8vIHx0aW1lc3RhbXB8LiBJZiB8c2tpcF9naXZlbl90aW1lc3RhbXB8IGlzIHRydWUsIHRoaXMgcmV0dXJucyB0aGUgZmlyc3QKLSAgLy8ga2V5ZnJhbWUgd2l0aCBhIHRpbWVzdGFtcCBzdHJpY3RseSBncmVhdGVyIHRoYW4gfHRpbWVzdGFtcHwuCi0gIEtleWZyYW1lTWFwOjppdGVyYXRvciBHZXRGaXJzdEtleWZyYW1lQXQoCi0gICAgICBiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wLCBib29sIHNraXBfZ2l2ZW5fdGltZXN0YW1wKTsKLQotICAvLyBSZXR1cm5zIGFuIGl0ZXJhdG9yIGluIHxrZXlmcmFtZV9tYXBffCBwb2ludGluZyB0byB0aGUgZmlyc3Qga2V5ZnJhbWUKLSAgLy8gYmVmb3JlIG9yIGF0IHx0aW1lc3RhbXB8LgotICBLZXlmcmFtZU1hcDo6aXRlcmF0b3IgR2V0Rmlyc3RLZXlmcmFtZUJlZm9yZShiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wKTsKLQotICAvLyBIZWxwZXIgbWV0aG9kIHRvIGRlbGV0ZSBidWZmZXJzIGluIHxidWZmZXJzX3wgc3RhcnRpbmcgYXQKLSAgLy8gfHN0YXJ0aW5nX3BvaW50fCwgYW4gaXRlcmF0b3IgaW4gfGJ1ZmZlcnNffC4KLSAgYm9vbCBUcnVuY2F0ZUF0KGNvbnN0IEJ1ZmZlclF1ZXVlOjppdGVyYXRvciYgc3RhcnRpbmdfcG9pbnQsCi0gICAgICAgICAgICAgICAgICBCdWZmZXJRdWV1ZSogZGVsZXRlZF9idWZmZXJzKTsKLQotICAvLyBGcmVlcyB0aGUgYnVmZmVycyBpbiB8YnVmZmVyc198IGZyb20gW3xzdGFydF9wb2ludHwsfGVuZGluZ19wb2ludHwpIGFuZAotICAvLyB1cGRhdGVzIHRoZSB8c2l6ZV9pbl9ieXRlc198IGFjY29yZGluZ2x5LiBEb2VzIG5vdCB1cGRhdGUgfGtleWZyYW1lX21hcF98LgotICB2b2lkIEZyZWVCdWZmZXJSYW5nZShjb25zdCBCdWZmZXJRdWV1ZTo6aXRlcmF0b3ImIHN0YXJ0aW5nX3BvaW50LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCdWZmZXJRdWV1ZTo6aXRlcmF0b3ImIGVuZGluZ19wb2ludCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgZGlzdGFuY2UgaW4gdGltZSBlc3RpbWF0aW5nIGhvdyBmYXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9yIGVuZAotICAvLyBvZiB0aGlzIHJhbmdlIGEgYnVmZmVyIGNhbiBiZSB0byBjb25zaWRlcmVkIGluIHRoZSByYW5nZS4KLSAgYmFzZTo6VGltZURlbHRhIEdldEZ1ZGdlUm9vbSgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdGhlIGFwcHJveGltYXRlIGR1cmF0aW9uIG9mIGEgYnVmZmVyIGluIHRoaXMgcmFuZ2UuCi0gIGJhc2U6OlRpbWVEZWx0YSBHZXRBcHByb3hpbWF0ZUR1cmF0aW9uKCkgY29uc3Q7Ci0KLSAgLy8gQW4gb3JkZXJlZCBsaXN0IG9mIGJ1ZmZlcnMgaW4gdGhpcyByYW5nZS4KLSAgQnVmZmVyUXVldWUgYnVmZmVyc187Ci0KLSAgLy8gTWFwcyBrZXlmcmFtZSB0aW1lc3RhbXBzIHRvIGl0cyBpbmRleCBwb3NpdGlvbiBpbiB8YnVmZmVyc198LgotICBLZXlmcmFtZU1hcCBrZXlmcmFtZV9tYXBfOwotCi0gIC8vIEluZGV4IGJhc2Ugb2YgYWxsIHBvc2l0aW9ucyBpbiB8a2V5ZnJhbWVfbWFwX3wuIEluIG90aGVyIHdvcmRzLCB0aGUKLSAgLy8gcmVhbCBwb3NpdGlvbiBvZiBlbnRyeSB8a3wgb2YgfGtleWZyYW1lX21hcF98IGluIHRoZSByYW5nZSBpczoKLSAgLy8gICBrZXlmcmFtZV9tYXBfW2tdIC0ga2V5ZnJhbWVfbWFwX2luZGV4X2Jhc2VfCi0gIGludCBrZXlmcmFtZV9tYXBfaW5kZXhfYmFzZV87Ci0KLSAgLy8gSW5kZXggaW50byB8YnVmZmVyc198IGZvciB0aGUgbmV4dCBidWZmZXIgdG8gYmUgcmV0dXJuZWQgYnkKLSAgLy8gR2V0TmV4dEJ1ZmZlcigpLCBzZXQgdG8gLTEgYmVmb3JlIFNlZWsoKS4KLSAgaW50IG5leHRfYnVmZmVyX2luZGV4XzsKLQotICAvLyBUcnVlIGlmIHRoZSByYW5nZSBuZWVkcyB0byB3YWl0IGZvciB0aGUgbmV4dCBrZXlmcmFtZSB0byBiZSBhcHBlbmRlZCBiZWZvcmUKLSAgLy8gcmV0dXJuaW5nIGJ1ZmZlcnMgZnJvbSBHZXROZXh0QnVmZmVyKCkuCi0gIGJvb2wgd2FpdGluZ19mb3Jfa2V5ZnJhbWVfOwotCi0gIC8vIElmIHx3YWl0aW5nX2Zvcl9rZXlmcmFtZV98IGlzIHRydWUsIHRoaXMgcmFuZ2Ugd2lsbCB3YWl0IGZvciB0aGUgbmV4dAotICAvLyBrZXlmcmFtZSB3aXRoIHRpbWVzdGFtcCA+PSB8bmV4dF9rZXlmcmFtZV90aW1lc3RhbXBffC4KLSAgYmFzZTo6VGltZURlbHRhIG5leHRfa2V5ZnJhbWVfdGltZXN0YW1wXzsKLQotICAvLyBJZiB0aGUgZmlyc3QgYnVmZmVyIGluIHRoaXMgcmFuZ2UgaXMgdGhlIGJlZ2lubmluZyBvZiBhIG1lZGlhIHNlZ21lbnQsCi0gIC8vIHxtZWRpYV9zZWdtZW50X3N0YXJ0X3RpbWVffCBpcyB0aGUgdGltZSB3aGVuIHRoZSBtZWRpYSBzZWdtZW50IGJlZ2lucy4KLSAgLy8gfG1lZGlhX3NlZ21lbnRfc3RhcnRfdGltZV98IG1heSBiZSA8PSB0aGUgdGltZXN0YW1wIG9mIHRoZSBmaXJzdCBidWZmZXIgaW4KLSAgLy8gfGJ1ZmZlcnNffC4gfG1lZGlhX3NlZ21lbnRfc3RhcnRfdGltZV98IGlzIGtOb1RpbWVzdGFtcCgpIGlmIHRoaXMgcmFuZ2UKLSAgLy8gZG9lcyBub3Qgc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIG1lZGlhIHNlZ21lbnQsIHdoaWNoIGNhbiBvbmx5IGhhcHBlbgotICAvLyBnYXJiYWdlIGNvbGxlY3Rpb24gb3IgYWZ0ZXIgYW4gZW5kIG92ZXJsYXAgdGhhdCByZXN1bHRzIGluIGEgc3BsaXQgcmFuZ2UKLSAgLy8gKHdlIGRvbid0IGhhdmUgYSB3YXkgb2Yga25vd2luZyB0aGUgbWVkaWEgc2VnbWVudCB0aW1lc3RhbXAgZm9yIHRoZSBuZXcKLSAgLy8gcmFuZ2UpLgotICBiYXNlOjpUaW1lRGVsdGEgbWVkaWFfc2VnbWVudF9zdGFydF90aW1lXzsKLQotICAvLyBDYWxsZWQgdG8gZ2V0IHRoZSBsYXJnZXN0IGludGVyYnVmZmVyIGRpc3RhbmNlIHNlZW4gc28gZmFyIGluIHRoZSBzdHJlYW0uCi0gIEludGVyYnVmZmVyRGlzdGFuY2VDQiBpbnRlcmJ1ZmZlcl9kaXN0YW5jZV9jYl87Ci0KLSAgLy8gU3RvcmVzIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRha2VuIHVwIGJ5IHRoZSBkYXRhIGluIHxidWZmZXJzX3wuCi0gIGludCBzaXplX2luX2J5dGVzXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU291cmNlQnVmZmVyUmFuZ2UpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLS8vIEhlbHBlciBtZXRob2QgdGhhdCByZXR1cm5zIHRydWUgaWYgfHJhbmdlc3wgaXMgc29ydGVkIGluIGluY3JlYXNpbmcgb3JkZXIsCi0vLyBmYWxzZSBvdGhlcndpc2UuCi1zdGF0aWMgYm9vbCBJc1JhbmdlTGlzdFNvcnRlZCgKLSAgICBjb25zdCBzdGQ6Omxpc3Q8bWVkaWE6OlNvdXJjZUJ1ZmZlclJhbmdlKj4mIHJhbmdlcykgewotICBiYXNlOjpUaW1lRGVsdGEgcHJldiA9IG1lZGlhOjprTm9UaW1lc3RhbXAoKTsKLSAgZm9yIChzdGQ6Omxpc3Q8bWVkaWE6OlNvdXJjZUJ1ZmZlclJhbmdlKj46OmNvbnN0X2l0ZXJhdG9yIGl0ciA9Ci0gICAgICAgcmFuZ2VzLmJlZ2luKCk7IGl0ciAhPSByYW5nZXMuZW5kKCk7ICsraXRyKSB7Ci0gICAgaWYgKHByZXYgIT0gbWVkaWE6OmtOb1RpbWVzdGFtcCgpICYmIHByZXYgPj0gKCppdHIpLT5HZXRTdGFydFRpbWVzdGFtcCgpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHByZXYgPSAoKml0ciktPkdldEVuZFRpbWVzdGFtcCgpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBDb21wYXJpc29uIGZ1bmN0aW9uIGZvciB0d28gQnVmZmVycyBiYXNlZCBvbiB0aW1lc3RhbXAuCi1zdGF0aWMgYm9vbCBCdWZmZXJDb21wYXJhdG9yKAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8bWVkaWE6OlN0cmVhbVBhcnNlckJ1ZmZlcj4mIGZpcnN0LAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8bWVkaWE6OlN0cmVhbVBhcnNlckJ1ZmZlcj4mIHNlY29uZCkgewotICByZXR1cm4gZmlyc3QtPkdldERlY29kZVRpbWVzdGFtcCgpIDwgc2Vjb25kLT5HZXREZWNvZGVUaW1lc3RhbXAoKTsKLX0KLQotLy8gUmV0dXJucyBhbiBlc3RpbWF0ZSBvZiBob3cgZmFyIGZyb20gdGhlIGJlZ2lubmluZyBvciBlbmQgb2YgYSByYW5nZSBhIGJ1ZmZlcgotLy8gY2FuIGJlIHRvIHN0aWxsIGJlIGNvbnNpZGVyZWQgaW4gdGhlIHJhbmdlLCBnaXZlbiB0aGUgfGFwcHJveGltYXRlX2R1cmF0aW9ufAotLy8gb2YgYSBidWZmZXIgaW4gdGhlIHN0cmVhbS4KLXN0YXRpYyBiYXNlOjpUaW1lRGVsdGEgQ29tcHV0ZUZ1ZGdlUm9vbShiYXNlOjpUaW1lRGVsdGEgYXBwcm94aW1hdGVfZHVyYXRpb24pIHsKLSAgLy8gQmVjYXVzZSB3ZSBkbyBub3Qga25vdyBleGFjdGx5IHdoZW4gaXMgdGhlIG5leHQgdGltZXN0YW1wLCBhbnkgYnVmZmVyCi0gIC8vIHRoYXQgc3RhcnRzIHdpdGhpbiAyeCB0aGUgYXBwcm94aW1hdGUgZHVyYXRpb24gb2YgYSBidWZmZXIgaXMgY29uc2lkZXJlZAotICAvLyB3aXRoaW4gdGhpcyByYW5nZS4KLSAgcmV0dXJuIDIgKiBhcHByb3hpbWF0ZV9kdXJhdGlvbjsKLX0KLQotLy8gQW4gYXJiaXRyYXJpbHktY2hvc2VuIG51bWJlciB0byBlc3RpbWF0ZSB0aGUgZHVyYXRpb24gb2YgYSBidWZmZXIgaWYgbm9uZQotLy8gaXMgc2V0IGFuZCB0aGVyZSdzIG5vdCBlbm91Z2ggaW5mb3JtYXRpb24gdG8gZ2V0IGEgYmV0dGVyIGVzdGltYXRlLgotc3RhdGljIGludCBrRGVmYXVsdEJ1ZmZlckR1cmF0aW9uSW5NcyA9IDEyNTsKLQotLy8gVGhlIGFtb3VudCBvZiB0aW1lIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlcmVkIGRhdGEgY2FuIGRpZmZlciBmcm9tIHRoZQotLy8gc3RhcnQgdGltZSBpbiBvcmRlciB0byBzdGlsbCBiZSBjb25zaWRlcmVkIHRoZSBzdGFydCBvZiBzdHJlYW0uCi1zdGF0aWMgYmFzZTo6VGltZURlbHRhIGtTZWVrVG9TdGFydEZ1ZGdlUm9vbSgpIHsKLSAgcmV0dXJuIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygxMDAwKTsKLX0KLQotLy8gVGhlIG1heGltdW0gYW1vdW50IG9mIGRhdGEgaW4gYnl0ZXMgdGhlIHN0cmVhbSB3aWxsIGtlZXAgaW4gbWVtb3J5LgotLy8gMTJNQjogYXBwcm94aW1hdGVseSA1IG1pbnV0ZXMgb2YgMzIwS2JwcyBjb250ZW50LgotLy8gMTUwTUI6IGFwcHJveGltYXRlbHkgNSBtaW51dGVzIG9mIDRNYnBzIGNvbnRlbnQuCi0jaWYgIWRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLXN0YXRpYyBjb25zdCBpbnQga0RlZmF1bHRBdWRpb01lbW9yeUxpbWl0ID0gMTIgKiAxMDI0ICogMTAyNDsKLXN0YXRpYyBjb25zdCBpbnQga0RlZmF1bHRWaWRlb01lbW9yeUxpbWl0ID0gMTUwICogMTAyNCAqIDEwMjQ7Ci0jZW5kaWYKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotI2lmIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLVNvdXJjZUJ1ZmZlclN0cmVhbTo6U291cmNlQnVmZmVyU3RyZWFtKAotICAgIGNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYgYXVkaW9fY29uZmlnLAotICAgIGNvbnN0IExvZ0NCJiBsb2dfY2IpCi0gICAgOiBsb2dfY2JfKGxvZ19jYiksCi0gICAgICBjdXJyZW50X2NvbmZpZ19pbmRleF8oMCksCi0gICAgICBhcHBlbmRfY29uZmlnX2luZGV4XygwKSwKLSAgICAgIHNlZWtfcGVuZGluZ18oZmFsc2UpLAotICAgICAgc2Vla19idWZmZXJfdGltZXN0YW1wXyhrTm9UaW1lc3RhbXAoKSksCi0gICAgICBzZWxlY3RlZF9yYW5nZV8oTlVMTCksCi0gICAgICBtZWRpYV9zZWdtZW50X3N0YXJ0X3RpbWVfKGtOb1RpbWVzdGFtcCgpKSwKLSAgICAgIHJhbmdlX2Zvcl9uZXh0X2FwcGVuZF8ocmFuZ2VzXy5lbmQoKSksCi0gICAgICBuZXdfbWVkaWFfc2VnbWVudF8oZmFsc2UpLAotICAgICAgbGFzdF9idWZmZXJfdGltZXN0YW1wXyhrTm9UaW1lc3RhbXAoKSksCi0gICAgICBtYXhfaW50ZXJidWZmZXJfZGlzdGFuY2VfKGtOb1RpbWVzdGFtcCgpKSwKLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0gICAgICBtZW1vcnlfbGltaXRfKFNoZWxsTWVkaWFQbGF0Zm9ybTo6SW5zdGFuY2UoKS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBHZXRTb3VyY2VCdWZmZXJTdHJlYW1BdWRpb01lbW9yeUxpbWl0KCkpLAotI2Vsc2UgIC8vIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLSAgICAgIG1lbW9yeV9saW1pdF8oa0RlZmF1bHRBdWRpb01lbW9yeUxpbWl0KSwKLSNlbmRpZiAgLy8gZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICAgICAgY29uZmlnX2NoYW5nZV9wZW5kaW5nXyhmYWxzZSkgewotICBEQ0hFQ0soYXVkaW9fY29uZmlnLklzVmFsaWRDb25maWcoKSk7Ci0gIGF1ZGlvX2NvbmZpZ3NfLnB1c2hfYmFjayhuZXcgQXVkaW9EZWNvZGVyQ29uZmlnKCkpOwotICBhdWRpb19jb25maWdzXy5iYWNrKCktPkNvcHlGcm9tKGF1ZGlvX2NvbmZpZyk7Ci19Ci0KLVNvdXJjZUJ1ZmZlclN0cmVhbTo6U291cmNlQnVmZmVyU3RyZWFtKAotICAgIGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgdmlkZW9fY29uZmlnLAotICAgIGNvbnN0IExvZ0NCJiBsb2dfY2IpCi0gICAgOiBsb2dfY2JfKGxvZ19jYiksCi0gICAgICBjdXJyZW50X2NvbmZpZ19pbmRleF8oMCksCi0gICAgICBhcHBlbmRfY29uZmlnX2luZGV4XygwKSwKLSAgICAgIHNlZWtfcGVuZGluZ18oZmFsc2UpLAotICAgICAgc2Vla19idWZmZXJfdGltZXN0YW1wXyhrTm9UaW1lc3RhbXAoKSksCi0gICAgICBzZWxlY3RlZF9yYW5nZV8oTlVMTCksCi0gICAgICBtZWRpYV9zZWdtZW50X3N0YXJ0X3RpbWVfKGtOb1RpbWVzdGFtcCgpKSwKLSAgICAgIHJhbmdlX2Zvcl9uZXh0X2FwcGVuZF8ocmFuZ2VzXy5lbmQoKSksCi0gICAgICBuZXdfbWVkaWFfc2VnbWVudF8oZmFsc2UpLAotICAgICAgbGFzdF9idWZmZXJfdGltZXN0YW1wXyhrTm9UaW1lc3RhbXAoKSksCi0gICAgICBtYXhfaW50ZXJidWZmZXJfZGlzdGFuY2VfKGtOb1RpbWVzdGFtcCgpKSwKLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0gICAgICBtZW1vcnlfbGltaXRfKFNoZWxsTWVkaWFQbGF0Zm9ybTo6SW5zdGFuY2UoKS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBHZXRTb3VyY2VCdWZmZXJTdHJlYW1WaWRlb01lbW9yeUxpbWl0KCkpLAotI2Vsc2UgIC8vIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLSAgICAgIG1lbW9yeV9saW1pdF8oa0RlZmF1bHRWaWRlb01lbW9yeUxpbWl0KSwKLSNlbmRpZiAgLy8gZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICAgICAgY29uZmlnX2NoYW5nZV9wZW5kaW5nXyhmYWxzZSkgewotICBEQ0hFQ0sodmlkZW9fY29uZmlnLklzVmFsaWRDb25maWcoKSk7Ci0gIHZpZGVvX2NvbmZpZ3NfLnB1c2hfYmFjayhuZXcgVmlkZW9EZWNvZGVyQ29uZmlnKCkpOwotICB2aWRlb19jb25maWdzXy5iYWNrKCktPkNvcHlGcm9tKHZpZGVvX2NvbmZpZyk7Ci19Ci0jZWxzZQotU291cmNlQnVmZmVyU3RyZWFtOjpTb3VyY2VCdWZmZXJTdHJlYW0oY29uc3QgQXVkaW9EZWNvZGVyQ29uZmlnJiBhdWRpb19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2dDQiYgbG9nX2NiKQotICAgIDogbG9nX2NiXyhsb2dfY2IpLAotICAgICAgY3VycmVudF9jb25maWdfaW5kZXhfKDApLAotICAgICAgYXBwZW5kX2NvbmZpZ19pbmRleF8oMCksCi0gICAgICBzZWVrX3BlbmRpbmdfKGZhbHNlKSwKLSAgICAgIHNlZWtfYnVmZmVyX3RpbWVzdGFtcF8oa05vVGltZXN0YW1wKCkpLAotICAgICAgc2VsZWN0ZWRfcmFuZ2VfKE5VTEwpLAotICAgICAgbWVkaWFfc2VnbWVudF9zdGFydF90aW1lXyhrTm9UaW1lc3RhbXAoKSksCi0gICAgICByYW5nZV9mb3JfbmV4dF9hcHBlbmRfKHJhbmdlc18uZW5kKCkpLAotICAgICAgbmV3X21lZGlhX3NlZ21lbnRfKGZhbHNlKSwKLSAgICAgIGxhc3RfYnVmZmVyX3RpbWVzdGFtcF8oa05vVGltZXN0YW1wKCkpLAotICAgICAgbWF4X2ludGVyYnVmZmVyX2Rpc3RhbmNlXyhrTm9UaW1lc3RhbXAoKSksCi0gICAgICBtZW1vcnlfbGltaXRfKGtEZWZhdWx0QXVkaW9NZW1vcnlMaW1pdCksCi0gICAgICBjb25maWdfY2hhbmdlX3BlbmRpbmdfKGZhbHNlKSB7Ci0gIERDSEVDSyhhdWRpb19jb25maWcuSXNWYWxpZENvbmZpZygpKTsKLSAgYXVkaW9fY29uZmlnc18ucHVzaF9iYWNrKG5ldyBBdWRpb0RlY29kZXJDb25maWcoKSk7Ci0gIGF1ZGlvX2NvbmZpZ3NfLmJhY2soKS0+Q29weUZyb20oYXVkaW9fY29uZmlnKTsKLX0KLQotU291cmNlQnVmZmVyU3RyZWFtOjpTb3VyY2VCdWZmZXJTdHJlYW0oY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiB2aWRlb19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2dDQiYgbG9nX2NiKQotICAgIDogbG9nX2NiXyhsb2dfY2IpLAotICAgICAgY3VycmVudF9jb25maWdfaW5kZXhfKDApLAotICAgICAgYXBwZW5kX2NvbmZpZ19pbmRleF8oMCksCi0gICAgICBzZWVrX3BlbmRpbmdfKGZhbHNlKSwKLSAgICAgIHNlZWtfYnVmZmVyX3RpbWVzdGFtcF8oa05vVGltZXN0YW1wKCkpLAotICAgICAgc2VsZWN0ZWRfcmFuZ2VfKE5VTEwpLAotICAgICAgbWVkaWFfc2VnbWVudF9zdGFydF90aW1lXyhrTm9UaW1lc3RhbXAoKSksCi0gICAgICByYW5nZV9mb3JfbmV4dF9hcHBlbmRfKHJhbmdlc18uZW5kKCkpLAotICAgICAgbmV3X21lZGlhX3NlZ21lbnRfKGZhbHNlKSwKLSAgICAgIGxhc3RfYnVmZmVyX3RpbWVzdGFtcF8oa05vVGltZXN0YW1wKCkpLAotICAgICAgbWF4X2ludGVyYnVmZmVyX2Rpc3RhbmNlXyhrTm9UaW1lc3RhbXAoKSksCi0gICAgICBtZW1vcnlfbGltaXRfKGtEZWZhdWx0VmlkZW9NZW1vcnlMaW1pdCksCi0gICAgICBjb25maWdfY2hhbmdlX3BlbmRpbmdfKGZhbHNlKSB7Ci0gIERDSEVDSyh2aWRlb19jb25maWcuSXNWYWxpZENvbmZpZygpKTsKLSAgdmlkZW9fY29uZmlnc18ucHVzaF9iYWNrKG5ldyBWaWRlb0RlY29kZXJDb25maWcoKSk7Ci0gIHZpZGVvX2NvbmZpZ3NfLmJhY2soKS0+Q29weUZyb20odmlkZW9fY29uZmlnKTsKLX0KLSNlbmRpZgotCi1Tb3VyY2VCdWZmZXJTdHJlYW06On5Tb3VyY2VCdWZmZXJTdHJlYW0oKSB7Ci0gIHdoaWxlICghcmFuZ2VzXy5lbXB0eSgpKSB7Ci0gICAgZGVsZXRlIHJhbmdlc18uZnJvbnQoKTsKLSAgICByYW5nZXNfLnBvcF9mcm9udCgpOwotICB9Ci0KLSAgU1RMRGVsZXRlRWxlbWVudHMoJmF1ZGlvX2NvbmZpZ3NfKTsKLSAgU1RMRGVsZXRlRWxlbWVudHMoJnZpZGVvX2NvbmZpZ3NfKTsKLX0KLQotdm9pZCBTb3VyY2VCdWZmZXJTdHJlYW06Ok9uTmV3TWVkaWFTZWdtZW50KAotICAgIGJhc2U6OlRpbWVEZWx0YSBtZWRpYV9zZWdtZW50X3N0YXJ0X3RpbWUpIHsKLSAgbWVkaWFfc2VnbWVudF9zdGFydF90aW1lXyA9IG1lZGlhX3NlZ21lbnRfc3RhcnRfdGltZTsKLSAgbmV3X21lZGlhX3NlZ21lbnRfID0gdHJ1ZTsKLQotICBSYW5nZUxpc3Q6Oml0ZXJhdG9yIGxhc3RfcmFuZ2UgPSByYW5nZV9mb3JfbmV4dF9hcHBlbmRfOwotICByYW5nZV9mb3JfbmV4dF9hcHBlbmRfID0gRmluZEV4aXN0aW5nUmFuZ2VGb3IobWVkaWFfc2VnbWVudF9zdGFydF90aW1lKTsKLQotICAvLyBPbmx5IHJlc2V0IHxsYXN0X2J1ZmZlcl90aW1lc3RhbXBffCBpZiB0aGlzIG5ldyBtZWRpYSBzZWdtZW50IGlzIG5vdAotICAvLyBhZGphY2VudCB0byB0aGUgcHJldmlvdXMgbWVkaWEgc2VnbWVudCBhcHBlbmRlZCB0byB0aGUgc3RyZWFtLgotICBpZiAocmFuZ2VfZm9yX25leHRfYXBwZW5kXyA9PSByYW5nZXNfLmVuZCgpIHx8Ci0gICAgICAhQXJlQWRqYWNlbnRJblNlcXVlbmNlKAotICAgICAgICAgIGxhc3RfYnVmZmVyX3RpbWVzdGFtcF8sIG1lZGlhX3NlZ21lbnRfc3RhcnRfdGltZSkpIHsKLSAgICBsYXN0X2J1ZmZlcl90aW1lc3RhbXBfID0ga05vVGltZXN0YW1wKCk7Ci0gIH0gZWxzZSB7Ci0gICAgRENIRUNLKGxhc3RfcmFuZ2UgPT0gcmFuZ2VfZm9yX25leHRfYXBwZW5kXyk7Ci0gIH0KLX0KLQotYm9vbCBTb3VyY2VCdWZmZXJTdHJlYW06OkFwcGVuZCgKLSAgICBjb25zdCBTb3VyY2VCdWZmZXJTdHJlYW06OkJ1ZmZlclF1ZXVlJiBidWZmZXJzKSB7Ci0gIERDSEVDSyghYnVmZmVycy5lbXB0eSgpKTsKLSAgRENIRUNLKG1lZGlhX3NlZ21lbnRfc3RhcnRfdGltZV8gIT0ga05vVGltZXN0YW1wKCkpOwotCi0gIC8vIExvZyBpZiBuZXcgbWVkaWEgc2VnbWVudCBkb2Vzbid0IGJlZ2luIHdpdGggYSBrZXlmcmFtZS4KLSAgaWYgKG5ld19tZWRpYV9zZWdtZW50XyAmJiAhYnVmZmVycy5mcm9udCgpLT5Jc0tleWZyYW1lKCkpIHsKLSAgICBNRURJQV9MT0cobG9nX2NiXykgPDwgIk1lZGlhIHNlZ21lbnQgZGlkIG5vdCBiZWdpbiB3aXRoIGtleWZyYW1lLiI7Ci0gIH0KLQotICAvLyBCdWZmZXJzIHdpdGhpbiBhIG1lZGlhIHNlZ21lbnQgc2hvdWxkIGJlIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZy4KLSAgaWYgKCFJc01vbm90b25pY2FsbHlJbmNyZWFzaW5nKGJ1ZmZlcnMpKSB7Ci0gICAgTUVESUFfTE9HKGxvZ19jYl8pIDw8ICJCdWZmZXJzIHdlcmUgbm90IG1vbm90b25pY2FsbHkgaW5jcmVhc2luZy4iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChtZWRpYV9zZWdtZW50X3N0YXJ0X3RpbWVfIDwgYmFzZTo6VGltZURlbHRhKCkgfHwKLSAgICAgIGJ1ZmZlcnMuZnJvbnQoKS0+R2V0RGVjb2RlVGltZXN0YW1wKCkgPCBiYXNlOjpUaW1lRGVsdGEoKSkgewotICAgIE1FRElBX0xPRyhsb2dfY2JfKQotICAgICAgICA8PCAiQ2Fubm90IGFwcGVuZCBhIG1lZGlhIHNlZ21lbnQgd2l0aCBuZWdhdGl2ZSB0aW1lc3RhbXBzLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgVXBkYXRlTWF4SW50ZXJidWZmZXJEaXN0YW5jZShidWZmZXJzKTsKLSAgU2V0Q29uZmlnSWRzKGJ1ZmZlcnMpOwotCi0gIC8vIFNhdmUgYSBzbmFwc2hvdCBvZiBzdHJlYW0gc3RhdGUgYmVmb3JlIHJhbmdlIG1vZGlmaWNhdGlvbnMgYXJlIG1hZGUuCi0gIGJhc2U6OlRpbWVEZWx0YSBuZXh0X2J1ZmZlcl90aW1lc3RhbXAgPSBHZXROZXh0QnVmZmVyVGltZXN0YW1wKCk7Ci0gIGJhc2U6OlRpbWVEZWx0YSBlbmRfYnVmZmVyX3RpbWVzdGFtcCA9IEdldEVuZEJ1ZmZlclRpbWVzdGFtcCgpOwotCi0gIGJvb2wgZGVsZXRlZF9uZXh0X2J1ZmZlciA9IGZhbHNlOwotICBCdWZmZXJRdWV1ZSBkZWxldGVkX2J1ZmZlcnM7Ci0KLSAgUmFuZ2VMaXN0OjppdGVyYXRvciByYW5nZV9mb3JfbmV3X2J1ZmZlcnMgPSByYW5nZV9mb3JfbmV4dF9hcHBlbmRfOwotICAvLyBJZiB0aGVyZSdzIGEgcmFuZ2UgZm9yIHxidWZmZXJzfCwgaW5zZXJ0IHxidWZmZXJzfCBhY2NvcmRpbmdseS4gT3RoZXJ3aXNlLAotICAvLyBjcmVhdGUgYSBuZXcgcmFuZ2Ugd2l0aCB8YnVmZmVyc3wuCi0gIGlmIChyYW5nZV9mb3JfbmV3X2J1ZmZlcnMgIT0gcmFuZ2VzXy5lbmQoKSkgewotICAgIEluc2VydEludG9FeGlzdGluZ1JhbmdlKHJhbmdlX2Zvcl9uZXdfYnVmZmVycywgYnVmZmVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVsZXRlZF9uZXh0X2J1ZmZlciwgJmRlbGV0ZWRfYnVmZmVycyk7Ci0gIH0gZWxzZSB7Ci0gICAgRENIRUNLKG5ld19tZWRpYV9zZWdtZW50Xyk7Ci0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICAgIHJhbmdlX2Zvcl9uZXdfYnVmZmVycyA9Ci0gICAgICAgIEFkZFRvUmFuZ2VzKG5ldyBTb3VyY2VCdWZmZXJSYW5nZSgKLSAgICAgICAgICAgIGJ1ZmZlcnMsIG1lZGlhX3NlZ21lbnRfc3RhcnRfdGltZV8sCi0gICAgICAgICAgICBiYXNlOjpCaW5kKCZTb3VyY2VCdWZmZXJTdHJlYW06OkdldE1heEludGVyYnVmZmVyRGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKSk7Ci0jZWxzZQotICAgIHJhbmdlX2Zvcl9uZXdfYnVmZmVycyA9Ci0gICAgICAgIEFkZFRvUmFuZ2VzKG5ldyBTb3VyY2VCdWZmZXJSYW5nZSgKLSAgICAgICAgICAgIGJ1ZmZlcnMsIG1lZGlhX3NlZ21lbnRfc3RhcnRfdGltZV8sCi0gICAgICAgICAgICBiYXNlOjpCaW5kKCZTb3VyY2VCdWZmZXJTdHJlYW06OkdldE1heEludGVyYnVmZmVyRGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKSk7Ci0jZW5kaWYKLSAgfQotCi0gIHJhbmdlX2Zvcl9uZXh0X2FwcGVuZF8gPSByYW5nZV9mb3JfbmV3X2J1ZmZlcnM7Ci0gIG5ld19tZWRpYV9zZWdtZW50XyA9IGZhbHNlOwotICBsYXN0X2J1ZmZlcl90aW1lc3RhbXBfID0gYnVmZmVycy5iYWNrKCktPkdldERlY29kZVRpbWVzdGFtcCgpOwotCi0gIC8vIFJlc29sdmUgb3ZlcmxhcHMuCi0gIFJlc29sdmVDb21wbGV0ZU92ZXJsYXBzKAotICAgICAgcmFuZ2VfZm9yX25ld19idWZmZXJzLCAmZGVsZXRlZF9uZXh0X2J1ZmZlciwgJmRlbGV0ZWRfYnVmZmVycyk7Ci0gIFJlc29sdmVFbmRPdmVybGFwKAotICAgICAgcmFuZ2VfZm9yX25ld19idWZmZXJzLCAmZGVsZXRlZF9uZXh0X2J1ZmZlciwgJmRlbGV0ZWRfYnVmZmVycyk7Ci0gIE1lcmdlV2l0aEFkamFjZW50UmFuZ2VJZk5lY2Vzc2FyeShyYW5nZV9mb3JfbmV3X2J1ZmZlcnMpOwotCi0gIC8vIFNlZWsgdG8gdHJ5IHRvIGZ1bGZpbGwgYSBwcmV2aW91cyBjYWxsIHRvIFNlZWsoKS4KLSAgaWYgKHNlZWtfcGVuZGluZ18pIHsKLSAgICBEQ0hFQ0soIXNlbGVjdGVkX3JhbmdlXyk7Ci0gICAgRENIRUNLKCFkZWxldGVkX25leHRfYnVmZmVyKTsKLSAgICBTZWVrKHNlZWtfYnVmZmVyX3RpbWVzdGFtcF8pOwotICB9Ci0KLSAgLy8gU2VlayBiZWNhdXNlIHRoZSBBcHBlbmQoKSBoYXMgZGVsZXRlZCB0aGUgYnVmZmVyIHRoYXQgd291bGQgaGF2ZSBiZWVuCi0gIC8vIHJldHVybmVkIGluIHRoZSBuZXh0IGNhbGwgdG8gR2V0TmV4dEJ1ZmZlcigpLgotICBpZiAoZGVsZXRlZF9uZXh0X2J1ZmZlcikgewotICAgIERDSEVDSyghc2Vla19wZW5kaW5nXyk7Ci0gICAgU2V0U2VsZWN0ZWRSYW5nZSgqcmFuZ2VfZm9yX25ld19idWZmZXJzKTsKLSAgICBpZiAobmV4dF9idWZmZXJfdGltZXN0YW1wICE9IGtOb1RpbWVzdGFtcCgpKSB7Ci0gICAgICAvLyBTZWVrIGFoZWFkIHRvIHRoZSBrZXlmcmFtZSBhdCBvciBhZnRlciB8bmV4dF9idWZmZXJfdGltZXN0YW1wfCwgdGhlCi0gICAgICAvLyB0aW1lc3RhbXAgb2YgdGhlIGRlbGV0ZWQgbmV4dCBidWZmZXIuCi0gICAgICBzZWxlY3RlZF9yYW5nZV8tPlNlZWtBaGVhZFRvKG5leHRfYnVmZmVyX3RpbWVzdGFtcCk7Ci0gICAgICAvLyBVcGRhdGUgdHJhY2sgYnVmZmVyIHdpdGggbm9uLWtleWZyYW1lIGJ1ZmZlcnMgbGVhZGluZyB1cCB0byB0aGUgY3VycmVudAotICAgICAgLy8gcG9zaXRpb24gb2YgfHNlbGVjdGVkX3JhbmdlX3wuCi0gICAgICBQcnVuZVRyYWNrQnVmZmVyKCk7Ci0gICAgICBpZiAoIWRlbGV0ZWRfYnVmZmVycy5lbXB0eSgpKQotICAgICAgICBVcGRhdGVUcmFja0J1ZmZlcihkZWxldGVkX2J1ZmZlcnMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBJZiB8bmV4dF9idWZmZXJfdGltZXN0YW1wfCBpcyBrTm9UaW1lc3RhbXAoKSwgaXQgbWVhbnMgdGhlIHJhbmdlCi0gICAgICAvLyB3ZSd2ZSBvdmVybGFwcGVkIGRpZG4ndCBhY3R1YWxseSBoYXZlIHRoZSBuZXh0IGJ1ZmZlciBidWZmZXJlZCwgYW5kIGl0Ci0gICAgICAvLyB3YXMgd2FpdGluZyBmb3IgdGhlIG5leHQgYnVmZmVyIHdob3NlIHRpbWVzdGFtcCB3YXMgZ3JlYXRlciB0aGFuCi0gICAgICAvLyB8ZW5kX2J1ZmZlcl90aW1lc3RhbXB8LiBTZWVrIHRoZSB8c2VsZWN0ZWRfcmFuZ2VffCB0byB0aGUgbmV4dCBrZXlmcmFtZQotICAgICAgLy8gYWZ0ZXIgfGVuZF9idWZmZXJfdGltZXN0YW1wfC4KLSAgICAgIERDSEVDSyh0cmFja19idWZmZXJfLmVtcHR5KCkpOwotICAgICAgRENIRUNLKGRlbGV0ZWRfYnVmZmVycy5lbXB0eSgpKTsKLSAgICAgIHNlbGVjdGVkX3JhbmdlXy0+U2Vla0FoZWFkUGFzdChlbmRfYnVmZmVyX3RpbWVzdGFtcCk7Ci0gICAgfQotICB9Ci0KLSAgR2FyYmFnZUNvbGxlY3RJZk5lZWRlZCgpOwotCi0gIERDSEVDSyhJc1JhbmdlTGlzdFNvcnRlZChyYW5nZXNfKSk7Ci0gIERDSEVDSyhPbmx5U2VsZWN0ZWRSYW5nZUlzU2Vla2VkKCkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBTb3VyY2VCdWZmZXJTdHJlYW06OlJlc2V0U2Vla1N0YXRlKCkgewotICBTZXRTZWxlY3RlZFJhbmdlKE5VTEwpOwotICB0cmFja19idWZmZXJfLmNsZWFyKCk7Ci0gIGNvbmZpZ19jaGFuZ2VfcGVuZGluZ18gPSBmYWxzZTsKLX0KLQotYm9vbCBTb3VyY2VCdWZmZXJTdHJlYW06OlNob3VsZFNlZWtUb1N0YXJ0T2ZCdWZmZXJlZCgKLSAgICBiYXNlOjpUaW1lRGVsdGEgc2Vla190aW1lc3RhbXApIGNvbnN0IHsKLSAgaWYgKHJhbmdlc18uZW1wdHkoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGJhc2U6OlRpbWVEZWx0YSBiZWdpbm5pbmdfb2ZfYnVmZmVyZWQgPQotICAgICAgcmFuZ2VzXy5mcm9udCgpLT5HZXRTdGFydFRpbWVzdGFtcCgpOwotICByZXR1cm4gKHNlZWtfdGltZXN0YW1wIDw9IGJlZ2lubmluZ19vZl9idWZmZXJlZCAmJgotICAgICAgICAgIGJlZ2lubmluZ19vZl9idWZmZXJlZCA8IGtTZWVrVG9TdGFydEZ1ZGdlUm9vbSgpKTsKLX0KLQotYm9vbCBTb3VyY2VCdWZmZXJTdHJlYW06OklzTW9ub3RvbmljYWxseUluY3JlYXNpbmcoCi0gICAgY29uc3QgQnVmZmVyUXVldWUmIGJ1ZmZlcnMpIGNvbnN0IHsKLSAgRENIRUNLKCFidWZmZXJzLmVtcHR5KCkpOwotICBiYXNlOjpUaW1lRGVsdGEgcHJldl90aW1lc3RhbXAgPSBsYXN0X2J1ZmZlcl90aW1lc3RhbXBfOwotICBmb3IgKEJ1ZmZlclF1ZXVlOjpjb25zdF9pdGVyYXRvciBpdHIgPSBidWZmZXJzLmJlZ2luKCk7Ci0gICAgICAgaXRyICE9IGJ1ZmZlcnMuZW5kKCk7ICsraXRyKSB7Ci0gICAgYmFzZTo6VGltZURlbHRhIGN1cnJlbnRfdGltZXN0YW1wID0gKCppdHIpLT5HZXREZWNvZGVUaW1lc3RhbXAoKTsKLSAgICBEQ0hFQ0soY3VycmVudF90aW1lc3RhbXAgIT0ga05vVGltZXN0YW1wKCkpOwotCi0gICAgaWYgKHByZXZfdGltZXN0YW1wICE9IGtOb1RpbWVzdGFtcCgpICYmIGN1cnJlbnRfdGltZXN0YW1wIDwgcHJldl90aW1lc3RhbXApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBwcmV2X3RpbWVzdGFtcCA9IGN1cnJlbnRfdGltZXN0YW1wOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFNvdXJjZUJ1ZmZlclN0cmVhbTo6T25seVNlbGVjdGVkUmFuZ2VJc1NlZWtlZCgpIGNvbnN0IHsKLSAgZm9yIChSYW5nZUxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ciA9IHJhbmdlc18uYmVnaW4oKTsKLSAgICAgICBpdHIgIT0gcmFuZ2VzXy5lbmQoKTsgKytpdHIpIHsKLSAgICBpZiAoKCppdHIpLT5IYXNOZXh0QnVmZmVyUG9zaXRpb24oKSAmJiAoKml0cikgIT0gc2VsZWN0ZWRfcmFuZ2VfKQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiAhc2VsZWN0ZWRfcmFuZ2VfIHx8IHNlbGVjdGVkX3JhbmdlXy0+SGFzTmV4dEJ1ZmZlclBvc2l0aW9uKCk7Ci19Ci0KLXZvaWQgU291cmNlQnVmZmVyU3RyZWFtOjpVcGRhdGVNYXhJbnRlcmJ1ZmZlckRpc3RhbmNlKAotICAgIGNvbnN0IEJ1ZmZlclF1ZXVlJiBidWZmZXJzKSB7Ci0gIERDSEVDSyghYnVmZmVycy5lbXB0eSgpKTsKLSAgYmFzZTo6VGltZURlbHRhIHByZXZfdGltZXN0YW1wID0gbGFzdF9idWZmZXJfdGltZXN0YW1wXzsKLSAgZm9yIChCdWZmZXJRdWV1ZTo6Y29uc3RfaXRlcmF0b3IgaXRyID0gYnVmZmVycy5iZWdpbigpOwotICAgICAgIGl0ciAhPSBidWZmZXJzLmVuZCgpOyArK2l0cikgewotICAgIGJhc2U6OlRpbWVEZWx0YSBjdXJyZW50X3RpbWVzdGFtcCA9ICgqaXRyKS0+R2V0RGVjb2RlVGltZXN0YW1wKCk7Ci0gICAgRENIRUNLKGN1cnJlbnRfdGltZXN0YW1wICE9IGtOb1RpbWVzdGFtcCgpKTsKLQotICAgIGJhc2U6OlRpbWVEZWx0YSBpbnRlcmJ1ZmZlcl9kaXN0YW5jZTsKLSAgICAvLyBXZWJNU3RyZWFtUGFyc2VyIGluIE0yNSBkb2Vzbid0IGd1YXJhbnRlZSB0aGF0IGEgZHVyYXRpb24gaXMgYWx3YXlzIHNldC4KLSAgICBpZiAoKCppdHIpLT5HZXREdXJhdGlvbigpICE9IGtOb1RpbWVzdGFtcCgpKQotICAgICAgaW50ZXJidWZmZXJfZGlzdGFuY2UgPSAoKml0ciktPkdldER1cmF0aW9uKCk7Ci0KLSAgICBpZiAocHJldl90aW1lc3RhbXAgIT0ga05vVGltZXN0YW1wKCkpIHsKLSAgICAgIGludGVyYnVmZmVyX2Rpc3RhbmNlID0KLSAgICAgICAgICBzdGQ6Om1heChjdXJyZW50X3RpbWVzdGFtcCAtIHByZXZfdGltZXN0YW1wLCBpbnRlcmJ1ZmZlcl9kaXN0YW5jZSk7Ci0gICAgfQotCi0gICAgaWYgKGludGVyYnVmZmVyX2Rpc3RhbmNlID4gYmFzZTo6VGltZURlbHRhKCkpIHsKLSAgICAgIGlmIChtYXhfaW50ZXJidWZmZXJfZGlzdGFuY2VfID09IGtOb1RpbWVzdGFtcCgpKSB7Ci0gICAgICAgIG1heF9pbnRlcmJ1ZmZlcl9kaXN0YW5jZV8gPSBpbnRlcmJ1ZmZlcl9kaXN0YW5jZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG1heF9pbnRlcmJ1ZmZlcl9kaXN0YW5jZV8gPQotICAgICAgICAgICAgc3RkOjptYXgobWF4X2ludGVyYnVmZmVyX2Rpc3RhbmNlXywgaW50ZXJidWZmZXJfZGlzdGFuY2UpOwotICAgICAgfQotICAgIH0KLSAgICBwcmV2X3RpbWVzdGFtcCA9IGN1cnJlbnRfdGltZXN0YW1wOwotICB9Ci19Ci0KLXZvaWQgU291cmNlQnVmZmVyU3RyZWFtOjpTZXRDb25maWdJZHMoY29uc3QgQnVmZmVyUXVldWUmIGJ1ZmZlcnMpIHsKLSAgZm9yIChCdWZmZXJRdWV1ZTo6Y29uc3RfaXRlcmF0b3IgaXRyID0gYnVmZmVycy5iZWdpbigpOwotICAgICAgIGl0ciAhPSBidWZmZXJzLmVuZCgpOyArK2l0cikgewotICAgICgqaXRyKS0+U2V0Q29uZmlnSWQoYXBwZW5kX2NvbmZpZ19pbmRleF8pOwotICB9Ci19Ci0KLXZvaWQgU291cmNlQnVmZmVyU3RyZWFtOjpHYXJiYWdlQ29sbGVjdElmTmVlZGVkKCkgewotICAvLyBDb21wdXRlIHNpemUgb2YgfHJhbmdlc198LgotICBpbnQgcmFuZ2VzX3NpemUgPSAwOwotICBmb3IgKFJhbmdlTGlzdDo6aXRlcmF0b3IgaXRyID0gcmFuZ2VzXy5iZWdpbigpOyBpdHIgIT0gcmFuZ2VzXy5lbmQoKTsgKytpdHIpCi0gICAgcmFuZ2VzX3NpemUgKz0gKCppdHIpLT5zaXplX2luX2J5dGVzKCk7Ci0KLSAgLy8gUmV0dXJuIGlmIHdlJ3JlIHVuZGVyIG9yIGF0IHRoZSBtZW1vcnkgbGltaXQuCi0gIGlmIChyYW5nZXNfc2l6ZSA8PSBtZW1vcnlfbGltaXRfKQotICAgIHJldHVybjsKLQotICBMb2dNZWRpYVNvdXJjZVRpbWVSYW5nZXMoImJlZm9yZSBnYXJiYWdlIGNvbGxlY3QiLCBHZXRCdWZmZXJlZFRpbWUoKSk7Ci0KLSAgaW50IGJ5dGVzX3RvX2ZyZWUgPSByYW5nZXNfc2l6ZSAtIG1lbW9yeV9saW1pdF87Ci0KLSAgLy8gQmVnaW4gZGVsZXRpbmcgZnJvbSB0aGUgZnJvbnQuCi0gIGludCBieXRlc19mcmVlZCA9IEZyZWVCdWZmZXJzKGJ5dGVzX3RvX2ZyZWUsIGZhbHNlKTsKLQotICBMb2dNZWRpYVNvdXJjZVRpbWVSYW5nZXMoImFmdGVyIGdhcmJhZ2UgY29sbGVjdCBmcm9tIGZyb250IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJ1ZmZlcmVkVGltZSgpKTsKLQotICAvLyBCZWdpbiBkZWxldGluZyBmcm9tIHRoZSBiYWNrLgotICBpZiAoYnl0ZXNfdG9fZnJlZSAtIGJ5dGVzX2ZyZWVkID4gMCkgewotICAgIEZyZWVCdWZmZXJzKGJ5dGVzX3RvX2ZyZWUgLSBieXRlc19mcmVlZCwgdHJ1ZSk7Ci0gICAgTG9nTWVkaWFTb3VyY2VUaW1lUmFuZ2VzKCJhZnRlciBnYXJiYWdlIGNvbGxlY3QgZnJvbSBiYWNrIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0QnVmZmVyZWRUaW1lKCkpOwotICB9Ci19Ci0KLWludCBTb3VyY2VCdWZmZXJTdHJlYW06OkZyZWVCdWZmZXJzKGludCB0b3RhbF9ieXRlc190b19mcmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXZlcnNlX2RpcmVjdGlvbikgewotICBEQ0hFQ0tfR1QodG90YWxfYnl0ZXNfdG9fZnJlZSwgMCk7Ci0gIGludCBieXRlc190b19mcmVlID0gdG90YWxfYnl0ZXNfdG9fZnJlZTsKLSAgaW50IGJ5dGVzX2ZyZWVkID0gMDsKLQotICAvLyBUaGlzIHJhbmdlIHdpbGwgc2F2ZSB0aGUgbGFzdCBHT1AgYXBwZW5kZWQgdG8gfHJhbmdlX2Zvcl9uZXh0X2FwcGVuZF98Ci0gIC8vIGlmIHRoZSBidWZmZXJzIHN1cnJvdW5kaW5nIGl0IGdldCBkZWxldGVkIGR1cmluZyBnYXJiYWdlIGNvbGxlY3Rpb24uCi0gIFNvdXJjZUJ1ZmZlclJhbmdlKiBuZXdfcmFuZ2VfZm9yX2FwcGVuZCA9IE5VTEw7Ci0KLSAgd2hpbGUgKCFyYW5nZXNfLmVtcHR5KCkgJiYgYnl0ZXNfdG9fZnJlZSA+IDApIHsKLSAgICBTb3VyY2VCdWZmZXJSYW5nZSogY3VycmVudF9yYW5nZSA9IE5VTEw7Ci0gICAgQnVmZmVyUXVldWUgYnVmZmVyczsKLSAgICBpbnQgYnl0ZXNfZGVsZXRlZCA9IDA7Ci0KLSAgICBpZiAocmV2ZXJzZV9kaXJlY3Rpb24pIHsKLSAgICAgIGN1cnJlbnRfcmFuZ2UgPSByYW5nZXNfLmJhY2soKTsKLSAgICAgIGlmIChjdXJyZW50X3JhbmdlLT5MYXN0R09QQ29udGFpbnNOZXh0QnVmZmVyUG9zaXRpb24oKSkgewotICAgICAgICBEQ0hFQ0tfRVEoY3VycmVudF9yYW5nZSwgc2VsZWN0ZWRfcmFuZ2VfKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBieXRlc19kZWxldGVkID0gY3VycmVudF9yYW5nZS0+RGVsZXRlR09QRnJvbUJhY2soJmJ1ZmZlcnMpOwotICAgIH0gZWxzZSB7Ci0gICAgICBjdXJyZW50X3JhbmdlID0gcmFuZ2VzXy5mcm9udCgpOwotICAgICAgaWYgKGN1cnJlbnRfcmFuZ2UtPkZpcnN0R09QQ29udGFpbnNOZXh0QnVmZmVyUG9zaXRpb24oKSkgewotICAgICAgICBEQ0hFQ0tfRVEoY3VycmVudF9yYW5nZSwgc2VsZWN0ZWRfcmFuZ2VfKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBieXRlc19kZWxldGVkID0gY3VycmVudF9yYW5nZS0+RGVsZXRlR09QRnJvbUZyb250KCZidWZmZXJzKTsKLSAgICB9Ci0KLSAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UndmUganVzdCBkZWxldGVkIHRoZSBHT1AgdGhhdCB3YXMgbGFzdCBhcHBlbmRlZC4KLSAgICBpZiAoYnVmZmVycy5iYWNrKCktPkdldERlY29kZVRpbWVzdGFtcCgpID09IGxhc3RfYnVmZmVyX3RpbWVzdGFtcF8pIHsKLSAgICAgIERDSEVDSyhsYXN0X2J1ZmZlcl90aW1lc3RhbXBfICE9IGtOb1RpbWVzdGFtcCgpKTsKLSAgICAgIERDSEVDSyghbmV3X3JhbmdlX2Zvcl9hcHBlbmQpOwotICAgICAgLy8gQ3JlYXRlIGEgbmV3IHJhbmdlIGNvbnRhaW5pbmcgdGhlc2UgYnVmZmVycy4KLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0gICAgICBuZXdfcmFuZ2VfZm9yX2FwcGVuZCA9IG5ldyBTb3VyY2VCdWZmZXJSYW5nZSgKLSAgICAgICAgICAgIGJ1ZmZlcnMsIGtOb1RpbWVzdGFtcCgpLAotICAgICAgICAgICAgYmFzZTo6QmluZCgmU291cmNlQnVmZmVyU3RyZWFtOjpHZXRNYXhJbnRlcmJ1ZmZlckRpc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0jZWxzZQotICAgICAgbmV3X3JhbmdlX2Zvcl9hcHBlbmQgPSBuZXcgU291cmNlQnVmZmVyUmFuZ2UoCi0gICAgICAgICAgICBidWZmZXJzLCBrTm9UaW1lc3RhbXAoKSwKLSAgICAgICAgICAgIGJhc2U6OkJpbmQoJlNvdXJjZUJ1ZmZlclN0cmVhbTo6R2V0TWF4SW50ZXJidWZmZXJEaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotI2VuZGlmCi0gICAgICByYW5nZV9mb3JfbmV4dF9hcHBlbmRfID0gcmFuZ2VzXy5lbmQoKTsKLSAgICB9IGVsc2UgewotICAgICAgYnl0ZXNfdG9fZnJlZSAtPSBieXRlc19kZWxldGVkOwotICAgICAgYnl0ZXNfZnJlZWQgKz0gYnl0ZXNfZGVsZXRlZDsKLSAgICB9Ci0KLSAgICBpZiAoY3VycmVudF9yYW5nZS0+c2l6ZV9pbl9ieXRlcygpID09IDApIHsKLSAgICAgIERDSEVDS19ORShjdXJyZW50X3JhbmdlLCBzZWxlY3RlZF9yYW5nZV8pOwotICAgICAgRENIRUNLKHJhbmdlX2Zvcl9uZXh0X2FwcGVuZF8gPT0gcmFuZ2VzXy5lbmQoKSB8fAotICAgICAgICAgICAgICpyYW5nZV9mb3JfbmV4dF9hcHBlbmRfICE9IGN1cnJlbnRfcmFuZ2UpOwotICAgICAgZGVsZXRlIGN1cnJlbnRfcmFuZ2U7Ci0gICAgICByZXZlcnNlX2RpcmVjdGlvbiA/IHJhbmdlc18ucG9wX2JhY2soKSA6IHJhbmdlc18ucG9wX2Zyb250KCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gSW5zZXJ0IHxuZXdfcmFuZ2VfZm9yX2FwcGVuZHwgaW50byB8cmFuZ2VzX3wsIGlmIGFwcGxpY2FibGUuCi0gIGlmIChuZXdfcmFuZ2VfZm9yX2FwcGVuZCkgewotICAgIHJhbmdlX2Zvcl9uZXh0X2FwcGVuZF8gPSBBZGRUb1JhbmdlcyhuZXdfcmFuZ2VfZm9yX2FwcGVuZCk7Ci0gICAgRENIRUNLKHJhbmdlX2Zvcl9uZXh0X2FwcGVuZF8gIT0gcmFuZ2VzXy5lbmQoKSk7Ci0KLSAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBtZXJnZSB8bmV3X3JhbmdlX2Zvcl9hcHBlbmR8IHdpdGggdGhlIHJhbmdlCi0gICAgLy8gYmVmb3JlIG9yIGFmdGVyIGl0LiB8bmV3X3JhbmdlX2Zvcl9hcHBlbmR8IGlzIGNyZWF0ZWQgd2hlbmV2ZXIgdGhlIGxhc3QKLSAgICAvLyBHT1AgYXBwZW5kZWQgaXMgZW5jb3VudGVyZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhbnkgYnVmZmVycyBhZnRlciBpdAotICAgIC8vIGFyZSB1bHRpbWF0ZWx5IGRlbGV0ZWQuIE1lcmdpbmcgaXMgbmVjZXNzYXJ5IGlmIHRoZXJlIHdlcmUgbm8gYnVmZmVycwotICAgIC8vIChvciB2ZXJ5IGZldyBidWZmZXJzKSBkZWxldGVkIGFmdGVyIGNyZWF0aW5nIHxuZXdfcmFuZ2VfZm9yX2FwcGVuZHwuCi0gICAgaWYgKHJhbmdlX2Zvcl9uZXh0X2FwcGVuZF8gIT0gcmFuZ2VzXy5iZWdpbigpKSB7Ci0gICAgICBSYW5nZUxpc3Q6Oml0ZXJhdG9yIHJhbmdlX2JlZm9yZV9uZXh0ID0gcmFuZ2VfZm9yX25leHRfYXBwZW5kXzsKLSAgICAgIC0tcmFuZ2VfYmVmb3JlX25leHQ7Ci0gICAgICBNZXJnZVdpdGhBZGphY2VudFJhbmdlSWZOZWNlc3NhcnkocmFuZ2VfYmVmb3JlX25leHQpOwotICAgIH0KLSAgICBNZXJnZVdpdGhBZGphY2VudFJhbmdlSWZOZWNlc3NhcnkocmFuZ2VfZm9yX25leHRfYXBwZW5kXyk7Ci0gIH0KLSAgcmV0dXJuIGJ5dGVzX2ZyZWVkOwotfQotCi12b2lkIFNvdXJjZUJ1ZmZlclN0cmVhbTo6SW5zZXJ0SW50b0V4aXN0aW5nUmFuZ2UoCi0gICAgY29uc3QgUmFuZ2VMaXN0OjppdGVyYXRvciYgcmFuZ2VfZm9yX25ld19idWZmZXJzX2l0ciwKLSAgICBjb25zdCBCdWZmZXJRdWV1ZSYgbmV3X2J1ZmZlcnMsCi0gICAgYm9vbCogZGVsZXRlZF9uZXh0X2J1ZmZlciwgQnVmZmVyUXVldWUqIGRlbGV0ZWRfYnVmZmVycykgewotICBEQ0hFQ0soZGVsZXRlZF9uZXh0X2J1ZmZlcik7Ci0gIERDSEVDSyhkZWxldGVkX2J1ZmZlcnMpOwotCi0gIFNvdXJjZUJ1ZmZlclJhbmdlKiByYW5nZV9mb3JfbmV3X2J1ZmZlcnMgPSAqcmFuZ2VfZm9yX25ld19idWZmZXJzX2l0cjsKLQotICBpZiAobGFzdF9idWZmZXJfdGltZXN0YW1wXyAhPSBrTm9UaW1lc3RhbXAoKSkgewotICAgIC8vIENsZWFuIHVwIHRoZSBvbGQgYnVmZmVycyBiZXR3ZWVuIHRoZSBsYXN0IGFwcGVuZGVkIGJ1ZmZlciBhbmQgdGhlCi0gICAgLy8gYmVnaW5uaW5nIG9mIHxuZXdfYnVmZmVyc3wuCi0gICAgKmRlbGV0ZWRfbmV4dF9idWZmZXIgPQotICAgICAgICBEZWxldGVCZXR3ZWVuKAotICAgICAgICAgICAgcmFuZ2VfZm9yX25ld19idWZmZXJzLCBsYXN0X2J1ZmZlcl90aW1lc3RhbXBfLAotICAgICAgICAgICAgbmV3X2J1ZmZlcnMuZnJvbnQoKS0+R2V0RGVjb2RlVGltZXN0YW1wKCksIHRydWUsCi0gICAgICAgICAgICBkZWxldGVkX2J1ZmZlcnMpOwotICB9Ci0KLSAgLy8gSWYgd2UgY2Fubm90IGFwcGVuZCB0aGUgfG5ld19idWZmZXJzfCB0byB0aGUgZW5kIG9mIHRoZSBleGlzdGluZyByYW5nZSwKLSAgLy8gdGhpcyBpcyBlaXRoZXIgYSBzdGFydCBvdmVybGFwIG9yIGFuIG1pZGRsZSBvdmVybGFwLiBEZWxldGUgdGhlIGJ1ZmZlcnMKLSAgLy8gdGhhdCB8bmV3X2J1ZmZlcnN8IG92ZXJsYXBzLgotICBpZiAoIXJhbmdlX2Zvcl9uZXdfYnVmZmVycy0+Q2FuQXBwZW5kQnVmZmVyc1RvRW5kKG5ld19idWZmZXJzKSkgewotICAgICpkZWxldGVkX25leHRfYnVmZmVyIHw9Ci0gICAgICAgIERlbGV0ZUJldHdlZW4oCi0gICAgICAgICAgICByYW5nZV9mb3JfbmV3X2J1ZmZlcnMsIG5ld19idWZmZXJzLmZyb250KCktPkdldERlY29kZVRpbWVzdGFtcCgpLAotICAgICAgICAgICAgbmV3X2J1ZmZlcnMuYmFjaygpLT5HZXREZWNvZGVUaW1lc3RhbXAoKSwgZmFsc2UsCi0gICAgICAgICAgICBkZWxldGVkX2J1ZmZlcnMpOwotICB9Ci0KLSAgcmFuZ2VfZm9yX25ld19idWZmZXJzLT5BcHBlbmRCdWZmZXJzVG9FbmQobmV3X2J1ZmZlcnMpOwotfQotCi1ib29sIFNvdXJjZUJ1ZmZlclN0cmVhbTo6RGVsZXRlQmV0d2VlbigKLSAgICBTb3VyY2VCdWZmZXJSYW5nZSogcmFuZ2UsIGJhc2U6OlRpbWVEZWx0YSBzdGFydF90aW1lc3RhbXAsCi0gICAgYmFzZTo6VGltZURlbHRhIGVuZF90aW1lc3RhbXAsIGJvb2wgaXNfcmFuZ2VfZXhjbHVzaXZlLAotICAgIEJ1ZmZlclF1ZXVlKiBkZWxldGVkX2J1ZmZlcnMpIHsKLSAgU291cmNlQnVmZmVyUmFuZ2UqIG5ld19uZXh0X3JhbmdlID0KLSAgICAgIHJhbmdlLT5TcGxpdFJhbmdlKGVuZF90aW1lc3RhbXAsIGlzX3JhbmdlX2V4Y2x1c2l2ZSk7Ci0KLSAgaWYgKG5ld19uZXh0X3JhbmdlKQotICAgIEFkZFRvUmFuZ2VzKG5ld19uZXh0X3JhbmdlKTsKLQotICBCdWZmZXJRdWV1ZSBzYXZlZF9idWZmZXJzOwotICBib29sIGRlbGV0ZWRfbmV4dF9idWZmZXIgPQotICAgICAgcmFuZ2UtPlRydW5jYXRlQXQoc3RhcnRfdGltZXN0YW1wLCAmc2F2ZWRfYnVmZmVycywgaXNfcmFuZ2VfZXhjbHVzaXZlKTsKLQotICBpZiAoc2VsZWN0ZWRfcmFuZ2VfICE9IHJhbmdlKQotICAgIHJldHVybiBkZWxldGVkX25leHRfYnVmZmVyOwotCi0gIERDSEVDSyhkZWxldGVkX2J1ZmZlcnMtPmVtcHR5KCkpOwotICAqZGVsZXRlZF9idWZmZXJzID0gc2F2ZWRfYnVmZmVyczsKLQotICAvLyBJZiB0aGUgbmV4dCBidWZmZXIgcG9zaXRpb24gaGFzIHRyYW5zZmVycmVkIHRvIHRoZSBzcGxpdCByYW5nZSwgc2V0IHRoZQotICAvLyBzZWxlY3RlZCByYW5nZSBhY2NvcmRpbmdseS4KLSAgaWYgKG5ld19uZXh0X3JhbmdlICYmIG5ld19uZXh0X3JhbmdlLT5IYXNOZXh0QnVmZmVyUG9zaXRpb24oKSkgewotICAgIERDSEVDSyghcmFuZ2UtPkhhc05leHRCdWZmZXJQb3NpdGlvbigpKTsKLSAgICBEQ0hFQ0soIWRlbGV0ZWRfbmV4dF9idWZmZXIpOwotICAgIFNldFNlbGVjdGVkUmFuZ2UobmV3X25leHRfcmFuZ2UpOwotICB9Ci0gIHJldHVybiBkZWxldGVkX25leHRfYnVmZmVyOwotfQotCi1ib29sIFNvdXJjZUJ1ZmZlclN0cmVhbTo6QXJlQWRqYWNlbnRJblNlcXVlbmNlKAotICAgIGJhc2U6OlRpbWVEZWx0YSBmaXJzdF90aW1lc3RhbXAsIGJhc2U6OlRpbWVEZWx0YSBzZWNvbmRfdGltZXN0YW1wKSBjb25zdCB7Ci0gIHJldHVybiBmaXJzdF90aW1lc3RhbXAgPCBzZWNvbmRfdGltZXN0YW1wICYmCi0gICAgICBzZWNvbmRfdGltZXN0YW1wIDw9Ci0gICAgICBmaXJzdF90aW1lc3RhbXAgKyBDb21wdXRlRnVkZ2VSb29tKEdldE1heEludGVyYnVmZmVyRGlzdGFuY2UoKSk7Ci19Ci0KLXZvaWQgU291cmNlQnVmZmVyU3RyZWFtOjpSZXNvbHZlQ29tcGxldGVPdmVybGFwcygKLSAgICBjb25zdCBSYW5nZUxpc3Q6Oml0ZXJhdG9yJiByYW5nZV93aXRoX25ld19idWZmZXJzX2l0ciwKLSAgICBib29sKiBkZWxldGVkX25leHRfYnVmZmVyLCBCdWZmZXJRdWV1ZSogZGVsZXRlZF9idWZmZXJzKSB7Ci0gIERDSEVDSyhkZWxldGVkX25leHRfYnVmZmVyKTsKLSAgRENIRUNLKGRlbGV0ZWRfYnVmZmVycyk7Ci0KLSAgU291cmNlQnVmZmVyUmFuZ2UqIHJhbmdlX3dpdGhfbmV3X2J1ZmZlcnMgPSAqcmFuZ2Vfd2l0aF9uZXdfYnVmZmVyc19pdHI7Ci0gIFJhbmdlTGlzdDo6aXRlcmF0b3IgbmV4dF9yYW5nZV9pdHIgPSByYW5nZV93aXRoX25ld19idWZmZXJzX2l0cjsKLSAgKytuZXh0X3JhbmdlX2l0cjsKLQotICB3aGlsZSAobmV4dF9yYW5nZV9pdHIgIT0gcmFuZ2VzXy5lbmQoKSAmJgotICAgICAgICAgcmFuZ2Vfd2l0aF9uZXdfYnVmZmVycy0+Q29tcGxldGVseU92ZXJsYXBzKCoqbmV4dF9yYW5nZV9pdHIpKSB7Ci0gICAgaWYgKCpuZXh0X3JhbmdlX2l0ciA9PSBzZWxlY3RlZF9yYW5nZV8pIHsKLSAgICAgIERDSEVDSyghKmRlbGV0ZWRfbmV4dF9idWZmZXIpOwotICAgICAgKmRlbGV0ZWRfbmV4dF9idWZmZXIgPSBzZWxlY3RlZF9yYW5nZV8tPkRlbGV0ZUFsbChkZWxldGVkX2J1ZmZlcnMpOwotICAgICAgRENIRUNLKCpkZWxldGVkX25leHRfYnVmZmVyKTsKLSAgICAgIFNldFNlbGVjdGVkUmFuZ2UoTlVMTCk7Ci0gICAgfQotICAgIGRlbGV0ZSAqbmV4dF9yYW5nZV9pdHI7Ci0gICAgbmV4dF9yYW5nZV9pdHIgPSByYW5nZXNfLmVyYXNlKG5leHRfcmFuZ2VfaXRyKTsKLSAgfQotfQotCi12b2lkIFNvdXJjZUJ1ZmZlclN0cmVhbTo6UmVzb2x2ZUVuZE92ZXJsYXAoCi0gICAgY29uc3QgUmFuZ2VMaXN0OjppdGVyYXRvciYgcmFuZ2Vfd2l0aF9uZXdfYnVmZmVyc19pdHIsCi0gICAgYm9vbCogZGVsZXRlZF9uZXh0X2J1ZmZlciwgQnVmZmVyUXVldWUqIGRlbGV0ZWRfYnVmZmVycykgewotICBEQ0hFQ0soZGVsZXRlZF9uZXh0X2J1ZmZlcik7Ci0gIERDSEVDSyhkZWxldGVkX2J1ZmZlcnMpOwotCi0gIFNvdXJjZUJ1ZmZlclJhbmdlKiByYW5nZV93aXRoX25ld19idWZmZXJzID0gKnJhbmdlX3dpdGhfbmV3X2J1ZmZlcnNfaXRyOwotICBSYW5nZUxpc3Q6Oml0ZXJhdG9yIG5leHRfcmFuZ2VfaXRyID0gcmFuZ2Vfd2l0aF9uZXdfYnVmZmVyc19pdHI7Ci0gICsrbmV4dF9yYW5nZV9pdHI7Ci0KLSAgaWYgKG5leHRfcmFuZ2VfaXRyID09IHJhbmdlc18uZW5kKCkgfHwKLSAgICAgICFyYW5nZV93aXRoX25ld19idWZmZXJzLT5FbmRPdmVybGFwcygqKm5leHRfcmFuZ2VfaXRyKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFNwbGl0IHRoZSBvdmVybGFwcGVkIHJhbmdlIGFmdGVyIHxyYW5nZV93aXRoX25ld19idWZmZXJzfCdzIGxhc3QgYnVmZmVyCi0gIC8vIG92ZXJsYXBzLiBOb3cgfG92ZXJsYXBwZWRfcmFuZ2V8IGNvbnRhaW5zIG9ubHkgdGhlIGJ1ZmZlcnMgdGhhdCBkbyBub3QKLSAgLy8gYmVsb25nIGluIHxyYW5nZXNffCBhbnltb3JlLCBhbmQgfG5ld19uZXh0X3JhbmdlfCBjb250YWlucyBidWZmZXJzIHRoYXQKLSAgLy8gZ28gYWZ0ZXIgfHJhbmdlX3dpdGhfbmV3X2J1ZmZlcnN8ICh3aXRob3V0IG92ZXJsYXApLgotICBzY29wZWRfcHRyPFNvdXJjZUJ1ZmZlclJhbmdlPiBvdmVybGFwcGVkX3JhbmdlKCpuZXh0X3JhbmdlX2l0cik7Ci0gIG5leHRfcmFuZ2VfaXRyID0gcmFuZ2VzXy5lcmFzZShuZXh0X3JhbmdlX2l0cik7Ci0KLSAgU291cmNlQnVmZmVyUmFuZ2UqIG5ld19uZXh0X3JhbmdlID0KLSAgICAgIG92ZXJsYXBwZWRfcmFuZ2UtPlNwbGl0UmFuZ2UoCi0gICAgICAgICAgcmFuZ2Vfd2l0aF9uZXdfYnVmZmVycy0+R2V0RW5kVGltZXN0YW1wKCksIHRydWUpOwotCi0gIC8vIElmIHRoZXJlIHdlcmUgbm9uLW92ZXJsYXBwZWQgYnVmZmVycywgYWRkIHRoZSBuZXcgcmFuZ2UgdG8gfHJhbmdlc198LgotICBpZiAobmV3X25leHRfcmFuZ2UpCi0gICAgQWRkVG9SYW5nZXMobmV3X25leHRfcmFuZ2UpOwotCi0gIC8vIElmIHdlIGRpZG4ndCBvdmVybGFwIGEgc2VsZWN0ZWQgcmFuZ2UsIHJldHVybi4KLSAgaWYgKHNlbGVjdGVkX3JhbmdlXyAhPSBvdmVybGFwcGVkX3JhbmdlLmdldCgpKQotICAgIHJldHVybjsKLQotICAvLyBJZiB0aGUgfG92ZXJsYXBwZWRfcmFuZ2V8IHRyYW5zZmVycyBpdHMgbmV4dCBidWZmZXIgcG9zaXRpb24gdG8KLSAgLy8gfG5ld19uZXh0X3JhbmdlfCwgbWFrZSB8bmV3X25leHRfcmFuZ2V8IHRoZSB8c2VsZWN0ZWRfcmFuZ2VffC4KLSAgaWYgKG5ld19uZXh0X3JhbmdlICYmIG5ld19uZXh0X3JhbmdlLT5IYXNOZXh0QnVmZmVyUG9zaXRpb24oKSkgewotICAgIERDSEVDSyghb3ZlcmxhcHBlZF9yYW5nZS0+SGFzTmV4dEJ1ZmZlclBvc2l0aW9uKCkpOwotICAgIFNldFNlbGVjdGVkUmFuZ2UobmV3X25leHRfcmFuZ2UpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFNhdmUgdGhlIGJ1ZmZlcnMgaW4gfG92ZXJsYXBwZWRfcmFuZ2V8LgotICBEQ0hFQ0soISpkZWxldGVkX25leHRfYnVmZmVyKTsKLSAgRENIRUNLX0VRKG92ZXJsYXBwZWRfcmFuZ2UuZ2V0KCksIHNlbGVjdGVkX3JhbmdlXyk7Ci0gICpkZWxldGVkX25leHRfYnVmZmVyID0gb3ZlcmxhcHBlZF9yYW5nZS0+RGVsZXRlQWxsKGRlbGV0ZWRfYnVmZmVycyk7Ci0gIERDSEVDSygqZGVsZXRlZF9uZXh0X2J1ZmZlcik7Ci0KLSAgLy8gfG92ZXJsYXBwZWRfcmFuZ2V8IHdpbGwgYmUgZGVsZXRlZCwgc28gc2V0IHxzZWxlY3RlZF9yYW5nZV98IHRvIE5VTEwuCi0gIFNldFNlbGVjdGVkUmFuZ2UoTlVMTCk7Ci19Ci0KLXZvaWQgU291cmNlQnVmZmVyU3RyZWFtOjpQcnVuZVRyYWNrQnVmZmVyKCkgewotICBEQ0hFQ0soc2VsZWN0ZWRfcmFuZ2VfKTsKLSAgRENIRUNLKHNlbGVjdGVkX3JhbmdlXy0+SGFzTmV4dEJ1ZmZlclBvc2l0aW9uKCkpOwotICBiYXNlOjpUaW1lRGVsdGEgbmV4dF90aW1lc3RhbXAgPSBzZWxlY3RlZF9yYW5nZV8tPkdldE5leHRUaW1lc3RhbXAoKTsKLQotICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoZSBuZXh0IHRpbWVzdGFtcCwgd2UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0byBkZWxldGUuCi0gIGlmIChuZXh0X3RpbWVzdGFtcCA9PSBrTm9UaW1lc3RhbXAoKSkKLSAgICByZXR1cm47Ci0KLSAgd2hpbGUgKCF0cmFja19idWZmZXJfLmVtcHR5KCkgJiYKLSAgICAgICAgIHRyYWNrX2J1ZmZlcl8uYmFjaygpLT5HZXREZWNvZGVUaW1lc3RhbXAoKSA+PSBuZXh0X3RpbWVzdGFtcCkgewotICAgIHRyYWNrX2J1ZmZlcl8ucG9wX2JhY2soKTsKLSAgfQotfQotCi12b2lkIFNvdXJjZUJ1ZmZlclN0cmVhbTo6VXBkYXRlVHJhY2tCdWZmZXIoY29uc3QgQnVmZmVyUXVldWUmIGRlbGV0ZWRfYnVmZmVycykgewotICBEQ0hFQ0soIWRlbGV0ZWRfYnVmZmVycy5lbXB0eSgpKTsKLSAgRENIRUNLKHNlbGVjdGVkX3JhbmdlXyk7Ci0gIERDSEVDSyhzZWxlY3RlZF9yYW5nZV8tPkhhc05leHRCdWZmZXJQb3NpdGlvbigpKTsKLQotICBiYXNlOjpUaW1lRGVsdGEgbmV4dF9rZXlmcmFtZV90aW1lc3RhbXAgPSBzZWxlY3RlZF9yYW5nZV8tPkdldE5leHRUaW1lc3RhbXAoKTsKLSAgYmFzZTo6VGltZURlbHRhIHN0YXJ0X29mX2RlbGV0ZWQgPQotICAgICAgZGVsZXRlZF9idWZmZXJzLmZyb250KCktPkdldERlY29kZVRpbWVzdGFtcCgpOwotCi0gIC8vIHxkZWxldGVkX2J1ZmZlcnN8IHNob3VsZCBhbHdheXMgY29tZSBhZnRlciB0aGUgYnVmZmVycyBpbiB8dHJhY2tfYnVmZmVyfC4KLSAgaWYgKCF0cmFja19idWZmZXJfLmVtcHR5KCkpCi0gICAgRENIRUNLKHRyYWNrX2J1ZmZlcl8uYmFjaygpLT5HZXREZWNvZGVUaW1lc3RhbXAoKSA8IHN0YXJ0X29mX2RlbGV0ZWQpOwotCi0gIC8vIElmIHRoZXJlIGlzIG5vIGdhcCBiZXR3ZWVuIHdoYXQgd2FzIGRlbGV0ZWQgYW5kIHdoYXQgd2FzIGFkZGVkLCBub3RoaW5nCi0gIC8vIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgdHJhY2sgYnVmZmVyLgotICBpZiAoc2VsZWN0ZWRfcmFuZ2VfLT5IYXNOZXh0QnVmZmVyKCkgJiYKLSAgICAgIG5leHRfa2V5ZnJhbWVfdGltZXN0YW1wIDw9IHN0YXJ0X29mX2RlbGV0ZWQpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBJZiB0aGUgfHNlbGVjdGVkX3JhbmdlX3wgaXMgcmVhZHkgdG8gcmV0dXJuIGRhdGEsIGZpbGwgdGhlIHRyYWNrIGJ1ZmZlcgotICAvLyB3aXRoIGFsbCBidWZmZXJzIHRoYXQgY29tZSBiZWZvcmUgfG5leHRfa2V5ZnJhbWVfdGltZXN0YW1wfCBhbmQgcmV0dXJuLgotICBpZiAoc2VsZWN0ZWRfcmFuZ2VfLT5IYXNOZXh0QnVmZmVyKCkpIHsKLSAgICBmb3IgKEJ1ZmZlclF1ZXVlOjpjb25zdF9pdGVyYXRvciBpdHIgPSBkZWxldGVkX2J1ZmZlcnMuYmVnaW4oKTsKLSAgICAgICAgIGl0ciAhPSBkZWxldGVkX2J1ZmZlcnMuZW5kKCkgJiYKLSAgICAgICAgICgqaXRyKS0+R2V0RGVjb2RlVGltZXN0YW1wKCkgPCBuZXh0X2tleWZyYW1lX3RpbWVzdGFtcDsgKytpdHIpIHsKLSAgICAgIHRyYWNrX2J1ZmZlcl8ucHVzaF9iYWNrKCppdHIpOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBPdGhlcndpc2UsIHRoZSB8c2VsZWN0ZWRfcmFuZ2VffCBpcyBub3QgcmVhZHkgdG8gcmV0dXJuIGRhdGEsIHNvIGFkZCBhbGwKLSAgLy8gdGhlIGRlbGV0ZWQgYnVmZmVycyBpbnRvIHRoZSB8dHJhY2tfYnVmZmVyX3wuCi0gIHRyYWNrX2J1ZmZlcl8uaW5zZXJ0KHRyYWNrX2J1ZmZlcl8uZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZWRfYnVmZmVycy5iZWdpbigpLCBkZWxldGVkX2J1ZmZlcnMuZW5kKCkpOwotCi0gIC8vIFNlZSBpZiB0aGUgbmV4dCByYW5nZSBjb250YWlucyB0aGUga2V5ZnJhbWUgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUKLSAgLy8gfHRyYWNrX2J1ZmZlcl98LCBhbmQgaWYgc28sIGNoYW5nZSB8c2VsZWN0ZWRfcmFuZ2VffC4KLSAgUmFuZ2VMaXN0OjppdGVyYXRvciBuZXh0X3JhbmdlX2l0ciA9ICsrKEdldFNlbGVjdGVkUmFuZ2VJdHIoKSk7Ci0gIGlmIChuZXh0X3JhbmdlX2l0ciA9PSByYW5nZXNfLmVuZCgpKQotICAgIHJldHVybjsKLQotICAoKm5leHRfcmFuZ2VfaXRyKS0+U2Vla0FoZWFkUGFzdCgKLSAgICAgIHRyYWNrX2J1ZmZlcl8uYmFjaygpLT5HZXREZWNvZGVUaW1lc3RhbXAoKSk7Ci0KLSAgaWYgKCEoKm5leHRfcmFuZ2VfaXRyKS0+SGFzTmV4dEJ1ZmZlcigpKQotICAgIHJldHVybjsKLQotICBpZiAoIXNlbGVjdGVkX3JhbmdlXy0+SXNOZXh0SW5TZXF1ZW5jZSgKLSAgICAgICAgICB0cmFja19idWZmZXJfLmJhY2soKSwgKCpuZXh0X3JhbmdlX2l0ciktPkdldE5leHRUaW1lc3RhbXAoKSkpIHsKLSAgICAoKm5leHRfcmFuZ2VfaXRyKS0+UmVzZXROZXh0QnVmZmVyUG9zaXRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgU2V0U2VsZWN0ZWRSYW5nZSgqbmV4dF9yYW5nZV9pdHIpOwotfQotCi12b2lkIFNvdXJjZUJ1ZmZlclN0cmVhbTo6TWVyZ2VXaXRoQWRqYWNlbnRSYW5nZUlmTmVjZXNzYXJ5KAotICAgIGNvbnN0IFJhbmdlTGlzdDo6aXRlcmF0b3ImIHJhbmdlX3dpdGhfbmV3X2J1ZmZlcnNfaXRyKSB7Ci0gIFNvdXJjZUJ1ZmZlclJhbmdlKiByYW5nZV93aXRoX25ld19idWZmZXJzID0gKnJhbmdlX3dpdGhfbmV3X2J1ZmZlcnNfaXRyOwotICBSYW5nZUxpc3Q6Oml0ZXJhdG9yIG5leHRfcmFuZ2VfaXRyID0gcmFuZ2Vfd2l0aF9uZXdfYnVmZmVyc19pdHI7Ci0gICsrbmV4dF9yYW5nZV9pdHI7Ci0KLSAgaWYgKG5leHRfcmFuZ2VfaXRyICE9IHJhbmdlc18uZW5kKCkgJiYKLSAgICAgIHJhbmdlX3dpdGhfbmV3X2J1ZmZlcnMtPkNhbkFwcGVuZFJhbmdlVG9FbmQoKipuZXh0X3JhbmdlX2l0cikpIHsKLSAgICBib29sIHRyYW5zZmVyX2N1cnJlbnRfcG9zaXRpb24gPSBzZWxlY3RlZF9yYW5nZV8gPT0gKm5leHRfcmFuZ2VfaXRyOwotICAgIHJhbmdlX3dpdGhfbmV3X2J1ZmZlcnMtPkFwcGVuZFJhbmdlVG9FbmQoKipuZXh0X3JhbmdlX2l0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX2N1cnJlbnRfcG9zaXRpb24pOwotICAgIC8vIFVwZGF0ZSB8c2VsZWN0ZWRfcmFuZ2VffCBwb2ludGVyIGlmIHxyYW5nZXwgaGFzIGJlY29tZSBzZWxlY3RlZCBhZnRlcgotICAgIC8vIG1lcmdlcy4KLSAgICBpZiAodHJhbnNmZXJfY3VycmVudF9wb3NpdGlvbikKLSAgICAgIFNldFNlbGVjdGVkUmFuZ2UocmFuZ2Vfd2l0aF9uZXdfYnVmZmVycyk7Ci0KLSAgICBpZiAobmV4dF9yYW5nZV9pdHIgPT0gcmFuZ2VfZm9yX25leHRfYXBwZW5kXykKLSAgICAgIHJhbmdlX2Zvcl9uZXh0X2FwcGVuZF8gPSByYW5nZV93aXRoX25ld19idWZmZXJzX2l0cjsKLQotICAgIGRlbGV0ZSAqbmV4dF9yYW5nZV9pdHI7Ci0gICAgcmFuZ2VzXy5lcmFzZShuZXh0X3JhbmdlX2l0cik7Ci0gIH0KLX0KLQotdm9pZCBTb3VyY2VCdWZmZXJTdHJlYW06OlNlZWsoYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCkgewotICBEQ0hFQ0sodGltZXN0YW1wID49IGJhc2U6OlRpbWVEZWx0YSgpKTsKLSAgUmVzZXRTZWVrU3RhdGUoKTsKLQotICBpZiAoU2hvdWxkU2Vla1RvU3RhcnRPZkJ1ZmZlcmVkKHRpbWVzdGFtcCkpIHsKLSAgICBTZXRTZWxlY3RlZFJhbmdlKHJhbmdlc18uZnJvbnQoKSk7Ci0gICAgcmFuZ2VzXy5mcm9udCgpLT5TZWVrVG9TdGFydCgpOwotICAgIHNlZWtfcGVuZGluZ18gPSBmYWxzZTsKLSAgICBzZWVrX2J1ZmZlcl90aW1lc3RhbXBfID0gR2V0TmV4dEJ1ZmZlclRpbWVzdGFtcCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHNlZWtfYnVmZmVyX3RpbWVzdGFtcF8gPSB0aW1lc3RhbXA7Ci0gIHNlZWtfcGVuZGluZ18gPSB0cnVlOwotCi0gIFJhbmdlTGlzdDo6aXRlcmF0b3IgaXRyID0gcmFuZ2VzXy5lbmQoKTsKLSAgZm9yIChpdHIgPSByYW5nZXNfLmJlZ2luKCk7IGl0ciAhPSByYW5nZXNfLmVuZCgpOyArK2l0cikgewotICAgIGlmICgoKml0ciktPkNhblNlZWtUbyh0aW1lc3RhbXApKQotICAgICAgYnJlYWs7Ci0gIH0KLQotICBpZiAoaXRyID09IHJhbmdlc18uZW5kKCkpCi0gICAgcmV0dXJuOwotCi0gIFNldFNlbGVjdGVkUmFuZ2UoKml0cik7Ci0gIHNlbGVjdGVkX3JhbmdlXy0+U2Vlayh0aW1lc3RhbXApOwotICBzZWVrX3BlbmRpbmdfID0gZmFsc2U7Ci0gIHNlZWtfYnVmZmVyX3RpbWVzdGFtcF8gPSBHZXROZXh0QnVmZmVyVGltZXN0YW1wKCk7Ci19Ci0KLWJvb2wgU291cmNlQnVmZmVyU3RyZWFtOjpJc1NlZWtQZW5kaW5nKCkgY29uc3QgewotICByZXR1cm4gc2Vla19wZW5kaW5nXzsKLX0KLQotYmFzZTo6VGltZURlbHRhIFNvdXJjZUJ1ZmZlclN0cmVhbTo6R2V0U2Vla0tleWZyYW1lVGltZXN0YW1wKCkgY29uc3QgewotICBEQ0hFQ0soIUlzU2Vla1BlbmRpbmcoKSk7Ci0gIHJldHVybiBzZWVrX2J1ZmZlcl90aW1lc3RhbXBfOwotfQotCi12b2lkIFNvdXJjZUJ1ZmZlclN0cmVhbTo6T25TZXREdXJhdGlvbihiYXNlOjpUaW1lRGVsdGEgZHVyYXRpb24pIHsKLSAgUmFuZ2VMaXN0OjppdGVyYXRvciBpdHIgPSByYW5nZXNfLmVuZCgpOwotICBmb3IgKGl0ciA9IHJhbmdlc18uYmVnaW4oKTsgaXRyICE9IHJhbmdlc18uZW5kKCk7ICsraXRyKSB7Ci0gICAgaWYgKCgqaXRyKS0+R2V0RW5kVGltZXN0YW1wKCkgPiBkdXJhdGlvbikKLSAgICAgIGJyZWFrOwotICB9Ci0gIGlmIChpdHIgPT0gcmFuZ2VzXy5lbmQoKSkKLSAgICByZXR1cm47Ci0KLSAgLy8gTmVlZCB0byBwYXJ0aWFsbHkgdHJ1bmNhdGUgdGhpcyByYW5nZS4KLSAgaWYgKCgqaXRyKS0+R2V0U3RhcnRUaW1lc3RhbXAoKSA8IGR1cmF0aW9uKSB7Ci0gICAgYm9vbCBkZWxldGVkX3NlZWtfcG9pbnQgPSAoKml0ciktPlRydW5jYXRlQXQoZHVyYXRpb24sIE5VTEwsIGZhbHNlKTsKLSAgICBpZiAoZGVsZXRlZF9zZWVrX3BvaW50KQotICAgICAgUmVzZXRTZWVrU3RhdGUoKTsKLSAgICArK2l0cjsKLSAgfQotCi0gIC8vIERlbGV0ZSBhbGwgcmFuZ2VzIHRoYXQgYmVnaW4gYWZ0ZXIgfGR1cmF0aW9ufC4KLSAgd2hpbGUgKGl0ciAhPSByYW5nZXNfLmVuZCgpKSB7Ci0gICAgLy8gSWYgd2UncmUgYWJvdXQgdG8gZGVsZXRlIHRoZSBzZWxlY3RlZCByYW5nZSwgYWxzbyByZXNldCB0aGUgc2VlayBzdGF0ZS4KLSAgICBEQ0hFQ0soKCppdHIpLT5HZXRTdGFydFRpbWVzdGFtcCgpID49IGR1cmF0aW9uKTsKLSAgICBpZiAoKml0cj09IHNlbGVjdGVkX3JhbmdlXykKLSAgICAgIFJlc2V0U2Vla1N0YXRlKCk7Ci0gICAgZGVsZXRlICppdHI7Ci0gICAgaXRyID0gcmFuZ2VzXy5lcmFzZShpdHIpOwotICB9Ci19Ci0KLVNvdXJjZUJ1ZmZlclN0cmVhbTo6U3RhdHVzIFNvdXJjZUJ1ZmZlclN0cmVhbTo6R2V0TmV4dEJ1ZmZlcigKLSAgICBzY29wZWRfcmVmcHRyPFN0cmVhbVBhcnNlckJ1ZmZlcj4qIG91dF9idWZmZXIpIHsKLSAgQ0hFQ0soIWNvbmZpZ19jaGFuZ2VfcGVuZGluZ18pOwotCi0gIGlmICghdHJhY2tfYnVmZmVyXy5lbXB0eSgpKSB7Ci0gICAgRENIRUNLKHNlbGVjdGVkX3JhbmdlXyk7Ci0gICAgaWYgKHRyYWNrX2J1ZmZlcl8uZnJvbnQoKS0+R2V0Q29uZmlnSWQoKSAhPSBjdXJyZW50X2NvbmZpZ19pbmRleF8pIHsKLSAgICAgIGNvbmZpZ19jaGFuZ2VfcGVuZGluZ18gPSB0cnVlOwotICAgICAgRFZMT0coMSkgPDwgIkNvbmZpZyBjaGFuZ2UgKHRyYWNrIGJ1ZmZlciBjb25maWcgSUQgZG9lcyBub3QgbWF0Y2gpLiI7Ci0gICAgICByZXR1cm4ga0NvbmZpZ0NoYW5nZTsKLSAgICB9Ci0KLSAgICAqb3V0X2J1ZmZlciA9IHRyYWNrX2J1ZmZlcl8uZnJvbnQoKTsKLSAgICB0cmFja19idWZmZXJfLnBvcF9mcm9udCgpOwotICAgIHJldHVybiBrU3VjY2VzczsKLSAgfQotCi0gIGlmICghc2VsZWN0ZWRfcmFuZ2VfIHx8ICFzZWxlY3RlZF9yYW5nZV8tPkhhc05leHRCdWZmZXIoKSkKLSAgICByZXR1cm4ga05lZWRCdWZmZXI7Ci0KLSAgaWYgKHNlbGVjdGVkX3JhbmdlXy0+R2V0TmV4dENvbmZpZ0lkKCkgIT0gY3VycmVudF9jb25maWdfaW5kZXhfKSB7Ci0gICAgY29uZmlnX2NoYW5nZV9wZW5kaW5nXyA9IHRydWU7Ci0gICAgRFZMT0coMSkgPDwgIkNvbmZpZyBjaGFuZ2UgKHNlbGVjdGVkIHJhbmdlIGNvbmZpZyBJRCBkb2VzIG5vdCBtYXRjaCkuIjsKLSAgICByZXR1cm4ga0NvbmZpZ0NoYW5nZTsKLSAgfQotCi0gIENIRUNLKHNlbGVjdGVkX3JhbmdlXy0+R2V0TmV4dEJ1ZmZlcihvdXRfYnVmZmVyKSk7Ci0gIHJldHVybiBrU3VjY2VzczsKLX0KLQotYmFzZTo6VGltZURlbHRhIFNvdXJjZUJ1ZmZlclN0cmVhbTo6R2V0TmV4dEJ1ZmZlclRpbWVzdGFtcCgpIHsKLSAgaWYgKCFzZWxlY3RlZF9yYW5nZV8pIHsKLSAgICBEQ0hFQ0sodHJhY2tfYnVmZmVyXy5lbXB0eSgpKTsKLSAgICByZXR1cm4ga05vVGltZXN0YW1wKCk7Ci0gIH0KLQotICBEQ0hFQ0soc2VsZWN0ZWRfcmFuZ2VfLT5IYXNOZXh0QnVmZmVyUG9zaXRpb24oKSk7Ci0gIGlmICghdHJhY2tfYnVmZmVyXy5lbXB0eSgpKQotICAgIHJldHVybiB0cmFja19idWZmZXJfLmZyb250KCktPkdldERlY29kZVRpbWVzdGFtcCgpOwotICByZXR1cm4gc2VsZWN0ZWRfcmFuZ2VfLT5HZXROZXh0VGltZXN0YW1wKCk7Ci19Ci0KLWJhc2U6OlRpbWVEZWx0YSBTb3VyY2VCdWZmZXJTdHJlYW06OkdldEVuZEJ1ZmZlclRpbWVzdGFtcCgpIHsKLSAgaWYgKCFzZWxlY3RlZF9yYW5nZV8pCi0gICAgcmV0dXJuIGtOb1RpbWVzdGFtcCgpOwotICByZXR1cm4gc2VsZWN0ZWRfcmFuZ2VfLT5HZXRFbmRUaW1lc3RhbXAoKTsKLX0KLQotU291cmNlQnVmZmVyU3RyZWFtOjpSYW5nZUxpc3Q6Oml0ZXJhdG9yCi1Tb3VyY2VCdWZmZXJTdHJlYW06OkZpbmRFeGlzdGluZ1JhbmdlRm9yKGJhc2U6OlRpbWVEZWx0YSBzdGFydF90aW1lc3RhbXApIHsKLSAgZm9yIChSYW5nZUxpc3Q6Oml0ZXJhdG9yIGl0ciA9IHJhbmdlc18uYmVnaW4oKTsgaXRyICE9IHJhbmdlc18uZW5kKCk7ICsraXRyKSB7Ci0gICAgaWYgKCgqaXRyKS0+QmVsb25nc1RvUmFuZ2Uoc3RhcnRfdGltZXN0YW1wKSkKLSAgICAgIHJldHVybiBpdHI7Ci0gIH0KLSAgcmV0dXJuIHJhbmdlc18uZW5kKCk7Ci19Ci0KLVNvdXJjZUJ1ZmZlclN0cmVhbTo6UmFuZ2VMaXN0OjppdGVyYXRvcgotU291cmNlQnVmZmVyU3RyZWFtOjpBZGRUb1JhbmdlcyhTb3VyY2VCdWZmZXJSYW5nZSogbmV3X3JhbmdlKSB7Ci0gIGJhc2U6OlRpbWVEZWx0YSBzdGFydF90aW1lc3RhbXAgPSBuZXdfcmFuZ2UtPkdldFN0YXJ0VGltZXN0YW1wKCk7Ci0gIFJhbmdlTGlzdDo6aXRlcmF0b3IgaXRyID0gcmFuZ2VzXy5lbmQoKTsKLSAgZm9yIChpdHIgPSByYW5nZXNfLmJlZ2luKCk7IGl0ciAhPSByYW5nZXNfLmVuZCgpOyArK2l0cikgewotICAgIGlmICgoKml0ciktPkdldFN0YXJ0VGltZXN0YW1wKCkgPiBzdGFydF90aW1lc3RhbXApCi0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gcmFuZ2VzXy5pbnNlcnQoaXRyLCBuZXdfcmFuZ2UpOwotfQotCi1Tb3VyY2VCdWZmZXJTdHJlYW06OlJhbmdlTGlzdDo6aXRlcmF0b3IKLVNvdXJjZUJ1ZmZlclN0cmVhbTo6R2V0U2VsZWN0ZWRSYW5nZUl0cigpIHsKLSAgRENIRUNLKHNlbGVjdGVkX3JhbmdlXyk7Ci0gIFJhbmdlTGlzdDo6aXRlcmF0b3IgaXRyID0gcmFuZ2VzXy5lbmQoKTsKLSAgZm9yIChpdHIgPSByYW5nZXNfLmJlZ2luKCk7IGl0ciAhPSByYW5nZXNfLmVuZCgpOyArK2l0cikgewotICAgIGlmICgqaXRyID09IHNlbGVjdGVkX3JhbmdlXykKLSAgICAgIGJyZWFrOwotICB9Ci0gIERDSEVDSyhpdHIgIT0gcmFuZ2VzXy5lbmQoKSk7Ci0gIHJldHVybiBpdHI7Ci19Ci0KLXZvaWQgU291cmNlQnVmZmVyU3RyZWFtOjpTZXRTZWxlY3RlZFJhbmdlKFNvdXJjZUJ1ZmZlclJhbmdlKiByYW5nZSkgewotICBpZiAoc2VsZWN0ZWRfcmFuZ2VfKQotICAgIHNlbGVjdGVkX3JhbmdlXy0+UmVzZXROZXh0QnVmZmVyUG9zaXRpb24oKTsKLSAgc2VsZWN0ZWRfcmFuZ2VfID0gcmFuZ2U7Ci19Ci0KLVJhbmdlczxiYXNlOjpUaW1lRGVsdGE+IFNvdXJjZUJ1ZmZlclN0cmVhbTo6R2V0QnVmZmVyZWRUaW1lKCkgY29uc3QgewotICBSYW5nZXM8YmFzZTo6VGltZURlbHRhPiByYW5nZXM7Ci0gIGZvciAoUmFuZ2VMaXN0Ojpjb25zdF9pdGVyYXRvciBpdHIgPSByYW5nZXNfLmJlZ2luKCk7Ci0gICAgICAgaXRyICE9IHJhbmdlc18uZW5kKCk7ICsraXRyKSB7Ci0gICAgcmFuZ2VzLkFkZCgoKml0ciktPkdldFN0YXJ0VGltZXN0YW1wKCksICgqaXRyKS0+R2V0QnVmZmVyZWRFbmRUaW1lc3RhbXAoKSk7Ci0gIH0KLSAgcmV0dXJuIHJhbmdlczsKLX0KLQotYm9vbCBTb3VyY2VCdWZmZXJTdHJlYW06OklzRW5kU2VsZWN0ZWQoKSBjb25zdCB7Ci0gIHJldHVybiByYW5nZXNfLmVtcHR5KCkgfHwgc2VsZWN0ZWRfcmFuZ2VfID09IHJhbmdlc18uYmFjaygpOwotfQotCi1jb25zdCBBdWRpb0RlY29kZXJDb25maWcmIFNvdXJjZUJ1ZmZlclN0cmVhbTo6R2V0Q3VycmVudEF1ZGlvRGVjb2RlckNvbmZpZygpIHsKLSAgaWYgKGNvbmZpZ19jaGFuZ2VfcGVuZGluZ18pCi0gICAgQ29tcGxldGVDb25maWdDaGFuZ2UoKTsKLSAgcmV0dXJuICphdWRpb19jb25maWdzX1tjdXJyZW50X2NvbmZpZ19pbmRleF9dOwotfQotCi1jb25zdCBWaWRlb0RlY29kZXJDb25maWcmIFNvdXJjZUJ1ZmZlclN0cmVhbTo6R2V0Q3VycmVudFZpZGVvRGVjb2RlckNvbmZpZygpIHsKLSAgaWYgKGNvbmZpZ19jaGFuZ2VfcGVuZGluZ18pCi0gICAgQ29tcGxldGVDb25maWdDaGFuZ2UoKTsKLSAgcmV0dXJuICp2aWRlb19jb25maWdzX1tjdXJyZW50X2NvbmZpZ19pbmRleF9dOwotfQotCi1iYXNlOjpUaW1lRGVsdGEgU291cmNlQnVmZmVyU3RyZWFtOjpHZXRNYXhJbnRlcmJ1ZmZlckRpc3RhbmNlKCkgY29uc3QgewotICBpZiAobWF4X2ludGVyYnVmZmVyX2Rpc3RhbmNlXyA9PSBrTm9UaW1lc3RhbXAoKSkKLSAgICByZXR1cm4gYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKGtEZWZhdWx0QnVmZmVyRHVyYXRpb25Jbk1zKTsKLSAgcmV0dXJuIG1heF9pbnRlcmJ1ZmZlcl9kaXN0YW5jZV87Ci19Ci0KLWJvb2wgU291cmNlQnVmZmVyU3RyZWFtOjpVcGRhdGVBdWRpb0NvbmZpZyhjb25zdCBBdWRpb0RlY29kZXJDb25maWcmIGNvbmZpZykgewotICBEQ0hFQ0soIWF1ZGlvX2NvbmZpZ3NfLmVtcHR5KCkpOwotICBEQ0hFQ0sodmlkZW9fY29uZmlnc18uZW1wdHkoKSk7Ci0gIERWTE9HKDMpIDw8ICJVcGRhdGVBdWRpb0NvbmZpZy4iOwotCi0gIGlmIChhdWRpb19jb25maWdzX1swXS0+Y29kZWMoKSAhPSBjb25maWcuY29kZWMoKSkgewotICAgIE1FRElBX0xPRyhsb2dfY2JfKSA8PCAiQXVkaW8gY29kZWMgY2hhbmdlcyBub3QgYWxsb3dlZC4iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChhdWRpb19jb25maWdzX1swXS0+c2FtcGxlc19wZXJfc2Vjb25kKCkgIT0gY29uZmlnLnNhbXBsZXNfcGVyX3NlY29uZCgpKSB7Ci0gICAgTUVESUFfTE9HKGxvZ19jYl8pIDw8ICJBdWRpbyBzYW1wbGUgcmF0ZSBjaGFuZ2VzIG5vdCBhbGxvd2VkLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGF1ZGlvX2NvbmZpZ3NfWzBdLT5jaGFubmVsX2xheW91dCgpICE9IGNvbmZpZy5jaGFubmVsX2xheW91dCgpKSB7Ci0gICAgTUVESUFfTE9HKGxvZ19jYl8pIDw8ICJBdWRpbyBjaGFubmVsIGxheW91dCBjaGFuZ2VzIG5vdCBhbGxvd2VkLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGF1ZGlvX2NvbmZpZ3NfWzBdLT5iaXRzX3Blcl9jaGFubmVsKCkgIT0gY29uZmlnLmJpdHNfcGVyX2NoYW5uZWwoKSkgewotICAgIE1FRElBX0xPRyhsb2dfY2JfKSA8PCAiQXVkaW8gYml0cyBwZXIgY2hhbm5lbCBjaGFuZ2VzIG5vdCBhbGxvd2VkLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGF1ZGlvX2NvbmZpZ3NfWzBdLT5pc19lbmNyeXB0ZWQoKSAhPSBjb25maWcuaXNfZW5jcnlwdGVkKCkpIHsKLSAgICBNRURJQV9MT0cobG9nX2NiXykgPDwgIkF1ZGlvIGVuY3J5cHRpb24gY2hhbmdlcyBub3QgYWxsb3dlZC4iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbmV3IGNvbmZpZyBtYXRjaGVzIGFuIGV4aXN0aW5nIG9uZS4KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdWRpb19jb25maWdzXy5zaXplKCk7ICsraSkgewotICAgIGlmIChjb25maWcuTWF0Y2hlcygqYXVkaW9fY29uZmlnc19baV0pKSB7Ci0gICAgICBhcHBlbmRfY29uZmlnX2luZGV4XyA9IGk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICAvLyBObyBtYXRjaGVzIGZvdW5kIHNvIGxldCdzIGFkZCB0aGlzIG9uZSB0byB0aGUgbGlzdC4KLSAgYXBwZW5kX2NvbmZpZ19pbmRleF8gPSBhdWRpb19jb25maWdzXy5zaXplKCk7Ci0gIERWTE9HKDIpIDw8ICJOZXcgYXVkaW8gY29uZmlnIC0gaW5kZXg6ICIgPDwgYXBwZW5kX2NvbmZpZ19pbmRleF87Ci0gIGF1ZGlvX2NvbmZpZ3NfLnJlc2l6ZShhdWRpb19jb25maWdzXy5zaXplKCkgKyAxKTsKLSAgYXVkaW9fY29uZmlnc19bYXBwZW5kX2NvbmZpZ19pbmRleF9dID0gbmV3IEF1ZGlvRGVjb2RlckNvbmZpZygpOwotICBhdWRpb19jb25maWdzX1thcHBlbmRfY29uZmlnX2luZGV4X10tPkNvcHlGcm9tKGNvbmZpZyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFNvdXJjZUJ1ZmZlclN0cmVhbTo6VXBkYXRlVmlkZW9Db25maWcoY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiBjb25maWcpIHsKLSAgRENIRUNLKCF2aWRlb19jb25maWdzXy5lbXB0eSgpKTsKLSAgRENIRUNLKGF1ZGlvX2NvbmZpZ3NfLmVtcHR5KCkpOwotICBEVkxPRygzKSA8PCAiVXBkYXRlVmlkZW9Db25maWcuIjsKLQotICBpZiAodmlkZW9fY29uZmlnc19bMF0tPmlzX2VuY3J5cHRlZCgpICE9IGNvbmZpZy5pc19lbmNyeXB0ZWQoKSkgewotICAgIE1FRElBX0xPRyhsb2dfY2JfKSA8PCAiVmlkZW8gRW5jcnlwdGlvbiBjaGFuZ2VzIG5vdCBhbGxvd2VkLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKHZpZGVvX2NvbmZpZ3NfWzBdLT5jb2RlYygpICE9IGNvbmZpZy5jb2RlYygpKSB7Ci0gICAgTUVESUFfTE9HKGxvZ19jYl8pIDw8ICJWaWRlbyBjb2RlYyBjaGFuZ2VzIG5vdCBhbGxvd2VkLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKHZpZGVvX2NvbmZpZ3NfWzBdLT5pc19lbmNyeXB0ZWQoKSAhPSBjb25maWcuaXNfZW5jcnlwdGVkKCkpIHsKLSAgICBNRURJQV9MT0cobG9nX2NiXykgPDwgIlZpZGVvIGVuY3J5cHRpb24gY2hhbmdlcyBub3QgYWxsb3dlZC4iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbmV3IGNvbmZpZyBtYXRjaGVzIGFuIGV4aXN0aW5nIG9uZS4KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2aWRlb19jb25maWdzXy5zaXplKCk7ICsraSkgewotICAgIGlmIChjb25maWcuTWF0Y2hlcygqdmlkZW9fY29uZmlnc19baV0pKSB7Ci0gICAgICBhcHBlbmRfY29uZmlnX2luZGV4XyA9IGk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICAvLyBObyBtYXRjaGVzIGZvdW5kIHNvIGxldCdzIGFkZCB0aGlzIG9uZSB0byB0aGUgbGlzdC4KLSAgYXBwZW5kX2NvbmZpZ19pbmRleF8gPSB2aWRlb19jb25maWdzXy5zaXplKCk7Ci0gIERWTE9HKDIpIDw8ICJOZXcgdmlkZW8gY29uZmlnIC0gaW5kZXg6ICIgPDwgYXBwZW5kX2NvbmZpZ19pbmRleF87Ci0gIHZpZGVvX2NvbmZpZ3NfLnJlc2l6ZSh2aWRlb19jb25maWdzXy5zaXplKCkgKyAxKTsKLSAgdmlkZW9fY29uZmlnc19bYXBwZW5kX2NvbmZpZ19pbmRleF9dID0gbmV3IFZpZGVvRGVjb2RlckNvbmZpZygpOwotICB2aWRlb19jb25maWdzX1thcHBlbmRfY29uZmlnX2luZGV4X10tPkNvcHlGcm9tKGNvbmZpZyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFNvdXJjZUJ1ZmZlclN0cmVhbTo6Q29tcGxldGVDb25maWdDaGFuZ2UoKSB7Ci0gIGNvbmZpZ19jaGFuZ2VfcGVuZGluZ18gPSBmYWxzZTsKLQotICBpZiAoIXRyYWNrX2J1ZmZlcl8uZW1wdHkoKSkgewotICAgIGN1cnJlbnRfY29uZmlnX2luZGV4XyA9IHRyYWNrX2J1ZmZlcl8uZnJvbnQoKS0+R2V0Q29uZmlnSWQoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoc2VsZWN0ZWRfcmFuZ2VfICYmIHNlbGVjdGVkX3JhbmdlXy0+SGFzTmV4dEJ1ZmZlcigpKQotICAgIGN1cnJlbnRfY29uZmlnX2luZGV4XyA9IHNlbGVjdGVkX3JhbmdlXy0+R2V0TmV4dENvbmZpZ0lkKCk7Ci19Ci0KLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi1Tb3VyY2VCdWZmZXJSYW5nZTo6U291cmNlQnVmZmVyUmFuZ2UoCi0gICAgY29uc3QgQnVmZmVyUXVldWUmIG5ld19idWZmZXJzLCBiYXNlOjpUaW1lRGVsdGEgbWVkaWFfc2VnbWVudF9zdGFydF90aW1lLAotICAgIGNvbnN0IEludGVyYnVmZmVyRGlzdGFuY2VDQiYgaW50ZXJidWZmZXJfZGlzdGFuY2VfY2IpCi0gICAgOiBrZXlmcmFtZV9tYXBfaW5kZXhfYmFzZV8oMCksCi0gICAgICBuZXh0X2J1ZmZlcl9pbmRleF8oLTEpLAotICAgICAgd2FpdGluZ19mb3Jfa2V5ZnJhbWVfKGZhbHNlKSwKLSAgICAgIG5leHRfa2V5ZnJhbWVfdGltZXN0YW1wXyhrTm9UaW1lc3RhbXAoKSksCi0gICAgICBtZWRpYV9zZWdtZW50X3N0YXJ0X3RpbWVfKG1lZGlhX3NlZ21lbnRfc3RhcnRfdGltZSksCi0gICAgICBpbnRlcmJ1ZmZlcl9kaXN0YW5jZV9jYl8oaW50ZXJidWZmZXJfZGlzdGFuY2VfY2IpLAotICAgICAgc2l6ZV9pbl9ieXRlc18oMCkgewotICBEQ0hFQ0soIW5ld19idWZmZXJzLmVtcHR5KCkpOwotICBEQ0hFQ0soIWludGVyYnVmZmVyX2Rpc3RhbmNlX2NiLmlzX251bGwoKSk7Ci0gIEFwcGVuZEJ1ZmZlcnNUb0VuZChuZXdfYnVmZmVycyk7Ci19Ci0jZWxzZQotU291cmNlQnVmZmVyUmFuZ2U6OlNvdXJjZUJ1ZmZlclJhbmdlKAotICAgIGNvbnN0IEJ1ZmZlclF1ZXVlJiBuZXdfYnVmZmVycywgYmFzZTo6VGltZURlbHRhIG1lZGlhX3NlZ21lbnRfc3RhcnRfdGltZSwKLSAgICBjb25zdCBJbnRlcmJ1ZmZlckRpc3RhbmNlQ0ImIGludGVyYnVmZmVyX2Rpc3RhbmNlX2NiKQotICAgIDoga2V5ZnJhbWVfbWFwX2luZGV4X2Jhc2VfKDApLAotICAgICAgbmV4dF9idWZmZXJfaW5kZXhfKC0xKSwKLSAgICAgIHdhaXRpbmdfZm9yX2tleWZyYW1lXyhmYWxzZSksCi0gICAgICBuZXh0X2tleWZyYW1lX3RpbWVzdGFtcF8oa05vVGltZXN0YW1wKCkpLAotICAgICAgbWVkaWFfc2VnbWVudF9zdGFydF90aW1lXyhtZWRpYV9zZWdtZW50X3N0YXJ0X3RpbWUpLAotICAgICAgaW50ZXJidWZmZXJfZGlzdGFuY2VfY2JfKGludGVyYnVmZmVyX2Rpc3RhbmNlX2NiKSwKLSAgICAgIHNpemVfaW5fYnl0ZXNfKDApIHsKLSAgRENIRUNLKCFuZXdfYnVmZmVycy5lbXB0eSgpKTsKLSAgRENIRUNLKCFpbnRlcmJ1ZmZlcl9kaXN0YW5jZV9jYi5pc19udWxsKCkpOwotICBBcHBlbmRCdWZmZXJzVG9FbmQobmV3X2J1ZmZlcnMpOwotfQotI2VuZGlmCi0KLXZvaWQgU291cmNlQnVmZmVyUmFuZ2U6OkFwcGVuZEJ1ZmZlcnNUb0VuZChjb25zdCBCdWZmZXJRdWV1ZSYgbmV3X2J1ZmZlcnMpIHsKLSAgZm9yIChCdWZmZXJRdWV1ZTo6Y29uc3RfaXRlcmF0b3IgaXRyID0gbmV3X2J1ZmZlcnMuYmVnaW4oKTsKLSAgICAgICBpdHIgIT0gbmV3X2J1ZmZlcnMuZW5kKCk7ICsraXRyKSB7Ci0gICAgRENIRUNLKCgqaXRyKS0+R2V0RGVjb2RlVGltZXN0YW1wKCkgIT0ga05vVGltZXN0YW1wKCkpOwotICAgIGJ1ZmZlcnNfLnB1c2hfYmFjaygqaXRyKTsKLSAgICBzaXplX2luX2J5dGVzXyArPSAoKml0ciktPkdldERhdGFTaXplKCk7Ci0KLSAgICBpZiAoKCppdHIpLT5Jc0tleWZyYW1lKCkpIHsKLSAgICAgIGtleWZyYW1lX21hcF8uaW5zZXJ0KAotICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKCgqaXRyKS0+R2V0RGVjb2RlVGltZXN0YW1wKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihidWZmZXJzXy5zaXplKCkpIC0gMSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlmcmFtZV9tYXBfaW5kZXhfYmFzZV8pKTsKLQotICAgICAgaWYgKHdhaXRpbmdfZm9yX2tleWZyYW1lXyAmJgotICAgICAgICAgICgqaXRyKS0+R2V0RGVjb2RlVGltZXN0YW1wKCkgPj0gbmV4dF9rZXlmcmFtZV90aW1lc3RhbXBfKSB7Ci0gICAgICAgIG5leHRfYnVmZmVyX2luZGV4XyA9IGJ1ZmZlcnNfLnNpemUoKSAtIDE7Ci0gICAgICAgIG5leHRfa2V5ZnJhbWVfdGltZXN0YW1wXyA9IGtOb1RpbWVzdGFtcCgpOwotICAgICAgICB3YWl0aW5nX2Zvcl9rZXlmcmFtZV8gPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBTb3VyY2VCdWZmZXJSYW5nZTo6U2VlayhiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wKSB7Ci0gIERDSEVDSyhDYW5TZWVrVG8odGltZXN0YW1wKSk7Ci0gIERDSEVDSygha2V5ZnJhbWVfbWFwXy5lbXB0eSgpKTsKLQotICBuZXh0X2tleWZyYW1lX3RpbWVzdGFtcF8gPSBrTm9UaW1lc3RhbXAoKTsKLSAgd2FpdGluZ19mb3Jfa2V5ZnJhbWVfID0gZmFsc2U7Ci0KLSAgS2V5ZnJhbWVNYXA6Oml0ZXJhdG9yIHJlc3VsdCA9IEdldEZpcnN0S2V5ZnJhbWVCZWZvcmUodGltZXN0YW1wKTsKLSAgbmV4dF9idWZmZXJfaW5kZXhfID0gcmVzdWx0LT5zZWNvbmQgLSBrZXlmcmFtZV9tYXBfaW5kZXhfYmFzZV87Ci0gIERDSEVDS19MVChuZXh0X2J1ZmZlcl9pbmRleF8sIHN0YXRpY19jYXN0PGludD4oYnVmZmVyc18uc2l6ZSgpKSk7Ci19Ci0KLXZvaWQgU291cmNlQnVmZmVyUmFuZ2U6OlNlZWtBaGVhZFRvKGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXApIHsKLSAgU2Vla0FoZWFkKHRpbWVzdGFtcCwgZmFsc2UpOwotfQotCi12b2lkIFNvdXJjZUJ1ZmZlclJhbmdlOjpTZWVrQWhlYWRQYXN0KGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXApIHsKLSAgU2Vla0FoZWFkKHRpbWVzdGFtcCwgdHJ1ZSk7Ci19Ci0KLXZvaWQgU291cmNlQnVmZmVyUmFuZ2U6OlNlZWtBaGVhZChiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2tpcF9naXZlbl90aW1lc3RhbXApIHsKLSAgRENIRUNLKCFrZXlmcmFtZV9tYXBfLmVtcHR5KCkpOwotCi0gIEtleWZyYW1lTWFwOjppdGVyYXRvciByZXN1bHQgPQotICAgICAgR2V0Rmlyc3RLZXlmcmFtZUF0KHRpbWVzdGFtcCwgc2tpcF9naXZlbl90aW1lc3RhbXApOwotCi0gIC8vIElmIHRoZXJlIGlzbid0IGEga2V5ZnJhbWUgYWZ0ZXIgfHRpbWVzdGFtcHwsIHRoZW4gc2VlayB0byBlbmQgYW5kIHJldHVybgotICAvLyBrTm9UaW1lc3RhbXAgdG8gc2lnbmFsIHN1Y2guCi0gIGlmIChyZXN1bHQgPT0ga2V5ZnJhbWVfbWFwXy5lbmQoKSkgewotICAgIHdhaXRpbmdfZm9yX2tleWZyYW1lXyA9IHRydWU7Ci0gICAgbmV4dF9idWZmZXJfaW5kZXhfID0gLTE7Ci0gICAgbmV4dF9rZXlmcmFtZV90aW1lc3RhbXBfID0gdGltZXN0YW1wOwotICAgIHJldHVybjsKLSAgfQotICBuZXh0X2J1ZmZlcl9pbmRleF8gPSByZXN1bHQtPnNlY29uZCAtIGtleWZyYW1lX21hcF9pbmRleF9iYXNlXzsKLSAgRENIRUNLX0xUKG5leHRfYnVmZmVyX2luZGV4Xywgc3RhdGljX2Nhc3Q8aW50PihidWZmZXJzXy5zaXplKCkpKTsKLX0KLQotdm9pZCBTb3VyY2VCdWZmZXJSYW5nZTo6U2Vla1RvU3RhcnQoKSB7Ci0gIERDSEVDSyghYnVmZmVyc18uZW1wdHkoKSk7Ci0gIG5leHRfYnVmZmVyX2luZGV4XyA9IDA7Ci19Ci0KLVNvdXJjZUJ1ZmZlclJhbmdlKiBTb3VyY2VCdWZmZXJSYW5nZTo6U3BsaXRSYW5nZSgKLSAgICBiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wLCBib29sIGlzX2V4Y2x1c2l2ZSkgewotICAvLyBGaW5kIHRoZSBmaXJzdCBrZXlmcmFtZSBhZnRlciB8dGltZXN0YW1wfC4gSWYgfGlzX2V4Y2x1c2l2ZXwsIGRvIG5vdAotICAvLyBpbmNsdWRlIGtleWZyYW1lcyBhdCB8dGltZXN0YW1wfC4KLSAgS2V5ZnJhbWVNYXA6Oml0ZXJhdG9yIG5ld19iZWdpbm5pbmdfa2V5ZnJhbWUgPQotICAgICAgR2V0Rmlyc3RLZXlmcmFtZUF0KHRpbWVzdGFtcCwgaXNfZXhjbHVzaXZlKTsKLQotICAvLyBJZiB0aGVyZSBpcyBubyBrZXlmcmFtZSBhZnRlciB8dGltZXN0YW1wfCwgd2UgY2FuJ3Qgc3BsaXQgdGhlIHJhbmdlLgotICBpZiAobmV3X2JlZ2lubmluZ19rZXlmcmFtZSA9PSBrZXlmcmFtZV9tYXBfLmVuZCgpKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8vIFJlbW92ZSB0aGUgZGF0YSBiZWdpbm5pbmcgYXQgfGtleWZyYW1lX2luZGV4fCBmcm9tIHxidWZmZXJzX3wgYW5kIHNhdmUgaXQKLSAgLy8gaW50byB8cmVtb3ZlZF9idWZmZXJzfC4KLSAgaW50IGtleWZyYW1lX2luZGV4ID0KLSAgICAgIG5ld19iZWdpbm5pbmdfa2V5ZnJhbWUtPnNlY29uZCAtIGtleWZyYW1lX21hcF9pbmRleF9iYXNlXzsKLSAgRENIRUNLX0xUKGtleWZyYW1lX2luZGV4LCBzdGF0aWNfY2FzdDxpbnQ+KGJ1ZmZlcnNfLnNpemUoKSkpOwotICBCdWZmZXJRdWV1ZTo6aXRlcmF0b3Igc3RhcnRpbmdfcG9pbnQgPSBidWZmZXJzXy5iZWdpbigpICsga2V5ZnJhbWVfaW5kZXg7Ci0gIEJ1ZmZlclF1ZXVlIHJlbW92ZWRfYnVmZmVycyhzdGFydGluZ19wb2ludCwgYnVmZmVyc18uZW5kKCkpOwotICBrZXlmcmFtZV9tYXBfLmVyYXNlKG5ld19iZWdpbm5pbmdfa2V5ZnJhbWUsIGtleWZyYW1lX21hcF8uZW5kKCkpOwotICBGcmVlQnVmZmVyUmFuZ2Uoc3RhcnRpbmdfcG9pbnQsIGJ1ZmZlcnNfLmVuZCgpKTsKLQotICAvLyBDcmVhdGUgYSBuZXcgcmFuZ2Ugd2l0aCB8cmVtb3ZlZF9idWZmZXJzfC4KLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0gIFNvdXJjZUJ1ZmZlclJhbmdlKiBzcGxpdF9yYW5nZSA9Ci0gICAgICBuZXcgU291cmNlQnVmZmVyUmFuZ2UoCi0gICAgICAgICAgcmVtb3ZlZF9idWZmZXJzLCBrTm9UaW1lc3RhbXAoKSwgaW50ZXJidWZmZXJfZGlzdGFuY2VfY2JfKTsKLSNlbHNlCi0gIFNvdXJjZUJ1ZmZlclJhbmdlKiBzcGxpdF9yYW5nZSA9Ci0gICAgICBuZXcgU291cmNlQnVmZmVyUmFuZ2UoCi0gICAgICAgICAgcmVtb3ZlZF9idWZmZXJzLCBrTm9UaW1lc3RhbXAoKSwgaW50ZXJidWZmZXJfZGlzdGFuY2VfY2JfKTsKLSNlbmRpZgotCi0gIC8vIElmIHRoZSBuZXh0IGJ1ZmZlciBwb3NpdGlvbiBpcyBub3cgaW4gfHNwbGl0X3JhbmdlfCwgdXBkYXRlIHRoZSBzdGF0ZSBvZgotICAvLyB0aGlzIHJhbmdlIGFuZCB8c3BsaXRfcmFuZ2V8IGFjY29yZGluZ2x5LgotICBpZiAobmV4dF9idWZmZXJfaW5kZXhfID49IHN0YXRpY19jYXN0PGludD4oYnVmZmVyc18uc2l6ZSgpKSkgewotICAgIERDSEVDSyghd2FpdGluZ19mb3Jfa2V5ZnJhbWVfKTsKLSAgICBzcGxpdF9yYW5nZS0+bmV4dF9idWZmZXJfaW5kZXhfID0gbmV4dF9idWZmZXJfaW5kZXhfIC0ga2V5ZnJhbWVfaW5kZXg7Ci0gICAgUmVzZXROZXh0QnVmZmVyUG9zaXRpb24oKTsKLSAgfSBlbHNlIGlmICh3YWl0aW5nX2Zvcl9rZXlmcmFtZV8pIHsKLSAgICBzcGxpdF9yYW5nZS0+d2FpdGluZ19mb3Jfa2V5ZnJhbWVfID0gdHJ1ZTsKLSAgICBzcGxpdF9yYW5nZS0+bmV4dF9rZXlmcmFtZV90aW1lc3RhbXBfID0gbmV4dF9rZXlmcmFtZV90aW1lc3RhbXBfOwotICAgIFJlc2V0TmV4dEJ1ZmZlclBvc2l0aW9uKCk7Ci0gIH0KLQotICByZXR1cm4gc3BsaXRfcmFuZ2U7Ci19Ci0KLVNvdXJjZUJ1ZmZlclJhbmdlOjpCdWZmZXJRdWV1ZTo6aXRlcmF0b3IgU291cmNlQnVmZmVyUmFuZ2U6OkdldEJ1ZmZlckl0ckF0KAotICAgIGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXAsIGJvb2wgc2tpcF9naXZlbl90aW1lc3RhbXApIHsKLSAgLy8gTmVlZCB0byBtYWtlIGEgZHVtbXkgYnVmZmVyIHdpdGggdGltZXN0YW1wIHx0aW1lc3RhbXB8IGluIG9yZGVyIHRvIHNlYXJjaAotICAvLyB0aGUgfGJ1ZmZlcnNffCBjb250YWluZXIuCi0gIHNjb3BlZF9yZWZwdHI8U3RyZWFtUGFyc2VyQnVmZmVyPiBkdW1teV9idWZmZXIgPQotICAgICAgU3RyZWFtUGFyc2VyQnVmZmVyOjpDb3B5RnJvbShOVUxMLCAwLCBmYWxzZSk7Ci0gIGR1bW15X2J1ZmZlci0+U2V0RGVjb2RlVGltZXN0YW1wKHRpbWVzdGFtcCk7Ci0KLSAgaWYgKHNraXBfZ2l2ZW5fdGltZXN0YW1wKSB7Ci0gICAgcmV0dXJuIHN0ZDo6dXBwZXJfYm91bmQoCi0gICAgICAgIGJ1ZmZlcnNfLmJlZ2luKCksIGJ1ZmZlcnNfLmVuZCgpLCBkdW1teV9idWZmZXIsIEJ1ZmZlckNvbXBhcmF0b3IpOwotICB9Ci0gIHJldHVybiBzdGQ6Omxvd2VyX2JvdW5kKAotICAgICAgYnVmZmVyc18uYmVnaW4oKSwgYnVmZmVyc18uZW5kKCksIGR1bW15X2J1ZmZlciwgQnVmZmVyQ29tcGFyYXRvcik7Ci19Ci0KLVNvdXJjZUJ1ZmZlclJhbmdlOjpLZXlmcmFtZU1hcDo6aXRlcmF0b3IKLVNvdXJjZUJ1ZmZlclJhbmdlOjpHZXRGaXJzdEtleWZyYW1lQXQoYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBza2lwX2dpdmVuX3RpbWVzdGFtcCkgewotICByZXR1cm4gc2tpcF9naXZlbl90aW1lc3RhbXAgPwotICAgICAga2V5ZnJhbWVfbWFwXy51cHBlcl9ib3VuZCh0aW1lc3RhbXApIDoKLSAgICAgIGtleWZyYW1lX21hcF8ubG93ZXJfYm91bmQodGltZXN0YW1wKTsKLX0KLQotU291cmNlQnVmZmVyUmFuZ2U6OktleWZyYW1lTWFwOjppdGVyYXRvcgotU291cmNlQnVmZmVyUmFuZ2U6OkdldEZpcnN0S2V5ZnJhbWVCZWZvcmUoYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCkgewotICBLZXlmcmFtZU1hcDo6aXRlcmF0b3IgcmVzdWx0ID0ga2V5ZnJhbWVfbWFwXy5sb3dlcl9ib3VuZCh0aW1lc3RhbXApOwotICAvLyBsb3dlcl9ib3VuZCgpIHJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgPj0gfHRpbWVzdGFtcHwsIHNvIHdlIHdhbnQgdGhlCi0gIC8vIHByZXZpb3VzIGVsZW1lbnQgaWYgaXQgZGlkIG5vdCByZXR1cm4gdGhlIGVsZW1lbnQgZXhhY3RseSBlcXVhbCB0bwotICAvLyB8dGltZXN0YW1wfC4KLSAgaWYgKHJlc3VsdCAhPSBrZXlmcmFtZV9tYXBfLmJlZ2luKCkgJiYKLSAgICAgIChyZXN1bHQgPT0ga2V5ZnJhbWVfbWFwXy5lbmQoKSB8fCByZXN1bHQtPmZpcnN0ICE9IHRpbWVzdGFtcCkpIHsKLSAgICAtLXJlc3VsdDsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1ib29sIFNvdXJjZUJ1ZmZlclJhbmdlOjpEZWxldGVBbGwoQnVmZmVyUXVldWUqIHJlbW92ZWRfYnVmZmVycykgewotICByZXR1cm4gVHJ1bmNhdGVBdChidWZmZXJzXy5iZWdpbigpLCByZW1vdmVkX2J1ZmZlcnMpOwotfQotCi1ib29sIFNvdXJjZUJ1ZmZlclJhbmdlOjpUcnVuY2F0ZUF0KAotICAgIGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXAsIEJ1ZmZlclF1ZXVlKiByZW1vdmVkX2J1ZmZlcnMsCi0gICAgYm9vbCBpc19leGNsdXNpdmUpIHsKLSAgLy8gRmluZCB0aGUgcGxhY2UgaW4gfGJ1ZmZlcnNffCB3aGVyZSB3ZSB3aWxsIGJlZ2luIGRlbGV0aW5nIGRhdGEuCi0gIEJ1ZmZlclF1ZXVlOjppdGVyYXRvciBzdGFydGluZ19wb2ludCA9Ci0gICAgICBHZXRCdWZmZXJJdHJBdCh0aW1lc3RhbXAsIGlzX2V4Y2x1c2l2ZSk7Ci0gIHJldHVybiBUcnVuY2F0ZUF0KHN0YXJ0aW5nX3BvaW50LCByZW1vdmVkX2J1ZmZlcnMpOwotfQotCi1pbnQgU291cmNlQnVmZmVyUmFuZ2U6OkRlbGV0ZUdPUEZyb21Gcm9udChCdWZmZXJRdWV1ZSogZGVsZXRlZF9idWZmZXJzKSB7Ci0gIERDSEVDSyghRmlyc3RHT1BDb250YWluc05leHRCdWZmZXJQb3NpdGlvbigpKTsKLSAgRENIRUNLKGRlbGV0ZWRfYnVmZmVycyk7Ci0KLSAgaW50IGJ1ZmZlcnNfZGVsZXRlZCA9IDA7Ci0gIGludCB0b3RhbF9ieXRlc19kZWxldGVkID0gMDsKLQotICBLZXlmcmFtZU1hcDo6aXRlcmF0b3IgZnJvbnQgPSBrZXlmcmFtZV9tYXBfLmJlZ2luKCk7Ci0gIERDSEVDSyhmcm9udCAhPSBrZXlmcmFtZV9tYXBfLmVuZCgpKTsKLQotICAvLyBEZWxldGUgdGhlIGtleWZyYW1lIGF0IHRoZSBzdGFydCBvZiB8a2V5ZnJhbWVfbWFwX3wuCi0gIGtleWZyYW1lX21hcF8uZXJhc2UoZnJvbnQpOwotCi0gIC8vIE5vdyB3ZSBuZWVkIHRvIGRlbGV0ZSBhbGwgdGhlIGJ1ZmZlcnMgdGhhdCBkZXBlbmQgb24gdGhlIGtleWZyYW1lIHdlJ3ZlCi0gIC8vIGp1c3QgZGVsZXRlZC4KLSAgaW50IGVuZF9pbmRleCA9IGtleWZyYW1lX21hcF8uc2l6ZSgpID4gMCA/Ci0gICAgICBrZXlmcmFtZV9tYXBfLmJlZ2luKCktPnNlY29uZCAtIGtleWZyYW1lX21hcF9pbmRleF9iYXNlXyA6Ci0gICAgICBidWZmZXJzXy5zaXplKCk7Ci0KLSAgLy8gRGVsZXRlIGJ1ZmZlcnMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXJlZCByYW5nZSB1cCB1bnRpbCAoYnV0IG5vdAotICAvLyBpbmNsdWRpbmcpIHRoZSBuZXh0IGtleWZyYW1lLgotICBmb3IgKGludCBpID0gMDsgaSA8IGVuZF9pbmRleDsgaSsrKSB7Ci0gICAgaW50IGJ5dGVzX2RlbGV0ZWQgPSBidWZmZXJzXy5mcm9udCgpLT5HZXREYXRhU2l6ZSgpOwotICAgIHNpemVfaW5fYnl0ZXNfIC09IGJ5dGVzX2RlbGV0ZWQ7Ci0gICAgdG90YWxfYnl0ZXNfZGVsZXRlZCArPSBieXRlc19kZWxldGVkOwotICAgIGRlbGV0ZWRfYnVmZmVycy0+cHVzaF9iYWNrKGJ1ZmZlcnNfLmZyb250KCkpOwotICAgIGJ1ZmZlcnNfLnBvcF9mcm9udCgpOwotICAgICsrYnVmZmVyc19kZWxldGVkOwotICB9Ci0KLSAgLy8gVXBkYXRlIHxrZXlmcmFtZV9tYXBfaW5kZXhfYmFzZV98IHRvIGFjY291bnQgZm9yIHRoZSBkZWxldGVkIGJ1ZmZlcnMuCi0gIGtleWZyYW1lX21hcF9pbmRleF9iYXNlXyArPSBidWZmZXJzX2RlbGV0ZWQ7Ci0KLSAgaWYgKG5leHRfYnVmZmVyX2luZGV4XyA+IC0xKSB7Ci0gICAgbmV4dF9idWZmZXJfaW5kZXhfIC09IGJ1ZmZlcnNfZGVsZXRlZDsKLSAgICBEQ0hFQ0tfR0UobmV4dF9idWZmZXJfaW5kZXhfLCAwKTsKLSAgfQotCi0gIC8vIEludmFsaWRhdGUgbWVkaWEgc2VnbWVudCBzdGFydCB0aW1lIGlmIHdlJ3ZlIGRlbGV0ZWQgdGhlIGZpcnN0IGJ1ZmZlciBvZgotICAvLyB0aGUgcmFuZ2UuCi0gIGlmIChidWZmZXJzX2RlbGV0ZWQgPiAwKQotICAgIG1lZGlhX3NlZ21lbnRfc3RhcnRfdGltZV8gPSBrTm9UaW1lc3RhbXAoKTsKLQotICByZXR1cm4gdG90YWxfYnl0ZXNfZGVsZXRlZDsKLX0KLQotaW50IFNvdXJjZUJ1ZmZlclJhbmdlOjpEZWxldGVHT1BGcm9tQmFjayhCdWZmZXJRdWV1ZSogZGVsZXRlZF9idWZmZXJzKSB7Ci0gIERDSEVDSyghTGFzdEdPUENvbnRhaW5zTmV4dEJ1ZmZlclBvc2l0aW9uKCkpOwotICBEQ0hFQ0soZGVsZXRlZF9idWZmZXJzKTsKLQotICAvLyBSZW1vdmUgdGhlIGxhc3QgR09QJ3Mga2V5ZnJhbWUgZnJvbSB0aGUgfGtleWZyYW1lX21hcF98LgotICBLZXlmcmFtZU1hcDo6aXRlcmF0b3IgYmFjayA9IGtleWZyYW1lX21hcF8uZW5kKCk7Ci0gIERDSEVDS19HVChrZXlmcmFtZV9tYXBfLnNpemUoKSwgMHUpOwotICAtLWJhY2s7Ci0KLSAgLy8gVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBidWZmZXIgaW4gdGhlIGxhc3QgR09QIGlzIGVxdWFsIHRvIHRoZSBuZXcgc2l6ZSBvZgotICAvLyB8YnVmZmVyc198IGFmdGVyIHRoYXQgR09QIGlzIGRlbGV0ZWQuCi0gIHNpemVfdCBnb2FsX3NpemUgPSBiYWNrLT5zZWNvbmQgLSBrZXlmcmFtZV9tYXBfaW5kZXhfYmFzZV87Ci0gIGtleWZyYW1lX21hcF8uZXJhc2UoYmFjayk7Ci0KLSAgaW50IHRvdGFsX2J5dGVzX2RlbGV0ZWQgPSAwOwotICB3aGlsZSAoYnVmZmVyc18uc2l6ZSgpICE9IGdvYWxfc2l6ZSkgewotICAgIGludCBieXRlc19kZWxldGVkID0gYnVmZmVyc18uYmFjaygpLT5HZXREYXRhU2l6ZSgpOwotICAgIHNpemVfaW5fYnl0ZXNfIC09IGJ5dGVzX2RlbGV0ZWQ7Ci0gICAgdG90YWxfYnl0ZXNfZGVsZXRlZCArPSBieXRlc19kZWxldGVkOwotICAgIC8vIFdlJ3JlIHJlbW92aW5nIGJ1ZmZlcnMgZnJvbSB0aGUgYmFjaywgc28gcHVzaCBlYWNoIHJlbW92ZWQgYnVmZmVyIHRvIHRoZQotICAgIC8vIGZyb250IG9mIHxkZWxldGVkX2J1ZmZlcnN8IHNvIHRoYXQgfGRlbGV0ZWRfYnVmZmVyc3wgYXJlIGluIG5vbmRlY3JlYXNpbmcKLSAgICAvLyBvcmRlci4KLSAgICBkZWxldGVkX2J1ZmZlcnMtPnB1c2hfZnJvbnQoYnVmZmVyc18uYmFjaygpKTsKLSAgICBidWZmZXJzXy5wb3BfYmFjaygpOwotICB9Ci0KLSAgcmV0dXJuIHRvdGFsX2J5dGVzX2RlbGV0ZWQ7Ci19Ci0KLWJvb2wgU291cmNlQnVmZmVyUmFuZ2U6OkZpcnN0R09QQ29udGFpbnNOZXh0QnVmZmVyUG9zaXRpb24oKSBjb25zdCB7Ci0gIGlmICghSGFzTmV4dEJ1ZmZlclBvc2l0aW9uKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8vIElmIHRoZXJlIGlzIG9ubHkgb25lIEdPUCwgaXQgbXVzdCBjb250YWluIHRoZSBuZXh0IGJ1ZmZlciBwb3NpdGlvbi4KLSAgaWYgKGtleWZyYW1lX21hcF8uc2l6ZSgpID09IDF1KQotICAgIHJldHVybiB0cnVlOwotCi0gIEtleWZyYW1lTWFwOjpjb25zdF9pdGVyYXRvciBzZWNvbmRfZ29wID0ga2V5ZnJhbWVfbWFwXy5iZWdpbigpOwotICArK3NlY29uZF9nb3A7Ci0gIHJldHVybiAhd2FpdGluZ19mb3Jfa2V5ZnJhbWVfICYmCi0gICAgICBuZXh0X2J1ZmZlcl9pbmRleF8gPCBzZWNvbmRfZ29wLT5zZWNvbmQgLSBrZXlmcmFtZV9tYXBfaW5kZXhfYmFzZV87Ci19Ci0KLWJvb2wgU291cmNlQnVmZmVyUmFuZ2U6Okxhc3RHT1BDb250YWluc05leHRCdWZmZXJQb3NpdGlvbigpIGNvbnN0IHsKLSAgaWYgKCFIYXNOZXh0QnVmZmVyUG9zaXRpb24oKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gSWYgdGhlcmUgaXMgb25seSBvbmUgR09QLCBpdCBtdXN0IGNvbnRhaW4gdGhlIG5leHQgYnVmZmVyIHBvc2l0aW9uLgotICBpZiAoa2V5ZnJhbWVfbWFwXy5zaXplKCkgPT0gMXUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgS2V5ZnJhbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGxhc3RfZ29wID0ga2V5ZnJhbWVfbWFwXy5lbmQoKTsKLSAgLS1sYXN0X2dvcDsKLSAgcmV0dXJuIHdhaXRpbmdfZm9yX2tleWZyYW1lXyB8fAotICAgICAgbGFzdF9nb3AtPnNlY29uZCAtIGtleWZyYW1lX21hcF9pbmRleF9iYXNlXyA8PSBuZXh0X2J1ZmZlcl9pbmRleF87Ci19Ci0KLXZvaWQgU291cmNlQnVmZmVyUmFuZ2U6OkZyZWVCdWZmZXJSYW5nZSgKLSAgICBjb25zdCBCdWZmZXJRdWV1ZTo6aXRlcmF0b3ImIHN0YXJ0aW5nX3BvaW50LAotICAgIGNvbnN0IEJ1ZmZlclF1ZXVlOjppdGVyYXRvciYgZW5kaW5nX3BvaW50KSB7Ci0gIGZvciAoQnVmZmVyUXVldWU6Oml0ZXJhdG9yIGl0ciA9IHN0YXJ0aW5nX3BvaW50OwotICAgICAgIGl0ciAhPSBlbmRpbmdfcG9pbnQ7ICsraXRyKSB7Ci0gICAgc2l6ZV9pbl9ieXRlc18gLT0gKCppdHIpLT5HZXREYXRhU2l6ZSgpOwotICAgIERDSEVDS19HRShzaXplX2luX2J5dGVzXywgMCk7Ci0gIH0KLSAgYnVmZmVyc18uZXJhc2Uoc3RhcnRpbmdfcG9pbnQsIGVuZGluZ19wb2ludCk7Ci19Ci0KLWJvb2wgU291cmNlQnVmZmVyUmFuZ2U6OlRydW5jYXRlQXQoCi0gICAgY29uc3QgQnVmZmVyUXVldWU6Oml0ZXJhdG9yJiBzdGFydGluZ19wb2ludCwgQnVmZmVyUXVldWUqIHJlbW92ZWRfYnVmZmVycykgewotICBEQ0hFQ0soIXJlbW92ZWRfYnVmZmVycyB8fCByZW1vdmVkX2J1ZmZlcnMtPmVtcHR5KCkpOwotCi0gIC8vIFJldHVybiBpZiB3ZSdyZSBub3QgZGVsZXRpbmcgYW55dGhpbmcuCi0gIGlmIChzdGFydGluZ19wb2ludCA9PSBidWZmZXJzXy5lbmQoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gUmVzZXQgdGhlIG5leHQgYnVmZmVyIGluZGV4IGlmIHdlIHdpbGwgYmUgZGVsZXRpbmcgdGhlIGJ1ZmZlciB0aGF0J3MgbmV4dAotICAvLyBpbiBzZXF1ZW5jZS4KLSAgYm9vbCByZW1vdmVkX25leHRfYnVmZmVyID0gZmFsc2U7Ci0gIGlmIChIYXNOZXh0QnVmZmVyUG9zaXRpb24oKSkgewotICAgIGJhc2U6OlRpbWVEZWx0YSBuZXh0X2J1ZmZlcl90aW1lc3RhbXAgPSBHZXROZXh0VGltZXN0YW1wKCk7Ci0gICAgaWYgKG5leHRfYnVmZmVyX3RpbWVzdGFtcCA9PSBrTm9UaW1lc3RhbXAoKSB8fAotICAgICAgICBuZXh0X2J1ZmZlcl90aW1lc3RhbXAgPj0gKCpzdGFydGluZ19wb2ludCktPkdldERlY29kZVRpbWVzdGFtcCgpKSB7Ci0gICAgICBpZiAoSGFzTmV4dEJ1ZmZlcigpICYmIHJlbW92ZWRfYnVmZmVycykgewotICAgICAgICBpbnQgc3RhcnRpbmdfb2Zmc2V0ID0gc3RhcnRpbmdfcG9pbnQgLSBidWZmZXJzXy5iZWdpbigpOwotICAgICAgICBpbnQgbmV4dF9idWZmZXJfb2Zmc2V0ID0gbmV4dF9idWZmZXJfaW5kZXhfIC0gc3RhcnRpbmdfb2Zmc2V0OwotICAgICAgICBEQ0hFQ0tfR0UobmV4dF9idWZmZXJfb2Zmc2V0LCAwKTsKLSAgICAgICAgQnVmZmVyUXVldWUgc2F2ZWQoc3RhcnRpbmdfcG9pbnQgKyBuZXh0X2J1ZmZlcl9vZmZzZXQsIGJ1ZmZlcnNfLmVuZCgpKTsKLSAgICAgICAgcmVtb3ZlZF9idWZmZXJzLT5zd2FwKHNhdmVkKTsKLSAgICAgIH0KLSAgICAgIFJlc2V0TmV4dEJ1ZmZlclBvc2l0aW9uKCk7Ci0gICAgICByZW1vdmVkX25leHRfYnVmZmVyID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICAvLyBSZW1vdmUga2V5ZnJhbWVzIGZyb20gfHN0YXJ0aW5nX3BvaW50fCBvbndhcmQuCi0gIEtleWZyYW1lTWFwOjppdGVyYXRvciBzdGFydGluZ19wb2ludF9rZXlmcmFtZSA9Ci0gICAgICBrZXlmcmFtZV9tYXBfLmxvd2VyX2JvdW5kKCgqc3RhcnRpbmdfcG9pbnQpLT5HZXREZWNvZGVUaW1lc3RhbXAoKSk7Ci0gIGtleWZyYW1lX21hcF8uZXJhc2Uoc3RhcnRpbmdfcG9pbnRfa2V5ZnJhbWUsIGtleWZyYW1lX21hcF8uZW5kKCkpOwotCi0gIC8vIFJlbW92ZSBldmVyeXRoaW5nIGZyb20gfHN0YXJ0aW5nX3BvaW50fCBvbndhcmQuCi0gIEZyZWVCdWZmZXJSYW5nZShzdGFydGluZ19wb2ludCwgYnVmZmVyc18uZW5kKCkpOwotICByZXR1cm4gcmVtb3ZlZF9uZXh0X2J1ZmZlcjsKLX0KLQotYm9vbCBTb3VyY2VCdWZmZXJSYW5nZTo6R2V0TmV4dEJ1ZmZlcigKLSAgICBzY29wZWRfcmVmcHRyPFN0cmVhbVBhcnNlckJ1ZmZlcj4qIG91dF9idWZmZXIpIHsKLSAgaWYgKCFIYXNOZXh0QnVmZmVyKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gICpvdXRfYnVmZmVyID0gYnVmZmVyc18uYXQobmV4dF9idWZmZXJfaW5kZXhfKTsKLSAgbmV4dF9idWZmZXJfaW5kZXhfKys7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFNvdXJjZUJ1ZmZlclJhbmdlOjpIYXNOZXh0QnVmZmVyKCkgY29uc3QgewotICByZXR1cm4gbmV4dF9idWZmZXJfaW5kZXhfID49IDAgJiYKLSAgICAgIG5leHRfYnVmZmVyX2luZGV4XyA8IHN0YXRpY19jYXN0PGludD4oYnVmZmVyc18uc2l6ZSgpKSAmJgotICAgICAgIXdhaXRpbmdfZm9yX2tleWZyYW1lXzsKLX0KLQotaW50IFNvdXJjZUJ1ZmZlclJhbmdlOjpHZXROZXh0Q29uZmlnSWQoKSBjb25zdCB7Ci0gIERDSEVDSyhIYXNOZXh0QnVmZmVyKCkpOwotICByZXR1cm4gYnVmZmVyc18uYXQobmV4dF9idWZmZXJfaW5kZXhfKS0+R2V0Q29uZmlnSWQoKTsKLX0KLQotCi1iYXNlOjpUaW1lRGVsdGEgU291cmNlQnVmZmVyUmFuZ2U6OkdldE5leHRUaW1lc3RhbXAoKSBjb25zdCB7Ci0gIERDSEVDSyghYnVmZmVyc18uZW1wdHkoKSk7Ci0gIERDSEVDSyhIYXNOZXh0QnVmZmVyUG9zaXRpb24oKSk7Ci0KLSAgaWYgKHdhaXRpbmdfZm9yX2tleWZyYW1lXyB8fAotICAgICAgbmV4dF9idWZmZXJfaW5kZXhfID49IHN0YXRpY19jYXN0PGludD4oYnVmZmVyc18uc2l6ZSgpKSkgewotICAgIHJldHVybiBrTm9UaW1lc3RhbXAoKTsKLSAgfQotCi0gIHJldHVybiBidWZmZXJzXy5hdChuZXh0X2J1ZmZlcl9pbmRleF8pLT5HZXREZWNvZGVUaW1lc3RhbXAoKTsKLX0KLQotYm9vbCBTb3VyY2VCdWZmZXJSYW5nZTo6SGFzTmV4dEJ1ZmZlclBvc2l0aW9uKCkgY29uc3QgewotICByZXR1cm4gbmV4dF9idWZmZXJfaW5kZXhfID49IDAgfHwgd2FpdGluZ19mb3Jfa2V5ZnJhbWVfOwotfQotCi12b2lkIFNvdXJjZUJ1ZmZlclJhbmdlOjpSZXNldE5leHRCdWZmZXJQb3NpdGlvbigpIHsKLSAgbmV4dF9idWZmZXJfaW5kZXhfID0gLTE7Ci0gIHdhaXRpbmdfZm9yX2tleWZyYW1lXyA9IGZhbHNlOwotICBuZXh0X2tleWZyYW1lX3RpbWVzdGFtcF8gPSBrTm9UaW1lc3RhbXAoKTsKLX0KLQotdm9pZCBTb3VyY2VCdWZmZXJSYW5nZTo6QXBwZW5kUmFuZ2VUb0VuZChjb25zdCBTb3VyY2VCdWZmZXJSYW5nZSYgcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdHJhbnNmZXJfY3VycmVudF9wb3NpdGlvbikgewotICBEQ0hFQ0soQ2FuQXBwZW5kUmFuZ2VUb0VuZChyYW5nZSkpOwotICBEQ0hFQ0soIWJ1ZmZlcnNfLmVtcHR5KCkpOwotCi0gIGlmICh0cmFuc2Zlcl9jdXJyZW50X3Bvc2l0aW9uKQotICAgIG5leHRfYnVmZmVyX2luZGV4XyA9IHJhbmdlLm5leHRfYnVmZmVyX2luZGV4XyArIGJ1ZmZlcnNfLnNpemUoKTsKLQotICBBcHBlbmRCdWZmZXJzVG9FbmQocmFuZ2UuYnVmZmVyc18pOwotfQotCi1ib29sIFNvdXJjZUJ1ZmZlclJhbmdlOjpDYW5BcHBlbmRSYW5nZVRvRW5kKAotICAgIGNvbnN0IFNvdXJjZUJ1ZmZlclJhbmdlJiByYW5nZSkgY29uc3QgewotICByZXR1cm4gQ2FuQXBwZW5kQnVmZmVyc1RvRW5kKHJhbmdlLmJ1ZmZlcnNfKTsKLX0KLQotYm9vbCBTb3VyY2VCdWZmZXJSYW5nZTo6Q2FuQXBwZW5kQnVmZmVyc1RvRW5kKAotICAgIGNvbnN0IEJ1ZmZlclF1ZXVlJiBidWZmZXJzKSBjb25zdCB7Ci0gIERDSEVDSyghYnVmZmVyc18uZW1wdHkoKSk7Ci0gIHJldHVybiBJc05leHRJblNlcXVlbmNlKGJ1ZmZlcnNfLmJhY2soKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVycy5mcm9udCgpLT5HZXREZWNvZGVUaW1lc3RhbXAoKSk7Ci19Ci0KLWJvb2wgU291cmNlQnVmZmVyUmFuZ2U6OkJlbG9uZ3NUb1JhbmdlKGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXApIGNvbnN0IHsKLSAgRENIRUNLKCFidWZmZXJzXy5lbXB0eSgpKTsKLQotICByZXR1cm4gKElzTmV4dEluU2VxdWVuY2UoYnVmZmVyc18uYmFjaygpLCB0aW1lc3RhbXApIHx8Ci0gICAgICAgICAgKEdldFN0YXJ0VGltZXN0YW1wKCkgPD0gdGltZXN0YW1wICYmIHRpbWVzdGFtcCA8PSBHZXRFbmRUaW1lc3RhbXAoKSkpOwotfQotCi1ib29sIFNvdXJjZUJ1ZmZlclJhbmdlOjpDYW5TZWVrVG8oYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCkgY29uc3QgewotICBiYXNlOjpUaW1lRGVsdGEgc3RhcnRfdGltZXN0YW1wID0KLSAgICAgIHN0ZDo6bWF4KGJhc2U6OlRpbWVEZWx0YSgpLCBHZXRTdGFydFRpbWVzdGFtcCgpIC0gR2V0RnVkZ2VSb29tKCkpOwotICByZXR1cm4gIWtleWZyYW1lX21hcF8uZW1wdHkoKSAmJiBzdGFydF90aW1lc3RhbXAgPD0gdGltZXN0YW1wICYmCi0gICAgICB0aW1lc3RhbXAgPCBHZXRCdWZmZXJlZEVuZFRpbWVzdGFtcCgpOwotfQotCi1ib29sIFNvdXJjZUJ1ZmZlclJhbmdlOjpDb21wbGV0ZWx5T3ZlcmxhcHMoCi0gICAgY29uc3QgU291cmNlQnVmZmVyUmFuZ2UmIHJhbmdlKSBjb25zdCB7Ci0gIHJldHVybiBHZXRTdGFydFRpbWVzdGFtcCgpIDw9IHJhbmdlLkdldFN0YXJ0VGltZXN0YW1wKCkgJiYKLSAgICAgIEdldEVuZFRpbWVzdGFtcCgpID49IHJhbmdlLkdldEVuZFRpbWVzdGFtcCgpOwotfQotCi1ib29sIFNvdXJjZUJ1ZmZlclJhbmdlOjpFbmRPdmVybGFwcyhjb25zdCBTb3VyY2VCdWZmZXJSYW5nZSYgcmFuZ2UpIGNvbnN0IHsKLSAgcmV0dXJuIHJhbmdlLkdldFN0YXJ0VGltZXN0YW1wKCkgPD0gR2V0RW5kVGltZXN0YW1wKCkgJiYKLSAgICAgIEdldEVuZFRpbWVzdGFtcCgpIDwgcmFuZ2UuR2V0RW5kVGltZXN0YW1wKCk7Ci19Ci0KLWJhc2U6OlRpbWVEZWx0YSBTb3VyY2VCdWZmZXJSYW5nZTo6R2V0U3RhcnRUaW1lc3RhbXAoKSBjb25zdCB7Ci0gIERMT0dfSUYoV0FSTklORywgYnVmZmVyc18uZW1wdHkoKSkgPDwgInxidWZmZXJzX3wgY2Fubm90IGJlIGVtcHR5LiI7Ci0gIGJhc2U6OlRpbWVEZWx0YSBzdGFydF90aW1lc3RhbXAgPSBtZWRpYV9zZWdtZW50X3N0YXJ0X3RpbWVfOwotICBpZiAoc3RhcnRfdGltZXN0YW1wID09IGtOb1RpbWVzdGFtcCgpKQotICAgIHN0YXJ0X3RpbWVzdGFtcCA9IGJ1ZmZlcnNfLmZyb250KCktPkdldERlY29kZVRpbWVzdGFtcCgpOwotICByZXR1cm4gc3RhcnRfdGltZXN0YW1wOwotfQotCi1iYXNlOjpUaW1lRGVsdGEgU291cmNlQnVmZmVyUmFuZ2U6OkdldEVuZFRpbWVzdGFtcCgpIGNvbnN0IHsKLSAgRENIRUNLKCFidWZmZXJzXy5lbXB0eSgpKTsKLSAgcmV0dXJuIGJ1ZmZlcnNfLmJhY2soKS0+R2V0RGVjb2RlVGltZXN0YW1wKCk7Ci19Ci0KLWJhc2U6OlRpbWVEZWx0YSBTb3VyY2VCdWZmZXJSYW5nZTo6R2V0QnVmZmVyZWRFbmRUaW1lc3RhbXAoKSBjb25zdCB7Ci0gIERDSEVDSyghYnVmZmVyc18uZW1wdHkoKSk7Ci0gIGJhc2U6OlRpbWVEZWx0YSBkdXJhdGlvbiA9IGJ1ZmZlcnNfLmJhY2soKS0+R2V0RHVyYXRpb24oKTsKLSAgaWYgKGR1cmF0aW9uID09IGtOb1RpbWVzdGFtcCgpIHx8IGR1cmF0aW9uID09IGJhc2U6OlRpbWVEZWx0YSgpKQotICAgIGR1cmF0aW9uID0gR2V0QXBwcm94aW1hdGVEdXJhdGlvbigpOwotICByZXR1cm4gR2V0RW5kVGltZXN0YW1wKCkgKyBkdXJhdGlvbjsKLX0KLQotYm9vbCBTb3VyY2VCdWZmZXJSYW5nZTo6SXNOZXh0SW5TZXF1ZW5jZSgKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPG1lZGlhOjpTdHJlYW1QYXJzZXJCdWZmZXI+JiBidWZmZXIsCi0gICAgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCkgY29uc3QgewotICByZXR1cm4gYnVmZmVyLT5HZXREZWNvZGVUaW1lc3RhbXAoKSA8IHRpbWVzdGFtcCAmJgotICAgICAgdGltZXN0YW1wIDw9IGJ1ZmZlci0+R2V0RGVjb2RlVGltZXN0YW1wKCkgKyBHZXRGdWRnZVJvb20oKTsKLX0KLQotYmFzZTo6VGltZURlbHRhIFNvdXJjZUJ1ZmZlclJhbmdlOjpHZXRGdWRnZVJvb20oKSBjb25zdCB7Ci0gIHJldHVybiBDb21wdXRlRnVkZ2VSb29tKEdldEFwcHJveGltYXRlRHVyYXRpb24oKSk7Ci19Ci0KLWJhc2U6OlRpbWVEZWx0YSBTb3VyY2VCdWZmZXJSYW5nZTo6R2V0QXBwcm94aW1hdGVEdXJhdGlvbigpIGNvbnN0IHsKLSAgYmFzZTo6VGltZURlbHRhIG1heF9pbnRlcmJ1ZmZlcl9kaXN0YW5jZSA9IGludGVyYnVmZmVyX2Rpc3RhbmNlX2NiXy5SdW4oKTsKLSAgRENIRUNLKG1heF9pbnRlcmJ1ZmZlcl9kaXN0YW5jZSAhPSBrTm9UaW1lc3RhbXAoKSk7Ci0gIHJldHVybiBtYXhfaW50ZXJidWZmZXJfZGlzdGFuY2U7Ci19Ci0KLXZvaWQgTG9nTWVkaWFTb3VyY2VUaW1lUmFuZ2VzKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmFuZ2VzPGJhc2U6OlRpbWVEZWx0YT4mIHRpbWVfcmFuZ2VzKSB7Ci0jaWYgTE9HX01FRElBX1NPVVJDRV9BQ1RJVklUSUVTCi0gIExPRyhJTkZPKSA8PCAoIj09PT09PT09ICIgKyBkZXNjICsgIiA9PT09PT09PSIpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRpbWVfcmFuZ2VzLnNpemUoKTsgKytpKQotICAgIExPRyhJTkZPKSA8PCAiXHRcdFJhbmdlICIgPDwgaSA8PCAiIDogIgotICAgICAgICAgICAgICA8PCB0aW1lX3Jhbmdlcy5zdGFydChpKS5Jbk1pY3Jvc2Vjb25kcygpIDw8ICIgLSAiCi0gICAgICAgICAgICAgIDw8IHRpbWVfcmFuZ2VzLmVuZChpKS5Jbk1pY3Jvc2Vjb25kcygpOwotI2VuZGlmICAvLyBMT0dfTUVESUFfU09VUkNFX0FDVElWSVRJRVMKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9zb3VyY2VfYnVmZmVyX3N0cmVhbS5oIGIvc3JjL21lZGlhL2ZpbHRlcnMvc291cmNlX2J1ZmZlcl9zdHJlYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFiY2I2NS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy9zb3VyY2VfYnVmZmVyX3N0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIFNvdXJjZUJ1ZmZlclN0cmVhbSBpcyBhIGRhdGEgc3RydWN0dXJlIHRoYXQgc3RvcmVzIG1lZGlhIEJ1ZmZlcnMgaW4gcmFuZ2VzLgotLy8gQnVmZmVycyBjYW4gYmUgYXBwZW5kZWQgb3V0IG9mIHByZXNlbnRhdGlvbiBvcmRlci4gQnVmZmVycyBhcmUgcmV0cmlldmVkIGJ5Ci0vLyBzZWVraW5nIHRvIHRoZSBkZXNpcmVkIHN0YXJ0IHBvaW50IGFuZCBjYWxsaW5nIEdldE5leHRCdWZmZXIoKS4gQnVmZmVycyBhcmUKLS8vIHJldHVybmVkIGluIHNlcXVlbnRpYWwgcHJlc2VudGF0aW9uIG9yZGVyLgotCi0jaWZuZGVmIE1FRElBX0ZJTFRFUlNfU09VUkNFX0JVRkZFUl9TVFJFQU1fSF8KLSNkZWZpbmUgTUVESUFfRklMVEVSU19TT1VSQ0VfQlVGRkVSX1NUUkVBTV9IXwotCi0jZGVmaW5lIExPR19NRURJQV9TT1VSQ0VfQUNUSVZJVElFUyAwCi0KLSNpbmNsdWRlIDxkZXF1ZT4KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2xvZy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvcmFuZ2VzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zdHJlYW1fcGFyc2VyX2J1ZmZlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fZGVjb2Rlcl9jb25maWcuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgU291cmNlQnVmZmVyUmFuZ2U7Ci0KLS8vIFNlZSBmaWxlLWxldmVsIGNvbW1lbnQgZm9yIGNvbXBsZXRlIGRlc2NyaXB0aW9uLgotY2xhc3MgTUVESUFfRVhQT1JUIFNvdXJjZUJ1ZmZlclN0cmVhbSB7Ci0gcHVibGljOgotICB0eXBlZGVmIHN0ZDo6ZGVxdWU8c2NvcGVkX3JlZnB0cjxTdHJlYW1QYXJzZXJCdWZmZXI+ID4gQnVmZmVyUXVldWU7Ci0KLSAgLy8gU3RhdHVzIHJldHVybmVkIGJ5IEdldE5leHRCdWZmZXIoKS4KLSAgLy8ga1N1Y2Nlc3M6IEluZGljYXRlcyB0aGF0IHRoZSBuZXh0IGJ1ZmZlciB3YXMgcmV0dXJuZWQuCi0gIC8vIGtOZWVkQnVmZmVyOiBJbmRpY2F0ZXMgdGhhdCB3ZSBuZWVkIG1vcmUgZGF0YSBiZWZvcmUgYSBidWZmZXIgY2FuIGJlCi0gIC8vICAgICAgICAgICAgICByZXR1cm5lZC4KLSAgLy8ga0NvbmZpZ0NoYW5nZTogSW5kaWNhdGVzIHRoYXQgdGhlIG5leHQgYnVmZmVyIHJlcXVpcmVzIGEgY29uZmlnIGNoYW5nZS4KLSAgZW51bSBTdGF0dXMgewotICAgIGtTdWNjZXNzLAotICAgIGtOZWVkQnVmZmVyLAotICAgIGtDb25maWdDaGFuZ2UsCi0gIH07Ci0KLSAgU291cmNlQnVmZmVyU3RyZWFtKGNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYgYXVkaW9fY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9nQ0ImIGxvZ19jYik7Ci0gIFNvdXJjZUJ1ZmZlclN0cmVhbShjb25zdCBWaWRlb0RlY29kZXJDb25maWcmIHZpZGVvX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvZ0NCJiBsb2dfY2IpOwotCi0gIH5Tb3VyY2VCdWZmZXJTdHJlYW0oKTsKLQotICAvLyBTaWduYWxzIHRoYXQgdGhlIG5leHQgYnVmZmVycyBhcHBlbmRlZCBhcmUgcGFydCBvZiBhIG5ldyBtZWRpYSBzZWdtZW50Ci0gIC8vIHN0YXJ0aW5nIGF0IHxtZWRpYV9zZWdtZW50X3N0YXJ0X3RpbWV8LgotICB2b2lkIE9uTmV3TWVkaWFTZWdtZW50KGJhc2U6OlRpbWVEZWx0YSBtZWRpYV9zZWdtZW50X3N0YXJ0X3RpbWUpOwotCi0gIC8vIEFkZCB0aGUgfGJ1ZmZlcnN8IHRvIHRoZSBTb3VyY2VCdWZmZXJTdHJlYW0uIEJ1ZmZlcnMgd2l0aGluIHRoZSBxdWV1ZSBhcmUKLSAgLy8gZXhwZWN0ZWQgdG8gYmUgaW4gb3JkZXIsIGJ1dCBtdWx0aXBsZSBjYWxscyB0byBBcHBlbmQoKSBtYXkgYWRkIGJ1ZmZlcnMgb3V0Ci0gIC8vIG9mIG9yZGVyIG9yIG92ZXJsYXBwaW5nLiBBc3N1bWVzIGFsbCBidWZmZXJzIHdpdGhpbiB8YnVmZmVyc3wgYXJlIGluCi0gIC8vIHByZXNlbnRhdGlvbiBvcmRlciBhbmQgYXJlIG5vbi1vdmVybGFwcGluZy4KLSAgLy8gUmV0dXJucyB0cnVlIGlmIEFwcGVuZCgpIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBpZiB8YnVmZmVyc3wgYXJlIG5vdCBhZGRlZC4KLSAgLy8gVE9ETyh2cmspOiBJbXBsZW1lbnQgZ2FyYmFnZSBjb2xsZWN0aW9uLiAoY3JidWcuY29tLzEyNTA3MCkKLSAgYm9vbCBBcHBlbmQoY29uc3QgQnVmZmVyUXVldWUmIGJ1ZmZlcnMpOwotCi0gIC8vIENoYW5nZXMgdGhlIFNvdXJjZUJ1ZmZlclN0cmVhbSdzIHN0YXRlIHNvIHRoYXQgaXQgd2lsbCBzdGFydCByZXR1cm5pbmcKLSAgLy8gYnVmZmVycyBzdGFydGluZyBmcm9tIHRoZSBjbG9zZXN0IGtleWZyYW1lIGJlZm9yZSB8dGltZXN0YW1wfC4KLSAgdm9pZCBTZWVrKGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXApOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgU291cmNlQnVmZmVyU3RyZWFtIGhhcyBzZWVrZWQgdG8gYSB0aW1lIHdpdGhvdXQKLSAgLy8gYnVmZmVyZWQgZGF0YSBhbmQgaXMgd2FpdGluZyBmb3IgbW9yZSBkYXRhIHRvIGJlIGFwcGVuZGVkLgotICBib29sIElzU2Vla1BlbmRpbmcoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGtleWZyYW1lIGJlZm9yZSB0aGUgc2VlayB0aW1lc3RhbXAuICBOb3RlIHRoYXQKLSAgLy8gdGhpcyB2YWx1ZSBpcyBvbmx5IHZhbGlkICh0aHVzIHRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkKSB3aGVuCi0gIC8vIElzU2Vla1BlbmRpbmcoKSByZXR1cm5zIGZhbHNlLgotICBiYXNlOjpUaW1lRGVsdGEgR2V0U2Vla0tleWZyYW1lVGltZXN0YW1wKCkgY29uc3Q7Ci0KLSAgLy8gTm90aWZpZXMgdGhlIFNvdXJjZUJ1ZmZlclN0cmVhbSB0aGF0IHRoZSBtZWRpYSBkdXJhdGlvbiBoYXMgYmVlbiBjaGFuZ2VkIHRvCi0gIC8vIHxkdXJhdGlvbnwgc28gaXQgc2hvdWxkIGRyb3AgYW55IGRhdGEgcGFzdCB0aGF0IHBvaW50LgotICB2b2lkIE9uU2V0RHVyYXRpb24oYmFzZTo6VGltZURlbHRhIGR1cmF0aW9uKTsKLQotICAvLyBGaWxscyB8b3V0X2J1ZmZlcnwgd2l0aCBhIG5ldyBidWZmZXIuIEJ1ZmZlcnMgYXJlIHByZXNlbnRlZCBpbiBvcmRlciBmcm9tCi0gIC8vIHRoZSBsYXN0IGNhbGwgdG8gU2VlaygpLCBvciBzdGFydGluZyB3aXRoIHRoZSBmaXJzdCBidWZmZXIgYXBwZW5kZWQgaWYKLSAgLy8gU2VlaygpIGhhcyBub3QgYmVlbiBjYWxsZWQgeWV0LgotICAvLyB8b3V0X2J1ZmZlcnwncyB0aW1lc3RhbXAgbWF5IGJlIGVhcmxpZXIgdGhhbiB0aGUgfHRpbWVzdGFtcHwgcGFzc2VkIHRvCi0gIC8vIHRoZSBsYXN0IFNlZWsoKSBjYWxsLgotICAvLyBSZXR1cm5zIGtTdWNjZXNzIGlmIHxvdXRfYnVmZmVyfCBpcyBmaWxsZWQgd2l0aCBhIHZhbGlkIGJ1ZmZlciwga05lZWRCdWZmZXIKLSAgLy8gaWYgdGhlcmUgaXMgbm90IGVub3VnaCBkYXRhIGJ1ZmZlcmVkIHRvIGZ1bGZpbGwgdGhlIHJlcXVlc3QsIGFuZAotICAvLyBrQ29uZmlnQ2hhbmdlIGlmIHRoZSBuZXh0IGJ1ZmZlciByZXF1aXJlcyBhIGNvbmZpZyBjaGFuZ2UuCi0gIFN0YXR1cyBHZXROZXh0QnVmZmVyKHNjb3BlZF9yZWZwdHI8U3RyZWFtUGFyc2VyQnVmZmVyPiogb3V0X2J1ZmZlcik7Ci0KLSAgLy8gUmV0dXJucyBhIGxpc3Qgb2YgdGhlIGJ1ZmZlcmVkIHRpbWUgcmFuZ2VzLgotICBSYW5nZXM8YmFzZTo6VGltZURlbHRhPiBHZXRCdWZmZXJlZFRpbWUoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgcmFuZ2VzIG9yIHRoZSBsYXN0IHJhbmdlIGlzIHNlbGVjdGVkLgotICBib29sIElzRW5kU2VsZWN0ZWQoKSBjb25zdDsKLQotICBjb25zdCBBdWRpb0RlY29kZXJDb25maWcmIEdldEN1cnJlbnRBdWRpb0RlY29kZXJDb25maWcoKTsKLSAgY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiBHZXRDdXJyZW50VmlkZW9EZWNvZGVyQ29uZmlnKCk7Ci0KLSAgLy8gTm90aWZpZXMgdGhpcyBvYmplY3QgdGhhdCB0aGUgYXVkaW8gY29uZmlnIGhhcyBjaGFuZ2VkIGFuZCBidWZmZXJzIGluCi0gIC8vIGZ1dHVyZSBBcHBlbmQoKSBjYWxscyBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmV3IGNvbmZpZy4KLSAgYm9vbCBVcGRhdGVBdWRpb0NvbmZpZyhjb25zdCBBdWRpb0RlY29kZXJDb25maWcmIGNvbmZpZyk7Ci0KLSAgLy8gTm90aWZpZXMgdGhpcyBvYmplY3QgdGhhdCB0aGUgdmlkZW8gY29uZmlnIGhhcyBjaGFuZ2VkIGFuZCBidWZmZXJzIGluCi0gIC8vIGZ1dHVyZSBBcHBlbmQoKSBjYWxscyBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmV3IGNvbmZpZy4KLSAgYm9vbCBVcGRhdGVWaWRlb0NvbmZpZyhjb25zdCBWaWRlb0RlY29kZXJDb25maWcmIGNvbmZpZyk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgbGFyZ2VzdCBkaXN0YW5jZSBiZXR3ZWVuIHR3byBhZGphY2VudCBidWZmZXJzIGluIHRoaXMgc3RyZWFtLAotICAvLyBvciBhbiBlc3RpbWF0ZSBpZiBubyB0d28gYWRqYWNlbnQgYnVmZmVycyBoYXZlIGJlZW4gYXBwZW5kZWQgdG8gdGhlIHN0cmVhbQotICAvLyB5ZXQuCi0gIGJhc2U6OlRpbWVEZWx0YSBHZXRNYXhJbnRlcmJ1ZmZlckRpc3RhbmNlKCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBmcmllbmQgY2xhc3MgU291cmNlQnVmZmVyU3RyZWFtVGVzdDsKLSAgdHlwZWRlZiBzdGQ6Omxpc3Q8U291cmNlQnVmZmVyUmFuZ2UqPiBSYW5nZUxpc3Q7Ci0KLSAgdm9pZCBzZXRfbWVtb3J5X2xpbWl0KGludCBtZW1vcnlfbGltaXQpIHsgbWVtb3J5X2xpbWl0XyA9IG1lbW9yeV9saW1pdDsgfQotCi0gIC8vIEZyZWVzIHVwIHNwYWNlIGlmIHRoZSBTb3VyY2VCdWZmZXJTdHJlYW0gaXMgdGFraW5nIHVwIHRvbyBtdWNoIG1lbW9yeS4KLSAgdm9pZCBHYXJiYWdlQ29sbGVjdElmTmVlZGVkKCk7Ci0KLSAgLy8gQXR0ZW1wdHMgdG8gZGVsZXRlIGFwcHJveGltYXRlbHkgfHRvdGFsX2J5dGVzX3RvX2ZyZWV8IGFtb3VudCBvZiBkYXRhCi0gIC8vIHxyYW5nZXNffCwgc3RhcnRpbmcgYXQgdGhlIGZyb250IG9mIHxyYW5nZXNffCBhbmQgbW92aW5nIGxpbmVhcmx5IGZvcndhcmQKLSAgLy8gdGhyb3VnaCB0aGUgYnVmZmVycy4gRGVsZXRlcyBzdGFydGluZyBmcm9tIHRoZSBiYWNrIGlmIHxyZXZlcnNlX2RpcmVjdGlvbnwKLSAgLy8gaXMgdHJ1ZS4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZyZWVkLgotICBpbnQgRnJlZUJ1ZmZlcnMoaW50IHRvdGFsX2J5dGVzX3RvX2ZyZWUsIGJvb2wgcmV2ZXJzZV9kaXJlY3Rpb24pOwotCi0gIC8vIEFwcGVuZHMgfG5ld19idWZmZXJzfCBpbnRvIHxyYW5nZV9mb3JfbmV3X2J1ZmZlcnNfaXRyfCwgaGFuZGxpbmcgc3RhcnQgYW5kCi0gIC8vIGVuZCBvdmVybGFwcyBpZiBuZWNlc3NhcnkuCi0gIC8vIHxkZWxldGVkX25leHRfYnVmZmVyfCBpcyBhbiBvdXRwdXQgcGFyYW1ldGVyIHRoYXQgaXMgdHJ1ZSBpZiB0aGUgbmV4dAotICAvLyBidWZmZXIgdGhhdCB3b3VsZCBoYXZlIGJlZW4gcmV0dXJuZWQgZnJvbSBHZXROZXh0QnVmZmVyKCkgd2FzIGRlbGV0ZWQKLSAgLy8gZHVyaW5nIHRoaXMgY2FsbC4KLSAgLy8gfGRlbGV0ZWRfYnVmZmVyc3wgaXMgYW4gb3V0cHV0IHBhcmFtZXRlciBjb250YWluaW5nIGNhbmRpZGF0ZXMgZm9yCi0gIC8vIHx0cmFja19idWZmZXJffC4KLSAgdm9pZCBJbnNlcnRJbnRvRXhpc3RpbmdSYW5nZSgKLSAgICAgIGNvbnN0IFJhbmdlTGlzdDo6aXRlcmF0b3ImIHJhbmdlX2Zvcl9uZXdfYnVmZmVyc19pdHIsCi0gICAgICBjb25zdCBCdWZmZXJRdWV1ZSYgbmV3X2J1ZmZlcnMsCi0gICAgICBib29sKiBkZWxldGVkX25leHRfYnVmZmVyLCBCdWZmZXJRdWV1ZSogZGVsZXRlZF9idWZmZXJzKTsKLQotICAvLyBSZXNvbHZlIG92ZXJsYXBwaW5nIHJhbmdlcyBzdWNoIHRoYXQgbm8gcmFuZ2VzIG92ZXJsYXAgYW55bW9yZS4KLSAgLy8gfHJhbmdlX3dpdGhfbmV3X2J1ZmZlcnNfaXRyfCBwb2ludHMgdG8gdGhlIHJhbmdlIHRoYXQgaGFzIG5ld2x5IGFwcGVuZGVkCi0gIC8vIGJ1ZmZlcnMuCi0gIC8vIHxkZWxldGVkX25leHRfYnVmZmVyfCBpcyBhbiBvdXRwdXQgcGFyYW1ldGVyIHRoYXQgaXMgdHJ1ZSBpZiB0aGUgbmV4dAotICAvLyBidWZmZXIgdGhhdCB3b3VsZCBoYXZlIGJlZW4gcmV0dXJuZWQgZnJvbSBHZXROZXh0QnVmZmVyKCkgd2FzIGRlbGV0ZWQKLSAgLy8gZHVyaW5nIHRoaXMgY2FsbC4KLSAgLy8gfGRlbGV0ZWRfYnVmZmVyc3wgaXMgYW4gb3V0cHV0IHBhcmFtZXRlciBjb250YWluaW5nIGNhbmRpZGF0ZXMgZm9yCi0gIC8vIHx0cmFja19idWZmZXJffC4KLSAgdm9pZCBSZXNvbHZlQ29tcGxldGVPdmVybGFwcygKLSAgICAgIGNvbnN0IFJhbmdlTGlzdDo6aXRlcmF0b3ImIHJhbmdlX3dpdGhfbmV3X2J1ZmZlcnNfaXRyLAotICAgICAgYm9vbCogZGVsZXRlZF9uZXh0X2J1ZmZlciwgQnVmZmVyUXVldWUqIGRlbGV0ZWRfYnVmZmVycyk7Ci0gIHZvaWQgUmVzb2x2ZUVuZE92ZXJsYXAoCi0gICAgICBjb25zdCBSYW5nZUxpc3Q6Oml0ZXJhdG9yJiByYW5nZV93aXRoX25ld19idWZmZXJzX2l0ciwKLSAgICAgIGJvb2wqIGRlbGV0ZWRfbmV4dF9idWZmZXIsIEJ1ZmZlclF1ZXVlKiBkZWxldGVkX2J1ZmZlcnMpOwotCi0gIC8vIFRoaXMgbWV0aG9kIGlzIGEgYml0IHRyaWNreSB0byBkZXNjcmliZS4gV2hlbiB3aGF0IHdvdWxkIGhhdmUgYmVlbiB0aGUKLSAgLy8gbmV4dCBidWZmZXIgcmV0dXJuZWQgZnJvbSB8c2VsZWN0ZWRfcmFuZ2VffCBpcyBvdmVybGFwcGVkIGJ5IG5ldyBkYXRhLAotICAvLyB0aGUgfHNlbGVjdGVkX3JhbmdlX3wgc2Vla3MgZm9yd2FyZCB0byB0aGUgbmV4dCBrZXlmcmFtZSBhZnRlciAob3IgYXQpIHRoZQotICAvLyBuZXh0IGJ1ZmZlciB0aW1lc3RhbXAgYW5kIHRoZSBvdmVybGFwcGVkIGJ1ZmZlcnMgYXJlIGRlbGV0ZWQuIEJ1dCBmb3IKLSAgLy8gc21vb3RoIHBsYXliYWNrIGJldHdlZW4gdGhlIG9sZCBkYXRhIHRvIHRoZSBuZXcgZGF0YSdzIGtleWZyYW1lLCBzb21lIG9mCi0gIC8vIHRoZXNlIHxkZWxldGVkX2J1ZmZlcnN8IG1heSBiZSB0ZW1wb3JhcmlseSBzYXZlZCBpbnRvIHx0cmFja19idWZmZXJffC4KLSAgLy8gVXBkYXRlVHJhY2tCdWZmZXIoKSB0YWtlcyB0aGVzZSB8ZGVsZXRlZF9idWZmZXJzfCBhbmQgZGVjaWRlcyB3aGV0aGVyIGl0Ci0gIC8vIHdhbnRzIHRvIHNhdmUgYW55IGJ1ZmZlcnMgaW50byB8dHJhY2tfYnVmZmVyX3wuCi0gIC8vIFRPRE8odnJrKTogVGhpcyBpcyBhIGxpdHRsZSBjcmF6eSEgSWRlYXMgZm9yIGNsZWFudXAgaW4gY3JidWcuY29tLzEyOTYyMy4KLSAgdm9pZCBVcGRhdGVUcmFja0J1ZmZlcihjb25zdCBCdWZmZXJRdWV1ZSYgZGVsZXRlZF9idWZmZXJzKTsKLQotICAvLyBSZW1vdmVzIGJ1ZmZlcnMgdGhhdCBjb21lIGJlZm9yZSB8c2VsZWN0ZWRfcmFuZ2VffCdzIG5leHQgYnVmZmVyIGZyb20gdGhlCi0gIC8vIHx0cmFja19idWZmZXJffC4KLSAgdm9pZCBQcnVuZVRyYWNrQnVmZmVyKCk7Ci0KLSAgLy8gQ2hlY2tzIHRvIHNlZSBpZiB8cmFuZ2Vfd2l0aF9uZXdfYnVmZmVyc19pdHJ8IGNhbiBiZSBtZXJnZWQgd2l0aCB0aGUgcmFuZ2UKLSAgLy8gbmV4dCB0byBpdCwgYW5kIG1lcmdlcyB0aGVtIGlmIHNvLgotICB2b2lkIE1lcmdlV2l0aEFkamFjZW50UmFuZ2VJZk5lY2Vzc2FyeSgKLSAgICAgIGNvbnN0IFJhbmdlTGlzdDo6aXRlcmF0b3ImIHJhbmdlX3dpdGhfbmV3X2J1ZmZlcnNfaXRyKTsKLQotICAvLyBEZWxldGVzIHRoZSBidWZmZXJzIGJldHdlZW4gfHN0YXJ0X3RpbWVzdGFtcHwsIHxlbmRfdGltZXN0YW1wfCBmcm9tCi0gIC8vIHxyYW5nZXwuIERlbGV0ZXMgYmV0d2VlbiBbc3RhcnQsZW5kXSBpZiB8aXNfcmFuZ2VfZXhjbHVzaXZlfCBpcyB0cnVlLCBvcgotICAvLyAoc3RhcnQsZW5kKSBpZiB8aXNfcmFuZ2VfZXhjbHVzaXZlfCBpcyBmYWxzZS4KLSAgLy8gQnVmZmVycyBhcmUgZGVsZXRlZCBpbiBHT1BzLCBzbyB0aGlzIG1ldGhvZCBtYXkgZGVsZXRlIGJ1ZmZlcnMgcGFzdAotICAvLyB8ZW5kX3RpbWVzdGFtcHwgaWYgdGhlIGtleWZyYW1lIGEgYnVmZmVyIGRlcGVuZHMgb24gd2FzIGRlbGV0ZWQuCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgfG5leHRfYnVmZmVyX2luZGV4X3wgaXMgcmVzZXQsIGFuZCBwbGFjZXMgdGhlIGJ1ZmZlcnMKLSAgLy8gcmVtb3ZlZCBmcm9tIHRoZSByYW5nZSBzdGFydGluZyBhdCB8bmV4dF9idWZmZXJfaW5kZXhffCBpbgotICAvLyB8ZGVsZXRlZF9idWZmZXJzfC4KLSAgYm9vbCBEZWxldGVCZXR3ZWVuKFNvdXJjZUJ1ZmZlclJhbmdlKiByYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YSBzdGFydF90aW1lc3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGEgZW5kX3RpbWVzdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmFuZ2VfZXhjbHVzaXZlLAotICAgICAgICAgICAgICAgICAgICAgQnVmZmVyUXVldWUqIGRlbGV0ZWRfYnVmZmVycyk7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHxzZWNvbmRfdGltZXN0YW1wfCBpcyB0aGUgdGltZXN0YW1wIG9mIHRoZSBuZXh0IGJ1ZmZlciBpbgotICAvLyBzZXF1ZW5jZSBhZnRlciB8Zmlyc3RfdGltZXN0YW1wfCwgZmFsc2Ugb3RoZXJ3aXNlLgotICBib29sIEFyZUFkamFjZW50SW5TZXF1ZW5jZSgKLSAgICAgIGJhc2U6OlRpbWVEZWx0YSBmaXJzdF90aW1lc3RhbXAsIGJhc2U6OlRpbWVEZWx0YSBzZWNvbmRfdGltZXN0YW1wKSBjb25zdDsKLQotICAvLyBIZWxwZXIgbWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgdGltZXN0YW1wIGZvciB0aGUgbmV4dCBidWZmZXIgdGhhdAotICAvLyB8c2VsZWN0ZWRfcmFuZ2VffCB3aWxsIHJldHVybiBmcm9tIEdldE5leHRCdWZmZXIoKSBjYWxsLCBvciBrTm9UaW1lc3RhbXAoKQotICAvLyBpZiBpbiBiZXR3ZWVuIHNlZWtpbmcgKGkuZS4gfHNlbGVjdGVkX3JhbmdlX3wgaXMgbnVsbCkuCi0gIGJhc2U6OlRpbWVEZWx0YSBHZXROZXh0QnVmZmVyVGltZXN0YW1wKCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgdGltZXN0YW1wIG9mIHRoZSBsYXN0IGJ1ZmZlciBpbiB0aGUgfHNlbGVjdGVkX3JhbmdlX3wgb3IKLSAgLy8ga05vVGltZXN0YW1wKCkgaWYgfHNlbGVjdGVkX3JhbmdlX3wgaXMgbnVsbC4KLSAgYmFzZTo6VGltZURlbHRhIEdldEVuZEJ1ZmZlclRpbWVzdGFtcCgpOwotCi0gIC8vIEZpbmRzIHRoZSByYW5nZSB0aGF0IHNob3VsZCBjb250YWluIGEgbWVkaWEgc2VnbWVudCB0aGF0IGJlZ2lucyB3aXRoCi0gIC8vIHxzdGFydF90aW1lc3RhbXB8IGFuZCByZXR1cm5zIHRoZSBpdGVyYXRvciBwb2ludGluZyB0byBpdC4gUmV0dXJucwotICAvLyB8cmFuZ2VzXy5lbmQoKXwgaWYgdGhlcmUncyBubyBzdWNoIGV4aXN0aW5nIHJhbmdlLgotICBSYW5nZUxpc3Q6Oml0ZXJhdG9yIEZpbmRFeGlzdGluZ1JhbmdlRm9yKGJhc2U6OlRpbWVEZWx0YSBzdGFydF90aW1lc3RhbXApOwotCi0gIC8vIEluc2VydHMgfG5ld19yYW5nZXwgaW50byB8cmFuZ2VzX3wgcHJlc2VydmluZyBzb3J0ZWQgb3JkZXIuIFJldHVybnMgYW4KLSAgLy8gaXRlcmF0b3IgaW4gfHJhbmdlc198IHRoYXQgcG9pbnRzIHRvIHxuZXdfcmFuZ2V8LgotICBSYW5nZUxpc3Q6Oml0ZXJhdG9yIEFkZFRvUmFuZ2VzKFNvdXJjZUJ1ZmZlclJhbmdlKiBuZXdfcmFuZ2UpOwotCi0gIC8vIFJldHVybnMgYW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIHBsYWNlIGluIHxyYW5nZXNffCB3aGVyZQotICAvLyB8c2VsZWN0ZWRfcmFuZ2VffCBsaXZlcy4KLSAgUmFuZ2VMaXN0OjppdGVyYXRvciBHZXRTZWxlY3RlZFJhbmdlSXRyKCk7Ci0KLSAgLy8gU2V0cyB0aGUgfHNlbGVjdGVkX3JhbmdlX3wgdG8gfHJhbmdlfCBhbmQgcmVzZXRzIHRoZSBuZXh0IGJ1ZmZlciBwb3NpdGlvbgotICAvLyBmb3IgdGhlIHByZXZpb3VzIHxzZWxlY3RlZF9yYW5nZV98LgotICB2b2lkIFNldFNlbGVjdGVkUmFuZ2UoU291cmNlQnVmZmVyUmFuZ2UqIHJhbmdlKTsKLQotICAvLyBSZXNldHMgdGhpcyBzdHJlYW0gYmFjayB0byBhbiB1bnNlZWtlZCBzdGF0ZS4KLSAgdm9pZCBSZXNldFNlZWtTdGF0ZSgpOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB8c2Vla190aW1lc3RhbXB8IHJlZmVycyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaXJzdCByYW5nZQotICAvLyBpbiB8cmFuZ2VzX3wsIGZhbHNlIG90aGVyd2lzZSBvciBpZiB8cmFuZ2VzX3wgaXMgZW1wdHkuCi0gIGJvb2wgU2hvdWxkU2Vla1RvU3RhcnRPZkJ1ZmZlcmVkKGJhc2U6OlRpbWVEZWx0YSBzZWVrX3RpbWVzdGFtcCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0aW1lc3RhbXBzIG9mIHxidWZmZXJzfCBhcmUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nCi0gIC8vIHNpbmNlIHRoZSBwcmV2aW91cyBhcHBlbmQgdG8gdGhlIG1lZGlhIHNlZ21lbnQsIGZhbHNlIG90aGVyd2lzZS4KLSAgYm9vbCBJc01vbm90b25pY2FsbHlJbmNyZWFzaW5nKGNvbnN0IEJ1ZmZlclF1ZXVlJiBidWZmZXJzKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgfHNlbGVjdGVkX3JhbmdlX3wgaXMgdGhlIG9ubHkgcmFuZ2UgaW4gfHJhbmdlc198IHRoYXQKLSAgLy8gSGFzTmV4dEJ1ZmZlclBvc2l0aW9uKCkuCi0gIGJvb2wgT25seVNlbGVjdGVkUmFuZ2VJc1NlZWtlZCgpIGNvbnN0OwotCi0gIC8vIE1lYXN1cmVzIHRoZSBkaXN0YW5jZXMgYmV0d2VlbiBidWZmZXIgdGltZXN0YW1wcyBhbmQgdHJhY2tzIHRoZSBtYXguCi0gIHZvaWQgVXBkYXRlTWF4SW50ZXJidWZmZXJEaXN0YW5jZShjb25zdCBCdWZmZXJRdWV1ZSYgYnVmZmVycyk7Ci0KLSAgLy8gU2V0cyB0aGUgY29uZmlnIElEIGZvciBlYWNoIGJ1ZmZlciB0byB8YXBwZW5kX2NvbmZpZ19pbmRleF98LgotICB2b2lkIFNldENvbmZpZ0lkcyhjb25zdCBCdWZmZXJRdWV1ZSYgYnVmZmVycyk7Ci0KLSAgLy8gQ2FsbGVkIHRvIGNvbXBsZXRlIGEgY29uZmlnIGNoYW5nZS4gVXBkYXRlcyB8Y3VycmVudF9jb25maWdfaW5kZXhffCB0bwotICAvLyBtYXRjaCB0aGUgaW5kZXggb2YgdGhlIG5leHQgYnVmZmVyLiBDYWxsaW5nIHRoaXMgbWV0aG9kIGNhdXNlcwotICAvLyBHZXROZXh0QnVmZmVyKCkgdG8gc3RvcCByZXR1cm5pbmcga0NvbmZpZ0NoYW5nZSBhbmQgc3RhcnQgcmV0dXJuaW5nCi0gIC8vIGtTdWNjZXNzLgotICB2b2lkIENvbXBsZXRlQ29uZmlnQ2hhbmdlKCk7Ci0KLSAgLy8gQ2FsbGJhY2sgdXNlZCB0byByZXBvcnQgZXJyb3Igc3RyaW5ncyB0aGF0IGNhbiBoZWxwIHRoZSB3ZWIgZGV2ZWxvcGVyCi0gIC8vIGZpZ3VyZSBvdXQgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZSBjb250ZW50LgotICBMb2dDQiBsb2dfY2JfOwotCi0gIC8vIExpc3Qgb2YgZGlzam9pbnQgYnVmZmVyZWQgcmFuZ2VzLCBvcmRlcmVkIGJ5IHN0YXJ0IHRpbWUuCi0gIFJhbmdlTGlzdCByYW5nZXNfOwotCi0gIC8vIEluZGljYXRlcyB3aGljaCBkZWNvZGVyIGNvbmZpZyBpcyBiZWluZyB1c2VkIGJ5IHRoZSBkZWNvZGVyLgotICAvLyBHZXROZXh0QnVmZmVyKCkgaXMgb25seSBhbGxvd3MgdG8gcmV0dXJuIGJ1ZmZlcnMgdGhhdCBoYXZlIGEKLSAgLy8gY29uZmlnIElEIHRoYXQgbWF0Y2hlcyB0aGlzIGluZGV4LiBJZiB0aGVyZSBpcyBhIG1pc21hdGNoIHRoZW4KLSAgLy8gaXQgbXVzdCBzaWduYWwgdGhhdCBhIGNvbmZpZyBjaGFuZ2UgaXMgbmVlZGVkLgotICBpbnQgY3VycmVudF9jb25maWdfaW5kZXhfOwotCi0gIC8vIEluZGljYXRlcyB3aGljaCBkZWNvZGVyIGNvbmZpZyB0byBhc3NvY2lhdGUgd2l0aCBuZXcgYnVmZmVycwotICAvLyBiZWluZyBhcHBlbmRlZC4gRWFjaCBuZXcgYnVmZmVyIGFwcGVuZGVkIGhhcyBpdHMgY29uZmlnIElEIHNldAotICAvLyB0byB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZC4KLSAgaW50IGFwcGVuZF9jb25maWdfaW5kZXhfOwotCi0gIC8vIEhvbGRzIHRoZSBhdWRpby92aWRlbyBjb25maWdzIGZvciB0aGlzIHN0cmVhbS4gfGN1cnJlbnRfY29uZmlnX2luZGV4X3wKLSAgLy8gYW5kIHxhcHBlbmRfY29uZmlnX2luZGV4X3wgcmVwcmVzZW50IGluZGV4ZXMgaW50byBvbmUgb2YgdGhlc2UgdmVjdG9ycy4KLSAgc3RkOjp2ZWN0b3I8QXVkaW9EZWNvZGVyQ29uZmlnKj4gYXVkaW9fY29uZmlnc187Ci0gIHN0ZDo6dmVjdG9yPFZpZGVvRGVjb2RlckNvbmZpZyo+IHZpZGVvX2NvbmZpZ3NfOwotCi0gIC8vIFRydWUgaWYgbW9yZSBkYXRhIG5lZWRzIHRvIGJlIGFwcGVuZGVkIGJlZm9yZSB0aGUgU2VlaygpIGNhbiBjb21wbGV0ZSwKLSAgLy8gZmFsc2UgaWYgbm8gU2VlaygpIGhhcyBiZWVuIHJlcXVlc3RlZCBvciB0aGUgU2VlaygpIGlzIGNvbXBsZXRlZC4KLSAgYm9vbCBzZWVrX3BlbmRpbmdfOwotCi0gIC8vIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGtleWZyYW1lIHJpZ2h0IGJlZm9yZSB0aGUgc2VlayB0aW1lc3RhbXAuCi0gIGJhc2U6OlRpbWVEZWx0YSBzZWVrX2tleWZyYW1lX3RpbWVzdGFtcF87Ci0KLSAgLy8gVGltZXN0YW1wIG9mIHRoZSBsYXN0IHJlcXVlc3QgdG8gU2VlaygpLgotICBiYXNlOjpUaW1lRGVsdGEgc2Vla19idWZmZXJfdGltZXN0YW1wXzsKLQotICAvLyBQb2ludGVyIHRvIHRoZSBzZWVrZWQtdG8gUmFuZ2UuIFRoaXMgaXMgdGhlIHJhbmdlIGZyb20gd2hpY2gKLSAgLy8gR2V0TmV4dEJ1ZmZlcigpIGNhbGxzIGFyZSBmdWxmaWxsZWQgYWZ0ZXIgdGhlIHx0cmFja19idWZmZXJffCBoYXMgYmVlbgotICAvLyBlbXB0aWVkLgotICBTb3VyY2VCdWZmZXJSYW5nZSogc2VsZWN0ZWRfcmFuZ2VfOwotCi0gIC8vIFF1ZXVlIG9mIHRoZSBuZXh0IGJ1ZmZlcnMgdG8gYmUgcmV0dXJuZWQgZnJvbSBjYWxscyB0byBHZXROZXh0QnVmZmVyKCkuIElmCi0gIC8vIHx0cmFja19idWZmZXJffCBpcyBlbXB0eSwgcmV0dXJuIGJ1ZmZlcnMgZnJvbSB8c2VsZWN0ZWRfcmFuZ2VffC4KLSAgQnVmZmVyUXVldWUgdHJhY2tfYnVmZmVyXzsKLQotICAvLyBUaGUgc3RhcnQgdGltZSBvZiB0aGUgY3VycmVudCBtZWRpYSBzZWdtZW50IGJlaW5nIGFwcGVuZGVkLgotICBiYXNlOjpUaW1lRGVsdGEgbWVkaWFfc2VnbWVudF9zdGFydF90aW1lXzsKLQotICAvLyBQb2ludHMgdG8gdGhlIHJhbmdlIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgbWVkaWEgc2VnbWVudCBiZWluZyBhcHBlbmRlZC4KLSAgUmFuZ2VMaXN0OjppdGVyYXRvciByYW5nZV9mb3JfbmV4dF9hcHBlbmRfOwotCi0gIC8vIFRydWUgd2hlbiB0aGUgbmV4dCBjYWxsIHRvIEFwcGVuZCgpIGJlZ2lucyBhIG5ldyBtZWRpYSBzZWdtZW50LgotICBib29sIG5ld19tZWRpYV9zZWdtZW50XzsKLQotICAvLyBUaGUgdGltZXN0YW1wIG9mIHRoZSBsYXN0IGJ1ZmZlciBhcHBlbmRlZCB0byB0aGUgbWVkaWEgc2VnbWVudCwgc2V0IHRvCi0gIC8vIGtOb1RpbWVzdGFtcCgpIGlmIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlZ21lbnQuCi0gIGJhc2U6OlRpbWVEZWx0YSBsYXN0X2J1ZmZlcl90aW1lc3RhbXBfOwotCi0gIC8vIFN0b3JlcyB0aGUgbGFyZ2VzdCBkaXN0YW5jZSBiZXR3ZWVuIHR3byBhZGphY2VudCBidWZmZXJzIGluIHRoaXMgc3RyZWFtLgotICBiYXNlOjpUaW1lRGVsdGEgbWF4X2ludGVyYnVmZmVyX2Rpc3RhbmNlXzsKLQotICAvLyBUaGUgbWF4aW11bSBhbW91bnQgb2YgZGF0YSBpbiBieXRlcyB0aGUgc3RyZWFtIHdpbGwga2VlcCBpbiBtZW1vcnkuCi0gIGludCBtZW1vcnlfbGltaXRfOwotCi0gIC8vIEluZGljYXRlcyB0aGF0IGEga0NvbmZpZ0NoYW5nZWQgc3RhdHVzIGhhcyBiZWVuIHJlcG9ydGVkIGJ5IEdldE5leHRCdWZmZXIoKQotICAvLyBhbmQgR2V0Q3VycmVudFhYWERlY29kZXJDb25maWcoKSBtdXN0IGJlIGNhbGxlZCB0byB1cGRhdGUgdGhlIGN1cnJlbnQKLSAgLy8gY29uZmlnLiBHZXROZXh0QnVmZmVyKCkgbXVzdCBub3QgYmUgY2FsbGVkIGFnYWluIHVudGlsCi0gIC8vIEdldEN1cnJlbnRYWFhEZWNvZGVyQ29uZmlnKCkgaGFzIGJlZW4gY2FsbGVkLgotICBib29sIGNvbmZpZ19jaGFuZ2VfcGVuZGluZ187Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNvdXJjZUJ1ZmZlclN0cmVhbSk7Ci19OwotCi12b2lkIExvZ01lZGlhU291cmNlVGltZVJhbmdlcyhjb25zdCBzdGQ6OnN0cmluZyYgZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhbmdlczxiYXNlOjpUaW1lRGVsdGE+JiB0aW1lX3Jhbmdlcyk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0ZJTFRFUlNfU09VUkNFX0JVRkZFUl9TVFJFQU1fSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL3NvdXJjZV9idWZmZXJfc3RyZWFtX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2ZpbHRlcnMvc291cmNlX2J1ZmZlcl9zdHJlYW1fdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZmE5ZWEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvc291cmNlX2J1ZmZlcl9zdHJlYW1fdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNTg5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL3NvdXJjZV9idWZmZXJfc3RyZWFtLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL3N0cmluZ19udW1iZXJfY29udmVyc2lvbnMuaCIKLSNpbmNsdWRlICJiYXNlL3N0cmluZ19zcGxpdC5oIgotI2luY2x1ZGUgImJhc2Uvc3RyaW5nX3V0aWwuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RhdGFfYnVmZmVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9sb2cuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotc3RhdGljIGNvbnN0IGludCBrRGVmYXVsdEZyYW1lc1BlclNlY29uZCA9IDMwOwotc3RhdGljIGNvbnN0IGludCBrRGVmYXVsdEtleWZyYW1lc1BlclNlY29uZCA9IDY7Ci1zdGF0aWMgY29uc3QgdWludDgga0RhdGFBID0gMHgxMTsKLXN0YXRpYyBjb25zdCB1aW50OCBrRGF0YUIgPSAweDMzOwotc3RhdGljIGNvbnN0IGludCBrRGF0YVNpemUgPSAxOwotc3RhdGljIGNvbnN0IGdmeDo6U2l6ZSBrQ29kZWRTaXplKDMyMCwgMjQwKTsKLQotY2xhc3MgU291cmNlQnVmZmVyU3RyZWFtVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QoKSB7Ci0gICAgY29uZmlnXy5Jbml0aWFsaXplKGtDb2RlY1ZQOCwgVklERU9fQ09ERUNfUFJPRklMRV9VTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0ZyYW1lOjpZVjEyLCBrQ29kZWRTaXplLCBnZng6OlJlY3Qoa0NvZGVkU2l6ZSksCi0gICAgICAgICAgICAgICAgICAgICAgIGtDb2RlZFNpemUsIE5VTEwsIDAsIGZhbHNlLCBmYWxzZSk7Ci0gICAgc3RyZWFtXy5yZXNldChuZXcgU291cmNlQnVmZmVyU3RyZWFtKGNvbmZpZ18sIExvZ0NCKCkpKTsKLSAgICBTZXRTdHJlYW1JbmZvKGtEZWZhdWx0RnJhbWVzUGVyU2Vjb25kLCBrRGVmYXVsdEtleWZyYW1lc1BlclNlY29uZCk7Ci0gIH0KLQotICB2b2lkIFNldE1lbW9yeUxpbWl0KGludCBidWZmZXJzX29mX2RhdGEpIHsKLSAgICBzdHJlYW1fLT5zZXRfbWVtb3J5X2xpbWl0KGJ1ZmZlcnNfb2ZfZGF0YSAqIGtEYXRhU2l6ZSk7Ci0gIH0KLQotICB2b2lkIFNldFN0cmVhbUluZm8oaW50IGZyYW1lc19wZXJfc2Vjb25kLCBpbnQga2V5ZnJhbWVzX3Blcl9zZWNvbmQpIHsKLSAgICBmcmFtZXNfcGVyX3NlY29uZF8gPSBmcmFtZXNfcGVyX3NlY29uZDsKLSAgICBrZXlmcmFtZXNfcGVyX3NlY29uZF8gPSBrZXlmcmFtZXNfcGVyX3NlY29uZDsKLSAgICBmcmFtZV9kdXJhdGlvbl8gPSBDb252ZXJ0VG9GcmFtZUR1cmF0aW9uKGZyYW1lc19wZXJfc2Vjb25kKTsKLSAgfQotCi0gIHZvaWQgTmV3U2VnbWVudEFwcGVuZChpbnQgc3RhcnRpbmdfcG9zaXRpb24sIGludCBudW1iZXJfb2ZfYnVmZmVycykgewotICAgIEFwcGVuZEJ1ZmZlcnMoc3RhcnRpbmdfcG9zaXRpb24sIG51bWJlcl9vZl9idWZmZXJzLCB0cnVlLAotICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhKCksIHRydWUsICZrRGF0YUEsIGtEYXRhU2l6ZSk7Ci0gIH0KLQotICB2b2lkIE5ld1NlZ21lbnRBcHBlbmQoaW50IHN0YXJ0aW5nX3Bvc2l0aW9uLCBpbnQgbnVtYmVyX29mX2J1ZmZlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogZGF0YSkgewotICAgIEFwcGVuZEJ1ZmZlcnMoc3RhcnRpbmdfcG9zaXRpb24sIG51bWJlcl9vZl9idWZmZXJzLCB0cnVlLAotICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhKCksIHRydWUsIGRhdGEsIGtEYXRhU2l6ZSk7Ci0gIH0KLQotICB2b2lkIE5ld1NlZ21lbnRBcHBlbmRfT2Zmc2V0Rmlyc3RCdWZmZXIoCi0gICAgICBpbnQgc3RhcnRpbmdfcG9zaXRpb24sIGludCBudW1iZXJfb2ZfYnVmZmVycywKLSAgICAgIGJhc2U6OlRpbWVEZWx0YSBmaXJzdF9idWZmZXJfb2Zmc2V0KSB7Ci0gICAgQXBwZW5kQnVmZmVycyhzdGFydGluZ19wb3NpdGlvbiwgbnVtYmVyX29mX2J1ZmZlcnMsIHRydWUsCi0gICAgICAgICAgICAgICAgICBmaXJzdF9idWZmZXJfb2Zmc2V0LCB0cnVlLCAma0RhdGFBLCBrRGF0YVNpemUpOwotICB9Ci0KLSAgdm9pZCBOZXdTZWdtZW50QXBwZW5kX0V4cGVjdEZhaWx1cmUoCi0gICAgICBpbnQgc3RhcnRpbmdfcG9zaXRpb24sIGludCBudW1iZXJfb2ZfYnVmZmVycykgewotICAgIEFwcGVuZEJ1ZmZlcnMoc3RhcnRpbmdfcG9zaXRpb24sIG51bWJlcl9vZl9idWZmZXJzLCB0cnVlLAotICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhKCksIGZhbHNlLCAma0RhdGFBLCBrRGF0YVNpemUpOwotICB9Ci0KLSAgdm9pZCBBcHBlbmRCdWZmZXJzKGludCBzdGFydGluZ19wb3NpdGlvbiwgaW50IG51bWJlcl9vZl9idWZmZXJzKSB7Ci0gICAgQXBwZW5kQnVmZmVycyhzdGFydGluZ19wb3NpdGlvbiwgbnVtYmVyX29mX2J1ZmZlcnMsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhKCksIHRydWUsICZrRGF0YUEsIGtEYXRhU2l6ZSk7Ci0gIH0KLQotICB2b2lkIEFwcGVuZEJ1ZmZlcnMoaW50IHN0YXJ0aW5nX3Bvc2l0aW9uLCBpbnQgbnVtYmVyX29mX2J1ZmZlcnMsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogZGF0YSkgewotICAgIEFwcGVuZEJ1ZmZlcnMoc3RhcnRpbmdfcG9zaXRpb24sIG51bWJlcl9vZl9idWZmZXJzLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YSgpLCB0cnVlLCBkYXRhLCBrRGF0YVNpemUpOwotICB9Ci0KLSAgdm9pZCBOZXdTZWdtZW50QXBwZW5kKGNvbnN0IHN0ZDo6c3RyaW5nJiBidWZmZXJzX3RvX2FwcGVuZCkgewotICAgIEFwcGVuZEJ1ZmZlcnMoYnVmZmVyc190b19hcHBlbmQsIHRydWUsIGZhbHNlKTsKLSAgfQotCi0gIHZvaWQgQXBwZW5kQnVmZmVycyhjb25zdCBzdGQ6OnN0cmluZyYgYnVmZmVyc190b19hcHBlbmQpIHsKLSAgICBBcHBlbmRCdWZmZXJzKGJ1ZmZlcnNfdG9fYXBwZW5kLCBmYWxzZSwgZmFsc2UpOwotICB9Ci0KLSAgdm9pZCBOZXdTZWdtZW50QXBwZW5kT25lQnlPbmUoY29uc3Qgc3RkOjpzdHJpbmcmIGJ1ZmZlcnNfdG9fYXBwZW5kKSB7Ci0gICAgQXBwZW5kQnVmZmVycyhidWZmZXJzX3RvX2FwcGVuZCwgdHJ1ZSwgdHJ1ZSk7Ci0gIH0KLQotICB2b2lkIEFwcGVuZEJ1ZmZlcnNPbmVCeU9uZShjb25zdCBzdGQ6OnN0cmluZyYgYnVmZmVyc190b19hcHBlbmQpIHsKLSAgICBBcHBlbmRCdWZmZXJzKGJ1ZmZlcnNfdG9fYXBwZW5kLCBmYWxzZSwgdHJ1ZSk7Ci0gIH0KLQotICB2b2lkIFNlZWsoaW50IHBvc2l0aW9uKSB7Ci0gICAgc3RyZWFtXy0+U2Vlayhwb3NpdGlvbiAqIGZyYW1lX2R1cmF0aW9uXyk7Ci0gIH0KLQotICB2b2lkIFNlZWtUb1RpbWVzdGFtcChiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wKSB7Ci0gICAgc3RyZWFtXy0+U2Vlayh0aW1lc3RhbXApOwotICB9Ci0KLSAgdm9pZCBDaGVja0V4cGVjdGVkUmFuZ2VzKGNvbnN0IHN0ZDo6c3RyaW5nJiBleHBlY3RlZCkgewotICAgIFJhbmdlczxiYXNlOjpUaW1lRGVsdGE+IHIgPSBzdHJlYW1fLT5HZXRCdWZmZXJlZFRpbWUoKTsKLQotICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICAgIHNzIDw8ICJ7ICI7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByLnNpemUoKTsgKytpKSB7Ci0gICAgICBpbnQ2NCBzdGFydCA9IChyLnN0YXJ0KGkpIC8gZnJhbWVfZHVyYXRpb25fKTsKLSAgICAgIGludDY0IGVuZCA9IChyLmVuZChpKSAvIGZyYW1lX2R1cmF0aW9uXykgLSAxOwotICAgICAgc3MgPDwgIlsiIDw8IHN0YXJ0IDw8ICIsIiA8PCBlbmQgPDwgIikgIjsKLSAgICB9Ci0gICAgc3MgPDwgIn0iOwotICAgIEVYUEVDVF9FUShleHBlY3RlZCwgc3Muc3RyKCkpOwotICB9Ci0KLSAgdm9pZCBDaGVja0V4cGVjdGVkUmFuZ2VzQnlUaW1lc3RhbXAoY29uc3Qgc3RkOjpzdHJpbmcmIGV4cGVjdGVkKSB7Ci0gICAgUmFuZ2VzPGJhc2U6OlRpbWVEZWx0YT4gciA9IHN0cmVhbV8tPkdldEJ1ZmZlcmVkVGltZSgpOwotCi0gICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgc3MgPDwgInsgIjsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHIuc2l6ZSgpOyArK2kpIHsKLSAgICAgIGludDY0IHN0YXJ0ID0gci5zdGFydChpKS5Jbk1pbGxpc2Vjb25kcygpOwotICAgICAgaW50NjQgZW5kID0gci5lbmQoaSkuSW5NaWxsaXNlY29uZHMoKTsKLSAgICAgIHNzIDw8ICJbIiA8PCBzdGFydCA8PCAiLCIgPDwgZW5kIDw8ICIpICI7Ci0gICAgfQotICAgIHNzIDw8ICJ9IjsKLSAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQsIHNzLnN0cigpKTsKLSAgfQotCi0gIHZvaWQgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoCi0gICAgICBpbnQgc3RhcnRpbmdfcG9zaXRpb24sIGludCBlbmRpbmdfcG9zaXRpb24pIHsKLSAgICBDaGVja0V4cGVjdGVkQnVmZmVycyhzdGFydGluZ19wb3NpdGlvbiwgZW5kaW5nX3Bvc2l0aW9uLCBmYWxzZSwgTlVMTCwgMCk7Ci0gIH0KLQotICB2b2lkIENoZWNrRXhwZWN0ZWRCdWZmZXJzKAotICAgICAgaW50IHN0YXJ0aW5nX3Bvc2l0aW9uLCBpbnQgZW5kaW5nX3Bvc2l0aW9uLCBib29sIGV4cGVjdF9rZXlmcmFtZSkgewotICAgIENoZWNrRXhwZWN0ZWRCdWZmZXJzKHN0YXJ0aW5nX3Bvc2l0aW9uLCBlbmRpbmdfcG9zaXRpb24sIGV4cGVjdF9rZXlmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwKTsKLSAgfQotCi0gIHZvaWQgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoCi0gICAgICBpbnQgc3RhcnRpbmdfcG9zaXRpb24sIGludCBlbmRpbmdfcG9zaXRpb24sIGNvbnN0IHVpbnQ4KiBkYXRhKSB7Ci0gICAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoc3RhcnRpbmdfcG9zaXRpb24sIGVuZGluZ19wb3NpdGlvbiwgZmFsc2UsIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAga0RhdGFTaXplKTsKLSAgfQotCi0gIHZvaWQgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoCi0gICAgICBpbnQgc3RhcnRpbmdfcG9zaXRpb24sIGludCBlbmRpbmdfcG9zaXRpb24sIGNvbnN0IHVpbnQ4KiBkYXRhLAotICAgICAgYm9vbCBleHBlY3Rfa2V5ZnJhbWUpIHsKLSAgICBDaGVja0V4cGVjdGVkQnVmZmVycyhzdGFydGluZ19wb3NpdGlvbiwgZW5kaW5nX3Bvc2l0aW9uLCBleHBlY3Rfa2V5ZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwga0RhdGFTaXplKTsKLSAgfQotCi0gIHZvaWQgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoCi0gICAgICBpbnQgc3RhcnRpbmdfcG9zaXRpb24sIGludCBlbmRpbmdfcG9zaXRpb24sIGJvb2wgZXhwZWN0X2tleWZyYW1lLAotICAgICAgY29uc3QgdWludDgqIGV4cGVjdGVkX2RhdGEsIGludCBleHBlY3RlZF9zaXplKSB7Ci0gICAgaW50IGN1cnJlbnRfcG9zaXRpb24gPSBzdGFydGluZ19wb3NpdGlvbjsKLSAgICBmb3IgKDsgY3VycmVudF9wb3NpdGlvbiA8PSBlbmRpbmdfcG9zaXRpb247IGN1cnJlbnRfcG9zaXRpb24rKykgewotICAgICAgc2NvcGVkX3JlZnB0cjxTdHJlYW1QYXJzZXJCdWZmZXI+IGJ1ZmZlcjsKLSAgICAgIFNvdXJjZUJ1ZmZlclN0cmVhbTo6U3RhdHVzIHN0YXR1cyA9IHN0cmVhbV8tPkdldE5leHRCdWZmZXIoJmJ1ZmZlcik7Ci0KLSAgICAgIEVYUEVDVF9ORShzdGF0dXMsIFNvdXJjZUJ1ZmZlclN0cmVhbTo6a0NvbmZpZ0NoYW5nZSk7Ci0gICAgICBpZiAoc3RhdHVzICE9IFNvdXJjZUJ1ZmZlclN0cmVhbTo6a1N1Y2Nlc3MpCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBpZiAoZXhwZWN0X2tleWZyYW1lICYmIGN1cnJlbnRfcG9zaXRpb24gPT0gc3RhcnRpbmdfcG9zaXRpb24pCi0gICAgICAgIEVYUEVDVF9UUlVFKGJ1ZmZlci0+SXNLZXlmcmFtZSgpKTsKLQotICAgICAgaWYgKGV4cGVjdGVkX2RhdGEpIHsKLSAgICAgICAgY29uc3QgdWludDgqIGFjdHVhbF9kYXRhID0gYnVmZmVyLT5HZXREYXRhKCk7Ci0gICAgICAgIGNvbnN0IGludCBhY3R1YWxfc2l6ZSA9IGJ1ZmZlci0+R2V0RGF0YVNpemUoKTsKLSAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkX3NpemUsIGFjdHVhbF9zaXplKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGQ6Om1pbihhY3R1YWxfc2l6ZSwgZXhwZWN0ZWRfc2l6ZSk7IGkrKykgewotICAgICAgICAgIEVYUEVDVF9FUShleHBlY3RlZF9kYXRhW2ldLCBhY3R1YWxfZGF0YVtpXSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgRVhQRUNUX0VRKGJ1ZmZlci0+R2V0RGVjb2RlVGltZXN0YW1wKCkgLyBmcmFtZV9kdXJhdGlvbl8sCi0gICAgICAgICAgICAgICAgY3VycmVudF9wb3NpdGlvbik7Ci0gICAgfQotCi0gICAgRVhQRUNUX0VRKGVuZGluZ19wb3NpdGlvbiArIDEsIGN1cnJlbnRfcG9zaXRpb24pOwotICB9Ci0KLSAgdm9pZCBDaGVja0V4cGVjdGVkQnVmZmVycyhjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWQpIHsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdGltZXN0YW1wczsKLSAgICBiYXNlOjpTcGxpdFN0cmluZyhleHBlY3RlZCwgJyAnLCAmdGltZXN0YW1wcyk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aW1lc3RhbXBzLnNpemUoKTsgaSsrKSB7Ci0gICAgICBzY29wZWRfcmVmcHRyPFN0cmVhbVBhcnNlckJ1ZmZlcj4gYnVmZmVyOwotICAgICAgU291cmNlQnVmZmVyU3RyZWFtOjpTdGF0dXMgc3RhdHVzID0gc3RyZWFtXy0+R2V0TmV4dEJ1ZmZlcigmYnVmZmVyKTsKLQotICAgICAgRVhQRUNUX0VRKFNvdXJjZUJ1ZmZlclN0cmVhbTo6a1N1Y2Nlc3MsIHN0YXR1cyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IFNvdXJjZUJ1ZmZlclN0cmVhbTo6a1N1Y2Nlc3MpCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgICAgIHNzIDw8IGJ1ZmZlci0+R2V0RGVjb2RlVGltZXN0YW1wKCkuSW5NaWxsaXNlY29uZHMoKTsKLSAgICAgIGlmIChidWZmZXItPklzS2V5ZnJhbWUoKSkKLSAgICAgICAgc3MgPDwgIksiOwotICAgICAgRVhQRUNUX0VRKHRpbWVzdGFtcHNbaV0sIHNzLnN0cigpKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIENoZWNrTm9OZXh0QnVmZmVyKCkgewotICAgIHNjb3BlZF9yZWZwdHI8U3RyZWFtUGFyc2VyQnVmZmVyPiBidWZmZXI7Ci0gICAgRVhQRUNUX0VRKHN0cmVhbV8tPkdldE5leHRCdWZmZXIoJmJ1ZmZlciksIFNvdXJjZUJ1ZmZlclN0cmVhbTo6a05lZWRCdWZmZXIpOwotICB9Ci0KLSAgdm9pZCBDaGVja0NvbmZpZyhjb25zdCBWaWRlb0RlY29kZXJDb25maWcmIGNvbmZpZykgewotICAgIGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgYWN0dWFsID0gc3RyZWFtXy0+R2V0Q3VycmVudFZpZGVvRGVjb2RlckNvbmZpZygpOwotICAgIEVYUEVDVF9UUlVFKGFjdHVhbC5NYXRjaGVzKGNvbmZpZykpCi0gICAgICAgIDw8ICJFeHBlY3RlZDogIiA8PCBjb25maWcuQXNIdW1hblJlYWRhYmxlU3RyaW5nKCkKLSAgICAgICAgPDwgIlxuQWN0dWFsOiAiIDw8IGFjdHVhbC5Bc0h1bWFuUmVhZGFibGVTdHJpbmcoKTsKLSAgfQotCi0gIGJhc2U6OlRpbWVEZWx0YSBmcmFtZV9kdXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIGZyYW1lX2R1cmF0aW9uXzsgfQotCi0gIHNjb3BlZF9wdHI8U291cmNlQnVmZmVyU3RyZWFtPiBzdHJlYW1fOwotICBWaWRlb0RlY29kZXJDb25maWcgY29uZmlnXzsKLQotIHByaXZhdGU6Ci0gIGJhc2U6OlRpbWVEZWx0YSBDb252ZXJ0VG9GcmFtZUR1cmF0aW9uKGludCBmcmFtZXNfcGVyX3NlY29uZCkgewotICAgIHJldHVybiBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWNyb3NlY29uZHMoCi0gICAgICAgIGJhc2U6OlRpbWU6OmtNaWNyb3NlY29uZHNQZXJTZWNvbmQgLyBmcmFtZXNfcGVyX3NlY29uZCk7Ci0gIH0KLQotICB2b2lkIEFwcGVuZEJ1ZmZlcnMoaW50IHN0YXJ0aW5nX3Bvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcl9vZl9idWZmZXJzLAotICAgICAgICAgICAgICAgICAgICAgYm9vbCBiZWdpbl9tZWRpYV9zZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhIGZpcnN0X2J1ZmZlcl9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICBib29sIGV4cGVjdF9zdWNjZXNzLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgewotICAgIGlmIChiZWdpbl9tZWRpYV9zZWdtZW50KQotICAgICAgc3RyZWFtXy0+T25OZXdNZWRpYVNlZ21lbnQoc3RhcnRpbmdfcG9zaXRpb24gKiBmcmFtZV9kdXJhdGlvbl8pOwotCi0gICAgaW50IGtleWZyYW1lX2ludGVydmFsID0gZnJhbWVzX3Blcl9zZWNvbmRfIC8ga2V5ZnJhbWVzX3Blcl9zZWNvbmRfOwotCi0gICAgU291cmNlQnVmZmVyU3RyZWFtOjpCdWZmZXJRdWV1ZSBxdWV1ZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcl9vZl9idWZmZXJzOyBpKyspIHsKLSAgICAgIGludCBwb3NpdGlvbiA9IHN0YXJ0aW5nX3Bvc2l0aW9uICsgaTsKLSAgICAgIGJvb2wgaXNfa2V5ZnJhbWUgPSBwb3NpdGlvbiAlIGtleWZyYW1lX2ludGVydmFsID09IDA7Ci0gICAgICBzY29wZWRfcmVmcHRyPFN0cmVhbVBhcnNlckJ1ZmZlcj4gYnVmZmVyID0KLSAgICAgICAgICBTdHJlYW1QYXJzZXJCdWZmZXI6OkNvcHlGcm9tKGRhdGEsIHNpemUsIGlzX2tleWZyYW1lKTsKLSAgICAgIGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXAgPSBmcmFtZV9kdXJhdGlvbl8gKiBwb3NpdGlvbjsKLQotICAgICAgaWYgKGkgPT0gMCkKLSAgICAgICAgdGltZXN0YW1wICs9IGZpcnN0X2J1ZmZlcl9vZmZzZXQ7Ci0gICAgICBidWZmZXItPlNldERlY29kZVRpbWVzdGFtcCh0aW1lc3RhbXApOwotCi0gICAgICAvLyBTaW11bGF0ZSBhbiBJQkIuLi5CQlAgcGF0dGVybiBpbiB3aGljaCBhbGwgQi1mcmFtZXMgcmVmZXJlbmNlIGJvdGgKLSAgICAgIC8vIHRoZSBJLSBhbmQgUC1mcmFtZXMuIEZvciBhIEdPUCB3aXRoIHBsYXliYWNrIG9yZGVyIDEyMzQ1LCB0aGlzIHdvdWxkCi0gICAgICAvLyByZXN1bHQgaW4gYSBkZWNvZGUgdGltZXN0YW1wIG9yZGVyIG9mIDE1MjM0LgotICAgICAgYmFzZTo6VGltZURlbHRhIHByZXNlbnRhdGlvbl90aW1lc3RhbXA7Ci0gICAgICBpZiAoaXNfa2V5ZnJhbWUpIHsKLSAgICAgICAgcHJlc2VudGF0aW9uX3RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKLSAgICAgIH0gZWxzZSBpZiAoKHBvc2l0aW9uIC0gMSkgJSBrZXlmcmFtZV9pbnRlcnZhbCA9PSAwKSB7Ci0gICAgICAgIC8vIFRoaXMgaXMgdGhlIFAtZnJhbWUgKGZpcnN0IGZyYW1lIGZvbGxvd2luZyB0aGUgSS1mcmFtZSkKLSAgICAgICAgcHJlc2VudGF0aW9uX3RpbWVzdGFtcCA9Ci0gICAgICAgICAgICAodGltZXN0YW1wICsgZnJhbWVfZHVyYXRpb25fICogKGtleWZyYW1lX2ludGVydmFsIC0gMikpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJlc2VudGF0aW9uX3RpbWVzdGFtcCA9IHRpbWVzdGFtcCAtIGZyYW1lX2R1cmF0aW9uXzsKLSAgICAgIH0KLSAgICAgIGJ1ZmZlci0+U2V0VGltZXN0YW1wKHByZXNlbnRhdGlvbl90aW1lc3RhbXApOwotCi0gICAgICBxdWV1ZS5wdXNoX2JhY2soYnVmZmVyKTsKLSAgICB9Ci0gICAgaWYgKCFxdWV1ZS5lbXB0eSgpKQotICAgICAgRVhQRUNUX0VRKGV4cGVjdF9zdWNjZXNzLCBzdHJlYW1fLT5BcHBlbmQocXVldWUpKTsKLSAgfQotCi0gIHZvaWQgQXBwZW5kQnVmZmVycyhjb25zdCBzdGQ6OnN0cmluZyYgYnVmZmVyc190b19hcHBlbmQsCi0gICAgICAgICAgICAgICAgICAgICBib29sIHN0YXJ0X25ld19zZWdtZW50LCBib29sIG9uZV9ieV9vbmUpIHsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdGltZXN0YW1wczsKLSAgICBiYXNlOjpTcGxpdFN0cmluZyhidWZmZXJzX3RvX2FwcGVuZCwgJyAnLCAmdGltZXN0YW1wcyk7Ci0KLSAgICBDSEVDS19HVCh0aW1lc3RhbXBzLnNpemUoKSwgMHUpOwotCi0gICAgU291cmNlQnVmZmVyU3RyZWFtOjpCdWZmZXJRdWV1ZSBidWZmZXJzOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGltZXN0YW1wcy5zaXplKCk7IGkrKykgewotICAgICAgYm9vbCBpc19rZXlmcmFtZSA9IGZhbHNlOwotICAgICAgaWYgKEVuZHNXaXRoKHRpbWVzdGFtcHNbaV0sICJLIiwgdHJ1ZSkpIHsKLSAgICAgICAgaXNfa2V5ZnJhbWUgPSB0cnVlOwotICAgICAgICAvLyBSZW1vdmUgdGhlICJLIiBvZmYgb2YgdGhlIHRva2VuLgotICAgICAgICB0aW1lc3RhbXBzW2ldID0gdGltZXN0YW1wc1tpXS5zdWJzdHIoMCwgdGltZXN0YW1wc1tpXS5sZW5ndGgoKSAtIDEpOwotICAgICAgfQotICAgICAgaW50IHRpbWVfaW5fbXM7Ci0gICAgICBDSEVDSyhiYXNlOjpTdHJpbmdUb0ludCh0aW1lc3RhbXBzW2ldLCAmdGltZV9pbl9tcykpOwotCi0gICAgICAvLyBDcmVhdGUgYnVmZmVyLgotICAgICAgc2NvcGVkX3JlZnB0cjxTdHJlYW1QYXJzZXJCdWZmZXI+IGJ1ZmZlciA9Ci0gICAgICAgICAgU3RyZWFtUGFyc2VyQnVmZmVyOjpDb3B5RnJvbSgma0RhdGFBLCBrRGF0YVNpemUsIGlzX2tleWZyYW1lKTsKLSAgICAgIGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXAgPQotICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyh0aW1lX2luX21zKTsKLSAgICAgIGJ1ZmZlci0+U2V0RGVjb2RlVGltZXN0YW1wKHRpbWVzdGFtcCk7Ci0KLSAgICAgIGlmIChpID09IDB1ICYmIHN0YXJ0X25ld19zZWdtZW50KQotICAgICAgICBzdHJlYW1fLT5Pbk5ld01lZGlhU2VnbWVudCh0aW1lc3RhbXApOwotCi0gICAgICBidWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOwotICAgIH0KLQotICAgIGlmICghb25lX2J5X29uZSkgewotICAgICAgRVhQRUNUX1RSVUUoc3RyZWFtXy0+QXBwZW5kKGJ1ZmZlcnMpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBBcHBlbmQgZWFjaCBidWZmZXIgb25lIGJ5IG9uZS4KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZmZlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgIFNvdXJjZUJ1ZmZlclN0cmVhbTo6QnVmZmVyUXVldWUgd3JhcHBlcjsKLSAgICAgIHdyYXBwZXIucHVzaF9iYWNrKGJ1ZmZlcnNbaV0pOwotICAgICAgRVhQRUNUX1RSVUUoc3RyZWFtXy0+QXBwZW5kKHdyYXBwZXIpKTsKLSAgICB9Ci0gIH0KLQotICBpbnQgZnJhbWVzX3Blcl9zZWNvbmRfOwotICBpbnQga2V5ZnJhbWVzX3Blcl9zZWNvbmRfOwotICBiYXNlOjpUaW1lRGVsdGEgZnJhbWVfZHVyYXRpb25fOwotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU291cmNlQnVmZmVyU3RyZWFtVGVzdCk7Ci19OwotCi1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgQXBwZW5kX1NpbmdsZVJhbmdlKSB7Ci0gIC8vIEFwcGVuZCAxNSBidWZmZXJzIGF0IHBvc2l0aW9ucyAwIHRocm91Z2ggMTQuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMCwgMTUpOwotCi0gIC8vIENoZWNrIGV4cGVjdGVkIHJhbmdlLgotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFswLDE0KSB9Iik7Ci0gIC8vIENoZWNrIGJ1ZmZlcnMgaW4gcmFuZ2UuCi0gIFNlZWsoMCk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDAsIDE0KTsKLX0KLQotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIEFwcGVuZF9TaW5nbGVSYW5nZV9PbmVCdWZmZXJBdEFUaW1lKSB7Ci0gIC8vIEFwcGVuZCAxNSBidWZmZXJzIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDAsIG9uZSBidWZmZXIgYXQgYSB0aW1lLgotICBOZXdTZWdtZW50QXBwZW5kKDAsIDEpOwotICBmb3IgKGludCBpID0gMTsgaSA8IDE1OyBpKyspCi0gICAgQXBwZW5kQnVmZmVycyhpLCAxKTsKLQotICAvLyBDaGVjayBleHBlY3RlZCByYW5nZS4KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbMCwxNCkgfSIpOwotICAvLyBDaGVjayBidWZmZXJzIGluIHJhbmdlLgotICBTZWVrKDApOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygwLCAxNCk7Ci19Ci0KLVRFU1RfRihTb3VyY2VCdWZmZXJTdHJlYW1UZXN0LCBBcHBlbmRfRGlzam9pbnRSYW5nZXMpIHsKLSAgLy8gQXBwZW5kIDUgYnVmZmVycyBhdCBwb3NpdGlvbnMgMCB0aHJvdWdoIDQuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMCwgNSk7Ci0KLSAgLy8gQXBwZW5kIDEwIGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDE1IHRocm91Z2ggMjQuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMTUsIDEwKTsKLQotICAvLyBDaGVjayBleHBlY3RlZCByYW5nZXMuCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzAsNCkgWzE1LDI0KSB9Iik7Ci0gIC8vIENoZWNrIGJ1ZmZlcnMgaW4gcmFuZ2VzLgotICBTZWVrKDApOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygwLCA0KTsKLSAgU2VlaygxNSk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDE1LCAyNCk7Ci19Ci0KLVRFU1RfRihTb3VyY2VCdWZmZXJTdHJlYW1UZXN0LCBBcHBlbmRfQWRqYWNlbnRSYW5nZXMpIHsKLSAgLy8gQXBwZW5kIDEwIGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDAgdGhyb3VnaCA5LgotICBOZXdTZWdtZW50QXBwZW5kKDAsIDEwKTsKLQotICAvLyBBcHBlbmQgMTEgYnVmZmVycyBhdCBwb3NpdGlvbnMgMTUgdGhyb3VnaCAyNS4KLSAgTmV3U2VnbWVudEFwcGVuZCgxNSwgMTEpOwotCi0gIC8vIEFwcGVuZCA1IGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDEwIHRocm91Z2ggMTQgdG8gYnJpZGdlIHRoZSBnYXAuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMTAsIDUpOwotCi0gIC8vIENoZWNrIGV4cGVjdGVkIHJhbmdlLgotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFswLDI1KSB9Iik7Ci0gIC8vIENoZWNrIGJ1ZmZlcnMgaW4gcmFuZ2UuCi0gIFNlZWsoMCk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDAsIDI1KTsKLX0KLQotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIEFwcGVuZF9Eb2VzTm90QmVnaW5XaXRoS2V5ZnJhbWUpIHsKLSAgLy8gQXBwZW5kIGZhaWxzIGJlY2F1c2UgdGhlIHJhbmdlIGRvZXNuJ3QgYmVnaW4gd2l0aCBhIGtleWZyYW1lLgotICBOZXdTZWdtZW50QXBwZW5kX0V4cGVjdEZhaWx1cmUoMywgMik7Ci0KLSAgLy8gQXBwZW5kIDEwIGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDUgdGhyb3VnaCAxNC4KLSAgTmV3U2VnbWVudEFwcGVuZCg1LCAxMCk7Ci0KLSAgLy8gQ2hlY2sgZXhwZWN0ZWQgcmFuZ2UuCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzUsMTQpIH0iKTsKLSAgLy8gQ2hlY2sgYnVmZmVycyBpbiByYW5nZS4KLSAgU2Vlayg1KTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoNSwgMTQpOwotCi0gIC8vIEFwcGVuZCBmYWlscyBiZWNhdXNlIHRoZSByYW5nZSBkb2Vzbid0IGJlZ2luIHdpdGggYSBrZXlmcmFtZS4KLSAgTmV3U2VnbWVudEFwcGVuZF9FeHBlY3RGYWlsdXJlKDE3LCAzKTsKLQotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFs1LDE0KSB9Iik7Ci0gIFNlZWsoNSk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDUsIDE0KTsKLX0KLQotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIEFwcGVuZF9Eb2VzTm90QmVnaW5XaXRoS2V5ZnJhbWVfQWRqYWNlbnQpIHsKLSAgLy8gQXBwZW5kIDggYnVmZmVycyBhdCBwb3NpdGlvbnMgMCB0aHJvdWdoIDcuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMCwgOCk7Ci0KLSAgLy8gTm93IHN0YXJ0IGEgbmV3IG1lZGlhIHNlZ21lbnQgYXQgcG9zaXRpb24gOC4gQXBwZW5kIHNob3VsZCBmYWlsIGJlY2F1c2UKLSAgLy8gdGhlIG1lZGlhIHNlZ21lbnQgZG9lcyBub3QgYmVnaW4gd2l0aCBhIGtleWZyYW1lLgotICBOZXdTZWdtZW50QXBwZW5kX0V4cGVjdEZhaWx1cmUoOCwgMik7Ci0KLSAgLy8gQ2hlY2sgZXhwZWN0ZWQgcmFuZ2UuCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzAsNykgfSIpOwotICAvLyBDaGVjayBidWZmZXJzIGluIHJhbmdlLgotICBTZWVrKDApOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygwLCA3KTsKLX0KLQotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIENvbXBsZXRlX092ZXJsYXApIHsKLSAgLy8gQXBwZW5kIDUgYnVmZmVycyBhdCBwb3NpdGlvbnMgNSB0aHJvdWdoIDkuCi0gIE5ld1NlZ21lbnRBcHBlbmQoNSwgNSk7Ci0KLSAgLy8gQXBwZW5kIDE1IGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDAgdGhyb3VnaCAxNC4KLSAgTmV3U2VnbWVudEFwcGVuZCgwLCAxNSk7Ci0KLSAgLy8gQ2hlY2sgZXhwZWN0ZWQgcmFuZ2UuCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzAsMTQpIH0iKTsKLSAgLy8gQ2hlY2sgYnVmZmVycyBpbiByYW5nZS4KLSAgU2VlaygwKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMCwgMTQpOwotfQotCi1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgQ29tcGxldGVfT3ZlcmxhcF9FZGdlQ2FzZSkgewotICAvLyBNYWtlIGVhY2ggZnJhbWUgYSBrZXlmcmFtZSBzbyB0aGF0IGl0J3Mgb2theSB0byBvdmVybGFwIGZyYW1lcyBhdCBhbnkgcG9pbnQKLSAgLy8gKGluc3RlYWQgb2YgbmVlZGluZyB0byByZXNwZWN0IGtleWZyYW1lIGJvdW5kYXJpZXMpLgotICBTZXRTdHJlYW1JbmZvKDMwLCAzMCk7Ci0KLSAgLy8gQXBwZW5kIDYgYnVmZmVycyBhdCBwb3NpdGlvbnMgNiB0aHJvdWdoIDExLgotICBOZXdTZWdtZW50QXBwZW5kKDYsIDYpOwotCi0gIC8vIEFwcGVuZCA4IGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDUgdGhyb3VnaCAxMi4KLSAgTmV3U2VnbWVudEFwcGVuZCg1LCA4KTsKLQotICAvLyBDaGVjayBleHBlY3RlZCByYW5nZS4KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbNSwxMikgfSIpOwotICAvLyBDaGVjayBidWZmZXJzIGluIHJhbmdlLgotICBTZWVrKDUpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycyg1LCAxMik7Ci19Ci0KLVRFU1RfRihTb3VyY2VCdWZmZXJTdHJlYW1UZXN0LCBTdGFydF9PdmVybGFwKSB7Ci0gIC8vIEFwcGVuZCAxMCBidWZmZXJzIGF0IHBvc2l0aW9ucyA1IHRocm91Z2ggMTQuCi0gIE5ld1NlZ21lbnRBcHBlbmQoNSwgNSk7Ci0KLSAgLy8gQXBwZW5kIDYgYnVmZmVycyBhdCBwb3NpdGlvbnMgMTAgdGhyb3VnaCAxNS4KLSAgTmV3U2VnbWVudEFwcGVuZCgxMCwgNik7Ci0KLSAgLy8gQ2hlY2sgZXhwZWN0ZWQgcmFuZ2UuCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzUsMTUpIH0iKTsKLSAgLy8gQ2hlY2sgYnVmZmVycyBpbiByYW5nZS4KLSAgU2Vlayg1KTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoNSwgMTUpOwotfQotCi1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgRW5kX092ZXJsYXApIHsKLSAgLy8gQXBwZW5kIDEwIGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDEwIHRocm91Z2ggMTkuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMTAsIDEwKTsKLQotICAvLyBBcHBlbmQgMTAgYnVmZmVycyBhdCBwb3NpdGlvbnMgNSB0aHJvdWdoIDE0LgotICBOZXdTZWdtZW50QXBwZW5kKDUsIDEwKTsKLQotICAvLyBDaGVjayBleHBlY3RlZCByYW5nZS4KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbNSwxOSkgfSIpOwotICAvLyBDaGVjayBidWZmZXJzIGluIHJhbmdlLgotICBTZWVrKDUpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycyg1LCAxOSk7Ci19Ci0KLVRFU1RfRihTb3VyY2VCdWZmZXJTdHJlYW1UZXN0LCBFbmRfT3ZlcmxhcF9TZXZlcmFsKSB7Ci0gIC8vIEFwcGVuZCAxMCBidWZmZXJzIGF0IHBvc2l0aW9ucyAxMCB0aHJvdWdoIDE5LgotICBOZXdTZWdtZW50QXBwZW5kKDEwLCAxMCk7Ci0KLSAgLy8gQXBwZW5kIDggYnVmZmVycyBhdCBwb3NpdGlvbnMgNSB0aHJvdWdoIDEyLgotICBOZXdTZWdtZW50QXBwZW5kKDUsIDgpOwotCi0gIC8vIENoZWNrIGV4cGVjdGVkIHJhbmdlczogc3RyZWFtIHNob3VsZCBub3QgaGF2ZSBrZXB0IGJ1ZmZlcnMgMTMgYW5kIDE0Ci0gIC8vIGJlY2F1c2UgdGhlIGtleWZyYW1lIG9uIHdoaWNoIHRoZXkgZGVwZW5kZWQgd2FzIG92ZXJ3cml0dGVuLgotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFs1LDEyKSBbMTUsMTkpIH0iKTsKLQotICAvLyBDaGVjayBidWZmZXJzIGluIHJhbmdlLgotICBTZWVrKDUpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycyg1LCAxMik7Ci0gIENoZWNrTm9OZXh0QnVmZmVyKCk7Ci0KLSAgU2VlaygxOSk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDE1LCAxOSk7Ci19Ci0KLVRFU1RfRihTb3VyY2VCdWZmZXJTdHJlYW1UZXN0LCBDb21wbGV0ZV9PdmVybGFwX1NldmVyYWwpIHsKLSAgLy8gQXBwZW5kIDIgYnVmZmVycyBhdCBwb3NpdGlvbnMgNSB0aHJvdWdoIDYuCi0gIE5ld1NlZ21lbnRBcHBlbmQoNSwgMik7Ci0KLSAgLy8gQXBwZW5kIDIgYnVmZmVycyBhdCBwb3NpdGlvbnMgMTAgdGhyb3VnaCAxMS4KLSAgTmV3U2VnbWVudEFwcGVuZCgxMCwgMik7Ci0KLSAgLy8gQXBwZW5kIDIgYnVmZmVycyBhdCBwb3NpdGlvbnMgMTUgdGhyb3VnaCAxNi4KLSAgTmV3U2VnbWVudEFwcGVuZCgxNSwgMik7Ci0KLSAgLy8gQ2hlY2sgZXhwZWN0ZWQgcmFuZ2VzLgotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFs1LDYpIFsxMCwxMSkgWzE1LDE2KSB9Iik7Ci0KLSAgLy8gQXBwZW5kIGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDAgdGhyb3VnaCAxOS4KLSAgTmV3U2VnbWVudEFwcGVuZCgwLCAyMCk7Ci0KLSAgLy8gQ2hlY2sgZXhwZWN0ZWQgcmFuZ2UuCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzAsMTkpIH0iKTsKLSAgLy8gQ2hlY2sgYnVmZmVycyBpbiByYW5nZS4KLSAgU2VlaygwKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMCwgMTkpOwotfQotCi1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgQ29tcGxldGVfT3ZlcmxhcF9TZXZlcmFsX1RoZW5fTWVyZ2UpIHsKLSAgLy8gQXBwZW5kIDIgYnVmZmVycyBhdCBwb3NpdGlvbnMgNSB0aHJvdWdoIDYuCi0gIE5ld1NlZ21lbnRBcHBlbmQoNSwgMik7Ci0KLSAgLy8gQXBwZW5kIDIgYnVmZmVycyBhdCBwb3NpdGlvbnMgMTAgdGhyb3VnaCAxMS4KLSAgTmV3U2VnbWVudEFwcGVuZCgxMCwgMik7Ci0KLSAgLy8gQXBwZW5kIDIgYnVmZmVycyBhdCBwb3NpdGlvbnMgMTUgdGhyb3VnaCAxNi4KLSAgTmV3U2VnbWVudEFwcGVuZCgxNSwgMik7Ci0KLSAgLy8gQXBwZW5kIDIgYnVmZmVycyBhdCBwb3NpdGlvbnMgMjAgdGhyb3VnaCAyMS4KLSAgTmV3U2VnbWVudEFwcGVuZCgyMCwgMik7Ci0KLSAgLy8gQXBwZW5kIGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDAgdGhyb3VnaCAxOS4KLSAgTmV3U2VnbWVudEFwcGVuZCgwLCAyMCk7Ci0KLSAgLy8gQ2hlY2sgZXhwZWN0ZWQgcmFuZ2VzLgotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFswLDIxKSB9Iik7Ci0gIC8vIENoZWNrIGJ1ZmZlcnMgaW4gcmFuZ2UuCi0gIFNlZWsoMCk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDAsIDIxKTsKLX0KLQotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIENvbXBsZXRlX092ZXJsYXBfU2VsZWN0ZWQpIHsKLSAgLy8gQXBwZW5kIDEwIGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDUgdGhyb3VnaCAxNC4KLSAgTmV3U2VnbWVudEFwcGVuZCg1LCAxMCwgJmtEYXRhQSk7Ci0KLSAgLy8gU2VlayB0byBidWZmZXIgYXQgcG9zaXRpb24gNS4KLSAgU2Vlayg1KTsKLQotICAvLyBSZXBsYWNlIG9sZCBkYXRhIHdpdGggbmV3IGRhdGEuCi0gIE5ld1NlZ21lbnRBcHBlbmQoNSwgMTAsICZrRGF0YUIpOwotCi0gIC8vIENoZWNrIHJhbmdlcyBhcmUgY29ycmVjdC4KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbNSwxNCkgfSIpOwotCi0gIC8vIENoZWNrIHRoYXQgZGF0YSBoYXMgYmVlbiByZXBsYWNlZCB3aXRoIG5ldyBkYXRhLgotICBDaGVja0V4cGVjdGVkQnVmZmVycyg1LCAxNCwgJmtEYXRhQik7Ci19Ci0KLS8vIFRoaXMgdGVzdCBpcyB0ZXN0aW5nIHRoYXQgYSBjbGllbnQgY2FuIGFwcGVuZCBkYXRhIHRvIFNvdXJjZUJ1ZmZlclN0cmVhbSB0aGF0Ci0vLyBvdmVybGFwcyB0aGUgcmFuZ2UgZnJvbSB3aGljaCB0aGUgY2xpZW50IGlzIGN1cnJlbnRseSBncmFiYmluZyBidWZmZXJzLiBXZQotLy8gd291bGQgZXhwZWN0IHRoYXQgdGhlIFNvdXJjZUJ1ZmZlclN0cmVhbSB3b3VsZCByZXR1cm4gb2xkIGRhdGEgdW50aWwgaXQgaGl0cwotLy8gdGhlIGtleWZyYW1lIG9mIHRoZSBuZXcgZGF0YSwgYWZ0ZXIgd2hpY2ggaXQgd2lsbCByZXR1cm4gdGhlIG5ldyBkYXRhLgotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIENvbXBsZXRlX092ZXJsYXBfU2VsZWN0ZWRfVHJhY2tCdWZmZXIpIHsKLSAgLy8gQXBwZW5kIDEwIGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDUgdGhyb3VnaCAxNC4KLSAgTmV3U2VnbWVudEFwcGVuZCg1LCAxMCwgJmtEYXRhQSk7Ci0KLSAgLy8gU2VlayB0byBidWZmZXIgYXQgcG9zaXRpb24gNSBhbmQgZ2V0IG5leHQgYnVmZmVyLgotICBTZWVrKDUpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycyg1LCA1LCAma0RhdGFBKTsKLQotICAvLyBEbyBhIGNvbXBsZXRlIG92ZXJsYXAgYnkgYXBwZW5kaW5nIDIwIGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDAgdGhyb3VnaCAxOS4KLSAgTmV3U2VnbWVudEFwcGVuZCgwLCAyMCwgJmtEYXRhQik7Ci0KLSAgLy8gQ2hlY2sgcmFuZ2UgaXMgY29ycmVjdC4KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbMCwxOSkgfSIpOwotCi0gIC8vIEV4cGVjdCBvbGQgZGF0YSB1cCB1bnRpbCBuZXh0IGtleWZyYW1lIGluIG5ldyBkYXRhLgotICBDaGVja0V4cGVjdGVkQnVmZmVycyg2LCA5LCAma0RhdGFBKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMTAsIDEwLCAma0RhdGFCLCB0cnVlKTsKLQotICAvLyBFeHBlY3QgcmVzdCBvZiBkYXRhIHRvIGJlIG5ldy4KLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMTEsIDE5LCAma0RhdGFCKTsKLQotICAvLyBTZWVrIGJhY2sgdG8gYmVnaW5uaW5nOyBhbGwgZGF0YSBzaG91bGQgYmUgbmV3LgotICBTZWVrKDApOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygwLCAxOSwgJmtEYXRhQik7Ci0KLSAgLy8gQ2hlY2sgcmFuZ2UgY29udGludWVzIHRvIGJlIGNvcnJlY3QuCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzAsMTkpIH0iKTsKLX0KLQotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIENvbXBsZXRlX092ZXJsYXBfU2VsZWN0ZWRfRWRnZUNhc2UpIHsKLSAgLy8gQXBwZW5kIDEwIGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDUgdGhyb3VnaCAxNC4KLSAgTmV3U2VnbWVudEFwcGVuZCg1LCAxMCwgJmtEYXRhQSk7Ci0KLSAgLy8gU2VlayB0byBidWZmZXIgYXQgcG9zaXRpb24gNSBhbmQgZ2V0IG5leHQgYnVmZmVyLgotICBTZWVrKDUpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycyg1LCA1LCAma0RhdGFBKTsKLQotICAvLyBSZXBsYWNlIGV4aXN0aW5nIGRhdGEgd2l0aCBuZXcgZGF0YS4KLSAgTmV3U2VnbWVudEFwcGVuZCg1LCAxMCwgJmtEYXRhQik7Ci0KLSAgLy8gQ2hlY2sgcmFuZ2VzIGFyZSBjb3JyZWN0LgotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFs1LDE0KSB9Iik7Ci0KLSAgLy8gRXhwZWN0IG9sZCBkYXRhIHVwIHVudGlsIG5leHQga2V5ZnJhbWUgaW4gbmV3IGRhdGEuCi0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDYsIDksICZrRGF0YUEpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygxMCwgMTAsICZrRGF0YUIsIHRydWUpOwotCi0gIC8vIEV4cGVjdCByZXN0IG9mIGRhdGEgdG8gYmUgbmV3LgotICBDaGVja0V4cGVjdGVkQnVmZmVycygxMSwgMTQsICZrRGF0YUIpOwotCi0gIC8vIFNlZWsgYmFjayB0byBiZWdpbm5pbmc7IGFsbCBkYXRhIHNob3VsZCBiZSBuZXcuCi0gIFNlZWsoNSk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDUsIDE0LCAma0RhdGFCKTsKLQotICAvLyBDaGVjayByYW5nZSBjb250aW51ZXMgdG8gYmUgY29ycmVjdC4KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbNSwxNCkgfSIpOwotfQotCi1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgQ29tcGxldGVfT3ZlcmxhcF9TZWxlY3RlZF9NdWx0aXBsZSkgewotICBzdGF0aWMgY29uc3QgdWludDgga0RhdGFDID0gMHg1NTsKLSAgc3RhdGljIGNvbnN0IHVpbnQ4IGtEYXRhRCA9IDB4Nzc7Ci0KLSAgLy8gQXBwZW5kIDUgYnVmZmVycyBhdCBwb3NpdGlvbnMgNSB0aHJvdWdoIDkuCi0gIE5ld1NlZ21lbnRBcHBlbmQoNSwgNSwgJmtEYXRhQSk7Ci0KLSAgLy8gU2VlayB0byBidWZmZXIgYXQgcG9zaXRpb24gNSBhbmQgZ2V0IG5leHQgYnVmZmVyLgotICBTZWVrKDUpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycyg1LCA1LCAma0RhdGFBKTsKLQotICAvLyBSZXBsYWNlIGV4aXN0aW5nIGRhdGEgd2l0aCBuZXcgZGF0YS4KLSAgTmV3U2VnbWVudEFwcGVuZCg1LCA1LCAma0RhdGFCKTsKLQotICAvLyBUaGVuIHJlcGxhY2UgaXQgYWdhaW4gd2l0aCBkaWZmZXJlbnQgZGF0YS4KLSAgTmV3U2VnbWVudEFwcGVuZCg1LCA1LCAma0RhdGFDKTsKLQotICAvLyBOb3cgYXBwZW5kIDUgbmV3IGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDEwIHRocm91Z2ggMTQuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMTAsIDUsICZrRGF0YUMpOwotCi0gIC8vIE5vdyByZXBsYWNlIGFsbCB0aGUgZGF0YSBlbnRpcmVseS4KLSAgTmV3U2VnbWVudEFwcGVuZCg1LCAxMCwgJmtEYXRhRCk7Ci0KLSAgLy8gRXhwZWN0IGJ1ZmZlcnMgNiB0aHJvdWdoIDkgdG8gYmUgRGF0YUEsIGFuZCB0aGUgcmVtYWluaW5nCi0gIC8vIGJ1ZmZlcnMgdG8gYmUga0RhdGFELgotICBDaGVja0V4cGVjdGVkQnVmZmVycyg2LCA5LCAma0RhdGFBKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMTAsIDE0LCAma0RhdGFEKTsKLQotICAvLyBBdCB0aGlzIHBvaW50IHdlIGNhbm5vdCBmdWxmaWxsIHJlcXVlc3QuCi0gIENoZWNrTm9OZXh0QnVmZmVyKCk7Ci0KLSAgLy8gU2VlayBiYWNrIHRvIGJlZ2lubmluZzsgYWxsIGRhdGEgc2hvdWxkIGJlIG5ldy4KLSAgU2Vlayg1KTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoNSwgMTQsICZrRGF0YUQpOwotfQotCi1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgU3RhcnRfT3ZlcmxhcF9TZWxlY3RlZCkgewotICAvLyBBcHBlbmQgMTAgYnVmZmVycyBhdCBwb3NpdGlvbnMgMCB0aHJvdWdoIDkuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMCwgMTAsICZrRGF0YUEpOwotCi0gIC8vIFNlZWsgdG8gcG9zaXRpb24gNSwgdGhlbiBhZGQgYnVmZmVycyB0byBvdmVybGFwIGRhdGEgYXQgdGhhdCBwb3NpdGlvbi4KLSAgU2Vlayg1KTsKLSAgTmV3U2VnbWVudEFwcGVuZCg1LCAxMCwgJmtEYXRhQik7Ci0KLSAgLy8gQ2hlY2sgZXhwZWN0ZWQgcmFuZ2UuCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzAsMTQpIH0iKTsKLQotICAvLyBCZWNhdXNlIHdlIHNlZWtlZCB0byBhIGtleWZyYW1lLCB0aGUgbmV4dCBidWZmZXJzIHNob3VsZCBhbGwgYmUgbmV3IGRhdGEuCi0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDUsIDE0LCAma0RhdGFCKTsKLQotICAvLyBNYWtlIHN1cmUgYWxsIGRhdGEgaXMgY29ycmVjdC4KLSAgU2VlaygwKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMCwgNCwgJmtEYXRhQSk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDUsIDE0LCAma0RhdGFCKTsKLX0KLQotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIFN0YXJ0X092ZXJsYXBfU2VsZWN0ZWRfVHJhY2tCdWZmZXIpIHsKLSAgLy8gQXBwZW5kIDE1IGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDAgdGhyb3VnaCAxNC4KLSAgTmV3U2VnbWVudEFwcGVuZCgwLCAxNSwgJmtEYXRhQSk7Ci0KLSAgLy8gU2VlayB0byAxMCBhbmQgZ2V0IGJ1ZmZlci4KLSAgU2VlaygxMCk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDEwLCAxMCwgJmtEYXRhQSk7Ci0KLSAgLy8gTm93IGFwcGVuZCAxMCBidWZmZXJzIG9mIG5ldyBkYXRhIGF0IHBvc2l0aW9ucyAxMCB0aHJvdWdoIDE5LgotICBOZXdTZWdtZW50QXBwZW5kKDEwLCAxMCwgJmtEYXRhQik7Ci0KLSAgLy8gQ2hlY2sgZXhwZWN0ZWQgcmFuZ2UuCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzAsMTkpIH0iKTsKLQotICAvLyBUaGUgbmV4dCA0IGJ1ZmZlcnMgc2hvdWxkIGJlIGEgZnJvbSB0aGUgb2xkIGJ1ZmZlciwgZm9sbG93ZWQgYnkgYSBrZXlmcmFtZQotICAvLyBmcm9tIHRoZSBuZXcgZGF0YS4KLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMTEsIDE0LCAma0RhdGFBKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMTUsIDE1LCAma0RhdGFCLCB0cnVlKTsKLQotICAvLyBUaGUgcmVzdCBvZiB0aGUgYnVmZmVycyBzaG91bGQgYmUgbmV3IGRhdGEuCi0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDE2LCAxOSwgJmtEYXRhQik7Ci0KLSAgLy8gTm93IHNlZWsgdG8gdGhlIGJlZ2lubmluZzsgcG9zaXRpb25zIDAgdGhyb3VnaCA5IHNob3VsZCBiZSB0aGUgb3JpZ2luYWwKLSAgLy8gZGF0YSwgcG9zaXRpb25zIDEwIHRocm91Z2ggMTkgc2hvdWxkIGJlIHRoZSBuZXcgZGF0YS4KLSAgU2VlaygwKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMCwgOSwgJmtEYXRhQSk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDEwLCAxOSwgJmtEYXRhQik7Ci0KLSAgLy8gTWFrZSBzdXJlIHJhbmdlIGlzIHN0aWxsIGNvcnJlY3QuCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzAsMTkpIH0iKTsKLX0KLQotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIFN0YXJ0X092ZXJsYXBfU2VsZWN0ZWRfRWRnZUNhc2UpIHsKLSAgLy8gQXBwZW5kIDEwIGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDUgdGhyb3VnaCAxNC4KLSAgTmV3U2VnbWVudEFwcGVuZCg1LCAxMCwgJmtEYXRhQSk7Ci0KLSAgU2VlaygxMCk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDEwLCAxMCwgJmtEYXRhQSk7Ci0KLSAgLy8gTm93IHJlcGxhY2UgdGhlIGxhc3QgNSBidWZmZXJzIHdpdGggbmV3IGRhdGEuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMTAsIDUsICZrRGF0YUIpOwotCi0gIC8vIFRoZSBuZXh0IDQgYnVmZmVycyBzaG91bGQgYmUgdGhlIG9yaWdpYWwgZGF0YSwgaGVsZCBpbiB0aGUgdHJhY2sgYnVmZmVyLgotICBDaGVja0V4cGVjdGVkQnVmZmVycygxMSwgMTQsICZrRGF0YUEpOwotCi0gIC8vIFRoZSBuZXh0IGJ1ZmZlciBpcyBhdCBwb3NpdGlvbiAxNSwgc28gd2Ugc2hvdWxkIGZhaWwgdG8gZnVsZmlsbCB0aGUKLSAgLy8gcmVxdWVzdC4KLSAgQ2hlY2tOb05leHRCdWZmZXIoKTsKLQotICAvLyBOb3cgYXBwZW5kIGRhdGEgYXQgMTUgdGhyb3VnaCAxOSBhbmQgY2hlY2sgdG8gbWFrZSBzdXJlIGl0J3MgY29ycmVjdC4KLSAgTmV3U2VnbWVudEFwcGVuZCgxNSwgNSwgJmtEYXRhQik7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDE1LCAxOSwgJmtEYXRhQik7Ci0KLSAgLy8gU2VlayB0byBiZWdpbm5pbmcgb2YgYnVmZmVyZWQgcmFuZ2UgYW5kIGNoZWNrIGJ1ZmZlcnMuCi0gIFNlZWsoNSk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDUsIDksICZrRGF0YUEpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygxMCwgMTksICZrRGF0YUIpOwotCi0gIC8vIENoZWNrIGV4cGVjdGVkIHJhbmdlLgotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFs1LDE5KSB9Iik7Ci19Ci0KLS8vIFRoaXMgdGVzdCBjb3ZlcnMgdGhlIGNhc2Ugd2hlcmUgbmV3IGJ1ZmZlcnMgZW5kLW92ZXJsYXAgYW4gZXhpc3RpbmcsIHNlbGVjdGVkCi0vLyByYW5nZSwgYW5kIHRoZSBuZXh0IGJ1ZmZlciBpcyBhIGtleWZyYW1lIHRoYXQncyBiZWluZyBvdmVybGFwcGVkIGJ5IG5ldwotLy8gYnVmZmVycy4KLS8vIGluZGV4OiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAKLS8vIG9sZCDCoDogICAgICAgICAgICpBKmEgYSBhIGEgQSBhIGEgYSBhCi0vLyBuZXcgwqA6ICBCIGIgYiBiIGIgQiBiIGIgYiBiCi0vLyBhZnRlcjogIEIgYiBiIGIgYipCKmIgYiBiIGIgQSBhIGEgYSBhCi1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgRW5kX092ZXJsYXBfU2VsZWN0ZWQpIHsKLSAgLy8gQXBwZW5kIDEwIGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDUgdGhyb3VnaCAxNC4KLSAgTmV3U2VnbWVudEFwcGVuZCg1LCAxMCwgJmtEYXRhQSk7Ci0KLSAgLy8gU2VlayB0byBwb3NpdGlvbiA1LgotICBTZWVrKDUpOwotCi0gIC8vIE5vdyBhcHBlbmQgMTAgYnVmZmVycyBhdCBwb3NpdGlvbnMgMCB0aHJvdWdoIDkuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMCwgMTAsICZrRGF0YUIpOwotCi0gIC8vIENoZWNrIGV4cGVjdGVkIHJhbmdlLgotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFswLDE0KSB9Iik7Ci0KLSAgLy8gQmVjYXVzZSB3ZSBzZWVrZWQgdG8gYSBrZXlmcmFtZSwgdGhlIG5leHQgYnVmZmVycyBzaG91bGQgYmUgbmV3LgotICBDaGVja0V4cGVjdGVkQnVmZmVycyg1LCA5LCAma0RhdGFCKTsKLQotICAvLyBNYWtlIHN1cmUgYWxsIGRhdGEgaXMgY29ycmVjdC4KLSAgU2VlaygwKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMCwgOSwgJmtEYXRhQik7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDEwLCAxNCwgJmtEYXRhQSk7Ci19Ci0KLS8vIFRoaXMgdGVzdCBjb3ZlcnMgdGhlIGNhc2Ugd2hlcmUgbmV3IGJ1ZmZlcnMgZW5kLW92ZXJsYXAgYW4gZXhpc3RpbmcsIHNlbGVjdGVkCi0vLyByYW5nZSwgYW5kIHRoZSBuZXh0IGJ1ZmZlciBpbiB0aGUgcmFuZ2UgaXMgYWZ0ZXIgdGhlIG5ld2x5IGFwcGVuZGVkIGJ1ZmZlcnMuCi0vLyBJbiB0aGlzIHBhcnRpY3VsYXIgY2FzZSwgdGhlIGVuZCBvdmVybGFwIGRvZXMgbm90IHJlcXVpcmUgYSBzcGxpdC4KLS8vCi0vLyBpbmRleDogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwCi0vLyBvbGQgwqA6ICAgICAgICAgICB8QSBhIGEgYSBhIEEgYSBhKmEqYXwKLS8vIG5ldyDCoDogIEIgYiBiIGIgYiBCIGIgYiBiIGIKLS8vIGFmdGVyOiB8QiBiIGIgYiBiIEIgYiBiIGIgYiBBIGEgYSphKmF8Ci1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgRW5kX092ZXJsYXBfU2VsZWN0ZWRfQWZ0ZXJFbmRPZk5ld18xKSB7Ci0gIC8vIEFwcGVuZCAxMCBidWZmZXJzIGF0IHBvc2l0aW9ucyA1IHRocm91Z2ggMTQuCi0gIE5ld1NlZ21lbnRBcHBlbmQoNSwgMTAsICZrRGF0YUEpOwotCi0gIC8vIFNlZWsgdG8gcG9zaXRpb24gMTAsIHRoZW4gbW92ZSB0byBwb3NpdGlvbiAxMy4KLSAgU2VlaygxMCk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDEwLCAxMiwgJmtEYXRhQSk7Ci0KLSAgLy8gTm93IGFwcGVuZCAxMCBidWZmZXJzIGF0IHBvc2l0aW9ucyAwIHRocm91Z2ggOS4KLSAgTmV3U2VnbWVudEFwcGVuZCgwLCAxMCwgJmtEYXRhQik7Ci0KLSAgLy8gQ2hlY2sgZXhwZWN0ZWQgcmFuZ2UuCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzAsMTQpIH0iKTsKLQotICAvLyBNYWtlIHN1cmUgcmVzdCBvZiBkYXRhIGlzIGFzIGV4cGVjdGVkLgotICBDaGVja0V4cGVjdGVkQnVmZmVycygxMywgMTQsICZrRGF0YUEpOwotCi0gIC8vIE1ha2Ugc3VyZSBhbGwgZGF0YSBpcyBjb3JyZWN0LgotICBTZWVrKDApOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygwLCA5LCAma0RhdGFCKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMTAsIDE0LCAma0RhdGFBKTsKLX0KLQotLy8gVGhpcyB0ZXN0IGNvdmVycyB0aGUgY2FzZSB3aGVyZSBuZXcgYnVmZmVycyBlbmQtb3ZlcmxhcCBhbiBleGlzdGluZywgc2VsZWN0ZWQKLS8vIHJhbmdlLCBhbmQgdGhlIG5leHQgYnVmZmVyIGluIHRoZSByYW5nZSBpcyBhZnRlciB0aGUgbmV3bHkgYXBwZW5kZWQgYnVmZmVycy4KLS8vIEluIHRoaXMgcGFydGljdWxhciBjYXNlLCB0aGUgZW5kIG92ZXJsYXAgcmVxdWlyZXMgYSBzcGxpdCwgYW5kIHRoZSBuZXh0Ci0vLyBidWZmZXIgaXMgaW4gdGhlIHNwbGl0IHJhbmdlLgotLy8KLS8vIGluZGV4OiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAKLS8vIG9sZCDCoDogICAgICAgICAgIHxBIGEgYSBhIGEgQSBhIGEqYSphfAotLy8gbmV3IMKgOiAgQiBiIGIgYiBiIEIgYiBiCi0vLyBhZnRlcjogfEIgYiBiIGIgYiBCIGIgYnwgICB8QSBhIGEqYSphfAotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIEVuZF9PdmVybGFwX1NlbGVjdGVkX0FmdGVyRW5kT2ZOZXdfMikgewotICAvLyBBcHBlbmQgMTAgYnVmZmVycyBhdCBwb3NpdGlvbnMgNSB0aHJvdWdoIDE0LgotICBOZXdTZWdtZW50QXBwZW5kKDUsIDEwLCAma0RhdGFBKTsKLQotICAvLyBTZWVrIHRvIHBvc2l0aW9uIDEwLCB0aGVuIG1vdmUgdG8gcG9zaXRpb24gMTMuCi0gIFNlZWsoMTApOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygxMCwgMTIsICZrRGF0YUEpOwotCi0gIC8vIE5vdyBhcHBlbmQgOCBidWZmZXJzIGF0IHBvc2l0aW9ucyAwIHRocm91Z2ggNy4KLSAgTmV3U2VnbWVudEFwcGVuZCgwLCA4LCAma0RhdGFCKTsKLQotICAvLyBDaGVjayBleHBlY3RlZCByYW5nZXMuCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzAsNykgWzEwLDE0KSB9Iik7Ci0KLSAgLy8gTWFrZSBzdXJlIHJlc3Qgb2YgZGF0YSBpcyBhcyBleHBlY3RlZC4KLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMTMsIDE0LCAma0RhdGFBKTsKLQotICAvLyBNYWtlIHN1cmUgYWxsIGRhdGEgaXMgY29ycmVjdC4KLSAgU2VlaygwKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMCwgNywgJmtEYXRhQik7Ci0gIENoZWNrTm9OZXh0QnVmZmVyKCk7Ci0KLSAgU2VlaygxMCk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDEwLCAxNCwgJmtEYXRhQSk7Ci19Ci0KLS8vIFRoaXMgdGVzdCBjb3ZlcnMgdGhlIGNhc2Ugd2hlcmUgbmV3IGJ1ZmZlcnMgZW5kLW92ZXJsYXAgYW4gZXhpc3RpbmcsIHNlbGVjdGVkCi0vLyByYW5nZSwgYW5kIHRoZSBuZXh0IGJ1ZmZlciBpbiB0aGUgcmFuZ2UgaXMgYWZ0ZXIgdGhlIG5ld2x5IGFwcGVuZGVkIGJ1ZmZlcnMuCi0vLyBJbiB0aGlzIHBhcnRpY3VsYXIgY2FzZSwgdGhlIGVuZCBvdmVybGFwIHJlcXVpcmVzIGEgc3BsaXQsIGFuZCB0aGUgbmV4dAotLy8gYnVmZmVyIHdhcyBpbiBiZXR3ZWVuIHRoZSBlbmQgb2YgdGhlIG5ldyBkYXRhIGFuZCB0aGUgc3BsaXQgcmFuZ2UuCi0vLwotLy8gaW5kZXg6ICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMAotLy8gb2xkIMKgOiAgICAgICAgICAgfEEgYSBhKmEqYSBBIGEgYSBhIGF8Ci0vLyBuZXcgwqA6ICBCIGIgYiBiIGIgQiBiIGIKLS8vIGFmdGVyOiB8QiBiIGIgYiBiIEIgYiBifCAgIHxBIGEgYSBhIGF8Ci0vLyB0cmFjazogICAgICAgICAgICAgICAgIHxhIGF8Ci1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgRW5kX092ZXJsYXBfU2VsZWN0ZWRfQWZ0ZXJFbmRPZk5ld18zKSB7Ci0gIC8vIEFwcGVuZCAxMCBidWZmZXJzIGF0IHBvc2l0aW9ucyA1IHRocm91Z2ggMTQuCi0gIE5ld1NlZ21lbnRBcHBlbmQoNSwgMTAsICZrRGF0YUEpOwotCi0gIC8vIFNlZWsgdG8gcG9zaXRpb24gNSwgdGhlbiBtb3ZlIHRvIHBvc2l0aW9uIDguCi0gIFNlZWsoNSk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDUsIDcsICZrRGF0YUEpOwotCi0gIC8vIE5vdyBhcHBlbmQgOCBidWZmZXJzIGF0IHBvc2l0aW9ucyAwIHRocm91Z2ggNy4KLSAgTmV3U2VnbWVudEFwcGVuZCgwLCA4LCAma0RhdGFCKTsKLQotICAvLyBDaGVjayBleHBlY3RlZCByYW5nZXMuCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzAsNykgWzEwLDE0KSB9Iik7Ci0KLSAgLy8gQ2hlY2sgZm9yIGRhdGEgaW4gdGhlIHRyYWNrIGJ1ZmZlci4KLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoOCwgOSwgJmtEYXRhQSk7Ci0gIC8vIFRoZSBidWZmZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHRyYWNrIGJ1ZmZlciBzaG91bGQgYmUgYSBrZXlmcmFtZS4KLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMTAsIDEwLCAma0RhdGFBLCB0cnVlKTsKLQotICAvLyBNYWtlIHN1cmUgYWxsIGRhdGEgaXMgY29ycmVjdC4KLSAgU2VlaygwKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMCwgNywgJmtEYXRhQik7Ci0gIFNlZWsoMTApOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygxMCwgMTQsICZrRGF0YUEpOwotfQotCi0vLyBUaGlzIHRlc3QgY292ZXJzIHRoZSBjYXNlIHdoZXJlIG5ldyBidWZmZXJzIGVuZC1vdmVybGFwIGFuIGV4aXN0aW5nLCBzZWxlY3RlZAotLy8gcmFuZ2UsIGFuZCB0aGUgbmV4dCBidWZmZXIgaW4gdGhlIHJhbmdlIGlzIG92ZXJsYXBwZWQgYnkgdGhlIG5ldyBidWZmZXJzLgotLy8gSW4gdGhpcyBwYXJ0aWN1bGFyIGNhc2UsIHRoZSBlbmQgb3ZlcmxhcCBkb2VzIG5vdCByZXF1aXJlIGEgc3BsaXQuCi0vLwotLy8gaW5kZXg6ICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMAotLy8gb2xkIMKgOiAgICAgICAgICAgfEEgYSBhKmEqYSBBIGEgYSBhIGF8Ci0vLyBuZXcgwqA6ICBCIGIgYiBiIGIgQiBiIGIgYiBiCi0vLyBhZnRlcjogfEIgYiBiIGIgYiBCIGIgYiBiIGIgQSBhIGEgYSBhfAotLy8gdHJhY2s6ICAgICAgICAgICAgICAgICB8YSBhfAotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIEVuZF9PdmVybGFwX1NlbGVjdGVkX092ZXJsYXBwZWRCeU5ld18xKSB7Ci0gIC8vIEFwcGVuZCAxMCBidWZmZXJzIGF0IHBvc2l0aW9ucyA1IHRocm91Z2ggMTQuCi0gIE5ld1NlZ21lbnRBcHBlbmQoNSwgMTAsICZrRGF0YUEpOwotCi0gIC8vIFNlZWsgdG8gcG9zaXRpb24gNSwgdGhlbiBtb3ZlIHRvIHBvc2l0aW9uIDguCi0gIFNlZWsoNSk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDUsIDcsICZrRGF0YUEpOwotCi0gIC8vIE5vdyBhcHBlbmQgMTAgYnVmZmVycyBhdCBwb3NpdGlvbnMgMCB0aHJvdWdoIDkuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMCwgMTAsICZrRGF0YUIpOwotCi0gIC8vIENoZWNrIGV4cGVjdGVkIHJhbmdlLgotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFswLDE0KSB9Iik7Ci0KLSAgLy8gQ2hlY2sgZm9yIGRhdGEgaW4gdGhlIHRyYWNrIGJ1ZmZlci4KLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoOCwgOSwgJmtEYXRhQSk7Ci0gIC8vIFRoZSBidWZmZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHRyYWNrIGJ1ZmZlciBzaG91bGQgYmUgYSBrZXlmcmFtZS4KLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMTAsIDEwLCAma0RhdGFBLCB0cnVlKTsKLQotICAvLyBNYWtlIHN1cmUgYWxsIGRhdGEgaXMgY29ycmVjdC4KLSAgU2VlaygwKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMCwgOSwgJmtEYXRhQik7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDEwLCAxNCwgJmtEYXRhQSk7Ci19Ci0KLS8vIFRoaXMgdGVzdCBjb3ZlcnMgdGhlIGNhc2Ugd2hlcmUgbmV3IGJ1ZmZlcnMgZW5kLW92ZXJsYXAgYW4gZXhpc3RpbmcsIHNlbGVjdGVkCi0vLyByYW5nZSwgYW5kIHRoZSBuZXh0IGJ1ZmZlciBpbiB0aGUgcmFuZ2UgaXMgb3ZlcmxhcHBlZCBieSB0aGUgbmV3IGJ1ZmZlcnMuCi0vLyBJbiB0aGlzIHBhcnRpY3VsYXIgY2FzZSwgdGhlIGVuZCBvdmVybGFwIHJlcXVpcmVzIGEgc3BsaXQsIGFuZCB0aGUgbmV4dAotLy8ga2V5ZnJhbWUgYWZ0ZXIgdGhlIHRyYWNrIGJ1ZmZlciBpcyBpbiB0aGUgc3BsaXQgcmFuZ2UuCi0vLwotLy8gaW5kZXg6ICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMAotLy8gb2xkIMKgOiAgICAgICAgICAgfEEqYSphIGEgYSBBIGEgYSBhIGF8Ci0vLyBuZXcgwqA6ICBCIGIgYiBiIGIgQiBiCi0vLyBhZnRlcjogfEIgYiBiIGIgYiBCIGJ8ICAgICB8QSBhIGEgYSBhfAotLy8gdHJhY2s6ICAgICAgICAgICAgIHxhIGEgYSBhfAotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIEVuZF9PdmVybGFwX1NlbGVjdGVkX092ZXJsYXBwZWRCeU5ld18yKSB7Ci0gIC8vIEFwcGVuZCAxMCBidWZmZXJzIGF0IHBvc2l0aW9ucyA1IHRocm91Z2ggMTQuCi0gIE5ld1NlZ21lbnRBcHBlbmQoNSwgMTAsICZrRGF0YUEpOwotCi0gIC8vIFNlZWsgdG8gcG9zaXRpb24gNSwgdGhlbiBtb3ZlIHRvIHBvc2l0aW9uIDYuCi0gIFNlZWsoNSk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDUsIDUsICZrRGF0YUEpOwotCi0gIC8vIE5vdyBhcHBlbmQgNyBidWZmZXJzIGF0IHBvc2l0aW9ucyAwIHRocm91Z2ggNi4KLSAgTmV3U2VnbWVudEFwcGVuZCgwLCA3LCAma0RhdGFCKTsKLQotICAvLyBDaGVjayBleHBlY3RlZCByYW5nZXMuCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzAsNikgWzEwLDE0KSB9Iik7Ci0KLSAgLy8gQ2hlY2sgZm9yIGRhdGEgaW4gdGhlIHRyYWNrIGJ1ZmZlci4KLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoNiwgOSwgJmtEYXRhQSk7Ci0gIC8vIFRoZSBidWZmZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHRyYWNrIGJ1ZmZlciBzaG91bGQgYmUgYSBrZXlmcmFtZS4KLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMTAsIDEwLCAma0RhdGFBLCB0cnVlKTsKLQotICAvLyBNYWtlIHN1cmUgYWxsIGRhdGEgaXMgY29ycmVjdC4KLSAgU2VlaygwKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMCwgNiwgJmtEYXRhQik7Ci0gIENoZWNrTm9OZXh0QnVmZmVyKCk7Ci0KLSAgU2VlaygxMCk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDEwLCAxNCwgJmtEYXRhQSk7Ci19Ci0KLS8vIFRoaXMgdGVzdCBjb3ZlcnMgdGhlIGNhc2Ugd2hlcmUgbmV3IGJ1ZmZlcnMgZW5kLW92ZXJsYXAgYW4gZXhpc3RpbmcsIHNlbGVjdGVkCi0vLyByYW5nZSwgYW5kIHRoZSBuZXh0IGJ1ZmZlciBpbiB0aGUgcmFuZ2UgaXMgb3ZlcmxhcHBlZCBieSB0aGUgbmV3IGJ1ZmZlcnMuCi0vLyBJbiB0aGlzIHBhcnRpY3VsYXIgY2FzZSwgdGhlIGVuZCBvdmVybGFwIHJlcXVpcmVzIGEgc3BsaXQsIGFuZCB0aGUgbmV4dAotLy8ga2V5ZnJhbWUgYWZ0ZXIgdGhlIHRyYWNrIGJ1ZmZlciBpcyBpbiB0aGUgcmFuZ2Ugd2l0aCB0aGUgbmV3IGJ1ZmZlcnMuCi0vLwotLy8gaW5kZXg6ICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMAotLy8gb2xkIMKgOiAgICAgICAgICAgfEEqYSphIGEgYSBBIGEgYSBhIGEgQSBhIGEgYSBhfAotLy8gbmV3IMKgOiAgQiBiIGIgYiBiIEIgYiBiIGIgYiBCIGIgYgotLy8gYWZ0ZXI6IHxCIGIgYiBiIGIgQiBiIGIgYiBiIEIgYiBifCAgIHxBIGEgYSBhIGF8Ci0vLyB0cmFjazogICAgICAgICAgICAgfGEgYSBhIGF8Ci1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgRW5kX092ZXJsYXBfU2VsZWN0ZWRfT3ZlcmxhcHBlZEJ5TmV3XzMpIHsKLSAgLy8gQXBwZW5kIDE1IGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDUgdGhyb3VnaCAxOS4KLSAgTmV3U2VnbWVudEFwcGVuZCg1LCAxNSwgJmtEYXRhQSk7Ci0KLSAgLy8gU2VlayB0byBwb3NpdGlvbiA1LCB0aGVuIG1vdmUgdG8gcG9zaXRpb24gNi4KLSAgU2Vlayg1KTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoNSwgNSwgJmtEYXRhQSk7Ci0KLSAgLy8gTm93IGFwcGVuZCAxMyBidWZmZXJzIGF0IHBvc2l0aW9ucyAwIHRocm91Z2ggMTIuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMCwgMTMsICZrRGF0YUIpOwotCi0gIC8vIENoZWNrIGV4cGVjdGVkIHJhbmdlcy4KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbMCwxMikgWzE1LDE5KSB9Iik7Ci0KLSAgLy8gQ2hlY2sgZm9yIGRhdGEgaW4gdGhlIHRyYWNrIGJ1ZmZlci4KLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoNiwgOSwgJmtEYXRhQSk7Ci0gIC8vIFRoZSBidWZmZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHRyYWNrIGJ1ZmZlciBzaG91bGQgYmUgYSBrZXlmcmFtZQotICAvLyBmcm9tIHRoZSBuZXcgZGF0YS4KLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMTAsIDEwLCAma0RhdGFCLCB0cnVlKTsKLQotICAvLyBNYWtlIHN1cmUgYWxsIGRhdGEgaXMgY29ycmVjdC4KLSAgU2VlaygwKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMCwgMTIsICZrRGF0YUIpOwotICBDaGVja05vTmV4dEJ1ZmZlcigpOwotCi0gIFNlZWsoMTUpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygxNSwgMTksICZrRGF0YUEpOwotfQotCi0vLyBUaGlzIHRlc3QgY292ZXJzIHRoZSBjYXNlIHdoZXJlIG5ldyBidWZmZXJzIGVuZC1vdmVybGFwIGFuIGV4aXN0aW5nLCBzZWxlY3RlZAotLy8gcmFuZ2UsIGFuZCB0aGVyZSBpcyBubyBrZXlmcmFtZSBhZnRlciB0aGUgZW5kIG9mIHRoZSBuZXcgYnVmZmVycy4KLS8vIGluZGV4OiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAKLS8vIG9sZCDCoDogICAgICAgICAgIHxBKmEqYSBhIGF8Ci0vLyBuZXcgwqA6ICBCIGIgYiBiIGIgQgotLy8gYWZ0ZXI6IHxCIGIgYiBiIGIgQnwKLS8vIHRyYWNrOiAgICAgICAgICAgICB8YSBhIGEgYXwKLVRFU1RfRihTb3VyY2VCdWZmZXJTdHJlYW1UZXN0LCBFbmRfT3ZlcmxhcF9TZWxlY3RlZF9Ob0tleWZyYW1lQWZ0ZXJOZXcpIHsKLSAgLy8gQXBwZW5kIDUgYnVmZmVycyBhdCBwb3NpdGlvbnMgNSB0aHJvdWdoIDkuCi0gIE5ld1NlZ21lbnRBcHBlbmQoNSwgNSwgJmtEYXRhQSk7Ci0KLSAgLy8gU2VlayB0byBwb3NpdGlvbiA1LCB0aGVuIG1vdmUgdG8gcG9zaXRpb24gNi4KLSAgU2Vlayg1KTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoNSwgNSwgJmtEYXRhQSk7Ci0KLSAgLy8gTm93IGFwcGVuZCA2IGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDAgdGhyb3VnaCA1LgotICBOZXdTZWdtZW50QXBwZW5kKDAsIDYsICZrRGF0YUIpOwotCi0gIC8vIENoZWNrIGV4cGVjdGVkIHJhbmdlLgotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFswLDUpIH0iKTsKLQotICAvLyBDaGVjayBmb3IgZGF0YSBpbiB0aGUgdHJhY2sgYnVmZmVyLgotICBDaGVja0V4cGVjdGVkQnVmZmVycyg2LCA5LCAma0RhdGFBKTsKLQotICAvLyBOb3cgdGhlcmUncyBubyBkYXRhIHRvIGZ1bGZpbGwgdGhlIHJlcXVlc3QuCi0gIENoZWNrTm9OZXh0QnVmZmVyKCk7Ci0KLSAgLy8gTGV0J3MgZmlsbCBpbiB0aGUgZ2FwLCBidWZmZXJzIDYgdGhyb3VnaCAxMC4KLSAgQXBwZW5kQnVmZmVycyg2LCA1LCAma0RhdGFCKTsKLQotICAvLyBXZSBzaG91bGQgYmUgYWJsZSB0byBnZXQgdGhlIG5leHQgYnVmZmVyLgotICBDaGVja0V4cGVjdGVkQnVmZmVycygxMCwgMTAsICZrRGF0YUIpOwotfQotCi0vLyBUaGlzIHRlc3QgY292ZXJzIHRoZSBjYXNlIHdoZXJlIG5ldyBidWZmZXJzIGVuZC1vdmVybGFwIGFuIGV4aXN0aW5nLCBzZWxlY3RlZAotLy8gcmFuZ2UsIGFuZCB0aGVyZSBpcyBubyBrZXlmcmFtZSBhZnRlciB0aGUgZW5kIG9mIHRoZSBuZXcgYnVmZmVycywgdGhlbiB0aGUKLS8vIHJhbmdlIGdldHMgc3BsaXQuCi0vLyBpbmRleDogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwCi0vLyBvbGQgwqA6ICAgICAgICAgICAgICAgICAgICAgfEEgYSBhIGEgYSBBKmEqfAotLy8gbmV3IMKgOiAgICAgICAgICAgIEIgYiBiIGIgYiBCIGIgYiBiIGIgQgotLy8gYWZ0ZXI6ICAgICAgICAgICB8QiBiIGIgYiBiIEIgYiBiIGIgYiBCfAotLy8gbmV3IMKgOiAgQSBhIGEgYSBhIEEKLS8vIGFmdGVyOiB8QSBhIGEgYSBhIEF8ICAgICAgIHxCIGIgYiBiIGIgQnwKLS8vIHRyYWNrOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxhfAotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIEVuZF9PdmVybGFwX1NlbGVjdGVkX05vS2V5ZnJhbWVBZnRlck5ldzIpIHsKLSAgLy8gQXBwZW5kIDcgYnVmZmVycyBhdCBwb3NpdGlvbnMgMTAgdGhyb3VnaCAxNi4KLSAgTmV3U2VnbWVudEFwcGVuZCgxMCwgNywgJmtEYXRhQSk7Ci0KLSAgLy8gU2VlayB0byBwb3NpdGlvbiAxNSwgdGhlbiBtb3ZlIHRvIHBvc2l0aW9uIDE2LgotICBTZWVrKDE1KTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMTUsIDE1LCAma0RhdGFBKTsKLQotICAvLyBOb3cgYXBwZW5kIDExIGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDUgdGhyb3VnaCAxNS4KLSAgTmV3U2VnbWVudEFwcGVuZCg1LCAxMSwgJmtEYXRhQik7Ci0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzUsMTUpIH0iKTsKLQotICAvLyBOb3cgZG8gYW5vdGhlciBlbmQtb3ZlcmxhcCB0byBzcGxpdCB0aGUgcmFuZ2UgaW50byB0d28gcGFydHMsIHdoZXJlIHRoZQotICAvLyAybmQgcmFuZ2Ugc2hvdWxkIGhhdmUgdGhlIG5leHQgYnVmZmVyIHBvc2l0aW9uLgotICBOZXdTZWdtZW50QXBwZW5kKDAsIDYsICZrRGF0YUEpOwotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFswLDUpIFsxMCwxNSkgfSIpOwotCi0gIC8vIENoZWNrIGZvciBkYXRhIGluIHRoZSB0cmFjayBidWZmZXIuCi0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDE2LCAxNiwgJmtEYXRhQSk7Ci0KLSAgLy8gTm93IHRoZXJlJ3Mgbm8gZGF0YSB0byBmdWxmaWxsIHRoZSByZXF1ZXN0LgotICBDaGVja05vTmV4dEJ1ZmZlcigpOwotCi0gIC8vIEFkZCBkYXRhIHRvIHRoZSAybmQgcmFuZ2UsIHNob3VsZCBub3QgYmUgYWJsZSB0byBmdWxmaWxsIHRoZSBuZXh0IHJlYWQKLSAgLy8gdW50aWwgd2UndmUgYWRkZWQgYSBrZXlmcmFtZS4KLSAgTmV3U2VnbWVudEFwcGVuZCgxNSwgMSwgJmtEYXRhQik7Ci0gIENoZWNrTm9OZXh0QnVmZmVyKCk7Ci0gIGZvciAoaW50IGkgPSAxNjsgaSA8PSAxOTsgaSsrKSB7Ci0gICAgQXBwZW5kQnVmZmVycyhpLCAxLCAma0RhdGFCKTsKLSAgICBDaGVja05vTmV4dEJ1ZmZlcigpOwotICB9Ci0KLSAgLy8gTm93IGFwcGVuZCBhIGtleWZyYW1lLgotICBBcHBlbmRCdWZmZXJzKDIwLCAxLCAma0RhdGFCKTsKLQotICAvLyBXZSBzaG91bGQgYmUgYWJsZSB0byBnZXQgdGhlIG5leHQgYnVmZmVyLgotICBDaGVja0V4cGVjdGVkQnVmZmVycygyMCwgMjAsICZrRGF0YUIsIHRydWUpOwotfQotCi0vLyBUaGlzIHRlc3QgY292ZXJzIHRoZSBjYXNlIHdoZXJlIG5ldyBidWZmZXJzIGVuZC1vdmVybGFwIGFuIGV4aXN0aW5nLCBzZWxlY3RlZAotLy8gcmFuZ2UsIGFuZCB0aGUgbmV4dCBrZXlmcmFtZSBpbiBhIHNlcGFyYXRlIHJhbmdlLgotLy8gaW5kZXg6ICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMAotLy8gb2xkIMKgOiAgICAgICAgICAgfEEqYSphIGEgYXwgICAgICAgICAgfEEgYSBhIGEgYXwKLS8vIG5ldyDCoDogIEIgYiBiIGIgYiBCCi0vLyBhZnRlcjogfEIgYiBiIGIgYiBCfCAgICAgICAgICAgICAgICAgIHxBIGEgYSBhIGF8Ci0vLyB0cmFjazogICAgICAgICAgICAgfGEgYSBhIGF8Ci1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgRW5kX092ZXJsYXBfU2VsZWN0ZWRfTm9LZXlmcmFtZUFmdGVyTmV3MykgewotICAvLyBBcHBlbmQgNSBidWZmZXJzIGF0IHBvc2l0aW9ucyA1IHRocm91Z2ggOS4KLSAgTmV3U2VnbWVudEFwcGVuZCg1LCA1LCAma0RhdGFBKTsKLQotICAvLyBBcHBlbmQgNSBidWZmZXJzIGF0IHBvc2l0aW9ucyAxNSB0aHJvdWdoIDE5LgotICBOZXdTZWdtZW50QXBwZW5kKDE1LCA1LCAma0RhdGFBKTsKLQotICAvLyBDaGVjayBleHBlY3RlZCByYW5nZS4KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbNSw5KSBbMTUsMTkpIH0iKTsKLQotICAvLyBTZWVrIHRvIHBvc2l0aW9uIDUsIHRoZW4gbW92ZSB0byBwb3NpdGlvbiA2LgotICBTZWVrKDUpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycyg1LCA1LCAma0RhdGFBKTsKLQotICAvLyBOb3cgYXBwZW5kIDYgYnVmZmVycyBhdCBwb3NpdGlvbnMgMCB0aHJvdWdoIDUuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMCwgNiwgJmtEYXRhQik7Ci0KLSAgLy8gQ2hlY2sgZXhwZWN0ZWQgcmFuZ2UuCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzAsNSkgWzE1LDE5KSB9Iik7Ci0KLSAgLy8gQ2hlY2sgZm9yIGRhdGEgaW4gdGhlIHRyYWNrIGJ1ZmZlci4KLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoNiwgOSwgJmtEYXRhQSk7Ci0KLSAgLy8gTm93IHRoZXJlJ3Mgbm8gZGF0YSB0byBmdWxmaWxsIHRoZSByZXF1ZXN0LgotICBDaGVja05vTmV4dEJ1ZmZlcigpOwotCi0gIC8vIExldCdzIGZpbGwgaW4gdGhlIGdhcCwgYnVmZmVycyA2IHRocm91Z2ggMTQuCi0gIEFwcGVuZEJ1ZmZlcnMoNiwgOSwgJmtEYXRhQik7Ci0KLSAgLy8gQ2hlY2sgZXhwZWN0ZWQgcmFuZ2UuCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzAsMTkpIH0iKTsKLQotICAvLyBXZSBzaG91bGQgYmUgYWJsZSB0byBnZXQgdGhlIG5leHQgYnVmZmVyLgotICBDaGVja0V4cGVjdGVkQnVmZmVycygxMCwgMTQsICZrRGF0YUIpOwotCi0gIC8vIFdlIHNob3VsZCBiZSBhYmxlIHRvIGdldCB0aGUgbmV4dCBidWZmZXIuCi0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDE1LCAxOSwgJmtEYXRhQSk7Ci19Ci0KLS8vIFRoaXMgdGVzdCBjb3ZlcnMgdGhlIGNhc2Ugd2hlbiBuZXcgYnVmZmVycyBvdmVybGFwIHRoZSBtaWRkbGUgb2YgYSBzZWxlY3RlZAotLy8gcmFuZ2UuIFRoaXMgdGVzdHMgdGhlIGNhc2Ugd2hlbiB0aGVyZSBpcyBubyBzcGxpdCBhbmQgdGhlIG5leHQgYnVmZmVyIGlzIGEKLS8vIGtleWZyYW1lLgotLy8gaW5kZXg6ICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMAotLy8gb2xkIMKgOiAgQSBhIGEgYSBhKkEqYSBhIGEgYSBBIGEgYSBhIGEKLS8vIG5ldyDCoDogICAgICAgICAgICBCIGIgYiBiIGIKLS8vIGFmdGVyOiAgQSBhIGEgYSBhKkIqYiBiIGIgYiBBIGEgYSBhIGEKLVRFU1RfRihTb3VyY2VCdWZmZXJTdHJlYW1UZXN0LCBNaWRkbGVfT3ZlcmxhcF9TZWxlY3RlZF8xKSB7Ci0gIC8vIEFwcGVuZCAxNSBidWZmZXJzIGF0IHBvc2l0aW9ucyAwIHRocm91Z2ggMTQuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMCwgMTUsICZrRGF0YUEpOwotCi0gIC8vIFNlZWsgdG8gcG9zaXRpb24gNS4KLSAgU2Vlayg1KTsKLQotICAvLyBOb3cgYXBwZW5kIDUgYnVmZmVycyBhdCBwb3NpdGlvbnMgNSB0aHJvdWdoIDkuCi0gIE5ld1NlZ21lbnRBcHBlbmQoNSwgNSwgJmtEYXRhQik7Ci0KLSAgLy8gQ2hlY2sgZXhwZWN0ZWQgcmFuZ2UuCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzAsMTQpIH0iKTsKLQotICAvLyBDaGVjayBmb3IgbmV4dCBkYXRhOyBzaG91bGQgYmUgbmV3IGRhdGEuCi0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDUsIDksICZrRGF0YUIpOwotCi0gIC8vIE1ha2Ugc3VyZSBhbGwgZGF0YSBpcyBjb3JyZWN0LgotICBTZWVrKDApOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygwLCA0LCAma0RhdGFBKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoNSwgOSwgJmtEYXRhQik7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDEwLCAxNCwgJmtEYXRhQSk7Ci19Ci0KLS8vIFRoaXMgdGVzdCBjb3ZlcnMgdGhlIGNhc2Ugd2hlbiBuZXcgYnVmZmVycyBvdmVybGFwIHRoZSBtaWRkbGUgb2YgYSBzZWxlY3RlZAotLy8gcmFuZ2UuIFRoaXMgdGVzdHMgdGhlIGNhc2Ugd2hlbiB0aGVyZSBpcyBubyBzcGxpdCBhbmQgdGhlIG5leHQgYnVmZmVyIGlzCi0vLyBhZnRlciB0aGUgbmV3IGJ1ZmZlcnMuCi0vLyBpbmRleDogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwCi0vLyBvbGQgwqA6ICBBIGEgYSBhIGEgQSBhIGEgYSBhIEEqYSphIGEgYQotLy8gbmV3IMKgOiAgICAgICAgICAgIEIgYiBiIGIgYgotLy8gYWZ0ZXI6ICBBIGEgYSBhIGEgQiBiIGIgYiBiIEEqYSphIGEgYQotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIE1pZGRsZV9PdmVybGFwX1NlbGVjdGVkXzIpIHsKLSAgLy8gQXBwZW5kIDE1IGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDAgdGhyb3VnaCAxNC4KLSAgTmV3U2VnbWVudEFwcGVuZCgwLCAxNSwgJmtEYXRhQSk7Ci0KLSAgLy8gU2VlayB0byAxMCB0aGVuIG1vdmUgdG8gcG9zaXRpb24gMTEuCi0gIFNlZWsoMTApOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygxMCwgMTAsICZrRGF0YUEpOwotCi0gIC8vIE5vdyBhcHBlbmQgNSBidWZmZXJzIGF0IHBvc2l0aW9ucyA1IHRocm91Z2ggOS4KLSAgTmV3U2VnbWVudEFwcGVuZCg1LCA1LCAma0RhdGFCKTsKLQotICAvLyBDaGVjayBleHBlY3RlZCByYW5nZS4KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbMCwxNCkgfSIpOwotCi0gIC8vIE1ha2Ugc3VyZSBkYXRhIGlzIGNvcnJlY3QuCi0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDExLCAxNCwgJmtEYXRhQSk7Ci0gIFNlZWsoMCk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDAsIDQsICZrRGF0YUEpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycyg1LCA5LCAma0RhdGFCKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMTAsIDE0LCAma0RhdGFBKTsKLX0KLQotLy8gVGhpcyB0ZXN0IGNvdmVycyB0aGUgY2FzZSB3aGVuIG5ldyBidWZmZXJzIG92ZXJsYXAgdGhlIG1pZGRsZSBvZiBhIHNlbGVjdGVkCi0vLyByYW5nZS4gVGhpcyB0ZXN0cyB0aGUgY2FzZSB3aGVuIHRoZXJlIGlzIGEgc3BsaXQgYW5kIHRoZSBuZXh0IGJ1ZmZlciBpcwotLy8gYmVmb3JlIHRoZSBuZXcgYnVmZmVycy4KLS8vIGluZGV4OiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAKLS8vIG9sZCDCoDogIEEgYSphKmEgYSBBIGEgYSBhIGEgQSBhIGEgYSBhCi0vLyBuZXcgwqA6ICAgICAgICAgICAgQiBiIGIKLS8vIGFmdGVyOiAgQSBhKmEqYSBhIEIgYiBifCAgIHxBIGEgYSBhIGEKLVRFU1RfRihTb3VyY2VCdWZmZXJTdHJlYW1UZXN0LCBNaWRkbGVfT3ZlcmxhcF9TZWxlY3RlZF8zKSB7Ci0gIC8vIEFwcGVuZCAxNSBidWZmZXJzIGF0IHBvc2l0aW9ucyAwIHRocm91Z2ggMTQuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMCwgMTUsICZrRGF0YUEpOwotCi0gIC8vIFNlZWsgdG8gYmVnaW5uaW5nIHRoZW4gbW92ZSB0byBwb3NpdGlvbiAyLgotICBTZWVrKDApOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygwLCAxLCAma0RhdGFBKTsKLQotICAvLyBOb3cgYXBwZW5kIDMgYnVmZmVycyBhdCBwb3NpdGlvbnMgNSB0aHJvdWdoIDcuCi0gIE5ld1NlZ21lbnRBcHBlbmQoNSwgMywgJmtEYXRhQik7Ci0KLSAgLy8gQ2hlY2sgZXhwZWN0ZWQgcmFuZ2UuCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzAsNykgWzEwLDE0KSB9Iik7Ci0KLSAgLy8gTWFrZSBzdXJlIGRhdGEgaXMgY29ycmVjdC4KLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMiwgNCwgJmtEYXRhQSk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDUsIDcsICZrRGF0YUIpOwotICBTZWVrKDEwKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMTAsIDE0LCAma0RhdGFBKTsKLX0KLQotLy8gVGhpcyB0ZXN0IGNvdmVycyB0aGUgY2FzZSB3aGVuIG5ldyBidWZmZXJzIG92ZXJsYXAgdGhlIG1pZGRsZSBvZiBhIHNlbGVjdGVkCi0vLyByYW5nZS4gVGhpcyB0ZXN0cyB0aGUgY2FzZSB3aGVuIHRoZXJlIGlzIGEgc3BsaXQgYW5kIHRoZSBuZXh0IGJ1ZmZlciBpcyBhZnRlcgotLy8gdGhlIG5ldyBidWZmZXJzIGJ1dCBiZWZvcmUgdGhlIHNwbGl0IHJhbmdlLgotLy8gaW5kZXg6ICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMAotLy8gb2xkIMKgOiAgQSBhIGEgYSBhIEEgYSBhKmEqYSBBIGEgYSBhIGEKLS8vIG5ldyDCoDogICAgICAgICAgICBCIGIgYgotLy8gYWZ0ZXI6IHxBIGEgYSBhIGEgQiBiIGJ8ICAgfEEgYSBhIGEgYXwKLS8vIHRyYWNrOiAgICAgICAgICAgICAgICAgfGEgYXwKLVRFU1RfRihTb3VyY2VCdWZmZXJTdHJlYW1UZXN0LCBNaWRkbGVfT3ZlcmxhcF9TZWxlY3RlZF80KSB7Ci0gIC8vIEFwcGVuZCAxNSBidWZmZXJzIGF0IHBvc2l0aW9ucyAwIHRocm91Z2ggMTQuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMCwgMTUsICZrRGF0YUEpOwotCi0gIC8vIFNlZWsgdG8gNSB0aGVuIG1vdmUgdG8gcG9zaXRpb24gOC4KLSAgU2Vlayg1KTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoNSwgNywgJmtEYXRhQSk7Ci0KLSAgLy8gTm93IGFwcGVuZCAzIGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDUgdGhyb3VnaCA3LgotICBOZXdTZWdtZW50QXBwZW5kKDUsIDMsICZrRGF0YUIpOwotCi0gIC8vIENoZWNrIGV4cGVjdGVkIHJhbmdlLgotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFswLDcpIFsxMCwxNCkgfSIpOwotCi0gIC8vIEJ1ZmZlcnMgOCBhbmQgOSBzaG91bGQgYmUgaW4gdGhlIHRyYWNrIGJ1ZmZlci4KLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoOCwgOSwgJmtEYXRhQSk7Ci0gIC8vIFRoZSBidWZmZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHRyYWNrIGJ1ZmZlciBzaG91bGQgYmUgYSBrZXlmcmFtZS4KLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMTAsIDEwLCAma0RhdGFBLCB0cnVlKTsKLQotICAvLyBNYWtlIHN1cmUgYWxsIGRhdGEgaXMgY29ycmVjdC4KLSAgU2VlaygwKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMCwgNCwgJmtEYXRhQSk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDUsIDcsICZrRGF0YUIpOwotICBTZWVrKDEwKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMTAsIDE0LCAma0RhdGFBKTsKLX0KLQotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIE92ZXJsYXBfT25lQnlPbmUpIHsKLSAgLy8gQXBwZW5kIDUgYnVmZmVycyBzdGFydGluZyBhdCAxMG1zLCAzMG1zIGFwYXJ0LgotICBOZXdTZWdtZW50QXBwZW5kT25lQnlPbmUoIjEwSyA0MCA3MCAxMDAgMTMwIik7Ci0KLSAgLy8gVGhlIHJhbmdlIGVuZHMgYXQgMTYwLCBhY2NvdW50aW5nIGZvciB0aGUgbGFzdCBidWZmZXIncyBkdXJhdGlvbi4KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlc0J5VGltZXN0YW1wKCJ7IFsxMCwxNjApIH0iKTsKLQotICAvLyBPdmVybGFwIHdpdGggMTAgYnVmZmVycyBzdGFydGluZyBhdCB0aGUgYmVnaW5uaW5nLCBhcHBlbmRlZCBvbmUgYXQgYQotICAvLyB0aW1lLgotICBOZXdTZWdtZW50QXBwZW5kKDAsIDEsICZrRGF0YUIpOwotICBmb3IgKGludCBpID0gMTsgaSA8IDEwOyBpKyspCi0gICAgQXBwZW5kQnVmZmVycyhpLCAxLCAma0RhdGFCKTsKLQotICAvLyBBbGwgZGF0YSBzaG91bGQgYmUgcmVwbGFjZWQuCi0gIFNlZWsoMCk7Ci0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzAsOSkgfSIpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygwLCA5LCAma0RhdGFCKTsKLX0KLQotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIE92ZXJsYXBfT25lQnlPbmVfRGVsZXRlR3JvdXApIHsKLSAgTmV3U2VnbWVudEFwcGVuZE9uZUJ5T25lKCIxMEsgNDAgNzAgMTAwIDEzMEsiKTsKLSAgQ2hlY2tFeHBlY3RlZFJhbmdlc0J5VGltZXN0YW1wKCJ7IFsxMCwxNjApIH0iKTsKLQotICAvLyBTZWVrIHRvIDEzMG1zLgotICBTZWVrVG9UaW1lc3RhbXAoYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDEzMCkpOwotCi0gIC8vIE92ZXJsYXAgd2l0aCBhIG5ldyBzZWdtZW50IGZyb20gMCB0byAxMjBtcy4KLSAgTmV3U2VnbWVudEFwcGVuZE9uZUJ5T25lKCIwSyAxMjAiKTsKLQotICAvLyBOZXh0IGJ1ZmZlciBzaG91bGQgc3RpbGwgYmUgMTMwbXMuCi0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKCIxMzBLIik7Ci0KLSAgLy8gQ2hlY2sgdGhlIGZpbmFsIGJ1ZmZlcnMgaXMgY29ycmVjdC4KLSAgU2Vla1RvVGltZXN0YW1wKGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygwKSk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKCIwSyAxMjAgMTMwSyIpOwotfQotCi1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgT3ZlcmxhcF9PbmVCeU9uZV9CZXR3ZWVuTWVkaWFTZWdtZW50cykgewotICAvLyBBcHBlbmQgNSBidWZmZXJzIHN0YXJ0aW5nIGF0IDExMG1zLCAzMG1zIGFwYXJ0LgotICBOZXdTZWdtZW50QXBwZW5kT25lQnlPbmUoIjExMEsgMTQwIDE3MCAyMDAgMjMwIik7Ci0gIENoZWNrRXhwZWN0ZWRSYW5nZXNCeVRpbWVzdGFtcCgieyBbMTEwLDI2MCkgfSIpOwotCi0gIC8vIE5vdyBhcHBlbmQgMiBtZWRpYSBzZWdtZW50cyBmcm9tIDBtcyB0byAyMTBtcywgMzBtcyBhcGFydC4gTm90ZSB0aGF0IHRoZQotICAvLyBvbGQga2V5ZnJhbWUgMTEwbXMgZmFsbHMgaW4gYmV0d2VlbiB0aGVzZSB0d28gc2VnbWVudHMuCi0gIE5ld1NlZ21lbnRBcHBlbmRPbmVCeU9uZSgiMEsgMzAgNjAgOTAiKTsKLSAgTmV3U2VnbWVudEFwcGVuZE9uZUJ5T25lKCIxMjBLIDE1MCAxODAgMjEwIik7Ci0gIENoZWNrRXhwZWN0ZWRSYW5nZXNCeVRpbWVzdGFtcCgieyBbMCwyNDApIH0iKTsKLQotICAvLyBDaGVjayB0aGUgZmluYWwgYnVmZmVycyBpcyBjb3JyZWN0OyB0aGUga2V5ZnJhbWUgYXQgMTEwbXMgc2hvdWxkIGJlCi0gIC8vIGRlbGV0ZWQuCi0gIFNlZWtUb1RpbWVzdGFtcChiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMCkpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygiMEsgMzAgNjAgOTAgMTIwSyAxNTAgMTgwIDIxMCIpOwotfQotCi1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgT3ZlcmxhcF9PbmVCeU9uZV9UcmFja0J1ZmZlcikgewotICBOZXdTZWdtZW50QXBwZW5kT25lQnlPbmUoIjEwSyA0MCA3MCAxMDBLIDEyNSAxMzBLIik7Ci0gIENoZWNrRXhwZWN0ZWRSYW5nZXNCeVRpbWVzdGFtcCgieyBbMTAsMTYwKSB9Iik7Ci0KLSAgLy8gU2VlayB0byA3MG1zLgotICBTZWVrVG9UaW1lc3RhbXAoYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDEwKSk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKCIxMEsgNDAiKTsKLQotICAvLyBPdmVybGFwIHdpdGggYSBuZXcgc2VnbWVudCBmcm9tIDAgdG8gMTIwbXMuCi0gIE5ld1NlZ21lbnRBcHBlbmRPbmVCeU9uZSgiMEsgMzAgNjAgOTAgMTIwSyIpOwotICBDaGVja0V4cGVjdGVkUmFuZ2VzQnlUaW1lc3RhbXAoInsgWzAsMTYwKSB9Iik7Ci0KLSAgLy8gU2hvdWxkIHJldHVybiBmcmFtZXMgNzBtcyBhbmQgMTAwbXMgZnJvbSB0aGUgdHJhY2sgYnVmZmVyLCB0aGVuIHN3aXRjaAotICAvLyB0byB0aGUgbmV3IGRhdGEgYXQgMTIwSywgdGhlbiBzd2l0Y2ggYmFjayB0byB0aGUgb2xkIGRhdGEgYXQgMTMwSy4gVGhlCi0gIC8vIGZyYW1lIGF0IDEyNW1zIHRoYXQgZGVwZW5kZWQgb24ga2V5ZnJhbWUgMTAwbXMgc2hvdWxkIGhhdmUgYmVlbiBkZWxldGVkLgotICBDaGVja0V4cGVjdGVkQnVmZmVycygiNzAgMTAwSyAxMjBLIDEzMEsiKTsKLQotICAvLyBDaGVjayB0aGUgZmluYWwgcmVzdWx0OiBzaG91bGQgbm90IGluY2x1ZGUgZGF0YSBmcm9tIHRoZSB0cmFjayBidWZmZXIuCi0gIFNlZWtUb1RpbWVzdGFtcChiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMCkpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygiMEsgMzAgNjAgOTAgMTIwSyAxMzBLIik7Ci19Ci0KLS8vIE92ZXJsYXAgdGhlIG5leHQga2V5ZnJhbWUgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgdHJhY2sgYnVmZmVyIHdpdGggYSBuZXcKLS8vIGtleWZyYW1lLgotLy8gb2xkICA6ICAgMTBLICA0MCAgKjcwKiAgMTAwSyAgMTI1ICAxMzBLCi0vLyBuZXcgIDogMEsgICAzMCAgIDYwICAgOTAgICAxMjBLCi0vLyBhZnRlcjogMEsgICAzMCAgIDYwICAgOTAgICoxMjBLKiAgIDEzMEsKLS8vIHRyYWNrOiAgICAgICAgICAgICA3MCAgIDEwMEsKLS8vIG5ldyAgOiAgICAgICAgICAgICAgICAgICAgIDExMEsgICAgMTMwCi0vLyBhZnRlcjogMEsgICAzMCAgIDYwICAgOTAgICoxMTBLKiAgIDEzMAotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIE92ZXJsYXBfT25lQnlPbmVfVHJhY2tCdWZmZXIyKSB7Ci0gIE5ld1NlZ21lbnRBcHBlbmRPbmVCeU9uZSgiMTBLIDQwIDcwIDEwMEsgMTI1IDEzMEsiKTsKLSAgQ2hlY2tFeHBlY3RlZFJhbmdlc0J5VGltZXN0YW1wKCJ7IFsxMCwxNjApIH0iKTsKLQotICAvLyBTZWVrIHRvIDcwbXMuCi0gIFNlZWtUb1RpbWVzdGFtcChiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoNzApKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoIjEwSyA0MCIpOwotCi0gIC8vIE92ZXJsYXAgd2l0aCBhIG5ldyBzZWdtZW50IGZyb20gMCB0byAxMjBtczsgNzBtcyBhbmQgMTAwbXMgZ28gaW4gdHJhY2sKLSAgLy8gYnVmZmVyLgotICBOZXdTZWdtZW50QXBwZW5kT25lQnlPbmUoIjBLIDMwIDYwIDkwIDEyMEsiKTsKLSAgQ2hlY2tFeHBlY3RlZFJhbmdlc0J5VGltZXN0YW1wKCJ7IFswLDE2MCkgfSIpOwotCi0gIC8vIE5vdyBvdmVybGFwIHRoZSBrZXlmcmFtZSBhdCAxMjBtcy4KLSAgTmV3U2VnbWVudEFwcGVuZE9uZUJ5T25lKCIxMTBLIDEzMCIpOwotCi0gIC8vIFNob3VsZCBleHBlY3QgYnVmZmVycyA3MG1zIGFuZCAxMDBtcyBmcm9tIHRoZSB0cmFjayBidWZmZXIuIFRoZW4gaXQgc2hvdWxkCi0gIC8vIHJldHVybiB0aGUga2V5ZnJhbWUgYWZ0ZXIgdGhlIHRyYWNrIGJ1ZmZlciwgd2hpY2ggaXMgYXQgMTEwbXMuCi0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKCI3MCAxMDBLIDExMEsgMTMwIik7Ci19Ci0KLS8vIE92ZXJsYXAgdGhlIG5leHQga2V5ZnJhbWUgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgdHJhY2sgYnVmZmVyIHdpdGhvdXQgYQotLy8gbmV3IGtleWZyYW1lLgotLy8gb2xkICA6ICAgMTBLICA0MCAgKjcwKiAgMTAwSyAgMTI1ICAxMzBLCi0vLyBuZXcgIDogMEsgICAzMCAgIDYwICAgOTAgICAxMjBLCi0vLyBhZnRlcjogMEsgICAzMCAgIDYwICAgOTAgICoxMjBLKiAgIDEzMEsKLS8vIHRyYWNrOiAgICAgICAgICAgICA3MCAgIDEwMEsKLS8vIG5ldyAgOiAgICAgICAgNTBLICAgODAgICAxMTAgICAgICAgICAgMTQwCi0vLyBhZnRlcjogMEsgICAzMCAgIDUwSyAgIDgwICAgMTEwICAgMTQwICogKHdhaXRpbmcgZm9yIGtleWZyYW1lKQotLy8gdHJhY2s6ICAgICAgICAgICAgICAgNzAgICAxMDBLICAgMTIwSyAgIDEzMEsKLVRFU1RfRihTb3VyY2VCdWZmZXJTdHJlYW1UZXN0LCBPdmVybGFwX09uZUJ5T25lX1RyYWNrQnVmZmVyMykgewotICBOZXdTZWdtZW50QXBwZW5kT25lQnlPbmUoIjEwSyA0MCA3MCAxMDBLIDEyNSAxMzBLIik7Ci0gIENoZWNrRXhwZWN0ZWRSYW5nZXNCeVRpbWVzdGFtcCgieyBbMTAsMTYwKSB9Iik7Ci0KLSAgLy8gU2VlayB0byA3MG1zLgotICBTZWVrVG9UaW1lc3RhbXAoYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDcwKSk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKCIxMEsgNDAiKTsKLQotICAvLyBPdmVybGFwIHdpdGggYSBuZXcgc2VnbWVudCBmcm9tIDAgdG8gMTIwbXM7IDcwbXMgYW5kIDEwMG1zIGdvIGluIHRyYWNrCi0gIC8vIGJ1ZmZlci4KLSAgTmV3U2VnbWVudEFwcGVuZE9uZUJ5T25lKCIwSyAzMCA2MCA5MCAxMjBLIik7Ci0gIENoZWNrRXhwZWN0ZWRSYW5nZXNCeVRpbWVzdGFtcCgieyBbMCwxNjApIH0iKTsKLQotICAvLyBOb3cgb3ZlcmxhcCB0aGUga2V5ZnJhbWUgYXQgMTIwbXMuIFRoZXJlJ3Mgbm8ga2V5ZnJhbWUgYWZ0ZXIgNzBtcywgc28gMTIwbXMKLSAgLy8gYW5kIDEzMG1zIGdvIGludG8gdGhlIHRyYWNrIGJ1ZmZlci4KLSAgTmV3U2VnbWVudEFwcGVuZE9uZUJ5T25lKCI1MEsgODAgMTEwIDE0MCIpOwotCi0gIC8vIFNob3VsZCBoYXZlIGFsbCB0aGUgYnVmZmVycyBmcm9tIHRoZSB0cmFjayBidWZmZXIsIHRoZW4gc3RhbGwuCi0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKCI3MCAxMDBLIDEyMEsgMTMwSyIpOwotICBDaGVja05vTmV4dEJ1ZmZlcigpOwotCi0gIC8vIEFwcGVuZGluZyBhIGtleWZyYW1lIHNob3VsZCBmdWxmaWxsIHRoZSByZWFkLgotICBBcHBlbmRCdWZmZXJzT25lQnlPbmUoIjE1MEsiKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoIjE1MEsiKTsKLSAgQ2hlY2tOb05leHRCdWZmZXIoKTsKLX0KLQotLy8gT3ZlcmxhcCB0aGUgbmV4dCBrZXlmcmFtZSBhZnRlciB0aGUgZW5kIG9mIHRoZSB0cmFjayBidWZmZXIgd2l0aCBhIGtleWZyYW1lCi0vLyB0aGF0IGNvbWVzIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSB0cmFjayBidWZmZXIuCi0vLyBvbGQgIDogICAxMEsgIDQwICAqNzAqICAxMDBLICAxMjUgIDEzMEsKLS8vIG5ldyAgOiAwSyAgIDMwICAgNjAgICA5MCAgIDEyMEsKLS8vIGFmdGVyOiAwSyAgIDMwICAgNjAgICA5MCAgKjEyMEsqICAgMTMwSwotLy8gdHJhY2s6ICAgICAgICAgICAgIDcwICAgMTAwSwotLy8gbmV3ICA6ICAgICAgICAgICAgICA4MEsgIDExMCAgICAgICAgICAxNDAKLS8vIGFmdGVyOiAwSyAgIDMwICAgNjAgICAqODBLKiAgMTEwICAgMTQwCi0vLyB0cmFjazogICAgICAgICAgICAgICA3MAotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIE92ZXJsYXBfT25lQnlPbmVfVHJhY2tCdWZmZXI0KSB7Ci0gIE5ld1NlZ21lbnRBcHBlbmRPbmVCeU9uZSgiMTBLIDQwIDcwIDEwMEsgMTI1IDEzMEsiKTsKLSAgQ2hlY2tFeHBlY3RlZFJhbmdlc0J5VGltZXN0YW1wKCJ7IFsxMCwxNjApIH0iKTsKLQotICAvLyBTZWVrIHRvIDcwbXMuCi0gIFNlZWtUb1RpbWVzdGFtcChiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoNzApKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoIjEwSyA0MCIpOwotCi0gIC8vIE92ZXJsYXAgd2l0aCBhIG5ldyBzZWdtZW50IGZyb20gMCB0byAxMjBtczsgNzBtcyBhbmQgMTAwbXMgZ28gaW4gdHJhY2sKLSAgLy8gYnVmZmVyLgotICBOZXdTZWdtZW50QXBwZW5kT25lQnlPbmUoIjBLIDMwIDYwIDkwIDEyMEsiKTsKLSAgQ2hlY2tFeHBlY3RlZFJhbmdlc0J5VGltZXN0YW1wKCJ7IFswLDE2MCkgfSIpOwotCi0gIC8vIE5vdyBhcHBlbmQgYSBrZXlmcmFtZSBhdCA4MG1zLgotICBOZXdTZWdtZW50QXBwZW5kT25lQnlPbmUoIjgwSyAxMTAgMTQwIik7Ci0KLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoIjcwIDgwSyAxMTAgMTQwIik7Ci0gIENoZWNrTm9OZXh0QnVmZmVyKCk7Ci19Ci0KLS8vIE92ZXJsYXAgdGhlIG5leHQga2V5ZnJhbWUgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgdHJhY2sgYnVmZmVyIHdpdGggYSBrZXlmcmFtZQotLy8gdGhhdCBjb21lcyBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgdHJhY2sgYnVmZmVyLCB3aGVuIHRoZSBzZWxlY3RlZCBzdHJlYW0gd2FzCi0vLyB3YWl0aW5nIGZvciB0aGUgbmV4dCBrZXlmcmFtZS4KLS8vIG9sZCAgOiAgIDEwSyAgNDAgICo3MCogIDEwMEsKLS8vIG5ldyAgOiAwSyAgIDMwICAgNjAgICA5MCAgIDEyMAotLy8gYWZ0ZXI6IDBLICAgMzAgICA2MCAgIDkwICAgMTIwICogKHdhaXRpbmcgZm9yIGtleWZyYW1lKQotLy8gdHJhY2s6ICAgICAgICAgICAgIDcwICAgMTAwSwotLy8gbmV3ICA6ICAgICAgICAgICAgICA4MEsgIDExMCAgICAgICAgICAxNDAKLS8vIGFmdGVyOiAwSyAgIDMwICAgNjAgICAqODBLKiAgMTEwICAgMTQwCi0vLyB0cmFjazogICAgICAgICAgICAgICA3MAotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIE92ZXJsYXBfT25lQnlPbmVfVHJhY2tCdWZmZXI1KSB7Ci0gIE5ld1NlZ21lbnRBcHBlbmRPbmVCeU9uZSgiMTBLIDQwIDcwIDEwMEsiKTsKLSAgQ2hlY2tFeHBlY3RlZFJhbmdlc0J5VGltZXN0YW1wKCJ7IFsxMCwxMzApIH0iKTsKLQotICAvLyBTZWVrIHRvIDcwbXMuCi0gIFNlZWtUb1RpbWVzdGFtcChiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoNzApKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoIjEwSyA0MCIpOwotCi0gIC8vIE92ZXJsYXAgd2l0aCBhIG5ldyBzZWdtZW50IGZyb20gMCB0byAxMjBtczsgNzBtcyBhbmQgMTAwbXMgZ28gaW4gdHJhY2sKLSAgLy8gYnVmZmVyLgotICBOZXdTZWdtZW50QXBwZW5kT25lQnlPbmUoIjBLIDMwIDYwIDkwIDEyMCIpOwotICBDaGVja0V4cGVjdGVkUmFuZ2VzQnlUaW1lc3RhbXAoInsgWzAsMTUwKSB9Iik7Ci0KLSAgLy8gTm93IGFwcGVuZCBhIGtleWZyYW1lIGF0IDgwbXMuIFRoZSBidWZmZXIgYXQgMTAwbXMgc2hvdWxkIGJlIGRlbGV0ZWQgZnJvbQotICAvLyB0aGUgdHJhY2sgYnVmZmVyLgotICBOZXdTZWdtZW50QXBwZW5kT25lQnlPbmUoIjgwSyAxMTAgMTQwIik7Ci0KLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoIjcwIDgwSyAxMTAgMTQwIik7Ci0gIENoZWNrTm9OZXh0QnVmZmVyKCk7Ci19Ci0KLVRFU1RfRihTb3VyY2VCdWZmZXJTdHJlYW1UZXN0LCBTZWVrX0tleWZyYW1lKSB7Ci0gIC8vIEFwcGVuZCA2IGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDAgdGhyb3VnaCA1LgotICBOZXdTZWdtZW50QXBwZW5kKDAsIDYpOwotCi0gIC8vIFNlZWsgdG8gYmVnaW5uaW5nLgotICBTZWVrKDApOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygwLCA1LCB0cnVlKTsKLX0KLQotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIFNlZWtfTm9uS2V5ZnJhbWUpIHsKLSAgLy8gQXBwZW5kIDE1IGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDAgdGhyb3VnaCAxNC4KLSAgTmV3U2VnbWVudEFwcGVuZCgwLCAxNSk7Ci0KLSAgLy8gU2VlayB0byBidWZmZXIgYXQgcG9zaXRpb24gMTMuCi0gIFNlZWsoMTMpOwotCi0gIC8vIEV4cGVjdCBzZWVraW5nIGJhY2sgdG8gdGhlIG5lYXJlc3Qga2V5ZnJhbWUuCi0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDEwLCAxNCwgdHJ1ZSk7Ci0KLSAgLy8gU2VlayB0byBidWZmZXIgYXQgcG9zaXRpb24gMy4KLSAgU2VlaygzKTsKLQotICAvLyBFeHBlY3Qgc2Vla2luZyBiYWNrIHRvIHRoZSBuZWFyZXN0IGtleWZyYW1lLgotICBDaGVja0V4cGVjdGVkQnVmZmVycygwLCAzLCB0cnVlKTsKLX0KLQotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIFNlZWtfTm90QnVmZmVyZWQpIHsKLSAgLy8gU2VlayB0byBiZWdpbm5pbmcuCi0gIFNlZWsoMCk7Ci0KLSAgLy8gVHJ5IHRvIGdldCBidWZmZXI7IG5vdGhpbmcncyBhcHBlbmRlZC4KLSAgQ2hlY2tOb05leHRCdWZmZXIoKTsKLQotICAvLyBBcHBlbmQgMiBidWZmZXJzIGF0IHBvc2l0aW9ucyAwLgotICBOZXdTZWdtZW50QXBwZW5kKDAsIDIpOwotICBTZWVrKDApOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygwLCAxKTsKLQotICAvLyBUcnkgdG8gZ2V0IGJ1ZmZlciBvdXQgb2YgcmFuZ2UuCi0gIFNlZWsoMik7Ci0gIENoZWNrTm9OZXh0QnVmZmVyKCk7Ci19Ci0KLVRFU1RfRihTb3VyY2VCdWZmZXJTdHJlYW1UZXN0LCBTZWVrX0luQmV0d2VlblRpbWVzdGFtcHMpIHsKLSAgLy8gQXBwZW5kIDEwIGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDAgdGhyb3VnaCA5LgotICBOZXdTZWdtZW50QXBwZW5kKDAsIDEwKTsKLQotICBiYXNlOjpUaW1lRGVsdGEgYnVtcCA9IGZyYW1lX2R1cmF0aW9uKCkgLyA0OwotICBDSEVDSyhidW1wID4gYmFzZTo6VGltZURlbHRhKCkpOwotCi0gIC8vIFNlZWsgdG8gYnVmZmVyIGEgbGl0dGxlIGFmdGVyIHBvc2l0aW9uIDUuCi0gIHN0cmVhbV8tPlNlZWsoNSAqIGZyYW1lX2R1cmF0aW9uKCkgKyBidW1wKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoNSwgNSwgdHJ1ZSk7Ci0KLSAgLy8gU2VlayB0byBidWZmZXIgYSBsaXR0bGUgYmVmb3JlIHBvc2l0aW9uIDUuCi0gIHN0cmVhbV8tPlNlZWsoNSAqIGZyYW1lX2R1cmF0aW9uKCkgLSBidW1wKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMCwgMCwgdHJ1ZSk7Ci19Ci0KLS8vIFRoaXMgdGVzdCB3aWxsIGRvIGEgY29tcGxldGUgb3ZlcmxhcCBvZiBhbiBleGlzdGluZyByYW5nZSBpbiBvcmRlciB0byBhZGQKLS8vIGJ1ZmZlcnMgdG8gdGhlIHRyYWNrIGJ1ZmZlcnMuIFRoZW4gdGhlIHRlc3QgZG9lcyBhIHNlZWsgdG8gYW5vdGhlciBwYXJ0IG9mCi0vLyB0aGUgc3RyZWFtLiBUaGUgU291cmNlQnVmZmVyU3RyZWFtIHNob3VsZCBjbGVhciBpdHMgaW50ZXJuYWwgdHJhY2sgYnVmZmVyIGluCi0vLyByZXNwb25zZSB0byB0aGUgU2VlaygpLgotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIFNlZWtfQWZ0ZXJfVHJhY2tCdWZmZXJfRmlsbGVkKSB7Ci0gIC8vIEFwcGVuZCAxMCBidWZmZXJzIGF0IHBvc2l0aW9ucyA1IHRocm91Z2ggMTQuCi0gIE5ld1NlZ21lbnRBcHBlbmQoNSwgMTAsICZrRGF0YUEpOwotCi0gIC8vIFNlZWsgdG8gYnVmZmVyIGF0IHBvc2l0aW9uIDUgYW5kIGdldCBuZXh0IGJ1ZmZlci4KLSAgU2Vlayg1KTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoNSwgNSwgJmtEYXRhQSk7Ci0KLSAgLy8gRG8gYSBjb21wbGV0ZSBvdmVybGFwIGJ5IGFwcGVuZGluZyAyMCBidWZmZXJzIGF0IHBvc2l0aW9ucyAwIHRocm91Z2ggMTkuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMCwgMjAsICZrRGF0YUIpOwotCi0gIC8vIENoZWNrIHJhbmdlIGlzIGNvcnJlY3QuCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzAsMTkpIH0iKTsKLQotICAvLyBTZWVrIHRvIGJlZ2lubmluZzsgYWxsIGRhdGEgc2hvdWxkIGJlIG5ldy4KLSAgU2VlaygwKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMCwgMTksICZrRGF0YUIpOwotCi0gIC8vIENoZWNrIHJhbmdlIGNvbnRpbnVlcyB0byBiZSBjb3JyZWN0LgotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFswLDE5KSB9Iik7Ci19Ci0KLVRFU1RfRihTb3VyY2VCdWZmZXJTdHJlYW1UZXN0LCBTZWVrX1N0YXJ0T2ZTZWdtZW50KSB7Ci0gIGJhc2U6OlRpbWVEZWx0YSBidW1wID0gZnJhbWVfZHVyYXRpb24oKSAvIDQ7Ci0gIENIRUNLKGJ1bXAgPiBiYXNlOjpUaW1lRGVsdGEoKSk7Ci0KLSAgLy8gQXBwZW5kIDUgYnVmZmVycyBhdCBwb3NpdGlvbiAoNSArIHxidW1wfCkgdGhyb3VnaCA5LCB3aGVyZSB0aGUgbWVkaWEKLSAgLy8gc2VnbWVudCBiZWdpbnMgYXQgcG9zaXRpb24gNS4KLSAgU2Vlayg1KTsKLSAgTmV3U2VnbWVudEFwcGVuZF9PZmZzZXRGaXJzdEJ1ZmZlcig1LCA1LCBidW1wKTsKLSAgc2NvcGVkX3JlZnB0cjxTdHJlYW1QYXJzZXJCdWZmZXI+IGJ1ZmZlcjsKLQotICAvLyBHZXROZXh0QnVmZmVyKCkgc2hvdWxkIHJldHVybiB0aGUgbmV4dCBidWZmZXIgYXQgcG9zaXRpb24gKDUgKyB8YnVtcHwpLgotICBFWFBFQ1RfRVEoc3RyZWFtXy0+R2V0TmV4dEJ1ZmZlcigmYnVmZmVyKSwgU291cmNlQnVmZmVyU3RyZWFtOjprU3VjY2Vzcyk7Ci0gIEVYUEVDVF9FUShidWZmZXItPkdldERlY29kZVRpbWVzdGFtcCgpLCA1ICogZnJhbWVfZHVyYXRpb24oKSArIGJ1bXApOwotCi0gIC8vIENoZWNrIHJlc3Qgb2YgYnVmZmVycy4KLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoNiwgOSk7Ci0KLSAgLy8gU2VlayB0byBwb3NpdGlvbiAxNS4KLSAgU2VlaygxNSk7Ci0KLSAgLy8gQXBwZW5kIDUgYnVmZmVycyBhdCBwb3NpdGlvbnMgKDE1ICsgfGJ1bXB8KSB0aHJvdWdoIDE5LCB3aGVyZSB0aGUgbWVkaWEKLSAgLy8gc2VnbWVudCBiZWdpbnMgYXQgMTUuCi0gIE5ld1NlZ21lbnRBcHBlbmRfT2Zmc2V0Rmlyc3RCdWZmZXIoMTUsIDUsIGJ1bXApOwotCi0gIC8vIEdldE5leHRCdWZmZXIoKSBzaG91bGQgcmV0dXJuIHRoZSBuZXh0IGJ1ZmZlciBhdCBwb3NpdGlvbiAoMTUgKyB8YnVtcHwpLgotICBFWFBFQ1RfRVEoc3RyZWFtXy0+R2V0TmV4dEJ1ZmZlcigmYnVmZmVyKSwgU291cmNlQnVmZmVyU3RyZWFtOjprU3VjY2Vzcyk7Ci0gIEVYUEVDVF9FUShidWZmZXItPkdldERlY29kZVRpbWVzdGFtcCgpLCAxNSAqIGZyYW1lX2R1cmF0aW9uKCkgKyBidW1wKTsKLQotICAvLyBDaGVjayByZXN0IG9mIGJ1ZmZlcnMuCi0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDE2LCAxOSk7Ci19Ci0KLVRFU1RfRihTb3VyY2VCdWZmZXJTdHJlYW1UZXN0LCBTZWVrX0JlZm9yZVN0YXJ0T2ZTZWdtZW50KSB7Ci0gIC8vIEFwcGVuZCAxMCBidWZmZXJzIGF0IHBvc2l0aW9ucyA1IHRocm91Z2ggMTQuCi0gIE5ld1NlZ21lbnRBcHBlbmQoNSwgMTApOwotCi0gIC8vIFNlZWsgdG8gYSB0aW1lIGJlZm9yZSB0aGUgZmlyc3QgYnVmZmVyIGluIHRoZSByYW5nZS4KLSAgU2VlaygwKTsKLQotICAvLyBTaG91bGQgcmV0dXJuIGJ1ZmZlcnMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSByYW5nZS4KLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoNSwgMTQpOwotfQotCi1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgT2xkU2Vla1BvaW50X0NvbXBsZXRlT3ZlcmxhcCkgewotICAvLyBBcHBlbmQgNSBidWZmZXJzIGF0IHBvc2l0aW9ucyAwIHRocm91Z2ggNC4KLSAgTmV3U2VnbWVudEFwcGVuZCgwLCA0KTsKLQotICAvLyBBcHBlbmQgNSBidWZmZXJzIGF0IHBvc2l0aW9ucyAxMCB0aHJvdWdoIDE0LCBhbmQgc2VlayB0byB0aGUgYmVnaW5uaW5nIG9mCi0gIC8vIHRoaXMgcmFuZ2UuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMTAsIDUpOwotICBTZWVrKDEwKTsKLQotICAvLyBOb3cgc2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaXJzdCByYW5nZS4KLSAgU2VlaygwKTsKLQotICAvLyBDb21wbGV0ZWx5IG92ZXJsYXAgdGhlIG9sZCBzZWVrIHBvaW50LgotICBOZXdTZWdtZW50QXBwZW5kKDUsIDE1KTsKLQotICAvLyBUaGUgR2V0TmV4dEJ1ZmZlcigpIGNhbGwgc2hvdWxkIHJlc3BlY3QgdGhlIDJuZCBzZWVrIHBvaW50LgotICBDaGVja0V4cGVjdGVkQnVmZmVycygwLCAwKTsKLX0KLQotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIE9sZFNlZWtQb2ludF9Db21wbGV0ZU92ZXJsYXBfUGVuZGluZykgewotICAvLyBBcHBlbmQgMiBidWZmZXJzIGF0IHBvc2l0aW9ucyAwIHRocm91Z2ggMS4KLSAgTmV3U2VnbWVudEFwcGVuZCgwLCAyKTsKLQotICAvLyBBcHBlbmQgNSBidWZmZXJzIGF0IHBvc2l0aW9ucyAxNSB0aHJvdWdoIDE5IGFuZCBzZWVrIHRvIGJlZ2lubmluZyBvZiB0aGUKLSAgLy8gcmFuZ2UuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMTUsIDUpOwotICBTZWVrKDE1KTsKLQotICAvLyBOb3cgc2VlayBwb3NpdGlvbiA1LgotICBTZWVrKDUpOwotCi0gIC8vIENvbXBsZXRlbHkgb3ZlcmxhcCB0aGUgb2xkIHNlZWsgcG9pbnQuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMTAsIDE1KTsKLQotICAvLyBUaGUgc2VlayBhdCBwb3NpdGlvbiA1IHNob3VsZCBzdGlsbCBiZSBwZW5kaW5nLgotICBDaGVja05vTmV4dEJ1ZmZlcigpOwotfQotCi1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgT2xkU2Vla1BvaW50X01pZGRsZU92ZXJsYXApIHsKLSAgLy8gQXBwZW5kIDIgYnVmZmVycyBhdCBwb3NpdGlvbnMgMCB0aHJvdWdoIDEuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMCwgMik7Ci0KLSAgLy8gQXBwZW5kIDE1IGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDUgdGhyb3VnaCAxOSBhbmQgc2VlayB0byBwb3NpdGlvbiAxNS4KLSAgTmV3U2VnbWVudEFwcGVuZCg1LCAxNSk7Ci0gIFNlZWsoMTUpOwotCi0gIC8vIE5vdyBzZWVrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbS4KLSAgU2VlaygwKTsKLQotICAvLyBPdmVybGFwIHRoZSBtaWRkbGUgb2YgdGhlIHJhbmdlIHN1Y2ggdGhhdCB0aGVyZSBhcmUgbm93IHRocmVlIHJhbmdlcy4KLSAgTmV3U2VnbWVudEFwcGVuZCgxMCwgMyk7Ci0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzAsMSkgWzUsMTIpIFsxNSwxOSkgfSIpOwotCi0gIC8vIFRoZSBHZXROZXh0QnVmZmVyKCkgY2FsbCBzaG91bGQgcmVzcGVjdCB0aGUgMm5kIHNlZWsgcG9pbnQuCi0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDAsIDApOwotfQotCi1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgT2xkU2Vla1BvaW50X01pZGRsZU92ZXJsYXBfUGVuZGluZykgewotICAvLyBBcHBlbmQgMiBidWZmZXJzIGF0IHBvc2l0aW9ucyAwIHRocm91Z2ggMS4KLSAgTmV3U2VnbWVudEFwcGVuZCgwLCAyKTsKLQotICAvLyBBcHBlbmQgMTUgYnVmZmVycyBhdCBwb3NpdGlvbnMgMTAgdGhyb3VnaCAyNCBhbmQgc2VlayB0byBwb3NpdGlvbiAyMC4KLSAgTmV3U2VnbWVudEFwcGVuZCgxMCwgMTUpOwotICBTZWVrKDIwKTsKLQotICAvLyBOb3cgc2VlayB0byBwb3NpdGlvbiA1LgotICBTZWVrKDUpOwotCi0gIC8vIE92ZXJsYXAgdGhlIG1pZGRsZSBvZiB0aGUgcmFuZ2Ugc3VjaCB0aGF0IGl0IGlzIG5vdyBzcGxpdCBpbnRvIHR3byByYW5nZXMuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMTUsIDMpOwotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFswLDEpIFsxMCwxNykgWzIwLDI0KSB9Iik7Ci0KLSAgLy8gVGhlIHNlZWsgYXQgcG9zaXRpb24gNSBzaG91bGQgc3RpbGwgYmUgcGVuZGluZy4KLSAgQ2hlY2tOb05leHRCdWZmZXIoKTsKLX0KLQotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIE9sZFNlZWtQb2ludF9TdGFydE92ZXJsYXApIHsKLSAgLy8gQXBwZW5kIDIgYnVmZmVycyBhdCBwb3NpdGlvbnMgMCB0aHJvdWdoIDEuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMCwgMik7Ci0KLSAgLy8gQXBwZW5kIDE1IGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDUgdGhyb3VnaCAxOSBhbmQgc2VlayB0byBwb3NpdGlvbiAxNS4KLSAgTmV3U2VnbWVudEFwcGVuZCg1LCAxNSk7Ci0gIFNlZWsoMTUpOwotCi0gIC8vIE5vdyBzZWVrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbS4KLSAgU2VlaygwKTsKLQotICAvLyBTdGFydCBvdmVybGFwIHRoZSBvbGQgc2VlayBwb2ludC4KLSAgTmV3U2VnbWVudEFwcGVuZCgxMCwgMTApOwotCi0gIC8vIFRoZSBHZXROZXh0QnVmZmVyKCkgY2FsbCBzaG91bGQgcmVzcGVjdCB0aGUgMm5kIHNlZWsgcG9pbnQuCi0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDAsIDApOwotfQotCi1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgT2xkU2Vla1BvaW50X1N0YXJ0T3ZlcmxhcF9QZW5kaW5nKSB7Ci0gIC8vIEFwcGVuZCAyIGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDAgdGhyb3VnaCAxLgotICBOZXdTZWdtZW50QXBwZW5kKDAsIDIpOwotCi0gIC8vIEFwcGVuZCAxNSBidWZmZXJzIGF0IHBvc2l0aW9ucyAxMCB0aHJvdWdoIDI0IGFuZCBzZWVrIHRvIHBvc2l0aW9uIDIwLgotICBOZXdTZWdtZW50QXBwZW5kKDEwLCAxNSk7Ci0gIFNlZWsoMjApOwotCi0gIC8vIE5vdyBzZWVrIHRvIHBvc2l0aW9uIDUuCi0gIFNlZWsoNSk7Ci0KLSAgLy8gU3RhcnQgb3ZlcmxhcCB0aGUgb2xkIHNlZWsgcG9pbnQuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMTUsIDEwKTsKLQotICAvLyBUaGUgc2VlayBhdCB0aW1lIDAgc2hvdWxkIHN0aWxsIGJlIHBlbmRpbmcuCi0gIENoZWNrTm9OZXh0QnVmZmVyKCk7Ci19Ci0KLVRFU1RfRihTb3VyY2VCdWZmZXJTdHJlYW1UZXN0LCBPbGRTZWVrUG9pbnRfRW5kT3ZlcmxhcCkgewotICAvLyBBcHBlbmQgNSBidWZmZXJzIGF0IHBvc2l0aW9ucyAwIHRocm91Z2ggNC4KLSAgTmV3U2VnbWVudEFwcGVuZCgwLCA0KTsKLQotICAvLyBBcHBlbmQgMTUgYnVmZmVycyBhdCBwb3NpdGlvbnMgMTAgdGhyb3VnaCAyNCBhbmQgc2VlayB0byBzdGFydCBvZiByYW5nZS4KLSAgTmV3U2VnbWVudEFwcGVuZCgxMCwgMTUpOwotICBTZWVrKDEwKTsKLQotICAvLyBOb3cgc2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0uCi0gIFNlZWsoMCk7Ci0KLSAgLy8gRW5kIG92ZXJsYXAgdGhlIG9sZCBzZWVrIHBvaW50LgotICBOZXdTZWdtZW50QXBwZW5kKDUsIDEwKTsKLQotICAvLyBUaGUgR2V0TmV4dEJ1ZmZlcigpIGNhbGwgc2hvdWxkIHJlc3BlY3QgdGhlIDJuZCBzZWVrIHBvaW50LgotICBDaGVja0V4cGVjdGVkQnVmZmVycygwLCAwKTsKLX0KLQotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIE9sZFNlZWtQb2ludF9FbmRPdmVybGFwX1BlbmRpbmcpIHsKLSAgLy8gQXBwZW5kIDIgYnVmZmVycyBhdCBwb3NpdGlvbnMgMCB0aHJvdWdoIDEuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMCwgMik7Ci0KLSAgLy8gQXBwZW5kIDE1IGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDE1IHRocm91Z2ggMjkgYW5kIHNlZWsgdG8gc3RhcnQgb2YgcmFuZ2UuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMTUsIDE1KTsKLSAgU2VlaygxNSk7Ci0KLSAgLy8gTm93IHNlZWsgdG8gcG9zaXRpb24gNQotICBTZWVrKDUpOwotCi0gIC8vIEVuZCBvdmVybGFwIHRoZSBvbGQgc2VlayBwb2ludC4KLSAgTmV3U2VnbWVudEFwcGVuZCgxMCwgMTApOwotCi0gIC8vIFRoZSBzZWVrIGF0IHRpbWUgMCBzaG91bGQgc3RpbGwgYmUgcGVuZGluZy4KLSAgQ2hlY2tOb05leHRCdWZmZXIoKTsKLX0KLQotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIEdldE5leHRCdWZmZXJfQWZ0ZXJNZXJnZXMpIHsKLSAgLy8gQXBwZW5kIDUgYnVmZmVycyBhdCBwb3NpdGlvbnMgMTAgdGhyb3VnaCAxNC4KLSAgTmV3U2VnbWVudEFwcGVuZCgxMCwgNSk7Ci0KLSAgLy8gU2VlayB0byBidWZmZXIgYXQgcG9zaXRpb24gMTIuCi0gIFNlZWsoMTIpOwotCi0gIC8vIEFwcGVuZCA1IGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDUgdGhyb3VnaCA5LgotICBOZXdTZWdtZW50QXBwZW5kKDUsIDUpOwotCi0gIC8vIE1ha2Ugc3VyZSByYW5nZXMgYXJlIG1lcmdlZC4KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbNSwxNCkgfSIpOwotCi0gIC8vIE1ha2Ugc3VyZSB0aGUgbmV4dCBidWZmZXIgaXMgY29ycmVjdC4KLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMTAsIDEwKTsKLQotICAvLyBBcHBlbmQgNSBidWZmZXJzIGF0IHBvc2l0aW9ucyAxNSB0aHJvdWdoIDE5LgotICBOZXdTZWdtZW50QXBwZW5kKDE1LCA1KTsKLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbNSwxOSkgfSIpOwotCi0gIC8vIE1ha2Ugc3VyZSB0aGUgcmVtYWluaW5nIG5leHQgYnVmZmVycyBhcmUgY29ycmVjdC4KLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMTEsIDE0KTsKLX0KLQotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIEdldE5leHRCdWZmZXJfRXhoYXVzdFRoZW5BcHBlbmQpIHsKLSAgLy8gQXBwZW5kIDQgYnVmZmVycyBhdCBwb3NpdGlvbnMgMCB0aHJvdWdoIDMuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMCwgNCk7Ci0KLSAgLy8gU2VlayB0byBidWZmZXIgYXQgcG9zaXRpb24gMCBhbmQgZ2V0IGFsbCBidWZmZXJzLgotICBTZWVrKDApOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygwLCAzKTsKLQotICAvLyBOZXh0IGJ1ZmZlciBpcyBhdCBwb3NpdGlvbiA0LCBzbyBzaG91bGQgbm90IGJlIGFibGUgdG8gZnVsZmlsbCByZXF1ZXN0LgotICBDaGVja05vTmV4dEJ1ZmZlcigpOwotCi0gIC8vIEFwcGVuZCAyIGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDQgdGhyb3VnaCA1LgotICBBcHBlbmRCdWZmZXJzKDQsIDIpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycyg0LCA1KTsKLX0KLQotLy8gVGhpcyB0ZXN0IGNvdmVycyB0aGUgY2FzZSB3aGVyZSBuZXcgYnVmZmVycyBzdGFydC1vdmVybGFwIGEgcmFuZ2Ugd2hvc2UgbmV4dAotLy8gYnVmZmVyIGlzIG5vdCBidWZmZXJlZC4KLVRFU1RfRihTb3VyY2VCdWZmZXJTdHJlYW1UZXN0LCBHZXROZXh0QnVmZmVyX0V4aGF1c3RUaGVuU3RhcnRPdmVybGFwKSB7Ci0gIC8vIEFwcGVuZCAxMCBidWZmZXJzIGF0IHBvc2l0aW9ucyAwIHRocm91Z2ggOSBhbmQgZXhoYXVzdCB0aGUgYnVmZmVycy4KLSAgTmV3U2VnbWVudEFwcGVuZCgwLCAxMCwgJmtEYXRhQSk7Ci0gIFNlZWsoMCk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDAsIDksICZrRGF0YUEpOwotCi0gIC8vIE5leHQgYnVmZmVyIGlzIGF0IHBvc2l0aW9uIDEwLCBzbyBzaG91bGQgbm90IGJlIGFibGUgdG8gZnVsZmlsbCByZXF1ZXN0LgotICBDaGVja05vTmV4dEJ1ZmZlcigpOwotCi0gIC8vIEFwcGVuZCA2IGJ1ZmZlcnMgYXQgcG9zaXRvbnMgNSB0aHJvdWdoIDEwLiBUaGlzIGlzIHRvIHRlc3QgdGhhdCBkb2luZyBhCi0gIC8vIHN0YXJ0LW92ZXJsYXAgc3VjY2Vzc2Z1bGx5IGZ1bGZpbGxzIHRoZSByZWFkIGF0IHBvc2l0aW9uIDEwLCBldmVuIHRob3VnaAotICAvLyBwb3NpdGlvbiAxMCB3YXMgdW5idWZmZXJlZC4KLSAgTmV3U2VnbWVudEFwcGVuZCg1LCA2LCAma0RhdGFCKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMTAsIDEwLCAma0RhdGFCKTsKLQotICAvLyBUaGVuIGFkZCA1IGJ1ZmZlcnMgZnJvbSBwb3NpdGlvbnMgMTEgdGhvdWdoIDE1LgotICBBcHBlbmRCdWZmZXJzKDExLCA1LCAma0RhdGFCKTsKLQotICAvLyBDaGVjayB0aGUgbmV4dCA0IGJ1ZmZlcnMgYXJlIGNvcnJlY3QsIHdoaWNoIGFsc28gZWZmZWN0aXZlbHkgc2Vla3MgdG8KLSAgLy8gcG9zaXRpb24gMTUuCi0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDExLCAxNCwgJmtEYXRhQik7Ci0KLSAgLy8gUmVwbGFjZSB0aGUgbmV4dCBidWZmZXIgYXQgcG9zaXRpb24gMTUgd2l0aCBhbm90aGVyIHN0YXJ0IG92ZXJsYXAuCi0gIEFwcGVuZEJ1ZmZlcnMoMTUsIDIsICZrRGF0YUEpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygxNSwgMTYsICZrRGF0YUEpOwotfQotCi0vLyBUaGlzIHRlc3QgY292ZXJzIHRoZSBjYXNlIHdoZXJlIG5ldyBidWZmZXJzIGNvbXBsZXRlbHkgb3ZlcmxhcCBhIHJhbmdlCi0vLyB3aG9zZSBuZXh0IGJ1ZmZlciBpcyBub3QgYnVmZmVyZWQuCi1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgR2V0TmV4dEJ1ZmZlcl9FeGhhdXN0VGhlbkNvbXBsZXRlT3ZlcmxhcCkgewotICAvLyBBcHBlbmQgNSBidWZmZXJzIGF0IHBvc2l0aW9ucyAxMCB0aHJvdWdoIDE0IGFuZCBleGhhdXN0IHRoZSBidWZmZXJzLgotICBOZXdTZWdtZW50QXBwZW5kKDEwLCA1LCAma0RhdGFBKTsKLSAgU2VlaygxMCk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDEwLCAxNCwgJmtEYXRhQSk7Ci0KLSAgLy8gTmV4dCBidWZmZXIgaXMgYXQgcG9zaXRpb24gMTUsIHNvIHNob3VsZCBub3QgYmUgYWJsZSB0byBmdWxmaWxsIHJlcXVlc3QuCi0gIENoZWNrTm9OZXh0QnVmZmVyKCk7Ci0KLSAgLy8gRG8gYSBjb21wbGV0ZSBvdmVybGFwIGFuZCB0ZXN0IHRoYXQgdGhpcyBzdWNjZXNzZnVsbHkgZnVsZmlsbHMgdGhlIHJlYWQKLSAgLy8gYXQgcG9zaXRpb24gMTUuCi0gIE5ld1NlZ21lbnRBcHBlbmQoNSwgMTEsICZrRGF0YUIpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygxNSwgMTUsICZrRGF0YUIpOwotCi0gIC8vIFRoZW4gYWRkIDUgYnVmZmVycyBmcm9tIHBvc2l0aW9ucyAxNiB0aG91Z2ggMjAuCi0gIEFwcGVuZEJ1ZmZlcnMoMTYsIDUsICZrRGF0YUIpOwotCi0gIC8vIENoZWNrIHRoZSBuZXh0IDQgYnVmZmVycyBhcmUgY29ycmVjdCwgd2hpY2ggYWxzbyBlZmZlY3RpdmVseSBzZWVrcyB0bwotICAvLyBwb3NpdGlvbiAyMC4KLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMTYsIDE5LCAma0RhdGFCKTsKLQotICAvLyBEbyBhIGNvbXBsZXRlIG92ZXJsYXAgYW5kIHJlcGxhY2UgdGhlIGJ1ZmZlciBhdCBwb3NpdGlvbiAyMC4KLSAgTmV3U2VnbWVudEFwcGVuZCgwLCAyMSwgJmtEYXRhQSk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDIwLCAyMCwgJmtEYXRhQSk7Ci19Ci0KLS8vIFRoaXMgdGVzdCBjb3ZlcnMgdGhlIGNhc2Ugd2hlcmUgYSByYW5nZSBpcyBzdGFsbGVkIHdhaXRpbmcgZm9yIGl0cyBuZXh0Ci0vLyBidWZmZXIsIHRoZW4gYW4gZW5kLW92ZXJsYXAgY2F1c2VzIHRoZSBlbmQgb2YgdGhlIHJhbmdlIHRvIGJlIGRlbGV0ZWQuCi1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgR2V0TmV4dEJ1ZmZlcl9FeGhhdXN0VGhlbkVuZE92ZXJsYXApIHsKLSAgLy8gQXBwZW5kIDUgYnVmZmVycyBhdCBwb3NpdGlvbnMgMTAgdGhyb3VnaCAxNCBhbmQgZXhoYXVzdCB0aGUgYnVmZmVycy4KLSAgTmV3U2VnbWVudEFwcGVuZCgxMCwgNSwgJmtEYXRhQSk7Ci0gIFNlZWsoMTApOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygxMCwgMTQsICZrRGF0YUEpOwotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFsxMCwxNCkgfSIpOwotCi0gIC8vIE5leHQgYnVmZmVyIGlzIGF0IHBvc2l0aW9uIDE1LCBzbyBzaG91bGQgbm90IGJlIGFibGUgdG8gZnVsZmlsbCByZXF1ZXN0LgotICBDaGVja05vTmV4dEJ1ZmZlcigpOwotCi0gIC8vIERvIGFuIGVuZCBvdmVybGFwIHRoYXQgY2F1c2VzIHRoZSBsYXR0ZXIgaGFsZiBvZiB0aGUgcmFuZ2UgdG8gYmUgZGVsZXRlZC4KLSAgTmV3U2VnbWVudEFwcGVuZCg1LCA2LCAma0RhdGFCKTsKLSAgQ2hlY2tOb05leHRCdWZmZXIoKTsKLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbNSwxMCkgfSIpOwotCi0gIC8vIEZpbGwgaW4gdGhlIGdhcC4gR2V0dGluZyB0aGUgbmV4dCBidWZmZXIgc2hvdWxkIHN0aWxsIHN0YWxsIGF0IHBvc2l0aW9uIDE1LgotICBmb3IgKGludCBpID0gMTE7IGkgPD0gMTQ7IGkrKykgewotICAgIEFwcGVuZEJ1ZmZlcnMoaSwgMSwgJmtEYXRhQik7Ci0gICAgQ2hlY2tOb05leHRCdWZmZXIoKTsKLSAgfQotCi0gIC8vIEFwcGVuZCB0aGUgYnVmZmVyIGF0IHBvc2l0aW9uIDE1IGFuZCBjaGVjayB0byBtYWtlIHN1cmUgYWxsIGlzIGNvcnJlY3QuCi0gIEFwcGVuZEJ1ZmZlcnMoMTUsIDEpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygxNSwgMTUpOwotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFs1LDE1KSB9Iik7Ci19Ci0KLS8vIFRoaXMgdGVzdCBpcyB0ZXN0aW5nIHRoZSAibmV4dCBidWZmZXIiIGxvZ2ljIGFmdGVyIGEgY29tcGxldGUgb3ZlcmxhcC4gSW4KLS8vIHRoaXMgc2NlbmFyaW8sIHdoZW4gdGhlIHRyYWNrIGJ1ZmZlciBpcyBleGhhdXN0ZWQsIHRoZXJlIGlzIG5vIGJ1ZmZlcmVkIGRhdGEKLS8vIHRvIGZ1bGZpbGwgdGhlIHJlcXVlc3QuIFRoZSBTb3VyY2VCdWZmZXJTdHJlYW0gc2hvdWxkIGJlIGFibGUgdG8gZnVsZmlsbCB0aGUKLS8vIHJlcXVlc3Qgd2hlbiB0aGUgZGF0YSBpcyBsYXRlciBhcHBlbmRlZCwgYW5kIHNob3VsZCBub3QgbG9zZSB0cmFjayBvZiB0aGUKLS8vICJuZXh0IGJ1ZmZlciIgcG9zaXRpb24uCi1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgR2V0TmV4dEJ1ZmZlcl9PdmVybGFwX1NlbGVjdGVkX0NvbXBsZXRlKSB7Ci0gIC8vIEFwcGVuZCA1IGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDUgdGhyb3VnaCA5LgotICBOZXdTZWdtZW50QXBwZW5kKDUsIDUsICZrRGF0YUEpOwotCi0gIC8vIFNlZWsgdG8gYnVmZmVyIGF0IHBvc2l0aW9uIDUgYW5kIGdldCBuZXh0IGJ1ZmZlci4KLSAgU2Vlayg1KTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoNSwgNSwgJmtEYXRhQSk7Ci0KLSAgLy8gUmVwbGFjZSBleGlzdGluZyBkYXRhIHdpdGggbmV3IGRhdGEuCi0gIE5ld1NlZ21lbnRBcHBlbmQoNSwgNSwgJmtEYXRhQik7Ci0KLSAgLy8gRXhwZWN0IG9sZCBkYXRhIHVwIHVudGlsIG5leHQga2V5ZnJhbWUgaW4gbmV3IGRhdGEuCi0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDYsIDksICZrRGF0YUEpOwotCi0gIC8vIE5leHQgYnVmZmVyIGlzIGF0IHBvc2l0aW9uIDEwLCBzbyBzaG91bGQgbm90IGJlIGFibGUgdG8gZnVsZmlsbCB0aGUKLSAgLy8gcmVxdWVzdC4KLSAgQ2hlY2tOb05leHRCdWZmZXIoKTsKLQotICAvLyBOb3cgYWRkIDUgbmV3IGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDEwIHRocm91Z2ggMTQuCi0gIEFwcGVuZEJ1ZmZlcnMoMTAsIDUsICZrRGF0YUIpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygxMCwgMTQsICZrRGF0YUIpOwotfQotCi1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgUHJlc2VudGF0aW9uVGltZXN0YW1wSW5kZXBlbmRlbmNlKSB7Ci0gIC8vIEFwcGVuZCAyMCBidWZmZXJzIGF0IHBvc2l0aW9uIDAuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMCwgMjApOwotICBTZWVrKDApOwotCi0gIGludCBsYXN0X2tleWZyYW1lX2lkeCA9IC0xOwotICBiYXNlOjpUaW1lRGVsdGEgbGFzdF9rZXlmcmFtZV9wcmVzZW50YXRpb25fdGltZXN0YW1wOwotICBiYXNlOjpUaW1lRGVsdGEgbGFzdF9wX2ZyYW1lX3ByZXNlbnRhdGlvbl90aW1lc3RhbXA7Ci0KLSAgLy8gQ2hlY2sgZm9yIElCQi4uLkJCUCBwYXR0ZXJuLgotICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKLSAgICBzY29wZWRfcmVmcHRyPFN0cmVhbVBhcnNlckJ1ZmZlcj4gYnVmZmVyOwotICAgIEFTU0VSVF9FUShzdHJlYW1fLT5HZXROZXh0QnVmZmVyKCZidWZmZXIpLCBTb3VyY2VCdWZmZXJTdHJlYW06OmtTdWNjZXNzKTsKLQotICAgIGlmIChidWZmZXItPklzS2V5ZnJhbWUoKSkgewotICAgICAgRVhQRUNUX0VRKGJ1ZmZlci0+R2V0VGltZXN0YW1wKCksIGJ1ZmZlci0+R2V0RGVjb2RlVGltZXN0YW1wKCkpOwotICAgICAgbGFzdF9rZXlmcmFtZV9pZHggPSBpOwotICAgICAgbGFzdF9rZXlmcmFtZV9wcmVzZW50YXRpb25fdGltZXN0YW1wID0gYnVmZmVyLT5HZXRUaW1lc3RhbXAoKTsKLSAgICB9IGVsc2UgaWYgKGkgPT0gbGFzdF9rZXlmcmFtZV9pZHggKyAxKSB7Ci0gICAgICBBU1NFUlRfTkUobGFzdF9rZXlmcmFtZV9pZHgsIC0xKTsKLSAgICAgIGxhc3RfcF9mcmFtZV9wcmVzZW50YXRpb25fdGltZXN0YW1wID0gYnVmZmVyLT5HZXRUaW1lc3RhbXAoKTsKLSAgICAgIEVYUEVDVF9MVChsYXN0X2tleWZyYW1lX3ByZXNlbnRhdGlvbl90aW1lc3RhbXAsCi0gICAgICAgICAgICAgICAgbGFzdF9wX2ZyYW1lX3ByZXNlbnRhdGlvbl90aW1lc3RhbXApOwotICAgIH0gZWxzZSB7Ci0gICAgICBFWFBFQ1RfR1QoYnVmZmVyLT5HZXRUaW1lc3RhbXAoKSwgbGFzdF9rZXlmcmFtZV9wcmVzZW50YXRpb25fdGltZXN0YW1wKTsKLSAgICAgIEVYUEVDVF9MVChidWZmZXItPkdldFRpbWVzdGFtcCgpLCBsYXN0X3BfZnJhbWVfcHJlc2VudGF0aW9uX3RpbWVzdGFtcCk7Ci0gICAgICBFWFBFQ1RfTFQoYnVmZmVyLT5HZXRUaW1lc3RhbXAoKSwgYnVmZmVyLT5HZXREZWNvZGVUaW1lc3RhbXAoKSk7Ci0gICAgfQotICB9Ci19Ci0KLVRFU1RfRihTb3VyY2VCdWZmZXJTdHJlYW1UZXN0LCBHYXJiYWdlQ29sbGVjdGlvbl9EZWxldGVGcm9udCkgewotICAvLyBTZXQgbWVtb3J5IGxpbWl0IHRvIDIwIGJ1ZmZlcnMuCi0gIFNldE1lbW9yeUxpbWl0KDIwKTsKLQotICAvLyBBcHBlbmQgMjAgYnVmZmVycyBhdCBwb3NpdGlvbnMgMCB0aHJvdWdoIDE5LgotICBOZXdTZWdtZW50QXBwZW5kKDAsIDEsICZrRGF0YUEpOwotICBmb3IgKGludCBpID0gMTsgaSA8IDIwOyBpKyspCi0gICAgQXBwZW5kQnVmZmVycyhpLCAxLCAma0RhdGFBKTsKLQotICAvLyBOb25lIG9mIHRoZSBidWZmZXJzIHNob3VsZCB0cmlnZ2VyIGdhcmJhZ2UgY29sbGVjdGlvbiwgc28gYWxsIGRhdGEgc2hvdWxkCi0gIC8vIGJlIHRoZXJlIGFzIGV4cGVjdGVkLgotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFswLDE5KSB9Iik7Ci0gIFNlZWsoMCk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDAsIDE5LCAma0RhdGFBKTsKLQotICAvLyBTZWVrIHRvIHRoZSBtaWRkbGUgb2YgdGhlIHN0cmVhbS4KLSAgU2VlaygxMCk7Ci0KLSAgLy8gQXBwZW5kIDUgYnVmZmVycyB0byB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uCi0gIEFwcGVuZEJ1ZmZlcnMoMjAsIDUsICZrRGF0YUEpOwotCi0gIC8vIEdDIHNob3VsZCBoYXZlIGRlbGV0ZWQgdGhlIGZpcnN0IDUgYnVmZmVycy4KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbNSwyNCkgfSIpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygxMCwgMjQsICZrRGF0YUEpOwotICBTZWVrKDUpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycyg1LCA5LCAma0RhdGFBKTsKLX0KLQotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIEdhcmJhZ2VDb2xsZWN0aW9uX0RlbGV0ZUZyb250R09Qc0F0QVRpbWUpIHsKLSAgLy8gU2V0IG1lbW9yeSBsaW1pdCB0byAyMCBidWZmZXJzLgotICBTZXRNZW1vcnlMaW1pdCgyMCk7Ci0KLSAgLy8gQXBwZW5kIDIwIGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDAgdGhyb3VnaCAxOS4KLSAgTmV3U2VnbWVudEFwcGVuZCgwLCAyMCwgJmtEYXRhQSk7Ci0KLSAgLy8gU2VlayB0byBwb3NpdGlvbiAxMC4KLSAgU2VlaygxMCk7Ci0KLSAgLy8gQWRkIG9uZSBidWZmZXIgdG8gcHV0IHRoZSBtZW1vcnkgb3ZlciB0aGUgY2FwLgotICBBcHBlbmRCdWZmZXJzKDIwLCAxLCAma0RhdGFBKTsKLQotICAvLyBHQyBzaG91bGQgaGF2ZSBkZWxldGVkIHRoZSBmaXJzdCA1IGJ1ZmZlcnMgc28gdGhhdCB0aGUgcmFuZ2Ugc3RpbGwgYmVnaW5zCi0gIC8vIHdpdGggYSBrZXlmcmFtZS4KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbNSwyMCkgfSIpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygxMCwgMjAsICZrRGF0YUEpOwotICBTZWVrKDUpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycyg1LCA5LCAma0RhdGFBKTsKLX0KLQotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIEdhcmJhZ2VDb2xsZWN0aW9uX0RlbGV0ZUJhY2spIHsKLSAgLy8gU2V0IG1lbW9yeSBsaW1pdCB0byA1IGJ1ZmZlcnMuCi0gIFNldE1lbW9yeUxpbWl0KDUpOwotCi0gIC8vIFNlZWsgdG8gcG9zaXRpb24gMC4KLSAgU2VlaygwKTsKLQotICAvLyBBcHBlbmQgMjAgYnVmZmVycyBhdCBwb3NpdGlvbnMgMCB0aHJvdWdoIDE5LgotICBOZXdTZWdtZW50QXBwZW5kKDAsIDIwLCAma0RhdGFBKTsKLQotICAvLyBTaG91bGQgbGVhdmUgdGhlIGZpcnN0IDUgYnVmZmVycyBmcm9tIDAgdG8gNCBhbmQgdGhlIGxhc3QgR09QIGFwcGVuZGVkLgotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFswLDQpIFsxNSwxOSkgfSIpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygwLCA0LCAma0RhdGFBKTsKLX0KLQotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIEdhcmJhZ2VDb2xsZWN0aW9uX0RlbGV0ZUZyb250QW5kQmFjaykgewotICAvLyBTZXQgbWVtb3J5IGxpbWl0IHRvIDMgYnVmZmVycy4KLSAgU2V0TWVtb3J5TGltaXQoMyk7Ci0KLSAgLy8gU2VlayB0byBwb3NpdGlvbiAxNS4KLSAgU2VlaygxNSk7Ci0KLSAgLy8gQXBwZW5kIDQwIGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDAgdGhyb3VnaCAzOS4KLSAgTmV3U2VnbWVudEFwcGVuZCgwLCA0MCwgJmtEYXRhQSk7Ci0KLSAgLy8gU2hvdWxkIGxlYXZlIHRoZSBHT1AgY29udGFpbmluZyB0aGUgc2VlayBwb3NpdGlvbiBhbmQgdGhlIGxhc3QgR09QCi0gIC8vIGFwcGVuZGVkLgotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFsxNSwxOSkgWzM1LDM5KSB9Iik7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDE1LCAxOSwgJmtEYXRhQSk7Ci0gIENoZWNrTm9OZXh0QnVmZmVyKCk7Ci19Ci0KLVRFU1RfRihTb3VyY2VCdWZmZXJTdHJlYW1UZXN0LCBHYXJiYWdlQ29sbGVjdGlvbl9EZWxldGVTZXZlcmFsUmFuZ2VzKSB7Ci0gIC8vIEFwcGVuZCA1IGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDAgdGhyb3VnaCA0LgotICBOZXdTZWdtZW50QXBwZW5kKDAsIDUpOwotCi0gIC8vIEFwcGVuZCA1IGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDEwIHRocm91Z2ggMTQuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMTAsIDUpOwotCi0gIC8vIEFwcGVuZCA1IGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDIwIHRocm91Z2ggMjQuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMjAsIDUpOwotCi0gIC8vIEFwcGVuZCA1IGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDMwIHRocm91Z2ggMzQuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMzAsIDUpOwotCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzAsNCkgWzEwLDE0KSBbMjAsMjQpIFszMCwzNCkgfSIpOwotCi0gIC8vIFNlZWsgdG8gcG9zaXRpb24gMjEuCi0gIFNlZWsoMjApOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygyMCwgMjApOwotCi0gIC8vIFNldCBtZW1vcnkgbGltaXQgdG8gMSBidWZmZXIuCi0gIFNldE1lbW9yeUxpbWl0KDEpOwotCi0gIC8vIEFwcGVuZCA1IGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDQwIHRocm91Z2ggNDQuIFRoaXMgd2lsbCB0cmlnZ2VyIEdDLgotICBOZXdTZWdtZW50QXBwZW5kKDQwLCA1KTsKLQotICAvLyBTaG91bGQgZGVsZXRlIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBHT1AgY29udGFpbmluZyB0aGUgY3VycmVudCBidWZmZXIgYW5kCi0gIC8vIHRoZSBsYXN0IEdPUCBhcHBlbmRlZC4KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbMjAsMjQpIFs0MCw0NCkgfSIpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygyMSwgMjQpOwotICBDaGVja05vTmV4dEJ1ZmZlcigpOwotCi0gIC8vIENvbnRpbnVlIGFwcGVuZGluZyBpbnRvIHRoZSBsYXN0IHJhbmdlIHRvIG1ha2Ugc3VyZSBpdCBkaWRuJ3QgYnJlYWsuCi0gIEFwcGVuZEJ1ZmZlcnMoNDUsIDEwKTsKLSAgLy8gU2hvdWxkIG9ubHkgc2F2ZSBsYXN0IEdPUCBhcHBlbmRlZC4KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbMjAsMjQpIFs1MCw1NCkgfSIpOwotCi0gIC8vIE1ha2Ugc3VyZSBhcHBlbmRpbmcgYmVmb3JlIGFuZCBhZnRlciB0aGUgcmFuZ2VzIGRpZG4ndCBzb21laG93IGJyZWFrLgotICBTZXRNZW1vcnlMaW1pdCgxMDApOwotICBOZXdTZWdtZW50QXBwZW5kKDAsIDEwKTsKLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbMCw5KSBbMjAsMjQpIFs1MCw1NCkgfSIpOwotICBTZWVrKDApOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygwLCA5KTsKLQotICBOZXdTZWdtZW50QXBwZW5kKDkwLCAxMCk7Ci0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzAsOSkgWzIwLDI0KSBbNTAsNTQpIFs5MCw5OSkgfSIpOwotICBTZWVrKDUwKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoNTAsIDU0KTsKLSAgQ2hlY2tOb05leHRCdWZmZXIoKTsKLSAgU2Vlayg5MCk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDkwLCA5OSk7Ci0gIENoZWNrTm9OZXh0QnVmZmVyKCk7Ci19Ci0KLVRFU1RfRihTb3VyY2VCdWZmZXJTdHJlYW1UZXN0LCBHYXJiYWdlQ29sbGVjdGlvbl9Ob1NlZWspIHsKLSAgLy8gU2V0IG1lbW9yeSBsaW1pdCB0byAyMCBidWZmZXJzLgotICBTZXRNZW1vcnlMaW1pdCgyMCk7Ci0KLSAgLy8gQXBwZW5kIDI1IGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDAgdGhyb3VnaCAyNC4KLSAgTmV3U2VnbWVudEFwcGVuZCgwLCAyNSwgJmtEYXRhQSk7Ci0KLSAgLy8gR0MgZGVsZXRlcyB0aGUgZmlyc3QgNSBidWZmZXJzIHRvIGtlZXAgdGhlIG1lbW9yeSBsaW1pdCB3aXRoaW4gY2FwLgotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFs1LDI0KSB9Iik7Ci0gIENoZWNrTm9OZXh0QnVmZmVyKCk7Ci0gIFNlZWsoNSk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDUsIDI0LCAma0RhdGFBKTsKLX0KLQotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIEdhcmJhZ2VDb2xsZWN0aW9uX1BlbmRpbmdTZWVrKSB7Ci0gIC8vIEFwcGVuZCAxMCBidWZmZXJzIGF0IHBvc2l0aW9ucyAwIHRocm91Z2ggOS4KLSAgTmV3U2VnbWVudEFwcGVuZCgwLCAxMCwgJmtEYXRhQSk7Ci0KLSAgLy8gQXBwZW5kIDUgYnVmZmVycyBhdCBwb3NpdGlvbnMgMjUgdGhyb3VnaCAyOS4KLSAgTmV3U2VnbWVudEFwcGVuZCgyNSwgNSwgJmtEYXRhQSk7Ci0KLSAgLy8gU2VlayB0byBwb3NpdGlvbiAxNS4KLSAgU2VlaygxNSk7Ci0gIENoZWNrTm9OZXh0QnVmZmVyKCk7Ci0KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbMCw5KSBbMjUsMjkpIH0iKTsKLQotICAvLyBTZXQgbWVtb3J5IGxpbWl0IHRvIDUgYnVmZmVycy4KLSAgU2V0TWVtb3J5TGltaXQoNSk7Ci0KLSAgLy8gQXBwZW5kIDUgYnVmZmVycyBhcyBwb3NpdGlvbnMgMzAgdG8gMzQgdG8gdHJpZ2dlciBHQy4KLSAgQXBwZW5kQnVmZmVycygzMCwgNSwgJmtEYXRhQSk7Ci0KLSAgLy8gVGhlIGN1cnJlbnQgYWxnb3JpdGhtIHdpbGwgZGVsZXRlIGZyb20gdGhlIGJlZ2lubmluZyB1bnRpbCB0aGUgbWVtb3J5IGlzCi0gIC8vIHVuZGVyIGNhcC4KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbMzAsMzQpIH0iKTsKLQotICAvLyBFeHBhbmQgbWVtb3J5IGxpbWl0IGFnYWluIHNvIHRoYXQgR0Mgd29uJ3QgYmUgdHJpZ2dlcmVkLgotICBTZXRNZW1vcnlMaW1pdCgxMDApOwotCi0gIC8vIEFwcGVuZCBkYXRhIHRvIGZ1bGZpbGwgc2Vlay4KLSAgTmV3U2VnbWVudEFwcGVuZCgxNSwgNSwgJmtEYXRhQSk7Ci0KLSAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIGFsbCBpcyB3ZWxsLgotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFsxNSwxOSkgWzMwLDM0KSB9Iik7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDE1LCAxOSwgJmtEYXRhQSk7Ci0gIFNlZWsoMzApOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygzMCwgMzQsICZrRGF0YUEpOwotfQotCi1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgR2FyYmFnZUNvbGxlY3Rpb25fTmVlZHNNb3JlRGF0YSkgewotICAvLyBTZXQgbWVtb3J5IGxpbWl0IHRvIDE1IGJ1ZmZlcnMuCi0gIFNldE1lbW9yeUxpbWl0KDE1KTsKLQotICAvLyBBcHBlbmQgMTAgYnVmZmVycyBhdCBwb3NpdGlvbnMgMCB0aHJvdWdoIDkuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMCwgMTAsICZrRGF0YUEpOwotCi0gIC8vIEFkdmFuY2UgbmV4dCBidWZmZXIgcG9zaXRpb24gdG8gMTAuCi0gIFNlZWsoMCk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDAsIDksICZrRGF0YUEpOwotICBDaGVja05vTmV4dEJ1ZmZlcigpOwotCi0gIC8vIEFwcGVuZCAyMCBidWZmZXJzIGF0IHBvc2l0aW9ucyAxNSB0aHJvdWdoIDM0LgotICBOZXdTZWdtZW50QXBwZW5kKDE1LCAyMCwgJmtEYXRhQSk7Ci0KLSAgLy8gR0Mgc2hvdWxkIGhhdmUgc2F2ZWQgdGhlIGtleWZyYW1lIGJlZm9yZSB0aGUgY3VycmVudCBzZWVrIHBvc2l0aW9uIGFuZCB0aGUKLSAgLy8gZGF0YSBjbG9zZXN0IHRvIHRoZSBjdXJyZW50IHNlZWsgcG9zaXRpb24uIEl0IHdpbGwgYWxzbyBzYXZlIHRoZSBsYXN0IEdPUAotICAvLyBhcHBlbmRlZC4KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbNSw5KSBbMTUsMTkpIFszMCwzNCkgfSIpOwotCi0gIC8vIE5vdyBmdWxmaWxsIHRoZSBzZWVrIGF0IHBvc2l0aW9uIDEwLiBUaGlzIHdpbGwgbWFrZSBHQyBkZWxldGUgdGhlIGRhdGEKLSAgLy8gYmVmb3JlIHBvc2l0aW9uIDEwIHRvIGtlZXAgaXQgd2l0aGluIGNhcC4KLSAgTmV3U2VnbWVudEFwcGVuZCgxMCwgNSwgJmtEYXRhQSk7Ci0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzEwLDE5KSBbMzAsMzQpIH0iKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMTAsIDE5LCAma0RhdGFBKTsKLX0KLQotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIEdhcmJhZ2VDb2xsZWN0aW9uX1RyYWNrQnVmZmVyKSB7Ci0gIC8vIFNldCBtZW1vcnkgbGltaXQgdG8gMyBidWZmZXJzLgotICBTZXRNZW1vcnlMaW1pdCgzKTsKLQotICAvLyBTZWVrIHRvIHBvc2l0aW9uIDE1LgotICBTZWVrKDE1KTsKLQotICAvLyBBcHBlbmQgMTggYnVmZmVycyBhdCBwb3NpdGlvbnMgMCB0aHJvdWdoIDE3LgotICBOZXdTZWdtZW50QXBwZW5kKDAsIDE4LCAma0RhdGFBKTsKLQotICAvLyBTaG91bGQgbGVhdmUgR09QIGNvbnRhaW5pbmcgc2VlayBwb3NpdGlvbi4KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbMTUsMTcpIH0iKTsKLQotICAvLyBTZWVrIGFoZWFkIHRvIHBvc2l0aW9uIDE2LgotICBDaGVja0V4cGVjdGVkQnVmZmVycygxNSwgMTUsICZrRGF0YUEpOwotCi0gIC8vIENvbXBsZXRlbHkgb3ZlcmxhcCB0aGUgZXhpc3RpbmcgYnVmZmVycy4KLSAgTmV3U2VnbWVudEFwcGVuZCgwLCAyMCwgJmtEYXRhQik7Ci0KLSAgLy8gQmVjYXVzZSBidWZmZXJzIDE2IGFuZCAxNyBhcmUgbm90IGtleWZyYW1lcywgdGhleSBhcmUgbW92ZWQgdG8gdGhlIHRyYWNrCi0gIC8vIGJ1ZmZlciB1cG9uIG92ZXJsYXAuIFRoZSBzb3VyY2UgYnVmZmVyIChpLmUuIG5vdCB0aGUgdHJhY2sgYnVmZmVyKSBpcyBub3cKLSAgLy8gd2FpdGluZyBmb3IgdGhlIG5leHQga2V5ZnJhbWUuCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzE1LDE5KSB9Iik7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDE2LCAxNywgJmtEYXRhQSk7Ci0gIENoZWNrTm9OZXh0QnVmZmVyKCk7Ci0KLSAgLy8gTm93IGFkZCBhIGtleWZyYW1lIGF0IHBvc2l0aW9uIDIwLgotICBBcHBlbmRCdWZmZXJzKDIwLCA1LCAma0RhdGFCKTsKLQotICAvLyBTaG91bGQgZ2FyYmFnZSBjb2xsZWN0IHN1Y2ggdGhhdCB0aGVyZSBhcmUgNSBmcmFtZXMgcmVtYWluaW5nLCBzdGFydGluZyBhdAotICAvLyB0aGUga2V5ZnJhbWUuCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzIwLDI0KSB9Iik7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDIwLCAyNCwgJmtEYXRhQik7Ci0gIENoZWNrTm9OZXh0QnVmZmVyKCk7Ci19Ci0KLS8vIFRlc3Qgc2F2aW5nIHRoZSBsYXN0IEdPUCBhcHBlbmRlZCB3aGVuIHRoaXMgR09QIGlzIHRoZSBvbmx5IEdPUCBpbiBpdHMgcmFuZ2UuCi1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgR2FyYmFnZUNvbGxlY3Rpb25fU2F2ZUFwcGVuZEdPUCkgewotICAvLyBTZXQgbWVtb3J5IGxpbWl0IHRvIDMgYW5kIG1ha2Ugc3VyZSB0aGUgNC1ieXRlIEdPUCBpcyBub3QgZ2FyYmFnZQotICAvLyBjb2xsZWN0ZWQuCi0gIFNldE1lbW9yeUxpbWl0KDMpOwotICBOZXdTZWdtZW50QXBwZW5kKCIwSyAzMCA2MCA5MCIpOwotICBDaGVja0V4cGVjdGVkUmFuZ2VzQnlUaW1lc3RhbXAoInsgWzAsMTIwKSB9Iik7Ci0KLSAgLy8gTWFrZSBzdXJlIHlvdSBjYW4gY29udGludWUgYXBwZW5kaW5nIGRhdGEgdG8gdGhpcyBHT1A7IGFnYWluLCBHQyBzaG91bGQgbm90Ci0gIC8vIHdpcGUgb3V0IGFueXRoaW5nLgotICBBcHBlbmRCdWZmZXJzKCIxMjAiKTsKLSAgQ2hlY2tFeHBlY3RlZFJhbmdlc0J5VGltZXN0YW1wKCJ7IFswLDE1MCkgfSIpOwotCi0gIC8vIFNldCBtZW1vcnkgbGltaXQgdG8gMTAwIGFuZCBhcHBlbmQgYSAybmQgcmFuZ2UgYWZ0ZXIgdGhpcyB3aXRob3V0Ci0gIC8vIHRyaWdnZXJpbmcgR0MuCi0gIFNldE1lbW9yeUxpbWl0KDEwMCk7Ci0gIE5ld1NlZ21lbnRBcHBlbmQoIjIwMEsgMjMwIDI2MCAyOTBLIDMyMCAzNTAiKTsKLSAgQ2hlY2tFeHBlY3RlZFJhbmdlc0J5VGltZXN0YW1wKCJ7IFswLDE1MCkgWzIwMCwzODApIH0iKTsKLQotICAvLyBTZWVrIHRvIDI5MG1zLgotICBTZWVrVG9UaW1lc3RhbXAoYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDI5MCkpOwotCi0gIC8vIE5vdyBzZXQgbWVtb3J5IGxpbWl0IHRvIDMgYW5kIGFwcGVuZCBhIEdPUCBpbiBhIHNlcGFyYXRlIHJhbmdlIGFmdGVyIHRoZQotICAvLyBzZWxlY3RlZCByYW5nZS4gQmVjYXVzZSBpdCBpcyBhZnRlciAyOTBtcywgdGhpcyB0ZXN0cyB0aGF0IHRoZSBHT1AgaXMgc2F2ZWQKLSAgLy8gd2hlbiBkZWxldGluZyBmcm9tIHRoZSBiYWNrLgotICBTZXRNZW1vcnlMaW1pdCgzKTsKLSAgTmV3U2VnbWVudEFwcGVuZCgiNTAwSyA1MzAgNTYwIDU5MCIpOwotCi0gIC8vIFNob3VsZCBzYXZlIEdPUCB3aXRoIDI5MG1zIGFuZCBsYXN0IEdPUCBhcHBlbmRlZC4KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlc0J5VGltZXN0YW1wKCJ7IFsyOTAsMzgwKSBbNTAwLDYyMCkgfSIpOwotCi0gIC8vIENvbnRpbnVlIGFwcGVuZGluZyB0byB0aGlzIEdPUCBhZnRlciBHQy4KLSAgQXBwZW5kQnVmZmVycygiNjIwIik7Ci0gIENoZWNrRXhwZWN0ZWRSYW5nZXNCeVRpbWVzdGFtcCgieyBbMjkwLDM4MCkgWzUwMCw2NTApIH0iKTsKLX0KLQotLy8gVGVzdCBzYXZpbmcgdGhlIGxhc3QgR09QIGFwcGVuZGVkIHdoZW4gdGhpcyBHT1AgaXMgaW4gdGhlIG1pZGRsZSBvZiBhCi0vLyBub24tc2VsZWN0ZWQgcmFuZ2UuCi1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgR2FyYmFnZUNvbGxlY3Rpb25fU2F2ZUFwcGVuZEdPUF9NaWRkbGUpIHsKLSAgLy8gQXBwZW5kIDMgR09QcyBzdGFydGluZyBhdCAwbXMsIDMwbXMgYXBhcnQuCi0gIE5ld1NlZ21lbnRBcHBlbmQoIjBLIDMwIDYwIDkwSyAxMjAgMTUwIDE4MEsgMjEwIDI0MCIpOwotICBDaGVja0V4cGVjdGVkUmFuZ2VzQnlUaW1lc3RhbXAoInsgWzAsMjcwKSB9Iik7Ci0KLSAgLy8gTm93IHNldCB0aGUgbWVtb3J5IGxpbWl0IHRvIDEgYW5kIG92ZXJsYXAgdGhlIG1pZGRsZSBvZiB0aGUgcmFuZ2Ugd2l0aCBhCi0gIC8vIG5ldyBHT1AuCi0gIFNldE1lbW9yeUxpbWl0KDEpOwotICBOZXdTZWdtZW50QXBwZW5kKCI4MEsgMTEwIDE0MCIpOwotCi0gIC8vIFRoaXMgd2hvbGUgR09QIHNob3VsZCBiZSBzYXZlZCwgYW5kIHNob3VsZCBiZSBhYmxlIHRvIGNvbnRpbnVlIGFwcGVuZGluZwotICAvLyBkYXRhIHRvIGl0LgotICBDaGVja0V4cGVjdGVkUmFuZ2VzQnlUaW1lc3RhbXAoInsgWzgwLDE3MCkgfSIpOwotICBBcHBlbmRCdWZmZXJzKCIxNzAiKTsKLSAgQ2hlY2tFeHBlY3RlZFJhbmdlc0J5VGltZXN0YW1wKCJ7IFs4MCwyMDApIH0iKTsKLQotICAvLyBTZXQgbWVtb3J5IGxpbWl0IHRvIDEwMCBhbmQgYXBwZW5kIGEgMm5kIHJhbmdlIGFmdGVyIHRoaXMgd2l0aG91dAotICAvLyB0cmlnZ2VyaW5nIEdDLgotICBTZXRNZW1vcnlMaW1pdCgxMDApOwotICBOZXdTZWdtZW50QXBwZW5kKCI0MDBLIDQzMCA0NjAgNDkwSyA1MjAgNTUwIDU4MEsgNjEwIDY0MCIpOwotICBDaGVja0V4cGVjdGVkUmFuZ2VzQnlUaW1lc3RhbXAoInsgWzgwLDIwMCkgWzQwMCw2NzApIH0iKTsKLQotICAvLyBTZWVrIHRvIDgwbXMgdG8gbWFrZSB0aGUgZmlyc3QgcmFuZ2UgdGhlIHNlbGVjdGVkIHJhbmdlLgotICBTZWVrVG9UaW1lc3RhbXAoYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDgwKSk7Ci0KLSAgLy8gTm93IHNldCBtZW1vcnkgbGltaXQgdG8gMyBhbmQgYXBwZW5kIGEgR09QIGluIHRoZSBtaWRkbGUgb2YgdGhlIHNlY29uZAotICAvLyByYW5nZS4gQmVjYXVzZSBpdCBpcyBhZnRlciB0aGUgc2VsZWN0ZWQgcmFuZ2UsIHRoaXMgdGVzdHMgdGhhdCB0aGUgR09QIGlzCi0gIC8vIHNhdmVkIHdoZW4gZGVsZXRpbmcgZnJvbSB0aGUgYmFjay4KLSAgU2V0TWVtb3J5TGltaXQoMyk7Ci0gIE5ld1NlZ21lbnRBcHBlbmQoIjUwMEsgNTMwIDU2MCA1OTAiKTsKLQotICAvLyBTaG91bGQgc2F2ZSB0aGUgR09QIGNvbnRhaW5pbmcgdGhlIHNlZWsgcG9pbnQgYW5kIEdPUCB0aGF0IHdhcyBsYXN0Ci0gIC8vIGFwcGVuZGVkLgotICBDaGVja0V4cGVjdGVkUmFuZ2VzQnlUaW1lc3RhbXAoInsgWzgwLDIwMCkgWzUwMCw2MjApIH0iKTsKLQotICAvLyBDb250aW51ZSBhcHBlbmRpbmcgdG8gdGhpcyBHT1AgYWZ0ZXIgR0MuCi0gIEFwcGVuZEJ1ZmZlcnMoIjYyMCIpOwotICBDaGVja0V4cGVjdGVkUmFuZ2VzQnlUaW1lc3RhbXAoInsgWzgwLDIwMCkgWzUwMCw2NTApIH0iKTsKLX0KLQotLy8gVGVzdCBzYXZpbmcgdGhlIGxhc3QgR09QIGFwcGVuZGVkIHdoZW4gdGhlIEdPUCBjb250YWluaW5nIHRoZSBuZXh0IGJ1ZmZlciBpcwotLy8gYWRqYWNlbnQgdG8gdGhlIGxhc3QgR09QIGFwcGVuZGVkLgotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIEdhcmJhZ2VDb2xsZWN0aW9uX1NhdmVBcHBlbmRHT1BfU2VsZWN0ZWQxKSB7Ci0gIC8vIEFwcGVuZCAzIEdPUHMgYXQgMG1zLCA5MG1zLCBhbmQgMTgwbXMuCi0gIE5ld1NlZ21lbnRBcHBlbmQoIjBLIDMwIDYwIDkwSyAxMjAgMTUwIDE4MEsgMjEwIDI0MCIpOwotICBDaGVja0V4cGVjdGVkUmFuZ2VzQnlUaW1lc3RhbXAoInsgWzAsMjcwKSB9Iik7Ci0KLSAgLy8gU2VlayB0byB0aGUgR09QIGF0IDkwbXMuCi0gIFNlZWtUb1RpbWVzdGFtcChiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoOTApKTsKLQotICAvLyBTZXQgdGhlIG1lbW9yeSBsaW1pdCB0byAxLCB0aGVuIG92ZXJsYXAgdGhlIEdPUCBhdCAwLgotICBTZXRNZW1vcnlMaW1pdCgxKTsKLSAgTmV3U2VnbWVudEFwcGVuZCgiMEsgMzAgNjAiKTsKLQotICAvLyBTaG91bGQgc2F2ZSB0aGUgR09QIGF0IDBtcyBhbmQgOTBtcy4KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlc0J5VGltZXN0YW1wKCJ7IFswLDE4MCkgfSIpOwotCi0gIC8vIFNlZWsgdG8gMCBhbmQgY2hlY2sgYWxsIGJ1ZmZlcnMuCi0gIFNlZWtUb1RpbWVzdGFtcChiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMCkpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygiMEsgMzAgNjAgOTBLIDEyMCAxNTAiKTsKLSAgQ2hlY2tOb05leHRCdWZmZXIoKTsKLQotICAvLyBOb3cgc2VlayBiYWNrIHRvIDkwbXMgYW5kIGFwcGVuZCBhIEdPUCBhdCAxODBtcy4KLSAgU2Vla1RvVGltZXN0YW1wKGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyg5MCkpOwotICBOZXdTZWdtZW50QXBwZW5kKCIxODBLIDIxMCAyNDAiKTsKLQotICAvLyBTaG91bGQgc2F2ZSB0aGUgR09QIGF0IDkwbXMgYW5kIHRoZSBHT1AgYXQgMTgwbXMuCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXNCeVRpbWVzdGFtcCgieyBbOTAsMjcwKSB9Iik7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKCI5MEsgMTIwIDE1MCAxODBLIDIxMCAyNDAiKTsKLSAgQ2hlY2tOb05leHRCdWZmZXIoKTsKLX0KLQotLy8gVGVzdCBzYXZpbmcgdGhlIGxhc3QgR09QIGFwcGVuZGVkIHdoZW4gaXQgaXMgYXQgdGhlIGJlZ2lubmluZyBvciBlbmQgb2YgdGhlCi0vLyBzZWxlY3RlZCByYW5nZS4gVGhpcyB0ZXN0cyB3aGVuIHRoZSBsYXN0IEdPUCBhcHBlbmRlZCBpcyBiZWZvcmUgb3IgYWZ0ZXIgdGhlCi0vLyBHT1AgY29udGFpbmluZyB0aGUgbmV4dCBidWZmZXIsIGJ1dCBub3QgZGlyZWN0bHkgYWRqYWNlbnQgdG8gdGhpcyBHT1AuCi1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgR2FyYmFnZUNvbGxlY3Rpb25fU2F2ZUFwcGVuZEdPUF9TZWxlY3RlZDIpIHsKLSAgLy8gQXBwZW5kIDQgR09QcyBzdGFydGluZyBhdCBwb3NpdGlvbnMgMG1zLCA5MG1zLCAxODBtcywgMjcwbXMuCi0gIE5ld1NlZ21lbnRBcHBlbmQoIjBLIDMwIDYwIDkwSyAxMjAgMTUwIDE4MEsgMjEwIDI0MCAyNzBLIDMwMCAzMzAiKTsKLSAgQ2hlY2tFeHBlY3RlZFJhbmdlc0J5VGltZXN0YW1wKCJ7IFswLDM2MCkgfSIpOwotCi0gIC8vIFNlZWsgdG8gdGhlIGxhc3QgR09QIGF0IDI3MG1zLgotICBTZWVrVG9UaW1lc3RhbXAoYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDI3MCkpOwotCi0gIC8vIFNldCB0aGUgbWVtb3J5IGxpbWl0IHRvIDEsIHRoZW4gb3ZlcmxhcCB0aGUgR09QIGF0IDkwbXMuCi0gIFNldE1lbW9yeUxpbWl0KDEpOwotICBOZXdTZWdtZW50QXBwZW5kKCI5MEsgMTIwIDE1MCIpOwotCi0gIC8vIFNob3VsZCBzYXZlIHRoZSBHT1AgYXQgOTBtcyBhbmQgdGhlIEdPUCBhdCAyNzBtcy4KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlc0J5VGltZXN0YW1wKCJ7IFs5MCwxODApIFsyNzAsMzYwKSB9Iik7Ci0KLSAgLy8gU2V0IG1lbW9yeSBsaW1pdCB0byAxMDAgYW5kIGFkZCAzIEdPUHMgdG8gdGhlIGVuZCBvZiB0aGUgc2VsZWN0ZWQgcmFuZ2UKLSAgLy8gYXQgMzYwbXMsIDQ1MG1zLCBhbmQgNTQwbXMuCi0gIFNldE1lbW9yeUxpbWl0KDEwMCk7Ci0gIE5ld1NlZ21lbnRBcHBlbmQoIjM2MEsgMzkwIDQyMCA0NTBLIDQ4MCA1MTAgNTQwSyA1NzAgNjAwIik7Ci0gIENoZWNrRXhwZWN0ZWRSYW5nZXNCeVRpbWVzdGFtcCgieyBbOTAsMTgwKSBbMjcwLDYzMCkgfSIpOwotCi0gIC8vIENvbnN0cmFpbiB0aGUgbWVtb3J5IGxpbWl0IGFnYWluIGFuZCBvdmVybGFwIHRoZSBHT1AgYXQgNDUwbXMgdG8gdGVzdAotICAvLyBkZWxldGluZyBmcm9tIHRoZSBiYWNrLgotICBTZXRNZW1vcnlMaW1pdCgxKTsKLSAgTmV3U2VnbWVudEFwcGVuZCgiNDUwSyA0ODAgNTEwIik7Ci0KLSAgLy8gU2hvdWxkIHNhdmUgR09QIGF0IDI3MG1zIGFuZCB0aGUgR09QIGF0IDQ1MG1zLgotICBDaGVja0V4cGVjdGVkUmFuZ2VzQnlUaW1lc3RhbXAoInsgWzI3MCwzNjApIFs0NTAsNTQwKSB9Iik7Ci19Ci0KLS8vIFRlc3Qgc2F2aW5nIHRoZSBsYXN0IEdPUCBhcHBlbmRlZCB3aGVuIGl0IGlzIHRoZSBzYW1lIGFzIHRoZSBHT1AgY29udGFpbmluZwotLy8gdGhlIG5leHQgYnVmZmVyLgotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIEdhcmJhZ2VDb2xsZWN0aW9uX1NhdmVBcHBlbmRHT1BfU2VsZWN0ZWQzKSB7Ci0gIC8vIFNlZWsgdG8gc3RhcnQgb2Ygc3RyZWFtLgotICBTZWVrVG9UaW1lc3RhbXAoYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDApKTsKLQotICAvLyBBcHBlbmQgMyBHT1BzIHN0YXJ0aW5nIGF0IDBtcywgOTBtcywgMTgwbXMuCi0gIE5ld1NlZ21lbnRBcHBlbmQoIjBLIDMwIDYwIDkwSyAxMjAgMTUwIDE4MEsgMjEwIDI0MCIpOwotICBDaGVja0V4cGVjdGVkUmFuZ2VzQnlUaW1lc3RhbXAoInsgWzAsMjcwKSB9Iik7Ci0KLSAgLy8gU2V0IHRoZSBtZW1vcnkgbGltaXQgdG8gMSB0aGVuIGJlZ2luIGFwcGVuZGluZyB0aGUgc3RhcnQgb2YgYSBHT1Agc3RhcnRpbmcKLSAgLy8gYXQgMG1zLgotICBTZXRNZW1vcnlMaW1pdCgxKTsKLSAgTmV3U2VnbWVudEFwcGVuZCgiMEsgMzAiKTsKLQotICAvLyBTaG91bGQgc2F2ZSB0aGUgbmV3bHkgYXBwZW5kZWQgR09QLCB3aGljaCBpcyBhbHNvIHRoZSBuZXh0IEdPUCB0aGF0IHdpbGwgYmUKLSAgLy8gcmV0dXJuZWQgZnJvbSB0aGUgc2VlayByZXF1ZXN0LgotICBDaGVja0V4cGVjdGVkUmFuZ2VzQnlUaW1lc3RhbXAoInsgWzAsNjApIH0iKTsKLQotICAvLyBDaGVjayB0aGUgYnVmZmVycyBpbiB0aGUgcmFuZ2UuCi0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKCIwSyAzMCIpOwotICBDaGVja05vTmV4dEJ1ZmZlcigpOwotCi0gIC8vIENvbnRpbnVlIGFwcGVuZGluZyB0byB0aGlzIGJ1ZmZlci4KLSAgQXBwZW5kQnVmZmVycygiNjAgOTAiKTsKLQotICAvLyBTaG91bGQgc3RpbGwgc2F2ZSB0aGUgcmVzdCBvZiB0aGlzIEdPUCBhbmQgc2hvdWxkIGJlIGFibGUgdG8gZnVsZmlsbCB0aGUKLSAgLy8gcmVhZC4KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlc0J5VGltZXN0YW1wKCJ7IFswLDEyMCkgfSIpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygiNjAgOTAiKTsKLSAgQ2hlY2tOb05leHRCdWZmZXIoKTsKLX0KLQotLy8gQ3VycmVudGx5IGRpc2FibGVkIGJlY2F1c2Ugb2YgYnVnOiBjcmJ1Zy5jb20vMTQwODc1LgotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIERJU0FCTEVEX0dhcmJhZ2VDb2xsZWN0aW9uX1dhaXRpbmdGb3JLZXlmcmFtZSkgewotICAvLyBTZXQgbWVtb3J5IGxpbWl0IHRvIDEwIGJ1ZmZlcnMuCi0gIFNldE1lbW9yeUxpbWl0KDEwKTsKLQotICAvLyBBcHBlbmQgNSBidWZmZXJzIGF0IHBvc2l0aW9ucyAxMCB0aHJvdWdoIDE0IGFuZCBleGhhdXN0IHRoZSBidWZmZXJzLgotICBOZXdTZWdtZW50QXBwZW5kKDEwLCA1LCAma0RhdGFBKTsKLSAgU2VlaygxMCk7Ci0gIENoZWNrRXhwZWN0ZWRCdWZmZXJzKDEwLCAxNCwgJmtEYXRhQSk7Ci0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzEwLDE0KSB9Iik7Ci0KLSAgLy8gV2UgYXJlIG5vdyBzdGFsbGVkIGF0IHBvc2l0aW9uIDE1LgotICBDaGVja05vTmV4dEJ1ZmZlcigpOwotCi0gIC8vIERvIGFuIGVuZCBvdmVybGFwIHRoYXQgY2F1c2VzIHRoZSBsYXR0ZXIgaGFsZiBvZiB0aGUgcmFuZ2UgdG8gYmUgZGVsZXRlZC4KLSAgTmV3U2VnbWVudEFwcGVuZCg1LCA2LCAma0RhdGFBKTsKLSAgQ2hlY2tOb05leHRCdWZmZXIoKTsKLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbNSwxMCkgfSIpOwotCi0gIC8vIEFwcGVuZCBidWZmZXJzIGZyb20gcG9zaXRpb24gMjAgdG8gMjkuIFRoaXMgc2hvdWxkIHRyaWdnZXIgR0MuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMjAsIDEwLCAma0RhdGFBKTsKLQotICAvLyBHQyBzaG91bGQga2VlcCB0aGUga2V5ZnJhbWUgYmVmb3JlIHRoZSBzZWVrIHBvc2l0aW9uIDE1LCBhbmQgdGhlIG5leHQgOQotICAvLyBidWZmZXJzIGNsb3Nlc3QgdG8gdGhlIHNlZWsgcG9zaXRpb24uCi0gIENoZWNrTm9OZXh0QnVmZmVyKCk7Ci0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzEwLDEwKSBbMjAsMjgpIH0iKTsKLQotICAvLyBGdWxmaWxsIHRoZSBzZWVrIGJ5IGFwcGVuZGluZyBvbmUgYnVmZmVyIGF0IDE1LgotICBOZXdTZWdtZW50QXBwZW5kKDE1LCAxLCAma0RhdGFBKTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMTUsIDE1LCAma0RhdGFBKTsKLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbMTUsMTUpIFsyMCwyOCkgfSIpOwotfQotCi0vLyBUZXN0IHRoZSBwZXJmb3JtYW5jZSBvZiBnYXJiYWdlIGNvbGxlY3Rpb24uCi1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgR2FyYmFnZUNvbGxlY3Rpb25fUGVyZm9ybWFuY2UpIHsKLSAgLy8gRm9yY2UgfGtleWZyYW1lc19wZXJfc2Vjb25kX3wgdG8gYmUgZXF1YWwgdG8ga0RlZmF1bHRGcmFtZXNQZXJTZWNvbmQuCi0gIFNldFN0cmVhbUluZm8oa0RlZmF1bHRGcmFtZXNQZXJTZWNvbmQsIGtEZWZhdWx0RnJhbWVzUGVyU2Vjb25kKTsKLQotICBjb25zdCBpbnQga0J1ZmZlcnNUb0tlZXAgPSAxMDAwOwotICBTZXRNZW1vcnlMaW1pdChrQnVmZmVyc1RvS2VlcCk7Ci0KLSAgaW50IGJ1ZmZlcnNfYXBwZW5kZWQgPSAwOwotCi0gIE5ld1NlZ21lbnRBcHBlbmQoMCwga0J1ZmZlcnNUb0tlZXApOwotICBidWZmZXJzX2FwcGVuZGVkICs9IGtCdWZmZXJzVG9LZWVwOwotCi0gIGNvbnN0IGludCBrQnVmZmVyc1RvQXBwZW5kID0gMTAwMDsKLSAgY29uc3QgaW50IGtHYXJiYWdlQ29sbGVjdGlvbnMgPSAzOwotICBmb3IgKGludCBpID0gMDsgaSA8IGtHYXJiYWdlQ29sbGVjdGlvbnM7ICsraSkgewotICAgIEFwcGVuZEJ1ZmZlcnMoYnVmZmVyc19hcHBlbmRlZCwga0J1ZmZlcnNUb0FwcGVuZCk7Ci0gICAgYnVmZmVyc19hcHBlbmRlZCArPSBrQnVmZmVyc1RvQXBwZW5kOwotICB9Ci19Ci0KLVRFU1RfRihTb3VyY2VCdWZmZXJTdHJlYW1UZXN0LCBDb25maWdDaGFuZ2VfQmFzaWMpIHsKLSAgZ2Z4OjpTaXplIGtOZXdDb2RlZFNpemUoa0NvZGVkU2l6ZS53aWR0aCgpICogMiwga0NvZGVkU2l6ZS5oZWlnaHQoKSAqIDIpOwotICBWaWRlb0RlY29kZXJDb25maWcgbmV3X2NvbmZpZygKLSAgICAgIGtDb2RlY1ZQOCwgVklERU9fQ09ERUNfUFJPRklMRV9VTktOT1dOLCBWaWRlb0ZyYW1lOjpZVjEyLCBrTmV3Q29kZWRTaXplLAotICAgICAgZ2Z4OjpSZWN0KGtOZXdDb2RlZFNpemUpLCBrTmV3Q29kZWRTaXplLCBOVUxMLCAwLCBmYWxzZSk7Ci0gIEFTU0VSVF9GQUxTRShuZXdfY29uZmlnLk1hdGNoZXMoY29uZmlnXykpOwotCi0gIFNlZWsoMCk7Ci0gIENoZWNrQ29uZmlnKGNvbmZpZ18pOwotCi0gIC8vIEFwcGVuZCA1IGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDAgdGhyb3VnaCA0Ci0gIE5ld1NlZ21lbnRBcHBlbmQoMCwgNSwgJmtEYXRhQSk7Ci0KLSAgQ2hlY2tDb25maWcoY29uZmlnXyk7Ci0KLSAgLy8gU2lnbmFsIGEgY29uZmlnIGNoYW5nZS4KLSAgc3RyZWFtXy0+VXBkYXRlVmlkZW9Db25maWcobmV3X2NvbmZpZyk7Ci0KLSAgLy8gTWFrZSBzdXJlIHVwZGF0aW5nIHRoZSBjb25maWcgZG9lc24ndCBjaGFuZ2UgYW55dGhpbmcgc2luY2UgbmV3X2NvbmZpZwotICAvLyBzaG91bGQgbm90IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVmZmVyIEdldE5leHRCdWZmZXIoKSB3aWxsIHJldHVybi4KLSAgQ2hlY2tDb25maWcoY29uZmlnXyk7Ci0KLSAgLy8gQXBwZW5kIDUgYnVmZmVycyBhdCBwb3NpdGlvbnMgNSB0aHJvdWdoIDkuCi0gIE5ld1NlZ21lbnRBcHBlbmQoNSwgNSwgJmtEYXRhQik7Ci0KLSAgLy8gQ29uc3VtZSB0aGUgYnVmZmVycyBhc3NvY2lhdGVkIHdpdGggdGhlIGluaXRpYWwgY29uZmlnLgotICBzY29wZWRfcmVmcHRyPFN0cmVhbVBhcnNlckJ1ZmZlcj4gYnVmZmVyOwotICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotICAgIEVYUEVDVF9FUShzdHJlYW1fLT5HZXROZXh0QnVmZmVyKCZidWZmZXIpLCBTb3VyY2VCdWZmZXJTdHJlYW06OmtTdWNjZXNzKTsKLSAgICBDaGVja0NvbmZpZyhjb25maWdfKTsKLSAgfQotCi0gIC8vIFZlcmlmeSB0aGUgbmV4dCBhdHRlbXB0IHRvIGdldCBhIGJ1ZmZlciB3aWxsIHNpZ25hbCB0aGF0IGEgY29uZmlnIGNoYW5nZQotICAvLyBoYXMgaGFwcGVuZWQuCi0gIEVYUEVDVF9FUShzdHJlYW1fLT5HZXROZXh0QnVmZmVyKCZidWZmZXIpLCBTb3VyY2VCdWZmZXJTdHJlYW06OmtDb25maWdDaGFuZ2UpOwotCi0gIC8vIFZlcmlmeSB0aGF0IHRoZSBuZXcgY29uZmlnIGlzIG5vdyByZXR1cm5lZC4KLSAgQ2hlY2tDb25maWcobmV3X2NvbmZpZyk7Ci0KLSAgLy8gQ29uc3VtZSB0aGUgcmVtYWluaW5nIGJ1ZmZlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXcgY29uZmlnLgotICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotICAgIENoZWNrQ29uZmlnKG5ld19jb25maWcpOwotICAgIEVYUEVDVF9FUShzdHJlYW1fLT5HZXROZXh0QnVmZmVyKCZidWZmZXIpLCBTb3VyY2VCdWZmZXJTdHJlYW06OmtTdWNjZXNzKTsKLSAgfQotfQotCi1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgQ29uZmlnQ2hhbmdlX1NlZWspIHsKLSAgc2NvcGVkX3JlZnB0cjxTdHJlYW1QYXJzZXJCdWZmZXI+IGJ1ZmZlcjsKLSAgZ2Z4OjpTaXplIGtOZXdDb2RlZFNpemUoa0NvZGVkU2l6ZS53aWR0aCgpICogMiwga0NvZGVkU2l6ZS5oZWlnaHQoKSAqIDIpOwotICBWaWRlb0RlY29kZXJDb25maWcgbmV3X2NvbmZpZygKLSAgICAgIGtDb2RlY1ZQOCwgVklERU9fQ09ERUNfUFJPRklMRV9VTktOT1dOLCBWaWRlb0ZyYW1lOjpZVjEyLCBrTmV3Q29kZWRTaXplLAotICAgICAgZ2Z4OjpSZWN0KGtOZXdDb2RlZFNpemUpLCBrTmV3Q29kZWRTaXplLCBOVUxMLCAwLCBmYWxzZSk7Ci0KLSAgU2VlaygwKTsKLSAgTmV3U2VnbWVudEFwcGVuZCgwLCA1LCAma0RhdGFBKTsKLSAgc3RyZWFtXy0+VXBkYXRlVmlkZW9Db25maWcobmV3X2NvbmZpZyk7Ci0gIE5ld1NlZ21lbnRBcHBlbmQoNSwgNSwgJmtEYXRhQik7Ci0KLSAgLy8gU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlcnMgd2l0aCB0aGUgbmV3IGNvbmZpZyBhbmQgbWFrZSBzdXJlIGEKLSAgLy8gY29uZmlnIGNoYW5nZSBpcyBzaWduYWxsZWQuCi0gIENoZWNrQ29uZmlnKGNvbmZpZ18pOwotICBTZWVrKDUpOwotICBDaGVja0NvbmZpZyhjb25maWdfKTsKLSAgRVhQRUNUX0VRKHN0cmVhbV8tPkdldE5leHRCdWZmZXIoJmJ1ZmZlciksIFNvdXJjZUJ1ZmZlclN0cmVhbTo6a0NvbmZpZ0NoYW5nZSk7Ci0gIENoZWNrQ29uZmlnKG5ld19jb25maWcpOwotICBDaGVja0V4cGVjdGVkQnVmZmVycyg1LCA5LCAma0RhdGFCKTsKLQotCi0gIC8vIFNlZWsgdG8gdGhlIHN0YXJ0IHdoaWNoIGhhcyBhIGRpZmZlcmVudCBjb25maWcuIERvbid0IGZldGNoIGFueSBidWZmZXJzIGFuZAotICAvLyBzZWVrIGJhY2sgdG8gYnVmZmVycyB3aXRoIHRoZSBjdXJyZW50IGNvbmZpZy4gTWFrZSBzdXJlIGEgY29uZmlnIGNoYW5nZQotICAvLyBpc24ndCBzaWduYWxsZWQgaW4gdGhpcyBjYXNlLgotICBDaGVja0NvbmZpZyhuZXdfY29uZmlnKTsKLSAgU2VlaygwKTsKLSAgU2Vlayg3KTsKLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoNSwgOSwgJmtEYXRhQik7Ci0KLQotICAvLyBTZWVrIHRvIHRoZSBzdGFydCBhbmQgbWFrZSBzdXJlIGEgY29uZmlnIGNoYW5nZSBpcyBzaWduYWxsZWQuCi0gIENoZWNrQ29uZmlnKG5ld19jb25maWcpOwotICBTZWVrKDApOwotICBDaGVja0NvbmZpZyhuZXdfY29uZmlnKTsKLSAgRVhQRUNUX0VRKHN0cmVhbV8tPkdldE5leHRCdWZmZXIoJmJ1ZmZlciksIFNvdXJjZUJ1ZmZlclN0cmVhbTo6a0NvbmZpZ0NoYW5nZSk7Ci0gIENoZWNrQ29uZmlnKGNvbmZpZ18pOwotICBDaGVja0V4cGVjdGVkQnVmZmVycygwLCA0LCAma0RhdGFBKTsKLX0KLQotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIFNldEV4cGxpY2l0RHVyYXRpb24pIHsKLSAgLy8gQXBwZW5kIDIgYnVmZmVycyBhdCBwb3NpdGlvbnMgNSB0aHJvdWdoIDYuCi0gIE5ld1NlZ21lbnRBcHBlbmQoNSwgMik7Ci0KLSAgLy8gQXBwZW5kIDIgYnVmZmVycyBhdCBwb3NpdGlvbnMgMTAgdGhyb3VnaCAxMS4KLSAgTmV3U2VnbWVudEFwcGVuZCgxMCwgMik7Ci0KLSAgLy8gQXBwZW5kIDIgYnVmZmVycyBhdCBwb3NpdGlvbnMgMTUgdGhyb3VnaCAxNi4KLSAgTmV3U2VnbWVudEFwcGVuZCgxNSwgMik7Ci0KLSAgLy8gQ2hlY2sgZXhwZWN0ZWQgcmFuZ2VzLgotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFs1LDYpIFsxMCwxMSkgWzE1LDE2KSB9Iik7Ci0KLSAgLy8gU2V0IGR1cmF0aW9uIHRvIGJlIGJldHdlZW4gYnVmZmVycyA2IGFuZCAxMC4KLSAgc3RyZWFtXy0+T25TZXREdXJhdGlvbihmcmFtZV9kdXJhdGlvbigpICogOCk7Ci0KLSAgLy8gU2hvdWxkIHRydW5jYXRlIHRoZSBkYXRhIGFmdGVyIDYuCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzUsNikgfSIpOwotCi0gIC8vIEFkZGluZyBkYXRhIHBhc3QgdGhlIHByZXZpb3VzIGR1cmF0aW9uIHNob3VsZCBzdGlsbCB3b3JrLgotICBOZXdTZWdtZW50QXBwZW5kKDAsIDIwKTsKLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbMCwxOSkgfSIpOwotfQotCi1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgU2V0RXhwbGljaXREdXJhdGlvbl9FZGdlQ2FzZSkgewotICAvLyBBcHBlbmQgMTAgYnVmZmVycyBhdCBwb3NpdGlvbnMgMTAgdGhyb3VnaCAxOS4KLSAgTmV3U2VnbWVudEFwcGVuZCgxMCwgMTApOwotCi0gIC8vIEFwcGVuZCA1IGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDI1IHRocm91Z2ggMjkuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMjUsIDUpOwotCi0gIC8vIENoZWNrIGV4cGVjdGVkIHJhbmdlcy4KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbMTAsMTkpIFsyNSwyOSkgfSIpOwotCi0gIC8vIFNldCBkdXJhdGlvbiB0byBiZSByaWdodCBiZWZvcmUgYnVmZmVyIDI1LgotICBzdHJlYW1fLT5PblNldER1cmF0aW9uKGZyYW1lX2R1cmF0aW9uKCkgKiAyNSk7Ci0KLSAgLy8gU2hvdWxkIHRydW5jYXRlIHRoZSBsYXN0IHJhbmdlLgotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFsxMCwxOSkgfSIpOwotfQotCi1URVNUX0YoU291cmNlQnVmZmVyU3RyZWFtVGVzdCwgU2V0RXhwbGljaXREdXJhdGlvbl9EZWxldGVQYXJ0aWFsUmFuZ2UpIHsKLSAgLy8gQXBwZW5kIDUgYnVmZmVycyBhdCBwb3NpdGlvbnMgMCB0aHJvdWdoIDQuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMCwgNSk7Ci0KLSAgLy8gQXBwZW5kIDEwIGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDEwIHRocm91Z2ggMTkuCi0gIE5ld1NlZ21lbnRBcHBlbmQoMTAsIDEwKTsKLQotICAvLyBBcHBlbmQgNSBidWZmZXJzIGF0IHBvc2l0aW9ucyAyNSB0aHJvdWdoIDI5LgotICBOZXdTZWdtZW50QXBwZW5kKDI1LCA1KTsKLQotICAvLyBDaGVjayBleHBlY3RlZCByYW5nZXMuCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzAsNCkgWzEwLDE5KSBbMjUsMjkpIH0iKTsKLQotICAvLyBTZXQgZHVyYXRpb24gdG8gYmUgYmV0d2VlbiBidWZmZXJzIDEzIGFuZCAxNC4KLSAgc3RyZWFtXy0+T25TZXREdXJhdGlvbihmcmFtZV9kdXJhdGlvbigpICogMTQpOwotCi0gIC8vIFNob3VsZCB0cnVuY2F0ZSB0aGUgZGF0YSBhZnRlciAxMy4KLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbMCw0KSBbMTAsMTMpIH0iKTsKLX0KLQotVEVTVF9GKFNvdXJjZUJ1ZmZlclN0cmVhbVRlc3QsIFNldEV4cGxpY2l0RHVyYXRpb25fRGVsZXRlU2VsZWN0ZWRSYW5nZSkgewotICAvLyBBcHBlbmQgMiBidWZmZXJzIGF0IHBvc2l0aW9ucyA1IHRocm91Z2ggNi4KLSAgTmV3U2VnbWVudEFwcGVuZCg1LCAyKTsKLQotICAvLyBBcHBlbmQgMiBidWZmZXJzIGF0IHBvc2l0aW9ucyAxMCB0aHJvdWdoIDExLgotICBOZXdTZWdtZW50QXBwZW5kKDEwLCAyKTsKLQotICAvLyBBcHBlbmQgMiBidWZmZXJzIGF0IHBvc2l0aW9ucyAxNSB0aHJvdWdoIDE2LgotICBOZXdTZWdtZW50QXBwZW5kKDE1LCAyKTsKLQotICAvLyBDaGVjayBleHBlY3RlZCByYW5nZXMuCi0gIENoZWNrRXhwZWN0ZWRSYW5nZXMoInsgWzUsNikgWzEwLDExKSBbMTUsMTYpIH0iKTsKLQotICAvLyBTZWVrIHRvIDEwLgotICBTZWVrKDEwKTsKLQotICAvLyBTZXQgZHVyYXRpb24gdG8gYmUgYWZ0ZXIgcG9zaXRpb24gMy4KLSAgc3RyZWFtXy0+T25TZXREdXJhdGlvbihmcmFtZV9kdXJhdGlvbigpICogNCk7Ci0KLSAgLy8gRXhwZWN0IGV2ZXJ5dGhpbmcgdG8gYmUgZGVsZXRlZCwgYW5kIHNob3VsZCBub3QgaGF2ZSBuZXh0IGJ1ZmZlciBhbnltb3JlLgotICBDaGVja05vTmV4dEJ1ZmZlcigpOwotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IH0iKTsKLQotICAvLyBBcHBlbmRpbmcgZGF0YSBhdCBwb3NpdGlvbiAxMCBzaG91bGQgbm90IGZ1bGZpbGwgdGhlIHNlZWsuCi0gIC8vIChJZiB0aGUgZHVyYXRpb24gaXMgc2V0IHRvIGJlIHNvbWV0aGluZyBzbWFsbGVyIHRoYW4gdGhlIGN1cnJlbnQgc2VlawotICAvLyBwb2ludCwgdGhlbiB0aGUgc2VlayBwb2ludCBpcyByZXNldCBhbmQgdGhlIFNvdXJjZUJ1ZmZlclN0cmVhbSB3YWl0cwotICAvLyBmb3IgYSBuZXcgc2VlayByZXF1ZXN0LiBUaGVyZWZvcmUgZXZlbiBpZiB0aGUgZGF0YSBpcyByZS1hcHBlbmRlZCwgaXQKLSAgLy8gc2hvdWxkIG5vdCBmdWxmaWxsIHRoZSBvbGQgc2Vlay4pCi0gIE5ld1NlZ21lbnRBcHBlbmQoMCwgMTUpOwotICBDaGVja05vTmV4dEJ1ZmZlcigpOwotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFswLDE0KSB9Iik7Ci19Ci0KLVRFU1RfRihTb3VyY2VCdWZmZXJTdHJlYW1UZXN0LCBTZXRFeHBsaWNpdER1cmF0aW9uX0RlbGV0ZVBhcnRpYWxTZWxlY3RlZFJhbmdlKSB7Ci0gIC8vIEFwcGVuZCA1IGJ1ZmZlcnMgYXQgcG9zaXRpb25zIDAgdGhyb3VnaCA0LgotICBOZXdTZWdtZW50QXBwZW5kKDAsIDUpOwotCi0gIC8vIEFwcGVuZCAyMCBidWZmZXJzIGF0IHBvc2l0aW9ucyAxMCB0aHJvdWdoIDI5LgotICBOZXdTZWdtZW50QXBwZW5kKDEwLCAyMCk7Ci0KLSAgLy8gQ2hlY2sgZXhwZWN0ZWQgcmFuZ2VzLgotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFswLDQpIFsxMCwyOSkgfSIpOwotCi0gIC8vIFNlZWsgdG8gcG9zaXRpb24gMTAuCi0gIFNlZWsoMTApOwotCi0gIC8vIFNldCBkdXJhdGlvbiB0byBiZSBiZXR3ZWVuIGJ1ZmZlcnMgMjQgYW5kIDI1LgotICBzdHJlYW1fLT5PblNldER1cmF0aW9uKGZyYW1lX2R1cmF0aW9uKCkgKiAyNSk7Ci0KLSAgLy8gU2hvdWxkIHRydW5jYXRlIHRoZSBkYXRhIGFmdGVyIDI0LgotICBDaGVja0V4cGVjdGVkUmFuZ2VzKCJ7IFswLDQpIFsxMCwyNCkgfSIpOwotCi0gIC8vIFRoZSBzZWVrIHBvc2l0aW9uIHNob3VsZCBub3QgYmUgbG9zdC4KLSAgQ2hlY2tFeHBlY3RlZEJ1ZmZlcnMoMTAsIDEwKTsKLQotICAvLyBOb3cgc2V0IHRoZSBkdXJhdGlvbiBpbW1lZGlhdGVseSBhZnRlciBidWZmZXIgMTAuCi0gIHN0cmVhbV8tPk9uU2V0RHVyYXRpb24oZnJhbWVfZHVyYXRpb24oKSAqIDExKTsKLQotICAvLyBTZWVrIHBvc2l0aW9uIHNob3VsZCBiZSByZXNldC4KLSAgQ2hlY2tOb05leHRCdWZmZXIoKTsKLSAgQ2hlY2tFeHBlY3RlZFJhbmdlcygieyBbMCw0KSBbMTAsMTApIH0iKTsKLX0KLQotLy8gVE9ETyh2cmspOiBBZGQgdW5pdCB0ZXN0cyB3aGVyZSBrZXlmcmFtZXMgYXJlIHVuYWxpZ25lZCBiZXR3ZWVuIHN0cmVhbXMuCi0vLyAoY3JidWcuY29tLzEzMzU1NykKLQotLy8gVE9ETyh2cmspOiBBZGQgdW5pdCB0ZXN0cyB3aXRoIGVuZCBvZiBzdHJlYW0gYmVpbmcgY2FsbGVkIGF0IGludGVyZXN0aW5nCi0vLyB0aW1lcy4KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy92aWRlb19kZWNvZGVyX3NlbGVjdG9yLmNjIGIvc3JjL21lZGlhL2ZpbHRlcnMvdmlkZW9fZGVjb2Rlcl9zZWxlY3Rvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZhMDczMS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy92aWRlb19kZWNvZGVyX3NlbGVjdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL3ZpZGVvX2RlY29kZXJfc2VsZWN0b3IuaCIKLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2tfaGVscGVycy5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wX3Byb3h5LmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9iaW5kX3RvX2xvb3AuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlbXV4ZXJfc3RyZWFtLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9waXBlbGluZS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fZGVjb2Rlcl9jb25maWcuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL2RlY3J5cHRpbmdfZGVtdXhlcl9zdHJlYW0uaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL2RlY3J5cHRpbmdfdmlkZW9fZGVjb2Rlci5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1WaWRlb0RlY29kZXJTZWxlY3Rvcjo6VmlkZW9EZWNvZGVyU2VsZWN0b3IoCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbWVzc2FnZV9sb29wLAotICAgIGNvbnN0IFZpZGVvRGVjb2Rlckxpc3QmIGRlY29kZXJzLAotICAgIGNvbnN0IFNldERlY3J5cHRvclJlYWR5Q0ImIHNldF9kZWNyeXB0b3JfcmVhZHlfY2IpCi0gICAgOiBtZXNzYWdlX2xvb3BfKG1lc3NhZ2VfbG9vcCksCi0gICAgICBkZWNvZGVyc18oZGVjb2RlcnMpLAotICAgICAgc2V0X2RlY3J5cHRvcl9yZWFkeV9jYl8oc2V0X2RlY3J5cHRvcl9yZWFkeV9jYiksCi0gICAgICBBTExPV19USElTX0lOX0lOSVRJQUxJWkVSX0xJU1Qod2Vha19wdHJfZmFjdG9yeV8odGhpcykpIHsKLX0KLQotVmlkZW9EZWNvZGVyU2VsZWN0b3I6On5WaWRlb0RlY29kZXJTZWxlY3RvcigpIHt9Ci0KLXZvaWQgVmlkZW9EZWNvZGVyU2VsZWN0b3I6OlNlbGVjdFZpZGVvRGVjb2RlcigKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+JiBzdHJlYW0sCi0gICAgY29uc3QgU3RhdGlzdGljc0NCJiBzdGF0aXN0aWNzX2NiLAotICAgIGNvbnN0IFNlbGVjdERlY29kZXJDQiYgc2VsZWN0X2RlY29kZXJfY2IpIHsKLSAgRFZMT0coMikgPDwgIlNlbGVjdFZpZGVvRGVjb2RlcigpIjsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIERDSEVDSyhzdHJlYW0pOwotCi0gIC8vIE1ha2Ugc3VyZSB8c2VsZWN0X2RlY29kZXJfY2J8IHJ1bnMgb24gYSBkaWZmZXJlbnQgZXhlY3V0aW9uIHN0YWNrLgotICBzZWxlY3RfZGVjb2Rlcl9jYl8gPSBCaW5kVG9DdXJyZW50TG9vcChzZWxlY3RfZGVjb2Rlcl9jYik7Ci0KLSAgY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiBjb25maWcgPSBzdHJlYW0tPnZpZGVvX2RlY29kZXJfY29uZmlnKCk7Ci0gIGlmICghY29uZmlnLklzVmFsaWRDb25maWcoKSkgewotICAgIERMT0coRVJST1IpIDw8ICJJbnZhbGlkIHZpZGVvIHN0cmVhbSBjb25maWcuIjsKLSAgICBiYXNlOjpSZXNldEFuZFJldHVybigmc2VsZWN0X2RlY29kZXJfY2JfKS5SdW4oTlVMTCwgTlVMTCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW5wdXRfc3RyZWFtXyA9IHN0cmVhbTsKLSAgc3RhdGlzdGljc19jYl8gPSBzdGF0aXN0aWNzX2NiOwotCi0gIGlmICghY29uZmlnLmlzX2VuY3J5cHRlZCgpKSB7Ci0gICAgaWYgKGRlY29kZXJzXy5lbXB0eSgpKSB7Ci0gICAgICBETE9HKEVSUk9SKSA8PCAiTm8gdmlkZW8gZGVjb2RlciBjYW4gYmUgdXNlZCB0byBkZWNvZGUgdGhlIGlucHV0IHN0cmVhbS4iOwotICAgICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnNlbGVjdF9kZWNvZGVyX2NiXykuUnVuKE5VTEwsIE5VTEwpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEluaXRpYWxpemVOZXh0RGVjb2RlcigpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFRoaXMgY291bGQgaGFwcGVuIGlmIEVuY3J5cHRlZCBNZWRpYSBFeHRlbnNpb24gKEVNRSkgaXMgbm90IGVuYWJsZWQuCi0gIGlmIChzZXRfZGVjcnlwdG9yX3JlYWR5X2NiXy5pc19udWxsKCkpIHsKLSAgICBiYXNlOjpSZXNldEFuZFJldHVybigmc2VsZWN0X2RlY29kZXJfY2JfKS5SdW4oTlVMTCwgTlVMTCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSNpZiBkZWZpbmVkKENPQkFMVCkgfHwgZGVmaW5lZChfX0xCX1NIRUxMX18pCi0gIERlY3J5cHRpbmdWaWRlb0RlY29kZXJJbml0RG9uZShERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQpOwotI2Vsc2UgICAvLyBkZWZpbmVkKENPQkFMVCkgfHwgZGVmaW5lZChfX0xCX1NIRUxMX18pCi0gIHZpZGVvX2RlY29kZXJfID0gbmV3IERlY3J5cHRpbmdWaWRlb0RlY29kZXIobWVzc2FnZV9sb29wXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfZGVjcnlwdG9yX3JlYWR5X2NiXyk7Ci0gIHZpZGVvX2RlY29kZXJfLT5Jbml0aWFsaXplKAotICAgICAgaW5wdXRfc3RyZWFtXywKLSAgICAgIEJpbmRUb0N1cnJlbnRMb29wKGJhc2U6OkJpbmQoCi0gICAgICAgICAgJlZpZGVvRGVjb2RlclNlbGVjdG9yOjpEZWNyeXB0aW5nVmlkZW9EZWNvZGVySW5pdERvbmUsCi0gICAgICAgICAgd2Vha19wdHJfZmFjdG9yeV8uR2V0V2Vha1B0cigpKSksCi0gICAgICBzdGF0aXN0aWNzX2NiXyk7Ci0jZW5kaWYgIC8vIGRlZmluZWQoQ09CQUxUKSB8fCBkZWZpbmVkKF9fTEJfU0hFTExfXykKLX0KLQotdm9pZCBWaWRlb0RlY29kZXJTZWxlY3Rvcjo6RGVjcnlwdGluZ1ZpZGVvRGVjb2RlckluaXREb25lKAotICAgIFBpcGVsaW5lU3RhdHVzIHN0YXR1cykgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLQotICBpZiAoc3RhdHVzID09IFBJUEVMSU5FX09LKSB7Ci0gICAgZGVjb2RlcnNfLmNsZWFyKCk7Ci0gICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnNlbGVjdF9kZWNvZGVyX2NiXykuUnVuKHZpZGVvX2RlY29kZXJfLCBOVUxMKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB2aWRlb19kZWNvZGVyXyA9IE5VTEw7Ci0KLSAgaWYgKGRlY29kZXJzXy5lbXB0eSgpKSB7Ci0gICAgRExPRyhFUlJPUikgPDwgIk5vIHZpZGVvIGRlY29kZXIgY2FuIGJlIHVzZWQgdG8gZGVjb2RlIHRoZSBpbnB1dCBzdHJlYW0uIjsKLSAgICBiYXNlOjpSZXNldEFuZFJldHVybigmc2VsZWN0X2RlY29kZXJfY2JfKS5SdW4oTlVMTCwgTlVMTCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZGVjcnlwdGVkX3N0cmVhbV8gPSBuZXcgRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW0oCi0gICAgICBtZXNzYWdlX2xvb3BfLCBzZXRfZGVjcnlwdG9yX3JlYWR5X2NiXyk7Ci0KLSAgZGVjcnlwdGVkX3N0cmVhbV8tPkluaXRpYWxpemUoCi0gICAgICBpbnB1dF9zdHJlYW1fLAotICAgICAgQmluZFRvQ3VycmVudExvb3AoYmFzZTo6QmluZCgKLSAgICAgICAgICAmVmlkZW9EZWNvZGVyU2VsZWN0b3I6OkRlY3J5cHRpbmdEZW11eGVyU3RyZWFtSW5pdERvbmUsCi0gICAgICAgICAgd2Vha19wdHJfZmFjdG9yeV8uR2V0V2Vha1B0cigpKSkpOwotfQotCi12b2lkIFZpZGVvRGVjb2RlclNlbGVjdG9yOjpEZWNyeXB0aW5nRGVtdXhlclN0cmVhbUluaXREb25lKAotICAgIFBpcGVsaW5lU3RhdHVzIHN0YXR1cykgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLQotICBpZiAoc3RhdHVzICE9IFBJUEVMSU5FX09LKSB7Ci0gICAgZGVjcnlwdGVkX3N0cmVhbV8gPSBOVUxMOwotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZzZWxlY3RfZGVjb2Rlcl9jYl8pLlJ1bihOVUxMLCBOVUxMKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBEQ0hFQ0soIWRlY3J5cHRlZF9zdHJlYW1fLT52aWRlb19kZWNvZGVyX2NvbmZpZygpLmlzX2VuY3J5cHRlZCgpKTsKLSAgaW5wdXRfc3RyZWFtXyA9IGRlY3J5cHRlZF9zdHJlYW1fOwotICBJbml0aWFsaXplTmV4dERlY29kZXIoKTsKLX0KLQotdm9pZCBWaWRlb0RlY29kZXJTZWxlY3Rvcjo6SW5pdGlhbGl6ZU5leHREZWNvZGVyKCkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgRENIRUNLKCFkZWNvZGVyc18uZW1wdHkoKSk7Ci0KLSAgdmlkZW9fZGVjb2Rlcl8gPSBkZWNvZGVyc18uZnJvbnQoKTsKLSAgZGVjb2RlcnNfLnBvcF9mcm9udCgpOwotICBEQ0hFQ0sodmlkZW9fZGVjb2Rlcl8pOwotICB2aWRlb19kZWNvZGVyXy0+SW5pdGlhbGl6ZShpbnB1dF9zdHJlYW1fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kVG9DdXJyZW50TG9vcChiYXNlOjpCaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlZpZGVvRGVjb2RlclNlbGVjdG9yOjpEZWNvZGVySW5pdERvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCkpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGlzdGljc19jYl8pOwotfQotCi12b2lkIFZpZGVvRGVjb2RlclNlbGVjdG9yOjpEZWNvZGVySW5pdERvbmUoUGlwZWxpbmVTdGF0dXMgc3RhdHVzKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotCi0gIGlmIChzdGF0dXMgIT0gUElQRUxJTkVfT0spIHsKLSAgICBpZiAoIWRlY29kZXJzXy5lbXB0eSgpKQotICAgICAgSW5pdGlhbGl6ZU5leHREZWNvZGVyKCk7Ci0gICAgZWxzZQotICAgICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnNlbGVjdF9kZWNvZGVyX2NiXykuUnVuKE5VTEwsIE5VTEwpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGRlY29kZXJzXy5jbGVhcigpOwotICBiYXNlOjpSZXNldEFuZFJldHVybigmc2VsZWN0X2RlY29kZXJfY2JfKS5SdW4odmlkZW9fZGVjb2Rlcl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNyeXB0ZWRfc3RyZWFtXyk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvdmlkZW9fZGVjb2Rlcl9zZWxlY3Rvci5oIGIvc3JjL21lZGlhL2ZpbHRlcnMvdmlkZW9fZGVjb2Rlcl9zZWxlY3Rvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjZiYmY4Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL3ZpZGVvX2RlY29kZXJfc2VsZWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfRklMVEVSU19WSURFT19ERUNPREVSX1NFTEVDVE9SX0hfCi0jZGVmaW5lIE1FRElBX0ZJTFRFUlNfVklERU9fREVDT0RFUl9TRUxFQ1RPUl9IXwotCi0jaW5jbHVkZSA8bGlzdD4KLQotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3dlYWtfcHRyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNyeXB0b3IuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlbXV4ZXJfc3RyZWFtLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb19kZWNvZGVyLmgiCi0KLW5hbWVzcGFjZSBiYXNlIHsKLWNsYXNzIE1lc3NhZ2VMb29wUHJveHk7Ci19Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIERlY29kZXJCdWZmZXI7Ci1jbGFzcyBEZWNyeXB0aW5nRGVtdXhlclN0cmVhbTsKLWNsYXNzIERlY3J5cHRvcjsKLQotLy8gVmlkZW9EZWNvZGVyU2VsZWN0b3IgKGNyZWF0ZXMgaWYgbmVjZXNzYXJ5IGFuZCkgaW5pdGlhbGl6ZXMgdGhlIHByb3BlcgotLy8gVmlkZW9EZWNvZGVyIGZvciBhIGdpdmVuIERlbXV4ZXJTdHJlYW0uIElmIHRoZSBnaXZlbiBEZW11eGVyU3RyZWFtIGlzCi0vLyBlbmNyeXB0ZWQsIGEgRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW0gbWF5IGFsc28gYmUgY3JlYXRlZC4KLWNsYXNzIE1FRElBX0VYUE9SVCBWaWRlb0RlY29kZXJTZWxlY3RvciB7Ci0gcHVibGljOgotICB0eXBlZGVmIHN0ZDo6bGlzdDxzY29wZWRfcmVmcHRyPFZpZGVvRGVjb2Rlcj4gPiBWaWRlb0RlY29kZXJMaXN0OwotCi0gIC8vIEluZGljYXRlcyBjb21wbGV0aW9uIG9mIFZpZGVvRGVjb2RlciBzZWxlY3Rpb24uCi0gIC8vIC0gRmlyc3QgcGFyYW1ldGVyOiBUaGUgaW5pdGlhbGl6ZWQgVmlkZW9EZWNvZGVyLiBJZiBpdCdzIHNldCB0byBOVUxMLCB0aGVuCi0gIC8vIFZpZGVvRGVjb2RlciBpbml0aWFsaXphdGlvbiBmYWlsZWQuCi0gIC8vIC0gU2Vjb25kIHBhcmFtZXRlcjogVGhlIGluaXRpYWxpemVkIERlY3J5cHRpbmdEZW11eGVyU3RyZWFtLiBJZiBpdCdzIG5vdAotICAvLyBOVUxMLCB0aGVuIGEgRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW0gaXMgY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWQgdG8gZG8KLSAgLy8gZGVjcnlwdGlvbiBmb3IgdGhlIGluaXRpYWxpemVkIFZpZGVvRGVjb2Rlci4KLSAgLy8gTm90ZTogVGhlIGNhbGxlciBvd25zIHNlbGVjdGVkIFZpZGVvRGVjb2RlciBhbmQgRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW0uCi0gIC8vIFRoZSBjYWxsZXIgc2hvdWxkIGNhbGwgRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW06OlJlc2V0KCkgYmVmb3JlCi0gIC8vIGNhbGxpbmcgVmlkZW9EZWNvZGVyOjpSZXNldCgpIHRvIHJlbGVhc2UgYW55IHBlbmRpbmcgZGVjcnlwdGlvbiBvciByZWFkLgotICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPAotICAgICAgdm9pZChjb25zdCBzY29wZWRfcmVmcHRyPFZpZGVvRGVjb2Rlcj4mLAotICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY3J5cHRpbmdEZW11eGVyU3RyZWFtPiYpPiBTZWxlY3REZWNvZGVyQ0I7Ci0KLSAgLy8gfHNldF9kZWNyeXB0b3JfcmVhZHlfY2J8IGlzIG9wdGlvbmFsLiBJZiB8c2V0X2RlY3J5cHRvcl9yZWFkeV9jYnwgaXMgbnVsbCwKLSAgLy8gbm8gZGVjcnlwdG9yIHdpbGwgYmUgYXZhaWxhYmxlIHRvIHBlcmZvcm0gZGVjcnlwdGlvbi4KLSAgVmlkZW9EZWNvZGVyU2VsZWN0b3IoCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+JiBtZXNzYWdlX2xvb3AsCi0gICAgICBjb25zdCBWaWRlb0RlY29kZXJMaXN0JiBkZWNvZGVycywKLSAgICAgIGNvbnN0IFNldERlY3J5cHRvclJlYWR5Q0ImIHNldF9kZWNyeXB0b3JfcmVhZHlfY2IpOwotICB+VmlkZW9EZWNvZGVyU2VsZWN0b3IoKTsKLQotICAvLyBJbml0aWFsaXplcyBhbmQgc2VsZWN0cyBhbiBWaWRlb0RlY29kZXIgdGhhdCBjYW4gZGVjb2RlIHRoZSB8c3RyZWFtfC4KLSAgLy8gU2VsZWN0ZWQgVmlkZW9EZWNvZGVyIChhbmQgRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW0pIGlzIHJldHVybmVkIHZpYQotICAvLyB0aGUgfHNlbGVjdF9kZWNvZGVyX2NifC4KLSAgdm9pZCBTZWxlY3RWaWRlb0RlY29kZXIoY29uc3Qgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiYgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0aXN0aWNzQ0ImIHN0YXRpc3RpY3NfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlbGVjdERlY29kZXJDQiYgc2VsZWN0X2RlY29kZXJfY2IpOwotCi0gcHJpdmF0ZToKLSAgdm9pZCBEZWNyeXB0aW5nVmlkZW9EZWNvZGVySW5pdERvbmUoUGlwZWxpbmVTdGF0dXMgc3RhdHVzKTsKLSAgdm9pZCBEZWNyeXB0aW5nRGVtdXhlclN0cmVhbUluaXREb25lKFBpcGVsaW5lU3RhdHVzIHN0YXR1cyk7Ci0gIHZvaWQgSW5pdGlhbGl6ZU5leHREZWNvZGVyKCk7Ci0gIHZvaWQgRGVjb2RlckluaXREb25lKFBpcGVsaW5lU3RhdHVzIHN0YXR1cyk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiBtZXNzYWdlX2xvb3BfOwotICBWaWRlb0RlY29kZXJMaXN0IGRlY29kZXJzXzsKLSAgU2V0RGVjcnlwdG9yUmVhZHlDQiBzZXRfZGVjcnlwdG9yX3JlYWR5X2NiXzsKLQotICBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+IGlucHV0X3N0cmVhbV87Ci0gIFN0YXRpc3RpY3NDQiBzdGF0aXN0aWNzX2NiXzsKLSAgU2VsZWN0RGVjb2RlckNCIHNlbGVjdF9kZWNvZGVyX2NiXzsKLQotICBzY29wZWRfcmVmcHRyPFZpZGVvRGVjb2Rlcj4gdmlkZW9fZGVjb2Rlcl87Ci0gIHNjb3BlZF9yZWZwdHI8RGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW0+IGRlY3J5cHRlZF9zdHJlYW1fOwotCi0gIGJhc2U6OldlYWtQdHJGYWN0b3J5PFZpZGVvRGVjb2RlclNlbGVjdG9yPiB3ZWFrX3B0cl9mYWN0b3J5XzsKLQotICBESVNBTExPV19JTVBMSUNJVF9DT05TVFJVQ1RPUlMoVmlkZW9EZWNvZGVyU2VsZWN0b3IpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfRklMVEVSU19WSURFT19ERUNPREVSX1NFTEVDVE9SX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy92aWRlb19kZWNvZGVyX3NlbGVjdG9yX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL2ZpbHRlcnMvdmlkZW9fZGVjb2Rlcl9zZWxlY3Rvcl91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNmMzkwZC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy92aWRlb19kZWNvZGVyX3NlbGVjdG9yX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZ21vY2tfY2FsbGJhY2tfc3VwcG9ydC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbW9ja19maWx0ZXJzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS90ZXN0X2hlbHBlcnMuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL3ZpZGVvX2RlY29kZXJfc2VsZWN0b3IuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgOjp0ZXN0aW5nOjpfOwotdXNpbmcgOjp0ZXN0aW5nOjpJc051bGw7Ci11c2luZyA6OnRlc3Rpbmc6Ok5pY2VNb2NrOwotdXNpbmcgOjp0ZXN0aW5nOjpOb3ROdWxsOwotdXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47Ci11c2luZyA6OnRlc3Rpbmc6OlJldHVyblJlZjsKLXVzaW5nIDo6dGVzdGluZzo6U2F2ZUFyZzsKLXVzaW5nIDo6dGVzdGluZzo6U3RyaWN0TW9jazsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotc3RhdGljIGNvbnN0IFZpZGVvRnJhbWU6OkZvcm1hdCBrVmlkZW9Gb3JtYXQgPSBWaWRlb0ZyYW1lOjpZVjEyOwotc3RhdGljIGNvbnN0IGdmeDo6U2l6ZSBrQ29kZWRTaXplKDMyMCwgMjQwKTsKLXN0YXRpYyBjb25zdCBnZng6OlJlY3Qga1Zpc2libGVSZWN0KDMyMCwgMjQwKTsKLXN0YXRpYyBjb25zdCBnZng6OlNpemUga05hdHVyYWxTaXplKDMyMCwgMjQwKTsKLQotY2xhc3MgVmlkZW9EZWNvZGVyU2VsZWN0b3JUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICBlbnVtIERlY3J5cHRvckNhcGFiaWxpdHkgewotICAgIGtOb0RlY3J5cHRvciwKLSAgICBrRGVjcnlwdE9ubHksCi0gICAga0RlY3J5cHRBbmREZWNvZGUKLSAgfTsKLQotICBWaWRlb0RlY29kZXJTZWxlY3RvclRlc3QoKQotICAgICAgOiBjbGVhcl92aWRlb19jb25maWdfKAotICAgICAgICAgICAga0NvZGVjVlA4LCBWSURFT19DT0RFQ19QUk9GSUxFX1VOS05PV04sIGtWaWRlb0Zvcm1hdCwKLSAgICAgICAgICAgIGtDb2RlZFNpemUsIGtWaXNpYmxlUmVjdCwga05hdHVyYWxTaXplLCBOVUxMLCAwLCBmYWxzZSksCi0gICAgICAgIGVuY3J5cHRlZF92aWRlb19jb25maWdfKAotICAgICAgICAgICAga0NvZGVjVlA4LCBWSURFT19DT0RFQ19QUk9GSUxFX1VOS05PV04sIGtWaWRlb0Zvcm1hdCwKLSAgICAgICAgICAgIGtDb2RlZFNpemUsIGtWaXNpYmxlUmVjdCwga05hdHVyYWxTaXplLCBOVUxMLCAwLCB0cnVlKSwKLSAgICAgICAgZGVtdXhlcl9zdHJlYW1fKG5ldyBTdHJpY3RNb2NrPE1vY2tEZW11eGVyU3RyZWFtPigpKSwKLSAgICAgICAgZGVjcnlwdG9yXyhuZXcgTmljZU1vY2s8TW9ja0RlY3J5cHRvcj4oKSksCi0gICAgICAgIGRlY29kZXJfMV8obmV3IFN0cmljdE1vY2s8TW9ja1ZpZGVvRGVjb2Rlcj4oKSksCi0gICAgICAgIGRlY29kZXJfMl8obmV3IFN0cmljdE1vY2s8TW9ja1ZpZGVvRGVjb2Rlcj4oKSkgewotICAgIGFsbF9kZWNvZGVyc18ucHVzaF9iYWNrKGRlY29kZXJfMV8pOwotICAgIGFsbF9kZWNvZGVyc18ucHVzaF9iYWNrKGRlY29kZXJfMl8pOwotCi0gICAgRVhQRUNUX0NBTEwoKmRlbXV4ZXJfc3RyZWFtXywgdHlwZSgpKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKERlbXV4ZXJTdHJlYW06OlZJREVPKSk7Ci0gIH0KLQotICB+VmlkZW9EZWNvZGVyU2VsZWN0b3JUZXN0KCkgewotICAgIEVYUEVDVF9DQUxMKCpkZWNvZGVyXzFfLCBTdG9wKF8pKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJ1bkNsb3N1cmU8MD4oKSk7Ci0gICAgRVhQRUNUX0NBTEwoKmRlY29kZXJfMl8sIFN0b3AoXykpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUnVuQ2xvc3VyZTwwPigpKTsKLQotICAgIGlmIChzZWxlY3RlZF9kZWNvZGVyXykKLSAgICAgIHNlbGVjdGVkX2RlY29kZXJfLT5TdG9wKE5ld0V4cGVjdGVkQ2xvc3VyZSgpKTsKLQotICAgIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci0gIH0KLQotICBNT0NLX01FVEhPRDEoT25TdGF0aXN0aWNzLCB2b2lkKGNvbnN0IFBpcGVsaW5lU3RhdGlzdGljcyYpKTsKLSAgTU9DS19NRVRIT0QxKFNldERlY3J5cHRvclJlYWR5Q2FsbGJhY2ssIHZvaWQoY29uc3QgbWVkaWE6OkRlY3J5cHRvclJlYWR5Q0ImKSk7Ci0gIE1PQ0tfTUVUSE9EMihPbkRlY29kZXJTZWxlY3RlZCwKLSAgICAgICAgICAgICAgIHZvaWQoY29uc3Qgc2NvcGVkX3JlZnB0cjxWaWRlb0RlY29kZXI+JiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNyeXB0aW5nRGVtdXhlclN0cmVhbT4mKSk7Ci0KLSAgdm9pZCBVc2VDbGVhclN0cmVhbSgpIHsKLSAgICBFWFBFQ1RfQ0FMTCgqZGVtdXhlcl9zdHJlYW1fLCB2aWRlb19kZWNvZGVyX2NvbmZpZygpKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuUmVmKGNsZWFyX3ZpZGVvX2NvbmZpZ18pKTsKLSAgfQotCi0gIHZvaWQgVXNlRW5jcnlwdGVkU3RyZWFtKCkgewotICAgIEVYUEVDVF9DQUxMKCpkZW11eGVyX3N0cmVhbV8sIHZpZGVvX2RlY29kZXJfY29uZmlnKCkpCi0gICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm5SZWYoZW5jcnlwdGVkX3ZpZGVvX2NvbmZpZ18pKTsKLSAgfQotCi0gIHZvaWQgSW5pdGlhbGl6ZURlY29kZXJTZWxlY3RvcihEZWNyeXB0b3JDYXBhYmlsaXR5IGRlY3J5cHRvcl9jYXBhYmlsaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9kZWNvZGVycykgewotICAgIFNldERlY3J5cHRvclJlYWR5Q0Igc2V0X2RlY3J5cHRvcl9yZWFkeV9jYjsKLSAgICBpZiAoZGVjcnlwdG9yX2NhcGFiaWxpdHkgPT0ga0RlY3J5cHRPbmx5IHx8Ci0gICAgICAgIGRlY3J5cHRvcl9jYXBhYmlsaXR5ID09IGtEZWNyeXB0QW5kRGVjb2RlKSB7Ci0gICAgICBzZXRfZGVjcnlwdG9yX3JlYWR5X2NiID0gYmFzZTo6QmluZCgKLSAgICAgICAgICAmVmlkZW9EZWNvZGVyU2VsZWN0b3JUZXN0OjpTZXREZWNyeXB0b3JSZWFkeUNhbGxiYWNrLAotICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpOwotCi0gICAgICBFWFBFQ1RfQ0FMTCgqdGhpcywgU2V0RGVjcnlwdG9yUmVhZHlDYWxsYmFjayhfKSkKLSAgICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUnVuQ2FsbGJhY2s8MD4oZGVjcnlwdG9yXy5nZXQoKSkpOwotCi0gICAgICBpZiAoZGVjcnlwdG9yX2NhcGFiaWxpdHkgPT0ga0RlY3J5cHRPbmx5KSB7Ci0gICAgICAgIEVYUEVDVF9DQUxMKCpkZWNyeXB0b3JfLCBJbml0aWFsaXplVmlkZW9EZWNvZGVyTW9jayhfLCBfKSkKLSAgICAgICAgICAgIC5XaWxsUmVwZWF0ZWRseShSdW5DYWxsYmFjazwxPihmYWxzZSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgRVhQRUNUX0NBTEwoKmRlY3J5cHRvcl8sIEluaXRpYWxpemVWaWRlb0RlY29kZXJNb2NrKF8sIF8pKQotICAgICAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJ1bkNhbGxiYWNrPDE+KHRydWUpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBEQ0hFQ0tfR0UoYWxsX2RlY29kZXJzXy5zaXplKCksIHN0YXRpY19jYXN0PHNpemVfdD4obnVtX2RlY29kZXJzKSk7Ci0gICAgVmlkZW9EZWNvZGVyU2VsZWN0b3I6OlZpZGVvRGVjb2Rlckxpc3QgZGVjb2RlcnMoCi0gICAgICAgIGFsbF9kZWNvZGVyc18uYmVnaW4oKSwgYWxsX2RlY29kZXJzXy5iZWdpbigpICsgbnVtX2RlY29kZXJzKTsKLQotICAgIGRlY29kZXJfc2VsZWN0b3JfLnJlc2V0KG5ldyBWaWRlb0RlY29kZXJTZWxlY3RvcigKLSAgICAgICAgbWVzc2FnZV9sb29wXy5tZXNzYWdlX2xvb3BfcHJveHkoKSwKLSAgICAgICAgZGVjb2RlcnMsCi0gICAgICAgIHNldF9kZWNyeXB0b3JfcmVhZHlfY2IpKTsKLSAgfQotCi0gIHZvaWQgU2VsZWN0RGVjb2RlcigpIHsKLSAgICBkZWNvZGVyX3NlbGVjdG9yXy0+U2VsZWN0VmlkZW9EZWNvZGVyKAotICAgICAgICBkZW11eGVyX3N0cmVhbV8sCi0gICAgICAgIGJhc2U6OkJpbmQoJlZpZGVvRGVjb2RlclNlbGVjdG9yVGVzdDo6T25TdGF0aXN0aWNzLAotICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAotICAgICAgICBiYXNlOjpCaW5kKCZWaWRlb0RlY29kZXJTZWxlY3RvclRlc3Q6Ok9uRGVjb2RlclNlbGVjdGVkLAotICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLSAgICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwotICB9Ci0KLSAgLy8gRml4dHVyZSBtZW1iZXJzLgotICBzY29wZWRfcHRyPFZpZGVvRGVjb2RlclNlbGVjdG9yPiBkZWNvZGVyX3NlbGVjdG9yXzsKLSAgVmlkZW9EZWNvZGVyQ29uZmlnIGNsZWFyX3ZpZGVvX2NvbmZpZ187Ci0gIFZpZGVvRGVjb2RlckNvbmZpZyBlbmNyeXB0ZWRfdmlkZW9fY29uZmlnXzsKLSAgc2NvcGVkX3JlZnB0cjxTdHJpY3RNb2NrPE1vY2tEZW11eGVyU3RyZWFtPiA+IGRlbXV4ZXJfc3RyZWFtXzsKLSAgLy8gVXNlIE5pY2VNb2NrIHNpbmNlIHdlIGRvbid0IGNhcmUgYWJvdXQgbW9zdCBvZiBjYWxscyBvbiB0aGUgZGVjcnlwdG9yLCBlLmcuCi0gIC8vIFJlZ2lzdGVyS2V5QWRkZWRDQigpLgotICBzY29wZWRfcHRyPE5pY2VNb2NrPE1vY2tEZWNyeXB0b3I+ID4gZGVjcnlwdG9yXzsKLSAgc2NvcGVkX3JlZnB0cjxTdHJpY3RNb2NrPE1vY2tWaWRlb0RlY29kZXI+ID4gZGVjb2Rlcl8xXzsKLSAgc2NvcGVkX3JlZnB0cjxTdHJpY3RNb2NrPE1vY2tWaWRlb0RlY29kZXI+ID4gZGVjb2Rlcl8yXzsKLSAgc3RkOjp2ZWN0b3I8c2NvcGVkX3JlZnB0cjxWaWRlb0RlY29kZXI+ID4gYWxsX2RlY29kZXJzXzsKLQotICBzY29wZWRfcmVmcHRyPFZpZGVvRGVjb2Rlcj4gc2VsZWN0ZWRfZGVjb2Rlcl87Ci0KLSAgTWVzc2FnZUxvb3AgbWVzc2FnZV9sb29wXzsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihWaWRlb0RlY29kZXJTZWxlY3RvclRlc3QpOwotfTsKLQotLy8gVGhlIHN0cmVhbSBpcyBub3QgZW5jcnlwdGVkIGJ1dCB3ZSBoYXZlIG5vIGNsZWFyIGRlY29kZXIuIE5vIGRlY29kZXIgY2FuIGJlCi0vLyBzZWxlY3RlZC4KLVRFU1RfRihWaWRlb0RlY29kZXJTZWxlY3RvclRlc3QsIENsZWFyU3RyZWFtX05vRGVjcnlwdG9yX05vQ2xlYXJEZWNvZGVyKSB7Ci0gIFVzZUNsZWFyU3RyZWFtKCk7Ci0gIEluaXRpYWxpemVEZWNvZGVyU2VsZWN0b3Ioa05vRGVjcnlwdG9yLCAwKTsKLQotICBFWFBFQ1RfQ0FMTCgqdGhpcywgT25EZWNvZGVyU2VsZWN0ZWQoSXNOdWxsKCksIElzTnVsbCgpKSk7Ci0KLSAgU2VsZWN0RGVjb2RlcigpOwotfQotCi0vLyBUaGUgc3RyZWFtIGlzIG5vdCBlbmNyeXB0ZWQgYW5kIHdlIGhhdmUgb25lIGNsZWFyIGRlY29kZXIuIFRoZSBkZWNvZGVyCi0vLyB3aWxsIGJlIHNlbGVjdGVkLgotVEVTVF9GKFZpZGVvRGVjb2RlclNlbGVjdG9yVGVzdCwgQ2xlYXJTdHJlYW1fTm9EZWNyeXB0b3JfT25lQ2xlYXJEZWNvZGVyKSB7Ci0gIFVzZUNsZWFyU3RyZWFtKCk7Ci0gIEluaXRpYWxpemVEZWNvZGVyU2VsZWN0b3Ioa05vRGVjcnlwdG9yLCAxKTsKLQotICBFWFBFQ1RfQ0FMTCgqZGVjb2Rlcl8xXywgSW5pdGlhbGl6ZShfLCBfLCBfKSkKLSAgICAgIC5XaWxsT25jZShSdW5DYWxsYmFjazwxPihQSVBFTElORV9PSykpOwotICBFWFBFQ1RfQ0FMTCgqdGhpcywgT25EZWNvZGVyU2VsZWN0ZWQoc2NvcGVkX3JlZnB0cjxWaWRlb0RlY29kZXI+KGRlY29kZXJfMV8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNOdWxsKCkpKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8MD4oJnNlbGVjdGVkX2RlY29kZXJfKSk7Ci0KLSAgU2VsZWN0RGVjb2RlcigpOwotfQotCi0vLyBUaGUgc3RyZWFtIGlzIG5vdCBlbmNyeXB0ZWQgYW5kIHdlIGhhdmUgbXVsdGlwbGUgY2xlYXIgZGVjb2RlcnMuIFRoZSBmaXJzdAotLy8gZGVjb2RlciB0aGF0IGNhbiBkZWNvZGUgdGhlIGlucHV0IHN0cmVhbSB3aWxsIGJlIHNlbGVjdGVkLgotVEVTVF9GKFZpZGVvRGVjb2RlclNlbGVjdG9yVGVzdCwgQ2xlYXJTdHJlYW1fTm9EZWNyeXB0b3JfTXVsdGlwbGVDbGVhckRlY29kZXIpIHsKLSAgVXNlQ2xlYXJTdHJlYW0oKTsKLSAgSW5pdGlhbGl6ZURlY29kZXJTZWxlY3RvcihrTm9EZWNyeXB0b3IsIDIpOwotCi0gIEVYUEVDVF9DQUxMKCpkZWNvZGVyXzFfLCBJbml0aWFsaXplKF8sIF8sIF8pKQotICAgICAgLldpbGxPbmNlKFJ1bkNhbGxiYWNrPDE+KERFQ09ERVJfRVJST1JfTk9UX1NVUFBPUlRFRCkpOwotICBFWFBFQ1RfQ0FMTCgqZGVjb2Rlcl8yXywgSW5pdGlhbGl6ZShfLCBfLCBfKSkKLSAgICAgIC5XaWxsT25jZShSdW5DYWxsYmFjazwxPihQSVBFTElORV9PSykpOwotICBFWFBFQ1RfQ0FMTCgqdGhpcywgT25EZWNvZGVyU2VsZWN0ZWQoc2NvcGVkX3JlZnB0cjxWaWRlb0RlY29kZXI+KGRlY29kZXJfMl8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNOdWxsKCkpKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8MD4oJnNlbGVjdGVkX2RlY29kZXJfKSk7Ci0KLSAgU2VsZWN0RGVjb2RlcigpOwotfQotCi0vLyBUaGVyZSBpcyBhIGRlY3J5cHRvciBidXQgdGhlIHN0cmVhbSBpcyBub3QgZW5jcnlwdGVkLiBUaGUgZGVjb2RlciB3aWxsIGJlCi0vLyBzZWxlY3RlZC4KLVRFU1RfRihWaWRlb0RlY29kZXJTZWxlY3RvclRlc3QsIENsZWFyU3RyZWFtX0hhc0RlY3J5cHRvcikgewotICBVc2VDbGVhclN0cmVhbSgpOwotICBJbml0aWFsaXplRGVjb2RlclNlbGVjdG9yKGtEZWNyeXB0T25seSwgMSk7Ci0KLSAgRVhQRUNUX0NBTEwoKmRlY29kZXJfMV8sIEluaXRpYWxpemUoXywgXywgXykpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MT4oUElQRUxJTkVfT0spKTsKLSAgRVhQRUNUX0NBTEwoKnRoaXMsIE9uRGVjb2RlclNlbGVjdGVkKHNjb3BlZF9yZWZwdHI8VmlkZW9EZWNvZGVyPihkZWNvZGVyXzFfKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzTnVsbCgpKSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDA+KCZzZWxlY3RlZF9kZWNvZGVyXykpOwotCi0gIFNlbGVjdERlY29kZXIoKTsKLX0KLQotLy8gVGhlIHN0cmVhbSBpcyBlbmNyeXB0ZWQgYW5kIHRoZXJlJ3Mgbm8gZGVjcnlwdG9yLiBObyBkZWNvZGVyIGNhbiBiZSBzZWxlY3RlZC4KLVRFU1RfRihWaWRlb0RlY29kZXJTZWxlY3RvclRlc3QsIEVuY3J5cHRlZFN0cmVhbV9Ob0RlY3J5cHRvcikgewotICBVc2VFbmNyeXB0ZWRTdHJlYW0oKTsKLSAgSW5pdGlhbGl6ZURlY29kZXJTZWxlY3RvcihrTm9EZWNyeXB0b3IsIDEpOwotCi0gIEVYUEVDVF9DQUxMKCp0aGlzLCBPbkRlY29kZXJTZWxlY3RlZChJc051bGwoKSwgSXNOdWxsKCkpKTsKLQotICBTZWxlY3REZWNvZGVyKCk7Ci19Ci0KLS8vIERlY3J5cHRvciBjYW4gb25seSBkbyBkZWNyeXB0aW9uIGFuZCB0aGVyZSdzIG5vIGRlY29kZXIgYXZhaWxhYmxlLiBObyBkZWNvZGVyCi0vLyBjYW4gYmUgc2VsZWN0ZWQuCi1URVNUX0YoVmlkZW9EZWNvZGVyU2VsZWN0b3JUZXN0LCBFbmNyeXB0ZWRTdHJlYW1fRGVjcnlwdE9ubHlfTm9DbGVhckRlY29kZXIpIHsKLSAgVXNlRW5jcnlwdGVkU3RyZWFtKCk7Ci0gIEluaXRpYWxpemVEZWNvZGVyU2VsZWN0b3Ioa0RlY3J5cHRPbmx5LCAwKTsKLQotICBFWFBFQ1RfQ0FMTCgqdGhpcywgT25EZWNvZGVyU2VsZWN0ZWQoSXNOdWxsKCksIElzTnVsbCgpKSk7Ci0KLSAgU2VsZWN0RGVjb2RlcigpOwotfQotCi0vLyBEZWNyeXB0b3IgY2FuIGRvIGRlY3J5cHRpb24tb25seSBhbmQgdGhlcmUncyBhIGRlY29kZXIgYXZhaWxhYmxlLiBUaGUgZGVjb2RlcgotLy8gd2lsbCBiZSBzZWxlY3RlZCBhbmQgYSBEZWNyeXB0aW5nRGVtdXhlclN0cmVhbSB3aWxsIGJlIGNyZWF0ZWQuCi1URVNUX0YoVmlkZW9EZWNvZGVyU2VsZWN0b3JUZXN0LCBFbmNyeXB0ZWRTdHJlYW1fRGVjcnlwdE9ubHlfT25lQ2xlYXJEZWNvZGVyKSB7Ci0gIFVzZUVuY3J5cHRlZFN0cmVhbSgpOwotICBJbml0aWFsaXplRGVjb2RlclNlbGVjdG9yKGtEZWNyeXB0T25seSwgMSk7Ci0KLSAgRVhQRUNUX0NBTEwoKmRlY29kZXJfMV8sIEluaXRpYWxpemUoXywgXywgXykpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MT4oUElQRUxJTkVfT0spKTsKLSAgRVhQRUNUX0NBTEwoKnRoaXMsIE9uRGVjb2RlclNlbGVjdGVkKHNjb3BlZF9yZWZwdHI8VmlkZW9EZWNvZGVyPihkZWNvZGVyXzFfKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdE51bGwoKSkpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwwPigmc2VsZWN0ZWRfZGVjb2Rlcl8pKTsKLQotICBTZWxlY3REZWNvZGVyKCk7Ci19Ci0KLS8vIERlY3J5cHRvciBjYW4gb25seSBkbyBkZWNyeXB0aW9uIGFuZCB0aGVyZSBhcmUgbXVsdGlwbGUgZGVjb2RlcnMgYXZhaWxhYmxlLgotLy8gVGhlIGZpcnN0IGRlY29kZXIgdGhhdCBjYW4gZGVjb2RlIHRoZSBpbnB1dCBzdHJlYW0gd2lsbCBiZSBzZWxlY3RlZCBhbmQKLS8vIGEgRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW0gd2lsbCBiZSBjcmVhdGVkLgotVEVTVF9GKFZpZGVvRGVjb2RlclNlbGVjdG9yVGVzdCwKLSAgICAgICBFbmNyeXB0ZWRTdHJlYW1fRGVjcnlwdE9ubHlfTXVsdGlwbGVDbGVhckRlY29kZXIpIHsKLSAgVXNlRW5jcnlwdGVkU3RyZWFtKCk7Ci0gIEluaXRpYWxpemVEZWNvZGVyU2VsZWN0b3Ioa0RlY3J5cHRPbmx5LCAyKTsKLQotICBFWFBFQ1RfQ0FMTCgqZGVjb2Rlcl8xXywgSW5pdGlhbGl6ZShfLCBfLCBfKSkKLSAgICAgIC5XaWxsT25jZShSdW5DYWxsYmFjazwxPihERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQpKTsKLSAgRVhQRUNUX0NBTEwoKmRlY29kZXJfMl8sIEluaXRpYWxpemUoXywgXywgXykpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MT4oUElQRUxJTkVfT0spKTsKLSAgRVhQRUNUX0NBTEwoKnRoaXMsIE9uRGVjb2RlclNlbGVjdGVkKHNjb3BlZF9yZWZwdHI8VmlkZW9EZWNvZGVyPihkZWNvZGVyXzJfKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdE51bGwoKSkpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwwPigmc2VsZWN0ZWRfZGVjb2Rlcl8pKTsKLQotICBTZWxlY3REZWNvZGVyKCk7Ci19Ci0KLS8vIERlY3J5cHRvciBjYW4gZG8gZGVjcnlwdGlvbiBhbmQgZGVjb2RpbmcuIEEgRGVjcnlwdGluZ1ZpZGVvRGVjb2RlciB3aWxsIGJlCi0vLyBjcmVhdGVkIGFuZCBzZWxlY3RlZC4gVGhlIGNsZWFyIGRlY29kZXJzIHNob3VsZCBub3QgYmUgdG91Y2hlZCBhdCBhbGwuCi0vLyBObyBEZWNyeXB0aW5nRGVtdXhlclN0cmVhbSBzaG91bGQgdG8gYmUgY3JlYXRlZC4KLVRFU1RfRihWaWRlb0RlY29kZXJTZWxlY3RvclRlc3QsIEVuY3J5cHRlZFN0cmVhbV9EZWNyeXB0QW5kRGVjb2RlKSB7Ci0gIFVzZUVuY3J5cHRlZFN0cmVhbSgpOwotICBJbml0aWFsaXplRGVjb2RlclNlbGVjdG9yKGtEZWNyeXB0QW5kRGVjb2RlLCAxKTsKLQotICBFWFBFQ1RfQ0FMTCgqdGhpcywgT25EZWNvZGVyU2VsZWN0ZWQoTm90TnVsbCgpLCBJc051bGwoKSkpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwwPigmc2VsZWN0ZWRfZGVjb2Rlcl8pKTsKLQotICBTZWxlY3REZWNvZGVyKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvdmlkZW9fZnJhbWVfZ2VuZXJhdG9yLmNjIGIvc3JjL21lZGlhL2ZpbHRlcnMvdmlkZW9fZnJhbWVfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzJmZTEzLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL3ZpZGVvX2ZyYW1lX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy92aWRlb19mcmFtZV9nZW5lcmF0b3IuaCIKLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZW11eGVyX3N0cmVhbS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fZnJhbWUuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotVmlkZW9GcmFtZUdlbmVyYXRvcjo6VmlkZW9GcmFtZUdlbmVyYXRvcigKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+JiBtZXNzYWdlX2xvb3BfcHJveHksCi0gICAgY29uc3QgZ2Z4OjpTaXplJiBzaXplLAotICAgIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSYgZnJhbWVfZHVyYXRpb24pCi0gICAgOiBtZXNzYWdlX2xvb3BfcHJveHlfKG1lc3NhZ2VfbG9vcF9wcm94eSksCi0gICAgICBzaXplXyhzaXplKSwKLSAgICAgIHN0b3BwZWRfKHRydWUpLAotICAgICAgZnJhbWVfZHVyYXRpb25fKGZyYW1lX2R1cmF0aW9uKSB7Ci19Ci0KLXZvaWQgVmlkZW9GcmFtZUdlbmVyYXRvcjo6SW5pdGlhbGl6ZSgKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+JiBzdHJlYW0sCi0gICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc3RhdHVzX2NiLAotICAgIGNvbnN0IFN0YXRpc3RpY3NDQiYgc3RhdGlzdGljc19jYikgewotICBtZXNzYWdlX2xvb3BfcHJveHlfLT5Qb3N0VGFzaygKLSAgICAgIEZST01fSEVSRSwKLSAgICAgIGJhc2U6OkJpbmQoJlZpZGVvRnJhbWVHZW5lcmF0b3I6OkluaXRpYWxpemVPbkRlY29kZXJUaHJlYWQsCi0gICAgICAgICAgICAgICAgIHRoaXMsIHN0cmVhbSwgc3RhdHVzX2NiLCBzdGF0aXN0aWNzX2NiKSk7Ci19Ci0KLXZvaWQgVmlkZW9GcmFtZUdlbmVyYXRvcjo6UmVhZChjb25zdCBSZWFkQ0ImIHJlYWRfY2IpIHsKLSAgbWVzc2FnZV9sb29wX3Byb3h5Xy0+UG9zdFRhc2soCi0gICAgICBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kKCZWaWRlb0ZyYW1lR2VuZXJhdG9yOjpSZWFkT25EZWNvZGVyVGhyZWFkLCB0aGlzLCByZWFkX2NiKSk7Ci19Ci0KLXZvaWQgVmlkZW9GcmFtZUdlbmVyYXRvcjo6UmVzZXQoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2xvc3VyZSkgewotICBtZXNzYWdlX2xvb3BfcHJveHlfLT5Qb3N0VGFzaygKLSAgICAgIEZST01fSEVSRSwKLSAgICAgIGJhc2U6OkJpbmQoJlZpZGVvRnJhbWVHZW5lcmF0b3I6OlJlc2V0T25EZWNvZGVyVGhyZWFkLCB0aGlzLCBjbG9zdXJlKSk7Ci19Ci0KLXZvaWQgVmlkZW9GcmFtZUdlbmVyYXRvcjo6U3RvcChjb25zdCBiYXNlOjpDbG9zdXJlJiBjbG9zdXJlKSB7Ci0gIG1lc3NhZ2VfbG9vcF9wcm94eV8tPlBvc3RUYXNrKAotICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZCgmVmlkZW9GcmFtZUdlbmVyYXRvcjo6U3RvcE9uRGVjb2RlclRocmVhZCwgdGhpcywgY2xvc3VyZSkpOwotfQotCi1WaWRlb0ZyYW1lR2VuZXJhdG9yOjp+VmlkZW9GcmFtZUdlbmVyYXRvcigpIHt9Ci0KLXZvaWQgVmlkZW9GcmFtZUdlbmVyYXRvcjo6SW5pdGlhbGl6ZU9uRGVjb2RlclRocmVhZCgKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+JiAvKiBzdHJlYW0gKi8sCi0gICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc3RhdHVzX2NiLAotICAgIGNvbnN0IFN0YXRpc3RpY3NDQiYgc3RhdGlzdGljc19jYikgewotICBEVkxPRygxKSA8PCAiSW5pdGlhbGl6ZU9uRGVjb2RlclRocmVhZCI7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfcHJveHlfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotCi0gIHN0YXR1c19jYi5SdW4oUElQRUxJTkVfT0spOwotICBzdG9wcGVkXyA9IGZhbHNlOwotfQotCi12b2lkIFZpZGVvRnJhbWVHZW5lcmF0b3I6OlJlYWRPbkRlY29kZXJUaHJlYWQoY29uc3QgUmVhZENCJiByZWFkX2NiKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfcHJveHlfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBDSEVDSyghcmVhZF9jYi5pc19udWxsKCkpOwotICBpZiAoc3RvcHBlZF8pCi0gICAgcmV0dXJuOwotCi0gIC8vIEFsd2F5cyBhbGxvY2F0ZSBhIG5ldyBmcmFtZS4KLSAgLy8KLSAgLy8gVE9ETyhzY2hlcmt1cyk6IG1pZ3JhdGUgdGhpcyB0byBwcm9wZXIgYnVmZmVyIHJlY3ljbGluZy4KLSAgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiB2aWRlb19mcmFtZSA9Ci0gICAgICBWaWRlb0ZyYW1lOjpDcmVhdGVGcmFtZShWaWRlb0ZyYW1lOjpZVjEyLCBzaXplXywgZ2Z4OjpSZWN0KHNpemVfKSwgc2l6ZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3RpbWVfKTsKLSAgY3VycmVudF90aW1lXyArPSBmcmFtZV9kdXJhdGlvbl87Ci0KLSAgLy8gVE9ETyh3amlhKTogc2V0IHBpeGVsIGRhdGEgdG8gcHJlLWRlZmluZWQgcGF0dGVybnMgaWYgaXQncyBkZXNpcmVkIHRvCi0gIC8vIHZlcmlmeSBmcmFtZSBjb250ZW50LgotCi0gIHJlYWRfY2IuUnVuKGtPaywgdmlkZW9fZnJhbWUpOwotfQotCi12b2lkIFZpZGVvRnJhbWVHZW5lcmF0b3I6OlJlc2V0T25EZWNvZGVyVGhyZWFkKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNsb3N1cmUpIHsKLSAgRFZMT0coMSkgPDwgIlJlc2V0T25EZWNvZGVyVGhyZWFkIjsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF9wcm94eV8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIGN1cnJlbnRfdGltZV8gPSBiYXNlOjpUaW1lRGVsdGEoKTsKLSAgY2xvc3VyZS5SdW4oKTsKLX0KLQotdm9pZCBWaWRlb0ZyYW1lR2VuZXJhdG9yOjpTdG9wT25EZWNvZGVyVGhyZWFkKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNsb3N1cmUpIHsKLSAgRFZMT0coMSkgPDwgIlN0b3BPbkRlY29kZXJUaHJlYWQiOwotICBEQ0hFQ0sobWVzc2FnZV9sb29wX3Byb3h5Xy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgc3RvcHBlZF8gPSB0cnVlOwotICBjdXJyZW50X3RpbWVfID0gYmFzZTo6VGltZURlbHRhKCk7Ci0gIGNsb3N1cmUuUnVuKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvdmlkZW9fZnJhbWVfZ2VuZXJhdG9yLmggYi9zcmMvbWVkaWEvZmlsdGVycy92aWRlb19mcmFtZV9nZW5lcmF0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE0NjY3Zi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvZmlsdGVycy92aWRlb19mcmFtZV9nZW5lcmF0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfRklMVEVSU19WSURFT19GUkFNRV9HRU5FUkFUT1JfSF8KLSNkZWZpbmUgTUVESUFfRklMVEVSU19WSURFT19GUkFNRV9HRU5FUkFUT1JfSF8KLQotI2luY2x1ZGUgImJhc2UvdGltZS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fZGVjb2Rlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvcGlwZWxpbmVfc3RhdHVzLmgiCi0KLW5hbWVzcGFjZSBiYXNlIHsKLWNsYXNzIE1lc3NhZ2VMb29wUHJveHk7Ci19Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIERlbXV4ZXJTdHJlYW07Ci1jbGFzcyBWaWRlb0ZyYW1lOwotCi0vLyBBIGZpbHRlciBnZW5lcmF0ZXMgcmF3IGZyYW1lcyBhbmQgcGFzc2VzIHRoZW0gdG8gbWVkaWEgZW5naW5lIGFzIGEgdmlkZW8KLS8vIGRlY29kZXIgZmlsdGVyLgotY2xhc3MgTUVESUFfRVhQT1JUIFZpZGVvRnJhbWVHZW5lcmF0b3IgOiBwdWJsaWMgVmlkZW9EZWNvZGVyIHsKLSBwdWJsaWM6Ci0gIFZpZGVvRnJhbWVHZW5lcmF0b3IoCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+JiBtZXNzYWdlX2xvb3BfcHJveHksCi0gICAgICBjb25zdCBnZng6OlNpemUmIHNpemUsCi0gICAgICBjb25zdCBiYXNlOjpUaW1lRGVsdGEmIGZyYW1lX2R1cmF0aW9uKTsKLQotICAvLyBWaWRlb0RlY29kZXIgaW1wbGVtZW50YXRpb24uCi0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiYgc3RyZWFtLAotICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc3RhdHVzX2NiLAotICAgICAgY29uc3QgU3RhdGlzdGljc0NCJiBzdGF0aXN0aWNzX2NiKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFJlYWQoY29uc3QgUmVhZENCJiByZWFkX2NiKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFJlc2V0KGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNsb3N1cmUpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU3RvcChjb25zdCBiYXNlOjpDbG9zdXJlJiBjbG9zdXJlKSBPVkVSUklERTsKLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB+VmlkZW9GcmFtZUdlbmVyYXRvcigpOwotCi0gcHJpdmF0ZToKLSAgdm9pZCBJbml0aWFsaXplT25EZWNvZGVyVGhyZWFkKAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZW11eGVyU3RyZWFtPiYgc3RyZWFtLAotICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc3RhdHVzX2NiLAotICAgICAgY29uc3QgU3RhdGlzdGljc0NCJiBzdGF0aXN0aWNzX2NiKTsKLSAgdm9pZCBSZWFkT25EZWNvZGVyVGhyZWFkKGNvbnN0IFJlYWRDQiYgcmVhZF9jYik7Ci0gIHZvaWQgUmVzZXRPbkRlY29kZXJUaHJlYWQoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2xvc3VyZSk7Ci0gIHZvaWQgU3RvcE9uRGVjb2RlclRocmVhZChjb25zdCBiYXNlOjpDbG9zdXJlJiBjbG9zdXJlKTsKLQotICBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+IG1lc3NhZ2VfbG9vcF9wcm94eV87Ci0gIGdmeDo6U2l6ZSBzaXplXzsKLSAgYm9vbCBzdG9wcGVkXzsKLQotICBiYXNlOjpUaW1lRGVsdGEgY3VycmVudF90aW1lXzsKLSAgYmFzZTo6VGltZURlbHRhIGZyYW1lX2R1cmF0aW9uXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oVmlkZW9GcmFtZUdlbmVyYXRvcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9GSUxURVJTX1ZJREVPX0ZSQU1FX0dFTkVSQVRPUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvdmlkZW9fcmVuZGVyZXJfYmFzZS5jYyBiL3NyYy9tZWRpYS9maWx0ZXJzL3ZpZGVvX3JlbmRlcmVyX2Jhc2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlOTFmOWYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvdmlkZW9fcmVuZGVyZXJfYmFzZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDkwNSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy92aWRlb19yZW5kZXJlcl9iYXNlLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFja19oZWxwZXJzLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy9wbGF0Zm9ybV90aHJlYWQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2J1ZmZlcnMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2xpbWl0cy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvcGlwZWxpbmUuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2ZyYW1lLmgiCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9kZWNyeXB0aW5nX2RlbXV4ZXJfc3RyZWFtLmgiCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy92aWRlb19kZWNvZGVyX3NlbGVjdG9yLmgiCi0KLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImJhc2Uvc3RyaW5ncHJpbnRmLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaGVsbF9tZWRpYV9wbGF0Zm9ybS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2hlbGxfbWVkaWFfc3RhdGlzdGljcy5oIgotI2VuZGlmCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLSNpZiAhZGVmaW5lZChfX0xCX1NIRUxMX19GT1JfUkVMRUFTRV9fKQotaW50IFZpZGVvUmVuZGVyZXJCYXNlOjp2aWRlb3NfcGxheWVkXzsKLSNlbmRpZiAgLy8gIWRlZmluZWQoX19MQl9TSEVMTF9fRk9SX1JFTEVBU0VfXykKLQotYmFzZTo6VGltZURlbHRhIFZpZGVvUmVuZGVyZXJCYXNlOjprTWF4TGFzdEZyYW1lRHVyYXRpb24oKSB7Ci0gIHJldHVybiBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMjUwKTsKLX0KLQotVmlkZW9SZW5kZXJlckJhc2U6OlZpZGVvUmVuZGVyZXJCYXNlKAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4mIG1lc3NhZ2VfbG9vcCwKLSAgICBjb25zdCBTZXREZWNyeXB0b3JSZWFkeUNCJiBzZXRfZGVjcnlwdG9yX3JlYWR5X2NiLAotICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIHBhaW50X2NiLAotICAgIGNvbnN0IFNldE9wYXF1ZUNCJiBzZXRfb3BhcXVlX2NiLAotICAgIGJvb2wgZHJvcF9mcmFtZXMpCi0gICAgOiBtZXNzYWdlX2xvb3BfKG1lc3NhZ2VfbG9vcCksCi0gICAgICBzZXRfZGVjcnlwdG9yX3JlYWR5X2NiXyhzZXRfZGVjcnlwdG9yX3JlYWR5X2NiKSwKLSAgICAgIGZyYW1lX2F2YWlsYWJsZV8oJmxvY2tfKSwKLSAgICAgIHN0YXRlXyhrVW5pbml0aWFsaXplZCksCi0gICAgICB0aHJlYWRfKGJhc2U6OmtOdWxsVGhyZWFkSGFuZGxlKSwKLSAgICAgIHBlbmRpbmdfcmVhZF8oZmFsc2UpLAotICAgICAgcGVuZGluZ19wYWludF8oZmFsc2UpLAotICAgICAgcGVuZGluZ19wYWludF93aXRoX2xhc3RfYXZhaWxhYmxlXyhmYWxzZSksCi0gICAgICBkcm9wX2ZyYW1lc18oZHJvcF9mcmFtZXMpLAotICAgICAgcGxheWJhY2tfcmF0ZV8oMCksCi0gICAgICBwYWludF9jYl8ocGFpbnRfY2IpLAotICAgICAgc2V0X29wYXF1ZV9jYl8oc2V0X29wYXF1ZV9jYiksCi0gICAgICBtYXhpbXVtX2ZyYW1lc19jYWNoZWRfKDApIHsKLSAgRENIRUNLKCFwYWludF9jYl8uaXNfbnVsbCgpKTsKLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0gIGZyYW1lX3Byb3ZpZGVyXyA9IFNoZWxsTWVkaWFQbGF0Zm9ybTo6SW5zdGFuY2UoKS0+R2V0VmlkZW9GcmFtZVByb3ZpZGVyKCk7Ci0KLSNpZiAhZGVmaW5lZChfX0xCX1NIRUxMX19GT1JfUkVMRUFTRV9fKQotICBsYXRlX2ZyYW1lc18gPSAwOwotICBETE9HKElORk8pIDw8ICJTdGFydCBwbGF5aW5nIGJhY2sgdmlkZW8gIiA8PCB2aWRlb3NfcGxheWVkXzsKLSNlbmRpZiAgLy8gIWRlZmluZWQoX19MQl9TSEVMTF9fRk9SX1JFTEVBU0VfXykKLSNlbmRpZiAgLy8gZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotfQotCi1WaWRlb1JlbmRlcmVyQmFzZTo6flZpZGVvUmVuZGVyZXJCYXNlKCkgewotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICBEQ0hFQ0soc3RhdGVfID09IGtTdG9wcGVkIHx8IHN0YXRlXyA9PSBrVW5pbml0aWFsaXplZCkgPDwgc3RhdGVfOwotICBEQ0hFQ0tfRVEodGhyZWFkXywgYmFzZTo6a051bGxUaHJlYWRIYW5kbGUpOwotI2lmICFkZWZpbmVkKF9fTEJfU0hFTExfX0ZPUl9SRUxFQVNFX18pCi0gICsrdmlkZW9zX3BsYXllZF87Ci0gIERMT0dfSUYoSU5GTywgbGF0ZV9mcmFtZXNfICE9IDApIDw8ICJGaW5pc2hlZCBwbGF5aW5nIGJhY2sgd2l0aCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGxhdGVfZnJhbWVzXyA8PCAiIGxhdGUgZnJhbWVzLiI7Ci0gIERMT0dfSUYoSU5GTywgbGF0ZV9mcmFtZXNfID09IDApCi0gICAgICA8PCAiRmluaXNoZWQgcGxheWluZyBiYWNrIHdpdGggbm8gbGF0ZSBmcmFtZS4iOwotI2VuZGlmICAvLyAhZGVmaW5lZChfX0xCX1NIRUxMX19GT1JfUkVMRUFTRV9fKQotfQotCi12b2lkIFZpZGVvUmVuZGVyZXJCYXNlOjpQbGF5KGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSB7Ci0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICBUUkFDRV9FVkVOVDAoIm1lZGlhX3N0YWNrIiwgIlZpZGVvUmVuZGVyZXJCYXNlOjpQbGF5KCkiKTsKLSNlbmRpZgotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgRENIRUNLX0VRKGtQcmVyb2xsZWQsIHN0YXRlXyk7Ci0gIHN0YXRlXyA9IGtQbGF5aW5nOwotICBjYWxsYmFjay5SdW4oKTsKLX0KLQotdm9pZCBWaWRlb1JlbmRlcmVyQmFzZTo6UGF1c2UoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spIHsKLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0gIFRSQUNFX0VWRU5UMCgibWVkaWFfc3RhY2siLCAiVmlkZW9SZW5kZXJlckJhc2U6OlBhdXNlKCkiKTsKLSNlbmRpZgotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgRENIRUNLKHN0YXRlXyAhPSBrVW5pbml0aWFsaXplZCB8fCBzdGF0ZV8gPT0ga0Vycm9yKTsKLSAgc3RhdGVfID0ga1BhdXNlZDsKLSAgY2FsbGJhY2suUnVuKCk7Ci19Ci0KLXZvaWQgVmlkZW9SZW5kZXJlckJhc2U6OkZsdXNoKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSB7Ci0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICBUUkFDRV9FVkVOVDAoIm1lZGlhX3N0YWNrIiwgIlZpZGVvUmVuZGVyZXJCYXNlOjpGbHVzaCgpIik7Ci0jZW5kaWYKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gIERDSEVDS19FUShzdGF0ZV8sIGtQYXVzZWQpOwotICBmbHVzaF9jYl8gPSBjYWxsYmFjazsKLSAgc3RhdGVfID0ga0ZsdXNoaW5nRGVjb2RlcjsKLQotICBpZiAoZGVjcnlwdGluZ19kZW11eGVyX3N0cmVhbV8pIHsKLSAgICBkZWNyeXB0aW5nX2RlbXV4ZXJfc3RyZWFtXy0+UmVzZXQoYmFzZTo6QmluZCgKLSAgICAgICAgJlZpZGVvUmVuZGVyZXJCYXNlOjpSZXNldERlY29kZXIsIHRoaXMpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBkZWNvZGVyXy0+UmVzZXQoYmFzZTo6QmluZCgmVmlkZW9SZW5kZXJlckJhc2U6Ok9uRGVjb2RlclJlc2V0RG9uZSwgdGhpcykpOwotfQotCi12b2lkIFZpZGVvUmVuZGVyZXJCYXNlOjpSZXNldERlY29kZXIoKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICBkZWNvZGVyXy0+UmVzZXQoYmFzZTo6QmluZCgmVmlkZW9SZW5kZXJlckJhc2U6Ok9uRGVjb2RlclJlc2V0RG9uZSwgdGhpcykpOwotfQotCi12b2lkIFZpZGVvUmVuZGVyZXJCYXNlOjpTdG9wKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSB7Ci0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICBUUkFDRV9FVkVOVDAoIm1lZGlhX3N0YWNrIiwgIlZpZGVvUmVuZGVyZXJCYXNlOjpTdG9wKCkiKTsKLSNlbmRpZgotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgaWYgKHN0YXRlXyA9PSBrVW5pbml0aWFsaXplZCB8fCBzdGF0ZV8gPT0ga1N0b3BwZWQpIHsKLSAgICBjYWxsYmFjay5SdW4oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBiYXNlOjpQbGF0Zm9ybVRocmVhZEhhbmRsZSB0aHJlYWRfdG9fam9pbiA9IGJhc2U6OmtOdWxsVGhyZWFkSGFuZGxlOwotICB7Ci0gICAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgICBzdGF0ZV8gPSBrU3RvcHBlZDsKLQotICAgIHN0YXRpc3RpY3NfY2JfLlJlc2V0KCk7Ci0gICAgbWF4X3RpbWVfY2JfLlJlc2V0KCk7Ci0gICAgaWYgKCFwZW5kaW5nX3BhaW50XyAmJiAhcGVuZGluZ19wYWludF93aXRoX2xhc3RfYXZhaWxhYmxlXykKLSAgICAgIERvU3RvcE9yRXJyb3JfTG9ja2VkKCk7Ci0KLSAgICAvLyBDbGVhbiB1cCBvdXIgdGhyZWFkIGlmIHByZXNlbnQuCi0gICAgaWYgKHRocmVhZF8gIT0gYmFzZTo6a051bGxUaHJlYWRIYW5kbGUpIHsKLSAgICAgIC8vIFNpZ25hbCB0aGUgdGhyZWFkIHNpbmNlIGl0J3MgcG9zc2libGUgdG8gZ2V0IHN0b3BwZWQgd2l0aCB0aGUgdmlkZW8KLSAgICAgIC8vIHRocmVhZCB3YWl0aW5nIGZvciBhIHJlYWQgdG8gY29tcGxldGUuCi0gICAgICBmcmFtZV9hdmFpbGFibGVfLlNpZ25hbCgpOwotICAgICAgdGhyZWFkX3RvX2pvaW4gPSB0aHJlYWRfOwotICAgICAgdGhyZWFkXyA9IGJhc2U6OmtOdWxsVGhyZWFkSGFuZGxlOwotICAgIH0KLSAgfQotICBpZiAodGhyZWFkX3RvX2pvaW4gIT0gYmFzZTo6a051bGxUaHJlYWRIYW5kbGUpCi0gICAgYmFzZTo6UGxhdGZvcm1UaHJlYWQ6OkpvaW4odGhyZWFkX3RvX2pvaW4pOwotCi0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICBpZiAoZnJhbWVfcHJvdmlkZXJfKSB7IGZyYW1lX3Byb3ZpZGVyXy0+U3RvcCgpOyB9Ci0jZW5kaWYgIC8vIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLQotICBpZiAoZGVjcnlwdGluZ19kZW11eGVyX3N0cmVhbV8pIHsKLSAgICBkZWNyeXB0aW5nX2RlbXV4ZXJfc3RyZWFtXy0+UmVzZXQoYmFzZTo6QmluZCgKLSAgICAgICAgJlZpZGVvUmVuZGVyZXJCYXNlOjpTdG9wRGVjb2RlciwgdGhpcywgY2FsbGJhY2spKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoZGVjb2Rlcl8pIHsKLSAgICBkZWNvZGVyXy0+U3RvcChjYWxsYmFjayk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgY2FsbGJhY2suUnVuKCk7Ci19Ci0KLXZvaWQgVmlkZW9SZW5kZXJlckJhc2U6OlN0b3BEZWNvZGVyKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICBkZWNvZGVyXy0+U3RvcChjYWxsYmFjayk7Ci19Ci0KLXZvaWQgVmlkZW9SZW5kZXJlckJhc2U6OlNldFBsYXliYWNrUmF0ZShmbG9hdCBwbGF5YmFja19yYXRlKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICBwbGF5YmFja19yYXRlXyA9IHBsYXliYWNrX3JhdGU7Ci19Ci0KLXZvaWQgVmlkZW9SZW5kZXJlckJhc2U6OlByZXJvbGwoYmFzZTo6VGltZURlbHRhIHRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGNiKSB7Ci0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICBUUkFDRV9FVkVOVDEoIm1lZGlhX3N0YWNrIiwgIlZpZGVvUmVuZGVyZXJCYXNlOjpQcmVyb2xsKCkiLAotICAgICAgICAgICAgICAgInRpbWVzdGFtcCIsIHRpbWUuSW5NaWNyb3NlY29uZHMoKSk7Ci0jZW5kaWYKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gIERDSEVDS19FUShzdGF0ZV8sIGtGbHVzaGVkKSA8PCAiTXVzdCBmbHVzaCBwcmlvciB0byBwcmVyb2xsaW5nLiI7Ci0gIERDSEVDSyghY2IuaXNfbnVsbCgpKTsKLSAgRENIRUNLKHByZXJvbGxfY2JfLmlzX251bGwoKSk7Ci0KLSAgc3RhdGVfID0ga1ByZXJvbGxpbmc7Ci0gIHByZXJvbGxfY2JfID0gY2I7Ci0gIHByZXJvbGxfdGltZXN0YW1wXyA9IHRpbWU7Ci0gIHByZXJvbGxpbmdfZGVsYXllZF9mcmFtZV8gPSBOVUxMOwotICBBdHRlbXB0UmVhZF9Mb2NrZWQoKTsKLX0KLQotdm9pZCBWaWRlb1JlbmRlcmVyQmFzZTo6SW5pdGlhbGl6ZShjb25zdCBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+JiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZpZGVvRGVjb2Rlckxpc3QmIGRlY29kZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBpbml0X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0aXN0aWNzQ0ImIHN0YXRpc3RpY3NfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRpbWVDQiYgbWF4X3RpbWVfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hdHVyYWxTaXplQ2hhbmdlZENCJiBzaXplX2NoYW5nZWRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIGVuZGVkX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBlcnJvcl9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGltZURlbHRhQ0ImIGdldF90aW1lX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaW1lRGVsdGFDQiYgZ2V0X2R1cmF0aW9uX2NiKSB7Ci0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICBUUkFDRV9FVkVOVDAoIm1lZGlhX3N0YWNrIiwgIlZpZGVvUmVuZGVyZXJCYXNlOjpJbml0aWFsaXplKCkiKTsKLSNlbmRpZgotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgRENIRUNLKHN0cmVhbSk7Ci0gIERDSEVDSyghZGVjb2RlcnMuZW1wdHkoKSk7Ci0gIERDSEVDS19FUShzdHJlYW0tPnR5cGUoKSwgRGVtdXhlclN0cmVhbTo6VklERU8pOwotICBEQ0hFQ0soIWluaXRfY2IuaXNfbnVsbCgpKTsKLSAgRENIRUNLKCFzdGF0aXN0aWNzX2NiLmlzX251bGwoKSk7Ci0gIERDSEVDSyghbWF4X3RpbWVfY2IuaXNfbnVsbCgpKTsKLSAgRENIRUNLKCFzaXplX2NoYW5nZWRfY2IuaXNfbnVsbCgpKTsKLSAgRENIRUNLKCFlbmRlZF9jYi5pc19udWxsKCkpOwotICBEQ0hFQ0soIWdldF90aW1lX2NiLmlzX251bGwoKSk7Ci0gIERDSEVDSyghZ2V0X2R1cmF0aW9uX2NiLmlzX251bGwoKSk7Ci0gIERDSEVDS19FUShrVW5pbml0aWFsaXplZCwgc3RhdGVfKTsKLQotICBpbml0X2NiXyA9IGluaXRfY2I7Ci0gIHN0YXRpc3RpY3NfY2JfID0gc3RhdGlzdGljc19jYjsKLSAgbWF4X3RpbWVfY2JfID0gbWF4X3RpbWVfY2I7Ci0gIHNpemVfY2hhbmdlZF9jYl8gPSBzaXplX2NoYW5nZWRfY2I7Ci0gIGVuZGVkX2NiXyA9IGVuZGVkX2NiOwotICBlcnJvcl9jYl8gPSBlcnJvcl9jYjsKLSAgZ2V0X3RpbWVfY2JfID0gZ2V0X3RpbWVfY2I7Ci0gIGdldF9kdXJhdGlvbl9jYl8gPSBnZXRfZHVyYXRpb25fY2I7Ci0gIHN0YXRlXyA9IGtJbml0aWFsaXppbmc7Ci0KLSAgc2NvcGVkX3B0cjxWaWRlb0RlY29kZXJTZWxlY3Rvcj4gZGVjb2Rlcl9zZWxlY3RvcigKLSAgICAgIG5ldyBWaWRlb0RlY29kZXJTZWxlY3RvcihiYXNlOjpNZXNzYWdlTG9vcFByb3h5OjpjdXJyZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2RlY3J5cHRvcl9yZWFkeV9jYl8pKTsKLQotICAvLyBUbyBhdm9pZCBjYWxsaW5nIHxkZWNvZGVyX3NlbGVjdG9yfCBtZXRob2RzIGFuZCBwYXNzaW5nIG93bmVyc2hpcCBvZgotICAvLyB8ZGVjb2Rlcl9zZWxlY3RvcnwgaW4gdGhlIHNhbWUgbGluZS4KLSAgVmlkZW9EZWNvZGVyU2VsZWN0b3IqIGRlY29kZXJfc2VsZWN0b3JfcHRyID0gZGVjb2Rlcl9zZWxlY3Rvci5nZXQoKTsKLQotICBkZWNvZGVyX3NlbGVjdG9yX3B0ci0+U2VsZWN0VmlkZW9EZWNvZGVyKAotICAgICAgc3RyZWFtLAotICAgICAgc3RhdGlzdGljc19jYiwKLSAgICAgIGJhc2U6OkJpbmQoJlZpZGVvUmVuZGVyZXJCYXNlOjpPbkRlY29kZXJTZWxlY3RlZCwgdGhpcywKLSAgICAgICAgICAgICAgICAgYmFzZTo6UGFzc2VkKCZkZWNvZGVyX3NlbGVjdG9yKSkpOwotfQotCi12b2lkIFZpZGVvUmVuZGVyZXJCYXNlOjpPbkRlY29kZXJTZWxlY3RlZCgKLSAgICBzY29wZWRfcHRyPFZpZGVvRGVjb2RlclNlbGVjdG9yPiBkZWNvZGVyX3NlbGVjdG9yLAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8VmlkZW9EZWNvZGVyPiYgc2VsZWN0ZWRfZGVjb2RlciwKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY3J5cHRpbmdEZW11eGVyU3RyZWFtPiYgZGVjcnlwdGluZ19kZW11eGVyX3N0cmVhbSkgewotICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLQotICBpZiAoc3RhdGVfID09IGtTdG9wcGVkKQotICAgIHJldHVybjsKLQotICBEQ0hFQ0tfRVEoc3RhdGVfLCBrSW5pdGlhbGl6aW5nKTsKLQotICBpZiAoIXNlbGVjdGVkX2RlY29kZXIpIHsKLSAgICBzdGF0ZV8gPSBrVW5pbml0aWFsaXplZDsKLSAgICBiYXNlOjpSZXNldEFuZFJldHVybigmaW5pdF9jYl8pLlJ1bihERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGRlY29kZXJfID0gc2VsZWN0ZWRfZGVjb2RlcjsKLSAgZGVjcnlwdGluZ19kZW11eGVyX3N0cmVhbV8gPSBkZWNyeXB0aW5nX2RlbXV4ZXJfc3RyZWFtOwotCi0gIC8vIFdlJ3JlIGFsbCBnb29kISAgQ29uc2lkZXIgb3Vyc2VsdmVzIGZsdXNoZWQuIChUaHJlYWRNYWluKCkgc2hvdWxkIG5ldmVyCi0gIC8vIHNlZSB1cyBpbiB0aGUga1VuaW5pdGlhbGl6ZWQgc3RhdGUpLgotICAvLyBTaW5jZSB3ZSBoYWQgYW4gaW5pdGlhbCBQcmVyb2xsKCksIHdlIGNvbnNpZGVyIG91cnNlbGYgZmx1c2hlZCwgYmVjYXVzZSB3ZQotICAvLyBoYXZlIG5vdCBwb3B1bGF0ZWQgYW55IGJ1ZmZlcnMgeWV0LgotICBzdGF0ZV8gPSBrRmx1c2hlZDsKLQotICBzZXRfb3BhcXVlX2NiXy5SdW4oIWRlY29kZXJfLT5IYXNBbHBoYSgpKTsKLSAgc2V0X29wYXF1ZV9jYl8uUmVzZXQoKTsKLQotICAvLyBDcmVhdGUgb3VyIHZpZGVvIHRocmVhZC4KLSAgaWYgKCFiYXNlOjpQbGF0Zm9ybVRocmVhZDo6Q3JlYXRlKDAsIHRoaXMsICZ0aHJlYWRfKSkgewotICAgIE5PVFJFQUNIRUQoKSA8PCAiVmlkZW8gdGhyZWFkIGNyZWF0aW9uIGZhaWxlZCI7Ci0gICAgc3RhdGVfID0ga0Vycm9yOwotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZpbml0X2NiXykuUnVuKFBJUEVMSU5FX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSNpZiBkZWZpbmVkKE9TX1dJTikKLSAgLy8gQnVtcCB1cCBvdXIgcHJpb3JpdHkgc28gb3VyIHNsZWVwaW5nIGlzIG1vcmUgYWNjdXJhdGUuCi0gIC8vIFRPRE8oc2NoZXJrdXMpOiBmaW5kIG91dCBpZiB0aGlzIGlzIG5lY2Vzc2FyeSwgYnV0IGl0IHNlZW1zIHRvIGhlbHAuCi0gIDo6U2V0VGhyZWFkUHJpb3JpdHkodGhyZWFkXywgVEhSRUFEX1BSSU9SSVRZX0FCT1ZFX05PUk1BTCk7Ci0jZW5kaWYgIC8vIGRlZmluZWQoT1NfV0lOKQotICBiYXNlOjpSZXNldEFuZFJldHVybigmaW5pdF9jYl8pLlJ1bihQSVBFTElORV9PSyk7Ci19Ci0KLS8vIFBsYXRmb3JtVGhyZWFkOjpEZWxlZ2F0ZSBpbXBsZW1lbnRhdGlvbi4KLXZvaWQgVmlkZW9SZW5kZXJlckJhc2U6OlRocmVhZE1haW4oKSB7Ci0gIGJhc2U6OlBsYXRmb3JtVGhyZWFkOjpTZXROYW1lKCJDclZpZGVvUmVuZGVyZXIiKTsKLQotICAvLyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBpZGxlIHdoZW4gd2UgZG8gbm90IGhhdmUgYW55dGhpbmcgdG8gZG8uCi0gIC8vIE5vdGhpbmcgc3BlY2lhbCBhYm91dCB0aGUgdmFsdWUsIG90aGVyIHRoYW4gd2UncmUgYmVpbmcgbW9yZSBPUy1mcmllbmRseQotICAvLyB0aGFuIHNsZWVwaW5nIGZvciAxIG1pbGxpc2Vjb25kLgotICAvLwotICAvLyBUT09EKHNjaGVya3VzKTogc3dpdGNoIHRvIHB1cmUgZXZlbnQtZHJpdmVuIGZyYW1lIHRpbWluZyBpbnN0ZWFkIG9mIHRoaXMKLSAgLy8ga0lkbGVUaW1lRGVsdGEgYnVzaW5lc3MgaHR0cDovL2NyYnVnLmNvbS8xMDY4NzQKLSAgY29uc3QgYmFzZTo6VGltZURlbHRhIGtJZGxlVGltZURlbHRhID0KLSAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygxMCk7Ci0KLSAgdWludDMyIGZyYW1lc19kcm9wcGVkID0gMDsKLQotICBmb3IgKDs7KSB7Ci0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICAgIGZyYW1lc19kcm9wcGVkID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyPihmcmFtZV9wcm92aWRlcl8tPlJlc2V0QW5kUmV0dXJuRHJvcHBlZEZyYW1lcygpKTsKLSAgICBpZiAoZnJhbWVzX2Ryb3BwZWQgPiAwKSB7Ci0gICAgICBTQ09QRURfTUVESUFfU1RBVElTVElDUyhTVEFUX1RZUEVfVklERU9fRlJBTUVfRFJPUCk7Ci0gICAgfQotI2VuZGlmICAvLyBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0gICAgaWYgKGZyYW1lc19kcm9wcGVkID4gMCkgewotICAgICAgaWYgKCFzdGF0aXN0aWNzX2NiXy5pc19udWxsKCkpIHsKLSAgICAgICAgUGlwZWxpbmVTdGF0aXN0aWNzIHN0YXRpc3RpY3M7Ci0gICAgICAgIHN0YXRpc3RpY3MudmlkZW9fZnJhbWVzX2Ryb3BwZWQgPSBmcmFtZXNfZHJvcHBlZDsKLSAgICAgICAgc3RhdGlzdGljc19jYl8uUnVuKHN0YXRpc3RpY3MpOwotICAgICAgfQotICAgICAgZnJhbWVzX2Ryb3BwZWQgPSAwOwotICAgIH0KLQotICAgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0KLSAgICAvLyBUaHJlYWQgZXhpdCBjb25kaXRpb24uCi0gICAgaWYgKHN0YXRlXyA9PSBrU3RvcHBlZCkKLSAgICAgIHJldHVybjsKLQotICAgIC8vIFJlbWFpbiBpZGxlIGFzIGxvbmcgYXMgd2UncmUgbm90IHBsYXlpbmcuCi0gICAgaWYgKHN0YXRlXyAhPSBrUGxheWluZyB8fCBwbGF5YmFja19yYXRlXyA9PSAwKSB7Ci0gICAgICBmcmFtZV9hdmFpbGFibGVfLlRpbWVkV2FpdChrSWRsZVRpbWVEZWx0YSk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0gICAgaWYgKGZyYW1lX3Byb3ZpZGVyXyAmJiBmcmFtZV9wcm92aWRlcl8tPlF1ZXJ5QW5kUmVzZXRIYXNDb25zdW1lZEZyYW1lcygpKSB7Ci0gICAgICAvLyBUaGUgY29uc3VtZXIgb2YgdGhlIGZyYW1lX3Byb3ZpZGVyXyBoYXMgY29uc3VtZWQgZnJhbWVzLiBQb3N0IGFub3RoZXIKLSAgICAgIC8vIEF0dGVtcHRSZWFkIHRhc2sgdG8gZW5zdXJlIHRoYXQgbmV3IGZyYW1lcyBhcmUgYmVpbmcgcmVhZCBpbiB0byBrZWVwCi0gICAgICAvLyB0aGUgZnJhbWVfcHJvdmlkZXJfJ3MgcXVldWUgZnVsbC4KLSAgICAgIG1lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKEZST01fSEVSRSwgYmFzZTo6QmluZCgKLSAgICAgICAgICAmVmlkZW9SZW5kZXJlckJhc2U6OkF0dGVtcHRSZWFkLCB0aGlzKSk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvLyBSZW1haW4gaWRsZSB1bnRpbCB3ZSBoYXZlIHRoZSBuZXh0IGZyYW1lIHJlYWR5IGZvciByZW5kZXJpbmcuCi0gICAgaWYgKHJlYWR5X2ZyYW1lc18uZW1wdHkoKSkgewotICAgICAgZnJhbWVfYXZhaWxhYmxlXy5UaW1lZFdhaXQoa0lkbGVUaW1lRGVsdGEpOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgLy8gUmVtYWluIGlkbGUgdW50aWwgd2UndmUgaW5pdGlhbGl6ZWQgfGN1cnJlbnRfZnJhbWVffCB2aWEgcHJlcm9sbGluZy4KLSAgICBpZiAoIWN1cnJlbnRfZnJhbWVfKSB7Ci0gICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgb3VyIHByZXJvbGwgb25seSBjb250YWlucyBlbmQgb2Ygc3RyZWFtIGZyYW1lcy4KLSAgICAgIGlmIChyZWFkeV9mcmFtZXNfLmZyb250KCktPklzRW5kT2ZTdHJlYW0oKSkgewotICAgICAgICBzdGF0ZV8gPSBrRW5kZWQ7Ci0gICAgICAgIGVuZGVkX2NiXy5SdW4oKTsKLSAgICAgICAgcmVhZHlfZnJhbWVzXy5jbGVhcigpOwotCi0gICAgICAgIC8vIE5vIG5lZWQgdG8gc2xlZXAgaGVyZSBhcyB3ZSBpZGxlIHdoZW4gfHN0YXRlXyAhPSBrUGxheWluZ3wuCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBmcmFtZV9hdmFpbGFibGVfLlRpbWVkV2FpdChrSWRsZVRpbWVEZWx0YSk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICAvLyBDYWxjdWxhdGUgaG93IGxvbmcgdW50aWwgd2Ugc2hvdWxkIGFkdmFuY2UgdGhlIGZyYW1lLCB3aGljaCBpcwotICAgIC8vIHR5cGljYWxseSBuZWdhdGl2ZSBidXQgZm9yIHBsYXliYWNrIHJhdGVzIDwgMS4wZiBtYXkgYmUgbG9uZyBlbm91Z2gKLSAgICAvLyB0aGF0IGl0IG1ha2VzIG1vcmUgc2Vuc2UgdG8gaWRsZSBhbmQgY2hlY2sgYWdhaW4uCi0gICAgYmFzZTo6VGltZURlbHRhIHJlbWFpbmluZ190aW1lID0KLSAgICAgICAgQ2FsY3VsYXRlU2xlZXBEdXJhdGlvbihyZWFkeV9mcmFtZXNfLmZyb250KCksIHBsYXliYWNrX3JhdGVfKTsKLQotICAgIC8vIFNsZWVwIHVwIHRvIGEgbWF4aW11bSBvZiBvdXIgaWRsZSB0aW1lIHVudGlsIHdlJ3JlIHdpdGhpbiB0aGUgdGltZSB0bwotICAgIC8vIHJlbmRlciB0aGUgbmV4dCBmcmFtZS4KLSAgICBpZiAocmVtYWluaW5nX3RpbWUuSW5NaWNyb3NlY29uZHMoKSA+IDApIHsKLSAgICAgIHJlbWFpbmluZ190aW1lID0gc3RkOjptaW4ocmVtYWluaW5nX3RpbWUsIGtJZGxlVGltZURlbHRhKTsKLSAgICAgIGZyYW1lX2F2YWlsYWJsZV8uVGltZWRXYWl0KHJlbWFpbmluZ190aW1lKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotCi0gICAgLy8gV2UncmUgYWxtb3N0IHRoZXJlIQotICAgIC8vCi0gICAgLy8gQXQgdGhpcyBwb2ludCB3ZSd2ZSByZW5kZXJlZCB8Y3VycmVudF9mcmFtZV98IGZvciB0aGUgcHJvcGVyIGFtb3VudAotICAgIC8vIG9mIHRpbWUgYW5kIGFsc28gaGF2ZSB0aGUgbmV4dCBmcmFtZSB0aGF0IHJlYWR5IGZvciByZW5kZXJpbmcuCi0KLQotICAgIC8vIElmIHRoZSBuZXh0IGZyYW1lIGlzIGVuZCBvZiBzdHJlYW0gdGhlbiB3ZSBhcmUgdHJ1bHkgYXQgdGhlIGVuZCBvZiB0aGUKLSAgICAvLyB2aWRlbyBzdHJlYW0uCi0gICAgLy8KLSAgICAvLyBUT0RPKHNjaGVya3VzKTogZGVkdXBsaWNhdGUgdGhpcyBlbmQgb2Ygc3RyZWFtIGNoZWNrIGFmdGVyIHdlIGdldCByaWQgb2YKLSAgICAvLyB8Y3VycmVudF9mcmFtZV98LgotICAgIGlmIChyZWFkeV9mcmFtZXNfLmZyb250KCktPklzRW5kT2ZTdHJlYW0oKSkgewotICAgICAgc3RhdGVfID0ga0VuZGVkOwotICAgICAgZW5kZWRfY2JfLlJ1bigpOwotICAgICAgcmVhZHlfZnJhbWVzXy5jbGVhcigpOwotCi0gICAgICAvLyBObyBuZWVkIHRvIHNsZWVwIGhlcmUgYXMgd2UgaWRsZSB3aGVuIHxzdGF0ZV8gIT0ga1BsYXlpbmd8LgotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgLy8gV2UgY2Fubm90IHVwZGF0ZSB8Y3VycmVudF9mcmFtZV98IHVudGlsIHdlJ3ZlIGNvbXBsZXRlZCB0aGUgcGVuZGluZwotICAgIC8vIHBhaW50LiBGdXJ0aGVybW9yZSwgdGhlIHBlbmRpbmcgcGFpbnQgbWlnaHQgYmUgcmVhbGx5IHNsb3c6IGNoZWNrIHRvCi0gICAgLy8gc2VlIGlmIHdlIGhhdmUgYW55IHJlYWR5IGZyYW1lcyB0aGF0IHdlIGNhbiBkcm9wIGlmIHRoZXkndmUgYWxyZWFkeQotICAgIC8vIGV4cGlyZWQuCi0gICAgaWYgKHBlbmRpbmdfcGFpbnRfKSB7Ci0gICAgICB3aGlsZSAoIXJlYWR5X2ZyYW1lc18uZW1wdHkoKSkgewotICAgICAgICAvLyBDYW4ndCBkcm9wIGFueXRoaW5nIGlmIHdlJ3JlIGF0IHRoZSBlbmQuCi0gICAgICAgIGlmIChyZWFkeV9mcmFtZXNfLmZyb250KCktPklzRW5kT2ZTdHJlYW0oKSkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBiYXNlOjpUaW1lRGVsdGEgcmVtYWluaW5nX3RpbWUgPQotICAgICAgICAgICAgcmVhZHlfZnJhbWVzXy5mcm9udCgpLT5HZXRUaW1lc3RhbXAoKSAtIGdldF90aW1lX2NiXy5SdW4oKTsKLQotICAgICAgICAvLyBTdGlsbCBhIGNoYW5jZSB3ZSBjYW4gcmVuZGVyIHRoZSBmcmFtZSEKLSAgICAgICAgaWYgKHJlbWFpbmluZ190aW1lLkluTWljcm9zZWNvbmRzKCkgPiAwKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGlmICghZHJvcF9mcmFtZXNfKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8vIEZyYW1lIGRyb3BwZWQ6IHJlYWQgYWdhaW4uCi0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICAgICAgICBUUkFDRV9FVkVOVDEoIm1lZGlhX3N0YWNrIiwgIlZpZGVvUmVuZGVyZXJCYXNlIGRyb3AgZnJhbWUiLAotICAgICAgICAgICAgICAgICAgICAgInRpbWVzdGFtcCIsCi0gICAgICAgICAgICAgICAgICAgICByZWFkeV9mcmFtZXNfLmZyb250KCktPkdldFRpbWVzdGFtcCgpLkluTWljcm9zZWNvbmRzKCkpOwotI2VuZGlmCi0gICAgICAgICsrZnJhbWVzX2Ryb3BwZWQ7Ci0gICAgICAgIHJlYWR5X2ZyYW1lc18ucG9wX2Zyb250KCk7Ci0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICAgICAgICBVUERBVEVfTUVESUFfU1RBVElTVElDUyhTVEFUX1RZUEVfVklERU9fUkVOREVSRVJfQkFDS0xPRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHlfZnJhbWVzXy5zaXplKCkpOwotI2VuZGlmICAvLyBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0gICAgICAgIG1lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKEZST01fSEVSRSwgYmFzZTo6QmluZCgKLSAgICAgICAgICAgICZWaWRlb1JlbmRlcmVyQmFzZTo6QXR0ZW1wdFJlYWQsIHRoaXMpKTsKLSAgICAgIH0KLSAgICAgIC8vIENvbnRpbnVlIHdhaXRpbmcgZm9yIHRoZSBjdXJyZW50IHBhaW50IHRvIGZpbmlzaC4KLSAgICAgIGZyYW1lX2F2YWlsYWJsZV8uVGltZWRXYWl0KGtJZGxlVGltZURlbHRhKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotCi0gICAgLy8gQ29uZ3JhdHVsYXRpb25zISBZb3UndmUgbWFkZSBpdCBwYXN0IHRoZSB2aWRlbyBmcmFtZSB0aW1pbmcgZ2F1bnRsZXQuCi0gICAgLy8KLSAgICAvLyBXZSBjYW4gbm93IHNhZmVseSB1cGRhdGUgdGhlIGN1cnJlbnQgZnJhbWUsIHJlcXVlc3QgYW5vdGhlciBmcmFtZSwgYW5kCi0gICAgLy8gc2lnbmFsIHRvIHRoZSBjbGllbnQgdGhhdCBhIG5ldyBmcmFtZSBpcyBhdmFpbGFibGUuCi0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICAgIFRSQUNFX0VWRU5UMCgibWVkaWFfc3RhY2siLCAiVmlkZW9SZW5kZXJlckJhc2UgcHJvY2VlZCB0byBuZXh0IGZyYW1lIik7Ci0jZW5kaWYKLSAgICBEQ0hFQ0soIXBlbmRpbmdfcGFpbnRfKTsKLSAgICBEQ0hFQ0soIXJlYWR5X2ZyYW1lc18uZW1wdHkoKSk7Ci0gICAgU2V0Q3VycmVudEZyYW1lVG9OZXh0UmVhZHlGcmFtZSgpOwotICAgIG1lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKEZST01fSEVSRSwgYmFzZTo6QmluZCgKLSAgICAgICAgJlZpZGVvUmVuZGVyZXJCYXNlOjpBdHRlbXB0UmVhZCwgdGhpcykpOwotCi0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICAgIFRSQUNFX0VWRU5UMCgibWVkaWFfc3RhY2siLCAiVmlkZW9SZW5kZXJlckJhc2UgcGFpbnRfY2JfIik7Ci0jZW5kaWYKLSAgICBiYXNlOjpBdXRvVW5sb2NrIGF1dG9fdW5sb2NrKGxvY2tfKTsKLSAgICBwYWludF9jYl8uUnVuKCk7Ci0gIH0KLX0KLQotdm9pZCBWaWRlb1JlbmRlcmVyQmFzZTo6U2V0Q3VycmVudEZyYW1lVG9OZXh0UmVhZHlGcmFtZSgpIHsKLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0gIFRSQUNFX0VWRU5UMSgibWVkaWFfc3RhY2siLAotICAgICAgICAgICAgICAgIlZpZGVvUmVuZGVyZXJCYXNlOjpTZXRDdXJyZW50RnJhbWVUb05leHRSZWFkeUZyYW1lKCkiLAotICAgICAgICAgICAgICAgInRpbWVzdGFtcCIsCi0gICAgICAgICAgICAgICByZWFkeV9mcmFtZXNfLmZyb250KCktPkdldFRpbWVzdGFtcCgpLkluTWljcm9zZWNvbmRzKCkpOwotI2VuZGlmCi0gIGN1cnJlbnRfZnJhbWVfID0gcmVhZHlfZnJhbWVzXy5mcm9udCgpOwotICByZWFkeV9mcmFtZXNfLnBvcF9mcm9udCgpOwotI2lmIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLSAgVVBEQVRFX01FRElBX1NUQVRJU1RJQ1MoU1RBVF9UWVBFX1ZJREVPX1JFTkRFUkVSX0JBQ0tMT0csCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5X2ZyYW1lc18uc2l6ZSgpKTsKLSNlbmRpZiAgLy8gZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotCi0gIC8vIE5vdGlmeSB0aGUgcGlwZWxpbmUgb2YgbmF0dXJhbF9zaXplKCkgY2hhbmdlcy4KLSAgY29uc3QgZ2Z4OjpTaXplJiBuYXR1cmFsX3NpemUgPSBjdXJyZW50X2ZyYW1lXy0+bmF0dXJhbF9zaXplKCk7Ci0gIGlmIChuYXR1cmFsX3NpemUgIT0gbGFzdF9uYXR1cmFsX3NpemVfKSB7Ci0gICAgc2l6ZV9jaGFuZ2VkX2NiXy5SdW4obmF0dXJhbF9zaXplKTsKLSAgICBsYXN0X25hdHVyYWxfc2l6ZV8gPSBuYXR1cmFsX3NpemU7Ci0gIH0KLX0KLQotdm9pZCBWaWRlb1JlbmRlcmVyQmFzZTo6R2V0Q3VycmVudEZyYW1lKHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4qIGZyYW1lX291dCkgewotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICBEQ0hFQ0soIXBlbmRpbmdfcGFpbnRfICYmICFwZW5kaW5nX3BhaW50X3dpdGhfbGFzdF9hdmFpbGFibGVfKTsKLQotICBpZiAoKCFjdXJyZW50X2ZyYW1lXyB8fCBjdXJyZW50X2ZyYW1lXy0+SXNFbmRPZlN0cmVhbSgpKSAmJgotICAgICAgKCFsYXN0X2F2YWlsYWJsZV9mcmFtZV8gfHwgbGFzdF9hdmFpbGFibGVfZnJhbWVfLT5Jc0VuZE9mU3RyZWFtKCkpKSB7Ci0gICAgKmZyYW1lX291dCA9IE5VTEw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0gIFRSQUNFX0VWRU5UMCgibWVkaWFfc3RhY2siLCAiVmlkZW9SZW5kZXJlckJhc2U6OkdldEN1cnJlbnRGcmFtZSgpIik7Ci0jZW5kaWYKLQotICAvLyBXZSBzaG91bGQgaGF2ZSBpbml0aWFsaXplZCBhbmQgaGF2ZSB0aGUgY3VycmVudCBmcmFtZS4KLSAgRENIRUNLX05FKHN0YXRlXywga1VuaW5pdGlhbGl6ZWQpOwotICBEQ0hFQ0tfTkUoc3RhdGVfLCBrU3RvcHBlZCk7Ci0gIERDSEVDS19ORShzdGF0ZV8sIGtFcnJvcik7Ci0KLSAgaWYgKGN1cnJlbnRfZnJhbWVfKSB7Ci0gICAgKmZyYW1lX291dCA9IGN1cnJlbnRfZnJhbWVfOwotICAgIGxhc3RfYXZhaWxhYmxlX2ZyYW1lXyA9IGN1cnJlbnRfZnJhbWVfOwotICAgIHBlbmRpbmdfcGFpbnRfID0gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICBEQ0hFQ0sobGFzdF9hdmFpbGFibGVfZnJhbWVfKTsKLSAgICAqZnJhbWVfb3V0ID0gbGFzdF9hdmFpbGFibGVfZnJhbWVfOwotICAgIHBlbmRpbmdfcGFpbnRfd2l0aF9sYXN0X2F2YWlsYWJsZV8gPSB0cnVlOwotICB9Ci19Ci0KLXZvaWQgVmlkZW9SZW5kZXJlckJhc2U6OlB1dEN1cnJlbnRGcmFtZShzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IGZyYW1lKSB7Ci0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICBUUkFDRV9FVkVOVDAoIm1lZGlhX3N0YWNrIiwgIlZpZGVvUmVuZGVyZXJCYXNlOjpQdXRDdXJyZW50RnJhbWUoKSIpOwotI2VuZGlmCi0KLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLQotICAvLyBOb3RlIHRoYXQgd2UgZG8gbm90IGNsYWltIHxwZW5kaW5nX3BhaW50X3wgd2hlbiB3ZSByZXR1cm4gTlVMTCBmcmFtZSwgaW4KLSAgLy8gdGhhdCBjYXNlLCB8Y3VycmVudF9mcmFtZV98IGNvdWxkIGJlIGNoYW5nZWQgYmVmb3JlIFB1dEN1cnJlbnRGcmFtZS4KLSAgaWYgKHBlbmRpbmdfcGFpbnRfKSB7Ci0gICAgRENIRUNLX0VRKGN1cnJlbnRfZnJhbWVfLCBmcmFtZSk7Ci0gICAgRENIRUNLKCFwZW5kaW5nX3BhaW50X3dpdGhfbGFzdF9hdmFpbGFibGVfKTsKLSAgICBwZW5kaW5nX3BhaW50XyA9IGZhbHNlOwotICB9IGVsc2UgaWYgKHBlbmRpbmdfcGFpbnRfd2l0aF9sYXN0X2F2YWlsYWJsZV8pIHsKLSAgICBEQ0hFQ0tfRVEobGFzdF9hdmFpbGFibGVfZnJhbWVfLCBmcmFtZSk7Ci0gICAgRENIRUNLKCFwZW5kaW5nX3BhaW50Xyk7Ci0gICAgcGVuZGluZ19wYWludF93aXRoX2xhc3RfYXZhaWxhYmxlXyA9IGZhbHNlOwotICB9IGVsc2UgewotICAgIERDSEVDSyghZnJhbWUpOwotICB9Ci0KLSAgLy8gV2UgaGFkIGNsZWFyZWQgdGhlIHxwZW5kaW5nX3BhaW50X3wgZmxhZywgdGhlcmUgYXJlIGNoYW5jZXMgdGhhdCBjdXJyZW50Ci0gIC8vIGZyYW1lIGlzIHRpbWVkLW91dC4gV2Ugd2lsbCB3YWtlIHVwIG91ciBtYWluIHRocmVhZCB0byBhZHZhbmNlIHRoZSBjdXJyZW50Ci0gIC8vIGZyYW1lIHdoZW4gdGhpcyBpcyB0cnVlLgotICBmcmFtZV9hdmFpbGFibGVfLlNpZ25hbCgpOwotICBpZiAoc3RhdGVfID09IGtGbHVzaGluZ0RlY29kZXIpCi0gICAgcmV0dXJuOwotCi0gIGlmIChzdGF0ZV8gPT0ga0ZsdXNoaW5nKSB7Ci0gICAgQXR0ZW1wdEZsdXNoX0xvY2tlZCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzdGF0ZV8gPT0ga0Vycm9yIHx8IHN0YXRlXyA9PSBrU3RvcHBlZCkgewotICAgIERvU3RvcE9yRXJyb3JfTG9ja2VkKCk7Ci0gIH0KLX0KLQotdm9pZCBWaWRlb1JlbmRlcmVyQmFzZTo6RnJhbWVSZWFkeSgKLSAgICBWaWRlb0RlY29kZXI6OlN0YXR1cyBzdGF0dXMsCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiYgaW5jb21pbmdfZnJhbWUpIHsKLSAgLy8gTWFrZSBhIGNvcHkgYXMgd2UgbWF5IGFzc2lnbiBuZXdseSBjcmVhdGVkIHB1bmNoIG91dCBmcmFtZSB0byBgZnJhbWVgIHdoZW4KLSAgLy8gZnJhbWUgcHJvdmlkZXIgaXMgYXZhaWxhYmxlLgotICBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IGZyYW1lKGluY29taW5nX2ZyYW1lKTsKLQotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICBEQ0hFQ0tfTkUoc3RhdGVfLCBrVW5pbml0aWFsaXplZCk7Ci0KLSAgQ0hFQ0socGVuZGluZ19yZWFkXyk7Ci0gIHBlbmRpbmdfcmVhZF8gPSBmYWxzZTsKLQotICBpZiAoc3RhdHVzICE9IFZpZGVvRGVjb2Rlcjo6a09rKSB7Ci0gICAgRENIRUNLKCFmcmFtZSk7Ci0gICAgUGlwZWxpbmVTdGF0dXMgZXJyb3IgPSBQSVBFTElORV9FUlJPUl9ERUNPREU7Ci0gICAgaWYgKHN0YXR1cyA9PSBWaWRlb0RlY29kZXI6OmtEZWNyeXB0RXJyb3IpCi0gICAgICBlcnJvciA9IFBJUEVMSU5FX0VSUk9SX0RFQ1JZUFQ7Ci0KLSAgICBpZiAoIXByZXJvbGxfY2JfLmlzX251bGwoKSkgewotICAgICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnByZXJvbGxfY2JfKS5SdW4oZXJyb3IpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGVycm9yX2NiXy5SdW4oZXJyb3IpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIEFscmVhZHktcXVldWVkIERlY29kZXIgUmVhZENCJ3MgY2FuIGZpcmUgYWZ0ZXIgdmFyaW91cyBzdGF0ZSB0cmFuc2l0aW9ucwotICAvLyBoYXZlIGhhcHBlbmVkOyBpbiB0aGF0IGNhc2UganVzdCBkcm9wIHRob3NlIGZyYW1lcyBpbW1lZGlhdGVseS4KLSAgaWYgKHN0YXRlXyA9PSBrU3RvcHBlZCB8fCBzdGF0ZV8gPT0ga0Vycm9yIHx8IHN0YXRlXyA9PSBrRmx1c2hlZCB8fAotICAgICAgc3RhdGVfID09IGtGbHVzaGluZ0RlY29kZXIpCi0gICAgcmV0dXJuOwotCi0gIGlmIChzdGF0ZV8gPT0ga0ZsdXNoaW5nKSB7Ci0gICAgQXR0ZW1wdEZsdXNoX0xvY2tlZCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICghZnJhbWUpIHsKLSAgICBpZiAoc3RhdGVfICE9IGtQcmVyb2xsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgLy8gQWJvcnQgcHJlcm9sbCBlYXJseSBmb3IgYSBOVUxMIGZyYW1lIGJlY2F1c2Ugd2Ugd29uJ3QgZ2V0IG1vcmUgZnJhbWVzLgotICAgIC8vIEEgbmV3IHByZXJvbGwgd2lsbCBiZSByZXF1ZXN0ZWQgYWZ0ZXIgdGhpcyBvbmUgY29tcGxldGVzIHNvIHRoZXJlIGlzIG5vCi0gICAgLy8gcG9pbnQgdHJ5aW5nIHRvIGNvbGxlY3QgbW9yZSBmcmFtZXMuCi0gICAgc3RhdGVfID0ga1ByZXJvbGxlZDsKLSAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcHJlcm9sbF9jYl8pLlJ1bihQSVBFTElORV9PSyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0gIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gb3JpZ2luYWxfZnJhbWU7Ci0gIGlmIChmcmFtZV9wcm92aWRlcl8gJiYgIWZyYW1lLT5Jc0VuZE9mU3RyZWFtKCkpIHsKLSAgICAvLyBTYXZlIHRoZSBmcmFtZSB0byBvcmlnaW5hbF9mcmFtZSBzbyBpdCBjYW4gYmUgYWRkZWQgaW50byBmcmFtZV9wcm92aWRlcgotICAgIC8vIGxhdGVyLgotICAgIG9yaWdpbmFsX2ZyYW1lID0gZnJhbWU7Ci0gICAgZnJhbWUgPSBWaWRlb0ZyYW1lOjpDcmVhdGVQdW5jaE91dEZyYW1lKAotICAgICAgICBvcmlnaW5hbF9mcmFtZS0+dmlzaWJsZV9yZWN0KCkuc2l6ZSgpKTsKLSAgICBmcmFtZS0+U2V0VGltZXN0YW1wKG9yaWdpbmFsX2ZyYW1lLT5HZXRUaW1lc3RhbXAoKSk7Ci0gIH0KLSNlbmRpZiAgLy8gZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotCi0gIC8vIERpc2NhcmQgZnJhbWVzIHVudGlsIHdlIHJlYWNoIG91ciBkZXNpcmVkIHByZXJvbGwgdGltZXN0YW1wLgotICBpZiAoc3RhdGVfID09IGtQcmVyb2xsaW5nICYmICFmcmFtZS0+SXNFbmRPZlN0cmVhbSgpICYmCi0gICAgICBmcmFtZS0+R2V0VGltZXN0YW1wKCkgPD0gcHJlcm9sbF90aW1lc3RhbXBfKSB7Ci0gICAgcHJlcm9sbGluZ19kZWxheWVkX2ZyYW1lXyA9IGZyYW1lOwotICAgIEF0dGVtcHRSZWFkX0xvY2tlZCgpOwotICAgIHJldHVybjsKLSAgfQotCi0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICBpZiAoZnJhbWVfcHJvdmlkZXJfICYmIG9yaWdpbmFsX2ZyYW1lKSB7Ci0gICAgZnJhbWVfcHJvdmlkZXJfLT5BZGRGcmFtZShvcmlnaW5hbF9mcmFtZSk7Ci0gIH0KLSNlbmRpZiAgLy8gZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotCi0gIGlmIChwcmVyb2xsaW5nX2RlbGF5ZWRfZnJhbWVfKSB7Ci0gICAgRENIRUNLX0VRKHN0YXRlXywga1ByZXJvbGxpbmcpOwotICAgIEFkZFJlYWR5RnJhbWUocHJlcm9sbGluZ19kZWxheWVkX2ZyYW1lXyk7Ci0gICAgcHJlcm9sbGluZ19kZWxheWVkX2ZyYW1lXyA9IE5VTEw7Ci0gIH0KLQotICBBZGRSZWFkeUZyYW1lKGZyYW1lKTsKLSAgUGlwZWxpbmVTdGF0aXN0aWNzIHN0YXRpc3RpY3M7Ci0gIHN0YXRpc3RpY3MudmlkZW9fZnJhbWVzX2RlY29kZWQgPSAxOwotICBzdGF0aXN0aWNzX2NiXy5SdW4oc3RhdGlzdGljcyk7Ci0KLSAgLy8gQWx3YXlzIHJlcXVlc3QgbW9yZSBkZWNvZGVkIHZpZGVvIGlmIHdlIGhhdmUgY2FwYWNpdHkuIFRoaXMgc2VydmVzIHR3bwotICAvLyBwdXJwb3NlczoKLSAgLy8gICAxKSBQcmVyb2xsaW5nIHdoaWxlIHBhdXNlZAotICAvLyAgIDIpIEtlZXBzIGRlY29kaW5nIGdvaW5nIGlmIHZpZGVvIHJlbmRlcmluZyB0aHJlYWQgc3RhcnRzIGZhbGxpbmcgYmVoaW5kCi0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICBib29sIGlzX3ByZXJvbGxpbmcgPSBzdGF0ZV8gPT0ga1ByZXJvbGxpbmc7Ci0gIGludCBtYXhfdmlkZW9fZnJhbWVzID0KLSAgICAgIGlzX3ByZXJvbGxpbmcgPyBTaGVsbE1lZGlhUGxhdGZvcm06Okluc3RhbmNlKCktPkdldE1heFZpZGVvUHJlcm9sbEZyYW1lcygpCi0gICAgICAgICAgICAgICAgICAgIDogU2hlbGxNZWRpYVBsYXRmb3JtOjpJbnN0YW5jZSgpLT5HZXRNYXhWaWRlb0ZyYW1lcygpOwotICBpZiAoTnVtRnJhbWVzX0xvY2tlZCgpIDwgbWF4X3ZpZGVvX2ZyYW1lcyAmJiAhZnJhbWUtPklzRW5kT2ZTdHJlYW0oKSkgewotI2Vsc2UgIC8vIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLSAgaWYgKE51bUZyYW1lc19Mb2NrZWQoKSA8IGxpbWl0czo6a01heFZpZGVvRnJhbWVzICYmICFmcmFtZS0+SXNFbmRPZlN0cmVhbSgpKSB7Ci0jZW5kaWYgIC8vIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLSAgICBBdHRlbXB0UmVhZF9Mb2NrZWQoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBJZiB3ZSdyZSBhdCBjYXBhY2l0eSBvciBlbmQgb2Ygc3RyZWFtIHdoaWxlIHByZXJvbGxpbmcgd2UgbmVlZCB0bwotICAvLyB0cmFuc2l0aW9uIHRvIHByZXJvbGxlZC4KLSAgaWYgKHN0YXRlXyA9PSBrUHJlcm9sbGluZykgewotICAgIERDSEVDSyghY3VycmVudF9mcmFtZV8pOwotICAgIHN0YXRlXyA9IGtQcmVyb2xsZWQ7Ci0KLSAgICAvLyBCZWNhdXNlIHdlIG1pZ2h0IHJlbWFpbiBpbiB0aGUgcHJlcm9sbGVkIHN0YXRlIGZvciBhbiB1bmRldGVybWluZWQgYW1vdW50Ci0gICAgLy8gb2YgdGltZSAoaS5lLiwgd2Ugd2VyZSBub3QgcGxheWluZyBiZWZvcmUgd2Ugc3RhcnRlZCBwcmVyb2xsaW5nKSwgd2UnbGwKLSAgICAvLyBtYW51YWxseSB1cGRhdGUgdGhlIGN1cnJlbnQgZnJhbWUgYW5kIG5vdGlmeSB0aGUgc3ViY2xhc3MgYmVsb3cuCi0gICAgaWYgKCFyZWFkeV9mcmFtZXNfLmZyb250KCktPklzRW5kT2ZTdHJlYW0oKSkKLSAgICAgIFNldEN1cnJlbnRGcmFtZVRvTmV4dFJlYWR5RnJhbWUoKTsKLQotICAgIC8vIC4uLmFuZCB3ZSdyZSBkb25lIHByZXJvbGxpbmchCi0gICAgRENIRUNLKCFwcmVyb2xsX2NiXy5pc19udWxsKCkpOwotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZwcmVyb2xsX2NiXykuUnVuKFBJUEVMSU5FX09LKTsKLQotI2lmIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLSAgICBUUkFDRV9FVkVOVDAoIm1lZGlhX3N0YWNrIiwgIlZpZGVvUmVuZGVyZXJCYXNlIHBhaW50X2NiXyIpOwotI2VuZGlmCi0gICAgYmFzZTo6QXV0b1VubG9jayB1bChsb2NrXyk7Ci0gICAgcGFpbnRfY2JfLlJ1bigpOwotICB9Ci19Ci0KLXZvaWQgVmlkZW9SZW5kZXJlckJhc2U6OkFkZFJlYWR5RnJhbWUoY29uc3Qgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiYgZnJhbWUpIHsKLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0gIFRSQUNFX0VWRU5UMSgibWVkaWFfc3RhY2siLCAiVmlkZW9SZW5kZXJlckJhc2U6OkFkZFJlYWR5RnJhbWUoKSIsCi0gICAgICAgICAgICAgICAidGltZXN0YW1wIiwgZnJhbWUtPkdldFRpbWVzdGFtcCgpLkluTWljcm9zZWNvbmRzKCkpOwotI2VuZGlmCi0gIC8vIEFkanVzdCB0aGUgaW5jb21pbmcgZnJhbWUgaWYgaXRzIHJlbmRlcmluZyBzdG9wIHRpbWUgaXMgcGFzdCB0aGUgZHVyYXRpb24KLSAgLy8gb2YgdGhlIHZpZGVvIGl0c2VsZi4gVGhpcyBpcyB0eXBpY2FsbHkgdGhlIGxhc3QgZnJhbWUgb2YgdGhlIHZpZGVvIGFuZAotICAvLyBvY2N1cnMgaWYgdGhlIGNvbnRhaW5lciBzcGVjaWZpZXMgYSBkdXJhdGlvbiB0aGF0IGlzbid0IGEgbXVsdGlwbGUgb2YgdGhlCi0gIC8vIGZyYW1lIHJhdGUuICBBbm90aGVyIHdheSBmb3IgdGhpcyB0byBoYXBwZW4gaXMgZm9yIHRoZSBjb250YWluZXIgdG8gc3RhdGUgYQotICAvLyBzbWFsbGVyIGR1cmF0aW9uIHRoYW4gdGhlIGxhcmdlc3QgcGFja2V0IHRpbWVzdGFtcC4KLSAgYmFzZTo6VGltZURlbHRhIGR1cmF0aW9uID0gZ2V0X2R1cmF0aW9uX2NiXy5SdW4oKTsKLSAgaWYgKGZyYW1lLT5Jc0VuZE9mU3RyZWFtKCkpIHsKLSAgICBiYXNlOjpUaW1lRGVsdGEgZW5kX3RpbWVzdGFtcCA9IGtOb1RpbWVzdGFtcCgpOwotICAgIGlmICghcmVhZHlfZnJhbWVzXy5lbXB0eSgpKSB7Ci0gICAgICBlbmRfdGltZXN0YW1wID0gc3RkOjptaW4oCi0gICAgICAgICAgZHVyYXRpb24sCi0gICAgICAgICAgcmVhZHlfZnJhbWVzXy5iYWNrKCktPkdldFRpbWVzdGFtcCgpICsga01heExhc3RGcmFtZUR1cmF0aW9uKCkpOwotICAgIH0gZWxzZSBpZiAoY3VycmVudF9mcmFtZV8pIHsKLSAgICAgIGVuZF90aW1lc3RhbXAgPQotICAgICAgICAgIHN0ZDo6bWluKGR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZnJhbWVfLT5HZXRUaW1lc3RhbXAoKSArIGtNYXhMYXN0RnJhbWVEdXJhdGlvbigpKTsKLSAgICB9Ci0gICAgZnJhbWUtPlNldFRpbWVzdGFtcChlbmRfdGltZXN0YW1wKTsKLSAgfSBlbHNlIGlmIChmcmFtZS0+R2V0VGltZXN0YW1wKCkgPiBkdXJhdGlvbikgewotICAgIGZyYW1lLT5TZXRUaW1lc3RhbXAoZHVyYXRpb24pOwotICB9Ci0KLSNpZiAhZGVmaW5lZChfX0xCX1NIRUxMX19GT1JfUkVMRUFTRV9fKQotICBpZiAoZnJhbWUtPkdldFRpbWVzdGFtcCgpIDwgZ2V0X3RpbWVfY2JfLlJ1bigpKSB7Ci0gICAgU0NPUEVEX01FRElBX1NUQVRJU1RJQ1MoU1RBVF9UWVBFX1ZJREVPX0ZSQU1FX0xBVEUpOwotICAgICsrbGF0ZV9mcmFtZXNfOwotICB9Ci0jZW5kaWYgIC8vICFkZWZpbmVkKF9fTEJfU0hFTExfX0ZPUl9SRUxFQVNFX18pCi0KLSAgcmVhZHlfZnJhbWVzXy5wdXNoX2JhY2soZnJhbWUpOwotI2lmIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLSAgRENIRUNLX0xFKE51bUZyYW1lc19Mb2NrZWQoKSwKLSAgICAgICAgICAgIFNoZWxsTWVkaWFQbGF0Zm9ybTo6SW5zdGFuY2UoKS0+R2V0TWF4VmlkZW9GcmFtZXMoKSk7Ci0jZWxzZSAgLy8gZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICBEQ0hFQ0tfTEUoTnVtRnJhbWVzX0xvY2tlZCgpLCBsaW1pdHM6OmtNYXhWaWRlb0ZyYW1lcyk7Ci0jZW5kaWYgIC8vIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLQotICBiYXNlOjpUaW1lRGVsdGEgbWF4X2Nsb2NrX3RpbWUgPQotICAgICAgZnJhbWUtPklzRW5kT2ZTdHJlYW0oKSA/IGR1cmF0aW9uIDogZnJhbWUtPkdldFRpbWVzdGFtcCgpOwotICBEQ0hFQ0sobWF4X2Nsb2NrX3RpbWUgIT0ga05vVGltZXN0YW1wKCkpOwotICBtYXhfdGltZV9jYl8uUnVuKG1heF9jbG9ja190aW1lKTsKLQotICBmcmFtZV9hdmFpbGFibGVfLlNpZ25hbCgpOwotfQotCi12b2lkIFZpZGVvUmVuZGVyZXJCYXNlOjpBdHRlbXB0UmVhZCgpIHsKLSAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgQXR0ZW1wdFJlYWRfTG9ja2VkKCk7Ci19Ci0KLXZvaWQgVmlkZW9SZW5kZXJlckJhc2U6OkF0dGVtcHRSZWFkX0xvY2tlZCgpIHsKLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0gIFRSQUNFX0VWRU5UMCgibWVkaWFfc3RhY2siLCAiVmlkZW9SZW5kZXJlckJhc2U6OkF0dGVtcHRSZWFkX0xvY2tlZCgpIik7Ci0jZW5kaWYKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIGxvY2tfLkFzc2VydEFjcXVpcmVkKCk7Ci0KLSAgaWYgKHBlbmRpbmdfcmVhZF8gfHwKLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0gICAgICBOdW1GcmFtZXNfTG9ja2VkKCkgPT0KLSAgICAgICAgICBTaGVsbE1lZGlhUGxhdGZvcm06Okluc3RhbmNlKCktPkdldE1heFZpZGVvRnJhbWVzKCkgfHwKLSNlbHNlICAvLyBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0gICAgICBOdW1GcmFtZXNfTG9ja2VkKCkgPT0gbGltaXRzOjprTWF4VmlkZW9GcmFtZXMgfHwKLSNlbmRpZiAgLy8gZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICAgICAgKCFyZWFkeV9mcmFtZXNfLmVtcHR5KCkgJiYgcmVhZHlfZnJhbWVzXy5iYWNrKCktPklzRW5kT2ZTdHJlYW0oKSkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBVcGRhdGVVbmRlcmZsb3dTdGF0dXNUb0RlY29kZXJfTG9ja2VkKCk7Ci0KLSAgc3dpdGNoIChzdGF0ZV8pIHsKLSAgICBjYXNlIGtQYXVzZWQ6Ci0gICAgY2FzZSBrRmx1c2hpbmc6Ci0gICAgY2FzZSBrUHJlcm9sbGluZzoKLSAgICBjYXNlIGtQbGF5aW5nOgotICAgICAgcGVuZGluZ19yZWFkXyA9IHRydWU7Ci0gICAgICBkZWNvZGVyXy0+UmVhZChiYXNlOjpCaW5kKCZWaWRlb1JlbmRlcmVyQmFzZTo6RnJhbWVSZWFkeSwgdGhpcykpOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBrVW5pbml0aWFsaXplZDoKLSAgICBjYXNlIGtJbml0aWFsaXppbmc6Ci0gICAgY2FzZSBrUHJlcm9sbGVkOgotICAgIGNhc2Uga0ZsdXNoaW5nRGVjb2RlcjoKLSAgICBjYXNlIGtGbHVzaGVkOgotICAgIGNhc2Uga0VuZGVkOgotICAgIGNhc2Uga1N0b3BwZWQ6Ci0gICAgY2FzZSBrRXJyb3I6Ci0gICAgICByZXR1cm47Ci0gIH0KLX0KLQotdm9pZCBWaWRlb1JlbmRlcmVyQmFzZTo6VXBkYXRlVW5kZXJmbG93U3RhdHVzVG9EZWNvZGVyX0xvY2tlZCgpIHsKLSAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIGxvY2tfLkFzc2VydEFjcXVpcmVkKCk7Ci0KLSAgaWYgKCFkZWNvZGVyXykgewotICAgIHJldHVybjsKLSAgfQotICBpZiAoc3RhdGVfICE9IGtQbGF5aW5nKSB7Ci0gICAgLy8gSWYgd2UgYXJlIG5vdCBwbGF5aW5nLCBpbmZvcm0gdGhlIGRlY29kZXIgdGhhdCB3ZSBoYXZlIGVub3VnaCBmcmFtZXMgc28KLSAgICAvLyBpdCB3aWxsIGRlY29kZSBpbiBoaWdoIHF1YWxpdHkuCi0gICAgZGVjb2Rlcl8tPkhhdmVFbm91Z2hGcmFtZXMoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBUaGVyZSBhcmUgdHdvIHN0YWdlcyBkdXJpbmcgcGxheWJhY2s6IHByZXJvbGxpbmcgYW5kIHBsYXlpbmcuICBJbiB0aGUKLSAgLy8gZm9sbG93aW5nIGV4YW1wbGUsIHdlIGFzc3VtZSB0aGUgcHJlcm9sbCBmcmFtZSBjb3VudCBpcyA0LCB0aGUgdW5kZXJmbG93Ci0gIC8vIGZyYW1lIGNvdW50IGlzIDE2IGFuZCB0aGUgbWF4aW11bSBmcmFtZSBjb3VudCBpcyAzMi4KLSAgLy8gMS4gUHJlcm9sbGluZzoKLSAgLy8gV2hlbiB0aGUgdmlkZW8gc3RhcnRzIHRvIHBsYXkgYmFjaywgdGhlcmUgd2lsbCBiZSA0IGZyYW1lcyBidWZmZXJlZC4gIFRoZW4KLSAgLy8gaXQgd2lsbCBzbG93bHkgZ3JvdyB1cCB0byAzMiBmcmFtZXMgaWYgdGhlIGRlY29kaW5nIHNwZWVkIGlzIGZhc3QgZW5vdWdoLgotICAvLyBXaGVuIHRoZSBjYWNoZWQgZnJhbWUgY291bnQgc3RhcnQgdG8gZGVjcmVhc2UgY29uc2lzdGVudGx5LCB0aGVyZSBpcyBhbgotICAvLyBvdmVyZmxvdy4gIE5vdGUgdGhhdCB3ZSBjYW5ub3Qgc2ltcGx5IGNvbXBhcmUgdGhlIGN1cnJlbnQgY2FjaGVkIGZyYW1lCi0gIC8vIGFnYWluc3QgR2V0VmlkZW9VbmRlcmZsb3dGcmFtZXMoKSBiZWNhdXNlIGFzIGxvbmcgYXMgd2UgYXJlIGFjY3VtdWxhdGluZwotICAvLyBtb3JlIGZyYW1lcywgd2UgZG9uJ3Qgd2FudCB0byB0cmlnZ2VyIHVuZGVyZmxvdyBkdXJpbmcgc3RhcnQgdXAuIFNvIHdlCi0gIC8vIHJlY29yZCB0aGUgbWF4aW11bSBmcmFtZSBldmVyIHJlYWNoZWQgYW5kIHdoZW4gdGhlIGNhY2hlZCBmcmFtZSBjb3VudAotICAvLyBkcm9wcyBiZWxvdyBgbWF4aW11bSBmcmFtZSBjb3VudGAgLSBrVW5kZXJmbG93QWRqdXN0bWVudCwgd2UgdHJpZ2dlcgotICAvLyB1bmRlcmZsb3cuCi0gIC8vIDIuIFBsYXlpbmcuCi0gIC8vIEluIHRoaXMgY2FzZSB3ZSBhbHJlYWR5IGhhdmUgbWF4aW11bSBmcmFtZXMgaW4gY2FjaGUgc28gd2UgaGF2ZSBtb3JlIHJvb20KLSAgLy8gZm9yIHNsb3cgZGVjb2RpbmcuICBXZSBvbmx5IHRyaWdnZXIgdW5kZXJmbG93IHdoZW4gdGhlIGNhY2hlZCBmcmFtZSBjb3VudAotICAvLyBkcm9wcyBiZWxvdyBHZXRWaWRlb1VuZGVyZmxvd0ZyYW1lcygpLgotICBjb25zdCBpbnQga1VuZGVyZmxvd0FkanVzdG1lbnQgPSAyOwotICBtYXhpbXVtX2ZyYW1lc19jYWNoZWRfID0gc3RkOjptYXgobWF4aW11bV9mcmFtZXNfY2FjaGVkXywgTnVtRnJhbWVzX0xvY2tlZCgpKTsKLSAgaW50IHVuZGVyZmxvd190aHJlc2hvbGQgPSBzdGQ6Om1pbigKLSAgICAgIFNoZWxsTWVkaWFQbGF0Zm9ybTo6SW5zdGFuY2UoKS0+R2V0VmlkZW9VbmRlcmZsb3dGcmFtZXMoKSwKLSAgICAgIHN0ZDo6bWF4KG1heGltdW1fZnJhbWVzX2NhY2hlZF8gLSBrVW5kZXJmbG93QWRqdXN0bWVudCwgMCkpOwotCi0gIGlmIChOdW1GcmFtZXNfTG9ja2VkKCkgPCB1bmRlcmZsb3dfdGhyZXNob2xkKSB7Ci0gICAgZGVjb2Rlcl8tPk5lYXJseVVuZGVyZmxvdygpOwotICB9IGVsc2UgewotICAgIGRlY29kZXJfLT5IYXZlRW5vdWdoRnJhbWVzKCk7Ci0gIH0KLX0KLQotdm9pZCBWaWRlb1JlbmRlcmVyQmFzZTo6T25EZWNvZGVyUmVzZXREb25lKCkgewotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotICBpZiAoc3RhdGVfID09IGtTdG9wcGVkKQotICAgIHJldHVybjsKLQotICBEQ0hFQ0tfRVEoa0ZsdXNoaW5nRGVjb2Rlciwgc3RhdGVfKTsKLSAgRENIRUNLKCFwZW5kaW5nX3JlYWRfKTsKLQotICBzdGF0ZV8gPSBrRmx1c2hpbmc7Ci0gIEF0dGVtcHRGbHVzaF9Mb2NrZWQoKTsKLX0KLQotdm9pZCBWaWRlb1JlbmRlcmVyQmFzZTo6QXR0ZW1wdEZsdXNoX0xvY2tlZCgpIHsKLSAgbG9ja18uQXNzZXJ0QWNxdWlyZWQoKTsKLSAgRENIRUNLX0VRKGtGbHVzaGluZywgc3RhdGVfKTsKLQotICBwcmVyb2xsaW5nX2RlbGF5ZWRfZnJhbWVfID0gTlVMTDsKLSAgcmVhZHlfZnJhbWVzXy5jbGVhcigpOwotICBtYXhpbXVtX2ZyYW1lc19jYWNoZWRfID0gMDsKLQotI2lmIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLSAgaWYgKGZyYW1lX3Byb3ZpZGVyXykgeyBmcmFtZV9wcm92aWRlcl8tPkZsdXNoKCk7IH0KLSNlbmRpZiAgLy8gZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotCi0gIGlmICghcGVuZGluZ19wYWludF8gJiYgIXBlbmRpbmdfcmVhZF8pIHsKLSAgICBzdGF0ZV8gPSBrRmx1c2hlZDsKLSAgICBjdXJyZW50X2ZyYW1lXyA9IE5VTEw7Ci0gICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJmZsdXNoX2NiXykuUnVuKCk7Ci0gIH0KLX0KLQotYmFzZTo6VGltZURlbHRhIFZpZGVvUmVuZGVyZXJCYXNlOjpDYWxjdWxhdGVTbGVlcER1cmF0aW9uKAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4mIG5leHRfZnJhbWUsCi0gICAgZmxvYXQgcGxheWJhY2tfcmF0ZSkgewotICAvLyBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgYW5kIG5leHQgcHJlc2VudGF0aW9uIHRpbWVzdGFtcHMuCi0gIGJhc2U6OlRpbWVEZWx0YSBub3cgPSBnZXRfdGltZV9jYl8uUnVuKCk7Ci0gIGJhc2U6OlRpbWVEZWx0YSBuZXh0X3B0cyA9IG5leHRfZnJhbWUtPkdldFRpbWVzdGFtcCgpOwotCi0gIC8vIFNjYWxlIG91ciBzbGVlcCBiYXNlZCBvbiB0aGUgcGxheWJhY2sgcmF0ZS4KLSAgYmFzZTo6VGltZURlbHRhIHNsZWVwID0gbmV4dF9wdHMgLSBub3c7Ci0gIHJldHVybiBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWNyb3NlY29uZHMoCi0gICAgICBzdGF0aWNfY2FzdDxpbnQ2ND4oc2xlZXAuSW5NaWNyb3NlY29uZHMoKSAvIHBsYXliYWNrX3JhdGUpKTsKLX0KLQotdm9pZCBWaWRlb1JlbmRlcmVyQmFzZTo6RG9TdG9wT3JFcnJvcl9Mb2NrZWQoKSB7Ci0gIERDSEVDSyghcGVuZGluZ19wYWludF8pOwotICBEQ0hFQ0soIXBlbmRpbmdfcGFpbnRfd2l0aF9sYXN0X2F2YWlsYWJsZV8pOwotICBsb2NrXy5Bc3NlcnRBY3F1aXJlZCgpOwotICBjdXJyZW50X2ZyYW1lXyA9IE5VTEw7Ci0gIGxhc3RfYXZhaWxhYmxlX2ZyYW1lXyA9IE5VTEw7Ci0gIHJlYWR5X2ZyYW1lc18uY2xlYXIoKTsKLX0KLQotaW50IFZpZGVvUmVuZGVyZXJCYXNlOjpOdW1GcmFtZXNfTG9ja2VkKCkgY29uc3QgewotICBsb2NrXy5Bc3NlcnRBY3F1aXJlZCgpOwotICBpZiAoZnJhbWVfcHJvdmlkZXJfKSB7Ci0gICAgcmV0dXJuIGZyYW1lX3Byb3ZpZGVyXy0+R2V0TnVtT2ZGcmFtZXNDYWNoZWQoKTsKLSAgfQotCi0gIGludCBvdXRzdGFuZGluZ19mcmFtZXMgPQotICAgICAgKGN1cnJlbnRfZnJhbWVfID8gMSA6IDApICsgKGxhc3RfYXZhaWxhYmxlX2ZyYW1lXyA/IDEgOiAwKSArCi0gICAgICAoY3VycmVudF9mcmFtZV8gJiYgKGN1cnJlbnRfZnJhbWVfID09IGxhc3RfYXZhaWxhYmxlX2ZyYW1lXykgPyAtMSA6IDApOwotICByZXR1cm4gcmVhZHlfZnJhbWVzXy5zaXplKCkgKyBvdXRzdGFuZGluZ19mcmFtZXM7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvdmlkZW9fcmVuZGVyZXJfYmFzZS5oIGIvc3JjL21lZGlhL2ZpbHRlcnMvdmlkZW9fcmVuZGVyZXJfYmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODQyZjE4Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL3ZpZGVvX3JlbmRlcmVyX2Jhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX0ZJTFRFUlNfVklERU9fUkVOREVSRVJfQkFTRV9IXwotI2RlZmluZSBNRURJQV9GSUxURVJTX1ZJREVPX1JFTkRFUkVSX0JBU0VfSF8KLQotI2luY2x1ZGUgPGRlcXVlPgotCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi9jb25kaXRpb25fdmFyaWFibGUuaCIKLSNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi9sb2NrLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvcGxhdGZvcm1fdGhyZWFkLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNyeXB0b3IuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlbXV4ZXJfc3RyZWFtLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9waXBlbGluZV9zdGF0dXMuaCIKLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaGVsbF92aWRlb19mcmFtZV9wcm92aWRlci5oIgotI2VuZGlmICAvLyBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0jaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb19kZWNvZGVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb19mcmFtZS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fcmVuZGVyZXIuaCIKLQotbmFtZXNwYWNlIGJhc2UgewotY2xhc3MgTWVzc2FnZUxvb3BQcm94eTsKLX0KLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW07Ci1jbGFzcyBWaWRlb0RlY29kZXJTZWxlY3RvcjsKLQotLy8gVmlkZW9SZW5kZXJlckJhc2UgY3JlYXRlcyBpdHMgb3duIHRocmVhZCBmb3IgdGhlIHNvbGUgcHVycG9zZSBvZiB0aW1pbmcgZnJhbWUKLS8vIHByZXNlbnRhdGlvbi4gIEl0IGhhbmRsZXMgcmVhZGluZyBmcm9tIHRoZSBkZWNvZGVyIGFuZCBzdG9yZXMgdGhlIHJlc3VsdHMgaW4KLS8vIGEgcXVldWUgb2YgZGVjb2RlZCBmcmFtZXMgYW5kIGV4ZWN1dGluZyBhIGNhbGxiYWNrIHdoZW4gYSBmcmFtZSBpcyByZWFkeSBmb3IKLS8vIHJlbmRlcmluZy4KLWNsYXNzIE1FRElBX0VYUE9SVCBWaWRlb1JlbmRlcmVyQmFzZQotICAgIDogcHVibGljIFZpZGVvUmVuZGVyZXIsCi0gICAgICBwdWJsaWMgYmFzZTo6UGxhdGZvcm1UaHJlYWQ6OkRlbGVnYXRlIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZChib29sKT4gU2V0T3BhcXVlQ0I7Ci0KLSAgLy8gTWF4aW11bSBkdXJhdGlvbiBvZiB0aGUgbGFzdCBmcmFtZS4KLSAgc3RhdGljIGJhc2U6OlRpbWVEZWx0YSBrTWF4TGFzdEZyYW1lRHVyYXRpb24oKTsKLQotICAvLyB8cGFpbnRfY2J8IGlzIGV4ZWN1dGVkIG9uIHRoZSB2aWRlbyBmcmFtZSB0aW1pbmcgdGhyZWFkIHdoZW5ldmVyIGEgbmV3Ci0gIC8vIGZyYW1lIGlzIGF2YWlsYWJsZSBmb3IgcGFpbnRpbmcgdmlhIEdldEN1cnJlbnRGcmFtZSgpLgotICAvLwotICAvLyB8c2V0X29wYXF1ZV9jYnwgaXMgZXhlY3V0ZWQgd2hlbiB0aGUgcmVuZGVyZXIgaXMgaW5pdGlhbGl6ZWQgdG8gaW5mb3JtCi0gIC8vIHRoZSBwbGF5ZXIgd2hldGhlciB0aGUgZGVjb2RlcidzIG91dHB1dCB3aWxsIGJlIG9wYXF1ZSBvciBub3QuCi0gIC8vCi0gIC8vIEltcGxlbWVudG9ycyBzaG91bGQgYXZvaWQgZG9pbmcgYW55IHNvcnQgb2YgaGVhdnkgd29yayBpbiB0aGlzIG1ldGhvZCBhbmQKLSAgLy8gaW5zdGVhZCBwb3N0IGEgdGFzayB0byBhIGNvbW1vbi93b3JrZXIgdGhyZWFkIHRvIGhhbmRsZSByZW5kZXJpbmcuICBTbG93aW5nCi0gIC8vIGRvd24gdGhlIHZpZGVvIHRocmVhZCBtYXkgcmVzdWx0IGluIGxvc2luZyBzeW5jaHJvbml6YXRpb24gd2l0aCBhdWRpby4KLSAgLy8KLSAgLy8gU2V0dGluZyB8ZHJvcF9mcmFtZXNffCB0byB0cnVlIGNhdXNlcyB0aGUgcmVuZGVyZXIgdG8gZHJvcCBleHBpcmVkIGZyYW1lcy4KLSAgLy8KLSAgLy8gVE9ETyhzY2hlcmt1cyk6IHBhc3MgdGhlIFZpZGVvRnJhbWUqIHRvIHRoaXMgY2FsbGJhY2sgYW5kIHJlbW92ZQotICAvLyBHZXQvUHV0Q3VycmVudEZyYW1lKCkgaHR0cDovL2NyYnVnLmNvbS8xMDg0MzUKLSAgVmlkZW9SZW5kZXJlckJhc2UoY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbWVzc2FnZV9sb29wLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBTZXREZWNyeXB0b3JSZWFkeUNCJiBzZXRfZGVjcnlwdG9yX3JlYWR5X2NiLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiBwYWludF9jYiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgU2V0T3BhcXVlQ0ImIHNldF9vcGFxdWVfY2IsCi0gICAgICAgICAgICAgICAgICAgIGJvb2wgZHJvcF9mcmFtZXMpOwotCi0gIC8vIFZpZGVvUmVuZGVyZXIgaW1wbGVtZW50YXRpb24uCi0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4mIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmlkZW9EZWNvZGVyTGlzdCYgZGVjb2RlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGluaXRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXRpc3RpY3NDQiYgc3RhdGlzdGljc19jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGltZUNCJiBtYXhfdGltZV9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmF0dXJhbFNpemVDaGFuZ2VkQ0ImIHNpemVfY2hhbmdlZF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6Q2xvc3VyZSYgZW5kZWRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGVycm9yX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaW1lRGVsdGFDQiYgZ2V0X3RpbWVfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRpbWVEZWx0YUNCJiBnZXRfZHVyYXRpb25fY2IpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgUGxheShjb25zdCBiYXNlOjpDbG9zdXJlJiBjYWxsYmFjaykgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBQYXVzZShjb25zdCBiYXNlOjpDbG9zdXJlJiBjYWxsYmFjaykgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBGbHVzaChjb25zdCBiYXNlOjpDbG9zdXJlJiBjYWxsYmFjaykgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBQcmVyb2xsKGJhc2U6OlRpbWVEZWx0YSB0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBjYikgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTdG9wKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFNldFBsYXliYWNrUmF0ZShmbG9hdCBwbGF5YmFja19yYXRlKSBPVkVSUklERTsKLQotICAvLyBQbGF0Zm9ybVRocmVhZDo6RGVsZWdhdGUgaW1wbGVtZW50YXRpb24uCi0gIHZpcnR1YWwgdm9pZCBUaHJlYWRNYWluKCkgT1ZFUlJJREU7Ci0KLSAgLy8gQ2xpZW50cyBvZiB0aGlzIGNsYXNzIChwYWludGVyL2NvbXBvc2l0b3IpIHNob3VsZCB1c2UgR2V0Q3VycmVudEZyYW1lKCkKLSAgLy8gb2J0YWluIG93bmVyc2hpcCBvZiBWaWRlb0ZyYW1lLCBpdCBzaG91bGQgYWx3YXlzIHJlbGlucXVpc2ggdGhlIG93bmVyc2hpcAotICAvLyBieSB1c2UgUHV0Q3VycmVudEZyYW1lKCkuIEN1cnJlbnQgZnJhbWUgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgbm9uLU5VTEwuCi0gIC8vIEl0IGV4cGVjdHMgY2xpZW50cyB0byB1c2UgY29sb3ItZmlsbCB0aGUgYmFja2dyb3VuZCBpZiBjdXJyZW50IGZyYW1lCi0gIC8vIGlzIE5VTEwuIFRoaXMgY291bGQgaGFwcGVuIGJlZm9yZSBwaXBlbGluZSBpcyBwcmUtcm9sbGVkIG9yIGR1cmluZwotICAvLyBwYXVzZS9mbHVzaC9wcmVyb2xsLgotICB2b2lkIEdldEN1cnJlbnRGcmFtZShzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+KiBmcmFtZV9vdXQpOwotICB2b2lkIFB1dEN1cnJlbnRGcmFtZShzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IGZyYW1lKTsKLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB+VmlkZW9SZW5kZXJlckJhc2UoKTsKLQotIHByaXZhdGU6Ci0gIC8vIENhbGxlZCB3aGVuIHxkZWNvZGVyX3NlbGVjdG9yX3wgc2VsZWN0ZWQgdGhlIHxzZWxlY3RlZF9kZWNvZGVyfC4KLSAgLy8gfGRlY3J5cHRpbmdfZGVtdXhlcl9zdHJlYW18IHdhcyBhbHNvIHBvcHVsYXRlZCBpZiBhIERlY3J5cHRpbmdEZW11eGVyU3RyZWFtCi0gIC8vIGNyZWF0ZWQgdG8gaGVscCBkZWNyeXB0IHRoZSBlbmNyeXB0ZWQgc3RyZWFtLgotICAvLyBOb3RlOiB8ZGVjb2Rlcl9zZWxlY3RvcnwgaXMgcGFzc2VkIGhlcmUgdG8ga2VlcCB0aGUgVmlkZW9EZWNvZGVyU2VsZWN0b3IKLSAgLy8gYWxpdmUgdW50aWwgT25EZWNvZGVyU2VsZWN0ZWQoKSBmaW5pc2hlcy4KLSAgdm9pZCBPbkRlY29kZXJTZWxlY3RlZCgKLSAgICAgIHNjb3BlZF9wdHI8VmlkZW9EZWNvZGVyU2VsZWN0b3I+IGRlY29kZXJfc2VsZWN0b3IsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPFZpZGVvRGVjb2Rlcj4mIHNlbGVjdGVkX2RlY29kZXIsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY3J5cHRpbmdEZW11eGVyU3RyZWFtPiYgZGVjcnlwdGluZ19kZW11eGVyX3N0cmVhbSk7Ci0KLSAgLy8gQ2FsbGJhY2sgZnJvbSB0aGUgdmlkZW8gZGVjb2RlciBkZWxpdmVyaW5nIGRlY29kZWQgdmlkZW8gZnJhbWVzIGFuZAotICAvLyByZXBvcnRpbmcgdmlkZW8gZGVjb2RlciBzdGF0dXMuCi0gIHZvaWQgRnJhbWVSZWFkeShWaWRlb0RlY29kZXI6OlN0YXR1cyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+JiBpbmNvbWluZ19mcmFtZSk7Ci0KLSAgLy8gSGVscGVyIG1ldGhvZCBmb3IgYWRkaW5nIGEgZnJhbWUgdG8gfHJlYWR5X2ZyYW1lc198Ci0gIHZvaWQgQWRkUmVhZHlGcmFtZShjb25zdCBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+JiBmcmFtZSk7Ci0KLSAgLy8gSGVscGVyIG1ldGhvZCB0aGF0IHNjaGVkdWxlcyBhbiBhc3luY2hyb25vdXMgcmVhZCBmcm9tIHRoZSBkZWNvZGVyIGFzIGxvbmcKLSAgLy8gYXMgdGhlcmUgaXNuJ3QgYSBwZW5kaW5nIHJlYWQgYW5kIHdlIGhhdmUgY2FwYWNpdHkuCi0gIHZvaWQgQXR0ZW1wdFJlYWQoKTsKLSAgdm9pZCBBdHRlbXB0UmVhZF9Mb2NrZWQoKTsKLQotICB2b2lkIFVwZGF0ZVVuZGVyZmxvd1N0YXR1c1RvRGVjb2Rlcl9Mb2NrZWQoKTsKLQotICAvLyBDYWxsZWQgd2hlbiBWaWRlb0RlY29kZXI6OlJlc2V0KCkgY29tcGxldGVzLgotICB2b2lkIE9uRGVjb2RlclJlc2V0RG9uZSgpOwotCi0gIC8vIEF0dGVtcHRzIHRvIGNvbXBsZXRlIGZsdXNoaW5nIGFuZCB0cmFuc2l0aW9uIGludG8gdGhlIGZsdXNoZWQgc3RhdGUuCi0gIHZvaWQgQXR0ZW1wdEZsdXNoX0xvY2tlZCgpOwotCi0gIC8vIENhbGN1bGF0ZXMgdGhlIGR1cmF0aW9uIHRvIHNsZWVwIGZvciBiYXNlZCBvbiB8Y3VycmVudF9mcmFtZV98J3MgdGltZXN0YW1wLAotICAvLyB0aGUgbmV4dCBmcmFtZSB0aW1lc3RhbXAgKG1heSBiZSBOVUxMKSwgYW5kIHRoZSBwcm92aWRlZCBwbGF5YmFjayByYXRlLgotICAvLwotICAvLyBXZSBkb24ndCB1c2UgfHBsYXliYWNrX3JhdGVffCB0byBhdm9pZCBsb2NraW5nLgotICBiYXNlOjpUaW1lRGVsdGEgQ2FsY3VsYXRlU2xlZXBEdXJhdGlvbigKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4mIG5leHRfZnJhbWUsCi0gICAgICBmbG9hdCBwbGF5YmFja19yYXRlKTsKLQotICAvLyBIZWxwZXIgZnVuY3Rpb24gdGhhdCBmbHVzaGVzIHRoZSBidWZmZXJzIHdoZW4gYSBTdG9wKCkgb3IgZXJyb3Igb2NjdXJzLgotICB2b2lkIERvU3RvcE9yRXJyb3JfTG9ja2VkKCk7Ci0KLSAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgZnJhbWVzIGN1cnJlbnRseSBoZWxkIGJ5IHRoaXMgY2xhc3MuCi0gIGludCBOdW1GcmFtZXNfTG9ja2VkKCkgY29uc3Q7Ci0KLSAgLy8gVXBkYXRlcyB8Y3VycmVudF9mcmFtZV98IHRvIHRoZSBuZXh0IGZyYW1lIG9uIHxyZWFkeV9mcmFtZXNffCBhbmQgY2FsbHMKLSAgLy8gfHNpemVfY2hhbmdlZF9jYl98IGlmIHRoZSBuYXR1cmFsIHNpemUgY2hhbmdlcy4KLSAgdm9pZCBTZXRDdXJyZW50RnJhbWVUb05leHRSZWFkeUZyYW1lKCk7Ci0KLSAgdm9pZCBSZXNldERlY29kZXIoKTsKLSAgdm9pZCBTdG9wRGVjb2Rlcihjb25zdCBiYXNlOjpDbG9zdXJlJiBjYWxsYmFjayk7Ci0KLSAgLy8gUG9wcyB0aGUgZnJvbnQgb2YgfGRlY29kZXJzfCwgYXNzaWducyBpdCB0byB8ZGVjb2Rlcl98IGFuZCB0aGVuCi0gIC8vIGNhbGxzIGluaXRpYWxpemUgb24gdGhlIG5ldyBkZWNvZGVyLgotICB2b2lkIEluaXRpYWxpemVOZXh0RGVjb2Rlcihjb25zdCBzY29wZWRfcmVmcHRyPERlbXV4ZXJTdHJlYW0+JiBkZW11eGVyX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3B0cjxWaWRlb0RlY29kZXJMaXN0PiBkZWNvZGVycyk7Ci0KLSAgLy8gQ2FsbGVkIHdoZW4gfGRlY29kZXJffCBpbml0aWFsaXphdGlvbiBjb21wbGV0ZXMuCi0gIC8vIHxkZW11eGVyX3N0cmVhbXwgJiB8ZGVjb2RlcnN8IGFyZSB1c2VkIGlmIGluaXRpYWxpemF0aW9uIGZhaWxlZCBhbmQKLSAgLy8gSW5pdGlhbGl6ZU5leHREZWNvZGVyKCkgbmVlZHMgdG8gYmUgY2FsbGVkIGFnYWluLgotICB2b2lkIE9uRGVjb2RlckluaXREb25lKGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVtdXhlclN0cmVhbT4mIGRlbXV4ZXJfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9wdHI8VmlkZW9EZWNvZGVyTGlzdD4gZGVjb2RlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUGlwZWxpbmVTdGF0dXMgc3RhdHVzKTsKLQotICBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+IG1lc3NhZ2VfbG9vcF87Ci0KLSAgLy8gVXNlZCBmb3IgYWNjZXNzaW5nIGRhdGEgbWVtYmVycy4KLSAgYmFzZTo6TG9jayBsb2NrXzsKLQotICBTZXREZWNyeXB0b3JSZWFkeUNCIHNldF9kZWNyeXB0b3JfcmVhZHlfY2JfOwotCi0gIC8vIFRoZXNlIHR3byB3aWxsIGJlIHNldCBieSBWaWRlb0RlY29kZXJTZWxlY3Rvcjo6U2VsZWN0VmlkZW9EZWNvZGVyKCkuCi0gIHNjb3BlZF9yZWZwdHI8VmlkZW9EZWNvZGVyPiBkZWNvZGVyXzsKLSAgc2NvcGVkX3JlZnB0cjxEZWNyeXB0aW5nRGVtdXhlclN0cmVhbT4gZGVjcnlwdGluZ19kZW11eGVyX3N0cmVhbV87Ci0KLSAgLy8gUXVldWUgb2YgaW5jb21pbmcgZnJhbWVzIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQgZnJhbWUgc2luY2UgdGhlIGxhc3QgdGltZQotICAvLyBPbkZyYW1lQXZhaWxhYmxlKCkgd2FzIGNhbGxlZC4KLSAgdHlwZWRlZiBzdGQ6OmRlcXVlPHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gPiBWaWRlb0ZyYW1lUXVldWU7Ci0gIFZpZGVvRnJhbWVRdWV1ZSByZWFkeV9mcmFtZXNfOwotCi0gIC8vIFRoZSBjdXJyZW50IGZyYW1lIGF2YWlsYWJsZSB0byBzdWJjbGFzc2VzIGZvciByZW5kZXJpbmcgdmlhCi0gIC8vIEdldEN1cnJlbnRGcmFtZSgpLiAgfGN1cnJlbnRfZnJhbWVffCBjYW4gb25seSBiZSBhbHRlcmVkIHdoZW4KLSAgLy8gfHBlbmRpbmdfcGFpbnRffCBpcyBmYWxzZS4KLSAgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiBjdXJyZW50X2ZyYW1lXzsKLQotICAvLyBUaGUgcHJldmlvdXMgfGN1cnJlbnRfZnJhbWVffCBhbmQgaXMgcmV0dXJuZWQgdmlhIEdldEN1cnJlbnRGcmFtZSgpIGluIHRoZQotICAvLyBzaXR1YXRpb24gd2hlcmUgYWxsIGZyYW1lcyB3ZXJlIGRlYWxsb2NhdGVkIChpLmUuLCBkdXJpbmcgYSBmbHVzaCkuCi0gIC8vCi0gIC8vIFRPRE8oc2NoZXJrdXMpOiByZW1vdmUgdGhpcyBhZnRlciBnZXR0aW5nIHJpZCBvZiBHZXQvUHV0Q3VycmVudEZyYW1lKCkgaW4KLSAgLy8gZmF2b3VyIG9mIHBhc3Npbmcgb3duZXJzaGlwIG9mIHRoZSBjdXJyZW50IGZyYW1lIHRvIHRoZSByZW5kZXJlciB2aWEKLSAgLy8gY2FsbGJhY2suCi0gIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gbGFzdF9hdmFpbGFibGVfZnJhbWVfOwotCi0gIC8vIFVzZWQgdG8gc2lnbmFsIHx0aHJlYWRffCBhcyBmcmFtZXMgYXJlIGFkZGVkIHRvIHxmcmFtZXNffC4gIFJ1bGUgb2YgdGh1bWI6Ci0gIC8vIGFsd2F5cyBjaGVjayB8c3RhdGVffCB0byBzZWUgaWYgaXQgd2FzIHNldCB0byBTVE9QUEVEIGFmdGVyIHdha2luZyB1cCEKLSAgYmFzZTo6Q29uZGl0aW9uVmFyaWFibGUgZnJhbWVfYXZhaWxhYmxlXzsKLQotICAvLyBTdGF0ZSB0cmFuc2l0aW9uIERpYWdyYW0gb2YgdGhpcyBjbGFzczoKLSAgLy8gICAgICAgW2tVbmluaXRpYWxpemVkXSAtLS0tLS0tPiBba0Vycm9yXQotICAvLyAgICAgICAgICAgICAgfAotICAvLyAgICAgICAgICAgICAgfCBJbml0aWFsaXplKCkKLSAgLy8gICAgICAgIFtrSW5pdGlhbGl6aW5nXQotICAvLyAgICAgICAgICAgICAgfAotICAvLyAgICAgICAgICAgICAgViAgICAgICAgQWxsIGZyYW1lcyByZXR1cm5lZAotICAvLyAgICstLS0tLS1ba0ZsdXNoZWRdPC0tLS0tW2tGbHVzaGluZ108LS0tIE9uRGVjb2RlclJlc2V0RG9uZSgpCi0gIC8vICAgfCAgICAgICAgICB8IFByZXJvbGwoKSBvciB1cG9uICAgICAgICAgICAgICAgICAgXgotICAvLyAgIHwgICAgICAgICAgViBnb3QgZmlyc3QgZnJhbWUgICAgICAgICAgIFtrRmx1c2hpbmdEZWNvZGVyXQotICAvLyAgIHwgICAgICBba1ByZXJvbGxpbmddICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KLSAgLy8gICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEZsdXNoKCkKLSAgLy8gICB8ICAgICAgICAgIFYgR290IGVub3VnaCBmcmFtZXMgICAgICAgICAgICAgICB8Ci0gIC8vICAgfCAgICAgIFtrUHJlcm9sbGVkXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+W2tQYXVzZWRdCi0gIC8vICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAgIFBhdXNlKCkgICAgICAgICAgXgotICAvLyAgIHwgICAgICAgICAgViBQbGF5KCkgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgLy8gICB8ICAgICAgIFtrUGxheWluZ10tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Ci0gIC8vICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAgIFBhdXNlKCkgICAgICAgICAgXgotICAvLyAgIHwgICAgICAgICAgViBSZWNlaXZlIEVPRiBmcmFtZS4gICAgICAgICAgICAgIHwgUGF1c2UoKQotICAvLyAgIHwgICAgICAgW2tFbmRlZF0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgLy8gICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCi0gIC8vICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAvLyAgICstLS0tLT4gW2tTdG9wcGVkXSAgICAgICAgICAgICAgICAgICBbQW55IHN0YXRlIG90aGVyIHRoYW5dCi0gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtrVW5pbml0aWFsaXplZC9rRXJyb3JdCi0KLSAgLy8gU2ltcGxlIHN0YXRlIHRyYWNraW5nIHZhcmlhYmxlLgotICBlbnVtIFN0YXRlIHsKLSAgICBrVW5pbml0aWFsaXplZCwKLSAgICBrSW5pdGlhbGl6aW5nLAotICAgIGtQcmVyb2xsZWQsCi0gICAga1BhdXNlZCwKLSAgICBrRmx1c2hpbmdEZWNvZGVyLAotICAgIGtGbHVzaGluZywKLSAgICBrRmx1c2hlZCwKLSAgICBrUHJlcm9sbGluZywKLSAgICBrUGxheWluZywKLSAgICBrRW5kZWQsCi0gICAga1N0b3BwZWQsCi0gICAga0Vycm9yLAotICB9OwotICBTdGF0ZSBzdGF0ZV87Ci0KLSAgLy8gVmlkZW8gdGhyZWFkIGhhbmRsZS4KLSAgYmFzZTo6UGxhdGZvcm1UaHJlYWRIYW5kbGUgdGhyZWFkXzsKLQotICAvLyBLZWVwIHRyYWNrIG9mIHZhcmlvdXMgcGVuZGluZyBvcGVyYXRpb25zOgotICAvLyAgIC0gfHBlbmRpbmdfcmVhZF98IGlzIHRydWUgd2hlbiB0aGVyZSdzIGFuIGFjdGl2ZSB2aWRlbyBkZWNvZGluZyByZXF1ZXN0LgotICAvLyAgIC0gfHBlbmRpbmdfcGFpbnRffCBpcyB0cnVlIHdoZW4gfGN1cnJlbnRfZnJhbWVffCBpcyBjdXJyZW50bHkgYmVpbmcKLSAgLy8gICAgIGFjY2Vzc2VkIGJ5IHRoZSBzdWJjbGFzcy4KLSAgLy8gICAtIHxwZW5kaW5nX3BhaW50X3dpdGhfbGFzdF9hdmFpbGFibGVffCBpcyB0cnVlIHdoZW4KLSAgLy8gICAgIHxsYXN0X2F2YWlsYWJsZV9mcmFtZV98IGlzIGN1cnJlbnRseSBiZWluZyBhY2Nlc3NlZCBieSB0aGUgc3ViY2xhc3MuCi0gIC8vCi0gIC8vIEZsdXNoaW5nIGNhbm5vdCBjb21wbGV0ZSB1bnRpbCBib3RoIHxwZW5kaW5nX3JlYWRffCBhbmQgfHBlbmRpbmdfcGFpbnRffAotICAvLyBhcmUgZmFsc2UuCi0gIGJvb2wgcGVuZGluZ19yZWFkXzsKLSAgYm9vbCBwZW5kaW5nX3BhaW50XzsKLSAgYm9vbCBwZW5kaW5nX3BhaW50X3dpdGhfbGFzdF9hdmFpbGFibGVfOwotCi0gIGJvb2wgZHJvcF9mcmFtZXNfOwotCi0gIGZsb2F0IHBsYXliYWNrX3JhdGVfOwotCi0gIC8vIFBsYXliYWNrIG9wZXJhdGlvbiBjYWxsYmFja3MuCi0gIGJhc2U6OkNsb3N1cmUgZmx1c2hfY2JfOwotICBQaXBlbGluZVN0YXR1c0NCIHByZXJvbGxfY2JfOwotCi0gIC8vIEV2ZW50IGNhbGxiYWNrcy4KLSAgUGlwZWxpbmVTdGF0dXNDQiBpbml0X2NiXzsKLSAgU3RhdGlzdGljc0NCIHN0YXRpc3RpY3NfY2JfOwotICBUaW1lQ0IgbWF4X3RpbWVfY2JfOwotICBOYXR1cmFsU2l6ZUNoYW5nZWRDQiBzaXplX2NoYW5nZWRfY2JfOwotICBiYXNlOjpDbG9zdXJlIGVuZGVkX2NiXzsKLSAgUGlwZWxpbmVTdGF0dXNDQiBlcnJvcl9jYl87Ci0gIFRpbWVEZWx0YUNCIGdldF90aW1lX2NiXzsKLSAgVGltZURlbHRhQ0IgZ2V0X2R1cmF0aW9uX2NiXzsKLQotICBiYXNlOjpUaW1lRGVsdGEgcHJlcm9sbF90aW1lc3RhbXBfOwotCi0gIC8vIERlbGF5ZWQgZnJhbWUgdXNlZCBkdXJpbmcga1ByZXJvbGxpbmcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKLSAgLy8gfHByZXJvbGxfdGltZXN0YW1wX3wgaXMgYmV0d2VlbiB0aGlzIGZyYW1lIGFuZCB0aGUgbmV4dCBvbmUuCi0gIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gcHJlcm9sbGluZ19kZWxheWVkX2ZyYW1lXzsKLQotICAvLyBFbWJlZGRlciBjYWxsYmFjayBmb3Igbm90aWZ5aW5nIGEgbmV3IGZyYW1lIGlzIGF2YWlsYWJsZSBmb3IgcGFpbnRpbmcuCi0gIGJhc2U6OkNsb3N1cmUgcGFpbnRfY2JfOwotCi0gIC8vIENhbGxiYWNrIHRvIGV4ZWN1dGUgdG8gaW5mb3JtIHRoZSBwbGF5ZXIgaWYgdGhlIHZpZGVvIGRlY29kZXIncyBvdXRwdXQgaXMKLSAgLy8gb3BhcXVlLgotICBTZXRPcGFxdWVDQiBzZXRfb3BhcXVlX2NiXzsKLQotICAvLyBUaGUgbGFzdCBuYXR1cmFsIHNpemUgfHNpemVfY2hhbmdlZF9jYl98IHdhcyBjYWxsZWQgd2l0aC4KLSAgZ2Z4OjpTaXplIGxhc3RfbmF0dXJhbF9zaXplXzsKLQotICAvLyBUT0RPOiBJbnZlc3RpZ2F0ZSBpZiB3ZSBjb3VsZCBtb3ZlIHVuZGVyZmxvdyBsb2dpYyBpbnRvCi0gIC8vIFNoZWxsVmlkZW9GcmFtZVByb3ZpZGVyLgotICBpbnQgbWF4aW11bV9mcmFtZXNfY2FjaGVkXzsKLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0gIFNoZWxsVmlkZW9GcmFtZVByb3ZpZGVyKiBmcmFtZV9wcm92aWRlcl87Ci0KLSNpZiAhZGVmaW5lZChfX0xCX1NIRUxMX19GT1JfUkVMRUFTRV9fKQotICBzdGF0aWMgaW50IHZpZGVvc19wbGF5ZWRfOwotICBpbnQgbGF0ZV9mcmFtZXNfOwotI2VuZGlmICAvLyAhZGVmaW5lZChfX0xCX1NIRUxMX19GT1JfUkVMRUFTRV9fKQotI2VuZGlmICAvLyBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFZpZGVvUmVuZGVyZXJCYXNlKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX0ZJTFRFUlNfVklERU9fUkVOREVSRVJfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvdmlkZW9fcmVuZGVyZXJfYmFzZV91bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9maWx0ZXJzL3ZpZGVvX3JlbmRlcmVyX2Jhc2VfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNTJhMmUuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvdmlkZW9fcmVuZGVyZXJfYmFzZV91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDY2MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2tfaGVscGVycy5oIgotI2luY2x1ZGUgImJhc2UvZGVidWcvc3RhY2tfdHJhY2UuaCIKLSNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgotI2luY2x1ZGUgImJhc2Uvc3RsX3V0aWwuaCIKLSNpbmNsdWRlICJiYXNlL3N0cmluZ3ByaW50Zi5oIgotI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKLSNpbmNsdWRlICJiYXNlL3RpbWVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kYXRhX2J1ZmZlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZ21vY2tfY2FsbGJhY2tfc3VwcG9ydC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbGltaXRzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tb2NrX2ZpbHRlcnMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3Rlc3RfaGVscGVycy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fZnJhbWUuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL3ZpZGVvX3JlbmRlcmVyX2Jhc2UuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgOjp0ZXN0aW5nOjpfOwotdXNpbmcgOjp0ZXN0aW5nOjpBbnlOdW1iZXI7Ci11c2luZyA6OnRlc3Rpbmc6OkluU2VxdWVuY2U7Ci11c2luZyA6OnRlc3Rpbmc6Okludm9rZTsKLXVzaW5nIDo6dGVzdGluZzo6Tm90TnVsbDsKLXVzaW5nIDo6dGVzdGluZzo6UmV0dXJuOwotdXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm5SZWY7Ci11c2luZyA6OnRlc3Rpbmc6OlN0cmljdE1vY2s7Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLXN0YXRpYyBjb25zdCBpbnQga0ZyYW1lRHVyYXRpb25Jbk1zID0gMTA7Ci1zdGF0aWMgY29uc3QgaW50IGtWaWRlb0R1cmF0aW9uSW5NcyA9IGtGcmFtZUR1cmF0aW9uSW5NcyAqIDEwMDsKLXN0YXRpYyBjb25zdCBWaWRlb0ZyYW1lOjpGb3JtYXQga1ZpZGVvRm9ybWF0ID0gVmlkZW9GcmFtZTo6WVYxMjsKLXN0YXRpYyBjb25zdCBnZng6OlNpemUga0NvZGVkU2l6ZSgxNnUsIDE2dSk7Ci1zdGF0aWMgY29uc3QgZ2Z4OjpSZWN0IGtWaXNpYmxlUmVjdCgxNnUsIDE2dSk7Ci1zdGF0aWMgY29uc3QgZ2Z4OjpTaXplIGtOYXR1cmFsU2l6ZSgxNnUsIDE2dSk7Ci0KLWNsYXNzIFZpZGVvUmVuZGVyZXJCYXNlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgVmlkZW9SZW5kZXJlckJhc2VUZXN0KCkKLSAgICAgIDogZGVjb2Rlcl8obmV3IE1vY2tWaWRlb0RlY29kZXIoKSksCi0gICAgICAgIGRlbXV4ZXJfc3RyZWFtXyhuZXcgTW9ja0RlbXV4ZXJTdHJlYW0oKSksCi0gICAgICAgIHZpZGVvX2NvbmZpZ18oa0NvZGVjVlA4LCBWSURFT19DT0RFQ19QUk9GSUxFX1VOS05PV04sIGtWaWRlb0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICBrQ29kZWRTaXplLCBrVmlzaWJsZVJlY3QsIGtOYXR1cmFsU2l6ZSwgTlVMTCwgMCwgZmFsc2UpIHsKLSAgICByZW5kZXJlcl8gPSBuZXcgVmlkZW9SZW5kZXJlckJhc2UoCi0gICAgICAgIG1lc3NhZ2VfbG9vcF8ubWVzc2FnZV9sb29wX3Byb3h5KCksCi0gICAgICAgIG1lZGlhOjpTZXREZWNyeXB0b3JSZWFkeUNCKCksCi0gICAgICAgIGJhc2U6OkJpbmQoJlZpZGVvUmVuZGVyZXJCYXNlVGVzdDo6T25QYWludCwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICAgIGJhc2U6OkJpbmQoJlZpZGVvUmVuZGVyZXJCYXNlVGVzdDo6T25TZXRPcGFxdWUsIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAotICAgICAgICB0cnVlKTsKLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0gICAgRVhQRUNUX0NBTEwoKmRlbXV4ZXJfc3RyZWFtXywgU3RyZWFtV2FzRW5jcnlwdGVkKCkpCi0gICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oZmFsc2UpKTsKLSNlbmRpZgotCi0gICAgRVhQRUNUX0NBTEwoKmRlbXV4ZXJfc3RyZWFtXywgdHlwZSgpKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKERlbXV4ZXJTdHJlYW06OlZJREVPKSk7Ci0gICAgRVhQRUNUX0NBTEwoKmRlbXV4ZXJfc3RyZWFtXywgdmlkZW9fZGVjb2Rlcl9jb25maWcoKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVyblJlZih2aWRlb19jb25maWdfKSk7Ci0KLSAgICAvLyBXZSBleHBlY3QgdGhlc2UgdG8gYmUgY2FsbGVkIGJ1dCB3ZSBkb24ndCBjYXJlIGhvdy93aGVuLgotICAgIEVYUEVDVF9DQUxMKCpkZWNvZGVyXywgU3RvcChfKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJ1bkNsb3N1cmU8MD4oKSk7Ci0gICAgRVhQRUNUX0NBTEwoc3RhdGlzdGljc19jYl9vYmplY3RfLCBPblN0YXRpc3RpY3MoXykpCi0gICAgICAgIC5UaW1lcyhBbnlOdW1iZXIoKSk7Ci0gICAgRVhQRUNUX0NBTEwoKnRoaXMsIE9uVGltZVVwZGF0ZShfKSkKLSAgICAgICAgLlRpbWVzKEFueU51bWJlcigpKTsKLSAgICBFWFBFQ1RfQ0FMTCgqdGhpcywgT25QYWludCgpKQotICAgICAgICAuVGltZXMoQW55TnVtYmVyKCkpOwotICAgIEVYUEVDVF9DQUxMKCp0aGlzLCBPblNldE9wYXF1ZShfKSkKLSAgICAgICAgLlRpbWVzKEFueU51bWJlcigpKTsKLSAgfQotCi0gIHZpcnR1YWwgflZpZGVvUmVuZGVyZXJCYXNlVGVzdCgpIHt9Ci0KLSAgLy8gQ2FsbGJhY2tzIHBhc3NlZCBpbnRvIFZpZGVvUmVuZGVyZXJCYXNlKCkuCi0gIE1PQ0tfQ09OU1RfTUVUSE9EMChPblBhaW50LCB2b2lkKCkpOwotICBNT0NLX0NPTlNUX01FVEhPRDEoT25TZXRPcGFxdWUsIHZvaWQoYm9vbCkpOwotCi0gIC8vIENhbGxiYWNrcyBwYXNzZWQgaW50byBJbml0aWFsaXplKCkuCi0gIE1PQ0tfTUVUSE9EMShPblRpbWVVcGRhdGUsIHZvaWQoYmFzZTo6VGltZURlbHRhKSk7Ci0gIE1PQ0tfTUVUSE9EMShPbk5hdHVyYWxTaXplQ2hhbmdlZCwgdm9pZChjb25zdCBnZng6OlNpemUmKSk7Ci0KLSAgdm9pZCBJbml0aWFsaXplKCkgewotICAgIEluaXRpYWxpemVXaXRoRHVyYXRpb24oa1ZpZGVvRHVyYXRpb25Jbk1zKTsKLSAgfQotCi0gIHZvaWQgSW5pdGlhbGl6ZVdpdGhEdXJhdGlvbihpbnQgZHVyYXRpb25fbXMpIHsKLSAgICBkdXJhdGlvbl8gPSBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoZHVyYXRpb25fbXMpOwotCi0gICAgLy8gTW9uaXRvciByZWFkcyBmcm9tIHRoZSBkZWNvZGVyLgotICAgIEVYUEVDVF9DQUxMKCpkZWNvZGVyXywgUmVhZChfKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KEludm9rZSh0aGlzLCAmVmlkZW9SZW5kZXJlckJhc2VUZXN0OjpGcmFtZVJlcXVlc3RlZCkpOwotCi0gICAgRVhQRUNUX0NBTEwoKmRlY29kZXJfLCBSZXNldChfKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KEludm9rZSh0aGlzLCAmVmlkZW9SZW5kZXJlckJhc2VUZXN0OjpGbHVzaFJlcXVlc3RlZCkpOwotCi0gICAgSW5TZXF1ZW5jZSBzOwotCi0gICAgRVhQRUNUX0NBTEwoKmRlY29kZXJfLCBJbml0aWFsaXplKF8sIF8sIF8pKQotICAgICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MT4oUElQRUxJTkVfT0spKTsKLQotICAgIC8vIFNldCBwbGF5YmFjayByYXRlIGJlZm9yZSBhbnl0aGluZyBlbHNlIGhhcHBlbnMuCi0gICAgcmVuZGVyZXJfLT5TZXRQbGF5YmFja1JhdGUoMS4wZik7Ci0KLSAgICAvLyBJbml0aWFsaXplLCB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkgcmVhZHMuCi0gICAgSW5pdGlhbGl6ZVJlbmRlcmVyKFBJUEVMSU5FX09LKTsKLQotICAgIC8vIFdlIGV4cGVjdCB0aGUgdmlkZW8gc2l6ZSB0byBiZSBzZXQuCi0gICAgRVhQRUNUX0NBTEwoKnRoaXMsIE9uTmF0dXJhbFNpemVDaGFuZ2VkKGtOYXR1cmFsU2l6ZSkpOwotCi0gICAgLy8gU3RhcnQgcHJlcm9sbGluZy4KLSAgICBRdWV1ZVByZXJvbGxGcmFtZXMoMCk7Ci0gICAgUHJlcm9sbCgwLCBQSVBFTElORV9PSyk7Ci0gIH0KLQotICB2b2lkIEluaXRpYWxpemVSZW5kZXJlcihQaXBlbGluZVN0YXR1cyBleHBlY3RlZCkgewotICAgIFNDT1BFRF9UUkFDRShiYXNlOjpTdHJpbmdQcmludGYoIkluaXRpYWxpemVSZW5kZXJlciglZCkiLCBleHBlY3RlZCkpOwotICAgIFdhaXRhYmxlTWVzc2FnZUxvb3BFdmVudCBldmVudDsKLSAgICBDYWxsSW5pdGlhbGl6ZShldmVudC5HZXRQaXBlbGluZVN0YXR1c0NCKCkpOwotICAgIGV2ZW50LlJ1bkFuZFdhaXRGb3JTdGF0dXMoZXhwZWN0ZWQpOwotICB9Ci0KLSAgdm9pZCBDYWxsSW5pdGlhbGl6ZShjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBzdGF0dXNfY2IpIHsKLSAgICBWaWRlb1JlbmRlcmVyQmFzZTo6VmlkZW9EZWNvZGVyTGlzdCBkZWNvZGVyczsKLSAgICBkZWNvZGVycy5wdXNoX2JhY2soZGVjb2Rlcl8pOwotICAgIHJlbmRlcmVyXy0+SW5pdGlhbGl6ZSgKLSAgICAgICAgZGVtdXhlcl9zdHJlYW1fLCBkZWNvZGVycywgc3RhdHVzX2NiLAotICAgICAgICBiYXNlOjpCaW5kKCZNb2NrU3RhdGlzdGljc0NCOjpPblN0YXRpc3RpY3MsCi0gICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCgmc3RhdGlzdGljc19jYl9vYmplY3RfKSksCi0gICAgICAgIGJhc2U6OkJpbmQoJlZpZGVvUmVuZGVyZXJCYXNlVGVzdDo6T25UaW1lVXBkYXRlLAotICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAotICAgICAgICBiYXNlOjpCaW5kKCZWaWRlb1JlbmRlcmVyQmFzZVRlc3Q6Ok9uTmF0dXJhbFNpemVDaGFuZ2VkLAotICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAotICAgICAgICBlbmRlZF9ldmVudF8uR2V0Q2xvc3VyZSgpLCBlcnJvcl9ldmVudF8uR2V0UGlwZWxpbmVTdGF0dXNDQigpLAotICAgICAgICBiYXNlOjpCaW5kKCZWaWRlb1JlbmRlcmVyQmFzZVRlc3Q6OkdldFRpbWUsIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAotICAgICAgICBiYXNlOjpCaW5kKCZWaWRlb1JlbmRlcmVyQmFzZVRlc3Q6OkdldER1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLSAgfQotCi0gIHZvaWQgUGxheSgpIHsKLSAgICBTQ09QRURfVFJBQ0UoIlBsYXkoKSIpOwotICAgIFdhaXRhYmxlTWVzc2FnZUxvb3BFdmVudCBldmVudDsKLSAgICByZW5kZXJlcl8tPlBsYXkoZXZlbnQuR2V0Q2xvc3VyZSgpKTsKLSAgICBldmVudC5SdW5BbmRXYWl0KCk7Ci0gIH0KLQotICB2b2lkIFByZXJvbGwoaW50IHRpbWVzdGFtcF9tcywgUGlwZWxpbmVTdGF0dXMgZXhwZWN0ZWQpIHsKLSAgICBTQ09QRURfVFJBQ0UoYmFzZTo6U3RyaW5nUHJpbnRmKCJQcmVyb2xsKCVkLCAlZCkiLCB0aW1lc3RhbXBfbXMsIGV4cGVjdGVkKSk7Ci0gICAgV2FpdGFibGVNZXNzYWdlTG9vcEV2ZW50IGV2ZW50OwotICAgIHJlbmRlcmVyXy0+UHJlcm9sbCgKLSAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKHRpbWVzdGFtcF9tcyksCi0gICAgICAgIGV2ZW50LkdldFBpcGVsaW5lU3RhdHVzQ0IoKSk7Ci0gICAgZXZlbnQuUnVuQW5kV2FpdEZvclN0YXR1cyhleHBlY3RlZCk7Ci0gIH0KLQotICB2b2lkIFBhdXNlKCkgewotICAgIFNDT1BFRF9UUkFDRSgiUGF1c2UoKSIpOwotICAgIFdhaXRhYmxlTWVzc2FnZUxvb3BFdmVudCBldmVudDsKLSAgICByZW5kZXJlcl8tPlBhdXNlKGV2ZW50LkdldENsb3N1cmUoKSk7Ci0gICAgZXZlbnQuUnVuQW5kV2FpdCgpOwotICB9Ci0KLSAgdm9pZCBGbHVzaCgpIHsKLSAgICBTQ09QRURfVFJBQ0UoIkZsdXNoKCkiKTsKLSAgICBXYWl0YWJsZU1lc3NhZ2VMb29wRXZlbnQgZXZlbnQ7Ci0gICAgcmVuZGVyZXJfLT5GbHVzaChldmVudC5HZXRDbG9zdXJlKCkpOwotICAgIGV2ZW50LlJ1bkFuZFdhaXQoKTsKLSAgfQotCi0gIHZvaWQgU3RvcCgpIHsKLSAgICBTQ09QRURfVFJBQ0UoIlN0b3AoKSIpOwotICAgIFdhaXRhYmxlTWVzc2FnZUxvb3BFdmVudCBldmVudDsKLSAgICByZW5kZXJlcl8tPlN0b3AoZXZlbnQuR2V0Q2xvc3VyZSgpKTsKLSAgICBldmVudC5SdW5BbmRXYWl0KCk7Ci0gIH0KLQotICB2b2lkIFNodXRkb3duKCkgewotICAgIFBhdXNlKCk7Ci0gICAgRmx1c2goKTsKLSAgICBTdG9wKCk7Ci0gIH0KLQotICAvLyBRdWV1ZXMgYSBWaWRlb0ZyYW1lIHdpdGggfG5leHRfZnJhbWVfdGltZXN0YW1wX3wuCi0gIHZvaWQgUXVldWVOZXh0RnJhbWUoKSB7Ci0gICAgRENIRUNLX0VRKCZtZXNzYWdlX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLSAgICBEQ0hFQ0tfTFQobmV4dF9mcmFtZV90aW1lc3RhbXBfLkluTWljcm9zZWNvbmRzKCksCi0gICAgICAgICAgICAgIGR1cmF0aW9uXy5Jbk1pY3Jvc2Vjb25kcygpKTsKLQotICAgIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gZnJhbWUgPSBWaWRlb0ZyYW1lOjpDcmVhdGVGcmFtZSgKLSAgICAgICAgVmlkZW9GcmFtZTo6UkdCMzIsIGtOYXR1cmFsU2l6ZSwgZ2Z4OjpSZWN0KGtOYXR1cmFsU2l6ZSksIGtOYXR1cmFsU2l6ZSwKLSAgICAgICAgbmV4dF9mcmFtZV90aW1lc3RhbXBfKTsKLSAgICBkZWNvZGVfcmVzdWx0c18ucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKAotICAgICAgICBWaWRlb0RlY29kZXI6OmtPaywgZnJhbWUpKTsKLSAgICBuZXh0X2ZyYW1lX3RpbWVzdGFtcF8gKz0KLSAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKGtGcmFtZUR1cmF0aW9uSW5Ncyk7Ci0gIH0KLQotICB2b2lkIFF1ZXVlRW5kT2ZTdHJlYW0oKSB7Ci0gICAgRENIRUNLX0VRKCZtZXNzYWdlX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLSAgICBkZWNvZGVfcmVzdWx0c18ucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKAotICAgICAgICBWaWRlb0RlY29kZXI6OmtPaywgVmlkZW9GcmFtZTo6Q3JlYXRlRW1wdHlGcmFtZSgpKSk7Ci0gIH0KLQotICB2b2lkIFF1ZXVlRGVjb2RlRXJyb3IoKSB7Ci0gICAgRENIRUNLX0VRKCZtZXNzYWdlX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLSAgICBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IG51bGxfZnJhbWU7Ci0gICAgZGVjb2RlX3Jlc3VsdHNfLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcigKLSAgICAgICAgVmlkZW9EZWNvZGVyOjprRGVjb2RlRXJyb3IsIG51bGxfZnJhbWUpKTsKLSAgfQotCi0gIHZvaWQgUXVldWVBYm9ydGVkUmVhZCgpIHsKLSAgICBEQ0hFQ0tfRVEoJm1lc3NhZ2VfbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotICAgIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gbnVsbF9mcmFtZTsKLSAgICBkZWNvZGVfcmVzdWx0c18ucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKAotICAgICAgICBWaWRlb0RlY29kZXI6OmtPaywgbnVsbF9mcmFtZSkpOwotICB9Ci0KLSAgdm9pZCBRdWV1ZVByZXJvbGxGcmFtZXMoaW50IHRpbWVzdGFtcF9tcykgewotICAgIERDSEVDS19FUSgmbWVzc2FnZV9sb29wXywgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7Ci0gICAgbmV4dF9mcmFtZV90aW1lc3RhbXBfID0gYmFzZTo6VGltZURlbHRhKCk7Ci0gICAgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCA9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyh0aW1lc3RhbXBfbXMpOwotICAgIHdoaWxlIChuZXh0X2ZyYW1lX3RpbWVzdGFtcF8gPCB0aW1lc3RhbXApIHsKLSAgICAgIFF1ZXVlTmV4dEZyYW1lKCk7Ci0gICAgfQotCi0gICAgLy8gUXVldWUgdGhlIGZyYW1lIGF0IHx0aW1lc3RhbXB8IHBsdXMgYWRkaXRpb25hbCBvbmVzIGZvciBwcmVyb2xsaW5nLgotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGltaXRzOjprTWF4VmlkZW9GcmFtZXM7ICsraSkgewotICAgICAgUXVldWVOZXh0RnJhbWUoKTsKLSAgICB9Ci0gIH0KLQotICBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IEdldEN1cnJlbnRGcmFtZSgpIHsKLSAgICBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IGZyYW1lOwotICAgIHJlbmRlcmVyXy0+R2V0Q3VycmVudEZyYW1lKCZmcmFtZSk7Ci0gICAgcmVuZGVyZXJfLT5QdXRDdXJyZW50RnJhbWUoZnJhbWUpOwotICAgIHJldHVybiBmcmFtZTsKLSAgfQotCi0gIGludCBHZXRDdXJyZW50VGltZXN0YW1wSW5NcygpIHsKLSAgICBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IGZyYW1lID0gR2V0Q3VycmVudEZyYW1lKCk7Ci0gICAgaWYgKCFmcmFtZSkKLSAgICAgIHJldHVybiAtMTsKLSAgICByZXR1cm4gZnJhbWUtPkdldFRpbWVzdGFtcCgpLkluTWlsbGlzZWNvbmRzKCk7Ci0gIH0KLQotICB2b2lkIFdhaXRGb3JFcnJvcihQaXBlbGluZVN0YXR1cyBleHBlY3RlZCkgewotICAgIFNDT1BFRF9UUkFDRShiYXNlOjpTdHJpbmdQcmludGYoIldhaXRGb3JFcnJvciglZCkiLCBleHBlY3RlZCkpOwotICAgIGVycm9yX2V2ZW50Xy5SdW5BbmRXYWl0Rm9yU3RhdHVzKGV4cGVjdGVkKTsKLSAgfQotCi0gIHZvaWQgV2FpdEZvckVuZGVkKCkgewotICAgIFNDT1BFRF9UUkFDRSgiV2FpdEZvckVuZGVkKCkiKTsKLSAgICBlbmRlZF9ldmVudF8uUnVuQW5kV2FpdCgpOwotICB9Ci0KLSAgdm9pZCBXYWl0Rm9yUGVuZGluZ1JlYWQoKSB7Ci0gICAgU0NPUEVEX1RSQUNFKCJXYWl0Rm9yUGVuZGluZ1JlYWQoKSIpOwotICAgIGlmICghcmVhZF9jYl8uaXNfbnVsbCgpKQotICAgICAgcmV0dXJuOwotCi0gICAgRENIRUNLKHBlbmRpbmdfcmVhZF9jYl8uaXNfbnVsbCgpKTsKLQotICAgIFdhaXRhYmxlTWVzc2FnZUxvb3BFdmVudCBldmVudDsKLSAgICBwZW5kaW5nX3JlYWRfY2JfID0gZXZlbnQuR2V0Q2xvc3VyZSgpOwotICAgIGV2ZW50LlJ1bkFuZFdhaXQoKTsKLQotICAgIERDSEVDSyghcmVhZF9jYl8uaXNfbnVsbCgpKTsKLSAgICBEQ0hFQ0socGVuZGluZ19yZWFkX2NiXy5pc19udWxsKCkpOwotICB9Ci0KLSAgdm9pZCBTYXRpc2Z5UGVuZGluZ1JlYWQoKSB7Ci0gICAgQ0hFQ0soIXJlYWRfY2JfLmlzX251bGwoKSk7Ci0gICAgQ0hFQ0soIWRlY29kZV9yZXN1bHRzXy5lbXB0eSgpKTsKLQotICAgIGJhc2U6OkNsb3N1cmUgY2xvc3VyZSA9IGJhc2U6OkJpbmQoCi0gICAgICAgIHJlYWRfY2JfLCBkZWNvZGVfcmVzdWx0c18uZnJvbnQoKS5maXJzdCwKLSAgICAgICAgZGVjb2RlX3Jlc3VsdHNfLmZyb250KCkuc2Vjb25kKTsKLQotICAgIHJlYWRfY2JfLlJlc2V0KCk7Ci0gICAgZGVjb2RlX3Jlc3VsdHNfLnBvcF9mcm9udCgpOwotCi0gICAgbWVzc2FnZV9sb29wXy5Qb3N0VGFzayhGUk9NX0hFUkUsIGNsb3N1cmUpOwotICB9Ci0KLSAgdm9pZCBBZHZhbmNlVGltZUluTXMoaW50IHRpbWVfbXMpIHsKLSAgICBEQ0hFQ0tfRVEoJm1lc3NhZ2VfbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotICAgIGJhc2U6OkF1dG9Mb2NrIGwobG9ja18pOwotICAgIHRpbWVfICs9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyh0aW1lX21zKTsKLSAgICBEQ0hFQ0tfTEUodGltZV8uSW5NaWNyb3NlY29uZHMoKSwgZHVyYXRpb25fLkluTWljcm9zZWNvbmRzKCkpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8vIEZpeHR1cmUgbWVtYmVycy4KLSAgc2NvcGVkX3JlZnB0cjxWaWRlb1JlbmRlcmVyQmFzZT4gcmVuZGVyZXJfOwotICBzY29wZWRfcmVmcHRyPE1vY2tWaWRlb0RlY29kZXI+IGRlY29kZXJfOwotICBzY29wZWRfcmVmcHRyPE1vY2tEZW11eGVyU3RyZWFtPiBkZW11eGVyX3N0cmVhbV87Ci0gIE1vY2tTdGF0aXN0aWNzQ0Igc3RhdGlzdGljc19jYl9vYmplY3RfOwotCi0gcHJpdmF0ZToKLSAgYmFzZTo6VGltZURlbHRhIEdldFRpbWUoKSB7Ci0gICAgYmFzZTo6QXV0b0xvY2sgbChsb2NrXyk7Ci0gICAgcmV0dXJuIHRpbWVfOwotICB9Ci0KLSAgYmFzZTo6VGltZURlbHRhIEdldER1cmF0aW9uKCkgewotICAgIHJldHVybiBkdXJhdGlvbl87Ci0gIH0KLQotICB2b2lkIEZyYW1lUmVxdWVzdGVkKGNvbnN0IFZpZGVvRGVjb2Rlcjo6UmVhZENCJiByZWFkX2NiKSB7Ci0gICAgRENIRUNLX0VRKCZtZXNzYWdlX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLSAgICBDSEVDSyhyZWFkX2NiXy5pc19udWxsKCkpOwotICAgIHJlYWRfY2JfID0gcmVhZF9jYjsKLQotICAgIC8vIFdha2UgdXAgV2FpdEZvclBlbmRpbmdSZWFkKCkgaWYgbmVlZGVkLgotICAgIGlmICghcGVuZGluZ19yZWFkX2NiXy5pc19udWxsKCkpCi0gICAgICBiYXNlOjpSZXNldEFuZFJldHVybigmcGVuZGluZ19yZWFkX2NiXykuUnVuKCk7Ci0KLSAgICBpZiAoZGVjb2RlX3Jlc3VsdHNfLmVtcHR5KCkpCi0gICAgICByZXR1cm47Ci0KLSAgICBTYXRpc2Z5UGVuZGluZ1JlYWQoKTsKLSAgfQotCi0gIHZvaWQgRmx1c2hSZXF1ZXN0ZWQoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spIHsKLSAgICBEQ0hFQ0tfRVEoJm1lc3NhZ2VfbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotICAgIGRlY29kZV9yZXN1bHRzXy5jbGVhcigpOwotICAgIGlmICghcmVhZF9jYl8uaXNfbnVsbCgpKSB7Ci0gICAgICBRdWV1ZUFib3J0ZWRSZWFkKCk7Ci0gICAgICBTYXRpc2Z5UGVuZGluZ1JlYWQoKTsKLSAgICB9Ci0KLSAgICBtZXNzYWdlX2xvb3BfLlBvc3RUYXNrKEZST01fSEVSRSwgY2FsbGJhY2spOwotICB9Ci0KLSAgTWVzc2FnZUxvb3AgbWVzc2FnZV9sb29wXzsKLQotICBWaWRlb0RlY29kZXJDb25maWcgdmlkZW9fY29uZmlnXzsKLQotICAvLyBVc2VkIHRvIHByb3RlY3QgfHRpbWVffC4KLSAgYmFzZTo6TG9jayBsb2NrXzsKLSAgYmFzZTo6VGltZURlbHRhIHRpbWVfOwotCi0gIC8vIFVzZWQgZm9yIHNhdGlzZnlpbmcgcmVhZHMuCi0gIFZpZGVvRGVjb2Rlcjo6UmVhZENCIHJlYWRfY2JfOwotICBiYXNlOjpUaW1lRGVsdGEgbmV4dF9mcmFtZV90aW1lc3RhbXBfOwotICBiYXNlOjpUaW1lRGVsdGEgZHVyYXRpb25fOwotCi0gIFdhaXRhYmxlTWVzc2FnZUxvb3BFdmVudCBlcnJvcl9ldmVudF87Ci0gIFdhaXRhYmxlTWVzc2FnZUxvb3BFdmVudCBlbmRlZF9ldmVudF87Ci0gIGJhc2U6OkNsb3N1cmUgcGVuZGluZ19yZWFkX2NiXzsKLQotICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjwKLSAgICAgIFZpZGVvRGVjb2Rlcjo6U3RhdHVzLCBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+ID4gPiBkZWNvZGVfcmVzdWx0c187Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFZpZGVvUmVuZGVyZXJCYXNlVGVzdCk7Ci19OwotCi1URVNUX0YoVmlkZW9SZW5kZXJlckJhc2VUZXN0LCBEb05vdGhpbmcpIHsKLSAgLy8gVGVzdCB0aGF0IGNyZWF0aW9uIGFuZCBkZWxldGlvbiBkb2Vzbid0IGRlcGVuZCBvbiBjYWxscyB0byBJbml0aWFsaXplKCkKLSAgLy8gYW5kL29yIFN0b3AoKS4KLX0KLQotVEVTVF9GKFZpZGVvUmVuZGVyZXJCYXNlVGVzdCwgU3RvcFdpdGhvdXRJbml0aWFsaXplKSB7Ci0gIFN0b3AoKTsKLX0KLQotVEVTVF9GKFZpZGVvUmVuZGVyZXJCYXNlVGVzdCwgSW5pdGlhbGl6ZSkgewotICBJbml0aWFsaXplKCk7Ci0gIEVYUEVDVF9FUSgwLCBHZXRDdXJyZW50VGltZXN0YW1wSW5NcygpKTsKLSAgU2h1dGRvd24oKTsKLX0KLQotc3RhdGljIHZvaWQgRXhwZWN0Tm90Q2FsbGVkKFBpcGVsaW5lU3RhdHVzKSB7Ci0gIGJhc2U6OmRlYnVnOjpTdGFja1RyYWNlIHN0YWNrOwotICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBjYWxsYmFjayBub3QgdG8gYmUgY2FsbGVkXG4iIDw8IHN0YWNrLlRvU3RyaW5nKCk7Ci19Ci0KLVRFU1RfRihWaWRlb1JlbmRlcmVyQmFzZVRlc3QsIFN0b3BXaGlsZUluaXRpYWxpemluZykgewotICBFWFBFQ1RfQ0FMTCgqZGVjb2Rlcl8sIEluaXRpYWxpemUoXywgXywgXykpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MT4oUElQRUxJTkVfT0spKTsKLSAgQ2FsbEluaXRpYWxpemUoYmFzZTo6QmluZCgmRXhwZWN0Tm90Q2FsbGVkKSk7Ci0gIFN0b3AoKTsKLQotICAvLyB+VmlkZW9SZW5kZXJlckJhc2UoKSB3aWxsIENIRUNLKCkgaWYgd2UgbGVmdCBhbnl0aGluZyBpbml0aWFsaXplZC4KLX0KLQotVEVTVF9GKFZpZGVvUmVuZGVyZXJCYXNlVGVzdCwgU3RvcFdoaWxlRmx1c2hpbmcpIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBQYXVzZSgpOwotICByZW5kZXJlcl8tPkZsdXNoKGJhc2U6OkJpbmQoJkV4cGVjdE5vdENhbGxlZCwgUElQRUxJTkVfT0spKTsKLSAgU3RvcCgpOwotCi0gIC8vIH5WaWRlb1JlbmRlcmVyQmFzZSgpIHdpbGwgQ0hFQ0soKSBpZiB3ZSBsZWZ0IGFueXRoaW5nIGluaXRpYWxpemVkLgotfQotCi1URVNUX0YoVmlkZW9SZW5kZXJlckJhc2VUZXN0LCBQbGF5KSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgUGxheSgpOwotICBTaHV0ZG93bigpOwotfQotCi1URVNUX0YoVmlkZW9SZW5kZXJlckJhc2VUZXN0LCBFbmRPZlN0cmVhbV9EZWZhdWx0RnJhbWVEdXJhdGlvbikgewotICBJbml0aWFsaXplKCk7Ci0gIFBsYXkoKTsKLQotICAvLyBWZXJpZnkgdGhhdCB0aGUgZW5kZWQgY2FsbGJhY2sgZmlyZXMgd2hlbiB0aGUgZGVmYXVsdCBsYXN0IGZyYW1lIGR1cmF0aW9uCi0gIC8vIGhhcyBlbGFwc2VkLgotICBpbnQgZW5kX3RpbWVzdGFtcCA9IGtGcmFtZUR1cmF0aW9uSW5NcyAqIGxpbWl0czo6a01heFZpZGVvRnJhbWVzICsKLSAgICAgIFZpZGVvUmVuZGVyZXJCYXNlOjprTWF4TGFzdEZyYW1lRHVyYXRpb24oKS5Jbk1pbGxpc2Vjb25kcygpOwotICBFWFBFQ1RfTFQoZW5kX3RpbWVzdGFtcCwga1ZpZGVvRHVyYXRpb25Jbk1zKTsKLQotICBRdWV1ZUVuZE9mU3RyZWFtKCk7Ci0gIEFkdmFuY2VUaW1lSW5NcyhlbmRfdGltZXN0YW1wKTsKLSAgV2FpdEZvckVuZGVkKCk7Ci0KLSAgU2h1dGRvd24oKTsKLX0KLQotVEVTVF9GKFZpZGVvUmVuZGVyZXJCYXNlVGVzdCwgRW5kT2ZTdHJlYW1fQ2xpcER1cmF0aW9uKSB7Ci0gIGludCBkdXJhdGlvbiA9IGtWaWRlb0R1cmF0aW9uSW5NcyArIGtGcmFtZUR1cmF0aW9uSW5NcyAvIDI7Ci0gIEluaXRpYWxpemVXaXRoRHVyYXRpb24oZHVyYXRpb24pOwotICBQbGF5KCk7Ci0KLSAgLy8gUmVuZGVyIGFsbCBmcmFtZXMgZXhjZXB0IGZvciB0aGUgbGFzdCB8bGltaXRzOjprTWF4VmlkZW9GcmFtZXN8IGZyYW1lcwotICAvLyBhbmQgZGVsaXZlciBhbGwgdGhlIGZyYW1lcyBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgfGR1cmF0aW9ufC4gVGhlIHByZXJvbGwKLSAgLy8gaW5zaWRlIEluaXRpYWxpemUoKSBtYWtlcyB0aGlzIGEgbGl0dGxlIGNvbmZ1c2luZywgYnV0IHx0aW1lc3RhbXB8IGlzCi0gIC8vIHRoZSBjdXJyZW50IHJlbmRlciB0aW1lIGFuZCBRdWV1ZU5leHRGcmFtZSgpIGRlbGl2ZXJzIGEgZnJhbWUgd2l0aCBhCi0gIC8vIHRpbWVzdGFtcCB0aGF0IGlzIHx0aW1lc3RhbXB8ICsgbGltaXRzOjprTWF4VmlkZW9GcmFtZXMgKgotICAvLyBrRnJhbWVEdXJhdGlvbkluTXMuCi0gIGludCB0aW1lc3RhbXAgPSBrRnJhbWVEdXJhdGlvbkluTXM7Ci0gIGludCBlbmRfdGltZXN0YW1wID0gZHVyYXRpb24gLSBsaW1pdHM6OmtNYXhWaWRlb0ZyYW1lcyAqIGtGcmFtZUR1cmF0aW9uSW5NczsKLSAgZm9yICg7IHRpbWVzdGFtcCA8IGVuZF90aW1lc3RhbXA7IHRpbWVzdGFtcCArPSBrRnJhbWVEdXJhdGlvbkluTXMpIHsKLSAgICBRdWV1ZU5leHRGcmFtZSgpOwotICB9Ci0KLSAgLy8gUXVldWUgdGhlIGVuZCBvZiBzdHJlYW0gZnJhbWUgYW5kIHdhaXQgZm9yIHRoZSBsYXN0IGZyYW1lIHRvIGJlIHJlbmRlcmVkLgotICBRdWV1ZUVuZE9mU3RyZWFtKCk7Ci0gIEFkdmFuY2VUaW1lSW5NcyhkdXJhdGlvbik7Ci0gIFdhaXRGb3JFbmRlZCgpOwotCi0gIFNodXRkb3duKCk7Ci19Ci0KLVRFU1RfRihWaWRlb1JlbmRlcmVyQmFzZVRlc3QsIERlY29kZUVycm9yX1BsYXlpbmcpIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBQbGF5KCk7Ci0KLSAgUXVldWVEZWNvZGVFcnJvcigpOwotICBBZHZhbmNlVGltZUluTXMoa1ZpZGVvRHVyYXRpb25Jbk1zKTsKLSAgV2FpdEZvckVycm9yKFBJUEVMSU5FX0VSUk9SX0RFQ09ERSk7Ci0gIFNodXRkb3duKCk7Ci19Ci0KLVRFU1RfRihWaWRlb1JlbmRlcmVyQmFzZVRlc3QsIERlY29kZUVycm9yX0R1cmluZ1ByZXJvbGwpIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBQYXVzZSgpOwotICBGbHVzaCgpOwotCi0gIFF1ZXVlRGVjb2RlRXJyb3IoKTsKLSAgUHJlcm9sbChrRnJhbWVEdXJhdGlvbkluTXMgKiA2LCBQSVBFTElORV9FUlJPUl9ERUNPREUpOwotICBTaHV0ZG93bigpOwotfQotCi1URVNUX0YoVmlkZW9SZW5kZXJlckJhc2VUZXN0LCBQcmVyb2xsX0V4YWN0KSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgUGF1c2UoKTsKLSAgRmx1c2goKTsKLSAgUXVldWVQcmVyb2xsRnJhbWVzKGtGcmFtZUR1cmF0aW9uSW5NcyAqIDYpOwotCi0gIFByZXJvbGwoa0ZyYW1lRHVyYXRpb25Jbk1zICogNiwgUElQRUxJTkVfT0spOwotICBFWFBFQ1RfRVEoa0ZyYW1lRHVyYXRpb25Jbk1zICogNiwgR2V0Q3VycmVudFRpbWVzdGFtcEluTXMoKSk7Ci0gIFNodXRkb3duKCk7Ci19Ci0KLVRFU1RfRihWaWRlb1JlbmRlcmVyQmFzZVRlc3QsIFByZXJvbGxfUmlnaHRCZWZvcmUpIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBQYXVzZSgpOwotICBGbHVzaCgpOwotICBRdWV1ZVByZXJvbGxGcmFtZXMoa0ZyYW1lRHVyYXRpb25Jbk1zICogNik7Ci0KLSAgUHJlcm9sbChrRnJhbWVEdXJhdGlvbkluTXMgKiA2IC0gMSwgUElQRUxJTkVfT0spOwotICBFWFBFQ1RfRVEoa0ZyYW1lRHVyYXRpb25Jbk1zICogNSwgR2V0Q3VycmVudFRpbWVzdGFtcEluTXMoKSk7Ci0gIFNodXRkb3duKCk7Ci19Ci0KLVRFU1RfRihWaWRlb1JlbmRlcmVyQmFzZVRlc3QsIFByZXJvbGxfUmlnaHRBZnRlcikgewotICBJbml0aWFsaXplKCk7Ci0gIFBhdXNlKCk7Ci0gIEZsdXNoKCk7Ci0gIFF1ZXVlUHJlcm9sbEZyYW1lcyhrRnJhbWVEdXJhdGlvbkluTXMgKiA2KTsKLQotICBQcmVyb2xsKGtGcmFtZUR1cmF0aW9uSW5NcyAqIDYgKyAxLCBQSVBFTElORV9PSyk7Ci0gIEVYUEVDVF9FUShrRnJhbWVEdXJhdGlvbkluTXMgKiA2LCBHZXRDdXJyZW50VGltZXN0YW1wSW5NcygpKTsKLSAgU2h1dGRvd24oKTsKLX0KLQotVEVTVF9GKFZpZGVvUmVuZGVyZXJCYXNlVGVzdCwgR2V0Q3VycmVudEZyYW1lX0luaXRpYWxpemVkKSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgRVhQRUNUX1RSVUUoR2V0Q3VycmVudEZyYW1lKCkpOyAgLy8gRHVlIHRvIHByZXJvbGxpbmcuCi0gIFNodXRkb3duKCk7Ci19Ci0KLVRFU1RfRihWaWRlb1JlbmRlcmVyQmFzZVRlc3QsIEdldEN1cnJlbnRGcmFtZV9QbGF5aW5nKSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgUGxheSgpOwotICBFWFBFQ1RfVFJVRShHZXRDdXJyZW50RnJhbWUoKSk7Ci0gIFNodXRkb3duKCk7Ci19Ci0KLVRFU1RfRihWaWRlb1JlbmRlcmVyQmFzZVRlc3QsIEdldEN1cnJlbnRGcmFtZV9QYXVzZWQpIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBQbGF5KCk7Ci0gIFBhdXNlKCk7Ci0gIEVYUEVDVF9UUlVFKEdldEN1cnJlbnRGcmFtZSgpKTsKLSAgU2h1dGRvd24oKTsKLX0KLQotVEVTVF9GKFZpZGVvUmVuZGVyZXJCYXNlVGVzdCwgR2V0Q3VycmVudEZyYW1lX0ZsdXNoZWQpIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBQbGF5KCk7Ci0gIFBhdXNlKCk7Ci0gIEZsdXNoKCk7Ci0gIEVYUEVDVF9GQUxTRShHZXRDdXJyZW50RnJhbWUoKSk7Ci0gIFNodXRkb3duKCk7Ci19Ci0KLSNpZiBkZWZpbmVkKE9TX01BQ09TWCkgfHwgZGVmaW5lZChBRERSRVNTX1NBTklUSVpFUikKLS8vIGh0dHA6Ly9jcmJ1Zy5jb20vMTA5NDA1Ci0jZGVmaW5lIE1BWUJFX0dldEN1cnJlbnRGcmFtZV9FbmRPZlN0cmVhbSBESVNBQkxFRF9HZXRDdXJyZW50RnJhbWVfRW5kT2ZTdHJlYW0KLSNlbHNlCi0jZGVmaW5lIE1BWUJFX0dldEN1cnJlbnRGcmFtZV9FbmRPZlN0cmVhbSBHZXRDdXJyZW50RnJhbWVfRW5kT2ZTdHJlYW0KLSNlbmRpZgotVEVTVF9GKFZpZGVvUmVuZGVyZXJCYXNlVGVzdCwgTUFZQkVfR2V0Q3VycmVudEZyYW1lX0VuZE9mU3RyZWFtKSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgUGxheSgpOwotICBQYXVzZSgpOwotICBGbHVzaCgpOwotCi0gIC8vIFByZXJvbGwgb25seSBlbmQgb2Ygc3RyZWFtIGZyYW1lcy4KLSAgUXVldWVFbmRPZlN0cmVhbSgpOwotICBQcmVyb2xsKDAsIFBJUEVMSU5FX09LKTsKLSAgRVhQRUNUX0ZBTFNFKEdldEN1cnJlbnRGcmFtZSgpKTsKLQotICAvLyBTdGFydCBwbGF5aW5nLCB3ZSBzaG91bGQgaW1tZWRpYXRlbHkgZ2V0IG5vdGlmaWVkIG9mIGVuZCBvZiBzdHJlYW0uCi0gIFBsYXkoKTsKLSAgV2FpdEZvckVuZGVkKCk7Ci0KLSAgU2h1dGRvd24oKTsKLX0KLQotVEVTVF9GKFZpZGVvUmVuZGVyZXJCYXNlVGVzdCwgR2V0Q3VycmVudEZyYW1lX1NodXRkb3duKSB7Ci0gIEluaXRpYWxpemUoKTsKLSAgU2h1dGRvd24oKTsKLSAgRVhQRUNUX0ZBTFNFKEdldEN1cnJlbnRGcmFtZSgpKTsKLX0KLQotLy8gU3RvcCgpIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBkdXJpbmcgYW4gZXJyb3IuCi1URVNUX0YoVmlkZW9SZW5kZXJlckJhc2VUZXN0LCBHZXRDdXJyZW50RnJhbWVfRXJyb3IpIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBTdG9wKCk7Ci0gIEVYUEVDVF9GQUxTRShHZXRDdXJyZW50RnJhbWUoKSk7Ci19Ci0KLS8vIFZlcmlmeSB0aGF0IHNodXRkb3duIGNhbiBvbmx5IHByb2NlZWQgYWZ0ZXIgd2UgcmV0dXJuIHRoZSBjdXJyZW50IGZyYW1lLgotVEVTVF9GKFZpZGVvUmVuZGVyZXJCYXNlVGVzdCwgU2h1dGRvd25fRHVyaW5nUGFpbnQpIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBQbGF5KCk7Ci0KLSAgLy8gR3JhYiB0aGUgZnJhbWUuCi0gIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gZnJhbWU7Ci0gIHJlbmRlcmVyXy0+R2V0Q3VycmVudEZyYW1lKCZmcmFtZSk7Ci0gIEVYUEVDVF9UUlVFKGZyYW1lKTsKLQotICBQYXVzZSgpOwotCi0gIC8vIFN0YXJ0IGZsdXNoaW5nIC0tIGl0IHdvbid0IGNvbXBsZXRlIHVudGlsIHdlIHJldHVybiB0aGUgZnJhbWUuCi0gIFdhaXRhYmxlTWVzc2FnZUxvb3BFdmVudCBldmVudDsKLSAgcmVuZGVyZXJfLT5GbHVzaChldmVudC5HZXRDbG9zdXJlKCkpOwotCi0gIC8vIFJldHVybiB0aGUgZnJhbWUgYW5kIHdhaXQuCi0gIHJlbmRlcmVyXy0+UHV0Q3VycmVudEZyYW1lKGZyYW1lKTsKLSAgZXZlbnQuUnVuQW5kV2FpdCgpOwotCi0gIFN0b3AoKTsKLX0KLQotLy8gVmVyaWZ5IHRoYXQgYSBsYXRlIGRlY29kZXIgcmVzcG9uc2UgZG9lc24ndCBicmVhayBpbnZhcmlhbnRzIGluIHRoZSByZW5kZXJlci4KLVRFU1RfRihWaWRlb1JlbmRlcmVyQmFzZVRlc3QsIFN0b3BEdXJpbmdPdXRzdGFuZGluZ1JlYWQpIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBQbGF5KCk7Ci0KLSAgLy8gQWR2YW5jZSB0aW1lIGEgYml0IHRvIHRyaWdnZXIgYSBSZWFkKCkuCi0gIEFkdmFuY2VUaW1lSW5NcyhrRnJhbWVEdXJhdGlvbkluTXMpOwotICBXYWl0Rm9yUGVuZGluZ1JlYWQoKTsKLQotICBXYWl0YWJsZU1lc3NhZ2VMb29wRXZlbnQgZXZlbnQ7Ci0gIHJlbmRlcmVyXy0+U3RvcChldmVudC5HZXRDbG9zdXJlKCkpOwotCi0gIFF1ZXVlRW5kT2ZTdHJlYW0oKTsKLSAgU2F0aXNmeVBlbmRpbmdSZWFkKCk7Ci0KLSAgZXZlbnQuUnVuQW5kV2FpdCgpOwotfQotCi1URVNUX0YoVmlkZW9SZW5kZXJlckJhc2VUZXN0LCBBYm9ydFBlbmRpbmdSZWFkX1BsYXlpbmcpIHsKLSAgSW5pdGlhbGl6ZSgpOwotICBQbGF5KCk7Ci0KLSAgLy8gQWR2YW5jZSB0aW1lIGEgYml0IHRvIHRyaWdnZXIgYSBSZWFkKCkuCi0gIEFkdmFuY2VUaW1lSW5NcyhrRnJhbWVEdXJhdGlvbkluTXMpOwotICBXYWl0Rm9yUGVuZGluZ1JlYWQoKTsKLQotICBRdWV1ZUFib3J0ZWRSZWFkKCk7Ci0gIFNhdGlzZnlQZW5kaW5nUmVhZCgpOwotCi0gIFBhdXNlKCk7Ci0gIEZsdXNoKCk7Ci0gIFF1ZXVlUHJlcm9sbEZyYW1lcyhrRnJhbWVEdXJhdGlvbkluTXMgKiA2KTsKLSAgUHJlcm9sbChrRnJhbWVEdXJhdGlvbkluTXMgKiA2LCBQSVBFTElORV9PSyk7Ci0gIEVYUEVDVF9FUShrRnJhbWVEdXJhdGlvbkluTXMgKiA2LCBHZXRDdXJyZW50VGltZXN0YW1wSW5NcygpKTsKLSAgU2h1dGRvd24oKTsKLX0KLQotVEVTVF9GKFZpZGVvUmVuZGVyZXJCYXNlVGVzdCwgQWJvcnRQZW5kaW5nUmVhZF9GbHVzaCkgewotICBJbml0aWFsaXplKCk7Ci0gIFBsYXkoKTsKLQotICAvLyBBZHZhbmNlIHRpbWUgYSBiaXQgdG8gdHJpZ2dlciBhIFJlYWQoKS4KLSAgQWR2YW5jZVRpbWVJbk1zKGtGcmFtZUR1cmF0aW9uSW5Ncyk7Ci0gIFdhaXRGb3JQZW5kaW5nUmVhZCgpOwotCi0gIFBhdXNlKCk7Ci0gIEZsdXNoKCk7Ci0gIFNodXRkb3duKCk7Ci19Ci0KLVRFU1RfRihWaWRlb1JlbmRlcmVyQmFzZVRlc3QsIEFib3J0UGVuZGluZ1JlYWRfUHJlcm9sbCkgewotICBJbml0aWFsaXplKCk7Ci0gIFBhdXNlKCk7Ci0gIEZsdXNoKCk7Ci0KLSAgUXVldWVBYm9ydGVkUmVhZCgpOwotICBQcmVyb2xsKGtGcmFtZUR1cmF0aW9uSW5NcyAqIDYsIFBJUEVMSU5FX09LKTsKLSAgU2h1dGRvd24oKTsKLX0KLQotVEVTVF9GKFZpZGVvUmVuZGVyZXJCYXNlVGVzdCwgVmlkZW9EZWNvZGVyX0luaXRGYWlsdXJlKSB7Ci0gIEluU2VxdWVuY2UgczsKLQotICBFWFBFQ1RfQ0FMTCgqZGVjb2Rlcl8sIEluaXRpYWxpemUoXywgXywgXykpCi0gICAgICAuV2lsbE9uY2UoUnVuQ2FsbGJhY2s8MT4oREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVEKSk7Ci0gIEluaXRpYWxpemVSZW5kZXJlcihERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQpOwotCi0gIFN0b3AoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvbWVkaWEuZ3lwIGIvc3JjL21lZGlhL21lZGlhLmd5cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FmZjYwNi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvbWVkaWEuZ3lwCisrKyAvZGV2L251bGwKQEAgLTEsMTU3MSArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi17Ci0gICd2YXJpYWJsZXMnOiB7Ci0gICAgJ2Nocm9taXVtX2NvZGUnOiAxLAotICAgICMgT3ZlcnJpZGUgdG8gZHluYW1pY2FsbHkgbGluayB0aGUgUHVsc2VBdWRpbyBsaWJyYXJ5LgotICAgICd1c2VfcHVsc2VhdWRpbyUnOiAwLAotICAgICMgT3ZlcnJpZGUgdG8gZHluYW1pY2FsbHkgbGluayB0aGUgY3JhcyAoQ2hyb21lT1MgYXVkaW8pIGxpYnJhcnkuCi0gICAgJ3VzZV9jcmFzJSc6IDAsCi0gICAgJ2NvbmRpdGlvbnMnOiBbCi0gICAgICBbJ09TID09ICJhbmRyb2lkIiBvciBPUyA9PSAiaW9zIiBvciBPUyA9PSAibGJfc2hlbGwiIG9yIE9TID09ICJzdGFyYm9hcmQiJywgewotICAgICAgICAjIEFuZHJvaWQgYW5kIGlPUyBkb24ndCB1c2UgZmZtcGVnLgotICAgICAgICAndXNlX2ZmbXBlZyUnOiAwLAotICAgICAgfSwgeyAgIyAnT1MgIT0gImFuZHJvaWQiIGFuZCBPUyAhPSAiaW9zIicgYW5kIE9TICE9ICJsYl9zaGVsbCIgYW5kIE9TICE9ICJzdGFyYm9hcmQiCi0gICAgICAgICd1c2VfZmZtcGVnJSc6IDEsCi0gICAgICB9XSwKLSAgICBdLAotICB9LAotICAndGFyZ2V0cyc6IFsKLSAgICB7Ci0gICAgICAndGFyZ2V0X25hbWUnOiAnbWVkaWEnLAotICAgICAgJ3R5cGUnOiAnPChjb21wb25lbnQpJywKLSAgICAgICdkZXBlbmRlbmNpZXMnOiBbCi0gICAgICAgICcuLi9iYXNlL2Jhc2UuZ3lwOmJhc2UnLAotICAgICAgICAnLi4vdWkvdWkuZ3lwOnVpJywKLSAgICAgIF0sCi0gICAgICAnZGVmaW5lcyc6IFsKLSAgICAgICAgJ01FRElBX0lNUExFTUVOVEFUSU9OJywKLSAgICAgIF0sCi0gICAgICAnaW5jbHVkZV9kaXJzJzogWwotICAgICAgICAnLi4nLAotICAgICAgXSwKLSAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAnYXVkaW8vYW5kcm9pZC9hdWRpb19tYW5hZ2VyX2FuZHJvaWQuY2MnLAotICAgICAgICAnYXVkaW8vYW5kcm9pZC9hdWRpb19tYW5hZ2VyX2FuZHJvaWQuaCcsCi0gICAgICAgICdhdWRpby9hbmRyb2lkL29wZW5zbGVzX2lucHV0LmNjJywKLSAgICAgICAgJ2F1ZGlvL2FuZHJvaWQvb3BlbnNsZXNfaW5wdXQuaCcsCi0gICAgICAgICdhdWRpby9hbmRyb2lkL29wZW5zbGVzX291dHB1dC5jYycsCi0gICAgICAgICdhdWRpby9hbmRyb2lkL29wZW5zbGVzX291dHB1dC5oJywKLSAgICAgICAgJ2F1ZGlvL2FzeW5jX3NvY2tldF9pb19oYW5kbGVyLmgnLAotICAgICAgICAnYXVkaW8vYXN5bmNfc29ja2V0X2lvX2hhbmRsZXJfcG9zaXguY2MnLAotICAgICAgICAnYXVkaW8vYXN5bmNfc29ja2V0X2lvX2hhbmRsZXJfd2luLmNjJywKLSAgICAgICAgJ2F1ZGlvL2F1ZGlvX2J1ZmZlcnNfc3RhdGUuY2MnLAotICAgICAgICAnYXVkaW8vYXVkaW9fYnVmZmVyc19zdGF0ZS5oJywKLSAgICAgICAgJ2F1ZGlvL2F1ZGlvX2RldmljZV9uYW1lLmNjJywKLSAgICAgICAgJ2F1ZGlvL2F1ZGlvX2RldmljZV9uYW1lLmgnLAotICAgICAgICAnYXVkaW8vYXVkaW9fZGV2aWNlX3RocmVhZC5jYycsCi0gICAgICAgICdhdWRpby9hdWRpb19kZXZpY2VfdGhyZWFkLmgnLAotICAgICAgICAnYXVkaW8vYXVkaW9faW5wdXRfY29udHJvbGxlci5jYycsCi0gICAgICAgICdhdWRpby9hdWRpb19pbnB1dF9jb250cm9sbGVyLmgnLAotICAgICAgICAnYXVkaW8vYXVkaW9faW5wdXRfZGV2aWNlLmNjJywKLSAgICAgICAgJ2F1ZGlvL2F1ZGlvX2lucHV0X2RldmljZS5oJywKLSAgICAgICAgJ2F1ZGlvL2F1ZGlvX2lucHV0X2lwYy5jYycsCi0gICAgICAgICdhdWRpby9hdWRpb19pbnB1dF9pcGMuaCcsCi0gICAgICAgICMgVE9ETyhkYWxlY3VydGlzKTogVGVtcG9yYXJpbHkgZGlzYWJsZWQgd2hpbGUgc3dpdGNoaW5nIHBpcGVsaW5lIHRvIHVzZQotICAgICAgICAjIGZsb2F0LCBodHRwOi8vY3JidWcuY29tLzExNDcwMAotICAgICAgICAjICdhdWRpby9hdWRpb19vdXRwdXRfbWl4ZXIuY2MnLAotICAgICAgICAjICdhdWRpby9hdWRpb19vdXRwdXRfbWl4ZXIuaCcsCi0gICAgICAgICdhdWRpby9hdWRpb19pbnB1dF9zdHJlYW1faW1wbC5jYycsCi0gICAgICAgICdhdWRpby9hdWRpb19pbnB1dF9zdHJlYW1faW1wbC5oJywKLSAgICAgICAgJ2F1ZGlvL2F1ZGlvX2lvLmgnLAotICAgICAgICAnYXVkaW8vYXVkaW9fbWFuYWdlci5jYycsCi0gICAgICAgICdhdWRpby9hdWRpb19tYW5hZ2VyLmgnLAotICAgICAgICAnYXVkaW8vYXVkaW9fbWFuYWdlcl9iYXNlLmNjJywKLSAgICAgICAgJ2F1ZGlvL2F1ZGlvX21hbmFnZXJfYmFzZS5oJywKLSAgICAgICAgJ2F1ZGlvL2F1ZGlvX291dHB1dF9jb250cm9sbGVyLmNjJywKLSAgICAgICAgJ2F1ZGlvL2F1ZGlvX291dHB1dF9jb250cm9sbGVyLmgnLAotICAgICAgICAnYXVkaW8vYXVkaW9fb3V0cHV0X2RldmljZS5jYycsCi0gICAgICAgICdhdWRpby9hdWRpb19vdXRwdXRfZGV2aWNlLmgnLAotICAgICAgICAnYXVkaW8vYXVkaW9fb3V0cHV0X2Rpc3BhdGNoZXIuY2MnLAotICAgICAgICAnYXVkaW8vYXVkaW9fb3V0cHV0X2Rpc3BhdGNoZXIuaCcsCi0gICAgICAgICdhdWRpby9hdWRpb19vdXRwdXRfZGlzcGF0Y2hlcl9pbXBsLmNjJywKLSAgICAgICAgJ2F1ZGlvL2F1ZGlvX291dHB1dF9kaXNwYXRjaGVyX2ltcGwuaCcsCi0gICAgICAgICdhdWRpby9hdWRpb19vdXRwdXRfaXBjLmNjJywKLSAgICAgICAgJ2F1ZGlvL2F1ZGlvX291dHB1dF9pcGMuaCcsCi0gICAgICAgICdhdWRpby9hdWRpb19vdXRwdXRfcHJveHkuY2MnLAotICAgICAgICAnYXVkaW8vYXVkaW9fb3V0cHV0X3Byb3h5LmgnLAotICAgICAgICAnYXVkaW8vYXVkaW9fb3V0cHV0X3Jlc2FtcGxlci5jYycsCi0gICAgICAgICdhdWRpby9hdWRpb19vdXRwdXRfcmVzYW1wbGVyLmgnLAotICAgICAgICAnYXVkaW8vYXVkaW9fdXRpbC5jYycsCi0gICAgICAgICdhdWRpby9hdWRpb191dGlsLmgnLAotICAgICAgICAnYXVkaW8vY3Jvc3NfcHJvY2Vzc19ub3RpZmljYXRpb24uY2MnLAotICAgICAgICAnYXVkaW8vY3Jvc3NfcHJvY2Vzc19ub3RpZmljYXRpb24uaCcsCi0gICAgICAgICdhdWRpby9jcm9zc19wcm9jZXNzX25vdGlmaWNhdGlvbl9wb3NpeC5jYycsCi0gICAgICAgICdhdWRpby9jcm9zc19wcm9jZXNzX25vdGlmaWNhdGlvbl93aW4uY2MnLAotICAgICAgICAnYXVkaW8vZmFrZV9hdWRpb19pbnB1dF9zdHJlYW0uY2MnLAotICAgICAgICAnYXVkaW8vZmFrZV9hdWRpb19pbnB1dF9zdHJlYW0uaCcsCi0gICAgICAgICdhdWRpby9mYWtlX2F1ZGlvX291dHB1dF9zdHJlYW0uY2MnLAotICAgICAgICAnYXVkaW8vZmFrZV9hdWRpb19vdXRwdXRfc3RyZWFtLmgnLAotICAgICAgICAnYXVkaW8vaW9zL2F1ZGlvX21hbmFnZXJfaW9zLmgnLAotICAgICAgICAnYXVkaW8vaW9zL2F1ZGlvX21hbmFnZXJfaW9zLm1tJywKLSAgICAgICAgJ2F1ZGlvL2xpbnV4L2Fsc2FfaW5wdXQuY2MnLAotICAgICAgICAnYXVkaW8vbGludXgvYWxzYV9pbnB1dC5oJywKLSAgICAgICAgJ2F1ZGlvL2xpbnV4L2Fsc2Ffb3V0cHV0LmNjJywKLSAgICAgICAgJ2F1ZGlvL2xpbnV4L2Fsc2Ffb3V0cHV0LmgnLAotICAgICAgICAnYXVkaW8vbGludXgvYWxzYV91dGlsLmNjJywKLSAgICAgICAgJ2F1ZGlvL2xpbnV4L2Fsc2FfdXRpbC5oJywKLSAgICAgICAgJ2F1ZGlvL2xpbnV4L2Fsc2Ffd3JhcHBlci5jYycsCi0gICAgICAgICdhdWRpby9saW51eC9hbHNhX3dyYXBwZXIuaCcsCi0gICAgICAgICdhdWRpby9saW51eC9hdWRpb19tYW5hZ2VyX2xpbnV4LmNjJywKLSAgICAgICAgJ2F1ZGlvL2xpbnV4L2F1ZGlvX21hbmFnZXJfbGludXguaCcsCi0gICAgICAgICdhdWRpby9saW51eC9jcmFzX2lucHV0LmNjJywKLSAgICAgICAgJ2F1ZGlvL2xpbnV4L2NyYXNfaW5wdXQuaCcsCi0gICAgICAgICdhdWRpby9saW51eC9jcmFzX291dHB1dC5jYycsCi0gICAgICAgICdhdWRpby9saW51eC9jcmFzX291dHB1dC5oJywKLSAgICAgICAgJ2F1ZGlvL21hYy9hdWRpb19pbnB1dF9tYWMuY2MnLAotICAgICAgICAnYXVkaW8vbWFjL2F1ZGlvX2lucHV0X21hYy5oJywKLSAgICAgICAgJ2F1ZGlvL21hYy9hdWRpb19sb3dfbGF0ZW5jeV9pbnB1dF9tYWMuY2MnLAotICAgICAgICAnYXVkaW8vbWFjL2F1ZGlvX2xvd19sYXRlbmN5X2lucHV0X21hYy5oJywKLSAgICAgICAgJ2F1ZGlvL21hYy9hdWRpb19sb3dfbGF0ZW5jeV9vdXRwdXRfbWFjLmNjJywKLSAgICAgICAgJ2F1ZGlvL21hYy9hdWRpb19sb3dfbGF0ZW5jeV9vdXRwdXRfbWFjLmgnLAotICAgICAgICAnYXVkaW8vbWFjL2F1ZGlvX21hbmFnZXJfbWFjLmNjJywKLSAgICAgICAgJ2F1ZGlvL21hYy9hdWRpb19tYW5hZ2VyX21hYy5oJywKLSAgICAgICAgJ2F1ZGlvL21hYy9hdWRpb19vdXRwdXRfbWFjLmNjJywKLSAgICAgICAgJ2F1ZGlvL21hYy9hdWRpb19vdXRwdXRfbWFjLmgnLAotICAgICAgICAnYXVkaW8vbWFjL2F1ZGlvX3N5bmNocm9uaXplZF9tYWMuY2MnLAotICAgICAgICAnYXVkaW8vbWFjL2F1ZGlvX3N5bmNocm9uaXplZF9tYWMuaCcsCi0gICAgICAgICdhdWRpby9tYWMvYXVkaW9fdW5pZmllZF9tYWMuY2MnLAotICAgICAgICAnYXVkaW8vbWFjL2F1ZGlvX3VuaWZpZWRfbWFjLmgnLAotICAgICAgICAnYXVkaW8vbnVsbF9hdWRpb19zaW5rLmNjJywKLSAgICAgICAgJ2F1ZGlvL251bGxfYXVkaW9fc2luay5oJywKLSAgICAgICAgJ2F1ZGlvL251bGxfYXVkaW9fc3RyZWFtZXIuY2MnLAotICAgICAgICAnYXVkaW8vbnVsbF9hdWRpb19zdHJlYW1lci5oJywKLSAgICAgICAgJ2F1ZGlvL29wZW5ic2QvYXVkaW9fbWFuYWdlcl9vcGVuYnNkLmNjJywKLSAgICAgICAgJ2F1ZGlvL29wZW5ic2QvYXVkaW9fbWFuYWdlcl9vcGVuYnNkLmgnLAotICAgICAgICAnYXVkaW8vcHVsc2UvcHVsc2Vfb3V0cHV0LmNjJywKLSAgICAgICAgJ2F1ZGlvL3B1bHNlL3B1bHNlX291dHB1dC5oJywKLSAgICAgICAgJ2F1ZGlvL3NhbXBsZV9yYXRlcy5jYycsCi0gICAgICAgICdhdWRpby9zYW1wbGVfcmF0ZXMuaCcsCi0gICAgICAgICdhdWRpby9zY29wZWRfbG9vcF9vYnNlcnZlci5jYycsCi0gICAgICAgICdhdWRpby9zY29wZWRfbG9vcF9vYnNlcnZlci5oJywKLSAgICAgICAgJ2F1ZGlvL3NoZWxsX3dhdl90ZXN0X3Byb2JlLmNjJywKLSAgICAgICAgJ2F1ZGlvL3NoZWxsX3dhdl90ZXN0X3Byb2JlLmgnLAotICAgICAgICAnYXVkaW8vc2hlbGxfYXVkaW9fc2luay5jYycsCi0gICAgICAgICdhdWRpby9zaGVsbF9hdWRpb19zaW5rLmgnLAotICAgICAgICAnYXVkaW8vc2ltcGxlX3NvdXJjZXMuY2MnLAotICAgICAgICAnYXVkaW8vc2ltcGxlX3NvdXJjZXMuaCcsCi0gICAgICAgICdhdWRpby92aXJ0dWFsX2F1ZGlvX2lucHV0X3N0cmVhbS5jYycsCi0gICAgICAgICdhdWRpby92aXJ0dWFsX2F1ZGlvX2lucHV0X3N0cmVhbS5oJywKLSAgICAgICAgJ2F1ZGlvL3ZpcnR1YWxfYXVkaW9fb3V0cHV0X3N0cmVhbS5jYycsCi0gICAgICAgICdhdWRpby92aXJ0dWFsX2F1ZGlvX291dHB1dF9zdHJlYW0uaCcsCi0gICAgICAgICdhdWRpby93aW4vYXVkaW9fZGV2aWNlX2xpc3RlbmVyX3dpbi5jYycsCi0gICAgICAgICdhdWRpby93aW4vYXVkaW9fZGV2aWNlX2xpc3RlbmVyX3dpbi5oJywKLSAgICAgICAgJ2F1ZGlvL3dpbi9hdWRpb19sb3dfbGF0ZW5jeV9pbnB1dF93aW4uY2MnLAotICAgICAgICAnYXVkaW8vd2luL2F1ZGlvX2xvd19sYXRlbmN5X2lucHV0X3dpbi5oJywKLSAgICAgICAgJ2F1ZGlvL3dpbi9hdWRpb19sb3dfbGF0ZW5jeV9vdXRwdXRfd2luLmNjJywKLSAgICAgICAgJ2F1ZGlvL3dpbi9hdWRpb19sb3dfbGF0ZW5jeV9vdXRwdXRfd2luLmgnLAotICAgICAgICAnYXVkaW8vd2luL2F1ZGlvX21hbmFnZXJfd2luLmNjJywKLSAgICAgICAgJ2F1ZGlvL3dpbi9hdWRpb19tYW5hZ2VyX3dpbi5oJywKLSAgICAgICAgJ2F1ZGlvL3dpbi9hdWRpb191bmlmaWVkX3dpbi5jYycsCi0gICAgICAgICdhdWRpby93aW4vYXVkaW9fdW5pZmllZF93aW4uaCcsCi0gICAgICAgICdhdWRpby93aW4vYXZydF93cmFwcGVyX3dpbi5jYycsCi0gICAgICAgICdhdWRpby93aW4vYXZydF93cmFwcGVyX3dpbi5oJywKLSAgICAgICAgJ2F1ZGlvL3dpbi9kZXZpY2VfZW51bWVyYXRpb25fd2luLmNjJywKLSAgICAgICAgJ2F1ZGlvL3dpbi9kZXZpY2VfZW51bWVyYXRpb25fd2luLmgnLAotICAgICAgICAnYXVkaW8vd2luL2NvcmVfYXVkaW9fdXRpbF93aW4uY2MnLAotICAgICAgICAnYXVkaW8vd2luL2NvcmVfYXVkaW9fdXRpbF93aW4uaCcsCi0gICAgICAgICdhdWRpby93aW4vd2F2ZWluX2lucHV0X3dpbi5jYycsCi0gICAgICAgICdhdWRpby93aW4vd2F2ZWluX2lucHV0X3dpbi5oJywKLSAgICAgICAgJ2F1ZGlvL3dpbi93YXZlb3V0X291dHB1dF93aW4uY2MnLAotICAgICAgICAnYXVkaW8vd2luL3dhdmVvdXRfb3V0cHV0X3dpbi5oJywKLSAgICAgICAgJ2Jhc2UvYW5kcm9pZC9jb29raWVfZ2V0dGVyLmNjJywKLSAgICAgICAgJ2Jhc2UvYW5kcm9pZC9jb29raWVfZ2V0dGVyLmgnLAotICAgICAgICAnYmFzZS9hbmRyb2lkL21lZGlhX3BsYXllcl9icmlkZ2VfbWFuYWdlci5jYycsCi0gICAgICAgICdiYXNlL2FuZHJvaWQvbWVkaWFfcGxheWVyX2JyaWRnZV9tYW5hZ2VyLmgnLAotICAgICAgICAnYmFzZS9hdWRpb19jYXB0dXJlcl9zb3VyY2UuaCcsCi0gICAgICAgICdiYXNlL2F1ZGlvX2NvbnZlcnRlci5jYycsCi0gICAgICAgICdiYXNlL2F1ZGlvX2NvbnZlcnRlci5oJywKLSAgICAgICAgJ2Jhc2UvYXVkaW9fZGVjb2Rlci5jYycsCi0gICAgICAgICdiYXNlL2F1ZGlvX2RlY29kZXIuaCcsCi0gICAgICAgICdiYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmNjJywKLSAgICAgICAgJ2Jhc2UvYXVkaW9fZGVjb2Rlcl9jb25maWcuaCcsCi0gICAgICAgICdiYXNlL2F1ZGlvX2ZpZm8uY2MnLAotICAgICAgICAnYmFzZS9hdWRpb19maWZvLmgnLAotICAgICAgICAnYmFzZS9hdWRpb19wdWxsX2ZpZm8uY2MnLAotICAgICAgICAnYmFzZS9hdWRpb19wdWxsX2ZpZm8uaCcsCi0gICAgICAgICdiYXNlL2F1ZGlvX3JlbmRlcmVyLmNjJywKLSAgICAgICAgJ2Jhc2UvYXVkaW9fcmVuZGVyZXIuaCcsCi0gICAgICAgICdiYXNlL2F1ZGlvX3JlbmRlcmVyX3NpbmsuaCcsCi0gICAgICAgICdiYXNlL2F1ZGlvX3JlbmRlcmVyX21peGVyLmNjJywKLSAgICAgICAgJ2Jhc2UvYXVkaW9fcmVuZGVyZXJfbWl4ZXIuaCcsCi0gICAgICAgICdiYXNlL2F1ZGlvX3JlbmRlcmVyX21peGVyX2lucHV0LmNjJywKLSAgICAgICAgJ2Jhc2UvYXVkaW9fcmVuZGVyZXJfbWl4ZXJfaW5wdXQuaCcsCi0gICAgICAgICdiYXNlL2F1ZGlvX3NwbGljZXIuY2MnLAotICAgICAgICAnYmFzZS9hdWRpb19zcGxpY2VyLmgnLAotICAgICAgICAnYmFzZS9hdWRpb190aW1lc3RhbXBfaGVscGVyLmNjJywKLSAgICAgICAgJ2Jhc2UvYXVkaW9fdGltZXN0YW1wX2hlbHBlci5oJywKLSAgICAgICAgJ2Jhc2UvYmluZF90b19sb29wLmgnLAotICAgICAgICAnYmFzZS9iaXRzdHJlYW1fYnVmZmVyLmgnLAotICAgICAgICAnYmFzZS9iaXRfcmVhZGVyLmNjJywKLSAgICAgICAgJ2Jhc2UvYml0X3JlYWRlci5oJywKLSAgICAgICAgJ2Jhc2UvYnVmZmVycy5jYycsCi0gICAgICAgICdiYXNlL2J1ZmZlcnMuaCcsCi0gICAgICAgICdiYXNlL2J5dGVfcXVldWUuY2MnLAotICAgICAgICAnYmFzZS9ieXRlX3F1ZXVlLmgnLAotICAgICAgICAnYmFzZS9jaGFubmVsX21peGVyLmNjJywKLSAgICAgICAgJ2Jhc2UvY2hhbm5lbF9taXhlci5oJywKLSAgICAgICAgJ2Jhc2UvY2xvY2suY2MnLAotICAgICAgICAnYmFzZS9jbG9jay5oJywKLSAgICAgICAgJ2Jhc2UvY29sb3Jfc3BhY2UuY2MnLAotICAgICAgICAnYmFzZS9jb2xvcl9zcGFjZS5oJywKLSAgICAgICAgJ2Jhc2UvZGF0YV9idWZmZXIuY2MnLAotICAgICAgICAnYmFzZS9kYXRhX2J1ZmZlci5oJywKLSAgICAgICAgJ2Jhc2UvZGF0YV9zb3VyY2UuY2MnLAotICAgICAgICAnYmFzZS9kYXRhX3NvdXJjZS5oJywKLSAgICAgICAgJ2Jhc2UvZGVjb2Rlcl9idWZmZXIuY2MnLAotICAgICAgICAnYmFzZS9kZWNvZGVyX2J1ZmZlci5oJywKLSAgICAgICAgJ2Jhc2UvZGVjb2Rlcl9idWZmZXJfcG9vbC5jYycsCi0gICAgICAgICdiYXNlL2RlY29kZXJfYnVmZmVyX3Bvb2wuaCcsCi0gICAgICAgICdiYXNlL2RlY3J5cHRvci5jYycsCi0gICAgICAgICdiYXNlL2RlY3J5cHRvci5oJywKLSAgICAgICAgJ2Jhc2UvZGVjcnlwdG9yX2NsaWVudC5oJywKLSAgICAgICAgJ2Jhc2UvZGVjcnlwdF9jb25maWcuY2MnLAotICAgICAgICAnYmFzZS9kZWNyeXB0X2NvbmZpZy5oJywKLSAgICAgICAgJ2Jhc2UvZGVtdXhlci5jYycsCi0gICAgICAgICdiYXNlL2RlbXV4ZXIuaCcsCi0gICAgICAgICdiYXNlL2RlbXV4ZXJfc3RyZWFtLmNjJywKLSAgICAgICAgJ2Jhc2UvZGVtdXhlcl9zdHJlYW0uaCcsCi0gICAgICAgICdiYXNlL2RqYjIuY2MnLAotICAgICAgICAnYmFzZS9kamIyLmgnLAotICAgICAgICAnYmFzZS9maWx0ZXJfY29sbGVjdGlvbi5jYycsCi0gICAgICAgICdiYXNlL2ZpbHRlcl9jb2xsZWN0aW9uLmgnLAotICAgICAgICAnYmFzZS9nZnhfZXhwb3J0LmgnLAotICAgICAgICAnYmFzZS9oZHJfbWV0YWRhdGEuY2MnLAotICAgICAgICAnYmFzZS9oZHJfbWV0YWRhdGEuaCcsCi0gICAgICAgICdiYXNlL2ludGVybGVhdmVkX3NpbmNfcmVzYW1wbGVyLmNjJywKLSAgICAgICAgJ2Jhc2UvaW50ZXJsZWF2ZWRfc2luY19yZXNhbXBsZXIuaCcsCi0gICAgICAgICdiYXNlL21lZGlhLmgnLAotICAgICAgICAnYmFzZS9tZWRpYV9sb2cuY2MnLAotICAgICAgICAnYmFzZS9tZWRpYV9sb2cuaCcsCi0gICAgICAgICdiYXNlL21lZGlhX2xvZ19ldmVudC5oJywKLSAgICAgICAgJ2Jhc2UvbWVkaWFfcG9zaXguY2MnLAotICAgICAgICAnYmFzZS9tZWRpYV9zd2l0Y2hlcy5jYycsCi0gICAgICAgICdiYXNlL21lZGlhX3N3aXRjaGVzLmgnLAotICAgICAgICAnYmFzZS9tZWRpYV93aW4uY2MnLAotICAgICAgICAnYmFzZS9tZXNzYWdlX2xvb3BfZmFjdG9yeS5jYycsCi0gICAgICAgICdiYXNlL21lc3NhZ2VfbG9vcF9mYWN0b3J5LmgnLAotICAgICAgICAnYmFzZS9tdWx0aV9jaGFubmVsX3Jlc2FtcGxlci5jYycsCi0gICAgICAgICdiYXNlL211bHRpX2NoYW5uZWxfcmVzYW1wbGVyLmgnLAotICAgICAgICAnYmFzZS9waXBlbGluZS5oJywKLSAgICAgICAgJ2Jhc2UvcGlwZWxpbmVfaW1wbC5jYycsCi0gICAgICAgICdiYXNlL3BpcGVsaW5lX2ltcGwuaCcsCi0gICAgICAgICdiYXNlL3BpcGVsaW5lX3N0YXR1cy5jYycsCi0gICAgICAgICdiYXNlL3BpcGVsaW5lX3N0YXR1cy5oJywKLSAgICAgICAgJ2Jhc2UvcmFuZ2VzLmNjJywKLSAgICAgICAgJ2Jhc2UvcmFuZ2VzLmgnLAotICAgICAgICAnYmFzZS9zYW1wbGVfZm9ybWF0LmNjJywKLSAgICAgICAgJ2Jhc2Uvc2FtcGxlX2Zvcm1hdC5oJywKLSAgICAgICAgJ2Jhc2Uvc2Vla2FibGVfYnVmZmVyLmNjJywKLSAgICAgICAgJ2Jhc2Uvc2Vla2FibGVfYnVmZmVyLmgnLAotICAgICAgICAnYmFzZS9zZXJpYWxfcnVubmVyLmNjJywKLSAgICAgICAgJ2Jhc2Uvc2VyaWFsX3J1bm5lci5oJywKLSAgICAgICAgJ2Jhc2Uvc2hlbGxfYXVkaW9fYnVzLmNjJywKLSAgICAgICAgJ2Jhc2Uvc2hlbGxfYXVkaW9fYnVzLmgnLAotICAgICAgICAnYmFzZS9zaGVsbF9idWZmZXJfZmFjdG9yeS5jYycsCi0gICAgICAgICdiYXNlL3NoZWxsX2J1ZmZlcl9mYWN0b3J5LmgnLAotICAgICAgICAnYmFzZS9zaGVsbF9kYXRhX3NvdXJjZV9yZWFkZXIuY2MnLAotICAgICAgICAnYmFzZS9zaGVsbF9kYXRhX3NvdXJjZV9yZWFkZXIuaCcsCi0gICAgICAgICdiYXNlL3NoZWxsX21lZGlhX3BsYXRmb3JtLmNjJywKLSAgICAgICAgJ2Jhc2Uvc2hlbGxfbWVkaWFfcGxhdGZvcm0uaCcsCi0gICAgICAgICdiYXNlL3NoZWxsX21lZGlhX3N0YXRpc3RpY3MuY2MnLAotICAgICAgICAnYmFzZS9zaGVsbF9tZWRpYV9zdGF0aXN0aWNzLmgnLAotICAgICAgICAnYmFzZS9zaGVsbF92aWRlb19kYXRhX2FsbG9jYXRvci5jYycsCi0gICAgICAgICdiYXNlL3NoZWxsX3ZpZGVvX2RhdGFfYWxsb2NhdG9yLmgnLAotICAgICAgICAnYmFzZS9zaGVsbF92aWRlb19mcmFtZV9wcm92aWRlci5jYycsCi0gICAgICAgICdiYXNlL3NoZWxsX3ZpZGVvX2ZyYW1lX3Byb3ZpZGVyLmgnLAotICAgICAgICAnYmFzZS9zaW5jX3Jlc2FtcGxlci5jYycsCi0gICAgICAgICdiYXNlL3NpbmNfcmVzYW1wbGVyLmgnLAotICAgICAgICAnYmFzZS9zdHJlYW1fcGFyc2VyLmNjJywKLSAgICAgICAgJ2Jhc2Uvc3RyZWFtX3BhcnNlci5oJywKLSAgICAgICAgJ2Jhc2Uvc3RyZWFtX3BhcnNlcl9idWZmZXIuY2MnLAotICAgICAgICAnYmFzZS9zdHJlYW1fcGFyc2VyX2J1ZmZlci5oJywKLSAgICAgICAgJ2Jhc2UvdmVjdG9yX21hdGguY2MnLAotICAgICAgICAnYmFzZS92ZWN0b3JfbWF0aC5oJywKLSAgICAgICAgJ2Jhc2UvdmlkZW9fZGVjb2Rlci5jYycsCi0gICAgICAgICdiYXNlL3ZpZGVvX2RlY29kZXIuaCcsCi0gICAgICAgICdiYXNlL3ZpZGVvX2RlY29kZXJfY29uZmlnLmNjJywKLSAgICAgICAgJ2Jhc2UvdmlkZW9fZGVjb2Rlcl9jb25maWcuaCcsCi0gICAgICAgICdiYXNlL3ZpZGVvX2ZyYW1lLmNjJywKLSAgICAgICAgJ2Jhc2UvdmlkZW9fZnJhbWUuaCcsCi0gICAgICAgICdiYXNlL3ZpZGVvX3JlbmRlcmVyLmNjJywKLSAgICAgICAgJ2Jhc2UvdmlkZW9fcmVuZGVyZXIuaCcsCi0gICAgICAgICdiYXNlL3ZpZGVvX3V0aWwuY2MnLAotICAgICAgICAnYmFzZS92aWRlb191dGlsLmgnLAotICAgICAgICAnY3J5cHRvL2Flc19kZWNyeXB0b3IuY2MnLAotICAgICAgICAnY3J5cHRvL2Flc19kZWNyeXB0b3IuaCcsCi0gICAgICAgICdjcnlwdG8vc2hlbGxfZGVjcnlwdG9yX2ZhY3RvcnkuY2MnLAotICAgICAgICAnY3J5cHRvL3NoZWxsX2RlY3J5cHRvcl9mYWN0b3J5LmgnLAotICAgICAgICAnZmZtcGVnL2ZmbXBlZ19jb21tb24uY2MnLAotICAgICAgICAnZmZtcGVnL2ZmbXBlZ19jb21tb24uaCcsCi0gICAgICAgICdmaWx0ZXJzL2F1ZGlvX2RlY29kZXJfc2VsZWN0b3IuY2MnLAotICAgICAgICAnZmlsdGVycy9hdWRpb19kZWNvZGVyX3NlbGVjdG9yLmgnLAotICAgICAgICAnZmlsdGVycy9hdWRpb19maWxlX3JlYWRlci5jYycsCi0gICAgICAgICdmaWx0ZXJzL2F1ZGlvX2ZpbGVfcmVhZGVyLmgnLAotICAgICAgICAnZmlsdGVycy9hdWRpb19yZW5kZXJlcl9hbGdvcml0aG0uY2MnLAotICAgICAgICAnZmlsdGVycy9hdWRpb19yZW5kZXJlcl9hbGdvcml0aG0uaCcsCi0gICAgICAgICdmaWx0ZXJzL2F1ZGlvX3JlbmRlcmVyX2ltcGwuY2MnLAotICAgICAgICAnZmlsdGVycy9hdWRpb19yZW5kZXJlcl9pbXBsLmgnLAotICAgICAgICAnZmlsdGVycy9ibG9ja2luZ191cmxfcHJvdG9jb2wuY2MnLAotICAgICAgICAnZmlsdGVycy9ibG9ja2luZ191cmxfcHJvdG9jb2wuaCcsCi0gICAgICAgICdmaWx0ZXJzL2NodW5rX2RlbXV4ZXIuY2MnLAotICAgICAgICAnZmlsdGVycy9jaHVua19kZW11eGVyLmgnLAotICAgICAgICAnZmlsdGVycy9kZWNyeXB0aW5nX2F1ZGlvX2RlY29kZXIuY2MnLAotICAgICAgICAnZmlsdGVycy9kZWNyeXB0aW5nX2F1ZGlvX2RlY29kZXIuaCcsCi0gICAgICAgICdmaWx0ZXJzL2RlY3J5cHRpbmdfZGVtdXhlcl9zdHJlYW0uY2MnLAotICAgICAgICAnZmlsdGVycy9kZWNyeXB0aW5nX2RlbXV4ZXJfc3RyZWFtLmgnLAotICAgICAgICAnZmlsdGVycy9kZWNyeXB0aW5nX3ZpZGVvX2RlY29kZXIuY2MnLAotICAgICAgICAnZmlsdGVycy9kZWNyeXB0aW5nX3ZpZGVvX2RlY29kZXIuaCcsCi0gICAgICAgICdmaWx0ZXJzL2R1bW15X2RlbXV4ZXIuY2MnLAotICAgICAgICAnZmlsdGVycy9kdW1teV9kZW11eGVyLmgnLAotICAgICAgICAnZmlsdGVycy9mZm1wZWdfYXVkaW9fZGVjb2Rlci5jYycsCi0gICAgICAgICdmaWx0ZXJzL2ZmbXBlZ19hdWRpb19kZWNvZGVyLmgnLAotICAgICAgICAnZmlsdGVycy9mZm1wZWdfZGVtdXhlci5jYycsCi0gICAgICAgICdmaWx0ZXJzL2ZmbXBlZ19kZW11eGVyLmgnLAotICAgICAgICAnZmlsdGVycy9mZm1wZWdfZ2x1ZS5jYycsCi0gICAgICAgICdmaWx0ZXJzL2ZmbXBlZ19nbHVlLmgnLAotICAgICAgICAnZmlsdGVycy9mZm1wZWdfaDI2NF90b19hbm5leF9iX2JpdHN0cmVhbV9jb252ZXJ0ZXIuY2MnLAotICAgICAgICAnZmlsdGVycy9mZm1wZWdfaDI2NF90b19hbm5leF9iX2JpdHN0cmVhbV9jb252ZXJ0ZXIuaCcsCi0gICAgICAgICdmaWx0ZXJzL2ZmbXBlZ192aWRlb19kZWNvZGVyLmNjJywKLSAgICAgICAgJ2ZpbHRlcnMvZmZtcGVnX3ZpZGVvX2RlY29kZXIuaCcsCi0gICAgICAgICdmaWx0ZXJzL2ZpbGVfZGF0YV9zb3VyY2UuY2MnLAotICAgICAgICAnZmlsdGVycy9maWxlX2RhdGFfc291cmNlLmgnLAotICAgICAgICAnZmlsdGVycy9ncHVfdmlkZW9fZGVjb2Rlci5jYycsCi0gICAgICAgICdmaWx0ZXJzL2dwdV92aWRlb19kZWNvZGVyLmgnLAotICAgICAgICAnZmlsdGVycy9oMjY0X3RvX2FubmV4X2JfYml0c3RyZWFtX2NvbnZlcnRlci5jYycsCi0gICAgICAgICdmaWx0ZXJzL2gyNjRfdG9fYW5uZXhfYl9iaXRzdHJlYW1fY29udmVydGVyLmgnLAotICAgICAgICAnZmlsdGVycy9pbl9tZW1vcnlfdXJsX3Byb3RvY29sLmNjJywKLSAgICAgICAgJ2ZpbHRlcnMvaW5fbWVtb3J5X3VybF9wcm90b2NvbC5oJywKLSAgICAgICAgJ2ZpbHRlcnMvb3B1c19hdWRpb19kZWNvZGVyLmNjJywKLSAgICAgICAgJ2ZpbHRlcnMvb3B1c19hdWRpb19kZWNvZGVyLmgnLAotICAgICAgICAnZmlsdGVycy9za2NhbnZhc192aWRlb19yZW5kZXJlci5jYycsCi0gICAgICAgICdmaWx0ZXJzL3NrY2FudmFzX3ZpZGVvX3JlbmRlcmVyLmgnLAotICAgICAgICAnZmlsdGVycy9zaGVsbF9hdS5jYycsCi0gICAgICAgICdmaWx0ZXJzL3NoZWxsX2F1LmgnLAotICAgICAgICAnZmlsdGVycy9zaGVsbF9hdWRpb19kZWNvZGVyX2ltcGwuY2MnLAotICAgICAgICAnZmlsdGVycy9zaGVsbF9hdWRpb19kZWNvZGVyX2ltcGwuaCcsCi0gICAgICAgICdmaWx0ZXJzL3NoZWxsX2F1ZGlvX3JlbmRlcmVyLmgnLAotICAgICAgICAnZmlsdGVycy9zaGVsbF9hdWRpb19yZW5kZXJlcl9pbXBsLmNjJywKLSAgICAgICAgJ2ZpbHRlcnMvc2hlbGxfYXVkaW9fcmVuZGVyZXJfaW1wbC5oJywKLSAgICAgICAgJ2ZpbHRlcnMvc2hlbGxfYXZjX3BhcnNlci5jYycsCi0gICAgICAgICdmaWx0ZXJzL3NoZWxsX2F2Y19wYXJzZXIuaCcsCi0gICAgICAgICdmaWx0ZXJzL3NoZWxsX2RlbXV4ZXIuY2MnLAotICAgICAgICAnZmlsdGVycy9zaGVsbF9kZW11eGVyLmgnLAotICAgICAgICAnZmlsdGVycy9zaGVsbF9mbHZfcGFyc2VyLmNjJywKLSAgICAgICAgJ2ZpbHRlcnMvc2hlbGxfZmx2X3BhcnNlci5oJywKLSAgICAgICAgJ2ZpbHRlcnMvc2hlbGxfbXA0X21hcC5jYycsCi0gICAgICAgICdmaWx0ZXJzL3NoZWxsX21wNF9tYXAuaCcsCi0gICAgICAgICdmaWx0ZXJzL3NoZWxsX21wNF9wYXJzZXIuY2MnLAotICAgICAgICAnZmlsdGVycy9zaGVsbF9tcDRfcGFyc2VyLmgnLAotICAgICAgICAnZmlsdGVycy9zaGVsbF9wYXJzZXIuY2MnLAotICAgICAgICAnZmlsdGVycy9zaGVsbF9wYXJzZXIuaCcsCi0gICAgICAgICdmaWx0ZXJzL3NoZWxsX3Jhd19hdWRpb19kZWNvZGVyX3N0dWIuY2MnLAotICAgICAgICAnZmlsdGVycy9zaGVsbF9yYXdfYXVkaW9fZGVjb2Rlcl9zdHViLmgnLAotICAgICAgICAnZmlsdGVycy9zaGVsbF9yYXdfdmlkZW9fZGVjb2Rlcl9zdHViLmNjJywKLSAgICAgICAgJ2ZpbHRlcnMvc2hlbGxfcmF3X3ZpZGVvX2RlY29kZXJfc3R1Yi5oJywKLSAgICAgICAgJ2ZpbHRlcnMvc2hlbGxfcmJzcF9zdHJlYW0uY2MnLAotICAgICAgICAnZmlsdGVycy9zaGVsbF9yYnNwX3N0cmVhbS5oJywKLSAgICAgICAgJ2ZpbHRlcnMvc2hlbGxfdmlkZW9fZGVjb2Rlcl9pbXBsLmNjJywKLSAgICAgICAgJ2ZpbHRlcnMvc2hlbGxfdmlkZW9fZGVjb2Rlcl9pbXBsLmgnLAotICAgICAgICAnZmlsdGVycy9zb3VyY2VfYnVmZmVyX3N0cmVhbS5jYycsCi0gICAgICAgICdmaWx0ZXJzL3NvdXJjZV9idWZmZXJfc3RyZWFtLmgnLAotICAgICAgICAnZmlsdGVycy92aWRlb19kZWNvZGVyX3NlbGVjdG9yLmNjJywKLSAgICAgICAgJ2ZpbHRlcnMvdmlkZW9fZGVjb2Rlcl9zZWxlY3Rvci5oJywKLSAgICAgICAgJ2ZpbHRlcnMvdmlkZW9fZnJhbWVfZ2VuZXJhdG9yLmNjJywKLSAgICAgICAgJ2ZpbHRlcnMvdmlkZW9fZnJhbWVfZ2VuZXJhdG9yLmgnLAotICAgICAgICAnZmlsdGVycy92aWRlb19yZW5kZXJlcl9iYXNlLmNjJywKLSAgICAgICAgJ2ZpbHRlcnMvdmlkZW9fcmVuZGVyZXJfYmFzZS5oJywKLSAgICAgICAgJ21wNC9hYWMuY2MnLAotICAgICAgICAnbXA0L2FhYy5oJywKLSAgICAgICAgJ21wNC9hdmMuY2MnLAotICAgICAgICAnbXA0L2F2Yy5oJywKLSAgICAgICAgJ21wNC9ib3hfZGVmaW5pdGlvbnMuY2MnLAotICAgICAgICAnbXA0L2JveF9kZWZpbml0aW9ucy5oJywKLSAgICAgICAgJ21wNC9ib3hfcmVhZGVyLmNjJywKLSAgICAgICAgJ21wNC9ib3hfcmVhZGVyLmgnLAotICAgICAgICAnbXA0L2NlbmMuY2MnLAotICAgICAgICAnbXA0L2NlbmMuaCcsCi0gICAgICAgICdtcDQvZXNfZGVzY3JpcHRvci5jYycsCi0gICAgICAgICdtcDQvZXNfZGVzY3JpcHRvci5oJywKLSAgICAgICAgJ21wNC9tcDRfc3RyZWFtX3BhcnNlci5jYycsCi0gICAgICAgICdtcDQvbXA0X3N0cmVhbV9wYXJzZXIuaCcsCi0gICAgICAgICdtcDQvb2Zmc2V0X2J5dGVfcXVldWUuY2MnLAotICAgICAgICAnbXA0L29mZnNldF9ieXRlX3F1ZXVlLmgnLAotICAgICAgICAnbXA0L3RyYWNrX3J1bl9pdGVyYXRvci5jYycsCi0gICAgICAgICdtcDQvdHJhY2tfcnVuX2l0ZXJhdG9yLmgnLAotICAgICAgICAndmlkZW8vY2FwdHVyZS9mYWtlX3ZpZGVvX2NhcHR1cmVfZGV2aWNlLmNjJywKLSAgICAgICAgJ3ZpZGVvL2NhcHR1cmUvZmFrZV92aWRlb19jYXB0dXJlX2RldmljZS5oJywKLSAgICAgICAgJ3ZpZGVvL2NhcHR1cmUvbGludXgvdmlkZW9fY2FwdHVyZV9kZXZpY2VfbGludXguY2MnLAotICAgICAgICAndmlkZW8vY2FwdHVyZS9saW51eC92aWRlb19jYXB0dXJlX2RldmljZV9saW51eC5oJywKLSAgICAgICAgJ3ZpZGVvL2NhcHR1cmUvbWFjL3ZpZGVvX2NhcHR1cmVfZGV2aWNlX21hYy5oJywKLSAgICAgICAgJ3ZpZGVvL2NhcHR1cmUvbWFjL3ZpZGVvX2NhcHR1cmVfZGV2aWNlX21hYy5tbScsCi0gICAgICAgICd2aWRlby9jYXB0dXJlL21hYy92aWRlb19jYXB0dXJlX2RldmljZV9xdGtpdF9tYWMuaCcsCi0gICAgICAgICd2aWRlby9jYXB0dXJlL21hYy92aWRlb19jYXB0dXJlX2RldmljZV9xdGtpdF9tYWMubW0nLAotICAgICAgICAndmlkZW8vY2FwdHVyZS92aWRlb19jYXB0dXJlLmgnLAotICAgICAgICAndmlkZW8vY2FwdHVyZS92aWRlb19jYXB0dXJlX2RldmljZS5oJywKLSAgICAgICAgJ3ZpZGVvL2NhcHR1cmUvdmlkZW9fY2FwdHVyZV9kZXZpY2VfZHVtbXkuY2MnLAotICAgICAgICAndmlkZW8vY2FwdHVyZS92aWRlb19jYXB0dXJlX2RldmljZV9kdW1teS5oJywKLSAgICAgICAgJ3ZpZGVvL2NhcHR1cmUvdmlkZW9fY2FwdHVyZV9wcm94eS5jYycsCi0gICAgICAgICd2aWRlby9jYXB0dXJlL3ZpZGVvX2NhcHR1cmVfcHJveHkuaCcsCi0gICAgICAgICd2aWRlby9jYXB0dXJlL3ZpZGVvX2NhcHR1cmVfdHlwZXMuaCcsCi0gICAgICAgICd2aWRlby9jYXB0dXJlL3dpbi9jYXBhYmlsaXR5X2xpc3Rfd2luLmNjJywKLSAgICAgICAgJ3ZpZGVvL2NhcHR1cmUvd2luL2NhcGFiaWxpdHlfbGlzdF93aW4uaCcsCi0gICAgICAgICd2aWRlby9jYXB0dXJlL3dpbi9maWx0ZXJfYmFzZV93aW4uY2MnLAotICAgICAgICAndmlkZW8vY2FwdHVyZS93aW4vZmlsdGVyX2Jhc2Vfd2luLmgnLAotICAgICAgICAndmlkZW8vY2FwdHVyZS93aW4vcGluX2Jhc2Vfd2luLmNjJywKLSAgICAgICAgJ3ZpZGVvL2NhcHR1cmUvd2luL3Bpbl9iYXNlX3dpbi5oJywKLSAgICAgICAgJ3ZpZGVvL2NhcHR1cmUvd2luL3NpbmtfZmlsdGVyX29ic2VydmVyX3dpbi5oJywKLSAgICAgICAgJ3ZpZGVvL2NhcHR1cmUvd2luL3NpbmtfZmlsdGVyX3dpbi5jYycsCi0gICAgICAgICd2aWRlby9jYXB0dXJlL3dpbi9zaW5rX2ZpbHRlcl93aW4uaCcsCi0gICAgICAgICd2aWRlby9jYXB0dXJlL3dpbi9zaW5rX2lucHV0X3Bpbl93aW4uY2MnLAotICAgICAgICAndmlkZW8vY2FwdHVyZS93aW4vc2lua19pbnB1dF9waW5fd2luLmgnLAotICAgICAgICAndmlkZW8vY2FwdHVyZS93aW4vdmlkZW9fY2FwdHVyZV9kZXZpY2VfbWZfd2luLmNjJywKLSAgICAgICAgJ3ZpZGVvL2NhcHR1cmUvd2luL3ZpZGVvX2NhcHR1cmVfZGV2aWNlX21mX3dpbi5oJywKLSAgICAgICAgJ3ZpZGVvL2NhcHR1cmUvd2luL3ZpZGVvX2NhcHR1cmVfZGV2aWNlX3dpbi5jYycsCi0gICAgICAgICd2aWRlby9jYXB0dXJlL3dpbi92aWRlb19jYXB0dXJlX2RldmljZV93aW4uaCcsCi0gICAgICAgICd2aWRlby9waWN0dXJlLmNjJywKLSAgICAgICAgJ3ZpZGVvL3BpY3R1cmUuaCcsCi0gICAgICAgICd2aWRlby92aWRlb19kZWNvZGVfYWNjZWxlcmF0b3IuY2MnLAotICAgICAgICAndmlkZW8vdmlkZW9fZGVjb2RlX2FjY2VsZXJhdG9yLmgnLAotICAgICAgICAnd2VibS93ZWJtX2F1ZGlvX2NsaWVudC5jYycsCi0gICAgICAgICd3ZWJtL3dlYm1fYXVkaW9fY2xpZW50LmgnLAotICAgICAgICAnd2VibS93ZWJtX2NsdXN0ZXJfcGFyc2VyLmNjJywKLSAgICAgICAgJ3dlYm0vd2VibV9jbHVzdGVyX3BhcnNlci5oJywKLSAgICAgICAgJ3dlYm0vd2VibV9jb2xvdXJfcGFyc2VyLmNjJywKLSAgICAgICAgJ3dlYm0vd2VibV9jb2xvdXJfcGFyc2VyLmgnLAotICAgICAgICAnd2VibS93ZWJtX2NvbnN0YW50cy5oJywKLSAgICAgICAgJ3dlYm0vd2VibV9jb250ZW50X2VuY29kaW5ncy5jYycsCi0gICAgICAgICd3ZWJtL3dlYm1fY29udGVudF9lbmNvZGluZ3MuaCcsCi0gICAgICAgICd3ZWJtL3dlYm1fY29udGVudF9lbmNvZGluZ3NfY2xpZW50LmNjJywKLSAgICAgICAgJ3dlYm0vd2VibV9jb250ZW50X2VuY29kaW5nc19jbGllbnQuaCcsCi0gICAgICAgICd3ZWJtL3dlYm1faW5mb19wYXJzZXIuY2MnLAotICAgICAgICAnd2VibS93ZWJtX2luZm9fcGFyc2VyLmgnLAotICAgICAgICAnd2VibS93ZWJtX3BhcnNlci5jYycsCi0gICAgICAgICd3ZWJtL3dlYm1fcGFyc2VyLmgnLAotICAgICAgICAnd2VibS93ZWJtX3N0cmVhbV9wYXJzZXIuY2MnLAotICAgICAgICAnd2VibS93ZWJtX3N0cmVhbV9wYXJzZXIuaCcsCi0gICAgICAgICd3ZWJtL3dlYm1fdHJhY2tzX3BhcnNlci5jYycsCi0gICAgICAgICd3ZWJtL3dlYm1fdHJhY2tzX3BhcnNlci5oJywKLSAgICAgICAgJ3dlYm0vd2VibV92aWRlb19jbGllbnQuY2MnLAotICAgICAgICAnd2VibS93ZWJtX3ZpZGVvX2NsaWVudC5oJywKLSAgICAgIF0sCi0gICAgICAnZGlyZWN0X2RlcGVuZGVudF9zZXR0aW5ncyc6IHsKLSAgICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKLSAgICAgICAgICAnLi4nLAotICAgICAgICBdLAotICAgICAgfSwKLSAgICAgICdjb25kaXRpb25zJzogWwotICAgICAgICBbJ2FybV9uZW9uID09IDEnLCB7Ci0gICAgICAgICAgJ2RlZmluZXMnOiBbCi0gICAgICAgICAgICAnVVNFX05FT04nCi0gICAgICAgICAgXSwKLSAgICAgICAgfV0sCi0gICAgICAgIFsnT1MgIT0gImlvcyInLCB7Ci0gICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgICAgICcuLi9iYXNlL3RoaXJkX3BhcnR5L2R5bmFtaWNfYW5ub3RhdGlvbnMvZHluYW1pY19hbm5vdGF0aW9ucy5neXA6ZHluYW1pY19hbm5vdGF0aW9ucycsCi0gICAgICAgICAgICAnc2hhcmVkX21lbW9yeV9zdXBwb3J0JywKLSAgICAgICAgICBdLAotICAgICAgICB9XSwKLSAgICAgICAgWydPUyAhPSAiaW9zIiBhbmQgY29iYWx0ICE9IDEnLCB7Ci0gICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgICAgICMgVGhpcyBpcyBvbmx5IHVzZWQgaW4gW3gxMXxnbHxza2NhbnZhc11fdmlkZW9fcmVuZGVyZXIuY2MsIGJ1dCBub3QKLSAgICAgICAgICAgICMgd2hlbiBjb21waWxpbmcgQ29iYWx0LiBXaGVuIGxpbmtpbmcgYXMgYSBzaGFyZWQgbGlicmFyeSwgdGhlCi0gICAgICAgICAgICAjIHVudXNlZCBvcHRpbWl6ZWQgWVVWIGZ1bmN0aW9ucyBhcmUgbGVmdCBhcyB1bmRlZmluZWQgc3ltYm9scwotICAgICAgICAgICAgIyBhZnRlciB0aGV5IGdldCBkZWFkLXN0cmlwcGVkLgotICAgICAgICAgICAgJ3l1dl9jb252ZXJ0JywKLSAgICAgICAgICBdLAotICAgICAgICB9XSwKLSAgICAgICAgWyd1c2VfZmZtcGVnID09IDEnLCB7Ci0gICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgICAgICcuLi90aGlyZF9wYXJ0eS9mZm1wZWcvZmZtcGVnLmd5cDpmZm1wZWcnLAotICAgICAgICAgIF0sCi0gICAgICAgIH0sIHsgICMgdXNlX2ZmbXBlZyA9PSAwCi0gICAgICAgICAgIyBFeGNsdWRlIHRoZSBzb3VyY2VzIHRoYXQgZGVwZW5kIG9uIGZmbXBlZy4KLSAgICAgICAgICAnc291cmNlcyEnOiBbCi0gICAgICAgICAgICAnYmFzZS9tZWRpYV9wb3NpeC5jYycsCi0gICAgICAgICAgICAnZmZtcGVnL2ZmbXBlZ19jb21tb24uY2MnLAotICAgICAgICAgICAgJ2ZmbXBlZy9mZm1wZWdfY29tbW9uLmgnLAotICAgICAgICAgICAgJ2ZpbHRlcnMvYXVkaW9fZmlsZV9yZWFkZXIuY2MnLAotICAgICAgICAgICAgJ2ZpbHRlcnMvYXVkaW9fZmlsZV9yZWFkZXIuaCcsCi0gICAgICAgICAgICAnZmlsdGVycy9jaHVua19kZW11eGVyLmNjJywKLSAgICAgICAgICAgICdmaWx0ZXJzL2NodW5rX2RlbXV4ZXIuaCcsCi0gICAgICAgICAgICAnZmlsdGVycy9ibG9ja2luZ191cmxfcHJvdG9jb2wuY2MnLAotICAgICAgICAgICAgJ2ZpbHRlcnMvYmxvY2tpbmdfdXJsX3Byb3RvY29sLmgnLAotICAgICAgICAgICAgJ2ZpbHRlcnMvZmZtcGVnX2F1ZGlvX2RlY29kZXIuY2MnLAotICAgICAgICAgICAgJ2ZpbHRlcnMvZmZtcGVnX2F1ZGlvX2RlY29kZXIuaCcsCi0gICAgICAgICAgICAnZmlsdGVycy9mZm1wZWdfZGVtdXhlci5jYycsCi0gICAgICAgICAgICAnZmlsdGVycy9mZm1wZWdfZGVtdXhlci5oJywKLSAgICAgICAgICAgICdmaWx0ZXJzL2ZmbXBlZ19nbHVlLmNjJywKLSAgICAgICAgICAgICdmaWx0ZXJzL2ZmbXBlZ19nbHVlLmgnLAotICAgICAgICAgICAgJ2ZpbHRlcnMvZmZtcGVnX2gyNjRfdG9fYW5uZXhfYl9iaXRzdHJlYW1fY29udmVydGVyLmNjJywKLSAgICAgICAgICAgICdmaWx0ZXJzL2ZmbXBlZ19oMjY0X3RvX2FubmV4X2JfYml0c3RyZWFtX2NvbnZlcnRlci5oJywKLSAgICAgICAgICAgICdmaWx0ZXJzL2ZmbXBlZ192aWRlb19kZWNvZGVyLmNjJywKLSAgICAgICAgICAgICdmaWx0ZXJzL2ZmbXBlZ192aWRlb19kZWNvZGVyLmgnLAotICAgICAgICAgIF0sCi0gICAgICAgIH1dLAotICAgICAgICBbJ09TID09ICJsYl9zaGVsbCIgb3IgT1MgPT0gInN0YXJib2FyZCInLCB7Ci0gICAgICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKLSAgICAgICAgICAgICc8KERFUFRIKS8uLi8uLicsICMgZm9yIG91ciBleHBsaWNpdCBleHRlcm5hbC8gaW5jbHVzaW9uIG9mIGhlYWRlcnMKLSAgICAgICAgICBdLAotICAgICAgICAgICdzb3VyY2VzLyc6IFsKLSAgICAgICAgICAgIFsnZXhjbHVkZScsICdhbmRyb2lkJ10sCi0gICAgICAgICAgICAjIG1lZGlhIGlzIG5vdCBleGNsdWRpbmcgd2luZG93cyBzb3VyY2VzIGF1dG9tYXRpY2FsbHkuCi0gICAgICAgICAgICAjIGZvcmNpYmx5IGV4Y2x1ZGUgdGhlbS4KLSAgICAgICAgICAgIFsnZXhjbHVkZScsICd3aW4nXSwKLSAgICAgICAgICAgIFsnZXhjbHVkZScsICdhdWRpby9hdWRpb19kZXZpY2VfdGhyZWFkJ10sCi0gICAgICAgICAgICBbJ2V4Y2x1ZGUnLCAnYXVkaW8vYXVkaW9faW5wdXRfc3RyZWFtX2ltcGwnXSwKLSAgICAgICAgICAgIFsnZXhjbHVkZScsICdhdWRpby9hdWRpb19pby5oJ10sCi0gICAgICAgICAgICBbJ2V4Y2x1ZGUnLCAnYXVkaW8vYXVkaW9faW5wdXRfY29udHJvbGxlciddLAotICAgICAgICAgICAgWydleGNsdWRlJywgJ2F1ZGlvL2F1ZGlvX2lucHV0X2RldmljZSddLAotICAgICAgICAgICAgWydleGNsdWRlJywgJ2F1ZGlvL2F1ZGlvX21hbmFnZXInXSwKLSAgICAgICAgICAgIFsnZXhjbHVkZScsICdhdWRpby9hdWRpb19tYW5hZ2VyX2Jhc2UnXSwKLSAgICAgICAgICAgIFsnZXhjbHVkZScsICdhdWRpby9hdWRpb19vdXRwdXRfY29udHJvbGxlciddLAotICAgICAgICAgICAgWydleGNsdWRlJywgJ2F1ZGlvL2F1ZGlvX291dHB1dF9kZXZpY2UnXSwKLSAgICAgICAgICAgIFsnZXhjbHVkZScsICdhdWRpby9hdWRpb19vdXRwdXRfZGlzcGF0Y2hlciddLAotICAgICAgICAgICAgWydleGNsdWRlJywgJ2F1ZGlvL2F1ZGlvX291dHB1dF9kaXNwYXRjaGVyX2ltcGwnXSwKLSAgICAgICAgICAgIFsnZXhjbHVkZScsICdhdWRpby9hdWRpb19vdXRwdXRfaXBjJ10sCi0gICAgICAgICAgICBbJ2V4Y2x1ZGUnLCAnYXVkaW8vYXVkaW9fb3V0cHV0X3Byb3h5J10sCi0gICAgICAgICAgICBbJ2V4Y2x1ZGUnLCAnYXVkaW8vYXVkaW9fb3V0cHV0X3Jlc2FtcGxlciddLAotICAgICAgICAgICAgWydleGNsdWRlJywgJ2F1ZGlvL2Nyb3NzX3Byb2Nlc3Nfbm90aWZpY2F0aW9uJ10sCi0gICAgICAgICAgICBbJ2V4Y2x1ZGUnLCAnYXVkaW8vY3Jvc3NfcHJvY2Vzc19ub3RpZmljYXRpb25fcG9zaXgnXSwKLSAgICAgICAgICAgIFsnZXhjbHVkZScsICdhdWRpby9jcm9zc19wcm9jZXNzX25vdGlmaWNhdGlvbl93aW4nXSwKLSAgICAgICAgICAgIFsnZXhjbHVkZScsICdhdWRpby9mYWtlX2F1ZGlvX2lucHV0X3N0cmVhbSddLAotICAgICAgICAgICAgWydleGNsdWRlJywgJ2F1ZGlvL2Zha2VfYXVkaW9fb3V0cHV0X3N0cmVhbSddLAotICAgICAgICAgICAgWydleGNsdWRlJywgJ2F1ZGlvL2lvcy9hdWRpb19tYW5hZ2VyX2lvcyddLAotICAgICAgICAgICAgWydleGNsdWRlJywgJ2F1ZGlvL2xpbnV4L2Fsc2FfaW5wdXQnXSwKLSAgICAgICAgICAgIFsnZXhjbHVkZScsICdhdWRpby9saW51eC9hbHNhX291dHB1dCddLAotICAgICAgICAgICAgWydleGNsdWRlJywgJ2F1ZGlvL2xpbnV4L2Fsc2FfdXRpbCddLAotICAgICAgICAgICAgWydleGNsdWRlJywgJ2F1ZGlvL2xpbnV4L2Fsc2Ffd3JhcHBlciddLAotICAgICAgICAgICAgWydleGNsdWRlJywgJ2F1ZGlvL2xpbnV4L2F1ZGlvX21hbmFnZXJfbGludXgnXSwKLSAgICAgICAgICAgIFsnZXhjbHVkZScsICdhdWRpby9saW51eC9jcmFzX2lucHV0J10sCi0gICAgICAgICAgICBbJ2V4Y2x1ZGUnLCAnYXVkaW8vbGludXgvY3Jhc19vdXRwdXQnXSwKLSAgICAgICAgICAgIFsnZXhjbHVkZScsICdhdWRpby9tYWMvYXVkaW9faW5wdXRfbWFjJ10sCi0gICAgICAgICAgICBbJ2V4Y2x1ZGUnLCAnYXVkaW8vbWFjL2F1ZGlvX2xvd19sYXRlbmN5X2lucHV0X21hYyddLAotICAgICAgICAgICAgWydleGNsdWRlJywgJ2F1ZGlvL21hYy9hdWRpb19sb3dfbGF0ZW5jeV9vdXRwdXRfbWFjJ10sCi0gICAgICAgICAgICBbJ2V4Y2x1ZGUnLCAnYXVkaW8vbWFjL2F1ZGlvX21hbmFnZXJfbWFjJ10sCi0gICAgICAgICAgICBbJ2V4Y2x1ZGUnLCAnYXVkaW8vbWFjL2F1ZGlvX291dHB1dF9tYWMnXSwKLSAgICAgICAgICAgIFsnZXhjbHVkZScsICdhdWRpby9tYWMvYXVkaW9fc3luY2hyb25pemVkX21hYyddLAotICAgICAgICAgICAgWydleGNsdWRlJywgJ2F1ZGlvL21hYy9hdWRpb191bmlmaWVkX21hYyddLAotICAgICAgICAgICAgWydleGNsdWRlJywgJ2F1ZGlvL29wZW5ic2QvYXVkaW9fbWFuYWdlcl9vcGVuYnNkJ10sCi0gICAgICAgICAgICBbJ2V4Y2x1ZGUnLCAnYXVkaW8vcHVsc2UvcHVsc2Vfb3V0cHV0J10sCi0gICAgICAgICAgICBbJ2V4Y2x1ZGUnLCAnYXVkaW8vc2NvcGVkX2xvb3Bfb2JzZXJ2ZXInXSwKLSAgICAgICAgICAgIFsnZXhjbHVkZScsICdhdWRpby9zaW1wbGVfc291cmNlcyddLAotICAgICAgICAgICAgWydleGNsdWRlJywgJ2F1ZGlvL3ZpcnR1YWxfYXVkaW9faW5wdXRfc3RyZWFtJ10sCi0gICAgICAgICAgICBbJ2V4Y2x1ZGUnLCAnYXVkaW8vdmlydHVhbF9hdWRpb19vdXRwdXRfc3RyZWFtJ10sCi0gICAgICAgICAgICBbJ2V4Y2x1ZGUnLCAnYXVkaW8vd2luL2F1ZGlvX2RldmljZV9saXN0ZW5lcl93aW4nXSwKLSAgICAgICAgICAgIFsnZXhjbHVkZScsICdhdWRpby93aW4vYXVkaW9fbG93X2xhdGVuY3lfaW5wdXRfd2luJ10sCi0gICAgICAgICAgICBbJ2V4Y2x1ZGUnLCAnYXVkaW8vd2luL2F1ZGlvX2xvd19sYXRlbmN5X291dHB1dF93aW4nXSwKLSAgICAgICAgICAgIFsnZXhjbHVkZScsICdhdWRpby93aW4vYXVkaW9fbWFuYWdlcl93aW4nXSwKLSAgICAgICAgICAgIFsnZXhjbHVkZScsICdhdWRpby93aW4vYXVkaW9fdW5pZmllZF93aW4nXSwKLSAgICAgICAgICAgIFsnZXhjbHVkZScsICdhdWRpby93aW4vYXZydF93cmFwcGVyX3dpbiddLAotICAgICAgICAgICAgWydleGNsdWRlJywgJ2F1ZGlvL3dpbi9kZXZpY2VfZW51bWVyYXRpb25fd2luJ10sCi0gICAgICAgICAgICBbJ2V4Y2x1ZGUnLCAnYXVkaW8vd2luL2NvcmVfYXVkaW9fdXRpbF93aW4nXSwKLSAgICAgICAgICAgIFsnZXhjbHVkZScsICdhdWRpby93aW4vd2F2ZWluX2lucHV0X3dpbiddLAotICAgICAgICAgICAgWydleGNsdWRlJywgJ2F1ZGlvL3dpbi93YXZlb3V0X291dHB1dF93aW4nXSwKLSAgICAgICAgICAgICMgd2UgdXNlIGhhcmR3YXJlIG1peGVycwotICAgICAgICAgICAgWydleGNsdWRlJywgJ2Jhc2UvYXVkaW9fY29udmVydGVyJ10sCi0gICAgICAgICAgICBbJ2V4Y2x1ZGUnLCAnYmFzZS9hdWRpb19yZW5kZXJlcl9taXhlciddLAotICAgICAgICAgICAgWydleGNsdWRlJywgJ2Jhc2UvY2hhbm5lbF9taXhlciddLAotICAgICAgICAgICAgIyB3ZSB1c2Ugb3VyIG93biBlbmNyeXB0aW9uCi0gICAgICAgICAgICBbJ2V4Y2x1ZGUnLCAnY3J5cHRvL2FlcyddLAotICAgICAgICAgICAgIyB3ZSB1c2Ugb3VyIG93biBBdWRpb1JlbmRlcmVyQWxnb3JpdGhtIGFuZCBJbXBsCi0gICAgICAgICAgICBbJ2V4Y2x1ZGUnLCAnZmlsdGVycy9hdWRpb19yZW5kZXJlciddLAotICAgICAgICAgICAgIyBidXQgcmUtdXNlIHZhcmlvdXMgb3RoZXIgcGFydHMgb2YgdGhlIHN0YWNrCi0gICAgICAgICAgICBbJ2luY2x1ZGUnLCAnZmlsdGVycy9jaHVua19kZW11eGVyJ10sCi0gICAgICAgICAgICBbJ2V4Y2x1ZGUnLCAnZmlsdGVycy9kZWNyeXB0aW5nX2F1ZGlvX2RlY29kZXInXSwKLSAgICAgICAgICAgIFsnZXhjbHVkZScsICdmaWx0ZXJzL2RlY3J5cHRpbmdfdmlkZW9fZGVjb2RlciddLAotICAgICAgICAgICAgIyB3ZSBzdHJlYW0gZnJvbSBuZXR3b3JrIG9ubHkKLSAgICAgICAgICAgIFsnZXhjbHVkZScsICdmaWx0ZXJzL2ZpbGVfZGF0YV9zb3VyY2UnXSwKLSAgICAgICAgICAgICMgZ3B1LWJhc2VkIGRlY29kaW5nIGlzIGludGVyZXN0aW5nLCBwZXJoYXBzIGV4cGxvcmUgZnVydGhlcgotICAgICAgICAgICAgWydleGNsdWRlJywgJ2ZpbHRlcnMvZ3B1J10sCi0gICAgICAgICAgICAjIGF2Yy9hYWMgb25seSAoZm9yIG5vdykKLSAgICAgICAgICAgIFsnZXhjbHVkZScsICdmaWx0ZXJzL29wdXMnXSwKLSAgICAgICAgICAgIFsnZXhjbHVkZScsICd2aWRlby9jYXB0dXJlL2Zha2VfdmlkZW9fY2FwdHVyZV9kZXZpY2UnXSwKLSAgICAgICAgICBdLAotICAgICAgICAgICdjb25kaXRpb25zJzogWwotICAgICAgICAgICAgWyd0YXJnZXRfYXJjaD09ImxpbnV4IicsIHsKLSAgICAgICAgICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICAgICAgICAgJ2F1ZGlvL3NoZWxsX2F1ZGlvX3N0cmVhbWVyX2xpbnV4LmNjJywKLSAgICAgICAgICAgICAgICAnYXVkaW8vc2hlbGxfYXVkaW9fc3RyZWFtZXJfbGludXguaCcsCi0gICAgICAgICAgICAgICAgJ2F1ZGlvL3NoZWxsX3B1bHNlX2F1ZGlvLmNjJywKLSAgICAgICAgICAgICAgICAnYXVkaW8vc2hlbGxfcHVsc2VfYXVkaW8uaCcsCi0gICAgICAgICAgICAgICAgJ2ZpbHRlcnMvc2hlbGxfZmZtcGVnLmNjJywKLSAgICAgICAgICAgICAgICAnZmlsdGVycy9zaGVsbF9mZm1wZWcuaCcsCi0gICAgICAgICAgICAgICAgJ2ZpbHRlcnMvc2hlbGxfcmF3X2F1ZGlvX2RlY29kZXJfbGludXguY2MnLAotICAgICAgICAgICAgICAgICdmaWx0ZXJzL3NoZWxsX3Jhd19hdWRpb19kZWNvZGVyX2xpbnV4LmgnLAotICAgICAgICAgICAgICAgICdmaWx0ZXJzL3NoZWxsX3Jhd192aWRlb19kZWNvZGVyX2xpbnV4LmNjJywKLSAgICAgICAgICAgICAgICAnZmlsdGVycy9zaGVsbF9yYXdfdmlkZW9fZGVjb2Rlcl9saW51eC5oJywKLSAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgIH1dLAotICAgICAgICAgICAgWyd0YXJnZXRfYXJjaD09InBzMyInLCB7Ci0gICAgICAgICAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAgICAgICAgICdiYXNlL3NoZWxsX2NhY2hlZF9kZWNvZGVyX2J1ZmZlci5jYycsCi0gICAgICAgICAgICAgICAgJ2Jhc2Uvc2hlbGxfY2FjaGVkX2RlY29kZXJfYnVmZmVyLmgnLAotICAgICAgICAgICAgICAgICdhdWRpby9zaGVsbF9hdWRpb19zdHJlYW1lcl9wczMuY2MnLAotICAgICAgICAgICAgICAgICdhdWRpby9zaGVsbF9hdWRpb19zdHJlYW1lcl9wczMuaCcsCi0gICAgICAgICAgICAgICAgJ2F1ZGlvL3NoZWxsX2F1ZGlvX3N0cmVhbWVyX3YyX3BzMy5jYycsCi0gICAgICAgICAgICAgICAgJ2F1ZGlvL3NoZWxsX2F1ZGlvX3N0cmVhbWVyX3YyX3BzMy5oJywKLSAgICAgICAgICAgICAgICAnYXVkaW8vc2hlbGxfc3B1cnNfcHMzLmNjJywKLSAgICAgICAgICAgICAgICAnYXVkaW8vc2hlbGxfc3B1cnNfcHMzLmgnLAotICAgICAgICAgICAgICAgICdmaWx0ZXJzL3NoZWxsX2F1ZGlvX2RlY29kZXJfcHMzLmNjJywKLSAgICAgICAgICAgICAgICAnZmlsdGVycy9zaGVsbF9hdWRpb19kZWNvZGVyX3BzMy5oJywKLSAgICAgICAgICAgICAgICAnZmlsdGVycy9zaGVsbF9hdWRpb19yZW5kZXJlcl9wczMuY2MnLAotICAgICAgICAgICAgICAgICdmaWx0ZXJzL3NoZWxsX2F1ZGlvX3JlbmRlcmVyX3BzMy5oJywKLSAgICAgICAgICAgICAgICAnZmlsdGVycy9zaGVsbF9hdWRpb19yZXNhbXBsZXJfcHMzLmNjJywKLSAgICAgICAgICAgICAgICAnZmlsdGVycy9zaGVsbF9hdWRpb19yZXNhbXBsZXJfcHMzLmgnLAotICAgICAgICAgICAgICAgICdmaWx0ZXJzL3NoZWxsX3Jhd19hdWRpb19kZWNvZGVyX3BzMy5jYycsCi0gICAgICAgICAgICAgICAgJ2ZpbHRlcnMvc2hlbGxfcmF3X2F1ZGlvX2RlY29kZXJfcHMzLmgnLAotICAgICAgICAgICAgICAgICdmaWx0ZXJzL3NoZWxsX3Jhd192aWRlb19kZWNvZGVyX3BzMy5jYycsCi0gICAgICAgICAgICAgICAgJ2ZpbHRlcnMvc2hlbGxfcmF3X3ZpZGVvX2RlY29kZXJfcHMzLmgnLAotICAgICAgICAgICAgICAgICdmaWx0ZXJzL3NoZWxsX3ZkZWNfaGVscGVyX3BzMy5jYycsCi0gICAgICAgICAgICAgICAgJ2ZpbHRlcnMvc2hlbGxfdmRlY19oZWxwZXJfcHMzLmgnLAotICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgICAnc291cmNlcy8nOiBbCi0gICAgICAgICAgICAgICAgIyBQUzMgaGFzIGl0cyBvd24gaW1wbGVtZW50YXRpb25zLgotICAgICAgICAgICAgICAgIFsnZXhjbHVkZScsICdmaWx0ZXJzL3NoZWxsX2F1ZGlvX3JlbmRlcmVyX2ltcGwnXSwKLSAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICAgJ2RlcGVuZGVuY2llcycgOiBbCi0gICAgICAgICAgICAgICAgJ3NwdXJzX3Rhc2tzJywKLSAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgIH1dLAotICAgICAgICAgICAgWyd0YXJnZXRfYXJjaD09InBzNCInLCB7Ci0gICAgICAgICAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAgICAgICAgICdhdWRpby9zaGVsbF9hdWRpb19zdHJlYW1lcl9wczQuY2MnLAotICAgICAgICAgICAgICAgICdmaWx0ZXJzL3NoZWxsX3Jhd19hdWRpb19kZWNvZGVyX3BzNC5jYycsCi0gICAgICAgICAgICAgICAgJ2ZpbHRlcnMvc2hlbGxfcmF3X2F1ZGlvX2RlY29kZXJfcHM0LmgnLAotICAgICAgICAgICAgICAgICdmaWx0ZXJzL3NoZWxsX3Jhd19hdmNfZGVjb2Rlcl9wczQuY2MnLAotICAgICAgICAgICAgICAgICdmaWx0ZXJzL3NoZWxsX3Jhd19hdmNfZGVjb2Rlcl9wczQuaCcsCi0gICAgICAgICAgICAgICAgJ2ZpbHRlcnMvc2hlbGxfcmF3X3ZpZGVvX2RlY29kZXJfcHM0LmNjJywKLSAgICAgICAgICAgICAgICAnZmlsdGVycy9zaGVsbF9yYXdfdmlkZW9fZGVjb2Rlcl9wczQuaCcsCi0gICAgICAgICAgICAgICAgJ2ZpbHRlcnMvc2hlbGxfcmF3X3ZwOV9kZWNvZGVyX3BzNC5jYycsCi0gICAgICAgICAgICAgICAgJ2ZpbHRlcnMvc2hlbGxfcmF3X3ZwOV9kZWNvZGVyX3BzNC5oJywKLSAgICAgICAgICAgICAgICAnZmlsdGVycy92aWRlb2RlYzJfd29ya2luZ19tZW1vcnlfcHM0LmNjJywKLSAgICAgICAgICAgICAgICAnZmlsdGVycy92aWRlb2RlYzJfd29ya2luZ19tZW1vcnlfcHM0LmgnLAotICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgICAnZGVwZW5kZW5jaWVzJyA6IFsKLSAgICAgICAgICAgICAgICAnPChERVBUSCkvbmIvbmIuZ3lwOm5iJywKLSAgICAgICAgICAgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvbGlidnB4X2dwdS9saWJ2cHhfZ3B1Lmd5cDpsaWJ2cHhfZ3B1JywKLSAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgIH1dLAotICAgICAgICAgICAgWyd0YXJnZXRfYXJjaD09InhiMSIgb3IgdGFyZ2V0X2FyY2g9PSJ4YjM2MCInLCB7Ci0gICAgICAgICAgICAgICdzb3VyY2VzLyc6IFsKLSAgICAgICAgICAgICAgICAjIFRoZXNlIHBsYXRmb3JtcyBoYXZlIHRoZWlyIG93biBpbXBsZW1lbnRhdGlvbnMuCi0gICAgICAgICAgICAgICAgWydleGNsdWRlJywgJ2ZpbHRlcnMvc2hlbGxfYXVkaW9fZGVjb2Rlcl9pbXBsJ10sCi0gICAgICAgICAgICAgICAgWydleGNsdWRlJywgJ2ZpbHRlcnMvc2hlbGxfYXVkaW9fcmVuZGVyZXJfaW1wbCddLAotICAgICAgICAgICAgICAgIFsnZXhjbHVkZScsICdmaWx0ZXJzL3NoZWxsX3ZpZGVvX2RlY29kZXJfaW1wbCddLAotICAgICAgICAgICAgICBdCi0gICAgICAgICAgICB9XSwKLSAgICAgICAgICAgIFsndXNlX3dpZGV2aW5lPT0xJywgewotICAgICAgICAgICAgICAnc291cmNlcyc6IFsKLSAgICAgICAgICAgICAgICAnY3J5cHRvL3NoZWxsX3dpZGV2aW5lX2RlY3J5cHRvci5jYycsCi0gICAgICAgICAgICAgICAgJ2NyeXB0by9zaGVsbF93aWRldmluZV9kZWNyeXB0b3IuaCcsCi0gICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAgICdjb25kaXRpb25zJzogWwotICAgICAgICAgICAgICAgIFsnY29iYWx0PT0xJywgewotICAgICAgICAgICAgICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKLSAgICAgICAgICAgICAgICAgICAgJy4uL3RoaXJkX3BhcnR5L2NkbScsCi0gICAgICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgICAgICAgICAgICAgJ2NyeXB0by93aWRldmluZV9jb2JhbHQuZ3lwOnd2Y2RtX3N0YXRpYycsCi0gICAgICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgICAgIH0sIHsgICNjb2JhbHQhPTEKLSAgICAgICAgICAgICAgICAgICdpbmNsdWRlX2RpcnMnOiBbCi0gICAgICAgICAgICAgICAgICAgICcuLi8uLi9jZG0nLAotICAgICAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCi0gICAgICAgICAgICAgICAgICAgICdjcnlwdG8vd2lkZXZpbmVfc3RlZWwuZ3lwOnd2Y2RtX3N0YXRpYycsCi0gICAgICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgICAgIH1dLAotICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgfV0sCi0gICAgICAgICAgICBbJ2NvYmFsdD09MScsIHsKLSAgICAgICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgICAgICAgICAnLi4vZ29vZ2xldXJsL2dvb2dsZXVybC5neXA6Z29vZ2xldXJsJywKLSAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICAgICAgICAgJ3BsYXllci9idWZmZXJlZF9kYXRhX3NvdXJjZS5oJywKLSAgICAgICAgICAgICAgICAncGxheWVyL2Nhbl9wbGF5X3R5cGUuY2MnLAotICAgICAgICAgICAgICAgICdwbGF5ZXIvY2FuX3BsYXlfdHlwZS5oJywKLSAgICAgICAgICAgICAgICAncGxheWVyL2NyeXB0by9rZXlfc3lzdGVtcy5oJywKLSAgICAgICAgICAgICAgICAncGxheWVyL2NyeXB0by9rZXlfc3lzdGVtcy5jYycsCi0gICAgICAgICAgICAgICAgJ3BsYXllci9jcnlwdG8vcHJveHlfZGVjcnlwdG9yLmNjJywKLSAgICAgICAgICAgICAgICAncGxheWVyL2NyeXB0by9wcm94eV9kZWNyeXB0b3IuaCcsCi0gICAgICAgICAgICAgICAgJ3BsYXllci9taW1lX3V0aWwuY2MnLAotICAgICAgICAgICAgICAgICdwbGF5ZXIvbWltZV91dGlsLmgnLAotICAgICAgICAgICAgICAgICdwbGF5ZXIvbWltZV91dGlsX2NlcnRpZmljYXRlX3R5cGVfbGlzdC5oJywKLSAgICAgICAgICAgICAgICAncGxheWVyL3dlYl9tZWRpYV9wbGF5ZXIuaCcsCi0gICAgICAgICAgICAgICAgJ3BsYXllci93ZWJfbWVkaWFfcGxheWVyX2RlbGVnYXRlLmgnLAotICAgICAgICAgICAgICAgICdwbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9pbXBsLmNjJywKLSAgICAgICAgICAgICAgICAncGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfaW1wbC5oJywKLSAgICAgICAgICAgICAgICAncGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfcHJveHkuY2MnLAotICAgICAgICAgICAgICAgICdwbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9wcm94eS5oJywKLSAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICAgJ3NvdXJjZXMhJzogWwotICAgICAgICAgICAgICAgICdmaWx0ZXJzL2RlY3J5cHRpbmdfYXVkaW9fZGVjb2Rlci5jYycsCi0gICAgICAgICAgICAgICAgJ2ZpbHRlcnMvZGVjcnlwdGluZ19hdWRpb19kZWNvZGVyLmgnLAotICAgICAgICAgICAgICAgICdmaWx0ZXJzL2RlY3J5cHRpbmdfdmlkZW9fZGVjb2Rlci5jYycsCi0gICAgICAgICAgICAgICAgJ2ZpbHRlcnMvZGVjcnlwdGluZ192aWRlb19kZWNvZGVyLmgnLAotICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgfV0sCi0gICAgICAgICAgXSwKLSAgICAgICAgfSwgeyAgIyBPUyAhPSAibGJfc2hlbGwiIGFuZCBPUyAhPSAic3RhcmJvYXJkIgotICAgICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCi0gICAgICAgICAgICAneXV2X2NvbnZlcnQnLAotICAgICAgICAgICAgJy4uL3RoaXJkX3BhcnR5L29wZW5tYXgvb3Blbm1heC5neXA6aWwnLAotICAgICAgICAgICAgJy4uL3RoaXJkX3BhcnR5L29wdXMvb3B1cy5neXA6b3B1cycsCi0gICAgICAgICAgXSwKLSAgICAgICAgICAnc291cmNlcy8nOiBbCi0gICAgICAgICAgICBbJ2V4Y2x1ZGUnLCAnc2hlbGxfJ10sCi0gICAgICAgICAgXSwKLSAgICAgICAgfV0sICAjIE9TICE9ICJsYl9zaGVsbCIgYW5kIE9TICE9ICJzdGFyYm9hcmQiCi0gICAgICAgIFsnT1MgPT0gInN0YXJib2FyZCInLCB7Ci0gICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc3RhcmJvYXJkLmd5cDpzdGFyYm9hcmQnLAotICAgICAgICAgIF0sCi0gICAgICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICAgICAnYmFzZS9zaGVsbF9jYWNoZWRfZGVjb2Rlcl9idWZmZXIuY2MnLAotICAgICAgICAgICAgJ2Jhc2Uvc2hlbGxfY2FjaGVkX2RlY29kZXJfYnVmZmVyLmgnLAotICAgICAgICAgIF0sCi0gICAgICAgIH1dLCAgIyBPUyA9PSAic3RhcmJvYXJkIgotICAgICAgICBbJ09TID09ICJpb3MiJywgewotICAgICAgICAgICdpbmNsdWRlcyc6IFsKLSAgICAgICAgICAgICMgRm9yIHNoYXJlZF9tZW1vcnlfc3VwcG9ydF9zb3VyY2VzIHZhcmlhYmxlLgotICAgICAgICAgICAgJ3NoYXJlZF9tZW1vcnlfc3VwcG9ydC5neXBpJywKLSAgICAgICAgICBdLAotICAgICAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAgICAgJ2Jhc2UvbWVkaWFfc3R1Yi5jYycsCi0gICAgICAgICAgICAjIFRoZXNlIHNvdXJjZXMgYXJlIG5vcm1hbGx5IGJ1aWx0IHZpYSBhIGRlcGVuZGVuY3kgb24gdGhlCi0gICAgICAgICAgICAjIHNoYXJlZF9tZW1vcnlfc3VwcG9ydCB0YXJnZXQsIGJ1dCB0aGF0IHRhcmdldCBpcyBub3QgYnVpbHQgb24gaU9TLgotICAgICAgICAgICAgIyBJbnN0ZWFkLCBkaXJlY3RseSBidWlsZCBvbmx5IHRoZSBmaWxlcyB0aGF0IGFyZSBuZWVkZWQgZm9yIGlPUy4KLSAgICAgICAgICAgICc8QChzaGFyZWRfbWVtb3J5X3N1cHBvcnRfc291cmNlcyknLAotICAgICAgICAgIF0sCi0gICAgICAgICAgJ3NvdXJjZXMvJzogWwotICAgICAgICAgICAgIyBpT1Mgc3VwcG9ydCBpcyBsaW1pdGVkIHRvIGF1ZGlvIGlucHV0IG9ubHkuCi0gICAgICAgICAgICBbJ2V4Y2x1ZGUnLCAnLionXSwKLSAgICAgICAgICAgIFsnaW5jbHVkZScsICdeYXVkaW8vYXVkaW9fYnVmZmVyc19zdGF0ZVxcLiddLAotICAgICAgICAgICAgWydpbmNsdWRlJywgJ15hdWRpby9hdWRpb19pbnB1dF9jb250cm9sbGVyXFwuJ10sCi0gICAgICAgICAgICBbJ2luY2x1ZGUnLCAnXmF1ZGlvL2F1ZGlvX2lvXFwuaCQnXSwKLSAgICAgICAgICAgIFsnaW5jbHVkZScsICdeYXVkaW8vYXVkaW9fbWFuYWdlclxcLiddLAotICAgICAgICAgICAgWydpbmNsdWRlJywgJ15hdWRpby9hdWRpb19tYW5hZ2VyX2Jhc2VcXC4nXSwKLSAgICAgICAgICAgIFsnaW5jbHVkZScsICdeYXVkaW8vYXVkaW9fcGFyYW1ldGVyc1xcLiddLAotICAgICAgICAgICAgWydpbmNsdWRlJywgJ15hdWRpby9mYWtlX2F1ZGlvX2lucHV0X3N0cmVhbVxcLiddLAotICAgICAgICAgICAgWydpbmNsdWRlJywgJ15hdWRpby9mYWtlX2F1ZGlvX291dHB1dF9zdHJlYW1cXC4nXSwKLSAgICAgICAgICAgIFsnaW5jbHVkZScsICdeYXVkaW8vaW9zL2F1ZGlvX21hbmFnZXJfaW9zXFwuJ10sCi0gICAgICAgICAgICBbJ2luY2x1ZGUnLCAnXmJhc2UvYXVkaW9fYnVzXFwuJ10sCi0gICAgICAgICAgICBbJ2luY2x1ZGUnLCAnXmJhc2UvY2hhbm5lbF9sYXlvdXRcXC4nXSwKLSAgICAgICAgICAgIFsnaW5jbHVkZScsICdeYmFzZS9tZWRpYVxcLmgkJ10sCi0gICAgICAgICAgICBbJ2luY2x1ZGUnLCAnXmJhc2UvbWVkaWFfc3R1YlxcLmNjJCddLAotICAgICAgICAgIF0sCi0gICAgICAgICAgJ2xpbmtfc2V0dGluZ3MnOiB7Ci0gICAgICAgICAgICAnbGlicmFyaWVzJzogWwotICAgICAgICAgICAgICAnJChTREtST09UKS9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0F1ZGlvVG9vbGJveC5mcmFtZXdvcmsnLAotICAgICAgICAgICAgICAnJChTREtST09UKS9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0FWRm91bmRhdGlvbi5mcmFtZXdvcmsnLAotICAgICAgICAgICAgICAnJChTREtST09UKS9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0NvcmVBdWRpby5mcmFtZXdvcmsnLAotICAgICAgICAgICAgXSwKLSAgICAgICAgICB9LAotICAgICAgICB9XSwKLSAgICAgICAgWydPUyA9PSAiYW5kcm9pZCInLCB7Ci0gICAgICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICAgICAnYmFzZS9tZWRpYV9zdHViLmNjJywKLSAgICAgICAgICBdLAotICAgICAgICAgICdsaW5rX3NldHRpbmdzJzogewotICAgICAgICAgICAgJ2xpYnJhcmllcyc6IFsKLSAgICAgICAgICAgICAgJy1sT3BlblNMRVMnLAotICAgICAgICAgICAgXSwKLSAgICAgICAgICB9LAotICAgICAgICB9XSwKLSAgICAgICAgWydPUz09ImxpbnV4IiBvciBPUz09ImZyZWVic2QiIG9yIE9TPT0ic29sYXJpcyInLCB7Ci0gICAgICAgICAgJ2xpbmtfc2V0dGluZ3MnOiB7Ci0gICAgICAgICAgICAnbGlicmFyaWVzJzogWwotICAgICAgICAgICAgICAnLWxhc291bmQnLAotICAgICAgICAgICAgXSwKLSAgICAgICAgICB9LAotICAgICAgICB9XSwKLSAgICAgICAgWydPUz09Im9wZW5ic2QiJywgewotICAgICAgICAgICdzb3VyY2VzLyc6IFsgWydleGNsdWRlJywgJy9hbHNhXycgXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFsnZXhjbHVkZScsICcvYXVkaW9fbWFuYWdlcl9saW51eCcgXSBdLAotICAgICAgICAgICdsaW5rX3NldHRpbmdzJzogewotICAgICAgICAgICAgJ2xpYnJhcmllcyc6IFsKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgfSwKLSAgICAgICAgfV0sCi0gICAgICAgIFsnT1MhPSJvcGVuYnNkIicsIHsKLSAgICAgICAgICAnc291cmNlcyEnOiBbCi0gICAgICAgICAgICAnYXVkaW8vb3BlbmJzZC9hdWRpb19tYW5hZ2VyX29wZW5ic2QuY2MnLAotICAgICAgICAgICAgJ2F1ZGlvL29wZW5ic2QvYXVkaW9fbWFuYWdlcl9vcGVuYnNkLmgnLAotICAgICAgICAgIF0sCi0gICAgICAgIH1dLAotICAgICAgICBbJ09TPT0ibGludXgiJywgewotICAgICAgICAgICd2YXJpYWJsZXMnOiB7Ci0gICAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKLSAgICAgICAgICAgICAgWydzeXNyb290IT0iIicsIHsKLSAgICAgICAgICAgICAgICAncGtnLWNvbmZpZyc6ICcuLi9idWlsZC9saW51eC9wa2ctY29uZmlnLXdyYXBwZXIgIjwoc3lzcm9vdCkiICI8KHRhcmdldF9hcmNoKSInLAotICAgICAgICAgICAgICB9LCB7Ci0gICAgICAgICAgICAgICAgJ3BrZy1jb25maWcnOiAncGtnLWNvbmZpZycKLSAgICAgICAgICAgICAgfV0sCi0gICAgICAgICAgICBdLAotICAgICAgICAgIH0sCi0gICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCi0gICAgICAgICAgICBbJ3VzZV9jcmFzID09IDEnLCB7Ci0gICAgICAgICAgICAgICdjZmxhZ3MnOiBbCi0gICAgICAgICAgICAgICAgJzwhQCg8KHBrZy1jb25maWcpIC0tY2ZsYWdzIGxpYmNyYXMpJywKLSAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICAgJ2xpbmtfc2V0dGluZ3MnOiB7Ci0gICAgICAgICAgICAgICAgJ2xpYnJhcmllcyc6IFsKLSAgICAgICAgICAgICAgICAgICc8IUAoPChwa2ctY29uZmlnKSAtLWxpYnMgbGliY3JhcyknLAotICAgICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICdkZWZpbmVzJzogWwotICAgICAgICAgICAgICAgICdVU0VfQ1JBUycsCi0gICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICB9LCB7ICAjIGVsc2U6IHVzZV9jcmFzID09IDAKLSAgICAgICAgICAgICAgJ3NvdXJjZXMhJzogWwotICAgICAgICAgICAgICAgICdhdWRpby9saW51eC9jcmFzX2lucHV0LmNjJywKLSAgICAgICAgICAgICAgICAnYXVkaW8vbGludXgvY3Jhc19pbnB1dC5oJywKLSAgICAgICAgICAgICAgICAnYXVkaW8vbGludXgvY3Jhc19vdXRwdXQuY2MnLAotICAgICAgICAgICAgICAgICdhdWRpby9saW51eC9jcmFzX291dHB1dC5oJywKLSAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgIH1dLAotICAgICAgICAgIF0sCi0gICAgICAgIH1dLAotICAgICAgICBbJ29zX3Bvc2l4ID09IDEnLCB7Ci0gICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCi0gICAgICAgICAgICBbJ3VzZV9wdWxzZWF1ZGlvID09IDEnLCB7Ci0gICAgICAgICAgICAgICdjZmxhZ3MnOiBbCi0gICAgICAgICAgICAgICAgJzwhQChwa2ctY29uZmlnIC0tY2ZsYWdzIGxpYnB1bHNlKScsCi0gICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAgICdsaW5rX3NldHRpbmdzJzogewotICAgICAgICAgICAgICAgICdsaWJyYXJpZXMnOiBbCi0gICAgICAgICAgICAgICAgICAnPCFAKHBrZy1jb25maWcgLS1saWJzLW9ubHktbCBsaWJwdWxzZSknLAotICAgICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICdkZWZpbmVzJzogWwotICAgICAgICAgICAgICAgICdVU0VfUFVMU0VBVURJTycsCi0gICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICB9LCB7ICAjIGVsc2U6IHVzZV9wdWxzZWF1ZGlvID09IDAKLSAgICAgICAgICAgICAgJ3NvdXJjZXMhJzogWwotICAgICAgICAgICAgICAgICdhdWRpby9wdWxzZS9wdWxzZV9vdXRwdXQuY2MnLAotICAgICAgICAgICAgICAgICdhdWRpby9wdWxzZS9wdWxzZV9vdXRwdXQuaCcsCi0gICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICB9XSwKLSAgICAgICAgICBdLAotICAgICAgICB9XSwKLSAgICAgICAgWydvc19wb3NpeCA9PSAxIGFuZCBPUyAhPSAiYW5kcm9pZCInLCB7Ci0gICAgICAgICAgIyBWaWRlbyBjYXB0dXJlIGlzbid0IHN1cHBvcnRlZCBpbiBBbmRyb2lkIHlldC4KLSAgICAgICAgICAnc291cmNlcyEnOiBbCi0gICAgICAgICAgICAndmlkZW8vY2FwdHVyZS92aWRlb19jYXB0dXJlX2RldmljZV9kdW1teS5jYycsCi0gICAgICAgICAgICAndmlkZW8vY2FwdHVyZS92aWRlb19jYXB0dXJlX2RldmljZV9kdW1teS5oJywKLSAgICAgICAgICBdLAotICAgICAgICB9XSwKLSAgICAgICAgWydPUz09Im1hYyInLCB7Ci0gICAgICAgICAgJ2xpbmtfc2V0dGluZ3MnOiB7Ci0gICAgICAgICAgICAnbGlicmFyaWVzJzogWwotICAgICAgICAgICAgICAnJChTREtST09UKS9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0F1ZGlvVW5pdC5mcmFtZXdvcmsnLAotICAgICAgICAgICAgICAnJChTREtST09UKS9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0F1ZGlvVG9vbGJveC5mcmFtZXdvcmsnLAotICAgICAgICAgICAgICAnJChTREtST09UKS9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0NvcmVBdWRpby5mcmFtZXdvcmsnLAotICAgICAgICAgICAgICAnJChTREtST09UKS9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0NvcmVWaWRlby5mcmFtZXdvcmsnLAotICAgICAgICAgICAgICAnJChTREtST09UKS9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL1FUS2l0LmZyYW1ld29yaycsCi0gICAgICAgICAgICBdLAotICAgICAgICAgIH0sCi0gICAgICAgIH1dLAotICAgICAgICBbJ09TPT0id2luIicsIHsKLSAgICAgICAgICAnc291cmNlcyEnOiBbCi0gICAgICAgICAgICAnYXVkaW8vcHVsc2UvcHVsc2Vfb3V0cHV0LmNjJywKLSAgICAgICAgICAgICdhdWRpby9wdWxzZS9wdWxzZV9vdXRwdXQuaCcsCi0gICAgICAgICAgICAndmlkZW8vY2FwdHVyZS92aWRlb19jYXB0dXJlX2RldmljZV9kdW1teS5jYycsCi0gICAgICAgICAgICAndmlkZW8vY2FwdHVyZS92aWRlb19jYXB0dXJlX2RldmljZV9kdW1teS5oJywKLSAgICAgICAgICBdLAotICAgICAgICAgICdsaW5rX3NldHRpbmdzJzogIHsKLSAgICAgICAgICAgICdsaWJyYXJpZXMnOiBbCi0gICAgICAgICAgICAgICctbG1mLmxpYicsCi0gICAgICAgICAgICAgICctbG1mcGxhdC5saWInLAotICAgICAgICAgICAgICAnLWxtZnJlYWR3cml0ZS5saWInLAotICAgICAgICAgICAgICAnLWxtZnV1aWQubGliJywKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgfSwKLSAgICAgICAgICAjIFNwZWNpZnkgZGVsYXlsb2FkIGZvciBtZWRpYS5kbGwuCi0gICAgICAgICAgJ21zdnNfc2V0dGluZ3MnOiB7Ci0gICAgICAgICAgICAnVkNMaW5rZXJUb29sJzogewotICAgICAgICAgICAgICAnRGVsYXlMb2FkRExMcyc6IFsKLSAgICAgICAgICAgICAgICAnbWYuZGxsJywKLSAgICAgICAgICAgICAgICAnbWZwbGF0LmRsbCcsCi0gICAgICAgICAgICAgICAgJ21mcmVhZHdyaXRlLmRsbCcsCi0gICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICB9LAotICAgICAgICAgIH0sCi0gICAgICAgICAgIyBTcGVjaWZ5IGRlbGF5bG9hZCBmb3IgY29tcG9uZW50cyB0aGF0IGxpbmsgd2l0aCBtZWRpYS5saWIuCi0gICAgICAgICAgJ2FsbF9kZXBlbmRlbnRfc2V0dGluZ3MnOiB7Ci0gICAgICAgICAgICAnbXN2c19zZXR0aW5ncyc6IHsKLSAgICAgICAgICAgICAgJ1ZDTGlua2VyVG9vbCc6IHsKLSAgICAgICAgICAgICAgICAnRGVsYXlMb2FkRExMcyc6IFsKLSAgICAgICAgICAgICAgICAgICdtZi5kbGwnLAotICAgICAgICAgICAgICAgICAgJ21mcGxhdC5kbGwnLAotICAgICAgICAgICAgICAgICAgJ21mcmVhZHdyaXRlLmRsbCcsCi0gICAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgfSwKLSAgICAgICAgfV0sCi0gICAgICBdLAotICAgICAgJ3RhcmdldF9jb25kaXRpb25zJzogWwotICAgICAgICBbJ09TID09ICJpb3MiJywgewotICAgICAgICAgICdzb3VyY2VzLyc6IFsKLSAgICAgICAgICAgICMgUHVsbCBpbiBzcGVjaWZpYyBNYWMgZmlsZXMgZm9yIGlPUyAod2hpY2ggaGF2ZSBiZWVuIGZpbHRlcmVkIG91dAotICAgICAgICAgICAgIyBieSBmaWxlIG5hbWUgcnVsZXMpLgotICAgICAgICAgICAgWydpbmNsdWRlJywgJ15hdWRpby9tYWMvYXVkaW9faW5wdXRfbWFjXFwuJ10sCi0gICAgICAgICAgXSwKLSAgICAgICAgfV0sCi0gICAgICBdLAotICAgIH0sCi0gICAgewotICAgICAgJ3RhcmdldF9uYW1lJzogJ21lZGlhX3VuaXR0ZXN0cycsCi0gICAgICAndHlwZSc6ICc8KGd0ZXN0X3RhcmdldF90eXBlKScsCi0gICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAnbWVkaWEnLAotICAgICAgICAnbWVkaWFfdGVzdF9zdXBwb3J0JywKLSAgICAgICAgJy4uL2Jhc2UvYmFzZS5neXA6YmFzZScsCi0gICAgICAgICcuLi9iYXNlL2Jhc2UuZ3lwOmJhc2VfaTE4bicsCi0gICAgICAgICcuLi9iYXNlL2Jhc2UuZ3lwOnRlc3Rfc3VwcG9ydF9iYXNlJywKLSAgICAgICAgJy4uL3Rlc3RpbmcvZ21vY2suZ3lwOmdtb2NrJywKLSAgICAgICAgJy4uL3Rlc3RpbmcvZ3Rlc3QuZ3lwOmd0ZXN0JywKLSAgICAgICAgJy4uL3VpL3VpLmd5cDp1aScsCi0gICAgICBdLAotICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICdhdWRpby9hc3luY19zb2NrZXRfaW9faGFuZGxlcl91bml0dGVzdC5jYycsCi0gICAgICAgICdhdWRpby9hdWRpb19pbnB1dF9jb250cm9sbGVyX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ2F1ZGlvL2F1ZGlvX2lucHV0X2RldmljZV91bml0dGVzdC5jYycsCi0gICAgICAgICdhdWRpby9hdWRpb19pbnB1dF91bml0dGVzdC5jYycsCi0gICAgICAgICdhdWRpby9hdWRpb19pbnB1dF92b2x1bWVfdW5pdHRlc3QuY2MnLAotICAgICAgICAnYXVkaW8vYXVkaW9fbG93X2xhdGVuY3lfaW5wdXRfb3V0cHV0X3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ2F1ZGlvL2F1ZGlvX291dHB1dF9jb250cm9sbGVyX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ2F1ZGlvL2F1ZGlvX291dHB1dF9kZXZpY2VfdW5pdHRlc3QuY2MnLAotICAgICAgICAnYXVkaW8vYXVkaW9fb3V0cHV0X3Byb3h5X3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ2F1ZGlvL2F1ZGlvX3BhcmFtZXRlcnNfdW5pdHRlc3QuY2MnLAotICAgICAgICAnYXVkaW8vYXVkaW9fdXRpbF91bml0dGVzdC5jYycsCi0gICAgICAgICdhdWRpby9jcm9zc19wcm9jZXNzX25vdGlmaWNhdGlvbl91bml0dGVzdC5jYycsCi0gICAgICAgICdhdWRpby9mYWtlX2F1ZGlvX291dHB1dF9zdHJlYW1fdW5pdHRlc3QuY2MnLAotICAgICAgICAnYXVkaW8vaW9zL2F1ZGlvX21hbmFnZXJfaW9zX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ2F1ZGlvL2xpbnV4L2Fsc2Ffb3V0cHV0X3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ2F1ZGlvL21hYy9hdWRpb19sb3dfbGF0ZW5jeV9pbnB1dF9tYWNfdW5pdHRlc3QuY2MnLAotICAgICAgICAnYXVkaW8vbWFjL2F1ZGlvX291dHB1dF9tYWNfdW5pdHRlc3QuY2MnLAotICAgICAgICAnYXVkaW8vc2ltcGxlX3NvdXJjZXNfdW5pdHRlc3QuY2MnLAotICAgICAgICAnYXVkaW8vdmlydHVhbF9hdWRpb19pbnB1dF9zdHJlYW1fdW5pdHRlc3QuY2MnLAotICAgICAgICAnYXVkaW8vdmlydHVhbF9hdWRpb19vdXRwdXRfc3RyZWFtX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ2F1ZGlvL3dpbi9hdWRpb19kZXZpY2VfbGlzdGVuZXJfd2luX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ2F1ZGlvL3dpbi9hdWRpb19sb3dfbGF0ZW5jeV9pbnB1dF93aW5fdW5pdHRlc3QuY2MnLAotICAgICAgICAnYXVkaW8vd2luL2F1ZGlvX2xvd19sYXRlbmN5X291dHB1dF93aW5fdW5pdHRlc3QuY2MnLAotICAgICAgICAnYXVkaW8vd2luL2F1ZGlvX291dHB1dF93aW5fdW5pdHRlc3QuY2MnLAotICAgICAgICAnYXVkaW8vd2luL2F1ZGlvX3VuaWZpZWRfd2luX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ2F1ZGlvL3dpbi9jb3JlX2F1ZGlvX3V0aWxfd2luX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ2Jhc2UvYXVkaW9fYnVzX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ2Jhc2UvYXVkaW9fY29udmVydGVyX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ2Jhc2UvYXVkaW9fZmlmb191bml0dGVzdC5jYycsCi0gICAgICAgICdiYXNlL2F1ZGlvX3B1bGxfZmlmb191bml0dGVzdC5jYycsCi0gICAgICAgICdiYXNlL2F1ZGlvX3JlbmRlcmVyX21peGVyX2lucHV0X3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ2Jhc2UvYXVkaW9fcmVuZGVyZXJfbWl4ZXJfdW5pdHRlc3QuY2MnLAotICAgICAgICAnYmFzZS9hdWRpb19zcGxpY2VyX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ2Jhc2UvYXVkaW9fdGltZXN0YW1wX2hlbHBlcl91bml0dGVzdC5jYycsCi0gICAgICAgICdiYXNlL2JpdF9yZWFkZXJfdW5pdHRlc3QuY2MnLAotICAgICAgICAnYmFzZS9iaW5kX3RvX2xvb3BfdW5pdHRlc3QuY2MnLAotICAgICAgICAnYmFzZS9idWZmZXJzX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ2Jhc2UvY2hhbm5lbF9taXhlcl91bml0dGVzdC5jYycsCi0gICAgICAgICdiYXNlL2Nsb2NrX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ2Jhc2UvZGF0YV9idWZmZXJfdW5pdHRlc3QuY2MnLAotICAgICAgICAnYmFzZS9kZWNvZGVyX2J1ZmZlcl91bml0dGVzdC5jYycsCi0gICAgICAgICdiYXNlL2RqYjJfdW5pdHRlc3QuY2MnLAotICAgICAgICAnYmFzZS9maWx0ZXJfY29sbGVjdGlvbl91bml0dGVzdC5jYycsCi0gICAgICAgICdiYXNlL2dtb2NrX2NhbGxiYWNrX3N1cHBvcnRfdW5pdHRlc3QuY2MnLAotICAgICAgICAnYmFzZS9pbnRlcmxlYXZlZF9zaW5jX3Jlc2FtcGxlcl91bml0dGVzdC5jYycsCi0gICAgICAgICdiYXNlL211bHRpX2NoYW5uZWxfcmVzYW1wbGVyX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ2Jhc2UvcGlwZWxpbmVfaW1wbF91bml0dGVzdC5jYycsCi0gICAgICAgICdiYXNlL3Jhbmdlc191bml0dGVzdC5jYycsCi0gICAgICAgICdiYXNlL3J1bl9hbGxfdW5pdHRlc3RzLmNjJywKLSAgICAgICAgJ2Jhc2Uvc2Vla2FibGVfYnVmZmVyX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ2Jhc2Uvc2hlbGxfYXVkaW9fYnVzX3Rlc3QuY2MnLAotICAgICAgICAnYmFzZS9zaW5jX3Jlc2FtcGxlcl91bml0dGVzdC5jYycsCi0gICAgICAgICdiYXNlL3Rlc3RfZGF0YV91dGlsLmNjJywKLSAgICAgICAgJ2Jhc2UvdGVzdF9kYXRhX3V0aWwuaCcsCi0gICAgICAgICdiYXNlL3ZlY3Rvcl9tYXRoX3Rlc3RpbmcuaCcsCi0gICAgICAgICdiYXNlL3ZlY3Rvcl9tYXRoX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ2Jhc2UvdmlkZW9fZnJhbWVfdW5pdHRlc3QuY2MnLAotICAgICAgICAnYmFzZS92aWRlb191dGlsX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ2Jhc2UveXV2X2NvbnZlcnRfdW5pdHRlc3QuY2MnLAotICAgICAgICAnY3J5cHRvL2Flc19kZWNyeXB0b3JfdW5pdHRlc3QuY2MnLAotICAgICAgICAnZmZtcGVnL2ZmbXBlZ19jb21tb25fdW5pdHRlc3QuY2MnLAotICAgICAgICAnZmlsdGVycy9hdWRpb19kZWNvZGVyX3NlbGVjdG9yX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ2ZpbHRlcnMvYXVkaW9fZmlsZV9yZWFkZXJfdW5pdHRlc3QuY2MnLAotICAgICAgICAnZmlsdGVycy9hdWRpb19yZW5kZXJlcl9hbGdvcml0aG1fdW5pdHRlc3QuY2MnLAotICAgICAgICAnZmlsdGVycy9hdWRpb19yZW5kZXJlcl9pbXBsX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ2ZpbHRlcnMvYmxvY2tpbmdfdXJsX3Byb3RvY29sX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ2ZpbHRlcnMvY2h1bmtfZGVtdXhlcl91bml0dGVzdC5jYycsCi0gICAgICAgICdmaWx0ZXJzL2RlY3J5cHRpbmdfYXVkaW9fZGVjb2Rlcl91bml0dGVzdC5jYycsCi0gICAgICAgICdmaWx0ZXJzL2RlY3J5cHRpbmdfZGVtdXhlcl9zdHJlYW1fdW5pdHRlc3QuY2MnLAotICAgICAgICAnZmlsdGVycy9kZWNyeXB0aW5nX3ZpZGVvX2RlY29kZXJfdW5pdHRlc3QuY2MnLAotICAgICAgICAnZmlsdGVycy9mZm1wZWdfYXVkaW9fZGVjb2Rlcl91bml0dGVzdC5jYycsCi0gICAgICAgICdmaWx0ZXJzL2ZmbXBlZ19kZW11eGVyX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ2ZpbHRlcnMvZmZtcGVnX2dsdWVfdW5pdHRlc3QuY2MnLAotICAgICAgICAnZmlsdGVycy9mZm1wZWdfaDI2NF90b19hbm5leF9iX2JpdHN0cmVhbV9jb252ZXJ0ZXJfdW5pdHRlc3QuY2MnLAotICAgICAgICAnZmlsdGVycy9mZm1wZWdfdmlkZW9fZGVjb2Rlcl91bml0dGVzdC5jYycsCi0gICAgICAgICdmaWx0ZXJzL2ZpbGVfZGF0YV9zb3VyY2VfdW5pdHRlc3QuY2MnLAotICAgICAgICAnZmlsdGVycy9oMjY0X3RvX2FubmV4X2JfYml0c3RyZWFtX2NvbnZlcnRlcl91bml0dGVzdC5jYycsCi0gICAgICAgICdmaWx0ZXJzL3BpcGVsaW5lX2ludGVncmF0aW9uX3Rlc3QuY2MnLAotICAgICAgICAnZmlsdGVycy9waXBlbGluZV9pbnRlZ3JhdGlvbl90ZXN0X2Jhc2UuY2MnLAotICAgICAgICAnZmlsdGVycy9za2NhbnZhc192aWRlb19yZW5kZXJlcl91bml0dGVzdC5jYycsCi0gICAgICAgICdmaWx0ZXJzL3NvdXJjZV9idWZmZXJfc3RyZWFtX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ2ZpbHRlcnMvdmlkZW9fZGVjb2Rlcl9zZWxlY3Rvcl91bml0dGVzdC5jYycsCi0gICAgICAgICdmaWx0ZXJzL3ZpZGVvX3JlbmRlcmVyX2Jhc2VfdW5pdHRlc3QuY2MnLAotICAgICAgICAnbXA0L2FhY191bml0dGVzdC5jYycsCi0gICAgICAgICdtcDQvYXZjX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ21wNC9ib3hfcmVhZGVyX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ21wNC9lc19kZXNjcmlwdG9yX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ21wNC9tcDRfc3RyZWFtX3BhcnNlcl91bml0dGVzdC5jYycsCi0gICAgICAgICdtcDQvb2Zmc2V0X2J5dGVfcXVldWVfdW5pdHRlc3QuY2MnLAotICAgICAgICAnbXA0L3RyYWNrX3J1bl9pdGVyYXRvcl91bml0dGVzdC5jYycsCi0gICAgICAgICd2aWRlby9jYXB0dXJlL3ZpZGVvX2NhcHR1cmVfZGV2aWNlX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ3dlYm0vY2x1c3Rlcl9idWlsZGVyLmNjJywKLSAgICAgICAgJ3dlYm0vY2x1c3Rlcl9idWlsZGVyLmgnLAotICAgICAgICAnd2VibS93ZWJtX2NsdXN0ZXJfcGFyc2VyX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgJ3dlYm0vd2VibV9jb250ZW50X2VuY29kaW5nc19jbGllbnRfdW5pdHRlc3QuY2MnLAotICAgICAgICAnd2VibS93ZWJtX3BhcnNlcl91bml0dGVzdC5jYycsCi0gICAgICBdLAotICAgICAgJ2NvbmRpdGlvbnMnOiBbCi0gICAgICAgIFsnYXJtX25lb24gPT0gMScsIHsKLSAgICAgICAgICAnZGVmaW5lcyc6IFsKLSAgICAgICAgICAgICdVU0VfTkVPTicKLSAgICAgICAgICBdLAotICAgICAgICB9XSwKLSAgICAgICAgWydPUyAhPSAiaW9zIicsIHsKLSAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAgICAgJ3NoYXJlZF9tZW1vcnlfc3VwcG9ydCcsCi0gICAgICAgICAgICAneXV2X2NvbnZlcnQnLAotICAgICAgICAgIF0sCi0gICAgICAgIH1dLAotICAgICAgICBbJ3VzZV9mZm1wZWcgPT0gMScsIHsKLSAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAgICAgJy4uL3RoaXJkX3BhcnR5L2ZmbXBlZy9mZm1wZWcuZ3lwOmZmbXBlZycsCi0gICAgICAgICAgXSwKLSAgICAgICAgfV0sCi0gICAgICAgIFsnT1MgPT0gImlvcyInLCB7Ci0gICAgICAgICAgJ3NvdXJjZXMvJzogWwotICAgICAgICAgICAgWydleGNsdWRlJywgJy4qJ10sCi0gICAgICAgICAgICBbJ2luY2x1ZGUnLCAnXmF1ZGlvL2F1ZGlvX2lucHV0X2NvbnRyb2xsZXJfdW5pdHRlc3RcXC5jYyQnXSwKLSAgICAgICAgICAgIFsnaW5jbHVkZScsICdeYXVkaW8vYXVkaW9faW5wdXRfdW5pdHRlc3RcXC5jYyQnXSwKLSAgICAgICAgICAgIFsnaW5jbHVkZScsICdeYXVkaW8vYXVkaW9fcGFyYW1ldGVyc191bml0dGVzdFxcLmNjJCddLAotICAgICAgICAgICAgWydpbmNsdWRlJywgJ15hdWRpby9pb3MvYXVkaW9fbWFuYWdlcl9pb3NfdW5pdHRlc3RcXC5jYyQnXSwKLSAgICAgICAgICAgIFsnaW5jbHVkZScsICdeYmFzZS9tb2NrX3JlYWRlclxcLmgkJ10sCi0gICAgICAgICAgICBbJ2luY2x1ZGUnLCAnXmJhc2UvcnVuX2FsbF91bml0dGVzdHNcXC5jYyQnXSwKLSAgICAgICAgICBdLAotICAgICAgICB9XSwKLSAgICAgICAgWydPUz09ImFuZHJvaWQiIG9yIE9TPT0ibGJfc2hlbGwiIG9yIE9TPT0ic3RhcmJvYXJkIicsIHsKLSAgICAgICAgICAnc291cmNlcyEnOiBbCi0gICAgICAgICAgICAnYXVkaW8vYXVkaW9faW5wdXRfdm9sdW1lX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgICAgICdiYXNlL3Rlc3RfZGF0YV91dGlsLmNjJywKLSAgICAgICAgICAgICdiYXNlL3Rlc3RfZGF0YV91dGlsLmgnLAotICAgICAgICAgICAgJ2ZmbXBlZy9mZm1wZWdfY29tbW9uX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgICAgICdmaWx0ZXJzL2F1ZGlvX2ZpbGVfcmVhZGVyX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgICAgICdmaWx0ZXJzL2Jsb2NraW5nX3VybF9wcm90b2NvbF91bml0dGVzdC5jYycsCi0gICAgICAgICAgICAnZmlsdGVycy9jaHVua19kZW11eGVyX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgICAgICdmaWx0ZXJzL2ZmbXBlZ19hdWRpb19kZWNvZGVyX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgICAgICdmaWx0ZXJzL2ZmbXBlZ19kZW11eGVyX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgICAgICdmaWx0ZXJzL2ZmbXBlZ19nbHVlX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgICAgICdmaWx0ZXJzL2ZmbXBlZ19oMjY0X3RvX2FubmV4X2JfYml0c3RyZWFtX2NvbnZlcnRlcl91bml0dGVzdC5jYycsCi0gICAgICAgICAgICAnZmlsdGVycy9mZm1wZWdfdmlkZW9fZGVjb2Rlcl91bml0dGVzdC5jYycsCi0gICAgICAgICAgICAnZmlsdGVycy9waXBlbGluZV9pbnRlZ3JhdGlvbl90ZXN0LmNjJywKLSAgICAgICAgICAgICdmaWx0ZXJzL3BpcGVsaW5lX2ludGVncmF0aW9uX3Rlc3RfYmFzZS5jYycsCi0gICAgICAgICAgICAnbXA0L21wNF9zdHJlYW1fcGFyc2VyX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgICAgICd3ZWJtL3dlYm1fY2x1c3Rlcl9wYXJzZXJfdW5pdHRlc3QuY2MnLAotICAgICAgICAgIF0sCi0gICAgICAgIH1dLAotICAgICAgICBbJ09TID09ICJsaW51eCInLCB7Ci0gICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCi0gICAgICAgICAgICBbJ3VzZV9jcmFzID09IDEnLCB7Ci0gICAgICAgICAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAgICAgICAgICdhdWRpby9saW51eC9jcmFzX2lucHV0X3VuaXR0ZXN0LmNjJywKLSAgICAgICAgICAgICAgICAnYXVkaW8vbGludXgvY3Jhc19vdXRwdXRfdW5pdHRlc3QuY2MnLAotICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgICAnZGVmaW5lcyc6IFsKLSAgICAgICAgICAgICAgICAnVVNFX0NSQVMnLAotICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgfV0sCi0gICAgICAgICAgXSwKLSAgICAgICAgfV0sCi0gICAgICAgIFsgJ3RhcmdldF9hcmNoPT0iaWEzMiIgb3IgdGFyZ2V0X2FyY2g9PSJ4NjQiJywgewotICAgICAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAgICAgJ2Jhc2Uvc2ltZC9jb252ZXJ0X3JnYl90b195dXZfdW5pdHRlc3QuY2MnLAotICAgICAgICAgIF0sCi0gICAgICAgIH1dLAotICAgICAgICBbJ09TID09ICJsYl9zaGVsbCIgb3IgT1M9PSJzdGFyYm9hcmQiJywgewotICAgICAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAgICAgJ2F1ZGlvL21vY2tfc2hlbGxfYXVkaW9fc3RyZWFtZXIuaCcsCi0gICAgICAgICAgICAnYXVkaW8vc2hlbGxfYXVkaW9fc2lua191bml0dGVzdC5jYycsCi0gICAgICAgICAgICAnYmFzZS9tb2NrX3NoZWxsX2RhdGFfc291cmNlX3JlYWRlci5oJywKLSAgICAgICAgICAgICdiYXNlL3NoZWxsX2J1ZmZlcl9mYWN0b3J5X3VuaXR0ZXN0LmNjJywKLSAgICAgICAgICAgICdmaWx0ZXJzL3NoZWxsX2F1ZGlvX3JlbmRlcmVyX3VuaXR0ZXN0LmNjJywKLSAgICAgICAgICAgICdmaWx0ZXJzL3NoZWxsX21wNF9tYXBfdW5pdHRlc3QuY2MnLAotICAgICAgICAgICAgJ2ZpbHRlcnMvc2hlbGxfcmJzcF9zdHJlYW1fdW5pdHRlc3QuY2MnLAotICAgICAgICAgIF0sCi0gICAgICAgIH1dLAotICAgICAgXSwKLSAgICB9LAotICAgIHsKLSAgICAgICd0YXJnZXRfbmFtZSc6ICdtZWRpYV90ZXN0X3N1cHBvcnQnLAotICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAotICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgJ21lZGlhJywKLSAgICAgICAgJy4uL2Jhc2UvYmFzZS5neXA6YmFzZScsCi0gICAgICAgICcuLi90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCi0gICAgICAgICcuLi90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCi0gICAgICBdLAotICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICdhdWRpby9tb2NrX2F1ZGlvX21hbmFnZXIuY2MnLAotICAgICAgICAnYXVkaW8vbW9ja19hdWRpb19tYW5hZ2VyLmgnLAotICAgICAgICAnYXVkaW8vdGVzdF9hdWRpb19pbnB1dF9jb250cm9sbGVyX2ZhY3RvcnkuY2MnLAotICAgICAgICAnYXVkaW8vdGVzdF9hdWRpb19pbnB1dF9jb250cm9sbGVyX2ZhY3RvcnkuaCcsCi0gICAgICAgICdiYXNlL2Zha2VfYXVkaW9fcmVuZGVyX2NhbGxiYWNrLmNjJywKLSAgICAgICAgJ2Jhc2UvZmFrZV9hdWRpb19yZW5kZXJfY2FsbGJhY2suaCcsCi0gICAgICAgICdiYXNlL2dtb2NrX2NhbGxiYWNrX3N1cHBvcnQuaCcsCi0gICAgICAgICdiYXNlL21vY2tfYXVkaW9fcmVuZGVyZXJfc2luay5jYycsCi0gICAgICAgICdiYXNlL21vY2tfYXVkaW9fcmVuZGVyZXJfc2luay5oJywKLSAgICAgICAgJ2Jhc2UvbW9ja19kYXRhX3NvdXJjZV9ob3N0LmNjJywKLSAgICAgICAgJ2Jhc2UvbW9ja19kYXRhX3NvdXJjZV9ob3N0LmgnLAotICAgICAgICAnYmFzZS9tb2NrX2RlbXV4ZXJfaG9zdC5jYycsCi0gICAgICAgICdiYXNlL21vY2tfZGVtdXhlcl9ob3N0LmgnLAotICAgICAgICAnYmFzZS9tb2NrX2ZpbHRlcnMuY2MnLAotICAgICAgICAnYmFzZS9tb2NrX2ZpbHRlcnMuaCcsCi0gICAgICAgICdiYXNlL3Rlc3RfaGVscGVycy5jYycsCi0gICAgICAgICdiYXNlL3Rlc3RfaGVscGVycy5oJywKLSAgICAgIF0sCi0gICAgfSwKLSAgXSwKLSAgJ2NvbmRpdGlvbnMnOiBbCi0gICAgWydPUyAhPSAiaW9zIicsIHsKLSAgICAgICd0YXJnZXRzJzogWwotICAgICAgICB7Ci0gICAgICAgICAgIyBNaW5pbWFsIHRhcmdldCBmb3IgTmFDbCBhbmQgb3RoZXIgcmVuZGVyZXIgc2lkZSBtZWRpYSBjbGllbnRzIHdoaWNoCi0gICAgICAgICAgIyBvbmx5IG5lZWQgdG8gc2VuZCBhdWRpbyBkYXRhIGFjcm9zcyB0aGUgc2hhcmVkIG1lbW9yeSB0byB0aGUgYnJvd3NlcgotICAgICAgICAgICMgcHJvY2Vzcy4KLSAgICAgICAgICAndGFyZ2V0X25hbWUnOiAnc2hhcmVkX21lbW9yeV9zdXBwb3J0JywKLSAgICAgICAgICAndHlwZSc6ICc8KGNvbXBvbmVudCknLAotICAgICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCi0gICAgICAgICAgICAnLi4vYmFzZS9iYXNlLmd5cDpiYXNlJywKLSAgICAgICAgICBdLAotICAgICAgICAgICdkZWZpbmVzJzogWwotICAgICAgICAgICAgJ01FRElBX0lNUExFTUVOVEFUSU9OJywKLSAgICAgICAgICBdLAotICAgICAgICAgICdpbmNsdWRlX2RpcnMnOiBbCi0gICAgICAgICAgICAnLi4nLAotICAgICAgICAgIF0sCi0gICAgICAgICAgJ2luY2x1ZGVzJzogWwotICAgICAgICAgICAgJ3NoYXJlZF9tZW1vcnlfc3VwcG9ydC5neXBpJywKLSAgICAgICAgICBdLAotICAgICAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAgICAgJzxAKHNoYXJlZF9tZW1vcnlfc3VwcG9ydF9zb3VyY2VzKScsCi0gICAgICAgICAgXSwKLSAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKLSAgICAgICAgICAgIFsnT1MgPT0gImxiX3NoZWxsIicsIHsKLSAgICAgICAgICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAotICAgICAgICAgICAgfV0sCi0gICAgICAgICAgXSwKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICd0YXJnZXRfbmFtZSc6ICd5dXZfY29udmVydCcsCi0gICAgICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAotICAgICAgICAgICdpbmNsdWRlX2RpcnMnOiBbCi0gICAgICAgICAgICAnLi4nLAotICAgICAgICAgIF0sCi0gICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCi0gICAgICAgICAgICBbICd0YXJnZXRfYXJjaCA9PSAiaWEzMiIgb3IgdGFyZ2V0X2FyY2ggPT0gIng2NCInLCB7Ci0gICAgICAgICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCi0gICAgICAgICAgICAgICAgJ3l1dl9jb252ZXJ0X3NpbWRfeDg2JywKLSAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgIH1dLAotICAgICAgICAgICAgWyAndGFyZ2V0X2FyY2ggPT0gImFybSIgb3IgdGFyZ2V0X2FyY2ggPT0gIm1pcHNlbCInLCB7Ci0gICAgICAgICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCi0gICAgICAgICAgICAgICAgJ3l1dl9jb252ZXJ0X3NpbWRfYycsCi0gICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICB9XSwKLSAgICAgICAgICBdLAotICAgICAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAgICAgJ2Jhc2UveXV2X2NvbnZlcnQuY2MnLAotICAgICAgICAgICAgJ2Jhc2UveXV2X2NvbnZlcnQuaCcsCi0gICAgICAgICAgXSwKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICd0YXJnZXRfbmFtZSc6ICd5dXZfY29udmVydF9zaW1kX3g4NicsCi0gICAgICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAotICAgICAgICAgICdpbmNsdWRlX2RpcnMnOiBbCi0gICAgICAgICAgICAnLi4nLAotICAgICAgICAgIF0sCi0gICAgICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICAgICAnYmFzZS9zaW1kL2NvbnZlcnRfcmdiX3RvX3l1dl9jLmNjJywKLSAgICAgICAgICAgICdiYXNlL3NpbWQvY29udmVydF9yZ2JfdG9feXV2X3NzZTIuY2MnLAotICAgICAgICAgICAgJ2Jhc2Uvc2ltZC9jb252ZXJ0X3JnYl90b195dXZfc3NzZTMuYXNtJywKLSAgICAgICAgICAgICdiYXNlL3NpbWQvY29udmVydF9yZ2JfdG9feXV2X3Nzc2UzLmNjJywKLSAgICAgICAgICAgICdiYXNlL3NpbWQvY29udmVydF9yZ2JfdG9feXV2X3Nzc2UzLmluYycsCi0gICAgICAgICAgICAnYmFzZS9zaW1kL2NvbnZlcnRfeXV2X3RvX3JnYl9jLmNjJywKLSAgICAgICAgICAgICdiYXNlL3NpbWQvY29udmVydF95dXZfdG9fcmdiX21teC5hc20nLAotICAgICAgICAgICAgJ2Jhc2Uvc2ltZC9jb252ZXJ0X3l1dl90b19yZ2JfbW14LmluYycsCi0gICAgICAgICAgICAnYmFzZS9zaW1kL2NvbnZlcnRfeXV2X3RvX3JnYl9zc2UuYXNtJywKLSAgICAgICAgICAgICdiYXNlL3NpbWQvY29udmVydF95dXZfdG9fcmdiX3g4Ni5jYycsCi0gICAgICAgICAgICAnYmFzZS9zaW1kL2ZpbHRlcl95dXYuaCcsCi0gICAgICAgICAgICAnYmFzZS9zaW1kL2ZpbHRlcl95dXZfYy5jYycsCi0gICAgICAgICAgICAnYmFzZS9zaW1kL2ZpbHRlcl95dXZfbW14LmNjJywKLSAgICAgICAgICAgICdiYXNlL3NpbWQvZmlsdGVyX3l1dl9zc2UyLmNjJywKLSAgICAgICAgICAgICdiYXNlL3NpbWQvbGluZWFyX3NjYWxlX3l1dl90b19yZ2JfbW14LmFzbScsCi0gICAgICAgICAgICAnYmFzZS9zaW1kL2xpbmVhcl9zY2FsZV95dXZfdG9fcmdiX21teC5pbmMnLAotICAgICAgICAgICAgJ2Jhc2Uvc2ltZC9saW5lYXJfc2NhbGVfeXV2X3RvX3JnYl9zc2UuYXNtJywKLSAgICAgICAgICAgICdiYXNlL3NpbWQvc2NhbGVfeXV2X3RvX3JnYl9tbXguYXNtJywKLSAgICAgICAgICAgICdiYXNlL3NpbWQvc2NhbGVfeXV2X3RvX3JnYl9tbXguaW5jJywKLSAgICAgICAgICAgICdiYXNlL3NpbWQvc2NhbGVfeXV2X3RvX3JnYl9zc2UuYXNtJywKLSAgICAgICAgICAgICdiYXNlL3NpbWQveXV2X3RvX3JnYl90YWJsZS5jYycsCi0gICAgICAgICAgICAnYmFzZS9zaW1kL3l1dl90b19yZ2JfdGFibGUuaCcsCi0gICAgICAgICAgXSwKLSAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKLSAgICAgICAgICAgIFsgJ3RhcmdldF9hcmNoID09ICJ4NjQiJywgewotICAgICAgICAgICAgICAjIFNvdXJjZSBmaWxlcyBvcHRpbWl6ZWQgZm9yIFg2NCBzeXN0ZW1zLgotICAgICAgICAgICAgICAnc291cmNlcyc6IFsKLSAgICAgICAgICAgICAgICAnYmFzZS9zaW1kL2xpbmVhcl9zY2FsZV95dXZfdG9fcmdiX21teF94NjQuYXNtJywKLSAgICAgICAgICAgICAgICAnYmFzZS9zaW1kL3NjYWxlX3l1dl90b19yZ2Jfc3NlMl94NjQuYXNtJywKLSAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgIH1dLAotICAgICAgICAgICAgWyAnb3NfcG9zaXggPT0gMSBhbmQgT1MgIT0gIm1hYyIgYW5kIE9TICE9ICJhbmRyb2lkIicsIHsKLSAgICAgICAgICAgICAgJ2NmbGFncyc6IFsKLSAgICAgICAgICAgICAgICAnLW1zc2UyJywKLSAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgIH1dLAotICAgICAgICAgICAgWyAnT1MgPT0gIm1hYyInLCB7Ci0gICAgICAgICAgICAgICdjb25maWd1cmF0aW9ucyc6IHsKLSAgICAgICAgICAgICAgICAnRGVidWcnOiB7Ci0gICAgICAgICAgICAgICAgICAneGNvZGVfc2V0dGluZ3MnOiB7Ci0gICAgICAgICAgICAgICAgICAgICMgZ2NjIG9uIHRoZSBtYWMgYnVpbGRzIGhvcnJpYmx5IHVub3B0aW1pemVkIHNzZSBjb2RlIGluCi0gICAgICAgICAgICAgICAgICAgICMgZGVidWcgbW9kZS4gU2luY2UgdGhpcyBpcyByYXJlbHkgZ29pbmcgdG8gYmUgZGVidWdnZWQsCi0gICAgICAgICAgICAgICAgICAgICMgcnVuIHdpdGggZnVsbCBvcHRpbWl6YXRpb25zIGluIERlYnVnIGFzIHdlbGwgYXMgUmVsZWFzZS4KLSAgICAgICAgICAgICAgICAgICAgJ0dDQ19PUFRJTUlaQVRJT05fTEVWRUwnOiAnMycsICAjIC1PMwotICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICB9XSwKLSAgICAgICAgICAgIFsgJ09TPT0id2luIicsIHsKLSAgICAgICAgICAgICAgJ3ZhcmlhYmxlcyc6IHsKLSAgICAgICAgICAgICAgICAneWFzbV9mbGFncyc6IFsKLSAgICAgICAgICAgICAgICAgICctRFdJTjMyJywKLSAgICAgICAgICAgICAgICAgICctRE1TVkMnLAotICAgICAgICAgICAgICAgICAgJy1EQ0hST01JVU0nLAotICAgICAgICAgICAgICAgICAgJy1Jc2ltZCcsCi0gICAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIH1dLAotICAgICAgICAgICAgWyAnT1M9PSJtYWMiJywgewotICAgICAgICAgICAgICAndmFyaWFibGVzJzogewotICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogWwotICAgICAgICAgICAgICAgICAgWyAndGFyZ2V0X2FyY2g9PSJpYTMyIicsIHsKLSAgICAgICAgICAgICAgICAgICAgJ3lhc21fZmxhZ3MnOiBbCi0gICAgICAgICAgICAgICAgICAgICAgJy1EUFJFRklYJywKLSAgICAgICAgICAgICAgICAgICAgICAnLURNQUNITycsCi0gICAgICAgICAgICAgICAgICAgICAgJy1EQ0hST01JVU0nLAotICAgICAgICAgICAgICAgICAgICAgICctSXNpbWQnLAotICAgICAgICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgICAgICAgfSwgewotICAgICAgICAgICAgICAgICAgICAneWFzbV9mbGFncyc6IFsKLSAgICAgICAgICAgICAgICAgICAgICAnLURQUkVGSVgnLAotICAgICAgICAgICAgICAgICAgICAgICctREFSQ0hfWDg2XzY0JywKLSAgICAgICAgICAgICAgICAgICAgICAnLURNQUNITycsCi0gICAgICAgICAgICAgICAgICAgICAgJy1EQ0hST01JVU0nLAotICAgICAgICAgICAgICAgICAgICAgICctSXNpbWQnLAotICAgICAgICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgICAgICAgfV0sCi0gICAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIH1dLAotICAgICAgICAgICAgWyAnb3NfcG9zaXg9PTEgYW5kIE9TIT0ibWFjIicsIHsKLSAgICAgICAgICAgICAgJ3ZhcmlhYmxlcyc6IHsKLSAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKLSAgICAgICAgICAgICAgICAgIFsgJ3RhcmdldF9hcmNoPT0iaWEzMiInLCB7Ci0gICAgICAgICAgICAgICAgICAgICd5YXNtX2ZsYWdzJzogWwotICAgICAgICAgICAgICAgICAgICAgICctRFg4Nl8zMicsCi0gICAgICAgICAgICAgICAgICAgICAgJy1ERUxGJywKLSAgICAgICAgICAgICAgICAgICAgICAnLURDSFJPTUlVTScsCi0gICAgICAgICAgICAgICAgICAgICAgJy1Jc2ltZCcsCi0gICAgICAgICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAgICAgICB9LCB7Ci0gICAgICAgICAgICAgICAgICAgICd5YXNtX2ZsYWdzJzogWwotICAgICAgICAgICAgICAgICAgICAgICctREFSQ0hfWDg2XzY0JywKLSAgICAgICAgICAgICAgICAgICAgICAnLURFTEYnLAotICAgICAgICAgICAgICAgICAgICAgICctRFBJQycsCi0gICAgICAgICAgICAgICAgICAgICAgJy1EQ0hST01JVU0nLAotICAgICAgICAgICAgICAgICAgICAgICctSXNpbWQnLAotICAgICAgICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgICAgICAgfV0sCi0gICAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIH1dLAotICAgICAgICAgIF0sCi0gICAgICAgICAgJ3ZhcmlhYmxlcyc6IHsKLSAgICAgICAgICAgICd5YXNtX291dHB1dF9wYXRoJzogJzwoU0hBUkVEX0lOVEVSTUVESUFURV9ESVIpL21lZGlhJywKLSAgICAgICAgICB9LAotICAgICAgICAgICdtc3ZzXzIwMTBfZGlzYWJsZV91bGRpX3doZW5fcmVmZXJlbmNlZCc6IDEsCi0gICAgICAgICAgIyBDb21tZW50IHRoaXMgb3V0IHNvIHdlIG5vIGxvbmdlciBkZXBlbmRzIG9uIHlhc21fY29tcGlsZS5neXBpLgotICAgICAgICAgICMgQ2hvb3NlIHRvIGNvbW1lbnQgaW5zdGVhZCBvZiByZW1vdmluZyBzbyB3ZSB3b3VsZG4ndCBnZXQgbG9zdCBpZiB3ZQotICAgICAgICAgICMgZXZlciB3YW50IHRvIGdldCBpdCBiYWNrLgotICAgICAgICAgICMgJ2luY2x1ZGVzJzogWwotICAgICAgICAgICMgICcuLi90aGlyZF9wYXJ0eS95YXNtL3lhc21fY29tcGlsZS5neXBpJywKLSAgICAgICAgICAjIF0sCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAndGFyZ2V0X25hbWUnOiAneXV2X2NvbnZlcnRfc2ltZF9jJywKLSAgICAgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCi0gICAgICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKLSAgICAgICAgICAgICcuLicsCi0gICAgICAgICAgXSwKLSAgICAgICAgICAnc291cmNlcyc6IFsKLSAgICAgICAgICAgICdiYXNlL3NpbWQvY29udmVydF9yZ2JfdG9feXV2LmgnLAotICAgICAgICAgICAgJ2Jhc2Uvc2ltZC9jb252ZXJ0X3JnYl90b195dXZfYy5jYycsCi0gICAgICAgICAgICAnYmFzZS9zaW1kL2NvbnZlcnRfeXV2X3RvX3JnYi5oJywKLSAgICAgICAgICAgICdiYXNlL3NpbWQvY29udmVydF95dXZfdG9fcmdiX2MuY2MnLAotICAgICAgICAgICAgJ2Jhc2Uvc2ltZC9maWx0ZXJfeXV2LmgnLAotICAgICAgICAgICAgJ2Jhc2Uvc2ltZC9maWx0ZXJfeXV2X2MuY2MnLAotICAgICAgICAgICAgJ2Jhc2Uvc2ltZC95dXZfdG9fcmdiX3RhYmxlLmNjJywKLSAgICAgICAgICAgICdiYXNlL3NpbWQveXV2X3RvX3JnYl90YWJsZS5oJywKLSAgICAgICAgICBdLAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgJ3RhcmdldF9uYW1lJzogJ3F0X2Zhc3RzdGFydCcsCi0gICAgICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCi0gICAgICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICAgICAndG9vbHMvcXRfZmFzdHN0YXJ0L3F0X2Zhc3RzdGFydC5jJwotICAgICAgICAgIF0sCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAndGFyZ2V0X25hbWUnOiAnc2Vla190ZXN0ZXInLAotICAgICAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAotICAgICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCi0gICAgICAgICAgICAnbWVkaWEnLAotICAgICAgICAgICAgJy4uL2Jhc2UvYmFzZS5neXA6YmFzZScsCi0gICAgICAgICAgXSwKLSAgICAgICAgICAnc291cmNlcyc6IFsKLSAgICAgICAgICAgICd0b29scy9zZWVrX3Rlc3Rlci9zZWVrX3Rlc3Rlci5jYycsCi0gICAgICAgICAgXSwKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICd0YXJnZXRfbmFtZSc6ICdkZW11eGVyX2JlbmNoJywKLSAgICAgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKLSAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAgICAgJ21lZGlhJywKLSAgICAgICAgICAgICcuLi9iYXNlL2Jhc2UuZ3lwOmJhc2UnLAotICAgICAgICAgIF0sCi0gICAgICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICAgICAndG9vbHMvZGVtdXhlcl9iZW5jaC9kZW11eGVyX2JlbmNoLmNjJywKLSAgICAgICAgICBdLAotICAgICAgICB9LAotICAgICAgXSwKLSAgICB9XSwKLSAgICBbJ09TID09ICJsaW51eCIgYW5kIHRhcmdldF9hcmNoICE9ICJhcm0iIGFuZCB0YXJnZXRfYXJjaCAhPSAibWlwc2VsIicsIHsKLSAgICAgICd0YXJnZXRzJzogWwotICAgICAgICB7Ci0gICAgICAgICAgJ3RhcmdldF9uYW1lJzogJ3RpbGVfcmVuZGVyX2JlbmNoJywKLSAgICAgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKLSAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAgICAgJy4uL2Jhc2UvYmFzZS5neXA6YmFzZScsCi0gICAgICAgICAgICAnLi4vdWkvZ2wvZ2wuZ3lwOmdsJywKLSAgICAgICAgICBdLAotICAgICAgICAgICdsaWJyYXJpZXMnOiBbCi0gICAgICAgICAgICAnLWxHTCcsCi0gICAgICAgICAgICAnLWxkbCcsCi0gICAgICAgICAgXSwKLSAgICAgICAgICAnc291cmNlcyc6IFsKLSAgICAgICAgICAgICd0b29scy90aWxlX3JlbmRlcl9iZW5jaC90aWxlX3JlbmRlcl9iZW5jaC5jYycsCi0gICAgICAgICAgXSwKLSAgICAgICAgfSwKLSAgICAgIF0sCi0gICAgfV0sCi0gICAgWycoT1MgPT0gImxiX3NoZWxsIiBvciBPUyA9PSAic3RhcmJvYXJkIikgYW5kIHRhcmdldF9hcmNoID09ICJwczMiJywgewotICAgICAgJ3RhcmdldHMnOiBbCi0gICAgICAgIHsKLSAgICAgICAgICAjIHRoaXMgdGFyZ2V0IGJ1aWxkcyBTUFUgdGFzayBvYmplY3RzIGludG8gYSBQUFUtbGlua2FibGUgc3RhdGljIGxpYnJhcnkKLSAgICAgICAgICAjIHRoYXQgaXMgdGhlbiBsaW5rZWQgd2l0aCB0aGUgbWFpbiBleGVjdXRhYmxlLgotICAgICAgICAgICMKLSAgICAgICAgICAjIEhPUlJJQkxFTkVTUyBXQVJOSU5HOgotICAgICAgICAgICMgdGhlIHB5dGhvbiBzY3JpcHQgaW4gdGhlIHJ1bGUgYWN0aW9uIGNvbnRhaW5zIGNvbXBpbGVyIGFuZCBsaW5rZXIKLSAgICAgICAgICAjIGZsYWdzIGFuZCBkZXRlcm1pbmVzIGJ1aWxkIGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gdGhlIHByZXNlbmNlIG9mCi0gICAgICAgICAgIyB0aGUgc3RyaW5nICdEZWJ1ZycgaW4gdGhlIG91dHB1dCBkaXJlY3RvcnkuIEknbSB2ZXJ5IHNvcnJ5LgotICAgICAgICAgICMgVE9ETzogcmVmYWN0b3Igc2NyaXB0IHRvIHRha2UgbW9yZSBkZWZpbmVzIGZyb20gdGhlIGNvbW1hbmQgbGluZS4uCi0gICAgICAgICAgJ3RhcmdldF9uYW1lJzogJ3NwdXJzX3Rhc2tzJywKLSAgICAgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCi0gICAgICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICAgICAnPChJTlRFUk1FRElBVEVfRElSKS9zaW5jX3Jlc2FtcGxlci5vJywKLSAgICAgICAgICBdLAotICAgICAgICAgICdhY3Rpb25zJzogWwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAnYWN0aW9uX25hbWUnIDogJ3NwdXJzX3Rhc2tzX2J1aWxkZXInLAotICAgICAgICAgICAgICAndmFyaWFibGVzJzogewotICAgICAgICAgICAgICAgICdzcHVfc291cmNlJzogWwotICAgICAgICAgICAgICAgICAgJ2F1ZGlvL3NwdXJzL3Rhc2tzL3NpbmNfcmVzYW1wbGVyLmMnLAotICAgICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAgICAgJ3NwdV9pbmNsdWRlcyc6IFsKLSAgICAgICAgICAgICAgICAgICdhdWRpby9zcHVycy90YXNrcy9zcHVfbG9nLmgnLAotICAgICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICdpbnB1dHMnIDogWwotICAgICAgICAgICAgICAgICc8QChzcHVfc291cmNlKScsCi0gICAgICAgICAgICAgICAgJzxAKHNwdV9pbmNsdWRlcyknLAotICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgICAnb3V0cHV0cycgOiBbCi0gICAgICAgICAgICAgICAgJzwoSU5URVJNRURJQVRFX0RJUikvc2luY19yZXNhbXBsZXIubycsCi0gICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAgICdhY3Rpb24nOiBbCi0gICAgICAgICAgICAgICAgJ3B5dGhvbicsCi0gICAgICAgICAgICAgICAgJ2F1ZGlvL3NwdXJzL3NjcmlwdHMvc3B1X3Rhc2tfdG9fcHB1X29iai5weScsCi0gICAgICAgICAgICAgICAgJzwoSU5URVJNRURJQVRFX0RJUiknLAotICAgICAgICAgICAgICAgICc8KFNIQVJFRF9JTlRFUk1FRElBVEVfRElSKS9zcHUnLAotICAgICAgICAgICAgICAgICc8QChzcHVfc291cmNlKScsCi0gICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAgICdtc3ZzX2N5Z3dpbl9zaGVsbCcgOiAxLAotICAgICAgICAgICAgfSwKLSAgICAgICAgICBdLAotICAgICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCi0gICAgICAgICAgICAnc2luY19yZXNhbXBsZXJfdGFibGUnCi0gICAgICAgICAgXSwKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICd0YXJnZXRfbmFtZSc6ICdzaW5jX3Jlc2FtcGxlcl90YWJsZScsCi0gICAgICAgICAgJ3R5cGUnOiAnbm9uZScsCi0gICAgICAgICAgJ2hhcmRfZGVwZW5kZW5jeSc6IDEsCi0gICAgICAgICAgJ2FjdGlvbnMnOiBbCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICdhY3Rpb25fbmFtZSc6ICdnZW5lcmF0ZV9zaW5jX3Jlc2FtcGxlcl90YWJsZScsCi0gICAgICAgICAgICAgICdpbnB1dHMnOiBbCi0gICAgICAgICAgICAgICAgJ2F1ZGlvL3NwdXJzL3NjcmlwdHMvYnVpbGRfc2luY190YWJsZS5weScsCi0gICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAgICdvdXRwdXRzJzogWwotICAgICAgICAgICAgICAgICMgcGxlYXNlIGtlZXAgdGhpcyBsaXN0IHRvIGp1c3QgdGhpcyBvbmUgZmlsZQotICAgICAgICAgICAgICAgICc8KFNIQVJFRF9JTlRFUk1FRElBVEVfRElSKS9zcHUvc2luY190YWJsZS5jJywKLSAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICAgJ2FjdGlvbic6IFsncHl0aG9uJywgJ2F1ZGlvL3NwdXJzL3NjcmlwdHMvYnVpbGRfc2luY190YWJsZS5weScsICc8QChfb3V0cHV0cyknXSwKLSAgICAgICAgICAgICAgJ21lc3NhZ2UnOiAnZ2VuZXJhdGluZyBzaW5jIHJlc2FtcGxlciB0YWJsZSBpbiA8QChfb3V0cHV0cyknLAotICAgICAgICAgICAgICAnbXN2c19jeWd3aW5fc2hlbGwnIDogMSwKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgXSwKLSAgICAgICAgfSwKLSAgICAgIF0sCi0gICAgfV0sCi0gICAgWydvc19wb3NpeCA9PSAxIGFuZCBPUyAhPSAibWFjIiBhbmQgT1MgIT0gImFuZHJvaWQiIGFuZCBPUyAhPSAibGJfc2hlbGwiJywgewotICAgICAgJ3RhcmdldHMnOiBbCi0gICAgICAgIHsKLSAgICAgICAgICAndGFyZ2V0X25hbWUnOiAncGxheWVyX3gxMScsCi0gICAgICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCi0gICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgICAgICdtZWRpYScsCi0gICAgICAgICAgICAneXV2X2NvbnZlcnQnLAotICAgICAgICAgICAgJy4uL2Jhc2UvYmFzZS5neXA6YmFzZScsCi0gICAgICAgICAgICAnLi4vdWkvZ2wvZ2wuZ3lwOmdsJywKLSAgICAgICAgICAgICcuLi91aS91aS5neXA6dWknLAotICAgICAgICAgIF0sCi0gICAgICAgICAgJ2xpbmtfc2V0dGluZ3MnOiB7Ci0gICAgICAgICAgICAnbGlicmFyaWVzJzogWwotICAgICAgICAgICAgICAnLWxkbCcsCi0gICAgICAgICAgICAgICctbFgxMScsCi0gICAgICAgICAgICAgICctbFhyZW5kZXInLAotICAgICAgICAgICAgICAnLWxYZXh0JywKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgfSwKLSAgICAgICAgICAnc291cmNlcyc6IFsKLSAgICAgICAgICAgICd0b29scy9wbGF5ZXJfeDExL2RhdGFfc291cmNlX2xvZ2dlci5jYycsCi0gICAgICAgICAgICAndG9vbHMvcGxheWVyX3gxMS9kYXRhX3NvdXJjZV9sb2dnZXIuaCcsCi0gICAgICAgICAgICAndG9vbHMvcGxheWVyX3gxMS9nbF92aWRlb19yZW5kZXJlci5jYycsCi0gICAgICAgICAgICAndG9vbHMvcGxheWVyX3gxMS9nbF92aWRlb19yZW5kZXJlci5oJywKLSAgICAgICAgICAgICd0b29scy9wbGF5ZXJfeDExL3BsYXllcl94MTEuY2MnLAotICAgICAgICAgICAgJ3Rvb2xzL3BsYXllcl94MTEveDExX3ZpZGVvX3JlbmRlcmVyLmNjJywKLSAgICAgICAgICAgICd0b29scy9wbGF5ZXJfeDExL3gxMV92aWRlb19yZW5kZXJlci5oJywKLSAgICAgICAgICBdLAotICAgICAgICB9LAotICAgICAgXSwKLSAgICB9XSwKLSAgICAjIFNwZWNpYWwgdGFyZ2V0IHRvIHdyYXAgYSBndGVzdF90YXJnZXRfdHlwZT09c2hhcmVkX2xpYnJhcnkKLSAgICAjIG1lZGlhX3VuaXR0ZXN0cyBpbnRvIGFuIGFuZHJvaWQgYXBrIGZvciBleGVjdXRpb24uCi0gICAgWydPUyA9PSAiYW5kcm9pZCIgYW5kIGd0ZXN0X3RhcmdldF90eXBlID09ICJzaGFyZWRfbGlicmFyeSInLCB7Ci0gICAgICAndGFyZ2V0cyc6IFsKLSAgICAgICAgewotICAgICAgICAgICd0YXJnZXRfbmFtZSc6ICdtZWRpYV91bml0dGVzdHNfYXBrJywKLSAgICAgICAgICAndHlwZSc6ICdub25lJywKLSAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAgICAgJ21lZGlhX2phdmEnLAotICAgICAgICAgICAgJ21lZGlhX3VuaXR0ZXN0cycsCi0gICAgICAgICAgXSwKLSAgICAgICAgICAndmFyaWFibGVzJzogewotICAgICAgICAgICAgJ3Rlc3Rfc3VpdGVfbmFtZSc6ICdtZWRpYV91bml0dGVzdHMnLAotICAgICAgICAgICAgJ2lucHV0X3NobGliX3BhdGgnOiAnPChTSEFSRURfTElCX0RJUikvPChTSEFSRURfTElCX1BSRUZJWCltZWRpYV91bml0dGVzdHM8KFNIQVJFRF9MSUJfU1VGRklYKScsCi0gICAgICAgICAgfSwKLSAgICAgICAgICAnaW5jbHVkZXMnOiBbICcuLi9idWlsZC9hcGtfdGVzdC5neXBpJyBdLAotICAgICAgICB9LAotICAgICAgXSwKLSAgICB9XSwKLSAgICBbJ09TID09ICJhbmRyb2lkIicsIHsKLSAgICAgICd0YXJnZXRzJzogWwotICAgICAgICB7Ci0gICAgICAgICAgJ3RhcmdldF9uYW1lJzogJ21lZGlhX3BsYXllcl9qbmlfaGVhZGVycycsCi0gICAgICAgICAgJ3R5cGUnOiAnbm9uZScsCi0gICAgICAgICAgJ3ZhcmlhYmxlcyc6IHsKLSAgICAgICAgICAgICdqbmlfZ2VuX2Rpcic6ICdtZWRpYScsCi0gICAgICAgICAgICAnaW5wdXRfamF2YV9jbGFzcyc6ICdhbmRyb2lkL21lZGlhL01lZGlhUGxheWVyLmNsYXNzJywKLSAgICAgICAgICAgICdpbnB1dF9qYXJfZmlsZSc6ICc8KGFuZHJvaWRfc2RrKS9hbmRyb2lkLmphcicsCi0gICAgICAgICAgfSwKLSAgICAgICAgICAnaW5jbHVkZXMnOiBbICcuLi9idWlsZC9qYXJfZmlsZV9qbmlfZ2VuZXJhdG9yLmd5cGknIF0sCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAndGFyZ2V0X25hbWUnOiAncGxheWVyX2FuZHJvaWRfam5pX2hlYWRlcnMnLAotICAgICAgICAgICd0eXBlJzogJ25vbmUnLAotICAgICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCi0gICAgICAgICAgICAnbWVkaWFfcGxheWVyX2puaV9oZWFkZXJzJywKLSAgICAgICAgICBdLAotICAgICAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAgICAgJ2Jhc2UvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vbWVkaWEvQXVkaW9Gb2N1c0JyaWRnZS5qYXZhJywKLSAgICAgICAgICAgICdiYXNlL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL21lZGlhL0F1ZGlvVHJhY2tCcmlkZ2UuamF2YScsCi0gICAgICAgICAgICAnYmFzZS9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9tZWRpYS9NZWRpYUNvZGVjQnJpZGdlLmphdmEnLAotICAgICAgICAgICAgJ2Jhc2UvYW5kcm9pZC9qYXZhL3NyYy9vcmcvY2hyb21pdW0vbWVkaWEvTWVkaWFEcm1CcmlkZ2UuamF2YScsCi0gICAgICAgICAgICAnYmFzZS9hbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9tZWRpYS9NZWRpYVBsYXllckJyaWRnZS5qYXZhJywKLSAgICAgICAgICAgICdiYXNlL2FuZHJvaWQvamF2YS9zcmMvb3JnL2Nocm9taXVtL21lZGlhL01lZGlhUGxheWVyTGlzdGVuZXIuamF2YScsCi0gICAgICAgICAgXSwKLSAgICAgICAgICAndmFyaWFibGVzJzogewotICAgICAgICAgICAgJ2puaV9nZW5fZGlyJzogJ21lZGlhJywKLSAgICAgICAgICB9LAotICAgICAgICAgICdpbmNsdWRlcyc6IFsgJy4uL2J1aWxkL2puaV9nZW5lcmF0b3IuZ3lwaScgXSwKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICd0YXJnZXRfbmFtZSc6ICdwbGF5ZXJfYW5kcm9pZCcsCi0gICAgICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAotICAgICAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAgICAgJ2Jhc2UvYW5kcm9pZC9hdWRpb19mb2N1c19icmlkZ2UuY2MnLAotICAgICAgICAgICAgJ2Jhc2UvYW5kcm9pZC9hdWRpb19mb2N1c19icmlkZ2UuaCcsCi0gICAgICAgICAgICAnYmFzZS9hbmRyb2lkL2F1ZGlvX3RyYWNrX2JyaWRnZS5jYycsCi0gICAgICAgICAgICAnYmFzZS9hbmRyb2lkL2F1ZGlvX3RyYWNrX2JyaWRnZS5oJywKLSAgICAgICAgICAgICdiYXNlL2FuZHJvaWQvbWVkaWFfY29kZWNfYnJpZGdlLmNjJywKLSAgICAgICAgICAgICdiYXNlL2FuZHJvaWQvbWVkaWFfY29kZWNfYnJpZGdlLmgnLAotICAgICAgICAgICAgJ2Jhc2UvYW5kcm9pZC9tZWRpYV9kcm1fYnJpZGdlLmNjJywKLSAgICAgICAgICAgICdiYXNlL2FuZHJvaWQvbWVkaWFfZHJtX2JyaWRnZS5oJywKLSAgICAgICAgICAgICdiYXNlL2FuZHJvaWQvbWVkaWFfam5pX3JlZ2lzdHJhci5jYycsCi0gICAgICAgICAgICAnYmFzZS9hbmRyb2lkL21lZGlhX2puaV9yZWdpc3RyYXIuaCcsCi0gICAgICAgICAgICAnYmFzZS9hbmRyb2lkL21lZGlhX3BsYXllcl9icmlkZ2UuY2MnLAotICAgICAgICAgICAgJ2Jhc2UvYW5kcm9pZC9tZWRpYV9wbGF5ZXJfYnJpZGdlLmgnLAotICAgICAgICAgICAgJ2Jhc2UvYW5kcm9pZC9tZWRpYV9wbGF5ZXJfbGlzdGVuZXIuY2MnLAotICAgICAgICAgICAgJ2Jhc2UvYW5kcm9pZC9tZWRpYV9wbGF5ZXJfbGlzdGVuZXIuaCcsCi0gICAgICAgICAgXSwKLSAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAgICAgJy4uL2Jhc2UvYmFzZS5neXA6YmFzZScsCi0gICAgICAgICAgICAncGxheWVyX2FuZHJvaWRfam5pX2hlYWRlcnMnLAotICAgICAgICAgIF0sCi0gICAgICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKLSAgICAgICAgICAgICc8KFNIQVJFRF9JTlRFUk1FRElBVEVfRElSKS9tZWRpYScsCi0gICAgICAgICAgXSwKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICd0YXJnZXRfbmFtZSc6ICdtZWRpYV9qYXZhJywKLSAgICAgICAgICAndHlwZSc6ICdub25lJywKLSAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAgICAgJy4uL2Jhc2UvYmFzZS5neXA6YmFzZScsCi0gICAgICAgICAgXSwKLSAgICAgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKLSAgICAgICAgICAgICcuLi9iYXNlL2Jhc2UuZ3lwOmJhc2UnLAotICAgICAgICAgIF0sCi0gICAgICAgICAgJ3ZhcmlhYmxlcyc6IHsKLSAgICAgICAgICAgICdwYWNrYWdlX25hbWUnOiAnbWVkaWEnLAotICAgICAgICAgICAgJ2phdmFfaW5fZGlyJzogJ2Jhc2UvYW5kcm9pZC9qYXZhJywKLSAgICAgICAgICB9LAotICAgICAgICAgICdpbmNsdWRlcyc6IFsgJy4uL2J1aWxkL2phdmEuZ3lwaScgXSwKLSAgICAgICAgfSwKLQotICAgICAgXSwKLSAgICB9XSwKLSAgXSwKLX0KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9tZWRpYV91bnRydXN0ZWQuZ3lwIGIvc3JjL21lZGlhL21lZGlhX3VudHJ1c3RlZC5neXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOWY3ZDEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL21lZGlhX3VudHJ1c3RlZC5neXAKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi17Ci0gICd2YXJpYWJsZXMnOiB7Ci0gICAgJ2Nocm9taXVtX2NvZGUnOiAxLAotICB9LAotICAnaW5jbHVkZXMnOiBbCi0gICAgJy4uL25hdGl2ZV9jbGllbnQvYnVpbGQvdW50cnVzdGVkLmd5cGknLAotICBdLAotICAnY29uZGl0aW9ucyc6IFsKLSAgICBbJ2Rpc2FibGVfbmFjbD09MCcsIHsKLSAgICAgICd0YXJnZXRzJzogWwotICAgICAgICB7Ci0gICAgICAgICAgJ3RhcmdldF9uYW1lJzogJ3NoYXJlZF9tZW1vcnlfc3VwcG9ydF91bnRydXN0ZWQnLAotICAgICAgICAgICd0eXBlJzogJ25vbmUnLAotICAgICAgICAgICd2YXJpYWJsZXMnOiB7Ci0gICAgICAgICAgICAnbmFjbF91bnRydXN0ZWRfYnVpbGQnOiAxLAotICAgICAgICAgICAgJ25saWJfdGFyZ2V0JzogJ2xpYnNoYXJlZF9tZW1vcnlfc3VwcG9ydF91bnRydXN0ZWQuYScsCi0gICAgICAgICAgICAnYnVpbGRfZ2xpYmMnOiAwLAotICAgICAgICAgICAgJ2J1aWxkX25ld2xpYic6IDEsCi0gICAgICAgICAgfSwKLSAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAgICAgJy4uL25hdGl2ZV9jbGllbnQvdG9vbHMuZ3lwOnByZXBfdG9vbGNoYWluJywKLSAgICAgICAgICAgICcuLi9iYXNlL2Jhc2VfdW50cnVzdGVkLmd5cDpiYXNlX3VudHJ1c3RlZCcsCi0gICAgICAgICAgXSwKLSAgICAgICAgICAnZGVmaW5lcyc6IFsKLSAgICAgICAgICAgICdNRURJQV9JTVBMRU1FTlRBVElPTicsCi0gICAgICAgICAgXSwKLSAgICAgICAgICAnaW5jbHVkZV9kaXJzJzogWwotICAgICAgICAgICAgJy4uJywKLSAgICAgICAgICBdLAotICAgICAgICAgICdpbmNsdWRlcyc6IFsKLSAgICAgICAgICAgICdzaGFyZWRfbWVtb3J5X3N1cHBvcnQuZ3lwaScsCi0gICAgICAgICAgXSwKLSAgICAgICAgICAnc291cmNlcyc6IFsKLSAgICAgICAgICAgICc8QChzaGFyZWRfbWVtb3J5X3N1cHBvcnRfc291cmNlcyknLAotICAgICAgICAgIF0sCi0gICAgICAgIH0sCi0gICAgICBdLAotICAgIH1dLAotICBdLAotfQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL21wNC9hYWMuY2MgYi9zcmMvbWVkaWEvbXA0L2FhYy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA3OTQyOC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvbXA0L2FhYy5jYworKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvbXA0L2FhYy5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9iaXRfcmVhZGVyLmgiCi0jaW5jbHVkZSAibWVkaWEvbXA0L3JjaGVjay5oIgotCi0vLyBUaGUgZm9sbG93aW5nIGNvbnZlcnNpb24gdGFibGUgaXMgZXh0cmFjdGVkIGZyb20gSVNPIDE0NDk2IFBhcnQgMyAtCi0vLyBUYWJsZSAxLjE2IC0gU2FtcGxpbmcgRnJlcXVlbmN5IEluZGV4Lgotc3RhdGljIGNvbnN0IGludCBrRnJlcXVlbmN5TWFwW10gPSB7Ci0gIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsIDI0MDAwLAotICAyMjA1MCwgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMCwgNzM1MAotfTsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotc3RhdGljIENoYW5uZWxMYXlvdXQgR2V0Q2hhbm5lbExheW91dCh1aW50OCBjaGFubmVsX2NvbmZpZykgewotICBzd2l0Y2ggKGNoYW5uZWxfY29uZmlnKSB7Ci0gICAgY2FzZSAxOgotICAgICAgcmV0dXJuIENIQU5ORUxfTEFZT1VUX01PTk87Ci0gICAgY2FzZSAyOgotICAgICAgcmV0dXJuIENIQU5ORUxfTEFZT1VUX1NURVJFTzsKLSAgICBjYXNlIDM6Ci0gICAgICByZXR1cm4gQ0hBTk5FTF9MQVlPVVRfU1VSUk9VTkQ7Ci0gICAgY2FzZSA0OgotICAgICAgcmV0dXJuIENIQU5ORUxfTEFZT1VUXzRfMDsKLSAgICBjYXNlIDU6Ci0gICAgICByZXR1cm4gQ0hBTk5FTF9MQVlPVVRfNV8wOwotICAgIGNhc2UgNjoKLSAgICAgIHJldHVybiBDSEFOTkVMX0xBWU9VVF81XzE7Ci0gICAgY2FzZSA4OgotICAgICAgcmV0dXJuIENIQU5ORUxfTEFZT1VUXzdfMTsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gQ0hBTk5FTF9MQVlPVVRfVU5TVVBQT1JURUQ7Ci19Ci0KLW5hbWVzcGFjZSBtcDQgewotCi1BQUM6OkFBQygpCi0gICAgOiBwcm9maWxlXygwKSwgZnJlcXVlbmN5X2luZGV4XygwKSwgY2hhbm5lbF9jb25maWdfKDApLCBmcmVxdWVuY3lfKDApLAotICAgICAgZXh0ZW5zaW9uX2ZyZXF1ZW5jeV8oMCksIGNoYW5uZWxfbGF5b3V0XyhDSEFOTkVMX0xBWU9VVF9VTlNVUFBPUlRFRCkgewotfQotCi1BQUM6On5BQUMoKSB7Ci19Ci0KLWJvb2wgQUFDOjpQYXJzZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OD4mIGRhdGEpIHsKLSAgaWYgKGRhdGEuZW1wdHkoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmF3X2RhdGFfID0gZGF0YTsKLQotICBCaXRSZWFkZXIgcmVhZGVyKCZkYXRhWzBdLCBkYXRhLnNpemUoKSk7Ci0gIHVpbnQ4IGV4dGVuc2lvbl90eXBlID0gMDsKLSAgYm9vbCBwc19wcmVzZW50ID0gZmFsc2U7Ci0gIHVpbnQ4IGV4dGVuc2lvbl9mcmVxdWVuY3lfaW5kZXggPSAweGZmOwotCi0gIGZyZXF1ZW5jeV8gPSAwOwotICBleHRlbnNpb25fZnJlcXVlbmN5XyA9IDA7Ci0KLSAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIGlzIHdyaXR0ZW4gYWNjb3JkaW5nIHRvIElTTyAxNDQ5NiBQYXJ0IDMgVGFibGUgMS4xMyAtCi0gIC8vIFN5bnRheCBvZiBBdWRpb1NwZWNpZmljQ29uZmlnLgotCi0gIC8vIFJlYWQgYmFzZSBjb25maWd1cmF0aW9uCi0gIFJDSEVDSyhyZWFkZXIuUmVhZEJpdHMoNSwgJnByb2ZpbGVfKSk7Ci0gIFJDSEVDSyhyZWFkZXIuUmVhZEJpdHMoNCwgJmZyZXF1ZW5jeV9pbmRleF8pKTsKLSAgaWYgKGZyZXF1ZW5jeV9pbmRleF8gPT0gMHhmKQotICAgIFJDSEVDSyhyZWFkZXIuUmVhZEJpdHMoMjQsICZmcmVxdWVuY3lfKSk7Ci0gIFJDSEVDSyhyZWFkZXIuUmVhZEJpdHMoNCwgJmNoYW5uZWxfY29uZmlnXykpOwotCi0gIC8vIFJlYWQgZXh0ZW5zaW9uIGNvbmZpZ3VyYXRpb24uCi0gIGlmIChwcm9maWxlXyA9PSA1IHx8IHByb2ZpbGVfID09IDI5KSB7Ci0gICAgcHNfcHJlc2VudCA9IChwcm9maWxlXyA9PSAyOSk7Ci0gICAgZXh0ZW5zaW9uX3R5cGUgPSA1OwotICAgIFJDSEVDSyhyZWFkZXIuUmVhZEJpdHMoNCwgJmV4dGVuc2lvbl9mcmVxdWVuY3lfaW5kZXgpKTsKLSAgICBpZiAoZXh0ZW5zaW9uX2ZyZXF1ZW5jeV9pbmRleCA9PSAweGYpCi0gICAgICBSQ0hFQ0socmVhZGVyLlJlYWRCaXRzKDI0LCAmZXh0ZW5zaW9uX2ZyZXF1ZW5jeV8pKTsKLSAgICBSQ0hFQ0socmVhZGVyLlJlYWRCaXRzKDUsICZwcm9maWxlXykpOwotICB9Ci0KLSAgUkNIRUNLKFNraXBEZWNvZGVyR0FTcGVjaWZpY0NvbmZpZygmcmVhZGVyKSk7Ci0gIFJDSEVDSyhTa2lwRXJyb3JTcGVjaWZpY0NvbmZpZygpKTsKLQotICAvLyBSZWFkIGV4dGVuc2lvbiBjb25maWd1cmF0aW9uIGFnYWluCi0gIGlmIChleHRlbnNpb25fdHlwZSAhPSA1KSB7Ci0gICAgdWludDE2IHN5bmNfZXh0ZW5zaW9uX3R5cGU7Ci0gICAgdWludDggc2JyX3ByZXNlbnRfZmxhZzsKLSAgICB1aW50OCBwc19wcmVzZW50X2ZsYWc7Ci0KLSAgICBpZiAocmVhZGVyLlJlYWRCaXRzKDExLCAmc3luY19leHRlbnNpb25fdHlwZSkgJiYKLSAgICAgICAgc3luY19leHRlbnNpb25fdHlwZSA9PSAweDJiNykgewotICAgICAgaWYgKHJlYWRlci5SZWFkQml0cyg1LCAmZXh0ZW5zaW9uX3R5cGUpICYmIGV4dGVuc2lvbl90eXBlID09IDUpIHsKLSAgICAgICAgUkNIRUNLKHJlYWRlci5SZWFkQml0cygxLCAmc2JyX3ByZXNlbnRfZmxhZykpOwotCi0gICAgICAgIGlmIChzYnJfcHJlc2VudF9mbGFnKSB7Ci0gICAgICAgICAgUkNIRUNLKHJlYWRlci5SZWFkQml0cyg0LCAmZXh0ZW5zaW9uX2ZyZXF1ZW5jeV9pbmRleCkpOwotCi0gICAgICAgICAgaWYgKGV4dGVuc2lvbl9mcmVxdWVuY3lfaW5kZXggPT0gMHhmKQotICAgICAgICAgICAgUkNIRUNLKHJlYWRlci5SZWFkQml0cygyNCwgJmV4dGVuc2lvbl9mcmVxdWVuY3lfKSk7Ci0KLSAgICAgICAgICBSQ0hFQ0socmVhZGVyLlJlYWRCaXRzKDExLCAmc3luY19leHRlbnNpb25fdHlwZSkpOwotCi0gICAgICAgICAgaWYgKHN5bmNfZXh0ZW5zaW9uX3R5cGUgPT0gMHg1NDgpIHsKLSAgICAgICAgICAgIFJDSEVDSyhyZWFkZXIuUmVhZEJpdHMoMSwgJnBzX3ByZXNlbnRfZmxhZykpOwotICAgICAgICAgICAgcHNfcHJlc2VudCA9IHBzX3ByZXNlbnRfZmxhZyAhPSAwOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChmcmVxdWVuY3lfID09IDApIHsKLSAgICBSQ0hFQ0soZnJlcXVlbmN5X2luZGV4XyA8IGFycmF5c2l6ZShrRnJlcXVlbmN5TWFwKSk7Ci0gICAgZnJlcXVlbmN5XyA9IGtGcmVxdWVuY3lNYXBbZnJlcXVlbmN5X2luZGV4X107Ci0gIH0KLQotICBpZiAoZXh0ZW5zaW9uX2ZyZXF1ZW5jeV8gPT0gMCAmJiBleHRlbnNpb25fZnJlcXVlbmN5X2luZGV4ICE9IDB4ZmYpIHsKLSAgICBSQ0hFQ0soZXh0ZW5zaW9uX2ZyZXF1ZW5jeV9pbmRleCA8IGFycmF5c2l6ZShrRnJlcXVlbmN5TWFwKSk7Ci0gICAgZXh0ZW5zaW9uX2ZyZXF1ZW5jeV8gPSBrRnJlcXVlbmN5TWFwW2V4dGVuc2lvbl9mcmVxdWVuY3lfaW5kZXhdOwotICB9Ci0KLSAgLy8gV2hlbiBQYXJhbWV0cmljIFN0ZXJlbyBpcyBvbiwgbW9ubyB3aWxsIGJlIHBsYXllZCBhcyBzdGVyZW8uCi0gIGlmIChwc19wcmVzZW50ICYmIGNoYW5uZWxfY29uZmlnXyA9PSAxKQotICAgIGNoYW5uZWxfbGF5b3V0XyA9IEdldENoYW5uZWxMYXlvdXQoMik7Ci0gIGVsc2UKLSAgICBjaGFubmVsX2xheW91dF8gPSBHZXRDaGFubmVsTGF5b3V0KGNoYW5uZWxfY29uZmlnXyk7Ci0KLSAgcmV0dXJuIGZyZXF1ZW5jeV8gIT0gMCAmJiBjaGFubmVsX2xheW91dF8gIT0gQ0hBTk5FTF9MQVlPVVRfVU5TVVBQT1JURUQgJiYKLSAgICAgIHByb2ZpbGVfID49IDEgJiYgcHJvZmlsZV8gPD0gNCAmJiBmcmVxdWVuY3lfaW5kZXhfICE9IDB4ZiAmJgotICAgICAgY2hhbm5lbF9jb25maWdfIDw9IDc7Ci19Ci0KLWludCBBQUM6OkdldE91dHB1dFNhbXBsZXNQZXJTZWNvbmQoYm9vbCBzYnJfaW5fbWltZXR5cGUpIGNvbnN0IHsKLSAgaWYgKGV4dGVuc2lvbl9mcmVxdWVuY3lfID4gMCkKLSAgICByZXR1cm4gZXh0ZW5zaW9uX2ZyZXF1ZW5jeV87Ci0KLSAgaWYgKCFzYnJfaW5fbWltZXR5cGUpCi0gICAgcmV0dXJuIGZyZXF1ZW5jeV87Ci0KLSAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIGlzIHdyaXR0ZW4gYWNjb3JkaW5nIHRvIElTTyAxNDQ5NiBQYXJ0IDMgVGFibGUgMS4xMSBhbmQKLSAgLy8gVGFibGUgMS4yMi4gKFRhYmxlIDEuMTEgcmVmZXJzIHRvIHRoZSBjYXBwaW5nIHRvIDQ4MDAwLCBUYWJsZSAxLjIyIHJlZmVycwotICAvLyB0byBTQlIgZG91YmxpbmcgdGhlIEFBQyBzYW1wbGUgcmF0ZS4pCi0gIC8vIFRPRE8oYWNvbHdlbGwpIDogRXh0ZW5kIHNhbXBsZSByYXRlIGNhcCB0byA5NmtIeiBmb3IgTGV2ZWwgNSBjb250ZW50LgotICBEQ0hFQ0tfR1QoZnJlcXVlbmN5XywgMCk7Ci0gIHJldHVybiBzdGQ6Om1pbigyICogZnJlcXVlbmN5XywgNDgwMDApOwotfQotCi1DaGFubmVsTGF5b3V0IEFBQzo6Y2hhbm5lbF9sYXlvdXQoKSBjb25zdCB7Ci0gIHJldHVybiBjaGFubmVsX2xheW91dF87Ci19Ci0KLWJvb2wgQUFDOjpDb252ZXJ0RXNkc1RvQURUUyhzdGQ6OnZlY3Rvcjx1aW50OD4qIGJ1ZmZlcikgY29uc3QgewotICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpICsga0FEVFNIZWFkZXJTaXplOwotCi0gIERDSEVDSyhwcm9maWxlXyA+PSAxICYmIHByb2ZpbGVfIDw9IDQgJiYgZnJlcXVlbmN5X2luZGV4XyAhPSAweGYgJiYKLSAgICAgICAgIGNoYW5uZWxfY29uZmlnXyA8PSA3KTsKLQotICAvLyBBRFRTIGhlYWRlciB1c2VzIDEzIGJpdHMgZm9yIHBhY2tldCBzaXplLgotICBpZiAoc2l6ZSA+PSAoMSA8PCAxMykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4PiYgYWR0cyA9ICpidWZmZXI7Ci0KLSAgYWR0cy5pbnNlcnQoYnVmZmVyLT5iZWdpbigpLCBrQURUU0hlYWRlclNpemUsIDApOwotICBhZHRzWzBdID0gMHhmZjsKLSAgYWR0c1sxXSA9IDB4ZjE7Ci0gIGFkdHNbMl0gPSAoKHByb2ZpbGVfIC0gMSkgPDwgNikgKyAoZnJlcXVlbmN5X2luZGV4XyA8PCAyKSArCi0gICAgICAoY2hhbm5lbF9jb25maWdfID4+IDIpOwotICBhZHRzWzNdID0gKChjaGFubmVsX2NvbmZpZ18gJiAweDMpIDw8IDYpICsgKHNpemUgPj4gMTEpOwotICBhZHRzWzRdID0gKHNpemUgJiAweDdmZikgPj4gMzsKLSAgYWR0c1s1XSA9ICgoc2l6ZSAmIDcpIDw8IDUpICsgMHgxZjsKLSAgYWR0c1s2XSA9IDB4ZmM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIEN1cnJlbnRseSB0aGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydCBHQVNwZWNpZmljQ29uZmlnIGRlZmluZWQgaW4KLS8vIElTTyAxNDQ5NiBQYXJ0IDMgVGFibGUgNC4xIC0gU3ludGF4IG9mIEdBU3BlY2lmaWNDb25maWcoKQotYm9vbCBBQUM6OlNraXBEZWNvZGVyR0FTcGVjaWZpY0NvbmZpZyhCaXRSZWFkZXIqIGJpdF9yZWFkZXIpIGNvbnN0IHsKLSAgc3dpdGNoIChwcm9maWxlXykgewotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgY2FzZSAzOgotICAgIGNhc2UgNDoKLSAgICBjYXNlIDY6Ci0gICAgY2FzZSA3OgotICAgIGNhc2UgMTc6Ci0gICAgY2FzZSAxOToKLSAgICBjYXNlIDIwOgotICAgIGNhc2UgMjE6Ci0gICAgY2FzZSAyMjoKLSAgICBjYXNlIDIzOgotICAgICAgcmV0dXJuIFNraXBHQVNwZWNpZmljQ29uZmlnKGJpdF9yZWFkZXIpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBBQUM6OlNraXBFcnJvclNwZWNpZmljQ29uZmlnKCkgY29uc3QgewotICBzd2l0Y2ggKHByb2ZpbGVfKSB7Ci0gICAgY2FzZSAxNzoKLSAgICBjYXNlIDE5OgotICAgIGNhc2UgMjA6Ci0gICAgY2FzZSAyMToKLSAgICBjYXNlIDIyOgotICAgIGNhc2UgMjM6Ci0gICAgY2FzZSAyNDoKLSAgICBjYXNlIDI1OgotICAgIGNhc2UgMjY6Ci0gICAgY2FzZSAyNzoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gVGhlIGZvbGxvd2luZyBjb2RlIGlzIHdyaXR0ZW4gYWNjb3JkaW5nIHRvIElTTyAxNDQ5NiBwYXJ0IDMgVGFibGUgNC4xIC0KLS8vIEdBU3BlY2lmaWNDb25maWcuCi1ib29sIEFBQzo6U2tpcEdBU3BlY2lmaWNDb25maWcoQml0UmVhZGVyKiBiaXRfcmVhZGVyKSBjb25zdCB7Ci0gIHVpbnQ4IGV4dGVuc2lvbl9mbGFnID0gMDsKLSAgdWludDggZGVwZW5kc19vbl9jb3JlX2NvZGVyOwotICB1aW50MTYgZHVtbXk7Ci0KLSAgUkNIRUNLKGJpdF9yZWFkZXItPlJlYWRCaXRzKDEsICZkdW1teSkpOyAgLy8gZnJhbWVMZW5ndGhGbGFnCi0gIFJDSEVDSyhiaXRfcmVhZGVyLT5SZWFkQml0cygxLCAmZGVwZW5kc19vbl9jb3JlX2NvZGVyKSk7Ci0gIGlmIChkZXBlbmRzX29uX2NvcmVfY29kZXIgPT0gMSkKLSAgICBSQ0hFQ0soYml0X3JlYWRlci0+UmVhZEJpdHMoMTQsICZkdW1teSkpOyAgLy8gY29yZUNvZGVyRGVsYXkKLQotICBSQ0hFQ0soYml0X3JlYWRlci0+UmVhZEJpdHMoMSwgJmV4dGVuc2lvbl9mbGFnKSk7Ci0gIFJDSEVDSyhjaGFubmVsX2NvbmZpZ18gIT0gMCk7Ci0KLSAgaWYgKHByb2ZpbGVfID09IDYgfHwgcHJvZmlsZV8gPT0gMjApCi0gICAgUkNIRUNLKGJpdF9yZWFkZXItPlJlYWRCaXRzKDMsICZkdW1teSkpOyAgLy8gbGF5ZXJOcgotCi0gIGlmIChleHRlbnNpb25fZmxhZykgewotICAgIGlmIChwcm9maWxlXyA9PSAyMikgewotICAgICAgUkNIRUNLKGJpdF9yZWFkZXItPlJlYWRCaXRzKDUsICZkdW1teSkpOyAgLy8gbnVtT2ZTdWJGcmFtZQotICAgICAgUkNIRUNLKGJpdF9yZWFkZXItPlJlYWRCaXRzKDExLCAmZHVtbXkpKTsgIC8vIGxheWVyX2xlbmd0aAotICAgIH0KLQotICAgIGlmIChwcm9maWxlXyA9PSAxNyB8fCBwcm9maWxlXyA9PSAxOSB8fCBwcm9maWxlXyA9PSAyMCB8fCBwcm9maWxlXyA9PSAyMykgewotICAgICAgUkNIRUNLKGJpdF9yZWFkZXItPlJlYWRCaXRzKDMsICZkdW1teSkpOyAgLy8gcmVzaWxpZW5jZSBmbGFncwotICAgIH0KLQotICAgIFJDSEVDSyhiaXRfcmVhZGVyLT5SZWFkQml0cygxLCAmZHVtbXkpKTsgIC8vIGV4dGVuc2lvbkZsYWczCi0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1wNAotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9tcDQvYWFjLmggYi9zcmMvbWVkaWEvbXA0L2FhYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTYxZTM4Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9tcDQvYWFjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX01QNF9BQUNfSF8KLSNkZWZpbmUgTUVESUFfTVA0X0FBQ19IXwotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9jaGFubmVsX2xheW91dC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIEJpdFJlYWRlcjsKLQotbmFtZXNwYWNlIG1wNCB7Ci0KLS8vIFRoaXMgY2xhc3MgcGFyc2VzIHRoZSBBQUMgaW5mb3JtYXRpb24gZnJvbSBkZWNvZGVyIHNwZWNpZmljIGluZm9ybWF0aW9uCi0vLyBlbWJlZGRlZCBpbiB0aGUgZXNkcyBib3ggaW4gYW4gSVNPIEJNRkYgZmlsZS4KLS8vIFBsZWFzZSByZWZlciB0byBJU08gMTQ0OTYgUGFydCAzIFRhYmxlIDEuMTMgLSBTeW50YXggb2YgQXVkaW9TcGVjaWZpY0NvbmZpZwotLy8gZm9yIG1vcmUgZGV0YWlscy4KLWNsYXNzIE1FRElBX0VYUE9SVCBBQUMgewotIHB1YmxpYzoKLSAgLy8gU2l6ZSBpbiBieXRlcyBvZiB0aGUgQURUUyBoZWFkZXIgYWRkZWQgYnkgQ29udmVydEVzZHNUb0FEVFMoKS4KLSAgc3RhdGljIGNvbnN0IHNpemVfdCBrQURUU0hlYWRlclNpemUgPSA3OwotICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtGcmFtZXNQZXJBY2Nlc3NVbml0ID0gMTAyNDsKLQotICBBQUMoKTsKLSAgfkFBQygpOwotCi0gIC8vIFBhcnNlIHRoZSBBQUMgY29uZmlnIGZyb20gdGhlIHJhdyBiaW5hcnkgZGF0YSBlbWJlZGRlZCBpbiBlc2RzIGJveC4KLSAgLy8gVGhlIGZ1bmN0aW9uIHdpbGwgcGFyc2UgdGhlIGRhdGEgYW5kIGdldCB0aGUgRWxlbWVudGFyeVN0cmVhbURlc2NyaXB0b3IsCi0gIC8vIHRoZW4gaXQgd2lsbCBwYXJzZSB0aGUgRWxlbWVudGFyeVN0cmVhbURlc2NyaXB0b3IgdG8gZ2V0IGF1ZGlvIHN0cmVhbQotICAvLyBjb25maWd1cmF0aW9ucy4KLSAgYm9vbCBQYXJzZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OD4mIGRhdGEpOwotCi0gIC8vIEdldHMgdGhlIG91dHB1dCBzYW1wbGUgcmF0ZSBmb3IgdGhlIEFBQyBzdHJlYW0uCi0gIC8vIHxzYnJfaW5fbWltZXR5cGV8IHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSBpZiB0aGUgU0JSIG1vZGUgaXMKLSAgLy8gc2lnbmFsbGVkIGluIHRoZSBtaW1ldHlwZS4gKGllIG1wNGEuNDAuNSBpbiB0aGUgY29kZWNzIHBhcmFtZXRlcikuCi0gIC8vIFJldHVybnMgdGhlIHNhbXBsZXNfcGVyX3NlY29uZCB2YWx1ZSB0aGF0IHNob3VsZCB1c2VkIGluIGFuCi0gIC8vIEF1ZGlvRGVjb2RlckNvbmZpZy4KLSAgaW50IEdldE91dHB1dFNhbXBsZXNQZXJTZWNvbmQoYm9vbCBzYnJfaW5fbWltZXR5cGUpIGNvbnN0OwotICBDaGFubmVsTGF5b3V0IGNoYW5uZWxfbGF5b3V0KCkgY29uc3Q7Ci0KLSAgLy8gVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhIHJhdyBBQUMgZnJhbWUgaW50byBhbiBBQUMgZnJhbWUgd2l0aCBhbiBBRFRTCi0gIC8vIGhlYWRlci4gT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBhbmQgc3RvcmVzIHRoZSBjb252ZXJ0ZWQgZGF0YQotICAvLyBpbiB0aGUgYnVmZmVyLiBUaGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSBvbiBmYWlsdXJlIGFuZCBsZWF2ZXMgdGhlIGJ1ZmZlcgotICAvLyB1bmNoYW5nZWQuCi0gIGJvb2wgQ29udmVydEVzZHNUb0FEVFMoc3RkOjp2ZWN0b3I8dWludDg+KiBidWZmZXIpIGNvbnN0OwotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4PiYgcmF3X2RhdGEoKSBjb25zdCB7IHJldHVybiByYXdfZGF0YV87IH0KLQotIHByaXZhdGU6Ci0gIGJvb2wgU2tpcERlY29kZXJHQVNwZWNpZmljQ29uZmlnKEJpdFJlYWRlciogYml0X3JlYWRlcikgY29uc3Q7Ci0gIGJvb2wgU2tpcEVycm9yU3BlY2lmaWNDb25maWcoKSBjb25zdDsKLSAgYm9vbCBTa2lwR0FTcGVjaWZpY0NvbmZpZyhCaXRSZWFkZXIqIGJpdF9yZWFkZXIpIGNvbnN0OwotCi0gIC8vIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIHN0b3JlIHRoZSBBQUMgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbgotICAvLyB0aGF0IGFyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBBRFRTIGhlYWRlci4KLSAgdWludDggcHJvZmlsZV87Ci0gIHVpbnQ4IGZyZXF1ZW5jeV9pbmRleF87Ci0gIHVpbnQ4IGNoYW5uZWxfY29uZmlnXzsKLQotICAvLyBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBzdG9yZSBhdWRpbyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHRoYXQKLSAgLy8gY2FuIGJlIHVzZWQgYnkgQ2hyb21pdW0uIFRoZXkgYXJlIGJhc2VkIG9uIHRoZSBBQUMgc3BlY2lmaWMKLSAgLy8gY29uZmlndXJhdGlvbiBidXQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgZXh0ZW5zaW9ucyBpbiBlbGVtZW50YXJ5Ci0gIC8vIHN0cmVhbSBkZXNjcmlwdG9yLgotICBpbnQgZnJlcXVlbmN5XzsKLSAgaW50IGV4dGVuc2lvbl9mcmVxdWVuY3lfOwotICBDaGFubmVsTGF5b3V0IGNoYW5uZWxfbGF5b3V0XzsKLQotICBzdGQ6OnZlY3Rvcjx1aW50OD4gcmF3X2RhdGFfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1wNAotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9NUDRfQUFDX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvbXA0L2FhY191bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9tcDQvYWFjX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWY4ODhjLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9tcDQvYWFjX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9tcDQvYWFjLmgiCi0KLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotbmFtZXNwYWNlIG1wNCB7Ci0KLVRFU1QoQUFDVGVzdCwgQmFzaWNQcm9maWxlVGVzdCkgewotICBBQUMgYWFjOwotICB1aW50OCBidWZmZXJbXSA9IHsweDEyLCAweDEwfTsKLSAgc3RkOjp2ZWN0b3I8dWludDg+IGRhdGE7Ci0KLSAgZGF0YS5hc3NpZ24oYnVmZmVyLCBidWZmZXIgKyBzaXplb2YoYnVmZmVyKSk7Ci0KLSAgRVhQRUNUX1RSVUUoYWFjLlBhcnNlKGRhdGEpKTsKLSAgRVhQRUNUX0VRKGFhYy5HZXRPdXRwdXRTYW1wbGVzUGVyU2Vjb25kKGZhbHNlKSwgNDQxMDApOwotICBFWFBFQ1RfRVEoYWFjLmNoYW5uZWxfbGF5b3V0KCksIENIQU5ORUxfTEFZT1VUX1NURVJFTyk7Ci19Ci0KLVRFU1QoQUFDVGVzdCwgRXh0ZW5zaW9uVGVzdCkgewotICBBQUMgYWFjOwotICB1aW50OCBidWZmZXJbXSA9IHsweDEzLCAweDA4LCAweDU2LCAweGU1LCAweDlkLCAweDQ4LCAweDgwfTsKLSAgc3RkOjp2ZWN0b3I8dWludDg+IGRhdGE7Ci0KLSAgZGF0YS5hc3NpZ24oYnVmZmVyLCBidWZmZXIgKyBzaXplb2YoYnVmZmVyKSk7Ci0KLSAgRVhQRUNUX1RSVUUoYWFjLlBhcnNlKGRhdGEpKTsKLSAgRVhQRUNUX0VRKGFhYy5HZXRPdXRwdXRTYW1wbGVzUGVyU2Vjb25kKGZhbHNlKSwgNDgwMDApOwotICBFWFBFQ1RfRVEoYWFjLkdldE91dHB1dFNhbXBsZXNQZXJTZWNvbmQodHJ1ZSksIDQ4MDAwKTsKLSAgRVhQRUNUX0VRKGFhYy5jaGFubmVsX2xheW91dCgpLCBDSEFOTkVMX0xBWU9VVF9TVEVSRU8pOwotfQotCi1URVNUKEFBQ1Rlc3QsIFRlc3RJbXBsaWNpdFNCUikgewotICBBQUMgYWFjOwotICB1aW50OCBidWZmZXJbXSA9IHsweDEzLCAweDEwfTsKLSAgc3RkOjp2ZWN0b3I8dWludDg+IGRhdGE7Ci0KLSAgZGF0YS5hc3NpZ24oYnVmZmVyLCBidWZmZXIgKyBzaXplb2YoYnVmZmVyKSk7Ci0KLSAgRVhQRUNUX1RSVUUoYWFjLlBhcnNlKGRhdGEpKTsKLSAgRVhQRUNUX0VRKGFhYy5HZXRPdXRwdXRTYW1wbGVzUGVyU2Vjb25kKGZhbHNlKSwgMjQwMDApOwotICBFWFBFQ1RfRVEoYWFjLkdldE91dHB1dFNhbXBsZXNQZXJTZWNvbmQodHJ1ZSksIDQ4MDAwKTsKLSAgRVhQRUNUX0VRKGFhYy5jaGFubmVsX2xheW91dCgpLCBDSEFOTkVMX0xBWU9VVF9TVEVSRU8pOwotfQotCi1URVNUKEFBQ1Rlc3QsIFNpeENoYW5uZWxUZXN0KSB7Ci0gIEFBQyBhYWM7Ci0gIHVpbnQ4IGJ1ZmZlcltdID0gezB4MTEsIDB4YjB9OwotICBzdGQ6OnZlY3Rvcjx1aW50OD4gZGF0YTsKLQotICBkYXRhLmFzc2lnbihidWZmZXIsIGJ1ZmZlciArIHNpemVvZihidWZmZXIpKTsKLQotICBFWFBFQ1RfVFJVRShhYWMuUGFyc2UoZGF0YSkpOwotICBFWFBFQ1RfRVEoYWFjLkdldE91dHB1dFNhbXBsZXNQZXJTZWNvbmQoZmFsc2UpLCA0ODAwMCk7Ci0gIEVYUEVDVF9FUShhYWMuY2hhbm5lbF9sYXlvdXQoKSwgQ0hBTk5FTF9MQVlPVVRfNV8xKTsKLX0KLQotVEVTVChBQUNUZXN0LCBEYXRhVG9vU2hvcnRUZXN0KSB7Ci0gIEFBQyBhYWM7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4PiBkYXRhOwotCi0gIEVYUEVDVF9GQUxTRShhYWMuUGFyc2UoZGF0YSkpOwotCi0gIGRhdGEucHVzaF9iYWNrKDB4MTIpOwotICBFWFBFQ1RfRkFMU0UoYWFjLlBhcnNlKGRhdGEpKTsKLX0KLQotVEVTVChBQUNUZXN0LCBJbmNvcnJlY3RQcm9maWxlVGVzdCkgewotICBBQUMgYWFjOwotICB1aW50OCBidWZmZXJbXSA9IHsweDAsIDB4MDh9OwotICBzdGQ6OnZlY3Rvcjx1aW50OD4gZGF0YTsKLQotICBkYXRhLmFzc2lnbihidWZmZXIsIGJ1ZmZlciArIHNpemVvZihidWZmZXIpKTsKLQotICBFWFBFQ1RfRkFMU0UoYWFjLlBhcnNlKGRhdGEpKTsKLQotICBkYXRhWzBdID0gMHgwODsKLSAgRVhQRUNUX1RSVUUoYWFjLlBhcnNlKGRhdGEpKTsKLQotICBkYXRhWzBdID0gMHgyODsKLSAgRVhQRUNUX0ZBTFNFKGFhYy5QYXJzZShkYXRhKSk7Ci19Ci0KLVRFU1QoQUFDVGVzdCwgSW5jb3JyZWN0RnJlcXVlbmN5VGVzdCkgewotICBBQUMgYWFjOwotICB1aW50OCBidWZmZXJbXSA9IHsweDBmLCAweDg4fTsKLSAgc3RkOjp2ZWN0b3I8dWludDg+IGRhdGE7Ci0KLSAgZGF0YS5hc3NpZ24oYnVmZmVyLCBidWZmZXIgKyBzaXplb2YoYnVmZmVyKSk7Ci0KLSAgRVhQRUNUX0ZBTFNFKGFhYy5QYXJzZShkYXRhKSk7Ci0KLSAgZGF0YVswXSA9IDB4MGU7Ci0gIGRhdGFbMV0gPSAweDA4OwotICBFWFBFQ1RfVFJVRShhYWMuUGFyc2UoZGF0YSkpOwotfQotCi1URVNUKEFBQ1Rlc3QsIEluY29ycmVjdENoYW5uZWxUZXN0KSB7Ci0gIEFBQyBhYWM7Ci0gIHVpbnQ4IGJ1ZmZlcltdID0gezB4MGUsIDB4MDB9OwotICBzdGQ6OnZlY3Rvcjx1aW50OD4gZGF0YTsKLQotICBkYXRhLmFzc2lnbihidWZmZXIsIGJ1ZmZlciArIHNpemVvZihidWZmZXIpKTsKLQotICBFWFBFQ1RfRkFMU0UoYWFjLlBhcnNlKGRhdGEpKTsKLQotICBkYXRhWzFdID0gMHgwODsKLSAgRVhQRUNUX1RSVUUoYWFjLlBhcnNlKGRhdGEpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1wNAotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9tcDQvYXZjLmNjIGIvc3JjL21lZGlhL21wNC9hdmMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMjhmZmQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL21wNC9hdmMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvbXA0L2F2Yy5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgIm1lZGlhL21wNC9ib3hfZGVmaW5pdGlvbnMuaCIKLSNpbmNsdWRlICJtZWRpYS9tcDQvYm94X3JlYWRlci5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotbmFtZXNwYWNlIG1wNCB7Ci0KLXN0YXRpYyBjb25zdCB1aW50OCBrQW5uZXhCU3RhcnRDb2RlW10gPSB7MCwgMCwgMCwgMX07Ci1zdGF0aWMgY29uc3QgaW50IGtBbm5leEJTdGFydENvZGVTaXplID0gNDsKLQotc3RhdGljIGJvb2wgQ29udmVydEFWQ1RvQW5uZXhCSW5QbGFjZUZvckxlbmd0aFNpemU0KHN0ZDo6dmVjdG9yPHVpbnQ4PiogYnVmKSB7Ci0gIGNvbnN0IGludCBrTGVuZ3RoU2l6ZSA9IDQ7Ci0gIHNpemVfdCBwb3MgPSAwOwotICB3aGlsZSAocG9zICsga0xlbmd0aFNpemUgPCBidWYtPnNpemUoKSkgewotICAgIGludCBuYWxfc2l6ZSA9ICgqYnVmKVtwb3NdOwotICAgIG5hbF9zaXplID0gKG5hbF9zaXplIDw8IDgpICsgKCpidWYpW3BvcysxXTsKLSAgICBuYWxfc2l6ZSA9IChuYWxfc2l6ZSA8PCA4KSArICgqYnVmKVtwb3MrMl07Ci0gICAgbmFsX3NpemUgPSAobmFsX3NpemUgPDwgOCkgKyAoKmJ1ZilbcG9zKzNdOwotICAgIHN0ZDo6Y29weShrQW5uZXhCU3RhcnRDb2RlLCBrQW5uZXhCU3RhcnRDb2RlICsga0FubmV4QlN0YXJ0Q29kZVNpemUsCi0gICAgICAgICAgICAgIGJ1Zi0+YmVnaW4oKSArIHBvcyk7Ci0gICAgcG9zICs9IGtMZW5ndGhTaXplICsgbmFsX3NpemU7Ci0gIH0KLSAgcmV0dXJuIHBvcyA9PSBidWYtPnNpemUoKTsKLX0KLQotLy8gc3RhdGljCi1ib29sIEFWQzo6Q29udmVydEZyYW1lVG9Bbm5leEIoaW50IGxlbmd0aF9zaXplLCBzdGQ6OnZlY3Rvcjx1aW50OD4qIGJ1ZmZlcikgewotICBSQ0hFQ0sobGVuZ3RoX3NpemUgPT0gMSB8fCBsZW5ndGhfc2l6ZSA9PSAyIHx8IGxlbmd0aF9zaXplID09IDQpOwotCi0gIGlmIChsZW5ndGhfc2l6ZSA9PSA0KQotICAgIHJldHVybiBDb252ZXJ0QVZDVG9Bbm5leEJJblBsYWNlRm9yTGVuZ3RoU2l6ZTQoYnVmZmVyKTsKLQotICBzdGQ6OnZlY3Rvcjx1aW50OD4gdGVtcDsKLSAgdGVtcC5zd2FwKCpidWZmZXIpOwotICBidWZmZXItPnJlc2VydmUodGVtcC5zaXplKCkgKyAzMik7Ci0KLSAgc2l6ZV90IHBvcyA9IDA7Ci0gIHdoaWxlIChwb3MgKyBsZW5ndGhfc2l6ZSA8IHRlbXAuc2l6ZSgpKSB7Ci0gICAgaW50IG5hbF9zaXplID0gdGVtcFtwb3NdOwotICAgIGlmIChsZW5ndGhfc2l6ZSA9PSAyKSBuYWxfc2l6ZSA9IChuYWxfc2l6ZSA8PCA4KSArIHRlbXBbcG9zKzFdOwotICAgIHBvcyArPSBsZW5ndGhfc2l6ZTsKLQotICAgIFJDSEVDSyhwb3MgKyBuYWxfc2l6ZSA8PSB0ZW1wLnNpemUoKSk7Ci0gICAgYnVmZmVyLT5pbnNlcnQoYnVmZmVyLT5lbmQoKSwga0FubmV4QlN0YXJ0Q29kZSwKLSAgICAgICAgICAgICAgICAgICBrQW5uZXhCU3RhcnRDb2RlICsga0FubmV4QlN0YXJ0Q29kZVNpemUpOwotICAgIGJ1ZmZlci0+aW5zZXJ0KGJ1ZmZlci0+ZW5kKCksIHRlbXAuYmVnaW4oKSArIHBvcywKLSAgICAgICAgICAgICAgICAgICB0ZW1wLmJlZ2luKCkgKyBwb3MgKyBuYWxfc2l6ZSk7Ci0gICAgcG9zICs9IG5hbF9zaXplOwotICB9Ci0gIHJldHVybiBwb3MgPT0gdGVtcC5zaXplKCk7Ci19Ci0KLS8vIHN0YXRpYwotYm9vbCBBVkM6OkNvbnZlcnRDb25maWdUb0FubmV4QigKLSAgICBjb25zdCBBVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZCYgYXZjX2NvbmZpZywKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OD4qIGJ1ZmZlcikgewotICBEQ0hFQ0soYnVmZmVyLT5lbXB0eSgpKTsKLSAgYnVmZmVyLT5jbGVhcigpOwotICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZjX2NvbmZpZy5zcHNfbGlzdC5zaXplKCk7IGkrKykKLSAgICB0b3RhbF9zaXplICs9IGF2Y19jb25maWcuc3BzX2xpc3RbaV0uc2l6ZSgpICsga0FubmV4QlN0YXJ0Q29kZVNpemU7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZjX2NvbmZpZy5wcHNfbGlzdC5zaXplKCk7IGkrKykKLSAgICB0b3RhbF9zaXplICs9IGF2Y19jb25maWcucHBzX2xpc3RbaV0uc2l6ZSgpICsga0FubmV4QlN0YXJ0Q29kZVNpemU7Ci0gIGJ1ZmZlci0+cmVzZXJ2ZSh0b3RhbF9zaXplKTsKLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2Y19jb25maWcuc3BzX2xpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICBidWZmZXItPmluc2VydChidWZmZXItPmVuZCgpLCBrQW5uZXhCU3RhcnRDb2RlLAotICAgICAgICAgICAgICAgIGtBbm5leEJTdGFydENvZGUgKyBrQW5uZXhCU3RhcnRDb2RlU2l6ZSk7Ci0gICAgYnVmZmVyLT5pbnNlcnQoYnVmZmVyLT5lbmQoKSwgYXZjX2NvbmZpZy5zcHNfbGlzdFtpXS5iZWdpbigpLAotICAgICAgICAgICAgICAgIGF2Y19jb25maWcuc3BzX2xpc3RbaV0uZW5kKCkpOwotICB9Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdmNfY29uZmlnLnBwc19saXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgYnVmZmVyLT5pbnNlcnQoYnVmZmVyLT5lbmQoKSwga0FubmV4QlN0YXJ0Q29kZSwKLSAgICAgICAgICAgICAgICAgICBrQW5uZXhCU3RhcnRDb2RlICsga0FubmV4QlN0YXJ0Q29kZVNpemUpOwotICAgIGJ1ZmZlci0+aW5zZXJ0KGJ1ZmZlci0+ZW5kKCksIGF2Y19jb25maWcucHBzX2xpc3RbaV0uYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICBhdmNfY29uZmlnLnBwc19saXN0W2ldLmVuZCgpKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1wNAotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvbXA0L2F2Yy5oIGIvc3JjL21lZGlhL21wNC9hdmMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q4MTVhMS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvbXA0L2F2Yy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9NUDRfQVZDX0hfCi0jZGVmaW5lIE1FRElBX01QNF9BVkNfSF8KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci1uYW1lc3BhY2UgbXA0IHsKLQotc3RydWN0IEFWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkOwotCi1jbGFzcyBNRURJQV9FWFBPUlQgQVZDIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBib29sIENvbnZlcnRGcmFtZVRvQW5uZXhCKGludCBsZW5ndGhfc2l6ZSwgc3RkOjp2ZWN0b3I8dWludDg+KiBidWZmZXIpOwotCi0gIHN0YXRpYyBib29sIENvbnZlcnRDb25maWdUb0FubmV4QigKLSAgICAgIGNvbnN0IEFWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkJiBhdmNfY29uZmlnLAotICAgICAgc3RkOjp2ZWN0b3I8dWludDg+KiBidWZmZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1wNAotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfTVA0X0FWQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL21wNC9hdmNfdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvbXA0L2F2Y191bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY2YTk3OS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvbXA0L2F2Y191bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc3RyZWFtX3BhcnNlcl9idWZmZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9tcDQvYXZjLmgiCi0jaW5jbHVkZSAibWVkaWEvbXA0L2JveF9kZWZpbml0aW9ucy5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1wYXJhbS10ZXN0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci1uYW1lc3BhY2UgbXA0IHsKLQotc3RhdGljIGNvbnN0IHVpbnQ4IGtOQUxVMVtdID0geyAweDAxLCAweDAyLCAweDAzIH07Ci1zdGF0aWMgY29uc3QgdWludDgga05BTFUyW10gPSB7IDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcgfTsKLXN0YXRpYyBjb25zdCB1aW50OCBrRXhwZWN0ZWRbXSA9IHsKLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwMywKLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNyB9OwotCi1zdGF0aWMgY29uc3QgdWludDgga0V4cGVjdGVkUGFyYW1TZXRzW10gPSB7Ci0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NjcsIDB4MTIsCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NjcsIDB4MzQsCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NjgsIDB4NTYsIDB4Nzh9OwotCi1jbGFzcyBBVkNDb252ZXJzaW9uVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGludD4gewotIHByb3RlY3RlZDoKLSAgdm9pZCBNYWtlSW5wdXRGb3JMZW5ndGgoaW50IGxlbmd0aF9zaXplLCBzdGQ6OnZlY3Rvcjx1aW50OD4qIGJ1ZikgewotICAgIGJ1Zi0+Y2xlYXIoKTsKLSAgICBmb3IgKGludCBpID0gMTsgaSA8IGxlbmd0aF9zaXplOyBpKyspCi0gICAgICBidWYtPnB1c2hfYmFjaygwKTsKLSAgICBidWYtPnB1c2hfYmFjayhzaXplb2Yoa05BTFUxKSk7Ci0gICAgYnVmLT5pbnNlcnQoYnVmLT5lbmQoKSwga05BTFUxLCBrTkFMVTEgKyBzaXplb2Yoa05BTFUxKSk7Ci0KLSAgICBmb3IgKGludCBpID0gMTsgaSA8IGxlbmd0aF9zaXplOyBpKyspCi0gICAgICBidWYtPnB1c2hfYmFjaygwKTsKLSAgICBidWYtPnB1c2hfYmFjayhzaXplb2Yoa05BTFUyKSk7Ci0gICAgYnVmLT5pbnNlcnQoYnVmLT5lbmQoKSwga05BTFUyLCBrTkFMVTIgKyBzaXplb2Yoa05BTFUyKSk7Ci0gIH0KLX07Ci0KLVRFU1RfUChBVkNDb252ZXJzaW9uVGVzdCwgUGFyc2VDb3JyZWN0bHkpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDg+IGJ1ZjsKLSAgTWFrZUlucHV0Rm9yTGVuZ3RoKEdldFBhcmFtKCksICZidWYpOwotICBFWFBFQ1RfVFJVRShBVkM6OkNvbnZlcnRGcmFtZVRvQW5uZXhCKEdldFBhcmFtKCksICZidWYpKTsKLSAgRVhQRUNUX0VRKGJ1Zi5zaXplKCksIHNpemVvZihrRXhwZWN0ZWQpKTsKLSAgRVhQRUNUX0VRKDAsIG1lbWNtcChrRXhwZWN0ZWQsICZidWZbMF0sIHNpemVvZihrRXhwZWN0ZWQpKSk7Ci19Ci0KLVRFU1RfUChBVkNDb252ZXJzaW9uVGVzdCwgUGFyc2VQYXJ0aWFsKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4PiBidWY7Ci0gIE1ha2VJbnB1dEZvckxlbmd0aChHZXRQYXJhbSgpLCAmYnVmKTsKLSAgYnVmLnBvcF9iYWNrKCk7Ci0gIEVYUEVDVF9GQUxTRShBVkM6OkNvbnZlcnRGcmFtZVRvQW5uZXhCKEdldFBhcmFtKCksICZidWYpKTsKLSAgLy8gVGhpcyB0ZXN0cyBhIGJ1ZmZlciBlbmRpbmcgaW4gdGhlIG1pZGRsZSBvZiBhIE5BTCBsZW5ndGguIEZvciBsZW5ndGggc2l6ZQotICAvLyBvZiBvbmUsIHRoaXMgY2FuJ3QgaGFwcGVuLCBzbyB3ZSBza2lwIHRoYXQgY2FzZS4KLSAgaWYgKEdldFBhcmFtKCkgIT0gMSkgewotICAgIE1ha2VJbnB1dEZvckxlbmd0aChHZXRQYXJhbSgpLCAmYnVmKTsKLSAgICBidWYuZXJhc2UoYnVmLmVuZCgpIC0gKHNpemVvZihrTkFMVTIpICsgMSksIGJ1Zi5lbmQoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKEFWQzo6Q29udmVydEZyYW1lVG9Bbm5leEIoR2V0UGFyYW0oKSwgJmJ1ZikpOwotICB9Ci19Ci0KLVRFU1RfUChBVkNDb252ZXJzaW9uVGVzdCwgUGFyc2VFbXB0eSkgewotICBzdGQ6OnZlY3Rvcjx1aW50OD4gYnVmOwotICBFWFBFQ1RfVFJVRShBVkM6OkNvbnZlcnRGcmFtZVRvQW5uZXhCKEdldFBhcmFtKCksICZidWYpKTsKLSAgRVhQRUNUX0VRKDB1LCBidWYuc2l6ZSgpKTsKLX0KLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQVZDQ29udmVyc2lvblRlc3RWYWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBBVkNDb252ZXJzaW9uVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKDEsIDIsIDQpKTsKLQotVEVTVF9GKEFWQ0NvbnZlcnNpb25UZXN0LCBDb252ZXJ0Q29uZmlnVG9Bbm5leEIpIHsKLSAgQVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQgYXZjX2NvbmZpZzsKLSAgYXZjX2NvbmZpZy5zcHNfbGlzdC5yZXNpemUoMik7Ci0gIGF2Y19jb25maWcuc3BzX2xpc3RbMF0ucHVzaF9iYWNrKDB4NjcpOwotICBhdmNfY29uZmlnLnNwc19saXN0WzBdLnB1c2hfYmFjaygweDEyKTsKLSAgYXZjX2NvbmZpZy5zcHNfbGlzdFsxXS5wdXNoX2JhY2soMHg2Nyk7Ci0gIGF2Y19jb25maWcuc3BzX2xpc3RbMV0ucHVzaF9iYWNrKDB4MzQpOwotICBhdmNfY29uZmlnLnBwc19saXN0LnJlc2l6ZSgxKTsKLSAgYXZjX2NvbmZpZy5wcHNfbGlzdFswXS5wdXNoX2JhY2soMHg2OCk7Ci0gIGF2Y19jb25maWcucHBzX2xpc3RbMF0ucHVzaF9iYWNrKDB4NTYpOwotICBhdmNfY29uZmlnLnBwc19saXN0WzBdLnB1c2hfYmFjaygweDc4KTsKLQotICBzdGQ6OnZlY3Rvcjx1aW50OD4gYnVmOwotICBFWFBFQ1RfVFJVRShBVkM6OkNvbnZlcnRDb25maWdUb0FubmV4QihhdmNfY29uZmlnLCAmYnVmKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZW1jbXAoa0V4cGVjdGVkUGFyYW1TZXRzLCAmYnVmWzBdLAotICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrRXhwZWN0ZWRQYXJhbVNldHMpKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtcDQKLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL21wNC9ib3hfZGVmaW5pdGlvbnMuY2MgYi9zcmMvbWVkaWEvbXA0L2JveF9kZWZpbml0aW9ucy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM2NDViZS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvbXA0L2JveF9kZWZpbml0aW9ucy5jYworKysgL2Rldi9udWxsCkBAIC0xLDc1NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvbXA0L2JveF9kZWZpbml0aW9ucy5oIgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAibWVkaWEvbXA0L2VzX2Rlc2NyaXB0b3IuaCIKLSNpbmNsdWRlICJtZWRpYS9tcDQvcmNoZWNrLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci1uYW1lc3BhY2UgbXA0IHsKLQotRmlsZVR5cGU6OkZpbGVUeXBlKCkge30KLUZpbGVUeXBlOjp+RmlsZVR5cGUoKSB7fQotRm91ckNDIEZpbGVUeXBlOjpCb3hUeXBlKCkgY29uc3QgeyByZXR1cm4gRk9VUkNDX0ZUWVA7IH0KLQotYm9vbCBGaWxlVHlwZTo6UGFyc2UoQm94UmVhZGVyKiByZWFkZXIpIHsKLSAgUkNIRUNLKHJlYWRlci0+UmVhZEZvdXJDQygmbWFqb3JfYnJhbmQpICYmIHJlYWRlci0+UmVhZDQoJm1pbm9yX3ZlcnNpb24pKTsKLSAgc2l6ZV90IG51bV9icmFuZHMgPSAocmVhZGVyLT5zaXplKCkgLSByZWFkZXItPnBvcygpKSAvIHNpemVvZihGb3VyQ0MpOwotICByZXR1cm4gcmVhZGVyLT5Ta2lwQnl0ZXMoc2l6ZW9mKEZvdXJDQykgKiBudW1fYnJhbmRzKTsgIC8vIGNvbXBhdGlibGVfYnJhbmRzCi19Ci0KLVByb3RlY3Rpb25TeXN0ZW1TcGVjaWZpY0hlYWRlcjo6UHJvdGVjdGlvblN5c3RlbVNwZWNpZmljSGVhZGVyKCkge30KLVByb3RlY3Rpb25TeXN0ZW1TcGVjaWZpY0hlYWRlcjo6flByb3RlY3Rpb25TeXN0ZW1TcGVjaWZpY0hlYWRlcigpIHt9Ci1Gb3VyQ0MgUHJvdGVjdGlvblN5c3RlbVNwZWNpZmljSGVhZGVyOjpCb3hUeXBlKCkgY29uc3QgeyByZXR1cm4gRk9VUkNDX1BTU0g7IH0KLQotYm9vbCBQcm90ZWN0aW9uU3lzdGVtU3BlY2lmaWNIZWFkZXI6OlBhcnNlKEJveFJlYWRlciogcmVhZGVyKSB7Ci0gIC8vIFZhbGlkYXRlIHRoZSBib3gncyBjb250ZW50cyBhbmQgaGFuZyBvbiB0byB0aGUgc3lzdGVtIElELgotICB1aW50MzIgc2l6ZTsKLSAgUkNIRUNLKHJlYWRlci0+UmVhZEZ1bGxCb3hIZWFkZXIoKSAmJgotICAgICAgICAgcmVhZGVyLT5SZWFkVmVjKCZzeXN0ZW1faWQsIDE2KSAmJgotICAgICAgICAgcmVhZGVyLT5SZWFkNCgmc2l6ZSkgJiYKLSAgICAgICAgIHJlYWRlci0+SGFzQnl0ZXMoc2l6ZSkpOwotCi0gIC8vIENvcHkgdGhlIGVudGlyZSBib3gsIGluY2x1ZGluZyB0aGUgaGVhZGVyLCBmb3IgcGFzc2luZyB0byBFTUUgYXMgaW5pdERhdGEuCi0gIERDSEVDSyhyYXdfYm94LmVtcHR5KCkpOwotICByYXdfYm94LmFzc2lnbihyZWFkZXItPmRhdGEoKSwgcmVhZGVyLT5kYXRhKCkgKyByZWFkZXItPnNpemUoKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1TYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvbk9mZnNldDo6U2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25PZmZzZXQoKSB7fQotU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25PZmZzZXQ6On5TYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvbk9mZnNldCgpIHt9Ci1Gb3VyQ0MgU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25PZmZzZXQ6OkJveFR5cGUoKSBjb25zdCB7IHJldHVybiBGT1VSQ0NfU0FJTzsgfQotCi1ib29sIFNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uT2Zmc2V0OjpQYXJzZShCb3hSZWFkZXIqIHJlYWRlcikgewotICBSQ0hFQ0socmVhZGVyLT5SZWFkRnVsbEJveEhlYWRlcigpKTsKLSAgaWYgKHJlYWRlci0+ZmxhZ3MoKSAmIDEpCi0gICAgUkNIRUNLKHJlYWRlci0+U2tpcEJ5dGVzKDgpKTsKLQotICB1aW50MzIgY291bnQ7Ci0gIFJDSEVDSyhyZWFkZXItPlJlYWQ0KCZjb3VudCkgJiYKLSAgICAgICAgIHJlYWRlci0+SGFzQnl0ZXMoY291bnQgKiAocmVhZGVyLT52ZXJzaW9uKCkgPT0gMSA/IDggOiA0KSkpOwotICBvZmZzZXRzLnJlc2l6ZShjb3VudCk7Ci0KLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgaWYgKHJlYWRlci0+dmVyc2lvbigpID09IDEpIHsKLSAgICAgIFJDSEVDSyhyZWFkZXItPlJlYWQ4KCZvZmZzZXRzW2ldKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFJDSEVDSyhyZWFkZXItPlJlYWQ0SW50bzgoJm9mZnNldHNbaV0pKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uU2l6ZTo6U2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25TaXplKCkKLSAgOiBkZWZhdWx0X3NhbXBsZV9pbmZvX3NpemUoMCksIHNhbXBsZV9jb3VudCgwKSB7Ci19Ci1TYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvblNpemU6On5TYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvblNpemUoKSB7fQotRm91ckNDIFNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uU2l6ZTo6Qm94VHlwZSgpIGNvbnN0IHsgcmV0dXJuIEZPVVJDQ19TQUlaOyB9Ci0KLWJvb2wgU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25TaXplOjpQYXJzZShCb3hSZWFkZXIqIHJlYWRlcikgewotICBSQ0hFQ0socmVhZGVyLT5SZWFkRnVsbEJveEhlYWRlcigpKTsKLSAgaWYgKHJlYWRlci0+ZmxhZ3MoKSAmIDEpCi0gICAgUkNIRUNLKHJlYWRlci0+U2tpcEJ5dGVzKDgpKTsKLQotICBSQ0hFQ0socmVhZGVyLT5SZWFkMSgmZGVmYXVsdF9zYW1wbGVfaW5mb19zaXplKSAmJgotICAgICAgICAgcmVhZGVyLT5SZWFkNCgmc2FtcGxlX2NvdW50KSk7Ci0gIGlmIChkZWZhdWx0X3NhbXBsZV9pbmZvX3NpemUgPT0gMCkKLSAgICByZXR1cm4gcmVhZGVyLT5SZWFkVmVjKCZzYW1wbGVfaW5mb19zaXplcywgc2FtcGxlX2NvdW50KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLU9yaWdpbmFsRm9ybWF0OjpPcmlnaW5hbEZvcm1hdCgpIDogZm9ybWF0KEZPVVJDQ19OVUxMKSB7fQotT3JpZ2luYWxGb3JtYXQ6On5PcmlnaW5hbEZvcm1hdCgpIHt9Ci1Gb3VyQ0MgT3JpZ2luYWxGb3JtYXQ6OkJveFR5cGUoKSBjb25zdCB7IHJldHVybiBGT1VSQ0NfRlJNQTsgfQotCi1ib29sIE9yaWdpbmFsRm9ybWF0OjpQYXJzZShCb3hSZWFkZXIqIHJlYWRlcikgewotICByZXR1cm4gcmVhZGVyLT5SZWFkRm91ckNDKCZmb3JtYXQpOwotfQotCi1TY2hlbWVUeXBlOjpTY2hlbWVUeXBlKCkgOiB0eXBlKEZPVVJDQ19OVUxMKSwgdmVyc2lvbigwKSB7fQotU2NoZW1lVHlwZTo6flNjaGVtZVR5cGUoKSB7fQotRm91ckNDIFNjaGVtZVR5cGU6OkJveFR5cGUoKSBjb25zdCB7IHJldHVybiBGT1VSQ0NfU0NITTsgfQotCi1ib29sIFNjaGVtZVR5cGU6OlBhcnNlKEJveFJlYWRlciogcmVhZGVyKSB7Ci0gIFJDSEVDSyhyZWFkZXItPlJlYWRGdWxsQm94SGVhZGVyKCkgJiYKLSAgICAgICAgIHJlYWRlci0+UmVhZEZvdXJDQygmdHlwZSkgJiYKLSAgICAgICAgIHJlYWRlci0+UmVhZDQoJnZlcnNpb24pKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLVRyYWNrRW5jcnlwdGlvbjo6VHJhY2tFbmNyeXB0aW9uKCkKLSAgOiBpc19lbmNyeXB0ZWQoZmFsc2UpLCBkZWZhdWx0X2l2X3NpemUoMCkgewotfQotVHJhY2tFbmNyeXB0aW9uOjp+VHJhY2tFbmNyeXB0aW9uKCkge30KLUZvdXJDQyBUcmFja0VuY3J5cHRpb246OkJveFR5cGUoKSBjb25zdCB7IHJldHVybiBGT1VSQ0NfVEVOQzsgfQotCi1ib29sIFRyYWNrRW5jcnlwdGlvbjo6UGFyc2UoQm94UmVhZGVyKiByZWFkZXIpIHsKLSAgdWludDggZmxhZzsKLSAgUkNIRUNLKHJlYWRlci0+UmVhZEZ1bGxCb3hIZWFkZXIoKSAmJgotICAgICAgICAgcmVhZGVyLT5Ta2lwQnl0ZXMoMikgJiYKLSAgICAgICAgIHJlYWRlci0+UmVhZDEoJmZsYWcpICYmCi0gICAgICAgICByZWFkZXItPlJlYWQxKCZkZWZhdWx0X2l2X3NpemUpICYmCi0gICAgICAgICByZWFkZXItPlJlYWRWZWMoJmRlZmF1bHRfa2lkLCAxNikpOwotICBpc19lbmNyeXB0ZWQgPSAoZmxhZyAhPSAwKTsKLSAgaWYgKGlzX2VuY3J5cHRlZCkgewotICAgIFJDSEVDSyhkZWZhdWx0X2l2X3NpemUgPT0gOCB8fCBkZWZhdWx0X2l2X3NpemUgPT0gMTYpOwotICB9IGVsc2UgewotICAgIFJDSEVDSyhkZWZhdWx0X2l2X3NpemUgPT0gMCk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLVNjaGVtZUluZm86OlNjaGVtZUluZm8oKSB7fQotU2NoZW1lSW5mbzo6flNjaGVtZUluZm8oKSB7fQotRm91ckNDIFNjaGVtZUluZm86OkJveFR5cGUoKSBjb25zdCB7IHJldHVybiBGT1VSQ0NfU0NISTsgfQotCi1ib29sIFNjaGVtZUluZm86OlBhcnNlKEJveFJlYWRlciogcmVhZGVyKSB7Ci0gIHJldHVybiByZWFkZXItPlNjYW5DaGlsZHJlbigpICYmIHJlYWRlci0+UmVhZENoaWxkKCZ0cmFja19lbmNyeXB0aW9uKTsKLX0KLQotUHJvdGVjdGlvblNjaGVtZUluZm86OlByb3RlY3Rpb25TY2hlbWVJbmZvKCkge30KLVByb3RlY3Rpb25TY2hlbWVJbmZvOjp+UHJvdGVjdGlvblNjaGVtZUluZm8oKSB7fQotRm91ckNDIFByb3RlY3Rpb25TY2hlbWVJbmZvOjpCb3hUeXBlKCkgY29uc3QgeyByZXR1cm4gRk9VUkNDX1NJTkY7IH0KLQotYm9vbCBQcm90ZWN0aW9uU2NoZW1lSW5mbzo6UGFyc2UoQm94UmVhZGVyKiByZWFkZXIpIHsKLSAgUkNIRUNLKHJlYWRlci0+U2NhbkNoaWxkcmVuKCkgJiYKLSAgICAgICAgIHJlYWRlci0+UmVhZENoaWxkKCZmb3JtYXQpICYmCi0gICAgICAgICByZWFkZXItPlJlYWRDaGlsZCgmdHlwZSkpOwotICBpZiAodHlwZS50eXBlID09IEZPVVJDQ19DRU5DKQotICAgIFJDSEVDSyhyZWFkZXItPlJlYWRDaGlsZCgmaW5mbykpOwotICAvLyBPdGhlciBwcm90ZWN0aW9uIHNjaGVtZXMgYXJlIHNpbGVudGx5IGlnbm9yZWQuIFNpbmNlIHRoZSBwcm90ZWN0aW9uIHNjaGVtZQotICAvLyB0eXBlIGNhbid0IGJlIGRldGVybWluZWQgdW50aWwgdGhpcyBib3ggaXMgb3BlbmVkLCB3ZSByZXR1cm4gJ3RydWUnIGZvcgotICAvLyBub24tQ0VOQyBwcm90ZWN0aW9uIHNjaGVtZSB0eXBlcy4gSXQgaXMgdGhlIHBhcmVudCBib3gncyByZXNwb25zaWJpbGl0eSB0bwotICAvLyBlbnN1cmUgdGhhdCB0aGlzIHNjaGVtZSB0eXBlIGlzIGEgc3VwcG9ydGVkIG9uZS4KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLU1vdmllSGVhZGVyOjpNb3ZpZUhlYWRlcigpCi0gICAgOiBjcmVhdGlvbl90aW1lKDApLAotICAgICAgbW9kaWZpY2F0aW9uX3RpbWUoMCksCi0gICAgICB0aW1lc2NhbGUoMCksCi0gICAgICBkdXJhdGlvbigwKSwKLSAgICAgIHJhdGUoLTEpLAotICAgICAgdm9sdW1lKC0xKSwKLSAgICAgIG5leHRfdHJhY2tfaWQoMCkge30KLU1vdmllSGVhZGVyOjp+TW92aWVIZWFkZXIoKSB7fQotRm91ckNDIE1vdmllSGVhZGVyOjpCb3hUeXBlKCkgY29uc3QgeyByZXR1cm4gRk9VUkNDX01WSEQ7IH0KLQotYm9vbCBNb3ZpZUhlYWRlcjo6UGFyc2UoQm94UmVhZGVyKiByZWFkZXIpIHsKLSAgUkNIRUNLKHJlYWRlci0+UmVhZEZ1bGxCb3hIZWFkZXIoKSk7Ci0KLSAgaWYgKHJlYWRlci0+dmVyc2lvbigpID09IDEpIHsKLSAgICBSQ0hFQ0socmVhZGVyLT5SZWFkOCgmY3JlYXRpb25fdGltZSkgJiYKLSAgICAgICAgICAgcmVhZGVyLT5SZWFkOCgmbW9kaWZpY2F0aW9uX3RpbWUpICYmCi0gICAgICAgICAgIHJlYWRlci0+UmVhZDQoJnRpbWVzY2FsZSkgJiYKLSAgICAgICAgICAgcmVhZGVyLT5SZWFkOCgmZHVyYXRpb24pKTsKLSAgfSBlbHNlIHsKLSAgICBSQ0hFQ0socmVhZGVyLT5SZWFkNEludG84KCZjcmVhdGlvbl90aW1lKSAmJgotICAgICAgICAgICByZWFkZXItPlJlYWQ0SW50bzgoJm1vZGlmaWNhdGlvbl90aW1lKSAmJgotICAgICAgICAgICByZWFkZXItPlJlYWQ0KCZ0aW1lc2NhbGUpICYmCi0gICAgICAgICAgIHJlYWRlci0+UmVhZDRJbnRvOCgmZHVyYXRpb24pKTsKLSAgfQotCi0gIFJDSEVDSyhyZWFkZXItPlJlYWQ0cygmcmF0ZSkgJiYKLSAgICAgICAgIHJlYWRlci0+UmVhZDJzKCZ2b2x1bWUpICYmCi0gICAgICAgICByZWFkZXItPlNraXBCeXRlcygxMCkgJiYgIC8vIHJlc2VydmVkCi0gICAgICAgICByZWFkZXItPlNraXBCeXRlcygzNikgJiYgIC8vIG1hdHJpeAotICAgICAgICAgcmVhZGVyLT5Ta2lwQnl0ZXMoMjQpICYmICAvLyBwcmVkZWZpbmVkIHplcm8KLSAgICAgICAgIHJlYWRlci0+UmVhZDQoJm5leHRfdHJhY2tfaWQpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLVRyYWNrSGVhZGVyOjpUcmFja0hlYWRlcigpCi0gICAgOiBjcmVhdGlvbl90aW1lKDApLAotICAgICAgbW9kaWZpY2F0aW9uX3RpbWUoMCksCi0gICAgICB0cmFja19pZCgwKSwKLSAgICAgIGR1cmF0aW9uKDApLAotICAgICAgbGF5ZXIoLTEpLAotICAgICAgYWx0ZXJuYXRlX2dyb3VwKC0xKSwKLSAgICAgIHZvbHVtZSgtMSksCi0gICAgICB3aWR0aCgwKSwKLSAgICAgIGhlaWdodCgwKSB7fQotVHJhY2tIZWFkZXI6On5UcmFja0hlYWRlcigpIHt9Ci1Gb3VyQ0MgVHJhY2tIZWFkZXI6OkJveFR5cGUoKSBjb25zdCB7IHJldHVybiBGT1VSQ0NfVEtIRDsgfQotCi1ib29sIFRyYWNrSGVhZGVyOjpQYXJzZShCb3hSZWFkZXIqIHJlYWRlcikgewotICBSQ0hFQ0socmVhZGVyLT5SZWFkRnVsbEJveEhlYWRlcigpKTsKLSAgaWYgKHJlYWRlci0+dmVyc2lvbigpID09IDEpIHsKLSAgICBSQ0hFQ0socmVhZGVyLT5SZWFkOCgmY3JlYXRpb25fdGltZSkgJiYKLSAgICAgICAgICAgcmVhZGVyLT5SZWFkOCgmbW9kaWZpY2F0aW9uX3RpbWUpICYmCi0gICAgICAgICAgIHJlYWRlci0+UmVhZDQoJnRyYWNrX2lkKSAmJgotICAgICAgICAgICByZWFkZXItPlNraXBCeXRlcyg0KSAmJiAgICAvLyByZXNlcnZlZAotICAgICAgICAgICByZWFkZXItPlJlYWQ4KCZkdXJhdGlvbikpOwotICB9IGVsc2UgewotICAgIFJDSEVDSyhyZWFkZXItPlJlYWQ0SW50bzgoJmNyZWF0aW9uX3RpbWUpICYmCi0gICAgICAgICAgIHJlYWRlci0+UmVhZDRJbnRvOCgmbW9kaWZpY2F0aW9uX3RpbWUpICYmCi0gICAgICAgICAgIHJlYWRlci0+UmVhZDQoJnRyYWNrX2lkKSAmJgotICAgICAgICAgICByZWFkZXItPlNraXBCeXRlcyg0KSAmJiAgIC8vIHJlc2VydmVkCi0gICAgICAgICAgIHJlYWRlci0+UmVhZDRJbnRvOCgmZHVyYXRpb24pKTsKLSAgfQotCi0gIFJDSEVDSyhyZWFkZXItPlNraXBCeXRlcyg4KSAmJiAgLy8gcmVzZXJ2ZWQKLSAgICAgICAgIHJlYWRlci0+UmVhZDJzKCZsYXllcikgJiYKLSAgICAgICAgIHJlYWRlci0+UmVhZDJzKCZhbHRlcm5hdGVfZ3JvdXApICYmCi0gICAgICAgICByZWFkZXItPlJlYWQycygmdm9sdW1lKSAmJgotICAgICAgICAgcmVhZGVyLT5Ta2lwQnl0ZXMoMikgJiYgIC8vIHJlc2VydmVkCi0gICAgICAgICByZWFkZXItPlNraXBCeXRlcygzNikgJiYgIC8vIG1hdHJpeAotICAgICAgICAgcmVhZGVyLT5SZWFkNCgmd2lkdGgpICYmCi0gICAgICAgICByZWFkZXItPlJlYWQ0KCZoZWlnaHQpKTsKLSAgd2lkdGggPj49IDE2OwotICBoZWlnaHQgPj49IDE2OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotU2FtcGxlRGVzY3JpcHRpb246OlNhbXBsZURlc2NyaXB0aW9uKCkgOiB0eXBlKGtJbnZhbGlkKSB7fQotU2FtcGxlRGVzY3JpcHRpb246On5TYW1wbGVEZXNjcmlwdGlvbigpIHt9Ci1Gb3VyQ0MgU2FtcGxlRGVzY3JpcHRpb246OkJveFR5cGUoKSBjb25zdCB7IHJldHVybiBGT1VSQ0NfU1RTRDsgfQotCi1ib29sIFNhbXBsZURlc2NyaXB0aW9uOjpQYXJzZShCb3hSZWFkZXIqIHJlYWRlcikgewotICB1aW50MzIgY291bnQ7Ci0gIFJDSEVDSyhyZWFkZXItPlNraXBCeXRlcyg0KSAmJgotICAgICAgICAgcmVhZGVyLT5SZWFkNCgmY291bnQpKTsKLSAgdmlkZW9fZW50cmllcy5jbGVhcigpOwotICBhdWRpb19lbnRyaWVzLmNsZWFyKCk7Ci0KLSAgLy8gTm90ZTogdGhpcyB2YWx1ZSBpcyBwcmVzZXQgYmVmb3JlIHNjYW5uaW5nIGJlZ2lucy4gU2VlIGNvbW1lbnRzIGluIHRoZQotICAvLyBQYXJzZShNZWRpYSopIGZ1bmN0aW9uLgotICBpZiAodHlwZSA9PSBrVmlkZW8pIHsKLSAgICBSQ0hFQ0socmVhZGVyLT5SZWFkQWxsQ2hpbGRyZW4oJnZpZGVvX2VudHJpZXMpKTsKLSAgfSBlbHNlIGlmICh0eXBlID09IGtBdWRpbykgewotICAgIFJDSEVDSyhyZWFkZXItPlJlYWRBbGxDaGlsZHJlbigmYXVkaW9fZW50cmllcykpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1TYW1wbGVUYWJsZTo6U2FtcGxlVGFibGUoKSB7fQotU2FtcGxlVGFibGU6On5TYW1wbGVUYWJsZSgpIHt9Ci1Gb3VyQ0MgU2FtcGxlVGFibGU6OkJveFR5cGUoKSBjb25zdCB7IHJldHVybiBGT1VSQ0NfU1RCTDsgfQotCi1ib29sIFNhbXBsZVRhYmxlOjpQYXJzZShCb3hSZWFkZXIqIHJlYWRlcikgewotICByZXR1cm4gcmVhZGVyLT5TY2FuQ2hpbGRyZW4oKSAmJgotICAgICAgICAgcmVhZGVyLT5SZWFkQ2hpbGQoJmRlc2NyaXB0aW9uKTsKLX0KLQotRWRpdExpc3Q6OkVkaXRMaXN0KCkge30KLUVkaXRMaXN0Ojp+RWRpdExpc3QoKSB7fQotRm91ckNDIEVkaXRMaXN0OjpCb3hUeXBlKCkgY29uc3QgeyByZXR1cm4gRk9VUkNDX0VMU1Q7IH0KLQotYm9vbCBFZGl0TGlzdDo6UGFyc2UoQm94UmVhZGVyKiByZWFkZXIpIHsKLSAgdWludDMyIGNvdW50OwotICBSQ0hFQ0socmVhZGVyLT5SZWFkRnVsbEJveEhlYWRlcigpICYmIHJlYWRlci0+UmVhZDQoJmNvdW50KSk7Ci0KLSAgaWYgKHJlYWRlci0+dmVyc2lvbigpID09IDEpIHsKLSAgICBSQ0hFQ0socmVhZGVyLT5IYXNCeXRlcyhjb3VudCAqIDIwKSk7Ci0gIH0gZWxzZSB7Ci0gICAgUkNIRUNLKHJlYWRlci0+SGFzQnl0ZXMoY291bnQgKiAxMikpOwotICB9Ci0gIGVkaXRzLnJlc2l6ZShjb3VudCk7Ci0KLSAgZm9yIChzdGQ6OnZlY3RvcjxFZGl0TGlzdEVudHJ5Pjo6aXRlcmF0b3IgZWRpdCA9IGVkaXRzLmJlZ2luKCk7Ci0gICAgICAgZWRpdCAhPSBlZGl0cy5lbmQoKTsgKytlZGl0KSB7Ci0gICAgaWYgKHJlYWRlci0+dmVyc2lvbigpID09IDEpIHsKLSAgICAgIFJDSEVDSyhyZWFkZXItPlJlYWQ4KCZlZGl0LT5zZWdtZW50X2R1cmF0aW9uKSAmJgotICAgICAgICAgICAgIHJlYWRlci0+UmVhZDhzKCZlZGl0LT5tZWRpYV90aW1lKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFJDSEVDSyhyZWFkZXItPlJlYWQ0SW50bzgoJmVkaXQtPnNlZ21lbnRfZHVyYXRpb24pICYmCi0gICAgICAgICAgICAgcmVhZGVyLT5SZWFkNHNJbnRvOHMoJmVkaXQtPm1lZGlhX3RpbWUpKTsKLSAgICB9Ci0gICAgUkNIRUNLKHJlYWRlci0+UmVhZDJzKCZlZGl0LT5tZWRpYV9yYXRlX2ludGVnZXIpICYmCi0gICAgICAgICAgIHJlYWRlci0+UmVhZDJzKCZlZGl0LT5tZWRpYV9yYXRlX2ZyYWN0aW9uKSk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUVkaXQ6OkVkaXQoKSB7fQotRWRpdDo6fkVkaXQoKSB7fQotRm91ckNDIEVkaXQ6OkJveFR5cGUoKSBjb25zdCB7IHJldHVybiBGT1VSQ0NfRURUUzsgfQotCi1ib29sIEVkaXQ6OlBhcnNlKEJveFJlYWRlciogcmVhZGVyKSB7Ci0gIHJldHVybiByZWFkZXItPlNjYW5DaGlsZHJlbigpICYmIHJlYWRlci0+UmVhZENoaWxkKCZsaXN0KTsKLX0KLQotSGFuZGxlclJlZmVyZW5jZTo6SGFuZGxlclJlZmVyZW5jZSgpIDogdHlwZShrSW52YWxpZCkge30KLUhhbmRsZXJSZWZlcmVuY2U6On5IYW5kbGVyUmVmZXJlbmNlKCkge30KLUZvdXJDQyBIYW5kbGVyUmVmZXJlbmNlOjpCb3hUeXBlKCkgY29uc3QgeyByZXR1cm4gRk9VUkNDX0hETFI7IH0KLQotYm9vbCBIYW5kbGVyUmVmZXJlbmNlOjpQYXJzZShCb3hSZWFkZXIqIHJlYWRlcikgewotICBGb3VyQ0MgaGRscl90eXBlOwotICBSQ0hFQ0socmVhZGVyLT5Ta2lwQnl0ZXMoOCkgJiYgcmVhZGVyLT5SZWFkRm91ckNDKCZoZGxyX3R5cGUpKTsKLSAgLy8gTm90ZTogcmVtYWluaW5nIGZpZWxkcyBpbiBib3ggaWdub3JlZAotICBpZiAoaGRscl90eXBlID09IEZPVVJDQ19WSURFKSB7Ci0gICAgdHlwZSA9IGtWaWRlbzsKLSAgfSBlbHNlIGlmIChoZGxyX3R5cGUgPT0gRk9VUkNDX1NPVU4pIHsKLSAgICB0eXBlID0ga0F1ZGlvOwotICB9IGVsc2UgewotICAgIHR5cGUgPSBrSW52YWxpZDsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotQVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQ6OkFWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkKCkKLSAgICA6IHZlcnNpb24oMCksCi0gICAgICBwcm9maWxlX2luZGljYXRpb24oMCksCi0gICAgICBwcm9maWxlX2NvbXBhdGliaWxpdHkoMCksCi0gICAgICBhdmNfbGV2ZWwoMCksCi0gICAgICBsZW5ndGhfc2l6ZSgwKSB7fQotCi1BVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZDo6fkFWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkKCkge30KLUZvdXJDQyBBVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZDo6Qm94VHlwZSgpIGNvbnN0IHsgcmV0dXJuIEZPVVJDQ19BVkNDOyB9Ci0KLWJvb2wgQVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQ6OlBhcnNlKEJveFJlYWRlciogcmVhZGVyKSB7Ci0gIFJDSEVDSyhyZWFkZXItPlJlYWQxKCZ2ZXJzaW9uKSAmJiB2ZXJzaW9uID09IDEgJiYKLSAgICAgICAgIHJlYWRlci0+UmVhZDEoJnByb2ZpbGVfaW5kaWNhdGlvbikgJiYKLSAgICAgICAgIHJlYWRlci0+UmVhZDEoJnByb2ZpbGVfY29tcGF0aWJpbGl0eSkgJiYKLSAgICAgICAgIHJlYWRlci0+UmVhZDEoJmF2Y19sZXZlbCkpOwotCi0gIHVpbnQ4IGxlbmd0aF9zaXplX21pbnVzX29uZTsKLSAgUkNIRUNLKHJlYWRlci0+UmVhZDEoJmxlbmd0aF9zaXplX21pbnVzX29uZSkgJiYKLSAgICAgICAgIChsZW5ndGhfc2l6ZV9taW51c19vbmUgJiAweGZjKSA9PSAweGZjKTsKLSAgbGVuZ3RoX3NpemUgPSAobGVuZ3RoX3NpemVfbWludXNfb25lICYgMHgzKSArIDE7Ci0KLSAgdWludDggbnVtX3NwczsKLSAgUkNIRUNLKHJlYWRlci0+UmVhZDEoJm51bV9zcHMpICYmIChudW1fc3BzICYgMHhlMCkgPT0gMHhlMCk7Ci0gIG51bV9zcHMgJj0gMHgxZjsKLQotICBzcHNfbGlzdC5yZXNpemUobnVtX3Nwcyk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX3NwczsgaSsrKSB7Ci0gICAgdWludDE2IHNwc19sZW5ndGg7Ci0gICAgUkNIRUNLKHJlYWRlci0+UmVhZDIoJnNwc19sZW5ndGgpICYmCi0gICAgICAgICAgIHJlYWRlci0+UmVhZFZlYygmc3BzX2xpc3RbaV0sIHNwc19sZW5ndGgpKTsKLSAgfQotCi0gIHVpbnQ4IG51bV9wcHM7Ci0gIFJDSEVDSyhyZWFkZXItPlJlYWQxKCZudW1fcHBzKSk7Ci0KLSAgcHBzX2xpc3QucmVzaXplKG51bV9wcHMpOwotICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9wcHM7IGkrKykgewotICAgIHVpbnQxNiBwcHNfbGVuZ3RoOwotICAgIFJDSEVDSyhyZWFkZXItPlJlYWQyKCZwcHNfbGVuZ3RoKSAmJgotICAgICAgICAgICByZWFkZXItPlJlYWRWZWMoJnBwc19saXN0W2ldLCBwcHNfbGVuZ3RoKSk7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotUGl4ZWxBc3BlY3RSYXRpb0JveDo6UGl4ZWxBc3BlY3RSYXRpb0JveCgpIDogaF9zcGFjaW5nKDEpLCB2X3NwYWNpbmcoMSkge30KLVBpeGVsQXNwZWN0UmF0aW9Cb3g6On5QaXhlbEFzcGVjdFJhdGlvQm94KCkge30KLUZvdXJDQyBQaXhlbEFzcGVjdFJhdGlvQm94OjpCb3hUeXBlKCkgY29uc3QgeyByZXR1cm4gRk9VUkNDX1BBU1A7IH0KLQotYm9vbCBQaXhlbEFzcGVjdFJhdGlvQm94OjpQYXJzZShCb3hSZWFkZXIqIHJlYWRlcikgewotICBSQ0hFQ0socmVhZGVyLT5SZWFkNCgmaF9zcGFjaW5nKSAmJgotICAgICAgICAgcmVhZGVyLT5SZWFkNCgmdl9zcGFjaW5nKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1WaWRlb1NhbXBsZUVudHJ5OjpWaWRlb1NhbXBsZUVudHJ5KCkKLSAgICA6IGZvcm1hdChGT1VSQ0NfTlVMTCksCi0gICAgICBkYXRhX3JlZmVyZW5jZV9pbmRleCgwKSwKLSAgICAgIHdpZHRoKDApLAotICAgICAgaGVpZ2h0KDApIHt9Ci0KLVZpZGVvU2FtcGxlRW50cnk6On5WaWRlb1NhbXBsZUVudHJ5KCkge30KLUZvdXJDQyBWaWRlb1NhbXBsZUVudHJ5OjpCb3hUeXBlKCkgY29uc3QgewotICBEQ0hFQ0soZmFsc2UpIDw8ICJWaWRlb1NhbXBsZUVudHJ5IHNob3VsZCBiZSBwYXJzZWQgYWNjb3JkaW5nIHRvIHRoZSAiCi0gICAgICAgICAgICAgICAgPDwgImhhbmRsZXIgdHlwZSByZWNvdmVyZWQgaW4gaXRzIE1lZGlhIGFuY2VzdG9yLiI7Ci0gIHJldHVybiBGT1VSQ0NfTlVMTDsKLX0KLQotYm9vbCBWaWRlb1NhbXBsZUVudHJ5OjpQYXJzZShCb3hSZWFkZXIqIHJlYWRlcikgewotICBmb3JtYXQgPSByZWFkZXItPnR5cGUoKTsKLSAgUkNIRUNLKHJlYWRlci0+U2tpcEJ5dGVzKDYpICYmCi0gICAgICAgICByZWFkZXItPlJlYWQyKCZkYXRhX3JlZmVyZW5jZV9pbmRleCkgJiYKLSAgICAgICAgIHJlYWRlci0+U2tpcEJ5dGVzKDE2KSAmJgotICAgICAgICAgcmVhZGVyLT5SZWFkMigmd2lkdGgpICYmCi0gICAgICAgICByZWFkZXItPlJlYWQyKCZoZWlnaHQpICYmCi0gICAgICAgICByZWFkZXItPlNraXBCeXRlcyg1MCkpOwotCi0gIFJDSEVDSyhyZWFkZXItPlNjYW5DaGlsZHJlbigpICYmCi0gICAgICAgICByZWFkZXItPk1heWJlUmVhZENoaWxkKCZwaXhlbF9hc3BlY3QpKTsKLQotICBpZiAoZm9ybWF0ID09IEZPVVJDQ19FTkNWKSB7Ci0gICAgLy8gQ29udGludWUgc2Nhbm5pbmcgdW50aWwgYSByZWNvZ25pemVkIHByb3RlY3Rpb24gc2NoZW1lIGlzIGZvdW5kLCBvciB1bnRpbAotICAgIC8vIHdlIHJ1biBvdXQgb2YgcHJvdGVjdGlvbiBzY2hlbWVzLgotICAgIHdoaWxlIChzaW5mLnR5cGUudHlwZSAhPSBGT1VSQ0NfQ0VOQykgewotICAgICAgaWYgKCFyZWFkZXItPlJlYWRDaGlsZCgmc2luZikpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBpZiAoZm9ybWF0ID09IEZPVVJDQ19BVkMxIHx8Ci0gICAgICAoZm9ybWF0ID09IEZPVVJDQ19FTkNWICYmIHNpbmYuZm9ybWF0LmZvcm1hdCA9PSBGT1VSQ0NfQVZDMSkpIHsKLSAgICBSQ0hFQ0socmVhZGVyLT5SZWFkQ2hpbGQoJmF2Y2MpKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotRWxlbWVudGFyeVN0cmVhbURlc2NyaXB0b3I6OkVsZW1lbnRhcnlTdHJlYW1EZXNjcmlwdG9yKCkKLSAgICA6IG9iamVjdF90eXBlKGtGb3JiaWRkZW4pIHt9Ci0KLUVsZW1lbnRhcnlTdHJlYW1EZXNjcmlwdG9yOjp+RWxlbWVudGFyeVN0cmVhbURlc2NyaXB0b3IoKSB7fQotCi1Gb3VyQ0MgRWxlbWVudGFyeVN0cmVhbURlc2NyaXB0b3I6OkJveFR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiBGT1VSQ0NfRVNEUzsKLX0KLQotYm9vbCBFbGVtZW50YXJ5U3RyZWFtRGVzY3JpcHRvcjo6UGFyc2UoQm94UmVhZGVyKiByZWFkZXIpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDg+IGRhdGE7Ci0gIEVTRGVzY3JpcHRvciBlc19kZXNjOwotCi0gIFJDSEVDSyhyZWFkZXItPlJlYWRGdWxsQm94SGVhZGVyKCkpOwotICBSQ0hFQ0socmVhZGVyLT5SZWFkVmVjKCZkYXRhLCByZWFkZXItPnNpemUoKSAtIHJlYWRlci0+cG9zKCkpKTsKLSAgUkNIRUNLKGVzX2Rlc2MuUGFyc2UoZGF0YSkpOwotCi0gIG9iamVjdF90eXBlID0gZXNfZGVzYy5vYmplY3RfdHlwZSgpOwotCi0gIFJDSEVDSyhhYWMuUGFyc2UoZXNfZGVzYy5kZWNvZGVyX3NwZWNpZmljX2luZm8oKSkpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1BdWRpb1NhbXBsZUVudHJ5OjpBdWRpb1NhbXBsZUVudHJ5KCkKLSAgICA6IGZvcm1hdChGT1VSQ0NfTlVMTCksCi0gICAgICBkYXRhX3JlZmVyZW5jZV9pbmRleCgwKSwKLSAgICAgIGNoYW5uZWxjb3VudCgwKSwKLSAgICAgIHNhbXBsZXNpemUoMCksCi0gICAgICBzYW1wbGVyYXRlKDApIHt9Ci0KLUF1ZGlvU2FtcGxlRW50cnk6On5BdWRpb1NhbXBsZUVudHJ5KCkge30KLQotRm91ckNDIEF1ZGlvU2FtcGxlRW50cnk6OkJveFR5cGUoKSBjb25zdCB7Ci0gIERDSEVDSyhmYWxzZSkgPDwgIkF1ZGlvU2FtcGxlRW50cnkgc2hvdWxkIGJlIHBhcnNlZCBhY2NvcmRpbmcgdG8gdGhlICIKLSAgICAgICAgICAgICAgICA8PCAiaGFuZGxlciB0eXBlIHJlY292ZXJlZCBpbiBpdHMgTWVkaWEgYW5jZXN0b3IuIjsKLSAgcmV0dXJuIEZPVVJDQ19OVUxMOwotfQotCi1ib29sIEF1ZGlvU2FtcGxlRW50cnk6OlBhcnNlKEJveFJlYWRlciogcmVhZGVyKSB7Ci0gIGZvcm1hdCA9IHJlYWRlci0+dHlwZSgpOwotICBSQ0hFQ0socmVhZGVyLT5Ta2lwQnl0ZXMoNikgJiYKLSAgICAgICAgIHJlYWRlci0+UmVhZDIoJmRhdGFfcmVmZXJlbmNlX2luZGV4KSAmJgotICAgICAgICAgcmVhZGVyLT5Ta2lwQnl0ZXMoOCkgJiYKLSAgICAgICAgIHJlYWRlci0+UmVhZDIoJmNoYW5uZWxjb3VudCkgJiYKLSAgICAgICAgIHJlYWRlci0+UmVhZDIoJnNhbXBsZXNpemUpICYmCi0gICAgICAgICByZWFkZXItPlNraXBCeXRlcyg0KSAmJgotICAgICAgICAgcmVhZGVyLT5SZWFkNCgmc2FtcGxlcmF0ZSkpOwotICAvLyBDb252ZXJ0IGZyb20gMTYuMTYgZml4ZWQgcG9pbnQgdG8gaW50ZWdlcgotICBzYW1wbGVyYXRlID4+PSAxNjsKLQotICBSQ0hFQ0socmVhZGVyLT5TY2FuQ2hpbGRyZW4oKSk7Ci0gIGlmIChmb3JtYXQgPT0gRk9VUkNDX0VOQ0EpIHsKLSAgICAvLyBDb250aW51ZSBzY2FubmluZyB1bnRpbCBhIHJlY29nbml6ZWQgcHJvdGVjdGlvbiBzY2hlbWUgaXMgZm91bmQsIG9yIHVudGlsCi0gICAgLy8gd2UgcnVuIG91dCBvZiBwcm90ZWN0aW9uIHNjaGVtZXMuCi0gICAgd2hpbGUgKHNpbmYudHlwZS50eXBlICE9IEZPVVJDQ19DRU5DKSB7Ci0gICAgICBpZiAoIXJlYWRlci0+UmVhZENoaWxkKCZzaW5mKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIFJDSEVDSyhyZWFkZXItPlJlYWRDaGlsZCgmZXNkcykpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotTWVkaWFIZWFkZXI6Ok1lZGlhSGVhZGVyKCkKLSAgICA6IGNyZWF0aW9uX3RpbWUoMCksCi0gICAgICBtb2RpZmljYXRpb25fdGltZSgwKSwKLSAgICAgIHRpbWVzY2FsZSgwKSwKLSAgICAgIGR1cmF0aW9uKDApIHt9Ci1NZWRpYUhlYWRlcjo6fk1lZGlhSGVhZGVyKCkge30KLUZvdXJDQyBNZWRpYUhlYWRlcjo6Qm94VHlwZSgpIGNvbnN0IHsgcmV0dXJuIEZPVVJDQ19NREhEOyB9Ci0KLWJvb2wgTWVkaWFIZWFkZXI6OlBhcnNlKEJveFJlYWRlciogcmVhZGVyKSB7Ci0gIFJDSEVDSyhyZWFkZXItPlJlYWRGdWxsQm94SGVhZGVyKCkpOwotCi0gIGlmIChyZWFkZXItPnZlcnNpb24oKSA9PSAxKSB7Ci0gICAgUkNIRUNLKHJlYWRlci0+UmVhZDgoJmNyZWF0aW9uX3RpbWUpICYmCi0gICAgICAgICAgIHJlYWRlci0+UmVhZDgoJm1vZGlmaWNhdGlvbl90aW1lKSAmJgotICAgICAgICAgICByZWFkZXItPlJlYWQ0KCZ0aW1lc2NhbGUpICYmCi0gICAgICAgICAgIHJlYWRlci0+UmVhZDgoJmR1cmF0aW9uKSk7Ci0gIH0gZWxzZSB7Ci0gICAgUkNIRUNLKHJlYWRlci0+UmVhZDRJbnRvOCgmY3JlYXRpb25fdGltZSkgJiYKLSAgICAgICAgICAgcmVhZGVyLT5SZWFkNEludG84KCZtb2RpZmljYXRpb25fdGltZSkgJiYKLSAgICAgICAgICAgcmVhZGVyLT5SZWFkNCgmdGltZXNjYWxlKSAmJgotICAgICAgICAgICByZWFkZXItPlJlYWQ0SW50bzgoJmR1cmF0aW9uKSk7Ci0gIH0KLSAgLy8gU2tpcCBsYW5ndWFnZSBpbmZvcm1hdGlvbgotICByZXR1cm4gcmVhZGVyLT5Ta2lwQnl0ZXMoNCk7Ci19Ci0KLU1lZGlhSW5mb3JtYXRpb246Ok1lZGlhSW5mb3JtYXRpb24oKSB7fQotTWVkaWFJbmZvcm1hdGlvbjo6fk1lZGlhSW5mb3JtYXRpb24oKSB7fQotRm91ckNDIE1lZGlhSW5mb3JtYXRpb246OkJveFR5cGUoKSBjb25zdCB7IHJldHVybiBGT1VSQ0NfTUlORjsgfQotCi1ib29sIE1lZGlhSW5mb3JtYXRpb246OlBhcnNlKEJveFJlYWRlciogcmVhZGVyKSB7Ci0gIHJldHVybiByZWFkZXItPlNjYW5DaGlsZHJlbigpICYmCi0gICAgICAgICByZWFkZXItPlJlYWRDaGlsZCgmc2FtcGxlX3RhYmxlKTsKLX0KLQotTWVkaWE6Ok1lZGlhKCkge30KLU1lZGlhOjp+TWVkaWEoKSB7fQotRm91ckNDIE1lZGlhOjpCb3hUeXBlKCkgY29uc3QgeyByZXR1cm4gRk9VUkNDX01ESUE7IH0KLQotYm9vbCBNZWRpYTo6UGFyc2UoQm94UmVhZGVyKiByZWFkZXIpIHsKLSAgUkNIRUNLKHJlYWRlci0+U2NhbkNoaWxkcmVuKCkgJiYKLSAgICAgICAgIHJlYWRlci0+UmVhZENoaWxkKCZoZWFkZXIpICYmCi0gICAgICAgICByZWFkZXItPlJlYWRDaGlsZCgmaGFuZGxlcikpOwotCi0gIC8vIE1hZGRlbmluZ2x5LCB0aGUgSGFuZGxlclJlZmVyZW5jZSBib3ggc3BlY2lmaWVzIGhvdyB0byBwYXJzZSB0aGUKLSAgLy8gU2FtcGxlRGVzY3JpcHRpb24gYm94LCBtYWtpbmcgdGhlIGxhdHRlciB0aGUgb25seSBib3ggKG9mIHRob3NlIHRoYXQgd2UKLSAgLy8gc3VwcG9ydCkgd2hpY2ggY2Fubm90IGJlIHBhcnNlZCBjb3JyZWN0bHkgb24gaXRzIG93biAob3IgZXZlbiB3aXRoCi0gIC8vIGluZm9ybWF0aW9uIGZyb20gaXRzIHN0cmljdCBhbmNlc3RvciB0cmVlKS4gV2UgdGh1cyBjb3B5IHRoZSBoYW5kbGVyIHR5cGUKLSAgLy8gdG8gdGhlIHNhbXBsZSBkZXNjcmlwdGlvbiBib3ggKmJlZm9yZSogcGFyc2luZyBpdCB0byBwcm92aWRlIHRoaXMKLSAgLy8gaW5mb3JtYXRpb24gd2hpbGUgcGFyc2luZy4KLSAgaW5mb3JtYXRpb24uc2FtcGxlX3RhYmxlLmRlc2NyaXB0aW9uLnR5cGUgPSBoYW5kbGVyLnR5cGU7Ci0gIFJDSEVDSyhyZWFkZXItPlJlYWRDaGlsZCgmaW5mb3JtYXRpb24pKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLVRyYWNrOjpUcmFjaygpIHt9Ci1UcmFjazo6flRyYWNrKCkge30KLUZvdXJDQyBUcmFjazo6Qm94VHlwZSgpIGNvbnN0IHsgcmV0dXJuIEZPVVJDQ19UUkFLOyB9Ci0KLWJvb2wgVHJhY2s6OlBhcnNlKEJveFJlYWRlciogcmVhZGVyKSB7Ci0gIFJDSEVDSyhyZWFkZXItPlNjYW5DaGlsZHJlbigpICYmCi0gICAgICAgICByZWFkZXItPlJlYWRDaGlsZCgmaGVhZGVyKSAmJgotICAgICAgICAgcmVhZGVyLT5SZWFkQ2hpbGQoJm1lZGlhKSAmJgotICAgICAgICAgcmVhZGVyLT5NYXliZVJlYWRDaGlsZCgmZWRpdCkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotTW92aWVFeHRlbmRzSGVhZGVyOjpNb3ZpZUV4dGVuZHNIZWFkZXIoKSA6IGZyYWdtZW50X2R1cmF0aW9uKDApIHt9Ci1Nb3ZpZUV4dGVuZHNIZWFkZXI6On5Nb3ZpZUV4dGVuZHNIZWFkZXIoKSB7fQotRm91ckNDIE1vdmllRXh0ZW5kc0hlYWRlcjo6Qm94VHlwZSgpIGNvbnN0IHsgcmV0dXJuIEZPVVJDQ19NRUhEOyB9Ci0KLWJvb2wgTW92aWVFeHRlbmRzSGVhZGVyOjpQYXJzZShCb3hSZWFkZXIqIHJlYWRlcikgewotICBSQ0hFQ0socmVhZGVyLT5SZWFkRnVsbEJveEhlYWRlcigpKTsKLSAgaWYgKHJlYWRlci0+dmVyc2lvbigpID09IDEpIHsKLSAgICBSQ0hFQ0socmVhZGVyLT5SZWFkOCgmZnJhZ21lbnRfZHVyYXRpb24pKTsKLSAgfSBlbHNlIHsKLSAgICBSQ0hFQ0socmVhZGVyLT5SZWFkNEludG84KCZmcmFnbWVudF9kdXJhdGlvbikpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1UcmFja0V4dGVuZHM6OlRyYWNrRXh0ZW5kcygpCi0gICAgOiB0cmFja19pZCgwKSwKLSAgICAgIGRlZmF1bHRfc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4KDApLAotICAgICAgZGVmYXVsdF9zYW1wbGVfZHVyYXRpb24oMCksCi0gICAgICBkZWZhdWx0X3NhbXBsZV9zaXplKDApLAotICAgICAgZGVmYXVsdF9zYW1wbGVfZmxhZ3MoMCkge30KLVRyYWNrRXh0ZW5kczo6flRyYWNrRXh0ZW5kcygpIHt9Ci1Gb3VyQ0MgVHJhY2tFeHRlbmRzOjpCb3hUeXBlKCkgY29uc3QgeyByZXR1cm4gRk9VUkNDX1RSRVg7IH0KLQotYm9vbCBUcmFja0V4dGVuZHM6OlBhcnNlKEJveFJlYWRlciogcmVhZGVyKSB7Ci0gIFJDSEVDSyhyZWFkZXItPlJlYWRGdWxsQm94SGVhZGVyKCkgJiYKLSAgICAgICAgIHJlYWRlci0+UmVhZDQoJnRyYWNrX2lkKSAmJgotICAgICAgICAgcmVhZGVyLT5SZWFkNCgmZGVmYXVsdF9zYW1wbGVfZGVzY3JpcHRpb25faW5kZXgpICYmCi0gICAgICAgICByZWFkZXItPlJlYWQ0KCZkZWZhdWx0X3NhbXBsZV9kdXJhdGlvbikgJiYKLSAgICAgICAgIHJlYWRlci0+UmVhZDQoJmRlZmF1bHRfc2FtcGxlX3NpemUpICYmCi0gICAgICAgICByZWFkZXItPlJlYWQ0KCZkZWZhdWx0X3NhbXBsZV9mbGFncykpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotTW92aWVFeHRlbmRzOjpNb3ZpZUV4dGVuZHMoKSB7fQotTW92aWVFeHRlbmRzOjp+TW92aWVFeHRlbmRzKCkge30KLUZvdXJDQyBNb3ZpZUV4dGVuZHM6OkJveFR5cGUoKSBjb25zdCB7IHJldHVybiBGT1VSQ0NfTVZFWDsgfQotCi1ib29sIE1vdmllRXh0ZW5kczo6UGFyc2UoQm94UmVhZGVyKiByZWFkZXIpIHsKLSAgaGVhZGVyLmZyYWdtZW50X2R1cmF0aW9uID0gMDsKLSAgcmV0dXJuIHJlYWRlci0+U2NhbkNoaWxkcmVuKCkgJiYKLSAgICAgICAgIHJlYWRlci0+TWF5YmVSZWFkQ2hpbGQoJmhlYWRlcikgJiYKLSAgICAgICAgIHJlYWRlci0+UmVhZENoaWxkcmVuKCZ0cmFja3MpOwotfQotCi1Nb3ZpZTo6TW92aWUoKSA6IGZyYWdtZW50ZWQoZmFsc2UpIHt9Ci1Nb3ZpZTo6fk1vdmllKCkge30KLUZvdXJDQyBNb3ZpZTo6Qm94VHlwZSgpIGNvbnN0IHsgcmV0dXJuIEZPVVJDQ19NT09WOyB9Ci0KLWJvb2wgTW92aWU6OlBhcnNlKEJveFJlYWRlciogcmVhZGVyKSB7Ci0gIHJldHVybiByZWFkZXItPlNjYW5DaGlsZHJlbigpICYmCi0gICAgICAgICByZWFkZXItPlJlYWRDaGlsZCgmaGVhZGVyKSAmJgotICAgICAgICAgcmVhZGVyLT5SZWFkQ2hpbGRyZW4oJnRyYWNrcykgJiYKLSAgICAgICAgIC8vIE1lZGlhIFNvdXJjZSBzcGVjaWZpYzogJ212ZXgnIHJlcXVpcmVkCi0gICAgICAgICByZWFkZXItPlJlYWRDaGlsZCgmZXh0ZW5kcykgJiYKLSAgICAgICAgIHJlYWRlci0+TWF5YmVSZWFkQ2hpbGRyZW4oJnBzc2gpOwotfQotCi1UcmFja0ZyYWdtZW50RGVjb2RlVGltZTo6VHJhY2tGcmFnbWVudERlY29kZVRpbWUoKSA6IGRlY29kZV90aW1lKDApIHt9Ci1UcmFja0ZyYWdtZW50RGVjb2RlVGltZTo6flRyYWNrRnJhZ21lbnREZWNvZGVUaW1lKCkge30KLUZvdXJDQyBUcmFja0ZyYWdtZW50RGVjb2RlVGltZTo6Qm94VHlwZSgpIGNvbnN0IHsgcmV0dXJuIEZPVVJDQ19URkRUOyB9Ci0KLWJvb2wgVHJhY2tGcmFnbWVudERlY29kZVRpbWU6OlBhcnNlKEJveFJlYWRlciogcmVhZGVyKSB7Ci0gIFJDSEVDSyhyZWFkZXItPlJlYWRGdWxsQm94SGVhZGVyKCkpOwotICBpZiAocmVhZGVyLT52ZXJzaW9uKCkgPT0gMSkKLSAgICByZXR1cm4gcmVhZGVyLT5SZWFkOCgmZGVjb2RlX3RpbWUpOwotICBlbHNlCi0gICAgcmV0dXJuIHJlYWRlci0+UmVhZDRJbnRvOCgmZGVjb2RlX3RpbWUpOwotfQotCi1Nb3ZpZUZyYWdtZW50SGVhZGVyOjpNb3ZpZUZyYWdtZW50SGVhZGVyKCkgOiBzZXF1ZW5jZV9udW1iZXIoMCkge30KLU1vdmllRnJhZ21lbnRIZWFkZXI6On5Nb3ZpZUZyYWdtZW50SGVhZGVyKCkge30KLUZvdXJDQyBNb3ZpZUZyYWdtZW50SGVhZGVyOjpCb3hUeXBlKCkgY29uc3QgeyByZXR1cm4gRk9VUkNDX01GSEQ7IH0KLQotYm9vbCBNb3ZpZUZyYWdtZW50SGVhZGVyOjpQYXJzZShCb3hSZWFkZXIqIHJlYWRlcikgewotICByZXR1cm4gcmVhZGVyLT5Ta2lwQnl0ZXMoNCkgJiYgcmVhZGVyLT5SZWFkNCgmc2VxdWVuY2VfbnVtYmVyKTsKLX0KLQotVHJhY2tGcmFnbWVudEhlYWRlcjo6VHJhY2tGcmFnbWVudEhlYWRlcigpCi0gICAgOiB0cmFja19pZCgwKSwKLSAgICAgIHNhbXBsZV9kZXNjcmlwdGlvbl9pbmRleCgwKSwKLSAgICAgIGRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uKDApLAotICAgICAgZGVmYXVsdF9zYW1wbGVfc2l6ZSgwKSwKLSAgICAgIGRlZmF1bHRfc2FtcGxlX2ZsYWdzKDApLAotICAgICAgaGFzX2RlZmF1bHRfc2FtcGxlX2ZsYWdzKGZhbHNlKSB7fQotCi1UcmFja0ZyYWdtZW50SGVhZGVyOjp+VHJhY2tGcmFnbWVudEhlYWRlcigpIHt9Ci1Gb3VyQ0MgVHJhY2tGcmFnbWVudEhlYWRlcjo6Qm94VHlwZSgpIGNvbnN0IHsgcmV0dXJuIEZPVVJDQ19URkhEOyB9Ci0KLWJvb2wgVHJhY2tGcmFnbWVudEhlYWRlcjo6UGFyc2UoQm94UmVhZGVyKiByZWFkZXIpIHsKLSAgUkNIRUNLKHJlYWRlci0+UmVhZEZ1bGxCb3hIZWFkZXIoKSAmJiByZWFkZXItPlJlYWQ0KCZ0cmFja19pZCkpOwotCi0gIC8vIE1lZGlhIFNvdXJjZSBzcGVjaWZpYzogcmVqZWN0IHRyYWNrcyB0aGF0IHNldCAnYmFzZS1kYXRhLW9mZnNldC1wcmVzZW50Jy4KLSAgLy8gQWx0aG91Z2ggdGhlIE1lZGlhIFNvdXJjZSByZXF1aXJlcyB0aGF0ICdkZWZhdWx0LWJhc2UtaXMtbW9vZicgKDE0NDk2LTEyCi0gIC8vIEFtZW5kbWVudCAyKSBiZSBzZXQsIHdlIG9taXQgdGhpcyBjaGVjayBhcyBtYW55IG90aGVyd2lzZS12YWxpZCBmaWxlcyBpbgotICAvLyB0aGUgd2lsZCBkb24ndCBzZXQgaXQuCi0gIC8vCi0gIC8vICBSQ0hFQ0soKGZsYWdzICYgMHgwMjAwMDApICYmICEoZmxhZ3MgJiAweDEpKTsKLSAgUkNIRUNLKCEocmVhZGVyLT5mbGFncygpICYgMHgxKSk7Ci0KLSAgaWYgKHJlYWRlci0+ZmxhZ3MoKSAmIDB4MikgewotICAgIFJDSEVDSyhyZWFkZXItPlJlYWQ0KCZzYW1wbGVfZGVzY3JpcHRpb25faW5kZXgpKTsKLSAgfSBlbHNlIHsKLSAgICBzYW1wbGVfZGVzY3JpcHRpb25faW5kZXggPSAwOwotICB9Ci0KLSAgaWYgKHJlYWRlci0+ZmxhZ3MoKSAmIDB4OCkgewotICAgIFJDSEVDSyhyZWFkZXItPlJlYWQ0KCZkZWZhdWx0X3NhbXBsZV9kdXJhdGlvbikpOwotICB9IGVsc2UgewotICAgIGRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uID0gMDsKLSAgfQotCi0gIGlmIChyZWFkZXItPmZsYWdzKCkgJiAweDEwKSB7Ci0gICAgUkNIRUNLKHJlYWRlci0+UmVhZDQoJmRlZmF1bHRfc2FtcGxlX3NpemUpKTsKLSAgfSBlbHNlIHsKLSAgICBkZWZhdWx0X3NhbXBsZV9zaXplID0gMDsKLSAgfQotCi0gIGlmIChyZWFkZXItPmZsYWdzKCkgJiAweDIwKSB7Ci0gICAgUkNIRUNLKHJlYWRlci0+UmVhZDQoJmRlZmF1bHRfc2FtcGxlX2ZsYWdzKSk7Ci0gICAgaGFzX2RlZmF1bHRfc2FtcGxlX2ZsYWdzID0gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICBoYXNfZGVmYXVsdF9zYW1wbGVfZmxhZ3MgPSBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1UcmFja0ZyYWdtZW50UnVuOjpUcmFja0ZyYWdtZW50UnVuKCkKLSAgICA6IHNhbXBsZV9jb3VudCgwKSwgZGF0YV9vZmZzZXQoMCkge30KLVRyYWNrRnJhZ21lbnRSdW46On5UcmFja0ZyYWdtZW50UnVuKCkge30KLUZvdXJDQyBUcmFja0ZyYWdtZW50UnVuOjpCb3hUeXBlKCkgY29uc3QgeyByZXR1cm4gRk9VUkNDX1RSVU47IH0KLQotYm9vbCBUcmFja0ZyYWdtZW50UnVuOjpQYXJzZShCb3hSZWFkZXIqIHJlYWRlcikgewotICBSQ0hFQ0socmVhZGVyLT5SZWFkRnVsbEJveEhlYWRlcigpICYmCi0gICAgICAgICByZWFkZXItPlJlYWQ0KCZzYW1wbGVfY291bnQpKTsKLSAgY29uc3QgdWludDMyIGZsYWdzID0gcmVhZGVyLT5mbGFncygpOwotCi0gIGJvb2wgZGF0YV9vZmZzZXRfcHJlc2VudCA9IChmbGFncyAmIDB4MSkgIT0gMDsKLSAgYm9vbCBmaXJzdF9zYW1wbGVfZmxhZ3NfcHJlc2VudCA9IChmbGFncyAmIDB4NCkgIT0gMDsKLSAgYm9vbCBzYW1wbGVfZHVyYXRpb25fcHJlc2VudCA9IChmbGFncyAmIDB4MTAwKSAhPSAwOwotICBib29sIHNhbXBsZV9zaXplX3ByZXNlbnQgPSAoZmxhZ3MgJiAweDIwMCkgIT0gMDsKLSAgYm9vbCBzYW1wbGVfZmxhZ3NfcHJlc2VudCA9IChmbGFncyAmIDB4NDAwKSAhPSAwOwotICBib29sIHNhbXBsZV9jb21wb3NpdGlvbl90aW1lX29mZnNldHNfcHJlc2VudCA9IChmbGFncyAmIDB4ODAwKSAhPSAwOwotCi0gIGlmIChkYXRhX29mZnNldF9wcmVzZW50KSB7Ci0gICAgUkNIRUNLKHJlYWRlci0+UmVhZDQoJmRhdGFfb2Zmc2V0KSk7Ci0gIH0gZWxzZSB7Ci0gICAgZGF0YV9vZmZzZXQgPSAwOwotICB9Ci0KLSAgdWludDMyIGZpcnN0X3NhbXBsZV9mbGFnczsKLSAgaWYgKGZpcnN0X3NhbXBsZV9mbGFnc19wcmVzZW50KQotICAgIFJDSEVDSyhyZWFkZXItPlJlYWQ0KCZmaXJzdF9zYW1wbGVfZmxhZ3MpKTsKLQotICBpbnQgZmllbGRzID0gc2FtcGxlX2R1cmF0aW9uX3ByZXNlbnQgKyBzYW1wbGVfc2l6ZV9wcmVzZW50ICsKLSAgICAgIHNhbXBsZV9mbGFnc19wcmVzZW50ICsgc2FtcGxlX2NvbXBvc2l0aW9uX3RpbWVfb2Zmc2V0c19wcmVzZW50OwotICBSQ0hFQ0socmVhZGVyLT5IYXNCeXRlcyhmaWVsZHMgKiBzYW1wbGVfY291bnQpKTsKLQotICBpZiAoc2FtcGxlX2R1cmF0aW9uX3ByZXNlbnQpCi0gICAgc2FtcGxlX2R1cmF0aW9ucy5yZXNpemUoc2FtcGxlX2NvdW50KTsKLSAgaWYgKHNhbXBsZV9zaXplX3ByZXNlbnQpCi0gICAgc2FtcGxlX3NpemVzLnJlc2l6ZShzYW1wbGVfY291bnQpOwotICBpZiAoc2FtcGxlX2ZsYWdzX3ByZXNlbnQpCi0gICAgc2FtcGxlX2ZsYWdzLnJlc2l6ZShzYW1wbGVfY291bnQpOwotICBpZiAoc2FtcGxlX2NvbXBvc2l0aW9uX3RpbWVfb2Zmc2V0c19wcmVzZW50KQotICAgIHNhbXBsZV9jb21wb3NpdGlvbl90aW1lX29mZnNldHMucmVzaXplKHNhbXBsZV9jb3VudCk7Ci0KLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBzYW1wbGVfY291bnQ7ICsraSkgewotICAgIGlmIChzYW1wbGVfZHVyYXRpb25fcHJlc2VudCkKLSAgICAgIFJDSEVDSyhyZWFkZXItPlJlYWQ0KCZzYW1wbGVfZHVyYXRpb25zW2ldKSk7Ci0gICAgaWYgKHNhbXBsZV9zaXplX3ByZXNlbnQpCi0gICAgICBSQ0hFQ0socmVhZGVyLT5SZWFkNCgmc2FtcGxlX3NpemVzW2ldKSk7Ci0gICAgaWYgKHNhbXBsZV9mbGFnc19wcmVzZW50KQotICAgICAgUkNIRUNLKHJlYWRlci0+UmVhZDQoJnNhbXBsZV9mbGFnc1tpXSkpOwotICAgIGlmIChzYW1wbGVfY29tcG9zaXRpb25fdGltZV9vZmZzZXRzX3ByZXNlbnQpCi0gICAgICBSQ0hFQ0socmVhZGVyLT5SZWFkNHMoJnNhbXBsZV9jb21wb3NpdGlvbl90aW1lX29mZnNldHNbaV0pKTsKLSAgfQotCi0gIGlmIChmaXJzdF9zYW1wbGVfZmxhZ3NfcHJlc2VudCkgewotICAgIGlmIChzYW1wbGVfZmxhZ3Muc2l6ZSgpID09IDApIHsKLSAgICAgIHNhbXBsZV9mbGFncy5wdXNoX2JhY2soZmlyc3Rfc2FtcGxlX2ZsYWdzKTsKLSAgICB9IGVsc2UgewotICAgICAgc2FtcGxlX2ZsYWdzWzBdID0gZmlyc3Rfc2FtcGxlX2ZsYWdzOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotVHJhY2tGcmFnbWVudDo6VHJhY2tGcmFnbWVudCgpIHt9Ci1UcmFja0ZyYWdtZW50Ojp+VHJhY2tGcmFnbWVudCgpIHt9Ci1Gb3VyQ0MgVHJhY2tGcmFnbWVudDo6Qm94VHlwZSgpIGNvbnN0IHsgcmV0dXJuIEZPVVJDQ19UUkFGOyB9Ci0KLWJvb2wgVHJhY2tGcmFnbWVudDo6UGFyc2UoQm94UmVhZGVyKiByZWFkZXIpIHsKLSAgcmV0dXJuIHJlYWRlci0+U2NhbkNoaWxkcmVuKCkgJiYKLSAgICAgICAgIHJlYWRlci0+UmVhZENoaWxkKCZoZWFkZXIpICYmCi0gICAgICAgICAvLyBNZWRpYSBTb3VyY2Ugc3BlY2lmaWM6ICd0ZmR0JyByZXF1aXJlZAotICAgICAgICAgcmVhZGVyLT5SZWFkQ2hpbGQoJmRlY29kZV90aW1lKSAmJgotICAgICAgICAgcmVhZGVyLT5NYXliZVJlYWRDaGlsZHJlbigmcnVucykgJiYKLSAgICAgICAgIHJlYWRlci0+TWF5YmVSZWFkQ2hpbGQoJmF1eGlsaWFyeV9vZmZzZXQpICYmCi0gICAgICAgICByZWFkZXItPk1heWJlUmVhZENoaWxkKCZhdXhpbGlhcnlfc2l6ZSk7Ci19Ci0KLU1vdmllRnJhZ21lbnQ6Ok1vdmllRnJhZ21lbnQoKSB7fQotTW92aWVGcmFnbWVudDo6fk1vdmllRnJhZ21lbnQoKSB7fQotRm91ckNDIE1vdmllRnJhZ21lbnQ6OkJveFR5cGUoKSBjb25zdCB7IHJldHVybiBGT1VSQ0NfTU9PRjsgfQotCi1ib29sIE1vdmllRnJhZ21lbnQ6OlBhcnNlKEJveFJlYWRlciogcmVhZGVyKSB7Ci0gIFJDSEVDSyhyZWFkZXItPlNjYW5DaGlsZHJlbigpICYmCi0gICAgICAgICByZWFkZXItPlJlYWRDaGlsZCgmaGVhZGVyKSAmJgotICAgICAgICAgcmVhZGVyLT5SZWFkQ2hpbGRyZW4oJnRyYWNrcykgJiYKLSAgICAgICAgIHJlYWRlci0+TWF5YmVSZWFkQ2hpbGRyZW4oJnBzc2gpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtcDQKLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL21wNC9ib3hfZGVmaW5pdGlvbnMuaCBiL3NyYy9tZWRpYS9tcDQvYm94X2RlZmluaXRpb25zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYjhjNGYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL21wNC9ib3hfZGVmaW5pdGlvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX01QNF9CT1hfREVGSU5JVElPTlNfSF8KLSNkZWZpbmUgTUVESUFfTVA0X0JPWF9ERUZJTklUSU9OU19IXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgImJhc2UvY29tcGlsZXJfc3BlY2lmaWMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotI2luY2x1ZGUgIm1lZGlhL21wNC9hYWMuaCIKLSNpbmNsdWRlICJtZWRpYS9tcDQvYXZjLmgiCi0jaW5jbHVkZSAibWVkaWEvbXA0L2JveF9yZWFkZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9tcDQvZm91cmNjcy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotbmFtZXNwYWNlIG1wNCB7Ci0KLWVudW0gVHJhY2tUeXBlIHsKLSAga0ludmFsaWQgPSAwLAotICBrVmlkZW8sCi0gIGtBdWRpbywKLSAga0hpbnQKLX07Ci0KLSNkZWZpbmUgREVDTEFSRV9CT1hfTUVUSE9EUyhUKSBcCi0gIFQoKTsgXAotICB2aXJ0dWFsIH5UKCk7IFwKLSAgdmlydHVhbCBib29sIFBhcnNlKEJveFJlYWRlciogcmVhZGVyKSBPVkVSUklERTsgXAotICB2aXJ0dWFsIEZvdXJDQyBCb3hUeXBlKCkgY29uc3QgT1ZFUlJJREU7IFwKLQotc3RydWN0IE1FRElBX0VYUE9SVCBGaWxlVHlwZSA6IEJveCB7Ci0gIERFQ0xBUkVfQk9YX01FVEhPRFMoRmlsZVR5cGUpOwotCi0gIEZvdXJDQyBtYWpvcl9icmFuZDsKLSAgdWludDMyIG1pbm9yX3ZlcnNpb247Ci19OwotCi1zdHJ1Y3QgTUVESUFfRVhQT1JUIFByb3RlY3Rpb25TeXN0ZW1TcGVjaWZpY0hlYWRlciA6IEJveCB7Ci0gIERFQ0xBUkVfQk9YX01FVEhPRFMoUHJvdGVjdGlvblN5c3RlbVNwZWNpZmljSGVhZGVyKTsKLQotICBzdGQ6OnZlY3Rvcjx1aW50OD4gc3lzdGVtX2lkOwotICBzdGQ6OnZlY3Rvcjx1aW50OD4gcmF3X2JveDsKLX07Ci0KLXN0cnVjdCBNRURJQV9FWFBPUlQgU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25PZmZzZXQgOiBCb3ggewotICBERUNMQVJFX0JPWF9NRVRIT0RTKFNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uT2Zmc2V0KTsKLQotICBzdGQ6OnZlY3Rvcjx1aW50NjQ+IG9mZnNldHM7Ci19OwotCi1zdHJ1Y3QgTUVESUFfRVhQT1JUIFNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uU2l6ZSA6IEJveCB7Ci0gIERFQ0xBUkVfQk9YX01FVEhPRFMoU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25TaXplKTsKLQotICB1aW50OCBkZWZhdWx0X3NhbXBsZV9pbmZvX3NpemU7Ci0gIHVpbnQzMiBzYW1wbGVfY291bnQ7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4PiBzYW1wbGVfaW5mb19zaXplczsKLX07Ci0KLXN0cnVjdCBNRURJQV9FWFBPUlQgT3JpZ2luYWxGb3JtYXQgOiBCb3ggewotICBERUNMQVJFX0JPWF9NRVRIT0RTKE9yaWdpbmFsRm9ybWF0KTsKLQotICBGb3VyQ0MgZm9ybWF0OwotfTsKLQotc3RydWN0IE1FRElBX0VYUE9SVCBTY2hlbWVUeXBlIDogQm94IHsKLSAgREVDTEFSRV9CT1hfTUVUSE9EUyhTY2hlbWVUeXBlKTsKLQotICBGb3VyQ0MgdHlwZTsKLSAgdWludDMyIHZlcnNpb247Ci19OwotCi1zdHJ1Y3QgTUVESUFfRVhQT1JUIFRyYWNrRW5jcnlwdGlvbiA6IEJveCB7Ci0gIERFQ0xBUkVfQk9YX01FVEhPRFMoVHJhY2tFbmNyeXB0aW9uKTsKLQotICAvLyBOb3RlOiB0aGlzIGRlZmluaXRpb24gaXMgc3BlY2lmaWMgdG8gdGhlIENFTkMgcHJvdGVjdGlvbiB0eXBlLgotICBib29sIGlzX2VuY3J5cHRlZDsKLSAgdWludDggZGVmYXVsdF9pdl9zaXplOwotICBzdGQ6OnZlY3Rvcjx1aW50OD4gZGVmYXVsdF9raWQ7Ci19OwotCi1zdHJ1Y3QgTUVESUFfRVhQT1JUIFNjaGVtZUluZm8gOiBCb3ggewotICBERUNMQVJFX0JPWF9NRVRIT0RTKFNjaGVtZUluZm8pOwotCi0gIFRyYWNrRW5jcnlwdGlvbiB0cmFja19lbmNyeXB0aW9uOwotfTsKLQotc3RydWN0IE1FRElBX0VYUE9SVCBQcm90ZWN0aW9uU2NoZW1lSW5mbyA6IEJveCB7Ci0gIERFQ0xBUkVfQk9YX01FVEhPRFMoUHJvdGVjdGlvblNjaGVtZUluZm8pOwotCi0gIE9yaWdpbmFsRm9ybWF0IGZvcm1hdDsKLSAgU2NoZW1lVHlwZSB0eXBlOwotICBTY2hlbWVJbmZvIGluZm87Ci19OwotCi1zdHJ1Y3QgTUVESUFfRVhQT1JUIE1vdmllSGVhZGVyIDogQm94IHsKLSAgREVDTEFSRV9CT1hfTUVUSE9EUyhNb3ZpZUhlYWRlcik7Ci0KLSAgdWludDY0IGNyZWF0aW9uX3RpbWU7Ci0gIHVpbnQ2NCBtb2RpZmljYXRpb25fdGltZTsKLSAgdWludDMyIHRpbWVzY2FsZTsKLSAgdWludDY0IGR1cmF0aW9uOwotICBpbnQzMiByYXRlOwotICBpbnQxNiB2b2x1bWU7Ci0gIHVpbnQzMiBuZXh0X3RyYWNrX2lkOwotfTsKLQotc3RydWN0IE1FRElBX0VYUE9SVCBUcmFja0hlYWRlciA6IEJveCB7Ci0gIERFQ0xBUkVfQk9YX01FVEhPRFMoVHJhY2tIZWFkZXIpOwotCi0gIHVpbnQ2NCBjcmVhdGlvbl90aW1lOwotICB1aW50NjQgbW9kaWZpY2F0aW9uX3RpbWU7Ci0gIHVpbnQzMiB0cmFja19pZDsKLSAgdWludDY0IGR1cmF0aW9uOwotICBpbnQxNiBsYXllcjsKLSAgaW50MTYgYWx0ZXJuYXRlX2dyb3VwOwotICBpbnQxNiB2b2x1bWU7Ci0gIHVpbnQzMiB3aWR0aDsKLSAgdWludDMyIGhlaWdodDsKLX07Ci0KLXN0cnVjdCBNRURJQV9FWFBPUlQgRWRpdExpc3RFbnRyeSB7Ci0gIHVpbnQ2NCBzZWdtZW50X2R1cmF0aW9uOwotICBpbnQ2NCBtZWRpYV90aW1lOwotICBpbnQxNiBtZWRpYV9yYXRlX2ludGVnZXI7Ci0gIGludDE2IG1lZGlhX3JhdGVfZnJhY3Rpb247Ci19OwotCi1zdHJ1Y3QgTUVESUFfRVhQT1JUIEVkaXRMaXN0IDogQm94IHsKLSAgREVDTEFSRV9CT1hfTUVUSE9EUyhFZGl0TGlzdCk7Ci0KLSAgc3RkOjp2ZWN0b3I8RWRpdExpc3RFbnRyeT4gZWRpdHM7Ci19OwotCi1zdHJ1Y3QgTUVESUFfRVhQT1JUIEVkaXQgOiBCb3ggewotICBERUNMQVJFX0JPWF9NRVRIT0RTKEVkaXQpOwotCi0gIEVkaXRMaXN0IGxpc3Q7Ci19OwotCi1zdHJ1Y3QgTUVESUFfRVhQT1JUIEhhbmRsZXJSZWZlcmVuY2UgOiBCb3ggewotICBERUNMQVJFX0JPWF9NRVRIT0RTKEhhbmRsZXJSZWZlcmVuY2UpOwotCi0gIFRyYWNrVHlwZSB0eXBlOwotfTsKLQotc3RydWN0IE1FRElBX0VYUE9SVCBBVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZCA6IEJveCB7Ci0gIERFQ0xBUkVfQk9YX01FVEhPRFMoQVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQpOwotCi0gIHVpbnQ4IHZlcnNpb247Ci0gIHVpbnQ4IHByb2ZpbGVfaW5kaWNhdGlvbjsKLSAgdWludDggcHJvZmlsZV9jb21wYXRpYmlsaXR5OwotICB1aW50OCBhdmNfbGV2ZWw7Ci0gIHVpbnQ4IGxlbmd0aF9zaXplOwotCi0gIHR5cGVkZWYgc3RkOjp2ZWN0b3I8dWludDg+IFNQUzsKLSAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjx1aW50OD4gUFBTOwotCi0gIHN0ZDo6dmVjdG9yPFNQUz4gc3BzX2xpc3Q7Ci0gIHN0ZDo6dmVjdG9yPFBQUz4gcHBzX2xpc3Q7Ci19OwotCi1zdHJ1Y3QgTUVESUFfRVhQT1JUIFBpeGVsQXNwZWN0UmF0aW9Cb3ggOiBCb3ggewotICBERUNMQVJFX0JPWF9NRVRIT0RTKFBpeGVsQXNwZWN0UmF0aW9Cb3gpOwotCi0gIHVpbnQzMiBoX3NwYWNpbmc7Ci0gIHVpbnQzMiB2X3NwYWNpbmc7Ci19OwotCi1zdHJ1Y3QgTUVESUFfRVhQT1JUIFZpZGVvU2FtcGxlRW50cnkgOiBCb3ggewotICBERUNMQVJFX0JPWF9NRVRIT0RTKFZpZGVvU2FtcGxlRW50cnkpOwotCi0gIEZvdXJDQyBmb3JtYXQ7Ci0gIHVpbnQxNiBkYXRhX3JlZmVyZW5jZV9pbmRleDsKLSAgdWludDE2IHdpZHRoOwotICB1aW50MTYgaGVpZ2h0OwotCi0gIFBpeGVsQXNwZWN0UmF0aW9Cb3ggcGl4ZWxfYXNwZWN0OwotICBQcm90ZWN0aW9uU2NoZW1lSW5mbyBzaW5mOwotCi0gIC8vIEN1cnJlbnRseSBleHBlY3RlZCB0byBiZSBwcmVzZW50IHJlZ2FyZGxlc3Mgb2YgZm9ybWF0LgotICBBVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZCBhdmNjOwotfTsKLQotc3RydWN0IE1FRElBX0VYUE9SVCBFbGVtZW50YXJ5U3RyZWFtRGVzY3JpcHRvciA6IEJveCB7Ci0gIERFQ0xBUkVfQk9YX01FVEhPRFMoRWxlbWVudGFyeVN0cmVhbURlc2NyaXB0b3IpOwotCi0gIHVpbnQ4IG9iamVjdF90eXBlOwotICBBQUMgYWFjOwotfTsKLQotc3RydWN0IE1FRElBX0VYUE9SVCBBdWRpb1NhbXBsZUVudHJ5IDogQm94IHsKLSAgREVDTEFSRV9CT1hfTUVUSE9EUyhBdWRpb1NhbXBsZUVudHJ5KTsKLQotICBGb3VyQ0MgZm9ybWF0OwotICB1aW50MTYgZGF0YV9yZWZlcmVuY2VfaW5kZXg7Ci0gIHVpbnQxNiBjaGFubmVsY291bnQ7Ci0gIHVpbnQxNiBzYW1wbGVzaXplOwotICB1aW50MzIgc2FtcGxlcmF0ZTsKLQotICBQcm90ZWN0aW9uU2NoZW1lSW5mbyBzaW5mOwotICBFbGVtZW50YXJ5U3RyZWFtRGVzY3JpcHRvciBlc2RzOwotfTsKLQotc3RydWN0IE1FRElBX0VYUE9SVCBTYW1wbGVEZXNjcmlwdGlvbiA6IEJveCB7Ci0gIERFQ0xBUkVfQk9YX01FVEhPRFMoU2FtcGxlRGVzY3JpcHRpb24pOwotCi0gIFRyYWNrVHlwZSB0eXBlOwotICBzdGQ6OnZlY3RvcjxWaWRlb1NhbXBsZUVudHJ5PiB2aWRlb19lbnRyaWVzOwotICBzdGQ6OnZlY3RvcjxBdWRpb1NhbXBsZUVudHJ5PiBhdWRpb19lbnRyaWVzOwotfTsKLQotc3RydWN0IE1FRElBX0VYUE9SVCBTYW1wbGVUYWJsZSA6IEJveCB7Ci0gIERFQ0xBUkVfQk9YX01FVEhPRFMoU2FtcGxlVGFibGUpOwotCi0gIC8vIE1lZGlhIFNvdXJjZSBzcGVjaWZpYzogd2UgaWdub3JlIG1hbnkgb2YgdGhlIHN1Yi1ib3hlcyBpbiB0aGlzIGJveCwKLSAgLy8gaW5jbHVkaW5nIHNvbWUgdGhhdCBhcmUgcmVxdWlyZWQgdG8gYmUgcHJlc2VudCBpbiB0aGUgQk1GRiBzcGVjLiBUaGlzCi0gIC8vIGluY2x1ZGVzIHRoZSAnc3R0cycsICdzdHNjJywgYW5kICdzdGNvJyBib3hlcywgd2hpY2ggbXVzdCBjb250YWluIG5vCi0gIC8vIHNhbXBsZXMgaW4gb3JkZXIgdG8gYmUgY29tcGxpYW50IGZpbGVzLgotICBTYW1wbGVEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbjsKLX07Ci0KLXN0cnVjdCBNRURJQV9FWFBPUlQgTWVkaWFIZWFkZXIgOiBCb3ggewotICBERUNMQVJFX0JPWF9NRVRIT0RTKE1lZGlhSGVhZGVyKTsKLQotICB1aW50NjQgY3JlYXRpb25fdGltZTsKLSAgdWludDY0IG1vZGlmaWNhdGlvbl90aW1lOwotICB1aW50MzIgdGltZXNjYWxlOwotICB1aW50NjQgZHVyYXRpb247Ci19OwotCi1zdHJ1Y3QgTUVESUFfRVhQT1JUIE1lZGlhSW5mb3JtYXRpb24gOiBCb3ggewotICBERUNMQVJFX0JPWF9NRVRIT0RTKE1lZGlhSW5mb3JtYXRpb24pOwotCi0gIFNhbXBsZVRhYmxlIHNhbXBsZV90YWJsZTsKLX07Ci0KLXN0cnVjdCBNRURJQV9FWFBPUlQgTWVkaWEgOiBCb3ggewotICBERUNMQVJFX0JPWF9NRVRIT0RTKE1lZGlhKTsKLQotICBNZWRpYUhlYWRlciBoZWFkZXI7Ci0gIEhhbmRsZXJSZWZlcmVuY2UgaGFuZGxlcjsKLSAgTWVkaWFJbmZvcm1hdGlvbiBpbmZvcm1hdGlvbjsKLX07Ci0KLXN0cnVjdCBNRURJQV9FWFBPUlQgVHJhY2sgOiBCb3ggewotICBERUNMQVJFX0JPWF9NRVRIT0RTKFRyYWNrKTsKLQotICBUcmFja0hlYWRlciBoZWFkZXI7Ci0gIE1lZGlhIG1lZGlhOwotICBFZGl0IGVkaXQ7Ci19OwotCi1zdHJ1Y3QgTUVESUFfRVhQT1JUIE1vdmllRXh0ZW5kc0hlYWRlciA6IEJveCB7Ci0gIERFQ0xBUkVfQk9YX01FVEhPRFMoTW92aWVFeHRlbmRzSGVhZGVyKTsKLQotICB1aW50NjQgZnJhZ21lbnRfZHVyYXRpb247Ci19OwotCi1zdHJ1Y3QgTUVESUFfRVhQT1JUIFRyYWNrRXh0ZW5kcyA6IEJveCB7Ci0gIERFQ0xBUkVfQk9YX01FVEhPRFMoVHJhY2tFeHRlbmRzKTsKLQotICB1aW50MzIgdHJhY2tfaWQ7Ci0gIHVpbnQzMiBkZWZhdWx0X3NhbXBsZV9kZXNjcmlwdGlvbl9pbmRleDsKLSAgdWludDMyIGRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uOwotICB1aW50MzIgZGVmYXVsdF9zYW1wbGVfc2l6ZTsKLSAgdWludDMyIGRlZmF1bHRfc2FtcGxlX2ZsYWdzOwotfTsKLQotc3RydWN0IE1FRElBX0VYUE9SVCBNb3ZpZUV4dGVuZHMgOiBCb3ggewotICBERUNMQVJFX0JPWF9NRVRIT0RTKE1vdmllRXh0ZW5kcyk7Ci0KLSAgTW92aWVFeHRlbmRzSGVhZGVyIGhlYWRlcjsKLSAgc3RkOjp2ZWN0b3I8VHJhY2tFeHRlbmRzPiB0cmFja3M7Ci19OwotCi1zdHJ1Y3QgTUVESUFfRVhQT1JUIE1vdmllIDogQm94IHsKLSAgREVDTEFSRV9CT1hfTUVUSE9EUyhNb3ZpZSk7Ci0KLSAgYm9vbCBmcmFnbWVudGVkOwotICBNb3ZpZUhlYWRlciBoZWFkZXI7Ci0gIE1vdmllRXh0ZW5kcyBleHRlbmRzOwotICBzdGQ6OnZlY3RvcjxUcmFjaz4gdHJhY2tzOwotICBzdGQ6OnZlY3RvcjxQcm90ZWN0aW9uU3lzdGVtU3BlY2lmaWNIZWFkZXI+IHBzc2g7Ci19OwotCi1zdHJ1Y3QgTUVESUFfRVhQT1JUIFRyYWNrRnJhZ21lbnREZWNvZGVUaW1lIDogQm94IHsKLSAgREVDTEFSRV9CT1hfTUVUSE9EUyhUcmFja0ZyYWdtZW50RGVjb2RlVGltZSk7Ci0KLSAgdWludDY0IGRlY29kZV90aW1lOwotfTsKLQotc3RydWN0IE1FRElBX0VYUE9SVCBNb3ZpZUZyYWdtZW50SGVhZGVyIDogQm94IHsKLSAgREVDTEFSRV9CT1hfTUVUSE9EUyhNb3ZpZUZyYWdtZW50SGVhZGVyKTsKLQotICB1aW50MzIgc2VxdWVuY2VfbnVtYmVyOwotfTsKLQotc3RydWN0IE1FRElBX0VYUE9SVCBUcmFja0ZyYWdtZW50SGVhZGVyIDogQm94IHsKLSAgREVDTEFSRV9CT1hfTUVUSE9EUyhUcmFja0ZyYWdtZW50SGVhZGVyKTsKLQotICB1aW50MzIgdHJhY2tfaWQ7Ci0KLSAgdWludDMyIHNhbXBsZV9kZXNjcmlwdGlvbl9pbmRleDsKLSAgdWludDMyIGRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uOwotICB1aW50MzIgZGVmYXVsdF9zYW1wbGVfc2l6ZTsKLSAgdWludDMyIGRlZmF1bHRfc2FtcGxlX2ZsYWdzOwotCi0gIC8vIEFzICdmbGFncycgbWlnaHQgYmUgYWxsIHplcm8sIHdlIGNhbm5vdCB1c2UgemVyb25lc3MgYWxvbmUgdG8gaWRlbnRpZnkKLSAgLy8gd2hlbiBkZWZhdWx0X3NhbXBsZV9mbGFncyB3YXNuJ3Qgc3BlY2lmaWVkLCB1bmxpa2UgdGhlIG90aGVyIHZhbHVlcy4KLSAgYm9vbCBoYXNfZGVmYXVsdF9zYW1wbGVfZmxhZ3M7Ci19OwotCi1zdHJ1Y3QgTUVESUFfRVhQT1JUIFRyYWNrRnJhZ21lbnRSdW4gOiBCb3ggewotICBERUNMQVJFX0JPWF9NRVRIT0RTKFRyYWNrRnJhZ21lbnRSdW4pOwotCi0gIHVpbnQzMiBzYW1wbGVfY291bnQ7Ci0gIHVpbnQzMiBkYXRhX29mZnNldDsKLSAgc3RkOjp2ZWN0b3I8dWludDMyPiBzYW1wbGVfZmxhZ3M7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQzMj4gc2FtcGxlX3NpemVzOwotICBzdGQ6OnZlY3Rvcjx1aW50MzI+IHNhbXBsZV9kdXJhdGlvbnM7Ci0gIHN0ZDo6dmVjdG9yPGludDMyPiBzYW1wbGVfY29tcG9zaXRpb25fdGltZV9vZmZzZXRzOwotfTsKLQotc3RydWN0IE1FRElBX0VYUE9SVCBUcmFja0ZyYWdtZW50IDogQm94IHsKLSAgREVDTEFSRV9CT1hfTUVUSE9EUyhUcmFja0ZyYWdtZW50KTsKLQotICBUcmFja0ZyYWdtZW50SGVhZGVyIGhlYWRlcjsKLSAgc3RkOjp2ZWN0b3I8VHJhY2tGcmFnbWVudFJ1bj4gcnVuczsKLSAgVHJhY2tGcmFnbWVudERlY29kZVRpbWUgZGVjb2RlX3RpbWU7Ci0gIFNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uT2Zmc2V0IGF1eGlsaWFyeV9vZmZzZXQ7Ci0gIFNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uU2l6ZSBhdXhpbGlhcnlfc2l6ZTsKLX07Ci0KLXN0cnVjdCBNRURJQV9FWFBPUlQgTW92aWVGcmFnbWVudCA6IEJveCB7Ci0gIERFQ0xBUkVfQk9YX01FVEhPRFMoTW92aWVGcmFnbWVudCk7Ci0KLSAgTW92aWVGcmFnbWVudEhlYWRlciBoZWFkZXI7Ci0gIHN0ZDo6dmVjdG9yPFRyYWNrRnJhZ21lbnQ+IHRyYWNrczsKLSAgc3RkOjp2ZWN0b3I8UHJvdGVjdGlvblN5c3RlbVNwZWNpZmljSGVhZGVyPiBwc3NoOwotfTsKLQotI3VuZGVmIERFQ0xBUkVfQk9YCi0KLX0gIC8vIG5hbWVzcGFjZSBtcDQKLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX01QNF9CT1hfREVGSU5JVElPTlNfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9tcDQvYm94X3JlYWRlci5jYyBiL3NyYy9tZWRpYS9tcDQvYm94X3JlYWRlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFkOTNhMC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvbXA0L2JveF9yZWFkZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL21wNC9ib3hfcmVhZGVyLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHNldD4KLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJtZWRpYS9tcDQvYm94X2RlZmluaXRpb25zLmgiCi0jaW5jbHVkZSAibWVkaWEvbXA0L3JjaGVjay5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotbmFtZXNwYWNlIG1wNCB7Ci0KLUJveDo6fkJveCgpIHt9Ci0KLWJvb2wgQnVmZmVyUmVhZGVyOjpSZWFkMSh1aW50OCogdikgewotICBSQ0hFQ0soSGFzQnl0ZXMoMSkpOwotICAqdiA9IGJ1Zl9bcG9zXysrXTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIEludGVybmFsIGltcGxlbWVudGF0aW9uIG9mIG11bHRpLWJ5dGUgcmVhZHMKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IGJvb2wgQnVmZmVyUmVhZGVyOjpSZWFkKFQqIHYpIHsKLSAgUkNIRUNLKEhhc0J5dGVzKHNpemVvZihUKSkpOwotCi0gIFQgdG1wID0gMDsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YoVCk7IGkrKykgewotICAgIHRtcCA8PD0gODsKLSAgICB0bXAgKz0gYnVmX1twb3NfKytdOwotICB9Ci0gICp2ID0gdG1wOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBCdWZmZXJSZWFkZXI6OlJlYWQyKHVpbnQxNiogdikgeyByZXR1cm4gUmVhZCh2KTsgfQotYm9vbCBCdWZmZXJSZWFkZXI6OlJlYWQycyhpbnQxNiogdikgeyByZXR1cm4gUmVhZCh2KTsgfQotYm9vbCBCdWZmZXJSZWFkZXI6OlJlYWQ0KHVpbnQzMiogdikgeyByZXR1cm4gUmVhZCh2KTsgfQotYm9vbCBCdWZmZXJSZWFkZXI6OlJlYWQ0cyhpbnQzMiogdikgeyByZXR1cm4gUmVhZCh2KTsgfQotYm9vbCBCdWZmZXJSZWFkZXI6OlJlYWQ4KHVpbnQ2NCogdikgeyByZXR1cm4gUmVhZCh2KTsgfQotYm9vbCBCdWZmZXJSZWFkZXI6OlJlYWQ4cyhpbnQ2NCogdikgeyByZXR1cm4gUmVhZCh2KTsgfQotCi1ib29sIEJ1ZmZlclJlYWRlcjo6UmVhZEZvdXJDQyhGb3VyQ0MqIHYpIHsKLSAgcmV0dXJuIFJlYWQ0KHJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyKj4odikpOwotfQotCi1ib29sIEJ1ZmZlclJlYWRlcjo6UmVhZFZlYyhzdGQ6OnZlY3Rvcjx1aW50OD4qIHZlYywgaW50IGNvdW50KSB7Ci0gIFJDSEVDSyhIYXNCeXRlcyhjb3VudCkpOwotICB2ZWMtPmNsZWFyKCk7Ci0gIHZlYy0+aW5zZXJ0KHZlYy0+ZW5kKCksIGJ1Zl8gKyBwb3NfLCBidWZfICsgcG9zXyArIGNvdW50KTsKLSAgcG9zXyArPSBjb3VudDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQnVmZmVyUmVhZGVyOjpTa2lwQnl0ZXMoaW50IGJ5dGVzKSB7Ci0gIFJDSEVDSyhIYXNCeXRlcyhieXRlcykpOwotICBwb3NfICs9IGJ5dGVzOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBCdWZmZXJSZWFkZXI6OlJlYWQ0SW50bzgodWludDY0KiB2KSB7Ci0gIHVpbnQzMiB0bXA7Ci0gIFJDSEVDSyhSZWFkNCgmdG1wKSk7Ci0gICp2ID0gdG1wOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBCdWZmZXJSZWFkZXI6OlJlYWQ0c0ludG84cyhpbnQ2NCogdikgewotICAvLyBCZXdhcmUgb2YgdGhlIG5lZWQgZm9yIHNpZ24gZXh0ZW5zaW9uLgotICBpbnQzMiB0bXA7Ci0gIFJDSEVDSyhSZWFkNHMoJnRtcCkpOwotICAqdiA9IHRtcDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotQm94UmVhZGVyOjpCb3hSZWFkZXIoY29uc3QgdWludDgqIGJ1ZiwgY29uc3QgaW50IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2dDQiYgbG9nX2NiKQotICAgIDogQnVmZmVyUmVhZGVyKGJ1Ziwgc2l6ZSksCi0gICAgICBsb2dfY2JfKGxvZ19jYiksCi0gICAgICB0eXBlXyhGT1VSQ0NfTlVMTCksCi0gICAgICB2ZXJzaW9uXygwKSwKLSAgICAgIGZsYWdzXygwKSwKLSAgICAgIHNjYW5uZWRfKGZhbHNlKSB7Ci19Ci0KLUJveFJlYWRlcjo6fkJveFJlYWRlcigpIHsKLSAgaWYgKHNjYW5uZWRfICYmICFjaGlsZHJlbl8uZW1wdHkoKSkgewotICAgIGZvciAoQ2hpbGRNYXA6Oml0ZXJhdG9yIGl0ciA9IGNoaWxkcmVuXy5iZWdpbigpOwotICAgICAgICAgaXRyICE9IGNoaWxkcmVuXy5lbmQoKTsgKytpdHIpIHsKLSAgICAgIERWTE9HKDEpIDw8ICJTa2lwcGluZyB1bmtub3duIGJveDogIiA8PCBGb3VyQ0NUb1N0cmluZyhpdHItPmZpcnN0KTsKLSAgICB9Ci0gIH0KLX0KLQotLy8gc3RhdGljCi1Cb3hSZWFkZXIqIEJveFJlYWRlcjo6UmVhZFRvcExldmVsQm94KGNvbnN0IHVpbnQ4KiBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBidWZfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9nQ0ImIGxvZ19jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogZXJyKSB7Ci0gIHNjb3BlZF9wdHI8Qm94UmVhZGVyPiByZWFkZXIobmV3IEJveFJlYWRlcihidWYsIGJ1Zl9zaXplLCBsb2dfY2IpKTsKLSAgaWYgKCFyZWFkZXItPlJlYWRIZWFkZXIoZXJyKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoIUlzVmFsaWRUb3BMZXZlbEJveChyZWFkZXItPnR5cGUoKSwgbG9nX2NiKSkgewotICAgICplcnIgPSB0cnVlOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgaWYgKHJlYWRlci0+c2l6ZSgpIDw9IGJ1Zl9zaXplKQotICAgIHJldHVybiByZWFkZXIucmVsZWFzZSgpOwotCi0gIHJldHVybiBOVUxMOwotfQotCi0vLyBzdGF0aWMKLWJvb2wgQm94UmVhZGVyOjpTdGFydFRvcExldmVsQm94KGNvbnN0IHVpbnQ4KiBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYnVmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2dDQiYgbG9nX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm91ckNDKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBib3hfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGVycikgewotICBCb3hSZWFkZXIgcmVhZGVyKGJ1ZiwgYnVmX3NpemUsIGxvZ19jYik7Ci0gIGlmICghcmVhZGVyLlJlYWRIZWFkZXIoZXJyKSkgcmV0dXJuIGZhbHNlOwotICBpZiAoIUlzVmFsaWRUb3BMZXZlbEJveChyZWFkZXIudHlwZSgpLCBsb2dfY2IpKSB7Ci0gICAgKmVyciA9IHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gICp0eXBlID0gcmVhZGVyLnR5cGUoKTsKLSAgKmJveF9zaXplID0gcmVhZGVyLnNpemUoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIHN0YXRpYwotYm9vbCBCb3hSZWFkZXI6OklzVmFsaWRUb3BMZXZlbEJveChjb25zdCBGb3VyQ0MmIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvZ0NCJiBsb2dfY2IpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBGT1VSQ0NfRlRZUDoKLSAgICBjYXNlIEZPVVJDQ19QRElOOgotICAgIGNhc2UgRk9VUkNDX01PT1Y6Ci0gICAgY2FzZSBGT1VSQ0NfTU9PRjoKLSAgICBjYXNlIEZPVVJDQ19NRlJBOgotICAgIGNhc2UgRk9VUkNDX01EQVQ6Ci0gICAgY2FzZSBGT1VSQ0NfRlJFRToKLSAgICBjYXNlIEZPVVJDQ19TS0lQOgotICAgIGNhc2UgRk9VUkNDX01FVEE6Ci0gICAgY2FzZSBGT1VSQ0NfTUVDTzoKLSAgICBjYXNlIEZPVVJDQ19TVFlQOgotICAgIGNhc2UgRk9VUkNDX1NJRFg6Ci0gICAgY2FzZSBGT1VSQ0NfU1NJWDoKLSAgICBjYXNlIEZPVVJDQ19QUkZUOgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8vIEhleCBpcyB1c2VkIHRvIHNob3cgbm9ucHJpbnRhYmxlIGNoYXJhY3RlcnMgYW5kIGFpZCBpbiBkZWJ1Z2dpbmcKLSAgICAgIE1FRElBX0xPRyhsb2dfY2IpIDw8ICJVbnJlY29nbml6ZWQgdG9wLWxldmVsIGJveCB0eXBlIDB4IgotICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpoZXggPDwgdHlwZTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi1ib29sIEJveFJlYWRlcjo6U2NhbkNoaWxkcmVuKCkgewotICBEQ0hFQ0soIXNjYW5uZWRfKTsKLSAgc2Nhbm5lZF8gPSB0cnVlOwotCi0gIGJvb2wgZXJyID0gZmFsc2U7Ci0gIHdoaWxlIChwb3MoKSA8IHNpemUoKSkgewotICAgIEJveFJlYWRlciBjaGlsZCgmYnVmX1twb3NfXSwgc2l6ZV8gLSBwb3NfLCBsb2dfY2JfKTsKLSAgICBpZiAoIWNoaWxkLlJlYWRIZWFkZXIoJmVycikpIGJyZWFrOwotCi0gICAgY2hpbGRyZW5fLmluc2VydChzdGQ6OnBhaXI8Rm91ckNDLCBCb3hSZWFkZXI+KGNoaWxkLnR5cGUoKSwgY2hpbGQpKTsKLSAgICBwb3NfICs9IGNoaWxkLnNpemUoKTsKLSAgfQotCi0gIERDSEVDSyghZXJyKTsKLSAgcmV0dXJuICFlcnIgJiYgcG9zKCkgPT0gc2l6ZSgpOwotfQotCi1ib29sIEJveFJlYWRlcjo6UmVhZENoaWxkKEJveCogY2hpbGQpIHsKLSAgRENIRUNLKHNjYW5uZWRfKTsKLSAgRm91ckNDIGNoaWxkX3R5cGUgPSBjaGlsZC0+Qm94VHlwZSgpOwotCi0gIENoaWxkTWFwOjppdGVyYXRvciBpdHIgPSBjaGlsZHJlbl8uZmluZChjaGlsZF90eXBlKTsKLSAgUkNIRUNLKGl0ciAhPSBjaGlsZHJlbl8uZW5kKCkpOwotICBEVkxPRygyKSA8PCAiRm91bmQgYSAiIDw8IEZvdXJDQ1RvU3RyaW5nKGNoaWxkX3R5cGUpIDw8ICIgYm94LiI7Ci0gIFJDSEVDSyhjaGlsZC0+UGFyc2UoJml0ci0+c2Vjb25kKSk7Ci0gIGNoaWxkcmVuXy5lcmFzZShpdHIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBCb3hSZWFkZXI6Ok1heWJlUmVhZENoaWxkKEJveCogY2hpbGQpIHsKLSAgaWYgKCFjaGlsZHJlbl8uY291bnQoY2hpbGQtPkJveFR5cGUoKSkpIHJldHVybiB0cnVlOwotICByZXR1cm4gUmVhZENoaWxkKGNoaWxkKTsKLX0KLQotYm9vbCBCb3hSZWFkZXI6OlJlYWRGdWxsQm94SGVhZGVyKCkgewotICB1aW50MzIgdmZsYWdzOwotICBSQ0hFQ0soUmVhZDQoJnZmbGFncykpOwotICB2ZXJzaW9uXyA9IHZmbGFncyA+PiAyNDsKLSAgZmxhZ3NfID0gdmZsYWdzICYgMHhmZmZmZmY7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEJveFJlYWRlcjo6UmVhZEhlYWRlcihib29sKiBlcnIpIHsKLSAgdWludDY0IHNpemUgPSAwOwotICAqZXJyID0gZmFsc2U7Ci0KLSAgaWYgKCFIYXNCeXRlcyg4KSkgcmV0dXJuIGZhbHNlOwotICBDSEVDSyhSZWFkNEludG84KCZzaXplKSAmJiBSZWFkRm91ckNDKCZ0eXBlXykpOwotCi0gIGlmIChzaXplID09IDApIHsKLSAgICAvLyBNZWRpYSBTb3VyY2Ugc3BlY2lmaWM6IHdlIGRvIG5vdCBzdXBwb3J0IGJveGVzIHRoYXQgcnVuIHRvIEVPUy4KLSAgICAqZXJyID0gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSBpZiAoc2l6ZSA9PSAxKSB7Ci0gICAgaWYgKCFIYXNCeXRlcyg4KSkgcmV0dXJuIGZhbHNlOwotICAgIENIRUNLKFJlYWQ4KCZzaXplKSk7Ci0gIH0KLQotICAvLyBJbXBsZW1lbnRhdGlvbi1zcGVjaWZpYzogc3VwcG9ydCBmb3IgYm94ZXMgbGFyZ2VyIHRoYW4gMl4zMSBoYXMgYmVlbgotICAvLyByZW1vdmVkLgotICBpZiAoc2l6ZSA8IHN0YXRpY19jYXN0PHVpbnQ2ND4ocG9zXykgfHwKLSAgICAgIHNpemUgPiBzdGF0aWNfY2FzdDx1aW50NjQ+KGtpbnQzMm1heCkpIHsKLSAgICAqZXJyID0gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBOb3RlIHRoYXQgdGhlIHBvc18gaGVhZCBoYXMgYWR2YW5jZWQgdG8gdGhlIGJ5dGUgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlCi0gIC8vIGhlYWRlciwgd2hpY2ggaXMgd2hlcmUgd2Ugd2FudCBpdC4KLSAgc2l6ZV8gPSBzaXplOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1wNAotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvbXA0L2JveF9yZWFkZXIuaCBiL3NyYy9tZWRpYS9tcDQvYm94X3JlYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2YxMWQ1Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9tcDQvYm94X3JlYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfTVA0X0JPWF9SRUFERVJfSF8KLSNkZWZpbmUgTUVESUFfTVA0X0JPWF9SRUFERVJfSF8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2xvZy5oIgotI2luY2x1ZGUgIm1lZGlhL21wNC9mb3VyY2NzLmgiCi0jaW5jbHVkZSAibWVkaWEvbXA0L3JjaGVjay5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotbmFtZXNwYWNlIG1wNCB7Ci0KLWNsYXNzIEJveFJlYWRlcjsKLQotc3RydWN0IE1FRElBX0VYUE9SVCBCb3ggewotICB2aXJ0dWFsIH5Cb3goKTsKLSAgdmlydHVhbCBib29sIFBhcnNlKEJveFJlYWRlciogcmVhZGVyKSA9IDA7Ci0gIHZpcnR1YWwgRm91ckNDIEJveFR5cGUoKSBjb25zdCA9IDA7Ci19OwotCi1jbGFzcyBNRURJQV9FWFBPUlQgQnVmZmVyUmVhZGVyIHsKLSBwdWJsaWM6Ci0gIEJ1ZmZlclJlYWRlcihjb25zdCB1aW50OCogYnVmLCBjb25zdCBpbnQgc2l6ZSkKLSAgICA6IGJ1Zl8oYnVmKSwgc2l6ZV8oc2l6ZSksIHBvc18oMCkge30KLQotICBib29sIEhhc0J5dGVzKGludCBjb3VudCkgeyByZXR1cm4gKHBvcygpICsgY291bnQgPD0gc2l6ZSgpKTsgfQotCi0gIC8vIFJlYWQgYSB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0sIHBlcmZvbWluZyBlbmRpYW4gY29ycmVjdGlvbiwgYW5kIGFkdmFuY2UgdGhlCi0gIC8vIHN0cmVhbSBwb2ludGVyLgotICBib29sIFJlYWQxKHVpbnQ4KiB2KSAgV0FSTl9VTlVTRURfUkVTVUxUOwotICBib29sIFJlYWQyKHVpbnQxNiogdikgV0FSTl9VTlVTRURfUkVTVUxUOwotICBib29sIFJlYWQycyhpbnQxNiogdikgV0FSTl9VTlVTRURfUkVTVUxUOwotICBib29sIFJlYWQ0KHVpbnQzMiogdikgV0FSTl9VTlVTRURfUkVTVUxUOwotICBib29sIFJlYWQ0cyhpbnQzMiogdikgV0FSTl9VTlVTRURfUkVTVUxUOwotICBib29sIFJlYWQ4KHVpbnQ2NCogdikgV0FSTl9VTlVTRURfUkVTVUxUOwotICBib29sIFJlYWQ4cyhpbnQ2NCogdikgV0FSTl9VTlVTRURfUkVTVUxUOwotCi0gIGJvb2wgUmVhZEZvdXJDQyhGb3VyQ0MqIHYpIFdBUk5fVU5VU0VEX1JFU1VMVDsKLQotICBib29sIFJlYWRWZWMoc3RkOjp2ZWN0b3I8dWludDg+KiB0LCBpbnQgY291bnQpIFdBUk5fVU5VU0VEX1JFU1VMVDsKLQotICAvLyBUaGVzZSB2YXJpYW50cyByZWFkIGEgNC1ieXRlIGludGVnZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc2lnbmVkbmVzcyBhbmQKLSAgLy8gc3RvcmUgaXQgaW4gdGhlIDgtYnl0ZSByZXR1cm4gdHlwZS4KLSAgYm9vbCBSZWFkNEludG84KHVpbnQ2NCogdikgV0FSTl9VTlVTRURfUkVTVUxUOwotICBib29sIFJlYWQ0c0ludG84cyhpbnQ2NCogdikgV0FSTl9VTlVTRURfUkVTVUxUOwotCi0gIC8vIEFkdmFuY2UgdGhlIHN0cmVhbSBieSB0aGlzIG1hbnkgYnl0ZXMuCi0gIGJvb2wgU2tpcEJ5dGVzKGludCBuYnl0ZXMpIFdBUk5fVU5VU0VEX1JFU1VMVDsKLQotICBjb25zdCB1aW50OCogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIGJ1Zl87IH0KLSAgaW50IHNpemUoKSBjb25zdCB7IHJldHVybiBzaXplXzsgfQotICBpbnQgcG9zKCkgY29uc3QgeyByZXR1cm4gcG9zXzsgfQotCi0gcHJvdGVjdGVkOgotICBjb25zdCB1aW50OCogYnVmXzsKLSAgaW50IHNpemVfOwotICBpbnQgcG9zXzsKLQotICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBib29sIFJlYWQoVCogdCkgV0FSTl9VTlVTRURfUkVTVUxUOwotfTsKLQotY2xhc3MgTUVESUFfRVhQT1JUIEJveFJlYWRlciA6IHB1YmxpYyBCdWZmZXJSZWFkZXIgewotIHB1YmxpYzoKLSAgfkJveFJlYWRlcigpOwotCi0gIC8vIENyZWF0ZSBhIEJveFJlYWRlciBmcm9tIGEgYnVmZmVyLiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBtYXkgcmV0dXJuIE5VTEwKLSAgLy8gaWYgYW4gaW50YWN0LCBjb21wbGV0ZSBib3ggd2FzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJ1ZmZlci4gSWYgfCplcnJ8IGlzCi0gIC8vIHNldCwgdGhlcmUgd2FzIGEgc3RyZWFtLWxldmVsIGVycm9yIHdoZW4gY3JlYXRpbmcgdGhlIGJveDsgb3RoZXJ3aXNlLCBOVUxMCi0gIC8vIHZhbHVlcyBhcmUgb25seSBleHBlY3RlZCB3aGVuIGluc3VmZmljaWVudCBkYXRhIGlzIGF2YWlsYWJsZS4KLSAgLy8KLSAgLy8gfGJ1ZnwgaXMgcmV0YWluZWQgYnV0IG5vdCBvd25lZCwgYW5kIG11c3Qgb3V0bGl2ZSB0aGUgQm94UmVhZGVyIGluc3RhbmNlLgotICBzdGF0aWMgQm94UmVhZGVyKiBSZWFkVG9wTGV2ZWxCb3goY29uc3QgdWludDgqIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBidWZfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvZ0NCJiBsb2dfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBlcnIpOwotCi0gIC8vIFJlYWQgdGhlIGJveCBoZWFkZXIgZnJvbSB0aGUgY3VycmVudCBidWZmZXIuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmCi0gIC8vIHRoZXJlIGlzIGVub3VnaCBkYXRhIHRvIHJlYWQgdGhlIGhlYWRlciBhbmQgdGhlIGhlYWRlciBpcyBzYW5lOyB0aGF0IGlzLCBpdAotICAvLyBkb2VzIG5vdCBjaGVjayB0byBlbnN1cmUgdGhlIGVudGlyZSBib3ggaXMgaW4gdGhlIGJ1ZmZlciBiZWZvcmUgcmV0dXJuaW5nCi0gIC8vIHRydWUuIFRoZSBzZW1hbnRpY3Mgb2YgfCplcnJ8IGFyZSB0aGUgc2FtZSBhcyBhYm92ZS4KLSAgLy8KLSAgLy8gfGJ1ZnwgaXMgbm90IHJldGFpbmVkLgotICBzdGF0aWMgYm9vbCBTdGFydFRvcExldmVsQm94KGNvbnN0IHVpbnQ4KiBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJ1Zl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvZ0NCJiBsb2dfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm91ckNDKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogYm94X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogZXJyKSBXQVJOX1VOVVNFRF9SRVNVTFQ7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHx0eXBlfCBpcyByZWNvZ25pemVkIHRvIGJlIGEgdG9wLWxldmVsIGJveCwgZmFsc2UKLSAgLy8gb3RoZXJ3aXNlLiBUaGlzIHJldHVybnMgdHJ1ZSBmb3Igc29tZSBib3hlcyB3aGljaCB3ZSBkbyBub3QgcGFyc2UuCi0gIC8vIEhlbHBmdWwgaW4gZGVidWdnaW5nIG1pc2FsaWduZWQgYXBwZW5kcy4KLSAgc3RhdGljIGJvb2wgSXNWYWxpZFRvcExldmVsQm94KGNvbnN0IEZvdXJDQyYgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvZ0NCJiBsb2dfY2IpOwotCi0gIC8vIFNjYW4gdGhyb3VnaCBhbGwgYm94ZXMgd2l0aGluIHRoZSBjdXJyZW50IGJveCwgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQKLSAgLy8gYnVmZmVyIHBvc2l0aW9uLiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG9mIHRoZSAqQ2hpbGQgZnVuY3Rpb25zIHdvcmsuCi0gIGJvb2wgU2NhbkNoaWxkcmVuKCkgV0FSTl9VTlVTRURfUkVTVUxUOwotCi0gIC8vIFJlYWQgZXhhY3RseSBvbmUgY2hpbGQgYm94IGZyb20gdGhlIHNldCBvZiBjaGlsZHJlbi4gVGhlIHR5cGUgb2YgdGhlIGNoaWxkCi0gIC8vIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgQm94VHlwZSgpIG1ldGhvZCBvZiB8Y2hpbGR8LgotICBib29sIFJlYWRDaGlsZChCb3gqIGNoaWxkKSBXQVJOX1VOVVNFRF9SRVNVTFQ7Ci0KLSAgLy8gUmVhZCBvbmUgY2hpbGQgaWYgYXZhaWxhYmxlLiBSZXR1cm5zIGZhbHNlIG9uIGVycm9yLCB0cnVlIG9uIHN1Y2Nlc3NmdWwKLSAgLy8gcmVhZCBvciBvbiBjaGlsZCBhYnNlbnQuCi0gIGJvb2wgTWF5YmVSZWFkQ2hpbGQoQm94KiBjaGlsZCkgV0FSTl9VTlVTRURfUkVTVUxUOwotCi0gIC8vIFJlYWQgYXQgbGVhc3Qgb25lIGNoaWxkLiBGYWxzZSBtZWFucyBlcnJvciBvciBubyBzdWNoIGNoaWxkIHByZXNlbnQuCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGJvb2wgUmVhZENoaWxkcmVuKAotICAgICAgc3RkOjp2ZWN0b3I8VD4qIGNoaWxkcmVuKSBXQVJOX1VOVVNFRF9SRVNVTFQ7Ci0KLSAgLy8gUmVhZCBhbnkgbnVtYmVyIG9mIGNoaWxkcmVuLiBGYWxzZSBtZWFucyBlcnJvci4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gYm9vbCBNYXliZVJlYWRDaGlsZHJlbigKLSAgICAgIHN0ZDo6dmVjdG9yPFQ+KiBjaGlsZHJlbikgV0FSTl9VTlVTRURfUkVTVUxUOwotCi0gIC8vIFJlYWQgYWxsIGNoaWxkcmVuLCByZWdhcmRsZXNzIG9mIEZvdXJDQy4gVGhpcyBpcyB1c2VkIGZyb20gZXhhY3RseSBvbmUgYm94LAotICAvLyBjb3JyZXNwb25kaW5nIHRvIGEgcmF0aGVyIHNpZ25pZmljYW50IGluY29uc2lzdGVuY3kgaW4gdGhlIEJNRkYgc3BlYy4KLSAgLy8gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIFNjYW5DaGlsZHJlbigpLgotICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBib29sIFJlYWRBbGxDaGlsZHJlbigKLSAgICAgIHN0ZDo6dmVjdG9yPFQ+KiBjaGlsZHJlbikgV0FSTl9VTlVTRURfUkVTVUxUOwotCi0gIC8vIFBvcHVsYXRlIHRoZSB2YWx1ZXMgb2YgJ3ZlcnNpb24oKScgYW5kICdmbGFncygpJyBmcm9tIGEgZnVsbCBib3ggaGVhZGVyLgotICAvLyBNYW55IGJveGVzLCBidXQgbm90IGFsbCwgdXNlIHRoZXNlIHZhbHVlcy4gVGhpcyBjYWxsIHNob3VsZCBoYXBwZW4gYWZ0ZXIKLSAgLy8gdGhlIGJveCBoYXMgYmVlbiBpbml0aWFsaXplZCwgYW5kIGRvZXMgbm90IHJlLXJlYWQgdGhlIG1haW4gYm94IGhlYWRlci4KLSAgYm9vbCBSZWFkRnVsbEJveEhlYWRlcigpIFdBUk5fVU5VU0VEX1JFU1VMVDsKLQotICBGb3VyQ0MgdHlwZSgpIGNvbnN0ICAgeyByZXR1cm4gdHlwZV87IH0KLSAgdWludDggdmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIHZlcnNpb25fOyB9Ci0gIHVpbnQzMiBmbGFncygpIGNvbnN0ICB7IHJldHVybiBmbGFnc187IH0KLQotIHByaXZhdGU6Ci0gIEJveFJlYWRlcihjb25zdCB1aW50OCogYnVmLCBjb25zdCBpbnQgc2l6ZSwgY29uc3QgTG9nQ0ImIGxvZ19jYik7Ci0KLSAgLy8gTXVzdCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgaW5pdC4gSWYgdGhlIHJldHVybiBpcyBmYWxzZSwgdGhpcwotICAvLyBpbmRpY2F0ZXMgdGhhdCB0aGUgYm94IGhlYWRlciBhbmQgaXRzIGNvbnRlbnRzIHdlcmUgbm90IGF2YWlsYWJsZSBpbiB0aGUKLSAgLy8gc3RyZWFtIG9yIHdlcmUgbm9uc2Vuc2ljYWwsIGFuZCB0aGF0IHRoZSBib3ggbXVzdCBub3QgYmUgdXNlZCBmdXJ0aGVyLiBJbgotICAvLyB0aGlzIGNhc2UsIGlmIHwqZXJyfCBpcyBmYWxzZSwgdGhlIHByb2JsZW0gd2FzIHNpbXBseSBhIGxhY2sgb2YgZGF0YSwgYW5kCi0gIC8vIHNob3VsZCBvbmx5IGJlIGFuIGVycm9yIGNvbmRpdGlvbiBpZiBzb21lIGhpZ2hlci1sZXZlbCBjb21wb25lbnQga25vd3MgdGhhdAotICAvLyBubyBtb3JlIGRhdGEgaXMgY29taW5nIChpLmUuIEVPUyBvciBlbmQgb2YgY29udGFpbmluZyBib3gpLiBJZiB8KmVycnwgaXMKLSAgLy8gdHJ1ZSwgdGhlIGVycm9yIGlzIHVucmVjb3ZlcmFibGUgYW5kIHRoZSBzdHJlYW0gc2hvdWxkIGJlIGFib3J0ZWQuCi0gIGJvb2wgUmVhZEhlYWRlcihib29sKiBlcnIpOwotCi0gIExvZ0NCIGxvZ19jYl87Ci0gIEZvdXJDQyB0eXBlXzsKLSAgdWludDggdmVyc2lvbl87Ci0gIHVpbnQzMiBmbGFnc187Ci0KLSAgdHlwZWRlZiBzdGQ6Om11bHRpbWFwPEZvdXJDQywgQm94UmVhZGVyPiBDaGlsZE1hcDsKLQotICAvLyBUaGUgc2V0IG9mIGNoaWxkIGJveCBGb3VyQ0NzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIGJ1ZmZlciByZWFkZXJzLiBPbmx5Ci0gIC8vIHZhbGlkIGlmIHNjYW5uZWRfIGlzIHRydWUuCi0gIENoaWxkTWFwIGNoaWxkcmVuXzsKLSAgYm9vbCBzY2FubmVkXzsKLX07Ci0KLS8vIFRlbXBsYXRlIGRlZmluaXRpb25zCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiBib29sIEJveFJlYWRlcjo6UmVhZENoaWxkcmVuKHN0ZDo6dmVjdG9yPFQ+KiBjaGlsZHJlbikgewotICBSQ0hFQ0soTWF5YmVSZWFkQ2hpbGRyZW4oY2hpbGRyZW4pICYmICFjaGlsZHJlbi0+ZW1wdHkoKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotYm9vbCBCb3hSZWFkZXI6Ok1heWJlUmVhZENoaWxkcmVuKHN0ZDo6dmVjdG9yPFQ+KiBjaGlsZHJlbikgewotICBEQ0hFQ0soc2Nhbm5lZF8pOwotICBEQ0hFQ0soY2hpbGRyZW4tPmVtcHR5KCkpOwotCi0gIGNoaWxkcmVuLT5yZXNpemUoMSk7Ci0gIEZvdXJDQyBjaGlsZF90eXBlID0gKCpjaGlsZHJlbilbMF0uQm94VHlwZSgpOwotCi0gIENoaWxkTWFwOjppdGVyYXRvciBzdGFydF9pdHIgPSBjaGlsZHJlbl8ubG93ZXJfYm91bmQoY2hpbGRfdHlwZSk7Ci0gIENoaWxkTWFwOjppdGVyYXRvciBlbmRfaXRyID0gY2hpbGRyZW5fLnVwcGVyX2JvdW5kKGNoaWxkX3R5cGUpOwotICBjaGlsZHJlbi0+cmVzaXplKHN0ZDo6ZGlzdGFuY2Uoc3RhcnRfaXRyLCBlbmRfaXRyKSk7Ci0gIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPFQ+OjppdGVyYXRvciBjaGlsZF9pdHIgPSBjaGlsZHJlbi0+YmVnaW4oKTsKLSAgZm9yIChDaGlsZE1hcDo6aXRlcmF0b3IgaXRyID0gc3RhcnRfaXRyOyBpdHIgIT0gZW5kX2l0cjsgKytpdHIpIHsKLSAgICBSQ0hFQ0soY2hpbGRfaXRyLT5QYXJzZSgmaXRyLT5zZWNvbmQpKTsKLSAgICArK2NoaWxkX2l0cjsKLSAgfQotICBjaGlsZHJlbl8uZXJhc2Uoc3RhcnRfaXRyLCBlbmRfaXRyKTsKLQotICBEVkxPRygyKSA8PCAiRm91bmQgIiA8PCBjaGlsZHJlbi0+c2l6ZSgpIDw8ICIgIgotICAgICAgICAgICA8PCBGb3VyQ0NUb1N0cmluZyhjaGlsZF90eXBlKSA8PCAiIGJveGVzLiI7Ci0gIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotYm9vbCBCb3hSZWFkZXI6OlJlYWRBbGxDaGlsZHJlbihzdGQ6OnZlY3RvcjxUPiogY2hpbGRyZW4pIHsKLSAgRENIRUNLKCFzY2FubmVkXyk7Ci0gIHNjYW5uZWRfID0gdHJ1ZTsKLQotICBib29sIGVyciA9IGZhbHNlOwotICB3aGlsZSAocG9zKCkgPCBzaXplKCkpIHsKLSAgICBCb3hSZWFkZXIgY2hpbGRfcmVhZGVyKCZidWZfW3Bvc19dLCBzaXplXyAtIHBvc18sIGxvZ19jYl8pOwotICAgIGlmICghY2hpbGRfcmVhZGVyLlJlYWRIZWFkZXIoJmVycikpIGJyZWFrOwotICAgIFQgY2hpbGQ7Ci0gICAgUkNIRUNLKGNoaWxkLlBhcnNlKCZjaGlsZF9yZWFkZXIpKTsKLSAgICBjaGlsZHJlbi0+cHVzaF9iYWNrKGNoaWxkKTsKLSAgICBwb3NfICs9IGNoaWxkX3JlYWRlci5zaXplKCk7Ci0gIH0KLQotICByZXR1cm4gIWVycjsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1wNAotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfTVA0X0JPWF9SRUFERVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9tcDQvYm94X3JlYWRlcl91bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9tcDQvYm94X3JlYWRlcl91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE5YjVhZi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvbXA0L2JveF9yZWFkZXJfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgIm1lZGlhL21wNC9ib3hfcmVhZGVyLmgiCi0jaW5jbHVkZSAibWVkaWEvbXA0L3JjaGVjay5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotbmFtZXNwYWNlIG1wNCB7Ci0KLXN0YXRpYyBjb25zdCB1aW50OCBrU2tpcEJveFtdID0gewotICAvLyBUb3AtbGV2ZWwgdGVzdCBib3ggY29udGFpbmluZyB0aHJlZSBjaGlsZHJlbgotICAweDAwLCAweDAwLCAweDAwLCAweDQwLCAncycsICdrJywgJ2knLCAncCcsCi0gIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsCi0gIDB4ZjksIDB4MGEsIDB4MGIsIDB4MGMsIDB4ZmQsIDB4MGUsIDB4MGYsIDB4MTAsCi0gIC8vIE9yZGluYXJ5ICg4LWJ5dGUgaGVhZGVyKSBjaGlsZCBib3gKLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYywgICdwJywgICdzJywgICdzJywgICdoJywgMHhkZSwgMHhhZCwgMHhiZSwgMHhlZiwKLSAgLy8gRXh0ZW5kZWQtc2l6ZSBoZWFkZXIgY2hpbGQgYm94Ci0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsICAncCcsICAncycsICAncycsICAnaCcsCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsCi0gIDB4ZmEsIDB4Y2UsIDB4Y2EsIDB4ZmUsCi0gIC8vIEVtcHR5IGZyZWUgYm94Ci0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsICAnZicsICAncicsICAnZScsICAnZScsCi0gIC8vIFRyYWlsaW5nIGdhcmJhZ2UKLSAgMHgwMCB9OwotCi1zdHJ1Y3QgRnJlZUJveCA6IEJveCB7Ci0gIHZpcnR1YWwgYm9vbCBQYXJzZShCb3hSZWFkZXIqIHJlYWRlcikgT1ZFUlJJREUgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHZpcnR1YWwgRm91ckNDIEJveFR5cGUoKSBjb25zdCBPVkVSUklERSB7IHJldHVybiBGT1VSQ0NfRlJFRTsgfQotfTsKLQotc3RydWN0IFBzc2hCb3ggOiBCb3ggewotICB1aW50MzIgdmFsOwotCi0gIHZpcnR1YWwgYm9vbCBQYXJzZShCb3hSZWFkZXIqIHJlYWRlcikgT1ZFUlJJREUgewotICAgIHJldHVybiByZWFkZXItPlJlYWQ0KCZ2YWwpOwotICB9Ci0gIHZpcnR1YWwgRm91ckNDIEJveFR5cGUoKSBjb25zdCBPVkVSUklERSB7IHJldHVybiBGT1VSQ0NfUFNTSDsgfQotfTsKLQotc3RydWN0IFNraXBCb3ggOiBCb3ggewotICB1aW50OCBhLCBiOwotICB1aW50MTYgYzsKLSAgaW50MzIgZDsKLSAgaW50NjQgZTsKLQotICBzdGQ6OnZlY3RvcjxQc3NoQm94PiBraWRzOwotICBGcmVlQm94IG1wdHk7Ci0KLSAgdmlydHVhbCBib29sIFBhcnNlKEJveFJlYWRlciogcmVhZGVyKSBPVkVSUklERSB7Ci0gICAgUkNIRUNLKHJlYWRlci0+UmVhZEZ1bGxCb3hIZWFkZXIoKSAmJgotICAgICAgICAgICByZWFkZXItPlJlYWQxKCZhKSAmJgotICAgICAgICAgICByZWFkZXItPlJlYWQxKCZiKSAmJgotICAgICAgICAgICByZWFkZXItPlJlYWQyKCZjKSAmJgotICAgICAgICAgICByZWFkZXItPlJlYWQ0cygmZCkgJiYKLSAgICAgICAgICAgcmVhZGVyLT5SZWFkNHNJbnRvOHMoJmUpKTsKLSAgICByZXR1cm4gcmVhZGVyLT5TY2FuQ2hpbGRyZW4oKSAmJgotICAgICAgICAgICByZWFkZXItPlJlYWRDaGlsZHJlbigma2lkcykgJiYKLSAgICAgICAgICAgcmVhZGVyLT5NYXliZVJlYWRDaGlsZCgmbXB0eSk7Ci0gIH0KLSAgdmlydHVhbCBGb3VyQ0MgQm94VHlwZSgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIEZPVVJDQ19TS0lQOyB9Ci0KLSAgU2tpcEJveCgpOwotICB+U2tpcEJveCgpOwotfTsKLQotU2tpcEJveDo6U2tpcEJveCgpIHt9Ci1Ta2lwQm94Ojp+U2tpcEJveCgpIHt9Ci0KLWNsYXNzIEJveFJlYWRlclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICBzdGQ6OnZlY3Rvcjx1aW50OD4gR2V0QnVmKCkgewotICAgIHJldHVybiBzdGQ6OnZlY3Rvcjx1aW50OD4oa1NraXBCb3gsIGtTa2lwQm94ICsgc2l6ZW9mKGtTa2lwQm94KSk7Ci0gIH0KLX07Ci0KLVRFU1RfRihCb3hSZWFkZXJUZXN0LCBFeHBlY3RlZE9wZXJhdGlvblRlc3QpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDg+IGJ1ZiA9IEdldEJ1ZigpOwotICBib29sIGVycjsKLSAgc2NvcGVkX3B0cjxCb3hSZWFkZXI+IHJlYWRlcigKLSAgICAgIEJveFJlYWRlcjo6UmVhZFRvcExldmVsQm94KCZidWZbMF0sIGJ1Zi5zaXplKCksIExvZ0NCKCksICZlcnIpKTsKLSAgRVhQRUNUX0ZBTFNFKGVycik7Ci0gIEVYUEVDVF9UUlVFKHJlYWRlci5nZXQoKSk7Ci0KLSAgU2tpcEJveCBib3g7Ci0gIEVYUEVDVF9UUlVFKGJveC5QYXJzZShyZWFkZXIuZ2V0KCkpKTsKLSAgRVhQRUNUX0VRKDB4MDEsIHJlYWRlci0+dmVyc2lvbigpKTsKLSAgRVhQRUNUX0VRKDB4MDIwMzA0dSwgcmVhZGVyLT5mbGFncygpKTsKLSAgRVhQRUNUX0VRKDB4MDUsIGJveC5hKTsKLSAgRVhQRUNUX0VRKDB4MDYsIGJveC5iKTsKLSAgRVhQRUNUX0VRKDB4MDcwOCwgYm94LmMpOwotICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8aW50MzI+KDB4ZjkwYTBiMGMpLCBib3guZCk7Ci0gIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxpbnQzMj4oMHhmZDBlMGYxMCksIGJveC5lKTsKLQotICBFWFBFQ1RfRVEoMnUsIGJveC5raWRzLnNpemUoKSk7Ci0gIEVYUEVDVF9FUSgweGRlYWRiZWVmLCBib3gua2lkc1swXS52YWwpOwotICBFWFBFQ1RfRVEoMHhmYWNlY2FmZSwgYm94LmtpZHNbMV0udmFsKTsKLQotICAvLyBBY2NvdW50aW5nIGZvciB0aGUgZXh0cmEgYnl0ZSBvdXRzaWRlIG9mIHRoZSBib3ggYWJvdmUKLSAgRVhQRUNUX0VRKGJ1Zi5zaXplKCksIHN0YXRpY19jYXN0PHVpbnQ2ND4ocmVhZGVyLT5zaXplKCkgKyAxKSk7Ci19Ci0KLVRFU1RfRihCb3hSZWFkZXJUZXN0LCBPdXRlclRvb1Nob3J0VGVzdCkgewotICBzdGQ6OnZlY3Rvcjx1aW50OD4gYnVmID0gR2V0QnVmKCk7Ci0gIGJvb2wgZXJyOwotCi0gIC8vIENyZWF0ZSBhIHNvZnQgZmFpbHVyZSBieSB0cnVuY2F0aW5nIHRoZSBvdXRlciBib3guCi0gIHNjb3BlZF9wdHI8Qm94UmVhZGVyPiByKAotICAgICAgQm94UmVhZGVyOjpSZWFkVG9wTGV2ZWxCb3goJmJ1ZlswXSwgYnVmLnNpemUoKSAtIDIsIExvZ0NCKCksICZlcnIpKTsKLQotICBFWFBFQ1RfRkFMU0UoZXJyKTsKLSAgRVhQRUNUX0ZBTFNFKHIuZ2V0KCkpOwotfQotCi1URVNUX0YoQm94UmVhZGVyVGVzdCwgSW5uZXJUb29Mb25nVGVzdCkgewotICBzdGQ6OnZlY3Rvcjx1aW50OD4gYnVmID0gR2V0QnVmKCk7Ci0gIGJvb2wgZXJyOwotCi0gIC8vIE1ha2UgYW4gaW5uZXIgYm94IHRvbyBiaWcgZm9yIGl0cyBvdXRlciBib3guCi0gIGJ1ZlsyNV0gPSAxOwotICBzY29wZWRfcHRyPEJveFJlYWRlcj4gcmVhZGVyKAotICAgICAgQm94UmVhZGVyOjpSZWFkVG9wTGV2ZWxCb3goJmJ1ZlswXSwgYnVmLnNpemUoKSwgTG9nQ0IoKSwgJmVycikpOwotCi0gIFNraXBCb3ggYm94OwotICBFWFBFQ1RfRkFMU0UoYm94LlBhcnNlKHJlYWRlci5nZXQoKSkpOwotfQotCi1URVNUX0YoQm94UmVhZGVyVGVzdCwgV3JvbmdGb3VyQ0NUZXN0KSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4PiBidWYgPSBHZXRCdWYoKTsKLSAgYm9vbCBlcnI7Ci0KLSAgLy8gU2V0IGFuIHVucmVjb2duaXplZCB0b3AtbGV2ZWwgRm91ckNDLgotICBidWZbNV0gPSAxOwotICBzY29wZWRfcHRyPEJveFJlYWRlcj4gcmVhZGVyKAotICAgICAgQm94UmVhZGVyOjpSZWFkVG9wTGV2ZWxCb3goJmJ1ZlswXSwgYnVmLnNpemUoKSwgTG9nQ0IoKSwgJmVycikpOwotICBFWFBFQ1RfRkFMU0UocmVhZGVyLmdldCgpKTsKLSAgRVhQRUNUX1RSVUUoZXJyKTsKLX0KLQotVEVTVF9GKEJveFJlYWRlclRlc3QsIFNjYW5DaGlsZHJlblRlc3QpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDg+IGJ1ZiA9IEdldEJ1ZigpOwotICBib29sIGVycjsKLSAgc2NvcGVkX3B0cjxCb3hSZWFkZXI+IHJlYWRlcigKLSAgICAgIEJveFJlYWRlcjo6UmVhZFRvcExldmVsQm94KCZidWZbMF0sIGJ1Zi5zaXplKCksIExvZ0NCKCksICZlcnIpKTsKLQotICBFWFBFQ1RfVFJVRShyZWFkZXItPlNraXBCeXRlcygxNikgJiYgcmVhZGVyLT5TY2FuQ2hpbGRyZW4oKSk7Ci0KLSAgRnJlZUJveCBmcmVlOwotICBFWFBFQ1RfVFJVRShyZWFkZXItPlJlYWRDaGlsZCgmZnJlZSkpOwotICBFWFBFQ1RfRkFMU0UocmVhZGVyLT5SZWFkQ2hpbGQoJmZyZWUpKTsKLSAgRVhQRUNUX1RSVUUocmVhZGVyLT5NYXliZVJlYWRDaGlsZCgmZnJlZSkpOwotCi0gIHN0ZDo6dmVjdG9yPFBzc2hCb3g+IGtpZHM7Ci0KLSAgRVhQRUNUX1RSVUUocmVhZGVyLT5SZWFkQ2hpbGRyZW4oJmtpZHMpKTsKLSAgRVhQRUNUX0VRKDJ1LCBraWRzLnNpemUoKSk7Ci0gIGtpZHMuY2xlYXIoKTsKLSAgRVhQRUNUX0ZBTFNFKHJlYWRlci0+UmVhZENoaWxkcmVuKCZraWRzKSk7Ci0gIEVYUEVDVF9UUlVFKHJlYWRlci0+TWF5YmVSZWFkQ2hpbGRyZW4oJmtpZHMpKTsKLX0KLQotVEVTVF9GKEJveFJlYWRlclRlc3QsIFJlYWRBbGxDaGlsZHJlblRlc3QpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDg+IGJ1ZiA9IEdldEJ1ZigpOwotICAvLyBNb2RpZnkgYnVmZmVyIHRvIGV4Y2x1ZGUgaXRzIGxhc3QgJ2ZyZWUnIGJveAotICBidWZbM10gPSAweDM4OwotICBib29sIGVycjsKLSAgc2NvcGVkX3B0cjxCb3hSZWFkZXI+IHJlYWRlcigKLSAgICAgIEJveFJlYWRlcjo6UmVhZFRvcExldmVsQm94KCZidWZbMF0sIGJ1Zi5zaXplKCksIExvZ0NCKCksICZlcnIpKTsKLQotICBzdGQ6OnZlY3RvcjxQc3NoQm94PiBraWRzOwotICBFWFBFQ1RfVFJVRShyZWFkZXItPlNraXBCeXRlcygxNikgJiYgcmVhZGVyLT5SZWFkQWxsQ2hpbGRyZW4oJmtpZHMpKTsKLSAgRVhQRUNUX0VRKDJ1LCBraWRzLnNpemUoKSk7Ci0gIEVYUEVDVF9FUShraWRzWzBdLnZhbCwgMHhkZWFkYmVlZik7ICAgLy8gRW5zdXJlIG9yZGVyIGlzIHByZXNlcnZlZAotfQotCi19ICAvLyBuYW1lc3BhY2UgbXA0Ci19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9tcDQvY2VuYy5jYyBiL3NyYy9tZWRpYS9tcDQvY2VuYy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBmM2EyYS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvbXA0L2NlbmMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvbXA0L2NlbmMuaCIKLQotI2luY2x1ZGUgPGNzdHJpbmc+Ci0KLSNpbmNsdWRlICJtZWRpYS9tcDQvYm94X3JlYWRlci5oIgotI2luY2x1ZGUgIm1lZGlhL21wNC9yY2hlY2suaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLW5hbWVzcGFjZSBtcDQgewotCi1GcmFtZUNFTkNJbmZvOjpGcmFtZUNFTkNJbmZvKCkge30KLUZyYW1lQ0VOQ0luZm86On5GcmFtZUNFTkNJbmZvKCkge30KLQotYm9vbCBGcmFtZUNFTkNJbmZvOjpQYXJzZShpbnQgaXZfc2l6ZSwgQnVmZmVyUmVhZGVyKiByZWFkZXIpIHsKLSAgY29uc3QgaW50IGtFbnRyeVNpemUgPSA2OwotICAvLyBNYW5kYXRlZCBieSBDRU5DIHNwZWMKLSAgUkNIRUNLKGl2X3NpemUgPT0gOCB8fCBpdl9zaXplID09IDE2KTsKLQotICBtZW1zZXQoaXYsIDAsIHNpemVvZihpdikpOwotICBmb3IgKGludCBpID0gMDsgaSA8IGl2X3NpemU7IGkrKykKLSAgICBSQ0hFQ0socmVhZGVyLT5SZWFkMSgmaXZbaV0pKTsKLQotICBpZiAoIXJlYWRlci0+SGFzQnl0ZXMoMSkpIHJldHVybiB0cnVlOwotCi0gIHVpbnQxNiBzdWJzYW1wbGVfY291bnQ7Ci0gIFJDSEVDSyhyZWFkZXItPlJlYWQyKCZzdWJzYW1wbGVfY291bnQpICYmCi0gICAgICAgICByZWFkZXItPkhhc0J5dGVzKHN1YnNhbXBsZV9jb3VudCAqIGtFbnRyeVNpemUpKTsKLQotICBzdWJzYW1wbGVzLnJlc2l6ZShzdWJzYW1wbGVfY291bnQpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHN1YnNhbXBsZV9jb3VudDsgaSsrKSB7Ci0gICAgdWludDE2IGNsZWFyX2J5dGVzOwotICAgIHVpbnQzMiBjeXBoZXJfYnl0ZXM7Ci0gICAgUkNIRUNLKHJlYWRlci0+UmVhZDIoJmNsZWFyX2J5dGVzKSAmJgotICAgICAgICAgICByZWFkZXItPlJlYWQ0KCZjeXBoZXJfYnl0ZXMpKTsKLSAgICBzdWJzYW1wbGVzW2ldLmNsZWFyX2J5dGVzID0gY2xlYXJfYnl0ZXM7Ci0gICAgc3Vic2FtcGxlc1tpXS5jeXBoZXJfYnl0ZXMgPSBjeXBoZXJfYnl0ZXM7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRnJhbWVDRU5DSW5mbzo6R2V0VG90YWxTaXplT2ZTdWJzYW1wbGVzKHNpemVfdCogdG90YWxfc2l6ZSkgY29uc3QgewotICBzaXplX3Qgc2l6ZSA9IDA7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3Vic2FtcGxlcy5zaXplKCk7IGkrKykgewotICAgIHNpemUgKz0gc3Vic2FtcGxlc1tpXS5jbGVhcl9ieXRlczsKLSAgICBSQ0hFQ0soc2l6ZSA+PSBzdWJzYW1wbGVzW2ldLmNsZWFyX2J5dGVzKTsgIC8vIG92ZXJmbG93Ci0gICAgc2l6ZSArPSBzdWJzYW1wbGVzW2ldLmN5cGhlcl9ieXRlczsKLSAgICBSQ0hFQ0soc2l6ZSA+PSBzdWJzYW1wbGVzW2ldLmN5cGhlcl9ieXRlcyk7ICAvLyBvdmVyZmxvdwotICB9Ci0gICp0b3RhbF9zaXplID0gc2l6ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtcDQKLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL21wNC9jZW5jLmggYi9zcmMvbWVkaWEvbXA0L2NlbmMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQyNzA5MS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvbXA0L2NlbmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfTVA0X0NFTkNfSF8KLSNkZWZpbmUgTUVESUFfTVA0X0NFTkNfSF8KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVjcnlwdF9jb25maWcuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLW5hbWVzcGFjZSBtcDQgewotCi1jbGFzcyBCdWZmZXJSZWFkZXI7Ci0KLXN0cnVjdCBGcmFtZUNFTkNJbmZvIHsKLSAgdWludDggaXZbMTZdOwotICBzdGQ6OnZlY3RvcjxTdWJzYW1wbGVFbnRyeT4gc3Vic2FtcGxlczsKLQotICBGcmFtZUNFTkNJbmZvKCk7Ci0gIH5GcmFtZUNFTkNJbmZvKCk7Ci0gIGJvb2wgUGFyc2UoaW50IGl2X3NpemUsIEJ1ZmZlclJlYWRlciogcikgV0FSTl9VTlVTRURfUkVTVUxUOwotICBib29sIEdldFRvdGFsU2l6ZU9mU3Vic2FtcGxlcyhzaXplX3QqIHRvdGFsX3NpemUpIGNvbnN0IFdBUk5fVU5VU0VEX1JFU1VMVDsKLX07Ci0KLQotfSAgLy8gbmFtZXNwYWNlIG1wNAotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfTVA0X0NFTkNfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9tcDQvZXNfZGVzY3JpcHRvci5jYyBiL3NyYy9tZWRpYS9tcDQvZXNfZGVzY3JpcHRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0ODBkZC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvbXA0L2VzX2Rlc2NyaXB0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL21wNC9lc19kZXNjcmlwdG9yLmgiCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL2JpdF9yZWFkZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9tcDQvcmNoZWNrLmgiCi0KLS8vIFRoZSBlbGVtZW50YXJ5IHN0cmVhbSBzaXplIGlzIHNwZWNpZmljIGJ5IHVwIHRvIDQgYnl0ZXMuCi0vLyBUaGUgTVNCIG9mIGEgYnl0ZSBpbmRpY2F0ZXMgaWYgdGhlcmUgYXJlIG1vcmUgYnl0ZXMgZm9yIHRoZSBzaXplLgotc3RhdGljIGJvb2wgUmVhZEVTU2l6ZShtZWRpYTo6Qml0UmVhZGVyKiByZWFkZXIsIHVpbnQzMiogc2l6ZSkgewotICB1aW50OCBtc2I7Ci0gIHVpbnQ4IGJ5dGU7Ci0KLSAgKnNpemUgPSAwOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNDsgKytpKSB7Ci0gICAgUkNIRUNLKHJlYWRlci0+UmVhZEJpdHMoMSwgJm1zYikpOwotICAgIFJDSEVDSyhyZWFkZXItPlJlYWRCaXRzKDcsICZieXRlKSk7Ci0gICAgKnNpemUgPSAoKnNpemUgPDwgNykgKyBieXRlOwotCi0gICAgaWYgKG1zYiA9PSAwKQotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotbmFtZXNwYWNlIG1wNCB7Ci0KLUVTRGVzY3JpcHRvcjo6RVNEZXNjcmlwdG9yKCkKLSAgICA6IG9iamVjdF90eXBlXyhrRm9yYmlkZGVuKSB7Ci19Ci0KLUVTRGVzY3JpcHRvcjo6fkVTRGVzY3JpcHRvcigpIHt9Ci0KLWJvb2wgRVNEZXNjcmlwdG9yOjpQYXJzZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OD4mIGRhdGEpIHsKLSAgQml0UmVhZGVyIHJlYWRlcigmZGF0YVswXSwgZGF0YS5zaXplKCkpOwotICB1aW50OCB0YWc7Ci0gIHVpbnQzMiBzaXplOwotICB1aW50OCBzdHJlYW1fZGVwZW5kZW5jeV9mbGFnOwotICB1aW50OCB1cmxfZmxhZzsKLSAgdWludDggb2NyX3N0cmVhbV9mbGFnOwotICB1aW50MTYgZHVtbXk7Ci0KLSAgUkNIRUNLKHJlYWRlci5SZWFkQml0cyg4LCAmdGFnKSk7Ci0gIFJDSEVDSyh0YWcgPT0ga0VTRGVzY3JUYWcpOwotICBSQ0hFQ0soUmVhZEVTU2l6ZSgmcmVhZGVyLCAmc2l6ZSkpOwotCi0gIFJDSEVDSyhyZWFkZXIuUmVhZEJpdHMoMTYsICZkdW1teSkpOyAgLy8gRVNfSUQKLSAgUkNIRUNLKHJlYWRlci5SZWFkQml0cygxLCAmc3RyZWFtX2RlcGVuZGVuY3lfZmxhZykpOwotICBSQ0hFQ0socmVhZGVyLlJlYWRCaXRzKDEsICZ1cmxfZmxhZykpOwotICBSQ0hFQ0soIXVybF9mbGFnKTsgIC8vIFdlIGRvbid0IHN1cHBvcnQgdXJsIGZsYWcKLSAgUkNIRUNLKHJlYWRlci5SZWFkQml0cygxLCAmb2NyX3N0cmVhbV9mbGFnKSk7Ci0gIFJDSEVDSyhyZWFkZXIuUmVhZEJpdHMoNSwgJmR1bW15KSk7ICAvLyBzdHJlYW1Qcmlvcml0eQotCi0gIGlmIChzdHJlYW1fZGVwZW5kZW5jeV9mbGFnKQotICAgIFJDSEVDSyhyZWFkZXIuUmVhZEJpdHMoMTYsICZkdW1teSkpOyAgLy8gZGVwZW5kc09uX0VTX0lECi0gIGlmIChvY3Jfc3RyZWFtX2ZsYWcpCi0gICAgUkNIRUNLKHJlYWRlci5SZWFkQml0cygxNiwgJmR1bW15KSk7ICAvLyBPQ1JfRVNfSWQKLQotICBSQ0hFQ0soUGFyc2VEZWNvZGVyQ29uZmlnRGVzY3JpcHRvcigmcmVhZGVyKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXVpbnQ4IEVTRGVzY3JpcHRvcjo6b2JqZWN0X3R5cGUoKSBjb25zdCB7Ci0gIHJldHVybiBvYmplY3RfdHlwZV87Ci19Ci0KLWNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4PiYgRVNEZXNjcmlwdG9yOjpkZWNvZGVyX3NwZWNpZmljX2luZm8oKSBjb25zdCB7Ci0gIHJldHVybiBkZWNvZGVyX3NwZWNpZmljX2luZm9fOwotfQotCi1ib29sIEVTRGVzY3JpcHRvcjo6UGFyc2VEZWNvZGVyQ29uZmlnRGVzY3JpcHRvcihCaXRSZWFkZXIqIHJlYWRlcikgewotICB1aW50OCB0YWc7Ci0gIHVpbnQzMiBzaXplOwotICB1aW50NjQgZHVtbXk7Ci0KLSAgUkNIRUNLKHJlYWRlci0+UmVhZEJpdHMoOCwgJnRhZykpOwotICBSQ0hFQ0sodGFnID09IGtEZWNvZGVyQ29uZmlnRGVzY3JUYWcpOwotICBSQ0hFQ0soUmVhZEVTU2l6ZShyZWFkZXIsICZzaXplKSk7Ci0KLSAgUkNIRUNLKHJlYWRlci0+UmVhZEJpdHMoOCwgJm9iamVjdF90eXBlXykpOwotICBSQ0hFQ0socmVhZGVyLT5SZWFkQml0cyg2NCwgJmR1bW15KSk7Ci0gIFJDSEVDSyhyZWFkZXItPlJlYWRCaXRzKDMyLCAmZHVtbXkpKTsKLSAgUkNIRUNLKFBhcnNlRGVjb2RlclNwZWNpZmljSW5mbyhyZWFkZXIpKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBFU0Rlc2NyaXB0b3I6OlBhcnNlRGVjb2RlclNwZWNpZmljSW5mbyhCaXRSZWFkZXIqIHJlYWRlcikgewotICB1aW50OCB0YWc7Ci0gIHVpbnQzMiBzaXplOwotCi0gIFJDSEVDSyhyZWFkZXItPlJlYWRCaXRzKDgsICZ0YWcpKTsKLSAgUkNIRUNLKHRhZyA9PSBrRGVjb2RlclNwZWNpZmljSW5mb1RhZyk7Ci0gIFJDSEVDSyhSZWFkRVNTaXplKHJlYWRlciwgJnNpemUpKTsKLQotICBkZWNvZGVyX3NwZWNpZmljX2luZm9fLnJlc2l6ZShzaXplKTsKLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBzaXplOyArK2kpCi0gICAgUkNIRUNLKHJlYWRlci0+UmVhZEJpdHMoOCwgJmRlY29kZXJfc3BlY2lmaWNfaW5mb19baV0pKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1wNAotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9tcDQvZXNfZGVzY3JpcHRvci5oIGIvc3JjL21lZGlhL21wNC9lc19kZXNjcmlwdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZGRiYzAuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL21wNC9lc19kZXNjcmlwdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX01QNF9FU19ERVNDUklQVE9SX0hfCi0jZGVmaW5lIE1FRElBX01QNF9FU19ERVNDUklQVE9SX0hfCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBCaXRSZWFkZXI7Ci0KLW5hbWVzcGFjZSBtcDQgewotCi0vLyBUaGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgZXh0cmFjdGVkIGZyb20gSVNPIDE0NDk2IFBhcnQgMSBUYWJsZSA1IC0KLS8vIG9iamVjdFR5cGVJbmRpY2F0aW9uIFZhbHVlcy4gT25seSB2YWx1ZXMgY3VycmVudGx5IGluIHVzZSBhcmUgaW5jbHVkZWQuCi1lbnVtIE9iamVjdFR5cGUgewotICBrRm9yYmlkZGVuID0gMCwKLSAga0lTT18xNDQ5Nl8zID0gMHg0MCAgLy8gTVBFRzQgQUFDCi19OwotCi0vLyBUaGlzIGNsYXNzIHBhcnNlIG9iamVjdCB0eXBlIGFuZCBkZWNvZGVyIHNwZWNpZmljIGluZm9ybWF0aW9uIGZyb20gYW4KLS8vIGVsZW1lbnRhcnkgc3RyZWFtIGRlc2NyaXB0b3IsIHdoaWNoIGlzIHVzdWFsbHkgY29udGFpbmVkIGluIGFuIGVzZHMgYm94LgotLy8gUGxlYXNlIHJlZmVyIHRvIElTTyAxNDQ5NiBQYXJ0IDEgNy4yLjYuNSBmb3IgbW9yZSBkZXRhaWxzLgotY2xhc3MgTUVESUFfRVhQT1JUIEVTRGVzY3JpcHRvciB7Ci0gcHVibGljOgotICBFU0Rlc2NyaXB0b3IoKTsKLSAgfkVTRGVzY3JpcHRvcigpOwotCi0gIGJvb2wgUGFyc2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDg+JiBkYXRhKTsKLQotICB1aW50OCBvYmplY3RfdHlwZSgpIGNvbnN0OwotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OD4mIGRlY29kZXJfc3BlY2lmaWNfaW5mbygpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgZW51bSBUYWcgewotICAgIGtFU0Rlc2NyVGFnID0gMHgwMywKLSAgICBrRGVjb2RlckNvbmZpZ0Rlc2NyVGFnID0gMHgwNCwKLSAgICBrRGVjb2RlclNwZWNpZmljSW5mb1RhZyA9IDB4MDUKLSAgfTsKLQotICBib29sIFBhcnNlRGVjb2RlckNvbmZpZ0Rlc2NyaXB0b3IoQml0UmVhZGVyKiByZWFkZXIpOwotICBib29sIFBhcnNlRGVjb2RlclNwZWNpZmljSW5mbyhCaXRSZWFkZXIqIHJlYWRlcik7Ci0KLSAgdWludDggb2JqZWN0X3R5cGVfOwotICBzdGQ6OnZlY3Rvcjx1aW50OD4gZGVjb2Rlcl9zcGVjaWZpY19pbmZvXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtcDQKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfTVA0X0VTX0RFU0NSSVBUT1JfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9tcDQvZXNfZGVzY3JpcHRvcl91bml0dGVzdC5jYyBiL3NyYy9tZWRpYS9tcDQvZXNfZGVzY3JpcHRvcl91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNhMzlmYi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvbXA0L2VzX2Rlc2NyaXB0b3JfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvbXA0L2VzX2Rlc2NyaXB0b3IuaCIKLQotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1uYW1lc3BhY2UgbXA0IHsKLQotVEVTVChFU0Rlc2NyaXB0b3JUZXN0LCBTaW5nbGVCeXRlTGVuZ3RoVGVzdCkgewotICBFU0Rlc2NyaXB0b3IgZXNfZGVzYzsKLSAgdWludDggYnVmZmVyW10gPSB7Ci0gICAgMHgwMywgMHgxOSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwNCwgMHgxMSwgMHg0MCwKLSAgICAweDE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDUsIDB4MDIsIDB4MTIsIDB4MTAsCi0gICAgMHgwNiwgMHgwMSwgMHgwMgotICB9OwotICBzdGQ6OnZlY3Rvcjx1aW50OD4gZGF0YTsKLQotICBkYXRhLmFzc2lnbihidWZmZXIsIGJ1ZmZlciArIHNpemVvZihidWZmZXIpKTsKLQotICBFWFBFQ1RfRVEoZXNfZGVzYy5vYmplY3RfdHlwZSgpLCBrRm9yYmlkZGVuKTsKLSAgRVhQRUNUX1RSVUUoZXNfZGVzYy5QYXJzZShkYXRhKSk7Ci0gIEVYUEVDVF9FUShlc19kZXNjLm9iamVjdF90eXBlKCksIGtJU09fMTQ0OTZfMyk7Ci0gIEVYUEVDVF9FUShlc19kZXNjLmRlY29kZXJfc3BlY2lmaWNfaW5mbygpLnNpemUoKSwgMnUpOwotICBFWFBFQ1RfRVEoZXNfZGVzYy5kZWNvZGVyX3NwZWNpZmljX2luZm8oKVswXSwgMHgxMik7Ci0gIEVYUEVDVF9FUShlc19kZXNjLmRlY29kZXJfc3BlY2lmaWNfaW5mbygpWzFdLCAweDEwKTsKLX0KLQotVEVTVChFU0Rlc2NyaXB0b3JUZXN0LCBOb25BQUNUZXN0KSB7Ci0gIEVTRGVzY3JpcHRvciBlc19kZXNjOwotICB1aW50OCBidWZmZXJbXSA9IHsKLSAgICAweDAzLCAweDE5LCAweDAwLCAweDAxLCAweDAwLCAweDA0LCAweDExLCAweDY2LAotICAgIDB4MTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNSwgMHgwMiwgMHgxMiwgMHgxMCwKLSAgICAweDA2LCAweDAxLCAweDAyCi0gIH07Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4PiBkYXRhOwotCi0gIGRhdGEuYXNzaWduKGJ1ZmZlciwgYnVmZmVyICsgc2l6ZW9mKGJ1ZmZlcikpOwotCi0gIEVYUEVDVF9UUlVFKGVzX2Rlc2MuUGFyc2UoZGF0YSkpOwotICBFWFBFQ1RfTkUoZXNfZGVzYy5vYmplY3RfdHlwZSgpLCBrSVNPXzE0NDk2XzMpOwotICBFWFBFQ1RfRVEoZXNfZGVzYy5kZWNvZGVyX3NwZWNpZmljX2luZm8oKS5zaXplKCksIDJ1KTsKLSAgRVhQRUNUX0VRKGVzX2Rlc2MuZGVjb2Rlcl9zcGVjaWZpY19pbmZvKClbMF0sIDB4MTIpOwotICBFWFBFQ1RfRVEoZXNfZGVzYy5kZWNvZGVyX3NwZWNpZmljX2luZm8oKVsxXSwgMHgxMCk7Ci19Ci0KLVRFU1QoRVNEZXNjcmlwdG9yVGVzdCwgTXVsdGlCeXRlTGVuZ3RoVGVzdCkgewotICBFU0Rlc2NyaXB0b3IgZXNfZGVzYzsKLSAgdWludDggYnVmZmVyW10gPSB7Ci0gICAgMHgwMywgMHg4MCwgMHgxOSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwNCwgMHg4MCwKLSAgICAweDgwLCAweDExLCAweDQwLCAweDE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDUsCi0gICAgMHg4MCwgMHg4MCwgMHg4MCwgMHgwMiwgMHgxMiwgMHgxMCwgMHgwNiwgMHgwMSwKLSAgICAweDAyCi0gIH07Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4PiBkYXRhOwotCi0gIGRhdGEuYXNzaWduKGJ1ZmZlciwgYnVmZmVyICsgc2l6ZW9mKGJ1ZmZlcikpOwotCi0gIEVYUEVDVF9UUlVFKGVzX2Rlc2MuUGFyc2UoZGF0YSkpOwotICBFWFBFQ1RfRVEoZXNfZGVzYy5vYmplY3RfdHlwZSgpLCBrSVNPXzE0NDk2XzMpOwotICBFWFBFQ1RfRVEoZXNfZGVzYy5kZWNvZGVyX3NwZWNpZmljX2luZm8oKS5zaXplKCksIDJ1KTsKLSAgRVhQRUNUX0VRKGVzX2Rlc2MuZGVjb2Rlcl9zcGVjaWZpY19pbmZvKClbMF0sIDB4MTIpOwotICBFWFBFQ1RfRVEoZXNfZGVzYy5kZWNvZGVyX3NwZWNpZmljX2luZm8oKVsxXSwgMHgxMCk7Ci19Ci0KLVRFU1QoRVNEZXNjcmlwdG9yVGVzdCwgRml2ZUJ5dGVMZW5ndGhUZXN0KSB7Ci0gIEVTRGVzY3JpcHRvciBlc19kZXNjOwotICB1aW50OCBidWZmZXJbXSA9IHsKLSAgICAweDAzLCAweDgwLCAweDE5LCAweDAwLCAweDAxLCAweDAwLCAweDA0LCAweDgwLAotICAgIDB4ODAsIDB4MTEsIDB4NDAsIDB4MTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNSwKLSAgICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDAyLCAweDEyLCAweDEwLCAweDA2LAotICAgIDB4MDEsIDB4MDIKLSAgfTsKLSAgc3RkOjp2ZWN0b3I8dWludDg+IGRhdGE7Ci0KLSAgZGF0YS5hc3NpZ24oYnVmZmVyLCBidWZmZXIgKyBzaXplb2YoYnVmZmVyKSk7Ci0KLSAgRVhQRUNUX1RSVUUoZXNfZGVzYy5QYXJzZShkYXRhKSk7Ci0gIEVYUEVDVF9FUShlc19kZXNjLm9iamVjdF90eXBlKCksIGtJU09fMTQ0OTZfMyk7Ci0gIEVYUEVDVF9FUShlc19kZXNjLmRlY29kZXJfc3BlY2lmaWNfaW5mbygpLnNpemUoKSwgMHUpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbXA0Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL21wNC9mb3VyY2NzLmggYi9zcmMvbWVkaWEvbXA0L2ZvdXJjY3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk4NmYzNC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvbXA0L2ZvdXJjY3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfTVA0X0ZPVVJDQ1NfSF8KLSNkZWZpbmUgTUVESUFfTVA0X0ZPVVJDQ1NfSF8KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotbmFtZXNwYWNlIG1lZGlhIHsKLW5hbWVzcGFjZSBtcDQgewotCi1lbnVtIEZvdXJDQyB7Ci0gIEZPVVJDQ19OVUxMID0gMCwKLSAgRk9VUkNDX0FWQzEgPSAweDYxNzY2MzMxLAotICBGT1VSQ0NfQVZDQyA9IDB4NjE3NjYzNDMsCi0gIEZPVVJDQ19DRU5DID0gMHg2MzY1NmU2MywKLSAgRk9VUkNDX0NPNjQgPSAweDYzNmYzNjM0LAotICBGT1VSQ0NfQ1RUUyA9IDB4NjM3NDc0NzMsCi0gIEZPVVJDQ19ESU5GID0gMHg2NDY5NmU2NiwKLSAgRk9VUkNDX0VEVFMgPSAweDY1NjQ3NDczLAotICBGT1VSQ0NfRUxTVCA9IDB4NjU2YzczNzQsCi0gIEZPVVJDQ19FTkNBID0gMHg2NTZlNjM2MSwKLSAgRk9VUkNDX0VOQ1YgPSAweDY1NmU2Mzc2LAotICBGT1VSQ0NfRVNEUyA9IDB4NjU3MzY0NzMsCi0gIEZPVVJDQ19GUkVFID0gMHg2NjcyNjU2NSwKLSAgRk9VUkNDX0ZSTUEgPSAweDY2NzI2ZDYxLAotICBGT1VSQ0NfRlRZUCA9IDB4NjY3NDc5NzAsCi0gIEZPVVJDQ19IRExSID0gMHg2ODY0NmM3MiwKLSAgRk9VUkNDX0hJTlQgPSAweDY4Njk2ZTc0LAotICBGT1VSQ0NfSU9EUyA9IDB4Njk2ZjY0NzMsCi0gIEZPVVJDQ19NREFUID0gMHg2ZDY0NjE3NCwKLSAgRk9VUkNDX01ESEQgPSAweDZkNjQ2ODY0LAotICBGT1VSQ0NfTURJQSA9IDB4NmQ2NDY5NjEsCi0gIEZPVVJDQ19NRUNPID0gMHg2ZDY1NjM2ZiwKLSAgRk9VUkNDX01FSEQgPSAweDZkNjU2ODY0LAotICBGT1VSQ0NfTUVUQSA9IDB4NmQ2NTc0NjEsCi0gIEZPVVJDQ19NRkhEID0gMHg2ZDY2Njg2NCwKLSAgRk9VUkNDX01GUkEgPSAweDZkNjY3MjYxLAotICBGT1VSQ0NfTUlORiA9IDB4NmQ2OTZlNjYsCi0gIEZPVVJDQ19NT09GID0gMHg2ZDZmNmY2NiwKLSAgRk9VUkNDX01PT1YgPSAweDZkNmY2Zjc2LAotICBGT1VSQ0NfTVA0QSA9IDB4NmQ3MDM0NjEsCi0gIEZPVVJDQ19NUDRWID0gMHg2ZDcwMzQ3NiwKLSAgRk9VUkNDX01WRVggPSAweDZkNzY2NTc4LAotICBGT1VSQ0NfTVZIRCA9IDB4NmQ3NjY4NjQsCi0gIEZPVVJDQ19QQVNQID0gMHg3MDYxNzM3MCwKLSAgRk9VUkNDX1BESU4gPSAweDcwNjQ2OTZlLAotICBGT1VSQ0NfUFJGVCA9IDB4NzA3MjY2NzQsCi0gIEZPVVJDQ19QU1NIID0gMHg3MDczNzM2OCwKLSAgRk9VUkNDX1NBSU8gPSAweDczNjE2OTZmLAotICBGT1VSQ0NfU0FJWiA9IDB4NzM2MTY5N2EsCi0gIEZPVVJDQ19TQ0hJID0gMHg3MzYzNjg2OSwKLSAgRk9VUkNDX1NDSE0gPSAweDczNjM2ODZkLAotICBGT1VSQ0NfU0RUUCA9IDB4NzM2NDc0NzAsCi0gIEZPVVJDQ19TSURYID0gMHg3MzY5NjQ3OCwKLSAgRk9VUkNDX1NJTkYgPSAweDczNjk2ZTY2LAotICBGT1VSQ0NfU0tJUCA9IDB4NzM2YjY5NzAsCi0gIEZPVVJDQ19TTUhEID0gMHg3MzZkNjg2NCwKLSAgRk9VUkNDX1NPVU4gPSAweDczNmY3NTZlLAotICBGT1VSQ0NfU1NJWCA9IDB4NzM3MzY5NzgsCi0gIEZPVVJDQ19TVEJMID0gMHg3Mzc0NjI2YywKLSAgRk9VUkNDX1NUQ08gPSAweDczNzQ2MzZmLAotICBGT1VSQ0NfU1RTQyA9IDB4NzM3NDczNjMsCi0gIEZPVVJDQ19TVFNEID0gMHg3Mzc0NzM2NCwKLSAgRk9VUkNDX1NUU1MgPSAweDczNzQ3MzczLAotICBGT1VSQ0NfU1RTWiA9IDB4NzM3NDczN2EsCi0gIEZPVVJDQ19TVFRTID0gMHg3Mzc0NzQ3MywKLSAgRk9VUkNDX1NUWVAgPSAweDczNzQ3OTcwLAotICBGT1VSQ0NfVEVOQyA9IDB4NzQ2NTZlNjMsCi0gIEZPVVJDQ19URkRUID0gMHg3NDY2NjQ3NCwKLSAgRk9VUkNDX1RGSEQgPSAweDc0NjY2ODY0LAotICBGT1VSQ0NfVEtIRCA9IDB4NzQ2YjY4NjQsCi0gIEZPVVJDQ19UUkFGID0gMHg3NDcyNjE2NiwKLSAgRk9VUkNDX1RSQUsgPSAweDc0NzI2MTZiLAotICBGT1VSQ0NfVFJFWCA9IDB4NzQ3MjY1NzgsCi0gIEZPVVJDQ19UUlVOID0gMHg3NDcyNzU2ZSwKLSAgRk9VUkNDX1VEVEEgPSAweDc1NjQ3NDYxLAotICBGT1VSQ0NfVVVJRCA9IDB4NzU3NTY5NjQsCi0gIEZPVVJDQ19WSURFID0gMHg3NjY5NjQ2NSwKLSAgRk9VUkNDX1ZNSEQgPSAweDc2NmQ2ODY0LAotICBGT1VSQ0NfV0lERSA9IDB4Nzc2OTY0NjUsCi19OwotCi1jb25zdCBpbmxpbmUgc3RkOjpzdHJpbmcgRm91ckNDVG9TdHJpbmcoRm91ckNDIGZvdXJjYykgewotICBjaGFyIGJ1Zls1XTsKLSAgYnVmWzBdID0gKGZvdXJjYyA+PiAyNCkgJiAweGZmOwotICBidWZbMV0gPSAoZm91cmNjID4+IDE2KSAmIDB4ZmY7Ci0gIGJ1ZlsyXSA9IChmb3VyY2MgPj4gOCkgJiAweGZmOwotICBidWZbM10gPSAoZm91cmNjKSAmIDB4ZmY7Ci0gIGJ1Zls0XSA9IDA7Ci0gIHJldHVybiBzdGQ6OnN0cmluZyhidWYpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbXA0Ci19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9NUDRfRk9VUkNDU19IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL21wNC9tcDRfc3RyZWFtX3BhcnNlci5jYyBiL3NyYy9tZWRpYS9tcDQvbXA0X3N0cmVhbV9wYXJzZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MzM5ZmYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL21wNC9tcDRfc3RyZWFtX3BhcnNlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDU3MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvbXA0L21wNF9zdHJlYW1fcGFyc2VyLmgiCi0KLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFja19oZWxwZXJzLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS90aW1lLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19kZWNvZGVyX2NvbmZpZy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc3RyZWFtX3BhcnNlcl9idWZmZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXJfY29uZmlnLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb190eXBlcy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fdXRpbC5oIgotI2luY2x1ZGUgIm1lZGlhL21wNC9ib3hfZGVmaW5pdGlvbnMuaCIKLSNpbmNsdWRlICJtZWRpYS9tcDQvYm94X3JlYWRlci5oIgotI2luY2x1ZGUgIm1lZGlhL21wNC9lc19kZXNjcmlwdG9yLmgiCi0jaW5jbHVkZSAibWVkaWEvbXA0L3JjaGVjay5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotbmFtZXNwYWNlIG1wNCB7Ci0KLS8vIFRPRE8oeGh3YW5nKTogRmlndXJlIG91dCB0aGUgaW5pdCBkYXRhIHR5cGUgYXBwcm9wcmlhdGVseSBvbmNlIGl0J3Mgc3BlYydlZC4KLXN0YXRpYyBjb25zdCBjaGFyIGtNcDRJbml0RGF0YVR5cGVbXSA9ICJ2aWRlby9tcDQiOwotCi1NUDRTdHJlYW1QYXJzZXI6Ok1QNFN0cmVhbVBhcnNlcihib29sIGhhc19zYnIpCi0gICAgOiBzdGF0ZV8oa1dhaXRpbmdGb3JJbml0KSwKLSAgICAgIG1vb2ZfaGVhZF8oMCksCi0gICAgICBtZGF0X3RhaWxfKDApLAotICAgICAgaGFzX2F1ZGlvXyhmYWxzZSksCi0gICAgICBoYXNfdmlkZW9fKGZhbHNlKSwKLSAgICAgIGF1ZGlvX3RyYWNrX2lkXygwKSwKLSAgICAgIHZpZGVvX3RyYWNrX2lkXygwKSwKLSAgICAgIGhhc19zYnJfKGhhc19zYnIpLAotICAgICAgaXNfYXVkaW9fdHJhY2tfZW5jcnlwdGVkXyhmYWxzZSksCi0gICAgICBpc192aWRlb190cmFja19lbmNyeXB0ZWRfKGZhbHNlKSB7Ci19Ci0KLU1QNFN0cmVhbVBhcnNlcjo6fk1QNFN0cmVhbVBhcnNlcigpIHt9Ci0KLXZvaWQgTVA0U3RyZWFtUGFyc2VyOjpJbml0KGNvbnN0IEluaXRDQiYgaW5pdF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5ld0NvbmZpZ0NCJiBjb25maWdfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOZXdCdWZmZXJzQ0ImIGF1ZGlvX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmV3QnVmZmVyc0NCJiB2aWRlb19jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5lZWRLZXlDQiYgbmVlZF9rZXlfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOZXdNZWRpYVNlZ21lbnRDQiYgbmV3X3NlZ21lbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiBlbmRfb2Zfc2VnbWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvZ0NCJiBsb2dfY2IpIHsKLSAgRENIRUNLX0VRKHN0YXRlXywga1dhaXRpbmdGb3JJbml0KTsKLSAgRENIRUNLKGluaXRfY2JfLmlzX251bGwoKSk7Ci0gIERDSEVDSyghaW5pdF9jYi5pc19udWxsKCkpOwotICBEQ0hFQ0soIWNvbmZpZ19jYi5pc19udWxsKCkpOwotICBEQ0hFQ0soIWF1ZGlvX2NiLmlzX251bGwoKSB8fCAhdmlkZW9fY2IuaXNfbnVsbCgpKTsKLSAgRENIRUNLKCFuZWVkX2tleV9jYi5pc19udWxsKCkpOwotICBEQ0hFQ0soIWVuZF9vZl9zZWdtZW50X2NiLmlzX251bGwoKSk7Ci0KLSAgQ2hhbmdlU3RhdGUoa1BhcnNpbmdCb3hlcyk7Ci0gIGluaXRfY2JfID0gaW5pdF9jYjsKLSAgY29uZmlnX2NiXyA9IGNvbmZpZ19jYjsKLSAgYXVkaW9fY2JfID0gYXVkaW9fY2I7Ci0gIHZpZGVvX2NiXyA9IHZpZGVvX2NiOwotICBuZWVkX2tleV9jYl8gPSBuZWVkX2tleV9jYjsKLSAgbmV3X3NlZ21lbnRfY2JfID0gbmV3X3NlZ21lbnRfY2I7Ci0gIGVuZF9vZl9zZWdtZW50X2NiXyA9IGVuZF9vZl9zZWdtZW50X2NiOwotICBsb2dfY2JfID0gbG9nX2NiOwotfQotCi12b2lkIE1QNFN0cmVhbVBhcnNlcjo6UmVzZXQoKSB7Ci0gIHF1ZXVlXy5SZXNldCgpOwotICBtb292Xy5yZXNldCgpOwotICBydW5zXy5yZXNldCgpOwotICBtb29mX2hlYWRfID0gMDsKLSAgbWRhdF90YWlsXyA9IDA7Ci19Ci0KLXZvaWQgTVA0U3RyZWFtUGFyc2VyOjpGbHVzaCgpIHsKLSAgRENIRUNLX05FKHN0YXRlXywga1dhaXRpbmdGb3JJbml0KTsKLSAgUmVzZXQoKTsKLSAgQ2hhbmdlU3RhdGUoa1BhcnNpbmdCb3hlcyk7Ci19Ci0KLWJvb2wgTVA0U3RyZWFtUGFyc2VyOjpQYXJzZShjb25zdCB1aW50OCogYnVmLCBpbnQgc2l6ZSkgewotICBEQ0hFQ0tfTkUoc3RhdGVfLCBrV2FpdGluZ0ZvckluaXQpOwotCi0gIGlmIChzdGF0ZV8gPT0ga0Vycm9yKQotICAgIHJldHVybiBmYWxzZTsKLQotICBxdWV1ZV8uUHVzaChidWYsIHNpemUpOwotCi0gIEJ1ZmZlclF1ZXVlIGF1ZGlvX2J1ZmZlcnM7Ci0gIEJ1ZmZlclF1ZXVlIHZpZGVvX2J1ZmZlcnM7Ci0KLSAgYm9vbCByZXN1bHQsIGVyciA9IGZhbHNlOwotCi0gIGRvIHsKLSAgICBpZiAoc3RhdGVfID09IGtQYXJzaW5nQm94ZXMpIHsKLSAgICAgIHJlc3VsdCA9IFBhcnNlQm94KCZlcnIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBEQ0hFQ0tfRVEoa0VtaXR0aW5nU2FtcGxlcywgc3RhdGVfKTsKLSAgICAgIHJlc3VsdCA9IEVucXVldWVTYW1wbGUoJmF1ZGlvX2J1ZmZlcnMsICZ2aWRlb19idWZmZXJzLCAmZXJyKTsKLSAgICAgIGlmIChyZXN1bHQpIHsKLSAgICAgICAgaW50NjQgbWF4X2NsZWFyID0gcnVuc18tPkdldE1heENsZWFyT2Zmc2V0KCkgKyBtb29mX2hlYWRfOwotICAgICAgICBlcnIgPSAhUmVhZEFuZERpc2NhcmRNREFUc1VudGlsKG1heF9jbGVhcik7Ci0gICAgICB9Ci0gICAgfQotICB9IHdoaWxlIChyZXN1bHQgJiYgIWVycik7Ci0KLSAgaWYgKCFlcnIpCi0gICAgZXJyID0gIVNlbmRBbmRGbHVzaFNhbXBsZXMoJmF1ZGlvX2J1ZmZlcnMsICZ2aWRlb19idWZmZXJzKTsKLQotICBpZiAoZXJyKSB7Ci0gICAgRExPRyhFUlJPUikgPDwgIkVycm9yIHdoaWxlIHBhcnNpbmcgTVA0IjsKLSAgICBSZXNldCgpOwotICAgIENoYW5nZVN0YXRlKGtFcnJvcik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgTVA0U3RyZWFtUGFyc2VyOjpQYXJzZUJveChib29sKiBlcnIpIHsKLSAgY29uc3QgdWludDgqIGJ1ZjsKLSAgaW50IHNpemU7Ci0gIHF1ZXVlXy5QZWVrKCZidWYsICZzaXplKTsKLSAgaWYgKCFzaXplKSByZXR1cm4gZmFsc2U7Ci0KLSAgc2NvcGVkX3B0cjxCb3hSZWFkZXI+IHJlYWRlcigKLSAgICAgIEJveFJlYWRlcjo6UmVhZFRvcExldmVsQm94KGJ1Ziwgc2l6ZSwgbG9nX2NiXywgZXJyKSk7Ci0gIGlmIChyZWFkZXIuZ2V0KCkgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChyZWFkZXItPnR5cGUoKSA9PSBGT1VSQ0NfTU9PVikgewotICAgICplcnIgPSAhUGFyc2VNb292KHJlYWRlci5nZXQoKSk7Ci0gIH0gZWxzZSBpZiAocmVhZGVyLT50eXBlKCkgPT0gRk9VUkNDX01PT0YpIHsKLSAgICBtb29mX2hlYWRfID0gcXVldWVfLmhlYWQoKTsKLSAgICAqZXJyID0gIVBhcnNlTW9vZihyZWFkZXIuZ2V0KCkpOwotCi0gICAgLy8gU2V0IHVwIGZpcnN0IG1kYXQgb2Zmc2V0IGZvciBSZWFkTURBVHNVbnRpbCgpLgotICAgIG1kYXRfdGFpbF8gPSBxdWV1ZV8uaGVhZCgpICsgcmVhZGVyLT5zaXplKCk7Ci0KLSAgICAvLyBSZXR1cm4gZWFybHkgdG8gYXZvaWQgZXZpY3RpbmcgJ21vb2YnIGRhdGEgZnJvbSBxdWV1ZS4gQXV4aWxpYXJ5IGluZm8gbWF5Ci0gICAgLy8gYmUgbG9jYXRlZCBhbnl3aGVyZSBpbiB0aGUgZmlsZSwgaW5jbHVkaW5nIGluc2lkZSB0aGUgJ21vb2YnIGl0c2VsZi4KLSAgICAvLyAoU2luY2UgJ2RlZmF1bHQtYmFzZS1pcy1tb29mJyBpcyBtYW5kYXRlZCwgbm8gZGF0YSByZWZlcmVuY2VzIGNhbiBjb21lCi0gICAgLy8gYmVmb3JlIHRoZSBoZWFkIG9mIHRoZSAnbW9vZicsIHNvIGtlZXBpbmcgdGhpcyBib3ggYXJvdW5kIGlzIHN1ZmZpY2llbnQuKQotICAgIHJldHVybiAhKCplcnIpOwotICB9IGVsc2UgewotICAgIE1FRElBX0xPRyhsb2dfY2JfKSA8PCAiU2tpcHBpbmcgdW5yZWNvZ25pemVkIHRvcC1sZXZlbCBib3g6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgRm91ckNDVG9TdHJpbmcocmVhZGVyLT50eXBlKCkpOwotICB9Ci0KLSAgcXVldWVfLlBvcChyZWFkZXItPnNpemUoKSk7Ci0gIHJldHVybiAhKCplcnIpOwotfQotCi0KLWJvb2wgTVA0U3RyZWFtUGFyc2VyOjpQYXJzZU1vb3YoQm94UmVhZGVyKiByZWFkZXIpIHsKLSAgbW9vdl8ucmVzZXQobmV3IE1vdmllKTsKLSAgUkNIRUNLKG1vb3ZfLT5QYXJzZShyZWFkZXIpKTsKLSAgcnVuc18ucmVzZXQobmV3IFRyYWNrUnVuSXRlcmF0b3IobW9vdl8uZ2V0KCksIGxvZ19jYl8pKTsKLQotICBoYXNfYXVkaW9fID0gZmFsc2U7Ci0gIGhhc192aWRlb18gPSBmYWxzZTsKLQotICBBdWRpb0RlY29kZXJDb25maWcgYXVkaW9fY29uZmlnOwotICBWaWRlb0RlY29kZXJDb25maWcgdmlkZW9fY29uZmlnOwotCi0gIGZvciAoc3RkOjp2ZWN0b3I8VHJhY2s+Ojpjb25zdF9pdGVyYXRvciB0cmFjayA9IG1vb3ZfLT50cmFja3MuYmVnaW4oKTsKLSAgICAgICB0cmFjayAhPSBtb292Xy0+dHJhY2tzLmVuZCgpOyArK3RyYWNrKSB7Ci0gICAgLy8gVE9ETyhzdHJvYmUpOiBPbmx5IHRoZSBmaXJzdCBhdWRpbyBhbmQgdmlkZW8gdHJhY2sgcHJlc2VudCBpbiBhIGZpbGUgYXJlCi0gICAgLy8gdXNlZC4gKFRyYWNrIHNlbGVjdGlvbiBpcyBiZXR0ZXIgYWNjb21wbGlzaGVkIHZpYSBTb3VyY2UgSURzLCB0aG91Z2gsIHNvCi0gICAgLy8gYWRkaW5nIHN1cHBvcnQgZm9yIHRyYWNrIHNlbGVjdGlvbiB3aXRoaW4gYSBzdHJlYW0gaXMgbG93LXByaW9yaXR5LikKLSAgICBjb25zdCBTYW1wbGVEZXNjcmlwdGlvbiYgc2FtcF9kZXNjciA9Ci0gICAgICAgIHRyYWNrLT5tZWRpYS5pbmZvcm1hdGlvbi5zYW1wbGVfdGFibGUuZGVzY3JpcHRpb247Ci0KLSAgICAvLyBUT0RPKHN0cm9iZSk6IFdoZW4gY29kZWMgcmVjb25maWd1cmF0aW9ucyBhcmUgc3VwcG9ydGVkLCBkZXRlY3QgYW5kIHNlbmQKLSAgICAvLyBhIGNvZGVjIHJlY29uZmlndXJhdGlvbiBmb3IgZnJhZ21lbnRzIHVzaW5nIGEgc2FtcGxlIGRlc2NyaXB0aW9uIGluZGV4Ci0gICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIHByZXZpb3VzIG9uZQotICAgIHNpemVfdCBkZXNjX2lkeCA9IDA7Ci0gICAgZm9yIChzaXplX3QgdCA9IDA7IHQgPCBtb292Xy0+ZXh0ZW5kcy50cmFja3Muc2l6ZSgpOyB0KyspIHsKLSAgICAgIGNvbnN0IFRyYWNrRXh0ZW5kcyYgdHJleCA9IG1vb3ZfLT5leHRlbmRzLnRyYWNrc1t0XTsKLSAgICAgIGlmICh0cmV4LnRyYWNrX2lkID09IHRyYWNrLT5oZWFkZXIudHJhY2tfaWQpIHsKLSAgICAgICAgZGVzY19pZHggPSB0cmV4LmRlZmF1bHRfc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgUkNIRUNLKGRlc2NfaWR4ID4gMCk7Ci0gICAgZGVzY19pZHggLT0gMTsgIC8vIEJNRkYgZGVzY3JpcHRvciBpbmRleCBpcyBvbmUtYmFzZWQKLQotICAgIGlmICh0cmFjay0+bWVkaWEuaGFuZGxlci50eXBlID09IGtBdWRpbyAmJiAhYXVkaW9fY29uZmlnLklzVmFsaWRDb25maWcoKSkgewotICAgICAgUkNIRUNLKCFzYW1wX2Rlc2NyLmF1ZGlvX2VudHJpZXMuZW1wdHkoKSk7Ci0KLSAgICAgIC8vIEl0IGlzIG5vdCB1bmNvbW1vbiB0byBmaW5kIG90aGVyd2lzZS12YWxpZCBmaWxlcyB3aXRoIGluY29ycmVjdCBzYW1wbGUKLSAgICAgIC8vIGRlc2NyaXB0aW9uIGluZGljZXMsIHNvIHdlIGZhaWwgZ3JhY2VmdWxseSBpbiB0aGF0IGNhc2UuCi0gICAgICBpZiAoZGVzY19pZHggPj0gc2FtcF9kZXNjci5hdWRpb19lbnRyaWVzLnNpemUoKSkKLSAgICAgICAgZGVzY19pZHggPSAwOwotICAgICAgY29uc3QgQXVkaW9TYW1wbGVFbnRyeSYgZW50cnkgPSBzYW1wX2Rlc2NyLmF1ZGlvX2VudHJpZXNbZGVzY19pZHhdOwotICAgICAgY29uc3QgQUFDJiBhYWMgPSBlbnRyeS5lc2RzLmFhYzsKLQotICAgICAgaWYgKCEoZW50cnkuZm9ybWF0ID09IEZPVVJDQ19NUDRBIHx8Ci0gICAgICAgICAgICAoZW50cnkuZm9ybWF0ID09IEZPVVJDQ19FTkNBICYmCi0gICAgICAgICAgICAgZW50cnkuc2luZi5mb3JtYXQuZm9ybWF0ID09IEZPVVJDQ19NUDRBKSkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5zdXBwb3J0ZWQgYXVkaW8gZm9ybWF0LiI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIC8vIENoZWNrIGlmIGl0IGlzIE1QRUc0IEFBQyBkZWZpbmVkIGluIElTTyAxNDQ5NiBQYXJ0IDMuCi0gICAgICBpZiAoZW50cnkuZXNkcy5vYmplY3RfdHlwZSAhPSBrSVNPXzE0NDk2XzMpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5zdXBwb3J0ZWQgYXVkaW8gb2JqZWN0IHR5cGUuIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBpc19hdWRpb190cmFja19lbmNyeXB0ZWRfID0gZW50cnkuc2luZi5pbmZvLnRyYWNrX2VuY3J5cHRpb24uaXNfZW5jcnlwdGVkOwotICAgICAgRFZMT0coMSkgPDwgImlzX2F1ZGlvX3RyYWNrX2VuY3J5cHRlZF86ICIgPDwgaXNfYXVkaW9fdHJhY2tfZW5jcnlwdGVkXzsKLSAgICAgIGF1ZGlvX2NvbmZpZy5Jbml0aWFsaXplKAotICAgICAgICAgIGtDb2RlY0FBQywgZW50cnkuc2FtcGxlc2l6ZSwgYWFjLmNoYW5uZWxfbGF5b3V0KCksCi0gICAgICAgICAgYWFjLkdldE91dHB1dFNhbXBsZXNQZXJTZWNvbmQoaGFzX3Nicl8pLAotICAgICAgICAgIGFhYy5yYXdfZGF0YSgpLmVtcHR5KCkgPyBOVUxMIDogJmFhYy5yYXdfZGF0YSgpLmZyb250KCksCi0gICAgICAgICAgYWFjLnJhd19kYXRhKCkuc2l6ZSgpLCBpc19hdWRpb190cmFja19lbmNyeXB0ZWRfLCBmYWxzZSk7Ci0gICAgICBoYXNfYXVkaW9fID0gdHJ1ZTsKLSAgICAgIGF1ZGlvX3RyYWNrX2lkXyA9IHRyYWNrLT5oZWFkZXIudHJhY2tfaWQ7Ci0gICAgfQotICAgIGlmICh0cmFjay0+bWVkaWEuaGFuZGxlci50eXBlID09IGtWaWRlbyAmJiAhdmlkZW9fY29uZmlnLklzVmFsaWRDb25maWcoKSkgewotICAgICAgUkNIRUNLKCFzYW1wX2Rlc2NyLnZpZGVvX2VudHJpZXMuZW1wdHkoKSk7Ci0gICAgICBpZiAoZGVzY19pZHggPj0gc2FtcF9kZXNjci52aWRlb19lbnRyaWVzLnNpemUoKSkKLSAgICAgICAgZGVzY19pZHggPSAwOwotICAgICAgY29uc3QgVmlkZW9TYW1wbGVFbnRyeSYgZW50cnkgPSBzYW1wX2Rlc2NyLnZpZGVvX2VudHJpZXNbZGVzY19pZHhdOwotCi0gICAgICBpZiAoIShlbnRyeS5mb3JtYXQgPT0gRk9VUkNDX0FWQzEgfHwKLSAgICAgICAgICAgIChlbnRyeS5mb3JtYXQgPT0gRk9VUkNDX0VOQ1YgJiYKLSAgICAgICAgICAgICBlbnRyeS5zaW5mLmZvcm1hdC5mb3JtYXQgPT0gRk9VUkNDX0FWQzEpKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJVbnN1cHBvcnRlZCB2aWRlbyBmb3JtYXQuIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICAvLyBUT0RPKHN0cm9iZSk6IFJlY292ZXIgY29ycmVjdCBjcm9wIGJveAotICAgICAgZ2Z4OjpTaXplIGNvZGVkX3NpemUoZW50cnkud2lkdGgsIGVudHJ5LmhlaWdodCk7Ci0gICAgICBnZng6OlJlY3QgdmlzaWJsZV9yZWN0KGNvZGVkX3NpemUpOwotICAgICAgZ2Z4OjpTaXplIG5hdHVyYWxfc2l6ZSA9IEdldE5hdHVyYWxTaXplKHZpc2libGVfcmVjdC5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkucGl4ZWxfYXNwZWN0Lmhfc3BhY2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5waXhlbF9hc3BlY3Qudl9zcGFjaW5nKTsKLSAgICAgIGlzX3ZpZGVvX3RyYWNrX2VuY3J5cHRlZF8gPSBlbnRyeS5zaW5mLmluZm8udHJhY2tfZW5jcnlwdGlvbi5pc19lbmNyeXB0ZWQ7Ci0gICAgICBEVkxPRygxKSA8PCAiaXNfdmlkZW9fdHJhY2tfZW5jcnlwdGVkXzogIiA8PCBpc192aWRlb190cmFja19lbmNyeXB0ZWRfOwotI2lmIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLSAgICAgIC8vIFZpZGVvRGVjb2RlckNvbmZpZzo6TWF0Y2hlcygpIG9ubHkgY29tcGFyZXMgdGhpbmdzIGxpa2UgcHJvZmlsZSBhbmQKLSAgICAgIC8vIHJlc29sdXRpb24uIFNvIGl0IGNhbm5vdCBjYXRjaCB0aGUgZGlmZmVyZW5jZSBmb3Igc3VidGxlIGNoYW5nZXMgb24KLSAgICAgIC8vIHRoaW5ncyBsaWtlIGludGVyZmFjZSBtb2RlLiBOb3cgd2Ugc2VuZCBmdWxsIHNwcy9wcHMgaW5mb3JtYXRpb24gYXMKLSAgICAgIC8vIGV4dHJhIGRhdGEgYXMgdGhpcyBhbHNvIGdldHMgY29tcGFyZWQgaW5zaWRlCi0gICAgICAvLyBWaWRlb0RlY29kZXJDb25maWc6Ok1hdGNoZXMoKS4KLSAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4PiBwYXJhbV9zZXRzOwotICAgICAgUkNIRUNLKEFWQzo6Q29udmVydENvbmZpZ1RvQW5uZXhCKGVudHJ5LmF2Y2MsICZwYXJhbV9zZXRzKSk7Ci0gICAgICB2aWRlb19jb25maWcuSW5pdGlhbGl6ZShrQ29kZWNIMjY0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFBST0ZJTEVfTUFJTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvRnJhbWU6Ok5BVElWRV9URVhUVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MT1JfU1BBQ0VfSERfUkVDNzA5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGVfcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdHVyYWxfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbV9zZXRzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc2V0cy5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc192aWRlb190cmFja19lbmNyeXB0ZWRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0jZWxzZQotICAgICAgdmlkZW9fY29uZmlnLkluaXRpYWxpemUoa0NvZGVjSDI2NCwgSDI2NFBST0ZJTEVfTUFJTiwgIFZpZGVvRnJhbWU6OllWMTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xPUl9TUEFDRV9IRF9SRUM3MDksIGNvZGVkX3NpemUsIHZpc2libGVfcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdHVyYWxfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGRlY29kZXItc3BlY2lmaWMgYnVmZmVyIG5lZWRlZCBmb3IgQVZDOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU1BTL1BQUyBhcmUgZW1iZWRkZWQgaW4gdGhlIHZpZGVvIHN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgaXNfdmlkZW9fdHJhY2tfZW5jcnlwdGVkXywgdHJ1ZSk7Ci0jZW5kaWYKLSAgICAgIGhhc192aWRlb18gPSB0cnVlOwotICAgICAgdmlkZW9fdHJhY2tfaWRfID0gdHJhY2stPmhlYWRlci50cmFja19pZDsKLSAgICB9Ci0gIH0KLQotICBSQ0hFQ0soY29uZmlnX2NiXy5SdW4oYXVkaW9fY29uZmlnLCB2aWRlb19jb25maWcpKTsKLQotICBiYXNlOjpUaW1lRGVsdGEgZHVyYXRpb247Ci0gIGlmIChtb292Xy0+ZXh0ZW5kcy5oZWFkZXIuZnJhZ21lbnRfZHVyYXRpb24gPiAwKSB7Ci0gICAgZHVyYXRpb24gPSBUaW1lRGVsdGFGcm9tUmF0aW9uYWwobW9vdl8tPmV4dGVuZHMuaGVhZGVyLmZyYWdtZW50X2R1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vb3ZfLT5oZWFkZXIudGltZXNjYWxlKTsKLSAgfSBlbHNlIGlmIChtb292Xy0+aGVhZGVyLmR1cmF0aW9uID4gMCkgewotICAgIGR1cmF0aW9uID0gVGltZURlbHRhRnJvbVJhdGlvbmFsKG1vb3ZfLT5oZWFkZXIuZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9vdl8tPmhlYWRlci50aW1lc2NhbGUpOwotICB9IGVsc2UgewotICAgIGR1cmF0aW9uID0ga0luZmluaXRlRHVyYXRpb24oKTsKLSAgfQotCi0gIGlmICghaW5pdF9jYl8uaXNfbnVsbCgpKQotICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZpbml0X2NiXykuUnVuKHRydWUsIGR1cmF0aW9uKTsKLQotICBSQ0hFQ0soRW1pdE5lZWRLZXlJZk5lY2Vzc2FyeShtb292Xy0+cHNzaCkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBNUDRTdHJlYW1QYXJzZXI6OlBhcnNlTW9vZihCb3hSZWFkZXIqIHJlYWRlcikgewotICBSQ0hFQ0sobW9vdl8uZ2V0KCkpOyAgLy8gTXVzdCBhbHJlYWR5IGhhdmUgaW5pdGlhbGl6YXRpb24gc2VnbWVudAotICBNb3ZpZUZyYWdtZW50IG1vb2Y7Ci0gIFJDSEVDSyhtb29mLlBhcnNlKHJlYWRlcikpOwotICBSQ0hFQ0socnVuc18tPkluaXQobW9vZikpOwotICBSQ0hFQ0soRW1pdE5lZWRLZXlJZk5lY2Vzc2FyeShtb29mLnBzc2gpKTsKLSAgbmV3X3NlZ21lbnRfY2JfLlJ1bihydW5zXy0+R2V0TWluRGVjb2RlVGltZXN0YW1wKCkpOwotICBDaGFuZ2VTdGF0ZShrRW1pdHRpbmdTYW1wbGVzKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgTVA0U3RyZWFtUGFyc2VyOjpFbWl0TmVlZEtleUlmTmVjZXNzYXJ5KAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFByb3RlY3Rpb25TeXN0ZW1TcGVjaWZpY0hlYWRlcj4mIGhlYWRlcnMpIHsKLSAgLy8gVE9ETyhzdHJvYmUpOiBlbnN1cmUgdGhhdCB0aGUgdmFsdWUgb2YgaW5pdF9kYXRhIChhbGwgUFNTSCBoZWFkZXJzCi0gIC8vIGNvbmNhdGVuYXRlZCBpbiBhcmJpdHJhcnkgb3JkZXIpIG1hdGNoZXMgdGhlIEVNRSBzcGVjLgotICAvLyBTZWUgaHR0cHM6Ly93d3cudzMub3JnL0J1Z3MvUHVibGljL3Nob3dfYnVnLmNnaT9pZD0xNzY3My4KLSAgaWYgKGhlYWRlcnMuZW1wdHkoKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzaXplX3QgdG90YWxfc2l6ZSA9IDA7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVhZGVycy5zaXplKCk7IGkrKykKLSAgICB0b3RhbF9zaXplICs9IGhlYWRlcnNbaV0ucmF3X2JveC5zaXplKCk7Ci0KLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiBpbml0X2RhdGEobmV3IHVpbnQ4W3RvdGFsX3NpemVdKTsKLSAgc2l6ZV90IHBvcyA9IDA7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVhZGVycy5zaXplKCk7IGkrKykgewotICAgIG1lbWNweSgmaW5pdF9kYXRhLmdldCgpW3Bvc10sICZoZWFkZXJzW2ldLnJhd19ib3hbMF0sCi0gICAgICAgICAgIGhlYWRlcnNbaV0ucmF3X2JveC5zaXplKCkpOwotICAgIHBvcyArPSBoZWFkZXJzW2ldLnJhd19ib3guc2l6ZSgpOwotICB9Ci0gIHJldHVybiBuZWVkX2tleV9jYl8uUnVuKGtNcDRJbml0RGF0YVR5cGUsIGluaXRfZGF0YS5QYXNzKCksIHRvdGFsX3NpemUpOwotfQotCi1ib29sIE1QNFN0cmVhbVBhcnNlcjo6UHJlcGFyZUFWQ0J1ZmZlcigKLSAgICBjb25zdCBBVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZCYgYXZjX2NvbmZpZywKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OD4qIGZyYW1lX2J1ZiwKLSAgICBzdGQ6OnZlY3RvcjxTdWJzYW1wbGVFbnRyeT4qIHN1YnNhbXBsZXMpIGNvbnN0IHsKLSAgLy8gQ29udmVydCB0aGUgQVZDIE5BTFUgbGVuZ3RoIGZpZWxkcyB0byBBbm5leCBCIGhlYWRlcnMsIGFzIGV4cGVjdGVkIGJ5Ci0gIC8vIGRlY29kaW5nIGxpYnJhcmllcy4gU2luY2UgdGhpcyBtYXkgZW5sYXJnZSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyLCB3ZSBhbHNvCi0gIC8vIHVwZGF0ZSB0aGUgY2xlYXIgYnl0ZSBjb3VudCBmb3IgZWFjaCBzdWJzYW1wbGUgaWYgZW5jcnlwdGlvbiBpcyB1c2VkIHRvCi0gIC8vIGFjY291bnQgZm9yIHRoZSBkaWZmZXJlbmNlIGluIHNpemUgYmV0d2VlbiB0aGUgbGVuZ3RoIHByZWZpeCBhbmQgQW5uZXggQgotICAvLyBzdGFydCBjb2RlLgotICBSQ0hFQ0soQVZDOjpDb252ZXJ0RnJhbWVUb0FubmV4QihhdmNfY29uZmlnLmxlbmd0aF9zaXplLCBmcmFtZV9idWYpKTsKLSAgaWYgKCFzdWJzYW1wbGVzLT5lbXB0eSgpKSB7Ci0gICAgY29uc3QgaW50IG5hbHVfc2l6ZV9kaWZmID0gNCAtIGF2Y19jb25maWcubGVuZ3RoX3NpemU7Ci0gICAgc2l6ZV90IGV4cGVjdGVkX3NpemUgPSBydW5zXy0+c2FtcGxlX3NpemUoKSArCi0gICAgICAgIHN1YnNhbXBsZXMtPnNpemUoKSAqIG5hbHVfc2l6ZV9kaWZmOwotICAgIFJDSEVDSyhmcmFtZV9idWYtPnNpemUoKSA9PSBleHBlY3RlZF9zaXplKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN1YnNhbXBsZXMtPnNpemUoKTsgaSsrKQotICAgICAgKCpzdWJzYW1wbGVzKVtpXS5jbGVhcl9ieXRlcyArPSBuYWx1X3NpemVfZGlmZjsKLSAgfQotICBjb25zdCBib29sIHByZXBlbmRfaGVhZGVyID0gcnVuc18tPmlzX2tleWZyYW1lKCk7Ci0gIGlmIChwcmVwZW5kX2hlYWRlcikgewotICAgIC8vIElmIHRoaXMgaXMgYSBrZXlmcmFtZSwgd2UgKHJlLSlpbmplY3QgU1BTIGFuZCBQUFMgaGVhZGVycyBhdCB0aGUgc3RhcnQgb2YKLSAgICAvLyBhIGZyYW1lLiBJZiBzdWJzYW1wbGUgaW5mbyBpcyBwcmVzZW50LCB3ZSBhbHNvIHVwZGF0ZSB0aGUgY2xlYXIgYnl0ZQotICAgIC8vIGNvdW50IGZvciB0aGF0IGZpcnN0IHN1YnNhbXBsZS4KLSAgICBzdGQ6OnZlY3Rvcjx1aW50OD4gcGFyYW1fc2V0czsKLSAgICBSQ0hFQ0soQVZDOjpDb252ZXJ0Q29uZmlnVG9Bbm5leEIoYXZjX2NvbmZpZywgJnBhcmFtX3NldHMpKTsKLSAgICBmcmFtZV9idWYtPmluc2VydChmcmFtZV9idWYtPmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc2V0cy5iZWdpbigpLCBwYXJhbV9zZXRzLmVuZCgpKTsKLSAgICBpZiAoIXN1YnNhbXBsZXMtPmVtcHR5KCkpCi0gICAgICAoKnN1YnNhbXBsZXMpWzBdLmNsZWFyX2J5dGVzICs9IHBhcmFtX3NldHMuc2l6ZSgpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIE1QNFN0cmVhbVBhcnNlcjo6UHJlcGFyZUFBQ0J1ZmZlcigKLSAgICBjb25zdCBBQUMmIGFhY19jb25maWcsIHN0ZDo6dmVjdG9yPHVpbnQ4PiogZnJhbWVfYnVmLAotICAgIHN0ZDo6dmVjdG9yPFN1YnNhbXBsZUVudHJ5Piogc3Vic2FtcGxlcykgY29uc3QgewotI2lmICFkZWZpbmVkKENPQkFMVF9XSU4pCi0gIC8vIEFwcGVuZCBhbiBBRFRTIGhlYWRlciB0byBldmVyeSBhdWRpbyBzYW1wbGUuCi0gIFJDSEVDSyhhYWNfY29uZmlnLkNvbnZlcnRFc2RzVG9BRFRTKGZyYW1lX2J1ZikpOwotCi0gIC8vIEFzIGFib3ZlLCBhZGp1c3Qgc3Vic2FtcGxlIGluZm9ybWF0aW9uIHRvIGFjY291bnQgZm9yIHRoZSBoZWFkZXJzLiBBQUMgaXMKLSAgLy8gbm90IHJlcXVpcmVkIHRvIHVzZSBzdWJzYW1wbGUgZW5jcnlwdGlvbiwgc28gd2UgbWF5IG5lZWQgdG8gYWRkIGFuIGVudHJ5LgotICBpZiAoc3Vic2FtcGxlcy0+ZW1wdHkoKSkgewotICAgIFN1YnNhbXBsZUVudHJ5IGVudHJ5OwotICAgIGVudHJ5LmNsZWFyX2J5dGVzID0gQUFDOjprQURUU0hlYWRlclNpemU7Ci0gICAgZW50cnkuY3lwaGVyX2J5dGVzID0gZnJhbWVfYnVmLT5zaXplKCkgLSBBQUM6OmtBRFRTSGVhZGVyU2l6ZTsKLSAgICBzdWJzYW1wbGVzLT5wdXNoX2JhY2soZW50cnkpOwotICB9IGVsc2UgewotICAgICgqc3Vic2FtcGxlcylbMF0uY2xlYXJfYnl0ZXMgKz0gQUFDOjprQURUU0hlYWRlclNpemU7Ci0gIH0KLSNlbmRpZiAgLy8gIWRlZmluZWQoQ09CQUxUX1dJTikKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgTVA0U3RyZWFtUGFyc2VyOjpFbnF1ZXVlU2FtcGxlKEJ1ZmZlclF1ZXVlKiBhdWRpb19idWZmZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyUXVldWUqIHZpZGVvX2J1ZmZlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBlcnIpIHsKLSAgaWYgKCFydW5zXy0+SXNSdW5WYWxpZCgpKSB7Ci0gICAgLy8gRmx1c2ggYW55IGJ1ZmZlcnMgd2UndmUgZ290dGVuIGluIHRoaXMgY2h1bmsgc28gdGhhdCBidWZmZXJzIGRvbid0Ci0gICAgLy8gY3Jvc3MgTmV3U2VnbWVudCgpIGNhbGxzCi0gICAgKmVyciA9ICFTZW5kQW5kRmx1c2hTYW1wbGVzKGF1ZGlvX2J1ZmZlcnMsIHZpZGVvX2J1ZmZlcnMpOwotICAgIGlmICgqZXJyKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gUmVtYWluIGluIGtFbnF1ZXVlaW5nU2FtcGxlcyBzdGF0ZSwgZGlzY2FyZGluZyBkYXRhLCB1bnRpbCB0aGUgZW5kIG9mCi0gICAgLy8gdGhlIGN1cnJlbnQgJ21kYXQnIGJveCBoYXMgYmVlbiBhcHBlbmRlZCB0byB0aGUgcXVldWUuCi0gICAgaWYgKCFxdWV1ZV8uVHJpbShtZGF0X3RhaWxfKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIENoYW5nZVN0YXRlKGtQYXJzaW5nQm94ZXMpOwotICAgIGVuZF9vZl9zZWdtZW50X2NiXy5SdW4oKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGlmICghcnVuc18tPklzU2FtcGxlVmFsaWQoKSkgewotICAgIHJ1bnNfLT5BZHZhbmNlUnVuKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBEQ0hFQ0soISgqZXJyKSk7Ci0KLSAgY29uc3QgdWludDgqIGJ1ZjsKLSAgaW50IGJ1Zl9zaXplOwotICBxdWV1ZV8uUGVlaygmYnVmLCAmYnVmX3NpemUpOwotICBpZiAoIWJ1Zl9zaXplKSByZXR1cm4gZmFsc2U7Ci0KLSAgYm9vbCBhdWRpbyA9IGhhc19hdWRpb18gJiYgYXVkaW9fdHJhY2tfaWRfID09IHJ1bnNfLT50cmFja19pZCgpOwotICBib29sIHZpZGVvID0gaGFzX3ZpZGVvXyAmJiB2aWRlb190cmFja19pZF8gPT0gcnVuc18tPnRyYWNrX2lkKCk7Ci0KLSAgLy8gU2tpcCB0aGlzIGVudGlyZSB0cmFjayBpZiBpdCdzIG5vdCBvbmUgd2UncmUgaW50ZXJlc3RlZCBpbgotICBpZiAoIWF1ZGlvICYmICF2aWRlbykKLSAgICBydW5zXy0+QWR2YW5jZVJ1bigpOwotCi0gIC8vIEF0dGVtcHQgdG8gY2FjaGUgdGhlIGF1eGlsaWFyeSBpbmZvcm1hdGlvbiBmaXJzdC4gQXV4IGluZm8gaXMgdXN1YWxseQotICAvLyBwbGFjZWQgaW4gYSBjb250aWd1b3VzIGJsb2NrIGJlZm9yZSB0aGUgc2FtcGxlIGRhdGEsIHJhdGhlciB0aGFuIGJlaW5nCi0gIC8vIGludGVybGVhdmVkLiBJZiB3ZSBkaWRuJ3QgY2FjaGUgaXQsIHRoaXMgd291bGQgcmVxdWlyZSB0aGF0IHdlIHJldGFpbiB0aGUKLSAgLy8gc3RhcnQgb2YgdGhlIHNlZ21lbnQgYnVmZmVyIHdoaWxlIHJlYWRpbmcgc2FtcGxlcy4gQXV4IGluZm8gaXMgdHlwaWNhbGx5Ci0gIC8vIHF1aXRlIHNtYWxsIGNvbXBhcmVkIHRvIHNhbXBsZSBkYXRhLCBzbyB0aGlzIHBhdHRlcm4gaXMgdXNlZnVsIG9uCi0gIC8vIG1lbW9yeS1jb25zdHJhaW5lZCBkZXZpY2VzIHdoZXJlIHRoZSBzb3VyY2UgYnVmZmVyIGNvbnN1bWVzIGEgc3Vic3RhbnRpYWwKLSAgLy8gcG9ydGlvbiBvZiB0aGUgdG90YWwgc3lzdGVtIG1lbW9yeS4KLSAgaWYgKHJ1bnNfLT5BdXhJbmZvTmVlZHNUb0JlQ2FjaGVkKCkpIHsKLSAgICBxdWV1ZV8uUGVla0F0KHJ1bnNfLT5hdXhfaW5mb19vZmZzZXQoKSArIG1vb2ZfaGVhZF8sICZidWYsICZidWZfc2l6ZSk7Ci0gICAgaWYgKGJ1Zl9zaXplIDwgcnVuc18tPmF1eF9pbmZvX3NpemUoKSkgcmV0dXJuIGZhbHNlOwotICAgICplcnIgPSAhcnVuc18tPkNhY2hlQXV4SW5mbyhidWYsIGJ1Zl9zaXplKTsKLSAgICByZXR1cm4gISplcnI7Ci0gIH0KLQotICBxdWV1ZV8uUGVla0F0KHJ1bnNfLT5zYW1wbGVfb2Zmc2V0KCkgKyBtb29mX2hlYWRfLCAmYnVmLCAmYnVmX3NpemUpOwotICBpZiAoYnVmX3NpemUgPCBydW5zXy0+c2FtcGxlX3NpemUoKSkgcmV0dXJuIGZhbHNlOwotCi0gIHNjb3BlZF9wdHI8RGVjcnlwdENvbmZpZz4gZGVjcnlwdF9jb25maWc7Ci0gIHN0ZDo6dmVjdG9yPFN1YnNhbXBsZUVudHJ5PiBzdWJzYW1wbGVzOwotICBpZiAocnVuc18tPmlzX2VuY3J5cHRlZCgpKSB7Ci0gICAgZGVjcnlwdF9jb25maWcgPSBydW5zXy0+R2V0RGVjcnlwdENvbmZpZygpOwotICAgIHN1YnNhbXBsZXMgPSBkZWNyeXB0X2NvbmZpZy0+c3Vic2FtcGxlcygpOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDg+IGZyYW1lX2J1ZihidWYsIGJ1ZiArIHJ1bnNfLT5zYW1wbGVfc2l6ZSgpKTsKLSAgaWYgKHZpZGVvKSB7Ci0gICAgaWYgKCFQcmVwYXJlQVZDQnVmZmVyKHJ1bnNfLT52aWRlb19kZXNjcmlwdGlvbigpLmF2Y2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFtZV9idWYsICZzdWJzYW1wbGVzKSkgewotICAgICAgTUVESUFfTE9HKGxvZ19jYl8pIDw8ICJGYWlsZWQgdG8gcHJlcGFyZSBBVkMgc2FtcGxlIGZvciBkZWNvZGUiOwotICAgICAgKmVyciA9IHRydWU7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGF1ZGlvKSB7Ci0gICAgaWYgKCFQcmVwYXJlQUFDQnVmZmVyKHJ1bnNfLT5hdWRpb19kZXNjcmlwdGlvbigpLmVzZHMuYWFjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVfYnVmLCAmc3Vic2FtcGxlcykpIHsKLSAgICAgIE1FRElBX0xPRyhsb2dfY2JfKSA8PCAiRmFpbGVkIHRvIHByZXBhcmUgQUFDIHNhbXBsZSBmb3IgZGVjb2RlIjsKLSAgICAgICplcnIgPSB0cnVlOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIGlmIChkZWNyeXB0X2NvbmZpZykgewotICAgIGlmICghc3Vic2FtcGxlcy5lbXB0eSgpKSB7Ci0gICAgLy8gQ3JlYXRlIGEgbmV3IGNvbmZpZyB3aXRoIHRoZSB1cGRhdGVkIHN1YnNhbXBsZXMuCi0gICAgZGVjcnlwdF9jb25maWcucmVzZXQobmV3IERlY3J5cHRDb25maWcoCi0gICAgICAgIGRlY3J5cHRfY29uZmlnLT5rZXlfaWQoKSwKLSAgICAgICAgZGVjcnlwdF9jb25maWctPml2KCksCi0jaWYgIWRlZmluZWQoX19MQl9TSEVMTF9fKSAmJiAhZGVmaW5lZChDT0JBTFQpCi0gICAgICAgIGRlY3J5cHRfY29uZmlnLT5kYXRhX29mZnNldCgpLAotI2VuZGlmICAvLyAhZGVmaW5lZChfX0xCX1NIRUxMX18pICYmICFkZWZpbmVkKENPQkFMVCkKLSAgICAgICAgc3Vic2FtcGxlcykpOwotICAgIH0KLSAgICAvLyBlbHNlLCB1c2UgdGhlIGV4aXN0aW5nIGNvbmZpZy4KLSAgfSBlbHNlIGlmICgoYXVkaW8gJiYgaXNfYXVkaW9fdHJhY2tfZW5jcnlwdGVkXykgfHwKLSAgICAgICAgICAgICAodmlkZW8gJiYgaXNfdmlkZW9fdHJhY2tfZW5jcnlwdGVkXykpIHsKLSAgICAvLyBUaGUgbWVkaWEgcGlwZWxpbmUgcmVxdWlyZXMgYSBEZWNyeXB0Q29uZmlnIHdpdGggYW4gZW1wdHkgfGl2fC4KLSAgICAvLyBUT0RPKGRkb3J3aW4pOiBSZWZhY3RvciBzbyB3ZSBkbyBub3QgbmVlZCBhIGZha2Uga2V5IElEICgiMSIpOwotI2lmIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLSAgICBkZWNyeXB0X2NvbmZpZy5yZXNldCgKLSAgICAgICAgbmV3IERlY3J5cHRDb25maWcoIjEiLCAiIiwgc3RkOjp2ZWN0b3I8U3Vic2FtcGxlRW50cnk+KCkpKTsKLSNlbHNlICAvLyAhZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICAgIGRlY3J5cHRfY29uZmlnLnJlc2V0KAotICAgICAgICBuZXcgRGVjcnlwdENvbmZpZygiMSIsICIiLCAwLCBzdGQ6OnZlY3RvcjxTdWJzYW1wbGVFbnRyeT4oKSkpOwotI2VuZGlmICAvLyAhZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICB9Ci0KLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0gIHNjb3BlZF9yZWZwdHI8U3RyZWFtUGFyc2VyQnVmZmVyPiBzdHJlYW1fYnVmID0KLSAgICBTdHJlYW1QYXJzZXJCdWZmZXI6OkNvcHlGcm9tKCZmcmFtZV9idWZbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9idWYuc2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuc18tPmlzX2tleWZyYW1lKCkpOwotCi0gIGlmICghc3RyZWFtX2J1ZikgewotICAgIE1FRElBX0xPRyhsb2dfY2JfKSA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIFN0cmVhbVBhcnNlckJ1ZmZlciI7Ci0gICAgKmVyciA9IHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0jZWxzZQotICBzY29wZWRfcmVmcHRyPFN0cmVhbVBhcnNlckJ1ZmZlcj4gc3RyZWFtX2J1ZiA9Ci0gICAgU3RyZWFtUGFyc2VyQnVmZmVyOjpDb3B5RnJvbSgmZnJhbWVfYnVmWzBdLCBmcmFtZV9idWYuc2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuc18tPmlzX2tleWZyYW1lKCkpOwotI2VuZGlmCi0KLSAgaWYgKGRlY3J5cHRfY29uZmlnKQotICAgIHN0cmVhbV9idWYtPlNldERlY3J5cHRDb25maWcoZGVjcnlwdF9jb25maWcuUGFzcygpKTsKLQotICBzdHJlYW1fYnVmLT5TZXREdXJhdGlvbihydW5zXy0+ZHVyYXRpb24oKSk7Ci0gIHN0cmVhbV9idWYtPlNldFRpbWVzdGFtcChydW5zXy0+Y3RzKCkpOwotICBzdHJlYW1fYnVmLT5TZXREZWNvZGVUaW1lc3RhbXAocnVuc18tPmR0cygpKTsKLQotICBEVkxPRygzKSA8PCAiUHVzaGluZyBmcmFtZTogYXVkPSIgPDwgYXVkaW8KLSAgICAgICAgICAgPDwgIiwga2V5PSIgPDwgcnVuc18tPmlzX2tleWZyYW1lKCkKLSAgICAgICAgICAgPDwgIiwgZHVyPSIgPDwgcnVuc18tPmR1cmF0aW9uKCkuSW5NaWxsaXNlY29uZHMoKQotICAgICAgICAgICA8PCAiLCBkdHM9IiA8PCBydW5zXy0+ZHRzKCkuSW5NaWxsaXNlY29uZHMoKQotICAgICAgICAgICA8PCAiLCBjdHM9IiA8PCBydW5zXy0+Y3RzKCkuSW5NaWxsaXNlY29uZHMoKQotICAgICAgICAgICA8PCAiLCBzaXplPSIgPDwgcnVuc18tPnNhbXBsZV9zaXplKCk7Ci0KLSAgaWYgKGF1ZGlvKSB7Ci0gICAgYXVkaW9fYnVmZmVycy0+cHVzaF9iYWNrKHN0cmVhbV9idWYpOwotICB9IGVsc2UgewotICAgIHZpZGVvX2J1ZmZlcnMtPnB1c2hfYmFjayhzdHJlYW1fYnVmKTsKLSAgfQotCi0gIHJ1bnNfLT5BZHZhbmNlU2FtcGxlKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIE1QNFN0cmVhbVBhcnNlcjo6U2VuZEFuZEZsdXNoU2FtcGxlcyhCdWZmZXJRdWV1ZSogYXVkaW9fYnVmZmVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlclF1ZXVlKiB2aWRlb19idWZmZXJzKSB7Ci0gIGJvb2wgZXJyID0gZmFsc2U7Ci0gIGlmICghYXVkaW9fYnVmZmVycy0+ZW1wdHkoKSkgewotICAgIGVyciB8PSAoYXVkaW9fY2JfLmlzX251bGwoKSB8fCAhYXVkaW9fY2JfLlJ1bigqYXVkaW9fYnVmZmVycykpOwotICAgIGF1ZGlvX2J1ZmZlcnMtPmNsZWFyKCk7Ci0gIH0KLSAgaWYgKCF2aWRlb19idWZmZXJzLT5lbXB0eSgpKSB7Ci0gICAgZXJyIHw9ICh2aWRlb19jYl8uaXNfbnVsbCgpIHx8ICF2aWRlb19jYl8uUnVuKCp2aWRlb19idWZmZXJzKSk7Ci0gICAgdmlkZW9fYnVmZmVycy0+Y2xlYXIoKTsKLSAgfQotICByZXR1cm4gIWVycjsKLX0KLQotYm9vbCBNUDRTdHJlYW1QYXJzZXI6OlJlYWRBbmREaXNjYXJkTURBVHNVbnRpbChjb25zdCBpbnQ2NCBvZmZzZXQpIHsKLSAgYm9vbCBlcnIgPSBmYWxzZTsKLSAgd2hpbGUgKG1kYXRfdGFpbF8gPCBvZmZzZXQpIHsKLSAgICBjb25zdCB1aW50OCogYnVmOwotICAgIGludCBzaXplOwotICAgIHF1ZXVlXy5QZWVrQXQobWRhdF90YWlsXywgJmJ1ZiwgJnNpemUpOwotCi0gICAgRm91ckNDIHR5cGU7Ci0gICAgaW50IGJveF9zejsKLSAgICBpZiAoIUJveFJlYWRlcjo6U3RhcnRUb3BMZXZlbEJveChidWYsIHNpemUsIGxvZ19jYl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGUsICZib3hfc3osICZlcnIpKQotICAgICAgYnJlYWs7Ci0KLSAgICBpZiAodHlwZSAhPSBGT1VSQ0NfTURBVCkgewotICAgICAgTUVESUFfTE9HKGxvZ19jYl8pIDw8ICJVbmV4cGVjdGVkIGJveCB0eXBlIHdoaWxlIHBhcnNpbmcgTURBVHM6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCBGb3VyQ0NUb1N0cmluZyh0eXBlKTsKLSAgICB9Ci0gICAgbWRhdF90YWlsXyArPSBib3hfc3o7Ci0gIH0KLSAgcXVldWVfLlRyaW0oc3RkOjptaW4obWRhdF90YWlsXywgb2Zmc2V0KSk7Ci0gIHJldHVybiAhZXJyOwotfQotCi12b2lkIE1QNFN0cmVhbVBhcnNlcjo6Q2hhbmdlU3RhdGUoU3RhdGUgbmV3X3N0YXRlKSB7Ci0gIERWTE9HKDIpIDw8ICJDaGFuZ2luZyBzdGF0ZTogIiA8PCBuZXdfc3RhdGU7Ci0gIHN0YXRlXyA9IG5ld19zdGF0ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1wNAotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvbXA0L21wNF9zdHJlYW1fcGFyc2VyLmggYi9zcmMvbWVkaWEvbXA0L21wNF9zdHJlYW1fcGFyc2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MjA2ZWYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL21wNC9tcDRfc3RyZWFtX3BhcnNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfTVA0X01QNF9TVFJFQU1fUEFSU0VSX0hfCi0jZGVmaW5lIE1FRElBX01QNF9NUDRfU1RSRUFNX1BBUlNFUl9IXwotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgotI2luY2x1ZGUgImJhc2UvY29tcGlsZXJfc3BlY2lmaWMuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3N0cmVhbV9wYXJzZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9tcDQvb2Zmc2V0X2J5dGVfcXVldWUuaCIKLSNpbmNsdWRlICJtZWRpYS9tcDQvdHJhY2tfcnVuX2l0ZXJhdG9yLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci1uYW1lc3BhY2UgbXA0IHsKLQotc3RydWN0IE1vdmllOwotY2xhc3MgQm94UmVhZGVyOwotCi1jbGFzcyBNRURJQV9FWFBPUlQgTVA0U3RyZWFtUGFyc2VyIDogcHVibGljIFN0cmVhbVBhcnNlciB7Ci0gcHVibGljOgotICBNUDRTdHJlYW1QYXJzZXIoYm9vbCBoYXNfc2JyKTsKLSAgdmlydHVhbCB+TVA0U3RyZWFtUGFyc2VyKCk7Ci0KLSAgdmlydHVhbCB2b2lkIEluaXQoY29uc3QgSW5pdENCJiBpbml0X2NiLCBjb25zdCBOZXdDb25maWdDQiYgY29uZmlnX2NiLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBOZXdCdWZmZXJzQ0ImIGF1ZGlvX2NiLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBOZXdCdWZmZXJzQ0ImIHZpZGVvX2NiLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBOZWVkS2V5Q0ImIG5lZWRfa2V5X2NiLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBOZXdNZWRpYVNlZ21lbnRDQiYgbmV3X3NlZ21lbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIGVuZF9vZl9zZWdtZW50X2NiLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2dDQiYgbG9nX2NiKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIEZsdXNoKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgYm9vbCBQYXJzZShjb25zdCB1aW50OCogYnVmLCBpbnQgc2l6ZSkgT1ZFUlJJREU7Ci0KLSBwcml2YXRlOgotICBlbnVtIFN0YXRlIHsKLSAgICBrV2FpdGluZ0ZvckluaXQsCi0gICAga1BhcnNpbmdCb3hlcywKLSAgICBrRW1pdHRpbmdTYW1wbGVzLAotICAgIGtFcnJvcgotICB9OwotCi0gIGJvb2wgUGFyc2VCb3goYm9vbCogZXJyKTsKLSAgYm9vbCBQYXJzZU1vb3YobXA0OjpCb3hSZWFkZXIqIHJlYWRlcik7Ci0gIGJvb2wgUGFyc2VNb29mKG1wNDo6Qm94UmVhZGVyKiByZWFkZXIpOwotCi0gIC8vIFJldHVybnMgJ3RydWUnIGlmIHNlbnQgb3Igbm90IHJlcXVpcmVkLCAnZmFsc2UnIGlmIHRoZXJlIHdhcyBhbiBlcnJvci4KLSAgYm9vbCBFbWl0TmVlZEtleUlmTmVjZXNzYXJ5KAotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UHJvdGVjdGlvblN5c3RlbVNwZWNpZmljSGVhZGVyPiYgaGVhZGVycyk7Ci0KLSAgLy8gVG8gcmV0YWluIHByb3BlciBmcmFtaW5nLCBlYWNoICdtZGF0JyBhdG9tIG11c3QgYmUgcmVhZDsgdG8gbGltaXQgbWVtb3J5Ci0gIC8vIHVzYWdlLCB0aGUgYXRvbSdzIGRhdGEgbmVlZHMgdG8gYmUgZGlzY2FyZGVkIGluY3JlbWVudGFsbHkgYXMgZnJhbWVzIGFyZQotICAvLyBleHRyYWN0ZWQgZnJvbSB0aGUgc3RyZWFtLiBUaGlzIGZ1bmN0aW9uIGRpc2NhcmRzIGRhdGEgZnJvbSB0aGUgc3RyZWFtIHVwCi0gIC8vIHRvIHxvZmZzZXR8LCB1cGRhdGluZyB0aGUgfG1kYXRfdGFpbF98IHZhbHVlIHNvIHRoYXQgZnJhbWluZyBjYW4gYmUKLSAgLy8gcmV0YWluZWQgYWZ0ZXIgYWxsICdtZGF0JyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZWFkLgotICAvLyBSZXR1cm5zICd0cnVlJyBvbiBzdWNjZXNzLCAnZmFsc2UnIGlmIHRoZXJlIHdhcyBhbiBlcnJvci4KLSAgYm9vbCBSZWFkQW5kRGlzY2FyZE1EQVRzVW50aWwoY29uc3QgaW50NjQgb2Zmc2V0KTsKLQotICB2b2lkIENoYW5nZVN0YXRlKFN0YXRlIG5ld19zdGF0ZSk7Ci0KLSAgYm9vbCBFbWl0Q29uZmlncygpOwotICBib29sIFByZXBhcmVBVkNCdWZmZXIoY29uc3QgQVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQmIGF2Y19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OD4qIGZyYW1lX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFN1YnNhbXBsZUVudHJ5Piogc3Vic2FtcGxlcykgY29uc3Q7Ci0gIGJvb2wgUHJlcGFyZUFBQ0J1ZmZlcihjb25zdCBBQUMmIGFhY19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OD4qIGZyYW1lX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFN1YnNhbXBsZUVudHJ5Piogc3Vic2FtcGxlcykgY29uc3Q7Ci0gIGJvb2wgRW5xdWV1ZVNhbXBsZShCdWZmZXJRdWV1ZSogYXVkaW9fYnVmZmVycywKLSAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlclF1ZXVlKiB2aWRlb19idWZmZXJzLAotICAgICAgICAgICAgICAgICAgICAgYm9vbCogZXJyKTsKLSAgYm9vbCBTZW5kQW5kRmx1c2hTYW1wbGVzKEJ1ZmZlclF1ZXVlKiBhdWRpb19idWZmZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyUXVldWUqIHZpZGVvX2J1ZmZlcnMpOwotCi0gIHZvaWQgUmVzZXQoKTsKLQotICBTdGF0ZSBzdGF0ZV87Ci0gIEluaXRDQiBpbml0X2NiXzsKLSAgTmV3Q29uZmlnQ0IgY29uZmlnX2NiXzsKLSAgTmV3QnVmZmVyc0NCIGF1ZGlvX2NiXzsKLSAgTmV3QnVmZmVyc0NCIHZpZGVvX2NiXzsKLSAgTmVlZEtleUNCIG5lZWRfa2V5X2NiXzsKLSAgTmV3TWVkaWFTZWdtZW50Q0IgbmV3X3NlZ21lbnRfY2JfOwotICBiYXNlOjpDbG9zdXJlIGVuZF9vZl9zZWdtZW50X2NiXzsKLSAgTG9nQ0IgbG9nX2NiXzsKLQotICBPZmZzZXRCeXRlUXVldWUgcXVldWVfOwotCi0gIC8vIFRoZXNlIHR3byBwYXJhbWV0ZXJzIGFyZSBvbmx5IHZhbGlkIGluIHRoZSB8a0VtaXR0aW5nU2VnbWVudHN8IHN0YXRlLgotICAvLwotICAvLyB8bW9vZl9oZWFkX3wgaXMgdGhlIG9mZnNldCBvZiB0aGUgc3RhcnQgb2YgdGhlIG1vc3QgcmVjZW50bHkgcGFyc2VkIG1vb2YKLSAgLy8gYmxvY2suIEFsbCBieXRlIG9mZnNldHMgaW4gc2FtcGxlIGluZm9ybWF0aW9uIGFyZSByZWxhdGl2ZSB0byB0aGlzIG9mZnNldCwKLSAgLy8gYXMgbWFuZGF0ZWQgYnkgdGhlIE1lZGlhIFNvdXJjZSBzcGVjLgotICBpbnQ2NCBtb29mX2hlYWRfOwotICAvLyB8bWRhdF90YWlsX3wgaXMgdGhlIHN0cmVhbSBvZmZzZXQgb2YgdGhlIGVuZCBvZiB0aGUgY3VycmVudCAnbWRhdCcgYm94LgotICAvLyBWYWxpZCBpZmYgaXQgaXMgZ3JlYXRlciB0aGFuIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZS4KLSAgaW50NjQgbWRhdF90YWlsXzsKLQotICBzY29wZWRfcHRyPG1wNDo6TW92aWU+IG1vb3ZfOwotICBzY29wZWRfcHRyPG1wNDo6VHJhY2tSdW5JdGVyYXRvcj4gcnVuc187Ci0KLSAgYm9vbCBoYXNfYXVkaW9fOwotICBib29sIGhhc192aWRlb187Ci0gIHVpbnQzMiBhdWRpb190cmFja19pZF87Ci0gIHVpbnQzMiB2aWRlb190cmFja19pZF87Ci0gIGJvb2wgaGFzX3Nicl87Ci0gIGJvb2wgaXNfYXVkaW9fdHJhY2tfZW5jcnlwdGVkXzsKLSAgYm9vbCBpc192aWRlb190cmFja19lbmNyeXB0ZWRfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNUDRTdHJlYW1QYXJzZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1wNAotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfTVA0X01QNF9TVFJFQU1fUEFSU0VSX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvbXA0L21wNF9zdHJlYW1fcGFyc2VyX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL21wNC9tcDRfc3RyZWFtX3BhcnNlcl91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmMzQxMC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvbXA0L21wNF9zdHJlYW1fcGFyc2VyX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiYmFzZS9iaW5kX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGltZS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYXVkaW9fZGVjb2Rlcl9jb25maWcuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zdHJlYW1fcGFyc2VyX2J1ZmZlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdGVzdF9kYXRhX3V0aWwuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXJfY29uZmlnLmgiCi0jaW5jbHVkZSAibWVkaWEvbXA0L21wNF9zdHJlYW1fcGFyc2VyLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0KLXVzaW5nIGJhc2U6OlRpbWVEZWx0YTsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLW5hbWVzcGFjZSBtcDQgewotCi0vLyBUT0RPKHhod2FuZyk6IEZpZ3VyZSBvdXQgdGhlIGluaXQgZGF0YSB0eXBlIGFwcHJvcHJpYXRlbHkgb25jZSBpdCdzIHNwZWMnZWQuCi1zdGF0aWMgY29uc3QgY2hhciBrTXA0SW5pdERhdGFUeXBlW10gPSAidmlkZW8vbXA0IjsKLQotY2xhc3MgTVA0U3RyZWFtUGFyc2VyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gIE1QNFN0cmVhbVBhcnNlclRlc3QoKQotICAgICAgOiBwYXJzZXJfKG5ldyBNUDRTdHJlYW1QYXJzZXIoZmFsc2UpKSwKLSAgICAgICAgY29uZmlnc19yZWNlaXZlZF8oZmFsc2UpIHsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBzY29wZWRfcHRyPE1QNFN0cmVhbVBhcnNlcj4gcGFyc2VyXzsKLSAgYmFzZTo6VGltZURlbHRhIHNlZ21lbnRfc3RhcnRfOwotICBib29sIGNvbmZpZ3NfcmVjZWl2ZWRfOwotCi0gIGJvb2wgQXBwZW5kRGF0YShjb25zdCB1aW50OCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgewotICAgIHJldHVybiBwYXJzZXJfLT5QYXJzZShkYXRhLCBsZW5ndGgpOwotICB9Ci0KLSAgYm9vbCBBcHBlbmREYXRhSW5QaWVjZXMoY29uc3QgdWludDgqIGRhdGEsIHNpemVfdCBsZW5ndGgsIHNpemVfdCBwaWVjZV9zaXplKSB7Ci0gICAgY29uc3QgdWludDgqIHN0YXJ0ID0gZGF0YTsKLSAgICBjb25zdCB1aW50OCogZW5kID0gZGF0YSArIGxlbmd0aDsKLSAgICB3aGlsZSAoc3RhcnQgPCBlbmQpIHsKLSAgICAgIHNpemVfdCBhcHBlbmRfc2l6ZSA9IHN0ZDo6bWluKHBpZWNlX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KGVuZCAtIHN0YXJ0KSk7Ci0gICAgICBpZiAoIUFwcGVuZERhdGEoc3RhcnQsIGFwcGVuZF9zaXplKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgc3RhcnQgKz0gYXBwZW5kX3NpemU7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdm9pZCBJbml0Rihib29sIGluaXRfb2ssIGJhc2U6OlRpbWVEZWx0YSBkdXJhdGlvbikgewotICAgIERWTE9HKDEpIDw8ICJJbml0Rjogb2s9IiA8PCBpbml0X29rCi0gICAgICAgICAgICAgPDwgIiwgZHVyPSIgPDwgZHVyYXRpb24uSW5NaWxsaXNlY29uZHMoKTsKLSAgfQotCi0gIGJvb2wgTmV3Q29uZmlnRihjb25zdCBBdWRpb0RlY29kZXJDb25maWcmIGFjLCBjb25zdCBWaWRlb0RlY29kZXJDb25maWcmIHZjKSB7Ci0gICAgRFZMT0coMSkgPDwgIk5ld0NvbmZpZ0Y6IGF1ZGlvPSIgPDwgYWMuSXNWYWxpZENvbmZpZygpCi0gICAgICAgICAgICAgPDwgIiwgdmlkZW89IiA8PCB2Yy5Jc1ZhbGlkQ29uZmlnKCk7Ci0gICAgY29uZmlnc19yZWNlaXZlZF8gPSB0cnVlOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgYm9vbCBOZXdCdWZmZXJzRihjb25zdCBTdHJlYW1QYXJzZXI6OkJ1ZmZlclF1ZXVlJiBidWZzKSB7Ci0gICAgRFZMT0coMikgPDwgIk5ld0J1ZmZlcnNGOiAiIDw8IGJ1ZnMuc2l6ZSgpIDw8ICIgYnVmZmVycyI7Ci0gICAgZm9yIChTdHJlYW1QYXJzZXI6OkJ1ZmZlclF1ZXVlOjpjb25zdF9pdGVyYXRvciBidWYgPSBidWZzLmJlZ2luKCk7Ci0gICAgICAgICBidWYgIT0gYnVmcy5lbmQoKTsgYnVmKyspIHsKLSAgICAgIERWTE9HKDMpIDw8ICIgIG49IiA8PCBidWYgLSBidWZzLmJlZ2luKCkKLSAgICAgICAgICAgICAgIDw8ICIsIHNpemU9IiA8PCAoKmJ1ZiktPkdldERhdGFTaXplKCkKLSAgICAgICAgICAgICAgIDw8ICIsIGR1cj0iIDw8ICgqYnVmKS0+R2V0RHVyYXRpb24oKS5Jbk1pbGxpc2Vjb25kcygpOwotICAgICAgRVhQRUNUX0dFKCgqYnVmKS0+R2V0VGltZXN0YW1wKCksIHNlZ21lbnRfc3RhcnRfKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBib29sIEtleU5lZWRlZEYoY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUsCi0gICAgICAgICAgICAgICAgICBzY29wZWRfYXJyYXk8dWludDg+IGluaXRfZGF0YSwgaW50IGluaXRfZGF0YV9zaXplKSB7Ci0gICAgRFZMT0coMSkgPDwgIktleU5lZWRlZEY6ICIgPDwgaW5pdF9kYXRhX3NpemU7Ci0gICAgRVhQRUNUX0VRKGtNcDRJbml0RGF0YVR5cGUsIHR5cGUpOwotICAgIEVYUEVDVF9UUlVFKGluaXRfZGF0YS5nZXQoKSk7Ci0gICAgRVhQRUNUX0dUKGluaXRfZGF0YV9zaXplLCAwKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZvaWQgTmV3U2VnbWVudEYoVGltZURlbHRhIHN0YXJ0X2R0cykgewotICAgIERWTE9HKDEpIDw8ICJOZXdTZWdtZW50RjogIiA8PCBzdGFydF9kdHMuSW5NaWxsaXNlY29uZHMoKTsKLSAgICBzZWdtZW50X3N0YXJ0XyA9IHN0YXJ0X2R0czsKLSAgfQotCi0gIHZvaWQgRW5kT2ZTZWdtZW50RigpIHsKLSAgICBEVkxPRygxKSA8PCAiRW5kT2ZTZWdtZW50RigpIjsKLSAgfQotCi0gIHZvaWQgSW5pdGlhbGl6ZVBhcnNlcigpIHsKLSAgICBwYXJzZXJfLT5Jbml0KAotICAgICAgICBiYXNlOjpCaW5kKCZNUDRTdHJlYW1QYXJzZXJUZXN0OjpJbml0RiwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICAgIGJhc2U6OkJpbmQoJk1QNFN0cmVhbVBhcnNlclRlc3Q6Ok5ld0NvbmZpZ0YsIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAotICAgICAgICBiYXNlOjpCaW5kKCZNUDRTdHJlYW1QYXJzZXJUZXN0OjpOZXdCdWZmZXJzRiwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICAgIGJhc2U6OkJpbmQoJk1QNFN0cmVhbVBhcnNlclRlc3Q6Ok5ld0J1ZmZlcnNGLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgICAgYmFzZTo6QmluZCgmTVA0U3RyZWFtUGFyc2VyVGVzdDo6S2V5TmVlZGVkRiwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICAgIGJhc2U6OkJpbmQoJk1QNFN0cmVhbVBhcnNlclRlc3Q6Ok5ld1NlZ21lbnRGLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgICAgYmFzZTo6QmluZCgmTVA0U3RyZWFtUGFyc2VyVGVzdDo6RW5kT2ZTZWdtZW50RiwKLSAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgICAgTG9nQ0IoKSk7Ci0gIH0KLQotICBib29sIFBhcnNlTVA0RmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGludCBhcHBlbmRfYnl0ZXMpIHsKLSAgICBJbml0aWFsaXplUGFyc2VyKCk7Ci0KLSAgICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGJ1ZmZlciA9IFJlYWRUZXN0RGF0YUZpbGUoZmlsZW5hbWUpOwotICAgIEVYUEVDVF9UUlVFKEFwcGVuZERhdGFJblBpZWNlcyhidWZmZXItPkdldERhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5HZXREYXRhU2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRfYnl0ZXMpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfTsKLQotVEVTVF9GKE1QNFN0cmVhbVBhcnNlclRlc3QsIFRlc3RVbmFsaWduZWRBcHBlbmQpIHsKLSAgLy8gVGVzdCBzbWFsbCwgbm9uLXNlZ21lbnQtYWxpZ25lZCBhcHBlbmRzIChzbWFsbCBlbm91Z2ggdG8gZXhlcmNpc2UKLSAgLy8gaW5jcmVtZW50YWwgYXBwZW5kIHN5c3RlbSkKLSAgUGFyc2VNUDRGaWxlKCJiZWFyLjEyODB4NzIwX2Rhc2gubXA0IiwgNTEyKTsKLX0KLQotVEVTVF9GKE1QNFN0cmVhbVBhcnNlclRlc3QsIFRlc3RCeXRld2lzZUFwcGVuZCkgewotICAvLyBFbnN1cmUgbm8gaW5jcmVtZW50YWwgZXJyb3JzIG9jY3VyIHdoZW4gcGFyc2luZwotICBQYXJzZU1QNEZpbGUoImJlYXIuMTI4MHg3MjBfZGFzaC5tcDQiLCAxKTsKLX0KLQotVEVTVF9GKE1QNFN0cmVhbVBhcnNlclRlc3QsIFRlc3RNdWx0aUZyYWdtZW50QXBwZW5kKSB7Ci0gIC8vIExhcmdlIHNpemUgZW5zdXJlcyBtdWx0aXBsZSBmcmFnbWVudHMgYXJlIGFwcGVuZGVkIGluIG9uZSBjYWxsIChzaXplIGlzCi0gIC8vIGxhcmdlciB0aGFuIHRoaXMgcGFydGljdWxhciB0ZXN0IGZpbGUpCi0gIFBhcnNlTVA0RmlsZSgiYmVhci4xMjgweDcyMF9kYXNoLm1wNCIsIDc2ODQzMik7Ci19Ci0KLVRFU1RfRihNUDRTdHJlYW1QYXJzZXJUZXN0LCBUZXN0Rmx1c2gpIHsKLSAgLy8gRmx1c2ggd2hpbGUgcmVhZGluZyBzYW1wbGUgZGF0YSwgdGhlbiBzdGFydCBhIG5ldyBzdHJlYW0uCi0gIEluaXRpYWxpemVQYXJzZXIoKTsKLQotICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGJ1ZmZlciA9Ci0gICAgICBSZWFkVGVzdERhdGFGaWxlKCJiZWFyLjEyODB4NzIwX2Rhc2gubXA0Iik7Ci0gIEVYUEVDVF9UUlVFKEFwcGVuZERhdGFJblBpZWNlcyhidWZmZXItPkdldERhdGEoKSwgNjU1MzYsIDUxMikpOwotICBwYXJzZXJfLT5GbHVzaCgpOwotICBFWFBFQ1RfVFJVRShBcHBlbmREYXRhSW5QaWVjZXMoYnVmZmVyLT5HZXREYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXItPkdldERhdGFTaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTIpKTsKLX0KLQotVEVTVF9GKE1QNFN0cmVhbVBhcnNlclRlc3QsIFRlc3RSZWluaXRpYWxpemF0aW9uKSB7Ci0gIEluaXRpYWxpemVQYXJzZXIoKTsKLQotICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGJ1ZmZlciA9Ci0gICAgICBSZWFkVGVzdERhdGFGaWxlKCJiZWFyLjEyODB4NzIwX2Rhc2gubXA0Iik7Ci0gIEVYUEVDVF9UUlVFKEFwcGVuZERhdGFJblBpZWNlcyhidWZmZXItPkdldERhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+R2V0RGF0YVNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMikpOwotICBFWFBFQ1RfVFJVRShBcHBlbmREYXRhSW5QaWVjZXMoYnVmZmVyLT5HZXREYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXItPkdldERhdGFTaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTIpKTsKLX0KLQotLy8gVE9ETyhzdHJvYmUpOiBDcmVhdGUgYW5kIHRlc3QgbWVkaWEgd2hpY2ggdXNlcyBDRU5DIGF1eGlsaWFyeSBpbmZvIHN0b3JlZAotLy8gaW5zaWRlIGEgcHJpdmF0ZSBib3gKLQotfSAgLy8gbmFtZXNwYWNlIG1wNAotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvbXA0L29mZnNldF9ieXRlX3F1ZXVlLmNjIGIvc3JjL21lZGlhL21wNC9vZmZzZXRfYnl0ZV9xdWV1ZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUzMDE1MC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvbXA0L29mZnNldF9ieXRlX3F1ZXVlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL21wNC9vZmZzZXRfYnl0ZV9xdWV1ZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLU9mZnNldEJ5dGVRdWV1ZTo6T2Zmc2V0Qnl0ZVF1ZXVlKCkgOiBidWZfKE5VTEwpLCBzaXplXygwKSwgaGVhZF8oMCkge30KLU9mZnNldEJ5dGVRdWV1ZTo6fk9mZnNldEJ5dGVRdWV1ZSgpIHt9Ci0KLXZvaWQgT2Zmc2V0Qnl0ZVF1ZXVlOjpSZXNldCgpIHsKLSAgcXVldWVfLlJlc2V0KCk7Ci0gIGJ1Zl8gPSBOVUxMOwotICBzaXplXyA9IDA7Ci0gIGhlYWRfID0gMDsKLX0KLQotdm9pZCBPZmZzZXRCeXRlUXVldWU6OlB1c2goY29uc3QgdWludDgqIGJ1ZiwgaW50IHNpemUpIHsKLSAgcXVldWVfLlB1c2goYnVmLCBzaXplKTsKLSAgU3luYygpOwotICBEVkxPRyg0KSA8PCAiQnVmZmVyIHB1c2hlZC4gaGVhZD0iIDw8IGhlYWQoKSA8PCAiIHRhaWw9IiA8PCB0YWlsKCk7Ci19Ci0KLXZvaWQgT2Zmc2V0Qnl0ZVF1ZXVlOjpQZWVrKGNvbnN0IHVpbnQ4KiogYnVmLCBpbnQqIHNpemUpIHsKLSAgKmJ1ZiA9IHNpemVfID4gMCA/IGJ1Zl8gOiBOVUxMOwotICAqc2l6ZSA9IHNpemVfOwotfQotCi12b2lkIE9mZnNldEJ5dGVRdWV1ZTo6UG9wKGludCBjb3VudCkgewotICBxdWV1ZV8uUG9wKGNvdW50KTsKLSAgaGVhZF8gKz0gY291bnQ7Ci0gIFN5bmMoKTsKLX0KLQotdm9pZCBPZmZzZXRCeXRlUXVldWU6OlBlZWtBdChpbnQ2NCBvZmZzZXQsIGNvbnN0IHVpbnQ4KiogYnVmLCBpbnQqIHNpemUpIHsKLSAgRENIRUNLKG9mZnNldCA+PSBoZWFkKCkpOwotICBpZiAob2Zmc2V0IDwgaGVhZCgpIHx8IG9mZnNldCA+PSB0YWlsKCkpIHsKLSAgICAqYnVmID0gTlVMTDsKLSAgICAqc2l6ZSA9IDA7Ci0gICAgcmV0dXJuOwotICB9Ci0gICpidWYgPSAmYnVmX1tvZmZzZXQgLSBoZWFkKCldOwotICAqc2l6ZSA9IHRhaWwoKSAtIG9mZnNldDsKLX0KLQotYm9vbCBPZmZzZXRCeXRlUXVldWU6OlRyaW0oaW50NjQgbWF4X29mZnNldCkgewotICBpZiAobWF4X29mZnNldCA8IGhlYWRfKSByZXR1cm4gdHJ1ZTsKLSAgaWYgKG1heF9vZmZzZXQgPiB0YWlsKCkpIHsKLSAgICBQb3Aoc2l6ZV8pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBQb3AobWF4X29mZnNldCAtIGhlYWRfKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgT2Zmc2V0Qnl0ZVF1ZXVlOjpTeW5jKCkgewotICBxdWV1ZV8uUGVlaygmYnVmXywgJnNpemVfKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvbXA0L29mZnNldF9ieXRlX3F1ZXVlLmggYi9zcmMvbWVkaWEvbXA0L29mZnNldF9ieXRlX3F1ZXVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNDliOTYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL21wNC9vZmZzZXRfYnl0ZV9xdWV1ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9NUDRfT0ZGU0VUX0JZVEVfUVVFVUVfSF8KLSNkZWZpbmUgTUVESUFfTVA0X09GRlNFVF9CWVRFX1FVRVVFX0hfCi0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2J5dGVfcXVldWUuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBBIHdyYXBwZXIgYXJvdW5kIGEgQnl0ZVF1ZXVlIHdoaWNoIG1haW50YWlucyBhIG5vdGlvbiBvZiBhCi0vLyBtb25vdG9uaWNhbGx5LWluY3JlYXNpbmcgb2Zmc2V0LiBBbGwgYnVmZmVyIGFjY2VzcyBpcyBkb25lIGJ5IHBhc3NpbmcgdGhlc2UKLS8vIG9mZnNldHMgaW50byB0aGlzIGNsYXNzLCBnb2luZyBzb21lIHdheSB0b3dhcmRzIHByZXZlbnRpbmcgdGhlIHByb2xpZmVyYXRpb24KLS8vIG9mIG1hbnkgZGlmZmVyZW50IG1lYW5pbmdzIG9mICJvZmZzZXQiLCAiaGVhZCIsIGV0Yy4KLWNsYXNzIE1FRElBX0VYUE9SVCBPZmZzZXRCeXRlUXVldWUgewotIHB1YmxpYzoKLSAgT2Zmc2V0Qnl0ZVF1ZXVlKCk7Ci0gIH5PZmZzZXRCeXRlUXVldWUoKTsKLQotICAvLyBUaGVzZSB3b3JrIGxpa2UgdGhlaXIgdW5kZXJseWluZyBCeXRlUXVldWUgY291bnRlcnBhcnRzLgotICB2b2lkIFJlc2V0KCk7Ci0gIHZvaWQgUHVzaChjb25zdCB1aW50OCogYnVmLCBpbnQgc2l6ZSk7Ci0gIHZvaWQgUGVlayhjb25zdCB1aW50OCoqIGJ1ZiwgaW50KiBzaXplKTsKLSAgdm9pZCBQb3AoaW50IGNvdW50KTsKLQotICAvLyBTZXRzIHxidWZ8IHRvIHBvaW50IGF0IHRoZSBmaXJzdCBidWZmZXJlZCBieXRlIGNvcnJlc3BvbmRpbmcgdG8gfG9mZnNldHwsCi0gIC8vIGFuZCB8c2l6ZXwgdG8gdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgc3RhcnRpbmcgZnJvbSB0aGF0IG9mZnNldC4KLSAgLy8KLSAgLy8gSXQgaXMgYW4gZXJyb3IgaWYgdGhlIG9mZnNldCBpcyBiZWZvcmUgdGhlIGN1cnJlbnQgaGVhZC4gSXQncyBub3QgYW4gZXJyb3IKLSAgLy8gaWYgdGhlIGN1cnJlbnQgb2Zmc2V0IGlzIGJleW9uZCB0YWlsKCksIGJ1dCB5b3Ugd2lsbCBvZiBjb3Vyc2UgZ2V0IGJhY2sKLSAgLy8gYSBudWxsIHxidWZ8IGFuZCBhIHxzaXplfCBvZiB6ZXJvLgotICB2b2lkIFBlZWtBdChpbnQ2NCBvZmZzZXQsIGNvbnN0IHVpbnQ4KiogYnVmLCBpbnQqIHNpemUpOwotCi0gIC8vIE1hcmtzIHRoZSBieXRlcyB1cCB0byAoYnV0IG5vdCBpbmNsdWRpbmcpIHxtYXhfb2Zmc2V0fCBhcyByZWFkeSBmb3IKLSAgLy8gZGVsZXRpb24uIFRoaXMgaXMgcmVsYXRpdmVseSBpbmV4cGVuc2l2ZSwgYnV0IHdpbGwgbm90IG5lY2Vzc2FyaWx5IHJlZHVjZQotICAvLyB0aGUgcmVzaWRlbnQgYnVmZmVyIHNpemUgcmlnaHQgYXdheSAob3IgZXZlcikuCi0gIC8vCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZnVsbCByYW5nZSBvZiBieXRlcyB3ZXJlIHN1Y2Nlc3NmdWxseSB0cmltbWVkLAotICAvLyBpbmNsdWRpbmcgdGhlIGNhc2Ugd2hlcmUgfG1heF9vZmZzZXR8IGlzIGxlc3MgdGhhbiB0aGUgY3VycmVudCBoZWFkLgotICAvLyBSZXR1cm5zIGZhbHNlIGlmIHxtYXhfb2Zmc2V0fCA+IHRhaWwoKSAoYWx0aG91Z2ggYWxsIGJ5dGVzIGN1cnJlbnRseQotICAvLyBidWZmZXJlZCBhcmUgc3RpbGwgY2xlYXJlZCkuCi0gIGJvb2wgVHJpbShpbnQ2NCBtYXhfb2Zmc2V0KTsKLQotICAvLyBUaGUgaGVhZCBhbmQgdGFpbCBwb3NpdGlvbnMsIGluIHRlcm1zIG9mIHRoZSBmaWxlJ3MgYWJzb2x1dGUgb2Zmc2V0cy4KLSAgLy8gdGFpbCgpIGlzIGFuIGV4Y2x1c2l2ZSBib3VuZC4KLSAgaW50NjQgaGVhZCgpIHsgcmV0dXJuIGhlYWRfOyB9Ci0gIGludDY0IHRhaWwoKSB7IHJldHVybiBoZWFkXyArIHNpemVfOyB9Ci0KLSBwcml2YXRlOgotICAvLyBTeW5jaHJvbml6ZSB8YnVmX3wgYW5kIHxzaXplX3wgd2l0aCB8cXVldWVffC4KLSAgdm9pZCBTeW5jKCk7Ci0KLSAgQnl0ZVF1ZXVlIHF1ZXVlXzsKLSAgY29uc3QgdWludDgqIGJ1Zl87Ci0gIGludCBzaXplXzsKLSAgaW50NjQgaGVhZF87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE9mZnNldEJ5dGVRdWV1ZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9NUDRfTVA0X1NUUkVBTV9QQVJTRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9tcDQvb2Zmc2V0X2J5dGVfcXVldWVfdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvbXA0L29mZnNldF9ieXRlX3F1ZXVlX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmQ0MGRjLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9tcDQvb2Zmc2V0X2J5dGVfcXVldWVfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAibWVkaWEvbXA0L29mZnNldF9ieXRlX3F1ZXVlLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIE9mZnNldEJ5dGVRdWV1ZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBPVkVSUklERSB7Ci0gICAgdWludDggYnVmWzI1Nl07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgewotICAgICAgYnVmW2ldID0gaTsKLSAgICB9Ci0gICAgcXVldWVfLnJlc2V0KG5ldyBPZmZzZXRCeXRlUXVldWUpOwotICAgIHF1ZXVlXy0+UHVzaChidWYsIHNpemVvZihidWYpKTsKLSAgICBxdWV1ZV8tPlB1c2goYnVmLCBzaXplb2YoYnVmKSk7Ci0gICAgcXVldWVfLT5Qb3AoMzg0KTsKLQotICAgIC8vIFF1ZXVlIHdpbGwgc3RhcnQgd2l0aCAxMjggYnl0ZXMgb2YgZGF0YSBhbmQgYW4gb2Zmc2V0IG9mIDM4NCBieXRlcy4KLSAgICAvLyBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgdGhyb3VnaG91dCB0aGUgdGVzdC4KLSAgfQotCi0gcHJvdGVjdGVkOgotICBzY29wZWRfcHRyPE9mZnNldEJ5dGVRdWV1ZT4gcXVldWVfOwotfTsKLQotVEVTVF9GKE9mZnNldEJ5dGVRdWV1ZVRlc3QsIFRlc3RTZXRVcCkgewotICBFWFBFQ1RfRVEoMzg0LCBxdWV1ZV8tPmhlYWQoKSk7Ci0gIEVYUEVDVF9FUSg1MTIsIHF1ZXVlXy0+dGFpbCgpKTsKLQotICBjb25zdCB1aW50OCogYnVmOwotICBpbnQgc2l6ZTsKLQotICBxdWV1ZV8tPlBlZWsoJmJ1ZiwgJnNpemUpOwotICBFWFBFQ1RfRVEoMTI4LCBzaXplKTsKLSAgRVhQRUNUX0VRKDEyOCwgYnVmWzBdKTsKLSAgRVhQRUNUX0VRKDI1NSwgYnVmW3NpemUtMV0pOwotfQotCi1URVNUX0YoT2Zmc2V0Qnl0ZVF1ZXVlVGVzdCwgVGVzdFBlZWtBdCkgewotICBjb25zdCB1aW50OCogYnVmOwotICBpbnQgc2l6ZTsKLQotICBxdWV1ZV8tPlBlZWtBdCg0MDAsICZidWYsICZzaXplKTsKLSAgRVhQRUNUX0VRKHF1ZXVlXy0+dGFpbCgpIC0gNDAwLCBzaXplKTsKLSAgRVhQRUNUX0VRKDQwMCAtIDI1NiwgYnVmWzBdKTsKLQotICBxdWV1ZV8tPlBlZWtBdCg1MTIsICZidWYsICZzaXplKTsKLSAgRVhQRUNUX0VRKE5VTEwsIGJ1Zik7Ci0gIEVYUEVDVF9FUSgwLCBzaXplKTsKLX0KLQotVEVTVF9GKE9mZnNldEJ5dGVRdWV1ZVRlc3QsIFRlc3RUcmltKSB7Ci0gIEVYUEVDVF9UUlVFKHF1ZXVlXy0+VHJpbSgxMjgpKTsKLSAgRVhQRUNUX1RSVUUocXVldWVfLT5UcmltKDM4NCkpOwotICBFWFBFQ1RfRVEoMzg0LCBxdWV1ZV8tPmhlYWQoKSk7Ci0gIEVYUEVDVF9FUSg1MTIsIHF1ZXVlXy0+dGFpbCgpKTsKLQotICBFWFBFQ1RfVFJVRShxdWV1ZV8tPlRyaW0oNDAwKSk7Ci0gIEVYUEVDVF9FUSg0MDAsIHF1ZXVlXy0+aGVhZCgpKTsKLSAgRVhQRUNUX0VRKDUxMiwgcXVldWVfLT50YWlsKCkpOwotCi0gIGNvbnN0IHVpbnQ4KiBidWY7Ci0gIGludCBzaXplOwotICBxdWV1ZV8tPlBlZWtBdCg0MDAsICZidWYsICZzaXplKTsKLSAgRVhQRUNUX0VRKHF1ZXVlXy0+dGFpbCgpIC0gNDAwLCBzaXplKTsKLSAgRVhQRUNUX0VRKDQwMCAtIDI1NiwgYnVmWzBdKTsKLQotICAvLyBUcmltbWluZyB0byB0aGUgZXhhY3QgZW5kIG9mIHRoZSBidWZmZXIgc2hvdWxkIHJldHVybiAndHJ1ZScuIFRoaXMKLSAgLy8gYWNjb21vZGF0ZXMgRU9TIGNhc2VzLgotICBFWFBFQ1RfVFJVRShxdWV1ZV8tPlRyaW0oNTEyKSk7Ci0gIEVYUEVDVF9FUSg1MTIsIHF1ZXVlXy0+aGVhZCgpKTsKLSAgcXVldWVfLT5QZWVrKCZidWYsICZzaXplKTsKLSAgRVhQRUNUX0VRKE5VTEwsIGJ1Zik7Ci0KLSAgLy8gVHJpbW1pbmcgcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgc2hvdWxkIHJldHVybiAnZmFsc2UnOyB3ZSBoYXZlbid0IHNlZW4KLSAgLy8gdGhlIHByZWNlZWRpbmcgYnl0ZXMuCi0gIEVYUEVDVF9GQUxTRShxdWV1ZV8tPlRyaW0oNTEzKSk7Ci0KLSAgLy8gSG93ZXZlciwgZG9pbmcgdGhhdCBzaG91bGRuJ3QgYWZmZWN0IHRoZSBFT1MgY2FzZS4gT25seSBhZGRpbmcgbmV3IGRhdGEKLSAgLy8gc2hvdWxkIGFsdGVyIHRoaXMgYmVoYXZpb3IuCi0gIEVYUEVDVF9UUlVFKHF1ZXVlXy0+VHJpbSg1MTIpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvbXA0L3JjaGVjay5oIGIvc3JjL21lZGlhL21wNC9yY2hlY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE2NTA1Ni4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvbXA0L3JjaGVjay5oCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9NUDRfUkNIRUNLX0hfCi0jZGVmaW5lIE1FRElBX01QNF9SQ0hFQ0tfSF8KLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotCi0jZGVmaW5lIFJDSEVDSyh4KSBcCi0gICAgZG8geyBcCi0gICAgICBpZiAoISh4KSkgeyBcCi0gICAgICAgIERMT0coRVJST1IpIDw8ICJGYWlsdXJlIHdoaWxlIHBhcnNpbmcgTVA0OiAiIDw8ICN4OyBcCi0gICAgICAgIHJldHVybiBmYWxzZTsgXAotICAgICAgfSBcCi0gICAgfSB3aGlsZSAoMCkKLQotI2VuZGlmICAvLyBNRURJQV9NUDRfUkNIRUNLX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvbXA0L3RyYWNrX3J1bl9pdGVyYXRvci5jYyBiL3NyYy9tZWRpYS9tcDQvdHJhY2tfcnVuX2l0ZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzIwMmIyLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9tcDQvdHJhY2tfcnVuX2l0ZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDUyICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9tcDQvdHJhY2tfcnVuX2l0ZXJhdG9yLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL3N0cmVhbV9wYXJzZXJfYnVmZmVyLmgiCi0jaW5jbHVkZSAibWVkaWEvbXA0L3JjaGVjay5oIgotCi1uYW1lc3BhY2Ugewotc3RhdGljIGNvbnN0IHVpbnQzMiBrU2FtcGxlSXNEaWZmZXJlbmNlU2FtcGxlRmxhZ01hc2sgPSAweDEwMDAwOwotfQotCi1uYW1lc3BhY2UgbWVkaWEgewotbmFtZXNwYWNlIG1wNCB7Ci0KLXN0cnVjdCBTYW1wbGVJbmZvIHsKLSAgaW50IHNpemU7Ci0gIGludCBkdXJhdGlvbjsKLSAgaW50IGN0c19vZmZzZXQ7Ci0gIGJvb2wgaXNfa2V5ZnJhbWU7Ci19OwotCi1zdHJ1Y3QgVHJhY2tSdW5JbmZvIHsKLSAgdWludDMyIHRyYWNrX2lkOwotICBzdGQ6OnZlY3RvcjxTYW1wbGVJbmZvPiBzYW1wbGVzOwotICBpbnQ2NCB0aW1lc2NhbGU7Ci0gIGludDY0IHN0YXJ0X2R0czsKLSAgaW50NjQgc2FtcGxlX3N0YXJ0X29mZnNldDsKLQotICBib29sIGlzX2F1ZGlvOwotICBjb25zdCBBdWRpb1NhbXBsZUVudHJ5KiBhdWRpb19kZXNjcmlwdGlvbjsKLSAgY29uc3QgVmlkZW9TYW1wbGVFbnRyeSogdmlkZW9fZGVzY3JpcHRpb247Ci0KLSAgaW50NjQgYXV4X2luZm9fc3RhcnRfb2Zmc2V0OyAgLy8gT25seSB2YWxpZCBpZiBhdXhfaW5mb190b3RhbF9zaXplID4gMC4KLSAgaW50IGF1eF9pbmZvX2RlZmF1bHRfc2l6ZTsKLSAgc3RkOjp2ZWN0b3I8dWludDg+IGF1eF9pbmZvX3NpemVzOyAgLy8gUG9wdWxhdGVkIGlmIGRlZmF1bHRfc2l6ZSA9PSAwLgotICBpbnQgYXV4X2luZm9fdG90YWxfc2l6ZTsKLQotICBUcmFja1J1bkluZm8oKTsKLSAgflRyYWNrUnVuSW5mbygpOwotfTsKLQotVHJhY2tSdW5JbmZvOjpUcmFja1J1bkluZm8oKQotICAgIDogdHJhY2tfaWQoMCksCi0gICAgICB0aW1lc2NhbGUoLTEpLAotICAgICAgc3RhcnRfZHRzKC0xKSwKLSAgICAgIHNhbXBsZV9zdGFydF9vZmZzZXQoLTEpLAotICAgICAgaXNfYXVkaW8oZmFsc2UpLAotICAgICAgYXV4X2luZm9fc3RhcnRfb2Zmc2V0KC0xKSwKLSAgICAgIGF1eF9pbmZvX2RlZmF1bHRfc2l6ZSgtMSksCi0gICAgICBhdXhfaW5mb190b3RhbF9zaXplKC0xKSB7Ci19Ci1UcmFja1J1bkluZm86On5UcmFja1J1bkluZm8oKSB7fQotCi1UaW1lRGVsdGEgVGltZURlbHRhRnJvbVJhdGlvbmFsKGludDY0IG51bWVyLCBpbnQ2NCBkZW5vbSkgewotICBEQ0hFQ0tfTFQoKG51bWVyID4gMCA/IG51bWVyIDogLW51bWVyKSwKLSAgICAgICAgICAgIGtpbnQ2NG1heCAvIGJhc2U6OlRpbWU6OmtNaWNyb3NlY29uZHNQZXJTZWNvbmQpOwotICByZXR1cm4gVGltZURlbHRhOjpGcm9tTWljcm9zZWNvbmRzKAotICAgICAgICBiYXNlOjpUaW1lOjprTWljcm9zZWNvbmRzUGVyU2Vjb25kICogbnVtZXIgLyBkZW5vbSk7Ci19Ci0KLVRyYWNrUnVuSXRlcmF0b3I6OlRyYWNrUnVuSXRlcmF0b3IoY29uc3QgTW92aWUqIG1vb3YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvZ0NCJiBsb2dfY2IpCi0gICAgOiBtb292Xyhtb292KSwgbG9nX2NiXyhsb2dfY2IpLCBzYW1wbGVfb2Zmc2V0XygwKSB7Ci0gIENIRUNLKG1vb3YpOwotfQotCi1UcmFja1J1bkl0ZXJhdG9yOjp+VHJhY2tSdW5JdGVyYXRvcigpIHt9Ci0KLXN0YXRpYyB2b2lkIFBvcHVsYXRlU2FtcGxlSW5mbyhjb25zdCBUcmFja0V4dGVuZHMmIHRyZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJhY2tGcmFnbWVudEhlYWRlciYgdGZoZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUcmFja0ZyYWdtZW50UnVuJiB0cnVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0IGVkaXRfbGlzdF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlSW5mbyogc2FtcGxlX2luZm8pIHsKLSAgaWYgKGkgPCB0cnVuLnNhbXBsZV9zaXplcy5zaXplKCkpIHsKLSAgICBzYW1wbGVfaW5mby0+c2l6ZSA9IHRydW4uc2FtcGxlX3NpemVzW2ldOwotICB9IGVsc2UgaWYgKHRmaGQuZGVmYXVsdF9zYW1wbGVfc2l6ZSA+IDApIHsKLSAgICBzYW1wbGVfaW5mby0+c2l6ZSA9IHRmaGQuZGVmYXVsdF9zYW1wbGVfc2l6ZTsKLSAgfSBlbHNlIHsKLSAgICBzYW1wbGVfaW5mby0+c2l6ZSA9IHRyZXguZGVmYXVsdF9zYW1wbGVfc2l6ZTsKLSAgfQotCi0gIGlmIChpIDwgdHJ1bi5zYW1wbGVfZHVyYXRpb25zLnNpemUoKSkgewotICAgIHNhbXBsZV9pbmZvLT5kdXJhdGlvbiA9IHRydW4uc2FtcGxlX2R1cmF0aW9uc1tpXTsKLSAgfSBlbHNlIGlmICh0ZmhkLmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uID4gMCkgewotICAgIHNhbXBsZV9pbmZvLT5kdXJhdGlvbiA9IHRmaGQuZGVmYXVsdF9zYW1wbGVfZHVyYXRpb247Ci0gIH0gZWxzZSB7Ci0gICAgc2FtcGxlX2luZm8tPmR1cmF0aW9uID0gdHJleC5kZWZhdWx0X3NhbXBsZV9kdXJhdGlvbjsKLSAgfQotCi0gIGlmIChpIDwgdHJ1bi5zYW1wbGVfY29tcG9zaXRpb25fdGltZV9vZmZzZXRzLnNpemUoKSkgewotICAgIHNhbXBsZV9pbmZvLT5jdHNfb2Zmc2V0ID0gdHJ1bi5zYW1wbGVfY29tcG9zaXRpb25fdGltZV9vZmZzZXRzW2ldOwotICB9IGVsc2UgewotICAgIHNhbXBsZV9pbmZvLT5jdHNfb2Zmc2V0ID0gMDsKLSAgfQotICBzYW1wbGVfaW5mby0+Y3RzX29mZnNldCArPSBlZGl0X2xpc3Rfb2Zmc2V0OwotCi0gIHVpbnQzMiBmbGFnczsKLSAgaWYgKGkgPCB0cnVuLnNhbXBsZV9mbGFncy5zaXplKCkpIHsKLSAgICBmbGFncyA9IHRydW4uc2FtcGxlX2ZsYWdzW2ldOwotICB9IGVsc2UgaWYgKHRmaGQuaGFzX2RlZmF1bHRfc2FtcGxlX2ZsYWdzKSB7Ci0gICAgZmxhZ3MgPSB0ZmhkLmRlZmF1bHRfc2FtcGxlX2ZsYWdzOwotICB9IGVsc2UgewotICAgIGZsYWdzID0gdHJleC5kZWZhdWx0X3NhbXBsZV9mbGFnczsKLSAgfQotICBzYW1wbGVfaW5mby0+aXNfa2V5ZnJhbWUgPSAhKGZsYWdzICYga1NhbXBsZUlzRGlmZmVyZW5jZVNhbXBsZUZsYWdNYXNrKTsKLX0KLQotLy8gSW4gd2VsbC1zdHJ1Y3R1cmVkIGVuY3J5cHRlZCBtZWRpYSwgZWFjaCB0cmFjayBydW4gd2lsbCBiZSBpbW1lZGlhdGVseQotLy8gcHJlY2VkZWQgYnkgaXRzIGF1eGlsaWFyeSBpbmZvcm1hdGlvbjsgdGhpcyBpcyB0aGUgb25seSBvcHRpbWFsIHN0b3JhZ2UKLS8vIHBhdHRlcm4gaW4gdGVybXMgb2YgbWluaW11bSBudW1iZXIgb2YgYnl0ZXMgZnJvbSBhIHNlcmlhbCBzdHJlYW0gbmVlZGVkIHRvCi0vLyBiZWdpbiBwbGF5YmFjay4gSXQgYWxzbyBhbGxvd3MgdXMgdG8gb3B0aW1pemUgY2FjaGluZyBvbiBtZW1vcnktY29uc3RyYWluZWQKLS8vIGFyY2hpdGVjdHVyZXMsIGJlY2F1c2Ugd2UgY2FuIGNhY2hlIHRoZSByZWxhdGl2ZWx5IHNtYWxsIGF1eGlsaWFyeQotLy8gaW5mb3JtYXRpb24gZm9yIGFuIGVudGlyZSBydW4gYW5kIHRoZW4gZGlzY2FyZCBkYXRhIGZyb20gdGhlIGlucHV0IHN0cmVhbSwKLS8vIGluc3RlYWQgb2YgcmV0YWluaW5nIHRoZSBlbnRpcmUgJ21kYXQnIGJveC4KLS8vCi0vLyBXZSBvcHRpbWl6ZSBmb3IgdGhpcyBzaXR1YXRpb24gKHdpdGggbm8gbG9zcyBvZiBnZW5lcmFsaXR5KSBieSBzb3J0aW5nIHRyYWNrCi0vLyBydW5zIGR1cmluZyBpdGVyYXRpb24gaW4gb3JkZXIgb2YgdGhlaXIgZmlyc3QgZGF0YSBvZmZzZXQgKGVpdGhlciBzYW1wbGUgZGF0YQotLy8gb3IgYXV4aWxpYXJ5IGRhdGEpLgotY2xhc3MgQ29tcGFyZU1pblRyYWNrUnVuRGF0YU9mZnNldCB7Ci0gcHVibGljOgotICBib29sIG9wZXJhdG9yKCkoY29uc3QgVHJhY2tSdW5JbmZvJiBhLCBjb25zdCBUcmFja1J1bkluZm8mIGIpIHsKLSAgICBpbnQ2NCBhX2F1eCA9IGEuYXV4X2luZm9fdG90YWxfc2l6ZSA/IGEuYXV4X2luZm9fc3RhcnRfb2Zmc2V0IDoga2ludDY0bWF4OwotICAgIGludDY0IGJfYXV4ID0gYi5hdXhfaW5mb190b3RhbF9zaXplID8gYi5hdXhfaW5mb19zdGFydF9vZmZzZXQgOiBraW50NjRtYXg7Ci0KLSAgICBpbnQ2NCBhX2xlc3NlciA9IHN0ZDo6bWluKGFfYXV4LCBhLnNhbXBsZV9zdGFydF9vZmZzZXQpOwotICAgIGludDY0IGFfZ3JlYXRlciA9IHN0ZDo6bWF4KGFfYXV4LCBhLnNhbXBsZV9zdGFydF9vZmZzZXQpOwotICAgIGludDY0IGJfbGVzc2VyID0gc3RkOjptaW4oYl9hdXgsIGIuc2FtcGxlX3N0YXJ0X29mZnNldCk7Ci0gICAgaW50NjQgYl9ncmVhdGVyID0gc3RkOjptYXgoYl9hdXgsIGIuc2FtcGxlX3N0YXJ0X29mZnNldCk7Ci0KLSAgICBpZiAoYV9sZXNzZXIgPT0gYl9sZXNzZXIpIHJldHVybiBhX2dyZWF0ZXIgPCBiX2dyZWF0ZXI7Ci0gICAgcmV0dXJuIGFfbGVzc2VyIDwgYl9sZXNzZXI7Ci0gIH0KLX07Ci0KLWJvb2wgVHJhY2tSdW5JdGVyYXRvcjo6SW5pdChjb25zdCBNb3ZpZUZyYWdtZW50JiBtb29mKSB7Ci0gIHJ1bnNfLmNsZWFyKCk7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtb29mLnRyYWNrcy5zaXplKCk7IGkrKykgewotICAgIGNvbnN0IFRyYWNrRnJhZ21lbnQmIHRyYWYgPSBtb29mLnRyYWNrc1tpXTsKLQotICAgIGNvbnN0IFRyYWNrKiB0cmFrID0gTlVMTDsKLSAgICBmb3IgKHNpemVfdCB0ID0gMDsgdCA8IG1vb3ZfLT50cmFja3Muc2l6ZSgpOyB0KyspIHsKLSAgICAgIGlmIChtb292Xy0+dHJhY2tzW3RdLmhlYWRlci50cmFja19pZCA9PSB0cmFmLmhlYWRlci50cmFja19pZCkKLSAgICAgICAgdHJhayA9ICZtb292Xy0+dHJhY2tzW3RdOwotICAgIH0KLSAgICBSQ0hFQ0sodHJhayk7Ci0KLSAgICBjb25zdCBUcmFja0V4dGVuZHMqIHRyZXggPSBOVUxMOwotICAgIGZvciAoc2l6ZV90IHQgPSAwOyB0IDwgbW9vdl8tPmV4dGVuZHMudHJhY2tzLnNpemUoKTsgdCsrKSB7Ci0gICAgICBpZiAobW9vdl8tPmV4dGVuZHMudHJhY2tzW3RdLnRyYWNrX2lkID09IHRyYWYuaGVhZGVyLnRyYWNrX2lkKQotICAgICAgICB0cmV4ID0gJm1vb3ZfLT5leHRlbmRzLnRyYWNrc1t0XTsKLSAgICB9Ci0gICAgUkNIRUNLKHRyZXgpOwotCi0gICAgY29uc3QgU2FtcGxlRGVzY3JpcHRpb24mIHN0c2QgPQotICAgICAgICB0cmFrLT5tZWRpYS5pbmZvcm1hdGlvbi5zYW1wbGVfdGFibGUuZGVzY3JpcHRpb247Ci0gICAgaWYgKHN0c2QudHlwZSAhPSBrQXVkaW8gJiYgc3RzZC50eXBlICE9IGtWaWRlbykgewotICAgICAgRFZMT0coMSkgPDwgIlNraXBwaW5nIHVuaGFuZGxlZCB0cmFjayB0eXBlIjsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBzaXplX3QgZGVzY19pZHggPSB0cmFmLmhlYWRlci5zYW1wbGVfZGVzY3JpcHRpb25faW5kZXg7Ci0gICAgaWYgKCFkZXNjX2lkeCkgZGVzY19pZHggPSB0cmV4LT5kZWZhdWx0X3NhbXBsZV9kZXNjcmlwdGlvbl9pbmRleDsKLSAgICBSQ0hFQ0soZGVzY19pZHggPiAwKTsgIC8vIERlc2NyaXB0aW9ucyBhcmUgb25lLWluZGV4ZWQgaW4gdGhlIGZpbGUKLSAgICBkZXNjX2lkeCAtPSAxOwotCi0gICAgLy8gUHJvY2VzcyBlZGl0IGxpc3QgdG8gcmVtb3ZlIENUUyBvZmZzZXQgaW50cm9kdWNlZCBpbiB0aGUgcHJlc2VuY2Ugb2YKLSAgICAvLyBCLWZyYW1lcyAodGhvc2UgdGhhdCBjb250YWluIGEgc2luZ2xlIGVkaXQgd2l0aCBhIG5vbm5lZ2F0aXZlIG1lZGlhCi0gICAgLy8gdGltZSkuIE90aGVyIHVzZXMgb2YgZWRpdCBsaXN0cyBhcmUgbm90IHN1cHBvcnRlZCwgYXMgdGhleSBhcmUKLSAgICAvLyBib3RoIHVuY29tbW9uIGFuZCBiZXR0ZXIgc2VydmVkIGJ5IGhpZ2hlci1sZXZlbCBwcm90b2NvbHMuCi0gICAgaW50NjQgZWRpdF9saXN0X29mZnNldCA9IDA7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8RWRpdExpc3RFbnRyeT4mIGVkaXRzID0gdHJhay0+ZWRpdC5saXN0LmVkaXRzOwotICAgIGlmICghZWRpdHMuZW1wdHkoKSkgewotICAgICAgaWYgKGVkaXRzLnNpemUoKSA+IDEpCi0gICAgICAgIERWTE9HKDEpIDw8ICJNdWx0aS1lbnRyeSBlZGl0IGJveCBkZXRlY3RlZDsgc29tZSBjb21wb25lbnRzIGlnbm9yZWQuIjsKLQotICAgICAgaWYgKGVkaXRzWzBdLm1lZGlhX3RpbWUgPCAwKSB7Ci0gICAgICAgIERWTE9HKDEpIDw8ICJFbXB0eSBlZGl0IGxpc3QgZW50cnkgaWdub3JlZC4iOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZWRpdF9saXN0X29mZnNldCA9IC1lZGl0c1swXS5tZWRpYV90aW1lOwotICAgICAgfQotICAgIH0KLQotICAgIGludDY0IHJ1bl9zdGFydF9kdHMgPSB0cmFmLmRlY29kZV90aW1lLmRlY29kZV90aW1lOwotICAgIGludCBzYW1wbGVfY291bnRfc3VtID0gMDsKLQotICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgdHJhZi5ydW5zLnNpemUoKTsgaisrKSB7Ci0gICAgICBjb25zdCBUcmFja0ZyYWdtZW50UnVuJiB0cnVuID0gdHJhZi5ydW5zW2pdOwotICAgICAgVHJhY2tSdW5JbmZvIHRyaTsKLSAgICAgIHRyaS50cmFja19pZCA9IHRyYWYuaGVhZGVyLnRyYWNrX2lkOwotICAgICAgdHJpLnRpbWVzY2FsZSA9IHRyYWstPm1lZGlhLmhlYWRlci50aW1lc2NhbGU7Ci0gICAgICB0cmkuc3RhcnRfZHRzID0gcnVuX3N0YXJ0X2R0czsKLSAgICAgIHRyaS5zYW1wbGVfc3RhcnRfb2Zmc2V0ID0gdHJ1bi5kYXRhX29mZnNldDsKLQotICAgICAgdHJpLmlzX2F1ZGlvID0gKHN0c2QudHlwZSA9PSBrQXVkaW8pOwotICAgICAgaWYgKHRyaS5pc19hdWRpbykgewotICAgICAgICBSQ0hFQ0soIXN0c2QuYXVkaW9fZW50cmllcy5lbXB0eSgpKTsKLSAgICAgICAgaWYgKGRlc2NfaWR4ID4gc3RzZC5hdWRpb19lbnRyaWVzLnNpemUoKSkKLSAgICAgICAgICBkZXNjX2lkeCA9IDA7Ci0gICAgICAgIHRyaS5hdWRpb19kZXNjcmlwdGlvbiA9ICZzdHNkLmF1ZGlvX2VudHJpZXNbZGVzY19pZHhdOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgUkNIRUNLKCFzdHNkLnZpZGVvX2VudHJpZXMuZW1wdHkoKSk7Ci0gICAgICAgIGlmIChkZXNjX2lkeCA+IHN0c2QudmlkZW9fZW50cmllcy5zaXplKCkpCi0gICAgICAgICAgZGVzY19pZHggPSAwOwotICAgICAgICB0cmkudmlkZW9fZGVzY3JpcHRpb24gPSAmc3RzZC52aWRlb19lbnRyaWVzW2Rlc2NfaWR4XTsKLSAgICAgIH0KLQotICAgICAgLy8gQ29sbGVjdCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBhdXhpbGlhcnlfb2Zmc2V0IGVudHJ5IHdpdGggdGhlIHNhbWUgaW5kZXgKLSAgICAgIC8vIGluIHRoZSAnc2FpeicgY29udGFpbmVyIGFzIHRoZSBjdXJyZW50IHJ1bidzIGluZGV4IGluIHRoZSAndHJ1bicKLSAgICAgIC8vIGNvbnRhaW5lciwgaWYgaXQgaXMgcHJlc2VudC4KLSAgICAgIGlmICh0cmFmLmF1eGlsaWFyeV9vZmZzZXQub2Zmc2V0cy5zaXplKCkgPiBqKSB7Ci0gICAgICAgIC8vIFRoZXJlIHNob3VsZCBiZSBhbiBhdXhpbGlhcnkgaW5mbyBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggc2FtcGxlCi0gICAgICAgIC8vIGluIHRoZSBhdXhpbGlhcnkgb2Zmc2V0IGVudHJ5J3MgY29ycmVzcG9uZGluZyB0cmFjayBydW4uCi0gICAgICAgIFJDSEVDSyh0cmFmLmF1eGlsaWFyeV9zaXplLnNhbXBsZV9jb3VudCA+PQotICAgICAgICAgICAgICAgc2FtcGxlX2NvdW50X3N1bSArIHRydW4uc2FtcGxlX2NvdW50KTsKLSAgICAgICAgdHJpLmF1eF9pbmZvX3N0YXJ0X29mZnNldCA9IHRyYWYuYXV4aWxpYXJ5X29mZnNldC5vZmZzZXRzW2pdOwotICAgICAgICB0cmkuYXV4X2luZm9fZGVmYXVsdF9zaXplID0KLSAgICAgICAgICAgIHRyYWYuYXV4aWxpYXJ5X3NpemUuZGVmYXVsdF9zYW1wbGVfaW5mb19zaXplOwotICAgICAgICBpZiAodHJpLmF1eF9pbmZvX2RlZmF1bHRfc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDg+JiBzaXplcyA9Ci0gICAgICAgICAgICAgIHRyYWYuYXV4aWxpYXJ5X3NpemUuc2FtcGxlX2luZm9fc2l6ZXM7Ci0gICAgICAgICAgdHJpLmF1eF9pbmZvX3NpemVzLmluc2VydCh0cmkuYXV4X2luZm9fc2l6ZXMuYmVnaW4oKSwKLSAgICAgICAgICAgICAgc2l6ZXMuYmVnaW4oKSArIHNhbXBsZV9jb3VudF9zdW0sCi0gICAgICAgICAgICAgIHNpemVzLmJlZ2luKCkgKyBzYW1wbGVfY291bnRfc3VtICsgdHJ1bi5zYW1wbGVfY291bnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgdGhlIGRlZmF1bHQgaW5mbyBzaXplIGlzIHBvc2l0aXZlLCBmaW5kIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBhdXgKLSAgICAgICAgLy8gaW5mbyBibG9jayBmcm9tIGl0LCBvdGhlcndpc2Ugc3VtIG92ZXIgdGhlIGluZGl2aWR1YWwgc2l6ZXMgb2YgZWFjaAotICAgICAgICAvLyBhdXggaW5mbyBlbnRyeSBpbiB0aGUgYXV4X29mZnNldCBlbnRyeS4KLSAgICAgICAgaWYgKHRyaS5hdXhfaW5mb19kZWZhdWx0X3NpemUpIHsKLSAgICAgICAgICB0cmkuYXV4X2luZm9fdG90YWxfc2l6ZSA9Ci0gICAgICAgICAgICAgIHRyaS5hdXhfaW5mb19kZWZhdWx0X3NpemUgKiB0cnVuLnNhbXBsZV9jb3VudDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB0cmkuYXV4X2luZm9fdG90YWxfc2l6ZSA9IDA7Ci0gICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCB0cnVuLnNhbXBsZV9jb3VudDsgaysrKSB7Ci0gICAgICAgICAgICB0cmkuYXV4X2luZm9fdG90YWxfc2l6ZSArPSB0cmkuYXV4X2luZm9fc2l6ZXNba107Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0cmkuYXV4X2luZm9fc3RhcnRfb2Zmc2V0ID0gLTE7Ci0gICAgICAgIHRyaS5hdXhfaW5mb190b3RhbF9zaXplID0gMDsKLSAgICAgIH0KLQotICAgICAgdHJpLnNhbXBsZXMucmVzaXplKHRydW4uc2FtcGxlX2NvdW50KTsKLSAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgdHJ1bi5zYW1wbGVfY291bnQ7IGsrKykgewotICAgICAgICBQb3B1bGF0ZVNhbXBsZUluZm8oKnRyZXgsIHRyYWYuaGVhZGVyLCB0cnVuLCBlZGl0X2xpc3Rfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaywgJnRyaS5zYW1wbGVzW2tdKTsKLSAgICAgICAgcnVuX3N0YXJ0X2R0cyArPSB0cmkuc2FtcGxlc1trXS5kdXJhdGlvbjsKLSAgICAgIH0KLSAgICAgIHJ1bnNfLnB1c2hfYmFjayh0cmkpOwotICAgICAgc2FtcGxlX2NvdW50X3N1bSArPSB0cnVuLnNhbXBsZV9jb3VudDsKLSAgICB9Ci0gIH0KLQotICBzdGQ6OnNvcnQocnVuc18uYmVnaW4oKSwgcnVuc18uZW5kKCksIENvbXBhcmVNaW5UcmFja1J1bkRhdGFPZmZzZXQoKSk7Ci0gIHJ1bl9pdHJfID0gcnVuc18uYmVnaW4oKTsKLSAgUmVzZXRSdW4oKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgVHJhY2tSdW5JdGVyYXRvcjo6QWR2YW5jZVJ1bigpIHsKLSAgKytydW5faXRyXzsKLSAgUmVzZXRSdW4oKTsKLX0KLQotdm9pZCBUcmFja1J1bkl0ZXJhdG9yOjpSZXNldFJ1bigpIHsKLSAgaWYgKCFJc1J1blZhbGlkKCkpIHJldHVybjsKLSAgc2FtcGxlX2R0c18gPSBydW5faXRyXy0+c3RhcnRfZHRzOwotICBzYW1wbGVfb2Zmc2V0XyA9IHJ1bl9pdHJfLT5zYW1wbGVfc3RhcnRfb2Zmc2V0OwotICBzYW1wbGVfaXRyXyA9IHJ1bl9pdHJfLT5zYW1wbGVzLmJlZ2luKCk7Ci0gIGNlbmNfaW5mb18uY2xlYXIoKTsKLX0KLQotdm9pZCBUcmFja1J1bkl0ZXJhdG9yOjpBZHZhbmNlU2FtcGxlKCkgewotICBEQ0hFQ0soSXNTYW1wbGVWYWxpZCgpKTsKLSAgc2FtcGxlX2R0c18gKz0gc2FtcGxlX2l0cl8tPmR1cmF0aW9uOwotICBzYW1wbGVfb2Zmc2V0XyArPSBzYW1wbGVfaXRyXy0+c2l6ZTsKLSAgKytzYW1wbGVfaXRyXzsKLX0KLQotLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBvbmx5IGluZGljYXRlcyBhIG5lZWQgZm9yIGNhY2hpbmcgaWYgQ0VOQyBhdXhpbGlhcnkKLS8vIGluZm8gaXMgYXZhaWxhYmxlIGluIHRoZSBzdHJlYW0uCi1ib29sIFRyYWNrUnVuSXRlcmF0b3I6OkF1eEluZm9OZWVkc1RvQmVDYWNoZWQoKSB7Ci0gIERDSEVDSyhJc1J1blZhbGlkKCkpOwotICByZXR1cm4gaXNfZW5jcnlwdGVkKCkgJiYgYXV4X2luZm9fc2l6ZSgpID4gMCAmJiBjZW5jX2luZm9fLnNpemUoKSA9PSAwOwotfQotCi0vLyBUaGlzIGltcGxlbWVudGF0aW9uIGN1cnJlbnRseSBvbmx5IGNhY2hlcyBDRU5DIGF1eGlsaWFyeSBpbmZvLgotYm9vbCBUcmFja1J1bkl0ZXJhdG9yOjpDYWNoZUF1eEluZm8oY29uc3QgdWludDgqIGJ1ZiwgaW50IGJ1Zl9zaXplKSB7Ci0gIFJDSEVDSyhBdXhJbmZvTmVlZHNUb0JlQ2FjaGVkKCkgJiYgYnVmX3NpemUgPj0gYXV4X2luZm9fc2l6ZSgpKTsKLQotICBjZW5jX2luZm9fLnJlc2l6ZShydW5faXRyXy0+c2FtcGxlcy5zaXplKCkpOwotICBpbnQ2NCBwb3MgPSAwOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJ1bl9pdHJfLT5zYW1wbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgaW50IGluZm9fc2l6ZSA9IHJ1bl9pdHJfLT5hdXhfaW5mb19kZWZhdWx0X3NpemU7Ci0gICAgaWYgKCFpbmZvX3NpemUpCi0gICAgICBpbmZvX3NpemUgPSBydW5faXRyXy0+YXV4X2luZm9fc2l6ZXNbaV07Ci0KLSAgICBCdWZmZXJSZWFkZXIgcmVhZGVyKGJ1ZiArIHBvcywgaW5mb19zaXplKTsKLSAgICBSQ0hFQ0soY2VuY19pbmZvX1tpXS5QYXJzZSh0cmFja19lbmNyeXB0aW9uKCkuZGVmYXVsdF9pdl9zaXplLCAmcmVhZGVyKSk7Ci0gICAgcG9zICs9IGluZm9fc2l6ZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFRyYWNrUnVuSXRlcmF0b3I6OklzUnVuVmFsaWQoKSBjb25zdCB7Ci0gIHJldHVybiBydW5faXRyXyAhPSBydW5zXy5lbmQoKTsKLX0KLQotYm9vbCBUcmFja1J1bkl0ZXJhdG9yOjpJc1NhbXBsZVZhbGlkKCkgY29uc3QgewotICByZXR1cm4gSXNSdW5WYWxpZCgpICYmIChzYW1wbGVfaXRyXyAhPSBydW5faXRyXy0+c2FtcGxlcy5lbmQoKSk7Ci19Ci0KLS8vIEJlY2F1c2UgdHJhY2tzIGFyZSBpbiBzb3J0ZWQgb3JkZXIgYW5kIGF1eGlsaWFyeSBpbmZvcm1hdGlvbiBpcyBjYWNoZWQgd2hlbgotLy8gcmV0dXJuaW5nIHNhbXBsZXMsIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCBubyBkYXRhIHdpbGwgYmUgcmVxdWlyZWQgYmVmb3JlIHRoZQotLy8gbGVzc2VyIG9mIHRoZSBtaW5pbXVtIGRhdGEgb2Zmc2V0IG9mIHRoaXMgdHJhY2sgYW5kIHRoZSBuZXh0IGluIHNlcXVlbmNlLgotLy8gKFRoZSBzdHJvbmdlciBjb25kaXRpb24gLSB0aGF0IG5vIGRhdGEgaXMgcmVxdWlyZWQgYmVmb3JlIHRoZSBtaW5pbXVtIGRhdGEKLS8vIG9mZnNldCBvZiB0aGlzIHRyYWNrIGFsb25lIC0gaXMgbm90IGd1YXJhbnRlZWQsIGJlY2F1c2UgdGhlIEJNRkYgc3BlYyBkb2VzCi0vLyBub3QgaGF2ZSBhbnkgaW50ZXItcnVuIG9yZGVyaW5nIHJlc3RyaWN0aW9ucy4pCi1pbnQ2NCBUcmFja1J1bkl0ZXJhdG9yOjpHZXRNYXhDbGVhck9mZnNldCgpIHsKLSAgaW50NjQgb2Zmc2V0ID0ga2ludDY0bWF4OwotCi0gIGlmIChJc1NhbXBsZVZhbGlkKCkpIHsKLSAgICBvZmZzZXQgPSBzdGQ6Om1pbihvZmZzZXQsIHNhbXBsZV9vZmZzZXRfKTsKLSAgICBpZiAoQXV4SW5mb05lZWRzVG9CZUNhY2hlZCgpKQotICAgICAgb2Zmc2V0ID0gc3RkOjptaW4ob2Zmc2V0LCBhdXhfaW5mb19vZmZzZXQoKSk7Ci0gIH0KLSAgaWYgKHJ1bl9pdHJfICE9IHJ1bnNfLmVuZCgpKSB7Ci0gICAgc3RkOjp2ZWN0b3I8VHJhY2tSdW5JbmZvPjo6Y29uc3RfaXRlcmF0b3IgbmV4dF9ydW4gPSBydW5faXRyXyArIDE7Ci0gICAgaWYgKG5leHRfcnVuICE9IHJ1bnNfLmVuZCgpKSB7Ci0gICAgICBvZmZzZXQgPSBzdGQ6Om1pbihvZmZzZXQsIG5leHRfcnVuLT5zYW1wbGVfc3RhcnRfb2Zmc2V0KTsKLSAgICAgIGlmIChuZXh0X3J1bi0+YXV4X2luZm9fdG90YWxfc2l6ZSkKLSAgICAgICAgb2Zmc2V0ID0gc3RkOjptaW4ob2Zmc2V0LCBuZXh0X3J1bi0+YXV4X2luZm9fc3RhcnRfb2Zmc2V0KTsKLSAgICB9Ci0gIH0KLSAgaWYgKG9mZnNldCA9PSBraW50NjRtYXgpIHJldHVybiAwOwotICByZXR1cm4gb2Zmc2V0OwotfQotCi1UaW1lRGVsdGEgVHJhY2tSdW5JdGVyYXRvcjo6R2V0TWluRGVjb2RlVGltZXN0YW1wKCkgewotICBUaW1lRGVsdGEgZHRzID0ga0luZmluaXRlRHVyYXRpb24oKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBydW5zXy5zaXplKCk7IGkrKykgewotICAgIGR0cyA9IHN0ZDo6bWluKGR0cywgVGltZURlbHRhRnJvbVJhdGlvbmFsKHJ1bnNfW2ldLnN0YXJ0X2R0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5zX1tpXS50aW1lc2NhbGUpKTsKLSAgfQotICByZXR1cm4gZHRzOwotfQotCi11aW50MzIgVHJhY2tSdW5JdGVyYXRvcjo6dHJhY2tfaWQoKSBjb25zdCB7Ci0gIERDSEVDSyhJc1J1blZhbGlkKCkpOwotICByZXR1cm4gcnVuX2l0cl8tPnRyYWNrX2lkOwotfQotCi1ib29sIFRyYWNrUnVuSXRlcmF0b3I6OmlzX2VuY3J5cHRlZCgpIGNvbnN0IHsKLSAgRENIRUNLKElzUnVuVmFsaWQoKSk7Ci0gIHJldHVybiB0cmFja19lbmNyeXB0aW9uKCkuaXNfZW5jcnlwdGVkOwotfQotCi1pbnQ2NCBUcmFja1J1bkl0ZXJhdG9yOjphdXhfaW5mb19vZmZzZXQoKSBjb25zdCB7Ci0gIHJldHVybiBydW5faXRyXy0+YXV4X2luZm9fc3RhcnRfb2Zmc2V0OwotfQotCi1pbnQgVHJhY2tSdW5JdGVyYXRvcjo6YXV4X2luZm9fc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHJ1bl9pdHJfLT5hdXhfaW5mb190b3RhbF9zaXplOwotfQotCi1ib29sIFRyYWNrUnVuSXRlcmF0b3I6OmlzX2F1ZGlvKCkgY29uc3QgewotICBEQ0hFQ0soSXNSdW5WYWxpZCgpKTsKLSAgcmV0dXJuIHJ1bl9pdHJfLT5pc19hdWRpbzsKLX0KLQotY29uc3QgQXVkaW9TYW1wbGVFbnRyeSYgVHJhY2tSdW5JdGVyYXRvcjo6YXVkaW9fZGVzY3JpcHRpb24oKSBjb25zdCB7Ci0gIERDSEVDSyhpc19hdWRpbygpKTsKLSAgRENIRUNLKHJ1bl9pdHJfLT5hdWRpb19kZXNjcmlwdGlvbik7Ci0gIHJldHVybiAqcnVuX2l0cl8tPmF1ZGlvX2Rlc2NyaXB0aW9uOwotfQotCi1jb25zdCBWaWRlb1NhbXBsZUVudHJ5JiBUcmFja1J1bkl0ZXJhdG9yOjp2aWRlb19kZXNjcmlwdGlvbigpIGNvbnN0IHsKLSAgRENIRUNLKCFpc19hdWRpbygpKTsKLSAgRENIRUNLKHJ1bl9pdHJfLT52aWRlb19kZXNjcmlwdGlvbik7Ci0gIHJldHVybiAqcnVuX2l0cl8tPnZpZGVvX2Rlc2NyaXB0aW9uOwotfQotCi1pbnQ2NCBUcmFja1J1bkl0ZXJhdG9yOjpzYW1wbGVfb2Zmc2V0KCkgY29uc3QgewotICBEQ0hFQ0soSXNTYW1wbGVWYWxpZCgpKTsKLSAgcmV0dXJuIHNhbXBsZV9vZmZzZXRfOwotfQotCi1pbnQgVHJhY2tSdW5JdGVyYXRvcjo6c2FtcGxlX3NpemUoKSBjb25zdCB7Ci0gIERDSEVDSyhJc1NhbXBsZVZhbGlkKCkpOwotICByZXR1cm4gc2FtcGxlX2l0cl8tPnNpemU7Ci19Ci0KLVRpbWVEZWx0YSBUcmFja1J1bkl0ZXJhdG9yOjpkdHMoKSBjb25zdCB7Ci0gIERDSEVDSyhJc1NhbXBsZVZhbGlkKCkpOwotICByZXR1cm4gVGltZURlbHRhRnJvbVJhdGlvbmFsKHNhbXBsZV9kdHNfLCBydW5faXRyXy0+dGltZXNjYWxlKTsKLX0KLQotVGltZURlbHRhIFRyYWNrUnVuSXRlcmF0b3I6OmN0cygpIGNvbnN0IHsKLSAgRENIRUNLKElzU2FtcGxlVmFsaWQoKSk7Ci0gIHJldHVybiBUaW1lRGVsdGFGcm9tUmF0aW9uYWwoc2FtcGxlX2R0c18gKyBzYW1wbGVfaXRyXy0+Y3RzX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5faXRyXy0+dGltZXNjYWxlKTsKLX0KLQotVGltZURlbHRhIFRyYWNrUnVuSXRlcmF0b3I6OmR1cmF0aW9uKCkgY29uc3QgewotICBEQ0hFQ0soSXNTYW1wbGVWYWxpZCgpKTsKLSAgcmV0dXJuIFRpbWVEZWx0YUZyb21SYXRpb25hbChzYW1wbGVfaXRyXy0+ZHVyYXRpb24sIHJ1bl9pdHJfLT50aW1lc2NhbGUpOwotfQotCi1ib29sIFRyYWNrUnVuSXRlcmF0b3I6OmlzX2tleWZyYW1lKCkgY29uc3QgewotICBEQ0hFQ0soSXNTYW1wbGVWYWxpZCgpKTsKLSAgcmV0dXJuIHNhbXBsZV9pdHJfLT5pc19rZXlmcmFtZTsKLX0KLQotY29uc3QgVHJhY2tFbmNyeXB0aW9uJiBUcmFja1J1bkl0ZXJhdG9yOjp0cmFja19lbmNyeXB0aW9uKCkgY29uc3QgewotICBpZiAoaXNfYXVkaW8oKSkKLSAgICByZXR1cm4gYXVkaW9fZGVzY3JpcHRpb24oKS5zaW5mLmluZm8udHJhY2tfZW5jcnlwdGlvbjsKLSAgcmV0dXJuIHZpZGVvX2Rlc2NyaXB0aW9uKCkuc2luZi5pbmZvLnRyYWNrX2VuY3J5cHRpb247Ci19Ci0KLXNjb3BlZF9wdHI8RGVjcnlwdENvbmZpZz4gVHJhY2tSdW5JdGVyYXRvcjo6R2V0RGVjcnlwdENvbmZpZygpIHsKLSAgc2l6ZV90IHNhbXBsZV9pZHggPSBzYW1wbGVfaXRyXyAtIHJ1bl9pdHJfLT5zYW1wbGVzLmJlZ2luKCk7Ci0gIERDSEVDSyhzYW1wbGVfaWR4IDwgY2VuY19pbmZvXy5zaXplKCkpOwotICBjb25zdCBGcmFtZUNFTkNJbmZvJiBjZW5jX2luZm8gPSBjZW5jX2luZm9fW3NhbXBsZV9pZHhdOwotICBEQ0hFQ0soaXNfZW5jcnlwdGVkKCkgJiYgIUF1eEluZm9OZWVkc1RvQmVDYWNoZWQoKSk7Ci0KLSAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOwotICBpZiAoIWNlbmNfaW5mby5zdWJzYW1wbGVzLmVtcHR5KCkgJiYKLSAgICAgICghY2VuY19pbmZvLkdldFRvdGFsU2l6ZU9mU3Vic2FtcGxlcygmdG90YWxfc2l6ZSkgfHwKLSAgICAgICB0b3RhbF9zaXplICE9IHN0YXRpY19jYXN0PHNpemVfdD4oc2FtcGxlX3NpemUoKSkpKSB7Ci0gICAgTUVESUFfTE9HKGxvZ19jYl8pIDw8ICJJbmNvcnJlY3QgQ0VOQyBzdWJzYW1wbGUgc2l6ZS4iOwotICAgIHJldHVybiBzY29wZWRfcHRyPERlY3J5cHRDb25maWc+KCk7Ci0gIH0KLQotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OD4mIGtpZCA9IHRyYWNrX2VuY3J5cHRpb24oKS5kZWZhdWx0X2tpZDsKLSAgcmV0dXJuIHNjb3BlZF9wdHI8RGVjcnlwdENvbmZpZz4obmV3IERlY3J5cHRDb25maWcoCi0gICAgICBzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigma2lkWzBdKSwga2lkLnNpemUoKSksCi0gICAgICBzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihjZW5jX2luZm8uaXYpLAotICAgICAgICAgICAgICAgICAgYXJyYXlzaXplKGNlbmNfaW5mby5pdikpLAotI2lmICFkZWZpbmVkKF9fTEJfU0hFTExfXykgJiYgIWRlZmluZWQoQ09CQUxUKQotICAgICAgMCwgIC8vIE5vIG9mZnNldCB0byBzdGFydCBvZiBtZWRpYSBkYXRhIGluIE1QNCB1c2luZyBDRU5DLgotI2VuZGlmICAvLyAhZGVmaW5lZChfX0xCX1NIRUxMX18pICYmICFkZWZpbmVkKENPQkFMVCkKLSAgICAgIGNlbmNfaW5mby5zdWJzYW1wbGVzKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtcDQKLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL21wNC90cmFja19ydW5faXRlcmF0b3IuaCBiL3NyYy9tZWRpYS9tcDQvdHJhY2tfcnVuX2l0ZXJhdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMDgzY2EuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL21wNC90cmFja19ydW5faXRlcmF0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX01QNF9UUkFDS19SVU5fSVRFUkFUT1JfSF8KLSNkZWZpbmUgTUVESUFfTVA0X1RSQUNLX1JVTl9JVEVSQVRPUl9IXwotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgImJhc2UvdGltZS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9sb2cuaCIKLSNpbmNsdWRlICJtZWRpYS9tcDQvYm94X2RlZmluaXRpb25zLmgiCi0jaW5jbHVkZSAibWVkaWEvbXA0L2NlbmMuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgRGVjcnlwdENvbmZpZzsKLQotbmFtZXNwYWNlIG1wNCB7Ci0KLXVzaW5nIGJhc2U6OlRpbWVEZWx0YTsKLWJhc2U6OlRpbWVEZWx0YSBNRURJQV9FWFBPUlQgVGltZURlbHRhRnJvbVJhdGlvbmFsKGludDY0IG51bWVyLCBpbnQ2NCBkZW5vbSk7Ci0KLXN0cnVjdCBTYW1wbGVJbmZvOwotc3RydWN0IFRyYWNrUnVuSW5mbzsKLQotY2xhc3MgTUVESUFfRVhQT1JUIFRyYWNrUnVuSXRlcmF0b3IgewotIHB1YmxpYzoKLSAgLy8gQ3JlYXRlIGEgbmV3IFRyYWNrUnVuSXRlcmF0b3IuIEEgcmVmZXJlbmNlIHRvIHxtb292fCB3aWxsIGJlIHJldGFpbmVkIGZvcgotICAvLyB0aGUgbGlmZXRpbWUgb2YgdGhpcyBvYmplY3QuCi0gIFRyYWNrUnVuSXRlcmF0b3IoY29uc3QgTW92aWUqIG1vb3YsIGNvbnN0IExvZ0NCJiBsb2dfY2IpOwotICB+VHJhY2tSdW5JdGVyYXRvcigpOwotCi0gIHZvaWQgUmVzZXQoKTsKLQotICAvLyBTZXRzIHVwIHRoZSBpdGVyYXRvciB0byBoYW5kbGUgYWxsIHRoZSBydW5zIGZyb20gdGhlIGN1cnJlbnQgZnJhZ21lbnQuCi0gIGJvb2wgSW5pdChjb25zdCBNb3ZpZUZyYWdtZW50JiBtb29mKTsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGN1cnJlbnQgcnVuIG9yIHNhbXBsZSBhcmUgdmFsaWQuCi0gIGJvb2wgSXNSdW5WYWxpZCgpIGNvbnN0OwotICBib29sIElzU2FtcGxlVmFsaWQoKSBjb25zdDsKLQotICAvLyBBZHZhbmNlIHRoZSBwcm9wZXJ0aWVzIHRvIHJlZmVyIHRvIHRoZSBuZXh0IHJ1biBvciBzYW1wbGUuIFJlcXVpcmVzIHRoYXQKLSAgLy8gdGhlIGN1cnJlbnQgc2FtcGxlIGJlIHZhbGlkLgotICB2b2lkIEFkdmFuY2VSdW4oKTsKLSAgdm9pZCBBZHZhbmNlU2FtcGxlKCk7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgdHJhY2sgcnVuIGhhcyBhdXhpbGlhcnkgaW5mb3JtYXRpb24gYW5kIGhhcyBub3QgeWV0Ci0gIC8vIGJlZW4gY2FjaGVkLiBPbmx5IHZhbGlkIGlmIElzUnVuVmFsaWQoKS4KLSAgYm9vbCBBdXhJbmZvTmVlZHNUb0JlQ2FjaGVkKCk7Ci0KLSAgLy8gQ2FjaGVzIHRoZSBDRU5DIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyLiB8YnVmfCBtdXN0IGJlIGEgYnVmZmVyIHN0YXJ0aW5nCi0gIC8vIGF0IHRoZSBvZmZzZXQgZ2l2ZW4gYnkgY2VuY19vZmZzZXQoKSwgd2l0aCBhIHxzaXplfCBvZiBhdCBsZWFzdAotICAvLyBjZW5jX3NpemUoKS4gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGVycm9yLgotICBib29sIENhY2hlQXV4SW5mbyhjb25zdCB1aW50OCogYnVmLCBpbnQgc2l6ZSk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgbWF4aW11bSBidWZmZXIgbG9jYXRpb24gYXQgd2hpY2ggbm8gZGF0YSBlYXJsaWVyIGluIHRoZSBzdHJlYW0KLSAgLy8gd2lsbCBiZSByZXF1aXJlZCBpbiBvcmRlciB0byByZWFkIHRoZSBjdXJyZW50IG9yIGFueSBzdWJzZXF1ZW50IHNhbXBsZS4gWW91Ci0gIC8vIG1heSBjbGVhciBhbGwgZGF0YSB1cCB0byB0aGlzIG9mZnNldCBiZWZvcmUgcmVhZGluZyB0aGUgY3VycmVudCBzYW1wbGUKLSAgLy8gc2FmZWx5LiBSZXN1bHQgaXMgaW4gdGhlIHNhbWUgdW5pdHMgYXMgb2Zmc2V0KCkgKGZvciBNZWRpYSBTb3VyY2UgdGhpcyBpcwotICAvLyBpbiBieXRlcyBwYXN0IHRoZSB0aGUgaGVhZCBvZiB0aGUgTU9PRiBib3gpLgotICBpbnQ2NCBHZXRNYXhDbGVhck9mZnNldCgpOwotCi0gIC8vIFJldHVybnMgdGhlIG1pbmltdW0gdGltZXN0YW1wIChvciBrSW5maW5pdGVEdXJhdGlvbiBpZiBubyBydW5zIHByZXNlbnQpLgotICBUaW1lRGVsdGEgR2V0TWluRGVjb2RlVGltZXN0YW1wKCk7Ci0KLSAgLy8gUHJvcGVydHkgb2YgdGhlIGN1cnJlbnQgcnVuLiBPbmx5IHZhbGlkIGlmIElzUnVuVmFsaWQoKS4KLSAgdWludDMyIHRyYWNrX2lkKCkgY29uc3Q7Ci0gIGludDY0IGF1eF9pbmZvX29mZnNldCgpIGNvbnN0OwotICBpbnQgYXV4X2luZm9fc2l6ZSgpIGNvbnN0OwotICBib29sIGlzX2VuY3J5cHRlZCgpIGNvbnN0OwotICBib29sIGlzX2F1ZGlvKCkgY29uc3Q7Ci0gIC8vIE9ubHkgb25lIGlzIHZhbGlkLCBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgaXNfYXVkaW8oKS4KLSAgY29uc3QgQXVkaW9TYW1wbGVFbnRyeSYgYXVkaW9fZGVzY3JpcHRpb24oKSBjb25zdDsKLSAgY29uc3QgVmlkZW9TYW1wbGVFbnRyeSYgdmlkZW9fZGVzY3JpcHRpb24oKSBjb25zdDsKLQotICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBjdXJyZW50IHNhbXBsZS4gT25seSB2YWxpZCBpZiBJc1NhbXBsZVZhbGlkKCkuCi0gIGludDY0IHNhbXBsZV9vZmZzZXQoKSBjb25zdDsKLSAgaW50IHNhbXBsZV9zaXplKCkgY29uc3Q7Ci0gIFRpbWVEZWx0YSBkdHMoKSBjb25zdDsKLSAgVGltZURlbHRhIGN0cygpIGNvbnN0OwotICBUaW1lRGVsdGEgZHVyYXRpb24oKSBjb25zdDsKLSAgYm9vbCBpc19rZXlmcmFtZSgpIGNvbnN0OwotCi0gIC8vIE9ubHkgY2FsbCB3aGVuIGlzX2VuY3J5cHRlZCgpIGlzIHRydWUgYW5kIEF1eEluZm9OZWVkc1RvQmVDYWNoZWQoKSBpcwotICAvLyBmYWxzZS4gUmVzdWx0IGlzIG93bmVkIGJ5IGNhbGxlci4KLSAgc2NvcGVkX3B0cjxEZWNyeXB0Q29uZmlnPiBHZXREZWNyeXB0Q29uZmlnKCk7Ci0KLSBwcml2YXRlOgotICB2b2lkIFJlc2V0UnVuKCk7Ci0gIGNvbnN0IFRyYWNrRW5jcnlwdGlvbiYgdHJhY2tfZW5jcnlwdGlvbigpIGNvbnN0OwotCi0gIGNvbnN0IE1vdmllKiBtb292XzsKLSAgTG9nQ0IgbG9nX2NiXzsKLQotICBzdGQ6OnZlY3RvcjxUcmFja1J1bkluZm8+IHJ1bnNfOwotICBzdGQ6OnZlY3RvcjxUcmFja1J1bkluZm8+Ojpjb25zdF9pdGVyYXRvciBydW5faXRyXzsKLSAgc3RkOjp2ZWN0b3I8U2FtcGxlSW5mbz46OmNvbnN0X2l0ZXJhdG9yIHNhbXBsZV9pdHJfOwotCi0gIHN0ZDo6dmVjdG9yPEZyYW1lQ0VOQ0luZm8+IGNlbmNfaW5mb187Ci0KLSAgaW50NjQgc2FtcGxlX2R0c187Ci0gIGludDY0IHNhbXBsZV9vZmZzZXRfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihUcmFja1J1bkl0ZXJhdG9yKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtcDQKLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX01QNF9UUkFDS19SVU5fSVRFUkFUT1JfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9tcDQvdHJhY2tfcnVuX2l0ZXJhdG9yX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL21wNC90cmFja19ydW5faXRlcmF0b3JfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwY2JiZTYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL21wNC90cmFja19ydW5faXRlcmF0b3JfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJtZWRpYS9tcDQvYm94X2RlZmluaXRpb25zLmgiCi0jaW5jbHVkZSAibWVkaWEvbXA0L3JjaGVjay5oIgotI2luY2x1ZGUgIm1lZGlhL21wNC90cmFja19ydW5faXRlcmF0b3IuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotLy8gVGhlIHN1bSBvZiB0aGUgZWxlbWVudHMgaW4gYSB2ZWN0b3IgaW5pdGlhbGl6ZWQgd2l0aCBTdW1Bc2NlbmRpbmcsCi0vLyBsZXNzIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBlbGVtZW50Lgotc3RhdGljIGNvbnN0IGludCBrU3VtQXNjZW5kaW5nMSA9IDQ1OwotCi1zdGF0aWMgY29uc3QgaW50IGtBdWRpb1NjYWxlID0gNDgwMDA7Ci1zdGF0aWMgY29uc3QgaW50IGtWaWRlb1NjYWxlID0gMjU7Ci0KLXN0YXRpYyBjb25zdCB1aW50MzIga1NhbXBsZUlzRGlmZmVyZW5jZVNhbXBsZUZsYWdNYXNrID0gMHgxMDAwMDsKLQotc3RhdGljIGNvbnN0IHVpbnQ4IGtBdXhJbmZvW10gPSB7Ci0gIDB4NDEsIDB4NTQsIDB4NjUsIDB4NzMsIDB4NzQsIDB4NDksIDB4NzYsIDB4MzEsCi0gIDB4NDEsIDB4NTQsIDB4NjUsIDB4NzMsIDB4NzQsIDB4NDksIDB4NzYsIDB4MzIsCi0gIDB4MDAsIDB4MDIsCi0gIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsCi0gIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGtJdjFbXSA9IHsKLSAgMHg0MSwgMHg1NCwgMHg2NSwgMHg3MywgMHg3NCwgMHg0OSwgMHg3NiwgMHgzMSwKLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4IGtLZXlJZFtdID0gewotICAweDQxLCAweDQ3LCAweDZmLCAweDZmLCAweDY3LCAweDZjLCAweDY1LCAweDU0LAotICAweDY1LCAweDczLCAweDc0LCAweDRiLCAweDY1LCAweDc5LCAweDQ5LCAweDQ0Ci19OwotCi1uYW1lc3BhY2UgbWVkaWEgewotbmFtZXNwYWNlIG1wNCB7Ci0KLWNsYXNzIFRyYWNrUnVuSXRlcmF0b3JUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgVHJhY2tSdW5JdGVyYXRvclRlc3QoKSB7Ci0gICAgQ3JlYXRlTW92aWUoKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBNb3ZpZSBtb292XzsKLSAgTG9nQ0IgbG9nX2NiXzsKLSAgc2NvcGVkX3B0cjxUcmFja1J1bkl0ZXJhdG9yPiBpdGVyXzsKLQotICB2b2lkIENyZWF0ZU1vdmllKCkgewotICAgIG1vb3ZfLmhlYWRlci50aW1lc2NhbGUgPSAxMDAwOwotICAgIG1vb3ZfLnRyYWNrcy5yZXNpemUoMyk7Ci0gICAgbW9vdl8uZXh0ZW5kcy50cmFja3MucmVzaXplKDIpOwotICAgIG1vb3ZfLnRyYWNrc1swXS5oZWFkZXIudHJhY2tfaWQgPSAxOwotICAgIG1vb3ZfLnRyYWNrc1swXS5tZWRpYS5oZWFkZXIudGltZXNjYWxlID0ga0F1ZGlvU2NhbGU7Ci0gICAgU2FtcGxlRGVzY3JpcHRpb24mIGRlc2MxID0KLSAgICAgICAgbW9vdl8udHJhY2tzWzBdLm1lZGlhLmluZm9ybWF0aW9uLnNhbXBsZV90YWJsZS5kZXNjcmlwdGlvbjsKLSAgICBBdWRpb1NhbXBsZUVudHJ5IGF1ZF9kZXNjOwotICAgIGF1ZF9kZXNjLmZvcm1hdCA9IEZPVVJDQ19NUDRBOwotICAgIGF1ZF9kZXNjLnNpbmYuaW5mby50cmFja19lbmNyeXB0aW9uLmlzX2VuY3J5cHRlZCA9IGZhbHNlOwotICAgIGRlc2MxLnR5cGUgPSBrQXVkaW87Ci0gICAgZGVzYzEuYXVkaW9fZW50cmllcy5wdXNoX2JhY2soYXVkX2Rlc2MpOwotICAgIG1vb3ZfLmV4dGVuZHMudHJhY2tzWzBdLnRyYWNrX2lkID0gMTsKLSAgICBtb292Xy5leHRlbmRzLnRyYWNrc1swXS5kZWZhdWx0X3NhbXBsZV9kZXNjcmlwdGlvbl9pbmRleCA9IDE7Ci0KLSAgICBtb292Xy50cmFja3NbMV0uaGVhZGVyLnRyYWNrX2lkID0gMjsKLSAgICBtb292Xy50cmFja3NbMV0ubWVkaWEuaGVhZGVyLnRpbWVzY2FsZSA9IGtWaWRlb1NjYWxlOwotICAgIFNhbXBsZURlc2NyaXB0aW9uJiBkZXNjMiA9Ci0gICAgICAgIG1vb3ZfLnRyYWNrc1sxXS5tZWRpYS5pbmZvcm1hdGlvbi5zYW1wbGVfdGFibGUuZGVzY3JpcHRpb247Ci0gICAgVmlkZW9TYW1wbGVFbnRyeSB2aWRfZGVzYzsKLSAgICB2aWRfZGVzYy5mb3JtYXQgPSBGT1VSQ0NfQVZDMTsKLSAgICB2aWRfZGVzYy5zaW5mLmluZm8udHJhY2tfZW5jcnlwdGlvbi5pc19lbmNyeXB0ZWQgPSBmYWxzZTsKLSAgICBkZXNjMi50eXBlID0ga1ZpZGVvOwotICAgIGRlc2MyLnZpZGVvX2VudHJpZXMucHVzaF9iYWNrKHZpZF9kZXNjKTsKLSAgICBtb292Xy5leHRlbmRzLnRyYWNrc1sxXS50cmFja19pZCA9IDI7Ci0gICAgbW9vdl8uZXh0ZW5kcy50cmFja3NbMV0uZGVmYXVsdF9zYW1wbGVfZGVzY3JpcHRpb25faW5kZXggPSAxOwotCi0gICAgbW9vdl8udHJhY2tzWzJdLmhlYWRlci50cmFja19pZCA9IDM7Ci0gICAgbW9vdl8udHJhY2tzWzJdLm1lZGlhLmluZm9ybWF0aW9uLnNhbXBsZV90YWJsZS5kZXNjcmlwdGlvbi50eXBlID0ga0hpbnQ7Ci0gIH0KLQotICBNb3ZpZUZyYWdtZW50IENyZWF0ZUZyYWdtZW50KCkgewotICAgIE1vdmllRnJhZ21lbnQgbW9vZjsKLSAgICBtb29mLnRyYWNrcy5yZXNpemUoMik7Ci0gICAgbW9vZi50cmFja3NbMF0uZGVjb2RlX3RpbWUuZGVjb2RlX3RpbWUgPSAwOwotICAgIG1vb2YudHJhY2tzWzBdLmhlYWRlci50cmFja19pZCA9IDE7Ci0gICAgbW9vZi50cmFja3NbMF0uaGVhZGVyLmhhc19kZWZhdWx0X3NhbXBsZV9mbGFncyA9IHRydWU7Ci0gICAgbW9vZi50cmFja3NbMF0uaGVhZGVyLmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uID0gMTAyNDsKLSAgICBtb29mLnRyYWNrc1swXS5oZWFkZXIuZGVmYXVsdF9zYW1wbGVfc2l6ZSA9IDQ7Ci0gICAgbW9vZi50cmFja3NbMF0ucnVucy5yZXNpemUoMik7Ci0gICAgbW9vZi50cmFja3NbMF0ucnVuc1swXS5zYW1wbGVfY291bnQgPSAxMDsKLSAgICBtb29mLnRyYWNrc1swXS5ydW5zWzBdLmRhdGFfb2Zmc2V0ID0gMTAwOwotICAgIFNldEFzY2VuZGluZygmbW9vZi50cmFja3NbMF0ucnVuc1swXS5zYW1wbGVfc2l6ZXMpOwotCi0gICAgbW9vZi50cmFja3NbMF0ucnVuc1sxXS5zYW1wbGVfY291bnQgPSAxMDsKLSAgICBtb29mLnRyYWNrc1swXS5ydW5zWzFdLmRhdGFfb2Zmc2V0ID0gMTAwMDA7Ci0KLSAgICBtb29mLnRyYWNrc1sxXS5oZWFkZXIudHJhY2tfaWQgPSAyOwotICAgIG1vb2YudHJhY2tzWzFdLmhlYWRlci5oYXNfZGVmYXVsdF9zYW1wbGVfZmxhZ3MgPSBmYWxzZTsKLSAgICBtb29mLnRyYWNrc1sxXS5kZWNvZGVfdGltZS5kZWNvZGVfdGltZSA9IDEwOwotICAgIG1vb2YudHJhY2tzWzFdLnJ1bnMucmVzaXplKDEpOwotICAgIG1vb2YudHJhY2tzWzFdLnJ1bnNbMF0uc2FtcGxlX2NvdW50ID0gMTA7Ci0gICAgbW9vZi50cmFja3NbMV0ucnVuc1swXS5kYXRhX29mZnNldCA9IDIwMDsKLSAgICBTZXRBc2NlbmRpbmcoJm1vb2YudHJhY2tzWzFdLnJ1bnNbMF0uc2FtcGxlX3NpemVzKTsKLSAgICBTZXRBc2NlbmRpbmcoJm1vb2YudHJhY2tzWzFdLnJ1bnNbMF0uc2FtcGxlX2R1cmF0aW9ucyk7Ci0gICAgbW9vZi50cmFja3NbMV0ucnVuc1swXS5zYW1wbGVfZmxhZ3MucmVzaXplKDEwKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG1vb2YudHJhY2tzWzFdLnJ1bnNbMF0uc2FtcGxlX2ZsYWdzLnNpemUoKTsgaSsrKSB7Ci0gICAgICBtb29mLnRyYWNrc1sxXS5ydW5zWzBdLnNhbXBsZV9mbGFnc1tpXSA9Ci0gICAgICAgICAga1NhbXBsZUlzRGlmZmVyZW5jZVNhbXBsZUZsYWdNYXNrOwotICAgIH0KLQotICAgIHJldHVybiBtb29mOwotICB9Ci0KLSAgLy8gVXBkYXRlIHRoZSBmaXJzdCBzYW1wbGUgZGVzY3JpcHRpb24gb2YgYSBUcmFjayB0byBpbmRpY2F0ZSBlbmNyeXB0aW9uCi0gIHZvaWQgQWRkRW5jcnlwdGlvbihUcmFjayogdHJhY2spIHsKLSAgICBTYW1wbGVEZXNjcmlwdGlvbiogc3RzZCA9Ci0gICAgICAgICZ0cmFjay0+bWVkaWEuaW5mb3JtYXRpb24uc2FtcGxlX3RhYmxlLmRlc2NyaXB0aW9uOwotICAgIFByb3RlY3Rpb25TY2hlbWVJbmZvKiBzaW5mOwotICAgIGlmICghc3RzZC0+dmlkZW9fZW50cmllcy5lbXB0eSgpKSB7Ci0gICAgICAgc2luZiA9ICZzdHNkLT52aWRlb19lbnRyaWVzWzBdLnNpbmY7Ci0gICAgfSBlbHNlIHsKLSAgICAgICBzaW5mID0gJnN0c2QtPmF1ZGlvX2VudHJpZXNbMF0uc2luZjsKLSAgICB9Ci0KLSAgICBzaW5mLT50eXBlLnR5cGUgPSBGT1VSQ0NfQ0VOQzsKLSAgICBzaW5mLT5pbmZvLnRyYWNrX2VuY3J5cHRpb24uaXNfZW5jcnlwdGVkID0gdHJ1ZTsKLSAgICBzaW5mLT5pbmZvLnRyYWNrX2VuY3J5cHRpb24uZGVmYXVsdF9pdl9zaXplID0gODsKLSAgICBzaW5mLT5pbmZvLnRyYWNrX2VuY3J5cHRpb24uZGVmYXVsdF9raWQuaW5zZXJ0KAotICAgICAgICBzaW5mLT5pbmZvLnRyYWNrX2VuY3J5cHRpb24uZGVmYXVsdF9raWQuYmVnaW4oKSwKLSAgICAgICAga0tleUlkLCBrS2V5SWQgKyBhcnJheXNpemUoa0tleUlkKSk7Ci0gIH0KLQotICAvLyBBZGQgYXV4IGluZm8gY292ZXJpbmcgdGhlIGZpcnN0IHRyYWNrIHJ1biB0byBhIFRyYWNrRnJhZ21lbnQsIGFuZCB1cGRhdGUKLSAgLy8gdGhlIHJ1biB0byBlbnN1cmUgaXQgbWF0Y2hlcyBsZW5ndGggYW5kIHN1YnNhbXBsZSBpbmZvcm1hdGlvbi4KLSAgdm9pZCBBZGRBdXhJbmZvSGVhZGVycyhpbnQgb2Zmc2V0LCBUcmFja0ZyYWdtZW50KiBmcmFnKSB7Ci0gICAgZnJhZy0+YXV4aWxpYXJ5X29mZnNldC5vZmZzZXRzLnB1c2hfYmFjayhvZmZzZXQpOwotICAgIGZyYWctPmF1eGlsaWFyeV9zaXplLnNhbXBsZV9jb3VudCA9IDI7Ci0gICAgZnJhZy0+YXV4aWxpYXJ5X3NpemUuc2FtcGxlX2luZm9fc2l6ZXMucHVzaF9iYWNrKDgpOwotICAgIGZyYWctPmF1eGlsaWFyeV9zaXplLnNhbXBsZV9pbmZvX3NpemVzLnB1c2hfYmFjaygyMik7Ci0gICAgZnJhZy0+cnVuc1swXS5zYW1wbGVfY291bnQgPSAyOwotICAgIGZyYWctPnJ1bnNbMF0uc2FtcGxlX3NpemVzWzFdID0gMTA7Ci0gIH0KLQotICB2b2lkIFNldEFzY2VuZGluZyhzdGQ6OnZlY3Rvcjx1aW50MzI+KiB2ZWMpIHsKLSAgICB2ZWMtPnJlc2l6ZSgxMCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2ZWMtPnNpemUoKTsgaSsrKQotICAgICAgKCp2ZWMpW2ldID0gaSsxOwotICB9Ci19OwotCi1URVNUX0YoVHJhY2tSdW5JdGVyYXRvclRlc3QsIE5vUnVuc1Rlc3QpIHsKLSAgaXRlcl8ucmVzZXQobmV3IFRyYWNrUnVuSXRlcmF0b3IoJm1vb3ZfLCBsb2dfY2JfKSk7Ci0gIEFTU0VSVF9UUlVFKGl0ZXJfLT5Jbml0KE1vdmllRnJhZ21lbnQoKSkpOwotICBFWFBFQ1RfRkFMU0UoaXRlcl8tPklzUnVuVmFsaWQoKSk7Ci0gIEVYUEVDVF9GQUxTRShpdGVyXy0+SXNTYW1wbGVWYWxpZCgpKTsKLX0KLQotVEVTVF9GKFRyYWNrUnVuSXRlcmF0b3JUZXN0LCBCYXNpY09wZXJhdGlvblRlc3QpIHsKLSAgaXRlcl8ucmVzZXQobmV3IFRyYWNrUnVuSXRlcmF0b3IoJm1vb3ZfLCBsb2dfY2JfKSk7Ci0gIE1vdmllRnJhZ21lbnQgbW9vZiA9IENyZWF0ZUZyYWdtZW50KCk7Ci0KLSAgLy8gVGVzdCB0aGF0IHJ1bnMgYXJlIHNvcnRlZCBjb3JyZWN0bHksIGFuZCB0aGF0IHByb3BlcnRpZXMgb2YgdGhlIGluaXRpYWwKLSAgLy8gc2FtcGxlIG9mIHRoZSBmaXJzdCBydW4gYXJlIGNvcnJlY3QKLSAgQVNTRVJUX1RSVUUoaXRlcl8tPkluaXQobW9vZikpOwotICBFWFBFQ1RfVFJVRShpdGVyXy0+SXNSdW5WYWxpZCgpKTsKLSAgRVhQRUNUX0ZBTFNFKGl0ZXJfLT5pc19lbmNyeXB0ZWQoKSk7Ci0gIEVYUEVDVF9FUShpdGVyXy0+dHJhY2tfaWQoKSwgMXUpOwotICBFWFBFQ1RfRVEoaXRlcl8tPnNhbXBsZV9vZmZzZXQoKSwgMTAwKTsKLSAgRVhQRUNUX0VRKGl0ZXJfLT5zYW1wbGVfc2l6ZSgpLCAxKTsKLSAgRVhQRUNUX0VRKGl0ZXJfLT5kdHMoKSwgVGltZURlbHRhRnJvbVJhdGlvbmFsKDAsIGtBdWRpb1NjYWxlKSk7Ci0gIEVYUEVDVF9FUShpdGVyXy0+Y3RzKCksIFRpbWVEZWx0YUZyb21SYXRpb25hbCgwLCBrQXVkaW9TY2FsZSkpOwotICBFWFBFQ1RfRVEoaXRlcl8tPmR1cmF0aW9uKCksIFRpbWVEZWx0YUZyb21SYXRpb25hbCgxMDI0LCBrQXVkaW9TY2FsZSkpOwotICBFWFBFQ1RfVFJVRShpdGVyXy0+aXNfa2V5ZnJhbWUoKSk7Ci0KLSAgLy8gQWR2YW5jZSB0byB0aGUgbGFzdCBzYW1wbGUgaW4gdGhlIGN1cnJlbnQgcnVuLCBhbmQgdGVzdCBpdHMgcHJvcGVydGllcwotICBmb3IgKGludCBpID0gMDsgaSA8IDk7IGkrKykgaXRlcl8tPkFkdmFuY2VTYW1wbGUoKTsKLSAgRVhQRUNUX0VRKGl0ZXJfLT50cmFja19pZCgpLCAxdSk7Ci0gIEVYUEVDVF9FUShpdGVyXy0+c2FtcGxlX29mZnNldCgpLCAxMDAgKyBrU3VtQXNjZW5kaW5nMSk7Ci0gIEVYUEVDVF9FUShpdGVyXy0+c2FtcGxlX3NpemUoKSwgMTApOwotICBFWFBFQ1RfRVEoaXRlcl8tPmR0cygpLCBUaW1lRGVsdGFGcm9tUmF0aW9uYWwoMTAyNCAqIDksIGtBdWRpb1NjYWxlKSk7Ci0gIEVYUEVDVF9FUShpdGVyXy0+ZHVyYXRpb24oKSwgVGltZURlbHRhRnJvbVJhdGlvbmFsKDEwMjQsIGtBdWRpb1NjYWxlKSk7Ci0gIEVYUEVDVF9UUlVFKGl0ZXJfLT5pc19rZXlmcmFtZSgpKTsKLQotICAvLyBUZXN0IGVuZC1vZi1ydW4KLSAgaXRlcl8tPkFkdmFuY2VTYW1wbGUoKTsKLSAgRVhQRUNUX0ZBTFNFKGl0ZXJfLT5Jc1NhbXBsZVZhbGlkKCkpOwotCi0gIC8vIFRlc3QgbGFzdCBzYW1wbGUgb2YgbmV4dCBydW4KLSAgaXRlcl8tPkFkdmFuY2VSdW4oKTsKLSAgRVhQRUNUX1RSVUUoaXRlcl8tPmlzX2tleWZyYW1lKCkpOwotICBmb3IgKGludCBpID0gMDsgaSA8IDk7IGkrKykgaXRlcl8tPkFkdmFuY2VTYW1wbGUoKTsKLSAgRVhQRUNUX0VRKGl0ZXJfLT50cmFja19pZCgpLCAydSk7Ci0gIEVYUEVDVF9FUShpdGVyXy0+c2FtcGxlX29mZnNldCgpLCAyMDAgKyBrU3VtQXNjZW5kaW5nMSk7Ci0gIEVYUEVDVF9FUShpdGVyXy0+c2FtcGxlX3NpemUoKSwgMTApOwotICBpbnQ2NCBiYXNlX2R0cyA9IGtTdW1Bc2NlbmRpbmcxICsgbW9vZi50cmFja3NbMV0uZGVjb2RlX3RpbWUuZGVjb2RlX3RpbWU7Ci0gIEVYUEVDVF9FUShpdGVyXy0+ZHRzKCksIFRpbWVEZWx0YUZyb21SYXRpb25hbChiYXNlX2R0cywga1ZpZGVvU2NhbGUpKTsKLSAgRVhQRUNUX0VRKGl0ZXJfLT5kdXJhdGlvbigpLCBUaW1lRGVsdGFGcm9tUmF0aW9uYWwoMTAsIGtWaWRlb1NjYWxlKSk7Ci0gIEVYUEVDVF9GQUxTRShpdGVyXy0+aXNfa2V5ZnJhbWUoKSk7Ci0KLSAgLy8gVGVzdCBmaW5hbCBydW4KLSAgaXRlcl8tPkFkdmFuY2VSdW4oKTsKLSAgRVhQRUNUX0VRKGl0ZXJfLT50cmFja19pZCgpLCAxdSk7Ci0gIEVYUEVDVF9FUShpdGVyXy0+ZHRzKCksIFRpbWVEZWx0YUZyb21SYXRpb25hbCgxMDI0ICogMTAsIGtBdWRpb1NjYWxlKSk7Ci0gIGl0ZXJfLT5BZHZhbmNlU2FtcGxlKCk7Ci0gIEVYUEVDVF9FUShtb29mLnRyYWNrc1swXS5ydW5zWzFdLmRhdGFfb2Zmc2V0ICsKLSAgICAgICAgICAgIG1vb2YudHJhY2tzWzBdLmhlYWRlci5kZWZhdWx0X3NhbXBsZV9zaXplLAotICAgICAgICAgICAgaXRlcl8tPnNhbXBsZV9vZmZzZXQoKSk7Ci0gIGl0ZXJfLT5BZHZhbmNlUnVuKCk7Ci0gIEVYUEVDVF9GQUxTRShpdGVyXy0+SXNSdW5WYWxpZCgpKTsKLX0KLQotVEVTVF9GKFRyYWNrUnVuSXRlcmF0b3JUZXN0LCBUcmFja0V4dGVuZHNEZWZhdWx0c1Rlc3QpIHsKLSAgbW9vdl8uZXh0ZW5kcy50cmFja3NbMF0uZGVmYXVsdF9zYW1wbGVfZHVyYXRpb24gPSA1MDsKLSAgbW9vdl8uZXh0ZW5kcy50cmFja3NbMF0uZGVmYXVsdF9zYW1wbGVfc2l6ZSA9IDM7Ci0gIG1vb3ZfLmV4dGVuZHMudHJhY2tzWzBdLmRlZmF1bHRfc2FtcGxlX2ZsYWdzID0KLSAgICBrU2FtcGxlSXNEaWZmZXJlbmNlU2FtcGxlRmxhZ01hc2s7Ci0gIGl0ZXJfLnJlc2V0KG5ldyBUcmFja1J1bkl0ZXJhdG9yKCZtb292XywgbG9nX2NiXykpOwotICBNb3ZpZUZyYWdtZW50IG1vb2YgPSBDcmVhdGVGcmFnbWVudCgpOwotICBtb29mLnRyYWNrc1swXS5oZWFkZXIuaGFzX2RlZmF1bHRfc2FtcGxlX2ZsYWdzID0gZmFsc2U7Ci0gIG1vb2YudHJhY2tzWzBdLmhlYWRlci5kZWZhdWx0X3NhbXBsZV9zaXplID0gMDsKLSAgbW9vZi50cmFja3NbMF0uaGVhZGVyLmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uID0gMDsKLSAgbW9vZi50cmFja3NbMF0ucnVuc1swXS5zYW1wbGVfc2l6ZXMuY2xlYXIoKTsKLSAgQVNTRVJUX1RSVUUoaXRlcl8tPkluaXQobW9vZikpOwotICBpdGVyXy0+QWR2YW5jZVNhbXBsZSgpOwotICBFWFBFQ1RfRkFMU0UoaXRlcl8tPmlzX2tleWZyYW1lKCkpOwotICBFWFBFQ1RfRVEoaXRlcl8tPnNhbXBsZV9zaXplKCksIDMpOwotICBFWFBFQ1RfRVEoaXRlcl8tPnNhbXBsZV9vZmZzZXQoKSwgbW9vZi50cmFja3NbMF0ucnVuc1swXS5kYXRhX29mZnNldCArIDMpOwotICBFWFBFQ1RfRVEoaXRlcl8tPmR1cmF0aW9uKCksIFRpbWVEZWx0YUZyb21SYXRpb25hbCg1MCwga0F1ZGlvU2NhbGUpKTsKLSAgRVhQRUNUX0VRKGl0ZXJfLT5kdHMoKSwgVGltZURlbHRhRnJvbVJhdGlvbmFsKDUwLCBrQXVkaW9TY2FsZSkpOwotfQotCi1URVNUX0YoVHJhY2tSdW5JdGVyYXRvclRlc3QsIEZpcnN0U2FtcGxlRmxhZ1Rlc3QpIHsKLSAgLy8gRW5zdXJlIHRoYXQga2V5ZnJhbWVzIGFyZSBmbGFnZ2VkIGNvcnJlY3RseSBpbiB0aGUgZmFjZSBvZiBCTUZGIGJveGVzIHdoaWNoCi0gIC8vIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgZmxhZ3MgZm9yIHRoZSBmaXJzdCBzYW1wbGUgaW4gYSBydW4gYW5kIHJlbHkgb24KLSAgLy8gZGVmYXVsdHMgZm9yIGFsbCBzdWJzZXF1ZW50IHNhbXBsZXMKLSAgaXRlcl8ucmVzZXQobmV3IFRyYWNrUnVuSXRlcmF0b3IoJm1vb3ZfLCBsb2dfY2JfKSk7Ci0gIE1vdmllRnJhZ21lbnQgbW9vZiA9IENyZWF0ZUZyYWdtZW50KCk7Ci0gIG1vb2YudHJhY2tzWzFdLmhlYWRlci5oYXNfZGVmYXVsdF9zYW1wbGVfZmxhZ3MgPSB0cnVlOwotICBtb29mLnRyYWNrc1sxXS5oZWFkZXIuZGVmYXVsdF9zYW1wbGVfZmxhZ3MgPQotICAgIGtTYW1wbGVJc0RpZmZlcmVuY2VTYW1wbGVGbGFnTWFzazsKLSAgbW9vZi50cmFja3NbMV0ucnVuc1swXS5zYW1wbGVfZmxhZ3MucmVzaXplKDEpOwotICBBU1NFUlRfVFJVRShpdGVyXy0+SW5pdChtb29mKSk7Ci0gIGl0ZXJfLT5BZHZhbmNlUnVuKCk7Ci0gIEVYUEVDVF9UUlVFKGl0ZXJfLT5pc19rZXlmcmFtZSgpKTsKLSAgaXRlcl8tPkFkdmFuY2VTYW1wbGUoKTsKLSAgRVhQRUNUX0ZBTFNFKGl0ZXJfLT5pc19rZXlmcmFtZSgpKTsKLX0KLQotVEVTVF9GKFRyYWNrUnVuSXRlcmF0b3JUZXN0LCBNaW5EZWNvZGVUZXN0KSB7Ci0gIGl0ZXJfLnJlc2V0KG5ldyBUcmFja1J1bkl0ZXJhdG9yKCZtb292XywgbG9nX2NiXykpOwotICBNb3ZpZUZyYWdtZW50IG1vb2YgPSBDcmVhdGVGcmFnbWVudCgpOwotICBtb29mLnRyYWNrc1swXS5kZWNvZGVfdGltZS5kZWNvZGVfdGltZSA9IGtBdWRpb1NjYWxlOwotICBBU1NFUlRfVFJVRShpdGVyXy0+SW5pdChtb29mKSk7Ci0gIEVYUEVDVF9FUShUaW1lRGVsdGFGcm9tUmF0aW9uYWwobW9vZi50cmFja3NbMV0uZGVjb2RlX3RpbWUuZGVjb2RlX3RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZpZGVvU2NhbGUpLAotICAgICAgICAgICAgaXRlcl8tPkdldE1pbkRlY29kZVRpbWVzdGFtcCgpKTsKLX0KLQotVEVTVF9GKFRyYWNrUnVuSXRlcmF0b3JUZXN0LCBSZW9yZGVyaW5nVGVzdCkgewotICAvLyBUZXN0IGZyYW1lIHJlb3JkZXJpbmcgYW5kIGVkaXQgbGlzdCBzdXBwb3J0LiBUaGUgZnJhbWVzIGhhdmUgdGhlIGZvbGxvd2luZwotICAvLyBkZWNvZGUgdGltZXN0YW1wczoKLSAgLy8KLSAgLy8gICAwbXMgNDBtcyAgIDEyMG1zICAgICAyNDBtcwotICAvLyAgIHwgMCB8IDEgIC0gfCAyICAtICAtIHwKLSAgLy8KLSAgLy8gLi4uYW5kIHRoZXNlIGNvbXBvc2l0aW9uIHRpbWVzdGFtcHMsIGFmdGVyIGVkaXQgbGlzdCBhZGp1c3RtZW50OgotICAvLwotICAvLyAgIDBtcyA0MG1zICAgICAgIDE2MG1zICAyNDBtcwotICAvLyAgIHwgMCB8IDIgIC0gIC0gIHwgMSAtIHwKLQotICAvLyBDcmVhdGUgYW4gZWRpdCBsaXN0IHdpdGggb25lIGVudHJ5LCB3aXRoIGFuIGluaXRpYWwgc3RhcnQgdGltZSBvZiA4MG1zCi0gIC8vICh0aGF0IGlzLCAyIC8ga1ZpZGVvVGltZXNjYWxlKSBhbmQgYSBkdXJhdGlvbiBvZiB6ZXJvICh3aGljaCBpcyB0cmVhdGVkIGFzCi0gIC8vIGluZmluaXRlIGFjY29yZGluZyB0byAxNDQ5Ni0xMjoyMDEyKS4gVGhpcyB3aWxsIGNhdXNlIHRoZSBmaXJzdCA4MG1zIG9mIHRoZQotICAvLyBtZWRpYSB0aW1lbGluZSAtIHdoaWNoIHdpbGwgYmUgZW1wdHksIGR1ZSB0byBDVFMgYmlhc2luZyAtIHRvIGJlIGRpc2NhcmRlZC4KLSAgaXRlcl8ucmVzZXQobmV3IFRyYWNrUnVuSXRlcmF0b3IoJm1vb3ZfLCBsb2dfY2JfKSk7Ci0gIEVkaXRMaXN0RW50cnkgZW50cnk7Ci0gIGVudHJ5LnNlZ21lbnRfZHVyYXRpb24gPSAwOwotICBlbnRyeS5tZWRpYV90aW1lID0gMjsKLSAgZW50cnkubWVkaWFfcmF0ZV9pbnRlZ2VyID0gMTsKLSAgZW50cnkubWVkaWFfcmF0ZV9mcmFjdGlvbiA9IDA7Ci0gIG1vb3ZfLnRyYWNrc1sxXS5lZGl0Lmxpc3QuZWRpdHMucHVzaF9iYWNrKGVudHJ5KTsKLQotICAvLyBBZGQgQ1RTIG9mZnNldHMuIFdpdGhvdXQgYmlhcywgdGhlIENUUyBvZmZzZXRzIGZvciB0aGUgZmlyc3QgdGhyZWUgZnJhbWVzCi0gIC8vIHdvdWxkIHNpbXBseSBiZSBbMCwgMywgLTJdLiBTaW5jZSBDVFMgb2Zmc2V0cyBzaG91bGQgYmUgbm9uLW5lZ2F0aXZlIGZvcgotICAvLyBtYXhpbXVtIGNvbXBhdGliaWxpdHksIHRoZXNlIHZhbHVlcyBhcmUgYmlhc2VkIHVwIHRvIFsyLCA1LCAwXSwgYW5kIHRoZQotICAvLyBleHRyYSA4MG1zIGlzIHJlbW92ZWQgdmlhIHRoZSBlZGl0IGxpc3QuCi0gIE1vdmllRnJhZ21lbnQgbW9vZiA9IENyZWF0ZUZyYWdtZW50KCk7Ci0gIHN0ZDo6dmVjdG9yPGludDMyPiYgY3RzX29mZnNldHMgPQotICAgIG1vb2YudHJhY2tzWzFdLnJ1bnNbMF0uc2FtcGxlX2NvbXBvc2l0aW9uX3RpbWVfb2Zmc2V0czsKLSAgY3RzX29mZnNldHMucmVzaXplKDEwKTsKLSAgY3RzX29mZnNldHNbMF0gPSAyOwotICBjdHNfb2Zmc2V0c1sxXSA9IDU7Ci0gIGN0c19vZmZzZXRzWzJdID0gMDsKLSAgbW9vZi50cmFja3NbMV0uZGVjb2RlX3RpbWUuZGVjb2RlX3RpbWUgPSAwOwotCi0gIEFTU0VSVF9UUlVFKGl0ZXJfLT5Jbml0KG1vb2YpKTsKLSAgaXRlcl8tPkFkdmFuY2VSdW4oKTsKLSAgRVhQRUNUX0VRKGl0ZXJfLT5kdHMoKSwgVGltZURlbHRhRnJvbVJhdGlvbmFsKDAsIGtWaWRlb1NjYWxlKSk7Ci0gIEVYUEVDVF9FUShpdGVyXy0+Y3RzKCksIFRpbWVEZWx0YUZyb21SYXRpb25hbCgwLCBrVmlkZW9TY2FsZSkpOwotICBFWFBFQ1RfRVEoaXRlcl8tPmR1cmF0aW9uKCksIFRpbWVEZWx0YUZyb21SYXRpb25hbCgxLCBrVmlkZW9TY2FsZSkpOwotICBpdGVyXy0+QWR2YW5jZVNhbXBsZSgpOwotICBFWFBFQ1RfRVEoaXRlcl8tPmR0cygpLCBUaW1lRGVsdGFGcm9tUmF0aW9uYWwoMSwga1ZpZGVvU2NhbGUpKTsKLSAgRVhQRUNUX0VRKGl0ZXJfLT5jdHMoKSwgVGltZURlbHRhRnJvbVJhdGlvbmFsKDQsIGtWaWRlb1NjYWxlKSk7Ci0gIEVYUEVDVF9FUShpdGVyXy0+ZHVyYXRpb24oKSwgVGltZURlbHRhRnJvbVJhdGlvbmFsKDIsIGtWaWRlb1NjYWxlKSk7Ci0gIGl0ZXJfLT5BZHZhbmNlU2FtcGxlKCk7Ci0gIEVYUEVDVF9FUShpdGVyXy0+ZHRzKCksIFRpbWVEZWx0YUZyb21SYXRpb25hbCgzLCBrVmlkZW9TY2FsZSkpOwotICBFWFBFQ1RfRVEoaXRlcl8tPmN0cygpLCBUaW1lRGVsdGFGcm9tUmF0aW9uYWwoMSwga1ZpZGVvU2NhbGUpKTsKLSAgRVhQRUNUX0VRKGl0ZXJfLT5kdXJhdGlvbigpLCBUaW1lRGVsdGFGcm9tUmF0aW9uYWwoMywga1ZpZGVvU2NhbGUpKTsKLX0KLQotVEVTVF9GKFRyYWNrUnVuSXRlcmF0b3JUZXN0LCBJZ25vcmVVbmtub3duQXV4SW5mb1Rlc3QpIHsKLSAgaXRlcl8ucmVzZXQobmV3IFRyYWNrUnVuSXRlcmF0b3IoJm1vb3ZfLCBsb2dfY2JfKSk7Ci0gIE1vdmllRnJhZ21lbnQgbW9vZiA9IENyZWF0ZUZyYWdtZW50KCk7Ci0gIG1vb2YudHJhY2tzWzFdLmF1eGlsaWFyeV9vZmZzZXQub2Zmc2V0cy5wdXNoX2JhY2soNTApOwotICBtb29mLnRyYWNrc1sxXS5hdXhpbGlhcnlfc2l6ZS5kZWZhdWx0X3NhbXBsZV9pbmZvX3NpemUgPSAyOwotICBtb29mLnRyYWNrc1sxXS5hdXhpbGlhcnlfc2l6ZS5zYW1wbGVfY291bnQgPSAyOwotICBtb29mLnRyYWNrc1sxXS5ydW5zWzBdLnNhbXBsZV9jb3VudCA9IDI7Ci0gIEFTU0VSVF9UUlVFKGl0ZXJfLT5Jbml0KG1vb2YpKTsKLSAgaXRlcl8tPkFkdmFuY2VSdW4oKTsKLSAgRVhQRUNUX0ZBTFNFKGl0ZXJfLT5BdXhJbmZvTmVlZHNUb0JlQ2FjaGVkKCkpOwotfQotCi1URVNUX0YoVHJhY2tSdW5JdGVyYXRvclRlc3QsIERlY3J5cHRDb25maWdUZXN0KSB7Ci0gIEFkZEVuY3J5cHRpb24oJm1vb3ZfLnRyYWNrc1sxXSk7Ci0gIGl0ZXJfLnJlc2V0KG5ldyBUcmFja1J1bkl0ZXJhdG9yKCZtb292XywgbG9nX2NiXykpOwotCi0gIE1vdmllRnJhZ21lbnQgbW9vZiA9IENyZWF0ZUZyYWdtZW50KCk7Ci0gIEFkZEF1eEluZm9IZWFkZXJzKDUwLCAmbW9vZi50cmFja3NbMV0pOwotCi0gIEFTU0VSVF9UUlVFKGl0ZXJfLT5Jbml0KG1vb2YpKTsKLQotICAvLyBUaGUgcnVuIGZvciB0cmFjayAyIHdpbGwgYmUgZmlyc3QsIHNpbmNlIGl0cyBhdXggaW5mbyBvZmZzZXQgaXMgdGhlIGZpcnN0Ci0gIC8vIGVsZW1lbnQgaW4gdGhlIGZpbGUuCi0gIEVYUEVDVF9FUShpdGVyXy0+dHJhY2tfaWQoKSwgMnUpOwotICBFWFBFQ1RfVFJVRShpdGVyXy0+aXNfZW5jcnlwdGVkKCkpOwotICBFWFBFQ1RfVFJVRShpdGVyXy0+QXV4SW5mb05lZWRzVG9CZUNhY2hlZCgpKTsKLSAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PHVpbnQzMj4oaXRlcl8tPmF1eF9pbmZvX3NpemUoKSksIGFycmF5c2l6ZShrQXV4SW5mbykpOwotICBFWFBFQ1RfRVEoaXRlcl8tPmF1eF9pbmZvX29mZnNldCgpLCA1MCk7Ci0gIEVYUEVDVF9FUShpdGVyXy0+R2V0TWF4Q2xlYXJPZmZzZXQoKSwgNTApOwotICBFWFBFQ1RfRkFMU0UoaXRlcl8tPkNhY2hlQXV4SW5mbyhOVUxMLCAwKSk7Ci0gIEVYUEVDVF9GQUxTRShpdGVyXy0+Q2FjaGVBdXhJbmZvKGtBdXhJbmZvLCAzKSk7Ci0gIEVYUEVDVF9UUlVFKGl0ZXJfLT5BdXhJbmZvTmVlZHNUb0JlQ2FjaGVkKCkpOwotICBFWFBFQ1RfVFJVRShpdGVyXy0+Q2FjaGVBdXhJbmZvKGtBdXhJbmZvLCBhcnJheXNpemUoa0F1eEluZm8pKSk7Ci0gIEVYUEVDVF9GQUxTRShpdGVyXy0+QXV4SW5mb05lZWRzVG9CZUNhY2hlZCgpKTsKLSAgRVhQRUNUX0VRKGl0ZXJfLT5zYW1wbGVfb2Zmc2V0KCksIDIwMCk7Ci0gIEVYUEVDVF9FUShpdGVyXy0+R2V0TWF4Q2xlYXJPZmZzZXQoKSwgbW9vZi50cmFja3NbMF0ucnVuc1swXS5kYXRhX29mZnNldCk7Ci0gIHNjb3BlZF9wdHI8RGVjcnlwdENvbmZpZz4gY29uZmlnID0gaXRlcl8tPkdldERlY3J5cHRDb25maWcoKTsKLSAgQVNTRVJUX0VRKGFycmF5c2l6ZShrS2V5SWQpLCBjb25maWctPmtleV9pZCgpLnNpemUoKSk7Ci0gIEVYUEVDVF9UUlVFKCFtZW1jbXAoa0tleUlkLCBjb25maWctPmtleV9pZCgpLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmtleV9pZCgpLnNpemUoKSkpOwotICBBU1NFUlRfRVEoYXJyYXlzaXplKGtJdjEpLCBjb25maWctPml2KCkuc2l6ZSgpKTsKLSAgRVhQRUNUX1RSVUUoIW1lbWNtcChrSXYxLCBjb25maWctPml2KCkuZGF0YSgpLCBjb25maWctPml2KCkuc2l6ZSgpKSk7Ci0gIEVYUEVDVF9UUlVFKGNvbmZpZy0+c3Vic2FtcGxlcygpLmVtcHR5KCkpOwotICBpdGVyXy0+QWR2YW5jZVNhbXBsZSgpOwotICBjb25maWcgPSBpdGVyXy0+R2V0RGVjcnlwdENvbmZpZygpOwotICBFWFBFQ1RfRVEoY29uZmlnLT5zdWJzYW1wbGVzKCkuc2l6ZSgpLCAydSk7Ci0gIEVYUEVDVF9FUShjb25maWctPnN1YnNhbXBsZXMoKVswXS5jbGVhcl9ieXRlcywgMXUpOwotICBFWFBFQ1RfRVEoY29uZmlnLT5zdWJzYW1wbGVzKClbMV0uY3lwaGVyX2J5dGVzLCA0dSk7Ci19Ci0KLS8vIEl0IGlzIGxlZ2FsIGZvciBhdXggaW5mbyBibG9ja3MgdG8gYmUgc2hhcmVkIGFtb25nIG11bHRpcGxlIGZvcm1hdHMuCi1URVNUX0YoVHJhY2tSdW5JdGVyYXRvclRlc3QsIFNoYXJlZEF1eEluZm9UZXN0KSB7Ci0gIEFkZEVuY3J5cHRpb24oJm1vb3ZfLnRyYWNrc1swXSk7Ci0gIEFkZEVuY3J5cHRpb24oJm1vb3ZfLnRyYWNrc1sxXSk7Ci0gIGl0ZXJfLnJlc2V0KG5ldyBUcmFja1J1bkl0ZXJhdG9yKCZtb292XywgbG9nX2NiXykpOwotCi0gIE1vdmllRnJhZ21lbnQgbW9vZiA9IENyZWF0ZUZyYWdtZW50KCk7Ci0gIG1vb2YudHJhY2tzWzBdLnJ1bnMucmVzaXplKDEpOwotICBBZGRBdXhJbmZvSGVhZGVycyg1MCwgJm1vb2YudHJhY2tzWzBdKTsKLSAgQWRkQXV4SW5mb0hlYWRlcnMoNTAsICZtb29mLnRyYWNrc1sxXSk7Ci0gIG1vb2YudHJhY2tzWzBdLmF1eGlsaWFyeV9zaXplLmRlZmF1bHRfc2FtcGxlX2luZm9fc2l6ZSA9IDg7Ci0KLSAgQVNTRVJUX1RSVUUoaXRlcl8tPkluaXQobW9vZikpOwotICBFWFBFQ1RfRVEoaXRlcl8tPnRyYWNrX2lkKCksIDF1KTsKLSAgRVhQRUNUX0VRKGl0ZXJfLT5hdXhfaW5mb19vZmZzZXQoKSwgNTApOwotICBFWFBFQ1RfVFJVRShpdGVyXy0+Q2FjaGVBdXhJbmZvKGtBdXhJbmZvLCBhcnJheXNpemUoa0F1eEluZm8pKSk7Ci0gIHNjb3BlZF9wdHI8RGVjcnlwdENvbmZpZz4gY29uZmlnID0gaXRlcl8tPkdldERlY3J5cHRDb25maWcoKTsKLSAgQVNTRVJUX0VRKGFycmF5c2l6ZShrSXYxKSwgY29uZmlnLT5pdigpLnNpemUoKSk7Ci0gIEVYUEVDVF9UUlVFKCFtZW1jbXAoa0l2MSwgY29uZmlnLT5pdigpLmRhdGEoKSwgY29uZmlnLT5pdigpLnNpemUoKSkpOwotICBpdGVyXy0+QWR2YW5jZVNhbXBsZSgpOwotICBFWFBFQ1RfRVEoaXRlcl8tPkdldE1heENsZWFyT2Zmc2V0KCksIDUwKTsKLSAgaXRlcl8tPkFkdmFuY2VSdW4oKTsKLSAgRVhQRUNUX0VRKGl0ZXJfLT5HZXRNYXhDbGVhck9mZnNldCgpLCA1MCk7Ci0gIEVYUEVDVF9FUShpdGVyXy0+YXV4X2luZm9fb2Zmc2V0KCksIDUwKTsKLSAgRVhQRUNUX1RSVUUoaXRlcl8tPkNhY2hlQXV4SW5mbyhrQXV4SW5mbywgYXJyYXlzaXplKGtBdXhJbmZvKSkpOwotICBFWFBFQ1RfRVEoaXRlcl8tPkdldE1heENsZWFyT2Zmc2V0KCksIDIwMCk7Ci0gIEFTU0VSVF9FUShhcnJheXNpemUoa0l2MSksIGNvbmZpZy0+aXYoKS5zaXplKCkpOwotICBFWFBFQ1RfVFJVRSghbWVtY21wKGtJdjEsIGNvbmZpZy0+aXYoKS5kYXRhKCksIGNvbmZpZy0+aXYoKS5zaXplKCkpKTsKLSAgaXRlcl8tPkFkdmFuY2VTYW1wbGUoKTsKLSAgRVhQRUNUX0VRKGl0ZXJfLT5HZXRNYXhDbGVhck9mZnNldCgpLCAyMDEpOwotfQotCi0vLyBTZW5zaWJsZSBmaWxlcyBhcmUgZXhwZWN0ZWQgdG8gcGxhY2UgYXV4aWxpYXJ5IGluZm9ybWF0aW9uIGZvciBhIHJ1bgotLy8gaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBtYWluIGRhdGEgZm9yIHRoYXQgcnVuLiBBbHRlcm5hdGl2ZSBzY2hlbWVzIGFyZQotLy8gcG9zc2libGUsIGhvd2V2ZXIsIGluY2x1ZGluZyB0aGUgc29tZXdoYXQgcmVhc29uYWJsZSBiZWhhdmlvciBvZiBwbGFjaW5nIGFsbAotLy8gYXV4IGluZm8gYXQgdGhlIGhlYWQgb2YgdGhlICdtZGF0JyBib3ggdG9nZXRoZXIsIGFuZCB0aGUgY29tcGxldGVseQotLy8gdW5yZWFzb25hYmxlIGJlaGF2aW9yIGRlbW9uc3RyYXRlZCBoZXJlOgotLy8gIGJ5dGUgNTA6IHRyYWNrIDIsIHJ1biAxIGF1eCBpbmZvCi0vLyAgYnl0ZSAxMDA6IHRyYWNrIDEsIHJ1biAxIGRhdGEKLS8vICBieXRlIDIwMDogdHJhY2sgMiwgcnVuIDEgZGF0YQotLy8gIGJ5dGUgMjAxOiB0cmFjayAxLCBydW4gMiBhdXggaW5mbyAoKmluc2lkZSogdHJhY2sgMiwgcnVuIDEgZGF0YSkKLS8vICBieXRlIDEwMDAwOiB0cmFjayAxLCBydW4gMiBkYXRhCi0vLyAgYnl0ZSAyMDAwMDogdHJhY2sgMSwgcnVuIDEgYXV4IGluZm8KLVRFU1RfRihUcmFja1J1bkl0ZXJhdG9yVGVzdCwgVW5leHBlY3RlZE9yZGVyaW5nVGVzdCkgewotICBBZGRFbmNyeXB0aW9uKCZtb292Xy50cmFja3NbMF0pOwotICBBZGRFbmNyeXB0aW9uKCZtb292Xy50cmFja3NbMV0pOwotICBpdGVyXy5yZXNldChuZXcgVHJhY2tSdW5JdGVyYXRvcigmbW9vdl8sIGxvZ19jYl8pKTsKLQotICBNb3ZpZUZyYWdtZW50IG1vb2YgPSBDcmVhdGVGcmFnbWVudCgpOwotICBBZGRBdXhJbmZvSGVhZGVycygyMDAwMCwgJm1vb2YudHJhY2tzWzBdKTsKLSAgbW9vZi50cmFja3NbMF0uYXV4aWxpYXJ5X29mZnNldC5vZmZzZXRzLnB1c2hfYmFjaygyMDEpOwotICBtb29mLnRyYWNrc1swXS5hdXhpbGlhcnlfc2l6ZS5zYW1wbGVfY291bnQgKz0gMjsKLSAgbW9vZi50cmFja3NbMF0uYXV4aWxpYXJ5X3NpemUuZGVmYXVsdF9zYW1wbGVfaW5mb19zaXplID0gODsKLSAgbW9vZi50cmFja3NbMF0ucnVuc1sxXS5zYW1wbGVfY291bnQgPSAyOwotICBBZGRBdXhJbmZvSGVhZGVycyg1MCwgJm1vb2YudHJhY2tzWzFdKTsKLSAgbW9vZi50cmFja3NbMV0ucnVuc1swXS5zYW1wbGVfc2l6ZXNbMF0gPSA1OwotCi0gIEFTU0VSVF9UUlVFKGl0ZXJfLT5Jbml0KG1vb2YpKTsKLSAgRVhQRUNUX0VRKGl0ZXJfLT50cmFja19pZCgpLCAydSk7Ci0gIEVYUEVDVF9FUShpdGVyXy0+YXV4X2luZm9fb2Zmc2V0KCksIDUwKTsKLSAgRVhQRUNUX0VRKGl0ZXJfLT5zYW1wbGVfb2Zmc2V0KCksIDIwMCk7Ci0gIEVYUEVDVF9UUlVFKGl0ZXJfLT5DYWNoZUF1eEluZm8oa0F1eEluZm8sIGFycmF5c2l6ZShrQXV4SW5mbykpKTsKLSAgRVhQRUNUX0VRKGl0ZXJfLT5HZXRNYXhDbGVhck9mZnNldCgpLCAxMDApOwotICBpdGVyXy0+QWR2YW5jZVJ1bigpOwotICBFWFBFQ1RfRVEoaXRlcl8tPnRyYWNrX2lkKCksIDF1KTsKLSAgRVhQRUNUX0VRKGl0ZXJfLT5hdXhfaW5mb19vZmZzZXQoKSwgMjAwMDApOwotICBFWFBFQ1RfRVEoaXRlcl8tPnNhbXBsZV9vZmZzZXQoKSwgMTAwKTsKLSAgRVhQRUNUX1RSVUUoaXRlcl8tPkNhY2hlQXV4SW5mbyhrQXV4SW5mbywgYXJyYXlzaXplKGtBdXhJbmZvKSkpOwotICBFWFBFQ1RfRVEoaXRlcl8tPkdldE1heENsZWFyT2Zmc2V0KCksIDEwMCk7Ci0gIGl0ZXJfLT5BZHZhbmNlU2FtcGxlKCk7Ci0gIEVYUEVDVF9FUShpdGVyXy0+R2V0TWF4Q2xlYXJPZmZzZXQoKSwgMTAxKTsKLSAgaXRlcl8tPkFkdmFuY2VSdW4oKTsKLSAgRVhQRUNUX0VRKGl0ZXJfLT50cmFja19pZCgpLCAxdSk7Ci0gIEVYUEVDVF9FUShpdGVyXy0+YXV4X2luZm9fb2Zmc2V0KCksIDIwMSk7Ci0gIEVYUEVDVF9FUShpdGVyXy0+c2FtcGxlX29mZnNldCgpLCAxMDAwMCk7Ci0gIEVYUEVDVF9FUShpdGVyXy0+R2V0TWF4Q2xlYXJPZmZzZXQoKSwgMjAxKTsKLSAgRVhQRUNUX1RSVUUoaXRlcl8tPkNhY2hlQXV4SW5mbyhrQXV4SW5mbywgYXJyYXlzaXplKGtBdXhJbmZvKSkpOwotICBFWFBFQ1RfRVEoaXRlcl8tPkdldE1heENsZWFyT2Zmc2V0KCksIDEwMDAwKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1wNAotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvcGxheWVyL2J1ZmZlcmVkX2RhdGFfc291cmNlLmggYi9zcmMvbWVkaWEvcGxheWVyL2J1ZmZlcmVkX2RhdGFfc291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNmEzMWMuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3BsYXllci9idWZmZXJlZF9kYXRhX3NvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9QTEFZRVJfQlVGRkVSRURfREFUQV9TT1VSQ0VfSF8KLSNkZWZpbmUgTUVESUFfUExBWUVSX0JVRkZFUkVEX0RBVEFfU09VUkNFX0hfCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJnb29nbGV1cmwvc3JjL2d1cmwuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2RhdGFfc291cmNlLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWVudW0gUHJlbG9hZCB7Ci0gIGtQcmVsb2FkTm9uZSwKLSAga1ByZWxvYWRNZXRhRGF0YSwKLSAga1ByZWxvYWRBdXRvLAotfTsKLQotLy8gVE9ETzogSW52ZXN0aWdhdGUgaWYgd2Ugc3RpbGwgbmVlZCBCdWZmZXJlZERhdGFTb3VyY2UuCi1jbGFzcyBCdWZmZXJlZERhdGFTb3VyY2UgOiBwdWJsaWMgRGF0YVNvdXJjZSB7Ci0gcHVibGljOgotICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHZvaWQoYm9vbCk+IERvd25sb2FkaW5nU3RhdHVzQ0I7Ci0KLSAgdmlydHVhbCB2b2lkIFNldERvd25sb2FkaW5nU3RhdHVzQ0IoCi0gICAgICBjb25zdCBEb3dubG9hZGluZ1N0YXR1c0NCJiBkb3dubG9hZGluZ19zdGF0dXNfY2IpIHsKLSAgICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKGRvd25sb2FkaW5nX3N0YXR1c19jYik7Ci0gIH0KLSAgdmlydHVhbCB2b2lkIFNldFByZWxvYWQoUHJlbG9hZCBwcmVsb2FkKSB7IFVOUkVGRVJFTkNFRF9QQVJBTUVURVIocHJlbG9hZCk7IH0KLSAgdmlydHVhbCBib29sIEhhc1NpbmdsZU9yaWdpbigpIHsgcmV0dXJuIHRydWU7IH0KLSAgdmlydHVhbCBib29sIERpZFBhc3NDT1JTQWNjZXNzQ2hlY2soKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gIHZpcnR1YWwgdm9pZCBBYm9ydCgpIHt9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9QTEFZRVJfQlVGRkVSRURfREFUQV9TT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9wbGF5ZXIvY2FuX3BsYXlfdHlwZS5jYyBiL3NyYy9tZWRpYS9wbGF5ZXIvY2FuX3BsYXlfdHlwZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM4ODBhZS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvcGxheWVyL2Nhbl9wbGF5X3R5cGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1lZGlhL3BsYXllci9jYW5fcGxheV90eXBlLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL3N0cmluZ19zcGxpdC5oIgotI2luY2x1ZGUgImJhc2Uvc3RyaW5nX3V0aWwuaCIKLSNpbmNsdWRlICJtZWRpYS9hdWRpby9zaGVsbF9hdWRpb19zdHJlYW1lci5oIgotI2luY2x1ZGUgIm1lZGlhL3BsYXllci9jcnlwdG8va2V5X3N5c3RlbXMuaCIKLSNpbmNsdWRlICJtZWRpYS9wbGF5ZXIvbWltZV91dGlsLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWJvb2wgQ29udGFpbnNBQUM1MShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNvZGVjcykgewotICBjb25zdCBzdGQ6OnN0cmluZyBrQUFDNTFDb2RlYyA9ICJhYWM1MSI7Ci0KLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0KLSAgICAgIHN0ZDo6ZmluZChjb2RlY3MuYmVnaW4oKSwgY29kZWNzLmVuZCgpLCBrQUFDNTFDb2RlYyk7Ci0gIHJldHVybiBpdGVyICE9IGNvZGVjcy5lbmQoKTsKLX0KLQotYm9vbCBIYXNBQUM1MUhhcmR3YXJlU3VwcG9ydCgpIHsKLSNpZiBkZWZpbmVkKENPQkFMVF9XSU4pCi0gIHJldHVybiBmYWxzZTsKLSNlbHNlICAgLy8gZGVmaW5lZChDT0JBTFRfV0lOKQotICBTaGVsbEF1ZGlvU3RyZWFtZXIqIHN0cmVhbWVyID0gU2hlbGxBdWRpb1N0cmVhbWVyOjpJbnN0YW5jZSgpOwotICBEQ0hFQ0soc3RyZWFtZXIpOwotCi0gIHJldHVybiBzdHJlYW1lci0+R2V0Q29uZmlnKCkubWF4X2hhcmR3YXJlX2NoYW5uZWxzKCkgPj0gNjsKLSNlbmRpZiAgLy8gZGVmaW5lZChDT0JBTFRfV0lOKQotfQotCi0vLyBQYXJzZSBtaW1lIGFuZCBjb2RlY3MgZnJvbSBjb250ZW50IHR5cGUuIEl0IHdpbGwgcmV0dXJuICJ2aWRlby9tcDQiIGFuZAotLy8gImF2YzEuNDJFMDFFIiBmb3IgInZpZGVvL21wNDsgY29kZWNzPSJhdmMxLjQyRTAxRSIuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbgotLy8gZG9lcyBtaW5pbXVtIHZhbGlkYXRpb24gYXMgdGhlIG1lZGlhIHN0YWNrIHdpbGwgY2hlY2sgdGhlIG1pbWUgdHlwZSBhbmQKLS8vIGNvZGVjcyBzdHJpY3RseS4KLWJvb2wgUGFyc2VDb250ZW50VHlwZShjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBtaW1lLAotICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBjb2RlY3MpIHsKLSAgRENIRUNLKG1pbWUpOwotICBEQ0hFQ0soY29kZWNzKTsKLSAgc3RhdGljIGNvbnN0IGNoYXIga0NvZGVjc1tdID0gImNvZGVjcz0iOwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB0b2tlbnM7Ci0gIC8vIFNwbGl0U3RyaW5nIHdpbGwgYWxzbyB0cmltIHRoZSByZXN1bHRzLgotICA6OmJhc2U6OlNwbGl0U3RyaW5nKGNvbnRlbnRfdHlwZSwgJzsnLCAmdG9rZW5zKTsKLQotICAvLyBUaGUgZmlyc3Qgb25lIGhhcyB0byBiZSBtaW1lIHR5cGUgd2l0aCBkZWxpbWl0ZXIgJy8nIGxpa2UgJ3ZpZGVvL21wNCcuCi0gIGlmICh0b2tlbnMuZW1wdHkoKSB8fCB0b2tlbnNbMF0uZmluZCgnLycpID09IHRva2Vuc1swXS5ucG9zKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKm1pbWUgPSB0b2tlbnNbMF07Ci0gIGNvZGVjcy0+Y2xlYXIoKTsKLQotICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IHRva2Vucy5zaXplKCk7ICsraSkgewotICAgIGlmIChzdHJuY2FzZWNtcCh0b2tlbnNbaV0uY19zdHIoKSwga0NvZGVjcywgc3RybGVuKGtDb2RlY3MpKSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgICpjb2RlY3MgPSB0b2tlbnNbaV0uc3Vic3RyKHN0cmxlbihrQ29kZWNzKSk7Ci0gICAgVHJpbVN0cmluZygqY29kZWNzLCAiIFwiIiwgY29kZWNzKTsKLSAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotc3RkOjpzdHJpbmcgQ2FuUGxheVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtKSB7Ci0gIHN0ZDo6c3RyaW5nIG1pbWVfdHlwZTsKLSAgc3RkOjpzdHJpbmcgY29kZWNzOwotICBjb25zdCBjaGFyIGtOb3RTdXBwb3J0ZWRbXSA9ICIiOwotICBjb25zdCBjaGFyIGtNYXliZVtdID0gIm1heWJlIjsKLSAgY29uc3QgY2hhciBrUHJvYmFibHlbXSA9ICJwcm9iYWJseSI7Ci0KLSAgLy8gQ2hlY2sgaWYgdGhlIGNvbnRlbnQgdHlwZSBpcyBpbiB2YWxpZCBmb3JtYXQuCi0gIGlmICghUGFyc2VDb250ZW50VHlwZShjb250ZW50X3R5cGUsICZtaW1lX3R5cGUsICZjb2RlY3MpKSB7Ci0gICAgcmV0dXJuIGtOb3RTdXBwb3J0ZWQ7Ci0gIH0KLQotICBpZiAoIUlzU3VwcG9ydGVkTWVkaWFNaW1lVHlwZShtaW1lX3R5cGUpKSB7Ci0gICAgcmV0dXJuIGtOb3RTdXBwb3J0ZWQ7Ci0gIH0KLQotICBpZiAoIWtleV9zeXN0ZW0uZW1wdHkoKSkgewotICAgIGlmICghSXNTdXBwb3J0ZWRLZXlTeXN0ZW0oa2V5X3N5c3RlbSkpIHsKLSAgICAgIHJldHVybiBrTm90U3VwcG9ydGVkOwotICAgIH0KLQotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdHJpY3RfY29kZWNzOwotICAgIGJvb2wgc3RyaXBfc3VmZml4ID0gIUlzU3RyaWN0TWVkaWFNaW1lVHlwZShtaW1lX3R5cGUpOwotICAgIFBhcnNlQ29kZWNTdHJpbmcoY29kZWNzLCAmc3RyaWN0X2NvZGVjcywgc3RyaXBfc3VmZml4KTsKLQotICAgIGlmICghSXNTdXBwb3J0ZWRLZXlTeXN0ZW1XaXRoTWVkaWFNaW1lVHlwZShtaW1lX3R5cGUsIHN0cmljdF9jb2RlY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9zeXN0ZW0pKSB7Ci0gICAgICByZXR1cm4ga05vdFN1cHBvcnRlZDsKLSAgICB9Ci0KLSAgICAvLyBFdmVuIGlmIGFsbCBhYm92ZSBmdW5jdGlvbnMgZG9uJ3QgY2xhaW0gdGhhdCB0aGV5IGRvbid0IHN1cHBvcnQgb2YgdGhlCi0gICAgLy8gcGFydGljdWxhciBmb3JtYXQgd2l0aCB0aGUga2V5X3N5c3RlbSwgd2Ugc3RpbGwgd2FudCB0byBkb3VibGUgY2hlY2sgaWYKLSAgICAvLyB0aGUgaW1wbGVtZW50YXRpb24gc3VwcG9ydCB0aGlzIGZvcm1hdCB3aXRob3V0IGVuY3J5cHRpb24uCi0gIH0KLQotICBpZiAoSXNTdHJpY3RNZWRpYU1pbWVUeXBlKG1pbWVfdHlwZSkpIHsKLSAgICBpZiAoY29kZWNzLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiBrTWF5YmU7Ci0gICAgfQotCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0cmljdF9jb2RlY3M7Ci0gICAgUGFyc2VDb2RlY1N0cmluZyhjb2RlY3MsICZzdHJpY3RfY29kZWNzLCBmYWxzZSk7Ci0KLSAgICBpZiAoQ29udGFpbnNBQUM1MShzdHJpY3RfY29kZWNzKSAmJiAhSGFzQUFDNTFIYXJkd2FyZVN1cHBvcnQoKSkgewotICAgICAgcmV0dXJuIGtOb3RTdXBwb3J0ZWQ7Ci0gICAgfQotCi0gICAgaWYgKCFJc1N1cHBvcnRlZFN0cmljdE1lZGlhTWltZVR5cGUobWltZV90eXBlLCBzdHJpY3RfY29kZWNzKSkgewotICAgICAgcmV0dXJuIGtOb3RTdXBwb3J0ZWQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGtQcm9iYWJseTsKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwYXJzZWRfY29kZWNzOwotICBQYXJzZUNvZGVjU3RyaW5nKGNvZGVjcywgJnBhcnNlZF9jb2RlY3MsIHRydWUpOwotCi0gIGlmIChDb250YWluc0FBQzUxKHBhcnNlZF9jb2RlY3MpICYmICFIYXNBQUM1MUhhcmR3YXJlU3VwcG9ydCgpKSB7Ci0gICAgcmV0dXJuIGtOb3RTdXBwb3J0ZWQ7Ci0gIH0KLQotICBpZiAoIUFyZVN1cHBvcnRlZE1lZGlhQ29kZWNzKHBhcnNlZF9jb2RlY3MpKSB7Ci0gICAgcmV0dXJuIGtNYXliZTsKLSAgfQotCi0gIHJldHVybiBrUHJvYmFibHk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3BsYXllci9jYW5fcGxheV90eXBlLmggYi9zcmMvbWVkaWEvcGxheWVyL2Nhbl9wbGF5X3R5cGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IxNmQ4Zi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvcGxheWVyL2Nhbl9wbGF5X3R5cGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfUExBWUVSX0NBTl9QTEFZX1RZUEVfSF8KLSNkZWZpbmUgTUVESUFfUExBWUVSX0NBTl9QTEFZX1RZUEVfSF8KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gVE9ETzogRmluZCBhIGJldHRlciBob21lIGZvciBDYW5QbGF5VHlwZS4gIEkgZG9uJ3Qgd2FudCB0byBtYWtlCi0vLyBpdCBhIG1lbWJlciBmdW5jdGlvbiBvZiBXZWJNZWRpYVBsYXllciBiZWNhdXNlIG9mOgotLy8gMS4gSXQgaXMgcmVsYXRpdmVseSBjb21wbGV4LgotLy8gMi4gVGhlIEhUTUxNZWRpYUVsZW1lbnQgZG9lc24ndCBhbHdheXMgaG9sZCBhIFdlYk1lZGlhUGxheWVyIGluc3RhbmNlIHdoaWxlCi0vLyAgICBzdGF0aWMgZnVuY3Rpb24gZG9lcyd0IHdvcmsgaGVyZSBiZWNhdXNlIGl0IGNhbm5vdCBiZSBvdmVycmlkZSBpbgotLy8gICAgaW5oZXJpdGVkIGNsYXNzZXMgbGlrZSBXZWJNZWRpYVBsYXllckltcGwuCi0KLS8vIFRoaXMgZnVuY3Rpb24gY2FuIHJldHVybiAiIiwgIm1heWJlIiBvciAicHJvYmFibHkiIGFzIGRlZmluZWQgaW4KLS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS1uYXZpZ2F0b3ItY2FucGxheXR5cGUKLS8vIHRvIGluZGljYXRlIGhvdyBjZXJ0YWluIHRoYXQgdGhlIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gY2FuIHBsYXkgdmlkZW9zIGluCi0vLyB0aGUgZm9ybWF0IHNwZWNpZmllZCBieSBjb250ZW50X3R5cGUgYW5kIGtleV9zeXN0ZW0uIE5vdGUgdGhhdCAiIiBtZWFucyB0aGUKLS8vIGltcGxlbWVudGF0aW9uIGNhbm5vdCBwbGF5IHN1Y2ggdmlkZW9zLgotc3RkOjpzdHJpbmcgQ2FuUGxheVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtKTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfUExBWUVSX0NBTl9QTEFZX1RZUEVfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9wbGF5ZXIvY3J5cHRvL2tleV9zeXN0ZW1zLmNjIGIvc3JjL21lZGlhL3BsYXllci9jcnlwdG8va2V5X3N5c3RlbXMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZTg0YTkuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3BsYXllci9jcnlwdG8va2V5X3N5c3RlbXMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLwotLy8gQ29weXJpZ2h0IDIwMTMgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlICJtZWRpYS9wbGF5ZXIvY3J5cHRvL2tleV9zeXN0ZW1zLmgiCi0KLSNpbmNsdWRlICJiYXNlL3N0cmluZ191dGlsLmgiCi0jaW5jbHVkZSAibWVkaWEvY3J5cHRvL3NoZWxsX2RlY3J5cHRvcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAibWVkaWEvcGxheWVyL21pbWVfdXRpbC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1ib29sIElzU3VwcG9ydGVkS2V5U3lzdGVtKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtKSB7Ci0gIHJldHVybiBTaGVsbERlY3J5cHRvckZhY3Rvcnk6OlN1cHBvcnRzKGtleV9zeXN0ZW0pOwotfQotCi1ib29sIElzU3VwcG9ydGVkS2V5U3lzdGVtV2l0aE1lZGlhTWltZVR5cGUoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZSwKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNvZGVjcywKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSkgewotICBpZiAoU2hlbGxEZWNyeXB0b3JGYWN0b3J5OjpTdXBwb3J0cyhrZXlfc3lzdGVtKSkgewotICAgIGlmIChtaW1lX3R5cGUgPT0gInZpZGVvL21wNCIgfHwgbWltZV90eXBlID09ICJ2aWRlby93ZWJtIiB8fAotICAgICAgICBtaW1lX3R5cGUgPT0gImF1ZGlvL21wNCIpIHsKLSAgICAgIHJldHVybiBBcmVTdXBwb3J0ZWRNZWRpYUNvZGVjcyhjb2RlY3MpOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIFVzZWQgZm9yIGxvZ2dpbmcgb25seS4KLXN0ZDo6c3RyaW5nIEtleVN5c3RlbU5hbWVGb3JVTUEoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0pIHsKLSAgcmV0dXJuIGtleV9zeXN0ZW07Ci19Ci0KLWJvb2wgQ2FuVXNlQWVzRGVjcnlwdG9yKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RkOjpzdHJpbmcgR2V0UGx1Z2luVHlwZShjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSkgewotICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvcGxheWVyL2NyeXB0by9rZXlfc3lzdGVtcy5oIGIvc3JjL21lZGlhL3BsYXllci9jcnlwdG8va2V5X3N5c3RlbXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI1M2QzOC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvcGxheWVyL2NyeXB0by9rZXlfc3lzdGVtcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9QTEFZRVJfQ1JZUFRPX0tFWV9TWVNURU1TX0hfCi0jZGVmaW5lIE1FRElBX1BMQVlFUl9DUllQVE9fS0VZX1NZU1RFTVNfSF8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIFJldHVybnMgd2hldGhlciB8a2V5X3N5dGVtfCBpcyBzdXBwb3J0ZWQgYXQgYWxsLgotLy8gQ2FsbCBJc1N1cHBvcnRlZEtleVN5c3RlbVdpdGhNZWRpYU1pbWVUeXBlKCkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYQotLy8gfGtleV9zeXN0ZW18IHN1cHBvcnRzIGEgc3BlY2lmaWMgdHlwZSBvZiBtZWRpYS4KLWJvb2wgSXNTdXBwb3J0ZWRLZXlTeXN0ZW0oY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0pOwotCi0vLyBSZXR1cm5zIHdoZXRoZXIgfGtleV9zeXRlbXwgc3VwcG9ydHMgdGhlIHNwZWNpZmllZCBtZWRpYSB0eXBlIGFuZCBjb2RlYyhzKS4KLWJvb2wgSXNTdXBwb3J0ZWRLZXlTeXN0ZW1XaXRoTWVkaWFNaW1lVHlwZSgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWltZV90eXBlLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY29kZWNzLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtKTsKLQotLy8gUmV0dXJucyBhIG5hbWUgZm9yIHxrZXlfc3lzdGVtfCBzdWl0YWJsZSB0byBVTUEgbG9nZ2luZy4KLXN0ZDo6c3RyaW5nIEtleVN5c3RlbU5hbWVGb3JVTUEoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0pOwotCi0vLyBSZXR1cm5zIHdoZXRoZXIgQWVzRGVjcnlwdG9yIGNhbiBiZSB1c2VkIGZvciB0aGUgZ2l2ZW4gfGtleV9zeXN0ZW18LgotYm9vbCBDYW5Vc2VBZXNEZWNyeXB0b3IoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0pOwotCi0vLyBSZXR1cm5zIHRoZSBwbHVnaW4gdHlwZSBnaXZlbiBhIHxrZXlfc3lzdGVtfC4KLS8vIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIGlmIG5vIHBsdWdpbiB0eXBlIGlzIGZvdW5kIGZvciB8a2V5X3N5c3RlbXwuCi1zdGQ6OnN0cmluZyBHZXRQbHVnaW5UeXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtKTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfUExBWUVSX0NSWVBUT19LRVlfU1lTVEVNU19IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3BsYXllci9jcnlwdG8vcHJveHlfZGVjcnlwdG9yLmNjIGIvc3JjL21lZGlhL3BsYXllci9jcnlwdG8vcHJveHlfZGVjcnlwdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWJhZTIwLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9wbGF5ZXIvY3J5cHRvL3Byb3h5X2RlY3J5cHRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvcGxheWVyL2NyeXB0by9wcm94eV9kZWNyeXB0b3IuaCIKLQotLy8gV2ViTWVkaWFQbGF5ZXIuaCBuZWVkcyB1aW50OF90IGRlZmluZWQKLS8vIFNlZTogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTkyMDMxCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJiYXNlL2xvY2F0aW9uLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaWYgZGVmaW5lZChfREVCVUcpCi0jaW5jbHVkZSAiYmFzZS9zdHJpbmdfbnVtYmVyX2NvbnZlcnNpb25zLmgiCi0jZW5kaWYKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVjcnlwdG9yX2NsaWVudC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2hlbGxfYnVmZmVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXJfY29uZmlnLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb19mcmFtZS5oIgotI2luY2x1ZGUgIm1lZGlhL2NyeXB0by9zaGVsbF9kZWNyeXB0b3JfZmFjdG9yeS5oIgotI2luY2x1ZGUgIm1lZGlhL3BsYXllci9jcnlwdG8va2V5X3N5c3RlbXMuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotUHJveHlEZWNyeXB0b3I6OlByb3h5RGVjcnlwdG9yKERlY3J5cHRvckNsaWVudCogZGVjcnlwdG9yX2NsaWVudCkKLSAgICA6IGNsaWVudF8oZGVjcnlwdG9yX2NsaWVudCksIGRlc3Ryb3lfc29vbl8oZmFsc2UpIHt9Ci0KLVByb3h5RGVjcnlwdG9yOjp+UHJveHlEZWNyeXB0b3IoKSB7fQotCi0vLyBUT0RPKHhod2FuZyk6IFN1cHBvcnQgbXVsdGlwbGUgZGVjcnlwdG9yIG5vdGlmaWNhdGlvbiByZXF1ZXN0IChlLmcuIGZyb20KLS8vIHZpZGVvIGFuZCBhdWRpbyBkZWNvZGVycykuIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIG9rYXkgZm9yIHRoZSBjdXJyZW50Ci0vLyBtZWRpYSBwaXBlbGluZSBzaW5jZSB3ZSBpbml0aWFsaXplIGF1ZGlvIGFuZCB2aWRlbyBkZWNvZGVycyBpbiBzZXF1ZW5jZS4KLS8vIEJ1dCBQcm94eURlY3J5cHRvciBzaG91bGQgbm90IGRlcGVuZCBvbiBtZWRpYSBwaXBlbGluZSdzIGltcGxlbWVudGF0aW9uCi0vLyBkZXRhaWwuCi12b2lkIFByb3h5RGVjcnlwdG9yOjpTZXREZWNyeXB0b3JSZWFkeUNCKAotICAgIGNvbnN0IERlY3J5cHRvclJlYWR5Q0ImIGRlY3J5cHRvcl9yZWFkeV9jYikgewotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotCi0gIGlmIChkZXN0cm95X3Nvb25fKSB7Ci0gICAgZGVjcnlwdG9yX3JlYWR5X2NiLlJ1bihOVUxMKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBDYW5jZWxzIHRoZSBwcmV2aW91cyBkZWNyeXB0b3IgcmVxdWVzdC4KLSAgaWYgKGRlY3J5cHRvcl9yZWFkeV9jYi5pc19udWxsKCkpIHsKLSAgICBpZiAoIWRlY3J5cHRvcl9yZWFkeV9jYl8uaXNfbnVsbCgpKQotICAgICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJmRlY3J5cHRvcl9yZWFkeV9jYl8pLlJ1bihOVUxMKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBOb3JtYWwgZGVjcnlwdG9yIHJlcXVlc3QuCi0gIERDSEVDSyhkZWNyeXB0b3JfcmVhZHlfY2JfLmlzX251bGwoKSk7Ci0gIGlmIChkZWNyeXB0b3JfKSB7Ci0gICAgZGVjcnlwdG9yX3JlYWR5X2NiLlJ1bihkZWNyeXB0b3JfLmdldCgpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgZGVjcnlwdG9yX3JlYWR5X2NiXyA9IGRlY3J5cHRvcl9yZWFkeV9jYjsKLX0KLQotdm9pZCBQcm94eURlY3J5cHRvcjo6RGVzdHJveVNvb24oKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0KLSAgZGVzdHJveV9zb29uXyA9IHRydWU7Ci0gIGlmICghZGVjcnlwdG9yX3JlYWR5X2NiXy5pc19udWxsKCkpIHsKLSAgICBiYXNlOjpSZXNldEFuZFJldHVybigmZGVjcnlwdG9yX3JlYWR5X2NiXykuUnVuKE5VTEwpOwotICB9Ci19Ci0KLWJvb2wgUHJveHlEZWNyeXB0b3I6OkdlbmVyYXRlS2V5UmVxdWVzdChjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogaW5pdF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbml0X2RhdGFfbGVuZ3RoKSB7Ci0gIC8vIFdlIGRvIG5vdCBzdXBwb3J0IHJ1bi10aW1lIHN3aXRjaGluZyBvZiBkZWNyeXB0b3JzLiBHZW5lcmF0ZUtleVJlcXVlc3QoKQotICAvLyBvbmx5IGNyZWF0ZXMgYSBuZXcgZGVjcnlwdG9yIHdoZW4gfGRlY3J5cHRvcl98IGlzIG5vdCBpbml0aWFsaXplZC4KLSAgRFZMT0coMSkgPDwgIkdlbmVyYXRlS2V5UmVxdWVzdDoga2V5X3N5c3RlbSA9ICIgPDwga2V5X3N5c3RlbTsKLQotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotCi0gIGlmICghZGVjcnlwdG9yXykgewotICAgIGRlY3J5cHRvcl8gPSBDcmVhdGVEZWNyeXB0b3Ioa2V5X3N5c3RlbSk7Ci0gICAgaWYgKCFkZWNyeXB0b3JfKSB7Ci0gICAgICBjbGllbnRfLT5LZXlFcnJvcihrZXlfc3lzdGVtLCAiIiwgRGVjcnlwdG9yOjprVW5rbm93bkVycm9yLCAwKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBpZiAoIWRlY3J5cHRvcl8tPkdlbmVyYXRlS2V5UmVxdWVzdChrZXlfc3lzdGVtLCB0eXBlLCBpbml0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfZGF0YV9sZW5ndGgpKSB7Ci0gICAgZGVjcnlwdG9yXy5yZXNldCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghZGVjcnlwdG9yX3JlYWR5X2NiXy5pc19udWxsKCkpCi0gICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJmRlY3J5cHRvcl9yZWFkeV9jYl8pLlJ1bihkZWNyeXB0b3JfLmdldCgpKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBQcm94eURlY3J5cHRvcjo6QWRkS2V5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGtleV9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIGluaXRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5pdF9kYXRhX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCkgewotICBEVkxPRygxKSA8PCAiQWRkS2V5KCkiOwotI2lmIGRlZmluZWQoX0RFQlVHKQotICBzdGQ6OnN0cmluZyBoZXggPSBiYXNlOjpIZXhFbmNvZGUoa2V5LCBrZXlfbGVuZ3RoKTsKLSAgRExPRyhJTkZPKSA8PCAiRFJNIEtleSBSZXNwb25zZTogIiA8PCBoZXg7Ci0jZW5kaWYKLQotICAvLyBXZWJNZWRpYVBsYXllckltcGwgZW5zdXJlcyBHZW5lcmF0ZUtleVJlcXVlc3QoKSBoYXMgYmVlbiBjYWxsZWQuCi0gIGRlY3J5cHRvcl8tPkFkZEtleShrZXlfc3lzdGVtLCBrZXksIGtleV9sZW5ndGgsIGluaXRfZGF0YSwgaW5pdF9kYXRhX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25faWQpOwotfQotCi12b2lkIFByb3h5RGVjcnlwdG9yOjpDYW5jZWxLZXlSZXF1ZXN0KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCkgewotICBEVkxPRygxKSA8PCAiQ2FuY2VsS2V5UmVxdWVzdCgpIjsKLQotICAvLyBXZWJNZWRpYVBsYXllckltcGwgZW5zdXJlcyBHZW5lcmF0ZUtleVJlcXVlc3QoKSBoYXMgYmVlbiBjYWxsZWQuCi0gIGRlY3J5cHRvcl8tPkNhbmNlbEtleVJlcXVlc3Qoa2V5X3N5c3RlbSwgc2Vzc2lvbl9pZCk7Ci19Ci0KLXZvaWQgUHJveHlEZWNyeXB0b3I6OlJlZ2lzdGVyS2V5QWRkZWRDQihTdHJlYW1UeXBlIHN0cmVhbV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEtleUFkZGVkQ0ImIGtleV9hZGRlZF9jYikgewotICBOT1RSRUFDSEVEKCkgPDwgIktleUFkZGVkQ0Igc2hvdWxkIG5vdCBiZSByZWdpc3RlcmVkIHdpdGggUHJveHlEZWNyeXB0b3IuIjsKLX0KLQotdm9pZCBQcm94eURlY3J5cHRvcjo6RGVjcnlwdChTdHJlYW1UeXBlIHN0cmVhbV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBlbmNyeXB0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY3J5cHRDQiYgZGVjcnlwdF9jYikgewotICBOT1RSRUFDSEVEKCkgPDwgIlByb3h5RGVjcnlwdG9yIGRvZXMgbm90IHN1cHBvcnQgZGVjcnlwdGlvbiI7Ci19Ci0KLXZvaWQgUHJveHlEZWNyeXB0b3I6OkNhbmNlbERlY3J5cHQoU3RyZWFtVHlwZSBzdHJlYW1fdHlwZSkgewotICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwotCi0gIGlmIChkZWNyeXB0b3JfKQotICAgIGRlY3J5cHRvcl8tPkNhbmNlbERlY3J5cHQoc3RyZWFtX3R5cGUpOwotfQotCi12b2lkIFByb3h5RGVjcnlwdG9yOjpJbml0aWFsaXplQXVkaW9EZWNvZGVyKAotICAgIHNjb3BlZF9wdHI8QXVkaW9EZWNvZGVyQ29uZmlnPiBjb25maWcsCi0gICAgY29uc3QgRGVjb2RlckluaXRDQiYgaW5pdF9jYikgewotICBOT1RSRUFDSEVEKCkgPDwgIlByb3h5RGVjcnlwdG9yIGRvZXMgbm90IHN1cHBvcnQgYXVkaW8gZGVjb2RpbmciOwotfQotCi12b2lkIFByb3h5RGVjcnlwdG9yOjpJbml0aWFsaXplVmlkZW9EZWNvZGVyKAotICAgIHNjb3BlZF9wdHI8VmlkZW9EZWNvZGVyQ29uZmlnPiBjb25maWcsCi0gICAgY29uc3QgRGVjb2RlckluaXRDQiYgaW5pdF9jYikgewotICBOT1RSRUFDSEVEKCkgPDwgIlByb3h5RGVjcnlwdG9yIGRvZXMgbm90IHN1cHBvcnQgdmlkZW8gZGVjb2RpbmciOwotfQotCi12b2lkIFByb3h5RGVjcnlwdG9yOjpEZWNyeXB0QW5kRGVjb2RlQXVkaW8oCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgZW5jcnlwdGVkLAotICAgIGNvbnN0IEF1ZGlvRGVjb2RlQ0ImIGF1ZGlvX2RlY29kZV9jYikgewotICBOT1RSRUFDSEVEKCkgPDwgIlByb3h5RGVjcnlwdG9yIGRvZXMgbm90IHN1cHBvcnQgYXVkaW8gZGVjb2RpbmciOwotfQotCi12b2lkIFByb3h5RGVjcnlwdG9yOjpEZWNyeXB0QW5kRGVjb2RlVmlkZW8oCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgZW5jcnlwdGVkLAotICAgIGNvbnN0IFZpZGVvRGVjb2RlQ0ImIHZpZGVvX2RlY29kZV9jYikgewotICBOT1RSRUFDSEVEKCkgPDwgIlByb3h5RGVjcnlwdG9yIGRvZXMgbm90IHN1cHBvcnQgdmlkZW8gZGVjb2RpbmciOwotfQotCi12b2lkIFByb3h5RGVjcnlwdG9yOjpSZXNldERlY29kZXIoU3RyZWFtVHlwZSBzdHJlYW1fdHlwZSkgewotICBOT1RSRUFDSEVEKCkgPDwgIlByb3h5RGVjcnlwdG9yIGRvZXMgbm90IHN1cHBvcnQgYXVkaW8vdmlkZW8gZGVjb2RpbmciOwotfQotCi12b2lkIFByb3h5RGVjcnlwdG9yOjpEZWluaXRpYWxpemVEZWNvZGVyKFN0cmVhbVR5cGUgc3RyZWFtX3R5cGUpIHsKLSAgTk9UUkVBQ0hFRCgpIDw8ICJQcm94eURlY3J5cHRvciBkb2VzIG5vdCBzdXBwb3J0IGF1ZGlvL3ZpZGVvIGRlY29kaW5nIjsKLX0KLQotc2NvcGVkX3B0cjxEZWNyeXB0b3I+IFByb3h5RGVjcnlwdG9yOjpDcmVhdGVEZWNyeXB0b3IoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0pIHsKLSAgRENIRUNLKGNsaWVudF8pOwotCi0gIC8vIGxiX3NoZWxsIGRvZXNuJ3Qgc3VwcG9ydCBwcGFwaSBvciBBZXNEZWNyeXB0b3IsIHNvIHdlIGhhdmUgb3VyIG93bgotICAvLyBkZWNyeXB0b3IgZmFjdG9yeSB0byBoYW5kbGUgY2RtIHN1cHBvcnQuCi0gIHJldHVybiBzY29wZWRfcHRyPERlY3J5cHRvcj4oCi0gICAgICBTaGVsbERlY3J5cHRvckZhY3Rvcnk6OkNyZWF0ZShrZXlfc3lzdGVtLCBjbGllbnRfKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3BsYXllci9jcnlwdG8vcHJveHlfZGVjcnlwdG9yLmggYi9zcmMvbWVkaWEvcGxheWVyL2NyeXB0by9wcm94eV9kZWNyeXB0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ0NjVhNC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvcGxheWVyL2NyeXB0by9wcm94eV9kZWNyeXB0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfUExBWUVSX0NSWVBUT19QUk9YWV9ERUNSWVBUT1JfSF8KLSNkZWZpbmUgTUVESUFfUExBWUVSX0NSWVBUT19QUk9YWV9ERUNSWVBUT1JfSF8KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi9sb2NrLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNyeXB0b3IuaCIKLQotbmFtZXNwYWNlIGJhc2UgewotY2xhc3MgTWVzc2FnZUxvb3BQcm94eTsKLX0KLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgRGVjcnlwdG9yQ2xpZW50OwotCi0vLyBBIGRlY3J5cHRvciBwcm94eSB0aGF0IGNyZWF0ZXMgYSByZWFsIGRlY3J5cHRvciBvYmplY3Qgb24gZGVtYW5kIGFuZAotLy8gZm9yd2FyZHMgZGVjcnlwdG9yIGNhbGxzIHRvIGl0LgotLy8gVE9ETyh4aHdhbmcpOiBDdXJyZW50bHkgd2UgZG9uJ3Qgc3VwcG9ydCBydW4tdGltZSBzd2l0Y2hpbmcgYW1vbmcgZGVjcnlwdG9yCi0vLyBvYmplY3RzLiBGaXggdGhpcyB3aGVuIG5lZWRlZC4KLWNsYXNzIFByb3h5RGVjcnlwdG9yIDogcHVibGljIERlY3J5cHRvciB7Ci0gcHVibGljOgotICBQcm94eURlY3J5cHRvcihEZWNyeXB0b3JDbGllbnQqIGRlY3J5cHRvcl9jbGllbnQpOwotICB2aXJ0dWFsIH5Qcm94eURlY3J5cHRvcigpOwotCi0gIC8vIFJlcXVlc3RzIHRoZSBQcm94eURlY3J5cHRvciB0byBub3RpZnkgdGhlIGRlY3J5cHRvciB3aGVuIGl0J3MgcmVhZHkgdGhyb3VnaAotICAvLyB0aGUgfGRlY3J5cHRvcl9yZWFkeV9jYnwgcHJvdmlkZWQuCi0gIC8vIElmIHxkZWNyeXB0b3JfcmVhZHlfY2J8IGlzIG51bGwsIHRoZSBleGlzdGluZyBjYWxsYmFjayB3aWxsIGJlIGZpcmVkIHdpdGgKLSAgLy8gTlVMTCBpbW1lZGlhdGVseSBhbmQgcmVzZXQuCi0gIHZvaWQgU2V0RGVjcnlwdG9yUmVhZHlDQihjb25zdCBEZWNyeXB0b3JSZWFkeUNCJiBkZWNyeXB0b3JfcmVhZHlfY2IpOwotICAvLyBOb3RpZnkgdGhhdCB0aGUgZGVjcnlwdG9yIGlzIGdvaW5nIHRvIGJlIGRlc3Ryb3llZCBzb29uLiAgU28gYW55IHBlbmRpbmcgb3IKLSAgLy8gZnV0dXJlIERlY3J5cHRvclJlYWR5Q0Igd2lsbCBiZSBjYWxsZWQgd2l0aCBOVUxMIGFuZCB0aGUgcGlwZWxpbmUgY2FuIGJlCi0gIC8vIHRvcm4gZG93bi4KLSAgdm9pZCBEZXN0cm95U29vbigpOwotCi0gIC8vIERlY3J5cHRvciBpbXBsZW1lbnRhdGlvbi4KLSAgdmlydHVhbCBib29sIEdlbmVyYXRlS2V5UmVxdWVzdChjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogaW5pdF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbml0X2RhdGFfbGVuZ3RoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIEFkZEtleShjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCoga2V5LAotICAgICAgICAgICAgICAgICAgICAgIGludCBrZXlfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBpbml0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IGluaXRfZGF0YV9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25faWQpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgQ2FuY2VsS2V5UmVxdWVzdChjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25faWQpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXJLZXlBZGRlZENCKFN0cmVhbVR5cGUgc3RyZWFtX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgS2V5QWRkZWRDQiYga2V5X2FkZGVkX2NiKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIERlY3J5cHQoU3RyZWFtVHlwZSBzdHJlYW1fdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgZW5jcnlwdGVkLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNyeXB0Q0ImIGRlY3J5cHRfY2IpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgQ2FuY2VsRGVjcnlwdChTdHJlYW1UeXBlIHN0cmVhbV90eXBlKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIEluaXRpYWxpemVBdWRpb0RlY29kZXIoc2NvcGVkX3B0cjxBdWRpb0RlY29kZXJDb25maWc+IGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjb2RlckluaXRDQiYgaW5pdF9jYikgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplVmlkZW9EZWNvZGVyKHNjb3BlZF9wdHI8VmlkZW9EZWNvZGVyQ29uZmlnPiBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY29kZXJJbml0Q0ImIGluaXRfY2IpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgRGVjcnlwdEFuZERlY29kZUF1ZGlvKAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgZW5jcnlwdGVkLAotICAgICAgY29uc3QgQXVkaW9EZWNvZGVDQiYgYXVkaW9fZGVjb2RlX2NiKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIERlY3J5cHRBbmREZWNvZGVWaWRlbygKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGVuY3J5cHRlZCwKLSAgICAgIGNvbnN0IFZpZGVvRGVjb2RlQ0ImIHZpZGVvX2RlY29kZV9jYikgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBSZXNldERlY29kZXIoU3RyZWFtVHlwZSBzdHJlYW1fdHlwZSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBEZWluaXRpYWxpemVEZWNvZGVyKFN0cmVhbVR5cGUgc3RyZWFtX3R5cGUpIE9WRVJSSURFOwotCi0gcHJpdmF0ZToKLSAgLy8gSGVscGVyIGZ1bmN0aW9ucyB0byBjcmVhdGUgZGVjcnlwdG9ycyB0byBoYW5kbGUgdGhlIGdpdmVuIHxrZXlfc3lzdGVtfC4KLSAgc2NvcGVkX3B0cjxEZWNyeXB0b3I+IENyZWF0ZURlY3J5cHRvcihjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSk7Ci0KLSAgLy8gRGVjcnlwdG9yQ2xpZW50IHRocm91Z2ggd2hpY2gga2V5IGV2ZW50cyBhcmUgZmlyZWQuCi0gIERlY3J5cHRvckNsaWVudCogY2xpZW50XzsKLQotICAvLyBQcm90ZWN0cyB0aGUgfGRlY3J5cHRvcl98LiBOb3RlIHRoYXQgfGRlY3J5cHRvcl98IGl0c2VsZiBzaG91bGQgYmUgdGhyZWFkCi0gIC8vIHNhZmUgYXMgcGVyIHRoZSBEZWNyeXB0b3IgaW50ZXJmYWNlLgotICBiYXNlOjpMb2NrIGxvY2tfOwotCi0gIGJvb2wgZGVzdHJveV9zb29uXzsKLSAgRGVjcnlwdG9yUmVhZHlDQiBkZWNyeXB0b3JfcmVhZHlfY2JfOwotCi0gIC8vIFRoZSByZWFsIGRlY3J5cHRvciB0aGF0IGRvZXMgZGVjcnlwdGlvbiBmb3IgdGhlIFByb3h5RGVjcnlwdG9yLgotICAvLyBUaGlzIHBvaW50ZXIgaXMgcHJvdGVjdGVkIGJ5IHRoZSB8bG9ja198LgotICBzY29wZWRfcHRyPERlY3J5cHRvcj4gZGVjcnlwdG9yXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oUHJveHlEZWNyeXB0b3IpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfUExBWUVSX0NSWVBUT19QUk9YWV9ERUNSWVBUT1JfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9wbGF5ZXIvbWltZV91dGlsLmNjIGIvc3JjL21lZGlhL3BsYXllci9taW1lX3V0aWwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YjBhNWIuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3BsYXllci9taW1lX3V0aWwuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDM5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS9wbGF5ZXIvbWltZV91dGlsLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8aXRlcmF0b3I+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL3N0cmluZ19zcGxpdC5oIgotI2luY2x1ZGUgImJhc2Uvc3RyaW5nX3V0aWwuaCIKLSNpbmNsdWRlICJiYXNlL3V0Zl9zdHJpbmdfY29udmVyc2lvbnMuaCIKLQotI2lmIGRlZmluZWQoT1NfU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9jb25maWd1cmF0aW9uLmgiCi0jZW5kaWYgIC8vIGRlZmluZWQoT1NfU1RBUkJPQVJEKQotCi11c2luZyBzdGQ6OnN0cmluZzsKLQotbmFtZXNwYWNlIHsKLQotc3RydWN0IE1lZGlhVHlwZSB7Ci0gIGNvbnN0IGNoYXIgbmFtZVsxMl07Ci0gIGNvbnN0IGNoYXIgbWF0Y2hlclsxM107Ci19OwotCi1zdGF0aWMgY29uc3QgTWVkaWFUeXBlIGtJYW5hTWVkaWFUeXBlc1tdID0gewotICB7ICJhcHBsaWNhdGlvbiIsICJhcHBsaWNhdGlvbi8iIH0sCi0gIHsgImF1ZGlvIiwgImF1ZGlvLyIgfSwKLSAgeyAiZXhhbXBsZSIsICJleGFtcGxlLyIgfSwKLSAgeyAiaW1hZ2UiLCAiaW1hZ2UvIiB9LAotICB7ICJtZXNzYWdlIiwgIm1lc3NhZ2UvIiB9LAotICB7ICJtb2RlbCIsICJtb2RlbC8iIH0sCi0gIHsgIm11bHRpcGFydCIsICJtdWx0aXBhcnQvIiB9LAotICB7ICJ0ZXh0IiwgInRleHQvIiB9LAotICB7ICJ2aWRlbyIsICJ2aWRlby8iIH0sCi19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gU2luZ2xldG9uIHV0aWxpdHkgY2xhc3MgZm9yIG1pbWUgdHlwZXMuCi1jbGFzcyBNaW1lVXRpbCB7Ci0gcHVibGljOgotICBib29sIEdldE1pbWVUeXBlRnJvbUV4dGVuc2lvbihjb25zdCBGaWxlUGF0aDo6U3RyaW5nVHlwZSYgZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogbWltZV90eXBlKSBjb25zdDsKLQotICBib29sIEdldE1pbWVUeXBlRnJvbUZpbGUoY29uc3QgRmlsZVBhdGgmIGZpbGVfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBtaW1lX3R5cGUpIGNvbnN0OwotCi0gIGJvb2wgR2V0V2VsbEtub3duTWltZVR5cGVGcm9tRXh0ZW5zaW9uKGNvbnN0IEZpbGVQYXRoOjpTdHJpbmdUeXBlJiBleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBtaW1lX3R5cGUpIGNvbnN0OwotCi0gIGJvb2wgSXNTdXBwb3J0ZWRJbWFnZU1pbWVUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lX3R5cGUpIGNvbnN0OwotICBib29sIElzU3VwcG9ydGVkTWVkaWFNaW1lVHlwZShjb25zdCBzdGQ6OnN0cmluZyYgbWltZV90eXBlKSBjb25zdDsKLSAgYm9vbCBJc1N1cHBvcnRlZE5vbkltYWdlTWltZVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZSkgY29uc3Q7Ci0gIGJvb2wgSXNVbnN1cHBvcnRlZFRleHRNaW1lVHlwZShjb25zdCBzdGQ6OnN0cmluZyYgbWltZV90eXBlKSBjb25zdDsKLSAgYm9vbCBJc1N1cHBvcnRlZEphdmFzY3JpcHRNaW1lVHlwZShjb25zdCBzdGQ6OnN0cmluZyYgbWltZV90eXBlKSBjb25zdDsKLQotICBib29sIElzVmlld1NvdXJjZU1pbWVUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lX3R5cGUpIGNvbnN0OwotCi0gIGJvb2wgSXNTdXBwb3J0ZWRNaW1lVHlwZShjb25zdCBzdGQ6OnN0cmluZyYgbWltZV90eXBlKSBjb25zdDsKLQotICBib29sIE1hdGNoZXNNaW1lVHlwZShjb25zdCBzdGQ6OnN0cmluZyAmbWltZV90eXBlX3BhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZtaW1lX3R5cGUpIGNvbnN0OwotCi0gIGJvb2wgSXNNaW1lVHlwZShjb25zdCBzdGQ6OnN0cmluZyYgdHlwZV9zdHJpbmcpIGNvbnN0OwotCi0gIGJvb2wgQXJlU3VwcG9ydGVkTWVkaWFDb2RlY3MoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjb2RlY3MpIGNvbnN0OwotCi0gIHZvaWQgUGFyc2VDb2RlY1N0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgY29kZWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBjb2RlY3Nfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJpcCk7Ci0KLSAgYm9vbCBJc1N0cmljdE1lZGlhTWltZVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZSkgY29uc3Q7Ci0gIGJvb2wgSXNTdXBwb3J0ZWRTdHJpY3RNZWRpYU1pbWVUeXBlKAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZSwKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY29kZWNzKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBzdHJ1Y3QgYmFzZTo6RGVmYXVsdExhenlJbnN0YW5jZVRyYWl0czxNaW1lVXRpbD47Ci0KLSAgdHlwZWRlZiBiYXNlOjpoYXNoX3NldDxzdGQ6OnN0cmluZz4gTWltZU1hcHBpbmdzOwotICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBNaW1lTWFwcGluZ3M+IFN0cmljdE1hcHBpbmdzOwotCi0gIE1pbWVVdGlsKCk7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHxjb2RlY3N8IGlzIG5vbmVtcHR5IGFuZCBhbGwgdGhlIGl0ZW1zIGluIGl0IGFyZSBwcmVzZW50IGluCi0gIC8vIHxzdXBwb3J0ZWRfY29kZWNzfC4KLSAgc3RhdGljIGJvb2wgQXJlU3VwcG9ydGVkQ29kZWNzKGNvbnN0IE1pbWVNYXBwaW5ncyYgc3VwcG9ydGVkX2NvZGVjcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY29kZWNzKTsKLQotICAvLyBGb3IgZmFzdGVyIGxvb2t1cCwga2VlcCBoYXNoIHNldHMuCi0gIHZvaWQgSW5pdGlhbGl6ZU1pbWVUeXBlTWFwcygpOwotCi0gIGJvb2wgR2V0TWltZVR5cGVGcm9tRXh0ZW5zaW9uSGVscGVyKGNvbnN0IEZpbGVQYXRoOjpTdHJpbmdUeXBlJiBleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV9wbGF0Zm9ybV90eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG1pbWVfdHlwZSkgY29uc3Q7Ci0KLSAgTWltZU1hcHBpbmdzIGltYWdlX21hcF87Ci0gIE1pbWVNYXBwaW5ncyBtZWRpYV9tYXBfOwotICBNaW1lTWFwcGluZ3Mgbm9uX2ltYWdlX21hcF87Ci0gIE1pbWVNYXBwaW5ncyB1bnN1cHBvcnRlZF90ZXh0X21hcF87Ci0gIE1pbWVNYXBwaW5ncyBqYXZhc2NyaXB0X21hcF87Ci0gIE1pbWVNYXBwaW5ncyB2aWV3X3NvdXJjZV9tYXBfOwotICBNaW1lTWFwcGluZ3MgY29kZWNzX21hcF87Ci0KLSAgU3RyaWN0TWFwcGluZ3Mgc3RyaWN0X2Zvcm1hdF9tYXBfOwotfTsgIC8vIGNsYXNzIE1pbWVVdGlsCi0KLS8vIFRoaXMgdmFyaWFibGUgaXMgTGVha3kgYmVjYXVzZSB3ZSBuZWVkIHRvIGFjY2VzcyBpdCBmcm9tIFdvcmtlclBvb2wgdGhyZWFkcy4KLXN0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TWltZVV0aWw+OjpMZWFreSBnX21pbWVfdXRpbCA9Ci0gICAgTEFaWV9JTlNUQU5DRV9JTklUSUFMSVpFUjsKLQotc3RydWN0IE1pbWVJbmZvIHsKLSAgY29uc3QgY2hhciogbWltZV90eXBlOwotICBjb25zdCBjaGFyKiBleHRlbnNpb25zOyAgLy8gY29tbWEgc2VwYXJhdGVkIGxpc3QKLX07Ci0KLXN0YXRpYyBjb25zdCBNaW1lSW5mbyBwcmltYXJ5X21hcHBpbmdzW10gPSB7Ci0gIHsgInRleHQvaHRtbCIsICJodG1sLGh0bSIgfSwKLSAgeyAidGV4dC9jc3MiLCAiY3NzIiB9LAotICB7ICJ0ZXh0L3htbCIsICJ4bWwiIH0sCi0gIHsgImltYWdlL2dpZiIsICJnaWYiIH0sCi0gIHsgImltYWdlL2pwZWciLCAianBlZyxqcGciIH0sCi0gIHsgImltYWdlL3dlYnAiLCAid2VicCIgfSwKLSAgeyAiaW1hZ2UvcG5nIiwgInBuZyIgfSwKLSAgeyAidmlkZW8vbXA0IiwgIm1wNCxtNHYiIH0sCi0gIHsgImF1ZGlvL3gtbTRhIiwgIm00YSIgfSwKLSAgeyAiYXVkaW8vbXAzIiwgIm1wMyIgfSwKLSAgeyAidmlkZW8vb2dnIiwgIm9ndixvZ20iIH0sCi0gIHsgImF1ZGlvL29nZyIsICJvZ2csb2dhIiB9LAotICB7ICJ2aWRlby93ZWJtIiwgIndlYm0iIH0sCi0gIHsgImF1ZGlvL3dlYm0iLCAid2VibSIgfSwKLSAgeyAiYXVkaW8vd2F2IiwgIndhdiIgfSwKLSAgeyAiYXBwbGljYXRpb24veGh0bWwreG1sIiwgInhodG1sLHhodCIgfSwKLSAgeyAiYXBwbGljYXRpb24veC1jaHJvbWUtZXh0ZW5zaW9uIiwgImNyeCIgfSwKLSAgeyAibXVsdGlwYXJ0L3JlbGF0ZWQiLCAibWh0bWwsbWh0IiB9Ci19OwotCi1zdGF0aWMgY29uc3QgTWltZUluZm8gc2Vjb25kYXJ5X21hcHBpbmdzW10gPSB7Ci0gIHsgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIsICJleGUsY29tLGJpbiIgfSwKLSAgeyAiYXBwbGljYXRpb24vZ3ppcCIsICJneiIgfSwKLSAgeyAiYXBwbGljYXRpb24vcGRmIiwgInBkZiIgfSwKLSAgeyAiYXBwbGljYXRpb24vcG9zdHNjcmlwdCIsICJwcyxlcHMsYWkiIH0sCi0gIHsgImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIsICJqcyIgfSwKLSAgeyAiYXBwbGljYXRpb24veC1mb250LXdvZmYiLCAid29mZiIgfSwKLSAgeyAiaW1hZ2UvYm1wIiwgImJtcCIgfSwKLSAgeyAiaW1hZ2UveC1pY29uIiwgImljbyIgfSwKLSAgeyAiaW1hZ2UvanBlZyIsICJqZmlmLHBqcGVnLHBqcCIgfSwKLSAgeyAiaW1hZ2UvdGlmZiIsICJ0aWZmLHRpZiIgfSwKLSAgeyAiaW1hZ2UveC14Yml0bWFwIiwgInhibSIgfSwKLSAgeyAiaW1hZ2Uvc3ZnK3htbCIsICJzdmcsc3ZneiIgfSwKLSAgeyAibWVzc2FnZS9yZmM4MjIiLCAiZW1sIiB9LAotICB7ICJ0ZXh0L3BsYWluIiwgInR4dCx0ZXh0IiB9LAotICB7ICJ0ZXh0L2h0bWwiLCAic2h0bWwsZWh0bWwiIH0sCi0gIHsgImFwcGxpY2F0aW9uL3Jzcyt4bWwiLCAicnNzIiB9LAotICB7ICJhcHBsaWNhdGlvbi9yZGYreG1sIiwgInJkZiIgfSwKLSAgeyAidGV4dC94bWwiLCAieHNsLHhibCIgfSwKLSAgeyAiYXBwbGljYXRpb24vdm5kLm1vemlsbGEueHVsK3htbCIsICJ4dWwiIH0sCi0gIHsgImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIiwgInN3Zixzd2wiIH0sCi0gIHsgImFwcGxpY2F0aW9uL3BrY3M3LW1pbWUiLCAicDdtLHA3YyxwN3oiIH0sCi0gIHsgImFwcGxpY2F0aW9uL3BrY3M3LXNpZ25hdHVyZSIsICJwN3MiIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBGaW5kTWltZVR5cGUoY29uc3QgTWltZUluZm8qIG1hcHBpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWFwcGluZ3NfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHQpIHsKLSAgc2l6ZV90IGV4dF9sZW4gPSBzdHJsZW4oZXh0KTsKLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hcHBpbmdzX2xlbjsgKytpKSB7Ci0gICAgY29uc3QgY2hhciogZXh0ZW5zaW9ucyA9IG1hcHBpbmdzW2ldLmV4dGVuc2lvbnM7Ci0gICAgZm9yICg7OykgewotICAgICAgc2l6ZV90IGVuZF9wb3MgPSBzdHJjc3BuKGV4dGVuc2lvbnMsICIsIik7Ci0gICAgICBpZiAoZW5kX3BvcyA9PSBleHRfbGVuICYmCi0gICAgICAgICAgYmFzZTo6c3RybmNhc2VjbXAoZXh0ZW5zaW9ucywgZXh0LCBleHRfbGVuKSA9PSAwKQotICAgICAgICByZXR1cm4gbWFwcGluZ3NbaV0ubWltZV90eXBlOwotICAgICAgZXh0ZW5zaW9ucyArPSBlbmRfcG9zOwotICAgICAgaWYgKCEqZXh0ZW5zaW9ucykKLSAgICAgICAgYnJlYWs7Ci0gICAgICBleHRlbnNpb25zICs9IDE7ICAvLyBza2lwIG92ZXIgY29tbWEKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLWJvb2wgTWltZVV0aWw6OkdldE1pbWVUeXBlRnJvbUV4dGVuc2lvbihjb25zdCBGaWxlUGF0aDo6U3RyaW5nVHlwZSYgZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogcmVzdWx0KSBjb25zdCB7Ci0gIHJldHVybiBHZXRNaW1lVHlwZUZyb21FeHRlbnNpb25IZWxwZXIoZXh0LCB0cnVlLCByZXN1bHQpOwotfQotCi1ib29sIE1pbWVVdGlsOjpHZXRXZWxsS25vd25NaW1lVHlwZUZyb21FeHRlbnNpb24oCi0gICAgY29uc3QgRmlsZVBhdGg6OlN0cmluZ1R5cGUmIGV4dCwKLSAgICBzdHJpbmcqIHJlc3VsdCkgY29uc3QgewotICByZXR1cm4gR2V0TWltZVR5cGVGcm9tRXh0ZW5zaW9uSGVscGVyKGV4dCwgZmFsc2UsIHJlc3VsdCk7Ci19Ci0KLWJvb2wgTWltZVV0aWw6OkdldE1pbWVUeXBlRnJvbUZpbGUoY29uc3QgRmlsZVBhdGgmIGZpbGVfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiByZXN1bHQpIGNvbnN0IHsKLSAgRmlsZVBhdGg6OlN0cmluZ1R5cGUgZmlsZV9uYW1lX3N0ciA9IGZpbGVfcGF0aC5FeHRlbnNpb24oKTsKLSAgaWYgKGZpbGVfbmFtZV9zdHIuZW1wdHkoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiBHZXRNaW1lVHlwZUZyb21FeHRlbnNpb24oZmlsZV9uYW1lX3N0ci5zdWJzdHIoMSksIHJlc3VsdCk7Ci19Ci0KLWJvb2wgTWltZVV0aWw6OkdldE1pbWVUeXBlRnJvbUV4dGVuc2lvbkhlbHBlcihjb25zdCBGaWxlUGF0aDo6U3RyaW5nVHlwZSYgZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV9wbGF0Zm9ybV90eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIHJlc3VsdCkgY29uc3QgewotICAvLyBBdm9pZHMgY3Jhc2ggd2hlbiB1bmFibGUgdG8gaGFuZGxlIGEgbG9uZyBmaWxlIHBhdGguIFNlZSBjcmJ1Zy5jb20vNDg3MzMuCi0gIGNvbnN0IHVuc2lnbmVkIGtNYXhGaWxlUGF0aFNpemUgPSA2NTUzNjsKLSAgaWYgKGV4dC5sZW5ndGgoKSA+IGtNYXhGaWxlUGF0aFNpemUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8vIFdlIGltcGxlbWVudCB0aGUgc2FtZSBhbGdvcml0aG0gYXMgTW96aWxsYSBmb3IgbWFwcGluZyBhIGZpbGUgZXh0ZW5zaW9uIHRvCi0gIC8vIGEgbWltZSB0eXBlLiAgVGhhdCBpcywgd2UgZmlyc3QgY2hlY2sgYSBoYXJkLWNvZGVkIGxpc3QgKHRoYXQgY2Fubm90IGJlCi0gIC8vIG92ZXJyaWRkZW4pLCBhbmQgdGhlbiBpZiBub3QgZm91bmQgdGhlcmUsIHdlIGRlZmVyIHRvIHRoZSBzeXN0ZW0gcmVnaXN0cnkuCi0gIC8vIEZpbmFsbHksIHdlIHNjYW4gYSBzZWNvbmRhcnkgaGFyZC1jb2RlZCBsaXN0IHRvIGNhdGNoIHR5cGVzIHRoYXQgd2UgY2FuCi0gIC8vIGRlZHVjZSBidXQgdGhhdCB3ZSBhbHNvIHdhbnQgdG8gYWxsb3cgdGhlIE9TIHRvIG92ZXJyaWRlLgotCi0jaWYgZGVmaW5lZChPU19XSU4pCi0gIHN0cmluZyBleHRfbmFycm93X3N0ciA9IFdpZGVUb1VURjgoZXh0KTsKLSNlbGlmIGRlZmluZWQoT1NfUE9TSVgpIHx8IGRlZmluZWQoT1NfU1RBUkJPQVJEKQotICBjb25zdCBzdHJpbmcmIGV4dF9uYXJyb3dfc3RyID0gZXh0OwotI2VuZGlmCi0gIGNvbnN0IGNoYXIqIG1pbWVfdHlwZTsKLQotICBtaW1lX3R5cGUgPSBGaW5kTWltZVR5cGUocHJpbWFyeV9tYXBwaW5ncywgYXJyYXlzaXplKHByaW1hcnlfbWFwcGluZ3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0X25hcnJvd19zdHIuY19zdHIoKSk7Ci0gIGlmIChtaW1lX3R5cGUpIHsKLSAgICAqcmVzdWx0ID0gbWltZV90eXBlOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgbWltZV90eXBlID0gRmluZE1pbWVUeXBlKHNlY29uZGFyeV9tYXBwaW5ncywgYXJyYXlzaXplKHNlY29uZGFyeV9tYXBwaW5ncyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBleHRfbmFycm93X3N0ci5jX3N0cigpKTsKLSAgaWYgKG1pbWVfdHlwZSkgewotICAgICpyZXN1bHQgPSBtaW1lX3R5cGU7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIEZyb20gV2ViS2l0J3MgV2ViQ29yZS9wbGF0Zm9ybS9NSU1FVHlwZVJlZ2lzdHJ5LmNwcDoKLQotc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IHN1cHBvcnRlZF9pbWFnZV90eXBlc1tdID0gewotICAiaW1hZ2UvanBlZyIsCi0gICJpbWFnZS9wanBlZyIsCi0gICJpbWFnZS9qcGciLAotICAiaW1hZ2Uvd2VicCIsCi0gICJpbWFnZS9wbmciLAotICAiaW1hZ2UvZ2lmIiwKLSAgImltYWdlL2JtcCIsCi0gICJpbWFnZS94LWljb24iLCAgICAvLyBpY28KLSAgImltYWdlL3gteGJpdG1hcCIgIC8vIHhibQotfTsKLQotLy8gQSBsaXN0IG9mIG1lZGlhIHR5cGVzOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0ludGVybmV0X21lZGlhX3R5cGUKLS8vIEEgY29tcHJlaGVuc2l2ZSBtaW1lIHR5cGUgbGlzdDogaHR0cDovL3BsdWdpbmRvYy5tb3pkZXYub3JnL3dpbm1pbWUucGhwCi0vLyBUaGlzIHNldCBvZiBjb2RlY3MgaXMgc3VwcG9ydGVkIGJ5IGFsbCB2YXJpYXRpb25zIG9mIENocm9taXVtLgotc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGNvbW1vbl9tZWRpYV90eXBlc1tdID0gewotI2lmICFkZWZpbmVkKF9fTEJfU0hFTExfXykgJiYgIWRlZmluZWQoQ09CQUxUKQotICAvLyBPZ2cuCi0gICJhdWRpby9vZ2ciLAotICAiYXBwbGljYXRpb24vb2dnIiwKLSNpZiBkZWZpbmVkKEVOQUJMRV9NRURJQV9DT0RFQ19USEVPUkEpCi0gICJ2aWRlby9vZ2ciLAotI2VuZGlmCi0KLSAgLy8gV2ViTS4KLSAgInZpZGVvL3dlYm0iLAotICAiYXVkaW8vd2VibSIsCi0KLSAgLy8gV2F2LgotICAiYXVkaW8vd2F2IiwKLSAgImF1ZGlvL3gtd2F2IiwKLSNlbHNlICAvLyAhZGVmaW5lZChfX0xCX1NIRUxMX18pICYmICFkZWZpbmVkKENPQkFMVCkKLQotI2lmIGRlZmluZWQoT1NfU1RBUkJPQVJEKQotI2lmIFNCX0hBUyhNRURJQV9XRUJNX1ZQOV9TVVBQT1JUKQotICAgIC8vIFdlYk0uCi0gICAgInZpZGVvL3dlYm0iLAotI2VuZGlmICAvLyBTQl9IQVMoTUVESUFfV0VCTV9WUDlfU1VQUE9SVCkKLSNlbmRpZiAgLy8gZGVmaW5lZChPU19TVEFSQk9BUkQpCi0KLSAgICAvLyBjdXJyZW50bHkgbGJzaGVsbCBzdXBwb3J0cyBmbHYgYW5kIG1wNAotICAgICJ2aWRlby9tcDQiLCAiYXVkaW8vbXA0IiwgInZpZGVvL3gtZmx2IiwKLSNlbmRpZiAgLy8gIWRlZmluZWQoX19MQl9TSEVMTF9fKSAmJiAhZGVmaW5lZChDT0JBTFQpCi19OwotCi0vLyBMaXN0IG9mIHByb3ByaWV0YXJ5IHR5cGVzIG9ubHkgc3VwcG9ydGVkIGJ5IEdvb2dsZSBDaHJvbWUuCi1zdGF0aWMgY29uc3QgY2hhciogY29uc3QgcHJvcHJpZXRhcnlfbWVkaWFfdHlwZXNbXSA9IHsKLSAgLy8gTVBFRy00LgotICAidmlkZW8vbXA0IiwKLSAgInZpZGVvL3gtbTR2IiwKLSAgImF1ZGlvL21wNCIsCi0gICJhdWRpby94LW00YSIsCi0KLSAgLy8gTVAzLgotICAiYXVkaW8vbXAzIiwKLSAgImF1ZGlvL3gtbXAzIiwKLSAgImF1ZGlvL21wZWciLAotfTsKLQotLy8gTGlzdCBvZiBzdXBwb3J0ZWQgY29kZWNzIHdoZW4gcGFzc2VkIGluIHdpdGggPHNvdXJjZSB0eXBlPSIuLi4iPi4KLS8vIFRoaXMgc2V0IG9mIGNvZGVjcyBpcyBzdXBwb3J0ZWQgYnkgYWxsIHZhcmlhdGlvbnMgb2YgQ2hyb21pdW0uCi0vLwotLy8gUmVmZXIgdG8gaHR0cDovL3dpa2kud2hhdHdnLm9yZy93aWtpL1ZpZGVvX3R5cGVfcGFyYW1ldGVycyNCcm93c2VyX1N1cHBvcnQKLS8vIGZvciBtb3JlIGluZm9ybWF0aW9uLgotLy8KLS8vIFRoZSBjb2RlY3MgZm9yIFdBViBhcmUgaW50ZWdlcnMgYXMgZGVmaW5lZCBpbiBBcHBlbmRpeCBBIG9mIFJGQzIzNjE6Ci0vLyBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyMzYxCi1zdGF0aWMgY29uc3QgY2hhciogY29uc3QgY29tbW9uX21lZGlhX2NvZGVjc1tdID0gewotI2lmICFkZWZpbmVkKF9fTEJfU0hFTExfXykgJiYgIWRlZmluZWQoQ09CQUxUKQotI2lmIGRlZmluZWQoRU5BQkxFX01FRElBX0NPREVDX1RIRU9SQSkKLSAgInRoZW9yYSIsCi0jZW5kaWYKLSAgInZvcmJpcyIsCi0gICJ2cDgiLAotICAiMSIgIC8vIFdBVkVfRk9STUFUX1BDTS4KLSNlbHNlICAvLyAhZGVmaW5lZChfX0xCX1NIRUxMX18pICYmICFkZWZpbmVkKENPQkFMVCkKLQotI2lmIGRlZmluZWQoT1NfU1RBUkJPQVJEKQotI2lmIFNCX0hBUyhNRURJQV9XRUJNX1ZQOV9TVVBQT1JUKQotICAgICJ2cDkiLAotI2VuZGlmICAvLyBTQl9IQVMoTUVESUFfV0VCTV9WUDlfU1VQUE9SVCkKLSNlbmRpZiAgLy8gZGVmaW5lZChPU19TVEFSQk9BUkQpCi0KLSAgICAiYXZjMSIsCi0gICAgIm1wNGEiLAotICAgICJhYWM1MSIsCi0KLSNlbmRpZiAgLy8gIWRlZmluZWQoX19MQl9TSEVMTF9fKSAmJiAhZGVmaW5lZChDT0JBTFQpCi19OwotCi0vLyBMaXN0IG9mIHByb3ByaWV0YXJ5IGNvZGVjcyBvbmx5IHN1cHBvcnRlZCBieSBHb29nbGUgQ2hyb21lLgotc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IHByb3ByaWV0YXJ5X21lZGlhX2NvZGVjc1tdID0gewotICAiYXZjMSIsCi0gICJtcDRhIgotfTsKLQotLy8gTm90ZTogZG9lcyBub3QgaW5jbHVkZSBqYXZhc2NyaXB0IHR5cGVzIGxpc3QgKHNlZSBzdXBwb3J0ZWRfamF2YXNjcmlwdF90eXBlcykKLXN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBzdXBwb3J0ZWRfbm9uX2ltYWdlX3R5cGVzW10gPSB7Ci0gICJ0ZXh0L2NhY2hlLW1hbmlmZXN0IiwKLSAgInRleHQvaHRtbCIsCi0gICJ0ZXh0L3htbCIsCi0gICJ0ZXh0L3hzbCIsCi0gICJ0ZXh0L3BsYWluIiwKLSAgLy8gTWFueSB1c2VycyBjb21wbGFpbmVkIGFib3V0IGNzcyBmaWxlcyBzZXJ2ZWQgZm9yCi0gIC8vIGRvd25sb2FkIGluc3RlYWQgb2YgZGlzcGxheWluZyBpbiB0aGUgYnJvd3NlcjoKLSAgLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NzE5MgotICAvLyBTbywgYnkgaW5jbHVkaW5nICJ0ZXh0L2NzcyIgaW50byB0aGlzIGxpc3Qgd2UgY2hvb3NlIEZpcmVmb3gKLSAgLy8gYmVoYXZpb3IgLSBjc3MgZmlsZXMgd2lsbCBiZSBkaXNwbGF5ZWQ6Ci0gICJ0ZXh0L2NzcyIsCi0gICJ0ZXh0L3ZuZC5jaHJvbWl1bS5mdHAtZGlyIiwKLSAgInRleHQvIiwKLSAgImltYWdlL3N2Zyt4bWwiLCAgLy8gU1ZHIGlzIHRleHQtYmFzZWQgWE1MLCBldmVuIHRob3VnaCBpdCBoYXMgYW4gaW1hZ2UvIHR5cGUKLSAgImFwcGxpY2F0aW9uL3htbCIsCi0gICJhcHBsaWNhdGlvbi9hdG9tK3htbCIsCi0gICJhcHBsaWNhdGlvbi9yc3MreG1sIiwKLSAgImFwcGxpY2F0aW9uL3hodG1sK3htbCIsCi0gICJhcHBsaWNhdGlvbi9qc29uIiwKLSAgIm11bHRpcGFydC9yZWxhdGVkIiwgIC8vIEZvciBNSFRNTCBzdXBwb3J0LgotICAibXVsdGlwYXJ0L3gtbWl4ZWQtcmVwbGFjZSIKLSAgLy8gTm90ZTogQURESU5HIGEgbmV3IHR5cGUgaGVyZSB3aWxsIHByb2JhYmx5IHJlbmRlciBpdCBBUyBIVE1MLiBUaGlzIGNhbgotICAvLyByZXN1bHQgaW4gY3Jvc3Mgc2l0ZSBzY3JpcHRpbmcuCi19OwotCi0vLyBEaWN0aW9uYXJ5IG9mIGNyeXB0b2dyYXBoaWMgZmlsZSBtaW1lIHR5cGVzLgotc3RydWN0IENlcnRpZmljYXRlTWltZVR5cGVJbmZvIHsKLSAgY29uc3QgY2hhciogbWltZV90eXBlOwotICBDZXJ0aWZpY2F0ZU1pbWVUeXBlIGNlcnRfdHlwZTsKLX07Ci0KLXN0YXRpYyBjb25zdCBDZXJ0aWZpY2F0ZU1pbWVUeXBlSW5mbyBzdXBwb3J0ZWRfY2VydGlmaWNhdGVfdHlwZXNbXSA9IHsKLSAgeyAiYXBwbGljYXRpb24veC14NTA5LXVzZXItY2VydCIsCi0gICAgICBDRVJUSUZJQ0FURV9NSU1FX1RZUEVfWDUwOV9VU0VSX0NFUlQgfSwKLSNpZiBkZWZpbmVkKE9TX0FORFJPSUQpCi0gIHsgImFwcGxpY2F0aW9uL3gteDUwOS1jYS1jZXJ0IiwgQ0VSVElGSUNBVEVfTUlNRV9UWVBFX1g1MDlfQ0FfQ0VSVCB9LAotICB7ICJhcHBsaWNhdGlvbi94LXBrY3MxMiIsIENFUlRJRklDQVRFX01JTUVfVFlQRV9QS0NTMTJfQVJDSElWRSB9LAotI2VuZGlmCi19OwotCi0vLyBUaGVzZSB0eXBlcyBhcmUgZXhjbHVkZWQgZnJvbSB0aGUgbG9naWMgdGhhdCBhbGxvd3MgYWxsIHRleHQvIHR5cGVzIGJlY2F1c2UKLS8vIHdoaWxlIHRoZXkgYXJlIHRlY2huaWNhbGx5IHRleHQsIGl0J3MgdmVyeSB1bmxpa2VseSB0aGF0IGEgdXNlciBleHBlY3RzIHRvCi0vLyBzZWUgdGhlbSByZW5kZXJlZCBpbiB0ZXh0IGZvcm0uCi1zdGF0aWMgY29uc3QgY2hhciogY29uc3QgdW5zdXBwb3J0ZWRfdGV4dF90eXBlc1tdID0gewotICAidGV4dC9jYWxlbmRhciIsCi0gICJ0ZXh0L3gtY2FsZW5kYXIiLAotICAidGV4dC94LXZjYWxlbmRhciIsCi0gICJ0ZXh0L3ZjYWxlbmRhciIsCi0gICJ0ZXh0L3ZjYXJkIiwKLSAgInRleHQveC12Y2FyZCIsCi0gICJ0ZXh0L2RpcmVjdG9yeSIsCi0gICJ0ZXh0L2xkaWYiLAotICAidGV4dC9xaWYiLAotICAidGV4dC94LXFpZiIsCi0gICJ0ZXh0L3gtY3N2IiwKLSAgInRleHQveC12Y2YiLAotICAidGV4dC9ydGYiLAotICAidGV4dC9jb21tYS1zZXBhcmF0ZWQtdmFsdWVzIiwKLSAgInRleHQvY3N2IiwKLSAgInRleHQvdGFiLXNlcGFyYXRlZC12YWx1ZXMiLAotICAidGV4dC90c3YiLAotfTsKLQotLy8gIE1vemlsbGEgMS44IGFuZCBXaW5JRSA3IGJvdGggYWNjZXB0IHRleHQvamF2YXNjcmlwdCBhbmQgdGV4dC9lY21hc2NyaXB0LgotLy8gIE1vemlsbGEgMS44IGFjY2VwdHMgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYW5kCi0vLyBhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQsIGJ1dCBXaW5JRSA3IGRvZXNuJ3QuCi0vLyAgV2luSUUgNyBhY2NlcHRzIHRleHQvamF2YXNjcmlwdDEuMSAtIHRleHQvamF2YXNjcmlwdDEuMywgdGV4dC9qc2NyaXB0LCBhbmQKLS8vIHRleHQvbGl2ZXNjcmlwdCwgYnV0IE1vemlsbGEgMS44IGRvZXNuJ3QuCi0vLyAgTW96aWxsYSAxLjggYWxsb3dzIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGJ1dCBXaW5JRSA3IGRvZXNuJ3QuCi0vLyAgTW96aWxsYSAxLjggYW5kIFdpbklFIDcgYm90aCBhY2NlcHQgdGhlIGVtcHR5IHN0cmluZywgYnV0IG5laXRoZXIgYWNjZXB0IGEKLS8vIHdoaXRlc3BhY2Utb25seSBzdHJpbmcuCi0vLyAgV2Ugd2FudCB0byBhY2NlcHQgYWxsIHRoZSB2YWx1ZXMgdGhhdCBlaXRoZXIgb2YgdGhlc2UgYnJvd3NlcnMgYWNjZXB0LCBidXQKLS8vIG5vdCBvdGhlciB2YWx1ZXMuCi1zdGF0aWMgY29uc3QgY2hhciogY29uc3Qgc3VwcG9ydGVkX2phdmFzY3JpcHRfdHlwZXNbXSA9IHsKLSAgInRleHQvamF2YXNjcmlwdCIsCi0gICJ0ZXh0L2VjbWFzY3JpcHQiLAotICAiYXBwbGljYXRpb24vamF2YXNjcmlwdCIsCi0gICJhcHBsaWNhdGlvbi9lY21hc2NyaXB0IiwKLSAgImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIsCi0gICJ0ZXh0L2phdmFzY3JpcHQxLjEiLAotICAidGV4dC9qYXZhc2NyaXB0MS4yIiwKLSAgInRleHQvamF2YXNjcmlwdDEuMyIsCi0gICJ0ZXh0L2pzY3JpcHQiLAotICAidGV4dC9saXZlc2NyaXB0IgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IHZpZXdfc291cmNlX3R5cGVzW10gPSB7Ci0gICJ0ZXh0L3htbCIsCi0gICJ0ZXh0L3hzbCIsCi0gICJhcHBsaWNhdGlvbi94bWwiLAotICAiYXBwbGljYXRpb24vcnNzK3htbCIsCi0gICJhcHBsaWNhdGlvbi9hdG9tK3htbCIsCi0gICJpbWFnZS9zdmcreG1sIgotfTsKLQotc3RydWN0IE1lZGlhRm9ybWF0U3RyaWN0IHsKLSAgY29uc3QgY2hhciogbWltZV90eXBlOwotICBjb25zdCBjaGFyKiBjb2RlY3NfbGlzdDsKLX07Ci0KLXN0YXRpYyBjb25zdCBNZWRpYUZvcm1hdFN0cmljdCBmb3JtYXRfY29kZWNfbWFwcGluZ3NbXSA9IHsKLSNpZiBkZWZpbmVkKF9fTEJfQU5EUk9JRF9fKSAgLy8gQXNzdW1lIEFuZHJvaWQgc3VwcG9ydHMgZXZlcnl0aGluZy4KLSAgeyAidmlkZW8vd2VibSIsICJ2b3JiaXMsdnA4LHZwOC4wLHZwOSIgfSwKLSAgeyAiYXVkaW8vd2VibSIsICJ2b3JiaXMiIH0sCi0jZWxpZiBkZWZpbmVkKE9TX1NUQVJCT0FSRCkKLSNpZiBTQl9IQVMoTUVESUFfV0VCTV9WUDlfU1VQUE9SVCkKLSAgeyJ2aWRlby93ZWJtIiwgInZwOSJ9LAotICB7ImF1ZGlvL3dlYm0iLCAiIn0sCi0jZWxzZSAgLy8gU0JfSEFTKE1FRElBX1dFQk1fVlA5X1NVUFBPUlQpCi0gIHsidmlkZW8vd2VibSIsICIifSwKLSAgeyJhdWRpby93ZWJtIiwgIiJ9LAotI2VuZGlmICAvLyBTQl9IQVMoTUVESUFfV0VCTV9WUDlfU1VQUE9SVCkKLSNlbGlmIGRlZmluZWQoX19MQl9TSEVMTF9fKSB8fCBkZWZpbmVkKENPQkFMVCkKLSAgLy8gTm8gb3RoZXIgcGxhdGZvcm1zIHN1cHBvcnQgd2VibS4KLSAgeyAidmlkZW8vd2VibSIsICIiIH0sCi0gIHsgImF1ZGlvL3dlYm0iLCAiIiB9LAotI2Vsc2UgIC8vIERlZmF1bHQgQ2hyb21lIGNvZGVjIG1hcHBpbmdzLgotICB7ICJ2aWRlby93ZWJtIiwgInZvcmJpcyx2cDgsdnA4LjAiIH0sCi0gIHsgImF1ZGlvL3dlYm0iLCAidm9yYmlzIiB9LAotICB7ICJhdWRpby93YXYiLCAiMSIgfQotI2VuZGlmCi19OwotCi1NaW1lVXRpbDo6TWltZVV0aWwoKSB7Ci0gIEluaXRpYWxpemVNaW1lVHlwZU1hcHMoKTsKLX0KLQotLy8gc3RhdGljCi1ib29sIE1pbWVVdGlsOjpBcmVTdXBwb3J0ZWRDb2RlY3MoY29uc3QgTWltZU1hcHBpbmdzJiBzdXBwb3J0ZWRfY29kZWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY29kZWNzKSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29kZWNzLnNpemUoKTsgKytpKSB7Ci0gICAgaWYgKHN1cHBvcnRlZF9jb2RlY3MuZmluZChjb2RlY3NbaV0pID09IHN1cHBvcnRlZF9jb2RlY3MuZW5kKCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuICFjb2RlY3MuZW1wdHkoKTsKLX0KLQotdm9pZCBNaW1lVXRpbDo6SW5pdGlhbGl6ZU1pbWVUeXBlTWFwcygpIHsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheXNpemUoc3VwcG9ydGVkX2ltYWdlX3R5cGVzKTsgKytpKQotICAgIGltYWdlX21hcF8uaW5zZXJ0KHN1cHBvcnRlZF9pbWFnZV90eXBlc1tpXSk7Ci0KLSAgLy8gSW5pdGlhbGl6ZSB0aGUgc3VwcG9ydGVkIG5vbi1pbWFnZSB0eXBlcy4KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheXNpemUoc3VwcG9ydGVkX25vbl9pbWFnZV90eXBlcyk7ICsraSkKLSAgICBub25faW1hZ2VfbWFwXy5pbnNlcnQoc3VwcG9ydGVkX25vbl9pbWFnZV90eXBlc1tpXSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJyYXlzaXplKHN1cHBvcnRlZF9jZXJ0aWZpY2F0ZV90eXBlcyk7ICsraSkKLSAgICBub25faW1hZ2VfbWFwXy5pbnNlcnQoc3VwcG9ydGVkX2NlcnRpZmljYXRlX3R5cGVzW2ldLm1pbWVfdHlwZSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJyYXlzaXplKHVuc3VwcG9ydGVkX3RleHRfdHlwZXMpOyArK2kpCi0gICAgdW5zdXBwb3J0ZWRfdGV4dF9tYXBfLmluc2VydCh1bnN1cHBvcnRlZF90ZXh0X3R5cGVzW2ldKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheXNpemUoc3VwcG9ydGVkX2phdmFzY3JpcHRfdHlwZXMpOyArK2kpCi0gICAgbm9uX2ltYWdlX21hcF8uaW5zZXJ0KHN1cHBvcnRlZF9qYXZhc2NyaXB0X3R5cGVzW2ldKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheXNpemUoY29tbW9uX21lZGlhX3R5cGVzKTsgKytpKQotICAgIG5vbl9pbWFnZV9tYXBfLmluc2VydChjb21tb25fbWVkaWFfdHlwZXNbaV0pOwotI2lmIGRlZmluZWQoR09PR0xFX0NIUk9NRV9CVUlMRCkgfHwgZGVmaW5lZChVU0VfUFJPUFJJRVRBUllfQ09ERUNTKQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFycmF5c2l6ZShwcm9wcmlldGFyeV9tZWRpYV90eXBlcyk7ICsraSkKLSAgICBub25faW1hZ2VfbWFwXy5pbnNlcnQocHJvcHJpZXRhcnlfbWVkaWFfdHlwZXNbaV0pOwotI2VuZGlmCi0KLSAgLy8gSW5pdGlhbGl6ZSB0aGUgc3VwcG9ydGVkIG1lZGlhIHR5cGVzLgotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFycmF5c2l6ZShjb21tb25fbWVkaWFfdHlwZXMpOyArK2kpCi0gICAgbWVkaWFfbWFwXy5pbnNlcnQoY29tbW9uX21lZGlhX3R5cGVzW2ldKTsKLSNpZiBkZWZpbmVkKEdPT0dMRV9DSFJPTUVfQlVJTEQpIHx8IGRlZmluZWQoVVNFX1BST1BSSUVUQVJZX0NPREVDUykKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheXNpemUocHJvcHJpZXRhcnlfbWVkaWFfdHlwZXMpOyArK2kpCi0gICAgbWVkaWFfbWFwXy5pbnNlcnQocHJvcHJpZXRhcnlfbWVkaWFfdHlwZXNbaV0pOwotI2VuZGlmCi0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheXNpemUoc3VwcG9ydGVkX2phdmFzY3JpcHRfdHlwZXMpOyArK2kpCi0gICAgamF2YXNjcmlwdF9tYXBfLmluc2VydChzdXBwb3J0ZWRfamF2YXNjcmlwdF90eXBlc1tpXSk7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheXNpemUodmlld19zb3VyY2VfdHlwZXMpOyArK2kpCi0gICAgdmlld19zb3VyY2VfbWFwXy5pbnNlcnQodmlld19zb3VyY2VfdHlwZXNbaV0pOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJyYXlzaXplKGNvbW1vbl9tZWRpYV9jb2RlY3MpOyArK2kpCi0gICAgY29kZWNzX21hcF8uaW5zZXJ0KGNvbW1vbl9tZWRpYV9jb2RlY3NbaV0pOwotI2lmIGRlZmluZWQoR09PR0xFX0NIUk9NRV9CVUlMRCkgfHwgZGVmaW5lZChVU0VfUFJPUFJJRVRBUllfQ09ERUNTKQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFycmF5c2l6ZShwcm9wcmlldGFyeV9tZWRpYV9jb2RlY3MpOyArK2kpCi0gICAgY29kZWNzX21hcF8uaW5zZXJ0KHByb3ByaWV0YXJ5X21lZGlhX2NvZGVjc1tpXSk7Ci0jZW5kaWYKLQotICAvLyBJbml0aWFsaXplIHRoZSBzdHJpY3Qgc3VwcG9ydGVkIG1lZGlhIHR5cGVzLgotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFycmF5c2l6ZShmb3JtYXRfY29kZWNfbWFwcGluZ3MpOyArK2kpIHsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbWltZV90eXBlX2NvZGVjczsKLSAgICBQYXJzZUNvZGVjU3RyaW5nKGZvcm1hdF9jb2RlY19tYXBwaW5nc1tpXS5jb2RlY3NfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICZtaW1lX3R5cGVfY29kZWNzLAotICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotCi0gICAgTWltZU1hcHBpbmdzIGNvZGVjczsKLSAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1pbWVfdHlwZV9jb2RlY3Muc2l6ZSgpOyArK2opCi0gICAgICBjb2RlY3MuaW5zZXJ0KG1pbWVfdHlwZV9jb2RlY3Nbal0pOwotICAgIHN0cmljdF9mb3JtYXRfbWFwX1tmb3JtYXRfY29kZWNfbWFwcGluZ3NbaV0ubWltZV90eXBlXSA9IGNvZGVjczsKLSAgfQotfQotCi1ib29sIE1pbWVVdGlsOjpJc1N1cHBvcnRlZEltYWdlTWltZVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZSkgY29uc3QgewotICByZXR1cm4gaW1hZ2VfbWFwXy5maW5kKG1pbWVfdHlwZSkgIT0gaW1hZ2VfbWFwXy5lbmQoKTsKLX0KLQotYm9vbCBNaW1lVXRpbDo6SXNTdXBwb3J0ZWRNZWRpYU1pbWVUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lX3R5cGUpIGNvbnN0IHsKLSAgcmV0dXJuIG1lZGlhX21hcF8uZmluZChtaW1lX3R5cGUpICE9IG1lZGlhX21hcF8uZW5kKCk7Ci19Ci0KLWJvb2wgTWltZVV0aWw6OklzU3VwcG9ydGVkTm9uSW1hZ2VNaW1lVHlwZShjb25zdCBzdGQ6OnN0cmluZyYgbWltZV90eXBlKSBjb25zdCB7Ci0gIHJldHVybiBub25faW1hZ2VfbWFwXy5maW5kKG1pbWVfdHlwZSkgIT0gbm9uX2ltYWdlX21hcF8uZW5kKCkgfHwKLSAgICAgIChtaW1lX3R5cGUuY29tcGFyZSgwLCA1LCAidGV4dC8iKSA9PSAwICYmCi0gICAgICAgIUlzVW5zdXBwb3J0ZWRUZXh0TWltZVR5cGUobWltZV90eXBlKSk7Ci19Ci0KLWJvb2wgTWltZVV0aWw6OklzVW5zdXBwb3J0ZWRUZXh0TWltZVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZSkgY29uc3QgewotICByZXR1cm4gdW5zdXBwb3J0ZWRfdGV4dF9tYXBfLmZpbmQobWltZV90eXBlKSAhPSB1bnN1cHBvcnRlZF90ZXh0X21hcF8uZW5kKCk7Ci19Ci0KLWJvb2wgTWltZVV0aWw6OklzU3VwcG9ydGVkSmF2YXNjcmlwdE1pbWVUeXBlKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lX3R5cGUpIGNvbnN0IHsKLSAgcmV0dXJuIGphdmFzY3JpcHRfbWFwXy5maW5kKG1pbWVfdHlwZSkgIT0gamF2YXNjcmlwdF9tYXBfLmVuZCgpOwotfQotCi1ib29sIE1pbWVVdGlsOjpJc1ZpZXdTb3VyY2VNaW1lVHlwZShjb25zdCBzdGQ6OnN0cmluZyYgbWltZV90eXBlKSBjb25zdCB7Ci0gIHJldHVybiB2aWV3X3NvdXJjZV9tYXBfLmZpbmQobWltZV90eXBlKSAhPSB2aWV3X3NvdXJjZV9tYXBfLmVuZCgpOwotfQotCi0vLyBNaXJyb3JzIFdlYlZpZXdJbXBsOjpDYW5TaG93TUlNRVR5cGUoKQotYm9vbCBNaW1lVXRpbDo6SXNTdXBwb3J0ZWRNaW1lVHlwZShjb25zdCBzdGQ6OnN0cmluZyYgbWltZV90eXBlKSBjb25zdCB7Ci0gIHJldHVybiAobWltZV90eXBlLmNvbXBhcmUoMCwgNiwgImltYWdlLyIpID09IDAgJiYKLSAgICAgICAgICBJc1N1cHBvcnRlZEltYWdlTWltZVR5cGUobWltZV90eXBlKSkgfHwKLSAgICAgICAgIElzU3VwcG9ydGVkTm9uSW1hZ2VNaW1lVHlwZShtaW1lX3R5cGUpOwotfQotCi0vLyBUZXN0cyBmb3IgTUlNRSBwYXJhbWV0ZXIgZXF1YWxpdHkuIEVhY2ggcGFyYW1ldGVyIGluIHRoZSB8bWltZV90eXBlX3BhdHRlcm58Ci0vLyBtdXN0IGJlIG1hdGNoZWQgYnkgYSBwYXJhbWV0ZXIgaW4gdGhlIHxtaW1lX3R5cGV8LiBJZiB0aGVyZSBhcmUgbm8KLS8vIHBhcmFtZXRlcnMgaW4gdGhlIHBhdHRlcm4sIHRoZSBtYXRjaCBpcyBhIHN1Y2Nlc3MuCi1ib29sIE1hdGNoZXNNaW1lVHlwZVBhcmFtZXRlcnMoY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZV9wYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lX3R5cGUpIHsKLSAgY29uc3Qgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBzZW1pY29sb24gPSBtaW1lX3R5cGVfcGF0dGVybi5maW5kKCc7Jyk7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgdGVzdF9zZW1pY29sb24gPSBtaW1lX3R5cGUuZmluZCgnOycpOwotICBpZiAoc2VtaWNvbG9uICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgaWYgKHRlc3Rfc2VtaWNvbG9uID09IHN0ZDo6c3RyaW5nOjpucG9zKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBhdHRlcm5fcGFyYW1ldGVyczsKLSAgICBiYXNlOjpTcGxpdFN0cmluZyhtaW1lX3R5cGVfcGF0dGVybi5zdWJzdHIoc2VtaWNvbG9uICsgMSksCi0gICAgICAgICAgICAgICAgICAgICAgJzsnLCAmcGF0dGVybl9wYXJhbWV0ZXJzKTsKLQotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB0ZXN0X3BhcmFtZXRlcnM7Ci0gICAgYmFzZTo6U3BsaXRTdHJpbmcobWltZV90eXBlLnN1YnN0cih0ZXN0X3NlbWljb2xvbiArIDEpLAotICAgICAgICAgICAgICAgICAgICAgICc7JywgJnRlc3RfcGFyYW1ldGVycyk7Ci0KLSAgICBzb3J0KHBhdHRlcm5fcGFyYW1ldGVycy5iZWdpbigpLCBwYXR0ZXJuX3BhcmFtZXRlcnMuZW5kKCkpOwotICAgIHNvcnQodGVzdF9wYXJhbWV0ZXJzLmJlZ2luKCksIHRlc3RfcGFyYW1ldGVycy5lbmQoKSk7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGRpZmZlcmVuY2U7Ci0gICAgc3RkOjpzZXRfZGlmZmVyZW5jZShwYXR0ZXJuX3BhcmFtZXRlcnMuYmVnaW4oKSwgcGF0dGVybl9wYXJhbWV0ZXJzLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9wYXJhbWV0ZXJzLmJlZ2luKCksIHRlc3RfcGFyYW1ldGVycy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aW5zZXJ0ZXIoZGlmZmVyZW5jZSwgZGlmZmVyZW5jZS5iZWdpbigpKSk7Ci0KLSAgICByZXR1cm4gZGlmZmVyZW5jZS5zaXplKCkgPT0gMDsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gVGhpcyBjb21wYXJpc29uIGhhbmRsZXMgYWJzb2x1dGUgbWFjaGluZyBhbmQgYWxzbyBiYXNpYwotLy8gd2lsZGNhcmRzLiAgVGhlIHBsdWdpbiBtaW1lIHR5cGVzIGNvdWxkIGJlOgotLy8gICAgICBhcHBsaWNhdGlvbi94LWZvbwotLy8gICAgICBhcHBsaWNhdGlvbi8qCi0vLyAgICAgIGFwcGxpY2F0aW9uLyoreG1sCi0vLyAgICAgICoKLS8vIEFsc28gdGVzdHMgbWltZSBwYXJhbWV0ZXJzIC0tIGFsbCBwYXJhbWV0ZXJzIGluIHRoZSBwYXR0ZXJuIG11c3QgYmUgcHJlc2VudAotLy8gaW4gdGhlIHRlc3RlZCB0eXBlIGZvciBhIG1hdGNoIHRvIHN1Y2NlZWQuCi1ib29sIE1pbWVVdGlsOjpNYXRjaGVzTWltZVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZV9wYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lX3R5cGUpIGNvbnN0IHsKLSAgLy8gVmVyaWZ5IGNhbGxlciBpcyBwYXNzaW5nIGxvd2VyY2FzZSBzdHJpbmdzLgotICBEQ0hFQ0tfRVEoU3RyaW5nVG9Mb3dlckFTQ0lJKG1pbWVfdHlwZV9wYXR0ZXJuKSwgbWltZV90eXBlX3BhdHRlcm4pOwotICBEQ0hFQ0tfRVEoU3RyaW5nVG9Mb3dlckFTQ0lJKG1pbWVfdHlwZSksIG1pbWVfdHlwZSk7Ci0KLSAgaWYgKG1pbWVfdHlwZV9wYXR0ZXJuLmVtcHR5KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgc2VtaWNvbG9uID0gbWltZV90eXBlX3BhdHRlcm4uZmluZCgnOycpOwotICBjb25zdCBzdGQ6OnN0cmluZyBiYXNlX3BhdHRlcm4obWltZV90eXBlX3BhdHRlcm4uc3Vic3RyKDAsIHNlbWljb2xvbikpOwotICBzZW1pY29sb24gPSBtaW1lX3R5cGUuZmluZCgnOycpOwotICBjb25zdCBzdGQ6OnN0cmluZyBiYXNlX3R5cGUobWltZV90eXBlLnN1YnN0cigwLCBzZW1pY29sb24pKTsKLQotICBpZiAoYmFzZV9wYXR0ZXJuID09ICIqIiB8fCBiYXNlX3BhdHRlcm4gPT0gIiovKiIpCi0gICAgcmV0dXJuIE1hdGNoZXNNaW1lVHlwZVBhcmFtZXRlcnMobWltZV90eXBlX3BhdHRlcm4sIG1pbWVfdHlwZSk7Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBzdGFyID0gYmFzZV9wYXR0ZXJuLmZpbmQoJyonKTsKLSAgaWYgKHN0YXIgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICBpZiAoYmFzZV9wYXR0ZXJuID09IGJhc2VfdHlwZSkKLSAgICAgIHJldHVybiBNYXRjaGVzTWltZVR5cGVQYXJhbWV0ZXJzKG1pbWVfdHlwZV9wYXR0ZXJuLCBtaW1lX3R5cGUpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFRlc3QgbGVuZ3RoIHRvIHByZXZlbnQgb3ZlcmxhcCBiZXR3ZWVuIHxsZWZ0fCBhbmQgfHJpZ2h0fC4KLSAgaWYgKGJhc2VfdHlwZS5sZW5ndGgoKSA8IGJhc2VfcGF0dGVybi5sZW5ndGgoKSAtIDEpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIGxlZnQoYmFzZV9wYXR0ZXJuLnN1YnN0cigwLCBzdGFyKSk7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIHJpZ2h0KGJhc2VfcGF0dGVybi5zdWJzdHIoc3RhciArIDEpKTsKLQotICBpZiAoYmFzZV90eXBlLmZpbmQobGVmdCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFyaWdodC5lbXB0eSgpICYmCi0gICAgICBiYXNlX3R5cGUucmZpbmQocmlnaHQpICE9IGJhc2VfdHlwZS5sZW5ndGgoKSAtIHJpZ2h0Lmxlbmd0aCgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gTWF0Y2hlc01pbWVUeXBlUGFyYW1ldGVycyhtaW1lX3R5cGVfcGF0dGVybiwgbWltZV90eXBlKTsKLX0KLQotLy8gU2VlIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvbWVkaWEtdHlwZXMvaW5kZXguaHRtbAotc3RhdGljIGNvbnN0IGNoYXIqIGxlZ2FsX3RvcF9sZXZlbF90eXBlc1tdID0gewotICAiYXBwbGljYXRpb24vIiwKLSAgImF1ZGlvLyIsCi0gICJleGFtcGxlLyIsCi0gICJpbWFnZS8iLAotICAibWVzc2FnZS8iLAotICAibW9kZWwvIiwKLSAgIm11bHRpcGFydC8iLAotICAidGV4dC8iLAotICAidmlkZW8vIiwKLX07Ci0KLWJvb2wgTWltZVV0aWw6OklzTWltZVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGVfc3RyaW5nKSBjb25zdCB7Ci0gIC8vIE1JTUUgdHlwZXMgYXJlIGFsd2F5cyBBU0NJSSBhbmQgY2FzZS1pbnNlbnNpdGl2ZSAoYXQgbGVhc3QsIHRoZSB0b3AtbGV2ZWwKLSAgLy8gYW5kIHNlY29uZGFyeSB0eXBlcyB3ZSBjYXJlIGFib3V0KS4KLSAgaWYgKCFJc1N0cmluZ0FTQ0lJKHR5cGVfc3RyaW5nKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHR5cGVfc3RyaW5nID09ICIqLyoiIHx8IHR5cGVfc3RyaW5nID09ICIqIikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFycmF5c2l6ZShsZWdhbF90b3BfbGV2ZWxfdHlwZXMpOyArK2kpIHsKLSAgICBpZiAoU3RhcnRzV2l0aEFTQ0lJKHR5cGVfc3RyaW5nLCBsZWdhbF90b3BfbGV2ZWxfdHlwZXNbaV0sIGZhbHNlKSAmJgotICAgICAgICB0eXBlX3N0cmluZy5sZW5ndGgoKSA+IHN0cmxlbihsZWdhbF90b3BfbGV2ZWxfdHlwZXNbaV0pKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICAvLyBJZiB0aGVyZSdzIGEgIi8iIHNlcGFyYXRvciBjaGFyYWN0ZXIsIGFuZCB0aGUgdG9rZW4gYmVmb3JlIGl0IGlzCi0gIC8vICJ4LSIgKyAoYXNjaWkgY2hhcmFjdGVycyksIGl0IGlzIGFsc28gYSBNSU1FIHR5cGUuCi0gIHNpemVfdCBzbGFzaCA9IHR5cGVfc3RyaW5nLmZpbmQoJy8nKTsKLSAgaWYgKHNsYXNoIDwgMyB8fAotICAgICAgc2xhc2ggPT0gc3RkOjpzdHJpbmc6Om5wb3MgfHwgc2xhc2ggPT0gdHlwZV9zdHJpbmcubGVuZ3RoKCkgLSAxKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKFN0YXJ0c1dpdGhBU0NJSSh0eXBlX3N0cmluZywgIngtIiwgZmFsc2UpKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBNaW1lVXRpbDo6QXJlU3VwcG9ydGVkTWVkaWFDb2RlY3MoCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjb2RlY3MpIGNvbnN0IHsKLSAgcmV0dXJuIEFyZVN1cHBvcnRlZENvZGVjcyhjb2RlY3NfbWFwXywgY29kZWNzKTsKLX0KLQotdm9pZCBNaW1lVXRpbDo6UGFyc2VDb2RlY1N0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgY29kZWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGNvZGVjc19vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyaXApIHsKLSAgc3RkOjpzdHJpbmcgbm9fcXVvdGVfY29kZWNzOwotICBUcmltU3RyaW5nKGNvZGVjcywgIlwiIiwgJm5vX3F1b3RlX2NvZGVjcyk7Ci0gIGJhc2U6OlNwbGl0U3RyaW5nKG5vX3F1b3RlX2NvZGVjcywgJywnLCBjb2RlY3Nfb3V0KTsKLQotICBpZiAoIXN0cmlwKQotICAgIHJldHVybjsKLQotICAvLyBTdHJpcCBldmVyeXRoaW5nIHBhc3QgdGhlIGZpcnN0ICcuJwotICBmb3IgKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXQgPSBjb2RlY3Nfb3V0LT5iZWdpbigpOwotICAgICAgIGl0ICE9IGNvZGVjc19vdXQtPmVuZCgpOwotICAgICAgICsraXQpIHsKLSAgICBzaXplX3QgZm91bmQgPSBpdC0+ZmluZF9maXJzdF9vZignLicpOwotICAgIGlmIChmb3VuZCAhPSBzdGQ6OnN0cmluZzo6bnBvcykKLSAgICAgIGl0LT5yZXNpemUoZm91bmQpOwotICB9Ci19Ci0KLWJvb2wgTWltZVV0aWw6OklzU3RyaWN0TWVkaWFNaW1lVHlwZShjb25zdCBzdGQ6OnN0cmluZyYgbWltZV90eXBlKSBjb25zdCB7Ci0gIGlmIChzdHJpY3RfZm9ybWF0X21hcF8uZmluZChtaW1lX3R5cGUpID09IHN0cmljdF9mb3JtYXRfbWFwXy5lbmQoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIE1pbWVVdGlsOjpJc1N1cHBvcnRlZFN0cmljdE1lZGlhTWltZVR5cGUoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZSwKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNvZGVjcykgY29uc3QgewotICBTdHJpY3RNYXBwaW5nczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdHJpY3RfZm9ybWF0X21hcF8uZmluZChtaW1lX3R5cGUpOwotICByZXR1cm4gKGl0ICE9IHN0cmljdF9mb3JtYXRfbWFwXy5lbmQoKSkgJiYKLSAgICAgIEFyZVN1cHBvcnRlZENvZGVjcyhpdC0+c2Vjb25kLCBjb2RlY3MpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFdyYXBwZXJzIGZvciB0aGUgc2luZ2xldG9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYm9vbCBHZXRNaW1lVHlwZUZyb21FeHRlbnNpb24oY29uc3QgRmlsZVBhdGg6OlN0cmluZ1R5cGUmIGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBtaW1lX3R5cGUpIHsKLSAgcmV0dXJuIGdfbWltZV91dGlsLkdldCgpLkdldE1pbWVUeXBlRnJvbUV4dGVuc2lvbihleHQsIG1pbWVfdHlwZSk7Ci19Ci0KLWJvb2wgR2V0TWltZVR5cGVGcm9tRmlsZShjb25zdCBGaWxlUGF0aCYgZmlsZV9wYXRoLCBzdGQ6OnN0cmluZyogbWltZV90eXBlKSB7Ci0gIHJldHVybiBnX21pbWVfdXRpbC5HZXQoKS5HZXRNaW1lVHlwZUZyb21GaWxlKGZpbGVfcGF0aCwgbWltZV90eXBlKTsKLX0KLQotYm9vbCBHZXRXZWxsS25vd25NaW1lVHlwZUZyb21FeHRlbnNpb24oY29uc3QgRmlsZVBhdGg6OlN0cmluZ1R5cGUmIGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBtaW1lX3R5cGUpIHsKLSAgcmV0dXJuIGdfbWltZV91dGlsLkdldCgpLkdldFdlbGxLbm93bk1pbWVUeXBlRnJvbUV4dGVuc2lvbihleHQsIG1pbWVfdHlwZSk7Ci19Ci0KLWJvb2wgR2V0UHJlZmVycmVkRXh0ZW5zaW9uRm9yTWltZVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVBhdGg6OlN0cmluZ1R5cGUqIGV4dGVuc2lvbikgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgSXNTdXBwb3J0ZWRJbWFnZU1pbWVUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lX3R5cGUpIHsKLSAgcmV0dXJuIGdfbWltZV91dGlsLkdldCgpLklzU3VwcG9ydGVkSW1hZ2VNaW1lVHlwZShtaW1lX3R5cGUpOwotfQotCi1ib29sIElzU3VwcG9ydGVkTWVkaWFNaW1lVHlwZShjb25zdCBzdGQ6OnN0cmluZyYgbWltZV90eXBlKSB7Ci0gIHJldHVybiBnX21pbWVfdXRpbC5HZXQoKS5Jc1N1cHBvcnRlZE1lZGlhTWltZVR5cGUobWltZV90eXBlKTsKLX0KLQotYm9vbCBJc1N1cHBvcnRlZE5vbkltYWdlTWltZVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZSkgewotICByZXR1cm4gZ19taW1lX3V0aWwuR2V0KCkuSXNTdXBwb3J0ZWROb25JbWFnZU1pbWVUeXBlKG1pbWVfdHlwZSk7Ci19Ci0KLWJvb2wgSXNVbnN1cHBvcnRlZFRleHRNaW1lVHlwZShjb25zdCBzdGQ6OnN0cmluZyYgbWltZV90eXBlKSB7Ci0gIHJldHVybiBnX21pbWVfdXRpbC5HZXQoKS5Jc1Vuc3VwcG9ydGVkVGV4dE1pbWVUeXBlKG1pbWVfdHlwZSk7Ci19Ci0KLWJvb2wgSXNTdXBwb3J0ZWRKYXZhc2NyaXB0TWltZVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZSkgewotICByZXR1cm4gZ19taW1lX3V0aWwuR2V0KCkuSXNTdXBwb3J0ZWRKYXZhc2NyaXB0TWltZVR5cGUobWltZV90eXBlKTsKLX0KLQotYm9vbCBJc1ZpZXdTb3VyY2VNaW1lVHlwZShjb25zdCBzdGQ6OnN0cmluZyYgbWltZV90eXBlKSB7Ci0gIHJldHVybiBnX21pbWVfdXRpbC5HZXQoKS5Jc1ZpZXdTb3VyY2VNaW1lVHlwZShtaW1lX3R5cGUpOwotfQotCi1ib29sIElzU3VwcG9ydGVkTWltZVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZSkgewotICByZXR1cm4gZ19taW1lX3V0aWwuR2V0KCkuSXNTdXBwb3J0ZWRNaW1lVHlwZShtaW1lX3R5cGUpOwotfQotCi1ib29sIE1hdGNoZXNNaW1lVHlwZShjb25zdCBzdGQ6OnN0cmluZyYgbWltZV90eXBlX3BhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWltZV90eXBlKSB7Ci0gIHJldHVybiBnX21pbWVfdXRpbC5HZXQoKS5NYXRjaGVzTWltZVR5cGUobWltZV90eXBlX3BhdHRlcm4sIG1pbWVfdHlwZSk7Ci19Ci0KLWJvb2wgSXNNaW1lVHlwZShjb25zdCBzdGQ6OnN0cmluZyYgdHlwZV9zdHJpbmcpIHsKLSAgcmV0dXJuIGdfbWltZV91dGlsLkdldCgpLklzTWltZVR5cGUodHlwZV9zdHJpbmcpOwotfQotCi1ib29sIEFyZVN1cHBvcnRlZE1lZGlhQ29kZWNzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY29kZWNzKSB7Ci0gIHJldHVybiBnX21pbWVfdXRpbC5HZXQoKS5BcmVTdXBwb3J0ZWRNZWRpYUNvZGVjcyhjb2RlY3MpOwotfQotCi1ib29sIElzU3RyaWN0TWVkaWFNaW1lVHlwZShjb25zdCBzdGQ6OnN0cmluZyYgbWltZV90eXBlKSB7Ci0gIHJldHVybiBnX21pbWVfdXRpbC5HZXQoKS5Jc1N0cmljdE1lZGlhTWltZVR5cGUobWltZV90eXBlKTsKLX0KLQotYm9vbCBJc1N1cHBvcnRlZFN0cmljdE1lZGlhTWltZVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY29kZWNzKSB7Ci0gIHJldHVybiBnX21pbWVfdXRpbC5HZXQoKS5Jc1N1cHBvcnRlZFN0cmljdE1lZGlhTWltZVR5cGUobWltZV90eXBlLCBjb2RlY3MpOwotfQotCi12b2lkIFBhcnNlQ29kZWNTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGNvZGVjcywKLSAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGNvZGVjc19vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBzdHJpcCkgewotICBnX21pbWVfdXRpbC5HZXQoKS5QYXJzZUNvZGVjU3RyaW5nKGNvZGVjcywgY29kZWNzX291dCwgc3RyaXApOwotfQotCi1uYW1lc3BhY2UgewotCi0vLyBGcm9tIGh0dHA6Ly93d3cudzNzY2hvb2xzLmNvbS9tZWRpYS9tZWRpYV9taW1lcmVmLmFzcCBhbmQKLS8vIGh0dHA6Ly9wbHVnaW5kb2MubW96ZGV2Lm9yZy93aW5taW1lLnBocAotc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtTdGFuZGFyZEltYWdlVHlwZXNbXSA9IHsKLSAgImltYWdlL2JtcCIsCi0gICJpbWFnZS9jaXMtY29kIiwKLSAgImltYWdlL2dpZiIsCi0gICJpbWFnZS9pZWYiLAotICAiaW1hZ2UvanBlZyIsCi0gICJpbWFnZS93ZWJwIiwKLSAgImltYWdlL3BpY3QiLAotICAiaW1hZ2UvcGlwZWciLAotICAiaW1hZ2UvcG5nIiwKLSAgImltYWdlL3N2Zyt4bWwiLAotICAiaW1hZ2UvdGlmZiIsCi0gICJpbWFnZS94LWNtdS1yYXN0ZXIiLAotICAiaW1hZ2UveC1jbXgiLAotICAiaW1hZ2UveC1pY29uIiwKLSAgImltYWdlL3gtcG9ydGFibGUtYW55bWFwIiwKLSAgImltYWdlL3gtcG9ydGFibGUtYml0bWFwIiwKLSAgImltYWdlL3gtcG9ydGFibGUtZ3JheW1hcCIsCi0gICJpbWFnZS94LXBvcnRhYmxlLXBpeG1hcCIsCi0gICJpbWFnZS94LXJnYiIsCi0gICJpbWFnZS94LXhiaXRtYXAiLAotICAiaW1hZ2UveC14cGl4bWFwIiwKLSAgImltYWdlL3gteHdpbmRvd2R1bXAiCi19Owotc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtTdGFuZGFyZEF1ZGlvVHlwZXNbXSA9IHsKLSAgImF1ZGlvL2FhYyIsCi0gICJhdWRpby9haWZmIiwKLSAgImF1ZGlvL2FtciIsCi0gICJhdWRpby9iYXNpYyIsCi0gICJhdWRpby9taWRpIiwKLSAgImF1ZGlvL21wMyIsCi0gICJhdWRpby9tcDQiLAotICAiYXVkaW8vbXBlZyIsCi0gICJhdWRpby9tcGVnMyIsCi0gICJhdWRpby9vZ2ciLAotICAiYXVkaW8vdm9yYmlzIiwKLSAgImF1ZGlvL3dhdiIsCi0gICJhdWRpby93ZWJtIiwKLSAgImF1ZGlvL3gtbTRhIiwKLSAgImF1ZGlvL3gtbXMtd21hIiwKLSAgImF1ZGlvL3ZuZC5ybi1yZWFsYXVkaW8iLAotICAiYXVkaW8vdm5kLndhdmUiCi19Owotc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtTdGFuZGFyZFZpZGVvVHlwZXNbXSA9IHsKLSAgInZpZGVvL2F2aSIsCi0gICJ2aWRlby9kaXZ4IiwKLSAgInZpZGVvL2ZsYyIsCi0gICJ2aWRlby9tcDQiLAotICAidmlkZW8vbXBlZyIsCi0gICJ2aWRlby9vZ2ciLAotICAidmlkZW8vcXVpY2t0aW1lIiwKLSAgInZpZGVvL3NkLXZpZGVvIiwKLSAgInZpZGVvL3dlYm0iLAotICAidmlkZW8veC1kdiIsCi0gICJ2aWRlby94LW00diIsCi0gICJ2aWRlby94LW1wZWciLAotICAidmlkZW8veC1tcy1hc2YiLAotICAidmlkZW8veC1tcy13bXYiCi19OwotCi1zdHJ1Y3QgU3RhbmRhcmRUeXBlIHsKLSAgY29uc3QgY2hhciogbGVhZGluZ19taW1lX3R5cGU7Ci0gIGNvbnN0IGNoYXIqIGNvbnN0KiBzdGFuZGFyZF90eXBlczsKLSAgc2l6ZV90IHN0YW5kYXJkX3R5cGVzX2xlbjsKLX07Ci1zdGF0aWMgY29uc3QgU3RhbmRhcmRUeXBlIGtTdGFuZGFyZFR5cGVzW10gPSB7Ci0gIHsgImltYWdlLyIsIGtTdGFuZGFyZEltYWdlVHlwZXMsIGFycmF5c2l6ZShrU3RhbmRhcmRJbWFnZVR5cGVzKSB9LAotICB7ICJhdWRpby8iLCBrU3RhbmRhcmRBdWRpb1R5cGVzLCBhcnJheXNpemUoa1N0YW5kYXJkQXVkaW9UeXBlcykgfSwKLSAgeyAidmlkZW8vIiwga1N0YW5kYXJkVmlkZW9UeXBlcywgYXJyYXlzaXplKGtTdGFuZGFyZFZpZGVvVHlwZXMpIH0sCi0gIHsgTlVMTCwgTlVMTCwgMCB9Ci19OwotCi12b2lkIEdldEV4dGVuc2lvbnNGcm9tSGFyZENvZGVkTWFwcGluZ3MoCi0gICAgY29uc3QgTWltZUluZm8qIG1hcHBpbmdzLAotICAgIHNpemVfdCBtYXBwaW5nc19sZW4sCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxlYWRpbmdfbWltZV90eXBlLAotICAgIGJhc2U6Omhhc2hfc2V0PEZpbGVQYXRoOjpTdHJpbmdUeXBlPiogZXh0ZW5zaW9ucykgewotICBGaWxlUGF0aDo6U3RyaW5nVHlwZSBleHRlbnNpb247Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWFwcGluZ3NfbGVuOyArK2kpIHsKLSAgICBpZiAoU3RhcnRzV2l0aEFTQ0lJKG1hcHBpbmdzW2ldLm1pbWVfdHlwZSwgbGVhZGluZ19taW1lX3R5cGUsIGZhbHNlKSkgewotICAgICAgc3RkOjp2ZWN0b3I8c3RyaW5nPiB0aGlzX2V4dGVuc2lvbnM7Ci0gICAgICBiYXNlOjpTcGxpdFN0cmluZ1VzaW5nU3Vic3RyKG1hcHBpbmdzW2ldLmV4dGVuc2lvbnMsICIsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoaXNfZXh0ZW5zaW9ucyk7Ci0gICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHRoaXNfZXh0ZW5zaW9ucy5zaXplKCk7ICsraikgewotI2lmIGRlZmluZWQoT1NfV0lOKQotICAgICAgICBGaWxlUGF0aDo6U3RyaW5nVHlwZSBleHRlbnNpb24oVVRGOFRvV2lkZSh0aGlzX2V4dGVuc2lvbnNbal0pKTsKLSNlbHNlCi0gICAgICAgIEZpbGVQYXRoOjpTdHJpbmdUeXBlIGV4dGVuc2lvbih0aGlzX2V4dGVuc2lvbnNbal0pOwotI2VuZGlmCi0gICAgICAgIGV4dGVuc2lvbnMtPmluc2VydChleHRlbnNpb24pOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIEdldEV4dGVuc2lvbnNIZWxwZXIoY29uc3QgY2hhciogY29uc3QqIHN0YW5kYXJkX3R5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzdGFuZGFyZF90eXBlc19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxlYWRpbmdfbWltZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6Omhhc2hfc2V0PEZpbGVQYXRoOjpTdHJpbmdUeXBlPiogZXh0ZW5zaW9ucykgewotICAvLyBBbHNvIGxvb2sgdXAgdGhlIGV4dGVuc2lvbnMgZnJvbSBoYXJkLWNvZGVkIG1hcHBpbmdzIGluIGNhc2UgdGhhdCBzb21lCi0gIC8vIHN1cHBvcnRlZCBleHRlbnNpb25zIGFyZSBub3QgcmVnaXN0ZXJlZCBpbiB0aGUgc3lzdGVtIHJlZ2lzdHJ5LCBsaWtlIG9nZy4KLSAgR2V0RXh0ZW5zaW9uc0Zyb21IYXJkQ29kZWRNYXBwaW5ncyhwcmltYXJ5X21hcHBpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5c2l6ZShwcmltYXJ5X21hcHBpbmdzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWFkaW5nX21pbWVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zKTsKLQotICBHZXRFeHRlbnNpb25zRnJvbUhhcmRDb2RlZE1hcHBpbmdzKHNlY29uZGFyeV9tYXBwaW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheXNpemUoc2Vjb25kYXJ5X21hcHBpbmdzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWFkaW5nX21pbWVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zKTsKLX0KLQotLy8gTm90ZSB0aGF0IHRoZSBlbGVtZW50cyBpbiB0aGUgc291cmNlIHNldCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSB0YXJnZXQKLS8vIHZlY3Rvci4KLXRlbXBsYXRlPGNsYXNzIFQ+Ci12b2lkIEhhc2hTZXRUb1ZlY3RvcihiYXNlOjpoYXNoX3NldDxUPiogc291cmNlLCBzdGQ6OnZlY3RvcjxUPiogdGFyZ2V0KSB7Ci0gIHNpemVfdCBvbGRfdGFyZ2V0X3NpemUgPSB0YXJnZXQtPnNpemUoKTsKLSAgdGFyZ2V0LT5yZXNpemUob2xkX3RhcmdldF9zaXplICsgc291cmNlLT5zaXplKCkpOwotICBzaXplX3QgaSA9IDA7Ci0gIGZvciAodHlwZW5hbWUgYmFzZTo6aGFzaF9zZXQ8VD46Oml0ZXJhdG9yIGl0ZXIgPSBzb3VyY2UtPmJlZ2luKCk7Ci0gICAgICAgaXRlciAhPSBzb3VyY2UtPmVuZCgpOyArK2l0ZXIsICsraSkKLSAgICAoKnRhcmdldClbb2xkX3RhcmdldF9zaXplICsgaV0gPSAqaXRlcjsKLX0KLX0KLQotdm9pZCBHZXRFeHRlbnNpb25zRm9yTWltZVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIHVuc2FmZV9taW1lX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxGaWxlUGF0aDo6U3RyaW5nVHlwZT4qIGV4dGVuc2lvbnMpIHsKLSAgaWYgKHVuc2FmZV9taW1lX3R5cGUgPT0gIiovKiIgfHwgdW5zYWZlX21pbWVfdHlwZSA9PSAiKiIpCi0gICAgcmV0dXJuOwotCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIG1pbWVfdHlwZSA9IFN0cmluZ1RvTG93ZXJBU0NJSSh1bnNhZmVfbWltZV90eXBlKTsKLSAgYmFzZTo6aGFzaF9zZXQ8RmlsZVBhdGg6OlN0cmluZ1R5cGU+IHVuaXF1ZV9leHRlbnNpb25zOwotCi0gIGlmIChFbmRzV2l0aChtaW1lX3R5cGUsICIvKiIsIHRydWUpKSB7Ci0gICAgc3RkOjpzdHJpbmcgbGVhZGluZ19taW1lX3R5cGUgPSBtaW1lX3R5cGUuc3Vic3RyKDAsIG1pbWVfdHlwZS5sZW5ndGgoKSAtIDEpOwotCi0gICAgLy8gRmluZCB0aGUgbWF0Y2hpbmcgU3RhbmRhcmRUeXBlIGZyb20gd2l0aGluIGtTdGFuZGFyZFR5cGVzLCBvciBmYWxsCi0gICAgLy8gdGhyb3VnaCB0byB0aGUgbGFzdCAoZGVmYXVsdCkgU3RhbmRhcmRUeXBlLgotICAgIGNvbnN0IFN0YW5kYXJkVHlwZSogdHlwZSA9IE5VTEw7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheXNpemUoa1N0YW5kYXJkVHlwZXMpOyArK2kpIHsKLSAgICAgIHR5cGUgPSAmKGtTdGFuZGFyZFR5cGVzW2ldKTsKLSAgICAgIGlmICh0eXBlLT5sZWFkaW5nX21pbWVfdHlwZSAmJgotICAgICAgICAgIGxlYWRpbmdfbWltZV90eXBlID09IHR5cGUtPmxlYWRpbmdfbWltZV90eXBlKQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgRENIRUNLKHR5cGUpOwotICAgIEdldEV4dGVuc2lvbnNIZWxwZXIodHlwZS0+c3RhbmRhcmRfdHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlLT5zdGFuZGFyZF90eXBlc19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICBsZWFkaW5nX21pbWVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ1bmlxdWVfZXh0ZW5zaW9ucyk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gQWxzbyBsb29rIHVwIHRoZSBleHRlbnNpb25zIGZyb20gaGFyZC1jb2RlZCBtYXBwaW5ncyBpbiBjYXNlIHRoYXQgc29tZQotICAgIC8vIHN1cHBvcnRlZCBleHRlbnNpb25zIGFyZSBub3QgcmVnaXN0ZXJlZCBpbiB0aGUgc3lzdGVtIHJlZ2lzdHJ5LCBsaWtlIG9nZy4KLSAgICBHZXRFeHRlbnNpb25zRnJvbUhhcmRDb2RlZE1hcHBpbmdzKHByaW1hcnlfbWFwcGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheXNpemUocHJpbWFyeV9tYXBwaW5ncyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW1lX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdW5pcXVlX2V4dGVuc2lvbnMpOwotCi0gICAgR2V0RXh0ZW5zaW9uc0Zyb21IYXJkQ29kZWRNYXBwaW5ncyhzZWNvbmRhcnlfbWFwcGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheXNpemUoc2Vjb25kYXJ5X21hcHBpbmdzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1bmlxdWVfZXh0ZW5zaW9ucyk7Ci0gIH0KLQotICBIYXNoU2V0VG9WZWN0b3IoJnVuaXF1ZV9leHRlbnNpb25zLCBleHRlbnNpb25zKTsKLX0KLQotdm9pZCBHZXRNZWRpYVR5cGVzQmxhY2tsaXN0ZWRGb3JUZXN0cyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHR5cGVzKSB7Ci0gIHR5cGVzLT5jbGVhcigpOwotCi0vLyBVbmxlc3MvdW50aWwgV2ViTSBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIG1lZGlhIGxheW91dCB0ZXN0cywgd2UgbmVlZCB0byBhdm9pZAotLy8gYmxhY2tsaXN0aW5nIG1wNCBhbmQgSC4yNjQgd2hlbiBUaGVvcmEgaXMgbm90IHN1cHBvcnRlZCAoYW5kIHByb3ByaWV0YXJ5Ci0vLyBjb2RlY3MgYXJlKSBzbyB0aGF0IHRoZSBtZWRpYSB0ZXN0cyBjYW4gc3RpbGwgcnVuLgotI2lmIGRlZmluZWQoRU5BQkxFX01FRElBX0NPREVDX1RIRU9SQSkgfHwgIWRlZmluZWQoVVNFX1BST1BSSUVUQVJZX0NPREVDUykKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheXNpemUocHJvcHJpZXRhcnlfbWVkaWFfdHlwZXMpOyArK2kpCi0gICAgdHlwZXMtPnB1c2hfYmFjayhwcm9wcmlldGFyeV9tZWRpYV90eXBlc1tpXSk7Ci0jZW5kaWYKLX0KLQotdm9pZCBHZXRNZWRpYUNvZGVjc0JsYWNrbGlzdGVkRm9yVGVzdHMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBjb2RlY3MpIHsKLSAgY29kZWNzLT5jbGVhcigpOwotCi0vLyBVbmxlc3MvdW50aWwgV2ViTSBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIG1lZGlhIGxheW91dCB0ZXN0cywgd2UgbmVlZCB0byBhdm9pZAotLy8gYmxhY2tsaXN0aW5nIG1wNCBhbmQgSC4yNjQgd2hlbiBUaGVvcmEgaXMgbm90IHN1cHBvcnRlZCAoYW5kIHByb3ByaWV0YXJ5Ci0vLyBjb2RlY3MgYXJlKSBzbyB0aGF0IHRoZSBtZWRpYSB0ZXN0cyBjYW4gc3RpbGwgcnVuLgotI2lmIGRlZmluZWQoRU5BQkxFX01FRElBX0NPREVDX1RIRU9SQSkgfHwgIWRlZmluZWQoVVNFX1BST1BSSUVUQVJZX0NPREVDUykKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheXNpemUocHJvcHJpZXRhcnlfbWVkaWFfY29kZWNzKTsgKytpKQotICAgIGNvZGVjcy0+cHVzaF9iYWNrKHByb3ByaWV0YXJ5X21lZGlhX2NvZGVjc1tpXSk7Ci0jZW5kaWYKLX0KLQotY29uc3Qgc3RkOjpzdHJpbmcgR2V0SUFOQU1lZGlhVHlwZShjb25zdCBzdGQ6OnN0cmluZyYgbWltZV90eXBlKSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJyYXlzaXplKGtJYW5hTWVkaWFUeXBlcyk7ICsraSkgewotICAgIGlmIChTdGFydHNXaXRoQVNDSUkobWltZV90eXBlLCBrSWFuYU1lZGlhVHlwZXNbaV0ubWF0Y2hlciwgdHJ1ZSkpIHsKLSAgICAgIHJldHVybiBrSWFuYU1lZGlhVHlwZXNbaV0ubmFtZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuICIiOwotfQotCi1DZXJ0aWZpY2F0ZU1pbWVUeXBlIEdldENlcnRpZmljYXRlTWltZVR5cGVGb3JNaW1lVHlwZSgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWltZV90eXBlKSB7Ci0gIC8vIERvbid0IGNyZWF0ZSBhIG1hcCwgdGhlcmUgaXMgb25seSBvbmUgZW50cnkgaW4gdGhlIHRhYmxlLAotICAvLyBleGNlcHQgb24gQW5kcm9pZC4KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheXNpemUoc3VwcG9ydGVkX2NlcnRpZmljYXRlX3R5cGVzKTsgKytpKSB7Ci0gICAgaWYgKG1pbWVfdHlwZSA9PSBzdXBwb3J0ZWRfY2VydGlmaWNhdGVfdHlwZXNbaV0ubWltZV90eXBlKQotICAgICAgcmV0dXJuIHN1cHBvcnRlZF9jZXJ0aWZpY2F0ZV90eXBlc1tpXS5jZXJ0X3R5cGU7Ci0gIH0KLSAgcmV0dXJuIENFUlRJRklDQVRFX01JTUVfVFlQRV9VTktOT1dOOwotfQotCi1ib29sIElzU3VwcG9ydGVkQ2VydGlmaWNhdGVNaW1lVHlwZShjb25zdCBzdGQ6OnN0cmluZyYgbWltZV90eXBlKSB7Ci0gIENlcnRpZmljYXRlTWltZVR5cGUgZmlsZV90eXBlID0KLSAgICAgIEdldENlcnRpZmljYXRlTWltZVR5cGVGb3JNaW1lVHlwZShtaW1lX3R5cGUpOwotICByZXR1cm4gZmlsZV90eXBlICE9IENFUlRJRklDQVRFX01JTUVfVFlQRV9VTktOT1dOOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9wbGF5ZXIvbWltZV91dGlsLmggYi9zcmMvbWVkaWEvcGxheWVyL21pbWVfdXRpbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTc3OWEwLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9wbGF5ZXIvbWltZV91dGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9QTEFZRVJfTUlNRV9VVElMX0hfXwotI2RlZmluZSBNRURJQV9QTEFZRVJfTUlNRV9VVElMX0hfXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJhc2UvZmlsZV9wYXRoLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gR2V0IHRoZSBtaW1lIHR5cGUgKGlmIGFueSkgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZpbGUgZXh0ZW5zaW9uLgotLy8gUmV0dXJucyB0cnVlIGlmIGEgY29ycmVzcG9uZGluZyBtaW1lIHR5cGUgZXhpc3RzLgotTUVESUFfRVhQT1JUIGJvb2wgR2V0TWltZVR5cGVGcm9tRXh0ZW5zaW9uKGNvbnN0IEZpbGVQYXRoOjpTdHJpbmdUeXBlJiBleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG1pbWVfdHlwZSk7Ci0KLS8vIEdldCB0aGUgbWltZSB0eXBlIChpZiBhbnkpIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmaWxlIGV4dGVuc2lvbi4KLS8vIFJldHVybnMgdHJ1ZSBpZiBhIGNvcnJlc3BvbmRpbmcgbWltZSB0eXBlIGV4aXN0cy4gSW4gdGhpcyBtZXRob2QsCi0vLyB0aGUgc2VhcmNoIGZvciBhIG1pbWUgdHlwZSBpcyBjb25zdHJhaW5lZCB0byBhIGxpbWl0ZWQgc2V0IG9mCi0vLyB0eXBlcyBrbm93biB0byB0aGUgbmV0IGxpYnJhcnksIHRoZSBPUy9yZWdpc3RyeSBpcyBub3QgY29uc3VsdGVkLgotTUVESUFfRVhQT1JUIGJvb2wgR2V0V2VsbEtub3duTWltZVR5cGVGcm9tRXh0ZW5zaW9uKAotICAgIGNvbnN0IEZpbGVQYXRoOjpTdHJpbmdUeXBlJiBleHQsCi0gICAgc3RkOjpzdHJpbmcqIG1pbWVfdHlwZSk7Ci0KLS8vIEdldCB0aGUgbWltZSB0eXBlIChpZiBhbnkpIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmaWxlLiAgUmV0dXJucwotLy8gdHJ1ZSBpZiBhIGNvcnJlc3BvbmRpbmcgbWltZSB0eXBlIGV4aXN0cy4KLU1FRElBX0VYUE9SVCBib29sIEdldE1pbWVUeXBlRnJvbUZpbGUoY29uc3QgRmlsZVBhdGgmIGZpbGVfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG1pbWVfdHlwZSk7Ci0KLS8vIEdldCB0aGUgcHJlZmVycmVkIGV4dGVuc2lvbiAoaWYgYW55KSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG1pbWUgdHlwZS4KLS8vIFJldHVybnMgdHJ1ZSBpZiBhIGNvcnJlc3BvbmRpbmcgZmlsZSBleHRlbnNpb24gZXhpc3RzLiAgVGhlIGV4dGVuc2lvbiBpcwotLy8gcmV0dXJuZWQgd2l0aG91dCBhIHByZWZpeGVkIGRvdCwgZXggImh0bWwiLgotTUVESUFfRVhQT1JUIGJvb2wgR2V0UHJlZmVycmVkRXh0ZW5zaW9uRm9yTWltZVR5cGUoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZSwKLSAgICBGaWxlUGF0aDo6U3RyaW5nVHlwZSogZXh0ZW5zaW9uKTsKLQotLy8gQ2hlY2sgdG8gc2VlIGlmIGEgcGFydGljdWxhciBNSU1FIHR5cGUgaXMgaW4gb3VyIGxpc3QuCi1NRURJQV9FWFBPUlQgYm9vbCBJc1N1cHBvcnRlZEltYWdlTWltZVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZSk7Ci1NRURJQV9FWFBPUlQgYm9vbCBJc1N1cHBvcnRlZE1lZGlhTWltZVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZSk7Ci1NRURJQV9FWFBPUlQgYm9vbCBJc1N1cHBvcnRlZE5vbkltYWdlTWltZVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZSk7Ci1NRURJQV9FWFBPUlQgYm9vbCBJc1Vuc3VwcG9ydGVkVGV4dE1pbWVUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lX3R5cGUpOwotTUVESUFfRVhQT1JUIGJvb2wgSXNTdXBwb3J0ZWRKYXZhc2NyaXB0TWltZVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZSk7Ci1NRURJQV9FWFBPUlQgYm9vbCBJc1N1cHBvcnRlZENlcnRpZmljYXRlTWltZVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZSk7Ci0KLS8vIEdldCB3aGV0aGVyIHRoaXMgbWltZSB0eXBlIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdmlldy1zb3VyY2UgbW9kZS4KLS8vIChGb3IgZXhhbXBsZSwgWE1MLikKLU1FRElBX0VYUE9SVCBib29sIElzVmlld1NvdXJjZU1pbWVUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lX3R5cGUpOwotCi0vLyBDb252ZW5pZW5jZSBmdW5jdGlvbi4KLU1FRElBX0VYUE9SVCBib29sIElzU3VwcG9ydGVkTWltZVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZSk7Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHRoZSBtaW1lX3R5cGVfcGF0dGVybiBtYXRjaGVzIGEgZ2l2ZW4gbWltZS10eXBlLgotLy8gQ2hlY2tzIGZvciBhYnNvbHV0ZSBtYXRjaGluZyBhbmQgd2lsZGNhcmRzLiAgbWltZS10eXBlcyBzaG91bGQgYmUgaW4KLS8vIGxvd2VyIGNhc2UuCi1NRURJQV9FWFBPUlQgYm9vbCBNYXRjaGVzTWltZVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZV9wYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lX3R5cGUpOwotCi0vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHx0eXBlX3N0cmluZ3wgaXMgYSBjb3JyZWN0bHktZm9ybWVkIG1pbWUgdHlwZSBzcGVjaWZpZXIuCi0vLyBBbGxvd3Mgc3RyaW5ncyBvZiB0aGUgZm9ybSB4L3lbO3BhcmFtc10sIHdoZXJlICJ4IiBpcyBhIGxlZ2FsIG1pbWUgdHlwZSBuYW1lLgotLy8gQWxzbyBhbGxvd3Mgd2lsZGNhcmQgdHlwZXMgLS0gIngvKiIsICIqLyoiLCBhbmQgIioiLgotTUVESUFfRVhQT1JUIGJvb2wgSXNNaW1lVHlwZShjb25zdCBzdGQ6OnN0cmluZyYgdHlwZV9zdHJpbmcpOwotCi0vLyBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgYWxsIGNvZGVjcyBhcmUgc3VwcG9ydGVkLCBmYWxzZSBvdGhlcndpc2UuCi1NRURJQV9FWFBPUlQgYm9vbCBBcmVTdXBwb3J0ZWRNZWRpYUNvZGVjcygKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNvZGVjcyk7Ci0KLS8vIFBhcnNlcyBhIGNvZGVjIHN0cmluZywgcG9wdWxhdGluZyB8Y29kZWNzX291dHwgd2l0aCB0aGUgcHJlZml4IG9mIGVhY2ggY29kZWMKLS8vIGluIHRoZSBzdHJpbmcgfGNvZGVjc19pbnwuIEZvciBleGFtcGxlLCBwYXNzZWQgImFhYS5iLmMsZGQuZWVlIiwgaWYKLS8vIHxzdHJpcHwgPT0gdHJ1ZSB8Y29kZWNzX291dHwgd2lsbCBjb250YWluIHsiYWFhIiwgImRkIn0sIGlmIHxzdHJpcHwgPT0gZmFsc2UKLS8vIHxjb2RlY3Nfb3V0fCB3aWxsIGNvbnRhaW4geyJhYWEuYi5jIiwgImRkLmVlZSJ9LgotLy8gU2VlIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzQyODEudHh0LgotTUVESUFfRVhQT1JUIHZvaWQgUGFyc2VDb2RlY1N0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgY29kZWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGNvZGVjc19vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyaXApOwotCi0vLyBDaGVjayB0byBzZWUgaWYgYSBwYXJ0aWN1bGFyIE1JTUUgdHlwZSBpcyBpbiBvdXIgbGlzdCB3aGljaCBvbmx5IHN1cHBvcnRzIGEKLS8vIGNlcnRhaW4gc3Vic2V0IG9mIGNvZGVjcy4KLU1FRElBX0VYUE9SVCBib29sIElzU3RyaWN0TWVkaWFNaW1lVHlwZShjb25zdCBzdGQ6OnN0cmluZyYgbWltZV90eXBlKTsKLQotLy8gQ2hlY2sgdG8gc2VlIGlmIGEgcGFydGljdWxhciBNSU1FIHR5cGUgaXMgaW4gb3VyIGxpc3Qgd2hpY2ggb25seSBzdXBwb3J0cyBhCi0vLyBjZXJ0YWluIHN1YnNldCBvZiBjb2RlY3MuIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiBhbGwgY29kZWNzIGFyZQotLy8gc3VwcG9ydGVkIGZvciB0aGF0IHNwZWNpZmljIE1JTUUgdHlwZSwgZmFsc2Ugb3RoZXJ3aXNlLiBJZiB0aGlzIHJldHVybnMKLS8vIGZhbHNlIHlvdSB3aWxsIHN0aWxsIG5lZWQgdG8gY2hlY2sgaWYgdGhlIG1lZGlhIE1JTUUgdHB5ZXMgYW5kIGNvZGVjcyBhcmUKLS8vIHN1cHBvcnRlZC4KLU1FRElBX0VYUE9SVCBib29sIElzU3VwcG9ydGVkU3RyaWN0TWVkaWFNaW1lVHlwZSgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWltZV90eXBlLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY29kZWNzKTsKLQotLy8gR2V0IHRoZSBleHRlbnNpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbWltZSB0eXBlLiBUaGlzIHNob3VsZCBiZSBwYXNzZWQKLS8vIGluIGxvd2VyIGNhc2UuIFRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGV4dGVuc2lvbnMgZm9yIGEgZ2l2ZW4gbWltZSB0eXBlLCBsaWtlCi0vLyAiaHRtbCxodG0iIGZvciAidGV4dC9odG1sIiwgb3IgInR4dCx0ZXh0LGh0bWwsLi4uIiBmb3IgInRleHQvKiIuCi0vLyBOb3RlIHRoYXQgd2UgZG8gbm90IGVyYXNlIHRoZSBleGlzdGluZyBlbGVtZW50cyBpbiB0aGUgdGhlIHByb3ZpZGVkIHZlY3Rvci4KLS8vIEluc3RlYWQsIHdlIGFwcGVuZCB0aGUgcmVzdWx0IHRvIGl0LgotTUVESUFfRVhQT1JUIHZvaWQgR2V0RXh0ZW5zaW9uc0Zvck1pbWVUeXBlKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lX3R5cGUsCi0gICAgc3RkOjp2ZWN0b3I8RmlsZVBhdGg6OlN0cmluZ1R5cGU+KiBleHRlbnNpb25zKTsKLQotLy8gVGVzdCBvbmx5IG1ldGhvZHMgdGhhdCByZXR1cm4gbGlzdHMgb2YgcHJvcHJpZXRhcnkgbWVkaWEgdHlwZXMgYW5kIGNvZGVjcwotLy8gdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSBhbGwgdmFyaWF0aW9ucyBvZiBDaHJvbWl1bS4KLS8vIFRoZXNlIHR5cGVzIGFuZCBjb2RlY3MgbXVzdCBiZSBibGFja2xpc3RlZCB0byBlbnN1cmUgY29uc2lzdGVudCBsYXlvdXQgdGVzdAotLy8gcmVzdWx0cyBhY3Jvc3MgYWxsIENocm9taXVtIHZhcmlhdGlvbnMuCi1NRURJQV9FWFBPUlQgdm9pZCBHZXRNZWRpYVR5cGVzQmxhY2tsaXN0ZWRGb3JUZXN0cygKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHR5cGVzKTsKLU1FRElBX0VYUE9SVCB2b2lkIEdldE1lZGlhQ29kZWNzQmxhY2tsaXN0ZWRGb3JUZXN0cygKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGNvZGVjcyk7Ci0KLS8vIFJldHVybnMgdGhlIElBTkEgbWVkaWEgdHlwZSBjb250YWluZWQgaW4gfG1pbWVfdHlwZXwsIG9yIGFuIGVtcHR5Ci0vLyBzdHJpbmcgaWYgfG1pbWVfdHlwZXwgZG9lcyBub3Qgc3BlY2lmaWZ5IGEga25vd24gbWVkaWEgdHlwZS4KLS8vIFN1cHBvcnRlZCBtZWRpYSB0eXBlcyBhcmUgZGVmaW5lZCBhdDoKLS8vIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvbWVkaWEtdHlwZXMvaW5kZXguaHRtbAotTUVESUFfRVhQT1JUIGNvbnN0IHN0ZDo6c3RyaW5nIEdldElBTkFNZWRpYVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZSk7Ci0KLS8vIEEgbGlzdCBvZiBzdXBwb3J0ZWQgY2VydGlmaWNhdGUtcmVsYXRlZCBtaW1lIHR5cGVzLgotZW51bSBDZXJ0aWZpY2F0ZU1pbWVUeXBlIHsKLSNkZWZpbmUgQ0VSVElGSUNBVEVfTUlNRV9UWVBFKG5hbWUsIHZhbHVlKSBDRVJUSUZJQ0FURV9NSU1FX1RZUEVfICMjIG5hbWUgPSB2YWx1ZSwKLSNpbmNsdWRlICJtZWRpYS9wbGF5ZXIvbWltZV91dGlsX2NlcnRpZmljYXRlX3R5cGVfbGlzdC5oIgotI3VuZGVmIENFUlRJRklDQVRFX01JTUVfVFlQRQotfTsKLQotTUVESUFfRVhQT1JUIENlcnRpZmljYXRlTWltZVR5cGUgR2V0Q2VydGlmaWNhdGVNaW1lVHlwZUZvck1pbWVUeXBlKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lX3R5cGUpOwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9QTEFZRVJfTUlNRV9VVElMX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3BsYXllci9taW1lX3V0aWxfY2VydGlmaWNhdGVfdHlwZV9saXN0LmggYi9zcmMvbWVkaWEvcGxheWVyL21pbWVfdXRpbF9jZXJ0aWZpY2F0ZV90eXBlX2xpc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNkMjk0Ny4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvcGxheWVyL21pbWVfdXRpbF9jZXJ0aWZpY2F0ZV90eXBlX2xpc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIFRoaXMgZmlsZSBpbnRlbnRpb25hbGx5IGRvZXMgbm90IGhhdmUgaGVhZGVyIGd1YXJkcywgaXQncyBpbmNsdWRlZAotLy8gaW5zaWRlIGEgbWFjcm8gdG8gZ2VuZXJhdGUgZW51bS4KLQotLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBsaXN0IG9mIGNlcnRpZmljYXRlIE1JTUUgdHlwZXMuCi0KLUNFUlRJRklDQVRFX01JTUVfVFlQRShVTktOT1dOLCAwKQotQ0VSVElGSUNBVEVfTUlNRV9UWVBFKFg1MDlfVVNFUl9DRVJULCAxKQotQ0VSVElGSUNBVEVfTUlNRV9UWVBFKFg1MDlfQ0FfQ0VSVCwgMikKLUNFUlRJRklDQVRFX01JTUVfVFlQRShQS0NTMTJfQVJDSElWRSwgMykKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllci5oIGIvc3JjL21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYjZjMDIuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9QTEFZRVJfV0VCX01FRElBX1BMQVlFUl9IXwotI2RlZmluZSBNRURJQV9QTEFZRVJfV0VCX01FRElBX1BMQVlFUl9IXwotCi0vLyBUaGUgdGVtcG9yYXJ5IGhvbWUgZm9yIFdlYk1lZGlhUGxheWVyIGFuZCBXZWJNZWRpYVBsYXllckNsaWVudC4gVGhleSBhcmUgdGhlCi0vLyBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgSFRNTE1lZGlhRWxlbWVudCBhbmQgdGhlIG1lZGlhIHN0YWNrLgotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgotI2luY2x1ZGUgImJhc2UvY29tcGlsZXJfc3BlY2lmaWMuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS93ZWFrX3B0ci5oIgotI2luY2x1ZGUgImJhc2UvdGltZS5oIgotI2luY2x1ZGUgImdvb2dsZXVybC9zcmMvZ3VybC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvcmFuZ2VzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaGVsbF92aWRlb19mcmFtZV9wcm92aWRlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fZnJhbWUuaCIKLSNpbmNsdWRlICJtZWRpYS9wbGF5ZXIvYnVmZmVyZWRfZGF0YV9zb3VyY2UuaCIKLSNpbmNsdWRlICJ1aS9nZngvcmVjdC5oIgotI2luY2x1ZGUgInVpL2dmeC9zaXplLmgiCi0KLS8vIERpc2FibGUgYHVucmVmZXJlbmNlZCBmb3JtYWwgcGFyYW1ldGVyYCBhcyB3ZSBoYXZlIG1hbnkgc3R1YiBmdW5jdGlvbnMgaW4KLS8vIHRoaXMgZmlsZSBhbmQgd2Ugd2FudCB0byBrZWVwIHRoZWlyIHBhcmFtZXRlcnMuCi1NU1ZDX1BVU0hfRElTQUJMRV9XQVJOSU5HKDQxMDApCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIFdlYk1lZGlhUGxheWVyIHsKLSBwdWJsaWM6Ci0gIC8vIFJldHVybiB0cnVlIGlmIHRoZSBwdW5jaCB0aHJvdWdoIGJveCBzaG91bGQgYmUgcmVuZGVyZWQuICBSZXR1cm4gZmFsc2UgaWYKLSAgLy8gbm8gcHVuY2ggdGhyb3VnaCBib3ggc2hvdWxkIGJlIHJlbmRlcmVkLgotICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPGJvb2woY29uc3QgZ2Z4OjpSZWN0Jik+IFNldEJvdW5kc0NCOwotCi0gIGVudW0gTmV0d29ya1N0YXRlIHsKLSAgICBrTmV0d29ya1N0YXRlRW1wdHksCi0gICAga05ldHdvcmtTdGF0ZUlkbGUsCi0gICAga05ldHdvcmtTdGF0ZUxvYWRpbmcsCi0gICAga05ldHdvcmtTdGF0ZUxvYWRlZCwKLSAgICBrTmV0d29ya1N0YXRlRm9ybWF0RXJyb3IsCi0gICAga05ldHdvcmtTdGF0ZU5ldHdvcmtFcnJvciwKLSAgICBrTmV0d29ya1N0YXRlRGVjb2RlRXJyb3IsCi0gIH07Ci0KLSAgZW51bSBSZWFkeVN0YXRlIHsKLSAgICBrUmVhZHlTdGF0ZUhhdmVOb3RoaW5nLAotICAgIGtSZWFkeVN0YXRlSGF2ZU1ldGFkYXRhLAotICAgIGtSZWFkeVN0YXRlSGF2ZUN1cnJlbnREYXRhLAotICAgIGtSZWFkeVN0YXRlSGF2ZUZ1dHVyZURhdGEsCi0gICAga1JlYWR5U3RhdGVIYXZlRW5vdWdoRGF0YSwKLSAgfTsKLQotICBlbnVtIEFkZElkU3RhdHVzIHsKLSAgICBrQWRkSWRTdGF0dXNPaywKLSAgICBrQWRkSWRTdGF0dXNOb3RTdXBwb3J0ZWQsCi0gICAga0FkZElkU3RhdHVzUmVhY2hlZElkTGltaXQKLSAgfTsKLQotICBlbnVtIEVuZE9mU3RyZWFtU3RhdHVzIHsKLSAgICBrRW5kT2ZTdHJlYW1TdGF0dXNOb0Vycm9yLAotICAgIGtFbmRPZlN0cmVhbVN0YXR1c05ldHdvcmtFcnJvciwKLSAgICBrRW5kT2ZTdHJlYW1TdGF0dXNEZWNvZGVFcnJvciwKLSAgfTsKLQotICAvLyBSZXByZXNlbnRzIHN5bmNocm9ub3VzIGV4Y2VwdGlvbnMgdGhhdCBjYW4gYmUgdGhyb3duIGZyb20gdGhlIEVuY3J5cHRlZAotICAvLyBNZWRpYSBtZXRob2RzLiBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBhc3luY2hyb25vdXMgTWVkaWFLZXlFcnJvci4KLSAgZW51bSBNZWRpYUtleUV4Y2VwdGlvbiB7Ci0gICAga01lZGlhS2V5RXhjZXB0aW9uTm9FcnJvciwKLSAgICBrTWVkaWFLZXlFeGNlcHRpb25JbnZhbGlkUGxheWVyU3RhdGUsCi0gICAga01lZGlhS2V5RXhjZXB0aW9uS2V5U3lzdGVtTm90U3VwcG9ydGVkLAotICB9OwotCi0gIGVudW0gQ09SU01vZGUgewotICAgIGtDT1JTTW9kZVVuc3BlY2lmaWVkLAotICAgIGtDT1JTTW9kZUFub255bW91cywKLSAgICBrQ09SU01vZGVVc2VDcmVkZW50aWFscywKLSAgfTsKLQotICB2aXJ0dWFsIH5XZWJNZWRpYVBsYXllcigpIHt9Ci0KLSAgdmlydHVhbCB2b2lkIExvYWRNZWRpYVNvdXJjZSgpID0gMDsKLSAgdmlydHVhbCB2b2lkIExvYWRQcm9ncmVzc2l2ZShjb25zdCBHVVJMJiB1cmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3B0cjxCdWZmZXJlZERhdGFTb3VyY2U+IGRhdGFfc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPUlNNb2RlIGNvcnNfbW9kZSkgPSAwOwotICB2aXJ0dWFsIHZvaWQgQ2FuY2VsTG9hZCgpID0gMDsKLQotICAvLyBQbGF5YmFjayBjb250cm9scy4KLSAgdmlydHVhbCB2b2lkIFBsYXkoKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBQYXVzZSgpID0gMDsKLSAgdmlydHVhbCBib29sIFN1cHBvcnRzRnVsbHNjcmVlbigpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCBib29sIFN1cHBvcnRzU2F2ZSgpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCB2b2lkIFNlZWsoZmxvYXQgc2Vjb25kcykgPSAwOwotICB2aXJ0dWFsIHZvaWQgU2V0RW5kVGltZShmbG9hdCBzZWNvbmRzKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBTZXRSYXRlKGZsb2F0IHJhdGUpID0gMDsKLSAgdmlydHVhbCB2b2lkIFNldFZvbHVtZShmbG9hdCB2b2x1bWUpID0gMDsKLSAgdmlydHVhbCB2b2lkIFNldFZpc2libGUoYm9vbCB2aXNpYmxlKSA9IDA7Ci0gIHZpcnR1YWwgY29uc3QgUmFuZ2VzPGJhc2U6OlRpbWVEZWx0YT4mIEdldEJ1ZmZlcmVkVGltZVJhbmdlcygpID0gMDsKLSAgdmlydHVhbCBmbG9hdCBHZXRNYXhUaW1lU2Vla2FibGUoKSBjb25zdCA9IDA7Ci0KLSAgLy8gU3VzcGVuZC9SZXN1bWUKLSAgdmlydHVhbCB2b2lkIFN1c3BlbmQoKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBSZXN1bWUoKSA9IDA7Ci0KLSAgLy8gVHJ1ZSBpZiB0aGUgbG9hZGVkIG1lZGlhIGhhcyBhIHBsYXlhYmxlIHZpZGVvL2F1ZGlvIHRyYWNrLgotICB2aXJ0dWFsIGJvb2wgSGFzVmlkZW8oKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBIYXNBdWRpbygpIGNvbnN0ID0gMDsKLQotICAvLyBEaW1lbnNpb24gb2YgdGhlIHZpZGVvLgotICB2aXJ0dWFsIGdmeDo6U2l6ZSBHZXROYXR1cmFsU2l6ZSgpIGNvbnN0ID0gMDsKLQotICAvLyBHZXR0ZXJzIG9mIHBsYXliYWNrIHN0YXRlLgotICB2aXJ0dWFsIGJvb2wgSXNQYXVzZWQoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBJc1NlZWtpbmcoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgZmxvYXQgR2V0RHVyYXRpb24oKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgZmxvYXQgR2V0Q3VycmVudFRpbWUoKSBjb25zdCA9IDA7Ci0KLSAgLy8gR2V0IHJhdGUgb2YgbG9hZGluZyB0aGUgcmVzb3VyY2UuCi0gIHZpcnR1YWwgaW50IEdldERhdGFSYXRlKCkgY29uc3QgPSAwOwotCi0gIC8vIEludGVybmFsIHN0YXRlcyBvZiBsb2FkaW5nIGFuZCBuZXR3b3JrLgotICB2aXJ0dWFsIE5ldHdvcmtTdGF0ZSBHZXROZXR3b3JrU3RhdGUoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgUmVhZHlTdGF0ZSBHZXRSZWFkeVN0YXRlKCkgY29uc3QgPSAwOwotCi0gIHZpcnR1YWwgYm9vbCBEaWRMb2FkaW5nUHJvZ3Jlc3MoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdW5zaWduZWQgbG9uZyBsb25nIEdldFRvdGFsQnl0ZXMoKSBjb25zdCA9IDA7Ci0KLSAgdmlydHVhbCBib29sIEhhc1NpbmdsZVNlY3VyaXR5T3JpZ2luKCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIGJvb2wgRGlkUGFzc0NPUlNBY2Nlc3NDaGVjaygpIGNvbnN0ID0gMDsKLQotICB2aXJ0dWFsIGZsb2F0IE1lZGlhVGltZUZvclRpbWVWYWx1ZShmbG9hdCB0aW1lVmFsdWUpIGNvbnN0ID0gMDsKLQotICB2aXJ0dWFsIHVuc2lnbmVkIEdldERlY29kZWRGcmFtZUNvdW50KCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIHVuc2lnbmVkIEdldERyb3BwZWRGcmFtZUNvdW50KCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIHVuc2lnbmVkIEdldEF1ZGlvRGVjb2RlZEJ5dGVDb3VudCgpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCB1bnNpZ25lZCBHZXRWaWRlb0RlY29kZWRCeXRlQ291bnQoKSBjb25zdCA9IDA7Ci0KLSAgdmlydHVhbCBzY29wZWRfcmVmcHRyPFNoZWxsVmlkZW9GcmFtZVByb3ZpZGVyPiBHZXRWaWRlb0ZyYW1lUHJvdmlkZXIoKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgdmlydHVhbCBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IEdldEN1cnJlbnRGcmFtZSgpIHsgcmV0dXJuIDA7IH0KLSAgLy8gV2Ugbm8gbG9uZ2VyIG5lZWQgUHV0Q3VycmVudEZyYW1lIGFzIHRoZSB0aGUgdmlkZW8gZnJhbWUgcmV0dXJuZWQgZnJvbQotICAvLyBHZXRDdXJyZW50RnJhbWUoKSBpcyBub3cgYSBzY29wZWRfcmVmcHRyLgotICB2aXJ0dWFsIHZvaWQgUHV0Q3VycmVudEZyYW1lKAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiYgLyogdmlkZW9fZnJhbWUgKi8pIHt9Ci0KLSAgdmlydHVhbCBBZGRJZFN0YXR1cyBTb3VyY2VBZGRJZCgKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiAvKiBpZCAqLywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiAvKiB0eXBlICovLAotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiAvKiBjb2RlY3MgKi8pIHsKLSAgICByZXR1cm4ga0FkZElkU3RhdHVzTm90U3VwcG9ydGVkOwotICB9Ci0gIHZpcnR1YWwgYm9vbCBTb3VyY2VSZW1vdmVJZChjb25zdCBzdGQ6OnN0cmluZyYgLyogaWQgKi8pIHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgUmFuZ2VzPGJhc2U6OlRpbWVEZWx0YT4gU291cmNlQnVmZmVyZWQoY29uc3Qgc3RkOjpzdHJpbmcmIC8qIGlkICovKSB7Ci0gICAgcmV0dXJuIFJhbmdlczxiYXNlOjpUaW1lRGVsdGE+KCk7Ci0gIH0KLSAgdmlydHVhbCBib29sIFNvdXJjZUFwcGVuZChjb25zdCBzdGQ6OnN0cmluZyYgLyogaWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogLyogZGF0YSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAvKiBsZW5ndGggKi8pIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgdmlydHVhbCBib29sIFNvdXJjZUFib3J0KGNvbnN0IHN0ZDo6c3RyaW5nJiAvKiBpZCAqLykgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBkb3VibGUgU291cmNlR2V0RHVyYXRpb24oKSBjb25zdCB7IHJldHVybiAwLjA7IH0KLSAgdmlydHVhbCB2b2lkIFNvdXJjZVNldER1cmF0aW9uKGRvdWJsZSAvKiBkdXJhdGlvbiAqLykge30KLSAgdmlydHVhbCB2b2lkIFNvdXJjZUVuZE9mU3RyZWFtKEVuZE9mU3RyZWFtU3RhdHVzIC8qIHN0YXR1cyAqLykge30KLSAgdmlydHVhbCBib29sIFNvdXJjZVNldFRpbWVzdGFtcE9mZnNldChjb25zdCBzdGQ6OnN0cmluZyYgLyogaWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIC8qIG9mZnNldCAqLykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFJldHVybnMgd2hldGhlciBrZXlTeXN0ZW0gaXMgc3VwcG9ydGVkLiBJZiB0cnVlLCB0aGUgcmVzdWx0IHdpbGwgYmUKLSAgLy8gcmVwb3J0ZWQgYnkgYW4gZXZlbnQuCi0gIHZpcnR1YWwgTWVkaWFLZXlFeGNlcHRpb24gR2VuZXJhdGVLZXlSZXF1ZXN0KAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIC8qIGtleV9zeXN0ZW0gKi8sCi0gICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiAvKiBpbml0X2RhdGEgKi8sCi0gICAgICB1bnNpZ25lZCAvKiBpbml0X2RhdGFfbGVuZ3RoICovKSB7Ci0gICAgcmV0dXJuIGtNZWRpYUtleUV4Y2VwdGlvbktleVN5c3RlbU5vdFN1cHBvcnRlZDsKLSAgfQotICB2aXJ0dWFsIE1lZGlhS2V5RXhjZXB0aW9uIEFkZEtleShjb25zdCBzdGQ6OnN0cmluZyYgLyoga2V5X3N5c3RlbSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogLyoga2V5ICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAvKiBrZXlfbGVuZ3RoICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiAvKiBpbml0X2RhdGEgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIC8qIGluaXRfZGF0YV9sZW5ndGggKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiAvKiBzZXNzaW9uX2lkICovKSB7Ci0gICAgcmV0dXJuIGtNZWRpYUtleUV4Y2VwdGlvbktleVN5c3RlbU5vdFN1cHBvcnRlZDsKLSAgfQotICB2aXJ0dWFsIE1lZGlhS2V5RXhjZXB0aW9uIENhbmNlbEtleVJlcXVlc3QoCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgLyoga2V5X3N5c3RlbSAqLywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiAvKiBzZXNzaW9uX2lkICovKSB7Ci0gICAgcmV0dXJuIGtNZWRpYUtleUV4Y2VwdGlvbktleVN5c3RlbU5vdFN1cHBvcnRlZDsKLSAgfQotCi0gIHZpcnR1YWwgU2V0Qm91bmRzQ0IgR2V0U2V0Qm91bmRzQ0IoKSB7IHJldHVybiBTZXRCb3VuZHNDQigpOyB9Ci0KLSAgLy8gSW5zdHJ1Y3QgV2ViTWVkaWFQbGF5ZXIgdG8gZW50ZXIvZXhpdCBmdWxsc2NyZWVuLgotICB2aXJ0dWFsIHZvaWQgRW50ZXJGdWxsc2NyZWVuKCkge30KLSAgdmlydHVhbCB2b2lkIEV4aXRGdWxsc2NyZWVuKCkge30KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBwbGF5ZXIgY2FuIGVudGVyIGZ1bGxzY3JlZW4uCi0gIHZpcnR1YWwgYm9vbCBDYW5FbnRlckZ1bGxzY3JlZW4oKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gIC8vIFJldHVybnMgdGhlIGFkZHJlc3MgYW5kIHNpemUgb2YgYSBjaHVuayBvZiBtZW1vcnkgdG8gYmUgaW5jbHVkZWQgaW4gYQotICAvLyBkZWJ1ZyByZXBvcnQuIE1heSBub3QgYmUgc3VwcG9ydGVkIG9uIGFsbCBwbGF0Zm9ybXMuIFRoZSByZXR1cm5lZCBhZGRyZXNzCi0gIC8vIHNob3VsZCByZW1haW4gdmFsaWQgYXMgbG9uZyBhcyB0aGUgV2ViTWVkaWFQbGF5ZXIgaW5zdGFuY2UgaXMgYWxpdmUuCi0gIHZpcnR1YWwgYm9vbCBHZXREZWJ1Z1JlcG9ydERhdGFBZGRyZXNzKHZvaWQqKiAvKm91dF9hZGRyZXNzKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogLypvdXRfc2l6ZSovKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19OwotCi1jbGFzcyBXZWJNZWRpYVBsYXllckNsaWVudCB7Ci0gcHVibGljOgotICBlbnVtIE1lZGlhS2V5RXJyb3JDb2RlIHsKLSAgICBrTWVkaWFLZXlFcnJvckNvZGVVbmtub3duID0gMSwKLSAgICBrTWVkaWFLZXlFcnJvckNvZGVDbGllbnQsCi0gICAga01lZGlhS2V5RXJyb3JDb2RlU2VydmljZSwKLSAgICBrTWVkaWFLZXlFcnJvckNvZGVPdXRwdXQsCi0gICAga01lZGlhS2V5RXJyb3JDb2RlSGFyZHdhcmVDaGFuZ2UsCi0gICAga01lZGlhS2V5RXJyb3JDb2RlRG9tYWluLAotICAgIGtVbmtub3duRXJyb3IgPSBrTWVkaWFLZXlFcnJvckNvZGVVbmtub3duLAotICAgIGtDbGllbnRFcnJvciA9IGtNZWRpYUtleUVycm9yQ29kZUNsaWVudCwKLSAgICBrU2VydmljZUVycm9yID0ga01lZGlhS2V5RXJyb3JDb2RlU2VydmljZSwKLSAgICBrT3V0cHV0RXJyb3IgPSBrTWVkaWFLZXlFcnJvckNvZGVPdXRwdXQsCi0gICAga0hhcmR3YXJlQ2hhbmdlRXJyb3IgPSBrTWVkaWFLZXlFcnJvckNvZGVIYXJkd2FyZUNoYW5nZSwKLSAgICBrRG9tYWluRXJyb3IgPSBrTWVkaWFLZXlFcnJvckNvZGVEb21haW4sCi0gIH07Ci0KLSAgdmlydHVhbCB2b2lkIE5ldHdvcmtTdGF0ZUNoYW5nZWQoKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBSZWFkeVN0YXRlQ2hhbmdlZCgpID0gMDsKLSAgdmlydHVhbCB2b2lkIFRpbWVDaGFuZ2VkKCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgRHVyYXRpb25DaGFuZ2VkKCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgUGxheWJhY2tTdGF0ZUNoYW5nZWQoKSA9IDA7Ci0gIC8vIFRPRE86IFJldmlzaXQgdGhlIG5lY2Vzc2l0eSBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uLgotICB2aXJ0dWFsIHZvaWQgU2V0T3BhcXVlKGJvb2wgLyogb3BhcXVlICovKSB7fQotICB2aXJ0dWFsIHZvaWQgU2F3VW5zdXBwb3J0ZWRUcmFja3MoKSA9IDA7Ci0gIHZpcnR1YWwgZmxvYXQgVm9sdW1lKCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgU291cmNlT3BlbmVkKCkgPSAwOwotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIFNvdXJjZVVSTCgpIGNvbnN0ID0gMDsKLSAgLy8gQ2xpZW50cyBzaG91bGQgaW1wbGVtZW50IHRoaXMgaW4gb3JkZXIgdG8gaW5kaWNhdGUgYSBwcmVmZXJlbmNlIGZvciB3aGV0aGVyCi0gIC8vIGEgdmlkZW8gc2hvdWxkIGJlIGRlY29kZWQgdG8gYSB0ZXh0dXJlIG9yIHRocm91Z2ggYSBwdW5jaCBvdXQgc3lzdGVtLiAgSWYKLSAgLy8gdGhlIHByZWZlcnJlZCBvdXRwdXQgbW9kZSBpcyBub3Qgc3VwcG9ydGVkLCB0aGUgcGxheWVyIHdpbGwgZmFsbGJhY2sgdG8KLSAgLy8gb25lIHRoYXQgaXMuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHRoYXQsIHNheSwgZm9yIHNwaGVyaWNhbCB2aWRlbwotICAvLyBwbGF5YmFjaywgd2Ugd291bGQgbGlrZSBhIGRlY29kZS10by10ZXh0dXJlIG91dHB1dCBtb2RlLgotICB2aXJ0dWFsIGJvb2wgUHJlZmVyRGVjb2RlVG9UZXh0dXJlKCkgeyByZXR1cm4gZmFsc2U7IH0KLSAgLy8gVE9ETzogTWFrZSB0aGUgRU1FIHJlbGF0ZWQgZnVuY3Rpb25zIHB1cmUgdmlydHVhbCBhZ2FpbiBvbmNlCi0gIC8vIHdlIGhhdmUgcHJvcGVyIEVNRSBpbXBsZW1lbnRhdGlvbi4gQ3VycmVudGx5IGVtcHR5IGltcGxlbWVudGF0aW9uIGFyZQotICAvLyBwcm92aWRlZCB0byBtYWtlIG1lZGlhIHRlbXBvcmFyaWx5IHdvcmsuCi0gIHZpcnR1YWwgdm9pZCBLZXlBZGRlZChjb25zdCBzdGQ6OnN0cmluZyYgLyoga2V5X3N5c3RlbSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiAvKiBzZXNzaW9uX2lkICovKSB7Ci0gICAgTk9USU1QTEVNRU5URUQoKTsKLSAgfQotICB2aXJ0dWFsIHZvaWQgS2V5RXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIC8qIGtleV9zeXN0ZW0gKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgLyogc2Vzc2lvbl9pZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhS2V5RXJyb3JDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgLyogc3lzdGVtX2NvZGUgKi8pIHsKLSAgICBOT1RJTVBMRU1FTlRFRCgpOwotICB9Ci0gIHZpcnR1YWwgdm9pZCBLZXlNZXNzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiAvKiBrZXlfc3lzdGVtICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgLyogc2Vzc2lvbl9pZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogLyogbWVzc2FnZSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgLyogbWVzc2FnZV9sZW5ndGggKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiAvKiBkZWZhdWx0X3VybCAqLykgewotICAgIE5PVElNUExFTUVOVEVEKCk7Ci0gIH0KLSAgdmlydHVhbCB2b2lkIEtleU5lZWRlZChjb25zdCBzdGQ6OnN0cmluZyYgLyoga2V5X3N5c3RlbSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgLyogc2Vzc2lvbl9pZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiAvKiBpbml0X2RhdGEgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgLyogaW5pdF9kYXRhX2xlbmd0aCAqLykgewotICAgIE5PVElNUExFTUVOVEVEKCk7Ci0gIH0KLSAgLy8gVE9ETzogUmV2aXNpdCB0aGUgbmVjZXNzaXR5IG9mIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zLgotICB2aXJ0dWFsIHZvaWQgQ2xvc2VIZWxwZXJQbHVnaW4oKSB7IE5PVFJFQUNIRUQoKTsgfQotICB2aXJ0dWFsIHZvaWQgRGlzYWJsZUFjY2VsZXJhdGVkQ29tcG9zaXRpbmcoKSB7fQotCi0gcHJvdGVjdGVkOgotICB+V2ViTWVkaWFQbGF5ZXJDbGllbnQoKSB7fQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLU1TVkNfUE9QX1dBUk5JTkcoKQotCi0jZW5kaWYgIC8vIE1FRElBX1BMQVlFUl9XRUJfTUVESUFfUExBWUVSX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfZGVsZWdhdGUuaCBiL3NyYy9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9kZWxlZ2F0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjM3ZjZjLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9kZWxlZ2F0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9QTEFZRVJfV0VCX01FRElBX1BMQVlFUl9ERUxFR0FURV9IXwotI2RlZmluZSBNRURJQV9QTEFZRVJfV0VCX01FRElBX1BMQVlFUl9ERUxFR0FURV9IXwotCi0jaW5jbHVkZSAiYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBXZWJNZWRpYVBsYXllcjsKLQotY2xhc3MgV2ViTWVkaWFQbGF5ZXJEZWxlZ2F0ZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXJQbGF5ZXIoV2ViTWVkaWFQbGF5ZXIqIHBsYXllcikgPSAwOwotICB2aXJ0dWFsIHZvaWQgVW5yZWdpc3RlclBsYXllcihXZWJNZWRpYVBsYXllciogcGxheWVyKSA9IDA7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgfldlYk1lZGlhUGxheWVyRGVsZWdhdGUoKSB7fQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfUExBWUVSX1dFQl9NRURJQV9QTEFZRVJfREVMRUdBVEVfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9pbXBsLmNjIGIvc3JjL21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyX2ltcGwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NDIxOWQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyX2ltcGwuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAyICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0jaW5jbHVkZSAibWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfaW1wbC5oIgotCi0jaW5jbHVkZSA8bWF0aC5oPgotCi0jaW5jbHVkZSA8bGltaXRzPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2JpbmRfaGVscGVycy5oIgotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKLSNpbmNsdWRlICJiYXNlL2Zsb2F0X3V0aWwuaCIKLSNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcF9wcm94eS5oIgotI2luY2x1ZGUgImJhc2UvbWV0cmljcy9oaXN0b2dyYW0uaCIKLSNpbmNsdWRlICJiYXNlL3N0cmluZ19udW1iZXJfY29udmVyc2lvbnMuaCIKLSNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi93YWl0YWJsZV9ldmVudC5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL3NoZWxsX2F1ZGlvX3NpbmsuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2JpbmRfdG9fbG9vcC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZmlsdGVyX2NvbGxlY3Rpb24uaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2xpbWl0cy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfbG9nLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb19mcmFtZS5oIgotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvY2h1bmtfZGVtdXhlci5oIgotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvc2hlbGxfYXVkaW9fcmVuZGVyZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL3NoZWxsX2RlbXV4ZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL3ZpZGVvX3JlbmRlcmVyX2Jhc2UuaCIKLSNpbmNsdWRlICJtZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9wcm94eS5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotbmFtZXNwYWNlIHsKLQotLy8gVXNlZCB0byBlbnN1cmUgdGhhdCB0aGVyZSBpcyBubyBtb3JlIHRoYW4gb25lIGluc3RhbmNlIG9mIFdlYk1lZGlhUGxheWVySW1wbC4KLVdlYk1lZGlhUGxheWVySW1wbCogc19pbnN0YW5jZTsKLQotLy8gTGltaXRzIHRoZSByYW5nZSBvZiBwbGF5YmFjayByYXRlLgotLy8KLS8vIFRPRE8oa3lsZXApOiBSZXZpc2l0IHRoZXNlLgotLy8KLS8vIFZpc3RhIGhhcyBzdWJzdGFudGlhbGx5IGxvd2VyIHBlcmZvcm1hbmNlIHRoYW4gWFAgb3IgV2luZG93czcuICBJZiB5b3Ugc3BlZWQKLS8vIHVwIGEgdmlkZW8gdG9vIG11Y2gsIGl0IGNhbid0IGtlZXAgdXAsIGFuZCByZW5kZXJpbmcgc3RvcHMgdXBkYXRpbmcgZXhjZXB0IG9uCi0vLyB0aGUgdGltZSBiYXIuIEZvciByZWFsbHkgaGlnaCBzcGVlZHMsIGF1ZGlvIGJlY29tZXMgYSBib3R0bGVuZWNrIGFuZCB3ZSBqdXN0Ci0vLyB1c2UgdXAgdGhlIGRhdGEgd2UgaGF2ZSwgd2hpY2ggbWF5IG5vdCBhY2hpZXZlIHRoZSBzcGVlZCByZXF1ZXN0ZWQsIGJ1dCB3aWxsCi0vLyBub3QgY3Jhc2ggdGhlIHRhYi4KLS8vCi0vLyBBIHZlcnkgc2xvdyBzcGVlZCwgaWUgMC4wMDAwMDAwMXgsIGNhdXNlcyB0aGUgbWFjaGluZSB0byBsb2NrIHVwLiAoSXQgc2VlbXMKLS8vIGxpa2UgYSBidXN5IGxvb3ApLiBJdCBnZXRzIHVucmVzcG9uc2l2ZSwgYWx0aG91Z2ggaXRzIG5vdCBjb21wbGV0ZWx5IGRlYWQuCi0vLwotLy8gQWxzbyBvdXIgdGltZXJzIGFyZSBub3QgdmVyeSBhY2N1cmF0ZSAoZXNwZWNpYWxseSBmb3Igb2dnKSwgd2hpY2ggYmVjb21lcwotLy8gZXZpZGVudCBhdCBsb3cgc3BlZWRzIGFuZCBvbiBWaXN0YS4gU2luY2Ugb3RoZXIgc3BlZWRzIGFyZSByaXNreSBhbmQgb3V0c2lkZQotLy8gdGhlIG5vcm1zLCB3ZSB0aGluayAxLzE2eCB0byAxNnggaXMgYSBzYWZlIGFuZCB1c2VmdWwgcmFuZ2UgZm9yIG5vdy4KLWNvbnN0IGZsb2F0IGtNaW5SYXRlID0gMC4wNjI1ZjsKLWNvbnN0IGZsb2F0IGtNYXhSYXRlID0gMTYuMGY7Ci0KLS8vIFByZWZpeCBmb3IgaGlzdG9ncmFtcyByZWxhdGVkIHRvIEVuY3J5cHRlZCBNZWRpYSBFeHRlbnNpb25zLgotY29uc3QgY2hhcioga01lZGlhRW1lID0gIk1lZGlhLkVNRS4iOwotCi0jaWYgZGVmaW5lZChDT0JBTFRfU0tJUF9TRUVLX1JFUVVFU1RfTkVBUl9FTkQpCi0vLyBPbiBzb21lIHBsYXRmb3JtcywgdGhlIHVuZGVybHlpbmcgbWVkaWEgcGxheWVyIGNhbiBoYW5nIGlmIHdlIGtlZXAgc2Vla2luZyB0bwotLy8gYSBwb3NpdGlvbiB0aGF0IGlzIG5lYXIgdGhlIGVuZCBvZiB0aGUgdmlkZW8uIFNvIHdlIGlnbm9yZSBhbnkgc2Vla3MgbmVhciB0aGUKLS8vIGVuZCBvZiBzdHJlYW0gcG9zaXRpb24gd2hlbiB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbiBpcyBhbHNvIG5lYXIgdGhlCi0vLyBlbmQgb2YgdGhlIHN0cmVhbS4gSW4gdGhpcyBjYXNlLCAibmVhciB0aGUgZW5kIG9mIHN0cmVhbSIgbWVhbnMgInBvc2l0aW9uCi0vLyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gZHVyYXRpb24oKSAtIGtFbmRPZlN0cmVhbUVwc2lsb25JblNlY29uZHMiLgotY29uc3QgZG91YmxlIGtFbmRPZlN0cmVhbUVwc2lsb25JblNlY29uZHMgPSAyLjsKLQotYm9vbCBJc05lYXJUaGVFbmRPZlN0cmVhbShjb25zdCBtZWRpYTo6V2ViTWVkaWFQbGF5ZXJJbXBsKiB3bXBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcG9zaXRpb24pIHsKLSAgZmxvYXQgZHVyYXRpb24gPSB3bXBpLT5HZXREdXJhdGlvbigpOwotICBpZiAoYmFzZTo6SXNGaW5pdGUoZHVyYXRpb24pKSB7Ci0gICAgLy8gSWYgdmlkZW8gaXMgdmVyeSBzaG9ydCwgd2UgYWx3YXlzIHRyZWF0IGEgcG9zaXRpb24gYXMgbmVhciB0aGUgZW5kLgotICAgIGlmIChkdXJhdGlvbiA8PSBrRW5kT2ZTdHJlYW1FcHNpbG9uSW5TZWNvbmRzKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgaWYgKHBvc2l0aW9uID49IGR1cmF0aW9uIC0ga0VuZE9mU3RyZWFtRXBzaWxvbkluU2Vjb25kcykKLSAgICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLSNlbmRpZiAgLy8gZGVmaW5lZChDT0JBTFRfU0tJUF9TRUVLX1JFUVVFU1RfTkVBUl9FTkQpCi0KLWJhc2U6OlRpbWVEZWx0YSBDb252ZXJ0U2Vjb25kc1RvVGltZXN0YW1wKGZsb2F0IHNlY29uZHMpIHsKLSAgZmxvYXQgbWljcm9zZWNvbmRzID0gc2Vjb25kcyAqIGJhc2U6OlRpbWU6OmtNaWNyb3NlY29uZHNQZXJTZWNvbmQ7Ci0gIGZsb2F0IGludGVnZXIgPSBjZWlsZihtaWNyb3NlY29uZHMpOwotICBmbG9hdCBkaWZmZXJlbmNlID0gaW50ZWdlciAtIG1pY3Jvc2Vjb25kczsKLQotICAvLyBSb3VuZCBkb3duIGlmIGRpZmZlcmVuY2UgaXMgbGFyZ2UgZW5vdWdoLgotICBpZiAoKG1pY3Jvc2Vjb25kcyA+IDAgJiYgZGlmZmVyZW5jZSA+IDAuNWYpIHx8Ci0gICAgICAobWljcm9zZWNvbmRzIDw9IDAgJiYgZGlmZmVyZW5jZSA+PSAwLjVmKSkgewotICAgIGludGVnZXIgLT0gMS4wZjsKLSAgfQotCi0gIC8vIE5vdyB3ZSBjYW4gc2FmZWx5IGNhc3QgdG8gaW50NjQgbWljcm9zZWNvbmRzLgotICByZXR1cm4gYmFzZTo6VGltZURlbHRhOjpGcm9tTWljcm9zZWNvbmRzKHN0YXRpY19jYXN0PGludDY0PihpbnRlZ2VyKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0jZGVmaW5lIEJJTkRfVE9fUkVOREVSX0xPT1AoZnVuY3Rpb24pICAgICAgICAgIFwKLSAgQmluZFRvTG9vcChtYWluX2xvb3BfLT5tZXNzYWdlX2xvb3BfcHJveHkoKSwgXAotICAgICAgICAgICAgIGJhc2U6OkJpbmQoZnVuY3Rpb24sIEFzV2Vha1B0cigpKSkKLQotI2RlZmluZSBCSU5EX1RPX1JFTkRFUl9MT09QXzIoZnVuY3Rpb24sIGFyZzEsIGFyZzIpIFwKLSAgQmluZFRvTG9vcChtYWluX2xvb3BfLT5tZXNzYWdlX2xvb3BfcHJveHkoKSwgICAgICBcCi0gICAgICAgICAgICAgYmFzZTo6QmluZChmdW5jdGlvbiwgQXNXZWFrUHRyKCksIGFyZzEsIGFyZzIpKQotCi0vLyBUT0RPKGFjb2x3ZWxsKTogSW52ZXN0aWdhdGUgd2hldGhlciB0aGUga2V5X3N5c3RlbSAmIHNlc3Npb25faWQgcGFyYW1ldGVycwotLy8gYXJlIHJlYWxseSBuZWNlc3NhcnkuCi10eXBlZGVmIGJhc2U6OkNhbGxiYWNrPAotICAgIHZvaWQoY29uc3Qgc3RkOjpzdHJpbmcmLCBjb25zdCBzdGQ6OnN0cmluZyYsIHNjb3BlZF9hcnJheTx1aW50OD4sIGludCk+Ci0gICAgT25OZWVkS2V5Q0I7Ci0KLXN0YXRpYyB2b2lkIExvZ01lZGlhU291cmNlRXJyb3IoY29uc3Qgc2NvcGVkX3JlZnB0cjxNZWRpYUxvZz4mIG1lZGlhX2xvZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yKSB7Ci0gIG1lZGlhX2xvZy0+QWRkRXZlbnQobWVkaWFfbG9nLT5DcmVhdGVNZWRpYVNvdXJjZUVycm9yRXZlbnQoZXJyb3IpKTsKLX0KLQotV2ViTWVkaWFQbGF5ZXJJbXBsOjpXZWJNZWRpYVBsYXllckltcGwoCi0gICAgUGlwZWxpbmVXaW5kb3cgd2luZG93LAotICAgIFdlYk1lZGlhUGxheWVyQ2xpZW50KiBjbGllbnQsCi0gICAgV2ViTWVkaWFQbGF5ZXJEZWxlZ2F0ZSogZGVsZWdhdGUsCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxTaGVsbFZpZGVvRnJhbWVQcm92aWRlcj4mIHZpZGVvX2ZyYW1lX3Byb3ZpZGVyLAotICAgIHNjb3BlZF9wdHI8RmlsdGVyQ29sbGVjdGlvbj4gY29sbGVjdGlvbiwKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPEF1ZGlvUmVuZGVyZXJTaW5rPiYgYXVkaW9fcmVuZGVyZXJfc2luaywKLSAgICBzY29wZWRfcHRyPE1lc3NhZ2VMb29wRmFjdG9yeT4gbWVzc2FnZV9sb29wX2ZhY3RvcnksCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxNZWRpYUxvZz4mIG1lZGlhX2xvZykKLSAgICA6IG5ldHdvcmtfc3RhdGVfKFdlYk1lZGlhUGxheWVyOjprTmV0d29ya1N0YXRlRW1wdHkpLAotICAgICAgcmVhZHlfc3RhdGVfKFdlYk1lZGlhUGxheWVyOjprUmVhZHlTdGF0ZUhhdmVOb3RoaW5nKSwKLSAgICAgIG1haW5fbG9vcF8oTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSksCi0gICAgICBmaWx0ZXJfY29sbGVjdGlvbl8oY29sbGVjdGlvbi5QYXNzKCkpLAotICAgICAgbWVzc2FnZV9sb29wX2ZhY3RvcnlfKG1lc3NhZ2VfbG9vcF9mYWN0b3J5LlBhc3MoKSksCi0gICAgICBjbGllbnRfKGNsaWVudCksCi0gICAgICBkZWxlZ2F0ZV8oZGVsZWdhdGUpLAotICAgICAgdmlkZW9fZnJhbWVfcHJvdmlkZXJfKHZpZGVvX2ZyYW1lX3Byb3ZpZGVyKSwKLSAgICAgIHByb3h5XyhuZXcgV2ViTWVkaWFQbGF5ZXJQcm94eShtYWluX2xvb3BfLT5tZXNzYWdlX2xvb3BfcHJveHkoKSwgdGhpcykpLAotICAgICAgbWVkaWFfbG9nXyhtZWRpYV9sb2cpLAotICAgICAgaW5jcmVtZW50ZWRfZXh0ZXJuYWxseV9hbGxvY2F0ZWRfbWVtb3J5XyhmYWxzZSksCi0gICAgICBhdWRpb19yZW5kZXJlcl9zaW5rXyhhdWRpb19yZW5kZXJlcl9zaW5rKSwKLSAgICAgIGlzX2xvY2FsX3NvdXJjZV8oZmFsc2UpLAotICAgICAgc3VwcG9ydHNfc2F2ZV8odHJ1ZSksCi0gICAgICBzdXBwcmVzc19kZXN0cnVjdGlvbl9lcnJvcnNfKGZhbHNlKSB7Ci0gIERMT0dfSUYoRVJST1IsIHNfaW5zdGFuY2UpCi0gICAgICA8PCAiTW9yZSB0aGFuIG9uZSBXZWJNZWRpYVBsYXllckltcGwgaGFzIGJlZW4gY3JlYXRlZC4iOwotICBzX2luc3RhbmNlID0gdGhpczsKLQotICBtZWRpYV9sb2dfLT5BZGRFdmVudCgKLSAgICAgIG1lZGlhX2xvZ18tPkNyZWF0ZUV2ZW50KE1lZGlhTG9nRXZlbnQ6OldFQk1FRElBUExBWUVSX0NSRUFURUQpKTsKLQotICBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+IHBpcGVsaW5lX21lc3NhZ2VfbG9vcCA9Ci0gICAgICBtZXNzYWdlX2xvb3BfZmFjdG9yeV8tPkdldE1lc3NhZ2VMb29wKE1lc3NhZ2VMb29wRmFjdG9yeTo6a1BpcGVsaW5lKTsKLSAgcGlwZWxpbmVfID0gUGlwZWxpbmU6OkNyZWF0ZSh3aW5kb3csIHBpcGVsaW5lX21lc3NhZ2VfbG9vcCwgbWVkaWFfbG9nXyk7Ci0KLSAgLy8gQWxzbyB3ZSB3YW50IHRvIGJlIG5vdGlmaWVkIG9mIHxtYWluX2xvb3BffCBkZXN0cnVjdGlvbi4KLSAgbWFpbl9sb29wXy0+QWRkRGVzdHJ1Y3Rpb25PYnNlcnZlcih0aGlzKTsKLQotICBTZXREZWNyeXB0b3JSZWFkeUNCIHNldF9kZWNyeXB0b3JfcmVhZHlfY2I7Ci0KLSAgZGVjcnlwdG9yXy5yZXNldChuZXcgUHJveHlEZWNyeXB0b3IocHJveHlfLmdldCgpKSk7Ci0gIHNldF9kZWNyeXB0b3JfcmVhZHlfY2IgPSBiYXNlOjpCaW5kKCZQcm94eURlY3J5cHRvcjo6U2V0RGVjcnlwdG9yUmVhZHlDQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChkZWNyeXB0b3JfLmdldCgpKSk7Ci0KLSAgLy8gQ3JlYXRlIGRlZmF1bHQgdmlkZW8gcmVuZGVyZXIuCi0gIHNjb3BlZF9yZWZwdHI8VmlkZW9SZW5kZXJlckJhc2U+IHZpZGVvX3JlbmRlcmVyID0gbmV3IFZpZGVvUmVuZGVyZXJCYXNlKAotICAgICAgcGlwZWxpbmVfbWVzc2FnZV9sb29wLCBzZXRfZGVjcnlwdG9yX3JlYWR5X2NiLAotICAgICAgYmFzZTo6QmluZChiYXNlOjpEb05vdGhpbmcpLAotICAgICAgQklORF9UT19SRU5ERVJfTE9PUCgmV2ViTWVkaWFQbGF5ZXJJbXBsOjpTZXRPcGFxdWUpLCB0cnVlKTsKLSAgZmlsdGVyX2NvbGxlY3Rpb25fLT5BZGRWaWRlb1JlbmRlcmVyKHZpZGVvX3JlbmRlcmVyKTsKLSAgcHJveHlfLT5zZXRfZnJhbWVfcHJvdmlkZXIodmlkZW9fcmVuZGVyZXIpOwotCi0gIGlmIChhdWRpb19yZW5kZXJlcl9zaW5rKSB7Ci0gICAgZmlsdGVyX2NvbGxlY3Rpb25fLT5BZGRBdWRpb1JlbmRlcmVyKFNoZWxsQXVkaW9SZW5kZXJlcjo6Q3JlYXRlKAotICAgICAgICBhdWRpb19yZW5kZXJlcl9zaW5rLCBzZXRfZGVjcnlwdG9yX3JlYWR5X2NiLCBwaXBlbGluZV9tZXNzYWdlX2xvb3ApKTsKLSAgfQotCi0gIGlmICh2aWRlb19mcmFtZV9wcm92aWRlcl8pIHsKLSAgICBtZWRpYV90aW1lX2FuZF9zZWVraW5nX3N0YXRlX2NiXyA9Ci0gICAgICAgIGJhc2U6OkJpbmQoJldlYk1lZGlhUGxheWVySW1wbDo6R2V0TWVkaWFUaW1lQW5kU2Vla2luZ1N0YXRlLAotICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpOwotICAgIHZpZGVvX2ZyYW1lX3Byb3ZpZGVyXy0+UmVnaXN0ZXJNZWRpYVRpbWVBbmRTZWVraW5nU3RhdGVDQigKLSAgICAgICAgbWVkaWFfdGltZV9hbmRfc2Vla2luZ19zdGF0ZV9jYl8pOwotICB9Ci0gIGlmIChkZWxlZ2F0ZV8pIHsKLSAgICBkZWxlZ2F0ZV8tPlJlZ2lzdGVyUGxheWVyKHRoaXMpOwotICB9Ci19Ci0KLVdlYk1lZGlhUGxheWVySW1wbDo6fldlYk1lZGlhUGxheWVySW1wbCgpIHsKLSAgRENIRUNLKCFtYWluX2xvb3BfIHx8IG1haW5fbG9vcF8gPT0gTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7Ci0KLSAgRExPR19JRihFUlJPUiwgc19pbnN0YW5jZSAhPSB0aGlzKQotICAgICAgPDwgIk1vcmUgdGhhbiBvbmUgV2ViTWVkaWFQbGF5ZXJJbXBsIGhhcyBiZWVuIGNyZWF0ZWQuIjsKLSAgc19pbnN0YW5jZSA9IE5VTEw7Ci0KLSAgaWYgKGRlbGVnYXRlXykgewotICAgIGRlbGVnYXRlXy0+VW5yZWdpc3RlclBsYXllcih0aGlzKTsKLSAgfQotCi0gIGlmICh2aWRlb19mcmFtZV9wcm92aWRlcl8pIHsKLSAgICBEQ0hFQ0soIW1lZGlhX3RpbWVfYW5kX3NlZWtpbmdfc3RhdGVfY2JfLmlzX251bGwoKSk7Ci0gICAgdmlkZW9fZnJhbWVfcHJvdmlkZXJfLT5VbnJlZ2lzdGVyTWVkaWFUaW1lQW5kU2Vla2luZ1N0YXRlQ0IoCi0gICAgICAgIG1lZGlhX3RpbWVfYW5kX3NlZWtpbmdfc3RhdGVfY2JfKTsKLSAgICBtZWRpYV90aW1lX2FuZF9zZWVraW5nX3N0YXRlX2NiXy5SZXNldCgpOwotICB9Ci0KLSNpZiBkZWZpbmVkKF9fTEJfQU5EUk9JRF9fKQotICBhdWRpb19mb2N1c19icmlkZ2VfLkFiYW5kb25BdWRpb0ZvY3VzKCk7Ci0jZW5kaWYgIC8vIGRlZmluZWQoX19MQl9BTkRST0lEX18pCi0KLSAgZGVjcnlwdG9yXy0+RGVzdHJveVNvb24oKTsKLSAgRGVzdHJveSgpOwotICBtZWRpYV9sb2dfLT5BZGRFdmVudCgKLSAgICAgIG1lZGlhX2xvZ18tPkNyZWF0ZUV2ZW50KE1lZGlhTG9nRXZlbnQ6OldFQk1FRElBUExBWUVSX0RFU1RST1lFRCkpOwotCi0gIC8vIEZpbmFsbHkgdGVsbCB0aGUgfG1haW5fbG9vcF98IHdlIGRvbid0IHdhbnQgdG8gYmUgbm90aWZpZWQgb2YgZGVzdHJ1Y3Rpb24KLSAgLy8gZXZlbnQuCi0gIGlmIChtYWluX2xvb3BfKSB7Ci0gICAgbWFpbl9sb29wXy0+UmVtb3ZlRGVzdHJ1Y3Rpb25PYnNlcnZlcih0aGlzKTsKLSAgfQotfQotCi1uYW1lc3BhY2UgewotCi0vLyBIZWxwZXIgZW51bSBmb3IgcmVwb3J0aW5nIHNjaGVtZSBoaXN0b2dyYW1zLgotZW51bSBVUkxTY2hlbWVGb3JIaXN0b2dyYW0gewotICBrVW5rbm93blVSTFNjaGVtZSwKLSAga01pc3NpbmdVUkxTY2hlbWUsCi0gIGtIdHRwVVJMU2NoZW1lLAotICBrSHR0cHNVUkxTY2hlbWUsCi0gIGtGdHBVUkxTY2hlbWUsCi0gIGtDaHJvbWVFeHRlbnNpb25VUkxTY2hlbWUsCi0gIGtKYXZhc2NyaXB0VVJMU2NoZW1lLAotICBrRmlsZVVSTFNjaGVtZSwKLSAga0Jsb2JVUkxTY2hlbWUsCi0gIGtEYXRhVVJMU2NoZW1lLAotICBrRmlsZVN5c3RlbVNjaGVtZSwKLSAga01heFVSTFNjaGVtZSA9IGtGaWxlU3lzdGVtU2NoZW1lICAvLyBNdXN0IGJlIGVxdWFsIHRvIGhpZ2hlc3QgZW51bSB2YWx1ZS4KLX07Ci0KLVVSTFNjaGVtZUZvckhpc3RvZ3JhbSBVUkxTY2hlbWUoY29uc3QgR1VSTCYgdXJsKSB7Ci0gIGlmICghdXJsLmhhc19zY2hlbWUoKSkKLSAgICByZXR1cm4ga01pc3NpbmdVUkxTY2hlbWU7Ci0gIGlmICh1cmwuU2NoZW1lSXMoImh0dHAiKSkKLSAgICByZXR1cm4ga0h0dHBVUkxTY2hlbWU7Ci0gIGlmICh1cmwuU2NoZW1lSXMoImh0dHBzIikpCi0gICAgcmV0dXJuIGtIdHRwc1VSTFNjaGVtZTsKLSAgaWYgKHVybC5TY2hlbWVJcygiZnRwIikpCi0gICAgcmV0dXJuIGtGdHBVUkxTY2hlbWU7Ci0gIGlmICh1cmwuU2NoZW1lSXMoImNocm9tZS1leHRlbnNpb24iKSkKLSAgICByZXR1cm4ga0Nocm9tZUV4dGVuc2lvblVSTFNjaGVtZTsKLSAgaWYgKHVybC5TY2hlbWVJcygiamF2YXNjcmlwdCIpKQotICAgIHJldHVybiBrSmF2YXNjcmlwdFVSTFNjaGVtZTsKLSAgaWYgKHVybC5TY2hlbWVJcygiZmlsZSIpKQotICAgIHJldHVybiBrRmlsZVVSTFNjaGVtZTsKLSAgaWYgKHVybC5TY2hlbWVJcygiYmxvYiIpKQotICAgIHJldHVybiBrQmxvYlVSTFNjaGVtZTsKLSAgaWYgKHVybC5TY2hlbWVJcygiZGF0YSIpKQotICAgIHJldHVybiBrRGF0YVVSTFNjaGVtZTsKLSAgaWYgKHVybC5TY2hlbWVJcygiZmlsZXN5c3RlbSIpKQotICAgIHJldHVybiBrRmlsZVN5c3RlbVNjaGVtZTsKLSAgcmV0dXJuIGtVbmtub3duVVJMU2NoZW1lOwotfQotCi19ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCi0KLXZvaWQgV2ViTWVkaWFQbGF5ZXJJbXBsOjpMb2FkTWVkaWFTb3VyY2UoKSB7Ci0gIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLSAgRENIRUNLKGZpbHRlcl9jb2xsZWN0aW9uXyk7Ci0KLSAgLy8gSGFuZGxlIGFueSB2b2x1bWUgY2hhbmdlcyB0aGF0IG9jY3VyZWQgYmVmb3JlIGxvYWQoKS4KLSAgU2V0Vm9sdW1lKEdldENsaWVudCgpLT5Wb2x1bWUoKSk7Ci0KLSAgU2V0TmV0d29ya1N0YXRlKFdlYk1lZGlhUGxheWVyOjprTmV0d29ya1N0YXRlTG9hZGluZyk7Ci0gIFNldFJlYWR5U3RhdGUoV2ViTWVkaWFQbGF5ZXI6OmtSZWFkeVN0YXRlSGF2ZU5vdGhpbmcpOwotCi0gIHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4gbWVzc2FnZV9sb29wID0KLSAgICAgIG1lc3NhZ2VfbG9vcF9mYWN0b3J5Xy0+R2V0TWVzc2FnZUxvb3AoTWVzc2FnZUxvb3BGYWN0b3J5OjprUGlwZWxpbmUpOwotCi0gIC8vIE1lZGlhIHNvdXJjZSBwaXBlbGluZXMgY2FuIHN0YXJ0IGltbWVkaWF0ZWx5LgotICBjaHVua19kZW11eGVyXyA9IG5ldyBDaHVua0RlbXV4ZXIoCi0gICAgICBCSU5EX1RPX1JFTkRFUl9MT09QKCZXZWJNZWRpYVBsYXllckltcGw6Ok9uRGVtdXhlck9wZW5lZCksCi0gICAgICBCSU5EX1RPX1JFTkRFUl9MT09QXzIoJldlYk1lZGlhUGxheWVySW1wbDo6T25OZWVkS2V5LCAiIiwgIiIpLAotICAgICAgYmFzZTo6QmluZCgmTG9nTWVkaWFTb3VyY2VFcnJvciwgbWVkaWFfbG9nXykpOwotCi0gIGZpbHRlcl9jb2xsZWN0aW9uXy0+U2V0RGVtdXhlcihjaHVua19kZW11eGVyXyk7Ci0gIHN1cHBvcnRzX3NhdmVfID0gZmFsc2U7Ci0gIHN0YXRlXy5pc19tZWRpYV9zb3VyY2UgPSB0cnVlOwotICBTdGFydFBpcGVsaW5lKCk7Ci19Ci0KLXZvaWQgV2ViTWVkaWFQbGF5ZXJJbXBsOjpMb2FkUHJvZ3Jlc3NpdmUoCi0gICAgY29uc3QgR1VSTCYgdXJsLAotICAgIHNjb3BlZF9wdHI8QnVmZmVyZWREYXRhU291cmNlPiBkYXRhX3NvdXJjZSwKLSAgICBDT1JTTW9kZSBjb3JzX21vZGUpIHsKLSAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotICBEQ0hFQ0soZmlsdGVyX2NvbGxlY3Rpb25fKTsKLQotICBVTUFfSElTVE9HUkFNX0VOVU1FUkFUSU9OKCJNZWRpYS5VUkxTY2hlbWUiLCBVUkxTY2hlbWUodXJsKSwga01heFVSTFNjaGVtZSk7Ci0KLSAgLy8gSGFuZGxlIGFueSB2b2x1bWUgY2hhbmdlcyB0aGF0IG9jY3VyZWQgYmVmb3JlIGxvYWQoKS4KLSAgU2V0Vm9sdW1lKEdldENsaWVudCgpLT5Wb2x1bWUoKSk7Ci0KLSAgU2V0TmV0d29ya1N0YXRlKFdlYk1lZGlhUGxheWVyOjprTmV0d29ya1N0YXRlTG9hZGluZyk7Ci0gIFNldFJlYWR5U3RhdGUoV2ViTWVkaWFQbGF5ZXI6OmtSZWFkeVN0YXRlSGF2ZU5vdGhpbmcpOwotICBtZWRpYV9sb2dfLT5BZGRFdmVudChtZWRpYV9sb2dfLT5DcmVhdGVMb2FkRXZlbnQodXJsLnNwZWMoKSkpOwotCi0gIHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4gbWVzc2FnZV9sb29wID0KLSAgICAgIG1lc3NhZ2VfbG9vcF9mYWN0b3J5Xy0+R2V0TWVzc2FnZUxvb3AoTWVzc2FnZUxvb3BGYWN0b3J5OjprUGlwZWxpbmUpOwotCi0gIGRhdGFfc291cmNlLT5TZXREb3dubG9hZGluZ1N0YXR1c0NCKAotICAgICAgYmFzZTo6QmluZCgmV2ViTWVkaWFQbGF5ZXJJbXBsOjpPbkRvd25sb2FkaW5nU3RhdHVzQ2hhbmdlZCwgQXNXZWFrUHRyKCkpKTsKLSAgcHJveHlfLT5zZXRfZGF0YV9zb3VyY2UoZGF0YV9zb3VyY2UuUGFzcygpKTsKLQotICBpc19sb2NhbF9zb3VyY2VfID0gIXVybC5TY2hlbWVJcygiaHR0cCIpICYmICF1cmwuU2NoZW1lSXMoImh0dHBzIik7Ci0KLSAgZmlsdGVyX2NvbGxlY3Rpb25fLT5TZXREZW11eGVyKAotICAgICAgbmV3IFNoZWxsRGVtdXhlcihtZXNzYWdlX2xvb3AsIHByb3h5Xy0+ZGF0YV9zb3VyY2UoKSkpOwotCi0gIHN0YXRlXy5pc19wcm9ncmVzc2l2ZSA9IHRydWU7Ci0gIFN0YXJ0UGlwZWxpbmUoKTsKLX0KLQotdm9pZCBXZWJNZWRpYVBsYXllckltcGw6OkNhbmNlbExvYWQoKSB7Ci0gIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLX0KLQotdm9pZCBXZWJNZWRpYVBsYXllckltcGw6OlBsYXkoKSB7Ci0gIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLSNpZiBkZWZpbmVkKF9fTEJfQU5EUk9JRF9fKQotICBhdWRpb19mb2N1c19icmlkZ2VfLlJlcXVlc3RBdWRpb0ZvY3VzKCk7Ci0jZW5kaWYgIC8vIGRlZmluZWQoX19MQl9BTkRST0lEX18pCi0KLSAgc3RhdGVfLnBhdXNlZCA9IGZhbHNlOwotICBwaXBlbGluZV8tPlNldFBsYXliYWNrUmF0ZShzdGF0ZV8ucGxheWJhY2tfcmF0ZSk7Ci0KLSAgbWVkaWFfbG9nXy0+QWRkRXZlbnQobWVkaWFfbG9nXy0+Q3JlYXRlRXZlbnQoTWVkaWFMb2dFdmVudDo6UExBWSkpOwotfQotCi12b2lkIFdlYk1lZGlhUGxheWVySW1wbDo6UGF1c2UoKSB7Ci0gIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLSNpZiBkZWZpbmVkKF9fTEJfQU5EUk9JRF9fKQotICBhdWRpb19mb2N1c19icmlkZ2VfLkFiYW5kb25BdWRpb0ZvY3VzKCk7Ci0jZW5kaWYgIC8vIGRlZmluZWQoX19MQl9BTkRST0lEX18pCi0KLSAgc3RhdGVfLnBhdXNlZCA9IHRydWU7Ci0gIHBpcGVsaW5lXy0+U2V0UGxheWJhY2tSYXRlKDAuMGYpOwotICBzdGF0ZV8ucGF1c2VkX3RpbWUgPSBwaXBlbGluZV8tPkdldE1lZGlhVGltZSgpOwotCi0gIG1lZGlhX2xvZ18tPkFkZEV2ZW50KG1lZGlhX2xvZ18tPkNyZWF0ZUV2ZW50KE1lZGlhTG9nRXZlbnQ6OlBBVVNFKSk7Ci19Ci0KLWJvb2wgV2ViTWVkaWFQbGF5ZXJJbXBsOjpTdXBwb3J0c0Z1bGxzY3JlZW4oKSBjb25zdCB7Ci0gIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgV2ViTWVkaWFQbGF5ZXJJbXBsOjpTdXBwb3J0c1NhdmUoKSBjb25zdCB7Ci0gIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLSAgcmV0dXJuIHN1cHBvcnRzX3NhdmVfOwotfQotCi12b2lkIFdlYk1lZGlhUGxheWVySW1wbDo6U2VlayhmbG9hdCBzZWNvbmRzKSB7Ci0gIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLQotI2lmIGRlZmluZWQoQ09CQUxUX1NLSVBfU0VFS19SRVFVRVNUX05FQVJfRU5EKQotICAvLyBJZ25vcmUgYW55IHNlZWsgcmVxdWVzdCB0aGF0IGlzIG5lYXIgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIHdoZW4gdGhlCi0gIC8vIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24gaXMgYWxzbyBuZWFyIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSB0byBhdm9pZAotICAvLyBhIGhhbmcgaW4gdGhlIE1lZGlhRW5naW5lLgotICBpZiAoSXNOZWFyVGhlRW5kT2ZTdHJlYW0odGhpcywgR2V0Q3VycmVudFRpbWUoKSkgJiYKLSAgICAgIElzTmVhclRoZUVuZE9mU3RyZWFtKHRoaXMsIHNlY29uZHMpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0jZW5kaWYgIC8vIGRlZmluZWQoQ09CQUxUX1NLSVBfU0VFS19SRVFVRVNUX05FQVJfRU5EKQotCi0gIGlmIChzdGF0ZV8uc3RhcnRpbmcgfHwgc3RhdGVfLnNlZWtpbmcpIHsKLSAgICBzdGF0ZV8ucGVuZGluZ19zZWVrID0gdHJ1ZTsKLSAgICBzdGF0ZV8ucGVuZGluZ19zZWVrX3NlY29uZHMgPSBzZWNvbmRzOwotICAgIGlmIChjaHVua19kZW11eGVyXykgewotICAgICAgY2h1bmtfZGVtdXhlcl8tPkNhbmNlbFBlbmRpbmdTZWVrKCk7Ci0gICAgICBkZWNyeXB0b3JfLT5DYW5jZWxEZWNyeXB0KERlY3J5cHRvcjo6a0F1ZGlvKTsKLSAgICAgIGRlY3J5cHRvcl8tPkNhbmNlbERlY3J5cHQoRGVjcnlwdG9yOjprVmlkZW8pOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICBtZWRpYV9sb2dfLT5BZGRFdmVudChtZWRpYV9sb2dfLT5DcmVhdGVTZWVrRXZlbnQoc2Vjb25kcykpOwotCi0gIGJhc2U6OlRpbWVEZWx0YSBzZWVrX3RpbWUgPSBDb252ZXJ0U2Vjb25kc1RvVGltZXN0YW1wKHNlY29uZHMpOwotCi0gIC8vIFVwZGF0ZSBvdXIgcGF1c2VkIHRpbWUuCi0gIGlmIChzdGF0ZV8ucGF1c2VkKQotICAgIHN0YXRlXy5wYXVzZWRfdGltZSA9IHNlZWtfdGltZTsKLQotICBzdGF0ZV8uc2Vla2luZyA9IHRydWU7Ci0KLSAgaWYgKGNodW5rX2RlbXV4ZXJfKSB7Ci0gICAgY2h1bmtfZGVtdXhlcl8tPlN0YXJ0V2FpdGluZ0ZvclNlZWsoKTsKLSAgICBkZWNyeXB0b3JfLT5DYW5jZWxEZWNyeXB0KERlY3J5cHRvcjo6a0F1ZGlvKTsKLSAgICBkZWNyeXB0b3JfLT5DYW5jZWxEZWNyeXB0KERlY3J5cHRvcjo6a1ZpZGVvKTsKLSAgfQotCi0gIC8vIEtpY2sgb2ZmIHRoZSBhc3luY2hyb25vdXMgc2VlayEKLSAgcGlwZWxpbmVfLT5TZWVrKHNlZWtfdGltZSwKLSAgICAgICAgICAgICAgICAgIEJJTkRfVE9fUkVOREVSX0xPT1AoJldlYk1lZGlhUGxheWVySW1wbDo6T25QaXBlbGluZVNlZWspKTsKLX0KLQotdm9pZCBXZWJNZWRpYVBsYXllckltcGw6OlNldEVuZFRpbWUoZmxvYXQgc2Vjb25kcykgewotICBEQ0hFQ0tfRVEobWFpbl9sb29wXywgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7Ci0KLSAgLy8gVE9ETyhoY2xhbSk6IGFkZCBtZXRob2QgY2FsbCB3aGVuIGl0IGhhcyBiZWVuIGltcGxlbWVudGVkLgotICByZXR1cm47Ci19Ci0KLXZvaWQgV2ViTWVkaWFQbGF5ZXJJbXBsOjpTZXRSYXRlKGZsb2F0IHJhdGUpIHsKLSAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotCi0gIC8vIFRPRE8oa3lsZXApOiBSZW1vdmUgd2hlbiBzdXBwb3J0IGZvciBuZWdhdGl2ZXMgaXMgYWRkZWQuIEFsc28sIG1vZGlmeSB0aGUKLSAgLy8gZm9sbG93aW5nIGNoZWNrcyBzbyByZXdpbmQgdXNlcyByZWFzb25hYmxlIHZhbHVlcyBhbHNvLgotICBpZiAocmF0ZSA8IDAuMGYpCi0gICAgcmV0dXJuOwotCi0gIC8vIExpbWl0IHJhdGVzIHRvIHJlYXNvbmFibGUgdmFsdWVzIGJ5IGNsYW1waW5nLgotICBpZiAocmF0ZSAhPSAwLjBmKSB7Ci0gICAgaWYgKHJhdGUgPCBrTWluUmF0ZSkKLSAgICAgIHJhdGUgPSBrTWluUmF0ZTsKLSAgICBlbHNlIGlmIChyYXRlID4ga01heFJhdGUpCi0gICAgICByYXRlID0ga01heFJhdGU7Ci0gIH0KLQotICBzdGF0ZV8ucGxheWJhY2tfcmF0ZSA9IHJhdGU7Ci0gIGlmICghc3RhdGVfLnBhdXNlZCkgewotICAgIHBpcGVsaW5lXy0+U2V0UGxheWJhY2tSYXRlKHJhdGUpOwotICB9Ci19Ci0KLXZvaWQgV2ViTWVkaWFQbGF5ZXJJbXBsOjpTZXRWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLQotICBwaXBlbGluZV8tPlNldFZvbHVtZSh2b2x1bWUpOwotfQotCi12b2lkIFdlYk1lZGlhUGxheWVySW1wbDo6U2V0VmlzaWJsZShib29sIHZpc2libGUpIHsKLSAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotCi0gIC8vIFRPRE8oaGNsYW0pOiBhZGQgYXBwcm9wcmlhdGUgbWV0aG9kIGNhbGwgd2hlbiBwaXBlbGluZSBoYXMgaXQgaW1wbGVtZW50ZWQuCi0gIHJldHVybjsKLX0KLQotYm9vbCBXZWJNZWRpYVBsYXllckltcGw6OkdldFRvdGFsQnl0ZXNLbm93bigpIHsKLSAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotCi0gIHJldHVybiBwaXBlbGluZV8tPkdldFRvdGFsQnl0ZXMoKSAhPSAwOwotfQotCi1ib29sIFdlYk1lZGlhUGxheWVySW1wbDo6SGFzVmlkZW8oKSBjb25zdCB7Ci0gIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLQotICByZXR1cm4gcGlwZWxpbmVfLT5IYXNWaWRlbygpOwotfQotCi1ib29sIFdlYk1lZGlhUGxheWVySW1wbDo6SGFzQXVkaW8oKSBjb25zdCB7Ci0gIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLQotICByZXR1cm4gcGlwZWxpbmVfLT5IYXNBdWRpbygpOwotfQotCi1nZng6OlNpemUgV2ViTWVkaWFQbGF5ZXJJbXBsOjpHZXROYXR1cmFsU2l6ZSgpIGNvbnN0IHsKLSAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotCi0gIGdmeDo6U2l6ZSBzaXplOwotICBwaXBlbGluZV8tPkdldE5hdHVyYWxWaWRlb1NpemUoJnNpemUpOwotICByZXR1cm4gc2l6ZTsKLX0KLQotYm9vbCBXZWJNZWRpYVBsYXllckltcGw6OklzUGF1c2VkKCkgY29uc3QgewotICBEQ0hFQ0tfRVEobWFpbl9sb29wXywgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7Ci0KLSAgcmV0dXJuIHBpcGVsaW5lXy0+R2V0UGxheWJhY2tSYXRlKCkgPT0gMC4wZjsKLX0KLQotYm9vbCBXZWJNZWRpYVBsYXllckltcGw6OklzU2Vla2luZygpIGNvbnN0IHsKLSAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotCi0gIGlmIChyZWFkeV9zdGF0ZV8gPT0gV2ViTWVkaWFQbGF5ZXI6OmtSZWFkeVN0YXRlSGF2ZU5vdGhpbmcpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBzdGF0ZV8uc2Vla2luZzsKLX0KLQotZmxvYXQgV2ViTWVkaWFQbGF5ZXJJbXBsOjpHZXREdXJhdGlvbigpIGNvbnN0IHsKLSAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotCi0gIGlmIChyZWFkeV9zdGF0ZV8gPT0gV2ViTWVkaWFQbGF5ZXI6OmtSZWFkeVN0YXRlSGF2ZU5vdGhpbmcpCi0gICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjpxdWlldF9OYU4oKTsKLQotICBiYXNlOjpUaW1lRGVsdGEgZHVyYXRpb24gPSBwaXBlbGluZV8tPkdldE1lZGlhRHVyYXRpb24oKTsKLQotICAvLyBSZXR1cm4gcG9zaXRpdmUgaW5maW5pdHkgaWYgdGhlIHJlc291cmNlIGlzIHVuYm91bmRlZC4KLSAgLy8gaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvdmlkZW8uaHRtbCNkb20tbWVkaWEtZHVyYXRpb24KLSAgaWYgKGR1cmF0aW9uID09IGtJbmZpbml0ZUR1cmF0aW9uKCkpCi0gICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOwotCi0gIHJldHVybiBzdGF0aWNfY2FzdDxmbG9hdD4oZHVyYXRpb24uSW5TZWNvbmRzRigpKTsKLX0KLQotZmxvYXQgV2ViTWVkaWFQbGF5ZXJJbXBsOjpHZXRDdXJyZW50VGltZSgpIGNvbnN0IHsKLSAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotICBpZiAoc3RhdGVfLnBhdXNlZCkKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHN0YXRlXy5wYXVzZWRfdGltZS5JblNlY29uZHNGKCkpOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHBpcGVsaW5lXy0+R2V0TWVkaWFUaW1lKCkuSW5TZWNvbmRzRigpKTsKLX0KLQotaW50IFdlYk1lZGlhUGxheWVySW1wbDo6R2V0RGF0YVJhdGUoKSBjb25zdCB7Ci0gIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLQotICAvLyBUT0RPKGhjbGFtKTogQWRkIHRoaXMgbWV0aG9kIGNhbGwgaWYgcGlwZWxpbmUgaGFzIGl0IGluIHRoZSBpbnRlcmZhY2UuCi0gIHJldHVybiAwOwotfQotCi1XZWJNZWRpYVBsYXllcjo6TmV0d29ya1N0YXRlIFdlYk1lZGlhUGxheWVySW1wbDo6R2V0TmV0d29ya1N0YXRlKCkgY29uc3QgewotICBEQ0hFQ0tfRVEobWFpbl9sb29wXywgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7Ci0gIHJldHVybiBuZXR3b3JrX3N0YXRlXzsKLX0KLQotV2ViTWVkaWFQbGF5ZXI6OlJlYWR5U3RhdGUgV2ViTWVkaWFQbGF5ZXJJbXBsOjpHZXRSZWFkeVN0YXRlKCkgY29uc3QgewotICBEQ0hFQ0tfRVEobWFpbl9sb29wXywgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7Ci0gIHJldHVybiByZWFkeV9zdGF0ZV87Ci19Ci0KLWNvbnN0IFJhbmdlczxiYXNlOjpUaW1lRGVsdGE+JiBXZWJNZWRpYVBsYXllckltcGw6OkdldEJ1ZmZlcmVkVGltZVJhbmdlcygpIHsKLSAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotICBidWZmZXJlZF8gPSBwaXBlbGluZV8tPkdldEJ1ZmZlcmVkVGltZVJhbmdlcygpOwotICByZXR1cm4gYnVmZmVyZWRfOwotfQotCi1mbG9hdCBXZWJNZWRpYVBsYXllckltcGw6OkdldE1heFRpbWVTZWVrYWJsZSgpIGNvbnN0IHsKLSAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotCi0gIC8vIFdlIGRvbid0IHN1cHBvcnQgc2Vla2luZyBpbiBzdHJlYW1pbmcgbWVkaWEuCi0gIGlmIChwcm94eV8gJiYgcHJveHlfLT5kYXRhX3NvdXJjZSgpICYmIHByb3h5Xy0+ZGF0YV9zb3VyY2UoKS0+SXNTdHJlYW1pbmcoKSkKLSAgICByZXR1cm4gMC4wZjsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0PihwaXBlbGluZV8tPkdldE1lZGlhRHVyYXRpb24oKS5JblNlY29uZHNGKCkpOwotfQotCi12b2lkIFdlYk1lZGlhUGxheWVySW1wbDo6U3VzcGVuZCgpIHsKLSAgcGlwZWxpbmVfLT5TdXNwZW5kKCk7Ci19Ci0KLXZvaWQgV2ViTWVkaWFQbGF5ZXJJbXBsOjpSZXN1bWUoKSB7Ci0gIHBpcGVsaW5lXy0+UmVzdW1lKCk7Ci19Ci0KLWJvb2wgV2ViTWVkaWFQbGF5ZXJJbXBsOjpEaWRMb2FkaW5nUHJvZ3Jlc3MoKSBjb25zdCB7Ci0gIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLSAgcmV0dXJuIHBpcGVsaW5lXy0+RGlkTG9hZGluZ1Byb2dyZXNzKCk7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgbG9uZyBXZWJNZWRpYVBsYXllckltcGw6OkdldFRvdGFsQnl0ZXMoKSBjb25zdCB7Ci0gIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLQotICByZXR1cm4gcGlwZWxpbmVfLT5HZXRUb3RhbEJ5dGVzKCk7Ci19Ci0KLWJvb2wgV2ViTWVkaWFQbGF5ZXJJbXBsOjpIYXNTaW5nbGVTZWN1cml0eU9yaWdpbigpIGNvbnN0IHsKLSAgaWYgKHByb3h5XykKLSAgICByZXR1cm4gcHJveHlfLT5IYXNTaW5nbGVPcmlnaW4oKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgV2ViTWVkaWFQbGF5ZXJJbXBsOjpEaWRQYXNzQ09SU0FjY2Vzc0NoZWNrKCkgY29uc3QgewotICByZXR1cm4gcHJveHlfICYmIHByb3h5Xy0+RGlkUGFzc0NPUlNBY2Nlc3NDaGVjaygpOwotfQotCi1mbG9hdCBXZWJNZWRpYVBsYXllckltcGw6Ok1lZGlhVGltZUZvclRpbWVWYWx1ZShmbG9hdCB0aW1lVmFsdWUpIGNvbnN0IHsKLSAgcmV0dXJuIENvbnZlcnRTZWNvbmRzVG9UaW1lc3RhbXAodGltZVZhbHVlKS5JblNlY29uZHNGKCk7Ci19Ci0KLXVuc2lnbmVkIFdlYk1lZGlhUGxheWVySW1wbDo6R2V0RGVjb2RlZEZyYW1lQ291bnQoKSBjb25zdCB7Ci0gIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLQotICBQaXBlbGluZVN0YXRpc3RpY3Mgc3RhdHMgPSBwaXBlbGluZV8tPkdldFN0YXRpc3RpY3MoKTsKLSAgcmV0dXJuIHN0YXRzLnZpZGVvX2ZyYW1lc19kZWNvZGVkOwotfQotCi11bnNpZ25lZCBXZWJNZWRpYVBsYXllckltcGw6OkdldERyb3BwZWRGcmFtZUNvdW50KCkgY29uc3QgewotICBEQ0hFQ0tfRVEobWFpbl9sb29wXywgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7Ci0KLSAgUGlwZWxpbmVTdGF0aXN0aWNzIHN0YXRzID0gcGlwZWxpbmVfLT5HZXRTdGF0aXN0aWNzKCk7Ci0gIHJldHVybiBzdGF0cy52aWRlb19mcmFtZXNfZHJvcHBlZDsKLX0KLQotdW5zaWduZWQgV2ViTWVkaWFQbGF5ZXJJbXBsOjpHZXRBdWRpb0RlY29kZWRCeXRlQ291bnQoKSBjb25zdCB7Ci0gIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLQotICBQaXBlbGluZVN0YXRpc3RpY3Mgc3RhdHMgPSBwaXBlbGluZV8tPkdldFN0YXRpc3RpY3MoKTsKLSAgcmV0dXJuIHN0YXRzLmF1ZGlvX2J5dGVzX2RlY29kZWQ7Ci19Ci0KLXVuc2lnbmVkIFdlYk1lZGlhUGxheWVySW1wbDo6R2V0VmlkZW9EZWNvZGVkQnl0ZUNvdW50KCkgY29uc3QgewotICBEQ0hFQ0tfRVEobWFpbl9sb29wXywgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7Ci0KLSAgUGlwZWxpbmVTdGF0aXN0aWNzIHN0YXRzID0gcGlwZWxpbmVfLT5HZXRTdGF0aXN0aWNzKCk7Ci0gIHJldHVybiBzdGF0cy52aWRlb19ieXRlc19kZWNvZGVkOwotfQotCi1zY29wZWRfcmVmcHRyPFNoZWxsVmlkZW9GcmFtZVByb3ZpZGVyPgotV2ViTWVkaWFQbGF5ZXJJbXBsOjpHZXRWaWRlb0ZyYW1lUHJvdmlkZXIoKSB7Ci0gIHJldHVybiB2aWRlb19mcmFtZV9wcm92aWRlcl87Ci19Ci0KLXNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gV2ViTWVkaWFQbGF5ZXJJbXBsOjpHZXRDdXJyZW50RnJhbWUoKSB7Ci0gIGlmICh2aWRlb19mcmFtZV9wcm92aWRlcl8pIHsKLSAgICByZXR1cm4gdmlkZW9fZnJhbWVfcHJvdmlkZXJfLT5HZXRDdXJyZW50RnJhbWUoKTsKLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBXZWJNZWRpYVBsYXllckltcGw6OlB1dEN1cnJlbnRGcmFtZSgKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+JiB2aWRlb19mcmFtZSkgewotICBpZiAodmlkZW9fZnJhbWUpIHsKLSAgICBwcm94eV8tPlB1dEN1cnJlbnRGcmFtZSh2aWRlb19mcmFtZSk7Ci0gIH0gZWxzZSB7Ci0gICAgcHJveHlfLT5QdXRDdXJyZW50RnJhbWUoTlVMTCk7Ci0gIH0KLX0KLQotLy8gVE9ETzogRWxpbWluYXRlIHRoZSBkdXBsaWNhdGVkIGVudW1zLgotI2RlZmluZSBDT01QSUxFX0FTU0VSVF9NQVRDSElOR19TVEFUVVNfRU5VTShwbGF5ZXJfbmFtZSwgY2hyb21pdW1fbmFtZSkgXAotICBDT01QSUxFX0FTU0VSVChzdGF0aWNfY2FzdDxpbnQ+KFdlYk1lZGlhUGxheWVyOjpwbGF5ZXJfbmFtZSkgPT0gICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihDaHVua0RlbXV4ZXI6OmNocm9taXVtX25hbWUpLCAgICAgXAotICAgICAgICAgICAgICAgICBtaXNtYXRjaGluZ19zdGF0dXNfZW51bXMpCi1DT01QSUxFX0FTU0VSVF9NQVRDSElOR19TVEFUVVNfRU5VTShrQWRkSWRTdGF0dXNPaywga09rKTsKLUNPTVBJTEVfQVNTRVJUX01BVENISU5HX1NUQVRVU19FTlVNKGtBZGRJZFN0YXR1c05vdFN1cHBvcnRlZCwga05vdFN1cHBvcnRlZCk7Ci1DT01QSUxFX0FTU0VSVF9NQVRDSElOR19TVEFUVVNfRU5VTShrQWRkSWRTdGF0dXNSZWFjaGVkSWRMaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSZWFjaGVkSWRMaW1pdCk7Ci0jdW5kZWYgQ09NUElMRV9BU1NFUlRfTUFUQ0hJTkdfRU5VTQotCi1XZWJNZWRpYVBsYXllcjo6QWRkSWRTdGF0dXMgV2ViTWVkaWFQbGF5ZXJJbXBsOjpTb3VyY2VBZGRJZCgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgaWQsCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjb2RlY3MpIHsKLSAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbmV3X2NvZGVjcyhjb2RlY3Muc2l6ZSgpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb2RlY3Muc2l6ZSgpOyArK2kpCi0gICAgbmV3X2NvZGVjc1tpXSA9IGNvZGVjc1tpXTsKLQotICByZXR1cm4gc3RhdGljX2Nhc3Q8V2ViTWVkaWFQbGF5ZXI6OkFkZElkU3RhdHVzPigKLSAgICAgIGNodW5rX2RlbXV4ZXJfLT5BZGRJZChpZCwgdHlwZSwgbmV3X2NvZGVjcykpOwotfQotCi1ib29sIFdlYk1lZGlhUGxheWVySW1wbDo6U291cmNlUmVtb3ZlSWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkKSB7Ci0gIERDSEVDSyghaWQuZW1wdHkoKSk7Ci0gIGNodW5rX2RlbXV4ZXJfLT5SZW1vdmVJZChpZCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1SYW5nZXM8YmFzZTo6VGltZURlbHRhPiBXZWJNZWRpYVBsYXllckltcGw6OlNvdXJjZUJ1ZmZlcmVkKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCkgewotICByZXR1cm4gY2h1bmtfZGVtdXhlcl8tPkdldEJ1ZmZlcmVkUmFuZ2VzKGlkKTsKLX0KLQotYm9vbCBXZWJNZWRpYVBsYXllckltcGw6OlNvdXJjZUFwcGVuZChjb25zdCBzdGQ6OnN0cmluZyYgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxlbmd0aCkgewotICBEQ0hFQ0tfRVEobWFpbl9sb29wXywgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7Ci0KLSAgZmxvYXQgb2xkX2R1cmF0aW9uID0gR2V0RHVyYXRpb24oKTsKLSAgaWYgKCFjaHVua19kZW11eGVyXy0+QXBwZW5kRGF0YShpZCwgZGF0YSwgbGVuZ3RoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKG9sZF9kdXJhdGlvbiAhPSBHZXREdXJhdGlvbigpKQotICAgIEdldENsaWVudCgpLT5EdXJhdGlvbkNoYW5nZWQoKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBXZWJNZWRpYVBsYXllckltcGw6OlNvdXJjZUFib3J0KGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCkgewotICBjaHVua19kZW11eGVyXy0+QWJvcnQoaWQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotZG91YmxlIFdlYk1lZGlhUGxheWVySW1wbDo6U291cmNlR2V0RHVyYXRpb24oKSBjb25zdCB7Ci0gIERDSEVDSyhjaHVua19kZW11eGVyXyk7Ci0gIHJldHVybiBjaHVua19kZW11eGVyXy0+R2V0RHVyYXRpb24oKTsKLX0KLQotdm9pZCBXZWJNZWRpYVBsYXllckltcGw6OlNvdXJjZVNldER1cmF0aW9uKGRvdWJsZSBuZXdfZHVyYXRpb24pIHsKLSAgRENIRUNLX0dFKG5ld19kdXJhdGlvbiwgMCk7Ci0gIERDSEVDSyhjaHVua19kZW11eGVyXyk7Ci0gIGNodW5rX2RlbXV4ZXJfLT5TZXREdXJhdGlvbihuZXdfZHVyYXRpb24pOwotfQotCi12b2lkIFdlYk1lZGlhUGxheWVySW1wbDo6U291cmNlRW5kT2ZTdHJlYW0oCi0gICAgV2ViTWVkaWFQbGF5ZXI6OkVuZE9mU3RyZWFtU3RhdHVzIHN0YXR1cykgewotICBEQ0hFQ0tfRVEobWFpbl9sb29wXywgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7Ci0gIFBpcGVsaW5lU3RhdHVzIHBpcGVsaW5lX3N0YXR1cyA9IFBJUEVMSU5FX09LOwotCi0gIHN3aXRjaCAoc3RhdHVzKSB7Ci0gICAgY2FzZSBXZWJNZWRpYVBsYXllcjo6a0VuZE9mU3RyZWFtU3RhdHVzTm9FcnJvcjoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgV2ViTWVkaWFQbGF5ZXI6OmtFbmRPZlN0cmVhbVN0YXR1c05ldHdvcmtFcnJvcjoKLSAgICAgIHBpcGVsaW5lX3N0YXR1cyA9IFBJUEVMSU5FX0VSUk9SX05FVFdPUks7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFdlYk1lZGlhUGxheWVyOjprRW5kT2ZTdHJlYW1TdGF0dXNEZWNvZGVFcnJvcjoKLSAgICAgIHBpcGVsaW5lX3N0YXR1cyA9IFBJUEVMSU5FX0VSUk9SX0RFQ09ERTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBOT1RJTVBMRU1FTlRFRCgpOwotICB9Ci0KLSAgZmxvYXQgb2xkX2R1cmF0aW9uID0gR2V0RHVyYXRpb24oKTsKLSAgaWYgKCFjaHVua19kZW11eGVyXy0+RW5kT2ZTdHJlYW0ocGlwZWxpbmVfc3RhdHVzKSkKLSAgICBEVkxPRygxKSA8PCAiRW5kT2ZTdHJlYW0gY2FsbCBmYWlsZWQuIjsKLQotICBpZiAob2xkX2R1cmF0aW9uICE9IEdldER1cmF0aW9uKCkpCi0gICAgR2V0Q2xpZW50KCktPkR1cmF0aW9uQ2hhbmdlZCgpOwotfQotCi1ib29sIFdlYk1lZGlhUGxheWVySW1wbDo6U291cmNlU2V0VGltZXN0YW1wT2Zmc2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG9mZnNldCkgewotICBiYXNlOjpUaW1lRGVsdGEgdGltZV9vZmZzZXQgPSBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWNyb3NlY29uZHMoCi0gICAgICBvZmZzZXQgKiBiYXNlOjpUaW1lOjprTWljcm9zZWNvbmRzUGVyU2Vjb25kKTsKLSAgcmV0dXJuIGNodW5rX2RlbXV4ZXJfLT5TZXRUaW1lc3RhbXBPZmZzZXQoaWQsIHRpbWVfb2Zmc2V0KTsKLX0KLQotLy8gSGVscGVyIGVudW0gZm9yIHJlcG9ydGluZyBnZW5lcmF0ZUtleVJlcXVlc3QvYWRkS2V5IGhpc3RvZ3JhbXMuCi1lbnVtIE1lZGlhS2V5RXhjZXB0aW9uIHsKLSAga1Vua25vd25SZXN1bHRJZCwKLSAga1N1Y2Nlc3MsCi0gIGtLZXlTeXN0ZW1Ob3RTdXBwb3J0ZWQsCi0gIGtJbnZhbGlkUGxheWVyU3RhdGUsCi0gIGtNYXhNZWRpYUtleUV4Y2VwdGlvbgotfTsKLQotc3RhdGljIE1lZGlhS2V5RXhjZXB0aW9uIE1lZGlhS2V5RXhjZXB0aW9uRm9yVU1BKAotICAgIFdlYk1lZGlhUGxheWVyOjpNZWRpYUtleUV4Y2VwdGlvbiBlKSB7Ci0gIHN3aXRjaCAoZSkgewotICAgIGNhc2UgV2ViTWVkaWFQbGF5ZXI6OmtNZWRpYUtleUV4Y2VwdGlvbktleVN5c3RlbU5vdFN1cHBvcnRlZDoKLSAgICAgIHJldHVybiBrS2V5U3lzdGVtTm90U3VwcG9ydGVkOwotICAgIGNhc2UgV2ViTWVkaWFQbGF5ZXI6OmtNZWRpYUtleUV4Y2VwdGlvbkludmFsaWRQbGF5ZXJTdGF0ZToKLSAgICAgIHJldHVybiBrSW52YWxpZFBsYXllclN0YXRlOwotICAgIGNhc2UgV2ViTWVkaWFQbGF5ZXI6OmtNZWRpYUtleUV4Y2VwdGlvbk5vRXJyb3I6Ci0gICAgICByZXR1cm4ga1N1Y2Nlc3M7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBrVW5rbm93blJlc3VsdElkOwotICB9Ci19Ci0KLS8vIEhlbHBlciBmb3IgY29udmVydGluZyB8a2V5X3N5c3RlbXwgbmFtZSBhbmQgZXhjZXB0aW9uIHxlfCB0byBhIHBhaXIgb2YgZW51bQotLy8gdmFsdWVzIGZyb20gYWJvdmUsIGZvciByZXBvcnRpbmcgdG8gVU1BLgotc3RhdGljIHZvaWQgUmVwb3J0TWVkaWFLZXlFeGNlcHRpb25Ub1VNQShjb25zdCBzdGQ6OnN0cmluZyYgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViTWVkaWFQbGF5ZXI6Ok1lZGlhS2V5RXhjZXB0aW9uIGUpIHsKLSAgTWVkaWFLZXlFeGNlcHRpb24gcmVzdWx0X2lkID0gTWVkaWFLZXlFeGNlcHRpb25Gb3JVTUEoZSk7Ci0gIERDSEVDS19ORShyZXN1bHRfaWQsIGtVbmtub3duUmVzdWx0SWQpIDw8IGU7Ci0gIGJhc2U6OkxpbmVhckhpc3RvZ3JhbTo6RmFjdG9yeUdldCgKLSAgICAgIGtNZWRpYUVtZSArIEtleVN5c3RlbU5hbWVGb3JVTUEoa2V5X3N5c3RlbSkgKyAiLiIgKyBtZXRob2QsIDEsCi0gICAgICBrTWF4TWVkaWFLZXlFeGNlcHRpb24sIGtNYXhNZWRpYUtleUV4Y2VwdGlvbiArIDEsCi0gICAgICBiYXNlOjpIaXN0b2dyYW06OmtVbWFUYXJnZXRlZEhpc3RvZ3JhbUZsYWcpCi0gICAgICAtPkFkZChyZXN1bHRfaWQpOwotfQotCi1XZWJNZWRpYVBsYXllcjo6TWVkaWFLZXlFeGNlcHRpb24gV2ViTWVkaWFQbGF5ZXJJbXBsOjpHZW5lcmF0ZUtleVJlcXVlc3QoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciogaW5pdF9kYXRhLAotICAgIHVuc2lnbmVkIGluaXRfZGF0YV9sZW5ndGgpIHsKLSAgV2ViTWVkaWFQbGF5ZXI6Ok1lZGlhS2V5RXhjZXB0aW9uIGUgPQotICAgICAgR2VuZXJhdGVLZXlSZXF1ZXN0SW50ZXJuYWwoa2V5X3N5c3RlbSwgaW5pdF9kYXRhLCBpbml0X2RhdGFfbGVuZ3RoKTsKLSAgUmVwb3J0TWVkaWFLZXlFeGNlcHRpb25Ub1VNQSgiZ2VuZXJhdGVLZXlSZXF1ZXN0Iiwga2V5X3N5c3RlbSwgZSk7Ci0gIHJldHVybiBlOwotfQotCi1XZWJNZWRpYVBsYXllcjo6TWVkaWFLZXlFeGNlcHRpb24KLVdlYk1lZGlhUGxheWVySW1wbDo6R2VuZXJhdGVLZXlSZXF1ZXN0SW50ZXJuYWwoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluaXRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW5pdF9kYXRhX2xlbmd0aCkgewotICBpZiAoIUlzU3VwcG9ydGVkS2V5U3lzdGVtKGtleV9zeXN0ZW0pKQotICAgIHJldHVybiBXZWJNZWRpYVBsYXllcjo6a01lZGlhS2V5RXhjZXB0aW9uS2V5U3lzdGVtTm90U3VwcG9ydGVkOwotCi0gIC8vIFdlIGRvIG5vdCBzdXBwb3J0IHJ1bi10aW1lIHN3aXRjaGluZyBiZXR3ZWVuIGtleSBzeXN0ZW1zIGZvciBub3cuCi0gIGlmIChjdXJyZW50X2tleV9zeXN0ZW1fLmVtcHR5KCkpCi0gICAgY3VycmVudF9rZXlfc3lzdGVtXyA9IGtleV9zeXN0ZW07Ci0gIGVsc2UgaWYgKGtleV9zeXN0ZW0gIT0gY3VycmVudF9rZXlfc3lzdGVtXykKLSAgICByZXR1cm4gV2ViTWVkaWFQbGF5ZXI6OmtNZWRpYUtleUV4Y2VwdGlvbkludmFsaWRQbGF5ZXJTdGF0ZTsKLQotICBEVkxPRygxKSA8PCAiZ2VuZXJhdGVLZXlSZXF1ZXN0OiAiIDw8IGtleV9zeXN0ZW0gPDwgIjogIgotICAgICAgICAgICA8PCBzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihpbml0X2RhdGEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KGluaXRfZGF0YV9sZW5ndGgpKTsKLQotICAvLyBUT0RPKHhod2FuZyk6IFdlIGFzc3VtZSBhbGwgc3RyZWFtcyBhcmUgZnJvbSB0aGUgc2FtZSBjb250YWluZXIgKHRodXMgaGF2ZQotICAvLyB0aGUgc2FtZSAidHlwZSIpIGZvciBub3cuIEluIHRoZSBmdXR1cmUsIHRoZSAidHlwZSIgc2hvdWxkIGJlIHBhc3NlZCBkb3duCi0gIC8vIGZyb20gdGhlIGFwcGxpY2F0aW9uLgotICBpZiAoIWRlY3J5cHRvcl8tPkdlbmVyYXRlS2V5UmVxdWVzdChrZXlfc3lzdGVtLCBpbml0X2RhdGFfdHlwZV8sIGluaXRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9kYXRhX2xlbmd0aCkpIHsKLSAgICBjdXJyZW50X2tleV9zeXN0ZW1fLmNsZWFyKCk7Ci0gICAgcmV0dXJuIFdlYk1lZGlhUGxheWVyOjprTWVkaWFLZXlFeGNlcHRpb25LZXlTeXN0ZW1Ob3RTdXBwb3J0ZWQ7Ci0gIH0KLQotICByZXR1cm4gV2ViTWVkaWFQbGF5ZXI6OmtNZWRpYUtleUV4Y2VwdGlvbk5vRXJyb3I7Ci19Ci0KLVdlYk1lZGlhUGxheWVyOjpNZWRpYUtleUV4Y2VwdGlvbiBXZWJNZWRpYVBsYXllckltcGw6OkFkZEtleSgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBrZXksCi0gICAgdW5zaWduZWQga2V5X2xlbmd0aCwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbml0X2RhdGEsCi0gICAgdW5zaWduZWQgaW5pdF9kYXRhX2xlbmd0aCwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCkgewotICBXZWJNZWRpYVBsYXllcjo6TWVkaWFLZXlFeGNlcHRpb24gZSA9IEFkZEtleUludGVybmFsKAotICAgICAga2V5X3N5c3RlbSwga2V5LCBrZXlfbGVuZ3RoLCBpbml0X2RhdGEsIGluaXRfZGF0YV9sZW5ndGgsIHNlc3Npb25faWQpOwotICBSZXBvcnRNZWRpYUtleUV4Y2VwdGlvblRvVU1BKCJhZGRLZXkiLCBrZXlfc3lzdGVtLCBlKTsKLSAgcmV0dXJuIGU7Ci19Ci0KLVdlYk1lZGlhUGxheWVyOjpNZWRpYUtleUV4Y2VwdGlvbiBXZWJNZWRpYVBsYXllckltcGw6OkFkZEtleUludGVybmFsKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGtleSwKLSAgICB1bnNpZ25lZCBrZXlfbGVuZ3RoLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluaXRfZGF0YSwKLSAgICB1bnNpZ25lZCBpbml0X2RhdGFfbGVuZ3RoLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkKSB7Ci0gIERDSEVDSyhrZXkpOwotICBEQ0hFQ0tfR1Qoa2V5X2xlbmd0aCwgMHUpOwotCi0gIGlmICghSXNTdXBwb3J0ZWRLZXlTeXN0ZW0oa2V5X3N5c3RlbSkpCi0gICAgcmV0dXJuIFdlYk1lZGlhUGxheWVyOjprTWVkaWFLZXlFeGNlcHRpb25LZXlTeXN0ZW1Ob3RTdXBwb3J0ZWQ7Ci0KLSAgaWYgKGN1cnJlbnRfa2V5X3N5c3RlbV8uZW1wdHkoKSB8fCBrZXlfc3lzdGVtICE9IGN1cnJlbnRfa2V5X3N5c3RlbV8pCi0gICAgcmV0dXJuIFdlYk1lZGlhUGxheWVyOjprTWVkaWFLZXlFeGNlcHRpb25JbnZhbGlkUGxheWVyU3RhdGU7Ci0KLSAgRFZMT0coMSkgPDwgImFkZEtleTogIiA8PCBrZXlfc3lzdGVtIDw8ICI6ICIKLSAgICAgICAgICAgPDwgYmFzZTo6SGV4RW5jb2RlKGtleSwgc3RhdGljX2Nhc3Q8c2l6ZV90PihrZXlfbGVuZ3RoKSkgPDwgIiwgIgotICAgICAgICAgICA8PCBiYXNlOjpIZXhFbmNvZGUoaW5pdF9kYXRhLCBzdGF0aWNfY2FzdDxzaXplX3Q+KGluaXRfZGF0YV9sZW5ndGgpKQotICAgICAgICAgICA8PCAiIFsiIDw8IHNlc3Npb25faWQgPDwgIl0iOwotCi0gIGRlY3J5cHRvcl8tPkFkZEtleShrZXlfc3lzdGVtLCBrZXksIGtleV9sZW5ndGgsIGluaXRfZGF0YSwgaW5pdF9kYXRhX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25faWQpOwotICByZXR1cm4gV2ViTWVkaWFQbGF5ZXI6OmtNZWRpYUtleUV4Y2VwdGlvbk5vRXJyb3I7Ci19Ci0KLVdlYk1lZGlhUGxheWVyOjpNZWRpYUtleUV4Y2VwdGlvbiBXZWJNZWRpYVBsYXllckltcGw6OkNhbmNlbEtleVJlcXVlc3QoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25faWQpIHsKLSAgV2ViTWVkaWFQbGF5ZXI6Ok1lZGlhS2V5RXhjZXB0aW9uIGUgPQotICAgICAgQ2FuY2VsS2V5UmVxdWVzdEludGVybmFsKGtleV9zeXN0ZW0sIHNlc3Npb25faWQpOwotICBSZXBvcnRNZWRpYUtleUV4Y2VwdGlvblRvVU1BKCJjYW5jZWxLZXlSZXF1ZXN0Iiwga2V5X3N5c3RlbSwgZSk7Ci0gIHJldHVybiBlOwotfQotCi1XZWJNZWRpYVBsYXllckltcGw6OlNldEJvdW5kc0NCIFdlYk1lZGlhUGxheWVySW1wbDo6R2V0U2V0Qm91bmRzQ0IoKSB7Ci0gIC8vIHxwaXBlbGluZV98IGlzIGFsd2F5cyB2YWxpZCBkdXJpbmcgV2ViTWVkaWFQbGF5ZXJJbXBsJ3MgbGlmZSB0aW1lLiAgSXQgaXMKLSAgLy8gYWxzbyByZWZlcmVuY2UgY291bnRlZCBzbyBpdCBsaXZlcyBhZnRlciBXZWJNZWRpYVBsYXllckltcGwgaXMgZGVzdHJveWVkLgotICByZXR1cm4gcGlwZWxpbmVfLT5HZXRTZXRCb3VuZHNDQigpOwotfQotCi1XZWJNZWRpYVBsYXllcjo6TWVkaWFLZXlFeGNlcHRpb24gV2ViTWVkaWFQbGF5ZXJJbXBsOjpDYW5jZWxLZXlSZXF1ZXN0SW50ZXJuYWwoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25faWQpIHsKLSAgaWYgKCFJc1N1cHBvcnRlZEtleVN5c3RlbShrZXlfc3lzdGVtKSkKLSAgICByZXR1cm4gV2ViTWVkaWFQbGF5ZXI6OmtNZWRpYUtleUV4Y2VwdGlvbktleVN5c3RlbU5vdFN1cHBvcnRlZDsKLQotICBpZiAoY3VycmVudF9rZXlfc3lzdGVtXy5lbXB0eSgpIHx8IGtleV9zeXN0ZW0gIT0gY3VycmVudF9rZXlfc3lzdGVtXykKLSAgICByZXR1cm4gV2ViTWVkaWFQbGF5ZXI6OmtNZWRpYUtleUV4Y2VwdGlvbkludmFsaWRQbGF5ZXJTdGF0ZTsKLQotICBkZWNyeXB0b3JfLT5DYW5jZWxLZXlSZXF1ZXN0KGtleV9zeXN0ZW0sIHNlc3Npb25faWQpOwotICByZXR1cm4gV2ViTWVkaWFQbGF5ZXI6OmtNZWRpYUtleUV4Y2VwdGlvbk5vRXJyb3I7Ci19Ci0KLXZvaWQgV2ViTWVkaWFQbGF5ZXJJbXBsOjpXaWxsRGVzdHJveUN1cnJlbnRNZXNzYWdlTG9vcCgpIHsKLSAgRGVzdHJveSgpOwotICBtYWluX2xvb3BfID0gTlVMTDsKLX0KLQotYm9vbCBXZWJNZWRpYVBsYXllckltcGw6OkdldERlYnVnUmVwb3J0RGF0YUFkZHJlc3Modm9pZCoqIG91dF9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBvdXRfc2l6ZSkgewotICAqb3V0X2FkZHJlc3MgPSAmc3RhdGVfOwotICAqb3V0X3NpemUgPSBzaXplb2Yoc3RhdGVfKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgV2ViTWVkaWFQbGF5ZXJJbXBsOjpPblBpcGVsaW5lU2VlayhQaXBlbGluZVN0YXR1cyBzdGF0dXMpIHsKLSAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotICBzdGF0ZV8uc3RhcnRpbmcgPSBmYWxzZTsKLSAgc3RhdGVfLnNlZWtpbmcgPSBmYWxzZTsKLSAgaWYgKHN0YXRlXy5wZW5kaW5nX3NlZWspIHsKLSAgICBzdGF0ZV8ucGVuZGluZ19zZWVrID0gZmFsc2U7Ci0gICAgU2VlayhzdGF0ZV8ucGVuZGluZ19zZWVrX3NlY29uZHMpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzdGF0dXMgIT0gUElQRUxJTkVfT0spIHsKLSAgICBPblBpcGVsaW5lRXJyb3Ioc3RhdHVzKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBVcGRhdGUgb3VyIHBhdXNlZCB0aW1lLgotICBpZiAoc3RhdGVfLnBhdXNlZCkKLSAgICBzdGF0ZV8ucGF1c2VkX3RpbWUgPSBwaXBlbGluZV8tPkdldE1lZGlhVGltZSgpOwotCi0gIEdldENsaWVudCgpLT5UaW1lQ2hhbmdlZCgpOwotfQotCi12b2lkIFdlYk1lZGlhUGxheWVySW1wbDo6T25QaXBlbGluZUVuZGVkKFBpcGVsaW5lU3RhdHVzIHN0YXR1cykgewotICBEQ0hFQ0tfRVEobWFpbl9sb29wXywgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7Ci0gIGlmIChzdGF0dXMgIT0gUElQRUxJTkVfT0spIHsKLSAgICBPblBpcGVsaW5lRXJyb3Ioc3RhdHVzKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgR2V0Q2xpZW50KCktPlRpbWVDaGFuZ2VkKCk7Ci19Ci0KLXZvaWQgV2ViTWVkaWFQbGF5ZXJJbXBsOjpPblBpcGVsaW5lRXJyb3IoUGlwZWxpbmVTdGF0dXMgZXJyb3IpIHsKLSAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotCi0gIGlmIChzdXBwcmVzc19kZXN0cnVjdGlvbl9lcnJvcnNfKQotICAgIHJldHVybjsKLQotICBtZWRpYV9sb2dfLT5BZGRFdmVudChtZWRpYV9sb2dfLT5DcmVhdGVQaXBlbGluZUVycm9yRXZlbnQoZXJyb3IpKTsKLQotICBpZiAocmVhZHlfc3RhdGVfID09IFdlYk1lZGlhUGxheWVyOjprUmVhZHlTdGF0ZUhhdmVOb3RoaW5nKSB7Ci0gICAgLy8gQW55IGVycm9yIHRoYXQgb2NjdXJzIGJlZm9yZSByZWFjaGluZyBSZWFkeVN0YXRlSGF2ZU1ldGFkYXRhIHNob3VsZAotICAgIC8vIGJlIGNvbnNpZGVyZWQgYSBmb3JtYXQgZXJyb3IuCi0gICAgU2V0TmV0d29ya1N0YXRlKFdlYk1lZGlhUGxheWVyOjprTmV0d29ya1N0YXRlRm9ybWF0RXJyb3IpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN3aXRjaCAoZXJyb3IpIHsKLSAgICBjYXNlIFBJUEVMSU5FX09LOgotICAgICAgTk9UUkVBQ0hFRCgpIDw8ICJQSVBFTElORV9PSyBpc24ndCBhbiBlcnJvciEiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBJUEVMSU5FX0VSUk9SX05FVFdPUks6Ci0gICAgY2FzZSBQSVBFTElORV9FUlJPUl9SRUFEOgotICAgICAgU2V0TmV0d29ya1N0YXRlKFdlYk1lZGlhUGxheWVyOjprTmV0d29ya1N0YXRlTmV0d29ya0Vycm9yKTsKLSAgICAgIGJyZWFrOwotCi0gICAgLy8gVE9ETyh2cmspOiBCZWNhdXNlIE9uUGlwZWxpbmVJbml0aWFsaXplKCkgZGlyZWN0bHkgcmVwb3J0cyB0aGUKLSAgICAvLyBOZXR3b3JrU3RhdGVGb3JtYXRFcnJvciBpbnN0ZWFkIG9mIGNhbGxpbmcgT25QaXBlbGluZUVycm9yKCksIEkgYmVsaWV2ZQotICAgIC8vIHRoaXMgYmxvY2sgY2FuIGJlIGRlbGV0ZWQuIFNob3VsZCBsb29rIGludG8gaXQhIChjcmJ1Zy5jb20vMTI2MDcwKQotICAgIGNhc2UgUElQRUxJTkVfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOgotICAgIGNhc2UgUElQRUxJTkVfRVJST1JfQ09VTERfTk9UX1JFTkRFUjoKLSAgICBjYXNlIFBJUEVMSU5FX0VSUk9SX1VSTF9OT1RfRk9VTkQ6Ci0gICAgY2FzZSBERU1VWEVSX0VSUk9SX0NPVUxEX05PVF9PUEVOOgotICAgIGNhc2UgREVNVVhFUl9FUlJPUl9DT1VMRF9OT1RfUEFSU0U6Ci0gICAgY2FzZSBERU1VWEVSX0VSUk9SX05PX1NVUFBPUlRFRF9TVFJFQU1TOgotICAgIGNhc2UgREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVEOgotICAgICAgU2V0TmV0d29ya1N0YXRlKFdlYk1lZGlhUGxheWVyOjprTmV0d29ya1N0YXRlRm9ybWF0RXJyb3IpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBJUEVMSU5FX0VSUk9SX0RFQ09ERToKLSAgICBjYXNlIFBJUEVMSU5FX0VSUk9SX0FCT1JUOgotICAgIGNhc2UgUElQRUxJTkVfRVJST1JfT1BFUkFUSU9OX1BFTkRJTkc6Ci0gICAgY2FzZSBQSVBFTElORV9FUlJPUl9JTlZBTElEX1NUQVRFOgotICAgICAgU2V0TmV0d29ya1N0YXRlKFdlYk1lZGlhUGxheWVyOjprTmV0d29ya1N0YXRlRGVjb2RlRXJyb3IpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBJUEVMSU5FX0VSUk9SX0RFQ1JZUFQ6Ci0gICAgICAvLyBEZWNyeXB0IGVycm9yLgotICAgICAgYmFzZTo6SGlzdG9ncmFtOjpGYWN0b3J5R2V0KAotICAgICAgICAgIChrTWVkaWFFbWUgKyBLZXlTeXN0ZW1OYW1lRm9yVU1BKGN1cnJlbnRfa2V5X3N5c3RlbV8pICsKLSAgICAgICAgICAgIi5EZWNyeXB0RXJyb3IiKSwKLSAgICAgICAgICAxLCAxMDAwMDAwLCA1MCwgYmFzZTo6SGlzdG9ncmFtOjprVW1hVGFyZ2V0ZWRIaXN0b2dyYW1GbGFnKQotICAgICAgICAgIC0+QWRkKDEpOwotICAgICAgLy8gVE9ETyh4aHdhbmcpOiBDaGFuZ2UgdG8gdXNlIE5ldHdvcmtTdGF0ZURlY3J5cHRFcnJvciBvbmNlIGl0J3MgYWRkZWQgaW4KLSAgICAgIC8vIFdlYmtpdCAoc2VlIGh0dHA6Ly9jcmJ1Zy5jb20vMTI0NDg2KS4KLSAgICAgIFNldE5ldHdvcmtTdGF0ZShXZWJNZWRpYVBsYXllcjo6a05ldHdvcmtTdGF0ZURlY29kZUVycm9yKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQSVBFTElORV9TVEFUVVNfTUFYOgotICAgICAgTk9UUkVBQ0hFRCgpIDw8ICJQSVBFTElORV9TVEFUVVNfTUFYIGlzbid0IGEgcmVhbCBlcnJvciEiOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotdm9pZCBXZWJNZWRpYVBsYXllckltcGw6Ok9uUGlwZWxpbmVCdWZmZXJpbmdTdGF0ZSgKLSAgICBQaXBlbGluZTo6QnVmZmVyaW5nU3RhdGUgYnVmZmVyaW5nX3N0YXRlKSB7Ci0gIERWTE9HKDEpIDw8ICJPblBpcGVsaW5lQnVmZmVyaW5nU3RhdGUoIiA8PCBidWZmZXJpbmdfc3RhdGUgPDwgIikiOwotCi0gIHN3aXRjaCAoYnVmZmVyaW5nX3N0YXRlKSB7Ci0gICAgY2FzZSBQaXBlbGluZTo6a0hhdmVNZXRhZGF0YToKLSAgICAgIFNldFJlYWR5U3RhdGUoV2ViTWVkaWFQbGF5ZXI6OmtSZWFkeVN0YXRlSGF2ZU1ldGFkYXRhKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUGlwZWxpbmU6OmtQcmVyb2xsQ29tcGxldGVkOgotICAgICAgU2V0UmVhZHlTdGF0ZShXZWJNZWRpYVBsYXllcjo6a1JlYWR5U3RhdGVIYXZlRW5vdWdoRGF0YSk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIFdlYk1lZGlhUGxheWVySW1wbDo6T25EZW11eGVyT3BlbmVkKCkgewotICBEQ0hFQ0tfRVEobWFpbl9sb29wXywgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7Ci0KLSAgR2V0Q2xpZW50KCktPlNvdXJjZU9wZW5lZCgpOwotfQotCi12b2lkIFdlYk1lZGlhUGxheWVySW1wbDo6T25LZXlBZGRlZChjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkKSB7Ci0gIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLQotICBiYXNlOjpIaXN0b2dyYW06OkZhY3RvcnlHZXQoCi0gICAgICBrTWVkaWFFbWUgKyBLZXlTeXN0ZW1OYW1lRm9yVU1BKGtleV9zeXN0ZW0pICsgIi5LZXlBZGRlZCIsIDEsIDEwMDAwMDAsIDUwLAotICAgICAgYmFzZTo6SGlzdG9ncmFtOjprVW1hVGFyZ2V0ZWRIaXN0b2dyYW1GbGFnKQotICAgICAgLT5BZGQoMSk7Ci0KLSAgR2V0Q2xpZW50KCktPktleUFkZGVkKGtleV9zeXN0ZW0sIHNlc3Npb25faWQpOwotfQotCi12b2lkIFdlYk1lZGlhUGxheWVySW1wbDo6T25OZWVkS2V5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9hcnJheTx1aW50OD4gaW5pdF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5pdF9kYXRhX3NpemUpIHsKLSAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotCi0gIC8vIERvIG5vdCBmaXJlIE5lZWRLZXkgZXZlbnQgaWYgZW5jcnlwdGVkIG1lZGlhIGlzIG5vdCBlbmFibGVkLgotICBpZiAoIWRlY3J5cHRvcl8pCi0gICAgcmV0dXJuOwotCi0gIFVNQV9ISVNUT0dSQU1fQ09VTlRTKGtNZWRpYUVtZSArIHN0ZDo6c3RyaW5nKCJOZWVkS2V5IiksIDEpOwotCi0jaWYgIWRlZmluZWQoX19MQl9TSEVMTF9fKSAmJiAhZGVmaW5lZChDT0JBTFQpCi0gIERDSEVDSyhpbml0X2RhdGFfdHlwZV8uZW1wdHkoKSB8fCB0eXBlLmVtcHR5KCkgfHwgdHlwZSA9PSBpbml0X2RhdGFfdHlwZV8pOwotI2VuZGlmICAvLyAhZGVmaW5lZChfX0xCX1NIRUxMX18pICYmICFkZWZpbmVkKENPQkFMVCkKLQotICBpZiAoaW5pdF9kYXRhX3R5cGVfLmVtcHR5KCkpCi0gICAgaW5pdF9kYXRhX3R5cGVfID0gdHlwZTsKLQotICBHZXRDbGllbnQoKS0+S2V5TmVlZGVkKGtleV9zeXN0ZW0sIHNlc3Npb25faWQsIGluaXRfZGF0YS5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X2RhdGFfc2l6ZSk7Ci19Ci0KLS8vIFRPRE86IEVsaW1pbmF0ZSB0aGUgZHVwbGljYXRlZCBlbnVtcy4KLSNkZWZpbmUgQ09NUElMRV9BU1NFUlRfTUFUQ0hJTkdfRU5VTShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgXAotICBDT01QSUxFX0FTU0VSVChzdGF0aWNfY2FzdDxpbnQ+KFdlYk1lZGlhUGxheWVyQ2xpZW50OjpuYW1lKSA9PSBcCi0gICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KERlY3J5cHRvcjo6bmFtZSksICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgbWlzbWF0Y2hpbmdfZW51bXMpCi1DT01QSUxFX0FTU0VSVF9NQVRDSElOR19FTlVNKGtVbmtub3duRXJyb3IpOwotQ09NUElMRV9BU1NFUlRfTUFUQ0hJTkdfRU5VTShrQ2xpZW50RXJyb3IpOwotQ09NUElMRV9BU1NFUlRfTUFUQ0hJTkdfRU5VTShrU2VydmljZUVycm9yKTsKLUNPTVBJTEVfQVNTRVJUX01BVENISU5HX0VOVU0oa091dHB1dEVycm9yKTsKLUNPTVBJTEVfQVNTRVJUX01BVENISU5HX0VOVU0oa0hhcmR3YXJlQ2hhbmdlRXJyb3IpOwotQ09NUElMRV9BU1NFUlRfTUFUQ0hJTkdfRU5VTShrRG9tYWluRXJyb3IpOwotI3VuZGVmIENPTVBJTEVfQVNTRVJUX01BVENISU5HX0VOVU0KLQotdm9pZCBXZWJNZWRpYVBsYXllckltcGw6Ok9uS2V5RXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRvcjo6S2V5RXJyb3IgZXJyb3JfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzeXN0ZW1fY29kZSkgewotICBEQ0hFQ0tfRVEobWFpbl9sb29wXywgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7Ci0KLSAgYmFzZTo6TGluZWFySGlzdG9ncmFtOjpGYWN0b3J5R2V0KAotICAgICAga01lZGlhRW1lICsgS2V5U3lzdGVtTmFtZUZvclVNQShrZXlfc3lzdGVtKSArICIuS2V5RXJyb3IiLCAxLAotICAgICAgRGVjcnlwdG9yOjprTWF4S2V5RXJyb3IsIERlY3J5cHRvcjo6a01heEtleUVycm9yICsgMSwKLSAgICAgIGJhc2U6Okhpc3RvZ3JhbTo6a1VtYVRhcmdldGVkSGlzdG9ncmFtRmxhZykKLSAgICAgIC0+QWRkKGVycm9yX2NvZGUpOwotCi0gIEdldENsaWVudCgpLT5LZXlFcnJvcigKLSAgICAgIGtleV9zeXN0ZW0sIHNlc3Npb25faWQsCi0gICAgICBzdGF0aWNfY2FzdDxXZWJNZWRpYVBsYXllckNsaWVudDo6TWVkaWFLZXlFcnJvckNvZGU+KGVycm9yX2NvZGUpLAotICAgICAgc3lzdGVtX2NvZGUpOwotfQotCi12b2lkIFdlYk1lZGlhUGxheWVySW1wbDo6T25LZXlNZXNzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdVUkwmIGRlZmF1bHRfdXJsKSB7Ci0gIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLQotICBHZXRDbGllbnQoKS0+S2V5TWVzc2FnZShrZXlfc3lzdGVtLCBzZXNzaW9uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4Kj4obWVzc2FnZS5kYXRhKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNpemUoKSwgZGVmYXVsdF91cmwuc3BlYygpKTsKLX0KLQotdm9pZCBXZWJNZWRpYVBsYXllckltcGw6OlNldE9wYXF1ZShib29sIG9wYXF1ZSkgewotICBEQ0hFQ0tfRVEobWFpbl9sb29wXywgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7Ci0KLSAgR2V0Q2xpZW50KCktPlNldE9wYXF1ZShvcGFxdWUpOwotfQotCi12b2lkIFdlYk1lZGlhUGxheWVySW1wbDo6T25Eb3dubG9hZGluZ1N0YXR1c0NoYW5nZWQoYm9vbCBpc19kb3dubG9hZGluZykgewotICBpZiAoIWlzX2Rvd25sb2FkaW5nICYmIG5ldHdvcmtfc3RhdGVfID09IFdlYk1lZGlhUGxheWVyOjprTmV0d29ya1N0YXRlTG9hZGluZykKLSAgICBTZXROZXR3b3JrU3RhdGUoV2ViTWVkaWFQbGF5ZXI6OmtOZXR3b3JrU3RhdGVJZGxlKTsKLSAgZWxzZSBpZiAoaXNfZG93bmxvYWRpbmcgJiYKLSAgICAgICAgICAgbmV0d29ya19zdGF0ZV8gPT0gV2ViTWVkaWFQbGF5ZXI6OmtOZXR3b3JrU3RhdGVJZGxlKQotICAgIFNldE5ldHdvcmtTdGF0ZShXZWJNZWRpYVBsYXllcjo6a05ldHdvcmtTdGF0ZUxvYWRpbmcpOwotICBtZWRpYV9sb2dfLT5BZGRFdmVudCgKLSAgICAgIG1lZGlhX2xvZ18tPkNyZWF0ZUJvb2xlYW5FdmVudChNZWRpYUxvZ0V2ZW50OjpORVRXT1JLX0FDVElWSVRZX1NFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXNfZG93bmxvYWRpbmdfZGF0YSIsIGlzX2Rvd25sb2FkaW5nKSk7Ci19Ci0KLXZvaWQgV2ViTWVkaWFQbGF5ZXJJbXBsOjpTdGFydFBpcGVsaW5lKCkgewotICBzdGF0ZV8uc3RhcnRpbmcgPSB0cnVlOwotCi0gIFNldERlY3J5cHRvclJlYWR5Q0Igc2V0X2RlY3J5cHRvcl9yZWFkeV9jYjsKLSAgaWYgKGRlY3J5cHRvcl8pIHsKLSAgICBzZXRfZGVjcnlwdG9yX3JlYWR5X2NiID0gYmFzZTo6QmluZCgmUHJveHlEZWNyeXB0b3I6OlNldERlY3J5cHRvclJlYWR5Q0IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChkZWNyeXB0b3JfLmdldCgpKSk7Ci0gIH0KLQotICBwaXBlbGluZV8tPlNldERlY29kZVRvVGV4dHVyZU91dHB1dE1vZGUoY2xpZW50Xy0+UHJlZmVyRGVjb2RlVG9UZXh0dXJlKCkpOwotICBwaXBlbGluZV8tPlN0YXJ0KAotICAgICAgZmlsdGVyX2NvbGxlY3Rpb25fLlBhc3MoKSwgc2V0X2RlY3J5cHRvcl9yZWFkeV9jYiwKLSAgICAgIEJJTkRfVE9fUkVOREVSX0xPT1AoJldlYk1lZGlhUGxheWVySW1wbDo6T25QaXBlbGluZUVuZGVkKSwKLSAgICAgIEJJTkRfVE9fUkVOREVSX0xPT1AoJldlYk1lZGlhUGxheWVySW1wbDo6T25QaXBlbGluZUVycm9yKSwKLSAgICAgIEJJTkRfVE9fUkVOREVSX0xPT1AoJldlYk1lZGlhUGxheWVySW1wbDo6T25QaXBlbGluZVNlZWspLAotICAgICAgQklORF9UT19SRU5ERVJfTE9PUCgmV2ViTWVkaWFQbGF5ZXJJbXBsOjpPblBpcGVsaW5lQnVmZmVyaW5nU3RhdGUpLAotICAgICAgQklORF9UT19SRU5ERVJfTE9PUCgmV2ViTWVkaWFQbGF5ZXJJbXBsOjpPbkR1cmF0aW9uQ2hhbmdlZCkpOwotfQotCi12b2lkIFdlYk1lZGlhUGxheWVySW1wbDo6U2V0TmV0d29ya1N0YXRlKFdlYk1lZGlhUGxheWVyOjpOZXR3b3JrU3RhdGUgc3RhdGUpIHsKLSAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotICBEVkxPRygxKSA8PCAiU2V0TmV0d29ya1N0YXRlOiAiIDw8IHN0YXRlOwotICBuZXR3b3JrX3N0YXRlXyA9IHN0YXRlOwotICAvLyBBbHdheXMgbm90aWZ5IHRvIGVuc3VyZSBjbGllbnQgaGFzIHRoZSBsYXRlc3QgdmFsdWUuCi0gIEdldENsaWVudCgpLT5OZXR3b3JrU3RhdGVDaGFuZ2VkKCk7Ci19Ci0KLXZvaWQgV2ViTWVkaWFQbGF5ZXJJbXBsOjpTZXRSZWFkeVN0YXRlKFdlYk1lZGlhUGxheWVyOjpSZWFkeVN0YXRlIHN0YXRlKSB7Ci0gIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLSAgRFZMT0coMSkgPDwgIlNldFJlYWR5U3RhdGU6ICIgPDwgc3RhdGU7Ci0KLSAgaWYgKHJlYWR5X3N0YXRlXyA9PSBXZWJNZWRpYVBsYXllcjo6a1JlYWR5U3RhdGVIYXZlTm90aGluZyAmJgotICAgICAgc3RhdGUgPj0gV2ViTWVkaWFQbGF5ZXI6OmtSZWFkeVN0YXRlSGF2ZU1ldGFkYXRhKSB7Ci0gICAgaWYgKCFIYXNWaWRlbygpKQotICAgICAgR2V0Q2xpZW50KCktPkRpc2FibGVBY2NlbGVyYXRlZENvbXBvc2l0aW5nKCk7Ci0gIH0gZWxzZSBpZiAoc3RhdGUgPT0gV2ViTWVkaWFQbGF5ZXI6OmtSZWFkeVN0YXRlSGF2ZUVub3VnaERhdGEpIHsKLSAgICBpZiAoaXNfbG9jYWxfc291cmNlXyAmJgotICAgICAgICBuZXR3b3JrX3N0YXRlXyA9PSBXZWJNZWRpYVBsYXllcjo6a05ldHdvcmtTdGF0ZUxvYWRpbmcpIHsKLSAgICAgIFNldE5ldHdvcmtTdGF0ZShXZWJNZWRpYVBsYXllcjo6a05ldHdvcmtTdGF0ZUxvYWRlZCk7Ci0gICAgfQotICB9Ci0KLSAgcmVhZHlfc3RhdGVfID0gc3RhdGU7Ci0gIC8vIEFsd2F5cyBub3RpZnkgdG8gZW5zdXJlIGNsaWVudCBoYXMgdGhlIGxhdGVzdCB2YWx1ZS4KLSAgR2V0Q2xpZW50KCktPlJlYWR5U3RhdGVDaGFuZ2VkKCk7Ci19Ci0KLXZvaWQgV2ViTWVkaWFQbGF5ZXJJbXBsOjpEZXN0cm95KCkgewotICBEQ0hFQ0soIW1haW5fbG9vcF8gfHwgbWFpbl9sb29wXyA9PSBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLQotICAvLyBJZiB8bWFpbl9sb29wX3wgaGFzIGFscmVhZHkgc3RvcHBlZCwgZG8gbm90aGluZyBoZXJlLgotICBpZiAoIW1haW5fbG9vcF8pIHsKLSAgICAvLyBUaGlzIG1heSBoYXBwZW4gaWYgdGhpcyBmdW5jdGlvbiB3YXMgYWxyZWFkeSBjYWxsZWQgYnkgdGhlCi0gICAgLy8gRGVzdHJ1Y3Rpb25PYnNlcnZlciBvdmVycmlkZSB3aGVuIHRoZSB0aHJlYWQgcnVubmluZyB0aGlzIHBsYXllciB3YXMKLSAgICAvLyBzdG9wcGVkLiBUaGUgcGlwZWxpbmUgc2hvdWxkIGhhdmUgYmVlbiBzaHV0IGRvd24uCi0gICAgRENIRUNLKCFjaHVua19kZW11eGVyXyk7Ci0gICAgRENIRUNLKCFtZXNzYWdlX2xvb3BfZmFjdG9yeV8pOwotICAgIERDSEVDSyghcHJveHlfKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBUZWxsIHRoZSBkYXRhIHNvdXJjZSB0byBhYm9ydCBhbnkgcGVuZGluZyByZWFkcyBzbyB0aGF0IHRoZSBwaXBlbGluZSBpcwotICAvLyBub3QgYmxvY2tlZCB3aGVuIGlzc3Vpbmcgc3RvcCBjb21tYW5kcyB0byB0aGUgb3RoZXIgZmlsdGVycy4KLSAgc3VwcHJlc3NfZGVzdHJ1Y3Rpb25fZXJyb3JzXyA9IHRydWU7Ci0gIGlmIChwcm94eV8pIHsKLSAgICBwcm94eV8tPkFib3J0RGF0YVNvdXJjZSgpOwotICAgIGlmIChjaHVua19kZW11eGVyXykgewotICAgICAgY2h1bmtfZGVtdXhlcl8tPlNodXRkb3duKCk7Ci0gICAgICBjaHVua19kZW11eGVyXyA9IE5VTEw7Ci0gICAgfQotICB9Ci0KLSAgLy8gTWFrZSBzdXJlIHRvIGtpbGwgdGhlIHBpcGVsaW5lIHNvIHRoZXJlJ3Mgbm8gbW9yZSBtZWRpYSB0aHJlYWRzIHJ1bm5pbmcuCi0gIC8vIE5vdGU6IHN0b3BwaW5nIHRoZSBwaXBlbGluZSBtaWdodCBibG9jayBmb3IgYSBsb25nIHRpbWUuCi0gIGJhc2U6OldhaXRhYmxlRXZlbnQgd2FpdGVyKGZhbHNlLCBmYWxzZSk7Ci0gIERMT0coSU5GTykgPDwgIlRyeWluZyB0byBzdG9wIG1lZGlhIHBpcGVsaW5lLiI7Ci0gIHBpcGVsaW5lXy0+U3RvcCgKLSAgICAgIGJhc2U6OkJpbmQoJmJhc2U6OldhaXRhYmxlRXZlbnQ6OlNpZ25hbCwgYmFzZTo6VW5yZXRhaW5lZCgmd2FpdGVyKSkpOwotICB3YWl0ZXIuV2FpdCgpOwotICBETE9HKElORk8pIDw8ICJNZWRpYSBwaXBlbGluZSBzdG9wcGVkLiI7Ci0KLSAgbWVzc2FnZV9sb29wX2ZhY3RvcnlfLnJlc2V0KCk7Ci0KLSAgLy8gQW5kIHRoZW4gZGV0YWNoIHRoZSBwcm94eSwgaXQgbWF5IGxpdmUgb24gdGhlIHJlbmRlciB0aHJlYWQgZm9yIGEgbGl0dGxlCi0gIC8vIGxvbmdlciB1bnRpbCBhbGwgdGhlIHRhc2tzIGFyZSBmaW5pc2hlZC4KLSAgaWYgKHByb3h5XykgewotICAgIHByb3h5Xy0+RGV0YWNoKCk7Ci0gICAgcHJveHlfID0gTlVMTDsKLSAgfQotfQotCi12b2lkIFdlYk1lZGlhUGxheWVySW1wbDo6R2V0TWVkaWFUaW1lQW5kU2Vla2luZ1N0YXRlKAotICAgIGJhc2U6OlRpbWVEZWx0YSogbWVkaWFfdGltZSwKLSAgICBib29sKiBpc19zZWVraW5nKSBjb25zdCB7Ci0gIERDSEVDSyhtZWRpYV90aW1lKTsKLSAgRENIRUNLKGlzX3NlZWtpbmcpOwotICAqbWVkaWFfdGltZSA9IHBpcGVsaW5lXy0+R2V0TWVkaWFUaW1lKCk7Ci0gICppc19zZWVraW5nID0gc3RhdGVfLnNlZWtpbmc7Ci19Ci0KLVdlYk1lZGlhUGxheWVyQ2xpZW50KiBXZWJNZWRpYVBsYXllckltcGw6OkdldENsaWVudCgpIHsKLSAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotICBEQ0hFQ0soY2xpZW50Xyk7Ci0gIHJldHVybiBjbGllbnRfOwotfQotCi12b2lkIFdlYk1lZGlhUGxheWVySW1wbDo6T25EdXJhdGlvbkNoYW5nZWQoKSB7Ci0gIGlmIChyZWFkeV9zdGF0ZV8gPT0gV2ViTWVkaWFQbGF5ZXI6OmtSZWFkeVN0YXRlSGF2ZU5vdGhpbmcpCi0gICAgcmV0dXJuOwotCi0gIEdldENsaWVudCgpLT5EdXJhdGlvbkNoYW5nZWQoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfaW1wbC5oIGIvc3JjL21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyX2ltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwMDQxMi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfaW1wbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzgyICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIERlbGVnYXRlIGNhbGxzIGZyb20gV2ViQ29yZTo6TWVkaWFQbGF5ZXJQcml2YXRlIHRvIENocm9tZSdzIHZpZGVvIHBsYXllci4KLS8vIEl0IGNvbnRhaW5zIFBpcGVsaW5lIHdoaWNoIGlzIHRoZSBhY3R1YWwgbWVkaWEgcGxheWVyIHBpcGVsaW5lLCBpdCBnbHVlcwotLy8gdGhlIG1lZGlhIHBsYXllciBwaXBlbGluZSwgZGF0YSBzb3VyY2UsIGF1ZGlvIHJlbmRlcmVyIGFuZCByZW5kZXJlci4KLS8vIFBpcGVsaW5lIHdvdWxkIGNyZWF0ZXMgbXVsdGlwbGUgdGhyZWFkcyBhbmQgYWNjZXNzIHNvbWUgcHVibGljIG1ldGhvZHMKLS8vIG9mIHRoaXMgY2xhc3MsIHNvIHdlIG5lZWQgdG8gYmUgZXh0cmEgY2FyZWZ1bCBhYm91dCBjb25jdXJyZW50IGFjY2VzcyBvZgotLy8gbWV0aG9kcyBhbmQgbWVtYmVycy4KLS8vCi0vLyBXZWJNZWRpYVBsYXllckltcGwgd29ya3Mgd2l0aCBtdWx0aXBsZSBvYmplY3RzLCB0aGUgbW9zdCBpbXBvcnRhbnQgb25lcyBhcmU6Ci0vLwotLy8gUGlwZWxpbmUKLS8vICAgVGhlIG1lZGlhIHBsYXliYWNrIHBpcGVsaW5lLgotLy8KLS8vIFZpZGVvUmVuZGVyZXJCYXNlCi0vLyAgIFZpZGVvIHJlbmRlcmVyIG9iamVjdC4KLS8vCi0vLyBXZWJNZWRpYVBsYXllckNsaWVudAotLy8gICBDbGllbnQgb2YgdGhpcyBtZWRpYSBwbGF5ZXIgb2JqZWN0LgotLy8KLS8vIFRoZSBmb2xsb3dpbmcgZGlhZ3JhbSBzaG93cyB0aGUgcmVsYXRpb25zaGlwIG9mIHRoZXNlIG9iamVjdHM6Ci0vLyAgIChub3RlOiByZWYtY291bnRlZCByZWZlcmVuY2UgaXMgbWFya2VkIGJ5IGEgInIiLikKLS8vCi0vLyBXZWJNZWRpYVBsYXllckNsaWVudAotLy8gICAgXgotLy8gICAgfAotLy8gV2ViTWVkaWFQbGF5ZXJJbXBsIC0tLT4gUGlwZWxpbmUKLS8vICAgIHwgICAgICAgIF4gICAgICAgICAgICAgICAgICB8Ci0vLyAgICB8ICAgICAgICB8ICAgICAgICAgICAgICAgICAgdiByCi0vLyAgICB8ICAgICAgICB8ICAgICAgICBWaWRlb1JlbmRlcmVyQmFzZQotLy8gICAgfCAgICAgICAgfCAgICAgICAgICB8ICAgICAgIF4gcgotLy8gICAgfCAgIHIgICAgfCAgICAgICAgICB2IHIgICAgIHwKLS8vICAgICctLS0+IFdlYk1lZGlhUGxheWVyUHJveHkgLS0nCi0vLwotLy8gTm90aWNlIHRoYXQgV2ViTWVkaWFQbGF5ZXJQcm94eSBhbmQgVmlkZW9SZW5kZXJlckJhc2UgYXJlIHJlZmVyZW5jaW5nIGVhY2gKLS8vIG90aGVyLiBUaGlzIGludGVyZGVwZW5kZW5jeSBoYXMgdG8gYmUgdHJlYXRlZCBjYXJlZnVsbHkuCi0vLwotLy8gT3RoZXIgaXNzdWVzOgotLy8gRHVyaW5nIHRlYXIgZG93biBvZiB0aGUgd2hvbGUgYnJvd3NlciBvciBhIHRhYiwgdGhlIERPTSB0cmVlIG1heSBub3QgYmUKLS8vIGRlc3RydWN0ZWQgbmljZWx5LCBhbmQgdGhlcmUgd2lsbCBiZSBzb21lIGRhbmdsaW5nIG1lZGlhIHRocmVhZHMgdHJ5aW5nIHRvCi0vLyB0aGUgbWFpbiB0aHJlYWQsIHNvIHdlIG5lZWQgdGhpcyBjbGFzcyB0byBsaXN0ZW4gdG8gZGVzdHJ1Y3Rpb24gZXZlbnQgb2YgdGhlCi0vLyBtYWluIHRocmVhZCBhbmQgY2xlYW51cCB0aGUgbWVkaWEgdGhyZWFkcyB3aGVuIHRoZSBldmVuIGlzIHJlY2VpdmVkLiBBbHNvCi0vLyBhdCBkZXN0cnVjdGlvbiBvZiB0aGlzIGNsYXNzIHdlIHdpbGwgbmVlZCB0byB1bmhvb2sgaXQgZnJvbSBkZXN0cnVjdGlvbiBldmVudAotLy8gbGlzdCBvZiB0aGUgbWFpbiB0aHJlYWQuCi0KLSNpZm5kZWYgTUVESUFfUExBWUVSX1dFQl9NRURJQV9QTEFZRVJfSU1QTF9IXwotI2RlZmluZSBNRURJQV9QTEFZRVJfV0VCX01FRElBX1BMQVlFUl9JTVBMX0hfCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS93ZWFrX3B0ci5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wLmgiCi0jaW5jbHVkZSAiYmFzZS90aW1lLmgiCi0jaW5jbHVkZSAiZ29vZ2xldXJsL3NyYy9ndXJsLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9hdWRpb19yZW5kZXJlcl9zaW5rLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNyeXB0b3IuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lc3NhZ2VfbG9vcF9mYWN0b3J5LmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9waXBlbGluZS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvcmFuZ2VzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaGVsbF92aWRlb19mcmFtZV9wcm92aWRlci5oIgotI2luY2x1ZGUgIm1lZGlhL3BsYXllci9jcnlwdG8va2V5X3N5c3RlbXMuaCIKLSNpbmNsdWRlICJtZWRpYS9wbGF5ZXIvY3J5cHRvL3Byb3h5X2RlY3J5cHRvci5oIgotI2luY2x1ZGUgIm1lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyLmgiCi0jaW5jbHVkZSAibWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfZGVsZWdhdGUuaCIKLSNpbmNsdWRlICJ1aS9nZngvc2l6ZS5oIgotCi0jaWYgZGVmaW5lZChPU19TVEFSQk9BUkQpCi0KLSNpZiBTQl9IQVMoUExBWUVSKQotI2RlZmluZSBDT0JBTFRfU0tJUF9TRUVLX1JFUVVFU1RfTkVBUl9FTkQKLSNlbmRpZiAgLy8gU0JfSEFTKFBMQVlFUikKLQotI2VuZGlmICAvLyBkZWZpbmVkKE9TX1NUQVJCT0FSRCkKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgQXVkaW9SZW5kZXJlclNpbms7Ci1jbGFzcyBDaHVua0RlbXV4ZXI7Ci1jbGFzcyBNZWRpYUxvZzsKLWNsYXNzIFdlYk1lZGlhUGxheWVyUHJveHk7Ci0KLWNsYXNzIFdlYk1lZGlhUGxheWVySW1wbCA6IHB1YmxpYyBXZWJNZWRpYVBsYXllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZXNzYWdlTG9vcDo6RGVzdHJ1Y3Rpb25PYnNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBiYXNlOjpTdXBwb3J0c1dlYWtQdHI8V2ViTWVkaWFQbGF5ZXJJbXBsPiB7Ci0gcHVibGljOgotICAvLyBDb25zdHJ1Y3QgYSBXZWJNZWRpYVBsYXllckltcGwgd2l0aCByZWZlcmVuY2UgdG8gdGhlIGNsaWVudCwgYW5kIG1lZGlhCi0gIC8vIGZpbHRlciBjb2xsZWN0aW9uLiBCeSBwcm92aWRpbmcgdGhlIGZpbHRlciBjb2xsZWN0aW9uIHRoZSBpbXBsZW1lbnRvciBjYW4KLSAgLy8gcHJvdmlkZSBtb3JlIHNwZWNpZmljIG1lZGlhIGZpbHRlcnMgdGhhdCBkb2VzIHJlc291cmNlIGxvYWRpbmcgYW5kCi0gIC8vIHJlbmRlcmluZy4KLSAgLy8KLSAgLy8gV2ViTWVkaWFQbGF5ZXJJbXBsIGNvbWVzIHBhY2thZ2VkIHdpdGggdGhlIGZvbGxvd2luZyBtZWRpYSBmaWx0ZXJzOgotICAvLyAgIC0gVVJMIGZldGNoaW5nCi0gIC8vICAgLSBEZW11eGluZwotICAvLyAgIC0gU29mdHdhcmUgYXVkaW8vdmlkZW8gZGVjb2RpbmcKLSAgLy8gICAtIFZpZGVvIHJlbmRlcmluZwotICAvLwotICAvLyBDbGllbnRzIGFyZSBleHBlY3RlZCB0byBhZGQgdGhlaXIgcGxhdGZvcm0tc3BlY2lmaWMgYXVkaW8gcmVuZGVyaW5nIG1lZGlhCi0gIC8vIGZpbHRlciBpZiB0aGV5IHdpc2ggdG8gaGVhciBhbnkgc291bmQgY29taW5nIG91dCB0aGUgc3BlYWtlcnMsIG90aGVyd2lzZQotICAvLyBhdWRpbyBkYXRhIGlzIGRpc2NhcmRlZCBhbmQgbWVkaWEgcGxheXMgYmFjayBiYXNlZCBvbiB3YWxsIGNsb2NrIHRpbWUuCi0gIC8vCi0gIC8vIFdoZW4gY2FsbGluZyB0aGlzLCB0aGUgfGF1ZGlvX3NvdXJjZV9wcm92aWRlcnwgYW5kCi0gIC8vIHxhdWRpb19yZW5kZXJlcl9zaW5rfCBhcmd1bWVudHMgc2hvdWxkIGJlIHRoZSBzYW1lIG9iamVjdC4KLQotICBXZWJNZWRpYVBsYXllckltcGwoCi0gICAgICBQaXBlbGluZVdpbmRvdyB3aW5kb3csCi0gICAgICBXZWJNZWRpYVBsYXllckNsaWVudCogY2xpZW50LAotICAgICAgV2ViTWVkaWFQbGF5ZXJEZWxlZ2F0ZSogZGVsZWdhdGUsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPFNoZWxsVmlkZW9GcmFtZVByb3ZpZGVyPiYgdmlkZW9fZnJhbWVfcHJvdmlkZXIsCi0gICAgICBzY29wZWRfcHRyPEZpbHRlckNvbGxlY3Rpb24+IGNvbGxlY3Rpb24sCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPEF1ZGlvUmVuZGVyZXJTaW5rPiYgYXVkaW9fcmVuZGVyZXJfc2luaywKLSAgICAgIHNjb3BlZF9wdHI8TWVzc2FnZUxvb3BGYWN0b3J5PiBtZXNzYWdlX2xvb3BfZmFjdG9yeSwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8TWVkaWFMb2c+JiBtZWRpYV9sb2cpOwotICB+V2ViTWVkaWFQbGF5ZXJJbXBsKCkgT1ZFUlJJREU7Ci0KLSAgdm9pZCBMb2FkTWVkaWFTb3VyY2UoKSBPVkVSUklERTsKLSAgdm9pZCBMb2FkUHJvZ3Jlc3NpdmUoY29uc3QgR1VSTCYgdXJsLAotICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfcHRyPEJ1ZmZlcmVkRGF0YVNvdXJjZT4gZGF0YV9zb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIENPUlNNb2RlIGNvcnNfbW9kZSkgT1ZFUlJJREU7Ci0gIHZvaWQgQ2FuY2VsTG9hZCgpIE9WRVJSSURFOwotCi0gIC8vIFBsYXliYWNrIGNvbnRyb2xzLgotICB2b2lkIFBsYXkoKSBPVkVSUklERTsKLSAgdm9pZCBQYXVzZSgpIE9WRVJSSURFOwotICBib29sIFN1cHBvcnRzRnVsbHNjcmVlbigpIGNvbnN0IE9WRVJSSURFOwotICBib29sIFN1cHBvcnRzU2F2ZSgpIGNvbnN0IE9WRVJSSURFOwotICB2b2lkIFNlZWsoZmxvYXQgc2Vjb25kcykgT1ZFUlJJREU7Ci0gIHZvaWQgU2V0RW5kVGltZShmbG9hdCBzZWNvbmRzKSBPVkVSUklERTsKLSAgdm9pZCBTZXRSYXRlKGZsb2F0IHJhdGUpIE9WRVJSSURFOwotICB2b2lkIFNldFZvbHVtZShmbG9hdCB2b2x1bWUpIE9WRVJSSURFOwotICB2b2lkIFNldFZpc2libGUoYm9vbCB2aXNpYmxlKSBPVkVSUklERTsKLSAgdmlydHVhbCBib29sIEdldFRvdGFsQnl0ZXNLbm93bigpOwotICBjb25zdCBSYW5nZXM8YmFzZTo6VGltZURlbHRhPiYgR2V0QnVmZmVyZWRUaW1lUmFuZ2VzKCkgT1ZFUlJJREU7Ci0gIGZsb2F0IEdldE1heFRpbWVTZWVrYWJsZSgpIGNvbnN0IE9WRVJSSURFOwotCi0gIC8vIFN1c3BlbmQvUmVzdW1lCi0gIHZvaWQgU3VzcGVuZCgpIE9WRVJSSURFOwotICB2b2lkIFJlc3VtZSgpIE9WRVJSSURFOwotCi0gIC8vIFRydWUgaWYgdGhlIGxvYWRlZCBtZWRpYSBoYXMgYSBwbGF5YWJsZSB2aWRlby9hdWRpbyB0cmFjay4KLSAgYm9vbCBIYXNWaWRlbygpIGNvbnN0IE9WRVJSSURFOwotICBib29sIEhhc0F1ZGlvKCkgY29uc3QgT1ZFUlJJREU7Ci0KLSAgLy8gRGltZW5zaW9ucyBvZiB0aGUgdmlkZW8uCi0gIGdmeDo6U2l6ZSBHZXROYXR1cmFsU2l6ZSgpIGNvbnN0IE9WRVJSSURFOwotCi0gIC8vIEdldHRlcnMgb2YgcGxheWJhY2sgc3RhdGUuCi0gIGJvb2wgSXNQYXVzZWQoKSBjb25zdCBPVkVSUklERTsKLSAgYm9vbCBJc1NlZWtpbmcoKSBjb25zdCBPVkVSUklERTsKLSAgZmxvYXQgR2V0RHVyYXRpb24oKSBjb25zdCBPVkVSUklERTsKLSAgZmxvYXQgR2V0Q3VycmVudFRpbWUoKSBjb25zdCBPVkVSUklERTsKLQotICAvLyBHZXQgcmF0ZSBvZiBsb2FkaW5nIHRoZSByZXNvdXJjZS4KLSAgaW50MzIgR2V0RGF0YVJhdGUoKSBjb25zdCBPVkVSUklERTsKLQotICAvLyBJbnRlcm5hbCBzdGF0ZXMgb2YgbG9hZGluZyBhbmQgbmV0d29yay4KLSAgLy8gVE9ETyhoY2xhbSk6IEFzayB0aGUgcGlwZWxpbmUgYWJvdXQgdGhlIHN0YXRlIHJhdGhlciB0aGFuIGhhdmluZyByZWFkaW5nCi0gIC8vIHRoZW0gZnJvbSBtZW1iZXJzIHdoaWNoIHdvdWxkIGNhdXNlIHJhY2UgY29uZGl0aW9ucy4KLSAgV2ViTWVkaWFQbGF5ZXI6Ok5ldHdvcmtTdGF0ZSBHZXROZXR3b3JrU3RhdGUoKSBjb25zdCBPVkVSUklERTsKLSAgV2ViTWVkaWFQbGF5ZXI6OlJlYWR5U3RhdGUgR2V0UmVhZHlTdGF0ZSgpIGNvbnN0IE9WRVJSSURFOwotCi0gIGJvb2wgRGlkTG9hZGluZ1Byb2dyZXNzKCkgY29uc3QgT1ZFUlJJREU7Ci0gIHVuc2lnbmVkIGxvbmcgbG9uZyBHZXRUb3RhbEJ5dGVzKCkgY29uc3QgT1ZFUlJJREU7Ci0KLSAgYm9vbCBIYXNTaW5nbGVTZWN1cml0eU9yaWdpbigpIGNvbnN0IE9WRVJSSURFOwotICBib29sIERpZFBhc3NDT1JTQWNjZXNzQ2hlY2soKSBjb25zdCBPVkVSUklERTsKLQotICBmbG9hdCBNZWRpYVRpbWVGb3JUaW1lVmFsdWUoZmxvYXQgdGltZVZhbHVlKSBjb25zdCBPVkVSUklERTsKLQotICB1bnNpZ25lZCBHZXREZWNvZGVkRnJhbWVDb3VudCgpIGNvbnN0IE9WRVJSSURFOwotICB1bnNpZ25lZCBHZXREcm9wcGVkRnJhbWVDb3VudCgpIGNvbnN0IE9WRVJSSURFOwotICB1bnNpZ25lZCBHZXRBdWRpb0RlY29kZWRCeXRlQ291bnQoKSBjb25zdCBPVkVSUklERTsKLSAgdW5zaWduZWQgR2V0VmlkZW9EZWNvZGVkQnl0ZUNvdW50KCkgY29uc3QgT1ZFUlJJREU7Ci0KLSAgc2NvcGVkX3JlZnB0cjxTaGVsbFZpZGVvRnJhbWVQcm92aWRlcj4gR2V0VmlkZW9GcmFtZVByb3ZpZGVyKCkgT1ZFUlJJREU7Ci0gIC8vIFRPRE86IFJlbW92ZSBHZXQvUHV0Q3VycmVudEZyYW1lLgotICBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IEdldEN1cnJlbnRGcmFtZSgpIE9WRVJSSURFOwotICB2b2lkIFB1dEN1cnJlbnRGcmFtZShjb25zdCBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+JiB2aWRlb19mcmFtZSkgT1ZFUlJJREU7Ci0KLSAgQWRkSWRTdGF0dXMgU291cmNlQWRkSWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjb2RlY3MpIE9WRVJSSURFOwotICBib29sIFNvdXJjZVJlbW92ZUlkKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCkgT1ZFUlJJREU7Ci0gIFJhbmdlczxiYXNlOjpUaW1lRGVsdGE+IFNvdXJjZUJ1ZmZlcmVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCkgT1ZFUlJJREU7Ci0gIGJvb2wgU291cmNlQXBwZW5kKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGVuZ3RoKSBPVkVSUklERTsKLSAgYm9vbCBTb3VyY2VBYm9ydChjb25zdCBzdGQ6OnN0cmluZyYgaWQpIE9WRVJSSURFOwotICBkb3VibGUgU291cmNlR2V0RHVyYXRpb24oKSBjb25zdCBPVkVSUklERTsKLSAgdm9pZCBTb3VyY2VTZXREdXJhdGlvbihkb3VibGUgbmV3X2R1cmF0aW9uKSBPVkVSUklERTsKLSAgdm9pZCBTb3VyY2VFbmRPZlN0cmVhbShFbmRPZlN0cmVhbVN0YXR1cyBzdGF0dXMpIE9WRVJSSURFOwotICBib29sIFNvdXJjZVNldFRpbWVzdGFtcE9mZnNldChjb25zdCBzdGQ6OnN0cmluZyYgaWQsIGRvdWJsZSBvZmZzZXQpIE9WRVJSSURFOwotCi0gIE1lZGlhS2V5RXhjZXB0aW9uIEdlbmVyYXRlS2V5UmVxdWVzdChjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluaXRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGluaXRfZGF0YV9sZW5ndGgpIE9WRVJSSURFOwotCi0gIE1lZGlhS2V5RXhjZXB0aW9uIEFkZEtleShjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGtleV9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbml0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbml0X2RhdGFfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25faWQpIE9WRVJSSURFOwotCi0gIE1lZGlhS2V5RXhjZXB0aW9uIENhbmNlbEtleVJlcXVlc3QoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25faWQpIE9WRVJSSURFOwotCi0gIFNldEJvdW5kc0NCIEdldFNldEJvdW5kc0NCKCkgT1ZFUlJJREU7Ci0KLSAgLy8gQXMgd2UgYXJlIGNsb3NpbmcgdGhlIHRhYiBvciBldmVuIHRoZSBicm93c2VyLCB8bWFpbl9sb29wX3wgaXMgZGVzdHJveWVkCi0gIC8vIGV2ZW4gYmVmb3JlIHRoaXMgb2JqZWN0IGdldHMgZGVzdHJ1Y3RlZCwgc28gd2UgbmVlZCB0byBrbm93IHdoZW4KLSAgLy8gfG1haW5fbG9vcF98IGlzIGJlaW5nIGRlc3Ryb3llZCBhbmQgd2UgY2FuIHN0b3AgcG9zdGluZyByZXBhaW50IHRhc2sKLSAgLy8gdG8gaXQuCi0gIHZvaWQgV2lsbERlc3Ryb3lDdXJyZW50TWVzc2FnZUxvb3AoKSBPVkVSUklERTsKLQotICBib29sIEdldERlYnVnUmVwb3J0RGF0YUFkZHJlc3Modm9pZCoqIG91dF9hZGRyZXNzLCBzaXplX3QqIG91dF9zaXplKSBPVkVSUklERTsKLQotICB2b2lkIE9uUGlwZWxpbmVTZWVrKFBpcGVsaW5lU3RhdHVzIHN0YXR1cyk7Ci0gIHZvaWQgT25QaXBlbGluZUVuZGVkKFBpcGVsaW5lU3RhdHVzIHN0YXR1cyk7Ci0gIHZvaWQgT25QaXBlbGluZUVycm9yKFBpcGVsaW5lU3RhdHVzIGVycm9yKTsKLSAgdm9pZCBPblBpcGVsaW5lQnVmZmVyaW5nU3RhdGUoUGlwZWxpbmU6OkJ1ZmZlcmluZ1N0YXRlIGJ1ZmZlcmluZ19zdGF0ZSk7Ci0gIHZvaWQgT25EZW11eGVyT3BlbmVkKCk7Ci0gIHZvaWQgT25LZXlBZGRlZChjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25faWQpOwotICB2b2lkIE9uS2V5RXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCwKLSAgICAgICAgICAgICAgICAgIERlY3J5cHRvcjo6S2V5RXJyb3IgZXJyb3JfY29kZSwKLSAgICAgICAgICAgICAgICAgIGludCBzeXN0ZW1fY29kZSk7Ci0gIHZvaWQgT25LZXlNZXNzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEdVUkwmIGRlZmF1bHRfdXJsKTsKLSAgdm9pZCBPbk5lZWRLZXkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLAotICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCwKLSAgICAgICAgICAgICAgICAgc2NvcGVkX2FycmF5PHVpbnQ4PiBpbml0X2RhdGEsCi0gICAgICAgICAgICAgICAgIGludCBpbml0X2RhdGFfc2l6ZSk7Ci0gIHZvaWQgU2V0T3BhcXVlKGJvb2wpOwotCi0gcHJpdmF0ZToKLSAgLy8gQ2FsbGVkIHdoZW4gdGhlIGRhdGEgc291cmNlIGlzIGRvd25sb2FkaW5nIG9yIHBhdXNlZC4KLSAgdm9pZCBPbkRvd25sb2FkaW5nU3RhdHVzQ2hhbmdlZChib29sIGlzX2Rvd25sb2FkaW5nKTsKLQotICAvLyBGaW5pc2hlcyBzdGFydGluZyB0aGUgcGlwZWxpbmUgZHVlIHRvIGEgY2FsbCB0byBsb2FkKCkuCi0gIHZvaWQgU3RhcnRQaXBlbGluZSgpOwotCi0gIC8vIEhlbHBlcnMgdGhhdCBzZXQgdGhlIG5ldHdvcmsvcmVhZHkgc3RhdGUgYW5kIG5vdGlmaWVzIHRoZSBjbGllbnQgaWYKLSAgLy8gdGhleSd2ZSBjaGFuZ2VkLgotICB2b2lkIFNldE5ldHdvcmtTdGF0ZShXZWJNZWRpYVBsYXllcjo6TmV0d29ya1N0YXRlIHN0YXRlKTsKLSAgdm9pZCBTZXRSZWFkeVN0YXRlKFdlYk1lZGlhUGxheWVyOjpSZWFkeVN0YXRlIHN0YXRlKTsKLQotICAvLyBEZXN0cm95IHJlc291cmNlcyBoZWxkLgotICB2b2lkIERlc3Ryb3koKTsKLQotICB2b2lkIEdldE1lZGlhVGltZUFuZFNlZWtpbmdTdGF0ZShiYXNlOjpUaW1lRGVsdGEqIG1lZGlhX3RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGlzX3NlZWtpbmcpIGNvbnN0OwotCi0gIC8vIEdldHRlciBtZXRob2QgdG8gfGNsaWVudF98LgotICBXZWJNZWRpYVBsYXllckNsaWVudCogR2V0Q2xpZW50KCk7Ci0KLSAgLy8gQ2FsbGJhY2tzIHRoYXQgZm9yd2FyZCBkdXJhdGlvbiBjaGFuZ2UgZnJvbSB8cGlwZWxpbmVffCB0byB8Y2xpZW50X3wuCi0gIHZvaWQgT25EdXJhdGlvbkNoYW5nZWQoKTsKLQotICAvLyBBY3R1YWxseSBkbyB0aGUgd29yayBmb3IgZ2VuZXJhdGVLZXlSZXF1ZXN0L2FkZEtleSBzbyB0aGV5IGNhbiBlYXNpbHkKLSAgLy8gcmVwb3J0IHJlc3VsdHMgdG8gVU1BLgotICBNZWRpYUtleUV4Y2VwdGlvbiBHZW5lcmF0ZUtleVJlcXVlc3RJbnRlcm5hbChjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW5pdF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbml0X2RhdGFfbGVuZ3RoKTsKLSAgTWVkaWFLZXlFeGNlcHRpb24gQWRkS2V5SW50ZXJuYWwoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQga2V5X2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW5pdF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbml0X2RhdGFfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCk7Ci0gIE1lZGlhS2V5RXhjZXB0aW9uIENhbmNlbEtleVJlcXVlc3RJbnRlcm5hbChjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkKTsKLQotICAvLyBUT0RPKGhjbGFtKTogZ2V0IHJpZCBvZiB0aGVzZSBtZW1iZXJzIGFuZCByZWFkIGZyb20gdGhlIHBpcGVsaW5lIGRpcmVjdGx5LgotICBXZWJNZWRpYVBsYXllcjo6TmV0d29ya1N0YXRlIG5ldHdvcmtfc3RhdGVfOwotICBXZWJNZWRpYVBsYXllcjo6UmVhZHlTdGF0ZSByZWFkeV9zdGF0ZV87Ci0KLSAgLy8gS2VlcCBhIGxpc3Qgb2YgYnVmZmVyZWQgdGltZSByYW5nZXMuCi0gIFJhbmdlczxiYXNlOjpUaW1lRGVsdGE+IGJ1ZmZlcmVkXzsKLQotICAvLyBNZXNzYWdlIGxvb3BzIGZvciBwb3N0aW5nIHRhc2tzIGJldHdlZW4gQ2hyb21lJ3MgbWFpbiB0aHJlYWQuIEFsc28gdXNlZAotICAvLyBmb3IgRENIRUNLcyBzbyBtZXRob2RzIGNhbGxzIHdvbid0IGV4ZWN1dGUgaW4gdGhlIHdyb25nIHRocmVhZC4KLSAgTWVzc2FnZUxvb3AqIG1haW5fbG9vcF87Ci0KLSAgc2NvcGVkX3B0cjxGaWx0ZXJDb2xsZWN0aW9uPiBmaWx0ZXJfY29sbGVjdGlvbl87Ci0gIHNjb3BlZF9yZWZwdHI8UGlwZWxpbmU+IHBpcGVsaW5lXzsKLQotICAvLyBUaGUgY3VycmVudGx5IHNlbGVjdGVkIGtleSBzeXN0ZW0uIEVtcHR5IHN0cmluZyBtZWFucyB0aGF0IG5vIGtleSBzeXN0ZW0KLSAgLy8gaGFzIGJlZW4gc2VsZWN0ZWQuCi0gIHN0ZDo6c3RyaW5nIGN1cnJlbnRfa2V5X3N5c3RlbV87Ci0KLSAgc2NvcGVkX3B0cjxNZXNzYWdlTG9vcEZhY3Rvcnk+IG1lc3NhZ2VfbG9vcF9mYWN0b3J5XzsKLQotICAvLyBJbnRlcm5hbCBzdGF0ZSBvZiB0aGUgV2ViTWVkaWFQbGF5ZXIuIEdhdGhlcmVkIGluIG9uZSBzdHJ1Y3QgdG8gc3VwcG9ydAotICAvLyBzZXJpYWxpemF0aW9uIG9mIHRoaXMgc3RhdGUgaW4gZGVidWcgbG9ncy4gVGhpcyBzaG91bGQgbm90IGNvbnRhaW4gYW55Ci0gIC8vIHNlbnNpdGl2ZSBvciBwb3RlbnRpYWxseSBQSUkuCi0gIHN0cnVjdCBXZWJNZWRpYVBsYXllclN0YXRlIHsKLSAgICBXZWJNZWRpYVBsYXllclN0YXRlKCkKLSAgICAgICAgOiBwYXVzZWQodHJ1ZSksCi0gICAgICAgICAgc2Vla2luZyhmYWxzZSksCi0gICAgICAgICAgcGxheWJhY2tfcmF0ZSgwLjBmKSwKLSAgICAgICAgICBwZW5kaW5nX3NlZWsoZmFsc2UpLAotICAgICAgICAgIHBlbmRpbmdfc2Vla19zZWNvbmRzKDAuMGYpLAotICAgICAgICAgIHN0YXJ0aW5nKGZhbHNlKSwKLSAgICAgICAgICBpc19wcm9ncmVzc2l2ZShmYWxzZSksCi0gICAgICAgICAgaXNfbWVkaWFfc291cmNlKGZhbHNlKSB7fQotICAgIC8vIFBsYXliYWNrIHN0YXRlLgotICAgIC8vCi0gICAgLy8gVE9ETyhzY2hlcmt1cyk6IHdlIGhhdmUgdGhlc2UgYmVjYXVzZSBQaXBlbGluZSBmYXZvdXJzIHRoZSBzaW1wbGljaXR5IG9mCi0gICAgLy8gYSBzaW5nbGUgInBsYXliYWNrIHJhdGUiIG92ZXIgd29ycnlpbmcgYWJvdXQgcGF1c2VkL3N0b3BwZWQgZXRjLi4uICBJdAotICAgIC8vIGZvcmNlcyBhbGwgY2xpZW50cyB0byBtYW5hZ2UgdGhlIHBhdXNlK3BsYXliYWNrIHJhdGUgZXh0ZXJuYWxseSwgYnV0IGlzCi0gICAgLy8gdGhhdCByZWFsbHkgYSBiYWQgdGhpbmc/Ci0gICAgLy8KLSAgICAvLyBUT0RPKHNjaGVya3VzKTogc2luY2UgU2V0UGxheWJhY2tSYXRlKDApIGlzIGFzeW5jaHJvbm91cyBhbmQgd2UgZG9uJ3QKLSAgICAvLyB3YW50IHRvIGhhbmcgdGhlIHJlbmRlciB0aHJlYWQgZHVyaW5nIHBhdXNlKCksIHdlIHJlY29yZCB0aGUgdGltZSBhdCB0aGUKLSAgICAvLyBzYW1lIHRpbWUgd2UgcGF1c2UgYW5kIHRoZW4gcmV0dXJuIHRoYXQgdmFsdWUgaW4gY3VycmVudFRpbWUoKS4KLSAgICAvLyBPdGhlcndpc2Ugb3VyIGNsb2NrIGNhbiBjcmVlcCBmb3J3YXJkIGEgbGl0dGxlIGJpdCB3aGlsZSB0aGUgYXN5bmNocm9ub3VzCi0gICAgLy8gU2V0UGxheWJhY2tSYXRlKDApIGlzIGJlaW5nIGV4ZWN1dGVkLgotICAgIGJvb2wgcGF1c2VkOwotICAgIGJvb2wgc2Vla2luZzsKLSAgICBmbG9hdCBwbGF5YmFja19yYXRlOwotICAgIGJhc2U6OlRpbWVEZWx0YSBwYXVzZWRfdGltZTsKLQotICAgIC8vIFNlZWsgZ2V0cyBwZW5kaW5nIGlmIGFub3RoZXIgc2VlayBpcyBpbiBwcm9ncmVzcy4gT25seSBsYXN0IHBlbmRpbmcgc2VlawotICAgIC8vIHdpbGwgaGF2ZSBlZmZlY3QuCi0gICAgYm9vbCBwZW5kaW5nX3NlZWs7Ci0gICAgZmxvYXQgcGVuZGluZ19zZWVrX3NlY29uZHM7Ci0KLSAgICBib29sIHN0YXJ0aW5nOwotCi0gICAgYm9vbCBpc19wcm9ncmVzc2l2ZTsKLSAgICBib29sIGlzX21lZGlhX3NvdXJjZTsKLSAgfSBzdGF0ZV87Ci0KLSAgV2ViTWVkaWFQbGF5ZXJDbGllbnQqIGNsaWVudF87Ci0gIFdlYk1lZGlhUGxheWVyRGVsZWdhdGUqIGRlbGVnYXRlXzsKLSAgc2NvcGVkX3JlZnB0cjxTaGVsbFZpZGVvRnJhbWVQcm92aWRlcj4gdmlkZW9fZnJhbWVfcHJvdmlkZXJfOwotCi0gIHNjb3BlZF9yZWZwdHI8V2ViTWVkaWFQbGF5ZXJQcm94eT4gcHJveHlfOwotCi0gIHNjb3BlZF9yZWZwdHI8TWVkaWFMb2c+IG1lZGlhX2xvZ187Ci0KLSAgYm9vbCBpbmNyZW1lbnRlZF9leHRlcm5hbGx5X2FsbG9jYXRlZF9tZW1vcnlfOwotCi0gIHNjb3BlZF9yZWZwdHI8QXVkaW9SZW5kZXJlclNpbms+IGF1ZGlvX3JlbmRlcmVyX3NpbmtfOwotCi0gIGJvb2wgaXNfbG9jYWxfc291cmNlXzsKLSAgYm9vbCBzdXBwb3J0c19zYXZlXzsKLQotICAvLyBUaGUgZGVjcnlwdG9yIHRoYXQgbWFuYWdlcyBkZWNyeXB0aW9uIGtleXMgYW5kIGRlY3J5cHRzIGVuY3J5cHRlZCBmcmFtZXMuCi0gIHNjb3BlZF9wdHI8UHJveHlEZWNyeXB0b3I+IGRlY3J5cHRvcl87Ci0KLSAgc2NvcGVkX3JlZnB0cjxDaHVua0RlbXV4ZXI+IGNodW5rX2RlbXV4ZXJfOwotCi0gIC8vIFRlbXBvcmFyeSBmb3IgRU1FIHYwLjEuIEluIHRoZSBmdXR1cmUgdGhlIGluaXQgZGF0YSB0eXBlIHNob3VsZCBiZSBwYXNzZWQKLSAgLy8gdGhyb3VnaCBHZW5lcmF0ZUtleVJlcXVlc3QoKSBkaXJlY3RseS4KLSAgc3RkOjpzdHJpbmcgaW5pdF9kYXRhX3R5cGVfOwotCi0jaWYgZGVmaW5lZChfX0xCX0FORFJPSURfXykKLSAgQXVkaW9Gb2N1c0JyaWRnZSBhdWRpb19mb2N1c19icmlkZ2VfOwotI2VuZGlmICAvLyBkZWZpbmVkKF9fTEJfQU5EUk9JRF9fKQotCi0gIC8vIFN1cHByZXNzZXMgY2FsbHMgdG8gT25QaXBlbGluZUVycm9yKCkgYWZ0ZXIgZGVzdHJ1Y3Rpb24gLyBzaHV0ZG93biBoYXMgYmVlbgotICAvLyBzdGFydGVkOyBwcmV2ZW50cyB1cyBmcm9tIHNwdXJpb3VzbHkgbG9nZ2luZyBlcnJvcnMgdGhhdCBhcmUgdHJhbnNpZW50IG9yCi0gIC8vIHVuaW1wb3J0YW50LgotICBib29sIHN1cHByZXNzX2Rlc3RydWN0aW9uX2Vycm9yc187Ci0KLSAgYmFzZTo6Q2FsbGJhY2s8dm9pZChiYXNlOjpUaW1lRGVsdGEqLCBib29sKik+Ci0gICAgICBtZWRpYV90aW1lX2FuZF9zZWVraW5nX3N0YXRlX2NiXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oV2ViTWVkaWFQbGF5ZXJJbXBsKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX1BMQVlFUl9XRUJfTUVESUFfUExBWUVSX0lNUExfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9wcm94eS5jYyBiL3NyYy9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9wcm94eS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWViZWM0OC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfcHJveHkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyX3Byb3h5LmgiCi0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcF9wcm94eS5oIgotI2lmIGRlZmluZWQoX0RFQlVHKQotI2luY2x1ZGUgImJhc2Uvc3RyaW5nX251bWJlcl9jb252ZXJzaW9ucy5oIgotI2VuZGlmCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9waXBlbGluZV9zdGF0dXMuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL3ZpZGVvX3JlbmRlcmVyX2Jhc2UuaCIKLSNpbmNsdWRlICJtZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9pbXBsLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIExpbWl0cyB0aGUgbWF4aW11bSBvdXRzdGFuZGluZyByZXBhaW50cyBwb3N0ZWQgb24gcmVuZGVyIHRocmVhZC4KLS8vIFRoaXMgbnVtYmVyIG9mIDUwIGlzIGEgZ3Vlc3MsIGl0IGRvZXMgbm90IHRha2UgdG9vIG11Y2ggbWVtb3J5IG9uIHRoZSB0YXNrCi0vLyBxdWV1ZSBidXQgZ2l2ZXMgdXAgYSBwcmV0dHkgZ29vZCBsYXRlbmN5IG9uIHJlcGFpbnQuCi1zdGF0aWMgY29uc3QgaW50IGtNYXhPdXRzdGFuZGluZ1JlcGFpbnRzID0gNTA7Ci0KLVdlYk1lZGlhUGxheWVyUHJveHk6OldlYk1lZGlhUGxheWVyUHJveHkoCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgcmVuZGVyX2xvb3AsCi0gICAgV2ViTWVkaWFQbGF5ZXJJbXBsKiB3ZWJtZWRpYXBsYXllcikKLSAgICA6IHJlbmRlcl9sb29wXyhyZW5kZXJfbG9vcCksCi0gICAgICB3ZWJtZWRpYXBsYXllcl8od2VibWVkaWFwbGF5ZXIpIHsKLSAgRENIRUNLKHJlbmRlcl9sb29wXyk7Ci0gIERDSEVDSyh3ZWJtZWRpYXBsYXllcl8pOwotfQotCi1XZWJNZWRpYVBsYXllclByb3h5Ojp+V2ViTWVkaWFQbGF5ZXJQcm94eSgpIHsKLSAgRGV0YWNoKCk7Ci19Ci0KLXZvaWQgV2ViTWVkaWFQbGF5ZXJQcm94eTo6UGFpbnQoU2tDYW52YXMqIGNhbnZhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Z4OjpSZWN0JiBkZXN0X3JlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWxwaGEpIHsKLSAgRENIRUNLKHJlbmRlcl9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgaWYgKGZyYW1lX3Byb3ZpZGVyXykgewotICAgIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gdmlkZW9fZnJhbWU7Ci0gICAgZnJhbWVfcHJvdmlkZXJfLT5HZXRDdXJyZW50RnJhbWUoJnZpZGVvX2ZyYW1lKTsKLSAgICB2aWRlb19yZW5kZXJlcl8uUGFpbnQodmlkZW9fZnJhbWUsIGNhbnZhcywgZGVzdF9yZWN0LCBhbHBoYSk7Ci0gICAgZnJhbWVfcHJvdmlkZXJfLT5QdXRDdXJyZW50RnJhbWUodmlkZW9fZnJhbWUpOwotICB9Ci19Ci0KLWJvb2wgV2ViTWVkaWFQbGF5ZXJQcm94eTo6SGFzU2luZ2xlT3JpZ2luKCkgewotICBEQ0hFQ0socmVuZGVyX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBpZiAoZGF0YV9zb3VyY2VfKQotICAgIHJldHVybiBkYXRhX3NvdXJjZV8tPkhhc1NpbmdsZU9yaWdpbigpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBXZWJNZWRpYVBsYXllclByb3h5OjpEaWRQYXNzQ09SU0FjY2Vzc0NoZWNrKCkgY29uc3QgewotICBEQ0hFQ0socmVuZGVyX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICBpZiAoZGF0YV9zb3VyY2VfKQotICAgIHJldHVybiBkYXRhX3NvdXJjZV8tPkRpZFBhc3NDT1JTQWNjZXNzQ2hlY2soKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFdlYk1lZGlhUGxheWVyUHJveHk6OkFib3J0RGF0YVNvdXJjZSgpIHsKLSAgRENIRUNLKHJlbmRlcl9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgaWYgKGRhdGFfc291cmNlXykKLSAgICBkYXRhX3NvdXJjZV8tPkFib3J0KCk7Ci19Ci0KLXZvaWQgV2ViTWVkaWFQbGF5ZXJQcm94eTo6RGV0YWNoKCkgewotICBEQ0hFQ0socmVuZGVyX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotICB3ZWJtZWRpYXBsYXllcl8gPSBOVUxMOwotICBkYXRhX3NvdXJjZV8ucmVzZXQoKTsKLSAgZnJhbWVfcHJvdmlkZXJfID0gTlVMTDsKLX0KLQotdm9pZCBXZWJNZWRpYVBsYXllclByb3h5OjpHZXRDdXJyZW50RnJhbWUoCi0gICAgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiogZnJhbWVfb3V0KSB7Ci0gIGlmIChmcmFtZV9wcm92aWRlcl8pCi0gICAgZnJhbWVfcHJvdmlkZXJfLT5HZXRDdXJyZW50RnJhbWUoZnJhbWVfb3V0KTsKLX0KLQotdm9pZCBXZWJNZWRpYVBsYXllclByb3h5OjpQdXRDdXJyZW50RnJhbWUoc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiBmcmFtZSkgewotICBpZiAoZnJhbWVfcHJvdmlkZXJfKQotICAgIGZyYW1lX3Byb3ZpZGVyXy0+UHV0Q3VycmVudEZyYW1lKGZyYW1lKTsKLX0KLQotdm9pZCBXZWJNZWRpYVBsYXllclByb3h5OjpLZXlBZGRlZChjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25faWQpIHsKLSAgcmVuZGVyX2xvb3BfLT5Qb3N0VGFzayhGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmV2ViTWVkaWFQbGF5ZXJQcm94eTo6S2V5QWRkZWRUYXNrLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3N5c3RlbSwgc2Vzc2lvbl9pZCkpOwotfQotCi12b2lkIFdlYk1lZGlhUGxheWVyUHJveHk6OktleUVycm9yKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdG9yOjpLZXlFcnJvciBlcnJvcl9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3lzdGVtX2NvZGUpIHsKLSAgcmVuZGVyX2xvb3BfLT5Qb3N0VGFzaygKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmV2ViTWVkaWFQbGF5ZXJQcm94eTo6S2V5RXJyb3JUYXNrLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9zeXN0ZW0sIHNlc3Npb25faWQsIGVycm9yX2NvZGUsIHN5c3RlbV9jb2RlKSk7Ci19Ci0KLXZvaWQgV2ViTWVkaWFQbGF5ZXJQcm94eTo6S2V5TWVzc2FnZShjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGVmYXVsdF91cmwpIHsKLSNpZiBkZWZpbmVkKF9ERUJVRykKLSAgc3RkOjpzdHJpbmcgaGV4ID0gYmFzZTo6SGV4RW5jb2RlKG1lc3NhZ2UuZGF0YSgpLCBtZXNzYWdlLnNpemUoKSk7Ci0gIERMT0coSU5GTykgPDwgIkRSTSBLZXkgUmVxdWVzdDogIiA8PCBoZXg7Ci0jZW5kaWYKLQotICByZW5kZXJfbG9vcF8tPlBvc3RUYXNrKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZXZWJNZWRpYVBsYXllclByb3h5OjpLZXlNZXNzYWdlVGFzaywgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfc3lzdGVtLCBzZXNzaW9uX2lkLCBtZXNzYWdlLCBkZWZhdWx0X3VybCkpOwotfQotCi12b2lkIFdlYk1lZGlhUGxheWVyUHJveHk6Ok5lZWRLZXkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX2FycmF5PHVpbnQ4PiBpbml0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluaXRfZGF0YV9zaXplKSB7Ci0gIHJlbmRlcl9sb29wXy0+UG9zdFRhc2soCi0gICAgICBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kKCZXZWJNZWRpYVBsYXllclByb3h5OjpOZWVkS2V5VGFzaywgdGhpcywga2V5X3N5c3RlbSwKLSAgICAgICAgICAgICAgICAgc2Vzc2lvbl9pZCwgdHlwZSwgYmFzZTo6UGFzc2VkKCZpbml0X2RhdGEpLCBpbml0X2RhdGFfc2l6ZSkpOwotfQotCi12b2lkIFdlYk1lZGlhUGxheWVyUHJveHk6OktleUFkZGVkVGFzayhjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkKSB7Ci0gIERDSEVDSyhyZW5kZXJfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIGlmICh3ZWJtZWRpYXBsYXllcl8pCi0gICAgd2VibWVkaWFwbGF5ZXJfLT5PbktleUFkZGVkKGtleV9zeXN0ZW0sIHNlc3Npb25faWQpOwotfQotCi12b2lkIFdlYk1lZGlhUGxheWVyUHJveHk6OktleUVycm9yVGFzayhjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdG9yOjpLZXlFcnJvciBlcnJvcl9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN5c3RlbV9jb2RlKSB7Ci0gIERDSEVDSyhyZW5kZXJfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIGlmICh3ZWJtZWRpYXBsYXllcl8pCi0gICAgd2VibWVkaWFwbGF5ZXJfLT5PbktleUVycm9yKGtleV9zeXN0ZW0sIHNlc3Npb25faWQsIGVycm9yX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbV9jb2RlKTsKLX0KLQotdm9pZCBXZWJNZWRpYVBsYXllclByb3h5OjpLZXlNZXNzYWdlVGFzayhjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGVmYXVsdF91cmwpIHsKLSAgRENIRUNLKHJlbmRlcl9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgaWYgKHdlYm1lZGlhcGxheWVyXykgewotICAgIGNvbnN0IEdVUkwgZGVmYXVsdF91cmxfZ3VybChkZWZhdWx0X3VybCk7Ci0gICAgRExPR19JRihXQVJOSU5HLCAhZGVmYXVsdF91cmwuZW1wdHkoKSAmJiAhZGVmYXVsdF91cmxfZ3VybC5pc192YWxpZCgpKQotICAgICAgICA8PCAiSW52YWxpZCBVUkwgaW4gZGVmYXVsdF91cmw6ICIgPDwgZGVmYXVsdF91cmw7Ci0gICAgd2VibWVkaWFwbGF5ZXJfLT5PbktleU1lc3NhZ2Uoa2V5X3N5c3RlbSwgc2Vzc2lvbl9pZCwgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X3VybF9ndXJsKTsKLSAgfQotfQotCi12b2lkIFdlYk1lZGlhUGxheWVyUHJveHk6Ok5lZWRLZXlUYXNrKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9hcnJheTx1aW50OD4gaW5pdF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5pdF9kYXRhX3NpemUpIHsKLSAgRENIRUNLKHJlbmRlcl9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgaWYgKHdlYm1lZGlhcGxheWVyXykKLSAgICB3ZWJtZWRpYXBsYXllcl8tPk9uTmVlZEtleShrZXlfc3lzdGVtLCBzZXNzaW9uX2lkLCB0eXBlLCBpbml0X2RhdGEuUGFzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfZGF0YV9zaXplKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfcHJveHkuaCBiL3NyYy9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9wcm94eS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzA3YmE4Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9wcm94eS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfUExBWUVSX1dFQl9NRURJQV9QTEFZRVJfUFJPWFlfSF8KLSNkZWZpbmUgTUVESUFfUExBWUVSX1dFQl9NRURJQV9QTEFZRVJfUFJPWFlfSF8KLQotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNyeXB0b3JfY2xpZW50LmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9waXBlbGluZS5oIgotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvY2h1bmtfZGVtdXhlci5oIgotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvc2tjYW52YXNfdmlkZW9fcmVuZGVyZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9wbGF5ZXIvYnVmZmVyZWRfZGF0YV9zb3VyY2UuaCIKLSNpbmNsdWRlICJ1aS9nZngvcmVjdC5oIgotCi1jbGFzcyBTa0NhbnZhczsKLQotbmFtZXNwYWNlIGJhc2UgewotY2xhc3MgTWVzc2FnZUxvb3BQcm94eTsKLX0KLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgVmlkZW9GcmFtZTsKLWNsYXNzIFZpZGVvUmVuZGVyZXJCYXNlOwotY2xhc3MgV2ViTWVkaWFQbGF5ZXJJbXBsOwotCi0vLyBBY3RzIGFzIGEgdGhyZWFkIHByb3h5IGJldHdlZW4gdGhlIHZhcmlvdXMgdGhyZWFkcyB1c2VkIGZvciBtdWx0aW1lZGlhIGFuZAotLy8gdGhlIHJlbmRlciB0aHJlYWQgdGhhdCBXZWJNZWRpYVBsYXllckltcGwgaXMgcnVubmluZyBvbi4KLWNsYXNzIFdlYk1lZGlhUGxheWVyUHJveHkKLSAgICA6IHB1YmxpYyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxXZWJNZWRpYVBsYXllclByb3h5PiwKLSAgICAgIHB1YmxpYyBEZWNyeXB0b3JDbGllbnQgewotIHB1YmxpYzoKLSAgV2ViTWVkaWFQbGF5ZXJQcm94eShjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+JiByZW5kZXJfbG9vcCwKLSAgICAgICAgICAgICAgICAgICAgICBXZWJNZWRpYVBsYXllckltcGwqIHdlYm1lZGlhcGxheWVyKTsKLSAgQnVmZmVyZWREYXRhU291cmNlKiBkYXRhX3NvdXJjZSgpIHsgcmV0dXJuIGRhdGFfc291cmNlXy5nZXQoKTsgfQotICB2b2lkIHNldF9kYXRhX3NvdXJjZShzY29wZWRfcHRyPEJ1ZmZlcmVkRGF0YVNvdXJjZT4gZGF0YV9zb3VyY2UpIHsKLSAgICBkYXRhX3NvdXJjZV8gPSBkYXRhX3NvdXJjZS5QYXNzKCk7Ci0gIH0KLQotICAvLyBUT0RPKHNjaGVya3VzKTogcmVtb3ZlIHRoaXMgb25jZSBWaWRlb1JlbmRlcmVyQmFzZTo6UGFpbnRDQiBwYXNzZXMKLSAgLy8gb3duZXJzaGlwIG9mIHRoZSBWaWRlb0ZyYW1lIGh0dHA6Ly9jcmJ1Zy5jb20vMTA4NDM1Ci0gIHZvaWQgc2V0X2ZyYW1lX3Byb3ZpZGVyKFZpZGVvUmVuZGVyZXJCYXNlKiBmcmFtZV9wcm92aWRlcikgewotICAgIGZyYW1lX3Byb3ZpZGVyXyA9IGZyYW1lX3Byb3ZpZGVyOwotICB9Ci0KLSAgLy8gTWV0aG9kcyBmb3IgV2ViTWVkaWFQbGF5ZXJJbXBsIC0+IEZpbHRlciBjb21tdW5pY2F0aW9uLgotICB2b2lkIFBhaW50KFNrQ2FudmFzKiBjYW52YXMsIGNvbnN0IGdmeDo6UmVjdCYgZGVzdF9yZWN0LCB1aW50OF90IGFscGhhKTsKLSAgdm9pZCBEZXRhY2goKTsKLSAgdm9pZCBHZXRDdXJyZW50RnJhbWUoc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiogZnJhbWVfb3V0KTsKLSAgdm9pZCBQdXRDdXJyZW50RnJhbWUoc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiBmcmFtZSk7Ci0gIGJvb2wgSGFzU2luZ2xlT3JpZ2luKCk7Ci0gIGJvb2wgRGlkUGFzc0NPUlNBY2Nlc3NDaGVjaygpIGNvbnN0OwotCi0gIHZvaWQgQWJvcnREYXRhU291cmNlKCk7Ci0KLSAgLy8gRGVjcnlwdG9yQ2xpZW50IGltcGxlbWVudGF0aW9uLgotICB2aXJ0dWFsIHZvaWQgS2V5QWRkZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBLZXlFcnJvcihjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdG9yOjpLZXlFcnJvciBlcnJvcl9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN5c3RlbV9jb2RlKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIEtleU1lc3NhZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRlZmF1bHRfdXJsKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIE5lZWRLZXkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX2FycmF5PHVpbnQ4PiBpbml0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBpbml0X2RhdGFfc2l6ZSkgT1ZFUlJJREU7Ci0KLSBwcml2YXRlOgotICBmcmllbmQgY2xhc3MgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8V2ViTWVkaWFQbGF5ZXJQcm94eT47Ci0gIHZpcnR1YWwgfldlYk1lZGlhUGxheWVyUHJveHkoKTsKLQotICAvLyBOb3RpZnkgfHdlYm1lZGlhcGxheWVyX3wgdGhhdCBhIGtleSBoYXMgYmVlbiBhZGRlZC4KLSAgdm9pZCBLZXlBZGRlZFRhc2soY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkKTsKLQotICAvLyBOb3RpZnkgfHdlYm1lZGlhcGxheWVyX3wgdGhhdCBhIGtleSBlcnJvciBvY2N1cnJlZC4KLSAgdm9pZCBLZXlFcnJvclRhc2soY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkLAotICAgICAgICAgICAgICAgICAgICBEZWNyeXB0b3I6OktleUVycm9yIGVycm9yX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgIGludCBzeXN0ZW1fY29kZSk7Ci0KLSAgLy8gTm90aWZ5IHx3ZWJtZWRpYXBsYXllcl98IHRoYXQgYSBrZXkgbWVzc2FnZSBoYXMgYmVlbiBnZW5lcmF0ZWQuCi0gIHZvaWQgS2V5TWVzc2FnZVRhc2soY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25faWQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRlZmF1bHRfdXJsKTsKLQotICAvLyBOb3RpZnkgfHdlYm1lZGlhcGxheWVyX3wgdGhhdCBhIGtleSBpcyBuZWVkZWQgZm9yIGRlY3J5cHRpb24uCi0gIHZvaWQgTmVlZEtleVRhc2soY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25faWQsCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgc2NvcGVkX2FycmF5PHVpbnQ4PiBpbml0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgaW50IGluaXRfZGF0YV9zaXplKTsKLQotICAvLyBUaGUgcmVuZGVyIG1lc3NhZ2UgbG9vcCB3aGVyZSB0aGUgcmVuZGVyZXIgbGl2ZXMuCi0gIHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4gcmVuZGVyX2xvb3BfOwotICBXZWJNZWRpYVBsYXllckltcGwqIHdlYm1lZGlhcGxheWVyXzsKLQotICBzY29wZWRfcHRyPEJ1ZmZlcmVkRGF0YVNvdXJjZT4gZGF0YV9zb3VyY2VfOwotICBzY29wZWRfcmVmcHRyPFZpZGVvUmVuZGVyZXJCYXNlPiBmcmFtZV9wcm92aWRlcl87Ci0gIFNrQ2FudmFzVmlkZW9SZW5kZXJlciB2aWRlb19yZW5kZXJlcl87Ci0KLSAgRElTQUxMT1dfSU1QTElDSVRfQ09OU1RSVUNUT1JTKFdlYk1lZGlhUGxheWVyUHJveHkpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfUExBWUVSX1dFQl9NRURJQV9QTEFZRVJfUFJPWFlfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9zaGFyZWRfbWVtb3J5X3N1cHBvcnQuZ3lwaSBiL3NyYy9tZWRpYS9zaGFyZWRfbWVtb3J5X3N1cHBvcnQuZ3lwaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkxZWRmNS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvc2hhcmVkX21lbW9yeV9zdXBwb3J0Lmd5cGkKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi17Ci0gICd2YXJpYWJsZXMnOiB7Ci0gICAgJ2Nocm9taXVtX2NvZGUnOiAxLAotICAgICMgVGhlc2UgYXJlIGRlZmluZWQgaGVyZSBiZWNhdXNlIHdlIG5lZWQgdG8gYnVpbGQgdGhpcyBsaWJyYXJ5IGJvdGggZm9yCi0gICAgIyB0aGUgZ2VuZXJhbCBtZWRpYSBwaXBlbGluZSBhbmQgYWdhaW4gZm9yIHRoZSB1bnRydXN0ZWQgTmFDbCB0YXJnZXQuCi0gICAgJ3NoYXJlZF9tZW1vcnlfc3VwcG9ydF9zb3VyY2VzJzogWwotICAgICAgJ2F1ZGlvL2F1ZGlvX3BhcmFtZXRlcnMuY2MnLAotICAgICAgJ2F1ZGlvL2F1ZGlvX3BhcmFtZXRlcnMuaCcsCi0gICAgICAnYXVkaW8vc2hhcmVkX21lbW9yeV91dGlsLmNjJywKLSAgICAgICdhdWRpby9zaGFyZWRfbWVtb3J5X3V0aWwuaCcsCi0gICAgICAnYmFzZS9hdWRpb19idXMuY2MnLAotICAgICAgJ2Jhc2UvYXVkaW9fYnVzLmgnLAotICAgICAgJ2Jhc2UvY2hhbm5lbF9sYXlvdXQuY2MnLAotICAgICAgJ2Jhc2UvY2hhbm5lbF9sYXlvdXQuaCcsCi0gICAgICAnYmFzZS9saW1pdHMuaCcsCi0gICAgICAnYmFzZS9tZWRpYV9leHBvcnQuaCcsCi0gICAgXSwKLSAgfSwKLX0KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvNDhfYWFjX2luZmluaXRlX2xvb3AubTRhIGIvc3JjL21lZGlhL3Rlc3QvZGF0YS80OF9hYWNfaW5maW5pdGVfbG9vcC5tNGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YTYxODQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3Rlc3QvZGF0YS80OF9hYWNfaW5maW5pdGVfbG9vcC5tNGEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdGVzdC9kYXRhL1JFQURNRSBiL3NyYy9tZWRpYS90ZXN0L2RhdGEvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjAxMTViLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDExIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotYmVhci0zMjB4MjQwLndlYm0gLSBXZWJNIGVuY29kZSBvZiBiZWFyLjEyODB4NzIwLm1wNCByZXNpemVkIHRvIDMyMHgyNDAuCi1ub19zdHJlYW1zLndlYm0gLSBIZWFkZXIsIEluZm8sICYgVHJhY2tzIGVsZW1lbnQgZnJvbSBiZWFyLTMyMHgyNDAud2VibSBzbGlnaHRseSBjb3JydXB0ZWQgc28gaXQgbG9va3MgCi0gICAgICAgICAgICAgICAgICBsaWtlIHRoZXJlIGFyZSBubyB0cmFja3MuCi1ub256ZXJvLXN0YXJ0LXRpbWUud2VibSAtIEhhcyB0aGUgc2FtZSBoZWFkZXJzIGFzIGJlYXItMzIweDI0MC53ZWJtIGJ1dCB0aGUgZmlyc3QgY2x1c3RlciBvZiB0aGlzIGZpbGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHRoZSBzZWNvbmQgY2x1c3RlciBvZiBiZWFyLTMyMHgyNDAud2VibS4gVGhpcyBjcmVhdGVzIHRoZSBzaXR1YXRpb24gd2hlcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1lZGlhIGRhdGEgZG9lc24ndCBzdGFydCBhdCB0aW1lIDAuCi1iZWFyLTMyMHgyNDAtbGl2ZS53ZWJtIC0gYmVhci0zMjB4MjQwLndlYm0gcmVtdXhlZCB3L28gYSBkdXJhdGlvbiBhbmQgdXNpbmcgY2x1c3RlcnMgd2l0aCB1bmtub3duIHNpemVzLgotICAgICAgICAgICAgICAgICAgICAgICAgIGZmbXBlZyAtaSBiZWFyLTMyMHgyNDAud2VibSAtYWNvZGVjIGNvcHkgLXZjb2RlYyBjb3B5IC1mIHdlYm0gcGlwZToxID4gYmVhci0zMjB4MjQwLWxpdmUud2VibQotdnA4LUktZnJhbWUtMTYweDI0MCAtIFRoZSBmaXJzdCBJIGZyYW1lIG9mIGEgMTYweDI0MCByZWVuY29kZSBvZiBiZWFyLTMyMHgyNDAud2VibS4KLXZwOC1JLWZyYW1lLTMyMHgxMjAgLSBUaGUgZmlyc3QgSSBmcmFtZSBvZiBhIDMyMHgxMjAgcmVlbmNvZGUgb2YgYmVhci0zMjB4MjQwLndlYm0uCi12cDgtSS1mcmFtZS0zMjB4MjQwIC0gVGhlIGZpcnN0IEkgZnJhbWUgb2YgYmVhci0zMjB4MjQwLndlYm0uCi12cDgtSS1mcmFtZS0zMjB4NDgwIC0gVGhlIGZpcnN0IEkgZnJhbWUgb2YgYSAzMjB4NDgwIHJlZW5jb2RlIG9mIGJlYXItMzIweDI0MC53ZWJtLgotdnA4LUktZnJhbWUtNjQweDI0MCAtIFRoZSBmaXJzdCBJIGZyYW1lIG9mIGEgNjQweDI0MCByZWVuY29kZSBvZiBiZWFyLTMyMHgyNDAud2VibS4KLXZwOC1jb3JydXB0LUktZnJhbWUgLSBBIGNvcHkgb2YgdnA4LUktZnJhbWUtMzIweDI0MCB3LyBhbGwgYnl0ZXMgWE9SZWQgdy8gMHhBNS4KLQotVm9yYmlzIHRlc3QgZGF0YSBmcm9tIGJlYXIub2d2ICg0NDEwMCBIeiwgMTYgYml0cywgc3RlcmVvKQotdm9yYmlzLWV4dHJhZGF0YSAtIFZvcmJpcyBleHRyYWRhdGEgc2VjdGlvbgotdm9yYmlzLXBhY2tldC0wICAtIHRpbWVzdGFtcDogMG1zLCBkdXJhdGlvbjogMG1zCi12b3JiaXMtcGFja2V0LTEgIC0gdGltZXN0YW1wOiAwbXMsIGR1cmF0aW9uOiAwbXMKLXZvcmJpcy1wYWNrZXQtMiAgLSB0aW1lc3RhbXA6IDBtcywgZHVyYXRpb246IDBtcwotdm9yYmlzLXBhY2tldC0zICAtIHRpbWVzdGFtcDogMjkwMm1zLCBkdXJhdGlvbjogMG1zCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdGVzdC9kYXRhL2JhbGlfNjQweDM2MF9QNDIwLnl1diBiL3NyYy9tZWRpYS90ZXN0L2RhdGEvYmFsaV82NDB4MzYwX1A0MjAueXV2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGQ0NzFiLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvYmFsaV82NDB4MzYwX1A0MjAueXV2CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotREVIS0xMTU5OUFBQUFFTUVNSUlJTU1JSUVNRUVBPTk1MSktKR0dGQ0FBPj46Ozo7Ozg4ODg4ODk5OTg5Ojo5ODg6OTc2Nzc1NTU0NDIxMTEwMC4uLS0rKyknKSkoKCkpKCgoKCcnKCgoKCcoKSkpKSoqKyssLCoqKyssLCwsLCwsLCsrKysqKSkpKSkpKSkpKSkoKCcnJiYmJiYmJiYmJiYmJiYmJiYmJycmJiYmJiYmJiYmJycnJycnJygoKSssLC0vMDIyNDU1Nzc3ODg5OTk5OTk5OTo6OTk5OTo6ODg3NjY3Nzo+RUpRWWFobHF1d3h4d3VxbWpoaGdoamxubm9vb29wb3BvcXN0d3l8fn5+fnx4cmxkWU5BNC4sKSsrKyssKisrKy40OkJPWmVueH6DhoWDgn13bWdYSDsvKSUkJCMkJSUnKi4xNzg+Q0xTXmVtdHuAgHx6dW9pYVlTT1JRVFRRU0xEPTYwJyUjJCQiIiMiIiIhISMhIiEgIyUmKCswNz1ES1BXXmNnbHJ3eHl4d3V2dnV1dW9rX1dLRkE/P0BAQEBAQD8/Pz89PTo5OTk3NTU0MzEwMC8wMzk8Q05WXWZscXR5e3x6enZybWRdT0U5MiwrKSgoJycnJyYoKCgpKSkrKi0wMTIzNjc3OD0+P0NGRkpOVVxia3B0eHp7fX9/gYKCgoODgYGBgYCAfn17eXp2dHR4e3+AgoOGiIeHhYN+fHp4dXR0eYCEhoWDg4OAfHhwZlhKPTQvLi0sMDM4PUROWmJrc3h8gIKBgIGBg4OCgn9+fXt5dnd3enp8gYSIiouLi4qKioqIh4eHiIiIhoB5cGRYT0hFQT48O0ZJSUxMTE1OTlBQUFBRUlFUU1JSU1NSUlJSUVFQT05NTEpKSEhIRUFBQD08Ozw8Ojg6Ojo6Ojg5OTk5Ojo6OTg4ODg4NzY2NjU1NDQyMTExMDAuLi0tKysqKCkpKCgpKSgoKCgnJygoKCgnKCkpKSkqKisrLCwsLCsrLCwsLCwsLCwrKysrKikpKSkpKSkpKSkpKCgnJyYmJiYmJiYmJiYmJiYmJiYmJicnJiYmJiYmJiYmJicnJycnJycoKCkrLC0vMDExMjQ1NTc4ODg4OTk5OTk5OTk6Ojk5OTk6Ojk5OTg3ODs9REtRWV9nb3N5enx8fHp0cWxqa2tsbW9vcHBvb21sa2pqamtrb3J3en6BgH5+fndza2BVSDwyKyorKysrKyssLCssMTc/SlZhbXd9gYWGhYSBe3RrXlA/MyomJCQkJSYoLC8yNTg9QUVKUlpjanJ8gIGAf3p1bmRaU09NVGJwZlZORT02KSMkIyMjIiIjIiIiISEjIiIhISIkJistND1DSlBWXGJlbHF1eXp7end1dnZ1dXVza2FWS0VCPz9AQEBAQEA/Pz8/Pj48Ojo6NzU1NDMxMDAwMTE2PENNVV1mbHF0eXt8enp3dm9mXlJHOzMuKykoKCcnJycmJygoKSkpKywuLjAwMzU2ODk7PUFCREdLT1heZGtwdHl9foCCgoSEhoaHh4aGhISCgH59fHt3c3Jydnl6fX+DhIWFhYWDf317eXl4eX6FhoaFhYKCf3t1bWJSRDkyLy4uLjAzOD1CTVhia3N4fICCgYB/gYGBgYB/fHp3d3Rzc3Z4en+EiIuNi4uLi4uLiYiIiImJiIaBeG5iV05JRkE+PDtISElLTExOT09PUFBRUVFSUVNSUlJSUlJRUFBQTk1MS0pKSEdFREFAQD49PDs6ODo5ODk5ODk5Ojk5OTk6Ojk5OTk4ODc3NjY1NTMzMjEwMC8vLi4tLCwrKyooKCgoKCgoKCgoKCgoKCkpKSkpKSkpKiosLCwsLCwsLC0tLCwsLCwsLCwsLCsqKysqKikpKSkpKSgoJycnJycnJycmJiYmKCcnKCclJyYnJyYmJiYmJicnJiYnJycnKCgoKCkpKiwuLjAxMzM0NTU1ODg4ODk5OTk4ODk5OTk5OTk5OTo5OTc3ODs+Q0dPVV5ianF2e319fnt4dnBubGxrbG1ub29tbWtpZ2VjYV5hZGptcnd7gIKCgn98dnFpXlFCNi4qKyoqKisrKysrKzA1PUVRX2pye4CFiIaGgn14bmNURTYtJiQkJSYnLC8xNDg9PkJESExVXmVvd4CEhIN/enNoYFZQTl1ldXZvYGZ5c0AkISMjIyMjIyIiIiIhIiIiIyMkJCouMzlBR01TW2BlanBzeHt9fHh2dnV2dnZzb2pgVE1EQD8/Pz9AQD8/Pz9APj09PDs6Ojc1NTQyMS8wLi4yODtCTVRcaG5ydXh8fn18e3ZxaWNWSj40LispKSkoKCcnKCgoKCkpKissLTAxMTM0NTg5PT5AQUVKTVNaX2ZrcnZ7f4KDg4OFhoeHiIaFhYSGgX99fHp3dHJwcHF1dnl9f4ODhYWFgX5+e3l6enuBhoeHhoKEgX15cmpcTj41MS0sLC4wMzc8Q01XYGlyeHx/gYGBf4CAgH9/fXt4d3Ryb29ydXh/hImKioyMjY2KioqKioqJiYmHgHdrXlNOSUZBPjs6SUpKS01MTk9PT1BQUVFRUlNSUlJRUVBQUFBPT01MS0tJSUdGRENBQD8+PDs7Ojk5Nzc5OTk6Ojo5OTg6Ojo5OTk5ODg3NzY2NDMzMzIxMDAuLi4uLi4tLCsqKSkoKCkpKCgoKCgoKCgpKSkpKSkpKSoqLCwsLCwsLCwtLSwsLCwsLCwsLCwrKisrKioqKSkpKSkoKCgnJycnJycnJiYmJigoKCgnJicnJyYmJiYmJiYnJyYmJycnJygoKCgpKSkrLS8wMTIyMzU1NTQ2ODg5OTk5ODg5OTk5OTk5OTs6OTk3Nzo6P0RKUlleZmxzeHx+fXx5dnNubGpqaWhoaWZmZWZkYF5aWFVVWFxhZWx1eoCCgoKBfnx2bWJXSTs0LCosKioqKioqKysuMjhBTlhjb3mAhoiHh4N+fXRqW009MCkkJCQlKy4xNjg7P0JEQ0ZLT1hkbXV+g4aGgn13bmNXT1dsYGlscGtkd39eSSshJCMjIyMiIiIiISIiIiMiJSguMztARk1SWV9jZ25xdXl9fHt5dnZ2d3d3dXBoYFRLREI/Pz8/QEA/Pz8/Pj09PTw7Ojo3NTU0MTEuLy4uMjc7QkpUXGZucnV4d3p+fXx3c2xjWk4/ODErKCkpKCgnJykpKCgpKSorLS4wMTMzMzQ2Nzk+PkRJTlNZX2FpbXR4fYCDhIaGh4iJiIiIhYWDgYB+fHl2dHFvb29wcHN1eH+Dg4SEg4F+fn17fHx+gYaGhoWEgoB7dm9mWEk7My8vMC4uMDI1OkJNVV5ncHd8f4B/f35+f35+fHt4dnRxbWxsbnJ2e4GHiYqLi4yMioqKioqKi4uKhYB3al1SS0dFQj88O0hJSkpMTE1OT09PT1FRUlJSUVJSUVFQUFBPUE9MSkpKSEdHRUNBQD8+PTw7Ojk6Ojg4ODg4OTo6Ojo6Ojo6OTk4ODg4NjU1NDQzMjIyMTAwMDAvLy0tLS0sKykpKSgoKCgoKCgoKCgoKCkpKSkpKSkqKioqLCwsLCwsLCwsLCwsLCwsLCwsLCsqKisrKigpKSooKSkpKSgoJycnJycnJycnJycnJycnJycnJycmJicnJycnJycnKCgoKCgoKioqKy0tLjExMTI0NTU2Nzg4ODg5OTk5OTk6Ojk4OTk5OTg3Njk6O0BFTFNZYGZtc3Z5e3l2d3Nwa2hlZGRfX15eXl5fXVpXVFJPTk9TWF9mcHqAhIOEhIF9eHFsXE9COC8rKioqKiorKyssLTI4P0lXYW13gIeKioiHg3t2bV9SQjQqJSUlKC4yNDk8QENERURGSU5VX2lxeoKGh4SAeXJpXVVcaWpxWUlSaXFjUldHISAhJCMjIiIiIyIiIiIiJigtNDs/RUtTV11iZGludHl6fHx7eHd3d3d4d3Nval9USkQ/Pz8+Pj8/Pz8/Pz4+PT08Ojk5NzU0MzIxMS8vLzA2OkBLU1xla3J2d3l7fXt6endxZ1xPQjgxLSspKSgoJycoKCcpKCoqKywtLzAyMzI0Nzk6P0RITlJZYGRnbXJ2e3+ChYaIiIqKiYmIiIaFg4B+fXh2dHBsa2pqa21vdHt/goKDg4F/gH59fX1+goWGhoSDgoB/enNsYlJDODIvLi4uLi8yNjtCTVdhaXF3en6Af39+fX9/fXt3dXNybWlpaW1xdnx/hIqKioqLi4mJiYmLi4uKioV/dmdaTkhHRUNAPjxKSktKTExOTk9PUFBPT1BSUlFQUFFRUFBQT09NTEpKSkhHRURDQUA/Pj08Ozs6Ojo5OTg4OTo6Ojo6Ojo6Ojk5ODg4ODc2NTQzMzIyMTAwMDAwLy8vLy0tLCsqKSkoKCgoKCkpKCgoKCgoKSkpKSsrKiorKywsLCwsLCwsLCwtLSwsLCwsLCwrKysrKywqKSkpKSkpKSkoKCcnJycoKCgoJycnJycnJycnJycnJycoKCcnJycnJygoKCgpKSoqKystLS4wMTAzMzMzNTY3ODg4OTk5OTk5Ojo5ODk5ODg3Nzc4OjtARUpQWWFpb3V2dnZ0cW9sZmNfWllZWFhaWlhYWVlYVU9NSkdFSFBZY2pze4GCg4OBgH12bWNXSTwyLi0qKioqKysrLCwwNzxGU2BrdX6FiYqIh4R/eXJkV0c2LSkpKS4xNTg6P0JERkVGRkxOUllkb3d+g4WFgXt0a2BcZGprZVdMUWlbT05WXFlUJiIiJCQkIyMkIiIiJCgtNDpARUtRV11eYmhscXZ5enx8enp3d3d3dnV0cGpgU0lDQT09Pj4+Pj4+Pj4+Pj08Ozo5OTc1NDMyMzExLi4vMzg/SVJcZm1wdHd6e3t9fHp2cWlfUkc6Mi4pKSkoKCgnKCgqKSorKywsLS4vMTMzNjk7QEZLUFVaX2RobXF2en2ChIWHh4iKioqKiYeFg4B/enh2dG9raGdlZWdqbXN7f4KCgoGAfn5+gX9/gIOGh4aEg4SAfXhyaV5PQDcxLi0uLi8yMjY7Q01YYWlxdXp9fn5+fn59e3p5d3NtbWtnZ2dqbnF4f4SHioqKioqJiYiIiouLi4iFfnVoW05JR0RDQD9AS0tLTU1NTU9PT1BQUFBSU1FRUFBQUE9PUE9NTUtLSUlIRkVEQkE/Pj09PDs7Ozk5ODg5OTo6Ojo6Ojo6Ojo5OTg4ODg3NjU1MzIxMTExMTExMTAwLy4tLSwsKysqKioqKiopKSoqKCgpKSoqKioqKisrLCwtLS0tLS0tLCwsLS0sLC0tLCwsLC0tKyssLCoqKyspKSkpKCgoKCgoKCgoKCgoJycnKCgoKCgnJiYmJycoJycnKCgoKCgoKCkqKisrLCwsLS8wMTIzMzQ2Njc5OTg4ODg4ODo6ODg5ODY2NTU2Nzg6PkJHTldfZ21xb29ta2hnYl5YV1RTUlVVV1dYWFZWVVBLRkI+PEFHUV1mb3d/gYWFgoGAe3NpXlBCNjAsLCorKysqKyssLTQ5Qk9baHR8hImLiYeGgnx0al1PPjErKy80Nzk8PkJDRUZGR0dJTFBYYGpye4GEhYN8dWxiXmBTW05VVEVPU0pGRGNqZFolISQkJCQkJCMkJikwMzg/RUxRVlteYGVpbXFzdHd6enp5d3Z2d3h4dXFrYFJKQz88PD09Pj4+Pj4+PT07Ozw6Nzc4NjQzMjIxMC4vLjM3PkhRW2NscXR2eHp9fnx6eHRrYVJHPTQwLCkoKCgoKCkpKysrLCwsLS4uLzE0Njo/RUlPUldcYWZpbnN1eH6ChYeHh4eIi4uKiYiFgn99e3dzcG5raWhkYmNnaW50e3+AgoKAgIB/foGAgIKFiIiGhYSDgH13cWVZSz02MS0uLi0uMTQ4PUZPWGBpcXZ8fX19fH18fXl3d3Nua2pnZmNjZWpxd36Eh4qKiomJiYmIiIuLjIuJg310ZVpSSkhHREJAP0pJTExNTFBOT09QUFBQT1BRUVBQUFBPT09NTU1LSkpIRkRDQkA/Pj09PT08Ozs6Ojg4OTk6Ojo6Ojo6Ojo6OTk4ODg4NzY1NTMyMTExMTExMTEwMC8uLS0sLCsrKioqKioqKSkqKikpKSkqKioqKiorKy0tLS0tLS0tLSwtLS0tLi4tLS0sLCwtLSsrLCwrKysrKSkpKSgoKCgoKCgoKCgoKCcnJygoKCgoJyYlJicnKCcnJygoKCgoKCgpKiorKywsLC0vMTExMjMzNTU2ODg4ODg4ODg5OTg4ODc1NTQ1NTY2OT1BRUtTXmVoaGZmZWRiXVpVUlNSUVJSUlZWV1dWU1BNR0E9ODc5QUpXYWtzfYCChYKCgHx2b2VZRzoyLiwqKysrKisrKywxNz9LWGRxfIOIioiHhoJ8dW1iUkE0Ly8yNjk9P0JER0ZHR0hISEtQVltlbXV+goSCfHhuY2BVTkc6Q0A1OTo+QENLVF1TIyMkJSUkJCQmJiouNTs/R0xRWFpdYGNmZ2tvcXN1eXl6eXZ1dnV2dnVwaF5RSEE9PDw8PD09PT09PTw8Ozo5ODc3NzU0MzIyMC8vLi4yOD1GUlpja3F2dXd7fX18fHt0bGJXSzw0MS0pKCoqKioqKSsrKywsLC4vLzI1OD1CRUtQVFleY2htcHN2fH6ChIeHhoeIiIqKiomGg4B9eXVxb2xqZ2RhX2BjZ2pudHl9f4CAf4CAgICDgoKFiImIhoWEgIF9dm5jV0o8NzMuLy8uLzE1OD5GT1tjanB3e31+fXx8e3p4dXJvamdmY2JgYGRpcHZ+hIeKioqJiYmJiIqIi4yLiIV+dGdZUUtIR0RCQUBLS05OTU1PT09PUFBQUVFRUU9QUFBQT09MTE1MTUpIRkVDQkE/Pz89Pj08PDw8Ozs7Ozo6Ojo6Ojs7Ozs6Ojo6ODg3Nzc0NDQzMjIyMTEyMjIyMDAwMC4uLSwsLCoqKSkqKioqKiooKikpKSoqKisrKiosLCwtLS0tLS4uLi4uLi4uLi4tLS0tLCwsKysrKysrKykpKSkpKCkpKCgoKCcnKSkoKCgoKCgoKCgoKCgoKCcnKCgoKCgoKCgoKSoqKyssLCssLS0wMjExMjI0NDU2Nzc4ODc3Nzc3NzY2NTU0NDM1Njg6PkNKUllfYmRiYGBeXFpXVFJQUFFTVFRVVVZWU1BNR0M7NTEyNDtFUFxocXl+g4KDgIB9d3BqXlBBNi8rKioqKigqKisrLzc8RlRgbXiAhoeIh4aDgXlwZVlKOzQzNjk7P0RGR0dISElJSUhJTFFWX2dxen+BgX11bWRgVFVXRDsyQ1ovLTBBUUVNTDgiJSUlJSQkJyowNDtBRkxSVlteX2JkZWlqamxxdHZ4eHhzc3V0dHRybWlfUUhAPDs6Ozs7Ozo7Ozs7Ozo5ODg3NjUzNDIyMjEwMC4vMTk9RE5aYWlxdXZ4enx8fHx5dGxjWk1AODEtKykpKSooKysrLCwsLS8vLzI2Oj5ESE5TWF5jaWtvc3V8fX+DhISGhoaIiYmJiYmGhIF8d3RwamhmY2FeXV9jZ2ltb3V7f3+Af39+gYCBhIOFh4mKiIaGg4OAfHVsYVRGOzc0MC8wLjAyNj1CSFJcZGlweHx9fX59fHt3dXFvbGdkX1xcXFxhaW92fYWJiYqJiIiHh4iKi4uNjImEfHNnXFFKSUZFQ0FATExOTk1NT09PT1BQUFFRUVJRUFBQUE9NTExLTEpISEZEQkBAPz8+Pz49PDw8PDs7Ozs6Ojo6Ojo7Ozs7Ojo6Ojg4Nzc3NDQ0MzIyMjExMjIxMTAwMDAuLi4uLCwqKioqKioqKioqKCoqKSkqKiorKyoqLCwsLC0tLS0uLi4uLi4uLi4uLi4tLSwsLCsrKysrKysqKiopKSkpKSgoKCgpKSkpKCgoKCgoKCgoKCgoKCgnJygoKCgoKCgoKCkqKisrLCwrLC0tLi4wMDExMjQ0NTc3ODg3Nzc3NjY1NTQ0MzMzMzQ2OT1CSU5VV1ZXWltbW1paVlVTU1NTVFVVV1hWVVJPSUM9NjAtLTI3QEtWY212fYKAg4GAf3pzbWNWSTsyLSoqKisqKSorKy4yOURRXmd0fYOHiIeGg4F8c2tfUUM5Nzo9P0NFRUdHR0dJSUlJSUlJTldganN5f4F2aGtwZF1dW01FQldZKCs0PDs3PURLJyUlJSUmKCowNTpAR0xSV1xdYGJkZGdlZWZpbHBzdnZ2c3N1dHV1cm1mXFBHQDw5OTk6Ozs6Ozs7Ozs6OTo6NzY1MzQyMjIwLy8uLzI3PEROWGJpcXV2eHp8fHx8eXNuZltOQzgyKywsKysqKSsrKywtLi4wMTM5PUNITVFXXGBmam5xdnp8foCAgoSEhoaGh4iIiIeGhIF9d3NrZ2VhYFxcXF5iZWhrbnB0en5/fn59foGBg4aGh4mJiYiGhYWCf3x1bGFURj04NjQyMDAyNDk+RkxVXWVtc3d8fXx9fHp3dXJtamViX1tZWVhaYGptdn6FiImKiYiIh4eHiYyLjIyIgnxzZ11STEpGRUNAPk1NTk5OTk9PT09QUFBRUVFRUVFRT09OTk1NS0hJR0RCQUBAQD8/Pz8+PTw7PDw8PDw8Ozs7Ozo6Ojo7Ozo6OTg5OTc3NjU0MzIyMzMyMjExMTAuMDExLy8vLy0sLCwsLCsrKioqKioqKysrKyoqKiorKysrLCwtLS0tLy8tLi8vLi0uLi4uLS0tLC0sKysrKyoqKiopKCgoKSkpKSgoKCgpKSkoKCgoKCgoKCgoKCgoKCgoKCgoKSkpKSkpKSoqKiwsKyssLC0tLy8vMzM0NTQ1NTY2NjY2NjQ0NTU0NDMyMTEyNTc7P0VLT1VWVVlbW1xbWldXVVZWVlZXV1hXVlNPS0Y9NzEsKisuMztGUF1ncXiBgYOAf357d3BpXVBBMy4qKikqKikpKiosMjlAS1dkbnmAh4iHhoSBfHRtZVdKQj8+QENGR0dJSUpKSkpISEZGRUdNV2Ntd3x9c2tlaWBlZGBWQTxDOjEqMi4sMDxBYjIlJSYmKC0wNjpARkxTWFpeX2JjZGRkYmFjZGptcnRzdHRzc3Nzc3BtZVtQRD05ODg4ODk6Ozo6Ojo6OTk4ODc1NTQyMjIxLzAwLzAxNjtFTVhhaXB1dnh5ent8fHl4cWhfU0Q6My4tLSsrLCwsLC0uLi8xMzk9QUZMUFZbYWVqbnJ2eXx/gYGBgYKEhYSFh4eHh4eGhIB8e3NqZ2JdW1laXV9jZWhrbXBzdnp8fX19fX6Bg4SIhomKioqIh4WDg4F8dWtgU0Y+OTg1NDExNDc9REpTWWFmbnV6fX58fHt7eHNwamdhX1pYU1JTVl5obXeAhomKiYiIhoaHh4mKi4uJhoJ9c2hcUk1IR0RDQUBNTU5OUFBPT09PUFBRUlFRUVFOTk1NTU1MTEpIR0VCQUA/Pz9AQD49Pj07PDw8PDw6OTs7Ozs6Ojo6OTk6Ojk4Nzc3NzY1NDMyMjMzMjIxMTEwLjAxMTEvLy8tLCwsKysqKisrKioqKisrKysqKioqKysrKywsLS0uLi0tLS4vLy4tLi4uLi0tLS0tLCsrKysrKyoqKSkpKSkpKSkoKCgoKSkpKCgoKCgoKCgoKCgoKCkpKCgoKCkpKSkpKSkqKioqKisrLCwtLS8wMTAwMTQzNTU2NjY2NjY0NDQ0MzMyMTAwMTQ2Oj5ESU5RVVZaW1tcXFxZWVhYWFhXV1pYV1RSTUdBOTQuKikrLTA3QEtXYWx1fYGCgX9+fXl0bWRVRzowKyoqKioqKioqKjA3PUVTYGp3foOGhoWEgXx3b2hgVEpFQkRFR0hISUlKSktLSEdCQkJCRVBbZ3R0b2lmbGdlZ2VYSkNARzkxMjMsOTxFSWNLJSUoKiwxODtBR0xSVlleX2FhY2RlYF1cXF5kaG5xdHV0c3Nzc3NvamRaTEE9Ozg4Nzc4OTk4ODg4ODc3NjY2NTU1MzIyMS8wLy4uMjY7RE5ZYmlwdXZ4eXp7fHx8eHJpX1NJPDcxLy8tLS0tLi4vLzEzNztBRktPVVtfZWpucnV3fH5/gYGBgYGCgoSFhoWFhoaDg4F+enVtZ2BbWFlaXF9iZWhrbG9xdHd7e319fH5+gYOGiYmJioqIh4eHh4SCfHVqX1JFPzo5NjU1NDc7QUhQVlxjanN4fX9/fHx8endzbWhgW1hVUlBPT1NcZm13gYiJiYmIh4aGh4eJioqIh4WBe3NoXlJNSEZDQkA/TU1PT1FRUVBPT09PUFBPT1BQT05MTEtJSklHRkRCQUJAQD8/Pz9AQD09PTw9PT09PDw7Ozo6Ojo6Ojg4ODg5ODc3NjY2NTQ0MzMzMzIyMjAyMjAyMjIwMC8uLi0sLCwsLCwrKyoqLCwrKioqKiorKysrLCwtLS4uLi4uLi4uLi8vLy4uLi4tLC0tLSwsLCsrKysqKioqKSkpKSkpKSkoKCkpKSkpKSkpKCgoKCgoKCgoKCgoKCgpKSknKSkpKioqKysrKyssLC0tLS4vLzEyMzE0NTU2NjU1NDI0MzMxMjEuLzI1Njk+REhMUVVYXF5eXV5dW1lZWVlYV1lYWVRTT0lCPTYuKygoKSouNDtGUl5ocXmAgYF/fn17dnBoXE5ANC0qKSoqKSoqKiouNjpCUFxocXyChYWFg399e3VuZFpRS0ZGRkhISUlJSkpKSUdEPjw7PUBKVmN0aWhpZ2NmZGBeQjNMU1g8QFJTRDw6Q0hYZlU8JCwwOD1CRUtRV1tdZGZlZWVgXFxXVVZZXWRqcXR2dHNzdHJwbGliV0pAOzY2NjY3ODg4ODc3Nzc2NjY2NTQzMzEvLzEwLy8tLzE0OkNNVl9nb3R3d3l7e3t7fHlzbGFWSj03NDAvLy8vLy4vMDI1OkBFS1FXXGBla21ydHl7fn5/fn5+gICBgoODhIOEhIOEg4KAenZxaF9ZVlZZXF9jZmlrbW5vcXR3e3t7e3t9f4KEiIqLjIyLiYaGh4eDgXt0al5SSUE8Ozo4ODg7PkVMU1lgZm10enx+fX18e3d0b2xjXVZTT01JSExRWmVteIKHioqJiIaGh4aIiYmJiIeEfnlxal9UTkhFQ0E/Pk1NT09QUFBPT09PT1BQT09OTk5NTEtLSklHRkRCQUA/QEA/Pz8/QEA/Pj08PT09PTw8Ozs6Ojo6Ojo6OTk6ODc3NzY2NjU0NDQ0MzMzMjIzMjIyMjExMDAwLy4tLCwtLSwsKysrKywsLCsqKioqKysrKywsLS0uLi4uLi4uLi4vLy8uLi4uLSwtLS0sLCwrKysrKisqKikpKSkpKSkpKCgoKCkpKSkpKSgoKCgoKCgoKCgoKCgoKSkpJykpKSoqKisrKysrKywsLi4tLi8wMTAxMjIyMzMzMzIyMzIxMTEwLi8yNTY5P0VKTlRYWlxfX2BgXlxbW1tbWVhZW1hWUUxFPTYvKikpKSkpLDA3QUxYYm51fYCBgH5+fXlzbWNVSTkwKikpKSgpKioqKjA3PklXZG53foOEhIN/f3x3cWthWFBJR0dISElKSkpKS0pFQDw5Njk7RVNecG9va2llYF1ZU01JSkxTYGBfX1hLQTgrO1JubjUoNzxCRk5ZWVtgbGlUTVZhW1thUlBQVVphaXB1dXRzdHJwb25oYFVJPzg1NjY1Njc3NjY2NjY2NTU0NDMzMjIyMC8vLy4uLi8wNDpDTVZfZ290d3l3eXt7e3x5c21jWUxAOjYyMTExMTExMzQ4PURJUFRcYGZpbXJ1eXx/f359fX19f4CAgIGDg4OCgoKCgX9/fHl0bGRdWFdZXF5iZmlrbW9vcHJ2eXx6e3t8fH+ChIiLi4yMi4mHh4eHg4F7dGpeUEdDPz49Ozs+QENKUVhdZWpxdnt+fn19fXt2cm1mYFlSTUpFQ0NIUVxlcXyEiIeIiYiGhoaHiImJiYaFgn53c2lfVE1HREJAQD5OTk9PT09OTk9PT05QUFFQTk5MTEpKSUhHRkNBQEBAQD8+Pz8/Pz8+Pz8+PT09PDw8PDw8Ojo7Ozo6Ozs6OTg4Nzc3NjU2NTIzMzQ0MzM0NDMzMjIyMTExMC8vLS0sLi4tLSwsLCwsKyoqKioqKisrKyssLC0tLi4uLi4uLi4wMC8vLi4uLiwtLS0sLCwsLCwqLCsqKSkpKSkpKSkpKSkpKSkoKCkpKCgoKCgoKCgoKCkpKCgoKCkpKiopKSkpKikqKioqKysrKyssLC0vLy8vLzAxMTExMjIxMjIxMTAvLjAxMTQ5PEBHTFJWWl5eX2BhYWBeXV1dW1lZW1pYU05HQjozKygpKSkpKSouMztGU15pdHp/gYF/f357d29nW04+MyopKSkqKioqKiovNTxEU2BsdnyBg4ODgH98eHVvZ1xSS0hISElLS0tLSkhFQTw4MjIxNkFQX2FuaVJoZFpUUkdRUUpRWWFiYWFgXVU/NDxJW3JyOjY+SUxjbWhjbXdKT0tUWltZV0pJS05WYGlxdXd1d3Rzc3FraF5TRjw2NDMzNDQ1NTQ0NDQ1NTU1NTMyMjEyMDAvLiwuLi8uLzQ6Q0xVXmduc3d3enh5ent8fHRvZFpRQzs2NjMyMjIzMjc6QEZNVVlgZWtvdHd6fICAf35/fn19f39+f4CAgoKCgYCAf319e3h0cGhkW1laWl1hZmlsb29xcnJ0dnl8fXx8fHt/g4WJio2NjYuJh4eGhoOBe3JqXFBJREJBQT9BQUZJUVZdYmhvdXl/fX5+fXt4dHBqY1tTTEZDPz0/RE9bZ3N+hIiIiImHhYWGh4iJiIeEgoF9eXNrYVVNRUJBPz4+Tk5PT09PTk5PT09PUFBPTkxMS0tKSkhHREJAQEA+Pj4+Pj8/Pz8/Pj8/Pz09PTw8PDw8PDo6Ozs6Ojk5ODg4ODc3NzY1NjU1NjUzMzQ0NTUzMzIyMjExMTAvLy8uLS4uLi4tLSwsLCsrKyoqKiorKysrLCwtLS4uLi4uLi4uMDAvLy4uLi0sLS0tLCwsLCwsLCwsKikpKSkpKSkpKSkpKSkpKCgpKSgoKCgoKCgoKCgpKSgoKCgpKSoqKSkpKSkoKSkpKSsrKysqKywtLS0uLy8wMTExMTExMDExMDAvLy4wMTI2Oj1DR09UWVxeYGFiY2NhX19fXFtbWlpaVU5LQz01LionKCgoKCgpLDA3QU1YZG52fX+Af31+fXlzbGFURTctKikpKSkqKioqLTM5Qk1bZnF7gIKEgn+AfXp1cGlgV1BNSkpJS0tLSklGQT04NC8tLDE7UWlyc21NXWFXVU9OUE1HQk5WYmBYVVhdVD05QlRecVpMT1ttfneAamhbWWJtcHd0ZFxQQEFKVF9rc3V3dnZ0c3Nxa2heU0Y8NjQyMjMzMjIyMjMzMzMzMzQzMjIxMC8tLi4sLS0sLC0zOEBIU1xob3N3eHh5eXp7e3t0bmldU0c+ODc2NTU1Njo/REpPV15kaW90eHqAgYKAf359fHx9fX5+f4GBgYGBgX99fX56eXdzcW5nYlxZWV1hY2dsbXBycnJzdXh7fX16ent8f4OIio2PkI6Mh4eHhoaDgXtyalxSTkhGRkZFR0lLT1deY2Zscnh8fn5+fXt7eXRtZl5YT0dBPTk6PEZSXGh3goaIiIiIh4WFh4eJiYiHhYKAe3Zya2FVTUVBQD4+Pk9PTk5PT09PUFBPUE5NTkxLSklIRkZGREJCQEA/Pz4+PT0+Pj8/QEA+PT4+PT09PTw8PDw7Ojw8Ozs7Ozg4ODc3NzY2NTU1NTU1NTU1NDU1NDQzMjIyMjIxMDAwMC4vMC4tLSwsLSwsLCwsLCsqKiorKywsLS0tLS0tLy8wMDAxLi4uLi0sLS0uLi0tLSwsLCwsKysqKioqKSkoKCgoKCgoKCgoKSkqKikpKCgpKSgoKSkoKCgoKSkpKSkpKSkpKSoqKysrKyopKSotLS0uLi4uLy8wMTExMTAwLy8vMC4vMDEzNz1BRkxQVlpeYGJkZWRkYWJhYV9cW1pZWVRPRj85LyooJygnJiYnJyouNTxIUl1ncXp9f4B/f316dnBmWUw9MywqKioqKSkqKiwxNj1JV2Ntd36AgoJ/f3x6dnVsZ15VT0tNTU1OTUpHQj46NDErKiouOVBxgX54ZWBcR1lZVVFSTkxNSFFWWUxMXF9LR0EqRkxdVE9bbnRvgHNtaG1sZXB6gnFqXEY9S1VhbHN3d3h4dnRzcW5nXVBEOjMxMDAxMTExMjIxMTEwMDExMS8wLy0tLS0sLSwrLCwwMjg+R1JcZW5ydnd3eXt7e3p6d3JrYFZIQDw5NjY4OTtCR0xTW2FobXJ1fX+Cg4ODgX5/fH19fH1+fX9/gIF/f359fXp6eXd1cnBtZ2JdXF1fYmVpbm9xcnJzdHZ5fHx9enp7fX+DiIuOkJGNioiIiIaGg4F8cmhdVFBNS0xMS0xOUlheYmVrbnN4fX58fXx8eXdybGVdUUhAOjc3Nz5HU2JueYGHiYqIh4aGhoaGiYiFhIOBf3t3c2xiVkxGQT8+OjlPT05OT09PT09PTU5NTEtKSklJSEZDQ0E/Pz09PT0+Pj4+Pj4/P0BAPj0+Pj09Pj49PTw8PDs8PDs7Ozs5ODg3NjY2NjU1NTU1NTU1NjU1NTQ0NDQ0NDIyMTExMDAvMC8uLi0tLiwtLCwsLCwrKioqKyssLC0tLS0tLi8vMDAwMC4uLi4tLS0tLi4uLS0tLCwsLCsrKioqKikpKSkoKCgoKCgoKCkpKSkpKSgoKSkoKCkpKCgoKCkpKSkpKSkpKSkqKigoKCgqKikqLCwtLi4uLi8vMDAwMDAvLy8vLS0vMDE0NTk/Q0lOVFpeYGNlZmZmZWRhYGBfW1paWldRTEI8My0qKCcoJyYmJicpLTE4Q01ZY213fH6Af318fHhxbF9TRDYtKiooKCkpKioqLjQ5RFJfanJ7foCCf4B+e3l1cGphWFFNTExMTEtHQz46NS8rKCcrLzVUc3x8e29fVkhGVlZRVVtSS1RcW2pSSVpkZVpHQkZLT0pYZl9sbXFvgHtsZ2xfW3BmZ0tVQEhXZG5zd3d4eHh3dnNuZ11QRDoyMC8vMDAwMDAwLy8wMDAwMDAvLi4tLCwsLCsrKistLjE3PkdRW2VudHh4eHh5enx6endxa2JYTkU/PTk4PEBESE9XXmVpcHR5foKDhYKCgIB/f3x7e3p7fXx+fn6Afnx6eXh2dnV0c3JwbmhjX19gYWRnam5wcXJzdnZ4en18e3p6e31/g4iLjpCOjYmHiIiIhoOBe3NqX1hUU1BQUFFSVlpcYmZqb3F2en5+fXx8fHl2bmhgWU5EPDg0NDc+SVZkcHqCh4iIiIeFhoaIiYmHhISCf315eHFsYlZMRUA+PTo5T05PTk9PTk5NTEtNTEtKSElIRURDQkA/Ozs8PDo8PDw9PT4+Pj4/QD4+Pj49PT09Pz89PTw8PDw8Ozs6Ojg3Nzc3Nzc2NjY2Nzc1NDU3NjY1NTU1NDQ0MzIxMTEwMDEwMC8uLSwtLS0tLSwsLCsrKysrKyssLC0tLi8vLy8vLy4uLi4tLS0uLi4uLi0sLC0sKysqKioqKioqKigqKCgnJygoKCgpKSkpKCgoKCcoKCgpKSkpKSkpKSgoKCgoKCkpKSkpKSoqKSkpKSkqKyssLC4vLy8wLzAwLi4vLy4uLi8xNjY9QUdMUlhdYGNlZmdpamdmY2FfW1paWFdWUEY9OC8qKCcoKCcmJiYnJysuNT1JVF5pcXl8f357fHx9eHBlW0o7MCspKCgpKSoqKSsyOEJMWGRvd31/gX98e3t6dnNuZVtUTkxKTEpHREA7NTApKCQiJys2WWJ0d3hvYFNMSlpbVFVhX1NUWlxeXVNUXmxkVEpNXk5RYGlrdXJma29bSUdUVl1SWFNRUk1LVmRudHd3d3Z3d3Zza2hcUEM5Mi4tLS0tLi0uLi8vLy8uLi4uLi0uLiwsLCwsLCorLS8xNz5HUFplbnF1eHh4eHl8e3t4c25nXE9HQj88PUJITVJXYWdscnd8gISDg4KDgYF/gH19enp5eXl6e3t7e3x7endyc3NzcnNycG5pZmJgYGRlaWxvcXJzdXZ3enx9fHt6ent9gISJjI6Pj42KiImJh4aDgXtzbGJcWFhXVVVWWFteYWdsb3J1eXx+fn18e3t5dG5mXlNKQDgzMTM3QExYZ3N9hIeJiIiHhoWGiIiIh4ODgX18eHVya2JWTEM/PDo5OU9OTk5NTU1NTEtLS0pJR0ZGRUVDQT4+PTs7Ojo6Ozw8PT0+Pj4+P0A+Pj4+PT09PT4+PT08PDw8PDw7Ojo5OTk3Nzc3NjY2Njc3Nzc4ODY2NTU1NTQ0NDMyMjIxMTExMC8vLi4tLS0tLS0sLCwrKysrKysrLCwtLS4uLi8vLy8vLi4uLS0tLi4uLi4tLCwtLCsrKioqKioqKiopKSgoKCgoKCgoKSkpKSgoKCgnJygoKSkpKSkpKSkoKCgoKCgqKikpKSkqKikpKSkpKisrLCwrLS8uLy4uLi0tLy8uLy4xMzc7QkdMUlZdX2NmZ2lra2pnZmNhX11bW1lXUklDOzQtKCcnKCYnKCcmJygoLDE5Qk5YY212enx+e3x8e3dyamBQQjUsKSgoKSkqKikqLzU8R1Vja3N6fn1+fX17e3l1cGhfVlFNSklJRUE8NzAqJiMiICQqO19hZmtxbWVMRlVbXFZUWFtZT1hSUVpYXmBnaWJSQFZORGV+eW5mX1ZeSzo4PVFWSFBTR0ZHS1Zkb3V3eHh3eXl3dWxpXFBDOTAtKysrKywtLS0uLi4uLS0tLS0sLS0sLCwsKysqKiwtMTc+R1BaZG1xdXh4eHh3enp6d3RvaF5SSkVAQ0ZLUFdcYWhtdHh9gYSFg4KCgYGAfn59fXp6eHh3eXp6enp6eHd1c3FxcXFycnBva2ZiYmNkZmlsb3Fyc3Z2d3p9fXx7enp7fYGFiYyPkJCNi4mHh4eGhIJ7c2xiXlpZWFhYWltdYGdrcHJzeH1+fn59fHt7eXRsZVtRRTs1MjIzOUJQX2p2f4aIiYiIh4aGh4iIiIeDgn97eHh2c2xjVkxDPzs5OTlPT09OTU1OTEtLSklIR0ZGRENCQD08PDs3Nzk5ODo8PD49Pj4+Pj8/Pj4/Pz4+Pj49PT4+PDw+Pj07Ozs5ODg3Nzc3NzY2NjY1Njc4NjY2NjQ2NTU1NTU0MzIyMTAyMjIwLy4vLywtLC0tLS0tLSsrLCwrKy0tLS0uLi8wLi4uLi8vLy4uLi4uLS8tLC0tLCsqKioqKSkpKSoqKSkpKSoqKCgpKSkpKSkpKSgqKSkoKCkpKSkpKSkpKCgoKCgoKSkpKSkpKysrKysrKiorKyssLS0tLS4uLi4uLi8wMDAyMjc7P0ZMUVVcYGFjZ2pqbW1pZ2ZjYV5bW1pXU09HPTcwKygoKCcmJicmJigpKSovNDxHVF5ocnh7fHt7fXx5dG1lV0g6MCkpKSkpKSopKS4yOEJOXGhvd3x9fH18fHt6eHRtYllSTElJRkI7NjMrJiMhICMjKDtNVWhmY1xZMkBaW1dSXVFQWlZaVVBeW1deYGplVzRPTk5vb3JkYmdYWldNOD1HQ1FXRDo2P01bZ3B2eHh5eXh4dnRuaV9PQjgwKisrLCsrKysrKiorLSwsKyoqKikrLCwqKispKystLTA3PkZQWmNscXd3eHh4eHp7e3h2cGlgVk5HRkhOUlldZGlwdXp/g4aFhIGAgYCAgH19e3l2dnV0dHV1d3Z2dnd1cnFxcHFxcnNxb2toZGNjZGdpbG9xcnN2dnh6fH19e3p6e36BhoyPj5GQi4mJiIqIh4aBfXZrZGFeXFtcXF9hYmVpbnN3d3t9fX19fHt7endybGVZTkI5NDIyNDxGVGNueoSHiomIh4aFhoeIiIiGg4B8eXh4dnRuZVhNQz87OTk6T09PTUxMS0pLS0lIR0ZFRUI/Pjs6Ojo5Nzg5OTk7Ozs7PT4+Pz8/Pz4+PT0+Pj4+PT0+Pj09PT07PDs7Ojk4ODc3Nzc2NjY2NjY3Nzg5NjY2NzU1NTU1NDMzMzExMjExMDAwMTAtLS0tLS0tLS0sLC0tLCwtLS0tLi4uLi0uLi4vLy8uLi4uLi4uLSwsLCwrKioqKikpKCgpKSoqKSkqKikpKSkpKSkpKSkpKSkpKCgpKSkpKSkpKSgoKCgoKCkpKSkpKSsrKyssLCoqKysrKysrLS0uLi4uLi4vMDAyMzc7QEVLUVZaYWRlaWtrbGxpamlmY2BeW1lYVlBJQDkxLSopKCgnJiYnJicmJigpLTI3QU5XYm51ent8e3t9e3dxaV5OPzQrKigpKSkpKSkqMDU9SlhhbHR7fH1+fXt7fHp1b2ZfVU5KRkM9NzIsJyMhJCIiIz5gXlJWX15cVVJSVVpcXVRgXExLWl9eZ1NKW2NgXFZGV0tSZ19kY2dlZWVkUTQ6SEVDQj0vOUNQW2hxd3h4eHh4eHZ0bmpfUEE3MCoqKiopKisqKisrLCoqKikpKSkpKSkpKCgpKiorLC4yNz1FUVtjanJ1d3h4eHh4e3t5dXBqYlhRTUxSVlxgZmxzd32Bg4SDg4KBgIB/f398enl3dHJwb3BydHNycnR2dXRwcG9wcXJycm1qZWJiY2RnaWxvcXJzd3d4en18e3t6enx9gYaMj4+PjouJiYiHiImHg312a2RiX11bXl5hY2Zqb3J2eXx9gH99e3t7e3l2cGthVUo9NzMxMjg+S1hkc32Eh4qKiIeGhYaHiIiHhYF+enl4d3Z0bmVYTEQ9Ojg5Ok9PTU1NTUtJSEdHR0VEREE+PTs6OTg4NzY3ODo7Ozs7Ozw9PT09Pj0+Pj4+Pj4+Pjw+PT09PT08PDw7Ozo6OTg3Nzc3NjY3Nzc3Nzc3Nzg4ODg3NjU0NTU0MzMzMjIxMTAxMS8vLi4tLS0tLSwsLS0tLS0tLS0tLS0tLi4uLS4vLi4vLi0tLS0uLi0sKyssKyoqKSkoKCkpKCYoJikoKiopKSkpKSkpKSkpKSkpKSgoKSkoKCgoKSkoKCgoKCgoKCkpKSoqKisrKysrKysrKysrKy0tLS0uLi4uMDAyMjg8QUdLUVVaX2RmaGttbG5ubGlqZGFeXVpXV1NPRTw1LioqKSgoJycnJycnKCgnJywvND1IU15qcXd6eXp8fHt5cnBkVUQ4LyspKCgoKCgoKS8zO0dUYGdyeHt9f399fX18d3NrYFVPRUI+OTQrKSQhISMhIC9lZ1tGTGRdVlNRVVVSRE5faVJCTlhUV15WWVtbWFVVU1BCSFddaF5mY2ZrXjwyRUM9REU3MTpDUVxocXZ4eHh4dnZ2dG9pXk9ANi4pJycnJygpKSkpKCopKioqKSgoKCglJScoKSoqKy0tMTY+RU5XYmtxdHZ4eHh5ent7eHZybmNbVlNVWF5kaG1ze36BhIODgYGAgX9/fn59eXd3dXJubWxsbWtsbXBzdHJxb25vcXJycXJsaWVjYGJlZmhsbm9ydXd3eHp9e3t6enl7fYKHjI+Qj46LiYiJiYiKiIN9dmxlYl9eXl9gY2ZobG90dnl8f4B9fXl6enl2dG1nXk9EOzY0MzM6QE9daXaAh4mLiYiHhoeHh4iIhYN/e3d5d3Z2dG9nWU1DPTk4OT5PT01NTEtJSEdGRUVDQkI/Ozo5OTg3ODc2Nzg6Ozs7Ozs8PT09PT0+Pj4+Pj4+PT09PTw8PT0+Pj09PDw6Ozo5ODg4ODc3Nzc3Nzc3Nzc4ODY2Nzg3NjU1NTU0MzMzMzMxMTEwLy8uLi0tKyssLC0tLS0tLS0tLS0tLS4uLi4vLy4uLy4tLS0tLi4tLCsrLCsqKikpKCgpKSgpKiopJikpKSkpKSopKSkpKSkpKSkoKCkpKCgoKCkpKCgoKCgoKCgpKSkqKiorKysrKysrKysrKyssLC0tLi4uLzAxNTg8QkdMUVdaXmNnaWxtcHFwcW1rZ2NgXl1aV1RPSEA5MywpKikoKCcnJycnJygoJycpLTE4Qk5YZW51eHp7e3p6enZxZ1pJPS8qKSgoKCgoKCgtMTc/TVhkb3d6fX9/fn59fHp1b2ZbUEdBOjQvKSYiISEhICE3WWdoWmBdY19ITVdUUk9RXmxUNUBJS0dTW15cV09GRUVCSEtKVmBOXWBgZVtRR0RURzkoKDM6Q1FcaHF2eHh2dnZ2dXNvaV5PQDYuKScnJycnJygoKCgpKSoqKSgnJycnJSUnKCkqKiwvLzM4PkVRV2JrcXR2eHd3d3l7e3t3dW5pYV1cXWBnbHBzd32Cg4OEgYF/f4GAfn18enl1dHBva2ppaWhqa21wc3RycW9ub3FycnJwa2hjYWBiYmRnamxtb3R3d3l7fHt6enp5fX6DiIyPkI+Oi4mIiImKioiDfXZsZWRiYWFhYmVoa29zdnp7fX5+fXx5enp5dnNsZVlNRTs2NDM1PERTYW15goiLiomIh4aHh4eIiIWCfXl3dnZ2dnRsZFlNQz04OTtATk1MS0pHSUhHRkRCQEI9PTo5ODc3NjY2Njc4ODk7Ojo6Ojw8PDw8PD09Pj4+Pj4+PT0+Pj09Pj48PD09PT07Ozo5OTk5Nzg4ODg5OTk5ODg2Nzg4NzY2NjY1NDQzMzMzMzMyMTAwLi4tLSwsLCwsLCwsLS0tLS0tLi4uLi4uLi4vLy8uLi4uLS0uLSwsLCwrKykpKSkpKSkpKi8yOC0nKSkpKSkqKikpKSkpKSkpKCgoKCkpKSkoKCgoKCgoKCgoKSkpKisqKywsKisrLCwrKysrLCwsLS8vMDAxNTk+RElLUVdbX2NlaWttb3BwcHJtaGVhX1xaWFdTTEM8NS8pKCcnJycnJycmJycmJignJyovNTxJVWFpc3h7enp7fHt4c2thUUAzKygoKCcnJycnKy42PUlVYW11eXx/f39/f319eXJqXVNFPjYvLCYjICEhICEjT2iNgW1oY2FiYF9TUFNYXFpkVEVDPURMUFtgVlBWP0JFQkVGSFBRUE9aV1xfVElPVVxPLC40OUNQXGhxdXZ2dXV1dXZ0bmhdTkA0LCgnJigoJSUnJyYmKSkoKCkmJSUlJSYmJicoKiwuMTE0OD9GUVdhaW9zdnh1dXd4eXp6eXZzbWdkY2RobHJ2e4GDg4KBgYCAgH99fXt6eHV1cW9ta2dkY2Zoam1vcnR0cnFtb3BxcnFwbWtnZWFhYmJjZmlpbW9xdXl5enp6enp5eXx/g4iMj4+OjYqIh4eJioqJhX12a2ZmZGNjZGZqa21vdXd5e319fX18ent7endxa2NYTUE5NTIzNz9JVmRve4WLi4uJh4eGh4mJiIeFgHx4dXV1d3Z0cGhbT0I8Nzo9RU1MS0pKSEdGRUNDQkA9OTk2NjY1NTQ0NDY2NjY3ODo6Ojk6PDw8PDw9PT4+Pj4+Pj4+Pj4+Pj4+PTw9PT09Ozs6Ojk5OTg4ODg4OTk5OTk5ODc3Nzc3NjY2NTU0NDMzMzMzMjEwMC8tLS0sLC0tKyssLCwsLCwtLS4uLi4uLi4uLy8vLi4uLi0tLS0sLCwsKykpKSkpKSkpKSo2Q0M0JygpKSkpKiopKSkpKSkpKSkpKCgpKSgoJycoKCgoKCgoKCkpKisrKyssLCorKywsKysrKywsLC0vLzAyNTg+Q0dNUlZbYGRmaWttb3FxcHBva2ZjYF1bWFVUT0Y/ODEtKignJycnJycnJicnJiYnJycpLTI4Q1JcZnB1eXx8e3x8eXVvZFZGNiwoKCgnJycnJyksMztDUV1qdXl8f39/f4GBf3p1bV9RRjwzLSolIiEhISAhNVdtkHlcXmJhXllYSktQWmJbXVlNQkhGR0tZV1BQWUM0OktPUkpISEZKTFBQUExOXGhWTyktNTpET1xncnZ0dHV1dHZ1cm1pXU5ANCsnJiUlJSUlJiYmJigpKCgnJiUlJiYmJigpKiwuMDM0NTk/RlFYYWpvc3Z4dXV3eHl7e3p4dnJtamlpb3J3fICDhIKCgYGBgX59fXp4d3VzcHBsaWVhYWJmaGtucXJ0dHFwbm9wcXFwb21pZWJhYWJjY2VmaGpucnV5eHp7e3t6eXl8f4OIjo+Pjo2KiYmHiImJh4N9dmtmZmRkZGRmaWxuc3V3eXt7e3p6eXl6e3l2cGpiV0k+ODUzNDhATVxpdX+Hi4uLiYeHhoeJiYmIhH95dnR0dHV2dG9nXFFFPDk9Q0pPTkxJR0ZGRURBPz08OTY2NjY1NDQzNDY2NTU1Nzc4ODo6Ozw8PD09Pj49PT09Pj4/Pz4+Pj4/Pz4+PT08PDw7Ojo6Ojo6Ojo5OTo6Ojo5OTg4OTk3NTc3NzY1NTU1NTUzMzIyMDAuLi0tKysrKyorKysrKywsLS0tLS0tLS0uLi8uLi8vLy8uLS0tLCwsLCsqKikpKSkqKikpMjo5LSkoKCgoKCgoKCgpKSkpKSkoKCgoKScoKCgoKCgoKCkpKCgrKyssLCssLSwsKywsLCwsLCwsLiwuLjAyMzc8Q0dNUldcX2Voam1ucHBycnBvbmtnY15bWldUUEpDOTMsKSkpJycmJicnJicnJycmKCcnJisvNUBNWGNudHh6ent8fHt4c2pcTDwwKScmJicnJygpLTI5Qk5ZZW53fH5/gICCgYF+d3FnVkg7MS0qJSQjISEjI1xjX3VRPlRKWGRVQT1PQExUU1BOUTo7SE1LSEhOSlVZXF5iZWhoYUpCS0ZEQk1OTFlmVlcrLDI6RVFdZ3Fzc3JycnN0dXNuaV5PQTQsKCUlJCQkJCQkJiYmJygoJyYlJScnJygpKy0uLzEyNDc7QEZPVmBob3N1d3V3eHh7fX18eXh2c3Fxcnd5foGEg4OBgICCgH58e3t4d3VxcG5rZ2NfYWNmaGpscHNzdHNxcG9vb29wbm1rZ2NhX2BgX2FjZWZobHF0eHt7e3x6d3h5fYCEiY6OkI2NioiIiYqKiYiFfHRsZ2ZlZWVlZmprbnFydHl6e3t6eXl5eHh4c21nYFVHPTk3Njc7RFJgbHh/houLi4iHh4iJioqJiIN/eHVzc3R0dHRxZ11RRT0+QkdOTEtKR0dGRENCQD47OTc1NTMzMzMzMjM0NTU2Njc5ODg6Ojk6Ozs9PT4+PT0+Pj8/Pz8/P0A+Pz8+Pj09PDw8PDs6Ozs8Ozo6Ojo6Ojo6OTk4ODc2Nzc4ODc2NjY2NjU1MzMyMjEwLi4tLSsrKysqKysrLCwsLC0tLS0tLS0tLi4vLi4vLy8vLi0tLSwsLCsrKiopKSkpKSkpKSoqKyspKCgoKCgoKCgoKSkpKSkpKSgmKSgpKSkoKCgoKCgpKSkpKysrLCwrLC0sLCssLS0tLSwsLC4vLi8wNDc6QEVJUFZbYGRnaWxucXJycm9wbmxoZGFdW1lWUkxFPDYvKyopKSgnJiYnJyYnJycnKzU8LyYoLTI7R1Rfa3R5e3t7fHx8e3VuYVFCNSsnJiYnJycoKS0xOkFOWWFudHp+f4CAgIGCf3pzaVpKOy8oJSYlJCEhIjd1WUtCPDtLT1ZhVD8xMjtAP0VCR0pBOEZJS0VJRU5bXmBiZGVlY1o+PUlDRUJeTkNQW1xKKCszPEVRXWdxc3NycnJzdHVzbWheT0A2LCklJSYmJCQkJCUlJSYmJiYmJSUkJScpKywvMDEzNDY6PkNJT1hhaW9zdnh4d3Z4eXt9fn17end3d3l9gIOEhIODgYGAf358e3p4dXNvb2xnYl9eX2FjZ2psb3Jzc3V0cXBvb29vcG5va2ViYV9eXV9gYGRkZ2xxdHd4eXt8end4eX6BhoqOjo6Mi4iIiIiIioqIgntybGdlZWVlZmdnaG1wcXN2eHp6eXh5eXh4dnNsZl9RRz06OTk6PUZUYm15g4qLi4uIiIeIiYqKiYiDf3h1c3N0dHR0cWddUUQ+QUhMUExMSUdGRUNBQD48OTY1NDMyMjEyMjIzMzQ0NTU3ODg4OTk5Ojs7PD0+Pj4+Pz8/Pz8/QEA/Pz8/Pz4/Pj09PT08Ojs7PDw6Ojo6Ojk6Ojk5OTk4Njc3Nzc3NTY4Nzc0NDMzMjExLy0tLSwsKysrLCwsLC0tLS0tLS0tLS0uLi4uLi4uLy8vLy4tLSwsLCsqKiopKSkoKCgoKCgrNUI8LCcnJygoKCgoKCgoKCgoKCkoKCgoKCgoKCgoKCgoKSkrKysrKyssKyssLCwsLC0tLS0tLS4vLi4wMTU5PkRITlJZX2JlaGtsb3Bzc29vbW1rZ2JfXFlYU09JQDgxLCopKSonJygnJycnJycnJis0LScnJysuN0NPWmhweHp8enp8fH55cWZXRTcsKCcmJyYnKCwvNDlCS1Vha3N6fX+BgX+AhIF9dmxfTzstJCQjIyMkIyU8a0w7NDUzPUxMYmJhVUI9Jzc5OTpCQT1HS0pMUFRYXV9gYWRiY15UPDVAQ0VFam1NSUNESDEwNTxGUltncXN0dHNzdHR0dG1nXlBBNS0pJSUlJSQkJSUkJCUlJSUlJSYlJykpKiwuMDIzNTc5Oj9FS1FZYWhvc3Z4d3V1d3p9fX5+f4B/f4CCgoSFhYSCgoOBgoB9e3p3dnFubmtlYmBgYWJkaGpscHBydXV0cnJwb3BwcG5sbWpmYl9eXV1dXF5gYmdqcHN2e3t7e3p5dnp+goeKjo6OjIqIiIiKioqJhn97cmpmZWVkY2JhYmZpa29zdnd4d3d3eHl3d3RwamRdUEQ9Ojg4PEJKWGVyfIWLi4qKiImJiYqKioqGgnx3dHNzc3R0c3FpX1JHQ0ZKUFZLSUdGR0RDPzw6OTc1NDMyMTEwMTAwMjI0NDQ0NDc4ODg4OTo7Ozw9Pj4+Pj8/Pz8/P0BAPz8/P0BAPz49PT09Ozw8Ozs7Ozo6Ojo5Ojo5OTk5NzY3OTg4Nzg3Nzc3NTQzMjIxMC4tLS0rKysrKysrKyssLCwsLS0tLS0tLi4uLi4uLi8tLS0sLS0sLCsrKiopKSkpKCgoKCkpJzYxKionKCgoKCgoKCgoKCgoKCgoKSgoKCgoKCgoKCgpKSkqKysrKysrKysrLCwsLCwtLS0tLi4vLy8vMTM3OkFGTVNYXGBkaWptbnBycXFwbmxsaGRgXVtYV1FLQzs1LispKCgpKSknJicnJycmJiclJCUnKCcqLjU/TFZjb3d6fHt6enx8enRsXEs8LygnJicmJyorMDY6QUpUYGpyeX1/gYGBgYOCgHlxYlJAMSgjJCQkJCQnQm5ZPjY7NThBUWJpb3FoUD1GPjQ2Q0dGUE5NTlZZW15gYWJiYF1YVFI1RUdHQk5hTUpVXUsuMTY9RlJdaXFzdHRzc3R0dHRsaF1PQTUtKSUlJSUkJCUlJSQlJSUlJSUlJicqKy4wMDI0NTc6PDxBRUtRWWFob3N1eXh3dnh7fn+Bg4SDhISEh4eGhYWEg4OBgIB9fHl2c3JtbGlmY2FhYmJjZmdrb3FydHV1dHJwb29vb29ubGtoZGBeXVxcWlpbXGFjaW5zdnt7fXx5d3l8gIOIi46OjoyKiIiIiYmJiIWAfHNpZWRkYWBfXmBjZmpvc3V2dnV1dXV3d3d0cGtjWk5FPjw7Oz9GUV5pdoCIi4uKiYiIiImKi4mKh4B6d3Rzc3N0dHNxaWFVS0ZKUFZaS0lHRUVDQDs5ODY1NDIyMTAwLy8vLzExMzMzMzU2ODk3ODg5Ozs9Pj0+Pz8/P0BAQEBBQEBAQUFAQD8+PT09PT08PDw6Ozw6Ozw7Ojo6OTk6OTc3ODg4ODg4Nzc3NzU1MzMyMTAuLS0sLCsrKysqKioqLCwsLCwsLS0tLS4uLi4sLi8uLS0tLC0tLCwqKioqKSkpKSgoKCgqKicmKCgoKCkpKCgoKCcnJycoKCgoKCgpJygoJykpKSoqKioqKisrKysrKysrKywsLC0tLS0uLi4uMDAwMDM2Oj5ESkxUW19hZWlqbW9ub29vbmtqamZiXlxbWFRPRz83MCsqKSkpKjIvKCgnJycnJycmJiYlJCYjKC0xO0hVYW11eXx8enp8e3p1bmBQPzIqJyUmKCkqLzM5PUFJU11mb3Z9f4GCgoODgoF7dGlaRjYsJiQjIyUoKFtrWDw2PEJBSVllbnR3dFZLSENBRExQTUdDTFRYWl1gYGNiYV1YVE5GPkJBQ0RLWlRQTEw5MTE3PkhSXmpydHR0dXN0dHNybGlfUUI1LSklJycnJSUmJiUlJSUmJiUmJycoLC4uMDEzNTY6PD5AQ0hNUlxiaG9zdnh5eHh5e36BhIeIiIiJiYmIh4WFhIOEgYB9fHl2dHBsaWlkYmBhYWJjZWZpbG5xc3R1dHJxb29vb3BvbmxpZWJfXVtbWltbXV1eYmdscnZ6e3x9end6fYGGiYuNjo6MiYeHh4iIiIWCfnZuaGRjYl9gXFxgZWhrbnN1dXV1dXVzdXV1c29qYFlPRD8+Pj9FS1ZibXZ/iIyKiYmJh4eJioqLiIR/eXZzcnJ0dHZ1cmxlVk9KTVRbX0hIRkNBPzw5ODY1NTIyMjEwMC8vLy8wMTIxMzM1Njc3Nzg4OTs7PT49Pj8/Pz9AQEBAQUBAQEFBQUE/Pj4+PT09PTw8PDs7Ozw8Ozo6Ojk5OTk5OTk5ODg4ODc3Nzc1NTQ0MzIwLi0tLCwrKysrKyoqKywsLCwsLC0tLS0uLi4uLC4vLi0tLi0tLSwsKioqKikpKSkoKCgoKCgpKScnKCgoKCcnKCgnJycnJygoKCgoKScoKCcpKSkqKioqKiorKysrKysrKyssLCwtLS4uLy8uLjAwMDEzNjpBRkxTV1xgY2dpa21ubGxqamlpaGhjX1xbW1ZTTEM7NC0qKikpKSoqKSgoJycnJycnJSYmJiQmJSgrLjdDUV1ocnl8fXt7fHx7dm9mV0QzKSclJigqLjI2Oj5DSlJcZWx1e3+AgYKBg4OBfHlwYU8+MCcjIyMkJSlES0Y4Pz89PkpaZG9zd3JbVE5BPkFCTUtFUFRZWlteYGBhX1xYVE1HQjo4TUJAR1VaWlZFLDI0Nz5KVF5qcnR0dHVzc3NzcmxpXlBCNy8rKCcnJyUlJiYmJiUlJiYmJygqKysuMDM0NTc6Oz5AQkVLUVRcYmhvc3Z4d3d2d32AhIeKjI2NjY2LiYeGhYSDgoB/fHt2c29raGZiX2BiYmFjZWVoa2xwcXN0dXRycW9vbm5vbW5saWViXlxaWVlZWFlaXGBnbHJ2ent9e3h3en2BhomLjY6MiomHh4eIiIiFgHpzbGdkYmBeXlxcYGVpbG9xdHRzc3Nzc3R2c3JuamBYTkdDQD9CSU9bZHB6g4mLiomJiYmJiouLi4iEf3l1cnJzdHR1dXNtZFtTT1FZYGRIRURCQD05ODQ1NTMxMDExMDAuLi4uLzExMTIzNTY2Njk5Ojo7Oz09Pj4/Pz8/QEBBQUFBP0FAQEFAPz8/Pj09PDw9PT09PT08PDs6Ojo6Ojo6OTk5OTc3OTk3NzY2NTU1MzEwLi4tLCsrKysrKyoqKysrKysrLS0tLi0tKy0tLy0tLCwtLS4uLCwrKyoqKSkpKSgoKCcnJygoKCgnJycnJycnJycnJycnJycnJycnJygoKCgoKCkpKiorKyssLCwsLCwsLS0sLS0tLS4wMzAwLi4vMDAwNDc8Q0lOUldbX2NnaWtsa2lpZ2dnZmVjYV1cW1lVUUk/ODAsKSkpKSgoKCgoKCcmJycmJiYmJiYlJSYnKTA1P09bZXB3ent6fHx8fHhyaVtLOy0mJykpLTE1Nzs/REtPWWJrcnp+gYGAgYKDg4F9dWhWRTYrJiIkIyQoQE5KPjc5OTxKVWJxdHd0bE5DQjk3PkZGUFJXW11eX2FgXltXUkxGQDg1MlRDO0dQWVhcQDAyNjlAS1Zha3N1dXR0c3R0dHJsaF9RQTYwLCkoJycnJScnJiYmJCYmJygqLC0uMDM1Nzo7PT1CREZIT1NYXmRqb3N2d3l5eXuBhIaKjY+RkZCPjoyJiIeFgn6BfXl0cW5qaGNfXmBfYWVlZmdoaWxrb3FydHR0c3Fvb25tbm1saWViXltbWVhZWFdXWVxgZmxxdnl8fXt7e3p+gYaIi42OjIqIhoeHiYmFgn13cWpmY19eXlxdXmFmaW5wcnRzc3NycnN0dHRyb2dgVk5IRUNDRktVX2dye4WLi4uKiYmJiYqLiYuJhX56dnRzdHV1dXRya2VfV1ZYXmRpR0VDQD05ODY0MzMyMjAwMDAwLi4uLi8xMTEyMzU2NjY5OTo6Ozs9PT4+Pz8/P0BAQUFBQUFCQkJBQD8/Pz49PTw8PT09PT09PDw7Ozo6Ojo5OTk5Ojo3Nzg4Nzc2NjU1MzIxMC4uLSwrKysrKysqKisrKysrKywsLS4tLS0uLy0tLS0tLS0tLSwsKysqKikpKSkoKCgnJycnJygoJycnJycnJycnJycnJycnJycnJycoKCgoKCgpKSoqLCsrLCwsLCwsLC0tLC0tLS4uLzAuLi4uLzExNDY5P0RLUFRYW19jZ2hpaWhmZmVlZGNhYF5eXFtYU05FPTQuKikpKSkpKCgoKCgnJicnJiYmJiYmJiYmJysuMjxJVmNsd3p7enl5e3x6dWteTj8yKikpKy8zNzk+QEVLT1dhaHB4foGCgYKCg4OBfnduX049LycjIyQlJkJ1d0QmKTM6SFRjcHZ4dW5LOy4vMjcuO1ZZWl1eYGFhXVtWUkxGQTkzLi03P0VRT09MX005NTU6QUpVYmx1d3Z1dXV1dHV0bGhfUUE2MCwpKCcnJycnJycnJicmJygqLC0uMDM1Nzk8PT9BREZISlFVWmBkam9zdXZ4enuAhYiMjpCSk5OSkY+NiYiHhIB+fnl2cmxpZWFgXV5gX2FjY2ZnaGlsbG9wcXN1c3FwcHBubW5ta2dlYV1aWVdWV1RTVFRZXGRqcXd7fHx6eXl6foGGiIuNjoyKiIaHiIiIhYB6dXBmY2BeXVxdXV5hZmpscHJzcnBwb29wcnJycG1lXVRNSkdGRkpOWGJsdoCIi4uKiYmJiYuKi4qKiIR9eXZ0c3R1dnV1c25qYVtZXGBma0ZDQT06ODY3NDMxMTEuLzAvLy4uLi4uMDExMzQ0NTY4Ojo5OTs7PT0+Pj8/Pz9AQkFBQEBCQkFBQEA/Pz8/Pj49PT09PT09PTw8Ozs7Ozk5Ojk5ODk5ODg3NzY2NjY0NDExMS8tLS0sKysqKisrKysrKysrKysrKystLS0tLSwuLS0tLS0tLS0sKikqKikqKSkpKCgoJygoKCgnJyYmJiYnJycnJiYmJiYmJiYmJiYmJycoKCcoKiorKisrLCwsLCwsLS0tLS0uLS0uLi0tLi4uLy8wMzY4O0BITlNUWVxfYmVoZWNiYWFiYmBgX19gXl5bV1JLQToyLCoqKioqKSkoKCgoJycnJycnJiYmJiYmJSUpLjM6RFJgbHN3enp6eXl7enRtY1NDNCsqKi0yNTc8P0NGSk5VXWdudn6AgYGBgYGDgn95c2ZWQzMnJSQjIyI1aWQsIycvOkNTYm50dXNrYDYlJSorN0xZWltfYF9hX1lVUUtFPTcxLy4zMzhIUFFPVU5SVzQ1OkFMWWNtdXd5eHV1dHd0cm9rYFJCOTEtKioqKCcnJycnJycnKCkrLS8wMTI0Njg7PT9BQ0ZJS05TV1thZmxwdHZ3eHp9gYeLkJKVlZeWk5KPjYqHhoSAfHl0b2xnZGBcXF5gYGFjZWdmZmdpa21ucHJ0dXNxcW9vbm9ta2lmZGFdWVZVVFNUU1RVWFxka3B1eHt6eHh4en6Ch4mMjY2MioiIhoiHhoR+eXNsZWJgXl1cW11eYmVqbXBxcnJubm5vcnNzdXFtZ19XT01JR0lOVVxmcHuCh4uKiYiJiYmKiomJiYaCfXh1c3R0dnZ3d3VxbGRdXV9kam9DQTw6OTg2NTQzMTExLi4uLy8uLi4uLjAxMTEyNDU2ODg4OTk7Oz09Pj4/Pz9AQEJBQUJCQkJBQUBAPz8/Pz8/PT09PT09PT08PDs7Ozs7Ozo5OTg5OTg4Nzc2NjY2NDQxMTEvLS0tLCsrKiorKysrKysrKysrKysrLC0tLS0uLS0tLS0tLS0tLCopKiopKikpKSgoKCcoKCgoJycmJiYmJycnJyYmJiYmJiYmJiYmJicnKCgnKCoqKyorKywsLCwsLC0tLS0tLi4uLi8uLi8vLzAwMTI2OT5ESU5TV1teXmJlZGJgX11bXFxdXV9gYGBdW1ZPRj42LioqKioqKikpKSgoKCcnJycnJyYmJiYmJiUlKCsyOEJPXGlxdnl7enh4eHp2b2dYRjgvLS0vMzg7PkBER0pNVFxkbHZ9gIGBgYGBgoOBfXZsXUo4KyYjIiIgM0w9IiYvNDhEUmFudHd4Wj0kMjE/TVVaW1tfYGFgXVlWUUxFPzgwLC0vMjAuP01RUlRNSUk2NTpBTVpjbXV3d3d2dXd3dHNwaWBSQjkxLSoqKSkoKCgoKCgpKSksLC0wMTM0Njg6Oz9BQ0VKTU9SV1tfY2dscXV2d3l7foOKjpOWl5iXlpOSj42Kh4WBfXl0bmpnY2BcW1xeYGBhY2ZmZmdqa2xucHBzdnVzcXFvb29sbGpmZGBdW1dWVVNSUVBRUlNbYWlvdXl8eXd4eHp+goeJjI2NjIqJiYiJh4aDfXZwZ2FfXl1cWlpcX2Roam1vcHBwbm5ub3JzdHRxa2ZeVlBOTEtNUlhia3R9hIiLi4mIiYmJiomIh4eFgX14dnR1dXZ2d3d1cm5nYWFiZ21yQD07Ojg4NjU0MzIyMDAuLi0tLi4uLi8xMTEyMjU2Nzc6Ojo6PDw9PTw+Pz9BQUFBQUFBQUJCQEBAQD8/Pz8/Pz4+Pj49PT09PDs7Ozs7OTk6OTk4ODc4ODY2NjY1NTU1NDExMC0sLSwqKioqKysrKysrLCwrKywsLCwsLC0tLCwsLCwsLCwsLCwsKSkoKSkpKCgoKCcnJicoKCgoJiYmJiYmJiYlJSYmJiYmJicnJycnJygoKCkqKisrKyssLCwsLCwtLS0tLi8vLzAwLi4vLy8vMjA0ODtBR0tPVVdcXV9iYmFeXFxbW1pbXV1gYWFgXllUTEQ7MywqKioqKiopKSkoJyYnJycnKCgnJycnJiYmJicqLzU/Tlhlb3Z4eXt6d3h3dG9pW00+NDExMjY5PkBBRUdKTVNaYmhzeoCBgoGCg4OEhH94cmVTPzAoIyQuKzEwJiQmMjI2Q1FgbXR5fGlJSltbWVhYWVxfYF9fXVlVTkpEPTcwLS0sLi0tLl5TUk9OT1JJNDc8QU9ZZG52eHd3dXV2dnd1b2tiUkQ6Mi0qKikpKioqJygoKSosLS4wMTQ1Nzk6PD9CRUhJTFBRU1pcYmVpbXBzdnl7f4KHjpOXmJmYl5WUkoyKioeEgHt1bmlkYV5cWltdXV9fYmRkZWZnaWtsb3BxdHRzcnFwb29ubmtpZmJeW1lWVVRRUFBPT09TWWFpb3Z4enp5eHl6foGGio6NjYuJiYmJiYiHgXt2bWJeXl1bW1taXWFkaWtucXNxcG9vbW9yc3R0cGtkXVZRUU9PUVZdZm93f4aKiYmKiImJiomHhoWEgoB8eXZ1dHZ2dnh4dnVxamVjZWhscz06Ojg2NTU1NDMyMjAwLi0tLS4uLi4vMTExNDM1Njc3OTk5Ojw8PT0+Pz8/QUFBQUJCQUFCQkFAQEA/Pz8/Pz8+Pj4+PT09PTs7Ozs7Ozo6Ojk5ODc4ODg4Nzc3NTU0MzUzMjIvLi0sKioqKisrKysrKywsKystLSwsKyssLCwsLCwsLCwsKysrKykpKSsqKigoKCgnJyYmJycnJycmJiYmJiYmJSUlJSUlJSUmJiYmJycoKCgqKioqKissLS0sLCwsLS0tLS4vLy8wMC8vMDAvMDMzNjo/RElNU1ZaXF1fYWFeXFpaWVlYWl1fYmJiYF1YUkk/NjEsKioqKioqKSkqKSknKCgoJygoJycnJyYmJiYnKi0zO0hUX21zeHl5eHd3d3VyamFRRDczMzc6PD9BQ0JFSExPVmBncHp/gYGBgYGAgIODfXRrWUY1KyYmPTYmJSUhJSsvNkNRYG10eHp6eHJtZV1bWlxeX2BfXFlUUEpEPTUuLCssLS0tLTd1WFFOTEpTPy82O0RRW2NtdXd3dXZ2dnZ3dXBqX1JEOjMuKysqKSoqKyorKywsLS0vMDI0Njg5PD5AREdKS05SVVdbX2Nna25zdHZ4e36EiY+UmZmal5aUk5GMioiGgX11b2lkXltZWVpaW15fX2FjZGVmZ2lrbm9xcXR0cnFxcG9vbm5qaGZiXVhXVFNST05OTUxOUVdhaHB3enp6enp7e3+Ch4uNjY2NiYmJiYmIhYB6dGxiXltaWVlaWl1hZmpqbXFwcW9ubm1vcXJzc29sZF1YU1BQU1VaYWtze4KJioqKiYmJiYmIhoWEg4B/fHl2dXV1dnZ3d3d2cWpoZ2lrb3M7Ojg3NjY0NDMyMjAwMC4tLi4uLi4uLzEyMjMzNTY2Njk5Ojs8PD09Pj4/QEJCQkJCQkJCQkJAQD8/Pz4+Pj8/PT0+Pj09PDw7Ojs6Ojo5OTk5ODg4OTg5Ojo5OTo4OTk3OTc1NTIwKyopKiorLSstLCwsLS4uLSwsLCwpKyssKywsLCwsLCwsKyopKiopKSgoKCgoJycmJiYmJiYmJiUlJSUlJSUlJSUlJSUlJiYmJigoKCgpKSoqKioqKywsLCwsLC0tLi4uLy8vLy8vLzAwMTIzNTo+Q0dLT1VYWltfYF9eXVpZWVlZWl5hY2NkYmBcVlBFPDYvKyoqKioqKikpKiopKSkpKCcoKCcnJiYnJycnJygrMDlDUF1pcnl6eXd3dnd4dm1lV0g9Njc5Oz5BQ0NERkpNTVNeZmx1fICAgYGAgIGCg4B6b15NPDAnJiMiJCUkJCQqLzVBUV5tdnt8fHt2bmhjXVpeX2BhXVlVT0lEPTYtKyorLS4uLi48amZQUU5UXlg4Nz5EUFtmb3V3dXZ3d3Z2d3VvaGBRRTozLi0sKyssLCwsLSwrLC0uMTIzNTY5Oz5AREdJS05RVFdbXmJlaW1ucnN2eHt/hImRl5qamJeTkZKNi4eFgn95dG1kX1pYV1dXWVpaXV5fYWRlZmdqbW9wcHJzc3NxcG9wb25taGhlYVtWVFJRUE5NTElLTU9WX2hwdHl4eHd4eHp/hIiNjo2MjYyKiomIiISAeXJpYV1aWFhYWVpdYWZpbXByb29ubm9ucXV2dHNvamNdWFRSU1VZXWdtdX6FiYqJiYmJiYmJhoSDgoF+fnx5eHV3dXZ2d3d3dHJvaWdpbnF1Ojk4NzY2NTQzMjExMTEuLS4uLi4uLi8xMjIzMzU2NjY5OTo7PDw9PT4+P0BCQkJCQkJCQkJCQEA/Pz8+Pj4/Pz09PDw9PT07Ojs7Ojo6OTk5OTg4OTo9PkBAPz9AQUJCQkE+Pjw4My4rKioqLi8wMTExMjExMTAvLi4uLS0rLCssLCwsLCwsLCsqKSkqKSkoKCgoKCcnJiYmJiYmJiYlJSUlJSUlJSUlJSUlJSYmJiYoKCgoKSkqKioqKissLCwsLC0tLS4uLi8vLy8vLy8wMDEzNTg8QkZLT1JXWFxeXl5fXVpXVlZWVllcYWNjZGJhXFZNQzs0LSsqKisrKiopKSoqKSkpKSgnKCgnJycnJycnJycnKS00PkxYZ3B1eHh3dnV2d3RxaFpQQjo6Oz0/QURDRUZKSkxQWmJqcnp+gIGAgICBgoKBenFnVkM0KCYjIyQyNSEjKS01QU5ebHV6fX97eHBsZmBeX2BfXVlSTklCOjUvLCsqKywtLS4uMlFiU1NTT2JnQjc8RlNeZ3B1d3Z1dnZ2dnZzcGldUUU6My4uLSwsLCwsLCwrLC0uLzE0Njg4Ojw+QURISk1QU1ZZXF9jZGhtcXN0d3d7f4WKkJaXl5WUkZCOioeGg4B8d21nYFtXVVVWV1laWlxdX2FkZWdna21vcHByc3NzcnBvcG9ubWlnY15ZVVJQTk1MS0tJR0lNVF1mbXN2eXh3d3p8gISIjI6OjY2MioqKiIiEf3hvZl5aWVZXV1hZXWFoam1tcXBvbm9vcHF1dnRzb2piXFpYVlVXXWJpcXmBhoqJiYmJiYmJiYaDgn9+fX18eXh1c3V2dnd3d3Ryb2poaW9xdTk4NzY2NTQ0MzIxMTEwLi0uLi4uLi8vMTIzMzQ1Njc3Ojo6Oz09Pj4+PkBBQkJDQ0NDQkJCQUFAQEA/Pj8/Pz8/Pzw9PT08PDo5OTo6Ojk5OTg4ODk7QERGSEhISElJS0pKSElGQTozLiwtLzE0NTY3OTo6Ojg4NTQxMTAvLSsqLS0tLCwsLCsqKiopKCgoKCgoKCgmJiYmJiYlJSYmJSUlJSUlJCQlJSUlJSUlJSYmKCgnJykpKioqKiorLCwsLC0tLi4tLi4uLi4vLzAwMTEzNjg6PkVLT1RXWFtbXF5fX1xbWlhXWVhcYGNkZWZjXltUS0E5MiwqKysrKysrKysrKikpKSkpKSkpJycoKCgoKCgmJiksMjpHVWJtdHZ4eHV1dXh2c2tiU0g9Oz0/QUNERUVGRkpNUFddZm53foGCgICAgYGCg353bVtJNysjIyEjKi0jIycuNUBPXGl0en1+e3l1bWZjYF9dW1dRTElCOTItKywrKywsLS8vMTE1RldRS05XVjw4PUdUXmhyeHd4dXd3d3d2c25oX1BGOjQyLi4uLSwsLCwrKy0vMTIzMzU6Ojw+QENGSUxPUlRWW15hY2drcHJ2d3h5fICEiY+UlpWUko+Mi4iEgoF8eXJrZFpUVVVUVFVWWFpaW15fY2VnaGxtbm9vcXNzcnFwb3FwcW1qZWFbWFRRUE1LSEdFREVGS1FaZmxzd3h4eXd5fICDh4uMjo2Mi4qKiomIhH53bmZcWFdXVldYW15iZ2psbXFyb21ubm9wcnRzcm9qYlxZWVdXW2BmbHR8goeJiYqIiYiIiYeDgH59fHt8fHl2c3V3dnZ3eHd2cm9ta2xwc3c4NzY2NTUzMzMyMTEwLi4tLi4uLi4vLzEyMzQ1NTY3Nzk6Ozw9PT4+Pz9AQUJCQ0NDQ0JCQkFAQEBAPz4+Pj09PT09PT09PDs6Ozs6Ojk5OTg3OTo9QUZKTU9PT1BSU1NSUlNST0lDOTMxMjU4Oz5AQUREREVDQj88Ojk3MzAvLC0tLCwsLCwrKioqKiopKSkoKCgoJiYmJiYmJSUmJiUlJSUlJSQkJSUlJSUlJSUmJicnJycpKSoqKioqKywsLCwtLS4uLi4uLi8vLy8vMDEzNTc8QEVLT1NWW1xcXV9eXWBeXFtaWlpdYGFjZGVkY11ZUEc+NzArKysrKysrKysrKyopKSkpKSkpKSknKCgoKCgoJiYnKzA3QlBcaXF1d3h2dHR2dnNtZ1lOQj0/QEJEREVGR0ZIS09TWWFocnuAgYB/gICCg4OAe3NjUD8wJyQiISMiIiMnLTJATVppdHh+fnt5dW5nYl9dW1dSTUZBOjItKyoqKissLS8wMDI0MkxXS0lJW042OEBKVWBqdHh4d3d3d3d3d3Rval5PRTw1MC4uLi4tLCwsLi4tLzEyMzM1Ojs9PkFESEpNUFJWWFteYmVpbXF1dnh7fH2BhImOk5ORkI+Ni4iGgoB8d3RuZ2BXU1VSU1NSVFZZWlteX2FkZ2psbW9vcHJzc3JxcG9wb21rZ2JfWVVRT01LSEZEQ0FBQ0hPWWNscnd4d3d4e32BhIiLjI2Mi4qKioqJiIR+d25mXVlZWFZXWVxfYmhrbnBvb3Bub29yc3R1dHNwaWJcWVlZW11jaXB3f4WIiYiJiIiJiYiFgH58e3h7fX15d3V2d3Z3d3h4d3RxbWtrbnN3NjY2NjU1MzMzMjExMC8tLC4uLy8vLzAyMzQ2NzY3Nzg6Ojo8PDw9PT4/P0BDQ0NDQ0NCQkJAQD4+Pz8+PT09PT09PT09PTw8Ozo6Ojk5ODk6Ojs9QEVJTlJWV1dYWVtbWlpaXFlUS0M8Ojs+QUNJS01QU1RST05KSklFQD04MS8tLC0rKysqLCoqKSkqKSkoKCcnJycnJiYmJSUlJSUlJSQkJCQkJCQkJSUlJSUlJSUnJycnKCkqKisrKystLS0tLS4uLy8vLy8vMS8xMTIyNDg8P0RJUFJWWltdXmFiY2NgX15cXFxdYGJhYWRlY2FdVk1EOzQuKysqKisrKysrLCsrKioqKikrKSkoKCcnJycnJyYmKCkvNT9MWGZvcnV1dXV0dnd0cGtfU0hBQEJDRUZGRkdHR0lNTVJbZG12fYGBgYGBgoSDgn10aVhFNSgkIiQjJCMjJiw0QE1aaHN6fXx8eXVsZWNeXFdRTEZBOjItKioqKisrLC0uLy8uLjNZVFBJSk1WPTpBS1ZfbHd5eXh1dXZ4eHZzbmhdT0Q9NjIvLy4uLi4tLC4uLS8wMjM1Njg6PD9BRklKTVFTVlhcX2Rmam5ydnh7fH1+gYWKjpGRkI2NioaFg399eHJuaGFaV1NRUE9SUlJTWVpbXF9hY2hqbG5wcHNzc3Jyb29vcG9sZ2RhXFdST05LSkdDQT48PD9FTFZfaXB4e3l3d3l/goWJi42MiomJioqJiYeDgHluZV1YWFhXWFpeYGNoa21ucHBwcG9wcXJ1dXRybmliXVpYWl5iZ212fIKGiYqIiIiGiIiHgn58enh4eHx8end2dXV3eHl5eXd0cW1rbXF0djY1NjY2NTQzMzIxMTAwLi0wMDExMTEzNTM0Njc3Nzg5Ojo6Ozw8PT0+Pz9AQkJCQkFBQUFBQUA/PT0/Pj09PT09PT09PDw7Ozo6Ojk5OTc5Ojo8PUFHS1BTWFpaW1xeXl9fX2FfXFVNRUNESU1QVlhbXl9gYl9fXVlWUk5HQj02Mi8uLSwsLCsrKykpKikpKCcnJycnJycnJiUlJSUlJSUkJCQkJCQkJCUlJSUlJSUlJycnJycoKiorKysrLS0tLS4vLy8vLzAvMDAwMTEyNTg9QURJTlJXW11eYWJkZ2ZmZGJfXl5eX2FjY2RkZWNfXFJKQTkxKysrKiorKysrKywrKyoqKioqKioqKCgnJycnJycoKCgpLDI7RlNga3J1d3V1dXV3dnFuZ1lOR0NCREZHRkdGRkZISUlMVF5ocXl+goGBgYGCg4KAeG9gTTwuJyMlIyQkJCgvOUFOXGdyd3p7e3h0bGVfXFVRS0M/ODIsKioqKiorLCwtLi8vLi4yTGRYSkxMWD05QUtXYm12eXl4d3V2eHh2c21nXU9DPDYyMi8xMTAvLiwuLi8xMDIzNTY4OjxAQ0ZJS05SU1ZZXV9kZmtvcXV5fH+Ag4OIi42Pj46KiYeGgn98eHRwaWNdV1NRT09PUFBSVVZZW1xeYGNoamxucHBxcnJxcXFxcXBvbWllX1pUTk1LSUZDQD87Ojo8QUpVX2hvdnd3dXd5foOFiYqMi4qIiIeHiIiHg394cWdgWlpaWVxbX2NmaGtvb3Bwb29vcXJzdXJ0cm1oYl1bWlteZGpxeH+Eh4mKiIiIiImIh4J+enh0dHh7e3h5dnd3eXl5eXh3dHFta25wcnU3NzQ0NTU0MzMyMTExMTAuLjEyMjExMzQ1Nzc3Nzg5OTo6Ozs9PT8/QD5AQUJAQ0NEREJCQUA/Pj49Pj49PT09Pj4+PTs7Ojo6OTk5ODc4ODk6Oz1CR0tPUlZaWltcXV5hZGJhYmBdV1BOT1NYXF9hY2VqamhnZmZjX11YVlFJQTw1Mi0rKy0rKyoqKikoKCgnJycnJiYnJyYlJSUkJCQkIyMjIyQkJCQkJCUlJSUlJSUmJycnJykpKyssLC0tLi4vLy8vLzAwMC8wMDEyNjk9QkZKTlRWWl1dYWNlaGpraWVlY2BfX2BhY2VmZGNhW1dNRD43LyssLCsrLCwsLCsrLCwrKyoqKiorKykoKSkoKCgoKCgmJyovN0RRXWlydXV1dXN0eHd0cGtfVEpDRERHRUdGR0dGREZFRk1XY254foKCgoKCgoODgXtzZFNBMSckJCUmJicsNThETlpncnZ3eXl1cm1lXVdRSkU/ODArKSkpKysqKy0tLi4vLzAwMUNmVlJOUFY4PUNNWGNudXh6eHh3d3h4dnRtZ11QRDw2MjMyMjIyMi8tLi8wMjIxMzU3OTo9QENHSk1PUlVYWV5hY2dscHJ2en6AhIOFiYyNjYyKiIeEgn98eHRwa2NcV1NQT09PTlBRU1RWV1teX2NkZWdtb29vcHFycXFxcXJwb21oY15ZU05LSENCQD07OTc3OkBLVF9pcHV3d3V3en2DhomKjIuKiIeGh4eGhoOBenJpZF1aWFpdXF9hZWhsb29xcXFxcHJzdXV0c3BsZ2JcXFxeX2Ztc3qBiImKiYiIiYqKiYeBfXl2c3R4fHp4eXh3eXh4enp4d3VybWttcXR1Nzc1NDMzNDMyMTExMTEwLy8wMjIzMzM1Njg5OTc3ODg6Ojs7Ojw/Pz9AQEFBQUFBQkJCQUBBPj0+PT09PDw8PD09PTw7Ozo6OTk5ODc3ODc3OTw+QERJTE9SVVhXWFtcX2JiZGZkY2BbV1peXmNlZ2dpa2ttaWtraWdlY19ZVU9IQDkyLSwsKiopKiopKCgoJycnJyYmJSUlJSUlJCQkJCMjJCQkJCQkJCQlJSUlJSUlJicnJycpKSsrLCwtLS4uLy8vLy8vMDAxMTI0ODs/REhMUFRWXl9iZGVpamttbGxpZmVjYWBiYmRkZWRkXllTSkE5Mi4rLCwrKywsLCwrKywsKysqKioqKysrKSkpKCgoKCgoJyYpLTRATVlkbnN2dXV0dXd4d3NvZllPSERERkZGRkdGREE/PkJGUF1qdHyCg4KCgoKDg4F8dmpaRjYrJSUmJikuMTc+Rk5bZ3J2d3h4dXJtY1hSS0Q+ODApKSopKSsrKywtLS4uLy8wMDA/YmFRTE9MRTxCTlllb3Z5enh4d3d4eHZ0bWddUEQ8ODQzMjIyMjIxLS4vLzAyMTM1Nzk6PUBDR0pNUFNWWFpeYWNnbHBydnt/goaFiIqMjI2LiIaFgn98eXRxa2NeV1NRUE9PUFJTVVVXWVpbXmFiZGhqbW9vb3BxdHNxcXFycG9saWNcV1BMRkNAPTw5ODY1Njg+SlVgaXB1d3d1eHmAhIaJi4uKiIiHhYaHhoaDgHlwZmJeXFxcXV5fYmZpbnBxcnJxcnJ0dXZ2dnRxa2VhXVxdX2Job3d+hImKiomIiImKiomHgHx4c3F2eXt6enh3d3Z4eHh4eHd1cm9tbW5xczY2NTQ0NDMyMTAxMjExMjExMTMzMzQ0NDY1Nzc4OTk6OTk6Ojw7PT8/P0BBQEFBQUBAPkBAQD8+PTw9Pj09PDw9PTw8Ozo5OTk5ODg3NjY2NTY5Oz9CRkpNUFNVVVRTVFhdYWNlZWdlY2BgYmNmZWdpaWlpbGxrbGlpZ2RjYmBbVUxFPTUuLCoqKSoqKSgoKCYmJycmJSUlJSUlJSQkIyMjIyMjJCQjIyMkJSUlJSUlJCUnJycnKCkqKywsLS0uLi8vLy8vLy8wMTU2NzxARUlNU1dZXF9kaGptbnBwcnFvamloZGNhYmNjYmNhYFtUTUM8NS8uLCwsLCssLCwsLC0sLCsrKysrKysrKioqKigoKSkoKCgoKi0yPEhVZG1zdnZ2dnZ2eXl3dGlfU0lFREVHR0ZFRUI+Ozs8QExYZHJ6goODgoGCgoKCgHdwX0w7LiYmJyktMDU7QElQXGdxdnd3d3Nwa19VTUY/NS4rKCkpKiorKywsLC0uLi8vMTExNE5lUktPVV5NP1FbZ3F3enp4eHd3d3d1c21oXE9FPTg1NDMzMjIyMC8vLy8vLzEyNDc5Oz5BQ0hLTE5TVVdaXmJjZ21xdHh+goOGh4mKi4uKiYaEg4F9eXRxa2ZfWFRST09PUlJVWFhaWl1eX2JjZWdqa21ub3BxcnRzc3Jyc3BubmlkXVZRS0RBPjs6NzYyMjQ4P0pWYGtxdnl4dnh7f4SHiouLiIeHhoWGh4mHhH94b2diYF5dX2BgY2Voam5xcnJyc3N1dnV4dnZzcmljXl1cXmJmbHN5gIeJi4uKiomKiouKhn97dnRydHh8fHh4eHd3eHh5eXh3dHFta21vcnQ2NjU0NDQzMjEwMTIyMjIxMTE0NDU1NTU2NTc3OTg5Ojo6Ozs8PT4/Pz8/QEFAQUFAQEFAPz8+Pj08PD08PD09PDw7Ozo6OTk5ODk5NjY2NTQ1ODk8P0JGSEtKSklKSklPVFhdX2VoaGhlZGVnZmVlZGRkY2VlZmdnZmdpaGhoZWJbU0xBNjAqKSkqKikpKCgnJicnJiUlJSUlJSUkJCMjIyMjIyMjIyMjJCUlJSUlJSUmJycnJygpKissLC0tLi4vLy8vLy8vMDQ2OTtBR0xRUlhaYGRnaW1vcXNzd3Vyb21qZmVjYWNkY2JiYFtVT0Y8NTEvLiwsLCwsLCwsLCwtLCwrKywsLCwrKysrKiooKCkpKCgoKCksMTlEUl9qcXZ1dHR0dnl6enVtYlhNR0ZGR0dGRUM/Ozg3ODxGVGJtdoKEg4KBgYKCgoF6c2VUQjIpJykrMDQ5P0VNVF1ocXd4d3dyb2lcUEhAOC8rKSkpKSoqKyssLCwtLi4vLzExMjI9Z2hSUElaYUpNW2hzeHp5eHd3d3d3dXNtaFxPRT04NTQzNDMyMjAwMDAwMDAwNDY3OTs+QUNIS01PUlRYWV1eY2dscHR4foKFiIiKi4yJiYiFg4KAfXl0cGpkXVhWVFVTVVhYWlxdX2BgYmNkaGlpa21vb3BxcHFzcnNycnNycG9tZmBaVE1DPTo5NzUzMTAyOEBLV2FrcnZ3eHZ4e3+Eh4qLi4mIh4aHiIeIiIV/eG9nYmBgX19fYWRmaWxvcXJzc3R0dnZ3eHZ2cnBpY15cW15iZ293fYSIi4yLioqJioqKiYR8eHNwcHN5e3t5eHh5eXh4eXl4d3Rxb21ucHJ0NTU1NTQ0NDIyMzIyMzMzMzM0NTU1NTY2NjY2Nzk7Ozs7Ozw8PD4+Pj8/Pz9BQkBAQEBAPz4+PT09PT49Ozs7Ozo6Ojo6Ojk5ODg3NzU1NTU0NDU1Nzo5PD49Pj46OTk7Q0lRV19kaGloZ2ZlZWJhXFdUVFhcXF1dXWBhZGZoamttamBWTEE0LSopKiooKCkoJyYmJiYmJSUlJSUlJCQkJCMiIyMjIyIkIyMkJSYmJiYmJycnKCgqKiorLC4tLS0tLy8wMDAxMjQ3PD9ES1BUVllfYmdqbW9xcnZ1eXh3dHFtaWVkZGRkY2NiX1lWUUZBOTIsLCwsLCwtLS0tLCwuLi0tLS0uLi0sLS0tLSsqKigpKSkpKSkpLDI3P05daXF0dXV0dXZ3eXl3cGdcUUlHR0hFR0VDPTc0NDQ5QU9fa3mAhIWDgYCBg4SDfndrWkg5LiotMDQ6PkNKUVhfaHF4eHl2cW9oXE9EOTAqKSkpKSkqKioqKywtLS4uLi8vMTAzO1JkVFRHTk5SUVpndHp8enp5dnZ2dnRxbmdcT0Y+Ojc2NjU1NTMxMTAwMDAwMTM1Njc6PUFDR0pNT1JTVlhZYGJoam5zeH2BhIaKi4mKiYiEg4KBf3x5dnBoY1xYVldXVllbXWFiY2VlZ2prbG5ucHFyc3NxcXJzc3JycnF0cnJxbmplX1hRSkI8NjU1MzIwMjdAS1ZhbHN2d3d2en2BhYiLi4uKiYiIiImKioaFgHlvaGRiYF9eX2JnZmpucnFzc3N0dXh4eHp3dXJsZmFdXV1gZWpyeX+FiYuMi4qKi4qMioiCfHdxbXB1eXt7eHd2dnZ4eHd3eXh1dHBvcHJzdTU1NTU0NDQ0MzM0MzQ0NDQ1NTU1NTU2NjY2Njc5Ozs7Ozw8PD0/Pj4/Pz8/QEFAQEBAPz09PT09PDs8PDo6Ozs6Ojo6Ojo5OTg3NzY2NTU0MzMzMzE0NTY2NTMzMDAwMjlASFFZXWJlZ2VmYl9ZVE9IRkZGSEtMUFFUWVxhZmttcG5sZVlMPjEsKysrKikpKCgnJiYmJiUlJSUlJSQkIiIiIyMjIyMiJCQkJCUmJiYmJicnKCgoKioqKywuLS0tLS8vMDAxMjQ5PEFGS1BVWVxjZ2lubnJ0dnh6e3x7d3RybWpnZmRjY2JgXllWT0hAODItLCwsLCwsLS0tLS0tLi4tLS0tLi4uLi0tLi4uLCsqKSkpKSkpKSwvNT5LWWVuc3V1dHV2d3l5eHRqX1VNSEZHRkVDQDo1MTAyND1KWmd2foSGhIGAgIGCgoB5cWFOPjMwMTM5PkJITlNaX2hxdnh5eHNuaFxMPjQtKCkqKSkpKiorKyssLS0uLi4vLzAxND1UTlFPS1FMQk1danZ8fHt5eHZ2dnZ0cW5oX1JGPjo3NjY1NTMzMTExMTAwMDAyNDY3Oj1AQkVISk1QU1VZW15gZWlscnh+goeKi4uKh4eFg4KBgH57d3RwamReXVhaW1tdYGJkZWlpbGxucHFxcnJ2dnZ2dHRzdHNycnJ0dXR0dXNva2ZeWFBGQDs4NjUzMjM4QEtWYWxzdnd2eHt+goaIi4uLiomIiIiJioqHhH94b2hlY2BfX2BjZWZqbnJzdXR0dXZ3eXl5d3VxbGVeXV1eYGZudnyCiIuMjIqLioqLi4mHgXx3cGxvc3l7e3h4d3Z2eHh3d3h4dXRxcG9xc3U2NjU1NDQ0NDQ0NDQ1NTU1NTU1NTY2NTU2Njg5OTo6Ojs7Oz09PT09Pz8/Pz8/Pz8/Pz4+PDs8PD07PTs7Ozo6Ojo6Ojk5ODg3NjU0NTQzMjExLy4uMDExMC0tLiwrLC41OEFKUVlcXWFhYVxVTUM6NTU2ODc4OjtBRktRWWNqbHJ2dG1jVUo6MS0uLCsqKSknJiYmJiYmJiUlJSQkJCMjIiIjIyMjIyMjIyQlJSUmJicnJygoKCoqKywsLS0tLS4vMDAxMzQ4P0JITlFZXWFjZmptcnN2d3p8fHl6enZybmxqZWRkYmJhXVlSTUlBOjMtKywsLCwtLS0tLS0uLi4uLi4uLi8vLi8wMTIyMTAtLSopKSkpKSksLzM7SVdjbXJ1dHR0dnZ4e3d1b2VXTUlHRkVDQD03Mi0sLjI4RVVicXyChYOBgYCAgoJ/e3ZqWUg6Nzc4PkJHS09TWmJqcXd7eXh0bmhdTT4zLCkpKSkqKioqLCwqLC4uLi4wLzAwMjNPUllcUlBSVEtBW2t1enx6eXd2d3d2dXJtZ15RRj45NzY2NTQzMjIyMTEwMDExMTM0NTo9PkFER0lMUFNVV1leX2NmanF3foOHiYuLioiFhIKBgIB9e3h0b2plYV9fXV5hYmRlaGlqa25wcnR1dnd2eHh3dnZ2dHRycnJzdHV2dnd1dHJtaWBcU0hBOjc0MzEyNkBMV2JsdHh3dnh6f4KGio2Mi4mIiIiJioqKiIN+d29pYmBfXmBiZGdobHBydHR1dXd5enp5end0bmljXl1dX2NocXh/hIiMjIyKjIuLjIuJhX95cm1rb3R4enp3dnV2dnh4eHZ4eXZ1cnBxdXR0NjY1NTQ0NDQ0NDQ0NTU1NTU1NTU2NjY2ODg5OTo6Ojo7Ozs9PT0+Pj8/Pz8/Pz4+Pj49PTw7Ozs8PDw7Ojo6Ojo6Ojo5OTg4NjY0NDQ0MjIxMS8uLi4uLiwsKywrKywuMDQ6RElOUlZZWVhSST40MC4uLSwrLC4wMjc/R1BaY2pxdXdza2FVSDw3NTEvKykoJiYmJiYmJiYlJSUkJCQjIyIiIyMjIyMjIyMkJSUlJSYnJycoKCkqKissLS0tLS4vLzAyMzU4PURLTlNbXmNmaGxub3R3eHp8e315eHdzcGxpaGVjYmBdWlhSS0Y/OTItKyssLCwsLS0tLS0tLi4vLy4uLi4vLy8wMTI0NDQzLi0sKyoqKSkpLC0yOkZTYWtzdXR0dHV1d3l6eG9lXVFLR0ZEQj46NTAsKiowNkFSX215gYWFgoCAgIKEgn53b2FTQzw7PkJHS05TV1xkanF3e3p5dnFqXk8/MywqKCkpKioqKiwsLC0sLC4uLjAxMTIzP2JvY1JKS0hQU2FsdXp8enl3dnd3dnVybmheUUY+OTc2NjU0MzIyMjExMDAxMTEzNDU3Oj0+Q0VHS01QU1dXW1xfZGpweH+DiImKioiGhIKBf4B+fXp4dG9pZWFhX2BhYWNkZmlpa21tbnF0d3Z4eHp6eXh4eHV0cnJyc3V2eXl6enl2c3BoYlpRSkE7ODY1MzhATFlkbnR3eXh6e4CDh4uOjoyKiYqJioqKiYiDfnduZ2JiYWBfYWRnaW1xdHR0dXV3eXt7eXh2cm1mYV5dXWBjanR8gYaLjIyLioyMjYyLiYV/enFsbG90eHp6d3Z1dnd4eHh2eHl4dXJwcnZ2dTY1NTU0NDQ0NTU1NTU1NTU1NTU1NTU3Nzg4Ojo6Ozs7PDw9PT48PT8/Pz4+Pj4+Pj49PT07Ozs7Ojo7Ojo5Ojo5Ojs5ODg5NzY1NTQzMjExMDAvLy4uLSwrKysrKysqKisvNTtBR0xMT05KQzkzLSopKSoqKioqKisuNDxGT1pjbXJ3dXNqYFJNRD06NTMtKigmJiYmJycmJiUkIyQkIyIjIiMjIyMjJCQkJCQkJCUlJiYnJygpKSkrLC0tLi4vLy8wMjU4PEFKUFRbX2Nnam1wcnN1d3d6fHx5eHdxb25rZ2RgYl5bWFNPS0Q9NjEuLSwsLCwtLS0tLi0uLi8vLi8uLi4uLy8wMjI0NDY1NDAvLS0sLCopKSosMDlCUFxncHR0dHR0dHZ4enlxaV9WTEdGQ0A8ODMuKygpLjU/TFppdoGFhYOAgH+Cg4SCfXRrW0xDQUNHSk5RU1ZcY2lyd3t6endxaV5QQTQuKioqKioqKyssLC4uLi4vLy4uMDAyMk1uYUFLSEpBTVVgbXZ8fHt4dnZ3d3Z2dG9oXlFHPzo4NTU1NTQ0MTEyMjAwMTExMzM1NTY7PkFFRUhKTVBUVldcXWJob3d9g4aIiYiFg4KBgH5+fXt5dnJtaGRiYmNiYWNkZGZnaGtsbm9xc3Z4eHl6e315eXh1c3JycnN1d3t+fHx6fXx4cWtjWlJJQTo2NDQ4QU1YZG9zdnp5eX6BhYiNjo6Mi4qLi4uLi4qIhX93bWZiXl1cXV9jZmlucnN0dXV1dnh5eXp3dHBsZF9dXl5jZ293fIWKjI2MioqMjI2NjImEf3dwa2lwdXd5eXd3d3d4d3d4dnh6eXdzb3BydXU2NTU1NDQzMzU1NTU1NTQ0NDQ2NjY2ODg4OTo6Ojs7Ozw8PDw+PT4/Pz8+Pj09PT09PDw8Ojo6Ojw4Ojo7OTk5ODk5OTg4NzY1NTQ0MjIwLy4uLi4tLSwrKioqKioqKSkqKi00Oj1AQ0FAOjQsKyopKioqKikpKSkpLC4yO0dQW2VsdXZ0cWlhWlJPSkVAOjMsKCcnKisrKigmJSQkJCMiIiMjIyMjIyQkJCQkJCQlJSYmJycoKSkqKywtLS4vMDAwMTQ4O0JHTVRaYGRla25xcXR3d3h5e3l2dHNwbWtoaGRiX11YVVJNR0I7NTEtLS0sLCwsLS0tLS4uLi4vLy8uMDAwMC8vMTEzNTQ1NjUyMC4tLCwsKiosLTE4Qk1aZW5zdXR0dHR2eHl3cmpfVkxHRUI+OTUxLSkoKSwzOkZWZHJ9gYSDgH9/gIGEhH97cWJVTUhJS01PUVNYXGNncHR2d3d3c21iU0U+OywqKysqKisrLS0uLi4uLi8uLjAyNDZWY0pCSkdLSUhXYG12fHx7end3eHh3dnRvaF9SSEA6ODU1NTU0NDQ0MjIwMTExMTMzMzU2ODs+QURGSUtOUVNVWFxiaHB3fYOIiIiGhYKBgH9+fXt8eXRwbGdjYmNjY2NgY2RlZmhpam1vcHFydHd5e3x8enp4dXNycnJzdnl7fn1+gIGBfHlya2RaUkg/NzI0OEFNWmZvdnh5eXt/gYWIjo+OjIuKi4uLi4uKiIV/d25nYl5cW11fYmVqb3JzdnZ1dnh6fHt4d3NuaGFeXFxeYmhwd4CGi42NjIuKi4yLioyJg350bGpqb3R3eXl3d3d2d3Z2d3h6e3l3dHN0dXZ3NTU2Njc3NTU1NTU2NzY2Njc3Nzc3Nzg4Ojo6Ojo7Ozs9PTw9PT0+Pj4+PT08PDw8PDw7Ozs7Ozs5OTw7Ojo4ODg3Nzc2NTU1NTUyMjMvLy8uLC0tLS0rKykpKSkqKSgoKSgpLDE1Njk4NDAsKigoKCoqKiopKSkpKSkrLTM5RVBbZXF1dnVybGdiXllRTUY+ODAsLTIzMzIyLSclJCQjIyMjIyMjIyMjJCQlJSUlJScnJigoKSkqKywtLS0uLy8wMTQ3Oj9GTVNaXmRnamxucHFydnd3d3Vzcm9ta2lmYl9cW1hUUk5IRD83MzAtLS0tLCwtLS0tLi4vLS4wLy4uLzExMTEyMjIyNDQ2NzY0MS8tLS0tKysrKy4xNT5KVWRscnR0c3Nzdnd4d3NsYVdMRkJBPDgzLywpJycqMjhDUmFveoCDgoKAf3+AhIWCfXdsX1VPTk9OUVJVWFtgZmpyd3d3d3RtYlRJTkotKSkpKiorKy0tLS4uLi8vLy8wMTZRbEc3PDk/SUlKVmFtd3t8e3l4d3l4d3Z1cWxhUkdAPDk2NjU1NDMzMzMzMTExMTMzNDQzNjg5PD5BRUdKTU5QUlRbYGhxeX6Dh4iIh4aEgH9/fXx6eXZybmllYmFgYWFhYWFiYGFiZGVnZ2hqbnJzdXh6enp4dnRycnJydHZ3eXt6foKEhIJ+e3FrYlpRRTw1NDlEUFtmcHd5eXl6foKGiY+Qj4yMi4qKjIyLioqHgXlwamVcW1paXGBkam5zdXV2dnh5ent7eHZxa2RfW1lZWmBoc3uCiIyOi4uLjIuLjYyMiYN9c2toam5zeHl4d3d1dXZ3eHZ4e3t6d3N0dXV2eDY2NjY3NzU1NjY2Njc2NjY3Nzc3Nzc4ODo6Ojo6Ozw8PT08PT09Pj4+Pj09PDw8PDs7Ojo6Ojo6Ojk5OTk5ODg4Nzc3NjU1NTU0MzIxMC8uLiwsLCwsKysqKSkpKSkoKCkpKCosLTAwLSopKSgoKSkpKSkpKCgpKSkpKistMjhDUFxpcHV3dXRwbGxmYVtUS0U/Ojs/QEE/PzcxLCUkIyMjIyMjIyMjIyQkJSUlJSUnJycoKCoqKissLS4uLi8vMDM3Oj5DSlBXXmNma2xtb3BzdHR0c3JwbmtpZmRhXVxaWFNQTUlEQDs2Mi8uLS0tLSwsLS0tLS4uLi8wLy8vLzAxMTExMjIyMjMzNTY1Mi8vLi4tLSwsLCwtMDM7R1NganJ0c3Jzc3R2d3dzbGJYTkZAPzk1MCwsKScnKS42P0xbaXV9goKCgH9+gYOEg4B9c2ddVU9PUFVVV1pcXmNnbHJ2dnZza19SUEdCLyoqKioqKystLS0tLi4vLy8vLzI1YYZdOThJUU9PS1VjbHh9fn15eHh4eHp4dXFsYlRHQDw5NjY1NTQzMzMzMzIyNDY4ODc3NTU2Nzk8PkFERkhKTE5QWF5nb3Z+g4eIiIWEgoB+fn17eXd2c21nZGFgXl1eXVxaW1pbWlxdYGNiZGZpbXF1dnd3dHNxcXJycnR2dnh6eHx+gYOEgn56cmphWU9FPDk7RlFdaHF4enp6fYCEh4qPkI+MjIuKioyMi4qIhYJ6dGxmXlhXWVtiaG1ydHR0dXZ4eXp7eXV0bmhgW1pZWFtia3R8g4iMjIuKioqJi4yNi4iCe3JsaWtuc3l5eHd2d3Z1dHV2eHt7end0c3V2dXc3Nzc1Nzc1NTc3NjY3NjU1ODg2Nzg4OTk4OTo6OTw9PTs+Pj88PD09PT08PD09Ozs6OTk5OTk5OTk5OTg4ODk4OTY1NTU1MzMyMzIyLy4uLC0sLCsrKioqKiopKSgoJygoJyYnKCgpKScnKCgnKCkpKCcpKSgoKCgoKCgoKi40PUdTXmhyd3l2dXVzcG5oYl1WUU5PUFFTU09IQTcsJSMhIiIkJCMjIyQlJSUlJiYnJycnJygpKiwsLC0uLjAxMTI1OD1CSU9WXGFmaWttb3BydXRycW5paWZmY11aWVZUUExKR0VCPjgyMC4uLi0tLS0tLS0tLS0tLS0uMDAxMTExMzM0NDIyMjExMzQ0MjIwMDAwLi0sLi0tLS8zOUVQX2dxdHNzcnN0dnZ1c25kWU5FQT04NC4rKyknJykuMzpHV2dweoKDg3+AfX6Bg4SDgXpvZVxWVFNVVlhaWVtcY2lvc3Z1dG1hWFM3PjcrLCwrKywsKywtLS4uLzAwMDEzNlV3Z0lKSVRUUU9ZZHB4fX18eXl4enl6eXlzbGNVR0A8OTY2NDQ0MzIyMTM0Njk9PD08PDs4NjU3OTw9QENERklKUFVdZ3J5f4OHh4eFg4GAfn17enh2dnBsZWJeXFlZVVZVVFNTU1NSVFRVWFpdYWZrbm5xcXFycnJycnJyc3NzdXh4en1/goSCgHhyaWJWS0I+P0pTX2pxeXt7en6AhYmMkJCPjoyLi4uMjIyMjIiDfXdwZ2BdWVxeY2pwc3V0dHV3eHp7endzcWpkXVlXV1dcZG13foaLjIyLi4qKiouLjIuIgntwa2lrbXN5eXh3dXV2dnd3dnd7e3t2dHN2dXR0Nzc2Nzc3NjY3Nzc3NjY2Njc3Nzc4ODk5Ojk7Ozo7Ozs6Ozs8Pj49PT09PDw7Ozs7OTk5OTk5OTk4ODg4ODg4ODc3NjY0NDIyMTIwLy4uLSssLCsrKyoqKSoqKSkoKCcoKCcmJygoJycnJycnJygpKSgnKSkoKCgoJycoKCgrLjY9SFJdaHJ2eXh4d3V0cW5oZmFgYWNkZmZkW1NIOiskJCIiIyMjIyMkJSUlJSYmJycnJygpKSosLCwtLi8xMTE0NzpBRk1TWWBkZ2psbnBxc3NvbGhmY2BcXFlVUk5LSEVFQT48NzUwLy4tLi4tLS0tLS0tLS0tLS0uMDExMTEyMTMzNDQ0MzMyMjQ1MjIyMTExMC8tLi4uLi0vMjhDUFxnb3Jzc3JycnR0dHJtZFlORUA8NzIuKykoJycnKzE3QVFgbHeAg4OAf31+gYOEhYN+dWhgWVdWV1dXV1VXWF5mbXR1dXJoWlhMN0A6LCwsKyssLCssLC0uLi8wMDAyMj5YX1xUV0NATlVVWGZweH19fHl5eHp7enl5c2xjVUlAOjg2NjQ0NDMzMzM4OTxDRkVGRURCPjo3Nzc4Ozw9QENHSlBZYGlyeX+FiIeGg4GAgH57enp4dnRuaWNfWVRTUE5NTEpJSktMTExMTVBRVFhdZWhrbnFwcXFxcHJycnJycXFxcnV2en6AgoJ8eHBnW1RJQUJLVGBrcnd5eXt9gIWJjJCQj46Mi4uLjIyMi4uJhX97dG1lYF5eYWZrcHN1dHV3eHp5enh1cm5mYFpWV1VYXWVvd3+IioyNi4uKiouMjIuKhoF3b2hnam1zeXl4d3Z1dnZ2dnd5e3t6dnJydHRzczc3Njg5ODg4Njk4ODc3Nzc2Njc4Nzg6Ojo6Ozs7Ozw8PDw8PDw8PD08PDw8PDw6Ojk5ODg5OTg4ODg4ODc3Nzc1NTU1MjExMTExMTAtLS0sKyoqKikpKSkpKSgoJycnJygnJycnJycnJiYnJycnKCgoKCkpKSknJycnKCgnKCwyND5HUVtjam9zdnZ1dHRzc29wb3FydXZ2cmplV0k5KSIhISIiJCQkJSQkJSUmJiYmJygpKissLCwsLS8wMTIzNjk9Q0lPVlxhZmlsbm9wc3Fsa2ZiXFpWUlBMSkhHQ0E9Ojk4NDIvLi4uLi0tLS0tLS4uLi4tLS0tMDAwMTIyMzM1NTU1NTU0NDU1NDQzMjIyMTAvLy8vLS4uMDI4Qk1YZW9zcnFxcXFzdHNxbWVaT0U+OzYwLCcnKCgnKSsuNT9MWmZ0fIOCgH1+f4GDhYWGgHluZl1ZWFhXVVJSUFZcYmpydnVyYVhZQDY8MiwrLCwtLS0tLS0tLi4vMDEwMDM7W2ZeWmBbO0hUWFZocHp9fXt5eHh5eXl5enRtY1VKQDk2NTQ1NTQzMjQ2Oz9FSk5QUFJPS0Q+OTY3Nzc5PD5BRktSWmNsc3l/hYeGhoSAf399fHx6eHVxbWdfWVNQTUdGRkVERUREREVGR0dJSk1SWV5kZ2psb3FycnNycnJvbmtrbG1tb3F2fH+BgHt0bGJbUEpGTldibHN5e3t9f4KGio6QkI+OjYyLi4yLi4uMioWCfXZxamZlZWZtcHN0dXV3eHl5eXp3c25oYl1XUlNTWF1nb3mCiYuMi4uLi4uLjYyMiYaBd2xlZmlvdXl5d3Z1dXZ2dnZ1d3p6enZ0cnFxcXA4ODg4OTk5OTc6ODg5OTc3NjY4ODc4Ojo6Ojs7Ozs8PDw8PDw8PDw8PDw8PDo6Ojo4ODg4ODg3Nzc3ODc1Nzc0NTU1NTExMTEwMC4tLSwsLCsqKikpKCgnKCgnJyYmJiYnJicnJycnJyYmJycnJygoKCgoKCcnJycnJygoJygqKzA1PUdOVF1jZmlsbnFydHV3eHp8foGFhX96c2ZWRjUoISEiIiQkJCUkJCUlJiYmJigpKiksLS0tLS8wMDIzNTg7QUZMU1lgZWhqbG1ub3FuaGNcWVRQTkhEQT8+PDs4NzY0MjAwLy8vLi4tLS0tLS0uLi4uMDAwMDAxMTEyMzM0NTU1NTU1NTU2NjQ0NDMyMjAwMC8wLy0vLjAyOEBMVmNvcnJxcm9wcXJxcW1lWk9FPTg0LysoKCkoKCkrLTM6RVZkcHqAgoB9fH1/goaHhoB7cWlgW1hXVVFRT0xPVF5pcnV0dmJRSz84ODIuLCwtLS0tLS0tLS4vLzAwMDEyNU1rX1dkVjg7UFdXZHF6fX17eXh4eXl5e3l0bWNVSkA6Nzc1NTU1NDQ1OUBHTVNYW1xbWVVOQjs4NTY2Nzo+QEZPVl1mbnZ9goaHhoSDgH5+fnx8enh1cWtlXlRMR0NBQkJBQUJBQUFBQkNDREZLUFddYGNqbXFwcHFxcnR0cGxpZWViYmZobnR6f4B9eW9nX1dQT1FZYmx0ent7fX+EiImOkJCPjo2Mi4uMjYyLi4mIg356dXFra2prcHN1dXZ2eHh5enp5dXJsZl5VUlBSUlddaHJ8hImMjIuLi4uLi42MjIqFfndtZWNqcHZ5eXd1dXV2dnZ2dXZ4eHh2c3JwcXBuOTk5OTk5OTk5OTg4ODg3Nzg3Nzc4OTo6Ojo6Ojs8PDw8PDw8PT08Ozw8Ozo6Ojg4Nzc3Njc3Nzc3NzY2NzU0NjU0NTMxMTIwMC8uLSwrKysqKikpJycnJyYmKCgoKCkpJiUlJicnJycmJicnJycnJycnJycnJycnJycmKCcnJycpKzQ7QkhOUlhaXWJkaG51d32AhIaIi4iGgnxyZVVHNSYjISIkJCQkJCQlJSUlJygqKioqLC0uLi8wMTEzNTg7PUJHTlZcYmVpa2xvb29taWFcVE5IRUE/PTw5NjUzNDMyMS8vLy8tLS0tLi4uLi4uLi4uLi8vMDAxMTIzMzM0NTU1NjY3NzU1NjY1NTQ0MzMyMjAwMTEuLi8xMzc+SlRga3Bxcm9vbnBxcHBtZVtQQzs1MS0qJycoKSgpKiwvN0JQX2x3f4KBfn19f4ODhYWBfnVtY15aVVFNSUdHSFBbanF2dGtSQktORj42MCwsLS0sLC0tLS0vMC8vMTAvMjVIW1tbaVs3NlBUVmRyen9+enl5eXl6enh4c21kVUpAOjc1NTY0NDQ2O0BIUFheYmdoZmJfVktCOTY0MzU4QEZLU1pka3J5gISHiIWEgoB/fXx+fXp4dnJqYlpNR0M+Pz4+QD9AQEA/Pz9BQENDR05UW2FmaW1vcXJxcXNzcXBqZV1ZVVZaXWNrc3d6fXtybGRbWFVZXmdvdXp9fX6BhIeKjpGRkI+NjIyMjo2LioeFgXx7e3h4dHBxcXR1dnZ2d3d5e3p5d3RvaWNbVFBPT1BVXGdxfoWLjI2Mi4uLi4yNjYyJhH5za2Zma3F3enl3dHV2dnZ1dXV2d3d3c3Fubm5wbjk5OTk5OTk5OTk4ODg4Nzc4ODc3ODk6Ojo6Ojo7PDw8PDw8PD09PDs6Ojo6OTk3NzY2NjY2NTY2NzY1NTU1NjU1NDMxMTEwLy8uLiwsKioqKikoJycnJyYmJicnJycoKCYlJSYnJycnJiYnJycnJycnJycnJycnJycnKCcnJyYmJSgqMDU5PENESEtPVFxkbnZ8gISHiYqKiYWDfG9jUkEuJCIjJCQkJCQkJSUmJicoKisrKy0tLi4vMDEzNDY3Oz9ESlFYXmRnamxvbm1taGBaUEpDQT06ODY1NDQzMTEyMDAvLy8vLS0tLS4uLi4uLi4uLi4vLzAwMTIzMzQ0NTU2Njc3Nzc3Nzc3NjY1NTMzMzIxMDAwLy8vMTM3PUhTX2pwc3Nwbm1ub3JvbGdcUUU6NC8rKSgnKCkoKSorLzU8Slpnc3yBgX58fHyAgoSEg354cGdfWVRQSEVDQ0dQWmZwdGZNPkRcXE0/NjAsLC0tLCwtLS0tLi8vLzAwLjI9UlleY2RUSVFRT1ZncXp+fnp5eXl5enp5d3NtZlhLQTo3NTU0MzQ0OD1FTlVeZmxxcnBsZV1QRTw2NTM4PEJLUFZgaG91fYGFhoeGg4GAf359fn58enZyamJWTUZBPz0+PT88Pj09Pjw9Pz4/Q0dOVFthZWlvcHBxcHFzcXFvaWNbUUpITVRaY2txdXp5dm9pYV1cXWJnb3Z7e3t/hIaIi4+Rj4+OjYyMjIyLiIeEgXp5enp7e3p4dnh3d3d3d3h5eHt6eXdzbWZfV1BQTkxPVV5pdH6GjY2NjIuLi4uMjY2MiYF6cmlmZmpxd3p4d3V1dnZ2dXV1dnd3dnJwbW5ta2o4ODg4OTk5OTk5ODc4ODc3ODg4ODk6Ojo6Ojo6Ozw8PDw8PDw8PDs6Ojo6Ojk4Nzc2NjY2NTQ1NTU1NjU2NjU1NTIxMTAwMC8uLSsrKiopKikpKSgnJiYlJiUlJSYmJSUmJSUmJycnJyYmJiYnJycnJycnJycnJiYmJigmJSUmJSUlJScqLzExMjM4QElQWWNqc3qAgoSFhYiGhoJ4b11MOCcjIyQkJCQkJCQlKCgoKikpKistLS8uMDAxMzU3OD1BR09VWmFlaGtub2xsamNcVElDPTk2NjU0NDQ0MzEyMjAwMDAwLy0tLS0tLi4uLy8uLi4uLy8xMTEyMzM0NDU1NjY3Nzc3Nzc3NzY2NTU0MzMzMDIxMTAwLy80ODtFUl5pcHJxbm1rbW5ycG1oXVFFOjMuKykoJigpKSorKi4yO0ZWZXF6gIJ+fHp7foGDhIN/enJqXFZQS0I/PT1ETVhmcGhJN0JeaWBRRDgwLS4tLSwsLi4tLS0uLzAuLzEzQV1dYmFVU1lYU1BZZHF7fn17eXh5enp6eXd0bmVXS0E7ODQ0NDQ0NjtBSlRdZm90eXl6c2pgVUc9NzQ3O0JKUFZfZm9zeoCDhoaFg4N/fn59fXx8fXt3cWhfVUpCPz48PDw9PD49Ozs8PT0/QERHTlZbYWdqbG5ub3FxcnJwbGdfV0tDPD9HUVlhaG11dXZxa2dkYmFkanJ5fX58f4KGiI2PkZCPjo2Mi4uLiYeDgH17e317fX19e3t6enp5eXh5enp8e3p1b2lhWlNOTEpMT1Vfa3aAh42NjIuLi4yMjY2OjImBenFoZGVqcnd6eHZ1dXV2dnZ2dXZ3d3dzb29sbGpoOTk5OTk5OTk5OTg3ODg3Nzg4ODg6Ojo6Ojo6Ojs8PDw8PDw8PDw7Ojo6OTk4Nzc3NjY2NjQ0NTU0NDU1MzMzNDUyMTEwMC4tLS0qKysqKCkpKSgoJiYnJyYlJSUmJiUlJiUlJicnJycmJiYmJycnJycnJycnJyYmJiYnJyUlJiUlJSQkJigpKSopKjA8Q0tUXWZscnZ5enyCg4aFfnRkUz8qISEkJCQkJCQlJigoKCkqKywsLS4uLzAwMTM2ODk+REpSWF1iZ2ptbm1tamRdVUxCOTg3NDQzMzMzMzMxMTEwMDAwMC8tLS0tLS4uLi8vLi4uLi8wMTEyMzMzNTU1NTc3ODg3Nzc3Nzc3NjU1NTQzMjIxMTAxMTAwNDg7Q05aaW9xcW5sbG9tcHFvZ15TRzsyLSopKCgpKSkrKyosMzlCUF9sdn1/f3x6ent+gYKCf3t2altTTEU/Ojk6QUtXYnBrTjlMam9jUkU5MC0uLi4tLS4uLi4tLi8wMDEyM0ZiaWJTTWpiUlVTV2Zye359e3l4eHl5eXp3dG5lV0tBOjc0NDMzNDY8Qk1WYmx1e3+AfXVsYlVJPDc3O0JIT1ZdZmxzeX+ChYaGg4GBf319fnx9fn17d3FoX1RKQz89PDs7Ozw8Ozs7PDw8PD1CR05WW2Bma2ttcHFwcXJvbWplXFJKPzc2PUVQWGBmbHN3cm1paWZnaW10en1+f4GEh4mNj5GQj46NjIuLioiEgHt5d3N1d3x9f39/fnt7enp4eXp6fHt5dG1nXVZOSElISU9VYG13goqNjY2Mi4uMjI2NjIuHf3htZWJobHJ3eHl3dnZ2dnZ2dnV2d3d2c29taGhnZTo6Ojo6Ojo5OTk4Nzc3Nzc4ODg4Ojk5OTk5Ozs6Ojo6Ozs8PDw8Ojs6Ozk5ODg3NzY1NTU1NDU1NTQ0NDQzMzQzMjAxLy0tLSssKikoKCcnJiYnJicmJSQlJSUlJSUlJSYmJSUmJicnJiYmJiYmJicmJicnJycnJyYmJScmJiYmJCQlJSUlJSYlJicrMDU/Rk5UWmFlaWxweH6FhoR5aVhELSIkIyMjIyQlJicoKSkqKystLC0uLi8wMTI0Njk+QUlSVlxiZmhrbm5ubWdgWFBGOzc0NDQ0NDMzMzMyMTIxMDAwMDAvLi4uLi0uLS0vLy4uMDAxMTExMzM0NTU1NTc5OTk5OTk5OTg4Nzc2NjU1NDQyMjExMTExMTQ4O0BMV2RtcHBvbmttbm5xb2xkXE5BNS0pKSopKikpKiorLDE4PUtaaHR7fn59enl5fH6BgIB9d2pfUkhBPDU1Nz9JVGBqcUo/YXVxZ1ZHPDQvLiwsLi4uLi0tLi8wMDAwMztaentlSE5cXEhJUllkcXp/f3x5eHZ4eHl5eHVvZVhKQDg0MzMyMTM3PEVQWmRweX+Eg351bWFVST88PkFIUFdfZW1yeH2DhYeHhoJ/fn59fX5+fn5/fHdxal9TSUA7PDs6OTk5PDw7Ozs7PDk9QUdPVl1jaWxub29vb25vbm1nYltPRzozMDQ7RU5WYGZucXNvamprbG9ydXt9fn+ChYiKjo+Qj4+OjIqLioqIg3x2cm5pbHR4fX6Af39/fHt7e3t7e317eHFrZFxUTEhGRklNV2RwfIWLjo6Li4uLjIyNjYyIhH51a2NhZ2xyd3l5d3V1dXV1dnR2d3Z2dXFua2poZWI6Ojo6Ozs6OTk5ODc3Nzc3ODg4ODk6OTk6Ojs7Ozs6Ojs7Ozs7Ozo5Ojg3NzY2NzY1NTU0NDQ1NDQ0NDQ0MzIyMjEvMC8uLCwsKigoKCgnJycmJyYnJiQkJSUlJSUlJSUkJCUlJiYmJiYmJiYmJiYnJiYnJycnJycmJiUnJiYmJiQkJSUlJSUkJSQmJiYqMDlARUpNTlNaYm55goaEeW1cRC0kIyMjIyMkJSYnKCkpKioqLC0tLS8wLzEzNjk8QkdMVFleZWdqbG5ubWdjXFVKQjs3NDQ0NDQzMzMzMjEyMTAwMDAwLy4uLi4tLS0tLi4uLjAwMTExMjMzNDU1NTY3OTk5OTo6Ojo5ODg3NzY2NTQ0MjIyMjExMTM0ODtAS1ZhbHBwb25sbm5ucHBtZ19SQzYuKioqKSoqKioqKSovNjtJWGVyeX5/fXp4eHp9f4F/fHdsX1JGPTYxNDg9RlJea2Q9Qmd2b2ZYSj01LiwrKywuLi4tLS4vLy4uLzBDbnt2Xk9OWVQ+TlljZXJ7fn17eXh2eHl6eXh1b2RXSkA4NDMxMTI0OEBIUFxnc3yChIN+dWxgVEhBQUZJT1dbY2pweH2DhomJh4SCf35+fXt8fn5+fnt3cWheUEhAOzo5OTk5OTo6OTk5OTk6PUFIUFleZGlsbm9vb25ub21qZGFXT0I2MS4vMztGUVtjam5xcm9vbnBydHd7fn5/gIOHjI6PkI+OjYqKi4qJhoF6cmtlYmVtcnh8foCAf3x8e3t7e3t9e3ZuaWFYT0lDREVHTVhmcn2HjI6Oi4uKjIyMjY2MiYN8cWpiYmdsdHl5eXd1dXV1dXV1d3d2dHNwbWtpZmViOzs7Ozs7Ozs6Ojk4ODc4ODg4ODg6ODk5OTo6Ojo5Ojo6OTk5Ozo4ODg4Nzc3NjU0NTQ0NDU0NDQyMzQ0NDEyMjAvLzAuLSsrKiopKCgoKCgnJicmJSYmJSYmJSUlJSUlJCQkJSYmJycnJyYmJSUmJyUlJiYmJiYmJiYmJiYmJiYlJSUlJCQlJSQkJCQkJCcsMTU4Oz1DS1dpdoCFhHpuW0MsIyMkJCQkJCUmJygpKSosLCwtLS0vMC8xMzY6PkRLUVhcYWZqampubWlkYFhPRj45NjU0NTQ0NDQ0NDMzMzMyMTAwMC8vLy4tLS0tLS4uLjAwMDExMzM0NDU1Njc3ODk5ODg5OTk5OTg4Nzc2NjU0NDMzMjIzMjIxMzY9QklUX2lxcnBua21vb3BycGtjV0k8MCsrKykpKisrLCstLzY7R1Zibnd9f357eHh6fX6AgH55b2JTRDgyMDM2PEVRXWphREZvd3JoXUxANS8tLS0sLC0tLi4uLi0uMDI8X2tsclhHTk5aU1FSZ2p0fH5+e3l4d3d5enh3dW9nWUpAODQyMTEyNDk9R1Jfand/g4SDfnVrYFRMR0VJUFZaYGdudnyBh4qKiIaBgX9+fnx8fHx/f357d3FpXlBGPzk4Njg1Nzc3Nzc4Nzc2ODxCR1FaX2dpbW5tbW5tbW5qZ2NbUkg9Ni4rLTA1PUZTXGVsb3FxcXF0dXh6fH59gIOFiYqOj46OjYyLiouKiIN+d2xhXFleZmtzeX6Af359fHx8fXx8fHlzbGZcU0pFQkFCRk9baHR/iY6Oi4uLi4uMjI2MioaAe3BmYWNma3N6eXh3dXR0dnZ2dnZ2dXNwbmpoZ2VhXjs7Ozs6Ojs7Ojo5ODc4ODg4ODg4OTk5OTk6Ojs5Ojs7OTk5OTo4Nzc3NTY2NjY0MzQ0NjU0NDQzMjM0NDQxMTEvLi0uLSwrKyoqKSgoJygoJyYmJiUmJiUmJiUlJSUlJSQkJCUmJicnJycmJiUlJicmJiYmJiYmJiYmJiYmJiYmJSUlJSQkJCQjIyMjIiIiJCYnLC4vNkJRZHN/hIN5bFg+KSMjJCQkJCQlJicoKSkqLCwsLS0uMDAxMzY5P0RKTlVbX2ZmZ2tubmxoY1pTSkM8NjY1NTU0NDQ0NDQzMzMzMjEwMDAwLy8uLS0tLS0uLi4wMDAxMTMzMzU1NTU2Nzg5OTk5OTk5OTk4NzY3NjY1NTQzMzIyMjMxMjQ3PEFJUl1mbnJwbmxub29wcnJsZltNPzQsLCkrKSorKysqLDA1PEZVYWx2fX9+e3h4eXx9f39+e3JlU0I3MjAzNjpET1tnW0VSdXRval9OQTYvLSsrKywtLS4uLi4uLjAzS2pqdWxMR0ZITUxOUm9uc3t9fnt5eHd3d3l4d3RuZ1lKQDg0MjEyMjM5PkhVYm15gISFgn51a2BUTEhNU1hZXGRtdHuBhYmJioeEgIB+fn58fH17f39+e3ZwZ1xQRD07NzY2Njc3Nzc3Njc3Njc+Q0pTWV9mam1vbW5tbW5ta2ZfWVBFOjIuKystMThBTFZham10dHR1eHl7fX6BgYCChIiMjY2NjYyMi4qLioeBe3NnW1NQWGBrcXZ6fn9+fX19fX18fHp3cmtjWlFHQj8/Q0hRXWp3gomNjYuMi4uLjIyNjIqGgHhuZl9iZ2x0eHl4dnR0dHV1dXV1dXVzcG5qaGZkYV07Ozs6Ojo7Ozo5OTg3Nzg4ODg5OTk4OTk5Ozs7Ojo6Ojk5OTg4ODc3NjU1NTU0NTU1NTQ0MzMzMzIzNTU0MTAwLi4uLiwrKysqKiknJycnJyYmJiUmJSUkJCUlJSQkJCQkJSYlJSYnKScmJiYnJycnJycnJyYmJycnJyYmJSUlJSMlJCQkJCMjIyMiIiMiJCQjJSYnLDQ+TmBxfYSCeWtXPCcjIyQkJCQlJicoKSoqKysrLCwuMTIyNDk9QkZLUVRbYWRnaGltbmxpZmBXTkc/ODc2NjU0NDQ0NDQ0MjIyMjExMDAwMC8vLy4tLS0tLS0uMDAwMTEyMzQ1NTU1Nzc3OTk5OTo6OTk5OTg4ODg2NjU1NDQzMzMzMjQ1OD1CSVFaY2twcW9tbW9vcXJ2cWpiUUM2LikpKyorKiosKy4zOj9HU2Bqc3yAf315eXh7fH6AgHtzZ1dGOjMxNDk6Qk5ZZVRLXnp0cWtgUEM3MCwsLCssLCwtLS0tLjAvM1JxendfRkVMPj5MVVVlaXF8f357eXh3d3h4eXh1b2ZZSkA5NDEyMTE0O0FJV2NveoSHh4R/eG1gVVFRU1ZYW2FncHd9hYiJiYiFg39+fn59e3t9fn9+fXx1cGZbT0I8ODY0NDU2NzY2NTU0NDU3O0JLU1pgZ2psbG1tbGttbGljXVZNQTgvLCoqLDA2P0pUXmltc3Z3d3p7fn6AgICBgoWIi42NjYyMjIuLioqHgHpwZVhLSlBcZGtyd3t9fn5+fX19e3t4dW9nXlhNRD89PUBHU19se4SLjY6Li4uKjIyMjYuJhX91bGRgY2hudHh4d3Rzc3Nzc3N1dXR0cXBuamZlY2BbOzs6Ozo6Ozs6OTg3Nzc4ODg4ODg4OTk5ODk7Ozo6OTk6Ojg5ODg2NjQ0NTU1NDQ0NDQzMzMzMjIyMjIyMjEvLy0tLCwrKioqKikoJycnJycmJSYlJiUkJCQlJSUkJCQkJCUlJygrKy0tKygnKCcnJycnJyclJSYmJiYkJCQlJSUlJCQkJCQjIyMjIiIjIiMjIyQlJisxPk1fcH2EgnlrVz4nIyMlJSQkJSYnKCkqKissLC0uLzAyNTk/REhNUVZbXWRlaWprampqaWNbU0pBOTc1NjY1NDQ0NDQ0NDIyMjIyMjEvMDAwLi0tLS0tLS0tLjAwMDExMjM0NTY2NTc3Nzg5OTk6Ojk5OTk5OTc3NjY1NTQ0MzMzMzM0Njo+Q0lRW2RrcHFvbm5vcXN0dnRuZlpKPDAqKioqKyorLC8yNjxCS1Rga3R8gIF+enh4e3x+gIB8dmxbSz01MDI1OkJNV2RQU2d2dXJtY1NEOzItLCwrLCwsLS0sLS0uMDhsenV1Yk5FRD5FUVFUZmZxfH99e3l4d3d4eHl4dG5lWEpAOTQwMS8xNTtDTVlmcn6Gh4eGgnxwZFlWVlhaXF1kaXJ4foWIiYmHg4F/fn5+fHx8fX5/fnx5dG9mW09DOjY0NDQ0NDU1NTQ0NDQ1NzxETVVcYmhrbGxtbWxraWlmYVtUSUAzMCspKSswNDpFUFxmbXJ2eXt8f4CBgoKCg4OFiYuOjo2MiomKioqIhn94bWNVSkpOV2FocHd6fX5+fX5+fnx7eXRsZV5SSEE8Oj5CS1djb3yGi4yNjIuMi4yNjYyKiIN8dWpiYGNobnR4d3V0dHNycnJzdHRzcXJvbWpmY2BdWzs6Ojs7Ozs7OTo4Nzc3ODg4Nzc3ODg4ODk6Ojo6Ojk4OTk4Nzc3NjY1NTQzMzMzMzQ0MzMzMzIyMTEwMC8vLi0sKyoqKysrKigoJycnJyYmJiUlJiUlJSQkJCQkIyQkJCQlJicsMDM0NDItKykoKSkpJiYmJSUkJCQkJCQjJSQkJiQjIyMjJCMkIyMiIiMiIiEgJCcpLzpKXG15gYV6a1hBKSIkIyQlJSYnKCkpKSorKiwuLTAyNTlBRUpOU1ZdX2NkZmhra2tramZfVk1EPjg2NTY1NTQ0NDMzMzMyMjIyMTEwLi4vMC4tLS0tLS0uLi4wMDAxMTEyMzQ2NjY3ODg5OTg5Ojo6Ojk5OTk3NzY2NjU1NTMzMzM1Njc6P0RJUVpjam9xcG9ucXJzdHZ1cWthUUI0KiorKywrLjAzNjtBRU1WYWx1fYGCgH56e3t8f4GAfnlvYU9BNzExNDhBTFdkTExqdnZxbGVWRjsyLSsrKissLC0tLC0sMDBJenJVS15dVFBXTE1RUGlpcn5/fXt6eXd5eXl5eHRuZlhKPzg0MTEvMjc/RlBbaHZ/hYeLiYZ/cmddWFhZXF1gZWxyeoCEiImJhoOAf359fnx+fn1+f4B8eXVvZVlNQTk1MjIyMzIyMzM0NDMzNDg9RU5WXWVqa21tbW5sbGtpZV5aUEU6MispKSosLzM4RU9bY2pyd3l9foCBgoOEhISEhomMjY2MjIqJiYmJhoV+dWpgVktHTVReaXJ4e31/f359f317endxbGRbT0Q9Ojo7QkxXZ3N/h4uMjIuLi4uLi4uKioiBfXNnYV5iZ290dnd1cm5xcXJyc3Nzc3JxbmxqZmFeW1k7Ojo7Ozs7Ozo5ODc3Nzg4Nzg3Nzg4ODg5Ojo6Ojk3Nzg4Nzc3NzY1NDQzMzMzMzMyMjIyMTExMTExMDAvLy4tLCsqKioqKikoKCcnJycmJiYlJSYlJCUkJCQkJCMkJCQlJCYnKzA1Oj05NzIyMTAwLiwoJiQkIyMkJCQkIyUkJCUjIyMjIyQjIyMiIyIjIiIiISIlKC85R1ZqeYGEfG5dSjEkJSMkJSUmJygpKSkqKywtLjAzNjpARktPU1hcX2FjZmpra2tqamljXFNKQjs2NDY1NTU0NDQzMzMzMzMzMzExMC8uLy8tLS0tLS0tLi4uMDAwMTExMjM0NTY3Nzg4OTk4OTo6Ojo6OTg4ODc3NjY1NTUzMzU1NjY4PEBFSVFYYWlwcnJwb3Fyc3R2dnRuZVdGOC4tLiwrLjE1NztAREpRWGBqc32Dg4F/fHt7en2CgoB7cmVVRDgyMTQ4QUlUY0tGaXZ2cmxmV0g9Mi0sLCorLCwtLS0tLTFEdHdtWjhPT01TV1FSUk9janN9gH17enl4d3l5eXh1bmVWST44NDMxMjU7QUlTXmx4gomKi4qGf3RoYFtbXF1dYmZscnZ8gYWGhoSCf39+fX18fHx9fn99enh0bmRaTkE5NTIxMTEyMjExMTExMTQ5PkdQWWBnam1tbW1tbGxraGNdV01CNy8qKSkpKy8zOkZPW2NpcHZ7foCDhoWGg4SEhoeKjI2NjIyKiYmJiYaFfXZsYFNLSk1UXmhwdnt9f39+fX18e3p2cGpiVktDPTo6O0JOWml1gYmLjIuMi4uLi4uLi4mGgHhwZWBeYmhudHZ2dHJwcXFxcXJycnJxcG1qZ2NhXlpYOzk7Ojo7Ozs6Ojg5ODc4Nzg4ODc3ODk5OTk5ODg4ODg3NzY2NjY1NTIyMjIxMTExMjIyMjEwMDAwLzAwLy8uLiwrKiopKSkpKSknJiUlJyclJSYmJSUlJCQkIyMlJSQkIyMkJisuMzc7Ozo2Nzc3NzY1LyolJCQkJCQkJCMjIyMiIyMjIyMiIiIiIiIiIiEhISEjJCktNkJSY3N+gn5zY1A4JyYkJCcnJygoKCoqKyssLi8yNT1DSE1RVFldX2JkaGtram1raGllXlZMRD85NzY2NTU2NjU1MzMzMzMzMjIxMS8vLy4uLS0tLS0tLS4uLzEwMDExMTIzNDU1Njc4ODk5ODk5OTk5OTg3ODk5NzY0NDM0MzQ1Njc2Oj5ARktQWGBpcXN0cnBwcXN1dnh2cGdcSzsyLS0tLTE2OT1CRUpNVFthanN8hIWFgH57en1+f4GCgHhrW0o7MzM0Nz5JU2FKSmp2dHJvZlhJPDQtLCwqKywsLS0tLS0uS3h6cUo3VU5MSU1TTVJXY2hye4B+e3p5eHh5eXl3dG1lWUs9NzUyNTQ4PUVMWGNwfIaMjY2Khn10aWJeXF1dX2FlanB2eX+DhYSEg399fX19fX5/fX5/fXl4dW1jWUs/NzMyMTAwMDAwMDAwMC82OkBHUVlhaG1sbW1tbWxraWVgWlVLPzUtKysrKiouND9JU1xjanF1e3+BhIaGhIOEhIaHioyNi4uKiYmIiYmIhX52bF9SSktRVmFqcXl8fn5+f3x8fHt4c25lXFFHPzo4OT1ET19seYOKi4uLi4uLjIyMi4qJhH12bGNeXmJnbnV1dHNycXBwcHBxcXFxb21rZ2ZjYFxXVjs5Ozo5Ojs7OTk5OTg3Nzc4ODg3Nzg4ODk5OTg4ODY2Nzc2NjU1NDMyMjIyMTExMTIxMTExMDAvMC8vLy4uLS0rLCoqKSkpKSgnJSUlJSYmJSUmJiUlJSQkJCMjIyMjIyMjJCUoKi4xNjY0NTY2OTk4NzItJyQkJCQkJCQjIyMjIiMjIyMjIiIiIiIiIiIhISAgISMmKzI8TV1ve4KBdmZVPSomJScrLSwoKSkqKisrLS8yNjxCSU1TVVteX2JlZmhqamppaWdjX1hPRkA5NjU2NjU1NjY1NTMzMzMzMzIyMTEvLy8uLi0tLS0tLS0uLi8xMDAxMTEyMzQ1NTY3ODg3Nzg5OTk5OTk4Nzg5OTc2NjUzNTU0NTY4OjxAQ0dLUFVgaG9zdHRxcHBzdXZ4d3NsYVBANi8uLjE4PD9CRUpQUlddY2tze4OFhIF/f4B2e3+Cf4F4b2BPPjUzNDc+R1JeSUhsdnRzb2ZYSj00LSwsKissLC0tLS0tLTtgcGpROFtXTkxQWVVNVGNgZnZ9fn16eXh4eXl5d3RvZlhLQDk2Njg5PkVMU11odH6HjI6NioR8cmhjYF9eXV1eYGRqb3Z9g4SCgYF+f319fX5/fn59f315dnJtY1lLPzczMTAwMC4uLi4uLi8wNDpCS1NaY2ptbGxsbW1sa2ljXVdQRTwzLSspLCstMDlCTFVdY2pydnt/g4WGhoSDhISGh4qMjYqKiYiIhoiHh4R9dmxfUk5OU1pia3N5fH5+fX59fHx7d3JrZlxRRzw4ODg9RlNjb3uFiouLi4uLi4yMjIuKiYV8c2ljXl5iaW92dnRzcG9wcXFxcXFxcW9tamdkYl5aV1c6Ojw8Ojo6Ojs5Ojo5ODg3ODg4ODg4ODg5OTc3NzY1NTU1NDQ1NTQzMjIyMjExMjIyMjAwLy8vLy8vLi8uLS0sKysqKSgnJycnJyUlJSUlIyMlJSUkJCQkJSUjIiMjIyMjIyQkJScoKisrLS8vLzI2NjYxLiglIyMiIiIiIyMjIyQkIyIiIiIiIiIiISEhIiIiIiIjJSkwOkpaa3iAgXdpW0YvJiUqLzIzLCkpKSorLC0yODtBR0tRVVpeYGNkZmhpaWlpZ2ZkYVlQSEE8NzY0NTU1NTU1NTU0NDMzMzIyMjAwLy8uLS4tLS0tLS0tLi4wMDExMTEyMzI1NjY2Nzg4ODg4ODk5ODg5ODg4ODg3Nzc1NDQ1NTY3Ojw9QUVKTVFYX2dvdXV1c3JydHZ0dndzbmRVRzoxMDI3PEBFSE1QVFhbX2RpcXuCiYaDfnNeanyAeXqAfHNlVEQ4MzM2PEZQX0pHa3ZzcW5mWEs+NS4sLCkqLCwsLCwsLSsyTGVuYVBufGlRT15eTkxhXlZrgn98enl5eXl5eHh2b2ZZSj87Oz1BQ0hMVFpibXiBhouMjImDem5nYWBfXVpYWVxiaXB3fYGEgn9+fH19fH1+f35+fn17enRxa2NXST02MzAvLi4uLS0tLCwtLzU8Q0xVXWRqbWtsa2xsbWpoZV1XT0Q5MSwqKiwrLzVASFJYXmNrcnd9gIGFhoaFg4OEhoeKjIyKioiIh4eIh4eDfHZsYFNRUlVbZWx0eX1+fXx9fHx8e3dwaWJYTUE5Njg4PkZYZHF+h4qKiouLjIyMjIyMi4iCe3FmYFxeY2pydnd0c3FwcXJycnNzcW9samxnZV5cWllZOjo8PDo6Ozs7OTk5ODg4Nzg4ODg4ODg4ODg3Nzc2NTU0NDMzNDQzMzIxMTExMTIyMjIvLy8vLy4vLy8uLi0tLCsrKSooJycnJycnJycnJSMjJSUkJCQkJCUlIyIjIyMjIyMkJCQkJCYmJicpKiorLy8vKykmJSMjIiIiIiMjIyMkJCMiIiIiIiIiISAhISIiIiIiIyUpLzhFV2Z0f4F6bmFQNikpLjU5OzMqKSkqKy4xNjtARkxRVlpcYWRjZmloaGlpaGdjX1lSS0I8NzY1NTU1NTU1NTU1NDQzMzMyMjIwMC8vLi4uLS0tLi4tLS4uMDAxMTExMjMyNTY2NjY4ODg4OTk3Nzg5OTg4ODc3Nzc2NTY1NTY2ODo9QURISUxRV19lbXR3dXNzc3J0dHZ2dHBoWUo+ODU5PEFESU5SVllcX2RobHV8goiGgndua3l+fHB7gn11alhJOjMzNz1FT15LSGFyc3JuZlpLPjUuLCwrLCwsLCwsLCwsLTRGU2trdXRlYmBhWk5CU2ZreoF9e3p5eXl5eXh4c21mXFBEQ0FDR0pOUlphanJ8hImLjImIf3VpY19cWlVSU1RYYGZud3+Dg4F/fnx9e3t9fn5+fn58eXZ1cWtiVkk9NjMvLi0tLSwsLCsrKy80PENNV19nam1ubGtsbGxpZWJdV09EOTEsKysrLzU/R01VXGRpb3R4fX6BhIaGhYODhIaHioyMjImJiIeHiIiIg3x2bGFVUVNaYGdvdnt+fn18e319fHt1cGlhVEk9NzY2OT9KXGp1gYmKioqLi4yMjIyMjIuGgXluZFtbXmNpcXZ3c3JxcXJycnJzc3Jva2poZmJdXF1eXjo6Ojo7Ozs7Ojk5ODc3ODc4ODc3ODg3Nzg3Nzc2NjQzMzMzMzIyMjIxMTExMTEwMDExMDAwLy8vLiwuLiwsLCwqKSkpKScmJicnJiYlJSQkJSUkJCQkJCQkJCMjIyMjIyMjIyQkJCUlJiYlJSYmJyUoKicnJSQiIiIiIiIiIiIiIiIjIyEhIiIiIiAgICAgICEhISIkJys0PlFib3mAfHNnV0ItKTE7P0E3LCoqLC0xNjk9Q0pRVlheYmZlZ2dqaGlpaGZhXVZPTEQ8OTc3NTQ1NDU1NjY0NDQ0NDMyMjExMDAvLy4uLi0tLS0tLS0uLi8wMTExMTIzMzQ1NjY2Nzc2Njg4OTk4OTg4Nzc2NjY2NTY2NjY3Njo9QENFSUpNUVdcZW1zdnd1c3Bzc3NzdXVxal9QQzw8PkFFSk5SWFteYWVna3B2eoCGhXh3dWpmcWZbaHN6eW9eTT00MjQ5Q1BbUE9fcXNya2VaSz42LywqKysrKysrLCwtLSsrKzhZcmxnZHBkV1ZUU11odXt/fXt7enl6eXh4eHZvaV9VTUpKTE1QVFlhaG92foaKi4qHgnpyZV1aVlJNSk1PU11mcnyAg4F/f358fHx9fn5+fn1+e3h4dXBpYlRJPjUyLi0tLS0sKysrKyowNT5HT1lhaGtubG1ra2tsamdjWlVMQjgvKysrMDQ9R05WXWJpbnN3eXx/goSHh4WCg4SGiouMi4uKiYeGh4iIh4N8dWxhVlJVXGJpcXh8fn5+fn1+fn14dW1lXlJFOjY2NDhBTVxseYKKi4uLioqLjIyMjYuIg352bGBZWV5lbHN2d3VzcXJxcXJycnJyb2xoZ2NgXFxeYGI7Ozo6Ozs7Ozo5ODc3Nzg3ODg3Nzc3Nzc4Nzc3NTQzMzExMTExMTExMDAwMDAwMTEwMC4tLy8vLy0tLissLCwsKSgpJycnJiYmJiYmJSUkJCQkJCQkJCQkJCQjIyMjIyMjIyMjJCQlJSUlJCQlJSQjIyUmJSQjIiIiIiIiIiIiIiIiIiIhISAgISEgICAgICAgICEiIyQpLzlLXWx3f350a1xKMyksNDw/NCkpKiwvMzg8Q0dOU1hcYWRmZ2hoaGppZ2RhW1ZPSEQ+OTU1NjU1NTQ1NTQ0NDQ0NDQzMjIxMTAwLy8uLS4tLS0tLS0tLi4vMDExMTEyMzM0NDU2Njc3NjY3Nzg4Nzc4ODc3NjY2NjY1NTY4ODo9QEJFRUlMTVFWWmRsc3d3dnRycnJydHNzcWxiV05FQkRKTVFVW19kZmlrcHN2en2Ag4J2dXR8ZFBEP0BEXl5Yb2hKODA0OT9LWk5NXmxycm1lWks+Ni8sKisrKysrKywsLCwsLCs1TV1jaGtjREhNTFNgaXJ7f317eXl3eHl5eXh1cWtjXFhSUVBUVltgZm51fIKIi4uKhoF4bWNZU0xIREJFTVVeaXZ9goOBf39+fHx9fX9/fn59fHt4d3RwaWJUST41Mi0tLS0sLCsrKyssMTlASFBbYmhsbWtsbGtra2llYVhTSkA1LyorLTM7RVBVXWNpb3J3enx8f4KEhoaFgoOEhoqLjIuLiYiHhoeIiIeDfHVpXldVWF9mbXR5fX5+fH19fXx8eHVrZlxQQjg0NDU5RFBfb3uFiouLi4uLi4uMjIyKiIN9dWheWVleZWxzd3d1c3JycXFzc3Nzcm9saGViXl5eX2JkPDs7Ozo6Ojo5ODk4ODY3Nzg4Nzc2Njc3NjU2NjQyMTExMTExMDAwMC8xMTEwMC8vLy8wMC8uLS0sLC0sLCssLCkpKCcmJiUlJiYlJSUlJSQiIyMjIyMjIyMjJCQiIiIiIyMjIyMjJCQkJCQkJCQkIiIiJCQkIyIiIiIiIiIiIiIiIiIiISEgICAgICAgICAfHyAhIiMjJy01Q1Zoc31/e3JhUj4uKy83NS8qKywuMDU7PkRKUFdcYGNmaWlqamppZWNfWlRPR0I8NzY1NDU2NTQ0NTU0NDQ1NDQzMjIyMTEwLy4uLS0tLC0tLCwtLS4uLjAxMTExMjMzMzU1NTU2Njc3Nzc4ODg5ODg2NjY2NjY2NTY3OTw9QENFRklMS01PVFljbHR2d3Z0cnJycnJyc3FvaF5UTEhKT1NZXmJoa25zdHZ5en2AgYOAbVlacWhVW2JpXlB4VmZgX1Q8Oj9ZbmJLR05fcHJsZVpLPjUuLSssLCwsLCwsLCwrKywyO1BWV2JmUU9dSUVMVmVxen5+fHh3eHl6e3t7eXZwaGNeW1lXWl5jZ21yeX+HiYuLiYN/dmtfUUxEPTg7QE1ZZXF7f4SEgX9/fn59f4B/f359fHt6eHV1cGliVEk9MzAtLSwsKysqKisrLTM6QkpUXGRoa2psampramlnY19YT0Y8My0pLTI7Rk9WXWRqcHJ2ent9foKEhoaEhIKDhIaJi4uLi4mIh4eHiImHg312bWJXU1phaXB4e31+fn59fX18fXd1aWNXSj82MjIyOURUYnB9hoqLi4mLjIuLi4uKh4aBenFoXVdYX2ZtdHZ0dXRxcnNyc3N0c3Fua2ZjYV9gX2FkZjw7Ozs6Ojo6OTg4ODc3NzY4ODc3NjY2NjU1NDQzMTExMTExMTAwMDAwMDAwLy8wLy8vMC8uLS0tLCwsKysqKSkpKSgnJyUlJSYmJSUlJSUkIiMjIyMjIyIjIyQkIiIiIiMjIyMjIyQkJCQkJCQkIiQjIiQkIyMjIiIiIiIiIiIiIiIiIiEhICAgICAgICAgHx8hISIjIyUpNEBOYG16f311ZllJNSwrLSwrKistMDQ3PkNHTlVaXmJkZ2lpampqZmFcVlFKREA7NzY2NTY2MzM0NDU1NDQ0NTQ0MjIyMjExMC8uLi0tLSwtLSwsLS0uLi8wMTExMTIzMzM1NTQ1Njc2Njc3ODg3ODg3NjY2NjY2Njc4OT09P0JFSElLTE1PUFNbYmtwdXp5dXNxcXFxc3V0c25lW1RQUVVaX2VqcXV4f39/gIGDh4aEf3ZYQFBaUlBAWGBeZGxOSkFAR0tomJNySUNMY3Nxa2ZbSz41Li0rLCwsLCwsLCwtL0hufYSGhHRjZmpWW0pOXFhlcXp8fXt4d3p6eXt7e3p4dm9nYV9dW19jaG1zeH2Eh4qLioeDfHVpWkxANzMzOUNQXGh2fYOGhIF/f35+f4CAf39+fXp5eHh3c3BpYlRJPTMwLS0sLCsrKiorKy0zOUNLVFxkamtrampqaWhoZWFbVk1CODEsKzA3QktTXWZqb3R5fX59fX6BhIaHhYSCg4WGiYuLi4uIhoaGh4iJh4N9dmpfWFddZW1xeXt9f39/fn5+fH14cmheVUg7MzEyMjtGWGdzgImKi4yLi4yLi4uJiIaDfHRrY1tXWF9mbXR2dXJxcXFycnFycnFwbWplY2FgYWFkZWY7Ozs6Ojo5OTk4Nzc3NzY2NTU2NjU1NTY0MjIyMjEwMDExMDAvLy8vLi4tLS0tLS8vLi4uLS0rKysrKykpKSopKCgnJiYmJiUlJSQkJCQkJCQkJCQkIyMjIyMjIyMjIyMkJCIiIyMjIyQkIiIjIyIiIyMjIyMjIyMiIiIiIiIiIiEhISEgICAgHyAgIB8fHyAhISIiIiIkKC44R1dnc3p8eG5hUj4tKigoKiosLTA1OD5FTFJZXGBjZGhpamloZF9ZVE5IQj45NzYzMzU0NDQ0NTU1NTMzNDQzMzIyMTEwMDAvLi4uLiwsLS0uLS0tLi4vMDAxMjAyMzQ0NTU1NTU1NTU2NjY2ODg3NjY2NDQ3Njc5Ojw+QUJGSEpKTE5MTlFRWWJocHR6e3Z0cXFwcHJ0dnZxa2RdWFdbXWRqcXd8g4eHh4eIiIiKi4x+alZRWlZaXGNmaWJcRURMUURATGh3bVlHWndzb2xlW0s9Ni8tLSwsLCwsLCsrLS9bfoB2eH14aWl3a1JJVl9YZHF8fn58eXh3d3l7e3x7endvamViYGJkaW1yeX2BhoiJi4mFgntxZVZGOzQwND1IVWFteIGFhYSBf39/f3+AgH9/fXx7eHh3d3Zya2JWSj0zLiwsLS0tLCwrKiovMzpETlhhZWlpaWlpaWppZWJcV1FIPjUuLS81PkhUXGRrb3Z7fn99fH1+gYSEhoaEgoSChYiLjIuKiIeHh4eIiYiFfnVqXlpcYGhvc3l7fX5+f39/f358eHBoXFNFODAtLDA8Slxpd4SIiouLioqLi4qKioqGgHl1bWJYVFdhaG9zdnVycHJyc3JxdHNyb2xpZWNjY2RkZWZoPDw7Ojo6OTk4ODc3Nzc2NjU1NjY1NTU0MjIyMjEwMC8vLzEwLy8vLy4uLS0tLS8uLy4tLS0tKysrKyorKSkpKSgoJyYmJiYlJSUkJCQkJCQkJCQkIyMjIyMjIyMjIyMjJCQiIiMjIyMkJCIiIyMiIiMjIiIiIiIiISEhISEhISEhISEhICAgIB8gICAfHx8gISEhIiIiIyYqMz9QX212fHpzaltNNiwrKissLzA0NjtBSE1UWV1hZGdqbWtqZF5aUkpFQT45NTU0NDU0NDQ0NDU1NTUzMzQ0MzMyMjExMDAwLy4uLS0sLS0tLi4tLS4wLzAwMTIwMjMzMzU1NTU1NTU1NjY2Njc3NzU2NTY2Nzk7PT5AQUJFR0lLTE1NTU9QU1ZeZ251enp4dXNxc3NzdXd3dHBqZF9eYGRpb3V+g4mNjY2NjY2PkI+RjHBWSUlXX21ya2xuWUdRQ0ZHSUlLVGJeT1t0bm1pY1tMPjYvLCwsLCwsLCwrKyssLj5ZaHBrZmRfbmtQT15eVGRweX5+fHl4eHh6ent8e3l2b2plY2NmaW1xdnp9gYWHiImJhYJ7cWVURDgyMThCTVtmcn2EhISCgX9/f39/gIB/f318e3h4d3d2cWxiVkk8My4sLC0tLSwsKyoqLjU8R05YYWZpaWlpaWlpaGVgXFhPRTkyLzA0PERPWWJpbnN5foB+fXx9foGEhIaGhIKDhIWIioyLioiHh4eHiImIhH51a2FcX2NpcHZ6e31+f39/f39/fHVwaFxPQDUuKyszPk9fbHmEiYqLioqKi4uKioqIhYB5cmteVlNYYWlwdXZzcnFycnJyc3Nzc29saWVkZGVmZmdoZzo6Ozs7Ozk5ODc3NzY2NjU2NjU1NDQ0MjAwMTExMTEwLzAuLy4uLy8uLi0tLS0tLS0tLCwsLCwrKiooKiknJiYoKCgnJSUmJSYmJSUkJCMjJCQkJCQkJCQjIyMjIiIiIyMjIiIjIyIiIiIiIiMjIyIiIiEhISEhISEhISEhISEhISEhISAgICAgISAfHx8fHyAgISEgISMkJy44R1dmcHp8d29jVEMyLC0tMDEzNjpARUtSVVldYWVpampqaGFZU0xHQj06Njc0NDQ1NTU1NDQ0NTU1NDMzMzMzMzIxMTAwLy8uLi0tLCwtLS0tLi4vLy4vMTExMTExMTI0NDU1NTU1NTQ0NTU1NTU0NDU1Njg8PD5AQUJGSUlKTE1NTk9OT1NYW2Nrcnd4eHRzcnJxc3Z4eHh1b2pmZGVobHF3gIeKkJCSkZKSkZSUlZOKXjtCWF1XZ2FnfXBWZFxLRENHT1VbVk9VaWpubGNaTD43MCwsLCwsLCsrLCwsLDZTS05WV2FQSVdRTlhSW1hlcHp9fXt4d3h5enp7fHt7eHNqZmNmZmpvdHd6fX+ChIeJh4WAenFkU0M3MjU8RVJdanZ/goSCgYCAf39/f4CAf399fHl2dnh4dnFsZFdJOzItKyssLC4tKyspLC82PUdSXGJmaGloaGlpaWdlYFpUTUM4MTI3O0RLVl5la3J2fH5/fn17fX+BhIWGhYKChIWGiYuLiomIh4eHiImJiIV+dWtgWV9ka3F3fH59fn5/f39/f3t3b2RZTD00LSssNUBSYXB/h4qLioqKioqKiYmJh4WBeXBoWlZTV2Fpb3J0c29vcXFxcnJyc3Jta2hlZmZnaWloZ2U6Ojs7Ozs5OTg3Nzc2NjY1NTUyMjExMjEwLzEyMTIyMTIyMS8uLi8vLi4tLS0tLS0rKykpKysrKSoqKikoKSgoJycnJiUlJSQmJiUlJCQjIyQkIyMjIyQkIyMjIyIiIiMjIyIiIyMiIiIiIiIiIiIiIiIhISEhISEhISEhISEhISEhISEgICAgICEgHx8fHx8gICEhICEiIyUqMj9PYGp0fX13bFxPQDIyMjU2ODo/Q0dNUVdbX2JmaGlqZ2JbVE1GQT06NzY1NDQ0NDQ0NDQ0NDQ0NDU0MzMzMzMyMTEwMC8uLi4tLS4uLS0tLS4uLy8uLzExMTExMTMzNDQ0NDU1NTU0NDU1NTU0NTU2ODo8PUBCQ0RGSEpKS0xOTk9PTk9TVFleaG51eHd1c3JycXN2enp6d3VvamZpam10e4GIjpCRkZOVlZaXl5aVkXVeVllQM11zf4J8d2pcVFdSU01NWVdRTlVeZmRgWU1BNy4sLCwsLCwrKysrKiwyQV1hUFpbUV1UOkJFSlReZXF6fXx7eHd4eXl5e3x7e3ZvamZlaGhscHV1eHt8f4KFh4eFgHpxZFNDODM3PklWYW95gYOFgoB/f4CAgICAf35+fXx5dnZ4eHZxbGRXSTsyLSsrLCwtLCsrKy0yOUFKVFxiZmhpaGhpaWlnZF9ZUUpANzI1PUJKU1xiaG5zd3t8fXt6ent/gYWGhoWDg4SFhomLi4qJiIeHh4mKi4qFfnRpYV5gaGxzeXx+fX5+f39/f397d29kWUo7NC0sLzZDWGR0gIiLi4qKioqKiomIhoeFgHhtZVlVUlhhanB0cnJxcHFxc3Rzc3JwbWtqaWpqaGhoZmRePDw7Ozo6OTk4NzY2NjY1NTMzMzMxMDExMDIxMTQ2Njc0MzEwLy8uLi0tLCwsKywsLCwrKyoqKyspKSknKCgpKSYmJSUlJSUjJSUlJSMjIyMjIyMjIyMjIyMjIyMiIiIiJCQiIiIiIiIiIiMjIyMiIiEhISEhISEhISEhISAgICAhISAgICAfHx8hICAfHx8fISAgIiEhIiIjJiw5RVVjbnh9enJlWUs7NjY5Oz4+Q0hMUlRYXWFkZmhpZ2NdVVBKQj04NzY2NjU0MzQ0NDQ1NTQ0NTU0NDMzMzMzMjExLy8uLi4uLi4tLS0tLS0tLi4uLi8xMTAwMTI0MzMzNDQ1NTU1NDU1NTQ0MzY4ODo8PkBCREVHR0lKS0xNTk5PT05QT1FTWWJqcXl2dHRzcnFzdnl8fXl3cm1pamludXp/hYuOkJGSmJmYmJmamJONiIR/a1N5gYCBf3lvYl1MRVZeWVVRT01PUFJZYVxRQzcxLS0sLCwsLCssLC0qLTVaZ1dUYVZjVDpHTFNYXmh1fH19enp5d3d4ent7e3hzbGdjY2NmaWxvcnV5eX1/gYWFg4B6cmRURTo1OEFOW2dye4GDg4KAf39+f4CBgH9/fnt6eXZ2d3h3c2xjVkg7Mi0rKysrKioqKisuNDtGTlZcY2ZnaGdnaGhoaGRfV09HPDU5PEJIUFhfZGlucnZ5eXd2eHl6f4GEhYaFhIODhYiLjIyKiomIiYmKiouKhH11amJhYmpwdXp9fX1+foCAgH9/e3ZuZFdHOjMsKjA7SFpqeIKIi4uKi4uKiomIh4SHhH92bGJVUVJZYWpxdnVyc3FwcHFyc3Nxb21sbGtsampoZGRhWjw7Ojo6Ojo4ODc2NjU1NjQzMzIxLy8wMDEvMTQ1ODs8Ojg1MzExMDAuLi4uLSstLSwsKysqKioqKSkoJycoKCgmJiUlJSUlJCUlJSUkJCMjIyMkJCMjIyMjIyMjIiIiIiMjIiIiIiIiIiIjIyMjIiIhISEhISEhISAgICAgICAgHx8gIB8fHx8gIB8fHx8fHyAhISEhISIiJSUpMjxJWmhye312bWNXRzw7PT9CRElNUlZYXV5iZWVoaGZgWVNLRj05NzY1NTQ2NjQ0NDQ0NTU2NjU1NDQzMzMzMzMxMTAvLy8uLi4uLS0tLS0tLS4uLi4vMTEwMDEyMjQzMzQ0NDQ0NDM0NDQ1NTc4Ozw8P0FDREZGSElJSktMTU5OT09PT1BPUlZdZGx1eHZ0c3Jxc3Z3en17eXNuamptcXN2e4CFio6RkpWXmpqamJiUkYiFfHt8f4B/gYB7c2dcTkdWW1haUExKTU9MTFleVkg9NC4rLCwsLCwsLCwsLC01RV1cR1tWV09GV1ZHPlBkbXh+fXp6eXh3eXp6enh1b2pkYmJiYmdra29zdXh6fX+BgoJ/eXBlVEU5NjpDUF5qdn+EhYOCgH9/fn9/f39+fn17enl2d3l4d3NsY1ZIOzErKioqKioqKioqMDY9R09XX2ZoaWdnZ2hoZ2ZiXVdPRz88QERJUVhcYmhsbHJ1dnZzcnN3en2ChYeGg4SEhIeIi42Mi4qKiouLjIyLioR+dWtgYGZscnh6fH19fn5/f4B/fnpza2JTRDgxLCsxO01fbnuFiouMi4uLioqJiIiHhoF8c2leU1BSW2JqcnR0cnJycnJyc3R0c3FvbmxsbGxqaGZgW1Y7Ozk5OTk5ODc2NjY1MzQzMjIxLy8vLi8vMjI3ODw+QkJAPTk1NTQyMTEvLi4uLi0tLSsrKikpKSkpKCgnJygnJiYlJSUlJCQlJSUlJiYlJSQkJSUkJCMjIyMjIyMjIyMiIiIiIiIiIiIiIiIjIyIiIiIhISEhISEgICAgHx8fHx8fHx8fHx8fHx8fHx8gIB8gICEhISEiIiMlJiozQk5eaHR9enNqYlVHQUJDSExQVFdaXV9iZGVmZ2ViXFdPR0I7ODU0NTU1NTY2NTU0NDU1NjY1NTU1NDQ0NDIyMDAwMDAvLi4tLS0tLi4tLS0tLy8vMDExMDExMjEyMjIyMjIyNDIzNDM1Njc4PD0+QUJERUVFSElISUtMTE1PT01OT05OTU9QVV5ncnZ2dHN0c3R0d3l8fXp1b2xqbGxtcHN6f4SKjZCUlZaYmpmXlZGLhIB8e3t9foGAe3RrXlJOVU9QVVZWTUdLT1NTVFdSRzs0Ky4uLSwsLC0tLSwuLjA1Oj1RTlFFRE9QQz5Qa2d3fHt4d3d5eXl6eXh1dGxpYltdXmFlaWdtcHF1d3l7fn9/fXdsYlJGODk9SFRibnmChoSDgX9/f35/fn9/fn18e3l4dnh5eHdzbGJWRzkwKykpKSkqKikpKzE4QElSWmFmZ2loaGhoZ2dlYVpVTkZCQUVKUFlbX2Roa21wcnFvbW9ydnp+gIOEhYSEhISHiYyOjouKi4uMjI2NjIqEfnJnYmJnbXR5ent9fn9/f3+Af314cmldTkI3LissMz9PYnJ/iIuLjIuLi4uLiomIh4aBeXFnW1FQUltjbHF1dnRzcnNzdHR0dHJycHBvbGtra2ZjXFVQOzs6OTk5ODg3NjU1NDMzMzIyMS8vLy4vLjE2OjtAQ0ZJRkRBPjw7ODU1NDMxMTIwLi4sLCsqKiopKSgoJycoJyYmJSUlJSQkJSUlJSYmJSUkJCQkJCQjIyMjIyMjIyMjIiIiIiIiIiIiIiIiIyMiIiIiISEhISEhICAgIB8fHx8fHx8fHx8fHx8fHx8fICAfICAhISIjIiIiIyUnLzpHVmNueHx3cmphU0hIS05SVlpdYGFiZGVmZWRjYFxVTkY+OTY2NjY2NjY2NjU1NTU1NTY2NjY1NTU1NDQzMzEwMDAwLy4uLS0tLS4uLS0tLS8vLzAvLzAxMDExMjMzNTQ1NTU1NTU1Nzg5PD1BQUNDRUdISElJSUpMTE1OTk5NTE1MS0hJSk9XYmxzdnVzcXJ0dHd5e3x6dW9saWhmZ2dscHl8gYeNkJOVlpaYlpKPiYJ/eXp8fn9+fnlxal1VVVJSTk5MTklER09QTkpNUEpEOS0tLS0sLCwtLS0sLS0uMz1QV1BMQ0lTUUNBT21pd3x6eHd3eHl5enh3dHNsZ19ZWFpgZmtub2xubm9ydnl8fXt1a2FQRDg5QEpWZHF8gYOCgH9/f39+f35/f359fHl2dnZ4eXh3c2xiVkc5MCspKSkpKSkpKSwyOUFKU1tiZmdoaWhoaGdmYl9ZVU1JREdKUlheX2JlamxsbWxraWlscHV5fH+DhIaGhISEh4mMjo6NjYuLi4uMjIyKhX5yaGNmanB1ent8fX5/f39/gH98d3FoXU5ANi4rKjZDVGR0gYeMjIyLi4uLi4qJiIeEf3duZFZPT1RbZGx0dHNzc3JycnJzdHRzc3Fwb29ubWhjX1dOSTw8Ojo5OTg4ODU1NDU0NDEyMS8uLi4uLzAzNjo9QUZKTU1LSEdFQj8/PDw7ODc3NjU0MTEuLCkpKSkoJycmJiYlJSUlJiYlJSYmJSUlJSUlJSUkJCMjJCQjIyMjIyMjIyIiIyMjIyMkIiIjIyQkIiIhISEhICAhISAgICAfHx8fHx8fHx8fHx8gIB8fHx8fICAgICEkJCMjISEkJisyP01caHR+fHZya2RZVFJWWFxgY2NlZmZmaWZkYV9YUUtDPDY2ODc2Njc3Nzc3NzY2NTY2Njg5NzY1NTMzMzMxMDAwMDAvLS4vLi4uLi0vLi8tLzAxMjI0NDU1NTY2ODY2Nzg2Njg4Oz4/Pz9BQ0RGRkhISUlKSktLS0xKS0tLTUxLSkhGQ0RJU15pcXR2dHNzc3V3eHl7enVxa2ZkYF9iZWhwd3uFjI6RkpaVlZWTjoeBfnl5eHp7eHNuaGFeW1lWVE1NSklKRkNHS0dDSFBNTEgvKS4tLCwrLSwtLS0tLDA2RlhRUUlRVUdBPT5Ka3l8e3p3dnV3enp3dXVybGRaV1dZXmdtY0ZARGNrbnF1en57dWpfUEM5PURPXWh1fYKCgYB+fn5+fn5+fn1+e3p3d3Z2d3h4dnJrYVNGODAsKCgnJycoKCktNDtCS1NcY2ZnaGhpaWlpZmNgW1hSTEtMUVZcX2NlaWlpamloZGRkaW50eHt/goOEhISFhYeKjY+Pjo6MjI2Njo6MiIV/dGtnZ21zdnl7fH19f31+foGAf3hvZlhLPzUtKy44Rlhqd4SKjIyNjIuLi4uLiomHhH51bGJXUE5TXmdtdHRzc3FxcnJ0dHR1dXV0c3Bvb2xmYFpRSUg8PDs6OTg4NzU1NTQzMzIyMTAuLi4uLi8wMzY6P0RITFJSUE5NS0lIRkREQz9AQD48Ozk5NTItKyopKScmJiYmJSQlJSYmJSUmJiUlJSUlJSUlJSUkJCQkIyMjIyMjIyMjIiMjIyMjJSQkIyQkJCQiISEhISAgICAgICAgHx8fHx8fHx8fHx4eHx8fHx8fHyAgICAgIyIjIyIhJCYnLjhGWGVwen17d3JsZWBeXl1hZGZmaWppaWlnY19bVE1GPjk5OTg4NjY3Nzc3Nzc3Nzg4ODo4OTk3NjY0MzMwMTAwMDAwMC8vMC8wLy8wMC4xNDQ0NTY2Njg6Ojw9Pj0+QEBBQkJEREZGRkZISUpJSUlLS0tLTExMTEtLS0tMS0xKSEdDQkA/Q0xZZHF0dnRzc3R0d3l5eXh2cGliXFhXWlxga3J4gIeKj5GVlZaUko6IgXx5eXd2dG5lY2FaWVdWWVdNS0xKRT48Q0dHR0lQU1NcTCUtLiwtLCssLC0uLS0uNExNV2ZbU1RAPDc6SWl6ent4dnZ1d3l5c3J1cmpkXFhaW2poTT1EQDhdaWVqc3l6eHNoXUxAOz9HVGBtd4CEg4B/fn59fX19fX9+fXt5d3Z2dnd4eHZxamFTRjgxKygoJycnKCgqLjQ9Rk5XXmVnaGdoaWlpaWZjYV5aVlBPUldbXmFlZ2hoaWZiX15fY2ltdHh7f4GCgoKChIaIjI6Ojo2NjIyNjY6OjYqFfHNqaWlvdHp8e3x8fX5/f3+BgH13b2ZYSD00LS0xO0xcbn2Eio2MjYyLi4uLi4qJh4R+dGheUk5QVF1lbHJ1c3NycnNzdHR0dXV1dXRxcG1oY1tTTUhKOzs6OTg3Nzc1NDMzMzIxMDEvLS0uLi4uLjI2Oz9FSUxSU1NSUU9PTUtMS0pJSUpJRkRCQD05NTEuKikoJygnJiUlJSUmJiYmJiYmJiUmJiYlJSUlJSQlJSQjIyQkJCMjIyMjIyQlJCUlJSUlJSUkIyIiISEgICAgHx8fHyAgHx8fHx4eHx8eHh4eHx8gICAhISAfHyAgISEhISQmKC01QFFgbHZ9f3x4dHBsa2hoaGtra2tramppZWJeWVJLRD87OTk5OTc3Nzc4ODk4ODg4OTs8Pj8/Pj46NjQyMjEvMTEwLzIxMTMyMTM0NTc3Ozw8PD9CQkNHR0lKTExNT09QUlJUU1JUVFNTU1NSUlNTUlRSUFBPTk5MSktLSUlJRkNCPjs6OT1JVWNvdHVzc3NzdHd3eXp3dHBlXFNQTlBTXGNtcXmCiI+RkZOTkpGMhn98eHd3d3BmXVlWUlFNTlZRRkdGQzs7P0NHSEtNT01PUV1AIyosLSwtLCwsLSwtLTA8PFdjYF5TPTozQVpwe355eHd3dnZ1c2pocHBqZWBcXGFaXFVFQDdKY2FhanN3dnZwaFtNQDxCSldkb3qBgoKAf319fX19fXx+fnx6eHZ0dXR2d3d1cWpgVEc4MCsoKCcnJicoKDA2QElPWmFlZ2hoaGhoamhoZmJgXFhWVlZaXWBkZmVlZGJfWVhYXGJob3R4en6AgIGBgoWHio6Ojo6NjY2Njo6Qjo2KhX53bWtscXR5e3x7enx+fn+AgYB8dXBlWEk9NC4uNT5OX299iYuNjIyLi4uLi4qJh4aEe3FmW1FPUVlgaXF0dHFxcXFyc3N0dHV3d3V0cm9sZ2BYTkhFSjo6ODg3Nzc3NTQ0MjIyMC8uLi0tLS0tLS8yNDc9QkdLUVJSUlNSUE9OTU5QUFBRUk9QTEdEQT05NDArKSgnJycmJiYmJiYmJiYmJiYlJiYmJSUlJSUlJSUlJSMkJCQkIyMjJCQlJSclJSUlJSUlJCMiIiEhICAgIB8fHx8gIB8fHx8eHh8fHh4fIB8fICAhISEhISEgICEhISIlJykuND5KWmZxe4GAfHl3dHVzc3Fwb29wcG9vamdkXlVOSEE8Ozk5OTk4ODg4OTk4OTs7PUJGSUpNTktJQ0A4NTMyMjMzMzM0Njc6Oz08P0BERkZJS1BQUFJVV1dZW1pdYWFhY2RnZmZlZWhnZWVlZWVkZGJhX11cW1hUUU5MSkhHREI/PDo4NTU8RFJeanR2dHNzc3R2d3h3d3RtY1pNR0FFTFVeaW92foeMkZGTkZGRjYN+enh2d3hza2NdWFNNSk1SUUpGRERBQUNDR0xPUU5MTkpeaUwqJi0tLC0sLC0sLS8wNz5ga19fSzo5Nk1hcXl9eXd3d3V2d3BfVl9oaWVhXGFTPUVIP0tYYFlXW2ZyeXh1bmVYTD9ARU5caXR8gYKAgH99fX19fX18fn18enl1dHJyc3V0cW9oXlJFODArKCgnJyYnKSwxOUNLU1tjZ2hoaGhoaGlpaGhmZWFdW1tbXF9hY2VjYF1ZV1RSV15la3F0eHp+f3+BgYKFiIyOkI+PjY2NjY6Ojo2NioaAeHBtbnR4ent8e3x9fn5+gIGAfXdxZ1pLPTQvLzM/UmNygIiLjIuMi4uLi4uKiYeGgXpvZFtRTlNZYGpxc3Nzc3JwcnN0dXV2d3d3d3NwbWVeVUxFRFA4ODg4Nzc3NjY0MzExMTEvLi0tLSwsLCwsLjA1OT9DR0xQUVFRUVFQUE9RU1RUVlZTVVNTUEtHQTw1Mi0pKCcoJyclJSYmJiYmKCcnJSYmJiUlJiYmJiUlJSUlJSUlJiYkJCUmJiYmJyYlJSUkJCQkIyMiIiAgICAfHx8fHx8fHh8fHx8fHx8fHx8fHx8fICAhISEgISEiIiIkJCYrLzQ7RFFganN8gX58enp6eHZ4dnZ1cnRycm5pZF1VTkY/Ozo7Ozo6OTk5OTo6Ojo9QUdQVFlcX2BeW1VNQTY1NDU0OTs9QENFRklNTU9TVlZaWlxeX2JlZGdoaWtubW9yc3N0dHV2dXZ2d3d2dnR1dHRycG9vbGlnZF9bVk9LR0RAPTg3NDM0PEdQXWlydHRzc3N0dnh2eXZ0bmRWTEE6PkdSW2VudX6FjI+Rk5GRj4qFf3p4dnV3dm9sZl5YUlZXVFFLSERCQUNCRERJTE5UU0xNSkRsXDkrLS0tLC8yLy8vMUBccm1fW0M5OD5YZl1wfHp4dnZ2dXZvXV1iXmBbWFpVW0leRkBEXVZNUWJscXVyc3BnWUtCQkhTX2x2f4GBgX9+fX19fX19fX59e3h2dXJxcXJzcnBtaF1RRTgyKykoKCYnKCktNDxFTldeZGhpaWhoaWloamppZ2ZjXlxcXV9gYmNkY11VUk9OUFdfZ21ydXl7fn9/f4GChYiMjY+Ojo6Ojo6Oj5GPjYqHgnpycXF2enx7enp7fX9+fX+Af3x4cGZaTD41MjI5RFZndoKKjIyLjYyLi4uLiomIhn94bmJZUU5TW2JrcXJycXFxcXFycnR2d3Z2d3d1cW9lXVRKRUhVODg4Nzc3NjUzNDMxMS8wMC4tLS0sLCwsKysuMjY5PkJHSEpKTExNTE5QUFJTU1dZWlhYWFZTUExHQjo0LyspKCcnJiUmJiYmJignJycoKCgnJyYmJycmJiYmJSUmJiYmJiYnJyYmJycnJiUlJCQkJCQkJCIhICAgHx8fHx8fHx4fHx8fHx8fHx8fHx8fHyAgISEhICEiIiIjJSUoKy8yNz5KV2JsdX1/fnx8fHx6fHp6eXd3dXVzbWddVU5FPz08Ozs8PDs7Ozo5OztARU1WXmVrbnBycW9qYFFDOzo9QENISU1RVFZYWltdY2RnaWttbnBycnF0dHV3eXp5eHt8fn1+fn9/f39/fn59fH19fXx6enp5d3RwamZfWFBKQj05NDM0OD5GUl5qc3V1c3NzdHd4d3h4dG1jUEAyMjhCTlhhanV9hoyQkZKRkI+LhX98eHZ2d3h4dXFqaGFeWFNQUEtHRkZHRUVERkhJT1lTREJCSmBoNikrLS0sLi4xMTtPaGhWV085OTlKYGVTXXt7eXV1dXRvaF5jX1ZXVVBPTE9iXF1dRU9SX2dzbXRwfXVxZFdKQUNKVmNveICDgX9+fXx8fX19fX17e3p5dnJxcXFxcnJwbWhdUUQ3MCwpKCgpJygrLjY+SVFYYGZoaWloaGlpaGpqamloZmFdXV1fYWFfXVlUUU1KTFBXYGhtcnd6e35/f39/goWHi46Qjo6Ojo6Ojo+Qjo+MiIV+dXR0eHt7fHp6e31+fn6AgH9+eXJoW01BODMzO0dYaHiDioyMi4uKi4uLi4uKiIZ/eG5iV1JSV19ma3Fycm9vcHFxcnJ0dnd6enl4d3RwaWBUS0dKXDk5OTc2NTUzMzMxLy8vLi4uLiwrKyssLCsrKy4vMzc5PUFCRUdHSElLTk5OUFBVV1hZWlpXV1ZTUUlDPjg0LisqJycnJiYmJygoKCcoKCgoJycnJycnJycnKSUlJicnJygpKCcnJicnJyclJSQkJCQlJSQkIiEgICAgHx8eHh8eHh4fHx4eHx8gIB8fHx8hISEhISEiIiEiJCYoKiwvMjY8Qk5XZG10eHx7fX19fX5+fX17e3l4dnNsZFtSSUI/Pj4+PDw9PDw7PT5BR1FWX2lzen2DhIN/e3FjVUhFSEtPU1hbX2NoaGxtbnFyc3R1d3d5fHp7e3t8fn5/f4CBgYKDg4GCg4SFhISEgoGCgYGBgoKDgYGAfXp1b2liWlFMRkA8PkFDSVJeaHF1dXRzc3N2dnh5eXh5e3t8Xi8tP0lTXmp0fIWPkpKSkJCOioWAfHl3eHZ4eXp4eHJpY1dWUVJOTUlLSEZIRUZHSU1WTENBREI/VUskKi8sLy8xPGBTS1FQXFNOOTs7UV9qa2V0enp0c3dxZWJeWlJQU1FKSkZEUlNkYVpKTk9XYmppaF9XbGJVSUNFT1pocHuBgYB/fn18fHx8fHx8e3p5d3Rwb25ucXJxb2xnXVBDNzArKSgoKCcpKzE4QkpUW2JnaWlpaGhpaWlqamlpZ2RfX19eXl9eWVdQTElHR0tRWGJqcHV2enx9f39/f4GDiIuOj46Oj4+Pj46PkJCPjYiFf3h1dXh7fHx6e319fX5/gIB+fHhxaF5RRDs0ND5LXW18h4uMi4qKi4uLioqJiYiGgHhtYVdUVFthZ21xc3Nwb3BxcnNyc3V3enx7end1b2hhVUxJUGI4ODc2NTQ0MjAwLy8vLy4uLS0sKysrKysqKiorKy0vMTQ4ODo9PUBDQ0VGSEpKUFNVV1laW1hZWFhSTUlCOzYyLisoJycnJykpKSgoKSkpKSgoJycnJycnJyknJycnKCgpKSkpKCcoKCcnJiUkJCQkJSUjIyIhICAgIB8fHh4eHh0eHh8eHh8fICAfHx8fISEhISEhIiIhIiUnKCorLjI1OkBFTlhkanFzdXl7fn1/f39/fn58e3l5dWxkXFRNRkM+Pj08PDw9PD9ESU9YYGt2gIaKjpGPjYd9cWZZU1ZcYGRnbG9xc3R2d3d5e3t8fX1/fnx9fX17e4CAgYGAgYCCgoCCgoKChIODg4KBg4KDhYWFh4aHhYOCf3x4dG1mYFlWUk9OTlBWX2lydHR0c3NzdHZ2d4GRnKCeo6B6KDNFUF1ndX+HkJSTkY+PjYmGgHx6eXd3eHl7enZraWFRUlhZUlJOS0lKSklKT1FUUVFBNkRBPDtXVCwoMTIxPE9nb1diXllUTTc8QVNeZHF1d3h3dnR2cmRZT1JbU05NTUpLUV9bWlpKU19eX1xJW2FRXmxhVkhHSlJcaHV9g4F/fnx8fHx8fHx8fHt6eHVyb21ubXBwcG5qZlxPQzcwKykoKCgnKS40PEdNVWBmaGhpaGhoaWlpamppaGVhXV1dXFxZVlFMSUVCQkZMU1pianB1dnp8fX9/f3+ChIiLj4+Ojo2Nj4+QkZGQj42IhIF8eXl6e3x8ent9fX1+f4CAfnx6c2hfUkY9NjY/T2BwfoaLjIqKiouLi4qKiYmIhn93bGBWVVZeZGpwcnNzcG9wcXFydHV1d3p6e3p4dnJsZVtRTlppNzc2NTMzMzExMC8vLi4tLS0tKysrKikpKiopKSoqKCstLS8xMzI1Ojs8QEFERUhMT1JUVlhZWVlaWFZSTkdBOzUxLiwpKCoqKiopKCkpKCgpKCgoKCgnJygoKSkpKSkpKiorKSkpJygoKCcmJiYlJSYmJCQjIiIiICAfHx8fHh4dHh4fHx8fHx8fHx8fHx8gISEiIiIiJCUlJigpLS4wNDY7QEhPV19maW1wc3d7e31/gICAfn1+fXt1cGljWlNNR0I/QD49Pj9CSE9YYGt0fomQlJeVlZSNhnxyZWFjZ2twdHV3enx9fXx8fX2AgH5+fX19fXt6e3t7e31+gH+BgYGBgoCCgoGBgYGAgIGBgYKDhIaHh4SGh4WEgHx6dnNvbGdkX1xcX2Zrc3V2dXFzcnN0d4Oao6GipauuqGgsPk9aaXWAipGVk5GQjoyIhIB8e3l3d3h6enp3bmtjT0RUYFhZUUxNS0xRUlVVUEpCT0ZFPD06QmNYSlZGMF55c3JuVz5RVVE6O0pZX1ZpdnJwdnh2dnJpVVJXXVRISkpKTFJUTVRbTFtVVlxVQGBnXl9uYlJHSEtWYWx2foGAfnx7e3l5e3t7e3x7endzcG9ubGxvb29uamVbT0E4MCsqKSgoKCkuNj5IUVhiZ2lqaWlpaWlpamxpZ2lkYV5aWVdYVU9IRUE9PkNJUFddZmtxdHh6fX5/f35/goWHjI+Pj46PkY6PkJGRkZGNi4mFf3x9fHx7e3t7fHx+fn+Af317e3JoXlNHPTg5QlNkc4CIi4uKiouLi4uLi4qKiYd9dmpfVlJXX2VucnV0c3BvcHFycXZ1dnh7fX5+fHp3cWpjWVhicjc3NjY0MzMxMTAvLy4uLS0tLSsrKyopKSoqKSkpKScqKSkpLCstLjEwMjU4PD1AQ0VJTVFVVldYW1pbWVhTTEQ/OjYxLi0sKysrKikrKykpKSkpKSkoKCgoKCkpKioqKikpKioqKigpKCgnJiYmJSUmJiQkJCMiIiIgHx8fHx4eHR4eHx8fHx8fHx8fHx8fICEhIiIiIiQlJSYnKy0uMDQ2OTxASE5VWmBkZGhucHN4enx8fn2AgoCAfHp0bmhhW1VNR0VDQEBESU5WYGhwfIaPlJeYlpaXkYqBd21rbnJzdXd8fn5+fn59fX19fX18fHx8fHx6enp7e3t9fn5/goKCgoKCgoKBgYGBgICBgYGCg4OEhoSFhoeHh4SDgX9/fXp3d3Rwbm1ydHd3d3Nwbm54hJehn5+hqKywsa6SNDhJWml1goySlZORkI6MiISCfnx5eHh4enp7e3lyYk5DUFNTXlhRUUlNVVZXUU4+PE1KQzo6OzpEY15SbGNccGlmg1o8UFtUPT1ARkxCWI6Ue294eHp4cmJWY2JSSU1LSkpNUlReXVtWU0pEW2hnZF5gc1xRS0pLWGNueX6BgH18e3t5eXt7e3t8enl1cm9tbWxsb29vbmplW09ANzArKikoKCkrMThCS1RcZGhpamloaWloaGhpZ2ViYFtYWFhTTklEQj46Oz9ETFNaYWdtc3Z5e31+fn5+f4KFiI2Pj4+Pj4+Oj5CRkZGQjoyIhoB9fX19e3t7e3x8fX1/gH18endyaV9VSkA6O0VXZnaBiYuLioqLi4uLi4uKiomFf3VpXlZSW2Job3N0dHNwb3BxcXN2dXd6e31+gH9+eXVuaGBibXk3NzU1NDMxMjAvLi4tLSwsLCwrKysrKioqKSkpJycnKCkpKSkqKikpKi0uLjAzNTk6P0NHTVNWWVtdX19dWlZQSkM/OjYzMSwsLCsqKisrLCsrKysrKioqKikrLCosLCwrKyoqKyspKSoqKCcmJiYnJyclJSQkIyMiISAgICAeHh8fHh8eHh8fHx8fHx8fHyAhISEhIiIjJSQlKCgsLzA0Nzk6PkBESlBRVFdcY2dpbnF2eHt+f4CBg4OBfXp2b2hhWFZRS0ZHS1JYYWdweoSKj5OXl5eXl5KMgXhzc3Z3eXp6e319fn1+fXt8fHt7fHx6enp6enh5enp6fX1+foKCgYKCgoKBgIKAgH+AgYGCgoKBgYOCgYOFhISEhoaFh4eEgoKAgH19fX1+f3x4c3aFl6Kfn5qdpquur66rmkE1R1lmdIKNlJWUkZCOjYmGg398fHp3eHd6e3x7c2lgU1NSXGhiV1RMTldYVFJLODVJQz07Ojc6PlRoZl5ELGBVVW9WUlFaSTw+S1VIO1Z9elpUYWJmZF9dWmFzaUdHSkpJTExUWFhQTUlOUWRjYFNSX2NubU5JUF5oc3uAf358e3p6eXp7e3t7e3l3c3FubGxrbG9vb21qZFtQQjcwKyopKikpLzQ8RU1XX2Vpa2toZ2doZ2dmZGRiYFtZV1JQS0ZDPTg3NjxCSFBVW2Bob3R3ent9fn19fn+ChYmOkJCQkI6Njo+QkZGRkI6NiYaCf319fHt7ent8fX5+fn19enl2cGlgVU1COz1KW2p5hYqMjIuLi4uLi4uLi4qJhH50Z11XWV1mbHN0dXRzb25wcXBzdnV3enx/f4KCgX15dG5qbnaANTU0NDMyMTEuLi0tLCwrKysrKioqKikpKSgoKCgoKCcnJycnKCgpKSkoKSkqLC4xMjU4PkNIT1VXXF5gXl5cWlVPSURAPTczMS8tKyssKywsLCwsKysrKysrLCwsLS0tLCwsLCwsKyoqKiknJycnJycnJSUkJCMjIiEgICAgHh4fHx4fHh4fHx8fHx8fHx8gISEhISIiIiMkJSgoKiwvMjU3Oj5CRERERUhMU1leYmZpbW92eXqAgoWJh4SCfHl2cGlkYFpWVVdaYWhueYGJi4+TlpaUlJOQh4F5d3d4eHl3ent7ent7eXh5eXl4eHV1dHRycnJzdHV2dnd3enp9fX1+f39/fn5+fHx+f39/f39+f4CBgYGCgoCAgoOGh4iIiImIhoWFhYWFh4WDgIGTnqCdm56hpqqqqKalnpZUMUhYZ3WDjJKVlJGQj4yLiIN/fHx4eXl6fH59fHhyZF9WV2FkYltSUFNQUlZQSzcuMzg7Ozg4PkNMYnFrRFZ2a1lUWm1fUEA+P1FKQUBCOjk8PTw8PD09R09RZVxCRUpLS0tIT1BVU1BRUlZXUD1NT1RUYWJXSlZha3Z+gX9+enp6enl7e3t7e3t5d3NwbWxsa2xvb3BuamRbTUE2MCsrKikrLDI3QUpSWWFnamtramlnZmZmZGJiXlpWU09MR0I9NzczMzc8QkhQV15la291eXx9fX59fX5/goWJjpCQkJCOjY6PkJGRkZCOjYmGg4F/fXx7e3p7fX5+fn59fHp4dW9oYVlQRT9BTF1se4aLjIyLi4uLi4uLi4qLiYR+dGdeWVlhaG92dnRzcG9ucHFxcnZ1d3p7foKEhYSBfXl1dHh/hzU1NTQyMDAvLi0tLC0sKysqKigoKCgpKScnJycoKCgnJycoKCcnKCcnKCkpKioqKiwuLzU6QUZOVVhcXmBhX15bWFJPSkVBPDs4MC0tKystLS0tLCsrLCwsLC0uLi4tLS0tLi4sLCsqKSkpKCcnJycnJyUlJCQkJCIhHx8gIB8fHx8fICAgHx8fHyAfHx8fICEhIiIjIyMkJCUnJykrLjEzNjk9Pj4/P0BER0xRV1xgY2dpbXB1en6BhoeGh4SAfXl1cm9pZWRkZmtweIKIiouOj5SUk5GPi4V9eHR1d3V2dnV1dnV1d3Rycm9ta2pqaGdnZ2VmZmRmaWtsbXBxcnN0dXV1dXR1dXR0dXZ2d3h5fH1+f4GCgYGCgIGBhYWGiIeHiYmJiYqKjIuMi4mTn5uZm6CjpKSinZyalpSRczNEWGd1g4+UlJOTkI6NjIiDf315enl5eXp8fX13c2ljXVtkZGVjWFhYWVZWU0M2Mi83PTw6Nz5LU3h4XUhQaHBqZ1hVUVFAQT88Nz5CREZHR0ZFR0ZGTVRGP0JCQ01QTktLSklJT1ZXWVNFRU82OEZVVUdDWE1YZG14f4B/fXp5eXl5e3p7e3t6eHZzb21ra2tsbW9ubGhiWUs/NDAsKywsLjE4QEdOVVxkamxqamhoaGdmZmNfXlpVUUxIQj46NC8xMzY6QERKUVlgaG1zd3p9fn5+fH5/f4KHiY6Pj4+Pj4+PkJCQkZGRj42LiISBf359e3t6e319fn59fXp5dnJuZ2JaUEdCRVBhb32Gi4uLioqLi4uLi4uLioiFfXJoX1pbY2tzd3d2c3BtbnFxcXJ0dnd3eX6Dh4iHhYKBfHyBiI0zMzQyMTEvLy4sLCsrLCsrKiooKCgoKCgnJycnKCgnJycnJycmJicnJykpKSoqKioqKiwuMTk/RExPVlpdX2FhX1pYWFVRS0dCPjczMC4uLS4uLi0sLC0tLS0uLi4uLi4uLi4uLS0tLCsrKyonJycnJycmJiUlJCQjIiAgICAfHx8fHyAgICAgICAfICAgHyAhISIiIyMjJCQlJycpKi0wMzc3Ozw8PDw/Q0dLUFZZXV1gZGZqbXJ3e4CEiIiIh4WBfX14dXNxcHJ0fIKIiYqNjo+Tk5KPjYqCenVycXNycXJxb29sbGdlZWVhYV5dWVhXVVVWV1dXWlxgYWJkaGhpaWpqamppaGhqamloaWtub3J0d3p8fn+AgoSEhIODhIWGh4iIiouNjYyOjo6XmpiUmJ6ioZyUiIB8j5KNjYJBRlhndYOMkpSTkI6OjIqHg39+fHx8enp7en19e3ZfYV5WX15kZFpXVl5fUVdDOTMyOTs7OTc4QEhFNT1JS0NBbG9pVUc+OkNBPUdEQj08Ozs4ODU5OUBUTkZAP0VKSkxLSUZITlliW1VNRkpVV05FS0pFV05VXGVxeoB/fnt5eXl5eHl6e3t7enh0cW1ta2trbG9wbmxoYlhKPzQvLy8wMjU5PURKU1pgZ2tramppZ2ZmZmVhX1pWUktEQTs2MC4sLzI1PEFGTVRcY2luc3d6fX6AgIB/f4GEiIyPkJCPj4+Pj5CQkJGRkY+Ni4aFg4B9fHp6ent9fX5+fX16eXd0b2hkXFNKRUhSY3KBh42Li4qKi4uLi4uMi4qKhX1yZV1cYWhtdXh3dXNwb3BwcHJxcnR1dnl+g4eJiYiFgoGDiIyOMjIwMDAwLi4sKysqKSkqKioqKCgnJycnJycnJycoKCgoKCcnJycmJykpKSkqKioqKioqKi0wNjpAR05TWlxcW15fXVxbWFZTTUlDOTMxLi4uMC4vLy4uLy8vLy8vLy8vLy4vLy0tLSwrKysqKSkoKCgoJiYmJiUlJCMhISEhHx8eHh8gICAgICEhHyEgHiAgISEiIyQkJCUlJSYoKSorLi8zNjk8PT09QUVHTFBUVlhYWVhbX2Nob3V6f4WKjIqIhoOBgH18enl7fYSJiYuLjI6RkZGRkY6HfnNxcG1tampoZGNgXFtaWFRSUE9NSkhIR0VDREhISUtNUlJWWFpbXmBgYF1eXFtdXF5fXFtbXV1hZWpucnV4e36BgoKEhYWFhoaGhoeJi4d9hI2Vl5WTlpyhopmJfHl7cHiMjIuJXExYaHaEjJGTko+NjYuJh4N/fXFib3p6eXyAfYJ+aVtXWFpeZGhZSEpOSz1LRzdDOjo7OTU2Njk7RDs3P0dBTVNTdmRQPzxDQ0pIP0Y4SnJ9d3NuVlQ9TWpQSkNGSkhHRUZDREdPWFZPTktGREdHRVdJUVlTU19sdHt/fX16eXh5eXp6eXt7enl2dHFuamprbGxucW9tZ2FVSEA2NDU3OTxARUhMUlZeZGlsbGtraGZnZGRiYVxXUkxFPDcyLSkpKi4yNzxDSE9YX2dqcHV3en1+f3+Af4CCh4uOkJGQj4+Pj4+PkJCRkZCPjIqHhIKAfXt8fHp8fn5+fn59enl3c29pZF1WTUhLVmZ1g4iMjY2Li4yMi4qKiouLiIV8c2ZeXWNpcnd4d3VxcHFxcHBxcnJycnN2fIKGiYqKiIeHiIuOkDExMDAxMS8sKikqKigoKSkpKSgoJycnJycnJycnJycnJiYnJycnJicpKSkpKSkqKioqKioqKi0yOD9FSk5TV1laXV9gYWBgX1lTTEQ6MjAwLi8vMDAvLy8wMDAwMDAwMDAvMDAuLi4tLCwsKykpJycoKCYmJiYlJSQjISEhIR8fHx8fICAgICAhISAhISIjIyMjJCUkJCQlJSUmKCssKy4wNTc7PD1AQEVJSk1PU1RUVVRVVVdbXmZtdX2Ch4yLioiEhIWCgX9+f4SIioqLjIyNj5CRkZGOh3pya2hmZGJdW1hVU1BLSEZCPz49Ozg3NzY3ODk+QUNFSEtMUFNVV1lXV1ZVVlRTUlFRUFBPT09PUVRYW2Flam92en1/gYSFhYSEhYWFhYeBcH+Mj4+UmZ2dm5eLgX1+fnxufIqMi3NMWWd2hIuQk5GPjY2LiYeFgoFpYW1jeoGFh4iNgndqYlxWVGFcRkNIUVJIUmJdTDo6OzY1NjU2NDlFQDZYaF9VTlRZT0Y7PzxAQUVJPTRjf3tuV2RqTUtMSEpJS01KRkNCQkFBSExNTUtFPT9AQEtQRVdYXF9ibHV8f319enh3d3h5eXp6enl4enpya2toZ2trbG9va2ZgVUpAOjo7P0JESE5SVlldYmdrbW1paWhoZmZkYF1YU05IPjUvLCkpKSouMjc8Q0hPWWBla3N1d3p+f39/gH+Bg4eLjpCRkI+Pj4+Pj4+PkZGPjouIhoSCgH99fHx8fX5+fn5+fXt4dnJtaWVfWE9MTlhodoSKjIyMi4uMjIuKi4uLi4iEe3FnYGFnb3V6end1cnFxcXBwcXJycnJydHl+hIiKiomLi4uNkI8yMTEvMDAvKysrKyopKCgoKCgnJycnJycmJiYmJiUmJiUmJycnJygoKSkoKCkpKioqKioqKSkrLC40OkBFSU5TWFleYGFiYmRlXlVMQTYxMC8uMDAwMDAxMjIxMTIzMzExMTExLy8vLy4uLSwrKyopKSkoKCcmJiYlJCIiISEfHyAgHyAgICEhISAgISMmKCkoJyYlIyQlJSckJikqKywvMjU5PD9CRUdJS05NUFJVVVdXVldXWF9jam96goeNjIqHhYWGhoaFhISFiImKioyMjI2PkZKRj4d8cWZeXVpVUk5JQz89Ojk1MjEyMjMwMjIyNTk9P0JGSEpNUFNVVVdXV1dWVldTUE9OS0hEPz46Oj5CRUpRU1lfZGlwd32Ag4eGhYOCf4OEh4qOi46Ql5yclJCMioR3c3+De3J8e3uCWlpndYOJj5KQj46Ni4qIhIaLd3Bxcm+LlJSRjHhrb2hdWGZjXVtGR09aY21mO01HOjc4Njc4NjU5QkRFWmBUT0hJSkBAPT9CTlpjSDwyV3ptXU1QWFJOSk1OSkdGTE1GQUE7Oz9ER0lJRklKTEpPTz9YWFJiaG94fn59fHl3dnZ3d3Z5eHp3dm9ob3qCfnNsam9yamlnXFNMSENFR0pPUlRXWVtgZmhqa2xra2poZ2ZkYV9bVlFKQTgvKygoKSgoLDM4O0JMU1phZ21yd3p7f4B/gH+AgYSGio+RkI+Pj4+Pj4+QkJCOj46LiIWDgX9/fX17fX1+fn5+fXx7eHVxbWpmYVlTTVFcbHqEi42MiouLi4uMi4uMi4qIgXxyZmNnaXN5e3p2dnNzcG9vb3BxcnJvbnF1en+FiIqKjIyQkZGPMS8vLi0tKyorKioqKCgnJycnJiYmJiYmJSYmJiYlJiYlJicnJycoKCkpKiorKyoqKioqKioqKywsLDA1OT9FSU1TWV5iZGZpaWZeVEg8MzEwMS8wMTExMTIyMTEwMjIyMTExMTAwLy8uLi0sKysqKSkpKCgnJiYmJSQiIiEhHx8gIB8gICAhISAgIiQnLC8wMC8tKycmJSQmJicoKisvMzU5PUBDRklLT1BQUVJSVFZYWlxdXV5hZWpyeICGjI6Mh4WFhoiIiIeHh4eIioqKiouNkZSTk5CJfGxcUU5MRj87OTUzMS4vMC4uLi4tLzIzMzY8PkJFSEtNUFJUV1dXV1hYV1ZUU1JOSkZEPjo0MS8uLjI4PUJJT1VbYGdudnp+fYB6dnmCio2QkJGZm5mVkY6Qjo6NiXtuc21seYCOm5Z2fnaAjY6CeoOLjY2NjZGTj3RwfX9weJCSlIJjYWdqY1VcW1xQUE9JWmRYORxNSz04ODc4Ozc2PT9HY1RONzw2OD1GREFBQ0tXXUNGPGFcYmVbQD9KRE5aVlBIRkZIQz0+Ozg9QUdJSUpMTE5PUVhaWFlYWmVweX19fHt4d3V2dHl4c3N2cGZKTFtwhpl/YFhcU0dLW15ZUUxISkxRVlhaW15jZmttbm1ubGppaGdlY2JgXFRNRz00LSooKCkoKCwyNz1FTFNbYWhudHh5fH+AgH9/gIGEhoqPkZCPj4+Pj4+PkJCQjo+Oi4iFg4F/fHt6en19fn5+fn19e3hzb2xpZmFbVVJVX219h4uNjo6Li4uLjIuLjIuKiIF7c2lmaW10ent6d3Vzc3Jwb29wcXBwbmttcXZ7gYaIioyOkZGRjzAvLi4tLSspKikoKCkoJyYmJiYmJSUlJSYmJiYmJiUlJiYnJygoKSkpKSkpKioqKioqKiorKywsLS0tLjA2PEFGTFFYXmRnbG1rZVtOQjcxMTIyMjEyMjIzMzMzMzIyMjIyMjIxMC8uLS0tLS0tKyoqKigoJyYmJiUkJCIhICAgICAfICEgISAfIiYrLzQ8Pj4+OTYwLCkoJykpKSouMTY5PUJGR0pMT1BSVFRUVFZaXGBkZWVlZmlxdXuAhYyNjYmHhYaJiomJiIiHiIeGiIiKjI+Sk5KMiHpoUkVBPTk3MzEwMDAuLi8tLS0tLi4wNDg8P0JGSUpMT1JSVlhYWlpaWlhYV1NTTUtGQjs2MC0tLSsrLDAxNztBSFJZYGZtcHZ1f4yQj5KTlZqfnZmEbZGJkpKRkpCNg6G0vL2+vr67sJ6RfXmBh4FxdIKHiHpZe4NreouCbWN1eHdqXGZqa2hlYmBSVFVLRU9iXCsoPT48Ozk7QEU8OTg6RkNARz86OTg3TEBBQ0VKVVNGSV9dU1plUlJYOUJocmhVSUZEQUJCPzo3O0BDR0hJS01QUlJVWFtbWGBmb3p+fXx6d3Z3dXV5dF9gd2hia3JubmFgSkdGSU5ORVliXFVQUFFWWVtdYGRlaW1vcG9ta2lqaGhnZWVgXVpUTEQ7MSopKSkoKSktNDk/Rk5VXGNqcHV3e31/f36BgICAhIiNkJKQkJCQj4+QkJCQjo2Li4uIhYOAfnt5eXp9fX1+fn59e3l2c3BsaWVhXFdVWGJwfoiMjYuKi4uLi4uLjIyMi4eAe3Nsa21yd3t8enh0c3Nvb25ucHFxbmtoaGxwdn6EiIiNkJGSkI8vLi4uLSsqKSgpKCcoKCYmJiYlJSUlJSUlJSUlJSUlJSUmJycoKCkpKSkpKSoqKioqKioqKyssLCwsLC0sLjI5PkNLUVlgaG1ycWtjVUg6MzIyMjIyMjMzNDQ0NDQzMzMzMzMzMjEvLi4uLi4tLSsqKiooKCcmJiYlJCIhISAgICAgHyAfICAiJSovMzlAR0tLS0dDPjcwKykqLC0vMTU3PUFGSkxPT1JUVVZWWFhcYGVobG1ubm5wcnh9gYaLjIyIhoWGiImKioqJh4eGhIaGiIuOkZSQjId7aVFEPDc3MzUzLy8uLi4uLS0tLTAwMzY6PkJESEpOUVFSVldYWVlaWlpYV1VVUk5KRkA5NTEtLCwsKyssLC0wNTtETFRbYmV1jpSXkpSVmZ6fmHlrb22OkJKRkpKSoba7ubu9vb28u7u0loeDiH92cGloamtfXWB2d3l7a1VWcoNuVVpqbWpsbGBdVFFUTkpTdnU8NDEzOzw8OkBLRzg0Nz9GRExFOzw5O0o8QUNFSVVLSD1NaWVaVkpWTztubm5pWExFQD49PkE8ODo8QENER0lKS0xOUVZbW1hdZ3F1fH14eHRzdnZtVXNtbGRdXmluZl5DRE5QUUpESF1sZWBaVVRXWlxeYWRmaWxvcXFvbWtpamhoZ2VlYFtYUUpCOTApKCkpKSosMDg7QUlPV15lanB2eHt9f39/gIB/goWKjJCSkJCQkI+PkJCOjoyMi4uJhoOBf317eXp7e3t8fX19enl2c3FuamdkYFxXV11lc3+KjY2Li4uLi4uLi4yMjIuHgHtzcG5xdXl9fXt3c3NzcG9ubm5ubmtpaGlqbXF6gIWIjZCRkpCPLS0sLCsrKCcoJycnJiYmJSUlJSUlJSUlJSUlJSYmJiYmJicnKCgpKSkpKioqKioqKioqKiwrLCwtLS4uLS0uMjc6P0pSXWhtcXNvZFhLPTQyMjIyMTIzNDQ0NDQzMzMzNDQzMjEyMzExLzAwLi4sLCsrKSkoJycnJiUlIyIhISEgIB8gISIjJCgvNT1HTVJWWVtWUkpDPDYwLi8wNDQ5PUNGSkxPUlJVVVdaWltcYGJmbXJ0c3Fxc3V5foKFiouJhoWFhomLi4uKh4WEg4GBgoaJjJCSko6LgG9dUkxEPDg0NTQxLS0vLy0tLS4yMjY4PkJFSUpMT1BTU1ZXWVlaW1paWVdVVFBMSEI9NjEuKyssLCwsLCwtMTQ4P0lOVFltkZmWloyOnZqUkX1dNWOFhImQkZSUn7i+vLu/v769vL62s7qkhIiGiYF8X1JnY3NwZ3d6e3psV1xkWExbY2ZiXWFnV0hHTk1MWm1oSjo5SUQ+PDhEQTk2NzNFWVNBMzk8PElNQkRFQ0pWRUQ5TXdwazJCQEF1eW5nYFJORj8/PT4+PDs6PkJEQ0RGR0ZISlBTV1lbXWdxd3h6eXZ0c2xybm1vcmZHNkBkYUhLS0xMSEZMXGtwa2hjXVlXWVpfYWNoaWtvcHFwbmxqaGhoZ2ZkY2BaV09HPzUtKScnJyssMDQ6QURLUlpeZW1ydnl7fX9/f35/f4OGiYyPkZCQkJCPj46Pjo6MjIuJh4WCgH58enl4eXt7e3x9fXl2c3BsaWhmY2BcW1leZ3WBiYyNjYuLi4uLi4uMjIuKh4F7dXFydXl7fn16eHRzcnBwb29vb3BtamdmZmxwd32CiIyPkZKPjS0tLCwrKScnJycmJiYlJCQkJCQkJCQkJCQkJCQlJSYmJiYnJygoKSkpKSoqKioqKioqLCwsLC0tLS0uLi8xLy4yNDtETFhianN2cWlZTD01MzMyMzIzNDQ0NDU1NjY2NjQ0NDMyMzMzMS8wMDAuLS0sLCkpKSkoJyYlJSMiISEhICAfICEiJCgtNT5IUldeZGVnZmFZUUdBOzU0NTc6P0NHSkxOUVRWWVlaW1tcYGVqbnJ2dnZ0dHZ5eX6ChoiIiISEhYaHiYqKh4WBfnp5eXp/g4qPkpGPjYV5bGNcV1BJRDo3MS4vLi4tLS0wMTY4OkBESElNTk9QU1NWV1lZW1taWlhYVVJQSkU/OTQvLSwsKywrLC0uMDM2PEJITlRUhZ6Zmp1+a3luXXB4ipWYlYp7XF2Elba9vr28vb6/vrmmbHOzuLCGmJ2hd0laaHWBgXp8e3t7c2NSV2JPUVFfUUFBS1heUU5MSU9MUVg+OEZFQTw1Q09ROTg3PElgSkxQTlVPQ0RCUkxKVEJGPFZ4a0Q+PDxxeXdxZWZYSEZGREJAPTo5Oz1AQ0RGR0hJSk1RUlZYV1dodXh3e3l5dnNuYGRtam9qaV9ZX09KS0tIRFNla2xubm1rZmFcWl1eYmJlZ2xtbW9vb21ramhoaGZlY2JeWVVNRT00LCknJycrLzM4O0JFTFRaYGhtcnZ5e31/f39+gICChYqNj5GQkI6Oj4+OjY2NjIyLiYeFgoB+fHp5eHl7e3t7eXl3dHJvamdnZWNgXFtaYWt2gYmNjIyMi4uLi4uLi4uLioeBe3VxdHd7fX99enZ1c3JwcG9vb29wbWpnZmZpbnV7f4WMj5GQjYwsLCwrKignJyYmJiUlJSQkJCQkJCQkJCQkJCQkJCQkJCYmJycoKCkpKSkqKioqKiorKy0tLS0tLS0tLi4xMzExMjM4PkdUYGpzdHFqW008NTQ0MzMyNDU1NDQ2NjY2NDQ1NTU0MzQzMzEvMDExLy4tLS0qKSoqKSknJiQiIiIiIiAgHh8hIyYrMztHUFhhaG5vcXFsZ11UTEY/PDo9QURISktQUVNWWFxbXFxcYGNobnJ1dnZ2dXZ2eHt+goSHh4aEhIaEhIWEgoJ+eXZ2c2xvdXyHjJKSkI6KgXdxbWlhW1ZPSD85My8tLi0vMDM4PUBCRklKTE5QUVNUVldZWltbWlhWVVRSTUlCPDcyLy0sLS0tLS4vMDI4PUBGS09UcZycnaCkk3JZZ2h1gHePlIyJinZ2b527vr6+srC8vr+9uJN2p7qvhX+dmINRPEheb3Z+eHR3em9UQXNnWllcXkg9Pzs8TWFQTU5NS0JLT0RAQEE9OEJJRDg5Njg5PjZPVk9AS0NGQ15ZTFFBRTpueU0wPUJwcnd4dGVoXkpHR0RDQDo3ODo8PkFDRUZISEpQVVVVWFFYbXZ6eHhzSFpzcGdaYWZlcW9fVExKTk5MT2Zsa2xsbW5ua2hkX1xdXV9gY2NnaWlrbWtrampoZ2ZlZGNgXVhSS0M6MSwpJyYoLDA0Oz5CR01WXmJocHR3enx9fn5+fX5/g4aKkJGQj4+Ojo6OjY2NjYuLioiHhYF/fXt5d3h5e3t7enl4dXJuamdlZmRjYF5cXGRueYOKjYyLi4uLi4uLi4uLi4qHgXt1c3V5fH1+fXl3dHRzcHBvb3Bvb2xpZmNlaW50eH6EjJCRj42LKysqKiknJyckJSUlJCQkIyMjIyMjIyMjJCQkJCQkJCQmJicnKCgpKSkpKioqKisrLCwtLS0tLS0tLi4uMTMxMTIzOD5HVGBqcnVzaVpKPTQzNDMzMzU2NjU1NjY2NjU1NTU1NDM0MzMyMTEwMTAuLS0tLCsrKikpJyYlIyMjIiIfHx4fISMoLTVASVReZm91eXp4cmxmX1VRTUdFR0pJSk5PUFRVWFteXV9fX2Fla25vdHZ2dXNzdHV5fICChIWEhoaDgH5+fnt3c3BsZ2NeYWdxf4eOkpGPjIh+eHh1cW5rZF5WTEA5MS4vMTU4PD9CREhKS01OUVJTVFZXWFlaWlhWVVRSTklEPzkzLy4tLS0sLC0uMTQ4Oj9ESEtQX5acnKGio5qHe4GJjo54bWB5dXthaHyjub69up6ZrLe9vb2siZOwpYd8mIppT1RPbnpvWV5kbG1sZWqAZV1YVEw/Ojk+RUlUUk1LS0tUTUtFQUI/PjxDRT89Ozo7QTo7S0xJQUBFRkpXWFBKQ0I+elYxMj9iX2Z2dnNrXllRRkZGQ0I+Ozk4Oz0+QkRHSEtMT1ddW1lZZG12eXd1cTtRc2Q+W29rdndOQ1NPSkVRYmloZ2pqbG5vb21nY19cXFxcXlxcXmFkZmhqamppZ2dmZWNiYFxXUElBODArKCcoKy4zODw/QUdOVl1ka3B0d3p8fX5+fn1+f4KFi4+Rj4+Pjo6Ojo2NjY2MjIqIhIKBf3x6eHd4eXt7enl4d3JvbGhmZGVjY2BgXl9ocHuFio2Mi4uLi4uLi4uLi4uKh4F8dnR1e3x+fXt5dXRzcnBwb29wb25rZ2ZjZWlucHd+hIyQkY+MiiknKSknJiUlJSUlJSQkIyMiIiIiIyMjIyMjIyMkJCQkJiYmJygoKSkpKSkqKyssLCsrLS0tLS4uLi4uLjE0MS8yMzg+R1VfanR5cmhbSDszMzM1NjU1NjY2NjY2NjY2NjY2NjY1NTU1NDQzMjExMC4sLi0sKyorKicmJSQjIyIhIR8hISMlKjE4Qk1XYGhyeX17eXNvaWNeWldUU05OUFRTU1JUV1lbX2BgYWFjZmlrb3JydHNycnJ0dnl9foKEhIOBf357eHRwbGdjX1hRT1JZZXF8ho6Pjo2JgHx9fHx5eHRuaWJZTkI7NjU6PUBAREdKTExNTk9QUlRWV1haWFZXU1JPTUlEPjo2MzAuLi8vLi4xMzU4PD9DRUtSUnudmpqinpqLaWqNpZiIhYRoWlReZnyftp2ru7yxm6WvpKCyo4Z9laCYhp+SfV5edHFfWUxLU2hpXWluaXFeWFI6Ojs9PzhKUE9GTEZFU0tFREhKTFNCODw/Ozo7PVBNU0hHUExBREBhXVJRQURASmgyNztNWl1ndHVwal9VTkpGQkNDQj48PD5AQkVGSUpPUFJVW15ZXGJudnh3dHRxdXNkUWRvdm1LP0dLSkdXbGppaGlrbGtubm1qaGJeXFpaV1RSU1VZXF9maGpqaWdnZmVjYV5cV05HPzUuKCYmKiwwNTk8QERIT1ZfZm1xdXp8e3x9fXx8fn+DhouQkZCOjo2NjIyNjY6OjYyKh4WDgX97eXl4eHl5eXh4dnNwbWhlYmNlY2RhYGFlbHSAiYyMi4qKi4uLi4uLioqJh4WCe3Z3eHp9gn97eXZzcnFvb29vcG9sa2dlYmRnbHB2fYWKkJGPi4kqKSgoJyYlJSUlJSUkIyEhIiIiIiIjIyMjIiIiIyMkJCYmJicnKCkpKSopKisrLCwrKy0tLS0uLi4uLi4vMzIxMjM4PkZTXml0eHNoW0o7NTQ0NTY1NTY2NjY2NjY2NjY2NjY2NTU1NTQ0MzIxMTAxMTAtKysqKignJiYlJCQiISEhIyMkJyoxOUNNV2JqcnZ5eHZwcWxoZWReXFtZV1pcWlpZW1xfYWVmZmZmaGlqbHBxcnNycnFxcXR5fYGBgIB+fXl2cm1oZF9bWVRHQUJETVlndoSNj46LhH17fX9/fn59enZza2RZTkM/P0BDREZJS0xMTU5PUFFUVldZWFVSU05NTUlEPzo4NDIvLy8vLzEyNTg6PkBDRkhKTl6Vmpqen5eMd1dciaSnloR0YllhZElaj76uhp2ytamunW5xi6GafWWNmYqZi2dhZ2ZdY2RZVFdmXFRlaWljXGJSOzw+RD08RlJOSlJRQ0lOT1FNTlJaRTw+RT04OzpIW2ZMS1BDQ0JHYFJVWEFGPVc9PkNHUFhLTnF1cGdfV05KQ0FDQ0A9PD5AQUNGTUxOVllXWlpbXWBocnh5dnVwb3Fwbm5yeWZKQkpKQ0FKYmVmaGhoaGtsbWxraWVfW1lYVE9NSkxLUFlfY2dpamlnZmVkYmFdWlVORz40KycmKCsuMDU5PkBFS1JYYmduc3d6fHt8fX18fH6AhIeMj5GQjo6NjYyMjY2Ojo2MioeEgoB+e3l4d3d4eHh5eXZzcGpmYmBhZGRkYWFiZ294g4mMi4uLi4uLi4uLi4qKiYeFgHh2dXd7f4F+end1c3Jxb29vb3BvbGtmY2JkZmtwdn2FjJGQjYuJKSgnJyUkJCQjIyIiIiIhISIiIiIiIiMjIiEhISEiJCQmJiYnJygpKSkqKysrKywsLS0tLS4uLi4tLS0tLzEzMzEyOD5IVF5qdXhyaF1MPTU2NjY1NTc2NjY2NjY2NjY2NjY2NjY2NjY1NDQ0MjIxMDAwLy4sKyopJyYnJiUkIyIiIiIiIyYrMjpDTVdgZ25vcG9vbWxqampoZ2NiYF5eX19hX2NlZmhsa2ppaWpqbG5xdHNycW9ucHF2en6Af3x6eHZxa2VfW1dSTkpHQD5AQkZQYHGBjI6NiYF6dXl7foGBgYB+fXl1b2VZUElIR0dHSkpKSkxOTk5RU1VWVlNRTk1KSUdEQDo2NDQwMDEyMzU3Ojw+QEJFR0lKUFOEnpicn5iSgXZZUXiPlph+d2aHjV8oIH29u6mEfZesrp13W2WBmIk+WpOgmHpVWVxddHdtX1xdWlNWbWhnaFZIRTk9TVNGQD5UZFxgdVtGTE5OR0NVQT1APUNBNzc5RFdTPzVDQkRDO0BPXE8+RD87OUBKTVVTTFlqbnFqWk9NSEJAQkI/PDo9QUFDRlNVU11iYmFgX15ianN4eHdzcHJwa0hUeHZGRk1ORkxnamZkZmVlZ2lqa2trbGZgXFZVUU9HQ0BDRE5WXWRoaWloZ2ZjZGNhXVpVTUU8MywoJykrLzI1Oj9BRkxSW2RpcHV4e3t8fHx8e319gYSIjY+Pjo6Ni4uMjI2Njo6NjIqHg4B+fXt5d3h3eHh4d3Z0cWxoY19eXmNkY2JhZWpxeYKKjI2Mi4uLi4uLjIyLiomGg394c3V3e319fHh1dHJycW5ub29xcGxqZ2NiZWdsc3h/hoyRj4yLiSgmJiYlJCQkIiIiIiIiISEiIiIiIiIiIiIhISEhIiQkJiYmJycoKSkqKisrKyssLC0tLi4uLi4uLS0tLS4wMjIxMjg+RE9bZXB2dGthUEA3Nzc2NTU1NjY2NjY2NjY2NjY2NjY2NjY2NTQ0NDIyMzIwMC8uLCsqKScmJyYlJCMiIiIiIiMmKzI7QUtVXGNlZGRjYWNmaWpqamhnZWNkY2VmZmhrbG1vcG5tbW1ubm5xc3RzcnJwcHF2enx6enp3dXBrZl1XUUpIRERBQD4+PT5CSlpsfYmMi4Z8cmdrcXZ7fn+CgoOAfXt0bGVbU05LSUlJSkpNTU5OUFJTUk9LS0lGRkRDQDs4NjMzMjI1Nzk7PD5BQ0RGSkxNUVFknZ+coJyRg4KFY1FmhIOGg4OBn5taKiN4vLu0pYJdfJybiGJWa46Ne2xwlqRmQ1xfY3qSknZtZGJcaGFWXFg9OT9ES1dZRDlCQmNcV2JZS0ZDQDpMVDM4PklKPDQzNT5GSkhEQUdARTdAR1Q9QDw9OkhdWFtdP0VPTV5eX1pPPz9AQUJCQkA9PkFBQ0ZUWVdfY2VjYmFiZ2x0eHd0c2xgXHJsZl9UTUNMW2RzbWhlZGNiY2Voamtra2hjXVlST0pDOjc2PERNVl1maGlpaGZmY2NiYFxYU0tCODAsKCcpKy8yNTo/QkdMUl1mbHJ1eHt7fHx7e3t9fYGEiI2Pj46OjYuLjIyNjY6OjYyJhoOAf3x6eHZ2dnd4eHZ0dG9rZWBeXV1gY2JiY2Ztc3uEio2Li4uLi4uLi4uLi4qJhoJ+eHN1d3t9fXx4dXJxcXBubm9vcG9samZkZWVpb3J6gomPko+Mi4kmJSYmJCQkJCQjISEgICEhISEhISEhIiIiIiMjIiEkJCcnJicnKCkqKyssLC0tLS0tLS4uLi4tLS4uLi4wLzAxMDE2PERMWGZuc3RtYlNIPTY1NjY1NTc3ODY2NjY2NjY2NjY2Nzc3NzU1NDQ0NDIxMTEvLy0sKyooJycmJSUjIiIiISIlJisyOUFIUFVbXFhUUlZcYWZqbGtpZ2dmaGhobGxsbnBycnJwb29wcHJ0dHd4dHJyc3JzeHl5dnZzb2plX1lSTERAP0BAPz09PTs9QUhWZ3mHioeDd2hYWmFpcHd7gIOCgoSCgHt1b2ZcVVFOSklKTExOTk9QUE5IRkRCRURCQT47NzU1Nzg3OTw+P0JERkhLTE1PUFFUg6Ofop+ZiXCIi3VQV3yBe3Zze6CXQCojaLq5trKmhWBkdoODaWB9h31wY4SLT0Rmco6IjZKKfXxjYWNTUlhcUjM+S1Nea0YvMDVNU01RSklGREREVzs4OD1ANzMyNTQ4REQ7Pj9CQVNAQUZAPUJKUkhWZ1FRV0BGQDBPT01QQDs/REZIQj8+P0BCQkRIUVlaX2ZnZGRlZmludXl4dXFwY11qZ0pIU05NWWVzbmllY2NiY2NlZWlpaGdkX1pSTEdAOTIxNTpDTFZdZGZoaGZlZWRjYV5bWFFJQjcvKignKSwwNDY8QkNIT1dfaG1yd3l6fHx8e3t7e31/hYqNjo2MjY6Li42Njo6NjYyLh4SAfn18eXd2d3Z3d3d2dXJtaWNdWVxbX2FjY2RocHh+iIyNi4qLi4uLi4uKioqKh4SAeXRyc3d7fHx7eHVycHBubm5ub25tbGpoZ2VmaW5xfYaNkJCPjIuKJiUkJCMjIyEhICEhICAhISAgISEhISEhISEiIiMjJCQnJycnKCkpKisrLCwtLS0tLS0uLi4uLS0uLi4uLy8vMDAwNDpAS1dianFyb2ZZTkQ8Nzg2NTU1NTU1NjY1NTU1NTU1NTY2NjY1NTU0NDQzMTExLywsKyopKCcnJiUlJCMiIiEiIyUoMDY+Q0tRU1NPSklPVFphZWdoZ2hoZ2lqam1ucHFxcXJycXFxdXV3e3t7end0dHV2dnd1dHJvbGdhW1NLREA+Pj8+PT48PDs8PUFHUmN4hoqHgnVjT0pPWGJrcnp/gYWGh4WDgHl2b2RbU09LS0xMTU1NTUhGQ0FAQUJDQkE9Ozw6OTs+QUFCQ0RGSEpMTk9TVVFTY5qhnZ6XkXFZfod0Xk1kfXt2cXWQgjIqKk21tLGwq52IcmlqbW9odXxtZHR2Yj4+WIOhmZaVjIF1ZltVS01YX15HS0JGWlVEMzI5PjU6TklJQz47RlM6NTg5PEY7MjIyOEBORj0/N05ZUVlLOUJDUUFIVlVPUk43QDIwSUtZQDY6PkNGSUZBPz9BQUNHSFVcWVpjaGNlYWdtcnt3c2peZ2deXlJHRjo6S1Nfcm1pZWNiYWRkZGhnZ2dmYF1VTUQ9NS0sLjM8Rk5YX2RmZ2ZlZWNhYGBeW1RPSD83LyooJyksMDY5Oz9DSE9ZYWlvdXd5enx8fHt7e3t+gYWKjY6NjIyMi4uNjY2NjY2MiYWCf319enl3dXZ3eHd3dXRxbGZhW1hXWl9hYmNmbHF5goqNjYyKi4uLi4uLioqKioeEfnZxcHJ1eHp8eXd0cnBwbm5ubm5ta2pqaGdlZWhtcX2GjZCQjYuKiSYkJCQjIyMhICAgISAgIB8fHyAgICAgICEhISIkJCUlJycoKSkpKSorKywsLS0uLi4uLi4tLi8vLy8uLi4uLy8wMDI3PEZRXGZrcHBpYldNQzw5NzU1NjM0NTU1NTU1NTQ0NDQ1NTQ2NjY1MzMyMzMxMS8tKysqKCgoJyclJSQkIiIiIyMlKS4zOj5ESEtLSEdGSU9WW15gYWRjZWdpamprbW9wcXFzcnN0dnd4ent7fHx5d3Z2dHJwcG9saWVeVkxEP0A/PT49PT09Ozs7Ozw/RlBhc4KJh4J3ZE07QEVOWWNteH+EiIeIh4WBfnl1a19WUE1MTUxNTEZDPzs6Oj1BQ0NDQ0NDQ0REQ0REREdKS0xOT1FPUVJVVXCjoZyZlINKTG6Pg2xQT3F4d3dwgnAzMTA1o66nqKSKgHhqYFRZV2ZqY21saFM4P1SDpaCTl5KSlHRJPF5vYltUTkxGQ0NLUkQzQEQ5Ojo4Pkc0M0JLSz8zQT4/NzEzMDU5REM+PFBlYGlfOz08QU5RSUVPSE1NOzxGPUNAPzgxNz9BQEBBQUBAQUFISUpNTUxSYGhnZlpfcGVkY1RLREVKRU9PSkBCTkNJZHVtZ2RhYmRkY2VmaGhmY15YUEY8MyspKS81PklRWWBlZ2dlZGRjYmBfXFhVUEc+NC0pKCgqLDA1ODo9QklSWmJqcHZ2eHl7e3x7enp7fX+GiYyNjYyLi4yLi4yMjI2Ni4iEgX99fHp3dXR1dnZ2dXRyb2plX1pVV1ldYGFkaHB0eoSNj46MjIyMjIyKiouLiomHg310cHBwdHZ4enh1cnFxb25ubm1tbmxra2lpZmdobXN+h42PjoyLiYkkISMjIiEgHyAgICAgICAfHx8fHx8fICAhIiEiJCQlJScnKCkpKSkqKyssLC0tLi4uLi4uLS4vLy8vLi4uLi8vLy8wMjlBS1dgZWtwbmhgVUxGPjs6ODY2NDQ0NDU1NTU0NDQ0NTU0NjY2NjUzMjMzMjEvLSwsKyooKCgoJiUlJCIiIiMjJSYrMDM5PkBDQkJDR0lOU1dZWFtcXF1fYWFkZ2lrbXBxdHN0dXh5eXx8fHx8eXp4dXFubGlmY19YUEdCPz4+PT0+PD08PDo6OTo7PUNNXnCAiImGfGpTNzE1PUhPXmp1fYSHhoeHhYJ+e3ZwaVtTT01MS0hCPzs7Oz5BRUZHR0lJSkpKSkpKSkpMTU5PUVJSUlJTV1Z2o56blYxuOkljiYh4WE5Zcnh6eIRgODU0Lnqkn6Kklol+bWRYTkI/RF1qaGNKPEVRfp+emJmin5RjQ058fXZtZGBTSlBZWFpQRzw6Rkc6Oz1FQT9BRFVQQkE3MDU9NiwwMzY6P1ViWVZOPDs9RF5YSERGSFFdV0xKTUtNQD5AOzw/Pjo7PkBBQD4/P0NGR0hJVGFoa1xGTk5ga1pPVF1UNC9ASENBRkdHVHJybGhlZGRlY2NkZWloZWBbVUtANS0oKSkvNj5JUVtiZmhnZWRjYmJhX1xYVE9FPTMtKSgoKiwwNTg6PUFKU1tianB2dnh5e3t8e3p6e36BhomMjYyMi4uJiYqLjIyMjYuIhIF+fHt5eHZ0dXZ2eHd2dG5pY1xYVFRYXGBhZWpxeH6IjY+OjYyMjIuLi4uLi4qJhYB5b2xsbnB2d3p4dXJxb25ubm5tbW1tbWtqampoam92gIqOj46MiomJIiEhISAgISAgHx4fHx8eHh8fHh4eHyEhISIhIiIjJSUnJygpKSkpKisrLCwtLS4uLy8uLi4uLi4wMC4uLi4uLiwvLzE1O0ROWWNob3BrZF5VTkdDQD06ODUzMzE0NDQ0NDQ0NDU1NjY2NjY1NDQzMzIvLy0sKyspKCknJyYmJiQkIyMiIiQmJy0xNTs6PDs9P0NFSk9RVFNTUVFSVFldYGFkZ2ptcHJydXd5e31/gICAfnt4dHFtaWRgX1lSTEU+PDw8PDw8PDs6Ojk5OTk5OTs+SVltfoiKhoBxXD4qKy83P0tWZG52fYOGh4eFhIJ/eXJpXVNMS0dEQj08Oz5DR0hKTU5OUFJTVFNQT09PT09QUVJTUlNVVlZWfKOemJCLajZVYXuMfWRSTGZ1fYKJVjk3ODhJlJieo5SFfXdsYFVMRklcY1xaR0FGSnKZlZKUnp6QelpziXlsaVxaVl1scXl2amJbVFVWVVVcaFBDPztGTkk7MDE5RzctLS80OEtmYFVSUD0+Q0pBPT5KTUZETU5JPkFMVlZWU1dGOj1BPTo+QUFDRUdFQU1SUV5TT1lcSUVSWlpkWVtUQzo+OUVHPDA8UnB3cm9vaWhuY2poYmJmZWVhW1NIPDEoKCcqLzY/SlNbY2VmZ2ZkYmFhYF9eWVJNRDsyLCoqKSstMTU3ODxASVNcZGxxdnZ4enp7e3t6eXqAgoeLjIyLi4mJiYmKiouLi4uKh4OAfXt4eHZ1dnZ2dnV1c3FtaF9aVlJTV1tfYmdtdXuBiY2OjYyMjIyLi4uLi4yKiIN9dG5paWxwdXd5dnVycW9ubW1tbG5ubm1tbGtraWlveIOMjo6OjImKiiIhISEgICAfHh4eHh8fHh4eHh4eHR4gISEiISIjIyUlJygoKSkpKSorKywsLS4uLi8vLy4uLi4uLy8uLi4uLi4sLS4uMTU9SFFbZGhtbWhkXFhRTEdFPzw5NjMzNDQ0NDQ0NDQ1NTY2NjY1NDQ0MzMxMS8tLCsrKSkoJycmJiYlJCMjIyEiJSQoLTI0MzU3ODo+Q0hMTU1LS0xMTU9RV1thZGdqbXBycnh5enx/gYSCfnt4c29rZl5aV1NNRj86Ojs7Ozs7Ozo6OTk4ODc3Nzc6PURSZXmFiYaCeWhMMCopLDA5Q01aZnF5foKEhISCf4B/dm1iVUtGQUBDQ0NFSEtOUVRVVVVWV1hXVVRTU1FRUlBUU1FVVFVUWouenJeQjXMsPFhxhn1oTUdMZnV8dUo6Ozw8OmeOkZaGd3J0bWVZUFBUWlVRUUlGR0dmjouHi5OXlYl9fF1OUVRNT1VOUm6JjHBzhXBiWk1GS1hPTkY7R09AMi4zNzw4Ly0uLjM8P0M/S1ZKTUk7Nzg7Ozo8Pj5BPTg6OzxDSEpNUEBBREE+P0FBQkRDQ0ZKSklNUlBIQ1BRQkVKSVRTQD9CQEFLUWZrdHl4dW5mdHh3ZFhdVF5eY2ZlYV1VRjsxKCgnKTA3QEtVXGRmZ2dmZGJhYWBfXFhSTUQ7MiwpKSkrLTE1Nzg8QUpWX2ZscXZ4eXp6e3t7enl6foCHi4yMi4qJiYmJioqLi4uLioeDgH17eHZ1dHV1dXV2dnRwbGdfWFNPUVVbX2Vpb3Z8gomNjo2Li4uLioqLi4uMiIaBem9oZGdrcHV3d3VzcXFvbm1tbWxubm5ubm1ta2ttc3yGjo+OjIuJioohISAgICAfHh8fHh4eHh0dHh4dHR4eICAgISEiIyQmJicoKCkqKissKywsLi4uLy8vLy8uLi4uLi0tLS0vLy4tLCssLSwxNz1HUVxkaWlpZmRfWlVRTklEQDo2NTMzMzMzMzQ0NDQ1NTQ0NDMzMzIyMTAvLi0sLCsqKSgnJiYmJiQkJCMiIiMkJCgtMDEzMjY4OT5BREZISEdKTE5RVVpbX2Nma25ycnN3e3yAfoB9fHl3cW5nY11YUE1HQj07Ojo6OTo6OTk5OTg4NzY2NjY2Nzk+S19ygImIgn1uVzspKScpLTQ9SVNdaG94f4OEhIJ7dXZ4cGFUSUVER0lKTVJVWVtdXl1ZV1haXVpYVlZVVFNSU1RSU1NWXWKVnZiYlYx9KzlOYHt5Y05LRElQUklBPT4+PTw5boSKgW5tamJfV1BQU1FKTVBJSkdFSnaIhIKAiJKJfltBSU9NTEpFPjU/W2Fqf42BdGVbTlJXSEpMPT86NTI4OTI1NTAtKicqMTs/PlRMPTc0Nzc0Mzk1MzU4Ozs6OTg9PTs6QlFEQT9FTUdDQT0/P0JHSVJeWl1kVFZeXEo9UlpROkBMR0VQYXB2c3N3dHNzbXBpZUpTQUhdY2VnZWFbU0c7MSsmJyoxOUJLVF1kZmdnZmNiYWFfXltXUkpDOTItKispLC4wNDY4PUNMV2BnbXJ2eHp6ent6e3t6fX+DiIyLi4qJiYmIiImJioqKiomGhIB+fHh2dnV1dXV1dnV1b2plXVZRT1FXXmJma3F5fYSLjo6MioqKiomJi4uKiYaCfnZtZWVlam5zd3d0cW9xcG9ubW1ubW5wcHBubW5scHV+h46PjYuKiYmJISEhISAfHh4eHh4eHh4dHR4eHR0eHiAgHyAhIiMkJiYnKCgpKiorLCwsLC4uLi8vLy8vLi4uLi4tLS0tLS0sLC4sLC0tMDQ3QEZSW15jZWZlYmBbWFVTTUhFPTY0MzIyMjM0NDQ0NTU0NDQzMzM0NDEwMC8tLCsrKiooJygoJiYlIyUkJCMjJCQkJyssLTM3ODk9Pz9AQ0VGTVJVW15gZGdpa2xucXV3enp9fHx6d3Zzb2pkXVdQSUNBPz47Ozg4ODg5OTg4ODg3NzY1NTU1NTQ4OkZVanuFiYaCdmRHLSgmKCkpLDU+SFVdZ3B2fXxwZV9me3hwZVpPTlBWWmJpbG5vb3BsZl9aWVtfXlpWVlZUVFJQT1BQT09ZmaCXlpSMfzMxOFZucFNKUEhBPDs9QEFBQUA+N0VyfnNlZGFYWlJLTk5KS01MRkdHSkxZdYeFenuUjndGOkFCQ0FBQD47Ni8yVoCMh3ZiYFVRU0k9RDk4ODQ5Pz0yLjEvLi0pPEE5ODw4NjM0Nzs8QUM6NDM2NjI8QkNHPDk5Oz1GRkI+ODw/QEE+QUVDQklJWVFqdU1QaXByYUlBQEhJSD1UaG5wcXJqWnB/ZmxeVVJAQExVXWNoZWRiW1NIOjErJygsMjpDTFVdZGZnZ2ZiYmFhX15cWFJKQjozLCsrKSwuMDE1OD1FTldgaXB0dnh6e3t7enp6en1/g4aKi4uJiYiIiIiJiYqKioqJhoN/enh2dnZ1dXV1dXZ1dW9qZV1WUU9RV15iZ2xyeoGHjY6OjIqKioqJiYmKiYmGgXpyaGFgYmduc3Z2c3Fvb29vbm9vbm1ucG9vbm1ubnR6g4qOjo2LiomJiSEjIyMhHx0dHR0eHh0dHR0dHR4eHx8gIB8gIiMjJCUlKCkoKSsrKywtLSwuLi4uLy4uLy4vLy0tLS0tLCwsLCwsLC0sLCwuMThASFFWWl5gYWJhYWBdWlZQSkVAOjUzMzIyMzMzMzQ0MzM0MzMzMzIwLzAwLi0rKysqKCcnJyclJiQlIyMkJCQjIyUnKiwvMzc7PkA/QENJTVZaXWFpa25ub29wc3Z4d3l3dnd1dHFuamNeWFFKQzw5ODs8Ojo4NzY1Njc3NzY2NjY1NDIzMzMzNTY9TGBzf4eIhXxwVzknJSUnKCgsLzdAS1Zham9qZG9uU2qAfXRoX11jbHZ9gIGEgn59fXVuZ2hoaWVfWVZTUlBOTEtMSklHTJSgmpSPiINFLjZPZ1xHSVJKRUI/QEBAPz49MjZGUXFuY11aV1ZQT01JSEZLTElJUFJXWlhpeHyGlY5tQzs8Ozg5OTo5NzYzLztmfoaGc2FTTklDRUtKPTI2Sjs0LDM0LysqMz89REU5NTM0OTY8QkQ8NzY1NTQzNDMzNDU3Nzo6PkpWSTYwLDM4OjxFPzs9QEZaXFFDTFtnYl1IQUhKRT1ZbW1tcHJ0WkNsdnSGRldgV0dJUFtmZ2hnYltSSDoxKykqLzQ7RE5XYGRmZ2dmZGJhYF9eXFlSSUI6MCooKSotMTE0Nzk+SFNaY2txdXh5e3x8fHp5eXl8gIOJi4uLiYmHh4eHiIiKioqKiIWDf3p4d3Z1dXZ2dnZ1dXNtZ2NcU09OU1lfY2dtdHyDiY2OjYuJiYmJioqKi4qIhYB5bWRdXGBnb3R1dXNxb25wb25ubm5ubm5tbW5ucXF2fYWOj42Mi4qJiYkhIyUlIh8dHR0dHh4dHR0dHR0eHh8fICAgISAhIyQlJSgpKCkrKyssLS0sLi4uLi4uLi8uLy8tLS0tLCwsLCoqKyssKywsLCwxNj9GTE9TWFtdXmBfYF9cV1NOSEE6NTMyMjMzMzM0NDMzNDMzMzIxLy8vMC8tLCwtKykpJycnJiYkJCMkJSQkJSUlJyswNTk9QURGSktPVVteY2ZqbnJyc3R2dXd3d3RzcW9ta2lmYFxWUEtCOjc1Njg4OTo6OTg2NzU2NjY1NTU1NDMzMTExMTIzN0JWanmEiIWCeWVGLCUnJScpKjA2O0RTYm1oa11keHF4eXh5cnNyd3+DhYWDhoKChYWDf31/gX54cGdbUU9MTEdHRUNDQ0F6npWPioSDWS41QWBWQ0hNSkhFQkNDQkFAP15uXkJYbGdfWFNSTk9NS0dITU1LTUxUVldWWFpvmJWEb1VCODs6NTc2NDIxLi0tRGp8iYyAZVROSkRBSUovKSwvMzI8OiwqMTksJzQ/OTQzNDM0MTM0MDAzMzQzMzEwMDAxNDk8Oj1DTEQvKS4zNzVCTTs/VVhRU1ZgbVpARFBiXUtEQEJbbmpucG1wdndlRWKokktkXUxCSlFgaGhpZ2JcU0g6MSspKi4zPUdPWWBkZmdnZmRiYWBfXlpXUUpCOjMyMjMzNzs7PDxARU1UXGVtc3d5eXt8fH17eHh4e4CDiYuMjImJh4eHh4iIioqKioiFgn57eXd2dHN2dnZ2dXVzbWhiWlFOT1NZYGRpcHd/houNjoyKiYmJiYqKi4uKiIN7cmheWlpeZWtydnVzcW9wbm9ubm5ubm1tbW1ubnJyeoOJj4+NjIuLi4qKIyQmJyUgHR0cHB0dHBwdHR0dHR4fHyAgISIjJCUlJicoKSkpKioqLC4uLS4tLS4uLS4vLy8uLCwtLSwsKysrKysqLCssKiorLS80Oz9ESU1RVllcXV9gYl5dVU5MQj43MzEyMjMzMzQzMzMzMjIxMTExLy8uLiwsLSoqKScnJiYmJSQjJiUlJSUpKy8zOTtARUhOUVZXWF9mam1ucXV4enp5eHd1cnBra2dlYl5ZVlFNRkE7NzQ0NDY1Nzg3ODg2NjU1NDQ0NDQ0NDMyMTEwMDAwMjM7TGJ1goiJh4FyWT0pJSQlJSguMTpHU1teWWFjZm9xcWtpb3B1foKEgH58fHh5fYeMjo+RlJWTjoqHe2xbTEE+PkI+PDk7WJiRioeDgHE0Lz1YW0lLTUtLVEZEQ0VAPjpflY1qZ2BlY1pTUExQT01HSEpMTVJNTVtWS1FUZJaPg2xdUUU7MjI0NzY0MS4sKi1IZXyNjHplVl1XUVNPRDo6MjQ5PzwwMDc6KygrNDQ2NDQ0Mzg6RU9EPTc1NDIvLS0wLjAzODo/PkU+NS8xOj9APzg1RVVSWVdfbWpbTE5MWm1TXWV0dWxzgIF0d3R5dlVjgU9EU1tUQUhXZmdnaGhjW1JHOTItKywyN0BKU1phZWdnZ2ZlY2JhX15bWFRPSkRAP0JHSE1PUFBQU1NYXWNpcXZ6ent7e3t6eHl5eX2DhoqMi4qJiIeHh4eJiYqKioqHhIJ9eXd3dXV1d3d2dnZ2cmxnX1hOTE9UWWBlbHN4gIeLjo+MiomJiYmKioqKi4aBeXBkWVJVW2NsdHd0c3BubW9vbm5ubmxra2trbm9vdHuEjZCQjIyMjY2MjCMkJicmIh4dHBwdHRwcHR0dHR0eHx8gICEiIyQmJicnKCkpKSoqKiwuLi0tLS0tLS0uLy8vLSwsLS0sLCkpKyspKSoqKyoqKissLjM2PEBER01QVlhcX2BhYF9aUktFPTUxMjIzMzMzMzMzMzIyMTExMS8vLi4sLCsqKiknJycnJiUkJSQlKCorLzQ5P0RITFJWWVxgZGVpcHR2d3h5enl5eHRwbmlnZGBbV1FOSkhDPjg0MzExMTI0NDU1NzY2NTQzMzMzMzMzMzMyMTExLy8tLzAxNUNYbH6IjIqGfGpROyYlKTQ1LjA8S05HR0dPTk5STVFUV1ZVWmhydXl2dnV3e4SNkpKTlpaXlZCJio6LgHJbSD44ODk3NTl+loiCf4B/UT0/UV9QTU5MSUpGQ0RCQD43VZqSgnZnVlpgWVBNUk5IRUVKSEtOTk5ZWVNISlOQkohxXUlDNDM3ODk5NTItKioqMEpgfJWWgW5hZGNza1xYU01ENzM4REhJQDcrLzM1NTMyNkdMSUtGNjc6ODY0OkE9OC8rLTc+QU1dQTI/Q0hCSEc9R01RUlVeZ2RdVVZVYGVnSVdvcnBtb4R+aGliW1xbWU1ESVtgSDtGT2ZmaWpmYV1TSjwyLSwvMzhCS1NaYWVnZ2dnZWNkY2RkZWViX15ZVVhYW2BlaGlsbG5ucHBzdHd6fHx7enp6eHd4eHp+gYSKjIuKiYiHh4eHiYmKioqKh4SBfnt5d3V2dnd3dnZ2dnJsZ19XTUtOVFlhZm51e4KIjI6PjIqJiYmJioqKioqHf3VrXlNNUVlkbXN2c3Jwbm9xb25ubm5sa2tra2ttbnN8hY+RkIyMjI2NjIwhIyYnJiMgHRwcHBwcHBwcHBwdHh8fICAiIyQlJicnKCcoKisqKiosLS8tLS0tLi4uLjAwLiwsLCorKyopKSoqKSkpKioqKSsrKyssLjI1OT1ARUpRVltdX19gYVxVTkc7NTIyMjIyMjMzMjIyMTAwMDAuLi4uLS0tKyoqKCgoJycmJicpLS8zODtCSE1RVFtfYmZpa3BzdHd5e3t6eXh1cm9saWRgW1hSTEhEPjs5NTIxMTEwMDAwMDAzMzMzMzMyMjIyMjQyMjIyMjIxMC4tLS0tLjQ8TGV6h42Mi4R1ZU85KTZTVUpHVFxaUVBRU1RZX1BKRkVGRz9GSUxVXmdwe4OOkpGXmJWRjX94eXeCj5KVjXthSDkzNDY3SIKJgn2BgWpLR1djVU9TTUVGQ0JCQjw3RnKel4Z5bVpUWFpWUElGRUZHSUdISElLT1BJRkpRjo+IgGVBNTI+Qz47NzIwKSgpKio1TGSClJOIfXd0dXJjYlhMS0xCPE1ORj43Ozo3NTQyNzw8Oj4/Pzs6NzU4REVLOy4xMTI+Sk9pcU8vPVJOTFRRUl9zWkxSWmdRXVI7PVxmWU9UYFxeWlliXlZQUUlEQExKQEVOQTxIOjFea2tqaGJcVEk7MS0tLzU8RU1UXGRnaWdoZmZoamxucXJxdHNwcHB0eXp9gIGDg4GAgYCAgYGDg4SEgn9+fXx7dnV5fYOJjIuLiomJh4eIiIiIioqLioaDf3x6eHd3d3d4eHd3dXRybGVeVE1KTFNcY2lxeH2Gi4+Ojo2LioiJiYuLi4uJhn52Z1dNSU9ZYmx0dXRycG5ubm5ubm5ta2ppZWZpa251f4iPko+LjIyNjY2LICIkJSUiIB0cHBwcHBwcHBwcHR4fHyEhIiMlJSYmJygoKSoqKiosLS4uLC0tLS4uLi4vLy4sLCwqKysqKSkqKikpKSkqKioqKysqKiorLTI1Nz1CR0tSWVxfYmJhXVRMRjs1MjIyMTIzMzIxMDEwMDAwLi4uLi0tLCsrKigoKCgoKysuMTQ6PkVJTlVYXWJoam1wc3R2eHp6e3l4dXRxb2pmYV5YUk9JQz06NjIzMjEwLy8vLy8wMC8wMjIyMjExMjIyMjI0MzIwMDAwMC8uLSwsLS4xNkVacIKNjouJgHlpTzpDWFdRUktdbXBiZWhdZWBZZGNSS0U+RERFRkdESVxtf46VlpaRjIOKj4+Ef5SZnJqVjnpZQTc8R0xoj4mBgYF9cm5uZ1hMT01EREI/QT88O2KMn5mJfnNpXlhVUU1IREZJSkpIR0ZJTEVGRUdNTX6If3ltRjw3QkdEQDgwKCMjJScpKjhQYHiMk4+EdWp1aXF4ZGlrWUpXXlFDPDk3ODQwLzAyNTY2ODo4OUdPRzlDQzcqKisxTmhrbWRfSEJHQ1RQT1NcbWNMXWZaTUc5Q05qW0NjaWVYSUlDPz9FTEY3Nz9NWVJNR0tRWzRPZ2tpamhiXFRIPjUxMTM5QUhQWF9jZmlqbG5wcXN2en2Ag4aHhYaGhoeJioqLi4qKioqKiouLioqKioqHhoF/f3t6fICCh4uLi4qKiIeHiIiIiYqKi4mFgn98enh3d3d3eHh3d3V0cWtlXlNLSU5TXGRrcnmAh46Qj42MiomJi4uLi4uLh4R8cmNRSUdQWmVvdHV0cnBubm5ubm5ubWtpZ2JkZmhudoGLkJGPi4uLjY2Nix8fIiQkIh8dHBwcHBwcHBwdHR4eHyAhISIjJCYnJycoKSopKSsrLS0tLS0tLS0uLi4uLi0tLCwsKisrKioqKSkoKCkpKSoqKioqKSkqKisrLy80ODxCR05VW2FkZGRdVU1FOTMzMTEyMjIyMDAwMTEvLy4uLi4tLS0qKyopKCkqLC81ODxCR01QVFtfZGhtcHJ0d3l4eHh3dnRycG1rZ2JeWVRPSkY+OzUxMTAwMC4uLy8vLy8vLy8uLzExMTExMTIyMTExMzIxMTEvLi4uLSwrKywuLzI8UGd8iI6LjIR4cnd3fH51ZlE/P1BjdXlcT1dYX253dGFJQ0NDREZDQUNER0tccX5+fYWOkZaVjouTmp+clZaVjHljYG55hZaPg4F+gYyKgnFYTE1JR0NBPz1FTFZ/l5+djX94bWJdXVpSSUhHSEhJSEZFRkhFPD1FU1lshnRtaVFAPkJGREI9MyYhICEkJyorPlFgcYONjYR0bml1fnR2cGViY1pcRzs8Ozk2MTM0NTM2OTU4NUQ7Oz87Nzs2NS0vOV5wcWVWXVVUT09ETFNWXVdTTlxLRVBIQlpMXm1dX2BWTSsuOTUzNjc0PU1RY2xfVUdET2VjaWhpa2tnY15WST84MzU0O0ZLVFliZ25wcnZ2en1/g4eJjo+Qj42Mi4uLjIuLi4uKiouLjI2Ojo+Pjo6OjYuJioSAf4CDhImMi4qKiYiHh4eHiImKioqJhYJ/fHt5eHh3d3d3d3d1dHJrZFxSSUhNU1xlbHJ6g4iOkY6OjIqIiYqKi4uLioeDeW1eTUVHU11ocXR1c3Jwbm5ubm5ub21raGVjY2Rob3iDjJCQjo2MjI6OjYweHiAgICAdHRwcHBwcHBwcHR0eHh8gISEiIyQmJycnKCkqKSkrKy0tLS0tLS0tLi4uLi4tLCwsLCorKyoqKikpKSkpKSoqKSkqKisrKioqKisrLTA0OkBHT1VbYmVpZl1WSkI4MzIyMTIyMTAwMDExLy8uLi4uLS0sKysqKSosMTQ4P0NHTlRbXGJoa29ydXd5eXh2dXNxcGxraWdiXllUT0tFQTo2Mi8tLS4vLS0uLS4uLi4uLy4uLi8wMDAwMDAxMTAwMDIyMTExMC4uLC0sKysrKy0vN0VbcoOMin90cYKSlZGLg357cVhNUWRaYFFKUGVsZX58XFFIRURER0ZDQUVGRUdJVl9/kpWakpKRlJeenJCOlJeQiIyRkZKVj4V+fH6PhVhoWEpMS0dDQEE9PUNvk6Gnm4yIfXVrZ2RjYWFNSF1mYFdJRkVFQzkyOUhcaH94X2BYR0RDRUI/PjgtIiEjJyorLC86TVxqd4SHgnh3fX6CenVqXk9VSDxESE9YVD06QDw2N0I0Mj4/Q0ZaVTw+MzE1NDdVaWRcVlxbUUA7Q2FqaF5cWlVGREw/QU1YSFZoXlxORUs/Rzs/Nj9DSFxlaH94b05MPUFlZmZpamtrZ2NeVkxBOjY3OT9GT1dgaG90d3x/goWIi4+QkpKSkI6MjYuLiouLi4qKi4uLi4qMjIyNjY2Nj46PjoyLiYiGiImMjYyLioiHh4eHh4iJioqKiYWCf3x7eXh4d3d3d3d3dXRwamFZUEhHTFNcZWx0e4OIjZCOjoyKiouKiouLi4qHgXhpVklFSlReanJ0dXNycG5ubm5ubm9ta2hlYmJjaHF5hY2Qj42NjIyOjo2MHR0eHh4eHR0cHBwcHBwcHB0eHx4fISEhIiMkJScnKCkoKSoqLCwsLS4uLC4uLi4uLi4uLSwrKioqKysqKiopKSkpKCgoKCgoKCkoKCkpKicpKSsrLTI5P0dOVV9kZ2pkXFJLQjo1NTQzMTIwMDAxMC4uLy8uLS0tLi0sLC4xNjg/RkpPVFtfZGlsbXBzdXd2dnRyb21paGVhYF1ZVVBMRkI7NzEwLi0tLS0uLS0tLi0tLS0tLi0uLi8vLi8wMDAwLy8wMDEyMTEyMi8uKyssKyoqKSkpLDA6TmR4g4R6fIuRioOFioaDgoJ9emxYXW5iVk9lhIJ3fG5gT0VBRkZFSEVGSEpMSkE/U26HlZOPkJOYnZqOioyNiHGKjpSPlI6Ee3l7kY1xhV1ISktFQT87OjpKfZejp5xla4N+dW5sa2ppaYGVlpKMg3hcRj43MTNLZWtybmVhXU1IRERBPz89MiglJyksLCwsLTpMXWdwdnuGkZWEh4F1b2FRYlZOV1VYVVg+NUVDRUJEMTZBOkZPS0ZDMC47OSw0SlpTTlBcVUY9RktUTFFJTFFVR0VHSk1WV0hJWFpNQEVPSUc4P0M4OURYbnl9eXNSND1RaGdnZ2lqbGhiXldORT04OzxDTFVfZ3F5fYGGiY2RkpKTlZSSko+Oi4qHh4eHh4iKioqKiYmJioqJiIuMjIuNjo+Pjo2NjY2OkpCOjImIh4aGh4eJiouLioiFgn98e3p3d3d3d3d3d3Vzb2dgWU9HRkxUXWZtdn6EiYyPjo2LiomHiYmLi4uKhoB3aFRIRUxXYGtydXVycnBvbW1ubm5vbWpnZGFhY2hxfYeOkpCNjYyMjo6NjB0dHR0cHBwcHBwcHBwcHBwdHh8eISAhISQjJCUnJygpKCkqKywsLC0uLi8uLi4uLi4uLi0sKyoqKioqKikpKSkpKSgoKCgoKCcnKCgpKSkoKSkrKyorMDY+RVBZX2draWNbU01FQT04NzY1MjEwMTAvLi8vLS0tLSstLzEzNzxDSU9VXGFlam1wc3Nzc3RycG9tamViXlpXU1JOS0VBOzY0MSwsLCwsLS0sLSwsLC0tLS0tLSstLi4uLi0uLy8vLy8vLy8wMTAwMDAvLisrKysqKikpKCkqMkBUZW9zf4yPjYWCeXZ2hYV+gX5cUmtzbmZdb4ePfHVtZ1tXUEVFSlJLRURDRUlLR0dKXoGWkZOUmJ2ZiYiMi4Zyd4aJgpCNgHp4eY6TlI5jR0lJRUJDT0c4UYidpqmjXixYe4F5eHZ6eoSVn6GZk4h5ZE0+Ni84U2Vsc25nYV5VS0E/QT9APjgxKi4vLy8tKyorOlBbZ2psf5OhmJaYjYZ7a2NlZWJYVERWTTw+Qj9JQTA9O0FGP0dOOi4/VkQtNUlUW0pBSjw8TExIUDU6PEBGV1ZGRUVPTlxmX004NUdZS1NMNjdSWT9ESmZwX2pyT0NXY2ZnaGhqamxoZF9YT0Y+PD5CTVZfaXN9goeMjpGTlJSUlJSTkI+LiISBfnt5eXt+gIKBg4aHhoeHhoeHh4eJiYyMjY2OkJCSk5ORkIyKiIeGhoeHiYqLi4qIhYJ/fHt6eHd3d3d3d3d1c29nX1VKRkVLUltjbHd/hYqMj46Ni4qJiouLi4uLioaAdWZTSUpSW2VtcnNzcXBwb21tbGxvbm1qZ2RgYGNpc36Ij5CQjYyMjY6OjYwcHBwcHBwcGxwcGxscHBwcHh8eHyEhIiIkJCUmJicpKigqKiwsLCwtLC0uLi4uLi4uLiwrKysrKyoqKSkpKSkpKSknJygoJycnJycnKSkoKSkoKSkpKSwxOUBJUlxkaWtpYlxXUUtHQz49Ozk1MzMxMDAuLi4tLC0vLzQ3Oj9HTVRaYGNnbXBycnRzcXFsamhlYVxYVE9MSEVBPTk1MTAuLS4rKywrKysrKysrKyssLC0tLCwsLC0tLS0tLS4uLi4uLi4uLi8vLi8vLi4sKyoqKSkpKSkoKis1RlpmfH6Gg3+BcWJwaGlvV1hlWFxnZ2RfX3GDkoR0bGdiWk1ERkpQSkVFQ0RHSUtMTE94mJKRkpeel4qIjY6OhXV9iHmLjIF7d3aJkI6PcURMS0lJQz8+N1qPn6WqpYorNE1ygYJ9eXuLm6GglI6GdF1IOzQvOU1ZYmdoY1tWVE9BPj8/QUI+ODEzMzEwLy0rKis1TF9oZGuBmKKkpKSimH5gVmhxZlVPYVZFPEhXPjI8OkRPUks+LyY0R1dFMjtHVWNWQ0VENTtGW1M8NzM3OkVESEIxOkFGYWI4PFlfWExbUEtTbmhgY2Bqbk5WX11gZmVnZWZpamtraGVhWFFIQkNITllia3V/h4uNkJGSlJSUkpOSjouHgHhybGZiYGBiZGdrb3J4e3x/foCEhIWFhoeIiYqKi46RkZSUk5KPi4mIh4eGh4mKi4uKh4WCf3x7enh3eHh3d3d3dXJtZlxQR0RESlBaY213f4eMjY+OjIuKiouLi4yMjIuGgHVmVk9QV19nb3N0cnBucG9ubm5ubm5tamdlYV9kanSBi5GQj46Ojo6OjY2MHBwcHBwcHBsbGxsbHBwcHB4fHh8hISIiJCUlJiYnKSorKCorLCwsLSwsLi4uLi4uLi4sKysrKysrKSkpKSkpKSkpKCcnKCcnJycnJygoKCkpKCgoKCgqLjM6QkxUXmRoamhjXlhWUk5LRkM/PTo4NjMyLy4uLi8wMzY5PkNIUFZdYWdqbXB0cnBubGpmYl5bVVNOS0ZBPTkzMTEtLCwtLSwrKyorKysrKysrKysrLCwsLCsrKyssLCwsLCwtLS4uLi4uLi4vLy4uLi0tLCsqKikpKSkpKSgrNU1wenl1cW1paV5cdnNvfXd0ZlpdYlRLVGJ1gYyGdWltbWdWREFJSEpHREVFRkZISUxNdZaOi4+XnpWLjIuOjY6LjJKHjol/enZ2hIuLi3pLR0hGRkVBPjVjk6Gnp6WaVzI9P0ZJPkFqh5qZkoWAdWZaUzsxMT5MWFpdXmBYVFBNQz0+QkRHQj85NjY0MzEuLSkqKzVSYl9dboCKk52fn5uLeGl4c2hgW1daS0dWYD05NDtBR0ZIODk+SDxFPjk8SFFZTjw7X0M9RlpeRTEuNjY8SEVAPUVISFReZW5rZ2VpZWltbGZQVWlgZmxgZWtpaWVjZmdnZ2tra2pmYVpTTEtOUlpkb3mBiYyNjpCQkZOSkpCOioN7cmpgWFJKRkVFR0tMUltfZ2xuc3Z6fX1+foCDhIWHh4iLjI6QkpCQj4yKiYeHhoeJiouLioeFgn98e3p4d3h4d3d3d3VybmVbT0VBQUdRW2VveYGHjI6PjYyLioqLi4uMjIyLhoB3aFxSVFpjbHN0dHJxcHBvbm5ubm5ubWpnZWJhZGx2g42RkI+Ojo6Ojo2NjBwcHBwcHBwbGhoZGxwcHB0eHx8gISEiJCUmJicmJygpKiorKy0uLS0tLSwtLi4uLi4uLi0sLCsrKygqKikoKCgoKCgoJycoKCcnJiYmJigoKCgmJicpKiovNDtETVdcZGhoZ2RkYFtZV1JRTUlFQ0E6NjUyMjIzNzo+REhOVFlfZWhrbW5vbm1qZmFeWFVQTEpFPjs3MzAvLi0sLCsrLC0rKyoqKysrKysrKysrKysrKysrKysrKyssLCwsLCwsLC0tLS0tLS0tLCwsLCwrKiopKSkpKCgrMGF9gW9laXZvZGleZnt6eW1dZmBefHVjZGx0fIuMk5CMjYV5dWRVS0xMR0RFREZGSk1NSmmUj4yMk5uJW3KFiYeMj5GUjZGGe3l1dIqRkZCLXERJSEhDQTw6cpqjqKmmmnQwPDs5NzQvUH6QjYeCeXFlWFBHNTpCTFJSVFZYVU9LSEQ8OUFKS0ZEQDs5NzY1MS4rLjE3QFZeW2JrdH6EiIiIiYWDgn51aVVQVVRVZGRMQjc1MjI7Pjw/QDQ3Nzk8Ozo9QTo2MC06Oz43Z1ozLTA+TkE2PEpQUkxjeHdycG5ramlraWlgVmhzYFpxcW1paGZlZmZnaGptbWxqaWRhXFlZXGNqdX6Gio2NjY+QkJCQjYqJhn50aWBVS0E+Ozw7Ozo8PkJKT1dhZ29zdnh6ent9gICAg4WHiIiJjY+Pj4+NjIiHh4iJiouLiouIhoF+fXt5d3d4eHd3d3Z2cWtkWlFGQUJIUlxocXmBiY2PjoyLiomKi4uLjIyLioeAdmpeWVpfZ251dnRycHBwbm5ubm5ubm1qZmRiYWJue4aPkpCPjo6Pj46NjIscHBwcHBwcGxoaGxwcHR0dHx8fICEiIiQlJiYnJicoKSoqLCwsLS0uLS0sLS4uLi4uLi0sKysqKioqKiopKCgoKCgoKCcnKCgnJyYmJiYoKCgoJiYmKCoqKy8zPEdOVl1iZGZlZGNjYF5ZV1NTUE1KRUE7OTg4PT1BRktRV11gYmhqa2loaGVhXFlUUEpGPjo3MzEvLy0rKywsLCwrKy0sKysqKisrKysrKysrKysrKysrKysrKysrLCwsLCwsLCwsLC0tLS0tLSwsLCwsKysqKSkpKSotM0eAenF6d3R3aWlrZ2p1YE1LW1xlZ2ViZF9ne32HgJObo6OdkIqGeFVDSEhFR0hISUhJSUdglZCKjJCZiC85T2Nxf4iMjoyNhHl3dXeRmpqYlWhAR0ZFQUA9RXmZoqWqpp2BMTk7Ozs5NDlmeXt6dnFnX1hQTEdHSElKTlBOUFJOSklGPTRATk5LRUNBPzo3NjQyMjQ3OjdDV11fZGxwcXN1c3Z3cmpoamZWSU1VWlFWWE4xMiw5RT88SUoyOTw4ODEvOUtEMDA3OTQ8OT1RKywxNjkySGVtUlBKcXp2cm9ua2tqamtubXFxdV1KbXJuaWdmZmZmZ2hpa2tsbW1samlqa3B2fISKjY6MjIyLjY2LiYaAfXZtZV1WT0dBPj07PDw8Pj9CRk1WXWZtc3Z3d3Z3eXx8foCBgoWGhoaLjIyNjY2LiIiIiIqLi4qKh4aBfn17eXd4eHh3d3Z1dG5qY1tQRUBDSFFcaHF7g4mNj46Mi4qJiouLi4yMi4qHgHZqX1tdZGtxdXd1cHBwbm5ubm5ubm5tamZkYmFlcH6IkZKQjo6Oj4+OjY2MHBwcHBsbGxobGxscHB0dHh8fHyEjIyQkJCYlJignKCkrKywsLCwsLS4uLi4uLi4uLS0tLCwrKioqKikpKSkpKSgoKCgnJygoKCgnJigoJycoKCcnJycoKikrMDU9RUxSWF5hY2RjZWRhYV5dW1tYVFFMSEVFQ0RJTVBWW19iZGdpaGdkYV5bU09KRUA6NjEtLSwsKysrKyssLCwsLCwsLCwsKysqKioqKysqKioqKioqKioqKioqKisrLCwsLC0tLCwtLS0tLCwrKyoqKyssLCkrKiouN1FkeGRmf4KFgHBwZmZpYk9NTE5NWmdtX1RPTF5ocGqAiZGlqKGdnJJ4VUBJRkhJR0lKSEhIVI6NiouLlIxAOzs8SWd9h4+Oi3t1dnd4lJ6dnpp6QkFGSkM+PlZ+mJ+jpqaefS45PTw8OjU0SmdrbGpmX1ZUUE5LSktKTE5PTk5OTk1LR0E1QVBSUElGRkU/PDk2Ojs7ODc5OUxYXWBlampwdHZ4cFpHRkhKSURER1FKRkhHPjtDMjY8Pzw5OUVDPTk6O0I8PDwzNTwxNzs/YFNLPzw8RltlYlNPWXt4dXJua2pqaWlqbW5xcnNta3Rwa2lnZmZnZ2dpaGtwcnR2dXZ4en2BhoqMjY6Ni4iIhYSBfnt4cm1oYlxZUk1FPzs6PD09Pj9BQ0lSWWJocHR3dnZ2d3l6ent8foGDhISEiImLi4uMi4uJiYmLioqKiYiFgX58enh4eHh4dnZ3dnNvamNYTkU/QkhSXWt0fYOKjo+OjYyKiYqKi4yLi4qJhn93aF9fYmpxdnd3dHJxcG5ubm9ubm9vbWpmZWFjZnKAiZGQj46NjZCOjo2OjRwcHBwbGxsaGhobHB0dHR4fHyAhIiMkJCQmJygoJygpKywsLCwsLC0uLi4uLi4uLi0tLSwsKyoqKiopKSkpKSkoKCgoJycoKCgoKCgoKCcnKCgnJycnJycoJyosNDtAR05SVllcXl5fYWFgYV9fXlxaVlNRUFBQVFdaXl9hY2dmZmJeW1dTTEdBOzUwLSsrKiopKyorLCsrLCwsLCwsLCwsLCsrKioqKisrKioqKioqKioqKioqKiorKywsLCwtLSwsLCwsLCsrKysqKioqKyspKywrME5zeXNseYWIioR9fHZzeXlkVVBbW0tgZ2RiXVtWYGNkfpyer7Otq6Sfl4JHQEZJTE1NTElEQkeBj4mGi5GORDQ+Pj9FXHmGhoR6dHd5e5ecm5yZik4/RUdEQD9ok5ubnZ+jnn0uNjg7Ojg2MTdTX19cXVtUTUlJSEZKTk5OTU1NTEtMTExGQEpSU1ZHREhJRkRAPD1CRkJAPj5EVFhaWltfX2VobnBuZVtUTEI7PDxHU1BWXV1aOC00ODU3OzdCQzs+QjAxO0NTTDhANzY5PE9ZSUQ6OFh1dFxRTHB7eHNvbWtpaWloaWxucXBucHV0b2tpZ2ZmZ2dpamtwdHl9gYGChoiLjY6Pj4+LioeDfXp1cm5saWZjYF5dV1FLQ0A8Ozs9Pj9AQEVLVl5kbHN5eHl5d3h5eXl5ent9gIKCg4SDhYaJioyJiYmJioqLiomIhYF+fHp4d3d4eHZ2dnVzbmlhV01EP0FIVF9sdoCHjI6PjoyLiomKiouMi4uKiYR9cmdgYGhtdXd5eHZycXBubm5vbm5ubmxpaGdkZWp2gouRkI+OjY2Pj46NjY4cHBwcGxsbGhsbGxwdHR0eHx8hIiEiIyQlJyYnKCkpKiorLCwsLCwtLi4uLi4uLS0uLi0sLCsqKioqKSkoKCgoKCgoKCcnKCgoKCgoKCgnJycnJycnJygoKSknJywwNzxDRkpOUVJWWV1fXl9gX2FgYGFeXVtbXF5fX2FjZGVjYl5aVE5JRDw1Mi0rKiopKSopKysqKisrKiwsLCwsLCwsLCwsLCsrKysrKyspKioqKioqKioqKioqKystLSwsLS0sLCsrKysrKysrKikqKioqKSstL0l+eHx+eHd/hH93dnp2cGtmZm9naFlGY3BXV2ZjZGVma3+ZrbCsr7Ksrquhd0M8SEtKR0pFQUFCbY+Hg4SMkmsuOj5AQEBTcoOCdW93eHyTmJiXlpNhQ0hIRUFEeZWdm5eYoJtxLTY4OTk6OTczPlFWVVdWUk5KSUlHR0pNTU5MTU5KSkhJS05cZWBVRUVFR0xMSkZEU2JTQ0NCPU9XVVRQS0dJT1NZW1pcWEs6OklMUk9LSVJYSz06LjU/OTo4PkI6ODYuKCosNDQoOTc1Nz9IPEI+OzxofYJVTV+EfHVycG1ramdnaGlpbnRvb3Z0c3BtamhoZ2hqa29zeHyAhYmNj4+Qj5CPjoyKh4R+dnBsZ2ZjX2BhX11dWlVPSEE+PDw9PT4/QEJFT1deaHB2e318e3h4enl5eXp8fn+Bg4SDgoaHiImIjIyLiYmMjIqJh4SBfnt6eHd3eHh2dnZ1cW1nXlVMQz9BSVVhbXiBiI2Pjo2LiomJiYqLjIqKioiDeW9lYWNqb3V4enhzcXFwb25ub29tbm1ramloZWZteYaMkJGQj46NjY6Pj4+NHBwcHBsbGxsbGxscHR0eHx8gIiMiIyMkJScmJygpKSorLCwtLCwsLS4uLi4uLi0tLi4tLCwrKioqKikpKCgoKCgoKCgnJygoKCgoKCgoJycnJycnJycnJygoJycoKS4yNjpAQ0dJTE1TVVdYXF9hYWRlZGNhYWFgYWRlY2FgXVlSTUlDOzItKikoKScqKioqKysrKysrLCwsLCwsLCwsLCwsLCwrKysrKysrLCsrKioqKioqKioqKissLS0tLS0tLCwrKysrKysrKyopKSkpKSkrLD95iWp8e3x5gIqAdXJ8fXlwdnl+dmpcUVhrZ1NHZHd5enmCj6itqrO5tLe5sZtoN0lIR0ZGQ0NDPVeOiYF9hIuSUzRAPz1AQk5wg3RxeHp+j5SUl5eWeEhITEZCR4GYnZOMlp+cYiw2OTk6Ojg1MjE8S1FRU1FOTUxHR0dITUpMS01NSUdFRUtTV1dWTUpGR0lMUVJQTVFeXVBNQzlIVlJNRD05NjY2Ojk5OTUxMDpGTlFBPUFERDg/PjxIST45P0RFOTU1MzUvJDI8PUNBNjtDRD46ODc4RU5NRU1ob318eHVwbmtoZ2doaW9ycXV1dXNwbmxsbG5vcHN2e4CDh42RkpOUkpKQjoyJhHx1bmdjYGFfXl5eX15cW1lUTUc/PDo7PDw9PkBESVFbYWp2fIGAf357eXl6enp7e3+Ag4eFg4GChYaGiImKioqLi4uLiYeEgH17eXh3d3h4dnZ1c3BsZl1USkE+QkpVY3B7gomNj46NioqJiYmKi4yKiomHgnhtY15iaXB1eHl2c3Bwb29ubG1ubm9ta2poZ2ZncH2HjZCPjo6Oj4+PjYuLixwcHBwbGxsbHBwcHB0eHyAgISEjJCQkJSUmJygoKSkqKysrLC0tLi4uLi4uLy8tLS0tLSwsKyoqKiopKSgnJycoKCgoJycoKCgoKCgoKCgoKCgnJycnJiYmKCcnKCgoKS0wMzY6PUFBR0tMT1JWV1xeYmJjY2NjY2FhYV9bV1FNSEE7My4pJygoKSkoKCorKisrKiorKywtLS0tLS0tLS0tLS0tLS0sKysrLCwqKioqKioqKisrKysrLC0tLS0sLC0tKysrKysrKioqKCgoKSkpKjdrkXFYb3d6goaNhn6AgIR8bnZzcHdwaGNWY31vRzRYdnx6hY+co663uru7u7mtikJCRUxKREJDRD5GfoyCfX+FkYg9OD8+PkVDYYJ3c3l/foWIiJOWlolPTklGQUqDmp6bmpudml4rNjc3OTk5NzMwLThHTk9PTUtLSUdHRktLTUtNTUpIRkNGU01LTlJTSUlJSlFWV1thaVlMSkI5RVZTSkI+QEVIQDoyLy8tLTA3Q0U3MjIzOjs+Qz5ETUs/PTlCSDk2ODY0NDc5QUM5NDM8QT07OTo6PTw3NDg+QEJKT1hjbm1saWdnaWlsaWx0dnV0dHFycnR2dnh8gIOIipCSlJOVlJGPjImEfnVtZ2JeW1tdXV5eXl1cXFpYUk1IQDs6Ojo7PT1ARUlTW2ZveYCFhYKAfn17eXp6e3t9f4OFiIaFgoKDg4aIi4uMi4qMi4mHhIB7eXd2d3d2d3Z1dXVwa2VcUkdAP0NLWWdzfYSKjo+OjIqKiYmJioqKioqJh391aV1dYWpvdXh4dXNxcHBubWxtbW9vbmxsamlnanN+iI+Rj42MjoyMjY6Njo4cHBwcGxsbGxwcHBwdHh8gICEhIyQkJCUlJicoKCkpKisrLCwtLi4uLi4uLi8vLS0tLS0sLCsqKioqKSkoJycnKCgoKCcnKCgoKCgoKCgpKSgoJycnJyYmJicnJycnJygrKiwuMDE1Njs/QENHTFBUWl1eX2BgYGBdXFpWUUxHQTozLispJygpKCgoKSkqKysqKisrLCwsLS0tLS0tLS0tLS0tLS0tLCsrKywsKysqKioqKiorKysrKywtLS0tLCwtLSwsLCwrKyoqKigpKSkpKixHb2hXWXF1fImGh4OLjIN9gn+Ae3F1bHBtWEVkc2pSR11mdIKPkJiotbu7vLu6tZ5dNz5BRUJDQz9AQ2SRiH5+gYqXZjFAQD5DSHGAeHh6f357en+MlZePW0BFR0hKgpudnJ6ampRRMDc6OTo5ODYzLy4wO0VNT05NS0lHR0dFS01LS0pIRUZDRFhRTE5TVEhJSUtNVV9yd29kXUtCPU1bUkhHTVFSUEg/MzAvMDAwMjIvLzAzMjU7O0Y7O0VCOTM4PkE9Nzk3OTo+PjgyMzYzQk89NjU4OTo8Ozk9Q0I5OkJFSFJdYWFnaWhqb290eXp5eXh2eHp8foCDh4mMjpCSk5WTk5CNiIN7c2tjXl1cW1haXFxcXV1cXFxZVlJLRT07Ojk6Ozw8PkVKUl9ncXyCh4eFg4B/fHt6e3x8f4OFiYqIhoOBgYGDhomLjI2NjIuIhoJ+enh2dnd3dnZ2dXR0b2lkW09GQD9FTVpmdH6Fi46PjYqJiYmJiYqKioqKiIR8cmVcWV5nbnN3dnJxcHBwbm1sbW1vbm5tbGppaG12gYyQkY+NjIuQkpOUkpCLHR0cHBwcHBwcHBwdHh8fICEiIiQkJSUmJicnKCoqKiorKyotLi4uLi4uLi4uLi4uLS0tLCwrKiopKSkpKCgoKCgoKCgoKCgoKCgoKCcnJycnJygoJycmJicnJycnJyYmKCgoKCsrKi0xNDY4PkJHTE9RVVZWWVlXVVJOS0VAODMpKScnKCgnKSgqKikqKiwsLCstLSwtLi4uLi4uLS0tLS0tLS0tLSwsKyssLCwsKyorKysrKyssLC0tLS0tLS0tLC0sLC4uMDYrKSsrKiopKiw1WV5jd39ea36IgHiBiIuBfHx7e3Ftdm94dVxBVnB9dWNZXWJ7ipGTo6+6vLu7urincDA2PUJBREVERENOg5CGfn2Cko5IMT9CS21+fHuAgIaJiYeJjpSVjWU/Q0NFUIGXnJyfm5mSQDM7Ozo6Ojk4NjMvLjA9SkxNTExMSkpHSUtNSURDQUVERUVYW01PVFNCSElLTU5bbW1sZ2ZJP0RbXlJQVldXVktAODIuKiktLi4uLy4uLzE0Nzk4NDg1Mi4xO0E+Ozs2OTo7PDk4MTo6MTQ0NzI4QklHPjc1PkNERkM+OT9QWFtZXGRtcXR2eX1+fX19foGDhIeKjIyMjo6QkpSSkIyHgntwZ11XWFlbXFxdXVxcXFxcXFtbV1VQSkQ8Ojk5Ojs8PEBHS1Nda3Z/hYmJiYaDf318ent8e4CEhoqLioaDgYCBhYSHjI2MjYuMiYWCfXp3dXV2dnZ2dnZ0cm1nYVlPRT89RVFea3aChouOjo2KiYmHh4iJioqKioiCeG5fVlVbYmxzdnZ0cXBvbm1ra2xtb3Bwb21rampveoWOkZGOjY+RkJCPj42LiR0dHBwcHBwcHBwcHR8fHyAhIiIkJCUlJiYnJygpKSoqKysqLS4uLi4uLi4uLi4uLi0tLSwsKyoqKSkpKSgoKCgoKCgoKCgoKCgoKCgoKCcnJycoKCcnJiYnJycnJycmJigoKCgpKSgoKywuMjU3Oj5CRElKSk1OS0hHQ0A6MiwpKCgnJygoJykpKisqKiosLC0tLS0sLS4uLi4uLi0tLS0tLS0tLS0sLCwsLCwsLCwrLCwrKysrLCwtLS0tLS0tLS0tLS0uLjRTQCgrKyoqKSoySFJuioeKcWltfo2ThYWIg3t7gH92cHJtTT9VQmJ4f3h8blhfaoCMmJ+osru7u7q6pnQ0Nzw/P0NFQ0NDRmOQjYF5eoOQiEQtQ1yDfnx9goWFiIyMjo+SkpB6SUZBRkx/lpqanJyZlUk1PDk6Ojo6OTU0Mi4rNEVMT05OS0lKTExNS0dMUFJQS0RBRV1PTlRTP0VISk1OUV5iYF5eTUtSXV1ZXF9cV1BFPTg2LSYnKisrLS0tLS0wMTI1QEE+PDxGR0hCRj88Nzk3NzkzNDU2MzEvMjYxMzc6OT88Oj48P0VLSkdBNz1OaWBIXXh8en2Bg4SFhYaIiYqLiouMjI6Oj46OjIiAeGxjVk5MUFRYWVtbXFxbW1tbXFxbWVdVUEpDOzo5ODk7PD9CRU1XYWpzf4aLi4qIg398e3p7e3yAhIiLi4qJhYGAgYKDhoyMjo6Mi4iEf3x5dnR0dnZ1dXV1dHJtZ2BYS0E8PUVRX2x4g4mMjo6NiomJiYmIiYqKioqHf3dsXVNTWmNtdHd1c3Fwb21sa2tsbW9wcXBvbGttdH2Jj5COkJSQjYyKiYmIiIgcHBwcGxsbHB0dHh8gICAhISIiJCQlJCUnKCgqKioqKisrLC4uLi4uLi4vLy0tLS0tLSwrLCwqKikoKSknJycnKCgoKCgoKCgnJycnJycnJycnKCgoJycnJycnJycnJycpKSkpKSkpKSkpKiwvMDM1Nzo/QUFBQkE9OzYyLCknJicnKCgpKSkpKSorKywtLCssLC0sLS4uLi4uLy8vLy8vLS0tLS0tLS0tLSwsLCwsLCwsLCwsLCwsLS0tLS0tLS0tLS0rKywvMS0qKioqKissQVhfe494g35SSlRljYZ/h4eCiIB0dHdzdXBiVD5MgXV0gIdyWF9vg5Cepa60ubu6uaNpMTc6PD5BQUBARkNEbZGGfXt9gIqJOzJng4B9gIWHh4mKjo+Pj5COg1ZLRERLfZKWmJuampNQNTk6Ozw7Ozo5NDEuLC9AS1BQTEpISExMTVBRUVFQTUc6MDFhVk1RTTQ9Q0ZHSlZdYmFeXmJiZGRkZGNgWlJFPDk3Ny4nJykqKisrKywsLjAwMTk9QUhLRkZPT0tFQjxFPkZPUkY/OTYxNDMzNDUzNTM4Q0Y9QEE5OkBHS0lHPzdRYVZedIOGiouKjIyMjYyLiomIh4mJiYeGhX93bmRWTUZGTFNWWVlZWlpaW1tbW1tbWlpXVE9JQTo6OTg5Ozw9QUpYXmFsd4CGiouLiYSAfXp6eXt9gYSHiouLiIaCgYGCgYOHiYyNjIuGhH98eHZ0dHV1dXV1dXRxbGZdVUlAOj1FUV9teoWLjY6OjIqIiIeHh4iKioqJhX53aVxRU1plbnV3dnRycW9ubGtrbG1ub3Bwbm1rbXWCiI+QkpWSjouJhoeHhYiIHBwcHBwcHB0eHh4fICAhISEiIiQkJSQlJygoKisrKiorKy4uLi4uLi4uLy8tLS0tLS0sKysrKiopKCkpJycnJygoKCgoKCgoKCgnJycnJycnJygoKCgnJycnJycnJycnKCgoKCkpKSkqKiopKiwtLi4xMzY3Nzc2Mi8sKSgoKCgnJygoKSkpKSorKystLSwsLS0uLi8vLi4vMC8vLy8vLy0tLS0tLS0tLS0tLCwsLCwsLCwsLCwsLC0tLS0tLS4uLS0tLi0sLSwsLCoqKystOE9ReYeAVGJbT0pNaZuZiYaNkZCOfHR5fHqAeW9IP154eHWEhm5TY3GBmKaprLC3urWaTi85Oj4+PUBBPkFCQkt7jIN9enh/i4FAd4N9e4GHh4KGi46PkJGRkZJtTkxFSXyQl5aXl5aSVTU5Ozs8Ozs5NzQzLi0sOUlPU1ZXV1dXVlNRWVtYT0IzLCgsXV5PUEosLzQ5P1RbYGVfYGpsbWhpaWlqYFRGPzo6OTkyKSgsKisrKioqKSotLi4yPUlLTVBOWE9JTEhBRk1RVk5CLzI2NC8vMTQ2MC84S0A7ODVOVElBOTlAREdBOT1RW1Rri5GPjo2Ni4qJhoaEgH59fX18eXhvamBWTEZER0tRVFhYV1hYWFlZWVlaWlpaVlJMRkE6Ojk4OTs8P0FMVFdgbHeCh4qLioiDf316eXt7fYGEh4uMi4mGhYKAgYCDhYiJioyJh4N+eXd2dXN1dXV1dHR0cWtlXFRJQDs+RlJhbnuGi42OjouJiIiHh4eIioqKiYV9c2ZYUFNbZ3F2d3VzcnBvbmxrbG1tbnBxcHBubXF5gYyUl5SQjYuLh4aHh4iKih0dHR0dHR0dHR0fHyAgISEhIiMkIyQlJignKCkrKysrLCwuLi8vLy8vLy8vLS0tLSwsLSwrKioqKSkpKSgoKCgoKCgoKCgoKCcnJycmJicnJycoKCgoJycnJycnJycnJygoKCgoKCkpKSopKSoqKioqKiwsLS0tLSsqKSgnJiYoKCgoKCkpKSoqKywsLC0uLi4uLy8uLzAwMTExMS8vLy8vLS4uLy8uLi0tLS0tLS0tLCwsLCwsLCwtLS0tLi4uLi4uLi4uLi0tKysrKywtMEpLUIWPYk1IRUpTaJCuqaGbl6CYkIyEdnZvcGtvTzo7SGKEioR+aVZceY+fpaenqbOpfDcyOTw9PDw/QUBCPj9CUYOKgnt7doCNd4N8d3yDhoF8hIqMjJGSk5GQe1JPR0l4j5WTlJSTkGA3PDs7PD09Ojg0MS8rLThYbXZ1b2phXVlWX2ViXEs0JiUlJ1RjTExILS4uMFRgZmJhZXhxcGlnamttbFxJQj88PT09Ni8xMjIxMC4pKCUnKy4uLzlBTE9JVmBRSkY/R0tMRUVKRjEjMDkzLS4vMCwvP014f19DPEVQVFNMPTk6PT1BODxNWGqQk46NioiGhYF8d3NycnFzc3Fva2VcVEpGRUhMUlRYWFhYWVlaWlpaWVlbWlZRTUdBPDk4OTo8PT5ESVBZYm95goaJjIqIg4B9enh6en2DhYmMi4qJiISDgYCBgoKFiIuLi4aDfXh4dnN0dXV1dHR0c3BqZFtTRz89PkhUY3B/h4yOjYuJiIaGhoeIiYqKioiDe3FjV1FXYGpydnZ1cnJwb25tbW1tbW5xcXFtbW90fo6WlI6MiYmKioyMjYyMi4odHR0dHR0dHR4eHyAhISEhIiMkJCQlJSYnKCkpKSkrKywsLS0uLi8vLy8uLi0tLS0sLCwrKioqKikpKSkoKCgoKCgoKCgoKCgoKCcnJicpKCcnKCgoKCcnJycnJycnJycoKCgoKCgoKCkqKSkqKikpKSkpKSoqKioqKSkoKCkoKCgoKCgpKSkqKywsLC0uLy8vLy8vLi8wMDExMTExLzAwLy8uLi8vLi4tLS0tLS0tLSwsLi4uLi4uLS0uLi4uLy8uLi4uLi4tLSwsKystLjVWSWiJgUtHRVhyhpehp62trKeim4CGi31va21zcl0/PzgzR213gn5ZXXCAkp6koZ2fik80Ozs6Ojo4Ozo8Pz5CTU9kiYV7eXd5hI6JfHh+hYGAfoiNiIyQkpCLiYNTSUhPcIuRlJSSkYxqOjw7PTw9PDg1NDAwLi5bgIR9c29pW1dVVFpdXVhFLCYpKCpIbFVMSi8sL1Rra2tnbHt5b2poZWdrbWVcUkpFQUBCPzw5NzY4NjMwKiMjJCgsLS4vOEFGUVtgUktMVFFaY19XUUk1ISs8PDEuMDAuKyo8dpGPlIdlST9KUFBRTjw3QkRCOkNXaIqQioWCfHt2cWxpaWlrbG5ubWhjXFNKRkZJTVFVWVlYWFlZWlpaWllZWVhWUUtFQDo5ODo7PD1BRktUXGRxeoKGiYuJh4OAfHl6ent/g4WKjIuKiIeHh4SBgYGDhIWIiomGgn14d3V0dXNzdHR0dHJvamRcUkc/PkNNWWVyf4eMjo2LiYiHh4aHiImKioqIg3pvYlZTWGBqc3l3dXJxcG9ubW1tbW1ucHFwb21tfZSYk42JhoiJjIyOjY2Li4yMHBweHh4eHx8gICEhIiIiIiMkJSUlJiYnKCgnKSoqKissLCwsLi4uLi8vLi0tLS0tLCsqKSoqKCgpKSkpKSkpKSkpKSkoKCgoKCgpKiwpJignJygoKCgoKCcnJygnJycnKCgoKCgoKCkoKSkpKSkqKioqKSkoKSkpKSgoKikpKCgpKSgoKSkqKywuLi4uLy8uLy8xMTExMTExMTExMjIxMTExLy8vLy8uLS0tLS0tLi4tLS0tLC0uLi4tLi4uLi4uLi4uLi4uLS0tLS0tLi8/XW5/bm5HPmGOmp+opqGjo6uqqqmOd3+Bf3h8gXpiW0tIQ0RKcXl9b15qd4iTnJmSimxEOj06PD1BQ0M/PTw+QkhKUm2If3h1dnyFinp2e4F/gXmFjX90fZGTkZKQaEVJUWeEkJOOiI6LdTw5Ojw9Ozo5NDQvLitLe356dnJwZV9YUUpIQ0RHQjQwMC0uQWxaTUwwMUVqbXJveIJ8dm5pZmNobG9taF5YVFBPSUE9PDk8OTg2LCUiIyQmKi4uLS4yRF5laFxQVlhkbGlubGlkWkc4ODQ2Ly0tNDw/RVl2eoWRkodvUURMVFVSPjk9REI4PVdviod7eHNva2hnZmdoamxsbW9pY1xTS0dGSU1SU1hYWFhYWVpaWlpbWVtYVVBKRD46OTg5Ojs8QUdMU1xnc3yChomKiIWAf3p5eXd7f4KGioyLioiIh4aGg4OBgoKEhoaGhYN9eXZ0cnN0dHR0dHNvbWdjW1FHP0BGUFxodX+Ijo6NjYuHhoaGh4iJioqJh4J4bWBVVFxkbnR3dHRxcG9ubW1tbW1tbnFxcG1whpeXko2JhoaHiYuNjYyLiYuOkh4eHh4eHh8fICAhISIiIiIhIiUlJSYmJygoKSoqKiorLCwsLC4uLi4vLy4tLS0tLSsqKikqKikpKSkpKSkpKSkpKSkpKCgoKCkpKSkuOSsnJycoKCgoKCgnJycnJycnJygoKCgoKCgpKCkpKSkpKioqKikpKCkpKSkpKSkpKSgpKSkpKSoqKy0sLC8vLi8wMTAwMTExMTExMTExMTIyMjIxMS8vLy8vLi0tLS0tLS4uLS0tLSwtLi4uLi4uLi4uLi4uLi4vLy4uLS0tLS4vRXR6ZUNSQliNqKWko6aopaOtr66ropGQjYaEhYl3bGpgZVtlV193e3tlZnJ7ho6OiXRKQjpBPj09QklKT0pEQj8/SFFScYl7d3V3fIeCc3F5e3drbod3YnOPmJqalXtFQ01ehpGOhHeMjHpANjg7Ozk2MjExMCw4cX15d3V1a2BWU1RNRUE6Ozs8OTY0ND5oWlBQMzlmanF0gYiDfXpyb3FzbGNmdHhvZmVfWFFKRUA+QD08NyokJCQkJi0tLiwpLEdkZWdeW1tkcXmFhoJ9e353YTwwNC4rNkZGRD9DTExeYFxzfH17W0ZHTEZHQDc/QD1BW3OGeXBuamhnZ2dnaGpsbm1ta2ZdVU5HSEtPUlVWVlhYWFhZWlpaWlpaWFVQSkQ+Ojk4OTo7PEJHTlZfanR9goaJioiEgH15eHh4fICEiIqLiomIh4eHhYOCgIGDg4SDhIOEf3l2dHNyc3N0c3Nyb21mYVlPRD9BR1JeaneBiY6OjouKh4aGhoeIiYqKiYeAdmpdVFRcZW50d3RzcHBvbGxubm1tbW5wcm13j5eUj4uJh4aFhoiKi4uLi42PkY4eHh4eIB8fHyEhIiIjIyMjIiMkJCUnJycoKCkpKiorLCwtLS0uLi4uLy8uLS0tLCwsKyoqKiopKSkpKSkpKSkpKSkpKSgoKCgoKCgoJycnJycnKCgoKCgoKCgpKSgoJycoKCgoKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKCkpKikqKisrLC0uLC0uLjAwMTExMTIyMjIyMjEyMTExMTExMTEwLy8vLy8uLi4tLi4uLi0tLS0tLi4tLi4uLi8vLy8uLi4uLi4tLS0tLCwuL0RtTEJARVGGqK2qqaCgoaGerK+vpZ2gopuRkpOPdm5hZW5paGZlcICCbGBudn2DhHlULjQ+RD4/QD9AQElFRE0+OkFGT0l4h312c3l6goN1dHRwV2F9d217kJSVmJiOVUJFZI+al4tyhY1+QTc3OTk4NDMyLzAuR3uLeXB0cG9tYHCBc1s6RkA6Ozs7Ojg9XVxQU0Feam54iYqDfn96en18bl9fXml3dG1lYVlYVVFLR0RCPjInIyIkIyoxLi4rKitLXl9hVFxZYWBte3VzeXp/enJqVDUwND4/PTk3OD5RbGtiXV1jc2lbTkpGT1BJPz1APkFbeIJybGtpaGdmZmhqbG1tbmtjXFZOTElLT1NUVlZXV1hYWVlZWVpaWVdVUEhCPTo4Nzo6Oj1DSVBYYWt2foKGioqHg397dnZ3eX2BhYmLi4qJh4iIhoeFhYKAgYOCg4OEg396d3NycnNycnJxcHBtZV5YTkM/Q0pWYWx5hIuOj46MiYeGhoaHiImKioqGfnRnXFRXXmdxdnZ0cm9tbG1tbW1tbW1vbW+Ck5WQjoyLioqJiIiLi4uLjo2Nj46NHh4fHx8gICAhISIiIyMjIyIjJSUmJicoKCgpKSoqKywsLS0tLi4uLi8vLi0tLSwsLCsqKioqKSkpKSkpKSkpKSkpKSkoKCgoKCgoKCcnJycnJygoKCgoKCgoKSkoKCcnKCgoKCkpKSkpKSkpKiopKSkpKSkpKSkpKSkpKSgpKysqKisrLCwuLi0vLy8wMDExMTEyMjIyMjIxMjQyMjIyMjExMC8vLy8vLi4uLi4uLi4tLS0tLS4uLi4uLi4vLy8vLi4uLi4uLi0tLSwsLi89VEdDRFR0m7Oyo6aooqSlo6qnpZ6XmKKhlZOQinFkY2RpbWdma3V5dHxga3Z9enxqPCwyOT8+P0A/Pz9CRkhKQTw+QUpNTHmHfXV2eoGGiHhsW1Zcd4CGj5GMi5CTjWNDQ0+MoKGWXoKPgT83ODk3Nzc0NDU2Nk2Uj4l+cYGfl5WGf36AUDtERDw7Ojw8O1NcTldlcXN/iYiEgIGDg4V4Z2BfXmBiYl9hYl1YVVNST01IRjwpJCMlJCUuMi8uKysyTlxfV0dRW11dYW16eXd3dXJoaWpaSkY+LjY7NSsqNFSCio+LiX5nXVNOUFZOTE0+OD0+RVqDfnNpZ2VmaGZpamttbW1qZl9YUE1LTVFTVFZWVlZYWFlZWVlaWlhWU05HQT06Ojk6Ojs+REpRWWNtd36EiImJh4N9eXZ2d3l9gYWJi4uKiYeIiIaGhIWBgIGDf4GDgoF/e3V0c3N0dHNzcnFwbWVeVkxDP0RLWGNue4WMjo+OjImHhoaGh4iJioqIhHxyZlpTWWBrc3d2dHBwb25sbW5ubGxtbXKKlpKMjIqJiIqLiYeHh4mNjo+Ojo2NjB8fICAgICEiIiIiIiMjJCQkJCcnKCcoKCgqKiorKywsLS0uLi4uLi4tLS4uLCwrKywrKysqKikpKSkqKikpKSkpKSkpKSkoKCgoKCgoKCgoJyYoKCgoJycoKCgoKCgnJycoKCcoKCkpKSkpKSkpKSkpKSkpKioqKioqKSgqKioqLC0sLS0uLi8wMC8uMDAyMDExMzMzMzIyMjQzMzMzMzMxMTAwMDAwLy4uLy8uLi0tLi0tLS0uLi0uLi4uLi4uLi4uLi4uLi4uLS0tKy8vPkZGQ05xhKaysZiara6xsra3r6yjmZKYnZaQfnZpW29qZGVobnZ6goJ7amZye3t4XzEsMDE6Q0REQT49PDlDSkg6Oj1ITUNShoR8eXx8g46Ja0hRVGuAkp2Yk4+LiH5tSkNEdpmgoYxzk3Y/Ojs7PD4/QD5DQjJWnZ2goId9k5eYhG9wa1UyNz9EPzs8PTxKX11ncG99g4OGhoWKkIlyY2JkZmNlYl5VTlRUVVJSUFBOS0MvJSMkJCYrNDQyLy01RFBeWkdDSVddXFxhcn55cWhpbWlldmhIOi0wMDY0Li80UoGLioVhXnJ8dmlYS0dDRUdCQUBBbYSBcWpoaGZnaWpsbWxvbGdgWVJNTE5RU1RWVlZWVlhaWlpbWlpaV1NNRkA9Ozo6OTs+PkRMUVplb3l+hIeHhoWBfHd2dnh7fYGGiouLiomHiIaGhYaFgoCBgICCg4GCf3x3c3RycnJzc3NwcG1kXVRKQ0FFTlplcn2IjY+Qj4yKiYiHh4iIiYuLh4N8cWNYU1pia3N1dXNwbm5tbmxtbWttbHaPmJKNiYqKi4qLiIaFhoqMj4+Ojo+PjowgICAgICAhIiIiIiIjIyUlJSUnJygoKCgoKioqKyssLC0tLi4uLi4uLS0tLSwsKyssKysrKiopKSkpKiopKSkpKSkpKSkpKCgoKCgoKCgoKCcmKCgoKCgoKCkoKCgoJycnKCgnKCgpKSkpKSkpKSkpKSkpKSoqKioqKisqKioqKi0tLS0uLi8vMDAvMDAxMjMyMjMzMzM1NTMzNDQzMzMzMTEwMDAwMC8vLy8vLi4uLi4uLi0uLi4tLi4uLi4uLi4uLi4uLi4uLi0tLSsuMDlBRU9whpCwtbWejKqvs7W5uLOtoJiSlZqXlHt6amJpYGFjc3R8gIaRkH5SYnB4dVgsKCsxNzxAQUJAPj48O0FBPD07QUtIOVqKhn17e4CGi4FFSVZfeIqTmZqXlYl0cVFERVeImZ2WdoJKQkJDREZEQ0A9PTkybqmlopuQfoiFfHlnW0lBNzU0OD9AOzw6Q2Foa3F2hIWHiIySlYBlYGdoampoZGReTTs9TFJQUFFQTUk+KiIiJScqMDU2NDI1RVFQUkZARkhQW1xfW2JuaGZjWFFSWWNpSzMwMS4vMi8sLThvhICBgHJ2gYSGhoV4TT1GQj9DRUxic3htamdpZ2hqbG5ub2pnYFlST01OUVRVVlZWVlZYWlpbXFxaWVZTTUZAPDo7Ozo8QENITVRcZ3B6f4SHh4aDf3x3d3d4e32BhoqLi4mIh4iGhoeGhYKAf4CAgYGCgoB9eHRzc3NydHRzcXBtZF1TR0FBR1BeanWAiY6PkI+MiomJiIeIiImKioeDem5gVVZcZG1zdXVzcG5tbG1sbGtuZ3eQl5GPjIqKi4uKioeEh4qOkI+Pjo6Pj46LIiEiIiEhIiIjIyMjIyMkJCQkJycnJygoKCoqKisrLCwtLS4uLi4uLi0tLCwsLCwsLCsrKyopKSkpKSoqKSkpKSoqKiopKSkpKCgoKCgoKCgnJicnJycoKCkpKCgoKCcnJycnJygoKSkpKSkpKSkpKSkpKSkqKioqKiorKisrLC4sLS0uLi8vMDExMTExMTIzMzI0NDMzNDQ0NDQ0MzMzMzIyMTEwMDAwMDAvLy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLS0tLSwsLC88RFV0hY6ls7S3oX+coaulqamnqKObkouRkol8eHFnZ2VtbnF0f4aLmqCbU1JqdXRSJygrLjg2OklEQT89PDo5PTo9Oz9HTURGe4+Hf3t5gIWLfEdPWHqKjI6Rk5OQgXlhRkNEaY2ZmIpfREE/PT9APTk6N1JgQoWuopWKiYqOcWhpWlFDODY0MzI0PkM/PEFXa250eoKFi4+amH9pZ2ZmaW1wbWtmXEIwMD5MUlFSU1JKNyYiIicrLDM2NTk6QEtST0Q3PEFJUFRXV11gY1lcXEg9NzI6R1dPNi8vMjEvLi5JX2d4e3l7fH6CgHdrb2JUPkNIRUVHRVBQU15jZ2doa2xsbW9sZ2FdVE9NTlJVVlZWVVdZWVlaXF1cXFpVUkxGQT49PT08PkJHTFBXYGlyeoCEh4eGg355dnh4eXx9gYaJi4uIh4aHhoaGh4WBgICAf4GBgYGBfXh0cXNyc3R0cnFsamRdUUU/QkhUYGt4goqNj4+Oi4qJiIiIiYmIiYmGgnhtXlZVXWZvdHVzcXBubm1qaWtqaH6Wl5GNiouMjImJiYmJi46Pj5CPj4+Pj4+MiSIhISEiIiIiIyMjIyMjJCQkJCcnJycoKCgqKiorKywsLS0uLi4uLi4tLSwsLCwsLCwrKysqKSkpKSkqKikpKSkqKioqKSkpKSgoKCgoKCgoJyYnJycnJycnJygoKCgnJycnJycoKCkpKSkpKSkpKSkpKSkpKioqKioqKyorKywtLS0uLi8vMDAxMTExMTIzMjM0NDQ0NDQ0NTU0NDMzMzMyMjExMDAwMDAwLy8uLi4uLi4uLi4uLi4uLi4uLi4uLi0tLi4tLS0tLS0sLCwvP1FvhomYrqalsp1wfo+mn5qkrKmgmY6FjZOKiHpzbGpja3F1dH2FjJ+prW5KZWpoTCorJiwuPk1LSkJBQT88Oz47Oz0+REhGRnd/jYh+e3t9g411SlJ2h4WEgH+HkI55ck5GQ0tzjY9yTEVAPz0+PTw6OjVHZFiBqZuXg36CgGZbUE1NQzY2NDMxMjY+SUhCRWBvc3iAiI2Wk39zcWtramtscHNwalg5Li8zQk9RUlJQQS0lJCcrLTA7P0JBQkZHSExCODk+SE9RTlZZWVhPQzMsLjEzMzRCT086NzYxODs2Tj08U3B1eXp/dWJda3FxhW0+TEU+SEhLTU5RVVZfZGlsbm5ua2diX1ZRT09TVlZWVlVXWVlZWlxdXV1ZV1JMRkFAPz4/QEJFSk5SW2JrdHuAgoWFhIF9eXZ3d3l8f4OHioqKiIeGh4aGh4eFhIGAf36AgIGAf355c3Nyc3Rzc3NybmhhWlFFP0JLWGNueYSKjY+PjouJiIiIiImKiYiIhYF3bFxTV19ocHR1c3FwbmxrbWppbIKWlo+Ni4uNjY2JiYmKi5CRj4+Qj4+Pj4+PjIkiIiMjIyMiIyUlJCQkJCQlJSUnJycnKCgoKioqKyssLC0tLS0uLi4uLS0sLC0tLCwsKysrKikpKSoqKioqKikpKiopKSkpKSgoKCgoJycnJycmKCgnJycnJygoKCgoJycnJicnKCgpKSkpKSkpKSoqKioqKioqKioqKyoqKiwtLS0uLi8vMDAxMDAxMTEzMjQ1NTY2NTQ0NDY2NTQ0NDMzMjIyMjExMTAwMC8vLi4uLi4uLi4uLi4tLi0tLS4uLi4uLi0tLCwsLC0tLS0sMENlgI6LoamanauXcHKRpa6urKynnpiPhIeTjoKAg31waWZucnN7g4STqa6KR19eXUcuLjMuLTZHOj5GQ0JAPD49PDw8PUJLTEh6cnqKh4B8e4CFimxNY3uAeW5ka32NjYJfRURCTGNwVEZFQT49PT07OjgxNFpqgaWTj4B5dm1lV0xDQkE3NDMzNDpDS1NTU0VHT1VYXHOFh3yAgHpxbWxvcHZ3cWlTNC0wMDVIUlRRSDgtKissLjI+SU1OT09OR0VGOjg6PkJKT09UU0lALStBYHqNm6OmpaWjlH5rXVdGMj1ANT9Zb3N5empcYXmMjoeGSkNHPEVLRVVjWFZVU1daX2Vra21tZ19YVFJRVVZVVlZVVlhZWVpcW1tbWFVPTEZCQUBAQEJESExSVlxkbXV8gIKEhIKAe3d2d3Z7fH+DiIqJiYeGhoeHh4eGhYOCgH5+f35+f39+eXVzc3NzdHNycWxmX1hPRT5ETVplcX2Fi42Oj4+MiomJh4iIiYmIh4R+dGdaU1dfaXJ0dXNwb2xsa2xqaoSXlZGOjI2NjoyMiYmJjZGQkZCQkI+PkJCQkIyJIyMjIyMjIyQlJSQkJSUlJiYmJycnJygoKCoqKisrLCwtLS0tLS0tLS0tLCwsLCwsLCsrKyopKSkqKioqKiopKSkpKSkpKSkoKCgoKCcnJycnJigoJycnJycoKCgoKCcnKScnJygoKSkpKSkpKSkqKioqKioqKioqKisqKiosLS0uLi8vMDAxMTExMzMzMzMzNTU2NjY2NTU2NjU0NDQzMzIyMjIxMTEwMDAvLy8vLi4vLi4uLi4uLS4tLCwtLS0tLS0sLCsrLCwtLS0tLDBKeJGZk4+SkZmjnIiInamytqqNmJ2YjoSEkIpze3h0dnNpcXd8hIyMl6mwo1JVV1ZAKitBQzIwMDM3REFAQD0/PD09Ozs/REpHe3Zqf46Gf3x6f4aIYFJmbWNeXl5rgo2Jfkg/Q0FBQkdIREI/PT47OTUyMjVUZIKln4B8dmlfVVRMRD84MzQ7P0dSVllbWFlZTUlHSU9VXWl6ioyGeGlocnl+f3ptRi4sMDMxN0lPSTwvLi0uMTJHWVtaXV5ZVE9HPDc2PEFGSk1OSz0yKTdYeY+mtru7u7u6u7q1rqqZaC8xNTQwP1hrdX2Ae3eChoJzfG1iQUpFSE1ObnVoYmRbVlZXXV1kZGRhW1VUU1VWVVZWVFVYWVlaW11cXFhVUUxHQ0JBQkJERktPVFhfZm92fIGChIOAfXl2dXd4e3yBhYmLiYmHhoaHh4eGhoaFg4B/fn5/fn5+f3p1cXFyc3Nzc3BsZl5WTUNARVFdZ3N+houNjo+Oi4qJiIiIiImJiYeDfHNmWVRbY2tycnRyb3Bta2pra4mYlI+Li4yNjIuLiIiJjZGSj46PkI+OjpCQkJCMiSQjIiMlJSQlJiYlJSUlJSYnJygoKCgoKCkrKyssLCwsLi4uLi4uLi0sLCwsLCsrKysrKysqKioqKioqKioqKSkqKioqKSkpKSgoKCgnJycnJiYmJiYmJiYnJycnJycnJyYmKCgoKCgoKSkpKSkpKSoqKioqKysrKysrLCwsLC0tLy8vLzExMjIzMzQzMzQ0NDQ1NjY2NjY2NTY2NjU1NDQzMzIyMTAxMDAwMC8vLi0vKy4tLS4tLS0tLSwsLCwsLCwsLCwsLCwsLS0tLSswW4aXm56TiZCNk5aanaCnrK2okZmfnZGJio+Qcnd2d3p7cnh9gYSKg3CdrqVYTlBKNSgqN0MvLTAwMDdDRT1BPjw7Ozk7QEVLSHx+c2qEioN9d3p/iINaX2RbXF1cZXeCh41vP0BBQD9CRkRCPj07OTg0MDA7VWJ8nZt8cHNrWFVQRTk5NzxDSk9UVllYW11cYFpKRERLU1xpfI2Wj3dhWnWFiIqKcDYtMDI2NjI4REExLDAyMjE8V2FhaHFtYFdQRjYyN0BJSkxIPDMsMD5aeo6ku76+v76+vr69ure0sKp9OSgwMjQ/TWR0d3+Cg4R8fImKh0xISE9TUFp/dGtqaWVgXVlZWl1eXVlXVVVVVVVVVVZXV1haWltcXFtZVVNNSUVEREVFR0pOUlZbYmhwdX2Ag4SCf3t3dXZ2eHt+goaLjIuKiIeHiIaGh4eGhoSBf317e319fnt6dnNzdHRzc3FvamReVUtDQklUX2p3goeMj5CQjYyIiYeHiIiIiIiHgntyZVdTW2JrcnZ2cW9sa2loa4mXk42LioyOi4qJiYaIi5GRkpGQjI2NjY6PkJCQjIgmJCMkJSUkJSYmJSUlJiUmJycoKCgoKCkpKysrLCwsLC4uLi4uLi4tLS0sLCwsKysrKysrKioqKioqKioqKikpKioqKikpKSkoKCgoJycnJyYmJiYmJiYmJycnJycnJycmJigoKCgoKCkpKSkpKSkqKioqKisrKysrKywsLCwtLS8vLy8xMTIyMzM0MzM0NDQ0NTY2NjY2NjU2NjY1NTQ0MzMyMjEwMTAwLzAvLy4vLjgvLCwtLS0tLS0sLCwsLCwsLCwsLCwsLC0tLCsrMmeEj52gnJmZkZGMmqOVk6akpaGjko6TjImLlIJ5eXx/fnl3dHZ8e2Ezf5uITFBLRS8nKCwuLCwrLjE2O0ZBP0M9Pzw8OzxBRkV5gHNtb42Mgnx7foSIclNaUlVXWWZ2gICGglU/Pz1AQ0NDQz09ODY0MTAwPVJfeZCNe3Bsal1KSkE0NTdASk5TVFlaW1xeX2JiT0VGTFJbaXuQmZp7Ym2MmJeYjlwtLTEzNzc1MzUzKysxNDQ5VF9lbXh8dWVZSj42NEBNT05INi4sPUhXdoymub6+v76+vr6+vLq3s7CupYQ4LjQzNDhVaGd+f3p9foKHjHtoR0ROTk5PeXhraGpoZ29qZF9dW1xZV1hZV1VWVlVWWFlaW1xdXVxaWFVSTklHR0dISEpOUlZaXmRscnd9gISDgX16dXV2eHp8gYOHi4yLioiHh4iHh4eHhoaGgoB9fH1+fn19e3dzc3R0c3Nxb2pkXVRLQ0NKVmJreYOKjI+OjouKiYeHh4iIiIiIh4J6cGNZVFtkbXR1c3BubWtpaoyZko2Ki4uLi4uKiISEiJCTk5GQj42NjY2Oj5CQkIyIKCYkJSUlJSUmJiYmJycnJygoKSkpKSorKiorKywsLCwsLCwsLS0tLCsrLCwsLCsrKysqKioqKioqKioqKiopKSkpKSkoKCkpKCgoKCcnJycmJiYmJiYmJicnJycnJycnJiYoKCgoKCgpKSkpKSkpKioqKysrKywsLCwsLC0tLS0vLzAwMDIyMjMzMzMzNDQ0NTU1NjU1NjY2NjU1NTU1NTMzMjIxMTAvLy4uLi4uL01LMC0tLS0sLCwsLCwrKysrKysrKysrKyssKywqKzVoe4ygoqGfm5qbiY6ij4Wgp6ainI2Jko+MiY6EeHZ7fXx5dm9rb2pXO11kTk1QTkArJykrLS87MS4wMjdKRD09PkA+Pzs7P0BEan94c251kIuAfHx/goVeWFdUVFtqen14eId7TT5AQUJDR0g9Ojg0MzEuMDxSXHiQf3RxbWRdS0g9ODc1P01TWVtcYWFgYWJjXUpLTlNUWmR1jZuegXeRoKOgnYNBLy8wMjU4OjUxLS0uMDQ5TV5lcHqFiX9wWUI6OTlEUVdRQi8vNUNNY4akub++vr6+vr6+vbu6uLWxrKigcjAxOEc1PlhWb3V7f3yChHtjhm4+SEdPUG9+dG1saGRlZGJiX1tXVVZXWFhWVlZVVVdYWV5gXVtaWllYU05KSUhISktNUVJWXGBmbXV6f4GEgX97dnR1dnd5fYGFiYuMiomHhoeHh4aHhoaFhYSDgH19e31+fXp3dXNzc3NzcW5pY1pQSURHT1tjcXuEioyOjo2LiYmIiIiIiIeIh4aAeG1iVlZdZm51d3Nxb2xtbIuXk46LiYqKioqHhoSCfouTk5GQj4+NjIyNjpCRkI6LhycmJCUlJScnJiYmJicnJycoKCkpKSorKyoqKyssLCwsLCwsLC0tLSwrKywsLCwrKysrKioqKioqKioqKioqKSkpKSkpKCgpKSgoKCgnJycnJiYlJSUlJSUmJiYmJicnJyYmKCgoKCgoKSkpKSkpKSoqKisrKyssLCwsLCwtLS0tLy8wMDAyMjIzMzMzMzQ0NDU1NTY1NTY2NjY1NTY2NTUzMzIyMTEwLy8uLi4uLiwpLC4tLS0tLS0sLCwsKysrKysrKysrKysrLCsrKys2ZnuRo6ObmZqblpGFopmPnKeempqVkJOQi4eMg3p2dXl5eHJtZVxXUUpQTk5NUEs8KycqKSwwLissMzQ0NDU5Pj5AQD89Oz1BP1+Jdm5sboWTh357fYOLcFFQVV5kcXx4c2x9iWtCP0NCQ0ZEPTo3NTIxLzA7TVp0en54c2hcWVNGPj86NTtQV1lfZGZxc2xmXVhXVkxMUVlhb4eZoJebnp6dm4xhMTMwMTQ2Njc0NDIxMDM2SVxlb3d8ipCMbDo3Ojs8PD5APTcwLzc/RWaXtr69vr6+vr6+vru7urazraeem5ZVMExXQDBDQmFZbYB9gHhGTX5bP0VLTlZgXlVSSklJSkxNUlFNS0pPU1dXVVZUV1lWVFtkZWVeWVtfXVZQS0lKSUtMT1JVWV5jaG92fH+Bg4F+enRzdXZ4e32BhYmMjIqJh4aHh4eGh4aGhYaFg4OAfn5+f316eHV0c3Nzc3FuaWNaUEZGSFBcZXN9hoyMjo+Oi4mJiIeHiIiHh4aEf3ZsX1ZYX2dwdXZzcnBrboiWk46Li4mKi4eFhIN+dH6KkZGQkI+MjIyMjY6QkY6NioYnJyYmJycnJycnJycoKCcnKCgoKCkqKiopKisrLCwsLCwsLCwsLCwsKysrKyoqKiwrKyoqKioqKioqKiopKSkpKSkoKCgoKSkoKCgoJycmJiYmJiYmJiYmJSUlJSYnJycmJicnKCgoKCkpKSkpKSkqKSkqKisrKywsLCwsLS0tLS4wLzEwMjIyMzQzMzQ0NDU1NTY2NTU2NjY2NTU1NTU0MzMxMTExMC8vLy4tLi4tLi4tLS0tLCwsLCwsLCsrKikqKioqKioqKioqKSopNmqGl5+al42VmpKRiZ2dm5eZm5iWi4iOk4yMi4R5ent9d3BiZ2FQRUtRT05PUUxKPCcmKCkrLSopKiwrLzMxNjE5Pj5BPj0/Pj9Qh3VvbmxyjI+DfH58hIJVQVNkcHl6cmVZYHh5XENEQj9ESD46NzQzMTAvOkxgg46NhW1hVlRTRkJCPjg8U1hbYWhudn+Gf3l3cnZnYmZlZ2l4j5uYmpmXlJGGbkQ2NjY3OTg2MjM0NDUzRWBmbHV8g4yRjWIyNzc2NTU2NzUzMDA0N0J1rLq9vr6/vr2/vb68uri1squhl5KQfk1LVVQxOVRqWF59fn6AenmDd01FTk5lV1NUUlBVWVZYV1ZRT05NT1dVVFZYW1xbVFdaXGJeWlpgZGRmXU9MS0xMTVFUWFxgZmpwdn1+gIB/fHl1dHR3eHx/g4eLjIuJiIeGh4eGhoeGhoaFhoWCgn1/fn59fHl1dnR0c3FwbWdhWlBGRUlTXmh2f4aKjI+OjYqJh4aGh4iIiIiHg3x0al1XWWFpcnZ2dHFsbYeYkZGOi4mIiIeDgoV8am6Ai5GQj4+PjIyMjI2OkJKSj4qFJycnJycnJycnJycnKCgoKCgoKSkpKioqKSorKywsLCwrKysrKysrKysrKysqLCsrKioqKioqKysqKioqKSkpKSgoKCgnJygoKCgoKCcnJiYmJiYmJiYmJiUlJSUlJicnJiYnJygoKCgpKSkpKSkpKSkpKiorKyssLC0sLC0tLi4vMDAwMDIyMjM0NDQ1NTQ1NTU2NjU1NjY2NjU1NTU1NDMzMTExMTAvLy8uLS0tLS4uLS0tLSwsLCwsLCwrKyopKioqKioqKioqKisrLzZrjJmZlpyLj5iSjYKSlZiZlpeTjIOEgoqGg4OIen96dG5pYWpjSzlDT09RT1BPSDgnKCgpKioqKSosKy41O0pHOTpAQD0+PDk7QnqCd3d1d4OSin9+f4CIcVhhaHZ7d25cRz5IWmVXRUNFQ0BAOTczMS8wLTtJYIqbnYxjR1NUVkhER0NDSFJYX2hqboCQkYmDd2ZeZWxnbXJ1dHeCh4yOiYR+d3BWPTo5ODk4NTQzMjU4Oll0dHV4gYOHjYliNjc1NDQzMDIwLi4yNjZFcZ+0u7u9vry8uLS2urq5s66kmZGNjIZaUkxVUjE0TU89aIB/gIF8fHhuVEtMTE1OUE1PTkxETFhVTUVDQ0VHVlJRW1lTWVdjZWVta2hoZm1vaF5RTUxOTk9SVVhcYmhuc3p+gIKCfnp2dHN0d3h8f4OHi4yLiYiHhoeHhoaGhoaHhoeGhIJ/f35+fn15dXNycnBub21nYVpQSUhNV2BreIGGio2Ojo2KiYeGhoaHh4aGhIF7c2lcV1xja3J3d3FwbIOWko6LiouKiYeEhYF8ZGR0g4+RkI+Pj4yMjIyNjpCSkIyJhigoKCgoKCgoJycoKCgoKCgpKSkpKSoqKiopKiwsLCwsKyorKysrKioqKiopKCsqKSkpKiopKSkpKSkpKSkpKSkoKCgoJycnJycnJycmJiYmJSUlJSUlJSUlJSUlJiYmJyYmJicoKCcnKSkpKSkpKSkpKSoqKysrKywtLCwuLi8vLi8xMDExMTEyMzQ0NTU0NTU1NjY2NjY2NTU1NTU1NDMyMjExMDAwLy4uLi0tLS0tLS0tLSwsLCwrKysrKioqKioqKioqKioqKioqMEA+aI2Yk5aaj5GWkJWMl5ualouGh4mDhIGFhX+Bin15cXFwbWxnY1RKS0tNTlFOSkg3JygoKCkpKygqLiwrLDdQPTgzPDo/Pz08OTtsjYKCf4GIj5KEfn+ChIJZaXR4enhqV0Q5NzpLYVRCP0NDQ0E4NDEvLi48S1p2mJ6IUkdHV1hNSENCTExWW1xldYWPlpyTe2BTTWJ5gYOKjI6FdGl0f3x2c21oYVNAPDs5ODc2NjY1NjpVd39+e3+EhYiGYzo4NjMyMDAvLS4wNDk8SlVvkaSss7axp52WmqiusK+onpKLiYqHWElKR1dJMDdFNEt0eX2Bf3dlgXA+TFBeY11fYFZSSFpoaGxrZVtTVWdSR1hfWmNpYVtnbWxjYFhrbF5TT09PUFBSVVZaXmJnbnV6fYGCgX15dnVzdnh4fH+Dh4qLiomIh4eHh4aGhoaGhoeIh4WDgYCAf359eXVzcnJwb21qZ19ZUElKUVtlcHmCh4qNjo2LiomIh4eGh4eHh4SAenFmXFheZm51dndycH6Wk42LioqLiYWGg4N7ZF5pd4ONkJCQj42NjY6OjY6RkY+MiYgoKCgoKCgoKCcnKCgoKCgoKSkpKSkqKioqKSosLCwsLCorKysrKyoqKioqKSgrKikpKSkpKSkpKSkpKSkpKSkpKCgoKCcnJycnJycnJiYmJiUlJSUlJSUlJSUlJSYmJiYmJiYnKCgnJygoKSkoKSkpKSkqKisrKyssLSwtLCwtLS4vMTAxMTExMjMzMzU1NTU1NTY2NjY2NjU1NTU1NTMzMjIxMTAwMC8uLi0tLSwtLSwsLCwsLCwsKysrKyoqKioqKioqKioqKioqKiwuMGGGkpCUlo2OlZWVl5ubmJaIh4COjYODi4iBgouFd3l3dnJtZV5VTkxJS05OTktJOikoKCgpKSoqKy0tLSwvMyswVkRCPT9APjs9XJOMiYaGi4+XjYB9goGHcXJ3d3l0Z1RDODU0OExaT0RBRkREPTUxLy8uPE1lepWZczRATE5QTEE8P0JTWF1kcIWYnp2WgXR1bV1SYnh8ip+anJR7bnJ0cmxmY1tZUERBPj06OTc3Nzk6TXaEgICEh4V/gGc8NzU2MzEvLi0vMzk7Q1VfZmtze4uVlYp9d4CRmpudl5CLh4eGflpERElLUVA8PE1tfXd4fn5sX4mCQ01ZY2Nla2hZUFxmbG1tbmxnYWBYUEpNW1pdWlZPVmJlVUhBXWRXUVFPUFBQUlZYWl5kaW92e36BgoF9eXZzdXd4en2BhYeKi4qJiIeHh4eGhoaGhoaHh4iHg4GCgn9+fHh1c3FxcW9tamdfWE9JTFNdZ3B7hIiLjY6Ni4qJiIeGhYeIh4aEgHlwZlxcYmlwd3Z1cXmUlI+LiYmJh4iFhIR6ZF5ganaEjY6Pj4+OjY2MjI2OkZGPjIqMKCgoKCgoKCgoKCgpKSkpKSoqKioqKioqKysrKysrKysrKysrKysqKioqKiopKSgoKSkpKSkpKSkpKSkpKSkpKSgoKCcmJiYoJycmJiYmJiYlJSUlJCQlJSUlJSUlJSUlJiYmJycnJicnKCcoKCgpKSkpKiorKywsLC0sLC0uLi4wMDAxMTAxMTEyMzM0NDU1NTY1NjU1NjU0NjU1NTQ0NDIxMjAvLy4tLS0tLS0tLCwsLCsrKysrKyoqKysqKioqKywoKikpKioqKikpKSxafYuQlJCOi5CPjJyenJmclYmKjJGSi4eKg4KLjoB9eHZ0bWRdUkU+QkdNTUtISD4tKCcpKigoKSotLiwrKCksLjpDUDs/PT48PkqQkYqHhoyTmJWIfn+ChX9kdXh2cGNPPjc3NzpFVlxPPz5CP0A6NDAuLzpLZ4SSl2guNlFkVEhCPj5BRVthZHuRnZ2XgnZ4e3B+lJaLgJqkoqKgk35ybWhnZF9aWlRPSUJAPj07OTg6NFuJiHd7gYWCfHtqRDY2NDMvLi4vMTU6P1BofX55d21hX2JlY2RseICDh4iDf3x7bmNZP0A3PDdFWkJBYnZ4dXyCgGRMYE9NaWpnZ2BeW19oam1sbm5raGFeX19XWVpYVVdcXWFqaEIwOFdvV1FRUFFRUVNWWVxgZGpwd3yAgoKBfXl0dHZ4eXx/g4iKjIyLiYiHh4aGh4eHhoeHh4iIh4SCgoKBf314dXR0dHFvbWplXlZNSU9WYGl1foSIjI6Nj4qIh4aGh4eHh4aGg394cGRdXWRrc3Z1b3WPlo6LiIeHiIeGhIN+Z19fZW56hImKjIyOjo2Pj42OjpGSjoqJkSgoKCgoKCgoKCgoKSkpKSkqKioqKioqKisrKysrKysrKysrKioqKioqKioqKSkoKCkpKSkpKSkpKSkpKSkpKSkoKCgnJiYmJSUlJiYmJiYmJSUlJSQkJSUlJSUlJSUlJSYmJicnJyYnJycnKCgoKSkpKSoqKyssLCwtLS0tLi8vMDAxMTEwMTExMjMzNDQ1NTU2NTY1NTY1NTU0NDQ0MzIyMTAwLy4tLS0tLS0tLSwsLCwqKioqKiopKSoqKSkqKi8yKSkpKSgoKSkpKSksUG19joyNjY6LiImbm5qcmIeHjo2QjYmKh4GDiZGDeHd3dG9lX1VEQENKTklLSEY9LSgnKSonKCgoKiwrKy4tMyspLjg8Pj88OjxAkJOMio6RlZaXin+Af4WKaW53dXBgTEI4ODxEWmZfVE1EQkA/OzUxLy87SFt9kpJZMlNyeGBMRUE/QEFPZm53lZ+WgnOCpaufpaamm5eusKqlnZeHe3JpZWBdWlZSTktFQT09Pj8/PjtahY9+c3d+gHt4blE4NzUzMzAwMTU4P0JWdoyNj46HfWlaVlJPTVRbXmBkYF1cWmJ0WUI/PUI0PUFLN0tlZ256goVoJmJxU1pdZGtsZmhjYmhvcHBwa2dkX19cWlhZWVlaVFRcXlg2KDFPYVVSUlBRUVJUWFpcYGZrcnh9gIODgX16dnN1eHl8f4SHjIuLiomIh4eGhoaGh4aHh4eIiYiGhoSEgX99eHRzc3NwbmxpZV5WTUxRWGFrdn6EiIyPjY2Jh4aGhoeHh4eGhoN/d29kXmBnbnN3dHSKlZGLh4WGh4iGg4V/aWNjYmZxfomMjY2Njo6NjY6Ojo6QkY+IjpQpKSgoKCgpKSkpKSkpKSoqKiopKioqKioqKioqKyssLCsrKioqKioqKyspKSkpKCgoKCgoKCgoKCgoKCgnJycnJiYnJyYmJiYmJiYlJSUlJSUlJCQkJCUlJCQkJCQlJSUmJSYmJiYmJycnJycoKCgoKSkpKikrLCwsLCwsLS4uLi8vLy8wMS8xMTIyMjQ0NTU1NTY1NDQ0NDQzMzMzMzIwMS8vLy4uLS0tLSwsLCwrKyoqKysrKyoqKioqKioqKioqKSkpJycnJycnJygpK0lrfo+GhIeJhYKLmJKLjox9h4uMiYiIhIGAgIWSgXF0eXNsaGFTTEhHRjxASUdFPC8oKCkqKSgoKiorLCstLC0tKiwvNTQ9PDc7TJaXkI2LkpaVlZOGgIGDh4JydXVtW0s8ODdEX2xyaF1XT0ZAQj84MTAtOERfcoyIUE53jINvU0pIQUE+TlVlfIWNi5KgrbWysrKspaCcrrOupJ+Of31zbGVjXllXWFRNSEJAQEJDQkBDYoKGgnh3fH15dm9bQDo7Ozw3MjU3PEBFW3iKjJGRkY+CcWpjXFZTTUdGSEhMWGdzb0xHST5HOD5FREc/SFdheYGAOEWSkoBJWFZRVmNrYl1sbXF0cW1oZGBdW1pZWFhZWldaXVxWRT9MV1lVUVBRUFJSVVlbX2NobHR4fICCgoB9enh3dnp7fYCEh4uLiomJiIeHhoaGhoeGhoaHiIqIh4WDg4F+endzc3Nzb25sZ2RcVE1OU1tjbXiAhYmMjo2LiYmIh4eHh4aGhoaDfndtZWBiaG92dXGGk5CNi4mIh4iGhYiBa2VlYmJodoKMkI+Pj42NjoyNjY6QkJCMjZWVKioqKSkpKSkqKikpKioqKioqKSoqKioqKioqKioqKyspKSoqKikpKSoqKSkpKSgoKCgoKCgoKCgoKCgoJycnJyYmJycmJiYmJiYmJSUlJSUlJSQkJCQlJSUlJSUlJSUlJSQkJCYmJiYnJycnJycoKCkpKSkpKywsLCwsLC0uLi4vLy8vMDAxMDEyMjIzMzU1NTU1NDQ0NDQzMzMzMzMxMC8vLy8uLi0tLS0sLCsrKyspKSoqKiopKSkpKSkpKSkpKikpJicnJycnJycoKSs8c4OLioaLgnp+jpaPjJCLeoKJhn9+bnaGhIOIkH1xcXFxb2NZUU9NSEZAQUpFQz4wJygpKikoJysqKissKikqKSsrLS4xNzpAS2ucmZGQkZaYl4eSjoOChIeIdXJ0bVtJQ0NDSldlb2tgVVBQSUFBQDo1LzJDW3GDeU5jh4+CenplRz1FPk5WUF15ipalsbO1s7Ctq6SblKqtpqGilod/dG5qZGFcYnBnXFFIRUREREREUHySkIN7eoF+d3VpX1xZXVxfUDQ4Oz5BQldvgoWKkZCMgXl3dXBjY2FdXFteYWZtcGZCQT1AQkM7TEFJRz9SZ3aAcGWKk42EUFBXS0pWT0tXcXJydHFuaWVhXlxbW1lZW1xcXFxcWFZaW1hVVVNRUFBSUlVYXF9jaW5zd3yAgoJ/fHl2d3h7fH2AhIeLi4qJiYiHh4aGhoaGhYaGh4iIiIaGg4ODf3p3c3NxcW9ua2ZiWlNOUFVdZXF8goeJjI6NiYiIh4aGhoaFhYWFg353bWRjZ2lyd3J8kpGNiYqKioeHhIeFcmhpZmJianiFjZCQj46Ojo6OjY2OkJGQjJGYlSkpKioqKigqKioqKCkpKysqKikpKioqKioqKysqKioqKiopKSkpKCgoKCgoKCgoKCgoKCgoKCgoKCgnJygoJycmJiYmJiYlJSYmJyUlJSUlJCQkJCQkJCQkJCQkJCUlJSYlJSYmJiYmJiYnJycnJycnJykpKCosLCsrLCwtLi4uLy8wMDExMTAxMjIyMjI0NDU1NTU0NDMzMjIzMzIyMC4vLi4tLS0tLSwrKysqKikpKSkpKSkpKCcoKCgoKSkpKSkpJycnJycnJycmKCksMmuLjYqMioN6hIyNjpCVin19hoJzZ2R+iYaHio5xXl9eYGdkUVFTVU1MTk5KRkU/MScnKSkpKSkoKygpLCorKissLSwsMDQ3VXqRnZWSlJWXlpt6ipaIhIaGiYN8f3t2cXNzdX2Ij4uCallbWlVOR0ZHQTcyP05qeGxchJWXiYSLkXRMQD5KVUxSbYyeqLGzsKyoo6Okop+jnJWSkY+MgHNta2htbWpzamNaU0tISElDQk59lJiOgoGAfXdyaWlvdHp6dmU9Njg6PkJOYXqBhouEenh7e3pzZmRqZ2BcX2Znam5aW1tYOTY6Pk1LQ0ZET2B5fFtyjJKNhFRHUks2R01lbHBydHNxb2tlX11bW1paWlxcW1xdW1pcWldXVVNRUFBOUlJVWV1fY2pucnZ8gIKCgH56eHh5e3x+gYSIi4uJiIiHh4eGhoWFhYWGhoaHiIiHhoWDgH55dnJxcXFvbmxnY1xSUFRZX2hyfIOHio2NjYqJiIeHh4eHhoaFhYR+d21mZWdtdXZ7kJGMiYmKioiHhoiEb2lpaWRiZW96iI+Rko6MjY2MjIyNjY+QkI6WlpUpKSkpKSkoKioqKisrKysrKiopKSoqKioqKioqKSkqKikpKSkpKSkoKCgoKCgoKCgoKCgoKCgoKCgoJycnJycnJiYmJiYmJSUmJiUlJSUlJSQkJCQkJCQkJCQkJCQlJSUlJSUlJSUlJiYmJycnJycnJycpKSgqLCwrKywsLS4uLi8vMDAvLzEwMTIyMjIyNDQ0NDQ0NDQyMjIyMzMzMTAvLy4tLS0tLS0rKysrKiopKSgoKCgoKCcnJiYmJicnKCgnJycnJycnJycnJigpLzNOiZCMiIWAfIKGi5KMi4h3aW5uZnSCjYuHiouKYU9PUFRWX11PTU9OS0pLSEdFPzEnJykpKiMqKyoqJyYoKysrKissKysuQW6SmpqUkpOVl5aVen+VjoiDhoiJh4aQkpSWlZKUl5eSiXVSUFJYUk1HRUpDNjRKbYh3e5SZm5GSn6OfhWhpWk9ATWaQq7Cwsq2loKCdoaykjo+go6Skop6TaVtkb4B2cW5mX1NKSEtLR0JAXYyYjoGCgHh1eHhxdoCJhH9zUDQ2Oz8/RFNpeX99cWxxdXNxbWdjZ2ZfW19jYmdiXGBzZUI3Oz0+RkpRRztOeHtke4uNioJcSU8+K0BUXWRxcXJzc29sZmFdXFxbW1tbWltbXFxcXFpYVVVRUFBQT1BSVVldX2NobHJ2eX6BgoB+fHl5e3t8foGGiYuLiIiHh4eHhoaFhYWFhoaGh4iIh4aFg4B+enZzcXFxb25sZ2JbUlBUWWBpc36Dh4uOjY2JiIeGhoaGhoaGhYWDfXdtZmdqcXV7jZGNiouKi4qHhoaHdGpubGllY2dxfomPkpGQjo6OjY2Njo6QkY2Sl5SUKiopKSkpKisrKioqKysrKyoqKSkqKioqKiopKSkpKSkpKSkpKSkoKCcnKCgoKCgoKCgoKCgoKCgoKCcnJiYmJiYmJiYmJiYlJSUlJSUlJSUkJCQkJCQkJCMkJCQkJSUlJSUlJSUlJiYlJScnJycnJycnKCgpKSoqKSssLSwtLS4wMDAwMTExMDEyMjIyMjMzMzMzMzMzMjIxMTIzMjIvLy8uLS0tLS0sKysqKioqKSkoKCcnJyYnJycnJycnJyYmJycmJicnJycnJyYoLDE7RWuGjYeFhIOGg4WLiIKDhIKHhHF2jY2JjI6OgltOTFRYVEdXYltPTk5LSktGQz0vJScoKixJbTgjKCwsKSkrLCwuLy4vMlSAmKCYkpKVmpaWj357kZWJhISIi4h6jZKUmJmXlpeXl5aFYFZYWFpcVUpGR0I6PmGNiZOVl5aapKWkoJOGk5qGX0BPjKausK+topyenaCij4qkpaaloJ+dlFs8SmB6h35zbGVaSkZITEtHQURvk5B1eoWEhYN/fX6BiIaCd2E1NTo8PUBIVWZsa2NnaWZgYGBbWVxdW1pbX2BfSlFcZ2BJOkM/N0FDRlJHSGV4f4SIi4V9UkpUPS1HQTA1ZXVzc3FuamZhXl1bWlpaW1taW1xbW1xbWlZTUk1NTk5PUlVaXWBjZWpxdXp+gYKAfnx6enx7fX6BhomKi4iIh4eGhoWFhYWFhYaGhoeIiIiGhIKAfXl1c3NxcHBubGdgWFRQV1xjbHV+hIiMjo2MiomHhoaGhoaHh4aEg3x3bWdnbnR6ipOOi4mLjIqHhIaGdmxsbWxpZmZqdYCLkJCPjo6NjYyMjY6Oj5CQlpaUkioqKioqKioqKyoqKioqKysqKikpKysqKioqKSkpKSkpKSgoKCgoKCgnJygoKCgoKCgoKCgoKCgoKCgnJyYmJiYmJiYmJiYmJSUlJSUlJSUlJCQkJCQkJCQjJCQkJCUlJSQkJSUlJSYlJSUmJiYmJiYnJygoKCkpKSkrLC0sLS0uLy8vLzExMTAxMjIyMjIzMzIyMzMyMjExMTExMTAvLy8vLS0tLS0tLCsrKiopKSkpJycmJiYmJycmJiYmJiYmJicnJSUnJyYmJycnKTE4RVlydX2FgoKIg357eoB8hpihn5+Sk5SMjI2PiXBXT1FdY1pYVWlpX0xGTEtKR0M6LSQmJykpOT0oJicoKCkoKi8wLTAvLT1hfpuflJKUl5eUlIh8fYOWjYODhIiMgoGNkZWZlpiZmZmdknJXW1pdX2BZTUREQUBuj5KSkJeWmKSqppqBc4WaoKWMYGybqqysqZ+ZmZmclH+bn5aXmpqYlI1ZPEFKcpWQfXBpYlRKSEZERUhBUH2QhYCHi4yMiIGAgYN+e3RnPjI1Nzw8QUZSXF1bXmBcVllZVE9TVFdYWl1XRUJMVV9sYTk7NjMxPVlbZVdWcICGh4aDhWNJSkU4PUA0PWZ0dHRybmlmYV5dW1paW1tZW1tcXVtbWllVU1BPT0xPUVJVWl5hZGdqcHR4fYGDgoB8e3x8fH2Ag4aJiYmIiIeHhoaFhYWFhYWGhoaHhoaHhYSCf3x4dHNzcXBwbmlmYFhSUVdcZG52f4SIjI6NjIqJh4aGhoaGh4eGhIN8d21paW11jJaPi4uJiouIhYWHfGxtb25ta2hobneDjI+Qj46Ojo6NjY2Ojo6Qk5eUlJIqKioqKioqKioqKysrKyoqKioqKikpKioqKSoqKSkpKSkpKCgnJycnJycnKCgoKCgoKCcnKCgnJycmJiYmJiUlJCQlJSUlJSUlJiUlJSUlJSUlJCQkJCMjJCQkJCQkJCQlJSUlJiYmJiQkJSUmJiYnJycnJygoKSkpKysrLCwtLi4uLjAxMTExMTExMzIyMTEyMzIxMjIzMzAwMDAwMC4uLS0tLSwsLCsqKyoqKSkpKCcnJiUmJiYmJiYlJSYmJSUlJSYmJycoJicpKis3Rlt1e3RkbXF0eHVsbGtsc4CcoqShlJWOioyQjXpeV1ldYWJhXmZnbHBfW1NNSEhCNyonJycoKCYnJycnJyYnKCgqKy0vLDVMZHiRnJeTlJiVlJGDfnx9jZOKhoKFiZB/fIOIjpKVl5iXl4pyZGFjXFtfXVZKQkA/XpKWkY2Sko2ZnZKBaFtxl6GmqJl9kJ6lqaSZlpWUl46Om5WUlJOVlpOFV0FDSmGcl4l7cWpiUUdCQUZIREBhgZSQiJCTkIyFgIOAeHRvaEgvLzI4Oz5AQ0pSVFdYV1VUU1BOUVNUV1lQOis8SE5PU01ARz85NEBXSlFPTltwe4SLiYRlS0NFQDM4RV5wdHRzcW5pZWBdXFtbXFxbWlpbWlpbWlpXU1BOTU5OT1BTVlpeYGNoam9yd3yAgYODgH58e3x+gIKFiIeGiIeGhoaFhISEhYWFh4eHh4eGh4WEgoB8eHVzcnFwb21qZV9YU1JWXmVueIKFiIuNjYuKiYaFhoaGhoeHhoWCfHZua2tvhZSRjIuLiYqJhYaKgW5tbm9tb25pbHF5hI6Qjo6MjI2Ni4uLjo+QkZaVlJGOKioqKioqKioqKisrKysqKioqKiopKSoqKSkpKSkpKSkpKSgoJycnJycnJygoKCgoKCgnJycoJycmJiYmJiYlJSUlJSUlJSUlJSYlJSUlJSUlJSQkJCQjIyQkJCQkJCQkJSUlJSUlJSUkJCQlJiYmJycnJycoKCkpKSsrKywsLS4uLi4wMTExMTExMTMyMjMzMjExMTAwMDAvLy8vLy8tLS0tLCwsLCsqKSoqKSkpKCgmJiUlJiYmJSUlJCQlJSQkJiYlJiYlJigqKi01RVlucWFgW1heY2RcU1hbXF1zj6GYlJSQiYyPjoBgVVdlaWlkZmRnaHJ6cW1oZV1LQTAmJicnJycmJycnJycmJygoKisrLC86Vmh0kJaQk5eYlJKOfnl5eYWVjYaEgYOIjoWJjZCSlZeWjIh1amdmZmRgXlxaUUY9O1uPlpGKjoyIiYJwZmFcZY2jn5yYjo2Vn6KdlpaSkYmHl5KTk5KRkZCRiHtnTU5mpqOVi3pvZVVIRFV0iYBoanmOl5KSlJCJgn+AeXJraWZRLywuLzU4Oz1CSU1QUVFQUFFPTlBSU1FDMDA+Pzg7Pjo/Q0M9Pj1BSkdJWFtKXmuBioaDdVhGSVJEPE5ZbHR0c3FuaWRfXVxbW1tbW1paW1xcWlhZVVJPTk1OTk5PU1ZZXGBjZmhtcnZ7f4CBgYB9fX5+f4GDhYiHh4eHhYWFhYSDhISFhYeHh4eHhoeFhIKAfXlycnFxcG9taWReWFVVWF5ncHiChYiLjYyKiomHhoaGhoaHh4aFgHpzbm1sgJORi4qJiYqJh4WIh3FucXBvcG9tamx0e4iOj4+OjIyLi4qKjY+QkpaVlJOPjisrKysrKyoqKiorKysrKioqKioqKSkpKSkpKCgoKSgoKCgoJyYmJycnJycoKCgoKCgoJycnJygoJiYlJSUlJSUlJSUlJSUlJSUlJSUlJSQkJCQkJCQkIyMkJCQkJCQkJCQkJCQkJCQkJCQkJSYmJicnJycnKCgoKCkrKyssLC0uLi4tLzExMTEwMDAyMTEyMjEwLzEwLzAuLi4vLy4tLS0sLCwrKysrKSkpKSkoKCcmJSUlJSQkJCQkJCQkJCQkJCUlJiYlJyYmKi40QlpyempiXlZXWVxZT0NLUVRabYeXhoeSjYyQkYFnVVJbaWJkamhjZGp0cHVtcGx3eGdEJScmKicoJyYnJygnJikoKSgqKy43RVZmdJSSkZSWlJCPi4B/fH+ElJCHgoKAhouLg5CVkpOTk4eEg4KDfnh4dnBiXVpRSD8/fZuQioqIhHxtXF9gX2N4lZmipp6IepOal5KTj4dzho2IkZWTjouKioiAfGBUeaqjnZWHdmtdTERLXXiLkpF+j5udmJCNiYJ8eHRuZmFeVjQtLikqLjM4PEJGSk1NTU5NTk9LSD8zLC83QkY3P0ZGQEtPTEk+Qk1JQExSVF9idIaFgXhLQUpaYVBab3Bxc3NxbmplX11bWlpaWlpaWlpaWlpYV1RQTk1MTE1NTlJVWFxhY2RnanF1en6Cg4OAfX9/f36ChIiIh4eHhoWEhYWDg4OEhYWGhoeHiIeIhYOBfnt2c3FxcHBubGhkXVhTVlxgaHJ5goaJi4yLiYqJh4aGhoaGhoaFhYB5cm5rd4yQjIyKioqKiIeLiXVsbm1ucHBwbW90fIGKjo2Njo2Mi42NjY+QkpSXlJOSj40rKysrKysqKioqKysrKyoqKioqKikpKSkpKCgoKCgoKCgoKCcmJicnJycnKCgoKCgoKCcnJycnJyYmJSUlJSUlJSUlJSUlJSUlJSUlJSUkJCQkJCQkJCMjJCQkJCQkJCQkJCQkJCQkJCQkJCUmJiYnJSUnJycoKCgpKysrLCwtLi4uLzAxMTExMDAwMjExMTExMDIxLy8uLS0tLi4tLCwsLCsrKysqKikoKCkoKCgmJiUlJSUlJSMjIyMjIyMjIyMlJSUlJSYnJywxQFZ1fHVmXldZZmRXUUxFSVZVXGR4e3yKjYqOjoZsWl1ga2dpa25sYmhvcGtvcHNobXKBfGQ8HyksLCkoKSkoJycnJygoKiotO05aYniTjI6VkZCOj4l8hYaFho+Ui4SCgH+FjIR8i5GPkpGUmqGdl5yfmI9+aF1cWVBIPXWclY2KiH9uWmBwcGtucIKQlZ2moY2Ij46Njo1+c3+CiY+PhH+ChoiEfn5waIOlnJmViXlvY1JEQ0huj5COeY+anZuRjImBeXNrZl5bWlZALCsoJykpKy80Nzk8Pz8/Pzw4MSwqKy4zNUVVPjY7P0VJSz9CUU5KPExMTlVWX2h5goRyPD1FUmJbYG9wcXNzcW5qZV9cW1paWlpaWlpaW1xZV1VST05KSUlLTE5SVVldYGJkZ2lwdHl9gYODgYCAgICBg4SIioiHh4aEhISDg4ODhIWFhoaHh4iIh4WDgX56dnJxcXBwbmxoZFxYVVdaYWpyeYKGiYuMjIqJh4eGhoaGhoaGhoN+d3FrcYmMjIqJiomIh4aIinttcXFycnR2dnd4fYSKi42NjIuLjI2OkJCSkpOWlJORkZCOKysrKysrKysrKysrKioqKioqKioqKikpKCgoKCgoKSkoKCkpJycoJycnJycoKCgoKCgnJycnJycmJiUlJCQkJCYmJSUlJSUlJCQkJCQkJCQkJCQkJCQjIyQkJCQjIyQkJCQkJCUlJCQkJCQlJSYmJiYmJycnKCkpKisrKysrLS4uLjAwMDAxMTAxMTEwMDExMTEwLi0tLS0tLC0uLSwrKysrKiopKyspKCgnJyYmJyYlJCMjJCQkJCMjIyMjIyQkJSUlJSYmKCsxPVVyenZzZ1VRXXF0Y11dUUlKW2Jjc3CDioaHjIhxU1BXbHVtcG1wbm1tc21vanJ0bWZzcn6LgWA3JSgrKisrKigxOS0pKCgpLjtNWmOFj4iMj4yJhouJiIeNi4iNlZGIgn19fYSJbEhYYmZ3k5mcpaasqqaZindhXlpTTElqmJiQjYR9cltzj4l8eXqAgoCRoaOXiIqIhoeGeW9wfIeLhH6EkJmfnZOCdnWCm5WSjYZ6cWpgUENUfYqHgHOFkZiYkIyGgHVuaGFaV1FORjApKCgnKCcmJykqKSkoKCcmJykrKy4xNjg9RUpORD46PTxIWFVISTowTk1FQ1Jkan17ZE5CQkNNVmBucnJzcnFtaWReXFtaWlpaWlpaWllZV1VUUU9NSkpJS0xPU1ZZW2BjZWVrbnJ5foKEhIKBgICAgYSHiYqIh4eFg4ODg4KBg4SFhoeIiIiIh4eGg4F+eXVycHBwcG9raGRdV1VaXWJrdHyChoqMjIuJiIeGhoaFhYaGhoWCfXdxb4aNh4iIiIqJiISFiYJxcnZ6fHx+gIOEhImMjo6LioyNjY2PkJGSk5ORlJKQkZCQjywsLCwsLCwsKysrKyoqKioqKioqKiopKSgoKCgoKCgoKCgoKCcnJygnJycnKCgoKCgoJycnJycnJiYlJSQkJCQlJSUlJSUlJSQkJCQkJCQkJCQkJCQkIyMkJCQkJSUkJCUlJCQkJCQkJCQkJCUlJiYmJicnJygpKSorKysrKy0uLi4vLy4vMDAvMDExMTEwMDAwLy4tLS0tLSwsLCwsKysqKioqKikoKSgoJyYmJiYmJCQjIyMiIyMjIyIiIiIjIyUkJCYnJygtNk5senVxeHNudnd3dWliXEcvQGpvc31uiI2GiYl9WEdOWXVxc391bWtzhXZnZ212fnZmbHl2hY2Mf2E3JCgrKysqMD4wJykpKS07TlppjImGiYuHhoSGioaDh4uRj5iXi4F7enZ6f4hgNU9ZZnF4kqWwsLGpoZiGbmNeXFBJY5OZk5WJhHZddZKUjYuMiISIlJyglXp4foJ9eHRxgZKUgm10h5iiqqahloF+iI+Qi4N8dnFsZFhFZ4WJioV8f5CTlI2FgHduZ2JdVU9JQzouKCYnJiYmJiYnKCgoKCcpKioqKiwuMTY6PUNETEhHPDU5Tkc8O0BHOjNBSUhUZHeCdmVcVmtoUVZdZnFyc3JxbWlkXltaWlpaWlpaWlpZWVdVUk9OS0pKSktMT1NWWV5fYmJkaGxxeH2Bg4OCgYCAgoOEh4qKh4aGhYWEg4KBgYKDhYaHiIiIiYiHhoSBfXl1cnBwb29tamZiXFdVWV9mbXV8goiMjIuLiYeHhoaGhYWGhoaEgXt2cIKQi4eFiYiIiIiHiYp7eX+DhoeJiouMjY2Ojo6NjY2MjYyMjY6QkZGRkZGQkJCPkJAsLCsrKysrKysrKysqKisrKioqKikpKSknJycnJycnJycnJycnJycnJycnJygoKCgoKCkpKCgnJyYmJiYlJCUmJSUlJSUlJSUlJSUlJCQkJCQkIyMkJCQkJCQkJCQkJCQlJSMjJCQkJCQkJCQkJCYmJiYmJiYoKSkpKiwsLCwtLS4uLi4uLi8vLi8wMDAwLy8vLy4uLSwrKywsLCwsLCwrKikpKSkoKCgnJyYmJSUlJCMjIiIiIiIiIiIiIiIiIyMkJCUlJSgrNUZkeXhzd3x8enp7dnRqX1VFPEpkcnl1cYmIhoaEbE1PXWlwc3p4d3JtcYB0cWpnbnl6fWpvenV6hIGCeFouKycqKCgpKSkrKysuQFBZcI2HhoKCgoJ9foGDiIqHg5CanZOEend1c3mDi1xHSlJaa4efrbGur6mfjnRkYFpUTmGQnJOViIF0XnaTjoySlI6FhY2UmY1waHR4a3SVpKqonYJaUFlrhJeZlJCKkpmTioN6dHFwbmVYRWeChYqLh36Mi42Gf3doW1NQT0pCOS4nJCYkJSUkJSYlJScnKCcpKCcnKS0uLzc5MjM2Nz9GUkQ1NjRKT0pZPjMrMT9QW2NiXmpqVldpcmRcW2BscXNxcG1pZF5bWlpaWVlaWllZWVlWVFFNS0pISEpLTVBTVlpcXmBiZGdrcXZ7gIODgYGBgYOEhomLioiHhoWEhIODgYCDhYWFh4mIiIuGh4WEgH55c3JxcG9ubGllYVxYVlxgZm10e4GHioyLi4mGhoaGhoWFhoeFg4B7cH6QjouIhoaHh4aHiIyFhIiMj4+Pj4+Ojo6Ojo+OjI2MjIyLi4yNjo+Pj4+Oj4+Pj4+PLCwrKysrKysrKysrKioqKioqKiopKSkpJycnJycnJycnJycnJycnJycnJycoKCgoKCgpKSgoJycmJiYmJiYmJiUlJSUlJSUlJSUlJSQkJCQkJCMjJCQkJCQkJSUjIyQkJSUkIyQkJCQkJCQkJCQmJiYmJiYmKCkpKSosLCwsLS0uLi4uLi4vLy4vMDAvLy8vLy8uLi0sKysrKysrKysrKikpKSgoKCgnJiYmJSUlJCQjIyIiIyMhISEhISEhISIiJCQlJSUqMERieHdxdnx+f3x6eHRwaFxQSFFhan1+aneKgoOCeldRV3F5bXJ7cXFxdXl0d3WAb3B+eXRvX3VyYm2KjI2Ock4zKCgoKSoqKysrNEdUXniKhYCBgX97cHR4fH2AhISOl5mVjIB2cG1xeoGEVzpPXXOHn62wrK6nil1JTU5RTk5fjZqYmpCAalBchYmMj46KiIGFjpN7amtveICVp6uno5d7U0pKR1mDmJCEipqXk4h9c29ubm9mUEFdgo6OjYV7goCFgHRiRzo0MzQyLiglJSMlJSUkJCQlJCUlJSYlJygqLC8wMTU/NTMvKisuMj5eUj9AUUo8UUctKzRBWl9SVElPdHKAf3ZuU1FdaHBycXBtaWReW1pYWFdXWFhZWVhYVVNQTEpISEhJS01QU1ZaXF5gYWNmanB1en+Dg4GBgYKDhIiKi4qHiIaFhIODg4ODg4SHhIeJiIiJh4eFhIJ8d3NycXBvbmxpZWFcWFhcYGhvdn2Dh4qLi4mHhoaGhoaFhYaGhYJ+enyQjoqKiYeGh4eIio2Mi5CSlJSRj4+Pjo6Ojo2NjYyMi4uMi4uMjIyNjY2NjIyMjIyNjSwsKysrKysrKysqKioqKioqKikpKSkoKCgoJycnJycnJycnJycnJycoKCcnJygoKCkpKCgoKCcnJiYmJiYmJycmJiYmJiYlJSUlJSUlJSUlIyMjIyMkJCQkJCUlIyMjJCUlJSUlJSQkJCQkJCQkJiYmJSYmKCgpKSgqLCwsLC0tLS0tLS4uLy8vLy4uLS0tLS0tLS0tLCsrKiorKyoqKikpKSkoKCgmJiYmJiQkJCMjIyMhISEhISEhISIiIiIjIyQlJSQoLz5Xc3hxdHp8fHp7enpyamZbTklXaXaIfXCAgoCCf2lLTlBjbm5oaWtwdHVxZnV4eXBvc3ZrZVhgcGxXkJeSkW1kZz8yJykpKSgqNUFMWWN/iIJ9fX98dm5wc3R2cnZ9hI6SkIyGe3VycHB6gYVXUWByipqusrCpgUM9REVES1BQW4qbmp6af1Q6PWRze4KFf3t4eYJ8aF9haXiIlqKfnJuTflVGSE9ri5aVjZKalIt0cnNraGtvYUhGU2x4gHtybnl5fn1jQjQwLiwqKCgnJiQjJCQkJSUkJSYmJSQlJycsLzEwMjI0NzMtKCYmKSouRV9QWFlaWVZJLCstOVFQVExceX19god6U1FPWGNwcHFwbWhjXVpYV1dXV1hWWFhXV1VRT0tKR0ZGSEpMT1JVWVteX2BhZWludHl/goKCgoKDg4SIi4uKiIiGhYSEg4ODg4SEh4iJiYqJiYmHhoOCfHZzcnFvbm1raGVfW1hYXmNqcnl+g4iLiomJh4WFhYWFhYSFhYSCfHyRkY2IiIaFhoiJjZCRkJKSk5KQj4+NjYyOjo6Ojo6OjY2NjY2NjY2KjIyOjouLi4uKi4ssLCsrKysrKysrKioqKioqKiopKSkpKCgoKCcnJycnJycnJycnJycnKCgnJygoKCgpKSkpKCgnJyYmJycmJicnJiYmJiYmJSUlJSUlJSUlJSQkJCQkJSUlJCQlJSMjJCUlJSUlJSUkJCQkJCQkJCYmJiUmJigoKSkqKywsLCwtLS0tLS0uLi8vLy8uLi0tLS0tLS0tLSwrKyoqKiopKSkoKCgoJycnJyYmJiUkJCQjIiMjISEhISEhISEhIiIiIyMjJScnLDhMa3Rycnd7fHp6fHl4cWxiVk5KW3aHiHh1g319gHlZR0dTaW5va2VrZmpzbWhsfn9yb3NvaGlnR2puVG6UhnFoZnQ/TUQpKCwqKTI8TFlmhYeBenl5e3Vsam5uamtrbnJ/h4qIh4V6cXRybnaDiGVgdo2bqq+od2lRQj09QFBZWluHlJ2dnIVWOEFTZ3d7dnJwb3BzcGpsc36JlpuXkI6MjX1UPT5Oe4+QlZWXlYx+Y1NcYGJlZlVIQkZXc3dxaWBqcHV1UzQwMS8sKigoJyUkIyQkJCUlJCUlJCYoKy0uMTI0NjMyMjAuKCYlJScpKzxTWE5WVFxXSD8vMkBKT1JYUlxsc3l/gXZtWU1XbnJxcW1oY11aWFdXV1dXV1hXV1dUUE5JR0ZFRUdJTE9SVVlbXV1fYWVpa3F3fYKCgoKCg4WGiIuLi4mHhoWEhIODg4OEhIaHiYmJioqIiIaDgHt2c3Jxb25ta2hjXltYWmBlbHR6foOIi4qIiYeFhYWFhYWEhYWEgX2KkI2Jh4eHioyOkJGSkpCPkZCQjpCOkI2Njo+Njo6Pj42MjIyMjIyMjZCRj4+OjY2KjIuLKysrKysrKysqKioqKioqKikpKSkpKCcnKSkoKCgnJycoKCcnJycnJycnJygoKCkpKSkoKCgoKCgnJygoJycmJicnJiYmJiYlJiYlJSUlJSUkJCQkJCUlJSYmJiYlJSUlJSUmJiQkJSUlJSUlJSUmJiUmJicoKSkqKisrKy0tLS0uLi4uLS0vLy0tLS0tLS0tLiwsLCwrKikpKSgoKSkoKCgoJyYmJiUlJCQlJCMjIiIjIyEhISEhISEhISIiIyIiJCUoKzVHYXNxc3Z7fHl5eXt4dXNqYFVKSmN/j4d1fYF6e3xuTUVMXWhpaWplYmRnam1sdXeEcmOCgnhvaUdQd19FgWtkZltoaG52WjorKys0P0tXYISEfnZ5d3ZzbGpraGNkaWZpbnF1d3h8gHVxbm5yeIKBbHqKlaKed2F3UT03QFhucGhgjo2UkJSNYDlAYW+GgXJtamlrcG5qa3eGn6ScjIN9e3dkSEE9TXKEhouKkI+GeU0vM0FRYV9QSktVb3pybGJbZHBwa0osLzAvKyooKCcmJiUkJSUlJiUoJygpKzAyMTIxNTc0LisqKSUmJykrKSs3QUZRUVVNVmdDQUBKTVJTTVhWX11ma3t0b2FLVmlycnBtZ2NdWVdXV1ZWV1dXV1dWU09NSEZEQkNFSEtOUlVYWl1eXmBkaGtwdnyAgIGBgoSGh4mLi4qIhoaFhYWDg4SEhIOGh4qKiomIiomGg396dXJxcW9tbWpoZF9YWl9hZ291fICFiYyKiIiGhoWFhYWFhYWDgX+IkY2Lh4eHioyPkpKSkZCOj46Pjo2PkI+QjoyMi4qMj4+OjYuLi4qMjZCSkpGQj42MjY2MjCsrKysrKysrKioqKioqKiopKSkpKCgnJykpKCgoJycnKCgnJycnJycnJygoKCgpKikpKCgoKCgoKCgoKCcnJycnJycmJiYmJiYmJSUlJSUlJSUkJCMlJiYmJiYmJSUlJSUlJiYlJSYmJSUlJSUlJiYlJiYnKCkpKioqKystLS0tLi4uLi0tLi4tLS0tLS0tLSwrKysrKikpKSkoKCkpKCgoKCcmJiYlJSQkIyMiIiIhIiIhISEhISEhISEhIiMkJCUnKjNDW25vb3Z7e3dydXd2d3V0Z11VSklpgZCIc4F8enx9YklHUGBhY2ZqZmZoY1VOVllYY2dRXVlXUVZEPmNvXYGAiWRXZ11oZllWSTkvMz5KVlp+hH16dnV2cnBvbGllY2JhXl9hZ2VjYnl9cWxubWx1gn1ziJCTUlNbUT46SmuEjoVyY5CQkIl7gnBMUWt2j4p5bmlmYmVqaW95l6aejnp2cXFrTT06PEtjdX+FiJePgnBELywvP2NnXllbaISIgXNmXWZtal9GKi0wLSsqKCcmJiYlJCUlIiMlKSkqKi80NTY4PkZDRDwrJygmJiYoKSkpMDc/SVldVV1jUEBFTEZNV2tcU1dTXmt5S0BdTGZrZnFvbWdjXVlXVlZWVldXV1dWVVJQS0ZFQkFCREdLTlJVWFpcXV5eYWZqb3V7gYGCgoOEhoeKi4uKiIeFhIWFg4OEhIWHhoiKioqJi4qGhYF9eXRwcnFvbW1qaGNeV1lfZGlxd32AhYuMioiIhoaFhYWFhYWFhYKFkI2LiYqKjI+QjpCQkI6Njo6Nj5GRkI+OjImHhYWHjI+PjYyLiYmLjI+Sk5GQj46NjZGSkI8rKysrKysqKioqKiopKSkpKSkpKCcnJycoKCcoKCgoKCgoKCgoKCgoJygoKCgoKSkpKSgoKCgoKCgoKCcmJigoJycnJyYmJiYnJyUlJSUmJiYmJiYmJiYmJiYmJiUlJSUlJSUlJiYlJSUlJiYmJiYmJicoKCgpKCkqKisrLS0tLS4uLS0tLS4tLS0tLS0tLS0sKyoqKioqKSkpKCgoKCgoKCgmJiYmJSQjIyMiIiIhISAgICAgICAgISIhISIiIyQkJzBCXG5sbXF7e3RxcnZ4eHl3b2ZcUkRCboWPeGuAeHh5cVZGSFFiaGptZmJVVE5ES0hIRUZKRT44ODc7QkFGXlpKiIxwYX50cG5hVEtIQTs+SlBWeYN9eXRxcXFzc29oZV9bWldZWmFhV0hJcXVwb2lma3eCdXyHW09WTj88THaOmpqPb1+Gi4yKc05jZWV6eo6Gd21nYl1iZmVqgqOgkod4bGVoXkhCPTtHWmd2f4mOhXtgPCwsM0dpdm5ZWGaAi42DhXFsbWVVPikqLCwqKignJiUlJCMkJCMiJCYlJiw6QkVFREdHQj01KSYmJiYmKCknKi8zOkRESldkYFpWRkA7QExXWFpcPkJbVDI4ZlFOXWlycG1oYlxYVlRUVVdXV1dXVVRRTkpFQUBAQUNGSk1RVFhZWltcXWBjaG1yenx+f4CDhYWKi4uIh4iHhIWEhISEg4OEhoaHioqLioqIh4SBfXhzcXBxcG1samdhXVpbYGRqcXh9gYaLi4uLiIaGhYWFhYWFhYWCjpKLh4uNjo+PkI6Oj4+NjYyLj5CQjo2MiIaDgYCCiI2NjYyLjImKio2RlJOPj46MjI+QkY+OKysrKysrKioqKioqKSkpKSkpKSgnJycnKCgnKCgoKCgoKCgoKCgoKCgoKCgoKSkpKSkpKCgoKCgoKCgoKSkoKCgoJycmJiYmJycnJSYmJycnJycnJycnJyYmJiYmJiUlJSUlJSYmJSUlJSYmJiYmJiYnKCgoKSgpKiorKywsLCwuLi0tLS0uLS0tLS0tLS0tLCsqKikpKSkpKCcnJycnJycnJiYlJSQjIyMiIiIiISAgIB8fICAgICEiISEhIiMkJSw8VnFwaG50eXRtbXByc3d4dm5iVk09OmiGh3Jyd3J3eWtOQ0hVZ2lsdmRXR0RHQUpQS0tKSkRHQT47O0BGP09dOmt7hYiHhH50Y1RNSUVBQEZKUXKCenZzcm9ucHJuaWVfW1lPTlRgXlJGMkdqbW5qaGhudoB8Y0BLTk5FSG+QnaKekGpcb4WLhnk1MUx3k5CJgHdrZF5bXmNcZpmflod8b1xhbFxGQkBETVdha3F3dnVuVTgrLTtSaHR+d2ReZHiGhoSEe2lfUzQmKS0sKiknJyYlJSQkJCQjIiIjJCgvOkJEQz86ODc2MCcnJyYnKCgnJyoxNjo9OEdRWFtZVk9JS0NMWVpSUEY2UVxNVmpZSllyc3BuaGJcWFZUVFRTVlZVVVRTUExKRUFAP0BCRUpNUVRYWVhaWlxeYWVqcXd9fn+Ag4WGiIuLiomHhoSFhISEhIODhIaGh4qLi4qJh4eEgHx2c3FxcXBtbGpnYV1aXWFma3N7gIOJi4uLi4iGhoWFhYWFhoaGio+Li4qMjo6Njo+NjY2NjIyPjo2Ni4mFgoB8eXt+gomNjo6Mi4qKiouPk5OSjY6Ni42SkZGPjiwsKysrKysqKioqKioqKSkpKSkoJygpKCcnKCgnJykpKSkoKCkpKCgoKCgoKSkpKSkpKiopKCgoKCkqKCgoKSkpKCcnJyYnJycnJycnJygoJycnJycnJycnJycnJiYnJyYmJiYmJiYmJSUlJSUlJycnJygoKCgpKSorKysrKywsLS0tLS0tLS0tLS0tLCwrKysqKiopKSkpKSgnJycnJiYmJiYlIyMkIyIiIiEiIiEhISEgICEhISEhISEhIyMjJik3T21yaWtxdnNsaWprb3F2d3RrY1ZLPztqkIt0eXJweHdiS0hQYWdfYGhXSkZESUNITktMS01FQ0JAPj8+RUBBSkQ6PHeNh4R9cmJVTUZEQ0NCRkxnhHd1c3FubG5vbmdiW1hbU05OQ0xPSTksRmpqZmpoam93ekc8QklJR22ToqOjoY1zYV2BjoaHQys9gJiNhHt3aF9cWVhaU3WhmI2AcFtQWVxNOzpCSVJXW2FkZmprYU03LDdJXGludn52anmMkIV6f31rXEosJSgqKiooJyYlJCUlJCMjIyIiIiEmLzc6PD8+PT07ODEoJycnKCgnKCYqMTs9NzlCR0lbXltcR0ZBREtLSVZgUkBZUmNuXkpcc3RwbWdiXFdVVFNUVFRUVFRTUk5LR0NAPz9AQUVJTFBUV1hZWlpaXF5iZ250eH1+gIOGiImLi4qJh4aEhYSEg4ODg4SFiIiLi4uKioiHhIB8dnJxcHBwb2xqZ2FdWlxgaG51e4CFiIuLiomGhoWFhYWFhYSGipCNjIyOjoyMi4uMjY2MjY2MioqIhoJ+fHl5eHl8gIWLjo+NjYyKioyOk5OSj4+Ni4uPkJGPjY4sLCwsLCwsKyoqKioqKikpKSkpKCcoKSgnJygoKCgpKSkpKCgpKSgoKCgoKSkpKSkpKSoqKiopKSgpKigoKCkpKScnJycmJycnJycnJycoKCcnKCgoKCgoJycnJyYmJycmJiYmJiYmJiUlJSUlJScnJycoKCgoKSkqKysrKyssLC0tLS0tLS0tLS0tLSwsKysrKioqKSkpKSkoJycnJyYmJiYmJSMjIyMiIiEhISEhICEhISEhISEhISEhISMiIykwRmZ0bWtwdHNta2hpam1wc3Vya2NWSj42ZpeSf35xdXh6XENIUWVrX11fUERGSUxHTVFPTUpKREJBQEE/QEJEQ0NGQG6EiYeDemtZTktFQ0JCQURHX4V4dnRxbmppa2pnYV5aVlBHPjYzOz04NjdWbWdnZmZnb3dxRjo3O1+Mo6akpp6HdWBleYyGiUsxQISXh4N6c2JaWFZWTlSIm5KEeWpPTllQOzE5QktRV1lcX2NmZVxKNjA9UWNpa2t1fH6ZnJKCenx3ZFQ+KiYnKSkqKCcmJSQlJSQjIyMiIiIjKjM6PT9BPj47NjMwKyYnJygoKCgmKS0yMzE5PDpEVVtSV1xEP0RRVFVeaV1MYnd4fmdEWGt0b21mYlxXVVNSU1NUVFRUU1JOS0VDQD8/QEFFSUxQVFZXWFlZWVlcYGRrcXh9foCDhoiJi4uIh4eFhIWEhIODg4OEhYiJi4uLioqIhIF/e3VycXBxb25raGVgXFteY2ltdn2Bh4mLi4qHhoaFhYWFhYWFh42Oj4+OjoyLiYmJioqLjY2Li4iEf3x5eHh3d3h7fYGIjY+OjY2Ni4uNkJOSjY2Mi4uNkZKQjoyLKioqKioqKioqKioqKiopKCkpKSkoKCgoKSkpKSkpKSkpKSkpKSkpKSkpKioqKioqKysqKiwsLCsqKioqKSkpKSkpKCgoKCgoJycnJykpKSkpKSkpKCgnJygoJycnJygoJiYnJycnJiYmJiYmJiYnJycnKSkpKioqKSosLCwsLCwsLCwsLi4tLSwsLCwsKyoqKSkpKSkpKCgoJyYmJiYmJiUlJSQjIyIiIiEhISAgICAhISAgICAhISEgIiQjJCgvQl5xbWpvdHRsaGZkYWRpbnRzc2tiVUg4MVWUkYR2bnN6bVtIS1NkYVxdWkxESk9OTk9SU1JLR0dFRklMQTw+QD9DRURXh4eGgHJnVUpHQ0JBQkA+QFyHeXNvcG9raGhoZWFdWVRQSDkxMTU1NTU2PGlsaWdjZWhtfVgwMkFzmKKlp6SVhW1cdnF/goJgNz53kYd9c2hWUlVUVE1xm5aFeW5eT1phVDU0O0dOVFhcXmFiY2BZRjk/S1pkZ2ZnbHBok5mPgnlzaV5UPywoKSkoKSknJSUkIyMjIyMiIiEjJTA5PD0+P0A8ODMxLyonJygoKCgmJigtLjEzNDc6PEpaWkpTT0M9QElITFBMWm13bmlkRVdtdXVuaWNbWFNSUVBQU1RTU1JRT0pFQj49PkBCRklNTlJVVldYWFdXWF1iaG51enyBgoWHiYmKiIeHhYWEhIODg4ODhYaIiYqLi4mJh4eEgHt1cnFwcG9samZjX1xdX2NpcXh9goeKjIyKiYeHhYWFhYWFhY2Ojo+Pjo2LiYiIhomKiomJiIN9eXZ2dXZ2d3l7e3+Dio6Qjo6NjYyLjZKSkY6Li4uKj5KTkY6MiyoqKioqKioqKioqKioqKSgoKCkpKCgoKCkpKSkpKSkpKSkpKSkpKSkpKSoqKisqKisrLS0sLCwrKiorKyopKSkpKSgoKCgoKCgoKCgpKSkpKSkpKSgoKCgoKCgoJycnJycnJycnJyYmJiYmJiYmJycnJygoKioqKiorLCwsLCwsLCwsLC0tLCwsKywsLCsqKikpKSkpKSkpKCcmJiYmJiYlJSUkJCQiIiIhISEgICAgISEgICAgISEgIig1JSYtP1dydGxudHVuaWViX1xfaW5zd3FqYVRHNi1KkJKEdHJydmFPSkxPXVlTUk9DRk1PTktMUFlbUEhISUZITFBOQkFAQENEQYCIhX1uX1FJQ0E+Oz08OTtUhX1xb3BuaGZnZWNfXFZVUEQ1MzMxMTMzNTZNcGxoZmVjbHR0PixPfpigo6KYin1jWndgdn98cjo2b5B/c2tYTk9SUlFXhpaHd21jWFRWWlVCP0RLUldbXV9gY2FaUkhFTFJcYmRna3B5gJmOfXNuZ19aVUAsKicoKCkpJyUlJCMjIyMhIiIhIyw3PD0+P0A/PDg1MzArKCcoKCgoJycmKy4xMzU1NTc7Q01PQkZVWj5BT1xUVllcYk1TXEpSaXZ3cGxlX1dSUFBRUFFTU1NSUU5IREE+PT5AQUVJTU9TVVZXV1dWVldbX2Ztcnd9gYOGh4mJioiHhoaFhISDg4ODg4WGh4iKiouJiYeHhH95dHJxcHBvbGpmY19cXWBma3J5foKHiouLiYeHh4WFhYWEgouSkZGPj46Mi4mIiIaIiomGg314d3R1dnd3d3h6e3uAhYqOkI6OjY2LjJGRj42MiYqKi5CUk5CNjIsqKioqKysqKioqKiopKSgnJygpKSkoKSkpKSkpKSkpKSgoKSkqKisrKisrKysrLCwrKywsLCwsLCwsLCwqKSkpKSkoKCkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkoJycnJycnJycmJiYmJiYmJicnJycoKCgpKysqKiwsLCwsLCwsLCwsLCwsLCstLSsrKikpKSkpKCgoKCcmJSUlJSUlJCQkIyUlIiIiISAgHx8gICEhICAgICEhICAiJSgsPlZvdW5xc3ZvamVhXVdWXWlxdnZya2BTRjU4W4mPfHByc2xcUUZHUFRMREFDREdNS0tKTE5dXE9GREJBQEBSVkQ9QT5EPj5ph4F2bWRbVEQ7ODg4Nzc5Qn5+cmxsamhkY19YVldWUkw8Li4xLy4vMDI3NWRyamFgY2dpc185XnyPmZuUioFuTlJeQ2F/dnNHN3KNeGxhR0dHTU5OZIOId2heT1JUUExTVVBTVllcXl9fYmRiYFJKTlddYGRsb2xwj5mOfG9pZWJbWVM9KygmJycoJiYlJSQjIyMkIiEhIiYxOz09P0BBQD47ODY0LSYkJiYnJyUkJigsLzAyNTY3Nzc8SUZGS1BHQ0ZOTVVkYlpUVlZPRUllenFsZl5YUlBQUU9RUVFRUlFMSENAPj0+QERHSk1PU1VWVlZVVFVWWV1janB2fICBh4iKiomIh4aFhYSFhIODg4OFhoiIi4qKioyKh4N+eHJwcXFwbmxqZWJeXV1haG50en+EiIqKiYiGhoaGhoSEhIeQkpKRj46Mi4qJiYmGiIWCfXp3d3Z1d3d3eHl5ent8gIaLjo+Ojo2NjY6RkI+MioqJi4+SlZOPjY2MKioqKisrKioqKioqKSkoJycoKSkpKSkpKSkpKSkpKSkoKCkpKiorKysrKysrKywsKyssLCwsLCwsLCwsKikpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSgoJycnJycnJiYmJiYmJiYnJycnKCgoKSoqKSssLCwsLCwsLCwsLCwsLCwrKysrKyopKSkpKSgoKCgmJiUlJSUlJSQkJCMkJCIiIiEgIB8fICAgICAgICAhISAiIictPFZwdW5uc3dwaWZiXFRQUF5rcnh2b2ddUEQ1Nk13hnRtcHNeTFRFRExIRUE/REVHRklJSUlQVlZPRUVGPz49OzlEPz8+PUFASoGAdGxnZFRBOzY3NjQ0NjhifnNtamdlY19cUUxOTUlFNioqLy4sLi8wMThPb2plZGNhYmZwW2N7ipCMhHptUkZGQ0JXfnVwVTp2inRrXEJFR0xLUmt2dWleVFNUVlhDPFBaWVtaXWBiY2RmZWJWUF5naWdseGxdd5OQfG5nYV9dVlVSPysoKCcoJyYmJSUkIyMkIyIhISEpNTw+Pj9AQUA/PTw4NSskIiMjJCQjIyUmKi4xMDM3OTw7Ojk4ODlDTUxMUVtVWF9hV0VJX2RLT3F0bWRdWFNRUE9RUVFRUVBPTEhDQD49P0FDRklOT1NUVVZWVVRUVVdcYmtwd3yAg4eJioqJiIeHhoWEhISDg4ODhYaIiImLioqLioiAfXdycHFxcG5samRhXl1eYmlxdXuAhIiKiomIhoaFhYWEhIWPkZCSkI+Oi4qIiIiJiIJ/fHd3dnZ1dnZ3d3d4eHp7fYOHjI6Pjo6NjYyPkY6NiomJioyRk5WTj42NjCoqKioqKioqKSkqKSkpKScoKSkpKSkpKSkpKSkqKioqKSkqKikpKiorLCosKyssLCwsLS0tLS4uLCwsLSsqKysqKisrKioqKikpKiorKyoqKiopKSkpKSkpKSkpKSkpKScnJycnJycnJycnJycnKCgpKSgoKSkqKiorKysrKy0tLCwsLCwsLCwrKyopKioqKSkpKCgoJygoJiUlJSUlJSUkJCQjIiIiIiIhHyEfHx8fHx8gICAgISEgIycpOVRvdnBuc3dza2VhWlRNSk9daW90c21lW05DNzVJXYFrZmhxU0VHQz1CRUdDQkRFSEZHSUlJS1FRTkZAQkJDRUQ+O0I9PT4/QDpte3JrZmNNQEQ9NDExMjM1O3JyaWVlZWJgWlFLTk9LRTYtKiotLS4vLy43QGluaWZiYFxgamlpd4SGf3hsVD5GQkFLWH14amJCeoZ0ZldAQkhKTFZkZ2VcVFNUVlZFNC44VmdgYF9jZWRkZ2dnXF9pbWxye3JeYIKIfGxlX11cV1FQTj4rJSYnJycnJiUlJSQkJCEiISImMTo9P0BAQENCQD8+OzQsJCIiIiQkIiIkJScqLi8xNTo9PT03MS4rLjZIVlhQUllZaWlMSWJiWkxtdWtjXFhYWlJPUFBQUVFRTkpGQT49PkBDQ0ZKTVBSU1JVV1RTU1VXW2JqcHZ8f4KHiYuJiIiHh4aFhIWFg4ODhIaHiouMjYuKi4mFgHt0cnBwcHBubGpjYF1dX2VpcHV8g4aIiouJiIaEhIWFhISKkZOSkY6Oi4mJiYiHiYR6eXl3d3d3dnd3d3d2eHl6e3+EiY2OkI+Njo2NkI6Li4mJhomOlZaUko6MjYspKSoqKioqKikpKSkpKSkoKSkpKSkpKSkpKSkpKioqKioqKysqKisrKywrKysrLC0tLS0tLS0tLSwsLSwsKysrKysrKysrKioqKisrKysrKysrKiopKSoqKSkpKSkpKSkoKCgoJycnJycnJycnJygoKSkoKCkpKSkqKysrLCwtLS0tLCwsLCwsKysqKSkpKSkqKigoKCcmJiYlJSUlJSYkJCQjIyIiIiIiISAgHx8gIB8fICAgICEhIyUrN1ZweW9scXZ2b2dhXFVNREVPXWducXNrYldKPjQyNGB+aGdtb0pGQz46QENHRURERURHSEhJSUZLT1FUWGRubnFva2NVUlVfUDc5V3hxamdfT0JAOTMyMTIzMTJIcmpjYmFfXllRTElNTk1HOy4qLjEvLi8yMzdKb25pX1xbXWJtc3d7fHVrXEE/QkRNU2Bybl9fTXWEc2VTQUdJSk1aXVpYVlRTVVJAMC40Q19qbW5rZ2dmZ2lpZWNrb3J0emdbV2B6e2xjXVlYWVJQTUo7KiYlJignJyYlJSUkIyIiIiEjLTk8PkFBQEBCQEA/Pjs1KCIjIyMjJCMjJCUlJSgqLjEzNzk4NjIsKysuPFJgWltfYWxmYVBJRlNKZnJuZVxXX15eWU9QUFBQTktIREE+PT5AQ0ZJTE5RUVFRU1RTUVFUWFxja3F4foCDh4qKiomIh4aFhYSEhIODg4SGh4qLi4yLioqJhIB6dHFwcHBwbmtpY2BdXWBmbHN2fIOHioyLioiGhYWFhYOHjI6Sko+Oi4eHh4iJh4B9eXh5eHh3d3Z3d3d4eHh6ent/hIiNj4+Ojo2OkJGMiomIh4mMk5aWk5COjIuLKCgpKSkpKSkoKCgoKSkpKSkpKSkpKSkpKSkpKSoqKiorKysrKysrKysrKywsLCwtLS4uLi0tLS0tLS4uLCwsLCsrKysrKyoqKysrKyoqLCwsLCsqKiorKyopKiopKSkpKCgoKCgoJycnJycnJycoKCkpKiopKSoqKiorKywsLCwtLSwsLCwsLCoqKyoqKikpKSopKSkmJSUmJSQkIyMlJSQiISIjIyIiISEhHyAgICAgICAgISEgISMnNVFueHJucHV1c2xjXVZMQT1EUF1mb3JwaV5XSjw0MTFmfGtob2tFRT85OT1CRUZGRUVERklFQ0ZDQ0xpgpCVmpCGeHZ3aVVfcXlZNz9zbmtlW00/NjIxMTEwLi8xM1hrY2BeXVxYUk1KSUpNTk5HOSsqLS8tLzM0M1JybWFXWFlcYW16dnBqYk08QD9CXWBnYllaWFJtgW1gTkhKTUxPUlJUVFVTUU09MzAzQFNncXR4enZva2lsbGptcnl9clpJWlBXZmZjXltYWVRNSkhENSckJiYnKSgnJSUlJCMiIyAjKTc9Pj1AQEBAQUFAQD88MyYfICMjIiMlJCQjJCQlJygpLC0uKisqKyopKy03UFxSWmNkYmFbXGlbS1tzb2lfY1tAVl9TT09PTUxIR0NAPT0+QUJER0xPUVFRUlRSUVBRU1hcY2tzeX2Ag4eKiomIh4WEhISDgoKCgoODhYeKi4uLioqKiYV+eXNwcHBwb21qaGNhXV5iZ25zeX2DiIqNi4mIhoaGhISGjJCTkZCNi4mHhYWKin97e3h4eHh5eXh2d3d3eHh3d3p8gYaJj5CPjo6NkJKRjIqJiIiLjpOXlZKPjoyLiigoKSkpKSkpKCgoKCkpKSkpKSkpKSkpKSkpKSkqKioqKysrKysrKysrKywsLCwsLi4uLi4uLi0tLS0tLSwsLCwrKysrKysrKywsLCwrKywsKysqKysrKysqKSoqKSkpKSgoKCgoKCcnJycnJycnKCgpKSoqKSkqKioqKyssLCwsLCwsLCwsLCwqKikpKikpKSgoKCgoJiYmJiUkJCMjJSUkJCIiIyMiIiEhIR8gICAgICAgICEhIyQoN0xrd21tc3V2dXFpYVpPQTo9RE9eaG1ubGZeVUg8NDM+dHZoZ25jQUNAOjk/RUNERURDQUVIS0ZCQkhoj6OqqqGVi3x3eHtoV2eCe1QvYG9sZVtLPTYyMjMxLy4vMTI8ZGNfW1lYVlNQTEtLS0tPTUpCNjEtKy0zMSsvWmZeWFVdXV9mb3dqYVlDPTxGYWNiYF1aUFRkZHtkVUdITVBRUlRVVVVRT0g/NDExO05ebXd0cnd4dXJxcXFwcnN0dV1HVk9EUVpeX1tYVVVSTEhFPzImJCcnJycnJiUlJSQjIyIjKDM8PT4/QEBAQEFBQEA/PDIlHyAjIyIjJiYjIyQkJi4pKSYlJioqKisqKyssLjNGSltfX1hgZFpfWUxWcXJiWkUpNE5OTE9PT01MSEVCPz09PkFCRklMT1FRUlNSUVBQUVNYX2Rsc3l9gYSHioqJiIeFhIWEg4KCgoKDg4aIiouLi4qKi4iDfnp0cHBwcG9taWdiYF1eYmhudHl+g4eJjIqJh4WFhYWGipCTkZKPjYuLjIqHi4R5d3l6eXh4eXh3d3d3dnd3d3h6fIOHjY+QkI6OjpGTjo2MiYiHi5GUlpKRj46Mi4opKSoqKSkpKSgoKSkpKSkpKSkpKSopKSkpKSoqKioqKisrKyssLCsrKywtLS0uLS4vLy4uLi4uLi0uLSwtLC0tLCwsLCwsLCwtLSwsKyssLCwsKysrKysrKyorKyoqKiopKSgoKCgnJygoKCgpKSoqKioqKiooKioqKioqLCwsLCssLCwsLCwsKikoKSkpKiooJyYmJiUlJSUlJSUlJSYnKiolJCMiIiEiIiEgICAgICIjICAhISUoMElqd21obnR4dHNuZlxTQzc2P0hRXmhvcGxnXFFGOjQ2UH5yYWJsX0FCQTo2P0VCQkJDQ0BDSFFKP0heip6lraWUjpKUioGBcVpifYl3O0Zya2VaT0A2MjIyMzMvLjE1NT5eYFdWVVRTUk5MTU1LTExLS0g8LyksLy0mJzRfYl9bWFteZGVxbl5SPTtAXl9VWlpcV1BHUFFrYFBDSkpNTlJYXGBdWk5FOzMxM0VZZnB2dXFwcnFtamxvb25ubHBLT1VHRlFbXVxaVlVUTkpGQjotIyMkJSYnJyUlJSUkIyMkJzI5Ozw+Pz9AQUFBQUBAPzovIyEgISIiIiMmIyEiJSkrKSkrKyoqKysrKywqLC8vMURWbWlnZl9malhSVm5naGBOKzFGT1BOTk5MS0dEQT49PT5BQkRHTU9QUFJSUVBQUE9SWWBnb3V7foKFiImJiYiHhYSEgoGCgoGBg4SGiYqLi4uLiomFgn55c29vb29ubGhkYWBfYWRqcHZ8gISIiYuJh4eFhIWGi5CRlJKPjo6Oi4yNjIV8e3l6eHl4eHd3eHh4eHh4eHd4e36Ei4+Qj4+Ojo+SkY2Mi4qKiYyUl5aTkY6MjIqKKCgpKSgoKCgoKCkpKSkpKSkpKSkqKSkpKSkqKisrKiorKysrLCwsLCssLS0tLi4vLy8uLi4uLi4tLiwsLSwtLSwsLS0tLSwsKyssLCssLCwsLCwsLCwsKysqKysqKioqKSkoKCgoJycoKCgoKSkqKioqKioqKCoqKioqKiwsLCwrLCwsLCwsLCooKSspKSkpKCYmJiYlJSUlJSUlJSUmKjAwJiMiISIhIiIhICAgICAhISEhIyUmMUZkeW9na3J4dnZyamFXSjgwN0FKVGBpcHJtZVtPRDgxPGGDcGVmblpAREA5NjxDREFBQ0NCREVIRUtkg5mgpKynnZWYnI99dnRqhY+RhmUzcGplXFJDMi4sLCoqKissLzAvO1ZcV1NQUE9OTUxNS01LSklIRUA1LjEuKSQpOlpeYWJjYV1eaGhhSDpCVVpXW2BhWVJMSURHTlhNRkxRT09SVVthX1ZMQDkzMDdKX2tvdHZzbm1sZ2VpamdnX1xaR1pOSUhSXV5cWlZVUkpGQ0A1KiQkJCQnJyYnJiYmJSMjJjA4Ozs8P0A/QEFBQUFAQD86LyMjJSEhIiIiIiMjJScoKioqKysqKisrKysrKy4vMzhAVGJobW9pZGVVTVdpamVeXFhVT05NTk5OTEpGREE+PT0+QUJHSk1OUFBSUlBQT09OU1pgaHB1e36ChYiJiYmIh4WEhIKBgoKBgYKFh4qKi4uLi4qJhYF9dXFvb29vbmxoZGFgYGJmbHJ4foKGi4yKioiHhYSGio6SkpOSkI2Njo2Ojo1+eXt5eXh4eHh3d3d3d3d3d3d3eXyCh42QkJGRjo6QlZCNjIuKiouQlZeVkpCOjIyKiigoKCgpKSgoKSkpKSkqKioqKikpKyorKyoqKysrKywsLCwrKywsLCwsLC4uLS0vLy4uLi4uLi4uLi4tLS4uLi4sLC4uLS0tLS0tLCwsLCwsLCwsLCwsLCwsLCsrKiorKygoKCgoKCgoKSkpKSkpKSkqKisrKiorKysrKysrKyssLCwsLCwsLCsqKikpKSkoKCcmJSUlJSUlJCQkJCQkJiYpKCUjIiIhISIiISEhISEhICAhIiQpLUBhdXNra3J2eHh0b2VcTT4wMTpEUFpianFyaWNYTEM3MUV1gmxnanFWQUY+OTk/Q0RDQkJDQUNFRElhgZejpqiqrKqhnJmWh3Z5epKOjY58RWRsZmBXT0dHRkVFRkVGSkxXWlRITFJTUk9OTUxLS0tLS0hHREREPjczLionIyU+WVlXW1xdXV5dYlVJUllSVFdWVVNNSkdANDtFQURJTUxMUVRXXFxWSTw3MDE9UGBscHR2dG5raGdmaWlnZV9bTlVSR0hNWmFhXltVU01HREA9MSgkIyMlJSUmJiYmJiQiIis1OTo8Pj4/P0BCQkFBQEA/Oi8jIyQjIiIhIyMjIiIlKCgqKisrKysqKiorLC4xNDg9QkRHVGZnZ21pTkxeampkYFpUTExOTU5OTk1LR0NAPj0+P0FERklNTVBQUFBQUE5PT1VaYmlxeH1/g4WIiIqIh4WDg4KBgIGBgYGDhoiKioqKiYiIiIR/enRwb29vb21rZ2VjYmJjaG51en6CiIyMioiHh4aGipCSkpGQjo+Pj4+Rjo6BeXl4eXd4eHh4d3h4d3d3d3d3eHp9hImQkpKQjo6Ok5ONjIyLiYiLkZaXlZGPjYuLi4ooKCgoKSkoKCkpKSkqKyoqKioqKisqKysrKisrLCwsLCwsKyssLC0tLS0uLi0uLy8uLi4uLi4uLi4uLS0uLi4uLC0sLCwsLS0tLSwsLCwtLS4tLCwsLCwsLCwrKysqKysqKCgoKCgoKCkpKSkpKSoqKiorKyoqKysrKysrKysrLCwsLCwsLCwrKiopKSkpKCgmJiUlJSUlJSUjJCQkJCMjJSQiIyIiISEiIiEhISEiIiEhIyUoMT9bdnNra3F2dnZ2b2ZcUUI0LzU+SFVeZm5xbmdfVUk9NjdWe4JsZmlxVD9FPjk5QkVFRENDQ0JDRUhZcIuXmqSsq6quo6GenJRyhod/gIiShmlRZF9dXVxZWVZUVVRTVFRSV1dZW1NOTU5LTEtMS0pJSUpIRUVCQT46NzMtKCYnJkNXUFBXXFlXWmBiVVVXWVVUUlBLR0JCPzQzPkhDRUlKTE9RVVhXUUY9NzIyPk5daHB4eHFraWlmZmZnaGdYRDhGTUpIUl5gYVxYVVBIREE9OSwlIyIjJCQlJiYmJiUjIyYwODs8PkA/Pz9AQkJBQUBAPTsvIyAgIiIhISMjIyIiJScqKioqKioqKioqKy8wNjk/PD08P0RLUV9xbUlHWFlfZGVbU1ZRTk5OTk5NTEhFPz09Pj9CRkhLTU1QUFBQT09OT1FWXGJpcXp+f4OFiImJiIeFg4OCgYB/gYGBg4aJi4uLiomIiISAfHVxbm9vb29samdlYmNlZmpxd3uAhIqNjIqJiIWFiZKTlJGRj4+Ojo6Pjo+Gd3l8eXl6eHh3d3h4eHd3dnZ3d3h6foWLkpOSkY+PkpWRjYyLioeKjJKVlZWRj42MjIuKJycoKCgoKCgpKSkpKSkrKysrLCwrKysrKyorKywsLCwsLCwsLS0tLS4uLS0vLy8vLy8uLi4uLi4uLi4uLi4uLi4uLi4tLS0tLi4tLS0tLCwtLS0tLS0rKywsKysqKiwsKyoqKikpKSkqKikpKSkqKioqKioqKioqKysrKysrKyssLCwsKyoqKikpKCgnJycnJiUlJSUlJCQkJCQkJCQkJCYkIyMjIyIhIiIhISEhIiIjIiUpMT1Yc3FqbHBycnNybWRZTkM1LzA3Qk1WYmlvcGtlW09DNzVCZX5/bGhmbE9AQ0A4N0JHRUNDRUZDQEBOa4GQlpaep6qqrKKjo6SijH2DiYuUmop6UllYV1VUT09QUE9PT09QUFJWW1tVUElJRkVFRkVFRkhISEhFQT8+Ojg1MywnJiguUFpVU1VUU1VZXWJXUlJOUE5LRkE9P0E3LjM9QUFERktNTlJXWVFGOjgzND5LV2VscnNsaGhnZmZmZ2hpY042QEZFSVheXlxYVVNLRUI/OzUpIyMjIyMjJCUlJCQjIyMpMjk9Pj9AQD8/QEFAQEA/Pz46LiMhISIiISEiIiIiIiQmKysrKSoqKioqKiwwNDY2NjY4OTxDRkVIVVRGR1xSXWVmW1dcU01OTU5OTUtHRD89PT9AREdIS01NTk5OT1BPT1BRVl9ja3J3fX+DhYiKiIiFhIKCgICAfoGAgYSHioyNi4qJiIeEgHl0cG9wcG5ua2lnZWVjZ2hsc3h9g4eLjY2MioWGh46Sk5KQj42Njo6Pjo6MenN6enh5eXl5eHh3d3d3d3h6eXd3e4GHjpOTkpCQkJWVkI2Mi4mIipCTl5WUkI+NjY2MiScnKCgoKCgoKSkpKSkpKysrKywsLCwsLCwsLS0tLS0tLCwtLS0tLS0uLi4uLy8vLy4uLi4uLi4uLi4uLi4uLi4uLi4uLS0tLS4uLS0tLS4uLS0tLS0tLCwsLCwsKyssLCsqKiopKSkpKiopKSkpKioqKioqKioqKisrKysrKysrLCwrKyoqKiopKSgoJycnJyUlJSUlJSQkJCQkJCQkJCQlJCMjIyMiISIiISEhISEhIiMnLTdQb3Zqa25wcnJxZ2BWTD8yLC4yPEdSW2Ztb29pYFhLPzIxSXF9f2xnamxMQENDOjhAREVERUdHQz9DXn2MlZiSlZqjrrCusK6pq5J0do6joaOWg2BRVVNSUVFRUVFSUlFRUFBRU1RTVlFNS0dFQ0JAQUA/Q0NCQkA+Pjo5NjMwKiUnKjJSX1hQUlVSUFRhW0RJQ0VGRUI+PD4+NS8sLTpAQUVKTE1OTlBPQzk3NDM6SFVeZ2xtbGloZmZmZV9YVkxPVUxDRk9aXlxaVlNPSEM+PDkzJyQjIyMjIyQlJSQkIyMjKTM6PT4/QEBAP0BAQEBAPz8+Oi4jISEiIiEhIiIiIiEiJCgqKikqKioqKiosLzM0NDQ1NjlAR0lJSU1DQEFVaG9uZmJjZ1NMTU1OTUxKRkNAPz9AQURHSEtNTU5OT1BSVFRUV1lfZmt0en1/g4eJioiIhYSCgoCAgH6BgIGFiI2PjYyKiYiGg395dHBvb29ubmxqZ2VkZWhpb3Z7f4OHi42LiYmHhouUkZKRkY6OjY6OjY6PgXN4e3t5eXl4eHh4d3d3d3d3d3h4eXyCiI6Sk5KRjpCUkY2MioqIiYySlZeVlJCPjYyNi4onJygoKCgoKSkpKiorKysrKyssLCwsLCwrLS0tLS0tLS0tLS0uLi4uLi4vLy8vMDAvLy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi0tLS0tLSwsLCwsLCwsLCwrKioqKSkqKioqKioqKisrKioqKisrKiorKysrKysrKywrKioqKioqKSknJyYmJiYmJiQkJCQkJCQlJCQkIyQkJCUjIiIiIyIiIiIhISEjIyUoKjdLanlwaWxtcHBtZVxRRDkxKysuOEBLVmFqcHBsZVxRRzszNVl7eX9sZ2tuUUBFQzw3P0RFRUZIR0I/Tm+Fj5WYkImPoa+5uru4qqeSfJCTmKKen41zTVVYWFZXVlNSU1NSUFJSVVVVVVdQTkpIRkZFRUNCQkFBQUFAPj48Ozo2My4pKCsqNVRdW1hTUU9SW2FKOz8/Q0I/Ozg4NzMvLS05RElLTE5QT09RTz82NTIuNURRV1ldZGloa2tmZ2lcT1c4TFlLR05ZXVxaVlNRS0RAPDo5MSYjIyMjJCIjJCQjIyMjIik0PT8/Pz9AQUBBQUBAQEBAPzwtIyEgIiIiIiIiIiIhIiMnJykqKyorKSkrKy0xMDI0Nzk2Njk9QEVEP0NGQUtmZ2BfXFpVTk1OTk1MSkZDQT8/QUJFSElKTExOTlBSVldaWl1hYWVtdHt+gISHiYqJhoSDg4KBgH9+gYGCh4uOj4+LiomIhoF8d3Jvbm1tbm1qaGdkZWZqbHB3fYCDiIuOjIqHh4qQk5GQkI6Njo2NjY2LiHp1eHx9enl4eHh4d3d3d3d2dXV4eHl+g4qQlJORj46Tlo+Mi4uIiIqOkpWWlJOOjY2NjYuKJycoKCgoKCkpKSoqKysrKysrLCwsLCwsLC4uLi0tLS0tLS0tLi4uLi4vLy8vLy8vLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4tLS4uLi0sLCwsLCwsLCwsKyoqKioqKioqKioqKiorKyoqKioqKioqKysrKysrKyssKyoqKioqKikoJycmJiYmJiYlJSQkJCQkJSQkJCMkJCQkIyIiIiMiISEiISIiIyMnLjdFZnlya2tubWxrY1hLPzQsKSktMzpHUFtmbXFwa2JYTUE1MTZee3l+bWVpbmA/Q0M+OD5FRUVGSUhESGF3iYyQlJKDi6Sxubu8urKvqaqsrp2goKWXf1xYWFhWVFRUUFFRUVBQUVNVWFlZVFBNRkZFRURERURDQ0BAQUA+Pj07Ozk1MC0rLC43VVVXV1JRUFRaVUI7Oz4+PTs4NzUxLy8yPkhMTU1OUFBPUVVHKC8wLjI8RU9TVl5iYmVnaWhraWRfUVFUT09XWltYV1RPSkRAPzs5NS0lIiIkIyIjIyQkIyMjIyIpNj5BQEFBQUFBQkFAQEBAQEA+LyMhICIiIiIiIiIiISIjIyQkKCkoKSoqKyssLzEzNTY1MzY2OD0/PkNDQz1JX2ZmXFpUVU9MTk5NTEpGQ0E/QEJDRUhKTExMT09SVVlaX2FlZ2dscHd7foCEh4mHh4aEg4OCgYB/foGBhIiNj4+OjIqJhoN/eXRwbm5tbW5tamhmZWZnam10eX6ChomOjoyKh4iOk5GRj46NjI2Ni4uLioB1dHp8e3t6eHh4eHd3d3d3dnZ2eHh5foWMkpSTkY+Qk5GNi4yKiIiLkJSVlpSSj42NjY2LiigoKSkqKikpKSoqKioqKisrKystLS0tLS0tLS0uLi4uLi4tLS8uLi4uLi4wLy8vLy4uLi8uLi4uLi4uLi4uLi4vLy8vLy8vLi8vLy8vLy8vLS4vLi4uLi4tLCwsLCwrKywsLCwrKysrKysrKyoqKioqKioqKissLCwsKysqKiorKysrKyoqKSkoJycnJiYlJSQkJSUlJSUlJSUkJCQkJCQkJCMjIyMjIyMjIiIiIyQnKzE9WnhyampxcHBoXVRIOC0oJSYpLTU/SVReZm5vbWVdUkY7MjA+Z3d2f2tiZWx2Sz9EQDo6RURERkdGTGB0f42Iho6RhJGjsbW2uru2ubu6u7qupp2inopqWlZSUlFTU1RQUE5NTVJUUlRVVVNRTktIRkVEQ0RDQ0NCQkJBQEA+PT09OTg0MS4uLkFXVlFQUVBPTVVWOzU7PD06ODQzMjAxOUdNTk1OTk5OTlFTU0c9KSgvNTtDSk1WW19iZGZnZmNhYlVWVEtQWVtbWVVRTUVBPDs6NjAnJCQkJCQkIyMiIyIiIiIjJzI+QUNDQkA/P0BCQUFBQUA/PTMlISAgIiEhISEhISEhISEiIiImKSkqKisrKisvMTMyNDQ2ODs7Ojk9PUJHTVJbZmJhXFZQVFFOTk1KRkJAQEJCQ0ZJS01MTU1RVVpcYGVrb3BwcHR3fYB/g4eJiYiGhISCgYGAgIGBhIeKjY+PjIyLh4R/e3dyb25tbW1sa2pnZmZnaWxxd3uAgoWKjo6KiYiMkpOTkpCOjo6OjImHi4h5d3h7fX16eXh4d3d3d3d3d3d3d3d4eoCHj5KTkpGPk5ONi4iLioiJjJGTlZaTkI+PjoyLi4koKCkpKiopKSoqKiorKysrLC0tLS0uLS0tLS0tLi4uLi4uLi4vLi4uLy8uLy8vLy8uLi8tLi4uLi4uLi4uLi4uLy8vLy8vLy4uLi4uLi4uLi0uLy4uLi4uLSwsLCwsKyssLCwsKysrKysrKysqKioqKioqKiorLCwsLCsrKiorKysrKysqKikpKCcnJyYmJSUkJCUlJSUlJSUlJCQkJCQkJCQjIyMjIyMjIyIiIiIlKC04TXJ4cG1xdHJpX1NGNSknJSUmKTA5Q05XYmtwbWhgWU9AMi8wQ214eIFtY2NuenI9QT86OEFDQkVBR192g4CQjoeOlJOZoKSvrrC5vLy5s7C1tLWpqaGPd1VUWWVzeXl5eXVtXk5MTE5OT1JSUE5LSEZFREVDQ0NDQkJBQEBAPz49PTo5ODYzLi4sQFNQT05OS0tNUVI6Njk6ODY1MjIwMj1LUE9OTk5OTk5QVVVUVDkyOTo7PUFGUldaW19iYGFfXF9ZU05LT1haWVhTUEo/PDk3NTAqJSQkJCQkJCMjIyMjIyIiIyYvO0BBQ0JAP0BBQUFCQkFAPzw1KSEhISEhISEhISEhISEhIiIiJCYoKiooKCkqLC8wMTI0NTQ3NzU1Njk5O0JKU2JsYlpSUE9TUE1NSkZDQUNDQ0RISkxNTE5PUlVbYWZrcnZ3eHh4eX2AgISHiYmHhoSCgIGBgICBgoSHio2OjYyKh4SBe3lzb21tbW1tbGtpZmdnZ2ltcnh8gYWIi42NioiJkJKSkI+PjY6OjouHh4x/eXl7fHx8enl4eHd3d3d3d3d3d3d3eHuCh4+TlJKRkZORjIuLioiIi4+TlZWVkpCPj46Mi4qIKSkpKSoqKioqKisrKysrLCwtLS0tLi0uLi4uLi4uLi4uLi4uLy4vMC8vMDAvLy8vLy8uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4tLCwsLCwsLCsrKysrKysqKioqKisrKyssLCwsLCwrKyorKysrKysqKioqKiknJiYmJiUlJCQlJSUlJSUlJSQkJCQkJCMjIyMjIyMjIyMjIiMkJys0R2l2bmpxdnZuY1ZGNSckJCQlJikxOkVQWmRscGtmXVJHOi4tNFVzeHh/bGNhaHd+VTpANzY/QUNEQVF1hoyGkpWTlpaTl5qbpaasub68s7Oys7GspKimlIBeYnR+fn18e3h4dXRrYFlYV1VSUk9MSkdERUZGREREQkNBQD8/QD49PDs6OTg3NTQuLS8/T0xNTEpJR0lQTDY2OTY1MzEwLzVDTVJSTk9NTUxMTVBTV1xWRjs5PDs9QElQVldaWlpZW1pZVVBMTFNYWlZSTkxDOTg0MCwoJSQkJCQkJCQkJCQjIyMiIiMkKzhAQUJDQkFBQUBAQUE+Pz88NyohIiIhISEhISIiIiIiIiMjIiIkJisqKSoqKSoqKiovMjI0NDAxMC81NzxARUpbZmphWVRPUFBOTEtHQ0FCQUVGSUtMTU1NTlFVXWFpcHh8fX17enp+f4KGhoiIh4eEg4GAgYCAgYOGiIuNjoyLiYaCfnl0b21tbWxtbWtqaWhnaGhqbnR5foGGio2PjIqJjZKRkI+Oi42NjYuIhomIeXl5fH17e3p5eHh2dnd3d3d3d3Z2dnl9g4eQk5ORkJGTkIyNioqIiI2QlJWTlZGQj42MjYyJiCkpKSkqKioqKysrKyssLCwtLi4uLi4uLi4uLi4uLi4uLi4uLi4vMDAvLzAwLy8vLy8vLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi8vLi4uLi4uLi4uLi4uLi4uLi4uLSwsLCwsLCwrKysrKysrKioqKiorKysrLCwsLCwsKysrKysrKysrKioqKiopJyYmJiYlJSQkJSUlJSUlJSUkJCQkJCQjIyMjIyMjIyMkIyIjJSgwPV55c2ludnZxZ1pMNigkIyQkJSYrMztGUVtlbm5qYVpNQTMtLThceHdzfnBhY2h0gHVAPTo1PEBBQ0xmho+QlJaWmJmShIyRkZqgpLK2t7Sxr6ytn5mWlpSNbnR7enZ3dnd0c3NzdHFvbWpoZGJdWVRSTkxFRERCQUJBQEFBQD89PTw7Ojk4NzU0MzAtLUBNR0dGRkZGS1FGNjg2NTMwLy84SVFTU1FPTU1LS0xMUFJZV1hMOzY5PD1DSk1SVFZUVFRVVlFNTVNYWVZTT0xJQjgxLyslIyQkJCQkJCUlJCQlIyIkIiIjIyYyPT9AQUFDQ0E/PUBCQkA/PjgsIiIiIiEhISEiIiIiIiIjIyIiJCQrKSorLCooKCgrMC8vMC0qKjE0MDM4Nzk+T1dhV1FaWVFQTUtJRkNAQENFRUhMTUtNTUxPVFtjanN6f4GCgH5+fn+BhIaIiYaGg4OBgIGAgIOGh4mKjY6Li4iFgnt3cm5tbW1sbGxramhoZ2hoam91en2BhoqNjIuJio+SkY+OjY2OjYuIhoaMhnp4ent9e3p6eHd3dnZ2dnd3d3d2dnZ5fYOIj5ORkJCTk5CMjI2Jh4eMkpSUlZORkI+PjoyLiYgpKSkpKioqKysrKywsLCwsLS4uLi4uLi4vLy8vLi4uLi0tLy8wMDAwMDAvLy8vLy8uLi4uLi4uLi4uLi4uLi4uLy8tLTAwLy8vLy8vLy8uLi4uLy8vLi4uLi4uLi0sLS0tLSwsKysqLCsrKyssLCwsLCwsLCwsLCwsLCssLCwsLCsrKysqKiopKikmJiYmJSUkJCQkJCQlJSQkJCQkJCMjIyMjIyMjIyMkJCMjJSksNk5zd2xqcnVxa19POiokISIiIyQnKzM9SFJeZGtqZV1SSD0xLDVIa31/fYBzYmNodIB/ZTU5Njg/Q0JbfJCTkZmemJSclIeKj5GYpKOpq6+ztKmjnY+RkIyGj3RndHV1dHJxcm9vbm5ubGxpZmJgX19eXFxcWFVUUU1KSEVBPT0+PT09PDo5ODc2NTIxMC4uPEtIRUZDQkJHUkE2ODcyMTExPUxUV1dTUVBPS0tLS01RUlNOVFNFPD0/QENIT1JVVE9OTkxQUFBQUlJQTktJRD42Ly4rJiUkJCQkJCQkJCQkJCQkJCMjIyMkKzg+QEBAQEJBPj4/Pj89PDs1KyIhISIiISIiIiIiIiEhIyMjIyQkJygoKikpKCsuLywrKSopKSotMTc8PUNHTldbYW90YlVPTk1LR0RCQEFFSEhJS01NTU1MT1JaYmt2fICBg4KAfnx/gYWHiIaGhIODgYCAgICEh4iKjI2Mi4iGg395c29ta2trbGtra2lnZmdoaW1xdnt/gYaKjY2LiI2Qko6NjYuNjYyJhYSKjYB8eXl7fHt7eXh4d3Z2dXV2dnZ2d3d4en6Eio6SkY+Qk5KOjo6OiYmKjpOVk5SSkY+PjYyLioiHKSkpKSoqKyosLCwsLCwtLS0uLi4uLi8wLy8vLy8vLy8uLi8vMDAwMDAwLy8vLy8vLi4uLi8vLy8uLi4uLi4uLi8vLS0vLy8vLy8vLy8vLi4uLi8vLy4uLi4uLi4tLC0tLCwsLCwsLCwrKysrLCwsLCwsLCwsLCwsLCwsLCwsLCwrKysrKioqKSgnJiYmJiUlJCQkJCQkJSUkJCQkJCQjIyQkJCQkJCQkJCQjJCgrMkVrfG9rcHR0bmNVQi0jIiIiIiMkJy01PUhSXWZqamJYTUI3MDVHaXx+fXZ9d2JkZnCAgn5INzc2PUFIaoqXmpaYo6SbnpuQi4yOmKKmrayusa2mnJOLiIuLhIiAa29vcXFwbW1ramtqaWloZGJlYF9fWllYWFhXVFFTUlNSUlBHPz09Ozo6OTg3NzY0MjIuLi49REJBQ0JCRElUPjY2NDAyNEJPU1ZXU1NQT0xKSkxMTVFTTU5UU0xCP0BCRElNTk1NSkRERUdIRkREQ0VGQ0A5MSwrKScmJSUkJCUlJCQkJCUlJSUlJSUlIyUsNjw/Pz9APz8/QD48OjgzKiMiIiEhIiEiIiIiIiIiIiMjIyMkJCYnJycmKiwwOTwzKCgnJicpMT1DRU1QUVVWWV9wgHleWE5LTElBQEJCQ0ZHSUtNTk5OTU5PVV5ncnuAgYOCgH5/f4GFh4eGhYKCg4GAgIKChomKi42Mi4iHg4B7d3JubGtra2xra2tpZ2ZnaGltcXZ7f4GGjIuLioqRkZCNjYyMjY2Lh4OGjIZ8enl6fHx8e3l4d3Z2dnV1dnZ2dnd3eHp+hIqOkI+OkZWQjY6NjIiJjJGTlZOUkpGQjYyLiomHhikpKSkrKywsLCwsLS0tLS0uLi4uLi4vMC8vLy8vLy8vMDAwMDAwMDAwMC8vMDAvLy4uLy8vLy4uLi4uLi4uLi4wMC8vLy8vLy8vLi4uLi8vLi4uLi4uLy8vLy4uLi0tLSwsLCwsLC0rKysrKywsLCwsLCwsLS0sLCwtLCwsLCwsKysrKyoqKSkoJycnJiYlJSUlJSUkJCQkJCQkJCQkISMkJCQkJCQkJCMkJCQoLjxgf3RscXZ5cWhaTjUkISEjIyEjJScuNTxHUVtkaWVhVkpBOTY/XYKIfnp2e3toYmJsfoSDdDE5NTxAT3aRm56foqGkoJydmY2MjZOepKWkoaCfnpiRint0eHV7imlra2xtamtpZ2doZmZkYVtWW1xaWFpYVFFQUE9NTU1NTlFTUkdBPDs5Ojg5ODg2NTUxLzAvMkZHRUVCREVJUlA2MzMyMTZHUVRUVVVSUk9NS0tLS0tNTVBPTk9MRDYyOj9BRUZHSEZCQ0NDQj9DRklKSEZBPDArKCcpJycnJiYlJSQlJCUnJyYmJiQkJSUlJiowNzs+Pz0/QD88ODQtJiMhIiMhIiIgIiIiIiIiIiIiIiIjJiYlJicnJygnKTQ6LygmJScnKzE7QkVKTlFTU1dYWWp+XV5vUEhHQ0BAQEJFRklLTExOTk1OTVFXY212fYCBgX59fX6Ch4mJh4WEgoKBgYGDhIiKi42Mi4iHhoJ9d3RxbGtra2tra2tqaGZmZmdpbXF2e3+Ch4uLi4uOkZCOjo2NjoyMiYSCioyBfHl5fHx9e3p4d3d1dXV1dXV2dXZ1dXh6f4WJjY+Pj5KUkI6OjoyJio6RlJSUlZKPjo2NjIqJiIcpKSkpKSosLCwtLS0tLS4uLi4uLi4uLzEvLy8vLy8vLzAwMDAwMDAwMDAwLzAwMC8uLi8vLy8uLi4uLi4uLi4uLy8vLy8vLy8vLy4uLS8vLy4uLi4uLi8vLy8uLi4tLS0sLCwsLCwtKysrKyssLCwsLCwsLC0tLCwtLSwsLCwsLCsrKysqKikpKCcnJyYmJSUlJSUlJCQkJCQkJCQkJCQkJCQkJCQkJCQlJSQmKTNPeX9xcHd9enBkVEMtIyEiIiMjJCYoKzM8R1JcYmZkYFVLRENMYHuMhnp3dnp8aWFganyEg4haKzI2PlV6kJudpaalp6KZoJ+UjY6Ol52fop+dnJSKf3VpYmFcbod2X2dnaGhmZWNiZGViX19fXVpYWlhWUU9NSUlJS0tLTEtLTU5NR0M/PDo5OTg3NTU1NDExMC45SEVCRURGRkpPRjIyNDM3SFJVVFRTU1NRT01LSktMS0tNTUtLSj8wJScsMjk7Q0dGREBAQUBCRkpJSEZDQDYvKicnJyYnJycnJiYmJSQlJygnJycmJCUlJSUlJiotMzg6PT47NjEqJCIiJSQiIyQlISIiIiIiIiIiIyMiIyQkJSUmJicoJicoJicoJyYmJScqMjY+REdNTlBTWmNugWFOXlxJQ0E/P0BCRkhJS0xMTk5NTkpPU11pcXl/gYF+fXx9hIaHiIaFhIKCgYGBgoWJioyMi4mKh4SAfHdzbm1sa2tra2tramhmZmZmaGxxdnt/goeLi4yMkJKRjY2NjY6MioeDhIyIf3t2eHl6ent5d3Z3dXV1dXV1dXV2dXV5e4GGjI6Ojo6UlI6Njo2LiYuOkZSUlZSSj46NjYuJiIeGKioqKiwtLCwsLS4uLi4uLi4vLy8vLzAwLy8xMS8vLy8wMDAwMDAwMDAwMDAwMDExLy8vLy8vLjAvLy8vLi4vLy4uLy8vLy8vLi4uLi4uLi4vLy8vLy8vLy4uLi4uLS4uLi4uLiwsLCwsLCwsLCwsLC0tLS0sLC0sLS0uLi0tLCwsLCsrKiopKSgoJiYmJiUlJSUlJSUlJCQlJCQkJCQlJCQkJCQkJCUlJSUlJys7ZoF3cXJ7gXlrXk06KCMiISIjIiMmKCoxOkVPWmBjY2BWT1FcbX2IjId4eHZ8fWtgXmR6hIiQjkMrMjxUeo2Xn6epqqmlnp+hmo6LiYmPkpiam4uFfndsZ2hpYXF9hF1iZmhmZGJfZGJiYF5dW1lWVlZUUU9LSUdHRUZISElKSkpLTU9PSEM8OTc3NjU2NjUzMzMvMENLR0ZHR0NGSU0/MTEyOkdSVFVTU1JTUVBOTUxMTEtLSklHRkQ6LCMkJCUpLTY8PT48PkFBQkZJRUNBOjQsKCgnKisrKigpKCcnJiYmJiYmJyYnJyYkJiUkIyMjIiUrLjIzMS0nIiIiIyQlIiIjIyMiIiIiIiMiJCUlJiYpKycmJiQmJiUlJycmJicnKCgpKSwuMTg9RUpQV2BqdnVcWVxqXkdAQUE/QUZISUtLS0xOTUtKTFBXZW12fH5+fn16foWIiIeGhIOBgYGBgIOIiouPj4uKi4aFgXt3c25ra2trampramhnZ2dnZ2hscXZ8f4SJioqNkJGRkI6Pjo6OjImFhIeMhH56eXh5e3t6eHZ2dXR1c3V1dnZ2dXd2eH2AhYuOjoyQlJKPjo6NiomNkZOUlZSTko+Mi4uLioiHhioqKiosLSwsLCwuLi4uLy8vLy8vLy8wMC8vLy8vLy8vMDAwMDAwMDAwMDAxMDAxMTAwLy8vLy8vLy8vLy4uLy8uLi8vLy8vLy4uLi4uLi4uLy8vLy8vLy8uLi4uLi0uLi4uLi4sLCwsLCwsLCwsLCwtLS0tLCwsLS4uLi4tLSwsLCwrKyoqKSgnJyYmJiYlJSUlJSUlJSQkJCQkJCQkISQkJCQkJCQlJSUlJiksP3GEdHJ5gIJ1ZllGMSQjIiIiIyIjJScqMTlET1pgY2RhWl1ncX6GiYqEeX5/gH9qYFxedoePjIx6Ni81T3eLl6Cnqamop6KcnJeLh398goySkYp5dXZzZmFna3J9dX5sVl9jYmBcXF9dXFtcWFZTU1NRUE1LSEZEQUFCQUFDRERERUdJSUpHQjw4NjY1NjY2NTMzMjI3S09HR0dHSkdITD0wMjhGUFRUVVNSUE9QTk1MS0tLS0pJRkVCOCojIyMlJicmKSsvOjw8QERERUZCNS0qKy0tLSorKyopKikoKCcnJiYmJiYmJiUlJiYlJCQkIyIjIyIkJCIiISIiISMjIiIiIyMjIiIiIiIjJCQpLDE1OTc1LiknKCglJScnJiYnJygoKCorKiwvN0RNVFhbXFteaGlXUEpDPz4/QUNGSElLS0tLTE1LSkpPVmJpdHp+fn59en+Dh4eHhYSDgYGBgYKHiIuMj46LiomEhH96dnBsaWtsbGpqamlnZmZmZ2lqbnJ3e3+GioqKi5CPjo6OjI2OjYuHhIWLiIF9eXh4eXt7e3l2dnV0c3R1dXZ2dnV1d3l+g4iLjY2OkpSQjo6OjImJjZGTlJWUkpCOjIuLi4qIh4YqKisrKywtLSssLi4vLzAwMDAwMDExMTExMTExMDAxMTAwMTEwMDExMTExMTExMTExMTExMDAvLy8vLy8uLi4vLi4vLy8vLy8vLy4uLi4vLy4uMDAvLy8vLi4uLi4tLS0tLi4tLCwsLCwsLCwtLS0tLS0uLiwsLC4uLi4uLS0tLSwsKyoqKikoKCgmJiYmJiYlJSUlJSUkJCUkJCQjIyMjJCQkJCQkJCQlJSUrLkBvgXV0eYCAcF9RPSskIyMjIiMiIyUoLDA4Q05YXmFjX19rdX2FiYuLg3yDhYF8bV9bXHSFe252fmIyMURwhZSdpaioqKijnJmThH9/d3V/hIF1Z2VscWpgZVpwcF1xeVVTV1lZWVpaVldWVFNTTk9QTExLSUZEQT89PDs8P0BBQENFRkZFQ0NBPDc1NjQ0NjU1NTY2MjtLSUNEQ0hISElOPTE2RlBUVVRUVVNQT05OTU1MS0tJSUdFPzUlIyMkJCUmJycoKi0yO0JGREE7Mi0tLC0tLSwtLCorKigoKCgoKCYmJSclJSUlJSUlJCMjIyMiIiIiIiIiIiMjIiIjIiMiIiMjIyIiIyMjIyUqMThBR0lIRDwzKiQjJSUmJiYmJycpKisrKSssMDtFTEpPUFZdY15VTkpFQkA/QEFDRkhISktLTU1LSklKT1RdaHJ5fn+Af32Cg4aHhoWFg4CAgYCDh4mMjo+Oi4qKhYJ9d3NuamlqampqampoZ2ZmZ2dpbHB0eHx/hYmKio6Pj46OjY2OjY6KhYOIjIR/e3h3eXp7enl4dnZ1dHRzdHV2dnV1dnd6foSJjI6Nj5SSkI+OjYqKi42Sk5OUlJOPjoyLi4qJiIiHKiorKyssLS0uLy4uLy8wMDAwMDAxMTExMTExMTAwMTEwMDExMDAxMTExMTExMTAwMTExMTAwLy8vLy8vLi4uLy4uLy8vLy8vLy8uLi4uMDAwMC8vLi4vLy4uLi4uLS0tLS4uLSwsLCwsLCwsLS0tLS0tLi4uLi4uLi4uLi0tLS0sLCsqKiopKCgoJycnJiYmJSUlJSUlJCQlJCQkIyMjIyQkJCQkJCQkJSUnLC8+aoF1c3qAemVXSTMnJCMjIyMjIiMkJyotNkFMVl1gYmFfbnyFiIiMjYN4eHt9fW9dWltnZl9pe4N8SCk+ZH2Olp+kpqimop2Xk4B1fHZwcnBvbGVhaGhkZ3BlTl5JY4VZTVFTVFVTVVVTUlJQTkhJS0pKR0VCQD07OTg5OTk7PTw/QkNDRUVCQkA8NzY0NDU2NjY2NjQzPklFRENERURGSFRDNkJPVFVUU1FRT09OTk1MS0tLSUlHRT8yJCUjJCQlJicnKCopNEBCQj83ListLi8sLi4tLSwsKysoJycnJycnJiYoKCgnJSUlJSQjIyMjIiIiIiIiIiIjIyIiIiMhIyIiIyMkJCMjIiUqND9KU1dXVlJMQTMnJCMlJiYmJikpLC8tLC4zNjs8P0hLUF1sbGdfWVFOR0M/P0BBQ0ZISEpLS0tLSklISUxSXWdweH5/gH9/goWGh4aFhYKCgYCChYmLjo6OjouKiISAenZwa2pqaGpqampqaGdmZmdoamxwdHh8gIWIjZCRj42NjYyMjI+Oh4SEiImBfXp3d3l6e3p5eHZ2dXR0c3R1dnZ0dnd4fYGFi4yMjpCWkY6Ojo2Ki46QkpOUlZKPjo2Mi4qJiIeGhioqKysrLC4uLi4tLi8vMTEwMDAwMDAwMDExMTEwMDExMDAxMTExMTExMTEwMDAvLzAwMDAwMDAwLy8vLy8vLy8uLi4uLy8vLy8vLi4uLi4uLi4uLi4uLy8uLi0tLi4uLiwtLS0sLCwsLCwsLC0tLS0tLS4uLS0uLi4uLi4tLS0tLCwrKyoqKSgoKCgoKCcmJiYmJiYlJCUlJCQlJCMjIyMjIyQkJSUkJCUlJy0zPmV/dXN2fHBhUD0rJCMlJCMjIyMjIyYpLTZAS1ZcYWRlYm6AhYmKjIeBdXd4e35vXFlaZmNncHp/eHw9LVZzh5OaoKWnpaOfmpaGent3cWppaGplZ2pocXd7clRIUVd+YklPT05LUE1TUk5MSkhERUhFRERDQT88NjU0NDM2Njc3OT5CQkJBQUFAQDw5NjM0NjU2NTQ0Njg9RkVEREVFQ0VMV0dATVNVU1NRUE9PT01NTUxLS0pKSEY+MSQkIyQlJSgoJycoKis0OTYwKy0uLi0tLi4tLi0uLSoqKCQjJicqJyYnKCkpKicmJiQkJCMjIiIhIyMjIyMjIiIiIyMlJCIhIiEhIiIiIiMoMkBMVmFpaGdhWlBCMyokJCUlJiYoKjA1Oj1BPThMXGx2dXZ2c25nYVpRTUhEQD9BQkRHSUlKSkpLS0lJSUlKUFtncnp/g4KAgYSGh4eFhISDgIKBhYiKi4yNjYyLi4eDfnhybmpqaWlqampqaWhoZ2ZoamptcnZ6foOHio+Tk4+OjY2MjY+OioSDhYqFf315dnZ5ent6eHd1dXRzcnJ0dXZ2dnZ2d36BiIuMjY2SmJGNjY6MioyPkZKUlJSSkI6NjIqIh4aEhIIqKisrKywuLi4uLS4wMDExMjIyMjIyMDAxMTExMDAxMTExMTExMTExMTExMDAwMDAwMDAwMDAwMC8vLy8vLy8vLi4uLi8vLy8vLy4uLi4uLi4uLi4uLi0tLi4tLS4uLS0sLS0tLCwsLCwsLCwtLS0tLS0uLi0tLi4uLi4uLS0tLSwsKysqKikoKCgoJyUlJiYmJiYmJSQlJSQkJSQjIyMjIyMkJCUlJCQlJikvNkFhfnVzdXhrWko1JiIkJSQkJCMjIyMmKS01P0lTXGFkZ256gYSGiIZ9a3B3dnh6cmBdXmRndXp7eX2OeC8+aHqKk5meo6KhoJuQh4B6dnBnZ2ZoZ2Vnb3h8eHdvYlxXZ11DS0pGRklKVFVNR0ZEQD9CQT9AP0A+OjYzMzEwMDM0NDU5PkBAPz8/Pj4+Pjg0MzU1NjY2NTQ2N0BIRkRERkVFSE9YS0hQVVVSUVBPT09NTUxMTExLS0lHPzMkJCMkJSUnJyYnKCooJyonKCwvLi8vLy4wLi0vLi8tJyUjIyYnKignJygoKCYnJyYlJCUkIyIiIiMjIyMjIyIiIyMpNTIlISEhISIiIiIkLDhEU19rdHh0b2hcTj8wKiUlJScpLjAvNDxIWVtQdYB3c3Z2dXRxbWZdVExGQj9BQUNFR0lJSkpKS0tJSUhISlBbZ3J6gISEgoODhoiHhYSDgoGCg4aJioyMjYyKiYmEgHt2cGtpaWlpaWlqaWloaGdnamtrb3N4eoCFiI2SlJGPjo2Njo6OjIaDhIeJg4B9eXZ2eHp6eXh3dXRzc3JydHV2dnZ2d3p+hIqMjY2OlZSQjo6OjIqMj5GRk5STkY+MjIqJh4aEhISCLCorLS0sLS0uLi0uMTEwMDIyMzMyMjIyMjIyMjExMTEwMDExMTExMTIyMDAxMjIyMTExMTAvMDAvLy8vLy8vLy8vLy8vLy8vLy8vLy4uLi4uLi4uLi0tLS4uLSwtLSwsLi4uLiwsLCwtLS0tLS0tLS0tLS0tLS4uLi4uLi0tLS0tLSoqKSkpKCgoJycoKCcnJiYmJiUlJSUlJSUkJCQkJCMjJCQkJCQlJicrMTpCXHx1cXFxbFY/LSYkIyUkJSQjIyMkJikuMjtFUVpiaG12gIKEg4R6X09tamlwcHNkYWBmc354dnmFiYhhM1tygoqPmJ6fnZyYi4aGgnBnYWFlaGdiXmZvd3Bvdnh4b3ZvOERHQkFBP0FFRURBQz47PTw7PD06ODUzMjExLy4vMTExNTk8PT4+Pj49PT07ODU1Njc3Njg4ODo8REhGR0VGRkZITVROSFFVU1FQT09OTU1NTUxLS0pLRkE1JiUkJSUlJicmJykpKCYlJCgrLS8vLi4uMDAvLzAxLyciIiMlJywqKCgoJycnJycnJSUlJSQkIyMiIiIiIiIiIyMjJi0qJCIhISEhISIiJS89S1ppdn6Ef3pyZ1xNPjEpJyksMDQ8SlRNRE9PX36BfHZ2dXV0cW1mXlZNRkI/REFCREdJSUlKS0lJSEhHR0hPWWdyfIOGhoWGhoeHh4WDgoGBhISIiYqNjIyKiIaFhH54dG5qaGhpaWhoamppaGdnZmlrbXB0eXyBh4yRlJSRj4+OjY6Pj4qDgYWJh4J+e3h3dnh6eXh3dnRzc3Nzc3R1dXV1dnl8goaJjIyNkJWSkJCQjYqJjJGQk5OSkY+MjIuJh4aHhYODgSwqKy0uLi0tLi4vMDExMTEyMjMzMjIyMjIyMjIxMTExMDAxMTExMTEyMjExMzMzMzExMTEwLzAwLy8vLy8vLy8vLy8vLy8vLy8vLy8uLi4uLi4uLi4tLS0uLi0sLS0sLC0tLS0sLCwsLS0tLS0tLS0tLS0tLS0uLi4uLi4tLS0tLCwqKikpKSgoKCcnJycnJyYmJiYlJSUlJSUlJCQkJCQjIyQkJCQkJSUoLjQ7Rld3dXFxb25TNyclJSMlJSUkIyMjJCYpLTM5Q1BaY210e3+AgXx1YjxHa3Bwc3F3aGRjZnN8d3aEiYGCf1BDZXR/ho6WmZqYlYaEiIZwXGBhZ2hjYF1jbHl9dWtse3x8gUw5QkM8Ozs8QD48PD07OTk4Nzc4NjQxLy8uLy0sLS8vLzI2OTo7Pj4+PT09PTs4Nzc3Nzc5OTc6PD1ER0ZEREZFRUhMUE5ITlBQT05NTE1NTU1MSktKSUdDOSYkJCUlJSYnJygpKSgmJSQlKy4uLy4uMjIvMDM1NS8nICAhIycsKigoKCgoJycnJyYmJiYlJSQkIiIiIiIiIyQjIyEiIiMiIyEhISEiIiYwP0xZanuHioiBenFmXE1BODQzNkFTYWxrW11iZ3l9goB3dHR1dXNuaWJXTkVCQkFCREZHSUlJSktJSUhIR0dLUl1pc36Fh4eHh4eHh4eFg4KBgIWHiYmMjYyKiYiGg4F8dnFsamhoaWloaGpqaWhnZ2dpa25xdXp9hIiOlJWRkI6NjI2PkI6GgoKGioWAfXl4dnd5enl4d3Zzc3Nzc3N0dXV1dnd5fIKGio2NjpKVko+Pj46Lio6Qj5KRk5COjIyKiIeGhIOEgoEtLS0uLi4uLi8vMDExMTIyMjIyMjIyMjExMjExMjIxMTEyMTEyMjIyMzMzMzMzMzMzMzAwMDAvLy8vLy8vLy8vLi4uLi4uLi4uLi4uLi4uLi8vLS0uLSwsLCwsLCwsLCwtLS0tLS0tLS0tLS0tLS0tLS0uLi4uLS0uLy4uLi4tLSwsKykpKSkpKSgnJyYmJycnJyYmJSUlJSUlJSUlJSUlIiQkJCUlJSUnKzA1PElYbXhraGttWTIkJSUkJSUlJSUlJSYmKCsyOEFNXGh1fH58e3dwXDsoP2Z5cnF0empkY2JtdHuFhX17enx1SVJteX+Ci42Tl5SJg4SBbV9cYGFeYWRjZ3R/gX1wa3R4dHdqLTk+PDg2Nzo6Ojg2NzU1MzI2NjUxMC8tLCwsKCotLCwvMTQ2Nzo8PDw7Ozw9OTc3ODk5PERLQT46P0VHR0VERUVGR0lPRUFLTktMTUxLS0tLS0tKSEdHRT0rIyUlJiYnJykqLCkoJiUkJSwuLy8vMTExNjg4OjgwJiAgICInLS4sKiYpKCknJycnJyYlJSUmJCQkJCQjIyMjIyMjIyMjIyMiIiEhIiIlLj1MXW1/iYqJgn11bWheVFBJRkhUYmZla2VlbHN2eXh8enZ1d3RycWtjWVBIQ0FBREVHSEhJSUpKSkpHR0ZHTFNeaXR/hYqJiImIiIiGhIOCgYKEh4iMi42LiImGhYJ+eHJuamloaGhoaGhoaGhnZ2doamtwcnZ7foGIkJSVkZGOjY6OkI6Kg4OFiIiDgH16d3d5enl6dnZ1dHN0dHR0dHR0dHN2eHyDh4yOjI6UlJCOjY2LiIuPj46QkZGOjYyKioeHhoWDgIGBLC0uLy4uLi4vMDAxMTIyMjIyMjIzMzIxMTIxMTIyMTExMjExMjIyMjMzMzMzMzIyMDAwMDAwLy8vLy8vLy8vLy4uLi4uLi4uLi4uLi4uLi4vLywsLC0sLCwsLCwsLCwsLS0tLS0tLS0tLS0tLS0tLS0tLi4uLi0tLi8uLi4uLS0tLSspKSkpKSkoJycnJicnJycnJiYlJSUlJSUlJSUlJSUkJCQlJiUlKS0zMz1KWWdybmdmaWRAJCUlJCUlJSUlJiYlJSgqLjZBTmF0gX98eXVtYUo0LjZZeHNyeXtsYWFnaXJ/hn95d3d6emRLXXB4eYCDio6SioJ2bGhkZGdhWVxiaW52gYV8cmxsbnFzdj4xNDc1NDU1NTY0MzIyMjEwMjMxLy4uLCwsLCgnKSkrLC8wMjM4OTo8PDw8PDs6ODk8PT9ZYkhCQD5CSUlGRkdGRkhHSEpCQ0hKS0xLSkpKSktLSkhHR0RANSYlJSYmKCoqKisqJyUlJCUsLi8vLjA0OD0+Oz07MycfHyAiKjAxMi8tLCsrKScnKSkmJSUlJSYkJCQkJCQjIyMjIyMjIyMjIiIhISIiJy48S15ufYiLi4eCf3l1cGtmYFdXWF1mZ19bU09dZFJKa3FtcnZ1dXFtZFxSSkNCQ0RFR0lJSUlISEhIR0dGR0xTXWp2gYiLi4qLioiHhoSCgoGChYeKi4uMiIiHh4SAenRxbWtpaGhoaGpqampoZ2dnaWptcXR5e36FjZOVlJGOjYyNjpCOh4KBhYiIgn98eXd2eHp5d3d2dXRzc3Nzc3N0dHR2dnp/hYqMjY2QlZGPjY2NiomLj4+Ojo+Pjo2LioqIh4aCgYCBgy4uLi4uLi4uMDAwMTExMjIyMjMzMzMyMjIzMzMzMzIyMzMzMzMzMzMzMzMzMzMzMzIyMTEwMDAwLy8vLy8vLy8vLy8vLy4uLi4uLi4uLi4uLi4uLSwsLCwsLCwsLCwtLSwsLS0tLS0tLS0tLS0tLS0tLS4uLi4tLS4vLy8uLi0tLCwrKSoqKioqKSgoKSkoJygoKCcmJSYmJSUlJSUlJSUlJCUlJiUlJSovMTY9TVpmb25oZGNmVishJSQkJCQlJSUmJygoKS42RlhvgoSAfXhvZlVFPzY5VHVwbHx8a2NiZWl2hYZ/dXN1dnl6YkxgcHBydnyEg3tyamdpaGhtbGttcnl4en6CeW1hVktLR01LLjAzMTExMTEyMzEwLi4vLy0vLy0tLSsrLCwnJCkpJygsLDAzNTg4Ojo5Ojs6Ojo7Oj0/P0JDQ0JBREZJTElGSEdERklKSEA+RkhKTElGR0lKS0pIRkVDQDkpJCQmJCgrKysrKiglJSUmKy4wMC4xOj1AQkA9OjQoHh8fJS0yNDc4NS8tLiomJiUmJyclJSUlJCQkIyUjJSQlJSMjIiIiIiMjIiIiIyUqNEdZan2Gi4yKh4aDf357endtbGdZW1dcZl5GQEY1PGB2fHdzc250b2dcU0pEQ0NCRUdISUlJSUlJSUhIRUhNVF9teIOJjI2MjIuIhoaEgoKBhIeIi4uLioiIhoOBfXl0b2xqaGhoaWlpaWhoaGdnZ2lrbnJ0eHuAipKVlZKRj42NjI+OiYOBhISIhH5+enh2dXd4eHd2dXV0c3Nzc3Nzc3V1dnl7gIaLjYyOlJSQjo6Oi4mIi46Ojo6Pj46Ni4mHhoaGhIKCg4QuLi4uLi4uLjAwMDExMTIyMjIzMzIyMjIyMzMzMzMyMjMzMzMzMzMzMzMzMzMzMzM0NDExMDAwMDAwLy8vLy8vLy8vLy8uLi4uLi4uLi4uLi4uLSwsLCwsLCwsLCwsLCwsLC0tLS0tLS0tLS0tLS0tLS0uLi4uLS0vLi8vLy8tLSwsKykqKioqKikoKCkpKSkoKCgnJiUmJiUlJSUlJSUlJCcrKSclJigrLC81PkxaZm9xa2djZmNBIiQjJSQlJSUlJSYpKSszRFRshYiEgXt0al9WUElERlJhYmZ+em5jYWhrfomHe3NzdXZ3fHlPUWdsamtvdXN0a2dqa2xvdHx9gIaHhIR/eXFeTUQ7MTIyNC0tLS4wMDExLi8vLywqKysrKy0sLCwrKysrKCUmJicoKisuMTM1Nzg3NTY3Nzc5Ojo+QkRGSEpGRkZGSEpMTUtKSUhLS0pHQEBESEpJRERHSUpJSEdFQj85KyQkJSYoKywsLCspJiUlJSouMDAvNj5ARENBPz4zKCAhIicwNzw8OTk4NTIuKCgnJSYmJSUlJSQkJCMiIyQlJSUlIyMjIyMkJCQkJCMkKDJHWWp8h4yNjIyLiISFg4KBe3VuXVxjaWVaUFZPP0tqfX52dGhDYHFoYVVNRkVFRUdISElKSklJR0dGRkVITVRgbniDiYyNjIyLiIaEg4KChIWIiYuLiomGhYaDgHx3c21raWhoaGhoaWloaGhnZ2dpa25ydXl7go2UlJKRj46MjI+PioWBgIOIiIOAfXp4dnV3eHh3dnV1dHNzc3Nzc3N1dXZ5fIKHjIyLj5aTkI2MjIqIiY2Pjo6OkY+Ni4uJh4aGg4CCg4aHLS0uLi8vLy0vMDExMTEyMjIyMjIyMjIyMjMzMzMzMjIzMzMzMzM0MjIyMzMzMzMzMzMyMjExMTExMDAwLy4vLy8vLy8uLi0tLi4uLi4uLi4uLi0rLCwsLCwsLCwsLCwsLCwtLS0tLS0tLS0tLS0tLS0tLS0uLi4uLi4uLi4uLi4sLCwrKysrKyoqKiopKSkpKCgpKCcmJSUlJSUlJiYmJyo4QzcnJicmKS0wNj9MW2ZvdHBpZ2JlWi8kIyMkJiQkJicoLDM9T2N4hYuLhYF3bGRgWVdSTk9YYWRue3duZ2ZocIeMg3lrbnJwcnd7V0FXYmZhY2Vnd25hbG9ze4OIiIaKjIyJfmtXRDg2NDQ0NDcxKigpLy4tLS0tLCwqKSkpKioqKiooJycnJyUjJCYmJycqLC8xMzQ1NTMzMzMzNzg4PEJGSUpJSkpISUxMUFJRUE9RTktISUhDQUJFRkJCQ0dHSElIRkA/OSwlJSUnKCstLi4tKiglIyMpLS4uMTpARUlFQkI9MSQfIyUrMjo9Pz06ODY0MisqKSUkJSQjIyMlJSMiJCQlJSUlJCUmJSYnJygpKSgnKSwyRVZneYeOjY+PjYuJiYiFhIB8cGRrb2ppW11oWzVBZHaBfHdyYmNwamFYTkZFRUdJSUlKSkpJSUdHRERGR0tVYW14g4mMjoyMioiGg4KBg4SHi4uMiomIhoWFgoB8eHJsamhoaGhnZ2lpaGhoZ2dpamxvc3Z6fYqSk5STkI+NjI2OjYiAgIGEioWCfnt5eHd2eHh3dnR0dHNycnJzc3NzdXV1eX6DioyMjY6UkY6NjouIh4qPj42OkJCQjouKiYaGhYODg4WHiC0tLi4vLzAvMTExMTExMzMzMzMzMzMzMzM0NDQ0NDMzMzMzMzMzMzQzMzMzMzMzMzMzMjIyMjIxMTAwMDAwLy8vLy8vLi4tLS4uLi4uLi4uLCwrKywsLCwsLCwsLCwsLCwsKystLS0tLS0tLS0tLS0tLS0tLi4uLi4uLi4uLi4uKysrKysrKysrKysrKSkpKSgoKSgpJyYmJiYmJicnJygtRlpMMDArJyktMjhBTlplbnJzbGljY2ZRKSMjJSUkIygoLjlLYHSDiYmKioN5amNhYWBcWFZVWWh1dnN4cmhmaW+AhoF1bm5ub3B3eVk4S1dcXl1aW255and5cn2Fh4eJioqJgm9XPjk0NDg/OzY5Ny4nKCosLS0sLCsqKCcnJygoJycmJyYlJSUjJCQjJCYlJyksLi8xMDIyMjIyMjQ3OD5DSUtMTExNT05OUVRXWFhYVlJPS0pJR0JBQT89P0JDRUZHRkRAPDUqJiYnKCkqLCwuLSooJyYlKC0uMDA8Q0VJSUVCOishICIlMDc7Ozs8Ozo3NDEuLCsnIyUlIyMjJCQjIiIiISEhIyMkJCQlJicoKSkrLC4xOEZZanqIjo6Ojo6OjIyLh4V/eXJoXk9HPjQwMDMxOkFNbXl1dnZzb2tjW1FJRkZISkpKSkpKSkpISEZGRUdLVWFtd4KJjI2NjIqHhIKCgYOEh4qLjIqJh4WEgoCAfHZwa2loaGhoZ2dpaWhoaGdnaWpsb3N2eoGNlpGSj46NjI2Mj4uGgICBhImDgH57d3Z1dnh4d3Z0dHRzcnJycnNzc3V1d3t+g4qMjY6SlJCNjY2LiIiLjY2Oj5CQj46Mi4mGg4ODg4WHh4ktLS8vLy8wMDExMTExMTMzMzMzMzMzMzMzMzMzMzMzMzQ0NDQzMzMzNDQzMzMzMzMzMzIyNDQxMDAwMDAwMDAwLi4uLi4uLi4uLi4uLi4uLiwsLCwsLCwsLCwsLCwsLCwsLCsrLCwtLS0tLS0tLS0tLS0tLS4uLi4uLi8vLi4tLSsrKysrKyoqKysqKikpKSkoKCgpKCgoKCcnKCgoKCgpKz9VUDw7LSkqLjI6RVBbZG1vcmxoZGJlZ0MjIiUmJCUrLjtPaXyHhomJiIF4Y1hYXmFgX11aV1dle3tvenNnZ2ZtdHh5dnBvbW9ydXpcMzZLVlZYWFJcbnR4cmJrfn9/eoiGfWlQQDk4ODY1ODg5Oz81KCcnJyosKikoKCclJSUkJiUlJSUkJCQkJCQiISQlJCYoKi4sLS8vLzAxMTE0OTk/RUdNTk9PT1FUVVZXWVldWllYVVJOSklJR0RCPjw9QUJBQkNCPjgvKicnJicpKiorLCwqKCgoJScrLzAzQEJHSkpIQDInHx8gJjU6PD0+PTkzLy0tLi0tKigmJCQjISEhIyIhISAgICEiJCQlKCkpKi4tLC4wNEVacH59hIyPjo2MjY6Oi4qHfXVqYFdPRTcuKCYjJio2OkBOWWlvdHRuZl5TTEhHSUlKSkpKSklJSUhGRkVGTFdhbHiAiIyMjYyKhoOCgYGEhoiKi4uKh4eGhYOAf3t2b2xqaWhoaGdnaGhoaGhnaGprbm90d3uEkpSSkY6PjIuMi4+Jg4CAgYWHhH99fHh3dHZ4d3Z2dHNzcnJycnJyc3N0dXl9gYeLjYyNlJSQjYuMioiIjI+Pj4+RkY+NioqJhoWDgoOFiIeILi4vLzAwMDAxMTExMTEzMzMzMzMzMzMzMzMzMzMzNTU0NDQ0MzMzMzQ0MzMzMzMzMzMzMzQ0MTAwMDAwMDAuLi4uLi4uLi4uLi4uLi4uLi4sLCwsLCwsLCwsLCwsLCwsLCwrKywsLS0tLS0tLS0tLS0tLS0uLi4uLi8vLy4uLS0tLSsrKysqKisrKiopKSkpKCgoKCgoKCgoKCkpKSkpKioySVhLOi0qKy82PkdSXmdra2ZsbWNgY2lmOyIkJCUpLDVJaIKFhIWGhXxvWEpOUFheYmJgYFxaY31+e4J1ampoa21vdXhybW5ucnV3XjEuN0tRUFFNTlheWlJGQml9e3V6dmtQOzU2Ojk4Nzc2ODs8Oy4mJSUmJyclJSUkJCQkIyQjIyQjIyIiIiIiISEjIyQlJikrLCwtLS0tLjAxNDc7PkZKS05QUVFTVldaW1xZW11cWllVU09OTktJR0RCPj5AQEFBPzw1LyonJyYnKCgqKysrKigoKCcnKy4uNEJCR0lIRj8tIyAfICk1Oz0/PjcyLispJiQoLCwqJiQjIiMiIiEjIiEhICEhIyQlJyopKiwsMDU7OUVTZHt/eHyJj46NjIyNjYuKhn95c2tmWlJCOS4oKCswOURGTE9OUVxra2ljV09KSUlKTEpKSkpJSUhHRUVFRkxXYW55gYiMjIyLiYaDgoGFhYeKi4yLioeGhIODgX96dW1qaGhnZ2dnZ2hoaGhoZ2hqbW9ydXh+i5WSko+OjYuLi4uLhYKAgIGFhYJ/fXp4d3V2eHd2dXRzc3JycnJycnNzc3V4fYSJjI6Nj5WTjoyLioqIiIyOjpGRkZGPjYuKh4WEhISFiImJii8vLy8wMDAwMjIyMjExMzMzMzMzMzMzMzMzMzM0NDQ0NTU1NTMzMzM0NDQ0NDQ0NDMzNDQ0MzIwMTEwMDAwMDAuLi4uLi4uLi4uLS0tLS0tLS0tLSsrKysrLCwsKyssLCsrLCwsLCwsLCwsLCwsLS0tLS0tLi4uLi4vLy8uLi0tKyssLCwsKiorKyoqKSkqKikpKCgpKScnKSsqKiwsKywtMDlMVDwtLS8zOkJMVWBoamdhYGtoYmJjb2MvHyQoKy8+Xn6HhIeFgXddQjU8RUxSWFxfYWRiYmRzgIiIe25ramlqbHJ0cGtrbG91dV8yLC45SEtITktKTEJCPzQ7ZHh6cGJOOzQ1Nzk7Ozo5Njg6Ozs2KCUkJCUlJSQkIyMiIiIiIiIiIiIiIiIiIiEhISMkJSYmKCstLS0sLS0vLjtBPUJFSUxPUlNUVVVVWFxeXV5eXV1cWFVTU1RSUVBJRkRAPTs+PTw5NC4qKSkoKCgoKCorKyoqKiooJykqLjRBRkhIRUI3KSAgIiMsNj0+PDk0MCwqKCckJCcoKigkIyMjJCQiISIiIiEgISQlJygrLS0vMzY8UWhuanB/f3t/io6Ki42NjIqIhoeGf3l0bGZcUkU3MzIyNDk/R0VER0lLV1pZXWFUSUhLTUlLTElKSUlIRkVERUZMV2BueICIjIyMioiFgoKDhYeIiYyMiomIhoWDhIF/enNsaWdnZ2dnZ2dnaGhoaGhpam1vc3h4g4+UkY+PjYuKiouLiIWBgH+Ch4OBf316eXZ2d3h3dXR0c3NycXNzc3Nyc3R3fH+HjI6OjpCWk46MjIqJiYmNkJCRkZGPjYyLiIaFg4SEhoiLioovLy8vMDAyMjIyMTEyMjMzMzMzMzMzMzMzMzMzNDQ0NDU1NTU1MzMzNDQ0NDQ0NDQzMzQ0NDMxMTIxMDAwMDAwLi4uLi4uLi4uLi0tLS0sLCwsLCwrKysrKywsLCsrLCwrKywsLCwsLCwsLCwsLC0tLS0tLS4uLi4uLi8vLi4tLSsrLCwsLCwqKysrKikpKiopKSgoKSkqKisqLS4vLy8vMTExL0dBMTEyOD9IUFtjaWplW1FabWdiYWdxVCQjKSwySGyEg4OBeWlJLikyNDtESlJYWl1hZGZodYKHhn9xaWdmaGxta2lpa2xvcXZfLCkrLjRGSEVHRj42NUlGNTNWZF1IPDU1Njg5Ozs6Ojk3OTo7PS0lJSMkJSUkJCMjIiIiIiIiICAgICEhISEgICAgIyQmJiUmKCorKioqLC40OTs8Q0hOT1JSUlNTVFVXXF1dXmJiYF5ZVlhZWFhXV1VNSUM9OTc4NzMwLCspKSkoKCgqKysqKioqKigqLC81QUZGRUM9LyMfICElLTY8Pzs3MS4rKSYlIyMiIyQmIyIkKSklJSMiIyMjIiMlJykqLDAyMi8xPVx1fnp5fH6AgIiKiouMiomHhIGChIN8d3BpY1xQRkE6NzY4Oj8/QURGSU5LTkhKXmVTVVpIRkpKSkpKR0ZFRERIT1hib3qCh4uMiomGhYKChYeIiIuMjImIiIeHhYSBfXZybWlnZmZmZmdnZ2hoaGhoamxwcnR3fIiSlI+NjYyJiImJiYeDgIB/g4aCgX58eXd1dnd4d3V0dHNzdHRycnJycnN0d3yAh42Pjo+Rk4+NjYuJiYmLjpCQkZGRkY6MioeFhISFh4mJioqIMDAxMTIyMzMzMzIyMjIyMjMzNDMyMzQ0NDQ0NDQ0NDQ1NTU1NTUzMzQ0NDQ0NDU1NTU0NDMzMjIzMjIyMDAwMDAuLi4uLi4uLS0sLi4uLS0sLCwsKysrKyssKywrKyssKiwsLCwsLS0tLS0tLi4tLS0tLS0uLi4uLi4uLi4uLS0tLS4uLS0sKywsLCsqKioqKSkqKSkrKy0uLjAwMTIxMTAwMTE5Qj01Nz5FTlRdZmpqYlVLSGFrZWNkbnE+ISgqNlF5gn1+c1c5JigrLDE1PEFIUFRaX2Rscn6Jgnp8c2hkYmdtcW1raWprb29wXispKyoqN0ZJRUM+MywxMzEqMURDODQzMjQ3Ojo6Ozs7Nzg6Ozw2KCgnJiUmJyclJCIiIyMiIiEhISEhISAgICAfHyEgIiMkJSgqKiosLCwuMzY3OzxCR0xPUlFRUVNWVlpaXFtgYWNhXlxdXl1ZXF5XU05JRDw3NTY0MC4uLSwqKSgpKSoqKysrKywrLC0xN0BERURBNyshIiIjKC40Oz46NC8qKSYlIyIiISIkISUmKSkpJiQjIiQlJSUmJiorKywuLy0uO0tYY3R4d3N8f3uEh4qKioqHhIF5fIKFg3x4cmliXFZPQjo+Oj1AQ0VHSExOVVFWWkpIVlNfaVxNSUpKS0lHRUNESFFYZG95gIiJi4iIhYKCg4SHiIqLjY2JiImJh4aEgXt2cW1oZ2ZlZWVnZ2doZ2hoaW1tcHF0dn+OkpGOi4uKiYiIioeFgoB/gISGgoF/fXt5eHl5eXV0c3NycnJycnJxcXNzdXZ7goqPkZCQlJKOjIqKiIiJjZCRkZGRj46OjIqHhoaEiImKiouIhzAwMTEyMjMzMzMyMjIyMjIzMzQzMjM0NDQ0NDQ0NDQ0NTU1NTU1NDQ0NDQ0NDQ1NTU1NDQzMzMyMzMzMzIwMDAwMC4uLi4uLi0tLS0tLSwsLCwsLCsrKysrKyssLCsrKyosLCwsLC0tLS0tLSwsLS0tLS0tLi4uLi4uLS0uLi0tLi4uLi0tLCssLCwrKioqKikpKysrLS0vMDEyMjMzNDQ0NDQ0ND5KQzlCTFRdZmtsamBVRThIaWlkYml0YSojKzpafH14d2M3JScqKSwsMDU5QEVNU1tmcniEkoV5eHNlYGBhaXBvZmdrbW5vcl0sKCotMTI5RkFAPDYqKikoJygsLzAyMzU5ODo6OTo7Ozk3Nzk8Oy0oKissKCkpKikoJyUjJCQiIiIiISEgICAgHx8gHyIjJCUmKSkpKiwsLC8zNjg5PEFFSk9SUlBQVFZYW1xcX15gYWJgX19fXFtbW1pXSU5IPDc0MjIwLy4tLCspKSkqKisrKysrLSwtMDtAREVEPzUmICEiJCkuMzk7OTUwKycmJCMiIiIiIyMkJSgqKiokJSMjIyQmKCcqKysrKyorM0FQV0I9OTw6WmxyfoaKiomJiIN8dXN7gISDfnhwa2dfVU5EQkBAQ0ZLS01MTFFOSD9LS0xPWGdsYklJS0lIRkRDRUlQXGVweYCFh4mIh4SCgoSFiImKiouLiYmJiYeGg4B6dXFtZ2ZmZWZmZ2doZmdpaWlsbnFydXaDj5COi4qJiIeEhYaEhIF/f4KGhYKBgH57eXh5eXd0dHNzcnJxcXFwcXFzc3V4foWMj5GQkpSSjYuLioiIiY6PkJCRkY+Mi4qHhoeIh4mKi4qIiYQwMDEyMjIzMzIyMjIzMzMzMzM0MzM0NDQ0NDQ0NTU1NTU1NTU1NTU1NTU0NDQ0NDQ1NTY2NDQ0NDQyMjIxMDAwMDAvLi4uLi4tLS0tLS0sLCwsLCwrKysrKyssLSsrKyssLCssLCwtLSwsLCwsLC0tLS0tLS4uLi4tLS0tLS0tLS0tLS0tLSwrKysrKioqKysqKiwsLy8xMjMzNDU2NjU2NTY3Nzg4RExESFJZYGZtbWlbUD4wNVZwaWNjanFIJCk4Wn57eHNcLiYmKSgoKywwMzk/RktYaXd5g5CMf3p1ZF5cXWNscGhnZ2lsb3JaLScqLTU7OVJIPTo5MislJyQmJiktLjI3QD05ODk6OTk4NjY4PDw3LSstLywsLC4uLiwpJSMkIyMiIiIgICAfHx4eHh4iIyMkJicoKSkpLCwvMzczMTM5PkFITVBRT1FTVVZYWl1dW1thZGNiYl9eX2FiXFJUUkc7NzUzMzIwLS4tKysrLCwrKywsLi8wMDM7QENDQTsxJCEhJScoLTI2OjkzLSkoJiUkIiIkJSMkJSgpKSwtKCUkJCQmJycoKSoqKSgrLzhFVFU9NSonL0JYa32IiouJiIR9dWtocXh/gYJ+eHNsZWFZUktDQkZGRklQUVNXVExJUE5PUlllVl1dTUtKSkdFREVKU11mcXmBg4aHhoWEg4OFh4qLi4qJiYmJiYmHhoJ+eHNva2dnZWRmZmdnZ2hnaGlrbXBydHZ4iJOOjIqIiYiHhIWDg4SBfn+DhoOBgIB/fHh4enh3dHNzc3JycXFycXFxc3RzeYCGjJCSkZKVkYyLioiHioyOj46PkZGPjYyIiIeIiYmLi4qKiYaEMjIyMjIyMzMyMjIyMzMzMzMzNDMzNDQ0NDQ0NDU1NTU1NTU1NTU1NTY2NTU1NTU1NTU2NjU1NTU0NDIyMTExMTAwLy4uLi4uLS0tLS0tLCwsLCwsLCsrKysrLC0rKysrLCwsLSwsLS0sLCwsLCwtLS0tLS0uLi4uLS0tLS0tLS0tLS0tLS0sKysrKiosLCsrLC0vMDMzNjc2Njg4OTk4ODg6Ozs7Oz5KVVJUXGNqcm1jV0o4Liw/Zm1lYmVsZjskNVF3fHZxXjYmJykpJygpKi4zOD5HV2x5dXyGjIN6dmheXFteY2hnZ2VnbXByWisnKi01PENjW0I3OTMsLCglKCgpKiwuNTw7NTU3ODg3ODc2NTc3OjIrKy0sKyssLS4vLCopKCYmJCIhIB8fICAeHh4eIiMjJCYnKCcoKCgpLTExMC8wNTo+QUdOUlRQUlNTVVVXWFhbXF1hX2BfX1tbWVlbVlNOR0A2NzQyMTAtLS0rKywsLCwtLS4xMzMzOz5BQT85LyQhIigrLC8xOTxFRD4zKycmJCYmIyQjJikpKCouLi0sKSUkJScqKCgoKCgoKzI2NDwxKicnKjVDWm5+iYqLioeDfHFqZWlxeH+Cgn14c29rZVlSTEpJT09RVVlcXFZRV1JLTlRXWlVJUFhLREVFRURGTlRdZ3J4f4KFhYSDg4WFhomKi4uJiIiJiYmHh4aBfXhzb2tmZmVkZmZnZ2doaWlqbG5wcnV2fY6TjouIh4eGhoaGhYSEgH+AhYWDgH9/fnx5eHp1d3Ryc3NycnFxcXFxcXJzdHuBiI2RkJCTk42Li4qIh4mNkJGQkZGRj4uLiYiIioqKi4yLiYiGgjMzMzMzMzMzMTM0NDMzMzMyMjQ0NDU1NTQ0MzM0NTU1NTU1NTU1NjY3NzU1NTU1NTU1NjY2NjU1NDQzMjIyMTExMS8uLi4tLS0tLCwsLC0tLS0sLCwsLCwrKysrKysrKywsLS0sLC0tLS0tLS0tLS0tLS0tLi4uLi0tLS0uLi0tLi4uLi0tLCssLCwsLS0tLjEyMjI1NTk7Ojo7Ozs8Ozs8PD09PUBDRk9WWlxmbnZuYVNGNS4sM01waWZjZW1dLypEant1cGVBJiUnKScmKSkqLzQ4QVpyeW9zgoh/enZuYV1bXmVmZmZjZmpsa1otJSYsMTdKZ1tOOC8vLCsrKCgqKysqLC4xMzIyNDU3NzY4NTU5NjU4MiopKywsKyssLCssKykoJycmJCAeHh4eHh4eHiAiIiMkJicnJycnJygoKigpLC8yOD5BS1FRUlRTUlNTU1RUUlVYWlxZW15dXWRjYFpSUVFNSTg4NzIxMS8wLS0tLS0tLS8vMzQ1NDg9Pj48NisjIyQmKS8xOU1gbHBrX1JBMysqJiIiIiYtNjQ2ODg4MzAtLCorKyopKSkpJiUqKyclJScnJygyQ1xwf4uLjIuHhHxwY1xgaHJ5gISCfXp0cGtoYmJjYWBfYl9eXVtibWhZW15dWVdQQDhPVmVaR0ZGR0xVYGlzen+Ag4SEgoOEhIaJioqLiYeHiIiIiIeDf313cm5qZ2ZlZGZmZmdoaGlpam1vcnN0eYOQkIyIh4aHhoaGhoWEg39/gISEgYGAfn18enl6dnZzcXJycnJycXBwcXFyc3V7hImOkI+QlJGNjIyLiIeIjpCPj5CRkI6MioiHiYmLjIyLioeGg4EzMzMzMzMzMzM0NDQzMzMzMjI0NDQ1NTU0NDQ0NTY1NTU1NTU1NTY2Nzc2NTU1NTU1NTY2NjY1NTQ0MzIyMjExMTEvLi4uLS0tLS0tLCwtLS0tLCwsLCwsKysrKysrKyssLC0tLCwtLS0tLS0tLS0tLS0tLS4uLi4tLS0tLi4tLS4uLi4tLSwrLCwsLC0uLi8yNDc1ODs+Pz0+Pj5AQEBBQUFCQkNERkpMU1ZZWmp2bl9PRDUvLC05WnRpZWRqbFouMll3dnBpTyonKScoJikqKSsvNURgd3Nqbn6DenRvcWZeXFxgYmZmY2dtbG1cLiYmKyswTWdZUlE5KiorKywsLSwsLS4tLS0vLzE0NTg3NTU2ODc1QFArKi0sLCsrKyorKyssKignJiQiHx4eHh4eHh4eHR0eHyIiIiMjJCQlJScnKCgqLzk4PEZMUlNUUFRYVVRRT1FPUVNVVldeYWJfYmZjXVVUUlFNOjU7OTQwMC4uLi4tLS8wMjU2ODQ0ODk7NjAnIyMlJSs2RltzgISFhoN6bWBUQi4lJCw5QUZHRkVBQ0I8NDQ0MjIyMTAwMC8tKickJCQkJCYoNEhfdYSLjIyLioN7cWFXWWBqc3mCgoOAfHdxamdoZGRkYWBhZmtsbGNbV1hXYGVmYWFbTFVrXEpFRktPWGJpc3p8gIKEhISFhoaIiYmJiYmHh4iHhoSEgX17d3JuamZlZWRmZmZmZmZpaWptb3JzdXyIk5GLiIeGhYWFhYSDhIOAgIGFhIGBgH9+fHp5eHZ2c3FycnJycnFwcHFxcnN2fYaLj5CQkJWQjYuMioeGipCQj5CRkZCOioeHh4qLiouMiYmHhoSCMjIyMjIyMzM0NDQ2NTU0NDMzNDQ0NDQ0NTU1NTU1NDQ2NjY2NjY2NjU1NjY2NjY2NjY2Njc2NjU0NDQ0MjExMTExMC8uLi0tLS0sLCwsLS0tLSwsKyssLCssLCwtLCssLS0tLSwsKywuLi0tLS0tLS0tLi4uLi0tLS0tLS4uLi4vLy4tLSwqKywsLS0vMDEyNTc4OTw+P0FCQUNEQ0RDRERERUVFR0hLUVlfXlxjcGtaTD8zLy4tMEFpcGxkZm1zWS1HbHd1bVk1JigpJykpKiwtMTtTcXhsanJ8fHRvbXFtYF1bX2FjZmdpamxtXy4lKiwuMVBlXVdVVjorJygoKCgpKi0uLy0sLC0uMDQ0NTMxNDQzM0t4UiEvLy4tLS0sKysqKysqKCcmJSIfICAhHx8eHh0dHh4eHx8gISEjJCQjIiYmJigsMzc9RUpPU1dTU1BST1FOUU9QUlRSWmBlZmdoZGRaTj5RTllAMDs9NzIyMDAwMDEwMDE2ODg2MjQ1MiomIyUmKDRKXnCCiYuLjI2OjouEemtUMSk6RU1JQT9FRkZFQTs6ODo6Ojw8Ojg2MywmISAiIiIlJzdOZHeIjIuLi4uGfW5jVVNZY2t0e4CGhYOAenp5eHh3bWxubXV5dXBrbHFvc3Jpa2prbm9dTlRPR0NNVVpiaXJ4e36AgIKFhoeHiYqKiIeIhoaHh4SDgn99eXVwbmpnZ2ZmZmVnZ2ZnaWprbXBydnZ/j5GOioiHhoaHh4aDg4WCgICEh4OBgYCAfnx6eXh2dnNxcXFxcXJycXFwcHFyeICHjY+RkJSSjoyLi4iIiIuRkJCSkpCOioaIiIqLioyMi4eGhISDgzIyMjIzMzMzNDQ0NjU1NDQ0NDQ0NDQ0NDU1NTU1NTQ0NTU1NTY2NjY1NTY2NjY2NjY2NjY2NjY1NDM0NDMyMjIxMTAvLi4tLS0tLCwsLC0tLS0sLCsrLCwrLCwsLSwrLC0tLS0tLCwtLi4tLS0tLS0tLS4uLi4tLS0tLS0uLi4uLy8uLi8uLC0uLi8vMTEzNjg5PD4/QUJERUZHR0dHR0dISElJSUtKTlVdZGdnYWRnW0w/Mi8uLTA0VHBraWRocnVKPGF6d3BjPSUnJicoKSorLTBBYHh2a2x4fnhzbWxvdmRdXFthY2VmZmlrbF0vJiosLTNTZ1tZW1hOOSonJiYnKSgtMDAvLisrLTAxMjMxMTY5OUllgIc2Ji4wMC8xMS4uLSwrKygnJiUkJCUlIiEiHh8eHR4eHh4eHiAhICEhICEjIiInKS0vNz9ERklOUUxOUFJQTUpMTlFSUlNXXWVmZmhnZFpVVktJWk42Nz06NjIxMTExMTEyNzg4NjQyMzAoJSUnLENheIKJjo6LiYuPkI6Pjo2Fd08wOkJNQj48QExKSUQ/OTY3Ojs8PDk5OTgtJCAfISQkJCo/U2l9iY6KioyMioF0ZFNLUFplb3Z8hIaGhYOAgHt6d3Vxc3h6eXh0dWZhZGtqcHFvbmdfVFdnYmZUTFRcZWpzdnp9f4CChoeIiImKiIeHh4WGhoWEgYF+fHh0b21pZmVlZWZlZ2dmZ2lqbG5xcXR3hJKRkIyIh4aHiIeGhISFgYCChoiBgYCBgH58enp5dnRzcXFxcXFxcW9vcHBxcnmAiY6Pj5KVko6Ni4yJiIiMkZCPkZGQjYqIiImKi4uLi4qGhIODg4MzMzMzNDQ0NDQ0NDU0NDU1NTU0NDQ0NTU1NTU1NTU1NTQ0NDU2NjY2NDU1Njc3NjY1NjY2NjY2NjU0NDQzMzIyMTEwLy4uLS0tLS0tLS0tLS0tLCwsLCwsLCwsLCwsLCwtLS0tLS0sLC0tLCwtLS0tLS0tLS0tLS0tLS0tLi4uLi8vLy8wMTAuLi4wMTM1NTk6Oz9BQ0RERUdJSUpKTEtLTExMS0xOT1NZYGdtcG1kXFVLPzYyLy8vLztfcGhlZGp0a0BVd3lzaUYoJycpKSgpKi0zRml7cmtufHpxbWtkYXZrXF1cYGNkY2NoampdMCcqKy0zWGhaWVlWUko+LCYmJycnKzIzLy4uLCwtLi4vMjQ+RlBheIqUdx8rMTMyMzQzMjEvLSsoKCUjIiMjIyMiIB8gHx4eHRwdHR4eHx8gICEhICEjJCYpLTM6QERFRkhIR0pMTk9OTk1NUE9RVVxgZmVpamdkW1JNSlplWEY/PDo3MzIwMTEyMzY2ODc2MzMyKycnKUFpgYmOkZKRkI6QkZGMjI2PkoZsQj9GTEVETUlUWVVPTUlCPT0+QUE+Pj88MigkIyUlJicuQlhtgY2NjIuLi4mDeWVOQkhSX2lweICGiIiFhYB+eXZ1dHVxdHd3a2ZjXVpgXmJmYlthXFo9QVFkXV5bX2VtcnZ6enx/goWGh4mKiYiHhYWEhIKCgX9/fXp2c25saWVlZWVmZmZmZmdpam5vc3N0e46UlJCMioiIiYmIh4WEhYCAgoeHgoKBgX9+fHl4eXVzcnBxcXFwcHBvb3BwcHV7gomPkI+RlJGNjYyIhoeIjJGQkJGRj4uIiYmKi4yMjImIhYSCgoSGMzMzMzQ0NDQ0NDU0NDQ1NTU1NDQ0NDU1NTU1NTU1NTU0NDQ1NjY2NjQ1NTY3NzY2NTY2NjY2NjY1NDQ0MzMyMjExLy8uLi0tLS0tLS0tLS0tLSwsLCwsLCwsLCwsLCwsLS0tLS0tLCwtLSwsLS0tLS4uLS0tLS0tLS0tLS4uLi4uLjAzMzU0MDAwMjMzNzg8Pj9DRUZFSEpNTk5OT1BQT1BQUE9RUlJVWmFobm9zcGJSQz43NTQzLy8xQ2pwZmVlbHleTnR8dm9QKyYoKiooKCotMkpteW9scoF4bmxnYmRvcGJgXl5hY2FiZWloXDAnKywwNl9lW11dW1BPTEAuKCcmJyguMi8tLCwqKywsLTdCTllpeISMlphbHi00NTY2MzIxLy0rKikoJiMiIiIhIB4dHh0cHBwcHR0eHh4eHx8gICAhIyQkJigtMjY5PkFCREVFSU5LT1BQT1BNT1NWXGxfYW9samNbUUxZZV9VT0lBOTg4NTIyMTI1Njc3OTg2NjIsKDligoeMkJOXl5STlZaSj4uKjZKOe1I8RklKSktOU1ZYWFxhYV5VVVFPTk1HQTQmIyMlJigoLkFXbYGPkIyLi4uIgXVkSTk9Sldga3Z9hIeJiYiGgn1+fnRqYWRhXmBoXWFZVVdhZmFXWmGFf0FDV19bYGRpb3N2eHl8f4OFiIiKiYeGhIODhIKBf39/fnx5dXJta2hlZWVlZmZlZWZnaWpub3NzdHyQlJSRjYmIiImJiIaFhIOAgIKHh4GBgYF/fnx5eXd1c3JwcHBxcXBwb29wcHF2fISLj4+Pk5SQjYyLiYeHiYyQj4+Qj42MiImKiouKiYmIh4WEhISFiTMzNDQ0NDQ0NTU0NDQ0NDQ1NTQ0NDQ0NDU1NDQ0NDU1NTU1NTY2NjY2Njc3NjY2NjY2NjY3NjY0NTU0NDMzMzMxMTAwLi4tLS0tLCwtLS0sLS0tLSwsLCwsLCwsLCwsLCwsLS0uLiwsLC0sLC0tLS0uLi4uLi4tLS0tLS0uLi8vLi4wMTQ1Nzc2Njc3OTk+QEFCRkdLTU1PT1FRU1VVVFRUVFNTU1NVVlxjaXFxcW9lW1BDPDg1NDIxMDVQcWllZmZydV1xgHlzWTAmJikqKSksLjVScXZtbXV+cWVnZ2lpaXRoX15cX2BgY2RnaFowJiwtMTplZV5gXltPTU5RRC0pKCclJy8vKykrKiorLzhHV2Jue4aKiJabkzYkLzM0NDQ0MDAtLS4tLCkmJCEhHx4dHR0dHBwdHR0dHR0dHR0eHiAgISIiIiMlKS0uMTY6PkBCQ0VNU1JRTk1JSE1RVVtlam9wbG1qYFNOS2BjVVBQTkk/ODc0MzMzNDQ3ODo8PDw5NDlaf4uKjZCSl5aTlZqal5KMioqMkYVePklJSkhMTVJUWl5fYmNkXVpeXVpYVEUwJSMjJSUmJi1BU2l9jI6NjIqKhHxwYkUvMT5KWGVsd4GHi42MiYeGhYKAeGphWlleXFdXV1xeXl9qZVhpg4h9TFphXlpZZm9yc3Z6fH+ChYeJiYeEhYWDgoOBfn5+fn16eHRxa2tnZWRlZWVkZWVnaGlsbnBzc3OCk5OTkI2Lh4eHiIaFhIOAgIGDiYaBgYCAgX58enh2dXFxcHBwb29vb29vbm9wd32FjY+Qj5aTkIyMi4mIiIuPj4+PkY6MiIiJioqKiYmHh4aFhISEho00NDQ0NDQ0NDU1NDQ0NDQ0NTU1NTQ0NDQ0NDQ0NDQ1NTU1NTU2NjY2NjY3Nzc3NjY2NjY2NzYzNDU1NDQzMzMzMTEwMC8uLS0tLSwsLS0tLC0tLS0sLCwsLS0sLCwsLCwtLS0tLi4sLCwsLCwuLi0tLi4uLi4uLS0tLS0tLS0vLzEzNDQ2ODs8PDw8PDs7PUBEREhKTE5PUVJTVVdYWVhZWFhYWFhYWltgZmtwc3FvZVpRUEtBODQzMzIwOF5xZ2RobnZ1eIOAeGEzKCooKiorLC48WnhzbWxzfnZqaWlpaWpwbWFdXF5jYWJmaGZZMCsuMzQ/ZmReXV5aTUpQVFNDLCcmJCQmKi4qLTMxN0FLV2hwfIKLjYeUmp14HSgvMjQ0MzEwLywtLSsrKSUjIR8eHh0dHRwcHBwcHBwcHBwdHh8eHyAgIiEjJigqLCwtMjc5PEBCR01QUUlCSEtOU1lfX2VqZ2xuaVxUVk1SZFhTT1BQTUhBODAvMTM2NjY2NjY8OD1ZeoqLi4yRkZOTkZCVlZeSjYiIjZCJbEZGSUlMTU9RU1ZZXF5fX1xcW1xbWFFCLCQiIyMkJCYpN01jeIaLi4uJiIJ5blg9LCkvQExZZXR+hIuOjYyLioeCgHl2dGRlZmVaWl5qamdfTEhOa4WIjnRTUExRWWduc3V1d3yAgoSGiIiGhYSFhICBgH58fH19e3h0cWtpZWVkZGRkZGZmZmdpbG5wcXR1h5WUkY6LiYeHhoaFhYSEgn+AgoeFgYGAgH9+enl3dHNxcXBvb29vb29vb25ucniBipCQkJGWk46NjYyIh4eLjo6NjY6MioeIiYqKiomJh4WEhISFhYeONDQ0NDQ0NDQ1NTQ0NDQ0NDQ0MzQ0NDQ0NDQ1NTQ0NTU1NTU1NjY2NjY2Nzc3Nzc3Nzc3NzhBQzs2NjQ0NDQzMjMxMDAwLy4uLi4sLC0tLSwtLS0tLS0tLS0tLS0sLC0tLS0uLi0tLS0tLS0tLi4uLi4uLS0tLS0tLi4uLi0tLy8xMzU1ODs9QUFCQkA9PUBDRkhLTlBSVFVYWVtbW1xdXFxaW1tcXF5fYmhuc3Z0cWddVExRVVBCNTIxMS8+ZW5oZmhxeX6Bf3lpPiUnKigpKSowQmR5b2xrcYB1a2hnaWlnZmxjX11eYmJkZ2ZnVjMxMTE0R2ZjXV9fWUZGTlNUUkMrJiQjIyc2PTY5P0VPWGBqeIGFio2Pk5abmVUdKiwuMTAvLi4uLSwrKyonJCIfHhwcHBwcHBwcHBwcHBwcGxwdHh0dHh8iIiUnKisrKywvMzc6QEpLUVFOSk9MTlBTV15eXmFjYWFaVllTVWNeUU9OTk5MSEU+NzIuKy8vMDIzNDVPc4eKjIqKj5GQj4Bwc4COkoyHh4qQi3JIQUhJSkxOUVNTU1ZXWVdXXF5eXFhVRSwhISAiJCUkJzRKYneEjYqKiYZ+dWlSMyg1Nj5ET15vfIKJjY6MjIqFgoB6dG5lWldWWF5kamRlZFJMW3uHiY6QjX1vZltWYWxvbnd9gYSGh4eGhoWEg4GCgH97fHt7e3l4dG9raGVkZGNjZGRlZWVnaGxvcXJ0eY2WlJGPiomJiYeFhIOEg4F/gIKIhIKCgIB/fHl2dnVzcXBxcHBvb25ubm5sb3R7hIuQkY+TlpKOjIuJiIaHjI6NjY2Mi4eGiIiJiomIiIaGhoSFhoWIkDQ0NDQ0NDQ0NTU0NDQ0NDQ0NDM0NDQ0NDQ0NDQ0NDU1NTU1NTY2NjY2Njc3Nzc3Nzc3Nzc4RFdOOTY1NDQ0MzIzMTAwMDAuLi4uLSwtLS0tLS0tLS0tLS0tLS4uLS0tLS0tLi4tLS0tLS0tLS4uLi4uLi0tLS0tLS4uLi4tLS8vMjM1Nzk7P0RERUZFQkFDRUlLTlFTVFZYW11eX2BgYGBfYGBgYGBiZGdrcHN2dHJrYFdNSERITUtBNDEwMUdra2RjaHB9hYB6cFYwKCooKy0xN0ppdW1raG96b2poaGlpZWNlaGFgX15iZGVlZlUzMTExMlBnYV9jYFdFRktQUVJQPykjIyMlMURORENNU1piaXl/hIiJkI2Rl6CWOx8vLjAwLy8uLy4tKysqJyQiIR4cHBwcHBwcHBwcHBwcHBscHR4dHR0eICEjJSYmKiwsLS8zNz9ERUtNTktJSk1PUVNXWl5eYWBiXllVU1VjXVFQTk5OTEhFREM+ODMwLiwrLy9EaYOEhIiKjI2OiHdVPUFZeI+NhoWKjIx1UERISUlJTE1OT1JTVVJSVFdZWFZSUEMuISEgIiQlJCYyRV1ygoqKiYaDfXNmUi8mNzs/QU1hbnl/hYmNjIyLhoKBeXNrY1lTUVBLT1ZYXl9eX3aJjY6RlZmcm5+fl31XVVtUVVtgY3B+gYOEg4OAf358e3p6e3x5d3NuamdkZGRjY2RkZWVlZ2ltcHN0dX6Sl5SSjoyJioqKhoODhIOBf4GDiYOBgYGAf3x5eHZ0cnFxcG9vb29ubm5ubnB1fIWMkZKQlJWQjoyLiYiGh4yNjIyLi4mIh4iIiYqJiIiHhoaGhoaFiJA0NDQ0MzQ1NTQ0NDQ0NDQ0NDQ0NDU1NTU0NDMzNDQ1NTY2NTU2Njc3NjY3Nzc3NjY2NjY2NzpHTjw1NTU0NDQzMzEvLzAwLi4uLS0tLi4tLi4uLCwtLS4uLS0tLS0tLi4tLS0uLi4uLi4uLi4uLi0tLS0tLS0tLS0tLS4uLi4vLzE0Njk7PkJISk1NTElHR0pMTlBTV1lbXl9iYmNkZGRkY2NkZGVlZmZqbnF1dndybGNaUUpDQkJGSUlEOjEwUG9mY2Jmcn6EfnlrV0M1MzY6QkpZb3FqZ2VudW1raWpqaGVlY21kYWBfYmRkZGVTMCwqLDJbaWRhZ2hXSUtNT09PT0w5JiQlKDBBVlhLSFJYYWdye4GHiYeMkJSanoQlKC4zMjAvLy4rKSoqKigmIyAfHR0cHBwcHBwcHBwcHBwbGx0dHR0cHh4hIiIkJicqLS8yNDpBREdQVFlZWltdXmVtdnVzdHBrZmBfWlBXZmBTUE9PTUtJRkRCQkM9OjQyMSsyXH6Cg4OFh4qJgG1LKigpPWODjoeEh4yNdlBBSUpLS0tNT09OTk5LS1BTU09OTUtDLiEhIiIkJSUoMkhdcoOJh4aDgHtvYk0tKSsvNj9NYWx1fIKFiIyKiYiFf3lza2ZZVVFQUl1fXVxiZ297jZKVm6CfoqWknH9XTE5TUUpHQDtBTFZsfoKDgX9+enl5ent6eXZzbWhlZGRkZGRkZGVlZWdqbXFzdHWGlpWUkY2Mi4uLi4eCgoOCgYCBhomCgICCgIB9eHd1c3BvcHBwcG5ubm5tbm9wdX6HjZGRkJWUj46MiYmGhoiMjoqLjIuJh4eHiIiIh4aFhYaHh4WFhIqRNDQ0NDM0NTU0NDQ0NDQ0NDQ0NDQ1NTU1NDQ0NDQ0NTU1NTU1NjY3NzY2Nzc3NzY2NjY2NjY2NTc6MzU1NDQ0MzMxMDAwMC4uLi4tLS4uLS4uLS4uLS4vLy0tLS0tLS4uLS0tLi4uLi4uLi4uLi4tLS0tLS0tLS0tLS0uLi4uLy8zNTc6PEBESU1PUlJQTUpMTlFTVVhaX2FiZWVnZmZoaGlpaGhpaWlpbnF0dXZ1cmxjWlRNRkJAPj1ETU5FPz5cbGRjY2lzf4F9eXJmXFVWW2BkbHJuaWdkbHhvaWppaGZiZGJtbGZlY2RmZGRjUjApKio8Z2lkZmVnT0xPTU5OTU5OSzgoKC42OktcWkxRWV1kbXd+hYiJi46SlpubaB4oLy8uLy0rKSgoKSkoJyQhHx4eHRwcHBwcHBwcHBwcGxsdHR0dHB4eISIiIyUlKSwvMTEyRldkbHFydnh6dnJ0dHZ0cnRzc3RybWFVWGVhVE9OTk5MSUZEQkNCREZJQTAvQW+Cent+g4SFfWE3JSgpJTJXfYyGg4WKiXNJRElKS0tLTU5OTU1JRktMTk5OT0tJQi0hISIiJCUlKDNJX3SCh4eEgH53bl5GKCszLyozTV9pcXh8gYOGiImIh4F9eHBpZWJbVVtcXlxdYWdxf4qPlJmgm5KFaVNIVmFhaW5cTUpIR0dEQkpmfIJ/fHp5ent6eXh1cm1oZGRkZGRkZGRlZWVnam1xc3V3jZeXko6MjIuMjIyIgoKDgoGAgYaIgYGBgoB8enh3dXNwb3Bvb29ubW5ubW5vcHZ/iI+Rj5CUk5GOjImJiIeKjY2LioqIh4iIh4iIiIeGhYaGh4eFhYWOkTQ0NDQ0NDQ0NDQ0NDQ0NDQ1NTU1NTU0NDU0NTU0NDU1NDU2NjY2Njc3NzY2NjY2NjU1NjY1NTYzNDU1NTQzMzMzMjIyMTEwLi8uLS0tLi4uLi4uLi4uLi4uLi8vLi4uLi4uLi4uLi8vLy8uLi0tLS0tLS0tLi4tLS0tLS0tLTAwMzY4Oz9DRktOUlZYV1NPUFFUV1pbXmJjZmVoaWpra2tra2prbGxtbnJzc3N1dHBrYl1UTktEQ0A+PDo9Q0VFT2doZGRmb3l8fHd5c3BwcHJyb3BuaGVmYmt7cGdmZmZlY2NibXZqZmVhZGNkYlEsKiosSWxnZmhnZktLT05OT05MTEtIODI1OTk9U1pUT1NaX2lxfISHiYuQkZWam5lDHSosLCoqKicnJiYmJiYlIyAfHh4eHBwbGxwbHBwcHBwcGxscHB0dHiAgISIhJicqLzlOYWhqamlqcHl5dnVzdHNxb29wb25wcnJ0c3FtYFVRT09OTElHRUNCQkVKUWBgUFt7gHt8fICEfm04HSYoJScvTneKhoOGiIJoQ0RJSktLSktOTU1MRkZKS0xMS0pJRz4uISAiIyQkJSgzS2B3homFgn57dGxcRy4mMSkoOlBbZWxxd3t+g4WFhYSDgHtzbWlqa2hhWl5jZ2tweIKLj5CQgkIuMDtNXWBucXRmVlhjaGltbWheUlZneXt4eXh6enl4dXBrZmRiYmRkZGRkZGVlZ2tucXNze5KXlZCOi4uMjI6Ph4KDgYGAgIGIh4GCgoOBfnx5dnRycXBvb29vbWxsbG1tb3N5goqOkI+Qk5KQjIuJiYiJjI6KiomJiIiHh4eIiIiHh4eHh4iFhISGkJA0NDMzNDQ0NDQ0NDQ1NTQ0NTU1NTQ0NDQ1NDU1NDQ1NTQ1NjY2NjY3Nzc2NjY2NjY1NTY2NTU1NTUzNTU0MzMzMzMyMjExMTEwLy4uLS4uLzAwLy8vLy8vLi4vLy4uLi4uLi4uLi4vLy8vLi4tLS0tLS0tLS4uLi4tLS0tLS0vMC8yODtAREhMUVZZW1taVVNUVVpcXmJlZ2pqbG1tbm5ubm5tbnBwcnN1dnZ2dHNvaWJdVVBNSEVCQD05ODU2O0NSZmVjZWlzeXV4dnR0dXh2c29sZmJiZWJpfXBpamhqaGlpam97bmloY2NlYl5OLCorL1hsaGZqbmFFTFBQT1BOTEtJR0ZCPzw9Oz1FOTxLVl5mbnJ8hIiKjo+TlpueiSwhJignJyYmJiUlJCQjIiEgHx4eHh4cHR0cGxwcHBwcHBsbHBwdHR0eICAhIyInP1pmZ2RjZGVncnh4dXR2dHNyb21ra2xsbnBwcnZ7fXRcUExOTkxIRkVDQkNESFNhbXJ6gn57fX19fnldLCQlJiQkL050ioaDhIeAWjlESExNTUxNTk1MS0ZIS0xNTUtKSUc+LiMfISIiIiUoOFBmeoeHgn5+e3RpWD4rLDAsLkVRWl5na3F1enx9foKBgH98eXV0c3BuZ2VmaGtxeIOKjI2LjVwfMkRMXGJhXW5zbYafo6mmnZOIgIKBb2dtdnd4enl3eHNvamVkYmJkZGRkZGVmZ2ltb29ydX6XmZOPjYyLioyOj4eDgYCBgYGBiIeBgoKCgH17eXZ0cnFwb29vb2xsbGxtbW9zeoONkZGPkJGQjIyLiYmHiIyOioqJiYiIh4mHh4iHhoaHh4iGg4KDiZCQNTU0NDQ0MzMzMzQ0NDQ0NDQ0NDU1NTQ0NDQ0NDQ0NTU1NTc3NTU1NjY2NjY2NjY2NjY2NjY2NTU1NTU0MjI0NDMzMjExMTAwMC8vLi4vLi4uLi8vLy8vLy8vLy8vLy8vLi4uLi4uLy8vLy4uLi4vLS0tLi4tLS4uLS0tLS0tLzAxNDY6QERITFFYXF5hYFpYWVpcYGBkaGlqbG1ub29vb29vcXFycnN0d3d2dXRxbWZhXFdRTUpIREE/Ozk2MjEzPFdqY2Zlb3JnaGdmamtqaWZnaWZmZWRgZnhzb21paWZlZ2hofXJoZmRhZ2FcTiwqKTxna2hpbG1TQktPUFFRT05MSUdDQkBCPj85OzU0QlFaYmdsdYCDh4mNkZWXmJpzHiAkJyYnJSUkJCIiISEfHx8fHh4eHh4dHBwcHBsbGxscHB0dHB4cHR8gICI3W2xpY2FgYWNpcnp3dXV3dnRzcnBubmxsbGtrbG9wdHqAd1pMT05MS0dFQ0NDQ0pUYGt0gIR9eXt7eHVvSikmJiUmJi5OdIiDgYWFek83QkZKTExNTExMS0hFSUtLTUtKSEZEPi4jICAhISElLDxUa36Jh4F/fXlyZ1M4IicxOD1MUVpcYGZrbnFyd3l8fn9+fnx3eHd1cXFxb2puc3qBh4yLiYhBJzdFUVtdUVVifZqzvLu6ubGijn5wjZmNd3R8enp6eXZzbmtnY2JiZGRkY2NkZWdpbG5xc3OEmZeSj42LiouOko+EgYGCgX+BgYiFgYOBgH99enh2dHJwb29vbm1sbGxsbmxvdHyGjJGQj5GQj42Mi4mJiYqOjouLiYiHh4iHh4eHhoaGiYiIhICCho2RkDU1NDQ0NDMzMzM0NDQ0NDQ0NDQ1NTU0NDQ0NDQ0NDU1NTU2NjU1NTY2NjY2NjY2NjY2NjY2NjU1NTU0NTQ0NDQzMzIxMTEwMDAvLy4uLy8vLi4vLy8vMC8vLy8vLy8vLy4uLi4uLi8vLy8vLi4uLi4tLS4uLS0uLi0tLS0uLjAwMTQ2Oj5BSExQVlxgY2RhXlxdX2FiZmhpbG5wcHFvb29vb3FxcnN1d3h4dnRzb2tmYVxWU1BNSkZEQD06NzQxMTFHamVhY2lsWEtSVVRUTkpLV2hmYV9cWmR4cGppZGdqamdkZXh4a2hmY2hnW0osJy5QbmlobG9qRUVMUFNUUlFPTUlFQz48QEU+Ozk9OT9UVltgZ212foSIio2QkpWXmFgaJiYkJCQkJSUiIiEhICAfHx4eHh4eHRwcHBwcHBwcHBwdHRweGxogHTRaa2plYGBiY2Nsdnl1dnV4eHh4dXNxcG5ubGxqamprbG5zeoJ5XE9OTEtHRUNCQkVKUmFudH+AfXl3d3NwYDksLCgmJygvT3OHgoCEhHZJN0JGSkxMTUxKSklDRUlKSUlJSElHRT8tJCMjISIjJSxAWG2AiIeCgH96cmRQNSIiJjJCTVBWWVxhZWlrbXF0eHp8fHx7e3x7d3R0dHJwdHh+gYiMi4iCNzE8RVNfVlFNbqC2vrq2t6OrtJmOk5qdlo2AZlhwe3l2cm1nY2NiY2NjY2NjZGVoam1vcXN1ipuYk46MjIuLj5COg4KCgoGBgoOKhYGCgoB/fXp3dXRycG9vb25tbGxsbG1tcHV9h46Rj46RkI6NjIuJiYmKj46KiomIh4aJh4eHhoWGiImHhYGChoqPkZA1NTQ0NDQ0NDQ0MzMzMzQ0NDQ1NTQ0NDQ0NDQ0NDQ0NDY2NjY1NTU2Nzc2NjY2NjY2NjY2NjY1NTUzNDQ0NDQ0NDQzMjExMDAwMDAvLy8vLi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8uLy8vLy4vLy4vLy4uLi4uLS0tLS0tLS0tLzEzNTg7QEVKT1RbYWVqaWVhXV9iZGZqbGptbm5wbm5ubm5xcnR3eXp4d3Z0cm5pZGBcV1RST0xIRkJAPDk3MzEyOl5pYWBia1gwNDs6NjIvN05oZFxaV1NdeHJpZ2JkaGpoaWxyfW1mY2Jqb1xHJyhAaGtpanBwXT9ITlNUVVNRUE5JRUE/PTw+RUI9OEBBUmRRWWFma3V9goaJi46SlpeRPRwmKCglJiUkIyMiIiEhICAfHx4eHR0dHR0dHR0dHR0dHR0eHh8fIkVsb2VeXGBkZGZqeHp3dnd4eXt6eXh2dXJxcHFta2traWlqbHJ7hHpbUExKRkVDRENESVRhbnR+enZzc3Rxclo3LzAsKCcnMlF1hIB+goNwPTNBSEtKTE1MSklBQkdJSUlKSUhJSEY+LCIjJSMkJScvQ1txg4mFg4B9eXBhTTIgISU5S1BUVlVYXF5jZWdrbHN2eHl7e3t9fnp6eHh1dnl8f4OHiYWEfzMzPERUW0xFWJS0vb2rlqikrLmykYaPnpWNhXdfbnh3dm9rZ2VjYmJiY2NjY2NlZ2ptb3Fzd46ZmJKNjoyKi4+PioSCg4OCgoKFiYOBgoOAf3t4d3VzcnBvb29vbWtrbGxsbnF2f4mPko6PkZCOjYyLh4eKjJCMi4yLh4mJiYiGhYWFiImJhoOChYmOkZGPNTU0NDQ0NDQ0NDMzMzM0NDQ0NTU0NDQ0NDQ0NDQ0NDQ2NjY2NTU1Njc3NjY2NjY2NjY2NjY2NTU1MzQ0NDQ0NDQ0MzIyMjEwMDAwLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLi8vLy8uLy8vLy8uLi4uLi0tLS0tLS0tLzAxMzU3Oj1CRk1TW2Flam1qZmNiZGVoa2tqbW5ucG5ubm9wcXN2eHt7eHd0c3FtZ2RgXFhWU1BNSkdEQj46NzQyMTNOamBdYGdnNScqKyssLjlSZV9XVlBNVnhzaGdnY2VrZWprboJ0aWZmbXZgQyZCZGpoaWxwcU5CS1BVVlZUUk9MR0VDPz05OkBKSj85PkVbWFBYYGJqdXuBhImKjpKSlYYtICgpJycnJSUlIiIhISAgHx8eHh0dHR0dHR0dHR0dHR0fIB8dL11ua19eYGNlZ2pxend1dnd4eXt9fX19eXd2dHJxb25ta2pmaGdrc3mBcVVMSkZFQ0NDREpUYmxyfHpycHBxbm5tYUUxLy8rKzVVd4V+foGAaTIjNUVKS05NTEc/PUNJS0pKSklISUhGPCoiIyMiJSUmMEdfd4iJhYOAfXdvYEgtIyUsQlBUV1dXWVpaXVxgZGZrcXR2eHl5e319fX18eHp9foCDhYWBgnk3NztBTVJKRG+mt762iHygtLq4tpF+ipeWkpiQgnV2dXRva2dlY2JhYWJiYmJjZWdqbW9zdHyTmZeQjYyMi4yPj4mDgoODgoCAhYmFgoKCgYB9enZ0cnJxcG5ua2tra2xsbG5wd4GKj5CNjo6Pjo2Mi4aGio+QjIuMi4mKiYeGhoWFhYiHh4OBgomNkJKQjzQ0NTU0MzU1NTU0NDQ0NDQ0NDMzMzM1MzQ0NDQ1NTU1NjY1NTU1NTY1NjY2NTU2NjY2Nzc3NzY2NDQ0NDQ0MzM0NDM0MzMxMTExMTEwMC8vLy8vLy8vMDAwMC8vLi8wMC8vLy8wMC4vLy8wMDAwLy4uLS4uLi4tLS0tLi4uLi8xMzQ2Nzk8QUVMUlpgZmtubmpnZmdpaWlqaWtsbnBvb29yc3d4e3x5eHh3dnNuaWdlX1xaWFNRT0tJRkI/Ojg2MjIvP2NjXmFmakcmKCopKy87VGVbV1JNTlR0d2ZnaGlpaWZobHCBfm1ramh1enBnaWhobHBucGhDR01RVVdVUlJOSUZFQT49Ozg1OUZJPzo5QklQUFZeZm11foGEh4qMj5KTdyUiKCgoJiUlJCEgIR8fHx4eHh4dHR4dHB0dHRweHR0dHyIiQmpuYl5gY2VmanB3e3d0dnh3e3x+fX5+fXp4dXZ3dHJxb2pnZmVmZm1zenxpUEpHRkNFQ0dMVWJyeHl1cG1ucG9vcG9tYUcyLSw3VnmCf36AfmQwIyQqO0ZISkg/NTM8Q0lLTEtLSkhIRTglIiIiIiQkJjNNZHuJioWEgn12bV1DKSIqOkxVV1pdXFxbWllUVVpkaGxxdHR1d3h+gYB/fn19foCCgoJ+foJyRzlAQ0tJQ02Jqba9tntZg5GpsqqNjoOLlpOho5yIdXFyb2tmYmJhYWFiYmNjZGZoa29xcXJ+lpmUj42JiouNkpCJg4GBgoCBgoOJg4GCgoB+end0c3Fvb29vbm1sa2tsbGptcHiDi4+Ojo6NjIyMjIqHhomPj46NjYqJiIiHh4aGhoaHhYOAg4aNkZOSkY81NTU1NDM0NTU1NDQ0NDQ0NDQzMzMzNDQ0NDQ0NTU0NDQ0NTU1NTU2NjU1NTU1NjY2Njc3Nzc2NjQ0NDQ0NDQ0NDQyMjIyMTExMTExMDAvLy8vLy8vLzAwMDAvLy4vMDAvLy8vMDAuLy8vMDAwMC8uLi0uLi4uLS0tLS4uLy8wMTM1Nzg5PEFFS1FYXmRqcHBtamdmaGhpamxrbm9xcHFzd3l8fX9+e3l6eXdybWpmY19cW1hUUlBNSUZCPzs5NjIzMDRbZ2BfYmhXKCUpKSwwPFZmWlVRT1BVcnhoZWVlYmVraGlteoNza2ppb3yBenhvbG9wcHFcQUhOUFNVVFJPTEdDQD48Ojk1MzI4Q0c+MTU9Q0ZRW15lbnV7f4KGiIqMkZRrHCUmJiIiIyIgHx8eHx8eHh4eHR0dHR0fHx4fIR4gHx0jTm5sYF9lZGRpcnd6fHd0c3V4ent7fH19fHx4dHV4dnR0dHJwa2lnZWZobXN6eGBLSERDRERITVhmcnh3cnFubW9ubnFyb21rYFRCP1x6gXx+gHlbKCIiIyEqOEFBNy85QEJGR0lLTEpJSEQ2JSIiIiIkJCg6UWl7iIqFhIJ/eG1aPyYlMURSVllbXl9fWllXVFNZXWVrbW9vbXBzeHx9f399f4GBgoKBfIKDbVZDRkVJRUBhk6iyt7iqjnyGlpWblZqUkpKNk5umlYNyb25oZmRiYmJiYWFjZGRmZ2xucXJzhJmZlJCMiYqKjJGOiYOCgoF/f4CEh4KCgoKAfnp3dXNxb29vbm1sa2trbG1rbnJ5hIyQj42OjIyMi4yJh4eKkI6OjYyKiYiIhoaGhoaGhIOBgYWLkJaVko+ONjU1NTQzNDU1NTU1NTU0NDQ0MzM0NDMzMzM0NDU1NDQ1NTU1NjY2NjY2NTU0NDU1NjY3NTY2NjY1NDU1NDQ0NDMzMzMyMTExMTExMTAwMDAvLy8vLy8wMDAwLy8wMDAwLi4vLzAwLy8vLy8vMDAvLi4tLi4uLi0tLS0uLjAwMDEzNTY4OTxBRUlRVVtiaXB0cm5qZ2dmaGlrbG9xdnl5fH1/gYKBgX9+e3p3cW1qZmJfXFtYVVJPTEpHQz88OTczMjEzTGleXWFjYTAkKCkrMD5YZFdTUVJUWGlyZmFiY2FhaWxycHGAdWpmZmhxe3p5dW9ucHJuTkRKTk9SUlJPS0pFQT48Ojc1MzMxLzJAQzozNzw/RFRcYWNudXx/hIWIhouTklgbHyIkIR8hICAfHx4fHx4eHh0dHR0dHyIjJCYjIB4tWW9rZWRoaGlucnVzdnd1c3R1dnl6eXp7eXJqaWlocXVxcHJ2d3JvbGhmaWxwc3dyU0lGRkJFSVBda3J3dm9ubW5wbXBycW9qZWlvb2tvf4B8fn13UyQhIyQjIiUjKyooLzo/RUdJSUpFRkY/MSUjJCIiJCUtP1ZtgIqJhIOAf3lsWDomKjtKVVtaWl1fX11aV1VTVltgZWlrbGprb3d6fHx8fYCBgoKCf36Dgm1WT0xHSUJBbJqlq6uompCanaGgoZiQk5mamI6QmJiIf3NraWRiYmJhYmJiY2NlZ2dqbnFzc4qcmZaQjYqKio2RjYiDhIOBf39/goWBgoGBgH16d3Nxb25ubWxsa2tqampra25ze4aMj42OjoyLioqLh4eGio+Ojo2Mi4mIh4aFhYWFhYOCgYWKj5WVlJGPjTY1NTU1NTY2NTU1NTU1NDQ0NDU1NDQzMzMzNDQ1NTU0NTU1NTY2NjY2NjU1NTU1NTY2Njc2NjY2NjU1NTQ0NDQzMzMzMzMxMTExMTEwMDAwMC8vLy8vMDAwMC8vMDAwMC8vLy8wMC8vLy8vLzAwLy4uLS4uLi4tLS0tLi4wMDAxMzU2ODo9P0NITlRaYGducnVzbmppZ2hoaW5xdnyBg4OFhYeHh4OBfnt6d3Fua2ZiX1xbWFVST0xKR0M/PDk3MzIwMEBjYFhdYmVAJSgoKi9BW2JWUlFUVlZkc2dgY2NjaG1tb2tncXNoXl9jaW1yeHt4dHRtXUdJS01OT09PS0tKRUE+Ozk2NTMzMjEvMjw9NDM3QUdSWVlhZW11eX+ChoWIjZGQTRgeHx8fHyAfHh4eHx8gHx8eHR4cHiIlKCstJSA3YW1oZGdpbW1yeHVucHJycXBvc3Z2d3l6cGhjZWhtbm9wbm1ra3J4d29paGpsbXJ0c2RNSERDR0tVY290dnRubW1vbmtudHJwbGpoaW1ye4OAe358c0skISQkIiQkJCcqKykuOkFFSElLTUxFPDAmJCQjIyYnMERZcYWLiISCgX93aFQ0JTBCTFJZWlteYGBfXFdVU1RZXmFmaGlrbnB1cXV6fH2AgYKCgn+AhIBuW1paVFFIRHGcpqWjnpWXmIqLmZeWk5aanZiVmpyTkImCamVkYWJiYWJiYmNjZWdoa3Bwc3aLmpiVkI2KioqNkIyGhIODgH9/foCDgYKBgX99enZzcW5ubWxsbGtrampramxudH6IjI6OjY2KiomLi4iGh4yRjY2NjIqIh4aGhYSEhYWCgoKIj5OVlJSRj401NTY2NTU2NjY0NTU1NTQ0NDQ1NTQ0MzMzMzM0NTU0NDU1NTU1NTU1NjY2NjY2NjY2NjY2NjY2NjY2NTU1NDQ0MzMzMzMzMjIxMTAwMTExMS8vLy8vMC8vMDAvLzAwMDAvLy8vLy8vLy8vLy8vLy8uLi0uLi4uLS0tLS4uLy8xMjM1Nzk6PT9DR0xTWF9mbHF3dXJva2lnaGlvdHuBhoeHh4iJiIeFgX16d3JvbGhkYl5bW1lVU09MSkdDPzs4NjIxLi80U2RaV1tjUyYlKCsyQ11hWFJRVllYYHJpY2pqbmxrbWtsbGNnaWVgXWNpbnF1enpuXk9NTk1NTk5NTEtKSUVCPz05NjUyMi8uLi4vNkE/Nz5HTldhVV1kbHR7f4KChouRlY9BGRseHh8eHh0eICAhISEhICAfHh8hJSgvNC1BZW1oZWhqa252d3Bpa25ycG9ub3F0dHV2a2NhYWFnam1ucW5saWZqdXtzbGxqamxucHFtV0ZDQ0hOWGVwdHhxbm9wcW5qbXJyb2xqamhrdH2Cf3x9fXJDIyQkIiMjIiUlJywuKio0PUJHSEdIRTwvJSQkJCQmKTJHXnWGi4mFgYGAdGdTMSY2REtPVltcX15dX1xZVlRUWFxgY2FjZWlrcHBtdXd8gIGBgoKCg4N/cGRnY1pWUU91naalo52ZlpOOj42OkpSZlZSbnaGgkZGOkHxmYmNhYGFiYWFjY2VnaWxxcXV5j5mWko2NiomKjZCKhoWDgX5/f3+Bg3+Cg4J/e3h1cW5tbWxsa2pra2poa2ttb3eAiY2Nio2LiYiJi4iFhYeOkoyMjYuJiIaFhYWEhIWDgoOHjZSWlZSTkJCNOTk5OTg4NjY3NjU1NTUzMzQ0NTU0NDMzMzMzMzQ0NDQ1NTU1NTU1NTY2NjY2NjY2NjY2NjY2NzY2NjY2NDQ0NDMzMzMzMzIyMTEyMjExMTEwMC8vLzAvLy8vLy8wMDAwMDAvLy8vLy8vLy8vLy8vLi4tLi4uLi0tLS0uLi8vMDEzNTc5Oj0/Q0dMUFdcY2lvcnV0cG1pZmhsdHh8gYSFhYWGiIaEgX97dnNwbmxoZGJeW1pXVFFOS0lIQz87ODYyMjAvMUNiW1haYF0yJSsuMEBaXVZTVVdYWWBzbWRocHFxbm5xbW5rX11iaWRmZ2tsbmdhVVFTU1RRUU9PTUtJSEdFQj8+Ozc2MjEwMC8vLC03RkU/Q0hOaWRVX2dscXh9foOGi5GViTgYHB0eICAfICIiIiIiIiIiHyAhIyInLzhIWmhoaGttbXF3dmxpZ2lsbG1tb3BxcXRyXVtbW19gZWtvcG5vcW1qZGl0d3Fva2ttbG5ucmVJREJJUVtocXd1bm5wcHBtZmlycnBua2xqaXF7hIB6fHtrOyQmJSQlJSUjJScsMTIrJCg2QURHRkI3KyMkJSQkJio2TWN6iYeEg4GBfHJlTC4mN0VLT1NZWVxeXV1bV1VVVVhcXmFiZGRjY2lram9yeHyAgYGBgYKDfHJua2dlYFxcfJ6kopyZk4+Jiod6f5KTl5iVlZmdop+ek4Z9a2NiYmJhYmFhY2NlZ2lscXJ0e5KalpKNjYqJio2Ri4WEgoF/fn+CiIaAgIKBf3t4dXBubWxsbGpqa2tqa2pqbXF4gouPjIuMi4mHiIeHhYaGkJKNi4qLiYiGhYSEhYWDgoGFi5GWlZSUkpCPjDk4OTk5OTg3Nzc2NjU1NTQ0NDQ0NDQzMzMzMzM0NDQ0NDQ0NDY2NjY1NTY2NjY2NjY2NjY2NjY2NjU2NjQ0NDQ0MzMzMjIyMjExMTExMTExMTEvLy8vLy8tLS8vMDAwMDExMDAwMC8vMDAvLy8vLy4uLS4uLi4tLS0tLi4uLzAxMzU3OTs+QEJGSk9UWV9laXB0d3NwbGdnbXd6fYCDg4ODhYSCgn56dnVzcGxpZmNhXltZVlJPTUpIRkM+Ojg2MzMwLy81WWBXWFxhQyYpLDBBXF1XVlZZWVlfc3FpamttcWxqamxuampkWFlZUj06PkJGUlNXWVlZVlNPT0tKR0ZEQkA/PDs5NzQwLy4tLS0tLzhGS0ZGQ1NyY1lgaWlzen1/g4eMkJSLMhgcISAhISIjIyMjIiQkJSQkIiIoJTVITVJaZGpvb3R4d2ljZWRkZ2dna25wbm9qUlFYV1tcX2NmaGxwc3V0bmpka3l5c3BsbG1sb3JwVURDSlFdbXV4cm5vcHBuaWJocXNwbW1tbWx1fYSAfHt5aDclJyclJScoJicqLi80MSokJS06RENAMyokJCQkJycsOVBnfIeGhIOBf3luX0EpKDxFSk5SVllbXV1cXFtbWlpbXV9gYWBgX2JlZWRobHB4e31/f4CAgXx3c3Nwa2dmZX+Znp2WjoiFhX5zVm+LjZWYmZSUl52dmpiJeXlkYWNjYWJhYWJjZWdqbXBydX2UmZaTjYqJioqOk4qEg4KBf36AgoiFgoKBgH97d3Rwbm1ra2tramtraGlqa21zeoSNkIyMi4mHhoaFhIKFiZCQjIyKiomIhoWFhoWFhISFipCUlZSTkpKQjow7Ojo6Ojo6ODc3NjY1NTU0NDQ0NDQ0MzMzMzMzNDQ0NDQ0NDQ1NTU1NTU2NjY2NjY2NjY2NjY2NjY1NTU0NDQ0NDQzMzIxMjIxMTExMTEwMDExLy8vLy8vLS0vLzAwMDAuLi8vLy8vLzAwLy8vLy8uLi0uLi4uLS0tLS4uLi8wMTM1Nzk7PkBCREhMUlZcYWdtcnZ2c3Bsam51eXt+gICAf4B/f3x6eXVyb2xqZ2ViYF5bWldST01KSEZDPjo4NjMzMC4uMUliXFlbYFQoKCswQltdV1VVV1dYXG92bG5xdXlxb3Fya2lrZV1cWkw9PUBITlRYWVtbWVZTUU9NSURDQkE+Pj08Ojg1MjAuLi4vLzE1OUNMSUIyRl5nXV5kanN5f4KEhoyQlYoyFyEgIiQjJCQkJCQkJCUlJSQlNVNsYk5KV2JscXh7b2JhYWNhYWNjYmdrbG5hQUVMUlhZXWJjZGdtcXV1d3NtaWl0fnlxbmttbW1wcmNIRUpVYXJ2eHJvcHBwbmJfZ3F1cG1ramhscnyDfn19emUxJiYnJSUmKCgpKSYlKTI0LCYlJS47PjEmJCUlKCcoLT9Wb4GIhoSDgIB5blo4KDA/R0pOUVRZXF1bXV1bW1tbXV5eX2BfXl1eYmNiY2dqb3Z5fX19gIB7dXR0cnNxb3CElJqWkJKampR/dnuDiYuPlpmbmpiWlpeYlYN8b2BhYmFiYWFiY2Vnam1xc3SBmJmVko2KiouNkZOKhIOCgYB/f4OIhYGBgYB9enVzcG1ta2tra2pra2lqaWxuc3yHjY2LjIqIhoWFhYSEh4uRkIyMiYmIh4eFhoaFhYSEiI+UlZSUlJOTkI6MPDs6Ojo6Ojo5ODg4Nzc2NjQ0NDQ0NDMzMzQ0NDMzMzM0NDU1NjY1NTU1NTU1NTY2NjY1NTY2NjY1NTQ0NDQ0NDMzMzMyMjIyMTExMTAwMDAwMC8vLy8uLi4uLy8vLy8vMDAvLzAvLy8vLy8uLi4uLi0tLi4uLi0tLS0tLS0uMDEyNDc5Oj0/QUVHS05SV11ianB1d3Z0bWxvdnh7e35+fHp8e3t6eHZxb2xraWVjYl9cWVdUUk9NSkVFQT05NzczMjEtLi85XWFZWV9hNiYrMENbXllZWVpbW19rd3FubXB5e3h0d29oZWZeV1RHPD5CSE1SVlpcW1pXVVNQTEhEQUA+PDw7Ojg3NjQzMTEvMDE1Oz87O0pNRkFCXWdfYGRrcnl/gIOGjJGXiC8dIiYjJCQlJiMjISQkJSMqRmh1cWRMQUpgdHx5Z19iXl9hY2NjYWFlaWtUP0NKSE9UV1phYWBkaW50eXp3dHFsb3l7cm1tbW1rbW1pUElMV2Z2eHVxcXJxcG1cXmZwdHFta2tpa3N9g397fXhhLCcoJygoJygqKScmJygtMDAnKCgpKi8vKiknJiglJjBGXHODiIiDgYCAeWpVMSc1RUtKTFBSVFhaXFxcXFtcXV1cXWBgX2BdXl5bWVxgZWxvdHd5en1+eHJzdHV3dXR2hYyRk6CsrKKVgXp7g4eMj5KVmp6hnZWUmJmSgnhkYmBgYWFiYWNlaGtucnR0hZeXk5CMjIqMjpGSiYODg4KAgIGEiIWAgIB/e3d2dXFubWxrampqa2tra2prb3d/iI2Ni4uKiIWEg4ODhYiMj46MjIqKiYiGhYaGhYWDhY2SlZWUlJSSkpKOjD08Ozs7Ozo6OTg4ODc3NjY1NDQ0NDQzMzM0NDQzMzMzNDQ1NTY2NTU1NTU1NTU2NjY2NTU2NjY2NTU0NDQ0MzMzMzMzMjIyMjExMTEwMDAwMDAvLy8vLi4uLi8vLy8vLzAwLy8vLy8vLy8vLi4uLi4tLS4uLi4tLS0tLS0tLjAxMjQ3OTo9P0FERUlMT1NZXmRrcnZ3d3JwcnN2d3p7ent7enp6eXd1cm9samhlYmFeW1lVUk9NS0hFQj87OTc2NDExLi4vMk1hW1lbYk8nKy89WGBcXFxeXmBhZ3d1b3F3goJ3dnhya2hlVUpPQTo9QENLUVVYWVlZV1ZSUE1KRUNAPj07Ojo6Ojg2NTMyMzM0PD07Oz08PlNdWmNpamNkZG1zeX6Ag4iPl5eDKxwoJyYlJiYkIyUkIShPbnhpYGNeSzxBVG50ZFlbXV5iYmJmZV9gaGRPPT9JQ0dITlVWVVdaYGhvdHl8e3h1cWx0fHRsbGxramhoaFhLUlttd3ZxcHFycXBlV1tmb3NwbGtram10fYN/fHx3WSknKCgpKSopKSgnJycoKi00LigoKSoqKiopKSopKSkzS2F0hYiGgYGCgXhmTC0sPEdKS0xOUVJWWFlaWlxcXFxeXlxaXl1aXV9fXFlaXF5iaW9zdHd5d3FucHV1dXV2d4KGjaCztq6jjYB7hIyLi4uUmpmanqCdlpSak4d8cmFiYWFgYGBiZmhrbnJ0doiZlZGOjIyKjI6RkIeCgoKCgH6BhIiFgICAf3t3dHFwbW1sa2pqamtra2trbXJ3gImNjYuLiIeFhIODg4aIjI+OjIyKiomIhoWGhoWFhYqQlJWVlJSUkpKSjow9PT49PDw8Ozs7OTk4ODc3NjU0NDQ0NDQzMzQ0MzM0NDU1NTU2NjU1NTU2NjY2NjY2NjU1NjY2NjU1NDQzMzMzMzMzMjExMTExMTExMTEvLy8vLi4uLi0tLS4vLzAwLy8wMC8vLy8vLi4uLi4uLi4uLi4vLy4uLy8uLS4uLi4wMTI0Njg6PT9BQ0VHSk5QVltfZmpudHd1cnFydHZ4eXh4eXl4eHd1dG9ubGloZmJfXVpXU1BOTElGQz8+Ojk3NDIyLy4tLS49Xl5ZWWBhOygtPVhlYF9eX2NpaWdzfXV0fIqFeXd3dW5qX1FKUEU6PUBDR05RVlZXVlVVUlBNSUZEQUA+PDo6Ojo6NzU0NDU3OT08PDs9NiwzTF5mZ2lubmRianF3e4CEho2Ul4UmISknKScmJSQjIjVxeXJrZV9dWE4/PlFSVllZWVxeYmJlZWVlZldEPTxCSEVIRk1RT1FUX2hvc3N0dnl5d3Vwc314b2xra2poaWZbUlRhcHZ0cHJzc3JtXlZZYm5ybmpqamltdH6Bf31+dVQnKCkoKCkqKSgoJygpJyksMjEpJygqKyorLCwwLS0vO1NpfIiHhIKBg31zY0MrLz5JS0tNUFBRUlVXWFlaWlxdX15dXV1dXFxdXlpXWFlbW2BpcHBxdXFnaG1vc3Z4d3qBi52us6uejoWEgn+Cg4KCipecnJufoZyWkpiNgn5mYF9gYGFgYWRobXBydHeKmJWSj4yMjI2Nko6DgIGCgoGAgYSIhX9/gH17d3Nxbm1sa2tra2tra2xsa21xeIKJjYuLi4eFhYWDg4OHi42Oj4yLiYiIh4aGhoWFhIeQlJaVlJSUk5GRkY6LQEA/PT09PDw7Ozk5ODg3Nzc3NTU1NTQ0MzM0NDMzNDQ1NTU1NjY1NTU1NjY2NjY2NjY1NTY2NjY1NTQ0MzMzMzMzMzIxMTExMTExMTAwLy8vLy4uLi4tLS0uLy8vLy0tMDAvLy8vLy4uLi4uLi4uLi4uLy8uLi8vLi0uLi4uLjAyNDY4Oj0/QUNFSUxNTlJWW2BnbHB2eHh0cnR2dnZ3d3V1dnZ1dHNubWtnZmVgX11YVVFOTEpHREI/PTs6ODY0MS8uLS0tMlFgW1peYlIqLDlVZGNkZGVscHBpcn56fYeQinx2fHVuZmBVSz06OTw/QUZITVJTVFNUU1JQTUpHRUJAPj07Ojs6NzU0NDQ1Njs+PTw7OzMvKyo8WWZnanJ0aGNka3R6foKKj5SYhywiKSknJycjH0Bydm5qamtpamZaQThJTUVPVVZZXGFjZGVnXkM0RT9BUUtFSEhJTE5TXWZscnR0c3R1eHl4dnh9fXVtamxoZmZjYVdaaXV3c3Byc3RwaFZUWGFscm5qa2lqbnV+f3x/fXJLJCcpKSkoKSgoKioqKSonKTAzLScnKCoqKiotMDMzOUdcc4WHhYKCgX98cmBBKzNCSktLTVBQUFBSVFZZWVlaXF9fX11cXFtZX15bVFVZX2BaYmpqbW9kWmBnbnN3eXyAhZGgqKmdlY6Hh4eEgYGBgoeNlZybmZ6fnZWXkYp+b19gX19gX2Nma21wcHV2i5iVko+MjIuLjpONhYKBgoKBgIGEiIV/f4F+eXVycGxsbGtra2tra2tsbGxvcnmCiY2Li4uHhYWFhISGio+Pj42MiomIiIeGhoaFhIiOk5aWlZSTk5KQkI+Oi0FAQUNCQD8+PDw7Ojo6ODg3NzY2NjY1NTQ0NTU0NDQ0NDQ0NDU1NjY2NjU1NjY1NTU1NjY2NjU1NTQ0NDMzMzMyMjIyMjIwMTExMTAvLy8vLy8uLi4uLS0tLi0tLi4uLi4uLi4uLi4tLS0uLi4uLi4uLi4uLi4vLy4uLi4uLi4wMjQ1ODo7PkBCREZJTE1RVVhdZGhscXV4dHJ0dHV1dXNzc3J0cnJvbGpoZmRiX1tZVlNQTEpIRkNCPz46ODc2NDEvLSwsLC1BX11ZWl5iPSk3UWZmaWtucXV0cHR8f4KKin9wbXVzbGpfWEg3ODk6PD1BRUtQUVBQUVBPTk9LRkJAPz49Ozs5ODg1NDMyMzc9Pj48PDgxLi4uKzBKY2hocXFvZ2Ztc3h9g4qNk5aBKCEnKygnIjNzdW9ra21tbG9vW0M4PE9ESlVYWltcXl5bTDk0NTg2RU1JQklKSkxUXGNnaW1wcnFwcHV4enp6fX11bmhqZ2NhYWJcYHB6eHFxcXJzbGJQUFdganBramxqanF5gX98foBxQyYnJygnJygpKikpKiopKCotMTUwJygoKSkqLDIzND5SZnqHiYWBgYJ9eW9dOis5RUlNT09PUE9PUFJSVldZWlteXl9gXVlYWFddW1RTVVllZF9kZWhrXVZeZm10ent/h4yUnaGgnpeTi4uLhoaKioqHh4mQm5qYnZ6YlpKNg3lkYWBhYWFkZ2lsb3N3epKYkpGOjIuJiYySi4SDgoGBgICBhIqFf398eXd0cXBvbWtqa2tqampqamprbnN9hYuNiouKh4WEhIWDhouPjo6MiomKioeGhoaFg4WLkpSVlZWUkpGQkJKRj4xCQUFAP0A/Pj47Ozo6Ojg4Nzc2NjY2NTU0NDU1NDQ0NDQ0NDQ1NTY2NjY2NjY2NTU1NTY2NjY2NjQ0NDQzMzMzMjIyMjIyMDExMTEwLy8vLy8vLi4uLi0tLS0tLS4uLi4uLi4uLi4uLS0tLi4uLi4uLi4uLi4uLy8uLi4uLi4vMTIzNDY4Oz1AQ0VFR0pMUFNWWl1jZ2xxdXVxcXFwcHJycHBxcG1tbGpoZWNhXlpYVlRRTUtIRkVCQT48Ojc2NDIwLiwrKystM09gVlVZYFcsMkpha2xtcXZ4dnFxc4CBbXRsbnZpZWheWFdCODo6OTk6PUFITlBNS0xOT09OTEhDPzw7Ojg3Nzg4NTQzMjU6P0A+PDw3MS8vMC8uKzVTampqdXJoZWpye4CDiYuQknYbJCgnKCZqd21oanBydHR4clpHPDdHSUVTV1laWlhFNjU3OjgxOkRCQEJESElRXWRnZmdoZ2lubnBydnh3dnl6dW9qaGVhX2BhX2Rzd3ZzcXJycGlZTk9VYGlsaWpsampxfIF/fIB/bTwlJygpKSkqKyorKiorKyorKy80NzEmJygpKSwxODxJXHKDjImFhIKBgHdqVjQsOkRJTU9PUFJRT05PUFJVWVpdXl9hYF1ZV1VVXF9dWVNPTmFnZ2ZnZlpZYWdydnx+g4mOkZebm5eQi5KUlJGYoKKempKLipGXmJaam5mSh4iHdGZlZGRlZ2lsbXBzd36VmZORjoyLioqOkYqDg4OBgX9/gYSJhH9/fnx2c3FtbGxtbGtpampqampqbG91f4WLjIyLiYeFhISFhomPkI+OjI2MioqIhoWGhISJkJSVlZWVlJSSkJCSkY+MRkZFRERDQT8/Pzw6OTk4ODc3Nzc3NzU1MzMzMzQ0NDQzMzQ0NTU1NTY2NjY2NjU1NTU1NTY2NTU1NTQ0MzMzMzIyMjExMTAxMTExMDAwLy8vLy4uLi4tLSwsLCwtLS4uLy8tLS0tLS0uLi4uLi4uLi0tLi4uLi4uLi4uLi4vLzExMjM1Njs7Pj5AQ0VHSU5RVFdZXmNobm5vb21tbm5vb21tbWtramhnZWJhXltZVFJRTktJSEVDQT4+Ozg2NjMxLy4sLCsrLC48XFhTVFxfQSk9VGZsb3N7enZvbGdpblticYaMeGdbT1NTQjo6Ozk5Nzc7Q0pNS0hGSktNTEtFQjw6Ojg4ODg3NjQzMjM3PkJCQD48NTExMTEwMC8sJ0BdZmxtcG1qbXZ5foOIjIyRTxwjKCZRenFranB1d3t/fWBWRzszO0I7P0lVWk81KTY7OT1APTs7PkJER0lRWmNoaWZhYmNgX2Vpa29xc3RzcnFxamRgX15gX2Nod3h0dHVycW9kUk1OVF9maGpta2lrcnyEf32Af21AMi4qKysrKyoqKiorLC0tLC0tMDg8LyYoKSwuLjlBU2d5iY2JhYSCgX51ZEgtKzpDR0tOT1BSU1JPTk5PUlNYW11fX19eWlZUUVpgY19aV1RVX2dpaWVbX2hudXp+goeKjY+RlpSQjY+ZpKSinpyampqdmpCMjpSUmJuWh36Lhn1saGtpaWttbnJzdXeCl5iTkY6MjIyNkJOJg4KDgYGAgIGEh4J+fnt3dXJvbGxsa2ppa2lpaWlqam1wd3+HjIuKi4mGhYSEhImLkJKQjYyNjImJh4WFhoSGjJOVlZSUk5GQkI+QlJKOi0hIRkVDQ0JCQT8+Pjw8Ojk4ODc3NzY1NTQzMzM0NDQ0MzM0NDY2NTU2NjY2NjY1NTU1NTU1NTU1NTU0NDMzMzMyMjIxMTExMTExMTAwMC8vLy8uLi4uLS0sLCwsLS0uLi4uLS0tLS0tLi4uLi4uLi4tLS4uLi4uLi4uLi4uLy8wMTIzNTc4Ojs9P0JFR0hLT1JWWFldYmVnaWtra2lpamppaWloaGZlZGJfXltXVVNQTkxKSEZDQT89PDg4NjQyMCwrKysrKywsMk1fVlFXW1csMD1QXmhvdXp0bWhfV1FKWnKFjoaAc2ZlYEk9OTs5OTc3OD5DSUhFRUZISUhHQ0A8Ojg1NTQ1NjUzMzU3PUNEQkI9OTQyMjIwMTAuLi8sK0Rjam1wcW1wc3Z+gIWIiXcgJCJCe3Foam92eXyCd1xWVkk5MjU3ODc2OzgsMDU2Nzk6Pj4+RUhMUVRaW2FpamZhXmNmX1pcX2FiZm9xbWxucWpkYF9eXl1hbHZ0cXFycW9vYExLT1VdY2VrbWpqbnV9hoKChIFyUklFPDAsLCsqKysqKy4uLCstLS4yOjkyKS04Pjc9TWJ0g4yNiYWEg4KAdWVKLycwPkZKS05RUFBPT05NTk5PUlhdXV5fXltXVFNXX2ZoZGNiZWprbG5qY2lwdnx/goeLioqLi42Pj4+TmqKjoJqYmZqXlZaWjoqOkZKTk5WNh4SCdnBubW9vcXJzd3h5hZeWkpCNjIyNkJCTiYOCg4GBf3+BhIiDfn57d3VycG1sbGppaWhpaWlpamptcHiBiI2LiYqIhYWEhYeLkJOSkI+NjoyKiYiHhYSEiZCUlZWUk5KSkJCPkJKQjYlNTUlIR0ZEQkNBQD89PDs7ODk4NjU1NjY2NjU1NDQ0NDQ0NDQ1NTU1NTU1NTU1NjY0NDQ0NDQ0NTU0NDMzMzMzMjIyMjIyMjIyMS8vLy8vLy4uLi4uLiwsLCwsLC0tLC4tLS0uLi4tLS0tLS0tLS0tLS0uLi0tLi4uLi4uLi4uLjAwMjM2Njg7PD5AQkVISE1PUlZYWlxgYmRlZGRiY2VnZmVlZmVjYmFeW1pYVVJQT0xKSEhFQUE+Ozs4NjQyMS4rKysrKyssLSw8W1lSVVtiRSYxOUVXYGtzb2hhXFhVSUhgfImFgXt1dWpOPDk8Ojg3NjU4PUBBQEJDQ0NDREE/PDk2NDMwLy8xNDY7P0JFRUNCPTYzMjMzMTEyMTAzMjAoM1JnbW1qdH13dHZ6goBqNyA0dXVqam52d35/dVtUVVZOPjQyMzU2NTQzMjc4ODo6OTlDSk5QVFxfYF5lamhlYGNnaGVjX11ZUFBgb21qbHFrYl1cXV5cXm92cW9wcXJxbFJMTE9TWFxlbGxnaW12gIaFhYiGeWxjW1NENC0rKysrKysrLCsrKyssLjQ7PTAzMzo+RFpuf4yQjYmIiIaEe3VqXVtXTEVBREZITk9OT05MSkRASUxUWlpZWFxcW1dZXmZsb29wcnNzdHFzcnFzd3uCg4aLjYyLioiIioyRk5eamZmUk5aYmJaTkZCPjo6OkpSPhoWKhH13dXN0dnd3eHd6fIqVlJKPi4uLi46QkYiCgoKCgH5+gYSIf358eXd0cXBubGxqamppaWloaGtrbHF5g4qNiYiKh4WFhYeJjJGVkpCQj42LioiGhIOFiY6UlZSUk5KRkI+PjZCSkI6LTk5MS0lIRURFQ0NBPz08PDo5OTY1NTY2NjY1NTMzMzM0NDQ0NTU1NTU1NTU1NTQ0NDQ0NDQ0NDU1MzMzMzMzMzIyMjIyMjIyMjEvLy8vLy8uLi4uLi4sLCwsLCwtLSwuLS0sLS0tLS0tLS0tLS0tLS0tLi4tLS4uLi4uLi4uLi4wMDIzNDc3OTo8Pj9BQ0dKTVFTVVVWWFxcXl1dXl9hY2JhYGBfYF5dWldWVFJPT0tJR0ZDQT8+PDs5ODUyMS4sKysrKysrLSwtMUdfV1FaZF8wKDA6TVhbY2VkXlhZWlJKTmx6dHBvb3JiUUE8NTQ0MjEvMTQ1NTQ2Nzg7PD48Ojs5NjQzMzIxNTg/QkVGRkVCPjkzMTEyMjIyNTU1NTU0NTAvPVppbm55fXt1ZVJUOCcvbHRpaGxvd358Z1dXWltYUkEzNDY4PDMvMTY2Njo+P0JKTU9UV1dbX19iZmdmZWRlZWhlYVtZUkVAUWZqamtwaWBbW1xcXGV5enBwcXNxcGJKSEtOUFVcZW9saWtwe4aIiYqJiYV/eXBkW0k2LCsrKyorKywrKysrKiwvNT43MzU9QlFpeoiOj42JiIiGg310alxdYWZmZVdKRkdMTEpLR0EuKj5CRlZYWFlcYF9dXmVtcnNzdHZ5eXh4d3Z4en2Cg4aIjYyMi4uJiYiJjI2TlZaWkpGSk5OTkI2NjY2Ni5KWlZSTlJGMhnt3eXp6enx8f4GLk5OQjoqKioqMkJGFgoKCgoB+foCCiH9+e3l3cnFwbmxraWlpaWlpaGhqa2xxe4WLjImJiYaFhoeLjJGTk5KQkI+Ni4qIhoSDho6UlZWUk5KRkI+Pj42Qk5GOi09OTk1LSkhGRURDQkA/Pj07Ozk3NzY3NzU1NTU1NTQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDMzMzMzNDU0NDMzMzMzMzMyMjIyMjIxMTExMC8vLy4uLi4tLS0tLCwsLCwsLCwsLC0tLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS4uLi4uLS4tMDAxNDQ1Nzg5Ojs9P0FGR0tMT1BRUVNWV1hYWFhaW11dXF1cXFxaWFVSUlBPTEpKR0VDQUE/Ozk3NjQzMjAsLCwsKiosLCwsLC03VVtTVV1lTyYsNEBNU1VZWFRSVllYVVJdbG1rZmhpYlhLOC0uLSsqKCgnJycnJyotMTQ4PEFDRERFR0dDQEFFRkdHR0ZFQTs0MDAwMDE1NTc2NjY1NTYzMy4wSWJnc3t8f3hYICQra3ZsbnFvcnlzY1dcXFteXFVBNTU2NTMwLS80RElGRlhkVFFWWlpZXl5iZGVkYGBgZGNkY1xXVE0/OkNVYmdna2dfWllbXV1ufndwcHJxcXNYRkVLTlFXXWVqbG1yeICHjY+Pj46NiYh/c2teTDQtLCwsLSwsLSsrKysrLTE2Ojs7QkxacoGOkI6MioeHhoF8c2hgXWJmY2JiWUdPTUc+OT0/OSMvMy5HWFpcX2NkY2ZrcnZ3eXl5eXp8fn18fYCDhYaGioyPj46MjY6QkI+PkZGSkpGRkZCPjo+PjY2MjI+QkZGQjIuKi4qEgH9/gICAgIOEjJKQjoyKiYmJjI+OhIKCgYGBfn5/goh/fnp4dnJwcG5sa2lpaGZoaWlpaWttc32Hi4yJiYiGhYaJi4+SlJKRkI+OjYuKiIeFh4iSlpWTkpKRkY+Pjo6NkJGPjotQT05OTUtKSEdFREJAPj49PDs5ODc2Nzc1NTU1NTU0NDQ0NDQ0NDQ0NDQ0NDQ0NDQzMzMzMzQ1NDQzMzMzMzMzMjIyMjIyMTExMTAvLy8uLi4uLS0tLSwsLCwsLCwsLCwsLCwsLCwsLC0tLS0tLS0tLS0tLS0tLS0uLi4uLi0uLi8vMDMzNDU3ODk6Oz1AREVJSkxOTU9PUFFSUlJVV1laWVhZWFhXVlRRT05NTEpJSEZEQkA+Ozk3NzUzMS8uLCwsLCsrLCwsLCwsL0NfV1NYY2g+Ki0zQExQTExMTU5SVllWVGdra2hjYmJeW0orKCcmJSMjISEiIiMkJikwOUVOUVJQT09OTUpJSUhHR0ZDQTw3MTAwMDAxNTY3NjY2NDQ1NTU0MTA1SV5vd3l5ZTAqaXptbm1ucnh3XFhaW1xdYV9fRzY1NTMxLS4wNEZKSUxlbFNTU1JTV11dYWNiX1xcXF1fXlpZUU5DOjc9T2BnYGlqYFxcXFtheH51cnBzcXFsTEJFSU1RV15kam51eX+Gi4+SkpOTjo2MiIB2a1tEMC0uLS0tLSwsKysrKywvNDs7PUBOYnaIkJKQjIqIiIeCe3BlX0RGY2llYV5TY21nX1ZMPUA7OTxAS1lfYWNlZmhucnZ5enx8fHx9fn9/fX6AgoaGhomOk5OVlpaXl5eXl5eXlZWVk5GPjIuMjIyNjo6MjImHhYSDhIWEg4SEhIKChISDh46PjYuKiomJiYyQjIKBgICAgH5+f4KHfnx6d3VycHBubGtpaWhmZmZoaGlqb3Z/iIyNiYmHhYaFioyRk5SSkJCPjoyLioqIh4iNlJaUk5GRkZGPj46OjZCSkI6LVFNSUE5OTUtJR0ZEQ0I+PT07OTo4Njc3NDY2NjU1NDQ0NDQ0NDQ0NDQ0NDQ0NDQzMzMzMzQ1NDQyMjIyMzMxMTMzMjIyMjExMDAwLy8vLi4tLSwsLCwsLCwsLCwsKysrKysrKywsLS0tLS0tLS0tLS0tLS0tLS0tLS0uLi4uLi4uLjAxMzM1NTc3ODo9QERERkhJS01NTU1OTk9PUFNUU1RUVFNTUlJPTU1LSUlHR0ZEQD88PDo3NTQyMS4tLCwsLS0sLCwsLCwsLS41VGFWWF9mYTArLzZBTEpGR0hHSE1WVVNYaW9wY1pcZGFXQyclJSMhISIiIyMkJykvOktVVFJQT09PTkpKSUlHRERDQT03MzAwMDAxNDQ2Nzc3Ozg5NTY1MzU2MC4wNz9FQjUsanhubnJxcHp6XVhaXF9hYWBhT0A3NDQzMC8tLTI2PkFCSk5RV1hVVFVaXV9fWlpcW11dWVRRTUdBPDY2PU9cXlZgbGJdXV1cbIN+dXFxcnNwX0RCRkhMT1ZfY2dyfIGFiY6RkpOTlJOQjoyGgXRnVj0vLy4uLi4uLisrLCstLjA3PEBFUmqAjZCQjoyLioqJg3xwZGNQPV5nYmVlaGhoaGxvbGJPREtRUVlhZmdrbnJzeHt/gH9/fn9+fn9/gH58fX6DhIeQlJianqCgoKGio6GjoqCdnZmXlI+MjIyMjI2Lh4aCgoODg4ODgoOFhYeIiIaFhYmNjIuLiomIiIiMjomCf35+fn5+fn2Ahn57eXZ0cW9ubGxraWhnZmVlZ2dpanB3gIiMjIiJh4WEh4uOk5aUkpCQj42LiYqKioqLkZaWlJKTkZCQj4+OjYuQk5COi1VUU1NQT09NS0lGRkNCQD49Ozo4OTc3NzY1NjY1NTQ0NDQ0NDQ0NDQzMzQ0NDQzMjMzMzMzMzMyMjIyMjExMTExMTIyMjIxMTAwLy8vLy8uLS0sLCwsLCwsLCsrKysrKyoqKiorKysrLCwrKywsLS0tLS0tLS0tLS0tLi4uLi4uLy8wMTExNTU3Nzo8PD5BQ0RGRkhKSkxNTE5OTk5QUVBRUFBPTkxMSkpIRkZFRENCQD88Ojo4NjQyMC8uLS0sKy0tLS0sLCwsLCwuLj9hYFdYX2dPKCouNkJNSkdJRURIS01UV15tcWZfYGRlXlQ5ISQiISAiIiIkJywxP1BbWVhZVlJVUU5KR0ZGREFAPzw5NDAwMDAxMjQ0NjY4PD48OTU1Nzc1NDQxMC8tLisxZXZta29xcHd7Y1lbXl5kZmZQPjg7ODQ0MjIxMDEzNDc6QktQWFtZWllZXV1dXVpaW1xcWVRQTUk9ODY1Nj1LU1RRWWhlW11dYXeDfXZ0dXRzcVI/QkZHS09WX2hvdYGIjpCRlJaXlZWTko6MjId9c2JNNS0tLS4uLi4sLCwrKy0sMjdLXGR0iJKRjpCNjIuLiIJ5bGNiY1peZWNjZWZpaWdnam9vcHBva2RnbXJzdXV5eoCCgoSEgoCBgIB+fHt6eHl7fH2Fj5yjpqqrq6urrK2usK2qqqmjn5qWkIuLi4uJh4SEgYCAgICAgH+BgoOHiomGhIWJi4yLi4mJiYmJi42Ig4B+fnx+fHx9gIN9e3l2dHFvbWxsa2loZmZlZmdnaWpxeoSMjYuKioWEhIeMkZWVkpGQkI6MiomJiomLkZSVk5OUkZCQkI+Pjo2LkJKPjYpYV1VTUlJRT01LSElFQ0A+PTs7OTk3Nzc2NTU1NDQ0NDMzMzMzMzMzMzMyMjMzMzM0NDIyMjIxMTExMTEwMDExMDEyMDExMDAxMS8vLi4uLS0tLCwrKysrKysqKioqKiopKSoqKysqKisrKisrKywsLCwtLSwsLS0tLS4uLS4vLy8vMDEzMzMzNTY3OTk7PT9BQ0VFRkhJSUtLTE1OTk1NTUtLSkhHRkREQkNDQkBBQD48Ozk2NzQxMC8uLS0tLCstLS0tLCwtLCsrLS00UGVZV1hgZz0jLC82Q0tKRkRDQkVGSFFXZXJqaWhiXVhcUzIoJCEhICEiJSkvPVNeXmBgXFtbVFFLRkJBQT8+Nzc4ODIxMDAxMjMzNDc4O0BBPTg4NzU1NDQzMjAtLC02bHdsam9ubnd6aFxcW11gYVc6KC43Ozk1MjAwMzY0MzU6P0dQVVhXVFZZWV5eXVxaW11eXlpUUlFHOzc1MjQ6Rk1RU1ZkZl1eW2aAg3p3dnRzdHZrSz1CRUpRVVxreX6Ij5CSlZaYmZeVkpGPjYyLg3ltXUMyLiwvLzAwLi4uKystLi40Q2F3gY6Uko6NjI2MjIWAdWdgX2FhYmFjZGRnZ2VlaG5ycnZ5foGBfXx8fn5/gYGGhoaIh4OAgX58e3h3dHJzdHR0fpCmrK+xtLS0tre6u7u6tLOyrqmlnZWPjY6LiIaCgYB+enp5e3t7fH1/gYiKiIWFh4mKi4qKiYqKiYqMiIOAgIB+fn19foGCfnp4dXJxbm1ramlpaGZmZmZnZ2lqc3yGjY2MjImGhISGjJOVlZKQkI+MiomIiImJjZGWlZKSkpGRkJCPj4yNi46Rj4yKWVhXV1VUU1BOTUlIRUNBPz48PDo4Nzc3NjU1NTQ0NDQzMzMzMjIyMjIyMTEyMjIyMzMyMjIyMTExMTExMDAxMTAxMjAwMDAwMDAvLy4uLi0tLSwsKysqKioqKioqKioqKSkqKioqKSkrKysqKyssLCwsLS0sLC0tLi4uLi0uLy8wMDExMjIyMjM2Njg6Ojw9Pz9BQ0RFR0dJSUlKSkpMTElHRkZEQ0RBQEFAQD49Pjw8OTg2NDUyMC8vLi4tLSwsLS0tLSwsLSwrLCwtLztaYVpVWWVkMyYsLzlDS0hFRUNBQUFIUFprdXdwXlBVYGJKKCAhISEhIyUrNk5gYmVkYl9ZT0hBODUwMDI3NzU2OTg0MjExMTIzMzU2Nzo+PTo4ODc1NTQ0NTMzLC1CbXVtam1xcXZ5Z2FcYF5hWDopKS0wNzo5NTIwMjg3NTU6P0hPUlhbV09PVlphYV5cWlteXV5aWFZXTkI8NjU1PEZPVVNSXmdeWlxtgoF4dnVzdHNxdnRTQUdMTVBfc32EjpKUlJaXmZiTkY6LjI+MjIh+c2ZXPjE0OTs7PDg2Mi0qKzAyMkNfeYuTk5KPjoyLioqFfG9iX2JhYWJiZGVlZWdnamtwcnR4fX+BgISDg4WFhIWFiIiIh4eDgYB6eHd0dHBxb25ucXWPq7Gyt7m5ubu8vr29vLu6ubewrKGWlJWQiIWEg4J+fHl3dnV2dnZ3eXt+hYiEgYGEiImKiomKiomKi4eEgoCAgIB9fX6BgXx5dnNybm1sa2tqaWhmZmhoaGhpbXR9h4yNi4qIg4OFiI+UlJKRkI6Ni4qIiIiLjY+SlJKRkJCQkI+Pjo6LjIuOkY+Ni1tbWlhYWFRRT05MSUdEQkA/PTw7ODg4NzU1NTUzMjMzMzMzMzIyMjIyMjExMjIwMDAxMTExMTExMTEvLzAwMDAxMTEwLy8wLy0vLi4tLS4tLS0rKysqKSkpKSoqKSgoKCgoKSgpKisrKysrKyssLCwsLCwsLS0tLS4uLS0uLjAwMDAwMDAwMTI0NDU3ODg6PDw9PkFCRERFRUZHR0dHRkVHRENDQ0FBQT89PT06PD07OTg2NDMzMi8vLy4uLS0tLS0tLCwtLS0tLS0tLS0zSGdgV1VcZ18pJiYvNUBIR0ZEQUBAQklUX25yb2BQVF1eVzsfISEiIiQnLkRdY2NkY1xORDcsKCMhIycoKy4xNTo8OTQzMzQ3Njc5Oz09QDo4OTc1NjU0NDUzMDdifXhtZ2txc3V3YFpcX2FiUy0mKC0vMzY0Nzc0MTg7ODk5PkZPVFVXV1RQUFJXXl9fX1xcXlxbWlpcXFhLPzw4OUROVFVWVltkYVdfdoB9eXZ0cHJyamp3eFhFSU1WY3eCipKUlZWWl5mUkI2JhIGHjY2Lh3xxY1NFR0xQUFBNSENAODEyMTRFZHyNlJOPjIuLi4iGgXhrYF9jYmNhYWJjZmdoam9zc3V7f4GDhYaHiImJiIiGhoiGhYSDgYB+eXZzcG9oZmltcG1umK2ys7i8vL29vr6+vby7u7u7trCnnp6Wi4CBgIGAe3l4dnNyb3JwcHJydnd/hIB7foWLi4qJioqKi4qGhIOBgICAfn6Ag4F7eHdzcGxsbGxqaWlpaGZpaWhoaWx1gImMi4yKhoSEhoqSlZKQj46Ni4uJh4iKjJCSkpORkJCPjo+Ojo2Mi4uLj5COi4lbW1tbWVlWVFJOTUpHRUJAQD49PDk5ODc1NTU1MzMzMzMzMzMyMjIyMjIxMTIyMDAwMTExMTExMTExMDAwMDAwMDAwMDEwMC8vLi4tLCwsKysrKysrKSkpKSkqKikoKCgoKCkoJykqKioqKisrKysrLCwsLC0tLS0uLi0tLi4wMDExMDAwMDEyNDQ0Njg4OTo9Pj0+P0FCQkNERUVERERDQ0JAPj49PT08PDs7Ozo6Ojc3NTIyMjIxLy8vLi0tLS0uLi0tLi0uLi4tLCwtLTNTaFpXWV5pUSMlKiwzPkZIRENCQDxBSVJmcHBrYFteXV1UKx8hISIlKjZRZGJjZVpGMCwpJSQiIyMkJCYoKi85Ozg0NDQ0Nzs9PT9CQkVAOzo4Njc2Njc1MEt1fXRraW1xdnp1YVtfWl9nSygoKy4tMTAzODo3PEZFPjs+PkdNVlhUU1NTUFFTUVVaXl5dWlpZWVlYXmRgT0NCPj9GUlVVVVZYYWBbaYCAfHd1c3VzamBia3V4WEZLWG99ho+RkpGRkpKSjYeAfnp6gYmPjIqDeHNpZF9iZmZmYl1WUUpBODQ2TWyEkZKSj4uKiYmHgXxyZGJgYmNiYmBhYmRnbHB0d3t8f4GFh4iJioqKioiIhoWCgX5/fX19fHhzbmpmZl9obXBrb5+vtLi7vr6+vb6+vb69vLu7u7q1rKadiXp6fX9/fnp4dnRyb21raGhqamxqb3mBfXZ7gouKiYqKiouKhoWEg4GBgX5+gISCend1cG5ramlpamlpaWhmaGhoaGpwd4GJjIqMioaEhIiMlJeTkY+NjIqJiIiJjY+Sk5KSkpKTl5iTjo6MjIuLi4+QjouJW1tcXFtZV1ZTUU5MSkhGREA+PTw6OTc2NTU0MjIyMzMyMjIyMTEwMjIyMjIyMjExMTEwMDAwMDAxMTAwMDAwMC8vMC8uLi4uLS0tLCwsKyorKyoqKSkoKCkpKSkoKCkpKCgoKSgpKSkqKioqKisrKyssLCwtLS0tLS0tLS0tLzEuLjAwMTEyMjMzMzM2Njc3OTk8Pj5AQEFBQUFBQUA/Pz0+Pjw7Ozo6Ojo5OTk4NjY1NTUyMjExMTAwMDAtLS0tLi4uLi4tLS0tLS0tLS4vOFdjXFhZY2RAISUpKzE7RklCQEA+PUBFVWpzcm1raWhpZUQhIiIjJy4/XmllZGJMMyorKSUjISMiIiMmKCsvNzk2NjY2Nzk9QEJDRkhHQj87ODc2NjU0M0l+eXJtaWxxc3l1ZFteXWFhRCQpKystLjA0Nzo9OT5KRjw5PUVMUFRYVVJSUk5NT05QU1ZbWlhaWltWVFphXU5IRkNDRExSVVVWVl9gYXJ/fHh3dnR2dGRdYGdsc3NWT15zg46RkY+OjI2MiIV9cW90dnmBjI6LhoB9enh5e318endya2ZcVktGS1txh5SSj4yIiYeGhXx4a2FhZGJhY2NlaGlrbnF1eX19f4KFh4qKiomKiIeIhoWDfnp2dnd2dnVzbWhiXF9kYWNnbYKhq7O4u729vb69tr6/vr29vb28tKqghXN0eXl5ent6eHVycGtnZmZpamhkZW1ud3t3d3yCh4uIiIqLiYaHhIOEgoGAgICEgnt3dHJwbGxra2pqaWlnaGhoaWlrcXyEio2KjYqFhIOIj5WWlJKPjoyKiYiLi4+Rk5STkpOTmKGhm5KOi4uLjIyPkY+Mil5eXFxbWVdWVFJPTEpIRUVDQT08Ojk3NjY1NDIyMjMzMTExMTExMTExMTExMTEwMC8vMDAwMDAwMTEwLy8vLy8uLy4uLS0uLiwsLCwtLSoqKysqKikpKCgoKCgoJycoKCcnJygpKSkpKSkpKioqKioqKysrKiosLS0tLS0uLi0tLy8wMDExMjI0NDU1NjY3Nzk6Ozw+Pj5APz8/Pz8+Pj48Ozo5OTk4ODg4Nzc4ODY2NTUzMjIxMTEwMDAwLy0uLi0sLS0tLC0tLS0tLS0uLzA/X2NYVlliYS4jJycrLjdDR0ZCQj47PERYdn1zamdibnRdLyAhJCcxSGhtbWxdNyotKSclIyIhIyUjJCYqLTQ2NjY2Njc5PUBERkhIR0NAPDk4NTQ0MTpzgnVvbnFzdHl5Yl5gXWFnSSUlKi85Ojc4Pj4/QT49RkQ/PUBGTU5MTUxLTlFNTE5PT1FSU1ZXV1tcVlRVV1VOS0tHRUVITlVVVlZcZGp9fHZ1c3V1dXVhXWJiZWtzb19pe4mNkI2LiIaGh4SAeGtobXRyeIWLjIqHhISGio6NjIuHgXt0bGZcXF9te4uSkY2Kh4eFhYR9dGZdXl9iZGNmZ2tscXV3e3+BhIWHioyMi4uKi4qGhICBhYF3bmpqa2xqZFtXVFFSVVNXYIKfoaq2s7W7uLi8vry9vb+9vb29vLmmfWltcXR1dnZ3dnVyb25raWRpcG9wa2ZsdHNqZWtwdXaBiIiLi4eGhoWFhYWDgoKAg4J9d3VycWxsa2tqaWlpZ2hpaWlpa3F7houMi4uKhYGEiZOWlJORj42LioqJjY+RkpOTkpGRk5yjpJyQjIqMi4yNjpCOjIpdXVxcW1lYV1RSUE5MSUdEQj88Ozo5ODc2NDMzMjIxMTExMDAxMTExMDAwMDAwMDAvLy8vLi4uLi8vLi4uLi4uLi4uLi0tLS0sLCwsLS0rKyoqKSgoKCkoJicoKCYmJycmJicoKCgoKCkpKSkoKSoqKiorKysrLCwsLC0tLC4tLTAwMDAxMTIyMjIyMjM0NTY3Nzg7PD09PT09PDw8PDw7Ojo6Ojk5ODg3NzY4ODg2NTU1MzMyMTAwMDAwMDAvLy8uLi0tLCwuLS0tLi4uLS0tMUZkXlVWXWhWJSYnJigrMz9JR0E/Pzw6Q15xampiYXBzcU0jHyMnM05tcHFuUC0tLCkkIiIhISIjIiIkKSwwNDU2Njc4Oj1AREhKSEdBPj04NzUxMTBegHh0cXR1enx+Z1lfXWJnVSYsKS00PUdFSExPSUdERUlFRkVERUtMSUZDRUpLSUlLTlJUUVFSVVlZXFxVUlRRT1BPS0hGRUxTVldVWWRze3dyc3Z2dndyX1tfX2Fna3F0dIKMjI2MiISDgoOFgXllY2hvbG17hYuNi4uLjpOWlZaTj42Ig3x3b2xxeISOk4+LiYaEhISBe29gWl9gXmJnam5xc3Z8fYCGiImJioyOi4uJiIeHg353en18e3NmWlpYVFBNV1BHUV5qbImjqK21ubuyjJicrL6+v76+vb28vbeiclljaWxwcHF0dHR0cnFwbmtnam9ub3BwbXF2bVxbYGVteoiKi4iFhYWFhYWFgoKCgoSDfnh1cm9sa2psaGhpaWloaGhoam91fYeMi4qLiISCh5CUlZKQkI+OjYuLjY6Qk5SUkpGQkJKZo6KXjoyLiouNjY+PjYyKXl5dXVtZWVdWU1FPTEpIREI/PDs6OTg3NjQzMzIyMjIxMTAwLy8vLy4uLzAwMC8vLi4uLi8vLy8vLy0tLS0tLS8uLS0sLCwsLCwsLCwsKioqKigoKCgoJyYnKCgnJicnJiYmJygoKCgoKCgpKiopKSoqKysrKywsLCwsLSwsLi0uLjAwMTEyMjIyMjIzNDU2Nzc5Ojs8PD09PTw8Ozs5Nzc3Nzc3Nzc3NjY1NDQ0NjUzMzMzMjExMTAwMDAwMC8vLy8uLi8vLi4tLS4uLi0tLC4zUGdZUlhiZUYjJSQjJCguO0VJRkA/Pj5IY3BuY2VraGtmOCEkKDFQb3Bva0cuLCkmIyIgISEiIyIhIygrLTE0Njc5Ojw+P0FFSUpJQT0+Pjo1MC9beXhzcXR4fHt+cFZcXmBoXiwpLCwwOkNERU9RU1hTTVFPQ0lOTUdGR0VEQ0NESUlIR01OVFVUVVZYWl5fWVRTUU9PUU9MSERIUVZXWFtmdXp0cnNzdHV3cl9bXGBgYWdvfIGLjYyMioeEgYGDhIB3ZGJkbGpicX+JjI6MkJKWmZqZl5SPjouHg399f4WKj5GNioiFhISDgXttXlteXl5laW5yd3p8f4OHioyMjIyMjIqJiIWCgX97eXRxdXl8dnZsZFtUXmFGRGySmpmnsre4uLm+pneZjJG7vr6/vr6+vbKNXVJXXmNna2xvcXRzc3JxcXJvbG9yb21ra2xvb29hT1JWYHSGiIuIhYWEhYWFhIKCgoOEg4B9eHRwbWxraWhoaGlpaWhoaGtwd4CJjIuMi4iEg4uSlpOSkJCQjoyLjIyPk5SVkpGRkJCSmaCfl42Mi4uLjY2Pj42Mil5eXV1bWllXVFNRT05KSEVDQDw7Ojk3NjY0NDMxMDExMDAwMC8vLi4uLi4wLy8vLy4uLi4uLi4uLi4tLS0tLCwtLSsrLC0sLCsrKyoqKikpKSkoJycpJycoJycnJiYmJiYmJycnJycnKCgoKCgpKSkoKioqLCwrKywsLCwtLS0uMTExMTIyMTEzMzMzMzM1NTU2Nzk4Ojo6Ojo4Ojo6ODg4Nzc3NjY2NjY2NTQ0NDQzMzMzMjIyMjIxMTExMDAwLy8vLy4vLy4tLi4tLS4tLS0tLzZbYlJRV2FiOSIjIyIiJyw2QkhHQ0JCP1BnYlhaXWdrblooIiUtRmZtamZAKywnJiMhHyAhJCUjIyIkKCstLzMzNjo8PT0+QUZJS0M/P0E8MjVgd3Jsc3R4enx8dVtaXV1kZzorKywtLjY9QUdPVFhmYldJQ0RNTElHRUJAQUJCQ0dJR0hKTlNWV1dZWlpdYV1ZVVNSUlNOTUhERU1VWFpbZnN2cXN3eHZ1dnFgW15dYGRnc3+IkZCPjYmGhIODhIN/dGJjY2lpXmp7h4yOjpCSlZmampqXlpKRjYyJh4aKjJCPi4qIh4eFhX93aFpUWF5iaGtvc3uBhIaJio6OjIuMi4qHh4OCfn16enp1Z1xhcm1uZ2VeX3FzSVqZrLG0ubu7vb68u7WsuLCzvL6+vr++uqd1SEVPUlhcYGRrb3BwcHJycXN2dnJyeHRsZ2dpbnJyaVJBTVdvg4eLiIWDhISEhIODgoKEg4aCfnp3cm5sbGloaGhoaGhoaGltcXqEi4uKjIuIhIWOlJWTkpGRjo2Mi4yOkJWXlZGRj5CQk5ugnJaOioqKjIyNjY+NjIpeXV1dW1pZV1VUUU5MSUdFREI9PDo5NzY2NDMzMjExMTAwLi4vLy4uLi4uMC8vLi4sLC4uLi4uLi4uLS0tLSwsLCwrKyssKysqKiopKSkpKSgoJyYnKCcnKCcmJiYmJiYmJicnJycnJycnJygoKCgoKSoqKisrKyssLCwsLS0uLzExMTEyMjExMzMzMzMzNTU1Njc3ODg5OTk5OTg4ODc3NzY2NjY2NjY2NjQ0NDQ0MzMzMzIyMjIyMTExMTAwMC8vLy8vMDAvLi4uLS0uLSwsKy0tPWJcVFVaX1ctHyEiISMiKDJCSkpIQ0JBWF9PTE9XX2hrQx4jKTlZaGliQSwqJiQiIB8fISQkIyEhIyQnKy0wMzY5PD09PkFESElHQ0E/OExwdm1tbHB2dnl6c19ZXVxeZUkpLSwxMTA1OUBIT1dha2hXSkdKTk5KRUFAPj4/P0JERkhJTE1PU1ZYWVhaW11eXFhYV1dUT05KRURHUVdZWmVydnN2enl4dXdyX1hZXF9ka3iDjpCRj4yJhoODgoSCfnFiYWNmZ11oe4eOjo2QkpOYmZqamJaVkpCPi4yNjY2Qj4yJiYeHhoR+dmheV1Vhamdob3Z9hImLjY6MjYyLiYaEhIF/fX15dG9ual1TSWVubnB1aFVcakxvprS4u72/v767tLO3uru9vr6/v727sJdkRktTUU9RVVpeYmdqbXBycXJydXl5cnN3cXBwb3F3dnNoS0VZcISIi4OBgYKEg4SDg4ODhIWHgoB8eXVwbmxraGhoaGhoaGhpbXJ7hYuKiYyKh4SJkpWVkpGRkY+NjIyMjpGWlpORkY+PkpidnJmPjIuLjIyOjI6OjIyKXl5eXltaWlhWU1FPTUpKR0VCQD47OTY2NjQzMzExMTEvLy4tLS0tLS4uLi4tLS4uLCwtLS4uLS0tLCwsLSwsLCsrKysrKysrKioqKSoqKSkpKSgnJyYmJiYmJSUlJSUlJSUkJScmJycoKCcmJycpKSgoKioqKioqKywsLC4uLi8wMDExMjExMTIyMzMzNDQ0NjY1NTc3Nzc4Nzc3Nzc3NzY2NjY2Njc3Nzc2NjY2NDMzMzMzMzMyMjIyMjIxMTEwMDAwMC8vLi4tLS0tLCwsLCwsKy1HZFdSVVtjViwhIh8hICInMDxNUk9LR0thXVFKS01ZbmMuHiUxUmRgVj8sJiIiIiIhISMlJSMjIiIkKCksLjI0NDk6PD4/QUJBQj47SF90cWxqaXB1dHZ2cWBZXF1eZl8pKy8wMzI1ODg4P0hYaWxfVU1NUFNVU01FPT08PDw/Q0ZISkxNTVFTVllZWVdYXFtaWVhYVFBOSUVDRE1TV1tlbm5wcnV2c3V2bmdcWF1faHOAjZKRj4uLiYeHhoWHhX9vYWFhYmVhbHuKjo2PkJOVlpmZmpiXlJKPkJCRj46Pj4+Oi4qIiIeDfnZsYl5fZ29zc3l9goeLjI2NjoyKiImEgX99e3d1dHNrcW9fWXBzbWtsc2paWFtXdaq4ury+vry4saq1ury+vr2+v7u0m3JRS1RUUU1OTk5TVlxgZGlsb29wcHN5g4F2d3dzc21pcHJwb2FCS3CEiYh/f4CAgYKCg4SEhISHiIWBfnt4dXNvbGpoaGhnZ2doam1zfoiLjImKiIaHjZWVk5CQkJCOjIyLjI+UlZORj46NkJadnZiUj4yJioyOi4ePj42MiltbW1tbWllXVlNRT01KSEVEQj89Ozk3NzY0MzMxMTExLy8uLS0tLS0tLS0tLS0tLSwsLS0tLS0tLCwsLCwsKysrKysqKiopKSkpKSkpKSkpKSknJiYmJiYmJiUlJSUlJSUlJCUnJicnKCgnJicnKSkoKCoqKioqKissLCwuLi4vMDAxMTIxMTEyMjMzMzQ0NDU1NTU3Nzc3ODc2NjY2Njc3Nzc2NjY3Nzc3NjU2NjQzMzMzMzMzMjIyMjIyMTEwMDAwMDAvLy4uLS0tLSwsLCwpKioqMFFmVVBWXGJbLR0fISAgICYrOUhRVE1JUWVcTk5QU2V0SyEkL05hWVVLOyciIiIiISEjJSUkIyMiJCcpKiwvMTQ2Njg7Ozs8OzdJY3JzbWZnam9wdXt3bWFaWVxeYGRALSwvMDI1ODk3MzZBUlxVS0hQUlVVV1pVTEA9Ozo6PT9ER0xMTU1PUlZZWVlYWVpaWFVVVVNPTElEQUJIT1ZYYmpqamxwc3FzcmtlX1laYG97h5CUko+Li4mHiYmJiYaBb2FhYWVraXGFj5COj5CSkpOWlpeVlJCMi4uNj5GRkY+OjYyKiIiHg4B5cm5qaG55foGFhYmMjo6OjYuKiIeEgH16d3V2cnJyb25wcXJub3Fta2hmWVNfY3ypt7q9vbu6tq+lsLi7vb6/u7apflVNUlJRT0xNTk9PT1FWW19jZ2twcXFydHx8d3FzeHFqYG12eHduXGF5hImEfX1/f4CAgYKEhISFiIaFg4B9e3d0cW1saGdnZ2doaGltdX6Ii4uIiYiHiZGVk5GQkJCQjoyMi42RlJWRko+Nj5KbnpqTi4uMioqLjIqGjo6NjIpaWlpaWllZV1RTUU9NSkhFREI/PTs6OTc2NDMyMjAwMC8vLi0tLS0tLS0tLS0tLCwsLCwsLCwsLCwsLCwrKiooKysrKykpKCgoKCgnJycoKCgoJyYmJiUlJCQkJCQkJCQkJCMkJiYmJiYmJiYnJygoKSkpKSoqKyssLCwsLi4vMDAwMTEyMjIyMjMzMzIzNDQ0NDY2NjY2Njc3NjY2NjY3Nzc3NjY2NjY3NzY2NTU0MzMzMzMzMzMzMjIxMTEwLy8vLy8vLy8uLS0tLS0sLCsrLCwrKCk1X2JTUFVcZmEyHiAfHx8iKCo3Q1JUT0pbaVtQS1FacGs1ICxKY11UTUcqIiIiIiEiJCUlJiUjJCQnLCsqKi4vLzEyNjk4NDFPd3BtZ2RmaW1wcHdwbWNcWVpdXmBRMS8vMjI1ODw7Ojg8PUtFPTtFUVdWWFpcWlFGPjs7Ozs9QkZMTk5NUFBVWlpZWVtcWVVRT09MS0pIRENBQ0tSV2BnZ2hqbW9tcG1kY2JcWmRzgY6SkpKOi4uJiIuMjIqJg3NiYGJocnV9jJGPj46PkI+RkpOUk5GMiISEh42RkpGQkZGNi4qJiIWBe3l4c3J4f4SGiYuOj46PjYuHg4GAfHx6eXdzcXBvbXBwa2prbnBxbWllamNeY192pbW6vL68urm1o6ytuLu8ubGTZUpMU1JRUVFQUE9PT01NUVRaXmFnaXBxcnRzc3Vzdnt8dHF9g4iJf3B5gIOGfXl8fH1+f3+BgoODhYaIhYSCgH17d3JwbmppaGZnZ2drb3iBiIqJiIiIiIyTk5CQkI+Pj46NjY2Qk5aWkZCPjpCXnZyXj4iIi4qLjImEgI6Ojo2LXFxcXFpZWFZVVFFPTktJRkNAPz07Ojk3NjQzMjIwMDAvLy0tLS0tLSwsLCwsLCwsLCwsLCwsLCwsLCsrKioqKCkpKiopKCkpKSkpKCgoKCgoKCYmJiYlJSQkJCQkJCQkJCQjJCYmJiYmJiYmJycoKCkpKSkqKioqKyssLC0uLzAwMDExMjIyMjIzMzMzMzU2NTU2NjY2NjY2NjY2NjY2Njc3NzY2NjY2Nzc2NjU1NDMzMzMzMzMzMzIyMTExMC8vLy8vLy8uLi8tLS0tLCwrKywsKSknKTpkYFVTVl9pZDQaISIjIyQlKzM+TVNQU2duWk5OU2F0WCMoPmFmWU1CKiIiIiIhIiQlJiclJiUlKDAvKikpKiorKyssLixOcnFraGdrb29vcHZpWGVhXFpaWVVYNC4uMzY2Njc5Ozc4QD9COzE5RU9SUFJVU1FKRD05OTk7PUJGTE5QUlRUVVdZWltcXFlSTEtJSUdIRURDQUFGS1RdZGRlaGtsa21qX2BoZGBod4mQkpKRjoqKiYqMjIuMioZ1Yl9ka3Z7h5CRkI2Njo6OkZGQjo2LiIR+foOLkZKRkI6OjYuKi4qIhYKAf359gISHiYuMjo6OjY2HgX54dXFtbXJzcHBxb25tbGtsb25ubmNZYGVkYFpVYJ60ubu6uLi4tK6wqbK6uKx/UUxNUlJSUE9RUFBOTU1OTE5RVVleY2hsbnJxcHJ2eH+Gh4V6ipGSj4l/eX+Fg3p4e3t7fH19f4CCg4WGh4aFhIB9e3p3c29tamhnZ2doa3B6g4iKiIiIh4mPlJOQkJCPj4+OjY2OkpWVkpCOj46Tm5yakY2Li4uLi4yGf32MjY2MillZWVlZWFdVU1JQTkxLSUZGRD89PTo4NzY0MzMyMDAwLy4tLS0sLCwsLCwsLS0sLC0tKyssLCsrKioqKioqKCgqKikpKSkpKSkpKCgoKCgoJyYkJiUlJSUlJSUlJCQkJCQkIiMlJSUlJiYnJyYmKCgpKSkpKioqKywsLC0tLy8wMDAwMDEyMzMyMzQ0NDQ1NjY2NjY2NjU1NTc2NjY2NjY3NjY2NjY3NzY2NjY1NTU0MzMzMzMzMzMyMjIyMTEwMC8vLi4vLi4uLS0tLS0tKyssKysoJycnQmtiVFJXX2hjOB0hIyQkJCgpKjZGUVRYbGlZUFRYaHNBKTNGT0o8LyUhISAgISEiJSYnJiQoJigrLywoJyYoJiQkISpMcm5taGhsbW5tcHJbS2hmYFxaWVFZTCouMTY5OTc4ODo3NTc4NjMyOERLTUtLTU1IRUI+Ojg4Oj5BRUxOUVRXWFZWWFpcXVxYUE1KTEpGRUdERUVEQUZNV2BhYmVoaWlrZlpdZ2hqcH2OkJGQj4mJiYmMjIqIiouFd2RfZnB6f42Rk5KNjYyMi42OjouJhYJ/f32EipKUko+NjIyMjY2Mi4qIhIGDgoSIioyNjo+Oj42KhHt2b2dhXF9jaGtscHFyb29ubGxubWxVQE1YX1tIQFmMsLa5tq+1t6uvsa22tqqATk9RT1FRU1JSU1FQTk5MT09OTlNVWFxiZmltb3F0fIWOlpWSh5KYmpCIhH9/g4F2dnl6enp6e36AgYKDhoeFhIOCgH9+enVxb2xramloamxzfIWIioaGiYqMj5OSkJCQj4+Pjo2Nj5KVlZKPj4+TmZ6clo6KioqLi4uKhH18jIuNi4lZWVlZWVhXVVNSUE5MS0lGRkRBPzw8ODc2NDMzMjAwMC4tLS0tLCsrKysqKioqKyssLCsrKiopKSkpKSkpKSgoKSkpKSgoKSgoKCcnJycmJiYmJiUlJSUlJSUlJSQkJCQkJCMkJSUlJSYmJycnJygoKSkpKSoqKissLC4uLS8vMDAwMDAxMjIyMzM0NTQ0NTY2NjY2NjY1NTY2NjY2NjY2NjU2NjY2Nzc2NjY2NTU1NDMzMzMzMzMzMjIyMjExMDAvLy4uLi4uLi0tLS0sLCsrLCsrKyglIylIbWFZV1dfZ2dDHyEkJSYlJSQnLztKUFx0ZVdVV19yajIsLCgpJSMgISEgICEhIyQnKS4vLCwoJispKCclJCIiJCVXdG1vbGxub2ttcnJGPmhsZVxYWlBYVzArMTU5Ojw8Oz47NTU0NjMuMzlESUhIRkZFREJBPjo4ODo8P0RHTE9TWFlWVlhaW1xYVlBKS0tIR0ZGRkdHR0ZDSVBYXWBkZ2lqamNYW2NpbneJkJGPjYyLiYmLjI2Lh4iLhXlkX2Z0f4eSkpGOi4uKiYmGiIqKiYSAfXx/ho2UlJCNjIuLi4yMiouJiYiHiIiIiY2Ojo6Pj42Mh4J9dWhYTElPUlRcYGJjZm1wb29ubmplTj1SX15WPjNOcKW0tq+LmLCXprKwsaCYb01PVF1XU1RYV1VSUVFQT09PT09QUVVYW2BocX2Ij5OanaGinpmZl5WOioWBgYF/d3V5enp6ent8fn+AgYWFg4KDgoF+fn14dnRwbmtpaGlsdICHioiFhYaJj5SVkpCQkI+Pj46NjY+TlZSRj46QlZ6fmpGNjYmKjI2MiIJ3fYuOjIqIV1dYWFdXVVRUU1BOTUtIRUVBPz08Ozk4NTMyMjIwLy8tLC0tLSwrKisrKysrKysrKioqKikpKSkpKikpKSkpKSgoKCgnJycoKCgnJycmJiYlJSUlJCQkJCQkJSUkJCQkJCQlJSUlJSUmJicnKCgoKCgoKSkpKisrLCwsLS0vLy8vLzAwMTIyMjQ0NDU1NTY2NjY2NjY2NjY2NTU1NTU1NTU2NTY2NTU2NjY2NjY2NDMzMzMzMzMyMjIxLzExMS8vMDAuLi4uLi4sLCwsKyssLCssKiwsKCUlKkttYlhWV11kaUsjIyQkJCQiISAmMj9Ga3djWFdVZXZQIycnJSMiISAhISEgISMjJS45QDw6LygrKykmJSMiIyE9c3BrbG9ubXBvc2s6K2BraWRcW1VLW0EpLzQ5Ojo9QEA9ODY1NDItMTQ5QEREQT0/QUJBQj88Ojk4Oz1CRUpMUVZWVFRWWFlaVlRPSktMS0hISEhKS0pIRERJTVZeY2VlZmhlV1hkbXSAj5GQjoyKiYmKi46OiYeHioZ9aF9qdoGMkpCOiomHhYODf4KFioyHhIF8goiQlJGNiomJiIuLi4qMiomKio6Ojo2Oj4+Pj46MiYaBem1bTlxhXF1eXlpaWFlgZWptbW1lV0c9R0pLTkI/TV6Vr7KUUoekfZqzt6qFdlxNTlJYUVRZYV1UVVZWVFFQUlJQTk9QUl1ufo2coqOioJufo5+ampiSjImKiIeDfnh2eHh6ent7enx+f4GFhIGBgYCBfn99e3d1dHJvbGxrbnmBiIuIhoWHipGUlJCQkI6OjY2MjI6RlZWRkI6QkpqenZWPi4qKi42NjIZ9cniGjYuJhldXV1dVVVRUUlFQTkxKSEVEQT89PDs5ODY1MjIyMC8vLSwsLS0rKisqKioqKioqKioqKiopKSkpKSkpKSkpKSkoJycnJycnKCgoKCgmJiYmJSUlJSQkJCQkJCQkJCQkJCQkJSUlJSUlJiYnJygoKCgoKCkpKSorKywsLC0tLy8vMTEwMDEyMjI0NDQ1NTU2NjY2NjY2NjY2NTU1NTU1NTU1NjU2NjU1NjY2NjY2NjQzMzMzMzMzMjIyMTAwMTEvLy8vLi4uLi0tLCwsLCsrKysrKyssLCkmIygvTW1gVlVYXmZsWyYiJCUjIiAfHSEpM0hscWJXVlpocDImIyQjISEgISEhICEkIiguMzc4Mi8rKy0qJyUjIiMtaG5ramptcGxsdGEuNV9raWdjYGJKW1ErKzw+Ozo9P0Q+NzU1OTgzMDI1ODxAPTo3Oj4+Pj8+PTo5Nzo8P0RJTU9TU1FRU1VWV1RSTkpLS0tLSUdKTU1MSUZBQ0lPV1xhY2ZmY1laZXB6h46Qjo2LiIiIio2OjImIh4mEfWhfbHmFj5GPi4iGhIF+fHh5foSHh4eFgYOJjpGNi4iHh4iKi4uLi4uLjI2Pj4+PkJCPkI2LiYeFfndvZFttbVtSV1ZZYFxYWFleZGZmY1xVRjUxR1FPUlpdeqKqjl+UiXOfsrWodlZJSUxPT09TVlZST1RVVFVUUlFRUlFOTWF+lqWrsK+qp6GdnJ6enZycnJiTkpCNh4B5d3h4enp7e3t7fH1/goOAgICAgH9+fnx6eXd0cm9tbnF6g4iJiIaGiY2UlZSQkJCOjo2NjI2QkpSUkY2NkpicnpmRi4mIiYuNjYmAdm94iIyKiIRWVlZWVFRUUlFPTkxKSEdFQ0FBPjw6ODc1NDMzMjAvLy0sKysrKyoqKioqKioqKiopKSkpKSkpKSgoKCgoKCgoJycnJycnJycnJycnJiYmJSUlJCQkIyMjIiIkIyQkJCQkJCUlJSUmJycnJycoKCgoKCkpKSoqKyssLS0uLS4wMDAwMjIyMjM0MzM1NTU2NjY2NjY2NjY2NjU1NTU1NTY2NjY2NjY2NjY2NjY2NjY0NDMzMjIxMTExMTEwMDAvMC4vLy4tLi4tLCsrKysrKykpKSosLS0rKSUkJy1Nb2JVVFddZGxfNCEkIyIhHh4gISUqRXBuYFlZYHJVIyUiIiIhICAgICAiJCgtLzI3NjEsLS4vLCklJCIiWHZtZ2dsbG11a08zQ2FoampoZF5MXFs1LjpAP0BAQkI+ODM1OkBCPDQzNzk5NzY1Njc6Ojw+PDw6Ojc4Oz5DSU9RUVFPTk9RVFVTUUxMS0tMTEtLTU5OTkxHREFCRk9UXGFjZWNcW2l2gomLjoyKh4WGhoiKiYaIiIiIhH5qYnB7h4+Pi4iEgoB8d3Fvc3l8gIOGh4SHiY2NjIuIh4iHiIqKioqKi42Nj5CSkpCQj4+MiIiFgoB4c3NzcnFpZ2poaWljV1BRV1taVlRVVU9DQ1RTVlldZ2V0pJ2AmYmFo6+vpnxXSkhJTUxMUlVRT1BQUlVXV1VRUlRPVGaIprK5vLq4sKmlnZ2bm56goKGfnJmZlZCHe3Z7enp6e3t7enl8foGCfX1+fn9/f319fHx5d3JxcHB1fYSKiYWDh4qOlZSSj4+PjY2NjY2OkJKTkI+OkZaam5iTjYmKiIqMjYyGe3Jud4WJioiFVVVUVFNTU1BQTkxLSUdFREJBQD08Ozc1NzQzMzEvLy8tLCsrKysqKioqKioqKioqKSkpKSkpKSkoKCgoKCgoKCcnJycnJycnJycmJiUlJSUlJSQkJCMjIyIiIyMkJCQkJCQlJSUlJicnJycnKCgoKCgpKSoqKysrLC0uLi4uMDAwMDIyMjIzNDQ0NDU2NjY2NjY2NjY2NjY1NTU1NTU2NjY2NjY2NjY2NjY2NjQ0NDQzMzIyMTExMTExMDAvLy8uLy8uLS4uLCwrKysrKysqKSgpKysrKigmKCsuL1BuZFhUV1peZmZDIh8iIB4eHyAgHSFHd21eVlplcTohIyMiISAgICAgIyYtMjExMSwrLC0xMi4qJyQjPHNqamdpa3B0Xzw7WmVnamZnZ2FNVl9GMjlFP0RDRUM8Ozc1Nj5GRUE5NTU1NjQzMzI1OTk7Ozw8Ozo5OTxBRUpQUlRSTUxNT1BRUU1MS0tLTExOTk9PT09NR0RBQEJHS1JZYWVjW15vfIiLioyKh4WFhoSFhIKAhoaGh4N8amNxfoyPjYqGg4F+eXBnZ21zdnt+goWFiYmMi4uLiImHiIeHiYmKjI2NjY2PkJCOjo2Ni4eFgoB+dnJwcHBxc3Rxb2NdYVNFRVBXVE5ISU5QTUtRUVBUU2ZhYJGUfI2lqKmsqp9tTEhITU5NTU5QUFNUVFNSU1RSUVFQVW6Qqre7vb+8urWtqJ6en56eoKSjn52foaCZj3x1e3t6ent7eXl6eX2BgHt7fH1/fn59fX19e3p3dHJyeICHioiDhImMkZWTkI+Pj42MjIyLjJCSk5CPkJSYmpiUjYuJiYmKjI2KhHhubXiGh4iIhVRUUlJTUVBPT05MSUhGRENBPz48Ozo4NjY1MzIxMDAvLSwsKysrKikqKioqKSkpKSgoKCgoKCgoKCgoKCgoKCgnJycnJycmJiUlJSUlJSQkJCQkJSQjIyMjIyMjIyMkJCQkJSUkJSUmJycnJycoKSkpKSkqKisrLCwtLi0uLzAxMDEyMjMzNDU1NTQ1NTU1NTc3NjY2NjY2NTY2NjU1NjY2NjY2NTU1NTU1NTU0NDQ0MzMyMjExMTExMDAvLi4tLS8uLSwtLSwrKysqKioqKSgoKiorLSwpJyssLjAvSGtjVlNUWF1fZlEvHyEfHh4fHh8hI1V6Z11bXmpgJSIjICIhICEhICMoKiwqKyspLCwtNDYxLCglMmxuZmZqaWpwXTxIZ2ZhYWJjY2NXUlZJNjU9Oz1DPz89OTc1MzI6QkRCPDU0MzIzMDMxMjU4OTs9Pj07OjxAREpNUFNWVVJQT05OTUxLS0tMTE1OTlBRUE9PTUhGQ0FAQENIUlphYWBmeIOKi4mJhoSEgoGEgnx5e4SHhYSAe2plc4KOj4yHg4KAfnZsYF9ka29zd3yBgoWHiomJioqJiYeGhoiJiYqLjI2KjIyMjIqMjYyHhIF9fHp3dHFxcXBxcW5cOTQ4OTxESU5NS0tLTUlKRk1SUlBsbGqKmImMoKeoqaiQVUZHSEpKSUxMT0tLUE9NTU9QUFFPWHeZrbi7vb6+vr68tK2kn6CdnZ2fpKCcoKalnpeEdnp8e3p6enp5eHl8foB3d3l9fXx9fX19fXx8eXh0cnqCiYmGhIaIkJaWk5CPj46MjIyMjI6RlJKQkJWYm5mWj4uKiYmKi42Lhn11b256h4iIh4VSUlFRUE9PTk1NS0hGRUNCQT89PDs5NzY2NTMyMTAvLi0sLCwrKyopKioqKikpKSkoKCgoKCgoKCgoKCgoKCgoJycnJycnJiYlJSUlJiYlJSQkJCQjIyMjIyMjIyMjJCQkJCUlJCUlJicnJiYnKCkpKSkqKisrKywsLS4uLi8wMTAxMjIzMzQ1NTU1NTU1NTU3NzY2NjY2NjU2NjY1NTY2NjY2NjU1NTU1NTU1NTU0NDMzMjIxMTExMDAwLy4tLS0uLi0sKysqKSkpKSknJyopKSkqKy0sKSksLC0wMTNFZ2pdVFJTWV5kYkYkHx4fHiEhISInZnhiW11gbkobHyIiISAgICEmKCorKyoqKi0tLjEyMCwsL2NwamVkaGtuX01gamhkYWFjYltfW0o/NDc4OTk7PDo5NzU2NTEwOEFCQj02MzEwLy8wMTIyMzc6Oz0+Pj0/REhLTVBSVFNTUVBOTUtLS0tLTExOUFBRVFNQT0xJRkNCQD4/QEdRVVtibXyGioqJh4SDgoKCgX12cXWBh4WEgHtqaXaFj42Kg4KAfn14bWFdYGVpbXF2fYGEhIaJiYeHiIeGhoaGhoaHiYqLiYiGhoeIiIeJiIR+fHt6d3Z0cHFxcHFuTSk1Njg4PENESlBTT0tIS01WWlpWXl9shJKYmZ6oqqekd0RISUlLSklMTE1KSkxLSkxNTE1NVHOcr7i8vL6+vr6+vLmzraSgn52amZibnZ6lpaGbi3x6fXt6fXx6enh4e32BdnN1d3p7fH19fHx8fHt5d3R6gomJhoSGiJCWk5CRj4+OjIyLi42QkZGQkJOXm5qWkIyKiIeJjI2NiYJ5cW9ue4eIiIeFUVFQUE9PTU1NS0hGRUNCQUE/Ozs5ODY2NTQzMjAvLy8tLC0rLCwqKioqKSkpKSgoKCgoKCgoKCgoKCgoJycnJygoJycmJiYmJSUlJSUlJCQkJCQkIyMjIyMjIyMjIyQkJCQlJSUlJCUnJycnJygpKSkqKiorKywsLSwtLi8wMTEyMzIyMzQ1NTU1NTU1NTQ0NTU3NzY2NjY2NjY2NTU1NTU1NTU1NTU1NTU0NDMzMzMzMzExMTEwMC8vLy8uLi4tLCwsKywsKysqKioqKSkpKSgpKS0vMC4rKisvMzQ3N0Jjbl5TUVNVXWNqWzEeHiAgHyAkJDNscmJeW2FtMB0fICIhIiIkKCosKiwrKysuLzAxMi8sLmBvZ2hnaWpwaGRqa2hlYGBhY2JdVkg4MjA1NzY4PkA8ODQzNjQxMDdBRkRCOjQzMC4wMTM0NTQ2Nzk8PkFBQkVGSEtOT09RU1JQTkxKSUlLS01NT1BTU1VTUE5MSUZEREBBQT5BRUtUYXKEiYmJiIaEgYCAgH96bmt2gIiIhIB5amp3hYyLh4KAf316dmtkX15fZWhtc3mAhYaGiIiHh4SEh4WFhYWFhYWHhoN/fH1+foKChIaGgX59enl3dnV1dHV2a1IvLjo8PkNHS0dHSE9QUVhYVlxgYWVpZG2Ll5Ocp6mmoG1BRkpJTEtKSUpJSkpKSkpKSUtKU2yWrre8vb6+vr6+vr6+ubWupaOhnZqZmZiYnaOjn5WEen59e3t7e3l6eHh6fnNwdHV3d3x7fH5+fn19e3l2e4OJiYWCh4yRlZSRkI6Pj4uKiouMkJKRkZOWmZmVkY2KiYiJiouNjIh/dW9vbnuFiIiHhk9PTk5NTUxMTEpHRkRCQEBAPTs6Ojc2NjQzMjIwLy8vLSwrKywsKioqKikpKSkoKCgoKCgoKCgoKCgoKCcnJycoKCcnJiYmJiUlJSUlJSQkJCQkJCMjIyMjIyMjIyMkJCQkJSUlJSUnJycnJycoKSkpKiorKywsLCwtLi4wMDExMzIyMjM0NTU1NTU1NTU1NTU1NjY2NjY2NjY2NjU1NTU1NTU1NTU1NTU1NDQzMzMzMzMxMTExMDAvLi4uLi4tLSwsLCsrKyoqKSkpKSkpKCgpKSktLzIxLy0uMTQ3Oj0+PlVqZVhTUlZYX2loTiUeIB8gJSgoO3FyXV9ha2IgHR4iISEhJCgqLCwuLS0tLi8wMTEwLFVyZmNkaGtwbmpoZ2VmZGFhYmNkZlk1MTMzMzQ1OUFHQzk0NDUxMTA0PkVGQTo1MS8uMDEzNTY2Nzc5PD5CQkNFRkpKTExMTk9RU09NTElJSkpMTVBSVFRVU09NSkhGRENBQUFAPj9CT1twg4qKiIWCf39/gH56cWhsdIKHh4aBeW1seIWJiYSBf3x7fHZrYl9cW19gZm11foiHhIaGh4eEhIWEhYWEhIWFg4B7dnFwcW91fH6ChYJ/fnx7fHt7e3l4eXt3Z0pAQUZQW15YS01YXF1eXFphZGVma2tje5SLm6enpZljQ0hKSUpLSklISElJSkpISElJT2aNqre6vr69vr6+vr6+vr66tquno6GbmZmalpefoqKcjoB7e3x7e3t6eHh5e31ubG5xdHR4eXt8fXx8fHt6eXuDioiEg4qOlZWTkI+Ojo6KiYqLjJCRkpOXl5iWkYyKiYeKiYqLjYqEfXVvb259homJh4ZMTExLS0tJSUpHREJDQUA+Pjs6ODc3NTU0MjEwMDAvLi4uLCssLCoqKiopKSkpKCgoKCgoKCgoKCkpKCgnJycnJycnJyYmJyYmJiYlJSUlJSQkJCQjIyMjIyMjIyQkJCQkJCUlJSYnJygoJycoKSoqKioqKyssLC0tLS8vMDAxMjQzMzMzNDQ1NTU1NTY2NTU1NTU1NTU1NTY2NjY1NTU1NTU1NTU1NTQ0NDMzMzMzMzIyMTExMC8vLy4uLS0sLS0qKisrKiopKCgoJycnJygoKCgpLTE0NDIvMjM2OjxCRUE+SWRtXFNRUVVaZm1hOR8cIiUnLCxIdGpjYGBwRh4eISAiISUmKy0vMjAuLjAwMDIyMUxyaGJjZWpwcGlnZGRkZGRjZWZkamJFMTI1NTM0ODpEWF05MzMzMjEwMzpFS0Y7NTMuLC8xMzU2Nzg3OTs+QkNERkZJR0pKS0xOT1JSUk5LSUhISkpNT1NUVVJNS0lHRENCQEBAQUBAP0ZTaXqEh4WCf359f398dWpjaXaDioiGgnlvbXmFiIaCf358fHp1ZmVmZWReXmFpdICIh4WFhYaGhISEhISFg4WDgoB6dm1iYWVlc3t8fYGCgH98fX9/gIGBgoB+fnlwaGRlaGlpZFdbYGFgYGJjZmdqa29oYmyLlp+nqaSPU0NGS0tJSklIRkdHR0hKR0dISV2Eo7K5vL2+vr6+vr6+vr6+vbizraWfm5qYlpWRk5eZmZSFenl6ent6eXh4eXl+cGpsbHFydHZ5fH58enx8fHp9g4iHhISKj5aUkI+NjY6NiomKi46SkpSYmpmYk4yLiomIiYyLi4uHgXx0bm9ufIiJiYiHS0tLSUpKSEhHSEZEQkE/PTw6Ojg3NzY2MzIxMDAwMC4tLSwrLCwqKioqKSkpKSgoKCgoKCgoKCgpKSgoJycnJycnJycmJicmJiYmJSUlJSUkJCMjIyMjIyMjIyMkJCQkJCQlJSUmJycoKCkpKSkqKioqKyssLCwtLS0vMDAxMTI0MzMzMzQ0NTU1NTU2NjU1NTU1NTU1NTU2NjY2NTU1NTU1NTU1NTU0NDQzMzMzMzMyMjExMTAvLy8uLS0tLCwrKiopKSoqKSgoKCcnJycnJygoKS0xNjc1MjQ6PD5CRkpCQ0A/VmtiV1FQU1tfZ25eNBwkKywtLk94al9fYGw0Hx0gIiQmJiktMTIzMjI0NDQ0MUlzbWZmZmlucGhlZGRkZGRlZWdkZFlDNzUzNDQzNzs/Q0xONzIzMzIyMTI4Q0hGPTgzMC4uLzAxNTY2Njk7PEBCREZGR0ZHSEhJTVBQUU5MS0lISEhISk5QU1RQTUtJR0RDQT9AQENEQ0FBSFlqdHyAgH59fH58d25iYmt3hIqJiIR7b215hIeDf316fHx5dWxoamhlYF5eaXaFi4qIhISEhISEhISEhIaFg4B9d29lV05RWG12eXt9f4B/fn+Bg4aHhoiIh399d3Fzc3FuamRXX2FgX19gZWVnaGxvZ2Nne5WepaWjh0pFS0pJSEZIR0dHR0dHR0lIRkxumq+4vL++vr6+vr6+vr6+vr27tKymoZ2ZlZGQjYmFhIuPhXt5enl5enp5eXp7gHFqZ2ducXBzdnh6fHp7e317foWIh4OFjZKVkpCPjY2NjIqKi4yQlJeYmpmXkoyKiYmIiYuLi4uKhn95dG5ub32HiYmJiElJSUlISEdFRERDQkJAPz48Ozk4ODY2NTQzMDAwLy8tLi0tLCwrKikpKSoqKSkoKCgoKCgnJykpKSkpKSkpKSkoKCcnJycmJiUlJSUlJSUlJCQkJCQkJCQkJCUlJSUkJCUlJiYlJicoKSkqKikpKiwrKywsLi4uLi8vLzAxMTIyMzM0NDQ0NjQ1NjY2NjY2NjY2NjY2NjY2NDQ1NTU0NTU2NDQ0NDQzMzQyMjIyMjIyMTEwMC8vLi4uLSwsKysqKSkpKSknJyYmJycoKCcmJSUmJykrMTY6OTc2Pj9CSExNSklDPzxQYmVaUlJVWFxfaW5SMSkpKSkpU3NiWmBqWyAiJCQmKioqLjAyNDU0NTc3NT1pa2hoa2tscWdkZWdoaGNkZWloXkdAQjMzMjIyN0ZEQDczMjEyMTExMTQ2NjpAQzw7Ni4uLy8xMjM0NTY5Ozw9QUNERUZGR0VHSElMTk5NTUtJSEhHR0lMTlBST0xKSUdFRENAQEBCREREREVJU2BrdHh6e3t8dnFoXmBqd4SLioqGfW9ue4ODg398e3t7fHtza2pqaGViY25+jZCKhoOCgYGCg4ODgoSFg39/enRmXk1DRFZtc3d6fH59fn+BgoSHi4yNjo6KiH90cHBtbWNYXF9fX2BhYmRmZ2Vja2dkaXWPnaCkoIJHP0dJS0lGRkZGRkZGSEVHRkZaiKi3vL6+vr6+vr6+vr6+vr69ubKsp6SgnZiUj42JhYKGiYF6eXl4eHh4enp6e39xZ2VoaG1vb3V7fH19e3t7en6EiIeDipKWlZGOjY2NjIyMi4uOkZWYmZqXk42LiomJiImKi4uLh4F9eXJubW6AhouMi4tHR0dHRUVFRENDQUBAPz08Ojk4Nzc1NTQ0MzAwMC8vLS0tLSwsKyopKSkqKikpKCgoKCgoKCgpKSkpKSkpKSkpKCgnJycnJiYlJSUlJSUlJSQkJCQkJCQkJCQlJSUlJCQlJSYmJSYnKCkpKiopKSosKywsLS4uLi4vLzAxMTEyMjMzNDQ0NDU2NjY2NjY2NjY2NjY2NjY0NDQ0NTU1NDMzNDU0NDQ0MzMzNDIyMjIyMjEwMC8vLi4tLS0sKysqKSkpKSgoJycmJiYmJycmJiUlJicoKi83PD07ODxCSEpMTEpJRUQ/PUdYamVbWFhYWVtiaGZSKiIoKShadGRdYmxMHSYkJioqKy0wMzc4Ojs5ODdmamdpa2pvcGhjZmdnZ2hmZ2lsV0E/QjczNTMzMzdDS0U3MzEvLy8wMTI0Njk5Nzk5OTUxLi4vLi8wMjU3ODk7PD5BQkNFRUVFRURHR0hISUlISEZGR0dHSk9RUk9MSkhGRURDQEBAQENFRUVFR0hQW2RtdHl7d3FmYl5fa3mGi4mLhXtvb3uAgH98e3t7e319eXBvbGppZmZxgZCQiYWCgYCAgYKDg4OFhIJ/fXp0Z1pUS0hQY3R2dnl7fX5/gYKEh4uNjo6Oi4mBd3BvbmpbX2BhYGBjYWNlZmdjXmVmaG5xhpqdn51/RkBGR0hHSEVFRUVFRkVFREZPdJ6yur2+vr6+vr6+vr6+vr6+vbmyrKejn52Yk4qFhIWGi4uEe3l5eXl5eXl5d3l9cmdlZ2dqbm5zdnl6fHt7e3p/hYiHhY2UlZOQjoyNjYyMjIuLjpOWmJeVkY2KioqJiYiJioyMiYZ/fHhwbWxzgoqOjo6ORUVFRUREQkFAQEFAPjw7Ojo4NzY3NDU0MjIxMDAvLi4uLSwsLCwrKioqKioqKikpKSkpKSkpKioqKioqKSkpKSgoJycoKCYmJiYlJSYmJSUlJSQkJSUlJSUlJSUlJSUlJiYnJycnKCkpKSoqKioqLCwsKywuLy4vLzExMTExMTIzMzQ0MzQ0NDU1NTU1NTU1NjY1NTU1NDM0NTU1NTMzNDQ0MzMzMzMzMjMzMzExMTExMS8vLi4uLi0sKysqKikoKSgoJycnJiUnJSYmJiYlJSUlJioxOT9CQj09RktLTEpKSEVCPz9BO0lgamRZWVlXWV1ga2dBJiYmKGJ2ZGJkajofISgrKiwtLTE0NTY4OD9qa2dpaWdsdGtkZmdoaGlpbGxfSDpCRT4zMTUzMDE2QVtSNTIwLy4uMDEzNDg8Ojk2NjY0Mi0sLS0tLzA0Nzk4Oz09P0FBQkJDQ0RDQ0NDQ0NDREVERUZGR0dKS05RTElHRkVFQ0FAP0BDREdHRkZJR01WX2dvc3FnU1hfYm57iIqJiYR8cXB7fn98e3l4eXl9fX90b25ua2lsdoWSkIeDf36AgYCBgoODgoKBgH55c2hhW1dRUVpoc3V3eHp9f4CChIeKjY+Ojo2JgXdwbGpiXWBhYmJiYWNkZmdkXllkZmVtcnqRmp6aeEBCRkVESEdHRUNERkREQ0VKZJKsuLq9vr6+vr6+vr6+vr6+vby2sqynop2blo+HhIKBg4WJh317e3p6eXh4d3Z3fXNkZGdlZmtsb3N3eHt7e3t6gYeIhoiPlJSSj4+NjY2Li4uLjZCUlpeUk42JiYiIhoeGioyMi4aAf3t5dXR3foiOj5GRj0JCQkJCQkFBQEBAPzw7Ojo5NzY1NTU0MzIyMjEwLy4uLi0qKisrKyoqKioqKiopKSkpKSkpKSoqKioqKikpKSkpKSgoKCgmJiYmJSUmJiUlJSUkJCUlJSUlJSUlJSUlJSYmJycnJykpKSkqKioqKiwsLCwsLy8uLy8xMTExMTExMzQ0NDM0NTU1NTU1NTU1NTY2NTU1NTQ0NDU1NTQzMzQ0NDMzMzMyMjIyMzMyMTExMTAvLi4tLi0sLCsqKikoKCgoKCcmJiUlJSQlJSUlJSUmJygrLzpCR0hDPUZOT1BOSkpFQj89PDo2OU1oaV1YVlRVWV1jaVYyISQsYHZjY2JnMSIqLDAzMjEzNzg8OD1pcWpoamhpb2xmZ2pqZ2publtCOTo/REk7MzQ0MjAxNj9QSTMwLy8vLzI3Njc2OTw8OTg1My8rKywsLS0vMTU5Ojs9PT5AQEBAPj9BQD8/PT4+QD9BQUNERERERUhKSklIRkRFRUNBQD9AQ0RFRkdGSEdHSk9YYGZjVklPXmVufImKi4qFfHBxen1+fXl5enp6fH+Ad3Rxb25sbnmIko2GgX9+fn+AgYOEg4KBf4B+e3hyaWVhW1dXXWlzdXd3en1/gYSFiIyOjo6NiYJ4cGdjYGBhYmNjY2NkZmZmYV1daGhoa3J1gJWem3U8QkVGSUdGR0RDREVDQ0JFV4OltLu9vb6+vr6+vr6+vr6+vr66trKuqaKZlpGNiISCfn17foV+e3t6ent6eHd2d313Z2VmZ2VqbG9wc3V5e3t9fIGHh4WKkpSUko+PjY2Ni4uLi4+SlJaWkYyJiYmJiIaHh4qMi4mDgYF/f4CDh4mMkJCRk5FAQEFBQEA/Pz0+Pjw6Ojk5ODc0NDM0MzMyMjExMC8uLisrLCssKyspKSkqKioqKiorKyoqKiorKysrKysqKioqKiooJygoJyYmJiYmJiYmJiYmJSUlJiYmJSUlJSUlJiYmJiYmJycnKSoqKioqKisrLC0tLS4vLy8wMDExMjAyMjI0NDQ1NTY2NjY2NjU1NTU1NTU1NTU1NTQ1NTQzMzMzMzMzMzMzMjIyMTIyMTExMDAwLi4tLS0tLCsqKikpKSgoKCcmJiUlJSYlJCQkJCQlJCYmKi44RUxQSURHUlRWUk1JREE+PDw5OTIuOFZlYldVU1ZYXF5nZ0srHydjcmFlaF0nKiwyNz1DS0xJQElqc21qbWlpcG5maGlpa25nWkw7OTo9P0A7NjQyMjAwNDY3OzcxLzExLzAzNzo5NzpAQT06NTMvKyssLS0tLS8yNjY5Ozs8Pz07Ozo7PT48Ozs9Pj4/P0BBQ0NCQURGRkdHRkRDQkJAP0A/QEJDQ0RERUVFRkVHSlFVUUpFR1dmc36IiIiHg3ltcHd7fXt6eXl5enyAhH53cXFvb3J9i5OMhYB6e3p+f4GDhYOCfnx9fX18dXFtaWRhYGNiaXN2d3d7fH+DhIaIi46OjoqCeXBlYmJjZGNjY2NjY2ZkY2NdXmlqam1yc3SMm5hyPkFFREVDQ0VERERFREJES22Zrra6vb6+vr6+vr6+vr6+vr6+uri1rquglZGQjoyKhYN+enl+fnt6enp5eHh3dnV8emhlaGdkZWpubnF0dnl8fXyBiIaGjpKRk5COj42MjIuLjIyPk5aUkYyIi4uMjY2Lh4iKi4mFhIaGh4mLjY+QkZCRlJOTQEBAQD8/Pz88PDs6OTk4ODc2NjY1MzMzMjIxMTAvLi4sKysrKysqKSkpKioqKioqKysqKioqKysrKysrKioqKikpKigoKCcmJiYmJiYmJiYmJiYmJiYmJiUlJSUmJicnJycnJycoKSopKSsrKyssLCwtLS4uLy8wMDAxMTExMjIyMzQ0NTU2NjY2NjY1NTU1NTU1NTU1NTUzNDU0MzMzMzMzMzMzMzIyMTIyMjExMTAwLy4tLSwtLCsrKikpKCgoKCcmJiYlJCQmJiQkJSYkIyQkJiktOEVPVFJNS1NYVlNPS0dDPzs6NzMyLy4sPVhnYVlUU1ZYW2BnYkImJF5vYWVlVjo4NT1ASUxRWGNycmxtbGprcHBqaWtsb2pTRUZHSENBQkE+ODQ0MjAvLzM2NzYzLi0uMTExNDk9Ozc7QkRAPTcxLyssLC0tLS0vMTQ2Nzg6Oz06ODg5PDw8Ozs7Ojo6PT09Pj9BQkNDRERFRENBQEBAQUE/P0BAQUFCQkJCRENERENERUZERUVTaHWDh4aHhYB0bXF4eHp6enl5eXp7fImMeHVycXF3f4ySi4WAe3p5e35/goSDgn55d3h6eXp3eHBubG1tbGhtdHd3eHt9goWGhoeIi4qHf3VuamZiZmVkZGNjY2NjZGJgX2Zsb2xqcHh5gY6Tb0NCR0RFREFDRERERURCQ1eFprO3vL6+vr6+vr6+vr6+vr6+vb25uLKroJmVlpWUkY6KhX52dXl5eXp6eXh3d3V2eXpnZWVkZWZpa2xucnZ5fX18hIiGiJCTkpGRj4+NjIyLi4yMkZKRj4yIiIqNkZaWko6LiouKiIyPkJKSkpGQkpGTkZGSkj8/Pz8+Pj09Pjs7Ozk3ODg3Njc2NDMzMjExMDAuLS4uKysrKyorKysqKioqKioqKisrKioqKiwsLCwsLCwsKyoqLCsoKiooKCYmJycnJycnJycnJycnKCgnJyYlJicnJygoKSkpKSkqKiorLCwsLi4uLi4uLzAvMDAwMTAwMjIyMjM0NDU1NTU2NjY2NTU2NjU1NjY1NTQ0NDQ0NDMzMzMzMzIxMjIyMjExMDEwMDAvLi4tLSwsKysrKikpKCgoJycnJiYmJSQkJCYkIyMjIyMkIyQmKzZBTFZaVlFTWFlYVE5LSEQ/PDgzMTAuLywsRGFoXlZUVFRYX2NoY0UsXmldY2hQKzc8RVRdZGpvc2pqbG1tcHBsbG1tZ1A8Qk1RT0hJTElBOjU0MzIuLTA1NTU0MC8sKzI1MzM4OTk4OUBEQ0I8NTEtLS0sLC4vLzEzNDQ2ODg5ODc3Nzs6Ojk4OTg5Ojo5Oz08PUBBQkRBQkJCQD9AQD4+Pz8/P0BAQUFBQUFCQkJDQ0NCQkJFVGl2gYCBgoJ7b2lvdnZ3eHh4eXp1dXaHkoB5dnRyeIKMkIqDf3t4eHh8f4KEhYN/eHBwdHd1d3Z1c3JzdXRxbGt0d3h4e3+FhoWGh4iIhX11c3BrZmNlZmZmZGNjYmNgW11jZ2txbm9ydXuJiHBGQ0NFRUVCQUJDREVGQ0pql6y1u7y+v76+vr6+vr6+vr6+vr6+vbu5s6ijoqCgoZyWk4x/dnV3eHl6enl3d3d2eHp9aGVlY2ZkZ2hrbnJ2eX17fYWGhomQlJOSkI6PjYyMi4uLjZKRjoyKiIiLkJabmpeVkY+OkJGTlZaUk5OSkpKRkZKRko88PDw8PDw7Ozw5ODg4NzU1NjU2NTMyMjExMTAwLi0tLSsrKysqKioqKioqKioqKiorKyoqKissLCwsLCwsLCwsKyoqKSgoKCgnJycnJycnJycnJycnJygoJycnJycnJycoKCkpKSkpKisrKywsLC4uLi8uLi8wMDAwMDEwMDIyMjIzNDQ1NTU1NjY2NjU1NjY1NTY2NTU0NDQ0NDQzMzMzMzMyMTIyMTExMTAwMDAwLy4tLSwsKysqKiopKCgnJycnJyYlJSUkJCQkJCQjIyMjIyQkJSkwOkZRWVhRUVhZWFhTT0xIRD87NzUyLy4tLyoxSGVpWVNTVlhZXGRpYlZqcWNkYko4S19lZ2dudGxoamxtcHBrbWxdPS01SVtdVE9NRUdHPTc0MjMwLywwOj02MjEuLS0wMzY2ODo6ODk+QUVCQDkzLy0tLCwtLjAyMjI0NTU1Njc3Nzg5ODk6OTg4ODg4ODg5Ozs9P0BBQkJCQj8+Pz8+Pj4+Pj4/QEBBQUE/Pz9AQUFCQEJBSltreXt7fH15cmtpcHR0dnd3d3l4cmdsgJOPenh2c3mCjI6Ig398eXl5fH+DhYaEf3hvaW1tb3BzdnZ1dXd2dXRwbXJ3ent/hIWFhoaHh4R/eXRwbmlqZ2ZmZWNjY2NhXVpdY2dtdXV1b21whohwTEREREVEQUNDQ0RERUZWgKOyuLu9vr6+vr6+vr6+vr6+vr6+vr6+vLu4trWxqqajm5SOg3p1d3h5enp5d3d3d3d6fWhlZGNkZWdoaW1xdHp8e32EhYaJk5STko+Ojo2MjIuLi42Qj42KioiIi5CYnZyZmJaVlpaWl5eXlZSTk5OTkpKSkZCMPDw7Ozs7Ojo5OTg4NzY3NzY2NTUyMTExMDAuLi0sKysqKioqKioqKioqKioqKisrKiorKy0tLCwtLS0tLS0sLCwrKioqKikpKCgoJycnKCgoKCgoKCgoKCgoJycoKCgoKSkpKSkpKissLCssLS0tLS4uLy8vLzAwMDExMTAyMjIyMzQ0NDQ1NTU2NjY1NTU1NTU1NTU1NDQ0NDQ0MzMzMzExMTEwMDAwMDAwLy8vLy4tLSwtLCsrKioqKSkoKCcnJyYmJSQjJCQjIyIjIiIiIiMjIyQmLTZDTVNUUE5VWltbWVRNSUdCPzw3MzIvKywsLCszVWlfWldXV1lZWmJqcXV0cG9ubGlnZWJscmpoZ2pucXJualw+IikzR11fWlJNQjhFRTs1MjIwLy4vN0hMPDMxLy8uLjM3ODk7ODY3PEJGQ0E8NzEvLSwsLS8xMzI0NDM1NTU1NjY2NjY4Nzc3Nzk5ODg3Nzg4Oz0+P0BAPz8/Pj8+PTw9PT09Pj9AQUFBQEA+Pj5AQD9CSVdjcnp3dnp5cWpeYmxxc3V1dnd3d3FjV26NmIJ9eXh7hIyLhoJ/fXp6e3yAhIWIh4N8c2JfZGdobG5wc3V4eHZ0c3R0dHV6foOEhYWFh4eHg3t3eHVzb2lnZmVkY2JiX15aXmZtdHd2dXBsaXaGcFFHRkZGRENCQ0RFRUFKZJKqtLm9vb2+vr6+vr6+vr6+vr6+vr6+vr6+vr6+u7Crpp2OhIF6dXd5enl5eXd3d3Z3en1sY2NkZGRmaGptcnN7enx+hYaGi5OWkpGPjo2NjIuLi42PkY6Ni4qKi46Ul5yampqYmpmZl5iXlpWUk5OUlZWSk42Nhzo6Ojo7Ozo6OTk3NzY2NjY1NTQ0MzExMTAvLi4tLCsrLCwqKioqKioqKioqKiorKyoqKystLS0tLi4uLi4uLCwrKysrKyspKSkoKCgoKCkpKSkpKSkpKSkpKSkpKCgoKCkpKSkpKSorLCwsLC0tLS0tLS8vLy8wMDAxMTEwMjIyMjM0NDQ0NTU1NjY2NTU1NTU1NTU1NTU0NDQ0NDMzMzMxMTExMDAwMDAvLy8vLi4uLi0sKysrKioqKSkoKCcnJyYmJSUkJCMjIyMiIiEhIiIiIiEjJCkzPkdMSUZJT1lcXl1YUU5MR0M/Ojc0LysqKSsoKis8WWVfVVpVVldaYWVmampqZ2VmYmBqc3BpaGtudHdvXDgnLTYvSWZnYF1XTzc2SkM4NTEvLy8uLjI6OTQyMS4wMTExNTY3Ozg1Nz1CRUVDPTgyLissLC0vMDI0NTQzNDQ0NDQ1NTU0NTY2Nzc5OTg4Nzc3Nzg4Ozw9PT8/Pj09PTw8PT09PT4/QUFBQT8/Pj8+Pj9BSVRfbXd2dHZ1cGVYT1VhZmtvcXR1eXduWzsybZaLf317foSMi4aCf316enx/goaHiIeGgnhpWVldYGRmZ2xydnd3dnZ1dXR3enx/goODhIWFhoN+enl6dXJvbWdkZGNiX19eXWFqc3l3dnVwbWtvgX5ZREdGRUJCQkNERUVBTnObrLa5vL2+vr6+vr6+vr6+vr6+vr6+vr69vr6+vr21rKCQeG5wc3V3d3l5eXl3d3d2d3p9a2NjYmRkZmhqbXF0enx8foSFh4+Tk5KRj46NjYyLi4uOkZCNi4qLjpKTlZaampuZmpqamZmYl5aVlZOTkpGRjoqFgHs5OTo6Ojk6Ojg4ODg2NjY2NDQ0NDIwMTEvLi4tLSwrKyoqKiopKSkqKiorKyssLCsrKywsLS0uLi4uLi4uLi0sKywrKisrKSkqKikpKSkpKCknKCgoKCgoKiopKSkpKCgoKCkqKysrKywsLS0uLi0tLi4vLzAwMDAwMDExMDEyMjIyMzMzMzQ1NTU2NjY2NTU1NTQ0NTUzMzM0NDQyMjIyMTExMTAuLy8wMC8vLS0uLi4tLCsrKiopKSkoKCcnJiYmJSUkIyIjIyIiIiIhISEhISEiIiMnMDlDRUE/Qk1XWl9fXldVUEtHQz85MCgnKCcmJiYnIypDW19ZV1NSVVdZXGBiY2NkY2Nsd3FpZ2xwdHloPyEjKCg5TmVpZGNjW0w0MkE5NDIwLy8uLC0vMS8wMTEvMTU0MTI1Nzk4ODg9RUdGREA7NTAsKysuLi8xMzQ0NDMzMzMzMzQ0NDU2Njc3NjY3NzU1NTU3Nzg4Ojs+Pj08PDw8PDw9PTw/QEBAQUFAQD48PT1BRVNfaXN2cnJxbGRVQj5GUFhcYmdtc3R0aFlWTGaOkIaAf4KHjIqGgn9+fn1/gYSHiImHiYh/cV9RU1VaXWBmanJ0dHV1d3Z2eXl6fYGBgoSEhISDg358fHp1dXBraGZkYV9dW1xlaXBzdXNzbmppZ3J8Y0dGRkZEQkNDRENEQlJ+oK22ur29vr++vr6+vr6+vr6+vr6+vr69vb6+vr69taWOc2NkZWluc3h5enp5eHd2d3d5fm5jYmJkZmVnamxvdXt8fX+ChYiPlZSTkI+OjY2Mi4mJjY6Ni4qLjpKVl5mZmpybmpqZmpqYmJaWlJKSj4yIhYB5dW1kOTk6Ojk5OTk4ODg4NjU1NTMyMjIyMDAwLi4uLS0sKyspKSsrKiopKisrKysrLCwrLCwsLC0tLS4uLi4uLi4uLC0tLCssLCsqKysqKiopKSkqKCoqKSkpKSoqKSkqKikpKSkqKysrKyssLC0tLi4tLS4uLy8wMDAwMDAxMTEyMzMyMjIyMzMzNDU1NDQ0NDU1NTU0NDQ0MzMzNDQ0MjIyMjExMTEwLi8vLi4uLi0tLS0rKysrKiopKSkoKCcnJiYmJSUkJCMjIiIhISEhISEhISEhIiIjJy04QkdEPkJIUFddYF9eXFpUTktFPy4nJiYlKCgoJyYkJChAXWJUT1RXV1peX2FjZWRsdXNwa29ydnhlOyUmKCYnPV1paWVjX1VJLCs4NjMxMC8uLSorLC4vMDAwMDI2NzIyMzY6Ojg5PkJERUVBPDYxLCsrLi4uMDEzMzMzMzIyMjI0NDQ0NDQ1NjQ2NjY1NTU1NTY3Nzo7PD09OTo6Ozs7PD08P0A/QD8/Q0A+PT0/R1JaZ3J0cXRya2NVPjAyOT9ESVFaYGZtbmhfZWhygpGLhIKCio6KhoSCgIB/gYSHiIiKiIiKhXptVk1PUFRXXWRrcHFzdHR2d3h5enx9fX6AgIKEhISCf318eXR0bmpnY2BeXlxhanBwcHFxcW1paGZpcm9QTEpKRUJCQkJBQkVVhaOwt7u9vb6/vr6+vr6+vr6+vr6+vr69vLy8vr28uamIaFlfZGVoaGtxeHl5eXl3dnZ2eX5zZmNjZ2lpamxucXZ8fX6AgoWJjpKRko+OjY2NjIuJiY2Oi4qKjpGUmJmbm5uZmZiYlpeXl5eWlZOPiYN+enRsZFlRUDg4OTk5OTc3ODg4NzU1NTUzMjIyMjAvLi4uLi0tLCsrKysrKyoqKisrKysrKywtLS0tLi4uLi4uLi4uLi4uLS0uLi0rLCwsKysrKyopKSoqKiopKSoqKiorKSoqKisqKCorKywrKysrLCwtLS4uLS0uLi8vMDAwMC8xMTExMjIyMjIzMzIyMzMzMzQ1NDQ1NTU1MzM0NDMzNDUzMjIyMjIwMDExLy4vLi8uLi4uLSwsLCsrKiopKSgoKCgmJiYlJSYlJCMjIiIiISEhISEhISEhICEiIyYrNEFGRkRHSU9VWl9iY2FfXFdTTT4uKSklJCQkJigqKCgoJCpHXV1VWV1gYWNjaGhtc3Bsa21xc3drTjQsKyYnKkNeaWJXUllTSi0oNzYwMDAvLS0qLDAvMTExMjEzODk3NTc6PD48OztAQ0VFQj87NTAsKywsLS4wMTEyMzMyMjAwMjIzMzQ0NDQ0NDQ0NTU0MjM0Njc5Ozw7OTc4ODg4Ojs8Pj09Pz9CQkJBPzw+Q1BbZnF1c3NuZ19SQDIvLzAzNjlARk9XX2JgW15WXXSNjoaEhIeLiYWFhISEhISGh4iIiYiIiIqGeWxWSkhKTFJbZ25ub3BydHd5eHh7fX5+fn9/gIGDgoOAfnt4dnJuamRgXltdZWhqbXBxb25saWdkZGZrV1RQSUNCQUJCQkFFWIeksLa6vLy+vr6+vr6+vr6+vr6+vr28u7q6vb27t62FXFBXXWBkZ2hpanJ3eHh4dnZ3eHyAeXFwcnNzc3N0dHd9f35/gYKGio2RkpGOjY2MjIuKiouPjYqLjZCTl5iYmpmamZiVlJKRkZCQjoyIgHdwZ2BYTkdESE44ODg4ODg3Nzg4NzU1NTU1MzIyMjIwLy4uLi4tLSwrKysrKysqKiorKysrKyssLS0tLS4uLi4uLi8vLy8vLy4uLi4tLiwsLCwsKysrKiorKysrKiorKyoqKywqKiorKysqKyssKysrKywsLS0uLi0tLi4vLzAwMDAwMDExMTIyMjIyMzMyMjMzMzMzMzQ0MzMzMzU1NDQzMzMzMDAwMjIyMDAwMC4uLy4uLi4tLS0sKysrKiopKSgnKSYnJiYlJSUkJCMjIiIhISAgICAgICAhISAgISMmKzQ/SEpKS05QU1pfZWVmZmJeWE00KSsoJiQlJyYmKy0uLismJSo6S1dnbGprbW5rdXJtbW9zdXdsU0k1Mjw9MTJMY2RaU0xNTUcwJTY1LzAwLi0tLS8yMDEyMTIzNjk9Ozk4ODs8PT0+QD9AQkA/PTkyLiwsLC0uMDExMjMzMjIxMDExMzM0NDQ0MzMzMzQ0NDIzMzU2ODo7OTg5ODg4ODc5Ojs7Ozw9QEFCQT89QE5ZY29wcXNvaFxOPC4tLC0vMDAwNDc6Q0lOUFdZUlppf4uGhYWHiIaFg4OCgoODhoeKioqJiIeJiod+b1tIREVIUWNpa2ttcHJ4eXd3eXt7e3x9fX5+gYKDgn99e3l1cm5qZVtQVFxlZmdub25ubGlnZGRiYFhSUEZEQkJBQUFCRFiIpbG3uby+vb6+vr6+vr6+vr6+vr68uri3u7u9ubGVXEVQWVxeYmZnaWhsdHh5eXp6fH+ChYJ/gYKCgoB+fn5+gYGAgYKChoyOkZCPjY2NjIyLioqNj42MjJCSlpeXmJiZmZeVk5CMioiGhH95c2dfVk5FRUZKTFBTODg3Nzc3Nzc3NjU1NTU1NTMyMjIyMDAvLy8uLS0sLCwsLCsrKysqLCwsLCwsLC4uLS0vLy4uLi4wMC8vLy8uLi4uLi4tLS4uLCwsLCsrKyorKysrKioqKiwsKysrKywsKiosLCwsKy0sLC0tLi4tLS4uLy8wMDAwMDAwMTExMTIyMjIyMjIzNDMzMzMzMzMzMzMzMzMzMzMzMjAuMDExMTAwMC8uLi4uLi4tLSwsKysrKiopKSgmJicnJiYlJSQkJCMjIiIhISEgICEhICAhIR4gICEiJSszPUVJTE9RUVRbYGZramZkY1tIMSwvLCgpKSknKSosLC0vLjAxMTI4QVFYYGNmcnJvb3J0dXRlUVBPOztIT0pPW2BYVVJLS09GMSQzNTAwLy0uLTE2ODU1MzI0NDY5Pz49Ozs8QEBCQT48P0JAQD07NC8tLS0tLzExMjIyMjIyMjIyMjIyNDQzMjExMjIzMzIxMjExNTY3NzU2Nzc3Nzc4ODg4OTk6Ojw9P0A9QEhXYW5xcXJvZ1xQPjAuLSwtLS8vMDExMjQ4PEJISUtQWGp+fHl8fn+Af3+AgIKGhoeJiYqLiYeGiYuMiYFzXEhCQ0pbY2ZmaG1yeXl3d3l6enp6ent8fn5+gYF/f3t6d3Vzb2xlX2FoZF9kbW9vbmxoZmJhYV9bTk5IRkNCQkJCPkRZiaawt7m7vb2+vr6+vr6+vr6+vr68u7m2tbe6u7mtgkZFT1ZcXmBkZGdpaW93e3t8f4GFh4eKiouLioqJh4aEhIaGhYSDg4eMjpGQj46MjIyMiomLjY+NjY+RlJWXlpWWl5eWlI6JhX14dXFuY1ZMRkJBQENITU1QVDc3Nzc3NzY4NzY1NTU1NTUzMjIyMjAwLy8vLi0tLSwsLCwrKyopKiwrKywsLS0uLi4uLS0uLi8vMDAvLy8vLi4tLS0tLi4uLi0tLS0sKysrLCwqKisrKyssLCsrKyssLCwsLCwsLCstLSwtLS4uLS0uLi8vMDAwMDAwMDExMTAxMjIyMjIyMzMzMzMzMzMzMzIyMzMzMzMzMzMyMTAwMTEvLy4uLi4uLi0tLS0rKysrKSkpKSgnJyYnJiYlJSQkJCMjIiIhISAgICAhISAgISEeICAhIyguNj5FSUtQU1RXX2RqbmxpZWJWPi4tLCoqKi0tKCoqLCwsKiotLjAxMTAuLigoZHJsbGtoaW1gSUxOUERDTlJRWV5aWV1bVVVUUjwnLzY4MzAuLS0xNz08OjYzMzM1O0BBQUNBP0BCQkE8Ojw+PT08OjUxLi0tLS8xMTExMjIyMjIyMjIyMjMzMTExMTExMzMyMS8vMTEyNDQzMzQ1NTU1NjY3Nzk5Ojo8PT4/PkZQXWtybm9sZlxOPTAuLCwsLC0vLy8vMDAxMDEzNTk7PkFLYGZgZGhrcHFzdnp9g4WFh4mJi4mJhoSHioyMhHZjRz9IV2NmZGVrcHp5dnd5ent5eHh4ent8fX59fIB/fHp2c3Jvb3Bsa25ra29vb2xqaGZiYWJgXEtMT0dDQkJCQkFCVoSjrra5vL2+vr6+vr6+vr6+vr6+vLq4s6+1u7u3p3BITFFZXF5iZGdqamptc3t/gYSHi42Nj4+Pj46OjYuIh4eHh4aGhYSIjI6Qjo6OjIyMjIqJi42PjY2PkZOUk5WTk5STjoyGf3VsZGBaT0VAPD0+QUBDSExOT1I3Nzc3Nzc3NzY2NTU0NDMzMzIyMjIwMTAwMC8uLi4tLC0tLS0tLS4uLi4uLi4uLi4uLjExMTEwMDAwMDAwMDAwLS0uLi0uMC4uLi0tLi4tLS0tLCwsLCwsLCwtLSwsLCwsLCwsLS0sLi4uLi4tLi4uMDAwMDAwMDAwLjExMTEwMDIyMjIxMTExMzQ1NDMzMjIyMjIyMjIxMTExMTEwLjAwLS0tLS0tLS0sLCssKysqKioqKSkoKCgoJiUmJSUlJCQjIyEgISEgICAgICAgIB8fICAgIiQqMDhARUhLUFNWWmJma29uaWVeTzAqKSkpKiotMSwsLCwtLSolIyQnLDAwMTYuWnZqamtvbGhcVUpJSklFS1JPWF1hYGFhWlhfXlpLLyk0QUA1Li0wOkFDQjw2NDQ2OTs/Q0RFSERCQUJDPDc4OTk5Ojg4NDAtLSwuMDAxMTExMjIxMTIyMjIyMjEwMDAwMDIyMTEvLzAxMDAxMTIyNDQ0NDY2NjY4OTg5Oz09PUBKVmRubG5qZVtNOzMvLCssLC0tLi4vLzAwLy8wMDIyMTIzNkBFRUlNU1VbYWNob3R5eoCGhYiJhoSFhYeKjY2HeWVJR1ZkZWFjaXN5eXZ2eXl6eXd0cXZ3enx9fX1+f319e3l2c3Jubm9vbm1sbW5qZ2dlYmFhYl1PS1NQREJEQ0JDRFJ3m662ury9vL29vb6+vr6+vr+/vLu7tauttLi3rppvX2NkZGRnamprbW5ucnl9gYWHiY2PkI+QkJCRkY6Mi4aHhoWFhoSFiY2Ni4yNjYuLjYyLioyNjY6MkJGRk5CQj42MiYWAdmthVU1FPjk4Ojs8PkBAREZJTExMNzc3Nzc3Nzc2NjU1NDQzMzMyMjIyMDEwMDAvLi4uLi4tLS0tLS0uLi4uLCwuLi4uLi8xMTExMDAwMDAwMDAwMC8uLi4tLjAuLi4uLi4uLS0tLSwsLCwsLCwsLS0sLCwsLCwtLS0tLS0uLi4uLS4uLjAwMDAwMDAwMC4vLzAwLy8xMTExMTExMTIzMzEzMzIyMjIyMjIyMTExMTExMS8wMC4uLi4tLS0tLCwrLCsqKikqKikpKCgoKCcnJSUkJCQjIyMhISEhICAgICAgICAfHyAgISQnLDQ9Q0ZHSEtRVVphZmhsa2llWkItKCorKyoqKCgrKysrLCwsJyMiJSUpLDI7WnVsaWtqa2VbTUxFR0U5NUpQUVdgX1tfX1paW19WUzorL0RNOS8vM0BERUVAOTk6ODg8Pj9CREhJRD8/Ojo3NTU1NTg5OTgzLi0sLjAwMTExMTIyMTEyMjAwMDAwMDAwMDAwMDExLy8vMTAwMTExMTIzMzQ0NDU2Njg3OTg5OTpBTllobW1qZVxOPjUyMC4rLCwtLS4uLy8wMC8vMDAyMjEyMjAvMDQ0Njg8QEdITlZcZGlvdXl9gIKBgoODhIeLjId8aFNYX2RiZG93eHd2dnl5d3Zwbm5vdHd6e319f35+fn18enl2dHJxcXBubm1samZkYmFhYGFgVk1NUEhDQ0NDQkRLb5estrm8vby8vLy9vb29vLy7u7i3sa2mpquvrqSXgHh6d3d2dnd3d3Z5eX19gIOFiIuPkJGSkZKSkZGOjImHhoWEhISEhIiMjIyMjIyLi4yLiYqMjI2NjpKRjo6MhoV/fXhuZ1pPRT47Ojc4Nzk8PT9AQURGR0pKSjc3Nzc3NzY2NjY1NTQ0MzMzMjIyMzEwLzAwLy4uLi0tLS0uLi0tLS0tLS0vLi4vLzAwMDAwMDAwMDAxMTExMDAwMDAwMDAvLzAwLy8vLy4uLS0tLS0tLCwsLCwsLS0tLS4uLi4uLi8tLi4tLS4uLy8wMC8vLy8vLy8vLy8wMC8vMDAwMDExMjIyMTEyMTIyMjIyMTExMDAwMDAwMDAwMDAvLy4uLS0tLSwrKysqKikpKSkpKCcnJycnJiUkJCMiIiEhIiIhISAgICAfHx8fICAgICEjKS82PkVGRkZJTlVZYGVoamlpZ1c3Li0sLSkqKikpKCgoKCorKykoJyclJiooSXBqamZnZWNQQUtNSURCQEBGTlhiZFxaYl9XUVJcWU9EOjM2PTIuLzA4P0VGQjs+QDo4ODk6Oz9IS0Y/Ojc1NjU0NDY3Ozs4NTIvLS0vLzAwMTExMTIyMjIvLy8vMDAwMC8vLy8wMC8vLi8wMDExMTEyMjIyMTIzNDY2Nzc3NzU5Q1BeaGpoZl1QPzY0MjEuLCwsLCwuLy4uLi4vLzAwMTEwMjIyMDAwLzAvLzAwMjY8Q0lPVVxiam5ydnh7fX6Bg4iNioBxZWFiZm52d3h2dXV1dHJtaGdnam1zd3l6fH5/fn1+fnx5d3V2c3RycHBvbWlmZGRhX19fYVtLSUpMSUVDREBBR22VqbK5urq8vLq6ubi1s7GwrquopqOhn6Cko6CZlIuKioiIhoWFhIOCgYCBgoKFhYeJi46PkZKSkpKRjoyJh4eDgoKDg4OGiYmLi4yMjIyMi4qJioyKjIuNi4WAe3ZxaWFaTUM9PD09PTw6OTg5PD8/P0NEREREREQ3Nzc3Nzc2NjY2NjU1NDMzMzIyMjMxMC8wMDAvLy8uLi0tLi4tLS0tLS0tLzAwLy8wMDAwMDAwMDAwMTEwMDAwMDAwMDAwLy8wMC8vLy8uLi0tLS0tLSwsLCwsLCwsLS0uLi4uLi4vLi4uLi4uLi8vLy8vLy8vLy8vLzAwMDAvLzAwMDAxMTIyMjEwMjExMjIxMTExMTAwMDAwMDAvLy8vLi4uLi0tLS0rKysqKikpKSkpKSgnJycnJiYkJCMjIiIhISIiISEgICAgHx8fHyAgICAhJikvNj5ER0dIR0tQWF1gZGRlZWJJLSsrKSsnKSkpKSgoKCgoKioqKSknJiYnPmhmZ2ZnZGNOQERNTUw+PEpOSVdfY19fYGRgVFRaXWFPR0I7NDg4NzkxMTQ8Q0NCQj86OTk3Nzg7RkxNRT03NDQzNTU2Nzo8Pjw4MzAtLy8wMDAwMTEyMjIyMC8vLy8vLy8vLy8vLi4vLy4vMDAxMTExMTEwMTExMTIzMzQ0NDQ0OERRXmdnZF9VQzU0NDEwLy0sLCwsLS0sLC4uLi4vMDExMDIyMjExMTAwLi0uLiwuLi8zNzxAR01TWV5kaGxwc3iAhYiHgHNnaHF5fHt4d3d2cWxnZFxUVmBnbXJ3eHp9fn1+fX98fXt5eHZ1dHNycW9tamZiYV9fX2BdUEhKSUhEQUNDR1Fqj6OtsLGxsbGtrKqpp6SkoZ+enJuanJ2cmpqZmJWSkZGPj46NjIqIhoSDhYSDhYWHiYuNjpGSkpKSkY+NioiHg4KCgoKChYiIiYqMjIyMiYiJhoeHhYKCfXlwamNaT0dCOzk7Ozs8PT08PDo5Oj0/QUBDRERDQ0FBODg3NzY2Nzc2NjY2NTUzMzMyMjIyMjEwMTEwLy8vLy8tLS0tLS0uLi4uLi4uLi8vLy8wMDAwMDAxMTExMDAwMDAwMDAvLy8vLy8vLy8vLi4tLS0tLS0sLC0tLS0sKy0tLi4uLi4uLi8vLy8vLi4uLi4uLi4uLi4uLi4uLi8vLy8wMDAwMTEyMjIyMTEyMTExMDAwMC8vMDAwLy8vLi4tLS4uLi4tLS0sKysqKioqKikpKSgnJycoJiUkJCMkIyMiIiIhISEhICAgIB8fHx8fHyAgIyUpLzY/RkhISEhLT1RZW15fYmBXOScqKScoKCgoKCkoKCgoKSsrKyooKSwkQ2xgYmJkY2VQO0I8OktHPj1FRFNkYV1dYWJfY15hYmBiVEhESFZKPkJHOSwwNTs/QkdCOjc2NjMzNkFKTUdCOjUzMzU1Njc5Pj9BPjo1MS4uLy8wMDExMjM1NTEwLy8vLzAwLi4vLy8vLy8vLzAwMDAwMDAwMDAwMDAwMTEyMjIyMzhDUV5jYmBYSjs0NDMwLy8vLSwsLCwsLCwtLS8vMDExMTExMTEyMTAwMC8uLS0tLS0uLi0tLjEzOz9ESExSV15kaXB1d3dybG1zeHd3eXZzcGphXVhNSFFaXWRtcnJ3fX5+fn5+fX59fHt5d3Z1dHVzcGxoZmFfYGBfX1tOTEpFRUhQVl5qdo2gpKampqSjoKCfnpybm5mXlpiYmJiYmJeXlpaVk5KSkI+Qj46MioiGg4SCgYOGhoeJjY6QkpOTkpKRkI6Kh4OCgoKCgYSGhoiIiYmKioeBfnx6dnJuaWFcVUxGPjs6OTo4OTs8PD09PDw7Ojw+PkJCQUJDQEBAPzc3Nzc3Nzc3NjY2NjU1MzMzMjIyMjIxMDAwMC8vLy8vLS0tLS0tLi4uLi4uLy8vLy8vMDAwMDAwMTExMTAwMDAwMDAwMDAwMDAwLy8vLy4uLS0tLS0tLCwtLS0tLS0tLS4uLi4uLi4vLy8vLy8vLi4uLi4uLi4uLi4uLi4vLy8vMDAwMDExMTEyMjExMTExMTAwMDAvLzAwMC8vLy4uLS0uLi0tLCwsKisqLCsqKikpKSknJycnJiUkJCMjIyMiIiIiISEgICAgICAfHx8fHx8gISMlKS80PEJHSElJSVBVVldaWVpXRi0nJycnKCgoKCgoKCgoKCsrLCwsKSYmPW1kW1thZmhTPkA7NzZARj01NTZQY2NjZGRkYV9gZGViY1hMREdKQTtAQToxLjAyOEFERT82MzQwMTI6QkVGQjs3NDQ1NTc5Oz0/QUE+OjUxLzAwMTExMTIzNDQ0MjAvLy8vLy4uLi8vLy8vLy8vLy8vLzAvLy8vMDAvLy8vLy8vLzE2QU1aYV1aUkU5MTIxLy8vLy4uLCwsLCwsLS0vLzAxMTExMTExMjExMjAvLi4tLC0tLS0tLi8uLi8wMDM2Oj5ESU1TVlteXl5hZmprbGxqZ2RdVVFNTU9JRVFeZmptcHV7f4B/fHx8fH19e3l5dnZ0dHFtamhlY2FhYGBgVExOUVhfa3N8go2Um56en5+cm52dnJuZmZmYmZiXl5aWlpWVlJOTkZCPj46OjIuKiomHhoODgoKCg4OEh4mNjpCSkpKSkZCNioiFg4KCgoKChISGh4eHhIJ9d21mZGFZUUtIQTw7Ozs7Ozo7PDw7PDw9PTw8Ojs8PT8/QkJCQkBAP0A3NzY2Nzg3NzY2NTU0NDIyMTEyMjMzMTAvLy8vLy8vLy0tLi4uLi8vLi4vLy8vLi4wMDAwMDAxMTExMTExMTExMTExMTExMTEwMC8vLy8uLi4uLS0tLS0tLS0tLS0tLS0uLi4uLy8vLy8vLy8uLi4uLi4uLi4uLi4uLi4uLy8vLy8wLy8wMDAwMjIxMTExMDAwMDAwLy8wMC8uLi4uLS4uLS0sLCsrKysrKyoqKSgqKCcnJycmJiUkIyMjIiMiIiEhISEgICAgIB8fHx8eHh4fISIlKCktMztBREZISkxPUlNVVVNNPzQpJycnJykpKCgoKCkpKSkrKy0rKykqMGxsYF9hZGZWOEFEPDIzOUBEQktFSV9iYWZmYmNfY2RkZ2VndUtAPj89PkBBOTAvLjdFRURAODIxLi0vMjlAQkI/OzY1NDMzNjg6PD9CQj86NjIwMTEwMDEyMzQ0NTIyMDAvLy4uLi4vLi4uLi4uLS0uLi8vLy8vLy8vLi4uLi4uLi4vMz5JV1tWU0xBNzAvLy8uLi4tLSwsLCwsLS4uLi8xMDAwMDAxMTExMTAwLy4tLi0sLS0tLi4wLi4vLzAvMDAvMTU2ODw+QUNFSE1QVFZWWFVTTkVDQ0ZLRj9EUlthZmxvdn2AgX98fH18fH18e3l4d3dzcW9tamdlYmNhY2JcX2txe4OKj5KYm5ubnJ2dnZ2cm5ubm5uZmZiXlZWVlZSUkpCQkJCOjY6NjY2Li4uJiIaFgoGBgIGCgoWHh4uMjpCRkpKRjoyKhoSDgYKCgYKDhIWCg4J/d2xfVUpFQD9BP0JAOjw8Ozw7PDw8PDw8PTw8PTo5PDw9PT9CQ0NCQEJENzc2Njc4Nzc2NjU1NDQzMzIyMjIzMTAwLy8wMC8vLy8uLi4uLi4vLy8vLy8vLy4uMDAwMDAwMTExMTExMTExMTExMTExMTExMDAvLy8vLi4uLi0tLS0tLS0tLS0tLS0tLi4uLi8vLy8vLy8vLi4uLi4uLi4uLi4uLi4uLi8vLy8vMC8vMDAwMDExMTExMTAwMDAwMC8vMDAvLi4uLi0sLCwsKysrKysrKyoqKigoKicnJycnJiUlJCMiIiIiIiIiISEhICAgICAfHx8fHh4fICIjJiksMDQ8QURGR0pMTlBSUlNPRzctJycnKCcpKSgoKCgpKSkpKysqLCsoLGVraGhmY2dXN0FIRzgtLzc6PT5EP1BlZWdqZWNkZGJfYWViZmRHQkJERUVFRT4zLy4yNzlBRT4zLy4tLi8yOT5BPzk3NjY0NTU3ODs+QEBAPjo2MTExMDAxMjM0NDQ0MjIyMTAvLi4uLi0tLi4uLi0tLS0uLi4uLi4uLi4uLi4uLi4uLjE8RlNWUk5JQDYtLCwsLS4uLS0sLCwsLC0uLi4vMTAvLy8vMDAxMTEwMC8uLS4uLS0uLy8uMC8vLzAwMC8vLy8uLzAuLi8xMDQ2OD0+P0JBQT47Ozs+QkI+P0VOU1piZW51fX9/fn19fH1+fHt5eHl5dnRxb25ramdpbHJ2eHyCi4+SlpqZmpydnJybm5ubm5ubmpmZmpqYl5SUlJSUlJCMiYmIio2Pj4+PjY6OjIqIh4SCgYCAgIB+goSIiouMkJGRkJCOi4eFhIGCgYGBg4SEgYGAenJpXlRKQz9AQD9CQT08PDs8PDw8Oz08PDw7Ozs8Ozw8PT1AQ0RERUVGRjY2Nzc2ODY2Nzc1NTU0MzMyMjIyMjEwLy4uLy8vLy8vLzAvLy8vLi4uLi8vLy8vLy8vMDAwMDExMTExMTExMTExMTExMTExMS8vLi8vLy8uLi4tLSwsLS0tLS0tLS0tLS0tLS4wMC8vLy8vLy4uLi4uLi4uLi4tLS0tLS0uLi4uLy8vLy8vLy8vLy8wMDAwMDAwMDAvLy8vLy4uLi4tLCwsLCsrKysrKyoqKSgpKSgoJycmJiYlJSUkIyMiIiEiIiEhISEgIB8fHyAgIB4eHx8hJCYrLjI3P0JISUlKTE5PUFFRTUg6LCcmJiYnKCkoKCgoKiopKSopKSosLV1sZWdkYmZWLDxGUlFKPTMzNzs1NTpSZnFubWVeYWJjX11hZltST0tLSkhKSUhCODAvMTI1QEdEOjEtLS0tLTE2PDs7NzU1NTQ0NTY4PT0+P0A9OTczMjEwMTEyNDQ1NTQ0NDQ0MTAuLi4tLS4uLi0tLS0tLS0uLi8vLi4tLS4uLS0tLSwwOUJNVVBMRj81LSwsLCwsLCwsLCwrKywtLi4uLy8vMDAwMDAwMTExMTAvLy8uLi4uLi4vLy8vMDAwMDAwMDAwMC4uLi4uLi4uLi8wLzAwMTExMTM2Nzo7Oz09QUdLUFdfaHJ5foGAfXx9fn18e3t7enZ2dHNxb25vdHqCiI2QlZeXmZmbm5ubm5uam5uampqYmpeYl5eYmJaQi4+SkpKRiYWDgYWNkpSUlJWUk5KQjoyIhoOBgIB/fX+BhoiKjI6Pj4+OjouKhoSDg4KDgoGBgYKBfnt0bWlhXFBCQEA/QkA+PDw8PT07Ozs7Ozs8Ozw6PD0/Pz9AQkVGRkdHSEc3Nzc3Njg2Njc3NjU1NDMzMjIyMjIxMC8vLy8vLy8vLy0vLy8vLy4uLi4vLy8vLy8vLzAwMDAxMTExMTExMTExMTExMTExMTAvLy8uLy4uLi4uLS0sLC0tLS0tLS0tLS0tLS0uMDAvLy8vLy8uLi4uLi4uLi4uLS0tLS0tLi4uLi8vLy8vLy8vLy8vMDAwMDAwMDAwLy8vLy8uLi4uLSwsLCwrKysrKysqKignKSkoKCcnJiYlJSUkJCMjIiIhIiIhISEhICAfHx8fICAfHyEiIyYoLDAzOUFGSUlJSkxOT1BQTklENCgnJiYmJygoKCgnKSkpKigoKCgpLVtuZGdlYGhbLTI+R1RZWFFGODo8OTg/Xmx0cmxoamVeYGFhZmZcU1JPTE5PTkxMSD8zLzIzNz1DRj80Ly0tLSwtLzQ3Nzc2NTU1NDY3OTw9PkBBPzw5NjIxMDExMjM0NTU1NTc3NTIyLy8vLi0uLi4tLS0tLS0tLi4uLi4uLS0uLi0tLS0tLjdBSlJPSkY/NS0qKioqKiorKysrKyssLS4uLi8vLzAwMDAwMDExMTEwMDAwLy8vLy4uLy8vLzAwMDAwMDAwMDAuLi0tLi4uLi4uLi4uLi8vLy8vMTMzNjY3Nzg7PD9FTlljbnd9gYB+f4B/fn18enl7e3p5d3V2d3+Gio+TlpiXl5mZmpubm5uZmJiYlpSSjouJiYiIiYqLhICGi46NiX9ycnqCkpmdm5ubm5qWk5CPi4iEgoCAf4B+f4KFh4iJioqKi4uJiIiFg4OCg4KBgYGCgoF/fHhzb2hgUUI9PD48Ozs8PDw8Ozs7Ozs7Oz0+Pz9AQkJCQ0VHR0dISEhHODg3Nzc3NjY2NjU1NDQzMjIyMjIyMTEwMDAvLy8wMDAvLy8vLy8uLi8vLy8uLi4uLy8vLzAwMDExMTExMTExMTAvLi8xMTAwLy8vLi0tLiwtLSwsLCwtLS0tLCwsLCwsLi4uLi8vLy8vLy8vLi4uLi4uLi4tLS4uLi0tLi4uLi4uLi4uLy8vLi8vMDAwMDAwMDAwMDAwLy8vLi4uLi0tLSwsKyssLCsqKiknJycnKCgnJiYlJSUkJCMiIiEiISEhICAiIiAgHx8fHyAgICAgIyUoKSwxNTxDSUpJSElKS05NTExFPy4nJiUmJygoKCcnKSgpKCgoKCkqKFFtY2VkYWNdLi83PUZQV1hZTTcyOTo/PFx0cnJwY1lhXltgZmhlXVdTUVFSUVBOTEpDOTMzLzE4PUNBODEtKiorKiwuMTM1NDQ1Njc4ODc5PD5AQT49Ojc1MjAvMTIxMzQ1NTY4OTY0MzEwMC4tLi4uLCwsLCwrKywsLS0tLS0sLCwtLS0tLCw1QEZRTklFQDcuKCgpKSkpKioqKiwsLS0uLi0tLi4vLy8vMDAwMDExMTAwMC8vLy8vLy8vLy8wMDAwMDAwMDAwMC8uLi4tLi4tLS4uLi8vLy8vMDAwMTIyMjM0NDU1NjtJV2NteH+EgYB/f32Afnp5eHp7e3t7fICHi46Sk5WVlZaXmZmampmamJSRjYqGgXx1b2xoZmZrbXBxc3uChIJ0aG56i5ifnqCeoKCdmpmUkYyJhYB8ent7fX+AgYWGiImIiImJiYmGhoOCg4OCgoCAgICBgYB/fXdzaF1NQD88Ozo6Ozs8PDs7Ojs7Oz5AQEFBQkNERkZGSEdHR0ZGRjY2Nzc5OTY2NjY1NTQ0MzIyMjIyMjExMDAvLy8vMDEwLy8vLy8vLi4vLy8vLy8uLi4uLy8wMDAwMTExMTExMTEwLy4vMDAvLy4tLi4tLS0sLS0sLCwtLS0tLSwsLCwsLC4uLi4vLy8vLi4vLy8uLi4uLi0tLS0tLS4tLS4uLi4uLi4uLi4uLi4vLzAwMDAwMDAwMDAwMC8vLy4uLi4tLS0sLCsrKysrKiknJycnJyYmJiYmJSUkJCQjIiIhIiEhISAgISEgIB8fIB8fHyAhIyUoKysuMzc+RUpKSEVERkdJS0pHQzsrJiYmJycoKSknJykoJygoKCkrJU9pYmRlYGVhMCwzOD1HTlVZWFA0LzlBRUhsdHR0b2BYYFtaX2NoZ2BZVlRUUVBQUVBMR0E6NTMxMjc9QDoyLCoqKikqKi0wMTIzNTc4ODg3Nzk8Pj8/Pj06NzUyMTEyMTMzNDY3ODc2NTQyMDAwLy4uLSwsLCwsKysrKywsLCwtLCwsKyssLC0tMTxFTk1IRUA5NCooKSkpKSoqKSkrKyssKystLS4uLy8vLzAwMDAxMTExMTEwLy8vLy8vLy8vMDAwMDAwMDAwMDAvLi4uLi0tLi4vLy8wMDAvLzAwMDExMjIzNDQzMzMzOkdWYmx2fYGBfX+Bf35+e3Zzdnp+f3+Ch4qNj4+QlJSTlZaWl5eVkpCLhX93cGljW1VQTUhITVFgXV9kbnNxbGdzhZafo6KhoaGhn52bkYyHhH15dHJzc3h7foCCg4aHhYWGhoaGg4ODgoCAgYCAfn5+fn+Cg4J/eXFqXUxAPT09PDs7Ojw8PDs8Pj5BQ0NEREVGR0dHR0dGRkVFRUU3Nzc3NjY2NjU1NTU0NDMyMjIyMjEwMDAwMDAwLy8wLy8vLy8vLy0vLy8vLy8vLi4uLi4vMDAwMDExMTExMTAwMC8vLy4uLi4uLi4tLS0tLS0tLCwsLCwsKywsLCwsLCwtLS4uLy8vLzAwLy8vLy4uLi4sLi4uLi4tLS0tLi4uLi4uLi4uLiwtLi4vLy8vLy8wMDAwLy8vLy8uLi4uLS0tLCwrKysrKigoKCcnJyclJSYmJSUkJCQjIyIiISEhISEgICAgICAfHx8fHx8gICUnKissMDQ5QEZJSUhFQkJGR0dGRT81KSYmJicnKCgoKCcnKCgpKioqKlRtYGJlYWBjMSo1NjY9RElQV1hUPj09PjxLbHBzdFVWYGNhYmVlZWdjXVlYV1NQUFFRTUxGPjgxLzEzODw8MywrKikpKSosLzEzNTg5Ojk6Nzc3ODo+QEFBQD06NjQyMDEyMzM0NTY3NTM1NDIyMTEwLi4tLS0sLCsrKysrKywsKyssLCsrKiopKS44PkZLR0RBOjUuJycoJycmKCgoKSkpKSgpKystLS4vLi4vMDAxMDAwMTIyMTExMS8vLy8vLy8vLy8wMC8vMTEvLy4uLS0uLi4uLi4uLy8vMS8wMC8xMTEyMzQ0NDQyMjQ5Q1Nga3N5f3+Bg4B/fXx3cW90eH1/g4OFhoiJiY6Ojo2NjY6PjIZ+d29oYFhTTkxGQ0REREVNXVhST1RaX2dugZSeoJ+fnp+em5aRjIaAfHRvaWRkZWltc3d8foCBhISEhISDgoKCgYB/f31+f35+fX5+f4CEgH56cmdaRj48Ozs8PD48Pj4/QUJDRUZHR0ZGRkZGRkZGRUVFQ0NENjY3Nzc3NjY1NTU1NDQzMjIyMDAwMDAwMDAwMC8vLy4vLy8vLy8tLy8vMDAwMC4uLi4uLi8vLzAwMS8vLy8wMC8vLy8uLi4uLi0tLSwsLCsrKysrKysrKyssLCwsLCwsLS0uLi8vLy8wMC8vLy8uLi4uLi0uLi4uLS0tLS4uLi4uLi4uLCwtLi4uLy8vLy8vMDAwMC8vLy8vLi4uLi0tLSwsKysqKikoKCgnJycnJiUmJSUlJCQjIyMiIiEhISEhICAgICAgHx8fHh8fICIkJywtLzM5PEBGSUlHQj8/QkVGRUE9LygmJiYmJicnJycnJygpKSorLl9rYWFiX2RkNSYyOTs+PkJKT1BQST47PEFDVG1xcm5lW1ljYWVrbWtoZV5dW1lWUlBTUk9NSkU9MzAvMjQ5OTMsKyopKSkpKy4wMTQ4OTo7PDk3Nzc5PUBCQkE9Ojo2NTIwMDEzMzQ1NjU1NTU1NDMyMTEwLy8vLy8tLSwrKyssLCwsLCwrKyoqKSksMjpASEhDQDw2LygnJycnJycnKCkpKSkoKSoqKyssLS0uLi4vMTAwMDAxMTExMTEwLy8vLy8vLy8vMDAvLzAwLy8uLi0tLS0tLS0tLS4xMTIzMTExMTExMjM1NTU1MjIyNDdDUV5pcHqBgICAf318enZwb3F1eX1/gH+AgYGCgoGAfX19fntyaVxUTElJS0xPTkxKSEhJS1FRT0tJS1Rfb4aSkpOTkpKPjIiBe3NtZWBcWVZWWFtiZWlwc3Z7foCBgYGBf39/gIB/fn58e3t8fX18fH5+gIOBfHdvZFdGPT09QEFBP0BAQUNGR0ZGR0dHR0ZGRkZGRkVFRUZDQzY2NjY2NjU1NDQ1NTQ0MzIyMTAwMDAvLy8vMDAwMDEwLy8vLy8vLi0tLS4uLi4uLi4uLi4uLi8vLy8vLy8vLy8uLi0tLS0tLS0tLCwsKysrKysrKyoqLCwrKywsLCwsLC0tLi4uLi8vLy8vLy8vLi4uLi0sLS4uLi0tLS0uLi4uLi4uLi0tLS8uLi4vLy8vLy8vLy8vLy4uLy4uLi0sLCwsLCsrKSkpKCcnJycnJyYmJSUlJCQjIyMjIiIhISAhIR8fICAfHx8fHx4fICIkJSksLjI3O0BDSEhHRkE+PkJDRUNCOiwnJSUmJicnKCgoKScpKCopM2VsXmBfXWBqPyIvNDo8QEJAQ0hKSj84O0FAPFpxcXNvbWldZWdobHBwaWRhXl5cV1NQUVBPTktHQzozMDA1NDczLisqKSkoKCosLTA0NTc4OTo4Njc3Nzo9QUJCPjw7Ojc1MjExMTIyNDU2Nzc5NzU1MzQ0MjIxMzMzMC8uLCwsLS0tLSsrKiorKSkpKi02PERKQT86NTEqJyYnJyclJScnJiUmJycoKioqKisrKy4vLi4wMDExMTEyMjExMTAvLy4uLi4vLy8vMDAuLjAwLS0tLS0tLS0tLS0wNDQ1NTMyMjAxMjQ1Njc2NjMzMzM0Nz9OWmVvdnyAgYB+e3p4dW5rbG91eHt8fHp6eXh0c3FubWxnXlZOSkpJSUtNTE5OSkdHSEpMS0hGR0tOWm17fXx7fXl6dnFqYltVTUdEQkVHT1VZXl9kZWlscXR5eHl9f39/fn18e3t7enp7e3x9fHx7fH1/gH98dGtiVUlAQUFCQ0NERUVGRkZHR0dHRkdISEdHRkZGRkZGR0c2NjY2NjY1NTQ0NTU1NDIyMjEwMDAwLy8vLzAwMDAxMC8vLy8vLy4tLS0uLi4uLi4uLi4uLi4vLy8vLy8vLy8uLi4tLS0tLS0sLCwsKysrKioqKiorKywsKyssLCwsLCwtLS4uLy8vLy8vLy8vLy4uLi0tLS0tLS0tLS0tLi4uLi4uLi4tLS0uLi4uLy8vLy8vLy8vLy8vLy8uLi4tLCwsLCwrKykpKSgnJycnJycmJiUlJCQkIyMiIyIiISEgICAgICAgHx8fHx8fICEjJSgrLzM4PEJFR0lIRkNBPj5BQkRCPzcpJyUlJiYnJygoKCgqKisnOmtpXl9fXWJvRyAtMjM4OkRHS0ZFSEc9PlFkW0RPamxtZ2ppZWdrbXBxbmllZmBcWldUUU9NTExLR0Y+NzExNDM2My4tKykpKCgpKistMTMzNzk6NzY2Njc3Oj0+Pj48PDs5NzUyMTExMjM0MzU1Nzk6NzY3NTMzMzMzMzAvLi4uLi0tLCwrKyoqKioqKSgrMTlARkM+OjUzLignJycnJSUlJSUmJSUlJicpKSkqKSosLC0uLjAxMTExMjIyMjIxMC8uLi4uLy8vLy4uLy8uLi0tLS0tLS0tLS0uMTU2ODg0MzIwMjM1Njc3ODgzMzMzMjQ2P0pZY211eH6BgH17eXZybWprb3J2e3x8enh3dXNxbmlpZGFcWFJQTktLS0tKSUZDQ0RGRUNDQkBBRE9aW1lZWVlZVlFORkE9OTg3Nzk/RUpSVlxfX19hY2VpbXBxdnp9f39+fHt6enp6e3t7fHx8e3t8fn+Af3lza2FXS0NERUVFRERFRUVFRUVGRkVGRkZGRkZGRUVHRkdFNjY1NDU1NjY0NDMzMzMyMjEwMjIxMTAwMC8vLy8vLy8wMDAuLi4uLi4uLS4vLy4uLS0tLS8uLi4uLi4uLi4tLS0tLCwtLS0tLS0sLCsqKioqKioqKSkqKywsLCwtLS0tKywtLS4uLy8wMC4uLi4uLi4uLi4tLSwtLS0tLS0tLS0tLS4uLi4uLi4uLi4uLi4uLy8vLi4uLy8vLi0tLS0tLSsrKyspKSkoJycmJiYmJiYkJCUlJCMkJCMiISEgIB8fICAfHx4eHh4fHyAjJCgrLTE4PERHSkxMSkdCP0FCQ0VGQj0yJignJiYmJycnJygnKSkpR29nYFteYWJqVSEuOjw9PTtFR1hPTEpIQj1FT1dXWGRqaGdpaWFiaXFyb2pjaGhkX11aVlRRTElLSUZEQTo2MTQ2NzUvLCwrKykpKSkqLC0wMTU5ODg4NTU1Njk6Ozw+PT09Ozk3NTQzMDAyMjIyNTY4OTk3OTk1NDQyMTAxMTAwLy8vLisrLSoqKioqKSkoKS01O0BDPjs3My8sKSUkJiYlJSUkJSUlJSUmJycnJygpKiosLS0tLi8wMTIzMjIyMjAwMDAuMC8vLy4tLS4uLS0sLCwsLCwqKi0tLzE0Njg1MzQ0MjIzNDU4OTY2NjY1MjExMzQ9SVZgaXJ2fYCBfnp5dnJsamZrb3R4fHt9e3p6d3VzcW1pZV9bWFRRTUxKR0VCQD89QD4+PDw7Oz09Pz8/Pz8+PDw5Ojo6ODk6Ojk6PEJITVNYW15gXl1fXmJlaGxwdXh9fnx5eXl4eHp6e3l7e3x7fHx+f398eXRsZFpNRkZERkZFRUNDQ0NDRUVFRURFRUZHRkhIR0ZIRjQ0MzMzMzIyMzMzMjMzMTEyMTExMDAvLy8uLi4uLi4uLy8uLi4uLi4tLi0tLi4tLSwsLCwsLS0tLy0tLS0tLCwsLCwsLS0tLSsrLCwrKikpKSkqKiopKissLCwsLCwsLCssLS0uLi8vLy8uLi4uLi4uLi4uLS0sLS0tLS0tLS0tLS0tLS0tLS0uLi4uLi4vLy4uLi4vLy4uLi4tLS0tLS0rKisrKSkpKCcnJiYmJiYmJSUlJSQjJCQiIiEhICAfHyAgHx8eHh4eHyAgIiUqLC4yOUFGS1BPTEpHREJBQkVGSUY8LCgnJiYmJigoJyklKCcpVmxjX1xiaGdsUx4ySkxMTlNVSkdKTktJQTxEQEJHUV5hZWdoamlfZ2pucGxiZWpnYmFjXldUUExIR0ZFREI9ODM0Njc1LysrKysqKioqKSkrKzAyNjk5OTU1MzQ0NTc6PT4+Pj07OTc1MzIxMTEzMzMzMzU4ODg4NzY0MjEvMDAwMDAwMC8uLSwsKiopKSkpKCkpLTY7QD46NjQxLiomJCYmJCQlJCUlJSUlJicnJycnJykpKyssLC4uLzAyMjIyMjIxMTExLy8vLy4uLS0tLS0tLCwtLSwrLCwsLS8xMTM0NDEyMzQzNDQ1Njg2NjY2NjQxMTM0NDxGUltlb3Z7fYB9eXd0cmtkZ2pscXV5e3t8fHt5eHd0cm9rZ2NgXFdWVFFOSkZBPDo4ODg4NzY3Nzo6Ojo5Ozs7PD0+Pjw5Ozs5OTs/RUpPU1teYF9gX1xaWVtgZWpxdnp7e3l5eHh6enx7eXt7fHx8fH1+f315dG1jW05FRkZFRENEQ0JCQkNDQ0NERUZHR0lJSEhGR0Y1NDIyNDMyMjMyMjIxMTExMDAwMC8vLy8vLy8vLi4uLi4uLy8uLi0tLS0rKywtLSwrLSwsLCwsLC0rKioqKysrLCwrKywsLCwrKysrKysqKikpKSkpKSkqKysrKysrKyssLCwsLi4tLS0tLi4uLi4uLi4uLi0tLS0tLS0tLS0tLS0tLSwtLS0tLS0uLi4uLy8tLS4uLjAtLS0tLS0tLSwsKyoqKioqKCcnJyYmJiYmJiYmJSQjIyMjIiIiIiAgHx8fHx4fHh4fHx8hIiUoKS0vNDtBSE1QUExJRkVCQEJCREpHOCoqJyQkJignJycmJyQ3Zm1jXV9jaGhsWiYrQ0tKTk1PVFNLSU5HQDlOYVZaV1JdZGlsa2txbmxucG9iX2VnZ2ViYl9XU1BMSENCQUNCPzozMDI1NC4sLCsrKyssLCsqKistLzM1Nzg2NTIxMTM2ODg7PD0+Pj4+Ozk1NTMxMjMzMTAyNDQyNTc3NTQyMjAwMTEyMzQzMS8tLSoqKikpKSkoKCgxODs9OjY2NDAuKyklJSUlJSUlJSYmJiYmJiYmJycoKCkqKiosLC0uMDEwMDAwMTExMTEvMDAvLy8vLi0sLCwrKiorKisrKy0uMDExMTExMjMzMzIyMzQ1NTU2Njc2NjY0NDU1OUFOWWJrcXh+f314dXJuaWVmZ2ptcXZ5e3t7enp6eHh2dHBsaWdmY2FdWFNNSUZEQT46OjY3Nzc2Nzc4OTk8PD09PDw9PDo5ODg5PEBGSlBVWl1gYGBdW1VTVFpdZGhwdnt7enp4eXl5e3t7fH18fXt7fH19fHh0a2JbT0VERURDQ0JBQUFDQ0NERUZGSEhKSklIRkZEMzMyMjIyMjIyMjExMTAwMTAwMDAvLy4uLi4uLi0tLS0uLi4uLS0sLCwsKysqLCwrLCsrKysrKysrKysrKywsLCsrKiorKysrKioqKioqKiopKSkpKSkpKisrLCwrKysrLCwsLC4uLS0sLS4uLi4uLi4uLi4tLS0tLS0tLS0tLS0tLS0tLi4tLS0tLi4uLi4uLS0uLi4uLS0tLS0tLS0sLCwrKioqKignJycmJiYmJiYmJiUkJCQkIyIiICAgICAfHx8eHx4eHx8gIiMmKSksLjI4PkRHSktLSUZFQkNCQ0JGQjAoKycmJyYnJycoKiVAcG1iYmBmZmhvTCMqMEVRSkdGQEJMUUZLSj88RlRbZFdWY2lub25sb3BrbHBlV19qamhpY2FfWFJSTUlEQT4+PTw5My8wMTEsKysrKysrLCwrLCssLC8uMzU2NTUzMS8wNTc3ODk7PD5AQD89Ojc2MzM0MzAwMDExMTE0NDQ1MzMyMjIyMjM0MzIwLS0sKiopKSkoJiYnKjM4Ojw4NjU0MzAsKigmJSUlJSUlJSUlJiYmJiYmJycoKSoqLCwtLy8wMDAwMDExMTExMDAwLy8vLy4tLCwrKysrKiorKyssLS4uLi4uLzAxMjIxMjMzMzU1NjY2NTU1MzM0NDM3P0tUXWVtdHl+fHZycG5sZ2JlZ2pvdXh7e3p6enp5eXd0cm5sa2tpaGRgW1hVUE1IRkE7ODc3NjY2Nzc3Ojo7Ozs7Ojo4ODc3Nzk8QkdMUVdbXV9fXVtXUU1NVFlgZ3B0d3p6d3d4eXl6enl7fHx8e3p5e319eHJpYllORURDQ0NBQkFBQ0NERUZGSktKSkpJR0ZFRDExMzIyMjIyMTExMTEvLi8vLi4uLi4uLi4tLS0tLS0tLC4sLCsrKiwrKyssKysrKioqKiorKyoqKysrKyoqLCwqKSoqKiorKyoqKiooKioqKioqKyopKioqKisrLCwsLCwsKystLS0tLS0uLi4uLi4tLS4uLS0tLS0tLS0tLS0tLS0sLC0tLS0tLS4uLi4uLi4tLi4tLC0tLS0tLS0tLCwrKysrKSkoKCcnJiYmJiYmJiYlJCQkIyMjIiIiICAfHx8fHh8fHx8fICMkJyosLS4yNjtAQkZJSklHR0RBQUFAPzgtKiwoJyUnJyYoJyc8cGtkZGVnamxoPR4rLzM/WkxDRkc8UFJOS0lHRkxRX2ZgWF9nbW9vbnBxb3BvZl9lamhnaWZmYV1YUk5HQj07Ojs6NzQxMTAtLCsrKiopKiwrLS0sKiwuLzAxMzQ1NDIwMDM3NTg5Ojo8PkFAPzw6ODY5NzUzMS8vLi8vMTIyNDQ0NDMzMzU1NDMxLy4tLCwqKSgqKSclJyctMjQ5OTg1NjcyMC0rJyUlJSUkJCQkJCUlJSUmJCUlJygqKiwsLi4uLi4uLi4tLS0vMDAwMC4uMC4uLSwsKysrKysrKiorKywsLCwtLS0tMDExMTEyMzM0NDQ0MzMzMzIyMzIxMjY6Qk5XYmpxeHt6dXJtbWtmYmJla3F0dnp4eXp5eHh2dHRvbG1tbWxqaWdnYl5aVlFMRT85ODY2NTY3Nzc3ODk6Ojk5ODg2NjU2OT5CRk1TWFxeXl5dWVVOSUhKU1tja3F3ent4dXZ2d3h3d3l6e319ent7e3p2cGlgWFBGRENCQEBBQkNERERHSEhKTEtKSEdFQ0ExMTEwMTExMTAwLy4vLy0uLi0tLS0tLS0sKysrLCwsLC0sKysrKyorKSorKyoqKikpKSoqKioqKisrKiopKSsrKSkqKikpKSkpKSkpKCkoKCcnKCoqKSoqKiorKywsLCwrKysrLCwtLS0tLS0tLS0tLS0uLi0tLS0tLS0tLS0tLS0tLCwtLSwsLCwtLSwsLCwuLC0uLSwtLS0tLS0sLCwsKysrKykpKCgnJycnJiYmJiYmJiUlJSQkIyIiIiAgHx8fHx4eHx8fHyEkJSkqLC0uMTY7P0NFR0pKSUhFQkJBQDkuKisrKCcoKSgoKCo+a21mY2ZrbW9nNSYuMTA9WFhLTktKTE1SU05ERkZQUWhpZWFmbHRvbGtubmtubGBiZGZmZWZnaGZfWlZSSkI9Ozo4NjY6OzgzLy0sKigoKSoqLC0uLy4uLi4uLzEyNDY0MjIyMzU2ODk5OTw/Pz49Pjw6Ozk3NTMyMjEvMDEzMjMzNDQzMzM0NDMyMS8uLSwsKyopKSkoJyYmKSwxNTo6OTk3NjYxLywnJCUkJCQkIyMkJCQkJCQmJicoKiosLC0tLi4uLi4uLS0tLy4uLi4uLy8vLi0tLSwsKysrKyoqKyssLCwsLS0uLi8vLy8wMTEyMjIyMjExMTEyMjEwLzAyMzU+SlZeZ290eXl2cnBtbGhjYWVqbHB0d3h5eXh2c3FvbWppaWpqa2ptbWtpZWBaU0tEPDg3NjY2NjY3Nzc3Nzc2NjY2NTU1NzY4PkRJTlRaXFxeXl1VUUpGQkdPWGFpb3R4eHh2dHR1dnZ1dXl7e3p4eXl6eHZxaWJZUEVDQUJCQ0RERUdISUpJS0tKSkhGQ0FCMDAwMDAwLy8wLy8vLy8wLi0tLS0rLCwsLCosLCwsLCwsKyoqKSkqKSgpKSkpKSkqKSkqKSoqKiorKyoqKSkpKSgoJygoKCgnKCgpKSkoKCgoKCgoKSkqKioqKioqKisrKysrKywsLCwsLCwsLCwtLS0tLS0uLi0tLCwtLS0tLS0sLCsrKysqKisrKysrKysrKysrLS0tLS0sLCsqLCwrLCwsKioqKigoJycnJyclJycmJiYmJSUkIyQjIiIgIB8fHx8eHh4eHiAiJSgpLCsuMTQ3PkJFRkhJS0pJSEREQz8wKikqKCYoKiYpKCopZHBnZWVqam9XKigwLzREVlxMS0hJTEtCSVJLRT9JWV9ZWFtganBza2pqZWxubGdfYWVnY19hZmhlX11ZVU5HQj06ODc5PUQ/NTEtKykoKCgoKywtLS8vLi4tLS4vLzMzNDU1MjExMzY3Nzk7PDw8Pz8/Pz4+PDk4NjY1MzMzMzQ0NDQ1NDIzMDAwMDAuLS4uLSwrKikpKSgnJicoLDI3Ojo7Ozk4NDEuKiQjIyMjIyIiIiIjIyQlJCYoKSosLCwsLS4uLi4tLSwsLC0tLS4uLy4vLy4uLi4tLSwsLCwrKywsLCwsLCwsLS0tLS4uLy8wMTAwMDAwMC8vMTEvLi8vLy8xNTtGT1xja3J5e3d0cG1paGVhYWdqb3J1d3d0cXFua2loZmRkZGhqaWpsamdkX1lRSD45ODc2NjU1NjY3NzU1NDQ0NDU1NTU1Njk/RUxRV1lbXl9dWlNNSUNASVBYYGdudHl5d3VycnN0cnJydXl7eXl5enx4dnBqZFxTSkFBQ0RGRUhKSkpKSUlLSklGRkNBPy8vLy8uLi4uLy8uLi8uLy0tLSwsKywsLCwqLCwrKykpKCopKSgoKSgnKCgoJygpKSoqKikpKSkpKiopKSkpKSkoKCcoKCgoJicnKCgnJicnJycnKCkpKioqKioqKioqKisrKyssLCwsLCwsLCwsLS0tLS0tLS0sLCwsLS0tLS0tLCwrKysrKiorKysrKysrKysrKysrLCwrLCwrKiwsKysrKyoqKiooKCcnJycmJicnJiYmJiYmJCMkIyIiICAfHx4eHh4dHh4gIiYpKiwuMTQ4PkNFRklKS0tKSklGRkY5KysqKiknJiYnKCgjVG9qaWpucG9PLDQzLi00Q0pOT1FNU1NTT0xLREJHR1teVUtcYmlxb21tamdtb21pZmRiYWBgX2NmYl5aWVZQS0Q/PDw9PDxCPTUzLykoKCgoKCkrLC8vLi8uLS0tLS0vMjQ2NjMyMTEzNTY4OTs7PT8/QEBAQD8/PTw7Ojk5ODg4ODc1NTQxMC4uLi4sLi0uLi0sKyopKSkoJycmJygtMTQ3Ojs5NzYzMCwoJCMjIyMiIiIiIyMjJCUnJicoKiwsLC0uLi4uLS0sLCwtLS0tLS8vLy8uLi4uLS0sLCwsLS0sLCwsLCwsLC0tLS0uLi8vLzAwMDAwLy8uLjAwLi4uLi4uLzEyOEROWGBocHV6eXdvbGpnZWJgYWducXNzdXFvbWllZGJgW1xeYGNmaGloZF9ZUEc+OTg4NjY1NTY2Nzc1NTQ0NDQ1NTQ0NTY4PkNKTlRaXF1fXVtXUEpFRERKUVpiaHBzd3h2dHJwcXFxcnJ1ent6eXl6e3p3c29nX1hNRkVDR0hJSkpKSklJSUlJRkRBPTwuLi4uLS0uLi4tLSwtLi0tLCwpKSoqKiorKCgoKCgoKCcnJycnJycnJycnKCgoJycnJygoKCgpKSoqKCgoKCkpKCgoKCcmJiYmJiYmJiYmJicnJicpKSoqKiorKykpKSkpKSsrKysrKyssLCorKywtLCwsLCsqKysqLCwrLCwsLCoqKiorKysrKiorKysrKysqKioqKiorKissKysrKysrKioqKioqKSkpKSgnJicoKCcnJSUmJiUlJCQhISAgICAfHh0dHR4eICQoKywvMTM3O0FHTE1OTEpLSkxLSkpDLiYpJyUnJycoKCcmTXFoY2lvcGk/IjMwMC8xND1HUlpeWFZYWVVNSUI2PEhiY1pZaHFtcnJxbW5taWlqa2dkYV9iYF9eXVxVU1VTUU1JQ0BAQz84Ojk1NjEoJicnKCgoKSkqLi8wMC4sKysrLCwtMDMxMDEvMDI1Nzg4Ojs9Pz8/QEBBQUI+QEBAPz4+PTs7ODU0Mi8tLC0tLSwtLiwsKyoqKSkpKCcmJiYlJisvMjQ2ODg0NDEuLCciIyMjIyMjIyQkJCQlJicoKyssLC0tLi4sLCsrLCwtLS4uLi4uLi8vLy8uLiwsLCwtLS0tLS0uLi0tLS0tLS0tLi4vLzAwMDAxMS8vLi4vLy4uLS0uLi4uMDE3P0lTXGVtc3d3dnBqaGhkX15eZmxucHBwbmxnYmFeW1dUU1NYW2BlYV9aV01FPTk4NjY2NTU2Njc3NTU2NjU1NjY2NjY2OTxBR01TV1pcX11cWVNOSEZFSE1UXWVrcHV3eHh2c3Btbm9wcXN4e3p5eXl7end0cWpjW1VNSUhJSElKSUdJR0hHRkNAPTs5Li4uLi0tLS0tLCwtLSwsLCwrKiopKSgoKCcnJygoKCgnJycnJycnJygoJygnJycnJycoKCgoKSkqKikpKCgoKCkoKCgmJiYmJiYmJiYmJiYnJyYnKCgpKSkpKiooKCkpKSkrKysrKysrLCsqKissLSwsKywqKissLCsqKiwsLCwqKioqKysrKyoqKisrKyoqKioqKioqKyoqLCsrKysrKyoqKioqKikpKSkoJycnKCgnJyUlJiYlJSQkIiIgICAgHx4dHR0eHyIlKSwvMTQ3Oz1CSE5SUU9NTEtLTUxINyomJignJicmJigkTnRpZWpqbGUyIzEyMC4zMDZFSU9XWVZWVldWTUQ7MDhGXlJVW2FranJ1cW1wcm5qaWdnZGJgXV5eWVVUTk1QUk5MTUY/P0E8NzYzNTUxKycnJygoKCgpKi0uLy8uLSwsKysqKywtLjAwLzAwMzU3Nzg6Ojs8PkBAQEBBQUJCQkFBQT89Ozg3NTMxLy8uLS0sLCwrKysqKikpKScnJiYmJSQmKCsuMDI1NDQyLy0pJSMjIyMjIyMkJCUlJSYnKCsrLCwsLC0tLCwrKywsLS0uLi4uLi4vLy8vLi0sLCwsLS0tLS0tLi4uLi4uLS0tLS4vLy8wMDAwMTExLzAwMDAvLi0tLi4vLzAxMjI7RVBbYWludnl1cG1qaWVfWl1iaGtucXJwbGZiXllVUU5MT09TWFlXVVBKQjk3ODY2NjY2Nzc4ODc3Nzc4ODk5OTk6Ojo7QUZLUVZZW1xdXlpVUUtHRkhNUlhhaGxwdXd5eXdybW1vb25vcnZ7enp6e3x8eXh0b2xjXFJLSUlJSUhIR0VFREM/PTs3Ni4uLi4sKy0sLCwtLSwsLCwrKioqKignJygmJiYmJicnJycmJicnJycnJyYmJSUnJycnKCgoKCkpKCgpKSgoKCcnJycnJSUlJSUlJSUlJSUlJiYmJiYmJycoJycnJygpKSkpKikqKysrKisrKysrKywrKysrKioqKikpKysrKisrKioqKioqKioqKikpKSkqKioqKioqKioqKioqKisrKysqKioqKiopKSkpKSgoKCgoKCgnJSUlJSUkJCIiISEgIB8eHh4eHyAkJiktMDM3Oz5AQ0hNUFFPTk5MTE1LPy0pKCgnKignJiUmVHZqZWZqZGdDIy4yMTAuLS85SE9SWFlZXmRaVE1HPjE8SFpaVFdeaGptcXFzd3ZxaWFhZmRfWlleX1ZQTklISk5NTU1JREJAPDg1NDc3NC0oJSYnKCkpKSksLy4uLS4uLispKCgnKSkqLS0uMDE0NTY2ODk5Ozw9Pj8/QT0+P0BAQkJBPTo6ODY2NDIxMC8vLSwrKiorKikpKCgnJiUlJCMkJCQlKSwuMTIzNC8uKyYjIiQjIyQjJSUmJiYnJygqKioqKysrKywsLCwtLS0tLi0uLi4uLi4vLy4tLCwsKy0tLS0tLS0tLS4tLS0tLS0tLi8vLzAwMDExMDAxMTAwLy4wMC8vMDAyMzAxNDlBSlZdZmtyeHdxcGplY11aWl5jZ2xtb25sZ2JbVlNQSUdHSEpNTUtGQz04ODo5ODg3Nzg4ODg4ODg4Ojw8PDs7Ozs8Oz9DSE1SWFpaXF5bV1JKSUdJTFFVWmFnbXF0eHl4dnJtb25wcXJzdnt7e3t8fYCAe3hzb2hhVk5JSEdHRERDREE/Ozo3NTIsLCwsLS0sKisrKysqKioqKiooKCopKSkmJSUlJiYmJiYmJSUmJiYmJycmJiUlJycnJyYmKCgpKSgoKCgoJygoJycmJiUlJSUlJSUlJSUlJSYmJiYmJicnJyYmJicoKSkpKSopKSkrKyoqKioqKiorKioqKysqKiopKSoqKiopKSkpKSkpKSkpKSkoKCkpKSopKSkpKSkpKSoqKSkqKioqKioqKioqKSkpKSkoKCgoKCgoKCgoKCYlJCQiIiEhICAfHh4eHh8gJCgqLTAzNz9DREVISUpMTU9NTUxKQjInJycnKCopJSUkU3RrYWZoaWlNJi4xMC4uLSsvPk1XUFVWWV9fXVtUSD43Q1FeXlVXY19baHRzdHd5enFmZmtpYFtaW1xaUktJSEpKSktKSkZEQTw4NzU2NTQtKCUmJygpKSkpKy0sLC0uLi4uKicnJiQlKCorLS8yNTU2ODk4ODs8PDw9PT07Ojo7Pj4+PDk6Ojo6ODczMjEwMC4sKyoqKispKSgoJiYlJSMjJCQjIyUmKiwuMTEvLi0qJSUkIyMkJCUlJiYmJycoKioqKisrKyssLCwsLS0uLi4tLi4uLi4uLy8uLSwsLCssLCwsLS0tLS0uLS0tLS0tLS4vLy8vMDAwMDAwMTExMDAvMTExMTIyMjIyMzIzNj5HUVlhanB1eHJuaGNeW1ZZXmBla21ubm5oY1xWU05IREFAQ0NCQD09Ojs8Ozo6Ojo7Ozs7Ozs7Ozw9PT09PT09Pj09QkRJUFNXWFpcWVdUTkpLSkpOU1dcZGdrcXR4eXh2cm9tcXJycnR5fHt7fICBg4F+fXdxbGFVTElIRUJDQj89Ozk3NjMzKyssLCwsLCsqKioqKSkpKSgoKCYmJiYmJiUlJSUlJSUlJSUlJSUlJSUlJSUlJSYmJycmJiYnKCgoKCgoKCgnJyYmJSUlIyUlJSUlJSUlJSUlJSYmJiYlJiYmJiYnKSkoJycqKCkpKCkpKSkpKSkqKioqKysqKSkpKSkpKSgoKCgpKSkpKCgpKSkoKCgpKSkpKSkoKCgoKSkpKSkpKSkpKSkpKiopKSkpKSkpKCgoKSkoKCcnKCgmJCQlJCMiISEhHB4eHR4fICUnKi8yNzpARUdGR0VGSUtOTk1KRDcsKigoKCkqKyQjQXttX15lZGpfJSsxMDM4LysrLThETE9SU1VaW15dUUpCPUhSV1lRUlpSVGJyc3R4fXx3dXNvaGBcWVZVVFBISElIR0dFRkpHREE+OTc2NTQzLignJycoKCgnKSorKysrLS8vLiwqJyUiJCcoKy4wNDY3NzY2Nzk9PDw8PTw6OTc2Nzk4ODc3Ojs8PDs3NjMyMC8uLCoqKioqKSkoKCcmJiYjJCQkJCQjJCcqLS4xMC8uLCkmJCQkJSUlJSYmJycoKCkpKiorKywsLS0tLS4uLy8vLC0tLS4uLi8vLi0sLCsrKiorKysrLC0tLS0sLS0tLS4uLi4vLzAwMDAxMTEyMjIxMTMzMzM0NDU1NDM0NDY3PERMVF9lbHR2c21oY19ZVVRYXmNna21tbWplXVhSTkhFPzw6PD4+Pz4+PT4+Pz8/PDw9Pj8/Pz9AQD8/Pz8+Pj49PD5CSExQVFZYWVpXVVBMS0hJTlJVWV9kaG5ydnl6eXZycXFxcnNzdnl+gICBgoOFhIJ+eXJpX1FHRkM/PT07OTY0NDMzMCsrKywsKyoqKioqKikpKCgoKCgmJiYmJiYlJCQkJCUlJSUlJSUlJSUlJSUlJSUmJicnJiYlJigoJycoKCgoJycmJiUlJCUlJSUlJSUlJSUlJSUmJiYmJSUmJiYmJycnJycnKSgoKCcoKCkpKSkpKSkoKCkpKSkpKSkpKSkoKCgoKCgnJycnKCgoKCgoKSkpKSkpKCgoKCgoKSkpKSkpKSkpKSoqKSkpKSkpKSgoKCkpKCgnJycnJyUlJSQjIyMhIR8fHh0eHyAlKSwvNDo9QkdJSUhGRUdKTk9OTkc+MykpKSkqKSgoLXF3aWBkaWpiNSUuMTEyMi0qKiw1QkxOTlNXW11cWk5GPDhIVllbW1NgZFlbYm1wdHN3d3d1bmphWlRRUFBMRkdISUZEREVJSkhDQj87OTg4NTErKCgoKSkpKiknKSorKywuLi4sLSwoJSQkJyouMjY4ODc2Njg6Oz08PDw7Ojk2NjQ2NjY1Nzc7OTg5NzUyMS8vLi0sLCwsLCoqKSkoJycnJiQkJCQkIyQlKCouMDEvLzAtKSgmJSUlJSUmJicnKCgpKSkqKyssLC0tLS0uLi0tLS0tLS0uLi4uLi4tLCwrKyoqKysrKywtLS0uLi4uLi4uLi4uLy8wMDExMjIxMjMzMzMzNDQ0NTU3Nzc4Nzc3Nzg7QElRWWRocHR0bWhhW1pTUlZdYGRrbW1saWReWFVPTEhDP0BAQEFBQUBAQEFBQUBAP0BBQUFBQEA/Pz09Pj48Ozs8P0JHTVNVVlhZWVZSTUxKTE5SVFhcYWZrcXN2d3p5d3RycXF0dnh4fX+BgYGDhYaFg393b2NWR0NAPDs6OTY0MzMyLy4qKikpKioqKikpKCgpKSgoJycnJiYmJiYlJCMjJCQkJCQkJSUlJSUlJSUlJSUlJSUmJiYmJiUmJigmJygoJyYmJycmJiUlJSUlJSUlJSUlJSUlJSUlJSQkJSYnJycnJycnJygoKCgoKCgoKigoKCgoKCgoKCkpKSkoKCgoKCgoKCcnJycnJygoKCgoKCgoKCgoKCgoKCgpKSgoKCgoKCkpKioqKikpKSkpKSopKCkpKSgoJycoKCclJiYlJCMjIiIhICAeHh8iJSgsLzQ7P0FFSElHRkVGTE5PTk1ORzcnJykqKikoKF17bWNlaXBoQCEuMjAvLiwqKSstN0FGSlJSVFheY15PRUE9TV9mZmpud3FfWVNgZWRrcnh5dW1qZFtWU1BPSkRFRkhGRERESEhHRkZGQz46ODUyKykpKSsqKywsKCgnKSssLS4tLC4sKiknJiYoKy41OTg1NDc5OTw8PTw6Ojk3NTU1NDU1NTU2NTM2NjYyMTAvLy8uLSwvLi4sKyssKioqKiclJCQkIyQkJCUpLC4yMTEyMS4rKCUjJScnJiYmJygoKCgpKisrKyssLCwsLi4uLi0tLS0uLi4uLC0uLiwrKysqKioqKyssLC0tLy4uLi4uLy8uLi8vMDAyMjMyMjEyNDMzNDU1NTY2Nzc4ODg4ODg3Nzk+RU1VXWVtc3JtaWJdW1dTVlxfY2draWppZWNbWFRPTEdFREJDQ0RDQkNDQkJBQUFBQkJCQkBAPz08Ozs7Ozk5OjtARUtQUldZWlpYU1BPTE9RU1hZXGFjaGxxc3Z5e3t4dXN1dXV3enyBg4SCgoOFhYOBenFmWUhBPDk4NzU1MjExLiwsKiopKSgoKiopKSgoKSkoKCcnJiYmJiUlJCQjIyMkJCQkJCUlJSUlJSYmJSUlJSUlJiYmJiYlJycoJicnJycmJicnJiYlJSUlJSUlJSUlJSUlJSUlJSUkJCUmJycnJycnJycoKCgoKCgoKCgnJycnJycnJycoKCgoJycnJycnJycmJiYmJiYnJycnKCgoKCgoJycoKCgoJycoKCgoKCgpKSoqKiopKSkpKSkpKCgpKSkoKCcnKCgnJSYmJiUkIyIiISAgHh4fJCYoLC4zNzs8P0FEQUBBRUtMTU1MSEM0KCgnKSkqJVV3b2xobnJwVyYrLzMvLi4sKyoqKzhAS09SUlVWVlleUUNDT15na2pnbWpWWWFeWldXY29ydHBsbmlfWVZSTkhDQENFR0ZFRkdFRkhJSUZEPzs5NC4qKi0qKi4xMS4rKCcpKywsLCwtKywrLCkpKCktMTY0MzQ1Njg4Ozo5ODg3NjQyMjIzMzMzMzIyMjIyMTAvLy0tLS0tLi4uLiwtLSoqKiooJiUlJSQkJCQlKCouMTAwMjEwLisoJiUmJiYmJicoKCgoKSorKysrLCwsLC4uLi4uLi0tLy8uLiwtLS0rKysrKioqKisrLCwtLS8uLi4vLy8vLy8wMDExMjM0MzIzMzMzNDQ1NTY2Njc3ODk5OTg4ODk5ODtBSVFbYm5yc29sZWBbW1lYWV9jZ2lrampoZV5bWFNQSkdFREVGRUNDQ0JCQUFBQUJCQkJBQD89PDs6Ojk5OTk6PkVITlJVV1taWVZTUVFSVFZYW11gYmJobXBzd3h8fHp4dXN2eHx8foKFhIKAgoJ/fnlyaVtKPjg3NTQyMjAvLi0rLCoqKSkoKCkpKSkoKCkoJycnJiYmJSUkJCQkJCQkJCUlJCQkJCUlJSUlJSUlJiYmJiUlJycnJycnJyYnJyYmJiYnJyYlJSUmJSUlJSUkJCQkJCQlJSUlJSUlJiYmJyYnJygoJycnJScoJyYmJiYmJiYnJyYoJycnJycnJiYmJSUlJSUlJiYmJiYlJSYmJycnJycnJycnJycnJygoKCgoKSgoKCoqKSkoKCkpKSgoKSkpKScoKCgoKCgnJycmJCMjIyEgHh4fICQlKiwtMTQ2Nzo8PTs+QEJJSkxKSkY+MionKCkoJVN5b2NhZ3NvXSQnLy8uLS0rKyoqKiwvQktNUlNTUVBVW1pMRE5ia29vZXJqX1toZWFhTVdnbG9ta2pnY15dWE5HQj9AQUNFRkRERUhJSUhGREJAPTcvLCwvLzAzNjgyLionKCgpKSssKywtLS4uKystLTAwMDAxMTIzNjY3NjU0NDExMTAxMjIyMjEwMC4vLy8vLy8uLi0tLi4vLzExLy4sKikpKikoJyYmIyUkJCUpLTEzMjMzMzAvLCkmJSUlJicnJygoKCoqKyssLCwsLC0uLi4uLi8uLi8vLy8uLi0rKiorKyopKSsrKysrKywuLy8wMTExMTIyMjIyMjIzMzMzMzQ0NDU1NjY2NjY2Njg4Nzc5OTg4ODc3Nz9GT1pjaXF1c25qZWBeW1lYXGBlZ2hrbGlkYFxXVVBLSEhHRkVFQ0NCQT8/QEBCQkFBQUA/PTw7Ojk4Nzg4OTxAREpPVFdZW1tZVlRWVlhZW1xdX2RkZ2hscHJ0eHx8e3h1dnh6fX+ChIWBgH9/fnx5cmlaSTs1NTMxLy4tLCsrKyspKSkpKCgpKSkpKCgpKCcnJyYmJiUlJCQkJCQkJCQlJSQkJCQlJSUlJSUlJSUlJiYlJScnJycnJycmJycmJiYmJycmJSUlJiUlJSUlJCQkJCQkJSUlJSUlJSYmJicmJycoKCcnJyUlJSUlJiYmJiYmJiYmJycnJyclJSYmJSQkJCQlJSUlJSUlJiYlJSYmJiYnJyYmJiYmJicnJycoKCYnKCgqKikpKCgpKSkpKSkpKSknKCgoKCgoJycnJiMkIyMhICAfHyAiJSgrLTAyMzM0Nzo7PkJERklLS0pGQjYqJykpJkd8b2BfZnFxZTcgLDAuLS0tKysqKiotPUdER1FUV1JPUVlZUkpTYmpxXm92YmVvaGFgYlJQXGRoamhkX2BiXllRR0JAP0BCQ0NEREVGRkZGRURCQD03Ly0vMTM0MjU0MjArKSgoKCgqKiosLzEyMjAwLi4tLS8vLi4vMDIyNDExMTEwMTEwMTIyMjIxMDAvLy8vLy8vLi4uLS4uLy8xMS8uLiwsLCopKCcmJiQlJCQkJystMjU1NTQxMC0rKCYlJSYnJycnKCgqKisrLCwsLC0uLi4uLi4vMDAxMTAwMDAvLSsrKysrKiorLCwsLCssLi8vMDExMTEyMjIyMjIyMjIyMjIzNDM0NTY2NjU1NTU3ODc3OTk4ODg3NjY2PENOWGFpcXR2dHFqZ2JgXVtaXWRna2poaGZjXllWVFBLSEdGRURDQkFBQUJCQkJCQkFAPz08Ozo5Nzc4ODk8QUVKT1FVV1pbW1tZW1taW1xfYWNjZWZmaGtucXR4e3x6d3h4e3+AgoOEgn98e3t5dXFnXk09MjAwLi0sLCsrKysrKCgoKCgoKSkpKSgnJycnJycmJiUlJSQkJCQkJCMjJSUlJSQlJiUlJSYmJSUkJCUlJSUmJicnJycnJSgoJycmJicnJycmJiUlJSUlJSQkJSUkJCQkJCQlJSYmJiYmJicmJycmJicnJSUlJSUlJiYmJiYmJiYmJiYmJSYlJSUlJCQkJCQkJCQkJCQkJCQlJSUlJiYmJSYmJiYmJicnJycnJycoKSkpKSkpKioqKSgoKSkoJycnKCgnJiYmKCckJSMiIiIgICAgICMnKS4vMTIyMzc6PUBCQ0ZISk1MR0E0KSgqJzZ1dmtranBxajgcJS0uLS0tLSsrKSkqMEZDQklRU1FQT1NSTVhZW2BrXUtub3ZuaWdkXllZVlJZYWJlYFxdW1tcU0tGQT8+P0BDRkZFRENFRUNCQUA8NzIuMDQ4NzItMTIxLSwqKSkoKSgpLC8yNTU0NDIuLiwuLi0tLy8vLi8vLy8vLy8wMDEzMzMzMjExMS4uLy8wMDAwLi4tLTAwMDAwLy4tLCwqKSgnJiQlJSQkJCQoKy4yNDU1MjExLispJyUlJycoKCgpKysrKy0tLS0uLi4uLi4uLjAwMTExMTIwMC8sLC0tLS0sLC0tLCwsLC4uLy8xMTExMTExMTIyMTExMTAxMjIzNDQ0NTU0NDQ0NTY2Njg4ODg4ODg4NjU5QkxWX2pzeHx6d3JrZ2NgWlhdYWRnaGhqaGRgXFlWUUxJR0ZFRENAPz9CRENERUNCQUA/Ozs7Ojg5Ojo6PD9DSE5TV1pcXl5fX19fXl5fYmRmZmZmY2JlaGtvcnZ6fHx6ent9gYOCgoF+e3l2dHNuaV5RQTIuLi0rLCwtKysqKigoKCgoKCkpKSkoJycnJiYnJyYlJSUkJCQkJCQjIyUlJSUlJiYlJSUmJiYmJyclJSUlJiYnJycnJicoKCcnJiYmJicnJiYlJSUlJSUkJCUlJCQkJCQkJSUmJiYmJiYnJicnJiYmJiUlJSUlJSUlJSUlJSUlJSUlJSYkJCQkJCMjIyMjIyMjIyMjIyMjJCQjIyQkJCQlJSUlJiYmJiYnJicnKCkpKSkpKSkpKSgoKCgoKCcpKSgoJyYmJicmJyUkIyMiIiAgICIiJyksLjAxMzU4PEJDRERGSkxPTEdBMigoLCxsfGtrcXJubEEaIyotLS0tLS0rKyopKS0vOUZMUVBQUFBLTFBXXmBbYl5XX2Vwcm9paWVjXVtYXWBhYV1cWlVYWFNPTEU/PD0+P0NDQkFBRUZCQD9BQkE5MC4xNTUwLS8yMTEvLiwpKSkrKy8tMDM1ODgzMC4sLCwtLS4uLi0uLS0uLi0wLzAxMzMzMzMzMjIwMDAwMTExMS4uLzAwMDAwMC8uLCsrKikoJycmJSUkJCQkJSksMDI0NDIyMS8tLCgnJSUlKCgoKSsrKystLS0tLS0uLi4uLi4wMDAwMDAwMDEwMTEvLS0tLi4tLSwsLS0tLS4vMDAwMDAwMTExMTAwMTEwMTIyMjM0NDQ0NTU0NDQ0NjY3Nzc3Nzc3NzQ0NDhATFdhanV8fn16dnBpZV9ZV1tdY2ZmaWppZmJcWlZRTElHR0ZFQkJERkdGR0dFQ0JAQD89PDs5Ojo6Oz1BREhOU1daXF9fYGBhYWBgYWNlZ2dnZmNgYGJkam9zeH18fHp6e36AgYCAfXh2dHJxbWhfVkY2LS0tKysrLCwsKysnJygoKCgoKCkpKCcmJiYmJicmJSUlJCQkJCMjJCQlJSYmJiYmJiYmJycmJiYmJiYmJiYmJyclJSUmKCgnJygoJycnJycmJiYkJiYmJSUlJSUlJSUlJSUlJiYnJyYmJiYlJSYmJSUmJiQkJSUlJSQkJSUlJSUkJCQkIyMjIyMiIiIiIiIhIiIiIiIiIiMjIyMkJCMjJCUlJSUlJSYmJiYmJygoKCcnKSkpKSkpKSkpKSgoKSkpKScnJigoJiYnJSUkIiIgICEjIycpKisuMDM5PEBCRkpNTk5PT0pGQTEoKSpbf3dsbXZzb1AgICMsLCwsLCwsLCwqKisxNTpASE9ST05LSEtLVWFkWFFaZWlnYWNraFtYZGFfX19cX19cWllTUU9SUk5IQkA+PDs7PTw8PT89PT09P0RLQTEqKi4wLi8vMzMyMDEvLCotMDExMDIxNDg4My8rKikpLCssLCwsLC0uLi4uLy8vMDIxMjMyMzQ0MzMyMjExMDAvLy4uMDAxMTAvLiwsKysqKCcnJiYlJCUjJCMmJysrLzAxMTEvLy0rKScnJygoKCkpKisrKywsLCsrKywuLi4tMDAwMC8vMDEwMDExMDAuLi0tLi4tLSwsLS0tLSwuLi4uLzAwLy8vLzAwMDAxMTIyMjIzMzQ0MzMzMzQ2NjY2Njc3NzY1NDQ0N0BMV2NsdnyBf3x2cmllXFVTWFxhZWlpamlmYl9bVlJNSUlIR0dGR0hKSkpKR0VEQ0NAPj08Ozs9PT8/QUVITVJWWl5gYWNjYmJhYmVkZWZmZmZjYF1bXGRqbnN1eXt7enp7fn6Bfnl3dXJvbmxpY1lNPS4qKiorKyssKykpKCgoKCgoKCgpKSgnJycmJiYmJiUlJSQkJCQjIyQkJSUmJiYmJiYmJicnJiYmJiYmJiYmJiYmJSUlJicnJycoKCcnJycmJSYmJiUmJiUlJSUlJSUlJSUlJSYmJycmJiYmJiYmJiUlJSUjIyMlJSUkJCQkJCQkIyMjIyIjIyIiIiEhISIiIiEhISEhISEiIiEhIiIiIiMkJCQlJSUlJSYmJignJycnJykpKSkpKSkpKSkpKSkpKSkqKioqJycnJyYkJCMhISEhIiQnKSorLS8xNj5CRklNUFJSVFJKRj8uKCk5enJpbnd3cVQhICImLCwrKywrKywsKioqLzA1PkZJTExJSkxNTFhiY1lFSFNUX2ZsZGRhX2BiaWtlXl5fXl1aUlBRU1JMRUJBPjw4Nzc4ODk4OTk5OTtCUEkxKiksLTAyMjQyMS8wLy8wMjM0NDUyMjIzMzAtKikqKikrKystLS0tLi8vLy8wLzAxMDAwMjM0NDMzMzMyMjExMDAuLi8vMDAvLi8tLSwrKikoKSgmJiUlJCMkJCQnKCotLi8wMTAwLy4sKScoKCkoKCkqKikrLCwuLi4uLy8uLS8vLy8uLiwtLy8vLy4uLi4tLi4uLS0sLCwsLCwsLS4uLS4vLy8vLy8wMDAwMDAxMTAwMDAyMzIyMjIyMzMzMzM0NTU0NDQ0NDY5QExZY3B2e3t9fXdxaF9WUFFXXGFlaGpqbGdkYVxWUk1MS0pKSktMTE1NTElHRkRDQD89PDw8PT0/P0NHSE1SVlldX19jZGRlYmRkZWVmZmZmY11dWlhbYWZscHN5ent7eXp+fn14dnJwbW5samVeVEMxKykqKSoqKyooKCcnJygpKSgnKSkoJycnJycmJiUlJSUlJSUlJCQkJCUlJiYmJiYmJycnJycnJiYmJiYmJSUnJyYmJycnJycnJycmJiYmJyclJSYlJSUkJCUmJSUmJiUlJSUlJiYmJSUnJyYmJSUlJSQkJCQiIyMjJCQkJCMjIiIiIiIiISEhISEgISEhISEhICEgISEhISEeHyMjIiIhIiMjJCQkJSUlJSUmJyYmKCgoKCgoKSkpKSkpKSkpKSkpKioqKigoKCgmJSQkIiIhISEkKCkqKysuLzU9QUVKU1VUVFZRSkU7KikoVHVxbXN5dGUqICIhJSosLCoqKissLiwrKysqMz1CSEtHSEhGREZQX1NGS1NRVGJnZWlqZl5fXGJqZFpYW1xcWlNQVFZTUUxDQj87Ojc1NDQ1NDU2ODg6QUVAOCwpKywuMzM0NDIyMTQ1NjY1Njc2MzEwLy8sKyopKCgoKCkrLS0tLS4wLzAxMS8vLy8wMDAxMzMxMjIzMzMzMTEwLywtLy4uLy0uLC0sKysrKikpKCYkJCQkJCMkJCQnKCssLC8wMjIxLy0rKikpKSoqKioqKissLi4wMC8wLy0uLy8vLy8uLi4uLy8vLy4uLi4uLi0sLCwrKysrLCwtLS4uLi4vLy8vLy8wMC8vLy8vLy8vMDAxMjIyMTExMTExMjMzMzQ0MzQ1NzhBTlllbnd6e3x5dW9lWFBQUVRaYmZnamtqZ2RiXVhSUE9NT01OT09OTkxJSEZFREBAPz49PD4+Pj5BRUlOUVVbXV1hY2VmZmZnZmZnZ2ZmZGJfW1VSUVZeZGhrcnZ6fHp7fHp6eHVxcmxsa2lmX1hKOiwpKyopKSkpKCgnJycoKSkoJykpKCcnJycnJiYlJSUlJSUkIyQkJCUlJSYmJiYmJiYmJiYnJyYmJiYmJiUlJycmJicnJycnJycnJiYmJiYmJiYmJSUlJSUlJiUlJiYlJSUlJSYmJiUlJSUmJiUlJSUkJCQkIyIiIiMjIyMiIiEhISEhISAgICAgHyAgICAgISEhICEhISAgHyEkJCEhISIjIyQlJCQlJSYmJicpKSgoKCgoKCkpKSkpKSkpKioqKioqKiooKCgoJyUkJCMjIiIjJigpKSorLi40OD5IS1JWVVVSS0hEOSkoLGtzanF4c2k3HSQiIycqKysqKikrLC4vLCosKzVBR0dJSUZAPzs9RlJKP0lSWWtoZmhoY2VnXFBdZ2FYVFdYWlpWUVVTTU1KQ0NAPT06NzU1NTM0Njg4PD4+PjwwKSkrLTAxNDQ0MzQ2ODg4NzU0MzEvLS0tLCsqKSgoKCgoKSosLi4vMC8wMTEvLy8vLy8vMDExMTMyMzQ0NDUzMjAvLCsuLi8tLS0tLCsrKiorKygnJyUkJiQkJCQjJiYoKisuMTMzMjIwLy8sKiorKysrLCwsLjAwMDAvMDExMC4vLy8vLi4uLi8vLy8uLi4uLy8tLCwsLS0tLS4uLS0uLi4uLy8xMTExMDAvLy8vLy8vLy8vMDAyMjExMjIyMjIzMzM0NDU0NTc2OkNOWWNqc3l5eXVyal9WT1NSV1xiZ21rbGtpZWJcWFdSUVBQT1BQTk5KSEdFRERCQEA/Pz0/P0FBQ0VHTlFVW11eYmRnaWhnaGdnZ2dmZWRhXVhST05PUllhZ2xwdHh7enl6enh4d3NtbWxpZ2RcU0M0LSopKCgnJygogYCBgICAf39+fn5+fn59fXx8fX1+gICBgYGBgYGBgICAgH9/f3+AgICAf35+fn9/fn5+fn5+fX19fX19fX19fX5+fn5+fn5+f39/f39/f39+fn5+fn5+fn5+fn5+fn5+fXx7enp6enl5eXl5eXl5eXp9gIKFhomIiYiIiImJiIiGhYOCf39/f4GCg4OCgHx7enp6enp8fX+Bg4OFhYSCgH9+f4GCgYGBgIGBg4aHh4SCg4iEhIKAfn5+fn5+fn5+fn+AgYODgoGBgYGBgYGAfn17fHx7fX5+fn5+fn59fX1/gIGDhISFhoeHg4F/fn19fX18fHt7e3t8fHt9fHx9fn9/gICAgIB/gIB/fnx8e3x+f35+f3+AgICBgYGDg4OAfXt4d3l6fn+AgICBgYGBgH59fH1+fn5+f3+ChIF/fXyBgIGAgIB/f35+fn5+fn19fHx9fYCAgIGBgYGBgYGAgICAf39/f4CAgIB/fn5+f39+fn5+fn59fX19fX19fX19fn5+fn5+fn5/f39/f39/f35+fn5+fn5+fn5+fn5+fn59fHt6enp6eXl5eXl5eXl5en2AgoeIiIiIh4SEhISEhIOEg4B+fn5/gYKDg4KAfHt6enp6ent9foCBgoOEhIOBgH+AgoODg4KBf4GCg4WFhYF+eHuChYSCf39+fn5+fn9/gYKDg4OCgYGBgYGBgYB/fXt8fHt9fX1+fn5+fn19fX5/gYOEhIWGh4eDgX9+fX19fXx8e3t7e3x8fX5+fn1+f3+AgICAgH9/f358eXl7fH5/fn5+foCAgIGBgoGBf359e3p5ent+f4CAgIGBgYGAfn18fX5+fn5/f4KEgX17eYGBgYCAgICAf39+fn5+fX17e31+f4CAgIGBgYGAgIGBgIB/f39/gICAgH9/f39+fn9/fn5+fn19fX19fX19fn5+fn5+fn5+fn5+fn5+fn9/fX1+fn5+fn5+fn5+fn5+fn18fHp5eXp6eXl5eXl5eXl7fYCDhYiHhoOCgYCBg4OEhYWCfn59fX+BgoSEg4J/fHt6e3t6ent+gIGBgoSEg4GAgIODg4OCgoKCgYGDg4WEgHlzc3WAhoiBfn5+fn5/gIGCg4ODgYGBgYGBgYGCgYB9fH19fX18fHx9fn5+fX19fX6AgoOFhYaGh4SCf35+fX19fHt6ent8fX1/f4CAgICAgH9/f3+AgH59fHt5ent8fn5+fX1/gICBgoKDgoF/fX16enl6fH2AgICAgYKCgoB+fnx+fn5+fn6AgoOBfnl5gYGBgICAgIB/f35+fHx9fX19fn9/gICAgYGBgYCAgYGAgH9/f3+AgICAf39/f35+f39+fn5+fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+fn5+fn5+fXx8ent7enp5eXl5eXl5eXl8f4KEhIKBgX+BgYSFhoaHhIF9fHt9f4GChISDgoB9e3p7e3t7e31+gIGChISDgYKCg4ODg4ODg4F/f4GBhIN/eXZ1dnp/g4B/fn5/f4CBg4KDg4GAgYGBgYGBgYKBf318fX19fXx8fH1+fn5+fXx9fX+CgoSFhoaHhYN/fn59fX18e3t7fH2AgIGBgYGAgICAf39/f39/fHt4d3h5e3x+fn18fX+AgIGCgoSDgX9+fHt6eXt8fYCAgYGBgoKAf319fH5+fn5+foGDhIB7eXmBgYGAgIB/f35+fX18e319fX9/f3+AgICBgYGBgICAgICAgICAgICAgIB/f39/fX1+fn5+fn19fXx8fX19fX19fX19fX5+fn59fX5+f39/f35+fn5+fn5+fn5+fn5+fn59fXx8e3t5eXl5eXl4eHh4eXp8gH+BgIKDg4ODhoeHhYSCfXx7e3x/f4GDg4ODgX98e3p6enp8fX+AgYGChISEg4OEhIODg4ODgX9+f4GBgYGAfn18ent/goGAgH+AgYKEg4OCgoB/gICAgYGBgYB+fHt9fX19fX18fX5+fX19fXx+gIGDg4OEhYaEgoB9fn59fHx8fX+AgICCg4OCgYCAf3+Af39/fnx5eHd3eHp8fX19fHt8f3+BgoKFhYOCgH58e3t7fH5/gYGCgoODgoF9e3p9f35+fn5+f4KEgXt5eIGBgYCAgH9/fX18fHt6fHx9f39/f4CAgIGBgYGAgICAgICAgICAgICAgH9/f39/f35+fn59fX19fHx9fX19fX19fX19fn5+fn5/fn5/f35+fn5+fn5+fn5+fn5+fn5+fn19fHx7e3p6eXl5eXh4eHh5ent+gYKDhIWFhYWGh4eFgoB8e3t7fH9/gYODg4OCgH17enp6enp8foCBgIGChISEhISEg4ODg4F/fXx9f39/fn19fX9+fX6DhYOBgIGDhIODgoGBfn5/gICBgYGBgH58e319fX19fX1+fn5+fX18fH1/gYODg4SFhoSCgH1+fn5+fn9/gYKDg4KCgoF/gICAfnx9f399enl3dnZ4enx9fX18e3x/f4GCgoWFg4KAfn17fHx9f3+BgYKCgYKBfXt5enx+fn5+fn5/goOCfXt5gYGBgIGBgH5+e3x7e3t7fH5/f39/f4CAgIGCgoCAgICAgICAgICAgICAgICAgH9/f399fX19fXx7fX19fX19fX19fX19fX19fn5+fn5+fX1+fn19fX19fX5+fn5+fn9/fX18fHx8e3t6eXl5eHh4eHl7fH6ChISGhoaGhoWGhoR/fXt6e3t9fn+AgYKCg4KBf3t7e3p6e3t9foCAgIGDhISEg4ODg4OCgH98fX5+fn59fYGEiImDfX2ChISChIeHg4KCgX58fHx/gYKCgYGAfn18fHx9fX19fX1+fn9+fHt7fX6Bg4ODhIWGhYOBf39/f4GBgoODhISDgYCAgICAgH9+fX5+fn16eXZ1dXd7fH19fHx6fH+AgIKChYWDg4B/fn1+fn9/gYGCg4GAfnx6d3h6fX9/f39/fn+BhIJ/fHqBgYGAf39+fX17e3t6ent9fn+Af39/gICAgYGBgICAgICAgICAgICAgICAgICAf39/f319fX18fHt9fX19fX19fX19fX19fX1+fn5+fn59fX5+fX19fX19fn5+fn5+fX19fXx8fXx7e3p5eXl4eHh4eXt9f4KEhIaGhoaGhYaFgn98e3x7e3t9f4CBgoGDg4KAfHt7enp7e3x9gH+AgYGDhISDg4ODgoF/fn19gIB+foCAfn+BgX99e3uDhYaGhYSEgYKAfn18f3+BgoKBgYB+fXx8fH19fX19fX5+fn59e3t8f4KDg4OEhYaFg4F/f39/gIGCg4OEg4OBgIB/f39/f359fn5+fXp4dXR0d3t+f318fHp8f4CAgoKFhYODgoCBf39/gICBgoKCgYF+fHd2d3t/f39/f39+f4GDg4B9e4CAgIB/fn59e3t6enp7fn5+fn+AgICBgYGBgICAgICAgICBgYGBgYGBgYGBgIB/f359fX18e3t7e3x8fHx8fHx9fX19fX19fX19fn59fX19fX1+fn19fX19fX19fX19fX19fX18fHx6enl4eHh4d3h5fX+Ag4WFhoaEhYWFhIN/fHx8fHx8fHx+f4CCgYOEg4F+fHt6ent7fH19foCBgIKEhIODgoGBgH9+fn+Af39+foGAf39+fXx8eX5/gn+AgXt2dnp8fXx/f4GBg4ODgX58e3t7fHx8fXx+fX1+fn19e3x+gYKDg4ODhoWDgH9/gIGCg4OEhIOCgoF/fn5+fn5+fX5+fn57eHVzc3R3e3x9fXx7e32AgYGBg4aGhISDg4ODgYCBgYGCg4SDgX96d3Z5fH5/f39+fn5/gYSEgX56gICAgH9+fXx7e3t7e3x+fn5/f4CAgIGBgYGAgICAgICAgIGBgYGBgYGBgYGAgH9/fn1+fXx7e3t7fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHp6eXh4eXd4ent/gYKCg4WGhoSFhYWEgX58fHx8fHx8fH1+foCBg4SDgoB9enp6e3t7fH1/f4CAgoSEg4OCgX9/fX1/fn18fX5/gH9+fXx6eHl6eHyCgX54dHFxcnR3fH9/gYGDg4OBfn18fX18fH19fH59fX19fHx7fH6BgoODg4OEhIKAgH+AgYKDg4ODgoGBgH59fHx9fX59fn59fXl2c3Jyc3d7fX59fHt7fYCBgYGDhYWEhISEg4OCgYGBgYKEhYOBfXl2d3l+f39/f35+fn9/goWDf3uAgICAfn18fHt7fH19fX5+fn+Af4CAgYGBgYGBgICAgICAgICBgYGBgYGBgYCAgIB+fn59fHt6ent7fHx8fHx8fHx9fX19fX19fX19fX18fHx8fH18fHx8fX19fX19fX19fXx8e3x7fHp6eXh4d3l8foGDg4OEhYSEhIWFhIF/fnx8fHx8fHx8fX1+gICCgoODgX58e3t8fHt9fn9/gIGChIWEg4KAfn19foCBfXx9fn9/f3x7e3p6eXd2dnx/goJ+eHR2eHp9foCAgYKDg4F+fXx8fHx8fX19fX19fX18e3t7fYCBg4ODg4ODgoB/gIGCgoKCgYGBgIB9fHt5e3x+fn59fX16eHVzcXFydnp9fn18enx+gICAgoOFhYSEhISDg4OCgYGDg4SFg4B7eHZ4eX5/f39/fn5+f4CDhYSAfICAf399fXx7fHx8fX19fn5+f4CAgICBgYGBgYGAgICAgICBgYGBgYGBgYGBgICAgH9+fHx7enp6fHx7e3x8fHx8fH19fX19fX19fX1+fn5+fHx8fHx8fHx9fX19fX19fX19fHx7e3t7enp5eHl4e36AgoSEg4SEhISEhISEgX17fHx8fHx8fHx9fX5/gIKCg4OBf3x7e3x8e3x9fn+AgYKChISDgH5+fX9/gYGAgH9/f35+fHp6e3t6eHh2d3t/fnp6e3x8fHx9gICBgoODgX59fHx8fH19fX19fX19fHt7eXp9gICCg4ODg4OCgH+AgIGBgYGBf39+fHl5eHl7fn9+fn19fHl3dHFwcHN2en1+fHt7fX6AgICCg4WFhISEhIODgoGBgYKCg4SCf3t4dnh8f39/f39+fn5/gIOFhIB8f35+fX18fX1+fn5+fX5+fn9/gICAgIGBgYGBgYGBgICBgYKBgYGBgYGBgYGBgYF/f359fHt7e3t7e3t7e3t7e3x8fHx9fX5+fn59fn5+gH98fHx8fHx8fH19fX19fX19fX17e3t7e3t6enl5eXt+gIKDgoOEhISEhIODg4F9fHx8fHx8fX18fXx9fX6AgoKDg4SAfXl7fHx7fHx9f4CBgoODhIJ/fX5+f358eXp/f359fX5/f358fH19fHt3dnl4dXmAfnt6e36BgYGBg4OBfn59fX19fX19fX18fHp5enl5en1/gYKDg4ODgoKBgYKCgYF/f399fHt5d3Z3eHx9fn1+fn18eHVzcG5wcnV5fX98e3x+f4B/f4KDhYWFhYSCgoGCgoGBgoKDgoF9end2en2AgH9/f35+f39/goaGgX5/fn59fXx9fX5+fn5+fn5/gICAgICAgYGBgYGBgYGAgIGBgoGBgYGBgYGBgYGBgX9+fXx7e3t7e3t7e3t7e3x8fHx8fH19fHx8fHt9fn5+fHx8fHx8fHx8fX19fX19fX18fHt7e3t6enp6eXl6fH+AgYKDhIKCgoKCgoKBgH18fHx8fHx9fXx8fH19foCCgoODhIF+fX18fH1+f39/gICBgoOEgn99fn59enRzd31/fn18fX6Af3+AgoSEgnx0c3d3eX6Ae3p7foGBgYGDg4F+fn1+fn19fX19fXt7eXl4eHd4e32BgoODg4KCgYGBgYGAgICAfnt6eXd2dnd6fX5/f39+fHp3dXJwbm5wdXl9f3x7fH5/gIGBgoOFhYODgoGBgH+AgICBgYKBf3x6d3h7gICAf39/f39/f3+ChISBfn9+fn1+fn5/f39/f35/f3+AgICAgYGBgYGBgYGBgYCAgoKCgoGBgYGBgYGBgYGAfn59fHt7e3p6e3t7e3t7fHx9fX19fX19fX19fX18fHx8fHx9fX19fX19fX19fHx8fHt7e3t7e3p6enp4enx9gIGAgoKCgYCAgICCgn5+fXx8fHx8fHx8fX19fX1+gIKCg4OEg4B+fHx9fn+Bf39/gIGDg4OCgH1+fnx8eXl8fYSHhYB+foCAgYOEhIOBfndzdXd6fX18enx/gYGBgoKCgX99fH19fX1+fn18enl5eHd1dHZ5fYCCg4OBgYGBgYGBgYCAfn18enh3dnV1dnl+f4CBgX98enVzcXBubnB1en19fHt8fn+AgICBgoSEg4GBgX+AgICAgIGBgYB9enZ2eXyAgICAf39/f39/f4GEhIF+f35+fX5+fn9/f39/f39/gICAgICBgYGBgYGBgYGBgYGCgoKCgYGBgYGBgYGBgYB+fXx7ent7enp7e3t7e3t8fHx8fX19fX19fX19fXx8fHx8fH19fX19fX19fX18fHx8e3t7e3t7enp6enh6fH6AgYGBgYGAf4CAf4GAfXt6fHx8fHx8fHt8fX19fX6AgoKDgoODgH9+fX6AgIKAf3+AgYGBg4OCfn5+fX17fX2AgYOFgoGAgIGCgoKCgYB9eXNwcnd7fHp7fH+BgYGCgoKAfn18fX19fX19fHp5eHd3dXRydHh9gIKCgoGAgICAgICAf399fHp5d3Z1c3V2en9/gICAfnx5dXRycG5ucHV6fX18e3x+f4CAgIGChISDgYGBf4CAf39/gIB/fnp3dXV5fICAgIB/f39/f39/gYSEgX5+fn5+f39/gH9/gIB/gICAgICAgIGBgYGBgYGBgYGBgYGBgYGBgYGBgoKBgYCAgH59fHt7e3t7e3t7e3t6fHx8fX19fXx8fHx9fX19fX19fX19fn5+fn5+fX19fXx8fHp7e3t7enp6eXl5eXx+gIGBgoF+fX1+f4CBgYB9fHx7e3x8fHx8fH19fX19foCBgYKCg4KBf39/gIKCg4GAgICAgYGChIOBf35/f3x8fH6BgYF/fX+BgYOEgoGAfXt4dG9sdXx+e3t8f4CBgoKDg4F/fXx8fHx8fHx7eXh3d3Z0c3Bydnt+gIKCgIB/fXx8fX5+fXx5eHZ2dXNzdHd8foCBgIB/fHl2dHNyb21wdHl9fXx8fX9/gICAgoKDg4KBgYGBgYCAfn5+fn16eHVzdnp9gIB/f39/f39/f3+BhIN/fX5+f39/gH9/f3+AgH+AgICAgIGBgYGBgYGBgYGBgYGBgYGBgYGBgYGCgoGBgICAfn18e3t7e3t7e3t7e3p8fHx9fX19fHx8fH19fX19fX19fX1+fn5+fn59fX19fHx8ent7e3t6enp5eXl6fX+BgYKBgH59fX6AgYGAfXt8fHt7fHx8fHx8fX19fX1+f4CBgoKDgoGAgICBgoKDgYGAgICBgYKEg4F/fnt4eXx8foGBgoOBgoOEg4KCgH17eXd1b2tzfH17e3x/gIGCgoODgH17enx8fHx7e3p5d3ZzcnBvbm91en1/gYF/fn58enp7fH18enh4dnRzcnJ0d31/gICAgH58eHR0cnFvbnB0eX19fHx9f3+AgICCgoODgoGBgYGBgIB+fn19e3h0cnN2e36AgH9/f39/f39/f4GEgn9+f3+AgH9/f3+AgICAgICAgICAgYGCgoKCgYGBgYGBgYGBgYGBgYGBgYKCgoGAgICAf359fHt7enp7e3t7e3t8fH19fX19fX19fX19fX5+fX18fH5+fn5+fn19fX18fHt7enp6enl5eXh4ent/gYKEg4GAfX1+gIKCgn98e3t7e3t8fHx8fHx9fX19fn5/gIGCgoKDgoGAgIGBg4KBgYCAgYCCg4ODgoB+fHt8fH5/f4KGh4eFhIODgYB9e3p5enh0bXF6fHp7fYCBgYKCg4OBfnt6e3t8e3t7enh3dnNxbm1sbXJ5fX5/f398enl4eHp7fXx5eHd0cnFwcXN4fX+AgICAfnx3dHNycW9ucHR5fX18fH5/f4CAgIKCg4OBgYCBgIB/f399fHl4dHBxcnd9f4CAf39/fX1/foB/gIKBf32AgICAf4B/gICAgICAgIGAgICBgYKCgoKBgYGBgYGBgYGBgYGBgYGBgoKBhIWFhoaEgn9+fX19fX9/f39+fnx8fX19fX19fX19fX19fn59fX19fn5+fn5+fX19fXx8e3t6enp6eXl5eHl7foGCg4OCgYCAgICBgoKBf3x7e3t8fHx8fHx8fH19fX1+fn+AgYGBgoODgoGBgYGDgoGBgICBgIGCg4OCgH5+fX19fn+BhISFhYSFhYJ/fnx6eXl4eHZwbnd7ent9gIGBgoKDg4F+e3p7e3t7e3p5eHV0cW5ramlrcHZ8fn99enh3dnZ2eHt8fHp5d3RycXBxdXl+gIGAgH9+fHZ0c3JycG5wdnt9fXx8fn9/gICAgoKDg4GBgIGAgH9/fXx6eHRxbm9yd31/gIB/f318fH1+gH+AgYF/fYCAf3+AgICAgICAgICAgYGBgYGBgoKBgYGBgYGBgYGBgYGBgYGBgIGBg4WIiYmLi4iHg4B+gIKDg4aGhYKBfn18fHx9fX19fX19fn59fX5+fn5+fn5+fn5+fHx8fHx7e3p6enp5eXl5e36Bg4OEhIKCgYGBgIGDgoF9fHt7e3x8fHx8fHx8fX19fX19f4CAgYCAhISDg4KCgoSDgn99fn+AgIGCgoOCfn9/f39/fn+AgoKEhIOBgX57e3p6eXh3d3BudXl5fH1/gYGCgoKCgH17ent7eXl6eHh2dHFvbWtpZmlvdnx/fnt4dnRzc3R4ent6enl2dHJxcHF0eX+AgICAgH96dnRzc3JxcXJ4fHx8fH1+f39/f4GCg4KBgICAgYCAgH58enh2cm9rb3V5fn+AgH9/fnp8foCAgICBgX9+gYGBgYCAgICBgYGBgICBgYGBgYGCgoGBgYGBgYGBgYGBgYGBgYGAgYOEhYiJiYmJiYiHhYOFh4iJiomHh4aDgH5+fX19fX19fX1+fn19fn5+fn5+fn5+fn58fHx8fHt7eXl5eXl5eXt/goKEhIWFg4KBgYGAgYKAgHx7e3t7fHx8fHx8fHx9fX19fX19foCBgoKDg4ODgoKBgoOCf318fYCBgoKCg4N/f359f39/f4GCgoODgoF+fHt7enp5eHd3dnN1eXl9fn+BgYKCgoKAfXt6e3t7e3t6eHZ1cm9samdmaW92fH9+e3h2dHV0dXh6e3p5eHZ0cnFwcXV7f4CAgICAf3t3dXR1c3JzdXh8fHx8fX5/f39/gYKDgoGAgICBgIB/fnx6d3RxbmtvdXt/gICAf397eXt9gICAgIGBf36BgYCAgYGAgIGBgYGAgIGBgYGBgYGBgYGBgYGBgYGBgYCAgICAgICAgYGEh4iHiIiIiIeHhoaIh4mJh4eIiYiEgn9+fn19fX19fX5+fn5+fn5+fX1+fn5+fX18fHt7enp5eXh6eXt9gIGEhIWFhYSEgoGBgYCBgoB9e3t7e3t8fHx8fHx8fH19fX19fX5/gIGCgoKCg4ODg4ODgoB/fXx+gICBgoODg4B/foCAgYKBgoKCgoKBfnx7enp5eHh3d3d4dHN4enx/gIGBgYCCgoB9e3p7e3t7enp5d3Vyb2xpZmVmbHV8foB8eXh1dnZ3eXp8e3p5eHZzcnN0eH2AgICAgIF/enh2d3ZzdXV2en17e3t8f4CAf3+AgoOCgYGAgICAgYB/fXl2cW9sbHB2fYCAgICAfXp4e36AgICAgIB+fYGBgICBgYGBgYGBgYCAgYGBgYGBgYGBgYGBgYGBgYGBgICAgICAgICBgYGCg4KCgoOFhoaFhYaFhYWFhYWGiIiGgoB+fX19fX19fn5+fn5+fn5+fn5+fn59fXx8e3t6enl5eHp8f4KEhYaGhoaGhIKCgYGBgYJ/fnt6e3x8fHx8fHx8fHx8fX19fX19fn+AgYKCgoKDg4ODg4OCf357e36AgIGCg4ODgoB/gIKCg4KCgoKCgn98e3p6enl4eHd3d3dzc3l7fH6AgYGBgIKCgH17ent7e3t6enl3dXJvbGlmZWZsdXx+fn17enh4ent9foCAf358e3l4eHl8foCAgICAgYF+e3l4d3Z1dHZ5e3t7e3x/gIB/f4CCg4KBgYCAgH+AgH99eXZxbmtrcnl+f4CAgIB9eHd6foCAgICAgH59goKCgoKCgoKBgYGBgYGBgYGBgoKCgoGBgICAgICAgICAgICAf39/f4CAf39+fH19f4GChIWDgX57e35+gIOGh4iGg4B+fn19fX19fX5+f39+fn5+fn5+fn19fHt7e3p6eXp7fYGEh4aFhYWFhoaCg4CBgICAfnx8e3t7e3p6e3t7e3t7fHx9fXx8fX18fX+AgYGBg4ODg4ODgoB/fXx8fYCBgoKCgoODgoKDhYSFg4OCgoGAf3x7enp6eXl4eHZ4d3Rydnp+f4CBgYGBg4N/fHt5ent8fHt6eXh1dG9samdmaGx1fH5+fn18fHx+gICCgoKCgX+Afn1+fn9/gYGAgICAgYF+e3l5d3V0dnp8fHx9fn6Af39/gIKDgoCAgIGBgIB/f315dXBsamx0en5/gICAf3t3dXp+gICAgICAf3+CgoKCgoKCgoGBgYGBgYGBgYGCgoKCgYGAgICAgICAgICAgIB/f39/f39/f358fX1+f4CBgX14d3h4eXl8gIKGhYWDgoCAf39/f39/f39/f35+fn5+fn5+fX18e3t7enp6fH2AgoWGhYaFhYWDg4GBgYGBf3x6enp7e3t7enp7e3t7e3t8fH19fHx8fHx9f4CBgYGDg4ODg4KBf359e3t8gIGCgoKCg4ODhIWGhYWDg4KCg4GAfXt6enp5eXh3eHh4dHFyeXx/gIGBgYGBgX98e3l6e3x8e3p5eHV0cW5raGdpbXV8fn5+fn1+f4CBg4ODg4OCgYKAgH9/gICBgYCAgICBgYGAfnt4dnV3enx8fH1+foB/f3+AgoOCgH+AgIB/f39+fXl1cGxscHV8f39/gIB9eXZ3en6AgICAgIB/f4KCgoKCgoKCgoKBgYGBgYGBgYCAgICBgYCAgICAgICAf39/f35+fn5+fn5+fX18fH19f356eHh5enp7e3x+gIODhIaFhIODgICAgICAf39/f39+fn5+fn59fXx7e3t6enp9gIOFhYSEhYWFhIKBgYB/gH98enh4eHp6e3t6ent7e3t8fHx8fX18fHt7e3x8f4CAgYKCgoODgYB+fXx8e3x/gIKCg4ODhYSFhYaGhoSDg4OCgoB9fHt6enl5eHh4eXZzbnB3fH+AgYGBgYCAf3x7enp6fX19e3p5d3Ryb2toaGludnx/f359fX6AgYKEg4ODg4F/f39/f36AgYCAf35+fn+AgoGAfnp3dXd5fHx8fX2AgH9/f4CDhIF/fX9/f39/f357d3Rvamtwd32AgIB/f315dXh7f4CAgICAgH9+goKCgoKCgoKCgoGBgYGBgYGBgICAgIGBgICAgICAgIB/f39/fn5+fn5+fn59fXx8fHx7e3h4eXt7e3x8fX1+gIKDhIWFhoaGhoaGhoWBf39+fn5+fn5+fn19fHt7e3p6e36ChISEhIWEg4KBf35+fHx7enh3eXp6enp6enp6e3t7e3p6e3t6enp6e3t7fH2AgICBgoKCgoKAf318e3t6e35/goKDg4OEhYeHh4aEgoGBgYKCgH18e3p6eXl3d3h7fXl0cnd8f4CBgYGBg4OAfX17fHx9fXx+fn15d3Nwb2xqa292e31/f359fn+AgYKAgH58enl4eXl6fH+AgIB/fn19fH6AgoOBfHd1d3l8fHx9fX5+f39/gIOEgX98fn5+f35+fXt3cm1rbXR6fn+AgH9/fXl1eHt/gICAgICAf36Dg4ODgoKCgoKCgYGBgYGBgYGBgYCAgICAgH9/gICAgH9/fn5+fn19fX19fX18fn59fXx8e3t7e3t7fX19fX5+f4CCg4SDhoeIiYmKiYWAfX9/fn5+fn19fHx7e3t7e3x9gISEhISFhoSBf359fHl5eXl3d3d5enp6enp6fHx7e3t6eXp6eXp6enp7e3p7fn+AgYGBgoKBgYB+fX17e3t7fH6AgYKCg4SEhYaGhYKAgH+AgX9+fnt6eXl4eHd3eHh7e3V0eHx9f4GBgYGCgoF+fXx8fH1+gIGBgHx6dnNvbm5ucnp9f39/f39+foCAf3x6eHd2dHJxcnV5foB/gIB+fnx8fH2ChIR+eHd4enx8fH5+fn5/f36AgoOCf36Af39/f359e3VybWpudn1/f4B+f398eHV4fH+AgICAgIB/foODg4OCgoKCgoKBgYGBgYGBgYGBgICAgICAf39/f39/f39+fn5+fX19fX19fXx9fXx8fX17e3t7fHx9fX19fX19fn5/gIKDhYeIiImIhoF+fX1+fn5+fX18fHt7e3t7fH6BgoKEhISCfnt6eHd2d3d3d3d3d3l6enp6enp7e3t7eXl5eXt5eXl6ent7ent8fn+AgYKCgoGBf359fHt7e3t7fYCBgoKCg4SFhoWDgH9/f398e319e3l5eXh4d3d2dnd2d3Z3en1/gYGCgoKCgX59fHx8fX+Bg4SEgX14dnRyc3R4e35/f39/f39/f356eXh3dnVzcXBxdHl+gH+AgIB+e3Z4en6Dg4J8eHl6fHx8fn5+fn5+foGBgoKBf39+fn9/fn15dXBubXF5fn9/gH5/gHx3dXh8f4CAgICAgH9+g4ODg4KCgoKCgoGBgYGBgYGBgICAgICAgIB/f39/f39+fn5+fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18e3t9fYCDg4OEhIWFhIB9fX5+fn19fXx8e3t6ent9foGDhISDg397eHZ2d3d2dnh4d3h5eXp6enp6enp5e3t6eXp6enp5eXl5eXp7e3x9f4CBgoKCgYB/fn17fHx6enx8f4GBgYGBgoSEg4F+fn5+fHZ8gH58enl5eHh4d3Z2dXZ5d3Z5fX+BgYKCgoKBfn18fH5/f4GDhYSDgHx6eXl7e3t+gIB/f39/f4CAfnl4eHd1dXRycnN1en6AgICCg315dXR3e3+Dgn17eXp7e3t8fX19fn9+f4CBgoKBf35/f39+fHp1cW9vdHt/gIB/f3+AfHd1eHx/gICAgH9/gH2Dg4ODgoKCgoKCgYGBgYGBgYGAgICAf4CAgH9/f39/f35+fn59fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18e3x8fX+AgH9/gYOEgHx8fn5+fX19fHx7e3p6e31/goODg4KAfHl3dnZ2dnZ2eHh3eHl5enp6enp6enl5eXl5eXl5eXh4eXl5ent7fH1+gIGCgoKBgH9+fHt8fHt7fHx/gYGBgYGCg4KAf3x8fXt4eYCCf317eXl4eHh3eHp4dnZ0dnl9f4GBgoKCgoF+fXx7fHx9gIGDg4KAf35+fX5/f3+AgIB+f3+AgYF+e3l4d3V1dHNzdHd7f4CAgICBgHx2c3R5foGDgHx6ent7e3x9fX1+f318fX+BgYB/f39/f39+eXVxbm91fH+AgH9/f398dnV4fH+AgICAgICAfYSEhISCgoKCgoKBgYCAf3+AgICAf39/f39/f39/f39/fX19fXx8fHx8fHx8fHx9fX19fHx8fHx8fHx8fH5+fn5+fn19e31+fXx7fICEhYR9eXp9fn19fX17enp6e3t9gIKDhISDgX56eHd3d3d3d3d4eHl4eXl6enp6enp6ent7eXl4eHl5eHh5eXl5enp8fYCAgIGCgoKCf358e3x8fH18foCAgYGBgYKCgoB9fHp8e3h7gYOAfXt5eHh4d3h7f3p1c3N2e31/gYGCgoODgH18enp6fHx+f3+AgICAgIGBgYGAgICAfn5/gICDgH57eXh4eHZ2c3V1en6Af4CAgIKAfXl1dHd8gIKBfnp7e3t7ent9fX5+fXt5en1+f39/f39/f3x4dHBucHd9fn9/f39/fnh0dHp9f3+AgICAgH58hISEhIKCgoKCgoGBgYGBgYCAgIB/f39/f39/f39/f399fHx8fHx8fHx8fHx8fHx8fH19fX19fHx8fH19fn5+fn5+fn5/f35+fXx+g4eHgnx5en1+fX19fXx7enp7foGDhISEhIOAfHl4d3d3d3d3d3h4eXh5eXp6enp6enp6eXl5eXh4eXl4eHl5eXl7e31+gIGBgYKCg4OAf3x7fH19fn5/gICBgYGBgYGBf318enx7eHuBg4B9e3l4eHh3eX2AenV0dHZ7fX+BgYKCg4OAfXx6ent8fHx+f4CBgYCAgYGBgYCAf39/fn+AgIOBf3x5eHh4dnd3eHd7foB/gICAgoB9enZ0d3t+gIB/fHt7e3t6e319fX5+e3d2eXx/f39/f39/fHd0cG9zeH5+f39/f358d3J0en1/f4CAgICAfnyDg4SEgoKBgYKCgYGBgYGAf39/f39/f39/f39/f39/fn19fHx7e3x8fHx8fHx8fHx9fX5+fnx9fXx7fHx9fX19fn5+fn9/fn5/f4GFiImDfnt7fX59fX18fHx8fH6ChISFhYODgn98d3d3d3d3d3d3eHh5eHp6e3t7e3t7enl6eXl5eHh4eHh4eXl5eXp8fn+AgICBg4ODg4F/fXx9fH6AgYGBgICAgYGCgoOBf3x6e3p2foKDgH17eXh4eHl6fX95dHJydHp+f4CAgYGDg4F/fHp6ent7fH2AgYODg4KCgoGBgICAf39+f4CAg4F/fHp5eXl4eHd4en6AgICAgYCAf317eHV2en2Af399fHt7e3p7fX19f399eXZ4e319fn5/f357dnNvcHR5fn9/f4CAf3t1cnV6fX+AgICAgH9+e4ODg4OCgoGBgoKBgYGBgH9/f39/f39/f39/fn5/f358fHx8e3t7fHx8fHx8fHx8fH5/gICAfn5+fnx8fH19fX1+fn5+fn5+fn9/gYSHh4V/e3t9fn19fXx8fX6BhIWFhIWEg4OBfnp4d3d3d3d3d3d4eHl4enp7e3t7e3t6eXp6eXl4eHh4eHh5eXl5fH1+f4CBgYGDg4ODgoB+fH6AgYOFhYOBgYGBgYKCgYB/fHx5eHh+goOAfXt5eHh4eXx/fHd1dXJ0en5/gICBgYKCgX99e3t7e3t8fYCBg4ODgoCAgICAgIB/f35/gICDgYB9fHt7e3p5eHl7f4CAgIGBgYB/fXt4d3d4e3x7fXx8e3t7fH19fX1/gH56d3h7fX1+fn9/fnt3c3BwdXt+f39/fn5+enVydXp9f4CAgICAf3t4g4OCgoKBgYGBgYGBgICAf39/f39+fn5+fn5/f39/fX17e3t7e3t8fH19fX19fX19fHx/gYGBgYF+fXx8fH5+fn5+fn5+fn5+fn6Bg4aJhYJ8enx9f318fX1/goaHh4aFhIWCgX58eXh4eHd3d3d4eHh4eXl6ent7e3t7e3p6enp5eXl5eXl5eXl5eXp8foCAgYGBgYKCgoKCgYB/f4CEhYaGgoGBgICBgYGBgH98e3h2dn2ChIB9e3p6eXl5en1+eXV1cXR6fn+AgIGBgYKBgH59fn18ent8f4ODg4KAfn1+f4CAf39+fn+AgYKBf3t6e3t7enl5en1/gIGBgYGCgn58e3l5eXl5ent7e3t7fHx8fHt9foCAfnt3eXt9fn5/gIB+e3ZzcXJ4fH1+fX1+fnx5c3N1e3+AgICAgIB9enWDg4KCgoKBgYGBgYGAgH9/f39/f35+fn5+fn5+fn59fX19fHx8fHx8fX19fX19fX18fH1+fn5/f359fHx8fn5+fn5+fn5+fn5+foGDhoeHhIB+foB/fX1+f4GFh4eIh4aFg4J/e3l3dnd3d3d3d3h4eHl5eXp6e3t7e3t7enp6enl5eXl3d3d3eXl6e3x/gYKBgYGBgoKCgoKBgICBg4aHhoaEgoGAgYF/gIKCgH18eXZ2fIGDgX17enp5eXh4eHx+e3hzdXt+f4CAgYGDgoGBgoGAf318e3x+goODgX16fH5/gIB/f35+f4CBgoF/fXt7e3t6eXl6fX+AgYCAgYGBf317e3t7e3t7eXl7e3t8fHx8e31+gIB+fHp6fH5+f3+AgH57d3Nxc3h8fX5+fn5+fXl0c3d8f4CAgICAgH15d4ODgoKCgoKBgICAgIB/f35/f39/fn5+fn5+fn59fX17fHx9fX19fX19fX19fHx8fHx8fX19fXx8fX19fX19fn5+fn5+f39/f35+gYKFhoeFgX1+f39/fn+Ag4aHiIiHh4WCfnp4d3d2dnZ3d3h4eHh6enp7enp7e3t7e3t6enp6eXl4eHl5eXl5eXt9gIGBgoKCgYGBgoKCgYGBg4SFhoWFg4SBgYCAgX9+gIOCgX5+dnV7gYKBfXt6enp6e3p3eH19eHR1e35/gICBgYKChIOEg4KCf318fH1/gn98fHt7f3+AgH9/fn9/gIGCgoB9e3t7e3p5eXt9f4CAgICAgIB9fHt8fX5+fXt6ent7e3p6e3t6fH6AgH98fHx8fX1+fn9/fnt3c3J1eX19fn5+f399eHR0d3x/gICAgIF/e3h3g4OCgoKCgYGAgICAf39/fn9/f39+fn5+fn5+fn19fXt8fH19fX19fX19fX18fHx8fHx9fX19fX19fX19fX1+fn5+fn5/f39/fn6AgYOFhoaCf319fX1+f4KFhoeIiIaDgH16d3h4dnZ2dnd3eHh5eXp6e3t7e3t7e3t7e3p6enp5eXl5eXl5eXp7fX+AgYKCgoKBgYGCgoKBgoSGhYaGhYOCgYCAfn1/gYGBgYGAgYB6dnp/goF9e3p6enp8gIKDgX55c3V7fn+AgIGBgoKEhYSEhIOBfnx8fn9+fHp7fH5/f4CAf39+f3+AgYKCgH17e3t7enl5fH1/gICAgICAf318e3x9fn59e3h6ent7enp7e3p8foCAf3x8fHx9fn5/gIB+e3dzcnd6fn1+fn5/f314dHR4fH+AgICAgYB8eniEhIKBgYGBgYGAf39+fn5+f39/f35+fn59fX5+fXx8fH19fX19fX19fX18fHx8fX19fX19fX1+fn19fn5/f39/fn5+fn9/f31+fn5+gIKFh4WCfn5+fn+AgoSGhoaGhIF8eXh3d3d3d3d3d3d4eHl5enp7e3t7e3t7e3t7enp6enp6enp5eXp6fH+AgYKCgoKBgYGBgIGCgoODhIaGhoWEgYGAf4B/fn+CgoGBgH98e3l7f4GBgH18e3p6enh4d3d7enZydnt/gICAgICAgoWFhISEgoB/fX2AgH99e3t8f4CAgIB/f4CAgIGBgoKAfnx9fXt5eXp7fn9/gICAgIB+e3t9fX5+fn17eHl6e3t6ent7enx+gIF/e3t8fX18fn6BgYB9d3N0eHx9fnx8fH9/fHd1dHl+f3+AgICAf39+foODgoGBgYGBgIB/f39/f39/f39/fn5+fn19fn59fHx8fX19fX19fX19fX19fX19fX19fX19fX5+fX1+fn19fn5+fn5+f39/fX5+fn5/gYOFhoOAf4CBgYKEhYaGhYN/fHp4d3Z3d3d3d3d3d3h4eXl6ent7e3t7e3t7e3t6enp6enp6enp7fH5/gIKCgoKCgoKBgYCAgYKCg4ODhIWGhYOAgIB/gICBg4KCgYODgoGAf31+gIGAfXx7enp6e3t9fXt4dHR2e31+gICAgICChISDg4OBgH99fYCAf317e3x/gICAgH9/gICAgYGCgoB9e3t7e3p5ent+f3+AgICAgH59fX5+fn5+fXt4eXp7e3p6e3t6fH6Af317e3x9fnx+foGBgH13dHR4fH1+fHx8f398d3V1eX5/gICAgIB/f39/goKCgICAgIB/f35/gIGCgoF/f39/f39/fn59fX19fHx+fn5+fn5+fn19fn59fX19fX19fX19fn59fX19fn5+fn5+fn5/f39/f39/f3+Bg4WGhoSCg4SEhYaFh4eEgXx5eHV2dnZ2d3d3d3d3eHh5eXp6e3t8fHt7e3t7e3t7e3t6enp8fH6AgYGBg4ODg4KCgoF/f3+AgYKDg4OEhISDgYCAf36AgIGChIKBgYKBgYGBgH9/gIF/fnx7e3t6eXx9fHh2dXh7fn+AgICAgICCgoKCgICAfn18f39/fHt7fX5/f4CAf39/gICAgoODgX18e3t6enl6fX6AgICAgIB/fn5+f39/f359eXh4eXt7e3t6enx8f4GAfnt7fH5+fX1/goKBfHd0dnp8fn19fX1+f3x3dHZ7f4B/gICAgH+AgX+CgoKAgICAgH9/foCAgYaGhIOCgoKCgIB/f39/fX1+fn5+fn5+fn5+fn59fX19fX19fX19fX1+fn19fX1+fn5+fn5+fn9/f39/f39/f4GBg4aGhYSFhoeHiIaFhYKAfnp3d3Z2dnZ3d3d3d3d4eHl5enp7e3x8fHx8fH5+fn5+fn5+fX+AgYKCgoOCg4ODgoKBf35+f4CAgYGBgYKDg4KBgYGAf39+fn+BgYCAgYCBgYGAf39+gIB/fHt7e3p5enp7dXN2e35+f4CAgICAgIGBgYGAgH17e31/f317e3t9fn9/f39/f3+AgICAgoKAfXx8e3p6eXt9foCAgICAgIB/gICAgH5+fHt5eHh5enp7e3x8fHx+gH99e3t8fn59fYCCgoF8dnR1enx+fX19fX5/fHh1d3t/gH+AgICAgIGBf4GBgICAgICAgH9/gIGEiImIh4WFg4ODg4GBgIB+fn5+fn5+fn5+fn59fX19fX19fX19fHx9fX1+fnx+fn5+fn5/f39/fn5+fn9/fn5+foCDhoaGhoeIiIiHhoSCgHx6d3V1dXV1dnZ2eHh5enl5eXl7fHt8fn59fn9/fn+AgICAgYGCgoSEg4OEhISEg4GCgX59e31/f4CCgoKCgoKBgIGBgYB/fn5+f35/gICAgICAgYGAfn9+gYKAe3p7enp5eXt2dnp7fX5/gIB/f4CAgICCgYF9enp5fX5+fXt7fX5/f39/f39/gICAgICBgX99fHt7enp7fH6AgICAgH+AgYGAgYKBf3x8e3t5eXl5ent8fHx7fH+Af318fHx+fn19gIODgXt3dXV6fX19fX5+gIF+eXZ4fH5+f35+gH+AgoF9gYGAgICAgICAf3+AgYSIiYiHiIiIiIiIhoaDgX9+fX5+fn5+fn5+fn19fX19fX19fX18fH19fH19fn5+fn5+fn9/f39+fn5+fn5+foCAgIOGhoaGh4iIiIeGhIJ/eXZ0dHR0dHV2dnp+gIB+fXt7e3x+f4GBg4OEhYWGh4iIiIiIiIiIiIiIiIaGhoaEg4GAfnx9foCAgIKCgoKCgX5+f4KCgYB+fn5/f3+BgYGAgICAgIB/f35/gYOCfnt7e3t6enl6fHx9fn+AgH9/f3+BgoSEgn98enp+gH58enp9fn9/f39/f3+AgICAgIGBf318e3t6enp8foCAgICAgoOCgoODgoF+e3t6e3l5eXl6e3x8fHt8f4CAfnx8fH5+fX2Ag4OBe3V0eHx9fX19fn6AgX55eHl8fn5/fn5+gIKDg3yBgYCAgICAgH9/f4CAgISFhoeIiImJiYqKioeEgH5+fX99fn5+fX5+fn5+fn19fX19fXx8fHx9fX19fn5+fn5+f39/f35+fn5+fn9/gICAgoKEhYWFhoeHh4WEgn14dHN0c3Jyc3d8g4iJiIaCgICAhIWEh4iJiouMjIuLi4uJiYiIiYmJiYiIiIiIiIWEgoB+foCAgICBgYKBgoKBf399goGBgH9+fn+AgICCg4GAf4B/f39/fn+AgoOBfnp7e3x6ent7fX1+f4GBgYGBgYKDhoWDgH9/gIB/f3t6en1+f39/f3+AgICAgICAgYF/fXx8ent5e31+gICAgICChIODg4OCf3t6e3p5eXh6eHp8fHx8e31+gH9+fHx9fX59fYCCg4B6dXV5e319fX19foGCf3t5e3x9fn9/f3+AhIWEfIGBgICAgICAf39/gICAgYKBgoWFhoaHiYmJiomGgoGAf31+fn59fn5+fn5+fX19fX19fHx8fH19fX1+fn5+fn5/f39/fn5+fn5+f3+AgIGAgYKDg4OEhYWFhoWEgn56d3RzdHR4fIOHh4mIhoaEhYeIiYiJiYmJiYmJiYmHh4iIh4eHh4eHhoaHh4eHhoaGhoSDg4GAgIGBgoOFiYuKhICAgYGAf39+f4CAf4GCgIB/gH9/f4CAgH9+f4CAfX6AgHt4e319f4GBgYGBgYOCgYCBgoKAgH9/f39+e3p6fX5/f39/f4CAgICAgICBgX99fHx6e3p7fX5/gICAgIKEg4ODgoB9e3p7enl5eHp4enx8fHx6e3x/f358fH19fn19gIOEgHp0dnp8fX19fX1+gYJ/e3l7fH1+f39/f4CCg4R8gIB/f39/f39/f39/f39/f39/gICBgYOEhoeIiYmIh4OCgH+Afn59fH5+fH5+fnx8fHx8fHx8fH19fX5+fn5+fn9/f39+fn5+f39+fn5+f3+AgICBgYKBgoSGhoaFhoSAenZ2d3uBhYeIiIaGhYWHiYiIiIiIh4aGhYWEhIODhISEhIWFhYWEhIWFh4eHh4eHh4eGhoOAgIKFh4iGh4aHgn9/gH5+fn5+gICAgYGBf3+BgYCAgIF/fn5+f4CBf4CBfnt8fX6Ag4OCgICDgoOBgICAgYCBgoGBgX97enx+fn5/f39/gICAgICAgIGAf318enp7e31/gICAf3+Ag4SEhICAf39+fXp6enl5eXl6e3t7e3p6fH1/f317fHx7fHt+gYN/eXR2enx9fX19fYCCgoB9enx9fn5+fX1+gIGDgnyAgH9/f39/f39/f39/f39/f39+fn9/foCCg4WIioqIh4SDgX99fX18fHx8fn5+fHx8fHx8fHx8fX19fn5+fn5+f39/f35+fn5/f35+fn5/f4CAfn59fX9/goOEhIWFhYWCgH5+gYWGh4aGhYWDhIWGhoaEhIWDg4ODg4ODhISDg4ODg4ODg4SEhISFhYSEhISEhIaGhYOEhoeGhYKDhIOAf3+Afn5+fn5/gICAgYGAgH5+f3+AgH59fH5+gH99fX99fX1/f4GBgH58fYCCg4GAgICBgH+AgICAfnt6fH5+fn9/f3+AgICAgICAgYB/fXx6eXp7fX+AgIB/f4CBgoKAf39/f359enp6eXl5eXp7e3t7enp8fX5+fXt8fHt8e36Bg395dHZ6fH19fX1+gYODgH57fX1+fn59fX1+gIGAfYCAf39/f39/f39/f39/f39/f39/f39+fn9/gYaHiIiJiYeFhIB+fX19fX19fX18fHx8fHx8fHx8fX1+fn5+fn5/f39/f39+fn5+f39+fn5+fn58fH19f3+BgYCCg4WFh4eGhISFhYaFhISEgoKDg4ODgoKCgYGAgH5/foCAgIGBgYCBgYCAgYKCgoODgoSEhISEhISDhIWGg4F/e32BhIJ/f4B+f39+fYB+gIKBgoJ/gIB+foCAf359fHt9fXx8f4KBgH9/f3+Af4CAgYKBgYKAgICAgYGBf359ent+fn5+f39+foCAgICAgIKBgH99fX59fH1+f4CAgICAgICAf359fn5+fn16enp6eXl6ent7e3t7e3p7fn58fHx8e3x8fYGDgHp0dnp8fHx8fH6AhISAfn19f39+fn17e3x+f39/gIB/f39/f39/f39/f39/f39/f39/f35+fn5/gYKEhoiIiYmIhH99fX19fX19fXx8fHx8fHx8fHx9fX5+fn5+fn9/f3+AgH9/f39/f35+fn5+fn5+f4CAgH5+fn1/gYKEhYaFhYaFhYSEhISCgoGBgYB+fHx7e3x8fH6AgYKCgoKDgYCAgYF/fX19f39/gYODgoKBgYKBgoCAgH99en2EhIGBgH59fX2AfXp7goWFg4CAgH9/gICBgH58fHx9fn+Af359foCAgH+DhYWEg4KBgX9/gX+AgIB/fXx6e35+fn5/f4CAgYGBgYCAgICAf4CAgIF/f35/gICAgICAgX98fHt9fn5+fXp6enp5eXp6e3t7e3t7ent9fXx8fHx7fHx9gYOAenR2enx8fHx8foCCgoB/fn5/f35+fXt6e3x+fn6BgX9/f39/f4CAgIB/f39/f39/f39/fn5+fn19gIGDhIaJiYmFgX57fHx8fHx7e3t7e3p6fHx8fHx8fX1+fn5+f39/f4GCgYGBgH9+fX1+f35+gYGAgICAgYCAf4CDg4OEhIWFhoaEhIODhIJ/fnt6eXl5eXl6fH6AgYODhISEhISEg4OBgH17e3t7fX1+gYKBg4ODgoKAfn2BgH9/f4SGgYB+fXx+gYSDfn+BhYOBgIGAgH9/f4B/fn5+fn9/f316enx9fn6Af4CCgoKCgoGAgIB/gICAf39+e3t8f4B/gICAgICAf4F/gH9/gYGBgoKCgoGBf4CAgICAgIB+fXt7fXx+fnx7enl6enl5eXt7e3t7e3t5eXt7fHx8fHt8fH2Agn96dXd7fHx8e31+gIKBf35/f39+fn5+fHp4ent9fn9/f39/f39/f3+AgH9/f39/f39/f39+fn5+fX19fn+AhIeJiYaBfHp7e3x8e3t7enp6e3t7e3t7fHx8fX5+fn5/f4CAg4SGhoaDgX9+fn+AgYGCgoKCg4OFhISEhISDg4SEhISDg4ODg4ODgX58e3p5eXt7fH5+gIGDg4SEhIWFhYWEhIKBf359fX18fX5/goOFhISCf35+goKChYF+fn6Bf3t5en2Af4CAfn1+fn5/gYGAfoCCgoB/fn5+fn59fXt8fH18f4GCg4ODhIOCgX9/f35/gICBgX98e3x+f3+AgYF/f3+Af31+fn6AgYGCgoKBgYF/gICAgICAgH59e3t+fX19fHt6eXh4eXl5e3t7enp5eXl5enp7e3t7e3x8fYCCf3p2eHt8fHx7fX6AgoGBgH9/f35+fn99enh4enx9f39+fn9/fn5/f39/f39/f39/f39/fn5+fn5+fn19fX2AhYiIhn96eXp6fHx7e3t6enp6ent7e3t7fHx8fX1+fn9/foGEhoqJiYiDgoGBgoKDg4SEhISEhIaFhoaFh4SDhISDgoGBgICAg4KCgYGCgYF+fXx9foCBg4KDg4SEhISEg4OCgX9/fn5+fn+AgYKEhoWCfnx/gYGBgYGAf35+fn1/hISCfXx/fn9/fn59f35+fX19foCCgH9/f399fn9+fn99fX5+foCBgYGCgoKBgH9/f3+AgICAf316e3x9f3+AgYKBf359fX+AgYGDg4KAgYGBgICAgICAgICAfn18fH9/f318e3p4d3d3eXp6e3t6enp6eXl6ent7e3t8e3t8foB+end5e318fHt9foCCgYB/f39/f35+f317eHZ4e3x/f35+f39+fn9/f39/f39/f39/f39+fn59fXx8fX19fYCFiYmIgXt5enp8fHt7e3p6enp6enp6ent7fHx9fX5+f3+AgoWIioqJiIaFhISEhISEhYWFhoaGhoaFhISFhIODg4B/fnt6en6BgYKDhYWHhoSAf36AgYODg4ODhISEhISDgoF/fn5+fn9/gYKDhISCgH59gIGBgX5+f35/f359d3p+foB9fH9+fHx9fnx8e3p7e3t9f39/f359fX18e3p6e319fX5+f39/f4GCgYF/fn5+fn9/f4B/fXp7fn9+foCAgYF+fn+AgICBgoODgoCAf4CAgICAgICAgIB+fX5+gICAfnx7enh3d3d5enp7e3p6enp5eXp6e3t7e3x7e3x+gH56eHp7fXx8e31+gIKBgH9/f39/f35/fXt4d3l8fX9/fn59f35+f39/f39/f39/f35+fn5+fn19fHx8fH19gYSJi4mCe3l6e3t7e3t7e3t7eXl6enl5ent8fXx8fn5/f4CDhoaJiIiHhoiJiYeHiIiGhoWFhISGhYSFhYWFhIOAfXx6d3Z1en+Cg4ODhYeIiIaEg4GCgoSEhISDg4WEgoKAgH5+f39/gIKDg4SEgX16d3l8fX18fH5+foCBfHZ0d3x+gIGAfHt+fXx6e3p6ent7e3x+f39/fn1+e3t7enl5eHd6fH19fX6AgYODgH9+fn5/gICBgX96e31/gYKBgYF/f39/gYCBgYKDhISDgH19fX+AgICAgICAgH18fH6AgH9/fXt5eHh4eHh6e3x8enp6eHl5eXl7e3p8fHx8fH5/fHl4e3x8e3t7fX6AgYGAf39/f39/f399end4e35/f39+fn5/fn5/f39/f39/f39/fn5+fn5+fX18fHx8fX2BhImLiIF7eXp7e3t7e3p6enp5eXp6eXl6e3p7fHx+fn9/gIOFhYWFg4WGiImJiIiHh4eHhoaHh4aFhIWFhYKBf3p3dHNycnV6f4KDgoGDhIaGhoaGhYSEhISEhIODgoGBgYCAgICAgIGChIWFhYSAe3RydHh4d3h5eX96dXh6eXt9fHx7enp6fHt8fHx8enp6eXp8fHx+fXt6fHt5eXl7e3p5eXx9fX5+fX5/goKAf35+fn+AgIGBf3p6fX6Ag4SFhIGAgIGBgIGAgYKDgoB+e3t8foCAgICAgICAfXx8foCAf399e3l4eHh4eHp7e3t6enp4eXl5eXt7fH19fXx8fX18eXl8fHt7e3t9f4GBgYB/f39/f39/f316d3h7fX9+fn9/f39+fn9/f39/f39/f39+fn5+f399fXx8fHx9fX+AhYmJhH98e3x7enp6eXl5eXp6enp6enp5ent7fHx9fn+AgIOEhIKDhIeHiIiIiYiIh4aIhoeIh4aHhoWDgn53dHBwcXFxdXqAg4SAfX+BhIaFhYaGhISFhYWEg4KAgH+BgYGCgoODhIWFhYWFgnx2dHN1dnVzdHV5f397eHh/hIB7eHh3eXp8e3t6eHl6eHd5eXh4enx8fH17e3t7fX9+fX1+fn9+fX5/f3+BgICAf39/f4CAgIB+e3t+goODg4KBgICBgICAgIKBhIOAfXx8fH1/gICBgYCAf358e31+f3+AgH17eXl5eXl5eXp6enl5enp5eXh6e3x8fX17enp9fXt6ent8ent7e32AgYKAgIB/f39/fn5/fXp3eHt+fn5+f39/f39/f39/f39/f39/f35+fn5+fn19fHx8fH19fX+Eh4iFg399fHx7enp5eXl5enp6enp6eXh5ent8fH1+f4CAgoOCgoOEhYWFhYSGiIiHiIeGh4eGhYSDgYB8dnNycXFycnN2eH+DhIF9e31/gIOEhYWFhYWFhIKBgIGBgoOEhIWFhYWFhoWEhoR+eXd3dHV2dnVzdHd8fXx8e319fXt6d3Z4enx7enh3enx+fX18e3p6fHx8fXx8e3x9f39+fn5+fn19f4CAgYGAfn5+fn9/gH9/fn+Ag4SEhIOBf35+f4GAfnx/gYKDgn98fHt8fYCAgIGBgIB/fn59fX5/f319fXt5eXl5eXl5enp6eXl4eHl5eHp7fHx9fXt7e3x8e3p7fHx7e3t7fYCBgX9+fn9/f39+fn99end4en5+fn5+fn9/f39/f39/fn5/f39/fn5+fX19fX19fXx8fHx8foCFiIaGg4F/fHx5eXl5eXl5eXl5eXl5eXp6enx9fX5+gICAgICBg4OEhIODhYaHh4eHh4aGhoSDg4F+e3dzc3Nzc3JzdHV4foKEgn97enx+gICCg4WFhoOCgoGBgoOGh4aGhoaFhIWFhYaFgn56enl3dHV2dXNzdXl6fH6Cgn57e3p5dnZ6e3p4dnN1e35/f39+enp8enl6ent7fX1+fn5+fX18e31+fn9/gX9/fn5+f4CBgYGCf3+AgYKCgoF/gH+BgHx4dniAgoKCf3t6ent+gICAgICAgIB/fn5+fn19fn58enh4eHh4eHp6enp5eXh4d3h5enp7e35+fXx7fHx8e3p7fHp8fHt9gYGBfX1+f3+Afn19fn55eHl6fn5+fn5+f39/f39/f39+fn9/f399fX19fX19fX19fHx8fHx9foGFhYWGhYSCf3x7enp5eXl5eXl5eXl5enp6fH19fn5/f4CAgICBgYKChISGh4eHh4eFhISEgoB+e3h2dHR0dHR0c3R1dnh8gYSEgn98fH19fn+BgoKDhYSEhIeIiYqJh4eIiIeGhYSEhIOBfnt7eXd0dHVycXJ1dnl8gIODgHx5eHd2dHd5d3VzcXBxc3V4e3x9fXx7enp8fHx9fX9/fXx7fHx8fn9/fn59fX6AgH9/f3+AgYKCgoGAgICAgH9/f4CBe3NyeYGCgoJ/e3p7fX6AgICAgICAgH9+fn5+fHx8fHx6eXl5eXp6e3t6enl5eHh3eHl6ent7fn59enl8e3t7e3x8enx7fH+BgX57e31/f359fX1+fnt5enx+fn5+fn5/f39/f39/f39/fn5/f319fX19fHx8fHx8fHx8fH19foCDg4WIiIaEgH57enl5eXl5eXl5eXl5ent7fH59fn5+gICAgYOEhIeIiImIh4aFg4SDgH99enh2dnd4dnZ2dXV1dXZ2d3x/hISDgX99f4CAf3+Cg4SGhYeLjIyMiomJiImJiIWDgoCAgIB8e3p6d3R1dnV0dHd4en6AhIJ/e3l3dnR0dHNycnJzc3V1dXV1eXt9fX5/fn1+f4CAgH9+fHx+fn59fX18fnx8fn5/fn5/f35/f3+AgoF/gICAf359gIB8c3R8goSEgn97enx9foCAgICAgIGAgH9/fn58e3x8fHt5eXl4eXl7e3p5eXl5eHd4eXp6e3t+fnx7ent7e3t7fHt7e3x+f4J/e3t9f35+fn59fX5+fHp7fX5+fn5+fn9/f39/f39/f39+fn5+fX19fXx8fHx8fHx8fHx8fX18fYCAgoWGh4eEgX57eXl5eXl5eXl5eXl6e3t7fH1+f3+BgoWGiImJiomJiIaFhIKBgH57enh3dXZ3eXl5d3d2dnZ2d3d4e3+ChISDgH5+gH9/fXt7fn+AgYSGhoaFhYeHhoaGhoN/fn59fXx7fH16eHd3dHV0dnt8eHh7fXx6eHRzdXVzb2xtcnd3dnZ3dnR2en6Bg4SCgH5/gIB+fXx8fn+AgH9/f39+fX5/gH9+f39/fn59fn9/gIB/gIB/fHl7fXp2eH+ChISCf318fH1+gICAgICBgoODgoKCgoB/fn59fHp6eXh5eXt7enl5eXl4d3h5enp7e35+fHp5enp7ent8e3t7fX+AgX54eXx9fn5/f319fX16eX1+fn5+fn5+fn5+fn9/fn5/f35+fHx8fHx8fHt8fHx8fHx8fH19fX19fX9/goOFh4eHg316eXh4eHh3d3l5eXl6ent8f4CBg4WHioqKiYiHh4aFhIKBfn18e3l4eHh4eHh4eHh3d3d3d3d3eHl7foKDhIODgoGBfXZ1d3h4d3p8fX+BgYSFhYN+f3+ChoeEgX+AgH1/g4J9eHZ2dnR3eHdycHV4eXp3dXN0d3dwaGhwdnl4eXl5eHd5e35+gYODgoB/fXt8fn1/gH+AgH+BgX9+f4KCf399fnt6enx+fYB/fHt6e318fH1+fHp8gIKDhYOBfn19fn+AgYGCg4ODhYWEhISCgoKBgYB/fXx6eXl6e3t5eHh4eHd3eHp7enp8f357eXl6enl7e3t7e3t8gIF/enZ5fH5/f39/fn18d3d5fX5+fn5+fn5+fn5+f39+fn19fn58fHx8fHx8e3x8fHx8fHx8fX19fX19fX19f4KEh4iHgX16enp6enl5eXl5eXp6fH6Cg4WHiIiKiYiGhYSDg4GAfXx7enh5eXl5eXl5eXl5eXh4eHh4eHh5eXt9gIODhIOCgX18eHVzcnN1dnZ4enx8fH19fYGCgoODhIaGh4WDgICEgn15dXZ2dHJxcm5rbnN3e3p3dHR0dW9lY2pzd3h6e3t6eXZ4e3t6foGBfXt6en1/goOBgICAgYF/fX19fn59e3p6e3t8fn57enp7fHx8fHyAgX99foGBg4SFhIOAfn5+f4GCgoODg4OCgYKBgYCAgIGBgYGBgX98e3p7e3l4eHl4d3d4eXp6enx/fnt5eHh5eXp7e3t7e3yAgX55dnl8fn9/f39+fXt3dnl9fn5+fn5+fn5+fn5/f35+fn5+fnx8fHx8fHt7e3t8fHx8fHx9fX19fn59fX19gIKGiIeFgn58e3t6enp5eXl6fH2Bg4aHiIiHhoeGhIKBgYCAfHt6ent6enp6enl5enp6enp6eXl5eXl5e3t6e3t/gYKDgYF/f399d29sb3R1cXN5eXt7en1+gYKEg4OEg4OCgoKAfoGDgnp3d3V1cGtsbmxtcHd9fXh1dHRzb2lobHN3eXt8fHt7eHd3d3R4f4KBgHx6e36BgoGBgICBgYB+e3x8fXt4dXZ4ent9e3h4eHt8fn1/f4CCgH6AgYCBhIaGg4B/gICAgoSEgoOCgYB/gICBgH+BgICBgYOCg4F9e3p5eXl3d3h4d3h5enl6fH9+fHh3d3d5e3t7enp8fYCCfnp2eHx+f39/f4B+e3Z1eH1+fn5+fn5+fn5+fn9/fn5+fn5+fHx8fHx8e3t7e3x8fX19fX19fX1+fn5+fn6AgYSHiIeFg4OCgX99fXx8fH1+gIOGiIeHhoWEgoGAfn18fHx8e3t8fHx8e3t7e3t6ent7enp5eXl5e3t7e3t8f4CDg4B/fn+AgHlybGlucnJucHV4fHx8fn+BgoSDgYODg4KCgoB+gYGBfXl3d3VubWlvcG5ucnZzbW1wdHVzb21wdHd5e3x8e3t5eHd2c3R4f4ODgX99f4KDgoGAf4CBf318e3t9fXx9enl6e3t4e35/fn+AgYF/gIGBgYKBgIKDhYeEgYGBgYGBgYKCgoKCgYCAgH99fH5+fn+AgICBgYF+fHp5eXl5eHd3eHl6eXp8f398eHd2d3l6e3t6enx9gIKAfHh7fH5/f3+AgH55dXZ5fX5+fn5+fX1/f39/fn5+fn5+fX18fHx8fHx7e3t7fHx9fX19fX1+fn5+f39/f39/gYKGiIeGh4eGhoOCf35+gIOEhoeGhYSDgH58fXt7e3t8fH19fH18fHx8e3t7e3t7e3t7e3p6enp7e3t7fH6AgoSDgYB/f4OCfHNtamxtcnZ1eHt9fX1/gYGCg4GBgYCAgIGBfXyBg4J/enh2cm1pZ2xxdHRyb21sbXF1dnRxb3J1d3h6e317enl5eHZ0cHB0eX2AgH1/g4WDgX9/gIGAf319fn19fn59eXh7e3x8f4CBgICAgH9+f4GCgoGBgoOEhISCgICAgIB/gIKDg4SEhISCgH5+fXx7e31+foCBgYF/fHl5eHh2dnd6eXl7fH2AgHx4d3Z2eHp6enp6e32AgoF/e3x9fn9/fn9+fHl2d3t/f319fn5/f39/f39/f35+fn59fXx8fHx8fHt7e3t8fH19fX1+fn5+fn5/f39/f39/gIKEhoaGiIiIh4WDgoOEhYaGhoSCgX98enp8fH19fX19fX18fXx8fHx8fHx8fHx8fHx8e3t7e3x8fHx8foGDhYWHhIGAfnx6dGxoaWtyfIB+fn9/gH9/gICBgYB+fn2AgX98fIGFg4B8eXZvaGRlbHJ2dnRyb29vcXJ1dXRzdHV3d3d6e358end2eHh3dXV2d3h3d3yAgoKCgYCAgICAgIGBgH59fX17en6AgH6AgIGAgIB/fn5/goKCgYGBgoKCgoGAgICAgICBgoOEhoaHh4aEgn9+fXx6eXt7fH6AgYB+enZ3d3Z2dnh4eXp8fYCAfHh1dnZ4enp6enp7fYCCgYB8fX1+f39+f358eXZ4fX19fX1/f39/f39/f35+fn5+fn19fX18fHx8e3t6fHx8fX19fX9/f39/f39/f39/f35+gICCg4WFh4iJiYeFhYWEhISCgX57e3p6e3x+fn5+fn19fX18fHx8fHx8fHx8fHx8fHx8fHx8fX18fH6DhYSHiIaEg4OCgH98dW5sbXZ/gYCBgoF/f359fX+Af35/fX6AfXp8gYWEgnx5dG5mYGVtcnR3d3RycnNzcnR1dXNzdHVzdHl6fX14dHN1d3h3c3R3d3d4fH9/gYGAgICAgICAgIB+fn18fHl6fX19gIB+gICAfn18fH+CgoKCgYGAgYKCgYCAgH9/goKChYWGh4eGhIKBfn5+fHt6enl6fH+AgYF8eXd2dnZ2eHh5e3p9gIB9eHR0d3l6enp6ent/gYB/fn1+fn5+fn5+fXt5d3l8fX9/f39/f39/f39/fn5+fn5+fX19fXx8fHx7e3p8fHx9fX19f39/f39/f39/f39/fn5+fn6AgIGDhIaGhoWFhYOBgH18e3t8e319fX5+fn5+fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx9fX19gISEhomKioiGhYSEgYB+e3Z0d32Bf4CAgn59e3t7fH6AgH58enx8eXuAgoSFgHp0bmZjZm1zdnh4d3d2dXR0dXZ3dnd1dHFydXZ5eXdycXN1eHZ0dHZ2d3d6fH1+gICAgICAgICAgH9+fX19enp8end2dHd7fn9/fXx+gIKCgoOBgIGBgYKBgYGBgoKBgYKEhYWEhIWDgX57e3x9enl5eHd5e36Bgn98eXZ2dnZ4eHl6e36BgH14dHR3eXp6enp6e3+BgH17fH5+fn5+fn59e3l3eXx/gIKCf39/f39/fn5+fn5+fX18fHx8fHx8fHx8fHx8fH5+fn5+fn5+f39/f39/f39/f35+f39/fX1+gYKDg4KBf358e3t7fX19fn5+fn5+fn19fHx8e3x8fHx8fHx8fHx8fHx8e3x+fn5+fH+ChomIiYuLi4eFhYOBgIKEgHp5e35+fn+Cfnp5eXp6fX+AgH9/fnt4eoCGh4aAenRvamVnbnJ1dnZ4eHh1dHR0d3h5ent5dXN1d3d2cnBvcnNzcnFydHV2eHp5enx9f4CAgICAgICAf319fX5+f4B/fnx4dG5zfIB+f4GChISEg4GAgYGAf3+AgYGBgYKCgoOEg4OChIN/fHl5eXl6eHh4dnZ6fX+BgX95dnR0d3h4eHl7foCAenVzdHd5enl5eHp9f4F+e3h6fX9/f318fHx6d3d5fYGBg4V/f39/f39+fn5+fn59fXx8fHx8fHx8fHx8fHx8fn5+fn5+fn5/f39/f39/f35+fn5/f318fHx9fn9/fn17e3p8fHx9fX5+fn5+fn5+fX18fHx7fHx8fHx8fHx8fHx8fHx7fH19fX1+gIeLhn5/hIuLioWEhIODhYeJhX16e4CBgIB8enl5eXh6fYCAgH58d3R4goaHhoF6dG9qZmducnV2d3d4eHV0dHZ3eHl8fXl3dXd4d3Rwbm5vb29ub3JzdXd5enl6e31/gICAgH+Af4B/f35+fn+AgYGBgH99enZ0eH+AgoKCgoOBgICAgIB/f4CBgYGBgoKCg4SDg4KCgH56d3d2d3h3eHh1dnl7fYCCgX14dXV3eHh4eHt+gH95dHF0d3l6eXl4en1/gH14d3p8f39/fn19fHl2eoGChYWDgn9/f39/f35+fn5+fn5+fX18fHx8fHx8fHx8fHx+fn5+fn5+fn5+fn5+fn9/f39/f39/fn5+fH19fHx8fHx8fX19fX5+fn5+fn5+fn5+fn19fHt8fHx8fHx8fH19fHx8fHx8fHx8fX+CiYd/enyAhIWDgYCDg4F/gYeKg318f4ODfnx8fHp5dnd5fn1+fHp1cneAhoiHg311bmtoaG5zc3R1eHl3c3FzdXd5eXx8enh4eXh2c29tbWxqZ2ttcXR1eHp7fHt6e3x9f4GBgIB/f4CAf39+fX1/g4SBgoB+enZ1eYCBgoKCgoKAgIKEgoCBgYGBgYGAgYKDhIKDgoKBfHl1dXV2dnZ2dXZ3d3l6fH+Bfnx5d3d4eHh4e3+AfXhzcnR3eHl5eXh7foGBfXV1e31+gH9+fXx7eXyCg4KCgoODf39/f39/fn5+fn5+fn59fXx8fHx8fHx8fHx8fH5+fn5+fn5+fn5+fn5+f39/f39/f39+fn58fX18fHx8fHx9fX19fn5+fn5+fn5+fn5+fX18e3x8fHx8fHx8e3t8fHx8fHx8fHx9f4WCfXp9eHd6fHlzc3h7eHR0eIKGg35/fXx+fn1+fnt5d3Z5ent6d3Rxd4CDhYWDfXVta2hqbnN0dXh4d3BqZmdpam1yc3Z3dnZ3d3Rxb2tnZGRoZ2tydXh6e3x9fHt7ent/gICAgYSFhoWDf359end5enx9fn19fXt3en+BgYGBgYGBgoOBgIGBgYGBgYCBgoOEgoOCgX97d3Rzc3R2dnZ1dXZ3eXl7fn+AgHx3d3d3d3h7foB8d3JxdHd5enl5eHt/gX95c3V8f36Af359fHx/hIOCgYCAgIB/f39/f39+fn19fX19fH19fHx8fHx8fX19fX5+fn5+fn5+fn5/f35+fn5+fn9/f39/f35+fX19fXx8fHx8fHx8fn5/f35+fn5+fn5+fn59fX18fHx8fHx8e3t6ent7e3t8fHx8fH1/f3t6fXpydHR1dnR1dnNwb29udHyCfHp4d3t+gH9+fXp3dnZ4eXp3cnJ5gIOEhoJ9d29saWhscnV4eHdyZ19dXVxgam9xc3FycnRzcnFtaGRkZGlqbXJ4fH5+f359e3p7fX+AfHp8foCBhIaBfXl3d3d5d3ZzdXp9fXl3fICCgYGBgYGBg4GAgICBgYGBf4CCgoOCgoF/fHl2c3Nyc3V1dnV0dXd3eHp9gH9/fnp4d3d3eXx+fnp1cXF0d3p7eXh4e4CBfXZ0eX1+f39+fXt8gISEgoOBfn5+fn9/f39/f35+fX19fX19fXx8fHx8fHx9fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/fn59fX19fHx8fHx8fHx+fn5+fn5+fn5+fn5+fn19fXx8fHx8fHx7e3t7e3t7e3t7e3t6e3x6d3h6d3J1enx8f396cm5vb25udH19eHZ2en1/gH59e3h3d3h5eXh2dnqAhIWFg314cW5qaW1zdnh2dnBjVE9PTVdkb3JzcXBvbmxsaWtqaWdnam1ub3N2en1/fnx6eXp9f4B+e3t8fX+BhIeDf3t5d3h9fnx8fn58d3Z4fH+AgX+AgIGDgYCAgIGBgIB/gIKCg4KCgX98d3RycnJzdXV1dHR1d3d4eHx9f4B/fHl3dnd3e35+enVxcXR3ent5eHh7foB7dnR5fX5+f317fYGCg4OCgX9+fn5+gIB/f35+fn59fX19fX19fHx8fHx8fH19fH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn58fX19e3x8fHx8fH19fX1+fn5+fn5+fn5+fXx9fHx8fHx8fHt7enp7e3t7e3t7e3t8fXl2dXp2bnF3d3p+f350cW9vcG9zfH52dXZ7fX9/fn17enh3eHh3d3d4en+CgoODg351bmprcHN1dXV2cWlUTE5WX2lydHRzcW9pZmVlZmhpZ2VmbXFyc3V3ent7eXh4enx+fXx9fHt9gIKGiYqFf3x6d3p9f39/gYB/fHVycnZ8fH1+f4OAf4GBgIB/f3+AgoODg4KBgHx2dHFxcnN0dHRzdHZ2dnd3enx8fYB+eXd1dnh7f355cnBxdXh5eXl5eHt/f3t1dHl9fX59fH+ChISDg4F/fn19fX1+fn9/fn5+fn19fX19fX18fHx8fHx8fX18fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fnx9fX17fHx8fHx8fX19fX5+fn5+fn5+fn59fH18fHx8fHx8e3p7e3t7e3t7e3t7e3x8eHBucXBsbXJzc3d7enRxcXFvb3F7gHl2d3t8fX1+fXx7eXh4eHZ2dXd5fH9+en2AgXp0cHF0dXV2dHRwa2FcW2JobXFycG5tbm5raWdlY2NjY2dudHR0dXh5enl3dXR3en19fX9+f4CFiIWEhIeIh4N7eXt8f39+f4CAf3x5eHRvcnZ7f4B/gICAgH9/f4CCg4SDgoF+e3VycXFyc3R0dHN0dnZ2dnZ5enx9f4B6d3d3eHt/fnhycHF1eHl5eXl4e39+eXN1en19fXx/goSDg4KAf319fX19fX5+fn5+fn5+fn5+fn19fX19fX19fX1+fn5+fX1+fn5+fn5+fn5+fn5/f39/f39/f39/fn5+fX19fHx8fHx8fHx9fX19fX19fX9/f39+fn19fHx8fHt8fX18fHx8fHx8fHt7e3t8fXx3b2hoa2xvc3Fvcnl7dXBydHNxdXyBfHd4fHx8fH5+fHx7end2dXR0dnd3e3t7fX9/gHp3dnZ1dHV0cm5pZmJjaG9wb2xqZ2ZpbXFwbWhlX1pbZHB2eHh4eHh2c25tcHJ3fH9/f4GBgoJ/fn59f4GFjIV+ent8fX5/gICAf36AgX12cXB1en1/gIGAfn9+gIKFhYOCgX15dXJwcXNzc3NzdHZ2dnV1dXZ4e32AgHx3dnZ4fX99dnFxcnd4eHh3eHh7f396dHR6fn59gIKEhIODf359fn58fH19fn5+fn5+fn5+fn5+fX19fX19fX19fX19fn59fX5+fn5+fn5+fn5+fn9/f39/f39/f39+fn59fX18fHx8fHx8fH19fX19fX19f39/f35+fX18fHx8e3x9fXx8fHx8fHx8fX19fXx9fXhwa2tqa21wbW1wdnx5dHN2dnR3fH58eXp8fHx8e3x9fHp5d3Z0c3R1dnZ4fHx9fn5/fHl4d3Z3d3d0b2xqaGtvcG9sZ2JgYGNobnBuamdjX2BocnZ4eHh4dXJtaGhuc3Z6fn9+f4KDfn5+fn5/goeNjYeDgH18fn5/gIB/f4CCgn+AenRxb3R3ent8fn2AgYSFg4KBfHh0cXBxc3Nzc3N0dnZ1dHR0dXd6fICAfHd2dnh9fnt1cG9zd3h4eHd3eXt+fnh0dnp8fYCDg4ODgn57eXt8fHx8fX1+fn5+fX19fX19fn59fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn99fn5/f39/f39/f35+fn59fX18fX18fHx8fX19fX19fX1+fn5+fX19fX19e3t7fHx8fHx8fHx8fHx8fHx8fH1/enJsamtsbWxnaGtze3p4dnV1dnl9fn17e3x+fHp8e3t7enp3dnZzcnJ1dXh8f4B/fX19fHt5eHZ2d3Rwbmxub3FycGtkXVhYXWNqb21pZGJeX2ZwdHV2eHh0bmhkZm92d3h5eXp7f39+fn5/gICEi5SUj4qDf359fn+AgICBgYGCgYB/gH17c29wcXF0eX1/goODg4F8d3RycXJycnJyc3R2dnV0c3N0d3l8f397d3V2eXx/enRwcHN3eXh4eHd5e358dXJ2eHt/goODgoJ/e3Z5e3t7e3t8fH5+fn59fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+f31+fn9/f39/f39/fn5+fn19fXx9fXx8fHx9fX19fX19fX5+fn59fX19fHx7e3t8fHx8fHx8fHx8fHx8fHx8fX96cmxqbGxsZ2RmanF5fXp5d3h4en19fHx8e3x8ent6enp7enl4dnVzc3N0dHmBgYB9fX18e3l5eXl5dm5qbW9xcXFva2NaVldfZmhlY2JhYWFjZ25xcnR1dXJsZmFka3J1d3p6e317eHh6fYGCg4WJj4+LiYSBgH59fn+AgYKCgIGBgICBgYGAend2eXx+gICCg4OBgHt3cnBvcXJycnJzdHZ2dXRzc3R3e35/f3p1c3V5fH55dHBwc3d5eHh3d3l8fnp2dHV4f4GCg4KBgXt2dXl7e3t7e3p6fX1+fn19fX18fH19fX19fX19fHx9fX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn59fX19fX19e3t8fH19fX19fX5+fX5+fn19fHx8fHp6e3t8fHx9fX18fHx8fn59fX5+fntya2hrbWtlZGhucnuAfnt6enp6fH18e3t8fHx8e3p6eXp6enp5d3RzcnJzdn6AgH59fHx8eXh5eXh1b2tsb3BwcG1pYltYWmRjXlZYWVxeY2dqbXBxcnN0cWtnY2Npb3V3ent8fXx6d3Z5foCChoaGh4eGg4GAfn1/f4CCg4F/gIGBgICAf39+fX5+f35/gYKDgoF/enVwb29wcXFzc3N0dnZ1c3NzcnZ7foCAe3ZzdXp9fHdybnBzeXl5eXZ2eXt+eXN0d32Cg4GBgYF9dnJ0ent7e3p6en19fX19fX19fXx8fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn19fX19fX19fX19fHx8fH19fX19fX19fX18fHx8e3t7e3x8fH19fX19fX1+fn19fn5/fXNraWpraWVmbHN2fH9/fnx9fXp8fXx7e3x8fHx7e3p6e3t6eXl3c3FxcnN2e4CBgH9/f3x2dXZ3eHVwbWxqamxtbmtmX19pb2tbS05OT1dhZ2prbG9xcnFvaWViY2ltcnZ6e3x9fX+AgIGBgoOEh4aHh4eCgYF/fn9/f4GDgn59fX9/f39/fn5+fn5/f3+BgYKBf315dHBvb3BxcXNzc3R1dXVzc3N0eHx/gH95dHN1eXx8d3FwcXR3d3d3dnZ5e3x3c3R5gYKCgYGBf3lycnd7fXt7enp6f319fX19fX19fHx9fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn19fHx8fHx9fX19fX19fX19fXx8fHx8fHx8fHx9fX19fX19fX5+fn5/f359dWtoaGlqZ2lwdXl8gX9+fn1+fXx8e3t7e3x9fXt7e3p6e3x8enhycG5vcnN4foKBgYGBfXdyc3R2d3RwaWVjZmpra2hkaGpsaFxSS0hIUFplZmJhZ29wb2tnY2BgY2dtdnt8e3t9f4GBhIWGiImJiYmKiIOAgICAfn1+gYOCfn19fX6BgH9+fn5+fn5/gIGBgYB+fHdzb25vcHBxc3NzdHV1dXNzc3R3fX+Bfnh0dHZ5e3t2b3BydXd3dnZ2dnl7e3dzd36CgoGBgX96dXJyd3t7enl6e3yAfX19fX19fX18fH19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fX18fHx8fH19fX19fX19fX19fHx8fHx8fHx8fH19fX1+fn5+fn5+fn9/g4N8cGpqa2tvcXV5fX9+fXx8fYCAf3x7e3t9f39+fHx7e3t5enp3dHBubW5xcXR6f4GBgH9+eHJxcXR2c29oY2RnaGdeX2NqbG1oYVdRTk1PWWZhV1dgaW1ua2ZiX11fYm11fH17e32AgYOFhoaGh4iIiomKhoOBgYKBgH+Ag4J/fHx9foB/fn5+fn5+fn5/gYGBgH58eHNwbWxtcHFzc3N0dXV1c3NzdHd9f4F+d3N0dnl7enRvcHN2d3d2dnZ2eXt7d3V8goOCgoF+e3d1cnJ3e3t6eXp7foJ8fHx8fHx8fHx8fHx9fX19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn59fX19fHx8fHx8fHx8fHx8fX19fX19e3t9fX19fn59fX5+fn59fX5+f4KHh4F2cG5tb3Z4enx+fXt8fX5+gYOEgn99e3t8fX19fXx7e3p5dnRycW1qa29xcXV7f4F/fHp1cW5vcnJxb2hlZWhsaF1VWGNraWdfV1RWWV5iaWBXUFlla2pnYV9eXGBkbXZ8f3x7fH+BgYSFhoWFhoeIiYqJh4SDhISCgICDg399fX1+fn9+fn5+fn5+f4CBgYKAfXt3c29sbG1wcnJyc3N0dHNzcnJ2eX6Af3x2c3N1ent4c29wcnV3dnV1dXZ4e3l3e4GEhIKBf3p2dnJvdHl6enp6en2AhHx8fHx8fHx8fHx8fH19fX1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn19fX18fHx8fHx8fHx8fHx9fXx8fX1+fn19fX1+fn5+fn5+fn19fn+ChomDfXh2dnR1eHt9fn99fH1+gH+BhIeHhYF9fX19fX19fHt6eXh2c3FubWxrbW9wcXR3d3h2dXFwbm5wcHFvZ2JlbXBtYFZXWWFjZF5ZWmBgX2BkXlpQU2BoY1VTVl1dYGRudHl+fnx7fX5/gYKDgoODhYiJiomJhoSEhIOAgIKDgH19fX5+f359fX19fn5/gIGBgX99e3dzb2xrbG9xcnJzc3R0c3NycnZ6f4GAe3Zzc3V5enZxbm9ydXZ2dXR1dnh6d3uAgYKCgYB7eHh6eHh8f39/f39+gYOEfHx8fHx8fHx9fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fX19fXt7fHx8fH19fHx8fHx8fHx9fX19fX19fX5+fn5+fn5+fXx8gIaIhoF/gH5+enp6fH5+fXt8fn+AgYKDhoqKh4SAfX18fn18fHp5eHZzcG5ub25rbG9yc3JycXBxdHJua21vcG9nY2ZraWdkWVFWXGJjYWBiY19cWFlWUlFVXmZjU0pOWVxgZm5zeH5+fX18fXx+f39/gIKEhoiKiYeGhoSDgoOCgH99e31/f39+fXx8fHx9fn+AgYF/fnt5dnNvamtsb3BxcnR0dHJzc3Fydnp/gX96c3JzdXl5dXBucHJ1dXR0c3R2eHh6foKBgoKAfnx8gICAgoOEg4ODg4SEhIR8fHx8fHx8fH19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn59fX19fX18fHx8fHx8fHx8fHx8fH19fX19fX19fn5+fn5+fn5+foCEiYiGhIKCf4CAfnp9f359fH6AgIGBgYKFioqKh4WDgH5+fXx8enl4dnJvbWttbWtqbnBycnR0cW5vcXFsa2xubWllZ2ljXVpbVVdbYWBeXF9mZ2FcWFRPVFhdYmFXTU9YX2VrcnZ6fX1+fn1+f39/gICAgoOFhYeHhoaHhIKChYSAfn5+fn1/f359fHx8fH1+f4CBgYB9enh2c29qamtub3FydHR0cnNzcnR4fICAfnlzcnN1d3d0b25wcnV1dHRzdXZ2en+BgYKCgoKChISEhISEhIWEhISEhISEhHx8fX18fHx8fX19fX5+f39+fn5+fX1+fn19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+f39+fn5+fX17e3x8e3t7e3p6fHx8fH19fX19fX19fn5+fn5+fn5+fn5+goeHhoWCgoGAgH97en6Bf359foCAgoOEg4SJiYqIh4WCf35+fHt6eHd0cm5qa2xtampsb3JydHVybW9uamlub29ubGhpaWNZWVxaXWFhXlRPWmlvamJaWFpfX2BkZVtQVFxka3F2enx9fX5+fn5/gICAgIKCgoKCgoWHiIaGg4SGhoJ/f4F/fn1+fn18fHx8fH6AgIGBf3x7eHVybmlpam5wcXJ0dHRycnJydXl9gIB+eXJxc3V3dnFubnBzdXRzc3Rzdnl/goKCgoKDhYWFhIaEg4SEg4KDg4ODg4ODfX19fXx8fHx9fX19fn5/f35+fn59fX19fX19fX19fn59fX19fn5+fn5+fn5+fn5+fn5+fn5+fn5/f35+fn59fX5+fHx7e3t7fX18fHx8fX19fX19fX1+fn5+fn5+fn5+gIOGiIWEg4KCgYCAf3p6f4B+fX1+foCAgYKCg4WGhoiJhoJ/gYB9fHp4dnNxbWpoampra2tvcXJ0c3FubWtscHJxcHBsampsZl5bXWFiY2BWTVVhbG9qYl1eZW5taGlnYFpdY2tyd3l6fH19fX1/f4CCgoODhIKCgYGBhISGiIeEhIaIhYB/gH9+fn9+fXx8fHx8foCAf39+e3p3dXJuaWlqbnBxcnR0dHJycnN2en6BgH13cnFzdXZ0cG1ucHN1dHNyc3R2fICBgYSEhYWFhYWDg4KBf4B+fX1/goKCg4N9fX19fHx8fHx9fX1+fn9/fn5+fn19fX19fX19fX1+fn19fX1+fn5+fn5+fn9/fn5+fn5+fn59fX9/fn5+fn19fHx7e3x7e3x8fHx8fHx8fX5+fX1+fn5+fn5+fn5+fn+Eh4iFg4KBg4KBgH99eXl/gX98fHt8eXl5fH19gIGChYeGg4OCgX5+fHt3cW5taWdoam5vbm5xcnR0c29tbnJycHBvcGxqbGtlXV1hZWZhWU5TXWdubmpnZGJmb29paWlhWVtkbnV4enp8fX19fX5/gIGEg4WFg4KCgoGBg4WKi4mFhoiJhIB/f31/f359fHx7e3t+f39/fnx6eXd2c3Bsamtub3FydHR0cnJyc3d8f4CAfHVxcXN1dnJvbW5yc3V0c3NzdnqAgYODhISEhISEhIF/enh6e3x5e4CCgoCBgX19fX18fHx8fH19fX5+f39+fn5+fX19fX19fX19fX19fHx8fH5+fn5+fn5+fn5+fn5+fn5+fn9/f39+fn5+fX18fHt7fHt7fHx8fHx8fHx9fn5+fn5+fn5+fn5+fn5/gYaJh4SDgoGDgoGAf398e3+Bf318enl4d3d3d3l7fHx/hYaEhIKBfn19e3hxbm1raWlrb3FzcnNzc3N0c3Jzc3FycnJwcG9vbF9ZXmVoZV1VVF5nbG9saWdlY2lwa2NiZmNcXWVwdnl7enx9fX19fn5+fn5+gIGBgYCBgYCCg4SHiYiGh4iGhIKAf39/fn18fHt7e35/f359e3l4dnZzcGxqa25vcXJ0dHRycnJ0eXx/gH96dXFxc3V1cG1sbnJzdHRzcnJ5f4KDg4ODg4SEgX17dnFydHd6e3l8gIOCgX5+fHx9fX19fHx+fn5+fn5+fn9/fn5+fn5+fX19fXx8fHx9fX19fn5+fn5+fn5+fn5+fn5+fn9/fn5/f35+fn19fXx8fHx8fHx8fX19fX19fn5+fn5+fn5+fn5+fn5/gIKFiIeFg4OBgIOBgoB/gX9/gH58fnx4eHh4dnZ1d3t8fH+ChIWDgn99fHx8enJubWxsbG1wcnZ2dnR0dHR0dXZ0cXJ0dHJycXBpYFtia25lW1ZcZWptbmtnZGRnbW1pZGVnZGJla3J1enx9fX5+fn5+fXx8e3x+gYGBgICAgIGBgoOFhYaGhoeHhYKAfn9+fXt6enp7fX9+fXt6eHh3dnRxbmxsbW9xc3NzcnJycnV6fX9/f3lzcHFydHRwbGxvcXRzc3JxdXyBg4OCgoKBgn12c3FvbW9yeHl6fH+BhIF/fXt9fX19fX19fX5+fn5+fn5+f39+fn5+fn59fX19fHx8fH19fX1+fn5+fn5+fn5+fn5+fn5+f39+fn9/fn59fX19fHx8fHx8fHx9fX19fX1+fn5+fn5+fn5+fn5+foCAhIeHhYOCgYCAg4OBgH+BgoKAfXt8enh4eHh2dnV2enx9fn+DhYSCf318fXx6cm5tb3BvcHJ0eHh4d3Z2dHR2dHNyc3V1c3JxcWpgX2ducGhfX2VqbW5tamZlZmlra2hpaWhmZmptcXV6fH19fn5+fn58fHt6fH6BgYGAgICAgICAgIGDhIWFiImHhIB+f4B+fHt6ent9fn5+fHp4eHd2dXFubG1ucHFzc3NycnJydnp+f4B+d3JwcXJ0c29tbXBzdHNzcnR6goODg4KCgX13c3Bvbm1sbXN5ent+gIOCf357en5+fn59fXx+fn5+fn5+fn5/f35+fn5+fn19fX18fHx8fX19fX19fX19fX5+fn5+fn5+fn5/f35+f39/f319fX19fX19fHx9fX19fX19fX5+fn5+fn5+fn5/f36Af4SIiIWCgoGBgYGCgoGAf4GCgX58ent5eHh4eHZ2dXZ4eXt8fYKEg4OAfXp7fHl1b21wcnR1dnh7e3t5d3V0dHZ1cnJ1dXR0cnFybmdla29vbGhpbG9wbmhnZmVnaGZmaW1saWhrbXBydnp8fH1+fX5+fX17e3p7fX5/f35+gICAgIB/gIGCgoSGh4aEgX1+gH99e3t7e3x+fXx7enh4d3Z1cG5tbW9xcXJzc3JycnV5fX+Af353cnBxc3RxbmxtcHNzc3JzeX+Dg4OBgH54c3Jwb25ubWxvc3d5e3+BgoF+e3p5fn5+fn59fH5+fn5+fn5+fn9/fn5+fn5+fX19fXx8fHx9fX19fX19fX19fX19fX5+fn5+fn9/fn5+fn5+fX19fX19fX18fH19fX19fX19fn5+fn5+fn5+fn9/gIGFh4iGg4GBf39/gYKCgYB/goOBfHl3eHh3d3h4dnd3d3RubG14goWEg4B9enl6enhyb3FzdXd6fX5+fXx5eHZ2dnV2dnNzcXBwb3Fva2tvcHBtbW5xcW9nYWFjYmFhYWRqbW1rbG5wcXV4e3x8fXx9fX16enp6eXp9fn9/fn59fX9/gICBgYGCg4SEhISDf35/gH99e3t7fH18e3t6eHh3dnVxbm1ucHFxcnNzcnJydXp9f4B/e3RxcHFzdHBsbG1wc3Nzc3Z8gYODg4F5cnBwb29vbmtqbXF3ent9gIKCgH16eHh+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn59fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn9/f4CBhIiJhoOBf39+fn+ChIKBfn+DhYF9eXd3dnZ2d3l5eXh4cW1qanKAhoSCgX55e3t7eXd0cnR3enx+f4GAf3l4d3Z2dXRzc3Nwb25sb3FwcHJyb21tcHJxbWRfX2FiYWBgZ2xvbm1ucHBydnl8fX19fX18e3t7enp7e31+fn9+fn1+gICBgIGBgYGAgYKFhoaBfn+AfXt6ent8fHt6enp4eHd2dXJvbW5xcXJzc3JxcXJ1en2AgH55c3FwcXFxbmtrbXFzc3V2fIGDhISDf3Nwb29vb21sa2pudXd5fH+BgYB+eXh3d35+fn5+fn5+fn5+fn5+fn5+fn5+fn59fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f39/gISIiIaEhIGAfn5/gYODgoCAgYSEgHt5d3d2dnZ3eHl4d3Vybm1tcHyFhYKBgYCAgH58enh1dnd6fH5/gYB/fHt6eHZ2dXRzcW5tbm5wc3R1dXRwb3Byc3JuZ2NjY2RjZGhsb3BsbG9xcnR3enx+fX19fXx7e3t6ent7fX5+f35+fX6AgIGAgYGBgX9/f4KEhYJ9fn98enp6e3x8e3p6enh4d3Z1cm9tbnFxcnNzcnFxc3Z6fX5+fHd0cXBxcXFua2xvcXNzd3uBhISDhIJ3cG9ubm5ubWxram51eXp9gIGBgH55eHd3fn5/f35+fn5+fn5+fn5+fn5+fn5+fn19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fX19fX19fX19fX19fX19fXx+fn5+fn5+fn59fX5+fn5/f3+Dh4eGhYOCf319gIKDhYOBgH+BhIF/e3l3d3Z2dXd4eHV0dHRycW1ue4WGg4CBgICAf358enh4eHl7fH6Af357eXl5eHZ1dXRyb29xc3R0dnZ3dnRycXJ1dXFqZWRlZWVmaG5wb25vcHJzdXp8fX19fXx8fHt6enp6ent9fn9/fn1+fn+AgICAgICAf35+fn+AgX9+fnt6eHh7fHx7enp5eXh3d3Rxb25ucHFzc3JxcHF0eXx9fHx8dnJwcHBwb21sbG9ydHZ7gIKDhYOEfnFubG5vbW1sa2trbnR4en+BgIB/e3l4dnZ/f39/fn5+fn5+fn5+fn5+fn5+fn5+fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn59fX19fX19fX19fX19fX19fH5+fn5+fn5+fn19fn5+fn9/gYaJh4WDgX99fH6AgoOEhIF/f4GEgYB9eXd3dnZ3dnZ1cnJyeXt2dHV9hYeEgYKBgIB/fnt6enp6ent7fH1+fXx7enl4d3Z3dnRzc3R1d3d3eHp6eXdzdHZ2c29raWhmZWdpcHFwcHFydHV3e3x9fX19fHx8e3p6enp6e31+f39+fX5+fn+AgICAgICAf3+AgH+AgH99fnx6ent8fHt6enl5eHd1dHFvbm5wcXNzcnFwcXR5fH18fHl0cG9wcG9ubWxtcHN1eH2Cg4SEg352bGxtbW5tbWxra2tvdnp9f4GAgH56eHZ2dn5+fn5+fn5+fn5+fn9/fn5+fn5+fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn59fX19fX18fH19fn5+fn9/f39/f35+fX1+fn5+f4KGiIiFhIGAfXx+gIKEhISCf35/goOAf315d3d2eHd2dXJvcHN5fHt9foGFh4aCgoKAf359fHt6enp6fHx8fX5+fn58e3p6eXh4dnZ2dnZ3d3l5e319fHh2dnd3dXBua2loamxycXJydHd3eHt8fH19fX19fHt6e3p6enp7fH5/f35+f39/f39/gICBgYGAgICBgH9/fX17enp6fXt7ent7enh2dHR0c3Jwb3BxcnJycm9yd3x9fXx6dXJvb29vbm1sbW5wcnd8gYKDhIJ/em9sbG1tbWxra2ppbHJ4e3+AgYGAfXl1dXR2fn5+fn5+fn5+fn5+fn5+fn5+fn59fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn19fX19fXx8fX1+fn5+f39/f39/fn5+fn19fn5/g4eIh4WDf3t7fn+AgoSFg4F+fYCDgX+Af3x4eHh4eHZzc3Btb3N3fYCBgIGGhoOAgICAf358e3t7fHx8fHx9fn5+fnx7enp5eHl5eHh3eHh4ent8fX18enl2d3d3dXJxb21ub3N0dHZ3enp5fHx8fX19fX18e3p7enp7ent8fn9/fn5/f39/fn6AgIGBgICAgH9/fXt4eXt9fXt8fHx7e3t6eHZ0c3NzcnBvcHFycnJycnV4fH18endycG9vb29ubWxtbnB0en+Cg4ODgXtybWxsbW1tbGtramptc3l8gIKBgX57dnV1dHZ+fn5+fn5+fn5+fHx+fn5+fn5+fn5+fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fX19fX19fX19fX19fX19fX5+fn5/f39/f39+fn5+fX1+foCFiIeGg4B+fHx/f3+CgoSDgYCAgoOBf4CBfXl5enp5eHVycG1tcnd8f317e4OGhICAgYGAf4CAf3+AgH9/f39+fn58fXt6eXp5enl6eHh3d3h5e31+fn59e3h3dnZ5eXd1dHJ0dnV3eHp8fHx9fn59fX19fXx8fHt6enp7e31+f39/f39/f399fX9/f39/f4B/fHx7eHV1eX5/f317e3p6enp4dnRycnNzcXBwcnJycXFydnp8e3t5dHFvb29vb29ta21vcnV7gYGDgoB/eXFta2xsbWxra2ppaW51eX2BgoKBfHh2dnZ2dn5+fn5+fn5+fn5/f35+fn5+fn5+fn59fX19fX19fX19fX19fX19fX19fX19fX19fX19fn59fX19fX19fX19fX1+fn19fn5+fn9/f39/f35+fn5+fn5/g4eGhYSBfXx9fX9/f4KCg4F/gYOEgn9+gIGBfHl7e3x6eHVxb25xdnt9fnt4fYKCgYCAgICAgICBgYGBgICAgH9/fnx7enp5eXh5eXp5eHd3eHp7fX5+fn17fHp7enp7enl4eHh5enx9fX19enx8fH19fXx8fHx8fHt8fHt8fn5/f39/f39/f39/f39/f39/gH58fH18enh6fYGCgX17enp6enh2dHJyc3NxcHBycnJxcXN4e316eXdzb25vb29vbWxra25zfYGCg4KBgHx0bmtrbGxtbGtramlpbnR4fICBgoB7d3V1dXV1fn5+fn5+fn5+fn5+fX19fX5+fn5+fn5+fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fH19fn5+fn5+fn5/f35+fn5+fn5+f4GGh4WFg398fH19gICAgYOEg4OEiISBf36AgYJ+enp9fXt6eHVxb3J2ent8e3x/goOCf4CAf4CAgIGBgYGAgICAf39+fHt6enl3d3l5e3t5eHd4fH1+gH5/fn59fX19fXx8fXx7ent+f398ent5eXp8fX18fH19fX19fX19fn5+fn9/f39/f35/fn5/f4B/f39/f319e3t8e3yAgoKBfnp5eXl4eHd1c3FydHJxcXNycnNzdnp8fHp4dHJwbm5ub21ta2lrb3Z9gIODgoCAeXJta2xtbW1ra2tqamtvdXt/gYGBfXh1dHR0dHR+fn5+fn5+fn5+fn59fX19fn5+fn5+fn59fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5/f39/f39+fn5+fn5/gYSGhIOBfnx8fX5/f4CBg4SDhYiIhIF+fX+AfXl3eHx/fXx6d3NxcnR3eHh7fX+DhYSAgIB/gICAf39/f4CAgIB/f358e3p6eXl5eXl7e3p5eHh4e31+fn9+fn5+fn5+fX19fHx9f399e3l4eXl6enx9fXx8fX19fX19fX1+fn5+f39/f39/f4CBgYKCgoB/f35+fX17e3x9fX+BgH17enl5eXh4d3VzcXJ0cnFxc3Jyc3R3e3x8endzcXBubm5vbW1ra21zeoCBgoOCgH12cWxrbG1tbWtra2pqbHB2en+BgYF8dnRzc3Nzc39/f39+fn5+fn5+fn19fn5+fn5+fn5+fn5+fn59fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fX5+fn5+fn5+f39/f35+fn5+fn+Ag4WFgoB+fH19fn9/f4CBg4aHiISCf3x7foB7dnN0eYB/fnt5dnNycXV5en1/gIGEhIB/f39/f39/f39/f39/f39/fX17e3t7enp4eHh6e3t4d3d5fX5/f35+f39/f39+fX19fX5/f3t4eHp7fX58fn18fHx9fX19fX59fX5+fn5/f39/f39/f4GCg4SDgn9+fX17fHt7fX5/gYGAfXx5enp4eHl3dXNxc3RycXFzcnNzdXt7fHx6dnJvb29vb29tbGtqbnh/gYOCg4J/enNubGprbGxsampqaWltcnZ8gIGCgXt2c3JycnJyf39/f35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX19fn5+fn5+fn5/f39/fn5+fn5+f4CDhYWCfnx8fn1+f39/gIOFhoeGgn9+fn1+gHx3dXZ5foCAfXt4dXJydXp7fYB+fYCEgH9/f39/f39/f39/f39/fn59fXx8e3t6enp6ent7e3h3dnd7fn9/fn5/f4CAf359fX19fXx8eXh5e32AgH9+fXx8fH19fX19fX19fn5+fn9/f39/f39/gIKDhISDgH99fXx7fH+Af3+BgYB+fHl6enh4eXd1cnBxcnJxcXNyc3R4e3t7e3h1cW9vb29vb21sa250e4GDg4OEgX54cG1ramtsbGxqampqam1yeX6AgYJ+eXVycnJycnJ+fn5+f39/f39/fn5/f35+fn5+fn5+fn5+fn5+fX19e35+fn59fX19fX19fn5+fX19fX19fXt8fHx8fHx8fHx8fX1+fn5+gIB+fn5+fn5/f4B+fH9+gISEg4J/e3x8fn9+f36Bg4aIh4N/fn5+fH6AfXh2d3l9f4B+fXt3dXZ5e3l7fXt4eoKCgYB+fn5+fn5+fn5+fn5+fn9/fn58e3t6e3p4e3x7enl4eHd5fH1/f39/f39/fX5+fX1/fnt6enyAgoOCgH9+f399fXx+fX19fX19fX5+fn5/f35+f3+AgYSEhISDgX99gICBgX9/foCBgX98e3p6eXh4d3Vxb29wcnJycnJzd3t8fHp5dnNwb29vb29ubGtrbnd+g4SEhIGBfHVwbGxra2xsbWtra2lqcHR6foCAgHt4dXNycXFxc35+fn5/f39/f39+fn9/fn5+fn5+fn5+fn5+fn59fX17fX19fX19fX19fX1+fn59fX19fX19e3x8fHx8fHx8fHx9fX5+fn5+fn5+fn5+fn9/gH9+fn6AhIWEg4J/fHx+f31+foOGiYmFg4KAgH58foB9dXN1e3x+gIF/fHl5enx7eHl5eXd4foGAfn5+fn5+fn5+fn5+fn5+f39+fn19fX18e3l8fX18enl4d3h6fH5+f39/f399fHx9fX58e3p6foKEhIOAf3+BgYB/fn19fX19fX19fn5+fn9/fn5+foCBhISEhIOBgoCBgX99fH5+f4GAf3x7enp5eHh3dXFvb3BycnJyc3V5e3x7eXd0cnBvb29vb25sa25ye4GEg4ODgX55c3BsbGxsbW1ta2tramtwdn2AgYF/enZzcnFxcXN1fn5+fn5+fn5+fn9/f39+fn5+fn5+fn5+fn5+fn5+fHx+fn5+fn5+fn5+fn5+fn19fX19fXx8fHx8fHx8fHx8fH19fX1+fn5+fn5+fn9/f4CBgX5+f4GFh4WFhYF8fHx+fYGDhYiJhYSFhYOBfnp9gHx2c3h7fX1/g4N+fX19f316eHh4eHl9fn9+fn5+fn5+fn5+fn5+fn5/gH5+gH9/fn59e3x9fXx8enp6enl5e31+f4CAgH99fX9/fn58enp/g4WEgoB/gIKEg4GAf35+fX5+fn5+fn5+fn1+fnx+f4CCg4ODg4ODg4ODgoB/gIB/gYF/fHp5enp5eHZ0b25vcHJycnN0d3x8fHp2dnNxcG9vb29vbm1sbnZ/g4ODg4KAfHVxb21sbG1tbW1rampqbnF3fICBgX95dHNycnBxdnl/f4CAfn5+fn5+f39/f35+fn5+fn5+fn5+fn5+fn59fX5+fn5+fn5+fn5+fn5+fX19fX19fHx8fHx8fHx8fHx8fX19fX5+fn5+fn5+fn5/gIODf35/gYSGhoWGg397e36BhomIhoWCgoaGhYJ/eXx/fnp2eHx+fH+Dg4GAf39/fXp5eHl6e3x+f35+fn5+fn5+fn5+fn5+fn+Af3+AgH9/fX18fX5+fX59fHt6e3t6e3t9f39+fX19fX1+fn17e4CDhYOBgH+AgoKBgIB/fn59fn5+fn5+fn5+fX19fn+BgIGCg4ODg4WHhISCg4WFhYSDgoB9fHp6enl4dnRvbm9wcnJyc3d7fX17eXVzc3Fwb29vb29ta25yeoCCgoOCgX94c3FvbWxsbW1tbWtqamtvc3p+gIGBfHdzcnJycnR4e39/f39/f39/f39/f39/f39/f35+fn5+fn9/fn5+fn5+fn5+fn5+fn59fX19fX19fX19fHx7e3x8fHx8fHx8fX19fX5+fn5+fn5+fn5+fn1/gYGBf3+BhYWGhoWFgn18f4SIiYWCgH+ChoeGhH94eH+Afnl5fHx6fICCg4OAf35+end4eXp7fX19fX19fn5+fn5+fn5+fn5+f3+AgIGBf358fHx8fn19fn58fHx8fHx6e3x8fXx8fHt9fn19fHx9gYWFg4F/f3+CgoKBgIB/fn5+fn19fn5+fn99fHyBgoKBgoSDg4ODhISEhIeIjI2NjYuJhIF/fHx6eXh3dHBvcHFxcnJ2eXx+fHt4dXJycW9ubm5tbWtsb3Z+gYKCgoGBfXVycG5sbG1tbW1tbWlpbXF4fYCBgX97dnNycnR2eHx/f39/f39/f39/f39/fn5/f39/fn5+fn5+f39+fn5+fn5+fn5+fn5+fn19fX19fX19fX18fHx8fHx8fHx8fHx9fX19fX1+fn5+fn5+fn5+fn1/f3+AgYOGhoOChIWGgnx/hYeDf3x8f4GEhYaEf3V2fYJ/e3t9fXp5foCCgoB/fn58enh5ent9fX5+fHx9fX19fX19fX5+fn5/f4CAgYF/fn19fX1+fX1+fn5+fX18fHt7e3t7e3t7enx8fH18fH2BhISCf318fX+BgYGAgH9/fn5+fX1+fn5+f31/goaFhIOAgoODg4OCgoKFiIqLjY2NjIqHhoaDgHx5eXd0cG9wcXJydHh7fX57eXd0cnFwcG5ubm1ta2xxeoCCgoKBgX56dHJvbWxsbW1tbW1taWltcnl+gYGBf3l1dHNzdnl9f4CAgICAf39/f39/f39+fn9/f39/f39/f39/fn5+fn5+fn19fX1+fn5+fHx9fX19fX19fXx8fHx8fHx8fHx8fH19fX19fX5+fX1+fn5+fn5+fn5+f4CChIWGgYCChYaEf36DhIB6en1+gICDh4Z+dXN5gIB9e358e3p7f4GCgYB/f3t6eXh6e319fn58enx8fHx8fH19fn5/f35+foCAgH9/fn19fX5+fn5+fX19fn18fHx8fHp8e3t6ent7e3t9foGEhIJ/fXx9gICAgH9/gH9/f39+fn9/f399foGDg4B+fn+BhISEhIOCgoSIiYuNjYyKh4WFiImFfnt4d3Nwb29xcXN3eX19fHl3dXNycG9vb29vbm1sbXN8gYKCgoGAfnhzcW9sbGxsbG1tbW1ram5ze4CBgYB9eXZ0cnN3fH+BgYCAgIB/f39/f39/f35+f39/f39/f39/f39+fn5+fn5+fX19fX5+fn5+fn19fX19fX19fHx8fHx8fHx8fHx8fX19fX19fn59fX5+fn5+fn5+fn5/gIKEhYR/fn+EhYWDf4GDgn16e319fYGGhn51c3l/gX9+f357ent/gICAf35+fHt7enp7fX19fn59fHx8fHx8fHx+fn19fn5+gICAf39+fX18fX5+fn5+fn1+fX19fH19fX18e3p6enp7e31+gYKCgH58fX6BgoKDgoGAf4CAgIB/gICAgH+Af4B/fXx8f4GDg4SEhIKChIeIioyLiYWHh4eHiYiFg3x3dHFwcXJzdXp8fn17eHZzcnBxb25ubW1ta2xvdn6CgYGBgYB+eHFvbWxsbGxsbW1tbWpqb3V8gIGBgH13dHRzdnt+gIKBf39/f39/f39/f39/f39/f39/f39/f39/f39+fX5+f399fX5+fn5+fn5+fn59fX19fX18fHx8fHx8fHx8fX19fX5/fX1+fn5+fn59fX19fX1+fn6AgoSEhIB/f4CEhoWDg4OEgXt7e3x+goeGfXN2eX+CgYCAfnx6fX6AgH59fX9+fX17ent7fH2Ag4J/fHp6fHx9fX5+fn5+fn5+fX9+fn5+fn5+f39+fX19fX1+fn18fHx+f358e3t5enp7e3x+fn5+f39/gYGDhISDg4KAf4CAgYCAgICAgYGAgH99fX1/gYCBhYWEgoKChIWFhYOCgoeJiIeIi4qHgHlzcnJzcXR5fX59e3p2c3JxcXBwbm5ta2tqa3F6gICAgYCAf313cW9ubG1tbW1sbGxra2tvdX6AgYGBe3RydHV4fIGBgX9/f39/f39/f39/f39/f39/f39/f39/f39/f359fn59fX19fn5+fn5+fn5+fn19fX19fXx8fHx8fHx8fHx9fX19fn9+fn5+fn5+fn19fX19fX5+foCChISEgH9/gIOFhoWFhYaDfXp7fH+DiIZ/dHF1fH+BgIB+fHp7fX5+fHt6fH1/fnx7e3x9f4OHiIJ7enp8fHx8fX1+fn5+fn59f35+fn5+fn5/f39+fX5+fn5+fXx8fHx9fn9+fXx7e3t7fH59fX1/gIGCgoSEhIODgn9+fYCCg4KAgYKCgoCAf319foCCg4SGhoSCgoKDgoKChISGhoOHiImIiYiJgnl1c3Fxdnt/fnx5d3NycHFxcHBubm1ra2ptdHyBgYCBgIB/fXdwb25sbW1tbWxsbGtra3J4f4GBgYB6dXR2eXt9gYGAfn9/f3+AgICAf39/f39/f39/f39/f39/f39/f35+fn5+fX19fX5+fn5+fn58fHx8fHx8fHx8fHx8fHx8fHx9fn5/gH9+fn5+fn19fX19fH19fX1+f4KFhIKBgIB/f4SGhoWFiIN+ent9f4SHhYF4eHl+f4GCgIB9e319fXt6eHh4fH9+fX19foGDhomLiH97enp6e3t7e31+fn5+fn5+fn5+fn5+fn9+f399fX5/f39+fnx+fX5+f4CAgH58fHx9fXx+fn+BgYCBg4OCg4SBfXt6f4OGh4aGhoeEgYCAfnx9foCAgoaGhIGBgoKDg4OFhoWEgYOFhX+HioqHf3h0cnJ6fYGAe3l2cXBwcXFwcG9ubmxsa253f4GBgYCAgH9+d29vbW1tbW1tbW1samltc3p/gIB/fnl0dXh6fn+CgX57f39/f4CAgIB/f39/f39/f39/f39/f39/f39/fn5+fn59fX19fn5+fn5+fnx8fHx8fHx8fHx8fHx8fHx8fH1+foCBgYF/f35+fX19fX18fX19fX5/gIOEgoGAgH9/gYSEhoaGgX14eX2BhoiHg4F+fn5/gICAgH59fX17enh2dHV5fH1/gYGChYiJioyLhXx7enp7e3t7e31+fn5+fX19fX5+fn5+f359fXx8fX5+fn1+fX18fX1/gICAf358fHx8fX6BgoGBg4KBgoKChIF/fHp8foCCg4OEhoKAf398e31+gIGEhYWCgICBgoKDg4SFhIN/gIB8fIyXkIyIgXt6e3+Af356d3RwcHBxcXBwb25ubGppbneAgoKBgH+Af3t0b25sbW1tbW1tbWxqaW51en+Af359eHV4fH9/gIB/e3h+fn9/f39/f39/f39/f39/f39/f39/f39/f39/fn5+fn5+fX19fX5+fX19fHx8fHx8fHx8fHx8fHt7fHx8fn5+gYKCg4F/fn19fX19fHx9fX5+fX+BgoODgX+BgICAgoOFhYWEgH58fYGFhoeFgX5+fX5/gX9+fXx9fHt5d3R0dHZ4fn+ChIaIiYmKjIyLgnt6enp6e3x8fX5+fn5+fn5+fn5+fn5+fXt7eXx8fX5+fn9/fn59fX5/gIB/fnx7e3t8foGBgoOCgYCAgYKDg39+fX18f35/f4GDgX9+fnt8fn6AgoWDgYGAgIKCgoODg4ODg4KCgH2Ai5COjJGOhYF/fXt8enl2cm9vcXFxb29vbm1raGpweoGDgYGAf39/fHVubmxtbW1ubm5ta2lrb3d9f4CAf3t2dnl9f3+AgH53doCAf39/f39/f39/f39/f39/f39/f39/f39/f39+fn5+fn59fX19fX19fXx8fHx8fHx8fHx8fHx8fX18fHx+fn6AgYOEg4J+fXx8fX19fX19fn5/gIGCg4OBf4B/gICBg4SEhIWGhoeHiIiHhYN/fX19fn6Af358e3t7eXZ1cnNydHd8gIKEh4mJiYmLjI6Jf3t7e3x8fHx9fn5+fn5+fn5+fn5+f359fHt8fX5+f39/gIB/fn5+fn+AgH9+fHt6enx+gYGDg4B/fn6AgoODf318fHx9fX1/goKAfn1+e3x+f4GChYOBgYCCg4ODg4ODg4ODhISDgoSKkJGLhoN+enl5eXh5eHdzcW9xcXFvb29ubWtrbHR9gIKBgYB/f397cm1tbG1tbW5ubm1qaGtyeH1/gIB/e3h5fX6AgIB/eHR1f39/f39/f39/f39/f39/f39/f39/f39/f39/f35+fn5+fn19fX19fXx9fHx8fHx8fHx8fHx8fHx8fHx8fn59fX+BhIWFhYF9fHx8fX5/f3+AgIGBg4KDgoCAgH9/f4CAgoSEhYWHiIiIiIeGhIF+fH5+fn9+fXt6enp3dnRzcXFxdHh8gYKChYmLi42NjY2IfXt8fXx9fX5+fn5+fn5+fn5+fn59fX1+f4B/f35+fn9+fn9/gH9/f39/fn19e3h6e3+BgIKBf3x9foCBhIR+fHt8fXt7fH9/gH+Af318fH6BgoWGg4B/gYOFhYWFg4KDhYWFhYWEhoqOiYJ9e3ZzfICAfHR2fXt0cXBxcG9tbm1ta2ptc3+BgYGBgH+Af3pxbW1sbW1tbm5tbGlpbHR6fX+Af356eXt+f4CBgX10c3V/f39/f39/f39/f39/f39/f39/f39/f39/f39/fn5+fn5+fX19fX19fH18fHx8fHx8fHx8fHx8fHx8fHx+fn19f4GDhIWFg398fH1/gIGCgoODgoKDgoOCgICAf39+fn+Ag4SDgYCBhIeIh4WEgX58fX59fn18enl4eHV1dHJzcnFzdnt/goGChoiJi42Nj4yEfHt8fH19fn5+fn5+fn5+fn5+fn5/gIB/fn5+fX19fXx8fX5/f3+Af39+fX17eXl9gYGAf359e3x9gIGDgoB+fX5/fX1+f4CAgH5+fXx8foGChYaDgICChoeHhYWDg4WEhISEhYaIi4yGfnZxcXyEg4GBfXd5fHdzcXFwb21ubW1raW53f4KCgYGAf4B/eHBtbWxtbW1ubm1saWludXt+f4B/fnx8foCAgIB+eHNzd39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f35+fX1+fn19fXt8fHx8fHx8fHx8fHx8fHx8fX19fX5+fn5+f4CChYaFgX18foCDhISEhoaFhYWDg4GBgYGBf39/f3+ChIN/fX2Bh4iFhISBfnx8fH19fHp3dnh2dHV1c3NzcnN2eHyAgoOEhoeJi4yOj4uBfHt8fX19fn5+fn5+fn59fX9+f39/f319fX18fXx7enh6e3x/f39/f399e3p6fH+AgH57fHx7fH6Bg4aDgH+AgH9+f4B/f4GAf359e31/goOFhIGBgoSIiYiHhYSGhoaFhYSEhYeIiod9dW9zfYOAfn9+dnZ8gXpzcnBwcG5ta2tqcHmAgYCBgoB/gH53cG1tbGxrbW1ta2poaW52fH5/f39/fYCAgICAgHpxcnV8f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/fn59fX5+fX19e3x8fHx8fHx8fHx8fHx8fHx9fX19fn5+fn5/gIKFhoeDf35/goSFhISFhYSEhIKCgICAgIB/f39/f4KDgX56fYGHiIWEhH99e319fX18enp5dnRzdXZ1dHR0dXZ4enx/gIKDiImLi42OjomBfn19fn1+fn5+fn5+fX19f4CAf359fHx7fHt7e3t8e3l6en1+f39/f317enp8f4CAfnt8fHx+f4GEhoSBgIB/fn5/gIGBgYB/fn59foCCg4WEgYGChIiJiIeFhIaGhoWFhYWGhoiKh4B2cXF5fXx6fn98fHx+fHlzcHBwbm1ra2txeoGBgIGCgH+Be3VvbW1sbGttbW1tbGdpcHh9foCAf35+gICAgX99dnF0eX1+fn9/f39/f39/f39/f39/f39/f39/f39/f39/f39+fn5+fn59fXx8fHx8fHx8fHx8fH19fX19fX19fX1+fn5+fn5/gYSFhoSBf4GEhIaFg4WFhISDgoGBfn+AgICAf3+AgYODgHx9gYeKiIeGgn5+f39+fXt7enp4dXZ2d3d2eHV2eXl7e31/gIGFiYqLjY2OjYiBfn1+fn5/fn5+fn59fn+AgH98e3p6e3p7e31+f35+fXx7fH1/gH9/fnt4en2BgYB8ent8fX6AgYSGg4F/f39+fn+AgoKCgH9+fXx+gIKEhYSBgYKEh4iIh4aFhoeHh4aGhYWFhomGhH10dXl8gYCAgYKDgYB/fnZwcHBubWxqa3J9gYGAgYF/gH98cmxtbWxsbGxtbWxqaGt0eX5/f39/f3+AgYF/fXZydHh8fX9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f35+fn5+fn19fHx8fHx8fHx8fHx8fX19fX19fX19fX5+fn5+fn5/goSFhYSCgYSFhIKBgYGCgoGAf35+f4CAgICAgICBgoOCfnyAh4qIh4eFgYB/f318e3t8fHx5eHZ1dXZ4ent7e3x8fX+BgYSHiYqMjY6NjYeAfX5+fn9/f39/fn5/f4B/fXt6eXl6ent8fn+Af4CAf359fn+AgIB+e3h6fYGBgHx5eXt8foCBhYaCf35/fn5/f39/gIB+fn18fX+BgoSFhIGBgYOGh4iHiIaEhoeGhoaGhoaHh4eFgnx8fn+CgYCAgoSDg4KAfnVwcG5tbGprcn2BgYCBgX+Af3x0bm1tbGxsbG1tbGlobHR6fn9/f39/f4CBgX96dXR2ent9f3+AgH5+fn5/f39/f39/f39/f39/f39/f39+fn5+fn5+fn19fX18fXt7fHx8fHx8fHx9fX19fX19fX5+fn5+fn5+fX+AgoaFhYaDhIOCgH9/f4CAgIB+fn6AgICAgICAf3+AgoN+fYCHiomIhoSDgYB/fHt6enx9fXp4dXR0dXl6fHx+fX6AgICAgoWHiIqKjI2MjIeBfn5+f4B+fn5/gH9/f358e3l5eHl7fX1/gIB/gYOCgoF/foCAgIB6d3t9f39+end5eXt/gYKEhIF/fn19f39/f36Af358fH1+f4GChIOCgYGAgYSGh4iIhoODhoaGhoWHh4eIiIWCgH18fYKBgICChYaEgYGAenJvb25ra21zfoCCgYGBf4CAfXVvbGxsbGttbW1tamptd31/gH59fn+AgYF/fnd0dXh5e35/f39/fn5+fn9/f39/f39/f39/f39/f39/f35+fn5+fn5+fn5+fX18fX18fHx8fHx8fH19fX19fX19fX1+fn5+fn59f3+AgoSFhoSGg4KAf39/gICAgH9/foCAgICAgIB/f4CBg4F/gIeKiYiFhYSDgH16eHh4enx8e3h1c3Jzdnp8fH5/f4CAgIB/goaKiomLjIyMjIaAfn5/f35/gIGAf35+fXx7enp5enx9fX5+f4KFh4aFg4F/gIB+fnx7fX6Af356d3l5e3+BgoSEgX9+fX19fX9/f35+fXx8fX9/gYOFhIKBgYCBg4SHiIeGhoWGhoaGhYeIiIaGhYJ/f4CBg4OBgoWFhYWDgoF9dXBvbmtrbXZ+gIKBgYF/gIB9dG5sbGxsa21tbW1qaW93fX+Afn1+f4CBgX95c3V2eHl7fn9/fn5+fn5+fn5/f39/f39/f39/f39/f39/f31+fn5+fn5+fn5+fXx8fHx8fHx8fHx8fX1+fn5+fX19fX5+fn5+fn5+f3+AgYSGhoaEg4GAf39/fn5+f39/f4CAf39/f35+f4GDg4B/hoqJh4aFhIF7d3Z1dXZ5e3t7d3Vzc3N1eXt9f35/f4CAf358gIWKjIuLjIyMiYR/f35+f4GBgX99fX59fHx7e3t8fX5+fn+Ch4mKiYeFg4GAf35+fHx9f4B/fXh2d3l8f4GCg4SBf359fHx8fn9/fn19e3t9f4GDhYWEgYKCgYGCg4SGh4aGhIWFhYWFhoiIhoWEgoKCg4OEhIKDhoaFhYSCgYB6c3Bua2pueICBgoGBgX+AgHx1bWxsa2ttbW5samlqcXl8fn19fn+AgoGCfXh1eHl5eXt+f39+fn5+fn5+fn9/f39/f39/f39/f39/f39/fX5+fn5+fn5+fn59fHx8fHx8fHx8fHx9fX5+fn59fX19fn5+fn5+fn5/f3+Ag4WGhoWEgoF/f39+fn5/f39/gIB/f39/fn1+gIKCgoGDiYqGhIGAe3hyb29ydXl7e3t5dnNzc3V5e319fX5/gIB/fHt8f4aKi4uLi4uLioWAgICBgoF/fn5+fX18fHx7e3x8fX1/g4aIiIqKiIaEgoB/fn58fX+AgH9+eXh5eXx+gIKEhIF/fn9+fX1+f39+fX18fH1/goODhIOBgoKCgoKDg4SGh4eFg4OFhYWGh4eFhISDg4OEhIWFhoeIiIeFg4ODgoF7d3RxcHN6gIGCgYGBf4CAfHNsbGxra21tbGtqaGtze31+fX1+gIGCgX96d3Z5enl5e35/f35+fn5+fn5+f39/f39/f39/f39/gIB+fn5+fn5+fn5+fn59fX18fHx8fHx8fHx8fH19fX19fX5+fn5+fn19fn5+fn9/f3+BgYOEhYWCgH9/f39/f39/f39/f39+f39+fn5+gIGAfXx/hYaCf3x9fHhxbm90eXx9fXp6dnd2d3l6fHx9f4GBgH98e3x9f4GEiImKiYmIhYCAgYKAf39+fX19fXx8e3t7e31/g4WJiYqKiomKhYSBfn19fXx9f39/f3x6d3h4e36BgoOCgoGBf39+fn5+gIB/fnx9foCCg4GBgoGCgYKDg4KCgYKEh4WDhISEhYWGhoWFhIOEhIWFhoaGhoaGhoaEhIODg4KAfXt5eX6BgYGBgoB/fn97cm5ra2tsbW1sa2ppbXZ8fn5+f4GCgoF/e3d1eHp6eHh6fn9/fn5+fn5+fn5/f39/f39/f39/f39/f35+fn5+fn5+fn5+fn19fXx8fHx8fHx8fHx8fX19fX19fn5+fn5+fX1+fn5+f39/f39/gYKDg4GAf39/f39/f39/f39/f35+fn5+fn5/gIKCf3yAgYKAgYODfnhyb3J2en5+fn58fHx8fH1+foCBgYF/fXx7enx9foCEiIuMjIiFgYGBgH9+fn19fXx8fX19fn+AgoSFiIqKiYuLiYiDgoB+fHx9fX+AgH9/fHp3eHp9f4GCgoODg4OBgX9/fn6AgH9+fX+ChIKDhYWFhISEgoKCgX9+f4KEhYOEhYSFhYaGhoWEhIWFhYWFhYaGhoaGhoWFhISEg4SEgoB/gYKCgoKCgH9+f3tybmtra2xtbWxraWhtd31+fH1/gYKCgX97d3d5eXl3d3p+f39/fX19fX19fX5+fn5+fn5+fn5/f35+fn5+fn5+fn5+fn5+fn5+fX19fX19fXx8fHx+fn5+fn5+fn5+fn59fX5+fn5+fn9/fn6AgICAf39+fn5+f39/f35+gIB/f359fX19fX5/gYF+fH2Ag4KEhISDfXZwcXZ5fH1+fn9+fX6AgYKCgoF/fn18e3t8fHt8f4CChYqKh4SAgoGAf359fHx7e3t8fH2AhISFhoiJioqKiomGg4CAf358fH1/f4CAf318enh5e35/gIGDg4OEhIOBgH5/f35+fH1/gIODg4OEhIODg4WEg4aDg4B+gYOFg4SEhYWGhYWFhYOCg4OFhYSFhYaHh4eHh4eGhoaGhISEg4ODhISEhIKBgH+AeXJua2trbG5ubGtnaXB4fn99fYCBgYGBfXp3eXl5eHZ2en5/f399fX19fX19fn5+fn5+fn5+fn9/fn5+fn5+fn5+fn5+fn5+fn59fX19fX19fn59fX5+fn5+fn5+fn5+fn19fX1+fn5+f39+fn9/fn5+fn5+fn5/f39/fn5+fn5+fn19fX19fn9+g4J+e36Ag4SEg4OCfXVzdXh7fH5+fn6AgX+AgICBgH59fHp7e3x8e3x9f4CAgYGCgoCAgH9+fXx7fHt7e3t7f4GEhoeHiYuKioqKh4SAf359enp8fX9/gIB+fHx6eHl6fX19gIKCgoODg4GAfn9/fn5+f3+Ag4ODg4SEhISDhYWGhoaGhYWCgoODhISFhYaIiIaBf36AgH9/gIGDhoWFhYWFhYaGhoaEhISDg4OEhISEhIKBgIB5cWxra2tsbGxsa2lrcXl9fn19gIGBgYB8eXh5eXh3dnZ6foCAf319fX19fX1+fn5+fn5/f35+fn5/f35+fn5+fn5+fn5+fn5+fn19fX19fX19fX5+fX1+fn5+fX5+fn5+fX19fX19fn5+fn19fn5+fn5+fX9+fn5+fn5+fn5+fX19fX19fX19fX5/goB9en2BhISDg4ODenNydnl6fX5+f39/fn9/f39/fXx7e3t7e3p6enx+f31+f4KCf4CAf318ent7e3p7e3yAgoaIiImJi4qKi4qIhYF+fHp5enx+f3+AgH58ent5enp6e31/gIGBg4ODgoCAgIB+fnx9gIGCgoODhISDg4WFhYWFhYSEhISEhIODhIaGh4aFgHl1eHx9f39+f4CDhIWHhIWFhYSFhYSFhISEgoSEhYWEhIODgXlxbWtrbGxsbGtqaWx0e399fX2AgIKBf3x5eXp6eHZ2dnl9gICAfn19fX19fX5+fn5+fn9/fn5+fn9/fn5+fn5+fn5+fn5+fn5+fX19fX19fX19fn59fX5+fn59fX5+fn59fX19fX1+fn5+fX1+fn5+fn59f35+fn5+fn5+fn59fX19fX19fX18fH6CgoF7en2ChIOChIR/eHR1eHl7f39/fXt8fX1/f39+fXx8e3t7enp6fH59foCCgoKAf39+fXx7enp6e3x9foGEh4iIiIiJioqKiYmHg4F9enl6fH5/f4CAf319e3x7enl5fX+AgYGCgoKBgICCgoGAfoCAgYKCg4OEhIODhISFhYSEhISEhIODhISGhYWFgn10bnB4fX9+fn1+foCIi4qGhYaEhIKCg4SEhYWEg4ODg4SEhISDfXRubGxsbGxsa2ppbXV8f31/f4CAgYB/fHl5fIB/eHR0eX2BgYB+fn5+fn19fX5+fn5+f39+fn5+f39+fH19fX19fX5+fn58fH18fX19fX19fX1+fn19fX19fXx9fn59fX19fX19fX19fn5+fn19fn5+fn5+f39+fn5+fn5+fnx8fX18fHx8fX19foCCgX54eX6DhISEhIN+d3d7eXl9gH96eXx8fX5/gH59fX18fHt7enl6fHx/gYGBgYB/fn18e3p6e3p+f4CCgoOEhoaGhoiJiomJiYiGg4F8enl9fn5+f39/f35+fXx6eXt+gICBgYGCgoKBgoODgoGBgYKCgoKDhIODg4OEhIODg4OEhISEhISEhoSDgH56cm5udHp+f359fX5+h42IhISEhISDgIGBg4SGiIaDgIGDhISFhYOAeXNvbm1tbW1raWhud35+fX+AgH+Af397eXl9hIN5dHR5foGBgH5+fn5+fX19fn5+fn5/f35+fn5+fn58fX19fX19fn5+fn5+fXx9fX19fX19fX5+fX19fX19e319fX19fX19fX19fX1+fn5+fX1+fn5+fn59fX5+fn5+fn5+fn59fXx8fHx9fX1+foGCgHx4en6Cg4SEg4J/fn57enx/fnx6fH1+fn+Afn19fXx8e3t6eXp8fYCBgX9/f39+fXx8fHt+f4CBgoKBgoKEhYWFhoeJiYqKiYmGgn16eXx9fHx/f39/fn9+fn5+f4GAgH9/f4GBgYGCg4OCgoGBg4OCgoOEg4OCgoOCgoKDg4SEhYWEhIOEh4iFfnVzdXt7fX15e35+gY2Mg35/goODhIJ/gIOEhoeIh4J/gIGDg4ODhIN/enNwb25tbWtpaXB4fn59f4CCgYB/fnp6en6Ef3l0dHl+goGAgH9/fn19fX1+fn5+fn5+fn5+fn5+fnx9fX19fX1+fn5+fn5+fn5+fn59fX19fn5+fn19fn59fX19fX19fX19fX18fHx+fn5+fn5+fX1+fn5+fX19fX19f399fX5+fX19fXx8fX1+f4KCgHt4en6BhIWFhYOBf39+e32Bf319fn9/f359fXx8fHx8e3p5e36AgIB/f35/fn59fX18fn+Cg4SFg4KCgICChIaGiImJiYmKiYiEf317fHx9fX9/f39+foB/fn5/gYF/f35/f4CAgICAgoODgoKCgoODg4OCgYCAgYKBgoKChISFhYWFhIWIiIZ9c3d9fn9+fHx+f4iPioB6enp9gIKCgX5+g4aHh4iIgX1+gYKCg4SEg4J/fHZyb25tamhocXp+fX+BgYGBgH96d3h6g4N7d3R0eHyCgYCAf39+fX19fX5+fn5+fn5+fn5+fn5+fH19fX19fX5+fn5+fn5+fn5+fn19fX1+fn5+fX1+fn19fX19fX19fX19fXx8fH5+fn5+fn59fX19fX1+fn5+fX18fH19fn59fX19fX19fX19gYKBf3x4eH1/goSEhIOBgX98foKCf31+f39/f359fHx8fHt7e3x/gIB+gH9+fX9+fn19fXx+foGEhoeFhIKAgIGChYWHiIiIiImJiIWBf3x8fH19f39+fn9/gH+AgH+BgX99fX6AgICAgICCgoKBgYKCg4ODg4KBgICBgoGCg4OEhIWFhoaGh4iIhYB1d3x+fnl5foOLh4F6eXl5eXp7foKBgn+AgoKChIiEgH19gIGCgoOEhIOCfnh0cW5rZ2x2e39/gIGBgYF/fXt4e3+CfXd1c3R4fIKCgIB/f39/fn5+fn5+fn59fX5+fn5+fn19fX19fX19fn5+fn5+fn5+fn5+fX19fX19fX1+fn19fn59fX19fX1+fn5+fn5+fn5+fn5+fn19fX19fX19fX19fX19fX19fX19fX19fX19fn1/gYGCgHx4en1+gYSFhIKAgYB+gIKAf39+f4CAfn59fXt6eXp+gIGAf39/fn9+fn59fH19fX19gIKFh4WEgICAf4GEhYaGiIiIh4eHhYSCf318fX1+fn1/gICBgICAgoKCfnx8f4CAgICAgICBgYGBgoKCgoOBgICAgICBgYKCgoSEhISGhoeIh4eGgnl3e3t7eHqBhYR6d3Z3eXl5eXl8fn99e31+gIOFh4eBfXx/f4GCgoSEhISCfnp0b2xrbXV9f4CAgIGBf4B9enh8goF4cnFzc3d8goKAgH9/f39+fn5+fn5+fn19fn5+fn5+fX19fX19fX1+fn5+fn5+fn5+fn59fX19fX19fX5+fX1+fn19fX19fX19fX1+fn5+fn5+fn5+fn59fX19fX19fX19fX19fX19fX19fX19fX19fX1/gYKBf316eXt9gIKEhIGAf3x7fX5/f35/gIB+fn19e3p8f4GAf4CAf319fHt8fHx7fX19fHx/gIKDgoGAgIB/gYOEhYWGh4eGhIWFh4aDgYB+fn19fn+BgYGAgICCgoJ+fH2AgICCgYB/f4CAgYGCgoGBgYCAgICAgIGBgoKCgYGCgoODhIWEhIKBfXd6end1e4KCfHZ1dnd2dnZ2dXFxc3p/g4SGhoaHhoN+e35/gICDg4OCg4ODgHt1bWpweH5/gICAgYGAf3x5e3+BfXZ0dHNwdHmCgoF/f39/f319fn5+fn5+fX19fX5+fn5+fn5+fn5+fn9/fn5+fn5+f39+fn5+fX19fX19fX19fX19fn59fX19fX19fX5+fn5+fn5+fn5+fn5+fX19fX19fXx9fX19fX19fX19fX19fX19fX1/gYF/f356eHl9gICDg4CAfXt8fX5+fn5/f35+fXx7e3+AgH9/fn5+fnt6eXt8fH5+fn9+fn5/f4CAgIB/f3+BgYSEhISFhISEhYeIiIaEg39/fn5+f4GBgYCAgIGDgoB8fYCBgoSDgX9+foCAgYGCgYGAgICAf3+AgICCg4OBgYODgX+BgoCAgoF+eXd0cnJ6gH12dHR0dXR0dHVva3J6f4SGhYWFh4iHhoJ+fn5/f4GDhIKCg4KCgHpxbnR5fYCAgICBgH98fHl9gn95c3JycW90eYKCgX9/f39/fn5+fn5+fn59fX19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn59fX19fX1+fX19fX1+fn19fX19fX19fn5+fn5+fn5+fn5+fn59fX19fX19fH19fX19fX19fX19fX19fX18fHx/gX9/f397dnh8foKCgYGAfXx9fn5+fn19fn5+fHx9gH99fn5+fn17fHx7fHt9fn5+f4CAfn5+f3+AgIGBgYKBgoOCgoODg4SFhoeHhYSDgYB/fn+BgYGBgYCAgYOCgH5/gIGDhoaFgoB+gICBgYKBgYCAgYGAgICAf4CDg4SEhIN/eXt8fn5/gYF7dXFxcnl/enV0dHR1dXZ0bmx0fH5+gIWGhYWHiIiHhYGAgH9/gYF/foCCg4OCfHZzdXp9gICAgIF/fnx8f4GAe3Zzc3NubnV6goGAgH9/f39/f35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f35+fn5+fn19fn5+fn19fHx9fX19fX1+fn9/f39/f39/f39/f35+fn5+fn5+fn5+fn19fn59fX19fX19fX19fX18fHx8fHyAgICAf4B9eXh6fH+CgoF/fXx8fn9/fX1+fn58fX5/fX1+fn19fHp7enp7fHx+fn5/gYF+fn1+fn+AgYGCgoKBgYCBgYKDg4SGh4aGhISDgYCAgYKBgYGBgH+BgoF/f3+BgoSGiYiFgoGAgIGBgYGBgYKCg4SBf3+AgIGBgYKDgXt3eXx9foCAgoB6cG9zent4dXR0dXV0dG9qcXt+fn5+gIaGhoaHh4WDgoB/gH+Af3x5foCAgoJ/enV3e35/gIGBgH9+fX6EgHt2c3N1cmxrc3iCgYCAf39/f39/fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/fn5+fn5+fX1+fn5+fX19fX19fX1+fn5+f39/f39/f39/f39/fn5+fn5+fn5+fn5+fX19fX19fX19fX19fX19fX5+fHx8fHx8fX18fn9+e3p6e36AgoF9e3t8f39+fn5+fn1+f359fX59fXx7e3t6enx/f39+fn+Cgn9+fX5+f4CBgYKCgoGBgICAgIGDhIaHhYWEhIOEhISCgYGBgYCAf4GCgX9+f4GChIWHh4aCgYCAgYGBgYGBgoOEg4GAgICAgYGBgoSDgH6AgIGDgYKEhH9zcHJ6e3d0dHR1dXVxa3J7fX5+fn59gIaGhoeHhYSEgX+Af39/eXR5fYCCgoB8eHl8fn+AgYF/fn+BgoJ8dnNzc3Nxa212e4GBgICAgH9/fn5+fn5+fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f35+fn5+fn5+fn5+fn5+fn5+fn5+fX1+fn5+f39+fXp6enh5enx+fn+Af3p2eX2CgoB7ent8fX9/fn1+foB/fH19fnt6e35+fHx8fX9/fnx9fn+BgH5+fn5/f4GBgYGBgYGBgICAgIGDhISEgoODg4SGhoSCgoGBgYB/gIKBgH5/gIGCg4aGhYOBgX9/gICAgIGBhIWEgYKCg4GBgYGCg4WEhIODg4OCg4aGgXhzc3p7d3V1dHR1cmxseX5+fn5+fn6Ch4WFhoaEgIB/gH9/f4F6cHN4fYCCgX16enx/gICAgH6AgYF+fHh1c3Fycm1qbXd9gYGAgICAf39+fn5+fn59fX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/fn5+fn5+fn5+fn5+fn5+fn5+fn59fX5+fn5+fn99enl5d3d4eXx+f3+Af316enyAgYB7enx9fX18fH5+fn57e3t6ent8fHx8fH5+f319fH1+foB/fn5+fn9/gIGAgIB/gIGAgICAgIGCgoKAgYGDhYWFhYODgoKAgH+AgoGAfn+AgYKDhoaFg4GAgIB/f39/gICDhIOCg4ODgYGBgYKDhYSEhISDg4KDhYWCfXd1eXl2dHR0dHRvanJ9fn5+fn5+foKFhIKEhIKAgICBf39/gXtxcHR7f4F/fHt7fX+AgICAfoCBf3x4dHFxcXFycXN4fYCAgICAgIB/f35+fn5/f35+f39/f35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fX1+fn5+fn9/f39/f39/f4CAgIB/f39/f39/f35+fn5+fn5+fX19fX5+fn59fX5+fn5+fn1+fn15eHh2d3d4eXx/gYCAgH96eHyAgXx5e3t6enl9f359fXp6eHl6ent7fHx9fYB/fXx9f3+AgH59fHx8fX+AgH+AgIB/fn5+fn5/f4GBgYGBgYKDhISDg4ODgX9+gIGDgoB/gIGCgIKGhYWDgYB/fn9/f3+AgIGBgYCChIODgoKCgoSFhISFhYSDg4OCgoOAenh5eXVzdHV0cmpseH1+fn5+fn5+gYSBgICAgYCAgYKAgH+BfHNxcnh9f399fH1/gYCAgIB+gHx4eHh3dXN0eXh6f4GCgoCAgIB+fn9/fn5+fn9/fn59fX59fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn5+fn5+f39/f39/f39/gICAgH9/f39/f39/fn5+fn5+fn59fX19fn5+fn19fn5+fn5+fX5+fXl4eHVzc3R2eHt8foCAf4B9fHx9fXp4eHp8fn9+fnx8fHt6eXh4ent8fH1+fn19fX5/f4CAfn18fHx8fX5+f39+fn59fn5+fn9/gIB/f39/gIGCgoGCgYGAgICBgoOCgH+AgYKBgYOGhYOBgH9+f39/f4GBgYGEgoKEg4OCgoKCgoSEhIWFhIODg4GBgX95d3l4dHNzc3JuaXJ6fX5+fn5+fn5/gYB/f4CEhIGBgoCAf4F7cXBxdXp+fn18fX+BgICAgH58eHd5fYGAfn6AgYKEhIWFf39+fn5+fn5+fn5+fn5+fn19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39+fn5+fn5+fn5+fn59fX5/f39/f35+f3+AgIGBf39/f39/fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn9/fHp6dnRxcnJ2d3l9foGAgH9/fnx8e3p6fYB/fn5+fHx7eHh4eXt7e3t8fX1/fn19fn9+foB/fn18fHx9fHx8fX5+fHx9fX19fX1+fn5+fn6AgICAgIB/f4B/gIOEhIOCgIGBgoKAgYOEg39+fn1+fn1/gYKDgoODgoKEhIKCgYGDg4SEhISEhIKBgICBfnh2eHd1c3NzcWtrdX1/fn5+fn5+fn59fn6AhIaIhIODgYCBgYB1b3F1d3x9fX1/gICAgIB/e3h1d3t+goSDgYKChISFhYZ/f35+fn5+fn5+fn5+fn5+fX1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f35+fn5+fn5+fn5+fn5+fn9/f39/gIB/f4CAf39/f39/f39+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+f397enp3dHFxcXJ2eXx8f4CAf39/fnx7enx+gIB9fX19e3l4d3d4e3t7e3x8fn9+fX19fn59f39+fXx8e3x7e3t8fHx8fHx8fX18fH1+fn5+fn5+f39/fn5+gIGChYWEhISDgoKCgX5+gYSDgYB+fX5+fH2Bg4OEhISEhISEg4OEhIODhISEhISEgoGAgH95dHJ4d3Z0c3Nxam56fn9+fn5+fn5+fn9+f4WLiIeFg4OCgYGBfnZyc3d5fH19fX+AgICAgH56eHl6f4CCgYKDg4WFh4mKi35+fX1+fn5+fn5+fn5+fn59fX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn59fX19fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/f35+fn5+fn5+fn19fX19fn5+fn5+fn5+fn5+fn5/f3x4dnVzcnFxc3Z7fX5+fH5+gICAe3t8foCAf316eXZ3eXl4eHl6e3t7fHx9fn5+fnx9fX5+fn59e3t7e3t7enp7e3t7fHx8fHt8fX19fX5+fHx9fX5+foCChIWEhYOCgYKDhISCgH6Bg4KAgIB/fX1/f4CBg4OCgoODg4OChISDhISEhISEg4OCgYB/e3h1dXV3d3V1c29qb3p+fn5+fn5+fn9/f36FjYuFhYaGg4KBf3+Afnl5e3x/f39/f3+AgICAfnt5fH6AgYGBgoOEhIeIiYqLfn59fX5+fn5+fn5+fn5+fn19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f39/fn5+fn5+fn5+fX19fX1+fn5+fn5+fn5+fn5+fn9/fHh2dHRzcnJ0eHt8e3t6e3t8fn5/f3+Af318eXh3d3d4enl5eXp7e3t8fH1+fn9/fHx8fn5+fn17e3t7e3t6ent7e3t7e3t7e3t8fH19fX19fX19fX19gYSGhoWDgYB/gICCg4SCgYOGhYODgYB/f39/gIGCgYGBgICAgIGCg4SEhISEg4ODg4KBfnt2dnV1dHZ2dnV0cGtxen1+fn5+fn5+f39+f4eJg4CChYaDgoF/f4CBgICAgYGBgICAgICAgIB+e3t+f4CBgoODhYSGhoaHiot+fn19fX1+fn5+fn5+fn5+fn5+fn5/f39/f39/fn5+fn5+fn5+fn5+fn5+fn5+fn5/f319fX19fX5+fn9/f39/gICAgH9/f39/f39/fn59fX5+fn5+fn5+fX9+fn5+fn5+fn5+fn5+fn5+f398end3d3Rzc3R6fHx8ent7fHx9fHt9gH9+enh2d3h5enl6enl6e319fHx9fX5/gH9+fX19fX18fHp6enp6enp6enp7e3t7e3t7e3t7e3t7e3t8fHx/foCChYWEgX9/fn5+fn9/gYGDhIeHhoWDgoKAgICBgYKCgYB9e3x9fn5/goSEg4ODg4KCgYB9e3h1dXR1dnd3dnNxbnF6fX5/f319f3+Bg4CChYN/f4CBhISDg4ODgoKDg4SEg4ODg4KBgYB/f318fX+AgYSFh4eEhISEhoiKjX5+fX19fX5+fn5+fn5+fn5+fn5+fn9/f39/f39+fn5+fn5+fn5+fn5+fn5+fn5+fn9/fX19fX19fn5+fn9/f3+AgICAf39/f39/f39+fn5+fn5+fn5+fn59f35+fn5+fn5+fn5+fn5+fn5/f3x6d3h3dXR0dnl8fHx6e3t8fHx+foCAf317eXZ3eHl6enl4eXp7e3x9fX19fn+AgH99fXx7e3t7enp6enp6enp6ent7e3t7e3t7e3t7e3t7e3x8fH5/gISFg4F+fn5+fn5+f3+AgICBg4SEhIOCg4KDg4SEhISDgn99fn19fX+ChISEhIODg4ODgYB9e3l1dHR0dXZ2c29sbnh/gYGChIWHh4aFg4WGhYKCgoOEhISEg4OCgoODhISDg4ODgoGBgH9/f3+ChIaHiIiHhYOBgYOGiIqNfn59fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/fn5+fn5+f39+fn5+fn5+fn5+fn59fX19fX1+fn5+fn5/f4CAgIB/f39+fn5+fn5+fn5+fn19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn9/fHt4eXl4dnd5fHx8fHx8fHx8e3x+gH99fHx6d3l6enl5eHl5ent8fn19fX1+fX6AgH19e3t7e3t8fHp6enp6enp6e3t7e3t7fHx8fHx8fHx8fHx8fX6AgoGAfn19fX5+fn5+fn9/gICBgYCAgICAgYSGh4eGh4eEgoGAgH5+gYKDg4ODg4ODg4ODgIF/fnp3dHN0dG9wb292f4SFhoaGhoaGhYSFhYWFhISEhIWFhoaEg4KCgoKCgoKCg4SDg4KChYSEh4iIiYaEgoODg4SDhoeIiop+fn19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f39+fn5+fn5/f39/fn5+fn5+fn5+fn19fX19fX1+fn5+fn9/gICAgH9/f35+fn5+fX1+fn5+f39+fn5+fn5+fn5+fn5+fn5+fn5+fn5+f398e3h4eHh4eXt7fHx8fHx8fXx+gIGAf3p4eHl5enp6e3t7fHp6ent9fXt7e3t7e3x9fX17e3t8fHx8e3t6enp6enp7e3t7e3t8fHx8fHx8fHx8fHx9fX+Af359fH19fn5+fn5+f39/f3+AgICAgICBgYGCg4aHh4eGhYSEgoKCgYCAgoKCg4ODg4OCgoGAf3x6d3Vzdnd6fn+ChIWGhYWFhYSDg4WFhYWEhISEhISEhIaEhISCgoGBgYGBg4OChYaJiIiIhoSDgoCAgYODhISFhoeHh35+fn59fX19fn5+fn5+f39+fn5+fn5/f35+fn5/f39/f39/f35+fn5+fn5+fn59fX5+f399fX19f35+fn5+fn5+fn5+f39/fX5+fn59fX5+fn5+fn5+fn5/f4CAfn5+fn5+fn5+fX5+fX1+fnt6eXh4d3l6e3t8fHt8fHx8fYCBgYB9eXR0dnd7e3t8fX59fHp6enp8e3x6ent8fH1+fX17e3p7e3t8fHt7e3t6e3t7e3t7e3x9fHx8fX19fn59fX19fX5/fn19fX19fX5+fn5+fn5+fn5+foGBgoKDg4ODg4ODg4KDgoGBgYCAgIGCg4ODg4ODg4SEgoKBgIB9fX6AgIGBgoSDhYWFhYWEhIODhISCgX+AgYGCg4OEhoaFhYKBgH9/gIGDg4WEhIeIiIaEhYWDg4ODg4ODhISFhYWFfn5+fn19fX1+fn5+fn5/f39/fn5+fn9/fn5+fn9/f39+fn5+fn5+fn5+fn5+fn9/fn5+fn19fX1+fn5+fn5+fn5+fn5/f399fn59fX19fn5+fn5+fn5+fn9/fn5+fn5+fn5+fn5+fn59fX5+fXx6eXl5eXl7e3x8e3x8e31/goKBgH97dnR0d3t8fH5+fn17enp6ent5enp7enx8e319fXx7ent7e3x8e3t7e3p7e3t8fHx8fX18fHx9fX19fX5+fX19fn59fX19fX19fn5+fn5+fn5+fn5+f3+BgYKCg4ODg4ODgICBgH5+f39/gIGCgoODg4ODhISDg4SCgYGCg4KCg4OEhYeIh4eHh4SCgH9/fXx6fn5/gIKChIWGhoWFg4KBgICAgIKBg4ODhYeKioaFhYODg4KCgoKDg4SEhYV+fn5+fX19fX1/fn5/f39/f39+fn59fn5+fn5+f39/f35+fn5+fn9/f39/f39/f39+fn19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fX1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5/fn19fX59e3l5enl5eXp6fHx8e3t8foKCgX9/fXp3dXV2enx9e319fHt4eHh5eXp4eXt7fHx8fHx8enp6e3t7fHx7e3t7e3x8fX19fX19fXx8fX19fX5+fn5+fn5+fn59fX19fX19fX5+fn5+fn5+fn5+fn9/gICBg4KDg4OBgYB/fn5/f39/f4CBgoOEhISEhISEhYWDg4SFhIWGhoeIh4aFhIGAfnt6enl5fH+AgoOEhIeHh4eHhoaEg4GAgYKBgYKCg4ODhIiKiYWEgoGBgICAgIGBg4OCgn5+fn59fX19fX9+fn9/fn5+fn5+fn1+fn5+fn5/f39/fn5+fn5+f39/f39/f39/f35+fX1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn59fX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn9+fX19fn17eXl6eXl6enp7e3t7fH6BgoKAf358end1dXV4e3t7e3t7enh4eHl5enp7eXl6ent7e3t6enp7e3t8fHt7e3t7fHx9fX19fX19fH19fX19fn5+fn5+fn5+fn5+fX19fX19fHx+fn5+fn5+fn5+f3+AgICBgYGBgYGAgH+AgH9/f39/gIGCg4OEhISEhISFhYWFhIWFhoeHiImGg4F/gYKBgYB9e3yBhYaIiImJh4aGhoaGhoWEgoGBgYGCgoKDg4KDhoeJhYF/gICAgICAgYGBgYGBfn5+fn19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn19fn5+fn5+f39+fn5+f39/f35+fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/fn5+fn5+fn5+fn9/f39/f39/f39/f39+fn5/f39+fHp7e3p6enp6e3t6enx/goKAfnt6enx6d3V2dnZ5fHx8fXx5eXZ2d3h6ent6enp6e3t7e3t6e3t6enx8fHx7e3t8fX59fX9/fn59fX19fX1+fn5+fn5+fn+AgIB/fn19fX1+fn5+fX19fX19fn5+fn5+gICAgICAgYGAgICAgICAgICAgYGCgoOFhYSEhYWFhoSEg4OEhISEhIWFhISEhIODg4OBhIWGh4eGhYWCgYOFhoWFh4aEgX9+gYGCgoODg4SFhYeGg4CBgH+AgYGAgICAf39+fn5+fX1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fX1+fn5+fn5/f35+fn5/f39/fn59fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5+fX1+fn5+fn5+fn5+f39/f39/f39/f39/f35+fn+AgX98ent7fHt6enp7fHx+gYKDg4F/fHx7e3l4dnFydnx9fHx8e3l5d3d3d3p6fHt6enp7e3t7e3t6eXp6e3t8fHt7e3x7fHx8fn5+fn19fX19fX5+fn5+fn5+f4CAgIB+fn5+fn5+fn59fX19fX1+fn5+fn5/gICAgICAgICAgICAgICAgICBgYKCg4WEhYWFhYWGhoWFhIOEhIWFhoaFhYWFhISEhISEhIWEhISDg4B/gYSGhoaHiIeFgoGBgYKCg4ODg4SFh4eFg4CAf39/f39/f39/f319fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/fn5+fn19fn5+fX1+f4CAf318e3t+fXx7ent7foKDg4OBf3x6eXp6eXd2dHF3fH58fHp4d3l3d3V3eHl7e3p6eXt7e3t7e3t6ent6ent7fX19fnx7fX19fX19fX19fX5+fn5+fn5+fn5/gICCgYGBgH9/fn5+fn19fX19fX19fX1+f35+f39/f35+f39/f4GBf3+AgIGBgoKDhIWFh4eFhYWFhoeFg4WFhYaHhoeHh4eGhoaGhIWEhIODhISCgYCAgYKEhoeIiIaFg4CAgoKDg4KCg4SFhoeFg4B/f39/f39+fn5+fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+fn5+f39+fn59fX1+f39+fXx7e3t6fHx7fH+DhISBgHx6e3t6eXl5eHZxcHZ8fXt5dnZ3eXh4dXV1eHp6enp5enp7e3t7e3p6e3t7e3t7e3x9fHt8fHx8fHx9fX5+fn5+fn5+fn5+fn+AgIKCgoKBf39+fn5+fX19fX19fX19fX5+fn5+fn5+f39+fn9/f39/f4CAgYGCgoGDg4ODhIWFhYWGh4eGhYWDhYaHiIiIiIiJiYiHhYODgoKDg4GAgICAgYOEhYeJh4WDgoKCgoODg4OCg4SFhoWFgoB/f39/f39/f399fX19fX1+fn9/fn5+fn5+f39/f39/f39/f39/fn5+fn5+fn5/f4CAgIB/f39/fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5/f35+f39/f35+fn5/f35+fn58fn9/f358fHx7e3t7e3p9gYOFg399fH1/f3x7enh3c3BvdHh7enl2dnZ3d3h5eXh3eHh5enp5e3t7e3t7e3x8fX19fHx8fX19fX19fHx9fX19fn5+fn5+fn5+fn5+f3+AgYOCgoGAf35+fnx9fXx9fX1+fn19fX19fXx8fn5+fn5+fX1/f39/f3+AgICAgICCgoKCg4WFhoaHh4eGhYSEhIaIiYmJiYmLioaFg4KAgICAgH9+fn5/goWGiImHhYOCgoKCg4OCgoKDg4SEhYWEgoF/fn5/gICAgH19fX19fX5+fX1+fn5+fn5/f39/f39/f39/f39+fn5+fn5+fn9/f39+fn9/f39+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn9/fn9/f39/fn5+fn9/fn5+fn5/gICAfnx+fXt7e3t8fX+CgoB+fHx+gIGBf3x5d3Vxbm5ydnl5eXZ2dnV3eXt7e3l3d3l6enl7e3t7e3t7fHx9fX18fHx7e3t7fHx9fX5+fX1+fn5+fn5+fn5+fn5/f3+AgIKCgYB/fn5/fn19fH19fXx8fX19fX19fn5+fn5+fn5/f39/f39/f4CAgICAgIGBgYGBgoSFhYaHh4eGhISEhYaHh4eIiIeFgoGAf39/f39/fX5+fn+BhIWGhoiGhIODhISDg4KCgoKCg4OEhYWFhIKBf3+AgICAfX19fX19fn5+fn5+fn5+fn9/f39/f39/f39+fn9/fX1+fn5+f39+fn5+fn5+fn5+fn5+fn5+fnx8fX5+fn5+fn5+fn5+fn5+fn5+fn19fn5/f39/fn+AgICAf39+fn9/f39+fn5+f4B/f4B/f318e3p7en1/gYB/fXt8fH6BgoKAfXl4d3RycHF1eXl4d3V1d3l7fX18fHp5eXl6eHp6enx8e3x9fX19fHx8fHt7e3t6ent7fX19fXx+fn59fX19fX1+fn9/f39/gIGCgYB/fn5+fX19fX19fX18fX19fX19fX5+fn5/f35+f39/f39/f39/f36AgICAgICAgoOFhoWHh4eFhYSEhIWHhoWEgYB/fn5+fn59fX5+fn5/f4GCg4WGiIaFhISEhIOBgoKCgoKBgoSEhYWHhYSCgICAgIB9fX19fX1+fn5+fn5+fn5+f39/f39/f39/f35+f39/f35+fn5/f35+fn5+fn5+fn5+fn5+fn5/fnx9fn5+fn5+fn5+fn5+fn5+fn5+f39+fn9/f39/f4CAgIB/f35+f39/f35+fn5/gIGBgICAfnx7ent+gIB/fn18e3x8foGCgn9+enl4dXNwcHN1eHh3d3Z3eXt8fXx8ent5eXl3eHl5enp7fH19fX17e3t8fHx8fHt7e3t7e3t7e3x8fH19fX19fX5+f39/f3+AgYKCgYB/fn59fX19fX19fXx9fX19fX19fX1+fn9/fn5/f39/f39/f39/foCAgICAgICAgIKEhYWGhoWFhISDhIaGhIKBgH59fn59fX19fn5+fn9/f4GDhIWHhoWEhISEg4GCgoKBgYGAgYODhIaIiIOBgICAgH19fX19fX5+fn5+fn5+f39/f35+fn5+fn5+fn5/f39/f39/f35+fn5/f359fn5+fn5+fn59fX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f3+AgICAgICBgYCAf39/f35+fn5+fn+AgYGBgYB/fHt7foCCg4J/fHt7e3x9gIGCgH59eXd3c29vcXN1d3h2d3h4eXl8fHt8fHp5eXh3d3h5eXl6e3t9fXt7enx7e3t7enp6enp6eXl6ent7e3x8fH19fn5+fn5/fn+Cg4KCgYB+fX19fX19fX19fX19fX19fHx9fX5+fn6AgH9/gICAgICAgICAgH9/f39/f39/f4GEhIWHhoWHhoaGhoWFhYKAf399fX5+fX18fX1+f39/gIOEhYWGhoSDg4ODhIKCgYGBgICBgoSEhomIhoOAgH9/fX19fX19fn5+fn5+fn5/f39/fn5+fn5+fn5+fn9/f39/f39/fn5+fn9/fn1+fn5+fn5+fn19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f4CAgICAgIGBgIB/f39/fn5/fn5+fn+AgICAgH98e3x/g4KAgH97e3t8fX6AgoOCgH56eXh0cG9wb3FzdXZ5enp5eXt7e3x8enp6eHd3eHl5eXp7e3x8fHx8e3t7e3t6enp5eXl6enp6e3t7fHx8fX19fX5+fn5+f4CCgoOCgYB+fX19fX19fX19fX19fX1+fn5+fn5+fn5+f3+AgICAgICAgICAf39/f39/f39+f4GCg4WEhYaGh4aGhYWFhIOBf319fX18fHx9fX5/f3+AgYOFhIaGhoWEhISBf4GBgYGAgH+BgoSGh4qHhIGAf39+fn5+fn5+fn5+fn5+fn9/fn5/f359fn5+fn5+f39/f35+f39+fn9/f39+fn5+fn5+fn19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/gIB/f4CAgICAgICAfn5+fn9+fn19f3+AgICAfnx9f4ODgH9+fHt8fH18foCChIODf357eHVycXBvbm9xc3Z3enl6eXp9fX19e3t6eXl5eXl6enl6fHx8fHx8enp7enl5enl4eHp6enp6enx8fHx8fHx8fX1+fn5+f4CBgoKBgH9+fX19fX18fHx8fHx9fX19fX1+fn5+f39/f39/f3+AgICAfn5/f39/f39/f35+f4GBg4SDhYaHh4eFhYWFhYOAfn17ent7fHx8fn5+fn+BgoKEhYWFhYWFg4KAfn6BgoGBgIGCg4OFiIiFgoGBgX5+fn5+fn5+fn5+fn5+f399fn9/fn1+fn5+fn5/f39/f39/f39/f39/f35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f3+AgH9/gICAgICAgICAgH9+f39+fX1/gIKCgoB+fX+Cg4J/fnx7e3x8fXx+gIGCgoKAfnt2dHJvbm9ubnByc3Z5enx6eHl5e3t7e3p6enl5eXl5eXp8fHx8fHx8fHt6eXl5eHl5eXl6enx8fHx8fHx8fHx7fHx8fX5+foCBgYGCgIB+fX19fXx8fHx8fH19fX19fX5+fn5/f39/f39/f35+fn5+fn9/f39/f39/fn5+fn+BgoKDhYeHh4WFhYWFhIKAfnx7e3t8fHx+fn5+f4CCgoOFhYWFhYWDgoB9fH6AgYGAgYKDg4WIiIaDgYKCa2xtbm9vb25vb29ydHV2dnd4enp6end1cnBxcXBwcHBxcXJzc3V4eXp6eXl5eXx8fX1+f4CAgICAgICAgIB/f399fn59fX19fX19fXt7fHx8fHx8fHx8fHx8fX1+fn5/gIGCg4SEhYWFhYaGhYWGhoSDgnxzamReW11fYWRhX11bXmNlaGhlYGBiZ2xzeoCEhYWEhIF7cWZdWVhdYmp0en6Bf3t1cnBwbWlmYWFkZ2tucHF1eXqAgYCAgICAf39/fHdwbWpqampqampra25xcXR1dXV1dXZ2dXd2d3l4dXBmW1hUVlteY2hveYCBgYGBgoKDgYCAfn58eHZ0b21qZ2djZGZnZ2hmaGpqbXBydHR0dHRzcnJxcG9xdXR1dXp8f396dnBsaGJiZGNhXFpdZGtudHRzcnJzdXd6foKDhYJtb29wcHBvcnNzdHR1dnd3eHp6enp4dnRycHFxcHBwcHFxcnN1dnZ4enp6enp6e3t8fHt9fn5/f4CAgIB/f39/f31+fn19fX19fX19fX18fH18fn18fHx8fHx9fX5+fn+BgoKDhISFhYWFhoaHh4aGhIN9d3BnY19eXmBiYl1aWVhbX2RnaGZjYGFjZm11foKFhYSEgntzaV9cWltiaHB3fX17d3RycG1uaWZjYmJlam1wcHFzdnt/gIB/f3+AfHp1cGtpaGhoaGhoaWtsbm9ydHV1dXV1dnZ1d3Z3eXh1cGddVlVXXF5jZ3B3f4GBgYGAgIF/gIB+fnt3dG9samloZ2VlZ2lpaWpqa2ptcHJ0dHR0c3JwcHFwb3FzcnBzd3t8fHl0cW1oZGNjYmBcWl1kbHN1dXNycnN1d3p+hIaIhW1vcXFzc3JzdHV0dXZ3eHh5e3t7eXd1c3FwcHBwcHFxc3Nzc3R1dXd5eXl7fX18fHx8fX19fn9/f39/f399fn5/f35+fHx+fn5+fX18fH19fn5+f318fX1+fn5+fn5/f4GCg4OEhIWFhYWHh4aGhoSDgn12bWdgXV5gY2RhXltYVlldZm1vamVhYGBlbXR7goOFhYWDgHZtZmNhYWRob3R7eXVzcW5tbmppaWhlZGVocHl/hoR6d3p+gIB/f317d3JuamhoaGpqaWlpamxub3N2d3Z2dnZ3d3d3d3h4eXVwZ11XVVZaXmRocHd9f3+AgICAgICAgH98enRyb2pnaGhnZ2hoampqa2tsbm5wc3RzdXVyb3BwcG9wcnJxcnR4enx8d3Nxa2dlY2NhX1tdYWVsc3V0c3N0dXZ4eX2EiImHbm9ucHJycXJ0dXZ3eHl6ent8e3t5dnZzcXBwcHBwcnJzc3V1dXd3eHl5eXt7e3x8fHx9fX1+f39/f39/f31+fn9/fn5/f35+fn5+fn19fn5+f39/fXx9fX5+fn5/f39/gIGCg4SEhYWGhoeHhoaGhIOCf3duY15fX2RkZGJgWVRUW2VwdXZuZWFhYmZrcXd/g4WFhYSBe3NtZ2JiZWlsb3N0cG5tbGxsbG1ta2lnZ2x3f4OFgnlucXmAgoB/enZxa2loamlpa2tqamprbW9xcnR2d3d3d3d3d3d3eHl6eHNqYFhUV1tgY2dudXx/f39/gIB/f358eXVybmxpaGhoaGZmZ2ttbW1ub25sbHBzdnRzc3Jvb29vbW9xcG9ydHh6e3l2cmxoY2FgYWRhYWNkaG5zdHJxcXR1dXd6f4aJiYhubm1ucHFzdHV1dXZ3eHt8f398e3l3dnVycXFxcHBxcnJ0dHZ4eHh4eHh6ent7eXt9fX19fX5+f39/f39+fn5+f39+fn19fn5/f35+f3+AgIGBgIB/f35+fn5+f4CAgICBgYKCg4OEhIeHh4eFhYWFhYJ+eW9oZmJlZmZjXlxXVVdhbXZ8e3JrY2FgY2hudXuBhISFhIJ9dnJqZWVmaWtvcG9vbWxsa2tub25uamlqb3Z9goF/eHFxd36Bf3x3cm5raGhpaWtrbGtpaWtub3FydXZ4eHh4eHh4dnh4eXl5dWtiWldWWmBjaG1zfH5/f39/gH5/fHhzbmppaGdoZWVmZ2lqbm9vb29ubGprcHNzc3V1cm9vbW5wcG9tbXB0eHh6eHNwbWlkYV9hZWJhZWpuc3V1cnBxdHV3d3l9hoqKim5ubm9wcXR1dXZ3eHp7fX59fXt6eHZ1dHJxcXFycnJzdXZ3eHh4eHh5eXp6enp5e319fX19fX5/f39/f35+fn5/f35+fn5+fn9/f4B/f4CAgYGAgICAf39/f36AgICBgYGBgoKCg4OEhYWGhoWFhYWFgoB6c2xoZGNkZWNgXlpYXml2fH9+d3BpY2BgZGtyeX+ChIWFhIB5cmtkYmVoamxub25sbGxsbHBwcHBub3JzeH+Bf3p3dG9udnx8dnJwa2hqbG1vb3Bua2lqbHBwdHV4eXl5eHh4eHl4eXl6e3l0bGNaV1ldX2JnbHN5fn9/f399eXdzb25saWdnZmRkZWZpa2xub29vb2xpam1wc3Nzc3Nyb21sbnBwb21tcnV4eHVzcG1rZmJhYmVlZmltcHV4dnNxcHF0dnZ0dXmFioqKamxub3Bxc3V2eHh6en1+fn99e3p4dnV0c3NxcXFxcnJzdXV3eHh5eXl6e3t5eXp8fX18fHx9fn5/f39/fn5+fn9/f39/f4B+f3+AgICAgYGBgYGBgYB/f39/gIGAgIGBgYGDg4KDg4SEhIWFhYWGhIWDgXp0bmhlY2NhYF5dXF1mcnt/g4B6dWtlYl5iZ21ze4CDhIWDgXx1bmxnZGZqa2ppaWtra21vcnR0cnR1dnh7fHhxbW1wcGlqdHVzbmpqa2xtb3Byc3BraGlrbW9zd3h5eHh4eHl5eXl6enp7enVuZl9aWlxfYmdscXd6e318endyb2tpZ2VlY2JiZGVnaW1vcHFwb25tbGpobG9ydHNyc3JvbmxucHFubW5xdHV0cnFubmtnZGFiZmZrcHN2eHp3cnBxc3V2dHN0eISJi4tqbG5vcHFzdXZ5enx+fn5+fXx7enh2dXRzc3FxcXFycnV2d3h4eHl5eXp7e3t7enx9fXx8fH19fn9/f39+fn5+f3+AgICAf4CBgYCAgICBgYGBgYGBgH+AgICAgYCAgYGBgYKCgoKDg4SEhYWFhYSDg4J+eHJsZmJgYGJhYF5fZHB5fYGDgHt2cmxkYWBma3F5f4OEhYOBfnhxbmlnaWtqaGlrbGxsbnF0dnV0dHh5eXl6dm9ucHJva2pqbm5paWxvcW9ucnR0cGtoaWttb3N3eXp6enl5eXl5eXp6ent6dm5mYV5bXV9iZ2pvd3p7enZzcW1pZ2dlY2JjZWVlZmlsbm9xc3Bvbm1qaGhrcHN0c3Jzc3BubG5wcm9tbm9wcG5sa2traGRjZGVoa3J3e35+e3VzcnN0dXd0c3J2gIeHiG1tb3BvcHF3eHt9fX9/f359fXt5dnV0c3FxcXFwcHFzdHV2eHl6enp7e3p6enp7e319eXp8fXx9fn5/f319fn6AgICAgICAgH9/gIGAgIGBgYGCgoGAgYGBgYGBgYGBgYGBgYGBgoKDg4SEhISEg4ODgXt0bmllYFxdYGBeXmNrdn2CgoODgHx1bWdhYGJncHZ8gYSEhIJ9fHdxbGpna2xpaGtubW5wcnV2dnd2fH56d3d3d3h6dmtoaWluc29vcXZ5dG1ucXJwa2lpam1wcnd5enl5eXh5eXl5enp6enl4b2hkYF5eYWNma3BzeHl0cm5saGdkZGJfYWJkZmdpbW1xcXJycG1tbmppaWxydnV1dHRzcG5sbW9wbWtra2tqaWpoZmVjYmJlZ2tvdXt+gH54dHNydHZ4d3RxcHV8g4aGbW1tb29wcnd5fH9/f39/fn19e3l2dXRzc3NycnJyc3R0dXZ4eXp6e3p6e3t8fHt7eXl6fHx9fX5+fn9/f3+AgICAgICAgICAf3+AgYCAgYGBgYKCgYCBgYGBgYGBgYGBgYGBgYGCgoODg4SEhIODg4F9eHFqZV9dXV5fX2BjaXJ7gIKCg4OCf3hxa2ViYWdtdHp/goSEg4F+eXJtamdnaGtqa2ttbnJ0d3l6ent/gHlzdXp+fXZxb2llZWlvc3V7goF7dHFycnBraWlqbG9yd3t8fHx6enp6e3t7e3p6enhya2RgXl5hY2ZobHBzc3BramZkY2JiZGVkZmhpa21ubm5ucHBubGtsbGtqbnJ2dXV0dHNwbmxucXBraGdmZmZlZGVkY2NiYmVobHJ4fX99e3dzcHJ0dnd1cnFwcnqBhYVsbG5vb3J1d3t+fn5/f35+fHx7eXZ2dXNycnFxcHFxc3V2dnd3enp6enp6enp6enp7e3t8fX59fn5/fn5/gICAgYGAgICAgICBgYGBgoKCgoKCgoKCgoGBgoKCgoGAgICBgYGBgYKCg4ODg4ODhIKAfXhybWdjYGBfYGBgYWZueIGCg4ODg4OAfHZuaGBgY2hvdXyCg4ODgX95c25qZmVoamprbHBzdXh6enx6fH1+dnF4f355dnRvbGtqaWpucHh7d3Fwdnd1cGtnaGttcHJ3fH18fHt7e3p8fHt7fHt7eHJrZGFgYGJjZWdqbnBvaWdlZ2RiYWJiY2dpaGpub29ubW5vb21ubm9ta2tvc3V1dXV1c3BtbW9wb2ljYmVlYWBhZGNkZWVmZmhtcnl9fHt6dXFxc3N1dXJxcXBweH+CgmxsbG5xdHZ4e3t9fX9/fn57e3p3dnV0cnJycXFxcnN0dXZ3eHh6enp6enp6e3t6ent6ent8fX1+fX+AgH+AgICBgYCAgICAgIGBgYGAgIKCgoKCgYKCgYGCgoKCgYCAgIGBgYGBgoKDg4ODg4WEf3t2cm1oZGJfXFpgYGJla3J7gYKDg4ODg4B+eHJsY19iZmxyeoCDg4OBfnh0bmpmZWhqamtscXR5e3x7enh2dnZ2d32CgYB8eHNxcG9vbnB0e3h0c3h9fXl0bGhoa2xvcnd8fXx8fHx7e3p6e3t5eXh2cGxnY2BgYWRnaGlrampoYmFjZGRjZWdmZ2lqa25vb25ub3FxcG5ub25sbXF0dnZ2d3Z1cnBvcHJtZ2FhYmJgX2BhYmNjY2RnaG1yeX18enh0cXJzc3V0dHNycXF0e4GBa21tb3Fzd3h5ent8fn5+fHp5eHd2dXRycXFycnN0dXZ1dnh4d3h4eHt7enx6ent7e3t8fH19fn5/f39/f4CAgICAgICAgICAgYGBgYGBgYCCgoKCgoKCgoKCgoKBgYCAgYGCgoKCgoKDg4OBg4B7dXBsZ2VjYF5dXV9fYmdxeoCDg4ODgoODgoF7dm9mYGJla3F3fYGCgoGAeHZxamZkZmhqa210eH18fX6CgXt2dnV2fIGCfHp5eXt2dHZzdHd8d3F0fH59eHJsaGhqbG9xdnx9fX19e3x8fHp5d3d3dnRzb2plYWBgY2lqamdnZ2VjYWNkZGloaWpra2tsbm9ubW1tcG1tcHJyb25ucnV2dHR2dnNwbm9wcGxmYGFhXl5fX2FiY2NlaGhqbnN4fHt4dnJwcnN0dnRxcnJxcXN5f35sbm1vcnV3eHl6e3x9fXt6eXh4d3V0dHFxcXFxcXJzc3Z3eHh5eXp6eXl5enp6fHx8fHx8fX1+fn9/f39/gICAgICAgICAgICBgYGBgYGBgYKCgoKCgoKCgoKCgoGBgYGBgYKCgoKCgoODg4F/e3ZvamZlZWNgX19gY2VpbnZ8gIODg4ODg4KBfnx2b2dhYGRobnV7gYKCgX17dXFuaGZnaGtrcHZ6en6AgoeKg35/fn5/fnx4dnNzcW9wcXJ1eHp4dXZ9fn14cmxoaGpucHR5fH19fX59fX18enl3dnV0c3BtaWRiYWFkZWZlZGdnZWJjZWdnamprampqaWtub25tbGxsbGxwcnJwb29zdnh1dXZ2dHFub3Bwa2ViYmFeXlxfYWRlZmlqamtvc3l7enh2cnByc3R2dHFvb3BwcXd6eW1tbW90dXZ4eHp7e3x8fXt4d3d2dnVzcnBwcXFyc3N0eHh4eHl5enp6enp6enp7e3t7fHx+fn1/f39/f3+AgICBgYF/gICAgIGBgYF/f4CBg4OCgoKCgoKBgYGBgoKCgoKCg4ODg4ODgoKCgX13cWxpZWVlY2JhYmVmaGtze4CCg4ODg4ODgoKAfXZvaGJhYWdscnp+gYF/fHd0cG1pZmVna2xxdnp7f4GChoV/eXRydXZ3dHJxbWtub29zdXV4enl2d36Bfnhxb2tpa2xucXZ7fX5+fn5+fHt5d3Vzc3R0cW5oZWJiYmVmZmdnZ2doaGdnamtqbG1qaWpra25tbWxsbm1ub3BvcXJvcnR2dHRydXZ0cW1ucW9rY2BgY2NiYWFjZGVmaWpsbXF0eHp5d3RxcXJ1dXZzcXBwcHBwdXV0bW5vcXN0dHV3eHp6enp6eXd3dXV0c3JxcXFxcXJyc3R3d3h4eXl5enp6e3t6ent7e3t9fX5+fX9/f39/f4CAgIGBgX+AgICAgYGBgYGBgYGCgoKCgoKCgoGBgYGCgoKCgoKDg4ODg4OCgoKBfHdwbGlmZWVlZWVmZ2hscXh+gIKDg4ODg4OCgoN/enNtaGJjZmtwd31/f3x5dHJwbmtoZWhscHB0eHt/goSCfXdzcW1ucHFwcG5tbW1wdXl7enl6d3Z6f4F+eHFtaWlrbnByd3t9fn5+fnx7enh2c3Rzc3JvbGhnY2FhZGdnaGhoaGlpamptbm1ubmtqaWpqa2tramxtbm1scHJzc3N0d3d1dHV2d3Rxb3Bxb2tmYmJkZGRiYmVmaGpqaWpucnZ5eXh1cnFxcnV3dHBucHBwcG9xcXBub3FxcnFyc3d4eXl5eHh4dnZ1dHNycXBwcHBxc3N0dHV2d3d3eHl6e3t7e319fn5/f35+fn5/f39/fn5/gICAgICBgYCAgICBgYKCgoKBgYGBgoKBgYKCgYGBgYKCg4ODg4ODg4ODg4ODgX99d3BqaGhnaGhoaWlrbHB3f4CCg4ODg4ODg4OCgX57dW9qZmNlaXB0e318enZwcHBwbWlmZ2pub3N3en6AgX56dXBwbm1ub29ubm5tcHV4e4B/e3h1dXyBgX54cGtpaWtudHV5fH5+fn59fHp4dnZ0dXRzcm1qaWpmYmJkaGtsbWxqbGxub3FycnBubGplZ2dpamtrbm1tbm5wcnR0dHd5end0dXZ2dHBvcHFvbGZkZGVkZGNiZGhqbGxsa29zeHh4dnJxcHBzdnh3c3BucG9ubm5vb25vcXFycnN0dXd4eHl4d3d1dXNzcnFxcHBwcHFzc3R0dXZ2d3h5eXp7e3t7e3t9fX5+fn5+fn9/f39+fn+AgICAgIGBgICAgIGBgoKCgoGBgYGCgoGBgYGBgYGBgoKDg4ODg4ODg4ODg4OBfnlzbmppaWtsbGxtbW1vdHp/gIKDg4ODg4ODg4KBgXx2cGtmY2VpbXN3enl3dHFwcG9ta2dkZ2xvcXV6fn+DgX54c29tb3FwbW1tb29xd3t/g4WBe3d2eoCBfnhwbGprbG9yd3p8fn5+fXx7eXh2dnR1dHNwb2xraGdjZGhtcHR1dHFwcXJzcnR0cW1ramhoaGlqaWlnaWtsbnByc3V2eXp4dXR1dnVzb29wcW9sZmZmZGNiYmJkaGptbW5scHN2eHZ1cnFwcHN2eHd0cW9ubWxra25ucHBxcXJzc3V2d3d2d3d3d3Z1dHRzcnJxcXFxcnJzdHR1dnd4eXp5enx8ent7ent7fHx8fX5+f31+fX9/f4B/f4GBgYGAgICAgYGBgYB/gYGBgYKCgYGBgYGBgYGDg4ODgoKCgoODg4KCgIB7dG5qaWprbm9wb3BvbnJ2fIKDg4ODg4ODg4ODg4KCfnlybWhkZGdsb3V3d3ZzcW9vbWxraWVoa25vc3d9gIB/fHZycGxramZna2xucXV7gIOEhoN7dnV6f4F+d3Bra2xtb3F2e31+gIB+fXt6enl3dXRycW9ua2poZ2dob3R3e3p4dnRyc3Z3d3ZzbmxpampqaGlpaWdnamxucXNzdnZ4eXl1c3R2dXFvb3JycGxlZGJjYmFiY2Voa25ubW1vc3Z3dXRycW9xc3Z3d3Rxb21rampqbG1wcG9vcXJydHZ3d3Z2dnNzdHRzc3NycnFxcXFycnN0dHV1dnd4eXl6eXl6eXh1dXVzc3V4fHx7enp5enp8fX6AgIB/f4CAgICAgICAf4CBgYGBgoKBgYGBgYGBgYODg4OCgoKCg4ODgoOBfndwamloaWxvcHJxcXBucnd8goODg4ODg4ODg4ODgoKAenVvaWVjZWtvcnN0c3Fwb29tbmxqZmVpbnBxd31+fXx7eHNwbGpoaGlrbm9zeX+ChYSGhX12cnd9gX53cGtrbG1vcXd8fn9+fn59fXx6eXh2dHNwb29samloaW51fIB/f316dnR2eHp6dnNwbWxoZ2doaWlpa2pqbW5xc3N0dnp7eXVzdHZ3cnBvcnJwZ2RkYmBgYGFjZWhrbm9ubXBzd3V0c3BwcnN0dXZ2dHFvbWtqaGhrbG5vb29vcHFzdXZ3dXR0dXV1dXR0c3NycnFxcnJzc3R0dXZ2d3h5eXt8eXd0cm9ramhpbHB3d3VzcnBxcnJ1eHx+f39/gIB/f4CAfn+AgIGBgYGBgYGBgYGAgoKCg4ODg4ODg4ODg4ODg396c2xoZ2hqa29vb29vb3F1fICCgoODg4ODg4ODg4OCgoB8dnFqZGFkaW1vcHFxcHBwcG5wb2toZ2lucHB0en59fnx4dXFtamlpaW1ucnd9goOFhoaHg3p2d3+Cf3dwa2tqa29xdn1/gICAf359fHp5eHZ1cXBub2xqaGhrdHuAgoSBgHt3dnd7fHp4dHBubGppaGlpZ2lpaWxsbm9xc3V4eXx5dXR1d3ZycnJzc21lYGJiYWFfYGNmaGtubm5ucXV2dHJxcXFzdHV2eHd0b21samloaGprbm9wcHByc3R1dnV0dHR1dXV1c3NxcXJycnJzc3N0dHV2dnd3eHl5e3t4dXFsamloZmVmam5taWZjYmRlaGxvc3d6fH5+fn9/f3+AgYCAgYGBgYGBgYGBgYCCgoKDg4ODg4ODg4SDg4J9eXFqZ2VjY2RpbXBwcG9wcnd8gIKCg4ODg4ODg4ODg4KCgX54cmtlY2NlaWxtcHBwcXFxcXJybWhmaWxwcXN4fH19e3d0cW1sampqbnJ3fICChYaGhoeFfXV2fX98dnBsbGxtb3F2fX+AgIB/fn59e3p4d3ZycW9wbWtqam52foKEhIOBfXl5e3x8eXd1cnFubGloZmZmZ2hoamxwcXFxcnZ7e3l1d3h3dnJycnNzbWVgYWBgYGBhZGdpbG5ua2xxdXZ0cXBwcXN0dHV2dnFub21samhoamtrbG5vcHFxcXNzc3N0dHNzcnJycnJycnJzc3Nzc3RzdHV2dnZ4eXp7eXh2cm1samlnZWNiY2NiYmJiYGFkZWVob3V7fX9+fX1+fn9/f3+AgIGBgICBgYGBgYGCgoKCgoKDg4ODg4KAfHhzbWZjYGBgYGZvcXJxcHF3fH+Bg4ODg4ODg4ODg4ODg4OCf3hybmZhY2ZramprbW9wcnNzdHNwamdoa25wcXR6fHt5dHBxbGtrbG1xd3t+gYKEhYaGhoZ7dHV8gH53cGxsa2xucnh9fn9+fn9/fXx8enh2dXNxb3FvbWxscXd9gYOEgYB9e3p7enl4d3RycG1qaWdmZmlpaGdpam5wcXJzd3t8enZ1eHd1cnJycnFpYV5fXV5gYmRmaGttbm1sbXJzdXR0cnBydHR0dXd3cm5tbWtpZmVoa2tsbW5wcXFxc3Nzc3Jyc3NycnJycnJycnJzc3N0dHZ2dnZ2d3h5ent5eHZybm1ramhmZGNiY2RiYWFiZGRkY2NmbHF3e319fn5+f39/f4CAgICAgIGBgYGBgYKCgoKCgoODgoKBfnp1cGtoZF9dXGBla3BzcnFydHp/gYKDg4ODg4ODg4ODg4ODg4J/e3VvamVhY2Voamttb3BzdXh4dnNsaWhqbm9xdHh5eHNubGxqa2ttcXZ6foCChISFhoaGhoF3c3V5e3Vva2trbG9zd3x+f4CAf3+Af3x7enh2dHJwcW9tbGtxd3p9gIF/fHl1dXVzdHNycHBvbGhnZmhqaWlpaGhrbW9wcXN3enl3c3R2d3VxcXJyb2hgXV9dXmBjZWdpbG9ubWxtcXJycXFxcXN2d3V3eXh0b2xsa2llZGZobW5xcXBwcXFyc3R0dHRzc3Jyc3JycnJycnN0dHV1dXV3d3l5eHl6e3t7eHVycnJybmpnZ2dmY2ZmZmZmZGViYWBjanR4enx8fX5+fn9/gICAgICAgYGBgYGBgoKDg4ODg4ODgX13cWxlYl9dW1xeYmxucXNydHd6f4CDg4SEhISEhISDg4ODg4ODgoF+d3FrZWNlZ2dpam1wcXN4e3t5dm9qaGhvcHBzdXVybWtramtsbG5xeH+Cg4ODhYWFhYeGhHxzcnd4dXBsamtsbnJ3fICAgYGAf359fX18enl2dHNycW9ubnFzdnl6fHp3cHBxbWtrbWttbWtpZmRjZWlpaWhnZ2dqb3Bwc3d6fHp2dHV1dHJyc3JuZV5cXFtgYmNlaGtvcW5raWxwcXNycHBwc3V0dHV4eHFtbm5saGdkZWZtbnBwcHBxcXJzc3Nzc3Jyc3NycXJycnJzc3R1dXV1dXh4d3h4eXp7e3t6enh4eXl1cm1saWptcXN1dHRxbWhiYmJja3N2d3h6fH19fn6AgICAgICBgYGBgYGCgoODg4OCgoF8dm9qZGJfXl1gYWVpbXByc3V5fH6AgoODhISEhISEhIODg4ODg4OEgn94cmxlYWNkaGpqbXF0d3t9fXt4c2xoaGxvcHBwbGlmaGhqbGxsbnF4f4KDg4OFhYSFh4SAeXNyc3Z0b2xqamtucnh9gICAgH9+fX19fXx6enh2dXNycG5wb3F0dnd2cW1oZmVjYmFkZ2pua2hkZGNlaWpqaGpsbGpqam90eHp8d3N0dXV0cnJzcm5lXlxcW19iZWZsb29wbmtqbW9wcHBwcHFzdXRzdHp5c25tbWtnZWNjZWxtbW1tb25wcXFxcXBwcXFwcHFxcXFyc3N0dXV2dnZ2d3h4eHl6e3x7e3t7fHx8fHd1b25ucXV4eXt7e3l0bWVjYmNlaGtvcnV4eXp7e35/fX6AgIGBgYGCgoODg4ODg4KBfnhva2dmY2FhYWJkZ2xvcnN1en+AgYODg4ODg4ODhISEhIODgoKDg4ODgn51bmhiYGRnaGlrcnZ5fn9+fnt2b2hna25xbGllZWJkZWhra21ucnh/goOEhISEhYWFhYN/eXd4eHVwbWtpam90eH1/f35+fX19fHx9fHx7enh2dHFucG5ubnBzdXNvZmBgYF5dXmNmamxsa2dkY2dqa2xtcHBvbm1rbnF3e3t4dXV2dnVzc3Jxb2ddWltfYmdpaWtvcG9tamptcHFzc3Fxc3V2dnRzeHhxbm1saWhlYmVma2xtbWxtbnBxcXFxcHBxcXJycXFxcXFydHR1dnZ2d3d4eHh4eXp7fHt7fHx8fHt7enh2dnZ4eXp8e3x8fHl0b2toZGJgYmRnaWppamxxdnx9foCAgYGBgYKCg4ODg4ODgX55c25pZ2RiYWJmZ2xucHF1eXx/goOEg4ODg4ODg4OEhIWFg4ODg4SEg4OBfnZybGZjY2hqa25zd3p+gYB/e3lyamZobG5qZWJiY2VlaGxtbnBydXyCg4SEhISFhYOAgH14dXp6dXBraWlqbnN4fX9/fn5+fnt4eHl8fH18end1c3Fubm5tbnBxcWxkYWBhYWFiZ2tucHBtaGRjZmlrb3BzdXJvbmxrb3V7e3d0dXZ2dXNzdHNtZVxZW2FmZ2trbG9xcGxoaWpucHJzcXFzdXZ2cnV5dnFubGpqaWViZGJramprbG1vcXJycXFwcHFxcnJycnNzdHV1dXR0dnZ3d3h4eHh5ent7fHx7fHx8fHx8fHt7fHx7e3x8fHx7enZzcW1pZWFiZGBgXV9iZGdud3p+gICAgIKCg4ODg4ODg4KAe3ZxbGpoZWJhZWpscXN2d3x+gYODg4ODg4ODg4ODg4SFhYaFhYWFhYWFhYN/e3NsZmRlZ2pscHZ7foGCgn99eXNsZmVobGtjYGFjZmhtb29ub3R5foKDg4ODhIODhIOBfHNyd3p1cGxsbW5ucXh9gICBgH14dHBxd3l7fH18enZzcG5vbm5ucXJua2ZnZ2ptbnJ0dXZ1cGtmYmJlaWxvc3d7eHJuamludHt7dnR1dnd0cnN0cmxjW1lWX2hsbW1vcHJuamdnam1xdHNwcXR2eHdzdHh1cG9sa2poZWRlZmppamttbm5wcHBxcXBwcXFycnJyc3R0dXV1dXV2dnh4eHh4eHl6e3x8fHx+fX19fXx8fHx7e3x8fHx8fHt6eXl1cm1raGdkYV5cXF1eYGdweH2AgIKCgoKDg4ODg4ODgn14cm1raGdnaGtwdHh5en1/gYKCg4ODg4ODg4ODg4SEhYWGhoaGhoaFhYWFg4F9dW1mY2Rnam9zd31/goKCgX54dG9pZ2lsa2hjYmZrbnJzcW1vdXyAgoODg4OEhYWCf3lyb292eXVwbGxrbG5xeH2AgIB+eHJpZWVtdHl8fHp3c3Bvb21ta21vcHBvb3F2eHl5enp6endybGZiY2Vnam1xeHt8dm9mZWpzenp2dHV2dnNyc3RzbmZfXVxhaGxub29wcG1pZ2hqb3N0cnN0dnd3dXR2eHVvbWxramhmZWZoampqa21ucHBxcXFxcXFycnJycnJzdHR1dXV1dXZ2eHh4eHp6eXp7e319fHx9fXx8fHx7e3t7e3t8fHp6fHx6eXh1c29taWdlYWBgYGBgZW53fYGBgoKDg4SEhISDg4J/fHdxbWtraWltc3l8fn+AgIGBg4ODg4ODg4ODg4SEhISFhYaGh4eHh4aGhYWEg3x3cGhlZmhsb3N6f4GCgoKBgHp2cWtpamtuaWZkaW90dnhzbW1xd32Ag4KChISFhYN+dm9vcXd5dm9ra2prbnN5foGBgnxyaGBcXWVudHt7d3NxcG9ubG1ub3BxcHBxdnx9fHx+fn58enNrZmNkZmhqbHN4fnx2bmZhZG53eHZ1dnd3dHV1dHJvaWJhXmFna29xc3NxbWlnaWtxc3N0c3R3eHh1dXh5dm9sbGxraWRmaGlqamprbW5wcHFxcXFxcXJycnJycnN0dXV3d3d3dnZ4eHl5eHl6enx8fHx8fH19fHx8fHt7e3t7e3t7enp8fHx6e3l4d3RxbmtqaGZkYV5ia3R9gYGCgoODhISEhIODg355dG5tamprcXZ6foCBgoODg4ODg4ODg4ODg4ODhISEhIWGhoeHh4eHhoaFhYSDfXlza2ZmZ2pvc3h+gYODg4KBfnt2b2poam1sampxd3t8e3VvbW1yfH+BhISEhISEgnx1c3JxdXh2b2tramtuc3l+gYGBenBoYV1fZm50eHdzb21tb25sbW9wcHFycnV6fX5/fn5+fnx4cWpnZGVoaWttcXZ7e3ZsZGBibHR4dnV2d3d0dXV2dHBpZmViZWpucHNzc3FuaWdrbXJ2dXJzdHd4eHVydXh1b2xqamtpZ2lsbWlqampsbW9xcHBwcHBwcHBxcnNzdHV2d3h4eHh3d3h4enp4eHh5e318fHt7enp7e3p5fHp5eXl5e3t7e3x8e3t6enx8fHt3dXNxbWdhXmFncnyAgoKCg4OEhIKDg4KAfnhya2prbHF3fH+Bg4ODg4ODg4ODg4ODg4ODg4ODhISEhoeHiIiIh4eGhoaFhIN/fHZwaGVlaG1yeH6ChISDgoCAfHdzbGlpbW5tbnV9f355dG9tbnJ4f4OEhISEg4KBe3V1d3V2dnZubGttbG90en+Cgn98cmljY2Rob3Jzc29sbGxra2xtbm9wcHFxdXp9f39/gH5+fXZuZ2NkZWZnam1ydnl5dWxjX2JrdXh2dXZ3dnV0dnZzbmlnaWhobG9wcnRybmpnZmpucXV1dHR1eHh3c3F1d3Jua2tqaGZnamttaWpra2xtbm9wcHBwcHBxcXFyc3N0dHV2eHh5eXd3eHh6ent6eXt7fXx8fHx9fXt7enl4eXh4eXl6ent7fHx8fHx8e3t7e3p6eHZxaGFeYGp0fICCgoKDg4SEhYWCgHx3dXBta2xtcnd+gIGCg4ODg4ODg4ODg4ODg4ODg4OEhISGh4eIiIiHh4eGhoWEg356dXBnZWRnam92fIKDg4KBfnl1dnRtamltb3BxeH+Bf3p0b2xscnh/g4SEhISDgnx3dHp9enZ2d3Bsa2tubnN4fYKCgHpzamdna2xucHBwbm5tbWxsbm5wcXFxcXFzd31/f39+f396c21lYmNlaGlqbnN3eXl0bWZgYWpzdnR1dnh2dXR2dXJuamlqa2tucHJzdXRuamlpbXJ0dXNzdXZ4eHZyc3d4c25ra2poZmdqb3Fpampqa2xucHBxcHFxcXJxcXJzc3V1d3h5eXl5eHh5eXl6enp7e3t7fHx8fH19e3t5eXl4eXl5ent5e3t7e3x8fHx7e3t7e3t8enVrYl5hanR8gIKDg4SEg4SDgoB9d3BubGxsbnF0en6AgYODg4SEg4ODg4ODg4ODg4ODhISFhYaHh4iIiIiIh4eGhoWEgXx3cGpmZGVpbXJ7f4ODgH98dXN0dW9ra21vcHJ5fYF/enZxa2pvdn+EhISEhISAenZ3e3x4dHR0cW5sbW1vc3l/gYKAfHVxbW1ubm1vcHBtbW9tb21ub3FxcXFwcHN4fX9+fn5+fXlzbWhjZGVnamxwc3l8eXNtZmJja3J0dHV3eHd2dXV1cW5rbG1tbnBxc3R0cW1sa21xdnd2c3R2dnh4dHB0eXlzbmxra2llZ2lscWlqa2tsa2xtbnBwcXFxcXFyc3Z2d3h3eHl5eXl5eXl5eHl6ent7e3t8fHx8enp6enl4d3Z1dXV3d3h6ent7fHx8fHx8fHx7e3x5dm5kYGFnc3t+gYODhISDhIKAenRwbGtrbGxtcXd9f4GBg4ODhISDg4ODg4ODg4ODg4OEhIWFhoeHiIiIiIiHh4eGg4J9eHVybGZkZWltcnd9gYF+enVtbG9yb2tqamxvcnd9gYB8dnFubXF3foOEhISEgn16fH14dXNycnNybmxsbG5yeX+CgYB7dnJzc3NubW9wcG5ub21tbm9wcHFxcXFxdHh8fn5+fn58eHFrZ2NlZ2hrb3N1e3x5dG9pZWVucXJ0dXd4d3Z2dnZxbGlqbXBxc3R0dXVzb21ub3R3eHZ0dXZ2d3dzcnR5eHJubGtraWhqbG90aGlqbGxtbW5tb3FxcnJycnN1d3d2dnh4eXl4eXt7e3t7e3t7fHx8fH19fHt7e3l5eHh3d3d3dXV0dXd5e3x7e3t7fHx8fHx8e3t4cGZhYWVxen5/goOEhIOCfXdxbmtoaGlpam90en+CgoODg4OEhISEg4ODg4ODg4ODg4OEhYaGh4eIiIiIiIeGh4WCgH14c3JtZ2RkZmlwdHp9fXlzbWVmbXFuamhsbG5zdnuBgX12cm9tcnh+goOEg4ODf3p7e3Zzb3BxdHBtbW1sbXF3gYJ/e3hzc3Z2dG9tbXBwcHFxb21ub29wcHJyc3N1enx+fn1/fXp2b2llY2RnaGxvc3p9fHdybGlnaG9ydHR2eHd3dnd3d3JubG1vcXN1dHV0dnNwb29ydnl3c3N0dXV3d3R0dnh2cW9ubGpqamtucXdoaWpsbG5wcHFycnJycnNzdHZ3d3d3eXl6enl6fHx8fHt7fHx9fXx6e3t7ent7eXl5eXl5d3d1dXZ4d3l5e319fX18fHx8e3t7e3lzamFfY2x1e39/gIODgX13cmtnZ2dmZ2lscnd9gIKCg4ODg4SEhISDg4ODg4ODg4ODg4SFhoaHh4eIiIiIh4aHhYJ/enVxb25pZmZoaG5zeHh1b2lkY2Vnbm5ubnBvcXN0en+BfXhzb2xvdX2BhIWEhIODfnx6eHVycXJzcW1qbGtsbnV6fHl2c3V3enp2cHBwcnJydHFvbW5wcHBxcnJzc3R5fH+Afn18enZvamVkZGZoa3B0eXt6dnBta2puc3Z1dXd4eHd2d3d2c25sbW9xc3R2dnV2c3Fwc3V4enZ1dHV4eHh4dHR4endvbGtsampqbXBycmlqamxsbW9wcXFxcnJzdHR1dXh4eXt7enp6e3t8fHt7fHx8fHx8fHx7e3l7eXl6enp6enp6enl5d3d4eHh5e3t8fH19fHx8enp7enRtZGBjanR6foCAgoJ/d3NtZ2NjYmRnaXF1fX+AgYKDg4ODhISEhIODg4ODg4ODg4ODhIWGhYaHh4eHh4eGhoWCf3p3dHBubmtpaGlpbHBycWxnZGJhYGNpb3Fydnt7eHd6foB8eHJtbnF3f4OFhoWFhISCgYF7dXJxc3RwbGpramttcHN1dHBwdHl7enVycXR0dXZ1cG5tbm5vcXFzcXFydXl9f39/fnt4dW9qZWRjZWltcXV6enhyb25ucHJ2eXh2eHp6eXl4eHhybGptcHJ0d3d1dnd1cnN3eX17d3V1dnh5enl1dXh5dG5ra2tra2tsbG5taWpsbWxtb3BwcHFzdHV2dnZ3eHh5e3t7fHx8fHx8fHx8fHx8fHx7e3l5eXp5eXl5eXl6enp6eXl5eXl5eXt7e3x8fHx7e3x6ent6d3FrYmFlbnd9gICBgXxzbWdhYGFjZWlvd3x/gYCBgoODg4OEhISEg4ODg4ODg4ODg4OEhIWGhoeHh4eHh4WEg4F8eHNxcG5vbGhnaWlqbGtqZ2RhX2NlaW1xdXp9foB9fIGCf3t3c3Bucnh/g4WGhYWCf3x8fXhycXV3dnBsamtqaWlscHFwbWxxdnp7dnN2d3p4dnJwbm5wcnJycnJzcnR2eXx+f39+e3dybmllZWZpa25yeHp5dnFvbm5wdXh6d3h6e3t5eXl5eHJrbG5wcnR1dnZ3d3V0dnl8fXt3dXd4eHl5d3V3e3lybWtqampra2tsampqa2xtbm9wcHBxcnR2dnZ2d3h5eXp8fHx8fHx8fHx8fHx8fHx8e3p6eHh3d3h5eXl5eXp6enp5eXl5enp7fHx8e3x7e3t7e3t7e3t6dG9oZWVrdHp+gH9+eXNqZWBgX2NqcXZ9gICAgYKDg4ODg4SEhISDg4OCgoKCgoODhISEhIWFhYWGhoaFhIKAfHRxcHBvbm1raGdoaGlpZWFkY2RjamxucHR4fXl3fH+BhoqLiYB4cXBzeX+DhYWFhYSDg4N+eXNyd3t5cWtqamtqa25ubWxpbHJ1e3t5d3h7fHh4c3BvcHFycnJwcnR0dXd5fH5/fnt5d3FsaGRkZmdqbnJ2dnRxcXFwcHJ1enp4d3l7enl5eXp6c25ucXJzdXV2dXZ2dHN2eXt9end3eXl4enl4dXZ6e3NtamlpaWpqampoamprbG1ub3BwcHFzdHZ2dnZ3eHl5enx8fHx8fX18fHx8fHx8fHt7enl4eHl5eHl5eXl5enp6enp6eXl6enl6enp7fHt7e3t7e3t7e3p3cm1nY2ZudXl7e3p3cWhjYGFjaXF4e36AgICBgYKDg4ODhISEhIODg4KCgoKCg4OEhISEhYWFhYWEhIJ/fXt2dHFwcG5ucHFsaGdnaGhmYmNiYmRqbnJ0dnZ5dnFzdHR4f4aGgn16d3h8f4OFhYWFhISCgoF9eXd3e3hya2ppaWhqa2tqaWptc3d4eHl3eHt8eHZybm5wcXNzcnBydHR1d3l8fn59fXp0cGtmZWVnaWtvc3VycXBwb29vc3h9fHl5ent6eXl6fHhybW5ydHV2dnZ3d3Z0dXh7fX16d3d5eXp7e3l2eXx6cm1raGlpamppa2pramttbm5vcHBxc3R1dnV1c3R1dnl7e3t9e3x9fn19fHx8fHt7e3p6eXh4eXl5eXl5eXl5eXh5enp6enp6ent7e3t7e3t7e3t7e3t7e3l0cWplYmZscXR1dHFtaGVjY2lvdnt/gYCAgYGCgoODgoKDg4WFg4ODg4KCgoKDg4SEhISEhIWFhYJ/fXp3dXNxcXBwbm5wcXBnZWVmZ2ZkY2NiZGhscHN3d3FpamxtcHJ2e4GDg4OAfXx/goSFhoaFgn5/gX97eXp8d3Fta2pra2tta21ra291eHp4eHd5ent4dnRwcHFyc3NycnJ0dHV4en1+fXx6eHNua2hnaGttbW9wcHBwcHBwb290en9+e3p6e3t6ent7eHBsb3R1dXZ3d3d3dnV2eXx+gHp3eHh5fHx9enZ8fHhxbGpqa2pnZmlraWxpamprbm9wcHJzdHV0c29sa21wc3Z2dnd5fH1+fn5+fnx8e3t7enl5e3t5eXl5eXl4eHd3d3h6enp6enp6e3t7e3t7e3t7e3t7e3t7fHp1bWZgY2ZrbWxraGRiYmJnbXN8fX9/gICBgYKCg4OCgoODgoKDg4KCgYGBgYKCg4ODg4ODgoJ/fHl2dHNzcXBwcHBxcnN0cGpmZmdoZ2VmZmJfYGZtc3V3dnBua25wcnZ9goKDhoaEg4KDhIWGhoWEgn99e3p/hH53cW1ra2xsbGxsbm9wcXV4e3p5eHl6end2cnBwcXJ0dHJycnR0dXV4fX5/fnt3cW5pZ2doa21wb25ub29vb29ucHV8gH57enp6enp6fHx3b2xydnZ1dnd4eXl0dHZ5fX99eXd4eXp8fHt3dnx8eHBsa2tqaGZnaWtucGpqaWpsb3FycnN0dXNxbWhnZmdqbm5vcXJ2dnl8fHt7fHx7e3p6enp5eXh4eXl5eXl5eHh4eHh4enp6ent7e3t7e3t7enp5e3x8fHx8fHdxaGJfYmNjZGRjYWFiZm1xeH5+fn9/gICAgIKBgoODhISCgoSDgYCAfn9/f39/fn19fX17eXd3dHNwcnBubm9vcXN1dnVya2hoaWlpaWpqZF9bYWx1d3h3cW1ucXZ6foGEhoeJiYiIhYGDhIWGhYWCf3x6foWIgnlybWtqbG1tbHFzeH19eHh6enh4ent6dnRxcHBwc3V0cXFydHR1dnl/fn9+enVxbWpoaGlsbGpoamttbnBvbW9yd3x+fXx6enp6enx+e3RvbnR2c3R3d3h3dnFzd3x/fnx4d3l5e3x8eXR1fX15cW1qampnZ2doa3F2ampra2xvcXJyc3R1c3FrZmRjZWVnZ2doa2xtcHZ4ent9fXt7enp6enl5eXl5eXl5eHh4eHl5e3t6enp6e3t7e3t7e3t6enl7fHx8fH19eHJrZGNhX19gYGFhYWJmbHR6f39+f3+Af3x6eHd5fYCCgoB+fXt4d3RzcXFwcG9ubm5ubmxpampoZ2doaWpqbG9ydnh5d3JrZ2doaWtrcG9rYVZYZW91dndybm90e4GEhYaIiYuLi4mFfn2AhYaFhYWFgoODiIeAeHBta25wcnFwdHuAgH95eXl5eHh6e3t4dXJycnJzdHNxcXJ0dHV3en9/f316dW9saWdoamlnZGJlaGpsbW5wcnZ4en19fHx8e3t8fX16c25vdXd1dnh4eHd0cXN3fICAfHl5enl7e3t3cXN6fXlxbWxra2lnZ2hsdHloampsbnBycnJzdXh2dXBsaGVnZmZmZGRmZmdobHB2eXp7e3l5eXp6eXh4eHh4eHh4eHl5enp6enp6e3t7e3p6enp6ent7e3x8fHx8e3p5c25qZ2NfXF9eXl5hYmdsdXt/f4B/gH15cmtnZmhweH17eHVvbW1sa2hmZmZmZWRjY2RjYmNjZGNgYGBgYGJma3J2eXl3cmxnZmlqaGpxdHFnWllkb3V3dHFvbnJ2fYKChIeKi4uKh4SDfXqAhYWDg4ODgoSHhHx2cG1sbnN4e3x9fnt4dHV2dXd4eHt8endzcnJyc3NycXBwcHJydXl8foB/fXhzbWlmZ2lpZmRgYGNmam1vb3F2eHp7fX18fX18fH1+fXp0cHF1dXV3eHh5d3VxcnZ9f4B7eHp6e3t8eXJtcXp9d29tbG1ramhmZ212fWhqamxtb3BwcXJ0dnZ1cm9samppZ2dnZGRkZWRlZ2xwcnZ3eHl5eXl4eHh4eHh4eHh4eXl6enp6enp7e3t7enp6enp6e3t6e3x8fHx8e3p3c29rZ2JgX15bW11eY2dvd35+gH99eG5jXFxdYmhucm9saGRhYF9dXV1dXFxbWldXWFdZWlxdXl5dXV9fX2Jnam1ucHFwa2poZmZkZWdtc29kYWlydXd1cnBubnByeH6DhYeIiIiGgoOGgn6Ag4J/fH+AhYiCenZwbWxvdHyChYR8dG9oZmltdXd3enp6dnJxcXFycnFwb29wcnN3eHt+f397dnFsaGZmaGhlY11dYmVrbm5ydXV4en5/fXx9fXx8fX5+e3h0cnZ4dXd4eHl2c3Bxdn2BgHt4eXl7e3t4cWxxent1b21sbW1ramlnbHZ9aWtqbG5vcHBxcXN0dXZ1cnBwcG1ta2ppaGdlY2RlZmlscHJ1d3h3d3d3d3d3d3d3dnZ5eXp6ent7eHt7e3t6enp6enp6enp6ent8fH19e3l2c3Bua2hmY19cXVxeYmhtdHt+fXlwZV9ZWVteYmVoZWJeXFtYV1lYV1dWVlVTVFRSU1ZXV1hZVVhWWFtfYWRnZ2ZnaW1raWdkYl9gZGltcnBtcnd2dnRxcG9vb3J4fICBg4SEgoB/goiKg3p8gH59foGHh4J6c21sa293foSEg35zbGdpamx0dXl6e3dzcXBwcnNxcG9ubm5xc3V4e39/fXp1b2lnaGpra2djYWFiZmtucXF0dnd5fn99fH58e3x+f39/enVzdnZ2d3l5e3RubG51fIKAe3h5ent7eXZua3B5eHFvbm5ua2lmZWhsdXtpa2ttbm9wcHFxcnNzdHR0dXV2dXVzcnFubWtoZmRjY2ZqbnBydHZ2dXV1dXV1dXV2dnd3eXl5ent6e3t7e3p6enp6enp6enp7fH5+fX18e3l3dnRxbWlmY2BfXVxcXmJnbnFxbmVeW1tbXV9gX19dW1pZWFlbXF5gYGFhX15dXVxeYGFiY2FeXFtaWlpcX2JlaGlraWpnYmBjZWdnZGhxdnN3eHd3dXJwb25ub3J5fX6BgX57fH+Dio+Kgnp7fHh5gYiJg39+gIKBgH+BhIaGgXVsZWZqb21wc3l8eXVycnJzdHNva2tub3J0d3h7fn57dnFsaWdnaGpqaWVlZWltcXJzc3V2eHp+f318fnx7fH5/f397eHZ2d3d5enp4c21sbnV8gYF7eHl6e3t4cmppcHd2cW9ubm5vcG9sbHB0eWhqa21tbm5vcXFxcnJ0dXV1dXd3eHl3d3VycGtnZWNhYmNmZ2txc3R0dHN1dXV1dXV2d3d3d3d5enp6enp6e3t6enp6enp7e3x8fH1/f318end4d3ZzbGpnZGNgYl9cXF5kaWhkX19dXlxcXFxcXF5fYWFiZGVnbGxra2tpZ2VkYmRnZ2lqaWZkYV5dXVxaXF9gZGdpaGRgYmhtb2ldXGx1dnl5eHd2dHBubW5vc3l8fX5+fHp6gYiOkI2Ig4B9eX2Fi42MiouOjIuIhYSFhIWFfXRoZGVqbHB1fH15dHJzcnN2c3BtbG1vcXR2eXl5eHNycGxnZ2lrbGxraGpscHZ3dnV0dXd4e39+fX1+fHt8fn9/f357enl4eHl6eXhzbWxtdHyCgHp5enp6enhvZ2lwdHRvbm1ub3Bycm9tb3N2aWtrbW1ubm9xcXJ0c3V1dXR0d3d4eXh4eHh2cWxpZWNiYWBfYWhucXJyc3R0dHR0dXZ4eHh4d3l6enx8e3t7e3p6enp6ent7e3t8fX9/f318enh3c3JvbW5ubGllYFxbXl1cXF1fX19fXl5eXl5laG1ucHFxcnR1dXRycGxpaGdlZmdnaW1vbm5tamllZGJiYF9gYGFiY2Vrbm5vZ1xWZXR3eHh3dXRycnFvbGxye314dnyAf3x9hoyPkI2GgX5/gomNjIuJg3l0eH+ChYaHiImGf3Zwa2twdHZ6e3dzcnNyc3JvbWxsbXByc3V2dnRzcW5ta2tra2xtbW5ub3R3e3t4dHJ0dnl+f359fX58fH5+f4GBf317enh4eXp6eXNtbW50fIB+enl7e3p6d29naXJ2dHFycXByc3V4d3RxcnRqbGxubW5vcHFydHR2dnR0dHR3d3d3eHh4eHd3c29qZ2JgXlxgZGtvcHBycnJyc3Nzc3V1dXZ3eHh5e3x8enp7enp6enp5eXd3dnd8fH+AfXt5dnRzc29ubm5tamJeXFtdXlxbW1xdXl9fYGFkZ210d3l9fX5+fnt7eXVybmxpaGdnaGlrcHV1dnZ0cm5tamhnZGZkYWRobnFua2xvamVpb3J1eHd0cWxvbmhmZ3B6e3d0e35+e36GjI+PjYiEgoWKjY6JhYOAd3J2foOEh4iLjIyIhYJ/fHZydXp7d3NxcnNzcm9tbnFyeXh1cm9xcG5sa2toaWdqbG5vcXN2fH9+fHd1dXZ5e3+Afnx9fX1+f4CAgIB/f315enp7e3l5cm1sbXJ7gX96eXt7enp2cWdqcnV2dHNycXBzdXp7eHR0dGttbW9wcHBxcXJ0dHR0dHR0dHd3d3d4eHh4eHh3c3FtamZhXV1iaG5wcHFxcXFycnJyc3N0dXZ3d3h6e3p5ent6enp6endwaWlrcHV5fHx5dXNxcXBxcW1nZGJiYV9dXF1bW1xeXV5dYGFhZGdudXt/gYKCgoJ/fHl1cm9tamloaWlpbW91eXx9fHx6dnFtaWZkY2ZobnNyamdobnd7fnt1cHF0cm9ucG1tbG9zeX59e32DhIF/goaLjIyLi4mIioiJiYWEg3x2eX19enyEiYyNjY2MioiGgXp5e3p2c3Bubm5vb3R9hImJhHhvb3FwbmxqaWhpamtucHFzdXl7fHt4c29ydnl8gIGAfX99fX5/gICAgICAfXl5ent8fHlzbmtsc32Bf3t6e3t7e3VtZWpzd3Ryc3JxcHN1fX57d3V1bW9ub3BwcnJzc3V1dXV1dXZ2d3d3d3h4eHh4eHd2c3JwamNbWV5mb3BwcnJxcXBwcXFzc3J0dXZ2eHp7enp6enp6enl0bWRgYmRpbnJ2dXRycHFwbmxrZWBbWFpZV1hWWVlZXWNlZWVjY2VmZ2txd3p+f4CBgX56dXBta2tramhoaWltcnl9gIGAf315dW5oZGJpbnJzcmtoaGt8f4CAf353bGhnbXVycm9xdn6BgoOHiYyKh4KChYiJh4qLioeHhoiHhYeGf32AgHdyeYKHi4yOjoyMiYmFgXx+eXd0cWxqbW94gomLiYB4cG5vcHFwa2poZ2hpbG5wcHN1e35+e3VxcHJ2eXyAgoF9fX19fn+BgYGBgIB/enp8fXx8eHJvbG10foB+e3t7e3t7dGhkanJ1c3Jycm9vcXh9fXx5dnVucHBydHR0dHR0dXV1dXV1dnZ3d3d3eHh4eHh4d3Z1c3RuZFxaXmVtcHBwcHBwcnJycnJycXN0dXV3eHl4eHp6e3t6d3BoZWFeX2FkaW1ubGtsbWxsamhhWlVUVlZXVVRUWF1ka3BxcW1qZ2RiY2VpbHB1eHx8enZyb2xra2tramtsbnJ2e35/fn58endxbWdnbHN1dHNzbGhweX+EiH+BiX1ybnN6fXt2dXqAg4SHi4yOjYuKiIaJjI2LjY2Lh4OCg359hYiEgYJ6cG92foSJi42Ni4uJh4R+f355c3JxcXJ2fYWIhHx0b21ubm9wcXBtbGtpaWtsbnBxc3Z6enp3c3BwdHd6foCBf39/fn5+f4GBgYGAgH17fH1+fHx4cm9tbnR+gH57e3t7e3lwZ2RqcXNzcnJycXFxeHt7enh3dnFwcnJ0dHN0dHR3d3Z2dHR1dXV1d3d4eHh2d3d1c3R0cW1lXVhaY21wb29ucHBxcXFxcXFxcXJydHR1dnd3eHh5eHh0bWdjXmBgYWJlZWdnZ2ZnZ2VkX1tUUE9SVldaWVtgZWxyeHt7d25oZV9dXWBlaWpscHF0cXBubW1ra2tsbXBxdHl8fn9/fXl0cm9vbXR6f4B+e3t8d3mDhYWPjoyHfHJ2fYOFhYSDhIaIioqLi4iJiYiIiIuMjIyOj46Hg4aEe3mChoeEgXlzcXd+hIaKjIyJiYOBfXd7fXtzcHBxe4KJiYN3bW5tb29wcHJycnBubWpqbG1ub3Fzdnp7d3RxcXJ0eHyAgYB/f39/foCBgoKAgYGAfnx7e319e3Zzb25vdH1/fHl6e3t5dW5lYmp0dXJyc3NycnJ2enl5eXZ2cHN1dXV1dHV2dnd3dnZ2dnZ2dnd3d3h4eHZ2dnVzc3NwbGRcVVhiaW9vb3BwcG9vb29wcHBwcHBzdHR1d3d4eHt5d3RvaGNfYWFiZGRkY2NhX2BgXl1bV09NTFBSVFhdY2tyeX2AgoF9dGtkYV1eXV5hZWZnaWpsbm1tbWxsbW9xdHd5fX18e3l3dXFubXB1fYeOj4uHhISKioKLkI2Pk4l8dnuHjo6PjIyOjo2NjIyIhISEh4uJiouKio2Qj4iEhoR/gIWHhoB8dnR0eoGFiIqMi4iDeHBucXl9enRua3J/h4aAdW9ubW1sbW5ydHR0cnBta2psbW5wcnR3enl1cXFxcnR4fICBgH9/f39+gIGCgoGDgYB+fH19fX16dnNvbm90fX58e3t7e3l1a2JkbXNzcnJxcXJydXl5eHl5dnZwc3Z2dXZ2dnh4eHh4eHh4dnd2d3h3d3d4eHd3dnZ1dXFuaF9YWV1kam1tbm5ub29ubm9vcHBwcHFydHV1d3h4eHh4dXFuamhkY2JhYmRiX19dXl1aWFZVUE1KSE1VXWRud3+Cg4OEg392bGZkZGZlZF9eX2JkZmhrbG1ub29wcXR2eHp6end3c3FwcG5ucXqFjJCRj4yIi46NhYeNk5GKfnJ3g42Sko2NkpORj42NjIiFg4OIi4uKioiJjI6Lh4aEgYGFhoSAfHl4dnZ7gYiKioqKiIN3b2xyeX14bmhufoSCfHRubW1ubm9vcHJ1dnVycG9sbGxvcHFydHd8enZzcHBzdXh9gIGAgIGBfn2AgYKDgoKDgX57fX18fHl2c29tbnV9fXt6e318enRqZGdvdXNxcW9wcHJ2eXt6eXh4d3Z3dnZ3eHp6eXl4eHh4d3d3d3p6enh4eHh4d3d2dnV1c3BrZV5aXV9kaWxub29vb25ub29wcHBwcHFycnR2eHh4eHl3dHBubGtpZ2RhY2RkYmBfW1hWVVNRUE9PUV1ncXt/g4WFhYSEf3dtaGZqcHJvamdiYGFkZGRoa25zdXR1dXRzcnJycXFwcG5tbXB5gYaKj5OSj46Qk5KLiIuQko6Be4GIkJORjoyQk5KNi4uLiIaDgoaJioqKiYqJi4qJhICAhIiIhYSBf318eX2DiIqKioqIhH5xaGxqZl9gaHqEgn55c3Bubm5ub25wdHd5eHRxbm1ubm9wcXJ1eHt5dnNxcXN1eH2AgYCAgYGAf4CBgoOCgoOBfnt8fHx8eXZ1cW1udX19fHt8fHp5cmpmbHV1c3Fxb3BwcnV4eXp5eHZ3d3d4eHd3eXl6enl3d3d3eHp6enp6enl5eXh4eHd2dnZzcG1oYV5eXl9hZWhrbm9vbW1ubnBwcHBwcHJzdXZ3eXh5eHh2dHJvb25samhoaWRgXlxWVFRUVFVXWFpeaXR8gIGDg4ODg4J+eG9mZmpzdnVybm1lX15gYmdpbXFyc3Fxb25tb21sb25vcG9tcXuBhIeOk5WVlJaXlpKLiYiIhYKFiIyQlJKOjY+RkpOUko6NioiHiIuLjI2MiomIh4aBf4KIjI2Mi4qJiYWAg4eHiIqIh4eEf3t0ZV1aX2l0fH14eXVxcHJyb21sbXJ2eXl3dHFubm5ub3Bwcnh8fXt4d3R0dHZ5foCCgIGBgYCAgIKBgYGDg4F9e3t7fHx5d3RybXF3fX59fH59fHh0bGhyeXdxcHBwcHFxc3h4eXp6eXl3d3h4eXl5eXp6eXd3d3p7enp6enp6eXl5eHh4d3Z3d3V0cmtnY2JiYWFgYWdqbG5tbW5ubm5vb29vcXJzdXZ3d3h6enh2dnRycG5taWdjYl9dW1hXWVtcX2FlaXB4foGBgoODg4OCg4F6c2tmaG92fHp1c29rZ2hpaWloamxpaGhnaGtubWxsbnBycXJ4e3+Dho6Vl5mbnJyal5CJhIB9f4eMkZeamJKPjZKXnJ+fnJiUjoqHh4qLi4qIhoaEg4OGiYyOkI+NiouLi4yLiYaFhYSFhYN/fXxybnV/g354dnR3dnRzdXZzbWxtcnd6e3l0cW5ubm5wcXN0d3t8enh3dXV2eHp/goF/gIGBgICAgoODgYODgX17fX19fHp3dXJwdHp9fn18e319eXRsa3Z5dnBwcHBwcXFxcnV5enp6enh4eHh5eXp6enp5eXl5eXl4eHh4enl5eXl6eXh5d3d1d3d1cW1paWVhYF9fYmNmam1vbm5ubm5ubm5xcXJ0dXd4ent7enh4dHBtbGhmY15cW1lcXl9iY2ZpbnR5fH1/gIGBgoKCgoKCgXx0bmZmanF3fHt3cG1wc3FrbGppaWpqam9vcG9uamlwdHZ4enyBg4OGjpWanJycnZiVkImDgYCEiI6UmqCgnJSSlJaZmZqZl5WWkIqFg4KFiIWDgoSAgIaMjo6NiomKiYmKi4yJhoOAgIKEhH57fHdyfIaHf3Z0d359eHJwc3FtbG5zeHt7d3Rxbm1tb3Fxc3N2d3d2dXV1d3V3fIGCgX+AgYCAgIGCg4ODg4N/fHt8fX58enZ1cnB1e31+fXx9fn17cm9zfHx0cHBwb29wcHBxdnp6enp6eXl6ent7fHx7e3t7eXl5eXp6enp6eXp6ent6eXl3d3V4eHl4dHFuamdkYV9dXmJnbG1ubm9vcHBwcHBwcnR1d3d5enl0cW5qZ2VhXVtbWVpbXmFjZ2tucnV7f4F/foCAgYGCgoKCgoKBfXdwaGVlanB3dXh6e3+AfndzcnBta2loZmZobG1qaGhwd3t9gIKCg4SKkpudnZ6dmJKLi4uJiImLkJidnp2em5iVko6PkpGQkJCPi4V/d3V+gIODgoOEio6NioaEhIiKioiJi4qGgn5+foJ/fX6AfXl4fHx6d3R7g4aAdXFycW5ub3F1eHl2dHFubWxtbW1ra25vbmxtbW9wdXd7gIKBf4CBgICAgYKDg4ODg398e35+fnx5d3Z0c3l9f359fX9/f3t0cHh+e3NvcHBxcXJycXN2enp6fHx6enl5enp7e3t5enp6enl6enl4e3t7e3t6ent7eXl4eHd3eHh3d3ZybmpmYmBfX2Jna21vbm9wcG9wcnR0dXd2c3NxbmtmZGBbWVdYW11eYGJlaGxxdXh7foCBgYGBgICCgoGBgYGBgYB/eXNrZWdqa3FzeoKFh4eJiIaFgn56c2xkZGRfXWJqbG5ucnZ7f4GBfH6MmZ2enp6YkIyMj46NjY2RmJ2dmJiYmZmVkI6Pj46NjY6KhYB2b2xvdn+Fh4qPjIaEhIWDgYCAgoOGhYR/f36AgYKBgYB9eXh1en+BfICDhoB4dHJycHBxcnZ6eXRwbm1tbWpra2tubW1vbm9vb3J0dXl7enx+gYKCgIGCgoODg4OCgICAgIB/fXp6eXZ2e4CAfn5+foB/fHd2foF6cnBwcHBxc3R0dXt8e3t7e3p6e3t8fHx8fHp7e3p6ent7enl7e3t7e3t7enp6enp5enp5eXl5d3V0cW5qZGBeX2NnbG1ub29vb3BxcnN0dHNsaWRhXlpZV1dXWVpeY2hqbXB1ent9f4CBgYGBgYGAgICAgYGBgYGBgH98dXBpZmtvc3V6gYSJi4uLiomLi4iFgn16c2pmZ2praGhpamtyenx0dYOUm56enJqTj46QkI+NjpKXnJyalZicnpqVkIyKiIeJioiGg4CAend8hoqOkImBfHt+f398fHx+gYOEhIKAf4GCgoSGhICAfXx9gYGAfnx7fHl2c3NycnN1eHp6dXJsa2pqamtsbW5tbGxsa21tbWxuc3V3eHqAgoOBg4KChISEhIOBgICAgIB/e3t6enl+gYF+fn9/gH95dXh/gnx0cXBwcXJ1dXp+f316ent7eXl7e3t7e3t6ent7e3t6enx8e3t6enp6fHx7e3x7e3t6enp6e3t7e3h2dHFsZmFfX2NpbG1ub3BvcXNzdXRvamReWlhXVlZYW15fYmhucnV5e36AgoKBgYKCgoKBgYGBgYGBgYGBgYGBgXx5cm9ydX2BgHx6gouRj4uIi4yMi4uNjo2LgnJpb21hXGFobHF5eHFte5CanZ2cmpCUkpGQjY6OkJSZmpmYl5qamJWRjImGhoiJiYiGhomKi4uLjY6OioJ7eHp9fn5/gYGEhYWFg4GEhoWDg4SDhIaFgH5+fXx5eXl5enp3dHRzdHh9fnlzb21ubmtra2xucHJycG9ubGtpamppam9yd3yAgoGCg4SEhISEhIKBgIGBgH56e3t7en6BgICAgYGAf3hzd4CDe3FwcXJzc3R3fIB/fHl7e3t8fHt7e3t7e3p6enp6enx8fH18fHx8fHx8fHt7e3t8fHt7e3t7e3t7fHp4dnFrZGFfXmBjZWZnaGxvcHBvbGhiXVtbXF5eXmNna29ydXl7fn+BgoKCgoKCgoKCgoGBgYGBgYGBgYGBgYGBf3t3d36DhoeFhISJjpOQi4iKiouLioqNj5KSh3d0dGpgXWBpc3x9dW50ipicm5mXj5SYl5eUkpCSlpmZlpOSlZWUkY6KiIeHh4iIiIiHi4yMi4yOjoqFg395eXt7en2Bg4WGiIiHhoaEg4KDgoOFhIB7eXl6eXt9fHp3eHZ3dXV1eHx6c3BvbGpqa2tucnR2d3l5eXl2dHNzc29ramxudHp+gYKDhIWFhYWEg4KBgoJ/fHt8fn1/g4KBgICBgYF9dG92foB5dHNyc3R1dXh9gH58e3x8fHt7e3t8fHx8e3t7e3p6e3t8fHx8e319fXx8fX18fHx8e3t8fHx8enp8fHt6dG9rZ2RgX15eX2BgZGdpaGVjX11aW11gYmdpbXJ2eXt+f4GBgoKCgoKCgYGCgoKCgYGAgIKCgoKBgYGBgH9+enyAgoKGh4eGh4yQko+KhoWGiImKjY+RkpKLfHd3e3NsZmd1f4F4cHSJlZmbm5aPlJqampqZlpWWl5WTkY+QkpCNi4qIiIeHh4mKiYmMjo6OioeFgoB8enp6eHh6fYCDg4SFh4iLh4KBgYB/gIJ/enl5e3p7fX59e3h5eHd2c3RzdHRxb2tsbG9xb3Bydnp9fn9+fXt5eXl7enRuaWhrcXt/goODhoaGh4SDg4KDgoJ9e3x+gIKFgoCAf4CBgHpxbnR9fXl2dXR0dnZ2en6Afnx7fHx9e3t8fHt7fHx7e3t7enp7e3x8fHx7fX19fX19fXx8fHx7e3x8fHx8fHx8fHt5dHBsaGVgXl5cXFxeYWJgX19eX19iZmpvdHh8fH6AgICCgYGCgoKCgoKCgoKCgoKBgYKCgoKCgoGBgYGAf31+hISDhYeHhoaGiY6PjomEgYGCg4iOkpWWlYyBe3yDhYR9dnqBgXhubn+Nl5qbmJOVmpqZmZmWlJOTkpGOjIyNjIuLi4qJhYWFiYuKiYiKjIuJiIiIhH55e3l1c3V5fn99eXh7hImKh4WDgX+Bgnt6eXt6e3x+f3x6eXh4eHVyb25wcG9vcnN0dHRzdHh8f4CBgYCAf39/f4KCgn53bmhocHqBg4SGiIeHhYSFg4KCgH5+f4CBhISCgIF/gIKAem9rcnx8d3VzdXV2dnZ6foB+fHt8fX97e3x8fHx8fHt7e3t7e3x8fHx7e3t7fX1+fn19fHx8fHx8fX19fXx8fHx6enl4d3NuamVhXV1dW1xcXmBfX2BiZ2xzd3l8fYB/gIGBgYGCgoKCgoKBgoKCgoKCgoKCgoKCgYKCgYGBgYF9gIWFhIOGh4iHhoaFio6OioaAfH19f4uTmJeWkIN/gIOJjYqEgYSBd2hmc4aUmpuZmpeampqZlJKRjo2Mjo6KiYqLi4yMjImFhYaLjYuKiIeJi4uLiomIf3l6e3d1dHZ5fH16eHd/h42MioaAgIJ9d3p7eXp7fICAfHl6eHd0cW5sa25vcXFydXV1dnd4en2AgICAgoGAgYGBg4SEhYJ8cmpocHyChYaHiIeHhoWFg4KBgYGCgoOFhIGBgYGBgX96cW53fnx4dXV2dnd2d3l+f358fn5+fnt7fHx7e3t7e3t7e3t7fHx8fHx8fX19fX19fX18fHx8fHx9fX19fHx8fHx8fHt5d3ZycG1rZ2JhXl5gYmVmam5yeHp8foCAf4CAf4CBgYKCgoKCgoGCgoKCgoKCgoKCgoKBgoKBgYGBf4GJjIWEhIaHh4eIhoSGiY2KhoJ8e3x8gI6XmZmVi4SCg4aLjouFhod+dG10hZGXmpeZmZqampmVko6Li4qKiomJh4eIioyMioaGh42PjYyKiYqMj4yNjIuIhIF8eXl6eXp8fnx7e4CGiomIhoSGh4N9eXd3eHp9f356dXFxb25ramptcHJycnN2eHh5eXp7f4CAgICCgYGCgoKEhYWGhYN7cGZocn6Eh4iIh4eGhYWEg4KCg4SEhYWEgYGCgoGCgXx1dXt/fXh3d3d3eXd3eX5/fHl3dXNxe3t7e3p6enp5eXp8enp7e3t7fX19fX5+fXx9fX19fX18fH19e3t8fHx8fHx8fHt7fHx5d3NwbmllZGVoa25ydn5+gICAf39/f3+BgYCAgoKCgoKCgoKDg4KCgoKDg4ODg4KCgoGBgoKDh4uJhISHiImJiYiGhoaGiImIhH98e3t9ipabm5qYjISCgoaIhoeJhXx0b3SDjpaYmZmam5ubm5mUkIyJiYmJioiFhYaJjI2LioqLkpSSj46PkZKQjYqKiYmIhYF8e3p5eXuBgoSGhoiKiYiGh4yMi4mFfXZ1dnd7enZzcXBtbW5vcnV1dHV3eHl8fH19fX1+gIGBgYKDg4OEhYWHh4eHiIV6a2RpdYKGh4mIh4eGh4WFg4OChYaHhoODg4ODg4OBfnp7gYR/end2dXh4dnd7gIB7cmppaWl7e3t7enp6enl5ent9fXx8fX19fX19fn59fH19fX19fXx8fX16enx8fHx8fHx8e3t8fHt6eHp4dnNycXN2eHt9f3+AgH9+fn5/f4GBgYGCgoKCgoKCgoODgoKDg4ODg4ODg4OCgYGBgYGHiYyOjYqLjIqIiIiIiIiGhYeGg356en6LlJmcnJuRh4KCg4aGiYqHfXBrb32MlZeYmJqcnZ2dmpaRjYyLi4qJh4ODhYmMjIuLjI+UlpWTkpSUk46LiYiIiYiGg352c3J1e4KHh4WEhIWGhYSEhoeJi4qKhH96eHNycXFzcnFzdXZ3d3h7enp6e319fX19fX6AgYGBgoOEhYaHiIeHh4eIiIN1aGVqeISJiYiIh4eGhoaEhIWHiImHhYODg4ODg4KAgISGhX99enh3e3t5eHl7c2tnamxqanx8e3t6enl5eXl6enx8fX18fH5+f39+fn19fX18fHx8fHx8fHp6e3t6enx8e3x9fX19fHx6fH5+fHp7fH1/fn+AgICAgIB/f39/gIB/f4GBgoKCgoKCg4ODg4ODg4ODg4OEhIODg4GAgYiMlJCNiouMi4uMjIuKiYeFhYeGgXt7h4+UlpmbnJqRiISFhoiJi4h8b21yfo2YmZiYmZyen56clpKQkY+LiYqLiIiJiIqKioyQk5SWlZaXl5aTjouJiIeHhYWFgXZsaWt1gIeKhoODhIOBf3x5e4CGh4qMiYZ/c3FycnR1dHd5eXp6fX99fHx9f39+foCAf4GAgICBhIaIiImJiomJiYeGhX5wZWVxgIWHiIiIiIiIhoWFhoiKioeFhISEhISEhIODhYiDgH17e319fHp4dm9qbG1rbGxvenp6ent7enp6enp6enp7e3t7fn5/f35+fX19fXx8fHx8fHt7eXl5eHp6e3t6en19fn59fX1+f39/f35/gICBgoKCgICAgH9/f39/f39/gYGCgoKCgoKDg4ODg4ODg4ODg4SEg4ODgoGFi4+OjYqJiouLjZGQj5GSi4eEhYiIhYaMkpOUlZaZnJuRiIeHioyNiHxzcXN5ipibmZeXmpycnJiUk5KVlZSSkpGRkI2MjYuKjI+Rk5WWl5iXlZOPi4iHhYWEhIaEgHRnYmVobnaAg4SDgX96enp2dnyDhoaIiIZ9end5ent8fXx7e3t9fn18fX5/f35+fn5/gYCAgYOFh4qKi4uKiYmJiIeHhXttZWdxfoaIiYmJiYmHhoaHiYqLh4WEhISEhISDg4SIiYR+fH19f39+enRsaW5ycnBxcnV5eXl5eXl5eXp6enp5eXp7fH1+foCAfn59fX19fX18fH19e3t8fHp6enp6enl6fHx9fX1+f3+AgIGBgICBgYGBgYF/f39+fn5/f35+f3+AgIGBgoKCgoODg4OEhIODgoKEhISCg4ODho2QjYqLiouKioqKjo+Tl5aTi4WEiIyLjY+SlZSTk5SXm5iPiIeKjY6JfHZ5fYCIlpyYl5eZmpqZlJSUmJmamZeXlJOTk5OSkY+OjpCSlZaWlJSUk4+LhoSDgYOEh4iGeGhobmtobnZ+goOAfnp4eHh5e3+CgYKDhIR9e3p+fHx8e3t8fH1+fXx8foCAf3+AgICAgYGChIeKi4uLiYmJioqKiIiKgHBnZGlzgoiJiomIiYeFhoeKjIqGhISEhISEhIOFh4iIg39/f3+Bgn10a2xucHJ0dXd4e3h4eHh5eXl5enp6enp6ent8fX19fn5+fn19fX19fXx8fHx7e3t7enp6enp6eXp8fH19fX6AgIGBgoKCgoKCgoKBgX9/fX19fH19fn5/f4CAgoKCgoODg4ODg4ODg4OEhISEhIKDg4OJkY+Kh4uKhoOIgoCGkJebmpSQiIKHjZKSj5OVlJOTlJeampSOiouLjIiAdHB2f4iTnJqXmpycm5qYl5mVlZ6fnZ2ZlZSUlJSVlJKTlJSTk5STkpKSkIyKhoOChIaIiIR5cXJ1c29ucnuAf3x7eXV1d3d1dHRycnZ8foF+fHx9fH18fHx8fX59fH1/gICAgICAf35/gYKEiIyNjYyLioqKioqIh4iFeWpjZW56hImKiomJh4WGiIyMioaEhISEhISEhISIi4qEgICAgX97cGttb3N2eXt8fn+AeHh4eHh4eXl5eXp6e3t8fH19fn59fn9/fn59fXx8fHx8fHt7enp7eXp6enp7fHt7fHx8fYCBgYGCgoKCgoKCgYF/fnx7e3x7e3t8fH6AgICCgoKCg4ODg4ODhYWDg4ODhISEhIODhYuRjoqGjIqKiYiCfoSQmJmZlZGKgYKLkpGPkJKVlJWXmJubmJGMioyMiIN6dG5ye4uanpycn5+fnpqYl5CfoKGgnZiVk5KSlJWWl5WVlJOTlJSTk5KQj42Jh4aGiImJh4F7fHt3c3F0fIOEgHx4d3NucXZ2dHBtcXh/gYF9fH19fH19fHt9fX19f4CAgICAgH9/f4CAgoWJjI2NjYuKioqKiYmJiod/cGdjaniCiYqLiomGhYaJjIyKhoSEhIWFhYOEhImMiYWAgIJ/dmxqbHBzdnp9fn9/gIB4eHh4eHh5eXl5enp7e3x8fX5+fn1+f39+fn19fHx8fHx8e3t8fHt5enp6ent8fHx8fHx9foCBgYKCgoKCgoKBf35+fHx8e3p7e3x8foCAgIKCgoKDg4ODg4ODg4ODg4OEhISEg4OFi5COjIyOjIqJiYWBg4yUlpWTkYuCgYmSkYuNkJOVlpeYmpqYk46NjIyKhoGAe3R0f5GcoqKenZ6cmJaXlJqdn5yZlpKQkZKVlpeYl5aWlpaXlpSRjo+PjYyKiImKi4uKhoOAe3t7foKDgX17e3dybGtuc3V1c3FxdHuBhIN6eHh6fHx8e319fX1/gICAgIB/fX19fn+BhYmLjY2Ni4qKioqJiYmKioR6bmlreIOIi4uKiYaFhomMjIqGhISEhYWFg4WHiouJhYKCgHdsa21vc3d7fn5/gICBgXd3d3d3d3h4eXl6enp6e3x+fn5+f39+fn99fX19fXx8fXt6eXp6enp7e3p6enp6e3x8fX5+f4GBgYGBgYGAgH9/fn17e3t7e3t8fX1+fn+Af4GBgoODg4ODg4ODg4ODg4SEhIOCgoWMko+Oj4+Pjo2Ni4WDiI+TkpCQjYWCiI6Oi4yOkJWVl5eXmJiVkZCOjYuKh4B8eXl+iZWbn56enZqYmJiWmJuamZWUlJSVlpWVlZWWlZeYmpuamJKOjY6Ojo2NjpCRkY+Lh4OBgoOEhYOAgIB/fHFlYW1wc3Z4eXd1dnyEh4N6eHl6fHx6e3uBgYCAgH9/f358e3x8f4GEiI2Pj42LjIyLi4qKioqKiYR5cG52gYiMi4qJhoSHiY6MiYaEhYWGhoaFhYeJi4iFg4F4bmxucHJ2eoF/gYGBgYCAd3d3d3d3eHh5eXp6enp6e3x8fn5/fn9/f319fX19fHx9e3p5enp6enp6enp6enp7fHx9foCBgYGBgYGBgYCAf39+fXt7e3p6e3x9fX5+f4CBgoGCg4ODg4ODg4ODg4ODhISEg4KCho6SkJGRkZGRkJCOiIOFjI+Qj4+NiIaIi4qJi4yPk5aXmJiYmZWSkZGPjIyIgX1/goGEi5OYmJiZl5WVlpWUlZeWlZWWlpaWmJiWlpWVmJialZialJCPj46Ojo+RlJWUkY2KhYSFh4aEgH+AgH55cWJPVmlvdHd2dXNxdoCHh4OBhYeHhIB+e3p8e319fHx6enh3eHt9gISIjo+PjYuMjIuLioqKioqJh4B2cHR/iIyLiomGhIeLjoyJhoSFhYeHh4aFhomKiYWAeW1rcHJ1eXyBgoGBgYGBgoJ4eHd3eHh5eHl5enp6ent7fHx9fX59fn5+fn19fX19fXx8e3t7eXl3d3d4eXp6ent8fH5/f4CAgYGCgYGBgIGAfn19e3p6e3t6e3x9fX9/gIGBgoKCgoODg4ODg4ODg4ODg4ODgoGFjpOSk5GRkZSTko+LhYSKjI+PkI2Jh4mKiomJi4yPlJeZmZmYl5SSkI+NjIiBfYGFg4OGjZGUlZaWk5OTk5WVlZWUlZaYmZuZmZeXl5aYmpucnZyYlZOSj46OkZSXl5aUkI6Li4mJh4OAgIB/fHlsVTczV2hwdHZ3d3N0fIaJiYmJiIqLi4eCfHp6e3p3dXR0dXR1d3yAhoqOj42NjYyMi4qKioqKioqJgXdwdH6IjIyLiYaEiIuNi4mFhoWGhoaHhYaIi4yKhXtubHBzdXl+hIWDg4ODg4KCg3h4eHh4eHl4eXl6enp6e3t7e319fn1+fn5+fX19fX19fHx7e3x7enh4eHh5enp6e3t7fn9/gICBgIGBgYGAgH9/fn17enp7e3p7fH19f3+AgYGCgoKCg4OCgoKCgoKCgoKCgoKCgYWOlpWUlJOTlJSSkI6IhIeLjo+Ni4iJioqKioqLjI6RlZeZmZeXko+PkI6Ni4aCgoOEg4aJjZCSk5KQkZGTlpaXlZWVlpicm52em5ycmZqam5ybmZmWlpWSkZKUlpiXlpaTj4yLioqNj46JhIJ9dWNDLC9Wa25ucnd5dXB2gIJ9eHt+f4GBg4OGgn9/gH16eXZ1dHV4foSLjpGPjY2NjIyLioqKioqKiomBd3N2gYmNjIuJhoaJjY2KiIWGhoeIiIeFhomMi4h+c21xdHV6gIOGhIODg4ODgoN/eHh6enl5eHh4eXl6e3t9fX19fX1+fn5+fn59fX5+fX19fXx6enp7eXh4d3d5eXp6e3t9fn+AgICAgIGBgX9/f359fXx7e3t6e3t8fX5+gICAgYKCgoKCgoGDg4OCgoKCgoKCgoGBhI6Wl5eXlZWWlpSRjoiEhoqMjo2KioiJi4uLi4uMjo+Rk5aYmZWQjI6Pj46LiYSCgoSFhoaLjpGQj4+QkpWXl5WVlJaYm5mboZ2emJ+QkZeZmpmZl5eVlZWVl5iXmJiXlpORjYuJiImLkJGMhoB0YUo8RmBxcm5vcnZ1c3V6fXp0dnh7foCAgYOCgoGAfn17dnRzdnqAhoqOkI+NjY2Mi4uKi4uLi4yLiYB1c3eBiIuMi4mGhoqOjoqIhoaHiImJh4WGio2MgXNtcXR2eX+IiYiEg4OEhISCfnN4eHh4eHh4eHl5enp6enx8fX19fX5+fn5+fn19fn59fX19fHp6enl4eHh5eXl5eXl7e3x9fX+AgICAgICAf39+fn19fHt7e3p6e3x9fn6AgICBgoKCgoKCgYOCgoKCgoGCgoKCgYGEi5aYl5iVlJaVlJGOiYWFiYuKiYmJiImJiYuLi4yNjpCQk5aXlJCMjY+Qj4yMhn9/fn5/hIiRkpKQkJCTlpiZlpSUlpmbnp6NhomPmIqPmJ2bmpmZmZWVlpeampmYmJiYlJCNi4mJhoSFhoWBfXVsW0pOZ3d5dXFvdHZ1dHd9gX97eX2AgICAgYCAf359fXl3dnZ3e4GGi4+Qj42NjYyLi4qLi4uLjIuJgHV0eIOKjIyLiIWGio6OioiIiIeIiYmIhoaKjIh4cHF2dniAiYuMioWDg4SEhIJ4bXh4eHh3d3p6enp6e3x8e3x8fH19fX19fX5+fn5+fn19fHx8fHt6eXl5eXl5eXl6ent7fH19f36AgICAgIB/fn59fH18fXt6ent7fH19fX6AgICCgoKCg4ODg4ODgYGBgYKCgoKAgIGFk5iXl5aUlpWTj4yJhYWIjIuHiIiJioqKi4uJioyNjo+RkpSUj46PkZCPjo2Hfnh2d3h9ho+WlpKQkZGWmpqXk5SXmZmdkImMkpOSmp6fnp+dnZuamJeWl5qbm5qampiSjYqKiYiHhIOCf3t0a2FWT1x2gH97dnBwdXd0eH6Dgn5+f4B/gICBgICAfn58eXd2dnp+goeMj5CQjo2NjIyMiouLi4uLjIh/d3Z7hIqNjouJhoeLjo2KiIiIh4mJiYmHiIuJfXBydXZ4foaKjIyIhIODhISDf3JpeHh4eHl5enp6e3p8fHx7fHx8fX19fX9/fn5+fn5+fX18fHx8e3p5eXh4eXl5eXp6e3t8fX1/foCAgICAf39/fn18fXx9e3t7e3t8fH19foCBgYKCgoKBgYGBgYGBgYGBgoKCgoJ+eniDkpeYl5aVlJKOi4eGiYyQkYqHh4eIiYmKioiJiouNjo6Pj5GOjI+RkZGPjoyGfnl4eHmBjpeXlZSSk5WYmpaRk5WZmpuPiZGXl5yalJSZnp6eoJ6amZiXmpucm5ubmpOQi4qIiIaDgX97d3JtZ2Fga3uAfHt3cGlyeXd4fYSFgYCAgIGDg4GBgH9/fnt5d3Z2en6CiI2Qk5GPjY2MjIyKi4uLi4uMiH92dXyFi4+Oi4mGiIyOjYqIiIiHiYmJh4WHh39wcXV2d36Fio2OjIiEhISEhIJ5bmp4eHh4eXp6ent7e3t8fHx8fHx+fn5+fn5+fn19fXx7fH19fX18fHt8fHx8enp6e3t7e35+fX1+foCAgIB/f35+e3t9fXx8e3t8fH19fn+AgYKCgoKCgYGBgYCAgIGBgYGCgoKBfndvbXyLlJWUlJWUko2Lio2PkJCOjYmFhISHiImJiImKiouNjpCPkI6OkJKSkZCQj4yGg4GAgIaQmJiYl5eVlJWXl5WXmZeRm5eSmJ2eoJyfn52dmp6YoJyYmJmdn5+dnpyXk4+KiImIh4SCf3p1cnFyb29yd3l1dXVvZ2pzeHl8goJ/f3+BgYKCgoKCgn5+f3t5eXl9gYWJjJCSkpCOjY2Ni4uMjI2NjIuGfXZ2foaNjo2MiYaJjY6MioiIiImJiomIh4eAc25ydnl+iIuMjZGLiIWEhoaFfXBpa3h4eHh5enp6e3t7e3x8fHx8fHt7fn5+fn5+f39+fH1+fn5+fXx8e3x9fXx6enp7e3t7fHx8fHx8fn5+fn9/fn5+fn19fHx9fXx8fX1+f4CBgoKCgoGBgYGAgYCAgYGBgYGBgH94bmRneYeNjpCRk5WVjomMkpORj4+Oi4Z/en5/hYeIiYqKiYyPj4+OjY+QkpKRkpGRkI+NjY2QkZOWmJmYmJaVlZeZmJeZnJmSm5uenqGgop+hn52doZCcn5uam6GfoJmcnJiTj4qHiIiHhoSBfnt6e3p4cWxsbWtuc3RtaGtwd3+FhYKAgIGBgoKCgoKCgH57eXp6e3+ChYmMkJKSkI+NjY2Li4yMjY2Mi4V9d3mAiI2OjYyJiIqNjoyKiImJiYmKiYiGgHhwcnR2fYeMjIuKiIOAgIB/fXpzaGdqeXl4eXl6enp7e3t7fHx8fH19fX1+fn5+f39+fn19fn5+fn5+fHx7e319e3t6enx8fX19fX19fX18fX18fH1+fn19fX18fHx8fHx9fX9/gYGBgYGBgICBgH9/gICAgICAgH9+fHFkX2Z3fXt8gomPkpGNjJKUk5GPjo2MiIN/fHmAhIiJioqJiouNjYyOkJGRkZGSk5KRkpOboZ+ajoyVmpqYmpiXmJubmpmanZmXoKCgn5+foJ6Ul6ChnaKfnJqcoqWlnpybl5KPiYeGhYWGhIODg4F/fXhuYmFma25xcnBqZmp1g4iGgoGBgYKCgoKCgoKBf318e3x+gYSHioyPk5KRj42NjIyMjIyNjY2Jgnt4eoCIjI2NjImIio6PjIuKioqKiomJiIJ2cnR1dnmBhYOCfnt2cW5vb29tbGZlZmx6enl6e3x8fH19fX18fHx8fX19fX19fn5/f39/f39/f39/f39+fn19fHx9fXx8fHx7e3x8fHx8fHt8fHt6fH19fX19fXx8fHx9fX5+gIB/f4GBgYGAgH9/f39+fn9/gICAfnpzaGJgZWhqa256hJGSjouLkJSUko+Ni42LiISCf29yeoKHiYqJi42MjI6QkZGRkZOUk5GRkZWdqKaRio2bpqeim5iYm5uamJianJuhoaCUkJugoZ2an5ugn56dm56ho6KgnpuXkYyJiIeFhISCgoGAfn15dHFuaWNiZ2xvcm5oZW58gX9/gICBgoKCgoKCgoF/fn19f4CChYeKjI+Tk5GPjY2MjIyMjI2NjImBenh9g4qOj42MiYmMjo+Mi4qKiouLi4qEd3F0dnV0dnNwbmppaGhmZ2hoaGdmZWNlaHp6eXp7fH19fHx9fXx8fHx9fX19fX1/f39/gYGAgICAgICAgH9/f359fX5+fX18fHx8e3t7e3p6e3t7e3x8fX19fX19fX18fn9/gICAgICAgICAgIF/fn59fn5+f39/f3x7dm1mYWJkZWhpbnuIkpKMiY6RlJeUkI6LjIyIhIOCdGpsd4GGiYqMjIuLj5KTk5OTk5WVkpKRk5mhpJKLnK2uqaWdl5eanJybmpudnp+gnZianJycmJianJ+dn5+cnKCjoZ6cm5eRjYiHhoaEg4KBgH9+e3Z1eHx5bGFeYmpvb2pma3V5ent+f4CCgoKDg4ODgYB/f4CBgoOFh4qMkJSTkY6NjYyMjIyMjY2Mhn55en6Fi5CPjIuJio2Pjo2LiouLjIyLh31zdHZzb25pZWNjZGVoaWxub3BvbmtoaGZmenp5ent8fX19fX19fHx8fH19fX19fX9/f39/f4CAgICAgICAf39/fn19fn59fX19fX19fXt7e3t7e3x8fHx9fX19fX19fXx+f3+AgICAgICAgICAf35+fn1+fn5/f39/fHVrZWVoZmVlZmdvfImRjouLkJKUl5aUko6NjYqIhoN9dHJ2fIKJiouMjY6Qk5SUlZSTlJSUkpKSlZuhmaKrp6KgnpqZmJudnJycnJ2cnZiXop+bmZqcm5mcnJuZm5uZnJ6em5iVko6LiYeGhoSDhIB+fHp2eHt/gH95bmNeYGhta2dteX+BgIB/gIKCgoODg4OBgH9/gIGCg4aJioyQlJORjo2NjIyMjIyNjYuFfnl7gIeNkI+Mi4qLjo+OjYuKjIyMjImAdHNybGlnZGVkZWhsb3V5fX6AgHhxbG1sbm57e3t7e319fX5+fX19fX19fHx8fn5+fn5+fn1+gIB/f4CAgICAgIB+f39+fn5+fn5+fn17fHx8fHt7fHx8fH19fX19fX19fX1/f4CAgICAgICAgIB/f39/fn5+fn5+f354b2ZiZWhkZGVkZ3B7iY+MiYyRk5aYlpWUko+OjYqKh4F7dXR6g4uMjo2OkJKTlJaVlJOUlZSVk5OUl56oq6aem5ibm5mZnJ6enpydm5udlqOnpaGenp6cmpqZlpWZmJianJuZl5KOjIuJh4aFhIODgH15eXl8f4F/f313a2JdYmxtbG10e3+CgoKCgYODg4ODg4OBf39/gYOFh4mKjZGTk5OQjo2Mi4yMjI2NioJ8e3uBiI2Rj42Mi42Pj46NjIyMjIyMhHZubGhnZGdoa2tudHqDhYeDhYaCenJtb3F2eHt7e3t7fX19fn59fX19fn5+fnx+fn5+fn5+foCAgICAgICAgICAgH5/f35+fn5+fn5+fXt8fHx8e3t7e3t7fHx9fX19fX19fX9/gICAgICAgICAgH9/f39+fn5+fn58eHBmZWZmZ2dnY2NpcoCNjImLj5CUl5mXlpaWk5GRjo2KhoB2dHqEj5KRjo+RkpOUlpaVkZGRlJaUlJWWmaChnZiTlJeWlpeanZ2enZuam5ufpKShnpydnJuamZiVlZmZmJqdmpiUkIyLiYiGhYSDg4OCgH5+foCAgICBgH14cWVeZWxxcm9xdXyCg4KCg4ODg4SEg4GBgYGCg4WHiYqNj5KTk5COjYyLjIyMjY2IgXx7e4OJjpGPjYyLjo+Pjo2MjIyMi4Z4bmtpa2ttbXF2fISKj5CNiYaGhn5ybm50e4GFfHx7fXx9fX5/f319fX1+fn5+fn59fn5+fX5/gIGBgYGBgYGBgICBf35+fn5+fn19fX18enx8fHx8fHt7ent8fHx8fX18fX5+fX9/f39/gIB/f4CAgICAgH59fX19fXlzaGRmZ2lra2liYmpzfoiHh4yPkZSXmJiYmZmXlZCPkIyJhXx5fISPk5GQkJGSk5OTlZSRj46QkpWWlpWTl5ial5KVlJSVlpqdnp+bmJWbm6KioZ6bl5eXmJqZmJeWmJmYmZiVlZOQi4mJiIaFhIOCgX58fH2AgoCBgYGAgH96cWNmam9vamVseIOCgH6Bg4SChISCgoCBgoKFhoaIi4yNkZKSkI6NjIuNjY2Ni4eAenp/hIqPkY+NjIuQkZCPjIyMjY2KfW1pZmhtcXJ2foaMkZKSkY2JiIeDeXFucnh+hIV6enp7fH19fn5+fX19fX5+fn5/f39/f39+gH+AgYGBgYGBgYGAgIF/gICAgICAf399fXx6e3t7e3p6enp8fHx8fHx8fHx9fn5/gIGBgYGAgH9/fn5+fn5+fn19fXx6c2hjY2ZpbG1rZ2JiaXR/hIWHj5KUlpiamZmampiWkI6Oi4qJgnt+ho2RkZCRkZKTk5KTk4+OjI6QkpWVk5KSlJiXlZSUlJWWmJudm5eVlZebnp2cm5mWlZWWl5eYmJaVlpaXlZWUkY2JiYiHhoWEg4KAfXt6e32AgIGBgYGBgoB/enVycXJvZ2p2g4aEgYKEhIOEhIKCgYGDg4WGh4mKi42RkpGPjo2Mi42NjYyJhX18e4CHi5CRj42Mi5CQj4+MjIyNi39wZmZoa3R5foWMj5GSkpKRjYmHhn50cHBze4KFh3t7fHx9fn1+fn5+fn5+fn5/f39/fn58fn9/gIGAgICAgYGBgYCAgICAgICAgIB/f39/fX19fXx6enp6enl5enp7e3t7fHx9fX5+fn5/f4CAgIB9fX18fHx9fX19e3VpY2FlaG1xcG5pYmNsdX+DhImTlZWWmZuampqZl5WRjo2LiYaDfn+FjZCQj4+QkpOQkI6LioqJi4yOkZSTk5KSlZWTk5OUlpiYmZiXlZKSk5Wam5qamZqXlpWXl5mYmJiYlpWUlZORjYmIiIaGhYSDgH58e3l7e3yAgoODg4OCgYB9fn17e3t1cnd9hIaDgH+AgoSEg4OCgoSEhoaGiIqLjpCSkI+OjIyMjI2NjIeBfHt8goiNj5GPjYyNkZCPjoyMjYyIdWhma25yeoWLkJGSk5OTkZGNiYiEeXFxc3mBhYiHfHx9fXt8fX5+fn5+fn59fX5+fn5+fn5+f3+AgYCAgICBgYGBgICAgICAgICAgH9/f399fX19fHp6ent7e3t7e3x8e3t7e3p8fn5+fn19fX1+fn9/f359fX19fXpyamRkY2VrcHNxbmdiY2lyfIGEiZSXlpeZm5qamZeVko+OjoyFfXp+f4KIjY+OjY6PkY6MioaCgIGChYeNj5CQkZGTk5OTlJeeoqCWk5SSkZOUl5eYmJeanpuYl5iZm5qbnZ2YlZOUk4+MiYiHhoaFgoF/fnx7ent7fICCg4ODg4KCgYCAgIGCgYOCfXh+hYF5d3iAhISEhIODhIWGhoaIiouNkJCQjo2MjIyMjY2LhYB8e3yCiI6RkY+OjZCQkI+OjIyNinpsZmlucnuHj5GRkpOTk5ORjoqHhX91cHJ0fIOHiYl9fX19fX1+fn5+fn59fXx8fX18fH5+f39/f4CBgYGBgYCAgYGAgICAgICAgICAgIB/fn59fXt7e3t5enp6ent7fHx8fHt7e3x+fn5+fn99fXx9gICAgH9/fXx6dGpkZGVlaW9zc3FsZmFlbHh/hIWJlZiXmZubm5uXlZOOjY2NjIh4bnV8gYaNjYuMjY2NjImHhIB+e3x/g4mKjI2PkJGSkZWXnaesppmUkZCRk5WXmJeXl5ibm5mZmpybm5yem5iVlJSSjYmHh4eFhYWDgn9+fHx7e3x9gIKDg4ODgYKCgYGBgoODh4eBeXyCf3p7fYOFhYSEg4OFhYaGh4mJi42PkI+OjY2NjIyNjIuEfn19gISKkJGRkZCQkpKQj42Mj4t+bWRma251hI+Tk5OUlJWVlJGMiIaFe3JucXiBiImJiX5+fn5+fn5+fn5+fn19fHx8fHx8fX1/fn9/f4CBgYGBgICBgYCAgICAgICAgICAgH9+fn18e3t7e3l6enp6e3t8fHx8e3t7fH19fX19fX19fX1+fn9/fX19e3VrZGNlZ2ltcXR0cGtoZ2lwfIWGhouVmJmbm5uamZiVko6Mi4qKinxnaXV8fH5/gIGFh4mKioeEgHx7fH+DhomKjI6PkJGUnKerrKmjm5WSkpGSlZaXlZWVlpmZmZmanJuam5ybmJSTkZCLiIeHh4WFhYOCf359fX19fX6AgoODg4OBgoKBgoKDhIeJiIWAgoJ+e3+BhIWFhISDg4WFhoaGiImLjY+Qj46NjY2MjI2MiYN/fn6BhYuQkZGRkJCSkpCPjY2LgHFqaWlscn+QkpOUlJSUlZWUkYyIh4B1b3F2e4SIiYqKf39/f35+fn5+fn5+fHx9fHx8fHx8fn9/f39/gICAgYGAgIGBgICAgIGBgYGAgICAfn59fH18e3t7ent7e3t6ent7e3t7e3x8enp8fH19fn5/f35+f39+fXx1bGNhZWhsbnF2d3NuamdobHN/iIiHjZaZmZycm5qYl5WTj42KiYmLgmxgbHZ2eHd4fH+DhoeGhoWCgH5/goKGiImLjY6QjpKdqKqlop6alY+PjY2Qk5WUkZGUmJmXmZudmpeYmJaVk5KPjYmHh4eIiIaEg4F/f35+fX1+f4GDg4ODg4GBgoGBgoSFh4iGhIKEgHl4e36ChISDg4ODhIaFhYaIiYqMj4+Ojo2NjYyMjYyIg39/gIKIjZCSkZGRkZGRj46MioV5a2prbHJ7i5KUlJOUlZWVlZOPioeGfHNwdHmAhoqKiox/f39/fn5+fn5+fn5+fn18fHx8fH5/gIB/f3+AgICAgICAgYGAgICAgYGBgYCAgICAf359fXx8fHt6e3t7e3p6e3t7e3t7fHx9fXx8fX19fn9/f35/f359d21kYGRoa25zdnh3cWxoZ2tze4SMiYaMlZiXmpybmpiXlpSPhoKFiIaCcWFjcHZ3d3h8f4KEhYSFhISEgoODg4SGiIqMjY+OkJOZnZycmZeTjomIiYuOkI+NjpCUlZaYm5qYlZSUkpCPjo2LiIeHhoeHhoSDgX9/f39/f3+AgYODg4ODgoKCgYGCgoSGhoWEg4N9dHN3fIGEhIODg4OEhoeHhoiJioyPj46OjY2Njo6NjIiDgYGBhImOkZGRkZGRkZGPjoyHe2xrbG1weIOOlJOTk5SVlZWVk4+JhoJ4cXJ2e4GHioqKjH9/f39+fn59fHx8e319fHx9fXx8fH1+fn9/f39/f39/f39/f4CAgICAgIGBgYGAgH9/fn59fH19e3t6fHx7enp6ent7e3x9fX19fX19fXx9fn59fX9+fXpzaGJiaGttc3l6fHdxbGlobnR7h46Mh4iPlZeZnZ2amJaVk5GJhoODgX52ZmBtdHd4en5/gYOFhIWEhISDg4ODg4OEhomKjY6PkJKUl5iXlJONiYOEhomMi4qKjJCUk5eYmZaTk5KPjYyMiomHh4iIhoaGhoSCgH9/f35+f4CCgoODhISDg4ODgYGDg4SEhYSEgXt0b3R6f4ODg4KEhIWGhoaHiYyMjI6Ojo6NjY2Njo6LhoSCgoSIjZCSkpKSkpKRj46OiYBxa29ubneBjZSUlJSVlZWVlZWSjYmFfHRydHd9hYqKioqKgIB/f35+fn19fX19fHx8fH19fHx8fX5+f39/f39/f39/f39/gICAgICAf39/f35+fX1+fn18fHx7e3p8e3p6ent7e3t7fHx8fX19fX19fH1+f4CAf397dGtjYWZpa3F3eXp5dG1paGxwd3uFjYuFh42SlZiZmpmWlZSUko2Kg4OBfnlrYG1+gH9/gYGBg4OFhYSEhIODg4ODg4SGh4mLjI2OjpCSlJOTkYyIg4KDhYiKi4mKi46PkpSVlJGQj4yKi4uJiIeHiIiHh4eHhIOBf3+Af39/gIKCg4ODg4ODg4ODg4ODg4SEg4OBfHRrY2h1gYODg4SEhYWGhomLjo6Mjo6Ojo2NjY2Oi4iFgoOEhouOkZKSkpKSkpGPj42GdmxrbnBzfIiRlZSUlJWVlZWVlZKNiIR4cXJ2eoCIiouLjIyAgH9/fn5+fn5+fHx7e3t7fHx8fHx8fHx9f39/f39/f39/f39+fn9/f39/f39/fn58fH5+fH18fHx8fHx6ent7e3t7e3x8e3t8fHx9fX19fX5/fn9+fnpwZ2JlaWxwd3t8fHl1bmlobnV4eoWOi4aFiI+SlZmYlZSTk5OSjouIhoOAfnFgaX+BgYCBgYKCg4OFhYODg4ODg4ODhYaHiIqKioqMjY+QkZGQjIaDgoKChImKiomJiouNj5CRkI2LiYmHiIiIh4eIiIeHh4eGhYOBgH9/gH+CgoODg4ODg4ODg4ODg4OCgoODg394c2xiW2d6gYODg4SFhoaGiYuMjo2NjI6Ojo2NjY2LhoKCg4aJjZGSkpKSkpGSkpGPin9wamtwdHqDjZOUlZSUlJSVlZaUk46IgnZxc3d9gomLi42NjYCAf39+fn5+fHx9fHt7e3t7e3x8fHx8fHx9fn5+fn5+f39/f35+fn5/f39/f39+fn5+fX18fX19fX18fHt7e3t8fHx8fHx7e3t7e3x9fX19fn5+f39+d2xiY2hqbnR5e317eXVxbW1ubWptfo6NhoWIi4+SlZSRkJCQkZGQjYmGhoWBd2Vle4SEg4ODhISEhIODhoaFhYSEg4ODhYaHiYmJiouLjY6Qj4yJhYOCgoGCg4aHiIiIh4mKi4qKiYeGhoeIiIiHh4iIiIiIiIeGhYOBgH9/gIKDg4ODg4ODg4ODg4ODg4KBgoOBfXdxbGNSUGd6gIKEhYWGhoaIioqLjY2Mjo6OjY2OjIiDgoOFh4uPkZKSkpKSkZKSkZCGdW5tbnF1fYeRlJWUlJSUlJWVlpSSjoh/dXJzeH6EiYyLjY2NgIB/f35+fH5+fn57e3t7e3t7fHx8fHx8fH19fX5+fn5/f39/f39/f39/f39+fn5+f39+fn5+fHx9fXx8fX18fHx8fHx7e3t7fHx8fHx8fX1+fn9/fnx2a2VnaWtvdnt9fX17d3NwcGxjX2mCkZCHg4WLjpCSkI6Oj5CQkJKOiYiHhYJ6a2V3hIiGhISFhYaGhoaHh4aGhoaEhIOFh4eIiIiJioqLjY+PjIiEgoKBgIGDg4SFhoaIiYiIhoaFhISGiIiJiYiIh4eIiIiIiYiGhoWDgYGDg4ODg4ODg4ODgoKBgoOCg4ODg4KBfnZtYk9MWnB/gIOFhoaGhoeIiYuMjIuNjY2Ojo6Kh4ODhIeKjpGSkpKSkpKRkpKSjH1vbG5wdHuCi5OVlZSVlZWVlpaWk5GMh3xzc3V7gYiKi4yMjY1/f35+fn59fH18e3x7e3t7e3t8fHx8fHx8fX19fn5+fn9/f39/f39/f39/f4CAf39/f35+fX18fH19fX19fXx8fHx8fHt7e3t8fHx8fH19fX5+f399e3ZuaGprbXN4fX57e3p4dXNwZ15fbYORkIeDhoyPkZCMjIuMjY6PkpCNioeFgXttYnGDioiHh4iIiIiIiImJiIiIiIaGhYaHh4iIiImKioqKjI6MiISCgoGAf4CAgoSGhoeIiIiGhISFh4mJiYmHiIiHh4eHh4eHh4aGhYSEhISEhISDg4ODgn56d3Z7gIKDg4KCgoB/enJub3R6foKEg4WGhoaGh4iJi4yMi42NjY6OjIiEg4OEh4qOkZKSkpKSkpKTko6Dc21ucHJ3foaOk5WVlJWVlZWWlpaTj4qEeHNzdnyFiIuMjY2Ojn9/fn5+fn18fHx7e3t7e3t7e3x8e3t7e3x9fX19fX19fX1/f39/f39/f39/f39/f39/fn59fX19fX19fX19fHx8fHx8e3t8fHt7fX18fXx8fX1+fnx6dHBrbm1wd3x+fn99fXp3c2xkXV9uhZCQhoSHjZCRj42LiouMjI6TkY2IhYJ8dHBnZ4GJi4iJiYmJiYiIioqJiYiIhoaFhYeHh4eHh4mJioqLjYyKhoSCgYB/gICAg4SGhoeHh4aFhoiJioiHiIaGiIeHhoaGhoWFhYaHh4WFhISEhISEhYR/dWpjZ3F6f4ODgoKAfnx8fH57fX+CgYKFhoWFhoaHiIiLjIyMjI2NjYyLhoODg4WHio6RkpKSkpKSkpSSjXtvbW9wc3uCipKTlJWUlZWVlpaWlpOPioF0cXN2fYaKjI2Ojo+Pf39+fn5+fXx7e3p7e3t7e3t7fHx7e3t7fH19fX19fX19fX5+f39/f39/f39/f39/fn59fX19fX19fX19fX18fHx8fHx7e3x8e3t7e3p8fHx9fX5+e3l0cG1ub3J5fH5/gH99endwZ1pYZnWCiYmFg4aMj5CNioqKioqLjZKSi4iEgXtybGBlfIaKioqKioqKiYmKiomJiYmIiIeHh4eGhoeHiIiIiYqMjIuIhoaEgoGAgH+ChIaGh4eHhoeHiIqJh4WEhISFhoaGhoaGhYWFhoWFhYWEhISEhISEgnxxY15dZW96f3+AgH99eXh8fnx8foGBg4WGh4eGhoeIioyMjIyMjY2Mi4iDg4OFhomMjpGSkpKSkpKSlI6DcmxsbnB2fYSLkJOUlZSVlZWWlpaVkoyGe3NzdXqBh4uNjo+Pjo59fX19fHx8fH19fHx7e3p6e3t7e3t7enp7e319fHx9fXx9fX19fn9/f39/fn5+fn5+fn5+fn59fX19fX19fX19fHx7e3p6e3t6enp5eXp8fHp8fHx8eXBsbWtucnmAgH6AgH56c2tdWl1qc32Hi4eDhImOjIqJiomJiYuMjo2Jh4WDf3t1bmJvgYuLi4yMioqKiomJiIiIiImHiIiGhoeHiIuLiYmKiouMjIyKiYeFg4KAgoKEhoaHh4eHh4iJiomEgH1/gYOEhIWFhoaGhYaFhISDg4OEhYWGhYSDfHFlXllcZW10e399enl5eXt/fn18foKEhIWGh4eHiImLjo2NjY2NjYyKhoSChYWIjI+RkZKSkpKSkpSRh3pubmxtcXiAh46SlZWVlJWVlZaWlpSPi4R3c3J1fYSKio2Ojo+Pi319fX17e3x8fX18fHt7enp7e3t7e3t8fHx8fHx8fHx8fH19fX1+fn5/f39+fn5+fn5+fn5+fn19fX19fX19fX19fXx8fHx7e3x8enl5ent7eXl6e3l1bmtrampueHx+f4B/e3RrYltcYWVteIWJhYGEjI+OiYiIiIiIiYuLioeGhoeGg4KAfX6Ch4mJioqIiImIiYmIiIiIiYeIiIaGh4eIioqJiYmJiouLjIyLiomHhIOCgoSGhoeHh4eHiImJhH55d3qAgoB9fn6Bg4SFhoWEhIODg4SDg4ODg4N9cmVeXF1gaXB3eXp6eXZ2eHt8e3p9gYSFhIaHh4eIiYyPjY2NjY2NioeFg4SGh4qMj5GRkpKSkpKSkox+cW1ubXF1fIGKkJKVlZWUlZWVlpaWlI+Kf3RzdHh/houNjY6PjoqEfXt7e3t7e3l7e3t7e3t6enp6enp8fHt7fX19fX19enp9fX19fX19fX5+fn5+fn5+fn5+fn19fX19fX19fX5+fn5+fX18fH19fX17enl7enl3dnh5d3JsZ2dnaG11e39/fnlwaWVkY2VjYWdzgoiGgYSOk42JiIiGhoaHiomHiIiHiImNi4qHh4aGh4eIiIeHh4aIh4eHh4eIiIeHhoaGh4iJi4qJiYiJiYmLi42NiomGhYWFhYaHiIeHh4eIiYeCeXZ2e4F/fXl5eXx/hIWHhoSEg4ODg4ODgYCAfnt0aWJgX15mbXF0eHx7enh4e3t8e36BhIWEhYaIh4mKjY6OjY2NjIqJhoOChIeKjJCRkZGTk5OTk5OSiHlubm5vdXuAhY2Qk5WVlJSUlJWWlZWSjoh+dXV2eYGIjI6Ojo6LhHx9e3t7e3t5e3t7e3t7e3p6enp6enp6e3t7e3x8e3t9fX19fX19fX19fn5+fn5+fn5+fnx8fX19fX19fX19fn5+fn59fXx8fX18fHp7e3p6eXZ1dnZ1cWpmY2ZnaG93f394cGhkZWpsZ2JgYmt9iIeAgo2VkImIiYeGhoSHiYqJiYqMj5CPjYyLioeHh4eHh4eGhYeGhoaGhoWFhoaGhoaHiouLjIuKiYqLi4uLi4uKiYmHhoaGh4eIh4eHh4iJh4F7dnd9gX96d3h8foKDhYWEhISDg4ODg4OBfXt0bWhlZWJgYF9gYWlxe397dG5tcXR4eX6ChIaFhoiHiYqNjo6NjY2MioeDgoSGiYuNkJGSkpOTk5OTk4+Dcm1vcHF4fYOIjo+SlZWUlJSUlZaVlZGNhnt0dXV7g4qNjI6Ni4R4bnt7eXl6enp6enp5eXp6eXl5eXp6enp7e3t7e3t7e3t7fX19fX19fX19fX19fX19fX19fHx9fX19fX18fH5/gIB9fX19fX18fHt6enp5eXl5dnZ0c3JtZ2FiY2hlaHJ5enJpZGhuc3JxaGBeZn2OjoN/i5SPiIiJiYWEhISGiYuLi4+Sko+Oi4yNioiGhoaGhoWFhYWFhYSEhYWGhoaGhoeJio2OjY2MjYyMi4uLiYqJioiHh4eHiIiIiIeHiIeGgXx6fH6Cf3x6e36Dg4SFg4OEg4SDg4OCgoB6a1JGTlxlY2FgYWBgZWx1d3JuaGJdW2RvdX5/g4SHiIaJi42Ojo2NjIuHhYKDhIeKjI6QkJGRk5OTk5KRi3xxbnBwdXl/houOkZOVlZSUlJSVlZSTkIuCeXd3eX+GiYyNjouGem9re3t7e3p6eXl5eXl5enl5eXl5eXl5eXp6e3t7e3t7e3t9fX19fX19fX19fX19fX19fX18fHx8fHx9fX5+fn9+fn19fn59fXx8e3p6enl5eHh3d3RzcGtlYmNnaWloanN3cmtscXh8e3dxaGNogJGSh4GHkI6IiImJh4aCgYSGiYmMkJGTlJOPjY2MiIeGhoaGhYWFhYWFhISEhISEhISGh4mKjY6Ojo2OkI+OjoyKiYmJioeHiIiJiIiIiIiIh4aBfn1/gIGAfXx+gYODg4SEg4KDg4ODg4KCfnVlWVhgZWdlYmFiZWVjZGZsbGhkXllVT1VdXmZygIaIiImLjY6OjYyMiYaEgoOEiYuNj5CRkpOTk5OTk5CFd3FzcnV5fYCHjY+Rk5WVlJSUlJWVlJKPh3x2d3d6gIeKjI6Nh3xybWt7e3p6eXl5eXl5enp4eHd3eHh5eXh4enp7fHx8fHx7e319fX19fXx8fX19fX19fX19fXx8fHx8fHx+fX19fX19fn5+fn58fXx7eXh4eXl5eXh3dXJvaGNhZGptbGdla3JxcHJ1e4CAf3tybXGCkJSKg4OKjIiGiIiHhoSCg4WHh4uNkJKUlJKPj4yJhoaFhoaHh4aGhYWEhIODhISDg4SGiIqOjY2Njo6QkJGRj46Li4iIh4iGh4iIiYmIiIiHhYJ/f4KCg4KAgIGDg4KCgX9+e36AgoCAgoJ9d3FzfXx2bmlkY2dramVhY2RmZWFYU09OVFNPUWR5hIWIiouNjo6NjImGgoOEhIeKjI2PkJGTkpOTkpOTjYJ1dHR0eXx+goqOkZKUlJSUlJWVlZWUkY+HfHd4eHuDh4mNjImAdG1tbnp6eXl4eHl5eXl5eXh3eXl5eXl5eXl6enp7fHx8fH19fX19fX19fn5+fn5+fX1+fn19fHx8fHx8fH59fX5+fn5+fn5+fnx9fHt5enp6enp6eHd2dG9rZmNobnJyb2prcXFvbXB5f4GCgHp0doKQmZKEf4aLiYiIiIeGhYSCg4WFh4qNj5KUkpKQjYmFhIWFhYeHh4eFhYSEg4OEhIODhIaGiIiKjI2OjpCSkpORkI6NioiFhYSFhoiJiYiIiIeEg4ODhISDgHlycnd8gIB8dHBvcnd7e3t8fH9/gIGDf3dvZ2NkaHBvamRiYF9aU0tHRkZAS0pMV2VyfoaJi4yNjYyJhoOCgYOFh4uNj5CRkZOSk5OSk5KJfHRzc3R5fX+Cio+RkpSUlJSUlZWVlZSRi4J5dnl5fYWLjYuIgnhwbXBzeXl5eXd3d3d4eHd5eHh5eXp6enp4eXp6e3t8fHx8fX19fX19fn59fX19fHx8fHt7fX18fHx8fHx9fX5+f39/f399fH99fHt7e3t8fHx8enh4d3ZzbmpnZmpxdHVybmttbm5paHJ9goJ/fHd4g5CXk4V9goiJiYmJiYiFhIODhYaEh4mKkJKRkI6Nhn1/g4WFhoaHh4eHhoaEg4KCg4OEhISFh4iKjI+OkJGSkZKTk5GNioeGhIGDh4iIiIiHhoaGhYWHhHpwamdnZ2pwdXVxbmpqbnBzcXBzeHyBg4F9c2piYmFkbnBsZWJcWVRMQDo2OD1FQ0BIVWZ1gIaJiouLiomEgIKDhYeKjI2QkZKSkpKTk5OUjoR2cXJ0dnt+foOKkJGTlJSUlJSUlJWVk5KKgXd2eXl/hoyNioF2b25xdXZ4eHd3d3d3d3h4d3l4eHl5eXl5eXh5enp6enp6fHx8fH19fX1+fn19fX18fHx8e3t9fXx8fHx8fH19fn5/f39/f318fHx7e3t7e3x8fHx6eHh3dXJuamVlaG90dXRwa2pqamRjbXqAgYB6dnaAjZWSiH18goaIiYmJiIeFhYeJh4aGhoiLjo2Oi4NyY259goSFhYaGhYWGhoSDgoKDg4ODg4SGh4iJiouOj5CRkZKUk5COi4mGfHZ5f4SFh4eGhoaEhYF2bGlpZ2VmZ2ludHVybWhjZGdoZ2lzfICBgX91a2djYWJqcnFqY11aVU9JQjw+R01OUldQTWNxfYaJi4uJhoKAgYOGiYuNj5CRkpKSkpSUlJKLfnVzdHZ4fX5+go2QkZOUlJSUlJSUlZWSjoh9d3h5e4GHi4uEe3FtbnR5fHd3dnZ3d3d3d3d3d3d3eXl4eHl5enp6enp5enp7e3x8fX19fX19fX19fX17e3t7e3x8fX17e319fX19fX9/f39+fHp6eXl5fHx8fHt7e3t7eXh2c3BrZGNlbnN3eHVwbGtqZ2Nqd3+Af3l0dYGMkpOLgn5+hIiIiImJh4eIjY2Lh4WFhoiKiYqEdmZYWXN+goSEg4SFhYaFg4GCgYKCgoKDhIWFh4iIio2OkJGRkZOTkZCOjYiAc3J2fIOHhoeGiIWCeXFvcHBsamlqam10dnZuaWViYF9gZnN9g4SEgnhtaGViY216enJrZGBdWVZaXFpZWVRZX0gsQF90hIuKiIWAf4CDhIeKjo+Pj5CSkpGSlJSUkoh5cHBydXp8fX6EjZCRkpOUlJSUk5WVlZKNhXx3eHl8goiKiH10b29udX1/dXV2dnd3d3d3d3d3d3d3d3h4eXl6enp6enh5eXt7fHx9fX19fX18fHx8fH19fXx8e3t7e319fX19fYCAgYF/f356d3Z1dXh7e3t8e3t7e3t7enZzb2xmY2JobnJ3dnRwa2pnY2V0fX54dnN2gYySk46Hf32BhoeHiYmJiYuPkZGMiIJ+fXt8enVqYVROW3mAhISDhIWFhYODgYGAgYGCgoKDg4OFhoeJjY6PkZGRj4+PkJCOioN4cXNzeX+BgoWGhH53dXN0dnd1cG5rbHN3d3ZybmpmZmZrdn+Cg4ODfXJsZmJmc3p4c2tlZGBeXV5jZmVfXl9ZPSwxQVRpfISGg4GBgYSFiYyOj4+PkJKSkpSVlZSRhHhxcXJ1enx9foSNkJGSk5SUlJSTlZWVkIyDeXZ5en6DiIqDeHFwcXV8gYJ0dHZ2d3d3d3Z2eHh3d3Z2d3d5eXp6enp6enl5ent8fHx8e3x9e318fX19fX19fHx8fHx8fX19fX1+fn+Afn5+fXt3c3Fzdnp8fnx9fHx7ent5eXZybWdiY2pvc3V2dHJvbGpkYWlxcm9wc3aDjZKSkIqCfX+Fh4iIiIiKjpOUlJKLg3lvaW5xbGZgVEtMY3uChISEhIWDg4OCgX9/f4GBgYKCg4SGh4iLjIyOi4qJiYeHiIiJhHZubnJ1eXx+gIKAfHl4dHV9goB2cG5vcXV2dXV0cXBubnF2foKDg4N7cmxkX2Nwd3d0b2ljY2JiY2dqbGtkW006OEZPWnCDiIiIjYuLiIiNjo6Pj4+QkpKSk5WVlI+Acm9vb3Z6fn2Ah4+SkZKTlJSUlJSUlZOQiYF6d3h5f4aLhXp0cHFyeIKHhHZ2dnZ2dnd3eHh4eHd3eHh5eXl5enp6enp6enp7fHt7fHx+fn18fXx9fXx7fHx9fXx8fHx9fX19fX5+f4CBgIB8endzcXFzd3t8fn5+fnx7enl4dnJtZWNmbnF2eHh3dnBta2ZfYmlpaW1yeIONkpKPi4V/f4WHiIiHiIuQlpaXk46HfW5nZ2tpZF5WT0dNbHyFhYWEhYWFhIOCgYGBgYF/gYGCg4SHiIiHhoaFhYOEhIOEhYOCe3RxcnV5enl5enl3eXh7gIKFg3pxb3J2eXh3d3d2c3FxdHp/gYODg31zbWZiaHR7e3VxamhoZ2VkZGNjYl5URDo/WHeHkZGPjImEgYKDh4uOjY+Pj5CSkpKTk5OUj35ycW9vdnx/fYCJkJKRkpOUlJSUlJSVk4+If3l5eXqAhoV9dXJzdXd/iImDdXV2dnV1dXZ3d3h4eHh4eHl5eXl5eXl6fHx8fHt8fHx+fX5+fHx9fHx8fHt7e3t7e3t8fHx8fHx8fX+AgYGAgH9+e3dycXF0eX1+gH98e3d2dHRxb2llZmpwdXZ4eXh2dHFva2doam1sb3N6hZCSkZCPioF/hIeIiIiKjZSYmZeTkouDdWxpaGhjW1JOSEVQdYGFhYWFhYSFg4OCgYCAgICAgIGDhIaHhoaIhoWFhISFhoSCg4OBenZydXh6eXp7eXl6eHyBhYeCenNwc3p8enl3d3h2c3N3fYCCg4WDfHRrZWRueHx5dHFtbGxoYmJjYl9hYFRLSFBphpOYmZaIf3h1eHh3eoWMj4+PkJGRkpOTlJSNe3Nwb3F4fn9+gYuQk5KTlJSUlJSVlZWTj4V+e3p5e4GDf3ZycXV2eoOMiYN1dXZ2dXV1dnd3eHh4eHh4d3d5eXl5eXp7e3t7e3x8fH18fHx8fH18e3x7e3t7e3t7e3t7fHx8fH5/f4CBgYCAf357d3JxcHJ4e3x7dnRva2lnaGloZmVpbnN2d3Z4eHl4dXJwcnR1d3FucXiCjZGSlJKMhH+Eh4iIioyRlZmamZSTkIqAdm5oZGJeV1BLQ0NYeYGGhYWFhIWDg4KDgYGBgYGBgoSFhYaHh4eHh4aFhYaFhISEgoGBfXd0d3l5e3t8fHt6fX+DhYJ5c3F2fX59fHp6eXh1dnp9gYKDhIF5cWtlZm93eXNua2xtbWplYmNmY2JhWlNQWHCLmZ+ejYB6end0cm5sdoeQkI+QkZGSk5OUlIh4cXBwcnl+f3yAi5CTkpOUlJSUlJWVlJGLhHx6enl7f395dHJzd3uBiouGgHV1dXV1dXV2d3d3eHh4d3d4eHh4eHh5eXp6eXl6e3t6e3t7e3t7fHp7e3p8fHx7e3t7fHx7fX5+fX5+f39/fn5/f3x5dG5ub3Z7endxaWRgX15cXWBjaG50dXh4eHh5e3h3c3B0eXx8c29zeICMk5SUko6FgIKIioqKjY+UmZqZl5SQjIV/dW5qZmFbU0xHQERie4SFhISEg4ODg4KCg4OCg4KEhIaGhoaGhYaGhoaHhoeHhYWEhIODfHZ1eHl6en58e31/f3+BfndwcHaAgoKBgH98end3eX6Bg4ODf3Vva2VodHx6dG5paGpqbWdkZWZkYWJfWVhfdIqaoJ+LgYGBeXVxbGZjcomPkpGRkZKTlJSTiHhvcHByeX19fYOMkZSUlJSUlJSUlZWTj4qDe3l6eHt9enRyc3Z4gISMiYF/dHR1dXV1dXZ3d3d4eHh3d3d3eHh4eHl5enp5eXl6enl7e3t7e3t8ent7enx8fHt7e3t8fHt9fn59fn5/f3+AgH9/fnx2cW5vcnh3c2plYWNlYl9eX2VscnZ4eHh4eHl7eXd0cXN5fHtybnJ2gI2SlJSVk4yFhIeJjIyQkpaXmZiWkpGOioeAfHhxaF9ZUUdAPEdoeoOEgoKDg4ODg4OEhYWEg4OFhoaHh4eHh4eIiomJiYmIhoSEgYKCfHl5e3t7fnx7fYCAfXp4cnBxeIGDg4SEg4B+enh6foGDg4N+dG9pY2h0fHp1bGhnaW1raGhpaGZkYl9fX2Rzh5WcmpCKhYF5cGhkYl5idYiQkZGRkpOUlJCFd3Fyc3V7f319hI6RlJSUlJSUlJSVlZOPioB7e3p4eHh2cXN1eX+Gi4mGgX90dHV1dXV1dnh4eXl5eXd3eHh4eHl5eXl6enp6enp7fHt7e3t7e3t7e3t7e3t7e3t8fHx8fHx+fn1+f4B/f39/f39/fnp0cXBwdHVvZmRobXBtZmRmbnN2eXl4eHl5enp5eHRzdHh8enJvcXV7h42RlJSWkY2HhoiLjpCSlJWXlZORj4uJiIWCfXRqYVpXTUU/Q1JwfIGDgoGDg4OCg4WGhoaEg4SHiYmKiIiIiYyOjIuKiIeHhoWCgoJ+e3x8fHx/fnx+gIB8eXVycHF6gYSEg4OCgoF+fH6AgYOFhHxzbWdjanV9fHdwbGhrbGttbm5rZ2VjYWBiZHB+jZaVj4mFgnhuZF5dXFtkeo6SkZGSk5SUjX91cnNydHx/fn6GkJKUlJSUlJSTlZaVk4+FfXt9fXh1dXNzdXh8goqJh4WCgHZ2dnZ1dXV2d3d4eHd3d3d4eHh4eXl5eXp6enp7e3t8e3t7e3t7e3t7e3t7e3t7e319fHx8fH19f4B/gH9/f39/f4CBfXVxbWxvcW5oaW11enlya2ludXd5eXh4eXl5eXt5dnR0d3p5c3BxcneBiIyPkpaXk42KjI2QkZOTlJWUkpCNioiHh4aBeXBnXllWT0lERlRygIODgYODg4ODhYaIiIeFh4mKiYuJiYuNj46MiomHhoWFhYKCg398fHx8fH59fH6CgX98dXFwc36EhoaFhIKCgoKCgoGChIaDenJsY2RseH18eHRwbGtrbm9vb21ra2hlZGRmbHF9iIyJhYKBfXVqYl9gXlxpgY+RkZKTlJSPgXNwb250fH9+foaPkZSUlJSUlJOVk5WSjoV+fH5+eHNxcXJ0eICIioqHhYF/c3R1dXR1dXZ1dXZ3d3d4eHl5eXl4eHl5eXl6ent7e3t6ent7e3t8fHt7e3t7e3t7fHx8fHx8fX18f39/gIB/f39/f4GAfnRtaWtsaWdncnp8eXd0cnV6enl4eXl5eXp6enp5eHV1eHh1cXFyd4CFh42Rl5eTkI2Njo+RkpOUk5GQjoyJh4aFhIOAenJlWlhZUk5JTFx3goSCgoKDhIKEhYiLiomJiYmLi4uNkJCQkI6MioaGhYSGg4ODgX18fHx8fXx9f4ODgHt0cXNzfYWGh4iGhYODg4WFhoeGhoJ3cGxnaHJ7fnx4eHVwb21sbXBubW9wbmpoaWxtbXN8g4SEgH54cmhfYGJiYWFzjJKRk5SUk4t8cm9xcXZ+gH99hY+TlZWVlZWVk5WVlZKLg317fn14cW9zc3V8gomKiIeGgX5zdHV1dnZ2dnZ2d3h5eXh4eXl5eXh4eXl5eXl5enp6enp6e3t6ent7e3t7e3t7e3t8fHx8fn59fX5+f3+AgH9/gIB/gYB+eW9ra2djYWVvd318e3p6ent7enl5eXp6enp6enp5dnZ4eXRwbnF3fYKFjZWXl5OQjY2MjpCRk5STkY+Ni4iGhoWEg4ODf3JfVVRXV1RSW2d5gYODgoGBgIOGjI+OjYuKi4yOjo+SlJKQj4uHhIWEhISEhISDf35+f399fHt/hISAe3VycXR9goWGh4eHhYODhISGh4aGfXJtaWZqc318eXh4dnRwb25ucnNycXBxcG5wc3R0d3h8gH15endvZWBfYmRiYGyCkZKTlJSTi3xyb29vd39/fn2FkZSVlZWVlZWTlZSUkYqDfX1+enVxb3F1eYCGiIiHh4aBfnJzdHR1dXd3d3d2eHl5d3d4eHh4d3d4eHh5eXl6enp6enp6enp6enp8fHt7e3t7e3t7e31+fn5+fn5/f35+fn5/f36AgX98d3FsZ2JeX2lzen5+fn18e3t7eXl5e3t6ent7e3l3dnZ3dXJvc3x/goiQlpWUk5COjY2NjpGSlJSSj4yJiIWEhYSEhIaHg3lmV1ZaXFxZX2t8gYKBf3+Bg4aMjo6Ni4uLjY+Qj5KUk4+LiIaFhYSDhYWFhYWDfn59fnx6en+EhIB9dnFwd3+DhoeHiIiIhIGCgoWFhYJ5bm1qZmx3fX17eXd3eHNxcHBzdHJwcXJxcHF1eHh0cHN1dXNzb2pjXl5iZWdmaXeJj5CRlJKJenJxcHB4f39+fIaQk5WVlZWVlZWVlZORi4J+fn52c25vcnR7hIiIiIiJhoJ/b3F0dHR1dnd3d3Z4d3d3d3h4eHh3d3h4d3l5eXp6enp6enp6e3p6ent7e3t7e3t7fX17fX5+fn5+fn9/fn5/f4CAgH9/gIB+eXJrZmFeZHB6fn5+fXx6enp7enp7e3p6e3t7eXl3d3h5eXl9gIOGio2QlJaUkY6NjIyOkZKUlJKOi4mIh4aEhISEhoeGhn1yY1pbXl9gZnJ9gX9/gIGEhoyPkI6NjY+QkJCQkZKPi4iIiImIh4eIh4WFhYOBgYB/fXt6f4SEgX53cXB2foSFhoeIiIiFg4KCg4ODfHFsbGpocHl/fHl4eXl6eHZ0cXR2dG5tbGtqam5wcG5sbGxtbW5vbGlhXF1jZ2hob32FiouNi4R4cXBwcHh/f35+h5GVlZWVlZWVlZWVk4+Hf35/e3Rwbm9zd4CGiIiIiImGgn9vcXJzc3Z3dnd3eXl5eXl5eHh4eHh4eXl5eXp6enp6enl5eXl5enp5enp5eXt7fHx9fXx8fH1+fn9/f39+fn5+gICAgICAgIB+eHBrZmRocHp9fn19e3l6e3t7e3t8fHt7e3t7enh4d3t8foGEhYeFhoySlpSRjIuKiYyPj5GQj4uIh4WFhYODgoSFhoWFg4J3bF5YXWJrdHt/gH+Bg4aGi42Pj4+PkI+SkZGRjouIh4iJi4yNioiGhoWDg4KBgX57eXp+gYOCenJsa21ye3+EhYeHh4eFhIGAf3xzbWtta2lrb3F2eXp7fX19fXx4eXh1bWZfXV1dX2VoZ2ZlZ2ptcG1rZ2RgX2FoaWptc3l8gIODfXBwcG9xeH5/fX6JkpWVlZWVlZWVlZWTjIN+fn55cm9wcXR8g4eHiImKiYaCf25vcHJydXd2eHh5eXl5eXl4eHh4eHh4eHh4eXl6enp6enp7e3l6enl5eXl5e3t8fH19fHx8fX5+fn5+fn5+fn6AgH9/gICAgH97enVxcHJ4fn9+fXx7ent7e3t7e3t7e3t7e3t6eHh5fICCgYGCgn9+hIySk5GMiIaFhIWGh4eIh4aDgoKCgoKEhYaFhoaHhYR/d2phYGt5fX2AgoOFhoeKjI+Pj4+Pjo2NjIqKh4mJioyNj4+NioeFhYODg4KBfnt5en6DgnxxaWNhY2RodH6EhoaGh4WFgoB/dmxqa2ppZWhsa2psb3J3eX2AfXl2cmxlXFZUVFRWW2Roam1ucHBxbm1pZWFgY2ZoaWlnaGxxdnZybWxsbW95f4B+f4qSlZWVlZWVlZWVlZOLgn5/fXZxcHFzdn2EhoeIiYqJhoJ/bW1vcHF0dHV2d3d5eXl5eXl5d3d4eHh4d3d4eHl5enp5eXl5e3t7e3t7e3t8fHt7fHx9fX19fX19fXx8fX1+fn5+fn5/f39/gIB+fnx8fH19fH18fHx7enx8fX18e3t8fHx8fHx8eXp8gIWEgn99e3l/hY2SkYyIhYSDg4ODhYaDgoKBgoKChISGhYWGhoaGhoOBfHl7fX1+f4GEhYeGiIqNj4+Pj5COjYyMi4qKi4uLjI6PkI6Jh4WFg4KCgoB/enl5foF+dGljYmNiYWJrdoGGhoeHh4eFgX1yaGdoaWllamxsZ2VjYmVpcHZ2cm1oY15XUk9QU1lfbHZ7enp6eHhzcGtlZGJjZGRlZmViYmJmaGhoaGhrbnd+gX2AjJSVlZWVlZWVlZWVkYqBf397c3Fxc3V5gYSGh4mJioqHg4BtbW9wcHJzdHZ3d3l5eXl5eXl3d3h4eXl5eXh4d3d4eHp6e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fn5+fn5+fn5/f4CAf39/gIB+f318fHt6enp7e3x9fXx8fHx8e3p7fHx9hIaEgnx6en6AiJCRjomFg4ODhISEhYWEg4ODg4SFhoWFhYaGh4eHhYSFg4KAfX+Bg4SFh4qMjo+Pj4+PkI6NjY2MioqKioqKjI6QjYeDg4SGhIKCgoGBfXx+f3twamppaWViYGNtfIOFhoWFhoeDe3NrampoaGZoaWlpZ2VlY2RiY2NkY2JgXVxZWVpeaHmEhYWDg399fHdzcHBva2lrbW9wbWtpZ2RhY2NjY2NncXh6eX6LlJWVlZWVlZWVlZWQh318fHhydXVzdXuChoeHiYqLi4aBfm1tbm9xcnN1dnd5eXl5eXl5eXh4eHl7e3l5eXl6ent7e3t6ent7enp6enp6fHx8fHx8fHx8fHx8fX19fX19fX1+fn19e3t9e319fX5/f39/fXx9fXx7enp8fHt7e3t8fHx8fX18fH19e3yBhYaEfnx8fH2Bio+OjIeEhISFhIWFh4aFhYWEhIaHhoaGhoeJiYeFhIKBfnt+f4KDhIaIioyNj4+PkJGPj46NjoyKiYmJi4uLjI6KhH6AhIWDg4OEg4KCgH9+eXNycXBubGhhYWNwfHx7en+BhYJ4bmpsa2dmaGppamloZ2dlYmJiYmFiY2NlZmVkaXaEjpKMh4KAgYF+e3h2dnZ0b290eX59e3l0bmhkZWRkZWVrb3J1f4uVlZaWlpaVlZWVlI6EfXp6d3Jzc3V4e4KGh4aHioyLh4N/bm5ub3BxcnN2d3l5eXl5eXl5eHh4eXl5eXl5eXp6e3t7e3x8fHx7e3t7fHx8fHx8fHx8fHt7e3t8fHx8fX19fXx8fX19fX17fHx9fn9/fn59fH19fHt6enx8e3t8fHx8fHx8fHx8fX1+f3+DhYaDgH58en2Ci46NioeFhYaGh4eJh4eGhoWFh4aEhISGh4mJh4WEgn58foCChISHiIqNjo+Pj5CQkJCPj46OjY2Li4uMjIyMjYiDe32ChYODg4J/goOBfXh0dnh3dHN0b2VgX2ZsaWhpbXN7e3ZvbW5ta2dnZmVmZ2VjYmNiZGRmZGJhZ25zdnuCkJicnJGGg4GAf399fXx/gIB5d3p/hYeIhoR9dW1raWdlZWZqbHF7iJCUlZWUlJWVlZWUjYJ8e3l0cnNzdXl+hYeFfn6Gi4uHgYFub25vcHFyc3d4enp5eXl5eXl5eXp6enp5eXl5enp7e3x8fHx7ent7e3t8fHx8fHx7e3t7e3t7e3t8fHx8fHx8fX19fXt7e3t8fHx8fH19fXt7fX18fHx8fHx8fHx8fHx7e3x8fHx+fn+Af36EhoSDgH57fICGi4uLiYaFhYeJioiGhoaGhISFhYWFhYaHiYmIhoaBfX6Bg4OFhYiKjI6Pj46Ojo+QkZKRkZCPj42NjIyMi4yMi4d/e4CCg4SEg4GAgYB6cXB0dnJwdHl2bmZhYWRlZGBiZmxxb2xtbm5qa2lpZGNkZGRkY2NkZGZoaGVkbXd8go2XmpWPiIOFh4N/f31+ho6PiYCAf4GGiouKioR9dnJwa2hlZmhpaXOBiZCVlJOUlZWVlZSLf3p6dnNzc3N2eoGFiIZ7eoaKjIaBgWxubm9vcXJzdnd3eHl5eXl5eXp6enp6enl5eXl6enx8fn5+fn17e3t7e3x8fHx8fHt7e3t6enp6e3x8fHx8fHx7e3t7e3t7e3p6fHx8fXx8e3t7e3x8fHx8fHx8fHx9fXx8fX18fH5+f4GAf4CEhYOBgIB/foKGh4iHhoWEhYiKiIaFhISEhISFhYWFhoeJiYiGg4CAgYGDhIWGiYuMjo+NioiMjpCTk5STkpGQj46NjYuLjIyLiYF7gIKDhISDgX9/e3Nub3Fyb3B0eHt1bGJhZGRlZWZmZWdpa2xra2xwc3NvaWdmZGRkZGVlZWdtdW5fWWN3ipOKhYGAhIWEgn9/hJCan5iSiYSDgoWKi4qKiIOCfXl0bmtqamdnbnmCio+Rk5SVlZWVkoh7eXh1c3Nyc3d8goeHgn2AiIyMhoGBbm5ubm5wcXJ2eHl4enp5eXp6e3t7e3t7e3t8fH19fX1+fn99fHx8fHx8fHx7e3t7e3t7e3p6e3t6fH19fHt8fHx8fHt7e3p6ent7e319e3t9fXt7e3t8fHx8fHx9fX5+f399fX19fX6AgoGBgIOEg4OCg4KBgICAhISEhYKAgoWGhoSEhYSFhYSEhISHh4iIhYKBgIOEgoODhIeJjI6PjouJiIqNjpCSk5SVlJGQj46NjIyLjY6MhoGAg4SFhIB8f311bmtsb29vcnZ5eXVsZWVoaWpqZWNjY2VnZmRlam52dXBqZmVmZWViYmNiZWpqY1dJVnWKkISBgYaHgoGBgIuYoJ+fnpqTi4aFhYiIhoaHhoB/f316dnNubGhqcnuAh42Rk5WVlpWQhXt4dHN0dHN1en+Gh4Z+fYWKjoyHg4Nubm5ubnBxcnR2d3l5eXl5enp7e3t7e3t7e3x8fX19fX5+f318fHx8fHx8fHx8fX18fHt7e3t7e3p8e3t6e3t7e3t7enl5enp6e3t7enp7e3t7fHx8fHx8e3t7e3x8fHx9fX19fX19foCBgoOBgIKEhYWEhISCgoKEhIOEhIGAgYSEhISEhIWFhISEhISEg4GCgoODg4SDg4SGiIuMj4+OjIuMjIyOkJKTlJWUk5KQj42NjY+PkI+MhoODhIaEgHt6eHJsa2xtbG5xdnl5c21oZ2lrbXBvbmppaGdmZWRmaGpra2dnZ2ZlY2FfXV1bXV1aVFJYZX+NhIGDhYuIgYmYoKKin5+enpyUj4mFh4eHh4mJhIF/gH97eXZxbWlvc3d9hIqOk5WUlIx/d3Z0c3R0c3Z7goeIgXqBiYyOjIiEhG9vbm5ucHFzdnZ3eHl5eXl6enp6e3t8fHx8fHx8fX5+fn5+fn5+fHt7e3t7fHx9fXx8fHx7fHx7e3t8fHt7e3t7e3t7enp6enp6enp6enp6e3t7e3x8fHx8ent7fHx8fH59fHx9fX1+gIODhIOBf4KFh4aGhoODhIWDhIWIiISDhISDhIWFhIOEhISEhYOCgYCDg4OFhYSFhomKjI+Qj4+Qjo2Oj5CRkpSUlJSTkpCQj4+PkJKQkI+NiIWEhYWBd3JvbG5wcG9sbW10eXtzbmtoaGxwcHV3dXBvbGhmY2NjYmNnaGlqaWhoaWVdWlhZWVhZX2FldoeHhIeIiYiLl6CioJ+fn5+fnpuWkYyMi4mHiYiGg4GDg4B7endwbHBydHl+hoyQk5WSi353dXRzc3NzeIGHiIN8fYaKjo6Mh4WDb29ubm5wcXN2dnd4eXl5eXp6enp7e3t7e3t8fH1/fn5+fn5+fn58e3t7e3t8fHx8fHx8fHt8fHt7e3t7enp6enp6enp6enp6enp6enp6enp6ent7e3t7e3t5enp7e3x8fn59fX19fX6Ag4SFg4KAgIKHiIiHhIKDhIWGhYeHh4aEhIOEhYWFhISEhISDgoKCg4OFhYSFh4iJjI6PkZCQkI+Pj5CRkpKSlJSVlZSTkpGRkJGTkpCPj4+OioaEhIJ7c25vcHFwbWlpaW93eHJtaWhpbnF0dnV0c3Fva2ViYWFhY2RnbG9wcXJzcmplZGRiYGFnaWx2g4uMjo6MiZOdop+dnZ6goJ6dnp2WjIiEhYaIiIiFfoCDg39/fnducnZ0dHZ8g4uRk5GKfXVzc3Fzc3Z6gIWGf3yDiIyNjo6LhoRwcG9vbnBxdHZ2d3h4eXh4eXl5eXt7e3t8e319f39+fn9/f39+fXx8fH18e3t7fX18fH19fX16enp5eXl5eXh4eHh6enp6enp5eXp6enp6enp6eXl6e3p6e3t7e3p8fHx9fX5+fn59f4CDhYeHhoKCgoSHiIeDgoOChYaGh4eGhoSDg4SFhYaGhIOEhIOCg4WFhYOFhoiLjI6PkJKQkZKSkpGQkZGRkpKTlJWVlZWVlZKSkpKSkI6Oj4+PioaEgXxzcXJ0c3BuaWhnbnl4cmtnY2dwc3NzdHNxb21qZWRiYmFjZWhtcXJzdnR1dHJvcG1sbG9ucXqEjo+Pj42NmKGkoqGgoKCgn6CfmYqBgoOGiYmIh4V6d31/foB+enR5fHZ1cnZ8hIqPkIl6dHV0dHR0eHyCg4F8gYiOjo+Pj4uGhXBwcHBucHF0dnZ3eHh5eXl5eXp6e3t7e3t+fn5/f39/fn5+fn59fXx8fXx7enp9fXx8fX19fXx8enl5eXl5eHh4eHd3eHh5eXl5enp6enp6enp6enp7e3t7e3t7enx8fH9/f39+fn1/f4KFh4eGhYWDg4OEhYWEgoGDhoaFh4aFhIODhIWFhISEg4SEgYGEhYWFhYaIi42PkZKSkpCQkZKRj4+QkZGRkZKTlZWVlZWWlJSVlZKQkJCQkJGPioaBenFzdHV1c3FuaGVqc3VvaWVjbHJ1dnV0c29ta2ZkY2JkZWdrbW9xc3R3dnRycXN2dHNzdXd2eICKkJKQj5OcpKakoqGhoaCgn5aGgYCAgoaJiomGgnZucnt+gIB7eoGFgnl2dXV9hYqMhXlzdHV1dXZ8gIWAfIGGi46OjpCSjIaFcHBvb25yc3V3d3d3d3d4enp6enp6e319fn9+fn9/f39+fn5+f39+fH19fHx8fHx8fHx9fX19fXt6eXl5eXd5eXh4eHh4eHh4eXl6enl5eXl6fHt7e3t7e3x8e3t7e3x8fX5+fn19fn6AgoWIiIiHh4aFhIODhISDg4SGhoaGhoaFhYSEhISEg4OEgoODhYeGhoaGiImMkJCQkZCPj4+PkJCQkJGRkZCQkZKTk5WVlpaWlZWVkpCPkJCQkZCPi4V7dHN5eHVzdXBoZmtxcWxnZGVudHd4dnVxb2tqZ2VkZWZobHFxcnJydXVxcG5wd3t7eHZ2dnNwcn2KkZCPlp+lpaWjoqKioaGZh4GAgICAhImJiomEdmppdX5/f318g4qJgHl3eHp/homCenV2dnZ1eHyAgHx+h4qOjo+OkZSNhYNwcHBwcXFzdXV1d3d3d3d4eXl6enp7fHx9fn19f39/f39/f3+Af398fX18fHx8fHx8fH19fX17enp5eXl5d3d3eHh4eHh4eHh5eXl5eXl5eXl6e3t7e3t7fHx7e3t7fHx9fn5+f39+fn+BhIiIiIiIiIiGhYOCgoOFh4mJh4aGhoWFhISEhISDgoOCg4SGh4aHh4iJjI+QkI+Qj46Oj4+QkI6Oj5CQkJCRkpOTlZWWlpaWlpWTkZCRkZGSkZCPi4J7eHl4eHd3cmxqcHRybWpkZ3F2d3p6d3JwaWlpZmVlaW52eXd1dXVzcm1oZ2tyeXt2c3R0cG1tdIOOj5GZoqWlpaOioqKinYyBgICAgICAhYmKiYZ/cWdte4CAfXuEjI+IgHhzdXuBhX92dHd1dXZ5eXt6gIaKjIyOj5CSkYuEgnBwcXFwcnF0dHV4d3h4dnd4eHt7e3x8fX19fX19fn5+f3+AgH9/f3x9fX5+fHx7e3x8fX19fXt7e3t6enl3eHh3d3Z2d3d3eXl5eHh5eXp6e3t7e3x8fHx7e3x8fX19fX19fn5+fn9/foCFiImJiYuNjYuIhYKAgYSIioqHh4eHhoaGhIKDg4ODg4SFh4aIiImJiYqOkI+PjY6Pjo6PkZGQj42NjpCPkZGRkpOUlJaWlpaVlZSTk5OTk5OTkpCQjoaAenZ3eXp2b25wc3FtaGZsdnh1eHh0cW1qaWlnZ2ZscXyBfXh4dXJvbmlkYmx1eHV0cnJybmtxgIuQlJmipaalpKSjoKCTg4CAgICAgH+FjIyIh4FzaWt5gIB+eoKPk4yHgHl4e3+AfHV2d3V2dnh3eoGGi46NjY6OkpWPh354cXFxcXJzdHR0dHV0dnZ2d3h4eXl6e3x9fX19fX19fX1+fn5+fn5+fn19fHx8fH19fX19fX19e3t7e3p6eXd4eHh4eHh4eHd5eXl4eHl5enp6ent7fHx8fHx8fHx9fX19fX1+fn5+f399f4KFiYqKi4yMjIqHhYOCgYOFh4eHiIiIiIeGg4ODg4OEhoaIiYqLjI6Nj4+Pj46LjI6Oj5CRkpGQj4+OkJGSkZKTk5SUlpaWlpWVlpSUlJSUlJSTkZGPjouEf31+fXdycHFzcGxoZnB6enh5eHVvampsbGxsa2xwd3p7eXZ1cnJwa2ZlbHR0c3Rzc3Nvb3J8ho6Um6OmpqWkpaSim4iCgICAgICAgIaOjoaCfHFnanV+gH56gI2Tj4qDfnt9gH94c3V2dXZ3eXuBhoqLjY6OjYyLioN5cW5ycnFyc3N0dHN0dXV3d3d4eXl6enp7fHx8fH19fHx9fn5+fn59fX19fX18fHt7fX19fX5+fX17e3x6e3t5eXh4eXl6enp6eXh5eXh4eHh5eXl5enp7e3t7ent7e3t8fX19fX1+fn5/f35+gIaLjIyNjo6MiomHhYSFg4SEhYiIiYqKioiHh4WDg4WGh4qKjY+RkI+RkI+OjoyMjo6QkZKTkpKRj4+QkpKTk5OTk5SUlZaWlpaWlZWVlZWVlZWVk5OSkpCNiIaAdnFxcnJvbGhnc39+ent6dnJtbW1wb29vbmttb3JzdHh0c3NvbGtscHNxdHV0cnJzc3mFjpSboqampqSkpaKPhIGAgICAgICDhIuMhYB6cm1ud32BfXp9ipOPi4aBfYB/fXh1dnZ3d3h/goeJiYSFiYmHgXl0bWlna3FxcXJzc3R0dHV1dnd3d3h5eXl5eHl6enp6enp7e3t7e3t7e319fX19fXx8fX1+fn5+fn59fXx8fXx7e3p6eXl5eXp6enp6eXl5eHh4eHl5enp6ent7e3t6e3t7e3x9fX19fX5+fn9/fn1/g4qMjI2Pj46NiomJiIaFg4OEhoeIi4uKiIiGhYSFhoeHiIuPk5ORkZGQjYyMjIyOj5GSk5OSkpGPkJKSkpOUlJOTlJSVlpaWlpaVlZWVlZWVlZWUlJOTlJOQioF4cnJycW5rZ2ZzgYF9fn56dXNzc3RycnFwbGpqamprb3BxcXFxcGxsb3F0dXR1dXNzd4KLkZqipaenpaWknIiCgYCAgICAgICBhYaDgHpybW50en5+en2JkpGPiIOCgH99eHV2dnZ2e4KIiod9dnR4d3BqZGJjZWpucnJzc3JydHR0dHZ2d3d3d3l5eHh3d3h4eXp5eXp6eXt6enp7fHx9fX5+fX19fn5/fn59f39/fX17eXp6enp4eHh4enp6enp6enp5eXl5eXl6e3t7fHx8fHx8fHx7fH19fX1+foCAf39+foCDiIyOj5GSkY6Mi4mKiIaFhYSFhoaIiIeGhYKDhIaFhoWIjJGSkpGRkY+Ni4uMjY6PkZGTlJWTkpGRkpGTk5OUlJWVlJSWlpaWlpWVlJWVlZWUlJSUlJSUk4+HgHp2dXVwbmpnZHCAhIB9fHp1dHR1dXRxc3d0b21oZ2Znam1tbXBubWxucnZ0dXN0dXd+hYqQmKGlqKelpaKUhYCAgICAgICAgICBgICBfndvbHF1en15e4eRko6LhYKBgXp2dXV1dXh+hoqKgXZua2xpZ2ZlYmJlaW11dXR0dHR0dHR0dHR1dXV1dnZ3d3d3d3d3d3h4eXl4enp6e3x8fH19fHx8fn19fn5+fn1/f399fXx6enp6enp6eXl6enp6eXl6enl5eXl5eXp7e3t8fHx8fHx8fHt8fX19fX5+f39/f35+f4KHjI6PkZKSkY6LiIeGh4aGhYaGhoaGh4aDg4SFhYWCg4mOkpKRkI+PjYuMi4yNjo+Rk5OUlZSTkZGSkZOTk5SUlZWWlpWVlZWVlJSUlZWVlZSUlJSUk5ORioF8e3x/gn94cmpmc4KGgn16d3V1dXR0cm9tdX57d3BrZ2VmZ2dpbGxqamttcHV2dnd4fYSIi46WnKOlp6emopCEgICAgICAgICAgIGAgYSEg3tzcXN5e3h7ho6QjImGgoF+d3R1dXV3eoGHhn94cXBvbm9xcnNycnR4enR0dHR0dHR0c3N1dXV1dHR2dnd3d3d3d3d3dnd3d3d3eXl7fHx8fX18fHx8fX1+fn5+f39/f319fXt7e3p6enp6enp6eXl5eXl5enp6enp6e3t7e3t7e3t7e3p7fHx8fX9/f39+fn5+fX18f4aLkJCRkZSUkYuIh4eHh4iIiIiIh4iFhIOChYmHh4aHio6Qjo+Nj46OjY2Mjo6QkZKUlJSWlZWTkpGRkpKUlJSWlpWVlJSVlZSUlJSTk5WVlJSUlJSTkYuDf3x+hYiKiYiEeW91gIOBe3h1dXV3dnRybWhue4OCe3NuamNgYGRmZ2lsamtucHJ1d3qAhYmMjZSaoKOmpqafjoOBgICAgICAgIGCgoGIj5SOg3lzcXZ5dnV8goF/fX1+gHx2dnZ1dXd6gISCd3BydHd3d3p8foKFhYeEdHRzc3R0dHR0dHV1dHR0dHV1dXV1dXV1dnZ3eHh4eHh4eHp7e3t7e3x8fHx8fXx9fn5/f39/fX19e3t7enp6enp6enp5eXl5eXl6enp6enp7e3t7e3t7e3t7ent8fHx9fX19fX5+fn59fX6AhoyPkJCQkJCPi4mJiYmJioqKioqKiYOCgoSHiYmJiIqLjY+NjYyNjYyOj4+Pj5CRk5SUlZaWl5WSkZGSkpSUlJSUlJSTk5SUk5OTkpOTk5OSkpKSk5GMhYGAg4iLi4uNjo2Lh4OGhoR/eXVzdHV3dnNtZ2ZvfIGBfXhwZGJiYWJjZWhpa21vcXN8gYSHi4yNkJedoqWmpp+Ng4GAgICAgICAg4aEg4+Ym5SMgnt0dHFua2praGlpaW5zdHN2dnV1eXuAgXp0c3V3ent+g4iLjImHhIJ0dHNzcnN0dHV1dXV1dXZ2dXV0dHN0dXV1d3d3dnZ3d3h4eXl6ent7e3t8fHx8fX19fn5+fn5+fn58fHt7e3p5eXl7e3t7enp6enp7enp7e3t7fHp7e3t7e3x7e3x8fHx+fn19fX19fX59f4OIjI2Pj4+QkI6MioiKioqKi4qJiomFhIOEh4mLi4uJjI2Pj5COjYmJioyQkZCPkJGTlJaWlpaWlpSTkZGTk5SUlZSTk5KSk5OTk5OTkZGRkZGRkZGRj4qFhIWKjY6OjY2Ojo2NjY2LiYeCfHp7eXh0cWxoZWhven9/eXNqaGdjYGBhZmdnaGltcnuAhYeMjI2PlJqgpKenoZKEgYGAgICBgIGDhISGi5GQj4iBeXFsaWZlYmFhX19iZ21wcXJ0dXZ4fn99dnV2dnh+hIeLjoyKhYJ/enR0c3Nyc3R0dXV1dXV1dHR0dHNzc3R0dXR2dnZ2dnd3eHh5eXp6e3t7e3x8fHx9fX1+f39+fn5+fnx8e3t7enl7e3t7e3t6ent7e3x7e3x8fHx8e3t7e3t7fHx8fHx8fH5+fn59fX19fX+AhImLjY6Nj5CQjYqKiIqKioqLioiIhoOCg4aGh4iIiYuOj5CQj4+Oi4qNj5GSkZCQkZOTlZWWlpeXlZSTk5OTk5OTk5KRkJCRkZGRkZGRkZCQkJCQkI+LiIWIjI2Pjo6NjY6OjY2NjYyLiYiIiYeGhIF8dW1qaGhtdHRua2pub2tqaWlnZ2ZmZ2hrcnh9goaKi4yRl5+jpaOdkYaDg4KBf39+fn58fHt4eHd2dG9vaWZlZGNjYmBdXF9gY2dtcHN1dXh6e3d3e3+DiIuMjo6NioiFgoGAc3N0dHR0dHR1dXV1dHRzc3Nzc3N0dXV2dnZ2dnZ2dnZ2dnh4eXl5ent7e3t7e3t8fX1+fn9+fn59fXt6e3t6enp6e3t6ent7ent7e3x8e3t7fHx8e3t7fXx8fX17e3x8fn5+fn19fH5/goSGiYuNjo6Pj42KiYmJioqKioqKioeFgoOEhYSFh4iJjI6QkpGQkJCMjIyOkJGSkpGRkZKUlZWVl5eWlpSTkpGRkZKSkZCPj5CQkZGQkJCQkJCQkI+PjouIiIqNjo6Ojo2NjY2Ojo6OjIyMjIuKiomJioeEgXx0cHFxb21qbXJzc3F0cm5qZ2VkZGhtcnZ8gIWIiY2SnKGfl5CGgH19fHp5eXp5eHZ1dHRzcW9saGdmZWRkY2NlZmZiYWFhZGdrbnR3e32Bg4eLj5CPj46NiYmJhoWDgoNycnNzdHR0dHV1dXV0dHR0c3Nzc3R0dXZ2dnZ2d3d3d3h4eXl5eXl6e3t7e3t7e3x9fX5+f35+fn19fXx8fHt7e3t7e3t7fHx7fHx8fHx7e3x8fHx9fXt9fHx8fHt7e3t+fn5+fX18foGDhYiJioyNjo+Oi4qJioqKioqKiomGg4KChIeIh4eGh4qMjY2NjY+QkI+NjI6PkJKTk5KRkpSVlZWWlpaWlZSRkJCQjo6NjYyMjo6NjY6OjY2Ojo6Ojo6NjIqJioyNjo2NjY2NjY6Ojo6Ojo2Ni4qKioqJiIiGh4aEhYKBf36AgYKCg4KBe3dyamdkZGZpbnJ3en2EiIyOjIaAfHl5eHp5eXp6enp7e3h5d3Z0cnBsaWlkY2FjZWZoaGdmZGRkZWZobHWCh4qLjo+Qj42Ni4qKiYeGhoWDhHNzc3Nzc3NzdHR1dHNzdHRzc3JzcnN0dHZ2d3d3d3d3eHh5eXp6e3t7e3x8enp6fH19fn5+fn19fX1+fn18fHx8fHx8e3t9fHx8fHx8fHt7fHx9fX5+fX19fX19fHx8fH5+fn59fH5/goWHiYqLjI6Pj4yLioqKiomJioqJh4OBf4KGio2Lh4aHiYuLjIyOj5CQjo2Njo6QkpOSkZCQkpOVlZSUlpWVlZKQkI+OjYyLi4uLi4uMjIyMjIyMjIyMjIyMiomKi42NjY2NjY2NjY2NjY2Njo6NjYuLiYmJiIiIiIiKiomKiYqMjIqJhoaFhH51bmhkZGZpamxvcnl8e3p5eHh4eHl4eHt9foCAgIKDg4OBfXl2dXNwbGllYWBjZ2doamppZ2ZjY2Nma3aBiYuNjI2Njo6Mi4uKiIiHh4WFdHR0dHV1dXV2dnV0dHR0dHNzcnN1dXZ3d3d3d3h4eHh4eHl5eXl5eXt7fHx8fHx9fX1+fn5+fX19fX19fHt7e3x8fHx9fX18fHx8fHx8fHx8fH19fn59fX19fX18fHx8fn5+fn59fYKEh4iKiouMjpCPjYuKioqKiYmHiIaDf4CDhoeKjY6KhoaHiIqLjY6OkJCQjo6OjpCSk5KRkJCRkpOUlZaVlZWVk5GQj4yLi4qJiYmJiYmKioqKioqKioqKi4uKiYiKi4uLi4uLi4uLi4yMjY2Ojo2NjY2MjIqJiIiIiIiIioqKjI+Pj46Ojo6NiYN6b2lnZ2hpaGhrbG5vcXZ2eHh5e32Ah4yRk5KQjIuMi4Z+end3dXJwbmtqaWVlaW1vb21raWZjY2VkZW18hoqMjY2Ojo6Mi4qKiomJh4dzc3R0dXV1dXV1dXR0dHR0c3NydHV2d3d3d3d3eHl6enp6eXl6enp6e3t8fHx8fH18fn5+f399fX18fX18fHx8fX19fX19fHx8fHt7fX5+fn5+fX19fX17e3t7e3x8fHx7e3t8e32Ag4WHiYqLjI6OkJCNiomJiYmKioiFg35+g4aHhoiLjIyJhoaHi42Qjo6PkJCQjo6OkJKSk5KRj4+QkZOUlJSUlJORkJCNjIqIh4iGh4eHh4iIiYmJiYiIiIiIiYqIiIiIiYmJiYmJiYmJiYqNjY6Ojo6OjoyMjIqKiYiIiYmJiYuLjI2Oj46Oj4+OjIV7cGhqaWlqbGxnZ2ptb3Nzd3yCjJKWmJubmJORkpCIfnl4eHl5d3l5dnVvampsbXFxb29ramZjZGRiZXCAiY6Oj4+Pjo2LioqKiYmIiHV1dXV1dXV1dXV1dHR0dHRzc3R1dnZ3eHh4eXl4eXp6e3t6enp6enp7e3x8fHx8fXx+fn5/f35+fXx9fXx8fHx9fX19fX18fHx8fHx9fn5+fn59fX19fXt7e3t7fHx8fHt7e3x+f4KFh4mJi4yNjo6OjoyKiYmJiYiHhX98fYGHiIiIiImLjIyJiIiKi4yMjY+QkJCPj4+QkpKTkpGPj5CRkpOUlJSTk5GQj42MiomIh4aFhYWFhoaHh4eHiIiIiIiJiIeHh4eIiIiIiIiIiIiJiouLjIyOjo6OjIyMioqJioqJiYmJi4uKjI6PkJCPj42LioV7cmxpaGlsbGhlZWdobHF1foaMkJKSk5OUkpCRjYmFhIKDhYaLjIqFfXRwcG9xcnJwcHBuamdkZGNiZnKDjY6Pj4+OjYuKioqJiYqKdnZ1dXZ2dXV2dnZ1dHNzc3R0dHZ4d3l6enl6ent7e3t8fHt7e3t6ent7enp7e319fX1+fn9/f399f3x8fHx9fX19fX19fXx8fHx9fX5+fn5+fXx8fHx7e3t7fHx8fHx8fHx8fX+BhYiJi4uNj4+Pj42NjIuJiYmJh4J+e36BhYuLiomIioqLjIuJiIiJiYqNj5KRkZGRkpKSkpORkZGRkZCQkZKTk5KRkZGOjIyKiYiHhoSDg4OEhYaGhoaEhoiIiIiIiIeGh4eIiYmIiYmJiYmJioqLjYyMjY2NjYyMi4qJiYmJiYmIiomLjY6Pj42NjY2KiIR6cWtmZ2pta2pmY2ZmZ2pucnZ7gYWHi4uNjo2MjIyOjo6PkJGRj4uCd3BtcnZ5eXVxcG9uamdmZmVjaXiFjZGPjY6Mi4qKioqKiop1dXV1dXV1dXZ2dnV0c3NzdHR0dnd4enp7enl5enp6enx8fHx7e3p6e3t7e3x8fX19fX5+f39/f359fHx8fH19fX19fX19fn58fH19fX19fX19fHt8fHt7fHx9fXx8fHx8fHx9f4KGiYuMjY6Pj4+PjYyJiomJiYaBe3p7gISJjIyKiYiJio6Oi4mIiIiKjI+RkZCQkZKTk5KRkpGRkZGRj4+PkJKSkJCQkI6MjIqJiIiGh4aEhISFhoaFhYSGh4eHh4eHhoWFhYOFh4eHh4iIiIiIiIqMi4uMjIuLjIuKiomJiYmJiYiKi4yNjo+Pjo6NjYuKhoaCenBqaWptcXBuZmNjY2RlaGhpbXJ7gISIioyMjI6Ojo+QkZGQjIZ8cm1tdH2BfXl0cG5samloZmZnbXiFjI+PjYyLioqKioqKinR0dnV0dHR0dnZ2dXNzcnJzdXZ2d3l6e3x8fHx9fX19fX19fXx8fHx9fX19fX1+fn5+f39+fn5+fn59fX19e3t8fH19fX19fX5+fX19fH1+fn59fH18fHx8fHt8fHx8fHx8e36BhYiKjI2NjpCQkJCNi4qJiYiHgXl3eX6IioqMjIqIiIiKjY+MiYeHiImLjY6PkJKTk5SUkpGSkZGRkJCPj4+PkI+Pj4+PjY2Mi4iHiIeGh4eFhoWFhYSEhYWGhoeHhoaGhISCgoSHh4eIh4eHh4eIiYqLi4mLi4uMi4qJiYmJiYmJioqKiouNjY2Ojo+Pi4mIiIeHfXFmZmdvcm9rZmZjYmRmZGFjZWhvd3+FiYuNjY2NjpCRkpKSjYJ4cG5yeoOEgXlxbGtubmxpZ2dobniCio6Pj4yLiYmJiYmJd3d2dXZ2dnZ2dnV2dHRzc3R2d3d3eXp7fHx9fX5+fX19fX19fX18fH19fX19fX5+fn5/f35+fn5+fn19fX18fHx8fX19fX19fn6AgH18e31+fnx8fHt7e3p6e3x8fHx8fHx7foOGiYuOjo6PkJCQkIyKiYmIhn95eHuBhoyOjYuMi4mIiYuOkI2KiIqLi4yNjo+Rk5SVlpSSkI+PkJCPj4+Pj46Ojo6Ojo6NjYyLiomJiIiJiIeGhYWFhoaGhoaGhoaGhoaEhIKCgYOEhoeHh4eHh4iIiImJiYuLi4uKiomJiYmJiYmJiYmJiouMjI2NjY2Mi4qKioqHgHVoZWhtcXRxa2ZhYGRpa2pmZGVqcn6GiYuLjIyOj5CSkZGNh393cHB3gIWFgXhua2xwcXBraGhqbXWDioyNjIuJiYmJiYl3d3h4d3d3d3d3dnZ2dnV1dHV2d3h4ent9fn9/fnx9fX19fHx9fXx8fX19fX19fn5+fn5+f39+fn5+fX18fH19fX18fX5+fn5+fn5+fX18fH18fXx7e3t6eXh5enp7fX18fH2AhIiLjY6OkJGPj4+NjYuJiYeCend7goeMjo6MjIuKiImLjo+PjoqJiYmKi46QkZKUlZeYlZORkJCPjo6OkJCPj46MjY2NjI6OjY2NjYuLioqJiYiHhoaFhYeHhoaGhoaGh4eFhIJ+gIKEhoeHiIiHiIiIiYmKiouLiYmJiYqKiYmIiIiIiIiJioqKi4uLi4qKioqKiouJgndoZGZrcXNxbGZlaW1zdnVybnF2foeKjIyMjI6PkZGRkI6Jgnx2cXR7g4aGfnRta3B0eXRtaWlqbHR+h4qLi4qJioqKinh4eHh3d3d3d3d2dnd3d3d2d3l6e3t7fH1+f39/fn5+fX18fH19fX19fX19fX1+fn5+fn5/f39/fn59fX5+fX19fXx9f39+fn5+fn59fX5+fXx8e3p6enl4d3h5ent8fHx8fYCFiYuMjY6QkY+PjouKioqHf3l4eoGIjIyNjYyMi4uKiouOkJGPi4mJiYqNj5GTkpSVlpeXlJOSkY+Ojo6QkI+PjoyMjIyLi4yNjY2Njo6MjIuLiomHh4eHh4eGhoaGhoaHh4aFg4B+gIKFhoeIiIeIiIiJiYmJiYmJiYmJiIiJiYiIiIiIiIiJiIiJiYmJioqKioqKiouKhnpuZ2VmbnZ4c21oam92f4OFhYeJi46Pj4+PkZKSkpGQj4yHgXdwcHiAhIOBeXJsbG92endwamhnZ2x2f4WHiYmKioqKeHh3d3d1d3d3d3d3eHh4eHZ3ent8fn1+fn5/f39/f39+fn19fn59fHx8fX1+fn5+f39/f35+fn5+fn5+fn5+fn99fn5+fn59fX19fX19fXx7e3t7eXl5eHh4d3l6ent7fHx/goaJi4yNj5CRkZGNjIuKiIJ4dXp/h4yMjIuNjo6Ni4qJiIqNj4+Oi4iIiYyPkZCRk5SVlZWVlZOTkI+Pj46Oj4+OjIuLioqLjY2NjI6Oj4+Pj4+OjIqKiYiIhoaGhoaGhoaGh4SDgX18foGGhoiIiIiJiYmJiYmIiIiIiIiIiImJiIiIiIeHh4eHh4iIiIiJiYmJiYmKioqKhn51amNkbnl8eHNuam12foaLjI+Pj4+PkJGSk5OSkY+OjImEd3Bwdn6CgoB9d3JxcHV5e3hxamdnZWhxfoWJiYmJi4t4eHh4eXh4eHd3d3d4eHl5d3h6e3x+fX5+fn9/f39/f35+fX1+fn18fHx9fX19fX1/f39/f39/f35+fn5+fn5+fXx9fX5+fn19fX19fX19fHt7eHh3d3h3d3d2eHp6e3t8fH+Ch4qMjY6PkI+Pjo2Mi4iEfHV2fYSJjIyMi42Ojo2MioiHiI2Pj46Mi4qLjI+Sk5OTk5SUlJWWlZSRkJCQkJCPj46MjIyKiouMjIyNjo6Pj4+QkI+OjIyKiYmIh4eHh4aGhoaGhoSCf3p8f4OFiIiIiImJiYmJiYiIiIiIiIiIiYmIiIiIh4eHh4eHiIiIiIeHiIiJiYiIiIiJiIV7bmJhanh+fHRsam10fYWKjY+Pj4+QkZKTlJORj46MiYV6c3B0e4GEgYB9eXhzcnV5e3ZvaWVjY2h1gYiJiYmJiXp6enp5eHh4eHh3d3h4eXl6eXl7e3x+fn1/f39/f4CAfn59fX19fX19fX19fHx9fn9/gIB/f39/f39/f35+fn59fX19fX19fX9/f399fHx8e3p6eXh4d3V4eHd3eHl4ent8f4SIi4yNjo6QkJCQjo2Lhnx3eHyBiIyNjo6MjI6Ojo2LiomJi4+QkJCOjIuMkJKTlJOTk5SUlZWVlZOQkZKSkZCPjo6OjoyLi4uKi42NjY+Pj46OjoyLiomJiIiIiIaGhYaHh4eHhoSAfXt8f4KEh4eJiYmJiYmIiIiIiImJiYmKiomJh4eGhoaGhoaGhoaGh4eHh4iIiIiJiYqKiod7al5cZnV8e3Vvb25zfYWKjI+QkJCTlZSVkpCOjYyKhn93cnJ5foSDgoCAgXx4dHZ4d3JqZmViZW19hoiJh4iIenp6enl4eHh4eHh4eXl6enp5ent7fH5+fX9/f39/f3+AgH5+fX19fX19fX19fX1+f39/f39/f39/f35+fn5+fn19fX19fX19fn5+fnx9fHx6eXl5eHh3dXZ2dnZ2d3h6ent+g4iLjI2Ojo6OjY2Ni4V+dXZ6gIWKjI2MjIyMi4yNjY2LioqMjpCRkZCOjY2PkpOUk5OTk5OUlJSUkpGSk5KRkI+Ojo+Pj46MjIyMjY2Nj4+Pjo2MioqKiYiIiIeHhoaFhoeHh4eHhoOAf35/gIOFh4mJiYmJiYiIiIiIiIiJiYiIiIiHh4aGhoaGhoeHh4eHh4eHiIiIiImJioqKiod+bl9cXmdxe3x2cG5zfYSLjZCSlJaXl5aTkY+NjIqGg3t1cnV7gIKCgYOHhoJ6d3d4eHJramdlaneBh4iGh4d7e3l5eHh4eHl5eXl5eXp6enx8fH19fX19f39/f3+BgX9/fn59fX19fX1+fn19f39/f39/gH5/f39+gIB+fn5+f39/f359fX18fHx8fHx8e3p5d3h4d3V1dnZ1dXZ2eHl5e36Ch4qMjY2MjIyJioyIgnh1eX+Dh4qMjYyMi4qLjI2OjoyLjIyNkJKTk5GQj5CRkpOUk5OTk5OSk5ORkI+QkpKRkJCQj5CRkY+PjY2NjY2Njo2NjIuLiYiKiYeHh4aEhIWFhoeGhoeGhoSCgICAgoKGiImJiIiIiIiIiIiIiIiIiIiHh4eGh4eHh4eHh4eIiIiIiIiIiImJiYqKiomKjIp9aF5ZWmN1fXp1cW50fYaNkJOUl5iXlpSSj4+Ni4iEfXZycnV7gYGChIeMioB4dnh2c29taWVmcXuFhoeGhnt7eXl4eHh4eXl6ent7enp7fH19fX19fX1/f39/f4CAf39/f39/f39/f39/fX1/f39/f3+Afn9/f35+fn5+fn5/f39/fn19fXx8fHx8fHt6enl3eHd2dXV2dnV1dnd3eHh6fYGGiYuMi4mIiImKjIh+dnh9hIeIiouMjIyMi42Ojo6OjYyMjo+QkJCSkZCQkJGSkpOTk5OTkpGSko+OjpCSkpGQkJCPkJGRkZGPj46Ojo6OjYyLi4qJh4aGh4eHhoSEhYWEhoaGh4aGhYWEg4KCgoSHiIiIiIiIiIiHh4eHiIiIiIeHh4aHh4eHh4eHh4iIiIiIiIiIiYmJioqKiYqLjIp7aFxXWGN0fX55dG9yfYaNkZWYl5eWlJKPjoyJiYN/eXNtb3Z7fX+AhoyOi4R8d3Z1cW5rZ2Zpc36EhISEClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3Rlc3QvZGF0YS9iYWxpXzY0MHgzNjBfUDQyMi55dXYgYi9zcmMvbWVkaWEvdGVzdC9kYXRhL2JhbGlfNjQweDM2MF9QNDIyLnl1dgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc2MTZjYS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvdGVzdC9kYXRhL2JhbGlfNjQweDM2MF9QNDIyLnl1dgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLURFSEtMTE1OTlBQUFBRU1FTUlJSU1NSUlFTUVFQT05NTEpLSkdHRkNBQT4+Ojs6Ozs4ODg4ODg5OTk4OTo6OTg4Ojk3Njc3NTU1NDQyMTExMDAuLi0tKyspJykpKCgpKSgoKCgnJygoKCgnKCkpKSkqKisrLCwqKisrLCwsLCwsLCwrKysrKikpKSkpKSkpKSkpKCgnJyYmJiYmJiYmJiYmJiYmJiYmJicnJiYmJiYmJiYmJicnJycnJycoKCkrLCwtLzAyMjQ1NTc3Nzg4OTk5OTk5OTk6Ojk5OTk6Ojg4NzY2Nzc6PkVKUVlhaGxxdXd4eHd1cW1qaGhnaGpsbm5vb29vcG9wb3FzdHd5fH5+fn58eHJsZFlOQTQuLCkrKysrLCorKysuNDpCT1plbnh+g4aFg4J9d21nWEg7LyklJCQjJCUlJyouMTc4PkNMU15lbXR7gIB8enVvaWFZU09SUVRUUVNMRD02MCclIyQkIiIjIiIiISEjISIhICMlJigrMDc9REtQV15jZ2xyd3h5eHd1dnZ1dXVva19XS0ZBPz9AQEBAQEA/Pz8/PT06OTk5NzU1NDMxMDAvMDM5PENOVl1mbHF0eXt8enp2cm1kXU9FOTIsKykoKCcnJycmKCgoKSkpKyotMDEyMzY3Nzg9Pj9DRkZKTlVcYmtwdHh6e31/f4GCgoKDg4GBgYGAgH59e3l6dnR0eHt/gIKDhoiHh4WDfnx6eHV0dHmAhIaFg4ODgHx4cGZYSj00Ly4tLDAzOD1ETlpia3N4fICCgYCBgYODgoJ/fn17eXZ3d3p6fIGEiIqLi4uKioqKiIeHh4iIiIaAeXBkWE9IRUE+PDtGSUlMTExNTk5QUFBQUVJRVFNSUlNTUlJSUlFRUE9OTUxKSkhISEVBQUA9PDs8PDo4Ojo6Ojo4OTk5OTo6Ojk4ODg4ODc2NjY1NTQ0MjExMTAwLi4tLSsrKigpKSgoKSkoKCgoJycoKCgoJygpKSkpKiorKywsLCwrKywsLCwsLCwsKysrKyopKSkpKSkpKSkpKSgoJycmJiYmJiYmJiYmJiYmJiYmJiYnJyYmJiYmJiYmJiYnJycnJycnKCgpKywtLzAxMTI0NTU3ODg4ODk5OTk5OTk5Ojo5OTk5Ojo5OTk4Nzg7PURLUVlfZ29zeXp8fHx6dHFsamtrbG1vb3Bwb29tbGtqampra29yd3p+gYB+fn53c2tgVUg8MisqKysrKysrLCwrLDE3P0pWYW13fYGFhoWEgXt0a15QPzMqJiQkJCUmKCwvMjU4PUFFSlJaY2pyfICBgH96dW5kWlNPTVRicGZWTkU9NikjJCMjIyIiIyIiIiEhIyIiISEiJCYrLTQ9Q0pQVlxiZWxxdXl6e3p3dXZ2dXV1c2thVktFQj8/QEBAQEBAPz8/Pz4+PDo6Ojc1NTQzMTAwMDExNjxDTVVdZmxxdHl7fHp6d3ZvZl5SRzszLispKCgnJycnJicoKCkpKSssLi4wMDM1Njg5Oz1BQkRHS09YXmRrcHR5fX6AgoKEhIaGh4eGhoSEgoB+fXx7d3NycnZ5en1/g4SFhYWFg399e3l5eHl+hYaGhYWCgn97dW1iUkQ5Mi8uLi4wMzg9Qk1YYmtzeHyAgoGAf4GBgYGAf3x6d3d0c3N2eHp/hIiLjYuLi4uLi4mIiIiJiYiGgXhuYldOSUZBPjw7SEhJS0xMTk9PT1BQUVFRUlFTUlJSUlJSUVBQUE5NTEtKSkhHRURBQEA+PTw7Ojg6OTg5OTg5OTo5OTk5Ojo5OTk5ODg3NzY2NTUzMzIxMDAvLy4uLSwsKysqKCgoKCgoKCgoKCgoKCgpKSkpKSkpKSoqLCwsLCwsLCwtLSwsLCwsLCwsLCwrKisrKiopKSkpKSkoKCcnJycnJycnJiYmJignJygnJScmJycmJiYmJiYnJyYmJycnJygoKCgpKSosLi4wMTMzNDU1NTg4ODg5OTk5ODg5OTk5OTk5OTk6OTk3Nzg7PkNHT1VeYmpxdnt9fX57eHZwbmxsa2xtbm9vbW1raWdlY2FeYWRqbXJ3e4CCgoJ/fHZxaV5RQjYuKisqKiorKysrKyswNT1FUV9qcnuAhYiGhoJ9eG5jVEU2LSYkJCUmJywvMTQ4PT5CREhMVV5lb3eAhISDf3pzaGBWUE5dZXV2b2BmeXNAJCEjIyMjIyMiIiIiISIiIiMjJCQqLjM5QUdNU1tgZWpwc3h7fXx4dnZ1dnZ2c29qYFRNREA/Pz8/QEA/Pz8/QD49PTw7Ojo3NTU0MjEvMC4uMjg7Qk1UXGhucnV4fH59fHt2cWljVko+NC4rKSkpKCgnJygoKCgpKSorLC0wMTEzNDU4OT0+QEFFSk1TWl9ma3J2e3+Cg4ODhYaHh4iGhYWEhoF/fXx6d3RycHBxdXZ5fX+Dg4WFhYF+fnt5enp7gYaHh4aChIF9eXJqXE4+NTEtLCwuMDM3PENNV2Bpcnh8f4GBgX+AgIB/f317eHd0cm9vcnV4f4SJioqMjI2NioqKioqKiYmJh4B3a15TTklGQT47OklKSktNTE5PT09QUFFRUVJTUlJSUVFQUFBQT09NTEtLSUlHRkRDQUA/Pjw7Ozo5OTc3OTk5Ojo6OTk4Ojo6OTk5OTg4Nzc2NjQzMzMyMTAwLi4uLi4uLSwrKikpKCgpKSgoKCgoKCgoKSkpKSkpKSkqKiwsLCwsLCwsLS0sLCwsLCwsLCwsKyorKyoqKikpKSkpKCgoJycnJycnJyYmJiYoKCgoJyYnJycmJiYmJiYmJycmJicnJycoKCgoKSkpKy0vMDEyMjM1NTU0Njg4OTk5OTg4OTk5OTk5OTk7Ojk5Nzc6Oj9ESlJZXmZsc3h8fn18eXZzbmxqamloaGlmZmVmZGBeWlhVVVhcYWVsdXqAgoKCgX58dm1iV0k7NCwqLCoqKioqKisrLjI4QU5YY295gIaIh4eDfn10altNPTApJCQkJSsuMTY4Oz9CRENGS09YZG11foOGhoJ9d25jV09XbGBpbHBrZHd/XkkrISQjIyMjIiIiIiEiIiIjIiUoLjM7QEZNUllfY2ducXV5fXx7eXZ2dnd3d3VwaGBUS0RCPz8/P0BAPz8/Pz49PT08Ozo6NzU1NDExLi8uLjI3O0JKVFxmbnJ1eHd6fn18d3NsY1pOPzgxKygpKSgoJycpKSgoKSkqKy0uMDEzMzM0Njc5Pj5ESU5TWV9haW10eH2Ag4SGhoeIiYiIiIWFg4GAfnx5dnRxb29vcHBzdXh/g4OEhIOBfn59e3x8foGGhoaFhIKAe3ZvZlhJOzMvLzAuLjAyNTpCTVVeZ3B3fH+Af39+fn9+fnx7eHZ0cW1sbG5ydnuBh4mKi4uMjIqKioqKiouLioWAd2pdUktHRUI/PDtISUpKTExNTk9PT09RUVJSUlFSUlFRUFBQT1BPTEpKSkhHR0VDQUA/Pj08Ozo5Ojo4ODg4ODk6Ojo6Ojo6Ojk5ODg4ODY1NTQ0MzIyMjEwMDAwLy8tLS0tLCspKSkoKCgoKCgoKCgoKCgpKSkpKSkpKioqKiwsLCwsLCwsLCwsLCwsLCwsLCwrKiorKyooKSkqKCkpKSkoKCcnJycnJycnJycnJycnJycnJycnJiYnJycnJycnJygoKCgoKCoqKistLS4xMTEyNDU1Njc4ODg4OTk5OTk5Ojo5ODk5OTk4NzY5OjtARUxTWWBmbXN2eXt5dndzcGtoZWRkX19eXl5eX11aV1RST05PU1hfZnB6gISDhISBfXhxbFxPQjgvKyoqKioqKysrLC0yOD9JV2Ftd4CHioqIh4N7dm1fUkI0KiUlJSguMjQ5PEBDREVERklOVV9pcXqChoeEgHlyaV1VXGlqcVlJUmlxY1JXRyEgISQjIyIiIiMiIiIiIiYoLTQ7P0VLU1ddYmRpbnR5enx8e3h3d3d3eHdzb2pfVEpEPz8/Pj4/Pz8/Pz8+Pj09PDo5OTc1NDMyMTEvLy8wNjpAS1NcZWtydnd5e317enp3cWdcT0I4MS0rKSkoKCcnKCgnKSgqKissLS8wMjMyNDc5Oj9ESE5SWWBkZ21ydnt/goWGiIiKiomJiIiGhYOAfn14dnRwbGtqamttb3R7f4KCg4OBf4B+fX19foKFhoaEg4KAf3pzbGJSQzgyLy4uLi4vMjY7Qk1XYWlxd3p+gH9/fn1/f317d3Vzcm1paWltcXZ8f4SKioqKi4uJiYmJi4uLioqFf3ZnWk5IR0VDQD48SkpLSkxMTk5PT1BQT09QUlJRUFBRUVBQUE9PTUxKSkpIR0VEQ0FAPz49PDs7Ojo6OTk4ODk6Ojo6Ojo6Ojo5OTg4ODg3NjU0MzMyMjEwMDAwMC8vLy8tLSwrKikpKCgoKCgpKSgoKCgoKCkpKSkrKyoqKyssLCwsLCwsLCwsLS0sLCwsLCwsKysrKyssKikpKSkpKSkpKCgnJycnKCgoKCcnJycnJycnJycnJycnKCgnJycnJycoKCgoKSkqKisrLS0uMDEwMzMzMzU2Nzg4ODk5OTk5OTo6OTg5OTg4Nzc3ODo7QEVKUFlhaW91dnZ2dHFvbGZjX1pZWVhYWlpYWFlZWFVPTUpHRUhQWWNqc3uBgoODgYB9dm1jV0k8Mi4tKioqKisrKywsMDc8RlNga3V+hYmKiIeEf3lyZFdHNi0pKSkuMTU4Oj9CREZFRkZMTlJZZG93foOFhYF7dGtgXGRqa2VXTFFpW09OVlxZVCYiIiQkJCMjJCIiIiQoLTQ6QEVLUVddXmJobHF2eXp8fHp6d3d3d3Z1dHBqYFNJQ0E9PT4+Pj4+Pj4+Pj49PDs6OTk3NTQzMjMxMS4uLzM4P0lSXGZtcHR3ent7fXx6dnFpX1JHOjIuKSkpKCgoJygoKikqKyssLC0uLzEzMzY5O0BGS1BVWl9kaG1xdnp9goSFh4eIioqKiomHhYOAf3p4dnRva2hnZWVnam1ze3+CgoKBgH5+foF/f4CDhoeGhIOEgH14cmleT0A3MS4tLi4vMjI2O0NNWGFpcXV6fX5+fn5+fXt6eXdzbW1rZ2dnam5xeH+Eh4qKioqKiYmIiIqLi4uIhX51aFtOSUdEQ0A/QEtLS01NTU1PT09QUFBQUlNRUVBQUFBPT1BPTU1LS0lJSEZFREJBPz49PTw7Ozs5OTg4OTk6Ojo6Ojo6Ojo6OTk4ODg4NzY1NTMyMTExMTExMTEwMC8uLS0sLCsrKioqKioqKSkqKigoKSkqKioqKiorKywsLS0tLS0tLSwsLC0tLCwtLSwsLCwtLSsrLCwqKisrKSkpKSgoKCgoKCgoKCgoKCcnJygoKCgoJyYmJicnKCcnJygoKCgoKCgpKiorKywsLC0vMDEyMzM0NjY3OTk4ODg4ODg6Ojg4OTg2NjU1Njc4Oj5CR05XX2dtcW9vbWtoZ2JeWFdUU1JVVVdXWFhWVlVQS0ZCPjxBR1FdZm93f4GFhYKBgHtzaV5QQjYwLCwqKysrKisrLC00OUJPW2h0fISJi4mHhoJ8dGpdTz4xKysvNDc5PD5CQ0VGRkdHSUxQWGBqcnuBhIWDfHVsYl5gU1tOVVRFT1NKRkRjamRaJSEkJCQkJCQjJCYpMDM4P0VMUVZbXmBlaW1xc3R3enp6eXd2dnd4eHVxa2BSSkM/PDw9PT4+Pj4+Pj09Ozs8Ojc3ODY0MzIyMTAuLy4zNz5IUVtjbHF0dnh6fX58enh0a2FSRz00MCwpKCgoKCgpKSsrKywsLC0uLi8xNDY6P0VJT1JXXGFmaW5zdXh+goWHh4eHiIuLiomIhYJ/fXt3c3Bua2loZGJjZ2ludHt/gIKCgICAf36BgICChYiIhoWEg4B9d3FlWUs9NjEtLi4tLjE0OD1GT1hgaXF2fH19fXx9fH15d3dzbmtqZ2ZjY2VqcXd+hIeKioqJiYmJiIiLi4yLiYN9dGVaUkpIR0RCQD9KSUxMTUxQTk9PUFBQUE9QUVFQUFBQT09PTU1NS0pKSEZEQ0JAPz49PT09PDs7Ojo4ODk5Ojo6Ojo6Ojo6Ojk5ODg4ODc2NTUzMjExMTExMTExMDAvLi0tLCwrKyoqKioqKikpKiopKSkpKioqKioqKystLS0tLS0tLS0sLS0tLS4uLS0tLCwsLS0rKywsKysrKykpKSkoKCgoKCgoKCgoKCgnJycoKCgoKCcmJSYnJygnJycoKCgoKCgoKSoqKyssLCwtLzExMTIzMzU1Njg4ODg4ODg4OTk4ODg3NTU0NTU2Njk9QUVLU15laGhmZmVkYl1aVVJTUlFSUlJWVldXVlNQTUdBPTg3OUFKV2Frc32AgoWCgoB8dm9lWUc6Mi4sKisrKyorKyssMTc/S1hkcXyDiIqIh4aCfHVtYlJBNC8vMjY5PT9CREdGR0dISEhLUFZbZW11foKEgnx4bmNgVU5HOkNANTk6PkBDS1RdUyMjJCUlJCQkJiYqLjU7P0dMUVhaXWBjZmdrb3FzdXl5enl2dXZ1dnZ1cGheUUhBPTw8PDw9PT09PT08PDs6OTg3Nzc1NDMyMjAvLy4uMjg9RlJaY2txdnV3e319fHx7dGxiV0s8NDEtKSgqKioqKikrKyssLCwuLy8yNTg9QkVLUFRZXmNobXBzdnx+goSHh4aHiIiKioqJhoOAfXl1cW9samdkYV9gY2dqbnR5fX+AgH+AgICAg4KChYiJiIaFhICBfXZuY1dKPDczLi8vLi8xNTg+Rk9bY2pwd3t9fn18fHt6eHVyb2pnZmNiYGBkaXB2foSHioqKiYmJiYiKiIuMi4iFfnRnWVFLSEdEQkFAS0tOTk1NT09PT1BQUFFRUVFPUFBQUE9PTExNTE1KSEZFQ0JBPz8/PT49PDw8PDs7Ozs6Ojo6Ojo7Ozs7Ojo6Ojg4Nzc3NDQ0MzIyMjExMjIyMjAwMDAuLi0sLCwqKikpKioqKioqKCopKSkqKiorKyoqLCwsLS0tLS0uLi4uLi4uLi4uLS0tLSwsLCsrKysrKyspKSkpKSgpKSgoKCgnJykpKCgoKCgoKCgoKCgoKCgnJygoKCgoKCgoKCkqKisrLCwrLC0tMDIxMTIyNDQ1Njc3ODg3Nzc3Nzc2NjU1NDQzNTY4Oj5DSlJZX2JkYmBgXlxaV1RSUFBRU1RUVVVWVlNQTUdDOzUxMjQ7RVBcaHF5foOCg4CAfXdwal5QQTYvKyoqKiooKiorKy83PEZUYG14gIaHiIeGg4F5cGVZSjs0MzY5Oz9ERkdHSEhJSUlISUxRVl9ncXp/gYF9dW1kYFRVV0Q7MkNaLy0wQVFFTUw4IiUlJSUkJCcqMDQ7QUZMUlZbXl9iZGVpampscXR2eHh4c3N1dHR0cm1pX1FIQDw7Ojs7Ozs6Ozs7Ozs6OTg4NzY1MzQyMjIxMDAuLzE5PUROWmFpcXV2eHp8fHx8eXRsY1pNQDgxLSspKSkqKCsrKywsLC0vLy8yNjo+REhOU1heY2lrb3N1fH1/g4SEhoaGiImJiYmJhoSBfHd0cGpoZmNhXl1fY2dpbW91e39/gH9/foGAgYSDhYeJioiGhoODgHx1bGFURjs3NDAvMC4wMjY9QkhSXGRpcHh8fX1+fXx7d3Vxb2xnZF9cXFxcYWlvdn2FiYmKiYiIh4eIiouLjYyJhHxzZ1xRSklGRUNBQExMTk5NTU9PT09QUFBRUVFSUVBQUFBPTUxMS0xKSEhGREJAQD8/Pj8+PTw8PDw7Ozs7Ojo6Ojo6Ozs7Ozo6Ojo4ODc3NzQ0NDMyMjIxMTIyMTEwMDAwLi4uLiwsKioqKioqKioqKigqKikpKioqKysqKiwsLCwtLS0tLi4uLi4uLi4uLi4uLS0sLCwrKysrKysrKioqKSkpKSkoKCgoKSkpKSgoKCgoKCgoKCgoKCgoJycoKCgoKCgoKCgpKiorKywsKywtLS4uMDAxMTI0NDU3Nzg4Nzc3NzY2NTU0NDMzMzM0Njk9QklOVVdWV1pbW1taWlZVU1NTU1RVVVdYVlVST0lDPTYwLS0yN0BLVmNtdn2CgIOBgH96c21jVkk7Mi0qKiorKikqKysuMjlEUV5ndH2Dh4iHhoOBfHNrX1FDOTc6PT9DRUVHR0dHSUlJSUlJSU5XYGpzeX+BdmhrcGRdXVtNRUJXWSgrNDw7Nz1ESyclJSUlJigqMDU6QEdMUldcXWBiZGRnZWVmaWxwc3Z2dnNzdXR1dXJtZlxQR0A8OTk5Ojs7Ojs7Ozs7Ojk6Ojc2NTM0MjIyMC8vLi8yNzxETlhiaXF1dnh6fHx8fHlzbmZbTkM4MissLCsrKikrKyssLS4uMDEzOT1DSE1RV1xgZmpucXZ6fH6AgIKEhIaGhoeIiIiHhoSBfXdza2dlYWBcXFxeYmVoa25wdHp+f35+fX6BgYOGhoeJiYmIhoWFgn98dWxhVEY9ODY0MjAwMjQ5PkZMVV1lbXN3fH18fXx6d3VybWplYl9bWVlYWmBqbXZ+hYiJiomIiIeHh4mMi4yMiIJ8c2ddUkxKRkVDQD5NTU5OTk5PT09PUFBQUVFRUVFRUU9PTk5NTUtISUdEQkFAQEA/Pz8/Pj08Ozw8PDw8PDs7Ozs6Ojo6Ozs6Ojk4OTk3NzY1NDMyMjMzMjIxMTEwLjAxMS8vLy8tLCwsLCwrKyoqKioqKisrKysqKioqKysrKywsLS0tLS8vLS4vLy4tLi4uLi0tLSwtLCsrKysqKioqKSgoKCkpKSkoKCgoKSkpKCgoKCgoKCgoKCgoKCgoKCgoKCkpKSkpKSkqKiosLCsrLCwtLS8vLzMzNDU0NTU2NjY2NjY0NDU1NDQzMjExMjU3Oz9FS09VVlVZW1tcW1pXV1VWVlZWV1dYV1ZTT0tGPTcxLCorLjM7RlBdZ3F4gYGDgH9+e3dwaV1QQTMuKiopKiopKSoqLDI5QEtXZG55gIeIh4aEgXx0bWVXSkI/PkBDRkdHSUlKSkpKSEhGRkVHTVdjbXd8fXNrZWlgZWRgVkE8QzoxKjIuLDA8QWIyJSUmJigtMDY6QEZMU1haXl9iY2RkZGJhY2RqbXJ0c3R0c3Nzc3NwbWVbUEQ9OTg4ODg5Ojs6Ojo6Ojk5ODg3NTU0MjIyMS8wMC8wMTY7RU1YYWlwdXZ4eXp7fHx5eHFoX1NEOjMuLS0rKywsLCwtLi4vMTM5PUFGTFBWW2Flam5ydnl8f4GBgYGChIWEhYeHh4eHhoSAfHtzamdiXVtZWl1fY2Voa21wc3Z6fH19fX1+gYOEiIaJioqKiIeFg4OBfHVrYFNGPjk4NTQxMTQ3PURKU1lhZm51en1+fHx7e3hzcGpnYV9aWFNSU1ZeaG13gIaJiomIiIaGh4eJiouLiYaCfXNoXFJNSEdEQ0FATU1OTlBQT09PT1BQUVJRUVFRTk5NTU1NTExKSEdFQkFAPz8/QEA+PT49Ozw8PDw8Ojk7Ozs7Ojo6Ojk5Ojo5ODc3Nzc2NTQzMjIzMzIyMTExMC4wMTExLy8vLSwsLCsrKiorKyoqKiorKysrKioqKisrKyssLC0tLi4tLS0uLy8uLS4uLi4tLS0tLSwrKysrKysqKikpKSkpKSkpKCgoKCkpKSgoKCgoKCgoKCgoKCgpKSgoKCgpKSkpKSkpKioqKiorKywsLS0vMDEwMDE0MzU1NjY2NjY2NDQ0NDMzMjEwMDE0Njo+RElOUVVWWltbXFxcWVlYWFhYV1daWFdUUk1HQTk0LiopKy0wN0BLV2FsdX2BgoF/fn15dG1kVUc6MCsqKioqKioqKiowNz1FU2Bqd36DhoaFhIF8d29oYFRKRUJERUdISElJSkpLS0hHQkJCQkVQW2d0dG9pZmxnZWdlWEpDQEc5MTIzLDk8RUljSyUlKCosMTg7QUdMUlZZXl9hYWNkZWBdXFxeZGhucXR1dHNzc3Nzb2pkWkxBPTs4ODc3ODk5ODg4ODg3NzY2NjU1NTMyMjEvMC8uLjI2O0ROWWJpcHV2eHl6e3x8fHhyaV9TSTw3MS8vLS0tLS4uLy8xMzc7QUZLT1VbX2VqbnJ1d3x+f4GBgYGBgoKEhYaFhYaGg4OBfnp1bWdgW1hZWlxfYmVoa2xvcXR3e3t9fXx+foGDhomJiYqKiIeHh4eEgnx1al9SRT86OTY1NTQ3O0FIUFZcY2pzeH1/f3x8fHp3c21oYFtYVVJQT09TXGZtd4GIiYmJiIeGhoeHiYqKiIeFgXtzaF5STUhGQ0JAP01NT09RUVFQT09PT1BQT09QUE9OTExLSUpJR0ZEQkFCQEA/Pz8/QEA9PT08PT09PTw8Ozs6Ojo6Ojo4ODg4OTg3NzY2NjU0NDMzMzMyMjIwMjIwMjIyMDAvLi4tLCwsLCwsKysqKiwsKyoqKioqKysrKywsLS0uLi4uLi4uLi4vLy8uLi4uLSwtLS0sLCwrKysrKioqKikpKSkpKSkpKCgpKSkpKSkpKSgoKCgoKCgoKCgoKCgoKSkpJykpKSoqKisrKysrLCwtLS0uLy8xMjMxNDU1NjY1NTQyNDMzMTIxLi8yNTY5PkRITFFVWFxeXl1eXVtZWVlZWFdZWFlUU09JQj02LisoKCkqLjQ7RlJeaHF5gIGBf359e3ZwaFxOQDQtKikqKikqKioqLjY6QlBcaHF8goWFhYN/fXt1bmRaUUtGRkZISElJSUpKSklHRD48Oz1ASlZjdGloaWdjZmRgXkIzTFNYPEBSU0Q8OkNIWGZVPCQsMDg9QkVLUVdbXWRmZWVlYFxcV1VWWV1kanF0dnRzc3RycGxpYldKQDs2NjY2Nzg4ODg3Nzc3NjY2NjU0MzMxLy8xMC8vLS8xNDpDTVZfZ290d3d5e3t7e3x5c2xhVko9NzQwLy8vLy8uLzAyNTpARUtRV1xgZWttcnR5e35+f35+foCAgYKDg4SDhISDhIOCgHp2cWhfWVZWWVxfY2Zpa21ub3F0d3t7e3t7fX+ChIiKi4yMi4mGhoeHg4F7dGpeUklBPDs6ODg4Oz5FTFNZYGZtdHp8fn19fHt3dG9sY11WU09NSUhMUVplbXiCh4qKiYiGhoeGiImJiYiHhH55cWpfVE5IRUNBPz5NTU9PUFBQT09PT09QUE9PTk5OTUxLS0pJR0ZEQkFAP0BAPz8/P0BAPz49PD09PT08PDs7Ojo6Ojo6Ojk5Ojg3Nzc2NjY1NDQ0NDMzMzIyMzIyMjIxMTAwMC8uLSwsLS0sLCsrKyssLCwrKioqKisrKyssLC0tLi4uLi4uLi4uLy8vLi4uLi0sLS0tLCwsKysrKyorKiopKSkpKSkpKSgoKCgpKSkpKSkoKCgoKCgoKCgoKCgoKCkpKScpKSkqKiorKysrKyssLC4uLS4vMDEwMTIyMjMzMzMyMjMyMTExMC4vMjU2OT9FSk5UWFpcX19gYF5cW1tbW1lYWVtYVlFMRT02LyopKSkpKSwwN0FMWGJudX2AgYB+fn15c21jVUk5MCopKSkoKSoqKiowNz5JV2Rud36DhISDf398d3FrYVhQSUdHSEhJSkpKSktKRUA8OTY5O0VTXnBvb2tpZWBdWVNNSUpMU2BgX19YS0E4KztSbm41KDc8QkZOWVlbYGxpVE1WYVtbYVJQUFVaYWlwdXV0c3RycG9uaGBVST84NTY2NTY3NzY2NjY2NjU1NDQzMzIyMjAvLy8uLi4vMDQ6Q01WX2dvdHd5d3l7e3t8eXNtY1lMQDo2MjExMTExMTM0OD1ESVBUXGBmaW1ydXl8f39+fX19fX+AgICBg4ODgoKCgoF/f3x5dGxkXVhXWVxeYmZpa21vb3Bydnl8ent7fHx/goSIi4uMjIuJh4eHh4OBe3RqXlBHQz8+PTs7PkBDSlFYXWVqcXZ7fn59fX17dnJtZmBZUk1KRUNDSFFcZXF8hIiHiImIhoaGh4iJiYmGhYJ+d3NpX1RNR0RCQEA+Tk5PT09PTk5PT09OUFBRUE5OTExKSklIR0ZDQUBAQEA/Pj8/Pz8/Pj8/Pj09PTw8PDw8PDo6Ozs6Ojs7Ojk4ODc3NzY1NjUyMzM0NDMzNDQzMzIyMjExMTAvLy0tLC4uLS0sLCwsLCsqKioqKiorKysrLCwtLS4uLi4uLi4uMDAvLy4uLi4sLS0tLCwsLCwsKiwrKikpKSkpKSkpKSkpKSkpKCgpKSgoKCgoKCgoKCgpKSgoKCgpKSoqKSkpKSopKioqKisrKysrLCwtLy8vLy8wMTExMTIyMTIyMTEwLy4wMTE0OTxAR0xSVlpeXl9gYWFgXl1dXVtZWVtaWFNOR0I6MysoKSkpKSkqLjM7RlNeaXR6f4GBf39+e3dvZ1tOPjMqKSkpKioqKioqLzU8RFNgbHZ8gYODg4B/fHh1b2dcUktISEhJS0tLS0pIRUE8ODIyMTZBUF9hbmlSaGRaVFJHUVFKUVlhYmFhYF1VPzQ8SVtycjo2PklMY21oY213Sk9LVFpbWVdKSUtOVmBpcXV3dXd0c3Nxa2heU0Y8NjQzMzQ0NTU0NDQ0NTU1NTUzMjIxMjAwLy4sLi4vLi80OkNMVV5nbnN3d3p4eXp7fHx0b2RaUUM7NjYzMjIyMzI3OkBGTVVZYGVrb3R3enyAgH9+f359fX9/fn+AgIKCgoGAgH99fXt4dHBoZFtZWlpdYWZpbG9vcXJydHZ5fH18fHx7f4OFiYqNjY2LiYeHhoaDgXtyalxQSURCQUE/QUFGSVFWXWJob3V5f31+fn17eHRwamNbU0xGQz89P0RPW2dzfoSIiIiJh4WFhoeIiYiHhIKBfXlza2FVTUVCQT8+Pk5OT09PT05OT09PT1BQT05MTEtLSkpIR0RCQEBAPj4+Pj4/Pz8/Pz4/Pz89PT08PDw8PDw6Ojs7Ojo5OTg4ODg3Nzc2NTY1NTY1MzM0NDU1MzMyMjIxMTEwLy8vLi0uLi4uLS0sLCwrKysqKioqKysrKywsLS0uLi4uLi4uLjAwLy8uLi4tLC0tLSwsLCwsLCwsLCopKSkpKSkpKSkpKSkpKSgoKSkoKCgoKCgoKCgoKSkoKCgoKSkqKikpKSkpKCkpKSkrKysrKissLS0tLi8vMDExMTExMTAxMTAwLy8uMDEyNjo9Q0dPVFlcXmBhYmNjYV9fX1xbW1paWlVOS0M9NS4qJygoKCgoKSwwN0FNWGRudn1/gH99fn15c2xhVEU3LSopKSkpKioqKi0zOUJNW2Zxe4CChIJ/gH16dXBpYFdQTUpKSUtLS0pJRkE9ODQvLSwxO1FpcnNtTV1hV1VPTlBNR0JOVmJgWFVYXVQ9OUJUXnFaTE9bbX53gGpoW1libXB3dGRcUEBBSlRfa3N1d3Z2dHNzcWtoXlNGPDY0MjIzMzIyMjIzMzMzMzM0MzIyMTAvLS4uLC0tLCwtMzhASFNcaG9zd3h4eXl6e3t7dG5pXVNHPjg3NjU1NTY6P0RKT1deZGlvdHh6gIGCgH9+fXx8fX1+fn+BgYGBgYF/fX1+enl3c3FuZ2JcWVldYWNnbG1wcnJyc3V4e319enp7fH+DiIqNj5COjIeHh4aGg4F7cmpcUk5IRkZGRUdJS09XXmNmbHJ4fH5+fn17e3l0bWZeWE9HQT05OjxGUlxod4KGiIiIiIeFhYeHiYmIh4WCgHt2cmthVU1FQUA+Pj5PT05OT09PT1BQT1BOTU5MS0pJSEZGRkRCQkBAPz8+Pj09Pj4/P0BAPj0+Pj09PT08PDw8Ozo8PDs7Ozs4ODg3Nzc2NjU1NTU1NTU1NTQ1NTQ0MzIyMjIyMTAwMDAuLzAuLS0sLC0sLCwsLCwrKioqKyssLC0tLS0tLS8vMDAwMS4uLi4tLC0tLi4tLS0sLCwsLCsrKioqKikpKCgoKCgoKCgoKCkpKiopKSgoKSkoKCkpKCgoKCkpKSkpKSkpKSkqKisrKysqKSkqLS0tLi4uLi8vMDExMTEwMC8vLzAuLzAxMzc9QUZMUFZaXmBiZGVkZGFiYWFfXFtaWVlUT0Y/OS8qKCcoJyYmJycqLjU8SFJdZ3F6fX+Af399enZwZllMPTMsKioqKikpKiosMTY9SVdjbXd+gIKCf398enZ1bGdeVU9LTU1NTk1KR0I+OjQxKyoqLjlQcYF+eGVgXEdZWVVRUk5MTUhRVllMTFxfS0dBKkZMXVRPW250b4BzbWhtbGVweoJxalxGPUtVYWxzd3d4eHZ0c3FuZ11QRDozMTAwMTExMTIyMTExMDAxMTEvMC8tLS0tLC0sKywsMDI4PkdSXGVucnZ3d3l7e3t6endya2BWSEA8OTY2ODk7QkdMU1thaG1ydX1/goODg4F+f3x9fXx9fn1/f4CBf39+fX16enl3dXJwbWdiXVxdX2JlaW5vcXJyc3R2eXx8fXp6e31/g4iLjpCRjYqIiIiGhoOBfHJoXVRQTUtMTEtMTlJYXmJla25zeH1+fH18fHl3cmxlXVFIQDo3Nzc+R1NibnmBh4mKiIeGhoaGhomIhYSDgX97d3NsYlZMRkE/Pjo5T09OTk9PT09PT01OTUxLSkpJSUhGQ0NBPz89PT09Pj4+Pj4+Pz9AQD49Pj49PT4+PT08PDw7PDw7Ozs7OTg4NzY2NjY1NTU1NTU1NTY1NTU0NDQ0NDQyMjExMTAwLzAvLi4tLS4sLSwsLCwsKyoqKisrLCwtLS0tLS4vLzAwMDAuLi4uLS0tLS4uLi0tLSwsLCwrKyoqKiopKSkpKCgoKCgoKCgpKSkpKSkoKCkpKCgpKSgoKCgpKSkpKSkpKSkpKiooKCgoKiopKiwsLS4uLi4vLzAwMDAwLy8vLy0tLzAxNDU5P0NJTlRaXmBjZWZmZmVkYWBgX1taWlpXUUxCPDMtKignKCcmJiYnKS0xOENNWWNtd3x+gH99fHx4cWxfU0Q2LSoqKCgpKSoqKi40OURSX2pye36Agn+Afnt5dXBqYVhRTUxMTExLR0M+OjUvKygnKy81VHN8fHtvX1ZIRlZWUVVbUktUXFtqUklaZGVaR0JGS09KWGZfbG1xb4B7bGdsX1twZmdLVUBIV2Ruc3d3eHh4d3ZzbmddUEQ6MjAvLzAwMDAwMC8vMDAwMDAwLy4uLSwsLCwrKyorLS4xNz5HUVtlbnR4eHh4eXp8enp3cWtiWE5FPz05ODxAREhPV15laXB0eX6Cg4WCgoCAf398e3t6e318fn5+gH58enl4dnZ1dHNycG5oY19fYGFkZ2pucHFyc3Z2eHp9fHt6ent9f4OIi46Qjo2Jh4iIiIaDgXtzal9YVFNQUFBRUlZaXGJmam9xdnp+fn18fHx5dm5oYFlORDw4NDQ3PklWZHB6goeIiIiHhYaGiImJh4SEgn99eXhxbGJWTEVAPj06OU9OT05PT05OTUxLTUxLSkhJSEVEQ0JAPzs7PDw6PDw8PT0+Pj4+P0A+Pj4+PT09PT8/PT08PDw8PDs7Ojo4Nzc3Nzc3NjY2Njc3NTQ1NzY2NTU1NTQ0NDMyMTExMDAxMDAvLi0sLS0tLS0sLCwrKysrKysrLCwtLS4vLy8vLy8uLi4uLS0tLi4uLi4tLCwtLCsrKioqKioqKiooKigoJycoKCgoKSkpKSgoKCgnKCgoKSkpKSkpKSkoKCgoKCgpKSkpKSkqKikpKSkpKisrLCwuLy8vMC8wMC4uLy8uLi4vMTY2PUFHTFJYXWBjZWZnaWpnZmNhX1taWlhXVlBGPTgvKignKCgnJiYmJycrLjU9SVReaXF5fH9+e3x8fXhwZVtKOzArKSgoKSkqKikrMjhCTFhkb3d9f4F/fHt7enZzbmVbVE5MSkxKR0RAOzUwKSgkIicrNllidHd4b2BTTEpaW1RVYV9TVFpcXl1TVF5sZFRKTV5OUWBpa3VyZmtvW0lHVFZdUlhTUVJNS1ZkbnR3d3d2d3d2c2toXFBDOTIuLS0tLS4tLi4vLy8vLi4uLi4tLi4sLCwsLCwqKy0vMTc+R1BaZW5xdXh4eHh5fHt7eHNuZ1xPR0I/PD1CSE1SV2FnbHJ3fICEg4OCg4GBf4B9fXp6eXl5ent7e3t8e3p3cnNzc3JzcnBuaWZiYGBkZWlsb3Fyc3V2d3p8fXx7enp7fYCEiYyOj4+NioiJiYeGg4F7c2xiXFhYV1VVVlhbXmFnbG9ydXl8fn59fHt7eXRuZl5TSkA4MzEzN0BMWGdzfYSHiYiIh4aFhoiIiIeDg4F9fHh1cmtiVkxDPzw6OTlPTk5OTU1NTUxLS0tKSUdGRkVFQ0E+Pj07Ozo6Ojs8PD09Pj4+Pj9APj4+Pj09PT0+Pj09PDw8PDw8Ozo6OTk5Nzc3NzY2NjY3Nzc3ODg2NjU1NTU0NDQzMjIyMTExMTAvLy4uLS0tLS0tLCwsKysrKysrKywsLS0uLi4vLy8vLy4uLi0tLS4uLi4uLSwsLSwrKyoqKioqKioqKSkoKCgoKCgoKCkpKSkoKCgoJycoKCkpKSkpKSkpKCgoKCgoKiopKSkpKiopKSkpKSorKywsKy0vLi8uLi4tLS8vLi8uMTM3O0JHTFJWXV9jZmdpa2tqZ2ZjYV9dW1tZV1JJQzs0LSgnJygmJygnJicoKCwxOUJOWGNtdnp8fnt8fHt3cmpgUEI1LCkoKCkpKiopKi81PEdVY2tzen59fn19e3t5dXBoX1ZRTUpJSUVBPDcwKiYjIiAkKjtfYWZrcW1lTEZVW1xWVFhbWU9YUlFaWF5gZ2liUkBWTkRlfnluZl9WXks6OD1RVkhQU0dGR0tWZG91d3h4d3l5d3VsaVxQQzkwLSsrKyssLS0tLi4uLi0tLS0tLC0tLCwsLCsrKiosLTE3PkdQWmRtcXV4eHh4d3p6end0b2heUkpFQENGS1BXXGFobXR4fYGEhYOCgoGBgH5+fX16enh4d3l6enp6enh3dXNxcXFxcnJwb2tmYmJjZGZpbG9xcnN2dnd6fX18e3p6e32BhYmMj5CQjYuJh4eHhoSCe3NsYl5aWVhYWFpbXWBna3Byc3h9fn5+fXx7e3l0bGVbUUU7NTIyMzlCUF9qdn+GiImIiIeGhoeIiIiHg4J/e3h4dnNsY1ZMQz87OTk5T09PTk1NTkxLS0pJSEdGRkRDQkA9PDw7Nzc5OTg6PDw+PT4+Pj4/Pz4+Pz8+Pj4+PT0+Pjw8Pj49Ozs7OTg4Nzc3Nzc2NjY2NTY3ODY2NjY0NjU1NTU1NDMyMjEwMjIyMC8uLy8sLSwtLS0tLS0rKywsKystLS0tLi4vMC4uLi4vLy8uLi4uLi0vLSwtLSwrKioqKikpKSkqKikpKSkqKigoKSkpKSkpKSkoKikpKCgpKSkpKSkpKSgoKCgoKCkpKSkpKSsrKysrKyoqKysrLC0tLS0uLi4uLi4vMDAwMjI3Oz9GTFFVXGBhY2dqam1taWdmY2FeW1taV1NPRz03MCsoKCgnJiYnJiYoKSkqLzQ8R1ReaHJ4e3x7e318eXRtZVdIOjApKSkpKSkqKSkuMjhCTlxob3d8fXx9fHx7enh0bWJZUkxJSUZCOzYzKyYjISAjIyg7TVVoZmNcWTJAWltXUl1RUFpWWlVQXltXXmBqZVc0T05Ob29yZGJnWFpXTTg9R0NRV0Q6Nj9NW2dwdnh4eXl4eHZ0bmlfT0I4MCorKywrKysrKyoqKy0sLCsqKiopKywsKiorKSsrLS0wNz5GUFpjbHF3d3h4eHh6e3t4dnBpYFZOR0ZITlJZXWRpcHV6f4OGhYSBgIGAgIB9fXt5dnZ1dHR1dXd2dnZ3dXJxcXBxcXJzcW9raGRjY2RnaWxvcXJzdnZ4enx9fXt6ent+gYaMj4+RkIuJiYiKiIeGgX12a2RhXlxbXFxfYWJlaW5zd3d7fX19fXx7e3p3cmxlWU5COTQyMjQ8RlRjbnqEh4qJiIeGhYaHiIiIhoOAfHl4eHZ0bmVYTUM/Ozk5Ok9PT01MTEtKS0tJSEdGRUVCPz47Ojo6OTc4OTk5Ozs7Oz0+Pj8/Pz8+Pj09Pj4+Pj09Pj49PT09Ozw7Ozo5ODg3Nzc3NjY2NjY2Nzc4OTY2Njc1NTU1NTQzMzMxMTIxMTAwMDEwLS0tLS0tLS0tLCwtLSwsLS0tLS4uLi4tLi4uLy8vLi4uLi4uLi0sLCwsKyoqKiopKSgoKSkqKikpKiopKSkpKSkpKSkpKSkpKSgoKSkpKSkpKSkoKCgoKCgpKSkpKSkrKysrLCwqKisrKysrKy0tLi4uLi4uLzAwMjM3O0BFS1FWWmFkZWlra2xsaWppZmNgXltZWFZQSUA5MS0qKSgoJyYmJyYnJiYoKS0yN0FOV2JudXp7fHt7fXt3cWleTj80KyooKSkpKSkpKjA1PUpYYWx0e3x9fn17e3x6dW9mX1VOSkZDPTcyLCcjISQiIiM+YF5SVl9eXFVSUlVaXF1UYFxMS1pfXmdTSltjYFxWRldLUmdfZGNnZWVlZFE0OkhFQ0I9LzlDUFtocXd4eHh4eHh2dG5qX1BBNzAqKioqKSorKiorKywqKiopKSkpKSkpKSgoKSoqKywuMjc9RVFbY2pydXd4eHh4eHt7eXVwamJYUU1MUlZcYGZsc3d9gYOEg4OCgYCAf39/fHp5d3RycG9wcnRzcnJ0dnV0cHBvcHFycnJtamViYmNkZ2lsb3Fyc3d3eHp9fHt7enp8fYGGjI+Pj46LiYmIh4iJh4N9dmtkYl9dW15eYWNmam9ydnl8fYB/fXt7e3t5dnBrYVVKPTczMTI4PktYZHN9hIeKioiHhoWGh4iIh4WBfnp5eHd2dG5lWExEPTo4OTpPT01NTU1LSUhHR0dFRERBPj07Ojk4ODc2Nzg6Ozs7Ozs8PT09PT49Pj4+Pj4+Pj48Pj09PT09PDw8Ozs6Ojk4Nzc3NzY2Nzc3Nzc3Nzc4ODg4NzY1NDU1NDMzMzIyMTEwMTEvLy4uLS0tLS0sLC0tLS0tLS0tLS0tLS4uLi0uLy4uLy4tLS0tLi4tLCsrLCsqKikpKCgpKSgmKCYpKCoqKSkpKSkpKSkpKSkpKSkoKCkpKCgoKCkpKCgoKCgoKCgpKSkqKiorKysrKysrKysrKystLS0tLi4uLjAwMjI4PEFHS1FVWl9kZmhrbWxubmxpamRhXl1aV1dTT0U8NS4qKikoKCcnJycnJygoJycsLzQ9SFNeanF3enl6fHx7eXJwZFVEOC8rKSgoKCgoKCkvMztHVGBncnh7fX9/fX19fHdza2BVT0VCPjk0KykkISEjISAvZWdbRkxkXVZTUVVVUkROX2lSQk5YVFdeVllbW1hVVVNQQkhXXWheZmNma148MkVDPURFNzE6Q1FcaHF2eHh4eHZ2dnRvaV5PQDYuKScnJycoKSkpKSgqKSoqKikoKCgoJSUnKCkqKistLTE2PkVOV2JrcXR2eHh4eXp7e3h2cm5jW1ZTVVheZGhtc3t+gYSDg4GBgIF/f35+fXl3d3Vybm1sbG1rbG1wc3RycW9ub3FycnFybGllY2BiZWZobG5vcnV3d3h6fXt7enp5e32Ch4yPkI+Oi4mIiYmIioiDfXZsZWJfXl5fYGNmaGxvdHZ5fH+AfX15enp5dnRtZ15PRDs2NDMzOkBPXWl2gIeJi4mIh4aHh4eIiIWDf3t3eXd2dnRvZ1lNQz05ODk+T09NTUxLSUhHRkVFQ0JCPzs6OTk4Nzg3Njc4Ojs7Ozs7PD09PT09Pj4+Pj4+Pj09PT08PD09Pj49PTw8Ojs6OTg4ODg3Nzc3Nzc3Nzc3ODg2Njc4NzY1NTU1NDMzMzMzMTExMC8vLi4tLSsrLCwtLS0tLS0tLS0tLS0uLi4uLy8uLi8uLS0tLS4uLSwrKywrKiopKSgoKSkoKSoqKSYpKSkpKSkqKSkpKSkpKSkpKCgpKSgoKCgpKSgoKCgoKCgoKSkpKioqKysrKysrKysrKysrLCwtLS4uLi8wMTU4PEJHTFFXWl5jZ2lsbXBxcHFta2djYF5dWldUT0hAOTMsKSopKCgnJycnJycoKCcnKS0xOEJOWGVudXh6e3t6enp2cWdaST0vKikoKCgoKCgoLTE3P01YZG93en1/f35+fXx6dW9mW1BHQTo0LykmIiEhISAhN1lnaFpgXWNfSE1XVFJPUV5sVDVASUtHU1teXFdPRkVFQkhLSlZgTl1gYGVbUUdEVEc5KCgzOkNRXGhxdnh4dnZ2dnVzb2leT0A2LiknJycnJycoKCgoKSkqKikoJycnJyUlJygpKiosLy8zOD5FUVdia3F0dnh3d3d5e3t7d3VuaWFdXF1gZ2xwc3d9goODhIGBf3+BgH59fHp5dXRwb2tqaWloamttcHN0cnFvbm9xcnJycGtoY2FgYmJkZ2psbW90d3d5e3x7enp6eX1+g4iMj5CPjouJiIiJioqIg312bGVkYmFhYWJlaGtvc3Z6e31+fn18eXp6eXZzbGVZTUU7NjQzNTxEU2FteYKIi4qJiIeGh4eHiIiFgn15d3Z2dnZ0bGRZTUM9ODk7QE5NTEtKR0lIR0ZEQkBCPT06OTg3NzY2NjY3ODg5Ozo6Ojo8PDw8PDw9PT4+Pj4+Pj09Pj49PT4+PDw9PT09Ozs6OTk5OTc4ODg4OTk5OTg4Njc4ODc2NjY2NTQ0MzMzMzMzMjEwMC4uLS0sLCwsLCwsLC0tLS0tLS4uLi4uLi4uLy8vLi4uLi0tLi0sLCwsKyspKSkpKSkpKSovMjgtJykpKSkpKiopKSkpKSkpKSgoKCgpKSkpKCgoKCgoKCgoKCkpKSorKissLCorKywsKysrKywsLC0vLzAwMTU5PkRJS1FXW19jZWlrbW9wcHBybWhlYV9cWlhXU0xDPDUvKSgnJycnJycnJicnJiYoJycqLzU8SVVhaXN4e3p6e3x7eHNrYVFAMysoKCgnJycnJysuNj1JVWFtdXl8f39/f399fXlyal1TRT42LywmIyAhISAhI09ojYFtaGNhYmBfU1BTWFxaZFRFQz1ETFBbYFZQVj9CRUJFRkhQUVBPWldcX1RJT1VcTywuNDlDUFxocXV2dnV1dXV2dG5oXU5ANCwoJyYoKCUlJycmJikpKCgpJiUlJSUmJiYnKCosLjExNDg/RlFXYWlvc3Z4dXV3eHl6enl2c21nZGNkaGxydnuBg4OCgYGAgIB/fX17enh1dXFvbWtnZGNmaGptb3J0dHJxbW9wcXJxcG1rZ2VhYWJiY2ZpaW1vcXV5eXp6enp6eXl8f4OIjI+Pjo2KiIeHiYqKiYV9dmtmZmRjY2Rmamttb3V3eXt9fX19fHp7e3p3cWtjWE1BOTUyMzc/SVZkb3uFi4uLiYeHhoeJiYiHhYB8eHV1dXd2dHBoW09CPDc6PUVNTEtKSkhHRkVDQ0JAPTk5NjY2NTU0NDQ2NjY2Nzg6Ojo5Ojw8PDw8PT0+Pj4+Pj4+Pj4+Pj4+Pj08PT09PTs7Ojo5OTk4ODg4ODk5OTk5OTg3Nzc3NzY2NjU1NDQzMzMzMzIxMDAvLS0tLCwtLSsrLCwsLCwsLS0uLi4uLi4uLi8vLy4uLi4tLS0tLCwsLCspKSkpKSkpKSkqNkNDNCcoKSkpKSoqKSkpKSkpKSkpKSgoKSkoKCcnKCgoKCgoKCgpKSorKysrLCwqKyssLCsrKyssLCwtLy8wMjU4PkNHTVJWW2BkZmlrbW9xcXBwb2tmY2BdW1hVVE9GPzgxLSooJycnJycnJyYnJyYmJycnKS0yOENSXGZwdXl8fHt8fHl1b2RWRjYsKCgoJycnJycpLDM7Q1FdanV5fH9/f3+BgX96dW1fUUY8My0qJSIhISEgITVXbZB5XF5iYV5ZWEpLUFpiW11ZTUJIRkdLWVdQUFlDNDpLT1JKSEhGSkxQUFBMTlxoVk8pLTU6RE9cZ3J2dHR1dXR2dXJtaV1OQDQrJyYlJSUlJSYmJiYoKSgoJyYlJSYmJiYoKSosLjAzNDU5P0ZRWGFqb3N2eHV1d3h5e3t6eHZybWppaW9yd3yAg4SCgoGBgYF+fX16eHd1c3BwbGllYWFiZmhrbnFydHRxcG5vcHFxcG9taWViYWFiY2NlZmhqbnJ1eXh6e3t7enl5fH+DiI6Pj46NiomJh4iJiYeDfXZrZmZkZGRkZmlsbnN1d3l7e3t6enl5ent5dnBqYldJPjg1MzQ4QE1caXV/h4uLi4mHh4aHiYmJiIR/eXZ0dHR1dnRvZ1xRRTw5PUNKT05MSUdGRkVEQT89PDk2NjY2NTQ0MzQ2NjU1NTc3ODg6Ojs8PDw9PT4+PT09PT4+Pz8+Pj4+Pz8+Pj09PDw8Ozo6Ojo6Ojo6OTk6Ojo6OTk4ODk5NzU3Nzc2NTU1NTU1MzMyMjAwLi4tLSsrKysqKysrKyssLC0tLS0tLS0tLi4vLi4vLy8vLi0tLSwsLCwrKiopKSkpKiopKTI6OS0pKCgoKCgoKCgoKSkpKSkpKCgoKCknKCgoKCgoKCgpKSgoKysrLCwrLC0sLCssLCwsLCwsLC4sLi4wMjM3PENHTVJXXF9laGptbnBwcnJwb25rZ2NeW1pXVFBKQzkzLCkpKScnJiYnJyYnJycnJignJyYrLzVATVhjbnR4enp7fHx7eHNqXEw8MCknJiYnJycoKS0yOUJOWWVud3x+f4CAgoGBfndxZ1ZIOzEtKiUkIyEhIyNcY191UT5USlhkVUE9T0BMVFNQTlE6O0hNS0hITkpVWVxeYmVoaGFKQktGREJNTkxZZlZXKywyOkVRXWdxc3NycnJzdHVzbmleT0E0LCglJSQkJCQkJCYmJicoKCcmJSUnJycoKSstLi8xMjQ3O0BGT1ZgaG9zdXd1d3h4e319fHl4dnNxcXJ3eX6BhIODgYCAgoB+fHt7eHd1cXBua2djX2FjZmhqbHBzc3RzcXBvb29vcG5ta2djYV9gYF9hY2VmaGxxdHh7e3t8end4eX2AhImOjpCNjYqIiImKiomIhXx0bGdmZWVlZWZqa25xcnR5ent7enl5eXh4eHNtZ2BVRz05NzY3O0RSYGx4f4aLi4uIh4eIiYqKiYiDf3h1c3N0dHR0cWddUUU9PkJHTkxLSkdHRkRDQkA+Ozk3NTUzMzMzMzIzNDU1NjY3OTg4Ojo5Ojs7PT0+Pj09Pj4/Pz8/Pz9APj8/Pj49PTw8PDw7Ojs7PDs6Ojo6Ojo6Ojk5ODg3Njc3ODg3NjY2NjY1NTMzMjIxMC4uLS0rKysrKisrKywsLCwtLS0tLS0tLS4uLy4uLy8vLy4tLS0sLCwrKyoqKSkpKSkpKSkqKisrKSgoKCgoKCgoKCkpKSkpKSkoJikoKSkpKCgoKCgoKSkpKSsrKywsKywtLCwrLC0tLS0sLCwuLy4vMDQ3OkBFSVBWW2BkZ2lsbnFycnJvcG5saGRhXVtZVlJMRTw2LysqKSkoJyYmJycmJycnJys1PC8mKC0yO0dUX2t0eXt7e3x8fHt1bmFRQjUrJyYmJycnKCktMTpBTllhbnR6fn+AgICBgn96c2laSjsvKCUmJSQhISI3dVlLQjw7S09WYVQ/MTI7QD9FQkdKQThGSUtFSUVOW15gYmRlZWNaPj1JQ0VCXk5DUFtcSigrMzxFUV1ncXNzcnJyc3R1c21oXk9ANiwpJSUmJiQkJCQlJSUmJiYmJiUlJCUnKSssLzAxMzQ2Oj5DSU9YYWlvc3Z4eHd2eHl7fX59e3p3d3d5fYCDhISDg4GBgH9+fHt6eHVzb29sZ2JfXl9hY2dqbG9yc3N1dHFwb29vb3Bub2tlYmFfXl1fYGBkZGdscXR3eHl7fHp3eHl+gYaKjo6OjIuIiIiIiIqKiIJ7cmxnZWVlZWZnZ2htcHFzdnh6enl4eXl4eHZzbGZfUUc9Ojk5Oj1GVGJteYOKi4uLiIiHiImKiomIg394dXNzdHR0dHFnXVFEPkFITFBMTElHRkVDQUA+PDk2NTQzMjIxMjIyMzM0NDU1Nzg4ODk5OTo7Ozw9Pj4+Pj8/Pz8/P0BAPz8/Pz8+Pz49PT09PDo7Ozw8Ojo6Ojo5Ojo5OTk5ODY3Nzc3NzU2ODc3NDQzMzIxMS8tLS0sLCsrKywsLCwtLS0tLS0tLS0tLi4uLi4uLi8vLy8uLS0sLCwrKioqKSkpKCgoKCgoKzVCPCwnJycoKCgoKCgoKCgoKCgpKCgoKCgoKCgoKCgoKCkpKysrKysrLCsrLCwsLCwtLS0tLS0uLy4uMDE1OT5ESE5SWV9iZWhrbG9wc3Nvb21ta2diX1xZWFNPSUA4MSwqKSkqJycoJycnJycnJyYrNC0nJycrLjdDT1pocHh6fHp6fHx+eXFmV0U3LCgnJicmJygsLzQ5QktVYWtzen1/gYF/gISBfXZsX087LSQkIyMjJCMlPGtMOzQ1Mz1MTGJiYVVCPSc3OTk6QkE9R0tKTFBUWF1fYGFkYmNeVDw1QENFRWptTUlDREgxMDU8RlJbZ3FzdHRzc3R0dHRtZ15QQTUtKSUlJSUkJCUlJCQlJSUlJSUmJScpKSosLjAyMzU3OTo/RUtRWWFob3N2eHd1dXd6fX1+fn+Af3+AgoKEhYWEgoKDgYKAfXt6d3Zxbm5rZWJgYGFiZGhqbHBwcnV1dHJycG9wcHBubG1qZmJfXl1dXVxeYGJnanBzdnt7e3t6eXZ6foKHio6OjoyKiIiIioqKiYZ/e3JqZmVlZGNiYWJmaWtvc3Z3eHd3d3h5d3d0cGpkXVBEPTo4ODxCSlhlcnyFi4uKioiJiYmKioqKhoJ8d3Rzc3N0dHNxaV9SR0NGSlBWS0lHRkdEQz88Ojk3NTQzMjExMDEwMDIyNDQ0NDQ3ODg4ODk6Ozs8PT4+Pj4/Pz8/Pz9AQD8/Pz9AQD8+PT09PTs8PDs7Ozs6Ojo6OTo6OTk5OTc2Nzk4ODc4Nzc3NzU0MzIyMTAuLS0tKysrKysrKysrLCwsLC0tLS0tLS4uLi4uLi4vLS0tLC0tLCwrKyoqKSkpKSgoKCgpKSc2MSoqJygoKCgoKCgoKCgoKCgoKCkoKCgoKCgoKCgoKSkpKisrKysrKysrKywsLCwsLS0tLS4uLy8vLzEzNzpBRk1TWFxgZGlqbW5wcnFxcG5sbGhkYF1bWFdRS0M7NS4rKSgoKSkpJyYnJycnJiYnJSQlJygnKi41P0xWY293enx7enp8fHp0bFxLPC8oJyYnJicqKzA2OkFKVGBqcnl9f4GBgYGDgoB5cWJSQDEoIyQkJCQkJ0JuWT42OzU4QVFiaW9xaFA9Rj40NkNHRlBOTU5WWVteYGFiYmBdWFRSNUVHR0JOYU1KVV1LLjE2PUZSXWlxc3R0c3N0dHR0bGhdT0E1LSklJSUlJCQlJSUkJSUlJSUlJSYnKisuMDAyNDU3Ojw8QUVLUVlhaG9zdXl4d3Z4e35/gYOEg4SEhIeHhoWFhIODgYCAfXx5dnNybWxpZmNhYWJiY2Zna29xcnR1dXRycG9vb29vbmxraGRgXl1cXFpaW1xhY2luc3Z7e318eXd5fICDiIuOjo6MioiIiImJiYiFgHxzaWVkZGFgX15gY2Zqb3N1dnZ1dXV1d3d3dHBrY1pORT48Ozs/RlFeaXaAiIuLiomIiIiJiouJioeAend0c3NzdHRzcWlhVUtGSlBWWktJR0VFQ0A7OTg2NTQyMjEwMC8vLy8xMTMzMzM1Njg5Nzg4OTs7PT49Pj8/Pz9AQEBAQUBAQEFBQEA/Pj09PT09PDw8Ojs8Ojs8Ozo6Ojk5Ojk3Nzg4ODg4ODc3Nzc1NTMzMjEwLi0tLCwrKysrKioqKiwsLCwsLC0tLS0uLi4uLC4vLi0tLSwtLSwsKioqKikpKSkoKCgoKionJigoKCgpKSgoKCgnJycnKCgoKCgoKScoKCcpKSkqKioqKiorKysrKysrKyssLCwtLS0tLi4uLjAwMDAzNjo+REpMVFtfYWVpam1vbm9vb25rampmYl5cW1hUT0c/NzArKikpKSoyLygoJycnJycnJiYmJSQmIygtMTtIVWFtdXl8fHp6fHt6dW5gUD8yKiclJigpKi8zOT1BSVNdZm92fX+BgoKDg4KBe3RpWkY2LCYkIyMlKChba1g8NjxCQUlZZW50d3RWS0hDQURMUE1HQ0xUWFpdYGBjYmFdWFRORj5CQUNES1pUUExMOTExNz5IUl5qcnR0dHVzdHRzcmxpX1FCNS0pJScnJyUlJiYlJSUlJiYlJicnKCwuLjAxMzU2Ojw+QENITVJcYmhvc3Z4eXh4eXt+gYSHiIiIiYmJiIeFhYSDhIGAfXx5dnRwbGlpZGJgYWFiY2VmaWxucXN0dXRycW9vb29wb25saWViX11bW1pbW11dXmJnbHJ2ent8fXp3en2BhomLjY6OjImHh4eIiIiFgn52bmhkY2JfYFxcYGVoa25zdXV1dXV1c3V1dXNvamBZT0Q/Pj4/RUtWYm12f4iMiomJiYeHiYqKi4iEf3l2c3JydHR2dXJsZVZPSk1UW19ISEZDQT88OTg2NTUyMjIxMDAvLy8vMDEyMTMzNTY3Nzc4ODk7Oz0+PT4/Pz8/QEBAQEFAQEBBQUFBPz4+Pj09PT08PDw7Ozs8PDs6Ojo5OTk5OTk5OTg4ODg3Nzc3NTU0NDMyMC4tLSwsKysrKysqKissLCwsLCwtLS0tLi4uLiwuLy4tLS4tLS0sLCoqKiopKSkpKCgoKCgoKSknJygoKCgnJygoJycnJycoKCgoKCknKCgnKSkpKioqKioqKysrKysrKysrLCwsLS0uLi8vLi4wMDAxMzY6QUZMU1dcYGNnaWttbmxsamppaWhoY19cW1tWU0xDOzQtKiopKSkqKikoKCcnJycnJyUmJiYkJiUoKy43Q1FdaHJ5fH17e3x8e3ZvZldEMyknJSYoKi4yNjo+Q0pSXGVsdXt/gIGCgYODgXx5cGFPPjAnIyMjJCUpREtGOD8/PT5KWmRvc3dyW1ROQT5BQk1LRVBUWVpbXmBgYV9cWFRNR0I6OE1CQEdVWlpWRSwyNDc+SlReanJ0dHR1c3Nzc3JsaV5QQjcvKygnJyclJSYmJiYlJSYmJicoKisrLjAzNDU3Ojs+QEJFS1FUXGJob3N2eHd3dnd9gISHioyNjY2Ni4mHhoWEg4KAf3x7dnNva2hmYl9gYmJhY2VlaGtscHFzdHV0cnFvb25ub21ubGllYl5cWllZWVhZWlxgZ2xydnp7fXt4d3p9gYaJi42OjIqJh4eHiIiIhYB6c2xnZGJgXl5cXGBlaWxvcXR0c3Nzc3N0dnNybmpgWE5HQ0A/QklPW2RweoOJi4qJiYmJiYqLi4uIhH95dXJyc3R0dXVzbWRbU09RWWBkSEVEQkA9OTg0NTUzMTAxMTAwLi4uLi8xMTEyMzU2NjY5OTo6Ozs9PT4+Pz8/P0BAQUFBQT9BQEBBQD8/Pz49PTw8PT09PT09PDw7Ojo6Ojo6Ojk5OTk3Nzk5Nzc2NjU1NTMxMC4uLSwrKysrKysqKisrKysrKy0tLS4tLSstLS8tLSwsLS0uLiwsKysqKikpKSkoKCgnJycoKCgoJycnJycnJycnJycnJycnJycnJycoKCgoKCgpKSoqKysrLCwsLCwsLC0tLC0tLS0uMDMwMC4uLzAwMDQ3PENJTlJXW19jZ2lrbGtpaWdnZ2ZlY2FdXFtZVVFJPzgwLCkpKSkoKCgoKCgnJicnJiYmJiYmJSUmJykwNT9PW2Vwd3p7enx8fHx4cmlbSzstJicpKS0xNTc7P0RLT1lia3J6foGBgIGCg4OBfXVoVkU2KyYiJCMkKEBOSj43OTk8SlVicXR3dGxOQ0I5Nz5GRlBSV1tdXl9hYF5bV1JMRkA4NTJUQztHUFlYXEAwMjY5QEtWYWtzdXV0dHN0dHRybGhfUUE2MCwpKCcnJyUnJyYmJiQmJicoKiwtLjAzNTc6Oz09QkRGSE9TWF5kam9zdnd5eXl7gYSGio2PkZGQj46MiYiHhYJ+gX15dHFuamhjX15gX2FlZWZnaGlsa29xcnR0dHNxb29ubW5tbGllYl5bW1lYWVhXV1lcYGZscXZ5fH17e3t6foGGiIuNjoyKiIaHh4mJhYJ9d3FqZmNfXl5cXV5hZmlucHJ0c3NzcnJzdHR0cm9nYFZOSEVDQ0ZLVV9ncnuFi4uLiomJiYmKi4mLiYV+enZ0c3R1dXV0cmtlX1dWWF5kaUdFQ0A9OTg2NDMzMjIwMDAwMC4uLi4vMTExMjM1NjY2OTk6Ojs7PT0+Pj8/Pz9AQEFBQUFBQkJCQUA/Pz8+PT08PD09PT09PTw8Ozs6Ojo6OTk5OTo6Nzc4ODc3NjY1NTMyMTAuLi0sKysrKysrKiorKysrKyssLC0uLS0tLi8tLS0tLS0tLS0sLCsrKiopKSkpKCgoJycnJycoKCcnJycnJycnJycnJycnJycnJycnKCgoKCgoKSkqKiwrKywsLCwsLCwtLSwtLS0uLi8wLi4uLi8xMTQ2OT9ES1BUWFtfY2doaWloZmZlZWRjYWBeXlxbWFNORT00LiopKSkpKSgoKCgoJyYnJyYmJiYmJiYmJicrLjI8SVZjbHd6e3p5eXt8enVrXk4/MiopKSsvMzc5PkBFS09XYWhweH6BgoGCgoODgX53bl9OPS8nIyMkJSZCdXdEJikzOkhUY3B2eHVuSzsuLzI3LjtWWVpdXmBhYV1bVlJMRkE5My4tNz9FUU9PTF9NOTU1OkFKVWJsdXd2dXV1dXR1dGxoX1FBNjAsKSgnJycnJycnJyYnJicoKiwtLjAzNTc5PD0/QURGSEpRVVpgZGpvc3V2eHp7gIWIjI6QkpOTkpGPjYmIh4SAfn55dnJsaWVhYF1eYF9hY2NmZ2hpbGxvcHFzdXNxcHBwbm1ubWtnZWFdWllXVldUU1RUWVxkanF3e3x8enl5en6BhoiLjY6MioiGh4iIiIWAenVwZmNgXl1cXV1eYWZqbHByc3JwcG9vcHJycnBtZV1UTUpHRkZKTlhibHaAiIuLiomJiYmLiouKioiEfXl2dHN0dXZ1dXNuamFbWVxgZmtGQ0E9Ojg2NzQzMTExLi8wLy8uLi4uLjAxMTM0NDU2ODo6OTk7Oz09Pj4/Pz8/QEJBQUBAQkJBQUBAPz8/Pz4+PT09PT09PT08PDs7Ozs5OTo5OTg5OTg4Nzc2NjY2NDQxMTEvLS0tLCsrKiorKysrKysrKysrKysrLS0tLS0sLi0tLS0tLS0tLCopKiopKikpKSgoKCcoKCgoJycmJiYmJycnJyYmJiYmJiYmJiYmJicnKCgnKCoqKyorKywsLCwsLC0tLS0tLi0tLi4tLS4uLi8vMDM2ODtASE5TVFlcX2JlaGVjYmFhYmJgYF9fYF5eW1dSS0E6MiwqKioqKikpKCgoKCcnJycnJyYmJiYmJiUlKS4zOkRSYGxzd3p6enl5e3p0bWNTQzQrKiotMjU3PD9DRkpOVV1nbnZ+gIGBgYGBg4J/eXNmVkMzJyUkIyMiNWlkLCMnLzpDU2JudHVza2A2JSUqKzdMWVpbX2BfYV9ZVVFLRT03MS8uMzM4SFBRT1VOUlc0NTpBTFljbXV3eXh1dXR3dHJva2BSQjkxLSoqKignJycnJycnJygpKy0vMDEyNDY4Oz0/QUNGSUtOU1dbYWZscHR2d3h6fYGHi5CSlZWXlpOSj42Kh4aEgHx5dG9sZ2RgXFxeYGBhY2VnZmZnaWttbnBydHVzcXFvb25vbWtpZmRhXVlWVVRTVFNUVVhcZGtwdXh7enh4eHp+goeJjI2NjIqIiIaIh4aEfnlzbGViYF5dXFtdXmJlam1wcXJybm5ub3Jzc3VxbWdfV09NSUdJTlVcZnB7goeLiomIiYmJioqJiYmGgn14dXN0dHZ2d3d1cWxkXV1fZGpvQ0E8Ojk4NjU0MzExMS4uLi8vLi4uLi4wMTExMjQ1Njg4ODk5Ozs9PT4+Pz8/QEBCQUFCQkJCQUFAQD8/Pz8/Pz09PT09PT09PDw7Ozs7Ozs6OTk4OTk4ODc3NjY2NjQ0MTExLy0tLSwrKyoqKysrKysrKysrKysrKywtLS0tLi0tLS0tLS0tLSwqKSoqKSopKSkoKCgnKCgoKCcnJiYmJicnJycmJiYmJiYmJiYmJiYnJygoJygqKisqKyssLCwsLCwtLS0tLS4uLi4vLi4vLy8wMDEyNjk+RElOU1dbXl5iZWRiYF9dW1xcXV1fYGBgXVtWT0Y+Ni4qKioqKiopKSkoKCgnJycnJycmJiYmJiYlJSgrMjhCT1xpcXZ5e3p4eHh6dm9nWEY4Ly0tLzM4Oz5AREdKTVRcZGx2fYCBgYGBgYKDgX12bF1KOCsmIyIiIDNMPSImLzQ4RFJhbnR3eFo9JDIxP01VWltbX2BhYF1ZVlFMRT84MCwtLzIwLj9NUVJUTUlJNjU6QU1aY211d3d3dnV3d3RzcGlgUkI5MS0qKikpKCgoKCgoKSkpLCwtMDEzNDY4Ojs/QUNFSk1PUldbX2NnbHF1dnd5e36Dio6TlpeYl5aTko+NioeFgX15dG5qZ2NgXFtcXmBgYWNmZmZnamtsbnBwc3Z1c3Fxb29vbGxqZmRgXVtXVlVTUlFQUVJTW2Fpb3V5fHl3eHh6foKHiYyNjYyKiYmIiYeGg312cGdhX15dXFpaXF9kaGptb3BwcG5ubm9yc3R0cWtmXlZQTkxLTVJYYmt0fYSIi4uJiImJiYqJiIeHhYF9eHZ0dXV2dnd3dXJuZ2FhYmdtckA9Ozo4ODY1NDMyMjAwLi4tLS4uLi4vMTExMjI1Njc3Ojo6Ojw8PT08Pj8/QUFBQUFBQUFCQkBAQEA/Pz8/Pz8+Pj4+PT09PTw7Ozs7Ozk5Ojk5ODg3ODg2NjY2NTU1NTQxMTAtLC0sKioqKisrKysrKywsKyssLCwsLCwtLSwsLCwsLCwsLCwsLCkpKCkpKSgoKCgnJyYnKCgoKCYmJiYmJiYmJSUmJiYmJiYnJycnJycoKCgpKiorKysrLCwsLCwsLS0tLS4vLy8wMC4uLy8vLzIwNDg7QUdLT1VXXF1fYmJhXlxcW1taW11dYGFhYF5ZVExEOzMsKioqKioqKSkpKCcmJycnJygoJycnJyYmJiYnKi81P05YZW92eHl7end4d3RvaVtNPjQxMTI2OT5AQUVHSk1TWmJoc3qAgYKBgoODhIR/eHJlUz8wKCMkLisxMCYkJjIyNkNRYG10eXxpSUpbW1lYWFlcX2BfX11ZVU5KRD03MC0tLC4tLS5eU1JPTk9SSTQ3PEFPWWRudnh3d3V1dnZ3dW9rYlJEOjItKiopKSoqKicoKCkqLC0uMDE0NTc5Ojw/QkVISUxQUVNaXGJlaW1wc3Z5e3+Ch46Tl5iZmJeVlJKMioqHhIB7dW5pZGFeXFpbXV1fX2JkZGVmZ2lrbG9wcXR0c3JxcG9vbm5raWZiXltZVlVUUVBQT09PU1lhaW92eHp6eXh5en6BhoqOjY2LiYmJiYmIh4F7dm1iXl5dW1tbWl1hZGlrbnFzcXBvb21vcnN0dHBrZF1WUVFPT1FWXWZvd3+GiomJioiJiYqJh4aFhIKAfHl2dXR2dnZ4eHZ1cWplY2VobHM9Ojo4NjU1NTQzMjIwMC4tLS0uLi4uLzExMTQzNTY3Nzk5OTo8PD09Pj8/P0FBQUFCQkFBQkJBQEBAPz8/Pz8/Pj4+Pj09PT07Ozs7Ozs6Ojo5OTg3ODg4ODc3NzU1NDM1MzIyLy4tLCoqKiorKysrKyssLCsrLS0sLCsrLCwsLCwsLCwsLCsrKyspKSkrKiooKCgoJycmJicnJycnJiYmJiYmJiUlJSUlJSUlJiYmJicnKCgoKioqKiorLC0tLCwsLC0tLS0uLy8vMDAvLzAwLzAzMzY6P0RJTVNWWlxdX2FhXlxaWllZWFpdX2JiYmBdWFJJPzYxLCoqKioqKikpKikpJygoKCcoKCcnJycmJiYmJyotMztIVF9tc3h5eXh3d3d1cmphUUQ3MzM3Ojw/QUNCRUhMT1ZgZ3B6f4GBgYGBgICDg310a1lGNSsmJj02JiUlISUrLzZDUWBtdHh6enhybWVdW1pcXl9gX1xZVFBKRD01LiwrLC0tLS03dVhRTkxKUz8vNjtEUVtjbXV3d3V2dnZ2d3Vwal9SRDozLisrKikqKisqKyssLC0tLzAyNDY4OTw+QERHSktOUlVXW19jZ2tuc3R2eHt+hImPlJmZmpeWlJORjIqIhoF9dW9pZF5bWVlaWlteX19hY2RlZmdpa25vcXF0dHJxcXBvb25uamhmYl1YV1RTUk9OTk1MTlFXYWhwd3p6enp6e3t/goeLjY2NjYmJiYmJiIWAenRsYl5bWllZWlpdYWZqam1xcHFvbm5tb3Fyc3NvbGRdWFNQUFNVWmFrc3uCiYqKiomJiYmJiIaFhIOAf3x5dnV1dXZ2d3d3dnFqaGdpa29zOzo4NzY2NDQzMjIwMDAuLS4uLi4uLi8xMjIzMzU2NjY5OTo7PDw9PT4+P0BCQkJCQkJCQkJCQEA/Pz8+Pj4/Pz09Pj49PTw8Ozo7Ojo6OTk5OTg4ODk4OTo6OTk6ODk5Nzk3NTUyMCsqKSoqKy0rLSwsLC0uLi0sLCwsKSsrLCssLCwsLCwsLCsqKSoqKSkoKCgoKCcnJiYmJiYmJiYlJSUlJSUlJSUlJSUlJSYmJiYoKCgoKSkqKioqKissLCwsLCwtLS4uLi8vLy8vLy8wMDEyMzU6PkNHS09VWFpbX2BfXl1aWVlZWVpeYWNjZGJgXFZQRTw2LysqKioqKiopKSoqKSkpKSgnKCgnJyYmJycnJycoKzA5Q1BdaXJ5enl3d3Z3eHZtZVdIPTY3OTs+QUNDREZKTU1TXmZsdXyAgIGBgICBgoOAem9eTTwwJyYjIiQlJCQkKi81QVFebXZ7fHx7dm5oY11aXl9gYV1ZVU9JRD02LSsqKy0uLi4uPGpmUFFOVF5YODc+RFBbZm91d3V2d3d2dnd1b2hgUUU6My4tLCsrLCwsLC0sKywtLjEyMzU2OTs+QERHSUtOUVRXW15iZWltbnJzdnh7f4SJkZeampiXk5GSjYuHhYJ/eXRtZF9aWFdXV1laWl1eX2FkZWZnam1vcHByc3NzcXBvcG9ubWhoZWFbVlRSUVBOTUxJS01PVl9ocHR5eHh3eHh6f4SIjY6NjI2MioqJiIiEgHlyaWFdWlhYWFlaXWFmaW1wcm9vbm5vbnF1dnRzb2pjXVhUUlNVWV1nbXV+hYmKiYmJiYmJiYaEg4KBfn58eXh1d3V2dnd3d3Ryb2lnaW5xdTo5ODc2NjU0MzIxMTExLi0uLi4uLi4vMTIyMzM1NjY2OTk6Ozw8PT0+Pj9AQkJCQkJCQkJCQkBAPz8/Pj4+Pz89PTw8PT09Ozo7Ozo6Ojk5OTk4ODk6PT5AQD8/QEFCQkJBPj48ODMuKyoqKi4vMDExMTIxMTEwLy4uLi0tKywrLCwsLCwsLCwrKikpKikpKCgoKCgnJyYmJiYmJiYmJSUlJSUlJSUlJSUlJSUmJiYmKCgoKCkpKioqKiorLCwsLCwtLS0uLi4vLy8vLy8vMDAxMzU4PEJGS09SV1hcXl5eX11aV1ZWVlZZXGFjY2RiYVxWTUM7NC0rKiorKyoqKSkqKikpKSkoJygoJycnJycnJycnJyktND5MWGdwdXh4d3Z1dnd0cWhaUEI6Ojs9P0FEQ0VGSkpMUFpianJ6foCBgICAgYKCgXpxZ1ZDNCgmIyMkMjUhIyktNUFOXmx1en1/e3hwbGZgXl9gX11ZUk5JQjo1LywrKissLS0uLjJRYlNTU09iZ0I3PEZTXmdwdXd2dXZ2dnZ2c3BpXVFFOjMuLi0sLCwsLCwsKywtLi8xNDY4ODo8PkFESEpNUFNWWVxfY2RobXFzdHd3e3+FipCWl5eVlJGQjoqHhoOAfHdtZ2BbV1VVVldZWlpcXV9hZGVnZ2ttb3BwcnNzc3Jwb3Bvbm1pZ2NeWVVSUE5NTEtLSUdJTVRdZm1zdnl4d3d6fICEiIyOjo2NjIqKioiIhH94b2ZeWllWV1dYWV1haGptbXFwb25vb3BxdXZ0c29qYlxaWFZVV11iaXF5gYaKiYmJiYmJiYmGg4J/fn19fHl4dXN1dnZ3d3d0cm9qaGlvcXU5ODc2NjU0NDMyMTExMC4tLi4uLi4vLzEyMzM0NTY3Nzo6Ojs9PT4+Pj5AQUJCQ0NDQ0JCQkFBQEBAPz4/Pz8/Pz88PT09PDw6OTk6Ojo5OTk4ODg5O0BERkhISEhJSUtKSkhJRkE6My4sLS8xNDU2Nzk6Ojo4ODU0MTEwLy0rKi0tLSwsLCwrKioqKSgoKCgoKCgoJiYmJiYmJSUmJiUlJSUlJSQkJSUlJSUlJSUmJigoJycpKSoqKioqKywsLCwtLS4uLS4uLi4uLy8wMDExMzY4Oj5FS09UV1hbW1xeX19cW1pYV1lYXGBjZGVmY15bVEtBOTIsKisrKysrKysrKyopKSkpKSkpKScnKCgoKCgoJiYpLDI6R1VibXR2eHh1dXV4dnNrYlNIPTs9P0FDREVFRkZKTVBXXWZud36BgoCAgIGBgoN+d21bSTcrIyMhIyotIyMnLjVAT1xpdHp9fnt5dW1mY2BfXVtXUUxJQjkyLSssKyssLC0vLzExNUZXUUtOV1Y8OD1HVF5ocnh3eHV3d3d3dnNuaF9QRjo0Mi4uLi0sLCwsKystLzEyMzM1Ojo8PkBDRklMT1JUVlteYWNna3Bydnd4eXyAhImPlJaVlJKPjIuIhIKBfHlya2RaVFVVVFRVVlhaWlteX2NlZ2hsbW5vb3Fzc3JxcG9xcHFtamVhW1hUUVBNS0hHRURFRktRWmZsc3d4eHl3eXyAg4eLjI6NjIuKioqJiIR+d25mXFhXV1ZXWFteYmdqbG1xcm9tbm5vcHJ0c3JvamJcWVlXV1tgZmx0fIKHiYmKiImIiImHg4B+fXx7fHx5dnN1d3Z2d3h3dnJvbWtscHN3ODc2NjU1MzMzMjExMC4uLS4uLi4uLy8xMjM0NTU2Nzc5Ojs8PT0+Pj8/QEFCQkNDQ0NCQkJBQEBAQD8+Pj49PT09PT09PTw7Ojs7Ojo5OTk4Nzk6PUFGSk1PT09QUlNTUlJTUk9JQzkzMTI1ODs+QEFERERFQ0I/PDo5NzMwLywtLSwsLCwsKyoqKioqKSkpKCgoKCYmJiYmJiUlJiYlJSUlJSUkJCUlJSUlJSUlJiYnJycnKSkqKioqKissLCwsLS0uLi4uLi4vLy8vLzAxMzU3PEBFS09TVltcXF1fXl1gXlxbWlpaXWBhY2RlZGNdWVBHPjcwKysrKysrKysrKysqKSkpKSkpKSkpJygoKCgoKCYmJyswN0JQXGlxdXd4dnR0dnZzbWdZTkI9P0BCRERFRkdGSEtPU1lhaHJ7gIGAf4CAgoODgHtzY1A/MCckIiEjIiIjJy0yQE1aaXR4fn57eXVuZ2JfXVtXUk1GQToyLSsqKiorLC0vMDAyNDJMV0tJSVtONjhASlVganR4eHd3d3d3d3d0b2peT0U8NTAuLi4uLSwsLC4uLS8xMjMzNTo7PT5BREhKTVBSVlhbXmJlaW1xdXZ4e3x9gYSJjpOTkZCPjYuIhoKAfHd0bmdgV1NVUlNTUlRWWVpbXl9hZGdqbG1vb3Byc3NycXBvcG9ta2diX1lVUU9NS0hGRENBQUNIT1ljbHJ3eHd3eHt9gYSIi4yNjIuKioqKiYiEfnduZl1ZWVhWV1lcX2Joa25wb29wbm9vcnN0dXRzcGliXFlZWVtdY2lwd3+FiImIiYiIiYmIhYB+fHt4e319eXd1dnd2d3d4eHd0cW1ra25zdzY2NjY1NTMzMzIxMTAvLSwuLi8vLy8wMjM0Njc2Nzc4Ojo6PDw8PT0+Pz9AQ0NDQ0NDQkJCQEA+Pj8/Pj09PT09PT09PT08PDs6Ojo5OTg5Ojo7PUBFSU5SVldXWFlbW1paWlxZVEtDPDo7PkFDSUtNUFNUUk9OSkpJRUA9ODEvLSwtKysrKiwqKikpKikpKCgnJycnJyYmJiUlJSUlJSUkJCQkJCQkJCUlJSUlJSUlJycnJygpKiorKysrLS0tLS0uLi8vLy8vLzEvMTEyMjQ4PD9ESVBSVlpbXV5hYmNjYF9eXFxcXWBiYWFkZWNhXVZNRDs0LisrKiorKysrKywrKyoqKiopKykpKCgnJycnJycmJigpLzU/TFhmb3J1dXV1dHZ3dHBrX1NIQUBCQ0VGRkZHR0dJTU1SW2Rtdn2BgYGBgYKEg4J9dGlYRTUoJCIkIyQjIyYsNEBNWmhzen18fHl1bGVjXlxXUUxGQToyLSoqKiorKywtLi8vLi4zWVRQSUpNVj06QUtWX2x3eXl4dXV2eHh2c25oXU9EPTYyLy8uLi4uLSwuLi0vMDIzNTY4Ojw/QUZJSk1RU1ZYXF9kZmpucnZ4e3x9foGFio6RkZCNjYqGhYN/fXhybmhhWldTUVBPUlJSU1laW1xfYWNoamxucHBzc3Nycm9vb3BvbGdkYVxXUk9OS0pHQ0E+PDw/RUxWX2lweHt5d3d5f4KFiYuNjIqJiYqKiYmHg4B5bmVdWFhYV1haXmBjaGttbnBwcHBvcHFydXV0cm5pYl1aWFpeYmdtdnyChomKiIiIhoiIh4J+fHp4eHh8fHp3dnV1d3h5eXl3dHFta21xdHY2NTY2NjU0MzMyMTEwMC4tMDAxMTExMzUzNDY3Nzc4OTo6Ojs8PD09Pj8/QEJCQkJBQUFBQUFAPz09Pz49PT09PT09PTw8Ozs6Ojo5OTk3OTo6PD1BR0tQU1haWltcXl5fX19hX1xVTUVDRElNUFZYW15fYGJfX11ZVlJOR0I9NjIvLi0sLCwrKyspKSopKSgnJycnJycnJyYlJSUlJSUlJCQkJCQkJCQlJSUlJSUlJScnJycnKCoqKysrKy0tLS0uLy8vLy8wLzAwMDExMjU4PUFESU5SV1tdXmFiZGdmZmRiX15eXl9hY2NkZGVjX1xSSkE5MSsrKyoqKysrKyssKysqKioqKioqKigoJycnJycnKCgoKSwyO0ZTYGtydXd1dXV1d3ZxbmdZTkdDQkRGR0ZHRkZGSElJTFReaHF5foKBgYGBgoOCgHhvYE08LicjJSMkJCQoLzlBTlxncnd6e3t4dGxlX1xVUUtDPzgyLCoqKioqKywsLS4vLy4uMkxkWEpMTFg9OUFLV2Jtdnl5eHd1dnh4dnNtZ11PQzw2MjIvMTEwLy4sLi4vMTAyMzU2ODo8QENGSUtOUlNWWV1fZGZrb3F1eXx/gIODiIuNj4+OiomHhoJ/fHh0cGljXVdTUU9PT1BQUlVWWVtcXmBjaGpsbnBwcXJycXFxcXFwb21pZV9aVE5NS0lGQ0A/Ozo6PEFKVV9ob3Z3d3V3eX6DhYmKjIuKiIiHh4iIh4N/eHFnYFpaWllcW19jZmhrb29wcG9vb3Fyc3VydHJtaGJdW1pbXmRqcXh/hIeJioiIiIiJiIeCfnp4dHR4e3t4eXZ3d3l5eXl4d3RxbWtucHJ1Nzc0NDU1NDMzMjExMTEwLi4xMjIxMTM0NTc3Nzc4OTk6Ojs7PT0/P0A+QEFCQENDRERCQkFAPz4+PT4+PT09PT4+Pj07Ozo6Ojk5OTg3ODg5Ojs9QkdLT1JWWlpbXF1eYWRiYWJgXVdQTk9TWFxfYWNlampoZ2ZmY19dWFZRSUE8NTItKystKysqKiopKCgoJycnJyYmJycmJSUlJCQkJCMjIyMkJCQkJCQlJSUlJSUlJicnJycpKSsrLCwtLS4uLy8vLy8wMDAvMDAxMjY5PUJGSk5UVlpdXWFjZWhqa2llZWNgX19gYWNlZmRjYVtXTUQ+Ny8rLCwrKywsLCwrKywsKysqKioqKyspKCkpKCgoKCgoJicqLzdEUV1pcnV1dXVzdHh3dHBrX1RKQ0RER0VHRkdHRkRGRUZNV2NueH6CgoKCgoKDg4F7c2RTQTEnJCQlJiYnLDU4RE5aZ3J2d3l5dXJtZV1XUUpFPzgwKykpKSsrKistLS4uLy8wMDFDZlZSTlBWOD1DTVhjbnV4enh4d3d4eHZ0bWddUEQ8NjIzMjIyMjIvLS4vMDIyMTM1Nzk6PUBDR0pNT1JVWFleYWNnbHBydnp+gISDhYmMjY2MioiHhIJ/fHh0cGtjXFdTUE9PT05QUVNUVldbXl9jZGVnbW9vb3BxcnFxcXFycG9taGNeWVNOS0hDQkA9Ozk3NzpAS1RfaXB1d3d1d3p9g4aJioyLioiHhoeHhoaDgXpyaWRdWlhaXVxfYWVobG9vcXFxcXByc3V1dHNwbGdiXFxcXl9mbXN6gYiJiomIiImKiomHgX15dnN0eHx6eHl4d3l4eHp6eHd1cm1rbXF0dTc3NTQzMzQzMjExMTExMC8vMDIyMzMzNTY4OTk3Nzg4Ojo7Ozo8Pz8/QEBBQUFBQUJCQkFAQT49Pj09PTw8PDw9PT08Ozs6Ojk5OTg3Nzg3Nzk8PkBESUxPUlVYV1hbXF9iYmRmZGNgW1daXl5jZWdnaWtrbWlra2lnZWNfWVVPSEA5Mi0sLCoqKSoqKSgoKCcnJycmJiUlJSUlJSQkJCQjIyQkJCQkJCQkJSUlJSUlJSYnJycnKSkrKywsLS0uLi8vLy8vLzAwMTEyNDg7P0RITFBUVl5fYmRlaWprbWxsaWZlY2FgYmJkZGVkZF5ZU0pBOTIuKywsKyssLCwsKyssLCsrKioqKisrKykpKSgoKCgoKCcmKS00QE1ZZG5zdnV1dHV3eHdzb2ZZT0hEREZGRkZHRkRBPz5CRlBdanR8goOCgoKCg4OBfHZqWkY2KyUlJiYpLjE3PkZOW2dydnd4eHVybWNYUktEPjgwKSkqKSkrKyssLS0uLi8vMDAwP2JhUUxPTEU8Qk5ZZW92eXp4eHd3eHh2dG1nXVBEPDg0MzIyMjIyMS0uLy8wMjEzNTc5Oj1AQ0dKTVBTVlhaXmFjZ2xwcnZ7f4KGhYiKjIyNi4iGhYJ/fHl0cWtjXldTUVBPT1BSU1VVV1laW15hYmRoam1vb29wcXRzcXFxcnBvbGljXFdQTEZDQD08OTg2NTY4PkpVYGlwdXd3dXh5gISGiYuLioiIh4WGh4aGg4B5cGZiXlxcXF1eX2JmaW5wcXJycXJydHV2dnZ0cWtlYV1cXV9iaG93foSJioqJiIiJioqJh4B8eHNxdnl7enp4d3d2eHh4eHh3dXJvbW1ucXM2NjU0NDQzMjEwMTIxMTIxMTEzMzM0NDQ2NTc3ODk5Ojk5Ojo8Oz0/Pz9AQUBBQUFAQD5AQEA/Pj08PT49PTw8PT08PDs6OTk5OTg4NzY2NjU2OTs/QkZKTVBTVVVUU1RYXWFjZWVnZWNgYGJjZmVnaWlpaWxsa2xpaWdkY2JgW1VMRT01LiwqKikqKikoKCgmJicnJiUlJSUlJSUkJCMjIyMjIyQkIyMjJCUlJSUlJSQlJycnJygpKissLC0tLi4vLy8vLy8vMDE1Njc8QEVJTVNXWVxfZGhqbW5wcHJxb2ppaGRjYWJjY2JjYWBbVE1DPDUvLiwsLCwrLCwsLCwtLCwrKysrKysrKyoqKiooKCkpKCgoKCotMjxIVWRtc3Z2dnZ2dnl5d3RpX1NJRURFR0dGRUVCPjs7PEBMWGRyeoKDg4KBgoKCgoB3cF9MOy4mJicpLTA1O0BJUFxncXZ3d3dzcGtfVU1GPzUuKygpKSoqKyssLCwtLi4vLzExMTROZVJLT1VeTT9RW2dxd3p6eHh3d3d3dXNtaFxPRT04NTQzMzIyMjAvLy8vLy8xMjQ3OTs+QUNIS0xOU1VXWl5iY2dtcXR4foKDhoeJiouLiomGhIOBfXl0cWtmX1hUUk9PT1JSVVhYWlpdXl9iY2Vnamttbm9wcXJ0c3NycnNwbm5pZF1WUUtEQT47Ojc2MjI0OD9KVmBrcXZ5eHZ4e3+Eh4qLi4iHh4aFhoeJh4R/eG9nYmBeXV9gYGNlaGpucXJycnNzdXZ1eHZ2c3JpY15dXF5iZmxzeYCHiYuLioqJioqLioZ/e3Z0cnR4fHx4eHh3d3h4eXl4d3RxbWttb3J0NjY1NDQ0MzIxMDEyMjIyMTExNDQ1NTU1NjU3Nzk4OTo6Ojs7PD0+Pz8/P0BBQEFBQEBBQD8/Pj49PDw9PDw9PTw8Ozs6Ojk5OTg5OTY2NjU0NTg5PD9CRkhLSkpJSkpJT1RYXV9laGhoZWRlZ2ZlZWRkZGNlZWZnZ2ZnaWhoaGViW1NMQTYwKikpKiopKSgoJyYnJyYlJSUlJSUlJCQjIyMjIyMjIyMjIyQlJSUlJSUlJicnJycoKSorLCwtLS4uLy8vLy8vLzA0Njk7QUdMUVJYWmBkZ2ltb3Fzc3d1cm9tamZlY2FjZGNiYmBbVU9GPDUxLy4sLCwsLCwsLCwsLSwsKyssLCwsKysrKyoqKCgpKSgoKCgpLDE5RFJfanF2dXR0dHZ5enp1bWJYTUdGRkdHRkVDPzs4Nzg8RlRibXaChIOCgYGCgoKBenNlVEIyKScpKzA0OT9FTVRdaHF3eHd3cm9pXFBIQDgvKykpKSkqKisrLCwsLS4uLy8xMTIyPWdoUlBJWmFKTVtoc3h6eXh3d3d3d3VzbWhcT0U9ODU0MzQzMjIwMDAwMDAwMDQ2Nzk7PkFDSEtNT1JUWFldXmNnbHB0eH6ChYiIiouMiYmIhYOCgH15dHBqZF1YVlRVU1VYWFpcXV9gYGJjZGhpaWttb29wcXBxc3JzcnJzcnBvbWZgWlRNQz06OTc1MzEwMjhAS1dha3J2d3h2eHt/hIeKi4uJiIeGh4iHiIiFf3hvZ2JgYF9fX2FkZmlsb3Fyc3N0dHZ2d3h2dnJwaWNeXFteYmdvd32EiIuMi4qKiYqKiomEfHhzcHBzeXt7eXh4eXl4eHl5eHd0cW9tbnBydDU1NTU0NDQyMjMyMjMzMzMzNDU1NTU2NjY2Njc5Ozs7Ozs8PDw+Pj4/Pz8/QUJAQEBAQD8+Pj09PT0+PTs7Ozs6Ojo6Ojo5OTg4Nzc1NTU1NDQ1NTc6OTw+PT4+Ojk5O0NJUVdfZGhpaGdmZWViYVxXVFRYXFxdXV1gYWRmaGprbWpgVkxBNC0qKSoqKCgpKCcmJiYmJiUlJSUlJSQkJCQjIiMjIyMiJCMjJCUmJiYmJicnJygoKioqKywuLS0tLS8vMDAwMTI0Nzw/REtQVFZZX2Jnam1vcXJ2dXl4d3RxbWllZGRkZGNjYl9ZVlFGQTkyLCwsLCwsLS0tLSwsLi4tLS0tLi4tLC0tLS0rKiooKSkpKSkpKSwyNz9OXWlxdHV1dHV2d3l5d3BnXFFJR0dIRUdFQz03NDQ0OUFPX2t5gISFg4GAgYOEg353a1pIOS4qLTA0Oj5DSlFYX2hxeHh5dnFvaFxPRDkwKikpKSkpKioqKissLS0uLi4vLzEwMztSZFRUR05OUlFaZ3R6fHp6eXZ2dnZ0cW5nXE9GPjo3NjY1NTUzMTEwMDAwMDEzNTY3Oj1BQ0dKTU9SU1ZYWWBiaGpuc3h9gYSGiouJiomIhIOCgX98eXZwaGNcWFZXV1ZZW11hYmNlZWdqa2xubnBxcnNzcXFyc3NycnJxdHJycW5qZV9YUUpCPDY1NTMyMDI3QEtWYWxzdnd3dnp9gYWIi4uLiomIiIiJioqGhYB5b2hkYmBfXl9iZ2ZqbnJxc3NzdHV4eHh6d3VybGZhXV1dYGVqcnl/hYmLjIuKiouKjIqIgnx3cW1wdXl7e3h3dnZ2eHh3d3l4dXRwb3Byc3U1NTU1NDQ0NDMzNDM0NDQ0NTU1NTU1NjY2NjY3OTs7Ozs8PDw9Pz4+Pz8/P0BBQEBAQD89PT09PTw7PDw6Ojs7Ojo6Ojo6OTk4Nzc2NjU1NDMzMzMxNDU2NjUzMzAwMDI5QEhRWV1iZWdlZmJfWVRPSEZGRkhLTFBRVFlcYWZrbXBubGVZTD4xLCsrKyopKSgoJyYmJiYlJSUlJSUkJCIiIiMjIyMjIiQkJCQlJiYmJiYnJygoKCoqKissLi0tLS0vLzAwMTI0OTxBRktQVVlcY2dpbm5ydHZ4ent8e3d0cm1qZ2ZkY2NiYF5ZVk9IQDgyLSwsLCwsLC0tLS0tLS4uLS0tLS4uLi4tLS4uLiwrKikpKSkpKSksLzU+S1llbnN1dXR1dnd5eXh0al9VTUhGR0ZFQ0A6NTEwMjQ9Slpndn6EhoSBgICBgoKAeXFhTj4zMDEzOT5CSE5TWl9ocXZ4eXhzbmhcTD40LSgpKikpKSoqKysrLC0tLi4uLy8wMTQ9VE5RT0tRTEJNXWp2fHx7eXh2dnZ2dHFuaF9SRj46NzY2NTUzMzExMTEwMDAwMjQ2Nzo9QEJFSEpNUFNVWVteYGVpbHJ4foKHiouLioeHhYOCgYB+e3d0cGpkXl1YWltbXWBiZGVpaWxsbnBxcXJydnZ2dnR0c3RzcnJydHV0dHVzb2tmXlhQRkA7ODY1MzIzOEBLVmFsc3Z3dnh7foKGiIuLi4qJiIiIiYqKh4R/eG9oZWNgX19gY2Vmam5yc3V0dHV2d3l5eXd1cWxlXl1dXmBmbnZ8goiLjIyKi4qKi4uJh4F8d3Bsb3N5e3t4eHd2dnh4d3d4eHV0cXBvcXN1NjY1NTQ0NDQ0NDQ0NTU1NTU1NTU2NjU1NjY4OTk6Ojo7Ozs9PT09PT8/Pz8/Pz8/Pz8+Pjw7PDw9Oz07Ozs6Ojo6Ojo5OTg4NzY1NDU0MzIxMS8uLjAxMTAtLS4sKywuNThBSlFZXF1hYWFcVU1DOjU1Njg3ODo7QUZLUVljamxydnRtY1VKOjEtLiwrKikpJyYmJiYmJiYlJSUkJCQjIyIiIyMjIyMjIyMkJSUlJiYnJycoKCgqKissLC0tLS0uLzAwMTM0OD9CSE5RWV1hY2ZqbXJzdnd6fHx5enp2cm5samVkZGJiYV1ZUk1JQTozLSssLCwsLS0tLS0tLi4uLi4uLi4vLy4vMDEyMjEwLS0qKSkpKSkpLC8zO0lXY21ydXR0dHZ2eHt3dW9lV01JR0ZFQ0A9NzItLC4yOEVVYnF8goWDgYGAgIKCf3t2allIOjc3OD5CR0tPU1pianF3e3l4dG5oXU0+MywpKSkpKioqKiwsKiwuLi4uMC8wMDIzT1JZXFJQUlRLQVtrdXp8enl3dnd3dnVybWdeUUY+OTc2NjU0MzIyMjExMDAxMTEzNDU6PT5BREdJTFBTVVdZXl9jZmpxd36Dh4mLi4qIhYSCgYCAfXt4dG9qZWFfX11eYWJkZWhpamtucHJ0dXZ3dnh4d3Z2dnR0cnJyc3R1dnZ3dXRybWlgXFNIQTo3NDMxMjZATFdibHR4d3Z4en+ChoqNjIuJiIiIiYqKioiDfndvaWJgX15gYmRnaGxwcnR0dXV3eXp6eXp3dG5pY15dXV9jaHF4f4SIjIyMioyLi4yLiYV/eXJta290eHp6d3Z1dnZ4eHh2eHl2dXJwcXV0dDY2NTU0NDQ0NDQ0NDU1NTU1NTU1NjY2Njg4OTk6Ojo6Ozs7PT09Pj4/Pz8/Pz8+Pj4+PT08Ozs7PDw8Ozo6Ojo6Ojo6OTk4ODY2NDQ0NDIyMTEvLi4uLi4sLCssKyssLjA0OkRJTlJWWVlYUkk+NDAuLi0sKywuMDI3P0dQWmNqcXV3c2thVUg8NzUxLyspKCYmJiYmJiYmJSUlJCQkIyMiIiMjIyMjIyMjJCUlJSUmJycnKCgpKiorLC0tLS0uLy8wMjM1OD1ES05TW15jZmhsbm90d3h6fHt9eXh3c3BsaWhlY2JgXVpYUktGPzkyLSsrLCwsLC0tLS0tLS4uLy8uLi4uLy8vMDEyNDQ0My4tLCsqKikpKSwtMjpGU2Frc3V0dHR1dXd5enhvZV1RS0dGREI+OjUwLCoqMDZBUl9teYGFhYKAgICChIJ+d29hU0M8Oz5CR0tOU1dcZGpxd3t6eXZxal5PPzMsKigpKSoqKiosLCwtLCwuLi4wMTEyMz9ib2NSSktIUFNhbHV6fHp5d3Z3d3Z1cm5oXlFGPjk3NjY1NDMyMjIxMTAwMTExMzQ1Nzo9PkNFR0tNUFNXV1tcX2RqcHh/g4iJioqIhoSCgX+Afn16eHRvaWVhYV9gYWFjZGZpaWttbW5xdHd2eHh6enl4eHh1dHJycnN1dnl5enp5dnNwaGJaUUpBOzg2NTM4QExZZG50d3l4enuAg4eLjo6MiomKiYqKiomIg353bmdiYmFgX2FkZ2ltcXR0dHV1d3l7e3l4dnJtZmFeXV1gY2p0fIGGi4yMi4qMjI2Mi4mFf3pxbGxvdHh6end2dXZ3eHh4dnh5eHVycHJ2dnU2NTU1NDQ0NDU1NTU1NTU1NTU1NTU1Nzc4ODo6Ojs7Ozw8PT0+PD0/Pz8+Pj4+Pj4+PT09Ozs7Ozo6Ozo6OTo6OTo7OTg4OTc2NTU0MzIxMTAwLy8uLi0sKysrKysrKiorLzU7QUdMTE9OSkM5My0qKSkqKioqKiorLjQ8Rk9aY21yd3VzamBSTUQ9OjUzLSooJiYmJicnJiYlJCMkJCMiIyIjIyMjIyQkJCQkJCQlJSYmJycoKSkpKywtLS4uLy8vMDI1ODxBSlBUW19jZ2ptcHJzdXd3enx8eXh3cW9ua2dkYGJeW1hTT0tEPTYxLi0sLCwsLS0tLS4tLi4vLy4vLi4uLi8vMDIyNDQ2NTQwLy0tLCwqKSkqLDA5QlBcZ3B0dHR0dHR2eHp5cWlfVkxHRkNAPDgzLisoKS41P0xaaXaBhYWDgIB/goOEgn10a1tMQ0FDR0pOUVNWXGNpcnd7enp3cWleUEE0LioqKioqKisrLCwuLi4uLy8uLjAwMjJNbmFBS0hKQU1VYG12fHx7eHZ2d3d2dnRvaF5RRz86ODU1NTU0NDExMjIwMDExMTMzNTU2Oz5BRUVISk1QVFZXXF1iaG93fYOGiImIhYOCgYB+fn17eXZybWhkYmJjYmFjZGRmZ2hrbG5vcXN2eHh5ent9eXl4dXNycnJzdXd7fnx8en18eHFrY1pSSUE6NjQ0OEFNWGRvc3Z6eXl+gYWIjY6OjIuKi4uLi4uKiIV/d21mYl5dXF1fY2ZpbnJzdHV1dXZ4eXl6d3RwbGRfXV5eY2dvd3yFioyNjIqKjIyNjYyJhH93cGtpcHV3eXl3d3d3eHd3eHZ4enl3c29wcnV1NjU1NTQ0MzM1NTU1NTU0NDQ0NjY2Njg4ODk6Ojo7Ozs8PDw8Pj0+Pz8/Pj49PT09PTw8PDo6Ojo8ODo6Ozk5OTg5OTk4ODc2NTU0NDIyMC8uLi4uLS0sKyoqKioqKikpKiotNDo9QENBQDo0LCsqKSoqKiopKSkpKSwuMjtHUFtlbHV2dHFpYVpST0pFQDozLCgnJyorKyooJiUkJCQjIiIjIyMjIyMkJCQkJCQkJSUmJicnKCkpKissLS0uLzAwMDE0ODtCR01UWmBkZWtucXF0d3d4eXt5dnRzcG1raGhkYl9dWFVSTUdCOzUxLS0tLCwsLC0tLS0uLi4uLy8vLjAwMDAvLzExMzU0NTY1MjAuLSwsLCoqLC0xOEJNWmVuc3V0dHR0dnh5d3JqX1ZMR0VCPjk1MS0pKCksMzpGVmRyfYGEg4B/f4CBhIR/e3FiVU1ISUtNT1FTWFxjZ3B0dnd3d3NtYlNFPjssKisrKiorKy0tLi4uLi4vLi4wMjQ2VmNKQkpHS0lIV2Btdnx8e3p3d3h4d3Z0b2hfUkhAOjg1NTU1NDQ0NDIyMDExMTEzMzM1Njg7PkFERklLTlFTVVhcYmhwd32DiIiIhoWCgYB/fn17fHl0cGxnY2JjY2NjYGNkZWZoaWptb3BxcnR3eXt8fHp6eHVzcnJyc3Z5e359foCBgXx5cmtkWlJIPzcyNDhBTVpmb3Z4eXl7f4GFiI6PjoyLiouLi4uLioiFf3duZ2JeXFtdX2Jlam9yc3Z2dXZ4enx7eHdzbmhhXlxcXmJocHeAhouNjYyLiouMi4qMiYN+dGxqam90d3l5d3d3dnd2dnd4ent5d3RzdHV2dzU1NjY3NzU1NTU1Njc2NjY3Nzc3Nzc4ODo6Ojo6Ozs7PT08PT09Pj4+Pj09PDw8PDw8Ozs7Ozs7OTk8Ozo6ODg4Nzc3NjU1NTU1MjIzLy8vLiwtLS0tKyspKSkpKikoKCkoKSwxNTY5ODQwLCooKCgqKioqKSkpKSkpKy0zOUVQW2VxdXZ1cmxnYl5ZUU1GPjgwLC0yMzMyMi0nJSQkIyMjIyMjIyMjIyQkJSUlJSUnJyYoKCkpKissLS0tLi8vMDE0Nzo/Rk1TWl5kZ2psbnBxcnZ3d3d1c3JvbWtpZmJfXFtYVFJOSEQ/NzMwLS0tLSwsLS0tLS4uLy0uMC8uLi8xMTExMjIyMjQ0Njc2NDEvLS0tLSsrKysuMTU+SlVkbHJ0dHNzc3Z3eHdzbGFXTEZCQTw4My8sKScnKjI4Q1Jhb3qAg4KCgH9/gISFgn13bF9VT05PTlFSVVhbYGZqcnd3d3d0bWJUSU5KLSkpKSoqKystLS0uLi4vLy8vMDE2UWxHNzw5P0lJSlZhbXd7fHt5eHd5eHd2dXFsYVJHQDw5NjY1NTQzMzMzMzExMTEzMzQ0MzY4OTw+QUVHSk1OUFJUW2BocXl+g4eIiIeGhIB/f318enl2cm5pZWJhYGFhYWFhYmBhYmRlZ2doam5yc3V4enp6eHZ0cnJycnR2d3l7en6ChISCfntxa2JaUUU8NTQ5RFBbZnB3eXl5en6ChomPkI+MjIuKioyMi4qKh4F5cGplXFtaWlxgZGpuc3V1dnZ4eXp7e3h2cWtkX1tZWVpgaHN7goiMjouLi4yLi42MjImDfXNraGpuc3h5eHd3dXV2d3h2eHt7endzdHV1dng2NjY2Nzc1NTY2NjY3NjY2Nzc3Nzc3ODg6Ojo6Ojs8PD09PD09PT4+Pj49PTw8PDw7Ozo6Ojo6Ojo5OTk5OTg4ODc3NzY1NTU1NDMyMTAvLi4sLCwsLCsrKikpKSkpKCgpKSgqLC0wMC0qKSkoKCkpKSkpKSgoKSkpKSorLTI4Q1BcaXB1d3V0cGxsZmFbVEtFPzo7P0BBPz83MSwlJCMjIyMjIyMjIyMkJCUlJSUlJycnKCgqKiorLC0uLi4vLzAzNzo+Q0pQV15jZmtsbW9wc3R0dHNycG5raWZkYV1cWlhTUE1JREA7NjIvLi0tLS0sLC0tLS0uLi4vMC8vLy8wMTExMTIyMjIzMzU2NTIvLy4uLS0sLCwsLTAzO0dTYGpydHNyc3N0dnd3c2xiWE5GQD85NTAsLCknJykuNj9MW2l1fYKCgoB/foGDhIOAfXNnXVVPT1BVVVdaXF5jZ2xydnZ2c2tfUlBHQi8qKioqKisrLS0tLS4uLy8vLy8yNWGGXTk4SVFPT0tVY2x4fX59eXh4eHh6eHVxbGJUR0A8OTY2NTU0MzMzMzMyMjQ2ODg3NzU1Njc5PD5BREZISkxOUFheZ292foOHiIiFhIKAfn59e3l3dnNtZ2RhYF5dXl1cWltaW1pcXWBjYmRmaW1xdXZ3d3RzcXFycnJ0dnZ4enh8foGDhIJ+enJqYVlPRTw5O0ZRXWhxeHp6en2AhIeKj5CPjIyLioqMjIuKiIWCenRsZl5YV1lbYmhtcnR0dHV2eHl6e3l1dG5oYFtaWVhbYmt0fIOIjIyLioqKiYuMjYuIgntybGlrbnN5eXh3dnd2dXR1dnh7e3p3dHN1dnV3Nzc3NTc3NTU3NzY2NzY1NTg4Njc4ODk5ODk6Ojk8PT07Pj4/PDw9PT09PDw9PTs7Ojk5OTk5OTk5OTk4ODg5ODk2NTU1NTMzMjMyMi8uLiwtLCwrKyoqKioqKSkoKCcoKCcmJygoKSknJygoJygpKSgnKSkoKCgoKCgoKCouND1HU15ocnd5dnV1c3BuaGJdVlFOT1BRU1NPSEE3LCUjISIiJCQjIyMkJSUlJSYmJycnJycoKSosLCwtLi4wMTEyNTg9QklPVlxhZmlrbW9wcnV0cnFuaWlmZmNdWllWVFBMSkdFQj44MjAuLi4tLS0tLS0tLS0tLS0tLjAwMTExMTMzNDQyMjIxMTM0NDIyMDAwMC4tLC4tLS0vMzlFUF9ncXRzc3JzdHZ2dXNuZFlORUE9ODQuKyspJycpLjM6R1dncHqCg4N/gH1+gYOEg4F6b2VcVlRTVVZYWllbXGNpb3N2dXRtYVhTNz43KywsKyssLCssLS0uLi8wMDAxMzZVd2dJSklUVFFPWWRweH19fHl5eHp5enl5c2xjVUdAPDk2NjQ0NDMyMjEzNDY5PTw9PDw7ODY1Nzk8PUBDREZJSlBVXWdyeX+Dh4eHhYOBgH59e3p4dnZwbGViXlxZWVVWVVRTU1NTUlRUVVhaXWFma25ucXFxcnJycnJycnNzc3V4eHp9f4KEgoB4cmliVktCPj9KU19qcXl7e3p+gIWJjJCQj46Mi4uLjIyMjIyIg313cGdgXVlcXmNqcHN1dHR1d3h6e3p3c3FqZF1ZV1dXXGRtd36Gi4yMi4uKioqLi4yLiIJ7cGtpa21zeXl4d3V1dnZ3d3Z3e3t7dnRzdnV0dDc3Njc3NzY2Nzc3NzY2NjY3Nzc3ODg5OTo5Ozs6Ozs7Ojs7PD4+PT09PTw8Ozs7Ozk5OTk5OTk5ODg4ODg4ODg3NzY2NDQyMjEyMC8uLi0rLCwrKysqKikqKikpKCgnKCgnJicoKCcnJycnJycoKSkoJykpKCgoKCcnKCgoKy42PUhSXWhydnl4eHd1dHFuaGZhYGFjZGZmZFtTSDorJCQiIiMjIyMjJCUlJSUmJicnJycoKSkqLCwsLS4vMTExNDc6QUZNU1lgZGdqbG5wcXNzb2xoZmNgXFxZVVJOS0hFRUE+PDc1MC8uLS4uLS0tLS0tLS0tLS0tLjAxMTExMjEzMzQ0NDMzMjI0NTIyMjExMTAvLS4uLi4tLzI4Q1BcZ29yc3NycnJ0dHRybWRZTkVAPDcyLispKCcnJysxN0FRYGx3gIODgH99foGDhIWDfnVoYFlXVldXV1dVV1heZm10dXVyaFpYTDdAOiwsLCsrLCwrLCwtLi4vMDAwMjI+WF9cVFdDQE5VVVhmcHh9fXx5eXh6e3p5eXNsY1VJQDo4NjY0NDQzMzMzODk8Q0ZFRkVEQj46Nzc3ODs8PUBDR0pQWWBpcnl/hYiHhoOBgIB+e3p6eHZ0bmljX1lUU1BOTUxKSUpLTExMTE1QUVRYXWVoa25xcHFxcXBycnJycnFxcXJ1dnp+gIKCfHhwZ1tUSUFCS1Rga3J3eXl7fYCFiYyQkI+OjIuLi4yMjIuLiYV/e3RtZWBeXmFma3BzdXR1d3h6eXp4dXJuZmBaVldVWF1lb3d/iIqMjYuLioqLjIyLioaBd29oZ2ptc3l5eHd2dXZ2dnZ3eXt7enZycnR0c3M3NzY4OTg4ODY5ODg3Nzc3NjY3ODc4Ojo6Ojs7Ozs8PDw8PDw8PDw9PDw8PDw8Ojo5OTg4OTk4ODg4ODg3Nzc3NTU1NTIxMTExMTEwLS0tLCsqKiopKSkpKSkoKCcnJycoJycnJycnJyYmJycnJygoKCgpKSkpJycnJygoJygsMjQ+R1FbY2pvc3Z2dXR0c3NvcG9xcnV2dnJqZVdJOSkiISEiIiQkJCUkJCUlJiYmJicoKSorLCwsLC0vMDEyMzY5PUNJT1ZcYWZpbG5vcHNxbGtmYlxaVlJQTEpIR0NBPTo5ODQyLy4uLi4tLS0tLS0uLi4uLS0tLTAwMDEyMjMzNTU1NTU1NDQ1NTQ0MzIyMjEwLy8vLy0uLjAyOEJNWGVvc3JxcXFxc3RzcW1lWk9FPjs2MCwnJygoJykrLjU/TFpmdHyDgoB9fn+Bg4WFhoB5bmZdWVhYV1VSUlBWXGJqcnZ1cmFYWUA2PDIsKywsLS0tLS0tLS4uLzAxMDAzO1tmXlpgWztIVFhWaHB6fX17eXh4eXl5eXp0bWNVSkA5NjU0NTU0MzI0Njs/RUpOUFBST0tEPjk2Nzc3OTw+QUZLUlpjbHN5f4WHhoaEgH9/fXx8enh1cW1nX1lTUE1HRkZFREVERERFRkdHSUpNUlleZGdqbG9xcnJzcnJyb25ra2xtbW9xdnx/gYB7dGxiW1BKRk5XYmxzeXt7fX+ChoqOkJCPjo2Mi4uMi4uLjIqFgn12cWpmZWVmbXBzdHV1d3h5eXl6d3NuaGJdV1JTU1hdZ295gomLjIuLi4uLi42MjImGgXdsZWZpb3V5eXd2dXV2dnZ2dXd6enp2dHJxcXFwODg4ODk5OTk3Ojg4OTk3NzY2ODg3ODo6Ojo7Ozs7PDw8PDw8PDw8PDw8PDw6Ojo6ODg4ODg4Nzc3Nzg3NTc3NDU1NTUxMTExMDAuLS0sLCwrKiopKSgoJygoJycmJiYmJyYnJycnJycmJicnJycoKCgoKCgnJycnJycoKCcoKiswNT1HTlRdY2ZpbG5xcnR1d3h6fH6BhYV/enNmVkY1KCEhIiIkJCQlJCQlJSYmJiYoKSopLC0tLS0vMDAyMzU4O0FGTFNZYGVoamxtbm9xbmhjXFlUUE5IREE/Pjw7ODc2NDIwMC8vLy4uLS0tLS0tLi4uLjAwMDAwMTExMjMzNDU1NTU1NTU1NjY0NDQzMjIwMDAvMC8tLy4wMjhATFZjb3JycXJvcHFycXFtZVpPRT04NC8rKCgpKCgpKy0zOkVWZHB6gIKAfXx9f4KGh4aAe3FpYFtYV1VRUU9MT1ReaXJ1dHZiUUs/ODgyLiwsLS0tLS0tLS0uLy8wMDAxMjVNa19XZFY4O1BXV2Rxen19e3l4eHl5eXt5dG1jVUpAOjc3NTU1NTQ0NTlAR01TWFtcW1lVTkI7ODU2Njc6PkBGT1ZdZm52fYKGh4aEg4B+fn58fHp4dXFrZV5UTEdDQUJCQUFCQUFBQUJDQ0RGS1BXXWBjam1xcHBxcXJ0dHBsaWVlYmJmaG50en+AfXlvZ19XUE9RWWJsdHp7e31/hIiJjpCQj46NjIuLjI2Mi4uJiIN+enVxa2tqa3BzdXV2dnh4eXp6eXVybGZeVVJQUlJXXWhyfISJjIyLi4uLi4uNjIyKhX53bWVjanB2eXl3dXV1dnZ2dnV2eHh4dnNycHFwbjk5OTk5OTk5OTk4ODg4Nzc4Nzc3ODk6Ojo6Ojo7PDw8PDw8PD09PDs8PDs6Ojo4ODc3NzY3Nzc3Nzc2Njc1NDY1NDUzMTEyMDAvLi0sKysrKiopKScnJycmJigoKCgpKSYlJSYnJycnJiYnJycnJycnJycnJycnJycnJignJycnKSs0O0JITlJYWl1iZGhudXd9gISGiIuIhoJ8cmVVRzUmIyEiJCQkJCQkJSUlJScoKioqKiwtLi4vMDExMzU4Oz1CR05WXGJlaWtsb29vbWlhXFROSEVBPz08OTY1MzQzMjEvLy8vLS0tLS4uLi4uLi4uLi4vLzAwMTEyMzMzNDU1NTY2Nzc1NTY2NTU0NDMzMjIwMDExLi4vMTM3PkpUYGtwcXJvb25wcXBwbWVbUEM7NTEtKicnKCkoKSosLzdCUF9sd3+CgX59fX+Dg4WFgX51bWNeWlVRTUlHR0hQW2pxdnRrUkJLTkY+NjAsLC0tLCwtLS0tLzAvLzEwLzI1SFtbW2lbNzZQVFZkcnp/fnp5eXl5enp4eHNtZFVKQDo3NTU2NDQ0NjtASFBYXmJnaGZiX1ZLQjk2NDM1OEBGS1NaZGtyeYCEh4iFhIKAf318fn16eHZyamJaTUdDPj8+PkA/QEBAPz8/QUBDQ0dOVFthZmltb3FycXFzc3FwamVdWVVWWl1ja3N3en17cmxkW1hVWV5nb3V6fX1+gYSHio6RkZCPjYyMjI6Ni4qHhYF8e3t4eHRwcXF0dXZ2dnd3eXt6eXd0b2ljW1RQT09QVVxncX6Fi4yNjIuLi4uMjY2MiYR+c2tmZmtxd3p5d3R1dnZ2dXV1dnd3d3Nxbm5ucG45OTk5OTk5OTk5ODg4ODc3ODg3Nzg5Ojo6Ojo6Ozw8PDw8PDw9PTw7Ojo6Ojk5Nzc2NjY2NjU2Njc2NTU1NTY1NTQzMTExMC8vLi4sLCoqKiopKCcnJycmJiYnJycnKCgmJSUmJycnJyYmJycnJycnJycnJycnJycnJygnJycmJiUoKjA1OTxDREhLT1RcZG52fICEh4mKiomFg3xvY1JBLiQiIyQkJCQkJCUlJiYnKCorKystLS4uLzAxMzQ2Nzs/REpRWF5kZ2psb25tbWhgWlBKQ0E9Ojg2NTQ0MzExMjAwLy8vLy0tLS0uLi4uLi4uLi4uLy8wMDEyMzM0NDU1NjY3Nzc3Nzc3NzY2NTUzMzMyMTAwMC8vLzEzNz1IU19qcHNzcG5tbm9yb2xnXFFFOjQvKykoJygpKCkqKy81PEpaZ3N8gYF+fHx8gIKEhIN+eHBnX1lUUEhFQ0NHUFpmcHRmTT5EXFxNPzYwLCwtLSwsLS0tLS4vLy8wMC4yPVJZXmNkVElRUU9WZ3F6fn56eXl5eXp6eXdzbWZYS0E6NzU1NDM0NDg9RU5VXmZscXJwbGVdUEU8NjUzODxCS1BWYGhvdX2BhYaHhoOBgH9+fX5+fHp2cmpiVk1GQT89Pj0/PD49PT48PT8+P0NHTlRbYWVpb3BwcXBxc3Fxb2ljW1FKSE1UWmNrcXV6eXZvaWFdXF1iZ292e3t7f4SGiIuPkY+Pjo2MjIyMi4iHhIF6eXp6e3t6eHZ4d3d3d3d4eXh7enl3c21mX1dQUE5MT1VeaXR+ho2NjYyLi4uLjI2NjImBenJpZmZqcXd6eHd1dXZ2dnV1dXZ3d3ZycG1ubWtqODg4ODk5OTk5OTg3ODg3Nzg4ODg5Ojo6Ojo6Ojs8PDw8PDw8PDw7Ojo6Ojo5ODc3NjY2NjU0NTU1NTY1NjY1NTUyMTEwMDAvLi0rKyoqKSopKSkoJyYmJSYlJSUmJiUlJiUlJicnJycmJiYmJycnJycnJycnJyYmJiYoJiUlJiUlJSUnKi8xMTIzOEBJUFljanN6gIKEhYWIhoaCeG9dTDgnIyMkJCQkJCQkJSgoKCopKSorLS0vLjAwMTM1Nzg9QUdPVVphZWhrbm9sbGpjXFRJQz05NjY1NDQ0NDMxMjIwMDAwMC8tLS0tLS4uLi8vLi4uLi8vMTExMjMzNDQ1NTY2Nzc3Nzc3Nzc2NjU1NDMzMzAyMTEwMC8vNDg7RVJeaXBycW5ta21ucnBtaF1RRTozLispKCYoKSkqKyouMjtGVmVxeoCCfnx6e36Bg4SDf3pyalxWUEtCPz09RE1YZnBoSTdCXmlgUUQ4MC0uLS0sLC4uLS0tLi8wLi8xM0FdXWJhVVNZWFNQWWRxe359e3l4eXp6enl3dG5lV0tBOzg0NDQ0NDY7QUpUXWZvdHl5enNqYFVHPTc0NztCSlBWX2Zvc3qAg4aGhYODf35+fX18fH17d3FoX1VKQj8+PDw8PTw+PTs7PD09P0BER05WW2Fnamxubm9xcXJycGxnX1dLQzw/R1FZYWhtdXV2cWtnZGJhZGpyeX1+fH+ChoiNj5GQj46NjIuLi4mHg4B9e3t9e319fXt7enp6eXl4eXp6fHt6dW9pYVpTTkxKTE9VX2t2gIeNjYyLi4uMjI2NjoyJgXpxaGRlanJ3enh2dXV1dnZ2dnV2d3d3c29vbGxqaDk5OTk5OTk5OTk4Nzg4Nzc4ODg4Ojo6Ojo6Ojo7PDw8PDw8PDw8Ozo6Ojk5ODc3NzY2NjY0NDU1NDQ1NTMzMzQ1MjExMDAuLS0tKisrKigpKSkoKCYmJycmJSUlJiYlJSYlJSYnJycnJiYmJicnJycnJycnJycmJiYmJyclJSYlJSUkJCYoKSkqKSowPENLVF1mbHJ2eXp8goOGhX50ZFM/KiEhJCQkJCQkJSYoKCgpKissLC0uLi8wMDEzNjg5PkRKUlhdYmdqbW5tbWpkXVVMQjk4NzQ0MzMzMzMzMTExMDAwMDAvLS0tLS0uLi4vLy4uLi4vMDExMjMzMzU1NTU3Nzg4Nzc3Nzc3NzY1NTU0MzIyMTEwMTEwMDQ4O0NOWmlvcXFubGxvbXBxb2deU0c7Mi0qKSgoKSkpKysqLDM5QlBfbHZ9f398enp7foGCgn97dmpbU0xFPzo5OkFLV2Jwa045TGpvY1JFOTAtLi4uLS0uLi4uLS4vMDAxMjNGYmliU01qYlJVU1dmcnt+fXt5eHh5eXl6d3RuZVdLQTo3NDQzMzQ2PEJNVmJsdXt/gH11bGJVSTw3NztCSE9WXWZsc3l/goWGhoOBgX99fX58fX59e3dxaF9USkM/PTw7Ozs8PDs7Ozw8PDw9QkdOVltgZmtrbXBxcHFyb21qZVxSSj83Nj1FUFhgZmxzd3JtaWlmZ2ltdHp9fn+BhIeJjY+RkI+OjYyLi4qIhIB7eXdzdXd8fX9/f357e3p6eHl6enx7eXRtZ11WTkhJSElPVWBtd4KKjY2NjIuLjIyNjYyLh394bWViaGxyd3h5d3Z2dnZ2dnZ1dnd3dnNvbWhoZ2U6Ojo6Ojo6OTk5ODc3Nzc3ODg4ODo5OTk5OTs7Ojo6Ojs7PDw8PDo7Ojs5OTg4Nzc2NTU1NTQ1NTU0NDQ0MzM0MzIwMS8tLS0rLCopKCgnJyYmJyYnJiUkJSUlJSUlJSUmJiUlJiYnJyYmJiYmJiYnJiYnJycnJycmJiUnJiYmJiQkJSUlJSUmJSYnKzA1P0ZOVFphZWlscHh+hYaEeWlYRC0iJCMjIyMkJSYnKCkpKisrLSwtLi4vMDEyNDY5PkFJUlZcYmZoa25ubm1nYFhQRjs3NDQ0NDQzMzMzMjEyMTAwMDAwLy4uLi4tLi0tLy8uLjAwMTExMTMzNDU1NTU3OTk5OTk5OTk4ODc3NjY1NTQ0MjIxMTExMTE0ODtATFdkbXBwb25rbW5ucW9sZFxOQTUtKSkqKSopKSoqKywxOD1LWmh0e35+fXp5eXx+gYCAfXdqX1JIQTw1NTc/SVRganFKP2F1cWdWRzw0Ly4sLC4uLi4tLS4vMDAwMDM7Wnp7ZUhOXFxISVJZZHF6f398eXh2eHh5eXh1b2VYSkA4NDMzMjEzNzxFUFpkcHl/hIN+dW1hVUk/PD5BSFBXX2Vtcnh9g4WHh4aCf35+fX1+fn5+f3x3cWpfU0lAOzw7Ojk5OTw8Ozs7Ozw5PUFHT1ZdY2lsbm9vb29ub25tZ2JbT0c6MzA0O0VOVmBmbnFzb2pqa2xvcnV7fX5/goWIio6PkI+PjoyKi4qKiIN8dnJuaWx0eH1+gH9/f3x7e3t7e3t9e3hxa2RcVExIRkZJTVdkcHyFi46Oi4uLi4yMjY2MiIR+dWtjYWdscnd5eXd1dXV1dXZ0dnd2dnVxbmtqaGViOjo6Ojs7Ojk5OTg3Nzc3Nzg4ODg5Ojk5Ojo7Ozs7Ojo7Ozs7Ozs6OTo4Nzc2Njc2NTU1NDQ0NTQ0NDQ0NDMyMjIxLzAvLiwsLCooKCgoJycnJicmJyYkJCUlJSUlJSUlJCQlJSYmJiYmJiYmJiYmJyYmJycnJycnJiYlJyYmJiYkJCUlJSUlJCUkJiYmKjA5QEVKTU5TWmJueYKGhHltXEQtJCMjIyMjJCUmJygpKSoqKiwtLS0vMC8xMzY5PEJHTFRZXmVnamxubm1nY1xVSkI7NzQ0NDQ0MzMzMzIxMjEwMDAwMC8uLi4uLS0tLS4uLi4wMDExMTIzMzQ1NTU2Nzk5OTk6Ojo6OTg4Nzc2NjU0NDIyMjIxMTEzNDg7QEtWYWxwcG9ubG5ubnBwbWdfUkM2LioqKikqKioqKikqLzY7SVhlcnl+f316eHh6fX+Bf3x3bF9SRj02MTQ4PUZSXmtkPUJndm9mWEo9NS4sKyssLi4uLS0uLy8uLi8wQ257dl5PTllUPk5ZY2Vye359e3l4dnh5enl4dW9kV0pAODQzMTEyNDhASFBcZ3N8goSDfnVsYFRIQUFGSU9XW2NqcHh9g4aJiYeEgn9+fn17fH5+fn57d3FoXlBIQDs6OTk5OTk6Ojk5OTk5Oj1BSFBZXmRpbG5vb29ubm9tamRhV09CNjEuLzM7RlFbY2pucXJvb25wcnR3e35+f4CDh4yOj5CPjo2KiouKiYaBenJrZWJlbXJ4fH6AgH98fHt7e3t7fXt2bmlhWE9JQ0RFR01YZnJ9h4yOjouLioyMjI2NjImDfHFqYmJnbHR5eXl3dXV1dXV1dXd3dnRzcG1raWZlYjs7Ozs7Ozs7Ojo5ODg3ODg4ODg4Ojg5OTk6Ojo6OTo6Ojk5OTs6ODg4ODc3NzY1NDU0NDQ1NDQ0MjM0NDQxMjIwLy8wLi0rKyoqKSgoKCgoJyYnJiUmJiUmJiUlJSUlJSQkJCUmJicnJycmJiUlJiclJSYmJiYmJiYmJiYmJiYmJSUlJSQkJSUkJCQkJCQnLDE1ODs9Q0tXaXaAhYR6bltDLCMjJCQkJCQlJicoKSkqLCwsLS0tLzAvMTM2Oj5ES1FYXGFmampqbm1pZGBYT0Y+OTY1NDU0NDQ0NDQzMzMzMjEwMDAvLy8uLS0tLS0uLi4wMDAxMTMzNDQ1NTY3Nzg5OTg4OTk5OTk4ODc3NjY1NDQzMzIyMzIyMTM2PUJJVF9pcXJwbmttb29wcnBrY1dJPDArKyspKSorKywrLS82O0dWYm53fX9+e3h4en1+gIB+eW9iU0Q4MjAzNjxFUV1qYURGb3dyaF1MQDUvLS0tLCwtLS4uLi4tLjAyPF9rbHJYR05OWlNRUmdqdHx+fnt5eHd3eXp4d3VvZ1lKQDg0MjExMjQ5PUdSX2p3f4OEg351a2BUTEdFSVBWWmBnbnZ8gYeKioiGgYF/fn58fHx8f39+e3dxaV5QRj85ODY4NTc3Nzc3ODc3Njg8QkdRWl9naW1ubW1ubW1uamdjW1JIPTYuKy0wNT1GU1xlbG9xcXFxdHV4enx+fYCDhYmKjo+Ojo2Mi4qLioiDfndsYVxZXmZrc3l+gH9+fXx8fH18fHx5c2xmXFNKRUJBQkZPW2h0f4mOjouLi4uLjIyNjIqGgHtwZmFjZmtzenl4d3V0dHZ2dnZ2dnVzcG5qaGdlYV47Ozs7Ojo7Ozo6OTg3ODg4ODg4ODk5OTk5Ojo7OTo7Ozk5OTk6ODc3NzU2NjY2NDM0NDY1NDQ0MzIzNDQ0MTExLy4tLi0sKysqKikoKCcoKCcmJiYlJiYlJiYlJSUlJSUkJCQlJiYnJycnJiYlJSYnJiYmJiYmJiYmJiYmJiYmJiUlJSUkJCQkIyMjIyIiIiQmJywuLzZCUWRzf4SDeWxYPikjIyQkJCQkJSYnKCkpKiwsLC0tLjAwMTM2OT9ESk5VW19mZmdrbm5saGNaU0pDPDY2NTU1NDQ0NDQ0MzMzMzIxMDAwMC8vLi0tLS0tLi4uMDAwMTEzMzM1NTU1Njc4OTk5OTk5OTk5ODc2NzY2NTU0MzMyMjIzMTI0NzxBSVJdZm5ycG5sbm9vcHJybGZbTT80LCwpKykqKysrKiwwNTxGVWFsdn1/fnt4eHl8fX9/fntyZVNCNzIwMzY6RE9bZ1tFUnV0b2pfTkE2Ly0rKyssLS0uLi4uLi4wM0tqanVsTEdGSE1MTlJvbnN7fX57eXh3d3d5eHd0bmdZSkA4NDIxMjIzOT5IVWJteYCEhYJ+dWtgVExITVNYWVxkbXR7gYWJiYqHhICAfn5+fHx9e39/fnt2cGdcUEQ9Ozc2NjY3Nzc3NzY3NzY3PkNKU1lfZmptb21ubW1ubWtmX1lQRToyLisrLTE4QUxWYWptdHR0dXh5e31+gYGAgoSIjI2NjY2MjIuKi4qHgXtzZ1tTUFhga3F2en5/fn19fX19fHx6d3JrY1pRR0I/P0NIUV1qd4KJjY2LjIuLi4yMjYyKhoB4bmZfYmdsdHh5eHZ0dHR1dXV1dXV1c3BuamhmZGFdOzs7Ojo6Ozs6OTk4Nzc4ODg4OTk5ODk5OTs7Ozo6Ojo5OTk4ODg3NzY1NTU1NDU1NTU0NDMzMzMyMzU1NDEwMC4uLi4sKysrKiopJycnJycmJiYlJiUlJCQlJSUkJCQkJCUmJSUmJyknJiYmJycnJycnJycmJicnJycmJiUlJSUjJSQkJCQjIyMjIiIjIiQkIyUmJyw0Pk5gcX2EgnlrVzwnIyMkJCQkJSYnKCkqKisrKywsLjEyMjQ5PUJGS1FUW2FkZ2hpbW5saWZgV05HPzg3NjY1NDQ0NDQ0NDIyMjIxMTAwMDAvLy8uLS0tLS0tLjAwMDExMjM0NTU1NTc3Nzk5OTk6Ojk5OTk4ODg4NjY1NTQ0MzMzMzI0NTg9QklRWmNrcHFvbW1vb3FydnFqYlFDNi4pKSsqKyoqLCsuMzo/R1NganN8gH99eXl4e3x+gIB7c2dXRjozMTQ5OkJOWWVUS156dHFrYFBDNzAsLCwrLCwsLS0tLS4wLzNScXp3X0ZFTD4+TFVVZWlxfH9+e3l4d3d4eHl4dW9mWUpAOTQxMjExNDtBSVdjb3qEh4eEf3htYFVRUVNWWFthZ3B3fYWIiYmIhYN/fn5+fXt7fX5/fn18dXBmW09CPDg2NDQ1Njc2NjU1NDQ1NztCS1NaYGdqbGxtbWxrbWxpY11WTUE4LywqKiwwNj9KVF5pbXN2d3d6e35+gICAgYKFiIuNjY2MjIyLi4qKh4B6cGVYS0pQXGRrcnd7fX5+fn19fXt7eHVvZ15YTUQ/PT1AR1NfbHuEi42Oi4uLioyMjI2LiYV/dWxkYGNobnR4eHd0c3Nzc3NzdXV0dHFwbmpmZWNgWzs7Ojs6Ojs7Ojk4Nzc3ODg4ODg4ODk5OTg5Ozs6Ojk5Ojo4OTg4NjY0NDU1NTQ0NDQ0MzMzMzIyMjIyMjIxLy8tLSwsKyoqKiopKCcnJycnJiUmJSYlJCQkJSUlJCQkJCQlJScoKystLSsoJygnJycnJycnJSUmJiYmJCQkJSUlJSQkJCQkIyMjIyIiIyIjIyMkJSYrMT5NX3B9hIJ5a1c+JyMjJSUkJCUmJygpKiorLCwtLi8wMjU5P0RITVFWW11kZWlqa2pqamljW1NKQTk3NTY2NTQ0NDQ0NDQyMjIyMjIxLzAwMC4tLS0tLS0tLS4wMDAxMTIzNDU2NjU3Nzc4OTk5Ojo5OTk5OTk3NzY2NTU0NDMzMzMzNDY6PkNJUVtka3Bxb25ub3FzdHZ0bmZaSjwwKioqKisqKywvMjY8QktUYGt0fICBfnp4eHt8foCAfHZsW0s9NTAyNTpCTVdkUFNndnVybWNTRDsyLSwsKywsLC0tLC0tLjA4bHp1dWJORUQ+RVFRVGZmcXx/fXt5eHd3eHh5eHRuZVhKQDk0MDEvMTU7Q01ZZnJ+hoeHhoJ8cGRZVlZYWlxdZGlyeH6FiImJh4OBf35+fnx8fH1+f358eXRvZltPQzo2NDQ0NDQ1NTU0NDQ0NTc8RE1VXGJoa2xsbW1sa2lpZmFbVElAMzArKSkrMDQ6RVBcZm1ydnl7fH+AgYKCgoODhYmLjo6NjIqJioqKiIZ/eG1jVUpKTldhaHB3en1+fn1+fn58e3l0bGVeUkhBPDo+QktXY298houMjYyLjIuMjY2MioiDfHVqYmBjaG50eHd1dHRzcnJyc3R0c3Fyb21qZmNgXVs7Ojo7Ozs7Ozk6ODc3Nzg4ODc3Nzg4ODg5Ojo6Ojo5ODk5ODc3NzY2NTU0MzMzMzM0NDMzMzMyMjExMDAvLy4tLCsqKisrKyooKCcnJycmJiYlJSYlJSUkJCQkJCMkJCQkJSYnLDAzNDQyLSspKCkpKSYmJiUlJCQkJCQkIyUkJCYkIyMjIyQjJCMjIiIjIiIhICQnKS86SlxteYGFemtYQSkiJCMkJSUmJygpKSkqKyosLi0wMjU5QUVKTlNWXV9jZGZoa2tra2pmX1ZNRD44NjU2NTU0NDQzMzMzMjIyMjExMC4uLzAuLS0tLS0tLi4uMDAwMTExMjM0NjY2Nzg4OTk4OTo6Ojo5OTk5Nzc2NjY1NTUzMzMzNTY3Oj9ESVFaY2pvcXBvbnFyc3R2dXFrYVFCNCoqKyssKy4wMzY7QUVNVmFsdX2BgoB+ent7fH+BgH55b2FPQTcxMTQ4QUxXZExManZ2cWxlVkY7Mi0rKyorLCwtLSwtLDAwSXpyVUteXVRQV0xNUVBpaXJ+f317enl3eXl5eXh0bmZYSj84NDExLzI3P0ZQW2h2f4WHi4mGf3JnXVhYWVxdYGVscnqAhIiJiYaDgH9+fX58fn59fn+AfHl1b2VZTUE5NTIyMjMyMjMzNDQzMzQ4PUVOVl1lamttbW1ubGxraWVeWlBFOjIrKSkqLC8zOEVPW2Nqcnd5fX6AgYKDhISEhIaJjI2NjIyKiYmJiYaFfnVqYFZLR01UXmlyeHt9f39+fX99e3p3cWxkW09EPTo6O0JMV2dzf4eLjIyLi4uLi4uLioqIgX1zZ2FeYmdvdHZ3dXJucXFycnNzc3NycW5samZhXltZOzo6Ozs7Ozs6OTg3Nzc4ODc4Nzc4ODg4OTo6Ojo5Nzc4ODc3Nzc2NTQ0MzMzMzMzMjIyMjExMTExMTAwLy8uLSwrKioqKiopKCgnJycnJiYmJSUmJSQlJCQkJCQjJCQkJSQmJyswNTo9OTcyMjEwMC4sKCYkJCMjJCQkJCMlJCQlIyMjIyMkIyMjIiMiIyIiIiEiJSgvOUdWanmBhHxuXUoxJCUjJCUlJicoKSkpKissLS4wMzY6QEZLT1NYXF9hY2Zqa2tramppY1xTSkI7NjQ2NTU1NDQ0MzMzMzMzMzMxMTAvLi8vLS0tLS0tLS4uLjAwMDExMTIzNDU2Nzc4ODk5ODk6Ojo6Ojk4ODg3NzY2NTU1MzM1NTY2ODxARUlRWGFpcHJycG9xcnN0dnZ0bmVXRjguLS4sKy4xNTc7QERKUVhganN9g4OBf3x7e3p9goKAe3JlVUQ4MjE0OEFJVGNLRml2dnJsZldIPTItLCwqKywsLS0tLS0xRHR3bVo4T09NU1dRUlJPY2pzfYB9e3p5eHd5eXl4dW5lVkk+ODQzMTI1O0FJU15seIKJiouKhn90aGBbW1xdXWJmbHJ2fIGFhoaEgn9/fn19fHx8fX5/fXp4dG5kWk5BOTUyMTExMjIxMTExMTE0OT5HUFlgZ2ptbW1tbWxsa2hjXVdNQjcvKikpKSsvMzpGT1tjaXB2e36Ag4aFhoOEhIaHioyNjYyMiomJiYmGhX12bGBTS0pNVF5ocHZ7fX9/fn19fHt6dnBqYlZLQz06OjtCTlppdYGJi4yLjIuLi4uLi4uJhoB4cGVgXmJobnR2dnRycHFxcXFycnJycXBtamdjYV5aWDs5Ozo6Ozs7Ojo4OTg3ODc4ODg3Nzg5OTk5OTg4ODg4Nzc2NjY2NTUyMjIyMTExMTIyMjIxMDAwMC8wMC8vLi4sKyoqKSkpKSkpJyYlJScnJSUmJiUlJSQkJCMjJSUkJCMjJCYrLjM3Ozs6Njc3Nzc2NS8qJSQkJCQkJCQjIyMjIiMjIyMjIiIiIiIiIiIhISEhIyQpLTZCUmNzfoJ+c2NQOCcmJCQnJycoKCgqKisrLC4vMjU9Q0hNUVRZXV9iZGhra2pta2hpZV5WTEQ/OTc2NjU1NjY1NTMzMzMzMzIyMTEvLy8uLi0tLS0tLS0uLi8xMDAxMTEyMzQ1NTY3ODg5OTg5OTk5OTk4Nzg5OTc2NDQzNDM0NTY3Njo+QEZLUFhgaXFzdHJwcHFzdXZ4dnBnXEs7Mi0tLS0xNjk9QkVKTVRbYWpzfISFhYB+e3p9fn+BgoB4a1tKOzMzNDc+SVNhSkpqdnRyb2ZYSTw0LSwsKissLC0tLS0tLkt4enFKN1VOTElNU01SV2NocnuAfnt6eXh4eXl5d3RtZVlLPTc1MjU0OD1FTFhjcHyGjI2NioZ9dGliXlxdXV9hZWpwdnl/g4WEhIN/fX19fX1+f31+f315eHVtY1lLPzczMjEwMDAwMDAwMDAvNjpAR1FZYWhtbG1tbW1sa2llYFpVSz81LSsrKyoqLjQ/SVNcY2pxdXt/gYSGhoSDhISGh4qMjYuLiomJiImJiIV+dmxfUkpLUVZhanF5fH5+fn98fHx7eHNuZVxRRz86ODk9RE9fbHmDiouLi4uLi4yMjIuKiYR9dmxjXl5iZ251dXRzcnFwcHBwcXFxcW9ta2dmY2BcV1Y7OTs6OTo7Ozk5OTk4Nzc3ODg4Nzc4ODg5OTk4ODg2Njc3NjY1NTQzMjIyMjExMTEyMTExMTAwLzAvLy8uLi0tKywqKikpKSkoJyUlJSUmJiUlJiYlJSUkJCQjIyMjIyMjIyQlKCouMTY2NDU2Njk5ODcyLSckJCQkJCQkIyMjIyIjIyMjIyIiIiIiIiIiISEgICEjJisyPE1db3uCgXZmVT0qJiUnKy0sKCkpKiorKy0vMjY8QklNU1VbXl9iZWZoampqaWlnY19YT0ZAOTY1NjY1NTY2NTUzMzMzMzMyMjExLy8vLi4tLS0tLS0tLi4vMTAwMTExMjM0NTU2Nzg4Nzc4OTk5OTk5ODc4OTk3NjY1MzU1NDU2ODo8QENHS1BVYGhvc3R0cXBwc3V2eHdzbGFQQDYvLi4xODw/QkVKUFJXXWNrc3uDhYSBf3+Adnt/gn+BeG9gTz41MzQ3PkdSXklIbHZ0c29mWEo9NC0sLCorLCwtLS0tLS07YHBqUThbV05MUFlVTVRjYGZ2fX59enl4eHl5eXd0b2ZYS0A5NjY4OT5FTFNdaHR+h4yOjYqEfHJoY2BfXl1dXmBkam92fYOEgoGBfn99fX1+f35+fX99eXZybWNZSz83MzEwMDAuLi4uLi4vMDQ6QktTWmNqbWxsbG1tbGtpY11XUEU8My0rKSwrLTA5QkxVXWNqcnZ7f4OFhoaEg4SEhoeKjI2KiomIiIaIh4eEfXZsX1JOTlNaYmtzeXx+fn1+fXx8e3dya2ZcUUc8ODg4PUZTY297hYqLi4uLi4uMjIyLiomFfHNpY15eYmlvdnZ0c3BvcHFxcXFxcXFvbWpnZGJeWldXOjo8PDo6Ojo7OTo6OTg4Nzg4ODg4ODg4OTk3Nzc2NTU1NTQ0NTU0MzIyMjIxMTIyMjIwMC8vLy8vLy4vLi0tLCsrKikoJycnJyclJSUlJSMjJSUlJCQkJCUlIyIjIyMjIyMkJCUnKCorKy0vLy8yNjY2MS4oJSMjIiIiIiMjIyMkJCMiIiIiIiIiIiEhISIiIiIiIyUpMDpKWmt4gIF3aVtGLyYlKi8yMywpKSkqKywtMjg7QUdLUVVaXmBjZGZoaWlpaWdmZGFZUEhBPDc2NDU1NTU1NTU1NDQzMzMyMjIwMC8vLi0uLS0tLS0tLS4uMDAxMTExMjMyNTY2Njc4ODg4ODg5OTg4OTg4ODg4Nzc3NTQ0NTU2Nzo8PUFFSk1RWF9nb3V1dXNycnR2dHZ3c25kVUc6MTAyNzxARUhNUFRYW19kaXF7gomGg35zXmp8gHl6gHxzZVREODMzNjxGUF9KR2t2c3FuZlhLPjUuLCwpKiwsLCwsLC0rMkxlbmFQbnxpUU9eXk5MYV5Wa4J/fHp5eXl5eXh4dm9mWUo/Ozs9QUNITFRaYm14gYaLjIyJg3puZ2FgX11aWFlcYmlwd32BhIJ/fnx9fXx9fn9+fn59e3p0cWtjV0k9NjMwLy4uLi0tLSwsLS81PENMVV1kam1rbGtsbG1qaGVdV09EOTEsKiosKy81QEhSWF5ja3J3fYCBhYaGhYODhIaHioyMioqIiIeHiIeHg3x2bGBTUVJVW2VsdHl9fn18fXx8fHt3cGliWE1BOTY4OD5GWGRxfoeKioqLi4yMjIyMjIuIgntxZmBcXmNqcnZ3dHNxcHFycnJzc3FvbGpsZ2VeXFpZWTo6PDw6Ojs7Ozk5OTg4ODc4ODg4ODg4ODg4Nzc3NjU1NDQzMzQ0MzMyMTExMTEyMjIyLy8vLy8uLy8vLi4tLSwrKykqKCcnJycnJycnJyUjIyUlJCQkJCQlJSMiIyMjIyMjJCQkJCQmJiYnKSoqKy8vLyspJiUjIyIiIiIjIyMjJCQjIiIiIiIiIiEgISEiIiIiIiMlKS84RVdmdH+Bem5hUDYpKS41OTszKikpKisuMTY7QEZMUVZaXGFkY2ZpaGhpaWhnY19ZUktCPDc2NTU1NTU1NTU1NTQ0MzMzMjIyMDAvLy4uLi0tLS4uLS0uLjAwMTExMTIzMjU2NjY2ODg4ODk5Nzc4OTk4ODg3Nzc3NjU2NTU2Njg6PUFESElMUVdfZW10d3Vzc3NydHR2dnRwaFlKPjg1OTxBRElOUlZZXF9kaGx1fIKIhoJ3bmt5fnxwe4J9dWpYSTozMzc9RU9eS0hhcnNybmZaSz41LiwsKywsLCwsLCwsLC00RlNra3V0ZWJgYVpOQlNma3qBfXt6eXl5eXl4eHNtZlxQRENBQ0dKTlJaYWpyfISJi4yJiH91aWNfXFpVUlNUWGBmbnd/g4OBf358fXt7fX5+fn5+fHl2dXFrYlZJPTYzLy4tLS0sLCwrKysvNDxDTVdfZ2ptbmxrbGxsaWViXVdPRDkxLCsrKy81P0dNVVxkaW90eH1+gYSGhoWDg4SGh4qMjIyJiYiHh4iIiIN8dmxhVVFTWmBnb3Z7fn59fHt9fXx7dXBpYVRJPTc2Njk/SlxqdYGJioqKi4uMjIyMjIyLhoF5bmRbW15jaXF2d3NycXFycnJyc3Nyb2tqaGZiXVxdXl46Ojo6Ozs7Ozo5OTg3Nzg3ODg3Nzg4Nzc4Nzc3NjY0MzMzMzMyMjIyMTExMTExMDAxMTAwMC8vLy4sLi4sLCwsKikpKSknJiYnJyYmJSUkJCUlJCQkJCQkJCQjIyMjIyMjIyMkJCQlJSYmJSUmJiclKConJyUkIiIiIiIiIiIiIiIiIyMhISIiIiIgICAgICAhISEiJCcrND5RYm95gHxzZ1dCLSkxOz9BNywqKiwtMTY5PUNKUVZYXmJmZWdnamhpaWhmYV1WT0xEPDk3NzU0NTQ1NTY2NDQ0NDQzMjIxMTAwLy8uLi4tLS0tLS0tLi4vMDExMTEyMzM0NTY2Njc3NjY4ODk5ODk4ODc3NjY2NjU2NjY2NzY6PUBDRUlKTVFXXGVtc3Z3dXNwc3Nzc3V1cWpfUEM8PD5BRUpOUlhbXmFlZ2twdnqAhoV4d3VqZnFmW2hzenlvXk09NDI0OUNQW1BPX3FzcmtlWks+Ni8sKisrKysrKywsLS0rKys4WXJsZ2RwZFdWVFNdaHV7f317e3p5enl4eHh2b2lfVU1KSkxNUFRZYWhvdn6GiouKh4J6cmVdWlZSTUpNT1NdZnJ8gIOBf39+fHx8fX5+fn59fnt4eHVwaWJUST41Mi4tLS0tLCsrKysqMDU+R09ZYWhrbmxta2trbGpnY1pVTEI4LysrKzA0PUdOVl1iaW5zd3l8f4KEh4eFgoOEhoqLjIuLiomHhoeIiIeDfHVsYVZSVVxiaXF4fH5+fn59fn59eHVtZV5SRTo2NjQ4QU1cbHmCiouLi4qKi4yMjI2LiIN+dmxgWVleZWxzdnd1c3FycXFycnJycm9saGdjYFxcXmBiOzs6Ojs7Ozs6OTg3Nzc4Nzg4Nzc3Nzc3ODc3NzU0MzMxMTExMTExMTAwMDAwMDExMDAuLS8vLy8tLS4rLCwsLCkoKScnJyYmJiYmJiUlJCQkJCQkJCQkJCQkIyMjIyMjIyMjIyQkJSUlJSQkJSUkIyMlJiUkIyIiIiIiIiIiIiIiIiIiISEgICEhICAgICAgICAhIiMkKS85S11sd39+dGtcSjMpLDQ8PzQpKSosLzM4PENHTlNYXGFkZmdoaGhqaWdkYVtWT0hEPjk1NTY1NTU0NTU0NDQ0NDQ0MzIyMTEwMC8vLi0uLS0tLS0tLS4uLzAxMTExMjMzNDQ1NjY3NzY2Nzc4ODc3ODg3NzY2NjY2NTU2ODg6PUBCRUVJTE1RVlpkbHN3d3Z0cnJycnRzc3FsYldORUJESk1RVVtfZGZpa3Bzdnp9gIOCdnV0fGRQRD9ARF5eWG9oSjgwNDk/S1pOTV5scnJtZVpLPjYvLCorKysrKyssLCwsLCwrNU1dY2hrY0RITUxTYGlye399e3l5d3h5eXl4dXFrY1xYUlFQVFZbYGZudXyCiIuLioaBeG1jWVNMSERCRU1VXml2fYKDgX9/fnx8fX1/f35+fXx7eHd0cGliVEk+NTItLS0tLCwrKysrLDE5QEhQW2JobG1rbGxra2tpZWFYU0pANS8qKy0zO0VQVV1jaW9yd3p8fH+ChIaGhYKDhIaKi4yLi4mIh4aHiIiHg3x1aV5XVVhfZm10eX1+fnx9fX18fHh1a2ZcUEI4NDQ1OURQX297hYqLi4uLi4uLjIyMioiDfXVoXllZXmVsc3d3dXNycnFxc3Nzc3JvbGhlYl5eXl9iZDw7Ozs6Ojo6OTg5ODg2Nzc4ODc3NjY3NzY1NjY0MjExMTExMTAwMDAvMTExMDAvLy8vMDAvLi0tLCwtLCwrLCwpKSgnJiYlJSYmJSUlJSUkIiMjIyMjIyMjIyQkIiIiIiMjIyMjIyQkJCQkJCQkJCIiIiQkJCMiIiIiIiIiIiIiIiIiIiEhICAgICAgICAgHx8gISIjIyctNUNWaHN9f3tyYVI+LisvNzUvKissLjA1Oz5ESlBXXGBjZmlpampqaWVjX1pUT0dCPDc2NTQ1NjU0NDU1NDQ0NTQ0MzIyMjExMC8uLi0tLSwtLSwsLS0uLi4wMTExMTIzMzM1NTU1NjY3Nzc3ODg4OTg4NjY2NjY2NjU2Nzk8PUBDRUZJTEtNT1RZY2x0dnd2dHJycnJycnNxb2heVExISk9TWV5iaGtuc3R2eXp9gIGDgG1ZWnFoVVtiaV5QeFZmYF9UPDo/WW5iS0dOX3BybGVaSz41Li0rLCwsLCwsLCwsKyssMjtQVldiZlFPXUlFTFZlcXp+fnx4d3h5ent7e3l2cGhjXltZV1peY2dtcnl/h4mLi4mDf3ZrX1FMRD04O0BNWWVxe3+EhIF/f35+fX+Af39+fXx7enh1dXBpYlRJPTMwLS0sLCsrKiorKy0zOkJKVFxkaGtqbGpqa2ppZ2NfWE9GPDMtKS0yO0ZPVl1kanBydnp7fX6ChIaGhISCg4SGiYuLi4uJiIeHh4iJh4N9dm1iV1NaYWlweHt9fn5+fX19fH13dWljV0o/NjIyMjlEVGJwfYaKi4uJi4yLi4uLioeGgXpxaF1XWF9mbXR2dHV0cXJzcnNzdHNxbmtmY2FfYF9hZGY8Ozs7Ojo6Ojk4ODg3Nzc2ODg3NzY2NjY1NTQ0MzExMTExMTEwMDAwMDAwMC8vMC8vLzAvLi0tLSwsLCsrKikpKSkoJyclJSUmJiUlJSUlJCIjIyMjIyMiIyMkJCIiIiIjIyMjIyMkJCQkJCQkJCIkIyIkJCMjIyIiIiIiIiIiIiIiIiIhISAgICAgICAgIB8fISEiIyMlKTRATmBten99dWZZSTUsKy0sKyorLTA0Nz5DR05VWl5iZGdpaWpqamZhXFZRSkRAOzc2NjU2NjMzNDQ1NTQ0NDU0NDIyMjIxMTAvLi4tLS0sLS0sLC0tLi4vMDExMTEyMzMzNTU0NTY3NjY3Nzg4Nzg4NzY2NjY2NjY3ODk9PT9CRUhJS0xNT1BTW2JrcHV6eXVzcXFxcXN1dHNuZVtUUFFVWl9lanF1eH9/f4CBg4eGhH92WEBQWlJQQFhgXmRsTkpBQEdLaJiTcklDTGNzcWtmW0s+NS4tKywsLCwsLCwsLS9Ibn2EhoR0Y2ZqVltKTlxYZXF6fH17eHd6enl7e3t6eHZvZ2FfXVtfY2htc3h9hIeKi4qHg3x1aVpMQDczMzlDUFxodn2DhoSBf39+fn+AgH9/fn16eXh4d3NwaWJUST0zMC0tLCwrKyoqKystMzlDS1RcZGpra2pqamloaGVhW1ZNQjgxLCswN0JLU11mam90eX1+fX1+gYSGh4WEgoOFhomLi4uLiIaGhoeIiYeDfXZqX1hXXWVtcXl7fX9/f35+fnx9eHJoXlVIOzMxMjI7Rlhnc4CJiouMi4uMi4uLiYiGg3x0a2NbV1hfZm10dnVycXFxcnJxcnJxcG1qZWNhYGFhZGVmOzs7Ojo6OTk5ODc3Nzc2NjU1NjY1NTU2NDIyMjIxMDAxMTAwLy8vLy4uLS0tLS0vLy4uLi0tKysrKyspKSkqKSgoJyYmJiYlJSUkJCQkJCQkJCQkJCMjIyMjIyMjIyMjJCQiIiMjIyMkJCIiIyMiIiMjIyMjIyMjIiIiIiIiIiIhISEhICAgIB8gICAfHx8gISEiIiIiJCguOEdXZ3N6fHhuYVI+LSooKCoqLC0wNTg+RUxSWVxgY2RoaWppaGRfWVROSEI+OTc2MzM1NDQ0NDU1NTUzMzQ0MzMyMjExMDAwLy4uLi4sLC0tLi0tLS4uLzAwMTIwMjM0NDU1NTU1NTU1NjY2Njg4NzY2NjQ0NzY3OTo8PkFCRkhKSkxOTE5RUVliaHB0ent2dHFxcHBydHZ2cWtkXVhXW11kanF3fIOHh4eHiIiIiouMfmpWUVpWWlxjZmliXEVETFFEQExod21ZR1p3c29sZVtLPTYvLS0sLCwsLCwrKy0vW36Adnh9eGlpd2tSSVZfWGRxfH5+fHl4d3d5e3t8e3p3b2plYmBiZGltcnl9gYaIiYuJhYJ7cWVWRjs0MDQ9SFVhbXiBhYWEgX9/f39/gIB/f318e3h4d3d2cmtiVko9My4sLC0tLSwsKyoqLzM6RE5YYWVpaWlpaWlqaWViXFdRSD41Li0vNT5IVFxka292e35/fXx9foGEhIaGhIKEgoWIi4yLioiHh4eHiImIhX51al5aXGBob3N5e31+fn9/f39+fHhwaFxTRTgwLSwwPEpcaXeEiIqLi4qKi4uKioqKhoB5dW1iWFRXYWhvc3Z1cnBycnNycXRzcm9saWVjY2NkZGVmaDw8Ozo6Ojk5ODg3Nzc3NjY1NTY2NTU1NDIyMjIxMDAvLy8xMC8vLy8uLi0tLS0vLi8uLS0tLSsrKysqKykpKSkoKCcmJiYmJSUlJCQkJCQkJCQkJCMjIyMjIyMjIyMjIyQkIiIjIyMjJCQiIiMjIiIjIyIiIiIiIiEhISEhISEhISEhISAgICAfICAgHx8fICEhISIiIiMmKjM/UF9tdnx6c2pbTTYsKyorLC8wNDY7QUhNVFldYWRnam1ramReWlJKRUE+OTU1NDQ1NDQ0NDQ1NTU1MzM0NDMzMjIxMTAwMC8uLi0tLC0tLS4uLS0uMC8wMDEyMDIzMzM1NTU1NTU1NTY2NjY3Nzc1NjU2Njc5Oz0+QEFCRUdJS0xNTU1PUFNWXmdudXp6eHVzcXNzc3V3d3RwamRfXmBkaW91foOJjY2NjY2Nj5CPkYxwVklJV19tcmtsbllHUUNGR0lJS1RiXk9bdG5taWNbTD42LywsLCwsLCwsKysrLC4+WWhwa2ZkX25rUE9eXlRkcHl+fnx5eHh4enp7fHt5dm9qZWNjZmltcXZ6fYGFh4iJiYWCe3FlVEQ4MjE4Qk1bZnJ9hISEgoF/f39/f4CAf399fHt4eHd3dnFsYlZJPDMuLCwtLS0sLCsqKi41PEdOWGFmaWlpaWlpaWhlYFxYT0U5Mi8wNDxET1liaW5zeX6Afn18fX6BhISGhoSCg4SFiIqMi4qIh4eHh4iJiIR+dWthXF9jaXB2ent9fn9/f39/f3x1cGhcT0A1LisrMz5PX2x5hImKi4qKiouLioqKiIWAeXJrXlZTWGFpcHV2c3JxcnJycnNzc3NvbGllZGRlZmZnaGc6Ojs7Ozs5OTg3Nzc2NjY1NjY1NTQ0NDIwMDExMTExMC8wLi8uLi8vLi4tLS0tLS0tLSwsLCwsKyoqKCopJyYmKCgoJyUlJiUmJiUlJCQjIyQkJCQkJCQkIyMjIyIiIiMjIyIiIyMiIiIiIiIjIyMiIiIhISEhISEhISEhISEhISEhISEgICAgICEgHx8fHx8gICEhICEjJCcuOEdXZnB6fHdvY1RDMiwtLTAxMzY6QEVLUlVZXWFlaWpqamhhWVNMR0I9OjY3NDQ0NTU1NTQ0NDU1NTQzMzMzMzMyMTEwMC8vLi4tLSwsLS0tLS4uLy8uLzExMTExMTEyNDQ1NTU1NTU0NDU1NTU1NDQ1NTY4PDw+QEFCRklJSkxNTU5PTk9TWFtja3J3eHh0c3JycXN2eHh4dW9qZmRlaGxxd4CHipCQkpGSkpGUlJWTil47QlhdV2dhZ31wVmRcS0RDR09VW1ZPVWlqbmxjWkw+NzAsLCwsLCwrKywsLCw2U0tOVldhUElXUU5YUltYZXB6fX17eHd4eXp6e3x7e3hzamZjZmZqb3R3en1/goSHiYeFgHpxZFNDNzI1PEVSXWp2f4KEgoGAgH9/f3+AgH9/fXx5dnZ4eHZxbGRXSTsyLSsrLCwuLSsrKSwvNj1HUlxiZmhpaGhpaWlnZWBaVE1DODEyNztES1ZeZWtydnx+f359e31/gYSFhoWCgoSFhomLi4qJiIeHh4iJiYiFfnVrYFlfZGtxd3x+fX5+f39/f397d29kWUw9NC0rLDVAUmFwf4eKi4qKioqKiomJiYeFgXlwaFpWU1dhaW9ydHNvb3FxcXJycnNybWtoZWZmZ2lpaGdlOjo7Ozs7OTk4Nzc3NjY2NTU1MjIxMTIxMC8xMjEyMjEyMjEvLi4vLy4uLS0tLS0tKyspKSsrKykqKiopKCkoKCcnJyYlJSUkJiYlJSQkIyMkJCMjIyMkJCMjIyMiIiIjIyMiIiMjIiIiIiIiIiIiIiIiISEhISEhISEhISEhISEhISEhICAgICAhIB8fHx8fICAhISAhIiMlKjI/T2BqdH19d2xcT0AyMjI1Njg6P0NHTVFXW19iZmhpamdiW1RNRkE9Ojc2NTQ0NDQ0NDQ0NDQ0NDQ1NDMzMzMzMjExMDAvLi4uLS0uLi0tLS0uLi8vLi8xMTExMTEzMzQ0NDQ1NTU1NDQ1NTU1NDU1Njg6PD1AQkNERkhKSktMTk5PT05PU1RZXmhudXh3dXNycnFzdnp6end1b2pmaWptdHuBiI6QkZGTlZWWl5eWlZF1XlZZUDNdc3+CfHdqXFRXUlNNTVlXUU5VXmZkYFlNQTcuLCwsLCwsKysrKyosMkFdYVBaW1FdVDpCRUpUXmVxen18e3h3eHl5eXt8e3t2b2pmZWhobHB1dXh7fH+ChYeHhYB6cWRTQzgzNz5JVmFveYGDhYKAf3+AgICAgH9+fn18eXZ2eHh2cWxkV0k7Mi0rKywsLSwrKystMjlBSlRcYmZoaWhoaWlpZ2RfWVFKQDcyNT1CSlNcYmhuc3d7fH17enp7f4GFhoaFg4OEhYaJi4uKiYiHh4eJiouKhX50aWFeYGhsc3l8fn1+fn9/f39/e3dvZFlKOzQtLC82Q1hkdICIi4uKioqKioqJiIaHhYB4bWVZVVJYYWpwdHJycXBxcXN0c3NycG1ramlqamhoaGZkXjw8Ozs6Ojk5ODc2NjY2NTUzMzMzMTAxMTAyMTE0NjY3NDMxMC8vLi4tLSwsLCssLCwsKysqKisrKSkpJygoKSkmJiUlJSUlIyUlJSUjIyMjIyMjIyMjIyMjIyMjIiIiIiQkIiIiIiIiIiIjIyMjIiIhISEhISEhISEhISEgICAgISEgICAgHx8fISAgHx8fHyEgICIhISIiIyYsOUVVY254fXpyZVlLOzY2OTs+PkNITFJUWF1hZGZoaWdjXVVQSkI9ODc2NjY1NDM0NDQ0NTU0NDU1NDQzMzMzMzIxMS8vLi4uLi4uLS0tLS0tLS4uLi4vMTEwMDEyNDMzMzQ0NTU1NTQ1NTU0NDM2ODg6PD5AQkRFR0dJSktMTU5OT09OUE9RU1lianF5dnR0c3Jxc3Z5fH15d3JtaWppbnV6f4WLjpCRkpiZmJiZmpiTjYiEf2tTeYGAgX95b2JdTEVWXllVUU9NT1BSWWFcUUM3MS0tLCwsLCwrLCwtKi01WmdXVGFWY1Q6R0xTWF5odXx9fXp6eXd3eHp7e3t4c2xnY2NjZmlsb3J1eXl9f4GFhYOAenJkVEU6NThBTltncnuBg4OCgH9/fn+AgYB/f357enl2dnd4d3NsY1ZIOzItKysrKyoqKiorLjQ7Rk5WXGNmZ2hnZ2hoaGhkX1dPRzw1OTxCSFBYX2RpbnJ2eXl3dnh5en+BhIWGhYSDg4WIi4yMioqJiImJioqLioR9dWpiYWJqcHV6fX19fn6AgIB/f3t2bmRXRzozLCowO0haaniCiIuLiouLioqJiIeEh4R/dmxiVVFSWWFqcXZ1cnNxcHBxcnNzcW9tbGxrbGpqaGRkYVo8Ozo6Ojo6ODg3NjY1NTY0MzMyMS8vMDAxLzE0NTg7PDo4NTMxMTAwLi4uLi0rLS0sLCsrKioqKikpKCcnKCgoJiYlJSUlJSQlJSUlJCQjIyMjJCQjIyMjIyMjIyIiIiIjIyIiIiIiIiIiIyMjIyIiISEhISEhISEgICAgICAgIB8fICAfHx8fICAfHx8fHx8gISEhISEiIiUlKTI8SVpocnt9dm1jV0c8Oz0/QkRJTVJWWF1eYmVlaGhmYFlTS0Y9OTc2NTU0NjY0NDQ0NDU1NjY1NTQ0MzMzMzMzMTEwLy8vLi4uLi0tLS0tLS0uLi4uLzExMDAxMjI0MzM0NDQ0NDQzNDQ0NTU3ODs8PD9BQ0RGRkhJSUpLTE1OTk9PT09QT1JWXWRsdXh2dHNycXN2d3p9e3lzbmpqbXFzdnuAhYqOkZKVl5qampiYlJGIhXx7fH+Af4GAe3NnXE5HVltYWlBMSk1PTExZXlZIPTQuKywsLCwsLCwsLCwtNUVdXEdbVldPRldWRz5QZG14fn16enl4d3l6enp4dW9qZGJiYmJna2tvc3V4en1/gYKCf3lwZVRFOTY6Q1BeanZ/hIWDgoB/f35/f39/fn59e3p5dnd5eHdzbGNWSDsxKyoqKioqKioqKjA2PUdPV19maGlnZ2doaGdmYl1XT0c/PEBESVFYXGJobGxydXZ2c3Jzd3p9goWHhoOEhISHiIuNjIuKioqLi4yMi4qEfnVrYGBmbHJ4enx9fX5+f3+Af356c2tiU0Q4MSwrMTtNX257hYqLjIuLi4qKiYiIh4aBfHNpXlNQUltianJ0dHJycnJycnN0dHNxb25sbGxsamhmYFtWOzs5OTk5OTg3NjY2NTM0MzIyMS8vLy4vLzIyNzg8PkJCQD05NTU0MjExLy4uLi4tLS0rKyopKSkpKSgoJycoJyYmJSUlJSQkJSUlJSYmJSUkJCUlJCQjIyMjIyMjIyMjIiIiIiIiIiIiIiIiIyMiIiIiISEhISEhICAgIB8fHx8fHx8fHx8fHx8fHx8fICAfICAhISEhIiIjJSYqM0JOXmh0fXpzamJVR0FCQ0hMUFRXWl1fYmRlZmdlYlxXT0dCOzg1NDU1NTU2NjU1NDQ1NTY2NTU1NTQ0NDQyMjAwMDAwLy4uLS0tLS4uLS0tLS8vLzAxMTAxMTIxMjIyMjIyMjQyMzQzNTY3ODw9PkFCREVFRUhJSElLTExNT09NTk9OTk1PUFVeZ3J2dnRzdHN0dHd5fH16dW9samxsbXBzen+Eio2QlJWWmJqZl5WRi4SAfHt7fX6BgHt0a15STlVPUFVWVk1HS09TU1RXUkc7NCsuLi0sLCwtLS0sLi4wNTo9UU5RRURPUEM+UGtnd3x7eHd3eXl5enl4dXRsaWJbXV5hZWlnbXBxdXd5e35/f313bGJSRjg5PUhUYm55goaEg4F/f39+f35/f359fHt5eHZ4eXh3c2xiVkc5MCspKSkpKiopKSsxOEBJUlphZmdpaGhoaGdnZWFaVU5GQkFFSlBZW19kaGttcHJxb21vcnZ6foCDhIWEhISEh4mMjo6LiouLjIyNjYyKhH5yZ2JiZ210eXp7fX5/f39/gH99eHJpXU5CNy4rLDM/T2Jyf4iLi4yLi4uLi4qJiIeGgXlxZ1tRUFJbY2xxdXZ0c3Jzc3R0dHRycnBwb2xra2tmY1xVUDs7Ojk5OTg4NzY1NTQzMzMyMjEvLy8uLy4xNjo7QENGSUZEQT48Ozg1NTQzMTEyMC4uLCwrKioqKSkoKCcnKCcmJiUlJSUkJCUlJSUmJiUlJCQkJCQkIyMjIyMjIyMjIyIiIiIiIiIiIiIiIiMjIiIiIiEhISEhISAgICAfHx8fHx8fHx8fHx8fHx8fHyAgHyAgISEiIyIiIiMlJy86R1Zjbnh8d3JqYVNISEtOUlZaXWBhYmRlZmVkY2BcVU5GPjk2NjY2NjY2NjY1NTU1NTU2NjY2NTU1NTQ0MzMxMDAwMC8uLi0tLS0uLi0tLS0vLy8wLy8wMTAxMTIzMzU0NTU1NTU1NTc4OTw9QUFDQ0VHSEhJSUlKTExNTk5OTUxNTEtISUpPV2Jsc3Z1c3FydHR3eXt8enVvbGloZmdnbHB5fIGHjZCTlZaWmJaSj4mCf3l6fH5/fn55cWpdVVVSUk5OTE5JREdPUE5KTVBKRDktLS0tLCwsLS0tLC0tLjM9UFdQTENJU1FDQU9taXd8enh3d3h5eXp4d3RzbGdfWVhaYGZrbm9sbm5vcnZ5fH17dWthUEQ4OUBKVmRxfIGDgoB/f39/fn9+f39+fXx5dnZ2eHl4d3NsYlZHOTArKSkpKSkpKSksMjlBSlNbYmZnaGloaGhnZmJfWVVNSURHSlJYXl9iZWpsbG1sa2lpbHB1eXx/g4SGhoSEhIeJjI6OjY2Li4uLjIyMioV+cmhjZmpwdXp7fH1+f39/f4B/fHdxaF1OQDYuKyo2Q1RkdIGHjIyMi4uLi4uKiYiHhH93bmRWT09UW2RsdHRzc3NycnJyc3R0c3NxcG9vbm1oY19XTkk8PDo6OTk4ODg1NTQ1NDQxMjEvLi4uLi8wMzY6PUFGSk1NS0hHRUI/Pzw8Ozg3NzY1NDExLiwpKSkpKCcnJiYmJSUlJSYmJSUmJiUlJSUlJSUlJCQjIyQkIyMjIyMjIyMiIiMjIyMjJCIiIyMkJCIiISEhISAgISEgICAgHx8fHx8fHx8fHx8fICAfHx8fHyAgICAhJCQjIyEhJCYrMj9NXGh0fnx2cmtkWVRSVlhcYGNjZWZmZmlmZGFfWFFLQzw2Njg3NjY3Nzc3Nzc2NjU2NjY4OTc2NTUzMzMzMTAwMDAwLy0uLy4uLi4tLy4vLS8wMTIyNDQ1NTU2Njg2Njc4NjY4ODs+Pz8/QUNERkZISElJSkpLS0tMSktLS01MS0pIRkNESVNeaXF0dnRzc3N1d3h5e3p1cWtmZGBfYmVocHd7hYyOkZKWlZWVk46HgX55eXh6e3hzbmhhXltZVlRNTUpJSkZDR0tHQ0hQTUxILykuLSwsKy0sLS0tLSwwNkZYUVFJUVVHQT0+Smt5fHt6d3Z1d3p6d3V1cmxkWldXWV5nbWNGQERja25xdXp+e3VqX1BDOT1ET11odX2CgoGAfn5+fn5+fn59fnt6d3d2dnd4eHZya2FTRjgwLCgoJycnKCgpLTQ7QktTXGNmZ2hoaWlpaWZjYFtYUkxLTFFWXF9jZWlpaWppaGRkZGludHh7f4KDhISEhYWHio2Pj46OjIyNjY6OjIiFf3RrZ2dtc3Z5e3x9fX99fn6BgH94b2ZYSz81LSsuOEZYaneEioyMjYyLi4uLi4qJh4R+dWxiV1BOU15nbXR0c3NxcXJydHR0dXV1dHNwb29sZmBaUUlIPDw7Ojk4ODc1NTU0MzMyMjEwLi4uLi4vMDM2Oj9ESExSUlBOTUtJSEZEREM/QEA+PDs5OTUyLSsqKSknJiYmJiUkJSUmJiUlJiYlJSUlJSUlJSUlJCQkJCMjIyMjIyMjIyIjIyMjIyUkJCMkJCQkIiEhISEgICAgICAgIB8fHx8fHx8fHx8eHh8fHx8fHx8gICAgICMiIyMiISQmJy44RlhlcHp9e3dybGVgXl5dYWRmZmlqaWlpZ2NfW1RNRj45OTk4ODY2Nzc3Nzc3Nzc4ODg6ODk5NzY2NDMzMDEwMDAwMDAvLzAvMC8vMDAuMTQ0NDU2NjY4Ojo8PT49PkBAQUJCRERGRkZGSElKSUlJS0tLS0xMTExLS0tLTEtMSkhHQ0JAP0NMWWRxdHZ0c3N0dHd5eXl4dnBpYlxYV1pcYGtyeICHio+RlZWWlJKOiIF8eXl3dnRuZWNhWllXVllXTUtMSkU+PENHR0dJUFNTXEwlLS4sLSwrLCwtLi0tLjRMTVdmW1NUQDw3Oklpenp7eHZ2dXd5eXNydXJqZFxYWltqaE09REA4XWllanN5enhzaF1MQDs/R1RgbXeAhIOAf35+fX19fX1/fn17eXd2dnZ3eHh2cWphU0Y4MSsoKCcnJygoKi40PUZOV15lZ2hnaGlpaWlmY2FeWlZQT1JXW15hZWdoaGlmYl9eX2NpbXR4e3+BgoKCgoSGiIyOjo6NjYyMjY2Ojo2KhXxzamlpb3R6fHt8fH1+f39/gYB9d29mWEg9NC0tMTtMXG59hIqNjI2Mi4uLi4uKiYeEfnRoXlJOUFRdZWxydXNzcnJzc3R0dHV1dXV0cXBtaGNbU01ISjs7Ojk4Nzc3NTQzMzMyMTAxLy0tLi4uLi4yNjs/RUlMUlNTUlFPT01LTEtKSUlKSUZEQkA9OTUxLiopKCcoJyYlJSUlJiYmJiYmJiYlJiYmJSUlJSUkJSUkIyMkJCQjIyMjIyMkJSQlJSUlJSUlJCMiIiEhICAgIB8fHx8gIB8fHx8eHh8fHh4eHh8fICAgISEgHx8gICEhISEkJigtNUBRYGx2fX98eHRwbGtoaGhra2tra2pqaWViXllSS0Q/Ozk5OTk3Nzc3ODg5ODg4ODk7PD4/Pz4+OjY0MjIxLzExMC8yMTEzMjEzNDU3Nzs8PDw/QkJDR0dJSkxMTU9PUFJSVFNSVFRTU1NTUlJTU1JUUlBQT05OTEpLS0lJSUZDQj47Ojk9SVVjb3R1c3Nzc3R3d3l6d3RwZVxTUE5QU1xjbXF5goiPkZGTk5KRjIZ/fHh3d3dwZl1ZVlJRTU5WUUZHRkM7Oz9DR0hLTU9NT1FdQCMqLC0sLSwsLC0sLS0wPDxXY2BeUz06M0FacHt+eXh3d3Z2dXNqaHBwamVgXFxhWlxVRUA3SmNhYWpzd3Z2cGhbTUA8QkpXZG96gYKCgH99fX19fX18fn58enh2dHV0dnd3dXFqYFRHODArKCgnJyYnKCgwNkBJT1phZWdoaGhoaGpoaGZiYFxYVlZWWl1gZGZlZWRiX1lYWFxiaG90eHp+gICBgYKFh4qOjo6OjY2NjY6OkI6NioV+d21rbHF0eXt8e3p8fn5/gIGAfHVwZVhJPTQuLjU+Tl9vfYmLjYyMi4uLi4uKiYeGhHtxZltRT1FZYGlxdHRxcXFxcnNzdHR1d3d1dHJvbGdgWE5IRUo6Ojg4Nzc3NzU0NDIyMjAvLi4tLS0tLS0vMjQ3PUJHS1FSUlJTUlBPTk1OUFBQUVJPUExHREE9OTQwKykoJycnJiYmJiYmJiYmJiYmJSYmJiUlJSUlJSUlJSUjJCQkJCMjIyQkJSUnJSUlJSUlJSQjIiIhISAgICAfHx8fICAfHx8fHh4fHx4eHyAfHyAgISEhISEhICAhISEiJScpLjQ+SlpmcXuBgHx5d3R1c3NxcG9vcHBvb2pnZF5VTkhBPDs5OTk5ODg4ODk5ODk7Oz1CRklKTU5LSUNAODUzMjIzMzMzNDY3Ojs9PD9AREZGSUtQUFBSVVdXWVtaXWFhYWNkZ2ZmZWVoZ2VlZWVlZGRiYV9dXFtYVFFOTEpIR0RCPzw6ODU1PERSXmp0dnRzc3N0dnd4d3d0bWNaTUdBRUxVXmlvdn6HjJGRk5GRkY2Dfnp4dnd4c2tjXVhTTUpNUlFKRkREQUFDQ0dMT1FOTE5KXmlMKiYtLSwtLCwtLC0vMDc+YGtfX0s6OTZNYXF5fXl3d3d1dndwX1ZfaGllYVxhUz1FSD9LWGBZV1tmcnl4dW5lWEw/QEVOXGl0fIGCgIB/fX19fX19fH59fHp5dXRycnN1dHFvaF5SRTgwKygoJycmJyksMTlDS1NbY2doaGhoaGhpaWhoZmVhXVtbW1xfYWNlY2BdWVdUUldeZWtxdHh6fn9/gYGChYiMjpCPj42NjY2Ojo6NjYqGgHhwbW50eHp7fHt8fX5+foCBgH13cWdaSz00Ly8zP1JjcoCIi4yLjIuLi4uLiomHhoF6b2RbUU5TWWBqcXNzc3NycHJzdHV1dnd3d3dzcG1lXlVMRURQODg4ODc3NzY2NDMxMTExLy4tLS0sLCwsLC4wNTk/Q0dMUFFRUVFRUFBPUVNUVFZWU1VTU1BLR0E8NTItKSgnKCcnJSUmJiYmJignJyUmJiYlJSYmJiYlJSUlJSUlJSYmJCQlJiYmJicmJSUlJCQkJCMjIiIgICAgHx8fHx8fHx4fHx8fHx8fHx8fHx8fHyAgISEhICEhIiIiJCQmKy80O0RRYGpzfIF+fHp6enh2eHZ2dXJ0cnJuaWRdVU5GPzs6Ozs6Ojk5OTk6Ojo6PUFHUFRZXF9gXltVTUE2NTQ1NDk7PUBDRUZJTU1PU1ZWWlpcXl9iZWRnaGlrbm1vcnNzdHR1dnV2dnd3dnZ0dXR0cnBvb2xpZ2RfW1ZPS0dEQD04NzQzNDxHUF1pcnR0c3NzdHZ4dnl2dG5kVkxBOj5HUltlbnV+hYyPkZORkY+KhX96eHZ1d3ZvbGZeWFJWV1RRS0hEQkFDQkRESUxOVFNMTUpEbFw5Ky0tLSwvMi8vLzFAXHJtX1tDOTg+WGZdcHx6eHZ2dnV2b11dYl5gW1haVVtJXkZARF1WTVFibHF1cnNwZ1lLQkJIU19sdn+BgYF/fn19fX19fX1+fXt4dnVycXFyc3JwbWhdUUU4MispKCgmJygpLTQ8RU5XXmRoaWloaGlpaGpqaWdmY15cXF1fYGJjZGNdVVJPTlBXX2dtcnV5e35/f3+BgoWIjI2Pjo6Ojo6Ojo+Rj42Kh4J6cnFxdnp8e3p6e31/fn1/gH98eHBmWkw+NTIyOURWZ3aCioyMi42Mi4uLi4qJiIZ/eG5iWVFOU1tia3FycnFxcXFxcnJ0dnd2dnd3dXFvZV1USkVIVTg4ODc3NzY1MzQzMTEvMDAuLS0tLCwsLCsrLjI2OT5CR0hKSkxMTUxOUFBSU1NXWVpYWFhWU1BMR0I6NC8rKSgnJyYlJiYmJiYoJycnKCgoJycmJicnJiYmJiUlJiYmJiYmJycmJicnJyYlJSQkJCQkJCQiISAgIB8fHx8fHx8eHx8fHx8fHx8fHx8fHx8gICEhISAhIiIiIyUlKCsvMjc+SldibHV9f358fHx8enx6enl3d3V1c21nXVVORT89PDs7PDw7Ozs6OTs7QEVNVl5la25wcnFvamBRQzs6PUBDSElNUVRWWFpbXWNkZ2lrbW5wcnJxdHR1d3l6eXh7fH59fn5/f39/f35+fXx9fX18enp6eXd0cGpmX1hQSkI9OTQzNDg+RlJeanN1dXNzc3R3eHd4eHRtY1BAMjI4Qk5YYWp1fYaMkJGSkZCPi4V/fHh2dnd4eHVxamhhXlhTUFBLR0ZGR0VFREZISU9ZU0RCQkpgaDYpKy0tLC4uMTE7T2hoVldPOTk5SmBlU117e3l1dXV0b2heY19WV1VQT0xPYlxdXUVPUl9nc210cH11cWRXSkFDSlZjb3iAg4F/fn18fH19fX19e3t6eXZycXFxcXJycG1oXVFENzAsKSgoKScoKy42PklRWGBmaGlpaGhpaWhqamppaGZhXV1dX2FhX11ZVFFNSkxQV2BobXJ3ent+f39/f4KFh4uOkI6Ojo6Ojo6PkI6PjIiFfnV0dHh7e3x6ent9fn5+gIB/fnlyaFtNQTgzMztHWGh4g4qMjIuLiouLi4uLioiGf3huYldSUldfZmtxcnJvb3BxcXJydHZ3enp5eHd0cGlgVEtHSlw5OTk3NjU1MzMzMS8vLy4uLi4sKysrLCwrKysuLzM3OT1BQkVHR0hJS05OTlBQVVdYWVpaV1dWU1FJQz44NC4rKicnJyYmJicoKCgnKCgoKCcnJycnJycnJyklJSYnJycoKSgnJyYnJycnJSUkJCQkJSUkJCIhICAgIB8fHh4fHh4eHx8eHh8fICAfHx8fISEhISEhIiIhIiQmKCosLzI2PEJOV2RtdHh8e319fX1+fn19e3t5eHZzbGRbUklCPz4+Pjw8PTw8Oz0+QUdRVl9pc3p9g4SDf3txY1VIRUhLT1NYW19jaGhsbW5xcnN0dXd3eXx6e3t7fH5+f3+AgYGCg4OBgoOEhYSEhIKBgoGBgYKCg4GBgH16dW9pYlpRTEZAPD5BQ0lSXmhxdXV0c3NzdnZ4eXl4eXt7fF4vLT9JU15qdHyFj5KSkpCQjoqFgHx5d3h2eHl6eHhyaWNXVlFSTk1JS0hGSEVGR0lNVkxDQURCP1VLJCovLC8vMTxgU0tRUFxTTjk7O1FfamtldHp6dHN3cWViXlpSUFNRSkpGRFJTZGFaSk5PV2JqaWhfV2xiVUlDRU9aaHB7gYGAf359fHx8fHx8fHt6eXd0cG9ubnFycW9sZ11QQzcwKykoKCgnKSsxOEJKVFtiZ2lpaWhoaWlpamppaWdkX19fXl5fXllXUExJR0dLUVhianB1dnp8fX9/f3+Bg4iLjo+Ojo+Pj4+Oj5CQj42IhX94dXV4e3x8ent9fX1+f4CAfnx4cWheUUQ7NDQ+S11tfIeLjIuKiouLi4qKiYmIhoB4bWFXVFRbYWdtcXNzcG9wcXJzcnN1d3p8e3p3dW9oYVVMSVBiODg3NjU0NDIwMC8vLy8uLi0tLCsrKysrKioqKystLzE0ODg6PT1AQ0NFRkhKSlBTVVdZWltYWVhYUk1JQjs2Mi4rKCcnJycpKSkoKCkpKSkoKCcnJycnJycpJycnJygoKSkpKSgnKCgnJyYlJCQkJCUlIyMiISAgICAfHx4eHh4dHh4fHh4fHyAgHx8fHyEhISEhISIiISIlJygqKy4yNTpARU5YZGpxc3V5e359f39/f35+fHt5eXVsZFxUTUZDPj49PDw8PTw/RElPWGBrdoCGio6Rj42HfXFmWVNWXGBkZ2xvcXN0dnd3eXt7fH19f358fX19e3uAgIGBgIGAgoKAgoKCgoSDg4OCgYOCg4WFhYeGh4WDgn98eHRtZmBZVlJPTk5QVl9pcnR0dHNzc3R2dneBkZygnqOgeigzRVBdZ3V/h5CUk5GPj42JhoB8enl3d3h5e3p2a2lhUVJYWVJSTktJSkpJSk9RVFFRQTZEQTw7V1QsKDEyMTxPZ29XYl5ZVE03PEFTXmRxdXd4d3Z0dnJkWU9SW1NOTU1KS1FfW1paSlNfXl9cSVthUV5sYVZIR0pSXGh1fYOBf358fHx8fHx8fHx7enh1cm9tbm1wcHBuamZcT0M3MCspKCgoJykuNDxHTVVgZmhoaWhoaGlpaWpqaWhlYV1dXVxcWVZRTElFQkJGTFNaYmpwdXZ6fH1/f39/goSIi4+Pjo6NjY+PkJGRkI+NiISBfHl5ent8fHp7fX19fn+AgH58enNoX1JGPTY2P09gcH6Gi4yKioqLi4uKiomJiIZ/d2xgVlVWXmRqcHJzc3BvcHFxcnR1dXd6ent6eHZybGVbUU5aaTc3NjUzMzMxMTAvLy4uLS0tLSsrKyopKSoqKSkqKigrLS0vMTMyNTo7PEBBREVITE9SVFZYWVlZWlhWUk5HQTs1MS4sKSgqKioqKSgpKSgoKSgoKCgoJycoKCkpKSkpKSoqKykpKScoKCgnJiYmJSUmJiQkIyIiIiAgHx8fHx4eHR4eHx8fHx8fHx8fHx8fICEhIiIiIiQlJSYoKS0uMDQ2O0BIT1dfZmltcHN3e3t9f4CAgH59fn17dXBpY1pTTUdCP0A+PT4/QkhPWGBrdH6JkJSXlZWUjYZ8cmVhY2drcHR1d3p8fX18fH19gIB+fn19fX17ent7e3t9foB/gYGBgYKAgoKBgYGBgICBgYGCg4SGh4eEhoeFhIB8enZzb2xnZF9cXF9ma3N1dnVxc3JzdHeDmqOhoqWrrqhoLD5PWml1gIqRlZORkI6MiISAfHt5d3d4enp6d25rY09EVGBYWVFMTUtMUVJVVVBKQk9GRTw9OkJjWEpWRjBeeXNyblc+UVVROjtKWV9WaXZycHZ4dnZyaVVSV11USEpKSkxSVE1UW0xbVVZcVUBgZ15fbmJSR0hLVmFsdn6BgH58e3t5eXt7e3t8e3p3c3Bvbmxsb29vbmplW09BODArKikoKCgpLjY+SFFYYmdpamlpaWlpaWpsaWdpZGFeWllXWFVPSEVBPT5DSVBXXWZrcXR4en1+f39+f4KFh4yPj4+Oj5GOj5CRkZGRjYuJhX98fXx8e3t7e3x8fn5/gH99e3tyaF5TRz04OUJTZHOAiIuLioqLi4uLi4uKiomHfXZqX1ZSV19lbnJ1dHNwb3BxcnF2dXZ4e31+fnx6d3FqY1lYYnI3NzY2NDMzMTEwLy8uLi0tLS0rKysqKSkqKikpKSknKikpKSwrLS4xMDI1ODw9QENFSU1RVVZXWFtaW1lYU0xEPzo2MS4tLCsrKyopKyspKSkpKSkpKCgoKCgpKSoqKiopKSoqKiooKSgoJyYmJiUlJiYkJCQjIiIiIB8fHx8eHh0eHh8fHx8fHx8fHx8fHyAhISIiIiIkJSUmJystLjA0Njk8QEhOVVpgZGRobnBzeHp8fH59gIKAgHx6dG5oYVtVTUdFQ0BARElOVmBocHyGj5SXmJaWl5GKgXdta25yc3V3fH5+fn5+fX19fX19fHx8fHx8enp6e3t7fX5+f4KCgoKCgoKCgYGBgYCAgYGBgoODhIaEhYaHh4eEg4F/f316d3d0cG5tcnR3d3dzcG5ueISXoZ+foaissLGukjQ4SVppdYKMkpWTkZCOjIiEgn58eXh4eHp6e3t5cmJOQ1BTU15YUVFJTVVWV1FOPjxNSkM6Ojs6RGNeUmxjXHBpZoNaPFBbVD09QEZMQliOlHtveHh6eHJiVmNiUklNS0pKTVJUXl1bVlNKRFtoZ2ReYHNcUUtKS1hjbnl+gYB9fHt7eXl7e3t7fHp5dXJvbW1sbG9vb25qZVtPQDcwKyopKCgpKzE4QktUXGRoaWppaGlpaGhoaWdlYmBbWFhYU05JREI+Ojs/RExTWmFnbXN2eXt9fn5+fn+ChYiNj4+Pj4+Pjo+QkZGRkI6MiIaAfX19fXt7e3t8fH19f4B9fHp3cmlfVUpAOjtFV2Z2gYmLi4qKi4uLi4uLioqJhX91aV5WUltiaG9zdHRzcG9wcXFzdnV3ent9foB/fnl1bmhgYm15Nzc1NTQzMTIwLy4uLS0sLCwsKysrKyoqKikpKScnJygpKSkpKiopKSotLi4wMzU5Oj9DR01TVllbXV9fXVpWUEpDPzo2MzEsLCwrKiorKywrKysrKyoqKiopKywqLCwsKysqKisrKSkqKignJiYmJycnJSUkJCMjIiEgICAgHh4fHx4fHh4fHx8fHx8fHx8gISEhISIiIyUkJSgoLC8wNDc5Oj5AREpQUVRXXGNnaW5xdnh7fn+AgYODgX16dm9oYVhWUUtGR0tSWGFncHqEio+Tl5eXl5eSjIF4c3N2d3l6ent9fX59fn17fHx7e3x8enp6enp4eXp6en19fn6CgoGCgoKCgYCCgIB/gIGBgoKCgYGDgoGDhYSEhIaGhYeHhIKCgIB9fX19fn98eHN2hZein5+anaarrq+uq5pBNUdZZnSCjZSVlJGQjo2JhoN/fHx6d3h3ent8e3NpYFNTUlxoYldUTE5XWFRSSzg1SUM9Ozo3Oj5UaGZeRCxgVVVvVlJRWkk8PktVSDtWfXpaVGFiZmRfXVphc2lHR0pKSUxMVFhYUE1JTlFkY2BTUl9jbm1OSVBeaHN7gH9+fHt6enl6e3t7e3t5d3Nxbmxsa2xvb29tamRbUEI3MCsqKSopKS80PEVNV19laWtraGdnaGdnZmRkYmBbWVdSUEtGQz04NzY8QkhQVVtgaG90d3p7fX59fX5/goWJjpCQkJCOjY6PkJGRkZCOjYmGgn99fXx7e3p7fH1+fn59fXp5dnBpYFVNQjs9SltqeYWKjIyLi4uLi4uLi4uKiYR+dGddV1ldZmxzdHV0c29ucHFwc3Z1d3p8f3+CgoF9eXRuam52gDU1NDQzMjExLi4tLSwsKysrKyoqKiopKSkoKCgoKCgnJycnJygoKSkpKCkpKiwuMTI1OD5DSE9VV1xeYF5eXFpVT0lEQD03MzEvLSsrLCssLCwsLCsrKysrKywsLC0tLSwsLCwsLCsqKiopJycnJycnJyUlJCQjIyIhICAgIB4eHx8eHx4eHx8fHx8fHx8fICEhISEiIiIjJCUoKCosLzI1Nzo+QkREREVITFNZXmJmaW1vdnl6gIKFiYeEgnx5dnBpZGBaVlVXWmFobnmBiYuPk5aWlJSTkIeBeXd3eHh5d3p7e3p7e3l4eXl5eHh1dXR0cnJyc3R1dnZ3d3p6fX19fn9/f35+fnx8fn9/f39/fn+AgYGBgoKAgIKDhoeIiIiJiIaFhYWFhYeFg4CBk56gnZueoaaqqqimpZ6WVDFIWGd1g4ySlZSRkI+Mi4iDf3x8eHl5enx+fXx4cmRfVldhZGJbUlBTUFJWUEs3LjM4Ozs4OD5DTGJxa0RWdmtZVFptX1BAPj9RSkFAQjo5PD08PDw9PUdPUWVcQkVKS0tLSE9QVVNQUVJWV1A9TU9UVGFiV0pWYWt2foF/fnp6enp5e3t7e3t7eXdzcG1sbGtsb29wbmpkW01BNjArKyopKywyN0FKUllhZ2pra2ppZ2ZmZmRiYl5aVlNPTEdCPTc3MzM3PEJIUFdeZWtvdXl8fX1+fX1+f4KFiY6QkJCQjo2Oj5CRkZGQjo2JhoOBf318e3t6e31+fn5+fXx6eHVvaGFZUEU/QUxdbHuGi4yMi4uLi4uLi4uKi4mEfnRnXllZYWhvdnZ0c3BvbnBxcXJ2dXd6e36ChIWEgX15dXR4f4c1NTU0MjAwLy4tLSwtLCsrKiooKCgoKSknJycnKCgoJycnKCgnJygnJygpKSoqKiosLi81OkFGTlVYXF5gYV9eW1hST0pFQTw7ODAtLSsrLS0tLSwrKywsLCwtLi4uLS0tLS4uLCwrKikpKSgnJycnJyclJSQkJCQiIR8fICAfHx8fHyAgIB8fHx8gHx8fHyAhISIiIyMjJCQlJycpKy4xMzY5PT4+Pz9AREdMUVdcYGNnaW1wdXp+gYaHhoeEgH15dXJvaWVkZGZrcHiCiIqLjo+UlJORj4uFfXh0dXd1dnZ1dXZ1dXd0cnJvbWtqamhnZ2dlZmZkZmlrbG1wcXJzdHV1dXV0dXV0dHV2dnd4eXx9fn+BgoGBgoCBgYWFhoiHh4mJiYmKioyLjIuJk5+bmZugo6Skop2cmpaUkXMzRFhndYOPlJSTk5COjYyIg399eXp5eXl6fH19d3NpY11bZGRlY1hYWFlWVlNDNjIvNz08Ojc+S1N4eF1IUGhwamdYVVFRQEE/PDc+QkRGR0dGRUdGRk1URj9CQkNNUE5LS0pJSU9WV1lTRUVPNjhGVVVHQ1hNWGRteH+Af316eXl5eXt6e3t7enh2c29ta2trbG1vbmxoYllLPzQwLCssLC4xOEBHTlVcZGpsampoaGhnZmZjX15aVVFMSEI+OjQvMTM2OkBESlFZYGhtc3d6fX5+fnx+f3+Ch4mOj4+Pj4+Pj5CQkJGRkY+Ni4iEgX9+fXt7ent9fX5+fX16eXZybmdiWlBHQkVQYW99houLi4qKi4uLi4uLi4qIhX1yaF9aW2Nrc3d3dnNwbW5xcXFydHZ3d3l+g4eIh4WCgXx8gYiNMzM0MjExLy8uLCwrKywrKyoqKCgoKCgoJycnJygoJycnJycnJiYnJycpKSkqKioqKiosLjE5P0RMT1ZaXV9hYV9aWFhVUUtHQj43MzAuLi0uLi4tLCwtLS0tLi4uLi4uLi4uLi0tLSwrKysqJycnJycnJiYlJSQkIyIgICAgHx8fHx8gICAgICAgHyAgIB8gISEiIiMjIyQkJScnKSotMDM3Nzs8PDw8P0NHS1BWWV1dYGRmam1yd3uAhIiIiIeFgX19eHVzcXBydHyCiImKjY6Pk5OSj42Kgnp1cnFzcnFycW9vbGxnZWVlYWFeXVlYV1VVVldXV1pcYGFiZGhoaWlqampqaWhoamppaGlrbm9ydHd6fH5/gIKEhISDg4SFhoeIiIqLjY2Mjo6Ol5qYlJieoqGclIiAfI+SjY2CQUZYZ3WDjJKUk5COjoyKh4N/fnx8fHp6e3p9fXt2X2FeVl9eZGRaV1ZeX1FXQzkzMjk7Ozk3OEBIRTU9SUtDQWxvaVVHPjpDQT1HREI9PDs7ODg1OTlAVE5GQD9FSkpMS0lGSE5ZYltVTUZKVVdORUtKRVdOVVxlcXqAf357eXl5eXh5ent7e3p4dHFtbWtra2xvcG5saGJYSj80Ly8vMDI1OT1ESlNaYGdra2pqaWdmZmZlYV9aVlJLREE7NjAuLC8yNTxBRk1UXGNpbnN3en1+gICAf3+BhIiMj5CQj4+Pj4+QkJCRkZGPjYuGhYOAfXx6enp7fX1+fn19enl3dG9oZFxTSkVIUmNygYeNi4uKiouLi4uLjIuKioV9cmVdXGFobXV4d3VzcG9wcHBycXJ0dXZ5foOHiYmIhYKBg4iMjjIyMDAwMC4uLCsrKikpKioqKigoJycnJycnJycnKCgoKCgnJycnJicpKSkpKioqKioqKiotMDY6QEdOU1pcXFteX11cW1hWU01JQzkzMS4uLjAuLy8uLi8vLy8vLy8vLy8uLy8tLS0sKysrKikpKCgoKCYmJiYlJSQjISEhIR8fHh4fICAgICAhIR8hIB4gICEhIiMkJCQlJSUmKCkqKy4vMzY5PD09PUFFR0xQVFZYWFlYW19jaG91en+FioyKiIaDgYB9fHp5e32EiYmLi4yOkZGRkZGOh35zcXBtbWpqaGRjYFxbWlhUUlBPTUpISEdFQ0RISElLTVJSVlhaW15gYGBdXlxbXVxeX1xbW11dYWVqbnJ1eHt+gYKChIWFhYaGhoaHiYuHfYSNlZeVk5acoaKZiXx5e3B4jIyLiVxMWGh2hIyRk5KPjY2LiYeDf31xYm96enl8gH2CfmlbV1haXmRoWUhKTks9S0c3Qzo6Ozk1NjY5O0Q7Nz9HQU1TU3ZkUD88Q0NKSD9GOEpyfXdzblZUPU1qUEpDRkpIR0VGQ0RHT1hWT05LRkRHR0VXSVFZU1NfbHR7f319enl4eXl6enl7e3p5dnRxbmpqa2xsbnFvbWdhVUhANjQ1Nzk8QEVITFJWXmRpbGxra2hmZ2RkYmFcV1JMRTw3Mi0pKSouMjc8Q0hPWF9nanB1d3p9fn9/gH+AgoeLjpCRkI+Pj4+Pj5CQkZGQj4yKh4SCgH17fHx6fH5+fn5+fXp5d3NvaWRdVk1IS1ZmdYOIjI2Ni4uMjIuKioqLi4iFfHNmXl1jaXJ3eHd1cXBxcXBwcXJycnJzdnyChomKioiHh4iLjpAxMTAwMTEvLCopKiooKCkpKSkoKCcnJycnJycnJycnJyYmJycnJyYnKSkpKSkpKioqKioqKiotMjg/RUpOU1dZWl1fYGFgYF9ZU0xEOjIwMC4vLzAwLy8vMDAwMDAwMDAwLzAwLi4uLSwsLCspKScnKCgmJiYmJSUkIyEhISEfHx8fHyAgICAgISEgISEiIyMjIyQlJCQkJSUlJigrLCsuMDU3Ozw9QEBFSUpNT1NUVFVUVVVXW15mbXV9goeMi4qIhISFgoF/fn+EiIqKi4yMjY+QkZGRjod6cmtoZmRiXVtYVVNQS0hGQj8+PTs4Nzc2Nzg5PkFDRUhLTFBTVVdZV1dWVVZUU1JRUVBQT09PT1FUWFthZWpvdnp9f4GEhYWEhIWFhYWHgXB/jI+PlJmdnZuXi4F9fn58bnyKjItzTFlndoSLkJORj42Ni4mHhYKBaWFtY3qBhYeIjYJ3amJcVlRhXEZDSFFSSFJiXUw6Ojs2NTY1NjQ5RUA2WGhfVU5UWU9GOz88QEFFST00Y397bldkak1LTEhKSUtNSkZDQkJBQUhMTU1LRT0/QEBLUEVXWFxfYmx1fH99fXp4d3d4eXl6enp5eHp6cmtraGdra2xvb2tmYFVKQDo6Oz9CREhOUlZZXWJna21taWloaGZmZGBdWFNOSD41LywpKSkqLjI3PENIT1lgZWtzdXd6fn9/f4B/gYOHi46QkZCPj4+Pj4+Pj5GRj46LiIaEgoB/fXx8fH1+fn5+fn17eHZybWllX1hPTE5YaHaEioyMjIuLjIyLiouLi4uIhHtxZ2BhZ291enp3dXJxcXFwcHFycnJycnR5foSIioqJi4uLjZCPMjExLzAwLysrKysqKSgoKCgoJycnJycnJiYmJiYlJiYlJicnJycoKCkpKCgpKSoqKioqKikpKywuNDpARUlOU1hZXmBhYmJkZV5VTEE2MTAvLjAwMDAwMTIyMTEyMzMxMTExMS8vLy8uLi0sKysqKSkpKCgnJiYmJSQiIiEhHx8gIB8gICAhISEgICEjJigpKCcmJSMkJSUnJCYpKissLzI1OTw/QkVHSUtOTVBSVVVXV1ZXV1hfY2pveoKHjYyKh4WFhoaGhYSEhYiJioqMjIyNj5GSkY+HfHFmXl1aVVJOSUM/PTo5NTIxMjIzMDIyMjU5PT9CRkhKTVBTVVVXV1dXVlZXU1BPTktIRD8+Ojo+QkVKUVNZX2RpcHd9gIOHhoWDgn+DhIeKjouOkJecnJSQjIqEd3N/g3tyfHt7glpaZ3WDiY+SkI+OjYuKiISGi3dwcXJvi5SUkYx4a29oXVhmY11bRkdPWmNtZjtNRzo3ODY3ODY1OUJERVpgVE9ISUpAQD0/Qk5aY0g8Mld6bV1NUFhSTkpNTkpHRkxNRkFBOzs/REdJSUZJSkxKT08/WFhSYmhveH5+fXx5d3Z2d3d2eXh6d3ZvaG96gn5zbGpvcmppZ1xTTEhDRUdKT1JUV1lbYGZoamtsa2tqaGdmZGFfW1ZRSkE4LysoKCkoKCwzODtCTFNaYWdtcnd6e3+Af4B/gIGEhoqPkZCPj4+Pj4+PkJCQjo+Oi4iFg4F/f319e319fn5+fn18e3h1cW1qZmFZU01RXGx6hIuNjIqLi4uLjIuLjIuKiIF8cmZjZ2lzeXt6dnZzc3Bvb29wcXJyb25xdXp/hYiKioyMkJGRjzEvLy4tLSsqKyoqKigoJycnJyYmJiYmJiUmJiYmJSYmJSYnJycnKCgpKSoqKysqKioqKioqKissLCwwNTk/RUlNU1leYmRmaWlmXlRIPDMxMDEvMDExMTEyMjExMDIyMjExMTEwMC8vLi4tLCsrKikpKSgoJyYmJiUkIiIhIR8fICAfICAgISEgICIkJywvMDAvLSsnJiUkJiYnKCorLzM1OT1AQ0ZJS09QUFFSUlRWWFpcXV1eYWVqcniAhoyOjIeFhYaIiIiHh4eHiIqKioqLjZGUk5OQiXxsXFFOTEY/Ozk1MzEuLzAuLi4uLS8yMzM2PD5CRUhLTVBSVFdXV1dYWFdWVFNSTkpGRD46NDEvLi4yOD1CSU9VW2BnbnZ6fn2AenZ5goqNkJCRmZuZlZGOkI6OjYl7bnNtbHmAjpuWdn52gI2OgnqDi42NjY2Rk490cH1/cHiQkpSCY2FnamNVXFtcUFBPSVpkWDkcTUs9ODg3ODs3Nj0/R2NUTjc8Njg9RkRBQUNLV11DRjxhXGJlW0A/SkROWlZQSEZGSEM9Pjs4PUFHSUlKTExOT1FYWlhZWFplcHl9fXx7eHd1dnR5eHNzdnBmSkxbcIaZf2BYXFNHS1teWVFMSEpMUVZYWlteY2ZrbW5tbmxqaWhnZWNiYFxUTUc9NC0qKCgpKCgsMjc9RUxTW2FobnR4eXx/gIB/f4CBhIaKj5GQj4+Pj4+Pj5CQkI6PjouIhYOBf3x7enp9fX5+fn59fXt4c29saWZhW1VSVV9tfYeLjY6Oi4uLi4yLi4yLioiBe3NpZmltdHp7end1c3NycG9vcHFwcG5rbXF2e4GGiIqMjpGRkY8wLy4uLS0rKSopKCgpKCcmJiYmJiUlJSUmJiYmJiYlJSYmJycoKCkpKSkpKSoqKioqKioqKyssLC0tLS4wNjxBRkxRWF5kZ2xta2VbTkI3MTEyMjIxMjIyMzMzMzMyMjIyMjIyMTAvLi0tLS0tLSsqKiooKCcmJiYlJCQiISAgICAgHyAhICEgHyImKy80PD4+Pjk2MCwpKCcpKSkqLjE2OT1CRkdKTE9QUlRUVFRWWlxgZGVlZWZpcXV7gIWMjY2Jh4WGiYqJiYiIh4iHhoiIioyPkpOSjIh6aFJFQT05NzMxMDAwLi4vLS0tLS4uMDQ4PD9CRklKTE9SUlZYWFpaWlpYWFdTU01LRkI7NjAtLS0rKywwMTc7QUhSWWBmbXB2dX+MkI+Sk5Wan52ZhG2RiZKSkZKQjYOhtLy9vr6+u7CekX15gYeBcXSCh4h6WXuDa3qLgm1jdXh3alxmamtoZWJgUlRVS0VPYlwrKD0+PDs5O0BFPDk4OkZDQEc/Ojk4N0xAQUNFSlVTRklfXVNaZVJSWDlCaHJoVUlGREFCQj86NztAQ0dISUtNUFJSVVhbW1hgZm96fn18end2d3V1eXRfYHdoYmtybm5hYEpHRklOTkVZYlxVUFBRVllbXWBkZWltb3BvbWtpamhoZ2VlYF1aVExEOzEqKSkpKCkpLTQ5P0ZOVVxjanB1d3t9f39+gYCAgISIjZCSkJCQkI+PkJCQkI6Ni4uLiIWDgH57eXl6fX19fn5+fXt5dnNwbGllYVxXVVhicH6IjI2LiouLi4uLi4yMjIuHgHtzbGttcnd7fHp4dHNzb29ubnBxcW5raGhscHZ+hIiIjZCRkpCPLy4uLi0rKikoKSgnKCgmJiYmJSUlJSUlJSUlJSUlJSUlJicnKCgpKSkpKSkqKioqKioqKisrLCwsLCwtLC4yOT5DS1FZYGhtcnFrY1VIOjMyMjIyMjIzMzQ0NDQ0MzMzMzMzMzIxLy4uLi4uLS0rKioqKCgnJiYmJSQiISEgICAgIB8gHyAgIiUqLzM5QEdLS0tHQz43MCspKiwtLzE1Nz1BRkpMT09SVFVWVlhYXGBlaGxtbm5ucHJ4fYGGi4yMiIaFhoiJioqKiYeHhoSGhoiLjpGUkIyHe2lRRDw3NzM1My8vLi4uLi0tLS0wMDM2Oj5CREhKTlFRUlZXWFlZWlpaWFdVVVJOSkZAOTUxLSwsLCsrLCwtMDU7RExUW2JldY6Ul5KUlZmen5h5a29tjpCSkZKSkqG2u7m7vb29vLu7tJaHg4h/dnBpaGprX11gdnd5e2tVVnKDblVaam1qbGxgXVRRVE5KU3Z1PDQxMzs8PDpAS0c4NDc/RkRMRTs8OTtKPEFDRUlVS0g9TWllWlZKVk87bm5uaVhMRUA+PT5BPDg6PEBDREdJSktMTlFWW1tYXWdxdXx9eHh0c3Z2bVVzbWxkXV5pbmZeQ0ROUFFKREhdbGVgWlVUV1pcXmFkZmlsb3Fxb21raWpoaGdlZWBbWFFKQjkwKSgpKSkqLDA4O0FJT1deZWpwdnh7fX9/f4CAf4KFioyQkpCQkJCPj5CQjo6MjIuLiYaDgX99e3l6e3t7fH19fXp5dnNxbmpnZGBcV1ddZXN/io2Ni4uLi4uLi4uMjIyLh4B7c3BucXV5fX17d3Nzc3Bvbm5ubm5raWhpam1xeoCFiI2QkZKQjy0tLCwrKygnKCcnJyYmJiUlJSUlJSUlJSUlJSUmJiYmJiYnJygoKSkpKSoqKioqKioqKiosKywsLS0uLi0tLjI3Oj9KUl1obXFzb2RYSz00MjIyMjEyMzQ0NDQ0MzMzMzQ0MzIxMjMxMS8wMC4uLCwrKykpKCcnJyYlJSMiISEhICAfICEiIyQoLzU9R01SVllbVlJKQzw2MC4vMDQ0OT1DRkpMT1JSVVVXWlpbXGBiZm1ydHNxcXN1eX6ChYqLiYaFhYaJi4uLioeFhIOBgYKGiYyQkpKOi4BvXVJMRDw4NDU0MS0tLy8tLS0uMjI2OD5CRUlKTE9QU1NWV1lZWltaWllXVVRQTEhCPTYxLisrLCwsLCwsLTE0OD9JTlRZbZGZlpaMjp2alJF9XTVjhYSJkJGUlJ+4vry7v7++vby+trO6pISIhomBfF9SZ2NzcGd3ent6bFdcZFhMW2NmYl1hZ1dIR05NTFptaEo6OUlEPjw4REE5NjczRVlTQTM5PDxJTUJERUNKVkVEOU13cGsyQkBBdXluZ2BSTkY/Pz0+Pjw7Oj5CRENERkdGSEpQU1dZW11ncXd4enl2dHNscm5tb3JmRzZAZGFIS0tMTEhGTFxrcGtoY11ZV1laX2FjaGlrb3BxcG5samhoaGdmZGNgWldPRz81LSknJycrLDA0OkFES1JaXmVtcnZ5e31/f39+f3+DhomMj5GQkJCQj4+Oj46OjIyLiYeFgoB+fHp5eHl7e3t8fX15dnNwbGloZmNgXFtZXmd1gYmMjY2Li4uLi4uLjIyLioeBe3VxcnV5e359enh0c3JwcG9vb29wbWpnZmZscHd9goiMj5GSj40tLSwsKyknJycnJiYmJSQkJCQkJCQkJCQkJCQkJSUmJiYmJycoKCkpKSkqKioqKioqKiwsLCwtLS0tLi4vMS8uMjQ7RExYYmpzdnFpWUw9NTMzMjMyMzQ0NDQ1NTY2NjY0NDQzMjMzMzEvMDAwLi0tLCwpKSkpKCcmJSUjIiEhISAgHyAhIiQoLTU+SFJXXmRlZ2ZhWVFHQTs1NDU3Oj9DR0pMTlFUVllZWltbXGBlam5ydnZ2dHR2eXl+goaIiIiEhIWGh4mKioeFgX56eXl6f4OKj5KRj42FeWxjXFdQSUQ6NzEuLy4uLS0tMDE2ODpAREhJTU5PUFNTVldZWVtbWlpYWFVSUEpFPzk0Ly0sLCssKywtLjAzNjxCSE5UVIWemZqdfmt5bl1weIqVmJWKe1xdhJW2vb69vL2+v765pmxzs7iwhpidoXdJWmh1gYF6fHt7e3NjUldiT1FRX1FBQUtYXlFOTElPTFFYPjhGRUE8NUNPUTk4NzxJYEpMUE5VT0NEQlJMSlRCRjxWeGtEPjw8cXl3cWVmWEhGRkRCQD06OTs9QENERkdISUpNUVJWWFdXaHV4d3t5eXZzbmBkbWpvamlfWV9PSktLSERTZWtsbm5ta2ZhXFpdXmJiZWdsbW1vb29ta2poaGhmZWNiXllVTUU9NCwpJycnKy8zODtCRUxUWmBobXJ2eXt9f39/foCAgoWKjY+RkJCOjo+Pjo2NjYyMi4mHhYKAfnx6eXh5e3t7e3l5d3Ryb2pnZ2VjYFxbWmFrdoGJjYyMjIuLi4uLi4uLi4qHgXt1cXR3e31/fXp2dXNycHBvb29vcG1qZ2ZmaW51e3+FjI+RkI2MLCwsKyooJycmJiYlJSUkJCQkJCQkJCQkJCQkJCQkJCQmJicnKCgpKSkpKioqKioqKystLS0tLS0tLS4uMTMxMTIzOD5HVGBqc3RxaltNPDU0NDMzMjQ1NTQ0NjY2NjQ0NTU1NDM0MzMxLzAxMS8uLS0tKikqKikpJyYkIiIiIiIgIB4fISMmKzM7R1BYYWhub3FxbGddVExGPzw6PUFESEpLUFFTVlhcW1xcXGBjaG5ydXZ2dnV2dnh7foKEh4eGhISGhISFhIKCfnl2dnNsb3V8h4ySkpCOioF3cW1pYVtWT0g/OTMvLS4tLzAzOD1AQkZJSkxOUFFTVFZXWVpbW1pYVlVUUk1JQjw3Mi8tLC0tLS0uLzAyOD1ARktPVHGcnJ2gpJNyWWdodYB3j5SMiYp2dm+du76+vrKwvL6/vbiTdqe6r4V/nZiDUTxIXm92fnh0d3pvVEFzZ1pZXF5IPT87PE1hUE1OTUtCS09EQEBBPThCSUQ4OTY4OT42T1ZPQEtDRkNeWUxRQUU6bnlNMD1CcHJ3eHRlaF5KR0dEQ0A6Nzg6PD5BQ0VGSEhKUFVVVVhRWG12enh4c0hac3BnWmFmZXFvX1RMSk5OTE9mbGtsbG1ubmtoZF9cXV1fYGNjZ2lpa21ra2pqaGdmZWRjYF1YUktDOjEsKScmKCwwNDs+QkdNVl5iaHB0d3p8fX5+fn1+f4OGipCRkI+Pjo6Ojo2NjY2Li4qIh4WBf317eXd4eXt7e3p5eHVybmpnZWZkY2BeXFxkbnmDio2Mi4uLi4uLi4uLi4uKh4F7dXN1eXx9fn15d3R0c3Bwb29wb29saWZjZWludHh+hIyQkY+NiysrKiopJycnJCUlJSQkJCMjIyMjIyMjIyQkJCQkJCQkJiYnJygoKSkpKSoqKiorKywsLS0tLS0tLS4uLjEzMTEyMzg+R1RganJ1c2laSj00MzQzMzM1NjY1NTY2NjY1NTU1NTQzNDMzMjExMDEwLi0tLSwrKyopKScmJSMjIyIiHx8eHyEjKC01QElUXmZvdXl6eHJsZl9VUU1HRUdKSUpOT1BUVVhbXl1fX19hZWtub3R2dnVzc3R1eXyAgoSFhIaGg4B+fn57d3NwbGdjXmFncX+HjpKRj4yIfnh4dXFua2ReVkxAOTEuLzE1ODw/QkRISktNTlFSU1RWV1hZWlpYVlVUUk5JRD85My8uLS0tLCwtLjE0ODo/REhLUF+WnJyhoqOah3uBiY6OeG1geXV7YWh8o7m+vbqemay3vb29rImTsKWHfJiKaU9UT256b1leZGxtbGVqgGVdWFRMPzo5PkVJVFJNS0tLVE1LRUFCPz48Q0U/PTs6O0E6O0tMSUFARUZKV1hQSkNCPnpWMTI/Yl9mdnZza15ZUUZGRkNCPjs5ODs9PkJER0hLTE9XXVtZWWRtdnl3dXE7UXNkPltva3Z3TkNTT0pFUWJpaGdqamxub29tZ2NfXFxcXF5cXF5hZGZoampqaWdnZmVjYmBcV1BJQTgwKygnKCsuMzg8P0FHTlZdZGtwdHd6fH1+fn59fn+ChYuPkY+Pj46Ojo6NjY2NjIyKiISCgX98enh3eHl7e3p5eHdyb2xoZmRlY2NgYF5faHB7hYqNjIuLi4uLi4uLi4uLioeBfHZ0dXt8fn17eXV0c3JwcG9vcG9ua2dmY2VpbnB3foSMkJGPjIopJykpJyYlJSUlJSUkJCMjIiIiIiMjIyMjIyMjJCQkJCYmJicoKCkpKSkpKisrLCwrKy0tLS0uLi4uLi4xNDEvMjM4PkdVX2p0eXJoW0g7MzMzNTY1NTY2NjY2NjY2NjY2NjY2NTU1NTQ0MzIxMTAuLC4tLCsqKyonJiUkIyMiISEfISEjJSoxOEJNV2Bocnl9e3lzb2ljXlpXVFNOTlBUU1NSVFdZW19gYGFhY2Zpa29ycnRzcnJydHZ5fX6ChISDgX9+e3h0cGxnY19YUU9SWWVxfIaOj46NiYB8fXx8eXh0bmliWU5COzY1Oj1AQERHSkxMTU5PUFJUVldYWlhWV1NST01JRD46NjMwLi4vLy4uMTM1ODw/Q0VLUlJ7nZqaop6ai2lqjaWYiIWEaFpUXmZ8n7adq7u8sZulr6SgsqOGfZWgmIafkn1eXnRxX1lMS1NoaV1pbmlxXlhSOjo7PT84SlBPRkxGRVNLRURISkxTQjg8Pzs6Oz1QTVNIR1BMQURAYV1SUUFEQEpoMjc7TVpdZ3R1cGpfVU5KRkJDQ0I+PDw+QEJFRklKT1BSVVteWVxibnZ4d3R0cXVzZFFkb3ZtSz9HS0pHV2xqaWhpa2xrbm5tamhiXlxaWldUUlNVWVxfZmhqamlnZ2ZlY2FeXFdORz81LigmJiosMDU5PEBESE9WX2ZtcXV6fHt8fX18fH5/g4aLkJGQjo6NjYyMjY2Ojo2MioeFg4F/e3l5eHh5eXl4eHZzcG1oZWJjZWNkYWBhZWx0gImMjIuKiouLi4uLi4qKiYeFgnt2d3h6fYJ/e3l2c3Jxb29vb3BvbGtnZWJkZ2xwdn2FipCRj4uJKikoKCcmJSUlJSUlJCMhISIiIiIiIyMjIyIiIiMjJCQmJiYnJygpKSkqKSorKywsKystLS0tLi4uLi4uLzMyMTIzOD5GU15pdHhzaFtKOzU0NDU2NTU2NjY2NjY2NjY2NjY2NjU1NTU0NDMyMTEwMTEwLSsrKiooJyYmJSQkIiEhISMjJCcqMTlDTVdianJ2eXh2cHFsaGVkXlxbWVdaXFpaWVtcX2FlZmZmZmhpamxwcXJzcnJxcXF0eX2BgYCAfn15dnJtaGRfW1lUR0FCRE1ZZ3aEjY+Oi4R9e31/f35+fXp2c2tkWU5DPz9AQ0RGSUtMTE1OT1BRVFZXWVhVUlNOTU1JRD86ODQyLy8vLy8xMjU4Oj5AQ0ZISk5elZqanp+XjHdXXImkp5aEdGJZYWRJWo++roadsrWprp1ucYuhmn1ljZmKmYtnYWdmXWNkWVRXZlxUZWlpY1xiUjs8PkQ9PEZSTkpSUUNJTk9RTU5SWkU8PkU9ODs6SFtmTEtQQ0NCR2BSVVhBRj1XPT5DR1BYS05xdXBnX1dOSkNBQ0NAPTw+QEFDRk1MTlZZV1paW11gaHJ4eXZ1cG9xcG5ucnlmSkJKSkNBSmJlZmhoaGhrbG1sa2llX1tZWFRPTUpMS1BZX2NnaWppZ2ZlZGJhXVpVTkc+NCsnJigrLjA1OT5ARUtSWGJnbnN3enx7fH19fHx+gISHjI+RkI6OjY2MjI2Njo6NjIqHhIKAfnt5eHd3eHh4eXl2c3BqZmJgYWRkZGFhYmdveIOJjIuLi4uLi4uLi4uKiomHhYB4dnV3e3+Bfnp3dXNycW9vb29wb2xrZmNiZGZrcHZ9hYyRkI2LiSkoJyclJCQkIyMiIiIiISEiIiIiIiIjIyIhISEhIiQkJiYmJycoKSkpKisrKyssLC0tLS0uLi4uLS0tLS8xMzMxMjg+SFReanV4cmhdTD01NjY2NTU3NjY2NjY2NjY2NjY2NjY2NjY2NTQ0NDIyMTAwMC8uLCsqKScmJyYlJCMiIiIiIiMmKzI6Q01XYGdub3Bvb21sampqaGdjYmBeXl9fYV9jZWZobGtqaWlqamxucXRzcnFvbnBxdnp+gH98enh2cWtlX1tXUk5KR0A+QEJGUGBxgYyOjYmBenV5e36BgYGAfn15dW9lWVBJSEdHR0pKSkpMTk5OUVNVVlZTUU5NSklHREA6NjQ0MDAxMjM1Nzo8PkBCRUdJSlBThJ6YnJ+YkoF2WVF4j5aYfndmh41fKCB9vbuphH2XrK6dd1tlgZiJPlqToJh6VVlcXXR3bV9cXVpTVm1oZ2hWSEU5PU1TRkA+VGRcYHVbRkxOTkdDVUE9QD1DQTc3OURXUz81Q0JEQztAT1xPPkQ/OzlASk1VU0xZam5xalpPTUhCQEJCPzw6PUFBQ0ZTVVNdYmJhYF9eYmpzeHh3c3BycGtIVHh2RkZNTkZMZ2pmZGZlZWdpamtra2xmYFxWVVFPR0NAQ0ROVl1kaGlpaGdmY2RjYV1aVU1FPDMsKCcpKy8yNTo/QUZMUltkaXB1eHt7fHx8fHt9fYGEiI2Pj46OjYuLjIyNjY6OjYyKh4OAfn17eXd4d3h4eHd2dHFsaGNfXl5jZGNiYWVqcXmCioyNjIuLi4uLi4yMi4qJhoN/eHN1d3t9fXx4dXRycnFubm9vcXBsamdjYmVnbHN4f4aMkY+Mi4koJiYmJSQkJCIiIiIiIiEhIiIiIiIiIiIiISEhISIkJCYmJicnKCkpKiorKysrLCwtLS4uLi4uLi0tLS0uMDIyMTI4PkRPW2VwdnRrYVBANzc3NjU1NTY2NjY2NjY2NjY2NjY2NjY2NjU0NDQyMjMyMDAvLiwrKiknJicmJSQjIiIiIiIjJisyO0FLVVxjZWRkY2FjZmlqampoZ2VjZGNlZmZoa2xtb3BubW1tbm5ucXN0c3JycHBxdnp8enp6d3Vwa2ZdV1FKSEREQUA+Pj0+QkpabH2JjIuGfHJna3F2e35/goKDgH17dGxlW1NOS0lJSUpKTU1OTlBSU1JPS0tJRkZEQ0A7ODYzMzIyNTc5Ozw+QUNERkpMTVFRZJ2fnKCckYOChWNRZoSDhoODgZ+bWiojeLy7tKWCXXycm4hiVmuOjXtscJakZkNcX2N6kpJ2bWRiXGhhVlxYPTk/REtXWUQ5QkJjXFdiWUtGQ0A6TFQzOD5JSjw0MzU+RkpIREFHQEU3QEdUPUA8PTpIXVhbXT9FT01eXl9aTz8/QEFCQkJAPT5BQUNGVFlXX2NlY2JhYmdsdHh3dHNsYFxybGZfVE1DTFtkc21oZWRjYmNlaGpra2toY11ZUk9KQzo3NjxETVZdZmhpaWhmZmNjYmBcWFNLQjgwLCgnKSsvMjU6P0JHTFJdZmxydXh7e3x8e3t7fX2BhIiNj4+Ojo2Li4yMjY2Ojo2MiYaDgH98enh2dnZ3eHh2dHRva2VgXl1dYGNiYmNmbXN7hIqNi4uLi4uLi4uLi4uKiYaCfnhzdXd7fX18eHVycXFwbm5vb3BvbGpmZGVlaW9yeoKJj5KPjIuJJiUmJiQkJCQkIyEhICAhISEhISEhISIiIiIjIyIhJCQnJyYnJygpKisrLCwtLS0tLS0uLi4uLS0uLi4uMC8wMTAxNjxETFhmbnN0bWJTSD02NTY2NTU3Nzg2NjY2NjY2NjY2Njc3Nzc1NTQ0NDQyMTExLy8tLCsqKCcnJiUlIyIiIiEiJSYrMjlBSFBVW1xYVFJWXGFmamxraWdnZmhoaGxsbG5wcnJycG9vcHBydHR3eHRycnNyc3h5eXZ2c29qZV9ZUkxEQD9AQD89PT07PUFIVmd5h4qHg3doWFphaXB3e4CDgoKEgoB7dW9mXFVRTkpJSkxMTk5PUFBOSEZEQkVEQkE+Ozc1NTc4Nzk8Pj9CREZIS0xNT1BRVIOjn6KfmYlwiIt1UFd8gXt2c3ugl0AqI2i6ubaypoVgZHaDg2lgfYd9cGOEi09EZnKOiI2Sin18Y2FjU1JYXFIzPktTXmtGLzA1TVNNUUpJRkRERFc7ODg9QDczMjU0OEREOz4/QkFTQEFGQD1CSlJIVmdRUVdARkAwT09NUEA7P0RGSEI/Pj9AQkJESFFZWl9mZ2RkZWZpbnV5eHVxcGNdamdKSFNOTVllc25pZWNjYmNjZWVpaWhnZF9aUkxHQDkyMTU6Q0xWXWRmaGhmZWVkY2FeW1hRSUI3LyooJyksMDQ2PEJDSE9XX2htcnd5enx8fHt7e3t9f4WKjY6NjI2Oi4uNjY6OjY2Mi4eEgH59fHl3dnd2d3d3dnVybWljXVlcW19hY2NkaHB4foiMjYuKi4uLi4uLioqKioeEgHl0cnN3e3x8e3h1cnBwbm5ubm9ubWxqaGdlZmlucX2GjZCQj4yLiiYlJCQjIyMhISAhISAgISEgICEhISEhISEhIiIjIyQkJycnJygpKSorKywsLS0tLS0tLi4uLi0tLi4uLi8vLzAwMDQ6QEtXYmpxcm9mWU5EPDc4NjU1NTU1NTY2NTU1NTU1NTU2NjY2NTU1NDQ0MzExMS8sLCsqKSgnJyYlJSQjIiIhIiMlKDA2PkNLUVNTT0pJT1RaYWVnaGdoaGdpamptbnBxcXFycnFxcXV1d3t7e3p3dHR1dnZ3dXRyb2xnYVtTS0RAPj4/Pj0+PDw7PD1BR1JjeIaKh4J1Y09KT1hia3J6f4GFhoeFg4B5dm9kW1NPS0tMTE1NTU1IRkNBQEFCQ0JBPTs8Ojk7PkFBQkNERkhKTE5PU1VRU2OaoZ2el5FxWX6HdF5NZH17dnF1kIIyKipNtbSxsKudiHJpam1vaHV8bWR0dmI+PliDoZmWlYyBdWZbVUtNWF9eR0tCRlpVRDMyOT41Ok5JSUM+O0ZTOjU4OTxGOzIyMjhATkY9PzdOWVFZSzlCQ1FBSFZVT1JON0AyMElLWUA2Oj5DRklGQT8/QUFDR0hVXFlaY2hjZWFnbXJ7d3NqXmdnXl5SR0Y6OktTX3JtaWVjYmFkZGRoZ2dnZmBdVU1EPTUtLC4zPEZOWF9kZmdmZWVjYWBgXltUT0g/Ny8qKCcpLDA2OTs/Q0hPWWFpb3V3eXp8fHx7e3t7foGFio2OjYyMjIuLjY2NjY2NjImFgn99fXp5d3V2d3h3d3V0cWxmYVtYV1pfYWJjZmxxeYKKjY2MiouLi4uLi4qKioqHhH52cXBydXh6fHl3dHJwcG5ubm5ubWtqamhnZWVobXF9ho2QkI2LiokmJCQkIyMjISAgICEgICAfHx8gICAgICAhISEiJCQlJScnKCkpKSkqKyssLC0tLi4uLi4uLS4vLy8vLi4uLi8vMDAyNzxGUVxma3BwaWJXTUM8OTc1NTYzNDU1NTU1NTU0NDQ0NTU0NjY2NTMzMjMzMTEvLSsrKigoKCcnJSUkJCIiIiMjJSkuMzo+REhLS0hHRklPVlteYGFkY2VnaWpqa21vcHFxc3JzdHZ3eHp7e3x8eXd2dnRycHBvbGllXlZMRD9APz0+PT09PTs7Ozs8P0ZQYXOCiYeCd2RNO0BFTlljbXh/hIiHiIeFgX55dWtfVlBNTE1MTUxGQz87Ojo9QUNDQ0NDQ0NERENERERHSktMTk9RT1FSVVVwo6GcmZSDSkxuj4NsUE9xeHd3cIJwMzEwNaOup6ikioB4amBUWVdmamNtbGhTOD9Ug6Wgk5eSkpR0STxeb2JbVE5MRkNDS1JEM0BEOTo6OD5HNDNCS0s/M0E+PzcxMzA1OURDPjxQZWBpXzs9PEFOUUlFT0hNTTs8Rj1DQD84MTc/QUBAQUFAQEFBSElKTU1MUmBoZ2ZaX3BlZGNUS0RFSkVPT0pAQk5DSWR1bWdkYWJkZGNlZmhoZmNeWFBGPDMrKSkvNT5JUVlgZWdnZWRkY2JgX1xYVVBHPjQtKSgoKiwwNTg6PUJJUlpianB2dnh5e3t8e3p6e31/homMjY2Mi4uMi4uMjIyNjYuIhIF/fXx6d3V0dXZ2dnV0cm9qZV9aVVdZXWBhZGhwdHqEjY+OjIyMjIyMioqLi4qJh4N9dHBwcHR2eHp4dXJxcW9ubm5tbW5sa2tpaWZnaG1zfoeNj46Mi4mJJCEjIyIhIB8gICAgICAgHx8fHx8fHyAgISIhIiQkJSUnJygpKSkpKisrLCwtLS4uLi4uLi0uLy8vLy4uLi4vLy8vMDI5QUtXYGVrcG5oYFVMRj47Ojg2NjQ0NDQ1NTU1NDQ0NDU1NDY2NjY1MzIzMzIxLy0sLCsqKCgoKCYlJSQiIiIjIyUmKzAzOT5AQ0JCQ0dJTlNXWVhbXFxdX2FhZGdpa21wcXRzdHV4eXl8fHx8fHl6eHVxbmxpZmNfWFBHQj8+Pj09Pjw9PDw6Ojk6Oz1DTV5wgIiJhnxqUzcxNT1IT15qdX2Eh4aHh4WCfnt2cGlbU09NTEtIQj87Ozs+QUVGR0dJSUpKSkpKSkpKTE1OT1FSUlJSU1dWdqOem5WMbjpJY4mIeFhOWXJ4eniEYDg1NC56pJ+ipJaJfm1kWE5CP0RdamhjSjxFUX6fnpiZop+UY0NOfH12bWRgU0pQWVhaUEc8OkZHOjs9RUE/QURVUEJBNzA1PTYsMDM2Oj9VYllWTjw7PUReWEhERkhRXVdMSk1LTUA+QDs8Pz46Oz5AQUA+Pz9DRkdISVRhaGtcRk5OYGtaT1RdVDQvQEhDQUZHR1RycmxoZWRkZWNjZGVpaGVgW1VLQDUtKCkpLzY+SVFbYmZoZ2VkY2JiYV9cWFRPRT0zLSkoKCosMDU4Oj1BSlNbYmpwdnZ4eXt7fHt6ent+gYaJjI2MjIuLiYmKi4yMjI2LiISBfnx7eXh2dHV2dnh3dnRuaWNcWFRUWFxgYWVqcXh+iI2Pjo2MjIyLi4uLi4uKiYWAeW9sbG5wdnd6eHVycW9ubm5ubW1tbW1rampqaGpvdoCKjo+OjIqJiSIhISEgICEgIB8eHx8fHh4fHx4eHh8hISEiISIiIyUlJycoKSkpKSorKywsLS0uLi8vLi4uLi4uMDAuLi4uLi4sLy8xNTtETlljaG9wa2ReVU5HQ0A9Ojg1MzMxNDQ0NDQ0NDQ1NTY2NjY2NTQ0MzMyLy8tLCsrKSgpJycmJiYkJCMjIiIkJictMTU7Ojw7PT9DRUpPUVRTU1FRUlRZXWBhZGdqbXBycnV3eXt9f4CAgH57eHRxbWlkYF9ZUkxFPjw8PDw8PDw7Ojo5OTk5OTk7PklZbX6IioaAcVw+KisvNz9LVmRudn2DhoeHhYSCf3lyaV1TTEtHREI9PDs+Q0dISk1OTlBSU1RTUE9PT09PUFFSU1JTVVZWVnyjnpiQi2o2VWF7jH1kUkxmdX2CiVY5Nzg4SZSYnqOUhX13bGBVTEZJXGNcWkdBRkpymZWSlJ6ekHpac4l5bGlcWlZdbHF5dmpiW1RVVlVVXGhQQz87Rk5JOzAxOUc3LS0vNDhLZmBVUlA9PkNKQT0+Sk1GRE1OST5BTFZWVlNXRjo9QT06PkFBQ0VHRUFNUlFeU09ZXElFUlpaZFlbVEM6PjlFRzwwPFJwd3Jvb2lobmNqaGJiZmVlYVtTSDwxKCgnKi82P0pTW2NlZmdmZGJhYWBfXllSTUQ7MiwqKikrLTE1Nzg8QElTXGRscXZ2eHp6e3t7enl6gIKHi4yMi4uJiYmJioqLi4uLioeDgH17eHh2dXZ2dnZ1dXNxbWhfWlZSU1dbX2JnbXV7gYmNjo2MjIyMi4uLi4uMioiDfXRuaWlscHV3eXZ1cnFvbm1tbWxubm5tbWxra2lpb3iDjI6OjoyJiooiISEhICAgHx4eHh4fHx4eHh4eHh0eICEhIiEiIyMlJScoKCkpKSkqKyssLC0uLi4vLy8uLi4uLi8vLi4uLi4uLC0uLjE1PUhRW2RobW1oZFxYUUxHRT88OTYzMzQ0NDQ0NDQ0NTU2NjY2NTQ0NDMzMTEvLSwrKykpKCcnJiYmJSQjIyMhIiUkKC0yNDM1Nzg6PkNITE1NS0tMTE1PUVdbYWRnam1wcnJ4eXp8f4GEgn57eHNva2ZeWldTTUY/Ojo7Ozs7Ozs6Ojk5ODg3Nzc3Oj1EUmV5hYmGgnloTDAqKSwwOUNNWmZxeX6ChISEgn+Af3ZtYlVLRkFAQ0NDRUhLTlFUVVVVVldYV1VUU1NRUVJQVFNRVVRVVFqLnpyXkI1zLDxYcYZ9aE1HTGZ1fHVKOjs8PDpnjpGWhndydG1lWVBQVFpVUVFJRkdHZo6Lh4uTl5WJfXxdTlFUTU9VTlJuiYxwc4VwYlpNRktYT05GO0dPQDIuMzc8OC8tLi4zPD9DP0tWSk1JOzc4Ozs6PD4+QT04Ojs8Q0hKTVBAQURBPj9BQUJEQ0NGSkpJTVJQSENQUUJFSklUU0A/QkBBS1Fma3R5eHVuZnR4d2RYXVReXmNmZWFdVUY7MSgoJykwN0BLVVxkZmdnZmRiYWFgX1xYUk1EOzIsKSkpKy0xNTc4PEFKVl9mbHF2eHl6ent7e3p5en6Ah4uMjIuKiYmJiYqKi4uLi4qHg4B9e3h2dXR1dXV1dnZ0cGxnX1hTT1FVW19laW92fIKJjY6Ni4uLi4qKi4uLjIiGgXpvaGRna3B1d3d1c3Fxb25tbW1sbm5ubm5tbWtrbXN8ho6PjoyLiYqKISEgICAgHx4fHx4eHh4dHR4eHR0eHiAgICEhIiMkJiYnKCgpKiorLCssLC4uLi8vLy8vLi4uLi4tLS0tLy8uLSwrLC0sMTc9R1FcZGlpaWZkX1pVUU5JREA6NjUzMzMzMzM0NDQ0NTU0NDQzMzMyMjEwLy4tLCwrKikoJyYmJiYkJCQjIiIjJCQoLTAxMzI2ODk+QURGSEhHSkxOUVVaW19jZmtucnJzd3t8gH6AfXx5d3FuZ2NdWFBNR0I9Ozo6Ojk6Ojk5OTk4ODc2NjY2Njc5PktfcoCJiIJ9blc7KSknKS00PUlTXWhveH+DhISCe3V2eHBhVElFREdJSk1SVVlbXV5dWVdYWl1aWFZWVVRTUlNUUlNTVl1ilZ2YmJWMfSs5TmB7eWNOS0RJUFJJQT0+Pj08OW6EioFubWpiX1dQUFNRSk1QSUpHRUp2iISCgIiSiX5bQUlPTUxKRT41P1than+NgXRlW05SV0hKTD0/OjUyODkyNTUwLSonKjE7Pz5UTD03NDc3NDM5NTM1ODs7Ojk4PT07OkJRREE/RU1HQ0E9Pz9CR0lSXlpdZFRWXlxKPVJaUTpATEdFUGFwdnNzd3Rzc21waWVKU0FIXWNlZ2VhW1NHOzErJicqMTlCS1RdZGZnZ2ZjYmFhX15bV1JKQzkyLSorKSwuMDQ2OD1DTFdgZ21ydnh6enp7ent7en1/g4iMi4uKiYmJiIiJiYqKioqJhoSAfnx4dnZ1dXV1dXZ1dW9qZV1WUU9RV15iZmtxeX2Ei46OjIqKioqJiYuLiomGgn52bWVlZWpuc3d3dHFvcXBvbm1tbm1ucHBwbm1ubHB1foeOj42LiomJiSEhISEgHx4eHh4eHh4eHR0eHh0dHh4gIB8gISIjJCYmJygoKSoqKywsLCwuLi4vLy8vLy4uLi4uLS0tLS0tLCwuLCwtLTA0N0BGUlteY2VmZWJgW1hVU01IRT02NDMyMjIzNDQ0NDU1NDQ0MzMzNDQxMDAvLSwrKyoqKCcoKCYmJSMlJCQjIyQkJCcrLC0zNzg5PT8/QENFRk1SVVteYGRnaWtsbnF1d3p6fXx8end2c29qZF1XUElDQT8+Ozs4ODg4OTk4ODg4Nzc2NTU1NTU0ODpGVWp7hYmGgnZkRy0oJigpKSw1PkhVXWdwdn18cGVfZnt4cGVaT05QVlpiaWxub29wbGZfWllbX15aVlZWVFRSUE9QUE9PWZmgl5aUjH8zMThWbnBTSlBIQTw7PUBBQUFAPjdFcn5zZWRhWFpSS05OSktNTEZHR0pMWXWHhXp7lI53RjpBQkNBQUA+OzYvMlaAjId2YmBVUVNJPUQ5ODg0OT89Mi4xLy4tKTxBOTg8ODYzNDc7PEFDOjQzNjYyPEJDRzw5OTs9RkZCPjg8P0BBPkFFQ0JJSVlRanVNUGlwcmFJQUBISUg9VGhucHFyalpwf2ZsXlVSQEBMVV1jaGVkYltTSDoxKycoLDI6Q0xVXWRmZ2dmYmJhYV9eXFhSSkI6MywrKyksLjAxNTg9RU5XYGlwdHZ4ent7e3p6enp9f4OGiouLiYmIiIiIiYmKioqKiYaDf3p4dnZ2dXV1dXV2dXVvamVdVlFPUVdeYmdscnqBh42OjoyKioqKiYmJiomJhoF6cmhhYGJnbnN2dnNxb29vb25vb25tbnBvb25tbm50eoOKjo6Ni4qJiYkhIyMjIR8dHR0dHh4dHR0dHR0eHh8fICAfICIjIyQlJSgpKCkrKyssLS0sLi4uLi8uLi8uLy8tLS0tLSwsLCwsLCwtLCwsLjE4QEhRVlpeYGFiYWFgXVpWUEpFQDo1MzMyMjMzMzM0NDMzNDMzMzMyMC8wMC4tKysrKignJycnJSYkJSMjJCQkIyMlJyosLzM3Oz5AP0BDSU1WWl1haWtubm9vcHN2eHd5d3Z3dXRxbmpjXlhRSkM8OTg7PDo6ODc2NTY3Nzc2NjY2NTQyMzMzMzU2PUxgc3+HiIV8cFc5JyUlJygoLC83QEtWYWpvamRvblNqgH10aF9dY2x2fYCBhIJ+fX11bmdoaGllX1lWU1JQTkxLTEpJR0yUoJqUj4iDRS42T2dcR0lSSkVCP0BAQD8+PTI2RlFxbmNdWldWUE9NSUhGS0xJSVBSV1pYaXh8hpWObUM7PDs4OTk6OTc2My87Zn6GhnNhU05JQ0VLSj0yNko7NCwzNC8rKjM/PURFOTUzNDk2PEJEPDc2NTU0MzQzMzQ1Nzc6Oj5KVkk2MCwzODo8RT87PUBGWlxRQ0xbZ2JdSEFISkU9WW1tbXBydFpDbHZ0hkZXYFdHSVBbZmdoZ2JbUkg6MSspKi80O0ROV2BkZmdnZmRiYWBfXlxZUklCOjAqKCkqLTExNDc5PkhTWmNrcXV4eXt8fHx6eXl5fICDiYuLi4mJh4eHh4iIioqKioiFg396eHd2dXV2dnZ2dXVzbWdjXFNPTlNZX2NnbXR8g4mNjo2LiYmJiYqKiouKiIWAeW1kXVxgZ290dXVzcW9ucG9ubm5ubm5ubW1ubnFxdn2Fjo+NjIuKiYmJISMlJSIfHR0dHR4eHR0dHR0dHh4fHyAgICEgISMkJSUoKSgpKysrLC0tLC4uLi4uLi4vLi8vLS0tLSwsLCwqKisrLCssLCwsMTY/RkxPU1hbXV5gX2BfXFdTTkhBOjUzMjIzMzMzNDQzMzQzMzMyMS8vLzAvLSwsLSspKScnJyYmJCQjJCUkJCUlJScrMDU5PUFERkpLT1VbXmNmam5ycnN0dnV3d3d0c3FvbWtpZmBcVlBLQjo3NTY4ODk6Ojk4Njc1NjY2NTU1NTQzMzExMTEyMzdCVmp5hIiFgnllRiwlJyUnKSowNjtEU2JtaGtdZHhxeHl4eXJzcnd/g4WFg4aCgoWFg399f4F+eHBnW1FPTExHR0VDQ0NBep6Vj4qEg1kuNUFgVkNITUpIRUJDQ0JBQD9ebl5CWGxnX1hTUk5PTUtHSE1NS01MVFZXVlhab5iVhG9VQjg7OjU3NjQyMS4tLURqfImMgGVUTkpEQUlKLyksLzMyPDosKjE5LCc0Pzk0MzQzNDEzNDAwMzM0MzMxMDAwMTQ5PDo9Q0xELykuMzc1Qk07P1VYUVNWYG1aQERQYl1LREBCW25qbnBtcHZ3ZUViqJJLZF1MQkpRYGhoaWdiXFNIOjErKSouMz1HT1lgZGZnZ2ZkYmFgX15aV1FKQjozMjIzMzc7Ozw8QEVNVFxlbXN3eXl7fHx9e3h4eHuAg4mLjIyJiYeHh4eIiIqKioqIhYJ+e3l3dnRzdnZ2dnV1c21oYlpRTk9TWWBkaXB3f4aLjY6MiomJiYmKiouLioiDe3JoXlpaXmVrcnZ1c3FvcG5vbm5ubm5tbW1tbm5ycnqDiY+PjYyLi4uKiiMkJiclIB0dHBwdHRwcHR0dHR0eHx8gICEiIyQlJSYnKCkpKSoqKiwuLi0uLS0uLi0uLy8vLiwsLS0sLCsrKysrKiwrLCoqKy0vNDs/RElNUVZZXF1fYGJeXVVOTEI+NzMxMjIzMzM0MzMzMzIyMTExMS8vLi4sLC0qKiknJyYmJiUkIyYlJSUlKSsvMzk7QEVITlFWV1hfZmptbnF1eHp6eXh3dXJwa2tnZWJeWVZRTUZBOzc0NDQ2NTc4Nzg4NjY1NTQ0NDQ0NDQzMjExMDAwMDIzO0xidYKIiYeBclk9KSUkJSUoLjE6R1NbXllhY2ZvcXFraW9wdX6ChIB+fHx4eX2HjI6PkZSVk46Kh3tsW0xBPj5CPjw5O1iYkYqHg4BxNC89WFtJS01LS1RGRENFQD46X5WNamdgZWNaU1BMUE9NR0hKTE1STU1bVktRVGSWj4NsXVFFOzIyNDc2NDEuLCotSGV8jYx6ZVZdV1FTT0Q6OjI0OT88MDA3OisoKzQ0NjQ0NDM4OkVPRD03NTQyLy0tMC4wMzg6Pz5FPjUvMTo/QD84NUVVUllXX21qW0xOTFptU11ldHVsc4CBdHd0eXZVY4FPRFNbVEFIV2ZnZ2hoY1tSRzkyLSssMjdASlNaYWVnZ2dmZWNiYV9eW1hUT0pEQD9CR0hNT1BQUFNTWF1jaXF2enp7e3t7enh5eXl9g4aKjIuKiYiHh4eHiYmKioqKh4SCfXl3d3V1dXd3dnZ2dnJsZ19YTkxPVFlgZWxzeICHi46PjIqJiYmJioqKiouGgXlwZFlSVVtjbHR3dHNwbm1vb25ubm5sa2tra25vb3R7hI2QkIyMjI2NjIwjJCYnJiIeHRwcHR0cHB0dHR0dHh8fICAhIiMkJiYnJygpKSkqKiosLi4tLS0tLS0tLi8vLy0sLC0tLCwpKSsrKSkqKisqKiorLC4zNjxAREdNUFZYXF9gYWBfWlJLRT01MTIyMzMzMzMzMzMyMjExMTEvLy4uLCwrKiopJycnJyYlJCUkJSgqKy80OT9ESExSVllcYGRlaXB0dnd4eXp5eXh0cG5pZ2RgW1dRTkpIQz44NDMxMTEyNDQ1NTc2NjU0MzMzMzMzMzMzMjExMS8vLS8wMTVDWGx+iIyKhnxqUTsmJSk0NS4wPEtOR0dHT05OUk1RVFdWVVpocnV5dnZ1d3uEjZKSk5aWl5WQiYqOi4ByW0g+ODg5NzU5fpaIgn+Af1E9P1FfUE1OTElKRkNEQkA+N1WakoJ2Z1ZaYFlQTVJOSEVFSkhLTk5OWVlTSEpTkJKIcV1JQzQzNzg5OTUyLSoqKjBKYHyVloFuYWRjc2tcWFNNRDczOERISUA3Ky8zNTUzMjZHTElLRjY3Ojg2NDpBPTgvKy03PkFNXUEyP0NIQkhHPUdNUVJVXmdkXVVWVWBlZ0lXb3JwbW+EfmhpYltcW1lNRElbYEg7Rk9mZmlqZmFdU0o8Mi0sLzM4QktTWmFlZ2dnZ2VjZGNkZGVlYl9eWVVYWFtgZWhpbGxubnBwc3R3enx8e3p6enh3eHh6foGEioyLiomIh4eHh4mJioqKioeEgX57eXd1dnZ3d3Z2dnZybGdfV01LTlRZYWZudXuCiIyOj4yKiYmJiYqKioqKh391a15TTVFZZG1zdnNycG5vcW9ubm5ubGtra2trbW5zfIWPkZCMjIyNjYyMISMmJyYjIB0cHBwcHBwcHBwcHR4fHyAgIiMkJSYnJygnKCorKioqLC0vLS0tLS4uLi4wMC4sLCwqKysqKSkqKikpKSoqKikrKysrLC4yNTk9QEVKUVZbXV9fYGFcVU5HOzUyMjIyMjIzMzIyMjEwMDAwLi4uLi0tLSsqKigoKCcnJiYnKS0vMzg7QkhNUVRbX2JmaWtwc3R3eXt7enl4dXJvbGlkYFtYUkxIRD47OTUyMTExMDAwMDAwMzMzMzMzMjIyMjI0MjIyMjIyMTAuLS0tLS40PExleoeNjIuEdWVPOSk2U1VKR1RcWlFQUVNUWV9QSkZFRkc/RklMVV5ncHuDjpKRl5iVkY1/eHl3go+SlY17YUg5MzQ2N0iCiYJ9gYFqS0dXY1VPU01FRkNCQkI8N0ZynpeGeW1aVFhaVlBJRkVGR0lHSEhJS09QSUZKUY6PiIBlQTUyPkM+OzcyMCkoKSoqNUxkgpSTiH13dHVyY2JYTEtMQjxNTkY+Nzs6NzU0Mjc8PDo+Pz87Ojc1OERFSzsuMTEyPkpPaXFPLz1STkxUUVJfc1pMUlpnUV1SOz1cZllPVGBcXlpZYl5WUFFJREBMSkBFTkE8SDoxXmtramhiXFRJOzEtLS81PEVNVFxkZ2lnaGZmaGpsbnFycXRzcHBwdHl6fYCBg4OBgIGAgIGBg4OEhIJ/fn18e3Z1eX2DiYyLi4qJiYeHiIiIiIqKi4qGg398enh3d3d3eHh3d3V0cmxlXlRNSkxTXGNpcXh9houPjo6Ni4qIiYmLi4uLiYZ+dmdXTUlPWWJsdHV0cnBubm5ubm5ubWtqaWVmaWtudX+Ij5KPi4yMjY2NiyAiJCUlIiAdHBwcHBwcHBwcHB0eHx8hISIjJSUmJicoKCkqKioqLC0uLiwtLS0uLi4uLy8uLCwsKisrKikpKiopKSkpKioqKisrKioqKy0yNTc9QkdLUllcX2JiYV1UTEY7NTIyMjEyMzMyMTAxMDAwMC4uLi4tLSwrKyooKCgoKCsrLjE0Oj5FSU5VWF1iaGptcHN0dnh6ent5eHV0cW9qZmFeWFJPSUM9OjYyMzIxMC8vLy8vMDAvMDIyMjIxMTIyMjIyNDMyMDAwMDAvLi0sLC0uMTZFWnCCjY6LiYB5aU86Q1hXUVJLXW1wYmVoXWVgWWRjUktFPkRERUZHRElcbX+OlZaWkYyDio+PhH+UmZyalY56WUE3PEdMaI+JgYGBfXJubmdYTE9NRERCP0E/PDtijJ+ZiX5zaV5YVVFNSERGSUpKSEdGSUxFRkVHTU1+iH95bUY8N0JHREA4MCgjIyUnKSo4UGB4jJOPhHVqdWlxeGRpa1lKV15RQzw5Nzg0MC8wMjU2Njg6ODlHT0c5Q0M3KiorMU5oa21kX0hCR0NUUE9TXG1jTF1mWk1HOUNOaltDY2llWElJQz8/RUxGNzc/TVlSTUdLUVs0T2draWpoYlxUSD41MTEzOUFIUFhfY2ZpamxucHFzdnp9gIOGh4WGhoaHiYqKi4uKioqKioqLi4qKioqKh4aBf397enyAgoeLi4uKioiHh4iIiImKiouJhYJ/fHp4d3d3d3h4d3d1dHFrZV5TS0lOU1xka3J5gIeOkI+NjIqJiYuLi4uLi4eEfHJjUUlHUFplb3R1dHJwbm5ubm5ubm1raWdiZGZobnaBi5CRj4uLi42NjYsfHyIkJCIfHRwcHBwcHBwcHR0eHh8gISEiIyQmJycnKCkqKSkrKy0tLS0tLS0tLi4uLi4tLSwsLCorKyoqKikpKCgpKSkqKioqKikpKiorKy8vNDg8QkdOVVthZGRkXVVNRTkzMzExMjIyMjAwMDExLy8uLi4uLS0tKisqKSgpKiwvNTg8QkdNUFRbX2RobXBydHd5eHh4d3Z0cnBta2diXllUT0pGPjs1MTEwMDAuLi8vLy8vLy8vLi8xMTExMTEyMjExMTMyMTExLy4uLi0sKyssLi8yPFBnfIiOi4yEeHJ3d3x+dWZRPz9QY3V5XE9XWF9ud3RhSUNDQ0RGQ0FDREdLXHF+fn2FjpGWlY6Lk5qfnJWWlYx5Y2BueYWWj4OBfoGMioJxWExNSUdDQT89RUxWf5efnY1/eG1iXV1aUklIR0hISUhGRUZIRTw9RVNZbIZ0bWlRQD5CRkRCPTMmISAhJCcqKz5RYHGDjY2EdG5pdX50dnBlYmNaXEc7PDs5NjEzNDUzNjk1ODVEOzs/Ozc7NjUtLzlecHFlVl1VVE9PRExTVl1XU05cS0VQSEJaTF5tXV9gVk0rLjk1MzY3ND1NUWNsX1VHRE9lY2loaWtrZ2NeVkk/ODM1NDtGS1RZYmducHJ2dnp9f4OHiY6PkI+NjIuLi4yLi4uLioqLi4yNjo6Pj46Ojo2LiYqEgH+Ag4SJjIuKiomIh4eHh4iJioqKiYWCf3x7eXh4d3d3d3d3dXRya2RcUklITVNcZWxyeoOIjpGOjoyKiImKiouLi4qHg3ltXk1FR1NdaHF0dXNycG5ubm5ubm9ta2hlY2NkaG94g4yQkI6NjIyOjo2MHh4gICAgHR0cHBwcHBwcHB0dHh4fICEhIiMkJicnJygpKikpKystLS0tLS0tLS4uLi4uLSwsLCwqKysqKiopKSkpKSkqKikpKiorKyoqKiorKy0wNDpAR09VW2JlaWZdVkpCODMyMjEyMjEwMDAxMS8vLi4uLi0tLCsrKikqLDE0OD9DR05UW1xiaGtvcnV3eXl4dnVzcXBsa2lnYl5ZVE9LRUE6NjIvLS0uLy0tLi0uLi4uLi8uLi4vMDAwMDAwMTEwMDAyMjExMTAuLiwtLCsrKystLzdFW3KDjIp/dHGCkpWRi4N+e3FYTVFkWmBRSlBlbGV+fFxRSEVEREdGQ0FFRkVHSVZff5KVmpKSkZSXnpyQjpSXkIiMkZGSlY+Ffnx+j4VYaFhKTEtHQ0BBPT1Db5Ohp5uMiH11a2dkY2FhTUhdZmBXSUZFRUM5MjlIXGh/eF9gWEdEQ0VCPz44LSIhIycqKywvOk1caneEh4J4d31+gnp1al5PVUg8REhPWFQ9OkA8NjdCNDI+P0NGWlU8PjMxNTQ3VWlkXFZcW1FAO0NhamheXFpVRkRMP0FNWEhWaF5cTkVLP0c7PzY/Q0hcZWh/eG9OTD1BZWZmaWpra2djXlZMQTo2Nzk/Rk9XYGhvdHd8f4KFiIuPkJKSkpCOjI2Li4qLi4uKiouLi4uKjIyMjY2NjY+Oj46Mi4mIhoiJjI2Mi4qIh4eHh4eIiYqKiomFgn98e3l4eHd3d3d3d3V0cGphWVBIR0xTXGVsdHuDiI2Qjo6MioqLioqLi4uKh4F4aVZJRUpUXmpydHVzcnBubm5ubm5vbWtoZWJiY2hxeYWNkI+NjYyMjo6NjB0dHh4eHh0dHBwcHBwcHBwdHh8eHyEhISIjJCUnJygpKCkqKiwsLC0uLiwuLi4uLi4uLi0sKyoqKisrKioqKSkpKSgoKCgoKCgpKCgpKSonKSkrKy0yOT9HTlVfZGdqZFxSS0I6NTU0MzEyMDAwMTAuLi8vLi0tLS4tLCwuMTY4P0ZKT1RbX2RpbG1wc3V3dnZ0cm9taWhlYWBdWVVQTEZCOzcxMC4tLS0tLi0tLS4tLS0tLS4tLi4vLy4vMDAwMC8vMDAxMjExMjIvLisrLCsqKikpKSwwOk5keIOEenyLkYqDhYqGg4KCfXpsWF1uYlZPZYSCd3xuYE9FQUZGRUhFRkhKTEpBP1Nuh5WTj5CTmJ2ajoqMjYhxio6Uj5SOhHt5e5GNcYVdSEpLRUE/Ozo6Sn2Xo6ecZWuDfnVubGtqaWmBlZaSjIN4XEY+NzEzS2Vrcm5lYV1NSEREQT8/PTIoJScpLCwsLC06TF1ncHZ7hpGVhIeBdW9hUWJWTldVWFVYPjVFQ0VCRDE2QTpGT0tGQzAuOzksNEpaU05QXFVGPUZLVExRSUxRVUdFR0pNVldISVhaTUBFT0lHOD9DODlEWG55fXlzUjQ9UWhnZ2dpamxoYl5XTkU9ODs8Q0xVX2dxeX2BhomNkZKSk5WUkpKPjouKh4eHh4eIioqKiomJiYqKiYiLjIyLjY6Pj46NjY2NjpKQjoyJiIeGhoeHiYqLi4qIhYJ/fHt6d3d3d3d3d3d1c29nYFlPR0ZMVF1mbXZ+hImMj46Ni4qJh4mJi4uLioaAd2hUSEVMV2BrcnV1cnJwb21tbm5ub21qZ2RhYWNocX2HjpKQjY2MjI6OjYwdHR0dHBwcHBwcHBwcHBwcHR4fHiEgISEkIyQlJycoKSgpKissLCwtLi4vLi4uLi4uLi4tLCsqKioqKiopKSkpKSkoKCgoKCgnJygoKSkpKCkpKysqKzA2PkVQWV9na2ljW1NNRUE9ODc2NTIxMDEwLy4vLy0tLS0rLS8xMzc8Q0lPVVxhZWptcHNzc3N0cnBvbWplYl5aV1NSTktFQTs2NDEsLCwsLC0tLC0sLCwtLS0tLS0rLS4uLi4tLi8vLy8vLy8vMDEwMDAwLy4rKysrKiopKSgpKjJAVGVvc3+Mj42Fgnl2doWFfoF+XFJrc25mXW+Hj3x1bWdbV1BFRUpSS0VEQ0VJS0dHSl6BlpGTlJidmYmIjIuGcneGiYKQjYB6eHmOk5SOY0dJSUVCQ09HOFGInaapo14sWHuBeXh2enqElZ+hmZOIeWRNPjYvOFNlbHNuZ2FeVUtBP0E/QD44MSouLy8vLSsqKzpQW2dqbH+ToZiWmI2Ge2tjZWViWFREVk08PkI/SUEwPTtBRj9HTjouP1ZELTVJVFtKQUo8PExMSFA1OjxARldWRkVFT05cZl9NODVHWUtTTDY3Ulk/REpmcF9qck9DV2NmZ2hoampsaGRfWE9GPjw+Qk1WX2lzfYKHjI6Rk5SUlJSUk5CPi4iEgX57eXl7foCCgYOGh4aHh4aHh4eHiYmMjI2NjpCQkpOTkZCMioiHhoaHh4mKi4uKiIWCf3x7enh3d3d3d3d3dXNvZ19VSkZFS1JbY2x3f4WKjI+OjYuKiYqLi4uLi4qGgHVmU0lKUltlbXJzc3FwcG9tbWxsb25tamdkYGBjaXN+iI+QkI2MjI2Ojo2MHBwcHBwcHBscHBsbHBwcHB4fHh8hISIiJCQlJiYnKSooKiosLCwsLSwtLi4uLi4uLi4sKysrKysqKikpKSkpKSkpJycoKCcnJycnJykpKCkpKCkpKSksMTlASVJcZGlraWJcV1FLR0M+PTs5NTMzMTAwLi4uLSwtLy80Nzo/R01UWmBjZ21wcnJ0c3FxbGpoZWFcWFRPTEhFQT05NTEwLi0uKyssKysrKysrKysrLCwtLSwsLCwtLS0tLS0uLi4uLi4uLi4vLy4vLy4uLCsqKikpKSkpKCorNUZaZnx+hoN/gXFicGhpb1dYZVhcZ2dkX19xg5KEdGxnYlpNREZKUEpFRUNER0lLTExPeJiSkZKXnpeKiI2OjoV1fYh5i4yBe3d2iZCOj3FETEtJSUM/Pjdaj5+lqqWKKzRNcoGCfXl7i5uhoJSOhnRdSDs0LzlNWWJnaGNbVlRPQT4/P0FCPjgxMzMxMC8tKyorNUxfaGRrgZiipKSkoph+YFZocWZVT2FWRTxIVz4yPDpET1JLPi8mNEdXRTI7R1VjVkNFRDU7RltTPDczNzpFREhCMTpBRmFiODxZX1hMW1BLU25oYGNgam5OVl9dYGZlZ2VmaWpra2hlYVhRSEJDSE5ZYmt1f4eLjZCRkpSUlJKTko6Lh4B4cmxmYmBgYmRna29yeHt8f36AhISFhYaHiImKiouOkZGUlJOSj4uJiIeHhoeJiouLioeFgn98e3p4d3h4d3d3d3VybWZcUEdEREpQWmNtd3+HjI2PjoyLioqLi4uMjIyLhoB1ZlZPUFdfZ29zdHJwbnBvbm5ubm5ubWpnZWFfZGp0gYuRkI+Ojo6Ojo2NjBwcHBwcHBwbGxsbGxwcHBweHx4fISEiIiQlJSYmJykqKygqKywsLC0sLC4uLi4uLi4uLCsrKysrKykpKSkpKSkpKSgnJygnJycnJycoKCgpKSgoKCgoKi4zOkJMVF5kaGpoY15YVlJOS0ZDPz06ODYzMi8uLi4vMDM2OT5DSFBWXWFnam1wdHJwbmxqZmJeW1VTTktGQT05MzExLSwsLS0sKysqKysrKysrKysrKywsLCwrKysrLCwsLCwsLS0uLi4uLi4uLy8uLi4tLSwrKiopKSkpKSkoKzVNcHp5dXFtaWleXHZzb313dGZaXWJUS1RidYGMhnVpbW1nVkRBSUhKR0RFRUZGSElMTXWWjouPl56Vi4yLjo2Oi4ySh46Jf3p2doSLi4t6S0dIRkZFQT41Y5Ohp6elmlcyPT9GST5BaoeamZKFgHVmWlM7MTE+TFhaXV5gWFRQTUM9PkJER0I/OTY2NDMxLi0pKis1UmJfXW6AipOdn5+bi3hpeHNoYFtXWktHVmA9OTQ7QUdGSDg5Pkg8RT45PEhRWU48O19DPUZaXkUxLjY2PEhFQD1FSEhUXmVua2dlaWVpbWxmUFVpYGZsYGVraWllY2ZnZ2dra2tqZmFaU0xLTlJaZG95gYmMjY6QkJGTkpKQjoqDe3JqYFhSSkZFRUdLTFJbX2dsbnN2en19fn6Ag4SFh4eIi4yOkJKQkI+MiomHh4aHiYqLi4qHhYJ/fHt6eHd4eHd3d3d1cm5lW09FQUFHUVtlb3mBh4yOj42Mi4qKi4uLjIyMi4aAd2hcUlRaY2xzdHRycXBwb25ubm5ubm1qZ2ViYWRsdoONkZCPjo6Ojo6NjYwcHBwcHBwcGxoaGRscHBwdHh8fICEhIiQlJiYnJicoKSoqKystLi0tLS0sLS4uLi4uLi4tLCwrKysoKiopKCgoKCgoKCcnKCgnJyYmJiYoKCgoJiYnKSoqLzQ7RE1XXGRoaGdkZGBbWVdSUU1JRUNBOjY1MjIyMzc6PkRITlRZX2Voa21ub25tamZhXlhVUExKRT47NzMwLy4tLCwrKywtKysqKisrKysrKysrKysrKysrKysrKysrLCwsLCwsLCwtLS0tLS0tLSwsLCwsKyoqKSkpKSgoKzBhfYFvZWl2b2RpXmZ7enltXWZgXnx1Y2RsdHyLjJOQjI2FeXVkVUtMTEdERURGRkpNTUpplI+MjJObiVtyhYmHjI+RlI2Rhnt5dXSKkZGQi1xESUhIQ0E8OnKao6ipppp0MDw7OTc0L1B+kI2HgnlxZVhQRzU6QkxSUlRWWFVPS0hEPDlBSktGREA7OTc2NTEuKy4xN0BWXltia3R+hIiIiImFg4J+dWlVUFVUVWRkTEI3NTIyOz48P0A0Nzc5PDs6PUE6NjAtOjs+N2daMy0wPk5BNjxKUFJMY3h3cnBua2ppa2lpYFZoc2BacXFtaWhmZWZmZ2hqbW1samlkYVxZWVxjanV+hoqNjY2PkJCQkI2KiYZ+dGlgVUtBPjs8Ozs6PD5CSk9XYWdvc3Z4enp7fYCAgIOFh4iIiY2Pj4+PjYyIh4eIiYqLi4qLiIaBfn17eXd3eHh3d3d2dnFrZFpRRkFCSFJcaHF5gYmNj46Mi4qJiouLi4yMi4qHgHZqXllaX2dudXZ0cnBwcG5ubm5ubm5tamZkYmFibnuGj5KQj46Oj4+OjYyLHBwcHBwcHBsaGhscHB0dHR8fHyAhIiIkJSYmJyYnKCkqKiwsLC0tLi0tLC0uLi4uLi4tLCsrKioqKioqKSgoKCgoKCgnJygoJycmJiYmKCgoKCYmJigqKisvMzxHTlZdYmRmZWRjY2BeWVdTU1BNSkVBOzk4OD09QUZLUVddYGJoamtpaGhlYVxZVFBKRj46NzMxLy8tKyssLCwsKystLCsrKiorKysrKysrKysrKysrKysrKysrKywsLCwsLCwsLCwtLS0tLS0sLCwsLCsrKikpKSkqLTNHgHpxend0d2lpa2dqdWBNS1tcZWdlYmRfZ3t9h4CTm6OjnZCKhnhVQ0hIRUdISElISUlHYJWQioyQmYgvOU9jcX+IjI6MjYR5d3V3kZqamJVoQEdGRUFAPUV5maKlqqadgTE5Ozs7OTQ5Znl7enZxZ19YUExHR0hJSk5QTlBSTkpJRj00QE5OS0VDQT86NzY0MjI0Nzo3Q1ddX2RscHFzdXN2d3JqaGpmVklNVVpRVlhOMTIsOUU/PElKMjk8ODgxLzlLRDAwNzk0PDk9USssMTY5MkhlbVJQSnF6dnJvbmtramprbm1xcXVdSm1ybmlnZmZmZmdoaWtrbG1tbGppamtwdnyEio2OjIyMi42Ni4mGgH12bWVdVk9HQT49Ozw8PD4/QkZNVl1mbXN2d3d2d3l8fH6AgYKFhoaGi4yMjY2Ni4iIiIiKi4uKioeGgX59e3l3eHh4d3d2dXRuamNbUEVAQ0hRXGhxe4OJjY+OjIuKiYqLi4uMjIuKh4B2al9bXWRrcXV3dXBwcG5ubm5ubm5ubWpmZGJhZXB+iJGSkI6Ojo+Pjo2NjBwcHBwbGxsaGxsbHBwdHR4fHx8hIyMkJCQmJSYoJygpKyssLCwsLC0uLi4uLi4uLi0tLSwsKyoqKiopKSkpKSkoKCgoJycoKCgoJyYoKCcnKCgnJycnKCopKzA1PUVMUlheYWNkY2VkYWFeXVtbWFRRTEhFRUNESU1QVltfYmRnaWhnZGFeW1NPSkVAOjYxLS0sLCsrKysrLCwsLCwsLCwsLCsrKioqKisrKioqKioqKioqKioqKiorKywsLCwtLSwsLS0tLSwsKysqKisrLCwpKyoqLjdRZHhkZn+ChYBwcGZmaWJPTUxOTVpnbV9UT0xeaHBqgImRpaihnZySeFVASUZISUdJSkhISFSOjYqLi5SMQDs7PElnfYePjot7dXZ3eJSenZ6aekJBRkpDPj5Wfpifo6amnn0uOT08PDo1NEpna2xqZl9WVFBOS0pLSkxOT05OTk5NS0dBNUFQUlBJRkZFPzw5Njo7Ozg3OTlMWF1gZWpqcHR2eHBaR0ZISklEREdRSkZIRz47QzI2PD88OTlFQz05OjtCPDw8MzU8MTc7P2BTSz88PEZbZWJTT1l7eHVybmtqamlpam1ucXJzbWt0cGtpZ2ZmZ2dnaWhrcHJ0dnV2eHp9gYaKjI2OjYuIiIWEgX57eHJtaGJcWVJNRT87Ojw9PT4/QUNJUlliaHB0d3Z2dnd5enp7fH6Bg4SEhIiJi4uLjIuLiYmJi4qKiomIhYF+fHp4eHh4eHZ2d3Zzb2pjWE5FP0JIUl1rdH2Dio6Pjo2MiomKiouMi4uKiYZ/d2hfX2JqcXZ3d3RycXBubm5vbm5vb21qZmVhY2ZygImRkI+OjY2Qjo6Njo0cHBwcGxsbGhoaGxwdHR0eHx8gISIjJCQkJicoKCcoKSssLCwsLCwtLi4uLi4uLi4tLS0sLCsqKioqKSkpKSkpKCgoKCcnKCgoKCgoKCgnJygoJycnJycnKCcqLDQ7QEdOUlZZXF5eX2FhYGFfX15cWlZTUVBQUFRXWl5fYWNnZmZiXltXU0xHQTs1MC0rKyoqKSsqKywrKywsLCwsLCwsLCwrKyoqKiorKyoqKioqKioqKioqKioqKyssLCwsLS0sLCwsLCwrKysrKioqKisrKSssKzBOc3lzbHmFiIqEfXx2c3l5ZFVQW1tLYGdkYl1bVmBjZH6cnq+zraukn5eCR0BGSUxNTUxJREJHgY+JhouRjkQ0Pj4/RVx5hoaEenR3eXuXnJucmYpOP0VHREA/aJObm52fo559LjY4Ozo4NjE3U19fXF1bVE1JSUhGSk5OTk1NTUxLTExMRkBKUlNWR0RISUZEQDw9QkZCQD4+RFRYWlpbX19laG5wbmVbVExCOzw8R1NQVl1dWjgtNDg1Nzs3QkM7PkIwMTtDU0w4QDc2OTxPWUlEOjhYdXRcUUxwe3hzb21raWlpaGlsbnFwbnB1dG9raWdmZmdnaWprcHR5fYGBgoaIi42Oj4+Pi4qHg316dXJubGlmY2BeXVdRS0NAPDs7PT4/QEBFS1ZeZGxzeXh5eXd4eXl5eXp7fYCCgoOEg4WGiYqMiYmJiYqKi4qJiIWBfnx6eHd3eHh2dnZ1c25pYVdNRD9BSFRfbHaAh4yOj46Mi4qJioqLjIuLiomEfXJnYGBobXV3eXh2cnFwbm5ub25ubm5saWhnZGVqdoKLkZCPjo2Nj4+OjY2OHBwcHBsbGxobGxscHR0dHh8fISIhIiMkJScmJygpKSoqKywsLCwsLS4uLi4uLi0tLi4tLCwrKioqKikpKCgoKCgoKCgnJygoKCgoKCgoJycnJycnJycoKCkpJycsMDc8Q0ZKTlFSVlldX15fYF9hYGBhXl1bW1xeX19hY2RlY2JeWlROSUQ8NTItKyoqKSkqKSsrKiorKyosLCwsLCwsLCwsLCwrKysrKysrKSoqKioqKioqKioqKisrLS0sLC0tLCwrKysrKysrKyopKioqKikrLS9Jfnh8fnh3f4R/d3Z6dnBrZmZvZ2hZRmNwV1dmY2RlZmt/ma2wrK+yrK6roXdDPEhLSkdKRUFBQm2Ph4OEjJJrLjo+QEBAU3KDgnVvd3h8k5iYl5aTYUNISEVBRHmVnZuXmKCbcS02ODk5Ojk3Mz5RVlVXVlJOSklJR0dKTU1OTE1OSkpISUtOXGVgVUVFRUdMTEpGRFNiU0NDQj1PV1VUUEtHSU9TWVtaXFhLOjpJTFJPS0lSWEs9Oi41Pzk6OD5COjg2LigqLDQ0KDk3NTc/SDxCPjs8aH2CVU1fhHx1cnBta2pnZ2hpaW50b292dHNwbWpoaGdoamtvc3h8gIWJjY+PkI+Qj46MioeEfnZwbGdmY19gYV9dXVpVT0hBPjw8PT0+P0BCRU9XXmhwdnt9fHt4eHp5eXl6fH5/gYOEg4KGh4iJiIyMi4mJjIyKiYeEgX57enh3d3h4dnZ2dXFtZ15VTEM/QUlVYW14gYiNj46Ni4qJiYmKi4yKioqIg3lvZWFjam91eHp4c3FxcG9ubm9vbW5ta2ppaGVmbXmGjJCRkI+OjY2Oj4+PjRwcHBwbGxsbGxsbHB0dHh8fICIjIiMjJCUnJicoKSkqKywsLSwsLC0uLi4uLi4tLS4uLSwsKyoqKiopKSgoKCgoKCgoJycoKCgoKCgoKCcnJycnJycnJycoKCcnKCkuMjY6QENHSUxNU1VXWFxfYWFkZWRjYWFhYGFkZWNhYF1ZUk1JQzsyLSopKCknKioqKisrKysrKywsLCwsLCwsLCwsLCwsKysrKysrKywrKyoqKioqKioqKiorLC0tLS0tLSwsKysrKysrKysqKSkpKSkpKyw/eYlqfHt8eYCKgHVyfH15cHZ5fnZqXFFYa2dTR2R3eXp5go+oraqzubS3ubGbaDdJSEdGRkNDQz1XjomBfYSLklM0QD89QEJOcIN0cXh6fo+UlJeXlnhISExGQkeBmJ2TjJafnGIsNjk5Ojo4NTIxPEtRUVNRTk1MR0dHSE1KTEtNTUlHRUVLU1dXVk1KRkdJTFFSUE1RXl1QTUM5SFZSTUQ9OTY2Njo5OTk1MTA6Rk5RQT1BREQ4Pz48SEk+OT9ERTk1NTM1LyQyPD1DQTY7Q0Q+Ojg3OEVOTUVNaG99fHh1cG5raGdnaGlvcnF1dXVzcG5sbGxub3BzdnuAg4eNkZKTlJKSkI6MiYR8dW5nY2BhX15eXl9eXFtZVE1HPzw6Ozw8PT5ARElRW2FqdnyBgH9+e3l5enp6e3t/gIOHhYOBgoWGhoiJioqKi4uLi4mHhIB9e3l4d3d4eHZ2dXNwbGZdVEpBPkJKVWNwe4KJjY+OjYqKiYmJiouMioqJh4J4bWNeYmlwdXh5dnNwcG9vbmxtbm5vbWtqaGdmZ3B9h42Qj46Ojo+Pj42Li4scHBwcGxsbGxwcHBwdHh8gICEhIyQkJCUlJicoKCkpKisrKywtLS4uLi4uLi8vLS0tLS0sLCsqKioqKSkoJycnKCgoKCcnKCgoKCgoKCgoKCgoJycnJyYmJignJygoKCktMDM2Oj1BQUdLTE9SVldcXmJiY2NjY2NhYWFfW1dRTUhBOzMuKScoKCkpKCgqKyorKyoqKyssLS0tLS0tLS0tLS0tLS0tLCsrKywsKioqKioqKiorKysrKywtLS0tLCwtLSsrKysrKyoqKigoKCkpKSo3a5FxWG93eoKGjYZ+gICEfG52c3B3cGhjVmN9b0c0WHZ8eoWPnKOut7q7u7u5rYpCQkVMSkRCQ0Q+Rn6Mgn1/hZGIPTg/Pj5FQ2GCd3N5f36FiIiTlpaJT05JRkFKg5qem5qbnZpeKzY3Nzk5OTczMC04R05PT01LS0lHR0ZLS01LTU1KSEZDRlNNS05SU0lJSUpRVldbYWlZTEpCOUVWU0pCPkBFSEA6Mi8vLS0wN0NFNzIyMzo7PkM+RE1LPz05Qkg5Njg2NDQ3OUFDOTQzPEE9Ozk6Oj08NzQ4PkBCSk9YY25tbGlnZ2lpbGlsdHZ1dHRxcnJ0dnZ4fICDiIqQkpSTlZSRj4yJhH51bWdiXltbXV1eXl5dXFxaWFJNSEA7Ojo6Oz09QEVJU1tmb3mAhYWCgH59e3l6ent7fX+DhYiGhYKCg4OGiIuLjIuKjIuJh4SAe3l3dnd3dnd2dXV1cGtlXFJHQD9DS1lnc32Eio6PjoyKiomJiYqKioqKiYd/dWldXWFqb3V4eHVzcXBwbm1sbW1vb25sbGppZ2pzfoiPkY+NjI6MjI2OjY6OHBwcHBsbGxscHBwcHR4fICAhISMkJCQlJSYnKCgpKSorKywsLS4uLi4uLi4vLy0tLS0tLCwrKioqKikpKCcnJygoKCgnJygoKCgoKCgoKSkoKCcnJycmJiYnJycnJycoKyosLjAxNTY7P0BDR0xQVFpdXl9gYGBgXVxaVlFMR0E6My4rKScoKSgoKCkpKisrKiorKywsLC0tLS0tLS0tLS0tLS0tLSwrKyssLCsrKioqKioqKysrKyssLS0tLSwsLS0sLCwsKysqKiooKSkpKSosR29oV1lxdXyJhoeDi4yDfYJ/gHtxdWxwbVhFZHNqUkddZnSCj5CYqLW7u7y7urWeXTc+QUVCQ0M/QENkkYh+foGKl2YxQEA+Q0hxgHh4en9+e3p/jJWXj1tARUdISoKbnZyempqUUTA3Ojk6OTg2My8uMDtFTU9OTUtJR0dHRUtNS0tKSEVGQ0RYUUxOU1RISUlLTVVfcndvZF1LQj1NW1JIR01RUlBIPzMwLzAwMDIyLy8wMzI1OztGOztFQjkzOD5BPTc5Nzk6Pj44MjM2M0JPPTY1ODk6PDs5PUNCOTpCRUhSXWFhZ2loam9vdHl6eXl4dnh6fH6Ag4eJjI6QkpOVk5OQjYiDe3NrY15dXFtYWlxcXF1dXFxcWVZSS0U9Ozo5Ojs8PD5FSlJfZ3F8goeHhYOAf3x7ent8fH+DhYmKiIaDgYGBg4aJi4yNjYyLiIaCfnp4dnZ3d3Z2dnV0dG9pZFtPRkA/RU1aZnR+hYuOj42KiYmJiYmKioqKioiEfHJlXFleZ25zd3ZycXBwcG5tbG1tb25ubWxqaWhtdoGMkJGPjYyLkJKTlJKQix0dHBwcHBwcHBwcHR4fHyAhIiIkJCUlJiYnJygqKioqKysqLS4uLi4uLi4uLi4uLi0tLSwsKyoqKSkpKSgoKCgoKCgoKCgoKCgoKCgnJycnJycoKCcnJiYnJycnJycmJigoKCgrKyotMTQ2OD5CR0xPUVVWVllZV1VSTktFQDgzKSknJygoJykoKiopKiosLCwrLS0sLS4uLi4uLi0tLS0tLS0tLS0sLCsrLCwsLCsqKysrKysrLCwtLS0tLS0tLSwtLCwuLjA2KykrKyoqKSosNVleY3d/Xmt+iIB4gYiLgXx8e3txbXZveHVcQVZwfXVjWV1ie4qRk6Ovury7u7q4p3AwNj1CQURFRERDToOQhn59gpKOSDE/Qkttfnx7gICGiYmHiY6UlY1lP0NDRVCBl5ycn5uZkkAzOzs6Ojo5ODYzLy4wPUpMTUxMTEpKR0lLTUlEQ0FFREVFWFtNT1RTQkhJS01OW21tbGdmST9EW15SUFZXV1ZLQDgyLiopLS4uLi8uLi8xNDc5ODQ4NTIuMTtBPjs7Njk6Ozw5ODE6OjE0NDcyOEJJRz43NT5DREZDPjk/UFhbWVxkbXF0dnl9fn19fX6Bg4SHioyMjI6OkJKUkpCMh4J7cGddV1hZW1xcXV1cXFxcXFxbW1dVUEpEPDo5OTo7PDxAR0tTXWt2f4WJiYmGg399fHp7fHuAhIaKi4qGg4GAgYWEh4yNjI2LjImFgn16d3V1dnZ2dnZ2dHJtZ2FZT0U/PUVRXmt2goaLjo6NiomJh4eIiYqKioqIgnhuX1ZVW2Jsc3Z2dHFwb25ta2tsbW9wcG9ta2pqb3qFjpGRjo2PkZCQj4+Ni4kdHRwcHBwcHBwcHB0fHx8gISIiJCQlJSYmJycoKSkqKisrKi0uLi4uLi4uLi4uLi4tLS0sLCsqKikpKSkoKCgoKCgoKCgoKCgoKCgoKCgnJycnKCgnJyYmJycnJycnJiYoKCgoKSkoKCssLjI1Nzo+QkRJSkpNTktIR0NAOjIsKSgoJycoKCcpKSorKioqLCwtLS0tLC0uLi4uLi4tLS0tLS0tLS0tLCwsLCwsLCwsKywsKysrKywsLS0tLS0tLS0tLS0tLi40U0AoKysqKikqMkhSboqHinFpbX6Nk4WFiIN7e4B/dnBybU0/VUJieH94fG5YX2qAjJifqLK7u7u6uqZ0NDc8Pz9DRUNDQ0ZjkI2BeXqDkIhELUNcg358fYKFhYiMjI6PkpKQeklGQUZMf5aampycmZVJNTw5Ojo6Ojk1NDIuKzRFTE9OTktJSkxMTUtHTFBSUEtEQUVdT05UUz9FSEpNTlFeYmBeXk1LUl1dWVxfXFdQRT04Ni0mJyorKy0tLS0tMDEyNUBBPjw8RkdIQkY/PDc5Nzc5MzQ1NjMxLzI2MTM3Ojk/PDo+PD9FS0pHQTc9TmlgSF14fHp9gYOEhYWGiImKi4qLjIyOjo+OjoyIgHhsY1ZOTFBUWFlbW1xcW1tbW1xcW1lXVVBKQzs6OTg5Ozw/QkVNV2Fqc3+Gi4uKiIN/fHt6e3t8gISIi4uKiYWBgIGCg4aMjI6OjIuIhH98eXZ0dHZ2dXV1dXRybWdgWEtBPD1FUV9seIOJjI6OjYqJiYmJiImKioqKh393bF1TU1pjbXR3dXNxcG9tbGtrbG1vcHFwb2xrbXR9iY+QjpCUkI2MiomJiIiIHBwcHBsbGxwdHR4fICAgISEiIiQkJSQlJygoKioqKiorKywuLi4uLi4uLy8tLS0tLS0sKywsKiopKCkpJycnJygoKCgoKCgoJycnJycnJycnJygoKCcnJycnJycnJycnKSkpKSkpKSkpKSosLzAzNTc6P0FBQUJBPTs2MiwpJyYnJygoKSkpKSkqKyssLSwrLCwtLC0uLi4uLi8vLy8vLy0tLS0tLS0tLS0sLCwsLCwsLCwsLCwsLC0tLS0tLS0tLS0tKyssLzEtKioqKiorLEFYX3uPeIN+UkpUZY2Gf4eHgoiAdHR3c3VwYlQ+TIF1dICHclhfb4OQnqWutLm7urmjaTE3Ojw+QUFAQEZDRG2Rhn17fYCKiTsyZ4OAfYCFh4eJio6Pj4+QjoNWS0RES32SlpibmpqTUDU5Ojs8Ozs6OTQxLiwvQEtQUExKSEhMTE1QUVFRUE1HOjAxYVZNUU00PUNGR0pWXWJhXl5iYmRkZGRjYFpSRTw5NzcuJycpKiorKyssLC4wMDE5PUFIS0ZGT09LRUI8RT5GT1JGPzk2MTQzMzQ1MzUzOENGPUBBOTpAR0tJRz83UWFWXnSDhoqLioyMjI2Mi4qJiIeJiYmHhoV/d25kVk1GRkxTVllZWVpaWltbW1tbW1paV1RPSUE6Ojk4OTs8PUFKWF5hbHeAhoqLi4mEgH16enl7fYGEh4qLi4iGgoGBgoGDh4mMjYyLhoR/fHh2dHR1dXV1dXV0cWxmXVVJQDo9RVFfbXqFi42OjoyKiIiHh4eIioqKiYV+d2lcUVNaZW51d3Z0cnFvbmxra2xtbm9wcG5ta211goiPkJKVko6LiYaHh4WIiBwcHBwcHBwdHh4eHyAgISEhIiIkJCUkJScoKCorKyoqKysuLi4uLi4uLi8vLS0tLS0tLCsrKyoqKSgpKScnJycoKCgoKCgoKCgoJycnJycnJycoKCgoJycnJycnJycnJygoKCgpKSkpKioqKSosLS4uMTM2Nzc3NjIvLCkoKCgoJycoKCkpKSkqKysrLS0sLC0tLi4vLy4uLzAvLy8vLy8tLS0tLS0tLS0tLSwsLCwsLCwsLCwsLCwtLS0tLS0uLi0tLS4tLC0sLCwqKisrLThPUXmHgFRiW09KTWmbmYmGjZGQjnx0eXx6gHlvSD9eeHh1hIZuU2NxgZimqaywt7q1mk4vOTo+Pj1AQT5BQkJLe4yDfXp4f4uBQHeDfXuBh4eChouOj5CRkZGSbU5MRUl8kJeWl5eWklU1OTs7PDs7OTc0My4tLDlJT1NWV1dXV1ZTUVlbWE9CMywoLF1eT1BKLC80OT9UW2BlX2BqbG1oaWlpamBURj86Ojk5MikoLCorKyoqKikqLS4uMj1JS01QTlhPSUxIQUZNUVZOQi8yNjQvLzE0NjAvOEtAOzg1TlRJQTk5QERHQTk9UVtUa4uRj46NjYuKiYaGhIB+fX19fHl4b2pgVkxGREdLUVRYWFdYWFhZWVlZWlpaWlZSTEZBOjo5ODk7PD9BTFRXYGx3goeKi4qIg399enl7e32BhIeLjIuJhoWCgIGAg4WIiYqMiYeDfnl3dnVzdXV1dXR0dHFrZVxUSUA7PkZSYW57houNjo6LiYiIh4eHiIqKiomFfXNmWFBTW2dxdnd1c3Jwb25sa2xtbW5wcXBwbm1xeYGMlJeUkI2Li4eGh4eIioodHR0dHR0dHR0dHx8gICEhISIjJCMkJSYoJygpKysrKywsLi4vLy8vLy8vLy0tLS0sLC0sKyoqKikpKSkoKCgoKCgoKCgoKCgnJycnJiYnJycnKCgoKCcnJycnJycnJycoKCgoKCgpKSkqKSkqKioqKiosLC0tLS0rKikoJyYmKCgoKCgpKSkqKissLCwtLi4uLi8vLi8wMDExMTEvLy8vLy0uLi8vLi4tLS0tLS0tLSwsLCwsLCwsLS0tLS4uLi4uLi4uLi4tLSsrKyssLTBKS1CFj2JNSEVKU2iQrqmhm5egmJCMhHZ2b3Brb086O0hihIqEfmlWXHmPn6Wnp6mzqXw3Mjk8PTw8P0FAQj4/QlGDioJ7e3aAjXeDfHd8g4aBfISKjIyRkpORkHtST0dJeI+Vk5SUk5BgNzw7Ozw9PTo4NDEvKy04WG12dW9qYV1ZVl9lYlxLNCYlJSdUY0xMSC0uLjBUYGZiYWV4cXBpZ2prbWxcSUI/PD09PTYvMTIyMTAuKSglJysuLi85QUxPSVZgUUpGP0dLTEVFSkYxIzA5My0uLzAsLz9NeH9fQzxFUFRTTD05Oj09QTg8TVhqkJOOjYqIhoWBfHdzcnJxc3Nxb2tlXFRKRkVITFJUWFhYWFlZWlpaWllZW1pWUU1HQTw5ODk6PD0+RElQWWJveYKGiYyKiIOAfXp4enp9g4WJjIuKiYiEg4GAgYKChYiLi4uGg314eHZzdHV1dXR0dHNwamRbU0c/PT5IVGNwf4eMjo2LiYiGhoaHiImKioqIg3txY1dRV2BqcnZ2dXJycG9ubW1tbW1ucXFxbW1vdH6OlpSOjImJioqMjI2MjIuKHR0dHR0dHR0eHh8gISEhISIjJCQkJSUmJygpKSkpKyssLC0tLi4vLy8vLi4tLS0tLCwsKyoqKiopKSkpKCgoKCgoKCgoKCgoKCgnJyYnKSgnJygoKCgnJycnJycnJycnKCgoKCgoKCgpKikpKiopKSkpKSkqKioqKikpKCgpKCgoKCgoKSkpKissLCwtLi8vLy8vLy4vMDAxMTExMS8wMC8vLi4vLy4uLS0tLS0tLS0sLC4uLi4uLi0tLi4uLi8vLi4uLi4uLS0sLCsrLS41VkloiYFLR0VYcoaXoaetraynopuAhot9b2ttc3JdPz84M0dtd4J+WV1wgJKepKGdn4pPNDs7Ojo6ODs6PD8+Qk1PZImFe3l3eYSOiXx4foWBgH6IjYiMkJKQi4mDU0lIT3CLkZSUkpGMajo8Oz08PTw4NTQwMC4uW4CEfXNvaVtXVVRaXV1YRSwmKSgqSGxVTEovLC9Ua2trZ2x7eW9qaGVna21lXFJKRUFAQj88OTc2ODYzMCojIyQoLC0uLzhBRlFbYFJLTFRRWmNfV1FJNSErPDwxLjAwLisqPHaRj5SHZUk/SlBQUU48N0JEQjpDV2iKkIqFgnx7dnFsaWlpa2xubm1oY1xTSkZGSU1RVVlZWFhZWVpaWlpZWVlYVlFLRUA6OTg6Ozw9QUZLVFxkcXqChomLiYeDgHx5enp7f4OFioyLioiHh4eEgYGBg4SFiIqJhoJ9eHd1dHVzc3R0dHRyb2pkXFJHPz5DTVllcn+HjI6Ni4mIh4eGh4iJioqKiIN6b2JWU1hganN5d3VycXBvbm1tbW1tbnBxcG9tbX2UmJONiYaIiYyMjo2Ni4uMjBwcHh4eHh8fICAhISIiIiIjJCUlJSYmJygoJykqKiorLCwsLC4uLi4vLy4tLS0tLSwrKikqKigoKSkpKSkpKSkpKSkpKCgoKCgoKSosKSYoJycoKCgoKCgnJycoJycnJygoKCgoKCgpKCkpKSkpKioqKikpKCkpKSkoKCopKSgoKSkoKCkpKissLi4uLi8vLi8vMTExMTExMTExMTIyMTExMS8vLy8vLi0tLS0tLS4uLS0tLSwtLi4uLS4uLi4uLi4uLi4uLi0tLS0tLS4vP11uf25uRz5hjpqfqKaho6Orqqqpjnd/gX94fIF6YltLSENESnF5fW9eaneIk5yZkopsRDo9Ojw9QUNDPz08PkJISlJtiH94dXZ8hYp6dnuBf4F5hY1/dH2Rk5GSkGhFSVFnhJCTjoiOi3U8OTo8PTs6OTQ0Ly4rS3t+enZycGVfWFFKSENER0I0MDAtLkFsWk1MMDFFam1yb3iCfHZuaWZjaGxvbWheWFRQT0lBPTw5PDk4NiwlIiMkJiouLi0uMkReZWhcUFZYZGxpbmxpZFpHODg0Ni8tLTQ8P0VZdnqFkZKHb1FETFRVUj45PURCOD1Xb4qHe3hzb2toZ2ZnaGpsbG1vaWNcU0tHRklNUlNYWFhYWFlaWlpaW1lbWFVQSkQ+Ojk4OTo7PEFHTFNcZ3N8goaJioiFgH96eXl3e3+ChoqMi4qIiIeGhoODgYKChIaGhoWDfXl2dHJzdHR0dHRzb21nY1tRRz9ARlBcaHV/iI6OjY2Lh4aGhoeIiYqKiYeCeG1gVVRcZG50d3R0cXBvbm1tbW1tbW5xcXBtcIaXl5KNiYaGh4mLjY2Mi4mLjpIeHh4eHh4fHyAgISEiIiIiISIlJSUmJicoKCkqKioqKywsLCwuLi4uLy8uLS0tLS0rKiopKiopKSkpKSkpKSkpKSkpKSgoKCgpKSkpLjkrJycnKCgoKCgoJycnJycnJycoKCgoKCgoKSgpKSkpKSoqKiopKSgpKSkpKSkpKSkoKSkpKSkqKistLCwvLy4vMDEwMDExMTExMTExMTEyMjIyMTEvLy8vLy4tLS0tLS0uLi0tLS0sLS4uLi4uLi4uLi4uLi4uLy8uLi0tLS0uL0V0emVDUkJYjailpKOmqKWjra+uq6KRkI2GhIWJd2xqYGVbZVdfd3t7ZWZye4aOjol0SkI6QT49PUJJSk9KREI/P0hRUnGJe3d1d3yHgnNxeXt3a26Hd2Jzj5iampV7RUNNXoaRjoR3jIx6QDY4Ozs5NjIxMTAsOHF9eXd1dWtgVlNUTUVBOjs7PDk2NDQ+aFpQUDM5ZmpxdIGIg316cm9xc2xjZnR4b2ZlX1hRSkVAPkA9PDcqJCQkJCYtLS4sKSxHZGVnXltbZHF5hYaCfXt+d2E8MDQuKzZGRkQ/Q0xMXmBcc3x9e1tGR0xGR0A3P0A9QVtzhnlwbmpoZ2dnZ2hqbG5tbWtmXVVOR0hLT1JVVlZYWFhYWVpaWlpaWlhVUEpEPjo5ODk6OzxCR05WX2p0fYKGiYqIhIB9eXh4eHyAhIiKi4qJiIeHh4WDgoCBg4OEg4SDhH95dnRzcnNzdHNzcm9tZmFZT0Q/QUdSXmp3gYmOjo6LioeGhoaHiImKiomHgHZqXVRUXGVudHd0c3Bwb2xsbm5tbW1ucHJtd4+XlI+LiYeGhYaIiouLi4uNj5GOHh4eHiAfHx8hISIiIyMjIyIjJCQlJycnKCgpKSoqKywsLS0tLi4uLi8vLi0tLSwsLCsqKioqKSkpKSkpKSkpKSkpKSkoKCgoKCgoKCcnJycnJygoKCgoKCgoKSkoKCcnKCgoKCkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSgpKSopKiorKywtLiwtLi4wMDExMTEyMjIyMjIxMjExMTExMTExMC8vLy8vLi4uLS4uLi4tLS0tLS4uLS4uLi4vLy8vLi4uLi4uLS0tLSwsLi9EbUxCQEVRhqitqqmgoKGhnqyvr6WdoKKbkZKTj3ZuYWVuaWhmZXCAgmxgbnZ9g4R5VC40PkQ+P0A/QEBJRURNPjpBRk9JeId9dnN5eoKDdXR0cFdhfXdte5CUlZiYjlVCRWSPmpeLcoWNfkE3Nzk5ODQzMi8wLkd7i3lwdHBvbWBwgXNbOkZAOjs7Ozo4PV1cUFNBXmpueImKg35/enp9fG5fX15pd3RtZWFZWFVRS0dEQj4yJyMiJCMqMS4uKyorS15fYVRcWWFgbXt1c3l6f3pyalQ1MDQ+Pz05Nzg+UWxrYl1dY3NpW05KRk9QST89QD5BW3iCcmxraWhnZmZoamxtbW5rY1xWTkxJS09TVFZWV1dYWFlZWVlaWllXVVBIQj06ODc6Ojo9Q0lQWGFrdn6ChoqKh4N/e3Z2d3l9gYWJi4uKiYeIiIaHhYWCgIGDgoODhIN/endzcnJzcnJycXBwbWVeWE5DP0NKVmFseYSLjo+OjImHhoaGh4iJioqKhn50Z1xUV15ncXZ2dHJvbWxtbW1tbW1tb21vgpOVkI6Mi4qKiYiIi4uLi46NjY+OjR4eHx8fICAgISEiIiMjIyMiIyUlJiYnKCgoKSkqKissLC0tLS4uLi4vLy4tLS0sLCwrKioqKikpKSkpKSkpKSkpKSkpKCgoKCgoKCgnJycnJycoKCgoKCgoKCkpKCgnJygoKCgpKSkpKSkpKSoqKSkpKSkpKSkpKSkpKSkoKSsrKiorKywsLi4tLy8vMDAxMTExMjIyMjIyMTI0MjIyMjIxMTAvLy8vLy4uLi4uLi4uLS0tLS0uLi4uLi4uLy8vLy4uLi4uLi4tLS0sLC4vPVRHQ0RUdJuzsqOmqKKkpaOqp6Wel5iioZWTkIpxZGNkaW1nZmt1eXR8YGt2fXp8ajwsMjk/Pj9APz8/QkZISkE8PkFKTUx5h311dnqBhoh4bFtWXHeAho+RjIuQk41jQ0NPjKChll6Cj4E/Nzg5Nzc3NDQ1NjZNlI+JfnGBn5eVhn9+gFA7REQ8Ozo8PDtTXE5XZXFzf4mIhICBg4OFeGdgX15gYmJfYWJdWFVTUk9NSEY8KSQjJSQlLjIvLisrMk5cX1dHUVtdXWFtenl3d3VyaGlqWkpGPi42OzUrKjRUgoqPi4l+Z11TTlBWTkxNPjg9PkVag35zaWdlZmhmaWprbW1tamZfWFBNS01RU1RWVlZWWFhZWVlZWlpYVlNOR0E9Ojo5Ojo7PkRKUVljbXd+hIiJiYeDfXl2dnd5fYGFiYuLiomHiIiGhoSFgYCBg3+Bg4KBf3t1dHNzdHRzc3JxcG1lXlZMQz9ES1hjbnuFjI6PjoyJh4aGhoeIiYqKiIR8cmZaU1lga3N3dnRwcG9ubG1ubmxsbW1yipaSjIyKiYiKi4mHh4eJjY6Pjo6NjYwfHyAgICAhIiIiIiIjIyQkJCQnJygnKCgoKioqKyssLC0tLi4uLi4uLS0uLiwsKyssKysrKiopKSkpKiopKSkpKSkpKSkpKCgoKCgoKCgoKCcmKCgoKCcnKCgoKCgoJycnKCgnKCgpKSkpKSkpKSkpKSkpKSoqKioqKikoKioqKiwtLC0tLi4vMDAvLjAwMjAxMTMzMzMyMjI0MzMzMzMzMTEwMDAwMC8uLi8vLi4tLS4tLS0tLi4tLi4uLi4uLi4uLi4uLi4uLi0tLSsvLz5GRkNOcYSmsrGYmq2usbK2t6+so5mSmJ2WkH52aVtvamRlaG52eoKCe2pmcnt7eF8xLDAxOkNEREE+PTw5Q0pIOjo9SE1DUoaEfHl8fIOOiWtIUVRrgJKdmJOPi4h+bUpDRHaZoKGMc5N2Pzo7Ozw+P0A+Q0IyVp2doKCHfZOXmIRvcGtVMjc/RD87PD08Sl9dZ3BvfYODhoaFipCJcmNiZGZjZWJeVU5UVFVSUlBQTktDLyUjJCQmKzQ0Mi8tNURQXlpHQ0lXXVxcYXJ+eXFoaW1pZXZoSDotMDA2NC4vNFKBi4qFYV5yfHZpWEtHQ0VHQkFAQW2EgXFqaGhmZ2lqbG1sb2xnYFlSTUxOUVNUVlZWVlZYWlpaW1paWldTTUZAPTs6Ojk7Pj5ETFFaZW95foSHh4aFgXx3dnZ4e32BhoqLi4qJh4iGhoWGhYKAgYCAgoOBgn98d3N0cnJyc3NzcHBtZF1USkNBRU5aZXJ9iI2PkI+MiomIh4eIiImLi4eDfHFjWFNaYmtzdXVzcG5ubW5sbW1rbWx2j5iSjYmKiouKi4iGhYaKjI+Pjo6Pj46MICAgICAgISIiIiIiIyMlJSUlJycoKCgoKCoqKisrLCwtLS4uLi4uLi0tLS0sLCsrLCsrKyoqKSkpKSoqKSkpKSkpKSkpKSgoKCgoKCgoKCgnJigoKCgoKCgpKCgoKCcnJygoJygoKSkpKSkpKSkpKSkpKSkqKioqKiorKioqKiotLS0tLi4vLzAwLzAwMTIzMjIzMzMzNTUzMzQ0MzMzMzExMDAwMDAvLy8vLy4uLi4uLi4tLi4uLS4uLi4uLi4uLi4uLi4uLi4tLS0rLjA5QUVPcIaQsLW1noyqr7O1ubizraCYkpWal5R7empiaWBhY3N0fICGkZB+UmJweHVYLCgrMTc8QEFCQD4+PDtBQTw9O0FLSDlaioZ9e3uAhouBRUlWX3iKk5mal5WJdHFRREVXiJmdlnaCSkJCQ0RGRENAPT05Mm6ppaKbkH6IhXx5Z1tJQTc1NDg/QDs8OkNhaGtxdoSFh4iMkpWAZWBnaGpqaGRkXk07PUxSUFBRUE1JPioiIiUnKjA1NjQyNUVRUFJGQEZIUFtcX1tibmhmY1hRUlljaUszMDEuLzIvLC04b4SAgYBydoGEhoaFeE09RkI/Q0VMYnN4bWpnaWdoamxubm9qZ2BZUk9NTlFUVVZWVlZWWFpaW1xcWllWU01GQDw6Ozs6PEBDSE1UXGdwen+Eh4eGg398d3d3eHt9gYaKi4uJiIeIhoaHhoWCgH+AgIGBgoKAfXh0c3NzcnR0c3FwbWRdU0dBQUdQXmp1gImOj5CPjIqJiYiHiIiJioqHg3puYFVWXGRtc3V1c3BubWxtbGxrbmd3kJeRj4yKiouLioqHhIeKjpCPj46Oj4+OiyIhIiIhISIiIyMjIyMjJCQkJCcnJycoKCgqKiorKywsLS0uLi4uLi4tLSwsLCwsLCwrKysqKSkpKSkqKikpKSkqKioqKSkpKSgoKCgoKCgoJyYnJycnKCgpKSgoKCgnJycnJycoKCkpKSkpKSkpKSkpKSkpKioqKioqKyorKywuLC0tLi4vLzAxMTExMTEyMzMyNDQzMzQ0NDQ0NDMzMzMyMjExMDAwMDAwLy8uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi0tLS0sLCwvPERVdIWOpbO0t6F/nKGrpampp6ijm5KLkZKJfHhxZ2dlbW5xdH+Gi5qgm1NSanV0UicoKy44NjpJREE/PTw6OT06PTs/R01ERnuPh397eYCFi3xHT1h6ioyOkZOTkIF5YUZDRGmNmZiKX0RBPz0/QD05OjdSYEKFrqKViomKjnFoaVpRQzg2NDMyND5DPzxBV2tudHqChYuPmph/aWdmZmltcG1rZlxCMDA+TFJRUlNSSjcmIiInKywzNjU5OkBLUk9ENzxBSVBUV1ddYGNZXFxIPTcyOkdXTzYvLzIxLy4uSV9neHt5e3x+goB3a29iVD5DSEVFR0VQUFNeY2dnaGtsbG1vbGdhXVRPTU5SVVZWVlVXWVlZWlxdXFxaVVJMRkE+PT09PD5CR0xQV2BpcnqAhIeHhoN+eXZ4eHl8fYGGiYuLiIeGh4aGhoeFgYCAgH+BgYGBgX14dHFzcnN0dHJxbGpkXVFFP0JIVGBreIKKjY+PjouKiYiIiImJiImJhoJ4bV5WVV1mb3R1c3Fwbm5tamlramh+lpeRjYqLjIyJiYmJiYuOj4+Qj4+Pj4+PjIkiISEhIiIiIiMjIyMjIyQkJCQnJycnKCgoKioqKyssLC0tLi4uLi4uLS0sLCwsLCwsKysrKikpKSkpKiopKSkpKioqKikpKSkoKCgoKCgoKCcmJycnJycnJycoKCgoJycnJycnKCgpKSkpKSkpKSkpKSkpKSoqKioqKisqKyssLS0tLi4vLzAwMTExMTEyMzIzNDQ0NDQ0NDU1NDQzMzMzMjIxMTAwMDAwMC8vLi4uLi4uLi4uLi4uLi4uLi4uLi4tLS4uLS0tLS0tLCwsLz9Rb4aJmK6mpbKdcH6Ppp+apKypoJmOhY2Tioh6c2xqY2txdXR9hYyfqa1uSmVqaEwqKyYsLj5NS0pCQUE/PDs+Ozs9PkRIRkZ3f42Ifnt7fYONdUpSdoeFhIB/h5COeXJORkNLc42PckxFQD89Pj08Ojo1R2RYgambl4N+goBmW1BNTUM2NjQzMTI2PklIQkVgb3N4gIiNlpN/c3Fra2prbHBzcGpYOS4vM0JPUVJSUEEtJSQnKy0wOz9CQUJGR0hMQjg5PkhPUU5WWVlYT0MzLC4xMzM0Qk9POjc2MTg7Nk49PFNwdXl6f3ViXWtxcYVtPkxFPkhIS01OUVVWX2RpbG5ubmtnYl9WUU9PU1ZWVlZVV1lZWVpcXV1dWVdSTEZBQD8+P0BCRUpOUltia3R7gIKFhYSBfXl2d3d5fH+Dh4qKioiHhoeGhoeHhYSBgH9+gICBgH9+eXNzcnN0c3Nzcm5oYVpRRT9CS1hjbnmEio2Pj46LiYiIiIiJiomIiIWBd2xcU1dfaHB0dXNxcG5sa21qaWyClpaPjYuLjY2NiYmJiouQkY+PkI+Pj4+Pj4yJIiIjIyMjIiMlJSQkJCQkJSUlJycnJygoKCoqKisrLCwtLS0tLi4uLi0tLCwtLSwsLCsrKyopKSkqKioqKiopKSoqKSkpKSkoKCgoKCcnJycnJigoJycnJycoKCgoKCcnJyYnJygoKSkpKSkpKSkqKioqKioqKioqKisqKiosLS0tLi4vLzAwMTAwMTExMzI0NTU2NjU0NDQ2NjU0NDQzMzIyMjIxMTEwMDAvLy4uLi4uLi4uLi4uLS4tLS0uLi4uLi4tLSwsLCwtLS0tLDBDZYCOi6Gpmp2rl3BykaWurqysp56Yj4SHk46CgIN9cGlmbnJze4OEk6muikdfXl1HLi4zLi02Rzo+RkNCQDw+PTw8PD1CS0xIenJ6ioeAfHuAhYpsTWN7gHluZGt9jY2CX0VEQkxjcFRGRUE+PT09Ozo4MTRaaoGlk4+AeXZtZVdMQ0JBNzQzMzQ6Q0tTU1NFR09VWFxzhYd8gIB6cW1sb3B2d3FpUzQtMDA1SFJUUUg4LSorLC4yPklNTk9PTkdFRjo4Oj5CSk9PVFNJQC0rQWB6jZujpqWlo5R+a11XRjI9QDU/WW9zeXpqXGF5jI6HhkpDRzxFS0VVY1hWVVNXWl9la2ttbWdfWFRSUVVWVVZWVVZYWVlaXFtbW1hVT0xGQkFAQEBCREhMUlZcZG11fICChISCgHt3dnd2e3x/g4iKiYmHhoaHh4eHhoWDgoB+fn9+fn9/fnl1c3Nzc3RzcnFsZl9YT0U+RE1aZXF9hYuNjo+PjIqJiYeIiImJiIeEfnRnWlNXX2lydHVzcG9sbGtsamqEl5WRjoyNjY6MjImJiY2RkJGQkJCPj5CQkJCMiSMjIyMjIyMkJSUkJCUlJSYmJicnJycoKCgqKiorKywsLS0tLS0tLS0tLSwsLCwsLCwrKysqKSkpKioqKioqKSkpKSkpKSkpKCgoKCgnJycnJyYoKCcnJycnKCgoKCgnJyknJycoKCkpKSkpKSkpKioqKioqKioqKiorKioqLC0tLi4vLzAwMTExMTMzMzMzMzU1NjY2NjU1NjY1NDQ0MzMyMjIyMTExMDAwLy8vLy4uLy4uLi4uLi0uLSwsLS0tLS0tLCwrKywsLS0tLSwwSniRmZOPkpGZo5yIiJ2psraqjZidmI6EhJCKc3t4dHZzaXF3fISMjJepsKNSVVdWQCorQUMyMDAzN0RBQEA9Pzw9PTs7P0RKR3t2an+Ohn98en+GiGBSZm1jXl5ea4KNiX5IP0NBQUJHSERCPz0+Ozk1MjI1VGSCpZ+AfHZpX1VUTEQ/ODM0Oz9HUlZZW1hZWU1JR0lPVV1peoqMhnhpaHJ5fn96bUYuLDAzMTdJT0k8Ly4tLjEyR1lbWl1eWVRPRzw3NjxBRkpNTks9Mik3WHmPpra7u7u7uru6ta6qmWgvMTU0MD9Ya3V9gHt3goaCc3xtYkFKRUhNTm51aGJkW1ZWV11dZGRkYVtVVFNVVlVWVlRVWFlZWltdXFxYVVFMR0NCQUJCREZLT1RYX2ZvdnyBgoSDgH15dnV3eHt8gYWJi4mJh4aGh4eHhoaGhYOAf35+f35+fn96dXFxcnNzc3NwbGZeVk1DQEVRXWdzfoaLjY6PjouKiYiIiIiJiYmHg3xzZllUW2NrcnJ0cm9wbWtqa2uJmJSPi4uMjYyLi4iIiY2Rko+Oj5CPjo6QkJCQjIkkIyIjJSUkJSYmJSUlJSUmJycoKCgoKCgpKysrLCwsLC4uLi4uLi4tLCwsLCwrKysrKysrKioqKioqKioqKikpKioqKikpKSkoKCgoJycnJyYmJiYmJiYmJycnJycnJycmJigoKCgoKCkpKSkpKSkqKioqKisrKysrKywsLCwtLS8vLy8xMTIyMzM0MzM0NDQ0NTY2NjY2NjU2NjY1NTQ0MzMyMjEwMTAwMDAvLy4tLysuLS0uLS0tLS0sLCwsLCwsLCwsLCwsLC0tLS0rMFuGl5uek4mQjZOWmp2gp6ytqJGZn52RiYqPkHJ3dnd6e3J4fYGEioNwna6lWE5QSjUoKjdDLy0wMDA3Q0U9QT48Ozs5O0BFS0h8fnNqhIqDfXd6f4iDWl9kW1xdXGV3goeNbz9AQUA/QkZEQj49Ozk4NDAwO1VifJ2bfHBza1hVUEU5OTc8Q0pPVFZZWFtdXGBaSkRES1NcaXyNlo93YVp1hYiKinA2LTAyNjYyOERBMSwwMjIxPFdhYWhxbWBXUEY2MjdASUpMSDwzLDA+WnqOpLu+vr++vr6+vbq3tLCqfTkoMDI0P01kdHd/goOEfHyJiodMSEhPU1Baf3RramllYF1ZWVpdXl1ZV1VVVVVVVVVWV1dYWlpbXFxbWVVTTUlFRERFRUdKTlJWW2JocHV9gIOEgn97d3V2dnh7foKGi4yLioiHh4iGhoeHhoaEgX99e3t9fX57enZzc3R0c3Nxb2pkXlVLQ0JJVF9qd4KHjI+QkI2MiImHh4iIiIiIh4J7cmVXU1tia3J2dnFvbGtpaGuJl5ONi4qMjouKiYmGiIuRkZKRkIyNjY2Oj5CQkIyIJiQjJCUlJCUmJiUlJSYlJicnKCgoKCgpKSsrKywsLCwuLi4uLi4uLS0tLCwsLCsrKysrKyoqKioqKioqKiopKSoqKiopKSkpKCgoKCcnJycmJiYmJiYmJicnJycnJycnJiYoKCgoKCgpKSkpKSkpKioqKiorKysrKyssLCwsLS0vLy8vMTEyMjMzNDMzNDQ0NDU2NjY2NjY1NjY2NTU0NDMzMjIxMDEwMC8wLy8uLy44LywsLS0tLS0tLCwsLCwsLCwsLCwsLCwtLSwrKzJnhI+doJyZmZGRjJqjlZOmpKWho5KOk4yJi5SCeXl8f355d3R2fHthM3+biExQS0UvJygsLiwsKy4xNjtGQT9DPT88PDs8QUZFeYBzbW+NjIJ8e36EiHJTWlJVV1lmdoCAhoJVPz89QENDQ0M9PTg2NDEwMD1SX3mQjXtwbGpdSkpBNDU3QEpOU1RZWltcXl9iYk9FRkxSW2l7kJmae2JtjJiXmI5cLS0xMzc3NTM1MysrMTQ0OVRfZW14fHVlWUo+NjRATU9OSDYuLD1IV3aMprm+vr++vr6+vry6t7OwrqWEOC40MzQ4VWhnfn96fX6Ch4x7aEdETk5OT3l4a2hqaGdvamRfXVtcWVdYWVdVVlZVVlhZWltcXV1cWlhVUk5JR0dHSEhKTlJWWl5kbHJ3fYCEg4F9enV1dnh6fIGDh4uMi4qIh4eIh4eHh4aGhoKAfXx9fn59fXt3c3N0dHNzcW9qZF1US0NDSlZia3mDioyPjo6LiomHh4eIiIiIiIeCenBjWVRbZG10dXNwbm1raWqMmZKNiouLi4uLioiEhIiQk5ORkI+NjY2Njo+QkJCMiCgmJCUlJSUlJiYmJicnJycoKCkpKSkqKyoqKyssLCwsLCwsLC0tLSwrKywsLCwrKysrKioqKioqKioqKioqKSkpKSkpKCgpKSgoKCgnJycnJiYmJiYmJiYnJycnJycnJyYmKCgoKCgoKSkpKSkpKSoqKisrKyssLCwsLCwtLS0tLy8wMDAyMjIzMzMzMzQ0NDU1NTY1NTY2NjY1NTU1NTUzMzIyMTEwLy8uLi4uLi9NSzAtLS0tLCwsLCwsKysrKysrKysrKysrLCssKis1aHuMoKKhn5uam4mOoo+FoKemopyNiZKPjImOhHh2e318eXZva29qVztdZE5NUE5AKycpKy0vOzEuMDI3SkQ9PT5APj87Oz9ARGp/eHNudZCLgHx8f4KFXlhXVFRbanp9eHiHe00+QEFCQ0dIPTo4NDMxLjA8Ulx4kH90cW1kXUtIPTg3NT9NU1lbXGFhYGFiY11KS05TVFpkdY2bnoF3kaCjoJ2DQS8vMDI1ODo1MS0tLjA0OU1eZXB6hYl/cFlCOjk5RFFXUUIvLzVDTWOGpLm/vr6+vr6+vr27uri1sayooHIwMThHNT5YVm91e398goR7Y4ZuPkhHT1BvfnRtbGhkZWRiYl9bV1VWV1hYVlZWVVVXWFleYF1bWlpZWFNOSklISEpLTVFSVlxgZm11en+BhIF/e3Z0dXZ3eX2BhYmLjIqJh4aHh4eGh4aGhYWEg4B9fXt9fn16d3Vzc3Nzc3FuaWNaUElER09bY3F7hIqMjo6Ni4mJiIiIiIiHiIeGgHhtYlZWXWZudXdzcW9sbWyLl5OOi4mKioqKh4aEgn6Lk5ORkI+PjYyMjY6QkZCOi4cnJiQlJSUnJyYmJiYnJycnKCgpKSkqKysqKisrLCwsLCwsLCwtLS0sKyssLCwsKysrKyoqKioqKioqKioqKikpKSkpKSgoKSkoKCgoJycnJyYmJSUlJSUlJiYmJiYnJycmJigoKCgoKCkpKSkpKSkqKiorKysrLCwsLCwsLS0tLS8vMDAwMjIyMzMzMzM0NDQ1NTU2NTU2NjY2NTU2NjU1MzMyMjExMC8vLi4uLi4sKSwuLS0tLS0tLCwsLCsrKysrKysrKysrKywrKysrNmZ7kaOjm5mam5aRhaKZj5ynnpqalZCTkIuHjIN6dnV5eXhybWVcV1FKUE5OTVBLPCsnKiksMC4rLDM0NDQ1OT4+QEA/PTs9QT9fiXZubG6Fk4d+e32Di3BRUFVeZHF8eHNsfYlrQj9DQkNGRD06NzUyMS8wO01adHp+eHNoXFlTRj4/OjU7UFdZX2RmcXNsZl1YV1ZMTFFZYW+HmaCXm56enZuMYTEzMDE0NjY3NDQyMTAzNklcZW93fIqQjGw6Nzo7PDw+QD03MC83P0Vml7a+vb6+vr6+vr67u7q2s62nnpuWVTBMV0AwQ0JhWW2AfYB4Rk1+Wz9FS05WYF5VUkpJSUpMTVJRTUtKT1NXV1VWVFdZVlRbZGVlXllbX11WUEtJSklLTE9SVVleY2hvdnx/gYOBfnp0c3V2eHt9gYWJjIyKiYeGh4eHhoeGhoWGhYODgH5+fn99enh1dHNzc3NxbmljWlBGRkhQXGVzfYaMjI6PjouJiYiHh4iIh4eGhH92bF9WWF9ncHV2c3Jwa26IlpOOi4uJiouHhYSDfnR+ipGRkJCPjIyMjI2OkJGOjYqGJycmJicnJycnJycnKCgnJygoKCgpKioqKSorKywsLCwsLCwsLCwsLCsrKysqKiosKysqKioqKioqKioqKSkpKSkpKCgoKCkpKCgoKCcnJiYmJiYmJiYmJiUlJSUmJycnJiYnJygoKCgpKSkpKSkpKikpKiorKyssLCwsLC0tLS0uMC8xMDIyMjM0MzM0NDQ1NTU2NjU1NjY2NjU1NTU1NDMzMTExMTAvLy8uLS4uLS4uLS0tLSwsLCwsLCwrKyopKioqKioqKioqKikqKTZqhpefmpeNlZqSkYmdnZuXmZuYlouIjpOMjIuEeXp7fXdwYmdhUEVLUU9OT1FMSjwnJigpKy0qKSosKy8zMTYxOT4+QT49Pz4/UId1b25scoyPg3x+fISCVUFTZHB5enJlWWB4eVxDREI/REg+Ojc0MzEwLzpMYIOOjYVtYVZUU0ZCQj44PFNYW2FobnZ/hn95d3J2Z2JmZWdpeI+bmJqZl5SRhm5ENjY2Nzk4NjIzNDQ1M0VgZmx1fIOMkY1iMjc3NjU1Njc1MzAwNDdCday6vb6+v769v72+vLq4tbKroZeSkH5NS1VUMTlUalhefX5+gHp5g3dNRU5OZVdTVFJQVVlWWFdWUU9OTU9XVVRWWFtcW1RXWlxiXlpaYGRkZl1PTEtMTE1RVFhcYGZqcHZ9foCAf3x5dXR0d3h8f4OHi4yLiYiHhoeHhoaHhoaGhYaFgoJ9f35+fXx5dXZ0dHNxcG1nYVpQRkVJU15odn+GioyPjo2KiYeGhoeIiIiIh4N8dGpdV1lhaXJ2dnRxbG2HmJGRjouJiIiHg4KFfGpugIuRkI+Pj4yMjIyNjpCSko+KhScnJycnJycnJycnJygoKCgoKCkpKSoqKikqKyssLCwsKysrKysrKysrKysrKiwrKyoqKioqKisrKioqKikpKSkoKCgoJycoKCgoKCgnJyYmJiYmJiYmJiYlJSUlJSYnJyYmJycoKCgoKSkpKSkpKSkpKSoqKysrLCwtLCwtLS4uLzAwMDAyMjIzNDQ0NTU0NTU1NjY1NTY2NjY1NTU1NTQzMzExMTEwLy8vLi0tLS0uLi0tLS0sLCwsLCwsKysqKSoqKioqKioqKiorKy82a4yZmZaci4+Yko2CkpWYmZaXk4yDhIKKhoODiHp/enRuaWFqY0s5Q09PUU9QT0g4JygoKSoqKikqLCsuNTtKRzk6QEA9Pjw5O0J6gnd3dXeDkop/fn+AiHFYYWh2e3duXEc+SFplV0VDRUNAQDk3MzEvMC07SWCKm52MY0dTVFZIREdDQ0hSWF9oam6AkJGJg3dmXmVsZ21ydXR3goeMjomEfndwVj06OTg5ODU0MzI1ODpZdHR1eIGDh42JYjY3NTQ0MzAyMC4uMjY2RXGftLu7vb68vLi0trq6ubOupJmRjYyGWlJMVVIxNE1PPWiAf4CBfHx4blRLTExNTlBNT05MRExYVU1FQ0NFR1ZSUVtZU1lXY2VlbWtoaGZtb2heUU1MTk5PUlVYXGJobnN6foCCgn56dnRzdHd4fH+Dh4uMi4mIh4aHh4aGhoaGh4aHhoSCf39+fn59eXVzcnJwbm9tZ2FaUElITVdga3iBhoqNjo6NiomHhoaGh4eGhoSBe3NpXFdcY2tyd3dxcGyDlpKOi4qLiomHhIWBfGRkdIOPkZCPj4+MjIyMjY6QkpCMiYYoKCgoKCgoKCcnKCgoKCgoKSkpKSkqKioqKSosLCwsLCsqKysrKyoqKioqKSgrKikpKSoqKSkpKSkpKSkpKSkpKCgoKCcnJycnJycnJiYmJiUlJSUlJSUlJSUlJSYmJicmJiYnKCgnJykpKSkpKSkpKSkqKisrKyssLSwsLi4vLy4vMTAxMTExMjM0NDU1NDU1NTY2NjY2NjU1NTU1NTQzMjIxMTAwMC8uLi4tLS0tLS0tLS0sLCwsKysrKyoqKioqKioqKioqKioqKjBAPmiNmJOWmo+RlpCVjJebmpaLhoeJg4SBhYV/gYp9eXFxcG1sZ2NUSktLTU5RTkpINycoKCgpKSsoKi4sKyw3UD04Mzw6Pz89PDk7bI2Cgn+BiI+ShH5/goSCWWl0eHp4aldEOTc6S2FUQj9DQ0NBODQxLy4uPEtadpieiFJHR1dYTUhDQkxMVltcZXWFj5ack3tgU01ieYGDioyOhXRpdH98dnNtaGFTQDw7OTg3NjY2NTY6VXd/fnt/hIWIhmM6ODYzMjAwLy0uMDQ5PEpVb5GkrLO2saedlpqorrCvqJ6Si4mKh1hJSkdXSTA3RTRLdHl9gX93ZYFwPkxQXmNdX2BWUkhaaGhsa2VbU1VnUkdYX1pjaWFbZ21sY2BYa2xeU09PT1BQUlVWWl5iZ251en2BgoF9eXZ1c3Z4eHx/g4eKi4qJiIeHh4eGhoaGhoaHiIeFg4GAgH9+fXl1c3JycG9tamdfWVBJSlFbZXB5goeKjY6Ni4qJiIeHhoeHh4eEgHpxZlxYXmZudXZ3cnB+lpONi4qKi4mFhoODe2ReaXeDjZCQkI+NjY2Ojo2OkZGPjImIKCgoKCgoKCgnJygoKCgoKCkpKSkpKioqKikqLCwsLCwqKysrKysqKioqKikoKyopKSkpKSkpKSkpKSkpKSkpKSgoKCgnJycnJycnJyYmJiYlJSUlJSUlJSUlJSUmJiYmJiYmJygoJycoKCkpKCkpKSkpKiorKysrLC0sLSwsLS0uLzEwMTExMTIzMzM1NTU1NTU2NjY2NjY1NTU1NTUzMzIyMTEwMDAvLi4tLS0sLS0sLCwsLCwsLCsrKysqKioqKioqKioqKioqKiosLjBhhpKQlJaNjpWVlZebm5iWiIeAjo2Dg4uIgYKLhXd5d3ZybWVeVU5MSUtOTk5LSTopKCgoKSkqKistLS0sLzMrMFZEQj0/QD47PVyTjImGhouPl42AfYKBh3Fyd3d5dGdUQzg1NDhMWk9EQUZERD01MS8vLjxNZXqVmXM0QExOUExBPD9CU1hdZHCFmJ6dloF0dW1dUmJ4fIqfmpyUe25ydHJsZmNbWVBEQT49Ojk3Nzc5Ok12hICAhIeFf4BnPDc1NjMxLy4tLzM5O0NVX2Zrc3uLlZWKfXeAkZqbnZeQi4eHhn5aRERJS1FQPDxNbX13eH5+bF+JgkNNWWNjZWtoWVBcZmxtbW5sZ2FgWFBKTVtaXVpWT1ZiZVVIQV1kV1FRT1BQUFJWWFpeZGlvdnt+gYKBfXl2c3V3eHp9gYWHiouKiYiHh4eHhoaGhoaGh4eIh4OBgoJ/fnx4dXNxcXFvbWpnX1hPSUxTXWdwe4SIi42OjYuKiYiHhoWHiIeGhIB5cGZcXGJpcHd2dXF5lJSPi4mJiYeIhYSEemReYGp2hI2Oj4+Pjo2NjIyNjpGRj4yKjCgoKCgoKCgoKCgoKSkpKSkqKioqKioqKisrKysrKysrKysrKysrKioqKioqKSkoKCkpKSkpKSkpKSkpKSkpKSkoKCgnJiYmKCcnJiYmJiYmJSUlJSQkJSUlJSUlJSUlJSYmJicnJyYnJygnKCgoKSkpKSoqKyssLCwtLCwtLi4uMDAwMTEwMTExMjMzNDQ1NTU2NTY1NTY1NDY1NTU0NDQyMTIwLy8uLS0tLS0tLSwsLCwrKysrKysqKisrKioqKissKCopKSoqKiopKSksWn2LkJSQjouQj4ycnpyZnJWJioyRkouHioOCi46AfXh2dG1kXVJFPkJHTU1LSEg+LSgnKSooKCkqLS4sKygpLC46Q1A7Pz0+PD5KkJGKh4aMk5iViH5/goV/ZHV4dnBjTz43Nzc6RVZcTz8+Qj9AOjQwLi86S2eEkpdoLjZRZFRIQj4+QUVbYWR7kZ2dl4J2eHtwfpSWi4CapKKioJN+cm1oZ2RfWlpUT0lCQD49Ozk4OjRbiYh3e4GFgnx7akQ2NjQzLy4uLzE1Oj9QaH1+eXdtYV9iZWNkbHiAg4eIg398e25jWT9ANzw3RVpCQWJ2eHV8goBkTGBPTWlqZ2dgXltfaGptbG5ua2hhXl9fV1laWFVXXF1hamhCMDhXb1dRUVBRUVFTVllcYGRqcHd8gIKCgX15dHR2eHl8f4OIioyMi4mIh4eGhoeHh4aHh4eIiIeEgoKCgX99eHV0dHRxb21qZV5WTUlPVmBpdX6EiIyOjY+KiIeGhoeHh4eGhoN/eHBkXV1ka3N2dW91j5aOi4iHh4iHhoSDfmdfX2VueoSJioyMjo6Nj4+Njo6Rko6KiZEoKCgoKCgoKCgoKCkpKSkpKioqKioqKiorKysrKysrKysrKyoqKioqKioqKikpKCgpKSkpKSkpKSkpKSkpKSkpKCgoJyYmJiUlJSYmJiYmJiUlJSUkJCUlJSUlJSUlJSUmJiYnJycmJycnJygoKCkpKSkqKisrLCwsLS0tLS4vLzAwMTExMDExMTIzMzQ0NTU1NjU2NTU2NTU1NDQ0NDMyMjEwMC8uLS0tLS0tLS0sLCwsKioqKioqKSkqKikpKiovMikpKSkoKCkpKSkpLFBtfY6MjY2Oi4iJm5uanJiHh46NkI2JioeBg4mRg3h3d3RvZV9VREBDSk5JS0hGPS0oJykqJygoKCosKysuLTMrKS44PD4/PDo8QJCTjIqOkZWWl4p/gH+Fimlud3VwYExCODg8RFpmX1RNREJAPzs1MS8vO0hbfZKSWTJTcnhgTEVBP0BBT2Zud5WfloJzgqWrn6WmppuXrrCqpZ2Xh3tyaWVgXVpWUk5LRUE9PT4/Pz47WoWPfnN3foB7eG5RODc1MzMwMDE1OD9CVnaMjY+Oh31pWlZST01UW15gZGBdXFpidFlCPz1CND1BSzdLZWdueoKFaCZicVNaXWRrbGZoY2Job3BwcGtnZF9fXFpYWVlZWlRUXF5YNigxT2FVUlJQUVFSVFhaXGBma3J4fYCDg4F9enZzdXh5fH+Eh4yLi4qJiIeHhoaGhoeGh4eHiImIhoaEhIF/fXh0c3NzcG5saWVeVk1MUVhha3Z+hIiMj42NiYeGhoaHh4eHhoaDf3dvZF5gZ25zd3R0ipWRi4eFhoeIhoOFf2ljY2JmcX6JjI2NjY6OjY2Ojo6OkJGPiI6UKSkoKCgoKSkpKSkpKSkqKioqKSoqKioqKioqKisrLCwrKyoqKioqKisrKSkpKSgoKCgoKCgoKCgoKCgoJycnJyYmJycmJiYmJiYmJSUlJSUlJSQkJCQlJSQkJCQkJSUlJiUmJiYmJicnJycnKCgoKCkpKSopKywsLCwsLC0uLi4vLy8vMDEvMTEyMjI0NDU1NTU2NTQ0NDQ0MzMzMzMyMDEvLy8uLi0tLS0sLCwsKysqKisrKysqKioqKioqKioqKikpKScnJycnJycoKStJa36PhoSHiYWCi5iSi46MfYeLjImIiISBgICFkoFxdHlzbGhhU0xIR0Y8QElHRTwvKCgpKikoKCoqKywrLSwtLSosLzU0PTw3O0yWl5CNi5KWlZWThoCBg4eCcnV1bVtLPDg3RF9scmhdV09GQEI/ODEwLThEX3KMiFBOd4yDb1NKSEFBPk5VZXyFjYuSoK21srKyrKWgnK6zrqSfjn99c2xlY15ZV1hUTUhCQEBCQ0JAQ2KChoJ4d3x9eXZvW0A6Ozs8NzI1NzxARVt4ioyRkZGPgnFqY1xWU01HRkhITFhnc29MR0k+Rzg+RURHP0hXYXmBgDhFkpKASVhWUVZja2JdbG1xdHFtaGRgXVtaWVhYWVpXWl1cVkU/TFdZVVFQUVBSUlVZW19jaGx0eHyAgoKAfXp4d3Z6e32AhIeLi4qJiYiHh4aGhoaHhoaGh4iKiIeFg4OBfnp3c3Nzc29ubGdkXFRNTlNbY214gIWJjI6Ni4mJiIeHh4eGhoaGg353bWVgYmhvdnVxhpOQjYuJiIeIhoWIgWtlZWJiaHaCjJCPj4+NjY6MjY2OkJCQjI2VlSoqKikpKSkpKiopKSoqKioqKikqKioqKioqKioqKisrKSkqKiopKSkqKikpKSkoKCgoKCgoKCgoKCgoKCcnJycmJicnJiYmJiYmJiUlJSUlJSUkJCQkJSUlJSUlJSUlJSUkJCQmJiYmJycnJycnKCgpKSkpKSssLCwsLCwtLi4uLy8vLzAwMTAxMjIyMzM1NTU1NTQ0NDQ0MzMzMzMzMTAvLy8vLi4tLS0tLCwrKysrKSkqKioqKSkpKSkpKSkpKSopKSYnJycnJycnKCkrPHODi4qGi4J6fo6Wj4yQi3qCiYZ/fm52hoSDiJB9cXFxcW9jWVFPTUhGQEFKRUM+MCcoKSopKCcrKiorLCopKikrKy0uMTc6QEtrnJmRkJGWmJeHko6DgoSHiHVydG1bSUNDQ0pXZW9rYFVQUElBQUA6NS8yQ1txg3lOY4ePgnp6ZUc9RT5OVlBdeYqWpbGztbOwraukm5SqraahopaHf3RuamRhXGJwZ1xRSEVERERERFB8kpCDe3qBfnd1aV9cWV1cX1A0ODs+QUJXb4KFipGQjIF5d3VwY2NhXVxbXmFmbXBmQkE9QEJDO0xBSUc/Umd2gHBlipONhFBQV0tKVk9LV3FycnRxbmllYV5cW1tZWVtcXFxcXFhWWltYVVVTUVBQUlJVWFxfY2luc3d8gIKCf3x5dnd4e3x9gISHi4uKiYmIh4eGhoaGhoWGhoeIiIiGhoODg396d3NzcXFvbmtmYlpTTlBVXWVxfIKHiYyOjYmIiIeGhoaGhYWFhYN+d21kY2dpcndyfJKRjYmKioqHh4SHhXJoaWZiYmp4hY2QkI+Ojo6Ojo2NjpCRkIyRmJUpKSoqKiooKioqKigpKSsrKiopKSoqKioqKisrKioqKioqKSkpKSgoKCgoKCgoKCgoKCgoKCgoKCgoJycoKCcnJiYmJiYmJSUmJiclJSUlJSQkJCQkJCQkJCQkJCQlJSUmJSUmJiYmJiYmJycnJycnJycpKSgqLCwrKywsLS4uLi8vMDAxMTEwMTIyMjIyNDQ1NTU1NDQzMzIyMzMyMjAuLy4uLS0tLS0sKysrKiopKSkpKSkpKSgnKCgoKCkpKSkpKScnJycnJycnJigpLDJri42KjIqDeoSMjY6QlYp9fYaCc2dkfomGh4qOcV5fXmBnZFFRU1VNTE5OSkZFPzEnJykpKSkpKCsoKSwqKyorLC0sLDA0N1V6kZ2VkpSVl5abeoqWiISGhomDfH97dnFzc3V9iI+LgmpZW1pVTkdGR0E3Mj9OanhsXISVl4mEi5F0TEA+SlVMUm2Mnqixs7CsqKOjpKKfo5yVkpGPjIBzbWtobW1qc2pjWlNLSEhJQ0JOfZSYjoKBgH13cmlpb3R6enZlPTY4Oj5CTmF6gYaLhHp4e3t6c2ZkamdgXF9mZ2puWltbWDk2Oj5NS0NGRE9geXxbcoySjYRUR1JLNkdNZWxwcnRzcW9rZV9dW1taWlpcXFtcXVtaXFpXV1VTUVBQTlJSVVldX2NqbnJ2fICCgoB+enh4eXt8foGEiIuLiYiIh4eHhoaFhYWFhoaGh4iIh4aFg4B+eXZycXFxb25sZ2NcUlBUWV9ocnyDh4qNjY2KiYiHh4eHh4aGhYWEfndtZmVnbXV2e5CRjImJioqIh4aIhG9paWlkYmVveoiPkZKOjI2NjIyMjY2PkJCOlpaVKSkpKSkpKCoqKiorKysrKyoqKSkqKioqKioqKikpKiopKSkpKSkpKCgoKCgoKCgoKCgoKCgoKCgoKCcnJycnJyYmJiYmJiUlJiYlJSUlJSUkJCQkJCQkJCQkJCQkJSUlJSUlJSUlJSYmJicnJycnJycnKSkoKiwsKyssLC0uLi4vLzAwLy8xMDEyMjIyMjQ0NDQ0NDQ0MjIyMjMzMzEwLy8uLS0tLS0tKysrKyoqKSkoKCgoKCgnJyYmJiYnJygoJycnJycnJycnJyYoKS8zTomQjIiFgHyChouSjIuId2lubmZ0go2Lh4qLimFPT1BUVl9dT01PTktKS0hHRT8xJycpKSojKisqKicmKCsrKyorLCsrLkFukpqalJKTlZeWlXp/lY6Ig4aIiYeGkJKUlpWSlJeXkol1UlBSWFJNR0VKQzY0Sm2Id3uUmZuRkp+jn4VoaVpPQE1mkKuwsLKtpaCgnaGspI6PoKOkpKKek2lbZG+AdnFuZl9TSkhLS0dCQF2MmI6BgoB4dXh4cXaAiYR/c1A0Njs/P0RTaXl/fXFscXVzcW1nY2dmX1tfY2JnYlxgc2VCNzs9PkZKUUc7Tnh7ZHuLjYqCXElPPitAVF1kcXFyc3NvbGZhXVxcW1tbW1pbW1xcXFxaWFVVUVBQUE9QUlVZXV9jaGxydnl+gYKAfnx5eXt7fH6BhomLi4iIh4eHh4aGhYWFhYaGhoeIiIeGhYOAfnp2c3FxcW9ubGdiW1JQVFlgaXN+g4eLjo2NiYiHhoaGhoaGhoWFg313bWZnanF1e42RjYqLiouKh4aGh3RqbmxpZWNncX6Jj5KRkI6Ojo2NjY6OkJGNkpeUlCoqKSkpKSorKyoqKisrKysqKikpKioqKioqKSkpKSkpKSkpKSkpKCgnJygoKCgoKCgoKCgoKCgoKCgnJyYmJiYmJiYmJiYmJSUlJSUlJSUlJCQkJCQkJCQjJCQkJCUlJSUlJSUlJSYmJSUnJycnJycnJygoKSkqKikrLC0sLS0uMDAwMDExMTAxMjIyMjIzMzMzMzMzMzIyMTEyMzIyLy8vLi0tLS0tLCsrKioqKikpKCgnJycmJycnJycnJycmJicnJiYnJycnJycmKCwxO0Vrho2HhYSDhoOFi4iCg4SCh4Rxdo2NiYyOjoJbTkxUWFRHV2JbT05OS0pLRkM9LyUnKCosSW04IygsLCkpKywsLi8uLzJUgJigmJKSlZqWlo9+e5GViYSEiIuIeo2SlJiZl5aXl5eWhWBWWFhaXFVKRkdCOj5hjYmTlZeWmqSlpKCThpOahl9AT4ymrrCvraKcnp2goo+KpKWmpaCfnZRbPEpgeod+c2xlWkpGSExLR0FEb5OQdXqFhIWDf31+gYiGgndhNTU6PD1ASFVmbGtjZ2lmYGBgW1lcXVtaW19gX0pRXGdgSTpDPzdBQ0ZSR0hleH+EiIuFfVJKVD0tR0EwNWV1c3NxbmpmYV5dW1paWltbWltcW1tcW1pWU1JNTU5OT1JVWl1gY2VqcXV6foGCgH58enp8e31+gYaJiouIiIeHhoaFhYWFhYWGhoaHiIiIhoSCgH15dXNzcXBwbmxnYFhUUFdcY2x1foSIjI6NjIqJh4aGhoaGh4eGhIN8d21nZ250eoqTjouJi4yKh4SGhnZsbG1saWZmanWAi5CQj46OjY2MjI2Ojo+QkJaWlJIqKioqKioqKisqKioqKisrKiopKSsrKioqKikpKSkpKSkoKCgoKCgoJycoKCgoKCgoKCgoKCgoKCgoJycmJiYmJiYmJiYmJiUlJSUlJSUlJSQkJCQkJCQkIyQkJCQlJSUkJCUlJSUmJSUlJiYmJiYmJycoKCgpKSkpKywtLC0tLi8vLy8xMTEwMTIyMjIyMzMyMjMzMjIxMTExMTEwLy8vLy0tLS0tLSwrKyoqKSkpKScnJiYmJicnJiYmJiYmJiYnJyUlJycmJicnJykxOEVZcnV9hYKCiIN+e3qAfIaYoZ+fkpOUjIyNj4lwV09RXWNaWFVpaV9MRkxLSkdDOi0kJicpKTk9KCYnKCgpKCovMC0wLy09YX6bn5SSlJeXlJSIfH2Dlo2Dg4SIjIKBjZGVmZaYmZmZnZJyV1taXV9gWU1EREFAbo+SkpCXlpikqqaagXOFmqCljGBsm6qsrKmfmZmZnJR/m5+Wl5qamJSNWTxBSnKVkH1waWJUSkhGREVIQVB9kIWAh4uMjIiBgIGDfnt0Zz4yNTc8PEFGUlxdW15gXFZZWVRPU1RXWFpdV0VCTFVfbGE5OzYzMT1ZW2VXVnCAhoeGg4VjSUpFOD1AND1mdHR0cm5pZmFeXVtaWltbWVtbXF1bW1pZVVNQT09MT1FSVVpeYWRnanB0eH2Bg4KAfHt8fHx9gIOGiYmJiIiHh4aGhYWFhYWFhoaGh4aGh4WEgn98eHRzc3FwcG5pZmBYUlFXXGRudn+EiIyOjYyKiYeGhoaGhoeHhoSDfHdtaWltdYyWj4uLiYqLiIWFh3xsbW9ubWtoaG53g4yPkI+Ojo6OjY2Njo6OkJOXlJSSKioqKioqKioqKisrKysqKioqKiopKSoqKikqKikpKSkpKSgoJycnJycnJygoKCgoKCgnJygoJycnJiYmJiYlJSQkJSUlJSUlJSYlJSUlJSUlJSQkJCQjIyQkJCQkJCQkJSUlJSYmJiYkJCUlJiYmJycnJycoKCkpKSsrKywsLS4uLi4wMTExMTExMTMyMjExMjMyMTIyMzMwMDAwMDAuLi0tLS0sLCwrKisqKikpKSgnJyYlJiYmJiYmJSUmJiUlJSUmJicnKCYnKSorN0ZbdXt0ZG1xdHh1bGxrbHOAnKKkoZSVjoqMkI16XldZXWFiYV5mZ2xwX1tTTUhIQjcqJycnKCgmJycnJycmJygoKistLyw1TGR4kZyXk5SYlZSRg358fY2TioaChYmQf3yDiI6SlZeYl5eKcmRhY1xbX11WSkJAP16SlpGNkpKNmZ2SgWhbcZehpqiZfZCepamkmZaVlJeOjpuVlJSTlZaThVdBQ0phnJeJe3FqYlFHQkFGSERAYYGUkIiQk5CMhYCDgHh0b2hILy8yODs+QENKUlRXWFdVVFNQTlFTVFdZUDorPEhOT1NNQEc/OTRAV0pRT05bcHuEi4mEZUtDRUAzOEVecHR0c3FuaWVgXVxbW1xcW1paW1paW1paV1NQTk1OTk9QU1ZaXmBjaGpvcnd8gIGDg4B+fHt8foCChYiHhoiHhoaGhYSEhIWFhYeHh4eHhoeFhIKAfHh1c3JxcG9tamVfWFNSVl5lbniChYiLjY2LiomGhYaGhoaHh4aFgnx2bmtrb4WUkYyLi4mKiYWGioFubW5vbW9uaWxxeYSOkI6OjIyNjYuLi46PkJGWlZSRjioqKioqKioqKiorKysrKioqKioqKSkqKikpKSkpKSkpKSkoKCcnJycnJycoKCgoKCgoJycnKCcnJiYmJiYmJSUlJSUlJSUlJSUmJSUlJSUlJSUkJCQkIyMkJCQkJCQkJCUlJSUlJSUlJCQkJSYmJicnJycnKCgpKSkrKyssLC0uLi4uMDExMTExMTEzMjIzMzIxMTEwMDAwLy8vLy8vLS0tLSwsLCwrKikqKikpKSgoJiYlJSYmJiUlJSQkJSUkJCYmJSYmJSYoKiotNUVZbnFhYFtYXmNkXFNYW1xdc4+hmJSUkImMj46AYFVXZWlpZGZkZ2hyenFtaGVdS0EwJiYnJycnJicnJycnJicoKCorKywvOlZodJCWkJOXmJSSjn55eXmFlY2GhIGDiI6FiY2QkpWXloyIdWpnZmZkYF5cWlFGPTtbj5aRio6MiImCcGZhXGWNo5+cmI6NlZ+inZaWkpGJh5eSk5OSkZGQkYh7Z01OZqajlYt6b2VVSERVdImAaGp5jpeSkpSQiYJ/gHlya2lmUS8sLi81ODs9QklNUFFRUFBRT05QUlNRQzAwPj84Oz46P0NDPT49QUpHSVhbSl5rgYqGg3VYRklSRDxOWWx0dHNxbmlkX11cW1tbW1taWltcXFpYWVVST05NTk5OT1NWWVxgY2ZobXJ2e3+AgYGAfX1+fn+Bg4WIh4eHh4WFhYWEg4SEhYWHh4eHh4aHhYSCgH15cnJxcXBvbWlkXlhVVVheZ3B4goWIi42MioqJh4aGhoaGh4eGhYB6c25tbICTkYuKiYmKiYeFiIdxbnFwb3BvbWpsdHuIjo+PjoyMi4uKio2PkJKWlZSTj44rKysrKysqKioqKysrKyoqKioqKikpKSkpKSgoKCkoKCgoKCcmJicnJycnKCgoKCgoKCcnJycoKCYmJSUlJSUlJSUlJSUlJSUlJSUlJSUkJCQkJCQkJCMjJCQkJCQkJCQkJCQkJCQkJCQkJCUmJiYnJycnJygoKCgpKysrLCwtLi4uLS8xMTExMDAwMjExMjIxMC8xMC8wLi4uLy8uLS0tLCwsKysrKykpKSkpKCgnJiUlJSUkJCQkJCQkJCQkJCQlJSYmJScmJiouNEJacnpqYl5WV1lcWU9DS1FUWm2Hl4aHko2MkJGBZ1VSW2liZGpoY2RqdHB1bXBsd3hnRCUnJionKCcmJycoJyYpKCkoKisuN0VWZnSUkpGUlpSQj4uAf3x/hJSQh4KCgIaLi4OQlZKTk5OHhIOCg354eHZwYl1aUUg/P32bkIqKiIR8bVxfYF9jeJWZoqaeiHqTmpeSk4+Hc4aNiJGVk46LioqIgHxgVHmqo52Vh3ZrXUxES114i5KRfo+bnZiQjYmCfHh0bmZhXlY0LS4pKi4zODxCRkpNTU1OTU5PS0g/MywvN0JGNz9GRkBLT0xJPkJNSUBMUlRfYnSGhYF4S0FKWmFQWm9wcXNzcW5qZV9dW1paWlpaWlpaWlpaWFdUUE5NTExNTU5SVVhcYWNkZ2pxdXp+goODgH1/f39+goSIiIeHh4aFhIWFg4ODhIWFhoaHh4iHiIWDgX57dnNxcXBwbmxoZF1YU1ZcYGhyeYKGiYuMi4mKiYeGhoaGhoaGhYWAeXJua3eMkIyMioqKioiHi4l1bG5tbnBwcG1vdHyBio6NjY6NjIuNjY2PkJKUl5STko+NKysrKysrKioqKisrKysqKioqKiopKSkpKSgoKCgoKCgoKCgnJiYnJycnJygoKCgoKCgnJycnJycmJiUlJSUlJSUlJSUlJSUlJSUlJSUlJCQkJCQkJCQjIyQkJCQkJCQkJCQkJCQkJCQkJCQlJiYmJyUlJycnKCgoKSsrKywsLS4uLi8wMTExMTAwMDIxMTExMTAyMS8vLi0tLS4uLSwsLCwrKysrKiopKCgpKCgoJiYlJSUlJSUjIyMjIyMjIyMjJSUlJSUmJycsMUBWdXx1Zl5XWWZkV1FMRUlWVVxkeHt8io2Kjo6GbFpdYGtnaWtubGJob3Brb3BzaG1ygXxkPB8pLCwpKCkpKCcnJycoKCoqLTtOWmJ4k4yOlZGQjo+JfIWGhYaPlIuEgoB/hYyEfIuRj5KRlJqhnZecn5iPfmhdXFlQSD11nJWNioh/blpgcHBrbnCCkJWdpqGNiI+OjY6NfnN/gomPj4R/goaIhH5+cGiDpZyZlYl5b2NSRENIbo+QjnmPmp2bkYyJgXlza2ZeW1pWQCwrKCcpKSsvNDc5PD8/Pz88ODEsKisuMzVFVT42Oz9FSUs/QlFOSjxMTE5VVl9oeYKEcjw9RVJiW2BvcHFzc3FuamVfXFtaWlpaWlpaWltcWVdVUk9OSklJS0xOUlVZXWBiZGdpcHR5fYGDg4GAgICAgYOEiIqIh4eGhISEg4ODg4SFhYaGh4eIiIeFg4F+enZycXFwcG5saGRcWFVXWmFqcnmChomLjIyKiYeHhoaGhoaGhoaDfndxa3GJjIyKiYqJiIeGiIp7bXFxcnJ0dnZ3eH2EiouNjYyLi4yNjpCQkpKTlpSTkZGQjisrKysrKysrKysrKyoqKioqKioqKiopKSgoKCgoKCkpKCgpKScnKCcnJycnKCgoKCgoJycnJycnJiYlJSQkJCQmJiUlJSUlJSQkJCQkJCQkJCQkJCQkIyMkJCQkIyMkJCQkJCQlJSQkJCQkJSUmJiYmJicnJygpKSorKysrKy0uLi4wMDAwMTEwMTExMDAxMTExMC4tLS0tLSwtLi0sKysrKyoqKSsrKSgoJycmJicmJSQjIyQkJCQjIyMjIyMkJCUlJSUmJigrMT1Vcnp2c2dVUV1xdGNdXVFJSltiY3Nwg4qGh4yIcVNQV2x1bXBtcG5tbXNtb2pydG1mc3J+i4FgNyUoKyorKyooMTktKSgoKS47TVpjhY+IjI+MiYaLiYiHjYuIjZWRiIJ9fX2EiWxIWGJmd5OZnKWmrKqmmYp3YV5aU0xJapiYkI2EfXJbc4+JfHl6gIKAkaGjl4iKiIaHhnlvcHyHi4R+hJCZn52TgnZ1gpuVko2GenFqYFBDVH2Kh4BzhZGYmJCMhoB1bmhhWldRTkYwKSgoJygnJicpKikpKCgnJicpKysuMTY4PUVKTkQ+Oj08SFhVSEk6ME5NRUNSZGp9e2ROQkJDTVZgbnJyc3JxbWlkXlxbWlpaWlpaWlpZWVdVVFFPTUpKSUtMT1NWWVtgY2Vla25yeX6ChISCgYCAgIGEh4mKiIeHhYODg4OCgYOEhYaHiIiIiIeHhoOBfnl1cnBwcHBva2hkXVdVWl1ia3R8goaKjIyLiYiHhoaGhYWGhoaFgn13cW+GjYeIiIiKiYiEhYmCcXJ2enx8foCDhISJjI6Oi4qMjY2Nj5CRkpOTkZSSkJGQkI8sLCwsLCwsLCsrKysqKioqKioqKioqKSkoKCgoKCgoKCgoKCgnJycoJycnJygoKCgoKCcnJycnJyYmJSUkJCQkJSUlJSUlJSUkJCQkJCQkJCQkJCQkJCMjJCQkJCUlJCQlJSQkJCQkJCQkJCQlJSYmJiYnJycoKSkqKysrKystLi4uLy8uLzAwLzAxMTExMDAwMC8uLS0tLS0sLCwsLCsrKioqKiopKCkoKCcmJiYmJiQkIyMjIiMjIyMiIiIiIyMlJCQmJycoLTZObHp1cXhzbnZ3d3VpYlxHL0Bqb3N9boiNhomJfVhHTll1cXN/dW1rc4V2Z2dtdn52Zmx5doWNjH9hNyQoKysrKjA+MCcpKSktO05aaYyJhomLh4aEhoqGg4eLkY+Yl4uBe3p2en+IYDVPWWZxeJKlsLCxqaGYhm5jXlxQSWOTmZOViYR2XXWSlI2LjIiEiJScoJV6eH6CfXh0cYGSlIJtdIeYoqqmoZaBfoiPkIuDfHZxbGRYRWeFiYqFfH+Qk5SNhYB3bmdiXVVPSUM6LigmJyYmJiYmJygoKCgnKSoqKiosLjE2Oj1DRExIRzw1OU5HPDtARzozQUlIVGR3gnZlXFZraFFWXWZxcnNycW1pZF5bWlpaWlpaWlpaWVlXVVJPTktKSkpLTE9TVlleX2JiZGhscXh9gYODgoGAgIKDhIeKioeGhoWFhIOCgYGCg4WGh4iIiImIh4aEgX15dXJwcG9vbWpmYlxXVVlfZm11fIKIjIyLi4mHh4aGhoWFhoaGhIF7dnCCkIuHhYmIiIiIh4mKe3l/g4aHiYqLjI2Njo6OjY2NjI2MjI2OkJGRkZGRkJCQj5CQLCwrKysrKysrKysrKiorKyoqKiopKSkpJycnJycnJycnJycnJycnJycnJycoKCgoKCgpKSgoJycmJiYmJSQlJiUlJSUlJSUlJSUlJSQkJCQkJCMjJCQkJCQkJCQkJCQkJSUjIyQkJCQkJCQkJCQmJiYmJiYmKCkpKSosLCwsLS0uLi4uLi4vLy4vMDAwMC8vLy8uLi0sKyssLCwsLCwsKyopKSkpKCgoJycmJiUlJSQjIyIiIiIiIiIiIiIiIiMjJCQlJSUoKzVGZHl4c3d8fHp6e3Z0al9VRTxKZHJ5dXGJiIaGhGxNT11pcHN6eHdybXGAdHFqZ255en1qb3p1eoSBgnhaLisnKigoKSkpKysrLkBQWXCNh4aCgoKCfX6Bg4iKh4OQmp2ThHp3dXN5g4tcR0pSWmuHn62xrq+pn450ZGBaVE5hkJyTlYiBdF52k46MkpSOhYWNlJmNcGh0eGt0laSqqJ2CWlBZa4SXmZSQipKZk4qDenRxcG5lWEVngoWKi4d+jIuNhn93aFtTUE9KQjkuJyQmJCUlJCUmJSUnJygnKSgnJyktLi83OTIzNjc/RlJENTY0Sk9KWT4zKzE/UFtjYl5qalZXaXJkXFtgbHFzcXBtaWReW1paWllZWlpZWVlZVlRRTUtKSEhKS01QU1ZaXF5gYmRna3F2e4CDg4GBgYGDhIaJi4qIh4aFhISDg4GAg4WFhYeJiIiLhoeFhIB+eXNycXBvbmxpZWFcWFZcYGZtdHuBh4qMi4uJhoaGhoaFhYaHhYOAe3B+kI6LiIaGh4eGh4iMhYSIjI+Pj4+Pjo6Ojo6PjoyNjIyMi4uMjY6Pj4+Pjo+Pj4+PjywsKysrKysrKysrKyoqKioqKioqKSkpKScnJycnJycnJycnJycnJycnJycnKCgoKCgoKSkoKCcnJiYmJiYmJiYlJSUlJSUlJSUlJSUkJCQkJCQjIyQkJCQkJCUlIyMkJCUlJCMkJCQkJCQkJCQkJiYmJiYmJigpKSkqLCwsLC0tLi4uLi4uLy8uLzAwLy8vLy8vLi4tLCsrKysrKysrKyopKSkoKCgoJyYmJiUlJSQkIyMiIiMjISEhISEhISEiIiQkJSUlKjBEYnh3cXZ8fn98enh0cGhcUEhRYWp9fmp3ioKDgnpXUVdxeW1ye3FxcXV5dHd1gG9wfnl0b191cmJtioyNjnJOMygoKCkqKisrKzRHVF54ioWAgYF/e3B0eHx9gISEjpeZlYyAdnBtcXqBhFc6T11zh5+tsKyup4pdSU1OUU5OX42amJqQgGpQXIWJjI+OioiBhY6Te2prb3iAlaerp6OXe1NKSkdZg5iQhIqal5OIfXNvbm5vZlBBXYKOjo2Fe4KAhYB0Ykc6NDM0Mi4oJSUjJSUlJCQkJSQlJSUmJScoKiwvMDE1PzUzLyorLjI+XlI/QFFKPFFHLSs0QVpfUlRJT3RygH92blNRXWhwcnFwbWlkXltaWFhXV1hYWVlYWFVTUExKSEhISUtNUFNWWlxeYGFjZmpwdXp/g4OBgYGCg4SIiouKh4iGhYSDg4ODg4OEh4SHiYiIiYeHhYSCfHdzcnFwb25saWVhXFhYXGBob3Z9g4eKi4uJh4aGhoaGhYWGhoWCfnp8kI6KiomHhoeHiIqNjIuQkpSUkY+Pj46Ojo6NjY2MjIuLjIuLjIyMjY2NjYyMjIyMjY0sLCsrKysrKysrKioqKioqKiopKSkpKCgoKCcnJycnJycnJycnJycnKCgnJycoKCgpKSgoKCgnJyYmJiYmJicnJiYmJiYmJSUlJSUlJSUlJSMjIyMjJCQkJCQlJSMjIyQlJSUlJSUkJCQkJCQkJCYmJiUmJigoKSkoKiwsLCwtLS0tLS0uLi8vLy8uLi0tLS0tLS0tLSwrKyoqKysqKiopKSkpKCgoJiYmJiYkJCQjIyMjISEhISEhISEiIiIiIyMkJSUkKC8+V3N4cXR6fHx6e3p6cmpmW05JV2l2iH1wgIKAgn9pS05QY25uaGlrcHR1cWZ1eHlwb3N2a2VYYHBsV5CXkpFtZGc/MicpKSkoKjVBTFljf4iCfX1/fHZucHN0dnJ2fYSOkpCMhnt1cnBweoGFV1FgcoqarrKwqYFDPURFREtQUFuKm5qemn9UOj1kc3uChX97eHmCfGhfYWl4iJain5ybk35VRkhPa4uWlY2SmpSLdHJza2hrb2FIRlNseIB7cm55eX59Y0I0MC4sKigoJyYkIyQkJCUlJCUmJiUkJScnLC8xMDIyNDczLSgmJikqLkVfUFhZWllWSSwrLTlRUFRMXHl9fYKHelNRT1hjcHBxcG1oY11aWFdXV1dYVlhYV1dVUU9LSkdGRkhKTE9SVVlbXl9gYWVpbnR5f4KCgoKCg4OEiIuLioiIhoWEhIODg4OEhIeIiYmKiYmJh4aDgnx2c3Jxb25ta2hlX1tYWF5janJ5foOIi4qJiYeFhYWFhYWEhYWEgnx8kZGNiIiGhYaIiY2QkZCSkpOSkI+PjY2Mjo6Ojo6Ojo2NjY2NjY2NioyMjo6Li4uLiouLLCwrKysrKysrKyoqKioqKioqKSkpKSgoKCgnJycnJycnJycnJycnJygoJycoKCgoKSkpKSgoJycmJicnJiYnJyYmJiYmJiUlJSUlJSUlJSUkJCQkJCUlJSQkJSUjIyQlJSUlJSUlJCQkJCQkJCQmJiYlJiYoKCkpKissLCwsLS0tLS0tLi4vLy8vLi4tLS0tLS0tLS0sKysqKioqKSkpKCgoKCcnJycmJiYlJCQkIyIjIyEhISEhISEhISIiIiMjIyUnJyw4TGt0cnJ3e3x6enx5eHFsYlZOSlt2h4h4dYN9fYB5WUdHU2lub2tla2Zqc21obH5/cm9zb2hpZ0dqblRulIZxaGZ0P01EKSgsKikyPExZZoWHgXp5eXt1bGpubmpra25yf4eKiIeFenF0cm52g4hlYHaNm6qvqHdpUUI9PUBQWVpbh5SdnZyFVjhBU2d3e3ZycG9wc3BqbHN+iZabl5COjI19VD0+TnuPkJWVl5WMfmNTXGBiZWZVSEJGV3N3cWlganB1dVM0MDEvLCooKCclJCMkJCQlJSQlJSQmKCstLjEyNDYzMjIwLigmJSUnKSs8U1hOVlRcV0g/LzJASk9SWFJcbHN5f4F2bVlNV25ycXFtaGNdWlhXV1dXV1dYV1dXVFBOSUdGRUVHSUxPUlVZW11dX2FlaWtxd32CgoKCgoOFhoiLi4uJh4aFhISDg4ODhISGh4mJiYqKiIiGg4B7dnNycW9ubWtoY15bWFpgZWx0en6DiIuKiImHhYWFhYWFhIWFhIF9ipCNiYeHh4qMjpCRkpKQj5GQkI6QjpCNjY6PjY6Oj4+NjIyMjIyMjI2QkY+Pjo2NioyLiysrKysrKysrKioqKioqKiopKSkpKSgnJykpKCgoJycnKCgnJycnJycnJycoKCgpKSkpKCgoKCgoJycoKCcnJiYnJyYmJiYmJSYmJSUlJSUlJCQkJCQlJSUmJiYmJSUlJSUlJiYkJCUlJSUlJSUlJiYlJiYnKCkpKiorKystLS0tLi4uLi0tLy8tLS0tLS0tLS4sLCwsKyopKSkoKCkpKCgoKCcmJiYlJSQkJSQjIyIiIyMhISEhISEhISEiIiMiIiQlKCs1R2FzcXN2e3x5eXl7eHVzamBVSkpjf4+HdX2Bent8bk1FTF1oaWlqZWJkZ2ptbHV3hHJjgoJ4b2lHUHdfRYFrZGZbaGhudlo6KysrND9LV2CEhH52eXd2c2xqa2hjZGlmaW5xdXd4fIB1cW5ucniCgWx6ipWinndhd1E9N0BYbnBoYI6NlJCUjWA5QGFvhoFybWppa3Buamt3hp+knIyDfXt3ZEhBPU1yhIaLipCPhnlNLzNBUWFfUEpLVW96cmxiW2RwcGtKLC8wLysqKCgnJiYlJCUlJSYlKCcoKSswMjEyMTU3NC4rKiklJicpKykrN0FGUVFVTVZnQ0FASk1SU01YVl9dZmt7dG9hS1ZpcnJwbWdjXVlXV1dWVldXV1dXVlNPTUhGREJDRUhLTlJVWFpdXl5gZGhrcHZ8gICBgYKEhoeJi4uKiIaGhYWFg4OEhISDhoeKioqJiIqJhoN/enVycXFvbW1qaGRfWFpfYWdvdXyAhYmMioiIhoaFhYWFhYWFg4F/iJGNi4eHh4qMj5KSkpGQjo+Oj46Nj5CPkI6MjIuKjI+Pjo2Li4uKjI2QkpKRkI+NjI2NjIwrKysrKysrKyoqKioqKioqKSkpKSgoJycpKSgoKCcnJygoJycnJycnJycoKCgoKSopKSgoKCgoKCgoKCgnJycnJycnJiYmJiYmJiUlJSUlJSUlJCQjJSYmJiYmJiUlJSUlJSYmJSUmJiUlJSUlJSYmJSYmJygpKSoqKisrLS0tLS4uLi4tLS4uLS0tLS0tLS0sKysrKyopKSkpKCgpKSgoKCgnJiYmJSUkJCMjIiIiISIiISEhISEhISEhISIjJCQlJyozQ1tub292e3t3cnV3dnd1dGddVUpJaYGQiHOBfHp8fWJJR1BgYWNmamZmaGNVTlZZWGNnUV1ZV1FWRD5jb12BgIlkV2ddaGZZVkk5LzM+SlZafoR9enZ1dnJwb2xpZWNiYV5fYWdlY2J5fXFsbm1sdYJ9c4iQk1JTW1E+OkprhI6FcmOQkJCJe4JwTFFrdo+KeW5pZmJlamlveZemno56dnFxa009OjxLY3V/hYiXj4JwRC8sLz9jZ15ZW2iEiIFzZl1mbWpfRiotMC0rKignJiYmJSQlJSIjJSkpKiovNDU2OD5GQ0Q8KycoJiYmKCkpKTA3P0lZXVVdY1BARUxGTVdrXFNXU15reUtAXUxma2Zxb21nY11ZV1ZWVlZXV1dXVlVSUEtGRUJBQkRHS05SVVhaXF1eXmFmam91e4GBgoKDhIaHiouLioiHhYSFhYODhISFh4aIioqKiYuKhoWBfXl0cHJxb21tamhjXldZX2RpcXd9gIWLjIqIiIaGhYWFhYWFhYWChZCNi4mKioyPkI6QkJCOjY6OjY+RkZCPjoyJh4WFh4yPj42Mi4mJi4yPkpORkI+OjY2RkpCPKysrKysrKioqKioqKSkpKSkpKSgnJycnKCgnKCgoKCgoKCgoKCgoKCcoKCgoKCkpKSkoKCgoKCgoKCgnJiYoKCcnJycmJiYmJyclJSUlJiYmJiYmJiYmJiYmJiYlJSUlJSUlJSYmJSUlJSYmJiYmJiYnKCgoKSgpKiorKy0tLS0uLi0tLS0uLS0tLS0tLS0tLCsqKioqKikpKSgoKCgoKCgoJiYmJiUkIyMjIiIiISEgICAgICAgICEiISEiIiMkJCcwQlxubG1xe3t0cXJ2eHh5d29mXFJEQm6Fj3hrgHh4eXFWRkhRYmhqbWZiVVROREtISEVGSkU+ODg3O0JBRl5aSoiMcGF+dHBuYVRLSEE7PkpQVnmDfXl0cXFxc3NvaGVfW1pXWVphYVdISXF1cG9pZmt3gnV8h1tPVk4/PEx2jpqaj29fhouMinNOY2VlenqOhndtZ2JdYmZlaoKjoJKHeGxlaF5IQj07R1pndn+JjoV7YDwsLDNHaXZuWVhmgIuNg4VxbG1lVT4pKiwsKiooJyYlJSQjJCQjIiQmJSYsOkJFRURHR0I9NSkmJiYmJigpJyovMzpEREpXZGBaVkZAO0BMV1haXD5CW1QyOGZRTl1pcnBtaGJcWFZUVFVXV1dXV1VUUU5KRUFAQEFDRkpNUVRYWVpbXF1gY2htcnp8fn+Ag4WFiouLiIeIh4SFhISEhIODhIaGh4qKi4qKiIeEgX14c3FwcXBtbGpnYV1aW2BkanF4fYGGi4uLi4iGhoWFhYWFhYWFgo6Si4eLjY6Pj5COjo+PjY2Mi4+QkI6NjIiGg4GAgoiNjY2Mi4yJioqNkZSTj4+OjIyPkJGPjisrKysrKyoqKioqKikpKSkpKSkoJycnJygoJygoKCgoKCgoKCgoKCgoKCgoKCkpKSkpKSgoKCgoKCgoKCkpKCgoKCcnJiYmJicnJyUmJicnJycnJycnJycmJiYmJiYlJSUlJSUmJiUlJSUmJiYmJiYmJygoKCkoKSoqKyssLCwsLi4tLS0tLi0tLS0tLS0tLSwrKiopKSkpKSgnJycnJycnJyYmJSUkIyMjIiIiIiEgICAfHyAgICAhIiEhISIjJCUsPFZxcGhudHl0bW1wcnN3eHZuYlZNPTpohodycndyd3lrTkNIVWdpbHZkV0dER0FKUEtLSkpER0E+OztARj9PXTpre4WIh4R+dGNUTUlFQUBGSlFygnp2c3JvbnBybmllX1tZT05UYF5SRjJHam1uamhobnaAfGNAS05ORUhvkJ2inpBqXG+Fi4Z5NTFMd5OQiYB3a2ReW15jXGaZn5aHfG9cYWxcRkJARE1XYWtxd3Z1blU4Ky07Umh0fndkXmR4hoaEhHtpX1M0JiktLCopJycmJSUkJCQkIyIiIyQoLzpCREM/Ojg3NjAnJycmJygoJycqMTY6PThHUVhbWVZPSUtDTFlaUlBGNlFcTVZqWUpZcnNwbmhiXFhWVFRUU1ZWVVVUU1BMSkVBQD9AQkVKTVFUWFlYWlpcXmFlanF3fX5/gIOFhoiLi4qJh4aEhYSEhISDg4SGhoeKi4uKiYeHhIB8dnNxcXFwbWxqZ2FdWl1hZmtze4CDiYuLi4uIhoaFhYWFhYaGhoqPi4uKjI6OjY6PjY2NjYyMj46NjYuJhYKAfHl7foKJjY6OjIuKioqLj5OTko2OjYuNkpGRj44sLCsrKysrKioqKioqKikpKSkpKCcoKSgnJygoJycpKSkpKCgpKSgoKCgoKCkpKSkpKSoqKSgoKCgpKigoKCkpKSgnJycmJycnJycnJycoKCcnJycnJycnJycnJyYmJycmJiYmJiYmJiUlJSUlJScnJycoKCgoKSkqKysrKyssLC0tLS0tLS0tLS0tLSwsKysrKioqKSkpKSkoJycnJyYmJiYmJSMjJCMiIiIhIiIhISEhICAhISEhISEhISMjIyYpN09tcmlrcXZzbGlqa29xdnd0a2NWSz87apCLdHlycHh3YktIUGFnX2BoV0pGRElDSE5LTEtNRUNCQD4/PkVAQUpEOjx3jYeEfXJiVU1GRENDQkZMZ4R3dXNxbmxub25nYltYW1NOTkNMT0k5LEZqamZqaGpvd3pHPEJJSUdtk6Kjo6GNc2FdgY6Gh0MrPYCYjYR7d2hfXFlYWlN1oZiNgHBbUFlcTTs6QklSV1thZGZqa2FNNyw3SVxpbnZ+dmp5jJCFen99a1xKLCUoKioqKCcmJSQlJSQjIyMiIiIhJi83Ojw/Pj09OzgxKCcnJygoJygmKjE7PTc5QkdJW15bXEdGQURLS0lWYFJAWVJjbl5KXHN0cG1nYlxXVVRTVFRUVFRUU1JOS0dDQD8/QEFFSUxQVFdYWVpaWlxeYmdudHh9foCDhoiJi4uKiYeGhIWEhIODg4OEhYiIi4uLioqIh4SAfHZycXBwcG9samdhXVpcYGhudXuAhYiLi4qJhoaFhYWFhYWEhoqQjYyMjo6MjIuLjI2NjI2NjIqKiIaCfnx5eXh5fICFi46PjY2MioqMjpOTko+PjYuLj5CRj42OLCwsLCwsLCsqKioqKiopKSkpKSgnKCkoJycoKCgoKSkpKSgoKSkoKCgoKCkpKSkpKSkqKioqKSkoKSooKCgpKSknJycnJicnJycnJycnKCgnJygoKCgoKCcnJycmJicnJiYmJiYmJiYlJSUlJSUnJycnKCgoKCkpKisrKysrLCwtLS0tLS0tLS0tLS0sLCsrKyoqKikpKSkpKCcnJycmJiYmJiUjIyMjIiIhISEhISAhISEhISEhISEhISEjIiMpMEZmdG1rcHRzbWtoaWptcHN1cmtjVko+NmaXkn9+cXV4elxDSFFla19dX1BERklMR01RT01KSkRCQUBBP0BCRENDRkBuhImHg3prWU5LRUNCQkFER1+FeHZ0cW5qaWtqZ2FeWlZQRz42Mzs9ODY3Vm1nZ2ZmZ293cUY6NztfjKOmpKaeh3VgZXmMholLMUCEl4eDenNiWlhWVk5UiJuShHlqT05ZUDsxOUJLUVdZXF9jZmVcSjYwPVFjaWtrdXx+mZySgnp8d2RUPiomJykpKignJiUkJSUkIyMjIiIiIyozOj0/QT4+OzYzMCsmJycoKCgoJiktMjMxOTw6RFVbUldcRD9EUVRVXmldTGJ3eH5nRFhrdG9tZmJcV1VTUlNTVFRUVFNSTktFQ0A/P0BBRUlMUFRWV1hZWVlZXGBka3F4fX6Ag4aIiYuLiIeHhYSFhISDg4ODhIWIiYuLi4qKiISBf3t1cnFwcW9ua2hlYFxbXmNpbXZ9gYeJi4uKh4aGhYWFhYWFhYeNjo+Pjo6Mi4mJiYqKi42Ni4uIhH98eXh4d3d4e32BiI2Pjo2NjYuLjZCTko2NjIuLjZGSkI6MiyoqKioqKioqKioqKioqKSgpKSkpKCgoKCkpKSkpKSkpKSkpKSkpKSkpKSoqKioqKisrKiosLCwrKioqKikpKSkpKSgoKCgoKCcnJycpKSkpKSkpKSgoJycoKCcnJycoKCYmJycnJyYmJiYmJiYmJycnJykpKSoqKikqLCwsLCwsLCwsLC4uLS0sLCwsLCsqKikpKSkpKSgoKCcmJiYmJiYlJSUkIyMiIiIhISEgICAgISEgICAgISEhICIkIyQoL0JecW1qb3R0bGhmZGFkaW50c3NrYlVIODFVlJGEdm5zem1bSEtTZGFcXVpMREpPTk5PUlNSS0dHRUZJTEE8PkA/Q0VEV4eHhoByZ1VKR0NCQUJAPkBch3lzb3Bva2hoaGVhXVlUUEg5MTE1NTU1NjxpbGlnY2VobX1YMDJBc5iipaeklYVtXHZxf4KCYDc+d5GHfXNoVlJVVFRNcZuWhXluXk9aYVQ1NDtHTlRYXF5hYmNgWUY5P0taZGdmZ2xwaJOZj4J5c2leVD8sKCkpKCkpJyUlJCMjIyMjIiIhIyUwOTw9Pj9APDgzMS8qJycoKCgoJiYoLS4xMzQ3OjxKWlpKU09DPUBJSExQTFptd25pZEVXbXV1bmljW1hTUlFQUFNUU1NSUU9KRUI+PT5AQkZJTU5SVVZXWFhXV1hdYmhudXp8gYKFh4mJioiHh4WFhISDg4ODg4WGiImKi4uJiYeHhIB7dXJxcHBvbGpmY19cXV9jaXF4fYKHioyMiomHh4WFhYWFhYWNjo6Pj46Ni4mIiIaJioqJiYiDfXl2dnV2dnd5e3t/g4qOkI6OjY2Mi42SkpGOi4uLio+Sk5GOjIsqKioqKioqKioqKioqKikoKCgpKSgoKCgpKSkpKSkpKSkpKSkpKSkpKSkqKiorKiorKy0tLCwsKyoqKysqKSkpKSkoKCgoKCgoKCgoKSkpKSkpKSkoKCgoKCgoKCcnJycnJycnJycmJiYmJiYmJicnJycoKCoqKioqKywsLCwsLCwsLCwtLSwsLCssLCwrKiopKSkpKSkpKSgnJiYmJiYmJSUlJCQkIiIiISEhICAgICEhICAgICEhICIoNSUmLT9XcnRsbnR1bmllYl9cX2luc3dxamFURzYtSpCShHRycnZhT0pMT11ZU1JPQ0ZNT05LTFBZW1BISElGSExQTkJBQEBDREGAiIV9bl9RSUNBPjs9PDk7VIV9cW9wbmhmZ2VjX1xWVVBENTMzMTEzMzU2TXBsaGZlY2x0dD4sT36YoKOimIp9Y1p3YHZ/fHI6Nm+Qf3NrWE5PUlJRV4aWh3dtY1hUVlpVQj9ES1JXW11fYGNhWlJIRUxSXGJkZ2tweYCZjn1zbmdfWlVALConKCgpKSclJSQjIyMjISIiISMsNzw9Pj9APzw4NTMwKygnKCgoKCcnJisuMTM1NTU3O0NNT0JGVVo+QU9cVFZZXGJNU1xKUml2d3BsZV9XUlBQUVBRU1NTUlFOSERBPj0+QEFFSU1PU1VWV1dXVlZXW19mbXJ3fYGDhoeJiYqIh4aGhYSEg4ODg4OFhoeIioqLiYmHh4R/eXRycXBwb2xqZmNfXF1gZmtyeX6Ch4qLi4mHh4eFhYWFhIKLkpGRj4+OjIuJiIiGiIqJhoN9eHd0dXZ3d3d4ent7gIWKjpCOjo2Ni4yRkY+NjImKiouQlJOQjYyLKioqKisrKioqKioqKSkoJycoKSkpKCkpKSkpKSkpKSkoKCkpKiorKyorKysrKywsKyssLCwsLCwsLCwsKikpKSkpKCgpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKCcnJycnJycnJiYmJiYmJiYnJycnKCgoKSsrKiosLCwsLCwsLCwsLCwsLCwrLS0rKyopKSkpKSgoKCgnJiUlJSUlJSQkJCMlJSIiIiEgIB8fICAhISAgICAhISAgIiUoLD5Wb3VucXN2b2plYV1XVl1pcXZ2cmtgU0Y1OFuJj3xwcnNsXFFGR1BUTERBQ0RHTUtLSkxOXVxPRkRCQUBAUlZEPUE+RD4+aYeBdm1kW1REOzg4ODc3OUJ+fnJsbGpoZGNfWFZXVlJMPC4uMS8uLzAyNzVkcmphYGNnaXNfOV58j5mblIqBbk5SXkNhf3ZzRzdyjXhsYUdHR01OTmSDiHdoXk9SVFBMU1VQU1ZZXF5fX2JkYmBSSk5XXWBkbG9scI+ZjnxvaWViW1lTPSsoJicnKCYmJSUkIyMjJCIhISImMTs9PT9AQUA+Ozg2NC0mJCYmJyclJCYoLC8wMjU2Nzc3PElGRktQR0NGTk1VZGJaVFZWT0VJZXpxbGZeWFJQUFFPUVFRUVJRTEhDQD49PkBER0pNT1NVVlZWVVRVVlldY2pwdnyAgYeIioqJiIeGhYWEhYSDg4ODhYaIiIuKioqMioeDfnhycHFxcG5samViXl1dYWhudHp/hIiKiomIhoaGhoaEhISHkJKSkY+OjIuKiYmJhoiFgn16d3d2dXd3d3h5eXp7fICGi46Pjo6NjY2OkZCPjIqKiYuPkpWTj42NjCoqKiorKyoqKioqKikpKCcnKCkpKSkpKSkpKSkpKSkpKCgpKSoqKysrKysrKyssLCsrLCwsLCwsLCwsLCopKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkoKCcnJycnJyYmJiYmJiYmJycnJygoKCkqKikrLCwsLCwsLCwsLCwsLCwsKysrKysqKSkpKSkoKCgoJiYlJSUlJSUkJCQjJCQiIiIhICAfHyAgICAgICAgISEgIiInLTxWcHVubnN3cGlmYlxUUFBea3J4dm9nXVBENTZNd4Z0bXBzXkxURURMSEVBP0RFR0ZJSUlJUFZWT0VFRj8+PTs5RD8/Pj1BQEqBgHRsZ2RUQTs2NzY0NDY4Yn5zbWpnZWNfXFFMTk1JRTYqKi8uLC4vMDE4T29qZWRjYWJmcFtje4qQjIR6bVJGRkNCV351cFU6dop0a1xCRUdMS1JrdnVpXlRTVFZYQzxQWllbWl1gYmNkZmViVlBeZ2lnbHhsXXeTkHxuZ2FfXVZVUj8rKCgnKCcmJiUlJCMjJCMiISEhKTU8Pj4/QEFAPz08ODUrJCIjIyQkIyMlJiouMTAzNzk8Ozo5ODg5Q01MTFFbVVhfYVdFSV9kS09xdG1kXVhTUVBPUVFRUVFQT0xIQ0A+PT9BQ0ZJTk9TVFVWVlVUVFVXXGJrcHd8gIOHiYqKiYiHh4aFhISEg4ODg4WGiIiJi4qKi4qIgH13cnBxcXBubGpkYV5dXmJpcXV7gISIioqJiIaGhYWFhISFj5GQkpCPjouKiIiIiYiCf3x3d3Z2dXZ2d3d3eHh6e32Dh4yOj46OjY2Mj5GOjYqJiYqMkZOVk4+NjYwqKioqKioqKikpKikpKSknKCkpKSkpKSkpKSkpKioqKikpKiopKSoqKywqLCsrLCwsLC0tLS0uLiwsLC0rKisrKiorKyoqKiopKSoqKysqKioqKSkpKSkpKSkpKSkpKSknJycnJycnJycnJycnJygoKSkoKCkpKioqKysrKystLSwsLCwsLCwsKysqKSoqKikpKSgoKCcoKCYlJSUlJSUlJCQkIyIiIiIiIR8hHx8fHx8fICAgICEhICMnKTlUb3ZwbnN3c2tlYVpUTUpPXWlvdHNtZVtOQzc1SV2Ba2ZocVNFR0M9QkVHQ0JERUhGR0lJSUtRUU5GQEJCQ0VEPjtCPT0+P0A6bXtya2ZjTUBEPTQxMTIzNTtycmllZWViYFpRS05PS0U2LSoqLS0uLy8uN0BpbmlmYmBcYGppaXeEhn94bFQ+RkJBS1h9eGpiQnqGdGZXQEJISkxWZGdlXFRTVFZWRTQuOFZnYGBfY2VkZGdnZ1xfaW1scntyXmCCiHxsZV9dXFdRUE4+KyUmJycnJyYlJSUkJCQhIiEiJjE6PT9AQEBDQkA/Pjs0LCQiIiIkJCIiJCUnKi4vMTU6PT09NzEuKy42SFZYUFJZWWlpTEliYlpMbXVrY1xYWFpST1BQUFFRUU5KRkE+PT5AQ0NGSk1QUlNSVVdUU1NVV1tianB2fH+Ch4mLiYiIh4eGhYSFhYODg4SGh4qLjI2LiouJhYB7dHJwcHBwbmxqY2BdXV9laXB1fIOGiIqLiYiGhISFhYSEipGTkpGOjouJiYmIh4mEenl5d3d3d3Z3d3d3dnh5ent/hImNjpCPjY6NjZCOi4uJiYaJjpWWlJKOjI2LKSkqKioqKiopKSkpKSkpKCkpKSkpKSkpKSkpKSoqKioqKisrKiorKyssKysrKywtLS0tLS0tLS0sLC0sLCsrKysrKysrKyoqKiorKysrKysrKyoqKSkqKikpKSkpKSkpKCgoKCcnJycnJycnJycoKCkpKCgpKSkpKisrKywsLS0tLSwsLCwsLCsrKikpKSkpKiooKCgnJiYmJSUlJSUmJCQkIyMiIiIiIiEgIB8fICAfHyAgICAhISMlKzdWcHlvbHF2dm9nYVxVTURFT11nbnFza2JXSj40MjRgfmhnbW9KRkM+OkBDR0VEREVER0hISUlGS09RVFhkbm5xb2tjVVJVX1A3OVd4cWpnX09CQDkzMjEyMzEySHJqY2JhX15ZUUxJTU5NRzsuKi4xLy4vMjM3Sm9uaV9cW11ibXN3e3x1a1xBP0JETVNgcm5fX011hHNlU0FHSUpNWl1aWFZUU1VSQDAuNENfam1ua2dnZmdpaWVja29ydHpnW1dgentsY11ZWFlSUE1KOyomJSYoJycmJSUlJCMiIiIhIy05PD5BQUBAQkBAPz47NSgiIyMjIyQjIyQlJSUoKi4xMzc5ODYyLCsrLjxSYFpbX2FsZmFQSUZTSmZybmVcV19eXllPUFBQUE5LSERBPj0+QENGSUxOUVFRUVNUU1FRVFhcY2txeH6Ag4eKioqJiIeGhYWEhISDg4OEhoeKi4uMi4qKiYSAenRxcHBwcG5raWNgXV1gZmxzdnyDh4qMi4qIhoWFhYWDh4yOkpKPjouHh4eIiYeAfXl4eXh4d3d2d3d3eHh4enp7f4SIjY+Pjo6NjpCRjIqJiIeJjJOWlpOQjoyLiygoKSkpKSkpKCgoKCkpKSkpKSkpKSkpKSkpKSkqKioqKysrKysrKysrKyssLCwsLS0uLi4tLS0tLS0uLiwsLCwrKysrKysqKisrKysqKiwsLCwrKioqKysqKSoqKSkpKSgoKCgoKCcnJycnJycnKCgpKSoqKSkqKioqKyssLCwsLS0sLCwsLCwqKisqKiopKSkqKSkpJiUlJiUkJCMjJSUkIiEiIyMiIiEhIR8gICAgICAgICEhICEjJzVRbnhybnB1dXNsY11WTEE9RFBdZm9ycGleV0o8NDExZnxraG9rRUU/OTk9QkVGRkVFREZJRUNGQ0NMaYKQlZqQhnh2d2lVX3F5WTc/c25rZVtNPzYyMTExMC4vMTNYa2NgXl1cWFJNSklKTU5ORzkrKi0vLS8zNDNScm1hV1hZXGFtenZwamJNPEA/Ql1gZ2JZWlhSbYFtYE5ISk1MT1JSVFRVU1FNPTMwM0BTZ3F0eHp2b2tpbGxqbXJ5fXJaSVpQV2ZmY15bWFlUTUpIRDUnJCYmJykoJyUlJSQjIiMgIyk3PT49QEBAQEFBQEA/PDMmHyAjIyIjJSQkIyQkJScoKSwtLiorKisqKSstN1BcUlpjZGJhW1xpW0tbc29pX2NbQFZfU09PT01MSEdDQD09PkFCREdMT1FRUVJUUlFQUVNYXGNrc3l9gIOHioqJiIeFhISEg4KCgoKDg4WHiouLi4qKiomFfnlzcHBwcG9tamhjYV1eYmduc3l9g4iKjYuJiIaGhoSEhoyQk5GQjYuJh4WFiop/e3t4eHh4eXl4dnd3d3h4d3d6fIGGiY+Qj46OjZCSkYyKiYiIi46Tl5WSj46Mi4ooKCkpKSkpKSgoKCgpKSkpKSkpKSkpKSkpKSkpKioqKisrKysrKysrKyssLCwsLC4uLi4uLi4tLS0tLS0sLCwsKysrKysrKyssLCwsKyssLCsrKisrKysrKikqKikpKSkoKCgoKCgnJycnJycnJygoKSkqKikpKioqKisrLCwsLCwsLCwsLCwsKiopKSopKSkoKCgoKCYmJiYlJCQjIyUlJCQiIiMjIiIhISEfICAgICAgICAhISMkKDdMa3dtbXN1dnVxaWFaT0E6PURPXmhtbmxmXlVIPDQzPnR2aGduY0FDQDo5P0VDREVEQ0FFSEtGQkJIaI+jqqqhlYt8d3h7aFdngntUL2BvbGVbSz02MjIzMS8uLzEyPGRjX1tZWFZTUExLS0tLT01KQjYxLSstMzErL1pmXlhVXV1fZm93amFZQz08RmFjYmBdWlBUZGR7ZFVHSE1QUVJUVVVVUU9IPzQxMTtOXm13dHJ3eHVycXFxcHJzdHVdR1ZPRFFaXl9bWFVVUkxIRT8yJiQnJycnJyYlJSUkIyMiIygzPD0+P0BAQEBBQUBAPzwyJR8gIyMiIyYmIyMkJCYuKSkmJSYqKiorKisrLC4zRkpbX19YYGRaX1lMVnFyYlpFKTROTkxPT09NTEhFQj89PT5BQkZJTE9RUVJTUlFQUFFTWF9kbHN5fYGEh4qKiYiHhYSFhIOCgoKCg4OGiIqLi4uKiouIg356dHBwcHBvbWlnYmBdXmJobnR5foOHiYyKiYeFhYWFhoqQk5GSj42Li4yKh4uEeXd5enl4eHl4d3d3d3Z3d3d4enyDh42PkJCOjo6Rk46NjImIh4uRlJaSkY+OjIuKKSkqKikpKSkoKCkpKSkpKSkpKSkqKSkpKSkqKioqKiorKysrLCwrKyssLS0tLi0uLy8uLi4uLi4tLi0sLSwtLSwsLCwsLCwsLS0sLCsrLCwsLCsrKysrKysqKysqKioqKSkoKCgoJycoKCgoKSkqKioqKioqKCoqKioqKiwsLCwrLCwsLCwsLCopKCkpKSoqKCcmJiYlJSUlJSUlJSUmJyoqJSQjIiIhIiIhICAgICAiIyAgISElKDBJandtaG50eHRzbmZcU0M3Nj9IUV5ob3BsZ1xRRjo0NlB+cmFibF9BQkE6Nj9FQkJCQ0NAQ0hRSj9IXoqepa2llI6SlIqBgXFaYn2JdztGcmtlWk9ANjIyMjMzLy4xNTU+XmBXVlVUU1JOTE1NS0xMS0tIPC8pLC8tJic0X2JfW1hbXmRlcW5eUj07QF5fVVpaXFdQR1BRa2BQQ0pKTU5SWFxgXVpORTszMTNFWWZwdnVxcHJxbWpsb29ubmxwS09VR0ZRW11cWlZVVE5KRkI6LSMjJCUmJyclJSUlJCMjJCcyOTs8Pj8/QEFBQUFAQD86LyMhICEiIiIjJiMhIiUpKykpKysqKisrKyssKiwvLzFEVm1pZ2ZfZmpYUlZuZ2hgTisxRk9QTk5OTEtHREE+PT0+QUJER01PUFBSUlFQUFBPUllgZ291e36ChYiJiYmIh4WEhIKBgoKBgYOEhomKi4uLi4qJhYJ+eXNvb29vbmxoZGFgX2FkanB2fICEiImLiYeHhYSFhouQkZSSj46OjouMjYyFfHt5enh5eHh3d3h4eHh4eHh3eHt+hIuPkI+Pjo6PkpGNjIuKiomMlJeWk5GOjIyKiigoKSkoKCgoKCgpKSkpKSkpKSkpKikpKSkpKiorKyoqKysrKywsLCwrLC0tLS4uLy8vLi4uLi4uLS4sLC0sLS0sLC0tLS0sLCsrLCwrLCwsLCwsLCwsLCsrKisrKioqKikpKCgoKCcnKCgoKCkpKioqKioqKigqKioqKiosLCwsKywsLCwsLCwqKCkrKSkpKSgmJiYmJSUlJSUlJSUlJiowMCYjIiEiISIiISAgICAgISEhISMlJjFGZHlvZ2tyeHZ2cmphV0o4MDdBSlRgaXBybWVbT0Q4MTxhg3BlZm5aQERAOTY8Q0RBQUNDQkRFSEVLZIOZoKSsp52VmJyPfXZ0aoWPkYZlM3BqZVxSQzIuLCwqKiorLC8wLztWXFdTUFBPTk1MTUtNS0pJSEVANS4xLikkKTpaXmFiY2FdXmhoYUg6QlVaV1tgYVlSTElER05YTUZMUU9PUlVbYV9WTEA5MzA3Sl9rb3R2c25tbGdlaWpnZ19cWkdaTklIUl1eXFpWVVJKRkNANSokJCQkJycmJyYmJiUjIyYwODs7PD9AP0BBQUFBQEA/Oi8jIyUhISIiIiIjIyUnKCoqKisrKiorKysrKysuLzM4QFRiaG1vaWRlVU1XaWplXlxYVU9OTU5OTkxKRkRBPj09PkFCR0pNTlBQUlJQUE9PTlNaYGhwdXt+goWIiYmJiIeFhISCgYKCgYGChYeKiouLi4uKiYWBfXVxb29vb25saGRhYGBiZmxyeH6ChouMioqIh4WEhoqOkpKTkpCNjY6Njo6Nfnl7eXl4eHh4d3d3d3d3d3d3d3l8goeNkJCRkY6OkJWQjYyLioqLkJWXlZKQjoyMioooKCgoKSkoKCkpKSkpKioqKiopKSsqKysqKisrKyssLCwsKyssLCwsLCwuLi0tLy8uLi4uLi4uLi4uLS0uLi4uLCwuLi0tLS0tLSwsLCwsLCwsLCwsLCwsLCwrKyoqKysoKCgoKCgoKCkpKSkpKSkpKiorKyoqKysrKysrKysrLCwsLCwsLCwrKiopKSkpKCgnJiUlJSUlJSQkJCQkJCYmKSglIyIiISEiIiEhISEhISAgISIkKS1AYXVza2tydnh4dG9lXE0+MDE6RFBaYmpxcmljWExDNzFFdYJsZ2pxVkFGPjk5P0NEQ0JCQ0FDRURJYYGXo6aoqqyqoZyZlod2eXqSjo2OfEVkbGZgV09HR0ZFRUZFRkpMV1pUSExSU1JPTk1MS0tLS0tIR0RERD43My4qJyMlPllZV1tcXV1eXWJVSVJZUlRXVlVTTUpHQDQ7RUFESU1MTFFUV1xcVkk8NzAxPVBgbHB0dnRua2hnZmlpZ2VfW05VUkdITVphYV5bVVNNR0RAPTEoJCMjJSUlJiYmJiYkIiIrNTk6PD4+Pz9AQkJBQUBAPzovIyMkIyIiISMjIyIiJSgoKiorKysrKioqKywuMTQ4PUJER1RmZ2dtaU5MXmpqZGBaVExMTk1OTk5NS0dDQD49Pj9BREZJTU1QUFBQUFBOT09VWmJpcXh9f4OFiIiKiIeFg4OCgYCBgYGBg4aIioqKiomIiIiEf3p0cG9vb29ta2dlY2JiY2hudXp+goiMjIqIh4eGhoqQkpKRkI6Pj4+PkY6OgXl5eHl3eHh4eHd4eHd3d3d3d3h6fYSJkJKSkI6OjpOTjYyMi4mIi5GWl5WRj42Li4uKKCgoKCkpKCgpKSkpKisqKioqKiorKisrKyorKywsLCwsLCsrLCwtLS0tLi4tLi8vLi4uLi4uLi4uLi0tLi4uLiwtLCwsLC0tLS0sLCwsLS0uLSwsLCwsLCwsKysrKisrKigoKCgoKCgpKSkpKSkqKioqKysqKisrKysrKysrKywsLCwsLCwsKyoqKSkpKSgoJiYlJSUlJSUlIyQkJCQjIyUkIiMiIiEhIiIhISEhIiIhISMlKDE/W3Zza2txdnZ2dm9mXFFCNC81PkhVXmZucW5nX1VJPTY3VnuCbGZpcVQ/RT45OUJFRURDQ0NCQ0VIWXCLl5qkrKuqrqOhnpyUcoaHf4CIkoZpUWRfXV1cWVlWVFVUU1RUUldXWVtTTk1OS0xLTEtKSUlKSEVFQkE+OjczLSgmJyZDV1BQV1xZV1pgYlVVV1lVVFJQS0dCQj80Mz5IQ0VJSkxPUVVYV1FGPTcyMj5OXWhweHhxa2lpZmZmZ2hnWEQ4Rk1KSFJeYGFcWFVQSERBPTksJSMiIyQkJSYmJiYlIyMmMDg7PD5APz8/QEJCQUFAQD07LyMgICIiISEjIyMiIiUnKioqKioqKioqKisvMDY5Pzw9PD9ES1FfcW1JR1hZX2RlW1NWUU5OTk5OTUxIRT89PT4/QkZIS01NUFBQUE9PTk9RVlxiaXF6fn+DhYiJiYiHhYODgoGAf4GBgYOGiYuLi4qJiIiEgHx1cW5vb29vbGpnZWJjZWZqcXd7gISKjYyKiYiFhYmSk5SRkY+Pjo6Oj46Phnd5fHl5enh4d3d4eHh3d3Z2d3d4en6Fi5KTkpGPj5KVkY2Mi4qHioySlZWVkY+NjIyLiicnKCgoKCgoKSkpKSkpKysrKywsKysrKysqKyssLCwsLCwsLC0tLS0uLi0tLy8vLy8vLi4uLi4uLi4uLi4uLi4uLi4uLS0tLS4uLS0tLSwsLS0tLS0tKyssLCsrKiosLCsqKiopKSkpKiopKSkpKioqKioqKioqKisrKysrKysrLCwsLCsqKiopKSgoJycnJyYlJSUlJSQkJCQkJCQkJCQmJCMjIyMiISIiISEhISIiIyIlKTE9WHNxamxwcnJzcm1kWU5DNS8wN0JNVmJpb3BrZVtPQzc1QmV+f2xoZmxPQENAODdCR0VDQ0VGQ0BATmuBkJaWnqeqqqyio6Okoox9g4mLlJqKelJZWFdVVE9PUFBPT09PUFBSVltbVVBJSUZFRUZFRUZISEhIRUE/Pjo4NTMsJyYoLlBaVVNVVFNVWV1iV1JSTlBOS0ZBPT9BNy4zPUFBREZLTU5SV1lRRjo4MzQ+S1dlbHJzbGhoZ2ZmZmdoaWNONkBGRUlYXl5cWFVTS0VCPzs1KSMjIyMjIyQlJSQkIyMjKTI5PT4/QEA/P0BBQEBAPz8+Oi4jISEiIiEhIiIiIiIkJisrKykqKioqKiosMDQ2NjY2ODk8Q0ZFSFVURkdcUl1lZltXXFNNTk1OTk1LR0Q/PT0/QERHSEtNTU5OTk9QT09QUVZfY2tyd31/g4WIioiIhYSCgoCAgH6BgIGEh4qMjYuKiYiHhIB5dHBvcHBubmtpZ2VlY2dobHN4fYOHi42NjIqFhoeOkpOSkI+NjY6Oj46OjHpzenp4eXl5eXh4d3d3d3d4enl3d3uBh46Tk5KQkJCVlZCNjIuJiIqQk5eVlJCPjY2NjIknJygoKCgoKCkpKSkpKSsrKyssLCwsLCwsLC0tLS0tLSwsLS0tLS0tLi4uLi8vLy8uLi4uLi4uLi4uLi4uLi4uLi4uLi0tLS0uLi0tLS0uLi0tLS0tLSwsLCwsLCsrLCwrKioqKSkpKSoqKSkpKSoqKioqKioqKiorKysrKysrKywsKysqKioqKSkoKCcnJyclJSUlJSUkJCQkJCQkJCQkJSQjIyMjIiEiIiEhISEhISIjJy03UG92amtucHJycWdgVkw/MiwuMjxHUltmbW9vaWBYSz8yMUlxfX9sZ2psTEBDQzo4QERFREVHR0M/Q159jJWYkpWao66wrrCuqauSdHaOo6GjloNgUVVTUlFRUVFRUlJRUVBQUVNUU1ZRTUtHRUNCQEFAP0NDQkJAPj46OTYzMColJyoyUl9YUFJVUlBUYVtESUNFRkVCPjw+PjUvLC06QEFFSkxNTk5QT0M5NzQzOkhVXmdsbWxpaGZmZmVfWFZMT1VMQ0ZPWl5cWlZTT0hDPjw5MyckIyMjIyMkJSUkJCMjIykzOj0+P0BAQD9AQEBAQD8/PjouIyEhIiIhISIiIiIhIiQoKiopKioqKioqLC8zNDQ0NTY5QEdJSUlNQ0BBVWhvbmZiY2dTTE1NTk1MSkZDQD8/QEFER0hLTU1OTk9QUlRUVFdZX2ZrdHp9f4OHiYqIiIWEgoKAgIB+gYCBhYiNj42MiomIhoN/eXRwb29vbm5samdlZGVoaW92e3+Dh4uNi4mJh4aLlJGSkZGOjo2Ojo2Oj4FzeHt7eXl5eHh4eHd3d3d3d3d4eHl8goiOkpOSkY6QlJGNjIqKiImMkpWXlZSQj42MjYuKJycoKCgoKCkpKSoqKysrKysrLCwsLCwsKy0tLS0tLS0tLS0tLi4uLi4uLy8vLzAwLy8uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4tLS0tLS0sLCwsLCwsLCwsKyoqKikpKioqKioqKiorKyoqKiorKyoqKysrKysrKyssKyoqKioqKikpJycmJiYmJiYkJCQkJCQkJSQkJCMkJCQlIyIiIiMiIiIiISEhIyMlKCo3S2p5cGlsbXBwbWVcUUQ5MSsrLjhAS1ZhanBwbGVcUUc7MzVZe3l/bGdrblFARUM8Nz9ERUVGSEdCP05vhY+VmJCJj6Gvubq7uKqnknyQk5iinp+Nc01VWFhWV1ZTUlNTUlBSUlVVVVVXUE5KSEZGRUVDQkJBQUFBQD4+PDs6NjMuKSgrKjVUXVtYU1FPUlthSjs/P0NCPzs4ODczLy0tOURJS0xOUE9PUU8/NjUyLjVEUVdZXWRpaGtrZmdpXE9XOExZS0dOWV1cWlZTUUtEQDw6OTEmIyMjIyQiIyQkIyMjIyIpND0/Pz8/QEFAQUFAQEBAQD88LSMhICIiIiIiIiIiISIjJycpKisqKykpKystMTAyNDc5NjY5PUBFRD9DRkFLZmdgX1xaVU5NTk5NTEpGQ0E/P0FCRUhJSkxMTk5QUlZXWlpdYWFlbXR7foCEh4mKiYaEg4OCgYB/foGBgoeLjo+Pi4qJiIaBfHdyb25tbW5tamhnZGVmamxwd32Ag4iLjoyKh4eKkJORkJCOjY6NjY2Ni4h6dXh8fXp5eHh4eHd3d3d3dnV1eHh5foOKkJSTkY+Ok5aPjIuLiIiKjpKVlpSTjo2NjY2LiicnKCgoKCgpKSkqKisrKysrKywsLCwsLCwuLi4tLS0tLS0tLS4uLi4uLy8vLy8vLy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLS0uLi4tLCwsLCwsLCwsLCsqKioqKioqKioqKioqKysqKioqKioqKisrKysrKysrLCsqKioqKiopKCcnJiYmJiYmJSUkJCQkJCUkJCQjJCQkJCMiIiIjIiEhIiEiIiMjJy43RWZ5cmtrbm1sa2NYSz80LCkpLTM6R1BbZm1xcGtiWE1BNTE2Xnt5fm1laW5gP0NDPjg+RUVFRklIREhhd4mMkJSSg4uksbm7vLqyr6mqrK6doKCll39cWFhYVlRUVFBRUVFQUFFTVVhZWVRQTUZGRUVEREVEQ0NAQEFAPj49Ozs5NTAtKywuN1VVV1dSUVBUWlVCOzs+Pj07ODc1MS8vMj5ITE1NTlBQT1FVRygvMC4yPEVPU1ZeYmJlZ2loa2lkX1FRVE9PV1pbWFdUT0pEQD87OTUtJSIiJCMiIyMkJCMjIyMiKTY+QUBBQUFBQUJBQEBAQEBAPi8jISAiIiIiIiIiIiEiIyMkJCgpKCkqKisrLC8xMzU2NTM2Njg9Pz5DQ0M9SV9mZlxaVFVPTE5OTUxKRkNBP0BCQ0VISkxMTE9PUlVZWl9hZWdnbHB3e36AhIeJh4eGhIODgoGAf36BgYSIjY+PjoyKiYaDf3l0cG5ubW1ubWpoZmVmZ2ptdHl+goaJjo6MioeIjpORkY+OjYyNjYuLi4qAdXR6fHt7enh4eHh3d3d3d3Z2dnh4eX6FjJKUk5GPkJORjYuMioiIi5CUlZaUko+NjY2Ni4ooKCkpKiopKSkqKioqKiorKysrLS0tLS0tLS0tLi4uLi4uLS0vLi4uLi4uMC8vLy8uLi4vLi4uLi4uLi4uLi4uLy8vLy8vLy4vLy8vLy8vLy0uLy4uLi4uLSwsLCwsKyssLCwsKysrKysrKysqKioqKioqKiorLCwsLCsrKioqKysrKysqKikpKCcnJyYmJSUkJCUlJSUlJSUlJCQkJCQkJCQjIyMjIyMjIyIiIiMkJysxPVp4cmpqcXBwaF1USDgtKCUmKS01P0lUXmZub21lXVJGOzIwPmd3dn9rYmVsdks/REA6OkVEREZHRkxgdH+NiIaOkYSRo7G1trq7trm7uru6rqadop6KalpWUlJRU1NUUFBOTU1SVFJUVVVTUU5LSEZFRENEQ0NDQkJCQUBAPj09PTk4NDEuLi5BV1ZRUFFQT01VVjs1Ozw9Ojg0MzIwMTlHTU5NTk5OTk5RU1NHPSkoLzU7Q0pNVltfYmRmZ2ZjYWJVVlRLUFlbW1lVUU1FQTw7OjYwJyQkJCQkJCMjIiMiIiIiIycyPkFDQ0JAPz9AQkFBQUFAPz0zJSEgICIhISEhISEhISEhIiIiJikpKiorKyorLzEzMjQ0Njg7Ozo5PT1CR01SW2ZiYVxWUFRRTk5NSkZCQEBCQkNGSUtNTE1NUVVaXGBla29wcHB0d32Af4OHiYmIhoSEgoGBgICBgYSHio2Pj4yMi4eEf3t3cm9ubW1tbGtqZ2ZmZ2lscXd7gIKFio6OiomIjJKTk5KQjo6OjoyJh4uIeXd4e319enl4eHd3d3d3d3d3d3d3eHqAh4+Sk5KRj5OTjYuIi4qIiYyRk5WWk5CPj46Mi4uJKCgpKSoqKSkqKioqKysrKywtLS0tLi0tLS0tLS4uLi4uLi4uLy4uLi8vLi8vLy8vLi4vLS4uLi4uLi4uLi4uLi8vLy8vLy8uLi4uLi4uLi4tLi8uLi4uLi0sLCwsLCsrLCwsLCsrKysrKysrKioqKioqKioqKywsLCwrKyoqKysrKysrKiopKSgnJycmJiUlJCQlJSUlJSUlJSQkJCQkJCQkIyMjIyMjIyMiIiIiJSgtOE1yeHBtcXRyaV9TRjUpJyUlJikwOUNOV2JrcG1oYFlPQDIvMENteHiBbWNjbnpyPUE/OjhBQ0JFQUdfdoOAkI6HjpSTmaCkr66wuby8ubOwtbS1qamhj3dVVFllc3l5eXl1bV5OTExOTk9SUlBOS0hGRURFQ0NDQ0JCQUBAQD8+PT06OTg2My4uLEBTUE9OTktLTVFSOjY5Ojg2NTIyMDI9S1BPTk5OTk5OUFVVVFQ5Mjk6Oz1BRlJXWltfYmBhX1xfWVNOS09YWllYU1BKPzw5NzUwKiUkJCQkJCQjIyMjIyMiIiMmLztAQUNCQD9AQUFBQkJBQD88NSkhISEhISEhISEhISEhISIiIiQmKCoqKCgpKiwvMDEyNDU0Nzc1NTY5OTtCSlNibGJaUlBPU1BNTUpGQ0FDQ0NESEpMTUxOT1JVW2Fma3J2d3h4eHl9gICEh4mJh4aEgoCBgYCAgYKEh4qNjo2MioeEgXt5c29tbW1tbWxraWZnZ2dpbXJ4fIGFiIuNjYqIiZCSkpCPj42Ojo6Lh4eMf3l5e3x8fHp5eHh3d3d3d3d3d3d3d3h7goePk5SSkZGTkYyLi4qIiIuPk5WVlZKQj4+OjIuKiCkpKSkqKioqKiorKysrKywsLS0tLS4tLi4uLi4uLi4uLi4uLi8uLzAvLzAwLy8vLy8vLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLSwsLCwsLCwrKysrKysrKioqKiorKysrLCwsLCwsKysqKysrKysrKioqKiopJyYmJiYlJSQkJSUlJSUlJSUkJCQkJCQjIyMjIyMjIyMjIyIjJCcrNEdpdm5qcXZ2bmNWRjUnJCQkJSYpMTpFUFpkbHBrZl1SRzouLTRVc3h4f2xjYWh3flU6QDc2P0FDREFRdYaMhpKVk5aWk5eam6WmrLm+vLOzsrOxrKSoppSAXmJ0fn59fHt4eHV0a2BZWFdVUlJPTEpHREVGRkREREJDQUA/P0A+PTw7Ojk4NzU0Li0vP09MTUxKSUdJUEw2Njk2NTMxMC81Q01SUk5PTU1MTE1QU1dcVkY7OTw7PUBJUFZXWlpaWVtaWVVQTExTWFpWUk5MQzk4NDAsKCUkJCQkJCQkJCQkIyMjIiIjJCs4QEFCQ0JBQUFAQEFBPj8/PDcqISIiISEhISEiIiIiIiIjIyIiJCYrKikqKikqKioqLzIyNDQwMTAvNTc8QEVKW2ZqYVlUT1BQTkxLR0NBQkFFRklLTE1NTU5RVV1haXB4fH19e3p6fn+ChoaIiIeHhIOBgIGAgIGDhoiLjY6Mi4mGgn55dG9tbW1sbW1ramloZ2hoam50eX6BhoqNj4yKiY2SkZCPjouNjY2LiIaJiHl5eXx9e3t6eXh4dnZ3d3d3d3d2dnZ5fYOHkJOTkZCRk5CMjYqKiIiNkJSVk5WRkI+NjI2MiYgpKSkpKioqKisrKysrLCwsLS4uLi4uLi4uLi4uLi4uLi4uLi4uLzAwLy8wMC8vLy8vLy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4vLy4uLi4uLi4uLi4uLi4uLi4uLi0sLCwsLCwsKysrKysrKyoqKioqKysrKywsLCwsLCsrKysrKysrKyoqKioqKScmJiYmJSUkJCUlJSUlJSUlJCQkJCQkIyMjIyMjIyMjJCMiIyUoMD1eeXNpbnZ2cWdaTDYoJCMkJCUmKzM7RlFbZW5uamFaTUEzLS04XHh3c35wYWNodIB1QD06NTxAQUNMZoaPkJSWlpiZkoSMkZGaoKSytre0sa+srZ+ZlpaUjW50e3p2d3Z3dHNzc3Rxb21qaGRiXVlUUk5MRUREQkFCQUBBQUA/PT08Ozo5ODc1NDMwLS1ATUdHRkZGRktRRjY4NjUzMC8vOElRU1NRT01NS0tMTFBSWVdYTDs2OTw9Q0pNUlRWVFRUVVZRTU1TWFlWU09MSUI4MS8rJSMkJCQkJCQlJSQkJSMiJCIiIyMmMj0/QEFBQ0NBPz1AQkJAPz44LCIiIiIhISEhIiIiIiIiIyMiIiQkKykqKywqKCgoKzAvLzAtKioxNDAzODc5Pk9XYVdRWllRUE1LSUZDQEBDRUVITE1LTU1MT1RbY2pzen+BgoB+fn5/gYSGiImGhoODgYCBgICDhoeJio2Oi4uIhYJ7d3JubW1tbGxsa2poaGdoaGpvdXp9gYaKjYyLiYqPkpGPjo2Njo2LiIaGjIZ6eHp7fXt6enh3d3Z2dnZ3d3d3dnZ2eX2DiI+TkZCQk5OQjIyNiYeHjJKUlJWTkZCPj46Mi4mIKSkpKSoqKisrKyssLCwsLC0uLi4uLi4uLy8vLy4uLi4tLS8vMDAwMDAwLy8vLy8vLi4uLi4uLi4uLi4uLi4uLi8vLS0wMC8vLy8vLy8vLi4uLi8vLy4uLi4uLi4tLC0tLS0sLCsrKiwrKysrLCwsLCwsLCwsLCwsLCwrLCwsLCwrKysrKioqKSopJiYmJiUlJCQkJCQkJSUkJCQkJCQjIyMjIyMjIyMjJCQjIyUpLDZOc3dsanJ1cWtfTzoqJCEiIiMkJyszPUhSXmRramVdUkg9MSw1SGt9f32Ac2JjaHSAf2U1OTY4P0NCW3yQk5GZnpiUnJSHio+RmKSjqauvs7Spo52PkZCMho90Z3R1dXRycXJvb25ubmxsaWZiYF9fXlxcXFhVVFFNSkhFQT09Pj09PTw6OTg3NjUyMTAuLjxLSEVGQ0JCR1JBNjg3MjExMT1MVFdXU1FQT0tLS0tNUVJTTlRTRTw9P0BDSE9SVVRPTk5MUFBQUFJSUE5LSUQ+Ni8uKyYlJCQkJCQkJCQkJCQkJCQjIyMjJCs4PkBAQEBCQT4+Pz4/PTw7NSsiISEiIiEiIiIiIiIhISMjIyMkJCcoKCopKSgrLi8sKykqKSkqLTE3PD1DR05XW2FvdGJVT05NS0dEQkBBRUhISUtNTU1NTE9SWmJrdnyAgYOCgH58f4GFh4iGhoSDg4GAgICAhIeIioyNjIuIhoN/eXNvbWtra2xra2tpZ2ZnaGltcXZ7f4GGio2Ni4iNkJKOjY2LjY2MiYWEio2AfHl5e3x7e3l4eHd2dnV1dnZ2dnd3eHp+hIqOkpGPkJOSjo6OjomJio6TlZOUkpGPj42Mi4qIhykpKSkqKisqLCwsLCwsLS0tLi4uLi4vMC8vLy8vLy8vLi4vLzAwMDAwMC8vLy8vLy4uLi4vLy8vLi4uLi4uLi4vLy0tLy8vLy8vLy8vLy4uLi4vLy8uLi4uLi4uLSwtLSwsLCwsLCwsKysrKywsLCwsLCwsLCwsLCwsLCwsLCwsKysrKyoqKikoJyYmJiYlJSQkJCQkJCUlJCQkJCQkIyMkJCQkJCQkJCQkIyQoKzJFa3xva3B0dG5jVUItIyIiIiIjJCctNT1IUl1mampiWE1CNzA1R2l8fn12fXdiZGZwgIJ+SDc3Nj1BSGqKl5qWmKOkm56bkIuMjpiipq2srrGtppyTi4iLi4SIgGtvb3FxcG1ta2pramlpaGRiZWBfX1pZWFhYV1RRU1JTUlJQRz89PTs6Ojk4Nzc2NDIyLi4uPURCQUNCQkRJVD42NjQwMjRCT1NWV1NTUE9MSkpMTE1RU01OVFNMQj9AQkRJTU5NTUpEREVHSEZERENFRkNAOTEsKyknJiUlJCQlJSQkJCQlJSUlJSUlJSMlLDY8Pz8/QD8/P0A+PDo4MyojIiIhISIhIiIiIiIiIiIjIyMjJCQmJycnJiosMDk8MygoJyYnKTE9Q0VNUFFVVllfcIB5XlhOS0xJQUBCQkNGR0lLTU5OTk1OT1VeZ3J7gIGDgoB+f3+BhYeHhoWCgoOBgICCgoaJiouNjIuIh4OAe3dybmxra2tsa2traWdmZ2hpbXF2e3+BhoyLi4qKkZGQjY2MjI2Ni4eDhoyGfHp5enx8fHt5eHd2dnZ1dXZ2dnZ3d3h6foSKjpCPjpGVkI2OjYyIiYyRk5WTlJKRkI2Mi4qJh4YpKSkpKyssLCwsLC0tLS0tLi4uLi4uLzAvLy8vLy8vLzAwMDAwMDAwMDAvLzAwLy8uLi8vLy8uLi4uLi4uLi4uMDAvLy8vLy8vLy4uLi4vLy4uLi4uLi8vLy8uLi4tLS0sLCwsLCwtKysrKyssLCwsLCwsLC0tLCwsLSwsLCwsLCsrKysqKikpKCcnJyYmJSUlJSUlJCQkJCQkJCQkJCEjJCQkJCQkJCQjJCQkKC48YH90bHF2eXFoWk41JCEhIyMhIyUnLjU8R1FbZGllYVZKQTk2P12CiH56dnt7aGJibH6Eg3QxOTU8QE92kZuen6KhpKCcnZmNjI2TnqSlpKGgn56YkYp7dHh1e4ppa2tsbWpraWdnaGZmZGFbVltcWlhaWFRRUFBPTU1NTU5RU1JHQTw7OTo4OTg4NjU1MS8wLzJGR0VFQkRFSVJQNjMzMjE2R1FUVFVVUlJPTUtLS0tLTU1QT05PTEQ2Mjo/QUVGR0hGQkNDQ0I/Q0ZJSkhGQTwwKygnKScnJyYmJSUkJSQlJycmJiYkJCUlJSYqMDc7Pj89P0A/PDg0LSYjISIjISIiICIiIiIiIiIiIiIiIyYmJSYnJycoJyk0Oi8oJiUnJysxO0JFSk5RU1NXWFlqfl1eb1BIR0NAQEBCRUZJS0xMTk5NTk1RV2Ntdn2AgYF+fX1+goeJiYeFhIKCgYGBg4SIiouNjIuIh4aCfXd0cWxra2tra2tramhmZmZnaW1xdnt/goeLi4uLjpGQjo6NjY6MjImEgoqMgXx5eXx8fXt6eHd3dXV1dXV1dnV2dXV4en+FiY2Pj4+SlJCOjo6MiYqOkZSUlJWSj46NjYyKiYiHKSkpKSkqLCwsLS0tLS0uLi4uLi4uLi8xLy8vLy8vLy8wMDAwMDAwMDAwMC8wMDAvLi4vLy8vLi4uLi4uLi4uLi8vLy8vLy8vLy8uLi0vLy8uLi4uLi4vLy8vLi4uLS0tLCwsLCwsLSsrKysrLCwsLCwsLCwtLSwsLS0sLCwsLCwrKysrKiopKSgnJycmJiUlJSUlJSQkJCQkJCQkJCQkJCQkJCQkJCQkJSUkJikzT3l/cXB3fXpwZFRDLSMhIiIjIyQmKCszPEdSXGJmZGBVS0RDTGB7jIZ6d3Z6fGlhYGp8hIOIWisyNj5VepCbnaWmpaeimaCflI2Ojpedn6KfnZyUin91aWJhXG6Hdl9nZ2hoZmVjYmRlYl9fX11aWFpYVlFPTUlJSUtLS0xLS01OTUdDPzw6OTk4NzU1NTQxMTAuOUhFQkVERkZKT0YyMjQzN0hSVVRUU1NTUU9NS0pLTEtLTU1LS0o/MCUnLDI5O0NHRkRAQEFAQkZKSUhGQ0A2LyonJycmJycnJyYmJiUkJScoJycnJiQlJSUlJSYqLTM4Oj0+OzYxKiQiIiUkIiMkJSEiIiIiIiIiIiMjIiMkJCUlJiYnKCYnKCYnKCcmJiUnKjI2PkRHTU5QU1pjboFhTl5cSUNBPz9AQkZISUtMTE5OTU5KT1NdaXF5f4GBfn18fYSGh4iGhYSCgoGBgYKFiYqMjIuJioeEgHx3c25tbGtra2tra2poZmZmZmhscXZ7f4KHi4uMjJCSkY2NjY2OjIqHg4SMiH97dnh5enp7eXd2d3V1dXV1dXV1dnV1eXuBhoyOjo6OlJSOjY6Ni4mLjpGUlJWUko+OjY2LiYiHhioqKiosLSwsLC0uLi4uLi4uLy8vLy8wMC8vMTEvLy8vMDAwMDAwMDAwMDAwMDAxMS8vLy8vLy4wLy8vLy4uLy8uLi8vLy8vLy4uLi4uLi4uLy8vLy8vLy8uLi4uLi0uLi4uLi4sLCwsLCwsLCwsLCwtLS0tLCwtLC0tLi4tLSwsLCwrKyoqKSkoKCYmJiYlJSUlJSUlJSQkJSQkJCQkJSQkJCQkJCQlJSUlJScrO2aBd3Fye4F5a15NOigjIiEiIyIjJigqMTpFT1pgY2NgVk9RXG19iIyHeHh2fH1rYF5keoSIkI5DKzI8VHqNl5+nqaqppZ6foZqOi4mJj5KYmpuLhX53bGdoaWFxfYRdYmZoZmRiX2RiYmBeXVtZVlZWVFFPS0lHR0VGSEhJSkpKS01PT0hDPDk3NzY1NjY1MzMzLzBDS0dGR0dDRklNPzExMjpHUlRVU1NSU1FQTk1MTExLS0pJR0ZEOiwjJCQlKS02PD0+PD5BQUJGSUVDQTo0LCgoJyorKyooKSgnJyYmJiYmJicmJycmJCYlJCMjIyIlKy4yMzEtJyIiIiMkJSIiIyMjIiIiIiIjIiQlJSYmKSsnJiYkJiYlJScnJiYnJygoKSksLjE4PUVKUFdganZ1XFlcal5HQEFBP0FGSElLS0tMTk1LSkxQV2Vtdnx+fn59en6FiIiHhoSDgYGBgYCDiIqLj4+LiouGhYF7d3Nua2tra2pqa2poZ2dnZ2dobHF2fH+EiYqKjZCRkZCOj46OjoyJhYSHjIR+enl4eXt7enh2dnV0dXN1dXZ2dnV3dnh9gIWLjo6MkJSSj46OjYqJjZGTlJWUk5KPjIuLi4qIh4YqKioqLC0sLCwsLi4uLi8vLy8vLy8vMDAvLy8vLy8vLzAwMDAwMDAwMDAwMTAwMTEwMC8vLy8vLy8vLy8uLi8vLi4vLy8vLy8uLi4uLi4uLi8vLy8vLy8vLi4uLi4tLi4uLi4uLCwsLCwsLCwsLCwsLS0tLSwsLC0uLi4uLS0sLCwsKysqKikoJycmJiYmJSUlJSUlJSUkJCQkJCQkJCEkJCQkJCQkJSUlJSYpLD9xhHRyeYCCdWZZRjEkIyIiIiMiIyUnKjE5RE9aYGNkYVpdZ3F+homKhHl+f4B/amBcXnaHj4yMejYvNU93i5egp6mpqKeinJyXi4d/fIKMkpGKeXV2c2ZhZ2tyfXV+bFZfY2JgXFxfXVxbXFhWU1NTUVBNS0hGREFBQkFBQ0REREVHSUlKR0I8ODY2NTY2NjUzMzIyN0tPR0dHR0pHSEw9MDI4RlBUVFVTUlBPUE5NTEtLS0tKSUZFQjgqIyMjJSYnJikrLzo8PEBEREVGQjUtKistLS0qKysqKSopKCgnJyYmJiYmJiYlJSYmJSQkJCMiIyMiJCQiIiEiIiEjIyIiIiMjIyIiIiIiIyQkKSwxNTk3NS4pJygoJSUnJyYmJycoKCgqKyosLzdETVRYW1xbXmhpV1BKQz8+P0FDRkhJS0tLS0xNS0pKT1ZiaXR6fn5+fXp/g4eHh4WEg4GBgYGCh4iLjI+Oi4qJhIR/enZwbGlrbGxqamppZ2ZmZmdpam5yd3t/hoqKiouQj46OjoyNjo2Lh4SFi4iBfXl4eHl7e3t5dnZ1dHN0dXV2dnZ1dXd5foOIi42NjpKUkI6OjoyJiY2Rk5SVlJKQjoyLi4uKiIeGKiorKyssLS0rLC4uLy8wMDAwMDAxMTExMTExMTAwMTEwMDExMDAxMTExMTExMTExMTExMTAwLy8vLy8vLi4uLy4uLy8vLy8vLy8uLi4uLy8uLjAwLy8vLy4uLi4uLS0tLS4uLSwsLCwsLCwsLS0tLS0tLi4sLCwuLi4uLi0tLS0sLCsqKiopKCgoJiYmJiYmJSUlJSUlJCQlJCQkIyMjIyQkJCQkJCQkJSUlKy5Ab4F1dHmAgHBfUT0rJCMjIyIjIiMlKCwwOENOWF5hY19fa3V9hYmLi4N8g4WBfG1fW1x0hXtudn5iMjFEcIWUnaWoqKioo5yZk4R/f3d1f4SBdWdlbHFqYGVacHBdcXlVU1dZWVlaWlZXVlRTU05PUExMS0lGREE/PTw7PD9AQUBDRUZGRUNDQTw3NTY0NDY1NTU2NjI7S0lDRENISEhJTj0xNkZQVFVUVFVTUE9OTk1NTEtLSUlHRT81JSMjJCQlJicnKCotMjtCRkRBOzItLSwtLS0sLSwqKyooKCgoKCgmJiUnJSUlJSUlJSQjIyMjIiIiIiIiIiIjIyIiIyIjIiIjIyMiIiMjIyMlKjE4QUdJSEQ8MyokIyUlJiYmJicnKSorKykrLDA7RUxKT1BWXWNeVU5KRUJAP0BBQ0ZISEpLS01NS0pJSk9UXWhyeX5/gH99goOGh4aFhYOAgIGAg4eJjI6PjouKioWCfXdzbmppampqampqaGdmZmdnaWxwdHh8f4WJioqOj4+Ojo2Njo2OioWDiIyEf3t4d3l6e3p5eHZ2dXR0c3R1dnZ1dXZ3en6EiYyOjY+UkpCPjo2KiouNkpOTlJSTj46Mi4uKiYiIhyoqKysrLC0tLi8uLi8vMDAwMDAwMTExMTExMTEwMDExMDAxMTAwMTExMTExMTEwMDExMTEwMC8vLy8vLy4uLi8uLi8vLy8vLy8vLi4uLjAwMDAvLy4uLy8uLi4uLi0tLS0uLi0sLCwsLCwsLC0tLS0tLS4uLi4uLi4uLi4tLS0tLCwrKioqKSgoKCcnJyYmJiUlJSUlJSQkJSQkJCMjIyMkJCQkJCQkJCUlJywvPmqBdXN6gHplV0kzJyQjIyMjIyIjJCcqLTZBTFZdYGJhX258hYiIjI2DeHh7fX1vXVpbZ2ZfaXuDfEgpPmR9jpafpKaopqKdl5OAdXx2cHJwb2xlYWhoZGdwZU5eSWOFWU1RU1RVU1VVU1JSUE5ISUtKSkdFQkA9Ozk4OTk5Oz08P0JDQ0VFQkJAPDc2NDQ1NjY2NjY0Mz5JRURDREVERkhUQzZCT1RVVFNRUU9PTk5NTEtLS0lJR0U/MiQlIyQkJSYnJygqKTRAQkI/Ny4rLS4vLC4uLS0sLCsrKCcnJycnJyYmKCgoJyUlJSUkIyMjIyIiIiIiIiIiIyMiIiIjISMiIiMjJCQjIyIlKjQ/SlNXV1ZSTEEzJyQjJSYmJiYpKSwvLSwuMzY7PD9IS1BdbGxnX1lRTkdDPz9AQUNGSEhKS0tLS0pJSElMUl1ncHh+f4B/f4KFhoeGhYWCgoGAgoWJi46Ojo6LioiEgHp2cGtqamhqampqamhnZmZnaGpscHR4fICFiI2QkY+NjY2MjIyPjoeEhIiJgX16d3d5ent6eXh2dnV0dHN0dXZ2dHZ3eH2BhYuMjI6QlpGOjo6NiouOkJKTlJWSj46NjIuKiYiHhoYqKisrKywuLi4uLS4vLzExMDAwMDAwMDAxMTExMDAxMTAwMTExMTExMTExMDAwLy8wMDAwMDAwMC8vLy8vLy8vLi4uLi8vLy8vLy4uLi4uLi4uLi4uLi8vLi4tLS4uLi4sLS0tLCwsLCwsLCwtLS0tLS0uLi0tLi4uLi4uLS0tLSwsKysqKikoKCgoKCgnJiYmJiYmJSQlJSQkJSQjIyMjIyMkJCUlJCQlJSctMz5lf3VzdnxwYVA9KyQjJSQjIyMjIyMmKS02QEtWXGFkZWJugIWJioyHgXV3eHt+b1xZWmZjZ3B6f3h8PS1Wc4eTmqClp6Wjn5qWhnp7d3FqaWhqZWdqaHF3e3JUSFFXfmJJT09OS1BNU1JOTEpIREVIRUREQ0E/PDY1NDQzNjY3Nzk+QkJCQUFBQEA8OTYzNDY1NjU0NDY4PUZFRERFRUNFTFdHQE1TVVNTUVBPT09NTU1MS0tKSkhGPjEkJCMkJSUoKCcnKCorNDk2MCstLi4tLS4uLS4tLi0qKigkIyYnKicmJygpKSonJiYkJCQjIyIiISMjIyMjIyIiIiMjJSQiISIhISIiIiIjKDJATFZhaWhnYVpQQjMqJCQlJSYmKCowNTo9QT04TFxsdnV2dnNuZ2FaUU1IREA/QUJER0lJSkpKS0tJSUlJSlBbZ3J6f4OCgIGEhoeHhYSEg4CCgYWIiouMjY2Mi4uHg354cm5qamlpampqamloaGdmaGpqbXJ2en6Dh4qPk5OPjo2NjI2PjoqEg4WKhX99eXZ2eXp7enh3dXV0c3JydHV2dnZ2dnd+gYiLjI2NkpiRjY2OjIqMj5GSlJSUkpCOjYyKiIeGhISCKiorKyssLi4uLi0uMDAxMTIyMjIyMjAwMTExMTAwMTExMTExMTExMTExMTAwMDAwMDAwMDAwMDAvLy8vLy8vLy4uLi4vLy8vLy8uLi4uLi4uLi4uLi4tLS4uLS0uLi0tLC0tLSwsLCwsLCwsLS0tLS0tLi4tLS4uLi4uLi0tLS0sLCsrKiopKCgoKCclJSYmJiYmJiUkJSUkJCUkIyMjIyMjJCQlJSQkJSYpLzZBYX51c3V4a1pKNSYiJCUkJCQjIyMjJiktNT9JU1xhZGdueoGEhoiGfWtwd3Z4enJgXV5kZ3V6e3l9jngvPmh6ipOZnqOioaCbkIeAenZwZ2dmaGdlZ294fHh3b2JcV2ddQ0tKRkZJSlRVTUdGREA/QkE/QD9APjo2MzMxMDAzNDQ1OT5AQD8/Pz4+Pj44NDM1NTY2NjU0NjdASEZEREZFRUhPWEtIUFVVUlFQT09PTU1MTExMS0tJRz8zJCQjJCUlJycmJygqKCcqJygsLy4vLy8uMC4tLy4vLSclIyMmJyooJycoKCgmJycmJSQlJCMiIiIjIyMjIyMiIiMjKTUyJSEhISEiIiIiJCw4RFNfa3R4dG9oXE4/MColJSUnKS4wLzQ8SFlbUHWAd3N2dnV0cW1mXVRMRkI/QUFDRUdJSUpKSktLSUlISEpQW2dyeoCEhIKDg4aIh4WEg4KBgoOGiYqMjI2MiomJhIB7dnBraWlpaWlpamlpaGhnZ2pra29zeHqAhYiNkpSRj46NjY6OjoyGg4SHiYOAfXl2dnh6enl4d3V0c3NycnR1dnZ2dnd6foSKjI2NjpWUkI6OjoyKjI+RkZOUk5GPjIyKiYeGhISEgiwqKy0tLC0tLi4tLjExMDAyMjMzMjIyMjIyMjIxMTExMDAxMTExMTEyMjAwMTIyMjExMTEwLzAwLy8vLy8vLy8vLy8vLy8vLy8vLy8uLi4uLi4uLi4tLS0uLi0sLS0sLC4uLi4sLCwsLS0tLS0tLS0tLS0tLS0uLi4uLi4tLS0tLS0qKikpKSgoKCcnKCgnJyYmJiYlJSUlJSUlJCQkJCQjIyQkJCQkJSYnKzE6Qlx8dXFxcWxWPy0mJCMlJCUkIyMjJCYpLjI7RVFaYmhtdoCChIOEel9PbWppcHBzZGFgZnN+eHZ5hYmIYTNbcoKKj5ien52cmIuGhoJwZ2FhZWhnYl5mb3dwb3Z4eG92bzhER0JBQT9BRUVEQUM+Oz08Ozw9Ojg1MzIxMS8uLzExMTU5PD0+Pj4+PT09Ozg1NTY3NzY4ODg6PERIRkdFRkZGSE1UTkhRVVNRUE9PTk1NTU1MS0tKS0ZBNSYlJCUlJSYnJicpKSgmJSQoKy0vLy4uLjAwLy8wMS8nIiIjJScsKigoKCcnJycnJyUlJSUkJCMjIiIiIiIiIiMjIyYtKiQiISEhISEiIiUvPUtaaXZ+hH96cmdcTT4xKScpLDA0PEpUTURPT19+gXx2dnV1dHFtZl5WTUZCP0RBQkRHSUlJSktJSUhIR0dIT1lncnyDhoaFhoaHh4eFg4KBgYSEiImKjYyMioiGhYR+eHRuamhoaWloaGpqaWhnZ2Zpa21wdHl8gYeMkZSUkY+Pjo2Oj4+Kg4GFiYeCfnt4d3Z4enl4d3Z0c3Nzc3N0dXV1dXZ5fIKGiYyMjZCVkpCQkI2KiYyRkJOTkpGPjIyLiYeGh4WDg4EsKistLi4tLS4uLzAxMTExMjIzMzIyMjIyMjIyMTExMTAwMTExMTExMjIxMTMzMzMxMTExMC8wMC8vLy8vLy8vLy8vLy8vLy8vLy8vLi4uLi4uLi4uLS0tLi4tLC0tLCwtLS0tLCwsLC0tLS0tLS0tLS0tLS0tLi4uLi4uLS0tLSwsKiopKSkoKCgnJycnJycmJiYmJSUlJSUlJSQkJCQkIyMkJCQkJCUlKC40O0ZXd3VxcW9uUzcnJSUjJSUlJCMjIyQmKS0zOUNQWmNtdHt/gIF8dWI8R2twcHNxd2hkY2ZzfHd2hImBgn9QQ2V0f4aOlpmamJWGhIiGcFxgYWdoY2BdY2x5fXVrbHt8fIFMOUJDPDs7PEA+PDw9Ozk5ODc3ODY0MS8vLi8tLC0vLy8yNjk6Oz4+Pj09PT07ODc3Nzc3OTk3Ojw9REdGRERGRUVITFBOSE5QUE9OTUxNTU1NTEpLSklHQzkmJCQlJSUmJycoKSkoJiUkJSsuLi8uLjIyLzAzNTUvJyAgISMnLCooKCgoKCcnJycmJiYmJSUkJCIiIiIiIiMkIyMhIiIjIiMhISEhIiImMD9MWWp7h4qIgXpxZlxNQTg0MzZBU2Fsa1tdYmd5fYKAd3R0dXVzbmliV05FQkJBQkRGR0lJSUpLSUlISEdHS1JdaXN+hYeHh4eHh4eHhYOCgYCFh4mJjI2MiomIhoOBfHZxbGpoaGlpaGhqamloZ2dnaWtucXV6fYSIjpSVkZCOjYyNj5COhoKChoqFgH15eHZ3eXp5eHd2c3Nzc3NzdHV1dXZ3eXyChoqNjY6SlZKPj4+Oi4qOkI+SkZOQjoyMioiHhoSDhIKBLS0tLi4uLi4vLzAxMTEyMjIyMjIyMjIxMTIxMTIyMTExMjExMjIyMjMzMzMzMzMzMzMwMDAwLy8vLy8vLy8vLy4uLi4uLi4uLi4uLi4uLi4vLy0tLi0sLCwsLCwsLCwsLS0tLS0tLS0tLS0tLS0tLS0tLi4uLi0tLi8uLi4uLS0sLCspKSkpKSkoJycmJicnJycmJiUlJSUlJSUlJSUlJSIkJCQlJSUlJyswNTxJWG14a2hrbVkyJCUlJCUlJSUlJSUmJigrMjhBTVxodXx+fHt3cFw7KD9meXJxdHpqZGNibXR7hYV9e3p8dUlSbXl/gouNk5eUiYOEgW1fXGBhXmFkY2d0f4F9cGt0eHR3ai05Pjw4Njc6Ojo4Njc1NTMyNjY1MTAvLSwsLCgqLSwsLzE0Njc6PDw8Ozs8PTk3Nzg5OTxES0E+Oj9FR0dFREVFRkdJT0VBS05LTE1MS0tLS0tLSkhHR0U9KyMlJSYmJycpKiwpKCYlJCUsLi8vLzExMTY4ODo4MCYgICAiJy0uLComKSgpJycnJycmJSUlJiQkJCQkIyMjIyMjIyMjIyMjIiIhISIiJS49TF1tf4mKiYJ9dW1oXlRQSUZIVGJmZWtlZWxzdnl4fHp2dXd0cnFrY1lQSENBQURFR0hISUlKSkpKR0dGR0xTXml0f4WKiYiJiIiIhoSDgoGChIeIjIuNi4iJhoWCfnhybmppaGhoaGhoaGhoZ2dnaGprcHJ2e36BiJCUlZGRjo2OjpCOioODhYiIg4B9end3eXp5enZ2dXRzdHR0dHR0dHRzdnh8g4eMjoyOlJSQjo2Ni4iLj4+OkJGRjo2MioqHh4aFg4CBgSwtLi8uLi4uLzAwMTEyMjIyMjIyMzMyMTEyMTEyMjExMTIxMTIyMjIzMzMzMzMyMjAwMDAwMC8vLy8vLy8vLy8uLi4uLi4uLi4uLi4uLi4uLy8sLCwtLCwsLCwsLCwsLC0tLS0tLS0tLS0tLS0tLS0tLS4uLi4tLS4vLi4uLi0tLS0rKSkpKSkpKCcnJyYnJycnJyYmJSUlJSUlJSUlJSUlJCQkJSYlJSktMzM9Sllncm5nZmlkQCQlJSQlJSUlJSYmJSUoKi42QU5hdIF/fHl1bWFKNC42WXhzcnl7bGFhZ2lyf4Z/eXd3enpkS11weHmAg4qOkoqCdmxoZGRnYVlcYmludoGFfHJsbG5xc3Y+MTQ3NTQ1NTU2NDMyMjIxMDIzMS8uLiwsLCwoJykpKywvMDIzODk6PDw8PDw7Ojg5PD0/WWJIQkA+QklJRkZHRkZIR0hKQkNISktMS0pKSkpLS0pIR0dEQDUmJSUmJigqKiorKiclJSQlLC4vLy4wNDg9Pjs9OzMnHx8gIiowMTIvLSwrKyknJykpJiUlJSUmJCQkJCQkIyMjIyMjIyMjIyIiISEiIicuPEtebn2Ii4uHgn95dXBrZmBXV1hdZmdfW1NPXWRSSmtxbXJ2dXVxbWRcUkpDQkNERUdJSUlJSEhISEdHRkdMU11qdoGIi4uKi4qIh4aEgoKBgoWHiouLjIiIh4eEgHp0cW1raWhoaGhqampqaGdnZ2lqbXF0eXt+hY2TlZSRjo2MjY6QjoeCgYWIiIJ/fHl3dnh6eXd3dnV0c3Nzc3NzdHR0dnZ6f4WKjI2NkJWRj42NjYqJi4+Pjo6Pj46Ni4qKiIeGgoGAgYMuLi4uLi4uLjAwMDExMTIyMjIzMzMzMjIyMzMzMzMyMjMzMzMzMzMzMzMzMzMzMzMyMjExMDAwMC8vLy8vLy8vLy8vLy8uLi4uLi4uLi4uLi4uLi0sLCwsLCwsLCwsLS0sLC0tLS0tLS0tLS0tLS0tLS0uLi4uLS0uLy8vLi4tLSwsKykqKioqKikoKCkpKCcoKCgnJiUmJiUlJSUlJSUlJSQlJSYlJSUqLzE2PU1aZm9uaGRjZlYrISUkJCQkJSUlJicoKCkuNkZYb4KEgH14b2ZVRT82OVR1cGx8fGtjYmVpdoWGf3VzdXZ5emJMYHBwcnZ8hIN7cmpnaWhobWxrbXJ5eHp+gnltYVZLS0dNSy4wMzExMTExMjMxMC4uLy8tLy8tLS0rKywsJyQpKScoLCwwMzU4ODo6OTo7Ojo6Ozo9Pz9CQ0NCQURGSUxJRkhHREZJSkhAPkZISkxJRkdJSktKSEZFQ0A5KSQkJiQoKysrKyooJSUlJisuMDAuMTo9QEJAPTo0KB4fHyUtMjQ3ODUvLS4qJiYlJicnJSUlJSQkJCMlIyUkJSUjIyIiIiIjIyIiIiMlKjRHWWp9houMioeGg39+e3p3bWxnWVtXXGZeRkBGNTxgdnx3c3NudG9nXFNKRENDQkVHSElJSUlJSUlISEVITVRfbXiDiYyNjIyLiIaGhIKCgYSHiIuLi4qIiIaDgX15dG9samhoaGlpaWloaGhnZ2dpa25ydHh7gIqSlZWSkY+NjYyPjomDgYSEiIR+fnp4dnV3eHh3dnV1dHNzc3Nzc3N1dXZ5e4CGi42MjpSUkI6OjouJiIuOjo6Oj4+OjYuJh4aGhoSCgoOELi4uLi4uLi4wMDAxMTEyMjIyMzMyMjIyMjMzMzMzMjIzMzMzMzMzMzMzMzMzMzMzNDQxMTAwMDAwMC8vLy8vLy8vLy8vLi4uLi4uLi4uLi4uLi0sLCwsLCwsLCwsLCwsLCwtLS0tLS0tLS0tLS0tLS0tLi4uLi0tLy4vLy8vLS0sLCspKioqKiopKCgpKSkpKCgoJyYlJiYlJSUlJSUlJSQnKyknJSYoKywvNT5MWmZvcWtnY2ZjQSIkIyUkJSUlJSUmKSkrM0RUbIWIhIF7dGpfVlBJREZSYWJmfnpuY2Foa36Jh3tzc3V2d3x5T1FnbGprb3VzdGtnamtsb3R8fYCGh4SEf3lxXk1EOzEyMjQtLS0uMDAxMS4vLy8sKisrKystLCwsKysrKyglJiYnKCorLjEzNTc4NzU2Nzc3OTo6PkJERkhKRkZGRkhKTE1LSklIS0tKR0BAREhKSURER0lKSUhHRUI/OSskJCUmKCssLCwrKSYlJSUqLjAwLzY+QERDQT8+MyggISInMDc8PDk5ODUyLigoJyUmJiUlJSUkJCQjIiMkJSUlJSMjIyMjJCQkJCQjJCgyR1lqfIeMjYyMi4iEhYOCgXt1bl1cY2llWlBWTz9Lan1+dnRoQ2BxaGFVTUZFRUVHSEhJSkpJSUdHRkZFSE1UYG54g4mMjYyMi4iGhIOCgoSFiImLi4qJhoWGg4B8d3Nta2loaGhoaGlpaGhoZ2dnaWtucnV5e4KNlJSSkY+OjIyPj4qFgYCDiIiDgH16eHZ1d3h4d3Z1dXRzc3Nzc3NzdXV2eXyCh4yMi4+Wk5CNjIyKiImNj46OjpGPjYuLiYeGhoOAgoOGhy0tLi4vLy8tLzAxMTExMjIyMjIyMjIyMjIzMzMzMzIyMzMzMzMzNDIyMjMzMzMzMzMzMjIxMTExMTAwMC8uLy8vLy8vLi4tLS4uLi4uLi4uLi4tKywsLCwsLCwsLCwsLCwsLS0tLS0tLS0tLS0tLS0tLS0tLi4uLi4uLi4uLi4uLCwsKysrKysqKioqKSkpKSgoKSgnJiUlJSUlJSYmJicqOEM3JyYnJiktMDY/TFtmb3RwaWdiZVovJCMjJCYkJCYnKCwzPU9jeIWLi4WBd2xkYFlXUk5PWGFkbnt3bmdmaHCHjIN5a25ycHJ3e1dBV2JmYWNlZ3duYWxvc3uDiIiGioyMiX5rV0Q4NjQ0NDQ3MSooKS8uLS0tLSwsKikpKSoqKioqKCcnJyclIyQmJicnKiwvMTM0NTUzMzMzMzc4ODxCRklKSUpKSElMTFBSUVBPUU5LSElIQ0FCRUZCQkNHR0hJSEZAPzksJSUlJygrLS4uLSooJSMjKS0uLjE6QEVJRUJCPTEkHyMlKzI6PT89Ojg2NDIrKiklJCUkIyMjJSUjIiQkJSUlJSQlJiUmJycoKSkoJyksMkVWZ3mHjo2Pj42LiYmIhYSAfHBka29qaVtdaFs1QWR2gXx3cmJjcGphWE5GRUVHSUlJSkpKSUlHR0RERkdLVWFteIOJjI6MjIqIhoOCgYOEh4uLjIqJiIaFhYKAfHhybGpoaGhoZ2dpaWhoaGdnaWpsb3N2en2KkpOUk5CPjYyNjo2IgICBhIqFgn57eXh3dnh4d3Z0dHRzcnJyc3Nzc3V1dXl+g4qMjI2OlJGOjY6LiIeKj4+NjpCQkI6LiomGhoWDg4OFh4gtLS4uLy8wLzExMTExMTMzMzMzMzMzMzMzNDQ0NDQzMzMzMzMzMzM0MzMzMzMzMzMzMzIyMjIyMTEwMDAwMC8vLy8vLy4uLS0uLi4uLi4uLiwsKyssLCwsLCwsLCwsLCwsLCsrLS0tLS0tLS0tLS0tLS0tLS4uLi4uLi4uLi4uLisrKysrKysrKysrKykpKSkoKCkoKScmJiYmJiYnJycoLUZaTDAwKycpLTI4QU5aZW5yc2xpY2NmUSkjIyUlJCMoKC45S2B0g4mJioqDeWpjYWFgXFhWVVlodXZzeHJoZmlvgIaBdW5ubm9wd3lZOEtXXF5dWltueWp3eXJ9hYeHiYqKiYJvVz45NDQ4Pzs2OTcuJygqLC0tLCwrKignJycoKCcnJicmJSUlIyQkIyQmJScpLC4vMTAyMjIyMjI0Nzg+Q0lLTExMTU9OTlFUV1hYWFZST0tKSUdCQUE/PT9CQ0VGR0ZEQDw1KiYmJygpKiwsLi0qKCcmJSgtLjAwPENFSUlFQjorISAiJTA3Ozs7PDs6NzQxLiwrJyMlJSMjIyQkIyIiIiEhISMjJCQkJSYnKCkpKywuMThGWWp6iI6Ojo6OjoyMi4eFf3lyaF5PRz40MDAzMTpBTW15dXZ2c29rY1tRSUZGSEpKSkpKSkpKSEhGRkVHS1VhbXeCiYyNjYyKh4SCgoGDhIeKi4yKiYeFhIKAgHx2cGtpaGhoaGdnaWloaGhnZ2lqbG9zdnqBjZaRko+OjYyNjI+LhoCAgYSJg4B+e3d2dXZ4eHd2dHR0c3JycnJzc3N1dXd7foOKjI2OkpSQjY2Ni4iIi42Njo+QkI+OjIuJhoODg4OFh4eJLS0vLy8vMDAxMTExMTEzMzMzMzMzMzMzMzMzMzMzMzM0NDQ0MzMzMzQ0MzMzMzMzMzMyMjQ0MTAwMDAwMDAwMC4uLi4uLi4uLi4uLi4uLi4sLCwsLCwsLCwsLCwsLCwsLCwrKywsLS0tLS0tLS0tLS0tLS0uLi4uLi4vLy4uLS0rKysrKysqKisrKiopKSkpKCgoKSgoKCgnJygoKCgoKSs/VVA8Oy0pKi4yOkVQW2Rtb3JsaGRiZWdDIyIlJiQlKy47T2l8h4aJiYiBeGNYWF5hYF9dWldXZXt7b3pzZ2dmbXR4eXZwb21vcnV6XDM2S1ZWWFhSXG50eHJia35/f3qIhn1pUEA5ODg2NTg4OTs/NSgnJycqLCopKCgnJSUlJCYlJSUlJCQkJCQkIiEkJSQmKCouLC0vLy8wMTExNDk5P0VHTU5PT09RVFVWV1lZXVpZWFVSTkpJSUdEQj48PUFCQUJDQj44LyonJyYnKSoqKywsKigoKCUnKy8wM0BCR0pKSEAyJx8fICY1Ojw9Pj05My8tLS4tLSooJiQkIyEhISMiISEgICAhIiQkJSgpKSouLSwuMDRFWnB+fYSMj46NjI2OjouKh311amBXT0U3LigmIyYqNjpATllpb3R0bmZeU0xIR0lJSkpKSkpJSUlIRkZFRkxXYWx4gIiMjI2MioaDgoGBhIaIiouLioeHhoWDgH97dm9samloaGhnZ2hoaGhoZ2hqa25vdHd7hJKUkpGOj4yLjIuPiYOAgIGFh4R/fXx4d3R2eHd2dnRzc3JycnJycnNzdHV5fYGHi42MjZSUkI2LjIqIiIyPj4+PkZGPjYqKiYaFg4KDhYiHiC4uLy8wMDAwMTExMTExMzMzMzMzMzMzMzMzMzMzMzU1NDQ0NDMzMzM0NDMzMzMzMzMzMzM0NDEwMDAwMDAwLi4uLi4uLi4uLi4uLi4uLi4uLCwsLCwsLCwsLCwsLCwsLCwsKyssLC0tLS0tLS0tLS0tLS0tLi4uLi4vLy8uLi0tLS0rKysrKiorKyoqKSkpKSgoKCgoKCgoKCgpKSkpKSoqMklYSzotKisvNj5HUl5na2tmbG1jYGNpZjsiJCQlKSw1SWiChYSFhoV8b1hKTlBYXmJiYGBcWmN9fnuCdWpqaGttb3V4cm1ubnJ1d14xLjdLUVBRTU5YXlpSRkJpfXt1enZrUDs1Njo5ODc3Njg7PDsuJiUlJicnJSUlJCQkJCMkIyMkIyMiIiIiIiEhIyMkJSYpKywsLS0tLS4wMTQ3Oz5GSktOUFFRU1ZXWltcWVtdXFpZVVNPTk5LSUdEQj4+QEBBQT88NS8qJycmJygoKisrKyooKCgnJysuLjRCQkdJSEY/LSMgHyApNTs9Pz43Mi4rKSYkKCwsKiYkIyIjIiIhIyIhISAhISMkJScqKSosLDA1OzlFU2R7f3h8iY+OjYyMjY2LioZ/eXNrZlpSQjkuKCgrMDlERkxPTlFca2tpY1dPSklJSkxKSkpKSUlIR0VFRUZMV2FueYGIjIyMi4mGg4KBhYWHiouMi4qHhoSDg4F/enVtamhoZ2dnZ2doaGhoaGdoam1vcnV4fouVkpKPjo2Li4uLi4WCgICBhYWCf316eHd1dnh3dnV0c3NycnJycnJzc3N1eH2EiYyOjY+Vk46Mi4qKiIiMjo6RkZGRj42LioeFhISEhYiJiYovLy8vMDAwMDIyMjIxMTMzMzMzMzMzMzMzMzMzNDQ0NDU1NTUzMzMzNDQ0NDQ0NDQzMzQ0NDMyMDExMDAwMDAwLi4uLi4uLi4uLi0tLS0tLS0tLS0rKysrKywsLCsrLCwrKywsLCwsLCwsLCwsLC0tLS0tLS4uLi4uLy8vLi4tLSsrLCwsLCoqKysqKikpKiopKSgoKSknJykrKiosLCssLTA5TFQ8LS0vMzpCTFVgaGpnYWBraGJiY29jLx8kKCsvPl5+h4SHhYF3XUI1PEVMUlhcX2FkYmJkc4CIiHtua2ppamxydHBra2xvdXVfMiwuOUhLSE5LSkxCQj80O2R4enBiTjs0NTc5Ozs6OTY4Ojs7NiglJCQlJSUkJCMjIiIiIiIiIiIiIiIiIiIhISEjJCUmJigrLS0tLC0tLy47QT1CRUlMT1JTVFVVVVhcXl1eXl1dXFhVU1NUUlFQSUZEQD07Pj08OTQuKikpKCgoKCgqKysqKioqKCcpKi40QUZISEVCNykgICIjLDY9Pjw5NDAsKignJCQnKCooJCMjIyQkIiEiIiIhICEkJScoKy0tLzM2PFFobmpwf397f4qOiouNjYyKiIaHhn95dGxmXFJFNzMyMjQ5P0dFREdJS1daWV1hVElIS01JS0xJSklJSEZFREVGTFdgbniAiIyMjIqIhYKCg4WHiImMjIqJiIaFg4SBf3pzbGlnZ2dnZ2dnZ2hoaGhoaWptb3N4eIOPlJGPj42LioqLi4iFgYB/goeDgX99enl2dnd4d3V0dHNzcnFzc3NzcnN0d3x/h4yOjo6QlpOOjIyKiYmJjZCQkZGRj42Mi4iGhYOEhIaIi4qKLy8vLzAwMjIyMjExMjIzMzMzMzMzMzMzMzMzMzQ0NDQ1NTU1NTMzMzQ0NDQ0NDQ0MzM0NDQzMTEyMTAwMDAwMC4uLi4uLi4uLi4tLS0tLCwsLCwsKysrKyssLCwrKywsKyssLCwsLCwsLCwsLCwtLS0tLS0uLi4uLi4vLy4uLS0rKywsLCwsKisrKyopKSoqKSkoKCkpKiorKi0uLy8vLzExMS9HQTExMjg/SFBbY2lqZVtRWm1nYmFncVQkIyksMkhshIODgXlpSS4pMjQ7REpSWFpdYWRmaHWCh4Z/cWlnZmhsbWtpaWtsb3F2XywpKy40RkhFR0Y+NjVJRjUzVmRdSDw1NTY4OTs7Ojo5Nzk6Oz0tJSUjJCUlJCQjIyIiIiIiIiAgICAhISEhICAgICMkJiYlJigqKyoqKiwuNDk7PENITk9SUlJTU1RVV1xdXV5iYmBeWVZYWVhYV1dVTUlDPTk3ODczMCwrKSkpKCgoKisrKioqKiooKiwvNUFGRkVDPS8jHyAhJS02PD87NzEuKykmJSMjIiMkJiMiJCkpJSUjIiMjIyIjJScpKiwwMjIvMT1cdX56eXx+gICIioqLjIqJh4SBgoSDfHdwaWNcUEZBOjc2ODo/P0FERklOS05ISl5lU1VaSEZKSkpKSkdGRURESE9YYm96goeLjIqJhoWCgoWHiIiLjIyJiIiHh4WEgX12cm1pZ2ZmZmZnZ2doaGhoaGpscHJ0d3yIkpSPjY2MiYiJiYmHg4CAf4OGgoF+fHl3dXZ3eHd1dHRzc3R0cnJycnJzdHd8gIeNj46PkZOPjY2LiYmJi46QkJGRkZGOjIqHhYSEhYeJiYqKiDAwMTEyMjMzMzMyMjIyMjIzMzQzMjM0NDQ0NDQ0NDQ0NTU1NTU1MzM0NDQ0NDQ1NTU1NDQzMzIyMzIyMjAwMDAwLi4uLi4uLi0tLC4uLi0tLCwsLCsrKysrLCssKysrLCosLCwsLC0tLS0tLS4uLS0tLS0tLi4uLi4uLi4uLi0tLS0uLi0tLCssLCwrKioqKikpKikpKystLi4wMDEyMTEwMDExOUI9NTc+RU5UXWZqamJVS0hha2VjZG5xPiEoKjZReYJ9fnNXOSYoKywxNTxBSFBUWl9kbHJ+iYJ6fHNoZGJnbXFta2lqa29vcF4rKSsqKjdGSUVDPjMsMTMxKjFEQzg0MzI0Nzo6Ojs7Ozc4Ojs8NigoJyYlJicnJSQiIiMjIiIhISEhISEgICAgHx8hICIjJCUoKioqLCwsLjM2Nzs8QkdMT1JRUVFTVlZaWlxbYGFjYV5cXV5dWVxeV1NOSUQ8NzU2NDAuLi0sKikoKSkqKisrKyssKywtMTdAREVEQTcrISIiIyguNDs+OjQvKikmJSMiIiEiJCElJikpKSYkIyIkJSUlJiYqKyssLi8tLjtLWGN0eHdzfH97hIeKioqKh4SBeXyChYN8eHJpYlxWT0I6Pjo9QENFR0hMTlVRVlpKSFZTX2lcTUlKSktJR0VDREhRWGRveYCIiYuIiIWCgoOEh4iKi42NiYiJiYeGhIF7dnFtaGdmZWVlZ2dnaGdoaGltbXBxdHZ/jpKRjouLiomIiIqHhYKAf4CEhoKBf317eXh5eXl1dHNzcnJycnJycXFzc3V2e4KKj5GQkJSSjoyKioiIiY2QkZGRkY+OjoyKh4aGhIiJioqLiIcwMDExMjIzMzMzMjIyMjIyMzM0MzIzNDQ0NDQ0NDQ0NDU1NTU1NTQ0NDQ0NDQ0NTU1NTQ0MzMzMjMzMzMyMDAwMDAuLi4uLi4tLS0tLS0sLCwsLCwrKysrKysrLCwrKysqLCwsLCwtLS0tLS0sLC0tLS0tLS4uLi4uLi0tLi4tLS4uLi4tLSwrLCwsKyoqKiopKSsrKy0tLzAxMjIzMzQ0NDQ0NDQ+SkM5QkxUXWZrbGpgVUU4SGlpZGJpdGEqIys6Wnx9eHdjNyUnKiksLDA1OUBFTVNbZnJ4hJKFeXhzZWBgYWlwb2Zna21ub3JdLCgqLTEyOUZBQDw2KiopKCcoLC8wMjM1OTg6Ojk6Ozs5Nzc5PDstKCorLCgpKSopKCclIyQkIiIiIiEhICAgIB8fIB8iIyQlJikpKSosLCwvMzY4OTxBRUpPUlJQUFRWWFtcXF9eYGFiYF9fX1xbW1taV0lOSDw3NDIyMC8uLSwrKSkpKiorKysrKy0sLTA7QERFRD81JiAhIiQpLjM5Ozk1MCsnJiQjIiIiIiMjJCUoKioqJCUjIyMkJignKisrKysqKzNBUFdCPTk8Olpscn6GioqJiYiDfHVze4CEg354cGtnX1VOREJAQENGS0tNTExRTkg/S0tMT1hnbGJJSUtJSEZEQ0VJUFxlcHmAhYeJiIeEgoKEhYiJioqLi4mJiYmHhoOAenVxbWdmZmVmZmdnaGZnaWlpbG5xcnV2g4+QjouKiYiHhIWGhISBf3+ChoWCgYB+e3l4eXl3dHRzc3JycXFxcHFxc3N1eH6FjI+RkJKUko2Li4qIiImOj5CQkZGPjIuKh4aHiIeJiouKiImEMDAxMjIyMzMyMjIyMzMzMzMzNDMzNDQ0NDQ0NDU1NTU1NTU1NTU1NTU1NDQ0NDQ0NTU2NjQ0NDQ0MjIyMTAwMDAwLy4uLi4uLS0tLS0tLCwsLCwsKysrKysrLC0rKysrLCwrLCwsLS0sLCwsLCwtLS0tLS0uLi4uLS0tLS0tLS0tLS0tLS0sKysrKyoqKisrKiosLC8vMTIzMzQ1NjY1NjU2Nzc4OERMREhSWWBmbW1pW1A+MDVWcGljY2pxSCQpOFp+e3hzXC4mJikoKCssMDM5P0ZLWGl3eYOQjH96dWReXF1jbHBoZ2dpbG9yWi0nKi01OzlSSD06OTIrJSckJiYpLS4yN0A9OTg5Ojk5ODY2ODw8Ny0rLS8sLCwuLi4sKSUjJCMjIiIiICAgHx8eHh4eIiMjJCYnKCkpKSwsLzM3MzEzOT5BSE1QUU9RU1VWWFpdXVtbYWRjYmJfXl9hYlxSVFJHOzc1MzMyMC0uLSsrKywsKyssLC4vMDAzO0BDQ0E7MSQhISUnKC0yNjo5My0pKCYlJCIiJCUjJCUoKSksLSglJCQkJicnKCkqKikoKy84RVRVPTUqJy9CWGt9iIqLiYiEfXVraHF4f4GCfnhzbGVhWVJLQ0JGRkZJUFFTV1RMSVBOT1JZZVZdXU1LSkpHRURFSlNdZnF5gYOGh4aFhIODhYeKi4uKiYmJiYmJh4aCfnhzb2tnZ2VkZmZnZ2doZ2hpa21wcnR2eIiTjoyKiImIh4SFg4OEgX5/g4aDgYCAf3x4eHp4d3Rzc3NycnFxcnFxcXN0c3mAhoyQkpGSlZGMi4qIh4qMjo+Oj5GRj42MiIiHiImJi4uKiomGhDIyMjIyMjMzMjIyMjMzMzMzMzQzMzQ0NDQ0NDQ1NTU1NTU1NTU1NTU2NjU1NTU1NTU1NjY1NTU1NDQyMjExMTEwMC8uLi4uLi0tLS0tLSwsLCwsLCwrKysrKywtKysrKywsLC0sLC0tLCwsLCwsLS0tLS0tLi4uLi0tLS0tLS0tLS0tLS0tLCsrKyoqLCwrKywtLzAzMzY3NjY4ODk5ODg4Ojs7Ozs+SlVSVFxjanJtY1dKOC4sP2ZtZWJlbGY7JDVRd3x2cV42JicpKScoKSouMzg+R1dseXV8hoyDenZoXlxbXmNoZ2dlZ21wclorJyotNTxDY1tCNzkzLCwoJSgoKSosLjU8OzU1Nzg4Nzg3NjU3NzoyKystLCsrLC0uLywqKSgmJiQiISAfHyAgHh4eHiIjIyQmJygnKCgoKS0xMTAvMDU6PkFHTlJUUFJTU1VVV1hYW1xdYV9gX19bW1lZW1ZTTkdANjc0MjEwLS0tKyssLCwsLS0uMTMzMzs+QUE/OS8kISIoKywvMTk8RUQ+MysnJiQmJiMkIyYpKSgqLi4tLCklJCUnKigoKCgoKCsyNjQ8MSonJyo1Q1pufomKi4qHg3xxamVpcXh/goJ9eHNva2VZUkxKSU9PUVVZXFxWUVdSS05UV1pVSVBYS0RFRUVERk5UXWdyeH+ChYWEg4OFhYaJiouLiYiIiYmJh4eGgX14c29rZmZlZGZmZ2dnaGlpamxucHJ1dn2Ok46LiIeHhoaGhoWEhIB/gIWFg4B/f358eXh6dXd0cnNzcnJxcXFxcXFyc3R7gYiNkZCQk5ONi4uKiIeJjZCRkJGRkY+Li4mIiIqKiouMi4mIhoIzMzMzMzMzMzEzNDQzMzMzMjI0NDQ1NTU0NDMzNDU1NTU1NTU1NTY2Nzc1NTU1NTU1NTY2NjY1NTQ0MzIyMjExMTEvLi4uLS0tLSwsLCwtLS0tLCwsLCwsKysrKysrKyssLC0tLCwtLS0tLS0tLS0tLS0tLS4uLi4tLS0tLi4tLS4uLi4tLSwrLCwsLC0tLS4xMjIyNTU5Ozo6Ozs7PDs7PDw9PT1AQ0ZPVlpcZm52bmFTRjUuLDNNcGlmY2VtXS8qRGp7dXBlQSYlJyknJikpKi80OEFacnlvc4KIf3p2bmFdW15lZmZmY2ZqbGtaLSUmLDE3SmdbTjgvLywrKygoKisrKiwuMTMyMjQ1Nzc2ODU1OTY1ODIqKSssLCsrLCwrLCspKCcnJiQgHh4eHh4eHh4gIiIjJCYnJycnJycoKCooKSwvMjg+QUtRUVJUU1JTU1NUVFJVWFpcWVteXV1kY2BaUlFRTUk4ODcyMTEvMC0tLS0tLS0vLzM0NTQ4PT4+PDYrIyMkJikvMTlNYGxwa19SQTMrKiYiIiImLTY0Njg4ODMwLSwqKysqKSkpKSYlKisnJSUnJycoMkNccH+Li4yLh4R8cGNcYGhyeYCEgn16dHBraGJiY2FgX2JfXl1bYm1oWVteXVlXUEA4T1ZlWkdGRkdMVWBpc3p/gIOEhIKDhISGiYqKi4mHh4iIiIiHg399d3JuamdmZWRmZmZnaGhpaWptb3JzdHmDkJCMiIeGh4aGhoaFhIN/f4CEhIGBgH59fHp5enZ2c3FycnJycnFwcHFxcnN1e4SJjpCPkJSRjYyMi4iHiI6Qj4+QkZCOjIqIh4mJi4yMi4qHhoOBMzMzMzMzMzMzNDQ0MzMzMzIyNDQ0NTU1NDQ0NDU2NTU1NTU1NTU2Njc3NjU1NTU1NTU2NjY2NTU0NDMyMjIxMTExLy4uLi0tLS0tLSwsLS0tLSwsLCwsLCsrKysrKysrLCwtLSwsLS0tLS0tLS0tLS0tLS0uLi4uLS0tLS4uLS0uLi4uLS0sKywsLCwtLi4vMjQ3NTg7Pj89Pj4+QEBAQUFBQkJDREZKTFNWWVpqdm5fT0Q1LywtOVp0aWVkamxaLjJZd3ZwaU8qJyknKCYpKikrLzVEYHdzam5+g3p0b3FmXlxcYGJmZmNnbWxtXC4mJisrME1nWVJROSoqKyssLC0sLC0uLS0tLy8xNDU4NzU1Njg3NUBQKyotLCwrKysqKysrLCooJyYkIh8eHh4eHh4eHh0dHh8iIiIjIyQkJSUnJygoKi85ODxGTFJTVFBUWFVUUU9RT1FTVVZXXmFiX2JmY11VVFJRTTo1Ozk0MDAuLi4uLS0vMDI1Njg0NDg5OzYwJyMjJSUrNkZbc4CEhYaDem1gVEIuJSQsOUFGR0ZFQUNCPDQ0NDIyMjEwMDAvLSonJCQkJCQmKDRIX3WEi4yMi4qDe3FhV1lganN5goKDgHx3cWpnaGRkZGFgYWZrbGxjW1dYV2BlZmFhW0xVa1xKRUZLT1hiaXN6fICChISEhYaGiImJiYmJh4eIh4aEhIF9e3dybmpmZWVkZmZmZmZmaWlqbW9yc3V8iJORi4iHhoWFhYWEg4SDgICBhYSBgYB/fnx6eXh2dnNxcnJycnJxcHBxcXJzdn2Gi4+QkJCVkI2LjIqHhoqQkI+QkZGQjoqHh4eKi4qLjImJh4aEgjIyMjIyMjMzNDQ0NjU1NDQzMzQ0NDQ0NDU1NTU1NTQ0NjY2NjY2NjY1NTY2NjY2NjY2NjY3NjY1NDQ0NDIxMTExMTAvLi4tLS0tLCwsLC0tLS0sLCsrLCwrLCwsLSwrLC0tLS0sLCssLi4tLS0tLS0tLS4uLi4tLS0tLS0uLi4uLy8uLS0sKissLC0tLzAxMjU3ODk8Pj9BQkFDRENEQ0REREVFRUdIS1FZX15cY3BrWkw/My8uLTBBaXBsZGZtc1ktR2x3dW1ZNSYoKScpKSosLTE7U3F4bGpyfHx0b21xbWBdW19hY2ZnaWpsbV8uJSosLjFQZV1XVVY6KycoKCgoKSotLi8tLCwtLjA0NDUzMTQ0MzNLeFIhLy8uLS0tLCsrKisrKignJiUiHyAgIR8fHh4dHR4eHh8fICEhIyQkIyImJiYoLDM3PUVKT1NXU1NQUk9RTlFPUFJUUlpgZWZnaGRkWk4+UU5ZQDA7PTcyMjAwMDAxMDAxNjg4NjI0NTIqJiMlJig0Sl5wgomLi4yNjo6LhHprVDEpOkVNSUE/RUZGRUE7Ojg6Ojo8PDo4NjMsJiEgIiIiJSc3TmR3iIyLi4uLhn1uY1VTWWNrdHuAhoWDgHp6eXh4d21sbm11eXVwa2xxb3NyaWtqa25vXU5UT0dDTVVaYmlyeHt+gICChYaHh4mKioiHiIaGh4eEg4J/fXl1cG5qZ2dmZmZlZ2dmZ2lqa21wcnZ2f4+RjoqIh4aGh4eGg4OFgoCAhIeDgYGAgH58enl4dnZzcXFxcXFycnFxcHBxcniAh42PkZCUko6Mi4uIiIiLkZCQkpKQjoqGiIiKi4qMjIuHhoSEg4MyMjIyMzMzMzQ0NDY1NTQ0NDQ0NDQ0NDQ1NTU1NTU0NDU1NTU2NjY2NTU2NjY2NjY2NjY2NjY2NTQzNDQzMjIyMTEwLy4uLS0tLSwsLCwtLS0tLCwrKywsKywsLC0sKywtLS0tLSwsLS4uLS0tLS0tLS0uLi4uLS0tLS0tLi4uLi8vLi4vLiwtLi4vLzExMzY4OTw+P0FCREVGR0dHR0dHSEhJSUlLSk5VXWRnZ2FkZ1tMPzIvLi0wNFRwa2lkaHJ1SjxhendwYz0lJyYnKCkqKy0wQWB4dmtseH54c21sb3ZkXVxbYWNlZmZpa2xdLyYqLC0zU2dbWVtYTjkqJyYmJykoLTAwLy4rKy0wMTIzMTE2OTlJZYCHNiYuMDAvMTEuLi0sKysoJyYlJCQlJSIhIh4fHh0eHh4eHh4gISAhISAhIyIiJyktLzc/REZJTlFMTlBSUE1KTE5RUlJTV11lZmZoZ2RaVVZLSVpONjc9OjYyMTExMTExMjc4ODY0MjMwKCUlJyxDYXiCiY6Oi4mLj5COj46NhXdPMDpCTUI+PEBMSklEPzk2Nzo7PDw5OTk4LSQgHyEkJCQqP1NpfYmOioqMjIqBdGRTS1BaZW92fISGhoWDgIB7end1cXN4enl4dHVmYWRranBxb25nX1RXZ2JmVExUXGVqc3Z6fX+AgoaHiIiJioiHh4eFhoaFhIGBfnx4dG9taWZlZWVmZWdnZmdpamxucXF0d4SSkZCMiIeGh4iHhoSEhYGAgoaIgYGAgYB+fHp6eXZ0c3FxcXFxcXFvb3BwcXJ5gImOj4+SlZKOjYuMiYiIjJGQj5GRkI2KiIiJiouLi4uKhoSDg4ODMzMzMzQ0NDQ0NDQ1NDQ1NTU1NDQ0NDU1NTU1NTU1NTU0NDQ1NjY2NjQ1NTY3NzY2NTY2NjY2NjY1NDQ0MzMyMjExMC8uLi0tLS0tLS0tLS0tLSwsLCwsLCwsLCwsLCwsLS0tLS0tLCwtLSwsLS0tLS0tLS0tLS0tLS0tLS4uLi4vLy8vMDEwLi4uMDEzNTU5Ojs/QUNEREVHSUlKSkxLS0xMTEtMTk9TWWBnbXBtZFxVSz82Mi8vLy87X3BoZWRqdGtAVXd5c2lGKCcnKSkoKSotM0Zpe3Jrbnx6cW1rZGF2a1xdXGBjZGNjaGpqXTAnKistM1hoWllZVlJKPiwmJicnJysyMy8uLiwsLS4uLzI0PkZQYXiKlHcfKzEzMjM0MzIxLy0rKCglIyIjIyMjIiAfIB8eHh0cHR0eHh8fICAhISAhIyQmKS0zOkBERUZISEdKTE5PTk5NTVBPUVVcYGZlaWpnZFtSTUpaZVhGPzw6NzMyMDExMjM2Njg3NjMzMisnJylBaYGJjpGSkZCOkJGRjIyNj5KGbEI/RkxFRE1JVFlVT01JQj09PkFBPj4/PDIoJCMlJSYnLkJYbYGNjYyLi4uJg3llTkJIUl9pcHiAhoiIhYWAfnl2dXR1cXR3d2tmY11aYF5iZmJbYVxaPUFRZF1eW19lbXJ2enp8f4KFhoeJiomIh4WFhISCgoF/f316dnNubGllZWVlZmZmZmZnaWpub3NzdHuOlJSQjIqIiImJiIeFhIWAgIKHh4KCgYF/fnx5eHl1c3JwcXFxcHBwb29wcHB1e4KJj5CPkZSRjY2MiIaHiIyRkJCRkY+LiImJiouMjIyJiIWEgoKEhjMzMzM0NDQ0NDQ1NDQ0NTU1NTQ0NDQ1NTU1NTU1NTU1NDQ0NTY2NjY0NTU2Nzc2NjU2NjY2NjY2NTQ0NDMzMjIxMS8vLi4tLS0tLS0tLS0tLS0sLCwsLCwsLCwsLCwsLC0tLS0tLSwsLS0sLC0tLS0uLi0tLS0tLS0tLS0uLi4uLi4wMzM1NDAwMDIzMzc4PD4/Q0VGRUhKTU5OTk9QUE9QUFBPUVJSVVphaG5vc3BiUkM+NzU0My8vMUNqcGZlZWx5Xk50fHZvUCsmKCoqKCgqLTJKbXlvbHKBeG5sZ2Jkb3BiYF5eYWNhYmVpaFwwJyssMDZfZVtdXVtQT0xALignJicoLjIvLSwsKissLC03Qk5ZaXiEjJaYWx4tNDU2NjMyMS8tKyopKCYjIiIiISAeHR4dHBwcHB0dHh4eHh8fICAgISMkJCYoLTI2OT5BQkRFRUlOS09QUE9QTU9TVlxsX2FvbGpjW1FMWWVfVU9JQTk4ODUyMjEyNTY3Nzk4NjYyLCg5YoKHjJCTl5eUk5WWko+Lio2SjntSPEZJSkpLTlNWWFhcYWFeVVVRT05NR0E0JiMjJSYoKC5BV22Bj5CMi4uLiIF1ZEk5PUpXYGt2fYSHiYmIhoJ9fn50amFkYV5gaF1hWVVXYWZhV1phhX9BQ1dfW2BkaW9zdnh5fH+DhYiIiomHhoSDg4SCgX9/f358eXVybWtoZWVlZWZmZWVmZ2lqbm9zc3R8kJSUkY2JiIiJiYiGhYSDgICCh4eBgYGBf358eXl3dXNycHBwcXFwcG9vcHBxdnyEi4+Pj5OUkI2Mi4mHh4mMkI+PkI+NjIiJioqLiomJiIeFhISEhYkzMzQ0NDQ0NDU1NDQ0NDQ0NTU0NDQ0NDQ1NTQ0NDQ1NTU1NTU2NjY2NjY3NzY2NjY2NjY2NzY2NDU1NDQzMzMzMTEwMC4uLS0tLSwsLS0tLC0tLS0sLCwsLCwsLCwsLCwsLC0tLi4sLCwtLCwtLS0tLi4uLi4uLS0tLS0tLi4vLy4uMDE0NTc3NjY3Nzk5PkBBQkZHS01NT09RUVNVVVRUVFRTU1NTVVZcY2lxcXFvZVtQQzw4NTQyMTA1UHFpZWZmcnVdcYB5c1kwJiYpKikpLC41UnF2bW11fnFlZ2dpaWl0aF9eXF9gYGNkZ2haMCYsLTE6ZWVeYF5bT01OUUQtKSgnJScvLyspKyoqKy84R1dibnuGioiWm5M2JC8zNDQ0NDAwLS0uLSwpJiQhIR8eHR0dHRwcHR0dHR0dHR0dHh4gICEiIiIjJSktLjE2Oj5AQkNFTVNSUU5NSUhNUVVbZWpvcGxtamBTTktgY1VQUE5JPzg3NDMzMzQ0Nzg6PDw8OTQ5Wn+Lio2QkpeWk5WampeSjIqKjJGFXj5JSUpITE1SVFpeX2JjZF1aXl1aWFRFMCUjIyUlJiYtQVNpfYyOjYyKioR8cGJFLzE+SlhlbHeBh4uNjImHhoWCgHhqYVpZXlxXV1dcXl5famVYaYOIfUxaYV5aWWZvcnN2enx/goWHiYmHhIWFg4KDgX5+fn59enh0cWtrZ2VkZWVlZGVlZ2hpbG5wc3NzgpOTk5CNi4eHh4iGhYSDgICBg4mGgYGAgIF+fHp4dnVxcXBwcG9vb29vb25vcHd9hY2PkI+Wk5CMjIuJiIiLj4+Pj5GOjIiIiYqKiomJh4eGhYSEhIaNNDQ0NDQ0NDQ1NTQ0NDQ0NDU1NTU0NDQ0NDQ0NDQ0NTU1NTU1NjY2NjY2Nzc3NzY2NjY2Njc2MzQ1NTQ0MzMzMzExMDAvLi0tLS0sLC0tLSwtLS0tLCwsLC0tLCwsLCwsLS0tLS4uLCwsLCwsLi4tLS4uLi4uLi0tLS0tLS0tLy8xMzQ0Njg7PDw8PDw7Oz1ARERISkxOT1FSU1VXWFlYWVhYWFhYWFpbYGZrcHNxb2VaUVBLQTg0MzMyMDhecWdkaG52dXiDgHhhMygqKCoqKywuPFp4c21sc352amlpaWlqcG1hXVxeY2FiZmhmWTArLjM0P2ZkXl1eWk1KUFRTQywnJiQkJiouKi0zMTdBS1docHyCi42HlJqdeB0oLzI0NDMxMC8sLS0rKyklIyEfHh4dHR0cHBwcHBwcHBwcHR4fHh8gICIhIyYoKiwsLTI3OTxAQkdNUFFJQkhLTlNZX19lamdsbmlcVFZNUmRYU09QUE1IQTgwLzEzNjY2NjY2PDg9WXqKi4uMkZGTk5GQlZWXko2IiI2QiWxGRklJTE1PUVNWWVxeX19cXFtcW1hRQiwkIiMjJCQmKTdNY3iGi4uLiYiCeW5YPSwpL0BMWWV0foSLjo2Mi4qHgoB5dnRkZWZlWlpeampnX0xITmuFiI50U1BMUVlnbnN1dXd8gIKEhoiIhoWEhYSAgYB+fHx9fXt4dHFraWVlZGRkZGRmZmZnaWxucHF0dYeVlJGOi4mHh4aGhYWEhIJ/gIKHhYGBgIB/fnp5d3RzcXFwb29vb29vb29ubnJ4gYqQkJCRlpOOjY2MiIeHi46OjY2OjIqHiImKioqJiYeFhISEhYWHjjQ0NDQ0NDQ0NTU0NDQ0NDQ0NDM0NDQ0NDQ0NTU0NDU1NTU1NTY2NjY2Njc3Nzc3Nzc3Nzc4QUM7NjY0NDQ0MzIzMTAwMC8uLi4uLCwtLS0sLS0tLS0tLS0tLS0tLCwtLS0tLi4tLS0tLS0tLS4uLi4uLi0tLS0tLS4uLi4tLS8vMTM1NTg7PUFBQkJAPT1AQ0ZIS05QUlRVWFlbW1tcXVxcWltbXFxeX2JobnN2dHFnXVRMUVVQQjUyMTEvPmVuaGZocXl+gX95aT4lJyooKSkqMEJkeW9sa3GAdWtoZ2lpZ2ZsY19dXmJiZGdmZ1YzMTExNEdmY11fX1lGRk5TVFJDKyYkIyMnNj02OT9FT1hganiBhYqNj5OWm5lVHSosLjEwLy4uLi0sKysqJyQiHx4cHBwcHBwcHBwcHBwcHBscHR4dHR4fIiIlJyorKyssLzM3OkBKS1FRTkpPTE5QU1deXl5hY2FhWlZZU1VjXlFPTk5OTEhFPjcyLisvLzAyMzQ1T3OHioyKio+RkI+AcHOAjpKMh4eKkItySEFISUpMTlFTU1NWV1lXV1xeXlxYVUUsISEgIiQlJCc0SmJ3hI2KiomGfnVpUjMoNTY+RE9eb3yCiY2OjIyKhYKAenRuZVpXVlheZGpkZWRSTFt7h4mOkI19b2ZbVmFsb253fYGEhoeHhoaFhIOBgoB/e3x7e3t5eHRva2hlZGRjY2RkZWVlZ2hsb3FydHmNlpSRj4qJiYmHhYSDhIOBf4CCiISCgoCAf3x5dnZ1c3FwcXBwb29ubm5ubG90e4SLkJGPk5aSjoyLiYiGh4yOjY2NjIuHhoiIiYqJiIiGhoaEhYaFiJA0NDQ0NDQ0NDU1NDQ0NDQ0NDQzNDQ0NDQ0NDQ0NDQ1NTU1NTU2NjY2NjY3Nzc3Nzc3Nzc3OERXTjk2NTQ0NDMyMzEwMDAwLi4uLi0sLS0tLS0tLS0tLS0tLS0uLi0tLS0tLS4uLS0tLS0tLS0uLi4uLi4tLS0tLS0uLi4uLS0vLzIzNTc5Oz9EREVGRUJBQ0VJS05RU1RWWFtdXl9gYGBgX2BgYGBgYmRna3BzdnRya2BXTUhESE1LQTQxMDFHa2tkY2hwfYWAenBWMCgqKCstMTdKaXVta2hvem9qaGhpaWVjZWhhYF9eYmRlZWZVMzExMTJQZ2FfY2BXRUZLUFFSUD8pIyMjJTFETkRDTVNaYml5f4SIiZCNkZegljsfLy4wMC8vLi8uLSsrKickIiEeHBwcHBwcHBwcHBwcHBwbHB0eHR0dHiAhIyUmJiosLC0vMzc/REVLTU5LSUpNT1FTV1peXmFgYl5ZVVNVY11RUE5OTkxIRURDPjgzMC4sKy8vRGmDhISIioyNjoh3VT1BWXiPjYaFioyMdVBESElJSUxNTk9SU1VSUlRXWVhWUlBDLiEhICIkJSQmMkVdcoKKiomGg31zZlIvJjc7P0FNYW55f4WJjYyMi4aCgXlza2NZU1FQS09WWF5fXl92iY2OkZWZnJufn5d9V1VbVFVbYGNwfoGDhIODgH9+fHt6ent8eXdzbmpnZGRkY2NkZGVlZWdpbXBzdHV+kpeUko6MiYqKioaDg4SDgX+Bg4mDgYGBgH98eXh2dHJxcXBvb29vbm5ubm5wdXyFjJGSkJSVkI6Mi4mIhoeMjYyMi4uJiIeIiImKiYiIh4aGhoaGhYiQNDQ0NDM0NTU0NDQ0NDQ0NDQ0NDQ1NTU1NDQzMzQ0NTU2NjU1NjY3NzY2Nzc3NzY2NjY2Njc6R048NTU1NDQ0MzMxLy8wMC4uLi0tLS4uLS4uLiwsLS0uLi0tLS0tLS4uLS0tLi4uLi4uLi4uLi4tLS0tLS0tLS0tLS0uLi4uLy8xNDY5Oz5CSEpNTUxJR0dKTE5QU1dZW15fYmJjZGRkZGNjZGRlZWZmam5xdXZ3cmxjWlFKQ0JCRklJRDoxMFBvZmNiZnJ+hH55a1dDNTM2OkJKWW9xamdlbnVta2lqamhlZWNtZGFgX2JkZGRlUzAsKiwyW2lkYWdoV0lLTU9PT09MOSYkJSgwQVZYS0hSWGFncnuBh4mHjJCUmp6EJSguMzIwLy8uKykqKiooJiMgHx0dHBwcHBwcHBwcHBwcGxsdHR0dHB4eISIiJCYnKi0vMjQ6QURHUFRZWVpbXV5lbXZ1c3Rwa2ZgX1pQV2ZgU1BPT01LSUZEQkJDPTo0MjErMlx+goODhYeKiYBtSyooKT1jg46HhIeMjXZQQUlKS0tLTU9PTk5OS0tQU1NPTk1LQy4hISIiJCUlKDJIXXKDiYeGg4B7b2JNLSkrLzY/TWFsdXyChYiMiomIhX95c2tmWVVRUFJdX11cYmdve42SlZugn6KlpJx/V0xOU1FKR0A7QUxWbH6Cg4F/fnp5eXp7enl2c21oZWRkZGRkZGRlZWVnam1xc3R1hpaVlJGNjIuLi4uHgoKDgoGAgYaJgoCAgoCAfXh3dXNwb3BwcHBubm5ubW5vcHV+h42RkZCVlI+OjImJhoaIjI6Ki4yLiYeHh4iIiIeGhYWGh4eFhYSKkTQ0NDQzNDU1NDQ0NDQ0NDQ0NDQ0NTU1NTQ0NDQ0NDU1NTU1NTY2Nzc2Njc3Nzc2NjY2NjY2NjU3OjM1NTQ0NDMzMTAwMDAuLi4uLS0uLi0uLi0uLi0uLy8tLS0tLS0uLi0tLS4uLi4uLi4uLi4uLS0tLS0tLS0tLS0tLi4uLi8vMzU3OjxARElNT1JSUE1KTE5RU1VYWl9hYmVlZ2ZmaGhpaWhoaWlpaW5xdHV2dXJsY1pUTUZCQD49RE1ORT8+XGxkY2Npc3+BfXlyZlxVVltgZGxybmlnZGx4b2lqaWhmYmRibWxmZWNkZmRkY1IwKSoqPGdpZGZlZ09MT01OTk1OTks4KCguNjpLXFpMUVldZG13foWIiYuOkpabm2geKC8vLi8tKykoKCkpKCckIR8eHh0cHBwcHBwcHBwcHBsbHR0dHRweHiEiIiMlJSksLzExMkZXZGxxcnZ4enZydHR2dHJ0c3N0cm1hVVhlYVRPTk5OTElGREJDQkRGSUEwL0Fvgnp7foOEhX1hNyUoKSUyV32MhoOFiolzSURJSktLS01OTk1NSUZLTE5OTk9LSUItISEiIiQlJSgzSV90goeHhIB+d25eRigrMy8qM01faXF4fIGDhoiJiIeBfXhwaWViW1VbXF5cXWFncX+Kj5SZoJuShWlTSFZhYWluXE1KSEdHREJKZnyCf3x6eXp7enl4dXJtaGRkZGRkZGRkZWVlZ2ptcXN1d42Xl5KOjIyLjIyMiIKCg4KBgIGGiIGBgYKAfHp4d3VzcG9wb29vbm1ubm1ub3B2f4iPkY+QlJORjoyJiYiHio2Ni4qKiIeIiIeIiIiHhoWGhoeHhYWFjpE0NDQ0NDQ0NDQ0NDQ0NDQ0NTU1NTU1NDQ1NDU1NDQ1NTQ1NjY2NjY3Nzc2NjY2NjY1NTY2NTU2MzQ1NTU0MzMzMzIyMjExMC4vLi0tLS4uLi4uLi4uLi4uLi4vLy4uLi4uLi4uLi4vLy8vLi4tLS0tLS0tLS4uLS0tLS0tLS0wMDM2ODs/Q0ZLTlJWWFdTT1BRVFdaW15iY2ZlaGlqa2tra2tqa2xsbW5yc3NzdXRwa2JdVE5LRENAPjw6PUNFRU9naGRkZm95fHx3eXNwcHBycm9wbmhlZmJre3BnZmZmZWNjYm12amZlYWRjZGJRLCoqLElsZ2ZoZ2ZLS09OTk9OTExLSDgyNTk5PVNaVE9TWl9pcXyEh4mLkJGVmpuZQx0qLCwqKionJyYmJiYmJSMgHx4eHhwcGxscGxwcHBwcHBsbHBwdHR4gICEiISYnKi85TmFoamppanB5eXZ1c3RzcW9vcG9ucHJydHNxbWBVUU9PTkxJR0VDQkJFSlFgYFBbe4B7fHyAhH5tOB0mKCUnL053ioaDhoiCaENESUpLS0pLTk1NTEZGSktMTEtKSUc+LiEgIiMkJCUoM0tgd4aJhYJ+e3RsXEcuJjEpKDpQW2VscXd7foOFhYWEg4B7c21pamtoYVpeY2drcHiCi4+QkIJCLjA7TV1gbnF0ZlZYY2hpbW1oXlJWZ3l7eHl4enp5eHVwa2ZkYmJkZGRkZGRlZWdrbnFzc3uSl5WQjouLjIyOj4eCg4GBgICBiIeBgoKDgX58eXZ0cnFwb29vb21sbGxtbW9zeYKKjpCPkJOSkIyLiYmIiYyOioqJiYiIh4eHiIiIh4eHh4eIhYSEhpCQNDQzMzQ0NDQ0NDQ0NTU0NDU1NTU0NDQ0NTQ1NTQ0NTU0NTY2NjY2Nzc3NjY2NjY2NTU2NjU1NTU1MzU1NDMzMzMzMjIxMTExMC8uLi0uLi8wMC8vLy8vLy4uLy8uLi4uLi4uLi4uLy8vLy4uLS0tLS0tLS0uLi4uLS0tLS0tLzAvMjg7QERITFFWWVtbWlVTVFVaXF5iZWdqamxtbW5ubm5ubW5wcHJzdXZ2dnRzb2liXVVQTUhFQkA9OTg1NjtDUmZlY2Vpc3l1eHZ0dHV4dnNvbGZiYmViaX1waWpoamhpaWpve25paGNjZWJeTiwqKy9YbGhmam5hRUxQUE9QTkxLSUdGQj88PTs9RTk8S1ZeZm5yfISIio6Pk5abnoksISYoJycmJiYlJSQkIyIhIB8eHh4eHB0dHBscHBwcHBwbGxwcHR0dHiAgISMiJz9aZmdkY2RlZ3J4eHV0dnRzcm9ta2tsbG5wcHJ2e310XFBMTk5MSEZFQ0JDREhTYW1yeoJ+e319fX55XSwkJSYkJC9OdIqGg4SHgFo5REhMTU1MTU5NTEtGSEtMTU1LSklHPi4jHyEiIiIlKDhQZnqHh4J+fnt0aVg+KywwLC5FUVpeZ2txdXp8fX6CgYB/fHl1dHNwbmdlZmhrcXiDioyNi41cHzJETFxiYV1uc22Gn6Oppp2TiICCgW9nbXZ3eHp5d3hzb2plZGJiZGRkZGRlZmdpbW9vcnV+l5mTj42Mi4qMjo+Hg4GAgYGBgYiHgYKCgoB9e3l2dHJxcG9vb29sbGxsbW1vc3qDjZGRj5CRkIyMi4mJh4iMjoqKiYmIiIeJh4eIh4aGh4eIhoOCg4mQkDU1NDQ0NDMzMzM0NDQ0NDQ0NDQ1NTU0NDQ0NDQ0NDU1NTU3NzU1NTY2NjY2NjY2NjY2NjY2NjU1NTU1NDIyNDQzMzIxMTEwMDAvLy4uLy4uLi4vLy8vLy8vLy8vLy8vLy4uLi4uLi8vLy8uLi4uLy0tLS4uLS0uLi0tLS0tLS8wMTQ2OkBESExRWFxeYWBaWFlaXGBgZGhpamxtbm9vb29vb3FxcnJzdHd3dnV0cW1mYVxXUU1KSERBPzs5NjIxMzxXamNmZW9yZ2hnZmpramlmZ2lmZmVkYGZ4c29taWlmZWdoaH1yaGZkYWdhXE4sKik8Z2toaWxtU0JLT1BRUU9OTElHQ0JAQj4/OTs1NEJRWmJnbHWAg4eJjZGVl5iacx4gJCcmJyUlJCQiIiEhHx8fHx4eHh4eHRwcHBwbGxsbHBwdHRweHB0fICAiN1tsaWNhYGFjaXJ6d3V1d3Z0c3Jwbm5sbGxra2xvcHR6gHdaTE9OTEtHRUNDQ0NKVGBrdICEfXl7e3h1b0opJiYlJiYuTnSIg4GFhXpPN0JGSkxMTUxMTEtIRUlLS01LSkhGRD4uIyAgISEhJSw8VGt+iYeBf315cmdTOCInMTg9TFFaXGBma25xcnd5fH5/fn58d3h3dXFxcW9qbnN6gYeMi4mIQSc3RVFbXVFVYn2as7y7urmxoo5+cI2ZjXd0fHp6enl2c25rZ2NiYmRkZGNjZGVnaWxucXNzhJmXko+Ni4qLjpKPhIGBgoF/gYGIhYGDgYB/fXp4dnRycG9vb25tbGxsbG5sb3R8hoyRkI+RkI+NjIuJiYmKjo6Li4mIh4eIh4eHh4aGhomIiISAgoaNkZA1NTQ0NDQzMzMzNDQ0NDQ0NDQ0NTU1NDQ0NDQ0NDQ1NTU1NjY1NTU2NjY2NjY2NjY2NjY2NjY1NTU1NDU0NDQ0MzMyMTExMDAwLy8uLi8vLy4uLy8vLzAvLy8vLy8vLy8uLi4uLi4vLy8vLy4uLi4uLS0uLi0tLi4tLS0tLi4wMDE0Njo+QUhMUFZcYGNkYV5cXV9hYmZoaWxucHBxb29vb29xcXJzdXd4eHZ0c29rZmFcVlNQTUpGREA9Ojc0MTExR2plYWNpbFhLUlVUVE5KS1doZmFfXFpkeHBqaWRnampnZGV4eGtoZmNoZ1tKLCcuUG5paGxvakVFTFBTVFJRT01JRUM+PEBFPjs5PTk/VFZbYGdtdn6EiIqNkJKVl5hYGiYmJCQkJCUlIiIhISAgHx8eHh4eHh0cHBwcHBwcHBwcHR0cHhsaIB00WmtqZWBgYmNjbHZ5dXZ1eHh4eHVzcXBubmxsampqa2xuc3qCeVxPTkxLR0VDQkJFSlJhbnR/gH15d3dzcGA5LCwoJicoL09zh4KAhIR2STdCRkpMTE1MSkpJQ0VJSklJSUhJR0U/LSQjIyEiIyUsQFhtgIiHgoB/enJkUDUiIiYyQk1QVllcYWVpa21xdHh6fHx8e3t8e3d0dHRycHR4foGIjIuIgjcxPEVTX1ZRTW6gtr66trejq7SZjpOanZaNgGZYcHt5dnJtZ2NjYmNjY2NjY2RlaGptb3FzdYqbmJOOjIyLi4+QjoOCgoKBgYKDioWBgoKAf316d3V0cnBvb29ubWxsbGxtbXB1fYeOkY+OkZCOjYyLiYmJio+OioqJiIeGiYeHh4aFhoiJh4WBgoaKj5GQNTU0NDQ0NDQ0NDMzMzM0NDQ0NTU0NDQ0NDQ0NDQ0NDQ2NjY2NTU1Njc3NjY2NjY2NjY2NjY2NTU1MzQ0NDQ0NDQ0MzIxMTAwMDAwLy8vLy4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLi8vLy8uLy8uLy8uLi4uLi0tLS0tLS0tLS8xMzU4O0BFSk9UW2FlamllYV1fYmRmamxqbW5ucG5ubm5ucXJ0d3l6eHd2dHJuaWRgXFdUUk9MSEZCQDw5NzMxMjpeaWFgYmtYMDQ7OjYyLzdOaGRcWldTXXhyaWdiZGhqaGlscn1tZmNiam9cRycoQGhraWpwcF0/SE5TVFVTUVBOSUVBPz08PkVCPThAQVJkUVlhZmt1fYKGiYuOkpaXkT0cJigoJSYlJCMjIiIhISAgHx8eHh0dHR0dHR0dHR0dHR0dHh4fHyJFbG9lXlxgZGRmanh6d3Z3eHl7enl4dnVycXBxbWtra2lpamxye4R6W1BMSkZFQ0RDRElUYW50fnp2c3N0cXJaNy8wLCgnJzJRdYSAfoKDcD0zQUhLSkxNTEpJQUJHSUlJSklISUhGPiwiIyUjJCUnL0NbcYOJhYOAfXlwYU0yICElOUtQVFZVWFxeY2Vna2xzdnh5e3t7fX56enh4dXZ5fH+Dh4mFhH8zMzxEVFtMRViUtL29q5aopKy5spGGj56VjYV3X254d3Zva2dlY2JiYmNjY2NjZWdqbW9xc3eOmZiSjY6MiouPj4qEgoODgoKChYmDgYKDgH97eHd1c3Jwb29vb21ra2xsbG5xdn+Jj5KOj5GQjo2Mi4eHioyQjIuMi4eJiYmIhoWFhYiJiYaDgoWJjpGRjzU1NDQ0NDQ0NDQzMzMzNDQ0NDU1NDQ0NDQ0NDQ0NDQ0NjY2NjU1NTY3NzY2NjY2NjY2NjY2NjU1NTM0NDQ0NDQ0NDMyMjIxMDAwMC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy4vLy8vLi8vLy8vLi4uLi4tLS0tLS0tLS8wMTM1Nzo9QkZNU1thZWptamZjYmRlaGtram1ubnBubm5vcHFzdnh7e3h3dHNxbWdkYFxYVlNQTUpHREI+Ojc0MjEzTmpgXWBnZzUnKisrLC45UmVfV1ZQTVZ4c2hnZ2Nla2Vqa26CdGlmZm12YEMmQmRqaGlscHFOQktQVVZWVFJPTEdFQz89OTpASko/OT5FW1hQWGBianV7gYSJio6SkpWGLSAoKScnJyUlJSIiISEgIB8fHh4dHR0dHR0dHR0dHR0dHyAfHS9dbmtfXmBjZWdqcXp3dXZ3eHl7fX19fXl3dnRycW9ubWtqZmhna3N5gXFVTEpGRUNDQ0RKVGJscnx6cnBwcW5ubWFFMS8vKys1VXeFfn6BgGkyIzVFSktOTUxHPz1DSUtKSkpJSElIRjwqIiMjIiUlJjBHX3eIiYWDgH13b2BILSMlLEJQVFdXV1laWl1cYGRma3F0dnh5eXt9fX19fHh6fX6Ag4WFgYJ5Nzc7QU1SSkRvpre+toh8oLS6uLaRfoqXlpKYkIJ1dnV0b2tnZWNiYWFiYmJiY2Vnam1vc3R8k5mXkI2MjIuMj4+Jg4KDg4KAgIWJhYKCgoGAfXp2dHJycXBubmtra2tsbGxucHeBio+QjY6Oj46NjIuGhoqPkIyLjIuJiomHhoaFhYWIh4eDgYKJjZCSkI80NDU1NDM1NTU1NDQ0NDQ0NDQzMzMzNTM0NDQ0NTU1NTY2NTU1NTU2NTY2NjU1NjY2Njc3Nzc2NjQ0NDQ0NDMzNDQzNDMzMTExMTExMDAvLy8vLy8vLzAwMDAvLy4vMDAvLy8vMDAuLy8vMDAwMC8uLi0uLi4uLS0tLS4uLi4vMTM0Njc5PEFFTFJaYGZrbm5qZ2ZnaWlpamlrbG5wb29vcnN3eHt8eXh4d3ZzbmlnZV9cWlhTUU9LSUZCPzo4NjIyLz9jY15hZmpHJigqKSsvO1RlW1dSTU5UdHdmZ2hpaWlmaGxwgX5ta2podXpwZ2loaGxwbnBoQ0dNUVVXVVJSTklGRUE+PTs4NTlGST86OUJJUFBWXmZtdX6BhIeKjI+Sk3clIigoKCYlJSQhICEfHx8eHh4eHR0eHRwdHR0cHh0dHR8iIkJqbmJeYGNlZmpwd3t3dHZ4d3t8fn1+fn16eHV2d3RycW9qZ2ZlZmZtc3p8aVBKR0ZDRUNHTFVicnh5dXBtbnBvb3BvbWFHMi0sN1Z5gn9+gH5kMCMkKjtGSEpIPzUzPENJS0xLS0pISEU4JSIiIiIkJCYzTWR7iYqFhIJ9dm1dQykiKjpMVVdaXVxcW1pZVFVaZGhscXR0dXd4foGAf359fX6AgoKCfn6Cckc5QENLSUNNiam2vbZ7WYORqbKqjY6Di5aToaOciHVxcm9rZmJiYWFhYmJjY2RmaGtvcXFyfpaZlI+NiYqLjZKQiYOBgYKAgYKDiYOBgoKAfnp3dHNxb29vb25tbGtrbGxqbXB4g4uPjo6OjYyMjIyKh4aJj4+OjY2KiYiIh4eGhoaGh4WDgIOGjZGTkpGPNTU1NTQzNDU1NTQ0NDQ0NDQ0MzMzMzQ0NDQ0NDU1NDQ0NDU1NTU1NjY1NTU1NTY2NjY3Nzc3NjY0NDQ0NDQ0NDQ0MjIyMjExMTExMTAwLy8vLy8vLy8wMDAwLy8uLzAwLy8vLzAwLi8vLzAwMDAvLi4tLi4uLi0tLS0uLi8vMDEzNTc4OTxBRUtRWF5kanBwbWpnZmhoaWpsa25vcXBxc3d5fH1/fnt5enl3cm1qZmNfXFtYVFJQTUlGQj87OTYyMzA0W2dgX2JoVyglKSksMDxWZlpVUU9QVXJ4aGVlZWJla2hpbXqDc2tqaW98gXp4b2xvcHBxXEFITlBTVVRST0xHQ0A+PDo5NTMyOENHPjE1PUNGUVteZW51e3+ChoiKjJGUaxwlJiYiIiMiIB8fHh8fHh4eHh0dHR0dHx8eHyEeIB8dI05ubGBfZWRkaXJ3enx3dHN1eHp7e3x9fXx8eHR1eHZ0dHRycGtpZ2VmaG1zenhgS0hEQ0RESE1YZnJ4d3Jxbm1vbm5xcm9ta2BUQj9ceoF8foB5WygiIiMhKjhBQTcvOUBCRkdJS0xKSUhENiUiIiIiJCQoOlFpe4iKhYSCf3htWj8mJTFEUlZZW15fX1pZV1RTWV1la21vb21wc3h8fX9/fX+BgYKCgXyCg21WQ0ZFSUVAYZOosre4qo58hpaVm5WalJKSjZObppWDcm9uaGZkYmJiYmFhY2RkZmdsbnFyc4SZmZSQjImKioyRjomDgoKBf3+AhIeCgoKCgH56d3VzcW9vb25tbGtra2xta25yeYSMkI+NjoyMjIuMiYeHipCOjo2MiomIiIaGhoaGhoSDgYGFi5CWlZKPjjY1NTU0MzQ1NTU1NTU1NDQ0NDMzNDQzMzMzNDQ1NTQ0NTU1NTY2NjY2NjU1NDQ1NTY2NzU2NjY2NTQ1NTQ0NDQzMzMzMjExMTExMTEwMDAwLy8vLy8vMDAwMC8vMDAwMC4uLy8wMC8vLy8vLzAwLy4uLS4uLi4tLS0tLi4wMDAxMzU2ODk8QUVJUVVbYmlwdHJuamdnZmhpa2xvcXZ5eXx9f4GCgYF/fnt6d3FtamZiX1xbWFVST0xKR0M/PDk3MzIxM0xpXl1hY2EwJCgpKzA+WGRXU1FSVFhpcmZhYmNhYWlscnBxgHVqZmZocXt6eXVvbnBybk5ESk5PUlJST0tKRUE+PDo3NTMzMS8yQEM6Mzc8P0RUXGFjbnV8f4SFiIaLk5JYGx8iJCEfISAgHx8eHx8eHh4dHR0dHR8iIyQmIyAeLVlva2VkaGhpbnJ1c3Z3dXN0dXZ5enl6e3lyamlpaHF1cXBydndyb2xoZmlscHN3clNJRkZCRUlQXWtyd3Zvbm1ucG1wcnFvamVpb29rb3+AfH59d1MkISMkIyIlIysqKC86P0VHSUlKRUZGPzElIyQiIiQlLT9WbYCKiYSDgH95bFg6Jio7SlVbWlpdX19dWldVU1ZbYGVpa2xqa293enx8fH2AgYKCgn9+g4JtVk9MR0lCQWyapaurqJqQmp2hoKGYkJOZmpiOkJiYiH9za2lkYmJiYWJiYmNjZWdnam5xc3OKnJmWkI2KioqNkY2Ig4SDgX9/f4KFgYKBgYB9endzcW9ubm1sbGtrampqa2tuc3uGjI+Njo6Mi4qKi4eHhoqPjo6NjIuJiIeGhYWFhYWDgoGFio+VlZSRj402NTU1NTU2NjU1NTU1NTQ0NDQ1NTQ0MzMzMzQ0NTU1NDU1NTU2NjY2NjY1NTU1NTU2NjY3NjY2NjY1NTU0NDQ0MzMzMzMzMTExMTExMDAwMDAvLy8vLzAwMDAvLzAwMDAvLy8vMDAvLy8vLy8wMC8uLi0uLi4uLS0tLS4uMDAwMTM1Njg6PT9DSE5UWmBnbnJ1c25qaWdoaGlucXZ8gYODhYWHh4eDgX57endxbmtmYl9cW1hVUk9MSkdDPzw5NzMyMDBAY2BYXWJlQCUoKCovQVtiVlJRVFZWZHNnYGNjY2htbW9rZ3FzaF5fY2ltcnh7eHR0bV1HSUtNTk9PT0tLSkVBPjs5NjUzMzIxLzI8PTQzN0FHUllZYWVtdXl/goaFiI2RkE0YHh8fHx8gHx4eHh8fIB8fHh0eHB4iJSgrLSUgN2FtaGRnaW1tcnh1bnBycnFwb3N2dnd5enBoY2VobW5vcG5ta2tyeHdvaWhqbG1ydHNkTUhEQ0dLVWNvdHZ0bm1tb25rbnRycGxqaGltcnuDgHt+fHNLJCEkJCIkJCQnKispLjpBRUhJS01MRTwwJiQkIyMmJzBEWXGFi4iEgoF/d2hUNCUwQkxSWVpbXmBgX1xXVVNUWV5hZmhpa25wdXF1enx9gIGCgoJ/gISAbltaWlRRSERxnKalo56Vl5iKi5mXlpOWmp2YlZqck5CJgmplZGFiYmFiYmJjY2VnaGtwcHN2i5qYlZCNioqKjZCMhoSDg4B/f36Ag4GCgYF/fXp2c3Fubm1sbGxra2pqa2psbnR+iIyOjo2NioqJi4uIhoeMkY2NjYyKiIeGhoWEhIWFgoKCiI+TlZSUkY+NNTU2NjU1NjY2NDU1NTU0NDQ0NTU0NDMzMzMzNDU1NDQ1NTU1NTU1NTY2NjY2NjY2NjY2NjY2NjY2NjU1NTQ0NDMzMzMzMzIyMTEwMDExMTEvLy8vLzAvLzAwLy8wMDAwLy8vLy8vLy8vLy8vLy8vLi4tLi4uLi0tLS0uLi8vMTIzNTc5Oj0/Q0dMU1hfZmxxd3Vyb2tpZ2hpb3R7gYaHh4eIiYiHhYF9endyb2xoZGJeW1tZVVNPTEpHQz87ODYyMS4vNFNkWldbY1MmJSgrMkNdYVhSUVZZWGByaWNqam5sa21rbGxjZ2llYF1jaW5xdXp6bl5PTU5NTU5OTUxLSklFQj89OTY1MjIvLi4uLzZBPzc+R05XYVVdZGx0e3+CgoaLkZWPQRkbHh4fHh4dHiAgISEhISAgHx4fISUoLzQtQWVtaGVoamtudndwaWtucnBvbm9xdHR1dmtjYWFhZ2ptbnFubGlmanV7c2xsampsbnBxbVdGQ0NITlhlcHR4cW5vcHFuam1ycm9sampoa3R9gn98fX1yQyMkJCIjIyIlJScsLioqND1CR0hHSEU8LyUkJCQkJikyR151houJhYGBgHRnUzEmNkRLT1ZbXF9eXV9cWVZUVFhcYGNhY2Vpa3BwbXV3fICBgYKCgoODf3BkZ2NaVlFPdZ2mpaOdmZaTjo+NjpKUmZWUm52hoJGRjpB8ZmJjYWBhYmFhY2NlZ2lscXF1eY+ZlpKNjYqJio2QioaFg4F+f39/gYN/goOCf3t4dXFubW1sbGtqa2tqaGtrbW93gImNjYqNi4mIiYuIhYWHjpKMjI2LiYiGhYWFhISFg4KDh42UlpWUk5CQjTk5OTk4ODY2NzY1NTU1MzM0NDU1NDQzMzMzMzM0NDQ0NTU1NTU1NTU2NjY2NjY2NjY2NjY2Njc2NjY2NjQ0NDQzMzMzMzMyMjExMjIxMTExMDAvLy8wLy8vLy8vMDAwMDAwLy8vLy8vLy8vLy8vLy4uLS4uLi4tLS0tLi4vLzAxMzU3OTo9P0NHTFBXXGNpb3J1dHBtaWZobHR4fIGEhYWFhoiGhIF/e3ZzcG5saGRiXltaV1RRTktJSEM/Ozg2MjIwLzFDYltYWmBdMiUrLjBAWl1WU1VXWFlgc21kaHBxcW5ucW1ua19dYmlkZmdrbG5nYVVRU1NUUVFPT01LSUhHRUI/Pjs3NjIxMDAvLywtN0ZFP0NITmlkVV9nbHF4fX6DhouRlYk4GBwdHiAgHyAiIiIiIiIiIh8gISMiJy84SFpoaGhrbW1xd3ZsaWdpbGxtbW9wcXF0cl1bW1tfYGVrb3Bub3FtamRpdHdxb2trbWxubnJlSURCSVFbaHF3dW5ucHBwbWZpcnJwbmtsamlxe4SAenx7azskJiUkJSUlIyUnLDEyKyQoNkFER0ZCNysjJCUkJCYqNk1jeomHhIOBgXxyZUwuJjdFS09TWVlcXl1dW1dVVVVYXF5hYmRkY2Npa2pvcnh8gIGBgYGCg3xybmtnZWBcXHyepKKcmZOPiYqHen+Sk5eYlZWZnaKfnpOGfWtjYmJiYWJhYWNjZWdpbHFydHuSmpaSjY2KiYqNkYuFhIKBf35/goiGgICCgX97eHVwbm1sbGxqamtramtqam1xeIKLj4yLjIuJh4iHh4WGhpCSjYuKi4mIhoWEhIWFg4KBhYuRlpWUlJKQj4w5ODk5OTk4Nzc3NjY1NTU0NDQ0NDQ0MzMzMzMzNDQ0NDQ0NDQ2NjY2NTU2NjY2NjY2NjY2NjY2NjY1NjY0NDQ0NDMzMzIyMjIxMTExMTExMTExLy8vLy8vLS0vLzAwMDAxMTAwMDAvLzAwLy8vLy8uLi0uLi4uLS0tLS4uLi8wMTM1Nzk7PkBCRkpPVFlfZWlwdHdzcGxnZ213en2Ag4ODg4WEgoJ+enZ1c3BsaWZjYV5bWVZST01KSEZDPjo4NjMzMC8vNVlgV1hcYUMmKSwwQVxdV1ZWWVlZX3NxaWprbXFsampsbmpqZFhZWVI9Oj5CRlJTV1lZWVZTT09LSkdGREJAPzw7OTc0MC8uLS0tLS84RktGRkNTcmNZYGlpc3p9f4OHjJCUizIYHCEgISEiIyMjIyIkJCUkJCIiKCU1SE1SWmRqb290eHdpY2VkZGdnZ2tucG5valJRWFdbXF9jZmhscHN1dG5qZGt5eXNwbGxtbG9ycFVEQ0pRXW11eHJub3BwbmliaHFzcG1tbW1sdX2EgHx7eWg3JScnJSUnKCYnKi4vNDEqJCUtOkRDQDMqJCQkJCcnLDlQZ3yHhoSDgX95bl9BKSg8RUpOUlZZW11dXFxbW1paW11fYGFgYF9iZWVkaGxweHt9f3+AgIF8d3NzcGtnZmV/mZ6dlo6IhYV+c1Zvi42VmJmUlJednZqYiXl5ZGFjY2FiYWFiY2Vnam1wcnV9lJmWk42KiYqKjpOKhIOCgX9+gIKIhYKCgYB/e3d0cG5ta2tra2pra2hpamttc3qEjZCMjIuJh4aGhYSChYmQkIyMioqJiIaFhYaFhYSEhYqQlJWUk5KSkI6MOzo6Ojo6Ojg3NzY2NTU1NDQ0NDQ0NDMzMzMzMzQ0NDQ0NDQ0NTU1NTU1NjY2NjY2NjY2NjY2NjY2NTU1NDQ0NDQ0MzMyMTIyMTExMTExMDAxMS8vLy8vLy0tLy8wMDAwLi4vLy8vLy8wMC8vLy8vLi4tLi4uLi0tLS0uLi4vMDEzNTc5Oz5AQkRITFJWXGFnbXJ2dnNwbGpudXl7foCAgH+Af398enl1cm9samdlYmBeW1pXUk9NSkhGQz46ODYzMzAuLjFJYlxZW2BUKCgrMEJbXVdVVVdXWFxvdmxucXV5cW9xcmtpa2VdXFpMPT1ASE5UWFlbW1lWU1FPTUlEQ0JBPj49PDo4NTIwLi4uLy8xNTlDTElCMkZeZ11eZGpzeX+ChIaMkJWKMhchICIkIyQkJCQkJCQlJSUkJTVTbGJOSldibHF4e29iYWFjYWFjY2Jna2xuYUFFTFJYWV1iY2RnbXF1dXdzbWlpdH55cW5rbW1tcHJjSEVKVWFydnhyb3BwcG5iX2dxdXBta2pobHJ8g359fXplMSYmJyUlJigoKSkmJSkyNCwmJSUuOz4xJiQlJSgnKC0/Vm+BiIaEg4CAeW5aOCgwP0dKTlFUWVxdW11dW1tbW11eXl9gX15dXmJjYmNnam92eX19fYCAe3V0dHJzcW9whJSalpCSmpqUf3Z7g4mLj5aZm5qYlpaXmJWDfG9gYWJhYmFhYmNlZ2ptcXN0gZiZlZKNioqLjZGTioSDgoGAf3+DiIWBgYGAfXp1c3BtbWtra2tqa2tpamlsbnN8h42Ni4yKiIaFhYWEhIeLkZCMjImJiIeHhYaGhYWEhIiPlJWUlJSTk5COjDw7Ojo6Ojo6OTg4ODc3NjY0NDQ0NDQzMzM0NDQzMzMzNDQ1NTY2NTU1NTU1NTU2NjY2NTU2NjY2NTU0NDQ0NDQzMzMzMjIyMjExMTEwMDAwMDAvLy8vLi4uLi8vLy8vLzAwLy8wLy8vLy8vLi4uLi4tLS4uLi4tLS0tLS0tLjAxMjQ3OTo9P0FFR0tOUlddYmpwdXd2dG1sb3Z4e3t+fnx6fHt7enh2cW9sa2llY2JfXFlXVFJPTUpFRUE9OTc3MzIxLS4vOV1hWVlfYTYmKzBDW15ZWVlaW1tfa3dxbm1weXt4dHdvaGVmXldURzw+QkhNUlZaXFtaV1VTUExIREFAPjw8Ozo4NzY0MzExLzAxNTs/OztKTUZBQl1nX2Bka3J5f4CDhoyRl4gvHSImIyQkJSYjIyEkJCUjKkZodXFkTEFKYHR8eWdfYl5fYWNjY2FhZWlrVD9DSkhPVFdaYWFgZGludHl6d3RxbG95e3JtbW1ta21taVBJTFdmdnh1cXFycXBtXF5mcHRxbWtraWtzfYN/e314YSwnKCcoKCcoKiknJicoLTAwJygoKSovLyopJyYoJSYwRlxzg4iIg4GAgHlqVTEnNUVLSkxQUlRYWlxcXFxbXF1dXF1gYF9gXV5eW1lcYGVsb3R3eXp9fnhyc3R1d3V0doWMkZOgrKyilYF6e4OHjI+SlZqeoZ2VlJiZkoJ4ZGJgYGFhYmFjZWhrbnJ0dIWXl5OQjIyKjI6RkomDg4OCgICBhIiFgICAf3t3dnVxbm1sa2pqamtra2tqa293f4iNjYuLioiFhIODg4WIjI+OjIyKiomIhoWGhoWFg4WNkpWVlJSUkpKSjow9PDs7Ozs6Ojk4ODg3NzY2NTQ0NDQ0MzMzNDQ0MzMzMzQ0NTU2NjU1NTU1NTU1NjY2NjU1NjY2NjU1NDQ0NDMzMzMzMzIyMjIxMTExMDAwMDAwLy8vLy4uLi4vLy8vLy8wMC8vLy8vLy8vLy4uLi4uLS0uLi4uLS0tLS0tLS4wMTI0Nzk6PT9BREVJTE9TWV5ka3J2d3dycHJzdnd6e3p7e3p6enl3dXJvbGpoZWJhXltZVVJPTUtIRUI/Ozk3NjQxMS4uLzJNYVtZW2JPJysvPVhgXFxcXl5gYWd3dW9xd4KCd3Z4cmtoZVVKT0E6PUBDS1FVWFlZWVdWUlBNSkVDQD49Ozo6Ojo4NjUzMjMzNDw9Ozs9PD5TXVpjaWpjZGRtc3l+gIOIj5eXgyscKCcmJSYmJCMlJCEoT254aWBjXks8QVRudGRZW11eYmJiZmVfYGhkTz0/SUNHSE5VVlVXWmBob3R5fHt4dXFsdHx0bGxsa2poaGhYS1JbbXd2cXBxcnFwZVdbZm9zcGxra2ptdH2Df3x8d1kpJygoKSkqKSkoJycnKCotNC4oKCkqKioqKSkqKSkpM0thdIWIhoGBgoF4ZkwtLDxHSktMTlFSVlhZWlpcXFxcXl5cWl5dWl1fX1xZWlxeYmlvc3R3eXdxbnB1dXV1dneCho2gs7auo42Ae4SMi4uLlJqZmp6gnZaUmpOHfHJhYmFhYGBgYmZoa25ydHaImZWRjoyMioyOkZCHgoKCgoB+gYSIhYCAgH97d3RxcG1tbGtqampra2tra21yd4CJjY2Li4iHhYSDg4OGiIyPjoyMioqJiIaFhoaFhYWKkJSVlZSUlJKSko6MPT0+PTw8PDs7Ozk5ODg3NzY1NDQ0NDQ0MzM0NDMzNDQ1NTU1NjY1NTU1NjY2NjY2NjY1NTY2NjY1NTQ0MzMzMzMzMzIxMTExMTExMTExLy8vLy4uLi4tLS0uLy8wMC8vMDAvLy8vLy4uLi4uLi4uLi4uLy8uLi8vLi0uLi4uMDEyNDY4Oj0/QUNFR0pOUFZbX2ZqbnR3dXJxcnR2eHl4eHl5eHh3dXRvbmxpaGZiX11aV1NQTkxJRkM/Pjo5NzQyMi8uLS0uPV5eWVlgYTsoLT1YZWBfXl9jaWlnc311dHyKhXl3d3Vual9RSlBFOj1AQ0dOUVZWV1ZVVVJQTUlGREFAPjw6Ojo6Ojc1NDQ1Nzk9PDw7PTYsM0xeZmdpbm5kYmpxd3uAhIaNlJeFJiEpJyknJiUkIyI1cXlya2VfXVhOPz5RUlZZWVlcXmJiZWVlZWZXRD08QkhFSEZNUU9RVF9ob3NzdHZ5eXd1cHN9eG9sa2tqaGlmW1JUYXB2dHByc3NybV5WWWJucm5qamppbXR+gX99fnVUJygpKCgpKikoKCcoKScpLDIxKScoKisqKywsMC0tLztTaXyIh4SCgYN9c2NDKy8+SUtLTVBQUVJVV1hZWlpcXV9eXV1dXVxcXV5aV1hZW1tgaXBwcXVxZ2htb3N2eHd6gYudrrOrno6FhIJ/goOCgoqXnJybn6GclpKYjYJ+ZmBfYGBhYGFkaG1wcnR3ipiVko+MjIyNjZKOg4CBgoKBgIGEiIV/f4B9e3dzcW5tbGtra2tra2tsbGttcXiCiY2Li4uHhYWFg4ODh4uNjo+Mi4mIiIeGhoaFhYSHkJSWlZSUlJORkZGOi0BAPz09PTw8Ozs5OTg4Nzc3NzU1NTU0NDMzNDQzMzQ0NTU1NTY2NTU1NTY2NjY2NjY2NTU2NjY2NTU0NDMzMzMzMzMyMTExMTExMTEwMC8vLy8uLi4uLS0tLi8vLy8tLTAwLy8vLy8uLi4uLi4uLi4uLi8vLi4vLy4tLi4uLi4wMjQ2ODo9P0FDRUlMTU5SVltgZ2xwdnh4dHJ0dnZ2d3d1dXZ2dXRzbm1rZ2ZlYF9dWFVRTkxKR0RCPz07Ojg2NDEvLi0tLTJRYFtaXmJSKiw5VWRjZGRlbHBwaXJ+en2HkIp8dnx1bmZgVUs9Ojk8P0FGSE1SU1RTVFNSUE1KR0VCQD49Ozo7Ojc1NDQ0NTY7Pj08OzszLysqPFlmZ2pydGhjZGt0en6Cio+UmIcsIikpJycnIx9AcnZuampraWpmWkE4SU1FT1VWWVxhY2RlZ15DNEU/QVFLRUhISUxOU11mbHJ0dHN0dXh5eHZ4fX11bWpsaGZmY2FXWml1d3NwcnN0cGhWVFhhbHJuamtpam51fn98f31ySyQnKSkpKCkoKCoqKikqJykwMy0nJygqKioqLTAzMzlHXHOFh4WCgoF/fHJgQSszQkpLS01QUFBQUlRWWVlZWlxfX19dXFxbWV9eW1RVWV9gWmJqam1vZFpgZ25zd3l8gIWRoKipnZWOh4eHhIGBgYKHjZWcm5men52Vl5GKfm9fYF9fYF9jZmttcHB1douYlZKPjIyLi46TjYWCgYKCgYCBhIiFf3+Bfnl1cnBsbGxra2tra2trbGxsb3J5gomNi4uLh4WFhYSEhoqPj4+NjIqJiIiHhoaGhYSIjpOWlpWUk5OSkJCPjotBQEFDQkA/Pjw8Ozo6Ojg4Nzc2NjY2NTU0NDU1NDQ0NDQ0NDQ1NTY2NjY1NTY2NTU1NTY2NjY1NTU0NDQzMzMzMjIyMjIyMDExMTEwLy8vLy8vLi4uLi0tLS4tLS4uLi4uLi4uLi4uLS0tLi4uLi4uLi4uLi4uLy8uLi4uLi4uMDI0NTg6Oz5AQkRGSUxNUVVYXWRobHF1eHRydHR1dXVzc3NydHJyb2xqaGZkYl9bWVZTUExKSEZDQj8+Ojg3NjQxLy0sLCwtQV9dWVpeYj0pN1FmZmlrbnF1dHB0fH+Ciop/cG11c2xqX1hINzg5Ojw9QUVLUFFQUFFQT05PS0ZCQD8+PTs7OTg4NTQzMjM3PT4+PDw4MS4uLiswSmNoaHFxb2dmbXN4fYOKjZOWgSghJysoJyIzc3Vva2ttbWxvb1tDODxPREpVWFpbXF5eW0w5NDU4NkVNSUJJSkpMVFxjZ2ltcHJxcHB1eHp6en19dW5oamdjYWFiXGBwenhxcXFyc2xiUFBXYGpwa2psampxeYF/fH6AcUMmJycoJycoKSopKSoqKSgqLTE1MCcoKCkpKiwyMzQ+UmZ6h4mFgYGCfXlvXTorOUVJTU9PT1BPT1BSUlZXWVpbXl5fYF1ZWFhXXVtUU1VZZWRfZGVoa11WXmZtdHp7f4eMlJ2hoJ6Xk4uLi4aGioqKh4eJkJuamJ2emJaSjYN5ZGFgYWFhZGdpbG9zd3qSmJKRjoyLiYmMkouEg4KBgYCAgYSKhX9/fHl3dHFwb21ramtrampqampqa25zfYWLjYqLioeFhISFg4aLj46OjIqJioqHhoaGhYOFi5KUlZWVlJKRkJCSkY+MQkFBQD9APz4+Ozs6Ojo4ODc3NjY2NjU1NDQ1NTQ0NDQ0NDQ0NTU2NjY2NjY2NjU1NTU2NjY2NjY0NDQ0MzMzMzIyMjIyMjAxMTExMC8vLy8vLy4uLi4tLS0tLS0uLi4uLi4uLi4uLi0tLS4uLi4uLi4uLi4uLi8vLi4uLi4uLzEyMzQ2ODs9QENFRUdKTFBTVlpdY2dscXV1cXFxcHBycnBwcXBtbWxqaGVjYV5aWFZUUU1LSEZFQkE+PDo3NjQyMC4sKysrLTNPYFZVWWBXLDJKYWtsbXF2eHZxcXOAgW10bG52aWVoXlhXQjg6Ojk5Oj1BSE5QTUtMTk9PTkxIQz88Ozo4Nzc4ODU0MzI1Oj9APjw8NzEvLzAvLis1U2pqanVyaGVqcnuAg4mLkJJ2GyQoJygmandtaGpwcnR0eHJaRzw3R0lFU1dZWlpYRTY1Nzo4MTpEQkBCREhJUV1kZ2ZnaGdpbm5wcnZ4d3Z5enVvamhlYV9gYV9kc3d2c3FycnBpWU5PVWBpbGlqbGpqcXyBf3yAf208JScoKSkpKisqKyoqKysqKysvNDcxJicoKSksMTg8SVxyg4yJhYSCgYB3alY0LDpESU1PT1BSUU9OT1BSVVlaXV5fYWBdWVdVVVxfXVlTT05hZ2dmZ2ZaWWFncnZ8foOJjpGXm5uXkIuSlJSRmKCinpqSi4qRl5iWmpuZkoeIh3RmZWRkZWdpbG1wc3d+lZmTkY6Mi4qKjpGKg4ODgYF/f4GEiYR/f358dnNxbWxsbWxraWpqampqamxvdX+Fi4yMi4mHhYSEhYaJj5CPjoyNjIqKiIaFhoSEiZCUlZWVlZSUkpCQkpGPjEZGRUREQ0E/Pz88Ojk5ODg3Nzc3Nzc1NTMzMzM0NDQ0MzM0NDU1NTU2NjY2NjY1NTU1NTU2NjU1NTU0NDMzMzMyMjIxMTEwMTExMTAwMC8vLy8uLi4uLS0sLCwsLS0uLi8vLS0tLS0tLi4uLi4uLi4tLS4uLi4uLi4uLi4uLy8xMTIzNTY7Oz4+QENFR0lOUVRXWV5jaG5ub29tbW5ub29tbW1ra2poZ2ViYV5bWVRSUU5LSUhFQ0E+Pjs4NjYzMS8uLCwrKywuPFxYU1RcX0EpPVRmbG9ze3p2b2xnaW5bYnGGjHhnW09TU0I6Ojs5OTc3O0NKTUtIRkpLTUxLRUI8Ojo4ODg4NzY0MzIzNz5CQkA+PDUxMTExMDAvLCdAXWZsbXBtam12eX6DiIyMkU8cIygmUXpxa2pwdXd7f31gVkc7MztCOz9JVVpPNSk2Ozk9QD07Oz5CREdJUVpjaGlmYWJjYF9laWtvcXN0c3JxcWpkYF9eYF9jaHd4dHR1cnFvZFJNTlRfZmhqbWtpa3J8hH99gH9tQDIuKisrKysqKioqKywtLSwtLTA4PC8mKCksLi45QVNneYmNiYWEgoF+dWRILSs6Q0dLTk9QUlNST05OT1JTWFtdX19fXlpWVFFaYGNfWldUVV9naWllW19obnV6foKHio2PkZaUkI2PmaSkop6cmpqanZqQjI6UlJiblod+i4Z9bGhraWlrbW5yc3V3gpeYk5GOjIyMjZCTiYOCg4GBgICBhIeCfn57d3Vyb2xsbGtqaWtpaWlpamptcHd/h4yLiouJhoWEhISJi5CSkI2MjYyJiYeFhYaEhoyTlZWUlJORkJCPkJSSjotISEZFQ0NCQkE/Pj48PDo5ODg3Nzc2NTU0MzMzNDQ0NDMzNDQ2NjU1NjY2NjY2NTU1NTU1NTU1NTU1NDQzMzMzMjIyMTExMTExMTEwMDAvLy8vLi4uLi0tLCwsLC0tLi4uLi0tLS0tLS4uLi4uLi4uLS0uLi4uLi4uLi4uLi8vMDEyMzU3ODo7PT9CRUdIS09SVlhZXWJlZ2lra2tpaWpqaWlpaGhmZWRiX15bV1VTUE5MSkhGQ0E/PTw4ODY0MjAsKysrKyssLDJNX1ZRV1tXLDA9UF5ob3V6dG1oX1dRSlpyhY6GgHNmZWBJPTk7OTk3Nzg+Q0lIRUVGSElIR0NAPDo4NTU0NTY1MzM1Nz1DREJCPTk0MjIyMDEwLi4vLCtEY2ptcHFtcHN2foCFiIl3ICQiQntxaGpvdnl8gndcVlZJOTI1Nzg3Njs4LDA1Njc5Oj4+PkVITFFUWlthaWpmYV5jZl9aXF9hYmZvcW1sbnFqZGBfXl5dYWx2dHFxcnFvb2BMS09VXWNla21qam51fYaCgoSBclJJRTwwLCwrKisrKisuLiwrLS0uMjo5MiktOD43PU1idIOMjYmFhIOCgHVlSi8nMD5GSktOUVBQT09OTU5OT1JYXV1eX15bV1RTV19maGRjYmVqa2xuamNpcHZ8f4KHi4qKi4uNj4+Pk5qio6CamJmal5WWlo6KjpGSk5OVjYeEgnZwbm1vb3Fyc3d4eYWXlpKQjYyMjZCQk4mDgoOBgX9/gYSIg35+e3d1cnBtbGxqaWloaWlpaWpqbXB4gYiNi4mKiIWFhIWHi5CTkpCPjY6MiomIh4WEhImQlJWVlJOSkpCQj5CSkI2JTU1JSEdGREJDQUA/PTw7Ozg5ODY1NTY2NjY1NTQ0NDQ0NDQ0NTU1NTU1NTU1NTY2NDQ0NDQ0NDU1NDQzMzMzMzIyMjIyMjIyMjEvLy8vLy8uLi4uLi4sLCwsLCwtLSwuLS0tLi4uLS0tLS0tLS0tLS0tLi4tLS4uLi4uLi4uLi4wMDIzNjY4Ozw+QEJFSEhNT1JWWFpcYGJkZWRkYmNlZ2ZlZWZlY2JhXltaWFVSUE9MSkhIRUFBPjs7ODY0MjEuKysrKysrLC0sPFtZUlVbYkUmMTlFV2Brc29oYVxYVUlIYHyJhYF7dXVqTjw5PDo4NzY1OD1AQUBCQ0NDQ0RBPzw5NjQzMC8vMTQ2Oz9CRUVDQj02MzIzMzExMjEwMzIwKDNSZ21tanR9d3R2eoKAajcgNHV1ampudnd+f3VbVFVWTj40MjM1NjU0MzI3ODg6Ojk5Q0pOUFRcX2BeZWpoZWBjZ2hlY19dWVBQYG9tamxxa2JdXF1eXF5vdnFvcHFycWxSTExPU1hcZWxsZ2ltdoCGhYWIhnlsY1tTRDQtKysrKysrKywrKysrLC40Oz0wMzM6PkRabn+MkI2JiIiGhHt1al1bV0xFQURGSE5PTk9OTEpEQElMVFpaWVhcXFtXWV5mbG9vcHJzc3Rxc3Jxc3d7goOGi42Mi4qIiIqMkZOXmpmZlJOWmJiWk5GQj46OjpKUj4aFioR9d3VzdHZ3d3h3enyKlZSSj4uLi4uOkJGIgoKCgoB+foGEiH9+fHl3dHFwbmxsampqaWlpaGhra2xxeYOKjYmIioeFhYWHiYyRlZKQkI+Ni4qIhoSDhYmOlJWUlJOSkZCPj42QkpCOi05OTEtJSEVERUNDQT89PDw6OTk2NTU2NjY2NTUzMzMzNDQ0NDU1NTU1NTU1NTU0NDQ0NDQ0NDQ1NTMzMzMzMzMyMjIyMjIyMjIxLy8vLy8vLi4uLi4uLCwsLCwsLS0sLi0tLC0tLS0tLS0tLS0tLS0tLS4uLS0uLi4uLi4uLi4uMDAyMzQ3Nzk6PD4/QUNHSk1RU1VVVlhcXF5dXV5fYWNiYWBgX2BeXVpXVlRST09LSUdGQ0E/Pjw7OTg1MjEuLCsrKysrKy0sLTFHX1dRWmRfMCgwOk1YW2NlZF5YWVpSSk5senRwb29yYlFBPDU0NDIxLzE0NTU0Njc4Ozw+PDo7OTY0MzMyMTU4P0JFRkZFQj45MzExMjIyMjU1NTU1NDUwLz1aaW5ueX17dWVSVDgnL2x0aWhsb3d+fGdXV1pbWFJBMzQ2ODwzLzE2NjY6Pj9CSk1PVFdXW19fYmZnZmVkZWVoZWFbWVJFQFFmamprcGlgW1tcXFxleXpwcHFzcXBiSkhLTlBVXGVvbGlrcHuGiImKiYmFf3lwZFtJNiwrKysqKyssKysrKyosLzU+NzM1PUJRaXqIjo+NiYiIhoN9dGpcXWFmZmVXSkZHTExKS0dBLio+QkZWWFhZXGBfXV5lbXJzc3R2eXl4eHd2eHp9goOGiI2MjIuLiYmIiYyNk5WWlpKRkpOTk5CNjY2NjYuSlpWUk5SRjIZ7d3l6enp8fH+Bi5OTkI6KioqKjJCRhYKCgoKAfn6Agoh/fnt5d3JxcG5sa2lpaWlpaWhoamtscXuFi4yJiYmGhYaHi4yRk5OSkJCPjYuKiIaEg4aOlJWVlJOSkZCPj4+NkJORjotPTk5NS0pIRkVEQ0JAPz49Ozs5Nzc2Nzc1NTU1NTU0NDQ0NDQ0NDQ0NDQ0NDQ0NDQzMzMzMzQ1NDQzMzMzMzMzMjIyMjIyMTExMTAvLy8uLi4uLS0tLSwsLCwsLCwsLCwtLSwtLS0tLS0tLS0tLS0tLS0tLS0tLS0uLi4uLi0uLTAwMTQ0NTc4OTo7PT9BRkdLTE9QUVFTVldYWFhYWltdXVxdXFxcWlhVUlJQT0xKSkdFQ0FBPzs5NzY0MzIwLCwsLCoqLCwsLCwtN1VbU1VdZU8mLDRATVNVWVhUUlZZWFVSXWxta2ZoaWJYSzgtLi0rKigoJycnJycqLTE0ODxBQ0RERUdHQ0BBRUZHR0dGRUE7NDAwMDAxNTU3NjY2NTU2MzMuMEliZ3N7fH94WCAkK2t2bG5xb3J5c2NXXFxbXlxVQTU1NjUzMC0vNERJRkZYZFRRVlpaWV5eYmRlZGBgYGRjZGNcV1RNPzpDVWJnZ2tnX1pZW11dbn53cHBycXFzWEZFS05RV11lamxtcniAh42Pj4+OjYmIf3NrXkw0LSwsLC0sLC0rKysrKy0xNjo7O0JMWnKBjpCOjIqHh4aBfHNoYF1iZmNiYllHT01HPjk9PzkjLzMuR1haXF9jZGNma3J2d3l5eXl6fH59fH2Ag4WGhoqMj4+OjI2OkJCPj5GRkpKRkZGQj46Pj42NjIyPkJGRkIyLiouKhIB/f4CAgICDhIySkI6MiomJiYyPjoSCgoGBgX5+f4KIf356eHZycHBubGtpaWhmaGlpaWlrbXN9h4uMiYmIhoWGiYuPkpSSkZCPjo2LioiHhYeIkpaVk5KSkZGPj46OjZCRj46LUE9OTk1LSkhHRURCQD4+PTw7OTg3Njc3NTU1NTU1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0MzMzMzM0NTQ0MzMzMzMzMzIyMjIyMjExMTEwLy8vLi4uLi0tLS0sLCwsLCwsLCwsLCwsLCwsLCwtLS0tLS0tLS0tLS0tLS0tLi4uLi4tLi4vLzAzMzQ1Nzg5Ojs9QERFSUpMTk1PT1BRUlJSVVdZWllYWVhYV1ZUUU9OTUxKSUhGREJAPjs5Nzc1MzEvLiwsLCwrKywsLCwsLC9DX1dTWGNoPiotM0BMUExMTE1OUlZZVlRna2toY2JiXltKKygnJiUjIyEhIiIjJCYpMDlFTlFSUE9PTk1KSUlIR0dGQ0E8NzEwMDAwMTU2NzY2NjQ0NTU1NDEwNUleb3d5eWUwKml6bW5tbnJ4d1xYWltcXWFfX0c2NTUzMS0uMDRGSklMZWxTU1NSU1ddXWFjYl9cXFxdX15aWVFOQzo3PU9gZ2BpamBcXFxbYXh+dXJwc3FxbExCRUlNUVdeZGpudXl/houPkpKTk46NjIiAdmtbRDAtLi0tLS0sLCsrKyssLzQ7Oz1ATmJ2iJCSkIyKiIiHgntwZV9ERmNpZWFeU2NtZ19WTD1AOzk8QEtZX2FjZWZobnJ2eXp8fHx8fX5/f31+gIKGhoaJjpOTlZaWl5eXl5eXl5WVlZORj4yLjIyMjY6OjIyJh4WEg4SFhIOEhISCgoSEg4eOj42LioqJiYmMkIyCgYCAgIB+fn+Ch358end1cnBwbmxraWloZmZmaGhpam92f4iMjYmJh4WGhYqMkZOUkpCQj46Mi4qKiIeIjZSWlJORkZGRj4+Ojo2QkpCOi1RTUlBOTk1LSUdGRENCPj09Ozk6ODY3NzQ2NjY1NTQ0NDQ0NDQ0NDQ0NDQ0NDQ0MzMzMzM0NTQ0MjIyMjMzMTEzMzIyMjIxMTAwMC8vLy4uLS0sLCwsLCwsLCwsLCsrKysrKyssLC0tLS0tLS0tLS0tLS0tLS0tLS0tLi4uLi4uLi4wMTMzNTU3Nzg6PUBEREZISUtNTU1NTk5PT1BTVFNUVFRTU1JST01NS0lJR0dGREA/PDw6NzU0MjEuLSwsLC0tLCwsLCwsLC0uNVRhVlhfZmEwKy82QUxKRkdIR0hNVlVTWGlvcGNaXGRhV0MnJSUjISEiIiMjJCcpLzpLVVRSUE9PT05KSklJR0REQ0E9NzMwMDAwMTQ0Njc3Nzs4OTU2NTM1NjAuMDc/RUI1LGp4bm5ycXB6el1YWlxfYWFgYU9ANzQ0MzAvLS0yNj5BQkpOUVdYVVRVWl1fX1paXFtdXVlUUU1HQTw2Nj1PXF5WYGxiXV1dXGyDfnVxcXJzcF9EQkZITE9WX2NncnyBhYmOkZKTk5STkI6MhoF0Z1Y9Ly8uLi4uLi4rKywrLS4wNzxARVJqgI2QkI6Mi4qKiYN8cGRjUD1eZ2JlZWhoaGhsb2xiT0RLUVFZYWZna25yc3h7f4B/f35/fn5/f4B+fH1+g4SHkJSYmp6goKChoqOho6KgnZ2Zl5SPjIyMjIyNi4eGgoKDg4ODg4KDhYWHiIiGhYWJjYyLi4qJiIiIjI6Jgn9+fn5+fn59gIZ+e3l2dHFvbmxsa2loZ2ZlZWdnaWpwd4CIjIyIiYeFhIeLjpOWlJKQkI+Ni4mKioqKi5GWlpSSk5GQkI+Pjo2LkJOQjotVVFNTUE9PTUtJRkZDQkA+PTs6ODk3Nzc2NTY2NTU0NDQ0NDQ0NDQ0MzM0NDQ0MzIzMzMzMzMzMjIyMjIxMTExMTEyMjIyMTEwMC8vLy8vLi0tLCwsLCwsLCwrKysrKysqKioqKysrKywsKyssLC0tLS0tLS0tLS0tLS4uLi4uLi8vMDExMTU1Nzc6PDw+QUNERkZISkpMTUxOTk5OUFFQUVBQT05MTEpKSEZGRURDQkA/PDo6ODY0MjAvLi0tLCstLS0tLCwsLCwsLi4/YWBXWF9nTygqLjZCTUpHSUVESEtNVFdebXFmX2BkZV5UOSEkIiEgIiIiJCcsMT9QW1lYWVZSVVFOSkdGRkRBQD88OTQwMDAwMTI0NDY2ODw+PDk1NTc3NTQ0MTAvLS4rMWV2bWtvcXB3e2NZW15eZGZmUD44Ozg0NDIyMTAxMzQ3OkJLUFhbWVpZWV1dXV1aWltcXFlUUE1JPTg2NTY9S1NUUVloZVtdXWF3g312dHV0c3FSP0JGR0tPVl9ob3WBiI6QkZSWl5WVk5KOjIyHfXNiTTUtLS0uLi4uLCwsKystLDI3S1xkdIiSkY6QjYyLi4iCeWxjYmNaXmVjY2VmaWlnZ2pvb3Bwb2tkZ21yc3V1eXqAgoKEhIKAgYCAfnx7enh5e3x9hY+co6aqq6urq6ytrrCtqqqpo5+alpCLi4uLiYeEhIGAgICAgIB/gYKDh4qJhoSFiYuMi4uJiYmJiYuNiIOAfn58fnx8fYCDfXt5dnRxb21sbGtpaGZmZWZnZ2lqcXqEjI2LioqFhISHjJGVlZKRkJCOjIqJiYqJi5GUlZOTlJGQkJCPj46Ni5CSj42KWFdVU1JSUU9NS0hJRUNAPj07Ozk5Nzc3NjU1NTQ0NDQzMzMzMzMzMzMzMjIzMzMzNDQyMjIyMTExMTExMDAxMTAxMjAxMTAwMTEvLy4uLi0tLSwsKysrKysrKioqKioqKSkqKisrKiorKyorKyssLCwsLS0sLC0tLS0uLi0uLy8vLzAxMzMzMzU2Nzk5Oz0/QUNFRUZISUlLS0xNTk5NTU1LS0pIR0ZEREJDQ0JAQUA+PDs5Njc0MTAvLi0tLSwrLS0tLSwsLSwrKy0tNFBlWVdYYGc9IywvNkNLSkZEQ0JFRkhRV2VyamloYl1YXFMyKCQhISAhIiUpLz1TXl5gYFxbW1RRS0ZCQUE/Pjc3ODgyMTAwMTIzMzQ3ODtAQT04ODc1NTQ0MzIwLSwtNmx3bGpvbm53emhcXFtdYGFXOiguNzs5NTIwMDM2NDM1Oj9HUFVYV1RWWVleXl1cWltdXl5aVFJRRzs3NTI0OkZNUVNWZGZdXltmgIN6d3Z0c3R2a0s9QkVKUVVca3l+iI+QkpWWmJmXlZKRj42Mi4N5bV1DMi4sLy8wMC4uLisrLS4uNENhd4GOlJKOjYyNjIyFgHVnYF9hYWJhY2RkZ2dlZWhucnJ2eX6BgX18fH5+f4GBhoaGiIeDgIF+fHt4d3Ryc3R0dH6QpqyvsbS0tLa3uru7urSzsq6ppZ2Vj42Oi4iGgoGAfnp6eXt7e3x9f4GIioiFhYeJiouKiomKiomKjIiDgICAfn59fX6Bgn56eHVycW5ta2ppaWhmZmZmZ2dpanN8ho2NjIyJhoSEhoyTlZWSkJCPjIqJiIiJiY2RlpWSkpKRkZCQj4+MjYuOkY+MillYV1dVVFNQTk1JSEVDQT8+PDw6ODc3NzY1NTU0NDQ0MzMzMzIyMjIyMjExMjIyMjMzMjIyMjExMTExMTAwMTEwMTIwMDAwMDAwLy8uLi4tLS0sLCsrKioqKioqKioqKikpKioqKikpKysrKisrLCwsLC0tLCwtLS4uLi4tLi8vMDAxMTIyMjIzNjY4Ojo8PT8/QUNERUdHSUlJSkpKTExJR0ZGRENEQUBBQEA+PT48PDk4NjQ1MjAvLy4uLS0sLC0tLS0sLC0sKywsLS87WmFaVVllZDMmLC85Q0tIRUVDQUFBSFBaa3V3cF5QVWBiSiggISEhISMlKzZOYGJlZGJfWU9IQTg1MDAyNzc1Njk4NDIxMTEyMzM1Njc6Pj06ODg3NTU0NDUzMywtQm11bWptcXF2eWdhXGBeYVg6KSktMDc6OTUyMDI4NzU1Oj9IT1JYW1dPT1ZaYWFeXFpbXl1eWlhWV05CPDY1NTxGT1VTUl5nXlpcbYKBeHZ1c3RzcXZ0U0FHTE1QX3N9hI6SlJSWl5mYk5GOi4yPjIyIfnNmVz4xNDk7Ozw4NjItKiswMjJDX3mLk5OSj46Mi4qKhXxvYl9iYWFiYmRlZWVnZ2prcHJ0eH1/gYCEg4OFhYSFhYiIiIeHg4GAenh3dHRwcW9ubnF1j6uxsre5ubm7vL69vby7urm3sKyhlpSVkIiFhIOCfnx5d3Z1dnZ2d3l7foWIhIGBhIiJioqJioqJiouHhIKAgICAfX1+gYF8eXZzcm5tbGtramloZmZoaGhoaW10fYeMjYuKiIODhYiPlJSSkZCOjYuKiIiIi42PkpSSkZCQkJCPj46Oi4yLjpGPjYtbW1pYWFhUUU9OTElHREJAPz08Ozg4ODc1NTU1MzIzMzMzMzMyMjIyMjIxMTIyMDAwMTExMTExMTExLy8wMDAwMTExMC8vMC8tLy4uLS0uLS0tKysrKikpKSkqKikoKCgoKCkoKSorKysrKysrLCwsLCwsLC0tLS0uLi0tLi4wMDAwMDAwMDEyNDQ1Nzg4Ojw8PT5BQkRERUVGR0dHR0ZFR0RDQ0NBQUE/PT09Ojw9Ozk4NjQzMzIvLy8uLi0tLS0tLSwsLS0tLS0tLS0tM0hnYFdVXGdfKSYmLzVASEdGREFAQEJJVF9ucm9gUFRdXlc7HyEhIiIkJy5EXWNjZGNcTkQ3LCgjISMnKCsuMTU6PDk0MzM0NzY3OTs9PUA6ODk3NTY1NDQ1MzA3Yn14bWdrcXN1d2BaXF9hYlMtJigtLzM2NDc3NDE4Ozg5OT5GT1RVV1dUUFBSV15fX19cXF5cW1paXFxYSz88ODlETlRVVlZbZGFXX3aAfXl2dHBycmpqd3hYRUlNVmN3goqSlJWVlpeZlJCNiYSBh42Ni4d8cWNTRUdMUFBQTUhDQDgxMjE0RWR8jZSTj4yLi4uIhoF4a2BfY2JjYWFiY2ZnaGpvc3N1e3+Bg4WGh4iJiYiIhoaIhoWEg4GAfnl2c3BvaGZpbXBtbpitsrO4vLy9vb6+vr28u7u7u7awp56elouAgYCBgHt5eHZzcm9ycHBycnZ3f4SAe36Fi4uKiYqKiouKhoSDgYCAgH5+gIOBe3h3c3BsbGxsamlpaWhmaWloaGlsdYCJjIuMioaEhIaKkpWSkI+OjYuLiYeIioyQkpKTkZCQj46Pjo6NjIuLi4+QjouJW1tbW1lZVlRSTk1KR0VCQEA+PTw5OTg3NTU1NTMzMzMzMzMzMjIyMjIyMTEyMjAwMDExMTExMTExMTAwMDAwMDAwMDAxMDAvLy4uLSwsLCsrKysrKykpKSkpKiopKCgoKCgpKCcpKioqKiorKysrKywsLCwtLS0tLi4tLS4uMDAxMTAwMDAxMjQ0NDY4ODk6PT49Pj9BQkJDREVFREREQ0NCQD4+PT09PDw7Ozs6Ojo3NzUyMjIyMS8vLy4tLS0tLi4tLS4tLi4uLSwsLS0zU2haV1leaVEjJSosMz5GSERDQkA8QUlSZnBwa2BbXl1dVCsfISEiJSo2UWRiY2VaRjAsKSUkIiMjJCQmKCovOTs4NDQ0NDc7PT0/QkJFQDs6ODY3NjY3NTBLdX10a2ltcXZ6dWFbX1pfZ0soKCsuLTEwMzg6NzxGRT47Pj5HTVZYVFNTU1BRU1FVWl5eXVpaWVlZWF5kYE9DQj4/RlJVVVVWWGFgW2mAgHx3dXN1c2pgYmt1eFhGS1hvfYaPkZKRkZKSko2HgH56eoGJj4yKg3hzaWRfYmZmZmJdVlFKQTg0Nk1shJGSko+LiomJh4F8cmRiYGJjYmJgYWJkZ2xwdHd7fH+BhYeIiYqKioqIiIaFgoF+f319fXx4c25qZmZfaG1wa2+fr7S4u76+vr2+vr2+vby7u7u6taymnYl6en1/f356eHZ0cm9ta2hoampsam95gX12e4KLiomKioqLioaFhIOBgYF+foCEgnp3dXBua2ppaWppaWloZmhoaGhqcHeBiYyKjIqGhISIjJSXk5GPjYyKiYiIiY2PkpOSkpKSk5eYk46OjIyLi4uPkI6LiVtbXFxbWVdWU1FOTEpIRkRAPj08Ojk3NjU1NDIyMjMzMjIyMjExMDIyMjIyMjIxMTExMDAwMDAwMTEwMDAwMDAvLzAvLi4uLi0tLSwsLCsqKysqKikpKCgpKSkpKCgpKSgoKCkoKSkpKioqKiorKysrLCwsLS0tLS0tLS0tLS8xLi4wMDExMjIzMzMzNjY3Nzk5PD4+QEBBQUFBQUFAPz89Pj48Ozs6Ojo6OTk5ODY2NTU1MjIxMTEwMDAwLS0tLS4uLi4uLS0tLS0tLS0uLzhXY1xYWWNkQCElKSsxO0ZJQkBAPj1ARVVqc3Jta2loaWVEISIiIycuP15pZWRiTDMqKyklIyEjIiIjJigrLzc5NjY2Njc5PUBCQ0ZIR0I/Ozg3NjY1NDNJfnlybWlscXN5dWRbXl1hYUQkKSsrLS4wNDc6PTk+SkY8OT1FTFBUWFVSUlJOTU9OUFNWW1pYWlpbVlRaYV1OSEZDQ0RMUlVVVlZfYGFyf3x4d3Z0dnRkXWBnbHNzVk9ec4OOkZGPjoyNjIiFfXFvdHZ5gYyOi4aAfXp4eXt9fHp3cmtmXFZLRktbcYeUko+MiImHhoV8eGthYWRiYWNjZWhpa25xdXl9fX+ChYeKioqJioiHiIaFg356dnZ3dnZ1c21oYlxfZGFjZ22CoauzuLu9vb2+vba+v769vb29vLSqoIVzdHl5eXp7enh1cnBrZ2ZmaWpoZGVtbnd7d3d8goeLiIiKi4mGh4SDhIKBgICAhIJ7d3RycGxsa2tqamlpZ2hoaGlpa3F8hIqNio2KhYSDiI+VlpSSj46MiomIi4uPkZOUk5KTk5ihoZuSjouLi4yMj5GPjIpeXlxcW1lXVlRST0xKSEVFQ0E9PDo5NzY2NTQyMjIzMzExMTExMTExMTExMTExMDAvLzAwMDAwMDExMC8vLy8vLi8uLi0tLi4sLCwsLS0qKisrKiopKSgoKCgoKCcnKCgnJycoKSkpKSkpKSoqKioqKisrKyoqLC0tLS0tLi4tLS8vMDAxMTIyNDQ1NTY2Nzc5Ojs8Pj4+QD8/Pz8/Pj4+PDs6OTk5ODg4ODc3ODg2NjU1MzIyMTExMDAwMC8tLi4tLC0tLSwtLS0tLS0tLi8wP19jWFZZYmEuIycnKy43Q0dGQkI+OzxEWHZ9c2pnYm50XS8gISQnMUhobW1sXTcqLSknJSMiISMlIyQmKi00NjY2NjY3OT1AREZISEdDQDw5ODU0NDE6c4J1b25xc3R5eWJeYF1hZ0klJSovOTo3OD4+P0E+PUZEPz1ARk1OTE1MS05RTUxOT09RUlNWV1dbXFZUVVdVTktLR0VFSE5VVVZWXGRqfXx2dXN1dXV1YV1iYmVrc29faXuJjZCNi4iGhoeEgHhraG10cniFi4yKh4SEhoqOjYyLh4F7dGxmXFxfbXuLkpGNioeHhYWEfXRmXV5fYmRjZmdrbHF1d3t/gYSFh4qMjIuLiouKhoSAgYWBd25qamtsamRbV1RRUlVTV2CCn6GqtrO1u7i4vL68vb2/vb29vby5pn1pbXF0dXZ2d3Z1cm9ua2lkaXBvcGtmbHRzamVrcHV2gYiIi4uHhoaFhYWFg4KCgIOCfXd1cnFsbGtramlpaWdoaWlpaWtxe4aLjIuLioWBhImTlpSTkY+Ni4qKiY2PkZKTk5KRkZOco6SckIyKjIuMjY6QjoyKXV1cXFtZWFdUUlBOTElHREI/PDs6OTg3NjQzMzIyMTExMTAwMTExMTAwMDAwMDAwLy8vLy4uLi4vLy4uLi4uLi4uLi4tLS0tLCwsLC0tKysqKikoKCgpKCYnKCgmJicnJiYnKCgoKCgpKSkpKCkqKioqKysrKywsLCwtLSwuLS0wMDAwMTEyMjIyMjIzNDU2Nzc4Ozw9PT09PTw8PDw8Ozo6Ojo5OTg4Nzc2ODg4NjU1NTMzMjEwMDAwMDAwLy8vLi4tLSwsLi0tLS4uLi0tLTFGZF5VVl1oViUmJyYoKzM/SUdBPz88OkNecWpqYmFwc3FNIx8jJzNObXBxblAtLSwpJCIiISEiIyIiJCksMDQ1NjY3ODo9QERISkhHQT49ODc1MTEwXoB4dHF0dXp8fmdZX11iZ1UmLCktND1HRUhMT0lHREVJRUZFREVLTElGQ0VKS0lJS05SVFFRUlVZWVxcVVJUUU9QT0tIRkVMU1ZXVVlkc3t3cnN2dnZ3cl9bX19hZ2txdHSCjIyNjIiEg4KDhYF5ZWNob2xte4WLjYuLi46TlpWWk4+NiIN8d29scXiEjpOPi4mGhISEgXtvYFpfYF5iZ2pucXN2fH2AhoiJiYqMjouLiYiHh4N+d3p9fHtzZlpaWFRQTVdQR1FeamyJo6ittbm7soyYnKy+vr++vr29vL23onJZY2lscHBxdHR0dHJxcG5rZ2pvbm9wcG1xdm1cW2BlbXqIiouIhYWFhYWFhYKCgoKEg354dXJvbGtqbGhoaWlpaGhoaGpvdX2HjIuKi4iEgoeQlJWSkJCPjo2Li42OkJOUlJKRkJCSmaOil46Mi4qLjY2Pj42Mil5eXV1bWVlXVlNRT0xKSERCPzw7Ojk4NzY0MzMyMjIyMTEwMC8vLy8uLi8wMDAvLy4uLi4vLy8vLy8tLS0tLS0vLi0tLCwsLCwsLCwsLCoqKiooKCgoKCcmJygoJyYnJyYmJicoKCgoKCgoKSoqKSkqKisrKyssLCwsLC0sLC4tLi4wMDExMjIyMjIyMzQ1Njc3OTo7PDw9PT08PDs7OTc3Nzc3Nzc3NzY2NTQ0NDY1MzMzMzIxMTEwMDAwMDAvLy8vLi4vLy4uLS0uLi4tLSwuM1BnWVJYYmVGIyUkIyQoLjtFSUZAPz4+SGNwbmNla2hrZjghJCgxUG9wb2tHLiwpJiMiICEhIiMiISMoKy0xNDY3OTo8Pj9BRUlKSUE9Pj46NTAvW3l4c3F0eHx7fnBWXF5gaF4sKSwsMDpDREVPUVNYU01RT0NJTk1HRkdFRENDRElJSEdNTlRVVFVWWFpeX1lUU1FPT1FPTEhESFFWV1hbZnV6dHJzc3R1d3JfW1xgYGFnb3yBi42MjIqHhIGBg4SAd2RiZGxqYnF/iYyOjJCSlpmamZeUj46Lh4N/fX+Fio+RjYqIhYSEg4F7bV5bXl5eZWlucnd6fH+Dh4qMjIyMjIyKiYiFgoF/e3l0cXV5fHZ2bGRbVF5hRkRskpqZp7K3uLi5vqZ3mYyRu76+v76+vr2yjV1SV15jZ2tsb3F0c3NycXFyb2xvcm9ta2tsb29vYU9SVmB0hoiLiIWFhIWFhYSCgoKDhIOAfXh0cG1sa2loaGhpaWloaGhrcHeAiYyLjIuIhIOLkpaTkpCQkI6Mi4yMj5OUlZKRkZCQkpmgn5eNjIuLi42Nj4+NjIpeXl1dW1pZV1RTUU9OSkhFQ0A8Ozo5NzY2NDQzMTAxMTAwMDAvLy4uLi4uMC8vLy8uLi4uLi4uLi4uLS0tLSwsLS0rKywtLCwrKysqKiopKSkpKCcnKScnKCcnJyYmJiYmJicnJycnJygoKCgoKSkpKCoqKiwsKyssLCwsLS0tLjExMTEyMjExMzMzMzMzNTU1Njc5ODo6Ojo6ODo6Ojg4ODc3NzY2NjY2NjU0NDQ0MzMzMzIyMjIyMTExMTAwMC8vLy8uLy8uLS4uLS0uLS0tLS82W2JSUVdhYjkiIyMiIicsNkJIR0NCQj9QZ2JYWl1na25aKCIlLUZmbWpmQCssJyYjIR8gISQlIyMiJCgrLS8zMzY6PD09PkFGSUtDPz9BPDI1YHdybHN0eHp8fHVbWl1dZGc6KyssLS42PUFHT1RYZmJXSUNETUxJR0VCQEFCQkNHSUdISk5TVldXWVpaXWFdWVVTUlJTTk1IREVNVVhaW2ZzdnFzd3h2dXZxYFteXWBkZ3N/iJGQj42JhoSDg4SDf3RiY2NpaV5qe4eMjo6QkpWZmpqal5aSkY2MiYeGioyQj4uKiIeHhYV/d2haVFheYmhrb3N7gYSGiYqOjoyLjIuKh4eDgn59enp6dWdcYXJtbmdlXl9xc0lamayxtLm7u72+vLu1rLiws7y+vr6/vrqndUhFT1JYXGBka29wcHBycnFzdnZycnh0bGdnaW5ycmlSQU1Xb4OHi4iFg4SEhISDg4KChIOGgn56d3JubGxpaGhoaGhoaGhpbXF6hIuLioyLiISFjpSVk5KRkY6NjIuMjpCVl5WRkY+QkJOboJyWjoqKioyMjY2PjYyKXl1dXVtaWVdVVFFOTElHRURCPTw6OTc2NjQzMzIxMTEwMC4uLy8uLi4uLjAvLy4uLCwuLi4uLi4uLi0tLS0sLCwsKysrLCsrKioqKSkpKSkoKCcmJygnJygnJiYmJiYmJiYnJycnJycnJycoKCgoKCkqKiorKysrLCwsLC0tLi8xMTExMjIxMTMzMzMzMzU1NTY3Nzg4OTk5OTk4ODg3Nzc2NjY2NjY2NjY0NDQ0NDMzMzMyMjIyMjExMTEwMDAvLy8vLzAwLy4uLi0tLi0sLCstLT1iXFRVWl9XLR8hIiEjIigyQkpKSENCQVhfT0xPV19oa0MeIyk5WWhpYkEsKiYkIiAfHyEkJCMhISMkJystMDM2OTw9PT5BREhJR0NBPzhMcHZtbWxwdnZ5enNfWV1cXmVJKS0sMTEwNTlASE9XYWtoV0pHSk5OSkVBQD4+Pz9CREZISUxNT1NWWFlYWltdXlxYWFdXVE9OSkVER1FXWVplcnZzdnp5eHV3cl9YWVxfZGt4g46QkY+MiYaDg4KEgn5xYmFjZmddaHuHjo6NkJKTmJmampiWlZKQj4uMjY2NkI+MiYmHh4aEfnZoXldVYWpnaG92fYSJi42OjI2Mi4mGhISBf319eXRvbmpdU0llbm5wdWhVXGpMb6a0uLu9v7++u7Szt7q7vb6+v7+9u7CXZEZLU1FPUVVaXmJnam1wcnFycnV5eXJzd3FwcG9xd3ZzaEtFWXCEiIuDgYGChIOEg4ODg4SFh4KAfHl1cG5sa2hoaGhoaGhoaW1ye4WLiomMioeEiZKVlZKRkZGPjYyMjI6RlpaTkZGPj5KYnZyZj4yLi4yMjoyOjoyMil5eXl5bWlpYVlNRT01KSkdFQkA+Ozk2NjY0MzMxMTExLy8uLS0tLS0uLi4uLS0uLiwsLS0uLi0tLSwsLC0sLCwrKysrKysrKyoqKikqKikpKSkoJycmJiYmJiUlJSUlJSUlJCUnJicnKCgnJicnKSkoKCoqKioqKissLCwuLi4vMDAxMTIxMTEyMjMzMzQ0NDY2NTU3Nzc3ODc3Nzc3Nzc2NjY2NjY3Nzc3NjY2NjQzMzMzMzMzMjIyMjIyMTExMDAwMDAvLy4uLS0tLSwsLCwsLCstR2RXUlVbY1YsISIfISAiJzA8TVJPS0dLYV1RSktNWW5jLh4lMVJkYFY/LCYiIiIiISEjJSUjIyIiJCgpLC4yNDQ5Ojw+P0FCQUI+O0hfdHFsamlwdXR2dnFgWVxdXmZfKSsvMDMyNTg4OD9IWGlsX1VNTVBTVVNNRT09PDw8P0NGSEpMTU1RU1ZZWVlXWFxbWllYWFRQTklFQ0RNU1dbZW5ucHJ1dnN1dm5nXFhdX2hzgI2SkY+Li4mHh4aFh4V/b2FhYWJlYWx7io6Nj5CTlZaZmZqYl5SSj5CQkY+Oj4+PjouKiIiHg352bGJeX2dvc3N5fYKHi4yNjY6MioiJhIF/fXt3dXRza3FvX1lwc21rbHNqWlhbV3WquLq8vr68uLGqtbq8vr69vr+7tJtyUUtUVFFNTk5OU1ZcYGRpbG9vcHBzeYOBdnd3c3NtaXBycG9hQktwhImIf3+AgIGCgoOEhISEh4iFgX57eHVzb2xqaGhoZ2dnaGptc36Ii4yJioiGh42VlZOQkJCQjoyMi4yPlJWTkY+OjZCWnZ2YlI+MiYqMjouHj4+NjIpbW1tbW1pZV1ZTUU9NSkhFREI/PTs5Nzc2NDMzMTExMS8vLi0tLS0tLS0tLS0tLS0sLC0tLS0tLSwsLCwsLCsrKysrKioqKSkpKSkpKSkpKSkpJyYmJiYmJiYlJSUlJSUlJSQlJyYnJygoJyYnJykpKCgqKioqKiorLCwsLi4uLzAwMTEyMTExMjIzMzM0NDQ1NTU1Nzc3Nzg3NjY2NjY3Nzc3NjY2Nzc3NzY1NjY0MzMzMzMzMzIyMjIyMjExMDAwMDAwLy8uLi0tLS0sLCwsKSoqKjBRZlVQVlxiWy0dHyEgICAmKzlIUVRNSVFlXE5OUFNldEshJC9OYVlVSzsnIiIiIiEhIyUlJCMjIiQnKSosLzE0NjY4Ozs7PDs3SWNyc21mZ2pvcHV7d21hWllcXmBkQC0sLzAyNTg5NzM2QVJcVUtIUFJVVVdaVUxAPTs6Oj0/REdMTE1NT1JWWVlZWFlaWlhVVVVTT0xJREFCSE9WWGJqampscHNxc3JrZV9ZWmBve4eQlJKPi4uJh4mJiYmGgW9hYWFla2lxhY+Qjo+QkpKTlpaXlZSQjIuLjY+RkZGPjo2MioiIh4OAeXJuamhueX6BhYWJjI6Ojo2LioiHhIB9end1dnJycm9ucHFybm9xbWtoZllTX2N8qbe6vb27uravpbC4u72+v7u2qX5VTVJSUU9MTU5PT09RVltfY2drcHFxcnR8fHdxc3hxamBtdnh3blxheYSJhH19f3+AgIGChISEhYiGhYOAfXt3dHFtbGhnZ2dnaGhpbXV+iIuLiImIh4mRlZORkJCQkI6MjIuNkZSVkZKPjY+Sm56ak4uLjIqKi4yKho6OjYyKWlpaWlpZWVdUU1FPTUpIRURCPz07Ojk3NjQzMjIwMDAvLy4tLS0tLS0tLS0tLSwsLCwsLCwsLCwsLCwsKyoqKCsrKyspKSgoKCgoJycnKCgoKCcmJiYlJSQkJCQkJCQkJCQjJCYmJiYmJiYmJycoKCkpKSkqKisrLCwsLC4uLzAwMDExMjIyMjIzMzMyMzQ0NDQ2NjY2NjY3NzY2NjY2Nzc3NzY2NjY2Nzc2NjU1NDMzMzMzMzMzMzIyMTExMC8vLy8vLy8vLi0tLS0tLCwrKywsKygpNV9iU1BVXGZhMh4gHx8fIigqN0NSVE9KW2lbUEtRWnBrNSAsSmNdVE1HKiIiIiIhIiQlJSYlIyQkJywrKiouLy8xMjY5ODQxT3dwbWdkZmltcHB3cG1jXFlaXV5gUTEvLzIyNTg8Ozo4PD1LRT07RVFXVlhaXFpRRj47Ozs7PUJGTE5OTVBQVVpaWVlbXFlVUU9PTEtKSERDQUNLUldgZ2doam1vbXBtZGNiXFpkc4GOkpKSjouLiYiLjIyKiYNzYmBiaHJ1fYyRj4+Oj5CPkZKTlJORjIiEhIeNkZKRkJGRjYuKiYiFgXt5eHNyeH+EhomLjo+Oj42Lh4OBgHx8enl3c3Fwb21wcGtqa25wcW1pZWpjXmNfdqW1ury+vLq5taOsrbi7vLmxk2VKTFNSUVFRUFBPT09NTVFUWl5hZ2lwcXJ0c3N1c3Z7fHRxfYOIiX9weYCDhn15fHx9fn9/gYKDg4WGiIWEgoB9e3dycG5qaWhmZ2dna294gYiKiYiIiIiMk5OQkJCPj4+OjY2NkJOWlpGQj46Ql52cl4+IiIuKi4yJhICOjo6Ni1xcXFxaWVhWVVRRT05LSUZDQD89Ozo5NzY0MzIyMDAwLy8tLS0tLS0sLCwsLCwsLCwsLCwsLCwsLCwrKyoqKigpKSoqKSgpKSkpKSgoKCgoKCgmJiYmJSUkJCQkJCQkJCQkIyQmJiYmJiYmJicnKCgpKSkpKioqKisrLCwtLi8wMDAxMTIyMjIyMzMzMzM1NjU1NjY2NjY2NjY2NjY2NjY3Nzc2NjY2Njc3NjY1NTQzMzMzMzMzMzMyMjExMTAvLy8vLy8vLi4vLS0tLSwsKyssLCkpJyk6ZGBVU1ZfaWQ0GiEiIyMkJSszPk1TUFNnblpOTlNhdFgjKD5hZllNQioiIiIiISIkJSYnJSYlJSgwLyopKSoqKysrLC4sTnJxa2hna29vb3B2aVhlYVxaWllVWDQuLjM2NjY3OTs3OEA/QjsxOUVPUlBSVVNRSkQ9OTk5Oz1CRkxOUFJUVFVXWVpbXFxZUkxLSUlHSEVEQ0FBRktUXWRkZWhrbGttal9gaGRgaHeJkJKSkY6KiomKjIyLjIqGdWJfZGt2e4eQkZCNjY6OjpGRkI6Ni4iEfn6Di5GSkZCOjo2LiouKiIWCgH9+fYCEh4mLjI6Ojo2Nh4F+eHVxbW1yc3BwcW9ubWxrbG9ubm5jWWBlZGBaVWCetLm7uri4uLSusKmyurisf1FMTVJSUlBPUVBQTk1NTkxOUVVZXmNobG5ycXBydnh/hoeFeoqRko+Jf3l/hYN6eHt7e3x9fX+AgoOFhoeGhYSAfXt6d3NvbWpoZ2dnaGtweoOIioiIiIeJj5STkJCQj4+Pjo2NjpKVlZKQjo+Ok5ucmpGNi4uLi4uMhn99jI2NjIpZWVlZWVhXVVNSUE5MS0lGRkQ/PT06ODc2NDMzMjAwMC8uLS0tLCwsLCwsLC0tLCwtLSsrLCwrKyoqKioqKigoKiopKSkpKSkpKSgoKCgoKCcmJCYlJSUlJSUlJSQkJCQkJCIjJSUlJSYmJycmJigoKSkpKSoqKissLCwtLS8vMDAwMDAxMjMzMjM0NDQ0NTY2NjY2NjY1NTU3NjY2NjY2NzY2NjY2Nzc2NjY2NTU1NDMzMzMzMzMzMjIyMjExMDAvLy4uLy4uLi0tLS0tLSsrLCsrKCcnJ0JrYlRSV19oYzgdISMkJCQoKSo2RlFUWGxpWVBUWGhzQSkzRk9KPC8lISEgICEhIiUmJyYkKCYoKy8sKCcmKCYkJCEqTHJubWhobG1ubXByW0toZmBcWllRWUwqLjE2OTk3ODg6NzU3ODYzMjhES01LS01NSEVCPjo4ODo+QUVMTlFUV1hWVlhaXF1cWFBNSkxKRkVHREVFREFGTVdgYWJlaGlpa2ZaXWdoanB9jpCRkI+JiYmJjIyKiIqLhXdkX2Zwen+NkZOSjY2MjIuNjo6LiYWCf399hIqSlJKPjYyMjI2NjIuKiISBg4KEiIqMjY6Pjo+NioR7dm9nYVxfY2hrbHBxcm9vbmxsbm1sVUBNWF9bSEBZjLC2ubavtberr7GttraqgE5PUU9RUVNSUlNRUE5OTE9PTk5TVVhcYmZpbW9xdHyFjpaVkoeSmJqQiIR/f4OBdnZ5enp6ent+gIGCg4aHhYSDgoB/fnp1cW9sa2ppaGpsc3yFiIqGhomKjI+TkpCQkI+Pj46NjY+SlZWSj4+Pk5menJaOioqKi4uLioR9fIyLjYuJWVlZWVlYV1VTUlBOTEtJRkZEQT88PDg3NjQzMzIwMDAuLS0tLSwrKysrKioqKisrLCwrKyoqKSkpKSkpKSkoKCkpKSkoKCkoKCgnJycnJiYmJiYlJSUlJSUlJSUkJCQkJCQjJCUlJSUmJicnJycoKCkpKSkqKiorLCwuLi0vLzAwMDAwMTIyMjMzNDU0NDU2NjY2NjY2NTU2NjY2NjY2NjY1NjY2Njc3NjY2NjU1NTQzMzMzMzMzMzIyMjIxMTAwLy8uLi4uLi4tLS0tLCwrKywrKysoJSMpSG1hWVdXX2dnQx8hJCUmJSUkJy87SlBcdGVXVVdfcmoyLCwoKSUjICEhICAhISMkJykuLywsKCYrKSgnJSQiIiQlV3Rtb2xsbm9rbXJyRj5obGVcWFpQWFcwKzE1OTo8PDs+OzU1NDYzLjM5RElISEZGRURCQT46ODg6PD9ER0xPU1hZVlZYWltcWFZQSktLSEdGRkZHR0dGQ0lQWF1gZGdpampjWFtjaW53iZCRj42Mi4mJi4yNi4eIi4V5ZF9mdH+HkpKRjouLiomJhoiKiomEgH18f4aNlJSQjYyLi4uMjIqLiYmIh4iIiImNjo6Oj4+NjIeCfXVoWExJT1JUXGBiY2ZtcG9vbm5qZU49Ul9eVj4zTnCltLavi5iwl6aysLGgmG9NT1RdV1NUWFdVUlFRUE9PT09PUFFVWFtgaHF9iI+Tmp2hop6ZmZeVjoqFgYGBf3d1eXp6enp7fH5/gIGFhYOCg4KBfn59eHZ0cG5raWhpbHSAh4qIhYWGiY+UlZKQkJCPj4+OjY2Pk5WUkY+OkJWen5qRjY2JioyNjIiCd32LjoyKiFdXWFhXV1VUVFNQTk1LSEVFQT89PDs5ODUzMjIyMC8vLSwtLS0sKyorKysrKysrKyoqKiopKSkpKSopKSkpKSkoKCgoJycnKCgoJycnJiYmJSUlJSQkJCQkJCUlJCQkJCQkJSUlJSUlJiYnJygoKCgoKCkpKSorKywsLC0tLy8vLy8wMDEyMjI0NDQ1NTU2NjY2NjY2NjY2NjU1NTU1NTU1NjU2NjU1NjY2NjY2NjQzMzMzMzMzMjIyMS8xMTEvLzAwLi4uLi4uLCwsLCsrLCwrLCosLCglJSpLbWJYVlddZGlLIyMkJCQkIiEgJjI/Rmt3Y1hXVWV2UCMnJyUjIiEgISEhICEjIyUuOUA8Oi8oKyspJiUjIiMhPXNwa2xvbm1wb3NrOitga2lkXFtVS1tBKS80OTo6PUBAPTg2NTQyLTE0OUBEREE9P0FCQUI/PDo5ODs9QkVKTFFWVlRUVlhZWlZUT0pLTEtISEhISktKSERESU1WXmNlZWZoZVdYZG10gI+RkI6MiomJiouOjomHh4qGfWhfanaBjJKQjoqJh4WDg3+ChYqMh4SBfIKIkJSRjYqJiYiLi4uKjIqJioqOjo6Njo+Pj4+OjImGgXptW05cYVxdXl5aWlhZYGVqbW1tZVdHPUdKS05CP01ela+ylFKHpH2as7eqhXZcTU5SWFFUWWFdVFVWVlRRUFJSUE5PUFJdbn6NnKKjoqCbn6OfmpqYkoyJioiHg354dnh4enp7e3p8fn+BhYSBgYGAgX5/fXt3dXRyb2xsa255gYiLiIaFh4qRlJSQkJCOjo2NjIyOkZWVkZCOkJKanp2Vj4uKiouNjYyGfXJ4ho2LiYZXV1dXVVVUVFJRUE5MSkhFREE/PTw7OTg2NTIyMjAvLy0sLC0tKyorKioqKioqKioqKioqKSkpKSkpKSkpKSkpKCcnJycnJygoKCgoJiYmJiUlJSUkJCQkJCQkJCQkJCQkJCUlJSUlJSYmJycoKCgoKCgpKSkqKyssLCwtLS8vLzExMDAxMjIyNDQ0NTU1NjY2NjY2NjY2NjU1NTU1NTU1NTY1NjY1NTY2NjY2NjY0MzMzMzMzMzIyMjEwMDExLy8vLy4uLi4tLSwsLCwrKysrKysrLCwpJiMoL01tYFZVWF5mbFsmIiQlIyIgHx0hKTNIbHFiV1ZaaHAyJiMkIyEhICEhISAhJCIoLjM3ODIvKystKiclIyIjLWhua2pqbXBsbHRhLjVfa2lnY2BiSltRKys8Pjs6PT9EPjc1NTk4MzAyNTg8QD06Nzo+Pj4/Pj06OTc6PD9ESU1PU1NRUVNVVldUUk5KS0tLS0lHSk1NTElGQUNJT1dcYWNmZmNZWmVweoeOkI6Ni4iIiIqNjoyJiIeJhH1oX2x5hY+Rj4uIhoSBfnx4eX6Eh4eHhYGDiY6RjYuIh4eIiouLi4uLi4yNj4+Pj5CQj5CNi4mHhX53b2RbbW1bUldWWWBcWFhZXmRmZmNcVUY1MUdRT1JaXXqiqo5flIlzn7K1qHZWSUlMT09PU1ZWUk9UVVRVVFJRUVJRTk1hfpalq7CvqqehnZyenp2cnJyYk5KQjYeAeXd4eHp6e3t7e3x9f4KDgICAgIB/fn58enl3dHJvbW5xeoOIiYiGhomNlJWUkJCQjo6NjYyNkJKUlJGNjZKYnJ6ZkYuJiImLjY2JgHZveIiMioiEVlZWVlRUVFJRT05MSkhHRUNBQT48Ojg3NTQzMzIwLy8tLCsrKysqKioqKioqKioqKSkpKSkpKSkoKCgoKCgoKCcnJycnJycnJycnJyYmJiUlJSQkJCMjIyIiJCMkJCQkJCQlJSUlJicnJycnKCgoKCgpKSkqKisrLC0tLi0uMDAwMDIyMjIzNDMzNTU1NjY2NjY2NjY2NjY1NTU1NTU2NjY2NjY2NjY2NjY2NjY2NDQzMzIyMTExMTExMDAwLzAuLy8uLS4uLSwrKysrKyspKSkqLC0tKyklJCctTW9iVVRXXWRsXzQhJCMiIR4eICElKkVwbmBZWWByVSMlIiIiISAgICAgIiQoLS8yNzYxLC0uLywpJSQiIlh2bWdnbGxtdWtPM0NhaGpqaGReTFxbNS46QD9AQEJCPjgzNTpAQjw0Mzc5OTc2NTY3Ojo8Pjw8Ojo3ODs+Q0lPUVFRT05PUVRVU1FMTEtLTExLS01OTk5MR0RBQkZPVFxhY2VjXFtpdoKJi46MioeFhoaIiomGiIiIiIR+amJwe4ePj4uIhIKAfHdxb3N5fICDhoeEh4mNjYyLiIeIh4iKioqKiouNjY+QkpKQkI+PjIiIhYKAeHNzc3JxaWdqaGlpY1dQUVdbWlZUVVVPQ0NUU1ZZXWdldKSdgJmJhaOvr6Z8V0pISU1MTFJVUU9QUFJVV1dVUVJUT1RmiKayuby6uLCppZ2dm5ueoKChn5yZmZWQh3t2e3p6ent7e3p5fH6Bgn19fn5/f399fXx8eXdycXBwdX2EiomFg4eKjpWUko+Pj42NjY2NjpCSk5CPjpGWmpuYk42JioiKjI2MhntybneFiYqIhVVVVFRTU1NQUE5MS0lHRURCQUA9PDs3NTc0MzMxLy8vLSwrKysrKioqKioqKioqKikpKSkpKSkpKCgoKCgoKCgnJycnJycnJycnJiYlJSUlJSUkJCQjIyMiIiMjJCQkJCQkJSUlJSYnJycnJygoKCgoKSkqKisrKywtLi4uLjAwMDAyMjIyMzQ0NDQ1NjY2NjY2NjY2NjY2NTU1NTU1NjY2NjY2NjY2NjY2NjY0NDQ0MzMyMjExMTExMTAwLy8vLi8vLi0uLiwsKysrKysrKikoKSsrKyooJigrLi9QbmRYVFdaXmZmQyIfIiAeHh8gIB0hR3dtXlZaZXE6ISMjIiEgICAgICMmLTIxMTEsKywtMTIuKickIzxzampnaWtwdF88O1plZ2pmZ2dhTVZfRjI5RT9EQ0VDPDs3NTY+RkVBOTU1NTY0MzMyNTk5Ozs8PDs6OTk8QUVKUFJUUk1MTU9QUVFNTEtLS0xMTk5PT09PTUdEQUBCR0tSWWFlY1teb3yIi4qMioeFhYaEhYSCgIaGhoeDfGpjcX6Mj42KhoOBfnlwZ2dtc3Z7foKFhYmJjIuLi4iJh4iHh4mJioyNjY2Nj5CQjo6NjYuHhYKAfnZycHBwcXN0cW9jXWFTRUVQV1ROSElOUE1LUVFQVFNmYWCRlHyNpaiprKqfbUxISE1OTU1OUFBTVFRTUlNUUlFRUFVukKq3u72/vLq1raienp+enqCko5+dn6GgmY98dXt7enp7e3l5enl9gYB7e3x9f35+fX19fXt6d3RycniAh4qIg4SJjJGVk5CPj4+NjIyMi4yQkpOQj5CUmJqYlI2LiYmJioyNioR4bm14hoeIiIVUVFJSU1FQT09OTElIRkRDQT8+PDs6ODY2NTMyMTAwLy0sLCsrKyopKioqKikpKSkoKCgoKCgoKCgoKCgoKCgoJycnJycnJiYlJSUlJSUkJCQkJCUkIyMjIyMjIyMjJCQkJCUlJCUlJicnJycnKCkpKSkpKiorKywsLS4tLi8wMTAxMjIzMzQ1NTU0NTU1NTU3NzY2NjY2NjU2NjY1NTY2NjY2NjU1NTU1NTU1NDQ0NDMzMjIxMTExMTAwLy4uLS0vLi0sLS0sKysrKioqKikoKCoqKy0sKScrLC4wL0hrY1ZTVFhdX2ZRLx8hHx4eHx4fISNVemddW15qYCUiIyAiISAhISAjKCosKisrKSwsLTQ2MSwoJTJsbmZmamlqcF08SGdmYWFiY2NjV1JWSTY1PTs9Qz8/PTk3NTMyOkJEQjw1NDMyMzAzMTI1ODk7PT49Ozo8QERKTVBTVlVSUE9OTk1MS0tLTExNTk5QUVBPT01IRkNBQEBDSFJaYWFgZniDiouJiYaEhIKBhIJ8eXuEh4WEgHtqZXOCjo+Mh4OCgH52bGBfZGtvc3d8gYKFh4qJiYqKiYmHhoaIiYmKi4yNioyMjIyKjI2Mh4SBfXx6d3RxcXFwcXFuXDk0ODk8RElOTUtLS01JSkZNUlJQbGxqipiJjKCnqKmokFVGR0hKSklMTE9LS1BPTU1PUFBRT1h3ma24u72+vr6+vLStpJ+gnZ2dn6SgnKCmpZ6XhHZ6fHt6enp6eXh5fH6Ad3d5fX18fX19fX18fHl4dHJ6gomJhoSGiJCWlpOQj4+OjIyMjIyOkZSSkJCVmJuZlo+LiomJiouNi4Z9dW9ueoeIiIeFUlJRUVBPT05NTUtIRkVDQkE/PTw7OTc2NjUzMjEwLy4tLCwsKysqKSoqKiopKSkpKCgoKCgoKCgoKCgoKCgoKCcnJycnJyYmJSUlJSYmJSUkJCQkIyMjIyMjIyMjIyQkJCQlJSQlJSYnJyYmJygpKSkpKiorKyssLC0uLi4vMDEwMTIyMzM0NTU1NTU1NTU1Nzc2NjY2NjY1NjY2NTU2NjY2NjY1NTU1NTU1NTU1NDQzMzIyMTExMTAwMC8uLS0tLi4tLCsrKikpKSkpJycqKSkpKistLCkpLCwtMDEzRWdqXVRSU1leZGJGJB8eHx4hISEiJ2Z4YltdYG5KGx8iIiEgICAhJigqKysqKiotLS4xMjAsLC9jcGplZGhrbl9NYGpoZGFhY2JbX1tKPzQ3ODk5Ozw6OTc1NjUxMDhBQkI9NjMxMC8vMDEyMjM3Ojs9Pj49P0RIS01QUlRTU1FQTk1LS0tLS0xMTlBQUVRTUE9MSUZDQkA+P0BHUVVbYm18hoqKiYeEg4KCgoF9dnF1gYeFhIB7aml2hY+NioOCgH59eG1hXWBlaW1xdn2BhISGiYmHh4iHhoaGhoaGh4mKi4mIhoaHiIiHiYiEfnx7end2dHBxcXBxbk0pNTY4ODxDREpQU09LSEtNVlpaVl5fbISSmJmeqKqnpHdESElJS0pJTExNSkpMS0pMTUxNTVRznK+4vLy+vr6+vry5s62koJ+dmpmYm52epaWhm4t8en17en18enp4eHt9gXZzdXd6e3x9fXx8fHx7eXd0eoKJiYaEhoiQlpOQkY+PjoyMi4uNkJGRkJCTl5ualpCMioiHiYyNjYmCeXFvbnuHiIiHhVFRUFBPT01NTUtIRkVDQkFBPzs7OTg2NjU0MzIwLy8vLSwtKywsKioqKikpKSkoKCgoKCgoKCgoKCgoKCcnJycoKCcnJiYmJiUlJSUlJSQkJCQkJCMjIyMjIyMjIyMkJCQkJSUlJSQlJycnJycoKSkpKioqKyssLC0sLS4vMDExMjMyMjM0NTU1NTU1NTU0NDU1Nzc2NjY2NjY2NjU1NTU1NTU1NTU1NTU1NDQzMzMzMzMxMTExMDAvLy8vLi4uLSwsLCssLCsrKioqKikpKSkoKSktLzAuKyorLzM0NzdCY25eU1FTVV1jalsxHh4gIB8gJCQzbHJiXlthbTAdHyAiISIiJCgqLCosKysrLi8wMTIvLC5gb2doZ2lqcGhkamtoZWBgYWNiXVZIODIwNTc2OD5APDg0MzY0MTA3QUZEQjo0MzAuMDEzNDU0Njc5PD5BQUJFRkhLTk9PUVNSUE5MSklJS0tNTU9QU1NVU1BOTElGRERAQUE+QUVLVGFyhImJiYiGhIGAgIB/em5rdoCIiISAeWpqd4WMi4eCgH99enZrZF9eX2VobXN5gIWGhoiIh4eEhIeFhYWFhYWFh4aDf3x9fn6CgoSGhoF+fXp5d3Z1dXR1dmtSLy46PD5DR0tHR0hPUFFYWFZcYGFlaWRti5eTnKeppqBtQUZKSUxLSklKSUpKSkpKSklLSlNslq63vL2+vr6+vr6+vrm1rqWjoZ2amZmYmJ2jo5+VhHp+fXt7e3t5enh4en5zcHR1d3d8e3x+fn59fXt5dnuDiYmFgoeMkZWUkZCOj4+LioqLjJCSkZGTlpmZlZGNiomIiYqLjYyIf3Vvb257hYiIh4ZPT05OTU1MTExKR0ZEQkBAQD07Ojo3NjY0MzIyMC8vLy0sKyssLCoqKiopKSkpKCgoKCgoKCgoKCgoKCgnJycnKCgnJyYmJiYlJSUlJSUkJCQkJCQjIyMjIyMjIyMjJCQkJCUlJSUlJycnJycnKCkpKSoqKyssLCwsLS4uMDAxMTMyMjIzNDU1NTU1NTU1NTU1NTY2NjY2NjY2NjY1NTU1NTU1NTU1NTU1NTQ0MzMzMzMzMTExMTAwLy4uLi4uLS0sLCwrKysqKikpKSkpKSgoKSkpLS8yMS8tLjE0Nzo9Pj5VamVYU1JWWF9paE4lHiAfICUoKDtxcl1fYWtiIB0eIiEhISQoKiwsLi0tLS4vMDExMCxVcmZjZGhrcG5qaGdlZmRhYWJjZGZZNTEzMzM0NTlBR0M5NDQ1MTEwND5FRkE6NTEvLjAxMzU2Njc3OTw+QkJDRUZKSkxMTE5PUVNPTUxJSUpKTE1QUlRUVVNPTUpIRkRDQUFBQD4/Qk9bcIOKioiFgn9/f4B+enFobHSCh4eGgXltbHiFiYmEgX98e3x2a2JfXFtfYGZtdX6Ih4SGhoeHhISFhIWFhISFhYOAe3ZxcHFvdXx+goWCf358e3x7e3t5eHl7d2dKQEFGUFteWEtNWFxdXlxaYWRlZmtrY3uUi5unp6WZY0NISklKS0pJSEhJSUpKSEhJSU9mjaq3ur6+vb6+vr6+vr6+urarp6Ohm5mZmpaXn6KinI6Ae3t8e3t7enh4eXt9bmxucXR0eHl7fH18fHx7enl7g4qIhIOKjpWVk5CPjo6OiomKi4yQkZKTl5eYlpGMiomHiomKi42KhH11b29ufYaJiYeGTExMS0tLSUlKR0RCQ0FAPj47Ojg3NzU1NDIxMDAwLy4uLiwrLCwqKioqKSkpKSgoKCgoKCgoKCgpKSgoJycnJycnJycmJicmJiYmJSUlJSUkJCQkIyMjIyMjIyMkJCQkJCQlJSUmJycoKCcnKCkqKioqKisrLCwtLS0vLzAwMTI0MzMzMzQ0NTU1NTU2NjU1NTU1NTU1NTU2NjY2NTU1NTU1NTU1NTU0NDQzMzMzMzMyMjExMTAvLy8uLi0tLC0tKiorKyoqKSgoKCcnJycoKCgoKS0xNDQyLzIzNjo8QkVBPklkbVxTUVFVWmZtYTkfHCIlJywsSHRqY2BgcEYeHiEgIiElJistLzIwLi4wMDAyMjFMcmhiY2VqcHBpZ2RkZGRkY2VmZGpiRTEyNTUzNDg6RFhdOTMzMzIxMDM6RUtGOzUzLiwvMTM1Njc4Nzk7PkJDREZGSUdKSktMTk9SUlJOS0lISEpKTU9TVFVSTUtJR0RDQkBAQEFAQD9GU2l6hIeFgn9+fX9/fHVqY2l2g4qIhoJ5b215hYiGgn9+fHx6dWZlZmVkXl5haXSAiIeFhYWGhoSEhISEhYOFg4KAenZtYmFlZXN7fH2BgoB/fH1/f4CBgYKAfn55cGhkZWhpaWRXW2BhYGBiY2ZnamtvaGJsi5afp6mkj1NDRktLSUpJSEZHR0dISkdHSEldhKOyuby9vr6+vr6+vr6+vr24s62ln5uamJaVkZOXmZmUhXp5enp7enl4eHl5fnBqbGxxcnR2eXx+fHp8fHx6fYOIh4SEio+WlJCPjY2OjYqJiouOkpKUmJqZmJOMi4qJiImMi4uLh4F8dG5vbnyIiYmIh0tLS0lKSkhIR0hGREJBPz08Ojo4Nzc2NjMyMTAwMDAuLS0sKywsKioqKikpKSkoKCgoKCgoKCgoKSkoKCcnJycnJycnJiYnJiYmJiUlJSUlJCQjIyMjIyMjIyMjJCQkJCQkJSUlJicnKCgpKSkpKioqKisrLCwsLS0tLzAwMTEyNDMzMzM0NDU1NTU1NjY1NTU1NTU1NTU1NjY2NjU1NTU1NTU1NTU1NDQ0MzMzMzMzMjIxMTEwLy8vLi0tLSwsKyoqKSkqKikoKCgnJycnJycoKCktMTY3NTI0Ojw+QkZKQkNAP1ZrYldRUFNbX2duXjQcJCssLS5PeGpfX2BsNB8dICIkJiYpLTEyMzIyNDQ0NDFJc21mZmZpbnBoZWRkZGRkZWVnZGRZQzc1MzQ0Mzc7P0NMTjcyMzMyMjEyOENIRj04MzAuLi8wMTU2NjY5OzxAQkRGRkdGR0hISU1QUFFOTEtJSEhISEpOUFNUUE1LSUdEQ0E/QEBDRENBQUhZanR8gIB+fXx+fHduYmJrd4SKiYiEe29teYSHg399enx8eXVsaGpoZWBeXml2hYuKiISEhISEhISEhISGhYOAfXdvZVdOUVhtdnl7fX+Af35/gYOGh4aIiId/fXdxc3NxbmpkV19hYF9fYGVlZ2hsb2djZ3uVnqWlo4dKRUtKSUhGSEdHR0dHR0dJSEZMbpqvuLy/vr6+vr6+vr6+vr69u7SspqGdmZWRkI2JhYSLj4V7eXp5eXp6eXl6e4BxamdnbnFwc3Z4enx6e3t9e36FiIeDhY2SlZKQj42NjYyKiouMkJSXmJqZl5KMiomJiImLi4uLioZ/eXRubm99h4mJiYhJSUlJSEhHRUREQ0JCQD8+PDs5ODg2NjU0MzAwMC8vLS4tLSwsKyopKSkqKikpKCgoKCgoJycpKSkpKSkpKSkpKCgnJycnJiYlJSUlJSUlJSQkJCQkJCQkJCQlJSUlJCQlJSYmJSYnKCkpKiopKSosKyssLC4uLi4vLy8wMTEyMjMzNDQ0NDY0NTY2NjY2NjY2NjY2NjY2NjQ0NTU1NDU1NjQ0NDQ0MzM0MjIyMjIyMjExMDAvLy4uLi0sLCsrKikpKSkpJycmJicnKCgnJiUlJicpKzE2Ojk3Nj4/QkhMTUpJQz88UGJlWlJSVVhcX2luUjEpKSkpKVNzYlpgalsgIiQkJioqKi4wMjQ1NDU3NzU9aWtoaGtrbHFnZGVnaGhjZGVpaF5HQEIzMzIyMjdGREA3MzIxMjExMTE0NjY6QEM8OzYuLi8vMTIzNDU2OTs8PUFDREVGRkdFR0hJTE5OTU1LSUhIR0dJTE5QUk9MSklHRURDQEBAQkRERERFSVNga3R4ent7fHZxaF5ganeEi4qKhn1vbnuDg4N/fHt7e3x7c2tqamhlYmNufo2QioaDgoGBgoODg4KEhYN/f3p0Zl5NQ0RWbXN3enx+fX5/gYKEh4uMjY6Oioh/dHBwbW1jWFxfX19gYWJkZmdlY2tnZGl1j52gpKCCRz9HSUtJRkZGRkZGRkhFR0ZGWoiot7y+vr6+vr6+vr6+vr6+vbmyrKekoJ2YlI+NiYWChomBenl5eHh4eHp6ent/cWdlaGhtb291e3x9fXt7e3p+hIiHg4qSlpWRjo2NjYyMjIuLjpGVmJmal5ONi4qJiYiJiouLi4eBfXlybm1ugIaLjIuLR0dHR0VFRURDQ0FAQD89PDo5ODc3NTU0NDMwMDAvLy0tLS0sLCsqKSkpKiopKSgoKCgoKCgoKSkpKSkpKSkpKSgoJycnJyYmJSUlJSUlJSUkJCQkJCQkJCQkJSUlJSQkJSUmJiUmJygpKSoqKSkqLCssLC0uLi4uLy8wMTExMjIzMzQ0NDQ1NjY2NjY2NjY2NjY2NjY2NDQ0NDU1NTQzMzQ1NDQ0NDMzMzQyMjIyMjIxMDAvLy4uLS0tLCsrKikpKSkoKCcnJiYmJicnJiYlJSYnKCovNzw9Ozg8QkhKTExKSUVEPz1HWGplW1hYWFlbYmhmUioiKCkoWnRkXWJsTB0mJCYqKistMDM3ODo7OTg3ZmpnaWtqb3BoY2ZnZ2doZmdpbFdBP0I3MzUzMzM3Q0tFNzMxLy8vMDEyNDY5OTc5OTk1MS4uLy4vMDI1Nzg5Ozw+QUJDRUVFRUVER0dISElJSEhGRkdHR0pPUVJPTEpIRkVEQ0BAQEBDRUVFRUdIUFtkbXR5e3dxZmJeX2t5houJi4V7b297gIB/fHt7e3t9fXlwb2xqaWZmcYGQkImFgoGAgIGCg4ODhYSCf316dGdaVEtIUGN0dnZ5e31+f4GChIeLjY6OjouJgXdwb25qW19gYWBgY2FjZWZnY15lZmhucYaanZ+df0ZARkdIR0hFRUVFRUZFRURGT3Sesrq9vr6+vr6+vr6+vr6+vr25sqyno5+dmJOKhYSFhouLhHt5eXl5eXl5eXd5fXJnZWdnam5uc3Z5enx7e3t6f4WIh4WNlJWTkI6MjY2MjIyLi46TlpiXlZGNioqKiYmIiYqMjImGf3x4cG1sc4KKjo6OjkVFRUVEREJBQEBBQD48Ozo6ODc2NzQ1NDIyMTAwLy4uLi0sLCwsKyoqKioqKiopKSkpKSkpKSoqKioqKikpKSkoKCcnKCgmJiYmJSUmJiUlJSUkJCUlJSUlJSUlJSUlJSYmJycnJygpKSkqKioqKiwsLCssLi8uLy8xMTExMTEyMzM0NDM0NDQ1NTU1NTU1NTY2NTU1NTQzNDU1NTUzMzQ0NDMzMzMzMzIzMzMxMTExMTEvLy4uLi4tLCsrKiopKCkoKCcnJyYlJyUmJiYmJSUlJSYqMTk/QkI9PUZLS0xKSkhFQj8/QTtJYGpkWVlZV1ldYGtnQSYmJihidmRiZGo6HyEoKyosLS0xNDU2ODg/amtnaWlnbHRrZGZnaGhpaWxsX0g6QkU+MzE1MzAxNkFbUjUyMC8uLjAxMzQ4PDo5NjY2NDItLC0tLS8wNDc5ODs9PT9BQUJCQ0NEQ0NDQ0NDQ0RFREVGRkdHSktOUUxJR0ZFRUNBQD9AQ0RHR0ZGSUdNVl9nb3NxZ1NYX2Jue4iKiYmEfHFwe35/fHt5eHl5fX1/dG9ubmtpbHaFkpCHg39+gIGAgYKDg4KCgYB+eXNoYVtXUVFaaHN1d3h6fX+AgoSHio2Pjo6NiYF3cGxqYl1gYWJiYmFjZGZnZF5ZZGZlbXJ6kZqemnhAQkZFREhHR0VDREZERENFSmSSrLi6vb6+vr6+vr6+vr6+vr28trKsp6Kdm5aPh4SCgYOFiYd9e3t6enl4eHd2d31zZGRnZWZrbG9zd3h7e3t7eoGHiIaIj5SUko+PjY2Ni4uLi42QlJaXlJONiYmIiIaHhoqMjIuGgH97eXV0d36Ijo+RkY9CQkJCQkJBQUBAQD88Ozo6OTc2NTU1NDMyMjIxMC8uLi4tKiorKysqKioqKioqKSkpKSkpKSkqKioqKiopKSkpKSkoKCgoJiYmJiUlJiYlJSUlJCQlJSUlJSUlJSUlJSUmJicnJycpKSkpKioqKiosLCwsLC8vLi8vMTExMTExMTM0NDQzNDU1NTU1NTU1NTU2NjU1NTU0NDQ1NTU0MzM0NDQzMzMzMjIyMjMzMjExMTEwLy4uLS4tLCwrKiopKCgoKCgnJiYlJSUkJSUlJSUlJicoKy86QkdIQz1GTk9QTkpKRUI/PTw6NjlNaGldWFZUVVldY2lWMiEkLGB2Y2NiZzEiKiwwMzIxMzc4PDg9aXFqaGpoaW9sZmdqamdqbm5bQjk6P0RJOzM0NDIwMTY/UEkzMC8vLy8yNzY3Njk8PDk4NTMvKyssLC0tLzE1OTo7PT0+QEBAQD4/QUA/Pz0+PkA/QUFDREREREVISkpJSEZERUVDQUA/QENERUZHRkhHR0pPWGBmY1ZJT15lbnyJiouKhXxwcXp9fn15eXp6enx/gHd0cW9ubG55iJKNhoF/fn5/gIGDhIOCgX+Afnt4cmllYVtXV11pc3V3d3p9f4GEhYiMjo6OjYmCeHBnY2BgYWJjY2NjZGZmZmFdXWhoaGtydYCVnpt1PEJFRklHRkdEQ0RFQ0NCRVeDpbS7vb2+vr6+vr6+vr6+vr6+urayrqmimZaRjYiEgn59e36Ffnt7enp7enh3dnd9d2dlZmdlamxvcHN1eXt7fXyBh4eFipKUlJKPj42NjYuLi4uPkpSWlpGMiYmJiYiGh4eKjIuJg4GBf3+Ag4eJjJCQkZORQEBBQUBAPz89Pj48Ojo5OTg3NDQzNDMzMjIxMTAvLi4rKywrLCsrKSkpKioqKioqKysqKioqKysrKysrKioqKioqKCcoKCcmJiYmJiYmJiYmJiUlJSYmJiUlJSUlJSYmJiYmJicnJykqKioqKiorKywtLS0uLy8vMDAxMTIwMjIyNDQ0NTU2NjY2NjY1NTU1NTU1NTU1NTU0NTU0MzMzMzMzMzMzMzIyMjEyMjExMTAwMC4uLS0tLSwrKiopKSkoKCgnJiYlJSUmJSQkJCQkJSQmJiouOEVMUElER1JUVlJNSURBPjw8OTkyLjhWZWJXVVNWWFxeZ2dLKx8nY3JhZWhdJyosMjc9Q0tMSUBJanNtam1paXBuZmhpaWtuZ1pMOzk6PT9AOzY0MjIwMDQ2Nzs3MS8xMS8wMzc6OTc6QEE9OjUzLysrLC0tLS0vMjY2OTs7PD89Ozs6Oz0+PDs7PT4+Pz9AQUNDQkFERkZHR0ZEQ0JCQD9AP0BCQ0NEREVFRUZFR0pRVVFKRUdXZnN+iIiIh4N5bXB3e317enl5eXp8gIR+d3Fxb29yfYuTjIWAent6fn+Bg4WDgn58fX19fHVxbWlkYWBjYmlzdnd3e3x/g4SGiIuOjo6KgnlwZWJiY2RjY2NjY2NmZGNjXV5pamptcnN0jJuYcj5BRURFQ0NFRERERURCREttma62ur2+vr6+vr6+vr6+vr6+vrq4ta6roJWRkI6MioWDfnp5fn57enp6eXh4d3Z1fHpoZWhnZGVqbm5xdHZ5fH18gYiGho6SkZOQjo+NjIyLi4yMj5OWlJGMiIuLjI2Ni4eIiouJhYSGhoeJi42PkJGQkZSTk0BAQEA/Pz8/PDw7Ojk5ODg3NjY2NTMzMzIyMTEwLy4uLCsrKysrKikpKSoqKioqKisrKioqKisrKysrKyoqKiopKSooKCgnJiYmJiYmJiYmJiYmJiYmJiYlJSUlJiYnJycnJycnKCkqKSkrKysrLCwsLS0uLi8vMDAwMTExMTIyMjM0NDU1NjY2NjY2NTU1NTU1NTU1NTU1MzQ1NDMzMzMzMzMzMzMyMjEyMjIxMTEwMC8uLS0sLSwrKyopKSgoKCgnJiYmJSQkJiYkJCUmJCMkJCYpLThFT1RSTUtTWFZTT0tHQz87OjczMi8uLD1YZ2FZVFNWWFtgZ2JCJiReb2FlZVY6ODU9QElMUVhjcnJsbWxqa3BwamlrbG9qU0VGR0hDQUJBPjg0NDIwLy8zNjc2My4tLjExMTQ5PTs3O0JEQD03MS8rLCwtLS0tLzE0Njc4Ojs9Ojg4OTw8PDs7Ozo6Oj09PT4/QUJDQ0RERURDQUBAQEFBPz9AQEFBQkJCQkRDRERDREVGREVFU2h1g4eGh4WAdG1xeHh6enp5eXl6e3yJjHh1cnFxd3+MkouFgHt6eXt+f4KEg4J+eXd4enl6d3hwbmxtbWxobXR3d3h7fYKFhoaHiIuKh391bmpmYmZlZGRjY2NjY2RiYF9mbG9sanB4eYGOk29DQkdERURBQ0REREVEQkNXhaazt7y+vr6+vr6+vr6+vr6+vr29ubiyq6CZlZaVlJGOioV+dnV5eXl6enl4d3d1dnl6Z2VlZGVmaWtsbnJ2eX19fISIhoiQk5KRkY+PjYyMi4uMjJGSkY+MiIiKjZGWlpKOi4qLioiMj5CSkpKRkJKRk5GRkpI/Pz8/Pj49PT47Ozs5Nzg4NzY3NjQzMzIxMTAwLi0uLisrKysqKysrKioqKioqKiorKyoqKiosLCwsLCwsLCsqKiwrKCoqKCgmJicnJycnJycnJycnJygoJycmJSYnJycoKCkpKSkpKioqKywsLC4uLi4uLi8wLzAwMDEwMDIyMjIzNDQ1NTU1NjY2NjU1NjY1NTY2NTU0NDQ0NDQzMzMzMzMyMTIyMjIxMTAxMDAwLy4uLS0sLCsrKyopKSgoKCcnJyYmJiUkJCQmJCMjIyMjJCMkJis2QUxWWlZRU1hZWFROS0hEPzw4MzEwLi8sLERhaF5WVFRUWF9jaGNFLF5pXWNoUCs3PEVUXWRqb3NqamxtbXBwbGxtbWdQPEJNUU9ISUxJQTo1NDMyLi0wNTU1NDAvLCsyNTMzODk5ODlARENCPDUxLS0tLCwuLy8xMzQ0Njg4OTg3Nzc7Ojo5ODk4OTo6OTs9PD1AQUJEQUJCQkA/QEA+Pj8/Pz9AQEFBQUFBQkJCQ0NDQkJCRVRpdoGAgYKCe29pb3Z2d3h4eHl6dXV2h5KAeXZ0cniCjJCKg397eHh4fH+ChIWDf3hwcHR3dXd2dXNyc3V0cWxrdHd4eHt/hYaFhoeIiIV9dXNwa2ZjZWZmZmRjY2JjYFtdY2drcW5vcnV7iYhwRkNDRUVFQkFCQ0RFRkNKapestbu8vr++vr6+vr6+vr6+vr6+vr27ubOoo6KgoKGclpOMf3Z1d3h5enp5d3d3dnh6fWhlZWNmZGdoa25ydnl9e32FhoaJkJSTkpCOj42MjIuLi42SkY6MioiIi5CWm5qXlZGPjpCRk5WWlJOTkpKSkZGSkZKPPDw8PDw8Ozs8OTg4ODc1NTY1NjUzMjIxMTEwMC4tLS0rKysrKioqKioqKioqKioqKysqKiorLCwsLCwsLCwsLCsqKikoKCgoJycnJycnJycnJycnJycoKCcnJycnJycnKCgpKSkpKSorKyssLCwuLi4vLi4vMDAwMDAxMDAyMjIyMzQ0NTU1NTY2NjY1NTY2NTU2NjU1NDQ0NDQ0MzMzMzMzMjEyMjExMTEwMDAwMC8uLS0sLCsrKioqKSgoJycnJycmJSUlJCQkJCQkIyMjIyMkJCUpMDpGUVlYUVFYWVhYU09MSEQ/Ozc1Mi8uLS8qMUhlaVlTU1ZYWVxkaWJWanFjZGJKOEtfZWdnbnRsaGpsbXBwa21sXT0tNUlbXVRPTUVHRz03NDIzMC8sMDo9NjIxLi0tMDM2Njg6Ojg5PkFFQkA5My8tLSwsLS4wMjIyNDU1NTY3Nzc4OTg5Ojk4ODg4ODg4OTs7PT9AQUJCQkI/Pj8/Pj4+Pj4+P0BAQUFBPz8/QEFBQkBCQUpba3l7e3x9eXJraXB0dHZ3d3d5eHJnbICTj3p4dnN5goyOiIN/fHl5eXx/g4WGhH94b2ltbW9wc3Z2dXV3dnV0cG1yd3p7f4SFhYaGh4eEf3l0cG5pamdmZmVjY2NjYV1aXWNnbXV1dW9tcIaIcExERERFREFDQ0NEREVGVoCjsri7vb6+vr6+vr6+vr6+vr6+vr6+vry7uLa1saqmo5uUjoN6dXd4eXp6eXd3d3d3en1oZWRjZGVnaGltcXR6fHt9hIWGiZOUk5KPjo6NjIyLi4uNkI+NioqIiIuQmJ2cmZiWlZaWlpeXl5WUk5OTk5KSkpGQjDw8Ozs7Ozo6OTk4ODc2Nzc2NjU1MjExMTAwLi4tLCsrKioqKioqKioqKioqKiorKyoqKystLSwsLS0tLS0tLCwsKyoqKiopKSgoKCcnJygoKCgoKCgoKCgoKCcnKCgoKCkpKSkpKSorLCwrLC0tLS0uLi8vLy8wMDAxMTEwMjIyMjM0NDQ0NTU1NjY2NTU1NTU1NTU1NTQ0NDQ0NDMzMzMxMTExMDAwMDAwMC8vLy8uLS0sLSwrKyoqKikpKCgnJycmJiUkIyQkIyMiIyIiIiIjIyMkJi02Q01TVFBOVVpbW1lUTUlHQj88NzMyLyssLCwrM1VpX1pXV1dZWVpianF1dHBvbmxpZ2VibHJqaGdqbnFybmpcPiIpM0ddX1pSTUI4RUU7NTIyMC8uLzdITDwzMS8vLi4zNzg5Ozg2NzxCRkNBPDcxLy0sLC0vMTMyNDQzNTU1NTY2NjY2ODc3Nzc5OTg4Nzc4ODs9Pj9AQD8/Pz4/Pj08PT09PT4/QEFBQUBAPj4+QEA/QklXY3J6d3Z6eXFqXmJscXN1dXZ3d3dxY1dujZiCfXl4e4SMi4aCf316ent8gISFiIeDfHNiX2RnaGxucHN1eHh2dHN0dHR1en6DhIWFhYeHh4N7d3h1c29pZ2ZlZGNiYl9eWl5mbXR3dnVwbGl2hnBRR0ZGRkRDQkNERUVBSmSSqrS5vb29vr6+vr6+vr6+vr6+vr6+vr6+vr6+vruwq6adjoSBenV3eXp5eXl3d3d2d3p9bGNjZGRkZmhqbXJze3p8foWGhouTlpKRj46NjYyLi4uNj5GOjYuKiouOlJecmpqamJqZmZeYl5aVlJOTlJWVkpONjYc6Ojo6Ozs6Ojk5Nzc2NjY2NTU0NDMxMTEwLy4uLSwrKywsKioqKioqKioqKioqKysqKisrLS0tLS4uLi4uLiwsKysrKysrKSkpKCgoKCgpKSkpKSkpKSkpKSkpKSgoKCgpKSkpKSkqKywsLCwtLS0tLS0vLy8vMDAwMTExMDIyMjIzNDQ0NDU1NTY2NjU1NTU1NTU1NTU1NDQ0NDQzMzMzMTExMTAwMDAwLy8vLy4uLi4tLCsrKyoqKikpKCgnJycmJiUlJCQjIyMjIiIhISIiIiIhIyQpMz5HTElGSU9ZXF5dWFFOTEdDPzo3NC8rKikrKCorPFllX1VaVVZXWmFlZmpqamdlZmJganNwaWhrbnR3b1w4Jy02L0lmZ2BdV083NkpDODUxLy8vLi4yOjk0MjEuMDExMTU2Nzs4NTc9QkVFQz04Mi4rLCwtLzAyNDU0MzQ0NDQ0NTU1NDU2Njc3OTk4ODc3Nzc4ODs8PT0/Pz49PT08PD09PT0+P0FBQUE/Pz4/Pj4/QUlUX213dnR2dXBlWE9VYWZrb3F0dXl3bls7Mm2Wi399e36EjIuGgn99enp8f4KGh4iHhoJ4aVlZXWBkZmdscnZ3d3Z2dXV0d3p8f4KDg4SFhYaDfnp5enVyb21nZGRjYl9fXl1hanN5d3Z1cG1rb4F+WURHRkVCQkJDREVFQU5zm6y2uby9vr6+vr6+vr6+vr6+vr6+vr6+vb6+vr69taygkHhucHN1d3d5eXl5d3d3dnd6fWtjY2JkZGZoam1xdHp8fH6EhYePk5OSkY+OjY2Mi4uLjpGQjYuKi46Sk5WWmpqbmZqampmZmJeWlZWTk5KRkY6KhYB7OTk6Ojo5Ojo4ODg4NjY2NjQ0NDQyMDExLy4uLS0sKysqKioqKSkpKioqKysrLCwrKyssLC0tLi4uLi4uLi4tLCssKyorKykpKiopKSkpKSgpJygoKCgoKCoqKSkpKSgoKCgpKisrKyssLC0tLi4tLS4uLy8wMDAwMDAxMTAxMjIyMjMzMzM0NTU1NjY2NjU1NTU0NDU1MzMzNDQ0MjIyMjExMTEwLi8vMDAvLy0tLi4uLSwrKyoqKSkpKCgnJyYmJiUlJCMiIyMiIiIiISEhISEhIiIjJzA5Q0VBP0JNV1pfX15XVVBLR0M/OTAoJygnJiYmJyMqQ1tfWVdTUlVXWVxgYmNjZGNjbHdxaWdscHR5aD8hIygoOU5laWRjY1tMNDJBOTQyMC8vLiwtLzEvMDExLzE1NDEyNTc5ODg4PUVHRkRAOzUwLCsrLi4vMTM0NDQzMzMzMzM0NDQ1NjY3NzY2Nzc1NTU1Nzc4ODo7Pj49PDw8PDw8PT08P0BAQEFBQEA+PD09QUVTX2lzdnJycWxkVUI+RlBYXGJnbXN0dGhZVkxmjpCGgH+Ch4yKhoJ/fn59f4GEh4iJh4mIf3FfUVNVWl1gZmpydHR1dXd2dnl5en2BgYKEhISEg4N+fHx6dXVwa2hmZGFfXVtcZWlwc3Vzc25qaWdyfGNHRkZGREJDQ0RDREJSfqCttrq9vb6/vr6+vr6+vr6+vr6+vr6+vb2+vr6+vbWljnNjZGVpbnN4eXp6eXh3dnd3eX5uY2JiZGZlZ2psb3V7fH1/goWIj5WUk5CPjo2NjIuJiY2OjYuKi46SlZeZmZqcm5qamZqamJiWlpSSko+MiIWAeXVtZDk5Ojo5OTk5ODg4ODY1NTUzMjIyMjAwMC4uLi0tLCsrKSkrKyoqKSorKysrKywsKywsLCwtLS0uLi4uLi4uLiwtLSwrLCwrKisrKioqKSkpKigqKikpKSkqKikpKiopKSkpKisrKysrLCwtLS4uLS0uLi8vMDAwMDAwMTExMjMzMjIyMjMzMzQ1NTQ0NDQ1NTU1NDQ0NDMzMzQ0NDIyMjIxMTExMC4vLy4uLi4tLS0tKysrKyoqKSkpKCgnJyYmJiUlJCQjIyIiISEhISEhISEhISIiIyctOEJHRD5CSFBXXWBfXlxaVE5LRT8uJyYmJSgoKCcmJCQoQF1iVE9UV1daXl9hY2VkbHVzcGtvcnZ4ZTslJigmJz1daWllY19VSSwrODYzMTAvLi0qKywuLzAwMDAyNjcyMjM2Ojo4OT5CREVFQTw2MSwrKy4uLjAxMzMzMzMyMjIyNDQ0NDQ0NTY0NjY2NTU1NTU2Nzc6Ozw9PTk6Ojs7Ozw9PD9AP0A/P0NAPj09P0dSWmdydHF0cmtjVT4wMjk/RElRWmBmbW5oX2VocoKRi4SCgoqOioaEgoCAf4GEh4iIioiIioV6bVZNT1BUV11ka3Bxc3R0dnd4eXp8fX1+gICChISEgn99fHl0dG5qZ2NgXl5cYWpwcHBxcXFtaWhmaXJvUExKSkVCQkJCQUJFVYWjsLe7vb2+v76+vr6+vr6+vr6+vr6+vby8vL69vLmpiGhZX2RlaGhrcXh5eXl5d3Z2dnl+c2ZjY2dpaWpsbnF2fH1+gIKFiY6SkZKPjo2NjYyLiYmNjouKio6RlJiZm5ubmZmYmJaXl5eXlpWTj4mDfnp0bGRZUVA4ODk5OTk3Nzg4ODc1NTU1MzIyMjIwLy4uLi4tLSwrKysrKysqKiorKysrKyssLS0tLS4uLi4uLi4uLi4uLi0tLi4tKywsLCsrKysqKSkqKioqKSkqKioqKykqKiorKigqKyssKysrKywsLS0uLi0tLi4vLzAwMDAvMTExMTIyMjIyMzMyMjMzMzM0NTQ0NTU1NTMzNDQzMzQ1MzIyMjIyMDAxMS8uLy4vLi4uLi0sLCwrKyoqKSkoKCgoJiYmJSUmJSQjIyIiIiEhISEhISEhISAhIiMmKzRBRkZER0lPVVpfYmNhX1xXU00+LikpJSQkJCYoKigoKCQqR11dVVldYGFjY2hobXNwbGttcXN3a040LCsmJypDXmliV1JZU0otKDc2MDAwLy0tKiwwLzExMTIxMzg5NzU3Ojw+PDs7QENFRUI/OzUwLCssLC0uMDExMjMzMjIwMDIyMzM0NDQ0NDQ0NDU1NDIzNDY3OTs8Ozk3ODg4ODo7PD49PT8/QkJCQT88PkNQW2ZxdXNzbmdfUkAyLy8wMzY5QEZPV19iYFteVl10jY6GhISHi4mFhYSEhISEhoeIiImIiIiKhnlsVkpISkxSW2dubm9wcnR3eXh4e31+fn5/f4CBg4KDgH57eHZybmpkYF5bXWVoam1wcW9ubGlnZGRma1dUUElDQkFCQkJBRViHpLC2ury8vr6+vr6+vr6+vr6+vr69vLu6ur29u7ethVxQV11gZGdoaWpyd3h4eHZ2d3h8gHlxcHJzc3NzdHR3fX9+f4GChoqNkZKRjo2NjIyLioqLj42Ki42Qk5eYmJqZmpmYlZSSkZGQkI6MiIB3cGdgWE5HREhOODg4ODg4Nzc4ODc1NTU1NTMyMjIyMC8uLi4uLS0sKysrKysrKioqKysrKysrLC0tLS0uLi4uLi4vLy8vLy8uLi4uLS4sLCwsLCsrKyoqKysrKyoqKysqKissKioqKysrKisrLCsrKyssLC0tLi4tLS4uLy8wMDAwMDAxMTEyMjIyMjMzMjIzMzMzMzM0NDMzMzM1NTQ0MzMzMzAwMDIyMjAwMDAuLi8uLi4uLS0tLCsrKyoqKSkoJykmJyYmJSUlJCQjIyIiISEgICAgICAgISEgICEjJis0P0hKSktOUFNaX2VlZmZiXlhNNCkrKCYkJScmJistLi4rJiUqOktXZ2xqa21ua3VybW1vc3V3bFNJNTI8PTEyTGNkWlNMTU1HMCU2NS8wMC4tLS0vMjAxMjEyMzY5PTs5ODg7PD09PkA/QEJAPz05Mi4sLCwtLjAxMTIzMzIyMTAxMTMzNDQ0NDMzMzM0NDQyMzM1Njg6Ozk4OTg4ODg3OTo7Ozs8PUBBQkE/PUBOWWNvcHFzb2hcTjwuLSwtLzAwMDQ3OkNJTlBXWVJaaX+LhoWFh4iGhYODgoKDg4aHioqKiYiHiYqHfm9bSERFSFFjaWtrbXByeHl3d3l7e3t8fX1+foGCg4J/fXt5dXJuamVbUFRcZWZnbm9ubmxpZ2RkYmBYUlBGREJCQUFBQkRYiKWxt7m8vr2+vr6+vr6+vr6+vr6+vLq4t7u7vbmxlVxFUFlcXmJmZ2lobHR4eXl6enx/goWCf4GCgoKAfn5+foGBgIGCgoaMjpGQj42NjYyMi4qKjY+NjIyQkpaXl5iYmZmXlZOQjIqIhoR/eXNnX1ZORUVGSkxQUzg4Nzc3Nzc3NzY1NTU1NTUzMjIyMjAwLy8vLi0tLCwsLCwrKysrKiwsLCwsLCwuLi0tLy8uLi4uMDAvLy8vLi4uLi4uLS0uLiwsLCwrKysqKysrKyoqKiosLCsrKyssLCoqLCwsLCstLCwtLS4uLS0uLi8vMDAwMDAwMDExMTEyMjIyMjIyMzQzMzMzMzMzMzMzMzMzMzMzMzIwLjAxMTEwMDAvLi4uLi4uLS0sLCsrKyoqKSkoJiYnJyYmJSUkJCQjIyIiISEhICAhISAgISEeICAhIiUrMz1FSUxPUVFUW2Bma2pmZGNbSDEsLywoKSkpJykqLCwtLy4wMTEyOEFRWGBjZnJyb29ydHV0ZVFQTzs7SE9KT1tgWFVSS0tPRjEkMzUwMC8tLi0xNjg1NTMyNDQ2OT8+PTs7PEBAQkE+PD9CQEA9OzQvLS0tLS8xMTIyMjIyMjIyMjIyMjQ0MzIxMTIyMzMyMTIxMTU2Nzc1Njc3Nzc3ODg4ODk5Ojo8PT9APUBIV2FucXFyb2dcUD4wLi0sLS0vLzAxMTI0ODxCSElLUFhqfnx5fH5/gH9/gICChoaHiYmKi4mHhomLjImBc1xIQkNKW2NmZmhtcnl5d3d5enp6enp7fH5+foGBf397end1c29sZV9haGRfZG1vb25saGZiYWFfW05OSEZDQkJCQj5EWYmmsLe5u729vr6+vr6+vr6+vr6+vLu5trW3uru5rYJGRU9WXF5gZGRnaWlvd3t7fH+BhYeHioqLi4qKiYeGhISGhoWEg4OHjI6RkI+OjIyMjIqJi42PjY2PkZSVl5aVlpeXlpSOiYV9eHVxbmNWTEZCQUBDSE1NUFQ3Nzc3Nzc2ODc2NTU1NTU1MzIyMjIwMC8vLy4tLS0sLCwsKysqKSosKyssLC0tLi4uLi0tLi4vLzAwLy8vLy4uLS0tLS4uLi4tLS0tLCsrKywsKiorKysrLCwrKysrLCwsLCwsLCwrLS0sLS0uLi0tLi4vLzAwMDAwMDAxMTEwMTIyMjIyMjMzMzMzMzMzMzMyMjMzMzMzMzMzMjEwMDExLy8uLi4uLi4tLS0tKysrKykpKSkoJycmJyYmJSUkJCQjIyIiISEgICAgISEgICEhHiAgISMoLjY+RUlLUFNUV19kam5saWViVj4uLSwqKiotLSgqKiwsLCoqLS4wMTEwLi4oKGRybGxraGltYElMTlBEQ05SUVleWlldW1VVVFI8Jy82ODMwLi0tMTc9PDo2MzMzNTtAQUFDQT9AQkJBPDo8Pj09PDo1MS4tLS0vMTExMTIyMjIyMjIyMjIzMzExMTExMTMzMjEvLzExMjQ0MzM0NTU1NTY2Nzc5OTo6PD0+Pz5GUF1rcm5vbGZcTj0wLiwsLCwtLy8vLzAwMTAxMzU5Oz5BS2BmYGRoa3Bxc3Z6fYOFhYeJiYuJiYaEh4qMjIR2Y0c/SFdjZmRla3B6eXZ3eXp7eXh4eHp7fH1+fXyAf3x6dnNyb29wbGtua2tvb29samhmYmFiYFxLTE9HQ0JCQkJBQlaEo662uby9vr6+vr6+vr6+vr6+vry6uLOvtbu7t6dwSExRWVxeYmRnampqbXN7f4GEh4uNjY+Pj4+Ojo2LiIeHh4eGhoWEiIyOkI6OjoyMjIyKiYuNj42Nj5GTlJOVk5OUk46Mhn91bGRgWk9FQDw9PkFAQ0hMTk9SNzc3Nzc3Nzc2NjU1NDQzMzMyMjIyMDEwMDAvLi4uLSwtLS0tLS0uLi4uLi4uLi4uLi4xMTExMDAwMDAwMDAwMC0tLi4tLjAuLi4tLS4uLS0tLSwsLCwsLCwsLS0sLCwsLCwsLC0tLC4uLi4uLS4uLjAwMDAwMDAwMC4xMTExMDAyMjIyMTExMTM0NTQzMzIyMjIyMjIyMTExMTExMC4wMC0tLS0tLS0tLCwrLCsrKioqKikpKCgoKCYlJiUlJSQkIyMhICEhICAgICAgICAfHyAgICIkKjA4QEVIS1BTVlpiZmtvbmllXk8wKikpKSoqLTEsLCwsLS0qJSMkJywwMDE2Llp2amprb2xoXFVKSUpJRUtST1hdYWBhYVpYX15aSy8pNEFANS4tMDpBQ0I8NjQ0Njk7P0NERUhEQkFCQzw3ODk5OTo4ODQwLS0sLjAwMTExMTIyMTEyMjIyMjIxMDAwMDAyMjExLy8wMTAwMTEyMjQ0NDQ2NjY2ODk4OTs9PT1ASlZkbmxuamVbTTszLywrLCwtLS4uLy8wMC8vMDAyMjEyMzZARUVJTVNVW2FjaG90eXqAhoWIiYaEhYWHio2Nh3llSUdWZGVhY2lzeXl2dnl5enl3dHF2d3p8fX19fn99fXt5dnNybm5vb25tbG1uamdnZWJhYWJdT0tTUERCRENCQ0RSd5uutrq8vby9vb2+vr6+vr6/v7y7u7WrrbS4t66ab19jZGRkZ2pqa21ubnJ5fYGFh4mNj5CPkJCQkZGOjIuGh4aFhYaEhYmNjYuMjY2Li42Mi4qMjY2OjJCRkZOQkI+NjImFgHZrYVVNRT45ODo7PD5AQERGSUxMTDc3Nzc3Nzc3NjY1NTQ0MzMzMjIyMjAxMDAwLy4uLi4uLS0tLS0tLi4uLiwsLi4uLi4vMTExMTAwMDAwMDAwMDAvLi4uLS4wLi4uLi4uLi0tLS0sLCwsLCwsLC0tLCwsLCwsLS0tLS0tLi4uLi0uLi4wMDAwMDAwMDAuLy8wMC8vMTExMTExMTEyMzMxMzMyMjIyMjIyMjExMTExMTEvMDAuLi4uLS0tLSwsKywrKiopKiopKSgoKCgnJyUlJCQkIyMjISEhISAgICAgICAgHx8gICEkJyw0PUNGR0hLUVVaYWZobGtpZVpCLSgqKysqKigoKysrKywsLCcjIiUlKSwyO1p1bGlramtlW01MRUdFOTVKUFFXYF9bX19aWltfVlM6Ky9ETTkvLzNAREVFQDk5Ojg4PD4/QkRISUQ/Pzo6NzU1NTU4OTk4My4tLC4wMDExMTEyMjExMjIwMDAwMDAwMDAwMDAxMS8vLzEwMDExMTEyMzM0NDQ1NjY4Nzk4OTk6QU5ZaG1tamVcTj41MjAuKywsLS0uLi8vMDAvLzAwMjIxMjIwLzA0NDY4PEBHSE5WXGRpb3V5fYCCgYKDg4SHi4yHfGhTWF9kYmRvd3h3dnZ5eXd2cG5ub3R3ent9fX9+fn59fHp5dnRycXFwbm5tbGpmZGJhYWBhYFZNTVBIQ0NDQ0JES2+XrLa5vL28vLy8vb29vby8u7u4t7Gtpqarr66kl4B4end3dnZ3d3d2eXl9fYCDhYiLj5CRkpGSkpGRjoyJh4aFhISEhISIjIyMjIyMi4uMi4mKjIyNjY6SkY6OjIaFf314bmdaT0U+Ozo3ODc5PD0/QEFERkdKSko3Nzc3Nzc2NjY2NTU0NDMzMzIyMjMxMC8wMC8uLi4tLS0tLi4tLS0tLS0tLy4uLy8wMDAwMDAwMDAwMTExMTAwMDAwMDAwLy8wMC8vLy8uLi0tLS0tLSwsLCwsLC0tLS0uLi4uLi4vLS4uLS0uLi8vMDAvLy8vLy8vLy8vMDAvLzAwMDAxMTIyMjExMjEyMjIyMjExMTAwMDAwMDAwMDAwLy8uLi0tLS0sKysrKiopKSkpKSgnJycnJyYlJCQjIiIhISIiISEgICAgHx8fHyAgICAhIykvNj5FRkZGSU5VWWBlaGppaWdXNy4tLC0pKiopKSgoKCgqKyspKCcnJSYqKElwampmZ2VjUEFLTUlEQkBARk5YYmRcWmJfV1FSXFlPRDozNj0yLi8wOD9FRkI7PkA6ODg5Ojs/SEtGPzo3NTY1NDQ2Nzs7ODUyLy0tLy8wMDExMTEyMjIyLy8vLzAwMDAvLy8vMDAvLy4vMDAxMTExMjIyMjEyMzQ2Njc3Nzc1OUNQXmhqaGZdUD82NDIxLiwsLCwsLi8uLi4uLy8wMDExMDIyMjAwMC8wLy8wMDI2PENJT1VcYmpucnZ4e31+gYOIjYqAcWVhYmZudnd4dnV1dXRybWhnZ2ptc3d5enx+f359fn58eXd1dnN0cnBwb21pZmRkYV9fX2FbS0lKTElFQ0RAQUdtlamyubq6vLy6urm4tbOxsK6rqKajoZ+gpKOgmZSLioqIiIaFhYSDgoGAgYKChYWHiYuOj5GSkpKSkY6MiYeHg4KCg4ODhomJi4uMjIyMjIuKiYqMioyLjYuFgHt2cWlhWk1DPTw9PT08Ojk4OTw/Pz9DRERERERENzc3Nzc3NjY2NjY1NTQzMzMyMjIzMTAvMDAwLy8vLi4tLS4uLS0tLS0tLS8wMC8vMDAwMDAwMDAwMDExMDAwMDAwMDAwMC8vMDAvLy8vLi4tLS0tLS0sLCwsLCwsLC0tLi4uLi4uLy4uLi4uLi4vLy8vLy8vLy8vLy8wMDAwLy8wMDAwMTEyMjIxMDIxMTIyMTExMTEwMDAwMDAwLy8vLy4uLi4tLS0tKysrKiopKSkpKSkoJycnJyYmJCQjIyIiISEiIiEhICAgIB8fHx8gICAgISYpLzY+REdHSEdLUFhdYGRkZWViSS0rKykrJykpKSkoKCgoKCoqKikpJyYmJz5oZmdmZ2RjTkBETU1MPjxKTklXX2NfX2BkYFRUWl1hT0dCOzQ4ODc5MTE0PENDQkI/Ojk5Nzc4O0ZMTUU9NzQ0MzU1Njc6PD48ODMwLS8vMDAwMDExMjIyMjAvLy8vLy8vLy8vLy4uLy8uLzAwMTExMTExMDExMTEyMzM0NDQ0NDhEUV5nZ2RfVUM1NDQxMC8tLCwsLC0tLCwuLi4uLzAxMTAyMjIxMTEwMC4tLi4sLi4vMzc8QEdNU1leZGhscHN4gIWIh4BzZ2hxeXx7eHd3dnFsZ2RcVFZgZ21yd3h6fX59fn1/fH17eXh2dXRzcnFvbWpmYmFfX19gXVBISklIREFDQ0dRao+jrbCxsbGxrayqqaekpKGfnpybmpydnJqamZiVkpGRj4+OjYyKiIaEg4WEg4WFh4mLjY6RkpKSkpGPjYqIh4OCgoKCgoWIiImKjIyMjImIiYaHh4WCgn15cGpjWk9HQjs5Ozs7PD09PDw6OTo9P0FAQ0REQ0NBQTg4Nzc2Njc3NjY2NjU1MzMzMjIyMjIxMDExMC8vLy8vLS0tLS0tLi4uLi4uLi4vLy8vMDAwMDAwMTExMTAwMDAwMDAwLy8vLy8vLy8vLy4uLS0tLS0tLCwtLS0tLCstLS4uLi4uLi4vLy8vLy4uLi4uLi4uLi4uLi4uLi4vLy8vMDAwMDExMjIyMjExMjExMTAwMDAvLzAwMC8vLy4uLS0uLi4uLS0tLCsrKioqKiopKSkoJycnKCYlJCQjJCMjIiIiISEhISAgICAfHx8fHx8gICMlKS82P0ZISEhIS09UWVteX2JgVzknKiknKCgoKCgpKCgoKCkrKysqKCksJENsYGJiZGNlUDtCPDpLRz49RURTZGFdXWFiX2NeYWJgYlRIREhWSj5CRzksMDU7P0JHQjo3NjYzMzZBSk1HQjo1MzM1NTY3OT4/QT46NTEuLi8vMDAxMTIzNTUxMC8vLy8wMC4uLy8vLy8vLy8wMDAwMDAwMDAwMDAwMDExMjIyMjM4Q1FeY2JgWEo7NDQzMC8vLy0sLCwsLCwsLS0vLzAxMTExMTExMjEwMDAvLi0tLS0tLi4tLS4xMzs/REhMUldeZGlwdXd3cmxtc3h3d3l2c3BqYV1YTUhRWl1kbXJyd31+fn5+fn1+fXx7eXd2dXR1c3BsaGZhX2BgX19bTkxKRUVIUFZeanaNoKSmpqako6Cgn56cm5uZl5aYmJiYmJiXl5aWlZOSkpCPkI+OjIqIhoOEgoGDhoaHiY2OkJKTk5KSkZCOioeDgoKCgoGEhoaIiImJioqHgX58enZybmlhXFVMRj47Ojk6ODk7PDw9PTw8Ozo8Pj5CQkFCQ0BAQD83Nzc3Nzc3NzY2NjY1NTMzMzIyMjIyMTAwMDAvLy8vLy0tLS0tLS4uLi4uLi8vLy8vLzAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMC8vLy8uLi0tLS0tLSwsLS0tLS0tLS0uLi4uLi4uLy8vLy8vLy4uLi4uLi4uLi4uLi4uLy8vLzAwMDAxMTExMjIxMTExMTEwMDAwLy8wMDAvLy8uLi0tLi4tLSwsLCorKiwrKiopKSkpJycnJyYlJCQjIyMjIiIiIiEhICAgICAgHx8fHx8fICEjJSkvNDxCR0hJSUlQVVZXWllaV0YtJycnJygoKCgoKCgoKCgrKywsLCkmJj1tZFtbYWZoUz5AOzc2QEY9NTU2UGNjY2RkZGFfYGRlYmNYTERHSkE7QEE6MS4wMjhBREU/NjM0MDEyOkJFRkI7NzQ0NTU3OTs9P0FBPjo1MS8wMDExMTEyMzQ0NDIwLy8vLy8uLi4vLy8vLy8vLy8vLy8wLy8vLzAwLy8vLy8vLy8xNkFNWmFdWlJFOTEyMS8vLy8uLiwsLCwsLC0tLy8wMTExMTExMTIxMTIwLy4uLSwtLS0tLS4vLi4vMDAzNjo+RElNU1ZbXl5eYWZqa2xsamdkXVVRTU1PSUVRXmZqbXB1e3+Af3x8fHx9fXt5eXZ2dHRxbWpoZWNhYWBgYFRMTlFYX2tzfIKNlJuenp+fnJudnZybmZmZmJmYl5eWlpaVlZSTk5GQj4+OjoyLioqJh4aDg4KCgoODhIeJjY6QkpKSkpGQjYqIhYOCgoKCgoSEhoeHh4SCfXdtZmRhWVFLSEE8Ozs7Ozs6Ozw8Ozw8PT08PDo7PD0/P0JCQkJAQD9ANzc2Njc4Nzc2NjU1NDQyMjExMjIzMzEwLy8vLy8vLy8tLS4uLi4vLy4uLy8vLy4uMDAwMDAwMTExMTExMTExMTExMTExMTExMDAvLy8vLi4uLi0tLS0tLS0tLS0tLS0tLi4uLi8vLy8vLy8vLi4uLi4uLi4uLi4uLi4uLi8vLy8vMC8vMDAwMDIyMTExMTAwMDAwMC8vMDAvLi4uLi0uLi0tLCwrKysrKysqKikoKignJycnJiYlJCMjIyIjIiIhISEhICAgICAfHx8fHh4eHyEiJSgpLTM7QURGSEpMT1JTVVVTTT80KScnJycpKSgoKCgpKSkpKystKyspKjBsbGBfYWRmVjhBRDwyMzlAREJLRUlfYmFmZmJjX2NkZGdlZ3VLQD4/PT5AQTkwLy43RUVEQDgyMS4tLzI5QEJCPzs2NTQzMzY4Ojw/QkI/OjYyMDExMDAxMjM0NDUyMjAwLy8uLi4uLy4uLi4uLi0tLi4vLy8vLy8vLy4uLi4uLi4uLzM+SVdbVlNMQTcwLy8vLi4uLS0sLCwsLC0uLi4vMTAwMDAwMTExMTEwMC8uLS4tLC0tLS4uMC4uLy8wLzAwLzE1Njg8PkFDRUhNUFRWVlhVU05FQ0NGS0Y/RFJbYWZsb3Z9gIF/fHx9fHx9fHt5eHd3c3FvbWpnZWJjYWNiXF9rcXuDio+SmJubm5ydnZ2dnJubm5ubmZmYl5WVlZWUlJKQkJCQjo2OjY2Ni4uLiYiGhYKBgYCBgoKFh4eLjI6QkZKSkY6MioaEg4GCgoGCg4SFgoOCf3dsX1VKRUA/QT9CQDo8PDs8Ozw8PDw8PD08PD06OTw8PT0/QkNDQkBCRDc3NjY3ODc3NjY1NTQ0MzMyMjIyMzEwMC8vMDAvLy8vLi4uLi4uLy8vLy8vLy8uLjAwMDAwMDExMTExMTExMTExMTExMTExMTAwLy8vLy4uLi4tLS0tLS0tLS0tLS0tLS4uLi4vLy8vLy8vLy4uLi4uLi4uLi4uLi4uLi4vLy8vLzAvLzAwMDAxMTExMTEwMDAwMDAvLzAwLy4uLi4tLCwsLCsrKysrKysqKiooKConJycnJyYlJSQjIiIiIiIiIiEhISAgICAgHx8fHx4eHyAiIyYpLDA0PEFERkdKTE5QUlJTT0c3LScnJygnKSkoKCgoKSkpKSsrKiwrKCxla2hoZmNnVzdBSEc4LS83Oj0+RD9QZWVnamVjZGRiX2FlYmZkR0JCREVFRUU+My8uMjc5QUU+My8uLS4vMjk+QT85NzY2NDU1Nzg7PkBAQD46NjExMTAwMTIzNDQ0NDIyMjEwLy4uLi4tLS4uLi4tLS0tLi4uLi4uLi4uLi4uLi4uLi4xPEZTVlJOSUA2LSwsLC0uLi0tLCwsLCwtLi4uLzEwLy8vLzAwMTExMDAvLi0uLi0tLi8vLjAvLy8wMDAvLy8vLi8wLi4vMTA0Njg9Pj9CQUE+Ozs7PkJCPj9FTlNaYmVudX1/f359fXx9fnx7eXh5eXZ0cW9ua2pnaWxydnh8gouPkpaamZqcnZycm5ubm5ubm5qZmZqamJeUlJSUlJSQjImJiIqNj4+Pj42OjoyKiIeEgoGAgICAfoKEiIqLjJCRkZCQjouHhYSBgoGBgYOEhIGBgHpyaV5USkM/QEA/QkE9PDw7PDw8PDs9PDw8Ozs7PDs8PD09QENEREVFRkY2Njc3Njg2Njc3NTU1NDMzMjIyMjIxMC8uLi8vLy8vLy8wLy8vLy4uLi4vLy8vLy8vLzAwMDAxMTExMTExMTExMTExMTExMTEvLy4vLy8vLi4uLS0sLC0tLS0tLS0tLS0tLS0uMDAvLy8vLy8uLi4uLi4uLi4uLS0tLS0tLi4uLi8vLy8vLy8vLy8vMDAwMDAwMDAwLy8vLy8uLi4uLSwsLCwrKysrKysqKikoKSkoKCcnJiYmJSUlJCMjIiIhIiIhISEhICAfHx8gICAeHh8fISQmKy4yNz9CSElJSkxOT1BRUU1IOiwnJiYmJygpKCgoKCoqKSkqKSkqLC1dbGVnZGJmViw8RlJRSj0zMzc7NTU6UmZxbm1lXmFiY19dYWZbUk9LS0pISklIQjgwLzEyNUBHRDoxLS0tLS0xNjw7Ozc1NTU0NDU2OD09Pj9APTk3MzIxMDExMjQ0NTU0NDQ0NDEwLi4uLS0uLi4tLS0tLS0tLi4vLy4uLS0uLi0tLS0sMDlCTVVQTEY/NS0sLCwsLCwsLCwsKyssLS4uLi8vLzAwMDAwMDExMTEwLy8vLi4uLi4uLy8vLzAwMDAwMDAwMDAuLi4uLi4uLi4vMC8wMDExMTEzNjc6Ozs9PUFHS1BXX2hyeX6BgH18fX59fHt7e3p2dnRzcW9ub3R6goiNkJWXl5mZm5ubm5ubmpubmpqamJqXmJeXmJiWkIuPkpKSkYmFg4GFjZKUlJSVlJOSkI6MiIaDgYCAf31/gYaIioyOj4+Pjo6LioaEg4OCg4KBgYGCgX57dG1pYVxQQkBAP0JAPjw8PD09Ozs7Ozs7PDs8Ojw9Pz8/QEJFRkZHR0hHNzc3NzY4NjY3NzY1NTQzMzIyMjIyMTAvLy8vLy8vLy8tLy8vLy8uLi4uLy8vLy8vLy8wMDAwMTExMTExMTExMTExMTExMTEwLy8vLi8uLi4uLi0tLCwtLS0tLS0tLS0tLS0tLjAwLy8vLy8vLi4uLi4uLi4uLi0tLS0tLS4uLi4vLy8vLy8vLy8vLzAwMDAwMDAwMC8vLy8vLi4uLi0sLCwsKysrKysrKiooJykpKCgnJyYmJSUlJCQjIyIiISIiISEhISAgHx8fHyAgHx8hIiMmKCwwMzlBRklJSUpMTk9QUE5JRDQoJyYmJicoKCgoJykpKSooKCgoKS1bbmRnZWBoWy0yPkdUWVhRRjg6PDk4P15sdHJsaGplXmBhYWZmXFNST0xOT05MTEg/My8yMzc9Q0Y/NC8tLS0sLS80Nzc3NjU1NTQ2Nzk8PT5AQT88OTYyMTAxMTIzNDU1NTU3NzUyMi8vLy4tLi4uLS0tLS0tLS4uLi4uLi0tLi4tLS0tLS43QUpST0pGPzUtKioqKioqKysrKysrLC0uLi4vLy8wMDAwMDAxMTExMDAwMC8vLy8uLi8vLy8wMDAwMDAwMDAwLi4tLS4uLi4uLi4uLi4vLy8vLzEzMzY2Nzc4Ozw/RU5ZY253fYGAfn+Af359fHp5e3t6eXd1dnd/hoqPk5aYl5eZmZqbm5ubmZiYmJaUko6LiYmIiImKi4SAhouOjYl/cnJ6gpKZnZubm5ualpOQj4uIhIKAgH+Afn+ChYeIiYqKiouLiYiIhYODgoOCgYGBgoKBf3x4c29oYFFCPTw+PDs7PDw8PDs7Ozs7Ozs9Pj8/QEJCQkNFR0dHSEhIRzg4Nzc3NzY2NjY1NTQ0MzIyMjIyMjExMDAwLy8vMDAwLy8vLy8vLi4vLy8vLi4uLi8vLy8wMDAxMTExMTExMTEwLy4vMTEwMC8vLy4tLS4sLS0sLCwsLS0tLSwsLCwsLC4uLi4vLy8vLy8vLy4uLi4uLi4uLS0uLi4tLS4uLi4uLi4uLi8vLy4vLzAwMDAwMDAwMDAwMC8vLy4uLi4tLS0sLCsrLCwrKiopJycnJygoJyYmJSUlJCQjIiIhIiEhISAgIiIgIB8fHx8gICAgICMlKCksMTU8Q0lKSUhJSktOTUxMRT8uJyYlJicoKCgnJykoKSgoKCgpKihRbWNlZGFjXS4vNz1GUFdYWU03Mjk6PzxcdHJycGNZYV5bYGZoZV1XU1FRUlFQTkxKQzkzMy8xOD1DQTgxLSoqKyosLjEzNTQ0NTY3ODg3OTw+QEE+PTo3NTIwLzEyMTM0NTU2ODk2NDMxMDAuLS4uLiwsLCwsKyssLC0tLS0tLCwsLS0tLSwsNUBGUU5JRUA3LigoKSkpKSoqKiosLC0tLi4tLS4uLy8vLzAwMDAxMTEwMDAvLy8vLy8vLy8vMDAwMDAwMDAwMDAvLi4uLS4uLS0uLi4vLy8vLzAwMDEyMjIzNDQ1NTY7SVdjbXh/hIGAf399gH56eXh6e3t7e3yAh4uOkpOVlZWWl5mZmpqZmpiUkY2KhoF8dW9saGZma21wcXN7goSCdGhueouYn56gnqCgnZqZlJGMiYWAfHp7e31/gIGFhoiJiIiJiYmJhoaDgoODgoKAgICAgYGAf313c2hdTUA/PDs6Ojs7PDw7Ozo7Ozs+QEBBQUJDREZGRkhHR0dGRkY2Njc3OTk2NjY2NTU0NDMyMjIyMjIxMTAwLy8vLzAxMC8vLy8vLy4uLy8vLy8vLi4uLi8vMDAwMDExMTExMTExMC8uLzAwLy8uLS4uLS0tLC0tLCwsLS0tLS0sLCwsLCwuLi4uLy8vLy4uLy8vLi4uLi4tLS0tLS0uLS0uLi4uLi4uLi4uLi4uLy8wMDAwMDAwMDAwMDAvLy8uLi4uLS0tLCwrKysrKyopJycnJycmJiYmJiUlJCQkIyIiISIhISEgICEhICAfHyAfHx8gISMlKCsrLjM3PkVKSkhFREZHSUtKR0M7KyYmJicnKCkpJycpKCcoKCgpKyVPaWJkZWBlYTAsMzg9R05VWVhQNC85QUVIbHR0dG9gWGBbWl9jaGdgWVZUVFFQUFFQTEdBOjUzMTI3PUA6MiwqKiopKiotMDEyMzU3ODg4Nzc5PD4/Pz49Ojc1MjExMjEzMzQ2Nzg3NjU0MjAwMC8uLi0sLCwsLCsrKyssLCwsLSwsLCsrLCwtLTE8RU5NSEVAOTQqKCkpKSkqKikpKysrLCsrLS0uLi8vLy8wMDAwMTExMTExMC8vLy8vLy8vLzAwMDAwMDAwMDAwLy4uLi4tLS4uLy8vMDAwLy8wMDAxMTIyMzQ0MzMzMzpHVmJsdn2BgX1/gX9+fnt2c3Z6fn9/goeKjY+PkJSUk5WWlpeXlZKQi4V/d3BpY1tVUE1ISE1RYF1fZG5zcWxnc4WWn6OioaGhoZ+dm5GMh4R9eXRyc3N4e36AgoOGh4WFhoaGhoODg4KAgIGAgH5+fn5/goOCf3lxal1MQD09PTw7Ozo8PDw7PD4+QUNDRERFRkdHR0dHRkZFRUVFNzc3NzY2NjY1NTU1NDQzMjIyMjIxMDAwMDAwMC8vMC8vLy8vLy8tLy8vLy8vLy4uLi4uLzAwMDAxMTExMTEwMDAvLy8uLi4uLi4uLS0tLS0tLSwsLCwsLCssLCwsLCwsLS0uLi8vLy8wMC8vLy8uLi4uLC4uLi4uLS0tLS4uLi4uLi4uLi4sLS4uLy8vLy8vMDAwMC8vLy8vLi4uLi0tLSwsKysrKyooKCgnJycnJSUmJiUlJCQkIyMiIiEhISEhICAgICAgHx8fHx8fICAlJyorLDA0OUBGSUlIRUJCRkdHRkU/NSkmJiYnJygoKCgnJygoKSoqKipUbWBiZWFgYzEqNTY2PURJUFdYVD49PT48S2xwc3RVVmBjYWJlZWVnY11ZWFdTUFBRUU1MRj44MS8xMzg8PDMsKyopKSkqLC8xMzU4OTo5Ojc3Nzg6PkBBQUA9OjY0MjAxMjMzNDU2NzUzNTQyMjExMC4uLS0tLCwrKysrKyssLCsrLCwrKyoqKSkuOD5GS0dEQTo1LicnKCcnJigoKCkpKSkoKSsrLS0uLy4uLzAwMTAwMDEyMjExMTEvLy8vLy8vLy8vMDAvLzExLy8uLi0tLi4uLi4uLi8vLzEvMDAvMTExMjM0NDQ0MjI0OUNTYGtzeX9/gYOAf318d3FvdHh9f4ODhYaIiYmOjo6NjY2Oj4yGfndvaGBYU05MRkNERERFTV1YUk9UWl9nboGUnqCfn56fnpuWkYyGgHx0b2lkZGVpbXN3fH6AgYSEhISEg4KCgoGAf399fn9+fn1+fn+AhIB+enJnWkY+PDs7PDw+PD4+P0FCQ0VGR0dGRkZGRkZGRkVFRUNDRDY2Nzc3NzY2NTU1NTQ0MzIyMjAwMDAwMDAwMDAvLy8uLy8vLy8vLS8vLzAwMDAuLi4uLi4vLy8wMDEvLy8vMDAvLy8vLi4uLi4tLS0sLCwrKysrKysrKysrLCwsLCwsLC0tLi4vLy8vMDAvLy8vLi4uLi4tLi4uLi0tLS0uLi4uLi4uLiwsLS4uLi8vLy8vLzAwMDAvLy8vLy4uLi4tLS0sLCsrKiopKCgoJycnJyYlJiUlJSQkIyMjIiIhISEhISAgICAgIB8fHx4fHyAiJCcsLS8zOTxARklJR0I/P0JFRkVBPS8oJiYmJiYnJycnJycoKSkqKy5fa2FhYl9kZDUmMjk7Pj5CSk9QUEk+OzxBQ1RtcXJuZVtZY2Fla21raGVeXVtZVlJQU1JPTUpFPTMwLzI0OTkzLCsqKSkpKSsuMDE0ODk6Ozw5Nzc3OT1AQkJBPTo6NjUyMDAxMzM0NTY1NTU1NTQzMjExMC8vLy8vLS0sKysrLCwsLCwsKysqKikpLDI6QEhIQ0A8Ni8oJycnJycnJygpKSkpKCkqKisrLC0tLi4uLzEwMDAwMTExMTExMC8vLy8vLy8vLzAwLy8wMC8vLi4tLS0tLS0tLS0uMTEyMzExMTExMTIzNTU1NTIyMjQ3Q1FeaXB6gYCAgH99fHp2cG9xdXl9f4B/gIGBgoKBgH19fX57cmlcVExJSUtMT05MSkhISUtRUU9LSUtUX2+GkpKTk5KSj4yIgXtzbWVgXFlWVlhbYmVpcHN2e36AgYGBgX9/f4CAf35+fHt7fH19fHx+foCDgXx3b2RXRj09PUBBQT9AQEFDRkdGRkdHR0dGRkZGRkZFRUVGQ0M2NjY2NjY1NTQ0NTU0NDMyMjEwMDAwLy8vLzAwMDAxMC8vLy8vLy4tLS0uLi4uLi4uLi4uLi4vLy8vLy8vLy8vLi4tLS0tLS0tLSwsLCsrKysrKysqKiwsKyssLCwsLCwtLS4uLi4vLy8vLy8vLy4uLi4tLC0uLi4tLS0tLi4uLi4uLi4tLS0vLi4uLy8vLy8vLy8vLy8uLi8uLi4tLCwsLCwrKykpKSgnJycnJycmJiUlJSQkIyMjIyIiISEgISEfHyAgHx8fHx8eHyAiJCUpLC4yNztAQ0hIR0ZBPj5CQ0VDQjosJyUlJiYnJygoKCknKSgqKTNlbF5gX11gaj8iLzQ6PEBCQENISko/ODtBQDxacXFzb21pXWVnaGxwcGlkYV5eXFdTUFFQT05LR0M6MzAwNTQ3My4rKikpKCgqLC0wNDU3ODk6ODY3Nzc6PUFCQj48Ozo3NTIxMTEyMjQ1Njc3OTc1NTM0NDIyMTMzMzAvLiwsLC0tLS0rKyoqKykpKSotNjxESkE/OjUxKicmJycnJSUnJyYlJicnKCoqKiorKysuLy4uMDAxMTExMjIxMTEwLy8uLi4uLy8vLzAwLi4wMC0tLS0tLS0tLS0tMDQ0NTUzMjIwMTI0NTY3NjYzMzMzNDc/Tlplb3Z8gIGAfnt6eHVua2xvdXh7fHx6enl4dHNxbm1sZ15WTkpKSUlLTUxOTkpHR0hKTEtIRkdLTlpte318e315enZxamJbVU1HREJFR09VWV5fZGVpbHF0eXh5fX9/f359fHt7e3p6e3t8fXx8e3x9f4B/fHRrYlVJQEFBQkNDREVFRkZGR0dHR0ZHSEhHR0ZGRkZGRkdHNjY2NjY2NTU0NDU1NTQyMjIxMDAwMC8vLy8wMDAwMTAvLy8vLy8uLS0tLi4uLi4uLi4uLi4uLy8vLy8vLy8vLi4uLS0tLS0tLCwsLCsrKyoqKioqKyssLCsrLCwsLCwsLS0uLi8vLy8vLy8vLy8uLi4tLS0tLS0tLS0tLS4uLi4uLi4uLS0tLi4uLi8vLy8vLy8vLy8vLy8vLi4uLSwsLCwsKyspKSkoJycnJycnJiYlJSQkJCMjIiMiIiEhICAgICAgIB8fHx8fHyAhIyUoKy8zODxCRUdJSEZDQT4+QUJEQj83KSclJSYmJycoKCgoKiorJzpraV5fX11ib0cgLTIzODpER0tGRUhHPT5RZFtET2psbWdqaWVna21wcW5pZWZgXFpXVFFPTUxMS0dGPjcxMTQzNjMuLSspKSgoKSorLTEzMzc5Ojc2NjY3Nzo9Pj4+PDw7OTc1MjExMTIzNDM1NTc5Ojc2NzUzMzMzMzMwLy4uLi4tLSwsKysqKioqKikoKzE5QEZDPjo1My4oJycnJyUlJSUlJiUlJSYnKSkpKikqLCwtLi4wMTExMTIyMjIyMTAvLi4uLi8vLy8uLi8vLi4tLS0tLS0tLS0tLjE1Njg4NDMyMDIzNTY3Nzg4MzMzMzI0Nj9KWWNtdXh+gYB9e3l2cm1qa29ydnt8fHp4d3VzcW5paWRhXFhSUE5LS0tLSklGQ0NERkVDQ0JAQURPWltZWVlZWVZRTkZBPTk4Nzc5P0VKUlZcX19fYWNlaW1wcXZ6fX9/fnx7enp6ent7e3x8fHt7fH5/gH95c2thV0tDREVFRURERUVFRUVFRkZFRkZGRkZGRkVFR0ZHRTY2NTQ1NTY2NDQzMzMzMjIxMDIyMTEwMDAvLy8vLy8vMDAwLi4uLi4uLi0uLy8uLi0tLS0vLi4uLi4uLi4uLS0tLSwsLS0tLS0tLCwrKioqKioqKikpKissLCwsLS0tLSssLS0uLi8vMDAuLi4uLi4uLi4uLS0sLS0tLS0tLS0tLS0uLi4uLi4uLi4uLi4uLi8vLy4uLi8vLy4tLS0tLS0rKysrKSkpKCcnJiYmJiYmJCQlJSQjJCQjIiEhICAfHyAgHx8eHh4eHx8gIyQoKy0xODxER0pMTEpHQj9BQkNFRkI9MiYoJyYmJicnJycoJykpKUdvZ2BbXmFialUhLjo8PT07RUdYT0xKSEI9RU9XV1hkamhnaWlhYmlxcm9qY2hoZF9dWlZUUUxJS0lGREE6NjE0Njc1LywsKyspKSkpKiwtMDE1OTg4ODU1NTY5Ojs8Pj09PTs5NzU0MzAwMjIyMjU2ODk5Nzk5NTQ0MjEwMTEwMC8vLy4rKy0qKioqKikpKCktNTtAQz47NzMvLCklJCYmJSUlJCUlJSUlJicnJycoKSoqLC0tLS4vMDEyMzIyMjIwMDAwLjAvLy8uLS0uLi0tLCwsLCwsKiotLS8xNDY4NTM0NDIyMzQ1ODk2NjY2NTIxMTM0PUlWYGlydn2AgX56eXZybGpma290eHx7fXt6end1c3FtaWVfW1hUUU1MSkdFQkA/PUA+Pjw8Ozs9PT8/Pz8/Pjw8OTo6Ojg5Ojo5OjxCSE1TWFteYF5dX15iZWhscHV4fX58eXl5eHh6ent5e3t8e3x8fn9/fHl0bGRaTUZGREZGRUVDQ0NDQ0VFRUVERUVGR0ZISEdGSEY0NDMzMzMyMjMzMzIzMzExMjExMTAwLy8vLi4uLi4uLi8vLi4uLi4uLS4tLS4uLS0sLCwsLC0tLS8tLS0tLSwsLCwsLC0tLS0rKywsKyopKSkpKioqKSorLCwsLCwsLCwrLC0tLi4vLy8vLi4uLi4uLi4uLi0tLC0tLS0tLS0tLS0tLS0tLS0tLi4uLi4uLy8uLi4uLy8uLi4uLS0tLS0tKyorKykpKSgnJyYmJiYmJiUlJSUkIyQkIiIhISAgHx8gIB8fHh4eHh8gICIlKiwuMjlBRktQT0xKR0RCQUJFRklGPCwoJyYmJiYoKCcpJSgnKVZsY19cYmhnbFMeMkpMTE5TVUpHSk5LSUE8REBCR1FeYWVnaGppX2dqbnBsYmVqZ2JhY15XVFBMSEdGRURCPTgzNDY3NS8rKysrKioqKikpKyswMjY5OTk1NTM0NDU3Oj0+Pj49Ozk3NTMyMTExMzMzMzM1ODg4ODc2NDIxLzAwMDAwMDAvLi0sLCoqKSkpKSgpKS02O0A+OjY0MS4qJiQmJiQkJSQlJSUlJSYnJycnJycpKSsrLCwuLi8wMjIyMjIyMTExMS8vLy8uLi0tLS0tLSwsLS0sKywsLC0vMTEzNDQxMjM0MzQ0NTY4NjY2NjY0MTEzNDQ8RlJbZW92e32AfXl3dHJrZGdqbHF1eXt7fHx7eXh3dHJva2djYFxXVlRRTkpGQTw6ODg4ODc2Nzc6Ojo6OTs7Ozw9Pj48OTs7OTk7P0VKT1NbXmBfYF9cWllbYGVqcXZ6e3t5eXh4enp8e3l7e3x8fHx9fn99eXRtY1tORUZGRURDRENCQkJDQ0NDREVGR0dJSUhIRkdGNTQyMjQzMjIzMjIyMTExMTAwMDAvLy8vLy8vLy4uLi4uLi8vLi4tLS0tKyssLS0sKy0sLCwsLCwtKyoqKisrKywsKyssLCwsKysrKysrKiopKSkpKSkpKisrKysrKysrLCwsLC4uLS0tLS4uLi4uLi4uLi4tLS0tLS0tLS0tLS0tLS0sLS0tLS0tLi4uLi8vLS0uLi4wLS0tLS0tLS0sLCsqKioqKignJycmJiYmJiYmJiUkIyMjIyIiIiIgIB8fHx8eHx4eHx8fISIlKCktLzQ7QUhNUFBMSUZFQkBCQkRKRzgqKickJCYoJycnJickN2ZtY11fY2hobFomK0NLSk5NT1RTS0lOR0A5TmFWWldSXWRpbGtrcW5sbnBvYl9lZ2dlYmJfV1NQTEhDQkFDQj86MzAyNTQuLCwrKysrLCwrKiorLS8zNTc4NjUyMTEzNjg4Ozw9Pj4+Pjs5NTUzMTIzMzEwMjQ0MjU3NzU0MjIwMDExMjM0MzEvLS0qKiopKSkpKCgoMTg7PTo2NjQwLispJSUlJSUlJSUmJiYmJiYmJicnKCgpKioqLCwtLjAxMDAwMDExMTExLzAwLy8vLy4tLCwsKyoqKyorKystLjAxMTExMTIzMzMyMjM0NTU1NjY3NjY2NDQ1NTlBTllia3F4fn99eHVybmllZmdqbXF2eXt7e3p6enh4dnRwbGlnZmNhXVhTTUlGREE+Ojo2Nzc3Njc3ODk5PDw9PTw8PTw6OTg4OTxARkpQVVpdYGBgXVtVU1RaXWRocHZ7e3p6eHl5eXt7e3x9fH17e3x9fXx4dGtiW09FREVEQ0NCQUFBQ0NDREVGRkhISkpJSEZGRDMzMjIyMjIyMjIxMTEwMDEwMDAwLy8uLi4uLi4tLS0tLi4uLi0tLCwsLCsrKiwsKywrKysrKysrKysrKyssLCwrKyoqKysrKyoqKioqKioqKSkpKSkpKSorKywsKysrKywsLCwuLi0tLC0uLi4uLi4uLi4uLS0tLS0tLS0tLS0tLS0tLS4uLS0tLS4uLi4uLi0tLi4uLi0tLS0tLS0tLCwsKyoqKiooJycnJiYmJiYmJiYlJCQkJCMiIiAgICAgHx8fHh8eHh8fICIjJikpLC4yOD5ER0pLS0lGRUJDQkNCRkIwKCsnJicmJycnKColQHBtYmJgZmZob0wjKjBFUUpHRkBCTFFGS0o/PEZUW2RXVmNpbm9ubG9wa2xwZVdfampoaWNhX1hSUk1JREE+Pj08OTMvMDExLCsrKysrKywsKywrLCwvLjM1NjU1MzEvMDU3Nzg5Ozw+QEA/PTo3NjMzNDMwMDAxMTExNDQ0NTMzMjIyMjIzNDMyMC0tLCoqKSkpKCYmJyozODo8ODY1NDMwLCooJiUlJSUlJSUlJSYmJiYmJicnKCkqKiwsLS8vMDAwMDAxMTExMTAwMC8vLy8uLSwsKysrKyoqKysrLC0uLi4uLi8wMTIyMTIzMzM1NTY2NjU1NTMzNDQzNz9LVF1lbXR5fnx2cnBubGdiZWdqb3V4e3t6enp6eXl3dHJubGtraWhkYFtYVVBNSEZBOzg3NzY2Njc3Nzo6Ozs7Ozo6ODg3Nzc5PEJHTFFXW11fX11bV1FNTVRZYGdwdHd6end3eHl5enp5e3x8fHt6eXt9fXhyaWJZTkVEQ0NDQUJBQUNDREVGRkpLSkpKSUdGRUQxMTMyMjIyMjExMTExLy4vLy4uLi4uLi4uLS0tLS0tLSwuLCwrKyosKysrLCsrKyoqKioqKysqKisrKysqKiwsKikqKioqKysqKioqKCoqKioqKisqKSoqKiorKywsLCwsLCsrLS0tLS0tLi4uLi4uLS0uLi0tLS0tLS0tLS0tLS0tLCwtLS0tLS0uLi4uLi4uLS4uLSwtLS0tLS0tLSwsKysrKykpKCgnJyYmJiYmJiYmJSQkJCMjIyIiIiAgHx8fHx4fHx8fHyAjJCcqLC0uMjY7QEJGSUpJR0dEQUFBQD84LSosKCclJycmKCcnPHBrZGRlZ2psaD0eKy8zP1pMQ0ZHPFBSTktJR0ZMUV9mYFhfZ21vb25wcW9wb2ZfZWpoZ2lmZmFdWFJOR0I9Ozo7Ojc0MTEwLSwrKyoqKSosKy0tLCosLi8wMTM0NTQyMDAzNzU4OTo6PD5BQD88Ojg2OTc1MzEvLy4vLzEyMjQ0NDQzMzM1NTQzMS8uLSwsKikoKiknJScnLTI0OTk4NTY3MjAtKyclJSUlJCQkJCQlJSUlJiQlJScoKiosLC4uLi4uLi4uLS0tLzAwMDAuLjAuLi0sLCsrKysrKyoqKyssLCwsLS0tLTAxMTExMjMzNDQ0NDMzMzMyMjMyMTI2OkJOV2JqcXh7enVybW1rZmJiZWtxdHZ6eHl6eXh4dnR0b2xtbW1samlnZ2JeWlZRTEU/OTg2NjU2Nzc3Nzg5Ojo5OTg4NjY1Njk+QkZNU1hcXl5eXVlVTklISlNbY2txd3p7eHV2dnd4d3d5ent9fXp7e3t6dnBpYFhQRkRDQkBAQUJDRERER0hISkxLSkhHRUNBMTExMDExMTEwMC8uLy8tLi4tLS0tLS0tLCsrKywsLCwtLCsrKysqKykqKysqKiopKSkqKioqKiorKyoqKSkrKykpKiopKSkpKSkpKSgpKCgnJygqKikqKioqKyssLCwsKysrKywsLS0tLS0tLS0tLS0tLi4tLS0tLS0tLS0tLS0tLSwsLS0sLCwsLS0sLCwsLiwtLi0sLS0tLS0tLCwsLCsrKyspKSgoJycnJyYmJiYmJiYlJSUkJCMiIiIgIB8fHx8eHh8fHx8hJCUpKiwtLjE2Oz9DRUdKSklIRUJCQUA5LiorKygnKCkoKCgqPmttZmNma21vZzUmLjEwPVhYS05LSkxNUlNOREZGUFFoaWVhZmx0b2xrbm5rbmxgYmRmZmVmZ2hmX1pWUkpCPTs6ODY2Ojs4My8tLCooKCkqKiwtLi8uLi4uLi8xMjQ2NDIyMjM1Njg5OTk8Pz8+PT48Ojs5NzUzMjIxLzAxMzIzMzQ0MzMzNDQzMjEvLi0sLCsqKSkpKCcmJiksMTU6Ojk5NzY2MS8sJyQlJCQkJCMjJCQkJCQkJiYnKCoqLCwtLS4uLi4uLi0tLS8uLi4uLi8vLy4tLS0sLCsrKysqKisrLCwsLC0tLi4vLy8vMDExMjIyMjIxMTExMjIxMC8wMjM1PkpWXmdvdHl5dnJwbWxoY2FlamxwdHd4eXl4dnNxb21qaWlqamtqbW1raWVgWlNLRDw4NzY2NjY2Nzc3Nzc3NjY2NjU1NTc2OD5ESU5UWlxcXl5dVVFKRkJHT1hhaW90eHh4dnR0dXZ2dXV5e3t6eHl5enh2cWliWVBFQ0FCQkNEREVHSElKSUtLSkpIRkNBQjAwMDAwMC8vMC8vLy8vMC4tLS0tKywsLCwqLCwsLCwsLCsqKikpKikoKSkpKSkpKikpKikqKioqKysqKikpKSkoKCcoKCgoJygoKSkpKCgoKCgoKCkpKioqKioqKiorKysrKyssLCwsLCwsLCwsLS0tLS0tLi4tLSwsLS0tLS0tLCwrKysrKiorKysrKysrKysrKy0tLS0tLCwrKiwsKywsLCoqKiooKCcnJycnJScnJiYmJiUlJCMkIyIiICAfHx8fHh4eHh4gIiUoKSwrLjE0Nz5CRUZISUtKSUhEREM/MCopKigmKComKSgqKWRwZ2VlampvVyooMC80RFZcTEtISUxLQklSS0U/SVlfWVhbYGpwc2tqamVsbmxnX2FlZ2NfYWZoZV9dWVVOR0I9Ojg3OT1EPzUxLSspKCgoKCssLS0vLy4uLS0uLy8zMzQ1NTIxMTM2Nzc5Ozw8PD8/Pz8+Pjw5ODY2NTMzMzM0NDQ0NTQyMzAwMDAwLi0uLi0sKyopKSkoJyYnKCwyNzo6Ozs5ODQxLiokIyMjIyMiIiIiIyMkJSQmKCkqLCwsLC0uLi4uLS0sLCwtLS0uLi8uLy8uLi4uLS0sLCwsKyssLCwsLCwsLC0tLS0uLi8vMDEwMDAwMDAvLzExLy4vLy8vMTU7Rk9cY2tyeXt3dHBtaWhlYWFnam9ydXd3dHFxbmtpaGZkZGRoamlqbGpnZF9ZUUg+OTg3NjY1NTY2Nzc1NTQ0NDQ1NTU1NTY5P0VMUVdZW15fXVpTTUlDQElQWGBnbnR5eXd1cnJzdHJycnV5e3l5eXp8eHZwamRcU0pBQUNERkVISkpKSklJS0pJRkZDQT8vLy8vLi4uLi8vLi4vLi8tLS0sLCssLCwsKiwsKyspKSgqKSkoKCkoJygoKCcoKSkqKiopKSkpKSoqKSkpKSkpKCgnKCgoKCYnJygoJyYnJycnJygpKSoqKioqKioqKiorKysrLCwsLCwsLCwsLC0tLS0tLS0tLCwsLC0tLS0tLSwsKysrKyoqKysrKysrKysrKysrKywsKywsKyosLCsrKysqKioqKCgnJycnJiYnJyYmJiYmJiQjJCMiIiAgHx8eHh4eHR4eICImKSosLjE0OD5DRUZJSktLSkpJRkZGOSsrKiopJyYmJygoI1RvamlqbnBvTyw0My4tNENKTk9RTVNTU09MS0RCR0dbXlVLXGJpcW9tbWpnbW9taWZkYmFgYF9jZmJeWllWUEtEPzw8PTw8Qj01My8pKCgoKCgpKywvLy4vLi0tLS0tLzI0NjYzMjExMzU2ODk7Oz0/P0BAQEA/Pz08Ozo5OTg4ODg3NTU0MTAuLi4uLC4tLi4tLCsqKSkpKCcnJicoLTE0Nzo7OTc2MzAsKCQjIyMjIiIiIiMjIyQlJyYnKCosLCwtLi4uLi0tLCwsLS0tLS0vLy8vLi4uLi0tLCwsLC0tLCwsLCwsLCwtLS0tLi4vLy8wMDAwMC8vLi4wMC4uLi4uLi8xMjhETlhgaHB1enl3b2xqZ2ViYGFnbnFzc3Vxb21pZWRiYFtcXmBjZmhpaGRfWVBHPjk4ODY2NTU2Njc3NTU0NDQ0NTU0NDU2OD5DSk5UWlxdX11bV1BKRURESlFaYmhwc3d4dnRycHFxcXJydXp7enl5ent6d3NvZ19YTUZFQ0dISUpKSkpJSUlJSUZEQT08Li4uLi0tLi4uLS0sLS4tLSwsKSkqKioqKygoKCgoKCgnJycnJycnJycnJygoKCcnJycoKCgoKSkqKigoKCgpKSgoKCgnJiYmJiYmJiYmJiYnJyYnKSkqKioqKyspKSkpKSkrKysrKysrLCwqKyssLSwsLCwrKisrKiwsKywsLCwqKioqKysrKyoqKysrKysrKioqKioqKyorLCsrKysrKyoqKioqKikpKSkoJyYnKCgnJyUlJiYlJSQkISEgICAgHx4dHR0eHiAkKCssLzEzNztBR0xNTkxKS0pMS0pKQy4mKSclJycnKCgnJk1xaGNpb3BpPyIzMDAvMTQ9R1JaXlhWWFlVTUlCNjxIYmNaWWhxbXJycW1ubWlpamtnZGFfYmBfXl1cVVNVU1FNSUNAQEM/ODo5NTYxKCYnJygoKCkpKi4vMDAuLCsrKywsLTAzMTAxLzAyNTc4ODo7PT8/P0BAQUFCPkBAQD8+Pj07Ozg1NDIvLSwtLS0sLS4sLCsqKikpKSgnJiYmJSYrLzI0Njg4NDQxLiwnIiMjIyMjIyMkJCQkJSYnKCsrLCwtLS4uLCwrKywsLS0uLi4uLi4vLy8vLi4sLCwsLS0tLS0tLi4tLS0tLS0tLS4uLy8wMDAwMTEvLy4uLy8uLi0tLi4uLjAxNz9JU1xlbXN3d3ZwamhoZF9eXmZsbnBwcG5sZ2JhXltXVFNTWFtgZWFfWldNRT05ODY2NjU1NjY3NzU1NjY1NTY2NjY2Njk8QUdNU1daXF9dXFlTTkhGRUhNVF1la3B1d3h4dnNwbW5vcHFzeHt6eXl5e3p3dHFqY1tVTUlISUhJSklHSUdIR0ZDQD07OS4uLi4tLS0tLSwsLS0sLCwsKyoqKSkoKCgnJycoKCgoJycnJycnJycoKCcoJycnJycnKCgoKCkpKiopKSgoKCgpKCgoJiYmJiYmJiYmJiYmJycmJygoKSkpKSoqKCgpKSkpKysrKysrKywrKiorLC0sLCssKiorLCwrKiosLCwsKioqKisrKysqKiorKysqKioqKioqKisqKiwrKysrKysqKioqKiopKSkpKCcnJygoJyclJSYmJSUkJCIiICAgIB8eHR0dHh8iJSksLzE0Nzs9QkhOUlFPTUxLS01MSDcqJiYoJyYnJiYoJE50aWVqamxlMiMxMjAuMzA2RUlPV1lWVlZXVk1EOzA4Rl5SVVtha2pydXFtcHJuamlnZ2RiYF1eXllVVE5NUFJOTE1GPz9BPDc2MzU1MSsnJycoKCgoKSotLi8vLi0sLCsrKissLS4wMC8wMDM1Nzc4Ojo7PD5AQEBAQUFCQkJBQUE/PTs4NzUzMS8vLi0tLCwsKysrKiopKSknJyYmJiUkJigrLjAyNTQ0Mi8tKSUjIyMjIyMjJCQlJSUmJygrKywsLCwtLSwsKyssLC0tLi4uLi4uLy8vLy4tLCwsLC0tLS0tLS4uLi4uLi0tLS0uLy8vMDAwMDExMS8wMDAwLy4tLS4uLy8wMTIyO0VQW2FpbnZ5dXBtamllX1pdYmhrbnFycGxmYl5ZVVFOTE9PU1hZV1VQSkI5Nzg2NjY2Njc3ODg3Nzc3ODg5OTk5Ojo6O0FGS1FWWVtcXV5aVVFLR0ZITVJYYWhscHV3eXl3cm1tb29ub3J2e3p6ent8fHl4dG9sY1xSS0lJSUlISEdFRURDPz07NzYuLi4uLCstLCwsLS0sLCwsKyoqKiooJycoJiYmJiYnJycnJiYnJycnJycmJiUlJycnJygoKCgpKSgoKSkoKCgnJycnJyUlJSUlJSUlJSUlJSYmJiYmJicnKCcnJycoKSkpKSopKisrKyorKysrKyssKysrKyoqKiopKSsrKyorKyoqKioqKioqKiopKSkpKioqKioqKioqKioqKiorKysrKioqKioqKSkpKSkoKCgoKCgoJyUlJSUlJCQiIiEhICAfHh4eHh8gJCYpLTAzNzs+QENITVBRT05OTExNSz8tKSgoJyooJyYlJlR2amVmamRnQyMuMjEwLi0vOUhPUlhZWV5kWlRNRz4xPEhaWlRXXmhqbXFxc3d2cWlhYWZkX1pZXl9WUE5JSEpOTU1NSURCQDw4NTQ3NzQtKCUmJygpKSkpLC8uLi0uLi4rKSgoJykpKi0tLjAxNDU2Njg5OTs8PT4/P0E9Pj9AQEJCQT06Ojg2NjQyMTAvLy0sKyoqKyopKSgoJyYlJSQjJCQkJSksLjEyMzQvLismIyIkIyMkIyUlJiYmJycoKioqKisrKyssLCwsLS0tLS4tLi4uLi4uLy8uLSwsLCstLS0tLS0tLS0uLS0tLS0tLS4vLy8wMDAxMTAwMTEwMC8uMDAvLzAwMjMwMTQ5QUpWXWZrcnh3cXBqZWNdWlpeY2dsbW9ubGdiW1ZTUElHR0hKTU1LRkM9ODg6OTg4Nzc4ODg4ODg4ODo8PDw7Ozs7PDs/Q0hNUlhaWlxeW1dSSklHSUxRVVphZ21xdHh5eHZybW9ucHFyc3Z7e3t7fH2AgHt4c29oYVZOSUhHR0REQ0RBPzs6NzUyLCwsLC0tLCorKysrKioqKioqKCgqKSkpJiUlJSYmJiYmJiUlJiYmJicnJiYlJScnJycmJigoKSkoKCgoKCcoKCcnJiYlJSUlJSUlJSUlJSUmJiYmJiYnJycmJiYnKCkpKSkqKSkpKysqKioqKioqKyoqKisrKioqKSkqKioqKSkpKSkpKSkpKSkpKCgpKSkqKSkpKSkpKSkqKikpKioqKioqKioqKikpKSkpKCgoKCgoKCgoKCgmJSQkIiIhISAgHx4eHh4fICQoKi0wMzc/Q0RFSElKTE1PTU1MSkIyJycnJygqKSUlJFN0a2FmaGlpTSYuMTAuLi0rLz5NV1BVVllfX11bVEg+N0NRXl5VV2NfW2h0c3R3eXpxZmZraWBbWltcWlJLSUhKSkpLSkpGREE8ODc1NjU0LSglJicoKSkpKSstLCwtLi4uLionJyYkJSgqKy0vMjU1Njg5ODg7PDw8PT09Ozo6Oz4+Pjw5Ojo6Ojg3MzIxMDAuLCsqKiorKSkoKCYmJSUjIyQkIyMlJiosLjExLy4tKiUlJCMjJCQlJSYmJicnKCoqKiorKysrLCwsLC0tLi4uLS4uLi4uLi8vLi0sLCwrLCwsLC0tLS0tLi0tLS0tLS0uLy8vLzAwMDAwMDExMTAwLzExMTEyMjIyMjMyMzY+R1FZYWpwdXhybmhjXltWWV5gZWttbm5uaGNcVlNOSERBQENDQkA9PTo7PDs6Ojo6Ozs7Ozs7Ozs8PT09PT09PT49PUJESVBTV1haXFlXVE5KS0pKTlNXXGRna3F0eHl4dnJvbXFycnJ0eXx7e3yAgYOBfn13cWxhVUxJSEVCQ0I/PTs5NzYzMysrLCwsLCwrKioqKikpKSkoKCgmJiYmJiYlJSUlJSUlJSUlJSUlJSUlJSUlJSUmJicnJiYmJygoKCgoKCgoJycmJiUlJSMlJSUlJSUlJSUlJSUmJiYmJSYmJiYmJykpKCcnKigpKSgpKSkpKSkpKioqKisrKikpKSkpKSkoKCgoKSkpKSgoKSkpKCgoKSkpKSkpKCgoKCkpKSkpKSkpKSkpKSoqKSkpKSkpKSgoKCkpKCgnJygoJiQkJSQjIiEhIRweHh0eHyAlJyovMjc6QEVHRkdFRklLTk5NSkQ3LCooKCgpKiskI0F7bV9eZWRqXyUrMTAzOC8rKy04RExPUlNVWlteXVFKQj1IUldZUVJaUlRicnN0eH18d3Vzb2hgXFlWVVRQSEhJSEdHRUZKR0RBPjk3NjU0My4oJycnKCgoJykqKysrKy0vLy4sKiclIiQnKCsuMDQ2Nzc2Njc5PTw8PD08Ojk3Njc5ODg3Nzo7PDw7NzYzMjAvLiwqKioqKikpKCgnJiYmIyQkJCQkIyQnKi0uMTAvLiwpJiQkJCUlJSUmJicnKCgpKSoqKyssLC0tLS0uLi8vLywtLS0uLi4vLy4tLCwrKyoqKysrKywtLS0tLC0tLS0uLi4uLy8wMDAwMTExMjIyMTEzMzMzNDQ1NTQzNDQ2NzxETFRfZWx0dnNtaGNfWVVUWF5jZ2ttbW1qZV1YUk5IRT88Ojw+Pj8+Pj0+Pj8/Pzw8PT4/Pz8/QEA/Pz8/Pj4+PTw+QkhMUFRWWFlaV1VQTEtISU5SVVlfZGhucnZ5enl2cnFxcXJzc3Z5foCAgYKDhYSCfnlyaV9RR0ZDPz09Ozk2NDQzMzArKyssLCsqKioqKiopKSgoKCgoJiYmJiYmJSQkJCQlJSUlJSUlJSUlJSUlJSUlJiYnJyYmJSYoKCcnKCgoKCcnJiYlJSQlJSUlJSUlJSUlJSUlJiYmJiUlJiYmJicnJycnJykoKCgnKCgpKSkpKSkpKCgpKSkpKSkpKSkpKCgoKCgoJycnJygoKCgoKCkpKSkpKSgoKCgoKCkpKSkpKSkpKSkqKikpKSkpKSkoKCgpKSgoJycnJyclJSUkIyMjISEfHx4dHh8gJSksLzQ6PUJHSUlIRkVHSk5PTk5HPjMpKSkpKikoKC1xd2lgZGlqYjUlLjExMjItKiosNUJMTk5TV1tdXFpORjw4SFZZW1tTYGRZW2JtcHRzd3d3dW5qYVpUUVBQTEZHSElGRERFSUpIQ0I/Ozk4ODUxKygoKCkpKSopJykqKyssLi4uLC0sKCUkJCcqLjI2ODg3NjY4Ojs9PDw8Ozo5NjY0NjY2NTc3Ozk4OTc1MjEvLy4tLCwsLCwqKikpKCcnJyYkJCQkJCMkJSgqLjAxLy8wLSkoJiUlJSUlJiYnJygoKSkpKisrLCwtLS0tLi4tLS0tLS0tLi4uLi4uLSwsKysqKisrKyssLS0tLi4uLi4uLi4uLi8vMDAxMTIyMTIzMzMzMzQ0NDU1Nzc3ODc3Nzc4O0BJUVlkaHB0dG1oYVtaU1JWXWBka21tbGlkXlhVT0xIQz9AQEBBQUFAQEBBQUFAQD9AQUFBQUBAPz89PT4+PDs7PD9CR01TVVZYWVlWUk1MSkxOUlRYXGFma3Fzdnd6eXd0cnFxdHZ4eH1/gYGBg4WGhYN/d29jVkdDQDw7Ojk2NDMzMi8uKiopKSoqKiopKSgoKSkoKCcnJyYmJiYmJSQjIyQkJCQkJCUlJSUlJSUlJSUlJSUlJiYmJiYlJiYoJicoKCcmJicnJiYlJSUlJSUlJSUlJSUlJSUlJSUkJCUmJycnJycnJycoKCgoKCgoKCooKCgoKCgoKCgpKSkpKCgoKCgoKCgnJycnJycoKCgoKCgoKCgoKCgoKCgoKSkoKCgoKCgpKSoqKiopKSkpKSkqKSgpKSkoKCcnKCgnJSYmJSQjIyIiISAgHh4fIiUoLC80Oz9BRUhJR0ZFRkxOT05NTkc3JycpKiopKChde21jZWlwaEAhLjIwLy4sKikrLTdBRkpSUlRYXmNeT0VBPU1fZmZqbndxX1lTYGVka3J4eXVtamRbVlNQT0pERUZIRkREREhIR0ZGRkM+Ojg1MispKSkrKissLCgoJykrLC0uLSwuLCopJyYmKCsuNTk4NTQ3OTk8PD08Ojo5NzU1NTQ1NTU1NjUzNjY2MjEwLy8vLi0sLy4uLCsrLCoqKionJSQkJCMkJCQlKSwuMjExMjEuKyglIyUnJyYmJicoKCgoKSorKysrLCwsLC4uLi4tLS0tLi4uLiwtLi4sKysrKioqKisrLCwtLS8uLi4uLi8vLi4vLzAwMjIzMjIxMjQzMzQ1NTU2Njc3ODg4ODg4Nzc5PkVNVV1lbXNybWliXVtXU1ZcX2Nna2lqaWVjW1hUT0xHRURCQ0NEQ0JDQ0JCQUFBQUJCQkJAQD89PDs7Ozs5OTo7QEVLUFJXWVpaWFNQT0xPUVNYWVxhY2hscXN2eXt7eHVzdXV1d3p8gYOEgoKDhYWDgXpxZllIQTw5ODc1NTIxMS4sLCoqKSkoKCoqKSkoKCkpKCgnJyYmJiYlJSQkIyMjJCQkJCQlJSUlJSUmJiUlJSUlJSYmJiYmJScnKCYnJycnJiYnJyYmJSUlJSUlJSUlJSUlJSUlJSUlJCQlJicnJycnJycnKCgoKCgoKCgoJycnJycnJycnKCgoKCcnJycnJycnJiYmJiYmJycnJygoKCgoKCcnKCgoKCcnKCgoKCgoKSkqKioqKSkpKSkpKSgoKSkpKCgnJygoJyUmJiYlJCMiIiEgIB4eHyQmKCwuMzc7PD9BREFAQUVLTE1NTEhDNCgoJykpKiVVd29saG5ycFcmKy8zLy4uLCsqKis4QEtPUlJVVlZZXlFDQ09eZ2tqZ21qVllhXlpXV2NvcnRwbG5pX1lWUk5IQ0BDRUdGRUZHRUZISUlGRD87OTQuKiotKiouMTEuKygnKSssLCwsLSssKywpKSgpLTE2NDM0NTY4ODs6OTg4NzY0MjIyMzMzMzMyMjIyMjEwLy8tLS0tLS4uLi4sLS0qKioqKCYlJSUkJCQkJSgqLjEwMDIxMC4rKCYlJiYmJiYnKCgoKCkqKysrKywsLCwuLi4uLi4tLS8vLi4sLS0tKysrKyoqKiorKywsLS0vLi4uLy8vLy8vMDAxMTIzNDMyMzMzMzQ0NTU2NjY3Nzg5OTk4ODg5OTg7QUlRW2JucnNvbGVgW1tZWFlfY2dpa2pqaGVeW1hTUEpHRURFRkVDQ0NCQkFBQUFCQkJCQUA/PTw7Ojo5OTk5Oj5FSE5SVVdbWllWU1FRUlRWWFtdYGJiaG1wc3d4fHx6eHVzdnh8fH6ChYSCgIKCf355cmlbSj44NzU0MjIwLy4tKywqKikpKCgpKSkpKCgpKCcnJyYmJiUlJCQkJCQkJCQlJSQkJCQlJSUlJSUlJSYmJiYlJScnJycnJycmJycmJiYmJycmJSUlJiUlJSUlJCQkJCQkJSUlJSUlJSYmJicmJycoKCcnJyUnKCcmJiYmJiYmJycmKCcnJycnJyYmJiUlJSUlJSYmJiYmJSUmJicnJycnJycnJycnJycoKCgoKCkoKCgqKikpKCgpKSkoKCkpKSknKCgoKCgoJycnJiQjIyMhIB4eHyAkJSosLTE0Njc6PD07PkBCSUpMSkpGPjIqJygpKCVTeW9jYWdzb10kJy8vLi0tKysqKiosL0JLTVJTU1FQVVtaTEROYmtvb2Vyal9baGVhYU1XZ2xvbWtqZ2NeXVhOR0I/QEFDRUZEREVISUlIRkRCQD03LywsLy8wMzY4Mi4qJygoKSkrLCssLS0uLisrLS0wMDAwMTEyMzY2NzY1NDQxMTEwMTIyMjIxMDAuLy8vLy8vLi4tLS4uLy8xMS8uLCopKSopKCcmJiMlJCQlKS0xMzIzMzMwLywpJiUlJSYnJycoKCgqKisrLCwsLCwtLi4uLi4vLi4vLy8vLi4tKyoqKysqKSkrKysrKyssLi8vMDExMTEyMjIyMjIyMzMzMzM0NDQ1NTY2NjY2NjY4ODc3OTk4ODg3Nzc/Rk9aY2lxdXNuamVgXltZWFxgZWdoa2xpZGBcV1VQS0hIR0ZFRUNDQkE/P0BAQkJBQUFAPz08Ozo5ODc4ODk8QERKT1RXWVtbWVZUVlZYWVtcXV9kZGdobHBydHh8fHt4dXZ4en1/goSFgYB/f358eXJpWkk7NTUzMS8uLSwrKysrKSkpKSgoKSkpKSgoKSgnJycmJiYlJSQkJCQkJCQkJSUkJCQkJSUlJSUlJSUlJSYmJSUnJycnJycnJicnJiYmJicnJiUlJSYlJSUlJSQkJCQkJCUlJSUlJSUmJiYnJicnKCgnJyclJSUlJSYmJiYmJiYmJicnJycnJSUmJiUkJCQkJSUlJSUlJSYmJSUmJiYmJycmJiYmJiYnJycnKCgmJygoKiopKSgoKSkpKSkpKSkpJygoKCgoKCcnJyYjJCMjISAgHx8gIiUoKy0wMjMzNDc6Oz5CREZJS0tKRkI2KicpKSZHfG9gX2ZxcWU3ICwwLi0tLSsrKioqLT1HREdRVFdST1FZWVJKU2JqcV5vdmJlb2hhYGJSUFxkaGpoZF9gYl5ZUUdCQD9AQkNDRERFRkZGRkVEQkA9Ny8tLzEzNDI1NDIwKykoKCgoKioqLC8xMjIwMC4uLS0vLy4uLzAyMjQxMTExMDExMDEyMjIyMTAwLy8vLy8vLy4uLi0uLi8vMTEvLi4sLCwqKSgnJiYkJSQkJCcrLTI1NTU0MTAtKygmJSUmJycnJygoKiorKywsLCwtLi4uLi4uLzAwMTEwMDAwLy0rKysrKyoqKywsLCwrLC4vLzAxMTExMjIyMjIyMjIyMjIyMzQzNDU2NjY1NTU1Nzg3Nzk5ODg4NzY2NjxDTlhhaXF0dnRxamdiYF1bWl1kZ2tqaGhmY15ZVlRQS0hHRkVEQ0JBQUFCQkJCQkJBQD89PDs6OTc3ODg5PEFFSk9RVVdaW1tbWVtbWltcX2FjY2VmZmhrbnF0eHt8end4eHt/gIKDhIJ/fHt7eXVxZ15NPTIwMC4tLCwrKysrKygoKCgoKCkpKSkoJycnJycnJiYlJSUkJCQkJCQjIyUlJSUkJSYlJSUmJiUlJCQlJSUlJiYnJycnJyUoKCcnJiYnJycnJiYlJSUlJSUkJCUlJCQkJCQkJSUmJiYmJiYnJicnJiYnJyUlJSUlJSYmJiYmJiYmJiYmJiUmJSUlJSQkJCQkJCQkJCQkJCQkJSUlJSYmJiUmJiYmJiYnJycnJycnKCkpKSkpKSoqKikoKCkpKCcnJygoJyYmJignJCUjIiIiICAgICAjJykuLzEyMjM3Oj1AQkNGSEpNTEdBNCkoKic2dXZra2pwcWo4HCUtLi0tLS0rKykpKjBGQ0JJUVNRUE9TUk1YWVtga11Lbm92bmlnZF5ZWVZSWWFiZWBcXVtbXFNLRkE/Pj9AQ0ZGRURDRUVDQkFAPDcyLjA0ODcyLTEyMS0sKikpKCkoKSwvMjU1NDQyLi4sLi4tLS8vLy4vLy8vLy8vMDAxMzMzMzIxMTEuLi8vMDAwMC4uLS0wMDAwMC8uLSwsKikoJyYkJSUkJCQkKCsuMjQ1NTIxMS4rKSclJScnKCgoKSsrKystLS0tLi4uLi4uLi4wMDExMTEyMDAvLCwtLS0tLCwtLSwsLCwuLi8vMTExMTExMTEyMjExMTEwMTIyMzQ0NDU1NDQ0NDU2NjY4ODg4ODg4ODY1OUJMVl9qc3h8endya2djYFpYXWFkZ2hoamhkYFxZVlFMSUdGRURDQD8/QkRDREVDQkFAPzs7Ozo4OTo6Ojw/Q0hOU1daXF5eX19fX15eX2JkZmZmZmNiZWhrb3J2enx8enp7fYGDgoKBfnt5dnRzbmleUUEyLi4tKywsLSsrKiooKCgoKCgpKSkpKCcnJyYmJycmJSUlJCQkJCQkIyMlJSUlJSYmJSUlJiYmJicnJSUlJSYmJycnJyYnKCgnJyYmJiYnJyYmJSUlJSUlJCQlJSQkJCQkJCUlJiYmJiYmJyYnJyYmJiYlJSUlJSUlJSUlJSUlJSUlJSUmJCQkJCQjIyMjIyMjIyMjIyMjIyQkIyMkJCQkJSUlJSYmJiYmJyYnJygpKSkpKSkpKSkoKCgoKCgnKSkoKCcmJiYnJiclJCMjIiIgICAiIicpLC4wMTM1ODxCQ0RERkpMT0xHQTIoKCwsbHxra3FybmxBGiMqLS0tLS0tKysqKSktLzlGTFFQUFBQS0xQV15gW2JeV19lcHJvaWllY11bWF1gYWFdXFpVWFhTT0xFPzw9Pj9DQ0JBQUVGQkA/QUJBOTAuMTU1MC0vMjExLy4sKSkpKysvLTAzNTg4MzAuLCwsLS0uLi4tLi0tLi4tMC8wMTMzMzMzMzIyMDAwMDExMTEuLi8wMDAwMDAvLiwrKyopKCcnJiUlJCQkJCUpLDAyNDQyMjEvLSwoJyUlJSgoKCkrKysrLS0tLS0tLi4uLi4uMDAwMDAwMDAxMDExLy0tLS4uLS0sLC0tLS0uLzAwMDAwMDExMTEwMDExMDEyMjIzNDQ0NDU1NDQ0NDY2Nzc3Nzc3Nzc0NDQ4QExXYWp1fH59enZwaWVfWVdbXWNmZmlqaWZiXFpWUUxJR0dGRUJCREZHRkdHRUNCQEA/PTw7OTo6Ojs9QURITlNXWlxfX2BgYWFgYGFjZWdnZ2ZjYGBiZGpvc3h9fHx6ent+gIGAgH14dnRycW1oX1ZGNi0tLSsrKywsLCsrJycoKCgoKCgpKSgnJiYmJiYnJiUlJSQkJCQjIyQkJSUmJiYmJiYmJicnJiYmJiYmJiYmJicnJSUlJigoJycoKCcnJycnJiYmJCYmJiUlJSUlJSUlJSUlJSYmJycmJiYmJSUmJiUlJiYkJCUlJSUkJCUlJSUlJCQkJCMjIyMjIiIiIiIiISIiIiIiIiIjIyMjJCQjIyQlJSUlJSUmJiYmJicoKCgnJykpKSkpKSkpKSkoKCkpKSknJyYoKCYmJyUlJCIiICAhIyMnKSorLjAzOTxAQkZKTU5OT09KRkExKCkqW393bG12c29QICAjLCwsLCwsLCwsKiorMTU6QEhPUk9OS0hLS1VhZFhRWmVpZ2Fja2hbWGRhX19fXF9fXFpZU1FPUlJOSEJAPjw7Oz08PD0/PT09PT9ES0ExKiouMC4vLzMzMjAxLywqLTAxMTAyMTQ4ODMvKyopKSwrLCwsLCwtLi4uLi8vLzAyMTIzMjM0NDMzMjIxMTAwLy8uLjAwMTEwLy4sLCsrKignJyYmJSQlIyQjJicrKy8wMTExLy8tKyknJycoKCgpKSorKyssLCwrKyssLi4uLTAwMDAvLzAxMDAxMTAwLi4tLS4uLS0sLC0tLS0sLi4uLi8wMC8vLy8wMDAwMTEyMjIyMzM0NDMzMzM0NjY2NjY3Nzc2NTQ0NDdATFdjbHZ8gX98dnJpZVxVU1hcYWVpaWppZmJfW1ZSTUlJSEdHRkdISkpKSkdFRENDQD49PDs7PT0/P0FFSE1SVlpeYGFjY2JiYWJlZGVmZmZmY2BdW1xkam5zdXl7e3p6e35+gX55d3Vyb25saWNZTT0uKioqKysrLCspKSgoKCgoKCgoKSkoJycnJiYmJiYlJSUkJCQkIyMkJCUlJiYmJiYmJiYnJyYmJiYmJiYmJiYmJiUlJSYnJycnKCgnJycnJiUmJiYlJiYlJSUlJSUlJSUlJSUmJicnJiYmJiYmJiYlJSUlIyMjJSUlJCQkJCQkJCMjIyMiIyMiIiIhISEiIiIhISEhISEhIiIhISIiIiIjJCQkJSUlJSUmJiYoJycnJycpKSkpKSkpKSkpKSkpKSkpKioqKicnJycmJCQjISEhISIkJykqKy0vMTY+QkZJTVBSUlRSSkY/LigpOXpyaW53d3FUISAiJiwsKyssKyssLCoqKi8wNT5GSUxMSUpMTUxYYmNZRUhTVF9mbGRkYV9gYmlrZV5eX15dWlJQUVNSTEVCQT48ODc3ODg5ODk5OTk7QlBJMSopLC0wMjI0MjEvMC8vMDIzNDQ1MjIyMzMwLSopKiopKysrLS0tLS4vLy8vMC8wMTAwMDIzNDQzMzMzMjIxMTAwLi4vLzAwLy4vLS0sKyopKCkoJiYlJSQjJCQkJygqLS4vMDEwMC8uLCknKCgpKCgpKiopKywsLi4uLi8vLi0vLy8vLi4sLS8vLy8uLi4uLS4uLi0tLCwsLCwsLC0uLi0uLy8vLy8vMDAwMDAwMTEwMDAwMjMyMjIyMjMzMzMzNDU1NDQ0NDQ2OUBMWWNwdnt7fX13cWhfVlBRV1xhZWhqamxnZGFcVlJNTEtKSkpLTExNTUxJR0ZEQ0A/PTw8PD09Pz9DR0hNUlZZXV9fY2RkZWJkZGVlZmZmZmNdXVpYW2FmbHBzeXp7e3l6fn59eHZycG1ubGplXlRDMSspKikqKisqKCgnJycoKSkoJykpKCcnJycnJiYlJSUlJSUlJSQkJCQlJSYmJiYmJicnJycnJyYmJiYmJiUlJycmJicnJycnJycnJiYmJicnJSUmJSUlJCQlJiUlJiYlJSUlJSYmJiUlJycmJiUlJSUkJCQkIiMjIyQkJCQjIyIiIiIiIiEhISEhICEhISEhISAhICEhISEhHh8jIyIiISIjIyQkJCUlJSUlJicmJigoKCgoKCkpKSkpKSkpKSkpKSoqKiooKCgoJiUkJCIiISEhJCgpKisrLi81PUFFSlNVVFRWUUpFOyopKFR1cW1zeXRlKiAiISUqLCwqKiorLC4sKysrKjM9QkhLR0hIRkRGUF9TRktTUVRiZ2VpamZeX1xiamRaWFtcXFpTUFRWU1FMQ0I/Ozo3NTQ0NTQ1Njg4OkFFQDgsKSssLjMzNDQyMjE0NTY2NTY3NjMxMC8vLCsqKSgoKCgpKy0tLS0uMC8wMTEvLy8vMDAwMTMzMTIyMzMzMzExMC8sLS8uLi8tLiwtLCsrKyopKSgmJCQkJCQjJCQkJygrLCwvMDIyMS8tKyopKSkqKioqKiorLC4uMDAvMC8tLi8vLy8vLi4uLi8vLy8uLi4uLi4tLCwsKysrKywsLS0uLi4uLy8vLy8vMDAvLy8vLy8vLzAwMTIyMjExMTExMTIzMzM0NDM0NTc4QU5ZZW53ent8eXVvZVhQUFFUWmJmZ2pramdkYl1YUlBPTU9NTk9PTk5MSUhGRURAQD8+PTw+Pj4+QUVJTlFVW11dYWNlZmZmZ2ZmZ2dmZmRiX1tVUlFWXmRoa3J2enx6e3x6enh1cXJsbGtpZl9YSjosKSsqKSkpKSgoJycnKCkpKCcpKSgnJycnJyYmJSUlJSUlJCMkJCQlJSUmJiYmJiYmJiYmJycmJiYmJiYlJScnJiYnJycnJycnJyYmJiYmJiYmJiUlJSUlJSYlJSYmJSUlJSUmJiYlJSUlJiYlJSUlJCQkJCMiIiIjIyMjIiIhISEhISEgICAgIB8gICAgICEhISAhISEgIB8hJCQhISEiIyMkJSQkJSUmJiYnKSkoKCgoKCgpKSkpKSkpKSoqKioqKioqKCgoKCclJCQjIyIiIyYoKSkqKy4uNDg+SEtSVlVVUktIRDkpKCxrc2pxeHNpNx0kIiMnKisrKiopKywuLywqLCs1QUdHSUlGQD87PUZSSj9JUllraGZoaGNlZ1xQXWdhWFRXWFpaVlFVU01NSkNDQD09Ojc1NTUzNDY4ODw+Pj48MCkpKy0wMTQ0NDM0Njg4ODc1NDMxLy0tLSwrKikoKCgoKCkqLC4uLzAvMDExLy8vLy8vLzAxMTEzMjM0NDQ1MzIwLywrLi4vLS0tLSwrKyoqKysoJyclJCYkJCQkIyYmKCorLjEzMzIyMC8vLCoqKysrKywsLC4wMDAwLzAxMTAuLy8vLy4uLi4vLy8vLi4uLi8vLSwsLC0tLS0uLi0tLi4uLi8vMTExMTAwLy8vLy8vLy8vLzAwMjIxMTIyMjIyMzMzNDQ1NDU3NjpDTlljanN5eXl1cmpfVk9TUldcYmdta2xraWViXFhXUlFQUE9QUE5OSkhHRUREQkBAPz89Pz9BQUNFR05RVVtdXmJkZ2loZ2hnZ2dnZmVkYV1YUk9OT1JZYWdscHR4e3p5enp4eHdzbW1saWdkXFNDNC0qKSgoJycoKIGAgYCAgH9/fn5+fn5+fX18fH19foCAgYGBgYGBgYCAgIB/f39/gICAgH9+fn5/f35+fn5+fn19fX19fX19fX1+fn5+fn5+fn9/f39/f39/fn5+fn5+fn5+fn5+fn5+fn18e3p6enp5eXl5eXl5eXl6fYCChYaJiImIiIiJiYiIhoWDgn9/f3+BgoODgoB8e3p6enp6fH1/gYODhYWEgoB/fn+BgoGBgYCBgYOGh4eEgoOIhISCgH5+fn5+fn5+fn5/gIGDg4KBgYGBgYGBgH59e3x8e31+fn5+fn5+fX19f4CBg4SEhYaHh4OBf359fX19fHx7e3t7fHx7fXx8fX5/f4CAgICAf4CAf358fHt8fn9+fn9/gICAgYGBg4ODgH17eHd5en5/gICAgYGBgYB+fXx9fn5+fn9/goSBf318gYCBgICAf39+fn5+fn59fXx8fX1/gICBgYGBgYGBgICAgH9/f3+AgICAf35+fn9/fn5+fn5+fX19fX19fX19fX5+fn5+fn5+f39/f39/f39+fn5+fn5+fn5+fn5+fn5+fXx7enp6enl5eXl5eXl5eXp9gIKHh4mIiYiGhoeHhoaFhIKBfn5+f4GCg4OCgHx7enp6enp7fX6BgoOEhYSCgH9+f4GDgoKCgIGBg4WGh4WDg4WFh4aBf39/fn5+fn9/f4CBgYODgoGBgYGBgYGAfn17fHx7fX19fn5+fn59fX1/gIGDhISFhoeHg4F/fn19fX18fHt7e3t8fHx9fX19fn9/gICAgIB/f39/fXt7e3x+f35+fn6AgICBgYGCgoF/fXp4d3l6fn+AgICBgYGBgH59fH1+fn5+f3+ChIF+fXuBgIGAgIB/f35+fn5+fn19fHx9fYCAgIGBgYGBgYGAgICAf39/f4CAgIB/fn5+f39+fn5+fn59fX19fX19fX19fn5+fn5+fn5/f39/f39/f35+fn5+fn5+fn5+fn5+fn59fHt6enp6eXl5eXl5eXl5en2AgoeIiIiIh4SEhISEhIOEg4B+fn5/gYKDg4KAfHt6enp6ent9foCBgoOEhIOBgH+AgoODg4KBf4GCg4WFhYF/e32DhoOBf39+fn5+fn9/gYKCg4OCgYGBgYGBgYB/fXt8fHt9fX1+fn5+fn19fX5/gYOEhIWGh4eDgX9+fX19fXx8e3t7e3x8fX5+fn1+f3+AgICAgH9/f358eXl7fH5/fn5+foCAgIGBgoGBf359e3p5ent+f4CAgIGBgYGAfn18fX5+fn5/f4KEgX17eYGAgYCAgH9/fn5+fn5+fX18fH19gICAgYGBgYGBgYCAgIB/f39/gICAgH9+fn5/f35+fn5+fn19fX19fX19fX1+fn5+fn5+fn9/f39/f39/fn5+fn5+fn5+fn5+fn5+fn18e3p6enp5eXl5eXl5eXl6fYCCh4mIh4eFg4OCgoODg4SCf359fn+BgoODg4B8e3p6enp7e31+gIGCg4SDg4GAf4CCg4SDgoF/gYCDg4SEgHt0dn2ChIOAgH5+fn5/gICCg4SDg4KBgYGBgYGBgH99e3x8e318fH5+fn5+fX19fX6Bg4SEhYaHh4OCf359fX19fHx7e3t7fHx9fn5+fX5/f4CAgICAf35+fXx5eXt8fn9+fn19gICBgYGDgYKAf316enl6fH5/gICAgYGBgYB+fXx9fn5+fn9/goSCfXx6gYGBgICAgIB/f35+fn59fXt7fX5/gICAgYGBgYCAgYGAgH9/f3+AgICAf39/f35+f39+fn5+fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+f399fX5+fn5+fn5+fn5+fn5+fXx8enl5enp5eXl5eXl5eXt9gIOFiIeGhIKBgYGCg4SEhIJ+fn19f4GChISDgX57e3p7e3p6e36AgYGChISDgYCAgoODg4KCgYGBgYODhYSAeXNzdoCGh4F+fn5+fn+AgYKDg4OBgYGBgYGBgYKBgH18fX18fXx8fH1+fn59fX19foCCg4WFhoaHhIJ/fn59fX18e3p6e3x9fX5/f39/f4CAf39/f4CAfn18e3l6e3x+fn59fX6AgIGCgoOCgX99fXp6eXp8fYCAgICBgoKCgH5+fH5+fn5+foCCg4F+enmBgYGAgICAgH9/fn59fX19fHx9fn+AgICBgYGBgICBgYCAf39/f4CAgIB/f39/fn5/f35+fn59fX19fX19fX5+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+fn5+fn5+fn59fHx6eXl6enl5eXl5eXl5en2Bg4aIhYSCgICAgYOEhYaFgn58fH1/gYKEhIOCf3x7ent7e3t8fn+BgYKDhIOBgYGDg4ODg4KDgoCAgoKEg4B5dHR1fYWHgX5+fn5+f4CCgoODgoGBgYGBgYGBgoGAfXx9fX19fHx8fX5+fn59fH1+gIKDhYWGhYaFg39+fn19fXx7e3t7fH5+gICAgICAgIB/f39/f39+fHp5eXp7fH5+fn19f4CAgYKCg4KBf358e3p6e3x9gICAgYGCgoGAfn58fn5+fn5+gIKEgXx5eYGBgYCAgICAf39+fnx8fX19fX5/f4CAgIGBgYGAgIGBgIB/f39/gICAgH9/f39+fn9/fn5+fn19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn5+fn5+fn18fHp7e3p6eXl5eXl5eXl5fICChIWCgYF/gYGDhIaGh4SBfXx7fX+BgoSEg4KAfXt6e3t7e3t9foCBgoSEg4GCgoODg4ODg4OBf3+BgYSDf3l2dXZ6gISAf35+f3+AgYOCg4OBgIGBgYGBgYGCgX99fH19fX18fHx9fn5+fn18fX1/goKEhYaFh4WDf35+fX19fHt7e3x9f3+BgYGBgICAgH9/f39/f3x7eHd4eXt8fn59fH1/gICBgoKEg4F/fnx7enl7fH2AgIGBgYKCgH99fXx+fn5+fn6Bg4SAe3l5gYGBgICAgIB/f35+fHx9fX19foB/gICAgYGBgYCAgYGAgH9/f3+AgICAf39/f35+f39+fn5+fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fX1+fn5+fn5+fn5+fn5+fn5+fXx8ent7enp5eXl5eXl5eXl7fYCCgoCBgX+CgoSFhoWGgYB8e3t9f4GChISDgoB9e3p7e3t7en1+f4GCg4SEgYKCg4ODg4ODg4KAgICAg4J/eXh3d3p8gIGAfn5/gICBgoKDg4GAgYGBgYGBgYKAfn18fX19fXx8fH1+fn5+fX19fX+CgoSEhYaHhYN/fn59fX18e3t7fH6AgIGBgoKAgICAf39/f35+e3p5eHd5e3x+fn17fX+AgIKCg4SDgYB/fXx6eXt8foGAgYGBg4OBgHx8fH5+fn5+foGDhIF7eXmBgYGAgIB/f35+fX18e319fX5/f3+AgICBgYGBgICAgICAgICAgICAgIB/f39/fX1+fn5+fn19fXx8fX19fX19fX19fX5+fn59fX5+f39+fn5+fn5+fn5+fn5+fn5+fn59fXx7e3t5eXl5eXl4eHh4eXp8gH+BgIKCgoODhoeGhYSCfnx7e3x/f4GDg4ODgX58e3p6enp7fX+AgYGChISDg4OEhIODg4ODgX9+f4GBgYF/fXx7ent/goF/f3+AgYKDgoOCgoB/gICAgYGBgYB+fHt9fX19fX18fX5+fX19fXx+gIGDg4OEhYaEgoB9fn59fHx7fX5/f4CBg4OCgYCAf3+Af39/fnx5eHd3eHp8fX19fHt8f3+BgoKFhYOCgH58e3t7fH1/gYGCgoODgoF+e3p9f35+fn5+f4KEgXt5eIGBgYCAgH9/fn19fHt6fHx9f39/f4CAgIGBgYGAgICAgICAgICAgICAgH9/f39+fn5+fn5+fX19fHx9fX19fX19fX19fn5+fn5+fn5/f39/fn5+fn5+fn5+fn5+fn5+fn19fHx7e3p5eXl5eXh4eHh5enx/f4GAg4SEhISGh4eFhIF9fHt7fH9/gYODg4OCf3x7enp6ent9foCBgYKDhISDg4ODg4ODg4OAf35/gYGBgH58e3x5en2CgoGAgICCg4OEgoKCf35/gICBgYGBgH58e319fX19fXx9fn5+fX18fH2AgYODg4SFhoSCgH1+fn18fX1+gIGBgIKCgoKAgIB/fn9+f39+e3l4dnZ4enx9fX18e3x/f4GCgoWFg4KAfnx7e3t9fn+BgYKCgoKBgHx6enx+fn5+fn5/goSBfHl4gYGBgICAf399fXx8e3p8fH1/f39/gICAgYGBgYCAgICAgICAgICAgICAf39/f39/fn5+fn19fX18fH19fX19fX19fX1+fn5+fn9+fn9/fn5+fn5+fn5+fn5+fn5+fn5+fX18fHt7enp5eXl5eHh4eHl6e36BgoKEhYWFhYaHh4WCgHx7e3t8f3+Bg4ODg4KAfXt6enp6enx+gIGAgYKEhISEhISDg4ODgX99fH1/f39+fX18fn18foOEgoGAgYOEg4OCgYF+fn+AgIGBgYGAfnx7fX19fX19fX5+fn59fXx8fX+Bg4ODhIWGhIKAfX5+fn1+fn+AgoKCgoKCgX+AgIB+fH1/f316eXd2dnh6fH19fXx7fH9/gYKChYWDgoB+fXt8fH1/f4GBgoKBgoF+e3l6fH5+fn5+fn+Cg4J9e3mBgYGAgIB/f319fHx6enx8fYB/f3+AgICBgYGBgICAgICAgICAgICAgIB/f39/f39+fn5+fX19fHx8fX19fX19fX19fX5+fn5+fn19f39+fn5+fn5+fn5+fn5+fn5+fn59fXx8e3t6enl5eXl4eHh4eXp7foGChIWFhYWFhoeHhYF+fHt7e3x/f4GDg4ODg4B9e3l5enp6e35/gICBgoSEhISDg4ODg4OAfnx7fH5+fn19fX6BgH59gYSEgYGCg4SDhIKCgH99foCAgYGBgYB+fHt9fX19fX19f35+fn19fHt9f4GDg4OEhYaEgoB9fn5+fn5/f4KDhIOCgYGAf4CAgH98fX9/fXp4d3V2eHp8fX19fHt8f3+BgoKFhYOCgH59fHx8fX+AgoCCg4KAgHx5eHp8fn9/f39+f4KDg317eoGBgYCBgYB+fnt8e3t7e3x+f39/f3+AgICBgoKAgICAgICAgICAgICAgICAgIB/f39/fX19fX18e319fX19fX19fX19fX19fX5+fn5+fn19fn59fX19fX1+fn5+fn5/f319fHx8fHt7enl5eXh4eHh5e3x+goOEhoaGhoaFhoaEf317ent7fX5/gIGCgoOCgX57enp6ent7fX6AgICBg4SEhIODg4ODgoB/fH19fn5+fX2Ag4eIgn1+g4SDgoOGhoOCgoF+fXx8f4GCgoGBgH59fHx8fX19fX19fn5/fnx7e31+gYODg4SFhoWDgX5/f3+AgIGCg4SEg4GAgICAgIB/fnx9fn59enl2dXV3e3x9fXx8enx/gICCgoWFg4OAf359fX5+f4CBgYOBgH59enh4en1/f39/f35/gYSCfnx6gYGBgICAf359e3t7e3t7fX5/gH9/f4CAgIGBgYCAgICAgICAgICAgICAgICAgH9/f399fX19fHx7fX19fX19fX19fX19fX19fn5+fn5+fX1+fn19fX19fX5+fn5+fn5+fX18fHx8e3t6eXl5eHh4eHl7fH6ChISGhoaGhoWGhoN/fHt7e3t8fn+AgYKCg4KCgHx7e3p6e3t8foCAgIGChISEg4ODg4OCf358fH5+fn5+foCDhoaDfnt/hIWEhoeGhIKCgX58e3x/gYKCgYGAfn18fHx9fX19fX1+fn5+fXt7fH6Bg4ODhIWGhYOBf39/f4CBgoODhISDgYCAgICAgH9+fX5+fn16eHZ1dXd7fX59fHx6fH+AgIKChYWDg4F/f35/fn9/gYKCgoGAfnx4dnZ7fn9/f39/fn+BhIKAfXuBgYGAf39+fX17e3t6ent9fn+Af39/gICAgYGBgICAgICAgICAgICAgICAgICAf39/f319fX18fHt9fX19fX19fX19fX19fX1+fn5+fn59fX5+fX19fX19fn5+fn5+fX19fXx8fXx7e3p5eXl4eHh4eXt9f4KEhIaGhoaGhYaFgn98e3x7e3t9f4CBgoGDg4KAfHt7enp7e3x9gH+AgYGDhISDg4ODgoF/fn19f39+foCAfoCCgoB9e3yDhYaGhYSEgYKAfn17fn+BgoKBgYB+fXx8fH19fX19fX5+fn59e3t8f4KDg4OEhYaFg4F/f39/gIGCg4OEg4OBgIB/f39/f359fn5+fXp4dXR0d3t+f318fHp8f4CAgoKFhYODgoCAf39/gICBgoKCgYF+fHd2d3t/f39/f39+f4GDgoB9e4GBgYB/f359fXp7enp6e31+f4CAf3+AgICBgICAgICAgICAgICAgICAgICAgIB/f39/fX19fHx8e319fX19fX19fX19fX19fX5+fn5+fn19fn59fX19fX1+fn5+fn59fX19fHx9fXt7enl5eXh4eHh5e36AgoSEhoaGhoaFhoWCfnx7e3t7e3x/gIGCgYOEg4F9e3p6ent7fH1/f4CBgYKEhIODg4OCgH9+fX2AgH19f4B+foB/f316eoGDhISEhIKBgYCAfn1/f4GCgoGBgH59fHx8fX19fX19fn5+fn17enx/gYODg4SFhoWDgX9/f4CBgYKEhISDg4GAgH5+fn5/fn1+fn59enh1dHR3e35/fXx8enx/gICCgoWFg4OCgIF/f3+AgIGCgoKBgX18eHZ4e39/f39/f35/gIODgn99gICAgH9+fn17e3p6ent9fn5+f4CAgIGBgYGAgICAgICAgIGBgYGBgYGBgYGAgH9/fn19fXx7e3t7fHx8fHx8fH19fX19fX19fX1+fn19fX19fX5+fX19fX19fX19fX19fX19fXx8fHp6eXh4eHh3eHl8f4CDhYWGhoSFhYWEg4B8fHx8fHx8fH5/gIKBg4SDgX58enp6e3t8fX1+gIGAgoSEg4OCgYGAf35+f4B/fn5+gH9/f359fHt5foCCgIGCfXh4e319fH9/gYGDgoKBfnx7e3t8fHx9fH59fX5+fX17fH6BgoODg4OGhYOAf3+AgYKCg4SEg4KCgX9+fn5+fn59fn5+fnt4dXNzdHd7fH19fHt7fYCBgYGDhoaEhIKCgoKAgIGBgYKDhIOBf3p3dnh8fn9/f35+fn+BhISBfnqAgICAf359fHt7e3t6e35+fn9/gICAgYGBgYCAgICAgICAgYGBgYGBgYGBgYCAf39+fX59fHt7e3t8fHx8fHx8fX19fX19fX19fX5+fX19fXx8fX59fX19fX19fX19fX19fX19fHx8enp5eHh4eHh4en6AgYOEhIWGhIWFhYSBfnx8fHx8fHx8fn9+gIGDhIOCf3x7enp7e3x9fX+AgYCChISDg4KBgYB+fn5+fn19foCAgH5+fXx6e3l7fYF/f3xzcHF0eHp8f3+BgYODg4F+fHt8fHx8fX18fn19fX18fHt8foGCg4ODg4WFg4B/f4CBgoOEhISCgYGBf359fX5+fn1+fn5+end0cnN0d3t9fn18e3t9gIGBgYOFhYSEhISDg4KBgYGBgoOEg4F+end2eX1/f39/fn5+f4CDhIF+eoCAgIB/fn18e3t7e3t8fn5+f3+AgICBgYGBgICAgICAgICBgYGBgYGBgYGBgIB/f359fn18e3t7e3x8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx6enl4eHl3eHl7f4CCgoOFhoaEhYWFhIF+fHx8fHx8fHx9fn6AgYOEg4KAfXp6ent7e3x9f3+AgIKEhIODgoF/f319f359fH1+f4B/fn18enh5enh8goF+eHNwcHJ0d3x/f4GBg4ODgX59fH19fHx9fXx+fX19fXx8e3x+gYKDg4ODhISCgIB/gIGCg4ODg4KBgYB+fXx8fX1+fX5+fX15dnNycnN3e31+fXx7e32AgYGBg4WFhISEhIODgoGBgYGChIWDgX15dnd5fn9/f39+fn5/f4KFg397gICAgH5+fXx7e3x8e31+fn5/f4CAgIGBgYGAgICAgICAgIGBgYGBgYGBgYGAgH9/fn5+fXx7e3t7fHx8fHx8fH19fX19fX19fX18fH19fX19fHx8fX19fX19fX19fX19fX19fXx8fHp6enh4enh5e3x/goODhISFhoSFhYOBf3x8fHx8fHx8fHt9foCBg4SDg4F9enp6e3t6e35/foCAgoSEg4OCgX5+fX5/f3x8fX5/gH59fXx6eHh5dnmAgH96dnNzcnR4fH9/gYGDg4OBfn59fX18fH19fH59fX19fHx6e36BgoODg4OEhIKAf4CBgoKDgoKCgYCAf318fHx8fH59fn58fHh1cnFxcnd7fn99fHt7fYCBgYGDhoaEhISEhISCgYGBgYKEhYOBfXh2d3l9f39/f35+fn9/goWDf3yAgICAfn18fHt7fH18fX5+fn+Af4CAgYGBgYGBgICAgICAgICBgYGBgYGBgYCAgIB+fn59fHt6ent7fHx8fHx8fHx9fX19fX19fX19fX18fHx8fH18fHx8fX19fX19fX19fXx8e3x7e3p6eXh4d3l8fYGDg4OEhYSEhIWFhIF/fnx8fHx8fHx8fH1+gICCgoODgX57e3t8fHt9fn9/gIGChIWEg4KAfn19fn+AfHx9fn9/f3x7e3p5eXd2dn1/goF9d3R1d3p9foCAgYKDg4F+fXx8fHx8fX19fX19fX18e3t7fYCBg4ODg4ODgoB/gIGCgoKCgYGBgIB9fHt6e3x9fn59fX16eHVzcXFydnp9fn18enx+gICAgYOFhYSEhISDg4OCgYGDg4SFg4B7eHZ4eX1/f39/fn5+f4CDhYSAfICAf39+fXx7e3t8fX19fn5+f4CAgICBgYGBgYGAgICAgICBgYGBgYGBgYGBgICAgH9+fXx8e3p6e3t7e3x8fHx8fH19fX19fX19fX1+fnx8fHx8fHx8fHx9fX19fX19fX19fHx7fHt8enp5eHh3eX1/gYSDhIWFhISEhYWEgX58fHx8fHx8fHx9fX5/gIKCg4OBfnx7e3x8enx9fn+AgYKDhYSDgX9+fX5/gIF/fn5+fn5+fHp6e3p6d3d2eX2BgX14d3h6e31+gICBgoODgX59fHx8fH19fX19fX19fHt7ent9gICDg4ODg4OCf4CAgIGCgoKBgIB/fnt7enl7fX5+fn19fXp4dXJxcHJ2en1+fXx7fH6AgICCg4WFhISEhIODg4KBgYKChIWDgHt4dnh6f39/f39+fn5/gIOFhIB8gIB/f319fHt8fHx9fX1+fn5/gICAgIGBgYGBgYCAgICAgIGBgYGBgYGBgYGAgICAf358fHt6enp8fHt7fHx8fHx8fX19fX19fX19fX5+fn58fHx8fHx8fH19fX19fX19fX18fHt7e3t6enl4eXh7foCChISDhISEhISEhISBfXt8fHx8fHx8fH19fn+AgoKDg4F/fHt7fHx7fH1+f4CBgoKEhIOAfn59f3+BgYCAf39/fn58enp7e3p4eHZ3e4B+enl6e3x8fH2AgIGCg4OBfn18fHx8fX19fX19fX18e3t5en2AgIKDg4ODg4KAf4CAgYGBgYF/f358eXl4eXt+f35+fX18eXd0cXBwc3Z6fX58e3t9foCAgIKDhYWEhISEg4OCgYGBgoKDhIJ/e3h2eHt/f39/f35+fn+Ag4WEgHyAgH5+fXx8e319fH19fX5+fn+AgICAgYGBgYGBgICAgICAgoKCgoKCgoKCgoCAgIB/fnx8enl6ent7enp8fHx8fHx9fX19fX19fX19f39+fnx8fHx8fHx8fX19fX19fX19fXx8e3t7e3p6eXh6eHt/gIKFhYOEhISEhIODgn99e3x8fHx8fHx8fX1+f4CCgoOEgX98e3t8fHp7fH5/gIGCgoOEg399fn1+foB/f39/f399f317enx8enh4dnd6fX14e3x9fHp7fYCAgYKDg4F+fXx8fHx9fX19fX19fXx7e3l6fYB/goODg4ODgYCAgIGBgYGBf359fHx5eHd5e35/fn59fXt5d3Rxb3Bydnp9fnt6fH1+gICAgoOFhYSEhISDg4KAgYGBgYOEgX97eHZ4fIB/f39/fn5+f4CDhYSAfH9+fn19fH18fn59fn1+fn5/f4CAgICBgYGBgYGBgYCAgYGCgYGBgYGBgYGBgYGBf39+fXx7ent7e3t7e3t7e3t8fHx8fX1+fn5+fX5+foB/fHx8fHx8fHx9fX19fX19fX19e3t7e3t7enp5eXl6fYCBg4KDhISEhISDg4OBfXx8fHx8fH19fH18fX1+gIKCg4ODgH15e3x8enx8fX+AgYKDg4SCf31+fn9+fXp7f39+fX1+f359fHx8e3t5d3d6eXV5f357ent+gYGBgYODgX5+fX19fX19fX19fHx6eXp5eXp9f4CCg4ODg4KCgYGBgoGBf39/fXx7end2d3h8fX59fn59fHh1c3BucHJ1eX1/fHt8fn+Af3+Cg4WFhYWEgoKBgoGBgYKCg4KBfXp3dnl9gIB/f39+fn9/f4KGhYF+f35+fX18fX1+fn5+fn5+f4CAgYGAgIGBgYGBgYGBgICBgYKBgYGBgYGBgYGBgYF/f318e3t7e3t7e3t7e3t8fHx8fHx9fX19fX18fn5+f358fHx8fHx8fH19fX19fX19fHx7e3t7e3t6enl5eXt+gIGCg4SDg4ODg4OCgoB9fHx8fHx8fX18fHx9fX6AgoKDg4SAfXt8fHx8fX19f4CBgoODhIJ/fX5+fHx3dXd9fHt8fX5+gH59fX+BgYB6dXZ2dXmAf3t6e36BgYGBg4OBfn59fX19fX19fX18fHp6eXh4eXx+gYKDg4OCgoKBgYKCgYGAgH98e3p4d3Z3eHx+f35+fn17eHVzcG5vcXV5fn98e3x+f4CAgIKDhYWEhIOCgoGBgYCBgoKCgYB9end3en6AgH9/f39/f39/goWFgX5/fn59fXx9fX5+fn5+fn5/gICAgICAgYGBgYGBgYGAgIGBgoGBgYGBgYGBgYGBgX9+fXx7e3t7e3t7e3t7e3x8fHx8fH19fHx8fHt9fn5+fHx8fHx8fHx8fX19fX19fX18fHt7e3t6enp6eXl6fH+AgYKDhIKCgoKCgoKBgH18fHx8fHx9fXx8fH19foCCgoODhIF+fX18fH1+f39/gICBgoOEgn99fn58enRzd31+fXx8fX6Af35/gYSEgnx0c3Z2eX6Ae3p7foGBgYGDg4F+fn1+fn19fX19fXt7eXl4eHd4e32BgoODg4KCgYGBgYGAgICAfnt6eXd2dnd6fX5/f39+fHp3dXJwbm5wdXl9f3x7fH5/gIGBgoOFhYODgoGBgH+AgICBgYKBf3x6d3h7f4CAf39/f39/f3+ChISBfn9+fn19fH19fn5+fn5+f3+AgICAgICBgYGBgYGBgYCAgYGCgYGBgYGBgYGBgYGBf359fHt7e3t7e3t7e3t7fX18fHx8fX18fHx8e3x9fX17fHx8fHx8fHx9fX19fX19fXt7e3t7e3l5enp5eXt9f4GBgoKDgoKCgoKCgYGAfXx8fHx8fH19fHx8fX1+gIKCg4OEgn99e3x8fn9/gH+Af4CCg4SCf31+fn16dHV3foGBfn59fYCAgIGDg4OCfXRzd3h6fH57ent+gYGBgYODgX5+fX5+fX19fX19enp6eXd3dnd6fYGCg4OCgoKBgoKBgYCAgIB9e3p5d3Z2d3p9f4CAgH97end0cnBubnB1eXt9fHt8fn+AgYGCg4WFg4OCgX9/f3+AgIGBgoF/e3p3eHuAgIB/f3+AgH9/f4KEhIF+f35+fX59fn5/f39/fn9/f4CAgICBgYGBgYGBgYGBgICCgoKCgYGBgYGBgYGBgYB+fn18e3t7enp7e3t7e3t8fH19fX19fX19fX18fXx8fHx8fH19fX19fX19fX18fHx8e3t7e3t7enp6enh6fH2AgYCCgoKBgICAgIKCf399fHx8fHx8fHx9fX19fX6AgoKDg4SDgH58fH1+f4B/f3+AgYODg4KAfX5+fHt4eHt9g4aEf31+gICBg4SEg4F9dnN1d3p9fXx6fH+BgYGCgoKBf318fX19fX5+fXx6eXl4d3V0dnl9gIKDg4GBgYGBgYGBgIB+fnx6eHd2dXV2eX5/gIGBf3x6dXNxcG5ucHV6fH18e3x+f4CAgIGChISDgYGBf4CAgICAgYGBgH16d3Z5fICAgIB/f39/f39/gYSEgX5/fn59fn5+f39/f39+f39/gICAgIGBgYGBgYGBgYGBgYKCgoKBgYGBgYGBgYGBgH5+fXx6e3t6ent7e3t7e3x8fX19fX19fX19fX19fHx8fHx8fX19fX19fX19fXx8fHx7e3t7e3t6enp6eHp8foCBgYKCgoGAgICAgYF+fHt8fHx8fHx8fH19fX19foCCgoODhIOAfn18fX5/gX9/f4CBgoKDgoF+fn58fHt7fX6DhoaBgH+AgYKDg4OCgX55c3J2eXx9e3p8f4GBgYKCgoF/fXx9fX19fX19e3p4eHh2dXN1eH2AgoODgYGAgICAgIB/f318e3p4dnZ0dXZ5fn+AgIB/fXl1c3Fwbm5wdXp9fXx7fH5/gICAgYKEhIOBgYF/gIB/f3+BgYB/fHl2dnl8gICAgH9/f39/f3+BhISBfn9+fn1+fn5/f39/f39/f4CAgICAgYGBgYGBgYGBgYGBgoKCgoGBgYGBgYGBgYGAfn18e3p7e3p6e3t7e3t7fHx8fH19fX19fX19fX18fHx8fHx9fX19fX19fX19fHx8fHt7e3t7e3p6enp4enx+gIGBgYGBgH+AgH+BgH17enx8fHx8fHx7fH19fX1+gIKCg4KDg4B/fn1+f4CCgH9/gIGBgYODgn5+fn19e319gIGDhYKBgICBgoKCgoGAfXlzcHN3e3x6e3x/gYGBgoKCgH59fH19fX19fXx6eXh3d3V0cnR4fYCCgoKBgICAgICAgH9/fXx6eXd2dXN1dnp/f4CAgH58eXV0cnBubnB1en19fHt8fn+AgICBgoSEg4GBgX+AgH9/f4CAf356d3V1eXyAgICAf39/f39/f4GEhIF+fn19fX5+fn9/f39/f3+AgICAgICBgYGBgYGBgYGBgoKCgoKCgYGBgYGBgYGBgYB+fXx7ent7enp7e3t7e3t8fHt7fX19fX19fX19fXx8fHx8fH19fX19fX19fX18fHx8e3t7e3t7enp6enh6fH6BgYKBgYGAfoCAf4CAfXx7fHx8fHx8fHx9fX19fX6AgoKDgoKDgH9+fX+BgYKAf3+AgYGBg4OCf35+fX18fH1/gIKCgH9/gIKCgoKCgYB8eHNvcHZ7fHp8fH+BgYGCgoJ/fn18fX19fXx8e3p4d3d2dXNyc3d8gIKBgYGAf39/f39/f399fHp4dnV0c3V2e4B/gICAfnx5dXVycG5ucHV6fX18e3x+f4CAgIGChISDgYGBf3+Af39/gIB+fXl2dXR5fICAgIB/f39/f39/gYSEgX5+fn5+f39/gH9/gIB/gICAgICAgIGBgYGBgYGBgYGBgYGBgYGBgYGBgoKBgYCAgH59fHt7e3t7e3t7e3t6fHx8fHx9fXx8fHx9fX19fX19fX19fn5+fn5+fX19fXx8fHp7e3t7enp6eXl5eXt9f4GBgoF/fn5+f4CAgYB9fHx7e3x8fHx8fH19fX19foCBgYKCg4KBf39+gIKCg4GAgICAgYGChIOAf35/f3x8fH6BgYF/fX+AgYODgoGAfnt4dG9tdXx9e3t8f4CBgoKDg4B/fXx8fHx8fHx7eXh3d3Z0c3Bydnt+gIKCgIB/fX19fX5+fXx6eHZ2dXNzdHd8foCBgIB/fHl2dHNxb21wdHl9fXx8fX9/gICAgoKDg4KBgYGAgICAfn5+fn17eHVzdXl9gIB/f39/f39/f3+BhIN/fX5+fn5/f39/f3+AgH+AgICAgIGBgYGBgYGBgYGBgYGBgYGBgYGBgYGCgoGBgICAfn18e3t7e3t7e3t7e3p8fHx9fX19fHx8fH19fX19fX19fX1+fn5+fn59fX19fHx8ent7e3t6enp5eXl5fX6AgYKCgX59fX5/gIGAf3x8fHt7fHx8fHx8fX19fX1+f4CBgoKDgoGAgH+AgoKDgYCAgICBgYKEg4F/fnx6e3t8foGBgX9+gIKCg4SCgH98end0bmx0fH17e3x/gIGCgoODgX58e3x8fHx8e3p5eHZ2dXNyb3B1en6AgoF/f359e3t8fX19e3l4dnV0c3N0d3x+gICAgH98eXV0c3JvbXB0eX19fHx9f3+AgICCgoODgoGBgYGBgIB+fn5+fHl2c3N2en6AgH9/f39/f39/f4GEg39+fn5/f3+Af39/f4CAf4CAgICAgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYKCgYGAgIB+fXx7e3t7e3t7e3t7enx8fH19fX18fHx8fX19fX19fX19fX5+fn5+fn19fX18fHx6e3t7e3p6enl5eXp9f4GBgoGAfn19foCBgYB9e3x8e3t8fHx8fHx9fX19fX5/gIGCgoOCgYCAgIGCgoOBgYCAgIGBgoSDgX9+e3h5fHx+gYGCgoCCgoSDgoKAfXt5d3Vva3N8fXt7fH+AgYKCg4OAfXt6fHx8fHt7enl3dnRycHBub3V6fX+BgX9+fnx6ent8fXx6eHh2dHNycnR3fX+AgICAfnx4dHRycW9ucHR5fX18fH1/f4CAgIKCg4OCgYGBgYGAgH5+fX17eHRyc3Z7foCAf39/f39/f39/gYSCf35+foCAf4B+f39/gICAgICAgICCgoGBgYGBgYGBgYGBgYGBgYGBgYGBgoKBgYCAgH59fHt7e3t7e3t7e3t6fHx8fX19fXx8fHx9fX19fX19fX19fn5+fn5+fX19fXx8fHp7e3t7enp6eXl5en5/gYGDgX9+fX1+gIKBgH17fHx7e3x8fHx8fH19fX19fn+AgYKDg4KBgYGAgYKCg4GBgICAgYGChIOCf357eHp8fH6BgYOFhISEg4OCgX98eXp3d3FqcXt8e3t8f4CBgoKDg4B9e3p8fHx8e3t6eXd2c3Jvbmxuc3l9foCAfn19e3l5enx8fHp3eHZ0c3JydHd9f3+AgIB+fHd0c3Jwbm5xdHl9fXx8fX9/gICAgoKDg4KBgYGBgYCAfn59fXl3c3Bzdnt+gIB/f39/f39/f3+BhIKAf39/gIB/f39/gICAgICAgICAgIGBgoKCgoGBgYGBgYGBgYGBgYGBgYGCgoKBgICAf359fHx7e3p6e3t7e3t7fHx9fX19fX19fX19fX1+fn19fHx+fn5+fn59fX19fHx7e3p6enp5eXl4eHp7f4CCg4OBgH19fn+BgoJ/fHt7e3t7fHx8fHx8fX19fX5+f4CBgoKCg4KBgICBgYOCgYGAgIGAgoODg4KAfnx6e3x9f3+ChYeHhYSDg4GAfXt6eXp4c2xxenx6e32AgYGCgoODgX57ent7fHt7e3p4d3ZzcW5tbG1yeX1+f39/fHp5eHh6e318eXh3dHJxcHFzeH1/gICAgH58d3RzcnFvbnB0eX19fHx+f3+AgICCgoODgYGAgYCAf39/fXx6eHRwcXJ3fX+AgH9/f319f36Af4CCgX99f3+AgH9/f3+AgICAgICAgICAgYGCgoKCgYGBgYGBgYGBgYGBgYGBgYKCgoGBgYGBf39+fXx8e3t8fHx8e3t8fH19fX19fX19fX19fX5+fX19fX5+fn5+fn19fX18fHt7enp6enl5eXh4enyAgoOEg4GAfX1/gIKCgYB8e3t7e3t8fHx8fHx9fX19fn5/gIGCgoKDg4KAgIGBg4KBgYCAgYCCg4ODgoB+fXx+fX5/gISFhoWFhISCgH98e3p5eHh1bnB5fHp7fYCBgYKCg4OBfnt6e3t7e3t6eXh2dHJwbGtqbHF4fX5/fn16eXh3d3l7fHt6eXd0cnFwcXR4foCBgIB/fnx2dHNycW9ucHV6fX18fH5/f4CAgIKCg4OBgYCBgIB/f359e3l2c29wcnd9f4CAf39+fX1+foB/gIGBf32AgICAf4B/gICAgICAgIGAgICBgYKCgoKBgYGBgYGBgYGBgYGBgYGBgoKBg4SEhYWDgX9+fX19fX5+fn59fXx8fX19fX19fX19fX19fn59fX19fn5+fn5+fX19fXx8e3t6enp6eXl5eHl7foGCg4OCgYB/f4CBgoKBf3x7e3t8fHx8fHx8fH19fX1+fn+AgYGBgoODgoGBgYGDgoGBgICBgIGCg4OCgH5+fX19fn+BhISFhYSFhYJ/fnx6eXl4eHZwbnd7ent9gIGBgoKDg4F+e3p7e3t7e3p5eHV0cW5ramlrcHZ8fn99enh3dnZ2eHt8fHp5d3RycXBxdXh+gIGAgH9+fHZ0c3JycG5wdnt9fXx8fn9/gICAgoKDg4GBgIGAgH9/fXx6eHRxbm9yd31/gIB/f318fH1+gH+AgYF/fYGBgICAgH+AgICAgICAgYCAgIGBgoKCgoGBgYGBgYGBgYGBgYGBgYGCgoCDhYWHh4SDf35+fX5+gICAgH5+fHx9fX19fX19fX19fX1+fn19fn5+fn5+fn59fX19fHx7e3p6enp5eXl4eXx+gYODg4OBgIGBgYKCgoF/fXt7e319fHx8fHx8fX19fX5+fn+AgYCChISDgYGCgYOCgYB/f4CAgIGDg4KAfn5+fn5+f3+Cg4SDhISDgX9+e3p6eXh2dHFvdnt6e32AgYGCgoODgX57ent7e3t6enl4dHNwbWppZ2ludXx+f3x6eXZ1dHV4en18eXl3dHJxcHF1en+BgoGAf358dnRzcnJwbnB2e319fHx+f3+AgICCgoODgYGAgYCAf399fHl4c29tbnJ3fX+AgH9/fXx8fX6Af4CBgX59gIB/f4CAgICAgICAgICBgYGBgYGCgoGBgYGBgYGBgYGBgYGBgYGAgYGChIeIiIqKh4aCgH5/gYKChYWEgYB9fXx8fH19fX19fX1+fn19fn5+fn5+fn5+fn58fHx8fHt7enp6enl5eXh6fYCCg4SEgoKBgYGAgYOCgX18e3t7fHx8fHx8fHx9fX19fX1/gICBgICEhIOCgoKChIOCf31+f4CAgYKCg4F+f39/f39+f4CCgoSEg4GBfnt7enp5eHd2cG51eXl8fX+BgYKCgoKAfXt6e3t5eXp4eHZ0cW9ta2lmaW92fH9+e3h3dHNzdHh6e3p6eXZ0cnFwcXR5f4CAgICAf3p2dHNzcnFwcXd8fHx8fX5/f39/gYKDgoGAgICBgICAfnx6eHZyb2tudHh+f4CAf399enx9f4CAgIGBf36AgICAgICAgICAgYGAgIGBgYGBgYKCgYGBgYGBgYGBgYGBgYGBgYCBgoSFiImJioqJiISBgIKEhYaIiIaEg4B+fXx8fX19fX19fX5+fX1+fn5+fn5+fn5+fnx8fHx8e3t6enp6eXl5enx/goSEhYWDgoGBgYCBgoGBfXx7e3t8fHx8fHx8fH19fX19fX5/gIGBgISEg4OCgoKDg4J/fXx9gIGCgoKDgn9/fn5/f39/gIKCg4OCgYB9e3t6enl4d3dyb3V5ent9f4GBgoKCgoB9e3p7e3l5enh4dnRxb2xqaGZpb3Z8f357eHZ0c3R1eHp7enl4dnRycXBxdHp/gICAgIB/end1dHRzcXJzeHx8fHx9fn9/f3+BgoOCgYCAgIGAgIB+fHp4dXJva291en5/gIB/f315e32AgICAgYF/foGBgYGAgICAgYGBgYCAgYGBgYGBgoKBgYGBgYGBgYGBgYGBgYGBgIGDhIWIiYmJiYmIhoSChIaHiIqJh4aFgn9+fn19fX19fX19fn59fX5+fn5+fn5+fn5+fHx8fHx7e3l5eXl5eXl7foGChISFhYOCgYGBgIGCgIB8e3t7e3x8fHx8fHx8fX19fX19fX6AgYKCg4ODg4KCgYKDgn99fH2AgYKCgoODf39+fX9/f3+BgoKDg4KBfnx7e3p6eXh3d3ZydXl5fX5/gYGCgoKCgH17ent7e3t7enh2dXJvbGpnZmlvdnx/fnt4dnR1dHV4ent6eXh2dHJxcHF1e3+AgICAgH96d3V0dXNyc3R4fHx8fH1+f39/f4GCg4KBgICAgYCAf358end0cW5rb3V7f4CAgH9/e3l7fYCAgICBgX9+goKBgYCAgICCgoCAgICBgYGBgYGCgoGBgYGBgYGBgYGBgYGBgYGAgYGDhYiJiYmJiIeIhYOGiIiLiomIiIaDgn5+fnx9fX19fX1+fn19fn5+fn5+fn5+fn58fHx8fHt7eXl4eHp5eXuAg4OFhYWFg4KBgYGAgYB/f3x8e3t7fHx8fHx8fHx9fX19fX19foCBgoKCgoODgoKBg4OCf31+f4CBgoKCg4N/f35+f3+AgIGCgoKCgoF+fHt7enp5eHd3dnN1eHl8fn+BgYKCgoKAfXt6e3t7e3t6eHd1cm9saWZmaW92fH9+e3l3dXZ1dnh6e3p5eHd1cnFwcXV7f4CAgICAf3t4dnV1dHJ0dnh8fHx8fX5/f39/gYKDgoGAgICBgIB/fnx6d3Rwbmtvdn1/gICAf395eXx+gICAgIGBf36BgYCAgYGAgIGBgYGAgIGBgYGBgYGBgYGBgYGBgYGBgYCAgICAgICAgYGEh4iHiIiIiIeGhYaIh4mJh4eIiIeEgX9+fX19fX19fX5+fn5+fn5+fX1+fn5+fX18fHt7enp5eXh5eXp8f4GEhIWFhYSEgoGBgYCBgYB9e3t7e3t8fHx8fHx8fH19fX19fX5/gIGCgoKCg4ODg4ODgoB/fXx+gICBgoODg4B/fn+AgIGBgoKCgoKBf3x7enp5eHh3d3d3dHN4enx/gIGBgYCCgoB9e3p7e3t7enp5d3Vyb2xpZmVmbHV8foB8eXh1dnZ3eHp7enl4d3VycXJzd3yAgICAgIF/enh2dnZzdHV2eX17e3t8f4CAf3+AgoOCgYGAgICAgYB/fXl2cW9sa292fYCAgICAfXp4e36AgICAgIB+fYGBgICBgYGBgYGBgYCAgYGBgYGBgYGBgYGBgYGBgYGBgICAgICAgICBgYOGhoWHh4eHh4eGhoeHiIiHh4eHh4WDgH9+fX19fX19fn5+fn5+fn5+fn5+fn59fXx8e3t6enl5eHp5fH+Bg4WFhYWGhIOCgYGBgYKBfnx6ent7e3x8fHx8fHx8fX19fX19fn+AgYKCgoKDg4ODg4OCgH58fH6AgIGCg4OCgYB/gICCgoKCgoKCgoB+fHp6enl4eHd3d3dzc3h7fX+AgYGBgIKCgH17ent7e3t6enl3dXJvbGlmZWZsdXx+f3x5eXV3d3h6e319fHt5d3V0c3R5foCAgICAgYB7eHd3dnR2dXZ6fHt7e3x/gIB/f4CCg4KBgYCAgICAgH99eXZxbmtrcXd9gICAgIB9eXd7foCAgICAgH59gYGAgIGBgYGBgYGBgICBgYGBgYGBgYGBgYGBgYGBgYGAgICAgICAgIGBgYOEgoODhIWGhoWFhoWGhoWFhYaIh4WBgH59fX19fX1+fn5+fn5+fn5+fn5+fn19fHx7e3p6eXl4ent+gYOFhoWGhoaEgoKBgYGBgn9+e3p7fHx8fHx8fHx8fHx9fX19fX1+f4CBgoKCgoODg4ODg4J/fnt7foCAgYKDg4OCgH+AgYKDgoKCgoKCf3x7enp6eXh4d3d3d3NzeXt8foCBgYGAgoKAfXt6e3t7e3p6eXd1cm9saWZlZmx1fH5+fXt6d3h5enx9f39+fXt6eHd3eHt+gICAgICBgX16eHh3dnV0dnl7e3t7fH+AgH9/gIKDgoGBgICAf4CAf315dnFua2tyeH5/gICAgH14d3p+gICAgICAfn2BgYCAgYGCgoGBgYGAgIGBgYGBgYGBgYGBgYGBgYGBgYCAgICAgICAgYGBgYGBgICBg4WFhYSFg4ODg4ODhYeJhoKAfn19fX19fX5+fn5+fn5+f39+fn5+fX18fHt7enp5eXh5fICChYWFh4eGhoOCgoGBgYCBfnx7eXp7fX18fHx8fHx8fH19fX19fX5/gIGCgoKCg4ODg4OCgX9+e3t+gIGCgoKDg4OBgICDgoKBgoKCgoJ+e3t6enp5eHh3d3d3dHN3fH1+gIGBgYCCgoB9e3p7e3t7enp5d3Vyb2xoZmVmbHV8fn5+fHp4eHp7fn+BgYF/fXx7eXl6fX+AgICAgIGCf3t5eHh2dXN1eXt7e3t8f4CAf3+AgoODgYGAgIB/gH9/fXl2cW1qanJ6f3+AgICAfXd3e36AgICAgIB+fYKCgYGCgoKCgYGBgYGBgYGBgYKCgoKBgYCAgICAgICAgICAgH9/f3+AgH9/fn19fX+BgoSFg4J/fX1/f4GDhoeHhYJ/fn59fX19fX1+fn9/fn5+fn5+fn59fXx7e3t6enl5enyAg4aGhYWFhYaGgoOAgYCAgH58fHt6e3t7e3t7e3t7e3x8fX18fH19fH1/gIGBgYODg4ODg4KAf318fH2AgYKCgoKDg4KCgoSDhIKDgoKBgH98e3p6enl5eHh2eHd0cnZ6fn+AgYGBgYODf3x7eXp7fHx7enl4dXNvbGlnZmdsdXx+fn59e3t7fX9/gYGBgoB/f318fX1/f4GBgICAgIGBfXp4eXd1dHZ6fHx8fH1+gH9/f4CCg4KAgICBgYCAf399eXVwbGprc3p+f4CAgH97d3V6foCAgICAgH9+goKCgoKCgoKBgYGBgYGBgYGBgoKCgoGBgICAgICAgICAgICAf39/f4CAf39+fH19foCBgoOAfXp4eHt7fYGEh4eHg4B/f35+fn5+fn5+f39+fn5+fn5+fn19fHt7e3p6eXt8foGEh4aGhYWFhISCgoCBgICAfXt7e3t7e3p6e3t7e3t7fHx9fXx8fHx8fX+AgYGBg4ODg4OCgYB/fXx8fYCBgoKCgoODgoOEhoWFg4OCgoGAf3x7enp6eXl4d3d4d3VydHp9f4CBgYGBgoJ/fHt5ent8fHt6eXh1dHBtamdnaGx1fH5+fn19fX1/goGDhISDg4CBgH5+fn+AgYGAgICAgYF/fHp5d3V0dnp8fHx9fn6Af39/gIKDgoB/gIGAf39/f315dXBram10e35/f4CAfnp3dnp+gICAgICAf3+CgoKCgoKCgoGBgYGBgYGBgYGCgoKCgYGAgICAgICAgICAgIB/f39/f39/f358fX1+f4CBgX15d3h4eXl8gIKGhYWDgYCAf39/f39/f39/f35+fn5+fn5+fX18e3t7enp6fH1/gYSGhYaFhYWDg4GBgYGBf316enp7e3t7enp7e3t7e3t8fH19fHx8fHx9f4CBgYGDg4ODg4KBf359e3t8gIGCgoKCg4OChIWGhYWDg4KCg4GAfXt6enp5eXh3eHh4dHFyeXx/gIGBgYGBgX98e3l6e3x8e3p5eHV0cW5qaGdpbXV8fn5+fn1+foCBg4ODg4OCgYKAgH9/gICBgYCAgICBgYF/fXp4dnV3enx8fH1+foB/f3+AgoOCgH+AgIB/f39+fXl1cGxsb3V8f39/gIB9eXZ2en6AgICAgIB/f4KCgoKCgoKCgYGBgYGBgYGBgYKCgoKBgYCAgICAgICAgICAgH9/f39+fn9/fnx9fX1+gIB/fHh2eHh5eXt+gYWFhYOCgIB/gICAgICAgH9/fn5+fn5+fn59fXx7e3t6ent8foCChoaFhYWFhYKCgICAgIB+e3l6ent7e3t6enp6enp6enx8fX18fHt7fH1/gIGBgYODg4ODgoF/fnx8e3yAgYKCgoKDhISFhYeGhYODgoKDgoB9e3p6enl5eHd3eXhzbnJ4fH+AgYGBgYGBf3x7eXp7fHx7enl4dXRxbmxpaGltdXt+f319fX6AgYKEhYSEg4KAgYCAf4CBgYGBgICAgIGBgICAfHh2dnh6fHx8fX5+gH9/f4CCg4KAfn+Af39/fn59eXVwa2xwdn2AgICAgH15dXd6foCAgICAgH9/goKCgoKCgoKCgoGBgYGBgYGBgICAgIGBgICAgICAgIB/f39/fn5+fn5+fn59fXx8fX1/fnt4eHh5eXt7fH6Ag4OEhYSDgoKAgICAgIB/f39/f35+fn5+fn19fHt7e3p6en1/goSFhISFhYWEgoGBgH+Af3x6eHh4enp7e3p6e3t7e3t7fHx9fXx8e3t7fH1/gICBgoKCg4OBgH59fHx7fH+AgoKDg4OFhIWFhoaGhIODg4KCgH18e3p6eXl4eHh5dnNucHd8f4CBgYGBgIB/fHt6enp9fXx7enl2dHJva2hoaW52fH9/fn19foCBgoSDg4ODgX9/f39/foCBgIB/fn5+f4CBgYB9eXd1d3l8fHx9fYCAf39/gIOEgX99f39/f39/fnt3dG9qa3B3fYCAgH9/fXl1eHt/gICAgICAf36CgoKCgoKCgoKCgYGBgYGBgYGAgICAgYGAgICAgICAgH9/f39+fn5+fn5+fn19fHx9fH19eXh4enp6e3t8fX1/g4OFhYSGhIKCgoKCgH9/f39/fn5+fn5+fX18e3t7enp7fYGDhYWEhYWEhIOBgIB/fn99enl4eHh6ent7enp7e3t7e3t7e3t7e3t7e3t8fH+AgIGCgoKCgoGAfn18e3t8f4CCgoODg4WFhYSGhoWCgoKCgoKAfXx7enp5eXd4eHp6dW9xd3x/gIGBgYGBgYB9fHp7e319fXx7eXh0c3BsaWlqbnZ7fn9+fn1+f4GBg4KCgYF/fn59fH59gIGAgH9+fn5+f4GCgH96d3V3eXx8fH19f39/f3+Ag4SBf31+f39/f399e3dzbmprcXl9f4CAf399eXV4e3+AgICAgIB/foKCgoKCgoKCgoKBgYGBgYGBgYCAgICBgYCAgICAgICAf39/f35+fn5+fn5+fX18fHx8e3t4eHl7e3t8fH19foCCg4SFhIaGhYWFhYWEgH9/fn5+fn5+fn59fXx7e3t6ent+goSEhISFhIOCgX9+fnx9fHp4d3l6enp6enp6ent7e3t6ent7enp6ent7e3x9gICAgYKCgoKCgH99fHt7ent+f4KCg4ODhIWGhoaGhIKBgYGCgoB9fHt6enl5d3d4e314c3J3fH+AgYGBgYODgH19e3x8fX18fn18eXZzcG5rampudnt9f39+fX5/gIGCgIF/fXt6eXp6e3x/gICAf359fXx+gIKCgHt3dXd5fHx8fX1+fn9/f4CDhIF/fH5+fn9+fn17d3Jta210en5/gIB/f315dXh7f4CAgICAgH9+goKCgoKCgoKCgoGBgYGBgYGBgICAgIGBgICAgICAgIB/f39/fn5+fn5+fn59fXx8fXx7enl5eXt7e3x8fXx+gIKCg4SGhYaGh4aGhoWBf399fX5+fn5+fn19fHt7e3p6fH+ChYSEhIWEg4KBf319fHp6enl3eXp6enp5eXp6e3t7e3p6enp7e3p6e3t6e31/gICBgoKCgYGAf318e3t6en1+goKDg4OEhYeHiIWDgICBgYKCgH18e3p6eXl3eHh6fHp1c3d8f4CBgYGBgoKBfn18fHx9fXx/f356eHRxb2xqbHB3fH5+fn59fn+AgYB+fn15d3Z1dnd4e3+AgIB/fnx8e31/goSBfXd1d3l8fHx9fX5+f39/gIOEgX98fX5+fn5+fXt3cm1rbXV7fn+AgH9/fXl1eHt/gICAgICAf36Dg4ODgoKCgoKCgYGBgYGBgYGBgYCAgICAgH9/gICAgH9/fn5+fn19fX19fX18fn59fXx7ent6e3t7fX19fX5+gICCg4SDhoeIiIiJiISAfX5+fn5+fn19fHx7e3t7e3t9f4OEhISFhoSBgH9+fHp6eXl3d3d5enp6enp6e3t7e3t6eXp6eXp6enp7e3p7fn+AgYGBgoKBgYB+fX17e3t7fH6AgYKCg4SEhYaGhYKAgH+AgYB+fnt6eXl4eHd3eHh7e3V0eHx9f4GBgYGCgoF+fXx8fH1+f4CAf3t5dXJvbW1tcnl9f39/f35+foCAf3x7eXd2dHJyc3V5foB/gIB+fXx8fH2ChIN9d3Z4enx8fH5+fn5/f36AgoOCf31/f39/f359e3VybWptdnx+f4B+f398eHV4fH+AgICAgIB/foODg4OCgoKCgoKBgYGBgYGBgYGBgICAgICAf3+AgICAf39+fn5+fX19fX19fXx9fXx8fHx8fHx8fHx9fX19fn5+foCBgoSFhoiJiYqIhYB+fn5+fn5+fX18fHt7e3t7fH2AhISEhIWFgoB9e3p5d3d3d3d3d3l6enp6enp7e3t7enp5enp4eXl6ent7ent9f4CBgYGCgoGBgH59fHt7e3t8foCBgoKDhISFhoWEgX+Af4B/fH19e3l5eXh4d3d3d3l6dnV4e31/gYGBgYKCgX59fHx8fX6AgoKCf3t3c3Fwb290en5/f39/f39/gH99enl3dXRzcXBxdHl+gH+AgH9+e3p6fICDhIB6d3h6fHx8fn5+fn9/foGCg4KAfn9/f39/fn16dXFta253fn9/gH5/gHx3dXh8f4CAgICAgH9+g4ODg4KCgoKCgoGBgYGBgYGBgYGAgICAgIB/f39/f39/f35+fn59fX19fX19fH19fHx9fXt7e3t8fH19fX19fX1+fn+AgoOFh4iIiYiGgX59fX5+fn59fXx8e3t7e3t8foGCgoSEhIJ/fHp4d3Z3d3d3d3d3eXp6enp6ent7e3t5eXl5e3l5eXp6e3t6e3x+f4CBgoKCgYF/fn18e3t7e3t9gIGCgoKDhIWGhYOAf39/f317fX17eXl5eHh3d3Z2d3d3dnd6fX+BgYKCgoKBfn18fHx9f4GDhISBfXh1c3Fyc3d7fn9/f39/f39/fnp5eHd2dXNxcHF0eX6Af4CAgH57dnh6foODgnx4eXp8fHx+fn5+fn5+gYGCgoF/f35+f39+fXl1cG5scHh+f3+Afn+AfHd1eHx/gICAgICAf36Dg4ODgoKCgoKCgYGBgYGBgYGBgYCAgICAgH9/fn5+fn9/fn5+fn19fX19fX18fHx7e3x8fHx8fH19fX19fXx8fH18fX6AgYOFhoaHh4aBf319fn5+fn19fHx7e3t7e3x+gYKChISDgHt6eXh3dnd3d3d3d3d5enp6enp6enp7e3h4eHl7enl5enp7e3p7fH1/gICBgoKBgX9+fHx7e3t7enyAgYKCgYOEhYWEgX5+f39/enl9fnt6eXl4eHd3dnV2dnd2dnp9f4GBg4OCgoF+fXx8fH1/gYOEg4F+eHZ2dXV2eXx/gH9/f3+AgH9+eXh4d3V1c3FwcXV6foCAgICAfnp2dnh9goKCfHh5enx8fH5+fn59fX6BgIKBgoB/fn5/f359eHRwb25xeX5/f4B+f4B8d3V4fH+AgICAgIB/foODg4OCgoKCgoKBgYGBgYGBgYCAgICAgICAf39/f39/fn5+fn19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHt7fX6Ag4ODhIWFhYOAfX1+fn59fX18fHt7enp7fX6BgoOEg4N/e3h3dnd3dnZ4eHd4eHl6enp6enp6eXt7eXl5enp6eXl5eXl6e3t8fX+AgYKCgoGAf359e3x8enp7fH+BgYGBgYKEhIOBfn5+fn12e39+fHp5eXh4eHd2dXV2eHd2eX1/gYGCgoKCgX59fHx9fn+Bg4WEg397eXh4enp7foCAf39/f3+AgH55eHh3dXV0cnFydXp+gICAgYN9eXV0d3uAg4J9enl6e3t7fH19fX5+fn+AgYKCgX9+f39/fnx5dXFvb3N6foCAf39/gHx3dXh8f4CAgIB/f4B9g4ODg4KCgoKCgoGBgYGBgYGBgICAgH+AgIB/f39/f39+fn5+fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18e3t7fH6BgoKBgYOEhIB9fX5+fn19fXx8e3t6ent9f4KDg4SDgn56d3Z2d3d2dnd3d3h5eXp6enp6enp5enp5eXp5eXl4eHl5eXp7e3x9f4CAgYKCgYB/fnx7fHx7e3x8f4GBgYGBgoODgoB+fX19end8gX98enl5eHh4d3d2dnZ5dnZ5fX+BgYKCgoKBfn18fH1+foCDhYWDgHx7enp8fHx/gICAfn9/f4CAfnl4eHd1dXRzc3R2e36AgICBgn55dXN2en+Cg357eXp7e3t8fX19fn99fn+AgoKAgH9/f39/fXl1cW5vdHx/gIB/f39/fHZ1eHx/gICAgICAgH2Dg4ODgoKCgoKCgYGBgYGBgYGAgICAf4CAgH9/f39/f35+fn59fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18e3x8fX+AgH9/gYOEgHx8fn5+fX19fHx7e3p6e31/goODg4KAfHl3dnZ2dnZ2eHh3eHl5enp6enp6enl5eXl5eXl5eXh4eXl5ent7fH1+gIGCgoKBgH9+fHt8fHt7fHx/gYGBgYGCg4KAf3x8fXt4eH+Cf317eXl4eHh3eHl4dnZ0dnl9f4GBgoKCgoF+fXx7fHx9gIGEg4KAfn19fH5+f3+AgIB+f3+AgYF+enl4d3V1dHNzdHd7f4CAgICBf3t1c3R5foGDf3x6ent7e3x9fX1+f318fX+BgYB/f39/f39+eXVxbm91fH+AgH9/f398dnV4fH+AgICAgICAfYODg4OCgoKCgoKBgYGBgYGBgYCAgIB/gICAf39/f39/fn5+fn19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx8fH19fn5+f3+BhISAe3t+fn59fX18fHt7enp7fX+Dg4ODgX97eHZ2d3d3eHh4eHd4eXl6enp6enp6eXl5eXl5eXl5eHh5eXl6e3t8fX6AgIGCgoGAf318e3x8fHx8fH+BgYGBgYKCgX9/e3t9e3l6gYOAfXt5eXh4eHd4enl2dHR2eX1/gYGCgoKCgX59fHt8fH1/f4GBgYB+f399foB/f4CAf35/f4CCgX58enh4dnZ1c3R0d3yAgYCAgIKCfXd0dHh8gIOBfXt6e3t7fH19fX5/fXt8foCAgH9/gH9/fnx5dG9tb3V9f4CAf39/f3p1dXd8f4CAgICBgYB9hISEhIKCgoKCgoGBgIB/f4CAgIB/f39/f39/f39/f399fX19fHx8fHx8fHx8fH19fX18fHx8fHx8fHx8fX19fX5+fX17fX59fHt9f4OFhH55en1+fX19fXt6enp7enx/gYODhIOBfnp4d3d3d3d3d3h4eHh5eXp6enp6enp6enp5eXh4eXl4eHl5eXl6enx9f4CAgYKCgoF/fnx7fHx8fXx9gICBgYGBgoKCgH18enx7eHuBg4B9e3l4eHh3eHp+enVzc3Z6fX+BgYKCg4OAfXx6enp8fH5/f4CAgH+AgYCAgYCAgIB+fn+AgIOAfnt5eHh3dnZzdXV5foB/gICAgoB9eXV0d3yAgoF+ent7e3t6e319fn59e3l7fn5/f39/f39/fHh0cG5wdn1+f39/f39+eHR0en1/f4CAgICAfnyEhISEgoKCgoKCgYGBgYCAgICAgH9/gH9/f39/f39/f319fX18fHx8fHx8fHx8fX19fXx8fHx8fHx8fHx+fn5+fn59fXx+fn18e3yAhIaCfHl6fX59fX19fHt6ent8foCDhISEg4B9end3d3d3d3d3eHh5eHl5enp6enp6enp6enl5eHh5eXh4eXl5eXp6fX6AgYCBgoKCgoB+fHt8fHx+fX6AgIGBgYGCgoKAfXx6fHt4e4GDgH17eXh4eHd4fIB6dXR0dnt9f4GBgoKDg4B9fHp6enx8fX5/gICAgICBgYGBgICAgH5+f4CAg4F+e3l4eHh2d3V2dnt+gH+AgICCgH15dXR3e3+CgH57e3t7e3p7fX19fn17eHl8fn9/f39/f398eHRwb3F3fX5/f39/f314c3R6fX9/gICAgIB+fISEhISCgoKCgoKBgYGBgYGAgICAf39/f39/f39/f39/fXx8fHx8fHx8fHx8fHx8fHx9fX19fXx8fHx9fX5+fn5+fn5+f39+fn18foKGh4J8eXp9fn19fX18e3p6e32AgoSEhISDgHx5eHd3d3d3d3d4eHl4eXl6enp6enp6enl5eXl4eHl5eHh5eXl5e3t9foCBgYGCgoODgH98e3x9fX5+f4CAgYGBgYGBgX99fHp8e3h7gYOAfXt5eHh4d3l9gHp1dHR2e31/gYGCgoODgH18enp7fHx8fn+AgYGAgIGBgYGAgH9/f35/gICDgX98eXh4eHZ3d3h3e36Af4CAgIKAfXp2dHd7foCAf3x7e3t7ent9fX1+fnt3dnl8f39/f39/f3x3dHBvcnh+fn9/f39+fHdydHp9f3+AgICAgH58hISEhIKCgoKCgoGBgYGBgYCAgICAf39/f39/f39/f398fHx8fHx8fHx8fHx8fHt7e3x9fX19e3t8fH5+fn5+fn5+f39/f35+fn1/hIiHhH15en1+fX19fXx7ent7foKFhISDg4KAfHl3dnd3d3d3d3h4eXh5eXp6enp6enp6enl5eXh4eXl4eHl5eXl8fH5/gIGBgoKCg4OAf317fH19f35/gICBgYGBgICAf318enx7eHuBg4B9e3l4eHh3eX6AeXV0cnZ7fX+BgYKCg4OAfXx6ent8fHx9f4CCgoCAgYGBgYCAfn5/fn+AgIOBf3x6eXl5d3d4d3h8f4CAgICAgYB9enZ1d3p+f4B+fHx7e3t6e319fX5/fXd2eX1/f39/f39/fHd0cHBzeX5+f39/f358dnJ0en1/f4CAgICAfnyDg4SEgoKBgYKCgYGBgYGAf39/f39/f39/f39/f39/fn19fHx7e3x8fHx8fHx8fHx8fX5+fnx8fHx7fHx9fX19fn5+fn9/fn5/f4CFiIiDfnp7fX59fX18fHt8fH2Bg4SFhYODgn98d3d3d3d3d3d3eHh5eHp6e3t7e3t7enl6eXl5eHh4eHh4eXl5eXp8fn+AgICBg4ODg4F/fXx9fH2AgICBgICAgYGBgYKAfnx6e3p2fYKDgH17eXh4eHh6fX95dHJydHp9f4CAgYGDg4F+fHp6ent7fH2AgYODgoGCgoGBgIB/f39+f4CAg4F/fHp5eXl4eHd4eX2AgICAgYCAf317d3V2en2Af399fHt7e3p7fX19f399eHZ4e319fn5/f357dnNvcHR5fn9/f4CAf3t1cnV6fX+AgICAgH9+e4ODg4OCgoGBgoKBgYGBgYB/f39/f39/f39/fn5/f399fHx8fHt7fHx8fHx8fHx8fH19f39/fX19fXt8fH19fX1+fn5+f39+fn9/gYWIiIN+e3t9fn19fXx8fH19gIOFhISDhISCf3t3d3d3d3d3d3d4eHl4enp7e3t7e3t6eXp6eXl4eHh4eHh5eXl5e3x+f4CBgIGDg4ODgn99fH59f4GBgYKAgICBgYKCgoF/fHt6eXd+goOAfXt5eHh4eXt+fXh0c3J0en5/gICBgYKCgX98enp6e3t8fYCBg4ODgoGBgYGAgIB/f35/gICDgn98e3l5enl4eHh7fn+AgIGBgYF/fXt4dnd4e39+fn18e3t7e3x9fX1/gH15dnh7fX1+fn9/fnt3c3BwdXp+f39/f39+e3VydXp9f4CAgICAf316g4ODg4KCgYGCgoGBgYGAf39/f39/f39/f39+fn9/fnx8fHx7e3t8fHx8fHx8fHx8fn+AgIB+fX1+fHx8fX19fX5+fn5+fn5+f3+BhIeHhX97e31+fX19fHx9foCDhIWEhYSDg4F+enh3d3d3d3d3d3h4eXh6ent7e3t7e3p5enp5eXh4eHh4eHl5eXl8fX5/gIGBgYODg4OCgH58foCBg4SEg4GBgYGBgoKBgH98fHl4eH6Cg4B9e3l4eHh5fH58d3V1cnR6fn+AgIGBgoKBf317e3t7e3x9gIGDg4OCgICAgICAgH9/fn+AgIOBgH18e3t7enl4eXt/gICAgYGBgH99e3h3d3h7fHt9fHx7e3t8fX19fX+Afnp3eHt9fX5+f39+e3dzcHB1en5/f39+fn56dXJ1en1/gICAgIB/e3iDg4KCgoKBgYKCgYGBgYB/f39/f39/f39/f39/f399fHt7e3t7e3x8fHx8fHx8fHx9foCBgX9/f359fHx9fX19fn5+fn5+fn5/f4GDh4eFf3t7fX59fX18fX1+goSGhYWEhIODgX15eXd3d3d3d3d3eHh5eHp6e3t7e3t7enp6enl5eHh4eHh4eXl5eXx9fn+BgYGCg4ODg4KAfn1/gIGDhYWDgoKCgYGCgoGAf3x8eXh4foKDgH17eXh4eHl8f312dXRxdHp+f4CAgYGBgYF/fnt7fHt7fH2AgYODg4KAgH9/gICAf39+f4CAg4GAfXx7e3t6eHl5e3+AgYCBgYKBf317eHd3eXt7e3x8e3x8e3p7fX19f4B/e3h5e319fn5/f357dnJxcXd8fn9/f35+fXp1cnV6fX+AgICAgH97d4ODgoKCgYGBgYGBgYCAgH9/f39/fn5+fn5+f39/f319e3t7e3t7fHx9fX19fX19fXx8f4GBgIGBfn18fHx+fn5+fn5+fn5+fn5+gYOGiIWBfHp8fX59fH19foGFhoeGhYSFgoF/fHl4eHh3d3d3eHh4eHl5enp7e3t7e3t6enp6eXl5eXl5eXl5eXl6fH5/gIGBgYGCgoKCgoB/fn+Ag4SGhoKBgYCAgYGBgYB/fHt4dnZ9goSAfXt6eXl5eXp+fnh1dHF0en5/gICBgYGCgYB+fX19fHp7fH+Cg4OCgH5+fn+AgH9/fn5/gIGCgX97ent7e3p5eXp8f4CBgYGBgoJ+fHt5eHh5eXp7e3t7e3x8e3x7fX6AgH57d3l7fX5+f4CAfnt2c3FyeHx9fn19fn58eXNzdXt+gICAgICAfXp1g4OCgoKCgYGBgYGBgIB/f39/f39+fn5+fn5+fn5+fX18fHx8fHx9fX19fX19fX19fHx+gICAf39+fXx8fH5+fn5+fn5+fn5+fn6Bg4aIhoJ+fH1+f318fX6AgoaHh4eGhISCgHx6eHd4eHd3d3d4eHh4eXl6ent7e3t7e3p6enp5eXl5eHh4eHl4eXp8foGBgYGBgYKCgoKCgYB/gIGEhYaGg4KBgICAgYGCgX98fHl2dn2ChIB9e3p6eXl4eHx/fHd2cnR6fn+AgIGBgoKBgX9+f358e3t8foOEg4J/fXx+f4CAf39+fn+AgYKBf3x7e3t7enl5en1/gIGBgYGBgX59e3p6enl5e3p7e3t7fHx8fHt9foCAfnx3eXt+fn5/gIB+e3ZzcXN4fH1+fX1+fnx5c3N2fH+AgICAgH99enWDg4KCgoKBgYGBgYGAgH9/f39/f35+fn5+fn5+fn59fX19fHx8fHx8fX19fX19fX18fH1+fn5/f359fHx8fn5+fn5+fn5+fn5+foGDhoeHg4B+foB/fX1+f4GEhoeIh4aFg4J/e3l3dnd3d3d3d3h4eHl5eXp6e3t7e3t7enp6enl5eXl3d3d3eXl5e3x/gYKBgYGBgoKCgoKBgICBg4aGhoaEgoGAgYF/gIKCgH18eXZ2fIGDgX17enp5eXh4eHx+enhzdXp+f4CAgYGDgoGBgYCAf318e3x+goODgX56fH5/gIB/f35+f4CBgoF/fXt7e3t6eXl6fX+AgYCAgYGBf317e3t7e3t7eXl7e3t8fHx8e31+gIB+fHl6fH5+f3+AgH57d3Nxc3h8fX5+fn5+fXl0c3d8f4CAgICAgH15doODgoKCgYGBgYGBgYCAf39/f39/fn5+fn5+fX19fX19fX19fX19fHx9fX19fX19fXx8fH1+fn5+fn18fHx+fn5+fn5+fn5+fn5+gYOFh4iFgX5+gH99fX+AgoeIiIiHhoWDgX56eHd3dnZ3d3d3eHh4eXl5enp7e3t7e3t6enp6eXl5eXh4eHh5eXp7foCBgoGBgYGCgoKCgoGAgIKEh4eGhYSDgYCAgX6AgYGAfX15dnZ8gYKBfXt6enl5eHd2eX58eHR2fH5/gICBgYKCgoKCgYGAfXx7fH6CgYGAe3p8fn+AgH9/fn5/gIGCgX99e3t7e3p5eXp9f4CBgICAgIB/fXt8fHt8fHx6ent7e3t7fHx7fX6AgH58e3t8fn5/f4CAfnt3c3FzeHx9fn9/fn59eXRzeH5+gICAgIB/fHl3g4OCgoKCgoGAgICAgH9/fn9/f39+fn5+fn5+fn19fXt8fH19fX19fX19fX18fHx8fHx9fX19fHx9fX19fX1+fn5+fn5/f39/fn6BgoWGh4WBfX5/f35+f4CDhoeIiIeHhYJ/e3h3d3Z2dnd3eHh4eHl6eXt6ent7e3t7e3p6enp5eXh4eXl5eXl5e32AgYGCgoKBgYGCgoKBgYGChIWGhYWDhIGBgICBfn6AgoKAfX12dXuBgoF9e3p6enp6eXZ3fX14dHV7fn+AgIGBgoKEg4ODgoJ+fXx8fYCCf318e3t/f4CAf39+f3+AgYKCgH17e3t7enl5e31/gICAgICAgH18e3x9fX59e3p6e3t7enp7e3p8foCAf3x8fHx9fX5+f39+e3dzcnV5fX1+fn5/f314dHR3fH+AgICAgX97eHeDg4KCgoKBgYCAgICAf39+f39/f35+fn5+fn5+fX19e3x8fX19fX19fX19fXx8fHx8fH19fX19fX19fX19fX5+fn5+fn9/f39+foGChIWGhYF+fn9+fn5/gYSHh4iJh4WDgXx4eHd3dnZ2d3d4eHh4enp7e3t7e3t7e3t7enp6enl5eHh5eXl5eXp8fn+BgYKCgoGBgYKCgoGBgoSEhYSFhIKCgIB+fn+BgYGCgoGAgHd1eoCCgX17enp6enx8foCAfnhzdXt+f4CAgYGCgoSEhIODgoB9fHx+f4F9e3t7e39/gIB/f35/f4CBgoKAfXt7e3t6eXl7fX+AgICAgIB/fXx7fH1+fn17eXp7e3t6ent7enx+gIB/fHx8fH1+fn5/f357d3Nydnl9fX5+fn9/fXh0dHd8f4CAgICBf3x4d4ODgoKCgoGBgICAgH9/f35/f39/fn5+fn5+fn59fX17fHx9fX19fX19fX19fHx8fHx8fX19fX19fX19fX19fn5+fn5+f39/f35+gIGDhYaGgn99fX19fn+ChYaHiIiGg4B+end4eHZ2dnZ3d3h4eXl6ent7e3t7e3t7e3t6enp6eXl5eXl5eXl5e3x+gIGCgoKCgYGBgoKCgYKDhYWGhYWDgoGAgH59f4GBgYGBgIGAenZ5f4KBfXt6enp6fH+Cg4F+eXN1e35/gICBgYKChIWEhISCgX58fH5/fnx6e3x+f3+AgH9/fn9/gIGCgoB9e3t7e3p5eXx9f4CAgICAgH99fHt8fX5+fXt4enp7e3p6e3t6fH6AgH98fHx8fX5+f4CAfnt3c3J3en59fn5+f399eHR0eHx/gICAgIGAfHl4g4OCgoKBgYGAgICAf39+fn9/f39+fn5+fn5+fn19fXt8fH19fX19fX19fX18fHx8fHx9fX19fn59fX19fX1+fn5+fn5/f39/fn5/gIKEhoaCf319fX1+f4GEhoeHh4aCfnt4d3d3dXZ2dnd3eHh5eXp7e3t8fHt7e3t7e3p6enp5eXl5eXl5eXt7fYCAgYKCgoKBgYGCgoKBg4SGhYaHhYGBgH9/fn19gICAgYF/f395dXuAgoF9e3p6enp7f4GBf314cnV7fn+AgIGBgYKEhYSDhYSBf3x8fn9+fHp7fH9/f4CAf39+f3+AgYKCgH17e3t7enl5fH1/gICAgICAf316e3x9fn59e3h5ent7enp7e3p8foCAf3x8fHx9fn5/gYF+e3dzc3d7fn1+fn5/f314dXR4fICAgICAgYB8eniEhIKBgYGBgYGAf39+fn5+f39/f35+fn59fX5+fXx8fH19fX19fX19fX18fHx8fX19fX19fX1+fn19fn5+fn9/fn5+fn9/f31+fn5+gIKFh4SBfX5+fn+AgoSGhoaGhIF8eXh3d3d2d3d3d3d4eHl5enp7e3t7e3t7e3t7enp6enp6enp5eXl5fH5/gYGCgoKBgYGBgIGCgoKDhIaFhoWEgYGAf4B/fn6BgYGBgH98e3l6foGBgH18e3p6enh5eXh8e3Zydnt/gICAgICAgoWFhISEgoB/fX1/gH99e3t8f4CAgIB/f3+AgIGBgoKAfnx9fXt5eXp7fn9/gICAgIB+e3p8fX5+fn17eHl6e3t6ent7enx+gIF/e3t8fX18fn6BgX98d3N0eHt9fnx8fH9/fHd1dHl9f3+AgICAf359fYODgoGBgYGBgIB/f35+fn5+fn5+fn5+fn19fn59fHx8fX19fX19fX19fXx8fHx9fX19fX19fX5+fX1+fn5+fn5+fn5+f39/fX5+fn6AgoSGhoN/fn9/gIGDhIaGhoWCf3t4d3Z3d3d3d3d3d3h4eXl6ent7e3t7e3t7e3t6enp6enp6enl5enx9gIGBgoKCgoGBgYGAgYKCg4OEhYWGhYOAgIB/gH9+gIOCgYGBgH59fHx/gYGAfXx7enp6eHh3eXl4c3J2e35/gICAgICChISDg4OBgH99fYCAf317e3x/gICAgH9/gICAgYGCgoB9e3x8e3l5ent+f3+AgICAgH57fH19fn5+fXt4eXp7e3p6e3t6fH6Af317e3x9fnx+foGBgH14dHR4fH1+fHx8f398d3V0eX5/f4CAgIB/f39/g4OCgYGBgYGAgH9/f39/f39/f39+fn5+fX1+fn18fHx9fX19fX19fX19fX19fX19fX19fX19fn59fX5+fX1+fn5+fn5/f399fn5+fn+Bg4WGg4B/gICBgYSFhoaFg398enh3dnd3d3d3d3d3eHh5eXp6e3t7e3t7e3t7e3p6enp6enp6eXt7fn6AgoKCgoKCgoGBgICBgoKDg4OEhYaFg4CAgH+AgICCgoKBg4OCgH9+fX6AgYB9fHt6enp7e3x9enhzc3Z7fX6AgICAgIKEhIODg4GAf319gIB/fXt7fH+AgICAf3+AgICBgYKCgH17e3t7enl6e35/f4CAgICAfn19fn5+fn59e3h5ent7enp7e3p8foB/fXt7fH1+fH5+gYGAfXd0dHh8fX58fHx/f3x3dXV5fn+AgICAgH9/f3+CgoKBgYGBgYCAf39/gICAf39/f35+fn59fX5+fXx8fH19fX1+fn5+fX1+fn5+fX19fX19fX1+fn19fn59fX19fn5+fn9/f31+fn5+foCDhYWCf3+AgYKDg4WGhoSBfnx5d3Z2d3d3d3d3d3d4eHl5enp7e3t7e3t7e3t7enp6enp6enp6fH1+gIGCg4KCgoKCgYCAgIGCgoODg4SEhoWDf3+Af4CBgoSCgoGCgoKCgX9+fX+BgH18e3p6ent7fH17eHV2dnt9foCAgICAgoODgoKCgIB/fX2AgH99e3t9foCAgIB/f4CAgIGBgoKAfHp7e3t6eXp7fn9/gICAgIB+fX1/f35+fn17eHl6e3t6ent7enx+gIB+e3t8fX59fn6BgYB9d3R0eXx9fnx8fH9/fHd1dXp+gIGAgICAf3+AgIKCgoCAgICAf39+f4CBgYGAf39/f39/f35+fX19fXx8fn5+fn5+fn59fX5+fX19fX19fX19fX5+fX19fX5+fn5+fn5+f39/fn9/f39/gYOFhoWDgoKDg4SFhYeHhIF8eXh1dnZ2dnd3d3d3d3h4eXl6ent7fHx7e3t7e3t7e3t7enp6e3t9f4CBgYODg4OCgoKBf39/gIGCg4ODhISEg4GAgH9+gICBgoSCgYGCgYGBgH9+f4CBfn18e3t7enl8fXx4dnV3e35/gICAgICAgoKCgoCAgH59fH9/f3x7e31+f3+AgH9/f4CAgIKDg4F9e3t7enp5enx+gICAgICAf35+fn9/f39+fXl4eHl7e3t7enp7fH+BgH57e3x+fn19f4KCgHx3dHZ6fH59fX19fn98d3R2e3+Af4CAgIB/gIF/goKCgICAgIB/f35/gIGCg4GAgICAgICAfn5+fn19fX1+fn5+fn5+fn19fX19fX19fX19fX19fn59fX19fn5+fn5+fn5/f39/f39/f3+BgoSGhoWDhISFhoeFhoaDgX15eHZ2dnZ2d3d3d3d3eHh5eXp6e3t8fHt7e3t8fHt7e3t6enp9fX+BgYKCg4ODg4KCgYB+fn+AgYKCgoKDhISCgYCAf35/fn+AgoKAgYKBgYGBgH9/f4F/fnx7e3t5eHl6e3Z0dXl8fn+AgICAgICBgYGBgIB/fXx8f39+fHt7fX5/f39/f39/gICAgYOCgH18e3t6enl7fX6AgICAgIB/fn9/f39/f318eXh4eXp6e3t7e3x8foB/fXt7fH5+fX1/goKBfHd0dXl8fn19fX1+f3x3dHZ7f4B/gICAgH+AgX+CgoKAgICAgH9/foCAgYWFg4KBgYGBgIB/f39/fX1+fn5+fn5+fn5+fn59fX19fX19fX19fX1+fn19fX1+fn5+fn5+fn9/f39/f39/f4GBg4aGhYSEhYeGiIaFhYKAfnp3d3Z2dnZ3d3d3d3d4eHl5enp7e3x8fHx8fH5+fX19fX19fH5/gYKCgoKCg4ODgoKBf35+f4CAgYGBgYKDg4KBgYGAf39+fn+BgYCAgYCBgYGAf39+gIB/fHt7e3l5enp7dXN1e35+f4CAgICAgIGBgYGAgH17e31/f317e3t9fn9/f39/f3+AgICAgoKAfXx8e3p6eXt9foCAgICAgIB/gICAgH5+fHt5eHh5enp7e3x8fHx+gH99e3t8fn59fYCCgoF8dnR1enx+fX19fX5/fHh1dnt/gH+AgICAgIGBf4KCgoCAgICAf35/gIGCh4iFhIODg4OAgICAf399fX5+fn5+fn5+fn5+fn19fX19fX19fX19fX5+fX19fX5+fn5+fn5+f39/f39/f39/gYGDhoaFhYaGiIiIh4WFgn98eXZ2dnZ2dnd3d3d3d3h4eXl6ent7fHx9fX19fX1/f39/f39+gICCg4OCg4OEg4OCgoB+fX1/gH+BgYGBgoOCgoKCgoGAf31+foCAgH+AgIGBgYB/f35/gX97e3t7e3l5ent2dXh6fX5/gICAgICAgICAgICAfHp6fX9/fXp7fH5/f39+fn9/f4CAgICBgX99fHx8enp5e31+gICAgICAgX+BgYCAfX18e3l4eHl5eXt7fHx8fH5/fnx7e3x+fn19gIKCgXx2dHV6fH59fX19fn99eHV4en+Af4CAgICAgoF/gYGAgICAgICAf3+AgYSIiYeGhISCgoKCgICAgH5+fn5+fn5+fn5+fn19fX19fX19fX18fH19fX5+fH5+fn5+fn9/f39+fn5+f39+fn5/gIOGhoaGh4iIiIeGhIKAfXp3dXV1dXV2dnZ3d3h5eXl5eXt7e3t9fX19fn59fn9/f3+AgIGBg4ODg4SEhISDgYKBfn17fX9/gIKCgoKCgoGAgYGBgH9+fn5/fn+AgICAgICBgYB+f36BgX57ent6enl5e3Z2ent9fn+AgH9/gICAgIGAgH16enl9fn59e3t9fn9/f39/f3+AgICAgIGBf318e3t6ent8fn+AgICAf4CBgICBgYF+fHx7enl5eXl6e3x8fHt8f4B/fXx8fH5+fX2Ag4OBe3d1dXp9fX19fn1/gH55dnh7fn5/fn6Af4CCgX2BgYCAgICAgIB/f4CBhIiJioiHh4aGhYWDg4CBf35+f35+fn5+fn5+fX19fX19fX19fXx8fX19fn58fn5+fn5+f39/f35+fn5/f35+f3+Ag4aGhoaHiIiIh4aEgn97eHV1dXV1dXZ2d3l7enp6eXl5e317fX9/gIGCgoKDg4ODg4ODhISFhYSEhISEhIOBgoF/fXx9f3+AgoKCgoKBf3+AgoKBgH5+fn9+f4CAgICAgICAf35/foCCgX16e3t7eXl6d3d7e31+f4CAf39/f4CAgoOCfXp5eX1/fn17en1+f39/f39/f4CAgICAgYF/fXx7e3p6e3x+gICAgICAgYGBg4OCgX58e3p7eXl5eXp7fHx8e3x/gH99fHx8fn59fYCDg4F7dnV2e319fX1+foCBfnl3eXx+fn9+fn+AgYOBfYGBgICAgICAgH9/gIGEiImIh4iIiIiHh4WFgoF/fn1+fn5+fn5+fn59fX19fX19fX19fHx9fXx9fX5+fn5+fn5/f39/fn5+fn5+fn6AgICDhoaGhoeIiIiHhoSCf3l2dHR0dHR1dnZ5fX9+fXx6enp8fn6AgIKCg4SEhYaHh4eHh4eHh4eHh4eFhYWFhIKBgH58fX6AgICCgoKCgoF+fn+CgoGAfn5+f39/gYGBgICAgICAf39+f4GDgX17e3t7eXp4eXx8fX5/gIB/f39/gIGDhIJ+e3p5foB+fHp6fX5/f39/f39/gICAgICBgX99fHt7enp6fH6AgICAgIGCgoKDg4KBfnt7ent5eXl5ent8fHx7fH+AgH58fHx+fn19gIODgXt1dHh8fX19fX5+gIF+eXh5fH5+f35+foCCg4J8gYGAgICAgICAf3+AgYSGh4eGiIiIiImIhoaEgYB/fX1+fn5+fn5+fn19fX1+fn5+fX18fH19e318fn5+fn5+fn9/f39+fn5+fX1+foCAgIOGhoaGh4iIiIeGhIJ+eXRzdHRzc3V2eHyBg4OBfnx7fH1/gYODhYaHiIiHiImJiYmIiImJiYmIiIeHh4eEg4GAf31+f4CBgIKCgoKBgH1+foKDgoF+fn5/f3+CgoGBgICAgIB/f35/gYODf3p7fHx7eXt7fX1+fn+AgH9/f3+AgoWFg4B8enx+f357eXt9fn9/f39/f3+AgICAgIGBf318e3t6enp8foCAgICAg4SDg4ODgoB9e3p5e3l5eXl6e3x8fHt8f4CAfnx8fH5+fX2Ag4OBe3V0eHx9fX19fn6AgX55eHl8fn5/fn5+gYOEg3yBgYCAgICAgH9/f4CAgYSFhoeIiImJiYqJiYaDgH5+fX99fn5+fX5+fn5+fn19fX19fXx8fHx8fX19fn5+fn5+f39/f35+fn5+fn9/gICAgoOEhYWFhoeHh4WEgn14dHN0c3Jyc3Z7gYeIh4WBf39/goSDhoeIiYqLi4qKi4uJiYiIiYmJiYiIiIiIiIWEgYB+fX+AgICBgYKBgoGAfn59goGBgH9+fn+AgICCg4GAf4B/f39/fn+AgoOBfXp7e3t6ent7fX1+f4GBgICAgIGDhoWDgH5+f4B/f3t6en1+f39/f3+AgICAgICAgYF/fXx8ent5e31+gICAgICChIODg4OCf3t6e3p5eXh6eHp8fHx8e31+gH9+fHx9fX59fYCCg4B6dXV5e319fX19foGCf3p5e3x9fn9/f3+AhIWEfIGBgICAgICAf39/gICAg4SDhYeHiIiIioqKiIaCf359f31+fn59fn5+fn5+fX19fX19fHx8fH19fX1+fn5+fn5/f39/fn5+fn5+f3+AgIGBgoOFhYWGh4eGhYSCfXh1c3Rzc3N1eX+FiImJh4OAgYKFhoaIioqKioqKioqJiYmJiIiIiIiIh4eIiIiIhoSCgYB/gICAgIGBgoGChYiEgX+BgYGAf35+f4CAgIKDgYB/gH9/f39+f4CBgYF/ent8fXl5eXt9fX+AgYGBgYKCgoKCg4J/f4CAgH9+e3p6fX5/f39/f4CAgICAgICBgX99fHx6e3p7fX6AgICAgIKEg4ODg4J+fHt7enl5eHp4enx8fHx7fH2Af358fH19fn19gIKDgHpzdXp8fX19fX1+gYJ/e3l7fH1+f39/f4CDhIR8gYGAgICAgIB/f3+AgICBgoGChYWGhoeJiYmKiIWBgH9/fX5+fn1+fn5+fn59fX19fX18fHx8fX19fX5+fn5+fn9/f39+fn5+fn5/f4CAgYCBgoODg4SFhYWGhISBfHl2dHN0dHd7goeHiYiGhoOEhoeIiImJiYmJiYmJiYeHiIiHh4eHh4eGhoeHh4eGhYWFg4KCgICAgYGCg4SIi4mDgICBgYB/f35/gIB/gYKAgH+Af39/gH+Af3+AgIB8fn9/enh6fX1+gIGBgYGBg4KBgIGCgoCAf39/f357enp9fn9/f39/gICAgICAgIGBf318fHp7ent9fn+AgICAgoSDg4OCgH17ent6eXl4enh6fHx8fHp7fH9/fnx8fX1+fX2Ag4SAenR2enx9fX19fX6Bgn97eXt8fX5/f39/gIKDhHyBgYCAgICAgH9/f4CAgH+AgYKDg4SEhoeJiYiJiIOBgH99fn5+fX5+fn5+fn19fX19fXx8fHx9fX19fn5+fn5+f39/f35+fn5+fn9/gICAf4GCgoKCg4SEhIWFhIOAfHhzc3R0eX6DhoiJiIeGhYaHiYqJiYqJiYaHh4eHhoaGhoWFhoaGhoWFh4eHh4aHhoaEhISCgICBgYKDh4mLi4WBgICAgH9/f3+AgH+BgoCBf4B/f3+BgIB/fX5/gX5/gYJ8eX1/fX+BgYGBgYGDg4GAgYGBgIB/f4B/fnt6en5+f39/f3+AgICAgICAgYF/fXx8ent6e31+f4CAgICChIODgoGAfXt6e3p5eXh6eHp8fHx8ent8fn9+fHx9fX59fYCDhYB6dXd6fH19fX19foGCf3t5e3x9fn9/f3+AgoOEe4CAf39/f39/f39/f39/f39/gIGBgYGDhYeHiImJh4aCgX9+f35+fXx+fnx+fn58fHx8fHx8fHx9fX1+fn5+fn5/f39/fn5+fn9/fn5+fn9/gICAgYGCgYKEhoaFhIWCfnh1dXZ6gISHiIiGhoWFh4iIiIiIiIeHhoWFhISDg4SEhISFhYWFhISFhYeHh4eHh4aGhoWCgICChIaIh4iHh4J/f4B+fn5+foCAgIGBgX9/gYCAgICBf35+fn+AgH+AgX17fH19f4KDgoCAgoKDgYCAgIGAgYGBgYB/e3p7fn5+f39/f4CAgICAgICBgH99fHp6e3t8fn+AgH9/gIOEhISAgH9/fXx6enp5eXl5ent7e3t6enx9f399e3x8e3x7foGDf3l0dnp8fX19fX1/goKAfHp8fX5+fn19foCBg4J7gIB/f39/f39/f39/f39/f39/f3+AgIGChIaHiIqJh4SDgYCAfn59fH19fH5+fnx8fHx8fHx8fH19fX5+fn5+fn9/f39+fn5+f39+fn5+f3+AgH+Af4CAgYOFhYWGhoaDfnl4eX2ChYeIiIaGhISGiIiIh4eGhYSEhISEhIODg4ODg4ODg4ODg4ODhISFhYWFhoaGhoSAgIKFh4eEhIWGgX9/gH5+fn5+gICAgIKBgH+AgH9/gIF/fn1+foCAfn5/fXx9foCAgoKAfn6CgoOBgICAgYCAgYGBgX97enx+fn5/f39/gICAgICAgIGAf318enp7e31/gICAf3+AgYKDgoCAf39+fXp6enl5eXl6e3t7e3p6fH1/f317fHx7fHt+gYN/eXR2enx9fX19foGCgoB9e319fn5+fX1+f4GCgXyAgH9/f39/f39/f39/f39/f39+fn9/f4CCg4WIioqIhoOCgX99fX18fHx8fn5+fHx8fHx8fHx8fX19fn5+fn5+f39/f35+fn5/f35+fn5/f4CAfn59fX9/goOEhIWFhYWBfn19gISGh4aGhYWDhIWGhoaEhIWDg4ODg4ODhISDg4ODg4ODg4SEhISEhISEhISEhIaGhYKDhYaGhYKDhIOAf3+Afn5+fn5/gICAgYGAgH5+f3+AgH59fH5+gH99fX99fX1/f4GBgH58fYCCg4GAgICBgH+AgICAfnt6fH5+fn9/f3+AgICAgICAgYB/fXx6eXp7fX+AgIB/f4CBgoKAf39/f359enp6eXl5eXp7e3t7enp8fX5+fXt8fHt8e36Bg395dHZ6fH19fX1+gYODgH57fX1+fn59fX1+gIGAfYCAf39/f39/f39/f39/f39/f35+f399f4CBg4iJiYiHhoSDgH59fXx8fHx+fn58fHx8fHx8fHx9fX1+fn5+fn5/f39/fn5+fn9/fn5+fn9/gIB+fHx9fX6BgoSEhISFhYSDgYCBhYaGhYWEhIOEhISEhISEg4KCgoGBgYGBgYKCgoKBgYGBgoKDg4SEhISEhISEhoaEg4WHh4WDgIGBg4B/f4B+fn5+fn+AgICBgICAf39+foCAfnx8fH1/f318gH59fX5/gH9/fnx8f4KDgYGAgICAf3+AgIB+e3p8fn5+f39/f4CAgICAgICBgH99fHp5e3x9f4CAgH9/gICAgX9+fn9/fn16enp5eXl5ent7e3t6enx9fX19e3x8e3x7foGDf3l0dnp8fX19fX6ChISBf3t8fX5+fn19fX6AgYB9gIB/f39/f39/f39/f39/f39/f39/f35+f3+BhoeIiIiIhoSDgH59fX19fX19fXx8fHx8fHx8fHx9fX5+fn5+fn9/f39/f35+fn5/f35+fn5+fnx8fX1+f4GBgYKDhYWHh4WDg4SEhoWEhISCgoODg4OCgoKBgYGBf39+gICAgYGBgIGBgICBgoKCg4OChISEhISEhIOEhYaEgoB8foGEgX9/gH5/f359gH6AgoGBgn+AgH5+gIB/fX18e319fHx/gYCAf39/f39+f3+AgoGBgoCAgICAgIF/fn16en1+fn5/f35+gICAgICAgYGAf319fXx8fX5/gICAgICAgIB/fn1+fn5+fXp6enp5eXp6e3t7e3t7ent+fnx8fHx7fHx9gYOAenR2enx8fHx8foCEhIB+fH1+f35+fXt7fH5/f36AgH9/f39/f39/f39/f39/f39/f39/fn5+foCEhYaIiYqIh4WCf319fX19fX19fHx8fHx8fHx8fH19fn5+fn5+f39/f39/f39/f39/fn5+fn5+fHx9fX+Af39/gIGDhIWGh4WFhoaFhISEhIKDgoKCgoCAgH9/fn58fX5/gYGBgYKAf3+AgICAgICBgYKDg4ODg4KCg4ODg4GAf3p6foSCgICAfn5+fn5+fH6BgoODgICAfn5/f39+fXt7fHx8fH6BgH9/gH+AgoSEg4KCgYGCgICAf4CAgX9+fXp7fn5+fn9/f3+AgICAgICBgYB/fX5/fXx9fn+AgICAgICAgH19fH5+fn59enp6enl5enp7e3t7e3t6e319fHx8fHt8fH2Bg4B6dHZ6fHx8fHx+gIODgH9+fn9/fn59e3p8fX9/f4CAf39/f39/f39/f39/f39/f39/f39+fn5+f4KChIaIiImJh4R/fX19fX19fX18fHx8fHx8fHx8fX1+fn5+fn5/f39/gIB/f39/f39+fn5+fn5+fn5/gIB+fn59f4GChIWGhYWGhYWEhISEgoKBgYGAf3x8fHx8fHx+f4CCgoKCg4GAgIGBf319fX9/gIGDg4KCgYGCgYKAgIB/fHp9hISBgYB+fX19f316e4KEhIOAgIB/f4CAgH9+fHx8fH1+f39/fX6AgICAhIWFhIKCgYF/f4F/gICAf318ent+fn5+f3+AgIGBgYGAgICAgH9/f4CAfn5+f4CAgICAgIF/fHx7fX5+fn16enp6eXl6ent7e3t7e3p7fX18fHx8e3x8fYGDgHp0dnp8fHx8fH6AgoKAf35+f39+fn17ent8fn5+gIB/f39/f39/f39/f39/f39/f39/f35+fX1/gICDhYaHiYqIhYB9fH19fX19fXx8fHx8fHx8fHx9fX5+fn5+fn9/f3+BgYCAgIB/f35+fn5+fn5+gIB/f35+fn1+gYODhIWFhYaFhIOEhISCgYCAgH59e3t6enx8fX5/gYODgoKEgoGBgYF+e3t7fn5+gIGBgoKBgYKBgoF/gIB+enyEhYGBgH59fX2AfXl7gYaHg4GAgH9+f4CCgX99fH1+f4B/fX19fYB/f36BhISDhIOBgIB/gICAgH9+fHt6e35+fn5/f4CAgoKCgoCAgICAf4CAgYGAf35/gICAgICAgH58fHt8fn5+fXp6enp5eXp6e3t7e3t7ent8fHx8fHx7fHx9gYOAenR2enx8fHx8foCCgoB/fn5/f35+fXt5enx9fX2BgX9/f39/f4CAgIB/f39/f39/f39/fn5+fn19gIGDhIaJiYmFgX57fHx8fHx7e3t7e3p6fHx8fHx8fX1+fn5+f39/f4GCgICAgH9+fX1+f35+gICAgICAgIB/fn+Dg4OEhIWFhoaEhIODhIJ/f3x7enl5eXl6fH1/gIKChISDg4SEgoKBgH17e3t7fX1+gYKBgoODgoKAf32BgH59foSGgYB/fXx+gIOCfX6BhYSBgIGAgH9/f4B/fn59fn9/f316enx9fn5/foCCgoKCgoGAgIB/gICAf399e3t8f4B/f4CAgICAgIGAgIB/gYGAgYGCgoGAf4CAgICAgIB+fXt7fHx+fnx7enl6enl5eXt7e3t7e3t5eXt7fHx8fHt8fH2Agn96dXd7fHx8e31+gIKBf35/f39+fn5+fHp4ent9foCAf39/f39/f3+AgH9/f39/f39/f39+fn5+fX1/gIGDhYiJiYaBfXt8fHx8e3t7e3t7e3t7e3t7fHx9fX5+fn5/f39/goOCgoKAgH59fX5/f3+CgoGBgICCgYGAgIODg4SEhISEhIODg4OEgn57eXl4eHl5enx9f4CCg4OEhIWFhYWEhIGAfnx8fHt8fX5/gIGDhISCgX9+f4KAgYSFhoaCf3x6e36Cg4N/fn+BgYCAgYGAf39/gH9+fX5/fn59fXp7e319f4GAgYODg4OCgX9/f35/gICAgH57e3x+f4CAgIGAgICAgH59fX6BgYGCgoKBgYF/gICAgICAgH59e3t9fX59fHt6eXl5eXl5e3t7e3t6enl5enp7e3t7e3x8fYCCf3p1d3t8fHx7fX6AgoGAf39/f35+fn58enh5e31+f39/f39/f39/f4CAf39/f39/f39/f35+fn59fX1+f4GEh4mJhoF8ent7fHx7e3t6enp7e3t7e3t8fHx9fn5+fn9/gICDhIWFhYKBf35+f4CBgYKCgoKCgoSDg4ODhIODhISEhIODg4ODg4OBfnt6eXh4e3t8fn6AgYODhISEhYWFhYSEgoF/fn19fHx9fn+BgoWEhIJ/fn6BgoKEgoCAgIF/e3h6fYGAgIB+fX5+fn+BgYB+gIGBgH9+fn5+fn19e3t8fXx/gYKDg4OEg4KBf39/fn+AgIGBf3x7fH5/f4CBgX9/f4B/fX59foCBgYKCgoGBgX+AgICAgICAfn17e359fX18e3p5eHh5eXl7e3t6enl5eXl6ent7e3t7fHx9gIJ/enZ4e3x8fHt9foCCgYGAf39/fn5+f316eHh6fH1/f39/f39/f35+gIB/f39/f39/f39/fn5+fn19fH19f4OGiYmGgXx6enp8fHt7e3p6ent7e3t7e3t8fH1+fn5+f3+BgYOEh4eHg4KAfn6AgYKCgoKDg4SEhoWFhYSEg4OEhIODgoKCgoKDgoB/fX18e3t7fHx9f4GCg4SEhISEhISEg4OCgH5+f35+fX5/gISFhoSDgH59foKBg4N/f35+gH99fHx8gH9/f359fn5+f4CAgH+BgoOCf39+fn59fX18fXx9fH5/gYGCgoKCgoF/f39+f4CAgIB/fXt8fX5+f4GBgH9/f357fn5/gYGBgoKBgYGAf4CAgICAgIB+fXt7fn59fXx7enl4eHl5eXt7e3l5eXl5eXl5e3t7e3t8fH2Agn96d3l7fHx8e31+gIKBgYB/f39/fn5/fXp4eHl7fX9/fn5/f35+f39/f39/f39/f39/f35+fn5+fn59fX19gIWIiIZ/enl6enx8e3t7enp6enp7e3t7e3x8fH19fn5/f3+BhIWJiIiHg4GAgIGCg4OEhISEhISGhYaGhYaEg4SEg4KBgYCAgIOCgYGAgYB/fX18fH6AgYOCg4OEhISEhIODgoF/f35+fn5+gIGBhIaFgn99f4CAgYGBgH9+fn59f4ODgX19f35/f35+fX9+f35+fX+BgoB/f39/fX5/fn5/fH1+fn6AgYGBgoKCgYB/f39/gICAgH99ent8fX9/gIGCgH9+fXx/f4CBgoKCgIGBgYCAgICAgICAgH59fHx/f359fHt6eHd3d3l6ent7enp6enl5enp7e3t7fHt7fH6Afnp3eXt9fHx7fX6AgoGAf39/f39+fn99e3h2eHt8f39+fn9/fn5/f39/f39/f39/f39/fn5+fn58fH19fX2AhYiIh4B6eXp6fHx7e3t6enp6ent7e3t7e3x8fX1+fn9/f4KEh4qKiomEg4GBg4KDg4SEhYSEhIaGhoWFhoSDhISCgYCAf39/gYGCgoODgoOAfn19f4GCg4ODhISEhISEg4OCf35+fn5+f4CBgoOFhIOAfn2Bg4N/foF/f359fXp9g4OBfXt9fn59fH18fXx7fHx9fX+AgIB/fn58fH18fX1+fn5+fn+AgICBgoKBgH9/f3+AgICAf316e31+f36AgYKBgH9+foCAgYGDg4KAgICAgICAgICAgICAfn19fYB/f318e3p4d3d3eXp6e3t6enp6eXl6ent7e3t8e3t8foB+end5e318fHt9foCCgYB/f39/f35+f317eHZ4e3x/f35+f39+fn9/f39/f39/f39/f39+fn59fXx8fX19fYCFiImIgXt5enp8fHt7e3p6enp6enp6ent7fHx9fX5+f3+AgoWIioqJiIWEg4OEhISEhISFhoaFhoaFhISFhIODg4B/fnx7e36BgYKDhYWGhYN/fn6AgYODg4ODhISEhISDgoF/fn5+fn9/gYKDhISCgH59f4GBgX5+f35/f359d3p/f4B9e35+fHx9fnx8e3p7e3t9f39/f359fX18e3t6e319fX5+f39/f4GCgYF/fn5+fn9/f4B/fXp7fn9+foCAgYF/fn+AgICBgoODgoCAf4CAgICAgICAgIB+fX5+gICAfnx7enh3d3d5enp7e3p6enp5eXp6e3t7e3x7e3x+gH56eHp7fXx8e31+gIKBgH9/f39/f35/fXt4d3l8fX9/fn5/f35+f39/f39/f39/f39/f35+fnx8fHx9fX19gIWJiYiBe3l6enx8e3t6enp6enp6enp6ent7fH19fn5/f4CDhYmJioiGiIWEhIODhISGhoaGhoaHh4WEhIWEg4KCgH59eXh4fIGBgoOFhYeIhIGAf4GBgoSEhISEhISEhIOCgH9+fn5/f3+Bg4SEhIB/fX2AgX5/fn9/fn9/f312eH1+fn9/gH17fX19e3x7e3p7fH9/gICAfn1+fXx7eXl6fHx8fX5+f3+AgYKBgYB/f39/gICAgX99ent+gH5+f4CAf319gICAgIGCg4OCgH9+gICAgICAgICAgH59fn6AgIB+fHt6eHd3d3l6ent7enp6enl5enp8fHx8fHt7fH6Afnp5e3t9fHx7fX6AgoGAf39/f39/fn99e3h4eXx+f39+fn1/fn5/f39/f39/f39/fn5+fn5+fX18fHx8fX2BhImKiYJ7eXp7e3t7e3t7e3t5eXp6eXl6e3x9fHx+fn9/gIOGh4mIiIaGh4iIhoaHh4aGhYWEhIaFhIWFhYWEg4B+fXt4dnV6f4KDg4OFh4iHhYOCgYGChISEhIODhYSCgoCAfn5/f3+AgYKDhISBfXt4en1+fX18fn5+gIF9d3R3fH6AgYB9e319fHp7enp6e3t7fX5/f39+fX57e3t5eXl5eHp8fX19foCBg4KAf35+fn+AgIGBf3p7fH+BgYCAgX9/fn6BgIGBgoKEhIOAfX1+f4CAgICAgICAfXx8foCAf399e3l4eHh4eHp7fHx6enp4eXl5eXt7enx8fHx8fn98eXh7fHx7e3t9foCBgYB/f39/f39/f316d3h6fX9/f35+fX9+fn9/f39/f39/f39+fn5+fn59fXx8fHx9fYKFioyIgXt5ent7e3t7enp6enp6eXl6enp7e3x8fH5+f3+Ag4WFiIeGh4aIiYmIiIiIhoaFhYSFhoWEhYWFg4KBf3t4dnRzdXp/goOCgoSFh4eGhYSDg4OEhISEg4OEg4KCgIB/f4CAgIGDhISFhIB8d3V2ent7ent9fnt8fXt1dHl9fX9+fnt8fH18e3x7enp7fHx8fn9+fHx8e3l6eXt5enh3enx9fX19fn+Dg4B/fn5+f4CAgYF/enp9foCCgoKCf3+AgIKAgIGBg4SDgX98fX1+gICAgICAgIB9fHx+gIB/f317eXh4eHh4ent7e3p6enh5eXl5e3t7fH19fHx+fnx5eHt8fHt7e31/gYGBgH9/f39/f39/fXp3eHt+f39/fn5+f35+f39/f39/f39/f35+fn5+fn19fHx8fH19gYSJi4iBe3l6e3t7e3t6enp6eXl6enl5ent6e3x8fn5/f4CDhYWFhYOFhoiJiYiIh4eHh4aGhoeGhYSFhYWCgX97eHVzcnJ1en+Cg4KBg4SGhoaGhYWEhISEhISDg4KBgYGAgICAgICBgoSEhYWEgHt0cnR4eHd4eXp/enZ5enh5fHx8fHp7enx7fHx8fHp6enl6fHx8fn17enx7eXl5e3p6eHh7fH1+fn1+f4KCgH9+fn5/gICBgX96en1+gIODhIOAgICBgYCBgIGCg4KAfnt7fH6AgICAgICAgH18fH6AgH9/fXt5eHh4eHh6e3t7enp6eHl5eXl7e3x9fX18fH19fHl5fHx7e3t7fX+BgYGAf39/f39/f399end4e31/f39+fn6Afn5/f39/f39/f39/fn5+fn5+fX18fHx8fX1/goeJiYF7eXp6e3t7e3l5eXl6enp6enp6e3p7fHx+fn9/gIOEhIWDgoWGiImJiYmIiIiIhoaHh4aGhIWFhIKAfXd0cnFxcXV6f4KDgoCCgoWGhoaGhYSEhISEhIODgYCAgICAgICAgIKDhIaFhoN+eXRzc3Z2dnd4en58dXR4fn5/e3p5eXh7fXp7e3p6enl5eXl6enx9fHx7e3t5eXp8e3t6en1/fn5/f31+goKAf35+fn+AgIGBf3p6fX6BhIWFg4KAgIGBgICAgYKCgX99enp8fYCAgICAgICAfXx8foCAf399e3l4eHh4eHp7enp6enp4eXl5eXt7fH19fXx8fX18eXl8fHt7e3t9gIKBgYB/f39/f39/f316d3h7fX9+fn9/f39+fn9/f39/f39/f39+fn5+f399fXx8fHx9fX+AhYmJg357e3t7enp6eXl5eXp6enp6enp5ent7fHx9fn+AgYOEhIKDhIeHiIiIiYiIh4aHhoeIhoaGhoWDgn94dHBwcXFxdXqAg4SBfoCBhIaFhYaGhISFhYWEg4KAgH+BgYGBgYKCg4SFhYWFgnx3dHN0dnV0dXZ5f356d3h/g4B7eHh3eXp8e3t6eHl6eHd5eXh4enx8fH17e3p7fH59fXx9fn9+fX5/fn+BgICAf39/f4CAgIB+enp9gYODg4OBgICBgICAgIKBhIOAfXx7e31+gICBgYCAf358e31+f3+AgH17eXl5eXl5eXp6enl5enp5eXh6e3x8fX17enp9fXt5ent8ent7e32AgYKAgIB/f39/fn5/fXp3eHt+fn5+f39/f39+f39/f39/f39/f35+fn5+fn19fHx8fH19foCFiImFgH18fHt6enp5eXl5enp6enp6enl6e3t8fH1+f4CAgoOEgYOEhoaGhoaIiYmIh4iHiIiHhoaFg4KAfHVycXFycnJ2eYCDhIB9fX+Cg4SFhoaFhYWFhYOCgYCAgIGBgYODhISEhYWFhYWAe3Z1dHV2dXNzdXl9fn15eX2CgH14d3Z4e3x7e3l4enp7ent6eHh5fHx7fHx7e3t9f359fX9+f35+f39/gIGAf39/f39/gH9/f4B9f4GDg4OBgH5/gIGAf3+AgoGDgoB9fHt7fYCAgIGBgIB/fn18fX5/f35+fXt5eXl5eXl5enp6eXl5eXl5eHp7fHx9fXt6e319e3p6e3x7e3t7fYCBgoB/f39/f39+fn99end4e35+fn5/f39/f39/f39/f39/f39/fn5+fn5+fX18fHx8fX19f4SHiIWCfn18fHt6enl5eXl6enp6enp5eHl6e3x8fX5/gICCg4KCg4SFhYWFhIaIiIeIh4aHh4aFhIOBgH13c3JxcXJyc3Z4f4OEgX17fX+Bg4SFhYWFhYWEgoGAgYGBg4ODhISFhYWGhYSGhH55d3Z0dXZ2dHN0d3x9fHx6fX59e3l3dnh6fHt6eHd6e319fXx6enl8fHx9fHx7fH1/f35+fn5+fX1/gICBgYB+fn5+f3+Af39+f3+ChISEg4F/fn5/gYB+fX+BgoOCf3x8e3x9gICAgYGAgH9+fn19fn9/fX19e3l5eXl5eXl6enp5eXh4eXl4ent8fH19e3t7fHx7ent8fHt7e3t9gIGBf35+f39/f35+f316d3h6fn5+fn9/f39/f39/f39/f39/f39+fn5+fX19fXx8fHx9fX1/g4eHhoOAfn19e3p6eXl5eXp6enp6enh4eXl7fHx9fn+AgIGCgYKDhIWFhISEhYeHhoiHhoaGhYSEg4B/enRycnJyc3NzdXh+g4SCfXt7fX+Bg4SEhISFhYOCgYCCgoKDg4OFhYWFhYaFhIWDfXp3eHR1dXZ1dHV3enx8fHx+fn16e3h2eHl7e3l2dnl8fnx+fnt7e317ent7fHx8fX5+fn59fn59fX+AgYGBgH5+fX1/f4CAgH+AgIKDhIOCgX9+fn+Bf3x5fYCCg4J/e3p8fH2AgICBgYCAf35+fX1+f39+fn17eXl5eXl5eXp6enl5eHh4eXh6e3x8fX18e3t7fHt6e3x8e3t7e32AgYF/fn5/f39/fn5/fXp3eHp+fn5+fn5/f39/f39/f35+f39/f35+fn19fX19fX18fHx8fH6BhYiGhYKAfnx7eXl5eXl5eXl5eXl5eXl6enp8fX1+foCAgICAgYODhISDg4SFh4eGh4eGhoaEg4OBf3x3c3Nzc3Nyc3R1eH6ChIJ/e3p8foCBgoOFhYaDgoKBgIKChYaFhYWFhYSFhYWFhYJ+enl5dnR1dnVzc3V5enx9gIF+e3t6eXZ2ent6eHZ0dnx+f39/fnp6fHp5enp7e319fn5+fn19fHt9fn6AgIF/f359fn+AgYGBgX9/gIGCgoKBf39/gIB8eXZ5gIKCgn97enp7foCAgICAgICAf35+fn59fX5+fHp4eHh4eHh6enp6eXl4eHd4eXp6e3t+fn18e3x8fHt6e3x6fHx7fYGBgX19fn9/gH59fX5+eXh4en5+fn5+fn9/f39/f39/fn5/f39/fn5+fX19fX19fXx8fHx8fn+DhoaGg4KAf315eXl5eXl5eXl5eXl5eXp6enx9fX5+f3+AgICBgoKCgoKChYaHh4eHhoWFhYSCgH98eHVyc3Nzc3JzdHV4fYKEgoB8enx+fn+BgoSEhYOCgoKCg4SGhoeHh4eGhIWFhYaEgn57e3p3dHV2c3JzdXd4fH+Dg397eXp3dXZ4eXh3dXNzdXl7fX19e3p6enl5e3x8fX1/fn19fHt7e3x+fn19gH9/f39/f4CBgYKCgICAf4CBgYF/gICCgHx1c3iBgoKCf3t6enx+gICAgICAgIB/fn5+fn19fX18enl5eHh4eHp6enp5eXh4d3h5enp7e35+fXt6fHx7e3p7fHp8e3t+gYGAfXx+f39/fn19fn55eHl7fn5+fn5+f39/f39/f39+fn9/f399fX19fX19fX19fHx8fHx9foGFhYWFhIOBf3t6eXl5eXl5eXl5eXl5enp6fH19fn5/f4CAgICBgYKCg4OGh4eHh4eFhISEgoB+e3h2dHN0dHR0c3R1dnh8gYSEgn57fH19fn+BgoKDhISEg4aHiImIh4eIiIeGhYSEhIOBfnt7eXd0dHVycXJ1dnl8gIODgHx5eHd2dHd5d3VzcXBxdHZ5e3x9fHt6eXl8fHx9fX9/fXx7fHt8fX9/fn5+fX6AgH9/f3+AgYKCgoGAgICAgH9/f4CBe3NyeYGCgoJ/e3p7fX6AgICAgICAgH9+fn5+fHx8fHx6eXl5eXp6e3t6enl5eHh3eHl6ent7fn59enl8e3t7e3x8enx7fH+BgX57e31/f359fX1+fnt5enx+fn5+fn5/f39/f39/f35+f39/f3x8fX19fHx8fHx8fHx8fH19f4KEhIaGhYOAfnt7e3l5eXl5eXl5eXl6enp8fX1+fn5+gICAgICAg4OFhYaIh4eHh4SDhIOAfnp4eHZ1dXV1dHRzdHV2eHyBhISDf319fX5+fX+BgYKFhISFiImKiomHh4iIh4aFhIODgYB8e3p5d3R0dXJyc3R2eX2Bg4KAfHl4d3V1dnZ1dHRxcXBydHd6e3x8fX18fH19fX5+f39+fXt8fX1+fn5+fn18foB/f35+fX6BgIGDgoCAgH+Af399gIF8dHJ5goKCgn97enx9foCAgICAgICAf35+fn57e3x8fHp6enp6enp8fHp6eXl4eHd4eXp6e3t+fn56eXt7e3p8fXx6fHt9gIGBfHl7fH9/fn19fX5+e3p7fH5+fn5+fn9/f39/f39/f39+fn9/fX19fX18fHx8fHx8fHx8fX1+gIODhYiHhYN/fXt6eXl5eXl5eXl5eXl6e3t8fn1+fn6AgICAgoOEhoeHiIiHhoWEhIOBgH56eHZ2d3d2dnZ1dXR1dnZ3fH+EhIOAf31+f39+f4KDhIaFh4qLjIyKiYmIiYmIhYOCgYGAgHx7enp3dHR2dHR0dnd5foCEgn97eXd2dHR0c3Jyc3JydHR0dXZ6e319fn59fX5/f3+Af358fH1+fn19fXx+fHx+fn9+fn9+fn9/gIGCgX+AgIB/fn2AgHxzc3uCg4OCf3t6fH1+gICAgICAgYCAf39+fnx7fHx8e3l5eXh5eXt7enl5eXl4d3h5enp7e35+fHt6e3t7e3t8e3t7fH5/gn97enx+fn5+fn19fn58ent9fn5+fn5+f39/f39/f39/f35+fn59fX19fHx8fHx8fHx8fHx9fX1+goKEh4eGhYJ/fHp5eXl5eXl5eXl5eXp7e3x9fX5+fn+AgIKEhYWIiYmJh4eFhIOCgX99fHh3dnd4eXh2dnV1dXV2dnd7f4OFg4J/fX6AgIGAgICChIOGiYuLi4eHiIiJiYiFgoCAf35+fXt7e3h2dnd1dHV3ent8foCAfXp5dXV0dHNwcG9xdXV1dnZ1dHh7fYCAgYB+fn+Af39+fXx9f39+fX19e319fX5+f35+f39/f35+f4GAgICAgYB+fH9/e3N1fIKEhIJ/fHt8fX6AgICAgICBgICAgH9/fHt8fHx7eXl5eHl5e3t6eXl5eXh3eHl6ent7fn58enl7ent7e3x7e3t9f4CCfnp6fX5+fn5+fX19fXt6fH1+fn5+fn5/f39/f39/f39/fn5+fn19fX18fHx8fHx8fHx8fH19fH2AgIKFhoaHhIB9e3l5eXl5eXl5eXl5ent7e3x9fn9/gIGEhYeIiImJiYiGhYSCgYB+fHp5d3V2d3l5eXd3dnZ2dnd3eHt/goSEg4B+foB/gH58fH+AgYKFh4eHhYWHh4eHhoaDf35+fX18e3x8enh3d3R1dHZ7fHl5fH18enh0c3V1c25sbXF3d3Z2d3Zzdnp+gYODgoB+f4CAfn18fH5/gH9+fn5+fn1+f39/fn9/f35+fX5/f4CAf4CAf3x6fH16dXd+goSEgn99fHx9foCAgICAgYKCgoGBgYF/fn19fXx5eXl4eXl7e3p5eXl5eHd4eXp6e3t+fnx6eXp6e3p7fHt7e31/gIF+eHl8fX5+f399fX19enl9fn5+fn5+fn9/f39/f39/f39+fn19fX19fHx8fHx8fHx8fHx9fXx9fX5+gISFh4iEgn57eXl5eXl5eXl5eXl6e3t7fH1+f3+BgoaHiIqKiYiIh4aEg4GAf316eXZ2dnd3eXl5eHh3d3d3eHh5e3+Cg4WDgX5+gH98eXl5e31+f4KDg4OFhYWFhISEhIOBfX19fXx7fn97eXZ1dHV1dnl7d3Z5e3p4d3RzdHR0cGtscXZ4d3Z4d3R2en6AgYODgX9/f4B9fXx8f4CBgYCAgIB/fn+AgYB+f4B+fHx8fX5/f39+f39/e3h6fXp4eoCChISCf3t6fH1+gICAgICBg4SEg4ODhIGAf399fHp6eXh5eXt7enl5eXl4d3h5enp7e35+fHl4enp6ent8e3t7fX+BgHx3eHx9fn6AgH19fHx6eX1+fn5+fn5+fn5+fn9/fn5/f35+fHx8fHx8fHt8fHx8fHx8fH19fX19fX9/goOFh4aGgnx5eXh4eHh3d3l5eXl6ent8fn+AgoSGiYmKiYiHh4aFhIKBf359e3l4d3d3eHh4eHh3d3d3d3d3eHl7foKDhIOCgYCBfXd1d3h4eHt9foCBgYSFhYN/gICChYaCgH5/f31/goF8d3V1dnR3eHhzcXZ4eXl3dXN0d3dwaWlwdnl4eHl4d3Z5fH5/gYODgoB/fnt8fn1/gH+AgH+BgX9+f4KCf39+fnx6enx9fYB/fHx7fH18e3x9e3p7gIKDhIKAfXx9fn+AgYGBgoKDhYWEhISCgoGAgH9+fHt5eXl6e3t5eHh4eHd3eHp7enp8f357eXl6enl7e3t7e3t8gIF/enZ5fH5/f39/fn18eHh5fX5+fn5+fn5+fn5+f39+fn5+fn58fHx8fHx8e3x8fHx8fHx8fX19fX19fX2AgYSGh4iDfnp5eHh4eHd3eXl5eXp6e32AgYKDhoiKiomIh4aFhYOBgH98e3l6eHh5eXl5eHh5eXh4eHh4eHh5eXt9gYOEg4OCgYB8dXN0dXd2eHp7fX9/gYKCgX5/f4OFhoWDgoOBfoCEgn14dnZ2dHZ2dXBucnV4end1dHR2d29mZm10eHh5eXl4d3d6fHx+gYOCf319enx+fn+AgICAgIGAfn5+gYF+fXx8e3p7fH18fX17e3p7fHx+fn58e3+BgoOFhIJ/fn1+f4CBgoOEhISEhIODg4KCgoKCgYCAfnt5eXp7e3l4eHh4d3d4eXp6enx/fnt5eXl5eXt7e3t7e3yAgX96dnl8fn9/f39+fXt3dnl9fn5+fn5+fn5+fn5/f35+fX1+fnx8fHx8fHx7fHx8fHx8fHx9fX19fX19fX1/goSHiIaAfHp6enp6eXl5eXl5enp8foGDhIaIiIqJiIaFhIODgYB9fHt6eHl4eHl5eXl5eXl5eHh4eHh4eHl5e32Ag4OEg4KBfXt3dHNydHV2d3h7fHx9fn59gIGBg4OEhoWGhYOAgISCfXh1dnZ0cnJybmtuc3d7eXZ0dHR1b2VjanN3eHp6enl4dnh7e3t/gYF9e3p6fX+BgoGAgICBgX99fX1+fn17enp7e3x+fnt6ent8fHx8fICAf319gYGDhIWEg4B+fn5/gYKCg4ODg4KBgoGBgICAgYGBgYGAfnt6ent7eXh4eXh3d3h5enp6fH9+e3l4eHl5ent7e3t7fICBfnl2eXx+f39/f359e3d2eX1+fn5+fn5+fn5+fn9/fn59fX5+fHx8fHx8fHt8fHx8fHx8fH19fX19fX5+foCAg4WIiIJ+enp6enp5eXl5eXl6en1/g4OHiIiJiYiHhIOCgoGAf3t7enl5eXl5enp4eHp6enp5eXl5eXl4enl7fICDg4WEgoF+fHt2cnBxdHV0dnl7fHt7e32Cg4ODgoOFhYeFg4GAhIN9eXZ3dnVwb3Bta25yd3t8enV0c3NvZWNrcnd4enx8e3l3dnh5d3uAgH58eXt9gIODgYCAgIGBgH57fHx+fHp4eHp7e319e3h5enx8e3x9gIKAfn6BgYOEhoSEgX9/f3+Cg4KDhISDgICBgYKAgICBgYKCgYKBfnx7e3t5eHh5eHd3eHh5enp8f357eHh3d3l6e3t7e3t8gIF+eHZ5fH5/f39/fn56d3d5fX5+fn5+fn5+fn5+f39+fn5+fn58fHx8fHx7e3t7fHx8fHx8fX19fX5+fX19foCChoiHhIF9e3p6enp6eXl5ent8gIKFhoiIh4eHhoWCgYGAgH18enp7eXp6enp5eXl5enp6enl5eXl5eXp7ent7f4GCg4GBf39/fXdwbW90dXF0eXl7e3p8foGChIODhIODg4OCgH6Bg4F5d3d1dXBrbW5rbXF3fX15dXR0c29oZ2tzd3l7fHx7enh3d3d0eH+BgH97ent+gYKBgYCAgYGAfnt8fH17eHV2eHp7fXx4d3h7fH58fn6AgoB+gIGAgYSGhoOAf4CAgIKEhIKDgoGAf4CAgYB/gYCAgYGDgoOAfXt6eXl5d3d4eHd4eXp5enx/fnx4d3d3eXt7e3p6fH2Agn56dnh8fn9/f39/fnt2dXh9fn5+fn5+fn5+fn5/f35+fn5+fnx8fHx8fHt7e3t8fH19fX19fX19fn59fX59gIKEiIeFg39+fHx6enp5eXl6fX6BhIeIiIeGhYSEgoF/f35+e3t6e3x7e3t6enl5enp6enp6eXl5eXp6e3t6e3x/f4CBgH9+fHx6cm5rb3V0b3F3eXx7e31+gYKEg4KEg4OBgYKAfoGCgXx4d3Z1b2trb2xsbXV7eXNycnRzcGtrbXR3eXt8fHt7eHh3dnR3foKEgn16e36BgoGCgYCAgIB+fHt7fXx4d3d4enx8eXl6ent9f36AgIGBgX+BgICChIWGg4CAgYGBgoKDgoKBgYB/f39/fn1/f3+AgYKCgoF/fHt5eXl3d3l4d3h5enl6fH9/fHh3d3d5ent7enp8fYCCf3t3eXx+f39/gIB+eXV2eX1+fn5+fn5+fn5+fn9/fn5+fn5+fHx8fHx8e3t7e3x8fX19fX19fX1+fn5+fn6AgYSHiIaEgoKBgH58fHt7e3x+gIOFiIeHhoWEgoGAf318fHx8e3t8fHx8e3t7e3t6ent7enp5eXl5e3t7e3t8f4CCgoB/fn5/f3hybGluc3JucHV4fHt7fX+BgoSDgYODg4KCgoB+gYGBfXl3d3VubWlwb21ucnd0bm5wdHVybmxvdHd5e3x8e3t5eHd2c3V5gISDgH58f4KDgoGAf4CBf318e3t9fXt8eXl6e3t4e31+fX+AgIF/gIGBgYKBgIKDhYeEgYGBgYGBgYKCgoKBgYCAgH99fH5+fn+AgICBgYF+fHp5eXl5eHd3eHl6eXp8f398eHd2d3l6e3t6enx9gIKAfHh6fH5/f3+AgH55dXZ5fX5+fn5+fn5+fn5+f39+fn5+fn58fHx8fHx7e3t7fHx9fX19fX19fX5+f39+f4CBg4aIiYWEhIOBgH9/fHx8fX+BhIeHhoaFg4KAf358e3p7e3x8fH18fHx7e3t7e3t7fHx6enl5eXl5eXt7e31+gYOEgX9/gIGBe3FqaGtwcm9wdXl9fX1/gIGChIOBgoODgoKAf32AgH9+enh3dG1saG5wbm5xc3Bsa3B0dnNvbXF1d3l6fHx7e3l4d3ZzcXV8gIKCgX6Ag4SCgYB/f4B/fnx7e319fX98enp7e3l7f4B+gH9/gH9/gIGBgoGBg4OFhoSBgYGAgICAgYGCgoKBgYGAfn18fn19fn5/gICAgoB8e3l5eXl3d3d4eXp5enx/f3x4d3Z2eXp7e3p6fH2AgoB8eXx8fn9/f4CAfnl1dnl9fn5+fn59fX9/f39+fn5+fn59fXx8fHx8fHt7e3t8fH19fX19fX5+fn5/f39/f3+Bg4aIhoaGhoWFgoF+fX1/goOFh4aFhIOBf319fHt7e3x7fX18fXx8fHx7e3t7e3t7e3t7eXl5eXp6e3t8fn+ChIOBgH9/g4J8cmxqbG1ydHR3en19fX+BgYKDgYGBgYGAgYB9fICCgX56eHZybWlnbHFzc3JvbWxscXV2c3BucnV3eHp7fXt6eXl4dnRwcHV6foGBfX+DhIOBf3+AgYB/fXx9fX1+fn15eHt7e3x/gICAgICAf35/gYKCgYGCg4SEhIKAgICAgH+AgoKCg4ODg4F/fX19fHt8fX5+gIGBgX57eXl4eHZ2d3l5eXp7fYCAfHh3dnZ4enp6enp7fYCCgX56fH1+f39+f358eXZ3en5/fX1+fn5+f39/f39/fn5+fn19fHx8fHx8e3t7e3x8fX19fX5+fn5+fn9/f39/f4CChYaHhoeHh4eDgoB/gIGEhYeHhoSDgX98e3t6e3x8fX19fXx9fHx8fHt7fHx8fHx8fHx7e3t7fHx8fHx+gYOEgoKBgIB+fXpxbGhrbXN4enp8fn1+gICBgYGBgYB/f4CBgH18gYSCf3t4dnFraGZscXZ2cnBtbG5xdHZ1cnBydXd4eXt8e3p5eHh2dnJycnZ6e3p6fYKDgoF/f4CBgIB+foB+fn5+fXl4fH1+foCBgYCAgH9+fn+CgoKBgYGCg4KCgYCAgICAgIGCg4SFhYaGhIKAf359fHp7fH1+gICBgHx5eHd3dnZ3eXl5e3t9gIB8eHZ2dnh6enp6ent9gIKBf3x9fX5/f35/fnx5dnd8fn59fX5+f39/f39/f39+fn5+fX18fHx8fHx7e3t7fHx9fX19fn5+fn5+f39/f39/f4CChIaGhoeIiIaEgoGChIWGhoaEgoF/fHp6e3t8fX19fX19fH18fHx8fHx8fHx8fHx8fHt7e3t8fHx8fH6Bg4SEhoSBgH17eXNsaGlrcnt/fX5+f4B/f4CAgYGAfn59gIF/fHyBhYOAfHl2b2hlZWxydnZ0cW5ubnFydXVzcnR1d3d3ent9fHp3dnd4dnR0dnd4d3d8gIKCgoCAgICAgICAgYB+fX19enp9f4B+gICBgICAf35+f4KCgoGBgYKCgoKBgICAgICAgYKDhIaGh4eGhIJ/fn18enl7e3x/gIGAfnp2d3d2dnZ4eHl6fH2AgHx4dXZ2eHp6enp6e32AgoGAfH19fn9/fn9+fHl2eH19fX19fn5/f39/f39+fn5+fn59fXx8fHx8fHt7e3t8fH19fX1/f35+fn5/f39/f39+f4GChYaGiIiIiIaFg4OFhYaEhIOAf316ent9fX1+fn5+fX18fXx8fHx9fXx8fHx8fHx8e3t7e3x8fHx9foKEhYeHhIKAf396dW1oaGpyfIB/f4CAgH9/f4CAgH9+fn2AgX97fIGFg4B8eXVvZ2NlbHN2dnZzcG9wcnFzdnR1dXV2dnZ6e399eXZ2eHh4dXN1eHh4d3t/goKCgYCAgICAgYKBgH59fH18e3+BgH5/f4GAgIB+fX5/goKCgYKCgYKBgYKBgYGBgYGCgoSEhoaGh4aDgX9+fXx6eXl4e3x/gIF/e3Z2dnZ2dnh4eXp7fYCAfXh0dnZ4enp6enp7fYCCgX98fn1+f39+f358eXZ5fX19fX1/f39/f39/f35+fn5+fn19fX18fHx8e3t6fHx8fX19fX9/f39/f39/f39/f35+gICDhIWGh4iJiYeFhIWEhISCgX98e3p6e3x+fn5+fn19fX18fHx8fHx8fHx8fHx8fHx8fHx8fX18fH6ChYSHiIaEg4KBgH57c2xrbHV+gYCAgoF/f359fX+Af35/fX+AfXp8gYWEgnx5dG5mYGVtcnR3d3RxcXJzcnR1dXNzdHV0dHl6fX14dHR1d3h3c3R3d3d4fH+AgYGAgICAgICAgIB+fn18fHp6fn5+gIB+gICAfn18fH+CgoKCgYGAgYKCgYCAgH9/goKChYWGh4eGhIKBfn5+fHt6enl6fH+AgYF8eHd2dnZ2eHh5e3p9gIB9eHR0d3l6enp6ent+gYB/fn1+fn5+fn5+fXt5d3l8fX5+fn9/f39/f39/fn5+fn5+fX19fXx8fHx7e3p8fHx9fX19f39/f39/f39/f39/fn5/f4CAgoKFhoeHhoWFhYSEg4F/fHp7ent8fH5+fn5+fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx9fXx8f4OFhIiIh4WDhIOCgX16dW9wd3+BgIGBgn99fXx8foCAf399fH59enuAg4ODfXp0bmZgZm5zdHd3dXRzdHNzdHV2dHR1dHFzd3h8fHdycnV2eXdzdHZ2d3h7fX6AgICAgICAgICAgH9/fHx8enl5eHd5fH6AgIB/fXx9f4KCgoKBgYCBgoKBgH9/gICBgYGEhYaFhYaEgoB9fX59e3p6eHd6fX+Bgnx6eHZ2dnZ4eHl6en2AgH14dHR3eXp6enp6e3+BgH99fX5+fn5+fn59e3l3eXx+f4CAf39/f39/f39+fn5+fn59fX19fHx8fHt7enx8fH19fX1/f39/f39/f39/f39+fn5+foCAgYOEhoaGhYWFg4KBfnx7e3x7fX19fn5+fn59fX19fHx8fHx8fHx8fHx8fHx8fHx8fH19fX2Ag4SFiYqJh4WEhISBf316dHN3fYF/gICCfn17e3t8foCAfnx6fHx5e4CCg4R/enRuZmJmbXN2eHh3d3V1dHR1dnd2dnV0cXJ1dnp6d3Jxc3V4dnR0dnZ3d3p8fX6AgICAgICAgICAf359fX16eXt5dnZ1eXx+f399fH6AgoKCg4GAgYGBgoGBgICBgYGBgoSFhYSEhYOBf3t7fH16eXl4d3l7foGCfnt5dnZ2dnh4eXp7foGAfXh0dHd5enp6enp7f4GAfXt8fn5+fn5+fn17eXd5fH+AgYF/f39/f39/f35+fn5+fn19fX18fHx8e3t6fHx8fX19fX9/f39/f39/f39/f35+fn5+f35+goKFhYSDg4OBf357fHt7fHx8fX19fX5+fn19fX18fHx8fHx8fHx8fHx8fHx8fHx8fX1+foGFhIaJi4qIh4aEhIGBgH55dXh9gH9/f4J+fHp5eXt9f4B+fHp8e3h6f4KFhYJ6dG5lZGVtc3V3d3d3d3Z1dXR2dnd4d3ZxcnV3eHh1cHBydXd0dHR0dnd4eXt7fX5/gICAgICAgIB+fn1+fnt7fXp5dnJyd3x/f318foGCgoKDgYCBgYGBgICCgoGBgYKCg4SFhoWEgoB8enp6e3t5eXh4eHp9f4GAfXl2dnZ2eHh5ent+gYB8d3N0d3l6enp6ent/gYB8eXt8fn5+fn5+fXt5d3l8f4CDg39/f39/f35+fn5+fn19fHx8fHx8fHx8fHt8fHx+fn5+fn5+fn9/f39/f39/f39+fn9/fn1+f4GCg4OCgX9+fHt7e3x9fX1+fn5+fn59fXx8fHt8fHx8fHx8fHx8fHx8fHt8fX1+fnx/gYaIiImLi4qHhYWDgYCCgn55eXt+fn5/gn56eXl6en1/gIB+fn17eHqAhYeGgHp0bmllZm5ydXZ2eHh4dXR0dHd4eXp6eHRydXd3dnJwb3J0dHJycnR1dnh6eXp8fX+AgICAgICAgH99fX1+fX6Afn17dnJvdH2AfX6AgoODhIOBgIGBgH9/gIGBgYGCgoKDhIODgoSDf3x5eXl5enh4eHZ2en1/gYF/eHZ0dHd4eHh5e36AgHp1c3R3eXp5eXh6fX+Bfnt4en1/f399fHx8enh3eXyAgIOFf39/f39/fn5+fn5+fX18fHx8fHx8fHx8fHx8fH5+fn5+fn5+f39/f39/f39/f35+f39+fX19gIGCgoGAfXx7e3t7fX19fn5+fn5+fn19fHx8e3x8fHx8fHx8fHx8fHx8e3x+fn5+fX+Eh4mFhIiKi4mGhYKCgoOFhH56eX1/f3+BfXp6eXl5e36AgH9/fXp3eYCGh4aBenRvamZnbnJ1dnZ4eXh2dXR1d3h5e3x6dnR2eHd1cG9ucHFxcG9ydHV3eXp5eXt9f4CAgICAf4CAf359fX5/f4CAf358d3N0eH5/gIKCg4OEgoCAgICAf3+AgYGBgYKCgoOEg4OCg4J+e3h4eHh5eHh4dnZ5e36AgoF8eHV1d3h4eHl7foCAenVydHd5enl5eHp9f4B9eXd6fX9/f318fHx6dnh7f4ODhIV/f39/f39+fn5+fn59fXx8fHx8fHx8fHx8fHx8fn5+fn5+fn5/f39/f39/f35+fn5/f318fHx+f4CAf357e3p8fHx9fX5+fn5+fn5+fX18fHx7fHx8fHx8fHx8fHx8fHx7fH19fX1+gIaKhn+AhIuLioWEhIODhYeIhHx5e4CAgIB8enl5eXh6fYCAgH58d3V4gYaHhoF6dG9qZmducnV2d3d4eHV0dHZ3eHl8fXl3dXd4d3Rwbm5vb29ub3JzdXd5enl6e31/gICAgH+Af4B/f35+fn+AgYCAgH98eXV0eX+AgoKCgoOBgICAgIB/f4CBgYGBgoKCg4SDg4KCgH56d3d2d3h3eHh1dnl7fYCCgX14dXV3eHh4eHt+gH95dHF0d3l6eXl4en1/gH14d3p8f39/fn19fHl2eYCBhYWDgn9/f39/f35+fn5+fn19fHx8fHx8fHx8fHx8fHx+fn5+fn5+fn9/f39/f39/fX1+fn9/fXx8e3x9fn59fHx8e319fX19fn5+fn5+fn59fXx8fHt8fHx8fHx8fHx8fHx8fHt8fX18fH6BiIqDfH6DiouIhIOEgoGEhoqHf3t7gIOBf3t6enl5d3h6foCAfXx2c3iChoeGgnp0b2tnZ25ydXZ2d3h3dHNzdXh4eXx8eXd2eHl2c3Bubm5tbWxucnR1eHl7eXp7fH5/gIGBgH9/f39/fn5+f4CBg4GAgH99dnJ0foCDg4ODg4KAgICAgX9/gIGBgYGCgoKDhIODgoKAfXt2dnZ2eHd4eHZ2eHp8f4GCfnp3dXZ3d3d4e36AfXh0cXR3eXp5eXh6fX+BfXZ2en1/f4B+fXx8eXh8gYOFhYOBf39/f39/fn5+fn5+fn59fXx8fHx8fHx8fHx8fH5+fn5+fn5+fn5+fn5+f39+fn9/f39+fX18fH18fHx8fHx8fX19fn5+fn5+fn5+fn5+fX18e3x8fHx8fHx8fX18fHx8fHx8fHx9f4GIiIB6fYGFhoSCgYSDgYCCiIqCfHt/g4N+e3x7eXl2d3l+fn58enVyd4CGiIeDfHVua2hobnNzdHV4eXdzcnN1eHl5fHx6eHh5eHZzb21ubWtoa21xdHV4ent7e3p7fH1/gYGAf39+f4B/f359foCDhIGBgH55dXR6gIGCgoKCgoCAgYOCgICBgYGBgYCBgoOEgoOCgoF8eXV1dXZ2dnZ1dnd3eXp8f4F+fHl3d3h4eHh7f4B9eHNydHd4eXl5eHt+gIF9dXV7fX6Af359fHt4e4GCgoKCg4J/f39/f39+fn5+fn5+fn19fHx8fHx8fHx8fHx8fn5+fn5+fn5+fn5+fn5/f39/f39/f35+fnx9fXx8fHx8fH19fX1+fn5+fn5+fn5+fn59fXx7fHx8fHx8fHx8fHx8fHx8fHx8fH1/hIaCfXx7fIGDgHl4foJ+enqCiYaBfX+BgX98e3x6eXd3eHx8fnt5dHJ3gIWHhoR9dW1rZ2luc3R1dnh4dnBtb3FxdHZ5enp3d3h4dXJvbWxoZmdpbXF0dnl7fHx7e3t7fH+BgYCBgoODgYB/fn17fICCgoGAf3x7eHd+gIGBgYGBgICCg4KAgYGBgYGBgIGCg4SCg4KCgHx3dXR0dXZ2dnV1dnd4eXx/gIB9eXZ2d3d3eHt+gH14c3F0d3h5eXl4e3+BgHx0dXt9foB/fn19fHt/goOCgYGCgn9/f39/f35+fn5+fn5+fX18fHx8fHx8fHx8fHx+fn5+fn5+fn5+fn5+fn9/f39/f39/fn5+fH19fHx8fHx8fX19fX5+fn5+fn5+fn5+fn19fHt8fHx8fHx8fHt7fHx8fHx8fHx8fX+Fg357fXh4e316c3N5fHl1dXqEh4N+f359fn58fn16eHd2eXp7end0cXeAg4WFg311bWtoam5zdHV4eHdya2doa2tucnR3eHZ2d3d0cW9raGRkZ2drcnV3ent8fXx7e3p7f4CAgIGEhYaEgn9+fXp4enx9fn99fX16d3p/gYGBgYGBgYKDgYCBgYGBgYGAgYKDhIKDgoF/e3d0c3N0dnZ2dXV2d3l5e35/gIB7d3d3d3d4e36AfHdycXR3eXl5eXh7f4F/eXN1fH9+gH9+fXx8foODgoGAgICAf39/f39/fn5+fn5+fn59fXx8fHx8fHx8fHx8fH5+fn5+fn5+fn5+fn5+f39/f39/f39+fn58fX18fHx8fHx9fX19fn5+fn5+fn5+fn5+fX18e3x8fHx8fHx8e3t8fHx8fHx8e3x9f4OAfXp7d3Z4enhzc3d6dnFxdX6EhH59e3p8fX9/gHt6eHd4ent5dnNwd4CChISEfnZua2lpbnN1dnd4dW1lY2NlaWxwcnV1dXV2d3RxbmplZWVpZ2tzdnl7fH19fHt6e3x/gH9/gIKEhYaEgH58d3R0d3h5e3t8fn14en+AgYGBgYKCg4OBgICBgYGBgYCBgoOEgoOCgH55dnNycnN2dnZ1dXZ2eHl6fn+BgH13dnZ2d3h7fn98dXJxdHd6e3l5eHt+gH13cnZ8fn6Af358e3yBhIOCgYGBgIB/f39/f39+fn19fX19fH19fHx8fHx8fX19fX19fn5+fn5+fn5/f35+fn5+fn9/f39/f35+fX19fXx8fHx8fHx8fn5/f35+fn5+fn5+fn59fX18fHx8fHx8e3t6ent7e3t8fHx8fH1/gHx6fXpzdHR1dnR0dnRxb29vdn6CfHp5eHt+gH9+fHp3dnZ4eXp3cnF4gIKEhYJ9d29raWhscnV4eHdzaGBeXl5jam9xc3FycnR0cnFtaGRkZGlpbXJ4fH5+f359e3p7fX+AfXt9f4GChIaAfXl3dnZ4dnZ0dnp9fXl4fYCCgYGBgYGBg4GAgICBgYGBf4CCgoOCgoF/fHl2c3Nyc3V1dnV0dXd3eHp9gH9/fnl3d3d3eHx+fnp1cXB0d3p7eXh4e3+BfXZzeH1+f39+fXt8f4SEgoOBf39+fn9/f39/f35+fX19fX19fX18fHx8fHx9fX19fn5+fn5+fn5+fn9/fn5+fn5+f39/f39/fn59fX19fHx8fHx8fHx+fn5+fn5+fn5+fn5+fn19fXx8fHx8fHx7e3p6e3t7e3x8fHx7fH19eHl7eHJ0dnZ3dnh1cm5vb25xd358eHZ2e36Af359enh2dnh5eXdycnmAg4SGgn12cG1paW1ydnh4d29iWVdZVFlmb3FzcXJycnFvbmtnZWZmamttcHV5fH6Afn16enp9f4B9enp8foCDhoN+enl5d3l7enh2ent8eXd6f4KBgYCBgYGDgYCAgIGBgIB/gIKCg4KCgX98eHVzc3JzdXV2dXR1d3d4eXx+gIB+e3h3d3d4fH5+enVxcXR3ent5eHh7f4B9dXR5fX5+f358e32BhIOCgoB/f39/f39/f39/fn59fX19fX19fHx8fHx8fH19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39+fn19fX18fHx8fHx8fH5+fn5+fn5+fn5+fn5+fX19fHx8fHx8fHt7e3t7e3t7e3t7e3p7fHp3eHp3cnV5e3t9fnlybm9vbm50fX14dnZ6fX+Afn17eHd3eHl5eHV1eoCEhYWCfXdxbmppbXN2eHZ2b2JVUFFNVmRvcnNxcHBvbW1qa2loZ2dqbG5vc3Z6fX9+fHp5en1/gH57enx9f4GEhoJ+e3l3eH1+e3t9fXx3dnl9gIGBf4CAgYOBgICAgYGAgH+AgoKDgoKBf3x3dHJycnN1dXV0dHV3d3h4fH1/gH98eXd2d3d7fn56dXFxdHd6e3l4eHt+gHt2dHl9fn5/fXt8gIKDg4KBf35+fn5/f39/f39+fn19fX1+fn18fHx8fHx8fX19fX5+fn5+fn5+fn59fX5+fn5+fn9/f39/f35+fX19fXx8fHx8fHx8fn59fX5+fn5+fn5+fn59fX18fHx8fHx8e3t7e3t7e3t6enp6ent9end3enhydXt9fYF/e3Nvb29ubnN9fnh1dnt9f39+fXt5eHh4eXh5d3d6gIKDhYN9eXJtamltc3Z3dXZxZVJLS01YZW5zdHFvbWxpaWdqamloZmltb3BzdXp7fX17eXl6fX9/fXt8fXx/gIOHhn98eXd2e35+fYB/fnd1dnh7foB+f3+Bg4GAgICBgX9/f4CCgoOCgoF/fHd0cXFyc3V1dXN0dXd3eHh7fX1/gH15d3V2d3p+fnp0cXF0d3p7eXh4e35/e3Z0eX1+f358eoCDg4ODgoB9fX19fYCAf39+fn5+fX19fX19fXx8fHx8fHx9fXx+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fH19fXt8fHx8fHx9fX19fn5+fn5+fn5+fn18fXx8fHx8fHx7e3p6e3t7e3t7e3t7fH15dnV6dm9yeHl7f399dHFvb3Bvc3x+dnV2e31/f359e3p4d3h4d3d3eHp/goKEg4J9dG1qa29zdXV1dnFoU0tMU11ocXR0cnBuaWZlZWdpaWdlZm1xcXN1d3p7e3l4eHp8fn18fXx7fH+BhYiJhH57eXZ6fX9/f4GAfXp0cnN4fX1+fn+DgH+BgYCAf39/gIKDg4OCgYB8dnRxcXJzdHR0c3R2dnZ3d3p8fH2Afnl3dXZ4e39+eXJwcXV4eXl5eXh7f397dXR5fX1+fXt+goSEg4OBf359fX19f39/f35+fn59fX19fX19fHx8fHx8fH19fH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn58fX19e3x8fHx8fH19fX1+fn5+fn5+fn5+fXx9fHx8fHx8fHt7e3t7e3t7e3t7e3t8fXl0c3d1bW90c3Z6fXx0cXBwb25ye353dXZ7fX9/fn17enh3eHh3d3Z4en6BgH+Agn93cGxtcXN1dnV1cWtZU1NaY2txdHNycG9qZ2VlZmZmZWZnbXJyc3V3eXp6eHd2eXx9fX1+fXx+goaIi4yJhIB8d3h8fn9/gICAfnp2c3J2dnl9f4OAf4CAgIB/f3+AgoODg4KBf3x2c3FxcnN0dHRzdHZ2dnV2eXt8fX9/eXd2d3h7f354cnBxdXh5eXl5eHt/f3l0dHl9fX18fICDg4SCgoF+fX19fX1+fn9/fn5+fn19fX19fX18fHx8fHx8fX18fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fnx9fX17fHx8fHx8fX19fX5+fn5+fn5+fn59fH18fHx8fHx8e3p7e3t7e3t7e3t7e3x8eHFvcnFsbXJzc3d7enRxcXFvb3F7f3l2d3t8fX1+fXx7eXh4eHZ2dXd5fH9+e32AgHlzb3BzdHV2dHRwa2BaWmFnbXFzcW9ubm1qaGZlY2NjZGhuc3R0dXh5enl3dnR3e319fX9+fn+FiIaGhoiIhoF6eHt8f39+f4CAfnt4dnNwc3d8gIB/gICAgH9/f4CCg4SDgoF+e3VycXFyc3R0dHN0dnZ2dnZ5enx9f4B5d3d3eHt/fnhycHF1eHl5eXl4e39+eXN1en19fXx+goSDg4KAf319fX19fX5+f39+fn5+fX19fX19fHx8fHx8fHx9fXx+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fH19fXt8fHx8fHx9fX19fn5+fn5+fn5+fn18fXx8fHx8fHx7ent7e3t7e3t7e3t7fHx3b2ttbWxtcXJxdXt6dHFxcHFvcXuBend3fHx9fX59fXt6eHh4dXV1dnd6fn56fYCBe3VycnZ2dXZ0cm9qYl5dZGlucXBubGttb21raWVjYWJgZm91dXV2eHl5d3VzcnR4fX19fn6AgYWEf4CAgoSIhX15ent/fn+BgIGAfn18eW9wc3l9gH9/f4CAf39/gIKDhIOCgX56dXJxcXJzdHR0c3R2dnZ2dnh6fHyAf3p3dnZ4e39+d3JwcXV4eXl5eXh7gH96dHV6fX18fICDg4OCgYB+fHx9fX19fn5+fn5+fn5+fn5+fX19fX19fX19fX5+fX59fX5+fn5+fn5+fn5+fn9/f39/f39/f39+fn59fX18fHx8fHx8fH19fX19fX19f39/f35+fX18fHx8e3x9fXx7fHx8fHx8e3t7e3x9fHdvaGhrbG9zcW9zent1cHJzc3F0e4F8d3h8fHx8fn58fHt5d3Z1dHR2d3d8fHt9f4B/eXZ1dnV0dXRybmllYWFnbnBvbWtoZ2pucW9sZ2RfW1tkcHZ3d3h4eHd0b25wcnd8fn5/gIGCg4B+fn1/gYaLg316e3x9fn+AgIB/fn9/enRwcXd8fn+AgYB+f36AgoSFg4KBfXl1cnBxc3Nzc3N0dXZ2dXV1dnh7fYCAfHd2dnh8f312cXFydnh4eHd4eHt/f3p0dHp+fnx/goSEg4OAfn19fXx8fX1+fn5+fn5+fn5+fn59fX19fX19fX19fn5+fn19fn5+fn5+fn5+fn5+f39/f39/f39/f35+fn19fXx8fHx8fHx8fX19fX19fX1/f39/fn59fXx8fHx7fH19fHx8fHx8fHx8fHx8fH19d29paGprbnNvb3J4e3ZxcnV1c3Z9f3x4eXx8fHx8fX18e3p4d3NydHV2d3p7e31/f397eHZ2dnZ3dXJuamdkZmtwcG5qZ2RkZ2xxcG5pZmBbXGVwdnh4eHh2c3Fsa29yd3t/gICCg4OBfn5+fX+BhY2IgHx8fX1+f4CAgH9+gIKAe3d0bnN1e35/f36Af3+BhIWDgoF8eHRycHFzc3Nzc3R2dnZ1dXV2eHt9gIB8d3Z2eH1/fHVwcHJ3eHh4eHh5e35+eXR1en19foGDhIOCgX18fX19fHx9fX5+fn5+fn5+fn5+fn19fX19fX19fX19fX5+fX1+fn5+fn5+fn5+fn5/f39/f39/f39/fn5+fX19fHx8fHx8fHx9fX19fX19fX9/f39+fn19fHx8fHt8fX18fHx8fHx8fH19fX18fX14b2pqamttcG1ucHZ8eHNzdnZ0dnx+fHl6fHx8fHt8fXx6eXd2c3N0dXZ2eHx8fX5+f3x5d3d2d3d3dG9saWdqbnBvbGhjYWFkaW9wbmpnYl5fZ3F2eHh4eHVybmlobnN2en5/foCCg35+fn5+f4KGjYyFgX99fH5+f4CAf3+AgoJ+f3lycW91eHt8fX9+gIGEhYOCgXx4dHFwcXNzc3NzdHZ2dXR0dHV3enyAgHx3dnZ4fX57dXBvc3d4eHh3d3l7fn54dHZ6fH1/g4ODg4J+e3l7fHx8fH19fn5+fn5+fn5+fn5+fX19fX19fX19fX19fn59fX5+fn5+fn5+fn5+fn9/f39/f39/f39+fn59fX18fHx8fHx8fH19fX19fX19f39/f35+fX18fHx8e3x9fXx8fHx8fHx8fX19fXx9fnhxbGtqa21ubGtudXt6dXN2dnR4fX59eXp8fHx8fHx8fHp4d3Z1dHN0dXZ3e3x9fn1/fXp4eHd1dXd0b21ramxwcG9rZmBeXWBmbW9tamdjYV9ocnV4eHh4d3JrZWdtdHZ6fX59fYCCfn5+fn9/goiPj4qGgX18fn5/gH9/gICCgoCBfnlzcHJ0d3d3ent/gYWFg4KBfHh0cXBxc3Nzc3N0dnZ1c3R0dXd6fYCAfHd2dnh9fXt1cW9zd3h4eHZ3eXt/f3dzdXh8foCDgoKDgH15eHt8fHx8fX1+fn5+fX19fX19fn59fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn99fn5/f39/f39/f35+fn59fX18fX18fHx8fX19fX19fX1+fn5+fX19fX19e3t7fHx8fHx8fHx8fHx8fHx8fH1+enJsamtrbWxoaGtze3p3dXV1dnl9fn16e3x9fHp8e3t7enl3dnZzcnJ1dXh8fn9+fX19e3p4eHV1d3RwbmxtbnFycGtkXllZXWNqb21pZGJeX2ZwdHZ2eHh1b2lkZm92d3h5enp7f4B+fn5+gICDipOTjomCfn59fn+AgICBgYGCgYB/f3t5cW9xcnJ0eX1/goODg4F8d3RycXJycnJyc3R2dnV0c3N0d3l8f397d3V2eXx+enRwcHN3eXh4eHd5e358dXJ2eHt/goODgoJ/e3Z5e3t7e3t8fH5+fn59fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+f31+fn9/f39/f39/fn5+fn19fXx9fXx8fHx9fX19fX19fX5+fn59fX19fHx7e3t8fHx8fHx8fHx8fHx8fHx8fX96cmxra21uamVmaXF5enl3dXZ3eX1+fXt7fH18enx6e3p6eXh2dnRzcnR0dnqAgX99fX18e3h4eXl4dW9sbG5wcXFva2RcVlddZGpta2lkYF1gZm9ydHV3d3RtZ2JlbXR2eHp5enp9fX19foCBgIWNlJSOioSAf359fn+AgYKCg4OBgICAf356dHFxc3Z7f4CCg4OCgXt3c3FwcnJycnJzdHZ2dXRzc3R3en1/f3t2dHZ5fH56dHBwc3d5eHh3d3l7fnt2c3Z4fICDg4OCgn95dXl7e3t7e3p6fn5+fn19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5/fX5+f39/f39/f39+fn5+fX19fH19fHx8fH19fX19fX19fn5+fn19fX18fHt7e3x8fHx8fHx8fHx8fHx8fHx9f3pybGpsbGxnZGZqcXl8enh3eHh6fX18fHx7fHx6e3p6ent5eXd2dXNzc3R0eYGBgH19fXx7eXl5eXl2bmptb3FxcW9rY1pWV15maWdlY2JhYGJnbnFydHV1cmxmYWRrcnV3enp7fHt5eXt9gYKChYqQkIuJhIGAfn1+f4CBgoKAgYGAgIGBgX95dnV4e36AgIKDg4GAe3dycG9xcnJycnN0dnZ1dHNzdHd7fn9/enVzdXl8fnl0cHBzd3l4eHd3eXx+enZ0dXh+gYKDgoGBfHd1eXt7e3t7enp+fn5+fX19fX19fHx9fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn99fn5/f39/f39/f35+fn59fX18fX18fHx8fX19fX19fX1+fn5+fX19fXt7e3t7fHx8fHx8fHx8fHx8fHx8fH1/enNraGtsa2ZkZmpxeX56enh5eXp9fXx8fHt8fHp6eXt7fHt6eXd3c3Jzc3R5gIGBfn19fHt5eXl5eXVuam1wcHFxb2tiWlZYX2VkYF5eX2FiZGhtcHFzdHRxamViZGpxdXd6ent9fHl1d3uBgYOFiIyMiYiEgYB+fX9/gIKDgoGCgIB/gYCAf3t5eHp8fn6AgoODgYB7dnFwb3BycnJyc3R2dnV0c3N0d3t+f396dXN1eXx9eXRwcHN3eXh4d3d5e316dnN1eICDg4SBgYB6c3R5e3t7e3t7e319fn59fX19fHx9fX19fX19fXx8fX1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fX19fX19fXt7fHx9fX19fX1+fn1+fn59fXx8fHx6ent7fHx8fX19fHx8fH19fX19fn57cmtoa21rZWRnbXJ7gH17eXp6enx9fHt7fHx8e3t6enl6enp6eXd0c3Jyc3d+gIB+fXx8fHl4eXl4dW5rbG9wcHBtaWJaV1liY19YWVpcXmNmam1wcXJzdHFrZ2NjaW91d3p7fH18eXZ1eX6AgoaGh4iHhoOBgH59f3+AgoOBgICBgYCAgH9/fnx9fX5+f4GCg4KBf3p1cG9vcHFxc3NzdHZ2dXNzc3J2e36AgHt2c3V6fXx3cm5wc3h5eXl2dnl7fnlzdHZ8goOBgYGBfndydHl7e3t6enp8fX1+fn19fX18fH19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn59fX19fX19fHx8fH19fX19fX19fX5+fn19fHx8fHt7e3t8fHx9fX19fX19fn59fX5+fnxxbGlqa2llZGlwc3yAf3x7enp6fH18e3t8fHx8e3p6eXt7enl5d3RycnJzdn2AgH9+fXx7d3d4eHh1cGxsb29vb25pY11aX2llW1FUVFZcZWhrbnBxcnJycGpmYmRpb3R2eXp8fn19fHt9foCBg4WFh4iGg4GBfn5/f3+Bg4J/foCAf39/f35+fn5+f39/gYGCgYB+eXVwbm9wcXFzc3N0dnZ1c3Nzcnd8f4B/enVzdXl8fHdyb3F0eHh4eHZ2eXt9eXNzd36Dg4GBgYB7c3J1enx7e3p6en19fX19fX19fXx8fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn19fX19fX19fX19fHx8fH19fX19fX19fX18fHx8e3t7e3x8fH19fX19fX1+fn19fn5/fXJraWpraWVla3N1fH9/fXx8fHp8fXx7e3x8fHx7e3p6e3t6eXl3c3FxcnN2e4CBgH5/fnt2dXZ3eHVwbWxra2xtbWtlXl5nbmpaTE9PUFhiZ2psbXBxcnFvaWViY2ltcnZ6e3x9fX+Af4GAgYKDhoaHh4eCgYF/fn9/f4GDgn59fn9/f39/fn5+fn5/f3+BgYKBf315dHBvb3BxcXNzc3R1dXVzc3N0eHx/gH95dHN1eXx8d3FwcXR3d3d3dnZ5e3x3c3R4gIKCgYGBf3lycnZ7fXt7enp6fn19fHx9fX19fHx9fX19fX19fX5+fX1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+f35+fn5+fX19fX19fX19fX17e3t7fX18fH19fX19fXx8fHx8fHt7fHx8fX19fX19fX5+fX1+foB9dG1oaWtqZWZsdHd8f4B/fX19enx9fHt7fHx8fHt7enp7enx7eXd0cHBxc3V7gIKAgICAfHZ0dHV4dXFtamZlam1vbGdgYWtva1tJSkpNU19naWdobnBxcW5oY2FjaGtwd3t8fHt8foCAgYKDhYWHh4iIh4OBgYB+f35+gYSCfn19fn9/f35+fn5+fn9/gIGBgIB/fXl0b25vcHFxc3NzdHR0dXNzc3R4fYCAf3l0c3V4e3x3cHBydXd3d3d2dnl7e3ZzdXuBgoGBgYB+eHJyeHx9e3t6enqAfX19fX19fX18fH19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fX18fHx8fHx9fX19fX19fX19fHx8fHx8fHx8fH19fX19fX19fn5+fn9/fn10a2hoaWpmaG90eHyBf35+fX58fHx7e3t7fH19e3t7enp7fHx6eHJwb29yc3h+goGBgYF9d3JzdHZ3c29pZWNmamxraGNmamxoXFBKR0hQW2VnY2Jpb3BvbGdjYGFkaG12e3x7e31/gYGDhIWHiImJiYqHg4CAgH9+fX6Bg4J+fX19foCAf35+fn5+fn+AgYGBgH58d3Nvbm9wcHFzc3N0dXV1c3NzdHd9f4F+eHR0dnl7e3ZvcHJ1d3d2dnZ2eXt7d3N2fYGCgYGBgHt2cnJ3e3t6eXp7e4B9fX19fn59fXx8fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn59fXx8fHx8fX19fX19fX19fX18fHx8fHx8fHx8fX19fX19fX1+fn5+f39/fndsaWlpamlscHV7foB+fX19fn59fHt7e3x+f358fHx7e3t7e3h2cW9tb3Jydn2BgYGBgH14cnJydXZ0b2hjY2ZoaGZoZmlrbWlfWU5LSlBZZWNdXWVtbm9rZmJfXmFlbHd8fHt7fH+BgoWGhoeIiImJiYiDgYCBgX9+foGDgn99fHx+gH9+fn5+fn5+fn+BgYGAfnx3cnBtbW5wcXNzc3R1dXVzc3N0d31/gX54dHR2eXt6dW9wcnV3d3Z2dnZ5e3t2dHh/g4KBgYB9eHVzcnZ7e3p5ent8gH19fX19fX19fHx9fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn19fHx8fHx9fX19fX19fX19fXx8fHx8fHx8fHx9fX19fn5+fn5+fn5/f4KCe29pamtqbnB0eH1/fn18fH2Af358e3t7fX9/fnx8e3t7eXp6d3Rwbm1ucXF0en+BgYB/fnhycXF0dnNvaGNjZ2hnX2FkamxtaGFYUE5MT1hmYVdYYWptbmtmYl9dX2JsdXx9e3t9gIGDhYaGhoeIiIqJioWCgYGBgYB/gIOCf3x8fX6Af35+fn5+fn5+f4GBgYB+fHhzcG1sbXBxc3NzdHV1dXNzc3R3fX+BfndzdHZ5e3p0b3Bzdnd3dnZ2dnl7e3d0e4GDgoKBf3t3dXJyd3t7enl6e36CfX19fXx8fX18fH19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fX18fHx8fH19fX19fX19fX19fHx8fHx8fHx8fH19fX1+fn5+fn5+fn9/g4R+cm1ra2twc3d6fX5+fHx8fYGAf318e3t7fX9+fX17enp5eXp2c3BubG1vcXJ4f4GBgH59eHJwcXN1c29nY2ZoaWVbWl9pbW1oYlZSTk5RWmdiVVReZ21uamViXl1gYm11fX18e31/gYOFhoeGhoeIiIiJhoOBgIKBgH+Ag4KAfX1+foB/fn5+fn5+fn5/gYGBgH17eHJvbm1ucHFzc3N0dXV1c3NzdHd9f4F+dnN0dnl7eXRvcHN2d3d2dnZ2eXt7d3Z9g4ODgoB9end0cXN4e3t6eXp7f4N8fHx8fHx8fHx8fHx9fX19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn59fX19fHx8fHx8fHx8fHx8fX19fX19e3t9fX19fn59fX5+fn59fX5+f4GGh4F1b21sbnV3eXt+fXt8fX1+gYKDgX58e3t8fX19fXx7e3p5d3RycW1qa29xcXZ8gIF/fXt2cW5vcnNyb2hlZWdrZ1xVWWRsamdgVlNUVlthaGBWUFpla2toYmBeXGBkbXZ8f3x7fH+BgYSFhoWFhoeIiYqIhoOChIOBgICDg399fX1+fn9+fn5+fn5+f4CBgYKAfXt3c29sbG1wcnJyc3N0dHNzcnJ1eH6Af3x2c3N1ent4c29wcnV3dnV1dXZ4e3l3eoCEhIKBf3p3dnJvc3l6enp5enyAhHx8fHx8fHx8fHx8fH19fX1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn19fX18fHx8fHx8fHx8fHx9fX19fX18fH19fX1+fn5+fn5+fn19f39/g4eGgHZycG5wd3l7fX9+fH1+f36Ag4SDgH16e319fX19fHt7eXh2c3FvbGprbnBwc3h8fX16eHNwb3BxcXFvZ2NlaW5pXVVXXmdmZV5XVlteYGVoYFhPVmNpZ15aWVtcX2RudXt+fHt7fn+AgoOEg4SEhoiJiomIhYOEhIOAgIKDgH59fX5+f359fX5+fn5/gIGBgX99e3dzb2xrbG9xcnJzc3R0c3NycnZ6foGAfHZzc3V5e3dybm9ydXZ2dXV1dnh7eHh8goODgYF9eHV1c3F3e3t7e3t7foGEfHx8fHx8fHx8fHx8fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fX19fXx8fHx8fHx8fHx8fH19fHx9fX5+fX19fX5+fn5+fn5+fX1+f4GFiIN9eHV1c3R4e3x+f318fX6Af4GDhoaEgHx9fX19fX18e3p5eHZzcW5ta2ttb3BxdXh4eXd2cXBubnBwcW9nYmVscGxfVldZYmNkXlhZX2BfYWVeWlBTYGhjVlRWXFxfZG50eX59fHt9fn+BgoOCg4OFiImKiYmFhISEg4CAgoOAfX19fn5/fn19fX1+fn+AgYGBf317d3NvbGtsb3FycnNzdHRzc3Jydnp/gYB7dnNzdXl6dnFub3J1dnZ1dHV2eHp3en+BgoKBgHt4d3l3dnt+fn5+fn2AgoR8fHx8fHx8fHx8fHx9fX19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn59fX19fHx8fHx8fHx8fHx8fX17e319fX1+fn5+fn5/f35+fn59fX1/g4iIgn16d3d1dnh7fn99e3x+foCAgYWHiIaEfn58fX19fXx7enl5dnNxbm1sbG1vcHFydXV1dHNxcG1ucHBxb2ZiZWxvbWJWVVhfYmJeXFxgYFxdYFxZUFNeaGNUT1VcXmBkbnR4fn98e3x9foCBgYCBgoSIiYmJiIaFg4SEgICBgX98fX1+fn9+fHx8fH5+f4CBgYB+fXt3c29samtucHJyc3N0dHNzcnJ2en+Bf3t2c3N1eHl2cW1ucnV2dnV0dXZ4eHd8gYKCgYB/enh3ent8f4CAgICAf4KEhXx8fHx8fHx8fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn19fX17e3x8fHx9fXx8fHx8fHx8fX19fX19fX1+fn5+fn5+fn18fICFiIaBfn98fHl5eXx+fn17fH5/gIGCg4aKiYaDf3x9fH59fHx6eXh2c3Bubm5ta2xvcnNycnFwcXNxbWtub3BvZ2JlbGppZFhRVlxiY2FfYWJfW1hbV1NQVF5mY1NKT1pcYGVtc3h+fn18fH18fn9/f4CChIaIiomHhoaEg4KCgYB/fXt9fn9/fn18fHx8fX5/gIGBf357eXZzb2prbG9wcXJ0dHRyc3NxcnZ6f4F/enNyc3V5eXVwbm9ydXV0dHN0dnh4eX2CgYKCgH57e35/f4GCg4KCgoKDg4SEfHx8fHx8fHx9fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fX19fXx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX5+fn5+fn5+fn19gYiHhoKAgYCAfXt6fH5+fXt9f4CBgYGDhoqKh4WBfn19fn18fHp5eHZyb21ubm5qa25xcnJycHFvcXRvbGxubm1oZGZoZWBgWlJVW2FiYF9hY2BbV1VTT1FWXWNiVEtOWV1haG90eX1+fn59fn1+f3+AgYKDhoeJiIaGhoSCgoSDgH5+fH1+f39+fXx8fHx9fn+AgYGAfnt5dnNvamprb3BxcnR0dHJzc3Fydnp/gH56c3JzdXh4dG9ucHJ1dXR0c3V2d3l7f4KBgoKBf39/goKBg4SFhISEhISEhIR8fHx8fHx8fH19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn59fX19fX18fHx8fHx8fHx8fHx8fH19fX19fX19fn5+fn5+fn5+fn+DiYiGhIKCf4CAfnp9f359fH6AgIGBgYKFioqJhoSCf35+fXx8enl4dnJvbWxtbWtqbnBycnNzcW5vcnFsa2xubWllZ2hjXVtbVFdaYWBeXWBlZV9aV1RPU1ddYmFWTE9YX2RqcXV6fX1+fn1+f39/gICAgoOFhYeHhoaHhIKChIOAfn5+fn1/f359fHx8fH1+f4CBgYB9enh2c29qamtub3FydHR0cnNzcnN3e4CAfnlzcnN1d3d0b25wcnV1dHRzdXZ2en6BgYKCgoKBg4OEhIOEhIWEhISEhISEhHx8fHx8fHx8fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn19fX17e3x8fHx7e3x8fHx8fHx8fX19fX19fX1+fn5+fn5+fn5+gYWIhoSDgoKAf399en1/fn18foCBgoKBg4SJiYqHhoSBf359fHx6eXd2cm5samxsa2ltcHJzdHVxbnBwcWpqa3BuaWVnaWNbWVpWV11iYFxXXGdrZmFZVFFXWl5iYVdNT1hfZm10dnl9fX5+fX5/gH+AgoGCg4SEhYaGhoaEgYGFhYGAf4B/fX9/fn18fHx8fX5/gIGBgX16d3Zzb2ppa25vcXJ0dHRyc3NzdXl9gIB+eXNyc3V4d3NvbnBydXV0c3N0dXd6gIKAgoKCg4OFhYSFhISEhYSEhISEhISEfHx9fXx8fHx9fX19fn5/f35+fn59fX5+fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5/f35+fn59fXt7fHx7e3t7enp8fHx8fX19fX19fX1+fn5+fn5+fn5+fn6Bh4eGhIKCgYCAf3t6foB/fn1+gICCg4ODhImJioeHhYJ/fn58e3p4d3RybmprbGxqamxvcnJ0dXJtb25raG1ub25rZ2hpY1lZW1lcYGFeVlBaaW5qYlpWWF1dX2NkWk9SW2NqcHZ5e319fn5+fn+AgICAgoKCgoKChYeIhoWCg4aGgn9/gX9+fX5+fXx8fHx8foCAgYGAfHt4dXJuaWlqbnBxcnR0dHJycnJ1eX2AgH55cnFzdXd2cW5ucHN1dHNzdHN2eX6BgoGCgoKEhIWEhoSDhISDgoODg4ODg4N8fH19fHx8fH19fX1+fn9/fn5+fn19fn59fX19fX1+fn19fX1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/fn5+fn19fHx8fHt7e3t7e3x8fHx9fX19fX19fX5+fn5+fn5+fn5+gIOIh4WEgoKBgIB/enp/gH5+fn5/gYKDhIKEh4eHiYeFgn9/f319enh3dHFtamprbGtqa29ycnR0cm1vbmlrb29wb2xpaWpkW1lcXV9iYFtRUFxpb2lhWlpgZ2RjZWZdVVleZ250d3p8fX1+fn5+gIGBgoGDgoKCgoKFhoiHhoOEhoaCf3+Bf35+f359fHx8fHx+gICAgH57end1cm5paWpucHFydHR0cnJycnV5fYCAfnhycXN1d3Rwbm5wc3V0c3Nzc3V6gIGBg4KChIWFhYSFhIKCg4GBgYGCg4KDg319fX18fHx8fX19fX5+f39+fn5+fX19fX19fX19fX5+fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39+fn5+fX1+fnx8e3t7e319fHx8fH19fX19fX19fn5+fn5+fn5+foCChYiFhIOCgoGAgH96en+Afn19fn6AgYKCgoOFhoaIiYaCf4GAfXx6eHZzcW1qaGpqa2prb3FydHNxbm1ra29xcHBwbGpqa2ZdWlxgYWNgV05UX2tvamFcXWRtbGdoZ2BZXGJqcXd5enx9fX19f3+AgoKDg4SCgoGBgYSEhoeGhISGh4SAf4B/fn5/fn18fHx8fH6AgH9/fnt6d3Vybmlpam5wcXJ0dHRycnJzdnp+gYB9d3Jxc3V2dHBtbnBzdXRzcnN0dXuAgYGEhISFhYWFg4OCgYCBf359f4KCgoODfn59fXx8fHx9fX19fn5/f35+fn59fXx8fX19fX19fn59fX19fn5+fn5+fn5+fn5+fn5+fn5+fn5/f35+fn59fX19fHx7e3t7fHx8fHx8fX19fX19fX1+fn5+fn5+fn5+gISFh4SDgoKCgYCAf3p7f4B+fHx+fn9+foGBgYOFhIeJhoJ/gYF+fHp4dnNwbGpnaWlsbGtucXJ0dHFtbWtucnJycHBsamtsZV5cXmFiYl1RTFdkbW9qZF9fZW9vamtoYVtfY2xyd3l6fH19fHx/f4GCg4SDhIKCgYGCg4SGiIiEhIWJhoF/gIB+fn9+fXx8fHx8foCAf399enl2dXJuaWlqbnBxcnR0dHJycnR3en+BgH12cnFzdXZ0cG1tcHN1c3Nyc3V3fICCgoSEhISFhYSCgYB+fH58e3uAgoOCgoJ9fX19fHx8fHx9fX1+fn9/fn5+fn19fX19fX19fX1+fn19fX1+fn5+fn5+fn9/fn5+fn5+fn59fX9/fn5+fn19fHx7e3x7e3x8fHx8fHx8fX5+fX1+fn5+fn5+fn5+fn+DhoeFg4KBg4KBgH99eXl/gX98fHt8enp6fX5+gYGChoeGg4KCgX5+e3p3cW5taWdoam1ubW5xcnR0cm5sbXFycHBvcGxqa2tlXVxgZGVhWU5RXGZubmpmY2Fmb29pamlgWVxkbXR4enp8fX19fX5/gIGEg4WFg4KCgoGBg4WKi4iEhoiIg4B/f31/f359fHx7e3t+f39/fnx6eXd2c29ramtub3FydHR0cnJyc3d7f4CAfHVxcXN1dnJvbW5xc3V0c3Nzdnl/gYODhISEhISEhIGAe3l7fHx5e4CCgoCBgX19fX18fHx8fH19fX5+f39+fn5+fX19fX19fX19fX5+fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39+fn5+fX18fHt7fHt7fHx8fHx8fHx9fn59fX5+fn5+fn5+fn5+gISIiIWDgoGDgoGAf315en+BgH19e3t6eXl5ent9foCCiIeDg4KAfX18e3dxbm1qaGlrb3Bwb3JzdHR0cW5vcnFwb29wbmxua2JaXWJmZV9WUFZgaG1saWdkYmdwbWZmaGFYWmNudnh6enx9fX19fn5/gIKBg4OBgYCBgYCDhIiJiYWGiImFgYB+fX9/fn18fHt7e35/f39+e3p4d3ZzcGxqa25vcXJ0dHRycnJzeHx/gIB7dXFxc3V2cW9tbnJzdHRzc3N2e4GCg4OEhISDg4OBfXl1dnh6e3l8gIKDgYCAfX19fXx8fHx8fX19fn5/f35+fn59fX19fX19fX19fX18fHx8fn5+fn5+fn5+fn5+fn5+fn5+f39/f35+fn59fXx8e3t8e3t8fHx8fHx8fH1+fn5+fn5+fn5+fn5+fn+BhYiHhIOCgYOCgYB/f3t7f4F/fXx6eXh3d3d3eXt8fH+GhoSEgoF+fX17eHFubWtpaWtvcXNxcnNzc3RzcXJzcXFxcXBwbm9sX1ldZGhlXVVSXGZrbmxpZ2ViaHBrY2JmYltcZHB2eXt6fH19fX1+fn5+f3+AgYGBgIGBgIKDhIeJh4aHiIaDgX9+f39+fXx8e3t7fn9/fn17eXh2dnNwbGprbm9xcnR0dHJycnR5fH+Af3p1cXFzdXVwbWxucnN0dHNycnh+goODg4ODhISBfnx3cnJ0d3p7eXyAg4KBfn59fX19fHx8fHx9fX1+fn9/fn5+fn19fX19fX19fX18fHx8fHx+fn5+fn5+fn19fn5+fn5+fn5/f39/fn5+fn19fHx7e3x7e3x8fHx8fHx8fX5+f39+fn5+fn5+fn5+gICHiYeEg4KBg4KBgH9/fHuAf359fHp4eHd2d3d5e3x9f4KEhYWCgX59fXt4cW5ta2lqa29xc3N1dHRzdXNzdHNwcXJzcnFwb2xgWl9maGVdVFdhaG5wbWlnZWRpb2liYWVjXmBncHZ5e3p8fX19fX59fXt8fH6AgYGAgICAgYKDhYiJhoeHhoSDgYB/f359fHx7e3t+f39+fHp4d3Z2c3Bsamtub3FydHR0cnJydXl8f4B/enVxcXN1dXBsbG5yc3RzcnJye4CDhIODg4OEgn97dnNubnN3ent5fYKEgoF/fnx8fX19fXx8fX5+fn5+fn5/f35+fn5+fn19fX18fHx8fX19fX5+fn5+fn5+fn5+fn5+fn5/f35+f39+fn59fX18fHx8fHx8fH19fX19fX1+fn5+fn5+fn5+fn5+f3+BhIiHhYODgYCDgYKAf4B+foB+fH58eHh4eHZ2dXd7fHx/goSFg4J/fXx8fHlybm1ra2tscHJ1dXZ0dHR0dHV2dHFydHNycnFwaWBbYWptZFtVW2RpbW5rZ2RkZ2xtaWNkZmNhZGpxdXl8fH1+fn5+fn18fHt8foGBgYCAgICBgYKDhYaGhoaGhoSCgH5/fn17enp6e31/fn17enh4d3Z0cW1rbG1vcXNzc3JycnJ1en1/f395c3BxcnR0cGxsb3F0c3NycXR8gIODgoKCgYJ+eHRxcG1ucnh5ent/gYSBf318fX19fX19fXx+fn5+fn5+fn9/fn5+fn5+fX19fXx8fHx9fX19fn5+fn5+fn5+fn5+fn5+fn9/fn5/f35+fn19fXx8fHx8fHx8fX19fX19fn5+fn5+fn5+fn5+fn5/gIOGiIaEg4KBgIOCgoB/gYCAgX18fXp4eHh4dnZ1d3p7fH+BhIWEgn99fHx8enJubW1tbG1xc3d3dnR1dXR0dnVzcnJ1dXNycXBpX1xkbW5lW1hfZmttbWpnZGVobGxpZGZnZWNnbHF2e3x9fX5+fn5+fHx8enx+gYGBgICAgIGAgIGDhYaGhoeIhoOBfoB/fXx7enp7fX5+fXt6eHh3dnRxbmxsbW9xc3NzcnJycnZ6fX+AfndycHFydHRwbGxvcnRzc3Jyd36Cg4OCgYGBfnhyb29tbW5yeXl6fICBg4B+fHp9fX19fX19fX5+fn5+fn5+f39+fn5+fn59fX19fHx8fH19fX1+fn5+fn5+fn5+fn5+fn5+f39+fn9/fn59fX19fHx8fHx8fHx9fX19fX1+fn5+fn5+fn5+fn5+foCAhIeHhYOCgYCAg4KBgH+BgYKAfXt8enh4eHh2dnV2enx9fn+DhYSCf318fXx6cm5tb29ub3J0eHh3dnZ2dHR2dHNyc3V1c3JxcGpfXmZub2deXWRpbG5tamZlZmlra2hoaGhmZWltcXV6fH19fn5+fn58fHt6fH6BgYGAgICAgICAgIGDhIWFiImHhIB+f4B+fHt6ent9fn5+fHp4eHd2dXFubG1ucHFzc3NycnJydnp+f4B+d3JwcXJ0c29tbXBzdHNzcnN5gYODg4KCgX54dHBvbm1sbXN5ent9gIOCf357en5+fX19fX19fn5+fn5+fn5/f35+fn5+fn19fX18fHx8fX19fX5+fn5+fn5+fn5+fn5+fn5/f35+f39+fn19fX18fHx8fHx8fH19fX19fX5+fn5+fn5+fn5+fn5+f4CFh4aFg4KBgICDg4CAf4GCgX58e3t5eHh4eHZ2dHZ5e3x+foOEhIJ/fXx7e3tzbmxvcXFycnV5eXh3dnZ0dHVzcnJ0dnVzcnFxamBgZ25xaWNjZmttbmxpZmVnaWlpZ2pqaGZnam1xdnl7fX1+fn59fXx7e3p7foGBgYCAgICAgIGAgYODhISHiYeEgX1/f359e3p6e31+fn58enh4d3d1cW5sbW5wcXNzc3JycnJ2en5/gH51cHBxcnRyb25ucHN0c3JxdXuCgoODg4N/enRxcXBvbmxtdHp6e36AgoJ/fXp5fn5+fn19fH5+fn5+fn5+fn9/fn5+fn5+fX19fXx8fHx9fX19fX19fX19fn5+fn5+fn5+fn9/fn5/f39/fX19fX19fX18fH19fX19fX19fn5+fn5+fn5+fn9/fn9/g4eIhYKCgYGBgYKCgYB/gYKBfnx6e3l4eHh4dnZ1dnh6fH19goSDg4B9ent8eXRvbXByc3R1d3t7enh3dXR0dnRycnV1dHRycXJtZWRqb29sZ2hrbm9uaWdmZWdoZ2dpbWtpZ2psb3F2enx8fX59fn59fXt7ent9f39/fn6AgICAgH+AgYKChIaHhoSBfX6Af317e3t7fH59fHt6eHh3dnVwbm1tb3FxcnNzcnJydHh8f4B/fnZxcHFzdHFubG1wc3NzcnJ4f4KDg4GBgHl0cnBvbm5tbG5zd3l7f4GCgX57enl+fn5+fX18fn5+fn5+fn5+f39+fn5+fn59fX19fHx8fH19fX19fX19fX19fX19fn5+fn5+f39+fn5+fn59fX19fX19fXx8fX19fX19fX1+fn5+fn5+fn5+f39/gIKFiIeEgoGAgICBgoKBgH+BgoB9e3l6eHd3eHh2dnZ2dnV0dXuChYSDgH16e3t6dm9tcHN1d3h7e3t8end2dXV2dXR0dHRzcnJxcm5oZ21wb25qa21wb2tlZWRjZGZjY2ptbGppa25wc3d6fHx9fX1+fXt7e3p5e31+f39+fn5+f3+AgIGBgYKEhYWFhIF+fn9/fnx7e3t8fn18e3p4eHd2dXFubW1vcXFyc3NycnJ1en1/gIB8dHFwcXN0cW1sbXBzc3Nyc3qAg4ODgX16dHFxcG9ubGtsb3R5eXt/gYKBfXp5eX5+fn5+fXx+fn5+fn5+fn5/f35+fn5+fn19fX18fHx8fX19fX19fX19fX19fX1+fn5+fn5/f35+fn5+fn19fX19fX19fHx9fX19fX19fX5+fn5+fn5+fn5/f4CBhIaIhoOBgX9/f4GCgoGAf4KDgXx5d3h4d3d4eHZ3d3Z0b21ueYKFhIOAfXp5enp3cW5xc3V3en19fX18eHd2dnZ1dnZzc3FwcG9xb2pqb3BwbWxtcHFvaGJhY2JhYmFkam1sa2ttb3F1eHt8fH18fX19enp6enl6fX5/f35+fX1/f4CAgYGBgoOEhISEg39+f4B/fXt7e3x9fHt7enh4d3Z1cW5tbnBxcXJzc3JycnV6fX+Af3t0cXBxc3RwbGxtcHNzc3J1e4GDg4OBenNwcG9vb25ram1wdnp7fYCCgoB9enh4fn5+fn5+fX5+fn5+fn5+fn9/fn5+fn5+fX19fXx8fHx9fX19fX19fX19fHx8fH5+fn5+fn9/fn59fX19fX19fX19fX18fH19fX19fX19fn5+fn5+fn5+fn9/gIGFh4iGg4CAf39/gYKCgYB/goSBe3h2d3h2dnh4d3h4eHNsaWp0gYWEg4B9enl6enl0cXB0dXd7fYB/fn16eXd3dnZ1dXNzcXBvbnBvbG1wcXFtbm9xcXBmX2BhYWJhX2Rqbm5rbG9xcnV4e3x9fX19fXx6enp6eXp9fn9/fn5+fn9/gICBgYCBgoODhISDgH9/gH99e3t7fHx7e3t6eHh3dnVxbm1ucHFxcnNzcnJydXp9f4B+enRxcHFzdG9sbG1wc3Nzc3d+goODg4F4cW9vb29vbmxrbXF4enx+gYKCf3x5d3d+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn59fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn9/f4CBg4eJhoOBf39+fn+Cg4KBfn+DhYF8eXd3dnZ2d3l4eXh4cW1qanKAhoSCgX15enp7eXZzcXR2eXx+f4F/f3l4d3Z2dXRzc3Nwb25sb3Fvb3Jyb21tcHJxbWRfX2FhYWBfZmxvbm1ucHBydnh8fX19fX18e3t7enp6e31+fn9+fn1+gICBgIGBgYGAgYKFhYWBfn+AfXt6ent8fHt6enp4eHd2dXJvbW5xcXJzc3JxcXJ1en2AgH55c3FwcXFxbmtrbXFzc3R1e4CDhISDf3Rwb29vb21sa2pudHd5fH+BgYB+eXh3d35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f39/gIKFiIiGg4GAfn1/gIKEgoB/gIOFgHx5d3d2dnZ3eXp5eHdxbWpqcX+GhYKBf3x8fHt5eHZzdXh7fH5/gYB/enl4d3Z2dHRycm9ubWtvcnFxc3JvbW5wc3FuZF9fYWNiYGRqbG9tbW5wcXN2enx9fX19fXx7e3t6ent7fX5+f35+fX6AgIGAgYGBgX+AgYSFhYJ+fn99e3p6e3x8e3p6enh4d3Z1cm9tbnFxcnNzcnFxcnV6fX9/fXh0cHBxcXFua2tucXNzdXd9goOEhIJ8cm9ubm5ubWxram51d3l8f4GBgH55eHd3fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn59fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/f3+Ag4eIhoSEgYB+fn+Bg4OCgICBhISAe3l3d3Z2dnd4eXh3dXFtbGxwfYWFgoGBf39/fXt6d3V2d3p8fn+BgH98e3p4dnZ1dHJxbm1tbXBzc3R0c3Bub3Jzcm5mYmJjZGNjZ2xucGxsb3FydHd6fH59fX19fHt7e3p6e3t9fn5/fn59foCAgYCBgYGBf39/goSFgn1+f3x6enp7fHx7enp6eHh3dnVyb21ucXFyc3NycXFzdnp9fn58d3RxcHFxcW5ra25xc3N2eoCEhIOEgnhwb25ubm5tbGtqbnV4en2AgYGAfnl4d3d+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn19fX19fX19fX19fX19fX19fX19fX19f39+fn5+fn5+fn9/f4CEiYiFg4SBf359gIKDg4F/gIGFg397eXd3dnZ2d3h5dnV1cm9tbm96hIaCgYGAgIB+fXt6d3d3ent+f4GAf3x7enl3d3Z0dHBtbW5wcHN1dnZ1cG9wcnRzbWhkZGNkZGVna29wbWxvcXJ0eHt9fX19fX18e3t7enp7e31+fn9+fn1+f4CBgIGBgYF+fn6AgoOCfn5/fHl6ent8fHt6enp4eHd2dXJvbW5xcXJzc3JxcXN3en1+fnx3c3BwcXFxbmtsb3Jycnh9g4SEg4SAdW5tb29tbW1sa2pudXl7foGCgoB+eXh3d35+f39+fn5+fn5+fn5+fn5+fn5+fn59fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn19fX19fX19fX19fX19fX18fn5+fn5+fn5+fX1+fn5+f39/goaHhoWDgn99fX+Bg4SDgYB/gYSBf3t5d3d2dnV3eHh1dHRzcXBtbnuFhoOAgYCAgH9+fHp4d3h5e31+gH9+e3l5eXh2dXV0cW5ucHJzdHZ2d3ZzcXBydXRwaWRkZGVlZWhtcG9tbnByc3V6fH19fX18fHx7enp6enp7fX5/f359fn5/gICAgICAgH9+fn5/gYF+fn57eXh4e3x8e3p6eXl4d3d0cW9ubnBxc3NycXBxdHh7fXx8fHZycHBwcG9tbGxvcnN1en+Cg4SDhH5ybmxub21tbGtra250eHp/gYCAf3t5eHZ2fn5/f35+fn5+fn5+fn5+fn5+fn5+fn19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fX19fX19fX19fX19fX19fXx+fn5+fn5+fn59fX5+fn5/f4CEh4iFhIKBfnx+gIKDhIOBf3+BhIF/fHl3d3Z2dnd3dnRyc3Z2c29we4WGg4GBgYGBfn18enh5eXl5eXx+f358enp5eHd2dnVycHBydHV0dnZ3d3VzcnN1dnJrZmVlZWVmaW9xcG5wcXN0dnt8fX19fXx8fHt6enp6ent9fn9/fn1+fn+AgICAgICAf35+f39/gX9/fnx7eXl7fHx7enp5eXh3dnRxb25ucHFzc3JxcHF0eXx9fHx6dXFwcHBwb21sbG9ydHd8gYOEhIOCe29sbG1ubW1sa2trbnR4e3+BgIB/e3h3dnZ/f39/fn5+fn5+fn5+fn5+fn5+fn5+fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn59fX19fX19fX19fX19fX19fH5+fn5+fn5+fn19fn5+fn9/gYWJh4WDgX99fH6AgoOEhIF/f4GEgYB9eXd3dnZ3dnZ1cnJyeHp1c3N9hYaEgYKBgIB/fnt6enp6eXp6fH1+fXx7enl4d3Z3dnNycnN1dnZ3d3l5eHZzdHZ2c25qaGdmZWdpcHFwcHBydHV3e3x9fX19fHx8e3p6enp6e31+f39+fX5+fn+AgICAgICAf3+AgH+AgH99fnx6ent8fHt6enl5eHd1dHFvbm5wcXNzcnFwcXR5fH18fHl0cG9wcG9ubWxtcHN0d3yCg4SEg393bGxsbW5tbWxra2tvdnp8f4GAgH56eHZ2dn9/fn5+fn5+fn5+fn5+fn5+fn5+fn59fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn19fX19fX19fX19fX19fX18fn5+fn5+fn5+fX1+fn5+f3+BhomGhIOAf317foGChISDgH5/g4SBgH15d3d2dnd2dnRxcXJ6fXl3eH6FhoSCgoKAgH59e3p6eXt7e3t9fn18fXx7eXh4d3d3dXR0dXZ4eHh5e3p6d3N0d3d0cGtqaWZmZ2lwcXBxcXJ1dXd8fHx9fX18fHx7enp6enp7fX5/f359fn59fn+AgICAgIGAgICBf4B/fn18e3p6e3x8e3p6eXl4d3V0cm9ubnBxc3NycXBxdHl8fXx8eHNwb3Bwb21tbG5wc3Z5foOEhISCfnRsa21tbm1tbGtram92e36AgoGAfnp3dnZ2fn5+fn5+fn5+fn5+f39+fn5+fn59fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn19fX19fXx8fX1+fn1+f39/f39/fn59fX5+fn5/gYWIiIWEgYB9fH1/goSEhIJ/fn+Cg4B/fXh3d3Z3d3Z1cm9wc3l9e3x9gIWHhoKCgoB/fn18enp5enp8fHx9fn1+fnx7enl4eHh2dXZ2dnd3eXl7fH17d3Z2d3d0b21qaGdpa3FxcXFzdnZ3enx8fX19fX18e3p7enp6ent8fn9/fn5/f35/f3+AgIGBgYCAgIGAf399fXt6enp8e3t6e3t6eHZ0dHRzcW9vcHFycnJyb3J2e319fHp1cm9vb29ubWxtbnBydnuAgoOEgoB7cGxsbW1tbGtramlscXh7f4CBgYB9eXV1dHZ+fn5+fn5+fn5+fn5+fn5+fn5+fn19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fX19fX19fHx9fX5+fn5/f39/f39+fn5+fX1+fn6BhoiHhYOAfnt8foCChIWDgn9+f4KCgH9+eXd4d3h3dXRycG9xd3p8foCBg4eGgoCAgIB/fXt6e3t7e3x8fH1+fn5+fHt6enl4eHd3d3d3eHh6enx9fXx4d3Z3d3ZzcG1raWptcnJzcnV3d3l7fHx9fX19fXx7ent6enp6e3x+f39+fn9/f39/f4CAgYGBgICAgH9+fnt7fHt7e318e3p7e3p4dnR0dHNycG9wcXJycnJwcnd7fHx8eHRxb29vb25tbG1ucHJ4fYGCg4SCfnZubGxtbW1sa2tqaWxzeHx/gYGBf3x4dXV0dn5+fn5+fn5+fn5+fn5+fn5+fn5+fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn59fX19fX18fH19fn5+fn9/f39/f35+fn59fX5+f4KHiIeFg398e35/gIKEhYOBfn2AgoF/gH98eHh4eHh2c3NwbW90d32AgYCBhoaDgICAgH9+e3p7e3x8fHx8fX5+fn58e3p6eXh5eHh4d3h4eHp7fH19fHl4dnd3d3VycG5sbW5zdHR1dnl5eXx8fH19fX19fHt6e3p6e3p7fH5/f35+f39/f35+gICBgYCAgIB/f318eHp7fX17fHx8e3t7enh2dHNzc3Jwb3BxcnJycnJ0eHt9fHp3cnBvb29vbm1sbW5wdHl/goODg4F8c21sbG1tbWxra2pqbXN4fICCgYF+e3Z1dXR2fn5+fn5+fn5+fn5+fX1+fn5+fn59fX19fX19fX19fX19fX19fn5+fn19fX19fX19fX1+fn5+fn5+fn19fX19fXx8fX1+fn5+f39/f39/fn5+fn19fn5/g4iIhoWCfnt7fn+AgoSFg4F+fYCDgX6Af3t4eHl5eXZ0cW9tbnJ4fH+Af4CDhoSBgYCAgH99e3t7fHx8fHx9fn5+fnx7enp5eHl5eXh3eHh4enp8fX18e3p2d3d4dnNycXBwcXR1dXd4e3t6fXx8fX19fX18e3t7ent7ent8fn9/fn5/f39/fn6AgIGBgICAf39+fHp1dnp+fnx8fXx7enp6eHZ0cnJzcnBvcHFycnJycnV4fXt7enVxb29vb29ubWxtbnB1fH+Cg4SDgXlxbWtsbW1tbGtramptc3l8gIKCgX16dXV1dHZ+fn5+fn5+fn5+fHx+fn5+fn5+fn5+fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fX19fX19fX19fX19fX19fX5+fn5/f39/f39+fn5+fX1+fn+EiIeGg4B+fHx/f3+CgoSDgX9/gYOBf4CAfHh4enp5eHVxb21tcnd8f318fIOGhICAgYGAf4B/fn5/f35+fn5+fn58fXt6eXp5enl5eHh3d3h5e31+fn18e3d3dnZ4eHZ0c3FzdXV2d3p8fHt9fn59fX19fXx8fHt6enp7e31+f39/f39/f399fX9/f39/f4B/fXx7eHV1eX5/fn17e3p6enp4dnRycnNzcXBwcnJycXFydXl8e3t5dHFvb29vb29ta21ucXV7gYGDgoB/eXFta2xsbWxra2ppaW50eX2BgoKBfHh2dnZ1dn5+fn5+fn5+fn59fX5+fn5+fn5+fn59fX19fX19fX19fX19fX19fX19fX19fX19fX19fn59fX19fX19fX19fX1+fn19fn5+fn9/f39/f35+fn5+fn5+gYaHhoWCf318fH9/f4KCg4F/gIGDg4B/gIF/e3p6enp5dnNwbmxxdnt+fXp3gISDgICAgICAgICAgIGBf3+AgH5+fnx8e3p5enl6eXp4eHd3eHp7fX5+fn17enh3d3p6eHd1dHV2dnl5e319e319fX19fX19fHx8e3p7e3t8fn5/f39/f39/f35+f39/f39/gH58fHx5dnZ6foGAf317enp6enh2dHJyc3NxcHBycnJxcXJ3e3x7endzcG9vb29vbm1rbG9yeH2CgYOCgX53b2xrbGxtbGtramlpbnR5fYGCgoF8eHZ2dnZ2fn5+fn5+fn5+fn9/fn5+fn5+fn5+fn19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn19fX19fX19fX19fX5+fX1+fn5+f39/f39/fn5+fn5+fn+Dh4aFhIF9fH19f39/goKDgX+Bg4SCf36AgYF8eXt6fHp3dXBvbXF2e31+e3d+goKBgICAgICAgIGBgYGAgICAf39+fHt6enl5eHl5enl4d3d4ent9fn5+fXt8enp5ent6eXd3d3h5e3x9fX16fHx8fX19fHx8fHx8e3x8e3x+fn9/f39/f39/f39/f39/f3+Afnx8fXx5eHp9gYGBfXt6enp6eHZ0cnJzc3FwcHJycnFxc3h7fXp5d3Nvbm9vb29tbGtrbnN8gIKDgoGAfHRua2tsbG1sa2tqaWludHh8gIGCgHt3dXV1dXV+fn5+fn5+fn9+fn5+fn5+fn5+fn5+fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fX19fX19fX19fX19fX19fX5+fn5/f39/f39+fn5+fn5+f4OHhoWDgHx9fn5/f3+CgoOBgIKEhIJ/foCBgXt5e3x9e3l2cnBvcnd6fH18e32CgoKAgICBgICAgYGCgoGBgYGAgH58e3p6eXl4eXl6eXh3d3l6fH1+fn59e3t6e3t6fHt5enl5enx+f358fHp7fHx9fX18fHx8fH18fHx7fX5+f39/f39/f39/f39/f39/f4B+fHx8fHt5en2ChIJ9e3p6enp4dnRycnNzcXBwcnJycXF0eXt8eXh2cm9tb29vb21sa2ptc32AgoOCgYB7cm1sa2xsbWxra2ppaW50eHyBgoJ/e3d1dHR0dH5+fn5+fn5+fn5+fn19fX1+fn5+fn5+fn19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx9fX5+fn5+fn5+f39+fn5+fn5+fn+AhYeFhYN/fHx9fYCAgIGDhIKCg4eEgX9+gIGCfXp6fX17end0cW9ydnp7fHt8f4KDgn+AgH+AgICBgYGBgICAgH9/fnx7enp5d3d5eXt6eXh3eHx9fn9+f359fHx8fHx8fHx8e3p7fn9/fHp7eXl6fH19fHx9fX19fX19fX1+fn5/f39/f39+f35+f3+Af39/f399fXt7fHp7f4KCgX56eXl5eHh3dXNxcnRycXFzcnJycnZ6fHx6eHRycG5ubm9tbWtpam51fYCDg4KAgHlybWtsbW1ta2trampqb3V6foGBgX15dXR0dHR0fn5+fn5+fn5+fn5+fX19fX5+fn5+fn5+fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fH19fn5+fn5+fn5/f35+fn5+fn5+f4GFh4WEgn97fHx+f3+AgYOEg4OGiIOBfn1/gIF9eXl9fnx7eXZyb3J1eXl5e31/goSDf4CAf4CAgICAgICAgICAf39+fHt6enl3eHl5e3t5eHd5e3x+f35/fn5+fn5+fX18fXx7enx+f357eXp5eXp8fX18fH19fX19fX5+fn5+fn9/f39/f3+Afn6AgIF/f39/f319e3t7fHx/goJ/fXp5eXl4eHd1c3FydHJxcXNycnNzdnp8fHp4c3Fwbm5ub21ta2pscHh/gYODgoB/eHFsa2xtbW1ra2tqamxwdnt/gYGBfXh0dHR0dHR+fn5+fn5+fn5+fn59fX19fn5+fn5+fn59fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5/f39/f39+fn5+fn5/gYSGhIOBfnx8fX5/f4CBg4SDhIiIhIF+fX+Afnp3eHx/fXx6d3NxcnR3eHh7fX+DhISAgIB/gICAf39/f4CAgIB/f358e3p6eXl5eXl7e3p5eHh4e31+fn9+fn5+fn5+fX19fHx8f399fHl4eXl6enx9fXx8fX19fX19fX1+fn5+f39/f39/f4CAgIGBgoB/f35+fX17e3x9fX+BgH17enl5eXh4d3VzcXJ0cnFxc3Jyc3R3e3x8endzcXBubm5vbW1ra2xyeoCBgoOCgH12cWxrbG1tbWtra2pqbHB2en+BgYF8dnRzc3Nzc35+fn5+fn5+fn5+fn19fX1+fn5+fn5+fn19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn59fX5+fn5+foCAf3+AgH5+fn5+fn+BhIaEg4F+fHx+fn5+gIGDhIOGh4aDgX18fn97d3Z3fH9/fXt4dHJxdHV3eXx+gIOFhICAgH+AgIB/f39/gICAgH9/fnx7enp5eXl5eXt7enl4eHh7fX5+f35+f39/f35+fn59fX5/fnx5eHh6eXp6fH19fHx9fX19fX19fX5+fn5/f39/f39/gIGCg4OCgX9/fX19fXx8fX5+gIF/fXt6eXl5eHh3dXNxcnRycXFzcnJydHd8fHx5d3JvcG5ubm9tbWtrbnR8gYKCg4KAfHVwa2tsbW1ta2tramptcXd6f4GBgXx2dHNzc3Nzf39/f35+fn5+fn5+fX1+fn5+fn5+fn5+fn5+fn19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX19fn5+fn5+fn5/f39/fn5+fn5+f4CDhYSCgH58fX1+f39/gIGDhYeIhIJ/fHt+gHt2dHR5gH9+e3l1c3JydXh6fX+AgYSEgH9/f39/f39/f39/f39/f399fXt7e3p6enh4eHp7enh3d3l9fn9/fn5/f39/f359fX19fn9/e3h4eXt8fXt9fXx8fH19fX19fn19fn5+fn9/f39/f39/gYKDhIKCf359fXt8e3t9fn+BgYB9fHl6enh4eXd1c3FzdHJxcXNycnN1ent8fHp2cm9vb29vb21sa2pud36Bg4KDgn96dG5samtsbGxqamppaW1ydnyAgYKBe3ZzcnJycnJ/f39/fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fX1+fn5+fn5+fn9/f39+fn5+fn5/gIOFhYJ/fXx+fX5/f3+AgYSGh4eDgX98fH6Ae3Z0dXh+gH98end0cnF1eXt+gH+Ag4SAf39/f39/f39/f39/f39+fn19fHx7e3p6eHh4ent7eHZ2eHx+f39+f4CAf39/fn19fX19fX15eHl7fH5/fX59fHx8fX19fX19fX1+fn5+f39/f39/f3+BgYOEg4KAfn19fHt7e31/f4GBgH18eXp6eHh5d3VzcXJzcnFxc3Jzc3Z7e3t7eXZxb29vb29vbWxra3F5gIKDg4SCf3lybmxqa2xsbGpqamlpbHJ3fYCBgoB7dXNycnJycn9/f39+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn59fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fX5+fn5+fn5+f39/f35+fn5+fn+Ag4WFgn58fH59fn9/f4CChYaHhoKAfn59foB8d3V2eX6AgH17eHVycXV5e32Afn6AhIB/f39/f39/f39/f39/f35+fX18fHt7enp6enp7e3t4d3Z3e35/f35+f3+AgH9+fX19fX18fHl4eXt9f4B+fn18fHx9fX19fX19fX5+fn5/f39/f39/f4CCg4SEg4B/fX18e3t+f39/gYGAfnx5enp4eHl3dXJwcXJycXFzcnN0d3t7e3t4dXFvb29vb29tbGttdHuBg4ODhIF+eHBta2prbGxsampqampscnl+gIGCfnl1cnJycnJyf39/f35+fn5+fn5+f39+fn5+fn5+fn5+fn5+fn19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX19fn5+fn5+fn5/f39/f39/f39/f4CDhYSBfXt8fn1+f39/gIOFhYeFgn9+fn1+gH14dXZ5foCBfnx5dnNydXp8fX59fICEgH9/f39/f39/f39/f39/fX19fX19e3t6enp6ent7e3h3dnd6fX9/fn+AgH9/f359fX19fXx8eXl5fH6BgYB+fXx8fH19fX19fH5+fn5+fn9/f39/f39/gIGDhIWDgIB9fXx7fYCAf3+BgYF+fHl6enh4eXd1cXBxcnJxcXNyc3V5e3t6enh0cW9vb29vb21sa250e4KDg4GCgX13cG1ramtsbGxqampqam1zen6AgYJ9eHVycXFxcXF+fn5+f39/f39/fn5/f35+fn5+fn5+fn5+fn5+fX19e35+fn59fX19fX19fn5+fX19fX19fXt8fHx8fHx8fHx8fX1+fn5+gIB+fn5+fn5/f4B+fH9+gISEg4J+e3x8fX9+f36Bg4WHh4N/fn5+fH6AfXh2d3l9f4B+fXp3dHV4e3p7fXt5e4KCgIB+fn5+fn5+fn5+fn5+fn5+fn58e3t6e3p4e3x7eXh3eHh6fX1/f39/f39/fX5+fX1/fnt5ent/gYOCgH9+fn59fXx+fX19fX19fX5+fn5/f35+f3+AgYSEhISCgX59f3+AgX9/foCBgX98enp6eXh4d3Vxb29wcnJycnJzdnt8fHp5dnNwb29vb29ubGtrbnZ+goSEg4GBfHVwbGtra2xsbWtra2lqb3R6foCAgHt4dXNycXFxcn5+fn5/f39/f39+fn9/fn5+fn5+fn5+fn5+fn59fX17fX19fX19fX19fX1+fn59fX19fX19e3x8fHx8fHx8fHx9fX5+fn5/f35+fn5+fn9/gH99f3+Bg4SEg397fHx+f35/foGDh4iGg4B+fn58foB9d3V2eX1/gH59fHh1d3p7eXp7eXd4gIKBf35+fn5+fn5+fn5+fn5+f39+fnx8fHp7enh7fHx7eXh3dnh7fX5+f39/f399fHx9fX58e3p6fYCDg4KAf36AgH59fH19fX19fX19fn5+fn9/fn5+foCBhISEhIOBgH2AgH9/fn9/gIKAf3x7enp5eHh3dXFvb3BycnJyc3R4e3x8enh1c3Bvb29vb25sa2tweX+Eg4ODgX97dG9sbGtrbGxta2traWpwdXt/gICAe3d0cnFxcXF0fn5+fn9/f39/f35+f39+fn5+fn5+fn5+fn5+fn19fXt9fX19fX19fX19fX5+fn19fX19fX17fHx8fHx8fHx8fH19fn5+fn5+fn5+fn5+f3+Af35+foCEhISDgn58fH5/fX5+goWJiYWDgX9/fnx+gH11c3V6fH6AgH98eXh5e3t4eXl5d3h+gYB+fn5+fn5+fn5+fn5+fn5/f35+fX19fHx7eXx9fXx5eXh3eHp8fn5/f39/f318fH19fnx7enp+gYSEg4B/f4GBf359fX19fX19fX1+fn5+f39+fn5+gIGEhISEg4GBf4GBf318fn5/gYB/fHt6enl4eHd1cW9vcHJycnJzdXl7fHt5d3RycG9vb29vbmxrbXF6gYSDg4OBfnlzcGxsa2tsbG1ra2tqa3B2fICBgX96dnNycXFxcnR+fn5+f39/f39/fn5/f35+fn5+fn5+fn5+fn5+fX19e3x8fHx9fX19fX19fn5+fX19fX19fXt8fHx8fHx8fHx8fX1+fn5+fn5+fn5+fn5/f4CAfn5/gYSFhYSDgH18fX99fn+Eh4mHhYODgIF+fH6AfHRydXt8fn+Cf314eXt9e3h5eHd3eH2Bf35+fn5+fn5+fn5+fn5+fn9/fn5+fn19fXx6fX58e3t6eXd4ent9fX9/f39/fXx8fX1/fXt6en+DhISDgH+AgYGBgH9+fX19fX19fX5+fn5/f35+fX2AgYSEhISDgYGAgYGAfX1/f4CBgX98e3t6enh4d3Vxb29wcnJycnR2enx9e3d2dHFwb29vb29ubGtvdHyBhIODgoB9d3JvbGxtbG5ubWtra2prcHZ9gIKCf3p1c3JxcXFzdn5+fn5+fn5+fn5/f39/fn5+fn5+fn5+fn5+fn5+fnx8fX19fX5+fn5+fn5+fn59fX19fX18fHx8fHx8fHx8fHx9fX19fn5+fn5+fn5/f3+AgIB+fn+BhYaFhYSBfHx8fn2AgoWIiYWEhISCgX56fYB8dXN3e3x9f4OCfnx8fH98eXh4eHd4fX5/fn5+fn5+fn5+fn5+fn5+f4B+foB/fn5+fXt8fX18fHp6eXl5eXt9fn+AgIB+fX1+fn5+fHp6f4OFhIKAf4CCg4OBgH9+fn1+fn5+fn5+fn59fn58fn+AgoODg4OCgoKCgoJ/foCAf4GBf3x6eXp6eXh2dG9ub3BycnJzdHZ7fHx6dnZzcXBvb29vb25tbG51foKDg4OCgHx1cW9tbGxtbW1ta2pqam1xd3yAgYF/eXRzcnJwcXV4fn5/f35+fn5+fn9/f39+fn5+fn5+fn5+fn5+fn5+fX1+fn5+fn5+fn5+fn5+fn19fX19fXx8fHx8fHx8fHx8fH19fX1+fn5+fn5+fn5+f4CCgn9+gIKEhoWFhoJ9e3x+foOGhoeHhISFhYSBfnp9gH12dHh8fX2Ag4N/fn5+f316d3h4eHl9fn9+fn5+fn5+fn5+fn5+fn5/gH5+gIB/fn5+fH1+fn19ent7enl5e3x9fn9/f359fX5+fn58e3t/g4WEgoB/gIKEg4GAf35+fX5+fn5+fn5+fn19fXx+f4CCg4ODg4OFhIODgYB/gICAgIB/fXt5enp5eHZ0b25vcHJycnN1eHx9e3l2dXNxcG9vb29vbWxsb3h/g4ODg4KAe3Rxb21sbG1tbW1rampqbnJ4fYCBgX54c3JycnByd3p/f4CAfn5+fn5+f39/f35+fn5+fn5+fn5+fn5+fn59fX5+fn5+fn5+fn5+fn5+fX19fX19fHx8fHx8fHx8fHx8fX19fX5+fn5+fn5+fn5/gIODf35/gYSGhoWGg397e36AhYmIhoWCgoWFhYJ/eXx/fnl1eHx+fH+Dg4B/f39/fXp4eHl5e3x+f35+fn5+fn5+fn5+fn5+fn+Af3+AgH9/fX18fX5+fX58fHt6e3t6e3t9f39+fX19fX1+fn17e4CDhYOBgH+AgoKBgIB/fn59fn5+fn5+fn5+fX19fn+AgIGCg4ODg4WGhISCgoOEhIOCgYB9fHp6enl4dnRvbm9wcnJyc3d6fX17eXVzc3Fwb29vb29ta25xen+CgoOCgX94c3FvbWxsbW1tbWtqamtvc3p+gIGBfHdzcnJycXR4e4CAgIB+fn5+fn5/f39/fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn59fX19fX18fHx8fHx8fHx8fHx9fX19fn5+fn5+fn59fX+AgoKAfoCChIaGhYaEf3x7f4GHiYaFgoCCh4eFg4B5fH9+e3Z4fH58f4ODgYB/f399eXh5eXt8fH5/fn5+fn5+fn5+fn5+fn5+f4CAgIGAf399fHx9fn5+fn18e3t7e3p7enx+fn59fX19fX5+fXx8gYOFhIKAf4CCgYGBgH9+fn1+fn5+fn5+fn59fHx+f4KBgIKDg4ODhIaEhIOFiImJhoWFgH19e3t6eXh2dG9ub3BycnJzeHt+fXp4dXNzcXBvb29vb2xrbnN8gYKCgoKBf3dzcG9tbGxtbW1ta2pqa29zen+AgYF8dnNycnFzdXl8f39/f39/f39/f39/f39/f39/fn5+fn5+f39+fn5+fn5+fn5+fn5+fn19fX19fX19fX18fHt7fHx8fHx8fHx9fX19fn5+fn5+fn5+fn5+fX+BgYF/f4GFhYaGhYSBfHx/g4iJhYOAf4KGh4aDf3h5f4B9eHh8fHp8gYKDg4B/fn55d3h5ent9fX19fX1+fn5+fn5+fn5+fn5/f4CAgYF/fnx8fHx+fX1+fnx8fHx8e3p7fHx9fHx8e31+fX18fH2BhIWDgX9/f4KCgoGAgH9+fn5+fX1+fn5+f318fICBgoGCg4ODg4OEhISEhoeLjIyMioiDgH57e3p5eHd0cG9wcXFycnV4fH58enh1cnJxb25ubm1ta2xudX6BgoKCgYF9dXJwbmxsbW1tbW1saWlscHd8gIGBgHt2c3Jyc3V3e35/f39/f39/f39/f39/f39/f39+fn5+fn5/f35+fn5+fn5+fn5+fn5+fX19fX19fX19fXx8fHx8fHx8fHx8fH19fX1+fn5+fn5+fn5+fn59foGBgH9/gYWFhISFhoN/fH+Eh4eCgH5/gYWGhoR/d3d+gX56en19ent/g4OCgH9+fnt4eHl6e319fX19fX19fn5+fn5+fn5+fn9/gICBgX9+fX19fX59fX5+fX19fXx8enp7e3x7e3x6fHx9fXx8fYGFhYOAfn1+gYKCgYCAf39+fn59fX5+fn5/fX1/hISDgoGDg4ODg4ODhISHiIqMjIyKiIWDgX59eXl4d3Rwb3BxcXJzd3p9fnx6eHRycXBvbm5ubW1rbHB4f4GCgoGBgHx1cXBubGxtbW1tbW1paW1yeX6AgYF/enZzcnN0d3l9gH9/f39/f39/f39/f35+f39/f35+fn5+fn9/fn5+fn5+fn5+fn5+fn59fX19fX19fX19fHx8fHx8fHx8fHx8fX19fX19fn5+fn5+fn5+fn59f39/gICChoaDgoSFhYF8f4WHhIB9fH+BhIWGhH91dn2Cf3p6fX16eX6BgoKAf35+fHp4eXp7fX1+fnx8fX19fX19fX1+fn5+f3+AgIGBf359fX19fn19fn5+fn19fHx7e3t7e3t7e3p8fHx9fHx9gYSEgn99fH1/gYGBgIB/f35+fn19fn5+fn99foGGhYSDgIKDg4ODgoKChYiJi42NjYuKh4WFgn97eXl3dHBvcHFycnR4e31+e3l3dHJxcHBubm5tbWtscXqAgoKCgYF+enRyb21sbG1tbW1tbWlpbXJ5foGBgX95dXRzc3V5fH+Af39/f39/f39/f39/fX1/f39/fn5+fn5+f39+fn5+fn5+fn5+fn5+fn19fX19fX19fX18fH19fHx8fHx8fHx9fX19fHx+fn5+fn5+fn5+f31+fn+BgoSGhoKBhIaGg3x/hIaCfXt7foCCg4aEfnR1fIKAe3t+fnp4fH+CgYB/fn57eXh5ent9fX5+e3t8fHx8fX19fX5+fn5/f4CAgYF/fn5+fn5+fX1+fn5+fX18fHt7e3t7e3p7ent7fHx8fH2BhISCf318fX+AgIGAf39/f39/fn5/f39/fX2AgoSDgoGAgoODg4OCgoGEiIqLjI2NjIeFhoeFgn15eXd0cG9wcXJydHl8fX57eXZ1cnFwcG9ubm1tamxxeoCDgoKBgX15c3FubGxsbW1tbW1taWltcnp+gYGBgHl1dXRzdnp+gICAgICAf39/f39/f39+fn9/f39/f39/f39/fn5+fn5+fn19fX1+fn5+fHx9fX19fX19fXx8fHx8fHx8fHx8fH19fX19fX5+fX1+fn5+fn5+fn5+f4CChIWGgYCChYaEfn6DhIB6en1+gICDh4V+dXN5gIB8e358enl7f4GCgYB/f3t5eXh6e319fn58enx8fHx8fH19fn5/f35+foCAgH9/fn19fX5+fn5+fX19fn18fHx8fHp8e3t6ent7e3t9fYGEhIJ/fXx9gICAgH9/gH9/f39+fn9/f399foGDg4F/f3+BhISEhIOCgoSIiYuNjYyKh4WFiIiEfXp4d3Nwb29xcXN2eX19fHl3dXNycG9vb29vbm1rbHJ7gIKCgoGAfnhzcW9sbGxsbG1tbW1ram5ze4CBgYB+eXZ0cnN2fH+BgYCAgIB/f39/f39/f35+f39/f39/f39/f39+fn5+fn5+fX19fX5+fn58fH19fX19fX19fHx8fHx8fHx8fHx8fX19fX19fn59fX5+fn5+fn5+fn5/gIOFhoWAf4GFhYWAf4KEgHp6e31+f4KGhn51c3mAgH18fnx7enp+gYGBgH9/e3p6eHp7fX19fn17fHx8fHx8fHx+fn5+fn5+gICAf39+fX18fX5+fn59fX1+fXx8fHx8e3t6e3p6ent7e31+gYODgX99fnyAgICAgICAf3+AgH9+f39/f31/gIGAfXx8f4GDg4SEg4GChIeIioyMi4qGhIWIiYSAfnl3c3Bvb3Fyc3d6fX18eHZ0c3Fwb29ubm5tbGxudH6BgoKCgYB+eHJwbWxsbGxsbW1tbWppbnR8gYGBgH13dHRydHh9f4GBgICAgH9/f39/f39/fn5/f39/f39/f39/f35+fn5+fn59fX19fn5+fn5+fX19fX19fX18fHx8fHx8fHx8fHx9fX19fX1+fn19fn5+fn5+fn5+fn+AgoSFhH9+f4SFhIJ/gYOCfHp7fX19gYaGfnVzeX+Bfn1/fnt6e3+AgIB/fn58e3t6ent9fX1+fn18fHx8fHx8fH5+fX1+fn6AgIB/f359fXx9fn5+fn5+fX59fX18fX18fHt7enp6ent7fX6BgoKAfnx9foGBgYKBgYB/gICAgH+AgICAfoB/gH99fHx/gYODhISEgoKEh4iKjIuJhoeGhoeJh4SCe3d0cXBxcnN0eXt+fXt4dnNycHFvbm5tbW1rbG92foKBgYGBgH54cW9tbGxsbGxtbW1tampvdXyAgYGAfXd0dHN2en6AgoGAgICAf39/f39/f39+fn9/f39/f39/f39/fn5+fn5+fn19fX1+fn5+fn59fX19fX19fXx8fHx8fHx8fHx8fH19fX19fX5+fX1+fn5+fn5+fn5+f4CBhIWFf35+gYWFg3+Ag4J+e3t8fX2BhoZ+dXN5f4KAf39+e3p7foB/gH59fX17e3p6e319fX5+fXt8fHx9fXx8fn59fX5+foCAgH9/fn19fX5+fn5+fn59f359fXx8fX19fHt6enp6ent9foGCgoB9fH1+gYODhIOBgICAgIGBf4CAgICAgH9/fnx9fX+BgoKEhIOCg4SGh4mMiIeFhoeHiIqKiIR9dnNycXFzc3V6fX58end1c3FwcXBubm1tbGtscHd/goGAgIGAfXhxb21sbGxsbG1tbW1pam92fYCBgYB9d3R0dHd8f4CBgH9/f39/f39/f39/f39/f39/f39/f39/f39/fn1+fn9/fX1+fn5+fn5+fn5+fX19fX19fHx8fHx8fHx8fH19fX1+fn19fn5+fn5+fX19fX19fn5+gIKEhIR/fn+AhIaEgoKDg4B7e3t8foKGhn1zdnl/goGAgH58enx+gIB+fX1+fnx8e3p7e3x9f4KBfnx6enx8fX1+fn5+fn5+fn5/fn5+fn5+fn9/fn19fX19fn59fHx8fn99e3p7eXp6e3t8fn9/fn5+foCBg4SEg4OBgH+AgIGAgICAgIGAgIB/fX19f4GAgYWFhIKCgoSFhoaEg4KHiYiHiIuKhn94c3JycnF0eHx+fXt6dnNycXFwcG5ubWtramtxeX+AgIGAgH99d3FvbmxtbW1tbGxsa2prb3V+gIGBgHt0cnR1eHyAgYF/f39/f39/f39/f39/f39/f39/f39/f39/f39+fX5+fX19fX5+fn5+fn5+fn59fX19fX18fHx8fHx8fHx8fX19fX5/fn5+fn5+fn59fX19fX1+fn6AgoSEhIB/f4CDhoWEhISEgnt7e3x/goeGfnNzd32AgYCAfnx6fH5/f318fH5+fn18e3t6e36BhYWAfHp6fHx9fX19fn5+fn5+fX9+fn5+fn5+f39+fX19fn5+fnx8fHx+fn59e3t6enp7e3x+fn59fn+AgoGDhISDg4KAf36AgIB/f4CBgoGAgH99fX6AgoGChYWEgoKCg4SDg4OBgoWGh4iJiYmJg3x1cnJycXV6fn98enh1cnFxcXBwbm5ta2tqbHJ7gICAgICAf313cG9ubG1tbW1sbGxra2twdn+BgYGBenRydXZ5fYGBgX9/f39/f39/f39/f39/f39/f39/f39/f39/f359fn59fX19fn5+fn5+fn5+fn19fX19fXx8fHx8fHx8fHx9fX19fn9+fn5+fn5+fn19fX19fX5+foCChISEgH9/gIOFhoSFhYaDfHp7fH+DiIZ/dHF1fH+BgIB+fHp7fX5+fHt6fH1/fnx7e3t8f4KGh4F7enp8fHx8fX1+fn5+fn59f35+fn5+fn5/f39+fX5+fn5+fHx8fHx9fn9+fXt7e3t7fH59fX1/gIGCgoSEhIODgn9+fYCBgoF/gIGCgoCAf319foCCg4SGhoSCgoKDgoKChIOFhYOHiImIiYiIgXh0c3Fxdnt/fnx5d3NycHFxcHBubm1ra2ptdHyBgYCBgIB/fXdwb25sbW1tbWxsbGtra3J4f4GBgYB6dXR2eHt9gYGAfn9/f39/f39/f39/f39/f39/f39/f39/f39/fn1+fn5+fX1+fn5+fn5+fn5+fX19fX19fHx8fHx8fHx8fH19fX1+f35+fn5+fn5+fX19fX19fn5+gIKEhISAf3+AgoWGhYWFhoN+ent8f4OJhn90c3Z8gIGAgH58ent8fn57e3l6fH9/fXx8fH5/hIeJhHx7e3x8e3t8fH5+fn5+fn1/fn5+f39+fn9/f35+fn9/f359fX18fH1+f39+fHt8e3t8fnx8foCAgYKChISEhIOCf318gIOEg4OCg4KCgIB/fX1+f4GCg4aGhIKCgYKBgoKEhYWIg4WHh4WIhoqDfHdzcnN3fYB+e3h2c3FwcXFwcG5ubWtram11fYGBgYB/gH99d3BvbmxtbW1tbGxsa2trcnmAgYGBf3h0dHd6e32BgYB9f39/f4CAgIB/f39/f39/f39/f39/f39/f39/fn5+fn59fX19fn5+fn5+fnx8fHx8fHx8fHx8fHx8fHx8fH1+fn+Afn5+fn5+fX19fX18fX19fX5/goSEgoGAgH+AhIaGhYWHg356e31/g4eFgHd3eH1/gYGAf317fH19e3p4eHh8f359fX19gIKGiYqHfnt6enp7e3t7fX5+fn5+fn5+fn5+fn5+f35/f319fn9/f35+fH19fn5/gH9/fXx8fH19fH1+f4GBgIGDg4KDhIF9e3p/g4aGhoWFhoSBgIB+fH1+gICChoaEgYGCgoKDg4WGhYSBg4WFgIeIiYZ+d3Rycnl9gYB7eXZxcHBxcXBwb25ubGxrbnd/gYGBgICAf353b29tbW1tbW1tbWxqaWxzen+AgH9+eXR1d3p9foGBfnt/f39/gICAgH9/f39/f39/f39/f39/f39/f39+fn5+fn19fX1+fn5+fn5+fHx8fHx8fHx8fHx8fHx8fHx8fX5+f4CAf39/fn59fX19fXx9fX19fn+BhISCgYCAf3+DhYWGhoeCfXh5foGFh4WCe3p6fn+BgYCAfXx9fXx7eXd2dnt+fn1+fn+ChIaJi4mBe3t6ent7e3t8fn5+fn59fX19fn19fn5/fn19fX1+f39/fX59fn19fX+AgIB+fXx8fHx9fn+AgYGAgYODgoKEgX57en2BhIaGhYaHg4GAgH17fX6AgIOGhoOBgIKCgoODhIWEg3+Bg4F6iZGMiIF5dHR0fH6Af3p4dXBwcHFxcHBvbm5sa2pudn+CgoGAf4B/fHVwbmxtbW1tbW1tbGppbXR7f4CAf354dXZ5e36AgYB9en9/f3+AgICAf39/f39/f39/f39/f39/f39/f35+fn5+fX19fX5+fn5+fn58fHx8fHx8fHx8fHx8fHx8fHx9fn6AgYGBf39+fn19fX19fH19fX1+f4CDhIKBgIB/f4GEhIaGhoF9eHl9gYaHhoOAfX1+f4CAgIB+fX19e3p4dnR1eXx9foCAgYSHiIqLioR7e3p6e3t7e3t9fn5+fn19fX1+fn5+fn9+fX18fH1+fn59fn19fH19f4CAgH9+fHx8fH1+gIGBgYKCgYKCgoSBf3x6fH+BgoODhIaCgH9/fHt9foCBhIWFgoCAgYKCg4OEhYSDf4CBfXuLl4+Lhn95eXl/gH9+end0cHBwcXFwcG9ubmxqaW52gIKCgYB/gH97dG9ubG1tbW1tbW1samludXp/gH9+fXh1eHx+f4CAf3t4f39/f4CAgIB/f39/f39/f39/f39/f39/f39+fn5+fn59fX19fn5+fn5+fnx8fHx8fHx8fHx8fHx8fHx8fH1+foCBgYGAgH5+fX19fX18fX19fX5/gIOEgoGAgH+AgISEhYWGgX55eXuAhomIg4B+fn5/gICAgH59fX17end1c3R5e3x/goKDhoqKi42Nh317enp7e3t7e3x+fn5+fn5+fn5+f35+f358e3x8fX5+fn5+fX18fXx/f4CAf358fHt7fH6BgYCCg4OAf4GChIF/fHp8fX+BgYKEhYKAfn98e31+gIGEhYWCgICBgoKCgoSFhIOAgX99fpCVkI2LhoB9fH5/fn56d3RwcHBxcXBwb25ubGppbniAgoKCf3+Af3x1bm5sbW1tbW1tbWxqam51en+Af358dnR4fH9/gIB/e3d+fn9/f39/f39/f39/f39/f39/f39/f39/f39/fn5+fn5+fX19fX5+fX19fHx8fHx8fHx8fHx8fHt7fHx8fn5+gYKCg4F/fn19fX19fHx9fX5+fX+BgoODgX+BgICAgoOFhYWDf317fICFhoeEgX5+fX5/gX9+fXx9fHt5d3R0dHd5fn+ChIWIiYmKjIyKgXt6enp6e3x8fX5+fn5+fn5+fn5+fn5+fXt7eXx8fX5+fn9+fn59fH5/gIB/fnx7e3t8foGBgYOCgYCAgYKDgn9+fH18f35/gIGDgX9+fnt8fn6AgoWDgoGAgIKCgoODg4ODg4GCgH2AjZGOi5CNhYF/fXx9e3l2cm9vcXFxb29vbm1raGpveYGDgYGAf39/fHVubmxtbW1ubm5ta2lrbnZ8f4CAf3t2dXl9f3+AgH54dn9/f39/f39/f39/f39/f39/f39/f39/f39/f39+fn5+fn59fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx+fn6BgYKDgYB+fX19fX19fX19fn5+f4GCg4OBf4GAgICBg4SEhYSDgYGBhIaGhYN/fn59fX6Bf359fH18enh2c3NzdXd8gIOFhoeJiYmLjIyEfHp5ent7fHx9fn5+fn5+fn5+fn5+fn59e3t5fHx9fn5+f39+fn5+fn+AgH9+fHt7enx+gYGCg4GBf3+AgoODf318fHt9fn9/gYKAfn5+e3x+f4GChYOBgYCBgoODg4ODg4ODgoKBfoGJjpKRkImBf316eHl6eHZyb29xcXFvb29ubWtpanJ7gIKBgYB/f398dG5ubG1tbW5ubm1raWtveH5/gIB/e3d3en1/gIB/fHZ2gIB/f39/f39/f39/f39/f39/f39/f39/f39/f35+fn5+fn19fX19fX19fHx8fHx8fHx8fHx8fHx9fXx8fH5+foCBg4SDgX59fHx9fX19fX1+fn+AgYKDg4F/gH+AgIGDhISEhIWFhoaHiIeFg399fX1+foB/fnx7e3t5dnVyc3J0d3yAgoSHiImJiYuMjYh+enp7fHx8fH1+fn5+fn5+fn5+fn5/fn18e3t9fn5/f3+AgH9+fn5+f4CAf358e3p6fH6BgYODgIB+foCCg4N/fXx8fH19fX+CgoB+fX57fH5/gYKFg4GBgIKCg4ODg4ODg4ODg4KBg4mPko2Ig397eXh4eHl4dnNwb3FxcW9vb25ta2prdH2AgoGBgH9/f3tybW1sbW1tbm5ubWpoa3F4fX+AgH97eHl8foCAgH95dHWAgH9/f39/f39/f39/f39/f39/f39/f39/f39/fn5+fn5+fX19fXx8fXx8fHx8fHx8fHx8fHx8fH19fHx8fn5+gIGDhISDfn17e319fn59fX5+f4CBgoODgYB/foCAgYKDg4SFhoeJiYiIhoaEgHx8fn9+gH9+e3p6enh2dXJycXN2e4CDg4WHiYmKi42Oi4F9fHx8fHx8fX5+fn5+fn5+fn5+fn5+fXx9fX9/fn9/f4CAf35/f35/gIB/fnx6eXl8foGBgoF+fH19gIGDg399fHx9fHx9f4KBgH59fnt8foCCgoWDgYGAgoOEhIODg4ODg4WFg4OFio+PhoF/fHZ2fHp5d3l4c3FvcXFxb29vbm1ra210foCCgYGAf39/e3FsbGxtbW1ubm5tamhrc3h9f4CAf3t4en9/gICAfnZydH9/f39/f39/f39/f39/f39/f39/f39/f39/f39+fn5+fn59fX19fX18fXx8fHx8fHx8fHx8fHx8fHx8fH1+fX1/gYSFhYSAfXx8fH1+f35+f3+AgYKCg4KAgIB/f3+AgIKEhIWFh4iIiIiHhoSBfXx+fn5/fn17enp6d3Z0c3FxcXR4fYGCgoWJi4uNjY2Mh317fH18fX1+fn5+fn5+fn5+fn5+fX19fX+Af39+fn5/fn5/f4B/f39/f359fXt4ent/gYCCgX98fX6AgYSEfnx7fH17e3x/gIB/gH99fHx+gYKEhoOAf4GChISEhIOCg4SEhYWFhIaKjoqDfnt3cnp/f3t0d3x5c3BwcXBvbW5tbWtqbXN/gYGBgYB/gH96cW1tbG1tbW5ubWxpaWx0eX1/gH9+enh6fn+AgYF9dHN1f39/f39/f39/f39/f39/f39/f39/f39/f39/f35+fn5+fn19fX19fXx9fHx8fHx8fHx8fHx8fHx8fHx8fn59fX+BhISFhYF9fHx8fn5/gICBgYKCg4KDgoCAgH9/f39/gYSEhISFh4eIiIeGhIF+fH1+fn5+fHt6enl3dnRycXFxdHd8gYGBhIiKioyNjY6Kfnx8fXx9fX5+fn5+fn5+fn5+fn59fn5/f39/f35+fn59fX5/gH9/gH9/fn19e3h5e4CBgIB/fnt8fX+Bg4J/fXt8fnx8fX+AgIB+fn18fH6BgoWGg4CAgoOFhYWFg4KEhISEhIWEh4qNh4B6d3J2f4KCfXd2fHx1cnBxcG9tbm1ta2ptdYCCgoGBgH+Af3lxbW1sbW1tbm5tbGlpbXR6fn+Af356enx/gICBgHt0cnZ/f39/f39/f39/f39/f39/f39/f39/f39/f39/fn5+fn5+fX19fX19fH18fHx8fHx8fHx8fHx8fHx8fHx+fn19f4GDhIWFgn58fH1/f4CBgYODgoKDgoOCgICAf39+fn+Ag4SDgYGChYeIh4WEgX58fX59fn18enl4eHV1dHJycnFzdnt/goCChoiJi42Nj4uDfHt8fH19fn5+fn5+fn5+fn5+fn5/gIB/fn5+fX19fXx8fX5/f3+Af39+fX17eXl9gYGAf359e3x9gIGDgoB+fH1/fXx+f4CAgH5+fXx8foGChYaDgICChYeHhYWDg4WEhISEhYWIi4yGfndycXuDg4GAe3d6fHZzcXFwb21ubW1raW53f4KCgYGAf4B/eHBtbWxtbW1ubm1saWludXp+f4B/fnt8foCAgIB+eHNzd39/f39/f39/f39/f39/f39/f39/f39/f39/f39+fn5+fn59fX19fX18fXx8fHx8fHx8fHx8fHx8fHx8fH5+fX1/gYOEhYWEgHx8fn+AgYODhISDg4OCg4KAgICAf35/foCCg4J/fn6Ch4iHhYSBfnx9fX1+fHt5eHd2c3N0c3JycXJ2en6BgYKFh4mLi42OjYd+fHt8fX1+fn5+fn5+fn5+fn5+fn+AgH9+fn59fX18enp7fX5/f4B/f359fXt5eX2BgYB+fHt7e32AgYODgH59gH99fX5/gIGAf359fHx+gYKFhoOAgYOHh4iFhYODhYOEhISGiImJjYV8dG9yfYWCf4J8dnh7eXJycXBvbW5tbWtobneAgYKBgYB/gH94b21tbG1tbW5ubWxqaW92fH9/gH9+fHx/gYCBgH13cnN4f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/fn59fX5+fX19e3x8fHx8fHx8fHx8fHx8fHx9fX19fn5+fn5/gYKFhoSBfXx+gIKDhISGhoWFhIODgYGBgYF/f39/f4KEgn99fYGHiIWEhIF+fHx8fX18end2eHZ0dHVzc3Nyc3Z4fICCg4SGh4mLjI6OioB8e3x9fX1+fn5+fn5+fn19f35/f39/fX19fXx9fHt6eHp7fH9/f39/f317enp7f4CAfnt8fHt8foGChoOAf4CAf35+f39/gYB/fn17fH+Cg4WEgYGChIiJiIaFhIWGhYWFhISFh4iLhnx0b3N9g4B+gH12dnx/eHNycHBvbm1ra2lveYCBgIGCgH+AfndwbW1sbGttbW1ramhpbnZ8fn9/f399f4CAgICAe3JydXt/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39+fn19fn59fX17fHx8fHx8fHx8fHx8fHx8fH19fX1+fn5+fn+AgoWGhoJ+fX+Bg4SEhIaGhYWEg4OBgICAgH9/f39/goSCfnt9gYeIhYSEgHx7fX19fXx6d3d2dXNzdXRzc3N0dnh7f4GCg4SIiYuMjo6NhH58fH19fX5+fn5+fn5+fXx/foB/fn58fHx9fHt6e3t5eXl8fn9/f39/fXt6enx/gIB+e3x8e31+gYSGhIB/gH9/fn+AgICBgH9+fXx9gIKDhYSBgYKEiImIh4WEhoaGhYWFhIWHiYmHfnVwc3yBfnt+fnh2fIB7dHJwcHBubWtranB5gIGAgYKAf4B9dm9tbWxsa21tbWtqZ2lud3x+gIB/f36BgICAgH53cXJ1fH9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f35+fX1+fn19fXt8fHx8fHx8fHx8fHx8fHx8fX19fX5+fn5+f4CChYaHg39+f4KEhYSEhYWEhISCgoCAgICAf39/f3+Cg4F+en2Bh4iFhIR/fXt9fX19fHp5eHZ0c3R2dXR0dHV2eHp9f4CCg4iJi4uNjo6IgH19fX59fn5+fn5+fn19fX9/gH9+fXx8e3x7e3t7fHp5eXp9fn9/f399e3p6fH+AgH57fHx8fn+BhIaEgYCAf35+f4CBgYGAf35+fX6AgoOFhIGBgoSIiYiHhYSGhoaFhYWFhoaIioeAdnFyen58en5/e3p8f3x4c3BwcG5ta2trcXqBgYCBgoB/gXt1b21tbGxrbW1tbWxnaW94fX6AgH9+foCAgIB/fXZxc3h9f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/fn59fX5+fX19e3x8fHx8fHx8fHx8fHx8fHx9fX19fn5+fn5/gIKFhoeDgH+Ag4SGhISFhYSEg4KCgH9/f39/f39/f4KDgn97fYGHiIWEhX99e35+fX18ent6dnR0dXZ1dXR1dnZ5ent+f4GChomKi42OjYqDfXx8fn1+fn5+fn5+fnx9gIGAfXx8e3x7fHt6e3t9fHl7enx9f39/f357enp8f4CAfnt8fH1+f4GEh4KAgH9+fn5/gIGBgYB/fn19foGCg4WEgYGChIiJiIeFhIaGhoWFhYWGhoeIh4J4cXF4fH18fn9/f359fHpzcHBwbm1ra2txe4GBgIGCgH+Ae3RubW1sbGttbW1tbGdpcHh8fYCAfn9/f4B/gn97dXB0eX1+fn9/f39/f39/f39/f39/f39/f39/f39/f39/f39+fn5+fn59fXx8fHx8fHx8fHx8fH19fX19fX19fX1+fn5+fn5/gYSFhoSAf4GEhIaFg4WFhISDgoGBfn+AgICAf3+AgYODf3x9gYeJh4aGgX59f39+fXt7enp4dHV2d3d2d3V2eHl7e31/gIGFiYqLjY2OjIZ/fX1+fn5/fn5+fn59fX6AgH98e3p6e3p7e3x9fn5+fHt7fH1/gH9/fnt4en2AgYB8ent8fX6AgYSGg4F/f39+fn+AgoKCgH9+fXx+gIKEhYSBgYKEh4iIh4WFhoaGhoaGhYWFhomGg3xzdHh8gH9/gIGCgH9+fXVwcHBubWxqa3J8gYGAgYF/gH98cmxtbWxsbGxtbWxqaGpzeH1+f39/f3+AgYB/fndzc3d7fX9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f35+fn5+fn19fHx8fHx8fHx8fHx8fX19fX19fX19fX5+fn5+fn+Ag4WGhIGAgYSFhYSDg4ODg4KBgIB+f4CAgICAgICBgoOBfX2Bh4qIh4aCf4B/f359e3t7e3l2d3d2dnZ4dnh6enx8fX+BgYSIioqMjY6Ni4N+fX1+fn9/f39/fXx/gIGAf3t6enp7enp8fn6Afn5+fXx9fn+Af39+e3h6fYGBgHx6ent8foCBhIaCf31/f35+f4CBgYF/f359fH6BgoSFhIGBgYOHiIiHh4WFh4eHhoaGhYWGiIaFf3d3e36BgICAg4WCgICAeXFwcG5tbGprcn2BgYCBgX+Af3xybG1tbGxsbG1tbGloa3R6fn9/f39/f4CBgX98dnN0eHx9f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/fn5+fn5+fX18fHx8fHx8fHx8fHx9fX19fX19fX19fn5+fn5+fn+ChIWFg4GBhIWEgoGBgYKCgYB/fn5/gICAgICAgIGCg4J+fICHioiHh4SAgH9/fXx7e3x8e3h4dnV1dnh5ent7fHx9f4GBhIeJioyNjo2Nhn99fn5+f39/f399fX9/gH9+e3p5eXp6e3x+f4B/f39/fX1+f4CAgH57eHp9gYGAfHl5e3x+gIGFhoJ/fn9+fn9/f3+AgH5+fXx9f4GChIWEgYGBg4aHiIeIhoSGh4aGhoaGhoeHh4WBe3t9f4KBgICChIOCgYB9dHBwbm1samtyfYGBgIGBf4B/fHRubW1sbGxsbW1saWhsdHp+f39/f39/gIGBf3p1dHV5e32AgH9/f39/f39/f39/f39/f39/f39/f39/f39/f39+fn5+fn59fXx8fHx8fHx8fHx8fH19fX19fX19fX1+fn5+fn59f4KDhIaFgoKFhIOBgICAgYGBfn5+fn+AgICAgYGAgIGCgn58gIeKiIeGhYKAf399e3t7fHx9enh2dXV2eHt7e3x9fX1/gYCEh4mKjIyNjYyIg35+fn5/gIB+fn9/f4CAfnx7eXl5enp7fX9/gH+BgICAfX5/gICAfnt4en2BgYB8eHl7e36AgYWGgoB+f35/gH9/f3+Afn18fH1/goKEhYSBgYCChYaIh4iHhIWHh4aGhoaGh4eHhYN9fn59gYB/gIGDg4OCf392cHBubWxqa3J9gYGAgYF/gH98dG5tbWxsbGxtbW1paGx1en5/f35+f3+AgIB/enV0dnp7fH9/gIB+fn5+f39/f39/f39/f39/f39/f39/fn5+fn5+fn59fX19fH17e3x8fHx8fHx8fX19fX19fX1+fn5+fn5+fn1/gIKFhYWFg4SDgoB/f3+AgIB/fn5+gICAgICAgH9/gIKDfn2Ah4qJiIaEg4GAf3x7enp8fX16eHV0dHV5enx8fX1+f4CAgIKFh4iKioyNjIuGgH5+fn+Afn5+f4B/f39+fHt5eXh5e319f4CAf4GCgYGAf36AgICAend7fX9/fnp3eXl7f4GChISBf359fX9/f39+gH9+fHx9fn+BgoSDgoGBgIGEhoeIiIaDg4aGhoaFhoaHiIiFgoB9fH2CgYCAgoSFhIGBgHlxb29ua2tsc36AgoGBgX+AgH11b2xsbGxrbW1tbWppbXd8f4B+fX5/gIGBf353dHV4eXt9f39/f35+fn5/f39/f39/f39/f39/f39/f39+fn5+fn5+fn19fX18fHx8fHx8fHx8fHx9fX19fX19fX5+fn5+fn5+fX+AgYWFhYaDhIOCgH9/f4CAgIB/f36AgICAgICAf3+AgoN/foCHiomIhoWEgoB/fHt5eXt9fHp4dXNzdXh6fHx+fX6AgICAgYSGiIqKjI2MjIiCfn5+f39+fn+AgX9/f318e3p6eHl7fX1+f4CAgoODg4KAf4CAf397eHt9gH9+end5eXt/gYKEhIF/fnx9f35/f35/f358fH1/f4GDhIOCgYGAgYOFh4iHhoODhoaGhoWHh4eHh4WCf318fYKCgICDhIWEgYGBe3Jvb25ra210foCCgYGBf4CAfXRubGxsbGttbW1tampud31/gH59fn+AgYF/fXV0dXh5e35/f39/fn5+fn9/f39/f39/f39/f39/f39/f35+fn5+fn5+fn5+fX18fX18fHx8fHx8fH19fX19fX19fX1+fn5+fn59f3+AgoSFhoSGg4KAf39/gICAgH9/foCAgICAgIB/f4CBg4B/gIeKiYiFhYSDgH56eXh4enx8e3h1c3Jzdnp8fH5+foCAgIB/goaKiomLjIyMi4V/fn5/f35/gIGAf35+fXx7enp4enx9fX5+f4GEhoWEg4F/gIB+fnx6fH6Af356d3l5e3+BgoSEgX9+fX19fX9/f35+fXx8fX9/gYOFhIKBgYCBg4SHiIeGhYSGhoaGhYeHh4aGhYJ/fn+Ag4OBgoSEhIWCgYF9dHBvbmtrbXV+gIKBgYF/gIB9dG5sbGxsa21tbW1qaW93fX+Afn1+f4CBgX96c3V2eHl7fn9/fn5+fn5+f39/f39/f39/f39/f39/f39/fn5+fn5+fn5/f359fn19fXx8fHx8fHx8fX19fX19fX18fH5+fn5+fn1/f4CAg4WGhIaDgoB/f3+AgICAgIB+gICAgICAgH5/f4GDgoCAh4qJh4WFhYJ/fHl3d3d6e3t8eHVycXN0enx8foCAgICAgH+BhImKiYqMjIyOiIJ/fn9/f4CBgH9+fn59fHt6enp7fH19fn6AhIeIiIaEgoCAgH5+fH1+f4B/fnp3eXl7f4GDhYSBf35+fnx8f39/fn58fHx9f3+Bg4WEg4GBgIGCg4eIhoaHhoaGhoaFh4mJhoaFg4GBgYKDg4KDhYaGhYSDgX53cW9ta2ttd36AgoGBgX+AgH1zbWxsbGxrbW1tbGppcHd9f4B+fX5/gIGBf3hydXd4eXt+f39+fn5+fn5+fn9/f39/f39/f39/f39/f39/fX5+fn5+fn5+fn59fHx8fHx8fHx8fHx9fX5+fn59fX19fn5+fn5+fn5/f4CBhIaGhoSCgYB/f39+fn5/f39/gIB/f39/fn5/gYODgH+GiomHhoWEgXx4d3V1dnl7e3t3dXNyc3V5e31/fn9/gIB/fn2BhoqLi4uMjIyJg39/fn5/gYGBf319fn18fHt7e3x9fn5+f4GGiYqJh4SDgYB/fn58fH1/gH99eHZ3eXx/gYKDhIF/fn18fHx+f39+fX17e31/gIKEhYSBgoKBgYKDhIaGhoaEhYWFhYWGiIiGhYSCgoKDg4SEgoOFhoWFhIKBgHlyb21qam14f4GCgYGBf4CAfHRtbGxra2xtbmxqaWpxeHx+fn1+f4CBgYJ9eHR3eHl5e35/f35+fn5+fn5+f39/f39/f39/f39/f39/f399fn5+fn5+fn5+fn18fHx8fHx8fHx8fH19fn5+fn19fX1+fn5+fn5+fn9/gIGDhYaGhYSCgX9/f35+fn9/f3+AgH9/f39+fn+Bg4OBgISKiYeFg4J/eXRzc3R2eXt7e3h1c3NzdXl7fX5+f3+AgH99fH+DiYyLi4uLjImHgX9/f4CCgYB/fn19fXx8e3t7fH19fX6Ag4iJioqIhoSBgH9+fn19fn+Af315d3d5fH6Ag4SEgX9+fnx8fH5/f359fXx8fX+Bg4SFhIKCgoKCgoOEhoeGh4SEhIWFhYaIiIaFhIODg4SEhISDhIeGhYWDgoGAe3Zyb21sb3iAgYKBgYF/gIB8dG1sbGtrbW1tbGppanJ6fH59fX5/gIKBgXx4dnh5eXl7fn9/fn5+fn5+fn5/f39/f39/f39/f39/f39/f31+fn5+fn5+fn5+fXx8fHx8fHx8fHx8fX1+fn5+fX19fX5+fn5+fn5+f39/gIOFhoaFhIKBf39/fn5+f39/f4CAf39/f359foCCgoKBg4mKhoSBgHt4cm9vcnV5e3t7eXZzc3N1eXt9fX1+f4CAf3x7fICHiouLi4uLioqEgICAgYKBf35+fn19fHx8e3t8fH19f4KFiIiKioiGhIKAf35+fH1/gIB/fnl4eXl8foCChISBf35/fn19fn9/fn19fHx9f4KDg4SDgYKCgoKCg4OEhoeHhYODhYWFhoeHhYSEg4ODhISFhYWGiIeGhYODg4GAenZzcG9yeoCBgoGBgX+AgHxzbGxsa2ttbWxramhrc3t9fn19foCBgoF/end2eXp5eXt+f39+fn5+fn5+fn9/f39/f39/f39/f39/f39/fX5+fn5+fn5+fn59fHx8fHx8fHx8fHx9fX5+fn59fX19fn5+fn5+fn5/f36AgoSGhoaFg4J/f39+fn5/f39/gIB/f39/fn19f4KCgICAhomFhIB+enlzb29xdXl7e3t5dnRzc3Z5e319fX5/gIB/fHp8fYOGi4uKioqLiYZ/gIGAgYB+fn5+fXx8fHt7fHx8fn2Ag4eIiImJiIiEgoB/fn59fX+AgH59enh5eXx+gIKChIF/fn9+fn5+f39+fX19fX1/goOEhYOBgoKDg4KDg4OFiIeFg4OFhYWGh4eFhIWDg4OEhIWFh4aGiIeGhIKDg4J+eXdzcnN7gIGCgYGBf4CAfHNsbGxra21tbGtqaGxze35+fX1+gIGCgX95dnd5e3l5e35/f35+fn5+fn5+f39/f39/f39/f39/gIB+fn5+fn5+fn5+fn59fX18fHx8fHx8fHx8fH19fX19fX5+fn5+fn19fn5+fn9/f3+BgYOEhYWCgH9/f39/f39/f39/f39+f39+fn5+gIGAfXyAhoaCf3x8e3dwbm90eXx8fHl5dXZ1dnl6fHx9f4CBgH98e3x9gIGFiYmKiYmIhYCAgYKAf39+fX19fXx8e3t7e3x+goSIiIqKiomJhYSBfn19fXx9f39/f3x6d3h4e36BgoOCgoCAf39+fn5+gH9+fnx9fYCCg4GBgoGCgYKDg4KCgYKFh4WDhISEhYWGhoWFhIOEhIWFhoaGhoaGhoaEg4ODg4F/fHl3eH2AgYGBgoB/fn97cm1ra2tsbW1sa2ppbXV8fn5+foCBgoGAfHh1eHp6eHh6fn9/fn5+fn5+fn5/f39/f39/f39/f39/f35+fn5+fn5+fn5+fn19fXx8fHx8fHx8fHx8fX19fX19fn5+fn5+fX1+fn5+f39/f4CAg4SFhYKBf39/f39/f39/f39/f35+fn5+fn6AgYJ/fH6Cg4J/fX9+enJvbnN5fH5+e3t5eHl5enp8fH6AgYGAfnx7e31+gIOGiYuJiYiFgYCBgIB/f359fX19fXx8e3x9gIGEhomJiouKiYmEg4F+fX19fH5/f39/fHp3eHh7f4GDg4ODgoKAgH9/fn6AgH9+fH6AgYKDgoKDgoKBgoKCgoB/gYOGhYOEhYSFhYaGhYWEhIWFhYWGhoaGhoaGhoSEhISEg4KAfnx7f4KCgoKCgH9+f3tybmtra2xtbWxramhtdnx+fn5/gYKCgX97d3Z4eXl4eHp+f39+fn5+fn5+fn9/f39/f39/f39/f39/fn5+fn5+fn5+fn5+fX19fHx8fHx8fHx8fHx9fX19fX1+fn5+fn59fX5+fn5/f39/f3+BgoODgYB/f39/f39/f39/f39/fn5+fn5+fn+AgoF+fICBgoCAgoJ9d3Fvcnd6fn59fXt7e3t7fH19f4GBgX99fHt6fH1+gYSIi4uLiIWBgYGAf35+fX19fHx9fX19fn+BhISHioqJi4uJiIOCgH58fH19f4CAf398end4en1/gYKCg4ODg4GBf39+foCAf359f4KDgoOFhYWEhIOCgoKBf35/goSFg4SFhIWFhoaGhYSEhYWFhYWFhoaGhoaGhISEhISDhIOBf36AgoKCgoKAf35/e3Jua2trbG1tbGtpaG13fX58fX+BgoKBf3t3d3l5eXd3en5/f35+fn5+fn5+f39/f39/f39/f39/fn5+fn5+fn5+fn5+fn59fX18fHx8fHx8fHx8fH19fX19fX5+fn5+fn19fn5+fn9/f39/f4CBgoKAf39/f39/f39/f39/f39+fX1+fn5+fn+Bgn97f4GCgYKEhYB5c29xdXl9fX9/fX19fX6AgICAgoGBfn18e3p7fH1+g4eKjY2IhYGCgoB/fn59fX17e3t8fX6AgoODhomLi4qLioiGgoGAfnx8fX1/gYF/f3x6d3h6fX6BgYKDg4ODgoF+fn5+gIB/fn5/goOCg4SEhIOFhIOCgoF/fn6BhIWDhIWEhYWGhoaFhISFhYSEhISGhoaGhoaFhYSEhYOEhIOAgIKDg4ODgoB/fn97cm5ra2tsbW1sa2lpbXd9fnt8f4GCgoF/end3enh4dnZ6fn9/f319fX19fX1+fn5+fn5+fn5+f39+fn5+fn5+fn5+fn5+fn5+fn19fX19fX18fHx8fn5+fn5+fn5+fn5+fX1+fn5+fn5/f35+gICAgH9/fn5+fn9/f39+foCAf39+fX19fX1+f4GBfnx9gIOCg4SEgnx1b3F2eXx9fn5+fn1+gIGCgoKBf399fHt7e3x7fH+Ag4aLi4eEgIKBgH9+fXx8e3t7fHx9f4OEhIWHiYqKioqJhoOAgH9+fHx9fn+AgH99fHp4eXt+f4CBg4ODhISDgX9+f39+fnx9f4CDg4ODhISDg4OFhIOFgoJ/foGDhYOEhIWFhoWFhYWDgoODhYWEhYWGh4eHh4eHhoaGhYSEhIKCg4SEhISCgYB/gHlybmtra2xubmxrZ2lveH5/fH2AgYGBgX16d3h5eXh2dnp+f39/fX19fX19fX5+fn5+fn5+fn5/f35+fn5+fn5+fn5+fn5+fn5+fX19fX19fX19fX1+fn5+fn5+fn5+fn59fX5+fn5+fn9/fn5/f35+fn5+fn5+f39/f35+f39+fn59fX19fX5/gIF/fXyAgoKEhISDf3hycnV4e3x9fX9+fn9/gIGBgoF/fn17e3t8fHt8fn+Bg4WFhIGBgoB/fn18fHx7e3t8fH6AhIWGh4iKioqKioiFgX9/f318fH1/f4CAf318enh5en1/gICDg4OEhIOBgH5/f35+fX5/gIODg4OEhIODg4WEg4aEhIKBgoKDg4SEhYWGhoaFhYGAgYGBgYKEhYeGhoaGhoaGhoaGhISEg4ODhISEhIOBgH+AeXJta2trbG1tbGtoanB4fn99fYCBgYGBfHl4eXl5eHZ2en5/f399fX19fX19fn5+fn5+fn5+fn9/fn5+fn5+fn5+fn5+fn5+fn59fX19fX19fn59fX5+fn5+fn5+fn5+fn19fX1+fn5+f39+fn9/fn5+fn5+fn5/f39/fn5+fn5+fn19fX19fn9+g4F+e36Bg4SEg4OCfHRzdXh7fH5+fn6AgX+AgICBgH59fHp7e3x8e3x9f4CBgYGCgoCAgH9+fXx7fHt7e3t7f4GEhoeHiYuKioqKh4SAf359e3p8fX9/gIB+fHx6eHl6fX1+gIKCgoODg4GAfn9/fn5+f3+Ag4ODg4SEhISDhYWFhoaGhYSCgoODhISFhYaIiIaCf36AgH9/gIGDhoWFhYWFhYaGhoaEhISDg4OEhISEg4KBgIB5cWxra2tsbGxsa2lrcXl9fn19gIGBgYB8eXh5eXh3dnZ6fn9/f319fX19fX1+fn5+fn5+fn5+f39+fn5+fn5+fn5+fn5+fn5+fn19fX19fX18fH5+fn5+fn5+fn5+fn5+fX18fH5+fn5/f35+fn5+fn19fn5+fn9/f39+fn5+fX1+fX19fX1+fn+BgX96fH+DhISEg4N9dXB0d3p7fn5+foCBgH+AgIF/fnx7ent7fHx7fHx+f3+AgIGCgIB/fn59fHt8e3t7e3t/gYWGh4eKi4qKioqHg4B/fHt5enx9f3+AgH17fHp4eXl8fH1/gYGBgoKDgoB+f39+fnx9f4CDg4ODhISFhYOFhoaGhYWEhIKDhIOEhIWFhoeHhYB9fH5+fn5/gIGEhYWEhYWFhoaGhoSEhIODg4SEhISEgoGAgHlwbGtra2xsbGxraWtxeX1+fX6AgYGBgHx4eHl5eHZ2dnp+gIB/fX19fX19fX5+fn5+fn9/fn5+fn9/fn5+fn5+fn5+fn5+fn5+fX19fX19fX19fn59fX5+fn59fn5+fn59fX19fX1+fn5+fX1+fn5+fn59f35+fn5+fn5+fn59fX19fX19fX19fn+CgHx6fYGEhIODg4J5cnJ2eXp9fn5/f39/f39/f399fHt7e3t7enp6fH5/fX5/goJ/gIB/fXx6e3t7ent7fICBhYiIiImLioqLioiFgX58enl6fH5/f4CAfnx6e3h5enp7fX+AgYGDg4OCgH+AgH5+fH2AgYKCg4OEhIODhIWFhYWFhISEhISEg4OEhoaHhoWBe3Z5fH1/f35/gIOEhYaEhYWFhIWFhIWEhISChISFhYSDgoKAeXBta2tsbGxsa2ppa3N6fn19fYCAgoF/fHl5eXl3dnZ2eX2AgH99fX19fX19fn5+fn5+f39+fn5+f39+fn5+fn5+fn5+fn5+fn59fX19fX19fX1+fn19fn5+fn1+fn5+fn19fX19fX5+fn59fX5+fn5+fn1/fn5+fn5+fn5+fn19fX19fX19fX19f4GBf3p7gIOEg4OEg3t0cnV5enx+fn9/fn19fn9/f318e3t7e3t6enp8fn59foCCgoCAgH59fHt6eXt7fHx9gYOHiIiIiYqKiouKiIWCf316eXp8fn9/gIB+fHt6ent6enp9f4CBgYODg4KAgIGBf399foCBgoKDg4SEg4OEhIWFhISEhISEhISDg4SGhoaFg3t0cnd8fX5+fn5+gYOGiISFhYWEhISEhYSEg4KDg4SEhISDg4J7cm5sbGxsbGxramltdXx/fX5+gICBgH98eXl7fXp3dXV5fYCAgH59fX19fX1+fn5+fn5/f35+fn5/f35+fn5+fn5+fn5+fn5+fn19fX19fX19fX5+fX1+fn5+fX1+fn5+fX19fX19fn5+fn19fn5+fn5+fX9+fn5+fn5+fn5+fX19fX19fX19fHx+goKBenp9goSDgoSEfndzdXh5e39/f318fH19f39/fn18fHt7e3p6enx+fX6AgYKCgH9/fn18e3p6ent8fX6BhIeIiIiIiYqKiomJhoOBfXp5enx+f3+AgH99fHt8e3p5eX1/gIGBgoKCgYCAgoKBgH6AgIGCgoODhISDg4SEhYWEhISEhISDg4SEhoWFhYJ/dW9weH1+fn59fn6Ah4qKhoWFhISCgoOEhIWEhIODg4OEhISEg31zbmxsbGxsbGtqaW11fH99f3+AgIGAf3x5eXx/fnh0dHl9gICBf35+fn59fX5+fn5+fn9/fn5+fn9/fn5+fn5+fn5+fn5+fn5+fX19fX19fX19fn59fX5+fn59fX9/fn59fX19fX1+fn5+fX1+fn5+fn59f35+fn5+fn5+fn59fX19fX19fX18fH+CgoJ8eXuBg4OChISAeXV2d3l7f39/fHp7fH1/f39/fn19e3t7enp6fH59f4GDgoKAgH9+fXt7enl6fH1+f4KDhoeHiIiJioqKiYiHhIJ+e3l6fH5/f4CAgH5+e317enl5fn+AgYGBgYGAf4CCgoKBfoCBgYKCg4OEhIODhIOEhIODhISEhIKChYSGhISDgXpzbW93fYB/fn1+foCKjIqGhYWEg4GBgYOEhIWEgoKDg4SEhISDf3ZvbGxsbGxsa2ppbnZ9f31/f4CAgH9/fHl5fIGAeXR0eX2BgYB+fn5+fn19fX5+fn5+f39+fn5+f39+fH19fX19fX5+fn58fH18fX19fX19fX1+fn19fX19fXx9fn59fX19fX19fX19fn5+fn19fn5+fn5+f39+fn5+fn5+fnx8fX18fHx8fX19foCCgX54eX+DhIOEhIJ9dnZ6eXl9gH96eXx8fX5/gH59fX18fHt7enl6fHx/gYGBgYB/fn18e3p6enp+f4CBgoOEhoaGhoiJiomJiYeFg4B8enl9fn5+f39/f359fXx6eHp+gICBgYGCgoGBgYODgoGAgYKCgoKDhIODg4OEhIODg4OEhISEg4OEhoSDgX98c25tcnl+f359fX59hY2JhYSEhISDgIGBg4SGh4aCgIGDhISFhYN/eHJubW1sbW1raWhud35+fX+AgH+Af397eXl9g4J5dHR5foGBgH5+fn5+fX19fn5+fn5/f35+fn5+fn58fX19fX19fn5+fn18fXx9fX19fX19fX5+fX19fX19fH19fX19fX19fX19fX1+fn5+fX1+fn5+fn5+fn5+fn5+fn5+fHx9fXx8fHx9fX1+foGBf3h4fYKDhISEg396eXx5eXx/fnp5fH1+fn+Afn19fXx8e3t6eXp8fH+BgYCAgH9+fXx8e3t7e36AgYKCg4SFhYWFhoiKiYmJiYiEgXx6eX1+fX1/f39/fn5+fXx8fX+AgICAgIKCgoKCg4OCgoGBg4OCgoOEg4ODg4SDgoKDg4SEhISEhISFhISAfnZwbnF3e358e35+fYONi4SCg4OEhIJ/gIGDhIaIhoOAgYKDg4SEhIJ9dm9ubW5tbWtpaG93fn59f4CBgIB/fnp5eX2EgXl0dHl+gYGAfn5+fn59fX1+fn5+fn9/fn5+fn5+fnx9fX19fX1+fn5+fn59fH19fX19fX19fn59fX19fX17fX19fX19fX19fX19fX5+fn59fX5+fn5+fn19fn5+fn5+fn5+fn19fHx8fH19fX5+gYKAe3h6f4KDhISDgX59fXp6fH9+fHp8fX5+f4B+fX19fHx7e3p5enx9gIGBf39/f359fHx8e31+f4CCgoGCgoSFhYSGh4mJioqJiYaCfXp5fH18fH9/f39+f35+fn5/gYCAf39/gYGBgYKDg4KCgYGDg4KCg4SDg4KCg4KCgoODhISEhISEg4SGh4R+dXJzeXp9fXl6fn5/i42Ff4CCg4OEgn+AgoSFhoiGgn+AgYODg4OEg395cm9vbm1ta2lpcHh+fn1/gIKBgH9+enp6foSAeXR0eX6BgYB+fn5+fn19fX5+fn5+f39+fn5+fX1+fH19fX19fX5+fn5+fn18fX19fX19fX1+fn19fX19fXt9fHx9fX19fX19fX19fn5+fn19fn5+fn5+fX1+fn5+fn5+fn5+fX18fHx8fX19fn6Bg4F9d3p9gIOEhYSCf39/e3l7f358enx+f35/gH59fX18fHt7enl6fH6AgYF/f39/fn18fHx8gICCgoKCgYGBgoSEhoeHiImKioqIhoN+eXl7fHx8f39/f35/f39+foCCgIB/f3+AgYGAgIKDg4OBgYODgoKDhIODgoKCgoODg4OEhIaGhISDhIiKhn50dXp9fX56enx8foiPiYB8fYCDg4OBf4CEhIeIiIiBf3+BgoKDg4SEgHt0cG9vbW1raWlweX5+fX+AgoGAf315enp/g353dHR5foKBgH9/f359fX19fn5+fn5+fn5+fn5+fn58fX19fX19fn5+fn5+fn1+fn5+fX19fX5+fn59fX5+fH19fX19fX19fX19fHx8fn5+fn5+fn19fn5+fn19fX19fX9/fX1+fn19fX18fH19fn+Cgn96eHp/gYSFhYSCgH9+fXt9gH58fX5/f39+fX18fHx8fHt6eXt9f4CAf39+f35+fX19fH1/goOEhIOBgoCAgoSGhoiJiYmJiomHhH98ent8fX1/f39/fn6Af35+f4GBf39+f3+AgICAgIKDg4KCgoKDg4ODgoGAgIGCgYKCgoSEhYWFhYSEiIiGfXN3fX5+fnt7fn2Gj4yCe3p7foCCgoF+foOGh4eIiIF9foGCgoOEhIOCfnp1cW9tbWpoaHF6fn1+gIGBgYB/end4eYKDe3d0dHh8goGAgH9/fn19fX1+fn5+fn5+fn5+fn5+fnx9fX19fX1+fn5+fn5+fn5+fn59fX19fn5+fn19fn59fX19fX19fX19fX18fHx+fn5+fn5+fX18fHx8fX19fX19fX19fX5+fX19fXx8fX1+f4GCgX15eXyAgoSFhYOCgIB+fH6CgH59fn9/f39+fXx8fHx8e3p5fH+BgIB/fn5/fn19fX18fn+ChISGhIOCgICCg4WGh4iIiYmKiYiFgH57fHx9fX9/f39/f4B/f39/gYF/fn1+f4CAgICAgoKCgoKCgoODg4OCgYCAgYKBgoODhISFhYWFhIWIiId9c3Z7fn98en1/hIyKgnx5eXl8foCBgX9/goWFhYeIgn19gIGBg4OEhIOBfnh0cW9tamdqc3t+fn+BgYGBf356d3l8goF6dnN0eHyCgYCAf39+fX19fX5+fn5+fn5+fn5+fn5+fH19fX19fX5+fn5+fn5+fn5+fn19fX1+fn5+fX1+fn19fX19fX19fX19fXx8fH5+fn5+fn59fX19fHx+fn5+fX18fH19fn59fX19fX19fX19gYKBf3t4eH5/goSEhIKBgX98foKCf31+f39/f359fHx8fHt7ent+gIB+gH9+fX9+fn19fXx+foGEhoeFhIKAgIGChYWHiIiIiImJiIWAf3x8fH19f39+fn9/gH+AgH+BgX99fX6AgICAgICCgoKBgYKCg4ODg4KBgICBgoGCg4OEhIWFhoaFhoiIhX90d3x+fnl5foKKiYN7eXl5eXp7foKBgX+AgoKChIiDf31+gIGCgoOEhIOBfXdzcG5rZ2x1e35/gIGBgYF/fXt4en6Cfnh1c3R4fIKBgIB/f359fX19fn5+fn5+fn5+fn5+fn58fX19fX19fn5+fn5+fn5+fn5+fX19fX5+fn59fX5+fX19fX19fX19fX19fHx8fn5+fn5+fn19fX1+fn19fX19fX19fX1+fn19fX1+fn19fX2AgYCAf3h5fH2Bg4OEg4GCgH1/g4OAfX5/f39/fn18fHx8e3t7fYCBf35/f359gH9+fn19fX5+gIOGiIaFgoCAgYKEhYaHiIiIiIeHhYJ/fHx8fX5/fn5+f3+Af4CAf4GBf3x8foCAgICAgIGBgYCAgoKDg4ODgoGAgIGCgYKEhISEhYWGhoaIiIiFgHZ4e317eXh/hYmEfHl6eXl6enp9gICBfn6BgYKEiISBfHyAgIGCg4SEhISAfHdyb2tnbHZ8gH+AgYGCgX58enh8gIN7dHRzc3h7goKAgH9/f35+fn5+fn5+fn19fn5+fn5+fX19fX19fX1+fn5+fn5+fn5+fn59fX19fX19fX5+fX1+fn19fX19fX5+fn59fX1+fn5+fn5+fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX+BgYGAe3h6fX+BhIWEgYCBf3+BgoB+f35/gIB+fn19e3p5en6AgYB/f39+f35+fn18fX19fX2AgoWHhYSAgIB/gYSFhoaIiIiHh4eFg4F+fXx9fX5+fX+AgIGAgICBgoJ+fHx/gICAgICAgIGBgYGCgoKCg4GAgICAgIGBgoKChISEhIaGh4iHh4aCeHd7e3t4eoCFhXx3dnd5eXl5eXx/gH58fX6AgoWHhoF9fH9/gYKChISEhIJ9eXNvbGpsdX1/gICAgYF/gH16eHyCgnlycXNzd3yCgoCAf39/f35+fn5+fn5+fX1+fn5+fn59fX19fX19fX5+fn5+fn5+fn5+fn19fX19fX19fn59fX5+fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fX19fX19fX19fX19fX19fX19fX19fX18foCBgoF+enh7fYCChISCgIF/fX5/fn9/fn+AgH5+fX17enp8f4CAgH9+fn19fX18fXx9fH18fH+ChISEgoCAgH+BhIWFhoiIh4eGhoWEgoB+fH19fH19foCAgYCAgIKCgn58fH+AgIGAgICAgICBgYKCgoKCgYCAgICAgYGCgoKCgoODhYWGh4aGhIJ6dnp6eXZ7goSAd3Z2d3d3d3d3eXh6e3yAgYKEhYeHgX17f3+BgYOEhIODgoB8d3Fsam52fX+AgICBgYB/fXl4foJ/dnNyc3F2e4KCgIB/f39/fn5+fn5+fn59fX5+fn5+fn19fX19fX19fn5+fn5+fn5+fn5+fX19fX19fX1+fn19fn59fX19fX19fX19fn5+fn5+fn5+fn5+fX19fX19fX19fX19fX19fX19fX19fX19fXx9f4GCgX98eXl7foCChISBgH98e31+f39+f4CAfn59fXt6fH+AgH+AgH99fXx7fHx8e319fXx8f4CCg4KBgICAf4GDhIWFhoeHhoSFhYaFgoB/fn59fX5/gYGBgICAgoKCfnx9gICAgoGAf3+AgIGBgoKBgYGAgICAgICBgYKCgoGBgoKDg4SFhISCgXx2enp3dXuCgn12dXZ3dnZ2dnVycnN6foKDhYWGh4aDfXt+f4CAg4ODgoODgn96dGxpb3h+f4CAgIGBgH98eXp/gX12dHRzcHR5goKAgH9/f39+fn5+fn5+fn19fn5+fn5+fX19fX19fX1+fn5+fn5+fn5+fn59fX19fX19fX5+fX1+fn19fX19fX19fX1+fn5+fn5+fn5+fn5+fn19fX19fX19fX19fX19fX19fX19fX1+fn1/gYKAf356eHl8foGEhIKBgHx7fH1/f35/gIB+fn19e3p9foKAf39+fnx7fHt7enx7fX1+fHx/f4CCgYCAgIB/gYODhIWGhoaFhIWFh4eEgYB/fnx8fn+BgYGAgICCgoJ+fH2AgICCgoCAf39/gYGCgoCAgYCAgICAgIGBgoKCgoKCgoKCg4SDg4OCfXd5eXZzeoKBenZ1dnZ1dXV1c29uc3t/g4WGhoaHhoR/fH5/f4CCg4OChIWDgX12b2xxeX5/gICAgYGAfnt5fICBenVydHJvdHmCgoF/f39/f319fn5+fn5+fX19fX5+fn5+fn5+fn5+fn9/fn5+fn5+f39+fn5+fX19fX19fX19fX19fn59fX19fX19fX5+fn5+fn5+fn5+fn5+fX19fX19fXx9fX19fX19fX19fX19fX19fX1/gYF/f315eHp9gIGDg4CAfXt8fX5+fn5/f35+fXx7en5/gH9/fn5+fXt6eXt7fH1+fn99fX5/f4CAgIB/f3+BgYSEhISFhISEhYeIiIWEgn9/fX1+f4GBgYCAgIGDgn98fYCBgYODgX9+foCAgYGCgYGAgICAf3+AgICCg4OBgYKCgYCBgoGBgoF+eXd1cnJ6gH53dHR0dXR0dHVwa3B5foOGhYWFh4iHhYF+fn5/f4GDhIKCg4KBf3lwbXR5fYCAgICBgH98fHl9goB5c3JycW90eYKCgX9/f39/fn5+fn5+fn59fX19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn59fX19fX19fX19fX1+fn19fX19fX19fn5+fn5+fn5+fn5+fn59fX19fX19fH19fX19fX19fX19fX19fX18fH6AgX9/f3t4eHx/gIKCgIF9fHx9fn5+fn5+fn59fHx8f4B/f35+fn59e3p5ent9fn5+f39/fn5/f3+AgICAgIGBg4ODg4SEhISFh4iIhoWDgH9+fn6AgYGBgYCAgYOCgHx9gIGChISCgH9+gICBgYKBgYCAgYGAgICAgIGDg4KCg4SBfX+Afn6Bgn95dXJxcnqAfHZ0dHR1dHV0cm1td3x/g4aFhYWHiIiHgn9+f39/gYKCgYGDg4OBe3NvdHl9gICAgIGAf3x8fH+DfXhzc3Nwb3R5goKBf39/f39+fn5+fn5+fn19fX1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn19fX19fX59fX19fX5+fX19fX19fX1+fn5+fn5+fn5+fn5+fn19fX19fX18fX19fX19fX19fX19fX19fXx8fH+Bf39/fnp2eXx/goKBgX99fH1+fn5+fX1+fn58fH2Af31+fn5+fXt8e3t7e31+fn5/gIB+fn5/f4CAgYGBgoGCg4KCg4ODhIWGh4eFhIOAgH9+f4GBgYGBgICBg4KAfX6AgYOFhoSBgH6AgIGBgoGBgICBgYCAgIB/gIODhISEg4B6fH1+fn+BgXp1cXFyeX96dXR0dHV1dnRubHJ7fn6AhYWFhYeIiIeEgICAf3+BgYB/gIKDg4J8dnJ1en2AgICAgX9+fHx+gIF7dnNzc25udXqCgoF/f39/f39/fn5+fn5+fX19fX5+fn5+fn5+fn5+fn19fn5+fn5+fn5+fn5+fX19fX19fn59fX19fn59fX19fn5+fn5+fn5+fn5+fn5+fn5+fX1+fn5+fXx9fX19fX19fX19fX19fX19e3t7foF/gIB/fXd3en2BgYKCgH58fX5+fn59fX5+fnx+foB/fX1+fn19e3x9fHt6fH5+fn+AgH59fX5+gICBgYGCgoKCgYKDgoKEhYWGhoSEg4OBf3+AgYGBgIGAgIGDgoB/gICBg4aGhYOBf4CAgYGCgYGAgIKBgIGAgH+Ag4ODg4SBfHd5en19fX+CfXdxcnJ5fXl0dHR0dXV1cm1ueH5/fn+FhoWFh4iHhoeDgIB/f4GAfH2AgYSEg312c3V7fYB/gICBf318fH5/fnl1c3R0bG52e4KBgIB/f39/f39+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39+fn5+fn59fX5+fn59fXx8fX19fX19fn5/f39/f39/f39/f39+fn5+fn5+fn5+fn59fX5+fX19fX19fX19fX19fHx8fHx8gICAgH9/e3l4e31/goKBf318fH5/f319fn5+fH1+f319fn59fXx6e3t6e3t8fn5+f4GBfn59fn5/gIGBgoKCgYGAgYGCg4OEhYaGhYSEg4GAgIGCgYGBgYB/gYKBf39/gYKEhoiHhIKAgICBgYGBgYGBgoODgX9/gICBgYGCg4F7d3l7fX1/gIJ/eXBvc3p7eHV0dHV1dHRwanB7fn5+foGGhoaGh4eFhIKAf4B/gH98en6AgYKCf3l0dnt+f4CBgYB/fn19goB7dnNzdXJsa3N4goGAgH9/f39/f35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f35+fn5+fn19fn5+fn19fXx9fX19fX1+fn9/f39/f39/f39/f35+fn5+fn5+fn5+fn19fn59fX19fX19fX19fX18fHx8fHx/f35/fn9/e3h5fH6BgYGAfXt8fX9/fn5+fn59fn5+fX1+fX19e3t7enl8fX1+fn5/gYF+fn1+fn+AgYGCgoKBgYCAgIGCg4SGh4WFhISDgoGBgYKBgYGBgH+BgoF/f3+BgoSFiIeFgoGAgIGBgYGBgYKDhISCgICAgIGBgYKEgXt4enx+f4CBgoJ9cW9ye3x3dXR0dXV0c2xtdXx+fn5+foSGhoaHh4WDg4F/gH9+f3p4fX+AgoJ/e3Z4e35/gIGBgH9+fn+Efnh1c3N0cmxrc3iCgYCAf39/f39/fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/fn5+fn5+fX1+fn5+fX19fX19fX1+fn5+f39/f39/f39/f39/fn5+fn5+fn5+fn5+fX19fX19fX19fX19fX19fX5+fHx8fHx8fX18fn99enl6fH+AgoF9e3t8f39+fn5+fn1+f359fX59fXx7e3t6enx+fn9+fn+Cgn9+fX5+f4CBgYKCgoGBgICAgIGDhIaHhYWEhIOEg4OCgYGBgYCAf4GCgX9+f4GChIWHh4WCgYCAgYGBgYGBgoOEg4GAgICAgYGBgoSCf31/f4CCgYKEg39zcHJ6e3d0dHR1dXVxa3F6fX5+fn59gIaGhoeHhYSEgX+Af39/eXV6fYCCgoB8eHh8fn+AgYF/fn+AgoJ8dnNzc3Nxa211eoKBgIB/f39/f39+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f35+fn59fX5+fn59fX19fX19fX9/fn5/f39/f39/f39/f39+fn5+fn5+fn5+fn59fXx8fX19fX19fX19fX19fn58fHx8enp8fX1+gX98enl5fX+DgX57e3x/f39/fn59fX5+fn19fX18fHt8eXt6fYCAgH5+f4GCgH5+fn5/gIGBgoKCgYGAf3+AgYOEhoeEhISEg4SEhIKBgYGBgYB/gYKBf35/gYKDhIeHhoOBgICBgYGBgYGChIWEgYGBgICBgYGChIOCf4GBgYKCgoSFgHRwc3x7dnR0dHV1dHBrdX59fn5+fn6AhoaGh4eFg4OCf4B/f4B5cnd9gIKCgHt3eX1+f4CAgX9+f4CCgXp1cnNzc3BrbXZ7gYGAgICAf39+fn5+fn59fX19fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/fn5+fn5+fn5+fn5+fX1+fn5+fn59fX5+fn5/f319enp6eHl6fH5/f39+eXZ6foKCf3t6e319f39+fX5+gH98fX1+e3p7fX57fHt9f39+fH1+f4GAfn5+fn9/gYGBgYGBgYGAgICAgYOEhISCg4ODhIaGg4KCgYGBgH+AgoGAfn+AgYKDhoaFg4GBf3+AgICAgYGEhYSBgoKCgYGBgYKDhYODg4OCg4KDhoaBd3Jze3t3dXV0dHVzbWt4fn5+fn5+foKHhYWGhoSBgYCAf39/gXlwdHl+gIKAfHl6fH+AgICAfn+AgX99eXVzcXJybWpsdnyBgYCAgIB/f35+fn5+fn19fX1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39+fn5+fn5+fn5+fn5+fn5+fn5+fn19fn5+fn9/f316enp4eXp7fn9/gIB9eXh7gIKBfHp7fH1+fn19fn5/fnx8fHt5enx9fXx8fX5/fn58fX5/gYB+fn5+f3+BgYCBgYCBgYCAgICBgoODg4GCgoOFhYWEg4OBgYGAf4CCgYB+f4CBgoOGhoWDgYCAgICAgICBgYOFhIGCgoOBgYGBgoOFhISDg4ODgoOFhYJ5dXR6e3Z1dXR0dXBqbHp+fn5+fn5+goaFhIWFg4CAf4B/f3+BenBxd31/goB9ent9gIGAgIB+gIGBfnl2c3JxcnFtbG95foGBgICAgH9/fn5+fn5+fX1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f35+fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f35+fn5+fn5+fn5+fn5+fn5+fn5+fX1+fn5+fn5/fXp5eXd3eHl8fn9/gH98eXp9gIF/e3p8fX19fHx+fn5+e3t7enp7fHx8fHx+fn99fXx9fn6Af35+fn5/f4CBgICAf4CBgICAgICBgoKCgIGBg4WFhYWDg4KCgIB/gIKBgH5/gIGCg4aGhYOBgICAf39/f4CAg4SDgoKCg4GBgYGCg4WEhISEg4OCg4WFgnx3dXl5dnR0dHR0b2pxfH5+fn5+fn6ChYSChISCgICAgX9/f4F7cXB1e3+Bf3x7e31/gICAgH6AgYB9eHRxcXFxcXBxdnx/gYGAgICAf39+fn5+fn59fX9/fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/fn5+fn5+fn5+fn5+fn5+fn5+fn5+foCAf39/f39/f39/f39/fn5+fn5+fn5+fn5+fn5+fn5+fn59fX5+fn5+fX59enl5d3Z4eXt/gH9/gH97ent/goF7enx9fHx6e35/fn17enp6e318fHx8fH9/f3x8fH1+f4B+fn5+fn9/gICAgIB/gYGAgICAgIGCgoKAgYGChIWFhIODgoF/f3+AgoGAfn+AgYKDhoaFg4GAgIB/f39/gICCg4KChISDgYGBgYKDhYSEhYWDg4KDhISDf3d1eHh3dHR0dHRuanN+fn5+fn5+foKFhIGDg4GAgIGBf39/gXtxb3J4fYB/e3x8foCAgICAfoCBfXp4dHJxcXNzdHZ7f4KAgICAgIB/f35+fn5/f35+f39/f35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fX1+fn5+fn9/f39/f39/f4CAgIB/f39/f39/f35+fn5+fn5+fX19fX5+fn59fX5+fn5+fn1+fn15eHh2d3d4eX1/gYCAgH56eH2BgXx5e3t6e3l8f359fXp6eHl6e3t7fHx9fYB/fXx9fn+AgH59fHx8fX+AgH+AgIB/f35+fn5/f4GBgYGBgYKDhISDg4ODgX9+gIGDgoB/gIGCgIKGhYWDgYB/fn9/f3+AgIGBgYCChIOCgoKCgoSFhISFhYSDg4OCgoOAeXd5eXVzdHV0cmprd31+fn5+fn5+gYSCgIGBgYCAgYKAgH+BfHNwcnh9f398fH1/gYCAgIB+gH15eHd2dHJzeHd4fYCBgoCAgIB/f39/fn5+fn9/fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+f39+fn5+fn59fX5+fn5+f39/f39/f39/gICAgH9/f39/f39/fn5+fn5+fn59fX19fn5+fn19fn5+fn5+fX5+fXl4eHZ1dXd4en1/gICAf316eX2AfHl5eXl5en5/fnx7enp6eXl4eXt8fH19f359fH1/f4CAfn18fHx9fn+Af39/f35+fn5+fn9/gYGAgICAgYKDg4KCgoKBf3+AgYOCgH+AgYKBgYWFhYOBgH9+f39/f4CAgYGCgIKEg4OCgoKCg4WEhIWFhIODg4KCgX96d3l4dHNzc3NxaW15fX5+fn5+fn6Agn9/f4CBgIGBgoCAf4F7cXBxdnt+fn18fX+BgICAgH5/enh4enp4dnh8fn+Cg4SEgICAgH5+f39+fn5+f39+fn19fn1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+fn5+fn5/f39/f39/f3+AgICAf39/f39/f39+fn5+fn5+fn19fX1+fn5+fX1+fn5+fn59fn59eXh4dXNzdXZ4e3x/gIB/gHx7fH59enh4eXt9f35+fHt8e3p5eHh6e3x8fX5+fX19fn9/gIB+fXx8fHx9fn5/f35+fn1+fn5+f3+AgH9/f3+AgYKCgYKBgYCAgIGCg4KAf4CBgoGBg4aFg4GAf35/f39/gYGBgYSCgoSDg4KCgoKChISEhYWEg4ODgYGBf3l3eXh0c3Nzcm5pcXp9fn5+fn5+fn+BgH9/gIODgYGCgIB/gXtxcHF1en5+fXx9f4GAgICAfn14d3l8gH98fH+BgoSEhYWAgICAfn5/f35+fn5/f35+fX1+fX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+f39+fn5+fn9/f39/f39/f4CAgIB/f39/f39/f35+fn5+fn5+fX19fX5+fn59fX5+fn5+fn19fn15eHh1c3NydHd5fHyAgH9+f319fH17eHh6fX9/fXx7fHx6eXh3eHp7fHx9fn59fX1/f3+AgH59fHx8fH19fX5/fX19fX5+fn5/f39/f39/f4CBgoKBgYGBgICAgoKDgoF/gIGCgoGDhoSDgYB/fn9/f3+BgYKBg4GChIODgoKCgoKDhISFhYSDg4OBgYN/eXd3d3RzdHNwbGpzen1+fn5+fn5+fn9+gICAhIWCgYKAgH+Be3JwcXV5fX19fH1/gICAgIB+e3Z3eX2CgYCAgYODhYWGhX9/fn5+fn5+fn5+fn5+fn59fX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/fn5+fn5+fn5+fn5+fX1+f39/f39+fn9/gICBgX9/f39/f35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5/f3t5eXZ0cXJydnd5fX6BgH9/f358fHt6enx/f35+fXx8e3h4eHh6e3t7fH19f359fX5/fn6Af359fHx8fXx8fH1+fnx8fX19fX19fn5+fn5+gICAgICAf3+Af4CDg4SDgoCBgYKCgIGDhIN/fn59fn59f4GCg4GDgoKChISCgoGBg4OEhISEhISCgYCAgX54dnh3dXNzc3FranR8fn5+fn5+fn5+fX5+f4OFh4OCg4GAgIF/dW9xdXd8fX19foCAgICAf3x5dXd7foKDgoGCgoSEhYWGf39+fn5+fn5+fn5+fn5+fn19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39+fn5+fn5+fn5+fn5+fn5/f39/f39/f3+AgICAf39/f39/fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn9/fHt6d3RxcnJ0dnl8fYCBgYCAfn18e3t7fYCAfn18fXx5eHh3eHt7e3t8fX5/fn19fn9+fX9/fn18fHx9fHx8fX19fHx9fX5+fX1+fn5+fn5/f4CAf39+f4CAgYSEhISDgYKCgoF+f4OEg39/fn1+fnx9gYOEg4ODgoKEhIODgYGDg4SEhISEhIKBgICAfXZ0d3Z1c3NzcWpsd31/fn5+fn5+fn5+fn6BhoeJhYODgYCBgX50b3B1d3x9fX1/gICAgIB/e3h2d3x/goOEgoODhISGhod/f35+fn5+fn5+fn5+fn5+fX1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f35+fn5+fn5+fn5+fn5+fn9/f39/gIB/f4CAf39/f39/f39+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+f397enp3dHFxcXJ2eXx8f4CAf39/fnx7enx+gIB9fX19e3l4d3d4e3t7e3x8fn9+fX19fn59f39+fXx8e3x7e3t8fHx8fHx8fX18fH1+fn5+fn5+f39/fn5+gIGChISEhISDgoKCgX5+gYSDgYB+fX5+fH2Bg4OEhISEhISEg4ODg4ODhISEhISEgoGAgH96dHJ4d3Z0c3Nxam16fn9+fn5+fn5+fn9+foSKiIeFg4OCgYGBfnVxcnZ4fH19fX+AgICAgH56eHh5foCCgYKDg4WFhoiJin9/fn5+fn5+fn5+fn5+fn59fX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/fn5+fn5+fn5+fn5+f39+f39/f3+AgH9/gIB/f39/f39/f35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5/f3p4eXd0cXBwcnZ6fHx/fn5/f39+enp6fH+Afn18fHt5enl3d3l7e3t7fHx+f359fX1+fX1/f359fHx6e3p6ent8fHx8fHx8fHx8fX1+fn5+fn5/f39/fn+AgoOFhoWEhISDgoKCf32AhIOBgH59fn59foGChISFhYSEhISEhIWFg4OEhISEhISCgYCAfnd0cnd2dnRzdHFpb3t+f35+fn5+fn5+f36AiYyIhoWCg4OBgIB+d3N1d3l8fX19f4CAgICAfXp5eXuAgYKCg4ODhIWIiYuMfn59fX5+fn5+fn5+fn5+fn19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn19fX1+fn5+fn5+fn5/f39/f39/f39/f39/f39/f39/fn5+fn5+fn5+fX19fX1+fn5+fn5+fn5+fn5+fn9/e3h2dXNycXFzdnt9fn58fn6AgH97enx9gIB/fXp6dnd5eXh4eXp7e3t8fH1+fn5+fH19fn5+fn17e3t7e3t6ent7e3t8fHx8e3x9fX19fn58fH19fn5+f4GDhISFg4KBgoODg4KAfoGDgoCAf359fX9/gIGDg4KCg4ODg4KEhIOEhISEhISDg4KBgH98eHV0dXd3dXVzb2pven5+fn5+fn5+f39/foSMi4aFhYWDgoF/f399d3h6e35+fn5/f4CAgIB+e3l7foCBgYGCg4SEh4iJiot+fn19fn5+fn5+fn5+fn5+fX1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn59fX5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f39+fn5+fn5+fn59fX19fX5+fn5+fn5+fn5+fn5+f398eHV1c3JxcXR3e319fXt8fX+AgHx7fX+Af357eXh2d3h5eHl5ent7e3x8fX5+fn58fHx+fn5+fXt7e3t7e3p6e3t7e3x8fHx7e3x8fX1+fn19fn5+fn2Ag4SFhYSDgYCBgoSFg4F+gYOCgICAf35+f3+AgYKCgoKCgoKCg4SFhISEhISEhIODgoF/fnh3dXV1dnd1dXRwa3B6fX5+fn5+fn5/f39/hoyIg4SGhoOCgX9/gH99fX5/f39/f4CAgICAgH57en1+f4GAgYGDg4SFh4mKjH5+fX1+fn5+fn5+fn5+fn59fX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/f35+fn5+fn5+fn19fX19fn5+fn5+fn5+fn5+fn5/f3x4dnR0c3JydHh7fHt7ent7fH5+f35+f399fHl4d3d3eHp5eXl6e3t7fHx9fn5/f3x8fH5+fn59e3t7e3t7enp7e3t7e3t7e3t7fHx9fX19fX19fX19fYCDhoaFg4GAf4CAgoOEgoCChYSCgoGAf39/f4CBgoGBgYCAgICBgoOEhISEhIODg4OCgX57dnZ1dXR2dnZ1dHBrcHp9fn5+fn5+fn9/fn+GiYSBgoWGg4KBf3+AgH9/gIGAgICAgICAgICAfnt7fn+AgYGCgoWEhoaGh4qLfn59fX5+fn5+fn5+fn5+fn19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39+fn5+fn5+fn5/f39/f39/f39/f39/f39/f39/fn5+fn5+fn5+fX19fX1+fn5+fn5+fn5+fn5+fn9/fHh3dXVzcnJ0eHt8e3t7fXt9fX1+fYCBf317eHh3d3d3eXl5eXt7fHt8fHx+fn9/fH18fX5+fX17e3t7e3t6ent7e3t7e3t7enp8fH19fHx8fH19fX19gYWHhYOCgH99fn+AgYSDgoSGhYSDgYB/f39/gICBgoGBgICAgH+BgYOEhISEgoKDg4KBfnl3dXV1dXV3dnV0cWtxen1+fn5+fn5+f35+f4eGgH2ChYaDgoF/f4CBgYGAgoKCgICBgYCAgIB+e3t/f4GBg4WEhYWEhoaHiot+fn19fX1+fn5+fn5+fn5+fn5+fn5/f39/f39/fn5+fn5+fn5+fn5+fn5+fn5+fn5/f319fX19fX5+fn9/f39/gICAgH9/f39/f39/fn59fX5+fn5+fn5+fX5+fn5+fn5+fn5+fn5+fn5+f398end3dnRzc3R5fHx8ent7fHx9fHt9gH9+e3h2d3h4eXl6enl6e3x9fHx9fX5/gH99fX19fX18fHp6enp6enp6enp7e3t7e3t7e3t7e3t7e3t8fHx+fn+ChYWEgYB/fn5+fn9/gYGDhIeGhYSCgYGAgICBgYGCgYB9fH1+fn5/goSEg4ODg4KCgYB9enh1dXR1dXd3dnNxbnF6fX5/f319fn6Agn+BhYN/foCChISDgoKCgYKDg4OEg4OCgoKBgYB/f318fH5/gYOEhoaEhISEhoiKjH5+fX19fX5+fn5+fn5+fn5+fn5+fn9/f39/f39+fn5+fn5+fn5+fn5+fn5+fn5+fn9/fX19fX19fn5+f39/f3+AgICAf39/f39/f39+fn5+fn5+fn5+fn59f35+fn5+fn5+fn5+fn5+fn5/f3x6d3d3dXNzdXp8fHx6e3t8fHx9fH2AgH16d3V3eHl6enl5eXp7fX19fX19fn+Af359fX18fHx8enp6enp6enp6ent7e3t7e3t7e3t7e3t7e3x8fH5+gIOEhYJ/f39+fn5+f3+BgYKDhYaGhYSDgoGAgIGBgoKBgH57fH1+fn+ChISEhIODgoKBgX58eHZ1dHV1dnd3c3Bsb3l+fn5/f4CAgIOEgYOFhICAgYGEhIODg4OCgoODhISDg4ODgoGBgH+Afnx+gYKEhoeIhoSCgoOGiIqNfn59fX19fn5+fn5+fn5+fn5+fn5+f39/f39/f35+fn5+fn5+fn5+fn5+fn5+fn5+f399fX19fX1+fn5+f39/f4CAgIB/f39/f39/f35+fn5+fn5+fn5+fn1/fn5+fn5+fn5+fn5+fn5+fn9/fHp3eHd1dHR2eXx8fHp7e3x8fH5+f4B/fXt4dXd4eXp6eXh5ent7fH19fX1+f4CAf319fHt7e3t6enp6enp6enp6e3t7e3t7e3t7e3t7e3t7fHx8fn+AhIWDgX5+fn5+fn5/f4CAgIGDhISEg4KDgoKCg4OEhIOCf31+fX19f4KEhISEg4ODg4OBgH16eHV0dHR1dnZzb2xueH6AgIGDhIaGhYWDhIaFgoKCg4SEhISDg4KCg4OEhIODg4OCgYGAf39/foGDhYaIiIeFg4GBg4aIio1+fn19fX1+fn5+fn5+fn5+fn5+fn5/f39/f39/fn5+fn5+fn5+fn5+fn5+fn5+fn5/f319fX19fX5+fn5/f39/gICAgH9/f39/f39/fn5/f35+fn5+fn5+fX9+fn5+fn5+fn5+fn5+fn5+f398enh5eHZ0dXd5fHx8ent7fHx7fH2BgH18fHp4d3d4enp5eXp6e3p7fHx9fX5/gIF/fX18enp7e3p6enp6enp6enp7e3t7e3t7e3t7e3t7e3t8fHx+foGDhIOAfn19fn5+fn9/gIB/gIGCgoOBgYKChIWFhYSEg4OAfX5+fX2Ag4ODhISDg4ODhIKBfXx6dXRzc3Z2dXFvbG97gISFhYaGh4eGhYSGhoSCgoGChISEhIODgoKDg4SEg4ODg4KBgYB/gICAhIaHiIiHhoWDgoKDhoiKjX5+fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f35+fn5+fn9/fn5+fn5+fn5+fn5+fX19fX19fn5+fn5+f3+AgICAf39/fn5+fn5+fn5+fn59fX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5/f3x7eHl5d3V2eHt8fHx7fHx8fHt8foB/fXx8end4eXl5eXh5eXp7e319fX19fn1+gIB9fXt7e3t7e3t6enp6enp6ent7e3t7e3x8fHx8fHx8fHx8fH1+gIKBgX59fX1+fn5+fn5/f4CAgYGAgYCAgIGEhoeHhYaGg4GAf399fYGCg4ODg4ODg4ODgoCAfn15dnRzdHRwcG5udH6DhYaGhoaGhoWEhYWFhYODg4OFhYaGhIOCgoKCgoKCgoOEg4KBgYSDg4aHiImHhYODg4OEg4WGiIqKfn59fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/fn5+fn5+f39+fn5+fn5+fn5+fn59fX19fX1+fn5+fn5/f4CAgIB/f39+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn9/fHt4eXh4d3h6fHx8fHx8fHx8e31/gH98e3t7eXp7e3l5eXp5ent8fX18fHx8fH1/fn19e3t7fHx8fHp6enp6enp6e3t7e3t7fHx8fHx8fHx8fHx8fX6AgoB/f319fX5+fn5+fn9/gICAgICAgICAgYGChYWIiYiFhYOCgYGBgYKBgYODg4ODg4ODgYGAf3t4dXN0cnFxc3Z7gISFhoaGhoaFhISFhYWFhISEhIWFhYWEg4KCgoKCgoKCgoSDgoOEhoaGiIeGhIOBgoODg4WEhYeIiYl+fn19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f39+fn5+fn5/f39/fn5+fn5+fn5+fn19fX19fX1+fn5+fn9/gICAgH9/f35+fn5+fX1+fn5+f39+fn5+fn5+fn5+fn5+fn5+fn5+fn5+f398e3h4eHh4eXt7fHx8fHx8fXx9f4CAf3p5eXl5enp6e3t7fHp6ent9fXt7e3t7e3x9fX17e3t8fHx8e3t6enp6enp7e3t7e3t8fHx8fHx8fHx8fHx9fX+Af359fH19fn5+fn5+f39/f3+AgICAgICBgYGCg4aHh4eGhYSEgoKCgYCAgoKCg4ODg4OCgoGAfnt5dnRydXV5fX+BhIWGhYWFhYSDg4WFhYWEhISEhISEhIaEhISCgoGBgYGBg4OChYaIiIiIhoSDgoCAgYODhISFhoeHh35+fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f35+fn5+fn9/gIB+fn5+fn5+fn5+fX19fX19fX5+fn5+f3+AgICAf39/fn5+fn59fX5+fn5/f35+fn5+fn5+fn5+fn5+fn5+fn5+fn5/f3x7eHh4eHl6e3t8fHx8fHx9fX+AgYF/end2eXl5ent7e3x9e3t7e3x9e3t7e3t7fHx9fXt7e3t7fHx8fHp6enp6ent7e3t7e3x8fHx8fHx8fHx8fH19fX9/fn18fX1+fn5+fn5/f39/f39/f3+AgIGCgoKDhIWGhoWFg4OCgoKAgICCgoODg4ODg4KDg4GAfnt4d3Z5e3x/gIKEhIWEhYWFhIKChYSFhIODg4ODg4SEhoSEhIKCgICAgIGCg4OFhYmJiIeEhISBgYGCg4ODg4SFhoaGfn5+fn19fX1+fn5+fn5/f35+fn5+fn9/fn5+fn9/f39/f39/fn5+fn5+fn5+fn19fn5+fn19fX1+fn5+fn5+fn5+fn5/f399fn5+fn19fn5+fn5+fn5+fn9/gIB+fn5+fn5+fn59fn59fX5+e3p5eHh3eXp7e3x8e3x8fHx9gIGBgH15dHR2d3p7e3x8fn18enp6enx7fHp6e3x8fX59fHt7ent7e3x8e3t7e3p7e3t7e3t7fH18fHx9fX1+fn19fX19fn9+fX19fX19fn5+fn5+fn5+fn5+gIGBgoODg4ODg4ODgoOCgYGBgICAgYKDg4ODg4ODhISCgoGAf3x8fH9/gICBg4OEhYSFhYSEg4OEhIOCgIGBgYKDg4SGhoWFgoGAf3+AgYODhISEh4iIhoSFhYKDgoODg4OEhIWFhYV+fn5+fX19fX5+fn5+fn9/fn5+fn5+f39+fn5+f39/f35+fn5+fn5+fn5+fn5+fn5+fn5+fX19fX5+fn5+fn5+fn5+fn9/f31+fn5+fX1+fn5+fn5+fn5+f39/f35+fn5+fn5+fn1+fn19fn58e3l4eHh6ent7fHx7fHx7fH2BgoKBfXp1c3V3e3x8fX1+fXt6enp6e3p7enp7fHx8fn19e3t6e3t7fHx7e3t7ent7e3x8fHx9fXx8fH19fX19fn59fX1+fn19fX19fX1+fn5+fn5+fn5+fn6AgIGBg4ODg4ODgoKBgYGAfn5/f3+AgYKDg4ODg4OEhIODgYCAfn+AgoGCgoOEhYaFhYaGhISBgYGBgH1+f4CAgoKDhYaGhYWDgoGAgICBg4KEhISGh4iHhIWFg4ODgoKCgoODhISEhH5+fn59fX19fn5+fn5+f39/f35+fn5/f35+fn5/f39/fn5+fn5+fn5+fn5+fn5/f35+fn59fX19fn5+fn5+fn5+fn5+f39/fX5+fX19fX5+fn5+fn5+fn5/f35+fn5+fn5+fn5+fn5+fX1+fn18enl5eXl5e3t8fHt8fHt9foGCgYB/e3ZzdHd7fHx+fn59e3p6enp7eXp6e3p8fHt9fX18e3p7e3t8fHt7e3t6e3t7fHx8fH19fHx8fX19fX1+fn19fX5+fX19fX19fX5+fn5+fn5+fn5+fn9/gYGCgoODg4ODg4CAgYB+fn9/f4CBgoKDg4ODg4SEg4ODgoGAgYKCgoODhIWHiIeHh4eEgoB/f358en5+f4CCgoSFhoaFhYOCgYCAgICCgYODg4WHiomFhYWDg4OCgoKCg4OEhIWFfn5+fn19fX1+fn5+fn5/f4CAfn5+fn9/fn5+fn9/f39+fn5+fn5+fn5+fn5+fn9/fn59fX19fX1+fn5+fn5+fn5+fn5/f399fn5+fn19fn5+fn5+fn5+fn9/fn5+fn5+fn5+fn5+f359fX5+fXx7eXl5eHh7e3x8e3t7fH5/goKBf357eHV0d3p8fH59fH17enp6enp5enp7enx8e3x9fXx7ent7e3x8e3t7e3t7e3t8fHx8fX19fX1+fn59fX5+fX19fn9+fX19fX19fn5+fn5+fn5+fn5+f3+AgIGBg4ODg4ODgYGAf39/fn5+f4CBgoKDg4ODhISEhISDgYKDhYODhISEhYaHh4eFhoKAfn18ent8fX5/gIGChIWGhoWFg4KBgICBgIKBg4SEg4aKi4eFhYODg4GBgYGCgoODhIR+fn5+fX19fX1/fn5/f39/f39+fn59fn5+fn5+f39/f35+fn5+fn9/f39/f39/f39+fn19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fX1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5/fn19fX59e3l5enl5eHp6fHx8e3t8foGCgX9/fXp3dXV2enx9fH19fHt4eHh5eXp4eXt7fHx8fHx8enp6e3t7fHx7e3t7e3x8fH19fX19fXx8fX19fX5+fn5+fn5+fn59fX19fX19fX5+fn5+fn5+fn5+fn9/gICBg4KDg4OBgYB/fn5/f39/f4CBgoOEhISEhISEhYSCg4SFhISFhYaHhoaFhYKBf3t6enl5fH5/gYKDg4aGhoeHhoaEg4GAgYKAgYKCg4ODhIiKiIWEgoGBgICAgIGBg4OCgn5+fn59fX19fX9+fn9/fn5/f35+fn1+fn5+fn5/f39/fn5+fn5+f39/f39/f39/f35+fX1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn59fX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn9+fX19fn17eXl6eXl6enp8fHx7e31/goOBf399end1dXV5fHt6fHx7enh4eHl5enh5enp7e3t7e3t6enp7e3t8fHt7e3t7fHx9fX19fX19fHx9fX19fn5+fn5+fn5+fn5+fn5+fn5+fX1+fn5+fn5+fn5+f3+AgIGCgoKCgoGAgIB+foCAgICAgYGCg4OEhISEhISFhYSEhIWFhoeHiIiGhIKBgH99fXx6eXl9goKEhYaHiIiIhoaGhoSDgoGAgYGBgoKDg4OEh4iJhYKAgYGAgICAgYGCgoGBfn5+fn19fX19f35+f39+fn5+fn5+fX5+fn5+fn9/f39+fn5+fn5/f39/f39/f39/fn59fX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+f359fX1+fXt5eXp5eXp6ent7e3t8foGCgoB/fnx6d3V1dXh7e3p7e3t6eHh4eXl6ent5eXp6e3t7e3p6ent7e3x8e3t7e3t8fH19fX19fX18fX19fX1+fn5+fn5+fn5+fn59fX19fX18fH5+fn5+fn5+fn5/f4CAgIGBgYGBgYCAf39/f39/f3+AgYKDg4SEhISEhIWFhYWEhYWGh4eIiYaDgX+BgYCAf3x6e4CEhYeHiYmHhoaGhoaGhYSCgYGBgYKCgoODgoOGh4mFgX+AgICAgICBgYGBgYF+fn5+fX19fX1/fn5/f319fX1+fn59fn5+fn5+f39/f35+fn5+fn9/f39/f39/f39+fn19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5+fX1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fX5/fn19fX59e3l5enl5enp6enp7fH5/goKCgH59fHp3dXRzd3t9fHt8e3l4eHh5eXp7e3l5enp8fHx8enp6e3t7fHx7e3t7e3x8fX19fX19fn19fX19fX5+fn5+fn5+fn5/f319fX19fX19fn5+fn5+fn5+fn9/gICAgYGBgYGAf4CAgICAgICAgIGBgoODhISEhISEhYWFhYSFhIWGhoeIhYKAf4GCgoGAf31/g4aIiYiJiIaEhIWFhoaFg4KBgICBgoKCg4ODg4WGiYWCgH9/gICAgIGBgYGAgH5+fn59fX5+fn5+fn5+fn5+fn5+fn5+fn5+fn59fX5+fn5+fn9/fn5+fn9/f39+fn19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn5+fn5/f39/f39/f39/f39+fn5+fn5+fnx6enp6enp6ent7enp8f4GCgH98enp8end1dnV2eXx8fH18eXl2dnd4enp7eXp6ent7e3t7ent7enp8fHx8e3t7fH1+fX1+fn5+fX19fX19fn5+fn5+fn5/f4CAfn59fX19fn5+fn19fX19fX5+fn5+foCAgICAgIGAgICAgICAgICAgIGBgoKDhYWEhISFhYaEhIODhISEhIWFhIODg4ODgoKCgIOFhoeHh4aFg4GDhYWFhYaFg4F/foGBgoKDg4OEhYWHhoKAgIB/gIGBgICAgH9/fn5+fn19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn19fn5+fn5+f39+fn5+f39/f35+fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39+fn5/f4B/fHp7e3p6enp6e3t6e36Ag4KBfnx7enp5eHZ0dHZ6fXx9fHx5eXZ2d3h6enx7enp6e3t7e3t7enp6enx8fHx7e3t8fH19fX9/fn59fX19fX1+fn5+fn5+fn+AgIB/fn5+fn5+fn5+fX19fX19fn5+fn5+gICAgICAgICAgICAgICAgICAgYGCgoOFhYSEhYWFhoSFhIOEhISEhIWFhISEhIODg4OChIWGhoaFhISBgIKEhoWFh4eEgoB+gYGCgoODg4SFhYeHg4GBgH+AgICAgICAf39+fn5+fX1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fX1+fn5+fn5/f35+fn5/f39/fn59fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5+fX1+fn5+fn5+fn5+f39/f39/f39/f39/f35+fn+AgX98ent7e3p6enp7fHx9gIKDg4F/fHx7e3l4dnFydnt9fHx8e3l5d3d3d3p6fHt6enp7e3t7e3t6eXp6e3t8fHt7e3x7fHx8fn5+fn19fX19fX5+fn5+fn5+f4CAgIB+fn5+fn5+fn59fX19fX1+fn5+fn5/gICAgICAgICAgICAgICAgICBgYKCg4WEhIWFhYWGhoWFhIOEhIWFhYWEhISEhISEhIOEhIWEhISDg4B/gYSGhYWHiIaEgYCBgYKCg4ODg4SFh4eFgoCAf39/f39/f39/f35+fn59fX5+fn5+fn5+fn5+fn5+fn5+fn5+fn59fX5+fn5+fn9/fn5+fn9/f39+fn19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fX19fX5+fn5+fn5+fn5/f39/f39/f39/f39/fn5+f4GCgHx6e3t9fHt6ent8fX+BgoOCgH19e3p6eHh2cXJ1fH18e3p5eXl4d3Z3eXp8e3p6ent7e3t7e3p5enp6enx8e3t7fHt8fHx+fn5+fX19fX19fn5+fn5+fn5/gICAgH5+f39/fn5+fn19fX19fX5+fn59fn+AgICAgH9/gICAgICAgICAgIGBgoKDhYSFhYSFhYaGhoWEg4SEhoaHh4WFhYWEhISEhYSDhYODhIODgH+BhIWHiIeIiIaCgoGBgoKDg4ODhIWGhoaEgYB/f39/fn5+fn9/fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39+fn5+fX1+fn59fX5/gIB/fXt7e359fHt6e3t9gYODg4F/fHp5enp4d3Z0cXZ8fnx8enh3eXd3dXd4eXt7enp5e3t7e3t7e3p6e3p6e3t9fX1+fHt9fX19fX19fX19fn5+fn5+fn5+fn+AgIGBgICAf39+fn5+fX19fX19fX19fX5/fn5/f39/fn5/f39/gYF/f4CAgYGCgoOEhYWHhoWFhYWGhoSDhYWFhoeGh4eHh4WFhYWEhYSEg4OEhIKBgICBgoSGh4iIhoSDgICCgoODgoKDhIWGh4WCgH9/f39/f35+fn59fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f35+fn5+fn5+fn19fX5/gH99fHt7fHt8e3t8foGCg4KBfnx7enl5enp4dnNxd3x/fHp4d3d5d3d1dXZ4enp6enl7e3x8e3t7enp7enp7e3x8fH18e3x8fHx9fX19fn5+fn5+fn5+fn5+f4CAgoGBgYB/f35+fn59fX19fX19fX19fn5+fn5+fn5/f35+f3+AgH9/gICBgYKCgoSEhIWFhYWFhYaHhYSFhYSGh4aHh4eHh4eHh4SFhISDg4SEgoGAgICBhIWGh4mHhYOBgYKCg4OCg4OEhIWGhYOBf39/f39/fn5+fn19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn5+fn9/fn5+fX19fn9/fn18e3t7enx8e3x/g4SEgYB8ent6eXl5eXh2cXB2fH17eXZ2d3l4eHV1dXh6enp6eXp6e3t7e3t6ent7e3t7e3t8fXx7fHx8fHx8fX1+fn5+fn5+fn5+fn5/gICCgoKCgX9/fn5+fn19fX19fX19fX1+fn5+fn5+fn9/fn5/f39/f3+AgIGBgoKBg4ODg4SFhYWFhoeHhoWFg4WGhoeHh4eIiIiIhoWDg4KCg4OBgICAgIGDhIWHiYeFg4KCgoKDg4ODgoOEhYaFhYKAf39/f39/f39/fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+gICAgH9/f39+fn5+f39+fn58fH1+fn5+fXx7e3t7fHx6fX+ChISAf3x7fHx6eXd4eXRwcHV7fHl5dnZ3eXl4dnV2d3l5enp5enp5eXt7e3t6e3x8e3t7e3t8fHt8fHx8e3t9fX9/fn5+fn5+fn5+fn+AgIKCgoKBf39+fn5+fX19fX19fX19fX5+fX5+fn5+fX1+fn9/f39/f4CAgYGCgoGCgoKCg4SFhYWGh4aFhYWDhIaHiYmIiYmJiomHhIKCgYGCgoB/f3+AgIOEhYeJiIWDgoKCgoODg4OCgoOEhYaFg4B/f39/f4CAgIB9fX19fX1+fn9/fn5+fn5+f39/f39/f39/f39/fn5+fn5+fn5/f4CAgIB/f39/fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5/f35+f39/f35+fn5/f35+fn18fn9/f358fHx7e3t7e3p9gIOFg39+fH1+fnt7eXh3c3BvdHh7enl2dnZ3d3h5eHh3eHh5enp5e3p6e3t7e3t8fX18fHx8fX19fX19fHx8fH19fn5+fn5+fn5+fn5+f3+AgYOCgoGAf35+fnx9fXx9fX1+fn19fX19fXx8fn5+fn5+fX1/f39/f3+AgICAgICCgoKCg4WFhoaHhoaGhYOEhIaIiYmJiYmLioaFg4KAgICAgH9+fn5/goSGiImHhYOCgoKCg4OCgoKDg4SEhYWEgYB/fn5/gICAgH19fX19fX5+fn5+fn5+fn5/f39/f39/f39/f39+fn5+fn5+fn9/f39/f39/f39+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn9/fn9/f39/fn5+fn9/fn5+fn1+f39/fnx9fXt7e3t7e36Cg4OBfXx8foCAfXx6eHZyb29zeHp5eXZ2dnV3eHp6eXd4eHl6enl7e3t7e3t7fHx9fX18fHx8fHx8fX19fX5+fX1+fn5+fn5+fn5+fn5/f4CBgoKCgYB/fn5+fH19fH19fX19fX19fX19fHx+fn5+fn5+fn9/f39/f4CAgICAgIGBgYGCg4WFhYaHh4aFhISEhoeIiYiJiYmIhYSCgYCAgICAfn5+fn+BhIWGiIiGhIODgoKDg4KCgoKChISFhYWDgoB+f3+AgICAfX19fX19fn59fX5+fn5+fn9/f39/f39/f39/f35+fn5+fn5+f39/f35+f39/f35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+f39+f39/f39+fn5+f39+fn5+fn+AgIB+fH59e3t7e3x9f4KCgH58fH5/gYF/fHl3dXFubnJ2eXl5dnZ2dXd5e3t6eHd3eXp6eXt7e3t7e3t8fH19fXx8fHt7e3t8fH19fn59fX5+fn5+fn5+fn5+fn9/f4CAgoKBgH9+fn9+fX18fX19fHx9fX19fX1+fn5+fn5+fn9/f39/f39/gICAgICAgYGBgYGChIWFhoeHhoaEhISFhoeHh4iIh4aCgYB/f39/f399fn5+f4GEhYaGiIaEg4OEhIODgoKCgoKDg4SFhYWEgYB/f4CAgIB9fX19fX1+fn19fn5+fn5+f39/f39/f39/f39/fn5+fn5+fn5/f35+fn5/f39/fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35+fn5/f35+fn5+f4CAgH9+f357e3t7fH+AgYF/fXt7f4GCgoB9eXd1cm9vcXV5eXl2dnZ2eHl8fHt5d3d5enp5e3t7e3t7e3x8fX19fHx8e3t7e3t7fHx9fX19fn5+fn5+fn5+fn5+f39+gH+CgoGAf35+f359fXx9fX18fH19fX19fX5+fn5+fn5+f39/f39/f3+AgICAgICAgICAgIGEhYWGhoeHhoSEg4WGhoaGhoaFg4GAf35+fn5+fn1+fn5/gIODhYWHh4SEhISEg4OCgoKBgoKCg4SFhoWDgYB/gICAgH19fX19fX5+fn5+fn5+fn5/f39/f39/f39/fn5/f319fn5+fn9/fn5+fn5+fn5+fn5+fn5+fn58fH1+fn5+fn5+fn5+fn5+fn5+fn59fX5+f39/f35/gICAgH9/fn5/f39/fn5+fn+Af3+Af399fHt6e3p9f4GAf317fHx+gYKCgH15eHZzcXBxdXl5eHd1dXd5en19fHt5eHl5enh6enp8fHt8fX19fXx8fHx7e3t7enp7e319fX18fn5+fX19fX19fn5/f39/f4CBgoGAf35+fn19fX19fX19fH19fX19fX1+fn5+f39+fn9/f39/f39/f39+gICAgICAgIKDhYaFh4eGhYSEhISFh4aFhIGBf35+fn5+fX1+fn5+f3+BgoOFhYiGhYSEhISDgYKCgoKCgYKEhIWFh4SDgYCAgICAfX19fX19fn5+fn5+fn5+fn9/f39/f39/f39+fn9/fn5+fn5+f39+fn5+fn5+fn5+fn5+fn5+fnx8fX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/fn+AgICAf39+fn9/f39+fn5+f4CAgICAf318e3p7e35/gH9+fHt8fX6BgoKAfXl4eHVyb3B0d3h4d3Z1d3p8fX18e3p6eXl5eHl6ent7e3x9fX19e3t7fHt7e3t6ent7fHx8fHx9fX19fX19fX1+fn9/f39/gIGCgYCAf35+fX19fX19fX18fX19fX19fX5+fn5/f35+f39/f39/f39/f36AgICAgICAgYGEhYWHh4eFhYSEg4SGhoSCgYB/fn5+fn59fX5+fn5/f4CBg4WGh4aFhISEhIOBgoKCgYGBgYKEhISGh4aCgYCAgIB9fX19fX1+fn5+fn5+fn5+f39/f39/f39/f35+f39/f35+fn5/f35+fn5+fn5+fn5+fn5+fn5/fnx9fn5+fn5+fn5+fn5+fn5+fn5+f39+fn9/f39/f4CAgIB/f35+f39/f35+fn5/gIGBgICAfnx7ent9f4B/fn18e3x8foGCgn9+enl4dXNwcHN1eHh3d3Z3eXt8fXx8ent5eXl3eHl5enp7fH19fX17e3t8fHx8fHt7e3t7e3t7e3x8fH19fX19fX5+f39/f3+AgYKCgYB/fn59fX19fX19fXx9fX19fX19fX1+fn9/fn5/f39/f39/f39/foCAgICAgICAgIKEhYWGhoWFhISDhIaGg4KBgH59fn59fX19fn5+fn9/f4GDhIWHhoWEhISEg4GCgoKBgYGAgYODhIaIiIKBgICAgH19fX19fX5+fn5+fn5+fn5/f39/f39/f39/fn5/f39/fn5+fn9/fn5+fn5+fn5+fn5+fn5+fn9+fH1+fn5+fn5+fn5+fn5+fn5+fn5/f35+f39/f39/gIGBgYCAfn5/f39/fn5+fn+AgYGAgIB/fXt6e36BgH99fHt7fH1+gYKCf396eXh1c3BwcnR3eHd3d3d4ent9fHt6e3p5eHd4eHh6ent8fX19fXp7e3t8fHx8e3t6enp6enp7fHx8fX19fX19fn5/f39/f4CBgoOCgYB+fn19fX19fX19fH19fX19fX18fH5+f39+fn9/f39/f39/f39+gICAgICAgIGAgYOFhYaGhYaEhIOEhoaFg4GAfnx+fnx8fX1+fn5+f39+gIKEhYaGhYSEhISDgYKCgoGBgYCBg4ODhoiIhIKAgICAfX19fX19fn5+fn5+fn5/f39/fn5+fn5+fn5+fn9/f39/f39/fn5+fn9/fn1+fn5+fn5+fn19fn59fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f4CAgICAgIGBgIB/f39/fn5+fn5+f4CBgYGBgH98e3t9f4GDgX58e3t7fH2AgYKAfnx5d3Zzb29xc3V3eHZ3d3h5eXx8e3x8enl5eHd3eHl5eXp7e319e3t6fHt7e3t6enp6enp5eXp6e3t7fHx8fX1+fn5+fn9+f4KDgoKBgH59fX19fX19fX19fX19fX18fH19fn5+foCAf3+AgICAgICAgH+Af39/f39/f39/gYSEhYaGhYaFhYWGhYWFgoB/fn19fX19fXx9fX5/f3+Ag4SFhYaGhIODg4ODgoKBgYGAgIGChISGiYiGg4CAf399fX19fX1+fn5+fn5+fn9/f39+fn5+fn5+fn5+f39/f39/f39+fn5+f39+fX5+fn5+fn5+fX1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/gICAgICAgYGAgH9/f39+fn9+fn5+f4CAgICAf3x7e36AgoGAf3x7e3t8fYCBgoF/fnp4eHRwb3Bxc3Z3dnh5eXl5e3t7fHx6eXl4d3d4eXl5ent7fX17e3t8e3t7e3p6enp6enp6enp7e3t8fHx9fX19fn5+fn5/gYOCgoGAf319fX19fX19fX19fX19fXx8fX1+fn5+f39/f4CAgICAgICAgIB/f39/f39/f3+Ag4OFhoWFh4eHhoaFhYWDgIB/fX19fX19fH19fn9/f4CChIWFhoaFhISEhIOBgoGBgYCAgIKDhIaIiIeDgIB/f319fX19fX5+fn5+fn5+f39/f35+fn5+fn5+fn5/f39/f39/f35+fn5/f359fn5+fn5+fn59fX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f3+AgICAgICBgYCAf39/f35+f35+fn5/gICAgIB/fHt8f4KCgIB/e3t7fH1+gIKCgoB+enl4dHBvcG9xdHV2eXp6eXl7e3t8fHp5eXh3d3h5eXl6e3t8fHx8fHt7e3t7enp6eXl5enp6ent7e3x8fH19fX1+fn5+fn+AgoKDgoGAfn19fX19fX19fX19fX19fn5+fn5+fn5+fn9/gICAgICAgICAgH9/f39/f39/fn+BgoOFhIWGhoeGhoWFhYSCgX99fX19fHx8fX1+f39/gIGDhYSGhoaFhISEgX+BgYGBgIB/gYKEhoeKh4SBgH9/fX19fX19fn5+fn5+fn5/f39/fn5+fn5+fn5+fn9/f39/f39/fn5+fn9/fn1+fn5+fn5+fn19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f4CAgICAgIGBgIB/f39/fn5/fn5+fX5/f39/gH98e3yAgoJ/f357e3t9fn6Ag4SDgX97eXd0cXBwbW5xdHV4eXl5eXp6e3x8ent7eXh4eHl5eXp7e3t7fX18ent7e3t6enp5eXl6enp6e3t7fHx8fX18fH19fn5+f4CCgoOCgoB/fX19fX19fX19fX19fX1+fn9/fn5+fn5+f3+AgICAgICAgICAf39/f39/f39+f4CBg4SEhIWGiIaGhYWFhYSCf319fHx7e3x9fX5/f3+AgIGEhIaGhIODg4OAgH+AgYGAgH+BgoSGh4qIhYGAf39+fn5+fn5+fn5+fn5+fn9/fn5/f359fn5+fn5+f39/f35+f39+fn9/f39+fn5+fn5+fn19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/gIB/f4CAgICAgICAfn5+fn9+fn19f3+AgICAfnx9foKDgH9+fHt8fH18foCChIODf316eHVycXBubm9xc3Z3enh5eXp9fX18e3t6eXh5eXl6enl6fHx8fHx7enp7enl5enl4eHp6enp6enx8fHx8fHx8fX1+fn5+f4CBgoKBgH9+fX19fX18fHx8fHx9fX19fX1+fn5+f39/f39/f3+AgICAfn5/f39/f39/f35+f4GBg4SDhYaHhoaFhYWFhYOAfn17ent7fHx8fn5+fn+BgoKEhYWEhISEg4GAfn6BgoGBgIGCg4OFiIiFgoGAgH5+fn5+fn5+fn5+fn5+f39+fn9/fn1+fn5+fn5/f39/f39/f35+f39/f35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f3+AgH9/gICAgICAgIB/f39+f39+fX1/f4GBgYB+fH6Ag4N/fn18e3x8fXx+gIKEg4KAfnp3dHJubm9ubnBzdHd6ent5eXx7fHx7e3p7e3l5eXl5eXp8fHx8fHx7e3t6enp6eXl5enp6ent7fHx8fHx8fHx8fHx8fX5+f4CCgoGBf399fX19fXx8fHx8fH19fX19fX5+fn5/f39/f39/f39/f39+fn9/f39/f39/fn5/gICCg4OEhoeHh4WFhYWFhIF/fXx6e3t8fHx+fn5+f4GCgoSFhYWFhYWDgoB9fYCBgYGAgYKDg4SIiIWCgYGBfn5+fn5+fn5+fn5+fn5/f31+f39+fX5+fn5+fn9/f39/f39/f39/f39/fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f4CAf3+AgICAgICAgICAf35/f359fX+AgoKCgH59f4KDgn9+fHt7fHx9fH6AgYKCgoB+e3Z0cm5ub25ucHJzdnl6fHp4eXl7e3t7enp6eXl5eXl5enx8fHx8fHx8e3p5eXl4eXl5eXp6fHx8fHx8fHx8fHt8fHx9fn5+gIGBgYKAgH59fX19fHx8fHx8fX19fX19fn5+fn9/f39/f39/fn5+fn5+f39/f39/f39+fn5+f4GCgoOFh4eHhYWFhYWEgoB+fHt7e3x8fH5+fn5/gIKCg4WFhYWFhYOCgH18foCBgYCBgoODhIiIhoOBgoJ+fn5+fn5+fn5+fn5+fn9/fX5/f359fn5+fn5+f39/f35+f3+AgH9/f39+fn5+fn5+fn9/fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/gIB/f4CAgICAgICAgIB/fn9/fn19f4GCg4OAfn5/goOCf398ent8fH18foCAgoKBgX57d3NxcXBvbm5wcnN2eHl6e3h5eXt7e3t6eXl5eXl4eHl6fHx8fHx8fHx7enp5eHh5eXl5enp7fHx8fHx8fHx8fHx7fHx+fn5/gICBgoGAf319fX18fHx8fHx9fX19fX1+fn5+f39/f39/f39+fn5+fn5/f39/f39/f35+fn5+gIGCgoSHh4eFhYWFhYWCgH99fHx8fHx8fn5+fn+AgYKDhYWFhYWFg4KAfXt+gIGBgIGCg4OGiIiHg4KCgmtsbW5vb29ub29vcnR1dnZ3eHp6enp3dXJwcXFwcHBwcXFyc3N1eHl6enl5eXl8fH19fn+AgICAgICAgICAf39/fX5+fX19fX19fX17e3x8fHx8fHx8fHx8fH19fn5+f4CBgoOEhIWFhYWGhoWFhoaEg4J8c2pkXltdX2FkYV9dW15jZWhoZWBgYmdsc3qAhIWFhISBe3FmXVlYXWJqdHp+gX97dXJwcG1pZmFhZGdrbnBydnl6gIGAgICAgH9/f3x3cG1qampqampqa2tucXF0dXV1dXV2dnV3dnd5eHVwZltYVFZbXmNob3mAgYGBgYKCg4GAgH5+fHh2dG9tamdnY2RmZ2doZmhqam1wcnR0dHR0c3JycXBvcXV0dXV6fH9/enZwbGhiYmRjYVxaXWRrbnR0c3Jyc3V3en6Cg4WCa21ub3BwcG9wcHBzdXZ3d3d4enp6eXd1cnBxcXBwcHBxcXJzdHZ3eXp6eXl6enx8fX19f4CAgICAgICAgIB/f399fn59fX19fX19fXx8fHx8fH18fHx8fHx8fX1+fn5/gIGCg4SEhYWFhYaGhoaGhoSDf3lvaGNfXF5fYWNgXVxaXWFlaGdkYWBiZWlxeH+DhYWEhIJ6cmhdWVhbY2lzen6Afnp2c3BvbWhmYWFjZmttbmtuc3l+gICAgICAf359enRua2lpaGhoaGlrbG5wcXR1dXV1dXZ2dXd2d3l4dXBmXFdUV1xeY2hweH+BgYGBgICBf4CAfn58eHVzbmxpZ2djZGZoaGlnaWpqbXBydHR0dHRzcXFxcG9xc3Jxc3d5fn56dXBsZ2JiY2JhW1lcY2tvdHRzcnJzdXd6foOEhoNsbm9wcHBvcXJyc3R1dnd3eHp6enp4dnRycHFxcHBwcHFxcnN1dnZ4enp5eXp6e3t8fHt9fn5/f4CAgIB/f39/f31+fn19fX19fX19fX18fH18fnx8fHx8fHx9fX5+fn+BgoKDhISFhYWFhoaHh4aGhIN9d29nY19dXl9iYl1aWVhbX2RnZ2ViX2FjZm11foKFhYSEgntzaV5bWVtiaHB4fX58eHRycG1uaWZiYmJlam1vbm9yd3t/gIB/f3+AfHp2cWtpaGhoaGhoaWtsbm9ydHV1dXV1dnZ1d3Z3eXh1cGdcVlVXXF5jZ3B3f4GBgYGAgIF/gIB+fnt3dHBsamloZ2RlZ2lpaWlqa2ptcHJ0dHR0c3JwcHFwb3FzcnBydnp8fHl0cW1oY2JjYmBcWl1ja3J1dXNycnN1d3p+g4WIhW5wb3BwcG9zdHR2dXZ3eHh5enp6enh2dHJwcXFwcHBwcXFyc3N1dnd6ent7enp7e3x8e3x+fn9/gICAgH5+f39/fX5+fX19fX19fX19fXx8fX1+fnx8fHx8fH19fn5+f4GCgoOEhIWFhYWGhoeHhoaEg3x2bmdjX19eYGNiXVpYV1pfZGhqaGNgYWFlbnR9goWFhISCe3JpYV1bXGJnbnV8fHp1cnFvbW1pZmRiYmRpbnN2d3d2e36AgH5+gH97eXRvamhoaGhoaGhoaWxub3J0dXV1dXV2dnV3dnd5eHVwZ11WVVdbXmRmb3eAgYGBgYCAgX+AgH5+e3dzbmxpaWloZmZoaWloampraW1wcnR0dHRzcXBwcXBucXNycHR4e3t7eHRxbGhlZGRjX1xaXGRtdHZ2c3Jyc3V3en6Eh4iFbW9xcXJycnN0dXR1dnd4eHl7e3t5d3VzcXBwcHBwcXFycnJzdHV1d3l5eXt9fXx8fHx8fX1+f39/f39/f31+fn9+fn58fH5+fn59fXx8fX1+fn5/fXx9fX19fn5+fn9/gYKDg4SEhYWFhYaGhoaGhIOCfXZtZ2FdXl9jZGFdWlhWWV1lbG5pZGFgYGVtdHyCg4WFhYN/dWxlYmBgY2hvdHt5dnRxb21uamloZ2RjZGhvd32DgXl4e3+Af39/fXt4cm5qaGhoaWlpaWlqbG5vc3V3dnZ2dnd3dnd3eHh5dXBnXVZVVlpeZGhvd35/f4CAgICAgICAf3x6dXJvamdoaGdnaGhqamlramttbnBzdHN1dXJvcHBwb3BycnFxdHh6fHx3c3FrZ2VjY2FfW1xgZWxzdXRzc3N0dnh5fYSHiYZub29xc3NxcnR1dXZ3eXl5eXt7e3l2dnJxcHBwcHBxcXNzdHR0dnZ3eXl5e3x8fHx8fH19fX5/f39/f39/fX5+f39+fn19fn5+fn5+fX18fH5+f399fH19fn5+fn5+f3+BgoODhISFhYaGh4eGhoaEg4J+dm5kXVxeYWNjYV9aVlVYYGpxcmxkYGBhZmxyeoCDhYWFg4B6cmhjYGBkaG1yeHdzcW5sbG1qampqZmRlaXR+gYaFe3Byen6Bf358eHNwbGhoaWlqamlpaWptb3BydHZ2dnZ2d3d3d3d4eXp2cWddV1VXWl5kZ293fH9/f3+BgYCAf39+e3dyb21pZ2hoZmZnaWpqamtsbW1tcHN1dHR0cm9vb29tcHJxcHJ0eHp7endzbmllY2FiYV9eX2JmbHN1c3JydHV1eHp+g4eIh25vbnBycnFydHV2d3h5enp7fHt7eXZ2cnFwcHBwcHJyc3N1dXV3d3h5eXl7e3t8fHx8fX19fn9/f39/f399fn5/f35+f39+fn5+fn59fX19fn9/f318fX1+fn5+f39/f4CBgoOEhIWFhoaHh4aGhoSDgn93bmJdXl5jY2NiYFlUVFpkb3R1bmVhYGJma3F3f4OFhYWEgXtzbGZhYWVpbG90dHBubWxsbGxsbGpoZmdrd3+DhYN5bnF4f4KAf3p2cWxpaGppaWtrampqa21vcXJ0dnd3d3d3d3d3d3h5enhyaV9YVFdbX2NnbnV8f39/f4CAf39+fXp2c29samhoaGhmZmdqbGxsbW5ubGxwc3Z0c3Nyb29vb21vcXBvcnR4ent5dnJsaGNhYGFjYGBiY2duc3RycXF0dXV3en+FiIiIbm5tbnFxcnNzdHV2d3h7ent8e3t5d3Z0cXBwcHBwcnJzc3NzdXd3eHl5eXt7e3x8fHx9fX1+f39/f39/f31+fn9/fn5+fn5+fn5/f35+fn5/gICAfXx9fX5+fn6AgH9/gIGCgoSEhYWGhoeHhoaGhIOCf3huZWFgX2RlZWBeWFVUXGhxd3duZ2FhYWRrcXd+g4WFhYSBe3NsaWNjZmpsb3J0cG5tbGtsa21tbGtoaG52foOEgXdwcXuAgoF+eHVvbGpoaGpqa2tqamprbnBxcnV3d3d4eHd3d3d3eHl5eHNrYVlUVltgY2dtdHt/f35+f39/f357eHNubGpnZ2hoaGdmZ2ttbW1vbmxsbHBzdHNzc3Jvbm5wbnBxb29ydHl6e3l0cG1qZGJgYWVjY2Rmam5yc3JxcXR1dnh5f4aJiYhubm1ucHFzdHR1dXZ3eHt8fn58e3l3dnVycXFxcHBxcnJ0c3V3eHh4eHh6ent7ent9fX19fX5+f39/f39+fn5+f39+fn19fn5/f35+f39/f4CBgIB+fn5+fn5+f4CAgICBgYKCg4OEhIeHh4eFhYWFhIJ+eW5oZWJkZWZjXlxXVVZfbHV7enFqYmFgY2lvdXyBhISFhIJ8dXFqZWVmaWtvcHBvbWxsa2ttbm5uamhpbnZ9goJ/eHFxeH+Bf313c25raGhpaWpqa2tpaWtub3FydXZ4eHh4eHh4dnh4eXl5dGtiWlZWWmBjaG1zfH5/f39/gH5/fXl0b2ppaGdoZmVmZ2hpbW9vb29ubGprcHNzc3V1cm9vbW5wcG9tbXB0eHh6eHNwbWlkYV9hZWJhZGltcnR1cnBxdHV3d3l9hoqKiW5ubW5wcXN0dXZ1dnd4fH1+fnx7eHZ1dHJxcXFwcHJzc3V1d3h4eHh5eXp6e3t5e319fX19fn5/f39/f35+fn5/f35+fX1+foCAf39/f4CAgYGAgH9/fn5/f36AgICAgIGBgoKDg4OEhoaGhoWFhYWFgn95b2lnY2RlZWNeXFdVWWRweH18c2tkYWBiZmx0e4CDhIWEg313c2tlY2dpamxvb25tbGxsbG9wbm9sa2xvd36CgX54cnB0fH9+eXVxbGtpaWpsbm1ta2lpbG9wcXN1d3h4eHh4eHh3eHh6enl1a2NbWFdbX2JnbXN7f4B/f35+fn14dXFtaWhpaGdkZWZoamtub29vb2xqamtwc3NzdHRyb25tbnBwb21tcXV4eHh2cm9taGJgX2NlYmRoa3F0dnNxcHF0dnd3d3yGioqKbm5ubnBxdHV1dnZ3eXp9fn19e3p4dnV0cnFxcXJycnN1dnd4eHh4eHl5enp6enl7fX19fX19fn9/f39/fn5+fn9/fn5+fn5+f39/gH9/gICBgYCAgIB+f39/foCAgIGBgYGCgoKDg4SFhYaGhYWFhYWCgHpya2hkY2RlY2BeWVddaHR7f312b2hjYGBka3J5f4KEhYSEf3hya2RiZmhqa25vbmxsbGxscHBvb25ucXJ4f4GAe3d0b293fXx2cnBraGprbG9vb25raWpscHBzdHd4eXl4eHh4eXh5eXp7eXRsY1pXWV1fYmdsc3l+f39/f316eHRwb2xpZ2dmZWRlZmlqa21vb29vbGlqbXBzc3Nzc3JvbWxucHBvbW1xdXh4dXNwbWtmYmFhZWVlaGxvdHd2c3FwcXR2dnV1eYWKiopubm9wcHF0dXV2eHl8fH5/fn57eXd1dHNycXFxcnJxcnR1dnd4eHh4enl6enl5eXt9fX19fX1+fn9/f39+fn5+f39+fn5+fX1/f3+Bf3+AgIGBgICBgYGAf39/gYCAgoKBgYKCgoODhIWFhYWFhYWFhYKAenRtaGRiY2ViYF5aV2BseH5/fnhxamRgX2Nqcnh9gISFhYSAeXNrZmFjZWltbW1ta2xsbGxxcHBwbW90dXmAf3t1c3NvanN7e3Zxb2poam1ub29xb2tpaWtub3V2eHl5eXh4eHh5eHp6e3t5dGxjW1hYXF5hZmtzeXx+f39/e3Z0cG1qamhnZWRjY2Vmamxubm9vb29sampscHNzc3Nzcm9tbG5wcG9tbXJ2eHhzcW5raWZhYGNlZmhsb3F2eXdycHBxdXZ1cXR4hYmKimtsbm9wcXN1dnd4enp9fn5/fXt6eHZ1dHNycXFxcXJyc3V1d3h4eXl5ent7eXl6fH19fHx8fX5+f39/f35+fn5/f39/f39/fX9/gICAgIGBgYGBgYGAf39/f4CBgICBgYGBg4OCg4OEhISFhYWFhoSFg4F6dG5oZWNjYmBeXVtcZHB6f4KAenRqZGFeYmhudHuAg4SFg4F7dG1rZmRlaWtqaWpra2ttbnJzc3JzdHZ4en15c25ucXBobHV2dG9ramprbG5vcXJwa2hpa21vc3d4eXh4eHh5eXl5enp6e3p1bWVeWlpcX2FnbHJ3ent9fXt4c3BsaWdmZmRiYmNkZmhtbnBwcG9ubWxqaGxvcnRzcnNyb25sbnBxbm1ucXR2dXJxbm1rZ2NgYmZmam9ydXh6d3JwcXJ1dnRydHiEiYuLamxub3Bxc3V2eXl6e35+fn59e3p4dnV0c3NxcXFxcnJzdXZ3eHh5eXl6e3t6enp8fX18fHx9fn5/f39/fn5+fn9/f3+AgIB+gICAgICAgYGBgYGBgYB/gICAgIGAgIGBgYGCgoKDg4OEhIWFhYWFhISCgHp0bmhkYmJhYF5dXF5qdXyAg4B6dW1nYl5hZmxzeoCDhIWDgXx2b21oZWhqa2lpaWpsbG1wc3V1c3R2d3h7e3VvaWpvcGxocHNwa2lqbnBvcHJzdHBraGlrbW9zd3h5eHh4eHl5eXl6enp7enZuZl9aWlxfYmdrcXd6e3x6eHVwbGlnZWRkY2JiZGVoam5vcHJwb25tbGpobHBzdHNyc3JvbmxucHJvbW5xc3Ryb29sbGpmY2FjZmhtcnZ5e3p1cnByc3V2dHNydoKIiYpqbG5vcHFzdXZ5eXt9fn5+fXx7enh2dXRzc3FxcXFycnV2d3h4eHl5eXp7e3t7enx9fXx8fH19fn9/f39+fn5+f3+AgICAf4CBgYCAgICBgYGBgYGBgH+AgICAgYCAgYGBgYKCgoKDg4SEhYWFhYSDg4J+eHNsZmJgYGJhYF5eY294fYGDgHt2cWtjYGBma3F5f4OEhYOBfXdwbmlnaWtqaGlqa2xsbnF0dnV0dHd4eXl6dW5sbnFvbGlrb25paWtvcW9ucnR0cGtoaWttb3N3eXl6enl5eXl5eXp6ent6dm5mYV1bXV9iZ2pvd3p7end0cm5pZ2dlY2JjZGRlZmlrbm9xc3Bvbm1qaGhrcHN0c3Jzc3BubG5wcm9tbm9xcW9sa2traGRjY2VnanF2en19e3VzcnN0dXd0c3J2gIeHiGpsbm9wcXN1d3l6fH9+fn5+fXx7eHZ1dHNzcXFxcXJydXZ3eHh4eXl5ent7eXl6fH19fHx8fX1+f39/f35+fn5/f4CAgIB/gYGBgICAgIGBgYGBgYGBf4CBgYCBgICBgYGBgYGCgoODhISFhYWFhIODgX13cGllYmBgYWBgX2BlcXp+goOAe3ZybGVhYGVpb3d+goSFg4F/eXJuaWVoa2ppaWxtbGxvcXV3dnV1eHp5eHh3cnB0dG1ramhsbGdqbXBwbW1zdHRva2hpa21vc3d6e3p6enp5eXl5enp6e3p2bmZhXlteX2JoaW53ent5dXFua2dlZWNiYWNmZmVnaW1ucHBxcG9ubWpoZ2txdHRzcnN0cW5sbnBxbm1ubm5ubWpqaWlmZGRkZmpsc3p9f356dXJzdHV2d3RzcnR/hoeHbG1vb29wcXZ4enx9f39/fn19e3l2dXRzcXFxcXBwcXJ0dXZ4eXl6eXp7enp5eXt7fX15enx9fH1+fn9/fX1+foCAgICAgICAf3+AgYCAgYGBgYKCgYCAgYGBgYGBgYGBgYGBgYGCgoODhISEhISDg4OBe3VuaWVgXV1gYF5eYml1fIGCg4J/e3RsZmFgYmdwdnyBhISEgX17dnBraWdrbGloa25tbnBydXZ2dnZ7fXp3d3Z2d3l2a2hpaW1xbW5wdHZybW9xcnBraWlqbXByd3l6eXl5eHl5eXl6enp6eXdvaGNgXV5gY2Zrb3R4eXVzbmxpZ2RkYl9hYmRmZmhsbXBxcnJwbW1uamhoa3J2dXRzdHNwbmxtb3Bta2xsbGtqamhmZmNiYmVna250e35/fnh0cnJ0dnd3dHFwdX2DhoZtbW5wb3Byd3l7fn5/f39+fX17eXd1dHJycnJycHBydHR1dnh5enp6enp7e3t7e3t7e3l7fH18fX5+f39+fn9/gICAgICAgIB/f4CBgICBgYGBgoKBgIGBgYGBgYGBgYGBgYGBgYKCg4ODhISEg4ODgoB6cmxnYl5cXV9fX2FmbnZ+goKDg4F9dW5oYmFiaHB2fICDhISDfn13cmxqZ2hqamlqbGxtcHN2dnh4d3x/enV1eXp7eXNsZ2ZnbHFycXR/gXxzbnFycGxqaWptcHJ3ent5eXl5enl5eXp6enp6eG9pZGBeXmFjZmpucnZ3c3BtamVkY2NiYGJjZWdoam1tcHBxcW9ta2xraWlscnZ1dXR0c3BubG1vcG1paGlpZ2ZnZWVkY2JhZGdrcnh8f399d3RxcXR2eHZzcXF0e4KFhW1tbW9vcHJ3eXx/f39/f359fXt5dnV0c3NzcnJycnN0dHV2eHl6ent6ent7fHx7e3l5enx8fX1+fn5/f39/gICAgICAgICAgH9/gIGAgIGBgYGCgoGAgYGBgYGBgYGBgYGBgYGBgoKDg4OEhISDg4OBfXhxamVfXVxeX19gY2hxen+CgoODgn53cGpkYmFnbnV6f4KEhIOAfnhybWpnZ2hramprbG1xdHZ4enp6fn95c3V6fX12cW5oZWVpb3N0eoKCfHRwcXJwa2lpamxvcnd7fHt7enp6enp6e3t6enp4cWpkYF5eYWNmaGxwdHRxbGpmZGNiYmRkZGVnaGpsbW1ubnBwbmxrbGxqam5ydnV1dHRzcG5sbnBwa2hnZmZmZWVlZGNjYmFlaGxyeH1/fXt3c3BxdHZ3dXJxcHJ6gYWFbW1tbm5wcnh6fX9/f39/fn19e3l3dnVzc3NxcXJycXN0dXZ4eXt7e3x8e3t6ent7eXl7fHx9fn9+fn9/fn+AgICAgICAgICAf3+AgYCAgYGBgYKCgYGBgYGBgYGBgYGBgYGBgYGCgoODg4SEg4KDgoB8eHBoY15dXV9gYGBjbHV7gYKCg4ODf3hya2ZiYGZscnh+gYSEgoF+eXNtamdnaGppbWxub3J1eHp7e3t/gHpzdXp+fHRvb2pmZWdscnV7gH54dHJycnBpZ2lqa29yd3t8fX17e3p6fHx7e3p7e3hzbGNgXl5hY2ZobG9ycW5qaGVkY2JiZGRkZ2lrbG5vb21tcHBubGxtbWxsbnJ2dXV0dHNwbmxvcXBqZmVlZWRjYmRkY2NhY2ZpbHJ4e358e3dzcXR0dnZ1cXFwcXmAhIRsbG5vb3F0d3t+fn5/f35+fHx7eXZ2dXNycnFxcHFxc3V2dnd3enp6enp6enp6enp7e3t8fX59fn5/fn5/gICAgYGAgICAgICAgIGBgoKCgoKCgoKCgoGBgoKCgoGAgICBgYGBgYKCg4ODg4ODg4KBfnlzbmdjYF9fYGBgYWVtd3+CgoKDg4OAe3VtZ2BgY2hvdXyCg4ODgX95c25qZmVoamprbHBydHd5enx6fH5/d3F3fn55dXJva2ppaGpvcXh8eHJxdXZ0b2pnaGtscHJ3fH18fHt7e3p8fHt7e3t7eHJrZGFfX2JjZWdqbnBvamhlZmRiYWJiY2dpaGptb29ubW1vb21tbm9ta2tvc3V1dXV1c3BtbG9wb2ljYmVlYWBhZGNkZGRmZmhtcnh8fHt6dXFxc3N1dXJxcXBweH+CgmxsbG5vcnV4e31+fn9/fn58fHp4dnZ0c3JycXFwcXJzdXZ3eHh6enp6enp6e3t6ent7ent9fn1+foB/f3+AgICBgYCAgICAgIGBgYGAgIKCgoKCgoKCgYGCgoKCgYCAgIGBgYGBgoKDg4ODg4SEgYB7dm5qZmNeXVxfYGBiaG54gYKDg4ODg4B9d29pYF9iZ25ze4GDg4OBfnlzbmllZWhqamtscHR4ent6eXd5enh1c3t/f3t5dXBtbGtqbG1yeXl1cXJ4eXZxa2hoa2xvcnd8fXx8fHt7e3t7e3t7e3l3cWtlYWBgYmRlZ2ptbm5pZWNlZGNhY2NjZmhpam5vb25tbnBwbm1tbm1sa3BzdXZ2dnZ0cW5ucHFuaGJiZGRhYGBiY2RkZGRnaG1yeX18e3l0cXFzc3V0c3JycnJ3foKCbGxsbnFzdnh7e319f39+fnt7end2dXRycnJxcXByc3R1dnd4eHp6enp6enp7e3p6e3p6e3x9fX59f4CAf4CAgIGBgICAgICAgYGBgYCAgoKCgoKBgoKBgYKCgoKBgICAgYGBgYGCgoODg4ODhYSAfHdzbWhkYl5cWmBgYWRqcXqBgoODg4ODgH54cWtiX2JmbHJ6gIODg4F+eHRuaWVlaGpqa2xxdHl7fHp5d3Z2dnZ3fYGAf3t3cnBvbm5tb3R7eHRzdnx8eHRraGhrbG9yd3x9fHx8fHt7enp7e3l5eHZwbGZiYGBhZGdoaWtra2hiYWNkZGJkZmVmaGprbm9vbm1vcXFwbW1ubmxscHR2dnZ3dnVycG9wcm1nYWFiYmBfYGFiY2NjZGdobXJ5fXx6eHRxcnNzdXR0c3JxcXV8gYFsbG1vcnV2eXt7fX1/f35+enp5d3V1c3JycnFxcXNzdHV2eHl4enp6e3t7e3p6enp6enp7e3x9fn5/gIB/gICAgYGAgICAgICBgYGBgYGCgoKCgoKCgoGBgoKCgoGAgICBgYGBgYKCg4ODgoOEgn55dHBsZ2NjX1taX2BjZmt0e4GCg4ODg4OAf3hybWNfYWZqcHl/g4ODgX55dG5raGVoamprbHF0eHx9fH16dXZ2dHZ8goKAfHl0dHRxcG9wdXx5c3V7fn14c21paGttcHJ3fH18fHx8fHt7e3p6d3d3dnBsZ2RgYGFlaGhoaGdoZmNhZGRkZGdoaGlra2xub29ubnBxcW9vb29ubG5ydHd1dXd3c3Bvbm9wbGZhYWFhX15hYWFiY2NlZmhtcnl9fHp4dXJxc3N1dXJxcXFxc3qAgGtsbW9xc3d4eXp7fH5+fnx6eXh3dnV0cnFxcnJydHV2dXZ4eHd4eHh7e3p8enp7e3t7e3x8fX5+f39/f3+AgICAgICAgICAgIGBgYGBgYGAgoKCgoKCgoKCgoKCgYGAgIGBgoKCgoKCg4ODgYOAfHVxbWdlY2BeXF1fX2JncHl/goODg4KDg4KBenVuZWBiZWtxd32BgoKBgHh2cGpmZGZoamttc3d8fH19gX95dXV0dXyBgn16eXh6dnR1cnN2e3dxdHx+fXhybGhoamxvcXZ8fX19fXt8fHx6eXd3d3Z0cm5pZWBgYGNpampnZ2dlY2FjZGRoaGlqa2trbG5vbm1tbXBubXBxcW9ubnJ1dnR0dnZzcG5vcHBsZmBhYV5eX19hYWJjZGdnaW1zeHx7eHZycHJzdHZ0cXJycXFzeX9+a2xtb3F0d3h5ent8fn57enp5eHZ2dHRxcXFxcXJzdHR1dnh4eHh4eXp6ent6ent7fHx8fH19fn5/f39/f4CAgICAgICAgICAgYGBgYGBgYCCgoKCgoKCgoKCgoKBgYCAgYGCgoKCgoKDg4OBgX55c25qZWVjYF5dXWFiZWlyeoCDg4ODg4OCgYB7dm9mYWFlanB2fIGCgoF+eXVwamdlZ2hra251eXp9fX+Eh4F6enl6fYCBend5eXZycHFydHh7eHN1fH59eXNrZ2hqbXByd3x9fX19fHx8fHp5d3d2dXNyb2llYWBgY2hoaWVlZWViYmRlZWlpampra2psbm9ubWxtbmxsb3Jyb25vc3V3dXV2dnRxbm9wcGtlYWJhXl1dXmFkZGNmaWlqbnR5fHt4dnJwcnN0dnRxcXFwcHJ4fnxrbW1vcnV3eHl6e3x9fXt6eXh4d3V0dHFxcXFxcXJzc3Z3eHh5eXp6eXl5enp6fHx8fHx8fX1+fn9/f39/gICAgICAgICAgICBgYGBgYGBgYKCgoKCgoKCgoKCgoGBgYGBgYKCgoKCgoODg4F/fHZwamZlZWNgX19fY2RobXV8gIODg4ODg4KBfnx2b2dhYGRobnV7gYKCgX16dXFtaGZnaGtrcHZ6eX5/gYaKg31+fn1/f314dnR0cm9vcHJ1eHp4dXV9fn14cmtnaGpucHR5fH19fX59fX18enl3dnV0c3BtaWRiYWFkZmZlZGZmZWJjZWdnampqampqaWtub25tbGxsbGxwcnJwb29zdnh1dXZ2dHFub3Bwa2ViYmFeXVxfYWRlZWhqamtvc3l7enh2cnByc3R2dHFvb3BwcXd7em5vbW9zdXd4eXp7fH19fHp4d3d2dXRzcXFxcHBxcnJzdnh4eHl5enp5eXl6enp8fH19fHx9fX5+f39/f3+AgICAgICAgICAgIGBgYGBgYGBgoKCgoKCgoKCgoKCgYGCgoGBgoKCgoKCg4ODgXx5dG1pZWVlY2BeX2JkZWpxeHyAg4ODg4ODgoF+fHZvaGJgY2dtdXuBgoKBfnp1cG9oZGZoa2tvd3t8f4GDiYiCfn19fX98eHV0cXFubXBxc3V3enh1eH1+fXdxbWloamxvc3h8fX19fn1+fnx6eXd1dXNycGxpZGNhYmVkZGRlZ2dlYmNmaGlra2traWlpam5vbm1ra2xsbXFycnFwb3R3eHR0dnZ1cm5vcHBqZGBhYV1fXF9hY2NnaWtrbG90eXp5eHZycHJzdHZ0cW9vb29xd3h3bW1tb3R1dnh4ent7fHx9e3h3d3Z2dXNycHBxcXJzc3R3eHh4eXl6enp6eXp6ent7e3t8fH5+fX9/f39/f4CAgIGBgX+AgICAgYGBgX9/gIGDg4KCgoKCgoGBgYGCgoKCgoKDg4ODg4OCgoKBfXdxbGllZWVjYWBhZGVna3N6gIGDg4ODg4OCgn98dm9oYmBhZ2xzen+BgX98d3RwbWllZWdrbHB2ent/gYKGhYB6dnR2eHh1cnFubG5ub3J0dXh6eHZ3foB+d3Fva2lrbG5xdnt9fn5+fn58e3l3dXNzdHRxbWhlYmJiZWVlZmZnZ2dnZmdqa2prbWppampqbm1tbGxtbW5vcG9xcm9xdHZ1dHJ1dnRxbW5xb2tjYGBiYmJgYGJjZGZpamxscXR4enl4dXFxcnR1dnNxcHBwcHB1dXRtbW5wdHV1dnh5e3t8fHt6d3Z2dXZ1c3FxcXFxcnJzdHh4eHh5eXl6enp7e3p6e3t7e319fn59f39/f39/gICAgYGBf4CAgICBgYGBgICAgYKCgoKCgoKCgYGBgYKCgoKCgoODg4ODg4KCgoF8d3FsamdmZGNiYWNmZ2lsdHyAgoODg4ODg4KCgX54cGljYWFnbHJ5foCAfnt2c3BtamdlaGtucXV5e3+AgoSCenVwbnFydHJxb2xrbW9wdHh2eHt6dXh+gX54cW5qaWtsb3F2e31+fn5+fXx7eXd0c3Nzc3BtaGViYmJlZmdnZ2dnaGhoaGpra2xtamlqa2ttbWxrbG5tbm5wcHNzcHJ1dnV0cnV2dHFub3Fva2NgX2NjY2FhY2RmZ2pqbG1ydXh6eXRxcXFydXZ1cW9wcHBwcHN0c21ub3FzdHR1d3h6enp6enl3d3V1dHNycXFxcXFycnN0d3d4eHl5eXp6ent7enp7e3t7fX1+fn1/f39/f3+AgICBgYF/gICAgIGBgYGBgYGBgoKCgoKCgoKBgYGBgoKCgoKCg4ODg4ODgoKCgXx3cGxpZmVlZGRkZWdoa3B3foCCg4ODg4ODgoKDf3pzbGdiY2ZrcHd9f398eXRycG5raGVobHBwdHh7f4KEgn53c3BtbnBxcHBubW1tb3R4enl5e3h1eX6BfnhxbWlpa25wcnd7fX5+fn58e3p4dnN0c3Nyb2xoZmNhYWRnZ2hoaGhpaWpqbG1tbm5ramlqamtra2psbW1tbHByc3Nyc3Z3dXR0dnd0cW9wcW9rZWFhZGRjYmJlZWdpamlqbnJ2eXl4dXJxcXJ1d3RwbnBwcHBvcXJxbW1wcnJ0dXZ3eHl5eXl5eHZ2dnZzcnJxcnJxcXFyc3R2dnh4eHl5enp6e3t6ent7e3t+fn5+fX9/f39/f4CAgIGBgX+AgICAgYGBgYGBgYGBgYKCgoKCgoGBgYGCgoKCgoKDg4ODg4OCgoKBfHZwa2pmZGVkZmVnZ2ltc3l+gIKDg4ODg4OCg4J+enJuaWFjZmpvdn1/fnt4c3Bwb2tpZWZrbm90eHt/goSCfHZxcW1tbW5ubm1tbm1xdnp8fXl4dXV6gIF+eHFtaWlrbnBzeHt9fn5+fnx7end2c3NycnFua2dnY2BhZGdnaGhoaWpqa2ttbm1vbmxqaWlpampramtsb21rcHFydHR1d3d2dHV2d3Rxb3Bxb2tmY2NkZGRjY2Vnamtqamtvc3Z5eHd1cnFxcnV3dHBvcHBwcG9wcG9ub3FxcnFyc3d4eXl5eHh4dnZ1dHNycXBwcHBxcnN0dHV2d3d3eHl6e3t7e3x8fX1+fn5+fn5+f39/fn5/gICAgICBgICAgICBgYKCgoKBgYGBgoKBgYKCgYGBgYKCg4ODg4ODg4ODg4ODgX99d3BqaGdmZ2doaGhqa292foCBg4ODg4ODg4OCgX57dG9qZWNlaW90e358enZwcHBvbWlmZ2pub3N3en6AgX96dXBwbm1tbm5ubm5tb3R3en9/enh1dXyBgX54cGtpaWtuc3V5fH5+fn59fHp4dnZ0dHRzcm1qaGllYWJkZ2prbGtpa2ttbnBxcXBubGpmZ2dpamtrbW1tbm1wcnR0dHd5eXd0dXZ2dHBvcHFvbGZjY2VkZGNiZGhqbGtra29zeHh4dnJxcHBzdnh2cnBucG9ubm5vb25vcXFycXN0dnh5eXp5eHd1dXR0cnFxcHBwcHFzc3R0dXZ3d3h5eXp7e3t7fHx+fn9/fn5+fn9/f39+fn+AgICAgIGBgICAgIGBgoKCgoGBgYGCgoGBgoKBgYGBgoKDg4ODg4ODg4ODg4OBfnt1bmpoaGdpaWlqamxtcHd/gIKDg4ODg4ODg4KBf3t1cGpnY2Vpb3N5fHt4dXBwcHBuaWZlaW5vcnZ6fn+Bf3t2cW9tbW9xb21ub25xdnh9goF+eXR0eYGBfnhwa2lqa25zdnp8fn5+fn18enh2dnR0dHNxbmtpaWZiYmRpbXBxb21tbm5wcXJzcG1ramVoaGlqampsa2xtbnByc3R1eHl5dnV2dnZ0cG9wcW9sZmVlZGNjY2JkaGpsbGxrcHR3eHd2cnFwcHN2eHdzcW5vbGtra25ubm9xcXJyc3R1d3h4eXh3d3V1c3NycXFwcHBwcXNzdHR1dnZ3eHl5ent7e3t7e319fn5+fn5+f39/f35+f4CAgICAgYGAgICAgYGCgoKCgYGBgYKCgYGBgYGBgYGCgoODg4ODg4ODg4ODg4F+eXNuamlpamtra2xsbG5zeX+AgoODg4ODg4ODgoGAfHZwa2ZjZWltc3d6eXd0cXBwb21qZ2RnbG9xdXp+f4OBfXhzb21ucXBubW1vb3F2en+DhIB7dnV6gIF+eHBsamtrb3J3enx+fn59fHt5eHZ2dHV0c3BvbGpoZ2NjZ2xvc3RzcG9wcXJxc3RxbWtqZ2hoaWppaWhpa2xucHJzdXZ4eXh1dHV2dXNvb3Bxb2xmZmZkY2JiYmRoam1tbmxwc3Z4dnVycXBwc3Z4d3Rxb25tbGtrbm5ub3FxcnJzdHV2d3d3d3d3dnZzc3FwcXBwcHBxc3N0dHV2dnd5enl6e3t7e3t7fHx9fX5+fn5/f39/fn5/gICAgICBgYCAgICBgYKCgoKBgYGBgoKBgYCAgYGBgYKCg4ODg4ODg4ODg4KCgH53cmxqamprbG1tbm5tb3V6f4CCg4ODg4ODg4OCgYJ9d3BrZmRjZ21ydnl4dXRxcHBubGtoZGdrb3F1en6Ag4B9d3JwbnBxbmxqbG9vcnl8gIOFgnp4d3qAgX54cGxra2xwcnd7fH5+fnx8e3l5d3d1dHRycW1ra2hnY2ZrbnJ0dnVycXJzdHR1dHFubGppaWlpamlpZ2lqa25wcXN1dXp7eHVyc3Z1cm9vcHFvbGZkZGNiYmJiZGhqbW1ubW5ydnd2dHJxcHBzdnh3dHJwbm1ramptbW9wcXFyc3N0dnd3dnd3d3d2dXR0cnFycXFxcXJyc3R0dXZ3eHl6eXp8fHp7e3p7e3x8fH1+fn99fn1/f3+Af3+BgYGBgICAgIGBgYGAgIGBgYGCgoGBgYGBgYGBg4ODg4KCgoKDg4OCgoCAfHVvamlqa21ub25wb25xdnuBgoODg4ODg4ODg4OCgn54cWxnZGRnbHB1d3d2c3Fvb21sa2llaGtub3N3fYGBf3x2cnBsbWxnZ2psbnB1en+ChIaDe3Z1en+Bfndwa2tsbW9xdnt9foCAfX17eXp4d3V0cnFvbmtqaGdmaG5ydnl5d3VzcnN1dnd1cm5saWpqamhpaWlnZ2prbnFyc3Z2eHl5dXN0dnVxb29xcnBsZWRiY2JhYmNlaGtubm1tbnN2d3V0cnFvcHN2d3d0cW9ta2pqamxtcHBubnFycnR2d3d2dnZ1dXV1c3JzcnJxcXFxcnJzdHR1dXd4eHl5enp6ent7eXp6enp7fH19fXx9fH5+f4CAgICAf3+AgICAgICBgYB/gYGBgYKCgYGBgYGBgYGDg4ODgoKCgoODg4KDgIB5cmxpaWprbnBxcHBvbnJ2fIKDg4ODg4ODg4ODg4KCf3lzbWllY2Zrb3R1dnVycW9vbGxsamVnaW1vc3h+gH59e3dycGxqZ2Zna2xvcnV7gYSFhoN7dnN3fYF+d3Bra2xtb3F2e31+fn5+fXt7enl4dnRycW9ubGppZ2dqcnh7fHx6d3ZzdHd4eHZzb2xqaWhoaGlpaWhoa21ucXNzdXd5enl1c3R2dnJvb3JycGpkZGJiYmFiY2Voa25ubm1vc3Z2dXRxcW9xc3Z2dnRxb21ramlpbG1wcG5ucXJydHZ3d3Z2dnNzdHRzcnNycnFxcXFycnN0dHV1dnd4eXl6eXl6eXl2dnZ0dHZ5fHx7ent6e3t9fn+AgIB/f4CAgICAgICAf4CBgYGBgoKBgYGBgYGBgYODg4OCgoKCg4ODgoOBfndwamloaWxvcHJxcXBucnd8goODg4ODg4ODg4ODgoKAenVuaWVjZWtvcnN0c3Fwb29tbWxqZWVpbXBxd31+fXx7eHNwbGpnaGlrbW9zeH6ChYSGhHx2cnZ9gX53cGtrbG1vcXd8fn9+fn59fXx6eXh2dHNwb29samloaG10e39+fnx5dnR1eHl5dnNwbWxoZ2doaWlpa2pqbW5xc3N0dnp7eXVzdHZ3cnBvcnJwZ2NkYmBgYGFjZWhrbm9ubXBzd3V0c3BwcXN0dXZ2dHFvbWtqaGhrbHBwb29wcXF0dnd3dnV1c3N0dHR0c3JycXFxcXJyc3R0dXV1dnd4eXp5enp4dnJxcXBwcnd6enl5eXd5eXl6fH9/f4CBgICAgH9/f39/gIGBgYGCgoGBgYGBgYGBg4ODg4KCgoKDg4OCgoB8dm9naGdobXBxcXBxcG9zd3yCg4ODg4ODg4ODg4OCgoB7dnBpZWJmam5wcnNxcXBvb29ubGpmZWpvcHF1e3x8e3p4c3BsaWppamxvb3R7f4OFhYeGf3ZzeH2Bfndwa2tsbW9xd3x+gH9/fn19fHt6eHZ1c3Fub2xqaWhpbnd9gIGBfXp3dXd5e3t2c3Bta2lnaGhpaWlqamlrbXFzc3R2ent5dXN0d3dzcW9ycnBoZWRiX19gYWNlaGtvb25tcHR3dXNycHBzdHV1d3d0cW9ta2poaGprbm9vb29wcXN1dnd1dHR1dXV1dHRzc3JycXFycnNzdHR1dnZ3eHl5e3t5d3Vzb2xraWptcXh4dnR0cnN0c3Z5fX5/f3+AgH9/gIB+f4CAgYGBgYGBgYGBgYCCgoKDg4ODg4ODg4ODg4ODf3t0bWhnaGprb29vb29vcHR7f4KCg4ODg4ODg4ODg4KCgHx2cWpkYWVpbW9wcXFwcHBwbm9uamhnaW5wcHR6fX19e3h0cW1qaWlpbW5xdn2Bg4WGhoeCeXV3f4J/d3Bra2prb3F2fX+AgIB/fn18enl4dnVxcG5vbGloaGpzen+Bg4F/end2d3t8end0cG1ramloaWlnaWlpa2xub3FzdXd5fHl1dHV3dnJycXJzbmZhYmJgYF9gY2Zoa25ubm5xdXZ0cnFxcXN0dXZ4d3RwbWxqaWhoamtub29vb3Byc3V2dnV0dHV1dnZzc3JycnJxcXJyc3N0dHV2dnd4eXl7fHl3c3BtamlmZ2pudHNxb2tqaWttcXV6fX5/fn9/f39/f3+AgICBgYGBgYGBgYGBgIKCgoODg4ODg4ODhIOCgoF9d29raGZmaGpub29vb3BxdXyAgoKDg4ODg4ODg4ODgoKBfXdxamViZGdrbm9wcHBxcHBvcG9raGdpbnBxc3l9fX57d3VxbGtpaWlub3N4foKEhYWFhoN9d3h+gX52b2tramtvcXZ9f4CAgH9+fXx7eXh2dXFwbnBtamlpa3V8gYOEgoF8eHd4fHx5eHVycG1raWhnZ2ZnaWlrbG9wcXNzd3p8enZ1dnd2cnJyc3NtZGBiYWBgYGFkZmlrbm5sbXF1dnRxb3Bwc3R1dnZ2cm5tbGppaGhqa25vcHBwcnN0dXZ1dHR0dXV1dXNzcXFycnJxc3NzdHR1dnZ3d3h5eXt7eHVxbGppaGZlZ2tvbmpnZGNkZmltcHR4e3x+fn5/f39/gIGAgIGBgYGBgYGBgYGAgoKCg4ODg4ODg4OEg4OCfnpya2hmZGNlaW1wcHBvcHF2fICCgoODg4ODg4ODg4OCgoF+eHJqZWNjZWlsbXBwcHFwcHBycW1oZmlscHFzeHx9fXt3dHFsbGpqam5xdnt/goWFhYWGhH11dn1/fHZwa2tsbW9xdn1/gICAf35+fXt6eHd2cnFvcG1ramptdn6ChISDgX15eHp8fHl3dXJxbmxpaGZmZmdoaGpscHFxcXJ2e3t5dXd4d3ZycnJzc21lYGFgYGBgYWRnaWxubmtscXV2dHFvcHFzdHR1dnZxbm9tbGpoaGprbm9xcXFyc3R1dnVzdHR1dXNzcnJxcXJyc3N0dHN0dHV2dnd3eHl5e3p4dHBsamlnZmVkaGpoZ2NiYGJjZmpscHR5e3x+fn9+fn5+f4CAgYGBgYGBgYGBgYCCgoKDg4ODgoKDg4SDgYB7dnBpZGJhYGNobXFwcHBwdHh8gYKCg4ODg4ODg4ODg4KCgn54c2tmY2NmaWtsb29wcnNzc3JzbmhlaWxvcHJ3fHx8enVzcW5sa2tqb3N4fYGChYaGhoeGenR0fX98dnFtbWxtb3F2fX+AgIB/fn99e3p5d3ZycW9xbmtqam93foKEg4KCfXp6fHx7eXd1cnBsamloZ2dnaGhoamxvcHJxdHd6fHdzdnd3dnJycnNzbWVgYGBfX2FhZWhqbW5ubG1xdXZ0cnFxcnN0c3V3d3Fub25sa2hoamtrbW9vcHFxcXN0c3N0dHNzcnJycnJycnJzc3Nzc3RzdHV2dnZ4eXp7eXh1cW1ramhnZWNjZGRjYmJhYGFkZmZpcHZ7fX9+fX1+fn9/f3+AgIGBgICBgYGBgYGCgoKCgoKDg4ODg4KAfXl0bmZjYGBgYGZucXFxcHB2e36Bg4ODg4ODg4ODg4ODg4OCf3hybWZhY2ZrampsbW9wcnNzc3NvaWdoa25wcXR6fHt5dHFxbGtrbGxwdnp+gYKEhYaGhoZ6dHV9gH53cGxsa2xucnh9fn9+fn9/fXx8enh2dXNxb3FvbWtrcHd9gYOEgYB9e3p7enl4d3RycG1qaWdmZmlpaGdpam5wcXJzd3t8eXV1eHd1cnJycnFqYV5fXV5gYmNmaGttbm1sbXJzdXR0cnBydHR0dXd3cW5tbWtpZmZoa2tsbW5wcXFxc3Nzc3Nzc3NycnJycnJycnNzc3N0dHR1dXZ2d3h5ent5eHZybmxqaGZkYmFhYWFhYGBhY2NkZGVrcHZ8fXx9fn5+f39/f4CAgICAgIGBgYGBgYKCgoKCgoODg4OCgH57dXFrZmFdXWBjaW9ycnFxcnh9gIKDg4ODg4ODg4ODg4ODg4J/eXNuZ2JhZGlqamttb3BydHV1dHBraGhrbm9xdHl6enZxbm5qa2tsbXJ3fH+BgoSFhoaGhnx0c3p+fHVua2trbG5yd3x+f39/f39+fXx7eHd2dHJwcW9tbGtxd3x/gYKBf3t5eHp5eHZ1c3JwbWloZ2dnaWlpaGlrbXBxcnN3eXt4dXV3d3VycnJycGlgXV5dXmBjZWZpa25ubWxtcnNzcnNxcHJ2dXR2d3hzbmxsa2lmZGhqa2xtbnBxcXFzc3NzcnJzc3JycnJycnJycnNzc3R0dnZ2dnZ3eHl6e3l4dnJubWppZ2VjYmFiY2FgYGJkY2RjY2Ztcnh7fX1+fn5/f39/gICAgICAgYGBgYGBgoKCgoKCg4OCgoF+e3ZxbGllX11cYGVrcHNycXJ0eX6BgoODg4ODg4ODg4ODg4ODgn97dW9pZGFjZWhqa21vcHN0d3d1cmtpaGpub3F0eHl5c25sbGpra21wdXl+gIKEhIWGhoaGgHZydnp7dW5ra2tsbnN3fH5/gIB/f4B/fHt5eHZ0cnBxb21sa3F3en2AgX99eXZ2dnR1dHNwcG9saGdmaGppaWloaGttb3Bxc3d6eXdzdHZ3dXFxcnJvaGBdX11eYGNlZ2lsb25tbG1xcnJxcXFwcnZ3dXd5eHRvbGxraWVkZmhrbG1vcHFxcXNzc3NycnNzcnJycnJycnJxcnNzdHR2dnZ2d3d4eXp7eXh2cW5tbWtpZ2VkY2RkYmBgY2VlZGNjZmlvdXl7e31+fn9/f3+AgIGBgICBgYGBgYGCgoKCgoKDg4KDgH54cm1oZWJeXF1gZmtxc3JxcnR6gYGDg4ODg4ODg4ODg4ODg4OCf3x2b2tlYmRlZ2prbXBxdXh5eXZzbGloam1vcHR3eHZybmtta2trbnJ2e3+Bg4SEhYaGhoaCeHRzeXp1cGpqa2xvc3h9fn+AgH9/f359e3t5d3VycHFvbWxscXZ5e39/fXt4dHNycXJycW5tbWtoZ2ZmaWlpaGhnaW1vcHFzd3t5d3Nzdnd1cXBycm9nYF1eXV5fYmRnamxvbm1sbXByc3JxcXJ0dXZ2d3l4dG9sbGtpZGNlZ2xtcHFwcHFxcnN0dHR0c3NycnNycnJycnJzdHR1dXV1d3d4eHh5ent6end0cXFxcG1pZmZmZWNlZGRlZWNkYmFhZGt0eHp8fH1+fn5/f4CAgICAgIGBgYGBgYKCg4ODg4ODg4F+eHJtZmNgXltcXWFrbXFzcnN2eX6AgoOEhISEhISEg4ODg4ODg4KAfXdxa2VjZWdnaWptcHFzeHp6eHVuamhob3Bwc3V2c25sa2prbGxucXd+gYKDg4WFhYWGhoR7c3J4eHVwa2prbG5yd3x/f4GBgH9+fX18fHp4dnNycnBubW1xdHd5e317eHJxcm5sbG5sbW1ramZkZGVpaWloZ2dna29wcHN3ent6dnR1dXRxcXNybmVeXFxbX2FiZWdqbnBua2lscHFzcnBwcHN1dHR1eHhxbW5ubGhmZGVmbW5wcHBwcXFyc3Nzc3NycnJycnFycnJyc3N0dHV1dXV4eHh4eHl6e3t7eXZ0dHZ2cW1paGhnZmlsbWxsaGhkYmBiZnB2eXp6e319fX9/gICAgICAgYGBgYGBgoKDg4ODgoKBf3p0bmhkYV5cXF1hZm1vcXJzdnl8f4GDg4SEhISEhISDg4ODg4ODgoF+eHJrZGFkZmhqam1wcnR4fHx6d3BqaGhtcHBxc3Jva2lpamxsbG5xeH+Cg4ODhYWFhYiGgnlycXR3dXBsamprbnJ4fYCAgIB/f319fX18enl3dXNzcnBub29ydXh5e3dybWtraGdmaGlrbWtoZGRjZWlqamloaGhobG1vdHh6fHl1dHV1dHJyc3JuZV5cXFtfYWRmam1vcW5raWxvcHFwcHBxc3RzdHV5eXJtbW1saGZkY2VtbnBwcHBxcXJzc3Nzc3Jyc3NycXJycnJzc3R1dXV1dXh4d3h4eXp7e3t6eXd3eHh0cWxraGlsb3J0cnJvbGdiYWFjbHR3d3h6fH19fn6AgICAgICBgYGBgYGCgoODg4OCgoF8d3BqZGJfXlxfYGRobXBxcnV4e36AgoODhISEhISEhIODg4ODg4OEgn94cmxlYWNkaGpqbXFzdnp9fXp4cmtoaGxvcHBxbWpnaGhqbGxsbnF4f4KDg4OFhYSFh4SAeXJxc3Z0b2xqamtucnh9gICAgH9+fX19fXx6enh1dXNycG5wb3F0dnd3cm5pZ2ZkY2FkZ2pua2hkZGNlaWpqaGpra2lqam90eHp8d3N0dXV0cnJzcm5lXlxcW15hZWZsb29wbmtqbW9wcHBwcHFzdHNzdHp5c25tbWtnZWNjZW1ub29wcHFxcnNycnJycXFycnFwcnJycnN0dHV1dXV1d3d4eHh5ent7e3p7eXl6end0bm1qbG9zdXh3d3NxamJiYmNqcHN1dnl6fHx9fYCAgICAgIGBgYGBgYKCg4ODg4GBgnx1bmljYV5fXmFiZmlucXN0dnl9foCCg4OEhISEhISEg4ODg4ODg4SDf3hybGZhYmNnaGptcXV4fH5+e3h0bGdoam5wcG1rZ2VmZWptbGxucXh/goODg4WFhIWFg4F7dHN0dnRubGppam5yeX6AgH9/fn59fH19fHp7eHd2dHFwb29ub3J0dnRtaWRkY2BfYGNnaW1raGVkY2Vpa2poa21tbGprbnN3enx3c3R1dXRycnNybmVeXFxbYGJlZ2tub3Bua2ttb29xcXFxcnR2dnJzeHhxbWxsamdlYmRmbG1tbW1vbnBxcXFxcHBxcXBwcXFxcXJzc3R1dXZ2dnZ3eHh4eXp7fHt7e3t8fHt7d3Vubm1wdHd4enp6eHNsZGJiY2ZpbXFzdnl6e3x8f39+foCAgYGBgYKCg4ODg4ODgoF/eXBrZ2ViYGBgYmRma29yc3V5fn+AgoODg4ODg4OEhISEg4OCgoODg4OBfXRtaGJgZGdoaWtydnl+f359enZuaGdrbnFtaWZlYmRlaGtrbG5yeH+Cg4SEhISFhYWFgn54dnd3dXBsa2lqb3N4fX9/fn59fX18fH18e3t5eHZ0cW5wbm5ucHN1c25mYGBgXl1eY2ZpbGtrZ2RjZmprbGxvb25ubGtucXd7e3h0dXZ2dXNzcnFvZ11aW15iZmhoa25wb21qam1wcHNzcXFzdXZ2dHN4eHFubWxpaGViZWZrbG1tbW5ucHFxcXFwcHFxcHBxcXFxcXJ0dHV1dnZ2dnh4eHh5ent8e3t8fHt7e3t4dnJxcXR3eXl7e3t6dXBpZmNiY2RmaWxwcnJzdHd8fn1+gICBgYGBgoKDg4ODg4OCgH12bmlmZGNhYWFiZWtucHJ1d3uAgYKDg4ODg4ODg4SEhISDg4ODhISEhIJ9dm9pY2JjZ2lpa3F1eX2Af357dnBpZ2ptbmpnY2RjZGVobGttbnJ2fYKDhISEhIWFhIOBf3p4eXl1cGtpaWpvdHh9f39+fn5+fXx7fHx8fHp4dnRyb29ubm1ucXNybWVgX2BeXl5iZ2ptbmxoZGNmaWtsbnFxb29ta21xdnt7eHV1dnZ1c3Nzcm5mXFpcYGNnampsb3FwbWlqbG5wcnNxcXN1dnZydHh3cW5ta2ppZWJlZGtsbW1sbW5wcXFxcXBwcXFycnFxcXFxcnR0dXZ2dnd3eHh4eHl6e3x7e3x8fHx7e3p3dXV1d3l6fHt8fHx4c25qZ2NiYGJkZ2pramttcnd8fX6AgIGBgYGCgoODg4ODg4F+enNuaWdkYmFhZWZqbXBwdHh7foGDhIODg4ODg4ODhISFhYODg4OEhIODgX52cWxmY2NoamttcnZ5fYGAf3t4cWpmaGxuamViYmNlZWhsbG5vcnV8goOEhISEhYWDgIB9eHZ6enVwa2lpam5zeH1/f35+fn58eXl6fHx8e3l3dXNxbm5ubW5wcXFsZGBfYGBgYWVqbW9wbWhkY2Zpa25vcnRxb25sa291e3t3dHV2dnVzc3RzbWVcWVthZWdra2xvcXBsaGlqbnByc3Fxc3V2dnF1eXZxbmxqamllYmRibG1tbWxtbnBxcXFxcHBxcXJycXFxcXFzdHV1dnZ2eHh4eHh5eXp7fHt7fX17e3l5e3l4eHZ5ent9e3t7e3t1cWtpZmNgYWJmZmZmZ2ltdXt9foCAgYGBgYKCg4ODg4ODgn13cWxoZWNhYWJnaGxub3R4en2AgoGCg4ODg4ODg4OEhIWFg4OEhIWFg4OBfXZzbGViZWhqbG5zeHt/goGAe3lzamVmam5qZGBhY2VmaGxtbnFzdn2Cg4SEhISFhYOAgHx2dHl5dXBsamprbXJ4fX9/fn58fHh3eHh8fH58e3h1c3Fubm5ub3BxcGtkYmRkYmNkam1wcHBrZ2RjZWhrcHFzd3Jwb2xqbnR7e3Z0dXZ2dXNzcnFtZVtZWmBmaGtsbHBxcWtoamltb3JzcXFzdXZ2dXV5dnFua2ppaGViY2NramprbG1vcXJycXFwcHFxcnJycnJyc3R1dXR0dnZ3d3h4eHh5ent7fHx7fHx8e3t8e3p6e3t7e3x8fHx7enZzcGxpZGBhY2FhX2BjZWhveHt+gICAgIKCg4ODg4ODg4KAe3ZxbGpnZGFgZGlrb3J0dnt9gIKDgoODg4ODg4ODg4SFhYaEhISEhYWEhIN+enNsZmNlZ2pscHV6foGCgn99eXNrZmVobGtjYGFjZWhsbm5ub3R4foKDg4ODhIODhIKBfHRyd3p1cGxsbW5tcXh9gICAf315dXJyd3p7fH18enZzcG5vbm5ucXJua2VmZmhqbG9yc3V0cGtmYmJlaWxvcnZ6d3JuamludHt7dnR1dnd0cnNzcmxjWllWX2drbW1ucHFvamdnam1wc3NwcXR1eHdzdHh1cG9sampoZWNkZmtpamtsbW5wcXFxcXBwcXFycnJyc3R0dXV1dXV2dnd3eHh4eHl6e3t8fHt8fHx8fHx8e3t7e3t7fHx8fHt6d3RybmpmY2ViXlxaW15gYmx1en6AgIGBgoKDg4ODg4ODgn96dG9saWhmZGVobXB0dnl7f3+Bg4ODg4ODg4ODg4ODhYWFhoaGhoaFhYWFg398dG1mY2Rnam1xdnt+gYKCgH14dGxnZmhsa2ZgYWRoam5wb21vdXuAgoODg4OEhISDgn13cXF3enVwbGxsbW9yeH2AgIGAe3ZwbG10eHt7fXt4dXJwb25ubm5vcG9raWpscXN0dnd3eHdxa2ZiY2Vnam5yeHt5c25oZ210enp2dHV2d3Ryc3RzbGNbWVdfaW1ubW9wcW1pZ2dqbnJ1c3BydXZ3dXN1eHVwbmxramhlZGVnamlqa2xtbnBwcHFxcHBxcXJycnJzdHR1dXV1dXZ2eHh4eHh4eXp7fHx8fH59fX19fHx8fHt7fHx8fHx8e3p4eHRxbGpnZ2NgXVtbXF5gaHF4fYCAgoKCgoODg4ODg4OCfnhybWtoZ2dnam5zdnh5fH6BgYKDg4ODg4ODg4ODhISFhYaGhoaGhoWFhYWDgH11bWZjZGdqb3N3fX+CgoKBfnh0bmhnaWxraGJiZmptcXJwbW91fICCg4ODg4SFhYJ/eXJvb3Z5dXBsbGtsbnF4fYCAgH94c2pmZm51eXx8endzcG9vbW1sbW9wcG5ub3R3eHh5eXl6d3JsZmJjZWdqbXF4e3x1bmZlanN6enZ0dXZ2c3JzdHNuZV5cW2FobG5vb3BwbWlnaGpvc3RycnN2d3d1dHZ4dW9tbGtqaGZlZmhpaGprbm9tb3BwcXFwcHFxcnJycnN0dHV2dnV1dnZ5eXh4eHh5ent8fHx9fn19fX17e3x8e3t8fHx8fHx7enp7dXJubGpnZGFfXV1cXmBlbnd9gICCgoKCg4ODg4ODg4J8d3Fsa2hnZ2puc3d7fHx/gIKDgoODg4ODg4ODg4OFhYWFhoaGhoaGhYWFhYOCfXVuZ2NlZ2pucnh+f4KCgoF+eXRwamdqbGpoZGNma290dHFtb3R7f4GDg4ODhIWFgn94cXBwdnh1cGxsa2xscHh9gIB9fHZvZmJia3J5fH17dnJxbm1ubWptcXFwcXF1eXp6ent7enp3cmxmY2NlZ2lscXd7fnhwZmNoc3l5dnR1dnZzcnN0c21mX11cYmZqb29vcHBsaGVoam5yc3F0dXZ3d3V0dnh1b21sa2poZ2VnaGppamttbm9wcXFxcXFxcnJycnJyc3R0dXV1dXV2dnh4eHh6enl6e3t9fXx8fX18fHx8e3t7e3t7fHx6enx7enl3dHJubGhmZGBfX19fYGVud32BgYKCg4OEhISEg4OCgHx3cWxramhobHJ4e31+f4CAgYODg4ODg4ODg4OEhISEhYWGhoeHh4eGhoWFhIN8dm9nZWZoa25zen+AgoKCgX96dXBraGprbWllY2huc3V3cmxtcnh9gIOCgoSEhYWDfnZvb3F3eXZva2tqa21yeX6BgYF8c2lhXV1mb3V7e3h0cXBvbWxtbW5wcXBwcXZ7fXt7fX19e3lza2ZjZGVoamxyeH18dm5mYWVveHh2dHZ3dnR0dHRybmhhYF5hZ2pvcHJycWxpZmlrcHJzc3N0d3h4dXV4eXZvbGxsa2lkZWdoampqa21ucHBxcXFxcXFycnJycnJzdHV1dnZ2dnZ2eHh5eXl5enp8e3x8e3t8fHt7e3t6enp6enp7e3p6fHx7eXl3dXFua2hmZGNjYmBgZG12fYGBgoKDg4SEhISDg4J/enVvbWpqaWpweHx+gIGCgoKCg4ODg4ODg4ODg4SEhISFhoaGh4eHh4aGhYWEg3x4cGlmZWhrb3N3fYGCg4OBgHt3cmxqaWtuamdla3J3eXh0bm1udXx/goKChISEhIN9dW9vcXZ5dm9ra2prbnN5foGBgntxZ2BbXWVudXp6dnFvbm5ubG1vcHBxcXFzeH19fX1/f399enJrZ2NlZ2lrbXJ3fXx2bWVgYm11d3Z1dnd3dHV1dXNwamVkX2JobG9yc3Nybmloam1ydHRzc3R3eHh1c3Z4dW9sa2traWVnaWpqamprbW5wcHFxcXFxcXJycnJycnN0dXV3d3d3dnZ4eHl5eHl6enx8fHx8fH19fHx8fHt7e3t7e3t7enp8fHx6e3l3dnJvbGppZ2VkYF5ia3R9gYGCgoODhISEhIODg355dG5tampqb3V6foCBgoODg4ODg4ODg4ODg4ODhISEhIWGhoaHh4eHhoaFhYSDfXlya2ZmZ2pvc3h+gYODg4KBfXp1bmpoam1raWlwdnp8e3VvbW1yfH+BhISEhISEgnx1cnFxdXh2b2tramtuc3l+gYGBenBoYFxeZW50eXhzb21tb25sbW9wcHFycnV6fX5+fn5+fnx4cWpnZGVoaWttcXZ7e3ZsZGBibHR3dnV2d3d0dXV2dHBpZmVhZGptcHNzc3FuaWdrbXJ1dHJzdHd4eHVydXh1b2xqamtpZ2lrbWpqamttbnBwcXFxcXFxcnJycnJyc3R1dXd3d3d2dnh4enp4eHp7fHx8fHt7fHx7e3t7enp6enp6enp6enx8fHt6eXl5eHNxbmxraGVhXmFqdH2BgYKCg4OEhISEg4OEfnhzbWxra2tyd3t/gYGDhISDg4ODg4ODg4ODg4OEhISEhYaGh4eHh4eGhoWFhIN+eXNrZ2Znam9zeX6Cg4SEg4F/fHdwa2hqbG1sa3N5e3x6dW9rbXR6gIGEhISEg4OCe3Z0cnF1eHZva2tqa25zeX6BgYB6cWlhXmBnb3R3dHJubG1ubWxubm9wcXBwdXp9fn9/fn59e3ZwaWZkZWdpa25wdnp7dWxkX2JtdXl2dXZ3d3R1dXZ0cGlnZWNlam9xc3NzcGxpaGtscnd1cnN0d3h4dHF0d3RvbGpqa2lmaGttaWpqamxtb3FwcHBwcHBwcHFyc3N0dXZ3eHh4eHd3eHh6end4eHl7fXx8e3t6ent7enl8enl5eXl7e3t7fHx7e3p5fHx7enZ0cnBsZ2FeYWdyfICCgoKDg4SEgoODgoF+eHJramtscHZ7foGCgoODg4ODg4ODg4ODg4ODg4OEhISGhoeIiIiHh4aGhoWEg397dW9oZWVobXJ4foKEhIOCgIB8d3JsaWltbmxtdXx+fXl0b2xucnh/goSEhISDgoF7dXR2dHV2dm5sa2xrb3R6f4KCf3tyaWNiY2hvcnNzb2xsbGtrbG1ub3BwcXF1en1/f3+Afn19dm5nY2RlZmdqbXF2eXl1bGNfYmt1eHZ1dnd2dXR2dnNuaWdoZ2dsb3BydHJuamdmam1xdXVzdHV4eHdzcXV3cm5ra2poZmZpam1pamtqbG1vcHBwcHBwcHBwcXJzc3V2dnd4eHh4d3d4eHp6eXl4eXt9fHx7e3p6e3t6eXp6eXl6enp6e3t8fHt7e3t7e3t7eHd0c25nYV5iaXN7gIKCgoODhISDhIOBfnx2cGxqa2xxd3yAgoODg4ODg4ODg4ODg4ODg4ODg4SEhIaHh4iIiIeHhoaGhYSDfnp1cGhlZWhscXd9goODgoF/fnp3c21qaW1vbW92foB+eXRvbW1yeH+DhISEhIOCf3l1dnp2dnZ3bmtqa21vdHl+goJ/e3JpY2Rmam9xcnJvbG1tbGxsbW9wcXFxcXN4fX9/f39/fnt0bmZjY2VmaGltcnZ5eXRtZF9ianR3dHR3eHZ1dHZ2c29paGlpaG1vcHJ0c25qaGdqb3N2dXR0dXh4d3NxdXdybmtramhmZ2ptbmlqa2tsbW5vcHBwcHBwcXFxcnNzdHR1dnh4eXl3d3h4enp7enl7e318fHx8fHx7e3p5eHl4eHl5enp7e3x8fHx8fHt7e3t6eXd1cGhhXmFqdHuAgoKCg4OEhIWFgoB8eHVwbWtrbHF3fYCBgoODg4ODg4ODg4ODg4ODg4ODhISEhoeHiIiIh4eHhoaFhIN+enVwZ2VkZ2pvdnyCg4OCgX56dnZ0bWppbW9vcHh/gX96dG9sbHJ4f4OEhISEg4J9d3R5fXl2dndwa2prbm5zeH2CgoB6c2pmZmpsbnBwcG5ubW1sbG1tcHFxcXFxc3d9f39/fn9/enNtZWJjZWhpam1zd3l5dG1mX2Fqc3Z0dXZ4dnV0dnVybmppampqbnByc3V0bmppaWxxdHVzc3V2eHh2cnJ3eHNua2tqaGZnam9xaWpsbGxtbm9wcHBwcHBxcXFyc3N1dXZ3eHh5eXd3eHh6enl5ent7fXx8fX1+fnt7enl5eXh4enp7fHt7fHx9fXx8fHx7e3t7eHdzamFeYGp0foCCgoKDg4SEg4OBgHp1dG9sa21tc3h/gYKDg4ODg4ODg4ODg4ODg4ODg4OEhISGh4eIiIiHh4eGhoaEg357dW9nZWRmaW51e4GDg4KAfXl1dnVta2ltb3BxeX+Bf3t0b2tscnh/g4SEhISEgnl2dHl9enZ2dnFtbGxsbXJ4fYKCf3tzamdna2xtcHBwbm5tbmxtb29xcnFxcnJ0eH1/f399fn16cmxlYmNlZ2lrbnN4eXl1bmhhYGlydXV2eHl2dXR2dXFua2pqbGtucHJzdXRuampqbnJ1dXJzdXd4eHVxdHh4c25ra2poZmdqbnBpampqa2xucHBxcHFxcXJxcXJzc3V1d3h5eXl5eHh5eXl6enp7e3t7fHx8fH19e3t5eXl4eXl5ent6e3t7e3x8fHx7e3t7e3t7enVrYV5hanR8gIKDg4SEg4SDgoB9eHFvbGxsbnB0en6AgYODg4SEg4ODg4ODg4ODg4ODhISFhYaHh4iIiIiIh4eGhoWEgXx2cGlmZGVpbXN7f4ODgH98dnR0dW9ram1vcHJ5fYF/enVxa2pvdn+DhISEhISBenZ2en15dXR0cW5sbW1uc3l+gYJ/fHRvbGxtbW1vcHBtbW9tbm1ub3FxcXFwcHN4fX9+fn5+fXlzbWdiY2Vnamtvc3l7eXNtZmFianJ0dHV3eHd2dXV1cW5ra2xsbW9xc3R0cW1ra2xwdnd2cnN2dnh4dHB0eXlzbmxra2llZ2lscWlqamprbG1vb3FwcXFxcnFxcnR0dnZ3eHl5eXl4eHl5eHh6ent7e3t8fHx8fHx7e3l5dnV1dXZ3enl6ent7fHx8fHx8e3t7e3t5dGtjXmFpdHx/goODhISEhIKBfnt1b21sbGxtcXV7f4GBg4ODhISDg4ODg4ODg4ODg4OEhIWFhoeHiIiIiIiHh4aGhIOAenZxamZkZWpucnl+goOAfnpxb3J0b2tra21wc3h9gX96dnFsa293f4SEhISEg356eHl5eXZzdHNybmxtbW9zeX+CgoF9dXFubnBubW9wcG1tb21ubW9vcXJxcXBwdHl9f35+fn58eHJrZ2NkZmhrbXFyeHx5dG5mYmNrcHJ0dXd4d3Z2dnVxbWpsbW5vcXJzdHRxbWxrb3J2eHZ0dXZ2eHh0cHR5eXNubGtraWVpamxxaWpra2trbG1ucHBxcXFxcXJzdXV3eHd4eXl5eXl5eXl4eHp6e3t7e3x8fHx6enp6eXh2dnR0dXd4eHp6e3t8fHx8fHx8fHt7fHl1bWRgYWdze36Bg4OEhIOEgoB7dXFta2tsbG1xd31/gYGDg4OEhIODg4ODg4ODg4ODg4SEhYWGh4eIiIiIiIeHhoaDgn14dXJrZmRlaW1yd32BgX57dm5sb3Jva2pqbG9yd32BgHx2cW5tcXd+g4SEhISCfXp7fHh1c3Jyc3JubGxsbnJ5f4KBgHx2cnJyc25tb3Bwbm5vbW1ub3BwcXFxcXF0eHx+fn5+fnx4cWtnY2VnaGtuc3R6fHl0b2hkZG1wcnR1d3h3dnZ2dnFsaWptcHFyc3R1dXNvbW1vdHd4dnR1dnZ3d3NydHl4cm5sa2tpZ2psbnNpamxsbGprbG5vcHFxcnFxcnR3d3d3dnd5eXl5enp5eXh6enp7e3t7fHx8fHp6eXl4eHd2dnZ1dnZ3eXl7e3x8fHx7e3x8e3t9enhwZGBhZnN6foGDg4SEg4OCfnlzbmpqa2tsbXB3fX+AgYODg4SEg4ODg4ODg4ODg4ODhISFhYaHh4iIiIiIiIeHhoOCfnl0cmxmZGVna3F2fICBfXlzbGttcW9raWptb3N3fYGBfHZxbWxxeH6ChISEhIF9enx9eHRxcXF0cW5sbGtucXl/g4B+eXZydHRxbm1vcHBvbm9tbW9vcHBxcnJxcXV5fX5+fn5+fHZxamZjY2Zoa290d318eXNuamZmb3NzdXZ3eHd2d3d3cWxqaW5wcnR1dHZ2c29tbnB0d3h2c3R2dnd3cnJ0eXdxbmxra2lpamxwdWhpamxsbGxtbW9xcXJycnJzdXd3dnZ3eHl5eHl7e3p6ent7e3x8fHx9fXx7e3t5eXh4d3d3d3V1dHV3eXt8e3t7e3x8fHx8fHt7eHBmYWFlcXp+f4KDhISDgn55c29saGhpaWpuc3l+gYGCg4ODhISEhIODg4ODg4ODg4ODhIWGhoeHiIiIiIiHhoeFgoB9eXNybWdkZGZpcHR6fn56dW5mZ21xbmpobGxuc3Z7gYF9dnJubHJ4foKDhIODgn56e3t2c29wcXRwbW1tbG1xd4CCf3t4c3N1dXNvbW1wcG9wcG5tbm9vcHBycnJydXp8fn59f316dm9pZWNkZ2hsb3N5fXx3cmxpZ2ducnR0dnd3d3Z3d3dxbWtsb3FzdXR1dHZzcG9vcnZ4d3NzdHV1d3dzc3V4dnFvbWxqampqbXF3aGlqbGxtbW5vcHFxcnJzc3N1d3d3d3h4eXl4eXt7e3t7e3t7fHx8e3x8fHp7e3l5eXl4eHZ2dXV1dnd5enx8fHx8fHx8fHt7e3t3cGVfX2NueHx/gYKEhIGAenVua2loZ2hpanB1e4CCgoODg4OEhISEg4ODg4ODg4ODg4OEhYaGh4eIiIiIiIeGh4WCgHp1cXBtaGVlZ2luc3t8e3ZwamVkaW5va2ltbW9zdXuAgX13cm9scHZ+goOEhISDgHp6eXZ0cHBxc3Fua2xrbXB2f4B+eXZ0dXd3dXBubnFwcHJxb21ub3BwcXJyc3N1enx+f31+fXp2b2lkY2RmaGxwc3h6e3dxbGloanBzdHV4eHd3dnd3d3JubG1vcXN1dXV0dnNwb3Bzd3p3c3R1dXV4eHR0d3l3cG5sbGpqamxvcXZoaWpsbG5vb3FycnJycnNzdHZ3d3d3eXl6enl6fHx8fHt7fHx9fXx6e3t7ent7eXl5eXl5d3d1dXZ4d3l5e319fX18fHx8e3t7e3hyaWBfY2x1e39/gIODgX53c2tnZ2dmZ2lrcXd8gIKCg4ODg4SEhISDg4ODg4ODg4ODg4SFhoaHh4eIiIiIh4aHhYJ/enVxb21pZmZoaG5zeXl2cGplY2Vnbm5tbW9ucHN0en+BfXhzb2xvdX2BhIWEhIOCfXt5d3VycXJzcW1qbGtsbnV7fXp2c3V3eXl2cHBwcnFxc3FvbW5wcHBxcnJzc3R5fH+Afn18enZvamVkZGZoa3B0eHp6dnBta2ltcnV1dXd4eHd2d3d2c25sbW9xc3R1dnV2c3FwcnV4enZ1dHV3d3h4dHR4endvbGtsampqbXByc2hpamxtbnBwcXJycnNzc3N1d3d3eHh5eXp6eXp8fHx8e3t9fX5+fXp7e3t7e3t5eXp6eXl4eHV1dXd3eXl6e3t9fXx8fHx6ent7enVsY2BkanN6f35/goKCfXZvaWVlZmVmaWxzeH6BgoKDg4ODhISEhIODg4ODg4ODg4ODhIWGhoeHh4iIiIiGhoaEgn54dHJwbmlmZmhobHJ1dnJtZmJiZGZsbW5vcXNzcnN6f4F9eHNvbG91fICEhoWFg4R/fH17dXJycnRwbGtramtuc3h5d3RxdHd7e3dwcG9yc3N0cW9tbnBwcXFycnNzdHl8f4B/fXx5dnBrZGNkZWhrcHR7fHh1cG1ram90d3Vzdnh4d3Z3d3V0bmxtcHFzdHZ2dXZzcnBzdXh6dnV1dnl5eXl0dHZ4dm5sbGxqamprb3JxaWpqbGxtb3BxcXFycnN0dHV1eHh5enp5enp6e3x8e3t8fHx8fHx8e3t7eXt5eXp6enp6enp6eHh2d3h4eHl7e3x8fX18fHt6ent6dG1jYGNqdHp+f4CCgoB4dG5nZGNjZGdpcHR8f4CBgoODg4OEhISEg4ODg4ODg4ODg4OEhYaFhoeHh4eHh4aGhYKAe3d0cG5uamhoaWlscHJybWhkYmFgY2lucHF1eXl3dnp+gHx4cm1tcXd+goWGhYWEhIKAgHt1cnFzdHBsamtqa21xdHZ0cXB0eHt6dXJwc3N1dnVwbm1ubm9xcXNxcXJ1eX1/f39+e3h1b2plY2NlaGxxdXp6eHNvbm1vcXV4d3V3eXp4eHh4d3Jsam1wcnR2d3V2d3RycnZ4fHt3dXV2eHl6eXV1d3l0bmtra2tra2xsb25pamtsbG1vb3FxcXJydHV1dnZ4eHl7e3t7e3x8fHx8fHx8fHx8fHx8enp5e3l5eXl5eXl5eXl4eHh4eXl4eXt7fHx8fHx8fHp6e3p0bmZgYGhxeH6AgIGBfXVwamVhY2NkZ2tzd36AgIGCg4ODg4SEhISDg4ODg4ODg4ODg4SFhoWGh4eHh4eHhYWEgX56dnNwbm5saGdpaWxvcG9pZWNgYWJkanByc3uBgn15en5+enZxbW5xd3+DhYaFhYOCgICAeXRzcnN0cGxqa2pqa25yc3JubnN4e3p1c3F1dXZ2c3BubW9vcHFyc3Jxc3Z5fX9/f357eHNuaWVkY2ZqbXF2e3p3cG9ubW9zd3p4dnl7enl5eHh4cmxqbXBydHZ3dnZ4dnN0eHp9e3d1dnd4eXp4dXV4eXNta2tra2trbGxtbGlqbGxsbW9wcHBxc3N1dnZ2d3h4eXt7e3x8fHx8fHx8fHx8fHx8e3t5eXl6eXl5eXl5enp6enl5eXl5eXl7e3t8fHx8e3t8enp7enZwamFgZW53fYCAgYF8c21nYmBhY2VobnZ7f4GAgYKDg4ODhISEhIODg4ODg4ODg4ODhISFhoaHh4eHh4eFhIOBfXhzcXBub2xoZ2lpam1sa2dkYV9iZGhscXV4fX+BfXt/gX56dnJvbnJ3f4OFhoWFgoB8fH14cnF0dnZwbGpramlpbHBxcG1scXZ6e3ZzdXZ5d3ZycG5tcHJycnJyc3J0dnl8fn9/fnt3cm5pZWVlaGtucnh6eXZwb25tb3V4end4ent7eXl5eXhya2xucHJ0dXZ2d3d1dHZ5e317d3V3eHh5eXd1d3p5cm1rampqa2trbGpqaWpsbWxtbm9wcHJzdXZ2dnd3eHh5e3t7fX18fHt7fHx8fHx8fHx6enl5eXp5eXh4eHh6enp6eXl5eXp6ent7e3x8e3t6enx6ent6d3JsZGFmbnd8gICAgHpzbGZfXmFjZWpwd32AgoCBgoODg4OEhISEg4ODg4ODg4ODg4OEg4SGhoeHh4eHh4WEgYB7dnFxcG5vbWloaWlpamloZWNgX2Nlam9ydnx7e318foSFgHx5dHBucnl/g4WGhYWDfnx9fHdxcXZ3d3BsamtqaGlrb3BuamtwdXp7d3N4eXp4dnJwbm9vcXJycnFzc3R2enx/f39+e3ZxbmlmZWZpbHBzeHp5dHFvbm9xdXl7d3l7fHt5eXp6eHJqbG1wcnR2dnZ3dXNzdXp8fXp3dXd4eHl4d3V4e3lxbWtqaWlra2tsaWhqa2xtbW9vcHBxcnR2dnZ2d3h5eXp8fHx8fHx8fHx8fHx8fHx8e3p6eHh3d3h5eXl5eXp6enp5eXl5enp7fHx8e3x7e3t7e3t7e3t6c25nZGVrdXp/gH9/eXNqZWBfX2Npb3V8gICAgYKDg4ODg4SEhISDg4OCgoKCgoODhISEhIWFhYWGhoaFhIKAfXVycHBvbm1raGdoaGlpZWJkY2NiaWttcHN4fXl4fH+BhomJh393cG9zeX+DhYWFhYOBgYJ9eHJxd3p5cWtqamtqa21ubmxpa3F1e3t4dnh7e3h3c3BvcHBycnJxcnR0dXd5fH5/fnt5d3FsaGRkZmdqbnJ2d3VxcXFvcHJ1enp4d3l7enl5eXp5c21tcHFzdXV2dXZ2dHN2eXt9end3eHl4enl4dXZ6enNtamlpaWpqampoaWprbG1ub3BwcHFydHZ2dnZ3eHl5enx8fHx8fHx8fHx8fHx8fHx7enl5eXd3eHl5eXl5enp6enl5eXl6enl6enp7fHt7e3t7e3t7e3p1b2llZWpxeH19fXx3cWhjYGBgZmx0eH6AgICBgoODg4ODhISEhIODg4KCgoKCg4OEhISEhYWFhYaFhYSCgX55dHFwcG5ubm1oaGhoaWllYWNjY2RqbG9xdHd7d3R5e36ChouIgXlzcnN6f4OFhYWFhYSEhYF8dnR3e3hxa2pqamhqbW1ramlscnZ5eXl3eHt8eXZzb29wcXJycnBydHR1d3l8fn9+fHp2cWtnZGVmaGpuc3Z0c3BwcHBwcnV6e3h3eXt6eXl5e3lybm1xc3R1dnZ2d3Z0c3Z6fH16d3d5eXl6enh2d3t7cW5ramlpampqamlqamtsbW5vcHBwcXN0dnZ2dnd4eXl6fHx8fHx9fXx8fHx8fHx8e3t6eXh4eXl4eXl5eXl6enp6eXl5eXp6eXp6ent8e3t7e3t7e3t7endxbGZkZ252ent7endxaGNgYGJob3d6foCAgIGBgoODg4OEhISEg4ODgoKCgoKDg4SEhISFhYWFhYSEgoB+e3Z0cXBwbm5wcGtoZ2doaGZiY2JiZGptcXR2dnp2cXR1dXqAh4eCfHh2d3x/g4WFhYWEhIKCgX14dnd7eHJramlpaGpra2ppam1zd3h4eXd4e3x4dnJubnBxc3NycHJ0dHV3eXx+fn19enRwa2ZlZWdpa29zdXJxcHBvb29zd3x8eXl5e3p5eXp8eHJtbnJ0dXZ2dnd3dnR0eHt9fXp3d3l5ent7eXZ5fHpybWtoaWlqamlramtqa2xtbm9wcHBxc3R2dXR0dXZ3d3p8fHx8fH19fHx8fHx8fHx7e3p5eHh4eHh5eXl5eXp6enp7e3l5enp6e3t7e3x7e3t7e3t7e3t6eHNuZ2JkanF3eXl5dm9qZF9iZmtzenx/gICAgYCCg4ODg4SEhISDg4OCgoKCgoODhISEhIWFhYWFg4KBfnx5dHRxcHBvb3BxbWlmZmdnZmJjYmFiaW9yc3Z1dnNvcHJwdHqChIF/fnt4fX+DhYWFhYOBgH+AfXt3d3t5cWtqaGlpa2pqamlqbXN3eHl5d3h7fHl3cm5ucHF0dHJwcnR0dXd5fH59fHt4cnBqZmVlZ2hscHJ0cnBwcG9vb3N4fXx6eXp7enl5e3x4cW1uc3R1dnZ2eHh2dHZ5e31+end3eXl6e3t6d3l8enJtbGlpaWpqaGtqa2prbW5ub3BwcXJ0dXZ1dXN0dXZ4e3t7fXt8fX59fXx8fHx7e3t6enl4eHh4eXl5eXl5eXl4eXp6enp6enp7e3t7e3t7e3t7e3t7e3t4c3BpZGJmbXJ1dnVybmllYmNobnV7foCAgIGBgYKDg4KCg4OFhYODg4OCgoKCg4OEhISEhISFhYWCgH57eHZzcXFwcG5ucHFvZ2VlZmdmY2NjYWRobXBzd3dxampsbXBydnyBg4KCf3x8f4KEhYaGhYF+f4F/e3h5e3dxbGtpamtrbGpsamtudHh6eHh3eXp7eHZ0b29xcnNzcnFydHR1eHp9fn18enhzbmtnZ2dqbGxvcHBwcHBwcG9vdHp+fXt6ent7enp7e3hwbG90dXV2d3d3d3Z1dnl8foB6d3h4eXt8fHp2e3x4cWxqampqZ2dpa2lraWpsbW5vcHBxc3R1dHNzcXFzdXh6enp8fH1+f35+fX18fHt7e3p6eXl5enp5eXl5eHh3d3h5enp6enp6ent7e3t7e3t7e3t7e3t7e3p3cWtkYGRqb3NycG1pZmNjZGtweHx/gICAgYGCgoODgoKDg4ODg4OCgoKCgoKDg4SEhISEhIWFg4B9end0c3FxcXBwcHBxcm9nZWVmZ2ZkY2NiYWZrb3N2dnRtamttcHN3e4GCg4SDf32Ag4SFhoaFgoF/gIB8e399d3Fta2tsa2tra21ra291eHp4eHd5ent4dnNwcHFyc3NycnJ0dHV2eX1+fnx6eHJuamhnaGttbnBvb3BwcHBvbm91e39+e3p6e3t6ent7eHFscHV2dXZ3eHh4dXV2eX1/fnp3eHh5fHx8eXd8fHhxbGtqa2lnZmhrbG5pamprbm9wcHJzdHV0c3BtbG5xdHd3d3h6fH1+fn5+fnx8e3t7enl5e3t5eXl5eXl4eHd3d3h6enp6enp6e3t7e3t7e3t7e3t7e3t7fHl0bGVgY2dsbm1saWViYmJmbHJ7fX9/gICBgYKCg4OCgoODgoKDg4KCgYGBgYKCg4ODg4ODg4OAfXl2dHNzcXBwcHBxcnNzcGlmZmdoZ2VlZWFfYWdtc3V3dnBta21wcnZ8gYKDhYWDgoGDhIWGhoWDgn99fHt+g353cW1ra2xra2trbW5vcHV4e3l5eHl6end2cnBwcXJ0dHJycnR0dXV4fX5/fnt3cW5pZ2doa21wb25ub29vb29ucHV8gH57enp6enp6fHx3b2xxdnZ1dnd4eXl0dHZ5fX99eXd4eXp8fHt3dnx8eHBsa2tqaGZnaWpucGhpamtub3BwcnN0dXNybWpoam1wc3N1dnh7fHx9fX5+fHx7e3t6eXl6enl5eXl5eXl5eHh2eHp6enp6enp7e3t7e3t7e3t7e3t7e3t8enZuaGFgY2dpaWhmYmJiYmhudH19fn+AgIGBgoKDg4KCg4ODg4ODgYGAgICAgYGCgoKCgoKBgX16eHVzc3Fub29wcHFxdHVwamdnaGloZWZmYl5dZW1zdXd2cGxrbnF0d32Dg4SGh4WEgoOEhYaGhoSBfXx4eYCFf3dxbWtqa21tbW1ucHFydHh7enp4eXp5dnNycHBxcnV1cnJydHR1dnl9fn9+e3ZybGlmZ2hrbW9ubW1vb29vbm1xdnyAfnt6enl5enp8fHZvbXN1dHV2d3h4d3Rzdnl+gH15d3h5e3x8e3V2fXx3cGxqa2loZmdpbG9xaWppamxvcXFyc3R1c3FtaGdmaGtvb3Byc3d3enx8e3t8fHt7enp6enl5eHh5eXl5eXl4eHd4eHh6enp6e3t7e3t7e3t6enl7fHx8fHx7d3FoYV9iY2RlZWRhYWJlbHB3fn5+f3+AgICBgoGCg4OEhIKChIOBgIB/gICAgICAf39/f317eHh1dHFycG5ub29wcnR1dXFraGhpaWloaWljXlxibHV3eHdxbW1wdXh8gISFhoiIh4eEgYOEhYaFhYF+e3l8hIeCeHJta2lrbW1scHJ2enp3eHp6eHh6e3l2c3FwcHBzdXRxcXJ0dHV2eX5+f356dXFtamdoaWxsa2lra21ucG9tbnF2fH99fHp6enp6e317dG9udHZzdHd3eHd2cXN3e39+fHh3eXl7fHx5dHV9fXhxbWpqamdnZ2hrcHVqampqbG9xcnJzdHVycGtnZmVkZ2tra21ucXN2ent8fHx8e3t6enp6eXl4eHl5eXl5eXh4eXl5eXp6enp7e3t7e3t7e3p6eXt8fHx8fX13cWhiX2JhYWFhYmJhYmZtc3l+fn5/f4F/f39/f4GCg4ODgoGCgn99fXt7e3t7d3Z1dXV1dXJxcW9ubm9vbW1ub3F0d3d2cmtnZ2lqampsa2dgV1tmcXV2d3JtbnN4fYCChIeIioqJiIWAgoWEhoWFg4KBgYGGhoF5cW1ramxtbWxwdHyCgXl4eXp4eHp7eXZ0cnFxcXN1dHFxcnR0dXd6f39/fXp1cGxpaGhqampoZ2hpa2xwcG1wc3h7fn18e3t6ent8fnt0b250dnN1d3h4d3Vxc3d8gH98eXh5eXt8e3l0dXx9eXFtampqaGdnaGxzeGpqa2tsb3FycnN0dXJwa2ZkY2RlZ2dnaGttbnF3eXp7fX17e3p6enp5eXl5eXl5eXh4eHh5eXt7enp6ent7e3t7e3t7enp5e3x8fHx9fXhyamRiYV9fYGBhYWFiZmx0en9/fn9/gH99e3p5e36BgoKAf359enh2dXNzcnJwb29vb29uamtraWhoaWpra21vcnZ4eXdya2dnaGlram9uamBVWGVvdXZ3cm5vdHuAg4SGiImLi4uJhX9+gYWGhYWFhYKDg4iHgHhwbWttb3Fwb3N6f4GAeXl5eXh4ent6d3VycnJyc3RzcXFydHR1d3p/f399enVvbGlnaGppZ2VjZWhqbG1ub3F1eHp9fXx8fHt7fH19enNubnV3dXZ4eHh3dHFzd3yAgHx5eXl5e3t7eHJzen15cW1sa2tpZ2dobHR5ampsamxvcXJyc3R1dHJrZmRjZmVmZmZnaWpsb3N2eXp+fnt7enp6enl5eXl5eXl5d3d4eHp6enp6enp6e3t7e3t7e3t6enl7fHx8fHx8eXNrZGNhX19gYGBhYWJma3N5f39+f4GAfnl1cXJyen+BgX98end0cnBvbm5tbWtqaWlpaWhmZ2dkY2NkZWZoam9zeHl5d3JrZmZnaGprb3FtYlZWZHB2d3ZybnB0e4GFhYaIiYuLi4mFf3p9g4WFhYSDgYGDiYZ/eHBta29xdHRzd31/fXt3enl4d3h6fHp4c3Jzc3NydHJxcXJ0dHV4e4CAgH56dW9raGZoaWlmYmFkaGpsbG1xc3d5en19fHx8fHx8fXx6c21vdnh1dnh3eHdzcXN3fICAfHl5enl7enp1bnJ6fXlxbWxrbGlnZ2hrdXloamprbXBycnJzdXd2dG9rZ2RnZmZmZGRmZ2hpbXF3eXt8e3l5eXp6eXh4eHh4eHh4eHl5enp6enp6e3t7e3p6enp6ent7enx8fHx8e3p5cm1pZmJfXF9eXl9hYmdsdXt/f39/gH56dG1paGpyeX58endxb29tbGloaGdnZmVkZGVkY2RkZWNgYGBhYWNnbHN3eXl3cmxnZmhqaGpxdHBlWVhkb3V3dHFvbnJ3foODhIeKi4uKh4SDfHqAhYWDg4OCgoSHhH12cG1sbnN3eXp7fnx5dnZ3dnd4eHt8endzcnJyc3NycXBwcHJydXl8foB/fXhzbWlmZ2lpZ2RgYGNnam1ubnF2eHp7fX18fX18fH1+fXpzb3F1dnV3eHh4d3RxcnZ9f4B7eHp6ent7eXJtcXp9d29tbGxramdmZ2x2fGhqamxucHFxcnN0d3Z1cW1pZmhnZ2dkZGRkZGVobHJ1eHl6eXl5eXl4eHh4eHh4eHh4eXl6enp6enp7e3t7enp6enp6e3t7fHx8fHx7enlzbmpoZGBdXlxcXF9gZWp0en9/gH9/e3ZsZGBgZGx2eHdzb2poZ2ZmY2FhYWFgX15eX15eX2BhYV5fX19fX2Npb3N1dnVxbGhmZ2hnaW5yc2tdW2VvdXZ1cnBub3J4fYCEhomKiomHg4OBfH6EhIKBgYKBhYiCenZwbWxuc3p+gIB9d3FtbG9ydXd3e3t5dXJxcXFycnJxcHBwcnJ2eXt+gIB8d3JtaWZmaGhlY15eYmVrbW9vcnR4enx9fXx9fXx8fX59e3VxcXV2dXd4eHl3dHFydn2AgHt4eXl7e3x5cm1xenx2b21sbWxraWdobXZ9aGpqbG1vcHBxcnR2dnVybmtpaWhnZ2ZkZGRkZGVobXFzd3h4eXl5eXh4eHh4eHh4eHh5eXp6enp6ent7e3t6enp6enp7e3p7fHx8fHx7enZybmpmYV9eXVtbXV5jaHB4fn6Af314b2RdXF1iaHBzcG1pZWJhYF5eXl5dXVxbWFhZWFpbXF5eXl1dX19fYmdrbm9xcnBramhmZmVmaG5zb2JfaHF1d3VycG5ucHN5foOFh4iIiIaCg4WBfYCDgn99gICFiIJ6dnBtbG90fIGEg3x0b2hmaW51d3d6enp2cnFxcXJycXBvb3Byc3d4e35/f3t2cWxoZmZoaGVjXV1iZWtubnF1dXh6fn99fH19fHx9fn57eHRydnd1d3h4eXZzcHF2fYGAe3h5eXt7e3hxbHF6e3VvbWxtbWtqaWdsdn1oampsbG9wcHBxc3Z2dXNvbWpqaWZmZ2RlZWRiZWZqbXF0dnd5eXh4eHh4eHh4eHh4eHl5enp6enp6e3t7e3p6enp6ent7eXt8fHx8fXt6eHRwbGhkYWBeW1xdX2FlbXZ/foB/e3ZrYFtbXGFnbG5sZ2RiXl5cWllbW1lZWVhUVFZUVlZZWltcXFxdXWFiZmdqbG1ucGtpZ2ZlY2NkaXFvZ2Rscnd3dXJwb25ucXh+goOGh4eGg4CDh4Z+foGCfnp9gYWHg3p2b21scHR9gYaDfHVtZmVpbnZ2d3p7enVxcnJyc3Nxb25ucHJzd3h7fn9+enVwa2dmZmhoZmRdXWNmbG5vc3R1d3p/gH18fX18fH1+fnx4c3N3eXV3eHh5dnNvcHZ9gYB7eHh4e3t6d3FscXp7dW9tbG1ramloaGx1fGlramxtb3BwcXFzdHV2dXFvb29sa2ppaGdmZGJkZWdpbXFzdXd4d3d3d3d3d3d3d3Z2eXl6enp7e3h7e3t7enp6enp6enp6enp7fHx9fHt5dnJvbWlmZGJeXF1cXmNpb3d8f355cWZfWVlbX2NmaWdjX11bWVhZWFdXVlZVU1NTUlJVVldYWVZYV1lbX2FkZ2dnaGpua2lnZWNfYGRobnFua3F2dnZ0cXBvb29yeHyAgYOFhIKAf4KIiYF7fYB+fH6Bh4eCenRtbGpvdn6DhIN9c2xnaGlsdXV5ent4c3FwcHJzcXBvbm5ucXN1eHt/f316dW9pZ2hpa2tnY2BgYmZrbnFxdHZ3eX5/fXx+fHt8fn9/fnl0c3Z3dnd5eXp0b2xudXyCgHt4eXl7e3l2b2tweXhyb25tbmtpZmVobHV7aWtqbG5vcHBxcXN0dHV0cnJycnBwbm1saWhnZWRkZGdqbnF0dXZ2dnZ2dnZ2dnZ2dnZ4eHl5ent7eXt7e3t6enp6enp6enp6ent9fX19e3p3dHFwbmtnY19cXVxcX2JpcHZ6eXZsYl1ZWVxeYmNkYV9bWVdWVlhXWFhXV1dWV1dVV1laW1xcV1dWWFpcX2JlaGhmaGppaGViYGFhZGhscnRxc3d3d3VycG9vb3B2e39/gYKCgH9+gomMhnx5fHx9fIGHh4B3cGxvb3N5f4SFhH9zaWVoa21xc3d6e3d0cXBwcnNyb21tbm5xc3Z4e35+fHhzb2lnZ2hqamhkYmFjaG1wcXF0dnd5fn99fH58e3x+f39/e3V0dnZ2eHl5enRubG51fIGBe3h5ent7eHRraXB4d3Jvbm5ubGtoZ2pudXppa2tsbm9wcHFxcnNzdHRzdHR1dHRycXBtbGpnZWRjZGZqb3FzdHZ2dXV1dXV1dXV2dnd3eXl5ent6e3t7e3p6enp6enp6enp7fH5+fX18e3h3dXNwbGhlYl9eXVxcXmNpb3Jyb2ZeW1paXV5gYGBdW1pYV1haW1xeXl9fXVxbW1tdX2BhYmBdW1pZWlpcYGNmaGhqaGpnYmBiZGZmZWlxdnN2eHd3dXJwb25ub3J5fX6BgX98fH+Cio6JgXl7fHl5gYeIgnx6e359fX6AhIaGgXRrZWZqbm1wc3l8eHVycnJzdHNva2tub3J0d3h7fn57dnFsaWdnaGpqaWVkZGhscHFycnV2eHp+f318fnx7fH5/f397d3V2d3d5eXp4c21sbnV8gYF7eHl6e3t4cmppcHd2cW9ubm5ub25rbHB0eWlrbG5ub3BwcXFxc3N0dXV2dnd3d3V0c3BwbGpnZWRjZWlsb3FydHR1dXV1dXV1dXZ2d3d4eHh6enp7e3t7enp6enp6enp6ent9fHx9fXx7end3dXJvamdjYF5dW1xcX2Rqbm5pYlxbXFxdYF9eX11bW1xaW15eYWNjZGRjYmFhX2BjZGRlZGBeXVtbWVxdYWJlaGpqaWVhYWVnZ2ZhY3B2c3h4eHh2cnBvbm1wcnh8gIKAfXp6f4WLj4qDfHx7dniBiIqHhIaKi4mFgYKEhIWCd21lZWpvbnBzeX15dXNycnN0c3Bram1vcnR3eHt+fnp0cGxpZ2hpa2tpZGZna290c3NzdXd5e35/fXx+fHt8fn9/f3x5dnZ4eHl6endybGxudXyCgHt4eXp7e3lxaWlwd3Vxb25ubm5wcGxscHN5aGprbW1ubm9xcXFycnR1dXV1d3d4eHZ2dHFvamdlY2FiZGdpbHFzdHR0c3V1dXV1dXZ3d3d3d3l6enp6enp7e3p6enp6ent7fHx8fX5+fXx6d3h3dXJraWZjYV9gXlxcX2VqaWVfXlxdXFxdXVxcXV5fYGBiY2VqamlpaWhmZGNhY2ZmaGloZGJgXVxcXFpcX2FlaGpoZGBiZ2xtaF1dbXV1eXl4d3Z0cG5tbm9zeXx+f398enqBh46QjIaCf3x4fISKjYuJi46NjIiFg4WDhYR7cmdjZmtscHR7fXl0cnNyc3ZzcGxrbW9xdHZ5eXp5dHJwbGdnaWtsbGpnaWtudHZ2dXR1d3h7f359fX58e3x+f39/fnt5eHh4eXp5eHNtbG10fIKAenl6enp6eG9naXB0dG9ubW5ub3Fxbmxvc3Zqa2xubW5ub3FxcXNydHR0dXV2dnd4eHh3dXJtaGVjYWNkZGVmbnByc3NzdHR0dHR1dnh4eHh3eXp6e3t6ent7enp6enp6e3t8fHx9f39+fHt4eXh2c25sbGlnZGNeXVtdYGJhYV5gXl5cXFxbXF5gZGVmZ2pra3Bwb25ua2lmZGRlaGhqbG1raGZjYWBfXV9fYGJlZ2ZiYGVrb3FrW1hpdXh4eHd1c3Fxb25ub3N5fXt7fX18e4CHjJCPi4WBfXl+hYuMjYyJh4SHhoSEhoSFhoF4bGVkZmxxdHt8eHRyc3JzdXJvbWtsb3F0dnh4eHZycG9raGhqa21tbGpscHN3d3d0cnR2eHx/fn19fnx7fX5/gIB+fHp5eHh5enl4c21tbnR8gX96eXp6enp4bmdpcXR2cW9ub3Bxc3Vzbm9zdWlra21tbm5vcXFydHN1dXV0dHd3eHl4eHh4dXBraGRiYmJgYGJpbnFycnN0dHR0dHV2eHh4eHd5enp8fHt7e3t6enp6enp7e3t7fH1/f399fHp4d3Nyb21ubWtoZV9cW11dXVxeX19fXl5eXl1dY2ZrbG5vb3FydHRzcXBsaWdmZWZnZ2lsb21tbGhnZGNhYV9fYGFiYmNkam5vb2hbVmV0d3h4d3V0cnFxb21tcnp9eXd8gH98fYaMj5CNhYF9foGIjIyLiYR7d3uBgoWGhoeIhX50bWlpb3N1ent3c3JzcnNzcG1sa2xwcnN1dnZ1dHFubWtra2tsbW1tbW5zdnp6eHRydHZ5fn9+fX1+fHx+fn+BgX99e3l4eHl6enhzbW1udHyAfnp5e3t6enduZ2lydXRxcnBwcnN1eHZycHJ0aGppa21ubnBxcXN0c3V0dHV1dnZ3eHl5eHl3cW9qZ2RiYF5cX2VrcHFxcnN0dHR0dXZ3d3d3d3l6enx8fHx7e3p6enp6ent7enp8fX9/f358eXd2c3NvbW5ubGpkYV1bXV1bWlteX2BfXl5dYGBobHBxc3V1dnd4d3Z0cW1qaWdmaGdnaW1vb29wbW1paGVjX15fX15hZGlubmxsZ11XZHJ2d3d4d3Ryc3Juamlwe314dXx/fnp8hY2Qjo2Ggn6BhYqOjImHgnVvc3yChYWIiImGgnp2cG9yc3h6e3ZzcnNyc3FubGxsbnBycnV2dXJxcG1ta2pqa2xtbW9vcXd4e314dXN1d3l+f359fX58fX5+f39/gH18enh4eXp7eXNtbG10fIB+enl7e3p6dnBnanJ3dHJxcG9xcnR4eHVxcXRpa2ttbG5vcHFydHR1dnR0dHR3d3d3eHh4eHd2cm5pZmJgXlxfZGtvcHBycnJyc3NzdHV1dXZ3eHh5e3x8enp7enp6enp5eXh4d3h8fX+AfXt5dnRzc29ubm5tamJeXFtdXlxbWlxdXl9eX2BjZWxydXd7e3x8fHp6eXVybmxpaGdnaGhqb3N0dHVzcG1saWdlY2VjYGNnbXFua2xtZmBncHN1eHd1cm5wb2hmZm96e3d0e35+e32GjI+PjYiEgYSJjY6KhYOAdnF1fYOEh4iKi4uHg4B8eXVydXp7d3NxcnNzcm9tbW9wdnZ0cnBycG5sa2toaWdqbG5vcXJ1e359fHd1dXZ4en+Afnx9fX1+f3+AgIB/fn15enl6e3l5cm1sbXJ7gX96eXt7enp2cWdqcnV2dHJxcHBzdXl6eHNzdGpsbG5tb29wcXJ0dHR0dHR0dHd3d3d4eHh4eXl2cmtoZGFeXF5iaW5wcHFxcnJzc3NzdHR0dnd3eHl7e3t6ent6enp6e3t2cnJxdXp8f397eHZ0cnFyb21sa2poYl5dXF5cXFtbW1xdYF9gYmZrcnl8foCAgYGAfXp4dHFua2loaGhoamxydnd5eXh1cW9samZkZWVjZ21yb2ppa3R2c3NwcXR3dnJraGtsaGhqdHt8d3R7fn59foWLjo2MiYWEh4qMjIeEgn51c3l/gYGGiIuMjIuIhoOAenZ3ent3cnJydHJwbm9xd32CgXhwb3Fwbm1ramhpZ2psb3Bxc3d8fn16dnNzdnl7f4B/fH59fX5/gICAgICAfXl5ent8eXlybWxtcnyBf3p5e3t6enZwZ2pzdnVzc3JxcHN1e3x5dXR0a2xtb29wcHFxcnR0dHR0dHR0d3d3d3h4eHh4eHdzcGxpZWBdXWJobnBwcXFxcXJycnJzc3R1dnd3eHp7enl6e3p6enp6eHFramxxdnp9fXp1dHFxcHFxbWhlZGNhX11cXVtbXF1cXVxgYWFkZ251e3+BgoKCgn98eXVyb21qaWhpaWlsbnR4e3x7e3l1cW1pZmRjZmdscnJrZ2htd3p9enRwcnVzb21ubGxrbXF4fn16e4GDgH6BhYuMjIuLiIeKiImJhYSCfHZ4fH17fYSJjI2NjYuJh4WAeXl7enZzcG9vb29uc3qCh4mEeG9vcXBubGppaGlpa21wcHJ1eHt8e3hzb3J2eXyAgYB9f319fn+AgICAgIB9eXl6e3x7eXNua2xzfYF/enl7e3t7dW1lanN3dHJzcnFwc3V9fnp2dXVsbW1vcW9wcXFydHR0dHR0dHR3d3d3eHh4eHh4eHNyb2xnYV1bYGZucHBycnFxcnJycnJyc3V2dnd4eXp6eHp7enp6enlya2ZmaG1yeHt5dnJwb3BvcHFtZGBfX2BeXFtbXFtcXl9fXmBhYWRnbXN6foCCgoGBf315dHFtbWppaGlpam5vdnl8fX1+fHdxbmllYmJnanB1cWpnZ3F5e399eHBxcW5vcnNxbm5zd31+fn+Ch4eDgIGFiYqKi4yJiYmIiYmFhIN8d3p/e3Z4goiLjIyNjYqIhoJ7ent6d3Nua2psbnF4gIeKioJ1b29xcG5ramhpaWpsbnBxc3Z5e3t6d3FvcnZ5fICBgH5/fX1+f4CAgICBgX15eXl8fH15dG9qa3N9gX98e3t7fHx1bGRpcnV0cnNycXBzdXx9e3d1dW1vbW9wb3FycnN1dXV1dXV1dXd3d3d4eHh4eHh3dXNyb2liW1leZm5wcHJycXFwcHFxc3NydHV2dnh6e3p5enp6enp5dW5lYWNlam9zd3Z0cnBwcG5tbGZhXFlbWlhZV1laWV1hY2NjYmJkZWdscnh7f4CAgYF+e3ZxbWtra2poaGlpbXF4fH+AgH99eXVuaGRiZ2xwc3NsaWdqen5/gH98dW1pZ210cnJvcHV8gIGBhYiLiYaBgYWIiYeKi4qHiIaIh4WHhX57f4B4c3mCh4uMjY6Mi4mIhIB7fXl3dHBraWxud4CHioqDenFub3Bxb2tqaGdoaWxucHBzdXt+fXt1cXBydnl8gIKBfX19fX5/gYGBgYCAf3p5e318fHhyb2tsdH6Afnt7e3t7e3RpY2pydXNycnJvb3J3fX18eXZ1bW9ucHFxc3N0dHV1dXV1dXZ2d3d3d3h4eHh4eHd2dHNxa2NbWV5mbnBwcXFwcHBwcnJycnJzdXV1d3h5eXl6ent7enlyamNfX2Flam1xc3Jvb3BubWtpZF1YVVdXVlVUVldZXmZoaGhmZGZlZWdscXR4fX+BgX14dHBubWtramloampuc3p+f39/fnx3c25nZGVscXJyb2ZiZ3B/gIB/gYd8bGhqcnh1cm9zeICCg4aLjY2MiYWDhomJiIqMioaEhIWDgoaHgX+CfnBvd4CGiouNjYuMiYmGgX1+eXV0cW5sbnR9hYqGgHdwb21vcHFwa2poZ2hqbG5wcXN2en19enRwcHN2eXyAgoB+fn19fn+BgYGBgIB+enp8fXx8eHJvbG10foB+e3t7e3t7c2hkanJ0c3JycnBvcXh8fHt5dnVucHBxc3N0dHR0dXV1dXV1dnZ3d3d3eHh4eHh4d3Z1c3RtZFxaXmVtcHBwcHBwcnJycnJycXN0dXV3eHl4eHp6e3t6d3BoZWFeX2Flam5vbWxsbWxsamhhWlVUVlZWVVRUV1xjam5vb2tpZ2RiZGZqbXF3en19enZyb2xra2tramprbXF1e35/fn58endxbWdma3F0c3JyamZud3+Dhn6BiX1wbHF5fHp1c3h+goOGioyOjYuKiIWIi4yKjI2Kh4OCg39+hYiEgIJ6b252foSJi42Ni4uJh4R/f355c3JxcXF0e4SIhX52cG1ubm9wcXBtbGpoaWtsbnBxc3Z6enp4c3BwdHd6foCBf39/fn5+f4GBgYGAgH17e31+fHx4cm9sbnR+gH57e3t7e3lxZ2RqcXNzcnJycXFxeHt7enh3dm5wcXN0dHV1dXV1dXV1dXV2dnd3d3d4eHh4eHh3dnV0c25kXFhdZG1wcHBwcHBxcXBwcnJxcnR0dHZ2d3h4enp6enp2bmdkYF5eYGJmamxqaWtramtpZmBZVVRVV1hXVVZaXWVudHV1cW1oZGFhY2VpbXB1enp4dHBvbWtra2tqbG5uc3d8foB/fnx4dnBraWpvdXZ1dXVxbnJ7gIaNhIGGfXJyeH2Bf3l5foSFhoeMjY2LioqHh4qNjYyNjoyGg4KEfHuDh4SDgnlwb3aAg4iLjY2LioiHgn1+fnlxcXBxdHqBiIiAdm9tbW1tb3BxcG1sa2pqa2xucHFzdnt7eHZzb3B0d3t/gIB/f39/fn5/gYGBgYCAfXx8fn59fHhyb25vdH6Afnt7e3t7eG9nZGpxc3NycnJxcXF4e3t6d3h2cHBycnR0c3R0dHZ2dnZ0dHV1dXV3d3h4eHZ3d3V0dHRxbWVdWFpjbXBvb25wcHFxcXFxcXFxcnJ0dHV2d3d4eHl4eHRtZ2NeX19gYmVmaGdoZ2hoZmVgXFVRUFNWV1pYWV9janF3eXp2bWhlX15eYWZqa25yc3VycG5tbWtra2ttcHBzeXx+f399enVzb25scnd9fXx5eXp1d4GDhY+LiYZ8cnV8gYSDgoGDhYeJiYuLiYmJiIeHi4yMjI6PjYeDhYR7eYKGhoSBeXJwdn6DhoqMjImJhIN+eHx9e3JwcHF6gIiJhXlubm1ubnBwcXJxb21tampsbW5vcXN2ent3dHFwcnR4fICBgH9/f39+f4CCgoCBgYB9fHt7fX17dnNvbm90fX98eXp7e3l1bmVianN1cnJzc3JycXZ6eXl4dnZxcHJydHR0dHV1d3d2dnV1dXZ2dnd3eHh4dnZ2dXN0dHFtZV1XWWJrcHBvbnBwcHBwcHFxcXFycnN0dXZ3d3h4eXh3c21nY15gYGJjZWVlZWVkY2NiYV1ZUk9OUVRWWFleY2lxdnx/f3lwaWVeW1tdYGZpam1vb25vbm1tbGxrbG1wc3Z6fX9/fnx3c29tb3B3f4aHg39/gICBgouHi5GUiHxydoCGioqHhoeJiImKi4mFh4eIiYiKi4uLjo+Oh4OGhH18g4eIg395dHJ4f4WHioyLiYV/endzeX56dHFvcXyGi4h+cm1tbW1vcHFzc3Nxbm5ramxtbm9xc3Z6enZzcXFydHh8gIGAf39/f36AgYKCgIKBgH58e3t9fXp2c29ub3R9f3x5ent7eXVsY2JqdHRycnJycnJydnl4eXl2dnBydHR1dXR1dnZ3d3Z2dnZ2dnZ3d3d4eHh2dnZ1c3NzcGxkXFVYYmlvb29wcHBvb29vcHBwcHBwc3R0dXd3eHh7eXd0bmhjXmFhYmRkZGNjYWBgYF5dW1dPTk1QUlRXXGJpcHd7f4GBfHNqZGBcXVxeYmZnaGprbG5tbW1sbGxucHN2eH19fXx6eHVxbm1wdHyFjY6JhoODiIiCjI6MkJSJfXV6ho2Nj4uKjY2MjIuLiISFhYeKiIqLioqNkI6Hg4aEf3+Fh4aBfXZ0c3qBhYeKjIuIg3lxb3F5fXp1b2xxfoeHgndvbm1tbG1ucnR0dHJwbWtqbG1ucHJ0d3p5dXFxcXJ0eHyAgYB/f39/foCBgoKBg4GAfnx9fX19enZzb25vdH1+fHt7e3t5dWtiY2xzc3JycXFycnR4eXh5eXZ2cHN1dXV1dXV2dnd3dnZ2dnZ2dnZ3d3h4eHZ1dXVzcnJwa2NbVVlhaW1vb3BwcG9vb29xcXFxcHByc3R1d3d4eHt6eXZvaGNhYGFhYmNjYmJfXV5eXVxZVU5KSU5RUldeZW53fYCBg4J+dWxkYV9gX15gY2RlZ2hpbm1tbWxsbm9ydXd5fHx6eXd1dG9tbXB2gIiPkY2IhIWLjIGIkpCPj4Z5d36JkJCPjo+Pj42NjYyJhIKEiIyKjIuJioyQjoiFhoN+gYWGhH56dnV1e4OGiIqMioeEd25scXl9eXNqanOBhIJ8cm5tbW1sbW5ydHV0c3Fta2psbW5wc3V4enh0cHFxcnR4fICBgH9/f39+gIGCgoKDgYB+fH19fX16dnNvbm90fX57e3t7e3l1bGJlbnNycnJxcXJydnp5eXl5dnZwc3Z2dXZ1dXd3eHh3d3d3dnd2d3h3d3d4d3Z2dnV0dHFtZ15XWF5la21tbm5ub29ubm9vcHBwcHFydHV1d3h4eHh4dXFtaGZjYmFhYmRiX15cXl1aWVdVUExJSU5UXGJsdX2BgoODg392bGVjY2VjYl5eYGNkZmhsbG1ubm5vcHN2eHp7e3h3dHJxcG5ucHmEi4+Rj4uHio2NhIeOk5GKf3N3goySko6NkZKRjo2NjIiEg4OIi4uKioiJjI6Mh4aEgYCEhYSAfHh3dXV7gYiKioqKiIN3bmxyeX15b2htfIOCfXVubW1ubW5ub3J1dXRycG9sa2xub3FydHd7eXVycHBzdXh9gIGAgICAfn2AgYKDgoKCgX57fX18fHl2c29tbnV9fXt6e318enRqY2ZvdXJxcW9wcHJ2eXt6eXh4d3J0dnZ2d3h4eHh4eHh4eHh3d3d4eXd4eHh4d3d2dnV1cm9pYVxaXWFnam5vbm5vb25ub29wcHBwcHFzdHR3eHh4eHh2cm5qaGhnY2FgYmJhYWBeXVlXVVRQTUtJTVdfaXJ7gYOEhIWEgHdtaGZoamtpZGBdX2NlZmhrbG5wcXN1dXV1dnZ2dHRxb21tbm50fYaLkJGQjYqNkY+Hh4yRkox9c3qGjpKRjYyRk5KOi4yLiYaDhIiKi4qKiIiLjIqIhoOAgoWGhIF9eXh3d3yCiIqKioqIhHxuanJ4eHBpZ3SChYB6dG5tbW5ub29wc3Z4dnNwb21sbG9wcXJ2eHt5dnNxcXN1eH2AgYCAgYF/foCBgoOCgoOBfnt8fHx8eXZ0b21udX19e3t8fHp5c2plaHB1c3Fxb3BwcnV5e3p5eHZ2dXd2dnd4enp5eXh4eHh3d3d3enp6eHh4eHh3d3Z2dXVzcGtkXlpdX2RpbG5vb29vbm5vb3BwcHBwcXJydHZ4eHh4eXdzcG1ramlmY2BiY2RiYF9bWFZVU1FPTk1QW2VveX6DhYWFhIR/d21oZmpvcW5pZWFfYWRkZGlrbnN0dHV1dHNzc3NxcXBwbm1tcHiAhoqPkpGOjZCSkYqHi5CSjoB5gIeQk5GOjJCTko2Li4uIhoOChomKioqJiYmLiomEgICDh4eFg4B9fHt4fYOIioqKioiEfnBobW5qYmJneYSDf3lzcG5tbm5vbnB0d3l4dHFubW5ub3BxcnV4e3l2c3Fxc3V4fYCBgICBgYB/gIGCg4KCg4F+e3x8fHx5dnVwbW51fX18e3x8enlyamZrdHVzcXFvcHBydXh5enl4dnd2dnZ2d3d5enp6eHh4eHZ2d3d5enp5eXl4eHd3dnZ1dXNwamVdW11fY2hqbG5ub29ubm9vcHBwcHBwcXJzdnh4eHh6d3Vwb21ramhkY2RkYmFfXVlWVFRSUVBRUVVga3R/gYSEhIWEgX11bGZna3Bzcm5qZWBfYmRmZ2pucnVzdHRzcnBwcG9vbm9ubW1xeoKFiI6Tk5GOkZWTjYmKjpCLg4CDiZCUkY2LjpGRjY2Ni4iHg4OGiIqLioqJiIqJh4J/gISIiYeGgoKBf3t9g4iKioqKiIV/c2toYlxZXWt5gn97eXRvbm5ubW5ucHR3eXh1cm5ubm5vcHFydnl8eXZycXFzdXh9gIGAgIGBgH+AgYKDgoKDgX57e3t8fHl2dnJtbnV9fn19fX17eHJqZ212dXNxcW9wcHJ0d3h6enh3eHd3d3d3d3l5enp5d3d3d3d5eXp6enp5eXl4eHh3dnZ2c3BsZ2BdXV5gYmZpbG5vb21tbm5wcHBwcHByc3R2d3l4eXh4dnNxbm5ta2lnZ2hjYF5cVlRUU1NTVVZYXGdyeoCBg4ODg4OBfnduZmZqcnZ0cW1rY15eYGNnaW1xc3NycnBvbm9ubG9ub29ubHF7gYSHjpOUlJOVlpWRi4mJioaDhIeLkJSRjYyPkZGRkpCNi4mHhoiKi4yMjIqJiYeGgX6Bh4uMi4qIiIeDf4KGh4iKiIeHhH95cmVcWFtlcnt+enl2cm9xcW5tbG1xdXh5d3Rxbm5ubm9wcHJ4fH17d3Z0dHR2eX6AgoCBgYGAgICCgYGBg4OBfXt7e3x8eXd0cm1wdn1+fXx+fXx4c2tocXh2cXBwcHBxcXN4eHl6eXl5d3d4eHh4eXl6enl3d3d4eXp6enp6enl5eXh4eHd2dnZ0cm5pY19eXl9iYmVqbW1ubW1ubm9vcHBwcHJzdHZ3eHd4eXl3dXNxcG9ta2lpaGNeXVxWU1RVVVhbXWBmcHp/gYKDg4ODg4J/eXFnZWlxdnh1cW9qZWBhY2dobG9wb25tamtrbGtsbm5vcG9vc3t/g4aOlJaXmJibmZSNiIWDgH+FiY6UlpOQjY6RlJibmZSSjoqIh4qNj46LiYeGhoWEhYaIjo+PjYuLi4mHhoiHh4iHh4aEf314bGZlbnV7e3p1d3VxcnV1cW1sbXJ2eXl3dHFubm5ub3Bxcnd7fXt4dnNzdXd5foGBgIGBgYCAgIKBgYGDg4F9e3x8fXx5d3VybXJ4fX59fH19fXh0bGlyeHdxcHBwcHFxcnZ3eXp6eXl3d3h4eXl5eXp6eXd3d3p7enp6enp6eXl5eHh4d3Z3d3V0cWpmYmFhYWFgYmdrbG5tbW5ubm5vb29vcXJzdXZ3d3h6enh2dnRycG5taWhkYl9dW1hWWFlaXWBjZ252foGBgoODg4OCgoB5c2pmaG92e3l0cm5qZWZnaGhoa21qaWlnaGptbGxsbnBxcHF3e3+Dho6Ul5mbm5yalo+JhIB9foaLkJaZl5GOjZGWm5+em5eTjYmGh4uMi4qIhoaEg4OGiYuOkI+NiouLi4yKiYaFhoWFhYN/fXxxbXN8gH55d3R3dXNzdXZzbWxtcnd6e3l0cW5ubm5wcXJ0d3t8enh3dHR2eHp/goF/gIGBgICAgoODgYODgX17fX19fHp3dXJvc3l9fn18e319eXRsanV5dnBwcHBwcXFxc3V5enp6end3eHh5eXl5enp5d3d3eXp6enp6enp5eXl4eHh3dnd3dnVzbGllZGNgX15fZGdrbG1tbm5ubm5ubm5wcXN0dnd5eXp6eXd1c3FwbmxnZWJhXVxcWFlaXl9iY2ludXp+f4CBg4ODg4KDgnp0bGZobnR7fHd0cWxrbGxqa2lpamhnaGhnbG9ubWxucHN0dnl9gIOGj5WYmZucnJuYkYmEgH2AiIyRmJublI+Okpecn5+cmpaSjIeFh4iJiYeFhYSCgoeKjY6NjYyKioqMi4yIhoSCgoOFhH97enRueISHf3ZzdXh5dXJzdHJtbG1yd3p7eXRxbm5ubnBydHV2enl4eHd3d3Z4e4CCgH6AgYGAgICCg4OBg4OBfXt9fX18end1cnB0enx+fXx6fn16c21teHp1cHBwcHBxcXBxdHl6enp6eHh4eHl5eXl6enl4eHh5eXh4eHh6eXl5eXl5eHh3d3V3dnRwbGhoZGBfX19iZGdqbW5ubm5ubm5ubnFxcnR1d3h6e3t6eHh0cW5taWZjX11bWVxdXmBhZGdrcXd6fH+AgIGCgoKCgoKBfHRuZmZrcnh8endwbG9yb2psamlpaWpqbm5wb25qaXBzdXh5e4CCg4aOlZmbnJydmZaQiIOAf4OIjpOZn5+akpGUlpqbm5qYlZWPiYWEg4aIhYOChICAhoyOjo2KiYqJiYqLjIiGg4CAgoSEfnt7dnF8hod/dnR2fXx3cnBzcW1sbnN4e3t3dHFubW1vcXFzdHZ4eHd2dnV3dXd8gYKBf4CBgICAgYKDg4KDg398e3x9fnx6dnVycHV7fX59fHx+fXtyb3J7fHRwcHBvb3BwcHF2eXp6enp4eHl5eXl7e3p6eXp5eXl5eHh4eHp5enp6e3p5eXd3dXh4d3NxbmpmYmFfX2BhZWltbm5ubm5vb29vcHBydHV3eHp7fHp4dHFsamdjYmBcW1laXF9iZWdrbnZ6fn5+gICBgYKCgoKCgoF8dW5nZWhtc3t6eHJwdHZ0bmtqaGhqaWhsbW9xcGtobHJ3eXt+goOChoyUmpycnZyXko2KhYSEhomPlZufoJ2YlZSTk5OWlZSUlJGLhX99gIWEg4KCgICHjY6NioeHioqKioyMi4eDf36Bg4J9e355dXuDg311c3d/gHtxb3JxbWxucnZ5end0cW5tbW5wcHBwcnNxcXBwc3V2eHyBg4J/gIGAgICBgoODg4ODf3t6fH5+fHl2dnNxdnx+fn18fn5+e3NvdX18dHBwcG9vcHBwcnZ6enp7e3l5enp7e3x8e3t7e3l5eXl6enp6enl6enp7enl5d3d1eHh4d3NwbWlmY2BfXV9jZ2xtbm5vb3BwcHBwcHJ0dXd3eXp6dXJva2hmYl5cXFlaWl1gYmZqbHFzen6Bf36AgIGBgoKCgoKCgX13b2hlZWpweHZ4eHl9fnx1cXBua2ppaGdnaW5uamhocHd7fYCCgoOEipKbnZydnZeSi4uKiIeIipCXnZ6enpuXlJKOj5KRkJGRj4uFfnh3gIGDg4KCg4mOjYuHhISIioqJiouKhoJ+fn6Cf319gHx4eX19enZ0eoKFf3RwcnFtbm5xdXh5dnRxbm1sbW5ubGxvcG5sbW1vcXV3e4CCgX+AgYCAgIGCg4ODg4N/e3p+fn58eXd2dHN4fX9+fX1/f397dG93fXtzb3BwcXFycnFzdnp6enx8eXl6ent7fHx8fHt7eXl5eXp6enp6eXt7e3x7enl3d3V4eHh4dnNwbWlmYl5cXWBmbG1ubnBwcHBwcHBwcnR1d3Z4eXdxbmpmZGFeWlpaWFpdX2Jka25xdXl9gIGAf4CAgYGCgoKCgoKBfXhwaWRlam91dXh9gISEg3x4d3VybWtoZGNkaGppaWltdXt9f4KCgYKJkJqdn6CdmJGKi4yLi4uMkJienZuampiWkY6OkJCOjI2NioR9dHF3fIGDg4OGjI2MiIODhYiHh4aHiImFgn5+foJ/fn+Af3l2eXp5enV8hIeBdnJwcW5ub3F2eHl1dHFubWxtbGxqamxtbWtsbG5vdHZ6f4GAf4CBgICAgYKDg4ODg399fH9/fn15d3d1dXp/gH59fn9/f3t1c3l/fHNucHBxcXJycXN2enp6fHx6enl5enp7e3t6enp5eXl6enl4e3t6e3t6ent7eXh3d3d3eHh3dnVxbWllYV9eX2Noa21vbm9wcG9wcnN0dXZ2dHRzcGxoZWFdWlhYWlxdXmFjZmpvc3Z6fX+BgYCAgICCgoGBgYGBgYB/eHJqZWdqbHJzeYGEh4eIhoOCf3t3cGpiY2NfX2Nqa25wdHh9gIGBfYCNmZ2enp6YkIuMjo2NjY2RmJ2dmJiYmZiUj46Pj46NjY6KhX91bm1xeICEhomPjYeFhIWEgoGBg4SGhoSAf36AgYKAgIB9eXd1en6Aen+DhoB4c3Fxb29wcXZ6eXRxb21tbWpra2ptbG1vbW5ub3J0dXl8e31+gYKBgIGCgoODg4OCgH9/gIB/fXp5eHZ2e4CAfn5+foB/fHd1fYF6cm9wcHBxc3NzdHl7e3t7e3p6eXl7e3t7e3l6ent7eXp6enl7e3t7e3p6enp5eXl5eHh4eHh4dnJwbGllYWBfYWVpbW5ub29vb3BxcnJ0dnZycGxpZWJeXFhWVlhcXmFjZWltcnV5e31/gIGBgYGAgIGBgYGBgYGBgH95dG1mZWprbXN8hYeHiIqKiIeHhYJ8dGtpZ2FeYmhrbmttbHF5fX13eYeXnJ6enZmRjI2Pj46NjpKYnZyYlpibm5eQjo6NjIuLjImGgXl0bWxzgIaLjY2Ig4KCg4F+fXx/gIODg39/fYGCgoKDgn57eHZ6gIJ+f4GBf3h0c3JxcXFydnp5dHBta2tramtsbG5ubW5tbm5ucXFydnh4en2BgoOAgoKCg4ODg4OBgICAgH9+enp5d3d8gYB+fn9/gH97dnd+gntzcXBwcHJ0dHd5fHx7e3t7enp7e3x8fHx8ent7enp6e3t6eXt7e3t7e3t6enl5enl6enl5eXl3dHNwbWljYF5fY2dsbW5vb29vcHFyc3R0dG1qZWJfW1lXV1ZYWl1iZmlrbnN5enx+f4CBgYGBgYCAgICBgYGBgYGAf3t1b2hla21xdHqChYiKi4uKiYqKh4N/eXZwaGRmaWppaGlpa3N6fHV1g5Sbnp6cmpOOjpCQj42OkpecnJqVmJyemZSPjIqIh4mKiIaCf353dHmEiY6PiYJ9fH+Af3x8e36Bg4SEgYB+gYKChIWEf398enyBgYB+fXx8eXVzc3JycnR4enl1cmxrampqa2xsbm1sbGxsbW1ubW9zdXd4e4CCg4GDgoKEhISEg4GAgICAgH97e3p5eX6BgH5+f3+Af3l1eH+CfHRxcHBwcnV1eX1/fXp6e3t6ent7fHx7e3t5enp7e3l6e3p5e3t7e3t8fHt7e3t7eXl5enp5eXd2dnJwbGZgXV5hZWxtbW9wcG9wcnR0dHJuaWViX1xWV1dYWFtdYGVrbXF0eHx9f4CBgoGCgoGBgICAgIGBgYGBgYB/fXVxa2drc3d3eXuDiY2Ni4qKjIqIiIeGgHpuamhsbGVmaWtqcXl7cnSBkpqdnJyak5GPkJCPjY+Sl5ucmpWYnJ6blpGLiYeFiIqJh4OCg4J9gYiMj4+If3p4fX19fHx7foKEhIWDgIGCgoKDhoSAgoB9fYGAf3x6eXp5d3N0cnN0d3h7e3Vwa2pqampra25ubW1sa2prampqbHBydHd4f4KCgoOCgoSEhISDgoGBgICBf3t7e3x5f4GBfn6AgIB/eHR4f4F6cnBwcHFzdXZ7fn98eXl7e3l5e3t7e3t7enp7e3t7eXp8e3p7enp6enx8e3t8e3t7enp6enp6enp3dXNwa2VgX19kamxtb3Bwb3Fzc3V0cGtlX1tZV1ZWWFpcXmBmbHBzd3p9f4GBgYGCgoKCgYGBgYGBgYGBgYGBgYB8eHJub3J7f357eYGLkI6LiIuMi4uKjI2KiH1vaG5sYl5jaWtxeXhxbnyRmp2dnJqQlJGQkI2OjpCUmZqZmJeam5mVkYyJhoWIiYmIhYWIiYmJio2OjoqBenh6fX5+foCAhISFhYOBg4WEgoOEg4OFhIB+f359enl5eXp6dnRzc3R3fH15c29sbW1ra2prbm9xcG9ubGtqaGlqamtwc3h9gYKBgoODhISEhISCgYCBgYB+ent7e3p+gYB/f4GBgH94c3eAgntxcHBxcnN0d3x/f3x5ent7enp7e3t7e3t6enp6enp7e3x8fHx7e3t7fHx7e3t7fHx6enp6e3t7e3p4dnNtZ2JfXWFlZ2lqa2xvcnNzc3FtaGFaWFhYWFhbX2JlaGxydXl9f4CBgYGBgYKCgoKBgYGBgYGBgYGBgYGBgX16c3F4fYKFhIB/hoySkIyIi4yMjIuLjI+QjX5wcHBiWVxlbXJ6e3Nsd42anZybmJCUlJSSj4+Pj5SYmZaVlpiYl5SRi4iGhoiJiIiHhouKi4yLjo+NiIJ9eHh7e3x+gYKEhoaGhYOFhoSDg4OEhYeEf3x8eXh6ent5eXl3dHR0dXl9fXdybm1tbGtrbG9xc3V3dXRycG9ubW1pamxvc3h+gIGCg4SFhYWFhIKBgYGBf3x6e3x7fICCgICAgYGBfndyeICBenFwcXJ0dHV4fIB/fXl7e3t8fHt7e3t7e3p6enp6enx8fH18fHx8fHx8fHt7e3t8fHt7e3t7e3t7fHp4dXBqY2BeXmFkZmdoaW1wcXFwbWljXVtaW11cXGFlaW1wc3h6fX+BgoKCgoKCgoKCgoGBgYGBgYGBgYGBgYGBf3t2dn2ChYeFhIOIjpOQi4iKiouLioqNj5KShnZzc2heXGBqc3x9dW11ipicm5mXj5SXl5aTkY+RlpmZlpOTlpaVko6KiIeHh4iIiIiHi4yLi4yOj4uFg395eXt7en2Bg4WGiIiGhYaEg4KDgoOFhYF8eXl5eHt9fHp3eHZ2dXV1eHx7dHBvbGpqa2tucXR2d3l4eHh1c3Jycm5qamxvdXt+gYKDhIWFhYWEg4KBgoJ/fHt8fn1+goKBgICBgYF9dHB2foB5c3Jyc3R1dXh9gH58e3x8fHt7e3t7e3t7enp7e3t7fHx9fXx8fX19fXx8e3t8fHx8fHx8fHt7e3t8e3h2cm1mY19eXmFjZGVma21vb2xpZGBcXFxdX2FiZ2luc3R4e3x/gYKCgoGBgoKCgoKCgYGBgYGBgYGBgYGBgYF+enl5f4KGh4WEhYmPk46Kh4mJioyLio2PkZKJeXV1bmRfYGZye312bnOJl5qbmpePlJmYmZaUkpOXmJiVk5CTk5KOjIqHh4eHiImIiIeKjI2Mi4yKhoOBfnl6e3t7fYCDhIaIh4aHhIKBgoOAgoSBfXh4eXp6e318enh4d3d2dnZ4eXhxcG9samttbW5xdHZ5enx7eXd3dXNzcGxqamxxd32BgoOEhoaFhYWDgoGDg4B+fHx/foCDg4GAgIGBgXxzbnR8gXp1dHJ0dXV2eX6Bf3t7fH19e3t7e3x8fHx7e3t7enp7e3x8fHx7fX19fHx8fHx8fHx7e3x8fHx6enx7enl0bmpmY19eXl9gYWFlaGppZmRfXVpbXF9hZWdscHR4eX1+gICCgoKCgoKBgYKCgoKBgYCAgoKCgoGBgYGAf356fH+CgoaHhoWHjJCSj4qGhoeIioqMjpCRkop7dnZ4b2hkZnR+gHhwdImVmZublo+UmpqamZiVlZaXlZORj5CSkI2LioiHh4eHiYqIiIyOjo6KiIWCgH17eXp5eXp9gIODhIaHiIqGgYGBgX+Agn96eXl7ent8fn17eHl4d3ZzdHR1dHFva2xrbnFub3F1eXx9fn18enh4eHl3cmxoaGxye4CCg4OGhoaHhIODgoOCgn17fH5/gYWCgIB/gIGAenFudH1+eXZ1c3R2dnZ5foB+fHt8fH17e3t7e3t8fHt7e3t6ent7fHx8fHt9fX18fH19fHx8fHt7fHx8fHt7e3t8e3dybWllYmBdXV1eXmFkZWNiYF5dW11fYmhtb3J2en1+f4CBgYKCgoKCgoGBgoKCgoGBgYGBgYKCgYGBgYB/fnp/g4KDhoeHhoeLkJGOioSDhIeHio6QkpKSi315eH5+eG9tdYCBeHBzhpOYmpuWj5SampqampaVlZWUko+Ojo+Ni4uKiIiGhoaJi4qKi4yOjImHhoR/e3h6eXd2eXuAgYCAf4OHi4iDgYGBf4CCf3p5eXp6e31+fXt5eXl4dnRxcHJxb25tb3Bzc3BwdHl8f4CAf358fX17foB8dG9pZ2x3foKDhIaGhoeFhIOCg4OBfXx9f4GDhYKAgX+AgYB6cGx0fXx4dXN0dHZ2dnp+gH58e3x8fnt7fHx7e3x8e3t7e3p6e3t8fHx8e319fX19fX18fHx8e3t8fHx8fHx8fHx7eXNva2dkYF1dXFxcXmFiYF9fXl5eYWRobnN3ent9f4CAgoGBgoKCgoKCgoKCgoKCgYGCgoGBgoKBgYGBgH99fYOEg4SHh4aGhomOj46Jg4GBg4SIjpGUlZSMgHt7goSCe3R5gYF4b2+Bjpeam5eSlJqamZmZlpSTk5KRjoyMjYyLi4qJiYWFhYmLiomIioyLiYiHh4N9eXt5dXN2eX5/fXp5fYSJioaEgoF/gYJ8enl7ent8fn98enl4eHh1c29ucHBvbnFydHR0cnN3e36AgYGAgH5/f36BgoF8dWxnaHF7gYOEhoiHh4WEhIOCgoB9fn+AgYSEgoCBf4CCgHpva3J8fHd1c3V1dnZ2en6Afnx7fH1/e3t9fXx8fHx7e3t7enp7e3x8fHx7fX19fn59fXx8fHx7e3x8fHx8fH19fHp6dHJuaWVhXl9cXFxcX2FfX19eYGJlaG1zd3p+f4CAgH+BgYGCgoKCgoKDg4KCgoKBgYKCg4OCgoGBgYGAf3x+g4OEhoaHhoaFh42OjoqFgH+AgYaOk5WYlo2Ce32ChoeCfHqCgXhsbHuLlpqbmJWVmpqZmJeUk5KRkJCOiouMjIyLjIuJhYWFiYuKiYmKiYmJiIiJhX56fHp0c3J3fH58eHV4gYmKiIeDgYCDgnp5eXp5e31+f3t5eXd1dXJwbm5wb29wcnR0dHR0dXl9f4GBgYGBgICAf4KCg4F7c2tnbnd/g4SGh4eHhYSFg4OCgX9/gIGChISCgIGAgYKAenBrcnt8d3Z0dnZ2dnZ6foB+fHt8fn97e3x8fHx8fHt7e3t7e3x8fHx7e3t7fX1+fn19fHx8fHx8fX19fXx8fHx6enl3dnJtaWRgXFxcW1xcXmBeXl9hZWpxdXh7fYB/gIGBgIGCgoKCgoKBgoKCgoKCgoKCgoKCgYKCgYGBgYF9foOEhIOGh4iGhYWFio6OioaAfH1+gIyTl5eWj4J+f4OJjIiDgISBd2hndIaUmpuZmZaampmYlJKRj46Njo6KiYqLi4yMjImFhYWKjIuKiIeJioqKiYmHfnl6enZ0c3Z5fH16d3d/h4yLioWAgIJ+d3p7eXp7fH+AfHl6eHd0cW5sbG5vcHFydXV1dXZ3en2AgICAgoGAgYGBgoOEhIF6cGlpcX2ChYaHiIeHhoWEg4KBgYCBgoOFhIGBgYGBgX96cW12fXx4dXV2dnd2d3l+f358fX5+fnt7fHx8fHx8e3t7e3t7fHx8fHx8fHt9fX5+fX18fHx8fHx9fX19fHx8fHt7enh4dHBtaWZiYF1cXFxeYWFhY2ZscXZ4e35/gYCAf4CBgYKCgoKCgoGCgoKCgoKCgoKCgoKBgoKBgYGBgH2CiIWEhIaIh4aGhoWJjY6KhoF7fH1+h5CYmJeShoCAg4eMjoiChYN5bGhyhZOYmpiZmJqampmVkY6LiouMjIqJiImJioyMiYWGh4yOjIuIiIiMjIyMi4mCfH18eXd2dnl8fXp4dn2GjIqJhoGBgX14eHl5eXt9gH97eHRzcnFua2lqbXBycXJ1dXV4eHl7foCAgICCgYGCgoKEhYSGhIB2bGVseICEhoeIh4eGhYWEgoGBgoOChIWEgYGCgoGBf3pyb3d+fXh2dnd3eHZ3eX5/fXt8e3x7e3t8fHt7e3t7e3t7e3t8fHx8fHx9fX19fX19fXx8fHx8fH19fX18fHx8fHx7enl2dXFvbGpmYWBdXV9hZGVpbHF3eXt+gIB/gIB/gIGBgoKCgoKCgYKCgoKCgoKCgoKCgoGCgoGBgYF/f4eLhYSEhoeHh4iGhIaJjYqGgXx7fHyBjpeZmZSKg4GDhouOioSGhn1zbHOFkZeal5mZmpqamZWRjouLioqKiYmHh4iKjIyKhoaHjI+NjImIiYyPjI2Mi4aCgHx5eXl4eXx+e3p6f4aKiYiFhIWGgXx4d3d4en1/fnp1cXFvbmtqaWxvcXJxc3Z3d3l5ent/gICAgIKBgYKCgoSFhIaFgnpvZmlzf4SGh4iHh4aFhYSCgYKDhIOEhYSBgYKCgYKAe3R0en59eHd3d3d5d3d5fn98eXh2dXN7e3x8enp6ent7e3t7e3x8fHx9fX19fX18fH19fHx8fHx8fX19fXx8fHx8fH18eXd3dHFvbGlkY19fYGNmZ2twdXp8fX5+gH+AgICBgYGCgoKCgoKBgoKCgoKCgoKCgoKCgYKCgYGBgYCDi4qGhISGh4eHiIaEhYeLioaDfHt6en6Nl5qalo2GgoKFio2LhoaHf3RudIOQl5mXmJmbm5qalZKOi4qJioqKiIaGiIqMjIuGhoeOkI+MioqLjY6Mi4qLiYeCfXp5enp6fH9/f32Ch4mJh4aFiIiGgHt3dnh5fX99eHRwcW5ra2psbnFzcnN0d3h4eHl6e36AgICBg4KBgoKDhIWFhoWFfnNnZW57goiJiIeHhoWFhIOEg4OEhYaFhIGBg4OCgoJ8dXZ+gX15d3d4eHl4d3l+f3x3dHJwbXt7e3t6enp6eXl6fHp6e3t7e319fX1+fn18fX19fX19fHx9fXt7fHx8fHx8fHx6ent6d3VxbmtnY2JkZmlscHV8fX9/f39/f39/gYGAgIKCgoKCgoKCg4OCgoKCg4ODg4OCgoKBgYKCgoaLiYSDhoeIiIiIhoWFhoiJiIN+fHt7fYqWm5qaloqDgoOHiYeHiIV9dG90g4+WmJmZmpubm5uYk4+MiYmJiYqIhYWGiYyNi4mJipGTkY6NjpCRj42KiomJiIWAe3t6eXl7gIGDhIaIiomIhoeLi4uHg3t1dXd4fHt2c3FwbWxtbnBzdHR0dnd5e3t8fHx8foCBgYGCg4KDhISFhoeGhoeEeGpjaXeDhoeJiIeGhYaEhIODgoSGh4WDg4ODg4ODgX55eoCDfnp3dnV4eHZ3en+Ae3Rsamppe3t7e3p6enp5eXp7e3t7e3x8fX19fX5+fXx9fX19fX18fH19e3t9fXx8fHx8fHt7fHx6eHZ0cm5rampsb3J3eX5+gICAf39/f3+BgYCAgoKCgoKCgoKDg4KCg4ODg4ODg4ODgoGBgYGChomJiIiIiYmJiYiGhoaGh4iIhIF9enp9ipSZnJyZjYJ/gYSHhoeJhX1ybXKAjZaXmJiam5ycnJqUkY2KioqJiYiEhIWJjIyLioqMk5WTkI+RkpKPjIqJiImIhoJ9eXh4eXyChIWFhYaHh4WFh4qLi4yJgnp2dXZ3dnVxcXBub3FydXZ2dnZ4eXp9fX19fX1+gIGBgYKDhISEhYaHh4eHiYZ/b2VmcH6FiImIiIeGhoaFhIOChoaHhoODg4ODg4OBf31+hIWAenh3dnl4d3d7gHx1bGdoaWl7e3t7enp6enl5ent9fXx8fX19fX19fn59fH19fX19fXx8fX16enx8fHx8fHx8e3t8fHt5d3l3dXJwcHJ1d3p8f3+AgH9+fn5/f4GBgYGCgoKCgoKCgoODgoKDg4ODg4ODg4OCgYGBgYGGiYuNjIqLi4qIiIiIh4eGhYeGg356en6KlJmcnJuQhoGCg4aGiIqGfXBrb32MlZeYmJqcnZ2dmpWRjYyLi4qJh4ODhYmMjIuKi46TlZWSkZOTk46LiYiIiYiGg353dHN2e4KGh4WEhIWGhYSEh4iKjIqJgn14eHNzcXFycXBydHV3d3d6eXp6e319fX19fX6AgYGBgoOEhIWHh4eHh4eIiIJ0Z2VreYSJiYiIh4eGhoaEhISHh4iHhYODg4ODg4KAgIOFhX99enh3enp5eHp8dWxnaWtpaXt7e3t6enp6eXl6e3x8fX19fX19fX1+fn18fX19fX19fHx9fXt7e3t8fHx8fHx7e3x8fHt7e3p4dXR0dnh6fH5/f4CAf35+fn9/gYGCgoKCgoKCgoKCg4ODg4ODg4ODg4OEhIOBgYCAgYiKjo+OioyNi4iIiImIiYaFhYeDf3l4f4yUmJqcnJOKg4KChYaJioh9cGtvfYyVl5mYmpyenp2al5KNjIuKiYmGhIWFiYuMjIyNkZSXlZSUlZWTjouJiIeIiIeEgHVwb3F5goeHhYOEhYWEg4CCg4eJiYuHg396cXBwc3Ryc3Z2d3h3e3x8ent8fX19fX19foCBgYGCg4WGh4eJhoeHh4iIhHlrZGh2g4eHiIiHiIaGhoWEhYiIioeFg4ODg4ODg4GBhoeEgHx7eXh7e3p5eHhuaGZsa2xsfHx7e3p6eXl5eXp6fHx9fXx8fn5+fn5+fX19fXx8fHx8fHx8enp7e3p6fHx7fHx8fX18fHp8fX17eXl7fH5+f4CAgICAf39/f3+AgICAgYGCgoKCgoKDg4ODg4ODg4ODg4SEg4KCgYCBiIyTkI2Ki4yLiouLiomIhoWFh4aAenqFj5SWmZucmY+Gg4SFh4mLiHxvbHF+jZeYmJiZnJ6fnpyWko+QjoqIiYqHh4iIioqKjI+TlJaVlpaXlpOOi4mIh4eFhYWAdWxqbHaBiIqGg4OEg4GAfXt9goeHiouIhX5ycHFydHR0d3h4enl9fn18fH1+fn5+f39/gYCAgIGEhoeHiImJiIiIh4aFfW9lZXKBhYeIiIiIh4eFhYWGiIqKh4WEhISEhISEg4OFiIOAfXt7fHx8enh3cWtra2trbG57e3t7e3t6enp6enp7e3t7e3t+fn9/fn59fX19fHx8fHx8e3t5eXh5enp7e3t7fX1+fnx8e31+fn58fX5/gYCBgYGAgICAf39/f39/f3+BgYKCgoKCgoODg4ODg4ODg4ODhISDg4OBgIGJj5KPjImKjIuNjo6NjIuHhYWFhoOAf4iQk5WWmZuclYuFhYaJiouIfHBucXyMmZqYmJmbnZ6dmpWSkJKRjoyNjIuLiYmKioqLj5KVlZWWmJeVko6LiIeGhoWEhoF6b2hmbHV+hISDg4OCf315dXN2gIaJiYmIgXd1dXZ3eHh6enp7e31+fXt8fX9/fn5/f3+BgICBgYSHiImKioqJiYmIh4eBc2hlbXuDhoiJiIiIiIaGhYaJioqHhYSEhISEhIODg4aIg399fHx9fXx6d3Fqam9wbm9wcnp6enp7e3p6enp6enp6e3t7e35+f39+fn19fX18fHx8fHx7e3l5eHh6ent7enp9fX5+fX18fn9/f35+f4CAgYKCgoCAgIB/f39/f39/f4GBgoKCgoKCg4ODg4ODg4ODg4OEhIODg4KBhIuPj42KiYqLi42RkI6QkIqGhIWHh4SFi5KTlJWWmZyakIeGh4qLjIh8cnByeYqYm5mXl5qcnJyYlJKRlJSTkZGQkI+Mi4yLioyPkZOVlZeYl5WSj4uIh4WFhISGg39zZ2JlanF5gIOEg4F/enl5dXV8g4eGiIiFfHl3eHl6e3x8e3t7fX59fH1+f39+fn5+f4GAgIGDhIeKiouLiomJiYiHh4R5bGVoc3+GiImIiIiJh4aGh4mKi4eFhISEhISEg4OEiImEfnx9fX5+fXp1bWltcXJwcXF0enp5eXp6eXl6e3p6enp7e3x8fn5/f35+fX19fXx8fHx8fHp6eXl6eXp6enp5en19fX1+fn19gIB+gH+AgYGCgoCAgICAgH9/f39+fn9/gYGCgoKCgoKDg4ODg4ODg4ODg4SEg4ODg4CGjI6Ni4qJiomLjI+PkpSUjYiFhYmIhoiNkZOTk5OYmpySioiIio2OiHx0cnV7iZecmpeXmZucm5eTk5OXlpaUk5OTkZCOjoyKjI6RkpWXl5eWlJSPi4iGhYSDhIaGgnZnYmVlaHF9goSDgX97e3x6d3yBg4aHiIZ/e3d6e31/fn19fHx9f319fX6AgH5+fn5/gYCAgoOFh4uLjIyKiYmJiYiGhn1uZ2Vue4SIiYqKiYmHhoaHiouLh4WEhISEhISDhIWIiYV+fX5+f3+AeXBpanBzdHFydHZ5eXl5eXl5eXp6enp5eXp7fH1+foCAfn59fX19fX18fH19e3t7e3p6enp6enl6fHx9fX1+fn6AgICBgICBgYGBgIB/f39+fn5/f35+f3+AgIGBgoKCgoODg4OEhIODgoKEhISCg4ODhYuPjYuLioqKiYqKjo+TlpaSioWEiIuKjI+SlJSTk5SXm5eOiIeKjY6JfHZ4e36IlpyYl5eZmpqZlJSTl5mZmZaWlJOTkpKRkI6NjpCSlZaWlZSUk4+LhoSDgYOEh4eFeGhmbGlnbnd/goOAfnp5eXh4e4CDgoOEhYN8enl9fH18e3t8fH1+fXx8foCAf39/f4CAgYGCg4eJi4uLiYmJioqKiIeJf29nZGp1goiJiomIiYeFhoeKjIqGhISEhISEhIOFh4iIg39/f3+AgX51bGttcHJ0dHZ3enl5eXl5eXl5enp6enp6ent8fX5+f39+fn19fX19fXx8fHx7e3t7enp6enp6eXp8fH19fX5/f4CAgYGBgYKCgYGBgX9/fn59fX5+fn5/f4CAgYGCgoKCg4ODg4ODg4OCgoSEhIKDg4OHj5GLiIuJiomJiIiMj5SYmJSOh4OIjY+Pj5KVlJKSlJebmZCJh4qMjol+dHd+g4qXm5eWmZmamZiUlJiZnJ2WmJmWk5SUk5KTkI+QkZOUlZWSkpKSj4yHhIKChISHiIR3ampxb2tscXqBgYB+eXZ3eHh4eHp8fH6Bgn98e319fH18fHx8fX59fH1/gICAgICAgH+AgYKEh4uLi4uJiYqKioqIiImCdGdjZ3F/hoiKiomJh4WGh4uMioaEhISEhISEg4WHiYiDf3+AgIGAeG9rbW9ydXh5e3x+eHh4eHl5eXl6enp6enp6e3x9fX1+fn5+fX19fX19fHx8fHt7e3t6enp6enp5enx8fX19foCAgYGCgoKCgoKCgoGBf399fX18fX1+fn9/gICCgoKCg4ODg4ODg4ODg4SEhISEgoODg4iRj4qHi4qHhIiDgYeQlpualJCIgoeNkpKPk5WUkpKUl5qak42Ji4uMiIB0cXiBiZSbmZaam5yamZeWmZaWnp2cnJiVlJSTlJWTkZKTlJOTlJKSkpKQjImGg4KEhoiIhHhvcHRzbm1xeoB/fXt4dXV3d3V0dHN0d31/gX18fH18fXx8fHx9fn18fX+AgICAgIB/fn+BgoSIjI2Ni4uKioqKioiHiIR4aWNlbnuEiYqKiYmHhYaIjIyKhoSEhISEhISEhIeLioSAgICBf3xxa2xvcnV4ent+f4B4eHh4eXl5eXp6enp7e3p7fH19fX5+fn59fX19fX18fHt7e3t6enp6enp6enl6fHx9fX1+gYGCgoODgoKCgoKBgYF/f319fHx9fX5+f3+AgIODgoKDg4ODg4ODg4ODhISEhISCg4ODipKPiYaLioaEiIB9hJCZm5qVkIiChI2SkZCRk5SUlJSXmpqVj4uLiouIgHVtcnuFkZubmJudnZybmZmYkZeeoaCempWTk5SUlJWUlJWUk5OTlJORkpCNioaDgoSHiIiFenR2dnRvbnJ7gH98e3t3dXV0dXRycG9zen5/f318fXx8fX18fH1+fXx+gICAgYGAgH5+f4GChImMjY2Mi4uLioqKiIeIhXttZGRreYSKiouKiYeFhomMjImGhISEhISEhIOFiYuKhYGBgIJ+d2xrbXB0d3l7fX+AgHh4eHh4eHl5eXl6ent7e3x9fX5+fX5/f35+fX18fHx8fHx7e3p6e3l6enp6ent7e3x8fH2AgYGBgoKCgoKCgoGBf359e3t8e3t7fHx+gICAgoKCgoODg4ODg4SEg4ODg4SEhIODg4SLkY6KhouKiYiIgX2EkJiZmZWRiYGDjJKRj5CSlJSVlpiam5eQjIqLjIiCeXFtc32Mmp2bm5+en56amJePnqChoJ2YlZOSkpSVlpaVlZSTk5OUk5KSkI+MiIaFhoiIiIZ/eXt6dnJwc3uCg4B8eHdzb3F2dXNwbXF4f4CAfXx9fXx9fXx7fX19fX+AgICAgIB/f3+AgIKFiYyNjY2LioqKiomJiImHfm9mY2p4gomKi4qJhoWGiYyMioaEhISFhYWDhISJjImFgICBf3huaWtvcnV5fH1/f4CAeHh4eHh4eXl5eXp6e3t8fH1+fn59fn9/fn59fXx8fHx8fHt7e3t7eXp6enp7fHx8fHx8fX+BgYGCgoKCgoKCgYB/fnx8e3t7e3t8fH6AgICCgoKCg4ODg4ODhISDg4ODhISEhIODhYuRjoqIjYuLioiDf4SPl5iXlZGKgoGKkpKNj5GUlJWXmJubmJGMioyMiYN+e3V0eIaWnZ+fn5+fnpmWlpWdn6CfnJiTkJGSlJWWmJeWlJOSlJSTkpCQj42KiIeGiImJiIN/fnp4dnZ5gYSEgHx6d3JsbnV3dXBtcXZ9goF+e3t8fHx8fHt9fX19f4CAgICAgH5+f4CAgoWJi42NjYuKioqKiYmJioiAc2llaXiDiYqLiomGhYaJjIyKhoSEhIWFhYOFhYqMiYWBgYF9cWprbXF0d3t9f39/gIB4eHh4eHh5eXl5enp7e3x8fX5+fn1+f39+fn19fHx8fHx8e3t8fHt5enp6ent8fHx8fHx9foCBgYKCgoKCgoKBf35+fHx8e3p7e3x8foCAgIKCgoKDg4ODg4ODg4ODg4OEhISEg4OFi5COi4uOjIqJiYSBg42UlpWTkYuCgYmSkYuNkJOUlpeYmpqYk42MjIyKhYF/enR0gJKcoaKenZ6cmJaXlZqdn5yalpKQkZKVlpeYl5aWlZWWlZSRjo+PjYyJh4iJi4qJhYJ/enp6fICDgX58e3hzbWtuc3Z1cnBxdHuBg4J6eHl6fHx8e319fX1/gICAgIB/fX19fn+BhYmLjY2Ni4qKioqJiYmKioN4bWhqeIOIi4uKiYaFhomMjIqGhISEhYWFg4WGiouJhYKCgHhtam1vcnZ6fX5/gICBgXh4eHh4eHl5eXl6ent7fHx9fn5+fX5/f35+fX18fHx8fHx7e3p6e3l6enp6e3x9fXx8fH1+f4GBgoKCgoKBgYB/fn58fHt6ent7fHx+gICAgoKCgoODg4ODg4ODg4ODg4SEhISDg4WLkI+MjI6NiYeJhoKCi5OUk5GRi4KAiJGQi4uPkpWXl5iampiUj42MjIuHgX98dnR9jpqgoJ6dnpyZl5iUmp2em5eVkpGRkpWVlpeXlpeXl5mWlZGOjY6NjIqJiouMjIuGhIB8fH2AhIOAfHt7eW9oam5ydHZ1dHFzeICFhXx4d3l7e3x7fX18fH+AgICAgH59fXx9foGFiYyNjY2LioqKiomJiYqLhXxwbGx3goeLi4qJhoWGiYyMioaEhISFhYWDhYiKi4mFgoJ/dGprbnB0eHt/fn+AgIGBd3d3d3d3eHh5eXp6enp7fH5+fn5+f35+f319fX19fHx9e3p5enp6ent7enp6ent7fHx9fn5/gYGBgYGBgYCAf39+fXt7e3t7e3x9fX5+f4B/gYGCg4ODg4ODg4ODg4ODhISEg4KChYyRj46Pj46Ni4yKhIOJj5OSkJCNhIGIj46LjI6QlZWXl5eYmJSQj42Ni4qGgHx5eH6Jlpyfnp6dmpiYmJWZm5uZlZSUk5SVlZWVlZaVl5iZm5mXko6Njo6NjYyNj5CQjoqGgoCAgoOFg4B/f358cWVjbnFzdnh4dnV2fYSHgXl3eXp7fHp7e4CAgICAf39/fnx7fHx/gYSIjY6OjYuLi4uLioqKioqIgndvbXaBh4yLiomGhIeJjYyJhoSFhYWFhYSFh4mLiIWDgnlva21vcXV5f3+AgIGBgIB3d3d3d3d4eHl5enp6ent8fX1+fn9+fn5/fX19fX18fH17enl6enp6enp6enp6ent8fH1+f4CBgYGBgYGBgIB/f359e3t7e3t7fH19fn5/gH+BgYKDg4ODg4ODg4ODg4OEhISDgoKFjZOQj5CQkJCOj4yFhIeOkpGQkI2Fg4iMjIqMjZCUlZeYmJiZlpKRj42MioiBfHt9f4aRmJycnJuZlpaWlZaZmJeVlJSVlpaVlZaWlZWYmZybmpmSj42Pjo6Ojo+RkpGQjIiDgYOFhIaDgICAf3pxZltpbnF1d3h1c3V6goiEfHh6e318eXt7foB/f4B+fn19enp7fH6BhYmNj4+Ni4yMi4uKioqKiomFe3JvdYGIjIuKiYaEh4qOjImGhIWFh4eHhoWGiYuIhYJ+c2ttcHJ0eH2BgIGBgYGBgXd3d3d3d3h4eXl6enp6ent8fH5+f35/f399fX19fXx8fXt6eXp6enp6enp6enp6e3x8fX6AgYGBgYGBgYGAgH9/fn17e3t6ent8fX1+fn+AgYKBgoODg4ODg4ODg4ODg4SEhIOCgoaOkpCRkZGRkZCQjYeDhYyPkI+PjYeFiIuKiYuMj5OWl5iYmJmVkpGRj4yLiIF9foGAhIyUmZiYmZeVlZaVlJWXlpWVlpWWlpeXlpaVlZiYmpaYmpOPj4+Ojo6PkJOUk5GNiYSDhIeGhIF/gIB+eXFjUVtqb3R3dnVzcXeAh4aBf4KEhYJ+fXt6fXt+fn19e3t5eHl7fYCEiI6Pj42LjIyLi4qKioqKiYd/dXB0f4iMi4qJhoSHi46MiYaEhYWHh4eGhYaJioiFgXpua29ydHh7gIKBgYGBgYKCd3d3d3d3eHh5eXp6enp5e3x8fn5/foCAf319fX19fHx9e3p5enp6enl5enp6enp7fHx9foCAgYKBgYGBgYCAf39+fXt7e3l5e3x9fX5+f4CBgoGCg4ODg4ODg4ODg4ODhISEg4KCho6TkZGRkZKRkJGPiIOEjI6Qj46NiIeJi4qJioyPkZWXmJeZmJaSkZCOjo2IgX6Ag4GDiJCVlpeYlpSUlpWTlZaVlZWWl5eXmZmWlpWVl5iZl5ublZGPjo6OjpCRlJaVkY2Lh4eHh4eCfn+AgH54b15IR2Zsc3Z2dXNxdX6GiIaGiIqKiYWBfXp7e3t7eXp4eHZ2d3p9gISJjo+PjYuMjIuLioqKiouKhoB2cHR/iIyLiomGhIeMjoyJhoSFhYeHh4aGhomKiYZ/dGtscXN2en+CgoGBgYGBgoJ4eHd3eHh5eHl5enp6enp7fHx9fX59fn5+fn19fX19fXx8e3p6eXl3d3d4eXp6ent8fH5/f4CAgYGCgYGBgIGAfn19e3p6enp6e3x9fX9/gIGBgoKCgoODg4ODg4ODg4ODg4ODgoGFjpOSkpGRkZOSko+KhIOKjI+Pj42Jh4mKiomJi4yPlJeZmJmYl5SSkI+NjIiBfYGEgoOGjZKVlZaWk5OUk5SVlZWUlZaYmJqYmZeXlpWYmZqbnZyXlJKRj46OkJOWl5aTj42KioiIhoJ/gIB/fHltWDo2WmhwdXZ3dnN0fIaJiYmKiYqMioaBe3p6e3p3dnR0dXR1d3yAhYmOj42NjIyMi4qKioqKioqIgXdwdH6IjIyLiYaEh4uNi4mFhYWFhoaHhYaHi4yKhXxva29ydHh9g4WDgoKCgoKCg3h4eHh4eHl4eXl6enp6e3t8fH19fn1+fn5+fX19fX19fHx7e3x6enh3d3h5enp6e3x8fn9/gICBgYKBgYGAgYB/fn17enp7e3p7fH19f3+AgYGCgoKCg4ODg4ODg4ODg4ODg4OCgYWOk5KTkZGRlJSSkIyFhImMj5CPjIqIiYqKiYmLjI6TlpiZmZiXk5GOj46NiIF9gYSDg4aLj5GTlZSRk5GTlZWVlpWVlpibnZual5iYlpmanJydm5iWlJOQj4+RlZiXlpWRjoyLioqJhoOBgX98eGpNLy5TaW5ydHh4dHJ6hYiGhISEh4eHh4R/fHl7fHh1dXR0dHV3fYKHi4+PjY2NjIyLioqKioqKiomBeHF1f4mNjIuJhoSIi42LiYWGhYaGhoeFhYiLjImDd2xucXR4fICFhYODg4ODgoODeHh4eHh4eXh5eXp6enp7e3t7fX1+fX5+fn59fX19fX18fHt7fHt6eHh4eHl6enp7e3t+f3+AgIGAgYGBgYCAf39+fXt6ent7ent8fX1/f4CBgYKCgoKDg4KCgoKCgoKCgoKCgoKBhY6VlJOTkpKUlJKQjoeEh4uOj42LiImKioqKiouMjpKVl5mZl5eSj4+Qjo2KhYGBg4SDhomNkJKTkpCRkZOWlpeVlZWWmJycnJ2am5uZmpqbnJuZmZaWlZGQkZOWmJeWlpOPjIuKioyOjIeDgXx1ZEQrLlVrbm9yd3l1cHaBg396fX+AgoKEg4WAfX5/fHl4dXV0dXh+hIqNkY+NjY2MjIuKioqKioqKiYF3cnaBiY2Mi4mGhoiNjYqIhYaGh4iIh4WFiYyLiH9zbHB0dXp/goaEg4ODg4OCg4B4eHl5eHh5eHl5enp6ent7enp9fX59fn5+fn19fX19fXx8e3t7eXt5eXl4eXp6ent7e35/f4CAgH+BgYGBgH9+fn19e3p6e3t6e3x9fX9/gIGBgoKCgoODg4ODg4ODg4ODg4ODgoGFjpaWlJWUlJSUk5KPiYSGi42PjoqIiYqJiYuLi4yOkJOUmJmXlpKPjo6OjYyIg4GCg4OGiY2OkZCPj5CSk5aWl5aWlpeZmpmenpydnJmamZqbm5mYlpWUkpGUlZeZmJeXk4+Mi4mJjZKTjoaDfnNgQywxWW1vbnB3eXZxdH5/eXR4fX1/f4CChYSCgYB+e3t4dHR1eH6Eio2Pj42NjYyMi4qKioqKi4qJgXVydoCIjIyLiYaGio2NiYeFhoaIiIiHhYWJjIyGe3FucnV2e4GEh4SDg4ODg4KCfXh4enp5eXh4eHl5ent7fX18fH19fn5+fn5+fX1+fn19fX18enp6e3l4eHd3eXl6ent7fX5/gICAgICBgYF/f39+fX18e3t7ent7fH1+foCAgIGCgoKCgoKBg4ODgoKCgoKCgoKBgYSOlpeXlpWVlZaUkY6IhIaKjI6NioqIiYqKi4uLjI6PkZOXmJiVkIyOjo+Oi4mEgoKEhYaHjI6RkI+PkJKUl5eVlZSWmJqZmqGfn5mfkpOXmZqZmZeXlZWUlJaXl5iYl5aTkI2LiYiKjJGRi4aAc2BIOEFfcHFtb3N2dXJ0en15c3Z5e36AgIGDgoKBgH59e3Z0c3Z6f4WKjpCPjY2NjIuLiouLi4uMi4mAdXN3gYiLjIuJhoaKjo6KiIWGh4iJiYeFhYqNjIJ0bnBzdnh+h4iHhIODhISEgn91eHh5eXh4eHh5eXp6e3t8fH19fX1+fn5+fn59fX5+fX19fXx6enp6eXh4d3d5eXh5e3t9fn6AgICAgIGBgH9/f318fXx7e3t6e3t8fX5+gICAgYKCgoKCgoGDg4OCgoKCgoKCgoGBhI2WlpiYlZSVlJORjoiEhoqMjYuJiYiJioqLi4uMjo+QkpWYmJSQjI2Pj46MioSBgoOEhIaKj5GQj5CQkpWXmJWVlJaZnJqfnZGTkpqKj5iam5mYl5eVlZWWl5iXmJiYlpSRjYuKiIeHio2KhYJ3aldJS2JydXBvcHR0c3V5fXx4d3d7f4CAgIGBgYB/fn57dnR0dnqAh4uOkI+NjY2Mi4uKi4uLi4yLiYB1c3eBiYuMi4mGhoqOjoqIhoaHiImJh4WGioyKfnFuc3V3fIKJiomFg4OEhISCfHF4eHh4eHh4eHl5enp6enx8fX19fX5+fn5+fn19fn59fX19fHp6enl4eHh5eXl5eHl7e3x9fX+AgICAgICAf39+fn19fHt7e3p6e3x9fn6AgICBgoKCgoKCgYOCgoKCgoGCgoKCgYGEi5aYl5iVlJaVlJGOiYWFiYuLiYmJiImJiYuLi4yNjpCQk5aXlJCMjY+Qj4yLhoCAf3+AhIiQkZGQkJCTlZiZlpSUlpmbnZ+Qh4qPl4mOl5ybmZiYmJWVlZeZmZiYmJiYlJCNi4mJhoSGh4aCfnZtW0pOZnZ4dHBvdHV1dHd9f356eH2AgICAgYCAf359fXl3dXV2e4GGi4+Qj42NjYyLi4qLi4uLjIuJgHV0eIKKjIyLiIWGio6OioiIiIeIiYmHhYaKjIl5cHB1dnh/iIqLioWDg4SEhIJ5bXh4eHh3d3h4eXp6e3l5e3t9fX19fn5+fn5+fX1+fn19fX18enp6eXh5eXl5enp6ent7e3x9foCAgIB/f4B/fn5+fX18e3t7enl7fH1+foCAgIGCgoKCgoKBg4GBgoKBgYKCgoKBgYSKlJeXmJWUlpWUj42IhYSIiomHiIiIiYmJi4uLjI2Oj4+SlJaUkYyNj5CPjYyHfn17fH2Bh5GTkpGQkZOXmZmWk5SWmZyel4mGipCajZOanpubm5qZlZWWl5qbmZmYmJiTj4yKiYqGhYSDg396cmlbTFBqeHt3cnFzd3VzeH2CgHx8fn+AgICBgYF/fn18eHd2d3d7gYaMj5CPjY2NjIuLiouLi4uMi4mAdXR4g4qNjIuHhIaKjo6KiIiIh4iJiYmHhouKhHRvcnd3eoGJjY2LhYODhISEgndteHh4eHd3eXl6enp7e3t7fHx8fX19fX19fn5+fn5+fX18fHx7e3p5eXl5eXl5eXp6e3t8fX1/foCAgICAgH9+fn18fXx8e3p6ent8fX19foCAgIKCgoKDg4ODgoKBgYGBgoKCgoCAgoaUmJeXlpSWlZOPjImFhIiLioeIiImKioqLi4mKjI2Oj5GSlZSPjo6QkI+OjYd+eXZ4eH2Gj5WVkZCRkZaampeTlJeZmZ2QiYqQkpOXnZ+enp2dmpmXl5aXmpubmpmZmJKNioqJiIeEg4J/fHVsYldNWXR+fnp1cHF1dnN4foOBfX1/gH+AgIGAgIB+fnx5d3Z2eX2Ch4yPkJCOjY2MjIyKi4uLi4uMiH92dXqEio2Ni4mGhoqOjYqIiIiHiYmJiYeIi4l+cHF0dnd9hYqMjIiEg4OEhIOAc2l4eHh4eHh6enp6enx8fHt8fHx9fX19fn5+fn5+fn59fXx8fHx7enl5eHh5eXl5enp7e3x9fX9+gICAgIB/f35+fXx9fH17e3t7e3x9fX1+gIGAgoKCgoKCgoKCgoGBgYGCgoKCgYB/gY6WlpeWlZWUlI+MiYWGiYyMh4iIiImJiYqKiImKjI6PkJGSko+Mj5GRkI6OiYF6eHd4fIOQmJeTkZGRlpmalpSTlpqam42JjpSUkaCUlJaenp6dnJmYl5eam5ybmpqZk46KioiIhoOCgH16dGtiWFVieoF/fHhvbnZ4dnh9g4J/f4CAf4GBgYCAgIB+fHl4d3Z6foKHjI+SkI6NjYyMjIqLi4uLi4yIf3Z1fISKjo6LiYaHi46NioiIiIeJiYmIhoeJhXdvc3V3eoGHio2NiISEhISEg35xaXh4eHh5eXp6ent6fHx8e3x8fH19fX1/f35+fn5+fn19fHx8fHt6eXl4eHl5eXl6ent7fH19f36AgICAgH9/f359fH18fXt7e3t7fHx9fX6AgYGCgoKCgYGBgYGBgYGBgYKCgoKCf3t6hZOXmJeWlZSSjouHhoiLj5CJh4eHiImJioqIiYqLjY6Oj4+RjoyPkZGRj46LhX15eHh5gY6Xl5WTkpOVmJqVkZOVmZubjoiQlpaanJOTl52enqCempmYl5qbnJubm5qTkIuKiIiGg4F/e3dybWVfXmp7gH17d3Bqc3l3eH2EhIGAgICAg4OBgYB/f357eXd2dnp+goiNkJORj42NjIyMiouLi4uLjIh/dnV8hIuPjouJhoiMjo2KiIiIh4mJiYeFh4iAcXB1dnd9hImMjoyIhISEhISCem9qeHh4eHl5enp7e3t8fHx7fHx8fX19fX9/fn5+fn5+fX18fHx8e3p5eXh4eXl5eXp6e3t8fX1/foCAgICAgIB/f318fXx9e3x8e3x9fX19foCCgoKCgoKBgYGBgYGBgYGBgoKCgoB9d3R+j5aYl5WVk5GOiYeGio2RkouGhoeIiIiKioiJiYuNjo2Pj5CPjY+RkpGPj46JgXt4eXp/jpiYlpWTk5SXmJWQlJeXlJ6UjJKZmKCYmZmbn56en56bmpiXmpudnJybmZOQjImIiIaEgX55d3JtaWVkbnmAfHp4cGhveHd5fYSEgH6AgYGCgoGBgX9+fXt5d3Z2en+CiI2QkpGQjY2MjIyKi4uLi4uMiH93dn2FjI+Oi4mGiIyOjYqIiIiHiYmJh4WGhXxucnZ3eICGjI6OjIiEhYSEhIJ4bWt4eHh4eXp6ent7e3t8fHx8fHx+fn5+fn5+fn19fXx7fH19fX18e3p7e3t7enp6e3t7e35+fX1+foCAgIB/f35+e3t9fXx8e3t8fH19fn5/gYKCgoKCgYGBgYCAgIGBgYGCgoKBf3lxbnyLlJWUlJWUkY2LiYuOkJCPjYiFhYWHiImJiImKiouNjpCPkI6OkJKSkZCQj4uEgX9+foSPmJiXl5aUlJWXl5SWmZaQnJaRl5ycoJuenp2em56aoJyYmJicnp6dnpyXk4+KiImIhoSBf3l1cXBwbW1xd3t2dnVvZ2p0eHl8goJ/f3+BgYKCgoKCgX5+fnt4eHh8gISJjJCSkpCOjY2Ni4uMjIyMjIuGfXZ2foaMjo2MiYaJjY6MioiIiIiJiomIhoeBdG5ydnl9hoqMjZCLiIWEhoWFfnFqa3h4eHh5enp6e3t7e3x8fHx8fHx8fn5+fn5+fn5+fHt9fn19fXx8e3x8fHx6enp7e3t7fX18fH19f39/f39/fn58fH19fHx8fHx8fX1+f4CBgoKCgoKBgYGBgICAgYGBgYGBgYB8c2ppeYqTlJSUlJWTjomLjpCQkI+OioWBgIWGiIiIiYqKio2Pj4+Pjo6QkpKRkJCQjYmHhoaGipGYmZiXl5WUlZeYlpeZmJacnJaanqCgn5+hnpyan5OfnZiZmp6goJyenJeTj4qIiYiHhYN/enV0dHVzcHF0dXBxc3BoZ292eX2CgX+AgIGBgoKCgoKCfn5+eXl5en6ChYmMkJKSkI6NjY2Li4yMjY2Mi4Z9dnZ/ho2OjYyJh4qNjoyKiImJiYmKiYiGhX1wb3J2eoKKjY6Pj4qGg4OEhYN7bWhreHh4eHl6enp7e3t7fHx8fHx8e3t+fn5+fn5/f358fX5+fn59fHx7fH19fHp6ent7e3t8fHx8fHx+fn5+f39+fn5+fX18fH19fHx9fX5/gIGCgoKCgYGBgYCBgICBgYGBgYGAf3lvZWd5h46PkZKTlZWOiYyRkpCPj46Lhn97f4GFh4iJioqJjI+Pj46Nj5CSkpGRkZGPjoyMi46Pk5aYmZiYlpWVl5mXl5mcmJScmp2eoaCin6GfnZyhj5yfmpqboJ+gmZycmJOPioeIiIeGhIB9enl6eXdxbW5ubG5zc2xna3F4foSEgYCAgYGCgoKCgoKAfnt5enp7f4KFiYyQkpKQj42NjYuLjIyNjYyLhX13eICHjY6NjImIio2OjIqIiYmJiYqJiIaBeW9xdHZ8hoyMjIuKhYGBgYB/fHVoZ2p4eHh4eXp6ent7e3t8fHx8fHx8fH5+fn5+fn19fXx9fn5+fn58fHt8fn58enp6e3t7e3x8fX18fH19fX1/f35+fX19fXx8fX18fH19fn+AgYKCgoKBgYGAgIGAgIGBgYGBgH98dGpiaHmEiYmMjpOVk4yJjZOSkZCNjYyIf3h6fYOGiImKiomMjY6Pjo2PkJKSkZKRkZGRkJCRlJSUlJeZmZmWlZWXmpmWmJyclZien5+foaCen5+enqGTnaCbmpyioqGYnJyYk4+Jh4eHh4WFg399fX18eXBpaWpqbnNzbmhobnZ/hoWDgYGBgYKCgoKCgoF+e3p6enuAg4aJjJCSkpGPjY2Ni4uMjI2NjIqFfHd6gImNjo2MioeKjo6MioiJiYqKi4qJhn11cHN1dn+GioqHhoJ9enp6eXl1b2dnanl5eHl5enp6e3t7e3x8fHx9fX19fn5+fn9/fn59fX5+fn5+fnx8e3t9fXt7enp8fH19fX19fX19fH19fH19fn59fX19fHx8fHx8fX1/f4GBgYGBgYCAgYB/f4CAgICAgIB/fnxyZV9meH9+f4SKkJKRjIuRlJKRj46NjIiCfXt5gYWIiYqKiYqLjY2MjpCRkZGRkpKSkZKTmZ+dmY+NlpqZl5mXl5ibm5mZmp2Zl6CgoJ+gn5+elpigoZuhn5yanKKlpJ2cm5eSj4mHhoWFhoSDgoKAf314bmJiZ2tucnJvaWZrdYKIhoKBgYGCgoKCgoKCgX99fHt7fYGEh4qMj5OSkY+NjYyMjIyMjY2NiYN7eHqAiIyNjYyJh4qOj4yLiYqKioqJiYiDd3JzdHZ4gYWFhYF+eXRwcXFxb25nZWZreXl4eXl7e3t8fHx8fHx8fH19fX19fX5+f39+fn19fn5/f35+fX18fHx8fHx7e3t7e3t9fX19fX18fX18e31+fn19fX18fHx8fX1+foCAgICBgYGBgICAgH9/fn6AgICAgH5+d21hX2dxdXN0fYWOko+Mi5GUk5KPjoyNiYWBgH16gIaJiYqJiouMjIyOkJGRkZGTlJKRkpOaoqWfj4qRmZucm5mXmJubmZeZm5qZoaGhnpueoJ+UlZ+hn6GenJucoqSkn52blpGOiYeGhYSFhIODgoF/fHduZmJkaGttcHFsZ2hzgoaEgYCAgYKCgoKCgoKBf318e31/gYSHioyPk5ORj42NjIyMjIyNjYyKgnt5fIGIjY6NjImJi46PjIuKioqKiomKh3xycXV2d3p+f3h1cm9uaWlraWlnZWVjZmt6enl6e3x8fH19fX18fHx8fX19fX19fn5/f39/fn5/f39/f39+fn19fHx9fXx8fHx7e3x8fHx8fHt8fHt6fH19fX19fXx8fHx9fX5+gIB/f4GBgYGAgH9/f39+fn9/gICAfntzaGJgZmlrbG96hJCSjouLkJSTko+Ni42Lh4SBf3F1fYSHiYqJi42MjI6QkZGRkZOUkpGRkpaeqKWRiY2apKWgmpiYm5uZl5ianJuhoaGWkZugoZuZnpygn56dm56ho6KfnpuXkYyJiIeFhISCgoGAf356dXBsZ2JjaGxvcm5oZW99goB/gICBgoKCgoKCgoF/fn19foCChYeKjI+Tk5GPjY2MjIyMjI2NjImBenh9gomOj42MiYmMjo+Mi4qKiouLi4qEd3FzdnV1d3ZzcGtqaGhmZ2hoaGZlZWNlaXp6eXt7fHx8e3t9fXx8fHx9fX19fn5+fn9/gICAgICAf39/f35+fX19fX19fHx8fHt7e3t7e3t7e3x8e3p7fHx9fX19fHx8fH5+fn9/f39/gYGBgYB/fn5/f4CAfn6AgH99eXJnYl9jZWdpbnqFkZKMi4yQlJOSkI2LjYuIhIOAbW1zfYaJiomLjIuMjpGRkZGRk5SUkpKQk5ump5GKjqGqqaOcl5ianJuZmJuenqGhnpCQnJ6fnpudm5+enp2cnqGjoqCem5eRjImHhoWEhIKCgH5+e3hzc3JuY15kam9zcGllbHh+fH1/f4GCgoKCgoKCgX9/fX6AgIKFiIqMj5OTkY+OjYyMjIyMjY2Nh4B6eH2Di46PjYyJiYyPj4yLiouLi4uKiYJ2cHV2dXFybmtpZ2ZmZ2ZoaWhoaWhlZGRnenp5ent8fX18fH19fHx8fH19fX19fX9/f3+BgYCAgICAgICAf39+fn19fn59fXx8fHx7e3t7enp7e3t7e3x9fX19fX19fXx9f39/gICAgICAgICAgX9+fn1+fn5/f39/fHt3bmZhYWNlaGlueoeSkoyJjpGUlpOQjYuMjIeEg4Jyamx4goeJioyMi4uPkpOTkpOTlZWSkpGTmqKlkYqYq66qpZ2Xl5qcnJuZm52en6CelZicnJyZmJqcn52fn5ycoKOhnpybl5GNiIeGhYSDgoGAf357dnR3endqX15ja3BvamZrdXl6e35/gIKCgoODg4OBgH9+f4GBg4WHioyQlJORjo2NjIyMjIyNjYyGfnl5foWLj4+Mi4mKjY+OjIuKi4uMjIuHfnRzdnRxbmpmZGNkZWdoamxtbm1ta2dnZWZ6enl6e3x9fXx8fX18fHx8fX19fX19f39/f4CAgICAgICAgIB/f39+fX1+fn19fX18fHx8e3t7e3t7fHx8fH19fX19fX19fH5/f4CAgICAgICAgICAf35+fX5+fn9/f399e3NpZWRjZWVnZmx7iZGPjImPkpSXlJKPjIyMiYaEgnZsbXd+hIiIjIyLi4+Sk5OUk5OVlZOSkZKXn6OTjqatqaWjnJeXmp2cm5ucnZ6enZqdnpyampiYmZyenZ2dm5ufop+dm5iVkIyIh4aGhIODgH9+fHl3d3x/fnNmX19nbG5qZmx5fHx8fn+BgoKCg4ODg4GAf3+AgYKDhYeKjJCUk5GOjY2MjIyMjI2Ni4V+eXt/hoyQj4yLioqNj46Ni4qMjIyMioV5dXRzb2toZWRjZWdna29zdHZ2cW5qamlpaXp6eXp7fH19fX19fXx8fHx9fX19fX1/f39/f3+AgICAgICAgH9/f359fX5+fX19fX19fX17e3t7e3t8fHx8fX19fX19fX18fn9/gICAgICAgICAgH9+fn59fn5+f39/f3x2bWZlZ2VlZWZnbnyJkY6Li5CSlJeWk5GOjI2Kh4aDe3JxdnyCiImLjIyNkJKTk5WTk5SUk5KRkpWboZeeq6mjoZ+amZibnZycnJydnJ2al6Gfm5mam5qZnJycmpubmZyenpuZlZKOi4mHhoaEg4SAfnx6dnd6f4B/eGxiXmFpbWpmbXl/gH9/f4CCgoKDg4ODgYB/f4CBgoOFiIqMkJSTkY6NjYyMjIyMjY2LhX55e4CHjZCPjIuKi46Pjo2LioyMjIyJgXRzc21qZ2RkZGRnam1zd3t8fn52cGtta21tenp5ent8fX1+fn19fHx8fH19fX19fX9/f39/f4CAgICAgICAf39/fn19fn59fX5+fX19fXt7fHx7e319fHx9fX19fX19fXx+f3+AgICAgICAgICAf35+fn1+fn5/f39/enJnY2ZoZmRlZWdvfYmRjYmMkZOUl5eVlJCNjYqJhoR/dnR1fYOJiouNjo+RlJWUlZSTlJSVkpKTlJmgn6urpJ+dm5mYmJuenZ2cnZycnJWbpJ+bmpucm5mam5mXmZmZm52dm5eUkI2LioeGhoSDg4B8enh2eX1/gH95cWReXmdta2dsd3+AgYCAgIKCgoODg4OBgH9/gIGCg4eKioyQlJORjo2NjIyMjIyNjYqEfnl8gIeNkI+Mi4uMj4+OjYuKjIyNjYh+cXNwamZlZWhlZmludHp9gIKEgnpybW1tcHF7e3p7e319fX5+fX19fX19fHx8fn5+fn5+fn1+gIB/f4CAgICAgIB+fn5+fn5+fn5+fn17fHx8fHt7fHx8fH19fX19fX19fX1/f4CAgICAgICAgIB/f39/fn5+fn5+f354cGViZWhkZGVkZ3B7iY+MiYyRk5WYlpWUkY+NjIqJhoB6dHR6g4qLjY2OkJKTlJaVlJOUlZSUk5OUl56mrKifnJmbm5mZnJ6enpydm5uclaKmpKCdnZ2cmpqZlpWZmJianJuZl5KOjIuJh4aFhIODgHx5eHh7f4B/f3x2aWFdY2xta210fICCgoGBgYODg4ODg4KBf39/gYOEh4mKjZGTk5KPjo2Mi4yMjI2NioJ8enuAh42Qj42Mi42Pj46NjIuMjIyMhXdubWlnZGZnamlscXeAgoWChIaCenJtbnB0dnt7e3t7fX19fn59fX19fX18fHx+fn5+fn5+fX+AgICAgICAgICAgH5/f35+fn5+fn5+fXt8fHx8e3t8fHt7fHx9fX19fX19fX9/gICAgICAgYGAgH9/f39+fn5+fn5+fXVrZWJlZ2RkZGRocX6LjYqJjZGTlpiWlZSUkI+Oi4qIhH52dXqEjY+Ojo+QkpOUlpWUk5OUlZaUk5SVnKeoopyYlpmZmJibnp2enJyam5uYpKakoaCfnZyZmZiVlZiYmJudm5mWkY6MiomGhYWEg4OBfnx8fX5/gICAfntwZ15faW1ub3F4fICDg4OBg4ODg4ODg4GAgICBg4WHiYqNkJOTk5COjYyLjIyMjY2Jgnx7e4KIjpGPjYyLjZCPjo2MjIyMjIt/cm1raGdnZ2pucHd+hImJiIWFhoB2bmxxdHp9e3t7e3t9fX1+fn19fX1+fn5+fH5+fn5+fn5+gICAgICAgICAgICAfn9/fn5+fn5+fn59e3x8fHx7e3t7e3t8fH19fX19fX19f3+AgICAgICAgICAf39/f35+fn5+fnx5cWdlZWVnZmZjY2lygI2MiYqPkJOXmZeWlZaSkZCOjImGgHZ0eoSPkpCOj5GSk5SWlpWRkZGUlpSUlZaZoqOemJSUl5aWl5qdnZ6dm5qbm52kpKKfnZ2cm5qZmJWVmZiYmp2amJSQjIuJiIaFhIODg4KAfn5+gICAgIGAfHdvY15lbHFxb3J2fIKDgoKDg4ODhISDgYGBgYKDhYeJio2PkpOTkI6NjIuMjIyNjYiBfHt7g4mOkY+NjIuOj4+OjYyMjIyLh3lva2lqamxrb3R5gYiNj4yJhoaGfnJtbXN6gIR7e3t7e319fX5+fX19fX9/fn58fn5+fn5+fn+AgICBgYCAgICAgIB+f39+fn5+fn5+fn17fHx8fHt7enp6ent7fX19fX19fX1/f4CAgICAgH5+gIB/f39/fn5+fn5+e3duZGVnZ2dnaGNjaXKAi4uJi5CQlJiZl5aWlpOQkY6Oi4aAdnV6hI6Sko+QkpKTlJaVlJGRkJOVlZSUlZabnZyXkZOXlpaXmp2enpyamZqaoKOjn52am5qZmpmYlZWZmpmZm5mYk46LiomHhYSEgoOCgX98fX+AgYCAgYB+e3VpYGRrcXFvbnR7goKBgYODg4OFhYOBgYGBgoOGh4mKjY+Sk5OQjo2Mi4yMjI2NiIF8e3qDio6Rj42MjI6Pj46NjIyNjYuFdW1qZ2tsbW9zeYGIjpKQjYmGhoR9cW9wd3yDhnx8e3x8fX1+f399fX19fn5+fn1+fX5+fn1+f4CBgYGBgYGBgYCAgX9+fn5+fn59fX19fHp8fHx8fHx7e3p7fHx8fH19fH1+fn1/f39/f4CAf3+AgICAgIB+fX19fX15dGlkZmdpampoYmJqc36IiIeMj5GUl5iYl5iYlpSQj5CMiIR7eHyEj5ORkJCRkpOTk5WUkY+OkJOVlZWVk5eZm5eRlJSUlZaanZ6fm5iVm5qioqKem5eXl5iamZiXlpiZmJmYlpaTj4uJiYiFhYSDgoF+fXx9gIKAgYCBgH9+eW9hZWpvb2pnbnmDgoB+gYOEgoSEgoKAgYKChIaGiIuMjZGSkpCOjYyLjY2NjYuHgHp6foOJj5GPjYyLj5CQj4yMjI2Nin9vaWZobHBwdHuDipCRkpGNiYeHg3pxbnJ4foSFe3t7fHx9fX5+fn19fX1+fn5+f39+f35+fX9/gIGBgYGBgYGBgICBf39/f39/f35+fX18ent7e3t7e3t7ent7e3x8fHx8fX5+fn+AgICAgIB/f39/f39/f359fX19fXhvZmNmZ2pra2hiYmpzf4WFhoyPkZSXmJiYmZmXlpCOj4yJh355fYSOkpGQkJGSk5OTlZOQj42PkpSVlZSTlZWZlpOUlJSVlpmcn52al5WanKGgn5uZlpaWl5iXmJiWl5eWmJaVlJKOiYmJh4aFhIOCgH18e3x/gYCBgYGBgYB9eG5sbW5uaWJpeIOEgH6Bg4OChISCgoGBgoOFhoeJioyNkZKSkI6NjIuNjY2NioV+e3p+hYuPkY+NjIuQkZCPjIyMjY2IeGllZ2pvdHZ8hYyOkZKSkY2Jh4eCeHFuc3l/hYZ6enp7fH19fn5+fX19fX5+fn5/f39/f39+gH+AgYGBgYGBgYGAgIF/gICAgICAf399fXx6e3t7e3p6enp7fHx8fHx8fHx9fn5/gIGBgYGAgH9/fn5+fn5+fn19fXx7dGlkY2Zpa2xrZ2JiaXR/hIWGjpGTlpiamJiampiWkI6Oi4qJgXp+ho2RkZCRkZKTk5KTk4+OjI6QkpWVk5KSlJiXlZSUlJWWmJudm5iVlZibnp2cm5mWlZWWl5eYmJaVlpaXlZWUkY2JiYiHhoWEg4KAfXt6e32AgIGBgYGBgn9+eHNxcHFtZWl2g4aDgIKEhIOEhIKCgYGDg4WGh4mKi42RkpGPjo2Mi42NjYyJhX18e3+Gi5CRj42Mi5CQj4+MjIyNi4FxZmVoa3N4fIOLj5GRkpKRjYmHhn91cHBze4GFh3p6eXt8fX1+fX19fX19fn5+fn5+fX1/f3+Af4CBgYGBgYGBgYCAgX+AgICAgIB/f319fHp8fHp6enp5eXt7e3t6ent7fH1+fn+Af3+BgYCAf39+fn5+fn5+fX19e3hvZGFjZmlsbmtnYmJodX6EhYiPkpSWmZqampqZl5aQjo6KiomDfH6GjZGRkJGSlJOSkZGRj4yLjY6QlJSTkpOUlpaUlJOUlZaYm5uZlZOTlZmbm5ybmZaVlZWXl5iYlpWVlpaVlZWQjYmIiIeGhYODgX98e3p7fH+AgYGBgoKCgX98eHR1dXNrbHWChoSCg4ODg4SEgoKBgoOEhYaIioqLjZGSkI+OjYyLjY2NjImDfHx8gYeMkJGPjYyLkJCOj4yMjI6KfG1mZ2lsdnuCiYyQkpOSkpGNiYeGfHJvcHR8goWHe3t7e31+fX5+fn5+fn5+fn9/f39+fn1+f3+AgYCAgICBgYGBgICAgICAgICAgH9/fn59fH19e3p6enl5eXl6ent7e3t8fH19fn5+fn9/gICAgH19fXx8fH19fX17dmpiYWRnbHBvbWliY2t1f4OEiZKUlZaZm5qampmXlZGOjYuJh4N+f4WNkJCPj5GSk5CQjoyLi4qMjI+SlJOTkpKVlZOTk5SVl5eamJeVkpKTlZqbmpqZmZeVlZeXmJiXl5eWlZSVk5GNiYiIhoaFhIOAfnx7eXt7fYCCgoKDg4KBgH18e3p6eXNwdn6FhoOBgIGChISDg4KChISFhoaIiouOkJKQj46MjIyMjY2Mh4F8e3yCh42PkY+NjIyRkI+OjIyNjIl2aGVqbXF5g4mPkJGTk5ORkY2JiIR6cXByeICEh4d8fHx8fH19fn5+fn5+fn19fn5+fn5+fX5/f4CBgICAgIGBgYGAgICAgICAgICAf39/f319fX18enp6e3t5eXt7e3t7e3t7e3x+fn5+fn5/f39/fn5+fHx8fX19fHdwZ2RhZWltcnBuaWJjanN9goSJlJWVlpmbmpqamZaUkI+Oi4eEgX+AgouPjo2NjpKSj4+MiYeGhYaIi46RkpKSkpSUk5OTlZmbmpeWlJORkpOVmJiXmZqbmJaWl5eZmZiZmpeVlJWTkIyJiIiGhoWEgoB+fHp6ent8gIKDg4ODgoGAfn9/f39/e3d5eoOGgnt5fIGEhIODgoOEhIaGhoiKi46QkJCOjYyMjIyNjYyGgHx6fIKIjpCRj46NjpGQj46MjI2MhHJnaG1vdoCJjpGRk5OTk5GQjIiGg3hwcHJ6goWJiHx8fX17fH1+fn5+fn5+fX1+fn5+fn59fn9/gIGAgICAgYGBgYCAgICAgICAgIB/f39/fX19fXx6enp7e3t7e3t8fHt7e3t6fH5+fn59fX19fn5/f39+fX19fX16c2tlZGNlam9zcW5nYmNpcnyBhImUlpaXmZuampmXlZKPjo6MhX57f3+CiI2Pjo2OkJGOjYqGg4GBgoWIjY+QkJGRk5OTk5SWnaGflpOUkpGTk5aXmJiXmp6amJeYmZqampydmJWTlJOPjImIh4aGhYKBf358e3p7e3yAgoODg4OCgoF/gICBgYGBgHx4f4WBeXd4gISEhISDg4SFhoaGiIqLjZCQkI6NjIyMjI2Ni4WAfHt8goiOkZGPjo2PkJCPjoyMjYt8bWZpbnF6ho6RkZKTk5OTkY6Kh4WAdnBxc3uDh4mJfX19fXt8fn5+fn5+fn58fH19fX1+fn9+f3+AgYCAgICBgYGBgICAgICAgICAgH9/f399fX19fHp6enx8e3t7e3x8e3t8fHt+fn5+fn19fHx+fn9/f35+fn19fHpxaGRkZGRrcHNybmZiY2lyfIGFiZSYlpiZm5qamZeUkY6Oj42Fe3d9fYOIjo2MjIyOj42LiIWAfn+Ag4WLjo+PkZCRkZKTlJmhpp+Xk5OSkpOUmJiYmJaZnZyZmJmanJqcnpyXlJOUko+LiIiHhoaEgoF/fnx7eXt7fICCg4ODg4KBgICAgYCDgoSEfnd7g4B4dnmBhISFhYODhYWGhoaIiouNkJCQjo2MjIyMjY2KhYB8e3yDiI6RkY+PjpGQkI+OjIyNh3VoZGlvc36KkJKSkpOTkpORjYqHhX5zcHN1fYOIiop9fX19fH1+fn5+fn59fXx8fX18fH5+f39/f4CBgYGBgYCAgYGAgICAgICAgICAgIB/fn59fXt7e3t5enp6ent7fHx8fHt7e3x+fn5+fn59fXx9gICAgH9/fXx6dWxlZGVkaG5yc3FsZmFka3d+g4WJlZiXmZubm5uXlZOPjY2NjId4b3d8goaOjYuMjY2NjImHhIB+e3x/g4mLjY2PkJGRkZSWnKarpZiTkZCRk5WXmJeXl5ibm5mZmpybm5yem5iUlJSSjYmHh4eFhYWDgn9+fHx6e3x9gIKDg4ODgYKBgYGBgYOChoaAeHuCf3p6fIKFhYSEg4OFhYaGh4mJi42PkI+OjY2NjIyNjIuEf318f4SJj5GRkJCPkpKQj42MjoyAbmRla250go6Sk5OTk5SUk5GMiIaFfHJucXeAh4mJiX5+fn59fX5+fn5+fn19fHx9fX19fn5/f39/f4CBgYGBgICBgYCAgICAgICAgICAgH9+fn18e3t7e3l6enp6e3t8fHx8e3t7fH19fX1+f319e32AgH9/fX19e3lxaGNkZmZpcHR0cWxnZGZteYCEhYmVmJiam5ubmpeVko6Mi4uLinlqcXl/gYmKiImLi4uLiYiEgH17fH+Dh4mLjY+QkJGSl52kqq2lmZSRkJGTlZeXlpaWl5qamZmanJybnJ2al5STkpGMiIeHh4WFhYOCf359fXx8fH2AgoODg4OBgoKBgYGCg4SIh4N7foOAfH1/hIWFhISDg4WFhoaHiYmLjY+Qj46NjY2MjI2MioR/fX2AhIuQkZGRkJCSkpCPjYyNh3lrZmdrbnmJkJOUk5SUlZWUkYyIhoR4cG9yeYKIiYqKfn5+fn5+fn5+fn5+fX18fHx8fHx9fX9+f39/gIGBgYGAgIGBgICAgICAgICAgICAf35+fXx7e3t7eXp6enp7e3x8fHx7e3t8fX19fX19fX18fX5+f399fX17dmxkY2VnaGxxdHRwa2hnaG97hIWGi5WYmZubm5qZmJWSjoyLioqKe2dqdn19gIGCgoaIioqKh4SAfHt8f4OGiYqMjo+QkZSbpaqsqqOblZKSkZKVlpeVlZWWmZmZmZqcm5qbnJuYlJORkIuIh4eHhYWFg4J/fn19fX19foCCg4ODg4GCgoGCgoOEhomIhX+Bgn97f4GEhYWEhIODhYWGhoaIiYuNj5CPjo2NjYyMjYyJg39+foGFi5CRkZGQkJKSkI+NjYuBc2poaWtxfo+Rk5STlJSVlZSRjIiHgXVvcXV6g4iJiop+fn5+f39+fn5+fn59fX19fHx9fX19f39/f35/gYGBgYCAgYGAgICAgICAgICAgIB/f359fXx7e3t5enp6ent7fHx8fHt7e3x8fHx8fHx9fX5+fX1+fn5+fXpzaGNkZmZqbnF1dG9saGdqcn2Gh4eLlZiZm5ycmpiXlZKOi4qKiol8ZmVzenh5enx+goWHiYiHhYF8e3x/g4WJiouOj4+QlJ6prKumop2UkJGPkZSVlpSUlJWZmZmZmpybmZqbmpiUk5CPioeHh4eFhYWDgn9+fn59fX1+gIKDg4ODgYKCgYODg4WHiImFgoKCfXp+f4KFhYSEg4OFhYaGhYeJi4yPkI+OjY2NjIyNjImDgH9/gYWMkJGRkZCQkpKQj46Ni35taWprbnaCkJOTlJSUlJWVlJGMiIZ9dXBxdnuFiImLi39/f39+fn5+fn5+fnx8fXx8fHx8fH5/f39/f4CAgIGBgICBgYCAgICBgYGBgICAgH5+fXx9fHt7e3p7e3t7enp7e3t7e3t8fHp6fHx9fX5+f35+fn9/fn18dm1kYWVoam1wdXdzbmpnaGtzfoeIh42WmZmcnJuamJeVk4+NiomJioBqYW13dnh3eHx/g4aHhoaFgn99foGChoiJi42OkI6SnqmrpqOfmpWPj42OkZOVlJKRlJiZl5mbnZqXmJmXlZOSj42Jh4eHiIeGhIOBf39+fn19fn+Bg4ODg4OBgYKBgYKEhYeIh4SCg4B6eXx+goSEg4ODg4SGhYWFiImKjI+Pjo6NjY2MjI2MiIN/f4CCh42QkpGRkZGRkY+OjIuGemtqamxxeomRlJSTlJWVlZWTj4qHhnxzcHN4f4WJioqMf39/f35+fn5+fn5+fHx9fHx8fHx8fn9/f39/gICAgICAgIGBgICAgIGBgYGAgICAf35+fX18fHx7ent7e3t6ent7e3t7e3x8e3t8fH19fn5/f39/f39+fXpxaGJhZmltb3N3eHJsaWdobXaAiIiHjZWYmJucm5qXlpWTj4uHh4iKg25gaXN1dnd5e36DhoaFhoWDgoCBgoKFh4mLjY2PjpGZoqajoZyZk46Ni4uOkZOSj5CSlpiWmZucmZWWlpWTkZCOjImHh4eHh4aEg4F/f39/fn5+f4GDg4ODg4GBgoGBgoOFhoaFhIOFf3Z1eX2BhISDg4ODhIaFhYaIiYqMj4+Ojo2NjY2NjYyIg4CAgIOJjpGSkZGRkZGRj46NiYFzamtrbXR/jJOTk5KUlZWVlZOPioeEenJxdHmAhoqKiox/f39/fn5+fn5+fn5+fn18fHx8fH5/gIB/f3+AgICAgICAgYGAgICAgYGBgYCAgICAf359fXx8fHt6e3t7e3p6e3t7e3t7fHx9fXx8fX19fn9/f35/f359eG5lYGNnam1ydXh3cWxoZ2pyeoOLiYaMlZiXmpybmpiXlpSPh4OFiIeCcGBkcXZ3d3h8f4KEhYSFhISEgoODgoSGiIqMjY+OkJSan52dmpeTjoqIiYuOkJCNjpCUlZaYm5qYlZSUk5GPjo2LiIeHhoeHhoSDgX9/f39/f3+AgYODg4ODgoKCgYGCgoSGhoWEg4N9dHN3fIGEhIODg4OEhoeHhoiJioyPj46OjY2Njo6NjIiDgYGBhImOkZGRkZGRkZGPjoyHfG1ra2xvd4KNlJOTkpSVlZWVk4+JhoN4cXJ1eoGHioqKjH9/f39+fn5+fn5+fn5+fXx8fHx8fn9/f39/f4CAgH9/gICBgYCAgICBgYGBgICAgICAf359fH19e3p7e3t7enp7e3t7e3t8fHx8fHx9fX1+f39+fX9/fn12a2JgZGhrbnR3eXdxbGhpbXV8hY2JhYuUl5eanJuamJaVk4+FgISHhIFzYmBudXZ3eHt+goOFhISEg4OCg4OEg4WHiYuMjo6PkJaZmpqXlpKNiYeHiYyNjYuMj5KUlZibmZeVk5KQjo2NjIqIiIeGhoaGhIOBf3+AgH9/f4CBg4ODg4ODg4KBgYKCg4SEhISDgntzcnd9gYSEg4ODg4SGh4eGiImKjI6Pjo6NjY2Ojo2MiIOBgYGDio6RkpGRkZGRkY+OioZ2ampsbXF7hpCUk5OUlJWVlZWTj4mGgXZyc3Z8gYiKioqMf39/f35+fn18fHx7fX18fH19fHx8fX5+f39/f39/f39/f39/gICAgICAgYGBgYCAf39+fn18fX17e3p8fHt6enp6e3t7fH19fX19fX19fH1+fn19f359e3NpYmFnam1yeHl8d3FsaWhudHuGjouHiZCVl5mdnZqYlpWTkIiFg4OBf3ZlYGx0dnd5fX+Bg4WEhYSEhIODg4ODg4SGiYqNjo+Qk5WXmJeUk42JhIWGiYyLioqNkJSTl5mZlpOTko+NjIyKiYeHiIeGhoaFg4KAf39/fn5/gIKCg4OEhIODg4KBgYODhISFhISBenRwdXuAg4ODgoSEhYaGhoaJi4uMjo6Ojo2NjY2OjouGg4KCg4eMkJKSkpKSkpGPjo6JgnJqbm1udoCMk5SUlJWVlZWVlZKNiYV9dXJzdnyEiYqKiop/f39/fn5+fX19fHt9fXx8fX18fHx9fn5/f39/f39/f39/f39/f4CAgIB/f39/fn5+fn5+fXx8fHt7enx8e3p6e3t7e3t8fX19fX19fX18fX5/fn5/fnp4cGZgY2hrbXR5enp0b2xoaG51e4WOi4aIjpOWmJucmpeVlJORi4iCgYF9d2hebXd6fH1/gIGDhISFhISEg4ODg4ODhIaJiouNjo+Qk5WWlZOSjYiDgoSHioqKiouNkpGVlpeVkpKQjoyMjIqJh4eIiIaGhoaEg4B/f4B+fn+AgoKDg4SEg4ODg4KBg4ODhISDg4F7c2tsdHyCgoGChISFhoaGh4qNjYyOjo6OjY2NjY6NiYaDg4OEiY6QkpKSkpKSkY+OjYh7b2pubnB4g42Uk5SUlZWVlZWVko2JhHpzcnR4foaKi4uKioCAf39+fn59fX19fXx8fHx9fXx8fH1+fn9/f39/f39/f39/f4CAgICAgH9/f39+fn19fn59fHx8e3t6fHt6enp7e3t7e3x8fH19fX19fXx9fn+AgH9/e3RsY2BlaWpwdnl6eXRtaWhrb3d7hY2LhYeNkpWYmZqZlpWUk5KNioKCgX14al9tfX9+f4CBgYODhYWEhISDg4ODg4OEhoeJi4yNjo6Qk5STk5GMiIOCg4WIiouJiouPj5OUlZSRkI+MiouLiYiHh4iIh4eHhoSDgX9/gH9/f4CCgoODg4ODg4ODg4ODg4OEhIODgXx0a2RqdoGDgoKEhIWFhoaJi46OjI6Ojo6NjY2NjouIhYKDg4WKjpGSkpKSkpKRj4+Nhndsa25vcnuHkJWUlJSVlZWVlZWSjYiEeHFydnmAh4qLi4yMgYF/f35+fn19fX19e3t8fH19fHx8fX5+f39/f39/f39/f39/f3+AgICAf39/f35+fX1+fn18e3t7e3p8e3l6ent7e3t7fHt7fX19fX19fH1+f39/f396cmljYWZqbHR5eXp4c2xoZ2xydHuGjYqFh4ySlJeYmZeUlJSUko2KhYWCf3ttYWx+gYCBgYGBg4OGhYSEhIODg4ODg4SGhoeKi4yMjY6Rk5KSkIyIg4GChIaJi4qKioyNkJKTkpCPjYqJioqJh4eHiIiHh4eHhISBgH+Af39/gIKCg4OCgoODg4ODg4ODg4SEg4KAfXVrYWNygISEhIOEhYWGhomLjo6Mjo6Ojo2NjY2OjIiDgYKEh4yPkpKSkpKSkpGPkIyDdGtsbnB1fYiRlpSUlJWVlZWVlZKNiIR3cXN2e4GIioyLjIyAgH9/fn5+fn5+fHx7e3t7fHx8fHx8fHx9f39/f39/f39/f39+fn9/f39/f39/fn58fH5+fH18fHx8e3x6eXt7e3t7e3x8e3t8fHx9fX19fX5/fn9+fnpxaGJkaWxvdnt7fHl0bWhnbXV4e4WNioWFiZCSlZmYlZSTk5OSjouHhoN/fXBgan+BgYCBgYKCg4OFhYODg4ODg4ODhYaHiIqKioqMjY+QkZGQjIeDgoKChImKiomJiouOkJGRkI2LiYmHiIiIh4eIiIeHh4eFhYKBgH9/gH+BgoODg4ODg4ODg4ODg4OCgoODg395dGxhXGp8gYODg4SFhoaGiYuMjo2NjI6Ojo2NjY2LhoKCg4aJjZGSkpKSkpGSkpGPioBwamtvc3mCjJKUlJSUlJSVlZaUk46IgnZxc3d9gomLi42NjYCAf39+fn5+fX19fHt7e3t8fHx8fHx8fH1+fn5+fn5+f39/f35+fn5/f39/f39+fnx8fX18fX19fX18fHt7e3t8fHt8fHx7e3t7e3x9fX19fn5+f359d21kYmZqbXF4e3x8eXVvampucnJ1go6LhoWJjZGUl5aUkpGSkpKPjIiFhIJ/c2FmfYOCgIKCgoKDg4ODg4OEhISEg4OEhoaIiomKiouMjo+QkI6KhYOCgoKDhoiIiImJiYqNjY6Ni4mHiIeIiIiHh4iIiIiIiIeFg4KBgH9/gIKDg4ODg4ODg4ODg4ODg4GBgoOCfHZwamJWWnKAgYKDhIWGhoaJi4uMjY2Mjo6OjY2NjYqEgoKEhomOkZKSkpKSkZKSkZCKe29ra290e4SPk5WVlJSUlJWVlpSSjoiBdnJzd36DiYuLjY2NgIB/f35+fn58fH18e3t7e3t7fHx8fHx8fH1+fn5+fn5/f39/fn5+fn9/f39/f35+fn59fXx9fX19fXx8e3t7e3x8fHx8fHt7e3t7fH19fX1+fn5/f313bGJiZ2puc3h7fXt5dXFsbG5ua25+jo2GhYiLj5KVlJGQkJCRkZCNiIWGhIB2ZGV7hISCg4OEhISEg4OFhYWFhISDg4OFhoeJiYmKi4uNjpCPjImFg4KCgYKDhoeIiIiHiYqLioqJh4aGh4iIiIeHiIiIiIiIh4aEg4GAf3+AgoODg4ODg4ODg4ODg4ODgoGCg4F8dnBrYlJRaXyAgoSEhYaGhoiKiouNjYyOjo6NjY6MiIOCg4WGio+RkpKSkpKRkpKRkId2bm1tcHR9hpCUlZSUlJSUlZWWlJKOiH91cnN4foSJjIuNjY2AgH9/fn5+fnx8fXx7e3t7enp8fHx8fHx8fX19fX19fX9/f39+foCAf39/f39/fn5+fn5+fH18fHx8fHx8fHt7e3x8fHx8e3t8fHx9fX19fX5+fn9/fnZrYGNoaW90en19enl1cm5ub2pna3+OjoaFhoyPkpOTkI+PkJCRkY6Jh4aFgnloZnqEhYOEhISEhISEhIaGhYWEhIODg4SGh4mJiYqKioyOkI+MiYWDgoKBgoOEhoeIh4aIiYmJiIeFhIWHiIiIh4eIiIiIiIiHhoWEgYCAgIGDg4ODg4ODg4ODg4ODg4OCgYKCgn96dG5lUUxgd36ChYaGhoaGh4mLjI2NjI6Ojo2NjouHg4KDhYeMj5GSkpKSkpGSkpGOhHNubW5yd36IkZSVlJSUlJSVlZaUko6IfnRxc3h/hYqMi42NjYCAf39+fnx+fn5+e3t7e3t7e3x8fHx8fHx9fX1+fn5+f39/f39/f39/f39/fn5+fn9/fn59fnx8fX18fH19fHx8fHx8e3t7e3x8fHx8fH19fn5/f358dmtkZmlqb3V7fX18enZzcHBtZGFpgZCPh4OFi46QkpGOjo+QkJCSjomIh4WCempld4SHhYSEhISFhYWFhoaFhYWFhISDhYaHiIiIiYqKi42Pj4yIhIKCgYCBg4OEhYaGh4mIiIaGhYSEhYeIiYmIiIeHiIiIiImHhoaEgoCAgoODg4ODg4ODg4KCgYKDgoOCg4OCgX11bWJNSllwfoCDhYaGhoaHiImLjIyLjY2Njo6OioeDg4SGiY2QkpKSkpKSkZKSko1/cGxtb3N6gYqSlZWUlZWVlZaWlpORjId8c3J0eoCHiouLjI2NgIB/f35+fH19fX17e3t7e3t7fHx8fHx8fH19fX5+fn5/f39/f39/f39/f39/f35+f39+fn5+fHx9fX19fX18fHx8fHx7e3t7fHx8fH19fX1+fn9/fnt2bGZoamxvdnx+e3t6dnNxcGtgXWqDkZCHg4aMjpCRjo2Njo6PkJKPiomGhIF6a2R1hIiHhISFhYeHh4eHh4eHh4eEhISFh4eIiIiJioqLjI6Pi4iEgoKBgICBgYKEhoaIiYiIhoSDhISGiYmJiIiIh4eHh4eHiYiGhoWEgoKDg4ODg4ODg4SBgH9/gYKCg4ODg4ODfnVrYFtdbHmAgoOFhoaGhoeIiYuMjIuNjY2Ojo2KhoODhIeKjpGSkpKSkpKSk5GQh3hubG9wdXuDi5OVlZSVlZWVlpaWk5CLhXpzc3V7g4eKi42Njo5/f35+fn59fH18e3x7e3t7e3t8fHx8fHx8fX19fn5+fn9/f39/f39/f39/f4CAf39/f35+fX18fH19fX19fXx8fHx8fHt7e3t8fHx8fH19fX5+f399e3ZtZ2lrbHJ3fX57e3l3dHJwaF5ebIORkIeDhoyPkZCMjIuMjY6PkpCNioeEgXtsYnKDioeGhoeHh4eHh4iIh4eHh4aGhYWHh4iIiImKioqKjI6MiISCgoGAf4CAgoSGhoeIiIiGhIOEhoiJiYmHiIiHh4eHh4eHh4aGhYSEhISEhISDg4ODgn97eXh8gIKDg4KCgoF/eXBqa3F5foKEg4WGhoaGh4iJi4yMi42NjY6OjIiEg4OEh4qOkZKSkpKSkpKTko6Dc21tcHF2fYWNk5WVlJWVlZWWlpaTj4qEeHNzdnyEh4uMjY2Ojn5+fX1+fn58e3t7fXt7e3t7e3x8fHx8fHx9fX1+fn5+f39/f39/f39/f39/gICAgH9/fn58fHx8fn59fX19fHx8fHx8e3t7e3x8fHx9fX19fX1+fn16dm5pamxtdHl9fnx8e3p2dHBlXF9ug5GQh4OHjZCSkI2NioyMjo6SkI2Kh4SAeG9jb4OLiIiHiYmJiYmJioqJiYmJhoaFhoeHiIiIiYqKiYqLjoyJhIOCgYB+f3+Cg4aGhoeIiIaEhIaIioqJiIeIiIeHhoaGhoaGhoaFg4WFhYWFhYODg4OBfHRwcniAgoODgYGBf356eHV1eH5/goKDhYaGhoaHiImLjIyLjY2Njo6Lh4SDg4SHi4+SkpKSkpKSk5STjIFwbXBwc3mAho+TlZWUlZWVlZaWlpOPiYN4c3N2fIWKi4yOjo+Pf39+fn5+fXx8fHt7e3t7e3t7fHx7e3t7fH19fX19fX19fX9/f39/f39/f39/f39/f39+fn19fX19fX19fX18fHx8fHx7e3x8e3t9fXx9fHx9fX5+fHp0b2ptbG92e35+fn18endzbWVdX26FkJCGhIeNkJGPjYuKi4yMjpORjYiFgn11cGZpgYqKiIiJiYmJiIiKiomJiIiGhoWFh4eHh4eHiYmKiouNjIqGhIKBgH+AgICDhIaGh4eHhoWGh4mKiIeIhoaIh4eGhoaGhYWFhoeGhYWEhISEhISEhH92bGVpc3uAg4OCgoB+fHx8fXp8f4GBgoSGhYWGhoeIiIuMjIyMjY2NjIuGg4ODhYeKjpGSkpKSkpKSlJKNfG5tb3BzeoKJkpOUlZSVlZWWlpaWk4+KgXVxc3Z8hoqMjY6Oj49/f35+fn59fHx7ent7e3t7e3t8fHt7e3t8fX19fX19fX19fn5/f39/f39/f39/f39+fn5+fX19fX19fX19fXx8fHx8fHt7fHx7e3x8e318fH19fn58eXRwbG5ucnh8fn+Afn16eHNpX1phcISOjoaEhoyQkY2Mi4qKi4yOk5KNh4WBeXFtY2R/iIuJiomJiYmIiImJiIiJiYaGhYWHh4aGh4eJiYmKi42Mi4eEg4OBf39/f4KEhoaHh4eGhoeIioqHh4aFhYeGhoaGhoaFhYWGhoaFhYSEhISEhIWDfXJmX2VueH6BgYGBgX56enx+e3x+gYKDhYaFhYaGh4iIi4yMjIyNjY2MioSDg4SFh4qOkZKSkpKSkpKUkIl3bm1ucHR7goqQk5SVlJWVlZaWlpaTjol/c3F0d36Gio2Oj4+Pj39/fn5+fn18e3t6e3t7e3t7e3x8e3t7e3x9fX19fX19fX1+fn9/f39/f39/f39/f35+fX19fX19fX19fX19fHx8fHx8e3t8fHt7e3t6fHx8fX1+fnt5dHBtbm9yeXx+f4B/fXp3cWdaWGV0g4qKhYOGjI+QjYqKioqKi42SkoyHhIF6cWxgZHyGiomKioqKiomJioqJiYmJiIiHh4eHhoaHh4iIiImKjIyLh4WFhIGAgIB/goSGhoeHh4aGh4iKiYeFhISEhYaGhoaGhoWFhYaFhYWFhISEhISEhIJ8cWNeXmdxe39/gIB/fXl4fH57fH6BgYOFhoeHhoaHiIqLjIyMjI2NjIuIg4ODhIaJjI6RkpKSkpKSkpSPhHNtbG5wdnyDipCTlJWUlZWVlpaWlZKMh3xzc3V5gIeLjY6Pj46Of39+fn5+fXx7e3p6e3t7e3t7fHx7e3t7fH19fX19fX19fX19f39/f39/f39/f39/fX18fH19fX19fX19fX18fHx8fHx7e3x8e3t7e3p7fHx8fH19enh0cG5ubnF5fH5/f319enVuZVhYaHSBiYmFgoWLjpCMioiKiYqKjJCQioeEgXx0b2FleIaKiouKioqKiYmJiYiIioqIiIeHh4eGhoeGh4eIiYqMjYuIh4aDg4KBgYCDhIaGh4eHhoeIiYqJhoOCgoOEhYWGhoaGhYWFhoWFhYWEhISEhISDgnxyY15aYmt3fn2AgH57eHd8fn19fYCBg4WGh4eGhoeIioyMjIyMjY2Mi4eCg4OFhomMj5KSkpKSkpKSlIuAcGxtbnB3f4aNkZOUlZSVlZWWlpaUkYuEeXJzdXuCh4uOj5CQj499fX19fHx8fHx8e3t7e3p6e3t7e3t7enp7e319fHx9fXx9fX19fn9/f39/fn5+fn5+fn19fn59fX19fX19fX19fHx7e3p6e3t6enp5eXp8fHp8fHx8eXFtbWxucnl/f36Af356dGxfWVxqc36Hi4aDhImOjYqJiYmJiYuMjo2Jh4WCfnlza2FwgouLi4yMioqKiomJiIiIiImHiIiGhoeHiIqKiImKiouMjIuJiIaEg4KAgoKEhoaHh4eGh4iJiomFgX6AgoOEhIWFhoaGhYaFhISDg4OEhYWFhYSDfHFlXlldZm92fH9+enl5eXt/fn18foKEhIWGh4aHiImLjY2NjY2NjYyKhoSChIWHi46QkZKSkpKSkpORiHtubWxtcXiAh46SlJWVlJWVlZaWlpSPi4R3c3J1fYOJio2Ojo+PjH19fX18fHx8fX18fHt7enp7e3t7e3t7e3x8fHx8fHx8fH19fX1+f39/f39+fn5+fn5+fn5+fn19fX19fX19fX18fHt7e3t7e3t7enl5enx8enp7e3p3b2tramxyeX9/foB/fnhwZVpZXmlye4eKhoKEiY6MiomJiYmJioyNjIiHhYSDf3tzanKAiYqKi4uJiYmJiYmIiIiIiYeIiIaGh4eIioqIiImJiouLjIuJiIWEgoCCgoSGhoeHh4eHiIqKh4F9en2Bg4OCg4KDhIWFhoWEhIODg4SEhISEg4N8cWRdWVtjbHF5fXt6eXd3eX5+fHp9gYSEhYaHh4eIiYuOjY2NjY2Ni4iFgoOFhYiMj5GRkpKSkpKSk4+DdWxtbG5xeIGHjpKVlZWUlZWVlpaWlI+KgnVzcnV+hYqLjY6Pj4yIfX19fXt7fHx9fXx8e3t6ent7e3t7e3x8fHx8fHx8fHx8fX19fX5+fn9/f35+fn5+fn5+fn5+fX19fX19fX19fX19fHx8fHt7fHx6eXl6e3t5eXp7eXVua2tqam94fH5/gH98dWxiWltgZm55hYmFgYSLj46JiIiIiIiJi4uKh4aFhoWCgH15fIGHiYmKioiIiYiJiYiIiIiJh4iIhoaHh4iKiomJiYmKi4uMjIuJiIaEgoKChIaGh4eHh4eIiYmEfnp3eoCCgX5/f4GDhIWGhYSEg4ODhIODg4ODg31yZF1bXGFpcHd6enp5dnZ4fHx7en2BhIWEhoeHh4iJjI+NjY2NjY2Kh4WDg4WHioyPkZGSkpKSkpKSjH9ybW5scHR7gYmPkpWVlZSVlZWWlpaUj4qAdHN0d3+Fi42Njo+OioV9fX19e3t8fH19fHx7e3p6e3t7e3t7fHx9fX19fHx7e3x9fX19fn19f39/fn5+fn5+fn5+fn59fX19fX19fX19fn59fXx8e3t8fHp5eXp6enl5eXp4dG1qaGhqbXd8fn9/fndvaGJcX2FlbHaEiIWBhI2PjomIiIiHh4mKiomHhoiJiIaGhYODg4eJiYqKiIiJh4iIh4eHh4iGh4eGhoeHiImJiYmJiImKi4yMjIqKiIWEgoKEhoaHh4eHh4iJiIR8d3d6f4F+e3t8gIGEhYaFhISDg4OEg4ODg4ODfnNmX15dX2hvdXh4enl2d3d6fH17fYGEhYOGh4eHiImNj42NjY2NjYqHhIOEh4eKjI+RkZKSkpKSkpKLe25tbm1xdXyCipGSlZWVlJWVlZaWlpSPiX52dHV5f4aKjo2Ojo2IgX17e3t7e3t5e3t7e3t7enp6enp6fHx7e319fX19fXp6fX19fX19fX1+fn5+fn5+fn5+fn59fX19fX19fX1+fn5+fn19fHx8fH19e3p5e3p5d3Z4eXdzbGdnZ2htdXt/f356cWpmY2FkY2Joc4OIhoGEjpKNiYiIhoaGh4qJh4iHh4iJjIqJhoaFhoeHiIiHh4eGiIeHh4eHiIeHh4aGhoeIiYqKiYmIiYmJi4uNjIqJhYSEhIWGhoiHh4eHiImHgnl2dnqAf315eXl9f4SFh4aEhIODg4ODg4GBgX98dWhhYF9eZm5ydXl8enl4eHt7fHt+gYSFhIWGiIeJio2Ojo2NjYyKiYaDgoSHiYuPkJGRk5OTk5OTkoh5bm1ubnR5f4SMkJOVlZSUlJSVlpWVko6IfnV1dnmBiIyOjo6Oi4V9fXt7e3t7eXp7e3t7e3t6enp6enp7e3t7fHx8fHt7enp9fX19fX19fX5+fn5+fn5+fn59fX19fX19fX19fX5+fn5+fX1+fn19fHx7enl7enl3dnd4dnFrZ2VnaGt0eoB/fXVtZmRkZmRiYmZxgIeFgIOOlI6JiImHhoaGiYmHiIiIiouPjYuJiYaGh4eHh4eHhoWHhoaGhoaGhoaGhoaGh4iJioqKiYiJioqLioyMiomGhYWFhYaHiIeHh4eIiYeBeXV3fIF/e3h4eXx/hIWGhYSEg4ODg4ODgX9/fXlwaWNgYF5jZWhuc3x8fHh3eXt7enx+gYWFhYaIh4mKjY6OjY2NjIqHhIKChIeKjZCRkpKTk5OTk5ORhnZtb29vdnyBho2Rk5WVlJSUlJWWlZWSjod8dHV2eoGJi46Ojo2IgHV9e3t7e3t5e3t7e3t7e3p6enp6enp6e3t7e3x8e3t8fH19fX19fX19fn5+fn5+fn5+fnx8fX19fX19fX19fn5+fn59fXx8fX18fHp7e3p6eXZ1dnZ1cWpmY2ZnaXB4f395cWlkZGhqZmJgY2x9h4aAgo2VkImIiYeGhoSHiYmIiIqLjpCPjYyLiYeHh4eHh4eGhYeGhoaGhoWFhoaGhoaHioqLi4uKiYqLi4uLi4uKiYiHhYWGhoeIh4eHh4iJh4F6dnd9gX96d3h7fYGDhYWEhISDg4ODg4OBfXx2cGpmZWJgX19gYWlxe397dXBvc3Z5en6BhIWFhoiHiYqNjo6NjY2MioeDgoSGiIuNkJGSkpOTk5OTk4+Dc21vcHF3fYOHjo+SlZWUlJSUlZaVlZGNhnt0dXV6g4qMjI6Ni4V5b317e3t7e3p5e3t7e3t7enp6enp6enp7e3t7e3t8fH19fX19fX19fX1+fn5+fn5+fn5+fHx9fX19fX19fX1+fn5+fn19fHx9fXt7ent7eXp5dnV2dnRwaWVjZGZna3V9fXZqZWNnbW5pYl5gaX2JiYGCjZSPiYiKiIaGg4aJi4qKi42QkY+Mi4uKh4eHhoaHh4aFh4aGhoaGhYWGhoaGhoeKioyNjIqKioyMi4qLi4qJiYiHh4aHh4iHh4eHiImHgXt2d36Bf3p3eX1/goOFhYSEhIODg4ODg4F8eG1kYmNlYmFgYGBgZnF7fXlwaWVobXN4fIGDhoWGiIeJio2Ojo2NjYyKhYODhYaLi42QkZGRk5OTk5OTjoJwbnBwcnh+g4mOjpGVlZSUlJSVlpWVkIyEenN1dHqDio2MjoyKgnVte3t5eXp6enp6enl5enp5eXl5enp6ent7e3t7e3t7e3t9fX19fX19fX19fX19fX19fX18fH19fX19fXx8fn+AgH19fX19fXx8e3p6enl5eXl2dnR0cm5nYmJjZ2Vocnp6cmljZmxxcG9mX15mfI2Ng4CLlI+IiImJhYSEhYeJi4uLjpKRj42LjI2JiIaGhoaGhYWFhYWFhISFhYaGhoaGh4mKjY6NjIuMjIyLi4uJiomKiIeHhoeHiIiIh4eIh4aBfHl7foF/fHp7foKDhIWDg4SDhIODg4KCgHttV0tRXWVjYWBhYF9lbnd5c25nYl5eZ3J3gIGEhIaIhomLjY6OjY2Mi4eFgoOEhoqMjpCQkZGTk5OTkpGMfXBucHB0eH6Fi46QkpWVlJSUlJWVlJOQi4J5dnZ4foWJjI2Oi4d7cGt7e3l5enp6enl5enp6eXl5eXl6enp6e3t7e3t7e3t7e319fX19fX19fX19fX19fX19fXx8fHx8fH19fHx+f39/fX19fX19fHx7enp6eXl4eHZ2dHNxbGZhYmRpZ2hvd3hxaWdscnd2cmtjXmV9j4+DgIqRjYiIiYmFg4KChYiLi4yRkpKRkIyMjYqHhoaGhoaFhYWFhYWEhIWFhYWFhYaHiYqNjo2NjI6NjIuMi4mKiYqJh4eIiImIiIiHh4iHhoF8e31+g4B8e3t/g4OFhYSFhIOEg4ODgoJ/eGZNQkxbZWRhYGFgYGJobnFvbGZgXFZZX2pyd36Ch4iGiYuNjo6NjYyKh4SCg4OIio2PkJCRkZOTk5OSj4l6cW5wcXV6f4aMjpGTlZWUlJSUlZWUk4+Jf3Z2dnmAhoqMjY2KgndubHt7e3t6enl5eXl5eXp5eXl5eXl5eXl6ent7e3t7e3t7fX19fX19fX19fX19fX19fX19fHx8fHx8fX1+fn5/fn59fX5+fX18fHt6enp5eXh4d3d0c3BrZWJjZmlpaGt0d3Fqa3B3e3p1cGdhZ3+QkYaBiJCOiIiJiYeGgoGEhomJjJCRk5OSjo2Ni4iHhoaGhoWFhYWFhYSEhISEhISEhoeJio2Ojo6Njo+OjY6MiomJiYqHh4iIiYiIiIeHiIeGgX58foCBgH18fYCDg4OEhIOCg4ODg4OCgn51ZVVSW2JmZGJhYWRkYmRnbGxoZV5aVVBVX2FpdYGGiIeJi42Ojo2MjImGhIKDhImLjY+QkZGSk5OTk5KQhnhxcnF0eHyAh42PkZOVlZSUlJSVlZSSj4d8dnd3eoCHioyOjYd9c21re3t7e3p6eHh6enl5eXl5eHl5eHh4eHl5e3t7e3t7e3t9fX19fX19fX19fX19fX19fX18fHt7e3t9fX5+fn9+fn19f399fXx8e3p6enl5d3d4eHRzb2plYmNnaWppaXF1c2trcnp+fXp0a2ZtgJGUh4GGjoyIiImJh4aDgoOFiIiKjZGTlJOQjY2MiIaGhoaGhYWFhYWFhISDg4SEhISGh4iKjY6Pj46NkJGPj4yKiomJioeHh4iJiIiIiYmIh4aBf36AgYGBfXx/goODg4OBgYGBgoODg4KCfnVnZGlramhlYmJiZmZkYWRqa2diXFhUUVpYWF5tfYSJiImLjY6OjYyMiIWDgoOEiYyOkJCRk5STk5OTlJCCdHF0c3Z6f4GHjo+Sk5WVlJSUlJWVlJKPh3x1eHh6gIeLjI2MhnpwbWp7e3p6eXl5eXl5enp4eHd3eHh5eXh4enp7fHx8fHx7e319fX19fXx8fX19fX19fX19fXx8fHx8fHx+fX19fX19fn5+fn58fXx7eXh4eXl4eHh3dXJvaGNhY2lsa2dlbHNyb3F1e4B/fnlwbHCCkJOJgoOKjIiGiIiHhoSCg4WHh4uNkJKUk5GOjoyIhoaFhoaGhoaGhYWEhIODhISDg4SGiIqOjY2Njo6QkJGQjo2LioiIh4iGh4iIiYmIiIiHhYF+foGCgoJ/f4GDg4KCgYB/fX+BgoGBgoJ9dm9wenl0bGhjY2VqaWRhY2VnZmFZVFBPVlRQVGZ6hIaIiouNjo6NjImGg4ODhIaKjI2PkJGTkpOTkpOTjoJ0c3R0eHx+gomOkJKTlJSUlJWVlZWUkY+HfHd4eHuCh4mNjIqBdm1tbXp6eXl5eXl5eXl5eXh4d3d4eHl5eXl6ent8fHx8fHx8fX19fX19fHx+fn5+fX1+fn19fHx8fHx8fH59fX19fn5+fn5+fnx9fHt5eHh5eXl5eHd2c29pY2Blam5uamdrcHBvcHR8gIGBfXZxdIKQloyDgomMiIeIiIeGhIKDhIaGiYuPkpSUkpCOjIqHhoWFhYeHhoaFhYSEg4OEhIODhIaHiYyMjY2OjpCQkpGQj4uLiYiGhoaIiIiJiYiIiIeEgoCAg4KEg398foKDg4KAfHp3e32Af3+BgX56d3uBgHlwaGRkaGxrZWFiYmRiXVRQS0tNUk5NXXF9g4eJi42Ojo2Lh4WCgoOEh4uNjo+RkZOSk5OSk5OLf3Vzc3R5fX6Cio+RkpSUlJSUlZWVlZSRjYR7d3h3fIOIi4yLh3xxbW9wenp5eXh4eXl5eXl5eHd5eXl5eXl5eXp6ent8fHx8fX19fX19fX1+fn5+fn59fX5+fX18fHx8fHx8fn19fn5+fn5+fn5+fH18e3l6eXl5enp4d3Z0b2plYmdtcXFuaWtxcW9tcXl/gYJ/eXN1gpCYkYOAh4uJiIiIh4aFg4KDhYWHio2QkpSSkY+NioaEhYWFh4eGhoWFhISDg4SEg4OEhoaIiYqMjY6OkJKSk5GQjYyKiIWFhIaGiImJiIiIh4SDgoKEhIOBe3R0en6BgH11cXF0eHx8fH19f35+gIOAeG9nY2Rob25pY2JgYFxVTUlHSEJMS0xYZ3R/homLjI2NjImGg4KBg4WHi42PkJGRk5KTk5KTkol8dHNzdHl9f4KKj5GSlJSUlJSVlZWVlJGLgnl2eXh9hYuNi4mDeXBtcHJ5eXh4d3d5eXl5eHh3d3l5enp5eXp6enp5e3x8fHx9fX19fX19fX5+fX19fX19fX19fXx8fHx8fHx+fX1/fn9/fn5+fn58fXx7eXp6e3t5eXh3dXJva2dlaW5zc3Bsa3Bxb2tudn2Bg4F7dXeCkJmShH6FioqIiIiHhoWEgoOFhYeJi46RlJKTkIyHhIOFhoaGhoeHhYWEhIODhISDg4SGhoiHiYyNjo6QkpOTkZGPjYuJhYSDg4WIiYmIiIiHg4OEhISEgX10b25yd319enJta290eHl5eXl9f4ODg351bWdjY2dwb2tlYV5bVk5HRUA+RUpIR1NebHuFh4qLjIyLiIWCgoGDhYeMjo+RkZGTk5OTkpOQh3tzcnJ0eX+Ag4uQkZKUlJSUlJWVlZWUkYyCd3Z5eX6Gio2Lhn51b29xdHl5eXl3d3d3eHh3eXh4eXl6enp6eHl6enp7fHx8fH19fX19fX5+fX19fXx8fHx7e319fHx8fHx8fX1+fn9/f39/fXx/fXx7e3t6e3t8fHp4eHd2c25qZ2ZqcHN1cW5rbm9uaWlzfYKCf3x3eIOQmJOFfYOIiYmJiYiHhYSCg4WFhIeJi5CSkZGOjYd/gYOFhYaGh4eGhoWFhIOCgoODhISEhYeIioyPjpCRkpGSkpKQjImGhYOBhIeIiIiIh4aFhYWEh4R8cmxoaGlsc3Z2cW1qam9ydHNydHl9gYOBfXNqY2JhZW9wbGVhXFlUTEE8Nzg/RkNASVZnd4KGiYqLi4qJhICCg4SGiYyNkJGSkpKSk5OSk46Ed3Fyc3V6fn6DipCRk5SUlJSUlJSVlZOSioF3dnl5f4aLjYqCd3BucXR1eHh4eHd3d3d4eHd5eHh5eXp6eXl4eXp6e3t7e3x8fHx9fX19fn59fX19fHx8fHt7fX18fHx8fHx9fn5+f39/f399fH19fHt7e3t8fHx8enh4d3VybmpmZmlwdHVybmpra2tnZXB8gYJ/e3d3go+WkoV9gIaIiYmJiYiFhIOEhYeEhoiKjpCQjo2Jf3N5gYOFhYWGhoaGhoaEg4KCg4OEhISFhoiJio2Nj5CRkZGTlJKOjIiGhH99goWHh4iHhoaGhYaFf3JpaGdmZmdrc3Rxbmtoamxvbm5wdnyAgYF9dGpjYmFkbHBuZ2JcWlVMQjYzNT1HRUNJVWNueoKIiYuLioeCgIGDhYiKjI6QkZKSkpKTk5SUjYF1cnN2d3x+foOKkJGTlJSUlJSUlJWVk5CJf3h3eXqAhoyMiH90bW5xdnd4eHd3d3d3d3h4d3l4eHl5eXl5eXh5enp6enp6fHx8fH19fX1+fn19fX18fHx8e3t9fXx8fHx8fH19fn5/f39/f318fHx7e3t7e3x8fHx6eHh3dXJuamVlaG90dXNvampqamRjbXqAgYB6dnaAjZWSh318goaIiYmJiIaFhIaIh4WGhoiLjo6Oi4R0ZnB+goSFhYaGhYWGhoSDgoKDg4ODg4SGh4iJiouOj5CRkZKUk5COioiFfHd7gISFh4eGhoaEhYF3bGhoZmVmZ2lvdHRxbGhkZWhpaGpzfICBgX91amZjYWJqcXBpYlxaVU5HPjk7RExMTlRRU2ZyfoaJi4uJhoKAgYOGiYuNj5CRkpKSkpOUlJKLfnVzdHZ4fX5+goyQkZOUlJSUlJSUlZWSjoh9d3h5eoGHi4uEfHFtbnN4e3d3d3d3d3d3eHh3eXh4eXl4eHh4eHl6enp6enp8fH19fX19fX5+fX19fXx8fHx7e319fHx8fHx8fHx+fn9/f39/fXx7fHp7e3t7fHx8fHp4eHd2c25qZWRob3R1dXBsa2pqZGRseYCBgHp2dX+MlJKIfX2ChYiJiYmIh4WFiIqIh4aFh4qNjI2JgGxeZnuBg4SEhYWFhYaGhIOCgoODg4OChIWGiImKio2OkJGQk5WTkI2Miod8dXV8g4SHh4aGhoKDf3Nsa2tpZ2dmaG51dnNtaGJiY2RiZ3F8gIKCf3VraGRhYWpzc2xlXllVUUxLR0lMUFJYXUw+XGl7hYmKiYeFgX+Cg4aKjI6PkJGSkpKSlJSUkYl9c3NzdXh+fn6CjZCRk5SUlJSUlJSVlZKOiH12eHl8gYeLi4N5cW1vdHl+d3d2dnd3d3d3d3d3d3d5eXh4eXl5enp6enl6ent7fHx9fX19fX19fX19fXt7e3t7fHx9fXt7fX19fX19f39/f358e3p6eXl8fHx8e3t7e3p5eHZzb2tkY2Zuc3d3dG9ra2pmY2p3f4B/eXR1gIySk4qAfX+EiIiIiYmHhoeMjIqGhYWGiYuKi4V4Z1lcdX+ChISDhIWFhoWDgYKBgoKCgoOEhYWHiIiKjY6QkZGRk5ORj46MiH9zcnd+g4eGh4aHhIJ6cW5vb2tpaWlpbXR2dW1oY2JgX2BlcnyChISBd2xoZWJibHl5cWpjXltXVFdZV1ZYU1hfSC5FYnaFi4qIhYGAgIOEhoqNj4+PkJKSkZKUlJSRiHpwcHJ1enx9foONkJGSk5SUlJSTlZWVko2FfXd4eXyCiIqIfnVvbm10fH92dnZ2d3d3d3d3d3d3d3h4eHh5eXp6enp6eXp5e3t8fH19fX19fX19fHx9fHx8fHx7e3x8fHx9fX19fn+AgICAfnp4eHh4eXx7e3x7e3t7e3p5dnNvbGViY2xxdXd2cGxsamdkaHeAgn55dHaBjJKTjoV+foOHiIiJiYeHiI6OjYeFg4SFhoWDfnJkVlNsfIGEhIOEhYWGhIOBgoCBgYGBg4OEhIWGh4qNjo+RkZGQkZGRj42IgnVyc3Z+hISGhoeFgXhzc3Nyb21ra2ptc3d3c25oZGFhYGd0foOEhIN7cGpmY2RwenlzbGViXltYW15dXFdYXl5IKzRSaXyHiIiBgH+Bg4WHi46Pj4+QkpKRkpSUlJKGeXFxcnV5e31+hIyQkZKTlJSUlJOVlZWRjYR6dnl6fIOIioZ7c29vcnh9gHV1dnZ3d3d3d3d3d3d3d3d4eHl5enp6enp4eXl7e3x8fX19fX19fHx8fHx9fX18fHt7e3t9fX19fX2AgIGBf39+end2dXV4e3t7fHt7e3t7e3p2c29sZmJiaG5yd3Zzb2tqZ2NmdX5/eXdzdoGMkpOOh399gYaHh4mJiYmKj5CQi4iCf359fnt2a2FUT156gISEg4SFhYWDg4GBgIGBgoKCg4ODhYaHiY2Oj5GRkY+Pj5CQjoqDeHFzc3mAgYOFhoR/d3VzdHV1dG9tamxzd3d2cm1oZWVkanZ/goODg31ybGZiZnN6eHNrZWRfXVxdYmRjXF1fWj8rMENYbH6FhoKAgIGDhYiMjo+Pj5CSkpKTlZWUkYR4cXFydXp8fX6EjJCRkpOUlJSUk5WVlZCMg3l2eXp+g4iKg3lxcHF0e4CBdXV2dnd3d3d3d3d3d3d3d3h4eXl6enp6enh5eXt7fHx9fX19fX17e3t7e319fXt7enp7e319fX19fn5+f39/f315dnV0dHh6fHt8e3t7e3t6eXZzb2tmZGJobnJ2d3Vxa2pnY2Nwent2c3F1gYySk46Hf32AhYeHiYmJiYuQkZKMiIN+enZ4d3JnX1RNVXN/hISDhIWFhIODgYB/gICBgYKDg4OFhoeJjY6QkJGQjo6Oj5COioR4cHByd3x/gIWGg354dHRzd3t5c25qa3J2dnV0cG1paWludX6BgoSEfXNrZWFlcXp3c2tmZWFeXl5kaWhjYV5UOTE4RVBieYSGhYODg4SFio2Pj4+PkJKSk5SVlZORgndwb3F0e319foWPkJGSk5SUlJSTlZWVkIuCend5eX2DiYiBd3Bxcnd9goN0dHZ2d3d3d3Z2eHh3d3Z2d3d5eXp6enp6eXl5ent8fHx8e3x9e3x8fHx9fX19fHx7e3x8fX19fX1+fn+Afn5+fXp3c3Fzdnp8fXx8fHx7ent5eHVxbGdiY2luc3V2dHJua2lkYWpzdHBwcnaCjZKSkImBfH+Eh4iIiIiKjZKTk5GKg3lxbHBybWZgVEtOZnyDhIOEhIWDg4OCgX9/f4GBgYKCg4SGh4iLjI2PjIuKioiJiomJhHZubnJ1eXx/gYOBfHh3dHR8gH51cG1ucXV2dXRzcG9tbXB1foKDg4N7cmtkX2Nwd3ZzbmhjYmFhYmdqbGpkXE45N0RMVWuAh4iHi4mJh4eMjo6Pj4+QkpKSk5WVlI+Ac29vb3V6fn1/h4+RkZKTlJSUlJOUlZOQiYF6d3h5foWLhnt1cHFyeIGGg3V1dnZ2dnd3d3d4eHd3d3d4eHl5enp6enp6enp6e3t7fHx7fH17fXx9fX18fHx9fXx8fHx9fX19fX5+f4B/f398endzcXJ1eXx9fX19fXt6enl5dnNuZmJja3B0dnd1c29samVfZW5tbG1zdoONkpKQioJ9f4WHiIiIiYqPk5SUk4uDemxlaGtqZWBVTEdXd4CFhYWEhYSEg4KBgICAgYGAgoKDg4WHiIqLiomHh4WFhIOFhoeCeG9ucnV5ent+gH56eXh2eYCEgXhxbnBydnd3d3VycW9ucnd+goSDg3tybWVgZHF3eHVwaWVlY2NkZ2lqZmBYSTo6SFpvg4yJioqPjYqJio2Ojo+Pj5CSkpKTlJSUj35wb25vdnt+fYCIj5KRkpOUlJSUlJSVk5CJgHp4eHl/hoqBeHNxcnN7hIiFdnZ2dnZ2d3d4eHh4d3d4eHl5eXl6enp6enp6ent8e3t8fH1+fXx9fH19fHt8fH19fHx8fH19fX19fn5/gICAgHx6d3NxcXN3e3x+fn5+fHt6eXh2cm1lYmVtcHZ4eHZ1cGxrZl9iamlpbXJ3g42Sko+KhH9/hYeIiIeIipCVlZaTjYZ8bWZnamlkXlZORk5vfYWFhYSFhYWEgoKBgYGBgX+BgYKDhIeIiIiGhoWFg4SEg4SFg4J6c3BydXl6eXp7end5eHp/goWCenFvcnV4eHd3d3VycHB0eX+Bg4ODfXNtZmFnc3p7dXFqZ2dmZWRlZGRiXlVFOT1UcYOQkI6MiYaEhISIjI6Nj4+PkJKSkpOTk5SPfnFwb292fH99gImQkpGSk5SUlJSUlJWTj4h/eXl5eoCGhn51cnN0dn6HiIN2dnZ2dXV3d3h4eHh4eHl5eXl5eXp6enp6ent7e318fHx8fn59e3t7fX18e3t7fHx8fHx8fX19fX1+fn+AgoCAfHt3c3Fwc3Z7fH5+f398e3p5dnRwa2VjZ29xd3h4eHdwbWplYWNnaGhuc3mDjZKSj4uFf3+Fh4iIh4iMkJaWmJSQiH1yaWdtamVbVlBISGJ6g4WFhIWFhYWDgoGBgYGBf4CAgoOEhoeHhYaGhoSDhISDg4OCgnx2cXJ1eXp6enp5eHl4fIGDhIJ6cnBzd3p4d3d2dnRycnV7gIGEg4N9dGxkYml1fHp0cWpqamZjYmBgX2BdUkQ9Ql+Bj5STkI2Hfnt8foOJjY2Pj4+QkpKSk5OTlI9+dXFvb3Z8gH6AiZCSkZKTlJSUlJSUlZOPiH56eXp7gIWEfHJxcnV5gYqKhHV1dnZ1dXV2d3d4eHh4eHh5eXl5eXl5ent7fHx7fHx8fX1+fnx8fHt8fHx7e3t7e3t7fHx8fHx8fH1/gIGBgIB+fXp2cnFxdXl8foB/fXx4d3V1cm9pZWVpcHR2eHh4dnNwbmllZmlram9zeoSPkpGQjomAf4SHiIiIiYyTl5iXk5GKgXRraGlpY1tTTkhGU3eBhYWFhYWEhYODgoGAgICAgICBg4SGh4aFh4aFhYSEhYWEgoKDgHl1cnV4enl6e3l5enh8gYWGgnpzcHN5fHp4d3d3dXNydnyAgoOEg3x0a2VjbXh8eXRxbWxsZ2JiYmFeYF9TSUVNZ4WSl5eViYB5dnh5eX2GjI+Pj5CRkZKTk5OUjXt0cG9wd31/foGKkJKSk5OUlJSUlZWVk4+Ffnt6eXuBg4F3cnF0dnqDjImDdXV2dnV1dXZ3d3h4eHh4eHh4eXl5eXl6e3t7e3t8fHx+fX19fHx8e3x8fHx7e3t7e3t7e3x8fHx8fn+AgYGAgH9+e3dycXB0eHx9f357d3NycHBubmhlZ2twdnd3eXl3dXJvbGxsbnFubnF6hI+RkZGQioJ/hIeIiIiKjZSYmZiTko2FeXBsaWVjW1JPSEJIbH2EhYWFhYSFg4OCgoCBgYGBgYKDhYWFhoaHhYWFhISFhYSChIOBfXdzdXh5eXp7eXl6eXt/hYeDenNxdHt9e3p3d3l3dXV4fYCDg4WCe3NrZWVud3p3cnBubW1oYmJjY2BhYFZPTFNtipecnJSDfHd0dnVydICMkJCPkJGRkpOTlJSMeXNxb3F4fn98gIuQk5KTlJSUlJSVlZWSjYV9enp5e4CBfHNxcnR2fISMiIJ1dXZ2dXV1dnd3eHh4eHh4d3d5eXl5eXp7e3t7e3x8fH18fHx8fH18e3x7e3t7e3t7e3t7fHx8fH5/f4CBgYCAf357d3JxcHJ4e3x8eHVxbWtpaWppZmVobXJ2d3Z4eHl4dXFvcXJ0dnBtcXmCjZGRk5GLg3+Eh4iHiYyQlZiamZSTj4l/dW5oZGJdVlBKQkRceoKGhYWFhIWDg4KDgYGBgYGBgoSFhIWHhoeHh4WEhIWFhISEgoGAfHZ0d3l5e3t7e3t6fH+DhYN5c3F1fX18e3l5eXh1dnp9gYKDhIF5cWtlZm53eXRvbGxtbWlkYmNmYmJgWVJPV3CLmJ6ejoB6eXZ1cm9teIiQkI+QkZGSk5OUlIh4cXBwcnl+f3yAi5CTkpOUlJSUlJWVlJGLhHx6enl7f4B5dHFzdnqAiYuGgHV1dnZ1dXV2d3d4eHh4eHh3d3l5eXl5enp6enp7fHx8fXx8fHx8fXx7e3t6e3t7e3t7fHx8fHx8fn9/gIGBgIB/fnx3cnFwcXd7e3pycGpmZWNkZ2dkZGludXZ5d3h3eXd1c3F0d3d4c3Byd4GMkJKVk4yEf4SHiIiKjZGVmZqalJSQi4J3bmllYV5YUU1EQU90f4aFhYWEhYODgoOCgoKCgoKDhIWGh4iIh4aGh4WFh4WEhIOCgYF+d3R2eXl6e3x8e3l9gIKDgXhzcXZ+f358enp4eHd1eX6CgoOEgXlwa2Vmb3h6cm1ramxsamZiY2VjY2FbU1JZcYuaoZ+Lf3p7eHNxbWlvg4+Pj5CRkZKTk5SUhnhwb29yen5/fYGLkJOSk5SUlJSUlZWUkYyDfHp6eXx/fXZ0dHR4fIOLi4V/dXV1dXV1dXZ3d3d4eHh3d3h4eHh4eHl5enp5eXp7e3p7e3t7e3t8ent7ent8fHt7e3t8fHt9fX19fn5/f39+fn9/fHhzbm5vdnt6eHFqZWFgX11fYWNnbXJ1d3h4eHh6eHZzcHR5e3tzb3N4gIuSlJSSjoSAgoiJiomNj5SZmpmWlJCMhH1zbGhkYFpTTEZARmd8hIWEhISDg4ODgoKDg4KDgoSEhYaGhoaFhoaGhoeGh4aEhIODg4J7dXV4eXp6fXx7fH9/gIJ+d3Fwdn+BgYB/fnt5d3Z5foGDg4OAdm9rZWdzfHpzbmloampsZ2NkZWRhYl5XVl1zipqgn4qAf4B5dXFsZmV2i4+RkZGRkpOTlJOHeG9vcHJ5fX19goyRk5OTlJSUlJSVlZOPioN7eXp4e357dHJzdXh/g4yJgn91dXV1dXV1dnd3d3h4eHd3d3d4eHh4eXl6enl5eXp7ent7e3t7e3x6e3t6fHx8e3t7e3x8e31+fn1+fn9/f39/f398enRubm91enl3cGhhX19eWlxgY2lvdXV4eHh4eXt5d3RxdHp9fHNvc3eBjZOVlJKPhoCCh4qLi46PlJiamZeTkY2Hgnl0cGpkXVVNSEFAVXaBhYSEg4ODg4ODg4SDgoSChIWHhoaGhoWGhoaHh4eHiIaFg4SDgn54dnh5e3t+fHt9f399fXx2cHF3gYKDgoKBfXp4d3l+gYODg350b2pkZ3N7eXRtaGdpamxnZGZoZWJjYFtbYXSJmJ+ejYSDgnt0b2llYGqDjpGRkZGSk5SUkod3b3Bxc3l9fX2DjZGUlJSUlJSUlJWVk4+JgXp5enh6fHdycnN2eoKHjIeBfnR0dXV1dXV2d3d3eHh4d3d3d3h4eHh5eXp6eXl5enp5e3t7e3t7fHp7e3p8fHx7e3t7fHx7fX5+fX5+f39/gIB/f317dXBub3N4eHNrZWFiY2FeXV9ka3J2d3h4eHh5e3l3dHFzeXx7cm5ydoCNkpSUlJKLhIOHiYyMkJGWl5mYlpKRjomGf3p3cGdeWFBHQD1Ja3uDhIKCg4ODg4ODhISEhIODhYaGhoaGh4eGh4mIiYmJiIaEhIGCgXt4eXt7e358e32AgH16eXNwcXiBg4OEhIN/fXl4eX6Bg4ODfnRvaWNnc3t5dWxoZ2lsa2hnaGhmZGJfXl5jc4eWnZuQiYSBeXFpZWNeY3iKkJGRkZKTlJSQhXdxcnJ0e399fYSOkZSUlJSUlJSUlZWTj4qAe3p6eHh5dnFzdXh+hYqKhoF/c3N1dXV1dXZ3d3d4eHh3d3Z2eHh4eHl5enp5eXh5enl7e3t7e3t8ent7enx8fHt7e3t8fHt9fn59fn5/f3+AgH9/f3x3cW5vcXZ2cWhkY2VnZWFgYWdudHd5eHh4eHl7eXh1cXR4fHtxbnJ2fYuRkpSWk42GhYaJjIyQkZaXmZeVko+MioiDf3pyaWFbU0dAPEVeeYGEgoKDg4ODg4SEhoaEg4OEhYaHiIeIiIeIioqJiYmIhoSDgYKCfXp6e3x8fnx7fYGBfXl2cW9xeYGDg4SEg4J/enh6foGDg4N9c25pY2l1fnt2bGhoaW5raGhqZ2VlY15fX2Rzh5GamJCKhn93bmVhYF5fboSQkZGRkpOUlI+EdnFzdHZ8gH19hY6RlJSUlJSUlJSVlZOPiX97fHt5d3Z0c3R2eoCGi4mEgX5zc3V1dXV1dnh4eHl5eXd3d3d4eHl5eXl6enp6eXp7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx+fn1+f4B/f39/f39/fXlzcHBwdXVvZmRnbG5rZWNlbXJ1eHl4eHl5enp5eHRydHh8enFucXV7h46RlJSVkIuGhoiLjZCSlJWXlZORj4uJiIWBfHNpYVpWTEQ+Q1RzfYGCgoGDg4OCg4SGhoWDg4SGiIiKiIiIiIuNjIuKiIeGhYSCgoJ9e3t8fHx/fXx+gIB8eHVxb3F6gYSEg4OCgoF9e31/gYOEhHxzbWdjaXV9fHdva2hqbGtsbW1qZmVjYF9iZHGAjpeVj4mFgXduZF5dXFtlfI6SkZGSk5SUjYB1cnNzdHx/fn6Fj5KUlJSUlJSTlZaVk4+FfXp9fHh1dXNzdXh7gYmJh4WCf3Z2dnZ1dXV2d3d4eHh4d3d4eHh4eXl5eXp6enp6ent8e3t7e3t7e3t7e3t7e3t7e319fHx8fH19fn9/gH9/f39/f4B+enNwbm9xc29nZWtxdXJrZ2dudHd5eXh4eXl5eXl4dXR0d3t6dHFxdHiEi4+SlJWTkYqHiIuPkZKUlZaVk5GOiomIhYN+dmthW1hRSEFBS2R6gISDgYODg4ODhYeGhoSEhYiJiYqJiYmLjY6Mi4qIh4aGhYKCg397fHx8fH9+fH6AgH16dXFxcnuBhISEg4KCgn9+f4CCg4WDe3JtZWRrd318d3FsaWprbG5vb2xoZmViYWNlbXiFj5GNiISCenBmXl1cW19ziY+RkZKTlJSOgHRxcXB0fH9+foeQkZSUlJSUlJOVlJWTj4V9e359eHRzcnN1eH6Ei4qIhYJ/dnZ2dnV1dXZ3d3h4d3d3d3h4eHh5eXl5enp6ent7e3x7e3t7e3t7e3t7e3t7e3t7fX18fHx8fX1/gH+Af39/f39/gIB8dHBtbG9ybmhobXR5eHFqaG50d3l5eHh5eXl5e3l2dHR3enlzcHFyd4GIjY+SlZaSjYmLjZCRkpOUlZSSkI2KiIeHhYB4bmVdWFVNR0NGVnSAg4OBg4ODg4OFhoiHhoSHiYqJi4mJi42PjoyKiYeGhYWFgoKDf3x8fHx8fn18foKBf3x1cXBzfoOFhYSEgoKCgYGBgYKEhYN6cmxjZGx4fXx4c29ramtub29vbGpqZ2RjZGZscn6JjYqFgoF9dGlhX19dXGqDj5GRkpOUlI+Bc3BvbnR8f35+ho+RlJSUlJSUk5WTlZKOhX58fn54c3FxcnR4gIeKioeFgX90dHV1dXV1dnZ2d3d3d3d3eHh4eHl5eXl6enp6fHx8fHt7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH1+f4B/f39/f3+AgX54cm5sbnBuZ2ltdnt7c21scHV4eXl4eHl5enp6eXZ0dHZ6eXNwcXF3gYWJjZGXl5WOi42PkJGSkpSVlJGPjImIhoWGg3xza19ZVlFMRkVQZ32BgoGDg4ODg4SGiIiHhYeJioqLiouMjpCNjIqJh4WFhYaDgoN/fHx8fHx+fHx+gYF9enVxcHN+hIeGhYSDgoKCg4OBgoSGgnlwbGJjbXl9fHh0cG1ta21ubm5ubGxqZWRkZmxveYWKh4OBf3tza2FeYF5dZn2OkZGSk5SUjYBzcG9udHx/fn6EjpGUlJSUlJSTlZSUko2DfXx+fndyb3JydHp/iIqKh4SCf3N0dXV0dXV2dXV2d3d3eHh5eXl5eHh5eXl5enp7e3t7enp7e3t7fHx7e3t7e3t7e3x8fHx8fH19fH9/f4CAf39/f3+BgH1zbWprbWpnZ3F5e3l2c3B0eXp5eHl5eXl6enp6eHd1dXh4dXFxcneAhYeNkZeXk4+NjY6PkZKSlJORkI6MiYeGhYSDf3lxZFlXWFFMR0xeeIKEgoKCg4OChIWIiomIiImJi4uLjY+PkI+Ni4qGhoWEhoODg4B9fHx8fH18fX+Cgn97dHFyc32FhoeHhoSCg4OEhIWGhoaCd3BsZmdxe358eHd0b25sbG1vbW1vb21pZ2hrbW10foSEhIB+eHNpX19hYWBidYySkZOTlJOLfHJvcXF1fYB/fYWPk5WVlZWVlZOVlZWSi4N9e359eHFvc3N1fIGJioiHhYF+c3R1dXV2dXV1dXZ3eHh4eHl5eXl4eHl5eXl5ent7e3t6ent7e3t7ent7e3t7e3t7fHx8fH19fX18f39/gIB/f39/f4GAfndvamtrZ2VmcXl/fXp3dnh6enl4eXl5eXp6enl5eHV1eHh0cHBxdn6Eho2Sl5eTkI2NjY+RkpOUk5GQjoyJh4aFhIOCfXNmWFdYU1BPUVtxf4KDg4KCg4GDhYqMjIqJioqLjIyOkZGRkY+LiIWFhYSFhIODgX59fX19fn18f4SEgHt0cnJ0fIOGh4eGhYSDg4WFhoeGhoB1b2xnaHN8fXp4eHZxcG5sbXFvbnBwb2tpam1vb3V9goODf314b2VfYGNiYF5uiJKRkpSUk4x9cm9vb3Z+gH99hY+TlZWVlZWVk5WVlJKKg319gHx3cW9ydHV8g4mJiIeGgX5zdHV1dnZ2dnZ2d3h5eXh4eXl5eXh4eXl5eXl5enp6enp6e3t6ent7e3t7e3t7e3t8fHx8fn59fX5+f3+AgH9/gIB/gYB+eW9ra2hkYmVvd359e3l5ent7enl5eXl5enp6eXp5dnZ4eXRwbnF2fYKFjZSXl5OQjY2MjpCRk5STkY+Ni4iGhoWEg4OBfG9cVVVWVVNSWmh6gYODgoGBgIOGjI+OjYuKi4yOjo+Sk5GQj4uHhIWEhISEhISDf35+f399fHt/hISAe3VycXR8goWGh4eHhIODhISGh4aGfXJtaWZpc318eXh4dnNwb25ucnJxcXBwb21vcnNzd3l9gX56endvZV9fYmRhX2yDkZKTlJSTi3xyb29vd39/fn2FkZSVlZWVlZWTlZSUkYqDfX1+enVxb3F1eH+FiIiHh4aBfnN0dXV2dnd3d3d3eXl5eHh5eXl5eHh5eXl5eXl6enp6enp7e3l5ent7e3t7e3t7e3x8fHx9fX5+fn1+foCAf3+BgX+BgH58cGpqZWJfZG92e3t7e3t7fHx7eXl5e3t6enp7enp3d3d6dHBucXh+goaNlZaUk5CNjYyNj5GSlJORjoyKh4aGhYSEgoSDeWZXUlZYVlNbY3N/g4KBgYCAgoaMjo6Mi4qLjI+Oj5GUk5GOioeDhIOEhIOFhYR/fn6AgHt6en+Dg4B7dXJwdX6DhIWGhoeGg4OEhIaHhoZ7cG1pZmp0fX16eHh2dXFwbm50dXNxcHJxcHJ1dnZ2dnl9e3d5dm9kX19gZGVhbH+PkZKUlJOJe3JvcHF4gH99fYWRlJWVlZWVlZOVlZOQioN9fX15dHFvcXV6gYeIiIeHhoF+cnN0dHV1d3d3d3Z4eXl3d3h4eHh3d3h4eHl5eXp6enp6enp6eXp6enx8e3t7e3t7e3t7fX5+fn5+fn9/fn5+fn9/foCBf3t2b2tmYl5ganN6fX59fXx7e3t5eXl7e3p6e3t7eXd2dnd1cW5ye36Ch4+VlZSTkI6NjY2OkZKUk5KPjImIhYSFhISDhYaBdmJVVlpaWllfbHyBgoF/f4GDhoyOjoyLiouMj4+PkpSTj4yIhoSEhIOEhIWFhYJ+fn1+fHp6f4SEgHx2cXB2f4OGhoaHiIeEgYKChYWFg3lubWpma3Z8fXt5d3d3cnBvb3N0cnBxcnFwcXV4eHRxdHd2dHRwa2NeXmJlZ2VqeYqQkJGUkol6cnBwcHh/f358hpCTlZWVlZWVlJWVk5GLgn5+fnZzb29ydHqDiIiIiIiFgn9wcXR0dXV2d3d3dnh4eHd3eHh4eHd3eHh4eXl5enp6enp6enp7enp6e3t7e3t7e3t8fHt9fn5+fn5+f39+fn9/f39/gIB/fXpzbWhiXV5mcXp+fn59fHt7e3l5eXt7enp7e3t5eHZ2d3Z1cnZ9gIOIkJWWlJSQjo2MjI6RkpSUko+MiYiFhISEhISGh4V/cWBXV11fXF5od3+DgH9/gIOGjI+PjYyMjY6QkJCRlJKOiYeGhoaFhYaFhYWFg35+fX98enp/hISAfXZxcHiAhIaHh4iIiIWBgoKFhYWBd2xsaWdueX59enl4eHh1dHBwc3Vyb3FzcXBwdHZ2cm5xcnJxcG5rZV5dYGRoaGl1hYuOj5ORh3hycXBweH9/fn2GkJOVlZWVlZWVlZWTkImBfn59dnJub3J0fIWIiIiIiYaCf29xdHR0dXZ3d3d2eHd3d3d4eHh4d3d4eHd5eXl6enp6enp6ent6enp7e3t7e3t7e319e31+fn5+fn5/f35+f3+AgIB/f4CAfXhxamVgXmRwen5+fn18enp6e3l5e3t6ent7e3l5d3d4eHh4fH+ChoqOkZSVlJGOjYyMjpGSlJSSjouJiIeGhISEhIaHhoV7b2BYW15fYGZzfYF/f4CBhIaMj5COjY2PkJCQkJGSkIyIiIeIiIaGiIeFhYWDgIB/f317en+EhIF+d3Fwdn+EhYaHiIiIhYOCgoODg31ybGxqaHB5f3x5eHl5eXd2c3BzdnRubm5tbGtvcXFvbG1tbm5ub2xoYFxdY2doaHB/houMjoyEeHFwcHB4f39+foeRlZWVlZWVlZWVlZOPh39+f3t0cG5vc3Z/hoiIiIiJhoJ/cHJ0dHR1dnd3d3Z4d3d3d3h4eHh3d3h4d3h4eXp6enp6enp6enp6enp6e3t7e3t7fX17fX5+fn5+fn9/fn6AgIGBgH5/gX9+enJrZmJfZW96fn5+fXx6enl7e3t7e3p6e3t7eXl4d3l6enuAgoOGiIuPlZWVkY6Ni4uOkZGTk5GNi4iHh4aEg4ODhYaGhYF5al1bXV9hZnB7gH9/gYKEh4yPkI+Oj5CRkJCQkZCNiYaIiYqKiYiIh4WFhYOCgoGAfXt7f4SEgX52cG9yeoKFhYeIiIiGg4KCgoKCeW9qa2hpb3d9fHl3eXl6enh1cnV3dWxpaGdlZmpsbGxramprbG5ubWphXV1jZ2hnbHmBhoeMioJ3cW9wcHh/f35+h5GVlZWVlZWVlZWVk46Ff35+enNvbm9zd4GGiIiIiImGgn9vcXJzc3Z3dnd3eHl4eHh4eHh4eHh4eXl4eXl6enp6enl5eXl5enp5enp5eXt7fHx9fXx8fH1+fn9/f39+fn5+gICAf4CAgH99d25pZWJnb3p9fn19e3l6ent7e3t8e3t7e3t6enh4d3t7fYGEhYeGh42TlpSRjIuKiY2QkJGRkIyJh4WFhYODgoSFhoWFg4B0aFxYXWJqc3t/gH+Bg4WGi42Pj4+PkI+SkZGRjouIhoiJi4yMiYiGhoWDg4KBgX57eXp+gYOCe3NtbG50fYCFhYeHh4eEg4GAgH50bWpsamlscHR4eXp6fHx8fHt3eHh1bWZhX15fYWZpaGZmZ2ptcG1rZ2NfX2FoaWptdHt+goWEfnFwcG9xeH5/fX6JkpWVlZWVlZWVlZWTjIN+fn55cm9vcHR7goeHiImJiYaCf29wcXJzdXZ2eHh5eXl5eXl4eHh4eHh4eHh4eXl6enp6eXl5eXl6enl6enl5e3t8fH19fHx8fX5+f39/f35+fn6AgICAgICAgH55dG9qaGtze35+fXx7ent7e3t7e3x8e3t7e3t6eHh3fH1/gYOEhYOEiZCUk5GLiomIiIuLjYyMiIaFhISEgoKChIWGhYaFg350ZlxaXWt4fH2AgYKEhoeKjY+Pj4+Qj5CPj46MiYmHiIqMjY6LiYeGhYODgoGBfnt5en6Cg4B3bmhmZ2pzeoGEhoeHh4WEgoB/eW9ramxqZ2lrbHF1d3p9fX+Afnp5d3FqYVtYWFhbYWVmZmdoaWxvbGxoZGBfYWdpaWxtcXd8f396b25ubnB5f399fomSlZWVlZWVlZWVlZOMg35+fHdycHBydXyDh4eIiYqJhoJ/bm9wcnJ1d3Z4eHl5eXl5eXh4eHh4eHh4eHh5eXp6enp5eXt7eXp6eXl5eXl7e3x8fX18fHx9fn5+fn5+fn5+foCAf3+AgICAf3p5dG9ucHd9f359fHt6e3t7e3t7e3t7e3t7e3p4eHl8f4GBgYKCgH+FjZKTkYyIhoWEhoeIiIiHhoOCgoKCgoSEhYWGhoeFg310Z15eanl9fYCCg4WGh4qMj4+Pj4+OjY2NioqHiYiJi42Pj42Kh4WFg4ODgoF+e3l6foKCfXJqZGFjZWp1foSGhoaHhYWCgH92bGpramllaGtra21xdHh6foB9eXdzbWZdVlVVVFZcZGdpa2xub3BtbWllYWBjZmhpaWdpbnN4eHRtbGxtb3l/gH5/ipKVlZWVlZWVlZWVk4uCfn99dnFwcXN2fYSGh4iJiomGgn9ub3BxcnR2dnd3eXl5eXl5eHh4eHh4d3d3d3h4enp6ent7e3t6e3t6eXl5eXt7fHx8fHx8fH1+fn19fX1+fn5+gIB+foCAgIB/fHx3dXN1en59fn17fHt7e3t7e3t7e3t7e3t7enh3enyAg4GAgX98fIKKkJORjIiFg4KBg4WFh4WEgoGCgoOChIWGhYWFhYSEgXxyaGVteH1+gYODhoeIiYyPj4+Pj46MjIuLioeIiouMjY+QjYqHhIODg4SCgX57eXp+g4F6bmZiYWJiZnB8goWGhoeFhYKAf3VraWtpaGZobWxpampscnV6fnt3dHBqYlpUUVFUVlpka25wcXNzcm9taWViYGNmZ2hoZmVobXJybmtra2xueH6Bf4CKkpWVlZWVlZWVlZWSioJ+f3x0cHFyc3Z9hYaHiImKiYaCf21tb3BxdHR1dnd3eXl5eXl5eXd3eHh4eHd3eHh5eXp6eXl5eXt7e3t6ent7fHx7e3x8fX19fX19fX18fH19fn5+fn5+f39/f4B/fnx7ent8fXx9fHx8e3p8fH19fHt7fHx8fHx7e3h6fICEhIF/fXt6f4aOkpGMiIWEgoKDg4WGg4KCgYKCgoSEhoWFhYWFhYWDgHp2d3p8fX+BhISHhoiJjY+Pj4+Qjo2MjIuKiYqLi4yOj5COiYeFhIOCgoKAfnp5eX6Bf3VpY2JiYmFibHeBhoaGh4aGhIF9c2lnaGlpZWlsbGdmZGNna3J4eHNuamReV1JPT1NYXWlzeHh4eHd3cm9qZGNhY2RkZWZlYmJkaGppaWlpa253foF+gIuTlZWVlZWVlZWVlZGKgX9/e3NwcHN1eICEhoeJiYqKh4OAbGxvcHFzdHV2d3d5eXl5eXl5d3d4eHh4eHh4eHd3eHh5eXp6e3t7e3t7e3t8fHt7fHx9fX19fX19fXx8fX19fX5+fn5/f35+f39/gH5+fn5+fH58fHx7ent7fHx8fHx8fHx8fHt7e3t8f4WEg4B9eXl+g4uRkYyJhYSEhISEhYWEg4KBg4OChISGhYWGhoaGhoSDgX+AgH1+f4KEhYeIiouOj4+Pj5COjYyMi4qKi4uKi46PkI2JhYSFhIKCgoGAfXl6fn98cWdlZGVjYmFocn+EhoeHh4eFgnxzaWdoaGhmamlpaGVjYWFkaG1ubGpmYFtYU1FSVVxodXyAf359enhzcW5paGZlZWZoaWdlZGRkZWZmZmZoa3R7f3x/jJSVlZWVlZWVlZWVkYmAfn56dHJyc3V6goSGh4mJioqHgn9sbG9wcHJzdHZ3d3l5eXl5eXl3d3h4eXl5eXh4d3d4eHl5e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fn5+fn5+fn5/f4CAf39/gIB+f318fHt6enp7e3x9fXx8fHx8e3p7fHx9hIWDgnx5en6BiZCRjomFg4ODhISEhYSEgoKDg4SEhoWFhYaGhoaGhISFgoKAfX+Ag4SFh4qMjo+Pj4+PkI6NjY2MioqKioqKjI6QjYeDg4SGhIKCgoGAfHt+f3twaWloaGRiYGRufYOFhoWFhoaDe3NraWloaGZoaWlpZmRkYmNiZGRlZGJgXFtXV1hcZXaBg4SCgn98e3ZycG9uamhqa21ua2lnZmNhY2NjY2RncXh7eX6LlJWVlZWVlZWVlZWQh358fHhzdXVzdXuChoeHiYqLi4aBfm9vb3BvcnN0dnd3eXl5eXl5eXd3eHh6enl5eHh4eHl5e3t7e3t7e3t7e3t7fHx9fXx8fX19fX19fX1+fn19fX1+fn5+fX19fX5+gICAgH+Bf31/fnx8e3p6ent7fHx8fHx8fHx7e3t9fX2ChYWDfXt7fX6HjpCPioWEhISEhYSFhYWEhISEhIWGhIWFhoaHh4iGhIKDgX59f4KDhYaIiYuOjY+Pj5CQjo2NjYyKioqKioqLjY6MhYGBhIWDgoKCgYF/fH6Be3FtbGxqZ2NgYWt6goSEhIOFh4N7cWpramdnZ2lqampnZmZkZmFhYmFiYWBdXVtcXWNvf4qHhYSEgH1+eXdxc3Fua2xvcnNyb21qZmJkY2NjYmdudXl4foqUlZWVlZWVlZWVlJCGfHx8eHF0dHN1fIOHiIeJioyLhYF+bW1ub3Byc3V2d3h5eXl5eXl5eHh4eXt7eXl5eXp6e3t7e3p6e3t6enp6enp8fHx8fHx8fHx8fHx9fX19fX19fX5+fX17e317fX1+fn9/f399fH19fHt6ent7e3t7e3x8fHx9fXx8fH17fIGFhoN9fHx8fYKLj46Lh4SEhIWEhYWHhYWFhYSEhoaFhoaGhomJh4WEgoF/e31+goOEhoiKi42Oj4+QkY+Pjo2OjIqJiYmLi4uMjoqEfoCEhYODg4ODgoF/fn95cnFvb21rZmBhZHJ+fn59gYKGg3lvamxqZ2ZoamlqaWhnZ2VjYmFiYWJjYmNkYmFlcn+KkIqHgoGBgH56eHV1dXJubnN3fHt4dnFsZmNkY2RkZWxwc3V/i5WVlpaWlpWVlZWUjoR8ent3cnNzdHd7goaHhoiKjIuGgn9tbW5vcXJzdXZ3eXl5eXl5eXl4eHh5enp5eXl5enp7e3t7e3t7e3t7enp7e3x8fHx8fHx8e3t7e3x8fHx9fX19fX19fXt7fXt8fH1+f39/f318fX18e3p6fHx7e3x8fHx8fH19fXx9fXx9gISFhYF9fXx8f4iOkI6HhIWFhYSFhYeGhYWFhISGh4WFhYaHiYmHhYSCf3x9gICDg4SHiIuNjo+Qj5CRj4+Ojo6NiomKiouLi4yOiYN8f4OFg4ODg4KDg4B+e3Z0dHVycW9rY2BhanNycXN4fYJ/d25rbWxoZWRmZ2hoZ2ZlZGJiYmJhYWJkZ2trbnOBjZWXj4aBf4CAf3x6eXp6eXJydnyCgoF/e3VsZmVlZWVlaW1wdX2Kk5aWlpWVlZWVlZSOg3x6enZyc3N1eXuChoaEhIiMi4eCgG1tbm9wcXJzdnd5eXl5eXl5eXh4eHl5eXl5eXl6ent7e3t8fHx8e3t7e3x8fHx8fHx8fHx7e3t7fHx8fH19fX18fH19fX19e3x8fX5/f35+fXx9fXx7enp8fHt7fHx8fHx8fHx8fH19fX5/g4WGg39+fHp9g4uOjYmGhYWGhYaGiYeHhoaFhYaGhISEhoeJiYeFhIJ+fH6AgoSDhoiKjI6Pj4+QkJCQj4+Ojo2Mi4uLjIyMjI2Ignt9goWDg4OCf4KDgX15dHV4d3Rzc25kYF9mbWppam91fHx2b21ubWpmZmVlZmdlZGJjYmRkZWNhYWZtcXR5f42Wm5yRhoKAgH9/fXx7fn9/eHZ5foSGh4WCfHNramhmZWVmam1yfImQlJWVlJSVlZWVlI2CfHt5dHJzc3V5fYSGhX9/houLh4GBb29ub29wcXJ2d3l5eXl5eXl5eHh4eXl5eXl5eXp6e3t7e3x8fX18fHx8fHx8fHx8fHx8fHt7e3t8fHx8fX19fXx8fX19fX17e3t9fn9/fX19fH19fHt6enx8e3t8fHx8fHx7e3x8fX5/gICDhYaEgX98enuAh42Mi4iFhoaHiYiIh4aGhoWFh4WEhISGh4mJh4WEgn98foCBg4SHiIuOj5CPj4+QkJGPkI+PjY6Mi4uMjIyMjIiEfHyBhYODg4J9gYKBfXZydnl1c3V1cmdgX2RpZmVlaHB3eHNubWxra2hoZmVmZWJhYWJiZGRnZWJhZm93en6HlJydmZCGhIOBgIB+fX6DhIJ7e3yBh4iKiIeBeHBtamdlZWZqa294hY6TlJSUlJWVlZWTjIJ8fHlzcnNzdXp+hYeFfHyFi4uHgIFub25vcHFyc3d4enp5eXl5eXl5eXl6enp5eXl5enp7e3x8fHx7ent7e3t8fHx8fHx7e3t7e3t7e3t8fHx8fHx8fX19fXt7e3t8fHx8fX19fXt7fX18fHt7fHx8fHx8fHx7e3x8fHx+fn+Af3+EhoSDgH16e4CGi4uLiYaFhYeJioiGhoaGhISFhYWFhYaHiYmIhoWBfX2AgoKEhYiJjI6Pj46Ojo+QkZGQkJCPj42MjIyMi4yMioZ+e4CCg4ODg4CAgYB7cnB0dnNxdHh1bGVgYWVlZGFjaG5zcGxtbm1qamhoZGNkY2NjYmJkZGZnZmNkbnl9goyWm5eRiYSFhoN/f319g4uMh39/foGGiouKiYN8dHFuamdlZmhqanSCipCVlJOUlZWVlZSLf3p6d3Nzc3N2eoCFiIZ7eoaKjIaBgW1vbm9wcXJzdnd4eXl5eXl5eXl5enp6enl5eXl6ent7fX19fXt6e3t7e3x8fHx8fHt7e3t7e3t7e3x8fHx8fHx8fHx8e3t7e3t7fHx8fXx8e3t8fHx8fHx8fHx8fHx8fXx8fX18fH5+f4F/foKFhYOAf3x9f4SIiIqIhoWFhomKiIeFhYWEhIWFhYWFhoeJiYiGhYF9f4GDg4WFiIqMjY+OjIyNj5CRkpKRkZCPjo2MjYyLjIyLiIB7gIKDhISDgYCBfndwb3N0cXBzeHdwaGBhY2RjYWNjaGxsa2xra2psbW1oZWRkY2JkZGRkZWhsbWdmanF8ipmWjoiEgoWGhH+Af4OOmJONhIKBgYaKi4qKhoF8d3RuamhnaWhocYCHjpOTk5SVlZWVk4p+eXl1c3Nzc3Z7gYWIhXt8hoqMhoGBbG5ub29xcnN2d3d4eXl5eXl5eXl6enp6eXl5eXp6fHx+fn5+fXt7e3t7fHx8fHx8e3t7e3p6enp7fHx8fHx8fHt7e3t7e3t7enp8fHx9fHx7e3t7fHx8fHx8fHx8fH19fHx9fXx8fn5/gYB/gISFg4GAf39+goaHiIeGhYSFiIqIhoWEhISEhIWFhYWGh4mJiIaDgH+AgYOEhYaJi4yOj42KiIyOkJOTlJOSkZCPjo2Ni4uMjIuJgHuAgoOEhIOBf397dG5vcXNvcHR4enRrYWFkZGRkZWVlZ2lrbGtrbG9ycm5oZmZjY2RkZWVlZ210bWBbZXeKlYyGgoCDhYSDf3+DjZiel5GIhIOChYqLioqIg4F8eHNtamlqZ2dueoOLkJGTlJWVlZWSiHx5eHVzc3Jzd3uCh4eCfH+HjIyGgYFsbW5vb3Fyc3V2eHl5eXl5eXl7e3p6enp5eXl5enp8fH5+fn59fHt7e3t8fHx8fHx7e3t7enp6ent8fHx8fHx8e3t7e3t7e3t6enx8fH17e3t7e3t8fHx8fHx8fHx9fX18fH19fHx+fn+BgX9/g4SDgoGAgH9/g4WHhoaFg4OHiYeFhISEhISEhYWFhYaHiYmIhoKAgIGBg4SFhomLjY6Pi4iIjI6Pk5SVk5KQkI+PjY2Li4yMi4qCeoCCg4SEg4F/fXlxbW9wcG9vdHd6dmxjYWRkZmVmZmRlaWpramlrcHV1b2tnZWVlZWVlZWRnbXVvXFJddouShoGAgYaDgYB/goqWnqCalYyEg4KFiouKioiDgn99d3Bta2pnZ2x2gIaOkJOUlZWVlZCGe3h4dHNzcnR4fIKHh4F8gYqNjIaBgW1ubm5ucHFydnh5eHp6eXl6ent7e3t7e3p6e3t8fH19fn5/fXx8fHx8fHx8e3t7e3t7e3t6ent7enx9fXx7fHx8fHx7e3t6enp7e3t9fXt7fX17e3t7fHx8fHx8fX1+fn5+fX19fX1+gIKBgH+DhIODgYKCgH+AgYSEhIWCgYOGhoaEhIWEhIWEhISEh4eIiIaDgYCCg4KDg4SGiYyOj46LiIiKjY6QkpOTlJORkI+OjYyLi42Ni4WAgIOEhYSAfX99dm5rbW9vb3F1eHl1bGVkZ2hpaWRjY2NmZ2dlZmpudnVwamZlZmVlY2NkY2ZrbWVYSld2i5CEgYCFhoKBgH+IlZ+fn52ZkomFhIWIiIeHh4WAf398eHRxbWtnanN8gYmOkZOVlZaVkIV7eHVzdHRzdXp+hYaGfnyEio2Mh4KCbm5ubm5wcXJ1d3h4enp5eXp6e3t7e3t7e3t8fH19fX1+fn99fHx8fHx8fHx7e3x8fHx7e3t7e3t6fHx8fHt8fHx8fHt5eXp6ent7e3t7e3t7e3x8fHx8fHt7e3t9fXx8fn59fX19fX6AgYGCgICChISEg4OBgICAhIODhYOBf4KFhYSEhISGhYSEhISGhoaFgoKBgoODgoODhIiKjI6PjouJiYqMjZCSk5SVlJGRkI+NjY2MjY+NiIKBg4SGhH96fnx0bWpsb25vcnZ5eHNsZmZoamttaGZkZGVmZWRlaG1ycm9pZmVlZWNhYWFfYGRkXlRKVW6Ej4SBgoaJhICBh5Who5+fnpuVjomFhIeHhoaHh4J/f357d3VxbmlpcHd8g4qPkZWVlpWOhHp4dHN0dHN1eoCGiIR8fYaKjoyHg4Nubm5ubnBxcnR2d3l5eXl5enp7e3t7e3t7e3x8fX19fX5+f318fHx8fHx8fHx8fX18fHt7e3t7e3p8e3t6e3t7e3t7enl5enp6e3t7enp7e3t7fHx8fHx8e3t7e3x8fHx9fX19fX19foCBgoOBgIKEhYWDg4OCgYGEhIOEg4F/gYSEhISEhIWFhISEhISEg4GCgoKDg4SDg4SGiIuMj4+Oi4uLi4yOkJKTlJWUkpGQj42NjY6OkI+LhYKDhIaEgHt7eXJsamxtbG5xdnl5c21oZ2lqbG9ubGhoZ2dlZWRmaWtsbGdnZ2ZlY2BfXV1bXl5aU1BXZoCNhIGDhYuHgYeVnqKin5+enpuTjoiEh4eGhomJhIF/f356eHVwbGlvdHh+hYuOk5WUlIyAd3Z0c3R0c3Z7goeIgnqAiIyOjIiEhG5ubm5ucHFydHZ3enh4eXl6ent7e3t7e3t7fHx9fX19fn5/fXx8fHx8fHx8fX19fX19e3t8fHt7enx7e3p7e3t7e3t6eXl6enp7e3t7e3t7fHx8fHx8e3t7e3t7e3t8fH59fX19fX1+gIGCg4KBgYOGhoWFhIODg4ODg4SFgoGBhISEhISEhYWEhISEhIOCgYGBgoODhIKDhIaJjIyPj46NjI2NjY+RkpOUlZSTk5CPjY6OkJCRkI2Hg4OEhYSAend1cWxsbWxrbnF2eXlzbGhnaWxucXJybWloaGdmZGVmZ2lpZ2doZmVlYmBeXFxcXFhUV1pifIyEgYOGioqDkZ2joqKfn56dnZeQi4iHh4eIiomEgX+AgHx5d3Nuam1ydXyCh42RlZWTjH93dXRzdHR0d3yDh4aAe4KKjI2NiIWEb29ubm5wcXN1dnd4eXl5eXp6enp7e3x8fHx8fHx9fn5+fn5+fX18e3t7e3t8fH19fHx8fHt8fHt7e3x8e3t7e3t7e3t6enp6enp6enp6enp7e3t7fHx8fHx6e3t8fHx8fn18fH19fX6AgoOEg4F/goWHhoaFg4OEhIOEhYeHg4KEhIOEhYWEg4SEhISFg4KBgIKCg4SFg4SFiImMjo+Pj4+NjY6PkJGSk5SUlJOSkJCOj4+QkpCQj4yHhISFhYF3c3BtbW9vbmxtbnR5enNta2hobHBwdHZ0bm5raGZjY2RjZGdoaGloZ2dnY1xZWFlZV1heX2N2iIaDhoeJiYmWn6Khn5+fnp+empSPi4uKiYeJiIWCgIKDf3p5dm9rb3J0en+GjJCTlZKLfnd1dHNzc3N4gIaHhH19hYqNjoyHhYNvb25ubnBxc3Z2d3h5eXl5enp6ent7e3t7e3x8fH5+fn5+fn5+fnx7e3t7e3x8fX18fHx8e3x8e3t7e3t7e3t7e3t7e3p6enp6enp6enp6ent7e3t8fHx8fHp7e3x8fHx+fn19fX19foCDhISEg3+AhYiGhoaDgoSFg4SFh4eFhISEg4SFhYSDhISEhISDgYKAg4OEhIWFhYeJi42QkI+Qj46OkJCRkpKUlJSUk5KRkZCQkJGSkJCPjoqGhISEgnlzbmtvcXBua2xscnh6cm1qaWlscHJ3dnRxcG1pY2FgYGFjZmdrbW1sbW9sYl5dW1taW2FkaHaFiIeLioqIjZmhoJ6enqCgnp2cmZSOi4iHhoiIiISAgoSBfXx6c2xwdHN3e4KIjpOUkYt9dnNzcXNzc3mBhoeBfH+Hio6PjYmFhG9vbm5ucHFzdnZ3eHl5eXl6enp6e3t7e3t7fHx9f35+fn5+fn5+fHt7e3t7fHx8fHx8fHx7fHx7e3t7e3p6enp6enp6enp6enp6enp6enp6enp7e3t7e3t7eXp6e3t8fH5+fX19fX1+gIOEhYOCgICCh4eHh4SCg4SFhYWHh4eFhISDhIWFhYSEhISEg4KCgoKDhYWEhYeHiYuNj5GQkJCPj4+QkZKSkpSUlZWUk5KRkZCRk5KQj4+PjYmFhISBenNubnBxcG1paWpwd3hybWloaW1wdHZ1dHJxbmpkYWBgYWNkZ2xvb3BxcnFoY2JiYF5fZmhrdoOKi46NjIiSnKKfnZ2eoKCenZ2clo2JhIWGiIiIhX6Ag4N/f312bXF2c3V3fYSLkpORin11c3Nxc3N1eYCFhn98goeLjY6Oi4aEb29ubm5wcXN2dnd4eXl5eXp6enp7e3p6enp8fH5/fn5+fn5+fn58e3t7e3t8fHt7fHx8fHt8fHt7e3p6enp6enp6enp6enp6enp6enp6enp5eXp6enp6ent5enp6enx8fX18fX19fX6Ag4SFg4KBgYKFiImHhYGChIaGhYeHh4aEhIOEhISFhISEhISDgoKChYSFhISFh4iJjY+QkZGQkY+QkI+RkpKSlJSVlZSTk5KRkZGRkpCPj4+Oi4aEg4F8cm5ucHFwbGloaG53d3JtaGZnbnJ0dXV1c3JwbGdjYmJiY2RobG5wcnN0dG5paGhlYmRoa253gouNjo+MipWepJ+dnZ6goKCen52UioWEhYaJiYiGfYCCgn+Af3hwdHh1c3N5gYmOkpCJfHNydHJzc3Z7gISFfnyDiY6Ojo+LhoRwcG9vbnBxdHZ2d3h4eXh4eXl5eXt7e3t7e319f39+fn9/f39+fXx8fHx8e3t7fHx8fH19fH16enp5eXl5eXh4eHh6enp6enp5eXp6enp6enp6eXl6e3p6e3p7e3p7fHx9fX1+fn59f4CDhYaGhYKCgoSHiIeDgYOChYaGh4eGhoSDg4SFhYaFhIOEhIOCg4SFhYOFhYeKi42OkJGQkZKSkZGQkJGRkpKTlJWVlZSUlJKSkZGSkI6Oj4+OiYWEgXxzcHFzcnBtaWhnbnh4cmtnY2dvc3NzdHNxcG5qZWRiYmFjZGhscHFydnR0c3Bubmtqam1tcHmDjo6Pj42Ml6CkoaCfoKCgn6Cfm4yDgoOGiImIh4V6eX6AfoB+eXN4e3V0cnZ9hYqPkIl6dHR0dHR0eHyBg4J8gIeNjo+Pj4uGhXBwb29ucHF0dnZ3eHh5eHh5eXl5e3t7e3x7fX1/f35+fn5+fn59fHx8fXx7enp9fXx8fX19fXp7enl5eXl5eHh4eHh4eHh5eXl5enp6enp6enp6enp7e3t7e3t7enx8fH5+fn5+fn1/gIKFh4eGgoKChISGh4SCgoKEhoaGiIaFhIODhIWFhYWDg4OEgYGDhIWFhIWGiYyNj5CRkpCQkZKSkZCRkZGSkpOUlZWVlZWVk5KTk5KQj46QkJCLh4SAe3Fzc3R0cHBtaWVsd3dxamZjZ3F0dHN0dHFubGllY2JiYWNmaW1xcnN2dXVzcW9ycXBycnJyeoKOkJCQjo+ZoqSjoaCgoJ+foJ6ShYCBg4aJiYiGg3h1e35+gH96dn1/eXZydXqCiI2Oh3pzdHV0dHV4fYODfXuCiY6Oj4+Qi4aFcHBwcG5wcXR2dnd4eHl5eXl5eXl7e3t7e31+fn9/f39+fn5+fn19fHx9fHt6en19fHx9fX19fHx6eXl5eXl4eHh4d3d4eHl5eXl6enp6enp6enp6ent7e3t7e3t6fHx8f39/f35+fX9/goWHh4aEhIODg4SFhIOCgYOGhoWHhoWEg4OEhYWEhISDhISBgYSEhYWFhYeKjY6RkpKSkJCRkpGPj5CRkZGRkpOVlZWVlZaUlJWVkpCQkJCQkY6JhYF6cXN0dXVycW5oZWpzdW9pZWNrcnV2dXRzb21rZ2RjYmNkZmpsb3FzdHd2dHJxcnVzcnN1dnV4gYuQkpCPkpukpqSioaGhoKCgmIeBgICChomKiIaCdnB0e36AgHt5gISAeHV1dn6Fi4yFeXN0dXV1dnt/hYF8f4WLjo6OkJGMhoVwcHFxbnBxdHZ2d3h4eXp6eXl7e3t7e3t7fn9/f3+AgH19fX1+fn18fH18e3t7fX18fH19fX18fHp5eXl5eXh4eHh3d3h4eHh5eXp6enp6enp6e3t7fHt7e3t7e3p8fHx9fX9/fn59f3+ChYeHhoWFg4SDg4SFhYKAg4aGhIaGhYSDg4SFhYSEg4OCg4KChYaGhoWGiYyOj5GSkZKQj5CSkI+QkJGRkJCRk5WVlZWWlpSVlZSSkJCQj4+RkIuHgXtycXR1dXRyb2Zla3N0bmlkZG5zdnd2dXJubGllY2JiZWZobG9wcXN1d3ZzcnF0eHd1c3V4dXZ8ho6RkZCVnqOlpKOhoaKhoJ6Qg4CAgIGGiYuKh4J1bHB6f4CAe3qChoZ6d3RzeoSIiYR4dHV2dnV2fYKEfnyDiIyOjo2QkoyGhXBwb29ucXJ1d3d3d3d3eHp6enp6ent8fH1/fn5/f39/fn5+fn9/fnx9fXx8fHx8fHx8fX19fX17enl5eXl3eXl4eHh4eHh4eHl5enp5eXl5ent7e3t7e3t8fHt7e3t8fH1+fn59fX5+f4KFiIiHh4eFhISDg4SEg4KEhoaFhoaGhYSEhISEhIODhIKDg4SGhoaGhYeJjI+QkJGQj4+Pj5CQkJCRkZGQkJGSk5OVlZaWlpWVlZKQj5CQkJGQjoqEe3NyeHd1c3RwZ2ZrcnJsZ2NlbnR3d3Z1cW9ramZkY2RmaGtwcXFycnV2cnFvcXd7enh1dnZ0cXR/ipGQj5WfpKWlo6KioqGhmomBgICAgISJiYqJhHVpanZ+f398e4OJiH94dnd6gIaJgnp1dnZ2dXd8gIF9fYaKjo6PjpGUjYWDcHBvb25yc3V2dnd3d3d4eXp6enp6e319fn9+fn9/f39/f39/gH9+fH19fHx8fHx8fHx9fX19fHt6eXl5eXd4eHh4eHh4eHh4eXl5eXl5eXl6e3t7e3t7e3x8e3t7e3x8fX5+fn5+fn5/gYWIiIiHh4aFhIOCg4SEhISGhoeGhoaFhYSEhISEg4OEgoODhoaGhoaHiIqMkJCQkJCPj4+PkJCPj5CQkJCQkZKTk5WVlpaWlpWVk5GPkJCQkZCPjId+d3V5eHZ1dnFoZm1ycWxqZWZudXh5d3ZycGpqZ2ZkZWZpb3NycnJydXRwbGpvdXt8d3V0dHFtcHeGj5CQmKClpaWjoqKioaGVhICAgICAgYeJiomFemxmcHyAf3x8hIyKgnp2dnh8hIiBeHV2dnZ2eHt/fX2CiIuMjo+PkpONhoRwcHBwcHFzdXV1d3d3d3d4eXl6enp7fHx9fn19f39/f39/f3+Af398fX18fHx8fHx8fH19fX17enp5eXl5d3d3eHh4eHh4eHh5eXl5eXl5eXl6e3t7e3t7fHx7e3t7fHx9fn5+f39+fn+BhIiIiIeHh4eFhIOCgoOEhoiIh4aGhoWFhISEhISDgoOCg4SGh4aGhoeJjI6QkI+Qj46Oj4+QkI6Oj5CQkJCRkpOTlZWWlpaWlpWTkZCRkZGRkZCOioF6d3l4eHd3cmtpb3RybWpkZ3B2d3p6d3JwaWlpZmVlaG11eHZ0dHRzcm5oZ2xzeXt2c3R0cG1tdIOOj5GZoqWlpaOioqKhno6BgICAgICAhYmKiYV+cGZte4CAfXuEjI6Hf3dzdXuBhn92dHd1dXZ5eXx6f4WJi4yOj5CSkYuEgnBwcXFxcXN1dXV3d3d3d3h4eHp6ent8fH1+fX1/f39/gICAgIB/f319fXx8fHx8fHx8fX19fXt6enl5eXl3d3d4eHd3eHh4eHl5eHh5eXl5eXp7e3t7e3t8fHt7e3t8fH1+fn5/f35+fn+EiIiIiYiIiIeFhIOCgoaIioqHhoaFhYWEhISEhIODg4KEg4eGhoeHiImNkJCQjo6Pjo6Pj5CPjo6Pj4+QkJGSk5OVlZaWlpaWlpOSkJGRkZOSkZCNhH56eXh3dndybGpwc3JtaGVocXZ3enl2c25qaWlnZmVpb3h8eHZ2dXJwbGZlaHF3eXZzcnJwbmx0goyPkZmgpaWlo6KioqKbh4CAgICAgICFiYqIhn5xZ2x6gYF9e4SMkIqCeXN1en+CfXR0d3Z2d3l4eXqAhouOjY6PkJOQioOBcHBxcXBycXR0dXh3eHh2d3h4e3t7fHx9fX19fX1+fn5/f4CAf39/fH19fn58fHt7fHx9fX19e3t7enp6eXd4eHd3dnZ3d3d5eXl4eHl5enp6e3t7fHx8fHt7fHx8fH19fX1+fn5+f39+gIWIiYmJioyMioeFgoCBhIiKioeGhoaFhYWEgoODg4ODhISGhoeHiIiJiY6Qj4+Njo+Ojo+QkZCPjY2OkI+RkZGSk5SUlpaWlpWVlJOSkpKSk5KRkI+NhH56dnd4eXVubXBzcW1oZmt1d3V4eHRxbWppaWdmZWtxe4B8d3h1cm9taGNjbHV4dXRycnFua3KAi5CTmaGlpqWko6OgoJWDgICAgICAf4WLi4iHgHNoa3mAgH56go6SjIZ+d3d6f4F8dXV3dXZ2eHd5f4SKjY2Njo6SlY+If3pwcHFxcHJxdHR1dnV1dXZ3eHh5eXp7fH19fX19fX19fn9/gIB/f398fX19fXx8fHx8fH19fX17e3t7enp5d3h4d3d3d3d3d3l5eXh4eXl6ent7e3t8fHx8fHx8fH19fX19fX5+fn5/f31/g4aJiYmLjIyLiYWCgIGChomJh4eHh4eHhoSChISEg4SFhoeGiIiJiomLj5CPjoyMjo6Oj5GRkI+OjY6QkJGRkpKTlJSWlpaWlZWUk5SUlJSTk5ORkY+KhH15eHp6d29vcHJxbWhmbHZ6eHl4dHFtampqaWlobXJ8gX15dnVyb25qZGJsdXd1dHNzcm5rcX2IjpSaoqampaSkoqGfj4KAgICAgIB/hY2Nh4WAcmdqd3+AfnqBj5ONiIJ9eHx/gHp1dXZ1dnZ4eHuDiIyOjo2PjpCRjIN5c3BwcXFyc3N0dHR1dHZ2dnd4eHl5ent8fX19fX19fX19fn5+fn5+fn59fXx8fHx9fX19fX19fXt7e3t6enl3eHh4eHh4eHh3eXl5eHh5eXp6enp7e3x8fHx8fHx8fX19fX19fn5+fn9/fX+ChYmKiouMjIyKh4SCgoGDhYeHh4eHh4eGhYKDg4ODhIaGiIiJiouNjI6Pj4+Oi4yOjo+QkZKRkI+PjpCRkZGSk5OUlJaWlpaVlZaUlJSUlJSUk5GRj42Jgn18fXx3cXBxc3BsaGZveXp4eXh1b2pqbGxra2tscHh7fHl2dXJxcGtlZGx0dXN0c3Nzb25yfIaOlJujpqalpKWjopyJgoCAgICAgICGjo6Ggn1xZ2p1foB+eoCNk46Kg356fYB/eHN1dnV2d3l6gIaKi42Ojo6NjIyFe3JvcnJxcXJzdXR0dHZ1dXV2d3h4eXl7fHx9fX19fXx8fX1+fn5+fX1+fn19fHx8fH19fn59fX19e3t7e3p6eXd4eHl5eHh5eXd5eXl4eHl5enp5eXt7fHx8fH19fHx9fX19fX1+fn5+f399foGFiYuLi42NjIqIhYODgYODhoeHiYiIiIaGgoKEhIOFhoaIiYqLjI+Oj4+Pj46Li42OkJGRkpKQj4+OkJGSkZKTlJOUlZaWlpWVlpWVlZWVlZWTkZGPkI+Ig3+AfndzcXJzb2toZnF6end5eXVuaWlsa2xsa2tvc3d5eHh1cnNxa2ZlbHNzcnR0dHRwcHN8h46Um6SmpqWkpaSil4OBgICAgICAgIeNjYeBenBoanWAgH56f4yTj4uEf3t+gH94cXZ2dXZ4eXyDhomKi4yNjImHhX1zbmtycnFyc3N0dHN0dXV2dnd4eXl6enp7fHx8fH19fHx9fn5+fn59fX19fX18fHt7fX19fX5+fX17e3t6e3t5eHh4eXl5eXp6eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t8fX19fX1+fn5/f35+gIaKjIyNjo6MiomGhIOEg4SEhYiIiYqKiYeGhoSDg4WGh4mKjI6Qj4+QkI+OjoyMjo6QkZKTkpGQj4+QkpKSk5OTk5SUlZaWlpaWlZWVlZWVlZWUkpKRkY+LhoR/dnFxcnJvbGhncn59eXp6dXFsbGxvbm5ubWxucXN0dXd0c3Jua2lscXNxdHV0cnFyc3qFjpSboqampqSkpaKRg4GAgICAgICChIyMhYB6cWxtdn6BfXp9ipOPi4aAfIB/fXh0dnZ3d3h9gYaJiYWHioqJg3x4cGtoanJycXJzc3R0dHV1dnd3d3h6enp6ent8fHx8fHx7fHx8fHx8fH19fX19fXx8fHx9fX5+fn59fXt7fXt7e3p6eXl5eXp6enp5eHl5eHh4eHl5enp6ent7e3t6e3t7e3x9fX19fX5+fn9/fn1/hIuMjI2OjoyKiYiGhYWEg4OFh4iJioqKiImIhoSEhYeIiIqOkZOSkZGQjo2MjIyOj5CRkpOSkpGPj5GSkpOUk5OTlJSVlpaWlpaVlZWVlZWVlZWUlJKSkpCMh4B3cnFycm9saGdzf4B8fHx4c29vb3JwcHBva2tsbnBxdnRzc3BubWxucHF0dXRzc3Nzd4OLkpuipqenpaWloIyDgYCAgICAgIKDiYqFgHlxbW52fH98en2Kko+NhoJ/f399eHV2dnR0eYCEiYmDfn+Cgn52b2tmZmltcXFxcnNzdHR0dXV2d3d3eHl5eXl4eXp6enp6ent7e3t7e3t7fX19fX19fHx9fX5+fn5+fn19fHx9fHt7enp5eXl5enp6enp5eXl4eHh4eXl6enp6e3t7e3p7e3t7fH19fX19fn5+f39+fX+DioyMjY+PjoyJiIiHhYWDg4SGh4iLi4qIiIaFhIWGhoeIi4+Tk5GRkZCNjIyMjI6PkZGTk5KSkY+QkpKSk5SUk5OUlJWWlpaWlpWVlZWVlZWVlZSUk5OUko+JgXhycXJxbmtnZnOAgX1+fnp1cnJydHJycG9rampqa2xwcXFxcXFwbGxvcXR1dHV1c3N3gouRmqKlp6elpaSciIKBgICAgICAgIGFh4OAeXFtbnR6fn16fYmSkY+HgoGAf314dXZ2dXV6gYeKh353dnp5cmtlY2Nlam5xcXFyc3N0dHV1dnZ3d3d4enp5eXd4eXl5eXp6e3t6ent7e3t9fX19fX18fH19f39/f35+fX19fXx6e3t5eXp6eXl6enp6e3l5eXh4eHh5eXt7enp7e3t7ent7e3t8fX19fX1+fn5/f399f4SJjIyNj4+PjouKioiGhYSEg4aGiIuLioiGhISEhoeHhoiMkJOSkZGRkI2Li4yMjpCSkpOTkpKRj5GSkpKTlJSTk5WVlpaWlpaWlZWVlZWVlZWVlZWTk5STkYqBeHN0cnBuamdlc4KCfn59eXV0dHR0cnJxcG5raWppamxvcHBwcG5sbG9xdHV0dHRzcneBi5GZoaWmpqampJqGgoGAgICAgIB/gIKDg4F7c21uc3l9fXp9iJGQj4mFgoF/fXh1dnV2dnuCiIqGfHRwc3NsZmNhYmRqbnFxcnNycnR0dHR2dnd3d3d5eXh4d3d4eHl6eXl6enl7enp6e3x8fX1+fn19fX5+f35+fX9+fn19e3l6enp6eHh4eHp6enp6enp6eXl5eXl5ent7e3x8fHx7fHx8e3x9fX19fn6AgH9/fn6Ag4iMjY6QkZGOjIuJioeGhISDhYaGiIiHhoWCg4SGhYaFiIyRkpKRkZGPjYuLjI2Oj5GRk5SUkpKQkZKRk5OTlJSUlZSUlpaWlpaVlZSVlZWVlJSUlJSUlJOPiIB5dXV0b25qZ2RwgIN/fXx6dXR0dXV0cXN2cm5saGdnaGtubm1wbm1sbnJ1dHVzdHR2fISKkJihpaenpaWilYWAgICAgICAgICAgYCBgX12bmxxdnp9eXuHkZGOi4WCgYB7dnV1dXV3fYWKi4J3b2ttamdlZGFhZGhtc3Nzc3NzdHR0dHV1dnZ2dnh4d3d3d3d3eHh5eXl5eHp6enp7fHx9fX19fX19fn5/fn59f39/fX18enp6enp4eHl5enp6enp6enp5eXl5eXl6e3t7fHx8fHx8fHx7fH19fX1+fn9/f39+foCDiIyNj5GSkY+Ni4iIhoaGhoWFhoaIiIeGhIKEhYWFhISJjJGSk5GQkI6Mi4uMjY6PkZGTlJWUkpGRkpGTk5OUlJWVlJSWlpaWlZWUlJWVlZWUlJSUlJSVk42Ffnp4eXp1cWxoZXGBhYF9fHl1dHRycnNvdHl4c29pZ2ZkZ2tram5tbGxtcXV1dnR1d3qCh4uPl5+lp6empaGShICAgICAgICAgICBgICBfntybnF1enx4e4iRko+LhYKBgHl2dXV1dnl/hoqHfXRua2xqamlpZ2ZobXF1dXR0dHR0dHR0dHR1dXV1dnZ3d3d3d3d3d3h4eXl4enp6e3x8fH19fHx8fn19fn5+fn1/f399fXx6enp6enp6eXl6enp6eXl6enl5eXl5eXp7e3t8fHx8fHx8fHt8fX19fX5+f39/f35+f4KHjI6PkZKSkI2LiIeGhoaGhYaGhoaGh4aDgoSFhYWCg4mNkpKRkI+PjYuMi4yNjo+Rk5OUlZSSkZGSkZOTk5SUlZWWlpWVlZWVlJSUlZWVlZSUlJSUk5OSi4J8e3t+gH12cGlmc4KGgn16d3V1dXNzcm9udn16dW5qZ2VmaGhpbGxqamtucXV2dnd4fISIi46WnKOlp6emopCEgICAgICAgICAgIGAgIOCgXlycXN5e3h6h4+RjYqGgoF+d3R1dXV3eoGHh4F5cXBubW5vcHFwb3F2eHR0dXV0dHR0dHR0dHV1dXV2dnZ2d3d2dnZ2eHh4eHd5enl7e3x8fX18fHt+fX1+fn5+fX9/f319fXt6enp6enp6enp6enp4eHp6eXl5eXl5ent7e3x8fHx8fHx8e3x9fX19fn5+fn9/fn5/gYeMjpCRkpKRj4uIhoaHhoaFh4aGhYWHhoODhIWFhIODiI6SkY+Pj4+Ni4yLjI2Oj5KTk5SVlZSRkZKRk5OTlJSVlZaWlZWVlZSUlJOVlZWVlJSUlJWTko+Hfnp6f4KFhHx2bGdzgoaAfXl2dXZ2dHRybmp0fn97c21pZGVlZWdra2lpampvdHR1dnl+homMjpWboaWmp6ahj4SBgICAgICAgICAgYGChomGf3Vxcnh7eXuEi42JhYOCgX12c3V1dXZ5gIWEe3VxcHJxc3R2dnZ5fH5/dHR0dHR0dHRzc3V1dXV0dHZ2d3d3d3d3d3d2d3d3d3d5eXt8fHx9fXx8fHx9fX5+fn5+f39/fX19e3t7enp6enp6enp5eXl5eXl6enp6enp7e3t7e3t7e3t7ent8fHx9fn5/f35+fn59fXyAhouPkJGRlJSRi4iGhoeHh4eHh4eGh4WEg4KFiIeGhYaJjpCOj42Pjo6MjYyNjo+QkpOUlJaVlJKSkZGSkpOUlJaWlZWUlJWVlJSUlJOTlZWUlJSUlJORjIN/e32Eh4mIhYF1bHSAg4F7eHV1dXd1dHJtaW98g4F5cWxoY2FhZWdoaWtqam5xcnV3eX+FiYyNlJqgo6ampp+Og4GAgICAgICAgYGCgYaNkoyCeHJxd3p3d36EhIJ/f3+BfHZ1dnV1d3mAhIJ4cXFzdnZ2eHp8f4KDhYN0dHR0dHR0dHR0dXV1dXR0dnZ2dnZ2dXV2dnd3d3d3d3h4ent8fHx8fHx8fHx9fH1+fn9/f399fX17e3t6enp6enp6enl5eXl5eXp6enp6ent7e3t7e3t7e3t6e3x8fH1+fn5+fn5+fn19fX+Fi5CQkJCSko+LiIeHh4eJiIiIiIeIhYOBgoWJh4eHiIuNj42OjY6OjY6NjI6OkJGTlJSVlpaVlJKRkZKSlJSUlZWVlZWVlJSUk5OTk5OUlJOTk5OTko6IgoB+goaJi4uLiIJ6eoKCgXp4dHN0dXZ1c25na3eAg354c21kX19iZGVoa2psbm9ydHl9goWJjI2SmZ+jpqamn46DgYCAgICAgICCg4ODjJSZkod9dnJ1dXJwc3h3dnZ2eHt6dXZ2dXV4eoCDf3Rwc3V4eHl9gYWIiYmHhHR0c3N0dHR0dHR1dXR0dHR1dXV1dXV1dXZ2d3h4eHh4eHh6e3t7e3t8fHx8fH18fX5+f39/f319fXt7e3p6enp6enp6eXl5eXl5enp6enp6e3t7e3t7e3t7e3p7fHx8fX19fX1+fn5+fX1+gIaMj5CQkJCQj4uIiIiIiYqKioqKioiDgoKDhomJiIeKi42PjY2MjY2Mjo+Oj4+QkZOUlJWWlpeVkpGRkpKUlJSUlJSUk5OUlJOTk5KTk5OTkpKSkpORjIWBgIKHioqLjY6MioWBhYWDfnh0c3R1d3ZzbWdncH2BgHx3b2RhYWFiY2ZoaWttb3Fze4CEhouMjZCXnaKlpqafjYOBgICAgICAgIKFhIOPmJuUi4F6dHRxb2xrbWpra2twdHVzdnZ1dXl7gIF7c3J0dnl6fYKHioyJiIWCdHRzc3R0dHR1dXV1c3N0dHV1c3Nzc3V1dXV3d3d3d3d4eHl6enp7e3x8fHx8fX19fn5/f39/fX19e3t7enp6enp6enp5eXl5eXl6enp6enp7e3t7e3t7e3t7ent8fHx9fX19fX5+fn59fX6BhoyPj4+PkJCPioqKioqKi4uLi4uLiIOBgoWIiYqKiYqLjpCNjouLi4yOj4+QkJCRk5SUlZeXlpSSkZGSkpSUlJSUk5OTk5OTk5OTkpOTk5OSkpKSkY6KhYCChImMjIuNjo2MioeIhoWBenVzdHZ3dnJsZmRreYCCfnpwZ2NjYGJhZGZoaWxucHR8g4WHi4yNjpWcoqWmpqCNhIGAgICAgICAg4eEg4+YnJSNg3xzcXFtaWdnY2VlZWtwcnJ2dnV1ent/gHp0dXZ3en2BhImMi4eFgoB0dHNzcnN0dHV1dXV0dHV1dXV0dHN0dXV1dnd3dnZ3d3h4eXl6ent7e3t8fHx8fX19fn5+fn5+fn58fHt7e3p5eXl7e3p6enp6eXp7enp7e3t7fHp7e3t7e3x7e3x8fHx+fn19fX19fX59f4KIjI2Pj4+QkI6LioiKioqKi4qJiomGhIKDhomLi4uJi4yPj4+OjImJioyQkJCPkJGTlJaWlpaWlZOSkZGTk5SUlZSTk5KSk5OTk5OTkZGRkZGRkZGRj4qFg4SJjI2OjY2Ojo2MjIyKiIaAenh5eHd0cWxnZWhxe4B/enNpZ2ZiYGBhZmdnaGpucnuBhYeMjI2PlJqgpKenoZGEgYGAgICBgIGDhYSFjZSTkoqCenJtamdlY2JhYGBiaG1xcXN0dXZ4foB+dnV2dnd9goWJjYyKhYJ/e3R0c3Nyc3R0dXV1dXV1dXV0dHR0c3R1dXV3d3d2dnd3eHh5eXp6e3t7e3x8fHx9fX1+fn5+fn5+fnx8e3t7enl6ent7e3t6enp7e3t7e3t7fHx8e3t7e3t7fHt7fHx8fH5+fX19fX19fX1/g4iLjI6Oj5CQjouKiIqKioqKiYiJh4SDg4SHiYqKioqNjpCQkI+NiYiLjZCSkI+QkZOUlZaWlpaWlJORkZOTlJSUlJKSkZGSkpKSkpKRkZGRkZGRkZCNiIWEh4yOjo6NjY6OjY2NjYuKiIWBgYF+fHdzbWhlZmt1ent0cGlramViYmNkZWZnaGxweH6ChYqLi46SmJ6kpqagkoSBgYGBgYKBgIGCgoKEh4WEgHp1bWpnZWRjYWBdXWBlam1xcnR1dnh9fXp1dHd5foSIi42NjImFgn97dHRzc3JzdHR1dXV1dXV0dHR0c3NzdHR1dHZ2dnZ2d3d4eHl5enp7e3t7fHx8fH19fX5/f35+fn5+fHx7e3t6eXt7e3t7e3p6e3t7fHt7fHx8fHx7e3t7e3t8fHx8fHx8fn5+fn19fX19f4CEiYuNjo2PkJCNioqIioqKiouKiIiGg4KDhYaHiIiJi46PkJCPj46KiY2PkZKRkJCRk5OVlZaWl5eVk5OTk5OTk5OTkpGQkJGRkZGRkZGRkJCQkJCQj4uIhYeLjY+Ojo2Njo6NjY2Ni4uJh4eIhoWCf3pzbGlnaW51dW9ram1uamhnZ2ZmZmZnaGxzeX6Ch4qLjJGXn6OlpJ6RhoODgoF/gH9/f319fHp6eXh2cXBqZmVkY2NiYF1cX2FkaG5wc3V1eHp7d3Z5fYGGioyOjo2KiIWCgX90dHNzcnN0dHV1dXV1dXR0c3NycnN0dHV0dnZ2dnZ3d3h4eXl6ent7e3t8fHx8fX19foCAfn5+fn58fHt7e3p5eXl7e3t7enp7e3x8fHx9fH19fXt7e3t7e3x9fXx8fHx+fn9/fX19fX6AgISJio6OjI+Qj42KioiKioqKioqIh4aDgoSHhoeHiIqMj5CRkY+PjoyLjI6RkpKRkZGTk5WVlpaYmJaUk5OTk5KSk5ORkZCQkZGRkZGRkJCQkJCQkJCOi4eFiYyOj46OjY2Ojo2NjY2Mi4qJiYuIh4eDf3lwbWppa3FxbWpqbnBsbW1saWhmZmdmaW91eoCEiYqKj5WdoqShm5CFgoGAf39+fHx7eXl4dXNycXBsa2ZmZmRjZGJgXlxgYGJma29ydXV3ent5e4CEiIuMjY6NjImHhYKCgXNzdHRzdHR0dXV1dXR0c3Nzc3NzdHV1dnV2dnZ2dnZ2dnZ4eHl5eXp7e3t7e3t7fH19fn5/fn5+fX17ent7enp5eXt7enp7e3p7e3t8fHt7e3x8fHt7e3x8fH19e3t8fH5+fn59fXx+foGDhYmLjY6Nj4+Ni4mJiYqKioqKioqHhYKDhIWEhYeIiYyOkJKRkJCPjIyMjpCRkpGRkZGSlJWVlZeXlpWTk5KRkZGSkpGQj4+QkJGRkJCQkJCQkJCPj46Lh4eKjY6Ojo6NjY2Njo6OjoyLi4uLioqJiYmGgX54cW1vcG5saWxwcnFvcnBtaWZlZGRobXN3fYGGiYmNkpyioZqTiIF+fn17enp6eXh2dXR0c3FvbGhnZWVkZGJjZGVkYWBgYWRnbG90dnp8f4GEiY2Pjo+OjYmJiYaFg4KCc3N0dHR0dHR1dXV1dHR0dHNzc3N0dHV2dnZ2dnZ2d3d3d3l5eXl5ent7e3t7e3t8fX1+fn9+fn59fXx7e3t6ent7e3t7e3t7e3t7fHx8fHx8fHx8fHx7fXx8fX17e3t7fn5+fn19fH5/goWHiYuNjo6PjoyKiYmJioqKioqKiISDgoOFhoWEhYiJjI6PkI+QkJCNjYyOkJGSkpGRkZKUlZWVlpaWlpSTkZCRkZCPj4+Ojo6Ojo6Ojo+Pjo6Ojo6OjoyJiYqNjo+Ojo2NjY2Ojo6OjY2MjIuLiomJioiGhIN+e3l4dnNxc3d4eXp8enRwa2dkZGZrb3R4fIGEiIyQmJqWjIZ/e3p7eXh5eHl5eHd1dHRzcW9saGdmZGNiZGNlZ2djYWFhZGZpbHF3f4OHiIuOkI+Pj4yLiYiHhoWEg4NycnNzdHR0dHV1dXV0dHR0c3Nzc3R0dXZ2dnZ2d3d3d3h4eXl5eXl6e3t7e3t7e3x9fX5+f35+fn19fXx8fHt7e3t7e3t7fHx7fHx8fHx7e3x8fHx9fXt9fHx8fHt7e3t+fn5+fX18foGDhYiJioyNjo+Oi4qJioqKioqKiomGg4KBhIaHhoaGh4qMjY2NjY+QkI+NjI6PkJKTkpGRkpSVlZWWlpaWlZOQkJCQjo6NjYyMjo6NjY6OjY2Ojo6Ojo6NjIqJioyNjo2NjY2NjY6Ojo6Ojo2Ni4qKioqJiIiGh4WDg4B/fXt9f4CAgoGAenZwaWZkZGdqb3N4e36FiY2QjomCfXp5eHp5eHl5eXl6end4dnVzcW9raWhkY2FjZWZoaGZlY2NkZWZpbXaCh4qLjo+Qj42Ni4qKiYeGhYSDhHFxcnJ0dHR0dXV1dXR0dXVzc3NzdHR1dnZ2dnZ4eHh4eHh4eHl5eXp7e3t7e3t7fH19fn5/fn5+fX19fX19fHx8fHt7fHx9fXx8fH18fHx8fHx8fH19e318fHt7e3t8fH5+fn59fXx+gYOGiYmKjI6Pjo2LiomLi4qKioqKiIWDgYKEiImIh4WIioyMjI2Oj5CQjoyMjo+QkpOUk5GRlJWVlZWVlpaWlJKRkJCOjo2NjIyNjYyMjY2MjIyMjIyNjYyLiomKjI2OjIyNjY2Njo6Ojo6OjY2LiouLioqIiIiHiIeHhYaDhIWEhoWEg4J/e3VtZ2RjZGdsb3R3eoKFiIiEfnx5eHl5eXp6ent6e3x9e3t6eHVzcW1paWRjYmFlZmlpaGdjZGRkZWdrdYCGi4yMjZCQjo6Mi4qJh4aHhYSEcnJzc3Nzc3N0dHV0c3N0dHNzcnNyc3R0dnZ3d3d3d3d4eHl5enp6e3t7fHx6enp8fX1+fn5+fX19fX5+fXx8fHx8fHx7e318fHx8fHx8e3t8fH19fn58fX19fHx8fHx8fn5+fn18fn6ChIeJiouMjo+PjIuKioqKiYmKiomHg4F/goWKjIqGhYeJi4uMjI6PkJCOjY2OjpCSk5KRkJCSk5WVlJSWlZWVkpCQj46NjIuLi4uLi4yMjIyMjIyMjIyMjIyKiYqLjY2NjY2NjY2NjY2NjY2Ojo2Mi4uJiYiIiIiIiIqJiImIiYuLiYiFhYSCfHNsZ2NkZmprbXBze35+fXt4eHh4eXh4enx9f35+gIKBgX98eHV0cm5raGRhYGNnZ2hpaWhmZWNjY2dteYKJi42MjY2OjoyLi4qHh4eGhIRzc3Nzc3Nzc3V1dXR0dHR0c3Nyc3JzdXV2dnd3d3d4eHh4eHh6enp6e3t8fHt7e3x9fX5+fn59fX19fX18e3t7e3t7e3x8fXx8fHx8fHx7e3x8fX1+fn5+fn5+fnx8fHx+fn5+fXx9gIOFiIqKi4yOj4+Ni4qKioqJiYmJiISBgIGDhoqNjIeGhoiKioyNjY+QkI+NjY6OkJKTkpGQkJKTlJWVlJaVlZWSkJCPjYyLioqKioqKiouLi4uLi4uLi4uLi4qJiYuMjIyMjIyMjIyMjY2NjY6OjY2Li4mJiYiIiIiIiImKiomLjY2Mi4qKiYiDe3FpZWVmaGpqbW90dnR0dnV4eHl6enp9gYOFhoSFhYeIhX96d3Z1cW1qZ2NiY2ZoamxsamlnZGRkZWdueYWJjIyNjY6OjYuLioiIh4eFhXR0dHR1dXV1dnZ1dHR0dHRzc3JzdHV2d3d3d3d4eHh4eHh5eXl5eXl7e3x8fHx8fX19fn5+fn19fX19fXx7e3t8fHx8fX19fHx8fHx8fHx8fHx9fX5+fX19fX19fHx8fH5+fn5+fX2Cg4aIioqLjI6Qj42LioqKiomJh4iGg3+Ag4WHio2OiYaGh4iKi42OjpCQkI6Ojo6QkpOSkZCQkZKTlJWWlZWVlZORkI+Mi4uKiYmJiYmJioqKioqKioqKiouLiomIiouLi4uLi4uLi4uMjI2Njo6NjY2Ni4uKiIiIiIiIiIqKiouPj4+Ojo6NjIiBeG1oZmdoaWhpa21vcHF2dnh4eXt8foWJjpCPjoqJi4uGf3p3d3Vyb21qaGdlZWltbm5sa2hmY2NlZGZvfoeKjI2Njo6OjIuKioqJiYeHdHR1dXV1dXV2dnV0dXV0dHNzcnN1dnZ3d3d2dnl5eXl3d3h4eHh5eXt7fHx8fHx9fX1+fn5+fX19fX19fHt7e319fX19fX18fHx8fHx8fX18fH19fn57e3t7e3t8fHx8fn5+fn1+foKFiImKiouMjo+PjouKioqKiYmIh4WDgICEhoeJjI2Kh4aHiIqLjY6OkJCQj46OjpCSk5KRkJCQkpOTlJaVlZWVlJGQj4uKioqIiIiIiIiJiYmJiYmJiYmJioqKiYiJi4uLi4uLi4uLi4uLjY2Ojo2NjY2NjYuJiIiJiYmJioqLjI6OjoyOjo6NjIZ7cmpoZ2dpZ2dqamxtcHV2d3d5fIGGjJKWmZaTj4+NioR7eXh4dXJxcW5sa2VjaW1wcG1ramdkZGRlZGl5g4qMjY2Ojo6Ni4qKiomJh4dzc3R0dXV1dXV1dXR0dHR0c3NydHV2d3d3d3d3eHl6enl5eHh5eXp6e3t8fHx8fH18fn5+f399fX18fX18fHx8fX19fX19fHx8fHt7fX1+fn19fX19fXx7e3t7e3x8fHx7e3t8e32Ag4WHiYqLjI2OkJCNiomJiYmKioiFg39+goaHhoiLjIuIhoaHi42Qjo6PkJCQjo6OkJKSk5KRj4+QkZOUlJSUlJORkJCNi4qIh4iGh4eHh4iIiYmJiYiIiIiIiYqIiIiIiYmJiYmJiYmJiYqNjY6Ojo6OjoyMjIqJiYiIiYmJiYuLjI2Ojo6Oj46Oi4N5bmhpaGlpa2toaGptcHRzdnuAipCVmJqbmJORkpCIf3l4d3h4dXd3dHNuaWhrbXFxbm5qaWVjZGRiZXKBiY6Ojo+Pjo2LioqKiYmHh3NzdHR1dXV1dXV1dHR0dHRzc3N0dXZ3eHh4eHh4eXp6e3t6enp6enp7e3x8fHx8fXx+fn5/f35+fXx9fXx8fHx9fX19fX18fHx8fHx9fn5+fn59fX19fXt7e3t7fHx8fHt7e3x7fYGDhYeJi4uMjo6Pj4yKiYmJiYmJiIOAfX+Eh4iGiYuMjIqHh4iLjI6Njo+QkJCOj4+QkpKTkpGPj5CRk5SUlJSUk5GQkI2MioiIiIeHh4aGh4eIiIiIiIiIiIiJiYiIiIiJiYmJiYmJiYmJioyMjY2Ojo6OjIyMioqJiIiJiYmJi4uLjY6Pj4+Pj46Mh39za2ppaGlra2ZlZ2tucnV5f4eQlZaWmJiWkpCRjod/e3p6fH1/goF9dnBsbGxucXFwb21sZ2RkZGNlbHyHjY6Pj4+OjYuKioqJiYiIdXV1dXV1dXV1dXV0dHR0dHNzdHV2dnd4eHh5eXh5enp7e3p6enp6ent7fHx8fHx9fH5+fn9/fn59fH19fHx8fH19fX19fXx8fHx8fH1+fn5+fn19fX19e3t7e3t8fHx8e3t7fH1/goSHiImLi42Ojo6OjIqJiYmJiIeGgH19gIaHiIeIiYuMjImHiIqLjIyNj5CQkI+Pj5CSkpOSkY+PkJGSk5SUlJOTkZCPjYyKiYiHhoWFhYWGhoeHh4eIiIiIiImIh4eHh4iIiIiIiIiIiImKi4uMjI6Ojo6MjIyKiomKiomJiYmLi4qMjo+QkI+PjYuJhHlwbGloaWxsZ2VlaGltcnZ/h42Rk5OUlJSSkJGNiIOCgIGDhImKiIR7c29vbnBxcXBwcG5qZmRkY2NndISNjo+Pj46Ni4qKiomJiop1dXV1dXV1dXV1dXR0dHR0c3N0dXZ3d3h4eXl5eHl6enx8e3t6enp6e3t8fHx8fH18fn5+f39/f318fX18fHx8fX19fX19fHx8fH19fX5+fn5+fX19fX17e3t7e3x8fHx7e3t8fn+ChoeJiouMjo6Ojo2LiYmJiYmIhoN+fH6Bh4mIiIiJiouMioiJiYqLiYyPkJCQj4+PkJKSk5KRj4+QkZKTlJSUk5ORkI+NjIqJiIeGhISEhISFhoaGhoeHh4eIiYiHh4eHiIiIiIiIiIiIiYqLi4yMjo6OjoyMjIqKiYqKiYmKioqKiYqNjo+Pjo6Ni4qGf3VsaWhpbGxpZmVmZmpucnqBhouNj5CQkpCPkY2KiIiIiImLjY6Mhn51b29wcXNzcXFwbmpnY2RkYmVuf4qOj4+Pjo2LioqKiYmKinZ2dXV2dnV1dnZ2dXRzc3N0dHR2d3d4eXp5enp6ent7fHx7e3t7enp7e3p6e3t9fX19fn5/f39/fX58fHx8fX19fX19fX18fHx8fX1+fn5+fn18fHx8e3t7e3x8fHx8fHx8fH1/gISHiYqLjY6Pj4+NjYyKiYmJiYeDf3x+gISKi4qJiIqKi4yLiYiIiYmJjY+RkZGQkZGRkpKTkZGQkJGQkJGSk5OSkZGRjoyMiomIh4aEg4ODhIWGhoaGhIaIiIiIiIiHhoeHiImJiImJiYmJiYqKi42MjI2NjY2MjIuKiYmJiYmJiIqJi42Oj4+NjY2MioiDeW9qZmdqbWtpZmNlZ2hscHZ5f4SIiYyMjo6OjIuLjY2Njo+QkY+KgXdvbXJ1d3d0cXBvbWlmZWVkY2l6ho6Rj42OjIuKioqKioqKdXV1dXZ2dXV2dnZ1dHNzc3R0dHZ4d3p6e3p5eXp6enp8fHt7e3t6ent7enp7e319fX1+fn9/f399fnx8fHx9fX19fX19fX19fHx9fX19fn5+fXx8fHx7e3t7fHx8fHx8fHx8fX+ChYiKi4yOj4+Pj42MioqJiYmHhX97en+Ch4uLiomIiYqLjIuJiIiJiYqOkJKRkJGSk5OSkpKRkZGRkZCQkJGTkpGRkJCOjIyKiYiHhoSDg4OEhYaGhYWEhoeHh4eHh4aFhYWGh4iIiIiJiYmJiYmKjIyLjIyMjIyLi4qJiYmJiYmIioqLjY6Pj42NjY2KiYZ/eXFoZ2psbWxpZmVkY2Vmam1xdnp/hYeKjIyMjIyOjo6PkJGRjoqDeHBsb3d8fXdzcG9ua2hnZmVjZnSBi5CPjo6Mi4qKioqKiop1dXV1dXV1dXZ2dnV0c3NzdHR0dnd4enp7enl5enp6enx8fHx7e3p6e3t7e3x8fX19fX5+f39/f359fHx8fH19fX19fX19fn58fH19fX19fX19fHt8fHt7fHx9fXx8fHx8fHx9f4KFiYuLjY6Pj4+PjYyJiomJiYaCfHp6f4OJjIyKiYiJio2Ni4mIiIiKjI+RkZCQkZKTk5KRkpGRkZGRj4+PkJKSkJCQkI6MjIqJiIiGhoWEhISFhoaFhYSGh4eHh4eHhoWFhYOFh4eHh4iIiIiIiIqMi4uMjIuLjIuKiomJiYmJiYiKi4uNjo+Pjo6NjYuKhoWBeG5paWptcG9tZWNiY2RlaGlrb3R9goWJioyMjI6Ojo+QkZGPi4V7cWxtdX2AfHhzcG5saWlnZmVnbnqGjY+PjYyLioqKioqKinZ2dXV0dHV1dnZ2dXRzc3N0dHR1d3l6ent6enp7e3t7fHx9fXt7enp7e3x8fX19fX19fn5/f39/f318fHx8fX19fX19fX1+fnx8fX18fHx8fX18e3x8e3t7e3x8fHx8fHx8fH2Ag4aJi4yNj4+Pj4+Ni4qJiYmIhH55e32BhomLjImJiImKjY2LiYiIiImLjpCRkJGRk5OTkZGRkZGRkZGPj4+PkZGQj4+PjoyMi4mIiIaHhoSEg4WGhoSEhIaGhoaGhoaFhIODg4WHh4eHh4eHh4iIiYuKiouLi4uMi4qKiYmJiYmJiIqLjI2Oj4+Pj42Ni4qHh4Z/dWxoaG1zcm9nZGNjY2RmZWVpbHR6gYSIjIyMjo6Oj5CRkZKNiH5zbm9ze4J/e3Rxbm1ramhmZ2hqdICKjo2NjIuKioqKioqKdHR2dXR0dHR2dnZ1c3NycnN1dXZ3eXp7fHt8fH19fX19fX19fHx7e3x8fX19fX5+fn5/f35+fn5+fn19fX17e3x8fX19fX19fX19fX18fX1+fn18fXx8fHx8e3x8fHx8fHx7foGFiIqLjY2OkJCQkI2LiomJiIeCeXd5fYaJioyMioiIiIqNjoyJh4eIiYuNjo+QkpKTlJSSkZKRkZGQkI+Pj4+Qj4+Pj4+NjYyLiIeIh4aGhoWFhYWFhISFhYaGhoaGhoWEhIKChIeHh4iHh4eHh4iJiouLiYuLi4yLiomJiYmJiYmJioqKi42NjY6Oj4+LiYeHhoV7b2ZmaHByb2plZWNiZGZjYWRmanF5gIaKi42NjY2OkJGSkpGMgXdvbnJ6g4N/eHBsa21ta2hnZ2hveYSLjo+OjIuJiYmJiYl1dXZ1dXV1dXZ2dnVzc3Nzc3V2dnd5ent8fHx8fn58fH19fX18fHx8fX19fX19fn5+fn9/fn5+fn5+fX19fXx8fHx9fX19fX1+fn5+fXx8fn5+fXx8e3t7e3t7fHx8fHx8fHt+goWIio2Njo+QkJCQjIqJiYmHhH53eHyBiYuLi4uKiYiIio2QjYmHh4iKi42Oj5CSlJOUlJKQj4+QkJCQj4+Pj4+Pjo6Ojo2NjIuJh4iHh4eHhYaFhYWEhIWFhoaHh4aGhoSEgoKDhYaHiIeHh4eHiImJiYmJi4uLi4uKiYmJiYmJiYqKioqLjI2Njo6OjoyKiIiHh4N4bGZmbHByb2tmY2BhZWZkZGJkaXB5gYiLjIyNjY6PkJGRkYyDe3NucHeBhoR9dWxsbm9ta2doZ2xzfoeNjo6Mi4mJiYmJiXd3dnV2dnZ2dnZ1dnR0c3N0dnd3d3l6e3x8fX1+fn19fX19fX19fHx9fX19fX1+fn5+f39+fn5+fn59fX19fHx8fH19fX19fX5+gIB9fHt9fn58fHx7e3t6ent8fHx8fHx8e36DhYmLjo6Oj5CQkJCMiomJiIaAenh6gIWLjY2LjIuJiIiLjpCNioiJiouMjY6PkZKUlJWUkpCPj5CQj4+Pj4+Ojo6Ojo6OjY2Mi4qJiIeIiIeGhoWFhYaGhYWGhoaGhoaGhISCgoGDhIaHh4eHh4eIiIiJiYmLi4uLioqJiYmJiYmJiYmJiYqLjIyNjY2NjIuKiomJhn5zZ2VobXJzcGplYGBkaGpoZGNla3N+homLi4yMjo+QkZGRjIZ+dm9wd4CFhYB3bWtscHBvamhoa253hIuMjYyLiYmJiYmJdnZ2dXZ2dnZ2dnV2dXV0dHR2d3d3eXp7fHx+fn19fX19fX19fn58fH19fX19fX5+fn5/f35+fn5+fn19fX19fXx8fX19fX19fn5/f318e3x+fnx8e3p6enl5ent8fHx8fHx7foOGioyNj4+QkJCQkIyKiYqIg354eHyCiI2PjoyMi4qJiYyPj4yLiImKi4yNjo+SlJSWl5SSkJCQj4+Ojo+Pj4+Ojo2NjY2NjYyLiomKiIiJiIeGhYWFhoaHh4aGhYWGhoaEhIKCgYKEhYeHh4eHh4iIiImJiYuLi4uKiomJiYmJiYmIiIiIiouLi4yMjY2LiYqKioqHg3hrZmZrb3VybmhjYWZqbW5qZmZpcn6FiIuLjY2Oj5CRkZGOiIB4cXB2f4WFgnlua2xwcnJtaWlpanF+h4uNjIuJiYmJiYl3d3d3d3d3d3d3dnZ2dnV1dHV2d3d4ent9fX9/fnx9fX19fHx9fXx8fX19fX19fn5+fn5+f39+fn5+fX18fH19fX18fX5+fn5+fn5+fX18fH18fXx7e3t6eXh5enp7fX18fHx/hIeLjY6OkJGPj4+OjYuJiYiCe3d6gYaLjo6MjIuKiImLjY+PjYqJiYmKi46PkJKUlZeYlJKQkJCPjo6OkJCPj46MjY2NjI6OjYyMjIuKioqJiIeGhoaFhYeHhoaFhYaGhoaEg4J+gIKEhoeHiIiHiIiIiYmKiouLiYmJiYqKiYmIiIiIiIiJioqKi4uLi4qJioqKioqIgHRnZGdscnNwamVkaW1ydHJva251fYaJi4uMjI6PkZGRkI6JgXt1cXR8g4aFfXNsa3B0eHNsaWlqbXaAiYuLi4qJioqKind3eHh3d3d3d3d2dnd3dXV1dnd3eXl6fH1+f39+fH19fX18fHx8fHx9fX19fX1+fn5+fn5/f39/fn59fXx8fX19fXx9fn5+fn5+fn59fX18fXx9fHt7enp5eHl6ent8fHx8fYCFiIyMjY6QkY+PjoyKioqIhH54d32EiYyNjYyMi4uIiYuOj5CPiomJiYqMjpCRkpSVl5iWk5GRkI+Ojo6QkI+PjoyMjIyLjI2OjoyMi4yKiomJiIeGhoWFh4eGhoaGhoaHh4WEgn9/gYOGh4eIiIeIiIiJiYmJioqJiYmJiYmJiYiIiIiIiIiJiYmKioqKioqKioqKi4qHfW9lZGZtc3ZxamdnanF4fXt4eXyDh4qMjIyMjo+RkZGQj4qEfnVvcXqChoR/dm5qbnR5eG9ramlqb3eBh4mJiYmKioqKeHh4eHd3d3d3d3Z2d3d2dnZ3eXl7e3t8fX5/f39+fn59fXx8fHx9fX19fX19fX5+fn5+fn9/f39+fn19fn59fX19fH1/f35+fn5+fn19fn59fHx7enp6eXh3eHl6e3x8fHx9gIWJi4yNjpCRj4+Oi4qKioeAenh5gIeLjI2NjIyLi4qKi46QkY+LiYmJioyPkZKSlJWWl5eUkpGRj46OjpCQj4+OjIyMjIuLjI2NjY2NjYuLioqJiIaGh4eHh4aGhoaGhoeHhoSDgH6AgoWGh4iIh4iIiImJiYmJiYmJiYmIiImJiIiIiIiIiImIiImJiYmKioqKioqKi4qFd2xmZGdwd3ZxbGdqb3d/goODhYiKjY6Ojo6QkZGRkZCPjIeAdnBweICEg4F5cWtscHZ6dW9qaGdobniBhoiJiYqKiop5eXh4d3d3d3d3dnZ4eHh4dnd6e3x7fH19fn9/f35/f319fHx/f35+fX19fX19fn5+fn5+f3+AgH5+fX1/f35+fX18fYCAfn5+fn5+fX1+fn18e3p6enl5eHd4eXp7e3t8fH2AhYmMjI2PkZGQkI2LioqKhn54eX2CiYyMjIyMjIuKiYqLjI6Qj4uJiYmKjY+RkpGTlJWXl5WTkpGPjo6OkJCPj46Mi4uLioqMjY2Ojo6OjY2Li4qJh4eHh4eHhoaGhoaGh4eHhYSAfX+BhIaHiIiHiIiIiYmIiImJiYmJiYiIiYmIiIiIiIiGh4eHiIiIiImJioqKiomLioh/dGtmY2p0eXZua2tudH2ChoeLi4yPkJCQkJKSk5ORkI6Mh4F4cHF3f4OEgHlybWttdXp4c2tpZmVpcXuDhYiJioqKinh4d3d3dXd3d3d3d3h4eHh2d3p7fH19fn5+f39/f39/fn59fX5+fXx8fH19fn5+fn9/f39+fn5+fn5+fn5+fn5+fX1+fn5+fX19fX19fX18e3t7e3l5eXh4eHd5enp7e3x8f4GGiYuMjY+QkZGRjYyLioiDeXZ6f4aLjIyLjY2NjYuKiYmKjY+PjYqIiImMj5GQkZOUlZWVlZWTkpCPj4+Ojo+PjoyLi4qKi42NjYyOjo+Pj46OjYuJiYiIiIaGhoaGhoaGhoeEg4F9fX+ChoaIiIiIiYmJiYmJiIiIiIiIiIiJiYiIiIiHh4aHh4eIiIiIiYmJiYmJioqKioV8cmljZXB5e3ZxbWpud3+Gi4yPjo+Pj5CRkpOTkpGPjoyIg3dwcHZ+goKAfHZxb291eXp3b2lnZ2Vpc3+FiYmJiYuLeHh3d3h2eHh3d3d3eHh4eHd4eXp8fn1+fn5/f39/f39+fn19fn59fHx8fX1+fn19f39/f35+fn5+fn5+fn5+fn59fn5+fn59fX19fX19fXx7e3l5eHh4eHh4d3l6ent7fHx/goeKjI2Nj5CQkJCNjIuJhn92dXqAiI2NjIuNjo6Ni4qIh4mNj4+Pi4iJioyPkpGRk5OVlJWVlZOTkI+Pj46Oj4+OjIuLioqLjIyMjI2Njo6Oj4+OjYuLiYiIhoaGhoaGhoaGh4SDgX58fH+FhoiIiIiJiYmJiYmIiIiIiIiIiImJiIiIiIeHh4eHh4iIiIiIiImJiYmJiYmJh4N9cWVhZ3V7e3dwaWtye4SJi46Pj4+PkJGSk5OSkY+OjImDeHBwdX2CgoB+eHR0cHN3enp0bWhmY2Vte4SJiYmJiop4eHh4eXh4eHd3d3d4eHl5d3h6e3x+fX5+fn9/f39/f35+fX1+fn18fHx9fX19fX1/f39/f39/f35+fn5+fn5+fXx9fX5+fn19fX19fX19fHt7eHh3d3h3d3d2eHp6e3t8fH+Ch4qMjY6PkI+Pjo2Mi4iFfHV2fIOJjIyMi42Ojo2MioiHiI2Pj46MioqLjI+SkpOTk5SUlJWWlZSRkJCQkJCPj46MjIyKiouMjIyNjo6Pj4+QkI+OjIyKiIiIhoaGhoaGhoaGhoSCfnp8f4OFiIiIiImJiYmJiYiIiIiIiIiIiYmIiIiIh4eHh4eHiIiIiIeHiIiJiYiIiIiJh4R5bGFhbHl+e3Nram51foWKjY+Pj4+QkZKTlJKRj46MiYR6cnB0e4GEgX98eHdycnV5e3ZvaWVjY2l2gYiJiYmJiXh4eXl4d3d3d3d3d3h4enp4eXp7fH59fn5+f39/f39/fn59fX5+fXx8fH19fHx+fn9/f3+AgICAfn5+fn5+fn59fHx8fn5+fX19fX19fX18e3t4eHh4d3d3d3Z4enp7e3x8f4KHi42Ojo+Qj5COjoyLh4F6dniAhouNjIyLjY6OjYyKiYeIjI6PjouMiouMj5OUlJOTk5OTlJaWlZKQkJCQkI+PjoyMjIqLjIuLi4yNjo+Pj4+PjoyMjIuJiYiIiIiIhoaGhoaGhIJ/enx+gYWIiIiIiYmJiYmJiIiIiIiIiIiJiYiIiIiHh4eGhoaHh4eHhoaHh4mJiIiIiImJhn9yY19mdH19d21qa3F7g4mLj4+Pj5CRkpOVk5GPjoyKhXt1b3N6goSCgX98e3ZzdHd6d29pZWJiZXF+h4iJiYmJeXl6enl4eHh4eHd3eHh5eXl5eXt7fH5+fX9/f39/gIB+fn19fX19fX19fX18fH1+f3+AgH9/f39/f39/fn5+fn19fX19fX19fn5+fn18fHx7enp5eHh3dXh4d3d4eXh6e3x/g4iLjI2OjpCQkI+OjYuGfXd3e4GIjI2NjYyMjo6OjYuKiImLj5CPj42Li4yQkpOUk5OTlJSVlZWVkpCRkZGRkI+OjY2NjIuLi4qLjY2Nj4+Pjo6OjIuKiYmIiIiIhoaFhoaGhoaGg398e3x/goWHh4mJiYmJiYiIiIiIiYmJiYqKiYmHh4aGhoaGhoaGhoaGhoeHiIiIiImJioqJhnloXV1oeHx7c21ubnR+houMj5CQkJKUlJWSkI6NjIqGfndxcnl/hIOCgH+Aendzdnh3cWllZGJlbX2GiImHiIh6enp6eXh4eHh4eHh5eXl5enl5ent8fn59f39/f39/f39/fX19fX19fX19fX19fX5/f39/f39/f39/f39+fn5+fX19fX19fX1+fn5+fXx8fHp6enl4eHh2d3d3d3d3eHp6e36DiIuMjY6Oj4+Pj46MiYN3dHl9goiMjY2NjIyMjY6NjIuJiouOkJCRj42MjI+Sk5STk5OTk5WVlZWSkZKSkpGQj46Ojo6Ni4yMioyNjY2Pj4+OjYyKi4qJiIiIiIiGhoWGh4eHh4aEgH17fH+BhIaHiYmJiYmJiIiIiIiIiImJiYmIiIeHhoaGhoaGhoaGhoeHh4eIiIiIiYmKioqIgHFkXGFrd3l6dHBucXmCh4yOkJCQk5aVlZKRj42MioaAeHJzeH2Cg4GAgYKAe3R1d3d0bWdlYmVse4SIiYeIiHp6enp5eHh4eHh4eHl5eXl6eXl7e3x+fn1/f39/f39/gIB+fn19fX19fX19fX19fn9/f39/f39/f39+fn5+fn59fX19fX19fX5+fn58fXx8enl5eXh4d3V2dnZ2dnd4enp7foOIi4yNjo6Ojo2NjYuGf3V1eX+EiYyNjIyMjIuMjY2Ni4qKjI6QkZGQjo2Nj5KTlJOTk5OTlJSUlJKRkpOSkZCPjo6Pj46NjIyMjI2NjY+Pj46NjIqKiomIiIiHh4aGhYaHh4eHhoWCf359f4CDhYeJiYmJiYmIiIiIiIiIiYmIiIiIh4eGhoaGhoaHh4eHh4eHh4iIiIiJiYqKiomGfGxeXGBqcnt7dW9udH6Ei42QkZOVl5aVk5GPjYyKhoN6dXJ1e4CCgYGChoWBeXZ3eHdxamlmZWp4gYeIhoeHenp6enl4eHh4eHl5enp7e3t7fHt7fH5+fX9/f39/gICAgH9/fX19fX19fX1+fn1+f3+AgH9/f39/f319fn5+fn19fX19fX19fX19fXx9fHx6eXl4eHh1dHZ2dXV1dnd5ent9goiLjI2Ojo6OjIyMi4R7c3Z8goaKjI2MjIuLi4yNjY2Li4uMj5CRkZGPjo6QkpOUk5OTkpKTk5OTkZCRk5KRkI+Ojo+PkI+MjI2LjY2Njo+PjY2NioqKiYiIiIaGhoaFhoeHh4eHhoSCgH5+gIKFh4mJiYmJiYiIiIiIh4eJiYiIh4eHh4aGhoaGhoiIiIiHh4eHiIiIiImJioqKi4mBc2NaWmBseX13cm1xeoKKjZCTlZeYmJaTkZCNjIqGg3t1cnR6f4KCgYOHiYR9eHZ4d3Nsa2hlaHaAhoeGh4d7e3l5eHh4eHl5eXl5eXp6enx8fHx9fX19f39/f3+BgX9/fn59fX19fX1+fn19fn9/f39/gH5/f39+f39+fn5+fn5+fn59fX18fHx8fHx8e3p5d3h4d3V1dnZ1dXZ2eHl5e32Ch4qMjY2MjY2JioyIgnh0eH6Dh4qMjYyMi4qLjI2OjoyLjIyNkJKSk5GQj5CRkpOUk5OSkpOSk5ORkI+QkpKRkI+Pj5CRkY6OjYyNjY2Njo2NjIuLiYiKiYeHhoaEhIWFhoeGhoeGhoSBf4CAgoKGiImJiIiIiIiIiIiIiIiIiIiHh4eGhoaGhoaGh4eIiIiIiIiIiImJiYqKiomKi4h7Z1xZW2V3fnl0cG51foeNkJOUl5iXlpSSj4+Ni4eEfHZxc3Z8gYGChIeLiX93dnh2c25taWVmcnyFhoeGhnt7eXl4eHh4eXl5eXl5enp7e3x9fX19fX1/f39/f4CAf39+fn5+fn5+fn5+fX1/f39/f3+Afn9/f35/f35+fn5/f39/fn19fXx8fHx8fHt6enp3eHh3dXV2dnV1dXZ4eHl7foKHiouMjYuJiYmKjIiAd3Z7gYSIioyNjIyMi4yNjo6OjYyMjY6RkpKTkpGQkJGSk5STk5OTk5KTk5COjpCSkpGQkJCPkJGRkJCOjo2NjY2OjYyMi4qJiIiHh4eHhoSEhYWFh4aGh4aGhIOBgYCCgoWIiYmIiIiIiIiIiIiIiIiIiIeHh4aHh4eHh4eHh4iIiIiIiIiIiYmJioqKiYqNioNwX1dXXm14e3dyb3B4goqOkZWXmJiWlJKPjoyKiIV+d3Nwc3mAf4GCh4yMhX55eHZ0cG1qZmVtd4KFhoWFe3t5eXh4eHh5eXp6e3t6ent8fX19fX19fX9/f39/gIB/f39/f39/f39/f399fX9/f39/f4B+f39/fn5+fn5+fn9/f39+fX19fHx8fHx8e3p6eXd4d3Z1dXZ2dXV2d3d4eHp9gYaJi4yLiYiIiYqMiH52eH2DhoiKi4yMjIyLjY6Ojo6NjIyOj5CQkJKRkJCQkZKSk5OTk5OSkZKSj46OkJKSkZCQkI+QkZGRkY+Pjo6Ojo6NjIuLiomHhoaHh4eGhISFhYSGhoaHhoaFhYSDgoKChIeIiIiIiIiIiIeHh4eIiIiIh4eHhoeHh4eHh4eHiIiIiIiIiIiJiYmKioqJiouMiXlmW1ZZZHV9fXhzb3N+ho2RlZeXl5aUko+OjImIg395c21vd3x+f4CGjI6Kg3t3dnVxbmtnZml0f4SEhIR7e3l5eHh4eHl5enp7e3p6e3x8fH19fX19f39/f39/f39/gIB/f39/f39+fn19f39/f39/gH5/f39+fn5+fn5+f39/f359fX18fHx8fHx8e3t6d3d2dXV1dnZ1dXd3d3d4en2BhYiKi4qJiIiJioyIfnZ4f4WHiIqKi4yMjIuOj42Njo2MjI2OkZCQkpGQkJGRkpKSk5OTk5KQkZGPj4+QkpKRkJCQj5CRkZCQj4+Pj46Ojo2Mi4qKiYeHh4eHh4aEhIWFhIWGhoeGh4WEg4ODgoKEhoeHiIiIiIiIhoaGhoiIiIiHh4eGh4eHh4eHh4eIiIiIiIiIiImJiYqKiomKiYyKf2xeV1Zgc3x/e3ZvcXuFjZOWmJeXlpSSj42LiImDgHlybXB0enx9f4aLjo2GfHd2dXFua2dlaHF9hISFhQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvYmFsaV82NDB4MzYwX1JHQjI0LnJnYiBiL3NyYy9tZWRpYS90ZXN0L2RhdGEvYmFsaV82NDB4MzYwX1JHQjI0LnJnYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTllYmQxZS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvdGVzdC9kYXRhL2JhbGlfNjQweDM2MF9SR0IyNC5yZ2IKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdGVzdC9kYXRhL2JhbGlfNjQweDM2MF9ZVVkyLnl1diBiL3NyYy9tZWRpYS90ZXN0L2RhdGEvYmFsaV82NDB4MzYwX1lVWTIueXV2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2YxYTVkLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvYmFsaV82NDB4MzYwX1lVWTIueXV2CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotRIFFa0iAS2xMgUxtTYBObk6AUG9QgFBvUH9Rb1N/UW5TflJvUn5Sb1N+U29SflJyUX5TdFF+UXVQfU92Tn1Ndkx8SndLfEp4R31HekZ9Q3pBfkF6PoA+ejqAO3c6gTt1O4E4cjiBOHA4gThxOIE5cTmBOXA4gTlwOoA6cDmAOHA4gDpxOYA3cTZ/N3I3fzVzNX81czR/NHUygDF4MYAxeTCAMHougC56LX8teSt+K3kpfid5KX4peSh/KHwpfyl8KH4ofSh+KH0nfid+KH4ofyh+KIAnfiiAKX0pgCl9KYAqfSqAK30rgCx9LIAqfSqAK30rgCx9LIAsfSx/LH0sfyx+LH8rfit9K34rfip+KX4pfil9KX4pfSl+KX0pfil9KX8pfSh/KH0nfyd9Jn8mfSZ/JnsmfyZ7Jn8mfCZ/JnwmfiZ8Jn4mfCZ+JnwmfiZ8J34nfCZ+JnwmfiZ8Jn4mfCZ+JnwmfiZ8J34nfSd+J30nfid+J34ofih+KX4rfix/LH0tgC98MIEyezKCNHo1gzV6N4Q3ejeEOHo4hTl5OYU5eTmFOXk5hTl5OYY6eTqGOXk5hTl5OYU6eTqGOHk4hjd6NoQ2fTeDN4A6gj6CRXxKhVFzWYZhamiJbGRxiHVed4l4W3iId111iHFfbYhqYWiJaGRniWhhaohsX26Ibl1vhm9bb4VvXnCDb2Nwgm9lcX9zaHR/d2h5f3xlfn9+YH6BfmB8gnhicoNsZ2SDWWxOgkFzNIAueix8KYAreyuEK3orhSx6KoUreiuEK3ouhDR6OoFCfE97Wn1lcW5/eGZ+gYNdhoOFWYODglh9hXddbYVnYliESGo7gi90KYAleiR/JH4jfiSBJX8lfyeBKnsugjF1N4E4cj6BQ3BMgVNwXoBlbW2BdGl7gYBmgIN8YXqGdWFvh2lkYYdZZ1OET2tSglFuVINUcFGIU3FMhER1PYQ2eTCCJ3olgCOAJH4kgSJ+IoAjfiKAIn4igCF+IYAjfiGAIn4hfyB+I38lfiZ/KH4rfDB/N3c9gERwS4FQbVeDXmpjg2dqbIJyaneBeGp5gXhqd4F1anaBdmp1gXVrdYFva2uBX25XgEtxRn5BcT99P3RAe0B1QHxAdUB8QHU/ez91P30/dT1+PXY6fjl2OX45dTd+NXc1fjR2M34xdzB+MHkvfTB4M305dTx9Q3BOf1ZmXYBmW2yBcVh0g3lUe4R8VnqEelt2hXJebYZkY12HT2hFhzlvMoMseSuBKYAofyiBJ34ngSd9J4EmfSiBKH0ogil9KYIpfCuDKnwtgTB7MYAyezOANns3fjd7OH49fD58P3xDeEZ7RnZKfU50VXxcb2J8a21wfXRqeH56Z3t/fWd/f39jgYCCZIKAgmaDgINngYCBZ4GAgWiAf4BmfoB9aHuAeWp6f3ZqdH50bXh8e3B/fIBygnuDdIZ8iHSHfod0hX+DdH5+fHR6fnhzdX90cnR/eXKAgIRxhoCFcIOAg2+DgYBxfIF4dXCBZnRYg0p1PYM0dS+DLnotgCx8MH0zfzh7PX9EeE56Wndidmt5c3B4enxsgH6CaIF/gGKBgIFig4CDZIKAgmN/gX5hfYF7XHmBdlp3gXddeoB6ZHx+gWuEfYhuinyLdIt9i3SKfopzin6Kcoh+h3KHfodziH+IdYh/hneAgnl6cIRkfliBT4JIf0WDQX0+hTx8O4JG/0n/Sf9M/0z/TP9N/07/Tv9Q/1D/UP9Q/1H/Uv9R/1T/U/9S/1L/U/9T/1L/Uv9S/1L/Uf9R/1D/T/9O/03/TP9K/0r/SP9I/0j/Rf9B/0H/QP89/zz/O/88/zz/Ov84/zr/Ov86/zr/Ov84/zn/Of85/zn/Ov86/zr/Of84/zj/OP84/zj/N/82/zb/Nv81/zX/NP80/zL/Mf8x/zH/MP8w/y7/Lv8t/y3/K/8r/yr/KP8p/yn/KP8o/yn/Kf8o/yj/KP8o/yf/J/8o/yj/KP8o/yf/KP8p/yn/Kf8p/yr/Kv8r/yv/LP8s/yz/LP8r/yv/LP8s/yz/LP8s/yz/LP8s/yv/K/8r/yv/Kv8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/KP8o/yf/J/8m/yb/Jv8m/yb/Jv8m/yb/Jv8m/yb/Jv8m/yb/Jv8m/yb/Jv8n/yf/Jv8m/yb/Jv8m/yb/Jv8m/yb/Jv8n/yf/J/8n/yf/J/8n/yj/KP8p/yv/LP8t/y//MP8x/zH/Mv80/zX/Nf83/zj/OP84/zj/Of85/zn/Of85/zn/Of85/zr/Ov85/zn/Of85/zr/Ov85/zn/Of84/zf/OP87/z3/RP9L/1H/Wf9f/2f/b/9z/3n/ev98/3z/fP96/3T/cf9s/2r/a/9r/2z/bf9v/2//cP9w/2//b/9t/2z/a/9q/2r/av9r/2v/b/9y/3f/ev9+/4H/gP9+/37/fv93/3P/a/9g/1X/SP88/zL/K/8q/yv/K/8r/yv/K/8r/yz/LP8r/yz/Mf83/z//Sv9W/2H/bf93/33/gf+F/4b/hf+E/4H/e/90/2v/Xv9Q/z//M/8q/yb/JP8k/yT/Jf8m/yj/LP8v/zL/Nf84/z3/Qf9F/0r/Uv9a/2P/av9y/3z/gP+B/4D/f/96/3X/bv9k/1r/U/9P/03/VP9i/3D/Zv9W/07/Rf89/zb/Kf8j/yT/I/8j/yP/Iv8i/yP/Iv8i/yL/If8h/yP/Iv8i/yH/If8i/yT/Jv8r/y3/NP89/0P/Sv9Q/1b/XP9i/2X/bP9x/3X/ef96/3v/ev93/3X/dv92/3X/df91/3P/a/9h/1b/S/9F/0L/P/8//0D/QP9A/0D/QP9A/z//P/8//z//Pv8+/zz/Ov86/zr/N/81/zX/NP8z/zH/MP8w/zD/Mf8x/zb/PP9D/03/Vf9d/2b/bP9x/3T/ef97/3z/ev96/3f/dv9v/2b/Xv9S/0f/O/8z/y7/K/8p/yj/KP8n/yf/J/8n/yb/J/8o/yj/Kf8p/yn/K/8s/y7/Lv8w/zD/M/81/zb/OP85/zv/Pf9B/0L/RP9H/0v/T/9Y/17/ZP9r/3D/dP95/33/fv+A/4L/gv+E/4T/hv+G/4f/h/+G/4b/hP+E/4L/gP9+/33/fP97/3f/c/9y/3L/dv95/3r/ff9//4P/hP+F/4X/hf+F/4P/f/99/3v/ef95/3j/ef9+/4X/hv+G/4X/hf+C/4L/f/97/3X/bf9i/1L/RP85/zL/L/8u/y7/Lv8w/zP/OP89/0L/Tf9Y/2L/a/9z/3j/fP+A/4L/gf+A/3//gf+B/4H/gf+A/3//fP96/3f/d/90/3P/c/92/3j/ev9//4T/iP+L/43/i/+L/4v/i/+L/4v/if+I/4j/iP+J/4n/iP+G/4H/eP9u/2L/V/9O/0n/Rv9B/z7/PP87/0iBSG1JgEtvTIFMb06AT3BPgE9wUIBQcFF/UW9Rf1JyUX5Tc1J+UnNSflJ0Un5SdFF+UHVQflB2Tn1Nd0x9S3dKfEp4SHxHekV9RHpBfUB6QIA+ej2APHg7gDp2OIE6dDmBOHI5gTlwOIE5cTmBOnE5gTlwOYE5cDqAOnA5gDlwOYA5cTiAOHE3fzdyNn82czV/NXUzfzN2MoAxdjCAMHgvgC96LoAuei1/LHosfit6K34qeih+KHoofyh7KH8oeyh+KHwofih8KH4oeyh+KH0pfil+KX4pfil9KX8pfSl/Kn0qgCx9LIAsfSyALH0sgCx9LH8tfS1/LH0sfyx9LH8sfix/LH4sfSx+LH4rfip+K34rfSp+Kn0pfil9KX4pfSl/KX0ofyh9J38nfSd/J30nfyd9J38nfSZ/JnwmfyZ8KH4nfSd+KHwnfiV+J34mfSd+J3wmfiZ8Jn4mfCZ+Jnwnfid8Jn4mfCd+J30nfid9KH4ofih+KH4pfil+Kn4sfy59LoEwfDGCM3szgjR6NYM1ejWEOHo4hDh6OIU5eTmFOXk5hTh5OIU5eTmGOXk5hjl5OYc5eTmHOXk6hjl5OYY3ejeEOH07gz6AQ31Hgk93VYdecGKIamdxiHZje4h9X32Ifl57h3hedoRwYG6EbGJshGtibIRtXW6Eb1pvhG1ZbYNrWGmEZ1tlg2NfYYBeZGF+ZGdqfm1ocn53Znt/gGOCgYJggoJ/YXyDdmNxg2lmXoJRbUKANnUufCp+K3sqgip6KoUreiuFK3orhCt6K4QwejWCPXtFe1F9X3NqfnJpe4CAX4WBiFyGgoZagoN9W3iEbmJjhFRoRYM2cC2BJnckgCR9JX8mfSeALHsvgjF3NIM4dD2DPnJCg0RwSIJMbVWBXm5lf29pd4GAZoSChGODg39ieoVzYmiFYGVWhVBqToFdbWV+dXB2eG9wYHtmcXmCc3NAhSR2IYQjeyOCI38jfyOAI38igCJ+In8ifiF/In4ifyJ+I4AjfiR8JH8qei5/M3U5gUFwR4JNa1ODW2lgg2VoaoNwaHOCeGh7gX1ofIF4aHaBdmh1gXZpdoF2a3OBb2xqgWBuVIBNb0R/QHI/fT90P3s/dUB8QHU/fD91P3s/dUB9PnU9fT12PH07djp+OnU3fjV3NX40djJ+MXcvfjB5Ln0ueDJ9OHU7fUJwTX5UZ1x/aF1ugXJWdYN4VXyEfld9hHxce4V2XnGGaWNjh1ZnSoc+cDSDLncrgSl/KX8pgSh+KIEnfSeBKH0ogSh9KIApfSmAKnwrgSx8LX8wezGAMXszgDR7NX44ezl+PXw+e0B8QXdFfUp0TX5Tb1p+X2xmfmtqcn12aXt+f2iCf4Nng3+DZYWAhmWHgIdniICGaYWAhWmEgIZpgX9/an1/fGp6f3drdH5yanB8cG1xeXVwdnl5cn17f3SDfIN0hX6FdIV/gXR+fn5ze355cnp+enB7foFwhoCHcYeAhnCCgIRvgYF9cXmBcnNqglxyToE+cDWBMXMtfyx3LH4uezB9M3w3ezx8Q3pNeVd5YHRpenJxeHt8bX9+gWiBf4Fkf4CAY4CAgGN/gH9ifYF7YHiBd1x0gXJab4FvXXKAdWR4fn9shH2Jc4p8inWMfYx1jX6Nc4p+inKKfopyin6Kc4l/iXWJf4d3gIJ3emuEXn5TgU6ESX1GhkF7Pog7eTqFSf9K/0r/S/9N/0z/Tv9P/0//T/9Q/1D/Uf9R/1H/Uv9T/1L/Uv9S/1H/Uf9Q/1D/UP9Q/0//T/9N/0z/S/9L/0n/Sf9H/0b/RP9D/0H/QP8//z7/PP87/zv/Ov85/zn/N/83/zn/Of85/zr/Ov86/zn/Of84/zr/Ov86/zn/Of85/zn/OP84/zf/N/82/zb/NP8z/zP/M/8y/zH/MP8w/y7/Lv8u/y7/Lv8u/y3/LP8r/yr/Kf8p/yj/KP8p/yn/KP8o/yj/KP8o/yj/KP8o/yn/Kf8p/yn/Kf8p/yn/Kf8q/yr/LP8s/yz/LP8s/yz/LP8s/y3/Lf8s/yz/LP8s/yz/LP8s/yz/LP8s/yv/Kv8r/yv/Kv8q/yr/Kf8p/yn/Kf8p/yj/KP8o/yf/J/8n/yf/J/8n/yf/Jv8m/yb/Jv8o/yj/KP8o/yf/Jv8n/yf/J/8m/yb/Jv8m/yb/Jv8m/yf/J/8m/yb/J/8n/yf/J/8o/yj/KP8o/yn/Kf8p/yv/Lf8v/zD/Mf8y/zL/M/81/zX/Nf80/zb/OP84/zn/Of85/zn/OP84/zn/Of85/zn/Of85/zn/Of87/zr/Of85/zf/N/86/zr/P/9E/0r/Uv9Z/17/Zv9s/3P/eP98/37/ff98/3n/dv9z/27/bP9q/2r/af9o/2j/af9m/2b/Zf9m/2T/YP9e/1r/WP9V/1X/WP9c/2H/Zf9s/3X/ev+A/4L/gv+C/4H/fv98/3b/bf9i/1f/Sf87/zT/LP8q/yz/Kv8q/yr/Kv8q/yr/K/8r/y7/Mv84/0H/Tv9Y/2P/b/95/4D/hv+I/4f/h/+D/37/ff90/2r/W/9N/z3/MP8p/yT/JP8k/yX/K/8u/zH/Nv84/zv/P/9C/0T/Q/9G/0v/T/9Y/2T/bf91/37/g/+G/4b/gv99/3f/bv9j/1f/T/9X/2z/YP9p/2z/cP9r/2T/d/9//17/Sf8r/yH/JP8j/yP/I/8j/yL/Iv8i/yL/If8i/yL/Iv8j/yL/Jf8o/y7/M/87/0D/Rv9N/1L/Wf9f/2P/Z/9u/3H/df95/33/fP97/3n/dv92/3b/d/93/3f/df9w/2j/YP9U/0v/RP9C/z//P/8//z//QP9A/z//P/8//z//Pv89/z3/Pf88/zv/Ov86/zf/Nf81/zT/Mf8x/y7/L/8u/y7/Mv83/zv/Qv9K/1T/XP9m/27/cv91/3j/d/96/37/ff98/3f/c/9s/2P/Wv9O/z//OP8x/yv/KP8p/yn/KP8o/yf/J/8p/yn/KP8o/yn/Kf8q/yv/Lf8u/zD/Mf8z/zP/M/80/zb/N/85/z7/Pv9E/0n/Tv9T/1n/X/9h/2n/bf90/3j/ff+A/4P/hP+G/4b/h/+I/4n/iP+I/4j/hf+F/4P/gf+A/37/fP95/3b/dP9x/2//b/9v/3D/cP9z/3X/eP9//4P/g/+E/4T/g/+B/37/fv99/3v/fP98/37/gf+G/4b/hv+F/4T/gv+A/3v/dv9v/2b/WP9J/zv/M/8v/y//MP8u/y7/MP8y/zX/Ov9C/03/Vf9e/2f/cP93/3z/f/+A/3//f/9+/37/f/9+/37/fP97/3j/dv90/3H/bf9s/2z/bv9y/3b/e/+B/4f/if+K/4v/i/+M/4z/iv+K/4r/iv+K/4r/i/+L/4r/hf+A/3f/av9d/1L/S/9H/0X/Qv8//zz/O/9IgUltSoFKb0yBTHFNgE5xT4BPc0+AT3NRgFFyUoBSc1J/UXRSf1J1UX5RdFB+UHVQfk92UH5Pd0x9SnhKfUp4SHtHeUd7RXtDfUF7QH4/ez5/PXk8gDt3OoA5dTqAOnM4gThxOIE4cDiBOXA6gTpwOoA6cDqAOnA6gTpxOYE5cTiAOHM4gDhzNn81czV/NHM0fzN0Mn8ydTKAMXUwgDB3MIAweS+AL3ktfy15LX8teyx/K30pfyl9KX4ofCh+KHwofyh8KH8ofCh+KH0ofih9KH4pfSl+KX4pfSl/KX0pfyp9Kn8qfSp/LH0sfyx9LH8sfSx/LH0sfSx+LH4sfix+LH4sfyx+LH8sfix+LH4rfip+Knwrfit8Kn4ofil+KX4qfih+KX4pfil+KX0ofih9J34nfCd+J3wnfyd9J38nfSd9J34nfSd+J34nfid+J38nfid9J34nfCZ+Jn0nfid9J34nfid+J34nfid+KH4ofih+KH4ofih+Kn4qfyp+K38tfS2BLnwxgjF8MYMyejSDNXk1hDZ5N4Q4ejiFOHo4hTl5OYU5eTmFOXk5hzp5Ooc5eTiGOXk5hjl5OYY4eTeENns5gzp9O4JAgEV9TINTdlmFYG1miG1nc4d2YHmGe115g3Zed4JzYHCBa2NogGVkZIFkYV+DX15eg15bXoReWF+FXVZahVdZVIJSXU9+TmZPflNtWH1fb2Z9cGp6f4BlhIGDYYSChGCBhH1geIRxZWyDXG1PgkJ0OH8veyt8KoIqeyqDKnoqhSt7K4UreyyFLXoygzh6P4BJe1d2YX5tbXeAgGaHgYpjioGIYYeCg2F7hHZkbYRfaFKDQm80gSp0JYAleyWAKHkugzJ1NIM5czyDQHFDg0RuRYJEbUaCSW5OglVqX4JpaXGBemmCgYZoh4OEZYCDeWRyhWllXYRVaFyAaXBqeXF5WXNJf1JzaYZxdWOEUoBXekeGIXcgiCF6JIEjfiN+IoAifiKAI34ifyJ+In8ifiJ9Jn8oey2ANHc7gT9yRYJLblODV2pdg2JoZINpaG6BdGh5gXpqfIF8anuBeGl3gXdpd4F3aXiBd2pzgW9saoJfblSBSm9EgD9zP30/dj58Pnc/fT92P30/dj99P3Y+fT52PXw9dzx8Onc5fDl3N301dzR+M3cyfjF4MX4veC99L3kwfTZ1On1AcEt9U2dcfmVda4ByV3aCd1V5g3tWfYV7WnqFel53hnFkZ4ZcaE+HQnA4hDF3LYIrfSl/KX8ofih/J34ngCh9KIAnfSmAKH0qgCp8K4Asey2AL3owgDJ6M4AyezR/N3w5fDp9P3pEfUh0Tn9Scll/YG9kgGdqbYByZ3aAe2h/gIJohYCGZ4iAiGeKf4poiX+JaIh/iGqGf4Vqg4CAan6AfWt4fnZrdH1wbGx8a25qe2pua3ltcG96dHN7e390gnyCc4N+g3WBfn91gH5+cn19fW99fX5wgn+FcIaAhnCEgINvgoGAcH+CenJzgmxyYoNScUOCOHIygS90Ln8ueC59LnovfTJ8Nno7fEJ6TXdXeWFzaXpxcXd8emt+fYBnf4B/ZX6AfWN/gH9jfYB7YXeBdV9zgnJbbYJpXWmCaWFtgHFldn58bH9+hHOKfIp1in6KdIt+i3OJfolziX6JdIt+i3WLfop2ioCFeH+Cdnlng1p9ToFIhEd+RYhDeUCJPnk8h0r/Sv9L/0r/TP9M/07/Tv9P/0//UP9Q/0//T/9Q/1L/Uv9R/1D/UP9R/1H/UP9Q/1D/T/9P/03/TP9K/0r/Sv9I/0f/Rf9E/0P/Qf9A/z//Pv89/zz/O/87/zr/Ov86/zn/Of84/zj/Of86/zr/Ov86/zr/Ov86/zr/Ov85/zn/OP84/zj/OP83/zb/Nf80/zP/M/8y/zL/Mf8w/zD/MP8w/zD/L/8v/y//L/8t/y3/LP8r/yr/Kf8p/yj/KP8o/yj/KP8p/yn/KP8o/yj/KP8o/yj/Kf8p/yn/Kf8r/yv/Kv8q/yv/K/8s/yz/LP8s/yz/LP8s/yz/LP8s/y3/Lf8s/yz/LP8s/yz/LP8s/yv/K/8r/yv/K/8s/yr/Kf8p/yn/Kf8p/yn/Kf8p/yj/KP8n/yf/J/8n/yj/KP8o/yj/J/8n/yf/J/8n/yf/J/8n/yf/J/8n/yf/J/8n/yj/KP8n/yf/J/8n/yf/J/8o/yj/KP8o/yn/Kf8q/yr/K/8r/y3/Lf8u/zD/Mf8w/zP/M/8z/zP/Nf82/zf/OP84/zj/Of85/zn/Of85/zn/Ov86/zn/OP85/zn/OP84/zf/N/83/zj/Ov87/0D/Rf9K/1D/Wf9h/2n/b/91/3b/dv92/3T/cf9v/2z/Zv9j/1//Wv9Z/1n/WP9Y/1r/Wv9Y/1j/Wf9Z/1j/Vf9P/03/Sv9H/0X/SP9Q/1n/Y/9q/3P/e/+B/4L/g/+D/4H/gP99/3b/bf9j/1f/Sf88/zL/Lv8t/yr/Kv8q/yr/K/8r/yv/LP8s/zD/N/88/0b/U/9g/2v/df9+/4X/if+K/4j/h/+E/3//ef9y/2T/V/9H/zb/Lf8p/yn/Kf8u/zH/Nf84/zr/P/9C/0T/Rv9F/0b/Rv9M/07/Uv9Z/2T/b/93/37/g/+F/4X/gf97/3T/a/9g/1z/ZP9q/2v/Zf9X/0z/Uf9p/1v/T/9O/1b/XP9Z/1T/Jv8i/yL/JP8k/yT/I/8j/yT/Iv8i/yL/JP8o/y3/NP86/0D/Rf9L/1H/V/9d/17/Yv9o/2z/cf92/3n/ev98/3z/ev96/3f/d/93/3f/dv91/3T/cP9q/2D/U/9J/0P/Qf89/z3/Pv8+/z7/Pv8+/z7/Pv8+/z7/Pv89/zz/O/86/zn/Of83/zX/NP8z/zL/M/8x/zH/Lv8u/y//M/84/z//Sf9S/1z/Zv9t/3D/dP93/3r/e/97/33/fP96/3b/cf9p/1//Uv9H/zr/Mv8u/yn/Kf8p/yj/KP8o/yf/KP8o/yr/Kf8q/yv/K/8s/yz/Lf8u/y//Mf8z/zP/Nv85/zv/QP9G/0v/UP9V/1r/X/9k/2j/bf9x/3b/ev99/4L/hP+F/4f/h/+I/4r/iv+K/4r/if+H/4X/g/+A/3//ev94/3b/dP9v/2v/aP9n/2X/Zf9n/2r/bf9z/3v/f/+C/4L/gv+B/4D/fv9+/37/gf9//3//gP+D/4b/h/+G/4T/g/+E/4D/ff94/3L/af9e/0//QP83/zH/Lv8t/y7/Lv8v/zL/Mv82/zv/Q/9N/1j/Yf9p/3H/df96/33/fv9+/37/fv9+/33/e/96/3n/d/9z/23/bf9r/2f/Z/9n/2r/bv9x/3j/f/+E/4f/iv+K/4r/iv+K/4n/if+I/4j/iv+L/4v/i/+I/4X/fv91/2j/W/9O/0n/R/9E/0P/QP8//0D/S4FLbkuBTW9NgU1uTYBPcE+AT3JQgFByUIBQcVKAU3JRf1F0UH9QdVB+UHZPfk93UHxPeE18TXlLfUt6SX1Jekh9RntFfUR8Qn5Bez9/Pns9fz15PIA7djuAO3Y5gDlzOIE4cTmBOXA6gTpwOoE6cDqAOnA6gDpwOoE6cjmBOXI4gDhzOIA4czd/NnU1fzV1M38ydTF/MXcxgDF3MYAxeDGAMXkwgDB5L38ueS1/LXssfyx7K38reyp+Knwqfip8Kn8qfCl/KXwqfip9KH4ofSl+KX0qfip+Kn0qfyp9Kn8rfSt/LH0sfy19LX8tfS1/LX0tfy19LH0sfix+LX4tfix+LH8tfi1/LH4sfix+LH4tfi1/K34rfyx+LH4qfip+K34rfil+KX4pfil+KH4ofih+KH0ofih9KH4ofih+KH4ofyh+J38nfyd+KH8ofih/KH4ofSd+JnwmfiZ9J34nfSh+J34nfid+KH4ofih+KH4ofih/KH4pfyp+Kn8rfit/LH0sgCx8LYEvfDCCMXoygzN7M4Q0ezaENno3hTl6OYU4eTiGOHk4hjh5OIc6eTqHOHk4hjl5OIY2eTaGNXk1hDZ5N4M4fDqCPn9Cf0eCTndXhF9uZ4RtY3GCb15vgW1fa4FoX2d/YmRegVhkV4FUZFOEUmJVhVVgV4ZXWViGWFRWh1ZUVYRQW0uBRmVCfT5wPHxBdUd7UXZdfWZub393ZX+BgWGFgoVhgoSBYoCEe2Zzg2lrXoJQcUKANncwfSx/LHsqgyt6K4UreyqFK3srhSx7LYQ0ezmBQntPe1t9aHN0fnxthICJZ4uBiWKHgoZigoR8ZXSEamldg09sPoExbyuCK3MvgjR0N4M5cDyDPm5Cg0NtRYNGbEaDR2xHg0lsTINQbFiBYG1qf3Jte3+Ba4SBhWmDgXxndYRsZ2KDXmxgf1N3W3lOf1V2VINFdU+FU3ZKgkZ6RHljf2puZINacSWAIXkkfySAJH4kgiR+JIAjfyR/Jn8pejCAM3Y4gT9xRYNMa1GCVmlbg15oYINlammBbWlxgHNpdIF3a3qBemt6gXlqd4F2anaBd2p4gXhrdYFxbWuCYG9SgUpxQ38/cjx9PHQ9fD12Pn0+dz59Pnc+fT53PX09dzt8O3c8fDp3N3w3dzh9Nnc0fjN3Mn4yeDF+MHkufi96Ln0zeDd8PnNIfVFqW31jYGx/cVh0gnZUeIJ6V32Eflt8hXpgeIZ0Y2uGYWdSh0duPYU0dTCDLHwpfyh/KH4ofyh+KH8pfSl/K30rgCt9LIAsfCx/LXsufy57L34xezR8Nnw6eT99RXVJgE9yUoBXblyBYWxmgWlpboFzaHWBeGh+gIJohYCHaIeAh2aHgIhmi3+LZ4p/iWuIf4Vtgn9/bX1/e213f3NucHxub2t7aW5oeGRsYndjbGd4aXBueXRze3t/doB8gnSCfoBzgH6Ac399fnKBfIBvgH2Cb4V/iG+IgIZvhYCEbYOBgG99gndxcYJlcFmES289gzZyMYEtdC5/Lngtfi56MXw0ezh7PXlGek92WHlgcml7cWx2fHxofX19Y32AfGF9gHxgfYF5YXeBd2RzgW5ha4JqYWeCZmNjgGNkZX9qaHF9d25+fYRzh3yKdIp+inKJfolxiX6JcYh+iHSLfot1jH6LdYmBg3d9g3R6ZYRaf1KASoZIe0eJRHlCiUB5P4hK/0n/TP9M/03/TP9Q/07/T/9P/1D/UP9Q/1D/T/9Q/1H/Uf9Q/1D/UP9Q/0//T/9P/03/Tf9N/0v/Sv9K/0j/Rv9E/0P/Qv9A/z//Pv89/z3/Pf89/zz/O/87/zr/Ov84/zj/Of85/zr/Ov86/zr/Ov86/zr/Ov86/zr/Of85/zj/OP84/zj/N/82/zX/Nf8z/zL/Mf8x/zH/Mf8x/zH/Mf8x/zD/MP8v/y7/Lf8t/yz/LP8r/yv/Kv8q/yr/Kv8q/yr/Kf8p/yr/Kv8p/yn/Kf8p/yr/Kv8q/yr/Kv8q/yv/K/8t/y3/Lf8t/y3/Lf8t/y3/Lf8s/y3/Lf8t/y3/Lv8u/y3/Lf8t/yz/LP8s/y3/Lf8r/yv/LP8s/yv/K/8r/yv/Kf8p/yn/Kf8o/yj/KP8o/yj/KP8o/yj/KP8o/yj/KP8n/yf/J/8o/yj/KP8o/yj/J/8m/yX/Jv8n/yf/KP8n/yf/J/8o/yj/KP8o/yj/KP8o/yn/Kv8q/yv/K/8s/yz/LP8t/y//Mf8x/zH/Mv8z/zP/Nf81/zb/OP84/zj/OP84/zj/OP84/zn/Of84/zj/OP83/zX/Nf80/zX/Nf82/zb/Of89/0H/Rf9L/1P/Xv9l/2j/aP9m/2b/Zf9k/2L/Xf9a/1X/Uv9T/1L/Uf9S/1L/Uv9W/1b/V/9X/1b/U/9Q/03/R/9B/z3/OP83/zn/Qf9K/1f/Yf9r/3P/ff+A/4L/hf+C/4L/gP98/3b/b/9l/1n/R/86/zL/Lv8s/yr/K/8r/yv/Kv8r/yv/K/8s/zH/N/8//0v/WP9k/3H/fP+D/4j/iv+I/4f/hv+C/3z/df9t/2L/Uv9B/zT/L/8v/zL/Nv85/z3/P/9C/0T/R/9G/0f/R/9I/0j/SP9L/1D/Vv9b/2X/bf91/37/gv+E/4L/fP94/27/Y/9g/1X/Tv9H/zr/Q/9A/zX/Of86/z7/QP9D/0v/VP9d/1P/I/8j/yT/Jf8l/yT/JP8k/yb/Jv8q/y7/Nf87/z//R/9M/1H/WP9a/13/YP9j/2b/Z/9r/2//cf9z/3X/ef95/3r/ef92/3X/dv91/3b/dv91/3D/aP9e/1H/SP9B/z3/PP88/zz/PP89/z3/Pf89/z3/Pf88/zz/O/86/zn/OP83/zf/N/81/zT/M/8y/zL/MP8v/y//Lv8u/zL/OP89/0b/Uv9a/2P/a/9x/3b/df93/3v/ff99/3z/fP97/3T/bP9i/1f/S/88/zT/Mf8t/yn/KP8q/yr/Kv8q/yr/Kf8r/yv/K/8s/yz/LP8u/y//L/8y/zX/OP89/0L/Rf9L/1D/VP9Z/17/Y/9o/23/cP9z/3b/fP9+/4L/hP+H/4f/hv+H/4j/iP+K/4r/iv+J/4b/g/+A/33/ef91/3H/b/9s/2r/Z/9k/2H/X/9g/2P/Z/9q/27/dP95/33/f/+A/4D/f/+A/4D/gP+A/4P/gv+C/4X/iP+J/4j/hv+F/4T/gP+B/33/dv9u/2P/V/9K/zz/N/8z/y7/L/8v/y7/L/8x/zX/OP8+/0b/T/9b/2P/av9w/3f/e/99/37/ff98/3z/e/96/3j/df9y/2//av9n/2b/Y/9i/2D/YP9k/2n/cP92/37/hP+H/4r/iv+K/4n/if+J/4n/iP+K/4j/i/+M/4v/iP+F/37/dP9n/1n/Uf9L/0j/R/9E/0L/Qf9A/0uBS25OgU5uTYFNbU+AT25PgE9wUIBQcVB/UXNRf1F0UX5PdVB+UHVQfVB1T31Pdkx8THdNe0x4TX1Ke0h9RnxFfUN/Qn9Bfz9/P3w/fz17Pn89eTyAPHc8gDx2O4A7dTuBO3I6gTpxOoE6cTqBOnE7gDtwO4A7cDqAOnE6gDpyOIA4cjeAN3Q3gDR0NIA0djOAMngygDJ4MYAxeDKAMngygDJ4MIAweDB/MHoufy56LX8seyx/LHsqfSp5KX0peyp+Kn0qfip9Kn4qfSh+Kn0pfil9KX0qfip9Kn4rfSt/Knwqfyx8LH8sfS1/LX0tfy19LX4ufS5+Ln0ufi59Ln4ufS5/Ln0ufy19LX4tfS1+LH4sfSx+K30rfit+K34rfit9K38pfSl/KX4pfil+KH4pfyl/KH8ofyh/KIAnfyeAKX4pgSh+KIEofiiAKH4ogCh+KH8ofih/KH4ofih+KH4nfid+KH4ofih+KH4ofih/KH4ogCh+KYAqfiqAK34rgCx9LIErfSyBLXwtgjB8MoIxezGDMnsygzR5NIQ1eTaEN3k3hzh5OIc3eTeHN3k3hzd4N4U2eDaFNXg1hTR4NIUzeTWFNno4gjp8Pn5DgEp5Un9Zb1+BYmhkgGJmYIJgYl6DXGVag1dmVINSZlCDUGNRhlNeVIdUXFWHVVdWhVZVU4RQV02CR2FDfTttNXwxdjJ7NHw7e0V7UHxccmh/cWt5f35jg4GCYYODgGCAg31jd4NwaGqDXm5QgUF1Nn8veyt8KoEqeyqEKnoohCp6KoUreiuEL3o3gjx8Rn1UfWB2bX94coCAhmqHgYhlh4GGZYOCgWZ5hHBpZYRZa0qEO280gzNwNoM5bzuEP29EhEZtR4NHbEiDSGxJg0lrSYNIa0mDTG5RgVZvX39nbnF+em5/f4FqgYF9aXWBbWpkgWBvVIFVdleARH07fjKCQ31agS98LX8wekF4UXtFcU1/THE4giJ3JYElfiWAJYEkgCR/J38qfDCANHc7gUFyRoJMblKEVmtbg15oX4NiaGSCZWlpgmppaoBsa3F/dGt2gHhseIB4a3OAc2l1gXRpdIF0a3KBbW5pgV9vUYBIcUB+PHI7fDp1O3s7djt9O3g6fTt4O307eDt9O3g6fTl4OH04eDd8Nng1fTN2NH4yeDJ+MngxfTB5MH0ueS99MXk5fT11RHxOa1p+YWJpgHFadYF2V3iDelZ8g3xafIN8YHmEdGNshWNoWoZNbUCEOHMxgi18K4Apfil9KX8qfih/K34rfyt9LH8sfCyALXwvfi98L38yfTZ8On8+eESASHNOgFNuWIBeamOCaWlrg29oc4N1Z3yCfWh/gYNlhICEZYaAhmaGf4hniX+JaYmAiWqJf4ZuhH+Bb3x/d290fnBvanxob2Z5Y25heF5sXXdfamN3Z2tpeG1wb3p1c3t8f3N/fYBzf31/dX59gXWAfIFyhHuDb4V8h2+Jf4ptiH+GboaBg3CDgoBwfIJ1b2yFYW1UhUZtO4M3cDSCMHQvgDB4Ln4weDJ8Nno9e0J4SHtSc1x7ZHBpfHBteH58aX1/fWR+gX1hfIF7X3eCdWFxgm9lbINnYmSDX2FcglxlXIFcamF9aW5ve3ZzfXqFdYl9iXWKf4lyiH6IcId+h3GIfop0i36LdY1+jHeJf4R3fIJzeWeEXH1RgUqGSXtGikV5Q4pBeECKTP9M/07/Tv9N/03/T/9P/0//T/9Q/1D/UP9R/1H/Uf9S/1H/UP9Q/1D/UP9P/03/TP9M/0v/TP9K/0j/SP9G/0T/Qv9A/0D/P/8//z7/P/8+/z3/PP88/zz/PP87/zv/O/87/zr/Ov86/zr/Ov86/zv/O/87/zv/Ov86/zr/Ov84/zj/N/83/zf/NP80/zT/M/8y/zL/Mv8x/zH/Mv8y/zH/Mf8w/zD/MP8w/y7/Lv8u/y7/LP8s/yr/Kv8q/yr/Kv8q/yr/Kv8q/yr/KP8q/yr/Kf8p/yr/Kv8q/yv/K/8q/yr/LP8s/yz/LP8t/y3/Lf8t/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y3/Lf8s/yz/LP8r/yv/K/8r/yv/K/8r/yr/Kv8q/yn/Kf8p/yn/Kf8o/yj/KP8o/yn/Kf8p/yn/KP8o/yj/KP8o/yj/KP8o/yj/KP8o/yj/KP8o/yf/J/8o/yj/KP8o/yj/KP8o/yj/KP8p/yr/Kv8r/yv/LP8s/yv/LP8t/y3/Lv8u/zD/MP8x/zH/Mv80/zT/Nf83/zf/OP84/zf/N/83/zf/Nv82/zX/Nf80/zT/M/8z/zP/M/80/zb/Of89/0L/Sf9O/1X/V/9W/1f/Wv9b/1v/W/9a/1r/Vv9V/1P/U/9T/1P/VP9V/1X/V/9Y/1b/Vf9S/0//Sf9D/z3/Nv8w/y3/Lf8y/zf/QP9L/1b/Y/9t/3b/ff+C/4D/g/+B/4D/f/96/3P/bf9j/1b/Sf87/zL/Lf8q/yr/Kv8r/yr/Kf8q/yv/K/8u/zL/Of9E/1H/Xv9n/3T/ff+D/4f/iP+H/4b/g/+B/3z/c/9r/1//Uf9D/zn/N/86/z3/P/9D/0X/Rf9H/0f/R/9H/0n/Sf9J/0n/Sf9J/0n/Tv9X/2D/av9z/3n/f/+B/3b/aP9r/3D/ZP9d/13/W/9N/0X/Qv9X/1n/KP8r/zT/PP87/zf/Pf9E/0v/J/8l/yX/Jf8l/yb/KP8q/zD/Nf86/0D/R/9M/1L/V/9c/13/YP9i/2T/ZP9n/2X/Zf9m/2n/bP9w/3P/dv92/3b/c/9z/3X/dP91/3X/cv9t/2b/XP9Q/0f/QP88/zn/Of85/zr/O/87/zr/O/87/zv/O/87/zr/Of86/zr/N/82/zX/M/80/zL/Mv8y/zD/L/8v/y7/L/8y/zf/PP9E/07/WP9i/2n/cf91/3b/eP96/3z/fP98/3z/ef9z/27/Zv9b/07/Q/84/zL/K/8s/yz/K/8r/yr/Kf8r/yv/K/8s/y3/Lv8u/zD/Mf8z/zn/Pf9D/0j/Tf9R/1f/XP9g/2b/av9u/3H/dv96/3z/fv+A/4D/gv+E/4T/hv+G/4b/h/+I/4j/iP+H/4b/hP+B/33/d/9z/2v/Z/9l/2H/YP9c/1z/XP9e/2L/Zf9o/2v/bv9w/3T/ev9+/3//fv9+/33/fv+B/4H/g/+G/4b/h/+J/4n/if+I/4b/hf+F/4L/f/98/3X/bP9h/1T/Rv89/zj/Nv80/zL/MP8w/zL/NP85/z7/Rv9M/1X/Xf9l/23/c/93/3z/ff98/33/fP96/3f/df9y/23/av9l/2L/X/9b/1n/Wf9Y/1r/YP9q/23/dv9+/4X/iP+J/4r/if+I/4j/h/+H/4f/if+M/4v/jP+M/4j/gv98/3P/Z/9d/1L/TP9K/0b/Rf9D/0D/Pv9NgU1uToFObk6BTm5PgE9vT4BPcFCAUHFQf1F0UX9RdVF9UXVRfVF2T3xPd058TnhNe016S3pIe0l8R31EfEJ+QX1AfUB/QH0/fz97P38/ej5/PXg8gDt2PIA8dTyAPHQ8gTxyO4E7cTuBO3E6gTpxOoA6cjuAO3I6gDpyOYA4czmAOXU3gDd2NoA1dzSAM3gygDJ4M4AzeDKAMngxgDF4MYAweS6AMHkxfzF6L38vei9/L3otfyx6LH8seSx/LHsrfit9Kn4qfSp+Kn0qfip9K30rfSt9K30qfSp+Kn0qfyt8K38rfCt/LH0sfy19LX8tfS1+L30vfi19Ln4vfS9+Ln0tfy59Ln8ufS5+LX0tfi1+LH4tfix+K34rfit+K34qfip/Kn8qfyl+KH8ofiiAKX8pfyl/KX8ofiiAKH4ogCl+KYEpfiiBKH4ogCh+KIAofiiAKH4ogCh+KH8ofih/KH4ofyh+KH8ofih+KX4pgCl+KYApfimAKX4qgSp+KoEsfSyBK30rgSx8LIItfC2CL3svgi97M4MzejSDNXo0hDV5NYU2eTaFNnk2hjZ5NoY0eDSFNXg1hTR4NIUzeDKFMXkxhTJ6NYI3ezuAP35FekuBT3NVglZsVYNZaFuEW2RchVtjWoVXZFeFVWVWhVZjVoZWYFeHV15Yh1daVoVTWE+CS15GgD1pN3wxdix7Knwrey5/M3s7fkZ8UHddf2dwcX94aYGBgWODg4Bgf4N+YHuDd2Rwg2lrXYJQckGAM3kufSp/Knspgip6KoQpeimFKnoqhSx6MoQ5ekCAS3xXeWR+bnJ5gIBrh4GIZIeAhmKEgYFlfIJ0aG2EZWpXhEpsQoQ/bj6EQG9DhEZuR4RHbEmDSWxKg0psSoNKbEiDSGxGgUZwRX9HcE19V3BjfG1wd318bn1/c29rf2VyaX9gc2V+ZHhgfVZ/QX08gUN9On8xfyp6Mn4udyx9MHQ8fkFvYoMybiWFJXYmgyZ8KIEtfDCANnY6gUByRoNMcFOEWGtag15oX4NiamOCZGxkgWRtYoFhb2N+ZG9qfm1wcn90bnOAdGt0gHNpc4FzanOBc2xwgW1wZYFbcFCARHQ9fjl1OHw4eDh7OHk5fTp5O306eTp9Ong6fTp4OX05eDh9OHg3fTV5NX40eDJ+MnkyfjF5L34wejB9L3swfTF5Nnw7dEV8TWxYfWFjaX9wWnWBdld4g3lZeoN7XXyDfF95hHhicYVoZ1+GU2xEhDpzM4IueS2ALX4rfSt/LH4sfyx+LH8tfi5/Ln4vfTF+M3k5fz13QX9Gc0yBUG9WgltuYYNlbGqDbmlygnZneYJ8Z3+CgWaBgYFkgX+CZISAhWWEgIVmh4CHaYd+h2uHfIZshH2Abnx/e29zf2pvZ31ib116W29ZeVpsXXdfaWN2ZWpodmttbXhwcHN6dnN6fHxzfX19c319fXN+fYFzg3yEcoh7hm+JfIptin+KbIh/h26FgYNwg4KBcHyCdW9rhWBtU4VGbT6DOXI4gjV1NIAxeDF+NHg3fT11RHtKc1N8WXBhfGZtbn11a3p/fWZ+f3xifIF7YXuBeGJzgnBlaoJnZWGBX2ZaglhpU4FSbVN9VnBee2h1bXl3eIB6hnaJfIpziX6IcYh+hnCGfodxh36JdIp+i3aLfol2hn+CdH2Cc3Vog1x5UoJNhUh9R4pEe0OKQXlAik3/Tf9O/07/UP9Q/0//T/9P/0//UP9Q/1H/Uv9R/1H/Uf9R/07/Tv9N/03/Tf9N/0z/TP9K/0j/R/9F/0L/Qf9A/z//P/8//0D/QP8+/z3/Pv89/zv/PP88/zz/PP88/zr/Of87/zv/O/87/zr/Ov86/zr/Of85/zr/Ov85/zj/N/83/zf/N/82/zX/NP8z/zL/Mv8z/zP/Mv8y/zH/Mf8x/zD/Lv8w/zH/Mf8x/y//L/8v/y3/LP8s/yz/K/8r/yr/Kv8r/yv/Kv8q/yr/Kv8r/yv/K/8r/yr/Kv8q/yr/K/8r/yv/K/8s/yz/Lf8t/y7/Lv8t/y3/Lf8u/y//L/8u/y3/Lv8u/y7/Lv8t/y3/Lf8t/y3/LP8r/yv/K/8r/yv/K/8q/yr/Kf8p/yn/Kf8p/yn/Kf8p/yj/KP8o/yj/Kf8p/yn/KP8o/yj/KP8o/yj/KP8o/yj/KP8o/yj/KP8p/yn/KP8o/yj/KP8p/yn/Kf8p/yn/Kf8p/yr/Kv8q/yr/Kv8r/yv/LP8s/y3/Lf8v/zD/Mf8w/zD/Mf80/zP/Nf81/zb/Nv82/zb/Nv82/zT/NP80/zT/M/8z/zL/Mf8w/zD/Mf80/zb/Ov8+/0T/Sf9O/1H/Vf9W/1r/W/9b/1z/XP9c/1n/Wf9Y/1j/WP9Y/1f/V/9a/1j/V/9U/1L/Tf9H/0H/Of80/y7/Kv8p/yv/Lf8w/zf/QP9L/1f/Yf9s/3X/ff+B/4L/gf9//37/ff95/3T/bf9k/1X/R/86/zD/K/8q/yr/Kv8q/yr/Kv8q/yr/Kv8w/zf/Pf9F/1P/YP9q/3f/fv+D/4b/hv+F/4T/gf98/3f/b/9o/2D/VP9K/0X/Qv9E/0X/R/9I/0j/Sf9J/0r/Sv9L/0v/SP9H/0L/Qv9C/0L/Rf9Q/1v/Z/90/3T/b/9p/2b/bP9n/2X/Z/9l/1j/Sv9D/0D/R/85/zH/Mv8z/yz/Of88/0X/Sf9j/0v/Jf8l/yj/Kv8s/zH/OP87/0H/R/9M/1L/Vv9Z/17/X/9h/2H/Y/9k/2X/YP9d/1z/XP9e/2T/aP9u/3H/dP91/3T/c/9z/3P/c/9z/2//av9k/1r/TP9B/z3/O/84/zj/N/83/zj/Of85/zj/OP84/zj/OP83/zf/Nv82/zb/Nf81/zX/M/8y/zL/Mf8v/zD/L/8u/y7/Mv82/zv/RP9O/1n/Yv9p/3D/df92/3j/ef96/3v/fP98/3z/eP9y/2n/X/9T/0n/PP83/zH/L/8v/y3/Lf8t/y3/Lv8u/y//L/8x/zP/N/87/0H/Rv9L/0//Vf9b/1//Zf9q/27/cv91/3f/fP9+/3//gf+B/4H/gf+B/4L/gv+E/4X/hv+F/4X/hv+G/4P/g/+B/37/ev91/23/Z/9g/1v/WP9Z/1r/XP9f/2L/Zf9o/2v/bP9v/3H/dP93/3v/e/99/33/fP9+/37/gf+D/4b/if+J/4n/iv+K/4j/h/+H/4f/h/+E/4L/fP91/2r/X/9S/0X/P/86/zn/Nv81/zX/NP83/zv/Qf9I/1D/Vv9c/2P/av9z/3j/ff9//3//fP98/3z/ev93/3P/bf9o/2D/W/9Y/1X/Uv9Q/0//T/9T/1z/Zv9t/3f/gf+I/4n/if+J/4j/h/+G/4b/h/+H/4n/iv+K/4j/h/+F/4H/e/9z/2j/Xv9S/03/SP9G/0P/Qv9A/z//TYFNak+BT2xRgVFuUYBQb0+BT3BPgU9xUIBQc09+T3VQflB2T3tOeEx8THhLe0l6SntJekd7Rn1Ee0J+QXxCfkB+QH8/fz99P38/e0B/QHo9fz14PX88dj2APXU9gD10PIA8czuBO3M6gjpxOoI6cTqAOnE4gDhxOIA4cjmAOHI3gDdzNoA2dTaANXU0gDR3M4AzeDOAM3gygDJ5MoAweTKAMnkwgDJ6MoAyezCAMHsvgC55LoAteSx/LHosfyx8LH8sfSt/K30qfSp8LH0sfCt9KnwqfSp9Kn0qfit8K34reyt/LH0sfy19LX8ufS5/Ln0ufi59Ln4ufS5+Ln0vfi99L38ufS5/Ln0ufy19LH8tfS1/LX0sfyx9LIArfSt+K34rfyp+Kn8qfiqAKX4pgCl+KYApfimAKX0pgSh9KIEpfimBKX4pgSl9KYEpfSmBKH0ogSh9KIAofSh/KH0ofyh+KH8ofih/KH4ogCl+KYEpfieAKX4pgCl/KoEqfyqBK30rgSt9K4ErfCyDLHwtgy18LYIufC+DL3sxgzJ7M4QxejSENXk1hDZ5NoU1eTWFNHgyhTR4M4UzeDGGMngxhC55L4UyezWDNnw5gT5+RHpIgkx0UYRVbliEXGhehl5lXYZeY12GW2NZhllhWYZZYFiFV15ZhlhdWYZUXFOET11Jf0JmPX02ci57K3soeih/KXsqgy57NIA7fUZ6Un5edWh/cWt5gIBlgYGBYn+Cfl59gntidoNwZ2iCXG1OgUBzNH8teyp7KYAqeyqDKXsqhCp6KoUqei6DNns6gUJ7UHxcfWh1cX58boKAhWyFgIVng4B/ZH2Be2Z1g25qZIRaa1GES2pGhEZpRoNIaUiDSWtJg0lrSoNKa0qDSW1HgkRvPoA8cjt/PXRAfEp0Vn1jcnR+aXRofml1Z35jdmZ+ZHhgfV57Qn0zfEyBU3hYhDxxQIhSbVOJRG08gzpwQ31IcFh9ZmlVgjxqJIQsdDCEOHU9gkJzRYRLblGHV2pbh11qZINma2WCZWxlgmBtXIFcb1d+VXBWfFlyXXxkc2p8cXB0f3ZrdIFzaHOCdGlygnBrbIFpbWKBV29KgEBzO342dzZ9Nng2fDd5OHw4eDh8OHg3fTd4N303eDZ9Nnk2fTZ5NX00eTN9M3kxfi96L34xejB/L3ovfi17L3wxejR7OnVDe01uVn1fZmd+b190gXdad4N5WnuDe1x7g3tffIR5YnOFbGdhhlZsSoU9cTeDNHcwgS96L38vey9/L30ufy98MH8yejWBOndAgUVyS4JRb1eDXGtgg2Vpa4RtZ3KEdGV5g3tlfoF+Y3+AfmJ+gH5igICAZIGAgmWDgINnhICDaYR/hG2DfoRvg32CcIB+enF2fnFwaH5fb1l9Vm5WelltXHlfbGN2ZmppdWtobXVubG93cW90e3dye3x7dHt9e3N7fX1yf3yCc4R8iHKKeotvjHyMbot/iWyGgIZuh4CHcIOCgXF7gnRuaoVebVKFSW5BgzxxO4M6dDiAOHU4fzt0Pn5Fckx9U3FZfmBuZn5tbnR/emt8f35nfYF9ZHyBe2F3gnRib4NsZmOBXWZWgFNrT35NcEl8SHNMelF2WndleG14eHqCeod3in2Kcol/iHCGf4Zxh3+Gc4h/iXWJf4l2iH6HdIR/fnN5gXF0aoRfeFSCToRIf0WJQ3xBiz96PotN/03/T/9P/1D/UP9Q/0//T/9P/0//T/9Q/1D/T/9P/07/Tv9O/03/TP9L/0v/Sv9J/0f/Rv9E/0L/Qf9A/z//QP9A/z//P/8//z//QP9A/z//Pv89/zz/Pf89/z3/Pf88/zz/O/87/zr/Ov86/zr/Ov86/zr/Of85/zr/OP83/zf/N/82/zb/Nv81/zT/NP80/zT/M/8z/zP/Mv8y/zP/Mv8y/zL/Mv8x/zH/MP8w/zD/L/8u/y3/LP8s/y3/Lf8s/yz/K/8r/yv/K/8s/yz/LP8r/yr/Kv8q/yr/K/8r/yv/K/8s/yz/Lf8t/y7/Lv8u/y7/Lv8u/y7/Lv8u/y//L/8v/y7/Lv8u/y7/Lf8s/y3/Lf8t/yz/LP8s/yv/K/8r/yv/Kv8r/yr/Kv8p/yn/Kf8p/yn/Kf8p/yn/KP8o/yj/KP8p/yn/Kf8p/yn/Kf8o/yj/KP8o/yj/KP8o/yj/KP8o/yj/KP8o/yj/Kf8p/yn/J/8p/yn/Kf8q/yr/Kv8r/yv/K/8r/yv/K/8s/yz/Lv8u/y3/Lv8v/zD/Mf8w/zH/Mv8y/zL/M/8z/zP/M/8y/zL/M/8y/zH/Mf8x/zD/Lv8v/zL/Nf82/zn/P/9F/0r/Tv9U/1j/Wv9c/1//X/9g/2D/Xv9c/1v/W/9b/1v/Wf9Y/1n/W/9Y/1b/Uf9M/0X/Pf82/y//Kv8p/yn/Kf8p/yn/LP8w/zf/Qf9M/1j/Yv9u/3X/ff+A/4H/gP9+/37/ff95/3P/bf9j/1X/Sf85/zD/Kv8p/yn/Kf8o/yn/Kv8q/yr/Kv8w/zf/Pv9J/1f/ZP9u/3f/fv+D/4T/hP+D/3//f/98/3f/cf9r/2H/WP9Q/0n/R/9H/0j/SP9J/0r/Sv9K/0r/S/9K/0X/QP88/zn/Nv85/zv/Rf9T/17/cP9v/2//a/9p/2X/YP9d/1n/U/9N/0n/Sv9M/1P/YP9g/1//X/9Y/0v/Qf84/yv/O/9S/27/bv81/yj/N/88/0L/Rv9O/1n/Wf9b/2D/bP9p/1T/Tf9W/2H/W/9b/2H/Uv9Q/1D/Vf9a/2H/af9w/3X/df90/3P/dP9y/3D/b/9u/2j/YP9V/0n/P/84/zX/Nv82/zX/Nv83/zf/Nv82/zb/Nv82/zb/Nf81/zT/NP8z/zP/Mv8y/zL/MP8v/y//L/8u/y7/Lv8v/zD/NP86/0P/Tf9W/1//Z/9v/3T/d/95/3f/ef97/3v/e/98/3n/c/9t/2P/Wf9M/0D/Ov82/zL/Mf8x/zH/Mf8x/zH/M/80/zj/Pf9E/0n/UP9U/1z/YP9m/2n/bf9y/3X/ef98/3//f/9+/33/ff99/33/f/+A/4D/gP+B/4P/g/+D/4L/gv+C/4L/gf9//3//fP95/3T/bP9k/13/WP9X/1n/XP9e/2L/Zv9p/2v/bf9v/2//cP9y/3b/ef98/3r/e/97/3z/fP9//4L/hP+I/4v/i/+M/4z/i/+J/4f/h/+H/4f/g/+B/3v/dP9q/17/UP9H/0P/P/8+/z3/O/87/z7/QP9D/0r/Uf9Y/13/Zf9q/3H/dv97/37/fv99/33/ff97/3b/cv9t/2b/YP9Z/1L/Tf9K/0X/Q/9D/0j/Uf9c/2X/cf98/4T/iP+H/4j/if+I/4b/hv+G/4f/iP+J/4n/if+G/4X/gv9+/3f/c/9p/1//VP9N/0f/RP9C/0D/QP8+/06BTmpPgU9sT4FPbk6ATm9Pf09wT39OcVB+UHNRfVB1Tn1Odkx7THlKe0p6SXtIfEd6Rn5DekF+QHtAfkB9QH4/fj59P38/fD+AP3s/fz56P38/eD5/PXY9gD11PIA8dDyAPHM8gTxzOoE6cTuBO3E6gDpxO4A7cTqAOXI4gDhyN4A3dTeANnY1gDZ3NYAyeDOAM3g0gDR4M4AzeTSANHkzgDN5MoAyejKAMXsxgDF7MIAvey+ALXstfyx6Ln8ufC1/LX0sfyx9LH0sfCx9K3wqfSp8Kn0qfSp8Kn0rfCt+K3srfyx9LH8tfS1/Ln0ufy59Ln4ufS5+Ln0ufjB9MH4vfS9/Ln0ufy59LoAsfS2ALX0tgCx9LIAsfSx/LH0sgCp+LIErfiqBKX4pgCl+KYApfimAKX4pgCl9KYEpfSmBKX4pgSh+KIEpfSmBKH0ogSh9KIEofSiAKH0ofyh9KIApfimAKH4ogCh+KIApfimBKn4qgCl+KYApfSmBKn0pgSp9KoEqfSqBK3wrgit8K4IrfSyCLHwtgi97L4Mvey+DL3owhDF5MYQxeTGFMnkyhTF4MoUyeDGFMXgwhC94LoMweTGDMXs0gjl9PH5Af0d4TIJSclaEWmxehF5mX4ZgYmGGYWBghl5gXYZdYl2GW2FZhVlgW4ZaXliFU19OgkdkQn86cDN8K3koeyl9KXwpgSl7KYMqey6AM3s7e0Z9U3Zef2lydIB6bH+BgWSBgn9hf4F+YHuDd2Zvg2drW4JOcT6AM3kqfCl/KXspgyp7KoQqeiqFKnoqgy97NYE8e0R+U3xgeGx9dnF8gIFug3+DaYOAgGd/gXxpeIF1a2+DZ2pchFJoS4RIaUiDSGtJg0tsS4NLbEuDSmxIgkVuQYE8cTh/MnQyfjF2Nn1BdVB9X3RhgG50aYBSeGh+ZHlaflR5UoBHeVGAUXpKflF2WX9hb2KBYW5hgWBwXX9Vcj99NG88e0lrW3tyanKDOmo2hT5uSYZMbmOGbWlohWNpbYR3bEqET29LgVRxWoJbb1mAV25KfklyS31OdFZ8YHRpf3FwdX93a3WBd2h0gnNpc4Jxa2uBaG1egVNvRoA8czZ+NHczfTN5NHw0ejV8NXo0fDR6NH00eTV9NXk1fTV5NX0zeTJ9MnkxfTJ5MH4wei9+Lnosfi56Ln4vey59L3o0ezp2Q3tMblV8XmZnf25hc4J3XneDelt4g3ldeoN7X3yEfGJ0hW9nZIZaalGFQ287gzZ3NoEzejJ/MnsyfzN6Mn83djp/QHNGgE1xVYFZbWCCZWlrg29ndIN3Z3qEfGWAg4Bjf4N+Yn+BfmN9gH1lf4B/ZX5/f2WAf4Bmgn+CaYJ/gWyAf4Buf359b319e3F4fnRzcH5ocGR+W29ZfVpuWnpdbWF4ZmppdWxob3RvaHF0cmtyd3Rwdnt5c3x+fXR8f3xzfH17cn98g3OFfIlzinqNcI18jW6Lf4lsh4CHboaAhnCDgoFye4Jyb2qFXG1QhUluRINCb0GDQXA/gkFwQYBGbkmBUWxWf11rYn9oa29/dWt5gH9ofYB+ZH6BfWN7gnhkdIJwZWqCY2hbgVNrTIFGckN+P3c9fD97RHdPflt2Z35zd357hHuIdYh/iHOJf4dyhX+Fc4Z/h3SIf4l1iH+Hd4R+gnSBf31zeYFzcmuDYXZVg02ARYBCh0F9P4c+ez6ITv9O/0//T/9P/0//Tv9O/0//T/9P/0//UP9Q/0//Tv9M/0z/S/9L/0r/Sv9I/0f/RP9C/0D/QP9A/z7/Pv8+/z7/Pv8//z//P/8//z//Pv8//z//P/89/z3/Pf88/zz/PP88/zz/PP86/zr/O/87/zr/Ov85/zn/OP84/zj/OP83/zf/N/82/zX/Nv81/zX/Nv81/zP/M/80/zT/Nf81/zP/M/8y/zL/Mv8x/zH/Mf8w/y//L/8v/y7/Lf8u/y7/Lv8u/y3/Lf8s/yz/LP8r/yv/K/8q/yr/Kv8q/yv/K/8r/yv/LP8s/y3/Lf8u/y7/Lv8u/y7/Lv8u/y7/MP8w/y//L/8u/y7/Lv8t/yz/Lf8t/y3/LP8s/yz/LP8s/yz/LP8s/yz/Kv8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/KP8o/yn/Kf8o/yj/KP8o/yj/KP8o/yj/KP8o/yn/Kf8o/yj/KP8o/yn/Kf8q/yr/Kf8p/yn/Kf8p/yj/Kf8p/yn/Kf8r/yv/K/8r/yr/K/8s/y3/Lf8t/y7/L/8v/zD/Mf8x/zH/Mf8x/zH/MP8x/zH/MP8w/y//L/8u/zD/Mf8y/zb/Ov89/0P/R/9P/1T/Wf9c/17/YP9h/2L/Y/9j/2H/X/9f/1//XP9b/1v/Wv9a/1r/Vf9O/0v/Q/89/zX/Lv8q/yf/KP8o/yj/KP8o/yn/LP8w/zf/Qf9N/1j/ZP9u/3b/ff9//4D/f/99/37/ff95/3P/bP9h/1T/Rf83/y3/Kv8p/yn/Kf8p/yr/Kv8q/yr/Lf8z/zn/Qv9N/1v/Zv9x/3v/gP+C/4T/gv9//4D/ff96/3X/cP9p/2D/V/9Q/03/Sv9K/0n/S/9L/0v/Sv9J/0b/Qf89/zj/NP8v/y3/LP8x/zv/Uf9p/3L/c/9t/03/Xf9h/1f/Vf9P/07/UP9N/0f/Qv9O/1b/Yv9g/1j/Vf9Y/13/VP89/zn/Qv9U/17/cf9a/0z/T/9b/23/fv93/4D/av9o/1v/Wf9i/23/cP93/3T/ZP9c/1D/QP9B/0r/VP9f/2v/c/91/3f/dv92/3T/c/9z/3H/a/9o/17/U/9G/zz/Nv80/zL/Mv8z/zP/Mv8y/zL/Mv8z/zP/M/8z/zP/M/80/zP/Mv8y/zH/MP8v/y3/Lv8u/yz/Lf8t/yz/LP8t/zP/OP9A/0j/U/9c/2j/b/9z/3f/eP94/3n/ef96/3v/e/97/3T/bv9p/13/U/9H/z7/OP83/zb/Nf81/zX/Nv86/z//RP9K/0//V/9e/2T/af9v/3T/eP96/4D/gf+C/4D/f/9+/33/fP98/33/ff9+/37/f/+B/4H/gf+B/4H/gf9//33/ff9+/3r/ef93/3P/cf9u/2f/Yv9c/1n/Wf9d/2H/Y/9n/2z/bf9w/3L/cv9y/3P/df94/3v/ff99/3r/ev97/3z/f/+D/4j/iv+N/4//kP+O/4z/h/+H/4f/hv+G/4P/gf97/3L/av9c/1L/Tv9I/0b/Rv9G/0X/R/9J/0v/T/9X/17/Y/9m/2z/cv94/3z/fv9+/37/ff97/3v/ef90/23/Zv9e/1j/T/9H/0H/Pf85/zr/PP9G/1L/XP9o/3f/gv+G/4j/iP+I/4j/h/+F/4X/h/+H/4n/if+I/4f/hf+C/4D/e/92/3L/a/9h/1X/Tf9F/0H/QP8+/z7/Pv9PgE9tToBObU+AT29PgE9wUH9Qb09+UHBOfk1xTn1Md0t7SnhJe0h7RnpGfUZ6RH1CekJ/QHtAfz9+P38+fj5+PX49fT5+Pn0/fz97QIBAeT6APXY+gD51PYE9dD2BPXM8gTxxPIE8cTuAOnE8gDxxO4A7cDuAO3A4gDhxOIA3czeAN3Q2gDZ1NYE1djWBNXg1gTV5NYE1ejWBNHo1gTV6NIE0ezOBMnsygTJ6MoEyejGAMHowgDB6MH8uey9/MHsufi19LX0sfSx9LXksfSx6LHwsfCx7LH0reyp8KnsqfSt7K34sfCx+LXwtfy18LX8tfC19L3wvfTB8MH4wfDF+Ln0ugC59LoAtfSyALX0tgC59LoAtfS2ALX0sgCx9LIAsfSx/K30rfyp+KoAqfiqBKX0pgCh9KIAofSiBKH0ogSh9KIEofSiBKX4pgip+KoIpfSmBKH0ogCl9KYEofSiBKX0pgSh9KIEofSiBKX0pgSl9KYEpfSmBKX0pgSl9KYEqfSqBK30rgSt9K4EqfSmBKXwqgS18LYItfC6CLnougy56L4MveTCEMXgxhDF4MYQweDCEL3gvhC93MIMueC+DMHkxgzN9N4E9f0F7RoBMdFCDVm5ahV5pYIViZWSGZWBkhmRcYYRiXWGFYWBfhVxgW4VaXlmEWV5Ug09jRn8/azl8L3YqfCh9J3wogid8JoImfCeDJ3wqgy58NYA8fEh8Un5ddWd/cW16gH1nf4KAYX+Bf2B9g3pidoRwZ2aDWXBMgT12M34sfCp8KoEqeyqEKXophCp6KoQsezGCNns9fUl8V3xjfW13d31+cYB+gmyCgH9qf4F8Z3qAdmt1gmxsZ4ReaVWET2hLg01rTYNNbk6CTW1KgUduQoE+cDqANHIxfyt1Kn4qdi5+OXZQf3F3gYB+dnh/ZXxgf1x+R35Zell+VXdRgVJ3ToBMd01/SHdRf1Z4WX5Mekx9XHZffEtrR3xBaCp5RmlMfl1pVH9PbluCbnN0f29vgIBzb22BaHFte2x2ZXZweXp2gnRxemptXHxGbj19S3FVfGFybH9zcHd/d2t4gXhpdoF0aXODcWpug2dtXYNQcESBOnIzfjF3MHwweTF7MXoxezF5MnsyeTF8MXkxfDB4MHwxeTF9MXkvfDB5L34teS19LXotfSx6LX4seit+LHosfTB5Mn04eD57R29SfFxoZX5uZHKBdmB3gndeeYN7XnuDe2F6g3pjd4NyZmuGYGtWhUhwQIM8czmANng2fzh5OX87dEKAR3JMgVNuW4JhbGiDbWhyg3VnfYR/ZIKEg2SDg4NigYJ+X3+CfGF9gX1ifH99ZH5+fWZ/fn9ngH6BaX9+f21+fn1tfX56cXp9eXF3fnVycn5wcm1+Z3Bifl1tXHtdbV94Ym5ldWlqbnNvaXFzcmlydHNsdHd2cnl7fHZ8fH11en16dXt9fXR/fIN0iHuLc457kHCRfY1uioCIbIiBiG2GgYZvg4GBcHyDcm1ohl1rVIZQa02ES2tMhExrS4NMak6DUmlYg15qYoNlaGuBbmZzgHhlfYF+Y3yBfWJ8gXxieYJ3ZXKDbGdlhF1rUYNIb0CBOnU3fzd7N3o+fkd3U4Bidm5+eXmBeId8iXSKfohzh3+GcoZ/hnSGf4Z2iX6IeIV+hHeDfoF0f397cXeBc3BshGJ1VoRMfEaBQYM/fj6GOno5hk//T/9O/07/T/9P/0//T/9P/0//Tf9O/03/TP9L/0r/Sv9J/0n/SP9G/0P/Q/9B/z//P/89/z3/Pf89/z7/Pv8+/z7/Pv8+/z//P/9A/0D/Pv89/z7/Pv89/z3/Pv8+/z3/Pf88/zz/PP87/zz/PP87/zv/O/87/zn/OP84/zf/Nv82/zb/Nv81/zX/Nf81/zX/Nf81/zX/Nv81/zX/Nf80/zT/NP80/zT/NP8y/zL/Mf8x/zH/MP8w/y//MP8v/y7/Lv8t/y3/Lv8s/y3/LP8s/yz/LP8s/yv/Kv8q/yr/K/8r/yz/LP8t/y3/Lf8t/y3/Lv8v/y//MP8w/zD/MP8u/y7/Lv8u/y3/Lf8t/y3/Lv8u/y7/Lf8t/y3/LP8s/yz/LP8r/yv/Kv8q/yr/Kv8p/yn/Kf8p/yj/KP8o/yj/KP8o/yj/KP8p/yn/Kf8p/yn/Kf8o/yj/Kf8p/yj/KP8p/yn/KP8o/yj/KP8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yr/Kv8o/yj/KP8o/yr/Kv8p/yr/LP8s/y3/Lv8u/y7/Lv8v/y//MP8w/zD/MP8w/y//L/8v/y//Lf8t/y//MP8x/zT/Nf85/z//Q/9J/07/VP9a/17/YP9j/2X/Zv9m/2b/Zf9k/2H/YP9g/1//W/9a/1r/Wv9X/1H/TP9C/zz/M/8t/yr/KP8n/yj/J/8m/yb/Jv8n/yn/Lf8x/zj/Q/9N/1n/Y/9t/3f/fP9+/4D/f/99/3z/fP94/3H/bP9f/1P/RP82/y3/Kv8q/yj/KP8p/yn/Kv8q/yr/Lv80/zn/RP9S/1//av9y/3v/fv+A/4L/f/+A/37/e/95/3X/cP9q/2H/WP9R/03/TP9M/0z/TP9L/0f/Q/8+/zr/Nf8v/yv/KP8n/yv/L/81/1T/c/98/3z/e/9v/1//Vv9I/0b/Vv9W/1H/Vf9b/1L/S/9U/1z/W/9q/1L/Sf9a/2T/Zf9a/0f/Qv9G/0v/T/9K/1j/Zv9f/2z/bf9x/2//gP97/2z/Z/9s/1//W/9w/2b/Z/9L/1X/QP9I/1f/ZP9u/3P/d/93/3j/eP94/3f/dv9z/27/Z/9d/1D/RP86/zL/MP8v/y//MP8w/zD/MP8w/zD/L/8v/zD/MP8w/zD/MP8w/y//Lv8u/y3/LP8s/yz/LP8r/yv/Kv8r/y3/Lv8x/zf/Pv9H/1H/W/9l/27/dP94/3j/eP94/3n/ev98/3r/ev93/3H/a/9i/1j/Tv9F/z//Pf85/zj/PP9A/0T/SP9P/1f/Xv9l/2n/cP90/3n/fv+C/4P/hf+C/4L/gP+A/3//f/98/3v/e/96/3v/ff98/37/fv9+/4D/fv98/3r/ef94/3b/dv91/3T/c/9y/3D/bv9o/2P/X/9f/2D/Yf9k/2f/av9u/3D/cf9y/3P/dv92/3j/ev99/3z/e/96/3r/e/99/3//g/+I/4v/jv+Q/47/jf+J/4f/iP+I/4j/hv+D/4H/e/9z/2r/X/9Y/1T/U/9Q/1D/UP9R/1L/Vv9a/1z/Yv9m/2r/b/9x/3b/ev9+/37/ff98/3z/fP95/3b/bv9o/2D/Wf9O/0T/PP84/zT/NP83/z7/Sf9W/2T/cP96/4L/h/+I/4j/iP+H/4X/hv+G/4j/if+J/4f/hP+E/4L/f/99/3n/eP9x/2z/Yv9W/0z/Rf9A/z7/Pf86/zn/T4BObU+ATm1PgE9tToBOb01/TG9Lfk1wTH1Lckp8SHdJe0h5RXtEfEN7Qn9Aez9/O3s7fzx8PH86fjx/PH48fj1+PX0+fz59Pn8+ez+AQHk+gD52PoA+dT2BPXQ9gT1zP4E/cz2BPXM8gDxyPIA8cjyAO3I7gDpyOoA4czeAN3Q3gDd0N4A3dTaBNnY2gTZ4N4E3eTWBNHo1gTd6NoE2ezWBNXo1gTV6NIE0ezSBM3sygDF8MYAxfDB/MHsxfzB7MH4veS59LXksfi16LX0tfC18LXwseyx9LHsrfSt7K34reyt+K3wrfix8LH8tfC1/Lnwvfy98L38vfC+AL3wugC59LoAufS2ALX0tgC59LoAufS6ALn0tgCx9LIAtfSyAK30rfyp9Kn8qfSqAKn0qgSp9KoAofSqAKH0ogSd9J4EofSiBKH0ogSl9KYIpfSmCKH0ogSh9KIAnfSiBKH0ogSl9KYEpfSmBKX0pgSl9KYEofSiBKH0ogSh9KIEpfSmBKX0pgSl9KYEqfSqBKX0pgSl8KYEpfCqCK3wrgix6LIMuei+DL3kvgzB4L4QweDCELnkuhC93L4MueC6DLnovgzF7NoE2fz19QYFHeEyCUnFYgl1qYINjZWWFZl9nhmldaoZnXWaEY15hhV9fW4VaX1qFWGBXhFZjUIFGaT1+OHIvfCp7KHwngCh8KIInfCaCJnwmgyd8J4MrfC6CNXw9f0l9VHhefmlxcX55a3yAf2V+gXtifIN8YX2EeGdwg2VtW4JKdDuAMHorfSl/KHoogil6KYQqeiqEKXsrgzJ7OIFCe0x+WHxkeW99d3J9f39tgX9/anyAe2d7gHpndoJzaG6EZWtbhFRqToNMa0qDTGtKgkdtRIFAbjt/NXIwfyl0KH0kdyJ9J3krfzZ6WX5ienR9d3t4fG9/YH1TgEx+Snlaf1tzVIBVdWF/X3pTflR+Wn1cfV58XXZTelRxXnhsb2R5VGlKek1lXnhOZVF8YGlpgmtvdYFyc2Z+a3VveFt7SXRHglRxVoFdcVJ7WHJTdFF0UnFNd0tyVnxkcm5/dHB3f3drd4F2aXeBd2l2g3Nqa4NobFyDUG9DgTlyMn4udy19LXstfC18Ln0tfC59LnwvfC96L3wvei59LnoufS56Lnwtey5+LnssfSx7LH0seyx9LHoqfSt6LXwvejF8N3g+e0dyUHxaa2V+bmRxgXVgeIJ4XniDeF55g3xhe4N7Y3iDc2ZuhGdoXIRPbEeCQnA/gDxzPYBCc0h/TXBSgFdrYYFnamyCcmZ3g3xkgIOEY4ODg2KCg4NigYKBZH+BgGV9gX1keoB6Znl+eWh5fXppe3x7a3t8e218fXtuen13bnJ+c25zfXNucn5zcHJ+cHBufWluZn1ibGB5YGtkdmVsaXNsbG9ycWtycnNqdXN2bnd3enJ8e312fH17dXp+enV7fX10gHyEdIl7jHOOe49wj32NboqAiGyJgYluh4GGcYOBgXB7g3NrbIViaFyFWGdYhFdmVYRVZlaEWGZbhF5lYYNnZGyDb2VygnVkeYF8Y36BfmN9gXxie4F7YnmCdGVuhGZoXoVTbEqDQHI4gTN4MX0zfTd5QH9Mdlh9Z3dze315hHeHfolziH+IcId/hnKFf4Z0iH+Idoh+h3eDfoN1gX59cnx/eHF1f3Jwa4JiclaFTHpDgz+BPH86hTl7OYVP/07/Tv9O/03/Tf9N/03/TP9L/0v/S/9K/0n/R/9G/0b/Rf9F/0P/Qf8+/z7/Pf87/zv/Ov86/zr/O/88/zz/Pf89/z7/Pv8+/z7/P/9A/z7/Pv8+/z7/Pf89/z3/Pf8+/z7/Pf89/zz/PP88/zz/PP88/zv/Ov86/zn/Of85/zf/N/83/zf/Nv82/zb/Nv83/zf/N/83/zj/OP82/zb/Nf81/zX/Nf80/zT/NP8z/zL/Mv8y/zH/Mf8x/zH/MP8v/y//Lv8u/y3/Lf8t/y3/Lf8t/yz/LP8s/yv/K/8r/yv/K/8r/yv/LP8s/y3/Lf8u/y7/Lv8v/y//L/8v/y//Lv8u/y7/Lf8t/y3/Lv8u/y7/Lv8u/y3/LP8s/y3/LP8r/yv/Kv8q/yr/Kv8q/yr/Kv8q/yn/Kf8o/yj/KP8o/yj/KP8o/yj/Kf8p/yn/Kf8o/yj/KP8o/yf/J/8o/yj/Kf8p/yn/Kf8p/yn/Kf8p/yj/KP8o/yj/KP8o/yr/Kv8p/yn/Kf8p/yr/Kv8p/yn/Kf8p/yn/Kv8r/yv/LP8s/yv/Lf8v/y7/L/8u/y7/Lv8t/y3/L/8v/y7/L/8u/zH/M/83/zv/Qv9H/0z/Uv9W/13/X/9j/2b/Z/9p/2v/a/9q/2f/Zv9j/2H/X/9d/1v/W/9Z/1f/Uv9J/0P/O/80/y3/KP8n/yf/KP8m/yf/KP8n/yb/J/8o/yj/LP8x/zn/Qv9O/1j/Y/9t/3b/ev98/37/e/98/3z/e/93/3L/av9g/1D/Qv81/yz/Kf8o/yj/Kf8p/yr/Kv8p/yr/L/81/zz/R/9V/2P/a/9z/3r/fv99/37/ff99/3v/e/95/3X/cP9o/1//Vv9R/03/Sv9J/0n/Rf9B/zz/N/8w/yr/Jv8j/yL/IP8k/yr/O/9f/2H/Zv9r/3H/bf9l/0z/Rv9V/1v/XP9W/1T/WP9b/1n/T/9Y/1L/Uf9a/1j/Xv9g/2f/af9i/1L/QP9W/07/RP9l/37/ef9u/2b/X/9W/17/S/86/zj/Pf9R/1b/SP9Q/1P/R/9G/0f/S/9W/2T/b/91/3f/eP94/3f/ef95/3f/df9s/2n/XP9Q/0P/Of8w/y3/K/8r/yv/K/8s/y3/Lf8t/y7/Lv8u/y7/Lf8t/y3/Lf8t/yz/Lf8t/yz/LP8s/yz/K/8r/yr/Kv8s/y3/Mf83/z7/R/9Q/1r/ZP9t/3H/df94/3j/eP94/3f/ev96/3r/d/90/2//aP9e/1L/Sv9F/0D/Q/9G/0v/UP9X/1z/Yf9o/23/dP94/33/gf+E/4X/g/+C/4L/gf+B/4D/fv9+/33/ff96/3r/eP94/3f/ef96/3r/ev96/3r/eP93/3X/c/9x/3H/cf9x/3L/cv9w/2//a/9m/2L/Yv9j/2T/Zv9p/2z/b/9x/3L/c/92/3b/d/96/33/ff98/3v/ev96/3v/ff+B/4X/if+M/4//kP+Q/43/i/+J/4f/h/+H/4b/hP+C/3v/c/9s/2L/Xv9a/1n/WP9Y/1j/Wv9b/13/YP9n/2v/cP9y/3P/eP99/37/fv9+/33/fP97/3v/ef90/2z/Zf9b/1H/Rf87/zX/Mv8y/zP/Of9C/1D/X/9q/3b/f/+G/4j/if+I/4j/h/+G/4b/h/+I/4j/iP+H/4P/gv9//3v/eP94/3b/c/9s/2P/Vv9M/0P/P/87/zn/Of85/0+AT2xPgE5sTYBNbk6ATG9LfktvSn1Jckh8R3VGfEZ3RHtDe0J7QH49fDx+PH07fjd9N385fTl/OH46fjx+PH4+fj18Pn8+fD6APns/fz95PoA+dj+AP3Y+gT51PoE+cz2BPXI+gT5yPIE8cT6BPnE9gDtwO4A7cTmAOHE4gDdzN4A3dTeAN3Y2gDZ2NoA2dzWBNnc3gTh6NoE2ejaBNno0gTZ6NYE1ejWBNXo1gTR6M4AyejKAMXowgDJ6MoAyejB+L3sufi97L34sey19LHwtfC19LXstfi16LX0reit+LHssfit7K38tfC1+LXwtfi58Ln8vfDCALnwugC58LoAvfC+BL3wugS59LoAufS6ALX0vgC19LIAtfS2ALH0rgCp9KoEqfSqBKX0pgSl9KYEqfSqCKX0pgil8KYIqfCqCKHwogil8KYIpfCmCKX0pgil8KYIofCqCKXwpgSh8KIEpfSmCKX0pgil9KYIpfSmCKH0ogSh9KIAofSiAKX0pgCl9KYEpfSmBK3wrgSt8K4EreyuBKnwqgit7K4IrfCyDLXotgy16LYMueS6DLngugy54LoMvdzCEMHkwgjJ8MoA3fjt9P4FGeEyDUXJVg1xtYINhZ2OEZ2NqhWpgbYRtYGmEZ19mhGNgYYVeYFuFW2BahFdhU4FPZkd/PW43fjB4K3wogSh8KIInfCaDJnwngyZ8JoMofCmDKXwqgy98NIA8fUd8VH1edmh+cm54gHtofIB7YHuCfWB8gnljdINtaGWDV29IgTp1MH4pfCl8KYIpeymDKXsqgyl8KYMufDKBOHtCf059XHlofm9zd398bn1/fGp9gHxmfIF7ZXqCeGh0hG1qYoVZalKETGtJg0lsRoJCcDuANnMzfit1Jn0jeCF9IHojfiN6KIA7fE2BVXpofWZ8Y3xcfVl9Mn5Aflp2W39XcVJ/XXhRf1B/WnxWflp7VXlQe152W3pXdF56YG9qeWVsV3c0a092TmpOdm9pb3xyamR/Ym5nglhwWoJXeE1+OHs9eEd3Q3RRcVd2RHA6eDZ2P3pNd1t9Z3VwfnZweIB4a3mAeWd4gXhodoJ0a26DaW1fg09wQoE4cjB+KncrfSt8LHwrfSt8K3wrfCt8Knwqeyt8LXssfSx7K30qeip9KnwpfSt8LH0seyp9KnsrfSl8K30rey18LXswezd4PntGclB7WmtjfWxkcYB3YXeBeGB4g3hgeIN6YnuDe2N4g3ZlcINpZ2CDVmpOgkduRoBIcE5/Um9ZgF1pZIFpZ3CCdWV6gn9ng4KGZIWChGKBgYBhgYGAYoCBgGJ9gH1je4B5Z3Z9dml1fHRodHt1anV5d252e3Zvdnx3b3V+cm5xfnFtcH5xbnF9cm9zfXFvb31rbWh6ZG5jeGNuZHVnb2lzbG1vcXFrcnFza3Zydm94dnpzfHp9dX19e3V6fnp1e31+dYF8hnWMeo9zj3yRcJB+i22JgIltiICKb4iAh3CGgoFvfYN2aWuFZGNhhV5iXIRbZVyEXGVfhGFhYoRlYGmDbmFzg3dkd4N7Y32CfWR9gX1lfIF7ZXuDemZ3g3JmbIRlaFmFTm1CgzlyNIAyeTJ7NH08eEZ8VHZje254enqEeYd1in6JcYh/h3GGf4Vzhn+Hc4h/iHWIfoZ1g36Acnx+eXF4f3hxdoB0cG6DZXBYhU14Q4Q/fzuAOYI5fDqCT/9P/0//Tf9M/0z/S/9K/0v/S/9J/0j/R/9G/0X/Rf9C/z//Pv87/zr/Ov86/zn/N/84/zn/Of85/zv/O/87/zv/Pf8+/z7/P/8//z//P/8+/z7/Pf89/z7/Pv8+/z7/Pf89/z7/Pv89/z3/Pf89/zv/PP87/zv/Ov85/zj/OP83/zf/N/83/zb/Nv82/zb/Nv82/zf/N/84/zn/Nv82/zb/N/81/zX/Nf81/zX/NP8z/zP/M/8x/zH/Mv8x/zH/MP8w/zD/Mf8w/y3/Lf8t/y3/Lf8t/y3/Lf8t/yz/LP8t/y3/LP8s/y3/Lf8t/y3/Lv8u/y7/Lv8t/y7/Lv8u/y//L/8v/y7/Lv8u/y7/Lv8u/y7/Lf8s/yz/LP8s/yv/Kv8q/yr/Kv8p/yn/KP8o/yn/Kf8q/yr/Kf8p/yr/Kv8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/KP8o/yn/Kf8p/yn/Kf8p/yn/Kf8o/yj/KP8o/yj/KP8p/yn/Kf8p/yn/Kf8r/yv/K/8r/yz/LP8q/yr/K/8r/yv/K/8r/yv/Lf8t/y7/Lv8u/y7/Lv8u/y//MP8w/zL/M/83/zv/QP9F/0v/Uf9W/1r/Yf9k/2X/af9r/2v/bP9s/2n/av9p/2b/Y/9g/17/W/9Z/1j/Vv9Q/0n/QP85/zH/Lf8q/yn/KP8o/yf/Jv8m/yf/Jv8n/yb/Jv8o/yn/Lf8y/zf/Qf9O/1f/Yv9u/3X/ev97/3z/e/97/33/e/93/3H/af9e/07/P/80/yv/Kv8o/yn/Kf8p/yn/Kf8p/yr/MP81/z3/Sv9Y/2H/bP90/3v/fP99/37/ff97/3v/fP96/3X/b/9m/1//Vf9O/0r/Rv9D/z3/N/8y/yz/J/8j/yH/JP8i/yL/I/8+/2D/Xv9S/1b/X/9e/1z/Vf9S/1L/Vf9a/1z/Xf9U/2D/XP9M/0v/Wv9f/17/Z/9T/0r/W/9j/2D/XP9W/0b/V/9L/1L/Z/9f/2T/Y/9n/2X/Zf9l/2T/Uf80/zr/SP9F/0P/Qv89/y//Of9D/1D/W/9o/3H/d/94/3j/eP94/3j/eP92/3T/bv9q/1//UP9B/zf/MP8q/yr/Kv8q/yn/Kv8r/yr/Kv8r/yv/LP8q/yr/Kv8p/yn/Kf8p/yn/Kf8p/yn/KP8o/yn/Kv8q/yv/LP8u/zL/N/89/0X/Uf9b/2P/av9y/3X/d/94/3j/eP94/3j/e/97/3n/df9w/2r/Yv9Y/1H/Tf9M/1L/Vv9c/2D/Zv9s/3P/d/99/4H/g/+E/4P/g/+C/4H/gP+A/3//f/9//3z/ev95/3f/dP9y/3D/b/9w/3L/dP9z/3L/cv90/3b/df90/3D/cP9v/3D/cf9y/3L/cv9t/2r/Zf9i/2L/Y/9k/2f/af9s/2//cf9y/3P/d/93/3j/ev99/3z/e/97/3r/ev98/33/gf+G/4z/j/+P/4//jv+L/4n/if+I/4f/iP+J/4f/g/99/3b/a/9k/2L/X/9d/1v/Xv9e/2H/Y/9m/2r/b/9y/3b/ef98/33/gP9//33/e/97/3v/e/95/3b/cP9r/2H/Vf9K/z3/N/8z/zH/Mv84/z7/S/9Y/2T/c/99/4T/h/+K/4r/iP+H/4b/hf+G/4f/iP+I/4f/hf+B/37/ev95/3j/d/92/3T/bv9l/1j/TP9E/z3/Ov84/zn/Ov9PgE9sTYBNbE1/TWxLf0luSH1HcUd9R3RFfER2RHtBeD58PXs7fDp7OXw4fTh9N302fTd/OH06fzt+O347fjt+O348ez1/PXs9gD16PoA9dz6APnY+gD51PoE+dD6BPnI8gT5yPYE9cj2BPXE9gTxxPIA8cTuAO3I6gDpzOYA4dDeAN3U3gDd2NoE2dzeBN3g3gTd4N4E3ejeBN3o4gTh6OIE4ejeBNno1gTR6NYE1ejSAM3szgDN7MoAyejGAMXowfzF7MX4vei98LnoufC17LXstfC16LX0seix9LXotfi18LX0tfC1/LXstgC17LYAtfC1/LnwugC58LYAufC+ALnwugS98LoEtfS2ALX0tgC59LoAtfSyAK30rgCx9K4AqfSqBKX0pgSh9KIEpfSmBKH4mgCh+JoApfiiCKn4qgil8KYIpfCmCKXwpgil8KYEpfCmCKXwpgil8KYEofCiBKX0pgih9KIIofSiCKX0pgih9KIEofSiAKH0ogCh9KIApfSmBKX0qgSp8KoErfCuBK3srgSt7K4IreyuCK3srgyt6K4Mtei2DLXktgy54LoMueS6FMHgwhDJ7Mn84fjx7QYBHdkuCUXJVhFptX4RkaGaDaGRrhG1ibIRuX26EbFxphGpaZIRhYF6EXWBahFdiV4RTZU+BRWs8fTVyLnsqeyp8KYEofCiCJ3wngyd8J4MnfCeDKHwogyd8J4MsfC+ANH09fkh9U3hefmpycX93bHqAeWN6gnxffIJ7YnmDcmZwg2RsVYFEcjh/L3orfCmAKHsogyh7KIMofCiDKXwvgTN7O35HfFR4YH1ndHJ+eG57f31qf4B/Zn2BfWV9gnxod4JzamuEYGpVhE9rRYNCbD6AOXE0fit0KX4keSF9IXsjfyF8IH8ve2WBZ3pbgUZ4TIBkdl2AVnZTf1F2VX9VdlJ/RHdOfl99aX5SgkJ8ToFYelSAV3pefFZ7WXhbe1tzWHpVcVV4U3BQeEJvSHZXb113aG5ee2ZwY39mdGt+Xns8ejJ4RXpDdD17RHNFfDd4MXw6fUN8UX1cfGh5cX12dHiAeGx4gHhodoF2aHaCdGtvg2lsXoNPb0CBNnIufil3J30nfCd8J30ofCl8KXwpfCl8KHwqfSl8Kn0qeyp9KXsofSh6KH0oeiV9JXsnfSh7KX0qeSp8K3ktey14MXs2dj55RXBOeldsYn1rZ3GAdGN2gHhgeIJ4YHmDemF7g3tkeIN2Z3KDbmhjg1tpVoJTa1WAWGpef2RqaIBtaHOAe2J+gYFhhIGDY4OBgWSBgYBkgYF/Y39/fmV+f31neX53Znd8dWdyeW5pbXlsamx4bWtreWxubXtwb3N+dG9yf3Fub35ubm9+cW9yfXJxcX1ycWx8aXBleWNuYHdibmV0Zm9ocWxubnBvbHJwdW13c3dxeHZ6dH16e3Z7fXp2en55dnt8fXeCe4d2jHuPdZB9j3KOfotwiYCIb4mAiXCIgIpyiIKDbX2DdmdshWVhYoVfYV6EXmJfhGBiY4RmYGiEbF9vg3RgdoN5YXyCf2KAgX1jfYF5Y3qBemN5gnZkdIJtZ2eDXmhPhERtO4I2cjR/M3kzezp9QHhPfF12aXp2eIB4h3yJdIt/iXGIf4dyhn+Hc4d/h3OIf4h1hX6DdH9+e3R3fnlzd392cnaAdHFvg2dxWYVNdEOEPXs5gDiBOXw+gU//T/9N/03/TP9L/0n/SP9H/0b/Rf9F/0P/Qv9C/z//O/86/zn/Of84/zf/OP83/zb/N/84/zr/O/87/zv/O/87/zz/Pf89/z3/Pf89/z7/Pv8+/z7/Pv8+/z7/Pf89/z3/Pf88/zz/Pf89/z7/Pv89/z3/PP88/zr/O/86/zn/OP84/zj/OP83/zf/N/83/zf/N/83/zf/N/83/zj/OP82/zb/N/84/zf/Nv81/zX/Nf81/zT/M/8z/zP/M/8z/zH/Mf8x/zD/L/8v/y7/Lv8t/y3/K/8r/yz/LP8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8u/y7/Lv8u/y//L/8u/y7/L/8u/y3/Lf8t/y3/Lv8u/y3/LP8r/yv/LP8r/yr/Kv8p/yn/KP8o/yn/Kf8o/yn/Kv8q/yn/Jv8p/yn/Kf8p/yn/Kf8q/yn/Kf8p/yn/Kf8p/yn/Kf8p/yj/KP8p/yn/KP8o/yj/KP8p/yn/KP8o/yj/KP8o/yj/KP8o/yn/Kf8p/yr/Kv8q/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yz/LP8t/y3/Lv8u/y7/L/8w/zH/Nf84/zz/Qv9H/0z/Uf9X/1r/Xv9j/2f/af9s/23/cP9x/3D/cf9t/2v/Z/9j/2D/Xv9d/1r/V/9U/0//SP9A/zn/M/8s/yn/Kv8p/yj/KP8n/yf/J/8n/yf/J/8o/yj/J/8n/yn/Lf8x/zj/Qv9O/1j/Zf9u/3X/eP96/3v/e/96/3r/ev92/3H/Z/9a/0n/Pf8v/yr/Kf8o/yj/KP8o/yj/KP8o/y3/Mf83/z//Tf9Y/2T/b/93/3r/ff9//3//fv9+/33/fP96/3X/b/9m/1v/UP9H/0H/Ov80/y//Kf8m/yL/If8h/yH/IP8h/zf/Wf9n/2j/Wv9g/13/Y/9f/0j/Tf9X/1T/Uv9P/1H/Xv9s/1T/Nf9A/0n/S/9H/1P/W/9e/1z/V/9P/0b/Rf9F/0L/SP9L/0r/Vv9g/07/Xf9g/2D/Zf9b/1H/R/9E/1T/R/85/yj/KP8z/zr/Q/9R/1z/aP9x/3b/eP94/3b/dv92/3b/df9z/2//af9e/0//QP82/y7/Kf8n/yf/J/8n/yf/J/8o/yj/KP8o/yn/Kf8q/yr/Kf8o/yf/J/8n/yf/Jf8l/yf/KP8p/yr/Kv8s/y//L/8z/zj/Pv9F/1H/V/9i/2v/cf90/3b/eP93/3f/d/95/3v/e/97/3f/df9u/2n/Yf9d/1z/Xf9g/2f/bP9w/3P/d/99/4L/g/+D/4T/gf+B/3//f/+B/4D/fv99/3z/ev95/3X/dP9w/2//a/9q/2n/af9o/2r/a/9t/3D/c/90/3L/cf9v/27/b/9x/3L/cv9y/3D/a/9o/2P/Yf9g/2L/Yv9k/2f/av9s/23/b/90/3f/d/95/3v/fP97/3r/ev96/3n/ff9+/4P/iP+M/4//kP+P/47/i/+J/4j/iP+J/4r/iv+I/4P/ff92/2z/Zf9k/2L/Yf9h/2H/Yv9l/2j/a/9v/3P/dv96/3v/ff9+/37/ff98/3n/ev96/3n/dv9z/2z/Zf9Z/03/Rf87/zb/NP8z/zX/PP9E/1P/Yf9t/3n/gv+I/4v/iv+J/4j/h/+G/4f/h/+H/4j/iP+F/4L/ff95/3f/dv92/3b/dv90/2z/ZP9Z/03/Q/89/zj/Of87/0D/Tn9Na0x+S21KfkdtSX1Ib0d9RnFEfEJzQH1Cdz19PXg6fjl5OH43ejd+Nns2fjZ8Nn03fjh+OH45fjt+On46fDp/Ono8fzx5PIA8eDyAPHc9gD12PoA+dT6BPnQ+gT5yPYE9cT6BPnE9gT1yPoE+cjyBPHM9gT10PYA9dTuAO3Y6gTl1OYE5djmCN3g4gTh4OIE4dzmBOXg5gTl4OIE4eDaBN3s4gTh7N4E2ejaBNnw2gTV6NIE0ejOBM3szfzN7M38zezJ+MXswfTB8LnwufC17LX0seyx9LHssfix7LH4seyx/LXstfy17LX8tey1/Lnsufy57LoAuey6ALnsugC98L4AvfC6ALnwugC58LYAtfS6ALX0sgCx+LIAsfiuAK34pgSl+KYEpfSmBKX4pgSl+KoEvfjKBOIAtgSd/KYApfCmCKXwpgip8KoIpfCmCKXwpgil8KYIpfCmCKHwogih9KIIpfSmCKX0pgih9KIIofSiBKH0ogSh9KIAofSiAKX0pgSl9KoEreyqCK3ssgix7KoIreyuCLHssgit7K4IreiuDLHosgyx5LYMveS+BMHkwgzF7NYA5fj57RIBJdUuCUXBXg1tsX4JjZ2WDaWVrhG1jb4RwYHCEcF5yhG1daIRlXWGDX19cg1pfWINXYlOBTGdDfTxxNXwveil8KIAnfCeDJ3wngyd8J4MnfCaDJ30ngiZ9JoMofCeDJ30qgi98NYE8fUl7VX1hdml+c294gHtmeoJ6YHuCfGJ7g3hlc4Nra2GEUXFAgDN3K30ofSh5KIEneyeCJ3wngid8K4EuezaAPXxJeFV8YXZtfXVxeX98an+Af2Z/gX9kf4J9Zn2DeWhyg2pqXYRTa0WCPm02fy90LH0meCN+IH0hfiF8IH8hfSN+T35ofI2CgXltgWh6Y3thf2J2YH9fdlN+UHVTfVh2XH1afGR+VIFFf0OCPX9EfEx+UHpbfGB5VnxQeVZ9P3tCfUV2QnxFdEZ7SHZQd1FzUHZPdFp5V3dceF98VHVJd095VXFcgE90LH4ufDR7OX5DelB9XHtoeHF+dXJ2gXZsdYF1aHWBdWh2gXRqboNobF2DTm9AgTRxLH4odid+JnwofSh9JX0lfSd9J30mfSZ9KX0peyh9KHwpfSZ8JX0lfCV9JXomfCZ5Jnwndyh6KncseS53MXoxdjR5OHQ/eUZzUXpXb2F9aWpvf3NldoF4YXWCdWB3g3hgeYN6Y3qDeWl2g3NqbYJnamSCY2dkgWhnbIFyZ3aCe2WBgoNjg4GCYYGBgWOAf4BkgH9/ZH1/fWl7fXpoeHx1aXV7cWpveW1ra3dna2R2Y2tmd2hsanhtbm98cm90fXRucn5xbW19b21wfnFtcn5xcHB9bW1rfGdtZXhhcGF1YnJic2NyZnBpb2lubW5vcHFudXJ5cnl1enV6eXp2en16dHl/eXR8fH92g3uIdox8j3OPfo5wjX+KboiAh2+Hf4lwin+KcImChWx9g3Zma4VmYGaFZGFjhWNhZIVmXmqEa15tgm9fdYJ3X3mBe2F9gn1ifYJ9Y3yBemN7gXtleoJ3aHGCa2hjg1hqTYJBbjmBNXMyfTN4N3o/fEl3Vntkdm94e3qFdot9i3KLgIlwh4CHcoZ/h3OJf4l0iH+HdoV+gHR8fnhxdX91cnV/d3J2f3RxcIJocVuGT3NChjx5N4E6fz1+RX5N/0z/S/9K/0r/SP9H/0b/Rf9D/0P/Qv9A/z3/Of85/zb/Nv82/zX/Nf80/zT/NP82/zb/Nv82/zf/OP86/zr/Ov85/zr/PP88/zz/PP88/z3/Pf8+/z7/Pv8+/z7/Pv8+/z7/Pv8+/z7/Pv8+/z7/Pf88/z3/Pf89/z3/O/87/zr/Ov85/zn/Of84/zj/OP84/zj/Of85/zn/Of85/zn/OP83/zf/N/83/zf/Nv82/zb/Nf81/zT/NP8z/zP/M/8z/zP/Mv8x/zD/MP8v/y3/Lf8t/yz/LP8t/y3/K/8r/yz/LP8s/yz/LP8s/y3/Lf8u/y7/Lv8u/y7/Lv8u/y7/L/8v/y//Lv8u/y7/Lv8t/y3/Lf8t/yz/LP8s/yz/K/8p/yn/Kf8p/yn/Kf8p/yn/Kf8q/zb/Q/9D/zT/J/8o/yn/Kf8p/yn/Kv8q/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/KP8o/yn/Kf8o/yj/J/8n/yj/KP8o/yj/KP8o/yj/KP8p/yn/Kv8r/yv/K/8r/yz/LP8q/yv/K/8s/yz/K/8r/yv/K/8s/yz/LP8t/y//L/8w/zL/Nf84/z7/Q/9H/03/Uv9W/1v/YP9k/2b/af9r/23/b/9x/3H/cP9w/2//a/9m/2P/YP9d/1v/WP9V/1T/T/9G/z//OP8x/y3/Kv8o/yf/J/8n/yf/J/8n/yf/Jv8n/yf/Jv8m/yf/J/8n/yn/Lf8y/zj/Q/9S/1z/Zv9w/3X/ef98/3z/e/98/3z/ef91/2//ZP9W/0b/Nv8s/yj/KP8o/yf/J/8n/yf/J/8p/yz/M/87/0P/Uf9d/2r/df95/3z/f/9//3//f/+B/4H/f/96/3X/bf9f/1H/Rv88/zP/Lf8q/yX/Iv8h/yH/If8g/yH/Nf9X/23/kP95/1z/Xv9i/2H/Xv9Z/1j/Sv9L/1D/Wv9i/1v/Xf9Z/03/Qv9I/0b/R/9L/1n/V/9Q/1D/Wf9D/zT/Ov9L/0//Uv9K/0j/SP9G/0r/TP9Q/1D/UP9M/07/XP9o/1b/T/8p/y3/Nf86/0T/T/9c/2f/cv92/3T/dP91/3X/dP92/3X/cv9t/2n/Xf9O/0D/NP8r/yf/Jv8l/yX/Jf8l/yX/Jv8m/yb/Jv8o/yn/KP8o/yf/Jv8l/yX/Jv8m/yb/Jv8o/yn/Kv8s/y7/MP8z/zT/Nf85/z//Rv9R/1j/Yf9q/2//c/92/3j/df91/3f/eP95/3v/e/96/3j/dv9y/23/av9p/2n/b/9y/3f/fP+A/4P/hP+C/4L/gf+B/4H/gf9+/33/ff96/3j/d/91/3P/cP9w/2z/af9l/2H/Yf9i/2b/aP9r/27/cf9y/3T/dP9x/3D/bv9v/3D/cf9x/3D/b/9t/2n/Zf9i/2H/Yf9i/2P/Y/9l/2b/aP9q/27/cv91/3n/eP96/3v/e/97/3r/ef95/3z/f/+D/4j/jv+P/4//jv+N/4r/if+J/4f/iP+J/4n/h/+D/33/dv9r/2b/Zv9k/2T/ZP9k/2b/af9s/27/c/91/3f/ef97/3v/e/96/3r/ef95/3r/e/95/3b/cP9q/2L/V/9J/z7/OP81/zP/NP84/0D/Tf9c/2n/df9//4f/i/+L/4v/if+H/4f/hv+H/4n/if+J/4j/hP9//3n/dv90/3T/dP91/3b/dP9v/2f/XP9R/0X/PP85/z3/Q/9K/09/TmxMfkluR35GbUZ9RW9EfUFyP3w9dTx9OXc2fTZ4Nn42eTV+NHo0fjN7NH42fDZ+NX01fjV9N343ezh/OHo6gDp5O4A8eDyAPHg9gD13PoA+dT2APXQ9gT10PoE+cT+BP3E+gT5xPoE+cT+BP3E+gT5xPYE9cjyAPHM8gDtzOoE6djqBOnc6gjp4OoE6eDmBOXk6gTp5OoE6ejmBOXo4gTh5OYE5eTeBNXk3gTd6N4E2ejWBNXo1gTV8NX81fDN+M3wyfTJ8MHwwfC57Lnwtey19K3srfSt7K34qeyt+K3srfyt7K38seyx/LXstfy17LX8tey2ALXwtgC58LoAvfC6ALnwvgC98L4AvfC6ALX0tgC19LIAsfCyALHwrgCp8KoEpfCmBKXspgSp9KoEpfimBMn46gTl+LYEpfCiBKHwogih8KIIofCiCKHwogil8KYIpfCmCKXwpgih8KIIofSiCKX0ngih9KIIofSiCKH0ogSh9KIEpfSmBKH0ogSt8K4ErfCyBLHsrgix7LYIseyyCK3ssgix6LIIseiyCLHosgyx6LoMseS6DLnkwgTJ6M383fDx7Q39Hdk2AUm9XgVxqX4JlZmiDamVthG5lcIJwY3KCcmBwgm9fboJrX2eCY2BegltjWoJXZVSBUGlKgENuOX0zdix8KXwpfCmAJ3wngyZ8JoMnfCeDJnwngyd9J4MnfSaDKHwngid8JoErfC9+NX1AfE19WHZjfm5vdIB4Z3qCemF7gnxgfIN7ZHiDc2hqhFxuTIE8dTB+KXsnfSaBJn0ngid8J4IofCmBLX0yfTl+QntOf1l1ZX9ucXd/fG5+gH9ogICAZoKBgWeBgn5od4Nxa2eEVmtIgjtwMX8tdip9JXokfiN6IX4hfiN9I4BcemOCX3R1h1FzPopUd0qDWH1kflV/QX89fk9+QH1MflR8U39QfU5+UX46fDuASHhNf0t2SH9Ic06ASnNVgllxXIReb2KEZXBogmhxYXxKckJ0S3VGc0R4QndNek53THhZeWZ1Vn5XdiuALH0yezp+RXpRfV17Z3hxfnNyc4FybHKBcmhzgXRodYFzam6DaW5eg09wQYE0dCx+KHklfiV8JH0kfSR+JH0kfiR9Jn0mfiZ9J30ofSh9J30mfSV9JXwnfSd6J3soeSl7K3cteS52L3kxdTJ4NHQ3eDtzQHdGcE94Vm1ge2hpb31zZHWBd2J1gndheIN4YXuDfWR9g3xleYJ4ZnaCc2VxgXFkcoF3Z3mBfmeBgYRlg4GDYoGAgGOAgIJlgIB+Z3yAe2d7fnhqd3t1anF6cGtueWtqZ3djal92YWpjdmZpaHdqa2x6cG5zfXNvdH5zbnF/cG1vf29sb39vbHB+bmxtfGtsZ3pjbGF3X3BgdWByX3JhcmNwZXBmbmhvbG5xb3RweHN7dXt2e3l8eHp9d3V4f3l1fXyAdoR7iXaOfI50kH6NcY1/im6IgIhviYGKcIqBiXCIgoVrfIN0ZWyFZ2JmhWViZYNlYWWDZl5qgmteboFxXHKBdF95gHphe397ZHqAeWV5gHlmeIB4aXiBc2ptgWdqYIJVa0eBPW85fzdzNnw3eTt6RHtSd2B6bHh4eH97hnaLgItyi4CIcIeAh3KIf4lzin+KdIl/iHaDf390eH91cXN/c290f3RvdH90cHGCZ3BdhFFxRYQ9dz6BQnpHfk55TP9L/0r/R/9H/0b/RP9D/0L/QP8+/zv/Of83/zX/Nf8z/zP/M/8z/zP/Mv8z/zT/Nf81/zb/Nv83/zn/OP84/zr/Ov85/zr/O/87/z3/Pf8+/z7/Pf89/z7/Pv8//z//P/8//z//P/9A/z7/P/8//z7/Pv89/z3/PP88/zz/PP87/zr/O/87/zz/O/86/zr/Ov86/zr/Ov86/zr/Of85/zj/OP83/zb/N/83/zj/OP83/zb/Nv82/zb/Nv81/zX/M/8z/zL/Mv8x/zD/Lv8u/y3/Lf8r/yv/K/8r/yr/K/8r/yv/LP8s/yz/LP8t/y3/Lf8t/y3/Lf8t/y3/Lv8u/y//Lv8u/y//L/8v/y//Lv8t/y3/Lf8s/yz/LP8r/yv/Kv8q/yn/Kf8p/yn/Kf8p/yn/Kf8q/yr/K/8r/yn/KP8o/yj/KP8o/yj/KP8o/yj/Kf8p/yn/Kf8p/yn/Kf8o/yb/Kf8o/yn/Kf8p/yj/KP8o/yj/KP8o/yn/Kf8p/yn/K/8r/yv/LP8s/yv/LP8t/yz/LP8r/yz/Lf8t/y3/Lf8s/yz/LP8u/y//Lv8v/zD/NP83/zr/QP9F/0n/UP9W/1v/YP9k/2f/af9s/27/cf9y/3L/cv9v/3D/bv9s/2j/ZP9h/13/W/9Z/1b/Uv9M/0X/PP82/y//K/8q/yn/Kf8o/yf/Jv8m/yf/J/8m/yf/J/8n/yf/K/81/zz/L/8m/yj/Lf8y/zv/R/9U/1//a/90/3n/e/97/3v/fP98/3z/e/91/27/Yf9R/0L/Nf8r/yf/Jv8m/yf/J/8n/yj/Kf8t/zH/Ov9B/07/Wf9h/27/dP96/37/f/+A/4D/gP+B/4L/f/96/3P/af9a/0r/O/8v/yj/Jf8m/yX/JP8h/yH/Iv83/3X/Wf9L/0L/PP87/0v/T/9W/2H/VP8//zH/Mv87/0D/P/9F/0L/R/9K/0H/OP9G/0n/S/9F/0n/Rf9O/1v/Xv9g/2L/ZP9l/2X/Y/9a/z7/Pf9J/0P/Rf9C/17/Tv9D/1D/W/9c/0r/KP8r/zP/PP9F/1H/Xf9n/3H/c/9z/3L/cv9y/3P/dP91/3P/bf9o/17/T/9A/zb/LP8p/yX/Jf8m/yb/JP8k/yT/JP8l/yX/Jf8m/yb/Jv8m/yb/Jf8l/yT/Jf8n/yn/K/8s/y//MP8x/zP/NP82/zr/Pv9D/0n/T/9Y/2H/af9v/3P/dv94/3j/d/92/3j/ef97/33/fv99/3v/ev93/3f/d/95/33/gP+D/4T/hP+D/4P/gf+B/4D/f/9+/3z/e/96/3j/df9z/2//b/9s/2f/Yv9f/17/X/9h/2P/Z/9q/2z/b/9y/3P/c/91/3T/cf9w/2//b/9v/2//cP9u/2//a/9l/2L/Yf9f/17/Xf9f/2D/YP9k/2T/Z/9s/3H/dP93/3j/ef97/3z/ev93/3j/ef9+/4H/hv+K/47/jv+O/4z/i/+I/4j/iP+I/4j/iv+K/4j/gv97/3L/bP9n/2X/Zf9l/2X/Zv9n/2f/aP9t/3D/cf9z/3b/eP96/3r/ef94/3n/ef94/3j/dv9z/2z/Zv9f/1H/R/89/zr/Of85/zr/Pf9G/1T/Yv9t/3n/g/+K/4v/i/+L/4j/iP+H/4j/if+K/4r/if+I/4P/f/94/3X/c/9z/3T/dP90/3T/cf9n/13/Uf9E/z7/Qf9I/0z/UP9Mf0xtSX5HbUZ+RW1DfUFvQH4+dDx+OXU2fjV2NH8zeDJ/MngxfzJ6Mn8yezN/M3s0fjR8NX81fDd/OH04fzh7OYA5eDmAOnc7gDt3PIA9dj6BPnY+gT51P4E/cz+BP3I/gT9wQIFAcD+BP3E/gT9xP4E+cj+BPnM9gD1zPYA9dDyCOng7gjt4PII8eDqCOng6gTp5OoE5eTqBOno5gTl6OYE5ejiBNno3gTd6N4E3ejeBNXo2gTh6N4A3ezR+NHszfjN7Mn0xezF8L3wtey18LXssfix7K34reit9LHosfyx7LH8tey1/LXstfy17LX8tey1/LXstgC58LoAufC6ALn0ugS59L4EvfS+BL30ufy19LYAsfSyALH0rgCp9KoAqfSmBKX0pgSh9KIEofSiBKHwofyt8NX9CfDyALHwngSd8J4MofCiDKH0ogih9KIIofSiCKH0ogih9KIIpfSiCKH0ogSh9KIEofSiBKH0ogSh8KIIofCiCKXwpgit8K4IreyuCK3srgix7K4MreyyDLHssgyx7LIMtei2DLXotgy16LYIuei+CLngugjB6MYE1fDl9Pn1Ed0iATnFSgVlsX4BiaWWCaGVrgmxlb4JwZXOBc2NvgG9ibYBtYWuAZ2JigF9lXIJZZliCU2hPfklrQH44czF9LHsqfCmAKXwqgid8J4MofCeDJ3wngyd8J4MnfCeDJnwrgzR9LYInfSeCJ30rgC59N31DfU92Wn5ob3CAeGh6gnxieoJ6YXyDfGF+g3lncYRmbFeDRXI3gCx6KH4nfiZ8J4EmfCeBKH0sfy9+NHw5f0J3S4FVdGF/a3Bzf3ptfX9/aYGAgWZ/gYBlhIOBZ32Ddmtsg19sT4I7cS2AJHYkfSN6I34jeyR+I38lfDyBa3xMgjt5NIY1eTOFPXxMf0x9YnlihGF0VYdCcj2FJ3U3gDl2OX46d0J+QXQ9gEdyS4BKcUyBUG1Ug1hrXYRfbmCEYW9kg2JvY4Fec1R+PHU1d0B1Q3NFeEV1anptd015SXpDdkR9SHcxfTB+NXw8gUZ6Un5bfGd4cX9zcXSBdG9zgXNrdIF0aXSCdGttgmdsXoJQbkGBNXEtfyl2JX0leyV8JX0kfSR+JX0lfiR9JH4lfSV+JX4lfiV+JXwmfSV7J3wpeSl6KncseS51MHkyczN4NXM3dzl0OnU/dEV0S3FRdlluYXloaG99c2V2gHhid4J1YnWDd2J6g31lfYF+Zn6Bf2aAgX9nf4GAZ4KBgmeEgYVnhYGEaIKBgmiDgIFngoCAZ31+e2p6fXdrdnxxam56bmxreGVtYndgamB2YWlidWRqaHVqa2x2cGtweXJudX51bXR/cm1ygHBsb4FwbHCBcG5uf2xtbXxqbmZ6Ym9fdV5wXXNdb11xXHFecGByYm5nb2pucHJzcHZ0e3V7dnt6e3R6fXl0dn16cn58gnWHe4p2jnyOdI5+jHGKf4htiICIboqAinGKgIlvhoF/a3uCcmNqhGZgZYRlYGSDY2NigWFjYoFmYmmBa2Fvf3NhdoB3Y3iAd2R3gHdleIB5ZneAd2l0gXBqaoFkbF2BUG1EgD1xOn04dDh6PHhCdkp6WHZleXJ5fHeFfIt0i4CKcYqAiHGJgIlyiYCKdYp/inWKf4Z2gn98c3d/dHFzf3Nwc390cHR/c3BxgWlwX4RScEeEQ3VGgUp1UH5WdEv/Sf9H/0b/R/9E/0P/P/88/zr/Of83/zX/NP8z/zL/Mf8x/zD/Mf8w/zD/Mv8y/zT/NP80/zT/NP83/zj/OP84/zj/Of86/zv/O/88/z3/Pv8+/z7/Pv8//z//P/8//z//P/9A/0D/P/8//z//P/9A/0D/P/8+/z3/Pf89/z3/O/88/zz/O/87/zv/O/86/zr/Ov86/zn/Ov86/zn/Of85/zn/N/82/zf/Of84/zj/N/84/zf/N/83/zf/Nf80/zP/Mv8y/zH/MP8u/y3/Lf8t/yv/K/8r/yv/K/8r/yv/K/8r/yz/LP8s/yz/Lf8t/y3/Lf8t/y3/Lv8u/y7/Lv8u/y7/Lv8v/y3/Lf8t/yz/Lf8t/yz/LP8r/yv/Kv8q/yn/Kf8p/yn/KP8o/yj/KP8p/yn/J/82/zH/Kv8q/yf/KP8o/yj/KP8o/yj/KP8o/yj/KP8o/yj/KP8o/yj/Kf8o/yj/KP8o/yj/KP8o/yj/KP8o/yn/Kf8p/yr/K/8r/yv/K/8r/yv/K/8r/yv/LP8s/yz/LP8s/y3/Lf8t/y3/Lv8u/y//L/8v/y//Mf8z/zf/Ov9B/0b/Tf9T/1j/XP9g/2T/af9q/23/bv9w/3L/cf9x/3D/bv9s/2z/aP9k/2D/Xf9b/1j/V/9R/0v/Q/87/zX/Lv8r/yn/KP8o/yn/Kf8p/yf/Jv8n/yf/J/8n/yb/Jv8n/yX/JP8l/yf/KP8n/yr/Lv81/z//TP9W/2P/b/93/3r/fP97/3r/ev98/3z/ev90/2z/XP9L/zz/L/8o/yf/Jv8n/yb/J/8q/yv/MP82/zr/Qf9K/1T/YP9q/3L/ef99/3//gf+B/4H/gf+D/4L/gP95/3H/Yv9S/0D/Mf8o/yP/JP8k/yT/JP8k/yf/Qv9u/1n/Pv82/zv/Nf84/0H/Uf9i/2n/b/9x/2j/UP89/0b/Pv80/zb/Q/9H/0b/UP9O/03/Tv9W/1n/W/9e/2D/Yf9i/2L/YP9d/1j/VP9S/zX/Rf9H/0f/Qv9O/2H/Tf9K/1X/Xf9L/y7/Mf82/z3/Rv9S/13/af9x/3P/dP90/3P/c/90/3T/dP90/2z/aP9d/0//Qf81/y3/Kf8l/yX/Jf8l/yT/JP8l/yX/Jf8k/yX/Jf8l/yX/Jf8l/yX/Jv8n/yr/K/8u/zD/MP8y/zT/Nf83/zr/PP88/0H/Rf9L/1H/Wf9h/2j/b/9z/3X/ef94/3f/dv94/3v/fv9//4H/g/+E/4P/hP+E/4T/h/+H/4b/hf+F/4T/g/+D/4H/gP+A/33/fP95/3b/c/9y/23/bP9p/2b/Y/9h/2H/Yv9i/2P/Zv9n/2v/b/9x/3L/dP91/3X/dP9y/3D/b/9v/2//b/9v/27/bP9r/2j/ZP9g/17/Xf9c/1z/Wv9a/1v/XP9h/2P/af9u/3P/dv97/3v/ff98/3n/d/95/3z/gP+D/4j/i/+O/47/jv+M/4r/iP+I/4j/if+J/4n/iP+F/4D/fP9z/2n/Zf9k/2T/Yf9g/1//Xv9g/2P/Zv9q/2//c/91/3b/dv91/3X/df91/3f/d/93/3T/cP9r/2P/Wv9O/0X/Pv88/zv/O/8//0b/Uf9e/2n/dv+A/4j/i/+L/4r/if+I/4j/iP+J/4r/i/+J/4r/h/+A/3r/d/90/3P/c/9z/3T/dP9z/3H/af9h/1X/S/9G/0r/UP9W/1r/S39JbUd+RW5FfkNvQH07cTl+OHM2fjV0NH4ydDJ/MXUwfzB3L38veC9/L3oxfzF6M38zejN/M3o1fzZ6OIA5eTeAOHc4gDl3O4A7dT2APnU9gT50P4E/cz+BP3JAgUBxQIFAcUGBQHFAgUBxQYFBcUCBQHI/gT5yPYE9cz2BPXQ9gjx3PII8dzqCO3g8gjp4O4E8eTuBOnk6gTp5OYE5ejqBOXo3gTd6OIE4eziBOHs4gTh6N4E3ejeAN3s1fjV7M30zezJ8MXswey59LXotfSx7LH4reyt+K3orfSp6Kn8qeyp/LHssfyx7LH8seyx/LXstfy17LYAufC6ALnwugCx8LoEvfC6BLX0tgS19LH8tfS2ALH0sgCp9KoAqfSqAKX0pgSl9KYEofSiBKH0ogSp8KoEnfCaBKHwogSh8KIEpfCmCKHwogih9KIInfSeCJ30ngih9KIIofSiCKH0ogil9J4EofSiBJ30pgSl9KYEqfCqCKnwqgip8KoIrfCuCK3srgit7K4IreyuDK3ssgyx7LIMtey2DLXotgy56LoMuei6CMHowgjB4MIIzejaBOnw+fER+SndMgFRwW4FfbGGBZWlpgWpmbYFvZW6Bb2VvgG9lbn9rZWqAamVmgGJmXn9cZ1uBWGhUgE9sR30/cTd7MHgreip+KXwpgCl8KoIyfC+DKHwogyd8J4MnfCeDJ3wngyZ7JoMmfCWCJH0mgiN9KIMtfTF/O31IelV+YXNtgHVteYJ8aHyCemJ6g3xje4J6ZnWDbmtgg1BwP4Aydyp/J30lfiZ/KH0pfyp+L3wzgDl5PYBBdEmCU3JdgGZwb392bn1/f2uBgIJogoGDZYOBgmiBgXtsdINpcFqDRnA2gix0Jn4keCN+I3slfih/KH1bgmt9WIQ8ezaCPH1CfUF9SXdZgGVzboF0cXeDdG1WhUtuSIJDcEGBRHFMgFBwTYBHcEOBTG5UglhtWoJdbWCCYG1jgmJwYYFddViAVHlOfUZ7PnlCekFzQ3lEcEt6WnJUd1B3THZMezl6MXwxfzd6PoFIe1J+XnxqeHJ/dHF0gXRtdYFzaXSBdGlzgnJrbIJpbl+CUXBCgDVyLX4pdyV9J3snfCd9JX0lfiZ9Jn4lfSV+JX0lfiZ9JnwlfSZ7J3wneih6LHgueS52MHgxczN3NXQ2dzpzPHU+c0B0Q3JIck1vUnRcbGJ4aGhvfXNndoB4Y3mCeGF4gnlhe4J+ZIGBhGeHgIhniICIaImAiWiJgIhoh4CFaIWAhGmDgIRpgX+Aan1/fGp5fXZtdHxwbmx6aW1peWRuYndgbmF2YWtidWNqZXNmaWl1bGpudnFqc3p0a3V/dGtyf3Frb4Bvam+Ab2xwgG9tbn5sbml8ZW1ieV9sXXVbcFt0WnJbcltzXXBdc15uYnNnbmx0cnB2d3p1e3d8en11en13dHp9fXWBfIZ2iXuLd418jnSOfoxxiX+Hb4eAh3CIgIhxiICFb4KBfmt2gm5maIRkYmOEYmJfg2BkXIFcZGCBZWRogWtibn9zYnWAdWV1gHVmdX91aHN/dWp1f3Vqc4BvaWqAYGpZf09uRH4/cj56PnY/d0V5S3VWeWJ1bXh2eX91iHyMcoqAiXGJgIlxh4CHcomAinWKf4t3iH+EdH9/eXB2f3Nucn9ycHR/dHB2f3VwcoFscGWEVm9PhEpxTYFUcVt+X3BI/0j/Rv9D/0H/P/88/zn/OP82/zX/Nf8y/zL/Mv8x/zD/MP8v/y//L/8v/zD/Mf8y/zH/M/8z/zX/Nv83/zf/N/84/zj/Of87/zv/Pf8+/z3/Pv8//z//P/8//0D/QP9A/0D/Qf9A/0D/QP9B/0H/Qf9B/z//Pv8+/z7/Pf89/z3/Pf88/zz/PP87/zv/O/88/zz/O/86/zr/Ov85/zn/Of85/zn/Of85/zn/OP84/zj/OP83/zf/N/83/zX/Nf80/zT/M/8y/zD/Lv8t/y3/LP8s/yv/K/8r/yv/K/8q/yr/K/8s/yz/LP8s/yz/LP8t/y3/Lf8t/y7/Lv8u/y7/LP8u/y//Lv8t/y3/Lv8t/y3/Lf8s/yz/Kv8q/yr/Kv8p/yn/Kf8p/yj/KP8o/yj/KP8o/yn/Kf8n/yf/KP8o/yj/KP8n/yf/KP8o/yf/J/8n/yf/J/8o/yj/KP8o/yj/Kf8n/yj/KP8n/yn/Kf8p/yr/Kv8q/yr/Kv8q/yv/K/8r/yv/K/8r/yv/K/8r/yz/LP8s/y3/Lf8u/y7/L/8v/y7/Lv8w/zD/MP8x/zP/Nv86/0H/Rv9M/1P/V/9c/2D/Y/9n/2n/a/9t/27/bP9s/2r/av9p/2n/aP9o/2P/X/9c/1v/W/9W/1P/TP9D/zv/NP8t/yr/Kv8p/yn/Kf8q/yr/Kf8o/yj/J/8n/yf/J/8n/yf/Jf8m/yb/Jv8k/yb/Jf8o/yv/Lv83/0P/Uf9d/2j/cv95/3z/ff97/3v/fP98/3v/dv9v/2b/V/9E/zP/Kf8n/yX/Jv8o/yr/Lv8y/zb/Ov8+/0P/Sv9S/1z/Zf9s/3X/e/9//4D/gf+C/4H/g/+D/4H/fP95/3D/Yf9P/z7/MP8n/yP/I/8j/yT/Jf8p/0T/S/9G/zj/P/8//z3/Pv9K/1r/ZP9v/3P/d/9y/1v/VP9O/0H/Pv9B/0L/Tf9L/0X/UP9U/1n/Wv9b/17/YP9g/2H/X/9c/1j/VP9N/0f/Qv86/zj/Tf9C/0D/R/9V/1r/Wv9W/0X/LP8y/zT/N/8+/0r/VP9e/2r/cv90/3T/dP91/3P/c/9z/3P/cv9s/2n/Xv9Q/0L/N/8v/yv/KP8n/yf/J/8l/yX/Jv8m/yb/Jv8l/yX/Jv8m/yb/J/8o/yr/K/8r/y7/MP8z/zT/Nf83/zr/O/8+/0D/Qv9F/0v/Uf9U/1z/Yv9o/2//c/92/3j/d/93/3b/d/99/4D/hP+H/4r/jP+N/43/jf+N/4v/if+H/4b/hf+E/4P/gv+A/3//fP97/3b/c/9v/2v/aP9m/2L/X/9g/2L/Yv9h/2P/Zf9l/2j/a/9s/3D/cf9z/3T/df90/3L/cf9v/2//bv9u/2//bf9u/2z/af9l/2L/Xv9c/1r/Wf9Z/1n/WP9Z/1r/XP9g/2f/bP9y/3b/ev97/33/e/94/3f/ev99/4H/hv+J/4v/jf+O/4z/iv+J/4f/h/+H/4j/iP+I/4X/gP96/3P/bP9n/2T/Yv9g/17/Xv9c/1z/YP9l/2n/bP9v/3H/dP90/3P/c/9z/3P/c/90/3b/c/9y/27/av9g/1j/Tv9H/0P/QP8//0L/Sf9P/1v/ZP9w/3r/g/+J/4v/iv+J/4n/if+J/4n/iv+L/4v/i/+I/4T/f/95/3X/cv9y/3P/dP90/3X/df9z/23/ZP9b/1P/T/9R/1n/YP9k/0h+RW5EfkJvQH49cTl+OHE0fzVyNX8zcTF/MHIxgDFzMH8wdy5/LngugC55L4AxeTF/MXkygDN4NYA2eDaANng5gDl2OoA6djuAO3U9gD10PoE+cz+BP3I/gT9xQIFAcEGBQXBBgUFwP4FBcECBQHFBgUBzP4E/cz+BPnQ9gT10PIE8dT2BPXY9gT13PYE9dzyBPHc7gTp4OoE6eTqBOno6gjp7OYI5ezmBOXs3gTd7OYA5fTeAN302gDZ+NX41fjV9M38xfDB/Lnsufi17LH4reyt+K3srfit7K38qeyp/K3srfyt7K38reyt+LXstfi16Ln8tfC2AK3wtgC18L4AtfS2ALH0sgC19LYEufS6BLHwsgCt8K4AqfCqAKXwpgCl9KYEofSiBKH0ngid9J4IofSiCKH0ogid9J4EnfSeBJ30ngSd9J4EnfieCJ34ngid+J4EnfieBJ34ngid+J4IofSiBKH0ogSh9KIEpfSmBKnwqgit8K4IrfCyDLHosgyx7LIMseyyDLXstgyx7LYMtei2DLXougzB6M4MweTCDLnkugy95MIMweTCBNHw3fzx+Q31JgE53UoFXcFuBX2pjgmdoaYFraGx+a2dpfWloZ31naGd+Zmhlf2NpYYBdaVyBW2tZgVVsUYBJcD99OHcwfCx/KXwpgCl7KYIoeyiDKHwogyh8KIMnfCaDJ3wngyZ8JoMmfCaDJn0mgyV9JYImfSeBKX0wfjV9P3tPflt1ZYBwb3eBemp7gXpmfIJ8Y3yCfGV4g3JpaYJbcEuBO3QtfyZ7J38pfSl/LXwxgDV6N4I7dj+CRHBLg09wWYFicGuAcnB6gH5tgYCBaYCAgWaCgYNng4GBan2CdW5ohFZvRYM2cyuBJncifyR6I34kfih/QIBOf0qBPnw3fjl8OXo8fEp1VX5icHGBdHB3gXRubIFObUN/Qm45fTdvPn9Gb0aBUG5SgVduW4Ndbl6EX21hgmBwXoFbdVeAUnhMfUZ7QHs4gDV4Mn9UdEN7O29HeFBsWXVYdVx1QHwwfDJ+NoE5e0CBS3tWfmF8a3hzf3VwdYB0a3SBc2l0gnRpdIJya2yDaG5fg1F0QYE2dTB/LHkpfSh8J3wnfid8JX4nfCd+JnwmfiZ8JH0mfCZ8J3woeip7LHgteS52MHgzdjV3N3Q6dzt1PXY9dEJ0RHNGc0hyT3BTbVhyXmpkdmppb3tzanZ+d2Z5gHlieYJ7YoGChGSGgIpojYCPa5F/kWyQfY9tjnyMbIl8iGqHfYVsgn5+bIF+fW55fXRvcXxucWp5aHJjeF9yXnZgcF92YW5ldWVsZnNnamhzaWVsdGtnb3dxZ3J8dGl0fnRqc4Bxa2+Bb2tugG1uboBtbWx/aW1lfGJuXnlbblt2WXBYdFlyWHNXdFdyWXRcb2B0Zm1sd3Fwdnl5dHx6fXl7d3t9e3R6fX51gXyGdoh8i3aNfY50jH+KcIh/hm+HgIdwiYCJcYWAgm99gndscYJqZmaDY2Rfg15kXoJcZV2BXmRhgWZkaYFuY3CBcmJ0gXNkc4BzaHKAcmpzfnRsdH50bHJ+b2xnfmBrVn1Ob0h6RXNDeEN4RnVLeFVzX3hndnJ2e3qFcot9i3GLgIpwiYCJcIl/iXOKf4t2iX+LeIl/hXd+f3pzdn90cHN/dG51f3VwdX90b3KBa25lhF9uV4NWblh/Xm9kfWlvR/9F/0P/QP89/zn/OP82/zT/M/8z/zL/Mv8w/zD/MP8w/zD/Lv8u/y7/Lv8v/zH/Mf8x/zL/M/81/zb/Nv82/zn/Of86/zr/O/87/z3/Pf8+/z7/P/8//z//P/9A/0D/Qf9B/0H/Qf9B/0L/Qv9C/0H/QP8//z//P/8+/z3/Pf88/zz/Pf89/z3/Pf89/z3/PP88/zv/O/86/zr/Ov86/zn/Of85/zn/Ov86/zf/N/84/zj/N/83/zb/Nv81/zX/M/8y/zH/MP8u/y7/Lf8s/yv/K/8r/yv/K/8r/yr/Kv8r/yv/K/8r/yv/K/8s/yz/Lf8u/y3/Lf8t/y7/L/8t/y3/Lf8t/y3/Lf8t/y3/Lf8s/yz/K/8r/yr/Kv8p/yn/Kf8p/yj/KP8o/yf/J/8n/yf/J/8o/yj/J/8n/yf/J/8n/yf/J/8n/yf/J/8n/yf/J/8n/yf/J/8n/yf/J/8n/yj/KP8o/yj/KP8o/yn/Kf8q/yr/LP8r/yv/LP8s/yz/LP8s/yz/LP8t/y3/LP8t/y3/Lf8u/y7/L/8w/y7/Lv8u/y7/L/8x/zH/NP82/zn/P/9E/0v/UP9U/1j/W/9f/2P/Z/9o/2n/af9o/2b/Zv9l/2X/ZP9j/2H/YP9e/17/XP9b/1j/U/9O/0X/Pf80/y7/Kv8p/yn/Kf8p/yn/KP8o/yj/KP8o/yf/Jv8n/yf/Jv8m/yb/Jv8m/yb/Jv8m/yb/J/8r/y7/Mv88/0n/Vv9j/2z/d/96/3v/ev95/3n/e/98/3r/df9r/17/Tv8//zL/Kv8p/yn/K/8v/zP/N/85/z7/QP9F/0v/T/9X/2H/aP9w/3j/fv+B/4L/gf+C/4L/g/+D/4H/fv93/27/X/9O/z3/L/8n/yP/I/8k/yX/Jv9C/3X/d/9E/yb/Kf8z/zr/SP9U/2P/cP92/3j/df9u/0v/O/8u/y//Mv83/y7/O/9W/1n/Wv9d/17/YP9h/2H/Xf9b/1b/Uv9M/0b/Qf85/zP/Lv8t/zf/P/9F/1H/T/9P/0z/X/9N/zn/Nf81/zr/Qf9K/1X/Yv9s/3X/d/92/3X/df91/3X/dP91/3T/bP9o/1//Uf9B/zb/MP8s/yn/KP8n/yf/J/8n/yf/J/8n/yf/Jv8n/yb/J/8o/yr/LP8t/y7/MP8z/zX/N/85/zz/Pf8//0H/RP9G/0j/Sv9R/1X/Wv9g/2T/av9v/3P/df92/3j/ev97/4D/hf+I/4z/jv+Q/5L/k/+T/5L/kf+P/43/if+I/4f/hP+A/37/fv95/3b/cv9s/2n/Zf9h/2D/Xf9e/2D/X/9h/2P/Y/9m/2f/aP9p/2z/bP9v/3D/cf9z/3X/c/9x/3D/cP9w/27/bf9u/23/a/9n/2X/Yf9d/1r/Wf9X/1b/V/9U/1P/VP9U/1n/XP9k/2r/cf93/3v/fP98/3r/ef95/3r/fv+B/4b/iP+L/43/jv+M/4r/iP+G/4f/iP+I/4j/hf+A/3r/df9w/2b/Y/9g/17/Xf9c/13/Xf9e/2H/Zv9q/2z/cP9y/3P/cv9w/3D/b/9v/3D/cv9y/3L/cP9t/2X/Xf9U/03/Sv9H/0b/Rv9K/07/WP9i/2z/dv+A/4j/i/+L/4r/if+J/4n/if+L/4r/i/+K/4r/iP+E/33/ef92/3T/c/90/3X/dv91/3X/c/9u/2r/Yf9b/1n/XP9g/2b/a/9GfkNuQX49bzp/OHE2fzdxNH8zcjGAMXIxfy5zL38wdC9/L3Uufy53LoAueC6AMHgxfzF5M4A0eDSANXc2gDh3OoA6dTmAOXU7gTtzPYE9cz6BPnI/gT9xP4E/cUCBQnBBgUFwQIFAcEKBQnBBgUFxQIFAcz+BP3M/gT90PoE+dD2BPXU9gT12PYE9dj2BPXc8gTx4O4E7eTuBO3k5gTl6OoI5ezmCOHs5gTl7OIE4ezeAN3s2gDZ7NoA2fTR+NH0xfTF+MXwvfi17LX4teyx+K3srfip7Kn4reyt/K3srfyt7K38reyt/K3srfit7K34rei1/LXwtgC18LYAsfC6ALX0tgC19LYAtfS2BLX0tgSx8KoApfCqAKnwpgCp8KYApfSmBKH0ogSh9J4IofSiCKH0ogid9J4ImfSaBJn0mgSd9J4EnfSeBJn4mgiZ+JoImfiaBJn4mgSZ+JoEmfiaBJ30ngSh9KIEnfSiBKn0qgSt8KoIrfCuCLHwsgyx6LIMseyyDLXstgy17LYMtey6DLXotgy56LoMtei2DLnkugy55L4MveTCDM3o2gTh9O35Af0h5ToFTc1SBWW5cgl9qYoFlaWiAZWljfmJrYX1hbGJ9YmxgfmBsX4BfbWCBXm1egVttV4BSb0t9QXQ6ezJ6LHwqfyp8KoAqeyqCKXspgyh8KIMofCiDJ3wngyd8J4MnfCeDJnwmgyZ9JoMmfSaCJX0lgSl9LoEzfTp8RH5SdmB/bHBzgHdreoF6ZnqCeWN5gntleoN0aW2CY21TgUNzNIArdyqAKnotgDJ5NYE3dzyCP3RDgkZxSoNOcFWBXXBngW5vdoB+bYCAgWuBgIFngYGBZIOBgmd/gnlsc4Rmb1aDQ3EzgSd1JX8keiN+I34iezV/aXhkgyx5I4EnfC9+OnxDeFN+YnNugXRvdYFzbWuCYG82gyVxJYEqcCuCN21Mg1ltWoRbbV+DYG9fgmFvX4JZcVWAUXdLfUV7PXs3fzF5L4MudzOFM3U4gUhvUHtRa093VXNOdlJ8V3o0fTWAOntBgUx7WX5jfG14dX93cHmAeGx1gXVqdIJ3a3SCcmxvg2tvYINSckKAOXcxfS16KnsqfCp6KH4nfCd+J3wnfid8J30nfCd8KHspeyt7LXkvejB4MXkydjR3NnY4djt0PXM/dUFyQ3RGcElzS29OcFNuV29bb2FsZnVsa3B6dGh2fXdneH96Y32BgWSHgYtokH+SbZV+lXCXfpZ0k3ySdY96jXSKeodxhnuEcIB8fHF5fXRyb3xsc2d6ZHJgeFx0XHhedGB2YHFhdGNtZXNna2ZyZmpncmloa3RtaG53cGhyfXRpdX9zanGAcWlvgG9pboBvZ22Aa2lpfmZrZHxhbF14WW5WdFVwVHRTclRyU3NUcVV1WG9cdmRua3lwcHV6eHR7eHp5eHV4fXh0en1+dYJ8h3aJfIx1jX2Nc4x/im+If4hvhoCIcIeAhnGEgH5veYJzbGyCZWZig2BmXoNdZlyCW2RdgV5jYoFlYmqBbWJwgXFicoFyZG6AbmhugG9qcn5zbXN+dW1xfW1uZ31fbFd7T3BNeElzR3RJdk5yVXhcc2Z2cHZ7dYJ7h3KLfopxiYCIcImAiXCJf4pzin+Jdol/iXiGf4J3fX94dHV/c3F0f3Rvdn92bnd/d211gXFsbIRka12CXWtff2Ruan5vbkP/Qf88/zr/Of84/zb/Nf80/zP/Mf8x/zH/Lv8u/y7/L/8v/y7/Lv8u/y7/Lv8w/zH/Mf8x/zL/NP81/zb/OP84/zj/Of85/zv/O/89/z3/Pv8+/z//P/8//0D/QP9C/0H/Qf9C/0L/Qv9C/0H/Qf9A/0D/P/8//z//P/8//z//Pf89/z3/Pf89/z3/Pf89/zz/PP87/zv/O/87/zv/O/86/zn/Of84/zn/Of84/zj/N/83/zb/Nv82/zb/NP80/zH/Mf8x/y//Lf8t/y3/LP8r/yv/Kv8q/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/LP8t/y3/Lf8t/y7/Lf8t/y3/Lf8t/y3/Lf8t/y3/LP8q/yn/Kv8q/yn/Kv8p/yn/Kf8o/yj/KP8n/yj/KP8o/yj/J/8n/yb/Jv8m/yb/J/8n/yf/J/8m/yb/Jv8m/yb/Jv8m/yb/Jv8m/yb/Jv8n/yf/KP8o/yf/KP8q/yr/K/8q/yv/K/8s/yz/LP8s/yz/LP8t/y3/Lf8t/y3/Lv8u/y7/Lv8v/y7/Lv8v/y//L/8w/zD/Mf8y/zb/Of8+/0T/Sf9O/1P/V/9b/17/Xv9i/2X/ZP9i/2D/X/9d/1v/XP9c/13/Xf9f/2D/YP9g/13/W/9W/0//Rv8+/zb/Lv8q/yr/Kv8q/yr/Kv8p/yn/Kf8o/yj/KP8n/yf/J/8n/yf/J/8m/yb/Jv8m/yb/Jv8l/yX/KP8r/zL/OP9C/0//XP9p/3H/dv95/3v/ev94/3j/eP96/3b/b/9n/1j/Rv84/y//Lf8t/y//M/84/zv/Pv9A/0T/R/9K/03/VP9c/2T/bP92/33/gP+B/4H/gf+B/4H/gv+D/4H/ff92/2z/Xf9K/zj/K/8m/yP/Iv8i/yD/M/9M/z3/Iv8m/y//NP84/0T/Uv9h/27/dP93/3j/Wv89/yT/Mv8x/z//Tf9V/1r/W/9b/1//YP9h/2D/Xf9Z/1b/Uf9M/0X/P/84/zD/LP8t/y//Mv8w/y7/P/9N/1H/Uv9U/03/Sf9J/zb/Nf86/0H/Tf9a/2P/bf91/3f/d/93/3b/df93/3f/dP9z/3D/af9g/1L/Qv85/zH/Lf8q/yr/Kf8p/yj/KP8o/yj/KP8o/yn/Kf8p/yz/LP8t/zD/Mf8z/zT/Nv84/zr/O/8//0H/Q/9F/0r/Tf9P/1L/V/9b/1//Y/9n/2z/cf91/3b/d/95/3v/fv+D/4r/jv+T/5b/l/+Y/5f/lv+T/5L/j/+N/4r/h/+F/4H/ff95/3T/bv9q/2f/Y/9g/1z/W/9c/17/YP9g/2H/Y/9m/2b/Zv9n/2r/a/9s/27/cP9w/3P/dv91/3P/cf9x/2//b/9v/2z/bP9q/2b/ZP9g/13/W/9X/1b/Vf9T/1L/Uf9Q/1H/Uv9T/1v/Yf9p/2//df95/3z/ef93/3j/eP96/37/gv+H/4n/jP+N/43/jP+K/4n/if+I/4n/h/+G/4P/ff92/3D/Z/9h/1//Xv9d/1z/Wv9a/1z/X/9k/2j/av9t/2//cP9w/3D/bv9u/27/b/9y/3P/dP90/3H/a/9m/17/Vv9Q/07/TP9L/03/Uv9Y/2L/a/90/33/hP+I/4v/i/+J/4j/if+J/4n/iv+J/4j/h/+H/4X/gf99/3j/dv90/3X/df92/3b/d/93/3X/cv9u/2f/Yf9h/2L/Z/9t/3L/QH89cDt/OnA4gDhxNoA1cTR/M3IyfzJzMH8wcy5/LnUtgC12LoAudy6ALncvgDF2MYAxdzKAMnc1gDZ3N4A3dzqAOnY6gDp1PIE8dD2BPXQ8gj5zP4I/ckGCQXJBgkFxQYFBcUGBQXFCgUJxQIFAckCBQHI/gT9zP4E/dD+BP3Q+gT51PoE+dj2BPXc9gT14PIE7eTuBO3o7gTt5OYE5ejqCOXw5gjh8OII3ejiBOHs2gDZ7NoA2ejWANXs1gDV7NH8xfDF+MHwtfSx8LXwsfSp7Kn4qeyp+K3orfyt6K30reyt+LHssfSt7K38seyx/LHssfyx7LIAtfC1/LHwsfyx9LIEsfSyBLH0sgSx9LIEsfSyAKX0pgCh9KYApfSmAKH0ogSh9KIEnfSeBJn0ngSh+KIAofih/Jn0mgSZ9JoEmfCaBJnwmgSV+JYImfiaCJn4mgSZ+JoEnfieBJ34ngSd9J4EofSiBKH0pgSp9KoErfCuDK3wrgyx7LIMseyyDLHosgi16LYItei2CLnovgi95L4MweTCDLnkugy94L4IveC+CMnowgDR7OIA7f0F7R4FLdE+CVW5XhFxqXYNfaWKBYmphgF5rXH1cblt9W29afltwXYBdb2CCYXBhgmBvXoJZblR/THJEfDt2M3ssfCp7KoIqeyqDKnsqgyl7KYMpfCiDJ3wmgyd8J4MnfCeDKHwogyd8J4MnfSeDJn0mgyZ9JoInfSqCL341fj9+TnlYf2Vyb4B2bXiBeWh7gnpkd4J4ZHeCdGdvg2lsW4JNbz6BNHUxgDF3MoA2dzmBPnZAgUFzRYNHcUqCTW9TgVpvYoFobXOAemyAgIFrgoGBaYKAg2WDgoRohIN/a3iDcm5lg1NvP4IwcyiAI3ckfi59K3wxgDB7JoAkfCZ/MnwyfDZ+Q3ZRf2BybX90cHmCfGxphklrSodbaluHWWZYhVhnWYRca1+DYGxfg19uXYFZcVWATnVKfUR7PXs3gDB6LYMteSyELnothi14LoNedFN7Um1Pdk5xT3VSekl6NHw3fzx6QYFPe1l+ZH1ud3aAeHB3gXdrdYF1a3aCdmx3gnVtb4Nrb2KDUnFEgTp2Mn4teyp7Kn0peil+KnsqgCp7J4AofCh+KXsqfSx7LXsuezB6MXo0ejV4N3k5dzp3PHY/dUJzRXRIcUlyTG5QcVFtU29abFxuYm1la2lybWpweXNodn15Z3t+f2eCf4dojn+Tb5d/mHSZfJh3l3qVe5R5knqMeIp4iniHdoR6gHR7e3Vybn1pc2R8YXZeeVx3Wnhbd113XXZfdF9zYnJkbmRxZWxmcGdpaXFramxzb2pweHFqdH10aHN/cmlxgHBpb4BvaW6AbmdrgGlnZn5ial58W2xZd1ZuVXRUcVFzUHNQck9zT3FPdlNvWXZhbml4b3B2eXh0enl6eXl1eH15c3p9fnSBfIZ2inyOdY1+jXGLf4lviX+Jb4mAiXKIgIdygYB7cHaCbWxigl5lXoNdZFuDW2JbgVpjXYFhYmSAaWFrgW5icYBzY3GAcGVvf29obX9va3J/c250fXRucHxrbWR5XW1WeFFvUXRPc09wUXZWcV13ZnJvdXd3f3SGfYpyiX+JcYqAiG+JgIlxin+Jc4d/hnaFf4R3gn2Ad3x9eXR2f3VxdH52b3aAdm14f3hrdoB1anGCamplgWNqZX9obGx9c209/zr/Ov84/zb/Nf81/zX/NP8z/zL/Mv8w/zD/Lv8t/y3/Lf8u/y7/Lv8u/y//Mf8x/zH/NP8z/zX/Nv83/zf/Of85/zn/Ov88/zz/Pf89/z7/P/8//z//Qf9B/0H/Qf9C/0L/Qf9B/0L/Qv9B/0D/QP9A/z//P/8//z//P/8//z7/Pv8+/z7/Pf89/z3/Pf87/zv/O/87/zv/O/86/zr/Ov85/zn/OP83/zj/OP84/zj/N/83/zf/Nf81/zT/M/81/zP/Mv8y/y//Lv8t/yz/Kv8q/yr/Kv8r/yv/K/8r/yv/K/8s/yz/K/8r/y3/Lf8s/yz/K/8r/yz/LP8s/yz/LP8s/yz/LP8s/yz/K/8r/yv/K/8p/yn/Kf8r/yr/Kv8o/yj/KP8o/yf/J/8m/yb/J/8n/yf/J/8n/yb/Jv8m/yb/Jv8m/yb/Jf8l/yX/Jf8l/yX/Jf8l/yb/Jv8m/yb/J/8n/yj/KP8o/yr/Kv8q/yr/Kv8r/yz/Lf8t/yz/LP8s/yz/Lf8t/y3/Lf8u/y//L/8v/zD/MP8v/y//MP8w/y//MP8z/zP/Nv86/z//RP9J/03/U/9W/1r/XP9d/1//Yf9h/17/XP9a/1r/Wf9Z/1j/Wv9d/1//Yv9i/2L/YP9d/1j/Uv9J/z//Nv8x/yz/Kv8q/yr/Kv8q/yr/Kf8p/yr/Kf8p/yf/KP8o/yj/J/8o/yj/J/8n/yf/J/8m/yb/Jv8m/yf/Kv8t/zP/O/9I/1T/X/9t/3P/eP95/3n/eP93/3f/d/91/3L/av9h/1H/RP83/zP/M/83/zr/PP8//0H/Q/9C/0X/SP9M/0//Vv9g/2f/cP96/3//gf+B/4H/gf+B/4D/gP+D/4P/ff90/2v/Wf9G/zX/K/8m/yb/Pf82/yb/Jf8l/yH/Jf8r/y//Nv9D/1H/YP9t/3T/eP96/3r/eP9y/23/Zf9d/1v/Wv9c/17/X/9g/1//XP9Z/1T/UP9K/0T/Pf81/y7/LP8r/yz/Lf8t/y3/Lf83/3X/WP9R/07/TP9K/1P/P/8v/zb/O/9E/1H/W/9j/23/df93/3f/df92/3b/dv92/3f/df9w/2r/X/9S/0T/Ov8z/y7/K/8r/yr/Kf8q/yr/K/8q/yv/K/8s/yz/Lf8t/y//MP8y/zT/Nv84/zn/PP8+/0D/RP9H/0r/S/9O/1L/Vf9X/1v/X/9j/2f/a/9u/3P/dP92/3j/e/9+/4T/if+P/5T/mf+Z/5r/l/+W/5T/k/+R/4z/iv+I/4b/gf99/3X/b/9p/2T/Xv9b/1n/Wf9a/1r/W/9e/1//X/9h/2P/ZP9l/2b/Z/9p/2v/bv9v/3H/cf90/3T/cv9x/3H/cP9v/2//bv9u/2r/aP9m/2L/Xf9Y/1f/VP9T/1L/T/9O/07/Tf9M/07/Uf9X/2H/aP9w/3f/ev96/3r/ev96/3v/e/9//4L/h/+L/43/jf+N/43/if+J/4n/if+J/4j/hf+A/3r/dP9s/2L/Xv9b/1r/Wf9Z/1r/Wv9d/2H/Zv9q/2r/bf9x/3D/cf9v/27/bv9t/2//cf9y/3P/c/9v/2z/ZP9d/1j/U/9Q/1D/U/9V/1r/Yf9r/3P/e/+C/4n/iv+K/4r/if+J/4n/if+J/4j/hv+F/4T/g/+A/3//fP95/3b/df91/3X/dv92/3f/d/93/3b/cf9q/2j/Z/9p/2v/b/9z/zuAOnA4gDdwNoA2bzSANG8zfzJxMoAwcjB/MHIugC10LoAudi6ALncugC53L4AxdjKAMnYzgDN2NYE2czaANnM5gDl0OoA7dDyBPHM9gT1zPoI+cz+CQHJCgkJyQoJCcUKBQnFCgUJxQoFCcUCBQHI/gT9yP4E+cz6BPnQ/gT90PYE9dT6BPnU9gT12PIE8dzuBOng7gTp5OoE6eTmBOXo5gjl5OII4eTiBOXo4hDl5OoU6eDmFOXU6hjh1OYY5dTeEOXM3gjVzNX8ydTB+K3gqfSl8Kn0qfCt9LXsrfS16LH8seix/LXkufy56LX8seix+LHwsfil9K3wrfix8K4AsfSyALH0sgCx9LH8sfSx/K30qgCl9KoAqfSmAKX0ogCh9KIAofSiAJ30ngCZ9JoAmfiZ/Jn4mgCZ9JoElfSWBJX0lgSV9JYElfiWCJX4lgiV+JYElfiWBJn4mgSZ+JoEofSiBKH0ogSl9KYEqfSqBKnwqgyp8K4MseyyDLHssgyx6LIItei2CLnougi56L4IveS+DL3kvgy95L4MweDCCMXkygzN7NYE6fj5+Q4FHd0uCT3BVg1hqWoNbaV+CYGhfgV5pXYBabFmAWW9ZgFlwWoBecmGBY3FjgmRxYoJgcFyBVm5Qf0VyPHw2dy97K3wqeyqCKnsqgyp8KoMpfCmDKnwqgyl8KYMpfCmDKHwngyh8KIMnfCeDJn0mgyd9J4MnfSeCJ30ogit+MIA5fkN6UH9ddWmAcm95gXppeYF3ZXeBdmN3gnhldoNta2WDV29Igj1yNoE3czmBO3Q+gUFzQ4FDcUSDRnBKgk1vTYFTb16BZm1sgHVufICAbICBgWqBgIBmgIGBZYKCg2mAg3pub4NecE2CPHEwgCd3Jn4jfSJ+JH4lfSR9JH0kfCp9L3s1fkF4UX9ec22BdnB7hHxsfIR7anaFbmhohWNoXYRaaV6FX2tghWFuXYJZb1V/T3NJfkR5PXw2fy16K4IqeSuFLXkuhC54LoYueDyFanZmfVBwUXZOblRyXndYdzh7N30+ekSBUHtbfmZ9b3d1gHdwdYF2a3eBd2t2gnZsd4J1bW+DaG9gg1FxRYE6dzN+Lnwteyx+K3orfyx7LH4seyx+LXssfit7LH0tey59MXoyfDN5NXo2eDl5O3U+eEB0RHZHcUl0S25Oc1FrVHBXaltvXmlib2VraWxtcG5qcnZzaXZ8eGh7fn9phH+JbpF9l3Waepp8mHiXgJN3kX+Sdo1/i3aHfYV2gnp/eHl2dHttdGR8X3ZafFh4V3pXeld5WXpad1p2XXRec19yYXBkcWVtZnBnbGpxbWhvdXBncHlyZ3N+c2hzgHFpcIFvaXCAb2lugG1raH9oamV+YWpbfFZtVHZSblF0UHFOc01zTHJJc0tyTXRPcFZ2X25oenBwdHt5dnh5eHt3dXh9eHN6fX90hHyIdo18jneNfoxyjX+McIp/im+JgIhyiICEcoCAeXBygmlnYYJdZFqDWGRYg1hiWYFaYF2BYWBmgGlgbYFwYXKAb2NvgG5lbn9vaG5/cWt1fXZudHxzb296am5jeF1tWHRUcFJxU3NVbll3XW9ndW1ydXR+d4VziX2KcIl/iXCJgIlyiYCJc4l/hnSEf4N1gn2Bdn58fnZ8fHl0eH11cXd+dW92gHZtd393a3eAdGpygW9oaYFnaGl/bmtxfXVsOv85/zj/N/82/zb/Nf80/zP/Mv8x/zH/Mf8x/y7/Lf8u/y7/Lv8u/y7/Lv8v/zH/Mv8y/zP/M/81/zb/Nv82/zn/Of86/zv/PP88/z3/Pf8+/z7/P/9A/0L/Qv9C/0L/Qv9C/0L/Qv9C/0L/QP9A/z//P/8//z7/Pv8+/z//P/89/z3/PP88/z3/Pf89/zv/Ov87/zv/Ov86/zr/Of85/zn/Of84/zj/Of86/z3/Pv9A/0D/P/8//0D/Qf9C/0L/Qv9B/z7/Pv88/zj/M/8u/yv/Kv8q/yr/Lv8v/zD/Mf8x/zH/Mv8x/zH/Mf8w/y//Lv8u/y7/Lf8t/yv/LP8r/yz/LP8s/yz/LP8s/yz/LP8r/yr/Kf8p/yr/Kf8p/yj/KP8o/yj/KP8n/yf/Jv8m/yb/Jv8m/yb/Jv8m/yX/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8m/yb/Jv8m/yj/KP8o/yj/Kf8p/yr/Kv8q/yr/Kv8r/yz/LP8s/yz/LP8t/y3/Lf8u/y7/Lv8v/y//L/8v/y//L/8v/zD/MP8x/zP/Nf84/zz/Qv9G/0v/T/9S/1f/WP9c/17/Xv9e/1//Xf9a/1f/Vv9W/1b/Vv9Z/1z/Yf9j/2P/ZP9i/2H/XP9W/03/Q/87/zT/Lf8r/yr/Kv8r/yv/Kv8q/yn/Kf8q/yr/Kf8p/yn/Kf8o/yf/KP8o/yf/J/8n/yf/J/8n/yf/J/8n/yf/Kf8t/zT/Pv9M/1j/Z/9w/3X/eP94/3f/dv91/3b/d/90/3H/aP9a/1D/Qv86/zr/O/89/z//Qf9E/0P/Rf9G/0r/Sv9M/1D/Wv9i/2r/cv96/37/gP+B/4D/gP+A/4H/gv+C/4H/ev9x/2f/Vv9D/zT/KP8m/yP/I/8k/zL/Nf8h/yP/Kf8t/zX/Qf9O/17/bP91/3r/ff9//3v/eP9w/2z/Zv9g/17/X/9g/1//Xf9Z/1L/Tv9J/0L/Ov81/y//LP8r/yr/K/8s/y3/Lf8u/y7/Mv9R/2L/U/9T/1P/T/9i/2f/Qv83/zz/Rv9T/17/Z/9w/3X/d/92/3X/dv92/3b/dv92/3P/cP9p/13/Uf9F/zr/M/8u/y7/Lf8s/yz/LP8s/yz/LP8s/yv/LP8t/y7/L/8x/zT/Nv84/zj/Ov88/z7/Qf9E/0j/Sv9N/1D/U/9W/1n/XP9f/2P/ZP9o/23/cf9z/3T/d/93/3v/f/+F/4r/kP+W/5f/l/+V/5T/kf+Q/47/iv+H/4b/g/+A/3z/d/9t/2f/YP9b/1f/Vf9V/1b/V/9Z/1r/Wv9c/13/X/9h/2T/Zf9n/2f/a/9t/2//cP9w/3L/c/9z/3P/cv9w/2//cP9v/27/bf9p/2f/Y/9e/1n/Vf9S/1D/Tv9N/0z/S/9L/0n/R/9J/03/VP9d/2b/bf9z/3b/ef94/3f/d/96/3z/gP+E/4j/jP+O/47/jf+N/4z/iv+K/4r/iP+I/4T/f/94/2//Zv9e/1r/Wf9W/1f/V/9Y/1n/Xf9h/2j/av9t/23/cf9w/2//bv9v/2//cP9x/3X/dv90/3P/b/9q/2L/XP9a/1j/Vv9V/1f/Xf9i/2n/cf95/4H/hv+K/4n/if+J/4n/if+J/4n/if+G/4P/gv9//37/ff99/3z/ef94/3X/c/91/3b/dv93/3f/d/90/3L/b/9q/2j/af9v/3H/df85gDhuN4A2bzZ/NW80fzRvM4AybzGAMXAxgDBxLoAtcy6ALnUugC52LoAvdy+AMXUygDN0M4A0dDWBNnU3gTd1OoE6dTqBO3U9gT10PoE+dD6CPnNAgkFzQoFCckOBQ3JDgUNxQoFCcUKBQXJBgUByQIFAcz+BPnM/gT90P4E/dD+BP3U8gT12PYE9djyBPHc6gTl4OYE6eTqAOnk5gTl7OYE4fDiDOHk5hTt3QIhEdEaJSHJIiUhvSItJa0mLS2pKiEpoSIdJaUaDQWw6gDNwLn4sdy2AL3cxgjR1NYM2czeDOXI6hjpwOoY4cTiFNXI0gjFyMYEwdS9+LXgrfSp8LXwtfi18LH8sfCx/LH0rfyp9KoAqfSmAKH0ofyh9KH8ofSiAKH0ogCZ+Jn4mfiZ/Jn0mgCV9JYAmfiaBJX4lgSV+JYElfiWBJH4kgSV+JYElfiWBJX4lgSV+JYEmfiaBKH4ogCd8J4IpfCmCKnwqgip8KoMqfCuDLHssgyx7LIMtei2DLnougy16LoMuei6DLnkugy95L4MweTCDMXkxgzN7NoM4fjp/PoFFekuDT3NUg1dsWIRbaFuEXGdegl9oX4JcaluBWmtYgVdvWYFYb1yAYG9jgWRvZYNmb2OCXm9bgVRxS31BdTl8MnwseyqAK3srgit7K4IrfCuDK3wrgyt8KoMpfCmDKXwpgyl8KYMpfCmDJ3wngyh9KIMofSiDKH0ogiZ9JoIpfSyAMn06fEd/VXZigG1xdIB2aniBeGR1gHVhdYB4ZHaEc2lrhGJtU4NIbz2DO3A9gj9xQYJDcUSCRXBFhEZwRoNKcE2CUHBXf11uZn1ucHd+fm+Bf4JrgICAaICAgWeBgYJpg4J+bneCbXBbg0lwN4IrdCN+I3ohfyN+Kn8tfSN/I34nfy58NX9AeE9+XHVpf3RxeoB9bX6Ce2p5gnVpbYRmaWOEYGlfg11tW4FXblGBTHJJfkJ3OXsyfS17K4IseiuDK3oshSx5LYYveC+GMXcxhzV3RoNXcFF6S25Odld1Vnc8eTh/PXlHglR8Xn9ofXJ3eH93cHiBdWt3gXdrd4J3anaCc2tugmhvX4JQcUaAOnY0fTJ9Lnsufy56LYAseyyALHssgCt5K38teS9+MXoyfTN4M3w1eDp6OnY8eT50QHhDcUZ2SW9MdU9tUnFUa1ZwW2lebmFmY29naWtscG9yanZ2d2h4fHlofH+Aa4R+iXSPe5R7lniVgJR2koKPdIyEi3OIgYRzgoCBdHx7eXhyd2t6ZHZae1R3VXpVe1R6VHxVeVZ6WHZaeFp0W3Recl9wY3FlbmdwaGxscW1qbnRvaW95cWhzf3NpcoBxaXCAb2dxgHBpcYBtaWqAZWlhf1tsWHpUbFF2UG5NdEtvSHNHcUVzRHNFckZ1S3FReFpxZnlscnN8d3h4eXh8eXV3fHl0fHyAdYN8h3eLfYx2jn6Ncox/i3KKf4pyin+Jc4h/hHN+gXdtboJmZVyDWGBXgldiVoFXYliAW2FegGJhZ4BqX2yBbWBxgHJjb4BtZm6AbmhvfnBrcnx0bnN6cm5veGpuYnZcbllyWXFXb1d1W2tgdmZvbHR0dXxygnmHcYl+iXGKf4hxiYCIc4iAiXSHf4N1gH9+dn1+fHh7enx3fHx5dHZ+c291gHdtdoB2bHeAeGp3gHZpcoFvaG2Ba2hsf3Bqc353azj/N/82/zb/Nf81/zP/M/8z/zL/Mf8x/zD/Lv8u/y3/Lv8u/y7/Lv8u/y//L/8x/zL/M/80/zX/Nf82/zf/N/85/zr/O/88/z3/Pf8+/z7/P/8//0D/Qf9C/0L/Q/9D/0P/Q/9C/0L/Qv9B/0D/QP9A/0D/P/8+/z7/Pv89/z3/Pf89/z3/Pf89/z3/PP87/zr/O/87/zr/Ov85/zn/Of84/zf/Of86/z3/Qf9G/0r/Tf9P/0//T/9Q/1L/U/9T/1L/Uv9T/1L/T/9J/0P/Of8z/zH/Mv81/zj/O/8+/0D/Qf9E/0T/RP9F/0P/Qv8//zz/Ov85/zf/M/8w/y//LP8t/y3/LP8s/yz/LP8s/yv/Kv8q/yr/Kv8q/yn/Kf8p/yj/KP8o/yj/Jv8m/yb/Jv8m/yb/Jf8l/yb/Jv8l/yX/Jf8l/yX/Jf8k/yT/Jf8l/yX/Jf8l/yX/Jf8l/yb/Jv8n/yf/J/8n/yn/Kf8q/yr/Kv8q/yr/K/8s/yz/LP8s/y3/Lf8u/y7/Lv8u/y7/Lv8v/y//L/8v/y//MP8x/zP/Nf83/zz/QP9F/0v/T/9T/1b/W/9c/1z/Xf9f/17/Xf9g/17/XP9b/1r/Wv9a/13/YP9h/2P/ZP9l/2T/Y/9d/1n/UP9H/z7/N/8w/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8q/yn/Kf8p/yn/Kf8p/yn/Kf8p/yf/KP8o/yj/KP8o/yj/Jv8m/yf/K/8w/zf/Qv9Q/1z/af9x/3X/d/94/3b/dP90/3b/dv9z/23/Z/9Z/07/Qv89/z//QP9C/0T/RP9F/0b/R/9G/0j/S/9P/1P/Wf9h/2j/cv97/4D/gf+A/3//gP+A/4L/g/+D/4D/e/9z/2P/UP8//zD/J/8k/yL/If8j/yL/Iv8j/yf/Lf8y/0D/Tf9a/2n/dP94/37/fv97/3n/df9u/2f/Yv9f/13/W/9X/1L/Tf9G/0H/Ov8y/y3/K/8q/yr/Kv8r/yz/Lf8v/zD/MP8y/zT/Mv9M/1f/S/9J/0n/W/9O/zb/OP9A/0r/Vf9g/2r/dP94/3j/d/93/3f/d/93/3f/d/90/2//av9e/0//Rf88/zX/MP8u/y7/Lv8u/y3/LP8s/yz/Lv8u/y3/L/8x/zL/M/8z/zX/Ov87/z3/Pv9B/0T/SP9K/03/UP9S/1b/WP9b/17/Yv9l/2n/bf9x/3X/dv94/3v/fP99/4H/hP+J/47/k/+T/5H/kP+P/43/i/+I/4b/gv+A/3z/d/90/27/Z/9g/1f/U/9V/1L/U/9T/1L/VP9W/1n/Wv9b/17/X/9h/2T/Z/9q/2z/bf9v/2//cP9y/3P/c/9y/3H/cP9v/3D/b/9t/2v/Z/9i/1//Wf9V/1H/T/9N/0v/SP9G/0T/Q/9B/0H/Q/9I/0//Wf9j/2z/cv93/3j/d/93/3j/e/99/4H/hP+I/4v/jP+N/4z/i/+K/4r/iv+K/4n/iP+E/37/d/9u/2b/Xf9Z/1n/WP9W/1f/Wf9c/1//Yv9o/2v/bv9w/2//b/9w/27/b/9v/3L/c/90/3X/dP9z/3D/af9i/1z/Wf9Z/1n/W/9d/2P/af9w/3f/f/+F/4j/if+I/4n/iP+I/4n/if+I/4X/gP9+/3z/e/94/3v/ff99/3n/d/91/3b/d/92/3f/d/94/3j/d/90/3H/bf9r/2v/bv9z/3f/NoE2bjaBNm81gTVwM4EzcDOAMnAxgDFyMIAvcy2ALHQugS51L4Evdi+BL3UwgTJ0M4A0dDaAN3Q2gTd1N4E4dTqBOnU6gTx1PIE8cz2BPXM+gj9xP4JAcUOBQ3JDgUNyQ4FDckKBQnJCgUBzQIE+cz6BP3M/gT50PYE9dD2BPXU9gT12PYE9dj2BPXc8gTx3O4E6eDqBOnk5gDl5OIE5ezqDOns7hD14QIVFdUmITnFSiVZsV4lXaliJWWlbiVtoWolaZlqIXGVZh1RmS4VDajyDOm47hT5tQYdDaUmIS2ZNiVBjU4pUYlKJT2ROh0plSodJaEWGQGw9gzhvMYAvcy1+LHctfit6K30rfCp9LH4qfSp+KX0pfip9KX8pfSh/KH0nfyd9J38nfieAJn4mgSZ9JYAlfSWAJX4lgSV+JYEkfiSBJH4kgSR+JIEkfiSBJX4lgSV+JYElfiWBJX4lgSd+J4AnfCeCKHwpgip8KoIrfCuDK3wrgy17LYMtey2DLXkugy55L4MveS+DL3kvgy95MYQveTGDMXkygzJ7NII4fzx9P4JEeUmCUHFShFZqWoRbZ12FXmVhhWJjY4NjY2CCX2RegVxpXIFcbV2BYHBigGFwYYFkcGWCY29hgF1wVoBNckR8O3c0ey58K3srgCp7KoIreyuCK3wrgyt8LIMrfCuDKnwqgyp8KoMpfCuDKXwpgyh8KIMnfSeDJ30ngyd9J4ImfSaCKH0pgS99NX4/fUx4WH5mcm+Acmt1gXVldYJ1Y3SCdmN3g3RlcINraV+DU2xIg0FtQIJCcEOCRXBGgUZwRoJHcUeDR3FJgk1xTX9ScVt9ZHJtfHZyfX2BbYGAgWiBgYFmgoKEaYOCgmx9gnRwaYNYcUWDNXMofyR4In8kfCN+JH0jfSN9Jn8sezR/QHdNf1p0aH9zcXqBfW18gnxseYJ1amyDZWpjg15qXIJXblGBTHJGfkF3OnwyfC17KoAqeyqCKnorhSt6LIYteS6GL3gvhi53Loczd1mFVHZQfUlzSnVNdVZ2PXk6fUF5S39WfV98bH53dnl/eXB4gXVsdYF2bHiCeGx2gnNtboJob12CT3FEgD12Nn0yfS97L38uei6ALnsugC17LIAuey5/LXsvfjB7Mn4zejV9Nng4ezp2PHo/dUF4RnJJd0pvTXZRbFNyVmpYcVxnX29kZmZwamlubXJvdmt4dntqfHx9an5/gW6Ffop2jnuRfpF4kIKNdo2EinSGhIV1g4N/dH2BeHVyfW54aHlhelp5V3tTe1F6UHxPeVJ8UnhSeVN2WXdadFt1XHJfcmFxY3FocGpubHFubHB1cGlze3Noc39yZnKAb2ZvgG9mcIBvZ2yAZ2hkgGFoXH9XalJ7T2xOd0twSnVHcUN0QXE+dTxxPHM/ckVyTHZWc197aXVwe3h4e3l5fHd1d3x5d398gniFfIl3i32Ndox+inKJf4lyin+Kcol/iXOHf4NzgIF5bW6CZWVdg1hgWIJYYVeBWGBagF5gYIBjYGiAa2BtgW5hcIBwZHCAcGdvf3BpcX5ybHV8dW50enJubndpa2J0XWxacVhxWm5edWJrZ3Ztb3Z0fHWCcYZ7iXCKf4hwiICIcYaAiHOIgId0gn9+dHx/enV4e3h2eHl8dnx7enF3fXZudYB1b3eAeG15gHlseYB3anSBcWhtgWtobX9xanR+dms2/zX/Nv82/zb/Nf80/zP/M/8y/zH/Mf8w/zD/Lv8t/zD/MP8x/zH/Mf8x/zP/Nf8z/zT/Nv83/zf/N/84/zn/Ov86/zr/O/88/zz/Pf89/z7/P/8//0D/Qv9C/0L/Qv9B/0H/Qf9B/0H/Qf9A/z//Pf89/z//Pv89/z3/Pf89/z3/Pf89/z3/PP88/zv/O/86/zr/Ov85/zn/Of83/zn/Ov86/zz/Pf9B/0f/S/9Q/1P/WP9a/1r/W/9c/17/Xv9f/1//X/9h/1//XP9V/03/Rf9D/0T/Sf9N/1D/Vv9Y/1v/Xv9f/2D/Yv9f/1//Xf9Z/1b/Uv9O/0f/Qv89/zb/Mv8v/y7/Lf8s/yz/LP8r/yv/K/8p/yn/Kv8p/yn/KP8n/yf/J/8n/yf/J/8n/yf/Jv8l/yX/Jf8l/yX/Jf8l/yT/JP8k/yT/JP8k/yT/JP8l/yX/Jf8l/yX/Jf8l/yX/J/8n/yf/J/8n/yj/Kv8q/yv/K/8r/yv/Lf8t/y3/Lf8u/y//L/8v/y//L/8w/y//MP8w/zD/Mf8x/zL/Nf84/z3/Qf9E/0n/Tv9S/1f/W/9d/17/Yf9i/2T/Z/9m/2b/ZP9i/1//Xv9e/17/X/9h/2P/Y/9k/2T/Zf9j/1//XP9S/0r/Qf85/zH/K/8r/yv/Kv8q/yv/K/8r/yv/K/8s/yv/K/8q/yr/Kv8q/yr/Kv8q/yr/KP8o/yf/J/8n/yf/J/8n/yj/KP8o/yn/LP8y/zv/Rv9T/2D/a/9y/3X/d/91/3X/df91/3f/dv9x/27/Z/9Z/07/R/9D/0L/RP9G/0f/Rv9H/0b/Rv9G/0j/Sf9J/0z/VP9e/2j/cf95/37/gv+B/4H/gf+B/4L/g/+C/4D/eP9v/2D/Tf88/y7/J/8j/yX/I/8k/yT/JP8o/y//Of9B/07/XP9n/3L/d/96/3v/e/94/3T/bP9l/1//XP9V/1H/S/9D/z//OP8y/yz/Kv8q/yr/Kv8q/yv/LP8s/y3/Lv8v/y//Lv8u/zL/TP9k/1j/Sv9M/0z/WP89/zn/Qf9L/1f/Yv9t/3b/ef95/3j/d/91/3b/eP94/3b/c/9t/2f/Xf9P/0P/PP82/zL/Mv8v/zH/Mf8w/y//Lv8s/y7/Lv8v/zH/MP8y/zP/Nf82/zj/Ov88/0D/Q/9G/0n/S/9O/1L/U/9W/1n/Xf9f/2T/Zv9r/2//cf91/3n/fP9//4D/g/+D/4j/i/+N/4//j/+O/4r/if+H/4b/gv9//3z/eP90/3D/af9j/13/V/9T/1H/T/9P/0//UP9Q/1L/Vf9W/1n/W/9c/17/YP9j/2j/av9s/27/cP9w/3H/cv9y/3H/cf9x/3H/cf9w/2//bf9p/2X/X/9a/1T/Tv9N/0v/Sf9G/0P/QP8//zv/Ov86/zz/Qf9K/1X/X/9o/2//dv93/3f/df93/3n/fv+D/4X/if+K/4z/i/+K/4j/iP+H/4f/iP+I/4f/g/9//3j/cf9n/2D/Wv9a/1r/Wf9c/1v/X/9j/2b/aP9r/2//b/9w/3D/b/9v/2//cf9y/3P/df9y/3T/cv9t/2j/Yv9d/1v/Wv9b/17/ZP9q/3H/eP9//4T/h/+J/4r/iP+I/4j/iP+J/4j/h/+C/37/ev94/3T/dP94/3v/e/94/3n/dv93/3f/ef95/3n/ef94/3f/dP9x/23/a/9u/3D/cv91/zeBN2s0gTRsNYA1bjSAM28zgTJwMYExcTGAMXEwgC5xLoExczKBMnMxgTFzM4E0czWAN3Q3gDd0N4E4czmBOXM6gTpyO4E7cj2BPXI/gT9yQIE+ckCBQXJCgUByQ4FDckSBRHNCgUJzQYFAcz+BPnM+gT1zPoE+dD2BPXM9gT10PoA+dT6APXY7gDt2OoA6djqAOXg5gDl5OIA3ejiAOHs5gTp5O4E9eEKER3ZLh09yUohWbVqHWmxbiFxqXYheaWGIZGdiiGFlYodgY12HV2JQhk5jT4ZTY1iIXGJfh2FiY4llYmqJamJoh2dgZodmYWOIX2RdiVhlVohRZUmEQWg8gjVvMn8tdSt+K3stfit9K30qfyp9Kn4pfSh9KH0ofSd9J34nfSd+Jn4mfyd+J38mfiV/JX4lfyR+JIAkfiSAI34jgSN+I4EkfSSAJH0kgCR+JIElfiWBJX4lgSV+JYElfSaBJ30ngSd8J4IpfCmCK3srgix7LIItei2CLnougi95L4MveS+DL3gwgzB6MIMveTCDMHsxgjJ9NoA5gD18QoFGeEqETnNUhFZtWoVdZl2FYWNjhWVgaIRqYGuEaWBlgmVgY4FgZl+BX29ggWFxY4BlcmaBZHFjgmFwW4BXcU19RHc+ezd8L3srfyx7LIEreyuDLHssgyx8LIMrfCuDLHwsgyt8K4MqfCqDKnwqgyt8K4MpfCiDKX0pgyh9KIMofSiDKH0ogyZ9J4IqfS9/N35EeFF/XXJpgHJudYF1ZnWCdWFzgnRjeIJ3ZnSCcGtrg19qVINKakODRGtEg0dtRYNHb0aDR3BHgkZyRIBGc0V/RnNNfVd0Y3xuc3h+fnCCgIJqgoCCZ4KBgmiDgoNrgYN7bnODZHBTg0FxMYAndCR/JHolfiZ8JoAneyyANXk4gUR0ToJacGeBcnF2gndseYJ5a3WCcmttgmVsXYJXbVGBSnFFfj93OHwweyt7KX4peimBK3orgip5K4QteC2FLnguhi93L4YwdzCGMXdDhmZ4VntSdE50UHNWdTh4PXxDek2AWHxjfm5/dXd4gHpweIF4bHeBd2x4gXhrdoB0bG2CZ25dglByRIA8eDZ9Mn0zezJ+MnoyfzJ7Mn4vey1+LnsvfzB7Mn8yejF9M3o1fDd5OXw6dz16QHVDeEdySnZNb091UmxVc1hpWXFeZmFvY2VncWxmcG9ybHZtenV+bIB8hGyDfoVxiYCMd418jX2MeYqBiHiHg4R1goR/dnyBeHZ0gHB3a31jeVx7V3pTelB8T3tPe096TnpQeVF5U3hUeFZ3V3ZbdF5zX3JjcmRwZXNnbW10b2pveG9pcH1xZ3KAcWZxgHFmcYByaXCAb2ltgGhoY4FeZ1l/U2lOektqSHhDbkJ2QHA9dztxOXY3cjdzOnNAdUt3VHVfe2l2cHx1end6d311dnd7enV9e4N4hnuJd4p8jHWLf4pyiICHcoaAh3KHf4Zyhn+DcYGAemlygmlhZINdXlqCWF9agV1dXIFfXmGAZWBogGxib4BvZHGAcWZxgXFocIBya3N/dW11fXRuc3lwbWx2Z2xicVxtXG9ccl5sX3NmbG11c3B6dIF2iHSJfYpyiYCIcIiAiXKKgIp0iYCHdIGAfXR5fXZ1c3p0d3h4fHd6e3hyeX54bneAeW14gHhteoB6a3iAd2l1gHJmbYBrZW1+cWh0fXVrN/83/zX/NP8z/zP/NP8z/zL/Mf8x/zH/Mf8x/zD/L/8v/zD/Mv8y/zP/M/8z/zX/Nv84/zn/Of83/zf/OP84/zr/Ov87/zv/Ov88/z//P/8//0D/QP9B/0H/Qf9B/0H/Qv9C/0L/Qf9A/0H/Pv89/z7/Pf89/z3/PP88/zz/PP89/z3/Pf88/zv/O/86/zr/Of85/zn/OP83/zf/OP83/zf/Of88/z7/QP9E/0n/TP9P/1L/Vf9Y/1f/WP9b/1z/X/9i/2L/ZP9m/2T/Y/9g/1v/V/9a/17/Xv9j/2X/Z/9n/2n/a/9r/23/af9r/2v/af9n/2X/Y/9f/1n/Vf9P/0j/QP85/zL/Lf8s/yz/Kv8q/yn/Kv8q/yn/KP8o/yj/J/8n/yf/J/8m/yb/Jf8l/yX/Jf8l/yX/JP8k/yT/JP8j/yP/JP8k/yT/JP8k/yT/JP8k/yX/Jf8l/yX/Jf8l/yX/Jv8n/yf/J/8n/yn/Kf8r/yv/LP8s/y3/Lf8u/y7/L/8v/y//L/8v/y//MP8w/zH/Mf8y/zT/OP87/z//RP9I/0z/UP9U/1b/Xv9f/2L/ZP9l/2n/av9r/23/bP9s/2n/Zv9l/2P/Yf9g/2L/Yv9k/2T/Zf9k/2T/Xv9Z/1P/Sv9B/zn/Mv8u/yv/LP8s/yv/K/8s/yz/LP8s/yv/K/8s/yz/K/8r/yr/Kv8q/yr/K/8r/yv/Kf8p/yn/KP8o/yj/KP8o/yj/J/8m/yn/Lf80/0D/Tf9Z/2T/bv9z/3b/df91/3T/df93/3j/d/9z/2//Zv9Z/0//SP9E/0T/Rv9G/0b/Rv9H/0b/RP9B/z//Pv9C/0b/UP9d/2r/dP98/4L/g/+C/4L/gv+C/4P/g/+B/3z/dv9q/1r/Rv82/yv/Jf8l/yb/Jv8p/y7/Mf83/z7/Rv9O/1v/Z/9y/3b/d/94/3j/df9y/23/Y/9Y/1L/S/9E/z7/OP8w/yn/Kf8q/yn/Kf8r/yv/K/8s/y3/Lf8u/y7/L/8v/zD/MP8w/z//Yv9h/1H/TP9P/0z/Rf88/0L/Tv9Z/2X/b/92/3n/ev94/3j/d/93/3j/eP92/3T/bf9n/13/UP9E/zz/OP80/zP/Mv8y/zL/Mv8y/zH/Lf8u/y//L/8w/zL/Mf8z/zX/N/85/zr/Pf9A/0P/R/9K/03/UP9T/1b/WP9a/17/Yf9j/2f/bP9w/3L/dv97/3//gv+G/4X/iP+K/4z/jP+N/4v/iP+G/4X/gv9//3z/ef90/3H/a/9j/17/V/9T/1H/UP9P/0//UP9S/1P/Vf9V/1f/Wf9a/1v/Xv9h/2L/ZP9o/2r/bf9v/2//b/9w/3H/dP9z/3H/cf9x/3L/cP9v/2z/af9j/1z/V/9Q/0z/Rv9D/0D/Pf88/zn/OP82/zX/Nv84/z7/Sv9V/2D/af9w/3X/d/93/3X/eP95/4D/hP+G/4n/i/+L/4r/iP+I/4f/hf+G/4f/hv+G/4P/gP95/3D/Zv9i/17/XP9c/1z/Xf9e/1//Yv9m/2n/bv9w/3H/cv9y/3H/cv9y/3T/df92/3b/dv90/3H/a/9l/2H/Xf9c/13/X/9i/2j/b/93/37/hP+J/4r/iv+J/4j/iP+J/4r/iv+J/4f/gP98/3j/c/9x/3b/ef97/3r/ev94/3f/d/92/3j/eP94/3j/eP93/3X/cv9v/23/bf9u/3H/c/82gTZrNYE0bDSANG0zgDJuMYEwcDGBMnExgTFxMoExcTGBMXMzgTNzM4E0czSBNHM2gDVyN4A3cjiBOXM5gTpzOYE5cjqBOnI8gTtyPYE/cj+BP3JAgUFyQIFBckGBQXJAgUByPoFAc0CBQHM/gT5zPYE8dD2BPnQ9gT12PIE8dj2APXY8gDx2O4A6djmAOXc5gDl4OIA4eTeANno2gDZ7NYE2eTmBO3g/gUJ2RoJKck2DUG5TglVtVYJUa1OCVGpYg11oYYVjZmWGZWRnhmVjY4VgYmCFYmNjhmZkZYVnYmmFaWFphWlhbIVsYmuFbGRphWlkZ4ZkZGOIYmNgiFtjVYZMZkWCPWw1gC5xLH4qdyp9KXsqfSp9KX0ofSh9KH4mfSZ+J30nfiZ+JX8lfiV/JX4lfyV+JX8kfiSAI34jgCN+I4AjfiOAJH4kgCN+I4AjfiSBJX4lgSV+JYElfiWBJH0lgSd9J4EnfCeCKHwpgip7K4IseyyCLXotgi56LoIveS+DL3kvgy94L4IvejCCMXw1gTZ/N348gkB6RYRJdU2FU3BXhllrXIZfaGSGaGRqhm1fboZwXXCEclxxgm9gaoJpZWiBZGtjgWFwYoFjc2OBYnJjgmFxYH9bclR+TXRDezx6NXovfy57LIEsfCyCLHwrgyx8LIMsfCyDLHwtgyx8LIMrfCuDK3wrgyt8K4MrfCuDKnwqgyp9KoMofSiDKX0pgyh9KIMofSiCKn0tfzJ+PHtIf1V1ZIBtb3OBdmp2gnZldoJ2YXaCeWN5gndldINpaF+DU2pJg0VrRINFbUeDR29Gg0VwRYJCcz5/O3U7fjx4QHtMeFh7ZHZyfnpzgoCDbIOAgmmBgYJogoKCaoKDgG53g3BvX4NMcTuCLnQmgCZ4J38peS2AMHg1gjtzQIJJblCDXGxngnFsdoJ3aneCd2tzgnBra4JfbVWCTXFGfz92NXwueit7KH4peimAKnoqgit6K4QseSyELHgthS54LoYvdy+GMXcxhjF3NIZOd2WBUnNLd09zVXNeeU11P3tReVt8Z3txfnd1eoB6b3iBeGt3gXdrd4F3a3WAc2xtgmhvXIJPc0WAPXc4fTV8NHszfjN6Mn8yezKAMHsvgC97L38vey9/L3oxgDJ6NH83eTl8O3c+e0F1Q3pIckt4TG9OdlNsVXRXaVpyXmZicGNlZ3FtZnFvdGx4bX51gmyDfIZrh36JcYp+i3eLfYp6iXuGfYR6g4CBeH2BeXh0f3F6a3xme195WH1UdVJ+T3VPgE91UoBSc1V/WHRYflpzWnxdcl57X3BieWNwZXhnb2p4a2xteW5ob3xwZ3F+cmZ0gHNoc4ByanKAc2lwgG5pboBpaWSBXWhWgVFoS35Ea0F7Pm07eTpvN3g2cDJ3MnE0djhzP3VKd1Z0YHprdnF5dnl5d3h7dnN4e3t0f3uEdod7ineLfIt1iH+HcYeAhnGFgIZyh3+Jcod/hG9/gHhob4JnYGKDYF1egl1fX4FgXWCBY15lgGhgaoBuY3GAcmVyf3Jnc4BzaXWAdmx1f3hvdn12bnN5cm1pdmNsXnFdbVxuXnFia2ZybGtzcnlygHGHeYlxi36LcYp/inGJgIpzioCLdoqAhnd/gHt1dn10d3J4dHl4d3x4fHp4dHh+eG93gHdseIB4bHmAeWt4gHdpdIBxZW2Aa2Rtfm9mcn10aDb/Nv81/zT/NP80/zP/Mv8x/zD/Mf8y/zL/Mv8y/zH/Mf8x/zT/NP81/zX/Nf81/zb/Nf83/zf/Of84/zn/Ov86/zr/O/87/zz/Pf8+/z//P/8//z//QP9B/0D/Qf9B/0D/QP9B/0D/P/8//z7/Pv89/zz/PP89/zz/PP89/z3/PP88/zv/O/86/zr/Of85/zn/OP85/zn/Nv82/zb/Nf80/zX/OP85/zz/P/9C/0b/SP9L/0r/Sv9J/0r/Sv9J/0//VP9Y/13/X/9l/2j/aP9o/2X/ZP9l/2f/Zv9l/2X/ZP9k/2T/Y/9l/2X/Zv9n/2f/Zv9n/2n/aP9o/2j/Zf9i/1v/U/9M/0H/Nv8w/yr/Kf8p/yr/Kv8p/yn/KP8o/yf/Jv8n/yf/Jv8l/yX/Jf8l/yX/Jf8l/yT/JP8j/yP/I/8j/yP/I/8j/yP/I/8j/yP/JP8l/yX/Jf8l/yX/Jf8l/yb/J/8n/yf/J/8o/yn/Kv8r/yz/LP8t/y3/Lv8u/y//L/8v/y//L/8v/y//MP80/zb/Of87/0H/R/9M/1H/Uv9Y/1r/YP9k/2f/af9t/2//cf9z/3P/d/91/3L/b/9t/2r/Zv9l/2P/Yf9j/2T/Y/9i/2L/YP9b/1X/T/9G/zz/Nf8x/y//Lv8s/yz/LP8s/yz/LP8s/yz/LP8s/y3/LP8s/yv/K/8s/yz/LP8s/yv/K/8r/yv/Kv8q/yj/KP8p/yn/KP8o/yj/KP8p/yz/Mf85/0T/Uv9f/2r/cf92/3X/dP90/3T/dv95/3r/ev91/23/Yv9Y/03/R/9G/0b/R/9H/0b/Rf9D/z//O/84/zf/OP88/0b/VP9i/23/dv+C/4T/g/+C/4H/gf+C/4L/gv+B/3r/c/9l/1T/Qv8y/yn/J/8p/yv/MP80/zn/P/9F/03/VP9d/2j/cf93/3j/d/93/3L/b/9p/1z/UP9I/0D/OP8v/yv/Kf8p/yn/Kf8q/yr/K/8r/yz/LP8s/y3/Lv8u/y//L/8x/zH/Mv8y/z3/Z/9o/1L/UP9J/1r/Yf9K/03/W/9o/3P/eP96/3n/eP93/3f/d/93/3f/df9z/23/aP9c/0//Rf89/zj/Nf80/zP/NP8z/zL/Mv8w/zD/MP8w/zD/MP8w/zD/NP82/zf/Of87/z7/Qf9D/0j/S/9N/0//Uv9U/1j/Wf9d/17/Y/9n/2z/cP90/3j/fv+C/4X/iP+I/4r/i/+M/4n/if+I/4X/g/+C/4D/ff95/3T/cP9q/2T/Xf9Y/1b/VP9V/1P/Vf9Y/1j/Wv9c/13/X/9g/2D/Yv9j/2T/aP9p/2n/a/9t/2//b/9w/3H/cP9x/3P/cv9z/3L/cv9z/3L/cP9v/23/Zv9g/1r/VP9N/0P/Pf86/zn/N/81/zP/Mf8w/zL/OP9A/0v/V/9h/2v/cv92/3f/eP92/3j/e/9//4T/h/+K/4v/i/+J/4j/h/+G/4f/iP+H/4j/iP+F/3//eP9v/2f/Yv9g/2D/X/9f/1//Yf9k/2b/af9s/2//cf9y/3P/c/90/3T/dv92/3f/eP92/3b/cv9w/2n/Y/9e/1z/W/9e/2L/Z/9v/3f/ff+E/4j/i/+M/4v/iv+K/4n/iv+K/4r/if+E/3z/eP9z/3D/cP9z/3n/e/97/3n/eP94/3n/ef94/3j/ef95/3j/d/90/3H/b/9t/27/cP9y/3T/NYI1bTWCNW40gjRxNIIycTKCM3AygjJwM4IzcTOCM3EzgTRyNYE1czWBNXQ2gTZ0NoE2dDaBN3Q5gTtzO4E7czuBO3I8gTxyPII+cz6CPnI/gj9yP4I/ckGBQnJAgUByQIBAckCAP3M+gD50PYA9dD2APXU+gD11O4A7dTuAO3U6gDp3OoA6dzqAOnk5gDl5OH84eDd/N3k1fzV6NX81ezSANHs1gDV7N386eDl/PHU+fj1yPnw+cjp9OXI5fTtyQ39JblGBV2pfgmRnaIRpZ2iFZ2dmg2VmZYFiY2F+XGZXe1RmVHtYZlx+XGZdfl1mXYBgZGGDZGVmhmhiaodrYW2IamBghlZjTINBajSALXQqfil4Kn4qeih9KHwpfSh8J30mfSZ9Jn4mfSZ+JX0lfiV+JX8lfiV/JH8kgCR/JIAjfiKAI34jgCN+I4AifiSAI34jgSR+JYEmfiaBJn4mgSZ9J4EnfSeBKHwogip7KoIqeyuDLHsugy16LYMtei2DL3kvgzB6MIMwezGDMn00gTeBPH0/hER3S4dQcVSGVmxZhV9lYoVnYmqFbV9vhXFdcoZ2W3WGeVx4gndedINxYm2AaWxlgWRuZIBkcWSAY3NjgGJyX35ZdFZ8UXdGfEF6OXsyfyx7LIAseyyDLHssgy16LYQtei2ELHsshC57LoQtey2ELXsthC57LoQteyyDLXwtgy18LYMrfSqDKn0ogyl8KYMpfCmDKX0pgil9LIEyfDd+P31Od11/aXFxgHRrdYF1ZXSBdWN2gXdleYN5Z3eDcGdng1xpUYNJakeDR21Ig0VwR4JFcUOAPXM3fzR4NH00ezl8QXtPfF95a315doCAhG+FgYNqgYKAaIGCg2iEgoNvfoJ3cGuDWnBIgzlzLoIqdS2CMHU0gzpyPoVDbUqEUWtYhV9raINxaniDeGt5gnZscYJvbGiBXG5PgERxOX8weCp8KX8peymCKXopgyp6KoMqeiqDK3kshS15LYUueC6FLngvhS92MYcweDOGO3dShGR0VHxUckdzTnZOclJ6UXdafmd4dH96dXyAenB6gXlsdoF2anaBdmt0gXFsboNnblyDT3JGfz53Onw3fDZ7NoA1eTWANXozgTF7MYEwfDCAMHwwfzB7MX4zejV9Nnk3fTp4PX1BdUN8R3RKek1vT3lSbFN2VmpYdFlnYHNiZmhyamhucXNseG99dYFuhHyGbop+i3GJfopziX6IdoR9g3mCfIF6f3x8fHl8dnpwfmh3Y4BccFiAVnBXgldxVoJZbVuCXWthgmJrY4FlbWV/Z2tqgGttbH5ubW59cGtxfnJpc35zZnF/cWRyf3Njc4FyZXKBcmlxgHRpcoByaXGAbmhqgGVnX4FYZ1GBSmdCfjxqNns1bzV5M3AyeTBwMnc3c0B1S3dWdGF6bHZzfHZ6d3p3fHZ2enx9dIF8hXWIfYt1i36LdIp+iXKIgIhyiH+Jc4p/inKGf4VugIB5ZW+CaF5kg2JcYIJfXF6AX1tigGdgZoBqYm6BcmNxgXNlc4BzaHSAdWt4f3hveH96cXd9dW5yeWxrZnVhaV1wXWxdbGBwZWpqcXJseXN/dIVyiXqLcIx+i3CKf4pwi4CKc4yAinWIgIJ0fH93dHF7bXVwd3V4eXV7eHt6eHF3fnZtdoB2bniAeG53gHdseYB4aHWAdGdwgG9kcH9yZXN/dWY1/zX/Nf81/zT/NP80/zT/M/8z/zT/M/80/zT/NP80/zX/Nf81/zX/Nf81/zb/Nv82/zb/Nv83/zn/O/87/zv/O/88/zz/PP89/z//Pv8+/z//P/8//z//QP9B/0D/QP9A/0D/P/89/z3/Pf89/z3/PP87/zz/PP86/zr/O/87/zr/Ov86/zr/Ov86/zn/Of84/zf/N/82/zb/Nf81/zT/M/8z/zP/M/8x/zT/Nf82/zb/Nf8z/zP/MP8w/zD/Mv85/0D/SP9R/1n/Xf9i/2X/Z/9l/2b/Yv9f/1n/VP9P/0j/Rv9G/0b/SP9L/0z/UP9R/1T/Wf9c/2H/Zv9r/23/cP9u/2z/Zf9Z/0z/Pv8x/yz/K/8r/yv/Kv8p/yn/KP8o/yf/Jv8m/yb/Jv8l/yX/Jf8l/yX/Jf8k/yT/Iv8i/yL/I/8j/yP/I/8j/yL/JP8k/yT/JP8l/yb/Jv8m/yb/Jv8n/yf/KP8o/yj/Kv8q/yr/K/8s/y7/Lf8t/y3/Lf8v/y//MP8w/zH/Mv80/zn/PP9B/0b/S/9Q/1X/Wf9c/2P/Z/9p/27/bv9y/3T/dv94/3r/e/98/3v/d/90/3L/bf9q/2f/Zv9k/2P/Y/9i/2D/Xv9Z/1b/T/9I/0D/OP8y/y3/LP8s/yz/LP8s/yz/Lf8t/y3/Lf8t/y3/Lv8u/y3/Lf8t/y3/Lv8u/y7/Lv8t/y3/Lv8u/y7/LP8r/yr/Kf8p/yn/Kf8p/yn/Kf8s/y//Nf8+/0v/Wf9l/27/c/91/3X/dP91/3b/d/95/3n/eP90/2r/X/9V/03/SP9G/0f/Rv9F/0P/QP86/zX/Mf8w/zL/NP89/0r/Wv9n/3b/fv+E/4b/hP+B/4D/gP+B/4L/gv+A/3n/cf9h/07/Pv8z/zD/Mf8z/zn/Pv9C/0j/Tv9T/1r/X/9o/3H/dv94/3n/eP9z/27/aP9c/0z/Pv80/y3/KP8p/yr/Kf8p/yn/Kv8q/yv/K/8r/yz/Lf8t/y7/Lv8u/y//L/8w/zH/NP89/1T/Tv9R/0//S/9R/0z/Qv9N/13/av92/3z/fP97/3n/eP92/3b/dv92/3T/cf9u/2j/X/9S/0b/Pv86/zf/Nv82/zX/Nf8z/zP/Mf8x/zH/Mf8w/zD/MP8w/zL/NP82/zf/Ov89/0D/Qv9F/0j/Sv9N/1D/U/9V/1n/W/9e/2D/Zf9p/2z/cv94/37/gv+H/4r/i/+L/4r/h/+H/4X/g/+C/4H/gP9+/3v/d/90/3D/av9k/17/Xf9Y/1r/W/9b/13/YP9i/2T/Zf9p/2n/bP9s/27/cP9x/3H/cv9y/3b/dv92/3b/dP90/3P/dP9z/3L/cv9y/3T/df90/3T/df9z/2//a/9m/17/WP9Q/0b/QP87/zj/Nv81/zP/Mv8z/zj/QP9L/1b/Yf9s/3P/dv93/3b/eP97/37/gv+G/4j/i/+L/4v/iv+J/4j/iP+I/4n/iv+K/4f/hP9//3j/b/9o/2X/Y/9g/1//X/9g/2P/Zf9m/2r/bv9y/3P/df90/3T/df92/3f/ef95/3n/d/91/3H/bP9l/17/Xf9d/17/YP9m/27/dv98/4L/iP+L/4z/jP+K/4v/iv+K/4v/i/+J/4f/gf98/3f/cP9s/2//c/95/3v/e/94/3j/d/92/3b/eP94/3f/d/94/3j/df90/3H/cP9v/3H/c/91/zaCNm01gjVuNII0cDSCNHA0gjRwNII0cDWCNXE1gjVxNYE1cjWBNXM2gTZzNYE1czaBNnM4gTlzOYE6cjqBOnI7gTtzO4E9cz2CPXI9gj1xP4I/cj+CP3I/gT9yP4E/cj+AP3M+gD5zPIA7dDyAPHU9gDt1PYA7dTuAO3U6gDp1OoA6eDqAOng5gDl3OIA4eDd/Nng1fzR5NX80ejN/MnsxfzF7L38uey5/MHoxfzF6MH4teC18LngsfSt5LH0ueTV+OHVBf0pyUYBZbVyBXWxhgWFpYX1calV4TW1DdzpxNXg1czZ4OHU3eTh0Onk7dEF8RnFLgFFtWYJjaGqGbGJyhXZidIVtYmODVWNKgjprMYAtcy6ALHYrfyp3KX8peCd/JnomfyZ8Jn8mfSZ/Jn0lfyV+JX8kfiR/JIAjfyOAIn4igCN+I4AjfiOAI34jgCN+I4EkfiWBJX4lgSZ+JoEnfSeBJ30ogSh8KIIqeyqCK3ssgyx7LYMtei2DLXougy96MIIwfDGCM300gTiAP3xCgkh2ToVRb1mGXWphhWNkZoZqYm2Fcl9zhXZed4V6XXyDfGB5g3pheoF2ZXKBbmlsgWptZYFkcGSBYnJif2FzXXxZdVJ6TXlJekF8Onozfi17K4AseyyCLHssgy17LYMtei2ELXothC57LoQuey6ELnsuhC57LoQvey+ELnsvgzB8MYMyfDKDMX0wgy19LYMqfCmDKXwpgyl8KYQpfCyCL3wzfzt9SXhXf2NybYBybHWBdGV0gXRhdoF2Y3iDe2R3g3Vob4NlaleDTWpJg0dtRoJFcUOBQHQ9fzd3Mn4teyx9Ln0yezh9RXtVe2J8cXh8gIJzhYGDbIGCgWiAgoBogoKCbH+Ce292g2pwWYNIcDqDN3A3hDhsPoVCaUeGS2ZPhVNoWoViaGqDcWp3g3tseYJ4bHSCbmxog11uTYE+cTOALHgpfSl/KXspgip6KoMqeiqDLHosgyp5LIUueS6FLnguhDB3L4UweDCHMngzhE94UoBZdFx5UnFQc1JyVHJLeUFzW3xrdnV/enR8gHpveYF3bHaBd2p3gXZqdYFya22BZ25egVFyRn8+eDl8N302ezaANXk0gDN6MoAyezKAMXwxfzB8MH4xezF9MXozfTR5NX06eD19PnVBfER0R3pJcUx6UG5TeFVrV3ZZaF51X2djc2ZpanJxbXdwfnWDbod8iXCLfotvin6IcYV+hHSCfoF2gH2Ad31+e3Z4f3Rxb4BqbWWBYWhfg19mXYNeZWGDYmNkg2ViaINpYWqCa2RugXBncoJ0anWAdm53gHZreH94aHd/dmR2gHZkdIB0Y3KBcmVygXNpdIB1anaAdmp3gHVodIByam2BaWxggVxsU4FIakGAOmo3fjRqM3sxbzJ4NnRAdkx4V3Viemx3dHx4end3dnx4c3p8f3SCfIZ1in2NdYx+i3SJfohyiICIcol/inOKf4pyiH+Dbn6Ad2VvgmleYoNgXF+CXlxggGJbZH9nX2iAbGJwgHJldIB0ZnV/dWx3f3lven96b3l+enB3fXRubnlpa2N1XmpdcF1tX2xjb2hscXB4cH9whHWIcIx8jHCMf4pwjH+LcYt/jHOLgIl1hYB/dHl9cnNteWt0b3Z0enh3enl6endzdn51bnaAdm14gHhteIB2a3iAeWd2gHVlcoBwY3F/dWN0f3RlNv82/zX/Nf80/zT/NP80/zT/NP80/zT/Nf81/zX/Nf81/zX/Nf81/zb/Nv82/zb/OP84/zn/Of86/zr/Ov86/zv/O/87/z3/Pf89/z7/Pv8//z//P/8//z//P/8+/z7/Pv8+/z3/Pf88/zv/O/87/zz/PP88/zv/Ov86/zr/Ov86/zr/Ov86/zn/Of84/zj/Nv82/zT/NP80/zT/Mv8y/zH/Mf8v/y7/Lv8u/y7/Lv8s/yz/K/8s/yv/K/8s/y7/MP80/zr/RP9J/07/Uv9W/1n/Wf9Y/1L/Sf8+/zT/MP8u/y7/Lf8s/yv/LP8u/zD/Mv83/z//R/9Q/1r/Y/9q/3H/df93/3P/a/9h/1X/SP88/zf/Nf8x/y//K/8p/yj/Jv8m/yb/Jv8m/yb/Jv8m/yX/Jf8l/yT/JP8k/yP/I/8i/yL/I/8j/yP/I/8j/yP/I/8j/yT/Jf8l/yX/Jf8m/yf/J/8n/yj/KP8p/yr/Kv8r/yz/Lf8t/y3/Lf8u/y//L/8w/zL/M/81/zj/Pf9E/0v/Tv9T/1v/Xv9j/2b/aP9s/27/b/90/3f/eP96/3z/e/99/3n/eP93/3P/cP9s/2n/aP9l/2P/Yv9g/13/Wv9Y/1L/S/9G/z//Of8y/y3/K/8r/yz/LP8s/yz/Lf8t/y3/Lf8t/y3/Lv8u/y//L/8u/y7/Lv8u/y//L/8v/zD/Mf8y/zT/NP80/zP/Lv8t/yz/K/8q/yr/Kf8p/yn/LP8t/zL/Ov9G/1P/Yf9r/3P/df90/3T/dP91/3X/d/95/3r/eP9v/2X/Xf9R/0v/R/9G/0T/Qv8+/zr/Nf8w/yz/Kv8q/zD/Nv9B/1L/X/9t/3n/gf+F/4X/gv+A/4D/gP+C/4T/gv9+/3f/b/9h/1P/Q/88/zv/Pv9C/0f/S/9O/1P/V/9c/2T/av9x/3f/e/96/3n/dv9x/2r/Xv9P/z//M/8s/yr/KP8p/yn/Kv8q/yr/Kv8s/yz/LP8t/yz/LP8u/y7/Lv8w/zH/Mf8y/zP/P/9i/2//Y/9S/0r/S/9I/1D/U/9h/2z/df96/3z/ev95/3f/dv93/3f/dv91/3L/bv9o/17/Uf9G/z7/Of83/zb/Nv81/zT/M/8y/zL/Mv8x/zH/MP8w/zH/Mf8x/zP/NP81/zf/Ov89/z7/Q/9F/0f/S/9N/1D/U/9X/1f/W/9c/1//ZP9q/3D/eP9//4P/iP+J/4r/iv+I/4b/hP+C/4H/f/+A/37/ff96/3j/dP9v/2n/Zf9h/2H/X/9g/2H/Yf9j/2T/Zv9p/2n/a/9t/23/bv9x/3T/d/92/3j/eP96/3r/ef94/3j/eP91/3T/cv9y/3L/c/91/3b/ef95/3r/ev95/3b/c/9w/2j/Yv9a/1H/Sv9B/zv/OP82/zX/M/84/0D/TP9Z/2T/bv90/3f/ef94/3r/e/+A/4P/h/+L/47/jv+M/4r/if+K/4n/iv+K/4r/if+I/4P/fv93/27/Z/9i/2L/Yf9g/1//Yf9k/2f/af9t/3H/dP90/3T/df91/3f/ef97/3v/ef94/3b/cv9t/2b/Yf9e/13/Xf9g/2P/av90/3z/gf+G/4v/jP+M/4v/iv+M/4z/jf+M/4v/if+F/3//ev9x/2z/bP9v/3T/eP96/3r/d/92/3X/dv93/3j/eP94/3b/eP95/3j/df9y/3D/cv92/3b/df82gjVsNYI1bTSCNG00gjRtNYI1bTWCNW81gjVuNYI1cDWCNXE1gjVxNYE1cTeBN3E4gThwOoE6cDqBO3E7gTtxPIE8cD2BPXA+gDxxPYA/cT+AP3E+gD5xPoE+cj6BPnM+gD1zPYA9dDuAO3U7gDt1OoA6djuAOnY6gDl2OoA6djl/Onc7fzl4OH84eDl/N3g2fjV5NX40ejN+MnsxfjF8MH4wey9+L3sufi57LX4seyt9K3wrfSt8K3wrfCp8KnwrfS93NX07dUF/R29MfkxuT3pObkp4Q3E5eDN1LXkqeCl6KXkqeip7Knsqeyp7KnsrfC55NH48dEaAT21ag2NlbYNyY3eEdWJzhmpjYIVSZU2ERGg9gzprNYMzby2AKnIogCZ1JoAmeCaAJ3kngCZ6JoAleyR/I3skfyR+I38ifyN/In0jfyN+I34jgCN+JIAkfiSBJH4kgSR+JIElfiWBJn0mgid9J4IofCmDKXspgyt7LIMtey2DLnougy96L4MvejCCMn01gTiAPH5Bg0p4UIVUb1uFX2tjhGdnaoRtZnCFcmNzhXVhd4V3YXqEfGF8gnlieIF3ZHGBb2dugGtsZ39kb2CAYnJef1tzWHxTdU96S3pEeD1/NngxgC54LYEseiyDLHosgy17LYMtey2DLnotgy56LoMvey+DLnsvgy57LoQuey6EL3wvhDB8MoQyfDSDNHw2gzV9NIIwfS+CLXwtgyx8LIMqeymDKXsqgyx7MII5fEJ+UHxcdWd/cG50gHRodIB0YnSBdGB2gnhkeoJ5Z3GCaWhfg1ZpTINHa0aBQ3JAgDx2OH4zeS59K34ofCl/Lnw1fj97TH5afGl7dn+BdoWAhW+DgoBogIJ/Z4KDg2uEg4JufYN0cWuFW2xMhENpQYVDZUeFSmVOhlFiU4ZWZFyGY2VphHJod4N7a3qDemt3g3FtaYJeblCCQXI0gC54Kn0qfyp8KoIqeyqDK3orhCx6LIQueS6ELnkuhC94L4UueC6FMHgwhTJ5MoVNdm6DYXNBf0tuSHlKcEF3TXdVeGB8bXh2f3x1fIB7cHiBdm12gXdrd4F2aXaBdGpvgGhvXoBRdEd/P3g6fDh9NXs1fzV6NX80ejR+MXoxfjJ9Mn0wfTB9MX0xfTF7M3wzejV8NXk2fTt3PnxBdEV8RXJIe0pvTXpQa1R4VmhXdlxoXXRiaWhxb253bn12g3CGfIhuiX+IboV/g26CfoFwgH1+c359fXV7fnlzdoByb22BaGZkgmJgYoRjYGKDYWBjg2ReZINmXWeDaF5rgWxjbn9vZnF/c2p2f3hseH95bHp/e2t9fnlneYB4ZHWBc2NygHJncoBzanV/d2t7fn5sfH58bXp+fXB8f3hwcYBrb2OCWm5SgUltQYA6azZ+NG40ejhxQXdNd1h1ZHtvd3N7dnl6eHl8eXV+fIF1hXyIdo19jnaOfYx1i4CKc4uAi3OLf4tyi3+KcYh/hW9/gHdnbYNmXWKEXlpdgVxbXX9fX2N9ZmJpf25ncn9zaXR/dWl1f3Vrdn94b3l/eXB6fndvdHtwbWx3ZGpfdF1qXm9ebWNqZ3Bva3dxfHCFc4p3jHONfYxxioCKcYyAjHONgI11jH+JdoR/f3Z3fXB0a3lpc3B1dXh3eHl4eXt3cXd/d253gHhtd4B3bHiAdml4gHpoeYB3ZXOAb2Jwf3JldX51Zjb/Nf81/zX/NP80/zP/M/81/zX/Nf81/zX/Nf80/zT/NP80/zb/Nv82/zb/OP84/zj/Of86/zr/Ov87/zv/O/88/zz/PP88/z7/Pf8+/z//P/8//z7/Pv89/z3/Pf89/z3/PP88/zz/Ov86/zr/Ov88/zj/Ov86/zv/Of85/zn/OP85/zn/Of84/zj/N/82/zX/Nf80/zT/Mv8y/zD/L/8u/y7/Lv8u/y3/Lf8s/yv/Kv8q/yr/Kv8q/yr/Kf8p/yr/Kv8t/zT/Ov89/0D/Q/9B/0D/Ov80/yz/K/8q/yn/Kv8q/yr/Kv8p/yn/Kf8p/yn/LP8u/zL/O/9H/1D/W/9l/2z/df92/3T/cf9p/2H/Wv9S/0//Sv9F/0D/Ov8z/yz/KP8n/yf/Kv8r/yv/Kv8o/yb/Jf8k/yT/JP8j/yL/Iv8j/yP/I/8j/yP/I/8k/yT/JP8k/yT/JP8k/yX/Jf8m/yb/J/8n/yj/Kf8p/yr/K/8s/y3/Lf8u/y//MP8w/zD/Mf80/zj/O/9C/0f/Tf9U/1r/YP9k/2X/a/9u/3H/cf90/3f/d/94/3n/e/95/3b/dP9z/3D/bf9r/2j/aP9k/2L/X/9d/1j/Vf9S/03/R/9C/zv/Nf8x/y3/Lf8t/yz/LP8s/yz/Lf8t/y3/Lf8u/y7/Lv8u/y//L/8v/y7/MP8w/zD/MP8v/y//Mf8x/zP/Nf80/zX/Nv81/zL/MP8u/y3/LP8s/yz/Kv8q/yz/Lf8x/zj/Qv9N/1r/Zf9u/3P/df90/3T/dP90/3b/eP95/3f/cv9q/1//Vv9M/0f/Rf9C/z7/Of81/zH/Lf8p/yj/Kf8s/zP/Ov9G/1b/ZP9y/33/gf+E/4P/gP9//3//gP+B/4T/hP9//3v/cf9i/1X/Tf9I/0n/S/9N/0//Uf9T/1j/XP9j/2f/cP90/3b/d/93/3f/c/9t/2L/U/9F/z7/O/8s/yr/K/8r/yr/Kv8r/yv/Lf8t/y7/Lv8u/y7/Lv8v/y7/Lv8w/zL/NP82/1b/Y/9K/0L/Sv9H/0v/Sf9I/1f/YP9t/3b/fP98/3v/ev93/3f/eP94/3f/dv90/2//aP9f/1L/SP9A/zr/OP81/zX/Nf81/zT/NP80/zT/Mv8y/zD/Mf8x/zH/Mf8z/zP/M/81/zb/OP87/z7/Qf9E/0b/Sf9L/07/Uf9T/1X/WP9c/2L/aP9w/3f/ff+D/4j/iP+I/4b/hf+C/4H/gP9//37/ff97/3z/ef90/3D/bP9n/2P/Yv9j/2P/Y/9j/2D/Y/9k/2X/Zv9o/2n/av9t/2//cP9x/3L/dP93/3n/e/98/3z/ev96/3j/df9z/3L/cv9y/3P/dv95/3v/fv99/37/gP+B/4H/fP95/3L/a/9k/1r/Uv9I/z//N/8y/zT/OP9B/03/Wv9m/2//dv94/3n/ef97/3//gf+F/4j/jv+P/47/jP+L/4r/i/+L/4v/i/+L/4r/iP+F/3//d/9u/2f/Yv9e/1z/W/9d/1//Yv9l/2r/b/9y/3P/dv92/3X/dv94/3r/fP97/3j/d/9z/27/aP9h/17/XP9c/17/Yv9o/3D/d/+A/4b/i/+N/43/jP+L/4r/i/+M/4v/iv+M/4n/g/9+/3T/bP9q/2r/b/90/3f/ef95/3f/d/93/3b/d/92/3b/d/94/3r/e/95/3f/dP9z/3T/df92/3f/NYI1azaCNmw3gjdtNYI1bTWCNWw1gjZtN4I2bjaCNnA3gjdxN4I3cTeBN3E4gThxOoE6cDqBOnA6gTtxO4E7cT2BPXI8gT1yPYA9cT6APnE+gD5xPYA9cTyBPHE8gTxyPIA8dDuAO3Q7gDt1O4A7djmAOXY8gDt2OoA6dziAOHc4fzd4N383eDZ/NXg1fzV4NX41eTJ+Mnozfi97L34vfC5+LHstfi17LX4tfCt+K3wpfSl8KX0pfCp8KXsofCh7KXwoeil8LHgxezV2Nns5djh4NHYweCx4KnkoeSh7KHoqeyp8Knsqeyl8KXwpfCl8KX0pfCt9LXkzfjl0RYBQb1uCZWtxg3VodoR1ZHKFbGJnhWJgXoZZYlGGTWRGhj5nOIYwaSyGLWoyhjNpM4YyajKFLWwngSVxJH8kdiN/I3wjfiN9I34jfiN+I4AjfiOAJH4kgSV+JYElfiWBJX4ngSd9JoIofSiCKXwpgyp7K4Msey2DLXstgy56L4MvejCDMXs0gTd+On4/gkZ5TYRTc1qEXm5khGdpaoRsZ26FcGRxhHJidoN3YXeCd2J1gXNmcn9vZ21+a2xpfmZuYnxfcFx8W3FYe1R1UnpOeUh4RHw/dzd/M3kwgi16LYMtei2ELHosgy16LYMtei2DLnougy96LYMuejCDL3sugy57L4MxezGEMXsxhDJ6MoUyejKFNHs0gzZ7N4M2ejSDMXovgy16LYQtei2EK3srgyt7K4MuezGBNXw+fkp9VXZkgGxycoB0bHSAc2ZzgXNjdoJ3Y3iCd2hzgmxqYYJXa0yCRm5CgEFzPH84dzN9L3osfCl+J3sngSp7MoA4ekN/Unthe29+enmAf4NygoKCaoCCf2Z/g4BohIOFbIKDfW53hGxqX4VVZU+HTmJPh05iUYdSY1WGWGVbhGBlZoJqaHKBd2x3gXdtd4F0bm2CYnBUgklyToBKdS19KXwpfCmCKnsqgyt6K4Qtei2ELXkuhC55LoQvdy+FL3cvhTB4MYM2e1GAbH1HgDd5PH05dD94SXJJdUp3VnphfG16d397dXyAe3B5gXhrd4F5aXiBd2l2gXVqcYNsbmGDUnNHgEB4PH05fTZ9Nn81ezV/NHwzfjN8M34zfTN+MX0xfjF8MXszfjN4NH40eDN9Nnk4eTl8PHc+fEFzRX1HcEp8TW9OelBsUndUalt1YGtoc3FveXF+doNuh3uIboh9h26Gf4RtgH9/bn9+fXB8fXpxeX52cXJ/bmxpgGVkYoFhYWCCYWBhgGFhYYBhYWJ+YGFhfGJiZHplZ2d5Z2toeGpubnlycHN5dXB4enptenx6aHh/dmR0gHJjcoByZnKAdGl2f3dreX57b3p9fnCCfYRzhHyCdX5+e3JxgGtvYoJablGDRWw8gTVrNHw5b0R3UHVbdWZ7cHd3e3l5eXd5fHp0fnyCdYZ8iXaPfZB2j32MdYx+i3OKfopzjH+MdIt/inOKf4dtgYB5ZXCDalxlhFxZW4FaW1p/XGFgfGRman5uZ3N+dWt1fnZrdn94bHl+em97fntxeH12cHF7a2xkd19oW3JZaVltWmpga2huc217cIJ0iHKMeo5zi36LcYt/jHGLgItzjYCMdYx/iXaDf312c31rcmh5anVudXN5eHh5dnh7d3F3f3VudYB2bHeAeGp2gHhqe4B7aXqAd2VzgHRidX91ZHZ+eGI2/zb/Nv82/zf/N/81/zX/Nv82/zb/Nv83/zb/Nv82/zf/N/83/zf/N/83/zj/OP86/zr/Ov86/zr/O/88/zz/Pf89/zz/Pf89/z3/Pv8+/z7/Pv89/z3/PP88/zz/PP87/zv/Ov86/zr/Ov86/zr/Ov85/zn/Of85/zn/OP84/zj/N/83/zf/Nv81/zX/Nf81/zT/M/8y/zH/MP8v/y7/Lv8s/yz/LP8s/yz/K/8r/yr/Kf8p/yn/Kf8p/yj/KP8p/yn/KP8q/yz/Lf8w/zD/Lf8q/yn/Kf8o/yj/Kf8p/yn/Kf8p/yn/KP8o/yn/Kf8p/yn/Kv8r/y3/Mv84/0P/UP9c/2n/cP91/3f/df90/3D/bP9s/2b/Yf9b/1T/S/9F/z//Ov87/z//QP9B/z//P/83/zH/LP8l/yT/I/8j/yP/I/8j/yP/I/8j/yP/I/8k/yT/Jf8l/yX/Jf8l/yf/J/8n/yj/KP8q/yr/Kv8r/yz/Lf8u/y7/Lv8v/y//MP8z/zf/Ov8+/0P/Sv9Q/1f/Xv9j/2b/a/9s/23/b/9w/3P/dP90/3T/c/9y/3D/bv9r/2n/Zv9k/2H/Xf9c/1r/WP9T/1D/Tf9J/0T/QP87/zb/Mv8v/y7/Lf8t/y3/Lf8s/yz/Lf8t/y3/Lf8u/y7/Lv8v/zD/L/8v/y//L/8w/zH/Mf8x/zH/Mv8y/zL/Mv8z/zP/Nf82/zX/Mv8v/y//Lv8u/y3/Lf8s/yz/LP8s/y3/MP8z/zv/R/9T/2D/av9y/3T/c/9y/3P/c/90/3b/d/93/3P/bP9i/1j/Tv9G/0D/P/85/zX/MP8s/yz/Kf8n/yf/Kf8u/zb/P/9M/1v/af91/33/gv+C/4L/gP9//37/gf+D/4T/g/+A/33/c/9n/13/Vf9P/0//UP9V/1X/V/9a/1z/Xv9j/2f/bP9y/3b/dv92/3P/a/9f/1L/UP9H/0L/L/8q/yr/Kv8q/yr/K/8r/y3/Lf8t/y3/Lv8u/y//L/8v/y//L/8y/zX/Yf+G/13/Of84/0n/Uf9P/0//S/9V/2P/bP94/33/fv99/3n/eP94/3j/eP96/3j/df9x/2z/Yv9U/0f/QP88/zn/Nv82/zX/Nf80/zP/M/8z/zP/M/8y/zL/NP82/zj/OP83/zf/Nf81/zb/N/85/zz/Pv9B/0T/Rv9I/0r/TP9O/1D/WP9e/2f/b/92/37/g/+H/4j/iP+F/4T/gv+A/37/fv99/3v/ef93/3b/c/9t/2f/ZP9h/2D/Xv9d/17/Xf9c/1r/W/9a/1v/Wv9c/13/YP9j/2L/ZP9m/2n/bf9x/3X/dv93/3f/dP9z/3H/cf9y/3L/cv90/3b/dv94/3r/eP98/37/gf+D/4T/gv9+/3r/cv9q/2H/Wf9P/0X/PP85/zv/Rv9R/13/aP9x/3j/ev96/3r/ff+A/4T/h/+K/4//kP+P/4z/jP+L/4r/iv+M/4z/i/+K/4j/hf+C/3r/dP9s/2b/Xv9Y/1f/Wf9b/2L/aP9t/3L/dP90/3T/df92/3j/ef96/3v/ef91/3T/bv9o/2D/W/9a/1n/WP9b/2L/a/90/3z/g/+I/4z/jP+L/4r/iv+K/4n/i/+M/43/i/+I/4L/e/9y/2z/af9r/27/c/95/3n/eP93/3b/d/92/3X/dP91/3b/eP97/3v/ev93/3T/c/91/3b/df93/zeDN2s3gzVqN4M3ajWDNWs3gjdsNoI2bTeCNm81gjVxOII4cjaCN3I4gThxOYE5cTiBOXA6gTpwOYE8cT2BPXE7gT5yPoE/cjyBPHI9gT1yPYA9czyAPHM9gD10O4A7dTqAOXU5gDl1OX85dDl/OXQ5gDl2OYA4djiAOHc5gDh3OX82eDV/NXg1fjV4M34zeDJ+M3kyfjJ6L30uey59LHstfSx8LH0rfCt9KnsqfSp8Kn0qfCl8KXwofih8J34ofCh9J3wmfSd8KHwoeyl8KXsneyd8KHsofCd7KHspeyl7KHsnfCl7KXwofSh8KH0ofCh9KHsofSh6Kn4udjR+PXNHf1NxXoBobXKCd2l5g3ZldYR1YXODcGJuhmhkYoddYFaIUWBOiU9dUIlRX1OKU2JPiUhkQYU3ZyyAJW4jfSF3In8ieiR/JH4jfiOAI34kgCV+JYAlfiWAJn0mgid9J4InfCeDJ3wogyl7KoMseyyDLHstgy57LoMwezGDMXwygjV9OIA9gEJ7SYRPdlaEXHFhhGZsaYRram2Fb2hwhnJldYR0YnKBcWFuf2llaX5mamZ9Y2xdfFpxWXlWc1R5UHZMeUp3R3lFfEJ3Pn44dzKBMHcugy55LoMtei2DLXotgy16LYMtei2DLXotgy16LYMtfC6DMHwwgzF7MYMxezGDM3szhDR6NIUyeTKFMnoxhjF6M4U0eTSFMnoyhTB6MIUwejCFLnothSx7LoUtey2FLXovgzN7OX9FflB7X39nc3GAdGxzgXNmcoFzZHSBdmV2gnVnc4JuamSBWWxOgUVwQYA9djh+NHsufSt+K30pgSd7J4Ipey6CM3s6f0d7V31nfHB5en6Cc4OAg2x/gYBmfYJ+ZYGCg2iEg4NsgYR6a2+EZWNchVZgVIZTYVWGVmNYhVpmWYJbaFyAY21pgG9vc392b3WAdG5tgWFvWH9TdDd+Pnk3fit+LHssgit6K4MseSyDK3ksgy14LYMueC6EL3cwgzB3MIMxeDOENnhVg3d7Z4FJe0p8SXVUc1R0UXJPeFl3ZHxwenh9fXV9f3xweYF5bHiBemx5gXpteYF5bnOCbG5jglVxR4FAeDx+OX02fTaANHw0gDR8M4EyfDKAMX0zfTR+Nng5gD10PIE9cDyBPHE7gDh3Nnw1eTd6OXs8dj18QHNDfURvRnxJbkp6UG5Vdl1uZ3Nycnlwf3qDbod9h2+Hf4Vug3+BboB/fm59f3txen94cnZ+dm5wfmxrZYBiZl6AXGdZf1lnVXxWalV6VG1TeFNuU3dTclJ2VHRUdFV1WHJadl1xYXVmcmtwbnVua3F5cWZxfnJicoByYnJ/cmVygHJpc4BzbHN+dW94fnhzenx9d398gnuEfIJ4gH14cnKCaW5ihFZqS4RCaT5+P25KeFN0X3dqe3F4eXt7ent2enx+dIB8hXWJfIx2kH6Qd49+jnSMfotyi36Lc4x/jHSMf4xyjH6IbIOAfWN3gnBbZ4NgWV2CWVZcf15fY35qaHCAc2x1f3RtdH91bXd/eG96f3twen53cnN9cW5qe2RqXXVZZ1dyV2dXbVxqZGptbXdufnGGdot0jH2Mc4t/i3CKf4pxioCLdIt+jHaLf4h4gn97d3B8a3NpeGt0bXVzeHl4eXV4fHdwdX91b3aAdmx3gHdrdoB3anuAe2h7gHZldIBzZHZ/dWV0fnRmN/83/zb/N/83/zf/Nv82/zf/N/83/zf/Nv82/zb/Nv83/zf/N/83/zj/OP85/zn/Ov85/zv/O/86/zv/O/87/zr/O/87/zz/Pv8+/z3/Pf89/z3/PP88/zv/O/87/zv/Of85/zn/Of85/zn/Of85/zj/OP84/zj/OP84/zj/OP83/zf/Nv82/zT/NP8y/zL/Mf8y/zD/L/8u/y7/Lf8r/yz/LP8r/yv/K/8q/yr/Kf8q/yr/Kf8p/yj/KP8n/yj/KP8n/yb/J/8o/yj/J/8n/yf/J/8n/yf/J/8o/yn/Kf8o/yf/Kf8p/yj/KP8o/yj/J/8n/yj/KP8o/yv/Lv82/z3/SP9S/13/aP9y/3b/ef94/3j/d/91/3T/cf9u/2j/Zv9h/2D/Yf9j/2T/Zv9m/2T/W/9T/0j/Ov8r/yT/JP8i/yL/I/8j/yP/I/8j/yT/Jf8l/yX/Jf8m/yb/J/8n/yf/J/8o/yn/Kf8q/yz/LP8s/y3/Lv8v/zH/Mf8x/zT/N/86/0H/Rv9N/1P/Wf9g/2T/Z/9q/2z/bv9w/3H/c/9z/2//bP9o/2b/Y/9g/1z/XP9Z/1X/Uv9O/0v/SP9F/0X/Qf8+/zz/N/81/zD/L/8u/y3/Lv8u/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y7/MP8x/zH/Mf8x/zL/Mf8z/zP/NP80/zT/M/8z/zL/Mv80/zX/Mv8y/zL/Mf8x/zH/MP8v/y3/Lv8u/y7/Lv8t/y//Mv84/0P/UP9c/2f/b/9y/3P/c/9y/3L/cv90/3T/dP9y/23/ZP9Z/07/Rf9A/zz/N/8y/y7/K/8p/yj/J/8n/yf/K/8x/zf/Qf9R/2D/bP93/4D/g/+D/4D/f/99/37/gf+D/4T/hf+D/37/df9o/2D/Wf9X/1b/V/9X/1f/V/9V/1f/WP9e/2b/bf90/3X/df9y/2j/Wv9Y/0z/N/9A/zr/LP8s/yz/K/8r/yz/LP8r/yz/LP8t/y7/Lv8v/zD/MP8w/zL/Mv8+/1j/X/9c/1T/V/9D/0D/Tv9V/1X/WP9m/3D/eP99/33/fP95/3n/eP96/3v/ev95/3n/c/9s/2P/Vf9J/0D/Ov84/zb/Nv80/zT/NP8z/zP/M/8z/zj/Of88/0P/Rv9F/0b/Rf9E/0L/Pv86/zf/N/83/zj/O/88/z3/QP9D/0f/Sv9Q/1n/YP9p/3L/ef9//4X/iP+H/4b/g/+B/4D/gP9+/3v/ev96/3j/dv90/27/af9j/1//Wf9U/1P/UP9O/03/TP9K/0n/Sv9L/0z/TP9M/0z/Tf9Q/1H/VP9Y/13/Zf9o/2v/bv9x/3D/cf9x/3H/cP9y/3L/cv9y/3L/cf9x/3H/cv91/3b/ev9+/4D/gv+C/3z/eP9w/2f/W/9U/0n/Qf9C/0v/VP9g/2v/cv93/3n/ef97/33/gP+F/4n/jP+Q/5D/j/+O/4z/i/+L/4v/jP+M/4z/i/+L/4n/hf9//3v/dP9t/2X/YP9e/17/Yf9m/2v/cP9z/3X/dP91/3f/eP96/3n/ev94/3X/cv9u/2b/YP9a/1b/V/9V/1j/Xf9l/2//d/9//4j/iv+M/43/i/+L/4r/iv+L/4z/jP+L/4r/hv+B/3f/b/9o/2f/av9t/3P/ef95/3j/d/92/3X/dv92/3b/dv93/3n/e/97/3r/dv9y/3L/dP90/3P/c/83gzdqNoM4aTmDOGo4gzhrNoI5bTiCOG43gjduN4I3cDaCNnA3gjhwN4E4cTqBOnE6gTpwO4E7cDuBO3E8gTxxPIE8cjyBPHI8gTxyPIE9cjyAPHM8gDx0PIA8dDqAOnU5gDl1OIA4dTl/OXU4fzh1OH84djh/OHY3fzd4N383eDV/NXg1fzV4Mn4xeDF+MXgxfjF5MX4wei19LXstfSx8K30qfCp9KnwpfSl8KX0pfil9KX0ofCh9J30nfSd9J30ofCd8J3wnfCd9J3wnfSd8Jnsmeyd7J3sneyd8KHsofCh8KHwpfCl8KX0pfCd9J3wnfSd7KH0oeid9KHksfTJ5NH0+dUd+UXJbfmNtan9va3OAdmh2gnVndIN0ZHOFc2Fvh3Beb4hxXHKIdVx2iXZdcohqXmWGV2BJgTlnKX4icCF9IXgifSJ9JH4kgCR+JYAkfiSCJX4lgiZ9JoImfSaCJ3wogyl8KoMreyyDLHssgyx7LYMvezCDMXsygzN8NoI5fj19Q4FJeE+CVnJcgmFtZoRpa2yEbmhvhHBnc4JxZ2x+a2hme2JrXHpacFZ4UnRQd0x4SnZIeUd3Q3pBdz19Onc5fzh3NIEydy+CLncugi53LoMteS2DLXotgy16LYMuei6DLnougy16LYMtei2DMHswgzB7MYMyezKEM3szhDV5NYU1eTWFNXk1hjR5NIY1ezWGNHk0hjN5MoYyeTKGMXowhS96L4Uvey+FLXsuhS56MIMyeziBQnxNfVh+ZXVvf3NtcoBxZnGBcWNxgnNkdIJzZ3GCbWplgVpvT4FFcz5/O3c2fjB9LH0nfyd8KIIoeyeCKXsrgi57NYE/e0x+WntmeHR9fHSDgIJvgIF9aX6Cf2eBgoNphYKFbIaDgGt5hG5oZoVdY1mGWGJYhVdmVYNSa1KAUG5Wf1xyYn9qc3J/dnF1f3JtYXxYb1l7QHU2fTx8Mn0sgCt7LIIseS2DLXktgy15LYMteC2DLnguhC93MIUxdzCFMHYzgjt2W39md155WnZgclt3O29IdlRvWHdWdmh6cHl6fX11fX97cHmBeGx4gXlseYJ5a3mCemx0gm1uY4JVcUqBQHg5fjZ9NX00gDV8NYA0fDOAMnw0fjZ9O3g/f0VySoFOaVCDUGVShE9lS4REbT6BOXQ2fTd5N3g3fDl2PHw+dEF6RnJLd1JzWnNjdGxwc3h5b397hW+HfoZthn+EbYB/f2t/f31tfH98b3p/eHB1f3FwbX9nb19/WW9TflBxTXpHdkZ5RnhFeER5RXdEeUR2RHpFdUZ6R3NHeklxSnpNcFJ3WXFecmR0Z2xqeWxmb35xYnKAcmNzf3JlcoByZ2+AbmprgGttbH5tcW17b3hxdnZ7fHh/fIF6gHZ7fnRvbINiZluDUGVKgkZqTnxXc2J4bHpzeXl6e3p7dn18f3SCfIZ1inyOdpB+kHaPfo5zjX6Mcot+i3OMfot0i36Lc4x+im6FgYJmfYF2X3GCal1mgmVcZYFmYW1/cGhzf3RsdX51bnd+eG95f3lveX96cHd+c3BufWhtYnldaVd1UmdTcFNoWG5damdtb295cYJziXmLdIx+i3KLf4tzi3+LdIuAjXaMfox3iX+Gd4GAd3VsfGV0Zndpdm91dXh5eHl1d3x2b3V/dW12gHZsdoB2a3WAd2p6gHpoeoB2ZnSAcmVxf3FmcX5waDj/OP84/zj/Of85/zn/Of83/zr/OP84/zn/Of83/zf/Nv82/zj/OP83/zj/Ov86/zr/Ov87/zv/O/87/zz/PP88/zz/PP88/zz/PP88/zz/PP88/zz/PP86/zr/Ov86/zj/OP84/zj/OP84/zf/N/83/zf/OP83/zX/N/83/zT/Nf81/zX/Nf8x/zH/Mf8x/zD/MP8u/y3/Lf8s/yz/LP8r/yr/Kv8p/yn/KP8o/yf/KP8o/yf/J/8m/yb/Jv8m/yf/Jv8n/yf/J/8n/yf/J/8m/yb/J/8n/yf/J/8o/yj/KP8o/yj/KP8n/yf/J/8n/yf/J/8o/yj/J/8o/yr/K/8w/zX/Pf9H/07/VP9d/2P/Zv9p/2z/bv9x/3L/dP91/3f/eP96/3z/fv+B/4X/hf9//3r/c/9m/1b/Rv81/yj/If8h/yL/Iv8k/yT/JP8l/yT/JP8l/yX/Jv8m/yb/Jv8o/yn/Kv8p/yz/Lf8t/y3/Lf8v/zD/MP8y/zP/Nf84/zv/Qf9G/0z/U/9Z/2D/Zf9o/2r/bP9t/27/b/9x/27/aP9j/1z/Wf9U/1D/Tv9I/0T/Qf8//z7/PP87/zj/N/82/zT/Mv8w/zD/L/8v/y//Lv8u/y3/Lf8t/y3/Lf8t/y7/Lv8u/y7/MP8w/zD/MP8w/zH/Mf8x/zL/M/8z/zT/Nf81/zX/Nf81/zX/Nf81/zb/Nv80/zT/NP8z/zL/Mv8w/zD/MP8v/zD/L/8t/y//Lv8w/zL/OP9A/0z/Vv9j/2//cv9y/3H/cv9v/3D/cf9y/3H/cf9t/2X/Wv9P/0X/Pf84/zT/L/8r/yj/KP8p/yj/KP8p/yv/Lf8z/zr/Rf9W/2T/cP96/4D/gv+A/33/fP99/3//gv+G/4f/hv+A/3v/cf9p/2D/W/9Y/1f/Vf9R/1H/T/9M/0//VP9e/2n/cv91/3T/dv9i/1H/S/8//zj/OP8y/y7/LP8s/y3/Lf8t/y3/Lf8t/y3/Lf8u/y//L/8w/zD/MP8x/zL/Nf9N/2v/X/9X/2T/Vv84/zv/UP9X/1f/ZP9x/3r/ff99/3v/ef94/3j/ef95/3n/e/95/3T/bf9j/1X/Sv9A/zr/N/83/zX/Nf81/zX/NP80/zX/Of9A/0f/Tf9T/1j/W/9c/1v/Wf9V/07/Qv87/zj/Nf82/zb/N/86/z7/QP9G/0//Vv9d/2b/bv92/33/gv+G/4f/hv+E/4P/gP9+/37/fv98/3z/ev94/3X/cf9r/2X/Xv9U/0z/R/9D/0H/Qv9C/0H/Qf9C/0H/Qf9B/0H/Qv9D/0P/RP9G/0v/UP9X/13/YP9j/2r/bf9x/3D/cP9x/3H/cv90/3T/cP9s/2n/Zf9l/2L/Yv9m/2j/bv90/3r/f/+A/33/ef9v/2f/X/9X/1D/T/9R/1n/Yv9s/3T/ev97/3v/ff9//4T/iP+J/47/kP+Q/4//jv+N/4z/i/+L/4z/jf+M/4v/i/+J/4j/g/9+/3r/df9x/2v/a/9q/2v/cP9z/3X/df92/3b/eP94/3n/ev96/3n/df9y/2z/Zv9e/1X/Uv9Q/1L/Uv9X/13/aP9y/3z/hP+J/4z/jP+L/4v/i/+L/4v/i/+N/4z/jP+K/4X/fv93/23/Zf9j/2r/cP92/3n/ef93/3X/df91/3b/dv92/3b/df92/3j/eP94/3b/c/9y/3D/cf9w/27/OYM5ajmDOWo5gzlqOYM5azmCOW04gjhuOII4cDeCN3A4gjdxN4I3cTiBOXE6gTpxOoE6cTqBOnE7gTxyPIE8cjyBPHI8gTxyPYA9cjyAO3I8gDxzO4A6dDqAOnQ4gDh1N4A3dTeANnU3fzd1N383dTd/N3Y2fzZ2N381eDR/Nng1fjR4NX4zeDF+MXoyfjB6MH0veS59LXosfCt7K3wreyp8Kn0pfCl9J3wnfCd8J3wmfCZ9KHwofSh8KHwpfCl8JnwlfCV8JnwnfCd7J3wneyZ8JnsnfCd7J3wneyd8J3snfCd8J3wnfCd8J3onfCd6J3wnfCZ8KHwnfCd6J3wneSl9K3g0fDt1QntIc057Um9YfVptXX1iaWSAaGdug3Vld4N9YYCDhGCGhIhgi4SIYIaFgmB8hXJgZYRVZUeANW4mfSN3IX0ifSR+JIEkfiSBJH4kgiV9JYIlfSWDJ30ogyp8KoQqfCqELHsthC57LoQvejCDMXoxgzN7NYI4fTt/PX5CfEeBTndWg1xxYoRlbWmEa2tsg29rb4NvaW1/aWlhe1xtVHhOc0h2RXlBdj98PXc8fjl3Nn81djOANHYzgDJ4MYEveC+BL3cvgy14LYMteS2DLnkugy56LoMuei6DLnougy56LoMvei+DMHowgzF6MYQyeTOEM3szhDR7NYQ1ejWFNnk2hTd6N4Y1ejWGNno2hzV6NYc0eTSHM3kzhzJ5MoYweTCGMXkxhS56LoUvezGEM3s3gz58SnxUfWB3a39wcHGAcmhvgW9lboJwZnGCcGhwgm1sZYFbb1CAQ3M7fzV6MX4tfyp9J4EneyiCKXwogil8KoIsei+BN3pCgFB8X3psfHd2f3+CcYGBfmt9gX1pf4GDaoOBhWuFgYFufoJ1aW2EY2ZehFpkVYNRaU2BSW9Hfkd0SH5Qdlt+anhxfnZzdHxrbVJ2Qm1LfE5xRoA+dzZ+MH0sfCyALXotgyx5LIIteS2CLXgthC94MIQveC+FMXcwhS92MoM1dkh+W3Vbdlt2aW9beTdvNndQcVR2VndkeXJ5en1/dn5/em95gXlreYF5a3qCemp4gnhrc4JtbmSCVXNKgUB5On43fjV9NYE2fDSBNHw0gjZ+O3xAf0hyUH9YaF6BYmBng2hcZoViXV+EVmVLg0JuOYA2dDR8M3s1ejh7QHlGd0t5U3Nae2Rxa3tycHl7gG+EfoduiICFbISAgm2Af39ufX98b35/fXB6f3hxdn9ycGqAYnBagE1xR35Ddj55P3w+eD59QHg/fEB3QHxAdT9+P3U/fkF0QH5DckN8R3JOelRzW3NhdWZraXptZm9+cWNygHFkcYBzZnOAcWhwgmpqZYNdbFl9VXNWeVp4XXVjfmt0c3x3d3p2fXt7bnJ/bGZkg1thWIJVZFl9Xm5ne293dXl6eH16fXZ+e4F1hHuHdop7jneRfJF3kH2PdI19jHWMfYx1jn6NdIt/inKHfoVvgX98aXuAe2J4gXhhdIJwXnGCcWF0gXVndn92a3Z+d293f3lxe396c3l/d3N0fm9xaXxjbVt6VGlQdU9nT3FQaVVvXGtnb3FxfnSFc4t7jHONf4x0i4CLc4uAi3SMf413jX+MeIl/hHh+gHN1a3xmdWZ3a3hxdXd5enh5dnd8dG91f3ZsdoB2bHWAdWx1gHZrd4B3aXd/c2Rxf25mboBuaHB9bmk5/zn/Of85/zn/Of85/zn/Of85/zj/OP84/zj/N/83/zj/OP83/zf/OP85/zr/Ov86/zr/Ov86/zv/PP88/zz/PP88/zz/PP89/z3/PP87/zr/Ov86/zr/Of85/zf/N/82/zb/Nv82/zb/Nf82/zb/N/82/zX/Nf81/zX/Nv81/zX/NP8z/zH/Mf8x/zD/L/8v/y7/Lv8s/yz/Kv8q/yr/Kv8p/yj/J/8n/yf/J/8m/yb/Jv8n/yf/J/8n/yj/KP8m/yX/Jf8m/yf/J/8n/yf/Jv8m/yf/J/8n/yf/J/8n/yf/J/8n/yf/J/8n/yf/J/8n/yf/KP8n/yf/J/8m/yb/Jf8o/yr/MP81/zn/PP9D/0T/SP9L/0//VP9c/2T/bv92/3z/gP+E/4f/if+K/4r/if+F/4P/fP9v/2P/Uv9B/y7/JP8i/yP/JP8k/yT/JP8k/yT/Jf8l/yb/Jv8n/yj/Kv8r/yv/K/8t/y3/Lv8u/y//MP8x/zP/NP82/zf/O/8//0T/Sv9R/1j/Xv9k/2f/av9s/2//bv9t/23/aP9g/1r/UP9K/0P/Qf89/zr/OP82/zX/NP80/zP/Mf8x/zL/MP8w/y//L/8v/y//Lf8t/y3/Lf8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y//L/8w/zD/Mf8y/zP/M/80/zT/Nf81/zb/Nv83/zf/N/83/zf/N/83/zf/Nv82/zX/Nf8z/zP/M/8y/zH/MP8w/zD/L/8v/y//Mf8z/zf/Pf9I/1P/X/9q/3D/c/9z/3D/bv9t/27/b/9y/2//bP9n/1z/Uf9F/zr/NP8v/yv/Kf8o/yf/KP8p/yj/Kf8q/yv/L/81/zz/Sv9a/2f/c/98/4H/gf9+/3z/fP98/4D/gv+E/4T/g/9+/3j/cP9n/1//Wf9U/1D/SP9F/0P/Q/9H/1D/Wv9m/3D/dP9m/03/Pv9E/1z/XP9N/z//Nv8w/yz/LP8t/y3/LP8s/y3/Lf8t/y3/Lv8v/y//L/8w/zD/Lv8y/z3/Uv9Z/17/Y/9k/1T/Sf9R/1H/T/9W/2f/cf96/37/fv96/3n/ef95/3n/ev96/3n/d/9z/23/Zv9Y/0v/Qf86/zf/Nf81/zT/M/80/zT/OP89/0X/Tv9V/17/Zv9s/3H/cv9w/2z/Zf9d/1D/Rf88/zb/Nf8z/zj/PP9C/0v/UP9W/2D/aP9v/3X/ff+B/4X/hv+H/4b/g/+B/4D/f/9+/33/fv9+/3z/ev92/3L/av9i/1b/Tf9G/0H/P/89/z7/Pf8//zz/Pv89/z3/Pv88/z3/P/8+/z//Q/9H/07/VP9b/2H/Zf9p/2//cP9w/3H/cP9x/3P/cf9x/2//af9j/1v/Uf9K/0j/Tf9U/1r/Y/9r/3H/df96/3n/dv9v/2n/Yf9d/1z/Xf9i/2f/b/92/3v/e/97/3//hP+G/4j/i/+P/5H/j/+P/47/jf+M/4z/jP+M/4v/iP+H/4T/gf96/3n/ev96/3v/e/96/3j/dv94/3f/d/93/3f/d/94/3n/eP97/3r/ef93/3P/bf9m/1//V/9Q/1D/Tv9M/0//Vf9e/2n/dP9+/4b/jf+N/43/jP+L/4v/i/+L/4z/jf+N/4z/if+B/3r/cv9p/2b/Zv9q/3H/d/96/3j/d/91/3X/dv92/3b/df91/3X/dv93/3f/dv9y/3D/bf9u/23/a/9q/ziDOGo4gzhqOYM5ajmDOWs5gjltOII3bjiCOHA3gjdwOII4cTiCOHE5gTpxOoE6cTqBOnE6gTpxO4E8cjyBPHI8gTxyPIE8cjyAPHI7gDpyOoA6czqAOnQ5fzh1N4A3dTaANnc2gDZ3NX80dzV/NXc1fzV2Nn81djZ/Nng1fzV4NX4yeTF+MXkwfjB4MH4veS59LXorfSt6KnwqfCl8KnwpfCl8KXwofCd8JnwmfCV8JnwlfSV8JX0mfCZ8JXwlfCZ8JXwlfCZ8J3wneyd8J3smfCZ7Jnwmeyd8J3snfCd7J3wneyd8J3snfCd6JnwmeiZ8JnwofCZ8JXwlfCZ8JXolfSV7JX0neSp8L3gxezF3MnwzdDh8QHFJfVBuWX9ja2qAc2p6gIBogn+EZoV/hWSIgYZhhoOCXniEb2JdgExrOHwndCN8I30kfiSBJH4kgSR+JIIkfSWCKH0ogyh9KoMpfCmEKnwrhC17LYQvey6EMHowgzF6M4M1ezeDOH09fkF/R3lPglV0WoNhbmWDaG1rg25qb4JsamyAamtjfFxxVHlJdkN3PXo5djZ+NnY1gDR2NIE0djSCM3YxgzJ2MoMweDCDMHgwgzB3L4MteC2DLXktgy15LoMuei6DL3ovgy56LoMuei6DL3ovgzF6MYMxejKEM3kzhDR5NIQ1eTWENnk2hTd5N4Y3eTeGN3k3hzd5N4c2eTaHNXg1hzR4M4czeTOGMHkyhjF5MYUwejCFL3svhDR7OIM7fEV9Un1eeWl+cHNygHFrboFtZmuCbWZugnJncIJtamiBXW9RgEVzOn8zeC5+K34pfCiBJnsogyl8KYMqfCuDKnsugjJ7O4FGfFZ+ZXxxe3p/gHaCgX5vfIF6anuBfmiBgYNqhIGDbX+Cemxyg2pqXIJWalCAS3FCfz93PXw9e0R8TXxYfWZ7cHtodUl4N29CeV5taYBgbVGCRHI4fzB8LX0ufy17LYEseSyELnkuhC14LYQteC6EL3gwhC53L4QxeDOCQXpdfF14YnVhdlVzU3ZZclh0U3FQdll1ZHlxeHt9fnZ9f3tveYF4a3mBemt6gnpqeYJ3a3SCbm5lgldzS4FBeTt+OH40fTSBNHw0gTR7NoE7fEF6SnxUcF19ZmhvgHRheYF5XXqDc19qg2BmVYJHbj2AN3Q0fzd4O35Cd0p+UHNWfV9vZn5vbXN/em2Af4Nvhn+GboWAg2yDgH9tfoB+b31+fXB8f3xwfX97cXeAcXJogV9yVYFKdUJ+P3o+ezx9PHk8fj14PH8+dz1+O3U7fjx1PX49dD9+QHNEfEdzTnhWdFtxYXdnamp7bGduf25kb4BxZXGAcmhygHBpbIBna1+BV21LgENxPHw/dkd2UXtZc2F7aHRtdnV5dWx2fnFka4FnYGSDYmJhgGRsanxydHl6fXh+enx2f3uCdYZ7iHaNe493kXyQd499jnSNfYx1i32LdYt+iXaHf4N0gH19cHt8e2l9fXtmfX99ZX2Be2J7gXpleoB6anl/eW54f3lwen96c3x/e3N6f3Vzb39pcWF+Wm5TeU5pTHVKZ0xxT2tVbl9ta292coB1h3aNfI11jH+LcouAi3OMgIx0jX+Nd45/jHiJf4F4en9xdWh8ZHJldmp1cnV3eHp4eHV2fHVvdX91bHaAdmp2gHZqdYB2a3eAd2l3gHNnb4BvaWyAbGxqfWhtOf85/zn/Of85/zn/Of85/zn/Of84/zf/OP84/zf/N/84/zj/OP84/zr/Ov86/zr/Ov86/zr/Ov87/zz/PP88/zz/PP88/zz/PP88/zv/Ov86/zr/Of85/zj/N/83/zf/Nv82/zb/Nv80/zT/Nf81/zT/NP81/zX/M/8z/zP/NP81/zL/Mf8x/zD/MP8u/y3/Lf8t/yr/K/8r/yr/KP8p/yn/Kf8o/yj/Jv8m/yf/J/8m/yX/Jf8l/yb/Jv8l/yX/Jv8l/yX/Jv8n/yf/J/8n/yb/Jv8m/yb/J/8n/yf/J/8n/yf/J/8n/yf/J/8m/yb/Jv8m/yf/J/8l/yX/Jv8l/yX/Jf8k/yT/Jv8o/yn/Kf8q/yn/Kv8w/zz/Q/9L/1T/Xf9m/2z/cv92/3n/ev98/4L/g/+G/4X/fv90/2T/U/8//yr/If8h/yT/JP8k/yT/JP8k/yX/Jv8o/yj/KP8p/yr/K/8s/yz/Lf8u/y7/L/8w/zD/Mf8z/zb/OP85/z7/RP9K/1L/WP9d/2L/Z/9q/23/bv9t/23/av9k/13/Vf9M/0L/Of84/zf/NP80/zP/M/8z/zP/M/8z/zH/Mf8x/zD/MP8w/zD/MP8v/y3/Lf8t/y3/Lf8u/y7/Lv8v/y//Lv8u/y7/Lv8v/zD/Mf8x/zL/M/8z/zP/Nf81/zX/Nf83/zf/OP84/zf/N/83/zf/N/83/zf/Nv81/zX/Nf80/zP/Mv8y/zH/Mf8w/zH/Mf8w/zD/NP84/zv/Q/9O/1r/af9v/3H/cf9u/2z/bP9v/23/cP9x/2//Z/9e/1P/R/87/zL/Lf8q/yn/KP8o/yn/Kf8p/yv/K/8q/yz/M/85/0L/UP9f/2z/dv99/3//f/98/3r/ev97/37/gf+C/4L/f/97/3b/av9b/1P/TP9F/z//Ov85/zr/Qf9L/1f/Yv9w/2v/Tv85/0z/av9v/2P/Uv9F/zn/MP8t/y7/Lv8u/y3/Lf8u/y7/Lv8u/y3/Lv8v/zD/MP8x/zL/M/9G/2L/af9i/1P/Tf9q/2L/Uv9V/1P/V/9m/3L/e/9+/33/e/95/3j/eP95/3n/ef96/3f/dP9u/2X/V/9L/0H/Ov83/zT/NP8z/zP/NP82/zz/Qv9N/1b/Yv9s/3X/e/9//4D/ff91/2z/Yv9V/0n/PP83/zf/O/9C/0j/T/9W/13/Zv9s/3P/ef9//4L/hf+G/4b/g/+B/4H/f/99/33/fv98/33/fv99/3v/d/9x/2j/X/9U/0r/Q/8//z3/PP87/zv/O/88/zz/O/87/zv/PP88/zz/PP89/0L/R/9O/1b/W/9g/2b/a/9r/23/cP9x/3D/cf9y/2//bf9q/2X/XP9S/0r/P/83/zb/Pf9F/1D/WP9g/2b/bP9z/3f/cv9t/2n/af9m/2f/af9t/3T/ev99/37/f/+B/4T/h/+J/43/j/+R/5D/j/+O/43/jP+L/4v/iv+I/4T/gP97/3n/d/9z/3X/d/98/33/f/9//3//fv97/3v/ev96/3j/ef96/3r/fP97/3n/dP9t/2f/Xf9W/07/SP9J/0j/Sf9P/1X/YP9t/3f/gv+K/43/jf+N/4z/i/+L/4z/jP+N/43/jP+L/4f/f/94/23/Zf9i/2j/bP9y/3f/eP95/3f/dv92/3b/dv92/3b/dv91/3b/d/93/3b/c/9v/23/aP9o/2f/Zf86hDppOoQ6ajqEOmo6hDlqOYI5bDiCN203gjdvN4I3cTiCOHA4gjhwOoE5cDmBOXA5gDlwO4A7cDp/OnA6fzpwO4A7cTyAPHI8gDxzOoA7czp/O3Q5fzl1OH84djd/N3c2fzV4NX81eDV/NHg1fzV4NX80dzR/NHc0fzN4M380eDN9MnowfTF6L30teC19LXgrfCx4KnwpeSh8KHsnfCd9JnwmfCd8JnwnfCZ7JXwkeyV8JXolfCV6JX0leyV9JXsmfSZ6JX0leSZ8JnwnfCd6JnwmeSZ8JnkmfCZ5JnwneSZ8JnsnfCd7J3wneyd8J3smfiZ8JX4nfCZ+JnsmfiZ7JH4keiV+JXolfSV8JX0mfCV7JnwnfSt7MH41dz99RnVOfFRzWnthcWV8aW1sgHBneIR+YYWFhl6EhHlhaX1YZ0R5LXIieiR8I30jgCN+I4IkfSWCJn0ngih9KYMpfSqDK3srhC16LIQtei6CLnovgzB7MYMyezSCNn05gD6AQX5JglJ4VoNccmKEZmtohGtqboNua26BbWxnfmBxWHpQd0Z4O3w3dzR/NHc0gTR3NIMzdzODM3czgzJ3MYMydzGDMHgwgzB4MIMweS+DLngugy55LoMteS6DLXotgy96L4Muei6DMHowgzF6MYMxejGDM3ozgzR6NYQ1ezWENXs3hDl5OYY5eTmHOXg5hzl4OYg4eTiIN3k3iDZ4Noc1eDWHNHk0hjJ5MoYxeTGGMXkxhTF6MYQ0ejiDO3xAf0x9V3xkgG12cIBwcG+AbmhrgW1lboJuZXGCb2hsgmRtXIJOckF/NXgtfil+KXwqgil7KoQpfCmEKnwqgyt8LIIxfTiAPXxLgFp+aHx0gHt3foB+c32Bemx5gXlpfIF+aYGBgG2Agn1ud4JqbV+CUm5IgEF1PH01fTV8N38/ekl+VHxgeWp7cXRKeD9vYXt1bXGBZ25Wg0dyPIA0eC99Ln8seyyDLnkuhC54LoQteC2ELngvhDB3MIMweDCCM3s7gVp/ent7emV1SHVOdVxzXHdIc0l1UnZZdmR7cXZ6fX92f398bnmBeGx2gXhreIJ5bXmCeGx1g29vZYNYdEqAQHo4fTR/M3wzgjJ6MYIzejd/PHpFfFB8WnJkfHBpeX5/Y4R/g2N+f3VkbYBhaFWASW8/gDxyPoBBc0iAUHNXgV9vZYFtbHKBeGx9gYNshYCHa4eAhmuCgH9sfoB+bX1+fW5+fn5vfn9+cH+AfHB3gHFxaoNfcVOASXVAfjt6PHs7fTp5OX85eDl/PHg8fzt4O4A7djt+PHY5fj1zQX1HdU92VnVdbmN6aWdsfm5jb4BvZG9/b2VugG9mboBtZ2eAYmpbgk9tR4A6cjN9MHY0eTt5RXVOeVZ0YHVmd25scXxzY2+Aal9qgmtibIFva3J+dXV7en14fnt/doJ7hXWIe4p2jnuPd5B6j3aPe451jH2KdIt9inaKfoh2g358c3Z9cm5ue2lpbHl0Z3h6fWl+fYBof35/aH9/fGx7f3tve397cHt/e3J9f3t0eH9xcmt/ZG5cfFRqTHhIZ0Z0RmZJcE1qV25kbnBwfHGFd4t1jn2OdYt+i3SLf4t0jH+MdY1/jXiMf4h4hH9+d3V+a3NjeGFxZ3RsdXJ0d3d5enlyd311bnV/dWt1f3VrdoB0anaAd2h2gHZmdYBxZ26Aa2pqfmhrZXxibTr/Ov86/zr/O/87/zr/Of85/zn/OP83/zf/N/83/zf/OP84/zj/OP85/zr/Of85/zr/Ov87/zv/O/87/zr/Ov87/zv/O/87/zv/O/86/zn/Ov84/zf/N/82/zb/N/82/zX/Nf81/zT/NP80/zX/NP80/zT/NP80/zT/M/8y/zL/Mv8x/y//MP8v/y7/LP8s/yz/Kv8o/yj/KP8o/yf/J/8n/yb/J/8m/yf/Jv8k/yT/Jf8l/yX/Jf8l/yX/Jf8l/yT/JP8l/yX/Jv8m/yb/Jv8m/yb/Jv8m/yb/Jv8m/yf/Jv8m/yf/J/8n/yf/J/8n/yb/Jv8l/yf/Jv8m/yb/Jv8k/yT/Jf8l/yX/Jf8l/yT/Jf8k/yb/Jv8m/yr/MP85/0D/Rf9K/03/Tv9T/1r/Yv9u/3n/gv+G/4T/ef9t/1z/RP8t/yT/I/8j/yP/I/8j/yT/Jf8m/yf/KP8p/yn/Kv8q/yr/LP8t/y3/Lf8v/zD/L/8x/zP/Nv85/zz/Qv9H/0z/VP9Z/17/Zf9n/2r/bP9u/27/bf9n/2P/XP9V/0r/Qv87/zf/NP80/zT/NP80/zP/M/8z/zP/Mv8x/zL/Mf8w/zD/MP8w/zD/L/8u/y7/Lv8u/y3/Lf8t/y3/Lv8u/y7/Lv8w/zD/Mf8x/zH/Mv8z/zP/NP81/zX/Nf82/zf/Of85/zn/Of86/zr/Ov86/zn/OP84/zf/N/82/zb/Nf80/zT/Mv8y/zL/Mv8x/zH/Mf8z/zT/OP87/0D/S/9W/2H/bP9w/3D/b/9u/2z/bv9u/27/cP9w/23/Z/9f/1L/Q/82/y7/Kv8q/yr/Kf8q/yr/Kv8q/yr/Kf8q/y//Nv87/0n/WP9l/3L/ef9+/3//ff96/3j/eP96/33/f/+B/3//fP93/2z/X/9S/0b/Pf82/zH/NP84/z3/Rv9S/17/a/9k/z3/Qv9n/3b/b/9m/1j/Sv89/zX/Lv8s/yv/K/8s/y7/Lv8u/y3/Lf8u/y//L/8u/y7/L/8w/0P/bv97/3b/Xv9P/07/Wf9U/z7/Tv9Z/2P/Zf9y/3v/fv99/3v/ef94/3b/eP95/3r/ef94/3X/b/9k/1f/Sv9A/zj/NP8z/zH/Mf8y/zT/OP9A/0j/UP9c/2f/c/98/4L/hP+D/37/df9s/2D/VP9I/0H/Qf9G/0n/T/9X/1v/Y/9q/3D/eP99/4P/hv+J/4n/h/+E/4L/f/9+/37/ff97/3z/fv9+/37/fv97/3f/cf9o/17/UP9I/0D/O/86/zn/Of85/zn/Of86/zr/Of85/zn/Of85/zr/Pf9B/0j/UP9Z/17/ZP9p/2z/bv9v/2//b/9u/27/b/9t/2r/ZP9h/1f/T/9C/zb/Mf8u/y//M/87/0b/Uf9b/2P/av9u/3H/cv9v/2//bv9w/3L/dP93/3v/fv9+/3//gP+D/4f/jP+O/4//kP+P/47/jf+K/4r/i/+K/4n/hv+B/3r/cv9r/2X/Yv9l/23/cv94/3z/fv+A/4D/f/98/3z/e/97/3v/e/97/33/e/92/27/af9h/1j/T/9J/0P/RP9F/0f/Tf9Y/2b/cv99/4f/jP+O/47/i/+L/4r/jP+M/4z/jf+N/4z/if+D/3z/cf9q/2L/Yv9n/2z/dP95/3n/ef93/3X/df91/3X/df91/3X/d/93/3b/dP9z/3D/bf9r/2n/Zv9l/2L/O4Q7aTuEO2o7hDtrO4Q7azqCOmw5gjhtOII3bjiCOG84gjhwOII4cDqBOHA5gTlwOYE6cDqBOnA6gTlxOoE6cTqAOXE5gDlyO4A6cziAOHM4fzh0N383dDd/NnU1fzR2NX80eDR/NHg1fzR5NH80eTJ/M3c0fzR3NH8xeDJ/MngwfS96L3wwei58LXsrfCt6KnwqeSl8KHsofCh7KHwofSd8JnwnfCZ8JXwmfCZ8JXwmfCZ9JXwlfSV8JXslfCV7JHwkeiR9JXkmfSZ4J30neSd9J3gmfSZ4JXwleSZ8J3klfCV6JnwmeiZ9JnsmfSZ7Jn4mfCZ+JnwmfiZ8Jn4mfCV+JXwlfiV8JH4keyV+JXskfyR7JH8keyR+JHonfix6MX01eDh8O3Y9fkNxS4NXaGmHdmGAh4VehIJ6YG58W2pDeSx0I3ojfCR9JIAkfiSCJH0lgiZ9J4IofSmDKX0qgyx8LIQsey2ELXothS96MIUvezGCM342gDqBPnxEg0t3UYRYdVyEYXBmhGptaoRqa26DbWxpgGRtYHxYck95Rnc+eDl+Nnc1gDR3NYE0dzSCNHc0gzR3NIMzdzODM3czgzJ4MYMweDCDMHkvgy94L4MueS2DLXktgy16LYMuei6DLnowgzB6MIMxejGDM3ozgzR6NIM1ejWENnk3hDd5OIQ5eTmGOHk4hzl4OYc5eDmIOXk4iDh5N4g3eDaHNng1hzR5NIczeTOGMnkyhjN5MoUyezGEM3s2gz19Qn5JflR6X4BpdXGBcnBwgW5na4FtZW+Cb2RwgnJncINramODV29JgDx2MH8rfCt8K4IpeymDKnwrgyt9LIIrfS2BL342fjt+R3lWf2J1boB3dn2Af3R+gXtteIF4anqBfWl+gYBtgIF+b3mBb3BigVNxRH84eDJ9MH8zfDaBPHpFf1F8XXpqe2F0RHhGb297d2xygWhsXYNMckCANXgvfS1/LXstgyx5LIQteC2ELnguhC54LoQtdy6DMHkygjx9X3xrgGx3cnpYdEd1TnpOdFp9U3RRelJ2Z3Zqe3R2fH1+d35/e3B5gXhsd4F3a3mCemt4gndudYNvbmeDWXNKgEB4OH00fTJ8MYIxejKCNHo5gD17R3pSfF9zanx3an98g2eEfoNnfn91a2uAYGxUgUxuR4FFcEmAUHBWgFpwYIFnbm6Bdm58gYFth4GKbYqAiGyGgIFsgX9/bn5/fm58f3xwfH58cX9/f3F+gHtxd4BxcWmDXnFQgUZzP385dzh8Nn04eTV/N3g3fzd4N383eDh+N3Y3fzZ3OH88d0J6R3hRc1p3X21ne2llbX5uYm2AbWNuf21lbYBuaGqAZ2ljgFtqUoJIbj2ANnMufSt3LXoweTV2PXlGdFN0XHdlbWx7b2ZxfnFgcYBxYXSAdWp4f3pzfHx+dn17gHSDe4V1iXuKdo57j3iOeo52jXuMdYt9inSLfYp2iH2DdX5+d3JsfmFuXHtZal53ZmlrdnNqeXl+a4B8f2t+f31ufH98cHx/fXJ8f3xzfH95dXN/bHRmf1xuU3xKakV3QmlBdEJpRnBPbVtvaHJ0c390iXiOdY5+i3OLfotzi3+LdYx/jHaNf4x4in+GeIB+e3ZwfGZyYXdjc2Zya3dzdHp4eXp4c3d9dW50f3Rrdn92a3aAdmp2gHZodYBzZnCAbmdqgGhqZ35lb2F8XnE7/zv/O/87/zr/Ov87/zv/Ov86/zn/OP83/zj/OP84/zj/OP84/zj/Of85/zn/Of85/zr/Ov87/zn/Ov87/zv/Of85/zn/Of86/zj/N/83/zf/Nf82/zb/Nv82/zT/M/80/zT/Nv81/zT/NP80/zP/Mv8z/zT/NP80/zH/Mf8x/y//Lv8t/y7/Lf8s/yv/K/8q/yr/Kf8o/yj/J/8o/yj/J/8m/yb/Jv8l/yb/Jv8l/yb/Jv8l/yX/Jf8l/yX/Jf8k/yT/JP8l/yb/Jv8n/yf/J/8n/yb/Jv8l/yX/Jv8n/yb/Jv8m/yb/Jv8m/yb/Jv8m/yb/Jv8m/yb/Jv8m/yb/Jf8l/yX/Jf8k/yT/JP8k/yP/I/8j/yP/Iv8i/yL/JP8m/yf/LP8u/y//Nv9C/1H/ZP9z/3//hP+D/3n/bP9Y/z7/Kf8j/yP/JP8k/yT/JP8k/yX/Jv8n/yj/Kf8p/yr/LP8s/yz/Lf8t/y7/MP8w/zH/M/82/zn/P/9E/0r/Tv9V/1v/X/9m/2b/Z/9r/27/bv9s/2j/Y/9a/1P/Sv9D/zz/Nv82/zX/Nf81/zT/NP80/zT/NP80/zP/M/8z/zP/Mv8x/zD/MP8w/zD/L/8v/y7/Lf8t/y3/Lf8t/y7/Lv8u/zD/MP8w/zH/Mf8z/zP/M/81/zX/Nf81/zb/N/84/zn/Of85/zn/Of85/zn/Of85/zj/N/82/zf/Nv82/zX/Nf80/zP/M/8y/zL/Mv8z/zH/Mv80/zf/PP9B/0n/Uv9d/2b/bv9y/3D/bv9s/27/b/9v/3D/cv9y/2z/Zv9b/03/P/80/yz/LP8p/yv/Kf8q/yv/K/8r/yr/LP8w/zX/PP9G/1X/Yf9s/3b/ff9//37/e/94/3j/ef98/33/f/9//37/e/9y/2X/U/9C/zf/Mv8w/zP/Nv86/0T/T/9b/2f/W/9F/1L/df90/2//av9f/07/Qf82/y//Lf8r/yv/K/8s/y3/Lf8u/y7/Lv8u/y7/Lv8w/zP/S/9q/2r/df9s/0z/R/9G/0j/Tf9M/07/Uv9v/27/c/97/33/fv97/3n/eP93/3f/d/95/3j/d/90/27/Z/9Z/0r/QP84/zT/Mv8x/zL/Mv8z/zn/Pv9I/1X/Yv9t/3n/gP+E/4X/gv9+/3X/a/9g/1T/TP9I/03/U/9Y/1n/XP9k/23/dP97/4H/hf+J/4n/iv+H/4T/gP+A/37/fv9+/3z/fP99/3v/f/9//37/e/92/3D/Z/9c/1D/RP89/zv/N/82/zb/Nv83/zf/N/83/zf/Nv83/zf/Nv83/z7/Q/9K/1P/Wf9f/2b/av9t/2//bf9u/23/bf9u/23/a/9m/1//Wf9Q/0X/Ov8y/y7/K/8r/y3/Mf84/0H/TP9W/2H/av9t/3T/dP90/3X/eP95/3v/ff9+/4H/gf+A/4L/hP+I/4z/jf+N/43/jf+M/4z/i/+K/4v/iv+H/4H/e/9z/2f/W/9T/1D/WP9g/2v/cf92/3r/fv9//37/ff99/33/ff99/3z/fP96/3f/cv9r/2P/Wv9R/0f/Qv8//z//Q/9I/1H/Xf9q/3f/gv+J/43/jf+L/4z/i/+L/4v/jP+M/43/jP+K/4b/gP94/27/Zv9f/2L/Z/9s/3T/eP95/3j/dv90/3T/dP91/3X/df91/3X/df91/3P/cP9u/2r/aP9m/2T/Yf9d/zuDO2k7gzpqOoQ6ajuEO2o6gjlrOYI4bDeBN244gThwOII4cDmCOXE5gThwOYE5cTmBO3E7gTtxOoE6cjqAOnE5fzlxOX84cjh/OHM3fzdzNn81dTV/NXU1fzR3NX81eDV/NXk0fzR5M38zeTN/M3kyfzN4NX81eDR/MXkwfjB5Ln0ueS59LnosfCt6K3wreip7Knspeyd7J3wneyd8J3smfCZ8JnwlfCZ8JXwlfCR8JHwlfSV8JX0kfCR7JHwkeyR9JXkmfSV5JX4meSd+KXgnfiZ5JnwmeSd9J3knfSd6J3wneyd7J3kmfCZ7J3wneyd9J3smfSZ7JX0lfCV9JXwjfiV8JH4kfCR+JHsjfiN7I38jeyJ/InsjfiJ7JH4keyN/JXwmfyd6LIE0dT6FTmtgiHFifYmEXoKDeWFrfldqPHsndCN7I3wkfSSAJH4kgiV9JoMnfSiDKX0qhCp8K4QrfCuDLHwshC58MYMyfDKCNH45gD2CQn1GhEt3UYRUcFuFYW5khWdsaINpbG2DbmxsgmluZn9gcVd8TnRHdz96OHc3fjZ3NoA1dzSBNHc0gzR3NIM0dzSDMncyhDJ3MoQxeDGDMHgwgzB5MIMveC+DL3ougy16LYMtey2DLXstgy57MIMwezCDMXsxgzJ7M4M0ejWENXk1hDV6N4U3eTeFOXk5hjl5OYc6eDqHOXg5iDl4OYg4eDiIOHg4iDZ4Nog1eTWHNHk0hzN5M4YzeTOGMno0hTV8OIQ9fkKBSX9RfFqAY3drgHBwcYBvam2BbWZvg29kcYNyZXaDcWlqg2JtUYFDcjZ/LnspfSl/K3wqgyt9KoMqfCyAK34ufzOAOnw/gUd1U4Fgc2qBc3R8gIB1f4B9b3mAeWt4gXtrfIF+bYCCgG97gnNwZ4NXckaBOnkzfzF9NHw5gTp6Qn9Oe1l6ZXpUdkt2XnF6fnRrcYJramCDUG9DgDd2MH0sfyx7LIQreSyELHgshC14LYQteC2ELnkwhC96M4BSfXF6en93dl95RndFdEx7PnI+fExyVXhVdGV0aXpxdHx+f3R+f3txeYB4bneAd2x4gXhteYF4bXWDb29mg1lzSoFAeTl/NH8xfDKBMXoxgjR6O4BBekl8V3tjdW97enGEfIdth32EbX+AeG5tgWBuVYNRbVGDU29Wg1hwW4JhcGeCcG13gn1thYGIb4mBiW2IgIVvg4B/bX6Afm5+f31ve397cX1+fnF/f35xfYB8cXWAcHBmg1twT4FCczx/OHg2fDR9NHo1fzZ5N342eTZ+NXk1fjR4NH41eDd9O3dCeUt4U3NaemBtZ35qaGyAbGNtgG1kbIBrZW2AbGdpgWNqXYBWbE2AQXA4fy9zLH0qeSp7LHwweDZ5P3VKc1R2Xm1pem1mc312YneAd2N6f3trfn9+coB9gHSAfIF0gnuFdYh7i3eNe414jXqMd4x7jHaLfYt1in2KdYd9gHV6f3BxZX9Ybkt9SmtQeVxsZHZrbXJ4d217e31ufn1+cH59fXF9fn1ze357dHh/dXRvf2dxXn5YbU17RGw/dj1rPXNAbUdvU3FfcGx2e3SEd4t5jXaOfotzi3+LdIp/jHaMf4x2jYCLeImAhXh/f3V0bHtkcGB1Y3Rocm55dHV4eXh6d3N0fXNuc39zbHOAc2tzgHVrdYB0aXSAcWVwgG5nan9maWV+Y2xge1txO/87/zr/O/86/zr/O/87/zr/Of84/zf/N/83/zj/OP84/zj/OP84/zj/Of85/zn/OP85/zv/O/86/zr/Of85/zr/Ov84/zn/OP84/zb/Nv80/zT/Nf81/zX/NP80/zT/NP80/zP/M/8z/zP/Mv8y/zL/Mv8y/zL/Mv8x/y//L/8t/y3/LP8s/yv/Kv8q/yr/Kv8p/yj/J/8n/yf/J/8n/yb/Jf8m/yX/Jv8l/yT/JP8k/yX/Jf8l/yT/JP8k/yT/JP8l/yX/J/8o/yv/K/8t/y3/K/8o/yf/KP8n/yf/J/8n/yf/J/8n/yX/Jf8m/yb/Jv8m/yT/JP8k/yX/Jf8l/yX/JP8k/yT/JP8k/yP/I/8j/yP/Iv8i/yP/Iv8j/yP/I/8k/yX/Jv8r/zH/Pv9N/1//cP99/4T/gv95/2v/V/8+/yf/I/8j/yX/Jf8k/yT/Jf8m/yf/KP8p/yr/Kv8r/yz/LP8t/y7/L/8w/zL/Nf85/z//RP9I/03/Uf9W/1v/Xf9k/2X/af9q/2v/av9q/2r/af9j/1v/U/9K/0H/Of83/zX/Nv82/zX/NP80/zT/NP80/zT/NP8y/zL/Mv8y/zL/Mv8x/y//MP8w/zD/Lv8t/y3/Lf8t/y3/Lf8t/y3/Lv8w/zD/MP8x/zH/Mv8z/zT/Nf82/zb/Nf83/zf/N/84/zn/Of85/zr/Ov85/zn/Of85/zn/Of83/zf/Nv82/zX/Nf80/zT/M/8z/zP/M/8z/zT/Nv86/z7/Q/9J/1H/W/9k/2v/cP9x/2//bv9u/2//cf9z/3T/dv90/27/Zv9a/0r/PP8w/yr/Kv8q/yr/K/8q/yv/LP8v/zL/Nv88/0L/S/9U/2D/a/90/3z/gP+B/37/ev94/3j/e/98/37/gP+A/3z/dv9s/1v/S/89/zX/MP8y/zX/Ov9C/03/V/9k/1D/U/9n/3b/df9y/23/Y/9T/0T/O/8y/y3/LP8s/yv/LP8s/yz/Lf8t/yz/Lf8t/y7/MP84/2z/ev91/3X/Yv9O/0X/RP8+/0X/Uf9R/1T/Zv9m/3H/fP9//33/e/95/3j/d/93/3j/eP95/3j/dP9u/2X/WP9K/0D/Of80/zD/Mf8v/zH/Nf87/0P/Tf9Z/2b/cv9+/4b/h/+H/4b/gv98/3D/ZP9Z/1b/Vv9Y/1r/XP9d/2T/af9y/3j/fv+F/4j/if+J/4f/g/+B/3//fv9+/37/fP98/3z/ff9+/3//fv98/3n/dP9v/2b/W/9P/0P/Ov82/zT/NP80/zT/NP81/zX/Nf80/zT/NP80/zX/N/88/0T/Tf9V/1z/Yv9o/2v/bP9s/23/bf9s/2v/af9p/2b/Yf9b/1T/Sf9A/zP/MP8r/yn/Kf8r/zD/NP86/0X/UP9c/2b/bf9y/3b/ef97/3z/f/+A/4H/gv+C/4L/g/+D/4X/if+L/47/jv+N/4z/iv+J/4r/iv+K/4j/hv9//3j/bf9j/1X/Sv9K/07/V/9h/2j/cP93/3r/ff9+/37/ff9+/37/fv98/3v/ef90/2z/Zf9e/1L/SP9B/zz/Ov8+/0L/S/9X/2P/b/98/4b/i/+M/43/jP+L/4z/i/+M/43/jf+M/4r/iP+D/3z/df9q/2L/YP9j/2j/bv90/3j/d/91/3T/dP9z/3L/cv9y/3P/dP90/3P/cf9y/2//bf9q/2b/Y/9g/13/W/87gzppOoM7ajuDO2s7gztrOYI6bDiCN2s3gTdsOIE4bTiCN243gjdwOIE4cDiBOHE5gTpxOoE6cTqAOnE5fzhxOX85cjh/N3M3fzd2Nn82djV/NXc0fzN4M38zdzN/M3g0fzR5M38zeTN+M3kyfjJ5MX8xeTB/MHkvfi95LnwteSx8K3gqfCp5K3wreit7Knooeyh7J3sneyd8J3smfCZ7JnwlfCV8JnwlfCV8JXwkfCR8JHokfCR6I3wkeiR8JHokfiV5Jn8neCyAMHczgDR2NIAydS1+K3Upfih1KX4pdyl+JncmfCZ4JXwleiR8JHokfSR7JH0keyN9JXwkfSR8Jn4kfCN+I3wjfiN8JH4jfCR+I3wjfiJ8In4jeyJ+InshfyB8JH8neSmBL3Y6hEpuXIdtZHmHgWCFhXpha39YZ0F7KXMieyR7I30kfiV+JYEmfSeDKH0pgyl9KYQqfCuEKnwsgy59LYQwfjKCNYE5gEGERXpKhU50U4VWcF2EX2xjhWRrZoRoa2uDa2xrg2tsaoFmbV9+VnFNekR3Png4fTZ3NX82dzWBNXc0gTR3NIMzdzODM3czgzJ3MoQydzKEMXgxgzB4LoMueS+DMHgugy16LYMtei2DLXstgy57LoMuezCDMHswgzF7MYMxezKDM3o0hDZ5NoQ2ejeFOHo4hTl5OYY4eTmHOng6hzp4Oog5eDmIOXg5iDd4N4g2eDaINnk1hzV5NYczeTOHM3kzhjV8NoM3fTqCP35EfUl/UXhagGN1aoFvcnGBcGxvgW5mcYNyZHODdGV2g3VpcYNrbWGCUXJCgDR3Kn4qfSt8K4EsfiuBLoAwfjOBNno7g0F1RYVNbVaFYWxsg3VvfYGBcoKBgG9+gXpre4F7anyBf2qBgoBsfoJ5b2+BYXJPgEF3N38xfTF8NIE4fEGATHlXfGR4THZMeGpxdn52bnGCbG1lg1ZxRoA7dzJ9LX4reyuDKnkrhCx4LIQteC2ELHgthCx5MIIwfEl9en9yelV8S3xed119VHVQeFd1THVNclFzUHRpcml6cnJ+fn9zfX97cnqAeW53gHlseYF5bHmBeGx0gm5uZoJYckqBP3k4fzR/MX0xgi97MoE3ez+ARntQe1t7aHZ2e39yhXyHc4t9iXOGgH9zcoFnbl2DWG1Yg1lvXINdcGCCZXBsgHJueoCAboSAiG+JgIlthoCDbYCAf25+gH1vfn98cH5/fnB9fn5xf3+AcXyAeXF1gG9xZYNZcU2BQXQ5gDV4Mn0yfDJ8M34yezJ+M3szfjR7NH4zejN+NHk4fD14RXhOeVZxXXtla2p/a2dtgG1jbYBuZWyAbGdrgWloZYFea1qBUG9FgDpzMn8rdSl9KXsqeyx8L3gzeTh3RXRPd1tvY3hqaXJ7d2V5fH1lfnuAboF9gnGDfIRyhHyEdIR7hnWJe4x3jXuNeIx8jHeKfYl2iX2Jdol9hnaFfX52dX9qcWCAVmxLfkdpTXpUal53aW1yeHhwe3t9cX99f3N+fX10f359dHt+enV3f3F1bH9kc1t+T29Eez1tOnc6bjtzQm9McFd0Z3Bzd391h3iLe4x2jH6LdIt/i3WLf4t2i3+Ldop+ineIfoF3fX5zc2d6YXJedWJ0Z3JveXR1dnh3enVycn1ubnF/cWxygHJrc4Bza3OAc2lygHFoboBsamp/Zmxhe15vW3hZdDv/Ov86/zv/O/87/zv/O/86/zn/OP83/zf/N/84/zj/N/84/zf/N/84/zj/OP84/zn/Ov86/zr/Ov85/zf/N/84/zj/N/83/zf/N/82/zX/NP80/zP/M/8z/zP/M/8z/zL/Mv8y/zL/Mf8x/zH/Mf8x/zH/MP8w/y//L/8u/y3/LP8r/yr/Kv8q/yr/Kv8p/yj/KP8n/yf/J/8n/yb/Jv8m/yX/Jf8m/yX/JP8l/yT/JP8k/yT/JP8j/yT/JP8k/yX/JP8m/yf/K/8w/zX/Ov89/zn/N/8y/zL/Mf8w/zD/Lv8s/yj/Jv8k/yT/I/8j/yT/JP8k/yT/I/8l/yT/JP8l/yP/I/8j/yP/I/8k/yP/I/8j/yL/I/8i/yP/Iv8i/yL/If8i/yX/KP8v/zn/R/9W/2r/ef+B/4T/fP9u/13/Sv8x/yT/Jf8j/yT/Jf8l/yb/J/8o/yn/Kf8p/yr/K/8s/y3/Lv8w/zP/Nv86/0D/Rv9L/0//U/9Y/1z/X/9h/2P/Zv9q/2v/a/9r/2r/av9p/2P/XP9T/0r/Qv87/zb/NP82/zX/Nf81/zT/NP80/zP/M/8z/zP/M/8z/zP/M/8x/zH/MP8v/y7/L/8v/y3/Lf8t/y3/Lf8t/y3/Lv8u/y7/MP8w/zD/Mf8x/zH/Mv8z/zT/Nf82/zf/N/84/zj/Of85/zj/Of86/zr/Ov86/zr/Of84/zj/OP83/zf/Nv82/zX/Nf81/zP/M/81/zX/Nv82/zj/PP9A/0X/Sf9R/1j/Yf9p/3D/cv9y/3D/b/9x/3L/c/90/3b/dv90/27/Zf9X/0b/OP8u/y3/Lv8s/yv/Lv8x/zX/N/87/0D/RP9K/1H/WP9g/2r/c/99/4P/g/+B/3//fP97/3v/ev99/4L/gv+A/3v/cv9l/1X/RP84/zL/Mf80/zj/Qf9J/1T/Y/9L/0b/af92/3b/cv9s/2b/V/9I/z3/Mv8t/yz/LP8q/yv/LP8s/y3/Lf8t/y3/Lf8x/0T/dP93/23/Wv84/0//T/9N/1P/V/9R/1L/Uv9P/2P/av9z/33/gP99/3v/ev95/3j/d/95/3n/ef94/3X/bv9l/1b/Sf8+/zj/NP8z/zH/Mv81/zv/Qf9J/1P/Xv9s/3j/gv+J/4r/i/+K/4b/f/90/2j/YP9b/1v/XP9d/13/Yv9m/2z/cv92/3z/gf+F/4b/hv+E/4L/f/9//37/ff99/3z/fP98/33/fv9//33/ev94/3T/bv9k/1r/Tv9B/zn/Nf8y/zH/Mf8x/zL/Mv8x/zH/Mf8x/zH/Mf80/zn/Pv9H/1D/Wf9g/2f/av9t/23/bf9t/23/bP9s/2v/aP9j/13/V/9N/0L/N/8v/yr/Kf8p/yn/K/8v/zP/Ov9G/0//W/9j/2n/cP92/3v/fv+A/4P/hv+F/4b/g/+E/4T/hv+H/4r/jP+N/43/jP+M/4r/if+J/4n/if+G/4X/ff92/2z/YP9T/0v/Sv9N/1T/Xv9o/3D/dv97/33/f/9//37/ff99/3z/e/96/3b/cP9q/2L/Vv9L/0P/Pf86/zr/O/9C/07/Wv9p/3X/gf+J/4v/jP+L/4z/i/+L/4v/i/+L/4v/i/+J/4b/gP94/3D/Zf9g/17/Yv9o/27/dP92/3b/dP9y/3D/cf9x/3H/cf9y/3L/cv9y/3H/cP9t/2r/Z/9j/2H/Xv9a/1j/O4M5aDuDOmk6gjtqO4I7bDqCOmw4gTltOIE3bTiBN244gThtOIE3bzeBOHE5gTlxOYA5cjmAOHI4gDhyOH84cjd/N3M2fzZ1Nn82dzV/NXcyfjJ2Mn4ydjF+MXgxfjF4Mn4yeTJ+MnkxfzB4MH8weTB/L3swfzB7L30vey59Lnsseyt7Knsqeyl7KXspeyl7KXspfCd7JnwlfCV8J3wnfCV9JX0mfSZ9JX0lfCV9JHskfSR7I30jeyV9JXkkfSR5I3wjeCR8Jngrfy53M4E3dzuBO3c6gTZ3N4E3dTeBN3U2fjV0L30qdSV8JHckfCR5JHwkeyR+JHwjfiN7I34jeyJ+I3sjfiN7I34jfCJ+InwifiJ8In4ifCJ+InwhfiF8IX4heyN+JHspgS14NoNCcFKGY2ZziX5hgoV+YXOCY2VQfDhxJ3omeiR8JH4nfSd/J38ogih9KIMqfCqEK30rhCx9LoMvfzKCNYI9fUOGSHdNh1FxVIdZbl2GX2tihWRoaIRraGuFamltgmtpaIFpamV+Xm9WfEx0RHk/ejl4N382eDaCNXg1gjZ3NoM1dzWDM3czgzN3M4MzeDOEMngyhDF4MYQveC+EL3kugy55LYMtei2DLXotgy17LYMuey6DL3sxgzB7MIMxezGDMXsygzN6NIM1ejWENno3hTh6OIY5eTmGOHk5hzl5OYc5eTmIOXk4iDd5OIg5eTmIN3k2iDR5NIczeTSGM3k0hzV6NoU3fDaCOn4+gECARn1LgFB4WIFgc2mBcXJzgXRtcoFwZ3CCcWRzgnVkdoJ4ZnaCcGlnglxwS4E7dDKALXotfy19LX8xfTaAOXk9hEJzRYVKbU2GVGVbhmFmaoJzbXyBhHGFgYVugIB+anuAemh9gX5sf4GBbIKBgG54gWtzW4BKdjt/M3szfDSBN3s+gUl4U31hdkp2SnZqcnZ9dG9ygm9tZoRYckmAPHg0fS1+LHssgip6K4MseiyELXktgy15LYMteS6DS3p4f3p9cXpKfjd7VXlOe0x1SXZNdVNzTXFSb1d0Y3BoenJxe36AdH5/e3B6gHlteIB4bXmBeW15gXdsdIFtbWWCWXFLgT13N4A1gTJ+NYI0fTh/PX5Fe0x9WHhjfHBzfHqGc4x7jXaNfIp2hn99dHSDaW9ig15tXINdbV2CX3BhgGVwan5wcHZ9eXF/foNxhX+Eb4SAg21/gH1ufX99b31/fW9+fn9wfX5+cH9/fXJ5gHhydYFtc2OCWXNLgT91N38zejJ7MXwwejB+MHswfjB7MH0wezB/MHovfTZ5OnpAeUd2UXpZb2F9aGltf2xlbYBtY22BbWRsgWtnaYFlaGCBWmxVgktvP4I1cy1+K3orfCt9KnsqfC55NHc/eUlyU3lcbGN5amlxeXVne3p/aIF7hG+Ge4ZyhHuDdIR7hHSGe4d2inyMeI18i3eLfIp3iXyJdoh7iXeJfYh3hX5+d3aAbHJfgFJuSn5LbFF7Vm1hd2pvcXl5cXx7fnN+fX51f358dHx+fHV7f3h0c4BudmWAXHNRfkdwP3s6bzh2OW89c0RyT3FfdmxyeXmDeIp3i3yLc4t9i3OLfot0jH2MdYx9i3WKfol3hH59d3Z8bHRjeV50XnNidmdzbnh1dXV2dHtzcXJ/cW9wgHBucIBwbHGAcWpxgHFqb4BtamuAZ2tmfWNuYHpccVd1Vnc7/zn/O/86/zn/Ov87/zv/Of85/zn/Of84/zf/N/83/zj/OP84/zf/N/84/zj/OP85/zn/Of84/zj/OP82/zb/N/83/zb/Nv81/zX/NP8z/zL/Mv8y/zL/Mf8x/zH/Mf8y/zH/Mf8x/zH/MP8w/y//MP8v/y//L/8u/y7/Lf8t/yv/LP8q/yr/Kf8p/yn/Kf8o/yf/Jf8l/yX/Jf8m/yb/Jf8l/yb/Jv8l/yX/Jf8k/yT/JP8j/yP/I/8j/yP/I/8j/yP/JP8l/yj/Kv8u/zH/Nv82/zT/Nf82/zb/Of85/zj/N/8y/y3/J/8k/yT/JP8k/yT/JP8k/yP/I/8j/yP/Iv8j/yP/I/8j/yP/Iv8i/yL/Iv8i/yL/Iv8i/yH/If8g/yD/If8j/yb/K/8y/zz/Tf9d/2//e/+C/4H/dv9m/1X/Pf8q/yb/Jf8n/yv/Lf8s/yj/Kf8p/yr/Kv8r/yv/Lf8v/zL/Nv88/0L/Sf9N/1P/Vf9b/17/X/9i/2X/Zv9o/2r/av9q/2n/af9n/2P/X/9Y/0//Rv9A/zn/Nv81/zb/Nv81/zX/Nv82/zX/Nf8z/zP/M/8z/zP/M/8y/zL/Mf8x/y//L/8v/y7/Lv8t/y3/Lf8t/y3/Lf8t/y7/Lv8v/zH/MP8w/zH/Mf8x/zL/M/80/zX/Nf82/zf/OP84/zf/N/84/zn/Of85/zn/Of85/zj/N/84/zn/Of83/zb/Nv81/zP/Nf81/zT/Nf82/zj/Ov88/0D/Q/9H/0v/UP9V/2D/aP9v/3P/dP90/3H/cP9w/3P/df92/3j/d/9z/2z/Yf9Q/0D/Nv8v/y7/Lv8x/zj/PP8//0L/Rf9K/1D/Uv9X/13/Y/9r/3P/e/+D/4X/hP+B/3//f/+A/3b/e/9//4L/f/+B/3j/b/9g/0//Pv81/zP/NP83/z7/R/9S/17/Sf9I/2z/dv90/3P/b/9m/1j/Sv89/zT/Lf8s/yz/Kv8r/yz/LP8t/y3/Lf8t/y3/Lf87/2D/cP9q/1H/OP9b/1f/Tv9M/1D/Wf9V/03/VP9j/2D/Zv92/33/fv99/3r/ef94/3j/ef95/3n/d/90/2//Zv9Y/0v/QP85/zb/Nv84/zn/Pv9F/0z/U/9d/2j/dP9+/4f/jP+O/43/iv+E/3z/cv9o/2P/YP9f/17/Xf9d/17/YP9k/2r/b/92/33/g/+E/4L/gf+B/37/f/99/33/ff9+/3//fv9+/33/f/99/3n/dv9y/23/Y/9Z/0v/P/83/zP/Mf8w/zD/MP8u/y7/Lv8u/y7/Lv8v/zD/NP86/0L/S/9T/1r/Y/9q/23/bP9s/2z/bf9t/2z/a/9p/2P/Xf9X/1D/Rf88/zP/Lf8r/yn/LP8r/y3/MP85/0L/TP9V/13/Y/9q/3L/dv97/3//g/+F/4b/hv+E/4P/hP+E/4b/h/+K/4z/jf+K/4r/if+I/4j/hv+I/4f/h/+E/33/dv9s/1//Uv9O/07/U/9a/2L/a/9z/3n/fP9+/37/ff9+/33/fP98/3v/d/9y/2v/Zv9c/1H/R/88/zj/OP84/z3/Rv9T/2P/b/97/4X/iv+L/4v/i/+L/4v/i/+M/4z/jP+L/4r/if+F/3z/c/9p/2P/Xv9e/2L/af9v/3b/dv90/3P/cP9v/3D/cf9x/3H/cf9x/3H/cf9v/23/av9n/2T/Yv9e/1r/V/9X/zqDOmg8gzxpOoI6ajqCOmw7gjlsOoI6bjmBOHA4gTdwOIE4cTiBOHI4gThyOIE4cjmAOXI3gDdyN382czV/NXM1fzV0NH80djV/NXc0fzN3Mn4ydzJ+MncxfjF5Mn4yeTJ+MnowfjB6L34veS9+L3ovfi98Ln4vfC59LXwtfSx8K30reyp9KXsofCd8J3wnfCd8J30lfCV9JXwlfCV8I3ojfSV7JX0leyR9JHskfSR6JX0leyN9InsjfSN5I30jeSN8I3kkfCR5JX0neSh+Knkrfit3LX4vdy9/L3UyfzZ1Nn42djF9LngofCV3I3wjeSJ8InkifiJ7I34jfSN+I30kfiR9I34ifSJ+InwifiJ8In4ifCJ+IXwhfiF7In4ieyJ+InsifiN7JYEpeTCDOnNKhlpqa4d4YYCHgV93hGljW4BGbC9+JnUlfip7L4AyfzN/LH8pfSmAKX0qgyt+LIMtfzKBOIE7fUGFR3dLh1FyVYdaa16IYGdjh2RnZoZoZ2mFaWZpg2lnZ4JmaWR/YWxZe1BySHlBdzx3N302djSANXc1gjV3NYI1dzWDNXc1gzR3NIMzdzODM3gyhDJ4MoQweDCEL3kvhC55LYMueS2DLXotgy16LYMtey2DLnsugzB7MIMxezGDMXsxgzJ7M4MyejWDNno2hDZ6N4U4ejiGOHk4hjh5OIc5eTmHOHk4hzl3OIg4dziIOHc4iDd3N4g3eTWHNHk0hjV6NYc2ezeFOnw8gj1/QX9FgUp6TYJRdViBX3FngW9vdYF1bnWBc2lygnJmdIJ2ZnSCdmh3gnNoboJkblWBR3M6gDF4MIAyeDeBPHVAg0VvSIZNaVCHVGRYhltjX4ZkZWmEcWd7goJuiYGGboOAfm5zgV5uaoF8cIB/eW96gIBxfIJzc2WCVHREgDh6M30zfzZ8PIFGeVB9X3ZKeEd2a3N2fHNvcYFubGaDWG9LgT51NX0ufSx7LIEpeiqELHoshSx5LIQseSyELXgrgzJ4TINleG5+YXxQfG5+fHppe1F4T3hedV5zTnJMdWFxXntWcmt+gnN/f3xxeoB5bXmAeWp5gXlseIF4a3aDb2xmglluSoE/dTuBO3o9gkF8Q4FIeUyAVHZaf2JzbX14dYF8hneLe4x6jHyJeoN+enZugmdwYYNgcF+DXXBagVhyWX1ccmJ6aXJwfHd0fX6BcYR/gm9/gH5tfIB9bn1/fHB9f35wf35+cH5+fnF9f3tyeoB0cnGBa3NjgldzSYE9dDZ/M3kwfS98Lnsufy57LYAtey1+LHssfS16L3w1eTx6Q3lMdlV6XW9kfWpqbX9rZWyAa2RsgWxkbYBqZmiAZWhdgVdrT4FEcDmBMXQsfyp5Kn0seyt7L3o1e0B2SHtScFh7Xm1je2trcnt3an17gG6BeYVzhnmGdoV7g3WDe4R1hnuHd4p8jHiMfIp4inyId4h8h3aHe4h3h32Hd4N+fHZ2gGxzYIBTblF+UmxVfFttZXpsb3R6eXF9fH5zfX58dH1+fHZ8f3x2e393dXCAaXZigFhzTX5BcTl7NnA4dzhzPnNGdVhxZHhxc356h3iKdop8inWLfYt0jH6MdYx+jHiMfox4i36IeIJ+e3hxfWZ0YHlcdF50Y3hqc3J6dnd3d3R8c29xf3BscYBya3KAcmxzgHNqcYBvamyAampsgGdtZX1ecFx5WnJZd1lyOv86/zz/PP86/zr/O/87/zv/Of85/zn/OP84/zj/N/84/zj/OP84/zj/OP84/zj/OP84/zf/N/83/zb/Nf81/zT/NP8z/zP/NP80/zP/M/8y/zH/Mf8x/zH/Mf8y/zL/Mv8y/y//L/8v/y//L/8u/y//L/8v/y7/Lv8t/y3/LP8r/yv/Kf8q/yj/J/8n/yf/J/8n/yf/J/8n/yf/Jf8j/yP/Jf8l/yT/JP8k/yT/JP8l/yX/I/8i/yP/I/8j/yP/I/8j/yT/JP8k/yT/JP8m/yb/Jv8n/yn/Kv8q/yv/L/8v/y//K/8p/yb/Jf8j/yP/Iv8i/yL/Iv8j/yP/I/8j/yT/JP8j/yL/Iv8i/yL/Iv8i/yL/If8g/yH/If8i/yL/Iv8i/yL/I/8l/yn/L/84/0X/V/9m/3T/f/+B/3r/bv9h/1D/Nv8p/yn/Lv81/zn/O/8z/yr/Kf8p/yr/K/8u/zH/Nv87/0D/Rv9M/1H/Vv9a/1z/Yf9k/2P/Zv9p/2j/aP9p/2n/aP9n/2P/X/9Z/1L/S/9C/zz/N/82/zX/Nf81/zX/Nf81/zX/Nf81/zX/NP80/zP/M/8z/zL/Mv8y/zD/MP8v/y//Lv8u/y7/Lf8t/y3/Lv8u/y3/Lf8u/y7/MP8w/zH/Mf8x/zH/Mv8z/zL/Nf82/zb/Nv82/zj/OP84/zj/Of85/zf/N/84/zn/Of84/zj/OP83/zf/N/83/zb/Nf82/zX/Nf82/zb/OP86/z3/Qf9E/0j/Sf9M/1H/V/9f/2X/bf90/3f/df9z/3P/c/9y/3T/dP92/3b/dP9w/2j/Wf9K/z7/OP81/zn/PP9B/0T/Sf9O/1L/Vv9Z/1z/X/9k/2j/bP91/3z/gv+I/4b/gv93/27/a/95/37/fP9w/3v/gv99/3X/av9Y/0n/Ov8z/zP/N/89/0X/T/9e/0v/SP9h/3L/c/9y/27/Zv9a/0v/Pv81/y7/LP8s/yv/LP8s/yz/LP8s/yz/LP8s/yz/Lf80/0b/U/9r/2v/df90/2X/Yv9g/2H/Wv9O/0L/U/9m/2v/ev+B/33/e/96/3n/ef95/3n/ef94/3j/c/9t/2b/XP9Q/0T/Q/9B/0P/R/9K/07/Uv9a/2H/av9y/3z/hP+J/4v/jP+J/4j/f/91/2n/Y/9f/1z/Wv9V/1L/U/9U/1j/YP9m/27/d/9//4P/g/+B/3//fv98/33/e/97/33/fv9+/37/fv9+/3z/ef92/3X/cf9r/2L/Vv9J/z3/Nv8z/y//Lv8t/y3/Lf8s/yz/LP8r/yv/K/8v/zT/PP9D/03/V/9f/2f/av9t/27/bP9r/2z/bP9s/2n/Zf9i/13/V/9P/0T/Of8x/yz/K/8r/yv/L/81/z//R/9N/1X/XP9k/2n/b/90/3j/ff9+/4H/hP+G/4b/hf+D/4P/hP+G/4f/iv+M/4z/jP+J/4n/iP+H/4f/iP+I/4j/g/98/3b/bP9h/1X/Uf9T/1r/YP9n/2//dv97/37/fv99/3z/e/99/33/fP97/3X/cP9p/2H/VP9J/z3/N/82/zb/Of8//0r/XP9q/3X/gf+J/4r/iv+K/4v/i/+M/4z/jP+M/4z/jP+L/4b/gf95/27/ZP9b/1v/Xv9j/2n/cf92/3f/c/9y/3H/cf9y/3L/cv9y/3P/c/9y/2//a/9q/2j/Zv9i/13/XP9d/17/Xv86gzppOoM6ajuCO2o7gjtsOoI5bDmCOG03gjdvOIE3cDiAOHE3gDdxOIA4cTeAN3I4gDdyN383czZ/NnQ0fjN0M38zdTN/M3UyfzJ4Mn8yeDF+MXkxfjF7MX4xezB+MHoxfjF6MH4wejB+L3svfi97Ln0sfC59LnwsfSx7LHsseyp8KXwpfCl8KX0nfCZ9JnwnfSd8Jn0mfCV9JXwkfSR8JX0leyR9JHskfSR5JH0keyR8JHkjfCN5I3wjeiN8I3ojfCN6I3wkeiR9JHolfSV6Jn0meiV9JXomfCZ5J3wleSh9KncnfSd3JX0keCJ9IngifSJ4In0ieSJ+InsifiJ7In4ifCN+I3whfiF9In4ifSJ/InwgfyB8IH8gfCB/IHohfiF6IX4ieySBJ3orgjR0PoVRbWKGb2R5h4BgfIVzY2eBV2pCfS10KX4xejt/P35BfzeALH8qgCp+LIItfzGCNoA5fz2DQ3dKhlFzVodYbV6IYmdmiGVjZ4dnY2qHaGJphWlkaIJmZ2F+XWlWek9xTHhEdTx3OX03dzd/NXY0gDV2NIE1djWCNnc2gzR3NIM0eDSDNHgzgzJ4MoQxeDGEMHowhC96L4Quei6DLnstgy16LYMtei2DLXstgy57LoMvezCDMXsxgzF7MYMyezODM3o0gzV6NoQ2ejaFN3o3hjZ5NoU4eTiGOXg5hzh4OYc4eTiHN3k3hzZ5Noc2eTaHNXk2hjZ5NoY2ezeFNn06gj2AQH9DgUV6SYFKd02CUXRXglxwZYJtbnOBdm53gXVrc4FwaXOCc2hzgnNpdYJ1aXGBamxfgVBwQ4E8cjyDPnFBhEVsSoVOZ1KGWGRbhV5iYYVlYWeDa2BwhHZjeoGAaYaBhW94gHdxdYBqcmaBcXZmf1t7aH5ze3qAeXhvg153TYI9ejSBMn40fjmAQ35QfFt2UHhPdV9ycXtzbXKBa25lglpxS4E+dzZ9L38seyqDK3orhSt6K4YreiuFLHoshS17LYQreiuEK3c4gll4coFsfWeBZH1we2R4V3VWdFRyU3VdcWh7dXN7fn90fX97cHuAemx5gHpqeYF4a3iBeGp2gm9raYJfbVWETXBKg0pzTIRNdVCDVHRZgmFwaIJvcHZ/fnSGfYp5i3yKe4d8gnp6fXJ1ZX9dclqCVnFSf010SnxNdE98U3Vde2Z2cnt8dYB/g3CBf39uf4B+bXyAfG58f31ufn9+b35+fnF9f35xe394c3iAdXFwgWlxYoJUckmCPnU1gDJ5Ln0tfS17LX8teyx/K3srfyt7K34qejB7NXk+eEd5T3VZe2FvaH1ram5/bGVtgGtka4BrY2yAamVngGNpWoBVbUyAQnE4gC91K30reit8MHo0ez14R3xOclZ9XW9ifmlubn5zbnd9eXB8e39ygnqEdod6h3mFe4J4g3uEdoZ7iniLeox6i3qLeop7iXmHe4Z5h3qIeIh8h3iDfnx4dYBscmGAVmxSf1VqXHxibWl8cXB4fHxyfnx+dH59fnd9fX53fn59dXh+dXZtf2V3Xn9SdUV+OnI2ezZzNHc4d0FzTXlccmx9eXWCe4p5i3eLfYt1in2KdYt+jHaMfox4jX6LeYh/g3p+f3Z5bH1gdVl4WXVedGV4bHRzeXZ3d3R1fHNucX9ya3GAcWtygHJrcoBya3KAb2tsgWhrZ39jbGB7XGxceF5uYHdibTv/O/86/zr/O/87/zv/O/86/zn/OP83/zf/N/84/zf/OP84/zf/N/83/zf/N/83/zj/N/83/zf/Nf80/zP/M/8x/zH/Mf8x/zH/Mf8x/zH/MP8w/zD/MP8w/zD/Mf8x/zD/MP8u/y3/L/8v/y//L/8t/y3/Lv8r/yz/LP8s/yz/Kf8o/yn/J/8n/yf/Jv8m/yb/Jv8m/yb/Jf8l/yT/JP8k/yT/JP8k/yT/JP8k/yT/JP8k/yP/I/8j/yP/I/8j/yP/I/8j/yP/JP8k/yX/Jf8l/yX/JP8k/yX/Jf8k/yP/I/8l/yb/Jf8k/yP/Iv8i/yL/Iv8i/yL/Iv8i/yL/Iv8i/yL/Iv8i/yH/If8g/yD/If8h/yD/IP8g/yD/IP8g/yD/IP8h/yL/I/8k/yn/L/85/0v/Xf9s/3f/f/9+/3T/a/9c/0r/M/8p/yz/NP88/z//NP8p/yn/Kv8s/y//M/84/zz/Q/9H/07/U/9Y/1z/Yf9k/2b/Z/9o/2j/aP9q/2n/Z/9k/2H/W/9W/0//SP9E/z7/Of81/zX/Nv81/zX/Nf80/zX/Nf80/zT/NP80/zT/NP80/zP/Mv8y/zH/Mf8w/zD/L/8v/y7/Lf8u/y3/Lf8t/y3/Lf8t/y3/Lv8u/y//MP8x/zH/Mf8x/zL/M/8z/zT/NP81/zb/Nv83/zf/Nv82/zf/N/84/zj/N/83/zj/OP83/zf/Nv82/zb/Nv82/zX/Nf82/zj/OP86/z3/QP9C/0X/Rf9J/0z/Tf9R/1b/Wv9k/2z/c/93/3f/dv90/3L/cv9y/3L/dP9z/3P/cf9s/2L/V/9O/0X/Qv9E/0r/Tf9R/1X/W/9f/2T/Zv9p/2v/cP9z/3b/ev99/4D/g/+C/3b/df90/3z/ZP9Q/0T/P/9A/0T/Xv9e/1j/b/9o/0r/OP8w/zT/Of8//0v/Wv9O/03/Xv9s/3L/cv9t/2X/Wv9L/z7/Nv8v/yz/Kv8r/yv/K/8r/yv/K/8s/yz/LP8s/yz/LP8r/zX/Tf9d/2P/aP9r/2P/RP9I/03/TP9T/2D/af9y/3v/f/99/3v/ef95/3f/eP95/3n/ef94/3X/cf9r/2P/XP9Y/1L/Uf9Q/1T/Vv9b/2D/Zv9u/3X/fP+C/4j/i/+L/4r/hv+B/3j/bf9j/1n/U/9M/0j/RP9C/0X/Tf9V/17/af92/33/gv+D/4H/f/9//37/fP98/33/ff9//3//fv9+/33/fP97/3j/d/90/3D/af9i/1T/Sf8+/zX/Mv8t/y3/Lf8t/yz/LP8r/yv/K/8r/yz/Mf85/0D/SP9Q/1v/Yv9o/2z/bf9r/2z/bP9r/2v/a/9p/2X/Yf9Y/1P/Sv9A/zX/L/8q/yv/Lf8z/zv/Rf9Q/1X/Xf9j/2n/b/9y/3f/ev98/3z/f/+C/4T/hv+G/4X/gv+D/4T/hv+K/4v/jP+L/4v/if+I/4f/hv+H/4j/iP+H/4P/fP91/2n/Xv9X/1X/WP9f/2b/bf90/3n/ff9+/37/fP99/33/ff98/3z/eP91/2v/Zv9c/1D/Qv84/zT/NP81/zn/RP9Q/1//b/97/4X/iv+L/4v/i/+L/4v/i/+L/4z/jP+M/4r/iP+D/33/df9o/17/Wf9Z/17/Zf9s/3P/d/93/3X/c/9y/3L/cf9x/3P/c/9z/3P/cv9v/2z/aP9l/2L/Xv9e/17/X/9i/2T/PIM7aTuDO2o6gjpsOoI6bTmCOGw5gjhtOIE2bzeBN3A4gDhwN4A3cDaANnE3gDdzNn81dDZ/NnU0fzJ2MX4xdjF/MXYxfzF3MH8weDB/MHgvfjF5MX4xezB+MHsvfi97L34vfDB+MHwvfi58LX4tfCx9LHwtfSx8LH0rfCx7LHwpfCl8KHwnfCZ9JnwlfSV8Jn0mfCV9JXwlfSV7JX0keyJ9I3kjfSN5I30jeSN9I3ojfCN5JHwkeSJ8InkifCJ5I3wjeSN8I3kjfSN6JH0keiR9JHokfSR6JH0keSR9InkifSJ5JH0keSR9I3kifSJ5In0ieSJ9InsifiJ7In4ieyJ+InwifiJ8IX4hfCB+IHwgfyB7IH8geyB/IHwgfx96H34geiF+InsjgCN6J4EtdzWDQ3FWhWhrc4Z9Yn+Ge2FygmFlUn8+bi59K3cvfTd9NX0vgCp9K4Asfi6BMH81gTuCPnxEhUpzUIZXbVyHYGdjiGZhaYhpYGqGamFqg2ljZYBjZV99WmlUek9vR3dCdzx4N3w2eDV/NHY1gTZ2NYA0djSBNXY1gjR3NIM0dzWDNHg0gzN4MoMyeTKEMXkxhDB6L4Quei6ELXstgy17LIMtey2DLHssgy17LYMuey6DLnswgzF7MYMxezGDMnszgzN6M4M1ejWENXo1hDZ6NoU3eTeGN3k3hjh5OIc4eTmHOHk4hzZ5Noc2eTaHNnk2hzZ6NYU2ezeEOX08gz1/QIFDgEV8RoFJeEyCS3NNgk9xVIJZcGOCbG50gXZvd4F2bHSBcmhygnJncoJyaXKCc2lxgW9qaIJebFSETGtIhkpqT4VTZ1mGXmRihmhha4VuX3ODdGN2gnlleoF9aYCAgW2DgIBxbX5ZdVp9cXpof1V9W4FifmmBXoBQgXh9VoFmfGCBX4FUgDyCOoE/f1mAbntiekt3R3ZOc196cHByf2xuZYJackuBPng1fS5/LXsrgyx6LIUseiyGLHoshSx6LIUsfCuCK4AsfzKCO3xQg1Z8V4FifWZ+UXhPeV1ySXNFcUx1VnVle3F3en5+dn5/fHB4gHdseIB5anqBe2t7gXtqeYJ2aXCCaGljhF5sW4VZcFeEWnFehGNwZ4RtbXKDeWx/gYdxiX6Ldot8iXqDfH97dn5rdl9/UXNMfkR2PXw4dzt6QHpNe1l4ZXxxdnt+f3KEf4RwgX9/bn+Afm5+gH1wf3+Acn9/f3J+fn1yfH97cnp/eHJ1gHVzcIFpcmKCVHRJgj12M4AweS19LXwseyx+K3srfyp7Kn8reyt+LXozezp5QndKeVRyXHxkbmh9a2lqf2xlaoBqZWuAamZpgGdpY4Bfa1iAT25GgDxyM38teCl9LXoyfDt5RntPdlZ8XXFkfWpvcH5ybnZ+em57fX1wfnuCdYR4hniGeoR6hHqCd4N7hHiGe4l6i3qLe4t6i3uJe4h5h3uHeYd6iHmJfId5g359eHaAbXJigFdrU39abGF8aW5wfHhwe3x9cn58fnR+fX11fX59dnx+fXZ3f3V3aYBjd1eASnU/fjZ0MnsydjJ3OXlEc1R8YnJwfX13hnuKeot3i36JdYt9jHeLfot4i36LeIp+h3mGf4F5en9xd2h9XXVXeFh3X3Rme210dHl2eHRydXx0bXF/cmtzgHJqc4BzanSAc2pxgG5ra4Fma2OAYWtffGBsX3phamR4Zmo8/zv/O/87/zr/Ov86/zr/Of84/zj/OP83/zf/N/82/zj/OP83/zf/Nv82/zb/Nv81/zX/NP80/zP/Mf8x/zH/Mf8x/zH/Mf8w/zD/MP8w/zD/MP8w/zD/L/8v/zD/L/8v/y//MP8v/y7/Lf8t/y3/LP8s/yz/K/8r/yr/Kf8p/yn/Kf8o/yf/J/8l/yX/Jf8m/yb/Jf8l/yX/Jf8l/yT/Iv8j/yP/I/8j/yP/I/8i/yP/I/8k/yT/Iv8i/yL/Iv8j/yP/I/8j/yP/I/8k/yT/JP8k/yT/JP8k/yT/Iv8k/yP/Iv8k/yT/I/8j/yP/Iv8i/yL/Iv8i/yL/Iv8i/yL/Iv8i/yL/Iv8h/yH/IP8g/yD/IP8g/yD/IP8g/yD/H/8f/yH/If8i/yP/I/8l/yn/NP9A/07/YP9t/3r/f/99/3X/Zv9Z/0n/Nf8s/yv/Lf8s/yv/Kv8r/y3/MP80/zf/Pv9D/0f/Tv9V/1r/Xv9i/2T/Z/9p/2n/av9q/2r/Zv9h/1z/Vv9R/0r/RP9A/zv/N/82/zb/Nf82/zb/M/8z/zT/NP81/zX/NP80/zT/Nf80/zT/Mv8y/zL/Mv8x/zH/MP8v/y7/Lv8t/y3/Lf8s/y3/Lf8s/yz/Lf8t/y7/Lv8v/zD/Mf8x/zH/Mf8y/zP/M/8z/zX/Nf80/zX/Nv83/zb/Nv83/zf/OP84/zf/OP84/zf/Nv82/zb/Nv82/zb/Nv83/zj/Of89/z3/P/9C/0X/SP9J/0v/TP9N/0//UP9T/1v/Yv9r/3D/df96/3n/df9z/3H/cf9x/3H/c/91/3T/c/9u/2X/W/9U/1D/Uf9V/1r/X/9l/2r/cf91/3j/f/9//3//gP+B/4P/h/+G/4T/f/92/1j/QP9Q/1r/Uv9Q/0D/WP9g/17/ZP9s/07/Sv9B/0D/R/9L/2j/mP+T/3L/Sf9D/0z/Y/9z/3H/a/9m/1v/S/8+/zX/Lv8t/yv/LP8s/yz/LP8s/yz/LP8s/y3/L/9I/27/ff+E/4b/hP90/2P/Zv9q/1b/W/9K/07/XP9Y/2X/cf96/3z/ff97/3j/d/96/3r/ef97/3v/e/96/3j/dv9v/2f/Yf9f/13/W/9f/2P/aP9t/3P/eP99/4T/h/+K/4v/iv+H/4P/fP91/2n/Wv9M/0D/N/8z/zP/Of9D/1D/XP9o/3b/ff+D/4b/hP+B/3//f/9+/37/f/+A/4D/f/9//37/ff96/3n/eP94/3f/c/9w/2n/Yv9U/0n/Pf8z/zD/Lf8t/yz/LP8r/yv/Kv8q/yv/K/8t/zP/Of9D/0v/VP9c/2T/av9r/2v/av9q/2r/af9o/2j/Zf9h/1v/Vv9N/0L/OP8x/yz/K/8w/zf/Qv9L/1P/Xf9m/2r/b/90/3n/ff9+/33/ff9+/4H/hP+G/4f/hf+E/4L/g/+F/4b/if+L/4v/i/+L/4j/hv+G/4b/h/+I/4n/h/+D/33/dv9q/1//WP9X/13/Zf9t/3H/ef97/33/f/9//3//fv9+/37/fP99/3j/cv9o/17/Vf9I/zv/M/8x/zL/Mv87/0b/WP9n/3P/gP+J/4r/i/+M/4v/i/+M/4v/i/+L/4n/iP+G/4P/fP90/2v/Y/9b/1f/WP9f/2b/bf90/3b/df9y/3H/cf9x/3L/cv9x/3L/cv9x/3D/bf9q/2X/Y/9h/2D/Yf9h/2T/Zf9m/zuEO2o7hDprOoI6bDmBOW05gThuN4E3bzeBN3A2gTZwNYE1cDaANnE1fzVyNX82dDR+MnYyfjJ2Mn4xdjB+MHYxfzF3MH8weC9/L3kvfy95Ln4uei1+LXwtfi18LX4vfC99LnwufS58LX4tfCt+K3wrfSt8K3wpfCl8KXwqfCl8KH0ofCd9JnwmfSZ8Jn0lfCV9JXwkfSR7JH0keiR9JHokfSR4JH0keCR8I3cjfCN3I3wjeCN8I3kjfSN5I30jeSR9JHkifSJ5I30jeiN9I3okfSR6In0ieiN+I3kifiJ5I30jeSN9I3kjfiN6I34jeiJ/InsifyJ8In8ifCJ/InwhfiF7IX4hfCB+IHsgfiB7H38geyB/IHsffx97H30geyF+IXsifiJ7In4ieyR+KHougDh0R4JXb2eFc2h6h3xleIVuZWGCUms+fi10Kn4oeih+Kn4qfiyALX8wfzWAOH4+gkV5TIRSc1mGXGpghmNlZIZoYGmGamBphGhfZIFfY1l8VGpOeUhxQng+djl3N302dzOAM3c1gDR3NIA0dzSBNXc1gjV3NYMzdzODNHc0gzN4M4MyeDKDMXkxhDB5MIQwei+ELnouhC57LoMseyyDLXstgy57LYItey2CLnsugi97MIIwezGCMnswgzJ7M4M0ejSENXo1hDV6NYQ1ejWENXo1hTZ6NoU2ejaFOHo4hTd5NoY2eTaGNHo0hjd6NoU3fDmEOn88gj6AQYBCgUZ8SIJKdEqCTHFOgkxwToJRcFGBWW9igWhucIF0bXqBe2t2gHRocYFxZ3CCcGhygnRodoN2aXGDa2lkhF1lWIZXYVuGXWRkhmpjcYV3ZHyEg2OHgYdqh4GHbIiAiG6If4pwi4CMdH5/anhWflF9Wn9WeVqCXHdjgmZ8aYFif1yBRYFEgEyGUX9EikB8TItoe3eJbXlZgEd7Wnh3f3Nxb4FscGWBW3NLgD15Nn0vfy18LYMseyyFLHoshSx6LIUreiuFLXgvhFt4foOAd3aDeHd9g3h7aX5pend5a3ZSc0lyVnJfdlh3ZHtxe3x/fnl+gHxxeYB4a3eAd2p5gHtqe4B8a3uAemp3gm9raoVlbmKFYG5ihGRtaYRtbHKEeWl9goFshoCIcol/i3WJfYV7gn17e3GAZXlWgEZ3O380eDB9NHs9e0h8VXtheG18eHiBf4VzhYCEcIGAf29/gH9wf4B/cYB/gHJ/f39yfYB8cnuAeHB4gHdyd4F2dHKBa3RiglZ1SoI9dzOALnksfix8LXwtfi19LH8sfSt+Knsqey95M3k6eUR3TnpYcWF7ZWxpfmloaX9pZGl/aWRqgGlmZYBiZ1yAV2pRgEhuPoA1ci5+LXYvezV2PntIdFR9XHFkfWtxb352cXt+fnB/fn1wfH19cn57gXWEeIR6hnmGeoR6gniEe4J3hXuIeYt6jHuLeop6iHuHeYd7h3mHeoh5iXyIeoV+fnp1gGpzXoFablx/YG5oe29xc3t5cnt8fXN+fX51f31/dX98f3Z+fnx1eH5wdmiBXHZTgUV0OIAwcy19LHYwdzx5SnNce2l0d32EeIh6inyLd4t9ineKfot5i3yKeYp8iniKfIZ6gH95eXV/bXhifFh1VHdXdmF1aHpvdHN7dnl1c3J+cG1yf3Jqc39yaXGAdGlzgHJpb4BsammAZWpjf2NqY39kamR+ZWhmfmhqPP88/zv/Ov86/zr/Of85/zj/OP83/zf/N/83/zb/Nv81/zX/Nv82/zX/Nf81/zT/Mv8y/zL/Mv8x/zD/MP8v/y//L/8x/zD/L/8v/y//L/8u/y7/Lf8t/y3/Lf8v/y7/L/8u/y3/Lf8t/y3/K/8r/yv/K/8q/yv/Kf8p/yn/Kf8o/yj/J/8m/yb/Jv8m/yX/Jf8l/yT/JP8k/yT/JP8k/yT/JP8k/yT/I/8j/yP/I/8j/yP/I/8j/yP/I/8j/yP/JP8k/yL/Iv8j/yP/I/8j/yT/JP8i/yL/I/8j/yL/Iv8j/yP/Iv8i/yL/Iv8i/yL/If8h/yH/If8h/yH/If8h/yH/If8h/yH/IP8g/yD/IP8f/yD/IP8g/x//H/8f/yD/If8h/yH/Iv8i/yL/I/8m/yr/M/8//1D/X/9t/3b/fP96/3P/av9b/03/Nv8s/yv/Kv8r/yz/L/8w/zT/Nv87/0H/SP9N/1T/Wf9d/2H/ZP9n/2r/bf9r/2r/ZP9e/1r/Uv9K/0X/Qf8+/zn/Nf81/zT/NP81/zT/NP80/zT/NP81/zX/Nf81/zP/M/80/zT/M/8z/zL/Mv8x/zH/MP8w/zD/L/8u/y7/Lf8t/yz/Lf8t/y3/Lv8u/y3/Lf8u/zD/L/8w/zD/Mf8y/zD/Mv8z/zP/M/81/zX/Nf81/zX/Nf81/zX/Nv82/zb/Nv83/zf/N/81/zb/Nf82/zb/N/85/zv/Pf8+/0D/Qf9C/0X/R/9J/0v/TP9N/03/Tf9P/1D/U/9W/17/Z/9u/3X/ev96/3j/df9z/3H/c/9z/3P/df93/3f/dP9w/2r/ZP9f/17/YP9k/2n/b/91/37/g/+J/43/jf+N/43/jf+N/4//kP+P/5H/jP9w/1b/Sf9J/1f/X/9t/3L/a/9s/27/Wf9H/1H/Q/9G/0f/Sf9J/0v/VP9i/17/T/9b/3T/bv9t/2n/Y/9b/0z/Pv82/y//LP8s/yz/LP8s/yz/LP8s/yv/K/8r/yz/Lv8+/1n/aP9w/2v/Zv9k/1//bv9r/1D/T/9e/17/VP9k/3D/ef9+/37/fP95/3j/eP94/3r/ev97/3z/e/95/3b/b/9q/2X/Y/9j/2b/af9t/3H/dv96/33/gf+F/4f/iP+J/4n/hf+C/3v/cf9l/1T/RP84/zL/Mf84/0L/Tf9b/2b/cv99/4T/hP+E/4L/gf9//3//f/9//3//gP+A/3//f/99/3z/e/94/3j/d/93/3b/cf9s/2L/Vv9J/zz/M/8u/yz/LP8t/y3/Lf8s/yz/K/8q/yr/Lv81/zz/R/9O/1j/Yf9m/2n/af9p/2n/af9p/2n/aP9l/2D/XP9Y/0//Rf85/zL/L/8w/zT/PP9E/0//Wf9i/2n/bv9z/3n/fv+A/37/ff98/33/fv+B/4T/hP+G/4b/hP+C/4P/hP+F/4j/iv+M/4v/iv+I/4f/h/+H/4f/iP+J/4j/hP9+/3X/a/9h/1z/X/9j/2n/cP92/3r/e/99/37/f/9//3//f/9//3//fP91/3D/aP9c/0//QP81/y7/K/8r/zP/Pv9P/1//bP95/4T/if+K/4v/iv+K/4r/i/+L/4r/iv+K/4j/hf+A/3n/cv9r/17/Vv9T/1j/Yf9p/3D/df92/3P/cv9x/3L/cv9y/3L/c/9z/3P/c/9v/2z/af9l/2T/ZP9l/2b/Zv9n/2j/Z/86gzpqO4M7azuCO2w5gTltOIE3bjeBN282gTZwNoE1cDaANnA1gDVxNH80czR/MnQwfzB2MX8xdjF/MXYxfzB2L38wdy5/L3gufy55L38veS5+Lnotfi18LX4tfC1+LXwtfS18LH0sfCx+LH0sfit9Kn0qfCh8KnwpfCd8JnwmfCh9KHwofSd8JX0lfCZ9JXwmfSZ7JX0leyR9JHojfSN5JH0keCR9JHgkfSR5JH0keSN9I3gjfSN5In0ieSJ9I3kjfSN5In0ieSN9I3oifSJ6In0ieiJ9InojfiN6I34ieiJ9InkhfSF5IX4heiF+IXohfSF5IX0heiF+IXohfiF6IX4heyF+IXwgfiB7IH4geyB/IXsgfx97H38fex99H3sgfiB7IX4heyB+IXsjfiR6J38udziBR3JXg2ZtcIV6Z3yGd2Nvg2NmVIBDbjJ/LHUtgC15MIExezOBNns6gkB6RYRLd1KFVXFZhl1oYYZlY2mFamBqg2phaH9hY1l8U2lMekdxQng9eDp3Nns3djR+NHc0gDV3NYA1dzWANHc0gTR3NYE1dzWCNHczgzN3M4MzeDODM3gygzF5MYQweTCEL3ovhC56LoQtey2DLHssgy17LYMtey2CLnsugi97L4Iuey+CMXsxgjF7MYMxezGDMXoyhDR6NIQ1ejWENXo1hDV6NYU0ejSFNXo1hTV6NYU1ejSFNHs1hDV8NoQ4fjyCPH8+f0CAQX1CgkZ7SYJJdkqCTHRNgk1xToJPcE6CT3BTglhuW4FjbmuBcnB3gHhxeIB0bHOBcmhygnFnc4J2Z3iDeGh4g3Vob4NqZmaEZGJlhWhjbIZxYneFgGKHg4pkkICQapKAkW6SgJJykX+UdJSAlXaTgIp2XoE7eUKDWHZdgldxZ4Jhc2eBfXRwg1Z0ZINceEuCRH9DgUeGT4BVhlt/VoJPfVV9aX5qem6AbHdjgVp4TIA+fDd9MH8sfCyDLHsshSx6LIUreiuFLHoshSx7LIQ2e1OES31OglZ9V4Jhe1CBSXhXfVF0TnlYdFJ3W3ZYd2V7cHt6fX14fX57cniAd2t4gHlqeoB6aXuAfGl7gHtoeIJzamqEZmtjhGZrZoNqam+DdGl3g3pqfYF/bYKAhHOHf4l3h32FeIB9enhxgGR5U4BDdzd/Mng1fTx7RXtSfF17anh2fH92gn+EcoKAgW6AgIBuf4B/cH+Af3GAf4Bzf39/c32AfHJ5gHZwdoB4cniBdnRxgWx0ZIJXdUmCO3cygC15K30rfCx7LH4uey1+K3srfSl7LH0vejZ6PXlHdFJ6XHBie2ZraH5pZmh/aGVpf2llaYBnZ2WAYGlagFRrTYBDbziAMXMyfjd1O31Eckt9VnFefmVwa35ycHZ+fG9+fn9vfn59b3t9fXN/e4F4hHiFfYZ5hXyCeoJ5hHuFeYZ7iXqLeot7inqJeoh7h3mHe4d5iHqJeol8iHyFfn54dYBrcmB/WW1ffWRua3txcnd7fHR+fH11fn1+dn9+f3Z/fH92f357d3d+b3dkgVl2TIE9dDSALXUrfSx4NXdAe1J0YX1wdH99h3iKeot8ineKfYp3in6KeYp8iXmJfIl6h3yFe4F/eXtwf2h5WnxWdlN3V3lhdWl8b3VyenR5c3Jvfm9tcX9xa3GAcmhygHJpc4ByaW2Aa2pogGVqZn9maWd/aWtpf2hqZ39lazr/Ov87/zv/O/87/zn/Of84/zf/N/83/zb/Nv82/zX/Nf81/zL/Mv8x/zH/Mv8x/zD/L/8x/zL/Mf8y/zL/Mf8y/zL/Mf8v/y7/Lv8v/y//Lv8u/y3/Lf8t/y3/Lf8t/yv/K/8p/yn/K/8r/yv/Kf8q/yr/Kv8p/yj/Kf8o/yj/J/8n/yf/Jv8l/yX/Jf8k/yb/Jv8l/yX/JP8k/yP/I/8k/yT/I/8j/yP/I/8k/yT/I/8j/yP/I/8i/yL/Iv8j/yP/I/8i/yL/I/8j/yL/Iv8i/yL/Iv8i/yL/Iv8i/yL/Iv8i/yH/If8h/yH/If8h/yH/If8h/yH/If8h/yH/If8h/yH/If8h/yD/IP8g/yD/IP8h/yD/H/8f/x//H/8f/yD/IP8h/yH/IP8h/yL/I/8l/yr/Mv8//0//YP9q/3T/ff99/3f/bP9c/0//QP8y/zL/Mv81/zb/OP86/z//Q/9H/03/Uf9X/1v/X/9i/2b/aP9p/2r/Z/9i/1v/VP9N/0b/Qf89/zr/N/82/zX/NP80/zT/NP80/zT/NP80/zT/NP80/zT/NP81/zT/M/8z/zP/M/8z/zL/Mf8x/zD/MP8v/y7/Lv8u/y3/Lf8u/y7/Lf8t/y3/Lf8u/y7/L/8v/y7/L/8x/zH/Mf8x/zH/Mf8z/zP/NP80/zT/NP81/zX/Nf81/zT/NP81/zX/Nf81/zT/Nf81/zb/OP86/zz/Pf9A/0L/Q/9E/0b/SP9K/0r/S/9M/07/Tv9P/0//Tv9P/1P/VP9Z/17/aP9u/3X/eP93/3X/c/9y/3L/cf9z/3b/ev96/3r/d/91/2//av9m/2n/av9t/3T/e/+B/4j/jv+Q/5H/kf+T/5X/lf+W/5f/l/+W/5X/kf91/17/Vv9Z/1D/M/9d/3P/f/+C/3z/d/9q/1z/VP9X/1L/U/9N/03/Wf9X/1H/Tv9V/17/Zv9k/2D/Wf9N/0H/N/8u/yz/LP8s/yz/LP8s/yv/K/8r/yv/Kv8s/zL/Qf9d/2H/UP9a/1v/Uf9d/1T/Ov9C/0X/Sv9U/17/Zf9x/3r/ff98/3v/eP93/3j/ef95/3n/e/98/3v/e/92/2//av9m/2X/aP9o/2z/cP91/3X/eP97/3z/f/+C/4X/h/+H/4X/gP96/3H/ZP9T/0P/OP8z/zf/Pv9J/1b/Yf9v/3n/gf+D/4X/gv+A/3//f/+A/4D/gP+A/4D/f/9+/37/ff98/3n/dv92/3j/eP92/3H/bP9k/1f/Sf87/zL/Lf8r/yv/LP8s/y3/LP8r/yv/K/8t/zL/Of9B/0r/VP9c/2L/Zv9o/2n/aP9o/2n/af9p/2f/ZP9f/1n/Uf9K/0D/N/8y/zX/Pf9C/0r/U/9c/2L/aP9u/3P/d/97/3z/ff97/3r/ev97/3//gf+F/4b/hv+F/4P/g/+E/4X/hv+J/4v/i/+K/4n/iP+H/4f/h/+J/4r/i/+K/4X/fv90/2n/Yf9e/2D/aP9s/3P/ef98/37/ff9+/37/f/9//3//f/9//3v/d/9v/2T/Wf9K/zv/NP8t/yz/L/82/0P/WP9k/3T/gP+I/4v/i/+K/4r/iv+K/4r/iv+J/4j/hv+H/4X/gP94/23/Zf9Z/1X/Uv9Y/2H/av9w/3T/cv9y/3H/cP9x/3H/c/90/3P/c/9y/3D/bf9r/2r/af9q/2r/aP9o/2j/Zv9k/17/PII8ajuCO2s6gjptOYA5bjiAN242gDZvNoA2cDWANXAzfzNxM38zczF+MHQxfzF1MIAydjGBMXU0gjZ1NoI3czSBM3QxfzB1L38vdi5/Lnktfy17LH8seyx/K3ssfyx9LH4seyt+K3wqfSp9K30rfil9KX0pfSd9KHwofCl8KXwmfiZ8JX4lfCV+JXslfiN7JX4leyV+JXojfiN6I34jeSN9I3gjfSN4I34jeSN+I3kjfSN5I30jeSJ9InkifSJ5JH0keSJ9InkifSJ5In0ieSJ9IngjfSN5I34jeiJ+InohfSF6IX0heiF9IXohfSF6IX4heiF+IXsgfiB7IH4geyF+IXsgfiB7IH4gex9+H3sffyF7IH8gex9/H3sffx97IX8geyB/InshfyF7In8ieyN/JnksgTl0RYNVcWOFbmp4hn1leoZyYmWEWWZLgjtsNoM2cTmEO3Q+hD51Q4VIdEyGUnFUhVhtXYdhaGSHZmVohGljZ4FjY118VWlQeUpvQng9djh1N3s2djZ/NnY1gTR2M4A0djSANHc0gTV3NYE0dzSCNXc1gjR3NIMzdzODM3gzgjN4MoIxeTGDL3kvgy56LoUuei6FLnsugy17LYMtfC2DLXwtgy17LoIuey6CLnsvgjF7MYIwezCDMXsygzR7M4QzezOENHs0hDV7NYQ1ejWENHo1hDV6NYU0fDSFM3w2hTh+OII6gDx/PoFAfUKBRHpFgUd3R4NJdUqDS3NMg01xToNOcU+CT3BOglBwT4JRblOBWW5if2pwcX95cXZ/dHB0gHNncoFxZXOCdmV5g3xmfYN5Z3eDcmZthGlkaoRpY26EdWN6g39ihYGLZI6AkGiRgJJsmH+ZcJh+mHOZgJp3mICTd42BiHGEgn9pa4RTanmCgWyAgYFtf4F5cG+CYnJdgUx2RYFWe16BWYFVgVGDT4BNg09/UINSf1mAYYBcfVGBQ3w3fzF/LX4tgix8LIQseyyFLHsrhix7LIYteiqFLXk1glp8Z35XfVR/YXxWgWN4VH86dkd7THVTeVh4Xnpoe3V8fH59d31/enF6gHltd4B3a3iAemp7gHtre4B4a3OAbGtngmNtY4Jja2aCaW1sgm9rcoB1a3mAeW99gH91gX6FeIV9g3qAfHp4cn9keFR/RXc6fzV5OHxBek57W3tne3J4e32BdoN+g3SCf4Bwf39/cH6Af3GAgIFygH9/c39/fnN7f3pyeYB2cnaAd3J4gHd0c4JsdGODVnVIgzt4MoEteit9K30rfCt+KnsqfSp7Knwrei56NHo7eEZ5TnNWelxuY31ma2d+aGhngGdnaIBoaGiAaGtkgF9tV4BPbUeAPG81fzlwPH5CcEh+UHBYfl9wZH9pcG5/cnB2f3lweX93b3Z+eG95fXp0f3mBeoR4hX+GeIV+hHmDe4N7hXqIe4t6jHuMe4p7inuJeoh6iXqJeop8inuLfIp7hH99eHWBanBigGFsYn5qb3B7dXR6e311fXx9dX5+fnaAfoB3gH1/d399e3d2f253ZIJXdkeCOnUzgSx2KnwweTt3SHxadGp+eHaCgIh6i3qLfIp3i36LeIp9iniJfYh5h32EfId9hHx/fnZ9bH9ielV8UXZSd1l8YXRqfHF2dnh1e3Jxc39xbHCAcGpxf3Jqc4Bza3GAb2ptgGxnbIBrZmx/amlqgGhrZIFkaWF/Wmw8/zv/Ov86/zr/Ov86/zj/OP83/zb/Nv81/zX/Nv80/zP/M/8y/zH/L/8v/zD/MP8x/y//Mf80/zX/OP87/zz/Ov84/zX/M/8x/zH/MP8w/y7/Lv8u/y7/Lf8r/y3/Lf8s/yz/K/8r/yr/Kv8q/yr/Kf8p/yj/J/8n/yj/KP8o/yb/Jv8l/yX/Jf8l/yX/JP8l/yX/Jf8l/yT/JP8j/yP/I/8j/yT/JP8j/yP/I/8j/yP/I/8j/yP/Iv8i/yL/Iv8j/yP/Iv8i/yL/Iv8i/yL/Iv8i/yP/I/8j/yP/Iv8i/yH/If8h/yH/If8h/yH/If8g/yD/IP8g/yD/IP8g/yD/H/8f/yD/IP8f/x//H/8f/yD/IP8f/x//H/8f/x//H/8g/yH/If8h/yH/If8i/yL/Jf8l/yn/Mv88/0n/Wv9o/3L/e/99/3b/bf9j/1f/R/88/zv/Pf8//0L/RP9J/03/Uv9W/1j/Xf9e/2L/Zf9l/2j/aP9m/2D/Wf9T/0v/Rv89/zn/N/82/zX/Nf80/zb/Nv80/zT/NP80/zT/Nf81/zb/Nv81/zX/NP80/zP/M/8z/zP/M/8z/zH/Mf8w/y//L/8v/y7/Lv8u/y7/Lf8t/y3/Lf8t/y3/Lf8u/y7/Lv8u/y//Mf8x/zD/MP8x/zL/Mv80/zP/M/80/zT/NP80/zT/NP8z/zT/NP80/zX/Nf83/zj/O/88/zz/P/9B/0P/RP9G/0b/SP9J/0n/Sv9L/0z/Tf9O/07/T/9P/0//T/9Q/0//Uv9W/13/ZP9s/3X/eP92/3T/c/9y/3H/c/92/3f/ev99/3v/ef9z/27/av9q/23/cf9z/3b/e/+A/4X/iv+O/5H/kv+V/5f/mv+a/5r/mP+Y/5T/kf+I/4X/fP97/3z/f/+A/3//gf+A/3v/c/9n/1z/Tv9H/1b/W/9Y/1r/UP9M/0r/Tf9P/0z/TP9Z/17/Vv9I/z3/NP8u/yv/LP8s/yz/LP8s/yz/LP8s/yz/LP8t/zX/Rf9d/1z/R/9b/1b/V/9P/0b/V/9W/0f/Pv9Q/2T/bf94/37/ff96/3r/ef94/3f/ef96/3r/ev94/3X/b/9q/2T/Yv9i/2L/Yv9n/2v/a/9v/3P/df94/3r/ff9//4H/gv+C/3//ef9w/2X/VP9F/zn/Nv86/0P/UP9e/2r/dv9//4T/hf+D/4L/gP9//3//fv9//3//f/9//37/fv99/3v/ev95/3b/d/95/3j/d/9z/2z/Y/9W/0j/O/8x/yv/Kv8q/yr/Kv8q/yr/Kv8q/yr/MP82/z3/R/9P/1f/X/9m/2j/af9n/2f/Z/9o/2j/Z/9m/2L/Xf9X/0//R/8//zz/QP9E/0n/Uf9Y/1z/Yv9o/2z/bP9y/3X/dv92/3P/cv9z/3f/ev99/4L/hf+H/4b/g/+E/4T/hP+H/4j/i/+N/4z/i/+K/4r/iv+L/4v/jP+M/4v/iv+E/37/df9r/2D/YP9m/2z/cv94/3r/fP99/33/fv9+/3//f/+A/3//fv96/3P/a/9i/1P/RP84/zH/LP8r/zH/O/9N/1//bv97/4X/iv+L/4z/i/+L/4v/iv+K/4n/iP+I/4f/hv+B/3z/c/9p/17/U/9Q/1L/W/9i/2r/cv90/3T/cv9y/3L/cv9y/3L/c/90/3T/c/9x/2//bv9s/2z/bP9s/2r/aP9m/2D/W/9W/zuCO2k5gjlqOYI5ajmAOGs3gDZuNoA2bzWAM3A0gDNwMn8ycjF/L3Mvfi90LoAvdS+AMnQygTdzOIY8bz6GQmxChEBrPYM5bTWCNXA0gjJzMYIxdi+CLnYugC52LoAtdy1/LXkrfyt8Kn8pfSl/KX4pfSl+KH0ofid+J34ofid+Jn4mfCV+JXwlfiV7JH4keyV+JXslfiV6Jn4meSV+JXkkfiR7JX4leyR9JHkjfSN5I30jeSN9I3kjfSN5I30jeSJ9IngifSJ4In0idyJ9IncifSJ3In0ieCN+I3oifiJ6In0ieiF9IXohfSF6IX0heiB+IHogfiB7H34fex9+H3sffh97H34fex9+H3sffh97H38fex9/H3sffyB7IH8feyB/IHshfyF7IX8heyJ/InsjfyV8JoEqejOBQnVOg15taIZ0Zn2GemBzhWpjYoRVZkeFQWtChkNtSIdMbFCHVGtXiFpoXYZfZGKFZGJlhWZiZ4JlYmKAXGdXfk9tR3pCczt3OHw1dzR9NXY1fzV2NX82djaANXY1gDR3NIE1dzWBNnc2gjV3NYI1dzWDNHc0gzR4NIIyeDKCMHkwgzB5MIMwei+CLnougi17LYMtey2DLnwugi18LYItfC2BL3wvgS98MIExfDGBMH4xgjF+MoIxfjKDMn4ygzJ+MoMyfjKDNH4ygzN+NIMzfTWCNn83gjiAPH89gT58QYJCeUSCRXZFgkV0SINJc0iCSXNLg0xxTINNcE+DT3BNgk5wT4JOcE6BTXFPf1ByVX5ec2d+cnR2f3ZwdIBzanSAc2Z0gXRmd4F5Z3yBfWh6gXVnb4JsZWqDbGZsg21mcIJzYnqBf1+EgYpgjYGQZpSAlW2Wf5hzmn+ZdZd+lXeRfot2hH+AcHyBe257gX1rfoCBboCAe3B0gWtyXoBSdk6BVX1PgVCCVYFWglaATYNHf0uGT39ThlN+VIRXgFKDR4A7gjR/K4MufC6ELXsshSx7LIYtey2GLXoshS55LoQwejWCOno9f1F7Tn1RdUV7RHNPelB2Q38+e1CEa35nfnd+fHd7f3hxd4B3bXmAeWt5gHpreYB4bHWAdGxsgGlsYoFbbF2BXmxhgWVuaYFnb22AcHBxgHVxd315dXt7fnh/e397fX13emx/YnlSf0Z4OH05eT17SHpUe2J6bnt5d4J9hnaEfoNygX9/cH9/f3B+f39xfn9/cn9/fnR9f3x0e395cniAdnJ4gHlyeIB3dHOAbHRiglZ1R4I5dTCAK3gpfSl9KXwpfip8Kn8peyl+K3oxezh6QHdJeVJxWnthbmZ9Z2lpfmhnaIBoZ2iAZ2hngGVrYYBabVWATnBGgEJvQYBFbkp/UG5ZgFtvX4Bkb2iAa29tgHBvcn5xb29+bW5vfHJwdnt6dX55gHyDeISAhXiEfoR5hHuEeod6iXqMeo57jnqLe4p6i3yLeox8jHqNfI18jHyKfIR+fndygGdvYn9ibGd9bXJ0e3l2ent7dn18fnV/fn92f35/d4B9f3h9fXh5coBpeV2CTnRCgjd0LoErdix8M3k/dk99YnRyf391iH2Leot5jHyLd4t+i3iLfYt5in2Jeoh9h3yGfYF8eX5xe2d/W3dRfFB2UnhbfGN1bHxxd3V4dnt0cHN/cmxzgHNrdH90a3SAdGpygHJocIBwZm+AbGdrgGtpa4Fma2OBXG5Vf1BwO/87/zr/Of85/zn/OP84/zf/Nv81/zX/NP8z/zP/M/8y/zL/Mf8v/y//L/8u/y//Lv8x/zb/Ov87/0D/Q/9G/0n/Rv9E/0H/Pv88/zv/OP81/zX/NP8z/zH/Mf8y/zD/Lv8u/yz/LP8r/yr/Kv8q/yn/Kf8o/yj/J/8n/yj/J/8m/yb/Jf8l/yX/Jf8k/yT/Jf8l/yX/Jf8m/yb/Jf8l/yT/JP8k/yT/JP8k/yP/I/8j/yP/I/8j/yP/I/8j/yP/Iv8i/yL/Iv8i/yL/Iv8i/yL/Iv8i/yL/I/8j/yL/Iv8i/yL/If8h/yH/If8h/yH/IP8g/yD/IP8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//IP8g/x//IP8g/yH/If8i/yP/Iv8i/yL/I/8l/yf/L/86/0f/Vv9j/27/eP98/3f/cv9q/2H/U/9I/0j/S/9O/1L/Vv9a/13/YP9h/2L/ZP9l/2b/Zf9k/2P/YP9c/1X/Tv9G/z7/Of82/zb/Nv82/zb/Nv82/zb/Nv81/zX/Nf81/zX/Nf82/zb/Nv82/zX/Nf81/zX/NP80/zP/M/8x/zD/MP8w/zD/L/8u/y7/Lf8t/y3/Lf8u/y7/Lf8t/y3/Lf8v/y//L/8w/y//L/8w/zH/MP8x/zH/Mv8z/zP/Nf80/zX/Nf81/zX/Nf81/zX/N/84/zn/PP89/0H/Qf9D/0P/Rf9H/0j/SP9J/0n/Sf9K/0z/TP9N/07/Tv9O/03/TP9N/0z/S/9I/0n/Sv9P/1f/Yv9s/3P/dv91/3P/cf9y/3T/dP93/3n/e/98/3r/df9v/2z/af9o/2b/Z/9n/2z/cP95/3z/gf+H/43/kP+T/5X/lv+W/5j/lv+S/4//if+C/3//ef96/3z/fv9//37/fv95/3H/av9d/1X/Vf9S/1L/Tv9O/0z/Tv9J/0T/R/9P/1D/Tv9K/03/UP9K/0T/Of8t/y3/Lf8t/yz/LP8s/y3/Lf8t/yz/Lf8t/y7/M/89/1D/V/9Q/0z/Q/9J/1P/Uf9D/0H/T/9t/2n/d/98/3r/eP93/3f/eP95/3n/ev94/3f/dP9z/2z/Z/9f/1n/WP9a/2D/Zv9r/27/b/9s/27/bv9v/3L/dv95/3z/ff97/3X/a/9h/1D/RP84/zn/QP9K/1b/ZP9x/3z/gf+D/4L/gP9//3//f/9//37/f/9+/3//f/9+/33/fP95/3b/dv92/3j/ef94/3f/c/9s/2L/Vv9H/zn/MP8r/yn/Kf8p/yn/Kf8p/yn/Kf8s/zL/Of9B/0r/U/9b/2L/Zv9n/2j/af9o/2j/aP9n/2b/Yv9f/1n/Vf9N/0n/RP9H/0r/Uv9Y/17/X/9i/2X/av9s/2z/bf9s/2v/af9p/2z/cP91/3n/fP9//4P/hP+G/4b/hP+E/4T/h/+J/4z/jv+O/43/jf+L/4v/i/+L/4z/jP+M/4r/hf9+/3L/aP9j/2b/av9w/3X/ev97/3z/ff9+/3//f/9//3//gP9//3z/d/9x/2j/Xf9O/0D/Nv8u/yv/Kv82/0P/VP9k/3T/gf+H/4z/jP+M/4v/i/+L/4v/i/+K/4n/iP+H/4T/f/93/27/ZP9W/0//T/9U/1v/ZP9s/3T/dP9z/3P/c/9y/3L/cv9y/3P/dP90/3P/c/9x/3D/b/9v/27/bf9o/2P/X/9X/07/Sf88gTxqOoE6ajmAOWk4gDhqOIA1bDWANG81gDRxNIAxcjKAMXIvfy5zLn8udC6AL3UwgTNzNoQ6cT2IQW1GiUpoTYhNZ0uHSGZHhUVnQoU/aj+DPG48gztuOIM3bzeDNnE1gTRyMYExdi6ALHYpgCl5KX4pfCh+J3wnfiZ7Jn4meyV+JXwlfiV8Jn4meyV+JXsmfiZ6JX4leiV+JXolfiV6JX0leSR9JHkjfSN4JH0keCN9I3kjfSN5I30jeSN9I3kifSJ5I30jeSN8I3gjfCR4In0ieCN9I3gkfSR4In4ieCF+IXohfCF6IH4geiF+IXogfiB7IH4gex9+H3sffh97H38fex9/H3sffx97H38feyB+IHoffh96H34feR9+IHsgfyB8IH8hfCR+JHwjfiN8IX4hfCR+JnwrgDJ3P4NNcVyGaGh0hn5ifIZ2X3KGa2Jkh1ljVIhSY1aIWGRciGBkY4djY2WGZmFmhGZhaYJmYmSAYWZffFhtUXpLcUN3PHg2dTZ+OHU3fjZ1Nn43dTd/N3U3fzd2N4A2djaANXY2gDZ4NoA4eDmCN3k2gTV6NYIzeTODM3kzgzF5MIQweTCEMHswgi98LYIuey+ELnwugy5+LoEtfi+ALn0vgC1+L34wfzF/Mn8yfzR+NH81fzV/NYA2fzaAOH42gDZ9N4A4fTaBNn04gTh9O4I+ez+CP3k/hEF3Q4REd0aDRnRIg0hzSYRJcEqESnJLhEtwS4RMbkqDS25LgUtvTYJMb0uBSnFIfkZzQ31EdUl7U3ZefWl1cX90cnZ/dGtzgHNoc4J1aHeCeGl5gntpeoJ1aXGCa2lmgmRqYIFfamKAZWRogXBfd4F7W4WBjGGOgJFskn+WdZV+lXeVfpN4jn6Hd4F/fnF5fnlteH96bnuAeHFzgG52aIBhel6AW35ZgFaBVIBNhE2BSoZJgUqHRoBDiUd+S4lHf0OISH5QiE2BTIVIgi+BKYAugy17LIQseiuFLXsshi16LYUtei2FLHkwgjZ5Rn9Ye1F8UXZJelF2VX5HekGFPXs+iEp9a4J5fnx5e396cneAdm11gHdren96and/dWx1gHJtbIBkbVqAV2xXgFlxXoJnc22BY3hGgUB9RH1jfWt6bnhxenV4enl+ent9dXpqfl94UH5DeDl9PXpEe097XXtoenV9fXaCfoJ0gX+AcX5/fnB+f35wfn9+cH5/fnN9f351e396dHeAd3F2gHZxd4B4cniAdnRygGt0YYFTdUaBOHYwfyx5KH0ofyd8J34neyh/KHspfi16NHo7ekJ1S3tTcVx8Y21mfmdqaIBoaGmAaWhpgGlpZoBjbGCAW2xYf1JqTIBLaEyBUWpWgVxrX4BjbWWBaW5pgmlwaoFpb2h/ZG1kfGRvaXxucnR7eHd7e398gnmDfoR5hH2EeYV8hXmHeop6jXqPe496jnyOeox8jHqNfI18jnuOfox8iHuFf390dIBrb2d/Z25tfXN0dnx5dnt8fHN9fH10f359d35+fneBfYB4f314d2+AZnZYg0txP4M1cy2BK3cuezh8RndYf2p1d36EdYp8jHqMeI19jHeLfYt5i32LeYt9inuJfod8hH5+fHWAbHligVd0UH5OdVN5Xn1ndm19dHh0eXN8c3FxfnFtcn5yanR/dGp0fnVqdX51Z3SAc2dwf29nb4BsaGaCYGtagVFxSX1Idjz/PP87/zr/Of84/zj/N/81/zX/Nf80/zP/M/8y/zL/Mf8w/y7/Lv8u/y7/Lv8v/zD/M/82/zr/P/9E/0j/TP9S/1L/UP9O/03/S/9J/0j/Rv9E/0T/Q/8//0D/QP8+/zz/O/85/zn/Nf8y/y3/K/8q/yn/Kf8n/yb/Jv8m/yb/Jf8k/yX/Jf8m/yb/Jf8l/yb/Jv8l/yX/Jf8l/yX/Jf8l/yX/Jf8l/yT/JP8k/yT/I/8j/yP/I/8j/yP/I/8j/yP/Iv8j/yP/I/8j/yP/Jf8k/yT/I/8k/yT/JP8k/yL/If8h/yH/If8g/yD/IP8g/yD/IP8g/yD/H/8f/x//H/8f/x//H/8f/x//H/8e/x7/H/8f/x//H/8f/x//H/8g/yD/IP8g/yD/I/8i/yP/I/8i/yH/JP8m/yf/Lv84/0b/WP9l/3D/ev99/3v/d/9y/2z/Zf9g/17/Xv9d/2H/ZP9m/2b/af9q/2n/af9p/2f/Y/9f/1v/VP9N/0b/Pv85/zn/Of84/zj/Nv82/zf/N/83/zf/N/83/zf/N/84/zj/OP86/zj/Of85/zf/Nv82/zT/M/8z/zD/Mf8w/zD/MP8w/zD/MP8v/y//MP8v/zD/L/8v/zD/MP8u/zH/NP80/zT/Nf82/zb/Nv84/zr/Ov88/z3/Pv89/z7/QP9A/0H/Qv9C/0T/RP9G/0b/Rv9G/0j/Sf9K/0n/Sf9J/0v/S/9L/0v/TP9M/0z/TP9L/0v/S/9L/0z/S/9M/0r/SP9H/0P/Qv9A/z//Q/9M/1n/ZP9x/3T/dv90/3P/c/90/3T/d/95/3n/ef94/3b/cP9p/2L/XP9Y/1f/Wv9c/2D/a/9y/3j/gP+H/4r/j/+R/5X/lf+W/5T/kv+O/4j/gf98/3n/ef93/3b/dP9u/2X/Y/9h/1r/Wf9X/1b/Wf9X/03/S/9M/0r/Rf8+/zz/Q/9H/0f/R/9J/1D/U/9T/1z/TP8l/y3/Lv8s/y3/LP8r/yz/LP8t/y7/Lf8t/y7/NP9M/03/V/9m/1v/U/9U/0D/PP83/zr/Sf9p/3r/ev97/3j/dv92/3X/d/95/3n/c/9y/3X/cv9q/2T/XP9Y/1r/W/9q/2j/Tf89/0T/QP84/13/af9l/2r/c/95/3r/eP9z/2j/Xf9M/0D/O/8//0f/VP9g/23/d/+A/4T/g/+A/3//fv9+/33/ff99/33/ff9//37/ff97/3n/d/92/3b/dv93/3j/eP92/3H/av9h/1P/Rv84/zH/K/8o/yj/J/8n/yf/KP8o/yr/Lv80/z3/Rv9O/1f/Xv9l/2f/aP9n/2j/af9p/2n/af9m/2P/Yf9e/1r/Vv9Q/0//Uv9X/1v/Xv9h/2X/Z/9o/2j/af9m/2L/X/9e/1//Y/9p/23/dP94/3v/f/+B/4L/gv+C/4L/hP+G/4j/jP+O/47/jv+N/43/jP+M/43/jf+O/47/jf+K/4X/fP9z/2r/af9p/2//dP96/3z/e/98/3z/ff9+/3//f/9//4H/gP99/3f/b/9m/1j/SP89/zT/Lf8t/zH/O/9M/1z/bv99/4T/iv+N/4z/jf+M/4v/i/+L/4v/i/+K/4n/h/+E/37/dP9o/17/Uv9O/1D/VP9d/2X/bP9y/3X/c/9z/3L/cv9z/3P/dP90/3T/df91/3X/df90/3H/cP9t/2j/Y/9b/1P/Tf9I/0r/O4E7ajqBOWo4gDdrN4A3azWANGwzgDNvM4AycTGAMHIxgC9yLX8tcy5/LnQugC51LoEyczaEO3E/iEVrSYlMZlKIU2RTh1JjUYhPZU+ITWVLiExnS4hKZ0mISWdKiEloRoZEa0KGQGw9gzltNYExcC5/KnYpfih4J30oeid+JnslfiV9JX4lfSZ+JnsmfiZ7Jn4meiZ+JnolfiZ6Jn4meiV9JXklfSV5JX0keSV9JXkkfSN5I30keSR9JHkjfSN5I30jeCN9I3gkfCV4JHwleCV9JXklfSV5JXwleyR9I3sifSJ6IX4heiB+IHogfiB6H34fex9+H3sgfiB7H34fex9/H3sefx57H38fex5/Hnsefh56H34feiB+IHkgfiF7IX4gfB9+H3wgfiB8IX4hfCGAIX0kgCZ9KIAteDWDQHJRhmBrbIZ2ZH2Gf2N8hnhhdIdwX2yIa19oiGhgaIhrYGuHa2FrhmthaoRqYWmCZWJif15mWXlSbEt2RHQ/dDt6OXQ5fzl0OX83dDd+N3Q3fzh1OH85djiAOHY4fzh6OXw7fjx6PoA/eD+APnc+fjp5Nn00fTJ7MoAxey+CMXsxgjB8L4AyfjF+MX8zfTKBMXszgTR4NYM3dzeDO3Q8hDxzPIU/cUKFQnFDhkdwR4dJcEqITG9MiE1uT4hPblCIUm5SiFRuU4hSblSIVGxTiFNpU4hTalKIUmpTiFNoUohUZ1KGUGdQhk9oToZOaUyGSmpLhEtqSYNJbEmBRm9DgEJyPn47djp8OXg9fUl5VX5jd2+AdHJ1gHNrc4BzZ3OCdGd3gndoeYJ6aXeCdGtwgmVrXIFTcFB+Tm9QflNrXH9jYW2CcVZ5goJYiIGPZZGAkW+TfpN1kn6Rdox+hnd/f3xyeH93bnd/d29wgWZ0XYFZe1aBUoFRgE2EToBWhVGARoZHgEaIQ4A7iTuAP4tDf0eLSH9Li01+T4lNf0+FUYFdfkCDI30qgiyALX4shS17LIYseyyFLXsshS17LYUwejyFPHpXgmN5YINeelODPXw6iDN8QYdafXCAe35+eHl/eHB3gHdtdoB2a3V/c25qf2hwcH9wcmp/ZXFggVxwXIJhdFqEXHtVhEWAQII3gEp/Y39hfGF5anpzeXd6dnl2fnB5aIBbeE1+QHg8fEJ6SnpXe2R6b3t6fYF4gn6CdYB/f3J9f31yfX99cn1/fXJ8f35zfn98dHp/eHN2gHRxdYB0cXaAd3J3gHV0cYBqdGCBVHVHgTh3MH8reih9KH8nfCd/Jnsnfyh7KH0wejZ6QHpJdU96Wm9hfGVsZ35oaWiAaGdogGhoaoBoamiAZmligGBnXIJYZFaDVmJWglplXYJgaGSDZmplg2VsZIJibV+BWW5YflhwXHticmh7b3Z0enh4ent+eoB5gH2BeYF9gnmFfId5inyOeo58jnuOe418jXuNfI18jnyOfZB7jn2NfIp6hX9+c3eAbW5rgGxvcX50dXl8e3d8fHt1enx8dn5+fnh/foB4gX2AeHx9dXdwgGV0WINJcT2DNHMugS53NXs+fE51X4BvdH2AiXiLfI18jHmMfYt5i32Leot9i3mKfYl7h36Ge4R+e3txgGZ3W4FRcU9+UXNZeWB6aXhxfXR5dHlxfHFxcX5xbXJ+c2xzf3RrdH51a3d+d2l1fnRncoBvZ2yCZ2hgg1hsToNIdEV8Snk6/zr/OP84/zf/N/83/zf/Nf80/zT/Mv8y/zL/MP8v/y7/Lv8t/y3/Lf8t/y3/Lf8v/zL/NP83/z3/Qv9H/0v/Uf9S/1L/Uv9T/1L/UP9P/07/Tf9O/1D/UP9Q/1H/Uv9P/1D/TP9H/0T/Qf89/zn/NP8w/yv/Kf8o/yf/J/8n/yb/Jv8m/yb/Jv8m/yb/Jv8m/yb/Jv8m/yX/Jv8m/yb/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8j/yT/JP8k/yT/I/8j/yP/JP8k/yX/Jf8n/yX/Jf8l/yX/Jf8l/yX/JP8j/yL/Iv8h/yH/IP8g/yD/IP8f/x//H/8f/yD/IP8f/x//H/8f/x7/Hv8f/x//Hv8e/x//IP8f/x//IP8g/yH/If8h/yH/If8h/yD/IP8h/yH/If8i/yX/J/8p/y7/NP8+/0r/Wv9m/3H/e/+B/4D/fP95/3f/dP91/3P/c/9x/3D/b/9v/3D/cP9v/2//av9n/2T/Xv9V/07/SP9B/zz/O/85/zn/Of85/zj/OP84/zj/Of85/zj/Of87/zv/Pf9C/0b/Sf9K/03/Tv9L/0n/Q/9A/zj/Nf8z/zL/Mv8z/zP/M/8z/zT/Nv83/zr/O/89/zz/P/9A/0T/Rv9G/0n/S/9Q/1D/UP9S/1X/V/9X/1n/W/9a/13/Yf9h/2H/Y/9k/2f/Zv9m/2X/Zf9o/2f/Zf9l/2X/Zf9l/2T/ZP9i/2H/X/9d/1z/W/9Y/1T/Uf9O/0z/Sv9I/0f/RP9C/z//PP86/zj/Nf81/zz/RP9S/17/av90/3b/dP9z/3P/c/90/3b/d/94/3f/d/90/23/Y/9a/03/R/9B/0X/TP9V/17/af9v/3b/fv+H/4z/kf+R/5P/kf+R/5H/jf+D/37/ev94/3b/d/94/3P/a/9j/13/WP9T/03/Sv9N/1L/Uf9K/0b/RP9E/0H/Qf9D/0P/R/9M/0//Uf9O/0z/Tv9K/17/af9M/yr/Jv8t/y3/LP8t/yz/LP8t/yz/Lf8v/zD/N/8+/2D/a/9f/1//S/86/zn/Nv9N/2H/cf95/33/ef93/3f/d/91/3b/d/9w/1//Vv9f/2j/af9l/2H/XP9h/1P/Pf9F/0j/P/9L/1j/YP9Z/1f/W/9m/3L/ef94/3X/bv9l/1j/TP8//0D/Rf9O/1z/af90/3z/gf+C/4D/gP9//33/ff99/33/ff99/3z/fv99/3z/ev95/3X/dP9y/3L/c/91/3T/cf9v/2j/Xv9S/0X/OP8w/yv/KP8o/yf/J/8m/yf/Kf8s/zH/Of9D/0v/U/9b/2P/Z/9o/2j/aP9o/2j/aP9p/2n/aP9o/2b/Zf9h/13/W/9b/1v/XP9f/2H/Y/9l/2P/YP9d/1n/V/9U/1L/V/9e/2X/a/9x/3T/eP96/37/f/9//4H/gf+C/4X/iP+M/47/kP+P/4//jf+N/43/jf+O/47/jv+N/43/iv+G/4D/eP9w/23/bv90/3j/ev97/3z/e/98/33/fv9+/37/gP+B/4D/ff93/3H/Z/9a/0v/Pf80/y//L/8z/z//Uv9j/3L/gP+I/4v/jP+L/4z/i/+L/4v/i/+L/4r/if+H/4b/gf96/2//ZP9b/1H/Tv9T/1n/YP9q/3H/c/9z/3P/c/9y/3D/cv9z/3T/df91/3b/d/93/3f/d/9z/3D/bf9l/17/Vf9M/0X/RP9Q/ziBOGg4gThqN4A3ajeANmw2gDRuM4AxcDGAMXIxgC9yLn8tci1/LXMsfyx1LIAseCyALnYwgDV1OYQ/cEOFR2xMhlBoUYdRZVGIUWdRiFBmUIlPZlGJU2ZUiVRkVopWZFOKVWZTilNmUIdLZ0eEQWg8gDVsMn4tcCl+KHYnfSh5J38neiV9JXsmfiZ7Jn4meSZ+KHknfSd5JX4meiZ+JnolfiV5Jn4meCZ+JnglfiV4JX0leCV9JXglfSV4Jn0meCR9JHglfSZ4JnwmeSZ8J3kmfCV6JXwleiR9JHokfSR6I30jeiJ9InogfiB7IH4gex9+H3sffh97H34feh9+Hnoffx96H38feh9/H3offx96H34fex9+H3sffh97IH4gfCF+IXwhfiB8IX8hfCJ/InwigCR7JIAmeiuAL3k0gjtzRIJRbmCEampzhXxngYV+Y3yFel96hnpceId2X3iHdl52h3VecoV0XnKEcmFugmliZH1dZ1V4TmxGdD91O3M6ezt0O386czp/OXI5gDlyOX86czqAOnc6fT18QXlHg1ByVIhZa1yJX2dgiF5mW4ZVaE2CQXA2gDV4NIA1fTSAOXs7hD14QIVDdUWERm9Jh01tTYhPbVOJVmxWilprWotcaF6MX2ZijGVmZItnZmiLaWZri25lbYtvZHKJc2NziXRjdIh1ZHaIdWN2iXZid4l3Y3aJdmN0iXVkdIh0Y3KIcGBviG9gbIhpYGeIZGBfiFtgVoVPYkuER2ZEgkBrPYA4cjd+NHYzfjR5PIBHeVCAXXdpgHJydIB0bHOBc2dzgXRmdoJ4aXaBeWp2gnRoboJkalaBTHFBfzp0Pn9HcVJ9W2dlgm5adYF+WYWBjGSPgJFvk3+RdZF+j3eKfoV0f396cXiAdm91gHdudoBvcmyCZnZeg1h9UoFWgleAVIJRf0uESIBEh0J/QYpDf0KLRH9Ei0l/TIpOflSHU39MhE2ASoNEgmx9XIM5eiuBLYAtfi2FLHovhTJ7L4Mvey+DMXxAg1x6coNtel+CW3tDhDl7OIc+fViEZn1dfHB+fHZ6f3hwdoF2bXaBdWx2gW9uXYFdc2KBXnhggVt7WIJafFWDW31Jhl5+RoVAe0SDXXhWgE10UX9idWx/cXZ1gHJ1c4Bwd2d/WXhLf0J4QntIe1N6X3xsenZ6f32Bd4F+gXN/f35yfX99cn1/fXJ9f31zfX9+c32Ae3J4gHZxdYBycHGAcXBygHNwcoBwcm2AaHJdgVF1RYE4eTJ/K3wpfSh+KHwmgCd8KH8pei19NHs8eEV5TnNXe15tZH1oaWl+aWZogGhnaYBpaWiAamlqgGlmZ4BmZGOCXmBchFxgXYNfY2CDYmZjg2RqY4NdbVWCUm9Pf05vUHtXcV96Z3Zte3J4dXp5ent5fnt/eX99f3iBfYJ6hXyIeIx9jXqPfY58jnyOfI58jnyOfY58j36Re499jX2Keod+gnR6gHJwcX9xcXZ+enV8fHt1enx6dXt9fXd/fX54fX5/eIB9f3l8fXh3cIBmdVqCTHE+gzVyMoAydjl6RH1WdWd/dnWCgIp5jHuMe4t4jX2Meot9i3qLfYt7in2Je4h9hnx/fnh5boFiclmCUW1Of1NxW3tiemt5cX1ye3J3cXxxb3F9cW1xfnJscn90bXZ/d2t2f3Zqd393aHWAcWZvhGVnXYVUbUqERXZIfFV9OP84/zj/N/83/zf/Nv81/zP/NP8z/zH/Mf8v/zD/MP8u/y3/Lf8t/yz/LP8s/yz/K/8r/y7/Mv82/zn/Pv9C/0f/SP9K/0r/TP9M/03/TP9O/1D/UP9S/1P/U/9X/1n/Wv9Y/1j/WP9W/1P/UP9M/0f/Qv86/zT/L/8r/yn/KP8n/yf/Jv8l/yb/Jv8m/yb/Jv8o/yf/J/8n/yj/KP8o/yf/J/8m/yb/J/8n/yb/Jv8m/yb/Jf8l/yb/Jv8m/yb/Jv8m/yf/J/8m/yb/J/8n/yf/Jv8l/yX/JP8k/yT/JP8k/yT/JP8i/yH/IP8g/yD/H/8f/x//H/8f/x//H/8e/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8g/yD/If8h/yH/IP8h/yL/Iv8i/yP/Jf8l/yj/K/8v/zL/N/8+/0r/V/9i/2z/df99/3//fv98/3z/fP98/3r/fP96/3r/ef93/3f/df91/3P/bf9n/13/Vf9O/0X/P/89/zz/O/87/zz/PP87/zv/O/86/zn/O/87/0D/Rf9N/1b/Xv9l/2v/bv9w/3L/cf9v/2r/YP9R/0P/O/86/z3/QP9D/0j/Sf9N/1H/VP9W/1j/Wv9b/13/Y/9k/2f/af9r/23/bv9w/3L/cv9x/3T/dP91/3f/ef96/3n/eP97/3z/fv99/37/fv9//3//f/9//3//fv9+/33/fP99/33/ff98/3r/ev96/3n/d/90/3D/av9m/1//WP9Q/0r/Qv89/zn/NP8z/zT/OP8+/0b/Uv9e/2r/c/91/3X/c/9z/3P/dP93/3j/d/94/3j/dP9t/2P/UP9A/zL/Mv84/0L/Tv9Y/2H/av91/33/hv+M/5D/kf+S/5H/kP+P/4v/hf9//3z/eP92/3b/d/94/3j/df9x/2r/aP9h/17/WP9T/1D/UP9L/0f/Rv9G/0f/Rf9F/0T/Rv9I/0n/T/9Z/1P/RP9C/0L/Sv9g/2j/Nv8p/yv/Lf8t/yz/Lv8u/zH/Mf87/0//aP9o/1b/V/9P/zn/Of85/0r/YP9l/1P/Xf97/3v/ef91/3X/df90/2//aP9e/2P/X/9W/1f/Vf9Q/0//TP9P/2L/XP9d/13/Rf9P/1L/X/9n/3P/bf90/3D/ff91/3H/ZP9X/0r/Qf9D/0r/Vv9j/2//eP+A/4P/gf9//37/ff98/3z/ff99/33/ff99/3v/e/96/3n/dv9y/3H/cf9x/3H/cv9y/3D/bf9o/13/Uf9E/zf/MP8s/yn/KP8o/yn/J/8o/yv/Lv82/z7/Sf9R/1j/YP9m/2j/af9p/2j/aP9p/2n/aP9q/2r/av9p/2j/Zv9h/13/Xf9d/1//Yf9h/1//Xf9Z/1T/Uf9N/0r/TP9Q/1f/YP9o/23/cv93/3r/e/9+/3//f/9//3//gv+F/4f/i/+O/5D/jv+O/47/jv+O/47/jv+P/5D/jv+P/4z/iP+F/37/df90/3T/eP97/3v/fP96/3r/e/99/37/fv9+/4D/gP9//37/ef9y/2j/W/9N/0H/OP8z/zP/O/9H/1j/aP94/4P/iv+M/4z/i/+L/4r/i/+L/4v/i/+L/4r/iP+G/3//eP9u/2L/V/9S/1L/V/9f/2b/a/9x/3L/cv9v/2//cP9x/3H/cv9y/3T/dv93/3r/ev95/3j/d/90/3D/af9g/1T/S/9H/0r/XP85gTloOYE3ajaANWo1gDNsM4AzbTGAL28vgC9wLoAucC5/LnEsfytyK38rdCyALHYrgCt2K4AudS+BM3I3gjlvPYFBbEKCRWpHhUdqSIVJaUuGTmdOhk5nUIdQZ1WJV2RYiVlkWolaZFeKV2VWiVNkUYZJZUOCPmc4gTRsLoArcCp/J3InfSd2Jn4mdyZ+J3gofih5KH0neSh+KHkofih5J34neCd+J3gnfid4J34neCd9KXglfSV4Jn0neCd9J3gofSl4KH0neCd8JnknfCd5J3wneiV8JXokfSR6JH0keiV9JXokfSR6In4heyB+IHsgfiB7H34fex5+Hnoffh56Hn8eeh9/H3oefx56H38feiB+IHsffh97H34feiF+IXshfiF8IX4hfCJ/InwhfyJ8JIAmfCiAKnssgS96MoA2dzyBQnNOgldvZINta3SDeGd8g3tifYR9YH2FfV9+hX5efYV9W3uGe1t5hXhddoRzXmyCZGNbflJnSXpCbz93Pnc+dD5+PHM8fj10PIA8dDt/PXg+fUF8R3hRg1ZuX4dpY3OHelx9iYNchIiDXX+Ge2JxhmNoVYRIbkWFSHJLh09vU4hYbFuJX2hjiGhkaIlsYW2JbmBxiXJfc4l0XXWJd113iXldfIl6XXuJe1x7iXxcfod+W3+Hf1qAiIFXgYiCV4OHg1iBh4JXg4eEWYWHhFqEh4RcgoeBXYKGgV6BhoFegoeCXYOHgV2Bh4BffYd6X3WGb19phmJiWoZRZ0yGRmpAhDxtPoNBbkODSXBSgV5xaIBxcHWAdWt0gXNqc4FzaHaCdmZ4g3lmeYV4ZHmJe2V7i3xnXoovbS2EP3NJgFNvXoBqZHSBfGGFgY9pkoCScpJ/kHWQf453in6FdYB/fHJ5gHdweIB2bnh/eW56gXhweIJycmmAY3hXgFZ+UX9Sg06ATYVJf0uHSH9GiEh/RYhGgEeISYBNhlaATIJDf0GDRH5Chj9/VYJLgCR+KoAvgCx9L4MvfjGCPIBgf1OAS3xRe1B/XHhTgE57OYU7fTuIUX1fgmp/a3plgXR2eoF6cHSBc213gXFsZYFib16BWnRSg1B8U4JRgkqBSoVGgESEUoFTfGSCYXRagkpvToBPaFeAYmZqf2lpaH9fbVd/bHVif1V3SX5Dd0V7T3paemh6cHp7eoF9gXaAfn9yfn99cXx/fHF8f3xxfH98cnx/e3J6gHlxd4B0cHCAb29ugG5vcYBycHGAb3JsgGdzXYFQd0OBN3gwfyt7KX0ofih8KH8nfCl/K3oxezh7QnZKelRxW3tibGd9aWhpfmlmaH9oZmmAaWhpgGpoaoBpZWmAZ2Nkgl9dX4RfXV6DXmJfg15lWYNXa1CCTG5JgEduR31LclF7WHViemp1cHt1eHZ6enp8eX1+f3l/f394f32BeoN8iHiLfY56j32OfI58j3yPfI98j32OfI9+kHqQfo97jXuIfIV4f394dHV/dXJ4fnt2fHx8eHp8e3V9fX13fX1+eH9+gHiAfX55fH14dnGAaHNeg1FwRIQ7cTSANHY+ekt9XXRtgXx2h4CLeox7i3yKeIp9i3mLfYt5in2Ke4l9iXuIfYZ7gH54eG2BYXFXglRsVH9bcWF7Z3pteXF7c3tzdXB8b29wfXFtcn5zbHJ/c211f3dten98a3t/emp3gHVpb4JoZ2GDVWxMhEl2UHxifTj/OP83/zb/Nf80/zT/Mv8w/zD/L/8v/y//L/8u/y7/Lf8t/yz/K/8r/yv/K/8r/yr/Kv8q/yv/K/8t/y//Mf80/zj/OP86/z3/Pf9A/0P/Q/9F/0b/SP9K/0r/UP9T/1X/V/9Z/1r/W/9Y/1n/WP9Y/1L/Tf9J/0L/O/82/zL/Lv8r/yj/J/8n/yf/J/8p/yn/Kf8o/yj/Kf8p/yn/Kf8o/yj/J/8n/yf/J/8n/yf/J/8p/yf/J/8n/yf/KP8o/yn/Kf8p/yn/KP8n/yj/KP8n/yf/Jv8l/yT/JP8k/yT/Jf8l/yP/I/8i/yH/IP8g/yD/IP8f/x//Hv8e/x7/Hv8d/x7/Hv8f/x7/Hv8f/x//IP8g/x//H/8f/x//If8h/yH/If8h/yH/Iv8i/yH/Iv8l/yf/KP8q/yv/Lv8y/zX/Ov9A/0X/Tv9Y/2T/av9x/3P/df95/3v/fv99/3//f/9//3//fv9+/3z/e/95/3n/df9s/2T/XP9U/03/Rv9D/z7/Pv89/zz/PP88/z3/PP8//0T/Sf9P/1j/YP9r/3b/gP+G/4r/jv+R/4//jf+H/33/cf9m/1n/U/9W/1z/YP9k/2f/bP9v/3H/c/90/3b/d/93/3n/e/97/3z/ff99/3//fv98/33/ff99/3v/e/+A/4D/gf+B/4D/gf+A/4L/gv+A/4L/gv+C/4L/hP+D/4P/g/+C/4H/g/+C/4P/hf+F/4X/h/+G/4f/hf+D/4L/f/98/3j/dP9t/2b/YP9Z/1b/Uv9P/07/Tv9Q/1b/X/9p/3L/dP90/3T/c/9z/3P/dP92/3b/d/+B/5H/nP+g/57/o/+g/3r/KP8z/0X/UP9d/2f/df9//4f/kP+U/5P/kf+P/4//jf+J/4b/gP98/3r/ef93/3f/eP95/3v/ev92/2v/af9h/1H/Uv9Y/1n/Uv9S/07/S/9J/0r/Sv9J/0r/T/9R/1T/Uf9R/0H/Nv9E/0H/PP87/1f/VP8s/yj/Mf8y/zH/PP9P/2f/b/9X/2L/Xv9Z/1T/Tf83/zz/Qf9T/17/ZP9x/3X/d/94/3f/dv90/3b/cv9k/1n/T/9S/1v/U/9O/03/Tf9K/0v/Uf9f/1v/Wv9a/0r/U/9f/17/X/9c/0n/W/9h/1H/Xv9s/2H/Vv9I/0f/Sv9S/1z/aP91/33/g/+B/3//fv98/3z/fP98/3z/fP98/3z/fP97/3r/eP91/3L/b/9t/27/bf9w/3D/cP9u/2r/Zv9c/0//Q/83/zD/K/8p/yj/KP8o/yf/Kf8u/zT/PP9H/03/Vf9g/2b/aP9o/2n/aP9o/2j/af9p/2n/av9q/2n/aP9l/2H/Xf9d/13/XP9c/1n/Vv9R/0z/Sf9F/0L/Qv9G/0z/U/9a/2L/av9w/3X/dv96/3z/ff9//3//f/9//4L/hP+I/4v/j/+P/47/jv+N/43/j/+P/5D/kf+R/5D/j/+N/4j/hP+B/3z/ef95/3r/e/98/3z/ev97/33/ff99/37/f/+A/4D/fv98/3r/c/9o/1//Uv9G/z3/Nv82/z//T/9g/3D/fv+G/4v/jP+K/4r/iv+L/4v/i/+K/4r/if+J/4j/hv9//3f/bP9g/1b/Vf9W/17/ZP9q/3D/cv9z/3P/cP9v/3D/cf9x/3L/dP91/3X/d/96/3r/e/96/3j/dv9y/2z/Zf9b/1H/Tv9a/2n/N4A3aTaANWszfzNqM38xbDF/MG4vfy9vLn8ucC1/LXAtfy1xK38rcSt/KnMpfyl0Kn8qdSl/KXYqfyp1KH8rci1/LXAvfzFwM4AycDWAOm07gTxtQIFBa0SDRWpIhExpT4ZSaFSHVmdYiFllWYlZY1qJWGRWiFJlTodHZkGDO2k1gjFsLoAscCl/KHIqgCp1Kn4qdyl+KHgpfSl3KHwodyl+KHcofih3KHwodyd+J3cofih3KX4pdyl8KXcpfCl3Knwqdit8KXYpfCl5J3woeSh8KHonfCZ6JnwmeiV9JXsmfSZ7JH0keCN+InsifiJ7IH4gex9+H3sffh96Hn4eeh1/Hnoefx96H38feh9/H3offh96H34feh9+H3offiB6IX8heiJ/InsifiJ8JH4lfCV+Jn0ofil9LX8uezB/NHk2gDt2QIBIc0+AV3BfgWZuaYFta3CCc2h3gXtme4J9Y3+EgF+AhoBcfoZ9XX6GfVx7hXVecIZpYmOEWmhTgE1tR3pCdD92QHs+dj1+Pnc/fUJ7SHlPgVhwYIVrZXSHfl+JiJBZlIiXWZWGlVuUho1ehoV8YnKFZWVhh2NoZ4lrZXCIdGJ1iHdeeoh8XH2IfVt8iHxYfYd9V4CGgFl+hn5YfYV9V32FfVd7hHpWe4R7VnuDe1V9g35TgIR/VIGEgVSBhIFSgoSAU4KFglaBhYFXgYWBV4CFgFiBhIFZgYSCVYOFhFiGhYdWh4eEWIaHh1uFh4RfgId8YXqHdmRzh29nbIdnZ2SHX2ZchlxnX4ZmaWuDc211gHZrdYBxaXOCcmdzhXRkd4eDYpqIo1+hhqJgpYerZK6GqGlohyxtPoJPclp/aXB1f4BtioCRcpV+k3eRfpB2jn6Mdoh+hHSAfnxxe4B5cHeAd294gHpveoF6b3eBbnJrgWN4T39EfFR/YIBYgVmBUYFMg02AS4RMgFGEUoBVglWBUIBKf0J/T35GgkV+PIg9fjqKQn9jg1iASnpWgUZ8MH9egHmAc35ygW59V34+flF7VYFRfDqHO31Kh1l+X4JWgGl6doNyc3CDdm14gnZsdoBya2mAVW9Sg1d3XYJUfkiDSoRKgUqETIBSg1SATX5UgFtzTIFbbFWAVmdcgVVpQIJgameBXmxfgW50YoFSdUd/SHlLe1Z6YXpse3Z8fneBfoBzfn58cXt+e3B5f3lwe397cnt/e3N8f3txeoB3cHOAcG9vgG5ubIBsbm+Ab25vgG5xaoBlc1uBT3VBgDh4MH8reyp9KX8ofCh/KHopfS56Nno+e0h1UXtYb2J9Z2lpf2pnaYBpaGmAaWppgGlran9sa2l/Z2dpgGRjYYNeYVqEWWFXhFhiVYRPZkiARWtBgD1uPn9DcUl/UHFXfl10Zn1rdnF6dHd4enp5fXp+fn95f39+eX99gnmFfId5jH6Peo98j3uOe497kXyOe49+kHuRf5F6kX+Reo1/i3yJeoV9f3V8f31zfH98dnt9e3Z7e3t2fHx8d358fnl/e4B5f3x9e3t7e3RyfmhuXoFTbEeDPW44fzl1QnlTfGR0c4KAdoiAi3qLe4p8iniLfYt5i32Leot9i3uKfYp7iX2HeX2AdnZqgl9uVoJSa1eAX3BlfW55cnp1eHR8c3FwfW9vcH5xbnJ+cW52fnVudn14a3t9fWl+fn5mfIB6ZXeBcWhqg2NsWYJYdWJ8cns3/zf/Nv82/zT/M/8z/zH/Mf8w/y//L/8u/y7/Lf8t/y3/Lf8r/yv/K/8q/yn/Kf8q/yr/Kf8p/yn/Kf8n/yr/Kf8p/yn/LP8r/y3/Lv8x/zD/Mv81/zj/PP89/0D/Q/9F/0n/Tf9R/1X/Vv9X/1j/W/9a/1v/Wf9Y/1P/TP9E/z//Ov82/zH/Lv8t/yz/K/8r/yv/Kv8p/yv/K/8p/yn/Kf8p/yn/Kf8p/yj/KP8o/yj/KP8p/yn/Kv8q/yr/Kv8p/yn/Kv8q/yr/Kv8o/yn/KP8o/yf/Jv8m/yb/Jf8l/yb/Jv8k/yT/JP8j/yL/Iv8i/yD/H/8f/x//H/8e/x7/Hf8e/x7/H/8f/x//H/8f/x//H/8f/x//H/8f/x//IP8h/yH/Iv8i/yL/Iv8k/yX/Jf8m/yf/K/8t/y7/MP80/zb/Of88/0D/SP9O/1X/Wv9g/2T/ZP9o/27/cP9z/3j/ev98/3z/fv99/4D/gv+A/4D/fP96/3T/bv9o/2H/W/9V/03/R/9F/0P/QP9A/0T/Sf9O/1b/YP9o/3D/fP+G/4//lP+X/5j/lv+W/5f/kf+K/4H/d/9t/2v/bv9y/3P/df93/3z/fv9+/37/fv9+/33/ff99/33/ff99/3z/fP98/3z/fP98/3r/ev96/3v/e/97/33/fv9+/3//gv+C/4L/gv+C/4L/gv+C/4H/gf+B/4H/gP+A/4H/gf+B/4L/g/+D/4T/hv+E/4X/hv+H/4f/h/+E/4P/gf9//3//ff96/3f/d/90/3D/bv9t/3L/dP93/3f/d/9z/3D/bv9u/3j/hP+X/6H/n/+f/6H/qP+s/7D/sf+u/5L/NP84/0n/Wv9p/3X/gv+M/5L/lf+T/5H/kP+O/4z/iP+E/4L/fv98/3n/eP94/3j/ev96/3v/e/95/3L/Yv9O/0P/UP9T/1P/Xv9Y/1H/Uf9J/03/Vf9W/1f/Uf9O/z7/PP9N/0r/Q/86/zr/O/86/0T/Y/9e/1L/bP9j/1z/cP9p/2b/g/9a/zz/UP9b/1T/Pf89/0D/Rv9M/0L/WP+O/5T/e/9v/3j/eP96/3j/cv9i/1b/Y/9i/1L/Sf9N/0v/Sv9K/03/Uv9U/17/Xf9b/1b/U/9K/0T/W/9o/2f/ZP9e/2D/c/9c/1H/S/9K/0v/WP9j/27/ef9+/4H/gP99/3z/e/97/3n/ef97/3v/e/97/3z/ev95/3X/cv9v/23/bf9s/2z/b/9v/2//bv9q/2X/W/9P/0D/N/8w/yv/Kv8p/yj/KP8p/yv/Mf84/0L/S/9U/1z/ZP9o/2n/av9p/2j/af9p/2j/aP9o/2n/Z/9l/2L/YP9b/1j/WP9Y/1P/Tv9J/0T/Qv8+/zr/O/8//0T/TP9T/1r/Yf9n/23/c/92/3n/e/99/37/fv9+/37/f/+C/4X/iP+N/4//j/+P/4//j/+P/47/j/+Q/5H/kf+R/5D/jv+M/4j/hv+A/33/ff99/33/e/97/3v/e/98/3z/ff99/3//gP99/3z/ev93/3L/af9f/1X/Sv9A/zr/O/9F/1f/Zv92/4H/if+L/4v/iv+K/4v/i/+L/4v/i/+L/4r/iv+J/4X/f/91/2n/Xv9W/1L/W/9i/2j/b/9z/3T/dP9z/3D/b/9w/3H/cf9z/3b/df93/3r/e/99/37/gP9//37/ef91/27/aP9g/2L/bf95/zeAN2k1gDVrNH8zazF/Mm0wfy9uLn8uby1/LXAsfyxwLH8scSt/K3ErfytyKn8qcyp/KXMpfyl0J38ndCd/KHQpfyl1KX8pdSp+KnYpfil1Kn8tdS5/LnMwfjNyNYA5cTqCP25Dg0dtTYVTa1aIWWhbil1mX4pfZF2IWmNWh1BjSoRDZj+DOmo2gTNuMX8scCx9LHIrfSp0Kn0rdit8LHYrfCt1K3wrdSt8KnUqfip1Kn4pdSt+LHUqfCx1LHwsdSt8K3YqfCp2K3wrdyl8KXcqfCp5KHwneSZ8JnkmfSd6J30neyV9JXokfiR7I34jeyJ+IXsgfiB7IH4geh5+Hnoffx96Hn8feh5/Hnoffx96H34feh9+H3offh96H34geiF/IXshfyF8In4ifiN+JX4kfiV9KH4ofSx/L3wwfzR7N4A5eTqAPndAfkR2Sn5QdFF9VHFXfVxtY39naWl/bmZxgnZjeIN7YH6Ef1+AhIFdg4WDXIGFfVx6hXZeb4VoYmGCWGdWgFFuS35GcUd+S3FSgVhuYYVnZXCGel6Eh4pbj4aTW5eGl1uXhZddl4WSX4yDgWB4hHNfc4V2X3eGeV16hnpbe4Z9Wn2Efll9hH5YfYV7WXyDfFt7g3tcfIN8XnqDemB6g3pgeoN4YXmDemF6hHpffYR9Xn6Dfl2Cg4JdgYOCXIKDgl6Cg4FggIOCYYCDgGJ/g4BjgYSBYYKEgl6ChIFcgYSDW4KFgVqDhYVahISEWoSEhlyGhIVfh4SHYoSEgmWChIBogIZ9aX2GfWt9hX5pf4N8aniEc2d2hoVil4eiYJ+Gn2OahZ1lpoKrZ66Dr2euhKtkmoNBaDWAR3FZf2Z2dH+Cc42AlHeVfpR4kX6Qd45+jXeJfoZ1g35/cnx/fHB6gHdveIB3bnqAe258gXtvc4FpcmCAU3lTgFJ9XH5ofmJ+V4FUf0yBTn9XfliAVHtSgEt8OH41f0l9Q4M9fDuKOn43jzp+PopUgGiCZn9eekR9LHtgfVV8VX9veFZ9UnlRfVqBSX08iD5/S4lVf0iDO4FWf32Ben5agFSAYX5igmZ8ZIFffV2AWoBhf3OCaYFHg0eESoFKhkmATIZMgFSBWIBYdVCBTWxJgE5lUX9kZmOAYGpTgFJvX4BjbW6AbXBOfklzUHteeWh6c3x7fIB5f35+dXx+e3J6fnpyeX96cnt/e3N7f3t0e395c3eAc29xgG5rbIBsa2uAbG5vgG9vb4BtcmqAZHRbgVB3QoA3eDB/K3sqfSl+Knwpfil6L3s0eTx2RXpNcVd7X2xlfWlpa39rZ2iAZ2dngGhoZ4BnamZ/ZGpkf2JpYIBbZVmBV2VSglBlS4JGaUOAPW04fzdxNn88ckJ/SHNQf1VzW35gdWh9b3Z0end4enp7en16fn59eX1/fnl/fYJ5hXyJeY5+kHqQfJB7kHuOe418jnuPfpB7kX+RepF/kHqOf418iXuGfYJ4f359dn1+fHZ7fXt3ent7d3x8fXl+fH56fnt9en18enh5e3ZzcH5pbWCBVWxNg0JuO389dUp5W3xqdHmBhXaKgYx6jHuLfIt4i32LeYt9i3qLfYt7i32Ke4l+hHh+gXRyZ4NdaleDWWldgGZwbH5zd3R7dXZ0fXNxb31ub3B+cW5wfnNudn51bnd9em98fX9wf32Cb4J+gWx9gHlsdIFucGqAbnR2fYB5Nf81/zT/NP8z/zL/Mf8x/y7/Lv8t/y3/LP8s/yv/K/8r/yv/Kv8q/yr/Kv8p/yn/Kf8o/yj/KP8o/yj/KP8n/yf/J/8n/yf/KP8o/yn/Kf8p/yj/Kf8p/yr/LP8u/zH/Mv81/zj/Pv9D/0j/T/9V/1f/XP9e/2D/Xv9e/1z/Wv9V/0//Sf9E/0D/Pf83/zP/Mf8v/y3/K/8r/yz/K/8s/yz/LP8s/yz/K/8r/yv/K/8r/yv/LP8s/yz/Lf8t/y3/LP8s/yz/LP8s/yz/K/8q/yr/Kv8p/yf/J/8n/yf/J/8n/yf/Jf8l/yT/JP8j/yP/Iv8h/yD/IP8g/yD/Hv8e/x//H/8e/x//Hv8e/x//H/8f/x//H/8f/x//H/8f/yD/If8h/yH/If8i/yL/Iv8j/yT/Jf8o/yj/Kv8s/y//Mv81/zf/Ov8+/0L/RP9E/0T/Rf9I/0z/U/9Z/17/Yv9m/2n/bf9v/3b/ef96/4D/gv+F/4n/h/+E/4L/fP95/3b/cP9p/2T/YP9a/1b/Vf9X/1r/Yf9o/27/ef+B/4n/i/+P/5P/lv+W/5T/lP+T/5D/h/+B/3n/d/93/3j/eP95/3f/ev97/3v/ev97/3v/ef94/3n/ef95/3j/eP91/3X/dP90/3L/cv9y/3P/dP91/3b/dv93/3f/ev96/33/ff99/37/f/9//3//fv9+/37/fP98/37/f/9//3//f/9//37/f/+A/4H/gf+B/4L/gv+A/4D/gv+D/4b/h/+I/4j/iP+J/4j/hv+F/4X/hf+F/4X/h/+F/4P/gP+B/5P/nv+g/53/m/+e/6H/pv+q/6r/qP+m/6X/nv+W/1T/Mf9I/1j/Z/91/4P/jP+S/5X/lP+R/5D/j/+M/4v/iP+D/3//fP98/3j/ef95/3r/fP9+/33/fP94/3L/ZP9f/1b/V/9h/2T/Yv9b/1L/UP9T/1D/Uv9W/1D/S/83/y7/M/84/zv/O/84/zj/Pv9D/0z/Yv9x/2v/RP9W/3b/a/9Z/1T/Wv9t/1//UP9A/z7/P/9R/0r/Qf9A/0L/Ov85/zz/Pf88/zz/PP89/z3/R/9P/1H/Zf9c/0L/Rf9K/0v/S/9L/0j/T/9Q/1X/U/9Q/1H/Uv9W/1f/UP89/03/T/9U/1T/Yf9i/1f/Sv9W/2H/a/92/37/gf9//37/ev96/3r/ev95/3v/e/97/3v/e/97/3n/d/9z/3D/bf9s/2z/a/9s/2//b/9w/27/av9k/1v/Tf9B/zb/MP8r/yv/Kv8p/yv/LP8y/zf/Qf9K/1L/Wf9h/2f/av9r/2v/av9p/2f/Zv9m/2b/ZP9i/2L/Xv9a/1b/U/9P/0z/R/9C/z3/N/83/zP/M/83/zz/Qv9I/1D/V/9e/2X/a/9v/3X/ef98/33/ff9+/33/ff9+/3//gv+F/4n/jv+Q/5D/kP+Q/47/jf+O/4//kP+R/5H/kf+Q/47/jf+J/4b/g/+B/3//ff98/3v/e/96/3v/ff9+/37/fv9+/33/fP96/3j/df9v/2j/Yf9Z/1D/Rf8//0H/TP9d/2z/e/+G/4v/jP+M/4v/i/+L/4v/i/+L/4v/i/+K/4v/if+E/37/dP9n/17/Wf9Z/2H/aP9v/3b/dv90/3P/cP9v/27/cP9x/3H/cv92/3X/d/96/3v/fv+C/4T/hf+E/4H/ff95/3X/dP94/3//h/81gDVoNYA0ajJ/MGswfy9tLn8tbS1/LG4tfyxuK38rbyp/KnEofyhxKH8ocSl/KXInfydyJ38ndCh/KHUofyd1J38ndSh/KHUnfyd3KH8ndyd/KHgpfyl5Kn4qdyp+Kncsfy51L381cjqBQXBGhk5rVYdYZ1yIXmVgiGFjX4leYVuJWGJSh09jSoVFZkGEPGc7gDhrMH4tcS19K3MrfS10LX0tdC19LHQrfStzLH0sdSx9LHUtfS51LnwudS18LXUtfC11Lnwudix8LHcrfCp3KXwpdyl8KHcnfCd3J3wneSd9J3olfSV6JH4keiR+JHoifiF6H34feiB+IHsffh97H38feh9/IHogfyB6H38feh9/H3ogfx96H34fex9+IHshfiF8In4ifCN/I3wjfyR9JH4lfyd+J38pfit9Ln4xfDN+Nno5fj13Pnw+eD98P3dAfUR2R31Mc1F/V2xcf2BqY4FnZ2mBbWRwgHVjeoJ+YIGDhmKHhYZfh4WEXICHfVx5h3VecoZvZGmEZWlkhGRoZoVrZHCFeF+ChohfioWLXY6Ej16UhJRck4SRXI+Ci1yFgn1ceIN0XHWDd1x1g3ZedoN1X3WCdmF1gnVhd4J0YnKBcmRvgW1la4BqZ2qAaGxnfmdsZ39la2Z+ZmtkgGZraYBraWyAbWdwgXFlcoFzZHSBdWJ1gHVkdYF0Z3WBdWd0gHRpdYB2anaBd2l4gnlmfIJ9ZH6Cf2GBg4JegYOBXYKCgF2BhIFchYSFWoaEiFyHhIdfiYSJYImEiWSKhIpnjIOLaYyEi2iJhZNkn4abYJmDm2KggaNopH+kbaJ7nW+cfZpploGUXZGEc1wzgkRsWH9ndXV/g3aPgJR5lH6TeZN/kHiOf413jH6IdoN9f3R9gHlwen55bnmAeW16gnxufYF9b3eCc3NpgmN5XX9bfGSAZH1lgGN+WH5Yflh+WXxWgFZ6U4BDejZ/MoEvfjeIPX08jjp8N5A+e0uNU314iHh9XYNIfFCAaHxwfWp/Z3lYglV9UYFRhUCAQYs/fzyNN38+jEJ/RIpGf0eLR4BGjkV/R4xGgEaLTYBUiEaBP4VCgkKEQ4FNhVCBToRLgkuFSoBJhUmAT31WgFd0WYBTaEWBRWRPgTZlOIFGalV/VWxHfkNwWH1NdVh6ZHxte3h9f36AeX9+fXR6fnlyeX55c3l/e3J6f3tze357dnp+eHN2gHNwb4BtbWuAa2xrgGxtbYBvb26AbHFogmJ0WYFLdj+ANHkwfyx5K30seSx9LngxfjhzQH1Hck58VXBcfWRsan5sZ2p/amdogGhpaIBna2aAZmxjgF9sXoBaa1WAUWhMgEhqQoA+bDp/NHAvfjF2M302dzp+QHZEfkp1UX5ZdGB+aHVtfXN3d3p6eH16fnt+en5/fHp+fn95f32CeYd9iXqOfo96j3yPe497j3uPfI97kH6Qe5B/kXuRf5F7j3+Neot+iHuEe4F+f3p+fn15e3x7eHp8e3h9fH15fnx+en17fXl6fHl4dnxyc259Z21igVpsUINHbUKARXRQemF8b3R9goZ2i4CLeot6inyKeYt8i3qLfIt6i3yLeot8inqIfoV4fYByb2iEX2dahFtpY4BrcHN+d3R3fXZ0c31wb21/bm5xf3FtcX5ybnR+dm93fXdweXt+coN7h3KIfIdvhX6CbYF/fG98f4FziH+NdjP/M/80/zL/Mf8x/y//L/8u/yz/LP8r/yv/LP8r/yv/Kv8q/yj/KP8o/yj/KP8o/yf/J/8n/yf/KP8o/yf/J/8n/yf/J/8n/yb/Jv8n/yf/J/8p/yn/Kf8q/yr/Kv8q/yr/Kv8s/y7/Mf85/z//RP9M/0//Vv9a/13/X/9h/2H/X/9a/1j/WP9V/1H/S/9H/0L/Pv83/zP/MP8u/y7/Lf8u/y7/Lv8t/yz/LP8t/y3/Lf8t/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lf8t/y3/LP8r/yv/K/8q/yf/J/8n/yf/J/8n/yb/Jv8l/yX/JP8k/yP/Iv8g/yD/IP8g/x//H/8f/x//H/8g/yD/IP8g/yD/IP8g/x//IP8g/yD/H/8g/yH/If8i/yL/I/8j/yP/JP8k/yX/J/8n/yn/Kv8t/zD/M/83/zf/O/88/zz/PP88/z//Q/9H/0v/UP9W/1n/Xf9d/2D/ZP9m/2r/bf9y/3f/e/+A/4T/iP+I/4j/h/+F/4H/ff99/3j/df9z/3H/cP9y/3T/fP+C/4j/if+K/43/jv+P/5P/k/+S/4//jf+K/4L/ev91/3L/cf9z/3L/cf9y/3H/b/9v/2z/bP9n/2X/Zf9l/2H/Yf9e/13/Wf9Y/1f/Vf9V/1b/V/9X/1f/Wv9c/2D/Yf9i/2T/aP9o/2n/af9q/2r/av9q/2n/aP9o/2r/av9p/2j/af9r/27/b/9y/3T/d/96/3z/fv9//4D/gv+E/4T/hP+D/4P/hP+F/4b/h/+I/4j/iv+L/43/jf+M/47/jv+O/5f/mv+Y/5T/mP+e/6L/of+c/5T/iP+A/3z/j/+S/43/jf+C/0H/Rv9Y/2f/df+D/4z/kv+U/5P/kP+O/47/jP+K/4f/g/9//37/fP98/3z/ev96/3v/ev99/33/e/92/1//Yf9e/1b/X/9e/2T/ZP9a/1f/Vv9e/1//Uf9X/0P/Of8z/zL/Of87/zv/Of83/zj/QP9I/0X/Nf89/0n/S/9D/0H/bP9v/2n/Vf9H/z7/Ov9D/0H/Pf9H/0T/Qv89/zz/O/87/zj/OP81/zn/Of9A/1T/Tv9G/0D/P/9F/0r/Sv9M/0v/Sf9G/0j/Tv9Z/2L/W/9V/03/Rv9K/1X/V/9O/0X/S/9K/0X/V/9O/1X/XP9l/3H/ev+A/3//fv97/3n/ef95/3n/eP95/3r/e/97/3v/ev94/3T/cf9t/23/a/9r/2v/bP9v/3D/bv9s/2j/Yv9Y/0r/P/80/y//L/8v/zD/Mv81/zn/Pf9E/0r/U/9a/2D/Z/9r/2v/av9q/2n/Z/9m/2b/Zv9l/2H/X/9a/1b/Uv9L/0T/Qf87/zb/MP8u/yz/L/8y/zX/PP9B/0b/Tf9U/1z/Y/9p/27/c/93/3r/ff9+/4D/gP+A/3//f/+B/4T/iP+M/4//kP+Q/4//j/+P/4//j/+Q/5D/kP+R/5H/kf+P/43/i/+G/4X/g/+A/33/fP96/3r/ev97/33/ff9+/37/ff99/3r/ef93/3T/b/9o/2T/XP9T/0r/Rf9I/1L/Y/9y/4H/h/+N/4v/i/+K/4r/i/+L/4v/i/+L/4z/i/+K/4r/hf99/3L/Zf9d/1z/Yf9o/23/df94/3f/df9z/3D/b/9w/3D/cP9y/3H/cv90/3X/dv95/37/g/+H/4n/if+I/4X/gv+B/4P/iP+M/47/MoAyaTCAMGswfzBrLn8ubSx/K20rfypuKX8pbip/Km8qfypxKH8ocSd/J3Infyd0J38ncyd/J3Unfyh1KH8odSh/KHQnfyd0J38ndyZ/J3cpfyl4KX8peSp+Kngqfip4Kn4qeCp+KngtfzB2NoE6cUCCR2xOhFNpWoZcZVyIW2NeiF9iXYlcYVuJWGBWiFNfTYRJYUN/OWgzfTFuLn0ucS59MHIufS9yL30ucy59L3QvfS90L30vdC98L3QvfC90L3wudS98L3YtfC14LXwseCt8K3grfCp4KXwpdyh8KHkofSh6Jn0meiZ+JnwlfiV8JH4jeyF+IXshfiF7H34fex5/HnoffyB6IH8geiB/IHohgCF6H4AheiB/HnsgfyB7IX8heyJ/I3skfyR8JH8lfSV+JX8mfih/KX4qfyt+Ln0vfjN8Nn45ejx+PXg9fj13QX9Fc0eATHJQgFRvVoBYbVh+WW5YfltuX35jbGh9b2l1f3plf4GFYIqCjFyKhIhbhoWDXoGGgF19hXxceoV5XHuGfV2EhYlfiYWLX4uEjF+OhJFfkYSRXpGEkV6OgodefoJzXnGBcF5tgW1laoFqaGiAZG1jfmBuXHxbcFp8WHFUe1JxUHtPck18SnRIfEh1R3xFdUN+RHRIgEhySYFLcE2CUmxSglZpWIJaaFuCXmdgg2BlYIFdZl6AXGdbgF1nXIFeaV+BXG1bf1tvXX1dbmF9ZW5qfW5tcn91anh/e2l+f4FlgoGCZISDhWKFg4VihoKGYIaChl+HgYlgi4GHYH2ChGGNgZVil4KVY5OAlmWcgKFrooCZbol/fG55fXtvcHp4Z4x9jFyLhIlWXIRMZViBaHR2gYR3jICReJN+kniPfY13jX2LdYl9h3SDgH9yfX1xcmJ6b3F6e3pveYJ8bICFfWyChX5yaYNbe1eAWH1agF54ZIBodll/SHxKf06AS4A9f0uAR3w3gUN9OoA6hjt+OYw1fDaPNnw5kDt8RI07fTeGP35HgUF/TX5TgFN/dn9kglB+P4k8fUONQ35KjEiAP4tGgDiJSoByg31/d3lzg250VoVUeD2FTX9qhFCCSoNDhUaCSoZIgUeHRYFGiEN/RIlHf0+GWIFWf09/TnZLgEZwRIBHa0eARWtXf0lwUX1ZdFN8U3Zfemx6dHt7e39+fXd9fnpzeX54cnl+eXN6f3pyeX97c3uAenJ5gHZvdIFxbW6BamxqgWtsbIFsbW6AcXBvgG1yZ4Bhc1WASHVAgDZ2NH81djeAOXQ8gEBzRYBIcUyBUm5Wf15tZH9pa2x+bGtrf2traIBma2eAZGxkgGJtYYBcbVeAUm5MgEVuPIE3bzJ/LXQpfCl3KnwuezJ7N3s8fUN4SH5PdFh+X3Jnfmp0cH11dnd6enl9en5+f3p/f4B6f36AeYJ9h3mLfY56kH6RepB8j3uPfI97j36Pe49+kHuQf5F7kYGQe4+BjHqKf4d7hH2CfYB7fX17enx8fHh6fHx4fnx+eX58fnp+e316enx5eXd8c3NvfWltZIFdbVaDTW5IgEt0VnpmfHV0g4CIdox+jXqNeot8i3mMfIx7i3yKe4p8inqLfIt6iH6Fd3yAc29mgl5nXYJjaWmAcnJ3f3h2d351dHF+cHFxf3FycH9wcXF+cnByfnJycn1zc3Z7fHWCeoZ4iXuKd4p8iHSHfodxiH6Lco5+kHQx/zH/MP8w/zH/Mf8v/yz/Kv8p/yr/Kv8o/yj/Kf8p/yn/Kf8o/yj/J/8n/yf/J/8n/yf/J/8n/yf/J/8n/yf/Jv8m/yf/J/8n/yf/Jv8n/yn/Kf8p/yn/Kf8p/yr/Kv8q/yr/Kv8q/yr/Kv8t/zL/OP8//0X/Sv9O/1P/V/9Z/1r/Xf9f/2D/Yf9g/2D/X/9Z/1P/TP9E/zr/Mv8w/zD/Lv8v/y//MP8w/y//L/8v/zD/MP8w/zD/MP8w/zD/MP8w/y//MP8w/y7/Lv8u/y3/LP8s/yz/K/8p/yn/J/8n/yj/KP8m/yb/Jv8m/yX/Jf8k/yP/If8h/yH/If8f/x//H/8f/x//IP8g/yD/IP8g/yH/If8g/yH/If8i/yP/I/8j/yP/JP8l/yT/JP8k/yX/Jf8l/yb/KP8r/yz/K/8u/zD/Nf83/zv/PP89/0D/QP9F/0n/Sv9N/0//U/9U/1T/Vf9U/1X/Vf9X/1v/Xv9m/23/df99/4L/h/+M/4v/iv+I/4T/hP+F/4L/gf9//37/f/+E/4j/iv+K/4v/jP+M/43/j/+Q/5H/kf+R/47/h/96/3L/a/9o/2b/ZP9i/13/W/9Y/1X/U/9Q/0v/SP9G/0L/P/8+/z3/O/84/zf/N/82/zf/OP85/z7/Qf9D/0X/SP9L/0z/UP9T/1X/V/9Z/1f/V/9W/1X/Vv9U/1P/Uv9R/1H/UP9Q/0//T/9P/0//Uf9U/1j/W/9h/2X/av9v/3b/ev99/3//gf+E/4X/hf+E/4T/hf+F/4X/hf+H/4H/cP9//4z/j/+P/5T/mf+d/53/m/+X/4v/gf99/37/fv98/27/fP+K/4z/i/9z/0z/Wf9n/3b/hP+L/5D/k/+R/4//jf+N/4v/if+H/4X/gv+B/2n/Yf9t/2P/ev+B/4X/h/+I/43/gv93/2r/Yv9c/1b/VP9h/1z/Rv9D/0j/Uf9S/0j/Uv9i/13/TP86/zr/O/82/zX/Nv81/zb/NP85/0X/QP82/1j/aP9f/1X/Tv9U/1n/T/9G/zv/P/88/0D/Qf9F/0n/Pf80/2P/f/97/27/V/9k/2r/Tf9L/0z/SP9K/0n/S/9N/0r/Rv9D/0L/Qv9B/0H/SP9M/03/Tf9L/0X/Pf8//0D/QP9L/1D/Rf9X/1j/XP9f/2L/bP91/3z/f/99/33/ev94/3f/d/94/3n/ef96/3r/ev95/3j/ev96/3L/a/9r/2j/Z/9r/2v/bP9v/2//a/9m/2D/Vf9K/0D/Ov86/zv/P/9C/0T/SP9O/1L/Vv9Z/13/Yv9n/2v/bf9t/2n/af9o/2j/Zv9m/2T/YP9d/1j/U/9O/0j/Pv81/y//LP8p/yn/Kf8q/y7/Mv83/zz/Q/9I/0//Wf9g/2X/a/9z/3X/d/96/37/f/9//3//gP9//4H/g/+H/4v/jv+Q/5H/kP+P/4//j/+P/4//j/+P/4//kf+R/4//jv+L/4j/hv+E/4L/gP9//33/fP98/3z/ff9+/37/fv9+/37/ff97/3j/dv9y/23/af9l/1//WP9P/0z/Tv9Y/2j/dv+E/4r/jP+M/4z/i/+L/4z/jP+L/4r/i/+L/4v/i/+I/4T/e/9x/2f/YP9h/2f/b/91/3r/ev93/3X/cv9x/3H/cf9w/3D/cf9y/3L/cv9y/3L/dP95/37/hP+I/4r/iv+J/4v/i/+L/43/kP+P/zKBMWoxgS9sMH8wbC9/K24rfyttK38qbil/KG8ofyhwKIAocSeAJ3IngCd0J4AndCZ/JnYmfyZ2Jn8ldCZ/JnQlfyZ0J38ndCd/J3cofyh3KX8pdyh/KHcpfil4Kn4qeCp+Kngqfip4KX0pdyt9LHcugDRzOoFAb0WDSWpOhFNnWIZZYl6JYGBhiWJeYolkXGWFXmBVgUxkQX42azF7MG8vfC5wMHwwcDB8MHIwfDFyMnwycjF7MXIyezNzM3sxczF7MXMxezFzL3ovdS96L3UufC51LXwsdit8K3cqfCl4KXwpeCh8KHknfSZ7Jn0mfCV+JHwifiJ6IX4heh9+H3sgfyB6H38geiB/IHohfyF6IYEgeiCCIXkjgSZ5KIEpdyiBJ3cmgCV2I38kdyV+JXwnfSR8Jn0pfyp+K4Asfy99Mn41ezl+PHk/gUJ2RYFHdEmAS3NOgE1zUIBSb1WAVW5XgVduVoBXbleAWG1ff2NqaoBvYnqDgl6Hg41cjIOKW4eEhV2FhIZehoWGXIWFhFuEhoVbiIaJXIqEil2MhIxejIONX4+DkV+ShJFgj4KHYXx/cWRmfl5nXXtabVV6UnROeUl3Q3k/eT15On05eTV9MnkxfjJ6Mn4zfDB+Mn4yezKANXs5gT15P4NCdUaDSHJKhE1uUIRTbFWEVWlXhFdoV4RXZ1aEVmdXg1NoUINPaU6BS2tIgERwP30+dTp7OnU+e0J2RXtKdlF7U3RZfV9yZH1pbnB+d219gYBqg4KHaIaBhWeDg4Jkf4ODZoSDh2SKgo5hi4KOZJCAl2icfpxulH2QcYyBim6EgHdrc39/bIN/e29yf3xqe4R7ZYKGWmlagWdvdYCDcol+j3WSfZB4j3yOd41+i3SKgYhxhISGbIuDd29wfnFucn9vaIuBlGaUhZFnjIN4cGuBb3pogF17WIFmd2OAXXRbgEZ7R39Pflp/Y35tf2Z7O4BNfkd/OoY3fjiMNn43jzh+No81fjmNQn9EiEV/WoRgf1SCT31IhUl6SopAekCNPXw/jkJ9TolafmOFSH48gzKAV4B6f213XYBNclCCWHZSgk5+SoJNg06CSoRHgkaHTIFNiEaAQYtBgDuMO4A/jER/R4hJgEmFRoBJgkqATH9Kf098T38/dlh+WHJSe2J1aHtvenh8fnt+f313fIB5c3d/dnF2gHdyd4B2c3mAeHN6gHdydoBvb2iAb216f4JufoFzcWx/anJvgHJ5an9peGd/XHVTgUxySIFDb0WBR3FKgk9wUoJUbleCWWxbgmBrZoFoa2qBa2hsf2tpa4BqZ2iAZ2pmgGRsYYBfbluAVm9RgEpxQYA4cy9+K3YofSh8KXsofyh7LH4zfTh8O3xCd0x+U3VafmF1Z3xtdnJ7d3l6ent7f3mAf396gIB/eoB+gXmEfIZ5in2PeZF9kHuPfY97j36Pe49/j3uPgJB7kICQe46Aj3uOgIt5iH+FeYN/gXt/fX97fXl9fHt6fXx9en58fnt+fH57fXt8eXt8eHl1fHFybX1qbWaAYWxZglNtTX9Rclx6bHt6dYSBi3eNf4x7inqLfIt5i3yLe4x8i3uLe4x6i32Keoh+gXZ8gHJxZoJjZ2eBaWpzf3lye356dXZ/dnZzf3N0cH9vc29+b3JwfnFxcn5ycG9+bnNxfHV1enp/eoV4iHuKeop4jHuMdJB9kXSRfo90Mf8v/y//Lv8t/y3/K/8q/yv/Kv8q/yr/KP8o/yf/J/8n/yf/Jv8m/yb/Jv8m/yb/Jf8m/yb/Jv8m/yX/Jv8m/yX/Jv8n/yf/J/8n/yj/KP8p/yn/Kv8q/yv/K/8q/yr/Kv8q/yr/Kv8q/yr/K/8s/yz/LP8w/zX/Of8//0X/Sf9N/1P/Wf9e/2L/ZP9m/2n/af9m/17/VP9I/zz/M/8x/zD/Mf8v/zD/Mf8x/zH/Mf8y/zL/Mf8x/zD/Mv8y/zL/Mf8x/zH/Mf8w/zD/L/8v/y7/Lv8t/yz/K/8r/yr/Kf8p/yn/KP8o/yf/Jv8m/yb/Jf8k/yL/Iv8h/yH/H/8f/yD/IP8f/yD/IP8g/yH/If8g/yD/Iv8k/yf/LP8v/zD/MP8v/y3/K/8n/yb/Jf8k/yb/Jv8n/yj/Kv8r/y//M/81/zn/Pf9A/0P/Rv9J/0v/T/9Q/1D/Uf9S/1L/VP9W/1j/Wv9c/13/Xf9e/2H/Zf9q/3L/eP+A/4b/jP+O/4z/h/+F/4X/hv+I/4j/iP+H/4f/h/+H/4j/iv+K/4r/iv+L/43/kf+U/5P/k/+Q/4n/fP9s/1z/Uf9O/0z/Rv8//zv/Of81/zP/Mf8u/y//MP8u/y7/Lv8u/y3/L/8y/zP/M/82/zz/Pv9C/0X/SP9L/03/UP9S/1T/V/9X/1f/V/9Y/1j/V/9W/1T/U/9S/07/Sv9G/0T/Pv86/zT/Mf8v/y7/Lv8y/zj/Pf9C/0n/T/9V/1v/YP9n/27/dv96/37/ff+A/3r/dv95/4L/iv+N/5D/kP+R/5n/m/+Z/5X/kf+O/5D/jv+O/43/if97/27/c/9t/2z/ef+A/47/m/+W/3b/fv92/4D/jf+O/4L/ev+D/4v/jf+N/43/jf+R/5P/j/90/3D/ff9//3D/eP+Q/5L/lP+C/2P/Yf9n/2r/Y/9V/1z/W/9c/1D/UP9P/0n/Wv9k/1j/Of8c/03/S/89/zj/OP83/zj/O/83/zb/Pf8//0f/Y/9U/07/N/88/zb/OP89/0b/RP9B/0H/Q/9L/1f/Xf9D/0b/PP9h/1z/Yv9l/1v/QP8//0r/RP9O/1r/Vv9Q/0j/Rv9G/0j/Q/89/z7/O/84/z3/Qf9H/0n/Sf9K/0z/TP9O/0//Uf9Y/1r/WP9Z/1j/Wv9l/3D/ef99/33/fP97/3j/d/91/3b/dP95/3j/c/9z/3b/cP9m/0r/TP9b/3D/hv+Z/3//YP9Y/1z/U/9H/0v/W/9e/1n/Uf9M/0j/Sv9M/1H/Vv9Y/1r/W/9e/2P/Zv9r/23/bv9t/27/bP9q/2n/aP9n/2X/Y/9i/2D/XP9U/03/R/89/zT/Lf8q/yj/KP8p/yj/KP8s/zL/N/89/0X/TP9T/1v/Yf9o/27/dP94/3n/fP9//4D/gP9//3//gP+B/4T/hv+K/4//kf+Q/4//j/+P/4//j/+P/4//kP+Q/5D/jv+P/47/i/+I/4X/g/+B/3//fP97/3r/ev99/33/fv9+/37/fv99/33/e/94/3P/b/9s/2n/Zv9h/1v/Vf9S/1X/X/9t/33/h/+L/43/jv+O/4v/i/+L/4v/jP+L/4v/jP+L/4r/iP+B/3v/c/9p/2b/af9t/3T/ev97/3r/d/91/3P/c/9y/3D/b/9v/3D/cf9w/3D/bv9r/23/cf92/3v/gf+G/4j/iv+M/47/kf+R/5H/j/8wfy9rLn8ubS1/LW0rfylvKn8pcCh/KHApfyhwJ38mcSZ/JnEmfyZyJYAldCWAJXQmfyZ0Jn8mdCZ/JnQlfyV0Jn8mdCd/J3Qofyh3KX8pdyl/KXcpfyl3Kn4qeCp+Kngqfip4Kn4qeCt9K3gsfSx4LX0tdy1+LnMwfzZxPIBBbUaETGpRh1hmXolkYWeJbF1thmtdZYFbYk58Qmg3ejFuMXsycDJ7MnAxfDJxMnwycTN7M3EzezNxM3sycjJ6MnIyejJyMnoycjF7MHMvey5zLXstdC17LXUtey12K3sqdyp8KncofCh4J3wmeiZ9JnslfiR6JH4ieSF+IHogfiB7IH8geh9/IHohgCB6IYAgeh+DInomhCt3L4Y0cDyGPmk+hj5pOYM2azCBLHApfyh1J34peSl+KXwqfy58MYA2eTmBPXVCgUZzR4JKcUyCT3FQglJwVIJUcVSDVHFWg1ptXIVgZ2SEZWRlhGViZoRpYnGEdWF7hIBfhYOMXY2DjVyJhIddhYSGW4mEiluJhIlciIOIXoeDiF2Hg4ZeiIOIXYqDjGCPg5Jhk4OSYYyBiGR6fmhnUnxFbkF7PXU5ejd7M3kxfzB5MIEwey6CLnsvgi18LYItfi2CLn4ufzCANHw4gTx5P4NCdUaDSXJKhExvT4RSbVKEVmpYhVhpWoVaaFqFWmlYhVhpV4RTaVOETW1LgkZvQoE7dTZ/MHktfi18LX0rfSt9LHwwfTF8N3w7ekF9SHZSfllxYH9mbW2CcGl2g3Vmf4WMZJCEj2OShJNmlYKaaJ9/nW6ZfoRzbX6RcomCkmqSgpFnkoKQaI2Fg26hgbR3vH69e75+vn6+frt7sIGedZF/fXB5e4Fxh3mBdHF6dHKCfYdviIB6bll/e3CDgGtteoCLbYJ+bWxjfXVveH53c2p+XHlmfmp+a39ofWWBYntggVJ9VIBVg0t+RYRPgGKBXIIrfyiCPYI+gDyGO385izt+QIxFfjyMOX44izp+RotDfkCJR30/iDp9OYo4ezeITHxAiUF8Q4lFfUqFVXxThEZ/SYNfgV18U4JadmWDUnlSg1h9OYNCfWiEcnpog1V8SYJGhESBQYlCf0KMP386jTd/O41AfkONR39IjEmAS4pNgFCIUoFShlWBWIFbf1t6WHxgeWZ7b3t6fH56fX58dnp/d3N2f3dwdYB1bnmBdG5fgWBud39ob2J/a29yf250boBhfWB/SoRHfUaJSX5OiU5+RYRZfmJ4XIBVb1CBUG9RgVZxWYJbcF2CYG5kgmVsaYFtam+BcGlvgW1oa39paWqAaGpogGdrZYBlbmCAXXBagFRxTIBEczuAMXUqfil5KX0peyh7KXwpey17NH45eD99RnNOfVVvXH1jcmp8cHZ1e3d5e3p9fH95f4B+eIGBgHiAgIB5hH2IeY1/kHmSfZB7kH2Qe5B+j3uPf5B6kICQepCAjnmNgIt5i4CLeYiAhXmDgIB6fn17enl5eXt6eX17fXp9e357fnt+fH17e3x5fHZ5c3xwc2x9aW5lgGFrXIJXbFV/WHNienB9fnaIgYx4jX+Le4p7i3yLeot8i3uLfIt7jHuMe4x9i3uHfoB1e4BzbWyCa2VtgXJqd4F7c3yAend4f3R0c39zcm9/b3Nufm5ycH5xcXF+bnBrf2hzaH1sdXB6dn1+eIR+iHiIe416kHeRfJJ1kH2PdS//Lv8u/y7/Lf8r/yr/Kf8o/yn/KP8n/yj/KP8m/yb/Jv8m/yX/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8l/yb/J/8n/yj/KP8p/yn/Kf8p/yn/Kf8q/yr/Kv8q/yr/Kv8q/yr/K/8r/yz/LP8s/yz/LP8t/yz/Lv8y/zn/Pv9D/0v/Uf9Z/2D/aP9t/3L/cf9r/2P/Vf9I/zr/M/8y/zL/Mv8y/zL/Mv8z/zP/NP80/zT/NP80/zP/M/8z/zP/M/8z/zP/Mv8x/y//Lv8u/y7/Lv8u/y3/Lf8r/yr/Kv8q/yj/KP8n/yb/Jv8m/yX/JP8i/yH/If8g/yD/IP8g/yD/H/8g/x//IP8g/yL/Jf8q/y//M/85/0D/R/9L/0v/S/9H/0P/Pv83/zD/K/8p/yr/LP8t/y//Mf81/zf/Pf9B/0b/Sv9M/0//T/9S/1T/Vf9W/1b/WP9Y/1z/YP9l/2j/bP9t/27/bv9u/3D/cv94/33/gf+G/4v/jP+M/4j/hv+F/4b/iP+J/4r/iv+K/4n/h/+H/4b/hP+G/4b/iP+L/47/kf+U/5D/jP+H/3v/af9R/0T/PP83/zf/M/81/zP/L/8v/y7/Lv8u/y7/Lf8t/y3/Lf8w/zD/M/82/zr/Pv9C/0T/SP9K/07/Uf9R/1L/Vv9X/1j/Wf9Z/1r/Wv9a/1j/V/9V/1X/Uv9O/0r/Rv9A/zn/Nf8x/y3/LP8s/yz/K/8r/yz/LP8t/zD/Nf87/0T/TP9U/1v/Yv9l/3X/jv+U/5f/kv+U/5X/mf+e/5//mP95/2v/b/9t/47/kP+S/5H/kv+S/5L/of+2/7v/uf+7/73/vf+9/7z/u/+7/7T/lv+H/4P/iP9//3b/cP9p/2j/av9r/1//Xf9g/3b/d/95/3v/a/9V/1b/cv+D/27/Vf9a/2r/bf9q/2z/bP9g/13/VP9R/1T/Tv9K/1P/dv91/zz/NP8x/zP/O/88/zz/Ov9A/0v/R/84/zT/N/8//0b/RP9M/0X/O/88/zn/O/9K/zz/Qf9D/0X/Sf9V/0v/SP89/03/af9l/1r/Vv9K/1b/T/87/27/bv9u/2n/WP9M/0X/QP8+/z3/Pv9B/zz/OP86/zz/QP9D/0T/R/9J/0r/S/9M/07/Uf9W/1v/W/9Y/13/Z/9x/3X/fP99/3j/eP90/3P/dv92/23/Vf9z/23/bP9k/13/Xv9p/27/Zv9e/0P/RP9O/1D/Uf9K/0T/SP9d/2z/Zf9g/1r/Vf9U/1f/Wv9c/17/Yf9k/2b/af9s/2//cf9x/2//bf9r/2n/av9o/2j/Z/9l/2X/YP9b/1j/Uf9K/0L/Of8w/yn/KP8p/yn/Kf8q/yz/MP84/zv/Qf9J/0//V/9e/2X/av9w/3b/eP97/33/f/9//3//gP+A/3//gv+F/4r/jP+Q/5L/kP+Q/5D/kP+P/4//kP+Q/47/jv+M/4z/i/+L/4n/hv+D/4H/f/99/3v/ef96/3v/e/97/3z/ff99/33/ev95/3b/c/9x/27/av9n/2T/YP9c/1f/V/9d/2X/c/9//4r/jf+N/4v/i/+L/4v/i/+L/4v/i/+M/4z/jP+L/4f/gP97/3P/cP9u/3H/df95/33/ff97/3f/c/9z/3P/cP9v/27/bv9u/27/bv9r/2n/aP9p/2r/bf9x/3r/gP+F/4j/jf+Q/5H/kv+Q/4//LX8tbSx/LG8rfituKH4nbyh/J3AnfydwJn4mciZ+JXIlfyVzJX8lcyV/JXUlfyV1JX8ldSV/JXUmfyZ1Jn8mdSZ/JnYnfyd2KH8odyl/KXcpfyl3Kn4qdyp+Kngqfip4Kn4qeCp+Kngsfit4LH4seC19LXcufS52LX0tcy59MnI3gDpwP4VKalKIXWNoiG1bcYZzWW9/ZF5YektmPXk0bzJ6MnAyejJwMXwycjN8NHI0ezRxNHs0cTN7M3AzejNwNHo0cTN6MnExejJzM3oxczF7L3IwezB0LnsudSx7LHYreyt2KXwpeCh8J3onfCd7Jn0leiV9I3oifiF6IX4heiB/IHoffyB6IX4ieiOBJHkohC90NYY9bUeKTWRSiVZgWYlbYlaIUmRKg0NpPII2bjCBLnIvgTB2NII0dTmCPXRDg0ZySoNMcE+EUnFShFVwVYRXblqEWmxbhFxrYIRiZWaGbWByhXRbc4ZxWHGGc1p1hXlZfoeCV4WEiliLg4lWhoSFWYWEhlmJg4tZi4KLXYqBh2OFgYRlg4CBZYGAgmWGgIljjIOQY5KCkmWOgotmgIFvZ12BUmtMgkRxPIE4dzSBNXo0fjF+LX0tfy98L4AtfS2BLX4ugTKAMn42gTh6PoNCdUWCSXBKg0xtT4NQa1OEU2tWhFdrWYRZalqEW2hahFpoWYNXaVWDVGlQgkxtSIFCcj1/Nnkxfy59K34rgCx+LIEsfiyALH4sfy1/MX00gDh5P4FJdU6CVG5ZhG1okYaZZJaFlmKMgo5pnX6abpR8kXJ9f11zNYFjcoWBhGuJgZBokYGUaJSBn2u4gL58vH+7f79+v4C+fr2AvH6+f7Z9s366f6R3hISIbIaEiWiBgnxnX31SbWd8Y3Vzf3ByZ353cnp/e296f2xxV35cdmR+WH5MfVuBY39mgmJ+XYNhfmeHV31IiUd9ToxNfUyKWn5th2iASoI6gjmCSYBEhT5/PIg4f0SJQX85hzZ/N4ozfUWLWX5TikF/M4c5fjyHPH5Jhk1/QohEfUWHQ31KhVZ+RYdEfjmGTX53f3CAa30ygUKAQIFBgHWBeXdugmdyYIJSeU6CRoI/gT+HPYA+iz5/PIw7fzqOPn9CjkR/Q4xEgEaMR4BGiUiASolQgFOFV39ZgVt9XXxnenF+d3t4eXp8eXd2fXR0c39scXJ/bmxtgG9qcoFmbUeCNm9AgWR4YX9Igkt+S4lMfUyLSH1GiUx/XIBrgHB4a4FocGOBXW5Zg1dvWYNacF+CYXFjgGhwaYFra2+BcGpxgXBoboBsZ2qAaGhogGhpZ4BmbGSAY25ggFpwV4BPcEeAP3M1gC11KX4neyd9J34rfCx+MHw0ezp/QXVEf0txUn9acF59ZXJtfHJ2dnt5eXt6fXx/eH+Af3d+gn93f4GDd4Z9iXmMfY96kX2QepB9kHuQfo97j3+Oeo+BjnqOgYx6jIGLeomBh3mFgIJ5gIB+enx/enp5enh7eXp7e3t8e3t8fX17fXx5fHZ8c3tweGx7aXJofGZvY35gbFyAW21Zfl50Z3p1foF3iYCMeY1+jXuLe4t9i3uLfIt7i3yLe4x7jHuLfYp7h36BdHuAdWhxgnJkdYF5anuAfnJ9f3p1eH90c3N/cnJwf3Byb39vcm9+b29wfm1van9ncWZ9Znhse3B9d3h9fYJ2iHyMeI95kXuSdo98jXUt/y3/LP8s/yv/Kf8n/yf/J/8n/yb/Jv8m/yX/JP8k/yT/JP8k/yT/JP8k/yT/JP8k/yT/JP8k/yX/Jf8m/yb/Jv8m/yf/J/8o/yj/Kf8p/yn/Kf8q/yr/Kv8q/yr/Kv8q/yr/LP8s/yz/LP8t/y3/Lf8t/y7/Lv8v/zH/L/8u/zL/NP87/0T/TP9Y/2L/av9z/3b/cf9p/1n/TP89/zX/M/8z/zL/M/8y/zP/NP80/zT/NP81/zX/Nv82/zb/Nv80/zT/NP8z/zL/M/8z/zP/Mf8v/zD/MP8w/y7/Lf8t/yz/LP8p/yn/Kf8p/yj/J/8m/yX/Jf8j/yL/If8h/yH/IP8g/x//IP8h/yL/JP8o/y3/Nf8+/0j/Uv9X/17/ZP9l/2f/Zv9h/1n/Uf9H/0H/O/81/zT/Nf83/zr/P/9D/0f/Sv9M/07/Uf9U/1b/Wf9Z/1r/W/9b/1z/YP9l/2r/bv9y/3b/dv92/3T/dP92/3n/ef9+/4L/hv+I/4j/iP+E/4T/hf+G/4f/if+K/4r/h/+F/4H/fv96/3n/ef96/3//g/+K/4//kv+R/4//jf+F/3n/bP9j/1z/V/9Q/0n/RP86/zf/Mf8u/y//Lv8u/y3/Lf8t/zD/Mf82/zj/Ov9A/0T/SP9J/03/Tv9P/1D/U/9T/1b/V/9Z/1n/W/9b/1r/Wv9Y/1j/Vf9S/1D/Sv9F/z//Of80/y//Lf8s/yz/K/8s/yv/LP8t/y7/MP8z/zb/PP9C/0j/Tv9U/1T/hf+e/5n/mv+d/37/a/95/27/Xf9w/3j/iv+V/5j/lf+K/3v/XP9d/4T/lf+2/73/vv+9/7z/vf++/7//vv+5/6b/bP9z/7P/uP+w/4b/mP+d/6H/d/9J/1r/aP91/4H/gf96/3z/e/97/3v/c/9j/1L/V/9i/0//Uf9R/1//Uf9B/0H/S/9Y/17/Uf9O/0z/Sf9P/0z/Uf9Y/z7/OP9G/0X/Qf88/zX/Q/9P/1H/Of84/zf/PP9J/2D/Sv9M/1D/Tv9V/0//Q/9E/0L/Uv9M/0r/VP9C/0b/PP9W/3j/a/9E/z7/PP88/3H/ef93/3H/Zf9m/1j/SP9G/0b/RP9C/0D/Pf86/zn/O/89/0D/Q/9E/0b/R/9I/0n/Sv9N/1H/Uv9W/1j/V/9X/2j/df94/3f/e/95/3n/dv9z/27/YP9k/23/av9v/2r/af9f/1n/X/9P/0r/S/9L/0j/RP9T/2X/a/9s/27/bv9t/2v/Zv9h/1z/Wv9d/17/Yv9i/2X/Z/9s/23/bf9v/2//b/9t/2v/av9o/2j/aP9m/2X/Y/9i/17/Wf9V/03/Rf89/zT/LP8p/yf/J/8n/yv/L/8z/zj/O/9C/0X/TP9U/1r/YP9o/23/cv92/3n/e/99/3//f/9//37/gP+A/4L/hf+K/43/j/+R/5D/kP+O/47/j/+P/47/jf+N/43/jP+M/4v/if+H/4X/gv+A/37/fP96/3n/eP95/3v/e/97/3v/ef95/3f/dP9y/2//av9n/2f/Zf9j/2D/XP9b/1r/Yf9r/3b/gf+J/43/jP+M/4z/i/+L/4v/i/+L/4v/i/+L/4v/iv+H/4H/e/91/3H/dP93/3v/ff9//33/ev92/3X/c/9y/3D/cP9v/2//b/9v/3D/bf9q/2f/Zv9m/2n/bv91/3v/f/+F/4z/j/+R/5D/jf+M/yx/LG4sfytwKn4ocCd+J3ImfyZ0Jn8ldCV+JXQkfiR0JH8kdCR/JHQkfyR1JH8kdSR/JHUkfyR1JH8kdSR/JHUmfyZ2J38ndih/KHcpfyl3KX8pdyp+Kncqfip4Kn4qeCt9K3gtfS14LXwteC18LXgtfS13Ln0udjF9M3UxfTFzMoAzdDiFPm5HiVRkYIlqXHOIdFpxgWpeW3tNZTx5NW00ejRwM3ozcDJ8NHA1fDVwNHs0cDZ7NnA2ezZyNHo0cjV6NXI1ejRyM3o0cjN6M3Ixei9xMHoxczF6L3Quei11LXstdSp7KXcqfCp4KXwpeSd9JngkfSJ4In4ieiJ+InogfyB7Hn8feyGAI3omgit3M4U7cEeIUGhYimFlaIpuYW+JcV5xiGxfZ4ZdYVSFTGRGhD9pPIQ6bT2EQW5EhEhsSoRLa1CEUWxThVZtWIVcbFuFXGxchlxqYIZjaGiGbmFyhnVadoZ2VXaFdVR2hHZWeIR7Vn6FgleEhIdVh4OGVISDhFSGg4RYhICFXYR/gmSCfn5reXt2cHZ6c3Fsem9xdX58bYeBjGqSgZJnkIKOZIqDgWJ3hXFjbYVpZWGHW2lWhk9sSIQ/cDmAM3Uvfy14Ln4tfC+AMHwzgTh6PYNAdkKDRnJJg0pvTINObFCDUWtThFRrVoRXa1mEWmtbhFtqWoRYa1aDVWxUglJuTYFJckJ/PHY3fjJ7L34tfix+LX8tfi1+LX8ufi9/MHwygTh6PYJAd0aDS3FPhFRtcYScZ5yCnWeggKRsk35yc1l9Z3VogHV0gIF3c4+BlHOMgYlsin52aHZ+b3Cdf7t5vn6+f75/soSwf7yIvn6/f719uIGTd3aJp3q6fa9+hXJ/fp1umICDc1F9PHpIfF59b392e35+eHZ0fHd1enxvelR9QYBzfmeDWnxZhFx8XodIez2LP3o7jDx7TY5he1CNTXtOi019S4pCf0uIT39EhkB/QIlBfz2MOH5CjUl9RIs4fTmNNn04jTl8Pos2e0+HVnpPg0B6S4JDe0aDQ31efll9TH1RfUGFRX46iG5+eYRNfzCBPX9CgnB/cnp3f3hwdIFlb2iCXnZKgUd+R4FEhEN/QIk6fjeLOH46jTx+Po1BfkOLRX9Gi0h/SIlKf1CHVYBVhFV/WH5RfVh/bXp2fnp7eHl4fnNzSH9acnN+cHFnflpxYYBmcmWAcXZvgV99VIFMhUp+TohOfkyET39mfGyAa3RsgGxvbYBubW6Ba25ogmRuX4Ncb12DXXBfgmBxY4BjcGeAaW1pf2tsbYBra2uAamlqgGhpZ4Bma2WAZGxjgGBuXYBYcFKAS3FDgDpzMYAsdil+J3omfSh6LH4wejR+O3c+gEJzR4BNcFaAXnBifmh0cHx0d3d7enp8en1+fnh+gH53fYF+d39/g3eGf4p5kH+RepB+j3qPfo57jn6Oe45/jXqNgY16jYGLeouBinqIgYd5hYCBeX+AfXp7fXl6d3t4e3l8e3t7fXt7en55e3h8dXxyfG57anhne2VyZnxkb2N+YG1egFxuXH5kdG56eX6DeIqAjXqMfot7i3uLfYt7i3yLe4t8i3uLe4t7i32KeYd+gXB7gHVnc4J1ZHmBfGp9gH5xfX95c3d/dHN0f3NycH9wcm9/b3Jwf29xb35scWl/ZnFjfWV4aXtue3R4eHt+d4R6jHmQeJF8j3eNfYt2K/8r/yr/Kv8p/yf/J/8n/yT/Jf8l/yX/JP8k/yT/I/8j/yP/I/8j/yP/I/8j/yP/JP8k/yT/JP8k/yT/JP8k/yb/Jv8n/yf/KP8o/yn/Kf8p/yn/Kv8q/yr/Kv8r/yv/LP8s/y3/Lf8t/y3/Lf8t/y3/Lv8u/y7/Mf8z/zH/Mf8y/zP/OP8+/0f/VP9g/2r/cv91/3P/af9a/0r/Pf80/zP/NP8z/zP/M/81/zb/Nv81/zX/Nv82/zb/Nv81/zX/Nf81/zX/NP8z/zT/M/8z/zL/Mf8x/zD/Mf8w/y7/Lf8t/y3/LP8r/yv/Kv8p/yn/J/8m/yX/I/8j/yP/Iv8i/x//H/8e/x//If8j/yj/Lf81/0D/Sf9U/17/Zv9v/3X/ef96/3j/cv9s/2b/X/9V/1H/Tf9H/0X/R/9K/0n/Sv9O/0//UP9U/1X/WP9b/17/Xf9f/1//X/9h/2X/a/9u/2//dP92/3b/df9z/3P/dP91/3n/fP+A/4L/hP+F/4T/hv+G/4P/gP9+/37/fv97/3f/c/9w/2z/Z/9j/17/Yf9n/3H/f/+H/47/kv+R/4//jP+I/37/eP94/3X/cf9u/2v/ZP9e/1b/TP9A/zn/Mf8u/y//Mf81/zj/PP8//0L/RP9I/0r/S/9N/07/Uf9S/1P/VP9W/1f/WP9Z/1r/Wv9Y/1b/Vf9U/1L/Tv9J/0T/P/85/zP/L/8u/y3/Lf8t/yz/LP8t/y7/Mf80/zj/Ov8//0T/SP9L/1D/X/+W/5z/nP+h/6L/o/+a/4f/e/+B/4n/jv+O/3j/bf9g/3n/df97/2H/aP98/6P/uf++/73/uv+e/5n/rP+3/73/vf+9/6z/if+T/7D/pf+H/3z/mP+K/2n/T/9U/0//bv96/2//Wf9e/2T/bP9t/2z/Zf9q/4D/Zf9d/1j/VP9M/z//Ov85/z7/Rf9J/1T/Uv9N/0v/S/9L/1T/Tf9L/0X/Qf9C/z//Pv88/0P/Rf8//z3/O/86/zv/Qf86/zv/S/9M/0n/Qf9A/0X/Rv9K/1f/WP9Q/0r/Q/9C/z7/ev9W/zH/Mv8//2L/X/9m/3b/dv9z/2v/Xv9Z/1H/Rv9G/0b/Q/9C/z7/O/85/zj/O/89/z7/Qv9E/0f/SP9L/0z/T/9X/13/W/9Z/1n/ZP9t/3b/ef93/3X/cf87/1H/c/9k/z7/W/9v/2v/dv93/07/Q/9T/0//Sv9F/1H/Yv9p/2j/Z/9q/2r/bP9u/2//b/9t/2f/Y/9f/1z/XP9c/1z/Xv9c/1z/Xv9h/2T/Zv9o/2r/av9q/2n/Z/9n/2b/Zf9j/2L/YP9c/1f/UP9J/0H/OP8w/yv/KP8n/yj/K/8u/zP/OP88/z//Qf9H/07/Vv9d/2T/a/9w/3T/d/96/3z/ff9+/37/fv99/37/f/+C/4X/i/+P/5H/j/+P/4//jv+O/47/jv+N/43/jf+N/4z/jP+K/4j/hP+C/4H/f/98/3r/eP93/3j/ef97/3v/ev95/3j/d/9y/2//bP9o/2b/ZP9l/2P/Y/9g/2D/Xv9f/2j/cP97/4X/iv+N/4z/i/+L/4v/i/+L/4v/i/+L/4v/i/+L/4r/h/+B/3z/dv90/3X/e/98/37/ff97/3n/df90/3P/cv9w/3D/b/9v/3D/b/9u/2v/Z/9m/2P/Zf9p/27/cP93/37/hP+M/5D/kf+P/4z/iv8pfydxKX8pcCd+JnIlfiVyJX0ldCV/JXQkfiRzI34jdCJ/InQifyJ0I38jdyN/I3cjfyN2I38jdiR/JHQkfyR0Jn8mdSZ/J3Uofih1KX4pdSl+KXcpfip3K34reCx+LHgrfSt4LX0tdi18LXcufC53LnwudS58LnMxfTR0MX0vdDKBM3E4hD5tR4lVZV+Lal10iXlYcoJoWlt7SGM7eTNtM3ozcDV7Nm81ezVvNns2bjZ7NnA2ezZwNns2cTZ7NnE2ezZxNns2cTV5NXE1eTVxNHo0cTN6MnExeTFyMHkucix6LnQteyx0K3wqdSt9KnYnfCZ3JXwkdyN+I3gifiF4IX8feSF/IXgjgCV4KoMxdDiGQm1NhldnYIloY3KIeV59iHtgeYdzYG+GaWFjiF5iWolXZVSJU2VOh05nUIdUZ1OIU2dSiFRmV4ZZZ1uGX2dghWBlYYVhZGOEZl9phGtbb4ZyVHKFdFBzhHJPcoVyUnSFdlZ5hX1XfoWCWoSEhFmDg4Fbf4B+YHt9eGV0fHBsbHpncmN3X3hYdlF7T3VSe1l6ZXdxf3xuhoKOaI+DjmWNg4lfgIN8XX2FfF18h3lgeIh0ZW6IaWlihllqToRCbDuDNnA1gTpxPYJAdECCRHFHhEpwTIRMbk2ETm1PhFBtUoNUa1aDV2tYhVprWIRWbFeCU21Sgk9wTYBJcUSAPnQ6fjZ5M34wfC5/Ln4vfy9/Ln8ufzGAM301gjh5PIM/dEODRXJLhFJvUoR7b52Bmm2afaJ0nnqaeot3aX9qeY2ApXyYfoh9hXuEfWh7WnxUfF58Znd8fp95tn6dg6t+u4W8gLGFm4Glj698pI6gdrKMo3SGh313lXygfJhyhn6fdpKAfX1egV6DdIBxhV98WYVMe0uEU35og2l9XYRpfG6GaXpxiF57WIpSejqKOno7iz16P4s4e0qIUHtPiUZ7TIlGfEWIU35LiEV/RIhIf0qLTH9TjEJ+OIw8fT+MO346jjt7PY9Qe02OU3tIh0d6UINMeUGGRHlAhGF4XXtSd1F5QXpEgkB8SoZofTKHN307hE19WoFdfmd5dIB1c3CBanFfg1V3ToNKfkaAQoRDf0OGQn4+ijx+PIw+fkCMQn9FiUaASYlKgE+DUIFSgVWBW31ef1l3XHpie257dn14fXd7dH90c3GBdXBzgmRwUYFkcW+BdnttgUuCP39HiUt/SolHf1eDbH9qd2mBaG1pgGtubIFrbW6Bbm9tgmpvaINicF6EXHBahFpyV4NUclKAU3JVfVlwXH1fbmZ9aG1qf2pqaYBnameAZmxlgGNtYYBeblyAV29OgEdxP4A1cy6AKHYmfSZ6KnwsezB8NXc5fjx0QIBEcUiAT3FWf19yZn9tdHF9dXh6e3x8e3l8gH14fYF8eHyAfnh/f4N4hn+LeJB/kXqQf457jn6NfI2AjHyMgY16jYKOeo6CjXqMgIp4h4GFeYOBgXl/gHt5eX55eXh8eHt5e3l7eXt4enh9dnxzfXB8bXtofGV2Ynxjc2V8Y29kfmFuYH9hb2V8bHR0eYB9iXiMf4x7i3yKfIp5i3yLeot7i3uLe4t7inuKeYl9h3WFfoJue4B2ZXeBeGJ6gX1qgoB/dHt/eXV2f3Nycn9xcm9/b3Nvf29zcH9vcmx/a3Jnf2VyYn1kdmd6bHpwd3Z5fXiFeYp7kHmRfo92i3+Jdir/Kf8o/yj/J/8m/yX/Jf8l/yX/Jf8l/yT/I/8h/yH/Iv8i/yL/Iv8i/yP/I/8j/yP/Iv8i/yL/I/8j/yT/JP8m/yb/Jv8n/yf/KP8p/yn/Kf8q/yn/Kv8r/yv/LP8s/yv/K/8t/y3/Lf8t/y7/Lv8u/y7/Lv8u/y//M/8y/zH/Mv8z/zj/Pv9G/1P/Xv9p/3T/eP9z/2j/W/9K/zv/Nf80/zT/Nf82/zX/Nf82/zb/Nv82/zb/Nv82/zb/Nv82/zb/Nv82/zb/Nf81/zX/Nf80/zT/M/8y/zH/Mf8w/zH/Mf8w/y3/K/8r/yr/Kv8o/yf/Jv8m/yX/JP8k/yL/If8h/yH/I/8j/yT/J/8q/zH/Of9D/03/V/9i/2r/cv92/3n/eP92/3D/cf9s/2j/Zf9k/17/XP9b/1n/V/9a/1z/Wv9a/1n/W/9c/1//Yf9l/2b/Zv9m/2b/aP9p/2r/bP9w/3H/cv9z/3L/cv9x/3H/cf90/3n/ff+B/4H/gP+A/37/ff95/3b/cv9t/2j/ZP9f/1v/Wf9U/0f/Qf9C/0T/Tf9Z/2f/dv+E/43/j/+O/4v/hP99/3v/ff9//3//fv9+/33/ev92/3P/a/9k/1n/Tv9D/z//P/9A/0P/RP9G/0n/S/9M/0z/Tf9O/0//UP9R/1T/Vv9X/1n/WP9V/1L/U/9O/03/Tf9J/0T/P/86/zj/NP8y/y//L/8v/y//L/8x/zL/Nf84/zr/Pv9A/0P/Rv9I/0r/Tv9e/5X/mv+a/57/n/+X/4z/d/9X/1z/if+k/6f/lv+E/3T/Yv9Z/2H/ZP9J/1r/j/++/67/hv+d/7L/tf+p/67/nf9u/3H/i/+h/5r/ff9l/43/mf+K/5n/i/9n/2H/Z/9m/13/Y/9k/1n/VP9X/2b/XP9U/2X/af9p/2P/XP9i/1L/O/88/z7/RP89/zz/Rv9S/07/Sv9S/1H/Q/9J/07/T/9R/03/Tv9S/1r/Rf88/z7/Rf89/zj/O/86/0j/W/9m/0z/S/9Q/0P/Q/9C/0f/YP9S/1X/WP9B/0b/Pf9X/z3/Pv9D/0f/UP9Y/0v/Tv9x/3X/cP9n/1//V/9O/0r/Q/9B/0P/Q/9A/z3/PP8+/0D/Qf9D/0b/Tf9M/07/Vv9Z/1f/Wv9a/1v/Xf9g/2j/cv94/3n/dv91/3D/b/9x/3D/bv9u/3L/ef9m/0r/Qv9K/0r/Q/9B/0r/Yv9l/2b/aP9o/2j/aP9r/2z/bf9s/2v/af9l/1//W/9Z/1j/VP9P/03/Sv9M/0v/UP9Z/1//Y/9n/2n/av9p/2f/Zv9l/2T/Yv9h/13/Wv9V/07/R/8+/zT/K/8n/yb/KP8r/y7/MP81/zn/Pv9A/0X/S/9S/1j/Yv9n/27/c/93/3r/fP97/3z/ff99/3z/fP9+/4D/hP+H/4z/j/+R/5D/jv+O/43/jf+M/4z/jf+N/47/jv+N/4z/iv+H/4T/gv+A/37/e/95/3j/d/93/3j/eP94/3n/ef92/3P/cP9q/2b/Yv9g/2H/ZP9k/2T/Yf9h/2L/Z/9v/3j/g/+J/4z/i/+L/4v/i/+L/4v/i/+L/4v/i/+K/4r/if+H/4X/gP94/3b/df93/3v/f/+B/37/ev93/3X/c/9y/3H/b/9v/2//b/9w/2//bP9r/2b/Y/9i/2T/Zv9r/3D/dv99/4X/jP+R/5D/jf+L/4n/KX8ocCd/J3MlfiR1JH4kdSN+I3UifyJ1In4idCF+IXUifyJ2In8idiJ/IncjfyN3In8hdiF/IXYhfyJ2JH8kdiZ/JnYmfyd2J34odil+KXcpfip3K34rdyt+K3gsfix4LX0teC19LXYufC52Lnwudi18LXUtfC1zL30xczN9M3MxgTJwOIQ+bEiJVGRei2pcdYh4VXKBaFhde0xiPXk1aTZ6Nm82ezVvNXs3bzZ7NnA2ezZwNns2cDZ6Nm82ejZvNno2bzZ6Nm82eTZwNnk2cDV6NHA0ejRwMnkycDF5MHAwejBzL3sudCx6K3Qqeyl1J3wmdyd8JnclfiR4I34ieCJ/InsifyJ5I4AmdyuDMnQ6hUNvTYVXaGCFZ2NuhW9fcINvYW+FbWFshmpiaohqZGiJZ2RjiWJkYIheY16IX2Nfh2FhX4djX2WHZmBoh2xga4ZqXmmGaV1qh2pbbIduV3GGdE9zhXJNcYRvTG6FcFBxhXZSeoV+VICCf1h8gXpdeH92Y3F6a2tld19yW3RXeVJzTn1KckeAQHI+gkB1QoFGelB9YH9xdIGCjGuOg41kiYKBYXqBdV15g3tefoSBXYGGgV6Ahn5hfYZ5ZXWGb2ZlhllnUIVJaUiER2pHhEdsSoRKbkqESm1MhE5tToRObVGDU2xVg1ZsVoJTbVGBTm9NgUpxSYFHdESAQHc6gDZ5NIA0fTCAMH0xgDJ8M4A1ezeBOnk8gj53QIRCdUWFR3FJhUpuUIVTbYSEnnCYgJx1n3uYfZJ0gYd2clmOUXR4j494louYeH6Hd3dmhId4jYRfeSiKIHl9ir1/u4KpeoSLfXWXkKx4ro2denePW3llk4F7mImJfT58WnyTdqB8mHt6e1WHWXpcjl16dI53em2PX3xcjF17WoxTfFaObXxojmd8aI1WfEiNRXo5jD16TYxTekaIQHk+hFR6ZIRcfGCEdXxbh0Z8TItOfk6JR31DilV7QYs9ekCKPXxDikF7N403eTmQRHlXj1N5P4g1e0OEQntEhkN6O4RAeU9/XHlPgD58RIU/fTuHOX1Ahkp+TYBVflN8TH1Zdmp+bnRxf2p0WoJPek2CSIFCgECFQn9CiD9+PIo6fj2MQX5Bi0N/RohTgFWDU4BdeGKBYnBhgWBuX39ecWJ6anlzenh9eH13enN+cHRygHBua4NIa1SEeHJ2hUZ/RoRNh06BRoZMgGeAaoBmdWSBZm9lgWVuZ4BpbWqBa21rgGtsbIFmbWCCXG5Wg1VyUYJPdEeAQ3RAfkN0RHtOclZ7XXBkfGhtaX5pa2iAZ2pmgGNsZIBjbWGAXW5agFVwTYBFcjyAM3QsgCh3J30peit8L3kyfDV1On4/cUGARnFMgFJxW39kcml/cHR1fXh4e3t7fHx5fIB8eHyBe3h9gH14gX+EeIh/jXiPf496jn+Oe41+i3uLgIx7jIGNeo2CjnqOgo16jIGKeIeDg3mAgX55fYB7eXl+d3l4fHd7eH14e3h9d3x2fXR9cX1sfWh6Y31fdl58XnNjfGRvY31ibmF9ZW9qfHF0eXmCfYp5jH6NfIx8i3yLe4t7i3uLe4t7jHuMe4t7inmJfYZ1g39/a3iBc2J1gXdke4F9bX2AfHN4f3VzdH9ycnJ/cXJuf25xb39vcXF/cHJsf2pyZ39jdWJ9ZXlnemx5c3d4eH94hnmMe5F5j32Mdot/iXYo/yb/Jv8m/yX/JP8k/yT/Iv8i/yL/Iv8i/yL/If8h/yL/Iv8i/yL/Iv8i/yL/Iv8i/yH/If8h/yH/Iv8k/yT/Jv8m/yb/J/8n/yj/Kf8p/yr/Kv8r/yv/K/8r/yz/LP8t/y3/Lv8u/y7/Lv8u/y7/Lf8t/y3/Lf8u/zD/Mv8y/zH/Mv84/z7/RP9P/1v/Zf9w/3b/dP9r/2H/UP9A/zf/N/83/zb/Nf81/zX/Nv82/zb/Nv82/zb/Nv82/zb/Nv82/zb/Nv82/zb/Nv82/zb/Nf80/zT/NP8y/zL/M/8y/zD/MP8v/y7/LP8r/yr/Kf8n/yb/J/8m/yX/JP8j/yL/Iv8i/yL/Iv8j/yb/K/8y/zv/Qf9L/1X/XP9j/2X/ZP9k/2P/Yf9j/2b/af9q/2r/av9o/2f/Zf9j/2T/Y/9l/2b/Zv9o/2v/bP9t/2//cP9u/23/bf9t/27/bv9u/3H/c/90/3P/cv9y/3D/cP9x/3b/ev98/3r/ev96/3f/df9w/2v/Zv9d/1f/Uf9K/0j/RP9E/0H/QP8+/z7/Pf8+/0L/Sv9a/2z/ff+J/4z/i/+G/3z/cv9n/2v/cf92/3v/fv9//4L/gv+D/4D/ff97/3T/bP9l/1v/U/9O/0v/Sf9J/0n/Sv9K/03/Tf9O/07/UP9S/1P/Uv9P/0v/S/9J/0b/Rv9E/0P/QP87/zj/Nv8z/zP/Mv8y/zX/N/85/zv/PP8+/0H/Q/9E/0b/Sv9M/03/Uf9R/2T/nf+f/5z/oP+c/5H/g/+C/4X/Y/9R/2b/hP+D/4b/g/+D/4H/n/+b/1r/Kv8j/3j/vP+7/7T/pf+C/13/fP+c/5v/iP9i/1b/a/+O/43/e/9s/3D/lv+k/2b/Q/9c/1//Y/96/5L/kv92/23/ZP9i/1z/aP9h/1b/XP9Y/z3/Of8//0T/S/9X/1n/RP85/0L/Qv9j/1z/V/9i/1n/S/9G/0P/QP86/0z/VP8z/zj/Pv9J/0r/PP80/zP/Nf8+/0b/Sv9I/0T/Qf9H/0D/Rf83/0D/R/9U/z3/QP88/z3/Ov9I/13/WP9b/13/P/9F/0//Tf9e/17/X/9a/0//P/8//0D/Qf9C/0L/Qv9A/z3/Pv9B/0H/Q/9G/1T/Wf9X/1//Y/9l/2P/Yv9h/2L/Z/9s/3T/eP93/3T/c/9s/2D/XP9y/2z/Zv9f/1T/Tf9D/0z/W/9k/3P/bf9o/2X/ZP9j/2L/Y/9l/2j/av9r/2v/a/9o/2P/Xf9Z/1L/T/9K/0P/Ov83/zb/PP9E/03/Vv9d/2b/aP9p/2n/aP9m/2b/Y/9j/2L/YP9c/1j/U/9L/0L/OP8w/yz/KP8n/yn/K/8v/zL/Nf86/z//Qv9H/0z/Uv9d/2b/bP9y/3X/eP97/3v/fP98/3v/e/97/33/ff+B/4T/iP+N/4//j/+O/47/jf+L/4v/jP+M/43/jf+O/47/jf+M/4n/hv+D/4D/f/98/3r/eP92/3b/dv93/3j/eP92/3T/dP9v/2v/Zf9g/17/Xf9d/2D/Y/9i/2L/Y/9m/23/c/97/4T/iv+N/4v/i/+L/4v/i/+L/4v/i/+L/4v/i/+K/4n/hv+C/37/eP9z/3X/d/97/33/ff98/3j/df9y/3H/cf9w/27/bv9v/2//cP9v/2z/av9m/2T/Zf9l/2n/b/9y/3r/gv+J/4//kv+P/4z/i/+J/yZ+JXAmfiZzJH8kdiR/JHYkfyN1IX8hdiB+IHYhfiF2IX8heCF/IXghfyF4In8ieCJ/IngjfyN4In8heCR/JHgnfyd2Jn8ndyd+KHYpfip3K34reCx+LHctfy13LX8tdy19LXgufS54Lnwudy18LXcufC52LnwudjB9L3UwfTF1MH8xcTaAPG5EhUxoWIlmX26Jc1h0hG1ZYn9TXUh8PWQ2ezVqNnw2bTV7NW03ejduOHo2bjZ6Nm42eTZvNnk2bzZ5Nm42eTZuN3o3bzd6N281ejVwNHo0cDR6NHAyejFwMXoxcS95L3Iteix0K3sqdSh7J3UnfCZ3JXwleCN9IngifiJ4IX8ieCWAJngrgDJ1OYNBcUiEUG5VhFtqXIJYaFSDUmRWhFxjYYdmYmqHbGFriGliZ4hnZGaIaGJoiWhfbIhsX2yIbl1wh3JecoZyXXCIb1pvhnBYcIdyVnSIdFV3h3hQdIZyTXKHc0pyhnNIeIV5TXmDdlV2gnNdb35qZGV3X25ZdFJ3THBEf0BwP4JAcUCDP3E9gz1xPYQ7dT2DQXpIf1aAZ3Z5g4dsioSHZoOAd2RofVhkWn9hZmmBcGV3hHtkgIaDX4KFgl6EhYJfgIZ7YnWGb2RmhFxmVYRRaE6FSmtJhUpsTIVMbU6ETm5Pg1BvUIJOb0iARnBEgEJxRX9EdEKBQXY+gTt4N4E1ejWCN3o4gjd6OYM8dz6DP3dChERzRoVIcUuFTHBNhU9wUIVRblSFg26jgp9xonyfepl2iYVwdIiMi3N1kFB1V5F8doGPe3V2jHNze4igdJeLQHUqjiN5aI26f7mFtn+yh6Z7hY1geGSTdniDkYN/aYpghH1+h4B9cnB7Y3eEeIuDT3hEjWZ3cpKOeYiSjXqSjYp8fY18e2OSYXtjk1N6UpFYeFyPUnkzjT56S41TeF6Ma3dGiC95MIU1eU2DU3hNg1F4SohJekaLRHxEi0R8V4o7fDiKOH09iEB7N4kzezKMNXs0jjh7RItEfTuHPn8/hkJ+QYRTfUCBQX1GgUB+PYVCfkqGUn9IhFZ+Z4BRfVF8V35AeUZ/QHgwf092T39NdlCBQHs7gD+BRIBGiEiAQoo/fz6KP39AikJ/QopEf0iIUYBZg1qAX3dmgGdvZIBkbGV+ZnJpe255dXt5fXh+dXhxgnBuY4NdaGqDZ25Kg0h+U4JOhE2BWYJlgHN8boBpdGWBY25jgGJtY4BjbWWAZW5pgGluaIJnb2SBX29ahFJwTINHckCAOXUyfTF2NXw6dUN8THJWfF1wZH1mb2h/aGxmgGVsZYBkbGOBYW9egVtwWIBRcUmAQnI3fy90Kn4odyd8KXwsezB6NH02djx+QnNDf0hwT39XcF+AaHNtgHJ1d315eHp7fH18eXyAe3l7gXt5e4B9eX+AhXmKgY15joGNeYx+jXqOfYt6i4CNeo2BjnmOgo15jYOMeouCh3qEgoB5foN9eXyBeXh3fnZ6d3t2e3d9d3x3fXZ8dXxyfW18aX1jeV17WXZceltzX3phb2N9Y21kfWhucHt4dX56iH2Meo19i3uKe4t8i3qLeot7i3uLfYp7inyKe4p6h32EdICAeWp0gXJkc4J3Z3uAfG98gHt1eIB1c3J/cHFwf25xbn9ub25/b3Bufm1wbH5qcmh/Z3ZlfWZ5aXpue3F3fXqGeI15kHuQeI9+jHiLfop3Jv8l/yT/JP8j/yP/I/8h/yH/IP8h/yH/IP8g/yH/If8g/yD/If8h/yH/If8h/yH/If8h/yL/Iv8j/yP/JP8k/yf/J/8n/yf/KP8p/yn/Kv8r/yv/LP8s/y3/Lf8t/y3/Lf8t/y7/Lv8u/y7/Lf8t/y7/Lv8u/y7/L/8v/y//MP8w/zD/NP86/0D/S/9X/2L/av9x/3L/b/9m/1n/Tv9E/zz/N/84/zb/Nf81/zX/Nf81/zX/Nv82/zX/Nf81/zX/Nf81/zX/Nf82/zb/Nv82/zX/Nf81/zT/NP80/zP/Mf8x/zH/L/8s/yz/K/8q/yn/KP8n/yf/Jv8l/yX/JP8j/yL/Iv8h/yL/I/8l/yj/MP82/z7/Q/9L/1H/U/9T/0//Sv9J/0//VP9a/2H/Zf9n/2j/Z/9o/2j/Z/9p/2r/av9t/27/cP9x/3H/cf9y/3L/cf9x/3H/df91/3f/e/97/3v/ev93/3T/dP91/3b/dv93/3X/dP9y/2//bP9n/2H/W/9T/0v/RP9A/z7/Pv8//z7/Pf8+/zz/PP87/zz/Pf9B/0f/Uv9j/3j/hv+K/4f/gv91/2P/T/9K/0//WP9i/2v/cv96/3//gf+F/4b/h/+F/4P/gP95/3b/b/9k/1v/U/9P/0v/S/9M/0z/Tf9N/03/Tf9I/0b/Q/9B/0D/Qf9C/0P/Qv9B/z3/O/88/zr/Of87/z7/Qf9B/0L/Q/9E/0b/SP9K/0z/Tv9P/1P/Vf9R/1P/Y/+a/6H/nf+e/5f/kf9x/1n/fv+H/3T/Xv9N/2T/ff97/3b/cf91/5D/gv8y/yr/Kv9N/7X/tP+x/7D/q/+d/4j/cv9p/2r/bf9v/2j/df98/23/ZP90/3b/Yv8+/z7/WP+D/6H/mf+W/5X/jP+B/3X/Zv9b/1X/S/9N/1j/X/9e/0f/S/9C/0b/Wv9V/0T/M/8y/zn/Pv81/zr/Tv9J/0n/Q/8+/zv/Rv9T/zr/Nf84/zn/PP9G/zv/Mv8y/zL/OP9A/07/Rv89/z//N/9O/1n/Uf9Z/0v/Of9C/0P/Uf9B/0j/Vv9V/0//Uv9O/zf/QP8y/zD/Sf9L/1n/QP82/zr/Pv9D/0b/Sf9G/0H/P/8//0H/Qf9D/0f/SP9V/1z/Wf9a/2P/aP9j/2X/Yf9n/23/cv97/3f/c/9q/17/Z/9n/17/Xv9S/0f/Rv86/zr/S/9T/1//cv9t/2n/Zf9j/2L/Yf9k/2T/ZP9o/2f/Z/9n/2b/YP9d/1X/Tf9E/z3/Nf8t/yz/Lv8z/zz/Rv9O/1j/X/9k/2b/Z/9m/2X/Zf9j/2H/YP9g/17/W/9U/0//SP8//zf/L/8q/yj/J/8p/yz/MP82/zn/O/8//0P/SP9P/1n/Yf9p/2//df93/3n/ev98/3z/fP97/3v/e/97/37/gf+F/4r/jf+O/43/jP+M/4z/i/+L/43/jf+N/43/jf+N/4z/if+F/4L/f/99/33/ev95/3f/df92/3f/eP93/3f/df90/3H/bP9m/2H/W/9Y/1f/Wv9f/2H/Yv9j/2b/bP9x/3n/gv+K/43/jf+M/4r/i/+L/4v/i/+L/4v/iv+K/4r/iv+H/4T/fv92/3H/cP9y/3X/eP96/3z/ef93/3T/cv9w/3D/bv9u/27/bv9u/23/a/9q/2r/aP9n/2X/Zf9o/23/cf99/4b/jf+Q/5D/jf+L/4r/if8mfiR2JH4kdyN/I3YjfyF2IH8gdyB/IXggfyB6IH8feh9/H3kgfyB5IH8geCB/IHghfyF4IX8ieCR/JHclfyV3J38ndyh/KXcpfil6KX4qeit+K3osfix4LX4teC5+LngufS54Ln0ueC18LncvfC93L3wvdi58LnYufS51L30vdTB9MHMyfzdwPIRGa1GHXGVmiGtecIVwWmmDYl1Xf01fQ308ZDl8N2k1fDVsNnszbjR6NW81ejVvNXk1bzV5NW80eTRuNHk0bjV6NW80ejZvNno2cDV6M3AzejJwM3ozcDF5MXAveC1xK3krcip6KHIoeyh0J3wndiV8JXgkfSR4In4ieCJ/I3gjgCV5KYAudzOCOnQ+g0RwSIJLbkuCSGxHg0ZrSYRPaVaFW2dehWBkYYVkYWOFZWNnhGlkaoZqZGuIbWJviHBgcYdxX3OIcltzh3RYdoZ3VniHelV7h3tTfIZ8UXmFd1B2hHZPdINyT3CBcFFvgGxdaXxlZ152VnFMc0R7P3JAfz9xPYM+cT2FPXI9hT1yO4U7czuEO3Y8hD94Rn9Qf2F3c4OCbYmEh2iCgXdmZH1Najt7QHBFfU5yWX9jb22AeGp/g4RniISHYoiFh2CFhYFhfoV5ZHWFa2RfhVZkUIVNaEyETWtMgk1uTIFGc0OAP3U7gTp0OoE9dUGCQ3VDg0N0Q4RDc0OEQ3JEhURyQ4VEckSFRHFHhUpxS4VMcE6GT3BRhU9uUYRSbVWGVW1whKNwoX6ceZl5lIGDd0qGTHduio90g49sdVCTT3Zxknh2d493dXCOgnNwkDN0MZMwdzWSo3yui6d9qIikfIqLgHx4kGp7YJJUfVmOV31mgWp9Y3tte2yBaHpTiDh3P5BUdoOTpXigkZN6l46SfJKMlHt0kEl6PJNeeG+SYndbjVR6TotMfEaLQ35Di0t9UohEfTOGQHxEgzl7OoI6ejiGPnpHiTR8M4pCfEuKS3w/ijN9QYk+fD+KN3wxiTN7MIs1fDmKRH1DiT5/PIRQf2WAYH5pgF9+O4Q9fjyIQX5OiFF+SYVFfU+ESH1NgU1/O388gEZ9PYBDfECBP3k4gTF9N4A/g0F+QIhAfkGKQX5AikB+QYpBf0iKSX9KiE2ATYRMf1J+YH9ocWd+Zmhaf19scIBlamSDY2ZUhEtfRIRFYEqERWhPg096SoFAhEJ/ToJDfkl+ZH51eW1/Z3NkgWFwYoBkbmR+Y25lfGZuaH9obmaBY29eglhuUINGcDyCM3Qrfyl3KXwveTV8PnhJe1F0WXxgcWV9Z25ngGVtZIBkbmOAYm5ggV9vXIFYcFWAUHFHgD5yNH8tdSl+KHgofip7LH0weTV9OHY6fj1zQn9JcVJ/WnFifWpzcH12dXZ9eHh5e3t9e3l8gHt5eoF6eXuAfXl/gIZ5iYGMeY2BjXmMgIt6i3+MeouAi3qMgYx5jIKNeY2Di3iIgoR4gYJ/eX2DfHl6gXd4dX50enV7dnt2fHZ8dXx0fHJ8b31qfGV9X3lae1V2V3tZdV17YHFhfGRtaHxwbnR7enWEeo19j3uOfYx8jHyMfIx7jHuMfIp7inyLe4t6inuJeYd9g3J9gHRqcIFwZnCBdGx2f3h1en54dXV+cnNxf3Fxb39ucW5/bm9tf21wbn5scGt+a3Jpf2l1Zn1neGh6bXlzd356h3iNeY96jniMfot2iX6JdyT/If8j/yP/Iv8h/yD/H/8g/yD/IP8g/yD/IP8g/x//H/8f/x//H/8f/x//IP8g/yH/Iv8h/yL/JP8k/yX/Jf8n/yf/KP8p/yn/Kf8p/yr/K/8r/yz/LP8t/y3/Lv8u/y7/Lv8u/y7/Lf8u/y//L/8v/y//Lv8u/y7/Lv8v/y//L/8v/zD/Mv85/0H/S/9X/2D/Zf9r/3D/bv9o/2D/Vf9M/0b/Pv87/zr/OP82/zb/NP80/zT/NP81/zX/Nf81/zT/NP80/zT/Nf81/zT/Nv82/zb/Nv81/zP/Mv8z/zP/Mv8x/y//Lf8s/yz/K/8q/yj/KP8o/yj/Jv8l/yX/JP8i/yL/Iv8j/yP/Jf8m/yv/MP8z/zn/Pv9A/0P/Qv9C/0P/R/9J/07/U/9X/1n/WP9b/1z/XP9d/1//Yf9h/2T/Z/9p/2v/bf9w/3H/dP9z/3T/df94/3n/ef98/3z/fP98/3z/ef96/3j/df9x/27/bP9p/2b/Y/9f/1j/UP9H/0L/P/8+/z7/Pf89/z7/PP89/zz/PP86/zr/Of86/zv/Pf9D/03/Xv9w/4D/iP+J/4b/fP9q/1P/N/8x/zX/Pf9I/0//Xv9q/3X/ff+E/4f/hv+H/4f/hf+C/37/e/92/3D/af9b/1P/T/9N/0z/S/9I/0L/P/87/zv/O/8+/0H/Rf9G/0f/R/9J/0n/Sv9K/0r/Sv9K/0r/Sv9K/0z/Tf9O/0//Uf9S/1L/Uv9S/1P/V/9W/3b/o/+e/5v/lf+M/27/Ov9J/2P/if+I/3j/WP9O/1n/cv94/3r/eP+E/2D/OP81/zT/Lv96/6T/n/+i/6T/lv+J/37/bf9k/1j/Tv9C/z//RP9d/2r/aP9j/0r/PP9F/1H/fv+f/57/mP+Z/6L/n/+U/2P/Q/9O/3z/ff92/23/ZP9g/1P/Sv9Q/1n/WP9a/1D/R/88/zr/Rv9H/zr/O/89/0X/Qf8//0H/RP9V/1D/Qv9B/zf/MP81/z3/Nv8s/zD/M/82/zr/P/9V/2L/Wf9W/07/PP87/z3/RP9e/1j/SP9E/0b/SP9R/13/V/9M/0r/Tf9L/03/QP8+/0D/O/88/z//Pv86/zv/Pv9A/0H/QP8+/z//P/9D/0b/R/9I/0n/VP9h/2j/a/9c/0b/Tv9O/2D/a/9a/0//VP9d/1T/NP8v/0D/SP9D/0H/Rv9H/0f/VP9y/3L/bP9o/2X/ZP9k/2X/Y/9j/2T/Zf9p/2j/Zf9g/1v/Vf9L/0D/Nf8t/yj/Kf8p/y//Nv8+/0n/Uf9b/2L/Zv9o/2f/Zf9k/2P/Yv9i/2H/X/9c/1j/VP9P/0X/Pf8z/y3/Kf8o/yj/Kv8s/zD/Nf84/zr/Pf9B/0r/U/9b/2L/av9w/3b/dv94/3n/e/97/3z/e/96/3r/e/9+/4H/hv+J/4z/jf+M/4z/i/+L/4n/if+K/4v/jP+M/4z/jf+L/4j/hP+B/37/fP97/3n/eP92/3T/df92/3b/eP93/3b/dP9u/2n/Y/9c/1j/VP9U/1j/XP9g/2H/Zf9q/3H/eP9+/4j/jf+P/47/jf+M/4z/jP+L/4v/i/+L/4v/i/+K/4n/hf+A/3n/b/9s/2z/bv9w/3b/d/96/3j/df9y/3H/b/9u/27/bv9u/23/bf9t/23/bf9r/2r/av9q/2j/av9v/3b/gP+K/47/j/+O/4z/iv+J/4n/In4hdyF+IXcgfiB4IX4geCB/H3cefx93H38feR5/Hnkffx96Hn8eeh5/H3khfyF3IX4idyF+IncifyN3JX8leCd/J3oofyl6KX4peil+Knorfit6LH0sei19LXkufS55L30veS59LngufS54Ln0ueDB8MHcufC52Lnwudi58LnYsfC9zL34xcDWAO21EhU5oWYhjYWiGb15whmteZINeXlWBTl9Hf0NhQHw9ZTp8OGg1eTNrM3kxbjR5NG80eTRvNHk0bTR5NG01eTVuNnk2bjZ5NnA2eTVwNHk0cDN5M3AyeS9wL3ktcCx6K3IreilzKHopdSd8J3YmfSZ3Jn0keSR+I3gjfiJ5IoAkeCaAJ3gtgDF2NYA7dDqAPHI7gT1vP4NDb0WDSm5PhFFsVIRTalODUWhRg1JoVIVZaV2GYGRhh2RgZ4dqXm2HcFxyh3JWdYd3VHmGe1R9hn9UgIaAVICEflV7g3hXdINxWG2BaVpkfmBeX3tZaVJ3THRFcz58PHM8gDxzPIE8czyDPHM7gzpyOoM5czmDOXQ5gzl1OYI7eD5+SX5ZeG2Cfm+IhIpmhoKAZnF/XGo+eypzK3ovdjd8P3VLflZyZIBubnaAfW2DgoZlh4OHX4WFhF6ChX9geYZyYmmDXWdTgkxpS4JHbUSBQnE9gTxyO4I+c0ODR3FIhkpxTYdOb06GUG5ShlNtVIZTb1CGT21PhU9sT4RPb1CFUW5ShVNvUoVTcFWGVm9WhVZtfIKjcZ5+mHuQeouBano2hFV5YYd7d4yOfXRkk1J1TJVmdnWVfXWClIlzVpY5czeXOHU4lkl5lJKYep6Lo3yUiYV+fYh3gmyIYIJVhUx+RoJJe1yFY3tciFp6R4xBeUaQSnZylJl2lZKSepSOnnuejZB6eo9aeHORiXZ5kmxzaZNcdVqUVntdkmx+cY55f3aNan9iilt/VIhVflaHVXpViFx6aItQfEOLP3o7jEZ5To1JejuMMHoxijl7R4k3ey2ILX0vhzR9OIZLfmaBYH5Vf1J+UII9fj6IQ31KjEF9PY0+fEqMTXtGi0R9TYpOfkmJPn5BiUx/VoVWf1aAU4FXg0Z/Ooc9f0GHPX46iD5+QYpBfkOIRX9Hh0WAQYdNgVKEUYFef1OBT3tZglx0SX9FZVJ/Wl1agGRaWYFbX1SCQ2k6gj50OYJFfEeBPH0wfzx4UoBweXd/cnVvgW9xaYBocG58Y3JqeGhyYnZib2Z4ZW1lgGFsW4JTbUiCPHIxgih2KH8neSp7L3k2ej93SnpTdFt7Y3FlfmZuZ4BmbmSAYm5hgGFuYIBfb16AWXBSgE1wRIA7cjKALHgqfyp8KX4rfS1+MXs1fjd4OH48d0B9SXRTfVx0ZH5sdHF+dnZ2fHh5enp6fnt4e4B7eHqCeXh6gIB4goGHeIuBjHiMgYt6i4CJeomAiXqJgIp6ioKLeYuBi3mLgYp4h4GDeICDfXd7g3h4eIF2eXV9dnp2e3Z6dnt1e3V7c3txfG1+aHxfflp5Vn1Sd1N8V3Rbe19yYnxnbW18dXF7fIF3iXuNfY56jX6Me4x9jHyMfIt6i36LfIt9i3yMfIp7iHiDfX10dIFubGmBaWhsgXBydX13eXl9dnd1fnJxcX9vcG5/bXBtgG1wbH5ucG59bnFtfW1xbH5rc2t+aXhpeW94eHiDeYx5jnqOeo56jH6JeYp+inki/yH/If8h/yD/IP8g/x//Hv8e/x7/Hv8f/x//Hv8e/x7/Hv8e/x7/Hf8e/yD/If8h/yL/If8i/yP/I/8l/yX/J/8o/yj/Kf8p/yn/Kf8q/yv/K/8s/yz/Lf8u/y7/Lv8v/y//L/8u/y7/Lv8u/y7/L/8v/y7/Lv8u/y7/Lv8u/yz/Lf8u/y7/Mf81/z3/SP9R/1v/ZP9o/23/bf9o/2T/XP9Y/1H/TP9H/0X/P/88/zn/Nv8z/zP/NP80/zT/NP80/zT/NP80/zX/Nf82/zb/Nv82/zX/NP80/zT/M/8z/zH/Mf8v/y3/LP8r/yv/Kf8p/yj/J/8n/yb/Jv8m/yX/JP8j/yP/I/8h/yL/Jf8k/yj/Lf8y/zT/M/81/zf/OP86/z7/Q/9I/0z/Tf9N/0v/S/9M/0z/Tf9P/1H/V/9b/2H/ZP9n/2r/bf9w/3L/cv94/3n/ev98/3//gf+E/4L/fv97/3j/c/9v/2v/Zv9e/1r/V/9T/03/Rv8//zr/Ov87/zv/O/87/zv/O/86/zr/Of85/zj/OP83/zf/N/83/zr/Pf9E/1L/Zf95/4X/if+G/4L/ef9o/0z/MP8q/yn/LP8w/zn/Q/9N/1r/Zv9x/3n/fv+C/4T/hP+E/4L/f/+A/3//dv9t/2L/Vf9L/0b/Qf9A/0P/Q/9D/0X/SP9L/07/Uf9U/1X/Vf9V/1b/V/9Y/1f/Vf9U/1P/U/9R/1H/Uv9Q/1T/U/9R/1X/VP9V/1T/Wv+L/57/nP+X/5D/jf9z/yz/PP9Y/3H/hv99/2j/Tf9H/0z/Zv91/3z/df9K/zr/O/88/zz/Ov9n/47/kf+W/4b/d/9y/3T/bf9l/1n/UP9Q/1T/Wv9V/1H/Uf9J/0b/R/9H/2b/jv+L/4f/i/+T/5f/lf+J/33/fP9d/07/Uf9U/03/T/9V/07/Uv9u/4n/jP9w/3P/hf9w/2L/Wv9N/0b/S/9Y/0//Tv9G/zv/R/9P/0D/Mv8u/zP/N/88/zj/L/8t/y7/Lv8z/zz/P/9D/z//S/9W/0r/Tf9J/zv/N/84/zv/O/86/zz/Pv8+/0H/Pf84/zr/O/88/0P/SP9K/03/UP9A/0H/RP9B/z7/P/9B/0H/Qv9E/0P/Q/9G/0r/Sv9J/03/Uv9Q/0j/Q/9Q/1H/Qv9F/0r/Sf9U/1P/QP8//0L/QP9B/0v/Uf9m/2v/dP95/3j/df9u/2b/dP94/3f/ZP9Y/13/VP9e/17/Y/9m/2X/Yf9d/1X/Rv87/zH/KP8o/yf/Kf8w/zf/QP9L/1X/XP9k/2b/Z/9n/2b/ZP9i/2H/Yf9g/1//XP9Y/1L/Tf9E/zv/Mv8s/yn/Kf8p/yv/Lf8x/zX/N/84/zz/Qf9K/1b/X/9m/2z/cf92/3j/ef96/3r/e/97/3v/ev95/3r/fv+A/4f/i/+M/4z/i/+K/4n/if+J/4n/iv+K/4v/i/+L/4v/iv+H/4P/gP99/3v/eP92/3X/dP91/3X/df91/3b/dv90/3D/bP9n/1//WP9T/0//Uf9V/1v/X/9l/2n/b/92/3z/gv+J/43/jv+N/4v/i/+L/4v/iv+K/4v/i/+L/4z/iP+G/4H/ev9v/2j/ZP9n/2v/cP91/3f/d/91/3P/cf9x/2//bv9t/23/bf9s/27/bv9u/27/bv9t/23/a/9r/23/c/98/4b/jv+P/47/jP+L/4n/iv+K/yF+IXcgfiB3IH4geB9+Hngffx95Hn8eeR5/Hnkdfx15Hn8eeh1/HXoefx55IH8gdyB+IXchfiJ3I38keiZ/Jnsnfyh6KH8peip9KnorfSx6K30seix9LnoufS55L30veS99L3kvfS54Ln0ueC59LngtfC13LXwtdi98L3cufC13LHwrdSx9LXQsfjFyN4E9a0eFUWdchWRjaYVpYmmGZmJkhV9hWoRVYVGCTmBJf0RhQHw6ZzZ7NWozejNsM3ozbjN5M200eTRtNHk0bjV5NW40eTRuNHkzbjN5M28yeTJvMXkwby95Lm8teixxLHorcip6KXMofCd1Jn0mdiZ9JnckfiR3JH4jeCJ/InojfyR6JIAoeC2AMHYxgDN2MoA2dDiBOXI+gUFwRIJGbkiCSG1HhEppTIROZ1GGVWNah1tiX4djX2aHa11uh3JbcodzWHeFe1d8hIBZfoSAW32EfFx5gndfcYBuYWd+Y2Vde1hpUHhNcEd2Qng9dDt+OnQ6gTp0OYE6dDqCOXQ5gzl0OYM4cziDN3Q2gzZ1NoI2djaDN3g5gT58S3pfgXJzgISJa4iEgmZ9gm5oV387byl8KXYnfCl8LX00ej19SXVTfl1zaH9vb3iBf2uDgoRnhIKCaHuDdWl2hXhpcIRhaVSESWhFhERqR4dJbEqITWlSiVVoWYpbaF2JXmddh1loV4dYa1qIXW5aiFhtVodWbFWGVGxThVJuU4RUcFKEU3JThFZxXYNicpWBnXiYfph7lXuMf317K4M5eU6GYHd7jnl0Y5VOdEuXRHVJmVByUptJcUGcPXI+nD51PZo8djmXbnmEkIp8gYlugG2EaoNigF+DV31QgFB/U3xRh0p5TYxQeEmRSndHl0V2Spp2dIiYhHeCkoB5iI+Sd4mNfnVbkkFzSZdPcU2cTHBKn0VxPp81cz+cW3VhmGp4f5SNe4GOdHxlilt9TodSfVeHSHxKikx7PYs/ejqLNXoyijh8OYgyfDWGNXwwhi19KoQnfSqDMX87gz9/PoZUfUyJPXw3jDR7N443fDSQM3w5jzV8M401fjiKO387izp/OYs4fj2LPX47jDp9QotRfUSJQX4/hkWATYVHgEOFQX89hD9/P4VCf0eFSX9Sg16AWn9dgWR9VIJWfF6CXHJKgj1uUoFadVGAOn9AgEyDR4BFflCAYXhwgHZ2c39zdHd/dHdzf3N2bYBwdGmBZXNKe1N1QXNIdl1yY3NleWdtZYFhbFuCU21HgjtyMYIrdyZ/J3oqezF7OXpCeUt7VHRdfWRxZn5nbmeAZm5jgGJuYYBhbl+AXnBbgFdxUoBKc0OAOXQygC13Kn8reyl+LHwufjB6NH42eDh+PXdDfEx1V3xgdWd8bXZyfHZ4eHx6enp6en97eXqCe3l7gXp5fX9/eYOAiHqMgYt6i4GKe4mAiXuJgIh6iICJeomCinmKg4p5ioOJeIaBhHiAg353fIN4eHaBdnl1fXV6dXt1enV9dnt1fXV7b31qfmV8XX5WelF9T3dReld1XnlicmZ8a3Bxe3l0fXuEeot7jn2Oe4x+inyKfYp8inyJeol7i3yLfYp7iX2GfIJ5fn92dG2BZWxlgWVran5udnN7d3l3e3R2cX1vcHF/cHBvf25wbX5tcG59bXBufXBxcH1wcW5+bXFufmxycHt1dX55h3mOeo96jXyLeop+iXqJfol6If8h/yH/If8g/x//Hv8e/x7/Hv8e/x7/Hv8e/x3/Hf8e/x7/Hf8d/x7/Hv8g/yD/H/8g/yH/Iv8j/yT/Jv8m/yf/KP8o/yn/Kv8q/yv/LP8s/yz/LP8u/y7/Lv8v/y//L/8v/y//Lv8u/y7/Lv8u/y3/Lf8t/y3/Lf8t/yz/LP8u/yz/LP8t/y3/MP80/zf/QP9G/1L/W/9e/2P/Zf9m/2X/Yv9g/1v/WP9V/1P/Tf9I/0X/Pf82/zT/M/8y/zL/Mv8z/zT/NP80/zT/Nf81/zT/NP80/zP/M/8z/zT/NP8x/zD/MP8v/y3/LP8r/yv/Kv8q/yj/J/8o/yj/Jv8m/yX/I/8l/yT/JP8j/yP/JP8k/yT/J/8r/yz/Lf8z/zf/OP85/z3/P/8//0D/Q/9F/0b/Tf9S/1X/W/9e/2D/ZP9n/2n/a/9s/27/cf91/3f/ev96/33/fP98/3r/d/92/3P/b/9q/2T/Xf9X/1D/Sf9D/0H/P/8+/zv/O/84/zj/OP84/zn/Of84/zj/OP84/zf/N/82/zX/Nf81/zX/Nf80/zj/Ov9G/1X/av97/4X/if+G/4L/dv9k/0f/Lf8o/yb/KP8p/yn/LP81/z7/SP9V/13/Z/9w/3b/ff98/3D/Zf9f/2b/e/94/3D/Zf9a/0//Tv9Q/1b/Wv9i/2n/bP9u/2//b/9w/2z/Zv9f/1r/Wf9b/1//Xv9a/1b/Vv9W/1T/VP9S/1D/T/9Q/1D/T/9P/1n/mf+g/5f/lv+U/4z/f/8z/zH/OP9W/27/cP9T/0r/UP9I/0H/PP87/z3/QP9B/0H/Qf9A/z7/N/9F/3L/fv9z/2X/ZP9h/1j/Wv9S/0v/Tv9O/0r/S/9N/0z/Rv9H/0f/Sv9M/1n/df+H/4X/ev97/5T/jv93/0b/Ov9B/0L/Q/9B/0H/QP8+/zv/Nv8v/zL/Vv+A/4z/h/92/2L/YP9V/1H/U/9J/z3/RP85/zj/OP80/zn/P/89/zL/Lv8x/y//Lv8t/yn/PP9B/zn/OP88/zj/Nv8z/zT/N/87/zz/Qf9D/zr/NP8z/zb/Nv8y/zz/Qv9D/0f/PP85/zn/O/89/0b/Rv9C/z7/OP88/z//QP9B/z7/Qf9F/0P/Qv9J/0n/Wf9R/2r/df9N/1D/af9w/3L/Yf9J/0H/QP9I/0n/SP89/1T/aP9u/3D/cf9y/2r/Wv9w/3//Zv9s/17/Vf9S/0D/QP9M/1X/Xf9j/2j/Zf9k/2L/W/9T/0j/Ov8x/yv/J/8o/yz/Mv86/0P/TP9V/13/ZP9m/2f/Z/9m/2L/Yv9h/2H/X/9e/1z/WP9S/0r/Qv86/zP/LP8r/yv/Kf8s/y7/MP8x/zX/OP89/0X/Tv9X/2D/af9w/3T/dv94/3r/e/97/3v/ev96/3r/ev99/3//g/+G/4r/i/+L/4n/if+I/4j/iP+I/4n/if+K/4r/iv+K/4n/hv+D/3//ev94/3b/dv92/3X/df91/3X/df92/3X/df9v/2r/Zf9d/1b/Uf9P/1H/V/9e/2L/Z/9s/3L/ev+B/4f/jf+O/47/jP+K/4r/iv+K/4n/if+J/4r/if+J/4b/gf96/3L/aP9h/2D/Yv9n/27/c/92/3b/c/9x/2//b/9v/2//bv9v/2//bv9t/27/cP9v/2//bv9t/27/bv90/3r/g/+K/47/jv+N/4v/iv+J/4n/if8hfiN4I34jeCF+H3gdfh14HX8deR5/Hnkdfx16HX8deh1/HXoefx56H38feSB/IHkffyB5In8jeSN+JHklfiV5KH8peCh/KXgrfSt4K30seC19LXosfS55Ln0ueS58L3kufC55L3wuei98L3ktfC14LXwteS18LHcsfCx3LHwsdSx8LHctfSx3LH0sdS5+MXE4gEBtSINRaVaDWmlehWBlYYhiYWGIYWBghl1fWoRWX1CASmJFfkBjOns1ZjN6M2oyeTJtM3kzbzN5M240eTRuM3kzbjR5M24zeTNuM3kybjB5L24weTBuLnktcSt6K3EreypyKHsndCd8J3UnfiV3Jn0keCV+I3ojfiR7JH4keyOAI3olgCd4KoAseC+BM3Q3gztwPoRAbT+EQGxDh0loTYhWZlqIXWNhiWlea4huXG6Hb1tvhnBZc4V2XHiDd155hHdfdoN3YnWAdGNxf25man1jaV56WG5ReEp0Q3Y8eTl2OHw7dzx9Ong6fzh2N4A2djWBNnY3gTd1N4I2dTaCNnU2gjV1NIIydjOCM3YzgjN3NYE2fD18TH9gdHOEf26HhIhmhYN8ZnCBV2o5fydxJX0ldyd/KHwogCx7L4A3d0B/S3BWf2FtaoJvcGqDZHNvhG5xU4Zqa4CFfWx0h2hqX4tdaWOMbGl2jH1qgIyBaoSKgmp+iX1vfYl1b26IZ3BoiWhvaYllbl+IWWpWhVNpUoNQcE6CTHRLgEx2SoBJeEeATHqUgKB8mnyUgY97iIODekWDLno2hk93Z45cdEeVSXVSmkp2RZxCdT+cQHRAnEB0P50+dz2YMng2lUZ6UZBxfm6JY4Bdg1qEV4FWglCAT39NhEl7SIhGeUuOTHdJlEl2UJpSdFegWnRYoGl0eJx8c4aUlXKOkm1yQ5Q7cjyWO3M4mTlzOZk6dTmaN3U2mTN1L5c7dWaVfnWGloZ5c5Bhe1OKTn1JhUN9RYNLfkqCPX8yhTZ+Sog7fTSFLH4zgzR/L4IrgCqEM4A/gD2ARIBFfzmGNX4zjDR8OY42fDyOQn5EjTx+N4o2fjWJNX00ijN9NIkzfTOJNHw1ijd+N4s6fDqMPnxKiVZ+SYY2fjCDLH8zgDh+OoA8fkWCP387hD1/QIRGflp+XH9Re0N/THxbf2d3YoBdckiCQXxIgUqGRX89h1mAbX9tgG12cIBydHR/WndDfmx+dn10fYaARnhXgGByV3xHcElzUHNbdGZxZ3xobWeCYmxbhFJuSIQ6czGCK3gpfyp7L3s0ezt6RHdOfFd0YH1kcWZ+Z25ngGZtZIBibWGAYG9fgF5xXIBZcVKASXNCgTpzMIAqdiiAKXcqfy13MX8xdjR+N3U5fj51SHxTdVp7Y3drfHF1dXx4d3l8e3x8e3yBfHl6gnl5eYF5eXx/gHiDgIl5i4GLeYuAiXuJgId7h4CHeoeBiHmIgop5ioOKeYqDiHmFg4N4f4N6d3iDd3h2f3V5dXx2enZ7dnp2fHV7dX1ze21+Z35jfFx+U3pPfE52U3tZdV96Y3Jne21wdHt8dYN7iXuNe459jXuLfol8iX2Je4l8inuKfYp7i36KfIh9hX6Ae3l/bXJkgl1vXH9gc2d7b3x0e3V8dX1zdHF/b3BufnBwb35ucG5+bm9ufm5vbn1ucG19bXBufm5wcX5xcXZ8fXaFeo56j3uNeox9i3qKfol6iX6JeiH/I/8l/yX/Iv8f/x3/Hf8d/x3/Hv8e/x3/Hf8d/x3/Hf8d/x7/Hv8f/x//IP8g/yD/If8g/yH/I/8k/yX/Jf8o/yn/KP8p/yv/K/8r/yz/Lf8t/yz/Lv8u/y7/Lv8u/y7/Lv8v/y7/L/8v/y3/Lf8t/y3/LP8s/yz/LP8q/yr/K/8r/yz/K/8s/yz/LP8s/zH/Nv8//0b/TP9P/1P/WP9b/13/Xv9g/1//YP9f/1z/V/9T/07/SP9B/zr/Nf8z/zL/Mv8z/zP/M/8z/zT/NP8z/zP/NP8z/zP/M/8y/zH/L/8v/y//MP8v/y3/LP8s/y3/K/8p/yn/J/8n/yf/Jv8m/yT/JP8j/yT/Jf8k/yT/Jf8l/yX/J/8r/zD/Nf85/z3/Qf9E/0b/Sv9L/0//Vf9b/17/Y/9m/2r/bv9y/3L/c/90/3b/df93/3f/d/90/3P/cf9v/23/a/9p/2b/YP9c/1b/UP9L/0L/Ov83/zX/Nv84/zj/Of86/zr/Of84/zb/N/81/zb/Nv82/zX/Nf81/zX/NP8z/zP/Mf8x/zH/Mf8y/zP/N/9C/1b/av95/4T/iP+F/4L/ef9l/0b/LP8l/yf/Jf8n/yn/Kv8w/zb/O/9E/1P/Yv9t/2j/a/9d/2T/eP9x/3j/ef94/3n/cv9z/3L/d/9//4P/hf+F/4P/hv+C/4L/hf+F/4P/f/99/3//gf9+/3j/cP9n/1v/Uf9P/0z/TP9H/0f/Rf9D/0P/Q/9B/3r/nv+V/4//iv+E/4P/Wf8u/zX/Qf9g/1b/Q/9I/03/Sv9I/0X/Qv9D/0P/Qv9B/0D/P/9e/27/Xv9C/1j/bP9n/1//WP9T/1L/Tv9P/03/S/9H/0j/Tf9N/0v/Tf9M/1T/Vv9X/1b/WP9a/2//mP+V/4T/b/9V/0L/OP87/zr/Nf83/zb/NP8y/zH/Lv8t/y3/RP9q/3z/if+M/4D/Zf9U/07/Sv9E/0H/Sf9K/y//Kf8s/y//M/8y/zz/Ov8s/yr/Mf85/yz/J/80/z//Of80/zP/NP8z/zT/Mf8z/zT/MP8w/zP/M/80/zP/M/8x/zD/MP8w/zH/NP85/zz/Ov89/0P/TP9E/y//Kf8u/zP/N/81/0L/Tf87/z//Vf9Y/1H/U/9W/2D/bf9a/0D/RP9Q/2L/Xf9L/0T/QP9C/1v/bv9q/27/cP9t/3D/dv93/2X/Rf9i/6j/kv9L/2T/Xf9M/0L/Sv9R/2D/aP9o/2n/Z/9i/1z/U/9I/zr/Mf8r/yn/Kv8u/zP/Pf9H/0//Wf9g/2T/Zv9n/2f/Zv9k/2L/Yf9g/1//Xv9a/1f/Uf9K/0L/Ov8z/zL/Mv8z/zP/N/87/zv/PP88/0D/Rf9N/1T/XP9l/23/c/93/3n/ef97/3z/fP99/3v/eP94/3j/e/+A/4P/if+L/4z/jP+J/4n/h/+H/4f/h/+I/4j/iv+K/4r/iv+I/4X/gv9+/3v/ef93/3b/dP9z/3b/dv92/3b/df91/3P/bf9o/2L/Wv9R/07/T/9T/1n/YP9k/2n/cP93/3//hv+L/43/jv+M/4r/if+J/4n/if+K/4r/i/+L/4r/iP+D/3v/cv9o/17/Wv9a/17/Zf9r/3L/dv91/3P/cf9v/3D/bv9v/27/bv9u/27/bv9t/23/bf9t/27/bv9y/3L/ev+D/4n/j/+P/43/jP+L/4v/i/+K/4r/I34keSZ+J3klfiB6HX4dehx/HHsdfx17HH8cfB1/HXwdfx17HX8eex9/H3sgfyB7IX8ieSN/JHklfiV5Jn4neSh+KXopfil6Kn0qeip9LHoufS56LX0ueS18LXoufC56LXwuei98L3svfC56LHwseS18LXksfCx3K3wrdyt8K3UrfCp4LH0reCx9KnkqfCt4LX0vdDSAO3E/gERuSYJNalGFVmdZhlxkXYdfYWCHYl9ehF1dVYFOXkx+QmI+ezdnM3kxbDJ5Mm0zeTNuM3k0bjN5M28zeTNvMnkycDF5MXAxeTFwL3kvcC55LnAseixwLXsqcip7KXQneyd1JnwmdyZ9JXckfiN5Jn8leiV/JXklgSl0K4IvcTOFOW47hkBqRYhIZ06JUWVWiVdhWIpfXWaJalttiW5bcYh1WXiGelp6hXlbeIR3XnWCcmFwgWtja4BnZ2V+Ymtee1luVnpRck14RnVBdzt7N3U0fzR2NIE2dzV/N3k4fjd5OIA4eTaANnc1gTV3NIE0djSCNHY0gjR2NIIzdjKCMXcxgjB3MIIweDCBMnszfTt/THdignVwgoSIaImEh2WBg3JlWYA9ail+JXAkfiV3JYAodS5/MXg6f0d6U31be157WX9he2OAZn5vfnF/cXdrgGlzb4FwcnWEfnCChoRtgIZ+a3yGfGl4hXlofYWHZoyHjmaPh5FolIaVbJOGjm2Khodqe4ZsaFuDTGhBfz5wPn5Cdz5+PHs5fTt9WH2YgJF8ioKHe4OCgHxxgzR9L4Q9eliKW3hJkkt3TZtLd0udVHRGnUR1Q55FdECdPnY6mF97lZKNfGqLZ3hgi2V4Y4tae1OJUH1MiFB8T4lNekeLSHhKkEx0TZhSc02dTXVbnlZ1S51Rc1SeZG+Wm49sg5hsbV2VUXJFkjt3Mo4ydzSPN3Y2kjR2MZEudyyQKnYtkEh0ZZB8do2PjHp6i2V+VoVdgVd/UYNTd0+ERHU6gjp+MoA0gDl+P4M8fzCDMIA3gjqAK4MofiuENH00ijZ8NI40fDSNM344ijp/RYZPgESEPYA3hDV/NIgyfy+KLX8tijB/LogwfjOJOH06iz9+PopFfz6GNYAvgjF/On4/fkB+P384fjV/RYJVf1J/WX5XfV9+bX5qfVuATH5OfUx/Wnltf1N4XYBlfHSAdXxsf3N6gICBd3SAd3R0f3l7dnxVg2N5gYZPe0SAU31bdVR6QXFIdldyZnhncWd/aG5ogmNuW4RSb0eEOXEygi11K38seDJ9N3lAfEp2U3xadGF9ZXFnfmduZ4BmbWWAY2xigGFtX4BebVuAWG1UgU9rSoJEa0CDP25Cg0dvSIJNbk+CUGxQglBtU4JTbViAXW9jf2lwcX52dXp+end7fXt7e3x7gHp6eIJ5enmBeXl9f4N4hoCKeYyBi3mKgIl7iICHe4eAh3qHgYl5iYKKeYqDinmKg4d5hIOCeH2DeXd3g3d4dX91eXV8d3p3e3Z6dn52e3Z+cntsfmd+X3xYfk55THxPd1R6WXZgeWV0bHpzc3h6gHmHe4t9jnqPf4x7in6JfIl9iXuJfYp7in+Ke4p/i32Gf4F/eXtwgGR0WYFScFV+W3hjeGx+dHl3e3R8c3NwfW5vbX5vcG9+bnBuf25xbn9scWt9a3JrfWtybn1vcW99dHN7eoR2jXmQepB9jHqMfox6jX6NfIx+jHwj/yT/Jv8n/yb/Iv8e/x3/HP8c/x3/Hf8c/xz/Hf8d/x3/Hf8d/x7/H/8f/yD/IP8h/yL/I/8k/yb/Jv8n/yf/KP8p/yn/Kf8q/yr/Kv8s/y7/Lv8t/y3/Lf8t/y3/Lf8t/y7/L/8v/y//Lf8s/yz/Lf8t/yz/LP8p/yn/K/8r/yn/Kf8q/yr/K/8q/yr/Kv8r/yz/Lv8z/zb/PP9A/0T/R/9N/1D/Vv9Y/1z/X/9g/2H/YP9f/1r/Uv9L/0X/Pf81/zH/Mv8y/zP/M/8z/zP/M/8z/zP/M/8y/zL/Mf8x/zH/Mf8v/y//Lv8u/yz/LP8r/yr/Kv8p/yf/J/8n/yf/Jv8l/yT/Jf8k/yX/KP8q/yv/L/80/zn/P/9E/0j/TP9S/1b/Wf9c/2D/ZP9l/2n/cP90/3b/d/94/3n/ev95/3n/eP90/3D/bv9p/2f/ZP9g/1v/V/9R/07/Sv9I/0P/Pv84/zT/M/8x/zH/Mf8y/zT/NP81/zX/N/82/zb/Nf80/zP/M/8z/zP/M/8z/zP/M/8z/zL/Mf8x/zH/L/8v/y3/L/8w/zH/Nf9D/1j/bP9+/4j/jP+K/4b/fP9q/1H/O/8m/yX/Kf80/zX/Lv8w/zz/S/9O/0f/R/9H/0//Tv9O/1L/Tf9R/1T/V/9W/1X/Wv9o/3L/df95/3b/dv91/3f/e/+E/43/kv+S/5P/lv+W/5f/lf+Q/4n/iv+O/4v/gP9y/1v/SP8+/zj/OP85/zf/Nf85/37/lv+I/4L/f/+A/3//Uf89/z//Uf9f/1D/Tf9O/0z/Sf9K/0b/Q/9E/0L/QP8+/zf/Vf+a/5L/gv92/2f/Vv9a/2D/Wf9Q/03/Uv9O/0j/Rf9F/0r/SP9L/07/Tv9O/1n/Wf9T/0j/Sv9T/5D/kv+I/3H/Xf9J/0P/NP8z/zf/OP85/zn/Nf8y/y3/Kv8q/yr/MP9K/2D/fP+V/5b/gf9u/2H/ZP9j/3P/a/9c/1j/U/9N/0T/N/8z/zj/RP9I/0n/QP83/yv/L/8z/zX/Nf8z/zL/Nv9H/0z/Sf9L/0b/Nv83/zr/OP82/zT/Ov9B/z3/OP8v/yv/Lf83/z7/Qf9N/13/Qf8y/z//Q/9I/0L/SP9H/z3/R/9N/1H/Uv9V/17/Z/9k/13/Vf9W/1X/YP9l/2f/Sf9X/2//cv9w/23/b/+E/37/aP9p/2L/W/9c/1v/Wf9N/0T/Sf9b/2D/SP87/0b/T/9m/2b/af9q/2b/Yf9d/1P/Sv88/zL/Lf8s/y//M/84/0L/S/9T/1r/Yf9l/2f/Z/9n/2f/Zf9j/2T/Y/9k/2T/Zf9l/2L/X/9e/1n/Vf9Y/1j/W/9g/2X/aP9p/2z/bP9u/27/cP9w/3P/dP93/3r/fP98/3v/ev96/3r/eP93/3j/eP96/37/gf+E/4r/jP+L/4r/if+I/4f/h/+H/4f/if+J/4r/iv+K/4r/h/+E/4H/fv97/3n/d/91/3b/dv93/3f/dv92/3b/dv9y/2z/Z/9f/1f/Tf9L/07/VP9Z/2H/Zv9u/3X/e/+C/4j/jP+O/4//jP+K/4n/if+J/4n/iv+K/4r/iv+K/4f/f/91/2v/Xv9T/03/Uf9Z/2T/bf9z/3b/c/9y/3D/bv9v/3H/b/9u/27/bv9u/2z/a/9r/2v/a/9r/23/bv9z/3z/hf+P/5H/kP+M/4z/jP+N/43/jP+M/yF+I3omfid6Jn4jeSB+HXkcfhx6HH4cehx+HHscfhx7HH8cex1/Hnkffh96IH4geiJ/I3okfyV6Jn4neSd+KHonfCh6KnwreSp8KngqfCx7LXwvey18LXstfC17Lnsuey58LnowfDB6Lnwseyx8LHsqfCt5K3wqeSl8KXgqfCp4KX0pdyl9KncqfSp4KX0reCt9K3crfSx3Ln8ydjV/OXI9gkBuRYNKalGFVmZbh11iX4dfYGCHYV9cg1VfTn1HYjt6NWcyeTJrMngybTJ4Mm8zeDNuMngybzJ3MXAwdzBwMHkwby55LnAueS5yLXktdC16K3Qqeip1KHsodyh8J3YnfyZzJoAncymBLXEvgzNuOIU7a0KHSGZNilFkVIpbYF+KYltmiWlZa4hwV3OHdFh3h3lbe4Z7XXqFeV54hHVgcoJvYmyBaWVkfmBoW31YbFJ8THFIe0R1Pnk7eDl4NXsyeDF+MXgxgDB4MIEweDCBMHgwgTN4M4EzeDOAM3gzgDJ3MoIydzKCMnc0gTJ3MoEydzKBMncygTF3MIEueC2BLXktgC17Ln80fjx5TIJlc3qDh2uNhIxli4OEZ3WDZWpPgjlrKYE2cVOBVXNKfUd6VHZcglp1UYVQd1GHU3hUh1l4X4lQd0qIRnpFhkZ8R4U/fUaCSX9MflWBXnpngXBze4SDbI6FkmSRhZdkmIOVZJF+jV9/f3hdeX93YoKCj2qShpVsjYd7bmGESG45gTNyNH82djeASHuCgIl/gn19gYF/gYFqg0t8R4JXfmN9VYxPeFOZTXZFnUZ2Q55CdkKeQnQ8njd3RphyeJ6Ql3eGjHlybYxacFSPWHVajlZ4UI1JeUaNRXpGjUd3SZFHdUiYSHNJnUt0T51Qd0mYRndKmFFwjpiPaIiZgGhlmUFwNZUydj6QQ3k+jjt4N48yeTCPKXkojil5Ko0qeDWNTHdkjoJ5lIqTe4iFfX53gHR+dXZygWNvYoNYbEyDS29MgkJ2PIBNf05/RoU+fTeHO3s6ijd8NY80fjKMN308hjx/OoQ+gD+EP387hTqAN4M1gDiBRH9FgEuBO4AugTGCMX8ygz5+SoZPf2mFcYJPhC+CPX9Sf05/TH9UflF9UoBffnOBWntMglJ6WoFnelGBXXxSgDt+PX1cfWZ5WYBPeFR/YHVcfF56WntZf2J6XoFWe1B8UX1JgER8QINMfEqGQH1FgE5+QXg8fEh0Onoxcl58a3JrgGpwaIJicFyDVHFJhTtyMYMtdi2BL3o1fjx5RX1NdFR9XHBkfmduaX9nbWiAZm1mgWhtaoFsam6CcWtyg3FrdINza3CDcG5whXRteYV6bX2EgG+BhINug4SBb4CCgW+AgoBvgYKBcoOBg3SEgYR1goB/eX5/fXt8fXt6dnx1fHl6fX6DeYmBjHmLgot6ioKJe4mAh3uHgYh5iIKIeIiCiniKg4t4ioOGeIODf3d8g3p3eIJ3eHeAd3p3gHh7eIB3eneAdXp0gHJ8bH9lf159VH5Nekp7THpTeVx5Y3lpdnF6eHZ9eoZ7i3mPgI57joCNe4t+inuIfol7iX6Le4t+i3uLgIl8hn9+gHZ8Z4FXd01/SXZPell+YnZsgXR5dXp0fHJycH5ucG5/bnBuf25wbn9ucG1/a3FqfmlzZX1mdGl8a3Rud3V1f3eIe495knyPfYt7jH6Me41+jXuNfot7IP8i/yT/Jf8l/yL/IP8d/xz/HP8c/xz/HP8c/xz/HP8c/xz/Hf8e/x//H/8h/yH/Iv8j/yX/Jf8m/yb/J/8o/yj/Kf8q/yr/Kv8q/yz/Lf8u/y7/LP8t/y3/Lf8u/y7/Lv8u/y//L/8u/yz/LP8s/yr/K/8r/yr/Kf8p/yr/Kv8p/yn/Kf8p/yr/Kv8q/yr/K/8r/yr/Kv8q/yv/Lf8y/zX/N/89/0L/R/9L/1L/Wf9c/1//Yv9i/2H/Xf9U/0z/Rv87/zX/Mv8y/zL/Mf8y/zP/M/8y/zH/MP8x/zD/MP8w/zD/Lv8u/y7/Lv8t/y3/LP8r/yv/Kv8o/yj/KP8o/yj/K/8r/y7/Mf80/zr/Pv9F/0n/Tv9V/1j/Xf9i/2j/av9t/3D/c/90/3b/eP96/3r/e/95/3j/df90/3H/b/9q/2b/Yf9e/1j/Uv9P/0n/Q/89/zr/Nv8y/zP/Mv8x/zD/L/8v/y//L/8v/zD/MP8v/zD/Mv8y/zL/Mv8x/zH/Mv8y/zL/Mv8y/zT/M/8y/zD/MP8w/zD/MP8v/y7/Lf8s/yz/Lf8u/zH/Nv9F/1r/cP+C/43/jv+L/4n/gP95/2n/T/86/0P/WP9X/1H/Uv9L/13/bf9w/2L/Zf9o/13/Zf9g/1n/ZP9j/1L/S/9F/z7/RP9E/0X/Rv9H/0T/Sf9c/23/f/+O/5X/lv+W/5H/jP+D/4r/j/+P/4T/f/+U/5n/nP+a/5X/jv96/1n/Qf83/zz/R/9M/2j/j/+J/4H/gf+B/33/cv9u/27/Z/9Y/0z/T/9N/0T/RP9C/z//Qf8//zz/O/9i/4z/n/+Z/4n/fv9z/2n/Xv9Y/1X/Uf9N/0j/RP9G/0n/Sv9K/0j/R/9G/0n/TP9F/0b/Rf9H/03/Tf9+/4j/f/95/23/Rv88/zf/Qv9H/0T/QP84/zD/KP8j/yP/Jf8n/yn/Kv84/1D/YP94/4z/k/+P/4T/df9q/3X/af9x/3j/ZP9p/2v/Wf9K/1f/Xv9R/0P/PP85/zf/OP80/zD/L/8w/zL/Nf82/zb/OP86/zj/Of9H/0//R/85/0P/Q/83/yr/Kv8r/zH/Tv9o/2v/bf9k/1//SP9C/0f/Q/9U/1D/T/9T/1z/bf9j/0z/Xf9m/1r/Tf9H/zn/Q/9O/2r/W/9D/2P/af9l/1j/Sf9J/0P/P/8//0X/TP9G/zf/N/8//03/Wf9S/03/R/9L/1H/W/80/0//Z/9r/2n/av9o/2L/XP9U/0j/Pv81/zH/Mf8z/zn/Qf9I/1D/WP9f/2P/Zv9p/2r/bP9u/3D/cf9z/3b/ev99/4D/g/+G/4f/hf+G/4b/hv+H/4n/iv+K/4v/i/+K/4r/iv+K/4r/iv+L/4v/iv+K/4r/iv+K/4f/hv+B/3//f/97/3r/fP+A/4L/h/+L/4v/i/+K/4r/iP+H/4f/iP+I/4j/if+K/4r/i/+J/4X/gv9//3z/ev94/3f/d/93/3f/eP94/3f/d/91/3T/cf9r/2X/Xv9T/0v/Sf9O/1P/XP9k/2v/cv95/4D/h/+O/5D/j/+N/4z/iv+J/4n/i/+L/4v/i/+L/4v/h/+E/3z/cv9j/1H/Sf9H/1D/Wv9l/2//dP91/3T/cv9w/27/bv9u/27/bv9u/27/bf9r/2n/Z/9i/2T/Zv9o/27/dv+B/4v/kP+R/4//i/+L/4v/jf+N/43/i/8ffh96In4keiR+Insffh17HH4cfBx+HHwcfhx8HH4cfB1/HXwefx56H34geyF+IXsifSN6JH0meid+J3onfih7KXwqeyl8KXorfCt5LXwtey18LXstfC17LXwtey57LnsufC57Lnwtey18LHosfCx6Knwreit8KnoqfCp6KXwpeSh9KHopfSl6KX0qeSp9KnkqfSp5KX0peSp9KncrfSt1L30vdDR/OHE8gkJuR4ROalWHW2RhiGRgZIdkXl2BVV9NfUVjOXozZzN6MWwxejJtMnoybjJ6MG8weTBvMXkxby95L28ueS5wLnkucS15LXIteipzK3oqdCl8KHQpfipzLIIvbDWDOGk8hUJkR4dNYVCIVF5biF9aZIpoWW2JcFdyiHRXd4Z5V3iFeFl4hHdadoN0XnKDcGNtgWtoZ4Bial59WW1UfE9wSntGdT56O3o1eDF7MXkwfTB5MH8ueS6AL3kvgS95L4EveS+BL3kvgS55L4ExeTGBMXkxgDF5MYAyeDKAMXgxgDF4M4EyeDGBMXgxgS94LoEueC6BLXksgSt5K4Asey5/L30yfDyAUHVng3xwiIOOaYuEjGaEg3hrcoJ3b3eBfHN+fXV1ZnxRej94P4FQdWOEdXN5iVxyT4tXc1iLX3Vui3d2dIphdkmJQ3hDi0N6RItGfEOIQXxDhUR8R4JLfVx9cX1+en59fXOFgY5qkYKWZpWCjmeLg5NqmoOfa5yElWiWhpVojIZ5aWOHYGpuhXlrhYOWco+Ag3qBgH58gYSMdIqCgnVxfViDTHlNlEl1R5tDdkGeP3Y9nkV0TJxWcn+al3Gfk51yjY9/bniObWtikF1uXZBac1KPSXdIjUd7SI5IekmSSHdGl0V0RpxIdEWcPHQ9mkV1U5VZb2yYhmV0nG1jaZ5RakCaPnNClUZ3RJBCeD2MM3omiiF7IIgheySHJ3oqiSt5PopRdmCIcXiDho17jYOEe3SAbnppgHV+fnp0gXZ3cIFlfGJ9Y4Zae1yKR3o7jjx6O5A5fTaJMX8zgTSCNXwzgzZ7OYE1fjiANX9EgDt/O4A/fDuBN3w7gTZ8NX8tfi99OYFefXCDcX1lhFZ+XYRVflSCT31PgER7TH9TelaBXXpXglN7ToJce0uERXxQhkh+QoRafkyAXnttgF16X31gelZ8TXsrfS58OYE1fDOBNnw3gDR8PX5NfFF8Y4Bse1+BVXxHf0R5T31ldmN+aXNogWlza4FrcmeDY3JehFZzSYU/dTiEM3g1gzR6O4BGekt+VHVZfmJyZ35ubHB/cmt2gXZqeoJ9an+Cg2qHg4lrjoOPbJCDj22Ng4xui4KLbYuBjGyLgotsi4GLbIqBimuLgIttjICNbY6Ajm2PgY9sjoGObo6BjXOLgYl1ioGEd4CBf3iAf4N6hHyJgIx7i4KKeoqDiXuIgYd7h4OHeYeCiHiJgop4ioSKeYmEhXiChH93fIR7d3mDeHh4gXd5d4B3eneAd3p3gHV6dIByfGuAZH9cf1J+SXtIe017U3lcemV4bHpyeHp5g3mIfo55kYGOeo6BjHuKfoh7iX6Ke4p/i3uLf4t7ioCHfIN/eYBteV6BTXVFfkd4U3ldf2h2cYJ0eXV8c3xydHB+bnFuf25wbn9ucG5/b3Ftf2tyaH5ldWN9Y3Vke2h6b3d4foN2jH+QeZB9jn2Neox+jHqOfo57jX6Mex7/Hv8g/yD/IP8g/x3/Hf8c/xz/HP8c/xz/HP8c/xz/Hf8d/x7/Hv8f/yD/If8h/yL/I/8k/yb/J/8n/yf/KP8p/yr/Kf8p/yv/K/8t/y3/Lf8t/y3/Lf8t/y3/Lv8u/y7/Lv8u/y3/LP8s/yz/LP8q/yv/K/8q/yr/Kv8p/yn/Kf8p/yn/Kf8q/yr/Kf8p/yr/Kv8r/yv/Kv8q/yr/Kv8r/yv/Lf8w/zT/Ov9A/0f/T/9V/1v/Yv9l/2n/Zv9d/1b/Sv9C/zj/M/8y/zL/Mf8y/zL/Mf8w/zD/MP8x/zH/L/8v/y7/Lv8u/y7/Lf8t/yz/K/8r/yr/Kf8q/yz/Mf80/zj/P/9D/0f/Tv9U/1v/XP9i/2j/a/9v/3L/df93/3n/ef94/3b/df9z/3H/cP9s/2v/af9n/2L/Xv9Z/1T/T/9L/0X/Qf86/zb/Mv8v/y3/Lf8u/y//Lf8t/y7/Lf8u/y7/Lv8u/y7/L/8u/y7/Lv8v/zD/MP8w/zD/MP8w/zH/Mf8w/zD/MP8y/zL/Mf8x/zH/MP8u/y7/LP8t/yz/K/8r/yv/K/8t/y//N/9F/1v/cv+D/4z/iv9//3T/cf+C/5L/lf+R/4v/g/9+/3v/cf9Y/03/Uf9k/1r/YP9R/0r/UP9l/2z/Zf9+/3z/XP9R/0j/Rf9E/0T/R/9G/0P/Qf9F/0b/Rf9H/0n/Vv9f/3//kv+V/5r/kv+S/5H/lP+X/57/nP+Q/47/lP+X/5D/iP+M/5H/kf+S/5X/j/+F/37/fP9+/4//hf9Y/2j/WP9K/0z/S/9H/0P/QP9B/z3/Pf9D/2//k/+h/6f/m/+M/4j/ff91/2v/Z/9k/2P/Yf9h/03/SP9d/2b/YP9X/0n/Rv9F/0X/Q/85/zL/Of9I/1z/aP9//3j/X/9g/1j/R/9E/0P/Rf9C/z//Pv84/y3/Iv8h/yP/J/8q/yv/LP8v/zr/Tf9c/2r/d/+E/4f/gv94/3f/ff9+/4L/ev91/2r/Xv9P/1X/SP88/0T/SP9P/1j/VP89/zr/QP88/zb/N/9C/zT/Mv8+/z//Q/9G/1r/Vf88/z7/M/8x/zX/NP83/1X/af9k/1z/Vv9c/1v/Uf9A/zv/Q/9h/2r/aP9e/1z/Wv9V/0b/RP9M/z//Qf9N/1j/SP9W/2j/Xv9c/07/Rf9L/z//R/87/z//Nv8//0P/SP9c/2X/aP9//3j/b/9O/0z/Pf9B/2X/Zv9m/2n/av9r/2v/Z/9j/17/Vv9M/0H/Ov82/zf/Of8//0b/T/9X/2D/aP9v/3T/d/98/3//gv+F/4j/i/+P/5D/kv+S/5L/kP+O/4z/jf+L/4v/iv+L/4v/i/+K/4r/i/+L/4v/i/+K/4z/jP+M/43/jf+N/43/j/+O/4//jv+M/4v/if+I/4b/iP+J/4z/jf+M/4v/iv+I/4f/h/+H/4f/h/+I/4n/iv+K/4r/if+F/4L/f/98/3v/ef94/3j/d/93/3f/d/93/3f/df90/3D/av9h/1n/UP9I/0f/TP9T/1z/Zf9s/3T/e/+D/4j/jf+Q/47/jv+M/4r/iv+L/4r/iv+L/4v/i/+K/4f/gf94/2n/Vv9J/0X/Sv9U/17/av9y/3T/df9z/3L/cP9u/27/bv9u/27/bv9v/23/a/9o/2X/Yv9i/2P/aP9x/3n/hf+N/5D/j/+N/43/jP+M/47/jv+N/4z/HX4deR5+Hnkefh57HX4dexx+HHscfhx7HH4cexx+HHsdfx56H38eeh9+IXshfiF7In4jeyR+JXsnfid6KH4peih8KXwqfCp8LHwseyx8LXsufC56LHwuei57Lnouey56LnsufC57LXwsfCt7Knwqeyp8K3wrfCp7Knwqeyl8KXspfSl6KH0oeih9KHoofSh6KH4peyh+KHspfSl7Kn0neyl9KXgrfSt2LYAydDmCP3FHhk5sVYhfZmSHZ2FqhWRfXIJSX0t+QmM6fDVpNXs0bDN7MW0yejBuMHowbzF6MHAueS5vL3kvcS55LXMtei1zLnwtdSx9LHQugTFvNoM4aj+GRmRKh09eVIhbWl+IZFhph2xXbYZwVnOHdVZ3hnZYdoR0W3KCb15tgWlfaIFlYmGAYGhdgFluVXxQckx7RnVCejt5N3oxezB7Ln4tei2ALXotgi56LYItei2BLnotgS15LYIteS2CLnotgi56LoIvei+BLnovgTB6MIEwejCBL3kvgTB5MIExeTKBMXkxgTJ5MoEveS6BK3srgSx7K4EqeiqBKXspgSl7LHwwfzp5ToFkcniCg2+Eg3pyfIGLdZGBin2Df4WBin+GgIN/gnyCfX16endsglhvXYtubGKRVm9Pj2V0hIuCdXeIfHFui2BzT4xFeUGMRnlGi0V7SItFe0aNSHpKjkx9So1Bfj+LU4FugoeClXKThI9pkIOTb5iDnW2ahI5hioOMXI2DiGFxgopojoKUbI+ClHGOgIR5e355eHuBkXGNg3FthYJde0h6SpBLd0WaQXc/nTt1Op06dUqcfXCXmqNrp5CcbGWUa26Dkn5sdZFubWyQa3BqjWl3aY6BfZWOln2SkIx4g5R4dVyZRnQ+mjd0MZkzc0uYZW9rl3JpbpplaGGaXWxNmEhzRJVEd0GRP3k/jD17MokofCWGJ3wphix7LIgseyyJLXg6iUx3XYhnd3CGdnd7hoZ0kYmVeISKh3+Bi3WCb4thgVGLYoBWjU58V45VeliOVXtYij5+NYJFgUN7RYJCeESBMXo2gUF9OoBGfk+AS35GgUN/MIEugTuAOYEsfjSESntahVN8ToVQfFyFVX1Ggz17RoFLeFSETHVRhkl2TIVReFWDR3pFg0d7SoRNfVaDV3tIhEl4WIZaeE2FQHhFgE97SX5HfDh+P35DfTh9OXxEf1h5bn95eX2AeXlzglJ5NIA9elF+aHpngGd3Z4FpdGqAbHRogWJzXoRXdE6GRXg9hjh9O4M8fkOATHlVf19zZ4Bxb3mAfW2BgIZuiYKNbpGEkmuShJNrlYKUa5KDkmyPgo5ui4GKcIeAh3KHf4dyh4CIcIqAim+KgYpuiYCJbIl/imuKgYlpiICLaoyAjGqLgY1pjoGPao+Djm+Ngo1yjYONd46BknyQfY6AjHuJgoh6h4GGeYaCh3mHg4l5ioSLd4uEineIhIV4goR/eHyEe3d6hHd4d4J3eXeBd3p3gHd5d4F1enOBb3xngGB/WX5Pfkd6RnxMe1R4XXtmd217dnd+eoR3iX6MeY+BjnuNgIt7ioCJe4eAiXqJgYt6i4GLfIqAhn2Af3eAaHhUgkhzRX5Md1d6YIBrdnKDdXh1e3J8cnFwfm9wbX9tcW5/bnJuf29zbX9qc2eAZHRhfmF3Y3tofHF2fYCHdY5/kniQfI19jXmMfox7jn6Oe41+jHsd/x3/Hf8d/xz/HP8c/xz/HP8c/xz/HP8c/xz/HP8c/x3/Hv8f/x7/If8g/yH/If8k/yP/JP8l/yf/J/8o/yn/KP8p/yr/K/8s/yz/LP8t/y7/Lv8v/y7/Lv8u/y7/Lv8u/y7/Lv8t/yz/K/8q/yr/Kv8q/yr/Kv8p/yn/Kf8p/yn/Kf8o/yj/KP8o/yj/KP8n/yf/KP8o/yn/Kf8p/yj/Kf8p/yv/K/8q/yv/MP82/z7/Rf9Q/1n/X/9n/2v/af9j/1v/U/9N/0X/Qf89/zj/N/82/zX/Mv8x/zD/Mf8w/y//Lv8v/y//Lf8t/y3/Lf8r/y3/L/8x/zP/N/88/0P/Sf9P/1X/XP9h/2X/av9t/3D/c/9z/3P/c/90/3L/cP9v/23/av9l/2L/Xv9a/1f/U/9S/07/S/9F/0H/O/82/zT/Mf8s/yz/LP8s/yz/Lf8t/yz/Lf8s/yz/LP8t/y3/Lf8t/y3/Lf8r/y3/Lv8u/y7/Lv8t/y7/L/8v/y//L/8v/y//L/8v/zD/Mf8w/zD/MP8w/y//Lv8r/yv/K/8r/yr/Kv8p/yn/KP8p/yr/Mv9A/1T/Zf9v/3P/f/+M/4//jf+F/4L/ef92/3b/hf+F/37/gf9+/1z/Uv9r/3P/bv9m/13/b/+H/4//fP91/23/Z/9b/1f/UP9F/0X/Sv9S/0v/Rf9E/0P/Rf9J/0v/R/9H/0r/Xv+B/5b/kf+T/5T/mP+d/5n/if+I/4z/i/+G/3L/d/+G/4n/gv+Q/43/gP96/3j/ef+O/5P/lP+O/2P/R/9J/0n/Rf9C/0P/T/9H/zj/Uf+I/53/pv+p/6P/Xv8s/1j/e/+B/3n/eP92/3r/ev+E/5X/n/+h/5n/k/+I/3n/ZP9N/z7/Nv8v/zj/U/9l/2z/c/9u/2f/Yf9e/1X/S/9B/z//Qf8//0D/Pv84/zH/Kv8u/y//L/8v/y3/K/8q/yv/Ov9Q/1v/Z/9q/2z/f/+T/6H/mP+W/5j/jf+G/3v/a/9j/2X/Zf9i/1j/VP9E/1b/Tf88/z7/Qv8//0n/Qf8w/z3/O/9B/0b/P/9H/07/Ov8u/z//Vv9E/y3/Nf9J/1T/W/9K/0H/Sv88/zz/TP9M/0j/UP81/zr/PP9A/0b/V/9W/0b/Rf9F/0//Tv9c/2b/X/9N/zj/Nf9H/1n/S/9T/0z/Nv83/1L/Wf8//0T/Sv9m/3D/X/9q/3L/T/9D/1f/Y/9m/2f/aP9o/2r/av9s/2j/ZP9f/1j/T/9G/z7/PP8+/0L/Tf9W/1//af9z/33/gv+H/4z/jv+R/5P/lP+U/5T/lP+U/5P/kP+P/4v/iP+E/4H/fv97/3n/ef97/37/gP+C/4H/g/+G/4f/hv+H/4f/hv+H/4f/h/+H/4n/if+M/4z/jf+N/47/kP+Q/5L/k/+T/5H/kP+M/4r/iP+H/4b/hv+H/4f/if+K/4v/i/+K/4j/hf+C/3//fP97/3r/eP93/3f/d/93/3f/d/93/3X/c/9v/2f/X/9V/0r/Rv9F/0v/Uv9b/2P/bP93/3//hf+K/4z/j/+O/43/i/+K/4n/iv+L/4v/i/+L/4v/iv+G/4D/df9m/1P/Sf9K/1L/W/9l/23/cv9z/3P/cf9w/3D/b/9t/23/bP9s/2//bv9t/2r/Z/9k/2D/YP9j/2n/c/9+/4j/j/+Q/5D/jf+M/4z/jf+O/47/jf+M/xx+HHwcfhx8HH4cexx+G3scfhx7G34bexx+HHscfhx7Hn8feh5/H3ohfiF6In4ieiR+JHolfiZ6Jn4nfCl+KnwofCp8KnwsfSx8LHwsfC18LHwtfC58Lnwuey58LnsufC57Lnwseyt8K3wreyt8K3sqfSp7KX0peyl9KXwpfSl8KX0peyd9J3sofSh7J30neyd+J3snfid7KX4peyh+KXspfih8KX4peimAKXgsgTF2OYRAcUmHUmtciGRkaYdrYWmFYl9cg1deUYNLYEeCQ2M+gT1lO385ZjV9M2czfTFoMHwwbC58Lm8ufC1wLH0tcC9+L280gDdsOoM/aEeGTWJUiFpdYIdjW2eHbVtwhnJccoV0XnOEcV5xgmxeaoFoY2WAYWdcflhrVH1Pb0x8SHJFfEF1PXw5eTV8MXswey5+LXsufyt8K4EsfCuCK3wrgit8K4IreyuCK3srgix7LIItey2CLHssgix6LIItei2CLXstgS17LYEuei6BLnougS55LoEueS6BLnkvgS95LoEvey+BLnsugSx7K4EqeyqBKXspgSl8KYEpfyh/KoArezWDRndag2Z3fIB+foZ/g4N/foGGcX9ih3CAaIVpgG+EV3lYhGVyWIlcbGeOZ2lkk19uX5BxcoOLknKEiHRubIpncGKKWnVNi0R4RotKfFCKSnxFikV8Q41EfkePSX9LkkyBTJJPgniHmISSd5GDknSXgZ50l4OKaoiDjWCOg45dhYJ1YH2CiGl5gotzjICBfHt+d312gYl1kIGObo+BcXREfUyKS3lJmEl3Q5w/dz6bN3VamY9un5elbaqPpWmKlCtvNJhNcHKXgW6Cl31ueZR7couSm3ahkKBzlJKObYaWdG1dmUhwO5k0dC+WOXVNk1lzYpJnb2iVY21blVZwVJRPdEGRPnc/jj95QYpCez6IOHwxhzN8M4cxezCHL3stiCt5KogreDWITHdfiGh2ZIdrc4GLmHSijKR4pIykf6KLmIN+jGCDVo5ogXGOZn9Vik99YYVWf0WDPIJIf1eDPnkygjx5OoFEe0+AUntLfz56L4AmfTSBR4FXf0WDMn07hUd8VYZje1aIQ3tFiER9NYc7fUaGW3xThjx9N4QzejeDOnlFgkR6SINCezGCOntBg0Z4YYVieziEPH5ZgF9/WHtMflt5UH9LeVOAbnpogWB5Y4Fge2p/bn1OgFZ8X4FdemCBZndlgWd4ZYJmdmmBandrgGt1aIJldWGDWHVRhUh4QodDfEiETnpZgWJza4F1cH+Bh2+LgY1skIGRapKBlGqUgZRrkoKTa5KCjm6LgodygIJ4dHKCbHZmgWJ3YIBgeWKAZHlngGt5b39yeXh9e3Z8fH90fn6Ac4R+hHOFfoVzhn+Hb4iAiWuKgIpqi4CObJGBkW6UgZR0k4GSeo9+i36JfIiBh3qHgoZ5h4OJeYqEi3mLhYp5h4WFeIKFf3d8hXt3eoR4eHeDeHl4gnd6d4F3eXeCdXpygm18Zn9cf1B8R39Ee0R8SnxQeFp+Y3dtfXd2f3+Hd4yDjXmPgo56jIGLe4qAinuLgIt6i4GMeoyBjHyLgYZ9gH11gGZ0VoJPb1CAV3ZffGd+b3hzgHR7cnlwfG50cH5vc25/bnJuf25zbn9udG2AanVngGV1YX5feGR5an10dYGAi3aRfpB5j3yOfY57jn6OfI5+jXyNfox8HP8c/xz/HP8c/xz/HP8b/xv/G/8b/xv/HP8c/xz/HP8e/x//Hv8f/yH/If8i/yL/JP8l/yX/Jv8m/yf/Kf8q/yv/KP8q/yv/LP8s/yz/Lf8s/yz/Lv8u/y7/Lv8u/y7/Lv8u/yz/K/8r/yv/K/8r/yv/Kf8p/yn/Kf8p/yn/Kf8p/yn/KP8n/yf/KP8n/yf/J/8n/yf/J/8o/yj/KP8p/yn/KP8o/yj/KP8o/yr/Lv8z/zr/Qv9M/1T/Xv9k/2j/av9o/2P/Xv9Y/1b/Uv9O/0v/Rv9D/z//Pf86/zj/Nv8z/zL/L/8u/y7/Lv8v/zD/M/82/zn/Pv9D/0j/UP9W/13/Yf9n/2r/bf9w/3T/cv9w/27/bP9q/2b/Yv9e/1v/Vf9T/07/S/9G/0H/Pf85/zP/Mf8x/y3/LP8s/y3/Lf8s/yv/K/8q/yv/K/8r/yv/K/8r/yv/K/8r/yv/LP8s/yz/LP8r/yv/K/8r/yz/LP8s/yz/LP8s/y3/Lf8u/y7/Lv8u/y7/Lv8u/y//L/8u/y7/Lv8t/y3/LP8r/yr/Kv8p/yn/Kf8p/yn/Kf8o/yv/Nf9N/3D/ev95/3X/cf9t/2n/af9e/1z/dv9z/2//ff93/3T/Zv9a/13/Yv9U/0v/VP9i/3X/gf+M/4b/df9p/23/bf9n/1b/RP9B/0n/SP9K/0f/RP9F/0X/Rv9G/0j/Sf9M/03/df+W/47/i/+P/5f/nv+V/4v/jP+L/47/jf+O/4v/jP+S/4f/jv+J/3//ev92/3b/hP+L/4v/i/96/0v/R/9I/0b/Rv9F/0H/Pv81/2P/k/+h/6f/p/+l/5r/V/8y/z3/P/9G/0n/Pv9B/2r/h/+a/5n/kv+F/4D/df9m/1r/U/87/zH/Mf8+/0z/WP9a/13/Xv9g/1j/VP9Q/03/Q/89/z7/Qv9E/0f/Qv8//zn/Nv82/zT/M/8x/y7/Lf8p/yr/K/81/1L/Yv9f/13/bv+A/4r/k/+d/5//n/+b/4v/eP9p/3j/c/9o/2D/W/9X/1r/S/9H/1b/YP89/zn/NP87/0H/R/9G/0j/OP85/z7/SP88/0X/Pv85/zz/SP9R/1n/Tv88/zv/X/9D/z3/Rv9a/17/Rf8x/y7/Nv82/zz/SP9F/0D/Pf9F/0j/SP9U/17/Zf9u/2v/Z/9l/2n/Zf9p/23/bP9m/1D/Vf9p/2D/Zv9s/2D/Zf9r/2n/af9l/2P/Zv9n/2f/Z/9r/2v/a/9q/2b/Yf9a/1P/TP9L/07/Uv9a/2T/b/95/4H/if+M/43/jv+Q/5D/kf+T/5L/kv+Q/47/iv+D/3v/cv9q/2D/WP9S/0r/Rv9F/0X/R/9L/0z/Uv9b/1//Z/9s/27/c/92/3r/ff99/37/fv+A/4P/hP+F/4f/h/+I/4v/jP+O/5D/kv+Q/5D/j/+M/4r/if+H/4f/hv+H/4n/iv+L/4v/iv+H/4X/gv9//3z/e/96/3j/d/94/3j/d/93/3f/d/91/3L/bv9l/1v/T/9F/0H/Qf9H/1H/W/9l/2//ef+B/4f/jP+O/4//jf+M/4v/iv+K/4v/i/+L/4z/jP+M/4v/hv+A/3f/aP9c/1L/VP9a/2P/bP9z/3T/dP9y/3H/cP9w/2//bv9u/27/bv9u/27/bf9q/2f/Zf9i/2H/ZP9s/3b/g/+N/5H/kP+P/47/jv+O/47/jv+N/43/jP8cfhx7HH4cexx9HHscfRt7Gn8afBl/G3wcfxx8HH8dfB5+H3sffiB7IX4heyJ+JHslfiZ6Jn4neiZ9J3sofSl7KnwqfCt8K3wtfC58LXwtfC18LXssfC19LnsufS57Ln0uey58LnstfCx8LH0rfCt9K30ofCp9KnwpfSh8KH0ofCh9KHsofSh7J34nfCh+KHwnfid8Jn4mfCZ/Jnoofyh6KH8ofCZ/Jnwnfyl7Kn8qei+BNHQ7gkRvTYZXa1yIZGdoh2hkZ4ZkYGSHYF9bh1leV4ZSXlGGTV9Jg0VgQ4JBYDp/NmQ1fjJnMn4yaTOAN2g6gz5lRIRIY06GVF9Zh19dZYZoWmuFbVtuhG9dboNtYGqAZmJhfl5nWHxVaVB9TG1Ke0VyPns7djd7M3kwey97Lnwtfix8LH8rfSuBLH0tgSt8K4IqfSqCK3wrgit8K4IrfCuCK3wrgit7K4EreyuBK3srgit7K4IreyuCK3srgix7LIEseyyBLHssgCx7LIAtei2CLXotgi16LYItei2CLHssgSx7LIEseyuBKnsqgSl8KYApfil/KIAofiuCMHphhH18gYNvgGWBaYJ2gG+CZH9phl5/Zod7g3qHeYJthl18Zodgc16MfG11kGNqZJJsbHSPfG2Lioxyk4aQdoyFjXWFhnl4dYhke1WJS31Mikx9R41EfUWPRH9GkUaBSpJNgU2SSoJpi5SDj3yMgYx3k4Gbd4mBW3tygIVziYCHbIyAj2aRgZRnjYGRdYZ9e395fHWBdIGKeJGDkXCQgot0XH9EiUl6SJVIeEOZQXY8mzpycpuabaOWqGmpj6ZnmpR0bDCaPHE7mjl0N5o0dC+aUHJ+mZBvjZaHbYKVeWxxlmVtWJdQcUeVNXU6k0J2TJFSdFKPVHFWkFhvVZJPckuQSHVEjTx3OYtBeEqKS3pGiER7QIg7fTmHN3s2hzV6MYcueSuJLnkxijd4QIlWdl6JW3RijGtwdI5+cISOiHSIjoh5iYqFfYOHgoB+hXWAaYJVfVCAVX9UfFWDZHpkhUx6QoM3ejWBMngyfzt4Pn88ej+AQH00gTeAN4A5gzx/O4M6fT2EQX06hTZ+MIctfTqIO30+izd+Z4dafjOCLX0wgT55ToFBeDaAPHtKf1B7UoBMfGOCeHx3f3J/cHpugGt5aoFpeWuAaXtpgGB6VoBoe3OAYH1af3F+cX5tfWl/aHtmgWV4ZoJmeWeCaHhqgW13bYFsdmqCaXNkg2F0XIRZc1mEXHRjhGp0dYJ+cYaAim+NgI1rjYCPbJCAkGyQgJBvjX+KcYmAhm9+gnRwaYNgclWDS3ZBhD56O4Q8fTuEO346hDx/PoJCfkqAT31XfmF7Z35veXN9dnl4fHp5ent7e317gHqAfYB0g36Fbod+iGmIgIlojYGPa4+Bj3GPgY17jH+If4d8h4KIeYmDinmLg4t4ioaLeIiGhnaBhn52fYd7d3mEd3p3g3h5eIN3eXeCd3t2g3Z8cYJrfWSCWoBRfUaAQXtCfEh8Unhcfmh3cYB5doGCiXaNhY94joKMeouAinqJgIp6i3+LeouAjHqMgYt7ioCHfYB6doBqcV6CWW5agV90Z39ufXV7dn10fHJ5cH1wdnB+bnVuf250bn9udG5+bnZtf2p2Zn5kdmJ8YXpieW5+e3aGgI93kn6Qe498jn+Oe49/j3yOfY18jH2LfRz/HP8c/xz/HP8c/xz/G/8a/xr/G/8c/xz/Hf8d/x3/H/8f/x//IP8h/yL/Iv8k/yX/Jv8m/yf/Jv8n/yj/Kf8q/yr/LP8s/yz/Lf8t/y7/Lf8t/yz/Lf8u/y7/Lv8u/y7/Lv8t/yz/K/8r/yr/Kv8q/yr/Kv8q/yn/KP8o/yj/KP8o/yj/KP8n/yf/KP8o/yf/J/8m/yb/Jv8m/yj/KP8o/yj/Jv8m/yb/KP8q/yr/K/8v/zP/PP9H/07/Vv9d/2L/ZP9m/2X/ZP9j/2P/YP9e/1n/V/9T/1P/UP9N/0r/Rf9B/zv/Of84/zj/Pf89/0H/Rv9L/1H/V/9d/2D/Yv9o/2r/a/9p/2j/aP9l/2H/XP9Z/1T/UP9K/0b/Pv86/zf/M/8x/y//L/8t/yv/K/8s/yz/LP8s/yv/K/8t/yz/K/8r/yr/Kv8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/LP8s/yz/LP8s/yz/LP8s/yz/LP8t/y3/Lf8t/y3/Lf8s/yz/LP8s/yz/K/8r/yr/Kf8p/yn/Kf8q/y3/M/9H/4D/ev9x/3r/d/90/3f/af9p/2v/Z/9q/3X/YP9N/0v/W/9c/2X/Z/9l/2L/ZP9f/2f/e/99/4f/gP+T/5v/o/+j/53/kP+K/4b/eP9V/0P/SP9I/0X/R/9I/0j/Sf9I/0n/Sf9H/2D/lf+Q/4r/jP+Q/5n/iP8v/zn/T/9j/3H/f/+I/4z/jv+M/43/hP95/3f/df93/5H/mv+a/5j/lf9o/0D/R/9G/0X/Qf9A/z3/Rf95/5n/ov+l/6r/pv+d/4H/Mf85/zv/O/87/zn/NP85/2b/ef97/3r/dv9x/2f/X/9Y/1D/TP9H/0f/SP9J/0r/Tv9Q/07/UP9S/07/Sv9J/0b/Pf80/0D/Tv9O/0v/Rf9D/0H/P/86/zf/Nv80/zL/Mv80/zf/Ov83/0P/V/9d/1//ZP9s/3D/cf9z/3X/c/92/3f/cv9q/2j/av9m/1b/Sf9N/1X/Wv9R/1b/WP9O/zH/Mv8s/zn/Rf8//zz/Sf9K/zL/Of88/zj/OP8x/y//Of9L/0T/MP8w/zf/Of80/zz/Of89/1H/K/8s/zH/Nv85/zL/SP9l/23/Uv9Q/0r/cf96/3b/cv9v/27/a/9r/2r/av9r/27/bf9x/3H/df9d/0r/bf9y/27/af9n/2b/Zv9m/2b/Z/9o/2n/a/9r/2z/bf9t/2z/av9p/2r/a/9w/3b/fP+E/4r/jf+O/4z/jP+M/4v/jf+N/4v/if+G/4D/ff92/23/Zf9d/1b/T/9H/0H/Pv89/zv/PP88/zz/Pv8//0L/Rv9N/1b/Xf9m/23/c/92/3f/d/92/3f/ef98/3z/fv+A/4H/gv+F/4b/hv+G/4v/jP+M/43/jf+N/4v/iP+I/4j/iP+K/4v/i/+K/4r/h/+G/4H/fv99/3v/ef93/3j/eP94/3f/d/92/3X/dP9u/2r/Y/9b/1D/Rf9A/0P/SP9R/1z/aP9x/3v/g/+J/43/j/+O/4z/i/+K/4n/iv+L/4v/i/+M/4z/i/+K/4f/gP92/2r/X/9b/13/ZP9r/3H/df93/3X/cP9w/3D/bv9u/27/bv9u/27/bv9u/23/av9m/2T/Yv9h/2X/cP9+/4j/kf+S/5D/jv+O/47/j/+P/47/jf+N/4z/HH4cexx+HHsbfxt8G38afBt/G3sbfxx7HH8dfB1/Hnwffx97H38heyN+I3skfiR7JH4meiV+JnoofSd7KH0peyt8K3wsfCx8LHwsfCx8LXwufC57LnwufS57Ln0uey59LXstfS17LH0sfCt9KnwqfSp9KnwpfSl8KX0pfCl9KXwofih7KH4oeyd+J3wofih8KH4ofCd+Jnwofyh8J38nfCh/KHwnfyd8J38nfCh/Knspfyt5MIA1dD2CRXBMhFJsWIZeaGGGY2VkhmNgZYhkXmGIYV5eiF1cW4dbXFiFVFxRg0xeSIJFYUWDQ2JEhElgTYVQX1aGW19fhmJeZIZnX2mEaF9ngmRiYYFeZlt/U2pPfEpvRXpAdDp6NngxfC18LXwsfCx9K34rfSuAK30rgCx9LIAsfSyCLH0sgSx9LIEsfCyCK30rgip8KoIqfCqCK3wrgip8KoIqfCqCKnwqgip8KoIqfCqCKnwqgip8KoIrfCuBLHwsgSx8LIItfC2CLHssgi17LYItey2CLHssgit8K4EqfCqBK3wrgSx8LIEpfCuAKn4qfy6BN31Rg2R+eIVkhGaFf4SCh4WDgIRwhXCBZodmgGmHYn5Phk18TIZOek2GWnRniW1sX45UaE+PTGlejmhrcIlqcoCEiXyRgaWAqIGhfp2CnH6Sg3h/VYhAf0mORoBIkkl/R5VJf0qWSIBIlUiAVIyOgY2BioGLe4uAlHyMfkCDO347hTx9SYRngH19h4GPdo5/i3p7fHWBdnx3gXiBlHiehZ1unoOabnqAQn9BfEaNSnlDlz52PppWb36bmGifmKNkppOmZZ6VfWwumjlyPZo8djyZOnY1mTR0SplncmuWbG9qlGZvX5NWb1STUHFOkktySpFLdUqOTHVOjE90ToxOc06NTnRNjEt1R4tBdzWLQXdQi1J3UIpJekaJRntFhT9+PIU5fDaFOno7iTt3OIs3djmKOXhMiVh4XYhgd2WKanVqjHB1dIt2dniJcHdaiEd4RohId0qISXdEhER8R35RgEp5RoJIe0eCPnk7gkN1MoE2czyAP3U8gDl5OYBFfkOAPX85gDp9O4BCeTyBPHg8gTN7NYA8hDF+N4k7fT+KYH1Th0t9P4U8ezyDRnpbgWV+Yn9TgE+BWYB7gnh+dXtygG56a4BqeWqBaXtpgGp6bYBue3GAcnxzf21+a350f3B+a3xpf2d6ZoJmeWeCZ3hngml4aIFreHCBcnV0gXZydYJ2b3iCem59goFwhoKKcIyBjW+OgI1vi4CIcoiAhXOEgIF0foB7dHiAcnRtgWhzYoJcdFmDUnhNhEV8P4Y7fzqGPIA9hz2BPoc/gUGGQ4BJhFKAWYJif2h/cH90fnd/dn12f3Z8d4J5enqCenl7gnx7fn6Be4N3hHyEboR+iGiJgItoi4GLcIyAi3qLfomBiXqJg4t2ioSKd4qGiXeIiIV2gYd+dnyHenZ4hXh4eIR4eHiFdnl2g3d6doJzfG+Can1jgFiATn5FgD9+QnxIf1J4XYBrdXSBfXaDhIp2joSPeI6CjXqMgIp6iYGKeop/i3qMgIt6i4KKe4mAhn1/eneAaG9fgl9rYoFqcnGAdnx3fHd8dH1yd3F9cHVufm5zbn9vdW5/bnVvfm92bX9qdmZ+ZXZhfGN6ZnlyfoB2iYCReJB+j32OfI19jXuQfY58jn2NfY59jX8c/xz/HP8c/xv/G/8b/xr/Gv8a/xv/HP8d/x3/Hf8e/x//H/8g/yH/Iv8j/yT/JP8k/yb/J/8o/yj/J/8o/yn/K/8s/yz/LP8s/yz/LP8t/y7/Lv8u/y7/Lv8u/y7/Lv8t/y3/Lf8s/yz/K/8q/yr/Kv8q/yn/Kf8p/yn/Kf8p/yj/KP8o/yj/J/8n/yj/KP8o/yj/KP8o/yj/KP8n/yf/KP8o/yf/J/8n/yf/J/8n/yj/J/8q/yz/NP87/0D/R/9O/1L/Vv9Z/1z/Xv9e/1//Yf9h/2D/Yf9f/1//Xv9c/1r/Vv9T/1H/UP9Q/1D/VP9X/1r/Xv9f/2H/Y/9n/2b/Zv9i/17/W/9X/1P/TP9H/0H/O/81/zD/Lf8r/yv/Kv8q/yn/K/8q/yv/LP8r/yv/LP8s/yz/LP8s/yz/LP8s/yz/LP8r/yv/Kv8q/yr/Kv8r/yv/Kv8q/yr/Kv8q/yr/Kv8q/yr/Kv8q/yr/Kv8q/yv/K/8s/yz/LP8s/y3/Lf8s/yz/LP8s/yz/LP8r/yv/K/8r/yr/Kv8q/yr/K/8r/yn/K/8s/yv/MP9O/3P/ef9z/2z/ef+F/4j/iv+E/33/fP92/3P/ef95/2T/Vf9Q/1v/W/9L/2D/Z/9k/2L/Xf9b/1b/YP9j/2T/fv+c/57/r/+z/63/q/+k/5//l/+C/0f/QP9G/0n/TP9N/03/TP9J/0T/Qv9H/4H/j/+J/4b/i/+R/47/RP80/z7/Pv8//0X/XP95/4b/hv+E/3r/dP93/3n/e/+X/5z/m/+c/5n/iv9O/z//Rf9H/0T/QP8//2j/k/+b/5v/nf+f/6P/nv99/y7/Nv84/zv/Ov84/zb/Mf83/1P/X/9f/1z/Xf9b/1T/Tf9J/0n/SP9G/0r/Tv9O/07/Tf9N/03/TP9L/0z/TP9M/0b/QP9K/1L/U/9W/0f/RP9I/0n/Rv9E/0D/PP89/0L/Rv9C/0D/Pv8+/0T/VP9Y/1r/Wv9b/1//X/9l/2j/bv9w/27/Zf9b/1T/TP9C/zv/PP88/0f/U/9Q/1b/Xf9d/1r/OP8t/zT/OP81/zf/O/83/0L/Q/87/z7/Qv8w/zH/O/9D/1P/TP84/0D/N/82/zn/PP9P/1n/Sf9E/zr/OP9Y/3X/dP9c/1H/TP9w/3v/eP9z/2//bf9r/2n/af9p/2j/af9s/27/cf9w/27/cP91/3T/b/9r/2n/Z/9m/2b/Z/9n/2n/av9r/3D/dP95/33/gf+B/4L/hv+I/4v/jf+O/4//j/+P/4v/iv+H/4P/ff96/3X/cv9u/2z/af9m/2P/YP9e/13/V/9R/0v/Q/9A/zz/O/87/z3/Pv8//0D/QP9F/0v/Vv9e/2T/bP9z/3n/eP95/3n/d/94/3n/ef95/3n/ev97/33/gP+C/4L/g/+E/4P/hf+G/4n/iv+M/4n/if+J/4n/iv+K/4v/iv+J/4j/hf+B/37/fP96/3j/d/93/3j/eP92/3b/dv91/3P/bv9p/2H/V/9N/0T/P/9B/0j/VP9f/2z/dv+A/4f/jP+O/4//jv+M/4v/iv+J/4r/iv+L/4z/i/+L/4r/if+E/33/cv9n/2D/YP9o/23/df93/3n/eP92/3L/cf9w/27/bv9u/2//bv9u/27/bv9s/2n/aP9n/2T/Zf9q/3b/gv+L/5H/kP+P/47/jf+N/4//j/+O/43/jf+O/xx/HHscfxx7G38bfBt/Gnwbfxt8G38cfB1/HXwdfx58H34feyF+InshfiJ7I34keyV+J3smfid7KH0pfCl9KnwqfSt8LH0sfCx8LHssfC17Lnwuey58Lnsuey59LXstfS56Ln4tfCx+LHwrfSp8Kn0qfSp8KX0pfCh9KHwofSh8KH8ofCh/KHwnfyd9KH8ofSh/KH0ofyh9KH8ofCd/J3wnfyd8J38nfCd/J3oofyh6KX4peSd+J3gsgDB3N4A8c0OCRm5Kg05qUYVSZVaFWWFdh19dXohfXWCJX11hiWBbYIdhXF6FXVxbhVteXIVeYF+EX19hhGNfZIRlYGOCYmJegVpnVH5ObEl7RHM8ezV3MnoteSt6Knwqeyl9KXwqgCl+K38rfiqAKn4rgSt+KoEsfiyBLH0sgSx9LIIsfSyCLH0sgix8LIIrfCuCK3wrgit8K4ErfCmCKnwqgip8KoIqfCqCKnwqgip8KoIqfCqCK3wrgi18LYIsfCyCLXwtgix8LIIrfCuBK3wrgit8K4IrfSuBKn0pgSp8KoEqfCqBKX4rgS2DL31JhX6AeIR8hX6HeIV3iH+EhIZ/g3eEdoZ6g3aHcINriGaCZodvgGeGaH9ZhkZ8Y4VwdVeKV25mjmNsZI5lbWaKa3Z/hpl/rYCwgax8r4CyfayBrn2rgqF/d4FDizx/SJNLf0qYR35Kl0V9QZZBfUKQbX+Pg4eAg3+Ef4yAkn5rgy5/Ook+fUCNQH5AilOAcoSDfYKBdXpvhHd8eIF8gZN3mIWYaJeElmaTgmFzQ3xIhkh5RZRBdESaeW6Vm51mm5mXYJiaoGWbl3FtLZo2cjiaOXQ5mjp3OZk3dzOUPnRRklZyVZFXclaOUnNOjUpzSYxJckeOR3RKjk11TYpOdUyJTXNOikpzSotIdEmLS3VOjFxzZYxgdFWMRXlFiUV6R4VMfUyFSn1GhkR4U4tidFONQ3NDi0J1PYpPd1eIVXhUh1B3S4lHc0mLT3RTi1l3W4tad1yKWHdLiTp4OohJfEx/Un9PeUt/SXpSgVh7S4E9dzqALnU1gD90OYA6djiAPnlCgDp8OIA2fS6AKHoqgCx4NIA0dyh+OX83fjWHN30/jUh8PIxCfD6KO3k8hmh6fYCCfVWATX1fgoR9fH11gHJ3cIBtemt+antngGd5aIBpemmAbnt0fm98b312gHR8c4BwfG18an9oeWiCZ3pogmp4a4Jvd3OCeHR8gYBxhYGJbo2Aj2yPgZBrj4KQbo+Cjm+MgYpxh4CEcX6AdnJwgGx1Z39mdWN/X3VggmF2X4Jdd12CWnhVhU96SIVBfT6GPIA8hz2APYc+gD+GQIBChEWCT4JXgV6BaIBwfnaBe359gXx+e4F4fHiDent5hHl6eYR6enyFfnl/goF6g3yEfINygn+GaoeAiGiJgYhwjIGMfIt8iYKJeYyFjHeKhol2h4eEdoGIfnZ7h3p2eId3eHeGeHh4hXZ5doV2e3WDcXptgmd9XoFVgEyBQ4A/gUF9SYJVeGGCbXR4g4F0iIWNd4+EjnmNgYt6ioGJeomBiXqKgYt6jIGKeoqBinuIf4N/eXpvgWVxYYBjbmp/b3d1fnh+en14fHN+cXhxfnB1b35udW5+b3Zvfm12bn5td2t+anZpfWh3ZXtmeW15eX6Gd4x/kHmRfpB8j3yOfY1+jX+Ofo9/j36Pf41+HP8c/xz/HP8b/xv/G/8b/xv/G/8b/xz/Hf8d/x7/H/8f/yD/Iv8j/yL/I/8j/yT/Jf8n/yb/J/8o/yn/Kf8q/yv/LP8s/y3/LP8s/yz/Lf8u/y7/Lv8u/y7/Lv8t/y3/Lv8u/y3/LP8s/yv/Kv8q/yr/Kv8p/yn/KP8o/yj/KP8o/yj/KP8o/yf/J/8o/yj/KP8o/yj/KP8o/yj/J/8n/yf/J/8n/yf/J/8n/yf/J/8o/yj/J/8n/yj/Kf8u/zL/Nv86/0D/Q/9H/0n/TP9N/1P/Vf9X/1j/XP9f/2H/Yf9k/2X/ZP9j/2H/Yf9h/2D/Yf9k/2X/Y/9h/2D/Xf9Z/1L/Tf9J/0P/O/8y/y3/Kv8p/yj/Kf8n/yr/Kv8q/yr/K/8r/yv/K/8r/yv/LP8s/yz/LP8s/yz/LP8s/yz/LP8s/yz/LP8s/yv/K/8r/yv/K/8r/yv/LP8r/yv/Kv8q/yr/Kv8q/yr/Kv8q/yr/Kv8r/yz/Lf8t/y3/Lf8t/y3/LP8s/yv/K/8r/yv/K/8r/yv/K/8q/yn/Kf8p/yn/Kf8p/yv/LP8//3n/if9q/3z/e/98/3n/gP+K/4D/df9y/3z/ff95/3D/dv95/37/dv9q/1z/Uf9Y/2v/Z/9T/0f/ZP93/3n/ev95/4L/j/+o/63/qv+z/7n/tP+3/7n/sf+b/2j/N/9J/0j/R/9G/0b/Q/9D/0P/Pf9X/47/if+B/33/hP+L/5L/U/80/0D/P/89/0D/Qv9O/3D/g/90/3H/eP96/37/j/+U/5T/l/+X/5b/eP9I/0j/TP9G/0L/R/+B/5j/nf+T/4z/lv+f/5z/Yv8s/zb/Of85/zr/Ov84/zX/Mv8x/zz/S/9R/1H/U/9R/07/Tf9M/0f/R/9H/0j/Tf9K/0z/S/9N/03/Sf9H/0X/Rf9L/1P/V/9X/1b/Tf9K/0b/R/9J/0z/Uf9S/1D/Tf9R/17/Xf9Q/03/Q/85/0j/Vv9S/03/RP89/zn/Nv82/zb/Ov85/zn/Of81/zH/MP86/0b/Tv9R/0H/Pf9B/0T/RP84/z//Pv88/0j/Sf8+/zn/P/9E/0X/Of81/zX/M/81/y//JP8y/zz/Pf9D/0H/Nv87/0P/RP8+/zr/OP83/zj/Rf9O/03/Rf9N/2j/b/99/3z/eP91/3D/bv9r/2j/Z/9n/2j/af9v/3L/cf91/3X/df9z/3D/bv9s/2z/bP9u/2//cP9z/3b/e/+A/4P/h/+N/5H/kv+T/5T/kv+S/5D/jv+M/4n/hP98/3X/bv9n/2P/YP9h/1//Xv9e/17/X/9e/1z/W/9Z/1T/Tf9H/z//PP86/zv/PP88/z3/Pv9A/0T/Sf9R/1v/Yf9q/3b/fP+B/4D/f/9+/3v/ef95/3r/ev96/3v/e/9//4D/g/+H/4X/g/+B/4L/hf+G/4b/iP+J/4r/iv+K/4v/i/+L/4v/if+H/4T/gP99/3v/ef94/3f/d/94/3j/dv92/3X/c/9w/2z/Zv9d/1T/Sv9B/z7/Qv9K/1X/Y/9w/3v/gv+J/43/j/+O/43/iv+K/4n/if+J/4r/i/+M/4r/iv+J/4f/gv94/23/Y/9e/2L/af9w/3X/eP95/3b/c/9w/3D/b/9v/27/bP9t/27/bv9v/23/a/9q/2j/Z/9m/2f/cP99/4f/jf+Q/4//jv+O/47/j/+P/4//jf+L/4v/i/8cfxx7HH8cext/G3wbfxt8HH8cexx/HHsdfx57H38geyB+IXshfiN7JH4keyR+JXslfiZ7J34oeyh9KXwpfSp8K30rfCt9LHwtfC18LnwufC58Ln0ufC59L3svfS17LX0tei19LXwsfSx8K30qfCp9Kn0qfCl9KXwofSd8J30nfCh/KHwofyh8J38nfSh/KH0ofyh9KH8ofSh/KHwofyh8KH8ofCd/J3wnfyd8Jn8mfCZ+KHwnfid7KH4oeSh+KXctfjB2M4A2cjqAPXBBgUFtR4NLa0yET2dShlZiV4ZcYV6GYl5ihWNeY4VjYGOFY2Jhg2FlYYFfZluAV2pRfU1uSHxBcjt7M3gueyl6J3wofCh7KX4pfSiAKH0qgCt9Kn8rfiuAKn4qgCt+K38sfi2ALX4tgS19LYEtfS2CLX0tgi19LYItfC2CLXwtgix8K4IrfCuBLHwsgip8KoIqfCqCKnwqgip8KoIrfCuCK3wrgit8LIItfC2CLXwtgix8LIItfC2CK3wrgSt8K4IrfCuCKn0qgSp9KIEofSiBKX0pgSmAKn83hGuBkYRxiViGb4x3iXqFgoqGhI2KhoR+iICGgIaEh3yFbod2hHOHcIR3iHCBaIZjgFaEY359hm97R4k0dliNdnR8inp3hYaPfZyCo4GufLd/unu7gLt8u4C5fK2CioBCfkKORX1Ml0p7RJlCe0OZRHs+lUZ8fouMfoKEfYB/goWAkYOIfj2GOHw/iz56Po5FfEOLYXyChXd5c4Z5e3+HfoCFfoiCiHSThJZtloWJdE+AToVJekaRQXRKl4NumpqeZpuXmmObmZ1mmplebSuaNnM3mjd2OZo5eDmZN3gzlTB3LZI4d0eOTnZPi091TYtLdEuKSXRHikd1RopLdkuJTXdLiU12TYdKd0iHRnVDiEZ0U4pNcUuMTnJSjFN1SYpJdkmGSnlRhlZ5V4dbd2GNaXJZj0xxSo1CczmMRXVWilN4SolCdj6KQHRFjEh0QI86djKML3YvjS13LYwwdzeLQ3pFiDd8MoQyfTOBOn47fD6AQ3k+gER5TYBLej+APXk5gEJ6SIA5fDaAOH42gDR8NIA3ezmAQXtDfzmANH4zhjx9QYo9fTuJOX06iDp6PYY8ejeENHw4hj56QIdCd0qDT3ZYfWN0bnltd2x3aXtnd2d+aXhpf2x6aX9sfXR9dn91fHR+dH5xenKAcnV0gnZxdoJ4cXyCgG+Dg4huioGQa5KAlGqTgZVqlIGRbY+BjHCJgoRyfoF1cm2BZ3JigV5zW4Fbdl2CXXhegl54XoFdeVyBXHlaglh6UoRNe0iFQH87hTqAOoQ6gDuEPYA9hUCARYNJglOBW4Fmfm+BeXuAgoV7hYKCfICCfn19hHt6eYV6eXqFe3l7hn14f4WDd4WDiHmGe4V7gnCCfoNmg4GGaIiCi3KLf4x+i3yKhIx5i4eJdoeIhHaAiHt2eYd3dnaHd3h3hnZ4d4V2eXWFdXp1hHB7a4NlflyCUoFHgkCAP4NDfUuEWXhnhHN0fYWEdIqFjnePhI55jIGKeoqBiXqJgol6ioKKeoqBinqKgol7h4F/f3V8aYFddV2AYXVqfW97dXt4f3h8dX1zfnF4cH5wd25+bXdsfm13bX5vd29+bnlsfmx3an1pd2d7anlzeX5+iHePf5F5j3yNfIx5jn+Md4yAjXWOgo1zjoKOcRz/HP8c/xz/G/8b/xv/G/8c/xz/HP8c/x3/Hv8f/yD/IP8h/yH/I/8k/yT/JP8l/yX/Jv8n/yj/KP8p/yn/Kv8r/yv/LP8s/y3/Lv8u/y7/Lv8u/y7/Lv8v/y//Lf8t/y3/Lf8t/yz/LP8r/yr/Kv8q/yr/Kf8p/yj/J/8n/yf/KP8o/yj/KP8n/yf/KP8o/yj/KP8o/yj/KP8o/yn/Kf8o/yj/J/8n/yf/J/8m/yb/Jv8n/yf/J/8n/yf/J/8o/yv/Kv8s/y7/MP8x/zX/Nv87/z//QP9D/0f/TP9Q/1T/Wv9d/17/X/9g/2D/YP9g/13/XP9a/1b/Uf9M/0f/Qf86/zP/Lv8r/yn/J/8o/yn/KP8o/yj/Kf8p/yr/K/8r/yr/Kv8r/yv/LP8s/yz/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/LP8r/yv/K/8s/yz/K/8r/yr/Kv8q/yr/Kv8q/yv/K/8r/yv/K/8s/y3/Lf8t/y3/LP8s/y3/Lf8s/yz/LP8s/yv/K/8q/yr/Kv8o/yn/Kf8p/yn/Kv8s/0f/b/9o/1f/Wf9x/3X/fP+J/4b/h/+D/4v/jP+D/33/gv9//4D/e/9x/3X/bP9w/23/WP9F/2T/c/9q/1L/R/9d/2b/dP+C/4//kP+Y/6j/tf+7/7v/vP+7/7r/tf+e/13/N/8+/0H/Rf9C/0P/Q/8//0D/Q/9k/5H/iP9+/37/gf+K/5f/Zv8x/0D/QP8+/0P/SP9x/4D/eP94/3r/f/9+/3v/ev9//4z/lf+X/4//W/9A/0X/R/9I/0r/gv+b/53/nP+e/5r/mv+U/1H/MP83/zr/Of86/zn/OP82/zP/L/8u/zD/O/9F/03/T/9O/03/S/9J/0f/R/9H/0X/S/9N/0v/S/9K/0j/Rf9G/0P/RP9Y/1H/TP9O/1P/VP9I/0n/Sf9L/03/Vf9f/3L/d/9v/2T/Xf9L/0L/Pf9N/1v/Uv9I/0f/Tf9R/1L/UP9I/z//M/8w/y//MP8w/zD/Mv8y/y//L/8w/zP/Mv81/zv/O/9G/zv/O/9F/0L/Of8z/zj/Pv9B/z3/N/85/zf/Of86/z7/Pv84/zL/M/82/zP/Qv9P/z3/Nv81/zj/Of86/zz/O/85/z3/Q/9C/zn/Ov9C/0X/SP9S/13/Yf9h/2f/af9o/2r/b/9v/3T/ef96/3n/ef94/3b/eP96/3z/fv+A/4P/h/+J/4z/jv+Q/5L/k/+V/5P/k/+Q/43/iP+D/3v/c/9r/2P/Xv9d/1z/W/9Y/1r/XP9c/1z/Xf9d/1z/XP9c/1n/Vv9S/0v/Rf89/zv/Ov85/zr/O/88/zz/Pv9F/0r/Uv9f/2f/cf98/4L/h/+H/4X/g/+A/3//fP97/3r/e/98/3z/f/+D/4X/if+K/4j/hv+D/4H/gf+B/4P/hv+J/4v/jP+N/43/jP+L/4j/hv+C/37/ev94/3b/dv93/3f/dv92/3b/df90/3T/b/9p/2T/W/9P/0b/QP8//0X/Tf9a/2b/dP9+/4X/i/+O/4//jf+K/4n/if+J/4n/if+K/4r/iv+K/4r/iP+E/3z/cv9l/1z/Wf9e/2f/bv9z/3f/dv9y/3H/cP9w/3D/bv9t/2z/bf9t/2//bv9u/23/bP9q/2n/aP9t/3b/gf+M/5D/kf+P/43/jP+L/5D/kv+T/5T/kv+Q/4v/HX8dexx/HHscfxx7HH8cexx/HHocfx16Hn4feh9+IHohfiJ5In4keSR+JXolfiZ8Jn0neid9KHoqfCp7Knwqeyt8K3sqfC17LnwufS58Ln0ufC59LnwufS58Ln4ufC5+LXwtfS18LHwsfCt9KnwqfSl+KX0pfil9KH4ofSh+KH0ofih8KH4ofCh+KH0ofih9KH8oeyh/KHsnfyd8J38nfCd/J3wofyh8J38nfCZ/Jnwnfyd8J38nfCd+J3smfiZ7KH8ofCh/KHwrfyt5Kn0tdzF9NHM2fjhwPoFCbkeCTGlPg1FlVYNWZFaCWWVZgVdoVX9Sa05+S25FfEByOHszdil7KX4neyd+KH0ogCd9KYAofSqAKn4pfyp+Kn8sfix/LH4rfy1+LX8sfi2BLn4ugS59LoAufS6ALXwtgi18LYItfC2CLXstgi18LYIsfCyCK3wrgix8LIIsfCyDK3wqgyt8K4IrfCuCK3wrgix8LIItfC2DLXwtgy18LYMtfC2DLHstgyx8LIIufi6CMH42git+KYErfiuBKnwqgil/KoIsgjWDWYZeh2OJd4t/iF6Ja4l+hIiLgIR4i4GHiIuLiIGHfIl8hXuJe4VxiW2DdohvgXiGdYBchkGCVoZwhH2GdYBjiFl6XYlieXuIinuRhJN+o3+vfrp8vH67e7t/unu4gqd9cH4wijZ6PZZCeUGbRHlFm0R6RJpDek6Yg32QjIZ/foR9gIKCkoCOgkh/MYY/f0KIS35thn57fId7eICJgHqGhYmAiXyHhol0joeUb5WGjXRlgD+DQ3pDjkV0UJaBb5eYnGqcmZ9lm5mZZ5KaQG4zmztyO5s6dTqbOnY5mzh2NpkzeC+ULngwkD14SoxMdU2JTHRMiUx0SolKdEeJSXdLik14SYhEeUOFQXpFhUR7RYZFeViJW3VNjE9zVI1TdUKLSHdJikt3TYpOdluLbXJtkmxwZ5Rmb0mSP3JEj1tzXo5Sc1CPVnJXkVdxVpJLckCQOHQyjS51Koopdi2KLnguiS56L4kueS6IL3oxhTR8N4E5fTh8NH84ezWAMnougDF5O4BBeT6AO3s7gDaBOYA6gjuAPIQ5gDiGMX86hjp9MYg0fTSKN30yiTh+QohJfkeGPn83hzWAPoxDf0SMRn5Diz58OYk/eFCFWHRbfVluXHZkc211cXx0dnaAeXd9fn57fX99en2BfnaBgoNzhISHcYqEjHCMhIxtjoOObZCBkm6UgJJvkIGMcoeBgnV7gHB1Z39ddFd/WHVZgFt3XIFceF2BXXlcgVx8XIFcfFyCXH1bglt9V4JVfVCDSn1EhDx+OoM5gDmDOoE7gjyBPIRAgUeDS4JTf12Da3x2g395hYOJeYmEiXmGhYN5f4V9enyHenh7h3x4e4eAeISHhnaKiIt2ioWGeoN6gX2Aa4F/hWSEgYdpjIGNdYx/jYKLeYyGiXaFh4J0fYl6dHeIdXd1h3Z4dod2eHaGdnh2h3R5coVte2eFYX5Zg0+ARYM/gD2CRXpRhV51a4Z2c4KHhnSLho53joONeYqDiXqJg4d5h4OIeYmDiniKg4p6ioOIfYKBeH9ufl+BVnpVflt7YntsgXN4doR2enR/cX1wem9/bndtf2t2a39sdW19b3hwfHB4b3xtdmt8andqem97eneFgI53kYCReY57jX2PcpGBkGqQgY9pj4ONaYuFiWkd/x3/HP8c/xz/HP8c/xz/HP8c/xz/Hf8f/x//H/8g/yH/Iv8i/yT/JP8l/yX/Jv8m/yf/J/8o/yn/Kf8q/yr/K/8r/yr/Lf8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8t/y3/Lf8s/yz/K/8q/yr/Kf8p/yn/Kf8o/yj/KP8o/yj/KP8o/yj/KP8o/yj/KP8o/yj/KP8o/yj/KP8n/yf/J/8n/yj/KP8n/yf/Jv8m/yf/J/8n/yf/J/8n/yb/Jv8o/yj/KP8o/yn/Kf8o/yj/K/8s/y7/Mv81/zf/Ov8+/0L/RP9J/0r/Sv9N/07/S/9I/0f/Q/9A/zr/Mv8s/yn/KP8o/yf/J/8o/yj/J/8p/yn/Kv8r/yr/Kv8q/yz/LP8t/y3/Lf8t/yz/Lf8u/y7/Lv8u/y7/Lv8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/yz/LP8s/yz/LP8s/yz/LP8s/yv/LP8s/yv/K/8r/yv/LP8s/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y7/Lv80/1P/QP8o/yv/K/8q/yr/Kf8q/zL/SP9S/27/iv+H/4r/cf9p/23/fv+N/5P/hf+F/4j/g/97/3v/gP9//3b/cP9y/23/Tf8//1X/Qv9i/3j/f/94/3z/bv9Y/1//av+A/4z/mP+f/6j/sv+7/7v/u/+6/7r/pv90/zT/N/88/z//P/9D/0X/Q/9D/0P/Rv9j/5D/jf+B/3n/ev+D/5D/iP9E/y3/Q/9c/4P/fv98/33/gv+F/4X/iP+M/4z/jv+P/5L/kv+Q/3r/Sf9G/0H/Rv9M/3//lv+a/5r/nP+c/5n/lf9J/zX/PP85/zr/Ov86/zr/Of81/zT/Mv8u/yv/NP9F/0z/T/9O/07/S/9J/0r/TP9M/03/S/9H/0z/UP9S/1D/S/9E/0H/Rf9d/0//Tv9U/1P/P/9F/0j/Sv9N/07/Uf9e/2L/YP9e/17/Tf9L/1L/Xf9d/1n/XP9f/1z/V/9Q/0X/Pf84/zb/Lf8m/yf/Kv8r/yv/Lf8t/y3/Lf8t/zD/Mf8y/zX/QP9B/z7/PP88/0b/R/9I/0L/Rv8//zz/N/85/zf/N/85/zP/NP81/zb/M/8x/y//Mv82/zH/M/83/zr/Of8//zz/Ov8+/zz/P/9F/0v/Sv9H/0H/N/89/07/af9g/0j/Xf94/3z/ev99/4H/g/+E/4X/hf+G/4j/if+K/4v/iv+L/4z/jP+O/47/j/+O/47/jP+I/4D/eP9s/2P/Vv9O/0z/UP9U/1j/Wf9b/1v/XP9c/1v/W/9b/1v/XP9c/1v/Wf9X/1X/UP9K/0P/O/86/zn/OP85/zv/PP8//0L/Rf9N/1f/Yf9q/3P/f/+G/4v/i/+K/4j/g/9//3z/e/96/3v/e/98/4D/hP+I/4v/i/+K/4n/hf+B/4D/gf+C/4P/hv+M/4z/jv+O/4z/i/+I/4T/f/98/3n/dv90/3T/dv92/3X/df91/3X/dP9y/23/Z/9g/1j/S/9B/zz/Pf9F/1H/X/9s/3j/g/+J/4z/jv+O/43/iv+J/4n/if+J/4j/if+K/4r/iv+K/4f/f/93/2z/Xf9T/1P/Wv9j/23/dP93/3X/c/9x/3D/b/9t/2z/a/9r/2z/bf9v/3D/cf9w/2//bP9r/23/dP99/4n/j/+Q/47/kP+U/5D/jf+M/4r/if+J/4j/iP+I/xx/HHscfxx7G38bext/HHsdfx16Hn8feiB+IHogfiF6IX4ieSJ+JHkkfiV6JH4leyd9KH0ofSp9KnwqfCp8KnwrfCt9LHwufS58Ln0ufC59LnwufS98L30tfC1+LXwtfi18LX0sfCt8LHwsfSp8Kn0pfih9KX4pfSd+J30nfid9KH4ofCh+KHwofih9KH4ofSd/J3onfyd6J38nfCd/J3wnfyd8KH8ofCh/J3wnfyd8J34nfCd+J3wnfid7J34neyl/KXwpfyl8KX0peyl8KXopfCl4Knwsei99MHgzfjV2N386cz9/QXJBfkFxQn1Bcz17O3Y2ezJ4LHopeyd8Jn0nfCd/KHwofyl9KYApfSmAKX4qfyt+K34sfi1+LH4rfix+LH8tfix/LX4ugS5+LoEufS6BL30vgS98L4IvfC+CLXwtgi17LYItfC2CLXwtgi18LYIsfCyCLHwsgyx8LIMsfCyCLHwsgix8LIMsfCyDLXwtgy18LYMtfC2DLXwtgy17LYMtfCuDK30sgy99MYItfSqBKn0qgSp+KoErgCyBQYdYgV+Le4ePhniJg35+jFJ/So5UhGWNjYuGin+Lh4uHioKMiIWAinSEdIh3hHOIdYNwiGKDVIg+hUyIgYd1iHSJgIaHhXKFWH1fh296g4aQe56DpYCufrSBuXq7gLp6uYCjfml8MYs3ejqUPHk+mUF5QZxAeUCcRnhDm0R6bZGRfYaHfYB7gn2AgIKKgImDO34yhmd8g4aAd32JgHSFiod4h4eJgop9joaPcI+Hj2uQho5vg4FWfUt6RIxEdEuVfW+Sl5ZqmJibZpqYmmeTmlBuNZw5cjqdO3U8nTt2O506dzmaNHcxli54LJEveECNS3VQjFB0TItKdEiLSHZMikx3TYlQeFGHUXlRg1B8TYNHfTqFMHkxiWF3VoxNdVGMTXc0iz14Q4tGd0eMSnRWj11wYpRhbl6WXm5ilWJvZJNkb2SSZG9jlGBuWpRSb0WTPHI5jjdzN4sudSeJJ3cpiCp5KogreiuJK3ksiCx6LoYwezCDMX05fj1/QXZIgEtzRoBGck+AT3VLgEV7Qn88gkWAPodGf0+HUoBGhT9/OYQ2fzGENH4zhTN+NIY1fjOFNX8zhDiAQ4RGgT2GQIFBhzmBOolAgEeLS39Jikd9P4o3elGEYXZWf150dHqDeIZ4in+Lc4qAjHKMgoxxjYKMcYuCinOJgohyh4OJcYmBiXOHgIZ1hYB/dneAbndkgFZ3TYBGeEZ/THtTf1Z6WYBZelmBWnpagVp7W4FbfVuBW31bglt9WoJafVeCVH1Pg0l9QYQ6fjqDOYA4gzmBO4I8gT2CQYFKgFiCXn5hg2x6d4SAd4aFineLhot2iYeEd4CIfXh6h3p3eYd7eH2HgXiEh4d1ioiLdouIiHmGg4J7gXWBfYJogYCDZYeCiWqMgY14jH2LhIZ4hIl/dXyJeHV2iHR3dIh1eHWHdXh1h3V4dYZ0eHGGbHtmhl1+VYRJgECEOn89hUV5UYdfdG2IenGFiYt0jYeOd46FjHmKg4h6iIOHeYeDh3mIg4p4ioOKeomDhX1+gnd/aYBcgFGAU31ahGV4boZ1d3eFdnp0f3J8cX1vf256bH9reGt/bHdtfm57b31we3B9bnltfGt4bXl1eYJ2iHuPepBzkoGVa5KCjmeLhYlqhoWHbIeDhWqIgohqHP8c/xz/HP8c/xz/HP8d/x7/Hv8e/x//IP8g/yH/If8h/yL/Iv8k/yT/Jf8k/yX/J/8o/yj/Kv8r/yv/Kv8q/yv/K/8u/y7/Lv8u/y7/Lv8u/y7/L/8v/y3/Lf8t/y3/Lf8t/yz/K/8r/yv/Kv8q/yn/KP8p/yn/J/8n/yf/J/8o/yj/KP8o/yj/KP8o/yj/KP8o/yf/J/8n/yf/J/8n/yf/J/8o/yj/KP8o/yf/J/8n/yf/J/8n/yf/J/8n/yf/KP8o/yj/KP8p/yn/Kf8p/yr/Kv8q/yn/Kv8s/y3/Lv8u/zH/M/82/zf/N/83/zb/Mv8v/yz/Kf8o/yj/KP8o/yf/J/8o/yj/Kf8p/yn/Kf8q/yv/K/8r/y3/Lf8s/yz/Lf8t/y7/Lv8v/y//Lv8u/y//MP8v/y//L/8v/y//L/8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/LP8s/yz/LP8s/yz/LP8s/yz/LP8s/yz/LP8t/y3/Lf8t/y3/Lf8u/y7/Lf8t/y3/Lv8t/yz/Lf8s/yz/LP8q/yr/K/8r/y3/OP9P/1H/ef+H/4D/VP9i/1v/T/9K/03/af+b/5n/if+G/43/kf+Q/47/fP90/3n/fP96/4D/ef9v/0j/P/9e/3j/eP91/4T/hv9u/1P/Y/9x/4H/mP+m/6n/rP+w/7f/uv+1/5r/Tv8v/zn/Ov8+/z7/Pf9A/0H/Pv9B/0L/Qv9L/3v/jP+D/33/ev94/3//i/+B/0D/d/+D/33/e/+B/4f/h/+C/4b/i/+O/4//kP+R/5H/kf+S/23/Tv9M/0X/Sf98/5D/l/+W/5f/l/+W/5L/Vf81/zn/O/87/zz/O/87/zn/N/80/zP/Lv8t/yz/Of9J/0//U/9W/1f/V/9X/1f/Vv9T/1H/Wf9b/1j/T/9C/zP/LP8o/yz/Xf9e/0//UP9K/yz/L/80/zn/P/9U/1v/YP9l/1//YP9q/2z/bf9o/2n/af9p/2r/YP9U/0b/P/86/zr/Of85/zL/Kf8o/yz/Kv8r/yv/Kv8q/yr/Kf8q/y3/Lv8u/zL/Pf9J/0v/Tf9Q/07/WP9P/0n/TP9I/0H/Rv9N/1H/Vv9O/0L/L/8y/zb/NP8v/y//Mf80/zb/MP8v/zj/S/9A/zv/OP81/07/VP9J/0H/Of85/0D/RP9H/0H/Of89/1H/W/9U/2v/i/+R/4//jv+N/43/i/+K/4n/hv+G/4T/gP9+/33/ff99/3z/ef94/2//av9g/1b/TP9G/0T/R/9L/1H/VP9Y/1j/V/9Y/1j/WP9Z/1n/Wf9Z/1r/Wv9a/1r/Vv9S/0z/Rv9B/zr/Ov85/zj/Of87/zz/P/9B/0z/VP9X/2D/bP93/4L/h/+K/4v/iv+I/4P/f/99/3r/ef97/3v/ff+B/4T/h/+L/4z/i/+J/4b/hf+C/4D/gf+A/4P/hf+I/4n/iv+M/4n/h/+D/37/ef93/3b/df9z/3X/df91/3X/dP90/3T/cf9r/2X/XP9U/0n/QP87/z7/Rv9S/2H/bv97/4b/i/+N/47/jv+L/4n/iP+I/4f/h/+H/4j/iv+K/4r/if+F/33/c/9m/1j/UP9T/1v/Z/9x/3b/d/91/3P/cv9w/2//bv9s/2v/bP9t/23/bv9w/3H/cP9w/27/bf9x/3n/gf+M/5T/l/+U/5D/jf+L/4v/h/+G/4f/h/+I/4r/iv8dfx18HX8dfB1/HXsdfx17HX8deh9/H3ogfiB5IX4heSF+InkjfiR5I34keiV+Jnoofid8KH4pfCt9K30rfSt9LHwsfC58LnwvfC9+L3wvfi98L38vfC9/LXwtfi18LX4sfCx9LXwsfSt8Kn0qfCp9KX4pfCl+KXwofih8KH4ofCh+KHwofih8KH4ofCh+KHwnfid6J34neiZ+Jnsnfid7J34neih+KHoofyh8J38nfCd/J3snfyd8J38nfSd/J30ofyh9KH8ofSh+KHwpfil8KX4qeil8KXwqfSp+Kn0qfip8KnwsfCx6LXwtey18LXwrfCp9KXwofyd9Jn4mfSh/KH0ogCh9KIApfimAKX4qgCp+K4AsfiyALH4tfy5+Ln8ufi5/L34vfy5+L4AwfjCAMX4xfzF+MX8vfS+BL30vgS98LYIuey6CL3wvgi58LoItfC2CLXwtgi18LYMtfC2DLHwsgyx8LIMsfSyDLH0sgy18LYMtfC2DLnwugy58LoMufC6DLnwuhC58LoQtfC2DK3wrgyt9K4Msfy2BMIJKgEuJUIGFh4+IYn9NjEh6RZRKfFOQaICQja6EqYqhhZuLl4OgjJiBkIuMgISLdoN2jG+DcIxrgW+LT386ijuBSIlih4SHioqEhX6DaYVWfVyHeXyPhp9/pYGng6d7qYOze6l+fIc3fDKPOXw8lD18PJY8ej+ZQXlAm0J2Ppw/d0KaUXmDkYp+goh7fXuEdn6AhY18d4aDenyId3V8iYNyhouBd3yIhICKfIyGjG+RiJJtk4eRcpCDe35SfU+NR3VJmHhuj5mVa5OYlGiUmJNokJlgbjecPHM7njtzPJ89dD2eOnU4nDR4MZYveSuSLXc4kFhzbZF2cXWPb3Nqi2F1XYlZd1aKX3lli2J5XIhLfDSIJnwliSV6J4hUeGOKTHhMikh5LYoueC6MMHZUkGBzZpNib2GUZW14lnFtcJVpbGeWamprl21nbJdca0mWQm0/kzxxPY49dD2LNnUviTF4MogyejGHMHsuhyl8KIUleyeFK3ouhS57L4E5fEF2TH1PbEl/VmlggVFrSoFGdT+AR4BLgEyHRX9Fikp/RoYxgCODMIA5gzN/LYQufy+DMH4sgS99P39NfXh8f39feUODPHtFhFCAVIFThkyCPYc5gDqKPX49jEF6OIk8dk2GWHVqf5B5k3OOgI1xioGIcoaChXKBgnx0d4JzdXKCcnRxgnN3c4BxeW+Aa3llglx6VIRKekaCRX1IgEx/UoFUfViBWHxYgVh8WYFZfVqBWn9agVp/WYBZfluBWn5WglGATYNHgEGEPH85gjiBOYM6gDyCPYA+gkSASYFQgVl8YoRveXmGgnWGiIl1jIiKdYiJg3aAiX12eop4dnqJenZ9iYN1hYmJdoyHi3eKhol3iIWEeYN+gXqAcIF8gmWCf4VliIGLcYt+i4CGfIOFfXl4h3h3dohzd3SIdXh1iHV4dIh0eHSIc3hwiGp7ZIZbf1OFR4A/hT19PoZIeFSIY3Nwin9yh4qMdI6HjXeLhYl4iISGeYaEhnmHhIh5iYSKeIqEinuIhIN+e4RxgWODV4FRg1d9YIVqdXKIdnV2g3V7coByfXB9b35ue22AbXttf219bX5ufXF9cXxxfG16bXtveHR5fnaOfJZvlIKOaoyDiWyJgoptioKMa4yCjWyMg4xsi4OKbx3/Hf8d/x3/Hf8d/x3/Hf8e/x7/H/8g/yH/If8h/yH/Iv8j/yT/JP8k/yX/Jf8m/yf/KP8p/yn/Kf8p/yv/K/8s/yz/Lf8t/y7/Lv8v/y//L/8v/y7/Lv8t/y3/Lf8t/yz/LP8s/yv/Kv8q/yr/Kv8p/yn/Kf8p/yj/KP8o/yj/KP8o/yj/KP8o/yj/KP8o/yj/KP8n/yf/Jv8n/yn/KP8n/yf/KP8o/yj/KP8n/yf/J/8n/yf/J/8n/yf/J/8n/yj/KP8o/yj/KP8o/yj/KP8p/yr/Kf8p/yr/Kv8p/yn/Kf8p/yn/Kf8q/yr/Kv8q/yr/Kf8p/yj/KP8p/yj/KP8o/yj/KP8o/yn/Kf8p/yr/K/8s/yz/LP8t/y7/L/8v/y//L/8v/y//Lv8v/zD/MP8x/zH/Mf8x/zH/L/8w/zD/L/8v/y7/Lv8v/y//Lv8u/y3/Lf8t/y3/Lf8t/y3/Lf8s/yz/Lv8u/y7/Lv8u/y7/Lf8t/y7/Lv8u/y7/L/8v/y7/Lv8u/y7/Lv8u/y3/Lf8s/yz/K/8r/y3/Lv81/1b/Sf9o/4n/gf9L/0f/Rf9Y/3L/hv+X/6H/p/+t/63/rP+n/6L/m/+A/4b/i/99/2//a/9t/3P/cv9d/z//P/84/zP/R/9t/3f/gv9+/1n/Xf9w/4D/kv+e/6T/of+d/5//iv9P/zT/O/87/zr/Ov86/zj/O/86/zz/P/8+/0L/Tf9P/2T/if+F/3v/ef93/3n/hP+O/4n/fP94/37/hf+B/4D/fv+I/43/iP+M/5D/kv+Q/4v/if+D/1P/Sf9I/0//cP+L/5H/lP+U/5L/kf+M/2r/Ov88/zv/Pf88/z3/PP84/zX/NP8w/zD/Lv8u/1v/gP+E/33/c/9v/2n/W/9X/1X/VP9a/13/Xf9Y/0X/LP8m/yn/KP8q/0j/bP9V/0z/Sv8v/yz/L/9U/2v/a/9r/2f/bP97/3n/b/9q/2j/Zf9n/2v/bf9l/1z/Uv9K/0X/Qf9A/0L/P/88/zn/N/82/zj/Nv8z/zD/Kv8j/yP/JP8o/yz/Lf8u/y//OP9B/0b/Uf9b/2D/Uv9L/0z/VP9R/1r/Y/9f/1f/Uf9J/zX/If8r/zz/PP8x/y7/MP8w/y7/K/8q/zz/dv+R/4//lP+H/2X/Sf8//0r/UP9Q/1H/Tv88/zf/Qv9E/0L/Ov9D/1f/aP+K/5D/iv+F/4L/fP97/3b/cf9s/2n/af9p/2v/bP9u/27/bf9o/2P/XP9T/0r/Rv9G/0n/Tf9R/1X/Wf9Z/1j/WP9Z/1n/Wv9a/1r/Wv9Z/1n/Wf9Y/1b/Uf9L/0X/QP86/zn/OP86/zv/PP89/0H/Rv9L/1T/XP9k/3H/ev+C/4b/if+L/4n/h/+D/4D/fP95/3r/ev97/3//g/+F/4r/jP+L/4r/iP+H/4f/h/+E/4H/gf+B/4P/hP+F/4j/iv+J/4b/gv99/3j/d/91/3T/df9z/3P/dP90/3T/dP9y/2//av9k/1z/Uv9H/z//Pv9D/03/Wf9l/3L/f/+H/4z/jv+N/4v/if+I/4f/h/+G/4f/iP+J/4r/iv+K/4j/g/96/2//Yv9W/1P/WP9g/2r/c/95/3f/df9y/3H/cP9v/27/bf9t/23/bf9t/27/cP9x/3D/b/9t/23/ff+U/5j/k/+N/4n/hv+I/4n/jP+M/47/jf+N/4v/i/+M/4z/HH8ceh5/Hnoefx56H38feiB/IHshfyF7In4ieiJ+InojfiR6JX4leiV+Jnomfid6KH4oeid+KXoqfSp7Kn0reyx8LHssfCx7Lnwufi58Ln4vfC9/Lnwtfy18LX4tfC1+LHwrfSp8KX0qfCp9KHwofSl+KXwpfil8KX4pfCl+KXwpfil8KX4pfCh+KHsofih7KH4oeSl+Knksfil5Jn4oeCd+J3oofih6KH8oeyh/KHsnfyd6J38oeid/J30nfyd9KH8ofih/KH4ofih9KH4pfSh+KX0pfCl+KX0pfyp9Kn8qfCp/KXwpfyh8KX4pfCl/KXwogCh8KoApfSmBKH0ogil9KYIofSiCKX4pgCp+K4Asfi6ALn4ugC5+L38vfi5/L34vfzF+MX8xfjF/MX4xfzF+MX8xfjF/Mn0ygTF9MYExfDGCL3svgi98L4IvfC6CLXwtgi18LYItfC2DLnwugy18LYMtfC2DLHstgy57LoMufC2DLnwugy58LoMufC6DLnwugy58LoQufC6ELXwtgy18LYMtfS2DLn8vgj+FXYFugn+Fbn1ui0d6Po9hfY6Omnifjah3poqheqOJo3yriqp5qoupc46Ld3N/jYF4f5F4e3yQgXh6j2J0W5FLdEiSQ3hEi0qCcYd5hn2Eb4NehWp+d4iIf5OInH2ZhZJ8ioZsfkSMOn49kjp9PJM9fkGUQ35DlT97PZY8eT6ZQndInEp2UptteYiRf3p4iHV7dod8eoWHind6inZ0e4yBcX+NgXd5iIWAjXx/g3RzfYWRcZOFkXOSg5B5aH1Fikl1UZhnbYSbkGuTmY5oiJeOaouXdW48mjlzOpw8dD2cO3U6nDl4NJg0eC+ULncrk0twe5J+anqVdmZylXBnZZRfaViSUWpKkkhtQ5FEckeRQnM0kDB2MI0tdy6MQXZsjVp2TYtMdzCKMXdFjGp0bY9ycW+ReG+Ck3xrdpVuZ2mWZmRjl2hkbJhvaG2XaGdelVhrVJNQck+PSXVBiz14PIg5ejyHOXs4hTZ8LIUlfSKEI3wkhCZ7KoYuey6ELXougDJ7RHRef2VnaIBcYlCAVmVYgGRobIFpbm6EbHZphWSAWoZHgziFOIQ0gzaDL38tgS1+NH88fT96RXpZenZ3enqFeZF2knqHdm98UXxEfUyDVH5VhlJ9PoY5fT2IRH1CiDh7PYZXd299inqHent/eHdzgW95a4FoemeBZntngWh8aoFsfWyBbXxvgWl7Y4Jce1ODS3tHgUZ9SYBNflKBU31YgVh8WIFYfViBWX5agVp/WoFaf1uAWX5bgVh+VYJQfkqDRH4+hDp/OYI4gTmDOoA7gjyAQYFHgUx/U4Nce2eFc3d8h4J0hoqJc4qKiHOFi4B0f4t6dnmKeXZ3iXt2f4mCdYaJinWMiIt2ioeId4iHh3mGhYZ5g3uDe4Ftgn6CZYR/hmeGgIZxhYCDfn18eYZ2d3SIcndziXR3dIl0d3SJdHdziW94bYlne2OHW35RhkeAP4ZAfEaHUHdciWhydYp/cYiLjnSOh413jYWLeYeEhnqGhIZ5h4SIeYmEiniKhIl7h4SCf3iDbYFgg1V/VIRceWSIbnN0iXd1dIR0fHF+cH9vfG5+bX1tgG19bX9tf21+bn9xfXF+cHxtenB8hnSXf5dskoSNaYmDhm6GgodyiYGLco2AjXCMgItxiYCLco6AknUe/x7/Hv8e/x7/Hv8f/x//IP8g/yH/If8i/yL/Iv8i/yH/Iv8l/yX/Jf8m/yb/J/8o/yj/Kf8q/yr/Kv8q/yv/LP8s/yz/LP8u/y7/Lv8u/y//L/8u/y3/Lf8t/y3/Lf8r/yr/Kv8p/yr/Kv8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/KP8o/yj/KP8p/yn/Kf8p/y7/Of8r/yf/J/8n/yj/KP8o/yj/KP8o/yf/J/8n/yf/J/8n/yf/J/8o/yj/KP8o/yj/KP8o/yn/KP8p/yn/Kf8p/yn/Kv8q/yr/Kv8p/yn/KP8p/yn/Kf8p/yn/Kf8p/yn/Kf8o/yn/Kf8p/yn/Kf8q/yr/K/8t/yz/LP8v/y//Lv8v/zD/Mf8w/zD/Mf8x/zH/Mf8x/zH/Mf8x/zH/Mf8y/zL/Mv8y/zH/Mf8v/y//L/8v/y//Lv8t/y3/Lf8t/y3/Lf8u/y7/Lf8t/y3/Lf8s/y3/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y//L/8u/y7/Lf8t/y3/Lf8u/y//Rf90/3r/Zf9D/1L/Qv9Y/43/qP+l/6T/o/+m/6j/pf+j/63/r/+u/6v/ov+R/5D/jf+G/4T/hf+J/3f/bP9q/2D/Zf9b/2X/V/9f/3f/e/97/2X/Zv9y/3v/hv+O/47/if90/0r/Qv86/0H/Pv89/z3/Qv9J/0r/T/9K/0T/Qv8//z//SP9R/1L/cf+J/3v/d/91/3f/fP+H/4L/c/9x/3n/e/93/2v/bv+H/3f/Yv9z/4//mP+a/5r/lf97/0X/Q/9N/17/hv+R/47/hP93/4z/jP96/0D/Nv84/zv/O/85/zb/Mv8x/zH/MP8s/zj/cf99/3n/d/91/3X/a/9g/1b/U/9U/03/Rf9B/zr/O/87/zz/Of82/zT/NP8+/2j/Wv9Q/1D/M/85/2b/av9x/3T/gf+I/4P/ff96/3L/b/9x/3P/bP9j/2b/dP94/2//Zv9l/1//WP9R/0r/Rf9A/z7/QP89/zz/N/8q/yT/JP8k/yT/Jv8t/y3/Lv8s/yn/LP9H/2T/Zf9n/17/W/9b/2T/cf95/4X/hv+C/33/e/9+/3f/Yf88/zD/NP8u/yv/Nv9G/0b/RP8//0P/TP9M/17/YP9c/3P/fP99/3v/W/9G/0f/TP9G/0f/QP83/z//QP89/0H/W/9z/4b/ef9w/27/av9o/2f/Z/9n/2f/aP9q/2z/bv9t/23/a/9m/13/Vf9O/0f/SP9L/0//Uv9V/1b/Vv9Y/1j/WP9Y/1n/Wv9a/1r/Wv9a/1r/WP9V/1D/Sv9E/z7/Ov85/zj/Of86/zv/PP9C/0f/Tv9W/1//av90/33/gv+G/4n/iv+I/4T/gP99/3n/eP94/3j/fP+A/4T/iP+K/4v/iv+J/4j/h/+H/4f/hf+D/4L/gP+B/4P/g/+E/4P/hP+D/4T/f/95/3b/dP9z/3L/c/9z/3T/c/9z/3L/b/9t/2b/Yf9Z/0//RP8//0H/R/9S/17/av93/4H/if+O/47/jv+L/4r/h/+G/4b/hv+H/4j/if+K/4r/if+H/4D/dv9q/13/VP9U/1z/Zf9u/3T/d/90/3P/cP9w/2//bP9s/27/bv9t/23/bf9u/3D/cv9t/3f/j/+X/5T/j/+L/4n/h/+G/4X/hv+I/4r/i/+L/4v/i/+N/4//kf+O/x5/Hnkefx55IH8feR9/H3khfyF5In8ieSN+I3kjfiN5In0jeiR9JHolfSd6J30neih9KHkpfCl5Kn0qeit9LHssfC18LXwtfS58Ln4ufC5+L3wvgC58LYAtfS1+LH0sfix9K30qfSp9Kn4qfSl+KX0pfil9KX4pfSl+KXwpfil8KX4pfSl+KX0ofih7KH4oeyh/KHwofyh8J34neid+J3onfid6KH4oeih+KHoofih6KH8oeSl/KXoofyh8J38nfCh/KH0ofyh9KX4pfSl+KX4pfSl/KX0pfyl9KYApfSmAKXwpgSl8KYEpfCmAKXwpgCl8KYEpfCmBKHwpgSl8KoEpfiqBKn4rgSt/LH8tfy5/LH4tfy5+Ln4wfjB+MX4xfjF+MX8yfjJ/Mn4yfjJ+Mn4xfjJ/MX4xfzF9MYAxfTGAMX0xgTB8L4EvfC+CL3wvgi58LoIufC2CLnwugy58LoMtey2DLXstgy16LoQuei2ELnsugy57LoMvey+CL3svgi58LoQufC6ELnwuhC18LYItfC2DLH0sgy5/L4NEf22GTHtCjUB6RZBRfYaNqHqtiqpyqYugdKCKoXShi551rIqvdq+KpXSdiqB1ooqbdpGOknOTj49wdpNub2GXZW9ulmluaJNmdGWLcHyAhYKCbIRgfG6Idnp9jIN4hIt5d1SNLns0jz5+RJI+gD+VQH8/lEB+QJNJfUWTRHpNlD53OpdBdkabT3ZJmHh4h499eXaIc3p5h3p3goqDcnWNdHJ0jnB5V4lhgH18d4NtdnuEkHmUhpV9mIKYgI59VYhCd0WWZG+PnJpsl5iLaXKXhWiNl35sQZk3cjeaOXU5mjh4NJkzeDKUL3cwlC5yR5R7Z4uYeV9wmXRdcJpvXW2ZYFxwl4Fgc5dbajqURm9AkzpxO5M7czuTOnE4kz1yXZJcclCRU3RBj15zao5ucniOiXGKkINtfpJ/aHqVemR9lnxkbpZfZF+UXmlplHdqdJRtbWWTYXJZj1h4VYtRfEuGR35EhEJ+PoMyfyeBI34igyR9I4QqezGHLnouiCt7KoYrfUt4Xn9faGGAVGhcfFluYXpga218e2h1fnNueYB6dn+Ben5yhGqCVIY1gzCBNIA+fT9+PXk5ejd3OHg+d1F4bHdreGJ5XXldd2N7c3Zpf1tzToJKdUaBT3pQgkl9P4M9fUCEPnlBhFt3eH2CfHJ7bIBremmCaH5ngWZ8ZoFofGqBbHxtgW17boFre2OBXHxWg058TIFJfUuAT35TgFR9VoBWfFeBV3xYgVh+WYFZgFmBWYBaf1p/WYBXf1WCUIBIgkKAPYM6gDiCN4A6gjqBOoE9gUN/SYJQfFiEYXlrh3Z2foqCc4aLinOKi4dyg4t/c3uJdnV2iXd1eYl9doGKhXWJiot0i4qKdYmIh3eIiIh3hoqHeIWAhXqCcIB9gWeDgIJkg3+DaYR/g3N/fnqCd3pziHJ4colzd3KKcndyiXF3cIhweW2JZXxeh1h+ToVDfj+GQ3pKh1Z1YYpscXmMhHGLio50j4aOd4yEiXqHhIZ7hoSGeYeEiHiJhIp4ioSKe4aEfoB0g2eBXIVUfVeHXnZniHF0doh2eXSDcn1vf21+bH9tf21/bX9tf21+bYFtfW+CbXtvfYJ8k3SVgJBrjoSMbIuEim6KgolwiIOIcouBi3SLfot1jn6Nd41+j3iOfo17Hv8e/x//H/8f/yD/IP8g/yH/If8i/yL/I/8j/yP/I/8i/yP/Jf8l/yb/Jv8n/yj/KP8o/yn/Kf8q/yr/K/8s/yz/Lf8t/y3/Lv8u/y7/Lv8v/y//Lv8t/y3/Lf8s/yz/LP8r/yr/Kv8q/yr/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yj/KP8o/yj/KP8o/yj/KP8n/yf/J/8n/yf/J/8o/yj/KP8o/yj/KP8o/yj/Kf8p/yj/KP8n/yf/KP8o/yj/KP8p/yn/Kf8p/yn/Kf8p/yn/Kv8q/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8o/yn/K/8r/yr/Kv8r/yv/LP8s/y7/Lv8t/y//L/8v/zD/MP8x/zH/Mf8x/zL/Mv8y/zL/Mv8y/zH/Mv80/zL/Mv8y/zL/Mv8x/zH/MP8v/y//L/8v/y//Lv8u/y7/Lv8u/y7/Lv8u/y3/Lf8t/y3/Lf8u/y7/Lv8u/y7/Lv8u/y//L/8v/y//Lv8u/y7/Lv8u/y7/Lv8t/y3/Lf8s/yz/Lv8v/z3/VP9H/0P/RP9U/3T/m/+z/7L/o/+m/6j/ov+k/6X/o/+q/6f/pf+e/5f/mP+i/6H/lf+T/5D/iv9x/2T/Y/9k/2n/bf9n/2b/a/91/3n/dP98/2D/a/92/33/ev98/2r/PP8s/zL/Of8//z7/P/9A/z//P/8//0L/Rv9I/0r/Qf88/z7/Qf9K/03/TP95/4f/ff91/3b/ev+B/4b/iP94/2z/W/9W/1z/d/+A/4b/j/+R/4z/i/+Q/5P/jf9j/0P/Q/9P/4z/oP+h/5b/Xv+C/4//gf8//zf/OP85/zf/N/83/zT/NP81/zb/Nv9N/5T/j/+J/37/cf+B/5//l/+V/4b/f/9+/4D/UP87/0T/RP88/zv/Ov88/zz/O/9T/1z/Tv9X/2X/cf9z/3//if+I/4T/gP+B/4P/g/+F/3j/Z/9g/1//Xv9g/2L/Yv9f/2H/Yv9d/1j/Vf9T/1L/T/9N/0j/Rv88/yn/JP8j/yX/JP8l/y7/Mv8v/y7/K/8r/zL/Tv9c/1//V/9H/1H/W/9d/13/Yf9t/3r/ef93/3f/df9y/2j/af9q/1r/Sv9G/z7/Lv82/zv/Nf8r/yr/NP9U/4L/iv+P/4v/if9+/2f/Xf9T/07/UP9W/07/TP9N/z7/OP89/z7/Rf9a/4P/fv9z/2n/Z/9l/2b/aP9m/2n/av9r/23/bf9t/2r/Zv9f/1j/UP9N/0v/Tf9R/1P/VP9W/1b/Vv9W/1j/WP9Z/1n/Wf9Z/1r/Wv9Y/1b/U/9O/0f/Qf89/zr/Ov85/zr/Ov87/z7/RP9K/1H/Wf9j/23/d/9+/4T/iP+J/4n/h/+D/33/ef92/3b/d/95/33/gf+F/4n/i/+L/4r/if+H/4j/iP+G/4b/hP+F/4H/gP+B/4P/f/+B/4P/gv+B/3//e/91/3T/c/9z/3T/dP9z/3P/cv9x/3D/bf9l/17/Vv9M/0P/P/9E/0v/WP9j/27/e/+F/4z/jv+P/47/jP+J/4f/hv+G/4b/h/+I/4n/iv+K/4j/hP98/3L/Zv9a/1P/Wf9g/2v/c/93/3b/dP9w/3D/b/9u/2z/bf9u/27/bP9s/23/bf9y/4r/lv+S/4z/jP+K/4n/iP+K/4v/if+H/4f/h/+J/43/jv+P/47/jv+N/43/jP8ffx94IH8geCB/IHghfyJ4In8ieSJ/InkjfiN5JH4keSR9JHonfSd6KH0neih9KHoofSp6Kn0qeit9K3osfCx7LXwtfC58Ln0ufC59LnwufS18LX4ufC5+LH0sfit9K34sfSt9K30rfSp+Kn0pfil9KX4pfSp+Kn0pfil8KX4pfCl+KXwpfil8KX4peyh+KHsofih7KH4oeyh+KHoofih6J34meih+KHoofih6J34neih/KHkofyh6KH8ofCd/J3wnfyh9KH8nfSh+KH0pfil+KX0pgCl9KYApfSmBKX0pgSl8KYIpfCmCKnwqgip8KoIqfCqCKXwogip8KoIqfCqCLH4tgSx+LYEtfi5/Ln4vfzB+MH0vfi59MH4wfTJ+MHwxfjF9M34zfTN+M34yfjJ+Mn40fzN+M38zfTOAM30zgDF9MYIwfDCCMHwwgjB8L4IufC6DL3wvgy58LoMtfC2DLnstgy17LYMtey6DLnstgy57LoMuey6DLnsuhC57LoQuey6ELnsuhC57LoQuey6CLXotgy17K4MvfC+DPnpGiUZ3Q5FOeHGPhHqmirJ3sYeYcpqLrXWuirF6soa2fLeDr3ysiKN/mYKSf5iAnXqWhpByfpB2bmmXW29vm2pvZJplbmiUbm52kHp0goiCfXuCan1mh3J4e417dniSX3Yxkix6MI8xfTqTQ39ElUSAQZQ+fj2TPH05k0N7SpRIeDqXOnc9mkh3TZpDeFKUhnmEjnx5eYp8eHyLg3aOi4l2a4xIelGIVIBrgICEknSdhZhwk4WPdouDiH9+fW2ISnhDk0RxdpyZbqCaoWqMl3Npk5p2bT+cOnM7nDt2PJs+eD+aQHY+mEN2QpcycFaZnWOdlaBUoJWHT32ek0+Xn5hNhJ1vV3Cda2RVmTJvN5U/ckSUP3M7lDxxPZQ8cEqUX29dlWducJRvbH2Sg2yDk4ZphpSFa4qUkGqJk3JpY5NiZ2SUZmdjk2VqYpJebVWSTm5UklRvVZBSc1KMUHZQik56S4ZDfS+DJX8jgiR+JIQmfCuGNHo0iDJ5L4gtejWERH1QeV5/WnFHgENySX5XdV17XHNce2Fvcnx+bnl9cXJof2l7bYFpgGWEdn9oh0h8OoMtezB/MHk2ezR1LnkvdTR3UneBeIt3in2FdWF+XnRyfHx0dnxpclh+S3JHfkN2RXxHfEJ3QX5AdkGBbXiEfoF8cXxqf2h8aIBmfWeBaXxqf2x9bYBsfG+AbHxngWB8WYNSfE2BTH1OgFF+U4BUfVaAVnxWgVZ9VoFYf1qAWoBagFuAWn9agFqAV4BTgk2ARoJAgD2DO386gjp+OYI7fz6BPoFEf0yCUXxahGV3b4h5dH6MhHKHjYdyho2FcoGMfHN3i3Z1dop4dXuKfXWBioZ0ioqLdIuKinWJiId3iIeGd4aIhXiGhYV4gnmAfIFqgH2AY4J/g2WBgIJuf398end8c4R0eXKJcndyinN2c4pzd3CJcHdtiWR7XYdUfkqFQ35BhkV6TohadWWMcnF9jIhxjYqPdJCGj3eMhIp6iYSIe4eEh3mIhIh4iYSLeIuEh3uDhHx+cYRjgFiEU3taiGJ2a4tzdHWKdXlzhHB9boBufm2Abn5sgG1/bYFrfW1/bHt2e499mHCSgY1riYKKbYqDi2+Kg4tziIKGdoWBhnmKf4x7j36PfI5+jn6Pfo9/jn6MgCD/IP8g/yD/IP8g/yH/Iv8i/yL/Iv8i/yP/I/8l/yX/Jf8l/yf/J/8o/yj/KP8o/yj/Kv8q/yr/K/8r/yz/LP8t/y3/Lv8u/y7/Lv8u/y7/Lf8t/y3/Lf8s/yz/K/8r/yz/K/8r/yv/Kv8q/yn/Kf8p/yn/Kv8q/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/KP8o/yj/KP8o/yj/KP8o/yj/KP8n/yb/KP8o/yj/KP8o/yj/KP8p/yj/KP8o/yj/J/8n/yf/KP8o/yf/KP8o/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8q/yr/Kv8q/yr/Kv8r/yr/Kv8q/yr/Kv8t/y3/Lf8t/y7/Lv8v/y//MP8w/y//MP8w/zH/Mv8z/zL/Mv8z/zP/M/8z/zX/Nf8z/zP/NP80/zP/M/8z/zP/Mf8x/zD/MP8w/zD/MP8v/y//L/8v/y//Lv8u/y7/Lv8u/y7/Lv8t/y7/Lv8u/y3/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8t/y3/Lf8r/y7/MP85/0H/Rf9P/3D/hv+Q/7D/tf+1/57/jP+q/6//s/+1/7n/uP+z/63/oP+Y/5L/lf+a/5f/lP97/3r/av9i/2n/YP9h/2P/c/90/3z/gP+G/5H/kP9+/1L/Yv9w/3j/df9Y/yz/KP8r/zH/N/88/0D/Qf9C/0D/Pv8+/zz/O/9B/0H/PP89/zv/Qf9L/0j/Of9a/4r/hv99/3v/e/+A/4b/i/+B/0X/Sf9W/1//eP+K/5P/mf+a/5f/lf+J/3T/cf9R/0T/Rf9X/4j/mf+d/5b/dv+C/0r/Qv9C/0P/RP9G/0T/Q/9A/z3/Pf85/zL/bv+p/6X/ov+b/5D/fv+I/4X/fP95/2f/W/9J/0H/N/81/zT/OP8//0D/O/88/zr/Q/9h/2j/a/9x/3b/hP+F/4f/iP+M/5L/lf+A/2X/YP9n/2j/av9q/2j/ZP9k/17/Tf87/z3/TP9S/1D/UP9R/1D/Tf9J/z7/Kv8i/yL/Jf8n/yr/MP81/zb/NP8y/zX/Rf9R/1D/Uv9G/0D/Rv9I/1D/W/9c/1//W/9i/27/aP9m/2P/WP9R/1L/Wf9j/2n/S/8z/zD/Mf8u/y//Mv8v/yz/Lf84/2//hP+A/4H/gP9y/3b/gf+E/4b/hv+F/3j/Tf89/0b/Qv8//0P/Rf9M/2L/c/94/23/av9n/2n/Z/9o/2r/bP9u/27/b/9q/2f/YP9Z/1L/T/9N/07/Uf9U/1X/Vv9W/1b/Vv9W/1j/Wv9a/1v/XP9c/1r/Wf9W/1P/Tf9G/0D/PP86/zv/O/86/zz/QP9D/0j/Tf9U/1z/Z/9w/3r/f/+E/4f/h/+G/4P/f/98/3f/d/93/3j/e/99/4H/hv+K/4v/i/+J/4j/h/+I/4b/hv+H/4b/hf+C/4D/f/+A/4D/gf+B/4L/gv+A/33/eP90/3P/c/9z/3L/dP90/3P/cf9w/23/ZP9d/1P/R/9B/0H/R/9Q/17/av91/4D/if+O/4//kP+P/4z/iv+J/4n/iP+H/4j/iP+J/4r/iv+H/4P/ev9u/2D/Vf9W/1z/ZP9t/3P/df91/3P/cP9u/23/bP9t/2z/bP9r/27/Z/93/5D/l/+R/4//jP+K/4r/i/+L/4r/iv+H/4T/h/+K/47/kP+P/4//jv+O/4//j/+O/4v/IoAheCKAInghfyF4In8ieCN+I3gjfiN4I34jeSR+JHkkfSR5J30neSd9J3oofSh6KH0qeyp9KnsrfSt8LHwsfC18LX0ufC59Lnwufi58Ln4tfC19LHwsfix9LH8sfSx/LHwrfit+K34qfil9KX4pfSl+KXwqfip8KX4pfCl+KXwqfip8Kn4qfCl+KXspfil7KH4oeih+KHoofih7KH4oeSd+Jnonfid6J34neih+KHopfil7KH4ofCh+KHsnfid7J34nfCd+J3wofih8KX4pfSl+KYApfCmBKX0pgSl9KYEpfSmCKXspgip8KoIqfCqCKnwqgit8KoIrfCuCLHwugSx9LYEtfS5/Ln0vfi99MHwxfjF7MX4xezF+MXwyfjN7M34yezR+NHszfjN8NH40fDR+NH40fjSAM30zgDN8M4AyfTKCMXwxgjB8MIIwfDCCMHwwgy98L4MufC6DLnwugy57LoMuey6DLnouhS56LoUuey6DLnsugy57LoMuey6DLnsuhC57LoQuey6ELXsthC17LYMsfCyDLH0vhTx5RItVdnSRhXWOjqV6s4q0dreGoW5/jJxxoYqrd6WKqXepiad6qIijfpuCkn+LfpF+koSJdHyQeHFxmGdvZ5llb22ZbnBxlXRvf5GGc4uKmnyggZt+U4JSdmqLdXV0klJ2J5EoeyuPLn04kDZ/OpJJf0SVQX4/lD19PJU6ezmXPXo6mD14O5s/d0ebTXhEmEZ4e5GPd4eMf3d7inl3gIyFeIuMfHpHiE9/WIN6gop6jIKOdJGDk26Tg5BygYN5e2F+RotDdUSaaW6NnplqmJyKa1+cRHBBnz9zPZ8/dUCfPXU5njp1N5pSdmCYQnGFl65popCVVIqfiUyKoI5OcaFoVmmgWl9RnUNpOJg2cjSVM3QykzR0PpJDcz+SPHFBlFdva5VuaXSWemaCl4Vli5WPZZqVmGZ/lGloZ5NmaWaTaWdtlHBlbZRrZmaTXG1CkzBxMJI+ckyQUnNRj1J1U41Sd0qJN3omhyJ7IoYneyuGLHkziDZ4NYk5eDqJQHpLh1J8T4FEfjd7PH1BfEl8UHtUfVd3V3xdc2B7Y3FZfVx0XIBIfD2CN4MyhjqER4lXgE+KNnwvhS94Mn8xdy98LnMuekluX3dncXh6e3Z5fXt2fH9+dIJ/gHB3f2ttb4FicVSAPnhDf0h/RXxFgUd1RYFQclB9U3JefGN2Z31nfGh9a3xsfGx9bX1vfmx9Z39hfF2DVHtPgE19Tn9SfVWBVn1WgVZ9VYBXf1mAWYBZf1qAXH9dgFx/XIBagFWAUoJMgEaDQX8+gz1/PYM9fzyCPoBCgUeATIBQgld8YIVpdnKJenSAjIRxh42HcYaNg3J+jXlzdot4dHiKeXR8in10gYqGc4mKi3SLiYh2h4mGdoeJhnaGioZ3h4eFd4F/gHqAcIB8f2eBfIFjgX2BaoGAfXh4fnSCcXlziXJ3c4p0dXSLcnZximx4aolke12GUX9FhT9+QoZIeVSJYHJrjHhwgoyKcY2Kj3WPho54i4SKeYmEiHmIhIh5iYWJeYiFiXiJhYZ7goN4f22EXn9WhFV7XYlmdW+MdHR1iXN5cYVwfW6Abn1tgGp+aYJrfWp/aHx+dpZ/l2yRgo1qioSLbIyEjHCJg4lziYOJdomBi3qOf499j36Qfo99j3+PfY9/j32PgIx9iYAi/yH/If8h/yL/Iv8i/yL/I/8j/yP/I/8j/yP/JP8k/yT/JP8n/yf/J/8n/yj/KP8o/yr/Kv8q/yv/K/8s/yz/Lf8t/y7/Lv8u/y7/Lv8u/y3/Lf8s/yz/LP8s/yz/LP8s/yv/K/8r/yr/Kf8p/yn/Kf8p/yr/Kv8p/yn/Kf8p/yr/Kv8q/yr/Kf8p/yn/Kf8o/yj/KP8o/yj/KP8o/yj/J/8m/yf/J/8n/yf/J/8n/yf/J/8o/yj/KP8o/yf/J/8n/yf/J/8n/yj/KP8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kv8q/yr/Kv8q/yr/K/8q/yv/K/8s/y3/Lf8t/y7/Lv8v/y//MP8w/zH/Mf8x/zH/Mf8y/zP/Mv8z/zT/NP80/zT/NP80/zT/Nf81/zT/NP8z/zP/M/8z/zL/Mv8x/zH/MP8w/zD/MP8w/zD/L/8v/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8t/y3/Lv8u/y3/Lf8t/y3/Lf8t/yz/LP8s/y//P/9R/2//hv+J/5j/rv+m/6X/sv+d/3D/fv+P/6b/n/+a/6T/rP+p/6D/mf+O/4X/jf+T/4r/iP96/3P/bP9q/2P/a/9x/3X/dP99/4X/jP+f/6n/rf9u/0r/Zf9q/2j/TP8q/yv/Jv8s/y7/Pv9N/0v/Sv9C/0H/Qf8//zz/O/8+/zv/O/89/z7/RP9I/0b/Rv93/3//jf+I/37/e/97/33/g/+N/3X/Sv9S/3b/h/+F/4T/gP9//4f/kP+O/3n/cv9O/0b/Q/9L/3P/jf+P/3L/TP9F/0D/P/89/z7/Pf88/zr/Ov81/0f/ZP9Y/4H/qf+b/5f/g/9+/4L/gP9m/1v/UP9N/03/Q/82/zb/NP8z/zH/Mv82/z7/Sf9I/0L/Rf9g/2//c/94/4D/iP+N/5b/k/9//3P/cf9r/2v/av9r/2z/cP9z/3D/av9Y/zn/Lv8v/zP/Qv9P/1H/Uv9S/1D/Qf8t/yX/JP8n/yv/Lf8w/zv/P/9C/0H/Qv9G/0f/SP9M/0L/OP85/z7/SP9P/1H/Tv9W/1n/Wf9Y/0//Q/8z/yz/Lv8x/zP/M/80/0L/T/9P/zr/N/82/zH/OP87/zb/Tv89/zz/U/9w/3X/ef96/3//df9i/13/a/9x/3H/hf9t/z7/TP9F/z7/SP9I/0v/Tf9O/1H/Vf9W/1//ZP9p/2z/bv9u/27/a/9n/2L/X/9W/1H/T/9P/1P/Vv9W/1b/Vv9V/1f/Wf9Z/1n/Wv9c/13/Xf9d/1n/V/9S/0z/Rv9B/0D/P/8+/z//QP9C/0X/Sv9O/1L/W/9i/2v/dP97/4D/gv+F/4X/hP+B/33/ef92/3f/d/95/3z/f/+D/4f/iv+K/4r/iP+H/4b/h/+G/4b/h/+H/4X/hP+B/4D/f/9+/4D/gP+B/4D/f/9+/3n/c/9z/3L/c/90/3P/c/9z/3L/bv9o/2H/Wv9R/0X/P/9C/0v/WP9j/27/ef+E/4r/jf+P/4//jv+L/4n/iP+I/4j/iP+J/4r/if+I/4j/hf+B/3f/bP9c/1P/V/9f/2j/cP90/3X/c/9x/3D/bv9s/2v/bf9q/2n/bP+C/5b/lv+P/43/i/+L/43/jf+N/4n/if+J/4r/i/+Q/5H/j/+P/5D/j/+P/4//j/+P/4//jP+J/yJ+IngjfiN4I38jeCJ/I3glfiV4JH4keCR+JHkkfiV5JX0leSd9J3knfSd6KH0oeih9KnsqfSp7K30rfCx8LHwtfC19LXwtfi58Ln4ufC5+LXwtfSx8LH4tfS1/LH0sfyx8K34rfit+Kn4pfSl+KX0qfip8Kn4qfCp+Knwpfil8Kn4qfCl+KXwpfil7KX4oeyh+KHwofih8J34neyd+J3knfiZ6KH4oeid+J3onfid6J34oeyh+KHwofih8J34nfCd+Jnwnfid8KH4ofCl+KX0pfil+KXwpgCl9KYEqfSqBKn0qgip7KoIqfCqCKnwqgip8K4IqfCqCKnwsgi18LYEtfS5/Ln0vfi99MH4wfTF8MH4wfDF+MXwxfjN7Mn40ejV+NXs2fjZ7NX40fDR+NHw2fjZ+NX40gDR9NIAzfDOAMn0ygjJ8MoIxfDGCMXwwgjB8MIMvfC+DLnwugy58LoMuey6DLnougy57LoMuey2DLnstgy17LYMuey6DLnsugy57LoQtey2ELHsshCx7LIQtey2DLXwtgyx8MIVDeGWLgHCOkItuoY6pcZqMnXCrjJdscI5ybZGMpXKuiq5zrImsc6eJnneYhY97hIGHepODjnSCjIBxg5R9cXCWaXFmlW5vcpNzb3uRg3GEi5N7qYKugIqBR3lfiV52XZJHdy6RLnsziy58LY02fUeQOn0+k0Z+Q5VCfUCWPHw+lz17PJg8eTyaPXhCmkt4TJhIeHqTcnZ6jop2h42AdXyMe3eAjIV5iopsfE2GY397gYB+eYBuemR7a319dI2AjXSCgV9/RXpEkUJ0TJxjcHCiVHFGokV0QZ4+dT2dPXU9njt2Opw4dDGYNHRalmpwgZela5OUj2GAmnlcdp1tW2WfV2JMnENoQplBbTeWNHEzkjNyNJA6cEORS25TklNtU5VFbkeWT25Vl1hrXJhzaYWXh2d8loBlgJZ6Y3GWbWNslm9jcJd2Y3eWcWdplFNuNJEtdDCOMHQ1j0h0Uo9UdVGNSHg4jC15KooreiyILnkyiT53SYpNdU6LT3RPi053R4pFekaGOn04gzp9PoBCfUp7T39Pe1R+U3tJf0B+LYArgkGFYIN6iI2Bm4WjfaaEpXulhKN7lId+d2uIXXJXh0ZsMoM9a0B7NW4/eVlzb3tzdXl8enVqf1xzYX95cYx+jnGHf4Z0SoBDe0eAPIFFf0uERXxVg2N5WHpWeFV4U3RXeFpvX3plcmt8a3ZtfG17Z3xff1h7VIBSfVF/VX1WgFV9VoBWfVWAVn9YgFmAWX9agFx/W4Bbf1uAWIBVgE+CTH9Gg0J9QYRAfUCDQH1CgkR+SIFMf1J+VoFce2SFbXV1iXxygIuCcYSNhHGCjYBye413c3aLd3R2int0fIp/dIOKiHOKiol0iYmHdoaJhnaHiYd2h4qHdoaKhXaDhIJ5gHp+en5uf3x+aX59f2t/f354eYB1g3N6c4hzd3OLdHdzi3J3cYpseGaJX3tYhk9/RYU+fkSGTXhaiWVycYx9cIWMi3GNio51j4aPeIyEinmJhIl5h4SIeYiFiXmJhYh4h4WEe36DdH9nhVp+U4dXeV+KaXNyi3R1dYlzenCFb31sgmx9a4JsfWqAanyEd5d/lWyRgo5rjISNbY2Djm+Mg4xziYKJd4mAjXuRf5B+kX2QfpB9kH+PfY+AkH2QgJB9kIGMfYmBI/8j/yP/I/8j/yP/I/8k/yX/Jf8k/yT/Jf8l/yX/Jv8m/yb/J/8n/yf/J/8o/yj/KP8q/yr/Kv8r/yv/LP8s/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/LP8s/yz/LP8s/yz/LP8r/yv/K/8q/yn/Kf8p/yr/Kv8q/yr/Kv8q/yn/Kf8p/yn/Kf8p/yn/Kf8p/yj/KP8o/yj/KP8n/yf/J/8n/yf/Jv8o/yj/J/8n/yf/J/8n/yj/KP8o/yj/KP8n/yf/Kf8n/yf/J/8o/yj/Kf8p/yn/Kf8p/yn/Kf8p/yr/Kv8q/yr/Kv8q/yr/Kv8q/yr/Kv8r/yr/Kv8q/yz/Lf8t/y7/Lv8v/y//MP8w/zH/Mf8x/zH/M/8z/zP/M/8z/zP/Nf81/zb/Nv82/zb/Nf81/zb/Nv81/zT/NP80/zP/M/8y/zL/Mv8y/zH/Mf8x/zD/MP8w/y//L/8v/y//Lv8u/y//Lv8u/y7/Lv8u/y7/Lf8u/y3/LP8s/y3/Lf8t/y3/Lf8t/yz/LP8r/yv/LP8s/y3/Lf8t/y3/LP8w/0r/eP+R/5n/k/+P/5L/kf+Z/6P/nP+I/4j/nf+p/7L/tv+q/43/mP+d/5j/jv+E/4T/kP+K/3P/e/94/3T/dv9z/2n/cf93/3z/hP+M/4z/l/+p/7D/o/9S/1X/V/9W/0D/Kv8r/0H/Q/8y/zD/MP8z/zf/RP9B/0D/QP89/z//PP89/z3/O/87/z//RP9K/0f/e/92/2r/f/+O/4b/f/98/3r/f/+G/4j/YP9S/2b/bf9j/17/Xv9e/2v/gv+N/4n/fv9I/z//Q/9B/0H/Qv9H/0j/RP9C/z//Pf8+/zv/Of81/zL/Mv81/1T/ZP+C/6X/n/+A/3z/dv9p/1//Vf9U/0z/RP8//zj/M/80/zv/P/9H/1L/Vv9Z/1v/WP9Z/1n/Tf9J/0f/Sf9P/1X/Xf9p/3r/iv+M/4b/eP9p/2j/cv95/37/f/96/23/Rv8u/yz/MP8z/zH/N/9J/0//Sf88/y//Lv8t/y7/Mf8y/0f/Wf9b/1r/Xf9e/1n/VP9P/0f/PP83/zb/PP9B/0b/Sv9N/07/S/89/zL/Kf83/1j/ef+P/6b/tv+7/7v/u/+7/7r/u/+6/7X/rv+q/5n/aP8v/zH/Nf80/zD/P/9Y/2v/df99/4D/e/93/4L/hv+C/3P/fP9t/2L/Qf9K/0X/SP9N/07/bv91/2j/Yv9k/1v/Vv9W/1f/Xf9d/2T/ZP9k/2H/W/9V/1T/U/9V/1b/Vf9W/1b/VP9V/1j/Wf9Z/1r/W/9d/1z/XP9Y/1X/Uf9M/0f/Q/9C/0H/Qv9C/0T/Rv9L/0//VP9Y/1//Zv9v/3b/fP+B/4L/hP+D/4D/ff95/3b/df93/3j/e/98/4H/hf+J/4v/if+J/4f/hv+G/4f/h/+H/4b/hv+G/4X/g/+A/3//fv9+/3//fv9+/37/f/96/3X/cf9x/3L/c/9z/3P/c/9w/2z/Zv9e/1b/Tf9D/0D/Rf9R/13/Z/9z/37/hv+L/43/jv+P/47/i/+K/4n/iP+I/4j/iP+J/4n/if+H/4P/fP9z/2b/Wf9U/1v/Y/9r/3L/cv90/3L/b/9w/23/a/9q/2v/a/+J/5j/lP+P/4v/i/+M/43/jP+L/4v/iP+I/4n/jf+R/5L/j/+O/4//kP+P/47/jv+Q/5D/kP+Q/4z/if8kfiN3In4jdyV+JXckfiV3Jn4mdyV+JXclfiV4JX4meCd+J3kofih5KH4oeih+KHopfSt6K30reix9LHssfSx8Ln0ufi59Ln4ufS5+Ln0tfix9LH8sfSx/LH4rfit+K34rfit/K34rfSp9Kn0qfSp9Kn4qfSp+Kn0qfip8KX4pfCp+Kn0qfip7KX4peil+KXkofih6KH4oeid+J3onfid6Jn8meyZ/JnsmfyZ6Jn8meid/J3onfyd6J38neid/J3smfyZ8KH8ofCh+KH0ofih+KX4pfil9KX8pfSmBKX0qgSp8KoEqfCqBK3wrgSt8K4ErfCuBLHwsgCx8LIAtfC1/L30vfy99L34xfTF9Mn0yezN9M3s0fTN7M300ezR9NHs0fzV7Nn82fDZ/Nn02fzZ9NX42fjZ+Nn41fTV/NH00gDN8M38yfDKBMXwwgTF8MIIwezCDMHwvgy99LoMtfS+DK3wugy18LYMufC2DLXwtgy18LYMsfCyDLHwsgyx8LIMseyyELHsshCx7LIQseyyDLXwtgi19LYIrfDCFW3eGjJdvm5KeaJOPiWiQjo1rk4+WbJqPnW+gj6dzrI6tcaiNkW+ZjZ9ynYuReYmFinuPg5B1coh3cHaPd3J6k3t0cpJ4c32QgXGEkIp1g41wfJ2FroGlglh8TohQd0qONXgojip8N4tDfC+MLXwwjjB8MJA3fkOVRX49lUF8Ppc8fDuXO3s5lzt6QJhFd0uYSHZ8lX51c5FqdISQinSDjn12d416d3+LiHeDilp7X4dke1uAXHtdfFx9ZXl3f4J5h3+Nfm+AP4lAekGVQHc/m0J2Rp9EdkKePnU9njt0OZ04dTSaMHQwmDtyVZhibnyYnWmblnxmcJhzYmubWGNVmlBoRZk5bzmVN3A8lENvSpRPbFSUVmpZlVhnW5ZdZlyVYGlalUptRJVEcUuVU3BclmltfJWNaJaXj2V3mGFfWpp1WoWbiFuKmopkcJg2cC2SMHYyjjZ4No0yeDiORHhBjjF4LI4weDKNMnYxjTxzV45hbmGQaG1xkW1wYJFXclCPRnc2izJ8N4dAf0mDSn9MgUh/PIIzgSyDMIE+hFqCeoWOgqSDu3++gL5+v4C+fr6Avn2+f71/uny3gbRxsIWqZX2MOWEohTBtMn40cD96TXNke3R2d3x/eIJ9g3mEfnx3fH+JdYqAh3ZMgEh8SIBPhFN/UIdafn+DdIBremqBaXhlfWB5XXZZellxWnxdcF58XXVZeld6VXtVfVV7VX9VgVWAVYFWgVeAV4BYgFp+WoBbf1x/XH5bf1mAVX9Tgk1+SYVFfESFRHtFg0V8R4JKfE6BUn9WfVuBYnlohHB1dYh9coCNg3CEj4Jxf497c3eNdXN2i3ZzeIx7c36MgnOGi4t0jIuLdoqKiHaHiod2iIqGdYaKh3WHioZ1homEdoGEf3h9eXt7e3B9fX1ufoB7dnqAdoFzfHOIdHd0jHN2c4txdm+KanhkiV59VYZLf0OEQn1Jh1R2X4lqcXeOgnGHjIxyj4mQd5CGjXiMhIh4iYWHeIeFiHeIhoh4iIaIeIeGgnt7hXJ/ZYVXf1OHW3piiWt0cot2dHaIcXpvhWx+a4NpfmiBa32JeJeAk26NgotsioSMbo6Ei3CKg4lyiYOGdoh/i3qRfpGBkn2Rf5B+jIGNfo2BjXyOgY98kIGQfZCAjH2IgCb/JP8j/yT/Jf8l/yT/Jf8m/yb/Jf8l/yX/Jv8l/yb/J/8n/yj/KP8o/yj/KP8p/yn/K/8r/yv/LP8s/yz/LP8u/y7/Lv8u/y7/Lv8u/y3/Lf8t/yz/LP8s/yz/K/8r/yv/K/8r/yv/Kv8q/yr/Kv8q/yr/Kv8q/yr/Kv8p/yn/Kv8q/yr/Kv8p/yn/Kf8p/yj/KP8o/yj/J/8n/yf/J/8m/yb/Jv8m/yb/Jv8m/yb/J/8n/yf/J/8n/yf/J/8n/yb/Jv8o/yj/KP8o/yj/KP8p/yn/Kf8p/yn/Kf8p/yr/Kv8q/yr/Kv8r/yv/K/8r/yv/K/8s/yz/LP8s/y3/Lf8v/y//L/8v/zH/Mf8y/zL/M/8z/zT/M/8z/zT/NP80/zT/Nf82/zb/Nv82/zb/Nv81/zb/Nv82/zX/Nf80/zT/M/8z/zL/Mv8x/zD/Mf8w/zD/L/8w/y//L/8u/y//Lv84/y//LP8s/y3/Lf8t/y3/Lf8t/yz/LP8s/yz/LP8s/yz/LP8s/yz/LP8s/yz/LP8t/y3/LP8r/yv/Mv9n/4T/j/+d/6D/nP+Z/5n/kf+R/4z/mv+j/5X/k/+m/6T/pf+h/6P/kv+O/5P/jP+J/4v/lP+C/3n/ef98/3//fv95/3f/dP92/3z/e/9h/zP/f/+b/4j/TP9Q/0v/Rf8v/yf/KP8s/y7/LP8s/yv/Lv8x/zb/O/9G/0H/P/9D/z3/P/88/zz/O/88/0H/Rv9F/3n/gP9z/23/b/+N/4z/gv98/3v/fv+E/4j/cv9T/1r/Uv9V/1f/Wf9m/3b/gP+A/4b/gv9V/z//P/89/0D/Q/9D/0P/Q/89/z3/OP82/zT/Mf8w/zD/Pf9S/1//ef+Q/43/e/9w/2z/av9d/0r/Sv9B/zT/Nf83/0D/Sv9O/1P/VP9Z/1r/W/9c/17/X/9i/2L/T/9F/0b/TP9S/1v/af97/5D/mf+a/3v/Yv9t/4z/mP+X/5j/jv9c/y3/Lf8x/zP/N/83/zX/M/81/zP/K/8r/zH/NP80/zn/VP9f/2X/bf94/3z/df9l/1n/Sv8+/zb/NP9A/03/T/9O/0j/Nv8u/yz/Pf9I/1f/dv+M/6b/uf++/77/v/++/77/vv++/77/vP+6/7f/s/+w/67/pf+E/zj/Lv80/zP/NP84/1X/aP9n/37/f/96/33/fv+C/4f/jP97/2j/R/9E/07/Tv9O/0//ef94/2v/aP9q/2j/Z/9v/2r/ZP9f/13/W/9c/1n/V/9Y/1n/V/9V/1b/Vv9V/1b/WP9Z/1r/W/9c/13/Xf9c/1r/WP9V/1L/Tv9J/0f/R/9H/0j/SP9K/07/Uv9W/1r/Xv9k/2z/cv93/33/gP+E/4P/gf99/3r/df91/3b/eP96/3z/gf+D/4f/i/+M/4v/iv+I/4f/h/+I/4f/h/+H/4f/hv+G/4b/gv+A/33/fP99/37/fv99/33/e/93/3P/c/90/3T/c/9z/3H/b/9q/2T/Xf9U/0v/Q/9D/0r/Vv9i/2v/ef+D/4r/jP+P/47/jv+L/4r/if+H/4f/h/+I/4j/iP+I/4j/h/+C/3r/cP9j/1n/VP9b/2T/bf90/3X/c/9w/27/bf9r/2n/av+M/5n/kv+N/4r/i/+L/4v/i/+L/4r/iP+E/4T/iP+Q/5P/k/+R/5D/j/+N/43/jf+N/47/j/+Q/5D/kP+M/4j/KH4mdyR+JXclfiV3JX4ldyZ+JncmfiZ3J34neCd+J3gofih5KX4peSl+KXoqfit6Kn0qeit9K3osfSx6LH0seyx9LHwsfSx8LX0tfi19LH4rfSt/LH0sfix9LH8rfSt/K34rfyp+Kn0qfSp9Kn0qfSp+Kn0qfip9Kn4qfCl+KXwpfil9KX4peyh+KHopfil5KH4oeih+KHonfid6J34neiZ/JnomfyZ6Jn8meiZ/Jnonfyd6J38neid/J3onfyd7Jn8mfCh/KHwofih9KH4ofil+KYApfSmBKX0pgSl9KoEqfCqBK3wrgSt8K4EsfCyBLHwsgSx8LIAtfC2ALXwtfy99L38wfTB+MH0yfTJ9MnszfTN7M30zezN9NHo0fTR6NX81ezV/Nnw1fzV9Nn82fTZ+Nn41fjV+NX01fzV9NYAzfDOBMnwygjF8MYEwfC+CL3sugy58LoMufS6DL31Ng0t8MIMtfC2DLXwtgyx8LIMsfCyDLHwsgyt8K4MrfCuDK30rhCt9K4QrfSuEK30rgyx8K4IsfSqCK301hmh4e46McKCSomuhkJ9rm5GaapuRiWuOkaJtj5GFcKCRp22mkKJtnJCNcImOknaPiIx8iYOOeYSFeHR2jHtzfY98dnmQdnZvj2t0b49qd1eNO3xdiGR+ToZNfFCITnlAiyt6J4opfCuJLXwvizt8MYwufDCPMns3k0p8RJY9fT2XPnxAmD56P5g7eTuYP3dAmUR2apV/dHiSc3NukXV0kJGLdYCPfHZ8jH92goyFeF6IWHxXgVR8VH1bfWp/en59gnh+eIGHf3uETXw+i0B5QZNCeEOYR3dImD12Opg4dzSZM3cxly53MJU8dFKVXG94lpBsf5V0anGUbWhklV1rS5dIbz2WOHA3lTVvP5VNbFOWWWdbllxiYZZhYGCWYWBimGNjXZhKaEuWTm5TllRwWpVkbnWVjWqbmJ5ngZh3Y5GaoF+jlaBgnZiDaEGaL3IvlDB2MpA1eDiPOng1jzF4LY4teC6OMHU0jjlyTY9ebWWRcGh6lIVoiZV/bnCUWXNCkTp2OY05ekSKUX5XhVF/QoQvfi+FNX9Dh02CY4aGg6SEuX6/gL5+vn++fr6Avn6+gL5+vX67f7p5uIK1cbGHrGKojaBPco0wVjGHOGlHgzVvPoBYdFZ9b3d1fHt2f358dYJ+hHN7f2NxhoBudj6ASIBHf0+HUH9vh36AdINtgmyBaIJkhWV/ZIdigGKHX3pbhFd0VYBWcVd+WG9Ye1Z0VnpWd1V8VXpXe1h7WX1efGB9XX5bfFp9WnxZgFh6U4FOekqESXhIhUh3SoNLeE2CUXtSgVZ9XHxggGZ4bYR1dHqIf3GBjoRwgY9/cXuPdnN0jXVzdot3c3mMfXOBjIVziYuLdIyLinaJiod2hoqHdYeKh3SGiod0hoqGdIWJhXWEh4N3gIB9en12e3x9cH6AfXR6gHd/dXxziHN3c4xzdnOLcXZuiml4Y4lafVCGSX5EhEd7T4dbdWOLcXB7joRvioyMc46JjneNhot4iYSJeIiFiHiIhYh3iIeHd4iHh3mGh4B7eIZtfmKFVn5Whl14ZoludHWKd3ZziXF6b4VsfG2AbH2LeZeAk22Og4triYOKcIqDinKKg4d1hoKEeYJ+fnyLe5OBk3mRgpB7j4GPfI2BjHyMgY18joGQfJGBkH2Ogot9h4In/yb/JP8l/yX/Jf8n/yf/Jv8m/yb/Jv8n/yf/J/8n/yj/KP8p/yn/Kf8q/yv/K/8q/yr/K/8r/yz/LP8s/yz/LP8s/yz/LP8t/y3/Lf8s/yv/K/8s/yz/LP8s/yv/K/8r/yv/Kv8q/yr/Kv8q/yr/Kv8q/yr/Kv8q/yr/Kf8p/yn/Kf8p/yn/KP8o/yn/Kf8o/yj/KP8o/yf/J/8n/yf/Jv8m/yX/Jf8l/yX/Jf8l/yb/Jv8m/yb/Jv8n/yf/J/8m/yb/KP8o/yj/KP8o/yj/Kf8p/yn/Kf8p/yn/Kf8q/yr/Kv8r/yv/K/8r/yz/LP8s/yz/LP8s/y3/Lf8t/y3/L/8v/zD/MP8w/zL/Mv8y/zP/M/8z/zP/M/80/zT/NP81/zX/Nf82/zX/Nf82/zb/Nv82/zX/Nf82/zb/Nf81/zP/M/8y/zL/Mf8x/zD/L/8v/y7/Lv8u/y7/Lv8s/yn/LP8u/y3/Lf8t/y3/Lf8t/yz/LP8s/yz/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/LP8r/yv/K/8r/zb/Zv97/5H/o/+j/5v/mf+a/5v/lv+R/4X/ov+Z/4//nP+n/57/mv+a/5X/kP+T/5D/i/+H/4z/g/96/3b/df95/3n/eP9y/23/Zf9c/1f/Uf9K/1D/Tv9O/03/UP9L/zz/K/8n/yr/Kf8s/zD/Lv8r/yz/M/80/zT/NP81/zn/Pv8+/0D/QP8//z3/O/89/0H/P/9f/4n/dv9u/2z/bv+F/5P/h/9+/3v/ff+D/4v/cP9R/1D/Vf9e/2T/cf98/3j/c/9s/33/if9r/0L/P/9D/0L/Q/9G/0T/Pf86/zf/Nf8y/zH/L/8w/zv/Tf9a/3T/ev9+/3j/c/9o/1z/Wf9T/0b/Pv8//zr/Nf87/1D/V/9Z/1//ZP9m/3H/c/9s/2b/Xf9Y/1f/Vv9M/0z/Uf9Z/2H/b/+H/5n/oP+X/5v/nv+e/53/m/+M/2H/Mf8z/zD/Mf80/zb/Nv83/zT/NP8y/zH/MP8z/zb/Sf9c/2X/b/93/3z/iv+Q/4z/bP86/zf/Ov87/zz/PP8+/0D/Pf83/zD/L/83/z//Rf9m/5f/tv++/73/vv++/77/vv++/77/vv+7/7v/uv+2/7P/rf+n/57/m/+W/1X/MP9M/1f/QP8w/0P/Qv9h/1n/bf+A/33/gP94/0b/Tf9+/1v/P/9F/0v/Tv9W/2D/Xv9V/1L/Sv9J/0n/Sv9M/03/Uv9R/03/S/9K/0//U/9X/1f/Vf9W/1T/V/9Z/1b/VP9b/2T/Zf9l/17/Wf9b/1//Xf9W/1D/S/9J/0r/Sf9L/0z/T/9S/1X/Wf9e/2P/aP9v/3b/fP9//4H/g/+B/37/ev90/3P/df92/3j/e/99/4H/hf+J/4z/jP+K/4n/h/+G/4f/h/+H/4b/h/+G/4b/hf+G/4X/g/+D/4D/fv9+/37/f/99/3r/eP91/3T/c/9z/3P/c/9x/27/af9j/1r/UP9G/0b/SP9Q/1z/Zf9z/33/hv+M/4z/jv+P/47/i/+J/4n/iP+H/4f/iP+I/4f/h/+G/4T/f/92/2z/X/9W/1j/X/9n/3D/df92/3P/cv9w/2v/bv+I/5b/k/+O/4v/i/+J/4r/i/+H/4X/hP+D/37/dP9+/4r/kf+R/5D/kP+P/4z/jP+M/4z/jf+O/5D/kf+O/43/iv+G/yd+J3gmfiZ4J34ndyd+J3cnfSd4J30neCh9KHknfSd4KH0oeSh9KHkpfip6Kn4qeil9KnorfSt6LH0seyx9LHssfSx8LH0sfCx9LH0sfSx9K30rfit9K30qfip+Kn4sfit+K34qfip+Kn4qfSp+Kn0qfip9Kn4qfSl+KX0pfil9KX4pfCh+KHwofih7KX4peyh+KHsofih5J38neSZ9JncmfiZ3Jn4mdyZ/JngmfyZ5JX8leiV/JXomfyd6J38neyZ/Jnwnfyd8KH4ofih+KH8pfil/KX4pgCl9KYApfSqBKX0pgSp8KoIrfSuBK30sgSx8LIEsfCyALXwtgS18LYAufTB+L30xfTB9Mn0yfTJ7M300ejN9M3o0fTR7NH01ezV+NXo2fjZ7NX41fDZ+Nn02fTZ9NX01fzV9NX81fTSAM30zgTF9MYExezGCMHsvgi97L4IufC2CLnwugy18LoMufC2DLXwtgy18LIMsfCyDLHwsgyx8LIMrfCuDKnwpgyp8KoMqfCqDKnwqgyp8KoMqfCqCKX0qgSl/NoVqeoaOl3Kfk5psl5KNapWTmmuSkZFsiZGdbZ2Rm2yXlJlnm5OYaJaSi2uIj45zk4uMe4yFi3qEhHl4eop7dn2Md3Vwj2J1Z49hdlCQRXlLjVF9T4lOfk+HUX1MiUp7PIoneyaKKHwpiSt+LYkqfCmLKnosjCt8L48zezGUNnsxlzl7Ppk+ekGZPno9mT93Ppg/dlCXh3Z1lG9zbpJscnKQjHKPj4N1fI1+dXyMhHiCiFV8QYFTf2R9cIB5gXp/coVlfVmDYH14g3l9XIZDfESNQns/kUR5SJQ+eDqVN3Y0ljN2MZYwdy+TOnRMk2Bwg5OObo2ThWxtlWFuVpVUb1OVRnFClUJyPpQ4cDyVU2tYlltkYZhoXW6Zdlh/m4ZYf5l5XXeZcmN2l2dqYpdmb2WXZ21plnhpj5ibZJiammKZm5delJyRX4adbmZEnDZwNpg2dDeVOXU4kzZ2MpIzeDSPNHg1jjN0RY5gbmaRbGh1lHxkg5eMZpGXjW9iljJ2N5Q3dzaQNXg1jjZ5N4s1eTOLMHowiTR7N4lCf3WHrH+6g71+voC+fr+Avn69gL9/vX++gLx8uoC4ebWEsmyri6FVl5SSN5CUfjNNj0tXVYpUaDGDOXBUf2p0WH5edn19fnd+foB3en95c4OAd3RNgEV8ToBOhmWBV4lTgVSJUoFQiVWCWYlWgViIV4BWilF/T4tOgE2LT31Xh1V7VIJWc1h8W29celtwVHpXcVp7XHFiel50WndaeWB1ZH1kdGZ/XXRPgkx1S4NMdEyDTXVRg1R3WIFcfGB8ZoBqd3CGdnR9in5ygI6AcX+PfHJ5jXVydI10cneNeHJ8jH9yg4yHc4uLjHSLiol2iIqHdoaKh3WHioZ0hoqHc4aKhnOGioV0homFd4KBgnl9d398fnB+f310fH95fnV7doh0d3SMc3VxjHB2bYtneWGJWnxQhkZ/RYRJelOIXnRoi3Zwf42GcIqLjHOPiY53jYWKeYmGh3iGhYZ4h4aIeIiGiHeIhod5g4d8e3SFan5dhld8WYhhdWmLcnJ2jHZ2dIpxeGyFbXuHe5h/kW6Rgo5si4OJcIiDiHOHgoN1goKFeXx/an5ue4CEi3aRhZB5j4OPe4+DjHuMg4x7jIONe46DkHuSgpJ8j4KKfIWDJ/8n/yf/J/8n/yf/J/8n/yf/J/8n/yf/KP8o/yj/KP8o/yj/Kf8p/yn/Kv8q/yr/Kf8q/yv/K/8s/yz/LP8s/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yr/LP8r/yv/Kv8q/yr/Kv8q/yr/K/8r/yr/Kv8q/yr/Kf8p/yn/Kf8o/yj/KP8o/yf/J/8o/yj/KP8o/yj/KP8n/yf/Jv8m/yb/Jv8m/yb/Jv8m/yb/Jv8l/yX/Jf8l/yX/Jv8n/yf/Jv8m/yf/J/8o/yj/KP8o/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kv8q/yv/K/8r/yz/LP8t/yz/LP8t/y3/Lv8u/y//MP8w/zD/MP8y/zL/Mv8z/zT/NP80/zX/Nf80/zX/Nf81/zb/Nv81/zX/Nv82/zb/Nv81/zX/Nf81/zX/NP8z/zP/Mf8x/zH/Mf8w/y//L/8v/y7/Lf8t/y3/Lf8u/y7/Lf8t/y3/Lf8s/yz/LP8s/yz/LP8s/yv/K/8q/yn/Kv8q/yr/Kv8q/yr/Kv8q/yr/Kv8r/yv/L/82/2v/jP+Z/5n/lv+c/4v/j/+Y/5L/jf+C/5L/lf+Y/5n/lv+X/5P/jP+D/4T/gv+K/4b/g/+D/4j/ev9//3r/dP9u/2n/Yf9q/2P/S/85/0P/T/9P/1H/T/9Q/0//SP84/yf/KP8o/yn/Kv8q/yr/Kf8q/yz/K/8u/zX/O/9K/0f/Of86/0D/QP89/z7/PP85/zv/Qv96/4L/d/93/3X/d/+D/5L/iv9//37/f/+A/4j/cf9Y/2H/aP92/3v/d/9u/1z/R/8+/0j/Wv9l/1f/Rf9D/0X/Q/9A/0D/Of83/zP/Mf8v/zD/Lf87/0n/YP+K/5v/nf+M/2P/R/9T/1T/Vv9I/0T/R/9D/0P/SP9S/1j/X/9o/2r/bv+A/5D/kf+J/4P/d/9m/17/Zf9s/2f/bf9y/3X/dP93/4L/h/+M/47/if+E/37/d/9w/1b/Pf86/zn/OP85/zj/Nf80/zP/Mv81/zj/Ov9Z/3T/dP91/3j/gf+D/4f/jf+J/2L/Nv83/zX/NP80/zP/MP8y/zD/Lv8u/zL/Nv82/0X/cf+f/7T/u/+7/73/vv+8/7z/uP+0/7b/uv+6/7n/s/+u/6T/mf+R/43/jP+G/1r/Uv9M/1X/Uv8x/zT/Tf9P/z3/aP+A/3//gP+B/3z/fP94/27/VP9L/0z/TP9N/07/UP9N/0//Tv9M/0T/TP9Y/1X/Tf9F/0P/Q/9F/0f/Vv9S/1H/W/9Z/1P/Wf9X/2P/Zf9l/23/a/9o/2j/Zv9t/2//aP9e/1H/Tf9M/07/Tv9P/1L/Vf9Y/1z/Yv9o/27/c/96/37/gP+C/4L/fv96/3b/dP9z/3T/d/94/3z/f/+D/4f/i/+M/4v/if+I/4f/hv+H/4f/hv+G/4b/hv+G/4f/hv+H/4b/hP+C/3//f/9+/37/fv99/3n/df9z/3L/cv9w/27/b/9t/2f/Yf9a/1D/Sf9I/03/V/9g/2v/eP+B/4b/iv+N/47/jv+N/4r/if+H/4b/hv+G/4f/h/+G/4b/hP+B/3v/c/9p/1z/V/9c/2P/a/9y/3f/d/9x/3D/bP+D/5b/kv+O/4v/iv+L/4r/if+H/4T/hf+B/3z/ZP9k/3T/g/+P/5H/kP+P/4//j/+M/4z/jP+M/43/jv+Q/5L/kP+M/4n/hv8ofih4KH4oeCh+KHgofih4J30neCh9KHgofSh5KH0oeCl9KXkpfSl5KX0qeip9KnoqfSl6Kn0seix9LHssfSx7K30qeyt9K3srfSt9Kn0qfSp9Kn4qfSl9KH4rfip+KX4pfil+Kn4qfil+KX0pfil9KX4pfSl+KX0pfil9KX4pfSh+KHwofih8J34neyd+J3snfid8J34neyZ/JnomfSZ4JX4leCV+JXglfyV4JX8leSV/JXolfyV6Jn8meiZ/J3smfyZ7Jn8neyh+KH4nfid/KX4pfyl+KYApfSmAKX0pgSl9KYAqfCqBK30rgSt9K4EsfC2BLHwsgC58LoAvfC9/Ln0vfzF9MH4xfTF9MX0xezJ9M3o0fTR6NX01ezR9NXs1fjV6Nn42ezZ+Nnw2fjZ9NX01fTV9NX81fTV/NH0zgDJ8MoExfDGBMHswgjB7L4Iuey6CLnwtgi18LYMtfC2DLXwtgi18LYIsfCyCLHwsgit8K4IrfCuCKnwqgip8KoIqfCqCKnwqgip8KoIqfCqCKnwqgip9MIFAfz6FaHqNjphyk5aWbJqVj2qRlJZskJSVbIyTl2ybk5pnlpSLZIaUh2aJkoNqhJCBcYWOhXl/iIF9ioR9enmHcXlxi3B3bY5seGePY3hUjUp6S4tLfU2ITn1RiU58SopIfDeKJ3woiih7KIopfCmKK3woiyp6LowseyuOLHo3kVB6PZU4ejOXPHs6mT96P5k9eTyXOXg7l2x2jZKCdYKPf3OBj4hzj5CSc4SOfnR/jYJ0hIuCeVmGaYF0gniBeoJ4gGqDV31EhDl9N4M6fUuGYXxUiUJ7P41DeUOQQ3lBkjh5NJMxeS+SLnkukDx2S5FabnaRmGqek4htUpZHb0eWV3FYl01xSJVDcUKVTG9MlVZrW5ZcY2WYdVqFnI9WlpucV5Ode19gnlNmTZtiaHmcgWWDnIpjjJmOYoWadGFpmnRhf5t8YXacc2Ntm2hnYZlTbkCZPHE7ljlyOJY3dDaVNnU2kjV1NpE6clWSd2x/lH5me5Z/YYSYhWSIl4ZrY5Y6cjiWNnUzkzJ3MI8wei+MLXouizB7NIo5fTyKSntVjW94kY+keKyOs3q2ibF9p4SdgZaCmoKofa6DsHWvhahjnomSQ4uPiSyKj4cvWItJVkqJR2tXhEluMIE3bkWANHJLfnR3eX19eYF+f3V3f2VwgYBwdj6BTIBQgl6CY4JdfV+AYHhWgVJ7SIFafmiAaH9sgGuBZYFbgVOBVYNngVKDR4BYhl96WoJjd2l/YXZbf2d5bYBsfGN9YH5YemuAbHlegFN2T4JPdU+DUHRQg1J1VYFWeFqAXn5ie2eEbnd1i3pyfY6BcIKRgW99j3lxdo11cnONdnJ4jXhyfIx/coOMh3OKi4t0ioqJdoiKh3aHiod1h4qGdIaKhnOGioZzhoqHdIiJh3eFgYN7gXeAfoBzf39+dn1/eYF1enOJcnVyjXBzb4xtdWqLZ3lfiVl8UIZJfkqGUXlbiWV0cI15cIKNh3CKio1zjoiNd4uFinmJhoh4h4aHeIaHh3eHiId3h4iEeYCHenxxhWZ+XIZYel6JZnZujHV0dot3dXKIcHh+fpZ/k3ONgYttioKKcYuDiXSFgoZ1g4GDenuBZIBee2mDd3aDho11kISQeZCDj3uNg417jYOOe46DjXuOg5F7kYKPeoyDiXqIfyj/KP8o/yj/KP8o/yj/KP8n/yf/KP8o/yj/KP8o/yj/Kf8p/yn/Kf8p/yr/Kv8q/yr/Kf8q/yz/LP8s/yz/LP8q/yv/K/8r/yv/K/8q/yr/Kv8q/yr/Kf8o/yv/Kv8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/KP8o/yj/KP8n/yf/J/8n/yf/J/8n/yf/Jv8m/yb/Jv8l/yX/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8m/yb/Jv8m/yb/Jv8m/yf/KP8o/yf/J/8o/yj/Kf8p/yj/Kf8p/yn/Kf8p/yr/Kv8r/yv/K/8r/yz/Lf8s/y3/LP8s/y3/Lf8u/y//Mf8w/zH/Mf8x/zH/Mv8z/zP/M/81/zX/Nf81/zX/Nf82/zb/Nv82/zb/Nv81/zX/Nf81/zX/Nf8z/zP/Mv8y/zH/Mf8w/zD/MP8v/y7/Lv8t/y3/Lf8s/y3/Lf8s/yz/LP8s/yz/LP8s/yz/K/8r/yv/K/8q/yr/Kv8q/yr/Kv8q/yr/Kv8q/yr/Kv8q/yr/Kv8s/y7/MP9h/4b/kv+Q/5T/lv+N/47/lf+V/5X/l/+b/5v/mP+W/4j/h/+A/47/jf+D/4P/i/+I/4H/gv+L/4X/d/95/3f/dv9y/23/Zf9e/1X/Tv9M/0n/S/9O/07/Tv9L/0n/Ov8p/yj/KP8o/yn/Kf8q/yr/K/8t/y3/Lf8s/y//M/8r/zD/Vv9E/0L/Pf8//0D/Pv87/z3/XP+T/4z/if+G/4b/i/+P/5f/jf+A/33/gv+B/4f/cf9y/3f/d/95/3T/Z/9U/0P/OP81/zT/OP9M/1r/T/9E/0H/Rv9E/0T/Pf81/zH/L/8v/y7/PP9N/2X/ev+V/5n/c/80/0D/TP9O/1D/TP9B/zz/P/9C/1P/WP9d/2T/cP+F/5j/nv+d/5b/gf90/3X/bf9d/1L/Yv94/3z/iv+f/5r/nP+U/3v/bv9y/3T/cv9s/2b/Y/9b/1n/UP9E/0H/Pv89/zr/Of83/zf/N/85/zr/Tf92/4T/gP+A/4T/h/+F/3//gP9n/zz/N/81/zb/M/8x/y//Lv8t/y//M/85/zv/Q/9V/1//Zv9r/3P/e/+L/5X/lf+K/33/d/+A/5H/mv+b/53/l/+Q/4v/h/+H/4b/fv9a/0T/RP9J/0v/Uf9Q/zz/PP9N/23/ff93/3j/fv9+/2z/X/+J/4L/Q/9N/1n/Y/9j/2X/a/9o/1n/UP9c/2b/bP9t/23/bv9s/2f/Yf9g/1j/UP9K/03/W/9a/13/Wv9W/0//Vv9i/2X/Vf9I/0H/Xf9k/1f/Uf9R/0//UP9Q/1D/Uv9W/1j/Wv9e/2T/af9v/3b/e/9+/4H/gv+B/33/ef92/3P/df93/3j/ev99/4H/hf+H/4r/i/+K/4n/iP+H/4f/h/+H/4b/hv+G/4b/hv+G/4f/h/+I/4f/g/+B/4L/gv9//37/fP94/3X/c/9x/3H/cf9v/23/av9n/1//WP9P/0n/TP9T/13/Z/9w/3v/hP+I/4v/jf+O/43/i/+K/4n/iP+H/4b/hf+H/4j/h/+G/4T/gP95/3D/Zv9c/1z/Yv9p/3D/d/92/3X/cf95/5T/lP+P/4v/if+J/4n/h/+I/4X/hP+E/3r/ZP9e/2D/av92/4T/jf+O/4//j/+P/47/jf+N/4z/jP+N/47/kf+R/4//jP+K/4z/KH0oeCh9KHgofih6KH4oeih9KHkofSl5KX0peCl9KXgqfCp4KnwqeSp9KnkqfSp6K30reyt9K3srfSt9K30rfSt9K30rfSt9K3wrfSp8Kn0qfSp+Kn0qfil+KX4ofih+KX4pfil+KX4pfil9KX4pfSl+KX4pfil+KX4pfSl+KX0ofih9KH4nfSZ+Jnwmfih6J34neiZ+JnomfiZ7Jn4meSV+JXglfiV4JH4kdyV+JXclfiV5JX4leSV+JXolfiV6Jn4meyZ+J3snfid9Jn4nfid+KH8nfSiAKH0ogCl9KYApfSmAKn0qgCt9K4EsfSyBLHstgSx7LH8tfC5/LnwufzB9MH4wfTF9MX0wfTF9MXwxfTJ7M30zezR+NHs1fjV6NX02ezV+Nns1fjV8Nn41fTR9Nn41fTV+NXw0gDR8NIAyfDGAMnwwgS96L4Iuei2CLXstgi17LYItfC2CLHwsgix8LIErfSuDK30rgyt9K4MqfCqCK3wrgip8KoIqfCqCK34sgih+KoIpfSmCKn0qgip+KoEpfimBKX4shFp7fY6LcpCWlGuQl45oi5eQa4+XjG2clZ5rnJWZZZyWlWSJlopojJSRbpKRi3KHjop7g4iCgIuEjn6Ahn17eIp2enSMbXpkjl16Uo1Fej6KQnxHik19TYhLfEiJSHs+iy17KIsnfCmLKnwoiyh8KYsqfC2MLnssjit6KI8peiyRLnk6k0N6UJY7ej+YPXo+mTx6PpVKeZCQkXeKjId0ho6Mc5OPmHKVj4hyfo5/c4KLhXZ/iWR+dYR4gHaCcIBjgk9+PoQ3fTeFN3w6hkV8VoZcfE+LP3k+jkJ4P5FAeTqQNHkwjy54L486dUuQZ2+EkpJrl5VobC6XNm9Rl2RwVJVIcEKVPnA+lEFtRZZbaWGYZGJ7m5FbnZmdWJebglp2oXhke51wY36elF6WmItWgJ+aWKSQolmikaBck5d+XnKZbWNommdnZJlfalqZWm1Ul09wSZdCcUCVPnI9lTtzOZU4dDqVNHFbl4lriJh3Z3uXgWOFmIJjfJh7aWqXRG82ljZ1NJMzdy+RLnoujS97MYs1fDqJP31QiGh8fYl+enmLd3dtkGF2X5FieWWMY35khmyAeICAgoN0h4aIYYOGf0p8hns8bodjRlmHP2BAhjdxPIM3ckWBWm5CgEFvYn52cnh9dXZ8f4J1gH9kc0yAYHVPgk16aYNqfWeBZ3pgf150W4BfdmiBanhtgWx7boBufmuAaIBhgF6AX39fgVd/WYNafliCVX1Xglx+XYFhfmqAaH9CfjB+OH1Xf297V4FRdlGCUHRRg1FzUYJTdlaBWXpcf2CAZHpqhnB1d4p8cICOgm+CkIFvfY95cHSNdHF2jXhxeY18c3+Mg3OIi4pzjIuMdIuKiXaIi4d2h4uGdYaLh3OHi4dzhoyHc4eLh3KIiYh2h4CEe4J1gn6Cc4GAf3d9gHiBdXt0iHR2dItxc2+MbXVqi2V6XolWfU2GSXxPhlZ3YIppcnWOfm6EjohwjIqOc42Ij3mKhoh5h4aGeYaHh3mHiId2h4mGdoaJg3l/h3h7cIVkfl2GXXlkimtzc412dHWMb3d1gY99lnOOgottiIOHcYeBiHSHgYZ2hIGDeX6BZ39ffV+IZXZuiXpyhIiJdIqEjHqMg457joONe4+Ej3uNhI56joSRepKCjnqKfol9kXMo/yj/KP8o/yj/KP8o/yj/KP8o/yj/Kf8p/yn/Kf8p/yr/Kv8q/yr/Kv8q/yr/Kv8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/Kv8q/yr/Kv8q/yr/Kv8q/yr/Kf8p/yj/KP8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yj/KP8o/yf/Jv8m/yb/Jf8l/yX/Jv8m/yb/Jv8m/yb/Jf8l/yX/Jf8k/yT/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8m/yb/Jv8n/yf/J/8m/yf/J/8n/yf/KP8o/yj/Kf8p/yn/Kf8q/yr/K/8r/yz/LP8s/y3/Lf8t/y3/Lv8v/y//MP8w/zH/Mf8x/zD/Mf8x/zH/Mv8z/zP/NP80/zX/Nf81/zb/Nf82/zX/Nf82/zX/Nf81/zT/NP80/zT/M/8y/zL/Mf8w/zD/L/8u/y3/Lf8t/y3/Lf8t/y3/Lf8s/yz/LP8s/yr/Kv8q/yr/Kv8q/yn/Kf8q/yr/Kf8p/yr/Kv8v/zL/Kf8p/yn/Kf8o/yj/Kf8p/yn/Kf8p/yz/UP9t/33/jv+M/43/jf+O/4v/iP+J/5v/m/+a/5z/mP+H/4f/jv+N/5D/jf+J/4r/h/+B/4P/if+R/4P/eP93/3f/dP9v/2X/X/9V/0T/QP9D/0r/Tv9J/0v/SP9G/z3/Lf8o/yf/Kf8q/yf/KP8o/yj/Kv8s/yv/K/8u/y3/M/8r/yn/Lv84/zz/Pv8//zz/Ov88/0D/kP+T/4z/iv+O/5H/lf+W/5f/iv9//4D/f/+F/4r/af9u/3f/df9w/2D/TP9C/zj/OP88/0T/Wv9m/1//VP9N/0T/Qv9A/z//O/81/zH/L/8v/zv/SP9b/33/kv+S/1n/Mv9T/3L/eP9g/0z/Rf9B/z//QP9B/0//Zv9u/3f/lf+f/5b/gv9z/4L/pf+r/5//pf+m/6b/m/+X/67/sP+q/6X/nf+X/4f/e/9y/2n/Zf9g/13/Wv9W/1L/Tv9L/0X/Qf89/z3/Pv8//z//Pv87/1r/hf+P/37/c/93/37/gP97/3j/bv9R/zj/N/81/zP/M/8w/zD/Mf81/zj/P/9C/1b/dv+M/43/j/+O/4f/ff9p/1r/Vv9S/0//Tf9U/1v/Xv9g/2T/YP9d/1z/Wv9i/3T/Wf9C/z//Pf9C/zT/Pf9B/0v/N/9L/2X/Z/9u/3r/gv+F/2j/Jv9i/3H/U/9a/13/ZP9r/2z/Zv9o/2P/Yv9o/2//cP9w/3D/a/9n/2T/X/9f/1z/Wv9Y/1n/Wf9Z/1r/VP9U/1z/Xv9Y/zb/KP8x/0//Yf9V/1L/Uv9Q/1H/Uf9S/1T/WP9a/1z/YP9m/2v/cv94/33/gP+D/4P/gf99/3r/dv9z/3X/eP95/3z/f/+E/4f/jP+L/4v/iv+J/4j/h/+H/4b/hv+G/4b/h/+G/4f/h/+H/4j/if+I/4b/hv+E/4T/gf9//33/eP90/3P/c/9z/3D/bv9s/2n/Zf9e/1b/Tf9M/1H/WP9h/2v/dv9+/4T/iP+M/4//jf+N/4n/h/+G/4b/hv+H/4f/h/+H/4b/hv+D/3//d/9v/2T/Xv9g/2f/bv9z/3f/dP90/4r/lf+R/4v/h/+F/4b/h/+I/4b/g/+F/3//af9j/2P/Yv9m/3H/fv+J/4z/jf+N/43/jv+O/43/jf+O/47/jv+O/5D/kf+P/4j/jv+U/yl9KXgofSh4KH0oeCl9KXgpfSl4KX0peCl9KXgqfSp4KnwqeSl8KnkqfSp6Kn0qeip9KnoqfSp6K30rfCx9LHwrfSt9Kn0qfSp9Kn0qfSp9K30rfil9KX4pfil+KH4ofih+KH4ofih+KH4ofSh+KH0ofih+KH4ofid+J30nfid9Jn4mfSd+J30mfiZ8Jn4meiZ+JnomfiV6JX4leSV+JXglfiV4JH4keCR+JHklfiV5JH4keSR+JHkkfiV5JX4leSZ+JXsmfiZ7Jn4mfCZ+J30nfid9J30nfyh9KIAofSiAKX0pgCl9KoApfSuALH0sgCx9LIAsfSx/LX0ufy59Ln4vfC9+L3wvfTB8MX0vfDF8MX0yezJ9Mns0fTR7NX01ejV9NXo2fTV7NH00fDR9NH00fTN+M30zfjN8M4AyfDCAMXwvgC98L4Euey6CLXstgi17LYIseyyCLHwsgit8K4IqfCqBK30rgyt9K4IqfSqCKn0qgip9KoIqfSqCKn0qgSp+KYIpfimCJ30ngid9J4InfieBJ34ogSl/K4RJfWuLfnOPloZrhJiHaYmXhWqCmItrmJWSaYuUjmWMln1mh5WLbIyUiXOIkYh2hI6BfICJgH+FhZJ/gYVxfnSJeXxzi2x9aIphfVOJTHpIiUd8Rok8fUCISXxHiUV7PIkveyiJKHwpiyp8KYsofCiLKnwqjCt7LI0rey2OLHotkC16KpAsey+TNXs0lj16PJc3eTuUTHmWkJd3kIyNc4uNknGWj5VxlZCTcoaPgHOBjIN2h4yCe3KGdYB1f22BW39LgDx+OH83fkR/X39sf3KEaHxdiFd2T5FGdUCSQnY/kjh3MZAweC2QOHVEkF9wcpOMbYiWUGxOmHdqjJmDam+WU2xKlEhtQZRBbj6WTmtVmWVmfJuFX42ei1+SnqBprY21b7KGsmuyiaxbpY+gS5yYrk6ziq5OpI+fT46Yf1d9nXNhbJtlZ2OaXmpZmVdrWJlUbE2ZSG9ClUBxQJVCckOWQnFAl0NvYpqCaYaagmV4mXdifJh9Y3mYdmlvmFttQJg6cjuUO3Y8kDd6Mo01ezeLPHxAiUV9W4l4fYqGjH+RhJGAkYWPgIKGcYFqhWOBXIFWglN9TYNHdUaESGxIh0xbWIZnSnOHb05Mh0dnSYc+d0eCOHk+gUV1RIFHcT9/SG9XfmF0eX+BdoB/OHVFf5J0koGAd0mDWH1WglGBVn5jf2t9YntdfWx5bX9xfXR/cYBtf2iAZH9ggF1/W4BaflmBWH5YgFl+WoBXflp/XX5cflZ/RX0/f0x9V39ZeVWBUXdQgVF2UIJSdlKBVXdZf1t7X31jgWh5bIZ0dHiLfHCAj4JvgpCAb32PenB4jXdxdo16cXuNfXOAjIRzh4uLc4uLinSJiol1iIuHdYeLhnWGi4ZzhouHc4aMhnOGi4d0iImKeIiAh3yFdYN/g3SBgH54en93g3N5c4pzdHOMb3NujGx1Z4tkeVyIVHxNhU58U4Zbd2OKbXF4joBwhY6JcYyKjnSNiIt3iYiJd4iIh3eHh4d3h4iGdoaJhnaGiYN5foh3e22GZXxghmJ3aIpvc3aMdXRxiIZ5k3iQgY1wi4KJcYiCh3aIgYZ2hYGIeIGBa4Blf2WJYnlii2hydoyCcoyKkHePhY97j4ONfY2DjnuMhI17jYSOepCEkHqQgox6jXiVf5VtKv8q/yr/Kf8p/yn/Kf8p/yr/Kv8p/yn/Kv8q/yr/Kv8q/yr/Kf8q/yr/Kv8q/yr/Kv8q/yr/Kv8q/yr/K/8r/yn/Kf8q/yr/Kv8p/yn/Kf8q/yr/Kf8p/yn/Kf8o/yj/KP8o/yj/KP8o/yj/KP8o/yj/KP8o/yj/J/8n/yf/J/8m/yb/J/8n/yb/Jv8m/yb/Jv8m/yb/Jf8l/yX/Jf8l/yX/Jf8k/yT/JP8k/yX/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8k/yT/JP8m/yb/Jv8m/yf/J/8n/yf/J/8n/yj/KP8p/yn/Kf8p/yn/K/8s/yz/LP8s/yz/LP8t/y7/Lv8u/y//L/8v/y//MP8w/zH/MP8x/zL/Mv8y/zP/M/81/zX/Nf81/zX/NP80/zT/NP80/zP/M/8z/zP/M/8z/zH/MP8v/y//L/8v/y7/Lv8t/y3/Lf8t/yz/LP8r/yv/K/8r/yn/Kf8q/yr/Kv8q/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kv8p/yn/Jv8n/yf/J/8n/yf/J/8n/yj/Kf8r/zz/c/+D/4v/iv+G/4v/gv96/37/jv+W/4//jP+Q/4v/ev+C/4n/hv9//37/bv92/4b/hP+D/4j/kP99/3H/cf9x/3H/b/9j/1n/Uf9P/03/SP9G/0D/Qf9K/0X/Q/8+/zD/J/8o/yn/Kv8p/yj/J/8r/yr/Kv8r/yz/Kv8p/yr/Kf8r/yv/Lf8u/zH/N/86/0D/S/9r/5z/mf+R/5D/kf+W/5j/l/+H/5L/jv+D/4L/hP+H/4j/df9y/3T/bf9b/0n/Q/9D/0P/Sv9X/2X/b/9r/2D/Vf9Q/1D/Sf9B/0H/QP86/zX/L/8y/0P/W/9x/4P/ef9O/2P/h/+P/4L/ev96/2X/R/89/0X/Pv9O/1b/UP9d/3n/iv+W/6X/sf+z/7X/s/+w/63/q/+k/5v/lP+q/63/pv+h/6L/lv+H/3//dP9u/2r/ZP9h/1z/Yv9w/2f/XP9R/0j/Rf9E/0T/RP9E/0T/UP98/5L/kP+D/3v/ev+B/37/d/91/2n/X/9c/1n/Xf9c/1//UP80/zj/O/8+/0H/Qv9X/2//gv+F/4r/kf+Q/4z/gf95/3f/df9w/2P/Y/9h/13/XP9b/17/Yf9m/23/cP9m/0L/Qf89/0D/Qv9D/zv/TP9B/0n/R/8//1L/Z/92/4D/cP9l/4r/k/+N/4T/UP9Q/1f/S/9K/1b/T/9L/1f/cf9y/3L/dP9x/27/af9l/2H/Xv9c/1v/W/9Z/1n/W/9c/1z/XP9c/1z/WP9W/1r/W/9Y/1X/Vf9T/1H/UP9Q/1L/Uv9V/1j/XP9f/2P/af9u/3P/d/98/4D/gv+C/3//fP95/3b/d/94/3v/fP99/4D/hP+H/4v/i/+K/4n/if+I/4f/h/+G/4b/hv+G/4b/hf+G/4b/h/+I/4j/iP+G/4b/g/+D/4P/f/96/3f/c/9z/3H/cf9v/27/a/9m/2L/Wv9T/07/UP9V/13/Zf9x/3z/gv+H/4n/jP+O/43/if+I/4j/h/+G/4b/hv+G/4X/hf+F/4X/g/9+/3f/bf9k/2P/Z/9p/3L/d/9y/3z/kv+R/43/if+K/4r/iv+H/4f/hP+H/4X/cv9o/2n/Zv9i/2L/av94/4X/jf+Q/5D/j/+O/47/jv+O/47/jf+N/47/kP+R/5D/jP+R/5j/lf8pfSl4Kn0qeCp9KngofSp4Kn0qdyp9KHcpfSl6K30reip8KnopfCl6Kn0qeip9KnsqfSp8K30rfCp9KnsqfSp8Kn4qfCl+KXwpfil9KH4ofSh+KH0ofih9KH4ofSh+KH0ofih+KH4ofih+KH4ofih+KH4ofid+J34ofih9J34nfSZ+JnwmfiZ8Jn4mfCV+JXwmfiZ7J34leiV+JXklfiV5JH4keSR+JHkkfiR5JH4keSR+JHkkfiR5JH4leiV+JXomfiV7JX4meyZ+JnwmfiZ9Jn4mfSd+J38nfid+J34ngCd+J4ApfimAKH4qgCx+LIArfSuALH0sfy18Ln4ufC5+L3wvfTB8MHwxfDF9MX0wfDF9Mn0yfTJ7Mn0yejR9NHo1fTV7NX01ezR9NHwzfTN9Mn0yfTN9M30yfDJ+MHwugC98LoAufC2ALXwtgi18LYIsfCuCK3wrgip8KoMpfCmDKX0pgyl9KYMpfSmDKH0ngyh9KIEofSiBKX0pgSl9KYEpfimCJ34ngid+J4InfieCJ38ngCZ/KIApfiyBMn1rhYt1jZOKa4yYimiDl3pohJeMaY2WjmqQlJVnipZ9aX2VhnCCk3N1Z49keX6MiXyGiYeBioWOf3GFXn5fiF5+YIxnfWSLUX5Rh1N9VYhNfEyITnxOiUp7RopFez+KMXsniid7KYspfCmLKX0piSh9K4ooeymMLHsqjSt7Ko4reiyPLXoskSx7MJI0fDeUVXx6lJF6nY+VeJKOlHKVj5dwlpGbbnqQim+Wj4hyhI6Gc4aNiXiDh3x+f357gnZ4cYFzdnOBdXd9gYh4j4GLfYJ9aoZZd1uPWnJVlk5zR5ZGdEeSQXY3kDJ3P5FOdGqReHBsllxphJqVZZeaiWOEl4tmkZN0akyUQGs+l0prVZlMaFKZbWSMnZ5oqJCxarOJsGysjKhoo5KjXKSTolKfkqNLnJqVSJKekUiPn4xQgJ5zWm2fa2VonW1mbZ1qYnObamFjmlpnU5hLb0iXSHBJlkNvQpdOa32alGeYm45jgpuBYICafWB3mnJjaZppZ2+YdG16knp2do1lez2KNnw4ijp7PolCe06IYX16h4F/hoSLgYSDeoF4gnuEe396hXN7ZoZkdGqIZ2tgiVxhX4lmVmeJak9uiVpcW4pbdliIOYA2gzp/PoBNe0uAQ3ZGgERwT4BgcHl+fHVbfXJ3jH6SdI2BhHhUg0d+UoJLgzZ+R4JNfWV+bH1wfnJ9dH9zfnGAb4Frf2WAX4Bdf1uAW35agVp+WoBcflyAW35cgF1+W35aflx+Wn9XfFeAVXlTgVF3UIFQdk6BUnZSgFV6WX5dfl98Y4Jqd26HcnN2jHxvgI+CboKQgG9+kHpweI54cHmNe3F8jX5zgYyEc4iMi3OLjIl0iIqIdYeLh3WHi4Z1houFc4WLhXOFi4ZzhoyGdIeIiHeIf4d9hneFf4N2gIF+e3l+doRyeHGKcXRxjW90bo5sdmeLY3lciVJ7UIZUe1mHX3Zoi3JvfI6DcIeNinKNio11jYiKd4mIiHeHiId2h4eHdoeJhnaGiYV2hYmEeX6Jd3tth2Z7ZYhnd22LdXN2iXt3kH2RfoxwiYKJcoqCinWIgYd2hoGIeISBb35pf2mGaXpkimJ1ZYxvcnqMiHKPiJF3koSOe4yDjXuNg4x6jISMeY2EjXqPg5B7kH+OfJZyloCVaSn/Kf8p/yn/Kf8p/yj/Kv8q/yr/Kv8r/yv/K/8r/yv/Kv8q/yn/Kf8q/yr/Kv8q/yr/Kv8q/yr/Kf8p/yr/Kv8p/yn/Kf8p/yn/Kf8p/yj/KP8o/yj/KP8o/yj/KP8o/yj/KP8o/yj/KP8o/yj/KP8o/yj/J/8n/yf/J/8n/yf/Jv8m/yb/Jv8m/yb/Jf8l/yb/Jv8l/yX/Jf8l/yX/Jf8k/yT/JP8k/yT/JP8k/yT/JP8k/yT/JP8k/yX/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jv8m/yb/J/8n/yf/J/8n/yf/J/8n/yn/Kf8o/yr/LP8s/yv/K/8s/yz/Lf8u/y7/Lv8v/y//MP8w/y//L/8x/zD/Mf8y/zL/Mv8y/zL/NP80/zT/NP80/zT/NP80/zL/Mv8y/zL/M/8z/zP/Mf8w/y//L/8u/y3/Lf8t/y3/Lf8t/yv/K/8r/yv/Kv8q/yn/Kf8o/yj/KP8o/yj/KP8n/yf/Jv8m/yb/Jv8n/yf/KP8o/yf/J/8n/yf/J/8n/yf/J/8n/yf/Jv8o/yn/L/8z/07/if+Q/4z/iP+F/4D/fP+C/4b/i/+S/4z/i/+I/3f/af9u/27/Zv90/4L/jf+L/4f/iv+L/4r/Yf9P/0//UP9U/1b/X/9d/0//Tf9P/07/S/9K/0v/SP9H/0X/P/8x/yf/J/8p/yn/Kv8j/yr/K/8q/yr/J/8m/yj/K/8r/yv/Kv8r/yz/K/8r/y7/Qf9u/5L/mv+a/5T/kv+T/5X/l/+W/5X/ev9//5X/jv+I/4P/hv+I/4n/h/+G/5D/kv+U/5b/lf+S/5T/l/+X/5L/if91/1L/UP9S/1j/Uv9N/0f/Rf9K/0P/Nv80/0r/bf+I/3f/e/+U/5n/m/+R/5L/n/+j/5//hf9o/2n/Wv9P/0D/Tf9m/5D/q/+w/7D/sv+t/6X/oP+g/53/of+s/6T/jv+P/6D/o/+k/6T/ov+e/5P/af9b/2T/b/+A/3b/cf9u/2b/X/9T/0r/SP9L/0v/R/9C/0D/Xf+M/5j/jv+B/4L/gP94/3X/eP94/3H/dv+A/4n/hP9//3P/UP80/zb/O/8//z//RP9T/2n/ef9//33/cf9s/3H/df9z/3H/bf9n/2P/Z/9m/1//W/9f/2P/Yv9n/2L/XP9g/3P/Zf9C/zf/O/89/z7/Rv9K/1H/R/87/07/eP97/2T/e/+L/43/iv+C/1z/Sf9P/z7/K/9A/1T/Xf9k/3H/cf9y/3P/c/9v/2z/Zv9h/13/XP9c/1v/W/9b/1v/Wv9b/1v/XP9c/1z/XP9a/1j/Vf9V/1H/UP9Q/1D/T/9Q/1L/Vf9Z/13/X/9j/2j/bP9y/3b/ef9+/4H/gv+A/37/fP95/3n/e/97/3z/fv+B/4b/if+L/4v/iP+I/4f/h/+H/4f/hv+G/4X/hf+F/4X/hv+G/4b/h/+I/4j/h/+G/4X/g/+A/37/ev92/3P/cf9x/3H/b/9u/2z/Z/9i/1v/Uv9Q/1T/Wf9g/2n/c/9+/4P/h/+L/47/jf+N/4n/iP+H/4b/hv+G/4b/hv+G/4b/hf+F/4P/ff93/23/Zv9n/2r/cf91/3v/jf+R/43/iv+L/4r/i/+K/4f/hv+G/4f/dP9q/27/bP9p/2X/Y/9n/3H/fv+J/4//kv+R/5D/jv+O/47/jf+N/43/jv+O/5D/kf+N/5L/l/+U/5T/Kn0qeCl9KXgpfSl4Kn0reCt9KnkqfSp5K30reit9K3oqfCp6KXwpeyp9KnoqfSp8Kn0qfCl9KXwpfSl7KX0pfCl+KXwpfil8KX4pfSh+KH0nfid9KH4ofSh+KH8ofih/KH4ofih+KH4ofih+KH4ofih+KH4nfid+Jn4mfSZ+Jn0mfiZ8Jn4mfCZ+JnwmfiV8JX4leyV+JXolfiV5JX4leSR+JHgkfiR4JH4keSR+JHkjfiR5JH4keSR+JXolfiV6JX4leyV+JXslfiV8Jn4mfSV+JX0nfid/J34nfid+J4AnfieAKH4ogCl+KYAqfiqAKX0rfyx9LX8sfC1/LXwufjB8MH0wfDB8MXwxfTF9MHwxfTJ9Mn0yezJ9MnszfTN7M30zezN9M3szfTN8Mn0yfDF9MX0yfTN9Mnwyfi98L4AvfC6BLXwtgS18LYItfCyCK3wrgip8KoIqfCqBKXwpgSh9KIEnfSeBJ30mgSd9J4EnfieBJ34ngSd+J4EmfiaBJ34ngiZ+JoInfieCJ34ngid/J4Imfyh+LIMxejuDRXhrfIaDjXCHkoVqhJeDaoaYg2uFl4triJaCb4OVhHGClId1hJJxeXaOjX2Ni4l/jIeOfo6Ggn1biU58TIxUfFiQVH1HkVeAYopbgE+HTn9Oh0t8SodLe0aIQ3s9iS97JYknfSiKKn8sikl/bYg4fiOJKHwsiix8KYspeyuNLHssji57L44ueS+PMnpUj4B6mJGgd5iOknSSjJVwmo+WbpaRj21+kXtukZGVcYmPhHGEjoh0i4yIenqGjX+SfpSBmHmZgZd4loCXeJd/l3mWfoWBYHhWjlhyWJdacVyXVXFKlUZ0R5RCdjqSPnNhk41viZWTaJWYl2OWmppkpJalZ6SRoGiTk4Znk5WaXoaZX19Amk9jjJumaq6PsGyvia1topGcaJ6XnWGgl6JXj5yKUaSapU6mlKVNoJSfT52ZlFlbnjxmSp5gYXqeh1d+oHNXbJ5lYFqaSmlGmUhtTJhLbkeXQWtEmm9mk5uQYnWcel+Fm4RdhZuDX3+bfWJ+moFtiJOGdYKQd3xhizV9NYo6ezyIPXtAiEh9VYZmgGyDa4FjgWeDaX9mhWB7YIZgd1uGWXJchl1tW4daZ1uIX2FgiF9gSopRa1yJZ3tgikmAOoZDfD+DN3tBgUN3RoFScEeCSGllgXhyf4CEeYh/i3eFgH14UoNKfVSCPYQtf0eFQXwwgTV8ZYB1fXOAc35xgG6AaoFmf2GDXn5dg1t+WoFaflqBW35bgFp+W39cflt/W35cflt+WntWf1N5UoFNd02BTnZOgU92UoBVelp+XX5gfGOCZXhqiHFzdY16cH6QgW2Ck4BsfpF8bXqPenB8jXtxfY1+c4GMhnOJjIpzi4yIdIiKh3WHi4Z1houFdYWLhXOFi4VzhYuGc4aMhnSHiIh3iH+IfYZ2hH+CdYCBfXx5fnWFc3dzi3FzcI9wdG6ObHZni2B5WIlUe1CGV3pciGN0bIx1b36OhHCIjYxzjoqNdoyIineJiId3hoiGdoaHhnaGiYd2h4mGdoSJg3l8h3d7bYVne2eHbnd0h3p1in+TfI5wi4KJcYuDjHWKgod2hIKGd4aBdn5sfmyFbXtsiml3Zo1mdWqOdXKAjItykIiQd4+EjnuOhI17jYSMeoyEjXmOhI56j4KQe5B5ln6WbpSCkmoq/yr/Kv8q/yr/Kv8q/yr/K/8q/yr/Kv8q/yr/K/8r/yr/Kv8p/yn/K/8r/yr/Kv8q/yr/Kf8p/yn/Kf8p/yn/Kf8o/yj/KP8o/yj/KP8o/yf/J/8o/yj/KP8o/yj/KP8o/yj/KP8o/yj/KP8o/yj/KP8o/yf/J/8m/yb/Jv8m/yb/Jv8m/yb/Jv8m/yb/Jf8l/yX/Jf8l/yX/Jf8l/yX/JP8k/yT/JP8k/yT/JP8k/yP/JP8k/yT/JP8l/yX/Jf8k/yT/Jf8l/yX/Jf8m/yX/Jf8l/yb/Jv8m/yb/Jv8m/yf/J/8o/yj/KP8p/yn/Kf8p/yv/LP8t/yz/Lf8t/y7/L/8v/y//L/8x/zH/Mf8w/zH/Mv8y/zL/Mv8y/zP/M/8y/zL/M/8z/zL/Mv8x/zH/Mf8x/zH/Mf8w/y//L/8v/y//Lf8t/y3/Lf8t/y3/LP8r/yv/Kv8q/yn/Kf8p/yn/J/8n/yb/Jv8m/yb/J/8n/yb/Jv8m/yb/Jv8m/yb/Jv8n/yf/Jf8l/yf/J/8m/yb/J/8n/yf/Kf8x/zj/Rf9Z/3L/df99/4X/gv+C/4j/g/9+/3v/ev+A/3z/hv+Y/6H/n/+f/5L/k/+U/4z/jP+N/4//if9w/1f/T/9R/13/Y/9a/1j/Vf9p/2n/X/9M/0b/TP9L/0r/R/9D/zr/Lf8k/yb/J/8p/yn/Of89/yj/Jv8n/yj/KP8p/yj/Kv8v/zD/Lf8w/y//Lf89/2H/fv+b/5//lP+S/5T/l/+X/5T/lP+I/3z/ff+D/5b/jf+D/4P/hP+I/4z/gv+B/43/kf+V/5n/lv+Y/5n/mf+Z/53/kv9y/1f/W/9a/13/X/9g/1n/Tf9E/0T/Qf9A/27/j/+S/5L/kP+X/5b/mP+k/6r/pv+a/4H/c/+F/5r/oP+l/4z/YP9s/5v/qv+s/6z/qf+f/5n/mf+Z/5z/lP9//5v/n/+W/5f/mv+a/5j/lP+N/1n/PP9B/0r/cv+V/5D/ff9w/2n/Yv9U/0r/SP9G/0T/Rf9I/0H/UP99/5D/hf+A/4f/i/+M/4z/iP+B/4D/gf+D/37/e/90/2f/Pv8y/zX/N/88/zz/Qf9G/1L/XP9d/1v/Xv9g/1z/Vv9Z/1n/VP9P/1P/VP9X/1j/Wv9d/1f/Rf9C/0z/Vf9f/2z/Yf85/zv/Nv8z/zH/Pf9Z/1v/Zf9X/1b/cP+A/4b/h/+G/4P/hf9j/0n/Sv9F/zj/Pf9A/zT/Pf9m/3T/dP90/3L/bv9p/2b/Yf9e/13/W/9a/1r/W/9b/1n/W/9b/1z/Xf9b/1v/Wv9Z/1X/U/9Q/0//T/9M/0//Uf9S/1X/Wv9e/2H/ZP9n/2r/cP90/3j/ff+B/4P/gv+A/3z/e/98/3z/fP99/4D/g/+G/4n/if+J/4j/iP+H/4f/hv+G/4X/hf+F/4X/hf+F/4b/hv+G/4f/hv+G/4f/hf+E/4L/f/98/3j/dP9z/3P/cf9w/3D/bv9p/2b/YP9Y/1L/Uf9X/1z/ZP9u/3b/f/+E/4j/jP+O/43/jP+K/4n/h/+G/4b/hv+G/4b/h/+H/4b/hP+D/3z/d/9t/2n/af9t/3X/jP+W/4//i/+L/4n/iv+L/4j/hf+F/4f/fP9s/23/b/9u/23/a/9o/2j/bv93/4P/jP+P/5D/j/+O/47/jv+O/43/jf+N/47/jv+O/5D/k/+X/5T/lP+S/yp8KngqfCp4KnwqeCp8KngqfCp5K3wreit8K3oqfCp6Knwqeyp8KnspfCl7Knwqeyp9KXwqfSp8KX0pfCl9KXwpfil8KH4ofCd+J34nfid+J34nfid+KH4ofih+KH4ofih+KH4nfid+KH4ofSd+J30nfiZ9Jn4mfCZ+JnslfiV8JH4kfSV+JX0lfiV9JX4lfSV+JnwlfiV8JX4leyV+JXwlfiV8JH4kfCR+JHwjfiN6JH4keiR+JHokfiR7JH4keyV+JXslfiV7Jn4mfiZ+Jn4kfiR9JX4lfSZ+Jn4mfid+J34ngCd+J4AofiiAKX4pgCl9K38rfSt/LH0sfi19Ln4ufC57LnwwezF8MX0xfDF9MXwxfDF8M3wyfDJ7MXwxezJ8M3wyfDF8MnwyfTN8M30wfTB+MH0wfzB9MIAufS6BLX0tgi19LYIseyyCLHsrgip9K4IqfSqBKX0pgSl9KIEnfieBJn4lgCZ9JoAmfSaAJn4mgSV+JYEmfiaBJX4lgSV9JYImfSaCJ34ngih+JoEnfyl+KoIrdzeHRm9bh3Vte4F0fGR2bYtxcHSUeG51lWxtbJRrb2yUc3aAlZx4opSkeqGSlHyVjY5+iouMfZCKjXt6jV58V49ZfV2QYX5ikGF+Xo5mgWeNbINwiV+EW4VTgk2ESH9IhEJ9N4cqeyeIJ3sniSh8KIkmfSeIJ30niSd9J4omfSeKKHwoiyp7K40tey+OLHo1kEx5ZI94dpGQnHSXjpNylI6YcZWQlG2RkoNqfpJ8a32RjW+TkIpxhpCCcYWPiXWQjH97fIaDf4iDjoGSgZV/l4CYfJeAl3qKhnJ1ZJBhcWOYXG5bmF9vXZhWckqXQnJAlz9xXpWSb5aUkWiNlZJlkpeNZZmXnWiSlYFsaJdbaHGZl12hl6ZVqJGZWH2bkGOel6VrqZKkaZmYlmeVnZRfl56OV46gm1SVnJRWlJ+TWZWfll6TnYViV51BaUOaSmBhnpxXl5iJUHugcVlqnGJlUZhHa0KYQWpGmUhnRJ1AYWGfgV+Un5BeiJ2QXJOekGCMnIVkgJeDbYCTeHZ0j298aIpIfy+IL3wyiTh7O4g+fECHQ39KhFKBVIJXgVh/V4RVelSFU3VQhk5yUYVTcVSFV3JZhlBvOocrbzyISHJOiU93U4pNeUCJR3U/hzl1NIRAdVeDSm9RhE9nToRbanCCe3OEgIt4iYCEeWWDS3xDg0WCQH8zgjh9RX9efXB/dH10f3N+cYFufmmBZX9ggl1+XIJbfluCXH5cglt+WoJafluCWn5aflt+Wn5af1d/U4BQe06BTXlOgU55T4JQeVOAVn1afV6BYHtjhWh3aolvc3KMd298kIBsgZKDbIOSgG1+kHxwe458cn6NgHKCjYVyiI2Hc4aLiHOHi4Z0hoyGdIWMhHOEjYRzhY2FcoWMh3KHi4d2h4aHeYZ9h36FdoSAgnaAf3x+eHx1hnN2co1xc3COb3NtjWp1ZYxfeliJU3tShlZ4Xollc26NeG+CjoVwiIyLco2KjXWLiIp3iYiGdoWIhnWGiYZ1homHdYeKhnaFiYJ4fIh2e26Ha3lrh293hYCUe5FzjIGLbouEiXKKhIl2hYKGeYqBgX5uf22Ibnpvi212b4xudmmNbHJxkXlvhIuOdJCIjnmOhYx6jISNeo2Gi3qLhot6joWPepB9kX2WcJWAlGmRhI5rKv8q/yr/Kv8q/yr/Kv8q/yr/Kv8r/yv/K/8r/yr/Kv8q/yr/Kv8q/yn/Kf8q/yr/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8o/yj/J/8n/yf/J/8n/yf/J/8o/yj/KP8o/yj/KP8o/yf/J/8n/yj/J/8n/yb/Jv8m/yb/Jv8m/yX/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8m/yX/Jf8l/yX/Jf8l/yX/Jf8k/yT/JP8k/yP/I/8k/yT/JP8k/yT/JP8k/yT/Jf8l/yX/Jf8l/yX/Jf8l/yT/JP8k/yX/Jv8m/yb/J/8n/yf/J/8n/yj/KP8p/yn/Kf8r/yv/K/8s/yz/Lf8u/y7/Lv8u/zD/Mf8x/zH/Mf8x/zH/Mf8z/zL/Mv8z/zP/Mv8x/zH/Mf8w/zD/MP8w/y//L/8v/y//L/8v/y3/Lf8t/y3/LP8s/yz/LP8r/yr/Kf8q/yr/Kf8p/yn/KP8o/yb/Jv8l/yX/Jv8m/yb/Jf8l/yX/JP8k/yX/Jf8k/yT/Jv8m/yX/Jv8m/yX/Jv8o/yr/Kv8t/zX/Rf9Z/27/cf9h/2D/W/9Y/17/Y/9k/1z/U/9Y/1v/XP9d/3P/j/+h/5j/lP+U/5D/if+M/4//jv+A/2D/Vf9X/2X/af9p/2T/Zv9k/2f/aP9y/3r/cf9t/2j/Zf9d/0v/Qf8w/yb/Jv8n/yf/J/8n/yb/J/8n/yf/J/8n/yb/J/8o/yj/Kv8r/yv/LP8v/zr/Vv9o/3T/kP+W/5D/k/+X/5j/lP+S/47/fv95/3n/ef+F/5X/jf+G/4T/gf+D/4j/jv+F/4n/jf+Q/5L/lf+X/5b/jP+I/3X/av9n/2b/Zv9k/2D/Xv9c/1r/Uf9G/z3/O/9b/4//lv+R/4r/jv+M/4j/if+C/3D/Zv9h/1z/Zf+N/6P/n/+c/5j/jv+N/5X/n/+i/53/lv+W/5L/kf+J/4f/l/+S/5P/k/+S/5H/kf+Q/5H/iP97/2f/Tf9O/2b/pv+j/5X/i/96/2//Zf9V/0j/RP9V/3T/if+A/2j/av95/47/l/+S/5L/lP+Q/4n/gv9//4D/ef9y/2v/af9m/1H/L/8s/y7/L/81/zj/O/89/0L/Sf9N/1D/Uf9R/1D/UP9R/0//Tv9Q/1L/U/9R/0P/MP8w/z7/P/84/zv/Pv86/z//Q/9D/z3/Pv89/0H/Sv9H/0n/WP9b/0r/Xv9r/4H/iv+G/4P/df9Y/0b/Sf9S/0T/PP9O/1n/bP90/3T/c/9x/27/af9k/1//Xf9c/1v/W/9b/1v/W/9a/1r/W/9c/1z/Wv9Y/1n/Vf9S/0//Tv9N/07/Tv9O/0//U/9W/1n/XP9g/2P/Zv9o/23/cv92/3v/f/+A/4H/gf+A/33/ff9+/37/f/+B/4P/hf+I/4f/h/+H/4f/hf+F/4X/hf+E/4P/hP+E/4X/hf+H/4f/h/+H/4f/hv+H/4X/hP+C/4D/ff95/3L/cv9x/3H/cP9v/23/af9k/17/WP9V/1X/WP9e/2f/cP94/4L/hf+I/4v/jf+M/4r/iv+J/4f/hv+G/4b/hv+G/4f/h/+G/4X/gP96/3P/bv9t/2z/gP+T/5H/i/+K/4n/if+K/4n/h/+F/4j/h/9x/27/cf9w/2//cP9v/23/av9s/3T/e/+I/47/j/+P/47/jP+M/4v/i/+K/4r/jf+P/5D/kv+W/5X/lP+T/4//jv8rfCt4K3wreCt8K3gqfCp4KnwqeSt8K3orfCt6Knwqeip8KnsqfCp7KXwpeyl8KXspfSl8KH0ofCh9KXwofSh8KH4ofCh+J3wmfiZ7J34neyd+J34nfih+KH4ofih+KH4ofih+J34nfid+J38ofih/Jn4mfiV+JXwlfiV9JX4lfiV+JX4lfiV+JX4lfiV+JX0lfiV8JX4lfCV+JXskfiR8JH4kfSR+JH0kfiR8I34jeiR+JHokfiR6JH4keyR+JHskfiR7JH4keyR+JHwkfiR8JH4kfCR+JXwmfiZ8Jn4nfCd+J34nfid+KH4ofih+KH4pfSt/K30rfyx9LH4tfS5+Lnwufi18L34xfDF9MXwxfTB8MHwwfDJ8MXwxfTJ8Mn0xfDB8L3wxfDB8L30wfC59Ln0ufi99L38ufC2ALXwtgSx9LIIsfSuCK34rgit+KYIpfSmBKX0pgSh9KIEnfSaBJX4lgCV+JYEkfiSAJH4kgCR+JIEkfiSBJH4kgSR+JIElfSWBJn0mgSV+J4AmfyZ/KoIueDSGQm5aiXJkeoNqZ2J9XnlWeFeHWXZcjVl2T45DdEuQUXVUkVp4bZOHe5eVhn2HlZJ+jY6Mf5CJkX2BjGd8VZJSfVuTaX5ikWSAao9of2OPZIFqjnSEcIt1h22GcIdsf3eFeHpngUR+JX0nfyZ9KoUnfSiHJ30miCd9J4kofSeKJn0piih8KYkoeyqMK3oujzd5RY9WeGaPdHaUjpJzkY2UcZaPlG6QkI9ti5KAbH+SfGt/kYRtlJKQb4eRgnCCkYBxhpCLdIuPg3eQjZV3ko2TeJONk3aHkIR1g5GCcYOTfnB4lnhudphwbmKZXXBamFFwSJg/cT+WfW+blZBnipWKYoiXhGV8mW1tXJhfcGCXX21jmXhglZyZVqKZpleekohZepuTYZqbl2OSnpNkj56HXnOhhlmNoIhakaKVYJOfjmCLoYpfip+IYICdfGRgnVReeaGqWqOQnVCVnIdTdp9rYF2bTGhEmktjXZt4VYuhklORn35Wj6CbXZ2ZmF2QnI1giZyCZHyYeG50k250Zo9heV6KVn40hy1+LogpfCqILnszhzh9PIZCfkaESn9NgU2BTX5Ogk17ToNPekuCSHs/gzN6LIMveDeFQnFGiDdsP4lGbEaKQG1LiU9rTIlJbj6GQnNNhEl0QIRMbVKEVGhfg2JrdICGcIWAgXd4gkt/QYNKhVqAYYVQfVqCb31wgHF9c4BzfnGBbn5qgWV/X4JdfluCWn1aglp9WoJafVqCWn1aglp+WoBaflh+V39Ue1CATnlNgUx6TIFNek2BTntSf1V/WH1cgmF7Y4Vkd2eJanNxjHVvepB+bIKSg2uDkoBsfZB/b3+Pf3F+jYJyhI2IcoiNh3OHi4dzhouFdISMhXSFjINzg42Dc4SNhXKFjIZyhouHdoeFiHqHfYh/hXeDgYF5foB7gHZ7c4hxdnGNcHNwjm5zbI1odWSMXXlYiVN6VohcdmCKaHFyjXlugo6Gb4mMi3KMiot1iYiKdomJh3aGiYZ1homGdIaJhnWGioV2hYmAeHmIcnpuhmt3d4CMe5B4jICMcIqBinKKgop0iIKHdouBiX11gGyHbnttjG54cIxweHCLbXpvinR4fIiBeIqDjnyNgI1/joCNf4yAi3+Nf41/jX2Pf5B6kn6Uc5eBlGiTg5Jnj4SNaiv/K/8r/yv/K/8r/yr/Kv8q/yr/K/8r/yv/K/8q/yr/Kv8q/yr/Kv8p/yn/Kf8p/yn/KP8o/yj/KP8o/yj/KP8o/yj/KP8n/yb/Jv8n/yf/J/8n/yf/KP8o/yj/KP8o/yj/KP8n/yf/J/8n/yf/J/8m/yb/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8l/yT/JP8k/yT/JP8k/yT/JP8j/yP/JP8k/yT/JP8k/yT/JP8k/yT/JP8k/yT/JP8k/yT/JP8k/yT/JP8l/yb/Jv8m/yf/Jf8l/yf/J/8n/yj/KP8o/yn/K/8r/yv/LP8s/y3/Lv8u/y7/L/8w/zH/Mf8x/zH/MP8w/zD/Mv8x/zH/Mf8x/zH/MP8y/zH/L/8v/y7/Lf8t/y3/Lv8u/y3/LP8s/yz/LP8r/yv/K/8r/yr/Kv8p/yj/KP8p/yj/KP8o/yb/Jv8l/yX/Jf8l/yX/Jf8j/yP/I/8j/yP/I/8j/yP/I/8j/yX/Jf8l/yX/Jf8m/yf/J/8s/zH/QP9W/3X/fP91/2b/Xv9X/1n/Zv9k/1f/Uf9M/0X/Sf9W/1X/XP9k/3j/e/98/4r/jf+K/47/jv+G/2z/Wv9d/2D/a/9n/2n/a/9u/2z/Yv9o/2//cP9r/2//cP9z/2j/bf9y/4H/fP9k/zz/H/8p/yz/LP8p/yj/Kf8p/yj/J/8n/yf/J/8o/yj/Kv8q/y3/O/9O/1r/Yv94/5P/jP+O/5X/kf+Q/47/j/+J/3z/hf+G/4X/hv+P/5T/i/+E/4L/gP9//4X/jP+E/3z/i/+R/4//kv+R/5T/mv+h/53/l/+c/5//mP+P/37/aP9d/1z/Wf9Q/0j/Pf91/5z/lf+N/4r/iP9//27/Wv9g/3D/cP9r/27/cP+C/5D/lf+d/6b/of+N/4j/j/+O/43/jv+N/37/c/9//4L/if+P/4//hP9//4L/hv+I/4T/fv9+/3D/aP+D/6X/nP+Z/5X/if95/2//Y/9S/0T/Q/9I/27/j/+Q/47/ef+P/5r/nf+b/5H/jP+J/4H/ef9z/2v/Zv9e/1v/Wv9W/0D/LP8r/yj/J/8p/yn/K/8v/zT/N/85/zz/P/8//z//P/88/zj/Mf8s/yr/K/8u/zP/Nf9F/1X/Pv82/zv/P/9F/0n/S/8//0L/Uf9O/0r/PP9M/0z/Tv9V/1b/X/9o/3n/gv+E/3L/PP89/0X/Uv9i/1v/YP9v/3D/cf9z/3P/cf9u/2r/Zf9f/1z/W/9a/1r/Wv9a/1r/Wv9a/1r/W/9c/1n/V/9V/1L/T/9O/0r/Sf9J/0v/TP9O/1L/Vf9Z/13/YP9i/2T/Z/9p/3D/dP95/33/gf+D/4P/gf+A/4D/gP+A/4H/g/+E/4j/iv+I/4f/h/+G/4T/hP+E/4P/g/+D/4P/hP+F/4X/hv+G/4f/h/+I/4j/h/+F/4P/gf9+/3r/dv9y/3H/cf9w/3D/bv9s/2j/ZP9c/1j/Vf9X/1r/Yf9q/3L/ef+C/4b/if+L/4z/jP+K/4n/h/+H/4b/hv+G/4b/hv+G/4b/hv+D/37/d/9x/2v/cf+J/4z/jP+K/4n/iv+J/4j/h/+G/4j/iv97/23/cf9x/3L/cv90/3b/dv93/3j/ff+E/4r/i/+N/43/jP+L/4v/jP+N/47/kP+Q/5L/kv+T/5b/lP+T/5H/kf+Q/47/K3wreSt8K3krfCt4K3wreSt8K3krfCt6Knwqeip8KnoqfSp7Kn0qeyp9KnspfSl7KH0ofCh9KHwofih8KX4pfCh+KH0pfil9J34nfSh+J30nfid+J34nfih+KH4ofih+KH4ofyd+J38nfid+J34nfiZ+Jn0lfiV9JH4kfiR+JH4mfiZ+JX4lfiV+JX4lfiV+JH4kfCR+JHwkfiR7JH4keyR+JH0kfiR9JH4keyN+I3skfiR6JH4keiN+I3wkfiR8JH4kfSR+JH0lfiV9JH4kfSR+JH0kfiV9JX4mfSZ+Jn0mfiZ8J34nfSd+KH0pfil8Kn0rfCt9K30rfSt+LX0ufi57Ln0wezB9MHwwfTF8MX0wfDF8MXwxfDB9MHwxfTF8MXwxfDB8LnwtfC19LXwtfS18LH8tfC5/LXwsgSt8K4ErfSuBKn0qgSl9K4ErfSmBKH0ogCd9J4AmfSaBJ30mgCV+JH8jfiN/JH4kgCR+JIAjfiOAI34jgCN+I4AkfiSAJX0lgCV8JX8mfCZ+KIArfDGGPXFViHJkeoZ2X3OBZ2ZVf1F3XYBxfXR+Y3tdfl18UXpJgkp6W4liemOPc3xwkoN+ipGGfoeNjH2IjHF7U5JQfFeUbH51k21/cJFtgHCPboFtjm2Cc41tg2+MaoZyiHSKbYNminN/cod+fIuEgXlggDeAJX0ohCt9KogrfCuJKn4oijF9OYotfCmJKHwoiil6Los7eU2NWnhjjYV2j4yIc4yOj3CMkIluhpGLbomRiG+HkY1ui5GIa42SlWyRk4hvgpJ9cn2RfXOEkolybJNIclibYnFmoXdwk5+ZcZyapXSmjqxyqoymbpmVimt3mmFtXppab1OYTHBJmmpvmJiYZ5CXjWOEmH1mcptba3Obj2mJmnxneZl6ZICaglmAnZFRoZmjVpeXiFyKoIhihqCHY4ageWFvn3BgfJ+HYoufhGN+oIRfkJ6ZXJ+UnViTl4JZdqB1VoKhm1KVnZJRjaKGVXqfcV5qnGBmUJpDY1ScfVOKoodKgKVzToWlkVmYnphckJyMYIabgGZ1l25uaJJhc1qPV3hRiU5+RocwfimGKH0ohSd9KIUnfCaGJ30phCp8KYMpfiiDKH8ngyZ/J4Epfyt/K4AufTGCNng4hD1uRYZKYk6IRGE+ijpmPYk8a0iHWG5VhkhxSYY6cjCETnBNg0VqQ4JSZmSDamp9gnt1ZIBOg0J/QohDfU2GVntggm59coFyf3OBcn9xgW1/aYJkfl6CXH1bglp8WoJafFqCWnxaglp8WoJZfVmBV35Vf1R/UX1PgE18SoFKe0mBS3xMf09+U35WgVl7W4RgeWOHZXZlimtzboxyb3mPfmqCk4RrhJKCbIGRgG+Aj4BwgY2EcYeNiXKKjIh0h4yHdIWMg3SDjINyg4yCc4GNg3OEjYVxho2HcoiJiHaIgoh6h3uHf4Z4g4GBen5/eYB1enKIcHNwjHBycI1vc2uNaHVkjF15V4lVeVqIXXViimtwdI58boKPhnCKjIxyjIuLdYmKiHWHioZ0hoqGdIWKhXOGioZ0homFdoKJfXh3iHF4b4KGeo12h36IcoiCiHSKgYl1iIKEdoWCiXmCgHGBcn52hXp8fIN8fH6CgICDfoSAhHuJgIx2joKOcYuDim6MhI1vjYONb4+DkG+Rg5Jtk4OTbJGElGaShJBlkYSQZpCEj2ws/yz/LP8s/yz/LP8s/yz/K/8r/yv/K/8q/yr/Kv8q/yr/Kv8q/yr/Kv8q/yn/Kf8o/yj/KP8o/yj/KP8o/yj/KP8o/yj/KP8n/yf/J/8o/yf/J/8n/yf/KP8o/yj/KP8o/yj/J/8n/yf/J/8n/yf/Jv8m/yX/Jf8k/yT/JP8k/yX/Jf8l/yX/Jf8l/yX/Jf8k/yT/JP8k/yT/JP8k/yT/JP8k/yT/JP8k/yT/I/8j/yT/JP8k/yT/Jf8l/yT/JP8l/yX/JP8k/yT/JP8k/yT/JP8k/yT/JP8l/yX/Jv8m/yb/Jv8n/yf/J/8o/yn/Kf8q/yv/K/8r/yv/K/8t/y7/Lv8u/y//L/8u/y//MP8w/y//MP8x/zH/Mf8x/zD/MP8w/zD/L/8u/y3/Lf8t/y3/Lf8s/yz/LP8s/yz/K/8r/yr/Kv8q/yr/Kv8p/yj/Kf8o/yj/J/8m/yb/Jv8m/yb/JP8k/yP/I/8j/yL/I/8j/yP/I/8i/yL/Iv8i/yP/I/8l/yT/JP8m/yf/J/8o/y3/Nv9O/2z/ev91/3H/eP9z/27/dv93/3f/df9p/2L/XP9H/y//QP9q/2//c/99/27/iP+N/4b/if+J/33/WP9H/07/Wf91/3H/c/9//3X/bf9r/3P/hf92/2f/Z/9t/3b/fv92/2b/bP95/3b/hf+N/4z/f/9h/zf/JP8o/yv/K/8r/yr/MP8+/zD/J/8p/yn/Kf8t/zv/Tv9a/2n/jP+J/4b/if+L/4f/hv+E/4b/iv+G/4P/h/+L/5H/j/+Y/5f/i/+B/3v/ev92/3r/f/+I/2D/Nf9P/1n/Zv9x/3j/kv+l/7D/sP+x/6n/of+Y/4b/bv9j/17/XP9Q/0n/Y/+T/5n/k/+V/4n/hP92/13/df+S/5T/jf+L/4z/iP+E/4j/lP+c/6D/lf96/3j/fv+C/33/eP90/3H/gf+S/5T/gv9t/3T/h/+Y/6L/qv+m/6H/lv+B/37/iP+P/5D/i/+D/3z/dv9x/2z/ZP9Y/0X/Z/+F/4n/iv+F/3z/f/+Q/5P/lP+N/4X/gP93/27/Z/9i/13/Vf9P/0n/Q/86/y7/KP8m/yf/Jv8m/yb/Jv8m/yf/KP8o/yj/KP8n/yn/Kv8q/yr/Kv8s/y7/Mf82/zr/Pf9D/0T/TP9I/0f/PP81/zn/Tv9H/zz/O/9A/0f/Ov8z/0H/Sf9I/1T/ZP93/4L/dv9l/1z/Vv9r/2j/Uf9W/13/Zv9x/3L/c/9y/3H/bf9p/2T/Xv9b/1r/Wv9a/1r/Wv9a/1r/Wv9a/1n/Wf9X/1X/Uv9P/07/S/9K/0r/Sv9L/0z/T/9T/1b/Wf9e/1//Yv9i/2T/aP9s/3H/eP99/4H/g/+D/4L/gf+A/4D/gv+D/4T/h/+K/4r/h/+G/4b/hf+F/4T/g/+C/4H/gf+C/4P/hf+G/4f/iP+I/4j/if+I/4f/hv+E/4H/ff95/3X/cv9w/3D/b/9v/23/av9m/2L/XP9X/1X/Wf9f/2b/bf91/3z/gv+I/4z/jP+L/4v/if+H/4f/hv+G/4b/hf+F/4b/hv+G/4T/gf97/3b/cP+C/5D/i/+H/4X/if+I/4j/iP+I/4f/if+K/3v/ef9//4P/hv+H/4n/iv+L/4z/jf+N/47/jv+O/43/jf+N/4z/jf+M/4z/jf+O/5D/kf+R/5H/kf+R/5D/kP+Q/4//kP+Q/yx8LHorfCt6K3wreSt8K3orfCt7K3wrfCp8KnwrfCt8Kn0qfSp9Kn0pfSl9KX0pfSd9J3wnfSd8J34nfCd+J3wnfid9J34nfSd+J30nfid9J34nfSd+J30ofih+KH4ofih+KH8pfil/KH4ofyd+J38mfiZ/Jn4mfyV+JH8lfiZ/JX4lfyV+JX8lfiV/JX4lfyV+JX4lfiV+JH4kfSR+JH0kfiR8I34jfCR+JH0kfiR9JH4kfCR+JHwkfiR8JH4kfCV+JXsjfiN7JH4kfCR+JHwkfiR8JH4kfCR+JHwmfiZ8Jn4meyZ+Jnwmfih8KX4peyl9KnosfSx8LH0sfS19LX0ufS59Ln0ufS58Ln0vfC99LnwvfDB8MHwwfDB8L3wvfC98L30ufC59LXwsfit8K34sfCyALHwsgCx8LH8sfCt/Kn0pgSl9KYEpfSiBKH0ogSd9J4AmfSaAJX0lfyV9JH8jfiN/In4ifyJ+In4ifiJ+In4ifyJ+In8ifiKAI34jgCR+JIAlfiV+JYAoeiuENXNGiWRoeYh4YnOGd2B8hHxleoJ6aHuCdmp0f2prX4BVbkWAPHpKfmSEcnp5kXV9cZKJf4iOhn6Gi4R9bItNfE+QXX5plHCAc5R6gHiSd4Fyj22BcY2AgXSLcYJqjWeFbot5inqIfYpqhG+KeoJ1h3p/hIWBb4KDeHJagC56K34ngip+KIcofSmJKXwpiit8K4krei6LQHlQjVl4cIyNdoeMhnKCjoJvgpCCbX2RfmuBkYNtiJGKbYeRg2uQk5pqnZSTboSTenB3kXVyc5F5coORi3RclUd0Sp1ScVqoa26Hpp9vrZGxca6Kr3GpjZ9sjpt0a2SmYGxap1RuTqJhbZCbnGmTmJVliJiBZ3SbXml2m5NjjpqMXZKYlFqOmIVbhZqNVZScmVeNm3BbaKF0YXiha2B0oJVepJSqXKiQnV+Cm1pmUKBZZ2uhhGGXnZlclJqQWIqfklSZm5NPiqCDVHqfdFhxnnBdbp1lYlibRWFnnoJXhaGKTYujh09+ooxYi6CNX4aef2V3m2hrW5dTclCRT3ZKjEJ6OYkufSeIJH0mhyR+JYUlfiSEJX0mhCV+JYInfyeCKH8ngSl/KIAngCd+KYAtfS6AL3k3gjl0MoMzcTaFN24/hUZpUodEYzWHNmI0hkpnT4ZKbFmHPm8zhCtyMYI/blCCW2hjhWJlXoRqbmqAVnxXfmmBcn5kf1x+W39gfmyAcX1zgHF/cIFtf2mCZH5eglt9WoJafFqCWXxZglp8WoJZfFmCWX1ZgVZ+VH9Rf01+S4BKfUiBSH1KgUt/TYBQgFN9VoJaelyFXnhgh2J2ZIpnc2uMcW92j3tqgJODaoOTgWuBkYFugY+Db4SNhnGJjYtyioyIdIeMhnSFjIR0hIyDcoOMgXOAjYNzhY2FcoWMh3SJiYh4iIGLfIZ6h4CFeISAgH1+fnmDc3lyinFzcI5vcm6PbHNpjWV1YYxcd1iJVndciWB0Zoxtb3SOe26Bj4dwioyMcouLi3WJioZ1hoqGdIaKhnSFi4VzhouHdYWLg3aAint2cIR+epB3jn+LcYiBhnSGgYd2h4KGdYeCiHSMgoV2hIKIc4yCj3CPhI9uj4SPao6EjmmOhI5ojoSPaI6EjGaNhIxnjIWMaIuEi2iMhI1ojoSPZ4+Ej2aPhI5lj4SPY4+Ej2WPhI9oLP8s/yv/K/8r/yv/K/8r/yv/K/8r/yv/Kv8q/yr/Kv8q/yr/Kv8q/yn/Kf8p/yn/J/8n/yf/J/8n/yf/J/8n/yf/J/8n/yf/J/8n/yf/J/8n/yf/J/8n/yj/KP8o/yj/KP8o/yn/Kf8o/yj/J/8n/yb/Jv8m/yb/Jv8m/yb/Jv8l/yX/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8k/yT/JP8k/yT/JP8j/yP/JP8k/yT/JP8k/yT/Jf8l/yP/I/8k/yT/Jf8l/yT/I/8k/yT/JP8k/yT/JP8k/yT/JP8k/yb/Jv8m/yb/Jv8m/yb/KP8p/yn/Kf8q/yz/LP8s/yz/Lf8t/y7/Lv8u/y7/Lv8u/y//L/8u/y//MP8w/y//L/8v/y//L/8v/y7/Lv8t/yz/K/8r/yv/K/8r/yv/K/8r/yv/Kv8p/yn/Kf8o/yj/KP8o/yf/Jv8m/yb/Jf8l/yX/JP8k/yP/I/8i/yL/I/8j/yH/If8h/yH/If8h/yH/If8i/yL/JP8k/yX/Jf8l/yr/MP9E/2L/eP93/3H/dv98/37/f/98/3r/eP90/3D/aP9c/1D/SP9R/2H/av99/37/av93/4r/gv+D/4L/ev9X/1H/V/9x/3n/bf9y/3v/cf9x/3H/df95/3T/d/91/4D/b/9w/37/ef90/2//X/91/3L/Yv9t/4r/jP+N/47/cv9O/zP/KP8o/yj/Kf8q/yr/K/8r/yv/NP9H/1T/Xv94/4r/hf+A/4H/gf9//3v/cP90/3j/fP99/4D/hP+E/47/l/+Z/5X/jP+A/3b/cP9t/3H/ev+B/4T/V/86/0//Xf9z/4f/n/+t/7D/rP+u/6f/iv9d/0n/Tf9O/1H/Tv9O/1//jf+a/5j/mv+Q/4D/av9Q/1z/hf+J/4z/j/+O/4r/iP+B/4X/jv+T/3v/av9r/2//eP+A/5X/p/+r/6f/o/+X/3v/U/9K/0r/R/9Z/4P/mP+Q/4T/iv+a/5f/k/+I/33/c/9v/27/bv9v/2b/UP9B/13/gv+O/47/jf+F/3v/gv+A/4X/gP90/2L/R/86/zT/M/80/zL/Lv8o/yX/Jf8j/yX/Jf8l/yT/JP8k/yX/JP8l/yX/Jf8m/yX/J/8o/yr/LP8v/zD/Mf81/z//Nf8z/y//Kv8r/y7/Mv8+/17/Uv8//0D/Uf9K/zz/Uf9H/y3/K/80/0H/Wv9f/1L/VP9J/0//dP9y/4D/f/92/27/U/9R/13/aP9w/3L/cf9w/23/af9k/17/W/9a/1j/WP9X/1f/WP9Y/1n/Wf9Y/1j/Vf9T/1D/TP9K/0j/SP9I/0n/S/9N/1D/U/9W/1r/XP9e/2D/Yf9j/2b/av9w/3X/ev9//4P/g/+B/4H/gf+C/4P/hP+I/4r/i/+K/4f/iP+G/4X/hP+D/4P/g/+D/4P/g/+E/4f/hP+H/4n/iP+I/4n/h/+H/4X/hP+C/3z/d/9z/3L/cf9w/2//bv9s/2n/Zf9h/1z/WP9Y/1z/YP9o/2//dv99/4P/h/+K/4v/i/+J/4f/hv+G/4b/hv+G/4X/hf+G/4b/hf+C/37/ev98/5D/jv+K/4r/if+H/4b/h/+H/4j/iv+N/4z/i/+Q/5L/lP+U/5H/j/+P/4//jv+O/47/jv+N/43/jf+M/4z/i/+L/4z/i/+L/4z/jP+M/43/jf+N/43/jP+M/4z/jP+M/43/jf8sfCx6K3wreit9K3krfSt6K3wreyp8KnwqfCp9KnwqfSp9KnwpfSl8KX0pfSh9KH0ofih8J34nfCd/J3wnfyd8J34nfSd+J30nfid9J34nfSh9KH0nfSd9J34ofyh+KH8pfSl/KH0ofyh9KIEnfSeBJn0mgCZ9JoAmfiaAJ34ngCZ+JoAmfiaAJn4mgCV+JYAlfiV/JX4lfyV+JX8lfiV+I34jfSN+I30jfiR+JH4kfiR+JH0lfiV9I34jfCN+JHwlfiV8JX4lfCV+JXskfiR7JH4keyR+JHskfiR6Jn4meiZ/JXsmfyZ7KH4oeyl+KXsofip8LH4sfCx9LH0tfS19LXstfS17LX0ufC59L3wvfS97L30uey59LXstfC17LX4tei1/LXotfy18LIArfCuAKnwqgCt8K4AqfSqAKn0pgCl9KYApfSiAKH0ogCZ9JoAmfSaBJn0kfyR+JH4jfiN+I34jfSF+IX4hfiF+IX4hfiF+IX8ifiJ/In4ifyN+I38kfiV8JX4keyiCL3Y+h1dtc4d4ZnGGdGF6hXxifIJ6ZHuCemV6gXJoaoBmaVuATm5Jf1d7aXt2iIh6fZJwfoCSgoGAjIJ/f4lpfkuOTn1QkWN+bpRugGiXaYBrlHCCdJB1g3GOZoR1i3iDeYxwhG+Mc4l2iGuJZYRYimCDcIhsgleHkHSXhZJqkYJtbGR/Z3c/fjKBJ34phil8KYkoeyqKNXpBjEx4WYxjd3+LiHSCi31yfY9/bnySdmpuk3Brc5N0bHaTcm12k31qhJOOapKVkGyMlYZve5J1cnKScHJwkXp0gZOFdVeZUXJgoXJtiqSab66Ssm6wi6lqgZxDaT2tRG5FrkRvS6lQb1ClW26KnZtsmpeeaJqXf2lUmjppPZxkY3Oce1mCm4VZf5p7XHibeVqCnXxdaJ5fYWGfaWF4oIhelp2iVJ+YnE+bmpNafpxVaUacSG9PnGtqi5iWYpWYjVqSmppYlJyLWnSfcl9znWtfaJ9rYG+fYWRInEZlU5xsW3iggFB7o3JUbqF5XHmefmR9nGNrQps0cTCXLnYskSp6KI0ofCeIJn0khyN9JIYkfiSGJX4lhCR+JYMmfiaCJX8kgSWAJ4AngCx/L4AxfjCAMnsygjR2N4IzdS2CKHgmgiZ8KYIqeS6CRWxfhVBhWIdZXlqIWWJWhklqLIYrby2DOW9RhFBqVIZMZlyGeWt9gn11gn+HeXp/U3pRgU97WH9jfnB+cH9xfXCAbX5ogmN+XYJafViCV3xXg1d8V4NYfFaDWHxYg1d8V4FVflGAT4BLf0qAR39GgUaASIFKgUx/T4JSfFWDWXtbhV54X4dgdWGKZXJpjG5udJB5aX+UgmmCk4JqgpGCboOOg3CEjYhxi42LcoqMiHSIjIZ0hYyEdISMg3KDjINyg42EcoSNh3KIjIl1iYaKeYl+iX2JeYeAhnqDgIJ+fH52hXN5cotxcm+QbnFtj2tzaIxldV+LW3dYiVh2XopjcWqNcm55j35ug46IcIuNinOJi4l1h4qFdIWLhXOFi4VzhYyEdIWMhXOEi4J2fId8eZF9kX+Nc4iCiHSGgoV2hoKIc4mCjW+QgpFukIOSaZKFk2WShZBjj4WPY42EjWSMho5ljoSOaI6DjmmOhI5sjYSNbo2DjW+Ngo1wjYONb4qDjG6Mg45rjoOLaIuDi2iLg4pmi4OLZiz/LP8r/yv/K/8r/yv/K/8r/yv/Kv8q/yr/Kv8q/yr/Kv8q/yn/Kf8p/yn/KP8o/yj/KP8n/yf/J/8n/yf/J/8n/yf/J/8n/yf/J/8n/yf/KP8o/yf/J/8o/yj/KP8o/yn/Kf8p/yn/KP8o/yf/J/8m/yb/J/8n/yb/Jv8n/yf/Jv8m/yb/Jv8m/yb/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8k/yT/JP8k/yT/Jf8l/yX/JP8k/yX/Jf8j/yP/JP8l/yX/Jf8l/yX/Jf8l/yT/JP8k/yT/JP8k/yT/JP8m/yb/Jv8l/yb/Jv8o/yj/Kf8p/yr/K/8s/yz/LP8s/y3/Lf8t/y3/Lf8t/y7/Lv8v/y//L/8v/y7/Lv8t/y3/Lf8t/y3/Lf8t/y3/Lf8s/yv/K/8q/yr/Kv8q/yn/Kf8p/yj/KP8o/yj/J/8n/yf/J/8m/yb/Jv8l/yT/JP8k/yP/Iv8j/yP/If8h/yH/If8h/yH/If8h/yH/Iv8i/yL/I/8j/yP/Jf8n/yf/LP84/0z/a/90/3L/cv93/3v/fP96/3r/fP95/3j/cf9s/2L/Vv9O/0r/W/92/4f/iP94/3X/g/99/33/gP95/1n/R/9H/1P/af9u/2//a/9l/2v/Zv9q/3P/bf9o/2z/fv9//3L/b/9z/2//aP9p/2f/R/9q/27/VP9u/5T/hv9x/2j/Zv90/z//Tf9E/yn/KP8s/yr/Kf8y/zz/TP9Z/2b/hf+H/4H/ev95/3n/e/91/2z/av9u/27/av9r/2v/bv9y/3//h/+K/4j/h/+F/3r/cf90/3L/bv92/4P/iP9l/2D/dv+N/5v/qv+v/6j/d/9p/1H/Qv89/z3/QP9Q/1n/Wv9b/4f/lP+d/53/nP+F/1b/OP9B/1P/Z/93/3v/dv9y/3D/b/9w/3P/cP9q/2z/c/9+/4n/lv+b/5f/kP+O/4z/jf99/1T/Pf8+/07/e/+P/5D/lf+V/5f/lf+M/37/Y/9T/1z/YP9i/2X/Zv9V/0j/Qv9G/1f/c/93/3H/af9g/2r/cP91/3X/U/80/zD/Mf8v/yz/Kv8o/yj/J/8l/yT/I/8k/yT/JP8l/yX/JP8l/yX/JP8m/yj/K/8t/y7/Mf8y/zT/Nv8z/zL/Mv8w/y7/KP8m/yX/Jf8n/yn/K/88/1P/WP9O/1b/VP9c/1f/SP8//y//Mv9A/0r/T/9S/1j/Uv9c/2z/c/95/3//gf92/23/Wf9N/1f/bv9y/3H/cf9t/2j/Y/9d/1r/WP9X/1f/V/9X/1f/V/9Y/1f/V/9X/1T/UP9O/0n/R/9G/0X/Rf9H/0n/TP9P/1L/Vf9Z/1v/Xf9d/1//Yf9l/2n/a/9x/3f/ff+C/4L/gv+C/4L/g/+F/4b/iP+L/4v/i/+J/4f/hv+F/4T/hP+D/4P/g/+D/4T/hP+G/4f/if+J/4n/iv+K/4j/iP+G/4P/gP97/3b/c/9y/3H/b/9u/23/a/9o/2P/Xv9b/1j/Wv9g/2X/bP90/3r/fv+D/4j/i/+K/4j/if+H/4X/hf+F/4X/hf+F/4T/hf+F/4T/gf99/4r/kP+N/4n/h/+H/4f/iv+M/47/kP+R/5L/kv+Q/4//kf+Q/5D/jv+Q/47/kP+N/43/jv+P/43/jv+O/4//j/+N/4z/jP+M/4z/jP+M/4z/jf+Q/5H/j/+P/47/jf+N/4r/jP+L/4v/K30reit9K3orfSt5K30reip8KnsqfCp8KnwqfSp8Kn0pfSl9KX0pfSl9KH0nfSd9KX4pfCh+KHwofyd8J38nfCh+KH0nfid9J34nfSd+J30nfSd9J30ofSh9KH8pfSl/KX0pfyh9KH8ofSh/KH0ofyd9J4AofSiAJ34ngCZ+JoAnfSeAJn0mgCZ9JoAmfSWAJn4mfyV+JX8lfiV/JX4lfiR+JH0kfiR9JH4lfiV+JX4mfiZ9Jn4mfSV+JX0lfiV9JX4lfSZ+Jn0kfiR9JX4lfSV+JXslfiV7JX4leyZ+JnslfyZ7Jn8neyh+KXwpfip8Kn4rfCt+K3wtfS19LX0tfS5+Ln0ufi59LXwtfS98L30tey19LXstfS17LXwtey1+Ln0sfyx9LH8sfCuAKnwpgCl8KYAofCiAKX0pgCh9KIAofSiAJ30mgCZ9JoAlfSWAJH0kfyV9JH4jfiN+In4ifiN+I30hfiF+IX4hfiF+IX4hfiF/IX4ifyJ+I38ifiJ/JIAlfCiDK3U1hkdrYYhzZXGFc2V2hHtofIN5ZnmCeWV7gnhldYFzZmqAYGdVgEpvSn9jfH96j4mHenWRfX+BjnqAe4t8fm6LTX1FkEx9XZJofmmUaX5ql2WAYpZkgGeUaoFtkmyCdY53goSNcoNjjYKFgop4hm+IaYZHhlCId4NfiUV9gYZrdGSCZnJbf2h2aIFufHaAWoI6fSuJK3wrijR6P4tLeFeMYHaEjYRzfo52cXmQd212k3NqbJRqaGuUaGpjlWRqaZRma2mTbmtxlHVrd5R4b3yUgHF1knFybpJudHKSeHOClYFxbJt6boqhlW2imZ5rd6JhbHerUXA9pzdyQKJYcW6gcHBonmBwjpqNbJSZkGqUmI1qYJs5bECdYWZvnIZegZxyW22cal1pnGthcJ1uYmqca2N3nYZgn5ikVpyXjE2Don1Ve593YWSbSGxBmT1vTZpyaoSchmKLm4pdkJmPXoaceWVNnC9uM5tBbVGZYWhfm1BpSptLZ1WZb2B6nHJabJ5iXVueZGNwm3Bra5hKciyVL3cwki95K44qeiiLKHwniSZ9JoclfSSGJX0lhiV9JoQlfyiDJ38ohCmAK4AwgjJ+MYIyfDGDNXo3gzR2LoQreCqCKXslgiZ/J4EpgCuBKX8rgTd5QYRGblGEUWNVhk1eVohnYEOHQWhAhEptTYRSa1OGTWdYiFZtX4VdeWaAa397f3SBb4BhgEt/VoBpfnJ/cn5wgG1/Z4Jjfl2CWX1Xgld8V4NWfFaDV3xXg1d8V4NXfFaBU35PgE2ASH9GgER/Qn9DgEV/SIFLfk6CUntVg1h6WoZdd16JXnVgimRyaIxrbnCQdml8lIBpgJOBaoGRgm6EjoZwh42JcYuNi3KKjIh0hoyGdIWMhXSFjINyg4yEcoSNhHKDjYZzh4uKdoqFinqJfoh+inmJgYZ7g4B/gHp9dYdyd3GNcXJvkG1xbY9qc2iMZHVfi1h2WopfdGGLZ3BvjnVtfI+AboWOiXCMjYpziIuIdYaKhnSFjIVzhYyFcoWMhXOFjIN0gYl/doiAkXyNdIuAh3OHgYdyioGMbI+EkmmShJJnkYWQZI6Fj2WOhY9kjoWNZY+FkGiPg5BsjoOMb4yCi3WKgYx5j3+PfY6AjX6LfouAi32KgIx9jXiQf5JxkoKRbJCCj22NgoxsjYONboyDjG4r/yv/K/8r/yv/K/8r/yv/Kv8q/yr/Kv8q/yr/Kv8q/yn/Kf8p/yn/KP8o/yf/J/8p/yn/KP8o/yj/J/8n/yf/KP8o/yf/J/8n/yf/J/8n/yf/J/8o/yj/KP8o/yn/Kv8p/yn/KP8o/yj/KP8o/yj/KP8o/yj/KP8n/yf/J/8n/yf/J/8n/yb/Jv8m/yb/Jv8m/yb/Jf8l/yX/Jf8l/yX/Jf8l/yT/JP8j/yX/Jv8m/yb/Jv8m/yb/Jf8l/yX/Jf8l/yX/Jv8m/yX/Jf8m/yb/Jf8l/yX/Jf8l/yX/Jv8m/yX/Jv8m/yf/KP8p/yn/Kv8q/yr/K/8r/y3/Lf8t/y3/Lv8u/y7/Lv8t/y3/Lv8u/y3/Lf8t/y3/Lf8t/y3/Lf8s/yv/K/8r/yv/Kv8p/yn/Kf8p/yj/KP8p/yn/KP8o/yj/KP8n/yb/Jv8m/yX/Jf8k/yT/I/8j/yL/Iv8i/yH/Iv8i/yH/If8h/yH/If8h/yH/If8h/yH/Iv8j/yT/JP8l/yf/Kv8z/0P/W/9u/2//b/92/3v/e/93/3L/df93/3b/d/91/3T/Z/9d/1X/Sv9J/2n/gf+Q/4j/c/+B/3z/ev98/33/Yv9J/0f/UP9g/2H/Y/9m/2r/Zv9m/2j/Y/9V/07/Vv9Z/1j/Y/9n/1H/Xf9Z/1f/Uf9W/0T/Pv9j/2//Xf+B/4D/if9k/1f/Z/9d/2j/Zv9Z/1b/Sf85/y//M/8+/0r/Vv9a/37/hP99/3r/dv91/3b/cv9w/2//bP9p/2X/Y/9i/2H/Xv9f/2H/Z/9l/2P/Yv95/33/cf9s/27/bf9s/3X/gv99/3P/iP+Q/5P/Uv9T/1v/Uf8+/zr/Sv9r/4T/jv+F/3L/Y/+Q/5D/kP+J/3v/gv9w/0z/Uf9r/3b/j/+K/3n/bv9p/2b/Yv9l/2r/af9v/3n/l/+m/57/jv96/3b/cf9x/2v/Tf89/zr/PP9L/2P/df9//4X/iP+X/4//gv9w/0T/L/8s/y//P/9j/2f/Xv9Z/1v/aP+E/4j/gf9z/2b/Xf9m/23/av9f/0b/Kv8t/zD/Lf8r/yr/KP8n/yb/Jv8m/yX/JP8l/yX/Iv8j/yX/Kf8p/yr/Kv8v/zT/Nf82/zj/Pv9G/0P/RP88/yv/J/8o/yb/Jv8m/yj/Kf8p/yn/MP83/z//Sf9Z/13/Vf9d/2P/UP9A/0X/TP9G/03/V/9r/1z/U/9X/1P/Xv9r/3n/S/9A/13/TP9m/2v/Zv9x/2//bf9n/2P/Xf9Z/1f/Vv9W/1b/Vv9X/1f/V/9X/1b/Vf9S/1D/S/9G/0X/Qv9B/0L/RP9H/0v/Tv9S/1X/WP9a/1z/Xf9e/17/Yf9m/2r/b/91/3v/gf+B/4L/gv+D/4T/hv+H/4r/i/+L/4r/iP+H/4X/hP+F/4X/g/+D/4T/hP+F/4f/hv+I/4r/iv+K/4n/i/+K/4b/hf+B/33/ef90/3D/cv9x/2//bf9t/2r/aP9j/17/V/9Z/1//ZP9p/3H/d/99/4D/hf+L/4z/iv+I/4j/hv+G/4X/hf+F/4X/hf+F/4X/hf+C/4X/kP+N/4v/if+K/4r/jP+P/5D/jv+Q/5D/kP+O/43/jv+O/43/j/+R/5H/kP+P/47/jP+J/4f/hf+F/4f/jP+P/4//jf+M/4v/if+J/4v/jP+P/5L/k/+R/5D/j/+O/43/jf+R/5L/kP+P/yt9K3srfSt7K30reyp9KnsqfCp7KnwqfSl8KX0pfCl9KXwpfil9KH4nfSd9J30nfSh+KH0nfih9KH8ofSh/KH0ofih8KH4ofCh+KHwofih+J30ofih9KH4ofSh+KX0pfil9KX4ofSh+KH0ofSh9KH4ofSiAKH0ngCZ+Jn8ofih/J30ngCd9J4AmfSaAJn0mgCd+J4AlfiWAJX4lgCZ+Jn4mfiZ/Jn4mfyZ+Jn4mfiZ+Jn8mfiZ/Jn4lfiV+JX4lfiV+JX4lfiV+Jn4mfSV+JXslfiV8Jn4mfCZ9JnwmfSZ8Jn8neyh/KHsofil8KH4pfCp+Knwrfit8LX0tfS19LX0ufC59LXwtfS17LX0uey19LXwtfS17LX0tey19LXwtfSx8K38qfCp/KnwqgCp8KYApfCmAKHwogCh8KIAofSiAKH4ogCZ+JoAmfSaAJX0kgCN+I38jfiJ/In4ifyF+IX8gfiB+IH4gfiB+IH4gfiB+IX4ifiF+IX4ifiJ/I38kfiSEJ3gwh0JvXIhuZmyFbWJxg3tle4J0aHGBcmR2g3hkeIJ5ZXeBb2RmgFxnUn9EcEJ9bnuFeY+JeHlrj4B/eIx4gXmJcX9WjEZ8SJFRfGKTaHtqlm18ZphieVWWVHlOlUR5S5RIfEiSRX1Gj0p9RY4+gDiNOIE3ijuCQopBhUaHXodagUqGiHuMg3B1YYN+dHSCcHpugWGDVH5Li0h+QYw7fD6OSntQjVZ3eY6DcX2QeW50knFtcZNxaXOUc2dvlmhoZZVfaluUWm5Xk1lvWpRhbmGVV25IlElxcZV1cnCTb3Rpk2Z0a5R3c4KXdW98nodtW6hPblarTnI/pjxyTJ52cI6bmnCamI9vb5tfcIabi2yMmYpqc5lObGOcZWtlnnplep6OXYaed11tnGdhYp1dZWKbZmZlm2phgp2jWaCWkk6Ho3hTbKdlXWilXmdIoUJuPZ47bkeeWmpnnnZnf5yJZI6ahWJ7mmBmPJksbyyWM29HlWlpdpluaVmYWGlmmIBhi5qNWYOchVtxm2xkbZllblWXPnUpkip4LI4seiqMKnooiyd8JoklfSWHJH0jhiR9JIUjfSKEJH4mgyV/JoMsgDqAQoFFfUWERHlHg0d5QoU9eTWFKXwmgyZ/JoImgSaCKH8pgid/KoEvfTOBOndEg0RrSoVXYmSKYF1ai1ZiRolAbDuFQG1MhldsWIhabVyJPnRChFt7VIAyfzh/ZoJRf06CXX1pgnJ/cIJtf2iBYn5cg1h9VoNUfFSDVXxXg1d7V4NXe1eDVXtUg1F+ToFKf0V/QX9Af0B/QX9DfkaBSnxNg1F6VIVYeVmHWndbiVx2XYpgc2ONaHBtkXJsepN8an6Tf2uAk4NuhZCFb4qOi3GLjYhyh4yIdIeLhHSFjIR0hIyEcoSMg3KDjYRyho2Gc4eKineKgot8inyKf4h7h4CEe4GAfYF4fHOIcXVwjXFxcJFtcWyPanNnjWF1XYxadluLYHJkjWpvcY94bX2PgW6Gjotyi42Lc4uMiHWGjIZ0hYyFc4WMhXOFjIVzhYyFdoKEjnqSdouAh26LgY1sjoOPaI+DkGeOhI5kj4SPZ42EjWiMhItrj4SQa5CEjm6NhIx0iIGGeoN/gYOAeoKFiHiNh416jYOMe4uFjHyJhop5ioKNe5F6lICTco+Cj22OgoxvjICPcZCBkXaPgY54K/8r/yv/K/8r/yv/Kv8q/yr/Kv8q/yr/Kf8p/yn/Kf8p/yn/Kf8o/yf/J/8n/yf/KP8o/yf/KP8o/yj/KP8o/yj/KP8o/yj/KP8o/yj/KP8o/yj/KP8o/yj/Kf8p/yn/Kf8p/yn/KP8o/yj/KP8o/yj/KP8o/yj/Kf8p/yj/KP8o/yj/J/8n/yb/Jv8m/yb/J/8n/yf/Jf8m/yb/J/8n/yf/J/8n/yf/J/8n/yf/J/8m/yb/Jv8m/yb/Jv8l/yX/Jf8l/yX/Jf8m/yb/Jf8l/yX/Jf8m/yb/Jv8m/yb/Jv8m/yf/KP8o/yj/Kf8o/yn/Kv8q/yv/K/8s/yz/LP8s/y7/Lv8t/y3/Lf8t/y7/Lf8t/y3/Lf8t/y3/Lf8t/y3/LP8r/yr/Kv8p/yn/Kf8p/yn/KP8n/yf/J/8n/yf/J/8n/yf/Jv8m/yX/Jf8k/yP/I/8j/yL/Iv8i/yL/If8g/yD/IP8f/x//IP8g/yD/IP8h/yL/If8h/yH/Iv8j/yT/Jf8s/zz/Vv9x/3D/aP9u/3T/ef90/23/bf9w/3L/c/93/3j/dv9u/2L/Vv9N/z3/Ov9o/4b/h/9y/3L/d/9y/3f/ef9r/07/Q/9I/1X/Z/9p/2z/dv9k/1f/R/9E/0f/Qf9K/1D/S/9L/0r/Sv9E/0f/Qf8+/zv/O/9A/0b/P/9P/13/Ov9r/3v/hf+I/4f/hP9+/3T/Y/9U/03/Sf9F/0H/QP9G/0r/Uf9y/4L/ev92/3P/cv9v/27/cP9y/27/af9l/1//W/9Z/0//Tv9U/2D/Xv9S/0b/Mv9H/2r/bf9u/2r/aP9o/27/dv+A/3z/Y/9A/0v/Tv9O/0X/SP9v/5D/nf+i/57/kP9q/1z/b/+F/4v/hv95/zX/Mf9M/3f/k/+Q/4n/gP93/2v/ZP9e/1v/Xv9j/1z/Zv+Z/5//lv+H/3z/b/9c/2H/bP9c/0b/Qv9A/0T/Tf9X/2H/a/9x/3f/dv91/27/Vf84/yv/Lf87/1L/aP90/37/d/9k/17/ZP94/4b/hv+E/4T/e/9p/1//U/80/yb/Kf8t/yz/Kv8p/yf/J/8m/yX/Jf8k/yT/JP8k/yP/Iv8i/yP/JP8o/y//Ov9C/0T/Q/8//zr/OP83/zb/MP8n/yf/J/8m/yf/KP8o/yf/J/8q/zH/Nv86/z3/OP9H/1H/WP9b/1n/Vv9P/0n/S/9D/0z/Wf9a/1L/UP9G/zb/Uf9c/03/Vv9q/1n/Sv9Z/3L/c/9w/27/aP9i/1z/WP9W/1T/VP9U/1P/Vv9W/1X/Vf9U/1P/UP9M/0r/Rf9B/0D/P/9A/0L/Rf9K/03/Uf9U/1j/Wf9Y/1r/Wv9c/17/Yf9l/2r/cf93/33/fv9//4D/g/+F/4b/iP+L/4v/iv+J/4f/hv+E/4X/hP+E/4T/hP+D/4P/hP+G/4b/h/+K/4v/i/+K/4n/h/+H/4T/gP98/3b/c/9x/3H/cf9w/23/bP9q/2f/Yf9d/1r/Xf9h/2b/a/9z/3v/gP+D/4n/i/+L/4v/i/+I/4b/hv+F/4X/hf+F/4X/hv+G/4b/iv+P/4v/i/+K/4z/jv+O/43/jv+P/43/jf+N/43/jP+M/4//jv+N/43/i/+J/4X/gv+A/3z/ef97/37/gv+J/43/jv+O/4z/i/+K/4r/iv+L/4//k/+T/5L/jf+O/43/i/+N/5L/kf+R/4//jv8sfSx7K30reyt9K3srfSp7Knwqeyp8Kn0qfCp9KXwpfSl8KX4pfSh+J30ofSl9KH0nfid9KH4ofSd/J34pfyl+KX4pfih+KH4pfil8KH4ofih9KH4ofSh+KX0pfil9KX4pfSl+Kn0qfil9KH4ofSiAKH0pgCp9KIAofSiAKX0pgCl8KIAnfCeAJ3wmgCd8J4AnfieAJ34ngCd+J4Aofih+J34nfyd+J38nfid+J34nfid+J34nfid+Jn4mfid+J34mfiZ+Jn4mfiZ+Jn0mfiZ7JX4lfCV+JXwlfyV8J38nfCd/J3sofyh7KH4oeyl+KXsqfit7K34reyt9K3wsfSx8LXwtfS18LX0tey19LXstfS18LX0tey19LHssfSt8K30rfCp/Knwqfyl8KYApfCmAKXwogCd8J4AnfCeAJn0mgCZ+JoAmfiWAI34jgCR+I4AifiJ/In4hfyJ+In8hfiF/IX4hfiB+IH4hfiF+IX4hfiF+IX4hfiF+I38jfCOBJngphjdwT4ltZnKHaWVrhHFmdoNzZmyCaWdqgWtnb4NxZ3aCd2N0gWtjY4BWaUt/P3I7f2qAkHyLjXR7eYxyf3CJeIF3i2J/S49IfVCQYXxnlF96YJdoeVeZSnhGl0R3SZZDd0iWTndLlkx3S5NNeUWRQ3tCkUB8Po4/fD6NRX9AikGFSoZEhjqAPIR3do2Eh3SEgn16coFihFV+TY9GfUSSQ31DkUJ7Ro5MeGePhHF3kXVuc5JxbW6TbGtulG9pbpZnaWKWW2tYlVtvU5FOcU6RQ3NMkU9ySZQ5cyyWRnNqlGpzZpRqc2iVanRvlndzeplHcjygQnNJoUlzR51tcZOYonKjk6NyoZSNcnOXYXBdloFwjpaGb4eXQ28rmj1sgJ2YX42dhFl7nndeaJ1fZVybWWhYmlplU5t1XaGbmFWNn4BUcKRbXlCkWWdcoU1sO546b0KcSWxSnVdpW5xhZ2SbZmVqmmtjYZlNaTeYLHA3lUlrXJVpY26ZdmJ+mXZmaph5Y4yakFyFnXpdf5p9ZWuYXHBKlCx2JZAoeSqMKnsqiyh6J4kmfCWIJH0lhiV9JIUjfSOEI30igyJ+IoMhfiaDL343gjp+PIA/fj5+PX49fjuAOH4xgSiAJ4EngCeBKIAogCeAKIEmgSqBMYA7gD19N4I5eEKDR3FJhFtlXodbXlyJR2VGiEFsRIZLcUuHSXJWiGBvUoZAcVmEUnVjgm58XoBKglx/c4N0f3CCbX9ngmJ+XINXfVWDVHxTg1R8VINUe1SEVHtUhFN7UoNOfkuBR39DgUB/P4E/fkCBQX1Fgkl7TINQeVSFV3hYh1l2WoladlqKXHNejWJwZ49ubHSSeGp9k35rgJODboaQiG+Jjotxi42KcomMh3SGi4R0hYyEdISMg3KDjINyg42EcoWNiHSIiIt5i4GLfIp8in+Ie4eAhHuAf3yDdnpyiXF1cI5wcXCRb3Fsj2pzZ41hdV2MWnVci2BwaI5ubXWPe2yAj4VuiI6LcouNinOJjIZ0hoyFdIWMhXOFjIVyhYuEcoaGinmQeI1/jG6Mgo5rjoOMaYyDi2uLg4xrjYONbYyDjW2NhIxxioSKdoiBhnyCfX6EfHt5inl2eI95cXyQgHKFjYt0jomPd42GjXqMhop7ioaMeY5+k3yTcpKAj26Pg41ui4KLdI+BkHuRfo+BjX6OhSz/LP8s/yz/LP8s/yz/K/8q/yr/Kv8q/yr/Kv8p/yn/Kf8p/yn/KP8n/yj/Kf8o/yf/J/8o/yj/KP8o/yn/Kf8p/yn/KP8o/yn/Kf8o/yj/KP8o/yj/Kf8p/yn/Kf8p/yn/Kf8q/yr/Kv8q/yn/Kf8o/yn/Kv8o/yj/KP8p/yn/Kf8n/yf/J/8n/yb/J/8n/yf/J/8n/yf/J/8n/yj/KP8n/yf/KP8o/yj/KP8o/yj/J/8n/yf/J/8m/yb/J/8n/yb/Jv8m/yb/Jv8m/yb/Jv8l/yX/Jf8l/yX/Jf8n/yf/J/8n/yj/KP8o/yj/Kf8p/yr/K/8r/yv/K/8r/yz/LP8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8s/yz/K/8r/yv/Kv8q/yr/Kf8p/yn/Kf8p/yj/J/8n/yf/J/8m/yb/Jv8m/yb/Jf8j/yP/I/8j/yL/Iv8h/yH/If8h/yH/IP8h/yH/If8h/yH/If8h/yH/If8h/yH/If8j/yL/I/8p/zD/Rv9m/3T/bf9r/3D/dP9z/23/a/9o/2n/av9t/3D/c/91/3L/a/9j/1b/Sv8+/zb/Zv+X/5L/f/9+/3H/df94/3r/XP9D/0j/Uf9l/2v/X/9d/1//UP9E/0b/Sf9M/0f/Tf9R/0//Tf9K/0r/RP9C/0H/QP9B/z//QP9C/0T/Q/9D/0b/QP9u/4T/if+H/4P/ev9r/1n/Tv9L/0X/Q/9C/0L/Qf9E/0f/X/+F/3j/dv90/3H/bv9q/2n/a/9q/2f/Yf9e/1r/Vv9Q/0f/Pv82/zP/O/89/zj/Nv83/1b/bf9n/2f/Zv9m/2f/b/93/3H/Rv86/zf/O/9f/4z/o/+m/6T/pv+e/4f/df9g/2X/ef+M/4b/if9L/zH/QP+E/5f/h/+D/3r/c/9i/1r/WP9W/1b/Tv9U/4j/m/+S/4T/ef9q/0//Tv9Z/1D/O/8x/zn/Qv9L/1H/V/9Z/1z/X/9j/2b/Zf9c/0r/Nv8w/z3/Uf9j/2n/a/9r/3X/fP9+/5n/nP+S/4L/ev98/3f/ZP9U/z7/Kv8m/yf/Kf8p/yr/KP8n/yb/Jf8k/yX/Jf8k/yP/I/8j/yL/Iv8i/yP/Kv8z/zr/Pf8//0H/Pv8+/zv/Nv8z/zD/K/8m/yf/J/8o/yj/KP8o/yb/Kf8t/zL/M/8x/zn/PP86/0T/Vf9b/1L/V/9c/0T/P/9E/1H/VP9V/17/af9d/0z/Yv93/3j/fv9n/0T/WP9r/3T/b/9t/2b/Yv9c/1f/Vf9T/1L/U/9T/1T/VP9U/1T/U/9S/07/S/9F/0P/QP8//z//QP9B/0X/Sf9M/1D/VP9W/1f/WP9Z/1n/Wf9Z/1z/YP9k/2v/cf94/33/fv+A/4P/hv+I/4n/i/+L/4j/h/+H/4X/hP+F/4T/hP+D/4P/g/+D/4T/hf+I/4n/i/+L/4v/iv+K/4j/hP+B/3//e/91/3L/cf9w/3H/b/9u/2v/aP9l/2D/XP9b/17/Y/9p/23/dv99/4H/h/+J/4v/i/+K/4f/hv+G/4X/hf+F/4X/hf+F/4X/h/+N/47/j/+P/47/jv+M/4v/if+J/4n/iv+K/4v/jf+N/4v/i/+I/4T/f/98/3n/eP94/3f/d/94/3v/ff+B/4j/jf+P/47/jf+N/43/i/+L/43/kP+T/5L/jf+N/4z/i/+L/43/kf+S/5D/jv+M/4v/KnwqfCp8KnwqfSp7Kn0qfSp9KnwqfSp9KnwqfSl8KH4pfil/KX4pfyh+KH0ofih9KX4pfSl+KX0pfil+KX4pfil/KX4pfyl+KX4pfil+KX4pfil9Kn4qfip+Kn4qfip+K30rfSp9Kn4sfSx/LH0rgCp8KoEqfCqBKXwpgSl8KYEpfSmBKH0ogSh9KIEofSiBJ34ngCd+J4ApfimBKX4pfyl+KX4pfil+KH4ofid+J34ofih+J34nfid+J30ofih9Jn4mfSd+J30nfid8Jn4meiZ/JnwmfyZ8Jn4mfCd+J3wnfyd8KX8pfCl+Knsqfip7KX4qeix9LHssfSx8LH0sfCx8LHwsfCx8LnwufS18LX0sfCx8LHwsfSx8K34qfCp+KX0pfSl9KX8pfSl/KH0ofyh9J38mfSZ/Jn4mgCZ+JoAlfiV/JX4kfyN+I4AifiKAIn4hgCF+IYAgfiCAIH4ggCF+IX4gfiB9IH4gfSF+IX0hfyB9IoAkfSOCJHkohS9zQoheaHGHbWRqhW9mdIN0Z2yDaGlmgWRrYYBka2mDbml0gXNic4JrYmKAVWpIfzhzMYFVfpR/kYiEf3aHboBzh3p+bYxbfEiPS35TkWR8YZRceF2XWnhMmER4SphPeE6YTnZPmVJ2U5lSdUuXR3dHlUV7RpBJfEyPQXw8kD5/QIw/gkOJRYREhVeFh3yHg4Z5gIJyfGd/VYRKfUePQ3xCk0F8QpFAfD6QQHpckIdyeZFzbm+ScG1vk2tsaJNobGiTZWxhlV1tWZRUcFCRSHI5jzF2MY41djWQNXY1kjZ0PJVpdGyWaXRnlmN0ZZVodG2TfXVYlzB2MphBdHOamHGil6Vyp5KkdJWVhXRtlFxydpRxcn+VgnGClmBwN5o+aXedkWCHnn1bc59oYlabUmtVmFRuVJVNZXGbm1uWm4VWeaJuXF6iT2VaoWFqVJ41bTSbO25Hl05rVJdYZ1yXXmRhmGJkY5pgZ1mZRm05mD9tS5daaWSWZ2RmmGdlbJlwZ2iYk2SZmY9igph5ZXOVaWtelVRyP5MsdSiQKXopiyh8KYkpfSeJJX0liCR+I4YjfiOFI34jhCJ+IoMhfiOCJX0wgTl8PH49fD58P3tAfDx8OH0zfjGAL4EqgieBJ4AogSiBKIAogSaAJoEogC2ALoAxgDOBNH83gTp6PIJKcVqDWmNKhVNmT4VDaj2GQG9JhkhvTIZQakyHWmVth3dsboVpeGSCRYNXgG2CdX51gG5/aX5jfluBWH1Tg1J7UYRQelCCU3pUhFN6U4RSe1GCT31KgkV/QoA+fj2BPn1AgkJ7RoJJek2FTnhShlV4VoZXd1iIWHZXi1d0WIxdcWKNaG5ukXVsepJ8bIGSgm2FkIdviY6JcYqNiHOHjIdzhYuFc4SNhHKDjYNyg42DcoONhXKGi4h1iYeKeouAi32Jeol/h3qHf4R/gH97hHV5copxc3CPcHBvkWxxao9mcmONX3RcjF10X4tjcGmQcWx4kX1sgpCHb4qPjHGMjIp0iYyHc4eMhXOFjYVyhY2FcYWKhXWNfY58jm2PgY9pjoONZouDiWiIgohthoKJcYqCinKJgYl2iIKDfn19eYZ2dnaMdXN2kXZxd5J5b3uSe21/kYNvio2OcpCJjniOiI15jYeMeouDjXySeZJ/kXGOgYtui4SLcoqBj3iSf5N+kX2OhIx7i4Uq/yr/Kv8q/yr/Kv8q/yr/Kv8q/yr/Kv8q/yr/Kf8o/yj/KP8p/yn/KP8o/yj/KP8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8q/yr/Kv8r/yr/Kv8r/yv/Lf8t/yz/LP8s/yv/Kv8q/yv/K/8q/yn/Kf8p/yn/Kf8o/yj/KP8o/yj/KP8o/yj/KP8o/yn/Kf8p/yn/Kf8p/yn/Kf8o/yj/KP8o/yj/KP8o/yj/J/8n/yf/J/8n/yf/J/8n/yf/J/8m/yb/Jv8m/yb/Jv8m/yb/J/8n/yf/J/8o/yj/Kv8q/yr/Kv8q/yv/LP8s/yz/LP8s/yz/LP8s/yz/LP8t/y3/LP8s/yz/K/8s/yz/LP8r/yr/Kv8p/yn/Kf8p/yn/Kf8p/yn/KP8n/yb/Jv8m/yb/Jv8m/yX/Jf8l/yT/JP8k/yL/Iv8i/yH/If8h/yD/IP8g/yD/If8h/yD/IP8g/yD/If8h/yD/Iv8o/zX/Jf8m/y3/P/9X/3L/dP9s/27/dP91/27/af9l/2L/X/9c/1//af9u/3P/d/9x/2r/Yf9U/0f/Nv8t/0r/kP+S/4T/dP9y/3L/dv9h/0//Sv9M/0//Xf9Z/1P/Uv9P/0P/Rv9N/0//Tv9L/0z/UP9Z/1v/UP9I/0j/Sf9G/0j/TP9Q/07/Qv9B/0D/QP9D/0T/Qf+A/4j/hf99/27/X/9R/0n/Q/9B/z7/O/89/zz/Of87/1T/hf99/3H/b/9w/27/aP9m/2f/Zf9j/1//XP9W/1X/UP9E/zX/M/8z/zH/Mf8z/zP/Nf82/03/cP9s/2j/Zv9l/2P/bP90/3T/Pv8s/0//fv+Y/6D/o/+i/5j/iv99/2P/Wv93/2D/dv9//3z/cv86/zb/b/+Q/3//c/9r/1j/Tv9P/1L/Uv9R/1f/hv+W/4f/d/9t/2P/WP9U/1b/Wv9V/0L/P/9E/0v/Uv9X/1v/Xf9f/2D/Y/9h/1r/Uv9I/0X/TP9S/1z/Yv9k/2f/a/9w/3n/gP+Z/47/ff9z/27/Z/9f/1r/Vf9A/yz/Kv8n/yj/KP8p/yn/J/8l/yX/JP8j/yP/I/8j/yH/Iv8i/yH/I/8s/zf/PP89/z7/P/9A/z//PP84/zX/M/8w/yv/KP8n/yj/KP8o/yj/J/8n/yb/K/8u/zH/M/81/zX/Nf83/zv/Q/9N/0//Qv9G/1X/Wv8+/0H/T/9c/1T/Vv9Z/1z/Yv9N/1P/XP9K/1L/af92/3f/cP9s/2X/X/9X/1L/UP9Q/1H/UP9R/1P/U/9T/1L/Uf9O/0j/RP9B/z7/Pf8+/0D/Qf9F/0n/Tf9P/1P/Vf9W/1f/V/9X/1b/Vv9X/1v/X/9m/23/cv93/33/gf+D/4b/h/+J/4n/iv+I/4f/hv+G/4X/hP+E/4P/g/+D/4P/g/+F/4b/h/+I/4r/iv+L/4n/if+H/4f/hP9//3n/dP9y/3H/cP9w/2//bP9q/2b/Y/9f/1z/Xf9g/2b/a/9y/3n/fv+C/4f/iv+L/4v/if+H/4f/h/+F/4X/hf+F/4T/gv+L/5L/kf+R/4//j/+O/4z/i/+J/4j/iP+G/4j/iv+J/4b/g/99/3j/d/90/3X/dv93/3f/d/94/3r/e/97/4D/hf+K/47/kP+O/47/jf+N/4v/jP+R/5H/j/+N/4z/if+K/4r/i/+Q/5T/k/+Q/43/jP+L/yp9KnoqfSp6K30reip9KnsqfSp8Kn0qfSl9KX0ofSd+J34ofil+KX4pfih9KX4pfSl+KX0pfil9KX4pfil+KX4ofyh+KX8pfip+Kn8rfit/Kn4rfyt+K38rfit/LH4sfyt9K34sfSyALH0sfyx9LIAsfCyBLHwsgSp8KYEpfCmBKX0pgSh9KIEpfSmBKX0pgSl+KYApfimAKX4pgSl+KX8pfimAKX4pgCl+KYApfimAKX4pgCl+KYApfih/J34nfyd+J30nfid9J34nfCZ+JnomfyZ7Jn8meyZ+Jnsnfid7J38neih/KHoofil6K34reip9KnwsfSx8LH0sfCx9LHwsfCx8LHwsfCx8LHwsfCx8LHwrfC18LX0rfCt+Knwpfil9KX8pfSmAKH0ogSh9KIEnfSaBJX0lgSV+JYAlfiWAJH4kfyR+I38lfiV+In4ifiJ+IX4gfiB+H34ffiB+IH4hfiF+IH4gfSB+IH0hfiF9IIAgfCKAJXoohCxzPodWaG+HdWNuhXFjc4N2Zm+CamllgWFsXYBXbVaAXWtpg3FndoN2YnKBa2JggFNpRn81dDiBW3+Jgo+EfIJwhXKAc4dsfVyPUXtGkkd8UJRUekyWRHhBmEN4RJpHeE2ZS3hLmUp2TJpOdl2aXHVPmEZ2RJZCekGQQHxAjlJ9Vo5Efj2LQX8+ikSDPok+hWmCh4SBe3aCbX5kf1uGVH1EjTt8OJE4fTiRN3w3kDl6QpF+cn6Rcm5skmxtapNob2STY3BfklhvVpNXcFaTUnJMjzx0Lo4ueDGML3guji94MJAydzeSNXZklXJ2apVhdGCTY3Rnkml2c5JfdDmUXnN8mI9ymZebc5SVinWBlG51TpRSc16UQ3JhlX9xdpZzcUeYN2pym41geJ1sX2GbR2dHl0duTZVOcE6VZGiDl4hfd5toX16eT2VSnVRqUJxMbVObVW5QmVNtVpZZalyVXmZflV9lYpZkZmKXYGlSl0prTphXa12YYGhklmxpb5VsaXCWj2iZlo5mfJdvZmmVZWpilVttWZRTcT2RK3UojSZ6J4knfCiJJn0miCV9JYckfiOGI34jhSR+IoQhfiGDIn4mgjF8O4A9fD19P3tAe0F6QHo+fDt7OH42fTSBLYAmgSSAJoEmgSeAJ4ElgCSBJoAogSyAL4EwgDKCNYA2gDeAN383gDx6SYFGdUaDS3JQhEdxQ4VGck6FTW9ViGRnYolaalSHVnZWhE+DRYBJhmV+eoRxf2yBZoBeglh+UoRQfFCEUXtPg1F6UYRRelGEUntRgkx9SIJDfkCBPn49gT5+QINEfEeDSnpNhU94U4ZVeFaHVndWiVV2VIpVdVaLWXFdjWNuapFwbHaSfG2AkYFuh4+IcIqOinGJjYhzh4yGc4WLhXOEjYVyhI2DcoONg3KDjIVyhomIdoiFi3qKfYp+inyMf4p7h4CDgH5+eIdyd3CLcXJxkHBwbpFscWqPZXJijV50XYxdc2GLaG9ukHRtepB/bYSPiHCKj4pziYyIdIaMhnOGjIZzho2EcoSLhHSHf5B6knCSgpFmj4OOZoyDi2iKg4lriYKJdIaCiHmFgYJ+fX16hXd3d4x2c3WPd3B3kXdveJJ5bnmSem17knxsgJGGbYuNjnOPiY55joeNeo2GjXuOfpF+kHSPgIxwioOKcImCi3OPf5J7lX6Tgo97jYWNeoyHKv8q/yr/Kv8r/yv/Kv8q/yr/Kv8q/yr/Kf8p/yj/J/8n/yj/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yj/KP8p/yn/Kv8q/yv/K/8r/yv/K/8r/yv/K/8s/yz/K/8r/yz/LP8s/yz/LP8s/yz/LP8s/yz/Kv8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8o/yj/J/8n/yf/J/8n/yf/Jv8m/yb/Jv8m/yb/Jv8m/yf/J/8n/yf/KP8o/yj/Kf8q/yr/Kf8r/yz/LP8s/yz/LP8s/yz/LP8s/yz/LP8s/yz/LP8s/yv/K/8r/yv/K/8q/yn/Kf8p/yn/Kf8o/yj/KP8o/yb/Jv8l/yX/Jf8l/yX/Jf8k/yT/JP8j/yT/JP8i/yL/Iv8h/yD/IP8f/x//IP8g/yD/IP8g/yD/IP8g/yH/If8g/yL/Iv8n/y3/PP9W/3D/df9u/27/c/93/3D/af9m/2L/XP9U/1D/UP9e/2v/cv94/3b/b/9n/13/UP9E/zX/Nv9N/3f/hv90/23/cP9z/17/TP9U/0X/RP9M/0j/Rf9B/z//RP9F/0f/Rv9J/0n/Sf9J/1D/Vv9W/0//Rf9F/0b/P/8+/z3/O/85/0T/P/8//z7/Pf9B/0D/Sv+B/4D/dP9s/2f/ZP9U/0H/O/82/zf/Nv80/zT/Nv84/2L/fv9z/23/av9n/2X/Y/9f/1z/Uf9M/07/Tf9J/0X/Nv8q/yr/L/8u/yz/Lv8v/zD/Mf84/0//b/9q/2X/ZP9j/2H/Yv9m/3D/W/9j/3v/iv+Q/4z/hP96/23/Uv9G/0b/Q/9C/1f/fv91/3D/Vf86/3b/iv90/2v/XP9C/0X/R/9M/0v/Uv9r/3b/df9p/17/VP9T/1T/Vv9Y/0P/PP9Q/1r/Wf9b/1r/Xf9g/2L/Y/9k/2b/Zf9i/1b/UP9e/2f/af9n/2z/eP9s/13/d/+T/5D/fP9u/2f/Yf9f/13/Vv9V/1L/P/8r/yj/KP8n/yj/J/8m/yb/Jf8l/yT/I/8j/yT/I/8i/yH/If8h/yn/Nf88/z7/Pv8//0D/Qf9A/z//Pf88/zj/Nf8r/yT/Iv8j/yP/JP8k/yP/I/8l/yb/Kv8u/zH/MP8z/zf/Of88/zv/Ov85/zj/OP85/0P/Tf9M/0z/Uf9b/1X/WP9f/2H/V/9F/0n/X/9k/0v/T/9x/3T/bf9k/13/WP9T/1H/UP9P/1H/Uf9R/1H/Uf9Q/0//TP9I/0P/QP8+/z3/P/9B/0P/Rv9J/07/T/9T/1T/Vf9W/1b/Vf9U/1T/Vf9X/1z/Yv9r/3D/d/98/4D/g/+H/4n/iv+K/4n/iP+H/4f/hv+F/4T/hP+E/4P/g/+D/4P/hf+G/4j/iP+J/4v/iv+K/4v/iv+I/4D/ff93/3L/cP9x/3H/cP9u/2z/av9k/2H/Xv9d/17/Yv9p/3H/df97/4D/hP+I/4r/iv+J/4j/hv+G/4X/hf+F/4T/hP+F/4//kf+Q/5L/kP+P/47/i/+K/4j/iP+I/4n/iP+C/3//fP93/3f/dv92/3X/dv92/3f/d/93/3j/eP96/3v/ff+D/4f/jP+O/4//jv+O/43/jf+M/4//kf+O/43/iv+J/4n/iv+M/5H/k/+V/5P/j/+N/43/jP8qfip7Kn4qeyp+Knwqfip8KX0pfSp9KX4pfCl9KX4nfih+KX4pfil+KX4pfil+KX4pfil+KX4pfip+Kn4qfip+KX8pfyp/Kn8pfil/Kn4qfyt+LH4qfix+K34rfCx+LH4sfSx/LX0tfy19LYAufS6BLHwsgCx8LYArfCqAK3wrgCp9KoErfSuBKn0qgSp9KoEpfSmAKn0qgCt9K4AqfSqAKn0qgCl9KYApfimAKX4pgCl+KYApfimAKX4pfyl+KX8nfid/J34nfyd+J30nfid9J38nfSd/J30nfid8KH4oeil/KXoofyh6KX8peip/KnoqfSt5K30reSt9K3otfS16LH0seyx9LHssfSx7LH0seyt8K3wqfCl8Kn0qfSp9KX0pfSl+KH0ofih9J34ofSh+Jn0lfyV9JX8lfiWAJX4lgCR+JIAkfiOAIn4ifSJ+In0ifiF9H34hfB9+H3wffh98H38ffSB/IH0gfiB9IYAhfSB/I3snhCl1OYhUaW+IdmNwhW5hc4J3ZXOCa2hlgWFtWoFUcU2BSnBPgV1uaYJvaXSCc2JtgWVjW4BObEN/N3U1gUl/XYKBg2uBZoRofnGJU3xFk0d6Q5U9e0KVRXlHlkN4QplEeEWbSHhGmkd4SZpJdkmaS3ZRmVF1TpdGdkCVQnhCkUN5RY5Eez6NO3xCiz19PYk+gj+GQIQ6g22De35yg2t/ZoBjhU19QI1Eej2QNHsxkDF8Mo8zeTWPO3VykHJvaZJlbWWTZXBikGByWpBRdEuOTnVPi0t2RYo2eC2KKnsqiS17LYsuey+ML3kujjd3QJFpdW6UaXRmk2J0YJNcdmCSanVpkmlyd5WEcoaVf3V4k2x1VJM+dEaTQnRBlEtyWJZ9cXiYanJimEJuepmGZ3SYZmVXl0BrQpVIb0qSTG9WkmRsZ5NlaFyVVGlTmlRsVptWb0WaNHAumjhuVplnaGCaYGdfl2NmZZZkZWSVZ2dnl2doXJdfZmmZbWZsmHJpe5hybV6YYGyCmIhpfJZsaGWVX2tdlFxtV5VRcFCTTnI+kSt2JY0meieJJ3wniCd8JoglfSWGJX4khiR9JIUhfiKEIX4igyZ9MYA6fT1+P3tAfEB7QHtDekJ5QHs/ez59O3s0fix8JH8igCJ/IoIkfiSDIn4igySAJYMngCqDLoAvgjGANYE6gD2APX89fTeAMX4ugSt9LoI2e0iCVntYhFB7UoZZdVmHaXJphkx3SYRifWKBWoRMfW2GdX5rg2OAXIBYf1h/Wn1SgE97UIJQe1CEUXtRhFF7ToNKfEaDQX4+gj19PoJAfEOEQ3tGhEp6TYZQeFKGU3hShlV3V4hUdlOKU3VVi1dwW45ibmqQcG12knxtf5CCb4ePiXGLjolxiIyIcoeMh3OGjIVzhIyFcoWNg3KDjYNyhIyGdYeHinmLgYx9jXyLf4p7i4CJfIV/gIJ7fnSIcndwjXBycI9wcG6RbHFqj2NzYI1ddF2MX3FljWlucJF1bHyQg22Gj4hwio6Lc4mMiHOGjIRzhI2FcoWMhHOEiIp5kXWTf5JokYOOZo6Di2uJg4luiYGIcoeAiXqEfnqFeXh5i3dzd5B3cneRdnB3kndvd5N3bnaTeG55k3pte5F/bISRiW+NjY5zkImPd42IjnmNhI17kHmOf4txi4GJcYmChnOJgY55lX6WgZR7koWOeoyIjXmLhyn/Kf8q/yr/Kv8q/yr/Kv8p/yn/Kf8p/yn/Kf8p/yj/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kv8q/yr/Kv8q/yr/K/8r/yr/Kv8r/yv/K/8s/yv/K/8r/yv/LP8t/y3/Lf8t/y3/Lf8t/y3/Lf8s/yz/Lf8s/yz/K/8r/yv/K/8r/yv/K/8r/yv/Kv8q/yr/Kv8r/yv/K/8r/yv/K/8r/yv/Kv8q/yn/Kf8q/yr/Kf8p/yn/Kf8p/yn/Kf8p/yj/KP8o/yj/J/8n/yf/J/8n/yf/J/8n/yf/J/8o/yj/Kf8p/yj/KP8p/yn/Kf8p/yr/K/8r/yv/LP8s/y3/Lf8t/y3/LP8s/yz/LP8s/yz/K/8r/yr/Kf8p/yn/Kf8p/yr/Kv8o/yj/KP8n/yb/Jv8m/yX/Jf8l/yX/Jf8m/yT/JP8k/yP/I/8i/yL/Iv8i/yL/If8g/yD/H/8f/yD/IP8f/x//IP8g/yD/IP8h/yH/I/8l/yv/N/9W/3D/ef9v/2z/cf92/3b/b/9n/2H/XP9V/03/RP9F/0//Xf9n/27/cf9z/2v/Yv9X/0r/Pv80/zL/NP9g/37/aP9n/23/b/9K/0b/Q/8+/zr/QP9D/0f/Rf9E/0T/Rf9E/0f/SP9I/0n/Sf9G/0v/T/9R/1T/WP9k/27/bv9x/2//a/9j/1X/Uv9V/1//UP83/zn/V/94/3H/av9n/1//T/9C/0D/Of8z/zL/Mf8y/zP/Mf8y/0j/cv9q/2P/Yv9h/1//Xv9Z/1H/TP9J/03/Tv9N/0f/O/8u/yr/Lv8x/y//Lv8v/zL/M/83/0r/b/9u/2n/X/9c/1v/Xf9i/23/c/93/3v/fP91/2v/XP9B/z//Qv9E/03/U/9g/3L/bv9f/1//Tf91/4T/c/9l/1P/Qf9H/0n/Sv9N/1r/Xf9a/1j/Vv9U/1P/Vf9S/0D/MP8u/zT/Q/9f/2r/bf9u/2v/Z/9n/2b/Z/9p/2n/Zf9j/2v/b/9y/3T/ev9n/1v/V/9g/3r/e/9s/2P/Xf9Z/1j/Wf9S/1D/Tf9K/zv/Kv8m/yX/Jv8o/yf/J/8m/yX/Jf8l/yT/I/8i/yL/Iv8h/yP/Lf85/zz/Pv9B/0H/QP9A/0L/QP9A/z//Pv87/zX/KP8i/yP/I/8j/yP/JP8j/yP/JP8l/yX/Jf8o/yr/Lv8x/zP/N/85/zj/Nv8y/yz/K/8r/y7/PP9S/2D/Wv9b/1//Yf9s/2b/Yf9Q/0n/Rv9T/0r/Zv9y/27/Zf9c/1f/X/9e/17/Wf9P/1D/UP9Q/1D/Tv9L/0j/RP9B/z7/Pf8+/0D/Q/9G/0n/TP9O/1H/Uf9R/1H/U/9U/1P/Uf9R/1T/WP9c/2P/a/9x/3j/fv+A/4P/h/+K/4r/iv+J/4j/h/+G/4X/hf+E/4T/hP+D/4P/g/+E/4b/h/+K/4v/i/+M/4v/iv+K/4n/hP+A/3r/dP9x/3D/cP9w/3D/bv9r/2n/Y/9g/13/Xf9g/2b/bP9z/3b/fP+D/4f/iv+M/4v/iv+I/4b/hf+F/4X/hf+D/4f/jP+O/5L/kv+P/47/i/+H/4f/h/+I/4n/h/+A/33/ef94/3n/eP94/3f/d/92/3f/d/93/3j/eP94/3r/ev97/3//hP+I/43/j/+P/47/jv+N/47/kP+R/4z/iv+J/4j/h/+J/4z/k/+W/5b/k/+Q/47/jP+L/4v/KH4ofCl+KXwpfil9KX4pfSh+KHsofSh8KXwpfSl+KX4pfil+KX4pfil+KX4pfil+KX4pfil+KX4qfip9Kn4qfSt/K34rfyt+K34rfit+K34rfit+K34sfix+LH4sfi1+LX0ufy59Ln8tfS2ALX0tgS18LYAufC6ALHwsgCx8LIArfSuBK30rgSt9K4EqfSqBK30rgCt9K4AqfSqALH0sgCx9LIArfSqAKn0qgCt9K4AqfSmAKn0qgCl+KX8pfil/KH4ofyh+KH8ofih9J34nfSd/J30nfyd9J34nfCh+KHopfil6Kn4qeil+KXsqfip7Kn0qeyt9K3ssfSx7LH0sey19LXwsfSx8LH0seyx9LHsqfCp7K3wqeyp9KnopfSl8KX0qfil9KX4pfSZ+JX0lfiZ9JX0kfSR9I34jfSV+JX0kfiJ+IX4ifiN+I38ifiJ/IX4hfyF+H34gfiB9IH4gfSB/IH0gfyB9IYAhfSCBIXojhSdyNYdRam6IeGRyhm5kcIN1Y3WBc2VsgWNrXX9WcEx/QXM9f0RxUIFdbmaCb2dygnBiaYFeY1eASmk8fzRyMYIxfGaDfIFrgWiEb3xriUV5RZQ/dzmXOXg9lkJ4RZdGd0aZRXdFm0R4RppJeEWaQ3ZGmUN3Q5dMd2mVgneQkpV0mo+QboaOeGx2jndtaYxVeF+FcYJ5fVmFN3o/hHN+boNrf2WAW4JNfT+INnoyjTF5MY8xejCOLnovjTF4M45YcmuPY29gkV5xXY5cc1iMUnVNikp3SYZKek2CTn1OgEd+OYErfiqCLX0vhS18L4czeTSNM3hSj3J2bZBhdleQWHZZkVx1YZFtdnqTdnZwk2pzYpNNczyTQHE/lEJwXZdgcGeeYm9ZolpxWKBSb22WgWttk2BrTpRIb0qSTXBMkU9wUpNSbVSUVG1Vl1NuUZdNcT2YM3EwmDNvQJdTZ2eacWF0nnhhept2Y2+Ya2Jpl2xhbJhqYW2ZcmF5m31kcppaakmbWm1QnVdtZp1ma2OYXmxblVhuWZNUcE2USnFIk0R1NY8neCSMJnsmiSd8KYgofCeHJX0lhiV8JIYjfSKFI30ggiN9KYE3ej1/Pno9fkB6QHxAekB7QXlBekB6QHs/fTx7M34mfB9/IIAjfyOCIn4jgyV+JIMkfSODJH0kgyV/J4IofymCLIAtgS6AKoArgSqAK4EqgCmBK4EtgjeCUINcgVKEWoNjhGSCYoRhfVuEXHhpg1t+S39bhXN+b4Fpf195Y4Bbd0B/VnhffVOAT3tPhE97TYRMe0iER3xDhEB9PYM9fD6DQXtChER7R4VMek+GUXhRhlF4UoZUd1KIUXZQilF1U4tYcVyNY25rkHNteZB9boCQg3CHjopxio2JcYiMh3KFjIRzhIyEc4OMgnKCjYJygo2DcoOLhXWHhYp6i4CLfYt8in+Ke4qAiXyFf36CeXtziHB0cI5wcXCRb3BtkWpxaI9jc2GOXXRejWJwZ5BubHOQeWx9kINtiI+KcI2Oi3OJjIhzhoyGc4aNhHOEioZ2jHqQfJNskYGQZo2Di2mJg4duhYOFcoqBint/eXuHe3J4j3hweJF4cHmReW94knZvd5N3b3eTeG54k3drd5N6anyRgW2Gjolxj4qQd4+HjnqOhY17kH+SfZF1jICKcImCiHKIgot0joCTfJd9lYOSeo+HjniMiYt4ioko/yj/Kf8p/yn/Kf8p/yn/KP8o/yj/KP8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yr/Kv8q/yr/K/8r/yv/K/8r/yv/K/8r/yv/K/8s/yz/LP8s/yz/Lv8u/y7/Lv8u/y7/Lv8t/y3/Lf8t/y3/Lf8s/yz/LP8s/yv/K/8r/yv/K/8r/yv/K/8s/yz/LP8s/yv/K/8s/yz/K/8r/yr/K/8r/yv/K/8r/yr/Kf8q/yr/Kf8p/yn/Kf8o/yj/KP8o/yj/KP8n/yf/J/8n/yf/J/8n/yf/KP8o/yn/Kf8q/yr/Kf8p/yr/Kv8q/yr/K/8r/yz/LP8s/yz/LP8s/yz/LP8s/yz/LP8s/yr/Kv8p/yn/Kv8p/yn/Kf8o/yj/KP8o/yj/Jv8m/yb/Jv8l/yT/JP8j/yP/Jf8l/yT/JP8i/yL/I/8j/yL/Iv8h/yH/If8f/yD/IP8g/yD/IP8g/yD/IP8h/yH/I/8k/yj/N/9M/2v/d/9t/23/c/91/3b/df9x/2n/Yf9a/0//Qf86/z3/RP9P/17/aP9t/27/bP9m/17/Vf9I/zz/NP8z/z7/dP92/2j/Z/9u/2P/Qf9D/0D/Ov85/z//Rf9D/0T/Rf9E/0P/Qf9F/0j/S/9G/0L/Qv9I/2j/j/+j/6r/qv+h/5X/i/98/3f/eP97/2j/V/9n/4L/e/9U/y//YP9v/2z/Zf9b/0v/Pf82/zL/Mv8z/zH/L/8u/y//Mf8y/zz/ZP9j/1//W/9Z/1j/Vv9T/1D/TP9L/0v/S/9L/0//Tf9K/0L/Nv8x/y3/K/8t/zP/Mf8r/y//Wv9m/17/WP9V/13/Xf9f/2b/b/93/2r/Yf9Z/0P/Pf88/0b/Yf9j/2L/YP9d/1r/UP9U/2T/ZP97/2T/Vf9H/0j/Tf9Q/1H/Uv9U/1X/Vf9V/1H/T/9I/z//NP8x/zH/O/9O/17/bf93/3T/cv93/3j/df9y/3H/cf9x/3D/cv9z/3T/df9d/0f/Vv9P/0T/Uf9a/17/X/9b/1j/Vf9V/1L/TP9I/0X/P/8y/yb/JP8n/yf/J/8n/yf/Jv8l/yX/Jf8k/yP/I/8i/yP/KP8z/zz/Pf8+/z//QP9A/0D/QP9B/0H/QP9A/z//PP8y/yX/H/8g/yP/I/8i/yP/Jv8m/yP/I/8k/yT/Jv8u/yn/Kf8m/yX/Jv8q/yr/Kv8r/yr/K/8r/yz/Lv8z/0b/Sv9b/1//X/9Y/2D/ZP9a/1//Wf9M/1b/cf9y/2L/Wv9F/yn/NP9O/07/TP9P/0//T/9N/0z/SP9F/0L/P/89/z3/Pv9B/0L/Rv9J/0z/T/9R/1H/Uv9T/1L/Uf9Q/1D/Uf9T/1j/X/9k/2z/c/95/33/gf+E/4f/iv+K/4n/iP+H/4X/hP+F/4T/g/+C/4L/gv+C/4P/g/+G/4j/iv+L/4v/i/+K/4r/i/+I/4P/fv96/3T/cP9w/3D/cP9v/23/af9n/2L/YP9d/17/Yv9o/27/dP95/37/g/+H/4n/jP+K/4n/h/+F/4X/hf+F/4b/iv+Q/5P/kf+S/4//jf+L/4v/jP+K/4f/i/+E/3n/d/95/3r/ef94/3j/ef94/3f/d/93/3f/dv93/3f/d/94/3r/fP+D/4f/jf+P/5D/kP+O/47/jv+R/5P/jv+N/4z/if+I/4f/i/+R/5T/lv+S/5H/j/+O/4z/i/+K/yl+KX0qfip9KX4pfSl+KX0ofih9KX4pfSl+KX4pfil+KX4pfil+KX4qfil+KX4pfil+KX0qfip9Kn4qfCp+Knwrfit9K34rfSx+LHwrfit8K34sfi1+LX4tfi5/LX4ufy99L38ufS5/Ln0ugC59LoEtfS6BLX0sgS19LIEtfS2BLH0sgCx9LIAsfSyBLH0sgS19LYAsfSyAK30rgCx9LIAsfSyAK30rgCt9K4ArfSuAK30qgCt9K4AqfSqAKn0qgCl9KX8ofSh+KH4ofid+J30ofih9KH0oeyl9KXsqfSp7Kn0qeyp9KnkqfSh6Kn0qeip9KnoqfSp6LH0seyx9LHsrfSx8LH0sfCx9LHwsfSx8Kn0peyh9KXspfSl7Kn0qfCh9J34mfSZ+Jn0lfiV9JX4lfSV+JX0lfyV+JX0mfid9Kn4qfCV+JH0jfiKAIn4hgCJ+IoAhfiCAIH8gfyB/IH8ifyN9IIAgfCGBIXolhCh0MIhJamqJd2RthmhkboN0ZXiBdGVzf25pZn9cb1N+Q3M3fjZzP39IcVGCXmxohG9mcIJsYWeBXGVRfkZsOn80eDaDUH9+hXKEYYFihWx9X4lBeUKVQXc6mDZ3P5dFdkKZQnZCm0N2Q5tAd0ObSHlRm0p5P5dIeV6Viniek6V4rY6lcZSNjm2SjZRqio2BaoGMcXJaiGKAfXiJhnduO4RGdXKCa3xlgVqBT35AhjZ5Mo0yezKNM3sziy97LowxeTWNNXc+jV50YI1XclaMVXRUiVN3UodOekyETXxNgEt+TH5Mf0t7S4FIfDyAL38pfyyDL3ktiSZ4J4o0d1+MYnZfjVt2WI9bdV6QZHRlkXFzbpJec1KRPXM7lUBwXpdfb1WdWm5ap1xsV6xQb0emUHFRmWtwYJRQcEORSnJKkE1yTpFSb1iTXG1glV1tWpdOcEWYO3IzlzFxM5dFbVmXZmRwmHZfdZtxX3CbcmFxmW1iaplsYW+ab2BunG5gbJtwZ0ubT2xVnEdvRp5RblubXW1cmFpuVpVVcFSUTnBKlEZyQpI6di2NI3kjiSR8JYcmfSeHJ30lhyV9JYUlfSSFI30jhSR8J4MyezmCO3s8fz57P34/ekB8QXpBfEF7QXtAe0B7P306fC9+I30hfiCAIX8igiJ+IoMjfiaDI30hgyJ+JYMpgCuBKYApgiuBK4IqgCqBK4ErgSuBK4EsgSqCLIEvgy+AMYNEgVaHbYJph2eFZoFfhmZ5aoZYfFKBVoJufmd/aH9gek6AK3sxfUZ9T3tQg056ToVOekyFS3tHhER8QYQ+fD2DPXs+g0F6QoVEekeFTXpPhlB4UIZSeFKHUXdQiVB2UIlPdVKLWXJgjWdvb491bXuQfm6Cj4VxiI6JcYmNiXKIjYdzhY2Ec4SMgnKBjIJxgo2BcYGMg3KEi4Z1iYSKeot+i32LfYuAin2JgIWAgn5+hHl5c4pvc2+Qb3FvkW5wbJFocWSRYXFgkF9xYZBkbmqScGt2knxrgJCEbYiPiXGLjYlzh4yHc4WPhHWFi4Z2i36QfJFtlIGSZI+DjmaOhI5ri4SMbo2DjHWFf3yEe3N5j3pweJN5b3iTeG93k3dveJR4b3iUeG14lXhseJV3a3iUe2p+kYRui4yPdZCIj3ePho55joWPfJJ7kX+NcoyBi26KgYpxiYCMeJR+l4GWeZOIkXiOiYx3jImKd4qJKP8o/yn/Kf8o/yj/KP8o/yj/KP8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yr/Kf8p/yn/Kf8p/yr/Kv8r/yv/Kv8q/yv/K/8r/yv/LP8s/yz/LP8r/yz/Lf8t/y3/Lv8u/y//L/8v/y7/Lv8u/y7/Lv8u/y3/Lv8s/yz/Lf8s/y3/Lf8s/yz/Lf8t/y3/Lf8s/yz/K/8r/yz/LP8r/yz/LP8s/yz/LP8s/yz/LP8s/yz/K/8r/yr/K/8r/yr/Kv8q/yr/Kf8p/yj/KP8o/yj/J/8n/yj/KP8o/yj/Kf8p/yr/Kv8q/yr/Kv8q/yr/KP8q/yr/Kv8q/yr/Kv8s/yz/LP8s/yv/LP8s/yz/LP8s/yz/LP8q/yj/Kf8r/yn/Kf8p/yn/KP8m/yb/Jv8m/yX/Jf8l/yX/Jf8l/yX/Jf8l/yb/Kv8w/zD/Jv8j/yL/If8i/yH/Iv8i/yH/IP8g/yD/IP8g/yH/If8h/yH/I/8l/yb/Mf9G/2T/ef9v/2f/a/9y/3j/dv92/3L/av9h/1f/Sv84/zD/N/9B/0r/VP9g/2n/cP9y/23/Zf9b/0//RP84/zH/PP9h/4P/cP9l/2b/bv9a/0D/RP9A/zn/Nv88/0P/RP9B/0H/Q/9D/0L/RP9F/0j/Rf9L/2T/g/+Z/6D/pP+s/6f/nf+V/5j/nP+P/33/dv90/2r/hf+P/5H/hv9l/zP/cP9q/2X/XP9S/0P/Mv8u/yz/LP8q/yr/Kv8r/yz/L/8w/y//O/9W/1z/V/9T/1D/UP9P/07/Tf9M/03/S/9N/0v/Sv9J/0j/Rf9A/zX/Lv8x/y7/Kf8k/yn/Ov9a/17/Yf9i/2P/Yf9d/17/aP9o/2H/SP86/0L/Vf9a/1f/W/9g/2H/Wf9S/0z/Sf9E/0f/Tv9Y/03/Rv9M/1H/T/9P/1L/Vf9b/2H/X/9W/0z/QP85/zP/MP83/0r/X/9r/2//dP92/3P/bv9t/2z/Z/9l/2n/av9n/2f/X/9c/1r/R/9a/07/Sf9I/1L/Xf9e/1z/Wv9W/1X/Uv9K/0b/Q/9A/zX/Kv8k/yT/JP8k/yf/J/8m/yf/Jv8m/yb/Jf8j/yP/Jv8w/zj/O/87/zz/P/9A/z//QP9B/0H/Qf9B/0D/QP8//zr/L/8j/yP/Jf8h/yH/Iv8i/yL/Iv8j/yP/Jf8n/yj/Kv8q/yr/K/8r/yr/Kv8r/yv/K/8r/yv/K/8u/y//M/84/0D/VP9i/2j/bf9v/2n/ZP9l/1X/Tf9X/2n/av9l/17/XP9Y/1X/T/9O/03/Tv9O/07/TP9K/0b/RP9B/z7/Pf89/z7/Qf9C/0f/Sv9N/07/UP9Q/1L/Uv9Q/1D/T/9P/07/U/9a/2D/aP9w/3X/e/9+/4L/hf+I/4n/if+J/4j/h/+F/4T/hP+C/4H/gv+C/4H/gf+C/4X/h/+K/4r/i/+L/4v/i/+K/4n/hf+B/33/df9x/2//b/9v/2//bv9s/2j/ZP9h/2D/YP9i/2b/bP9y/3j/fv+C/4b/i/+M/4r/iv+I/4f/hf+E/4b/iv+O/5L/kv+T/5L/kP+N/43/jv+N/47/jv+N/37/ef97/3n/ef94/3j/eP94/3f/d/93/3f/d/93/3f/d/93/3f/ef98/4L/h/+N/5D/kP+R/5H/jv+O/5D/lf+Q/43/jP+L/4r/iv+L/5D/lf+X/5X/kv+Q/47/jP+M/4r/iv8ofih+KH4ofil+KX4ofih+KX4pfil+KX4pfip+Kn4qfip+Kn4pfil+K34qfit+K34qfip9K34rfSt+K3wsfix8LH4sfCt+K3wsfix8LH4sfCx+LH0ufi59LX0tfy99L34ufS5/Ln0ufy59Ln8ufS6ALn0ugS19LYEufS6BLn0ugSx9LIAufS6ALX0tgS19LYEtfS2ALH0sgCx9LIAsfSyALH0sgCx9LIAsfSyALH0sgCx9LIArfSuAKn0qgCt9K4AofSh/KH0ofih+KH4ofih9KX4pfCl9KXspfSl7KX0peyp9KnsrfSt5Kn0qeit9K3orfSt6K30reit9K3srfSx7LH0sfCx9LHwsfSx8LH0rfCp9KnspfSl7KX0peyh9KHwnfSZ9JX0lfSV9JX0lfSV9JH4kfSR+JH0kfiR9Jn4mfSl+KH0lfiN9In4ifiF+IX4ifiJ/IX4hfyF/IX0hfyF9IH8gfSGAInskhCl1LYhAa2GIdWRzhmtja4RyZXaEeGd4gXRpb4BlbVx+TXE+fjB0MX86dESBUHBag2JraoNxaHKCaWdjgFhpTIBDcDeBMXxFhHWFgoRshmeAaoZxe1aLQXlGlT53OZg5dz+ZQ3ZEm0N2QptCdkObQXdDmkV4RJlJeWGYgXiXlaN3ppKodaqOrHKqjKFunIuZbZaKh212inlweoqSfI58jYWOZ3yFRWlkgmx1ZoFgfFeBT3xHgEd+RoBFf0WARoBFfkaBSnxMhVd6WodUeEiJTHVSilN2UopPd06HTXpMhEt8S4BLfkt8S39Ie0eBRHxEgER/Pn83gzN8LoYqeyeJI3olij54WYxZdleOW3Zcj111XZBedF2RYnNVlElxUpxZblKnVG1Xq1ZuVaxTbk2pSnBHo0BzNJs7dEWVQXVEkkl1TZJMdEyRUXBUkldvXJVccFaWSXI8lzdzMJUxcj2VUG5glWxncJZ0Y3aZdGNumWtjaJlnZGaZaWNpmmdkZZxfaFubTmxVmlJvR5tIcE2cWmxhm2FsXphbb1WUU3FNk0dyRJFAdD2QMXcoiyR6I4gjfCWHJX4lhyZ9JocmfSaFJn0khSJ9IoUrfDWDOXs6gjx7Pn8+ez9+P3pAfUJ6Qn1Be0F9QHtAfT99On0vfiN+I34kgCN/IoIifiGDI34jgyN9IoMifiWDKIAogSqAKoIrgSuCK4ArgSqBKoIqgSuCLIEugzGBNIQ4fz2HQn9EiUd/VIhmgmeFZ4RtgGmFToJMgl6Can1qfmR+YHtaf1R/THxMgU56TYROek6FTnpNhUt7R4RDfECEPnw9gz57P4NBekSFRnpJhU16TYZQeFCGUHhQhlB3UIhOdk+JT3VVi1pyYo1pb3GPeG19kH9ug4+FcYiOiHGKjYhyh42Fc4ONg3OCjIFygIyBcYGNgXGBjINzhomIdoqDinqKf4p9iX6Ifoh+iH6EgX98eoV0d3CLb3RvkG9xb5FtcGuRZ3FlkWNxYpBicWOQaG5uknVrepJ+bIKQiG+Mj4xxio2Ic4eNh3OGi4Z3ioCQe5JxkoGRapCEjmmPhI9pj4OPbJGEjnKOgoF/eXd5kHhweZJ3b3iTeG54lHhud5R4bniUd253lHdtd5V3bHeVeGt6lH1qhJGJbpCMknWSiJB5joeOeo6Ak32TdY2AjG+MgYtxiYGIdouAkXuWfpeElXmRiI94jYmLd4uKi3eKiij/KP8o/yj/Kf8p/yj/KP8p/yn/Kf8p/yr/K/8q/yr/Kv8q/yr/Kv8r/yr/K/8r/yv/Kv8r/yv/LP8s/yz/LP8s/yz/K/8r/yz/LP8t/y3/Lf8t/y7/Lv8t/y7/L/8v/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lf8t/y7/Lv8u/y7/LP8t/yz/LP8s/yz/Lf8t/y3/Lf8s/yz/LP8s/y3/Lf8u/y3/LP8s/yz/LP8s/yz/LP8s/yv/K/8r/yr/K/8r/yr/KP8o/yj/KP8o/yj/KP8p/yn/Kf8p/yn/Kf8q/yr/Kv8q/yv/K/8q/yr/K/8r/yv/K/8r/yv/K/8r/yv/LP8s/yz/LP8s/yz/LP8s/yv/Kv8q/yn/Kf8p/yn/KP8o/yb/Jv8l/yX/Jf8l/yX/Jf8l/yP/JP8k/yT/JP8j/yP/Jf8k/yL/I/8i/yL/If8h/yL/Iv8h/yH/If8h/yL/Iv8h/yH/I/8l/yj/Mf8//1v/dv9z/2v/a/9x/3b/dv92/3b/b/9m/1z/Uf9C/zT/L/81/z7/SP9V/17/Zv9u/3H/bv9n/1//Vf9J/z3/Nv83/1b/e/+C/2z/Zv9p/3H/VP8//0X/Pv85/zn/Qv9F/0X/RP9D/0P/Q/9C/0P/Rf9I/1n/cP+L/5f/mv+k/6z/q/+q/67/o/+h/57/nP+U/3L/hv+H/3//gP+I/5L/hv9p/1H/ZP9f/13/Xf9c/1n/Wf9W/1T/Vf9U/1P/VP9U/1L/V/9X/1n/W/9T/07/Tf9O/0v/TP9L/0z/S/9K/0n/Sf9K/0j/Rf9F/0L/Qf8+/zr/N/8z/y3/KP8m/yf/Jv9D/1f/UP9Q/1f/XP9Z/1f/Wv9g/2L/Vf9V/1f/Wf9V/1T/Uv9Q/0v/R/9C/0L/P/80/zP/Pv9I/0P/Rf9J/0r/TP9P/1H/Vf9Y/1f/Uf9G/z3/N/8y/zL/Pv9O/13/aP9w/3j/eP9x/2v/af9p/2b/Zv9m/2f/aP9n/1j/RP84/0b/Tf9K/0j/Uv9e/2D/Yf9c/1j/Vf9Q/0j/RP9B/z3/Of8s/yX/I/8i/yP/JP8k/yX/Jv8m/yb/Jv8l/yP/I/8m/zD/OP87/zz/Pv9A/z//P/8//0D/Qv9C/0H/Qf9A/0D/Pf87/y//I/8g/yD/Iv8i/yH/If8j/yP/I/8i/yL/Jf8n/yr/Kv8q/yr/Kv8q/yr/Kv8q/yr/K/8v/zD/Nv85/z//PP89/zz/P/9E/0v/Uf9f/3H/bf9J/0f/WP9Z/1//ZP9l/1v/U/9W/1H/Tv9O/07/Tv9O/03/TP9I/0X/P/89/z3/Pv8//0L/Rv9I/0v/Tf9N/1D/UP9Q/1D/T/9P/07/T/9R/1b/XP9i/2n/cf96/37/f/+D/4X/iP+J/4n/iP+H/4X/g/+D/4L/gf+A/3//gf+B/4H/g/+G/4n/i/+L/4v/iv+J/4j/iP+E/4D/fP91/3H/bv9v/2//b/9v/2z/av9n/2X/Yv9j/2X/Zv9q/3H/d/97/4D/hP+K/43/jP+K/4n/iP+F/4X/if+S/5P/lP+R/5H/j/+P/47/jv+O/4//jv+P/4b/d/95/3z/ef95/3r/eP94/3f/d/94/3j/eP93/3f/dv92/3f/d/94/3r/fv+F/4v/kv+T/5L/kf+P/4//kv+V/5H/jf+M/4v/iv+H/4r/jP+S/5X/lf+V/5H/j/+N/4z/jP+L/4r/J34nfyh+KH8ofyh/KH8ofyl+KX4pfil+KX4pfit+K34rfit+LH4sfit+K34rfit+K34qfCt+K3wsfix9LH4sfCx+LHwsfix8LX4tfC1+LXwufi58LX4tfi99L38vfS9/L30vfy59Ln8ufS5/Ln0ugC59LoAufS6ALn0ugS59LoEufS6ALn0ugC19LYEtfS2BLn0ugC19LYAtfS2ALH0sgC19LYEtfS2BLX0tgSt9K4EsfSyAK30rgCp9KoAsfSyAK30qfip9Kn4pfil9KX4pfCp+Kn0pfil8KX0peyp9KnsqfSp7Kn0qeip9KnsqfSp7K30reyt9K3srfSt6K30reix9LHssfSx7K30qeyp9KnspfSl7KH0oeyd8J3wnfid8Jn4leiV+JXolfiV8JH4kfCR+JH0kfiR9JH4kfiR+JH4mfSR/I30jfyN+I34ifiF+In4ifyF+IX8hfyF+In8ifSN/Inwlgyl1MYc9bFiHc2NxhmphbIVwZXKDcmhzgnJsbX9kbll9TnFDfTV2L4AwdzeCQnNNg1ZuYoVpam+DcGdrgWVoW4BPbEN/N3M1gUJ/ZYR+iH+BbIhof2aHbHtPjUB5Q5ZAdziZN3dCmUd2RZxDdkOcRXVGm0N3QJpAeE6Ya3iBl5B1lpWWdJ6Tp3Sqj6p0rI2icqOKo3GkiaJtjIl9boOLiXuLgpSFmmyKhnpgUoNZbFiAV3ZVgVR2T4BPeFCAUHdPgE94T39PfFB+UH9SfFaDW3pbhlV4UIdJeEmGRnhFhkV5RoVFe0WCRnxIgEh+SH5IgEV/QX8/gj5+OoI4ezWGM3ksiCd5JokoeS6LUHhajVV2U45VdVSQU3VVjll0XZJicledUm9SqE5vUKpOcUulRnNBoj10P55BdDeaLnYzlT12QY9Bd0SPRnZLjU10To1ScleQWXFRk0ZyOpU4dTOUNHU+kUtxV5FlamyUcmVzmGxkaJloZWeXZmVmmWZlZ5toZmmdY2hOmjZuQJdGcEWYSW9YmF5uXpZcb1iVVXBTk0tyRZJCcz+PO3U1jSl6I4kjfCOHI30jhyN9JIclfSWIJH0kiCN8I4YjfCmEMnw5gz17PoE/ekB/QHo/fz96QH5BekB+QHpAfT97P30+fTp+Ln4jfyF/IYEifyKDIX4hgyJ9IoMifiKDIn4kgyZ/K4ErgCuBKYAqgiqAKoEqgCqBKoAsgjCANIQ2gDaFNn82hzh+OYg8fkOGRn5FhEh/VYJUgEaER4FcgFJ/XXllfmZ4W35Xe1x7U35Nek6CTXhOhE54TYRLe0eDRHw/gz18PYM/e0CDRHpHhEh6S4ZNeU2FTnlOhU54T4ZQd0+IT3dQiVF0VopfcWOMa29yj3dufY9/boOOhXCIjopxiI2Ic4WNhHOCjYJygIyAcYCMfnCBjYBxgYyEdIeIinmMg418i3+KfYl/iHyHgIR8gIJ5fHSIcHZvjXBycJBucG6Sa3BpkWdwZZFlcGORZ29okWxtc5F4bH2Rg2yHj4tvjY6NcoyMinSFioZ2h4WOe5J5k4CSa5CCj2qNg41rjoWObI+DjnKOhIx7en5zi3pxepJ4bnmUeWx5lHlueJN4b3eUd213lXdtd5V4bHqVeWt3lXdre5OBa4ePjm6TipN0koeQeJCGkHqVfJV/kHONgYxwi4CJdIiAinmQf5OAl3uVhpR5kIqPeI2KjXaNiox2iYwn/yf/KP8o/yj/KP8o/yj/Kf8p/yn/Kf8p/yn/K/8r/yv/K/8s/yz/LP8s/yz/LP8s/yz/Lf8t/y3/Lf8t/y3/LP8s/y3/Lf8t/y3/Lf8t/y7/Lv8u/y7/L/8v/y//L/8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lf8t/y3/Lf8u/y7/Lf8t/y3/Lf8u/y7/Lf8t/y3/Lf8t/y3/LP8s/yz/LP8s/yz/K/8r/yz/LP8r/yr/Kv8q/yn/Kf8p/yn/Kv8q/yn/Kf8p/yn/Kv8q/yr/Kv8q/yr/Kv8q/yr/Kv8r/yv/K/8r/yv/K/8r/yv/LP8s/yv/K/8q/yr/Kv8q/yn/Kf8o/yj/J/8n/yf/J/8l/yX/Jf8l/yX/Jf8k/yT/JP8k/yT/JP8k/yT/JP8k/yX/JP8j/yP/I/8j/yL/If8i/yL/If8h/yH/If8h/yH/Iv8j/yf/Lf83/1D/b/92/2r/a/9u/3D/cv9y/3H/Z/9g/1b/TP8//zL/LP8u/zL/PP9H/1L/W/9m/23/b/9v/2n/YP9Y/0v/P/8y/zH/Sf9x/33/f/9s/2f/av9s/0z/QP9D/0P/Ov84/0D/RP9F/0T/Rf9H/0f/Q/8//0P/Xv99/4z/lf+Y/5L/lf+a/6P/rv+w/67/sP+u/6n/q/+S/3T/dv+O/6P/of+j/5b/g/9g/1H/Vf9T/1L/Uf9R/1H/Uf9R/1L/Uv9R/1H/UP9Q/1H/U/9U/1P/Vv9R/03/S/9H/0X/Q/9C/0D/Qf9A/z//Q/9D/0L/Qv9A/z7/Pv86/zn/Nv8z/zD/Kv8l/yf/Kv8y/1L/X/9Y/1D/Uv9V/1L/UP9U/2H/W/9E/0n/Q/9F/0b/Rf9C/z7/PP8+/z7/Nf8v/yz/Lf86/0D/Qf9F/0r/TP9N/07/Tv9Q/0//Q/85/zf/NP8z/zr/SP9V/17/Z/9s/23/bP9p/2j/Zv9m/2b/Zf9f/1j/Vv9M/0//Vf9M/0P/Rv9P/1r/Xv9c/1r/Vv9T/0//SP9D/z7/PP85/zP/J/8k/yP/I/8j/yP/I/8k/yX/Jf8k/yT/I/8j/yP/Kf8z/zr/Pf8+/z//QP9A/0D/P/9A/0D/QP9A/0D/P/8//z7/Ov8u/yP/If8h/yL/Iv8h/yH/Iv8i/yL/Iv8h/yL/JP8o/yr/Kv8p/yr/Kv8q/yr/Kv8q/yz/L/8z/zT/NP80/zX/Nv85/0D/R/9J/0n/Sf9N/0P/QP9B/1X/aP9v/27/Zv9i/2P/Z/9T/0z/Tf9N/07/Tf9M/0r/Rv9D/0D/P/8//0D/Qf9E/0f/SP9L/03/Tf9O/07/T/9Q/1L/VP9U/1T/V/9Z/1//Zv9r/3T/ev99/3//g/+H/4n/iv+I/4j/hf+E/4L/gv+A/4D/gP9+/4H/gP+B/4X/iP+N/4//jf+M/4r/if+I/4b/g/9//3n/dP9w/2//b/9v/27/bv9s/2r/Z/9l/2T/Zf9o/2n/b/92/3v/f/+D/4f/i/+N/4v/if+J/4f/hv+L/5T/kf+S/5H/kf+O/47/jf+O/47/jf+O/4//gf9z/3j/e/97/3n/ef95/3j/eP94/3j/d/93/3f/d/93/3f/d/94/3j/ef98/4L/iP+O/5L/k/+S/5H/jv+Q/5T/kf+N/4z/iv+K/4j/if+M/5L/lf+X/5X/lP+Q/4//jf+M/43/i/+K/yd/J38ofyh/KH8ofyh/KX8pfil+Kn4qfit+K34rfit+K34rfix+LH4sfix+LH4sfit+LX4tfi1+LX4tfS1+LXwtfi18LX4tfC5+Lnwufi58Ln4ufi9+L38vfS+AMH0wgC99L38ufS5/Ln0ufy59LoAufS6ALn0ugC59LoAufS6ALn0ugC59LoAufS6BLn0ugS59LoAufS6ALn0ugC59LoAtfS2BLX0tgS19LYEsfSyBLH0sgCx9LIAsfSyALH0sgCt9KoAqfSp/KX4pfip+Kn0qfip9Kn4qfCp9KnwrfSt8Kn0qeyp9KnorfSt7Kn0qeyt9K3srfSt7K30reit9K3osfSt7Kn0qeyp9KnsqfSp7KX0peyd9J3smfCZ8Jn4mfCZ+Jn0kfiR9JH4kfCR+JHwkfiV9JH4kfSR+I30kfiR+JH0lfyN9In8ifiJ/I34ifiJ+In8ifiF/IX8hfiN/I30lgSh3KoY3bUuJamR5h3BgaYVsZG2DcGhwgW1rZX9cblF9RHM5fDF2K34reC6AOHdAgktxVoNhbGqEcGhwhGxnZYFca1F/R3M7fzN7NYFZhHuEeYx/gWyJZ4Brhm59UYxAeUWVQ3c8mDd3P5dEdkWaRXZGnEh3R5tCdj+aTnZvmIV1j5eVcpiWkHKJlI9yoY+vebmGunu7grh2qoWndJKIfHWQhpN9mIKihZ5xn4eNYXOETWNVgVhwWIJWdleBVndTgFJ3U4BTeFJ/UHxSflJ/VXtVglV6VYRXelCFTnpKhEh6RoVGekWERXtDhEJ7QoRBfEGCQX1Bg0B+PoM+fTyDO3w6hDZ7M4YueimIKHkriip4NYxUd12NW3ZYj1N3UY5PdlKQW3Rhk0pzO5k/cz+dQ3RCnD91O5w4dziZN3czly93LZMteDmORHpJiUt6TIhOeVCJT3dPi1FzT44/dDaQNXYyjy52NY1Ec1GOV29ZkF1rZJRpaWiVa2hrlmZmZ5hpZVybT2dXmjhpTJhZcEuVR3FOlFlwXZRccFqSVnFTkFFyS49EdECOPHU6jTl3MYsmeyOII3wjhyN9JIcifSOGJH0khyN9I4cjfCOGInwphDR8PYM/ez+BP3o/f0B6QX9AekF/QXpAf0B6QH9Ae0B/P308fy1+I4AhfyCBIn8igyJ+IoMifSKDIn4igyF+IoMjfieCJ38pgiqAK4IqgCuBKYApgSuAK4ItgDGCMIAyhDSAN4Y5fzaGNn85hT2AQIRFgESDP39Dg0aAQX1LgGZ0Z39gc199XHdaflV8TnxNgU56ToRNekyESntGg0N8QYM/fD+DQXtCg0V6SIRJekqGTHlMh055TodQeFKGVndXiFp1WolddGGKYXFljG1vdI97bn6PgG6EjodwiY6KcYmNhnOEjYNzg42CcoGOgHF/jn5wgY2BcYKMh3SLiI55j4OPfIuBin2JgYh8hoGBfHyEd3lyiW90bo5tcG2Rbm9tkWpwaJFncGSRZW9mkWpubJFwbXeRfWyAkYNtiI+LcI6OjHOKjId1h4eKeJB7k32RbJCCkGuOg41sjoSNbY2EjXCNg4t4iH56g3V2eI58bH2Uemx5k3hteJN4bXiTd253lHdtd5V3bXaVdWx1lXhreJV5a36Tg2uKj5BvlImTdpGGj3qOgpN9lniPf4xxi4GLcoiAiHaKgI57kn6VgZZ6lIeTeI6KjXaNio12jYqLdoqMJ/8n/yj/KP8o/yj/KP8p/yn/Kf8q/yr/K/8r/yv/K/8r/yv/LP8s/yz/LP8s/yz/LP8u/y7/Lv8t/y3/Lf8t/y3/Lf8t/y3/Lv8u/y7/Lv8u/y//L/8v/y//L/8v/y//Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y3/Lf8u/y7/Lv8t/yz/LP8s/yz/LP8s/yz/LP8s/yz/K/8q/yr/Kv8q/yr/Kv8q/yr/Kv8q/yr/Kv8q/yv/K/8q/yr/Kv8q/yr/Kv8q/yr/K/8r/yv/K/8r/yv/K/8r/yz/K/8q/yr/Kv8q/yr/Kv8p/yj/J/8n/yb/Jv8m/yb/Jv8m/yX/Jf8k/yT/JP8k/yT/Jf8k/yT/JP8j/yT/JP8k/yT/I/8i/yL/Iv8j/yL/If8h/yL/If8i/yL/I/8j/yf/Lv83/0X/Zv95/3L/a/9r/27/bf9s/2v/Y/9Y/0v/P/80/yz/Kf8p/y3/M/86/0f/UP9b/2b/bf9x/3D/a/9i/1j/Tf9B/zX/Mf82/17/e/95/37/bf9l/2n/bv9g/z//Q/9D/z7/OP8+/0X/Rf9F/0b/Sf9I/0T/SP9h/3f/if+M/5D/lP+S/4P/i/+k/7H/uf+7/7z/uv+y/6//qf+q/6z/rv+d/6D/oP+l/5f/f/9c/1j/WP9Y/1b/VP9U/1T/UP9R/1H/Uf9Q/1D/Uf9T/1X/WP9Z/1n/VP9Q/03/Rv9G/0X/Rf9E/0T/Rf9E/0P/Q/9A/0D/Qf9A/z7/Pv89/zv/O/85/zX/MP8t/yv/LP8u/zf/Vf9V/1f/V/9S/1H/UP9U/1r/Vf9C/zv/O/8+/z7/Pf87/zj/N/81/zH/L/8v/zL/Pv9I/0z/Tf9N/07/UP9Q/0//Uf9V/0f/KP8v/zD/Lv8y/zz/Rf9P/1P/Vv9e/2L/Yv9l/2f/af9o/2v/af9k/1//Uf9R/1T/T/9P/1f/Wv9b/1j/V/9U/0//Sv9E/0D/P/87/zn/Nf8t/yX/Iv8i/yT/I/8i/yP/I/8k/yT/I/8j/yP/I/8i/yn/Nv8+/0H/QP9B/0H/Qf9B/0H/Qv9B/0D/QP9A/0D/QP9A/z7/L/8j/yH/IP8i/yL/Iv8i/yL/Iv8i/yL/If8i/yP/I/8k/yT/KP8p/yj/Kf8q/yr/K/8r/yz/L/8x/zP/Nf82/zX/M/82/zb/OP89/z//Pv9D/0P/Q/89/0n/X/9m/2b/XP9a/1T/Vf9P/0z/Tv9O/03/TP9K/0b/Q/9B/z//QP9C/0P/Rf9I/0r/TP9M/0z/T/9P/1L/Vf9Z/1r/X/9h/2X/Z/9n/2z/cP93/3v/fv+A/4T/h/+J/4f/h/+G/4T/g/+D/4L/gf+A/3//fv+B/4H/hP+I/43/j/+P/47/jP+K/4n/hv+D/3//ef90/3D/bv9u/23/bf9u/23/av9o/2b/Zf9m/2f/av9t/3T/ef9+/4L/hv+J/47/jv+M/4r/h/+I/47/k/+R/5H/j/+O/43/jP+N/43/i/+L/4v/iv+A/3X/dP96/3z/e/97/3r/eP94/3j/eP93/3f/d/93/3f/dv92/3b/eP94/3n/fv+F/4z/kv+U/5P/kf+P/5D/k/+R/43/i/+M/4r/iP+I/4v/kP+U/5X/lv+U/5L/j/+N/43/jf+N/4v/iv8ofih/KX4pfyp+Kn8pfil/KX4qfip+Kn4qfip+Kn4rfSt+K3wrfi18LX4tfC1+LXstfy19LX8tfS5+Lnwufi58Ln4ufS1+LX0vfi58Ln4ufC59LnwufTB9L30vfi99L34ufS5/Ln0vfy59Ln8ufS5/Ln0ufy59Ln8ufS5/Ln0ufy99L38vfS9/L30vfy99Ln8vfS+AL30vgC99L4AvfS+ALX0ugC99LoAufS6BLn0ugS19LIEsfSyBLH0sgCt9K4AsfSx/LH0sfyt+K34rfit+K34rfSt+K3wqfip9Kn4qfSp+Knsqfip7Kn0reix9LHwsfSx8K30reyp9KnoqfSt6K3wreit8K3oqfSp7KX0peyh+J3snfid8Jn4mfSV+JX0kfyR9JX8lfSV/JX0lfyV9JX8lfSR/JH0kfiR8JH4kfSR9JH4jfSN+I34jfSN+I30jfiN/In4ifiJ/I30kgid6K4Yxcz2IWmh4iHJiaoVqYnGEcGhwgWhrXYBUbUh9OHMtfCh5JX4meimALXw1gj93SYRUcV6EZmxuhG9pbYJlaF1/Um5Gfjt0Mn8wez6CZ4d3g3aOf4BrjGJ/ZYdsfXaIS3k/j0R3QJU6dzqXRXZEmUR4Rp1Hd0adTHZgmnR1f5iNcoiWhm+OlZFwhJORc6ORsXm1ibZ8uoa7e7aDuX27g7p+u4G6ga5+poWddqKHnmaKhmpgWoJWbVKCUnRRglN3U4BUeFB/UHpOfk1+TX1Sf1R8UoFUe1WDVXpThVF6ToRLekiFRnpFhER8Q4REfEOEQ3xDg0J9QoNCfkGDQH5Agz5+PYM9fj2DOXw4hDR7MYYuei6JLnpBild5Vo1ReFCOUXhQj092TZBVdlaSO3Y1lDt2PJc9djqYOHc0lzN3MpQweTGTOXlHjU17TolNfU6DTn1OhE58ToZReFOJU3ZHjD12KYsody+KNXc7ikN1SoxNcFaQW25flGJrZJNmaWeXZmhjmGFqYplVbFaWVHJLk1BxWZNbcluSWXJVj1F0TY1Fd0GMPHc7jDp4NooweyeJJHwkhyR8JIckfSSII30jiCJ9I4YifSKGIn0ihiN8J4Yyez6EQXpDgkN7QoBAej9/P3pAf0J6QX9BekF+QXtAfj98PX8zfiWAIX8ggiB/IoIhfiGDIX4hgyF/IYQhfyGEIX8hgyJ/IoMifyaDKX8pgyqAKoErgCuBKoErgy+BMYMzgTKENIA0hDaAOIU7gDuEOoE5hD2APYFCf0d7TX9SdFt9Zm9ifWF0XHtWelB6VH9Rek6DTnpNg0p9RoNCe0CCQHtChEJ6Q4RGe0mFS3tNhkx6TYZNeFGGVXZah1x0YIlldGuMb3RwjHBzcIx0cneOfXCAjn9vg46HcImOiXGIjYZyhI2EcoKNgXKBjYBygI6Bb4GOhHKHi4p3jYaPfI+EjH2Mgot9h4KEfH+Ee3p3iHJ1b41ucm2QbW9tkmxva5Jqb2eSZm9mkmduaZJsbXGSd2x7kYBtgo+FboqOjnCOjopyiYmId4yAknyTcZOBkmuQgo5vjoOObo6EjG6Jgod3i3+IgXl6d414b3uUfWx9lHpseZR4bXiUd213lXdtd5V3bHeVd2t3lXdrd5V3aniVemmAkodsj42ScpOJkniRhY97k3yTf410i4CIcouBinSIgYl3jICRfZN9lYWWeZOKkHWPio91joqMdIuKi3aJiij/KP8p/yn/Kv8q/yn/Kf8q/yr/Kv8q/yv/K/8r/yv/LP8t/y3/Lf8t/y7/Lf8t/y3/Lf8t/y3/Lv8u/y7/Lv8u/y7/Lv8u/y//Lv8u/y7/L/8v/y7/L/8v/y//L/8v/y7/Lv8v/y3/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/L/8v/y//L/8v/y//L/8u/y7/Lv8u/y7/Lv8u/y7/Lv8t/y7/L/8u/y7/Lv8u/y7/Lf8s/yz/LP8s/yz/K/8r/yz/LP8s/yz/K/8r/yv/K/8r/yv/K/8r/yr/Kv8q/yr/Kv8q/yr/Kv8q/yv/LP8s/yz/LP8r/yv/Kv8q/yv/K/8r/yv/K/8r/yr/Kv8p/yn/KP8n/yf/J/8m/yb/Jf8l/yT/JP8l/yX/Jf8l/yX/Jf8l/yX/JP8k/yT/JP8k/yT/JP8k/yP/I/8j/yP/I/8j/yP/I/8i/yL/Iv8i/yX/KP8t/zj/Tf9y/3j/cP9t/3H/dP9y/2n/X/9T/0b/Nf8p/yf/Jf8l/yb/Kf8w/zn/Q/9O/1f/Yv9r/3D/bf9o/2D/Wf9P/0D/Mv8v/zD/Q/9t/3j/eP+B/23/Y/9j/27/ev9y/z3/Qf8//zr/OP9B/0P/Qv9F/0H/R/9f/3b/g/+A/5D/jv+H/47/lP+T/5n/oP+k/6//rv+w/7n/vP+8/7n/s/+w/7X/tP+1/6n/qf+h/4//d/9V/1T/Wf9l/3P/ef95/3n/ef91/23/Xv9O/0z/TP9O/07/T/9S/1L/UP9O/0v/SP9G/0X/RP9F/0P/Q/9D/0P/Qv9C/0H/QP9A/0D/P/8+/z3/Pf86/zn/OP82/zP/Lv8u/yz/QP9T/1D/T/9O/07/S/9L/03/Uf9S/zr/Nv85/zr/OP82/zX/Mv8y/zD/Mv89/0v/UP9P/07/Tv9O/07/Tv9O/1D/Vf9V/1T/VP85/zL/Of86/zv/Pf9B/0b/Uv9X/1r/W/9f/2L/YP9h/1//XP9f/1n/U/9O/0v/T/9Y/1r/Wf9Y/1P/UP9K/z//PP85/zf/Nf8w/yr/Jf8k/yT/JP8k/yT/JP8j/yP/I/8j/yP/I/8i/yL/I/8m/y//O/9A/0H/Q/9C/0D/P/9A/0H/Qf9B/0L/Qv9B/0D/P/88/zX/Kf8h/yH/If8h/yH/If8h/yH/If8h/yH/If8h/yH/Iv8i/yL/JP8m/yj/Kv8q/yj/KP8p/yr/LP8v/zD/Mf8y/zT/Nf80/zf/N/81/zX/Nv85/zn/O/9C/0r/U/9i/2z/Yv9a/1L/UP9P/1P/UP9N/03/Sv9G/0P/Qf9D/0P/Q/9E/0j/Sv9M/03/TP9O/0//Uv9V/1v/Yf9m/2v/cv92/3f/eP94/3j/ef99/4D/gP+E/4f/if+J/4f/hv+E/4L/gP+B/4H/gP+A/4H/gv+E/4f/iv+N/47/jf+M/4r/h/+E/4H/e/95/3P/b/9t/23/bf9t/23/bP9r/2n/Zv9n/2f/Z/9p/23/cv94/3z/gf+F/4j/i/+N/43/iv+I/4n/kP+S/5L/kP+P/4//jf+O/47/jv+L/4f/h/+M/3//ef95/3v/fP98/3z/ev95/3j/eP93/3f/d/93/3f/d/93/3f/d/93/3f/eP97/4L/h/+P/5P/lP+S/5H/kf+T/5H/jP+L/4v/iv+I/4j/i/+P/5P/lf+V/5X/kv+Q/4//j/+O/4z/i/+K/4j/KX4pgCl+KYAqfip/Kn4qfyp+Kn4rfit+K34rfit+LH0sfi19LX4tfS1+Ln0tfi59Ln4ufC5+Lnwufi58Ln4ufC5+Ln0ufi59L34ufC9+MHwvfS98MH0wfS99L34vfS9+L30vfy59Ln8ufS5/Ln0ufy59Ln8ufS5/Ln0ufy59Ln8ufS5/Ln0ufy59Ln8ufS5/Ln0ugC59LoAufS6ALn0ugC59LoAufS6ALn0ufy59Ln8ufS5/Ln0ufy19LH4sfSx+LH0sfSx9LH0rfit+K34rfit+K30rfip8Kn4qfCp+Knwrfit7K34reyx9LHosfSx8LH0seyt9K3oqfSt6K30reit8K3srfCp7Kn0qeyp9Knspfid7Jn4mfCZ+JnwlfiV8JH8kfSV/JX0lfyV9JX8lfSV/JX0kfyR9JH4kfCR+JH0jfiN+I34jfyN9I4AjfSOAI34jfyN+In8jfyR7J4MrdDSHR2tpiHZjbodqYXGFdmZ2g25pY39Wa0Z7NXEneyR3JH4keSV/JnopgDF5OoJFdFCEWm1khWxpcINraGaBXWxSfkdwOn0udy2ANHtVg3OFeIF4jX9/bItjgGGFaH93h358VY06eECSN3g2lT94QZhDeESZQXhRmnV2hpmMc4aWknOVlZNwlpSWbZOUl2+akptzpY2md6yKuX2+g7yAs4OzgbKBs4CxfqyBpHmohqZrlIaAYF6DYm10gH5+foB9gHyAe394gHh/dX90gWt+YIFZfFiBV3tVg1J7UoNPe0yFSnxHhUR8RYRGfEaERHxEhER8QoNDfUGDQH4/gz9+QIM+fj2DPH47gzp8OYQ4ezeGNXo0hy56LYkveT+LT3hMjE15TI1KeUmOR3hJjlB4TJA2dzaSOXg2lDV4M5MxeDCTL3o1kUN7TYxSfFKITn1Pg019TYJMfEyDTXpQhVN5V4hcdlaKRnc7izl3PIk7dz2KQHVJi1ByVo5XcVqPWm9aklltW5RablmVVW9QlExzTJFTdFiQWnRWj1J2ToxMd0OKOXo4izR6MIsseSiJJXwkiCR8JIckfCSHJH0kiCR9JIgkfSOHI30jhyJ9IocjfCSHK3s4hEB6QYNCe0OBQnpBf0F6QX9Ae0CAQXpBfz57P38/fDx/N34qgCF/IoIifyGCIX4hgyF+IYMifyKDIn8igyJ/IoMjfyODIn4igyR+JoMrgCqDKYAqgyqBKYMqgSqDKoAqgy+AMoQygDSENIAwgzF/MIMvfzWBN308fEB7RXRKeFtrZnlqY2F7WWhUfU91UH1QgU57TINLfEeDQ3xBg0J8QYRFe0aESXtLhUx7TYVNek2GTnhRhlV2XYlhdGmLcHN4jnxzfY59c3uMenJ6jn5wf46Cb4aOhnCIjohxh42HcoSNg3KBjYBygY2AcoCOgXKDi4Z1iIiLeI2FjnyMgot9iYOGfIKEfnp5hnR3b4ttcm2ObXBskW1vbZJrb2qSaW9okmdvaJJobmqSbm10knlsfpGBbYaPim6Nj49wjI2KdImGjXqSdpF/kGyPgo5ri4ONbo2DjXCLg4hzhoGJfIh7eYh5cnmRfG19lXtse5R6bHmUeG14lHZtdpV3bXeVd2x3lXdrd5V2a3aVdmp5lX1qg5KHbZCNk3OTiJF5kISRfJN4kICMcY2CinKKgYh2iIGNepB+lICVe5OIlXaRipB1j4uNdYyLjXSMjIl2iIwp/yn/Kf8p/yr/Kv8q/yr/K/8r/yv/K/8r/yz/LP8s/y3/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y//MP8w/y//L/8w/zD/L/8v/y//L/8v/y//Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8v/y//Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lf8s/yz/LP8s/yz/LP8s/yv/K/8r/yv/K/8r/yv/Kv8q/yr/Kv8q/yv/K/8r/yv/LP8s/yz/LP8s/yz/K/8r/yv/K/8r/yv/K/8r/yv/Kv8q/yr/Kv8q/yn/J/8m/yb/Jv8m/yX/Jf8k/yT/Jf8l/yX/Jf8l/yX/Jf8l/yT/JP8k/yT/JP8k/yP/I/8j/yP/I/8j/yP/I/8j/yT/I/8i/yP/Jf8o/zD/Pf9e/3n/c/9p/27/dv92/3H/Z/9a/0z/Nv8o/yT/I/8k/yT/Jf8m/yv/M/87/0b/Uf9b/2X/bv9u/2r/Yf9a/03/Qf8z/y3/Lf84/1z/eP93/3P/fv9w/2H/Y/9o/3T/gP91/0D/Pf86/zX/PP9A/0H/Q/9M/2b/hv+P/5D/lP+W/5b/mP+Z/5L/hP+M/5H/kf+a/6D/pP+y/7b/t/+0/7H/r/+s/63/n/+Z/5b/lv+U/43/bv90/3v/ev92/3f/dv93/3T/c/9z/3P/dP9x/2//bf9q/2j/ZP9i/13/Wf9U/1L/Tv9M/0X/RP9E/0L/Qf9C/0H/QP9B/0H/QP8//z3/Pf88/zv/Ov85/zj/N/81/zT/M/8w/y3/Lf9A/03/R/9H/0b/Rv9G/0b/S/9R/0b/Nv84/zb/Nf8z/zD/L/8v/zj/Sf9R/1P/U/9R/0//Tf9N/0v/S/9M/0z/UP9S/1n/V/9Y/0z/O/82/zn/PP89/0P/Sv9N/1L/VP9W/1T/VP9U/1X/Vv9R/03/Tf9T/1j/Wf9W/1P/T/9M/0n/Qv84/zH/L/8r/yX/I/8k/yT/JP8k/yT/JP8l/yX/JP8k/yX/I/8i/yT/Iv8i/yP/I/8m/zL/Pf8//0D/Qf9B/0P/Q/9B/z//Pf9A/0L/Qv9A/z//Pv84/yz/Iv8i/yL/Iv8h/yH/If8h/yL/Iv8i/yL/Iv8i/yP/I/8i/yL/JP8k/yv/Kf8q/yv/LP8q/yj/KP8o/yv/MP8v/y//MP8t/yr/Kv8x/zT/MP8z/zj/N/85/z7/T/9X/2H/V/9R/1r/Wf9R/1D/Tf9L/0n/Rv9D/0D/QP9D/0X/Rf9I/0z/Tf9L/03/Tf9M/0//VP9b/2P/av9z/3r/f/+B/4L/gP9+/37/fv9//4H/hP+G/4j/if+G/4b/g/+D/4H/gP+B/4D/gP+D/4b/h/+J/4r/jf+O/4v/i/+I/4X/gv97/3f/cv9u/23/bf9t/2z/bP9s/2v/av9o/2j/Z/9o/2j/av9v/3X/ev99/4H/hv+K/43/jP+L/4n/iv+P/5L/kf+P/47/jf+N/47/jf+L/4j/hv+G/4z/hv96/3j/ev97/33/e/96/3r/eP93/3f/dv92/3b/dv93/3f/d/93/3b/dv92/3n/ff+D/4j/j/+T/5H/kP+Q/5P/k/+Q/4z/jP+N/4n/h/+H/4z/kv+U/5T/lf+T/5H/kP+P/4//jv+M/4v/if+I/yl+KYApfimAKn4qfyp+K38rfit+K34sfix+LH4sfix+LX4ufi5+Ln4ufC58LnwufC9+L3svfi97Ln4uey5+Lnstfi18L34vfDB+MHwwfjB8MH4wfC9+L3wvfS98L30vfC59Ln0ufS5/Ln0ufy59Ln8ufS5/Ln0ufy59Ln8ufS5/L30vfy19LX8wfTB/L30vfy99L34vfS9+L30vfy59Ln8ufS5/L30vfy99Ln8ufS5/Ln0ufy59Ln8tfSx+LX0tfi19LXwsfSx8K34rfip+LH4rfSt8K30rfSx9LHwsfSx8LH0sfCx9LHwsfSx8LH0sfCx9LHorfSx6LH0seyx9LHsrfSt7K30reyp9KnsqfSl7Kn4pfCZ+JnwmfiZ7JX4leyR/JHwkfyR8JH8kfCV/JX0kfyR9JH8kfSR+JH0jfiN9I34jfiN+I38jfSN+I30jfyR+JH4jfiN+JYApeiyFNnBOiHNnd4dsYmqGcmV1g3Fpa4BfbE9+OnAqfCR3IXwieyJ/I3wkfyd8K38zeT2CSHVSgl5uZIRraWqDZWhdgVJuSIA9dTGALHg1gkh6a4N9hX+BfY6Af3OLYoBjhmiBdIWAfX+IZXk1jzl5NpI4ej+VQ3pCmVt5fJiQeJOVkXWZlJ5ymJOUcJyTlG2Hk4ptj5KRcpiOpHeji6l8q4ivf7OGtH2pg6N7nYCPe5F+kIOMcYaGj2B0hGdpdIB1f3WAdIFygXGBcoFvgG+AboFuf26BbIBsgmmAZoJif2CDX39fg16AXIVcgFyFWH9Vg1R/UYNNf0qDSH9Fg0F+PYM9fj6DPX49gz18PIM6fTmFOHs3hjZ6NYcyeTGIMHouii55PIpLekiKRXlGikN6QoxCeEeNUnhBjzZ3OJA3dzKRMXgxkTF5PZBMe1SMV31XhlN+UYNQfk+CS35Lgkt9S4JNe1GEUnhTiU53VIpTdkWKPHY9iT95QIlDeUiKT3dSi1V1VI1PdE6PTnJMkFB0UJFQdlCQUnVSjVB3TotLeEmJRHo+iTZ8L4cufCuIJnwliCR9JIgkfiSHJH4khyR9JIgkfSSIJH0khyR9JIcjfSOHI3wjhyR8K4Y4fD6FQHtAg0B6QIFCekGAPno+fz97Pn8/ez2APH07fzV+K4IifyGCIX8igyJ/IYMifyKDIn8igyJ/IoMhfyGDI38jgyN9I4MkfSSDJ38ogyh/KoMpfymDKH8rgy5/L4IsfyuCKYAqgyl/KYMqfC2DMXw3fzx7PXhDeEdzTnVXbFt1YWJveXRbYn5VZ09/TnpNf0uBR31Eg0J7QINBe0WDSHpIhEl6S4VNek2GTXpNhkx4T4ZSdlqJYnRri3ZyfIyAcoGOg3OCjYBzfo18cX+MgXCFjodwiI6GcoaOhHKDjYNygY2AcYCNgHGAjYRyh4uIdoqGjHqNgox8i4KIe4aDg3t/hnl5c4lvdG2Na3FrkWtvbJJrb2uSa29pkmdvZpJnb2iSaW9tkXFtdpJ7a3+SgW2GkYpvjY+NcouKiHWNf5B7knCOgY1qjYGLa42DjXCMgol0hYCEeop/jYOAeXyNeXF5k3ttfJR7a3uVeWx4lHhsd5R2bXaUdWx1lHZrdpV2a3aVd2p3lnhpepR+aYSTim6OjpJ1kYiPeZCCk32Sdo6BjnGOgo5ziYKJd4qBjn2TfJWCk3iUiZJ2kYuPdo+LjXaMjYt2io2IdoeNKf8p/yn/Kf8q/yr/K/8q/yz/LP8s/yz/LP8s/y3/Lf8t/y7/Lv8u/y7/Lv8v/zD/L/8v/y//L/8v/y//L/8v/y7/Lv8v/y//MP8w/zD/MP8w/zD/L/8v/y//L/8v/y//Lv8u/y7/Lv8v/y//L/8v/y7/Lv8u/y7/Lv8u/y7/Lv8v/y//Lf8t/y//L/8v/y//L/8v/y//L/8v/y//Lv8u/y7/Lv8v/y//L/8u/y7/Lv8u/y7/Lv8u/y3/LP8t/y3/LP8s/yz/LP8s/yz/LP8s/yv/K/8r/yv/LP8s/yz/LP8s/yz/LP8s/yz/LP8s/yz/LP8s/yz/LP8s/yz/LP8s/yv/K/8r/yv/Kv8q/yr/Kf8o/yf/Jv8m/yb/Jv8l/yX/JP8k/yT/JP8k/yT/Jf8l/yT/JP8k/yT/JP8k/yP/I/8k/yT/JP8k/yT/JP8k/yT/JP8k/yP/JP8o/yv/Mv9F/2v/fP9v/2v/cP90/3T/bv9j/1X/Qv8t/yP/Iv8i/yL/Iv8j/yT/J/8t/zX/Pf9I/1L/Xf9m/2r/av9i/1j/Tf9C/zf/MP81/0f/af98/37/ff92/33/d/9i/2T/Zv9w/4D/gv9+/0j/N/83/zb/Pf9B/0j/av+K/5f/mv+W/5j/o/+k/5v/nv+b/5D/i/+M/47/mP+i/6b/rf+s/67/sf+t/6b/nP+T/4v/iP+L/4v/hP+I/4D/a/9v/2//cf9x/3D/bf9t/2v/av9r/2r/af9p/2j/ZP9i/2X/YP9f/1//Wv9Z/1j/WP9Y/1f/VP9R/1P/Uv9T/1L/Uv9Q/0f/P/89/z3/O/86/zr/Of84/zf/N/82/zT/Mv8y/y7/Lv8u/z3/RP9C/0H/Q/9C/0L/RP9J/1T/Pv82/zb/NP8w/zL/NP9C/0//U/9W/1f/U/9T/1D/T/9M/0r/Sv9M/0z/Tf9R/1P/Tf9O/1T/U/9M/0L/P/9A/0L/RP9J/03/Tv9N/03/Sv9E/0T/Rf9H/0j/Rv9E/0T/Q/9F/0b/Q/9A/zn/Mf8s/yv/Kf8n/yb/Jf8l/yT/JP8l/yX/JP8k/yT/JP8l/yX/Jf8l/yX/Jf8l/yX/I/8l/yz/Nv88/z//P/8//0D/P/8//z//QP8+/zz/Ov84/zP/Kv8j/yL/Iv8h/yH/Iv8h/yL/Iv8i/yL/Iv8i/yL/Iv8j/yP/I/8j/yT/JP8m/yf/J/8n/yb/Kv8s/zD/Of88/zP/KP8o/yf/Jv8n/yn/Mf89/0P/Rf9N/1D/Uf9V/1b/Wf9f/3D/gP95/17/WP9O/0v/TP9J/0H/QP9C/0L/Q/9G/0f/Sf9L/03/Tv9O/07/Tf9O/0//Vf9e/2f/cv97/4D/gf+D/4L/gP9+/3//f/+B/4X/h/+H/4b/hf+C/4L/g/+B/4D/gP+C/4L/hv+J/4r/i/+N/4z/i/+I/4f/g/+A/3v/d/9y/27/bP9r/2v/a/9s/2v/a/9r/2n/Z/9m/2f/aP9p/23/cf92/3v/f/+B/4b/jP+L/4v/iv+K/5H/kf+Q/43/jf+M/4z/jf+N/4v/h/+D/4b/jP+G/3z/ev95/3r/fP98/3z/e/95/3j/d/92/3b/dv91/3X/dv92/3b/dv93/3f/eP96/37/hP+K/47/kP+P/47/kf+V/5D/jf+O/43/jP+I/4n/jP+R/5P/lf+T/5T/kv+R/5D/jf+M/4v/iv+J/4f/hv8pfimAKX4pgCt+K38sfix/LH4sfix+LX4tfi1+LX4tfi5+Lnwufi58Ln8ufS9/MHwvfi97L34vey9+L3svfi97MH4wezB+MHswfjB8MH4wfDB+MHwvfi98MH0wfC99L3wufS58L30vfS99L34ufS5+Ln0ufi59Ln4ufS5+Ln0ufjB9MH8vfS9/L30vfy99L38vfS9+Ln0ufi59Ln4vfS9+Ln0ufy59Ln8ufS5/L30vfy99L38ufS5/Ln0tfi19LX4sfSx+LH0sfix+LH0tfit9K30rfCt9K30sfSx9LH0sfSx9LH0sfSx9LX0tfCx9LHwsfS17LH0seyx9LHssfSx7K34rfCt+K3wqfSp8KX0pfCh+J3wnfid8Jn4meyV+JXslfyV7JX8leyR/JHskfyR8JH8kfSR/JH0kfiR9IX4jfSR+JH4kfiR+JH4kfiR+JH8jfiR/JH8kfiiDLnc8h2Bsf4Z0YmyFcWN2hHlocYFoalp9Tm41fCR0IX0heSN9I3shfyN9JX8ney5/NXk8gkd1UYJbcWSDaW1lgWFtVn9KbkGBOW02gz9qXYSCbYiCfn56f3aOe357jWiAYoZigWyFfoGEiIN8dIsxeTmPNXs8kkB7T5V2fJGUm3qekZ94opChdaSQoHGckJ1vmZGNboyRjXGTkJ52pI2le6SJoX2ghp9+noaYe5GFinh7gXR9eHd1gntlioJpZWuBa3tsgG2EaoBrhGmAZ4NngGiDZoBmg2SAYYRbgFaEW4FchFqBWIRagViDVIFRg1CAUIZPgE2GTYBNhU2AToVRf1OEUn9HhEF+PIM7fDmDOns4gzl6OIU4ejaGNXk1hzF5L4kweC+JMnlGiUd5RYpFekKLRHlFi0l4Uo1QdzaOM3czkDJ4MY82ekeMUXtUiVR9VYVVflKDUn5Pgk1+S4JLfUuBS3tLgk18TYNQek+GTntPh0x6RIg2ejKIOns/iEF6RYdGeUeJSHhGikJ4Q4tDeEOKQnk/ikN6RolJfEqHSH1GhkF9PIYwfSuHKH0niCl6J4gnfCeIJnwmhyV8JYckfSWIJH0liCd9J4gmfCaIJnwkiCR8JYglfCWHJnwqhjB8N4U7ez6DP3w9gT98QIA/ezx/OHw0fy1+JoAjfiGCIn8jgyF/IoMifyCDIn8igyJ/IoMifyKDIn8igyJ/IoMifyODJn8mgyV/JoMnfyeDJ38ogyd/KYM0fzqCL38ogSaAJYInfieDK3wxgTt8Qn1FfUp3TnxRcVN6U2xXeFhjWXpqUn59XVBegW9nUIJIekeBQ4BAfUCCQHtChEV6RoVJekuFTHpMhk56ToZNeE6GTXZRiFd0Y4ptcnaKfXKAi4FzgY1+c32NfXF+jIJwh46JcImOh3KFjoRygo2CcoGNgXGBjoNxhIyIc4qIi3iNg4x7i4KIfYeDhnqChX15d4d0d3GLbHNrj2tva5FrbmuSa29rkmpvaJJmb2aSZm9nkmltbZFxbHaSe2t/koJrh5GLbouQi3OLho59kXWQgY5ujoKNbY2Djm6MgoxxiYGEdYKAin2MfIGHfHR5kXlufJR8a32Ve2t6lHhsd5R3bHWUdW11lHVsdZR1a3aVdWt2lXVqdZZ4aXqUf2mFkolujY6PdI+Ij3iSf5R8kHWOgI5yjoGMc4mCiniOgJF+lHuUhJR3lYmSdY+MjnWNi411jI2KdYmNiHWHjSn/Kf8p/yn/Kf8q/yz/LP8s/y3/Lf8t/y3/Lf8u/y7/Lv8u/y7/Lv8u/y7/L/8x/y//L/8v/y//L/8v/y//L/8w/zD/MP8w/zD/MP8w/zD/MP8w/zD/L/8w/zD/MP8v/y7/Lv8v/y//L/8v/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/L/8v/y//L/8v/y//L/8v/y//L/8u/y7/Lf8v/y//L/8u/y7/Lv8u/y7/Lv8v/y//L/8v/y7/Lv8u/y3/Lf8t/yz/LP8s/yz/LP8s/y3/K/8r/yv/K/8r/yz/LP8s/yz/LP8s/yz/LP8t/y3/LP8s/y3/Lf8s/yz/LP8s/yz/LP8r/yv/K/8r/yr/Kv8p/yn/KP8n/yf/J/8m/yb/Jf8l/yX/Jf8l/yX/JP8k/yT/JP8k/yT/JP8k/yT/JP8k/yT/JP8k/yT/JP8k/yT/JP8k/yX/Jf8k/yb/Kf8z/0//ef9//3H/cP93/33/ev9w/2T/VP9D/y3/I/8h/yL/Iv8j/yP/JP8m/yj/K/8z/zz/R/9S/1z/Yv9m/2T/YP9V/0v/RP9D/0z/YP97/4z/hv96/3f/dv96/3z/af9h/2D/av98/4T/g/+I/1r/K/8y/zb/Pv9V/3r/kP+b/53/pf+m/6X/p/+i/5n/oP+f/5T/jf+O/47/l/+d/5//ov+f/53/nP+U/4r/f/91/2n/Yv9h/1z/bv+H/3b/X/9n/2f/aP9o/2b/Zf9j/2L/ZP9l/2L/X/9f/1//Xf9a/1j/Wv9Y/1b/Uf9P/03/Sf9J/0n/S/9L/0v/TP9L/0v/Tf9O/03/R/9D/z//PP86/zn/Of84/zf/Nf81/zX/NP8x/zH/MP8u/zn/SP9F/0L/Rf9E/0b/Rv9K/0//Rv8y/zL/NP8z/zf/SP9S/1X/VP9U/1P/U/9T/1H/T/9N/0v/Sv9L/0z/S/9L/03/Tf9L/0v/Sv8//zD/Jf8n/yz/Mv85/zv/Q/9H/0b/RP9A/0D/Qf9A/0L/Rv9K/0n/SP9G/0P/QP82/y//Kv8n/yf/J/8m/yf/J/8n/yf/Jv8m/yb/Jf8k/yX/J/8o/yf/J/8n/yb/JP8l/yX/Jf8l/yX/Jv8q/y3/M/84/zr/Pf8+/zv/Nv8x/yr/JP8i/yL/Jf8k/yL/I/8k/yX/If8i/yL/Iv8i/yL/Iv8i/yL/I/8j/yL/I/8k/yT/Jf8l/yb/Jv8n/yj/Jv8n/yj/Jv8n/yj/J/8m/yb/Jf8n/yr/Mv82/z7/RP9H/03/Tv9Q/1P/Wv9j/27/gf9h/07/Xv9c/0n/Q/9B/z//P/9A/0L/Rv9I/0n/S/9M/0z/Tv9O/03/Tv9K/0//U/9d/2n/cf95/3//gf+B/37/ff98/33/hP+G/4f/iP+G/4X/hP+C/4L/gf+B/4H/gv+F/4n/iv+M/4z/i/+J/4r/h/+E/4D/fP93/3P/bv9t/2z/a/9r/2v/a/9r/2v/av9o/2b/Zv9m/2b/aP9s/3H/dv97/3//gv+H/4v/i/+M/4z/kP+S/5H/jf+N/43/jf+O/4z/iv+H/4P/hP+M/4j/f/97/3b/eP95/3r/ev97/3n/d/92/3f/df91/3X/df91/3X/df91/3b/df91/3n/e/+B/4b/jP+O/47/jv+O/5T/lP+O/43/jv+N/4v/if+L/47/kf+U/5T/lf+U/5L/j/+O/43/jf+L/4n/iP+H/4b/Kn4qgCp+KoAsfi1/LH4sfyx+LX4ufi5+Ln4ufC5+Ln4ufi9+L34vfi9+L34wfjB7L30vezF9MXsvfS97L30vezB+MHswfjB7MH4wfDB+MHwwfjB8MH4wfDB+MHwxfjF8L30vfC99L30vfS99Ln0wfS99L34vfS9+Ln0ufi99L34ufS5/L30vfy99L38vfS9/Ln0ufy59Ln8ufS5/Ln0ufy99L38vfS9/L30vfy99L38ufS5+Ln0ufi59LX4ufS5+Ln0ufy59Ln8sfSx+LH0sfix9LH4sfSx+LH0sfCx9LHwtfS19LX0tfSx9LHwtfSx8LX0tfS59Ln0tfC18LHwsfCx9LHwrfSt8Kn4qfCl+KXwofih7Jn4meyZ+JnslfiV7JX4lfCV+JXwlfyV8JH8kfCV+JHwkfiR8JH4kfSV+JH0kfiR+JH4kfiR+JH8lfiV/JX8lfiWBJ3wrhjt2ZoeBa3eFcWVyhXtngYN5aWt/XmtNfDpvKHwjdiJ9IXsifSN9IoAjfSaAKH0qgDF7OoFFd0+DWnNghGNwY4NgcFaDT2xRhFxjbYh9X4iEjGmHgXiCeH92kXx+fZBrgGCHXoFkg3qChIWIfpCLjnpDjit6MpA8fVSSen2NkJd7n46neqmOqnipj6V1npCfcaGQmm+OkItyiZKJdo+OknqYiZp7m4iLfIWHfnt3hWx8Z4Jof2l6YYJxa32DhGVdgmJ3Zn9ohGaAZIhigF+GZH9ihGKAYIRegF2FW4BZhVaBVoZWgVSGUYFPhkuBSYZHgEeHRYBGh0iASIZJgEqGSn9Khkt/TYZPfk+ESHxDhDx7OYM3ejeFNno1hzZ5Noc1dzOIM3cziC95MIhDeUuJR3tGikd7R4pDeUaLSXhNjT93MY8xeDKPOnxHjFJ9VIhVflOEU4BSglN+UYJQf06BTX5MgEx+TIFLfUuDSn1Jg0d9RoREfTqFLH0jhiR8JIYlfCmILX02iTx8PYg+ezyIPnpBhkF7QoZGfkmFRX9DhEF/OoQ0fCyGKHooiCd7KogreSuJKnkoiSl6KIgnfCeIJn0mhyZ9JocmfCaIJ3wmiCd9J4gmfSSIJn0liSR9I4gjfSOGIn0lhit9LoUyfTODMX4tgSd+IoEifiKDI34kgyV/IoMifyODI38jgyJ/IoMifyKDIn8jgyJ+JIMlfyWDJn4mgil+K4InfyaBJn8kgiaAJoMlfyWCJ38ngyZ/JoMnfyeDKH8ogyl9KYIsfS6BMXs4fj17RXZKfFBtV3tgYmp8dk91gFxMWYJcWmqCXnBHgUB/QX5BgD96QYNGeUiFSXlLhkt5S4ZMeE6GTXhLhkp3TIdQdVeIZXNtiXZxfIt+cn6MfnR9jHpyfouFcYiNiHGHjYZzhI2DcoGOgXKBjoFzgI6Dc4iKinaLh496j4OLfIqDi3yGhIV6gYd7eHeKc3Rujmtya5FrcGuSam5qkmtuapJobmeSZ29nkmdtZ5JobWyRcWt2knxpf5KEa4mSim+KjI12kH2RfZFvkICObI+Djm6Og45wjIKJdIWAhHuHgIyChHl+i3pyeZN4bXmVe2t7lXpseJR2bXaVdW10lXVtc5V1a3WVdmt2lnZrdZZ3anaWeGp9k4BrhZGLb46MjnWMh5B7lHySf49zjoGOc42BinWJgY17kX2TgZR4lYiUdZOKknSPi4x0i4yLdIuMinSIjYd0ho0q/yr/Kv8q/yz/Lf8s/yz/LP8s/y7/Lv8u/y7/L/8v/y//L/8v/y//L/8v/zD/MP8v/y//L/8v/y//L/8v/y//MP8w/zD/MP8w/zD/MP8w/zD/MP8w/zH/MP8w/zH/Mf8w/zD/L/8v/y//L/8v/y//L/8v/y//L/8u/y7/L/8v/y7/Lv8v/y//L/8v/y//L/8u/y7/Lv8u/y7/Lv8u/y7/L/8v/y//L/8v/y//L/8v/y7/Lv8u/y7/Lv8t/y7/Lv8u/y7/Lv8u/yz/LP8s/yz/LP8s/yz/LP8s/yz/LP8s/y3/Lf8t/y3/LP8s/yz/Lf8u/y7/Lv8u/y3/Lf8s/yz/LP8s/yv/K/8q/yr/Kf8o/yf/J/8m/yb/Jv8m/yX/Jf8l/yX/Jf8l/yX/Jf8k/yT/JP8k/yT/JP8k/yT/If8k/yT/JP8k/yT/JP8k/yX/Jf8l/yX/Jv8p/yz/P/9x/4T/dP9y/3n/gP+C/3X/Zv9Z/0b/Mf8k/yP/Iv8i/yL/I/8i/yP/Jf8n/yr/Mf85/0T/T/9a/2D/Y/9k/2H/Wv9d/2f/cf9+/4b/if+K/4T/ef9+/3//gP9//2r/YP9c/17/dv+H/4//jP+M/3r/Nv8v/zX/T/93/4v/l/+g/6f/qf+p/6j/p/+i/5z/nP+X/4v/h/9//3z/gv+M/5L/kf+K/3n/df92/3P/Zv9h/2f/a/9y/33/df9+/2z/Vv9f/2P/Yv9g/1z/XP9f/13/XP9b/1z/WP9W/1P/U/9T/1H/UP9N/0v/SP9G/0T/Qf9B/0L/Qf9B/0P/RP9E/0T/Rf9H/0n/Sf9K/0f/Qv88/zj/Nv82/zX/Nv82/zb/Nf8z/zP/Mv8y/zf/S/9P/0f/R/9H/0f/Sv9H/0j/TP89/zD/Mv84/0b/UP9U/1T/Vf9T/1L/UP9P/1D/Tv9N/0z/S/9L/0v/S/9K/0n/Rv9F/0L/OP8q/yP/I/8j/yX/Jv8n/yb/Kf8r/y//Ov88/zz/QP9E/0T/Rf9G/0L/Nf8t/yr/K/8t/y3/Lf8q/yv/K/8q/yn/Kv8p/yj/KP8n/yf/Jv8m/yb/Jv8m/yb/Jv8l/yX/Jv8m/yX/JP8k/yT/I/8i/yP/I/8i/yT/JP8i/yL/If8i/yL/If8j/yP/Iv8i/yL/I/8j/yP/Iv8i/yL/Iv8i/yP/JP8k/yn/LP8x/zX/Of83/zX/Lv8p/yf/KP8o/yX/Jf8n/yf/Jv8m/yf/J/8o/yj/KP8q/yv/Kv8s/y//N/9E/03/VP9Y/1v/XP9b/17/aP9p/1f/UP9K/0P/P/8+/z//Qf9D/0b/SP9J/0v/S/9L/0v/TP9N/0v/Sv9K/0//Vv9i/2n/dP96/37/fv9+/33/ev9//4P/h/+H/4f/hf+E/4P/gf+B/4H/gf+C/4f/iP+L/4z/j/+O/4v/iv+J/4T/hP9//3r/dv9w/2z/af9r/2z/bP9q/2r/av9p/2f/Zv9m/2b/Z/9p/2r/bv9y/3f/e/9//4b/iv+K/4r/i/+Q/4//jv+O/47/jP+N/47/jf+L/4f/hP+F/4v/iP+B/33/ef94/3j/ef97/3v/e/95/3b/dv91/3T/c/90/3X/df92/3b/dv91/3X/d/95/37/g/+I/4v/jf+N/47/kv+U/5D/jv+O/47/jP+J/4n/jf+R/5P/lP+V/5T/kv+Q/47/jP+L/4v/i/+K/4j/h/+G/yp+Kn8rfit/K34sfi1+LX4rfix+Ln4ufi9+L30wfjB8MH4wfTB+MHwxfjF7MX4xfDF9MXsxfTF7MH0wezF9MXswfjB7MX4xezB+MHwxfjF8MX4xfDF+MXwxfjF8MX4xfDF9MXwxfTF9MH0wfS99L30vfS9+L30vfi59Ln4ufS9+Ln0ufy99L38vfS9/L30vfy99L38ufS5/Ln0ufy99L38ufS5/MH0wfy99L38vfS9/Ln0ugC59LoAufS1/LX0tfy19Ln8ufS1/LH0sfix9LH4sfSx9LH0sfS19LXwtfS18LX0tfS59Ln0sfSx9LH0ufS59Ln0ufS59LX0tfC19LXwsfSx8K30qfCp+Knwpfih8KH4oeyZ+JnsmfiZ7Jn4meyV/JXwlfyV8JX8lfCR/JHwlfyR8JH8kfSN+I30jfiN9JH4kfiR+JH4kfiR/JH4kfyV/JX0lgSt7LoRAdm+GgW51hHRoeYOAaoCBcGtfflFtPXwrcyR8I3gjfSN9In4jfiJ/I3slfyh7LIAwejiBQ3hOg1h1XoRhc2ODX3BfhWtndYh9XoWIiV+LhIttg4F8g4N+hZGBfXyQbX9fh1uAXIN0fYWGe3lujHZ3fo9ieDKRMXxEkHB/hYyUfZ2MpXyoi6h6qIyod6ONnHOZjpNxhI9/cn+Sd3R1kH93hI2BeHWKZ3hlh2x7cYVqfWCBZX9ae3CDcG1dhXFieYRVcVOAV4NZgFmKWYBaiFp/VodXgFaHVIBTiFOATohPf1CITH9MiEt/SYhGf0SIQYA/iT2APIk7gDyIP4BAiEF/QIhDf0WIRn5GhkV8Q4ZDe0GFPHo3hjV6Noc0eTSHNnk1iDV5NYg2eTaIMnk7iUt7SYpDe0SKQ3pIikh5SIpJeE6MPXgxjjZ4RoxQe1SIVX1UhFR+VYJTflCCT39OgU5+TYBNfkx/S35LgEl+SYBHfkWCP341hCV+I4YjfSSGJH0lhyZ9J4gnfCiIKnwtiDJ9O4ZCf0aERH9BhDt9MoUtey2HLHktiS14LYkseS2JLHkqiSt6KocoeiiIKHwoiCh9KIcmfSaHJXwnhyV8JYclfSWHJX0lhyV9JIcjfSOHI30jhiJ9IoYifSKFIn0ihCJ+IoQjfiOEIn4ihCN+IoQjfyKEIn8jhCN/I4MifyKDI38jgyN/I4MlfyqCMYA4fkGBR3pJgUh3RII8djOCKnskgiOAJYAlgiZ/JoMmfyaDJ34ngil+KoIrfSuCKX0rgCx7MH87e0V6THxKck99UG5WfV1vY39edFWBTnpKgEV+Qn1Agj97QIRBekODRnlIhUh5SoZLeUuGTXhNhkt4SoZJd0qHT3VUiF1zaIlycXmLfnJ/jIB0f4x9coKLg3GGjYdxho2Fc4WNg3KAjoBygY6Ac4OMh3SJiIx3joSPe46Di3yKg4p8hYSCen2Hd3dzim5zao5pcWqRanBqkmpuapJqbmiSZ25mkmZvZ5JnbWmSbG1wknRreJN8a3+ShW2JjopzioOOeo9zj4CObY6BjW6Ngo5wjYOOcoqChXeDgIh+jH2Ehn92e454cXeTeWx6lXtrepV5bHiUdm12lXVtdJV0bXOVdGt1lXZrdpZ1a3WWdmp3lnpqfpOEbImPjHCOio12j4SUepJ4kH+Pc46BjXOKgYp2i4GNfJJ8k4WTdpSIlHSTi49zjoyMc4uNi3OKjYlziI6Ic4eOKv8q/yv/K/8r/yz/Lf8t/y7/L/8u/y7/L/8v/zD/MP8w/zD/MP8w/zH/Mf8x/zH/Mf8x/zH/Mf8w/zD/Mf8x/zD/MP8x/zH/MP8w/zH/Mf8x/zH/Mf8x/zH/Mf8w/zD/Mf8x/zH/Mf8w/zD/L/8v/y//L/8v/y//Lv8u/y7/L/8u/y7/L/8v/y//L/8v/y//L/8v/y7/Lv8u/y7/MP8w/zD/MP8v/y//Lv8u/y//L/8u/y7/Lv8u/y7/Lf8t/y3/Lf8u/y7/Lf8s/yz/LP8s/yz/LP8s/yz/Lf8t/y3/Lf8t/y3/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8t/y3/Lf8t/yz/LP8r/yr/Kv8q/yn/KP8o/yj/J/8n/yf/Jv8m/yb/Jf8l/yX/Jf8l/yX/JP8k/yX/JP8k/yT/I/8j/yP/I/8k/yT/JP8k/yT/JP8k/yT/Jf8l/yf/LP8v/z7/av+B/3X/c/96/4D/ev9l/1f/Sf8z/yf/JP8j/yP/I/8j/yP/Iv8j/yT/J/8q/y3/Nv9B/0z/Vv9d/2D/Yv9h/1//bv98/4X/iP+I/4z/jf+D/3j/eP97/33/ff9v/13/Wv9b/2f/Zv9f/2n/e/+D/3z/SP8p/z7/ZP99/47/lv+f/6T/pv+o/6b/ov+d/5f/k/+A/3X/fP92/3D/cv9w/2//bP9l/2H/aP9o/2T/Z/9w/2X/Tv9e/0n/Y/+F/1n/Tf9R/1P/VP9V/1P/Vf9V/1P/Uv9S/1D/Tv9I/0n/S/9K/0r/R/9F/0L/QP89/zv/Of84/zn/Of85/zv/Pf88/z//Qv9D/0P/Rf9F/0L/Qv9A/zz/N/82/zT/NP81/zb/Nv82/zb/Nv80/zP/Pv9J/0X/RP9D/0T/Rf9E/0b/SP9U/0P/Nv9C/0//VP9V/1T/U/9R/1H/T/9P/07/Tv9N/0z/S/9L/0v/Sf9J/0f/Rf8//zL/JP8l/yP/JP8k/yX/Jv8n/yf/KP8q/yn/NP9A/0L/Qv8//zf/Lv8r/y3/Lv8v/yz/Lv8u/y3/Lf8s/yz/K/8r/yj/J/8n/yf/J/8n/yf/Jv8m/yj/KP8o/yf/Jf8l/yX/Jf8k/yP/I/8j/yP/Iv8i/yL/Iv8i/yL/Iv8i/yP/I/8i/yL/Iv8j/yH/I/8i/yL/I/8j/yT/JP8j/yP/Iv8l/yr/NP8//0r/U/9X/1f/Vv9S/0z/Qf8z/yf/JP8j/yX/Jv8m/yb/Jv8p/yn/LP8v/y3/LP8u/zP/Nv87/zz/P/9I/0v/UP9d/2z/bP9n/1//Wf9R/07/R/9D/z//P/9A/0H/Q/9G/0j/SP9K/0v/S/9L/0v/Sv9J/0j/Sf9M/1L/Xf9n/3D/eP9+/3//gP9//3//gv+F/4b/h/+G/4X/hf+C/4L/gf+A/4L/hf+J/4v/jv+O/47/jv+L/4r/iP+E/4D/ev92/3D/a/9q/2r/aP9q/2r/av9q/2r/aP9n/2b/Zv9n/2j/av9s/3D/dP94/3z/gP+F/4j/jf+Q/5H/j/+N/43/jf+M/4z/jP+P/47/h/+E/4T/iP+J/4H/ff96/3f/d/95/3r/e/96/3n/eP92/3b/df90/3T/c/90/3X/dv92/3T/dv93/3j/ff+B/4X/i/+M/4z/jv+Q/5b/kf+O/47/jv+N/4r/i/+O/5D/kv+T/5T/lf+S/4//jv+N/4z/i/+K/4n/iP+H/4b/hv8qfyp/K38rfyt/LH4ufy5+Ln4ufi1+Ln4vfi99MX4xfDB+MHwwfjB8MH4wezB+MHsxfTF7MX0xezB+MHsxfjF7MH4wezF+MXsxfjF8MX4xfDF+MXsxfjB7MH4wey9+L3swfjB8MH4wfTB+MH0wfjB9L30vfS99L30vfS99L30vfS59Ln0ufS59L30vfy99L38vfS9/Ln0ufy59Ln8ufS5/Ln0ufy59Ln8ufS5/L30vfy59Ln8tfS1/Ln0ufy59Ln8sfS1/LX0tfyx9LH4sfSx+LH0sfSx9LH0tfS19LX0tfS18LX0ufC59LXwtfS58Ln0ufC59LnwufS19LXwtfS18LH0sfCt9K3wqfip8KX4ofCh+KHsofih7KH4nfCZ+JnwmfiZ7Jn4meyV/JH0lfyV9JH8kfCV/JH0jfiN8I34jfCN+I30kfiR9JX4lfiR+JH4lfyV8J4AtejODPnRlhX9wdYVza3aCfG5wgGFtUH49cCt8JHcjfSV8JH0jfiN+I34jfyN/I38mfSl/LX02gEB6S4FWd1yDYXNkhmVsYoduZICIhV2JhIpfjIKHboF/dYV3fHiQe3t+kG9+XIZZgFqEZntjh2d2cI16c3+QeHR8kT15LY9WgHONh3+Ti5p+oIqle6eLpXmjjJ92moyWc4aOenJ7k3dxcZFqdWmNaHlqiGV6Z4VqfWiCcX93fHuAcnRUgUhwUYRXZ36EYmdJgE+BT39OiUt/UItNf1OIUn9OiUx/SolIf0SJRX9IiUV/RIlEf0OIQX8/iDx/Noo1fzSKNH8ziTZ/Nok3fzeIOX8+iEJ9QoZCfUGGQXtBhUB7QIU8ezmHNnszhzR6Noc1ejaHNXg0hzR4Noc4eD2JRnpFiUR7RIpFe0WKQ3hFi0x3V41Hd0CMTXlTilV9U4ZTflGEUH9Pgk9/T4FNfk2ATX5Mf0t/S4BKf0qASH9GgD5/MYMkfySEI34khiV9JYYofSiHJ30nhyh9KocrfjSGOX82hTB/K4Ytey6ILngtiS14Loouei2ILnsthy59LYgqfiqGKHwkhiN+JognfSqHJ3wmhyd8KIYpfCmGKn0nhiZ9JoYkfSSFJH0jhSN9IoUifiGGI30jhyN9I4cjfiOFIn4ihSJ+I4QjfiWEJH8ihCF/IoQhfyGEIn8ihCJ/IoUjfyiEMn9Af0x/VnVhgWlqaIJnY2GDWmdQhEJxM4MqeiSCJH8lfyWDJn4mgyh9KoIwfTWCOns9gEF8PX44e0x8XHtsfHZ9dXx2fnZ+c39ue2eBYX1agVF/TYBIgkR9QIE/fEGCQnlEhUd6SYZJekqFSnhKhUt4S4ZJeUmGSXdJh0p1UIhbc2eIcnF6i39zg4yCdICMgXKEjIZxh4yHcYWNhHOEjYNygI2Cc4GMhXOIi4p1i4aMe42DjXuMg4t8i4OHfIOFfnp4h3J2bopqcmqOaW9pkWpvapJqb2qSaW9okmhvZ5Jmb2iSam1qkm1scpJ2a3qUfmqDkoduio2PeJN7k3+Pb46BjW2Ng4xvjYKPcI6DinOEgoN7hX+KgoV6f4p9c3mSdm52k3lsepR7anqVeGt3lHVsdZV0bHOVcmxylXRqdZZ2anaWdmp2lnZpd5Z+aYGTiG2Lj4xyjYqNdpKBmHyRdI2AjXGOgYxzioKMdo+BkX2Se5SGlHaUipJzkIyOco2NjHKKjohyh46GcoSPhHKCjyr/Kv8r/yv/K/8s/y7/Lv8u/y7/Lf8u/zD/MP8x/zH/Mv8y/zL/Mv8y/zL/MP8w/zH/Mf8x/zH/MP8w/zH/Mf8x/zH/Mf8x/zH/Mf8x/zH/Mf8x/zH/MP8w/zD/MP8w/zD/MP8w/zD/MP8w/zD/MP8v/y//L/8v/y//L/8v/y//Lv8u/y7/Lv8v/y//L/8v/y//L/8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8t/y3/Lv8u/y3/Lf8u/y7/Lf8t/yz/Lf8t/y3/LP8s/yz/LP8s/yz/LP8s/y3/Lf8t/y3/Lf8t/y7/Lv8t/y3/Lv8u/y7/Lv8u/y7/Lf8t/y3/Lf8s/yz/K/8r/yr/Kv8p/yj/KP8o/yj/J/8l/yX/Jv8m/yb/Jv8m/yb/Jf8k/yX/Jf8k/yT/Jf8k/yP/I/8j/yP/I/8j/yT/JP8l/yX/JP8k/yX/Jv8p/y//Nv9B/2H/fv91/3P/df94/2v/Wv9K/zX/Jv8i/yT/Jf8k/yT/JP8j/yP/I/8j/yb/Kf8t/zX/P/9J/1P/XP9h/2T/Z/9u/3r/gf+E/4b/iP+G/33/a/9w/3f/dv94/3r/cv9g/13/Xv9k/2f/df96/3v/ef99/47/eP8v/z7/aP96/4r/k/+Z/57/o/+i/6H/oP+b/5D/h/+A/3r/dv9w/2f/Z/9m/2j/Z/9l/2f/b/94/3z/eP93/2//Yv9c/1f/Z/9d/0P/S/9K/0b/Rv9J/0r/VP9V/03/R/9G/0T/QP8//0L/Qf8//0D/P/9A/z7/Ov82/zP/M/8x/zD/MP8z/zT/NP81/zn/Pv9A/0D/P/8//z//Pv8+/z7/Pv84/zT/M/81/zX/Nv82/zb/Nf80/zb/N/9A/0j/Rv9E/0T/Rv9F/0X/SP9P/1j/S/9I/1D/Vf9V/1L/Uf9Q/0//T/9P/03/Tf9M/0z/TP9M/0v/S/9J/0f/P/8z/yT/JP8j/yT/Jf8l/yf/J/8m/yf/KP8q/yj/J/8q/yf/KP8s/y//Lv8v/y//L/8u/zD/Lv8t/y//Lv8v/y3/J/8l/yP/I/8m/yf/Kv8o/yf/J/8o/yj/KP8m/yf/J/8m/yX/JP8l/yT/I/8i/yL/Iv8j/yP/I/8j/yP/I/8i/yL/I/8j/yn/Nf8y/yX/If8h/yH/If8i/yL/Iv8i/yT/LP84/0T/U/9f/2v/dP94/3T/b/9o/1z/Tv8//zD/Kv8l/yX/Jf8n/yn/Lv8w/y//NP88/0j/Wf9b/1D/df+A/3f/c/92/3b/df90/3H/bf9m/13/VP9M/0b/Qv8//0H/Qf9D/0X/R/9J/0n/Sv9K/0r/S/9L/0n/Sf9I/0j/Sv9Q/1v/Z/9y/3r/gP+E/4T/gv+D/4P/hv+I/4f/hf+E/4P/gv+B/4L/g/+G/4n/iv+M/4z/jf+M/4r/if+J/4T/gP97/3b/cP9r/2n/af9p/2n/af9p/2r/af9p/2j/aP9n/2f/av9r/2v/b/9z/3j/ev+A/4X/iP+N/5L/lP+R/4//jv+N/43/jv+O/47/jP+G/4P/hP+H/4n/g/+A/33/ef92/3b/eP96/3r/ef94/3f/df90/3P/c/9y/3L/dP91/3b/dv92/3b/d/96/37/hP+K/4z/jf+N/47/lf+U/5D/jv+O/47/jP+K/4z/j/+R/5H/k/+U/5P/kf+P/4z/jP+K/4n/h/+G/4T/hP+E/4L/LH8qfyt/LX8tfyx+LX8tfi5+Ln4tfi5+MX4xfTB+MHwyfjJ7M34zezJ+MnoyfjJ7Mn4yezJ+MnsxfjF7MX4xezB+MHsxfjF7MX4xfDF+MXwyfjJ7MH4wezF+MnsyfjJ7MX4xfDF+MX0wfi99MH4wfS99L30vfS99L30vfS99L30vfS99L30vfS99L34vfS9+L30vfy99L38ufS5/Ln0ufy59Ln8ufS5/Ln0tfy19LX8ufS5/LX0sfy19LX8sfSx/Ln0ufi59Ln4sfSx9LH0sfS19LX0tfS19LX0tfS19LX0tfC19LXwtfS18LX0ufC59LnwufS58Ln0tfS18LX0tfC19LXwqfSp8KX4pfCl+KHwofih7J34neyh+KHwnfid8Jn4meyZ+JnslfyV7JX8leyV/JXolfyR8JH4kfCR+JHwjfiN9JH4kfSR+JH4kfiV+Jn8neyuAMXk6g0J0XIV8cHWFcW1xgnFubH5Wbz98LXImfCR5I34lfCR9JX4kfiN/I38jgCR/Jn8pfy59MoA7ekWDUXdahWJwaIZtZ3aHgFqChoRYg4KEZnp/X3VPfm2Can5piXB9cIlzfmSFYYBgg2Z8c4Z+d3iMdnV5j4V2iZCIeWGNM35binKAgoqKgI+KmH2eip97nYqceJiLi3WGjYZygpJwcmeSYXVhi2V6aIhne2KEXn1mgW+Ad3twfm9ydn14bHiAb2B2hG9lOIBEfEd/QoZBf0GKP39BikV/RYpEf0GKQ38+ijt/PYo8fzuKPH89iTp/OIk1fzOKMn8xijF/L4kufy+JMX4xiTF+NYk5fTyIPX0+iD58Poc+fD2HPXs9hzt7OIc1ejWGNno3hjd6Noc4ejiHOHo6iDx7RIhIe0aIR3tFiUZ4RopGd0iMTXZUjE53SItRe1WIU35RhlB/T4ZPf06ETX5Ngk1+TYFMf0uAS39KgEuARn9BgDWCJn8lhCR+JYYlfSWGJn0nhyZ9J4cpfSmHKH0mhiV8JIcofCuHLXkviC94LooueS6JMHswhy99L4UwgDGEL4AnhCJ/IoQjfiWFJ30ship8KIYofCiGJ3wnhid9J4YnfSeGJX0lhSV9JYUkfSSFI30jhiJ9IoUifSKFIn4ihSJ+I4UjfiOEJn4thCp/JIQifyGEIX8hhCF/IYQifyKEJX8vgj1/S3xaf2lxdoB+Y4SCf156g3JdZ4RcZU2EPm8xgyl6J4Apfyx/MH80fTyASn1UgE18RH9Pe099X3x+eYF/fHh2gHZ8dX91fnR/cXxtgWZ8XoFWfk2ARoFCfj+BRHxBg0J5RIVHekmGSXpJh0p4S4dJeEmGSHlIhkd3R4dIdU+IWXJninJwfIyDcYaMhnKFjIZyhoyHcYeMh3GFjYNzgo2BcoGMhHOEi4h0iYiKeI2DjHuMg4p7iIOGe4WFhHt+hnh4dIludWqMaHFojmlvaZFob2iSam9qkmlvaJJnb2eSZm9pkmttbZJwbHSSeWt8lIFuh46MdJGDlHuUcpGBj2yPg45sjYOObo+Dj3CKhIN2gYGFfYl+h4SCeH6Le3B4kHdtdpN4a3qUeWp4lXdrdpR0bHOVc2xzlXNsc5V0anWWdWp1lnVqdpZ5anyVgmqGkoltjIyMco2GkHmVe5J+kHOQgJBzjYGKdYmCjHqRfpCBk3mTh5J1kYuPcoyNjHKLjolyh4+GcoePhXKDjoNygY4s/yr/K/8t/y7/Lv8t/y3/Lv8u/y//MP8x/zH/Mf8x/zL/Mv8z/zP/Mv8y/zL/Mv8y/zL/Mv8y/zH/Mf8x/zH/MP8w/zH/Mf8x/zH/Mf8x/zL/Mv8x/zH/M/8z/zP/M/8x/zH/Mf8x/zD/L/8w/zD/L/8v/y//L/8v/y//L/8v/y//L/8v/y//L/8v/y//L/8v/y//L/8v/y7/Lv8u/y7/Lv8u/y7/Lv8u/y3/Lf8t/y7/Lv8t/yz/Lf8t/yz/LP8t/y3/Lf8t/yz/LP8s/yz/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y7/Lv8u/y7/Lv8u/y3/Lf8t/y3/LP8s/yr/Kv8p/yn/Kf8o/yj/KP8n/yf/J/8n/yf/J/8m/yb/Jv8m/yX/Jf8l/yX/Jf8l/yX/JP8k/yT/JP8k/yP/I/8k/yT/JP8k/yT/Jf8l/yj/Lv80/zv/Rv9X/3f/df9x/3H/b/9u/1P/N/8n/yX/Jf8j/yX/Jf8l/yT/I/8j/yP/JP8m/yn/Lf8z/zn/Q/9Q/1r/Y/9t/3T/e/9//4D/gf98/3X/Yv88/0f/a/9w/3D/c/9x/3f/aP9k/2P/Zv9z/3z/d/92/4T/if+B/4L/f/9Q/0P/Zf90/3//hv+O/5b/mf+a/5j/lf+G/4T/iP+G/3D/XP9g/2H/Z/9o/2P/YP9d/2P/bP95/33/df9r/2z/e/98/3z/gf9M/zn/Qv9D/zz/O/87/zz/QP8+/zz/PP89/zv/Of85/zj/N/83/zj/Nv80/zH/L/8v/y7/L/8t/yz/Lf8v/y//L/8y/zb/Of86/zv/Pv8+/z7/Pf89/z3/Pf87/zj/N/83/zf/N/83/zn/Of83/zr/PP89/0T/R/9G/0T/RP9G/0X/Rf9I/0z/UP9O/0j/Tv9Q/1D/T/9O/03/TP9N/03/Tf9N/0z/Sv9L/0r/Sf9H/0P/Of8m/yT/JP8l/yX/Jf8m/yf/J/8o/yn/Kf8o/yb/Jf8k/yX/K/8u/y7/L/8u/y7/Mv8y/y//MP8z/zX/Nf8v/yf/IP8g/yH/I/8n/yz/Kv8o/yj/KP8o/yj/J/8n/yf/J/8m/yb/Jv8m/yX/Jf8k/yT/Iv8i/yL/Iv8i/yL/I/8k/yP/I/8h/yL/Iv8j/yL/I/8h/yH/If8h/yL/Iv8m/zD/P/9M/1n/av97/4f/iv+I/4H/ev9x/2b/XP9N/0H/OP80/zP/Nv9B/1P/Yf9s/2v/W/9d/2L/Z/95/33/gv+A/3f/dP90/3X/df9z/27/af9i/1f/Tv9F/0L/Qv9B/0L/RP9G/0f/Sf9J/0n/Sv9L/0n/Sf9I/0j/R/9H/0v/Uv9d/2n/c/9+/4X/h/+H/4f/h/+H/4f/h/+H/4X/g/+C/4H/gP+F/4f/if+J/4z/jf+M/4r/if+I/4b/g/+B/3z/dv9x/2z/av9o/2j/af9p/2j/aP9q/2r/af9o/2f/Z/9n/2n/a/9u/3H/df96/33/hP+I/47/lP+V/5H/kP+O/43/jP+N/4//kP+O/4b/gv+C/4b/iv+F/4D/ff95/3j/dv93/3n/ev95/3j/d/92/3P/c/9z/3P/c/9z/3T/df91/3X/dv93/3n/fP+C/4b/iv+N/43/jv+S/5X/kv+P/4//j/+O/4v/iv+O/5D/j/+S/5H/k/+Q/47/jP+M/4r/iP+H/4b/hP+D/4T/gv+B/y1+LX0tfi59Ln4ufS5+Ln0vfy98MH8xfDF/MXwyfzJ8Mn8yfTJ/Mn0yfjJ8Mn4xfDF/MnsxfzF7Mn4yejF+MXoxfjJ7MX4xezJ+MnsyfjJ7M34zezN+M3szfjN6M34zejN+M3swfjB7MH4wfS9+L30vfS98L30vfC99L30vey99Ln4ufC5+Ln0ufi59Ln4ufS59Ln0ufS5+Ln0ufy59Ln8vfS9/LX0tfy59LX8sfix+LH4sfix+LH4sfSx+LH0sfi19LX4tfS1+LX0tfi19LX4tfS1+LXstfi18LX0tfC19LXwtfS58Ln0ufC59LXwtfS58L30ufC59LnwufS18LX0sfSx8K30pfCl+KXspfil7KX4oeid+J3omgCZ7J4Aneyd+J3omfiZ6JX4leiV+JXklfiV5JX4leiV/JXwlfyV8IoAkeiR+JHwlfCV8JX8lfCd+K3wwgDV5PIRJcFiEbWx4g2ttaIJra21/WW4yeyRyJXwleSR8JYAlfiWAJX8lfiV+JYAmfyaAKH4rfjKBOHpBg01zXIZoa3WIfF1+h3xae4N3XXB/XGo7fihzP35mfXl+codxfHSLen5qh2SAY4NifW2EdHh7iYV2hY59d3uMenl8inV9SYlSf22KeYB/iYJ+i4mNfZOJl3uUi4l3g4yEdYGObXZfjVx5YIlhe16HYXlkhWN7Z4N0fX9/gXt9e3B4a3V0enhudIJ3YmqCLW85gT6BPIA4izZ+N4s6fjqLOn44jDZ+N4w1fjWKM34yijZ+Noo1fjGKMH4viS1+LIksfiyIKH4qiC1+LIgsfi+IMX80iTZ/N4c6fjyIPH48iDt8O4Y8ez2GOXs3hzd6OIc5ezmIPHpEi0t4QYs+ezqJP3xFiUd7R4pFekSKRXlFi0Z4R4xJeE+MRXdBjEt5TopLfEyJTX1Mh0t/S4VLf0uDS39Lgkp/SIBHf0eCRX89git/I4QlfSWGJn4mhid+J4cpfSqHLH0phyh/JoclfiSHJXssiC56L4kvei+KMXwxiTGANoQ4gjiAOoM4fTCCJn8ggCCBIH8igyd+LYQufyyEKn8mhSl9KIUpfSeGJ3wnhid+J4YmfSWFJX0lhiZ9JIUkfSSEJH0khCN9I4MjfSODI34jgyN+I4QjfiOFI34jhSJ/IoYhfyGFIn4ihCV+LoM9f0x8XX9tcX+AiWWKgYlegoR9WXWEbVxohF5lVIRQbUmDRnRIgVR7Yn9mf2V9a31lgGV6bIBzeXaBeXl4gXx5en92e3V/d390fnJ+cYBrfWOBWXxQgUh+Q39BgkF8RIRFe0eESHpIhUl6SYZKeUqHSnhKh0d4R4dGd0eITHVTiV5xaYt0b3+OhW+KjYlwiI2JcoiNiHKIjYZyhI2DcoKNgXKCjIRzh4qId4yGi3uNhIt8iIKJfIaFhXqChX55eIhydm6ManNpj2hwaJFob2iRaG9okmhvaJJob2eSZ29nkmhuapJrbHCScmt2lHtrfpGBboiHkHeUepV+kW6Rg45ujYSObI6EkG2OhIpxg4GDeIWBiICIfIOHgHV9jnpwd5J3bHmVemx5lXprdpV2a3WUdGxzlXRsdJV0bXSVdGt0lnRrdJZza3aWeGl8lINqh4+McI6LjHSOhJR6lHeQfo5zjYCNcouAiHWLgI99j3uOhJB4kYqRdY6KjXOMjYpyio6HcYeOhnGFj4NxgI+Bc4GLLP8t/y7/L/8u/y7/Lv8u/y//MP8w/zH/Mf8y/zL/Mv8y/zL/Mv8y/zP/M/8y/zH/Mf8y/zH/Mf8y/zL/Mf8x/zH/Mv8x/zH/Mv8y/zL/Mv8z/zP/M/8z/zP/M/8y/zL/MP8w/zD/MP8w/zD/L/8v/y//L/8v/y//L/8v/y//L/8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y//L/8s/yz/LP8t/yz/LP8s/yz/LP8s/yz/LP8s/yz/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lv8u/y7/Lv8t/y3/Lv8v/y7/Lv8u/y7/Lf8t/y3/Lf8r/yn/Kf8p/yn/Kf8p/yj/J/8n/yf/Jv8n/yf/J/8n/yf/Jv8m/yX/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8l/yT/JP8k/yX/Jv8l/yX/Kf8t/zP/M/89/0r/Wf9n/3L/bv9n/2b/af9k/0D/JP8l/yX/JP8l/yX/Jf8l/yX/Jv8m/yX/Jf8o/yr/Lv82/0H/Tv9h/3T/gf9//3z/ef91/23/Yf9K/zT/Lv82/1n/eP9z/3L/ef97/2z/Yf9h/2f/af9y/3//hv9//3n/d/93/3r/ev9k/0v/Xf9w/3j/ef+A/4P/iv+O/5L/iv+C/3b/bP9o/2T/ZP9n/2H/Wf9c/2L/af9u/3b/gf+F/3z/cv9s/2z/bv9x/3P/dv8+/zH/NP83/zX/NP81/zX/Nf82/zT/M/8y/zL/Mv8x/zD/Mv8z/zH/L/8u/y7/LP8s/yz/LP8o/yf/Kf8p/yv/LP8v/zD/Mv8z/zj/Of86/zz/PP88/zz/PP87/zr/OP85/zz/Pf8//1n/Yv9I/0L/QP8+/0L/Sf9J/0b/Rv9H/0b/Rv9I/0f/SP9K/0L/Q/9I/0r/S/9M/0v/Sv9K/0r/Sv9L/0v/Sv9I/0f/R/9E/0D/Nf8m/yX/Jf8m/yb/KP8q/yr/Kv8r/yr/J/8l/yX/JP8l/yz/Lv8v/y//Lv8w/zT/OP89/z7/O/89/zv/M/8n/x//H/8g/yL/Kv8w/zH/Mv8v/y3/LP8r/yv/Kf8n/yf/Kf8p/yb/Jf8l/yX/Jf8m/yT/JP8k/yT/JP8k/yP/I/8j/yP/I/8j/yP/I/8j/yP/Iv8i/yH/If8i/yL/J/8u/zz/S/9e/27/ff+I/4v/i/+H/4L/f/95/3X/cP9r/2b/YP9X/1f/WP9d/2b/Z/9f/1v/U/9P/13/ZP9S/0r/a/9x/23/cv92/3X/df9x/23/ZP9c/1L/Sv9D/0L/Q/9E/0X/R/9J/0n/Sf9J/0j/SP9I/0j/R/9H/0b/R/9M/1P/Xf9q/3b/gf+I/4v/i/+K/4v/iv+I/4f/hv+E/4L/gv+B/4L/hf+H/4r/i/+L/4z/iP+I/4f/h/+E/4D/ev90/3H/bf9r/2n/aP9o/2j/aP9q/2r/av9q/2j/Z/9n/2f/af9q/23/cf90/3n/e/9+/4X/jf+T/5X/lP+R/47/jf+M/43/jv+Q/47/h/+C/4H/hf+I/4j/gv9//3z/ef93/3b/eP96/3n/d/93/3b/df90/3P/c/9z/3P/c/9z/3T/dP90/3b/dv96/3//hf+K/4z/jf+N/5D/lf+R/4//jf+N/43/iv+J/4v/j/+P/47/jv+P/4//jv+N/4v/iv+K/4j/h/+G/4L/gf+A/4H/g/8ufi59Ln4ufS5+Ln0ufi59MH8wezB/MXsxfzF8Mn8yfDJ/Mn0zfzN9M34zfDJ+MnwyfzN7M38zezN+M3oyfjJ6M34zezN+M3szfjN7M34zezN+M3szfjN7M34zfDN+M3wyfjJ8MX4xfDB+MHwwfjB8L30vfC99L3wvfS98L3svfC99L3wvfS99L30ufS59Ln0ufS59Ln0ufi59Ln4ufS5+Ln0ufy59LX8sfSx/LH4sfix+LH4sfix+LH0sfi19LX4sfSx+LX0tfi19LX4tfS1+LX0tfi17LX4tfC19LXwtfS18LX0ufC59LnwufS18LX0ufC99L3wvfS58Ln0tfC19LH0sfSt9KX0qfip8Kn4qfCp+KXwofih8KX4peyh+J3sofih8KH4nfCZ+JXomfiZ5JX4leSV+JXolfyV7JX8leyWAJHklfyV5Jn4leiV+JXsqfi95MYA2dT2ETW5ahWZrb4Rua2iDZGpjgmZqVn8rbiF8JXgkfCR8JH4kfiV/JX8lfSaAJ34ofyh+KXsugzZ0RoZYa2+JgmKEiYBbfYV4XG+DZmFVgkVlP4A2bTmAVHh1fnCFbHx8iXx+a4VjgGKBZX1phHZ1hYyGc3+PdXVzjnV7dol5fHqIYn5MiGCAcIhwgXKIdn98iIR8g4l7eXKLanlni2l6aIpofG2HbHtrhm14coZ5eXiHenl+hoJ5eYNtd2GCVnhLgEt+R31NgUt+LoAwgjN+MYcxfjGJMX4xiTJ+M4oxfjCKLn4uiC9+L4gtfi+JL34tiC1+LYkrfiuJLH4siCd+JIgpfimIJ34oiCx/LIkwfzOHNX44iDh+Oog6fTmGOn07hjp9Ooc6fTuHOnw9iD97P4pCeUOKQ3xCiUF9RIlGfUmJTHxJiUZ6SIpHeUSLRnhJi0p3SIxAeD6MRnpIi0p8TIpJfkaJR35Jh0p/S4RKf0iDRn9FgkN/QII5fymEJH0khiZ8JIYofCuHK30rhyt9KocofiWHJXwlhyZ7K4guejCJMHouiTF+OoQ9gkB+QoRAeT2EOnc0gyh6HoAfgB9/JYItfzKANIE3fTiBNX4vgC1+Ln8qgSZ+JoMlfSaEJ30nhSV9JYYlfSWFJH0khCR9I4QlfSODJX0kgyV+JYMjfiOEIn4igyJ+IoMjfyODIn8igyJ+I4MlfiqDNH5HfVl+anJ9gIZli4GMXoqEh1yGhINdf4R+YHuEeml3g21wbIFnd1mCW3lXgFx6ZoFeekaBQHlGfzV2PH1gdnZ8fHh3fnN7c35ufHR/b3tngVx6U4BKfUR/Q4FDfEKERXtHhUh6SYRJekmGSXlJh0l4SYdIeEiHRXdIiE11VIlfcW2MeG+Dj4lvjI2NcIyNjHKLjYhyho2GcoSNgnKCjYFzhIqHdYiHi3mLhYt7ioOIfIiEhnuDhoF5fYd5d3SKb3RsjGpyaI9ocGiRaW9pkWlvaZJob2iSaG9nkmdvZ5JpbmuSbmxyknRreJJ7boCMinKSfpV7lXGSgZFtj4SNbo2DjG2Pg45xiYODdYGBhHyEfoiBhHl+in5zepB4cHaSdWx3lXhseJV3bHaVdWx1lHRtc5VzbXOVc21zlXNrc5Z1a3WWdmt5lntqgJSGa4uPjXCMio52lH+UfZB0joCOc46Bi3SJgYh4i3+Of456joaOdo+Lj3OOjY1yi42JcYeOhnGGj4ZxhI6Cc4KKg3WEhC7/Lv8u/y7/Lv8u/y7/Lv8w/zD/MP8x/zH/Mf8y/zL/Mv8y/zP/M/8y/zL/Mv8y/zL/M/8z/zP/M/8z/zL/Mv8z/zP/M/8z/zP/M/8z/zP/M/8z/zP/M/8z/zP/M/8z/zT/NP8x/zH/MP8w/zD/MP8w/zD/L/8v/y//L/8v/y//L/8v/y//L/8v/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lf8s/yz/LP8s/yz/LP8s/yz/LP8s/yz/LP8s/yz/LP8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y7/Lv8u/y7/Lf8t/y//Lv8v/y//L/8v/y3/Lf8s/yz/K/8p/yr/Kv8q/yr/Kv8p/yj/KP8p/yn/Kf8p/yj/KP8o/yf/Jv8l/yb/Jv8l/yX/Jf8l/yX/Jf8l/yX/JP8n/yv/Kf8n/yX/Jv8o/yv/LP8v/zX/Pv9M/1r/Zv9v/3H/a/9n/2P/Zv9j/0H/Iv8k/yP/Jf8k/yX/Jf8l/yX/Jf8m/yn/Kf8r/zP/RP9U/2z/hf+I/4T/gf97/3T/av9f/1b/UP9J/0T/Rv9S/2H/Yv9m/37/ev9u/2P/Yf9o/2v/fv+J/4f/e/9z/3P/df92/3f/fP95/0//Uf9n/2z/av9r/2//df9z/3T/a/9n/2r/a/9s/2//dP98/33/gP+G/4f/hP+E/3//ef9x/17/Tf9E/zv/Mf8y/zL/NP8t/y3/Lf8u/zD/MP8x/zH/Lv8v/y//L/8s/yr/K/8r/yv/K/8t/yz/LP8s/yv/K/8r/yv/KP8l/yb/Jv8n/yj/Kv8r/y7/Mf8z/zX/N/84/zf/Nf82/zf/N/83/zn/Ov86/z7/Qv9E/0b/SP9K/0b/Rv9G/0b/SP9K/0z/Tf9L/0r/Sf9I/0v/S/9K/0f/QP9A/0T/SP9K/0n/RP9E/0f/Sf9K/0n/SP9H/0X/Qv8//zn/K/8k/yT/Jf8m/yj/K/8s/yz/LP8r/yn/Jv8l/yX/Jf8q/y7/MP8w/y//Nv8+/0D/RP9D/0H/P/8+/zP/KP8g/yH/Iv8n/zD/N/88/zz/Of85/zj/Nf8y/y7/KP8o/yf/Jf8m/yb/Jf8l/yX/Jf8k/yT/JP8j/yL/I/8k/yX/Jf8l/yX/I/8j/yP/I/8j/yT/JP8k/yT/JP8j/yT/KP8y/0f/Wf9q/3z/h/+M/43/jP+M/4v/iP+E/4X/g/+C/4H/e/91/27/Xf9c/2P/af9l/1r/UP9W/0//P/9L/2r/ff9+/3b/dP9o/0P/YP9x/2j/Yf9V/03/Rv9F/0X/Rf9H/0j/SP9J/0r/Sv9J/0n/R/9H/0b/Rv9F/0j/Tf9U/2D/bv94/4P/if+M/43/jP+M/4v/iP+G/4T/g/+C/4L/hP+F/4j/if+L/4v/iv+J/4b/hf+G/4P/gP98/3f/c/9t/2v/af9o/2j/aP9o/2j/af9p/2j/aP9o/2f/Z/9n/2n/a/9u/3L/df95/3v/gv+N/5T/lP+S/5H/j/+O/4z/jP+P/4//iv+F/4H/gP+D/4j/iP+D/4D/ff96/3j/dv91/3f/eP94/3f/dv91/3X/dP9z/3P/c/9z/3P/c/9z/3X/df92/3n/fP+C/4f/jP+M/4v/j/+W/5P/kP+N/4z/jP+K/4j/if+N/4//jv+O/47/kf+P/43/i/+L/4n/h/+G/4b/g/+A/4L/g/+G/4f/LX4tfS5+Lnsvfi97L34tey9+MHsxfjF7MX4xezJ+MnkyfjJ7Mn4yezJ/MnsyfzJ7Mn8zezN/M3szfjN6Mn4yejN+M3ozfjN6M34zejR+MnoyfjJ8M34zfDN+M3szfjN7M34zfTJ+Mn0xfjF9MX4xfTF+MH0wfjB9L3wuei98L3ovfi99L34vfS5+Ln0tfi19Ln4ufS5+Ln0ufi59Ln4ufS5+Ln4tfit+LH4sfix+LH4sfix+LH4sfix9LH4sfSx+LH0sfi19LX4tfS1+LX0tfi18LX0tfC19LXwtfS18LX0tfC19LXwtfS58Ln0ufC59LnwufS58Ln4ufC5+Lnwufix9LH4sfSt+K30rfSt9K30qfip8Kn4qfCl+KX0pfil9KH4ofSl+KH0nfiZ7JX4leiV/JXklfyV7Jn8meiaAJ3kqgTh3Q4E3did+JngnfiZ5KX8tdzCBNnI/hUxsW4dmZ2+FdGdwhWlnZ4ViaGWBWm0vfCR1I3wjeyR8Jn8kfiR/Jn0nfiiBLHkzgz1wT4VjaXiIhWWLiYtkhYWBY3eEbGVkhWBjWYVXYVKDTmdPgVhzYX5kgm56e4h3fW6GZ4BmgWh8cISHdoyOg3N5k2t4bo1ye3CJcn13iHt9V4hBf1eGYoNmhmGDY4ZlfmeHd31uimF9bIlvfXOHe3+DiIh9iIiGeoqHjHiMiIl4folreFeNRHg4izZ5NIo0fTSHNH43hzF/KoYofimGL34uhy1+LYctfi2ILH4siCp+KYcpfimHKn4qhyp+KoYqfiiIJ34nhyd+J4clfiOHJH4mhyZ+J4cnfyqILIAviDF+M4c0fjWHNYAzhjN/M4YzfzOGN344hzh+PIhCfUaJSXtKi0l8SopKfUiJSX1MiUx8UIhSfFGJUHpPiVF6TolLekiLSXpIi0N5QY1CeUWNRntCikJ9Q4lHfkeGSH9JhUiARoVAgD+FOYAshSV/JYYlfSeHKH0riC1/Locufy2HKn4ohyV+I4cjfCmILXouiS56MYc6f0CCRYNJeUWFQnZChD12MYIkex+AI4Elfyt/MoA6fT2CP3k9hDp5OIM2eTSBMnwrgCp/KX8lhCR+JYUkfiOHI30jhiV+JYQjfiKEJH4kgyV+JYMlfiWDJH4lgyZ+JYMmfieDJ34ogSl9KYAofieAKX4sfjJ8RXtWfmd0eX+HaY6AjWKPgo9gjYOLX4mDiV6Ig4VmhIOAbXyDcHFkg2t0b4NqeGmDW3xdg2h7W4I1ekGAZHh2f4F4fIB3e3KAYntjf3B8aoFhe1iBTn5Gf0WBRXxHhEl6SYVJeUqESnpKhUl6SYZHeUeIRHhEh0Z2R4lLdFWKYW9tjXhug46Jb4yOjnCMjYxyio2IcoaNg3KCjIFzg4qEdIeJi3eLhox8ioOJfIiChnyFhIV6goeAdnyKeHZyjGxzapBocWiRaHBokWdvZ5Fpb2mTaG9ok2hvZ5Nnb2mTam5sk29tc5N2bHqSfW6KiJJ2k3mUf5NukIOPbo2DjG6Ng45vjYOIdYCCgHuBgISAinyFhYJ1fo17cXmQeG93k3ZteJV4bHeVdmx0lHRtdJRzbXKUcm1ylHNtc5Vza3OWdWp1lXVqeZV+aoOSim6MjoxxjYiOd5R+kXyOdY2AjnWLgYh2h4GKeY9/j4GNeY6IkHSQjJBzjo6LcoqOiXKGjoZwhY6DcYOLg3aFhId5iHwt/y3/Lv8u/y//L/8w/y//Mf8x/zH/Mf8x/zH/M/8z/zP/M/8z/zP/M/8z/zP/M/8z/zT/NP80/zT/NP8z/zP/M/8z/zP/M/8z/zP/M/80/zP/M/8z/zP/M/8z/zP/M/8z/zP/Mv8y/zL/Mv8y/zH/Mf8w/zD/MP8w/zD/L/8v/y//L/8v/y//Lv8u/y3/Lf8u/y7/Lv8u/y7/Lv8u/y7/LP8s/yv/K/8s/yz/LP8s/yz/LP8s/yz/LP8s/yz/LP8s/yz/K/8r/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/Kf8p/yn/Kf8o/yj/Kf8o/yn/J/8m/yb/Jv8m/yb/Jv8n/yf/J/8o/y3/Rv9a/0z/MP8w/yv/J/8p/y3/Mv84/0H/Tv9a/2X/bv9y/3P/bP9p/2P/Y/9m/1H/Kf8j/yP/Jf8l/yT/I/8o/yj/Lv85/0v/YP90/4P/if+J/4r/iv+D/3n/av9j/2H/Yf9g/1z/WP9W/1X/Wf9o/3X/dv9z/3j/cv9o/2b/af9v/4D/hv+B/3X/bv9u/27/b/9w/3f/ef9Z/zj/S/9X/1z/Xv9d/1r/W/9u/3n/av93/3n/cv99/4X/h/+H/4n/iv+K/4n/gv9v/1f/Pv85/zT/NP84/z//O/82/zn/N/8u/yf/KP8q/yz/Lf8t/yz/LP8r/yr/KP8n/yf/J/8o/yj/J/8n/yb/J/8m/yX/Jf8l/yP/JP8k/yP/JP8m/yX/J/8p/yz/Lv8v/zH/MP8y/zL/Mv8y/zL/Mv80/zf/OP8+/0P/Sf9L/0z/TP9M/03/T/9O/07/Uf9U/1f/WP9Y/1j/Vv9S/0//S/9K/0n/R/9C/0H/Qf8//z3/P/9C/0P/Rf9G/0f/Rv9E/0D/PP81/yr/Jv8m/yf/KP8p/yr/LP8s/y7/Lf8q/yj/J/8m/yX/KP8t/y7/MP8w/zz/Q/9F/0n/Sf9F/0L/Ov8r/yH/IP8i/yX/MP83/zv/O/87/zz/O/86/zf/NP8x/y7/LP8r/yf/I/8l/yX/I/8j/yP/JP8k/yP/Iv8i/yL/If8h/yH/I/8j/yT/JP8k/yX/Jv8n/yj/Kf8p/yv/LP8u/zH/OP9G/1n/av96/4j/jv+O/47/jv+O/47/jP+M/4v/h/+F/3//ef9y/2j/Xv9P/0f/Pv80/zD/MP8z/zH/Ov9B/03/bf95/3X/dv92/3P/b/9r/2P/W/9R/0n/Rv9G/0j/Sv9K/0r/Sv9K/0r/Sv9K/0j/SP9G/0b/Rf9H/0v/Vf9h/23/d/+C/4n/jP+N/43/jP+K/4f/hP+C/4L/gf+D/4T/h/+K/4v/jP+K/4n/h/+F/4T/gv+A/4D/fP92/3D/a/9p/2j/aP9o/2j/Z/9n/2n/af9o/2j/aP9n/2f/af9q/2z/b/9z/3b/ev+B/43/lv+R/5L/j/+O/43/jP+N/4z/j/+L/4b/gP+A/4H/hP+J/4P/gP9+/3v/d/92/3X/dv94/3j/d/92/3T/dP90/3P/cv9y/3L/cv9z/3P/c/91/3X/d/97/37/g/+K/4z/jf+O/5L/lP+Q/43/jf+N/4v/iP+I/4v/jf+N/47/j/+Q/5D/j/+O/4z/i/+J/4b/g/+D/4P/g/+F/4f/h/+J/y1/LX0vfy97L4AvezCAMHsxfjF7MX4xezF+MXkzfjN7M34zezN+M3szfzN7M38zezN/M3szfzN7M34zejN+M3o0fjR6NH40ejN+M3ozfjN6NH40ejN+M3ozfjN7M34zezN+M3syfjJ7NH40fDF+MHwwfjB7MH4wezB9MH0wfTB9Ln4ufS5+Ln0ufi59Ln4ufS5+Ln0ufi59Ln4ufS5+Ln0sfix+LH4sfix+LH4sfix+LH4sfix+LH4sfSx+LH0sfix9LH4rfSt+LH0sfC19LXwtfC19LXwtfS18LX0tfC19LXwtfS18LX0ufC59LnwufS58Ln0vfC9+Lnwufi18LX4rfSt+K30rfit9K30qfSp9K34rfCp+Knwpfil9KX4pfSh+KHwofil8KH4oeih+KHsnfid7KH4oeih/KHoogCl5K4M/dlWDUHU8fzt2LX4pdip/LnUygTpxRYRQaluGZGZthm9jcoVsZmiGZGdig2VoZ39DbyN7IncleyZ/JH4lfyuBLng7hk9waYl8aIeIhmSJholliIWBaniCY2xYglhnXoZhYmCGX2BdhVpiV4JXa2V/e317eW+Ienxzh2d/Z4Bmfm2CdHp4jXl2dpVweG+QbXxviXJ+dYh6fFyJM382h0uDVoZWg1iGWIFShFyAbod0f3iJcn9iimt/fol/fX+JenqIioZ5fYxpeFCPQHk5kDh6OI82ezWNOHw4jDl+O4s/fzWKKH4nhyd+J4cqfiyHKn4phyh+KIcnfiWHJX4lhyR+JoYlfiWFJX4lhyR+JIYkfiSGJH4khiJ+IYYkfiWGJH8mhSiAKoUufyyGLX8vhi+AL4YwgDGGMX8xhjR/OYc5fT+KRX1Hi018TotPfU+MT35Ri1R+VYpWfVeJWX5Zil19WotZfFiLVXtSi056SotJe0mLR3tEi0J6Poo8ez2JQXtCiUF9QodDf0KGPn84hi9+KoYnfSeHJn0nhyl9KogqfSuHLH0shyp+KIcofiiHJX0niCt7L4kwezOHQIBCgUeDSntKhUh2QIMydyeBH30fgCCBJn81fzqAPHo9gj53PYI5eDOBL3wtgC1+LoAtgi1/KoMofiaFJH4khSN9IYQhfiGEI34ihCF+IYMgfiCDIH4hgyJ+JIMkfiWDKH4pgyl+KoEufS19LH0uezB9NHRFflptcH9+aH2BhGWMgI9ljoGNYoyCjWCOg45gi4OKX4eDfWB1g2phYIVXaU+HRXE3hC57KIQmfyOCJnsqgzZ0OoVAbk6FWW1phW9xdIR0dG6DZnheglN5TIBIfkd9SYJJfEqESnpKhkp6SoVJekmGSXlIiEZ4RodFdkaJTHRXimFvbI14boCOiG+MjoxwjY2McoqNhnKDjYJygYyBc4SKhneIh4p7i4OLfYqCh32HhIZ7hYaDeYCJf3V7i3Zzb41sc2qQaXFokWhwaJJnb2eSaG9ok2hvaJNob2eTaG9qk2ttbpNva3STd257j4RykoOUepJykYCObY+CjG+Lgoxwi4OPcYmCg3iAgYB9gX+Fg4d4hIh/c32OfHF4j3dvdJJ2bXiVd2x2lXZsdJRzbXOUcm1ylHJtcpRybXKVc2tzlnRqdZV5an2VgWuHkYtvjY2Mc42GlHqUe5B+jXSLgIx1ioGIdYiBjHuPfI+Dj3ePipFzkY2Pco2MinKKjolyho2FcoOLgnSDhIV4iHiHe4huLv8u/y//L/8w/zD/MP8w/zH/Mf8x/zH/Mf8x/zP/M/8z/zP/M/8z/zP/M/8z/zP/M/8z/zP/M/8z/zP/Nf81/zT/NP80/zT/M/8z/zP/M/80/zT/M/8z/zP/M/8z/zP/M/8z/zP/M/80/zT/Mf8w/zD/MP8w/zD/MP8w/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/yz/LP8s/yz/LP8s/yz/LP8s/yz/LP8s/yz/LP8s/yz/LP8s/yv/K/8s/yz/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y7/Lv8u/y7/Lv8v/y//L/8u/y7/Lf8t/y3/Lf8r/yv/K/8r/yr/Kv8r/yv/Kv8q/yn/Kf8p/yn/KP8o/yj/KP8o/yj/KP8o/yj/KP8p/yn/Kf8p/yn/Kv8q/zL/Sf9Y/0v/Ov8t/yr/K/8v/zb/Pv9H/1L/Xv9n/2v/a/9m/2z/bf9j/2D/Y/9p/2b/O/8i/yT/JP8l/yn/LP81/0n/aP+C/4X/hP+F/4b/hf98/2//WP9K/07/UP9Y/17/Yv9i/2D/YP9c/1r/Y/99/37/e/+C/3X/av9q/2j/a/9t/2//df94/3L/bf9u/27/cv91/3f/Xv8x/y7/N/9L/1H/UP9R/03/Tv9Y/17/Wv9S/0b/Qv9p/33/e/91/3r/dv9r/1D/O/81/zb/Ov85/zj/N/83/zb/OP87/zz/O/8u/yb/Jf8l/yb/J/8n/yX/Jf8l/yT/JP8k/yT/I/8k/yP/I/8k/yP/I/8i/yL/Iv8i/yL/If8h/yP/I/8k/yX/Jv8p/yv/LP8s/y3/Lf8t/y3/Lv8w/zH/NP83/zv/Pv9G/0r/S/9O/1D/Uf9R/1P/Vv9X/1r/W/9c/1n/W/9d/1z/Wv9Z/1X/U/9P/07/Tv9L/0n/R/9E/0L/Pv8+/0D/QP9B/0H/P/88/zX/L/8q/yf/J/8m/yf/KP8o/yr/K/8r/yv/Kv8o/yj/KP8n/yf/K/8u/y7/NP9C/0L/R/9J/0j/Rv8//y3/I/8g/x//IP8p/zX/O/89/z//Pv83/zL/Lv8r/yn/Jv8k/yj/LP8s/yr/Jv8k/yP/Iv8j/yL/Iv8h/yP/Iv8h/yH/IP8h/yH/I/8k/yX/J/8q/yn/Kv8s/yz/MP81/zv/Of9F/1P/ZP97/3//eP98/4n/j/+O/43/jP+M/43/jf+L/4r/hv9//3n/c/9r/2b/Wv9S/0L/Of8u/yj/KP8r/zD/Of9E/0b/TP9P/07/Uf9c/2v/a/9p/2P/V/9P/0r/Sf9J/0r/TP9K/0r/Sv9K/0n/Sf9I/0f/Rf9F/0X/Rv9M/1f/Yf9u/3n/gf+I/4z/jP+M/4v/if+G/4P/gv+B/4X/hf+H/4r/i/+M/4v/iv+H/4b/hP+D/4P/gf9//3r/df9t/2r/aP9o/2f/Z/9n/2f/Z/9o/2j/aP9o/2j/Z/9o/2r/bf9v/3L/df94/37/i/+V/5L/kv+P/47/jf+L/4v/i/+L/4v/hf+C/4D/gP+B/4X/hf+C/3//ff96/3j/d/91/3b/eP93/3b/df90/3P/c/9y/3L/cv9y/3L/cv9z/3P/c/91/3j/ff+E/4n/jP+O/43/j/+V/5P/jv+M/4v/iv+K/4j/iP+M/47/jv+R/5H/kf+R/4//jf+L/4r/h/+F/4T/hP+E/4X/iP+J/4n/iv8vfy97L38vezB/MHkwfzB5Mn8yejJ/MnoxfzF6M38zejN/M3ozfzN6M38zeTN/M3kzfzN6M38zejR/NHk0fzR5NX81eTV/NXkzfjN6M34zejR+NHo0fjR6NH40ezR+NHszfzN7NH80ezR+M3syfjB7MX4xezB+MHswfjB7MH4wey5+Ln0ufi59Ln4ufS5+Ln0ufi59LX4tfS1+LX0tfi19LX0tfS19LX0rfSt9K30rfSt9LH0sfSx9K30rfSx9LH0rfSt9LH0sfSx8LHwsfCx8LHssfSx7LH0sfCx9LXwtfS18LX0tfC19LnwufC58LnwufC9+L3wvfy59LoAtfS2AK30rfSx9LH0sfix9Kn4qfSt+K30qfip9KX4pfCp+Knwpfil7KH4oeil+KXonfid6KX4reSp+KnksfSx5K38seS2BMHY5gUx2VIE8dC1/LXMvfzNyOoFCbUyFVWdghWhhaoZnYmGGYGNrhWhoYoViZWOCb2hjfS9yH3wkeSh/K3ovhD5yXoh+aYeJhGSHhYVogYJ3bl2AQnM1fzxyRYJMcVKGWGhch19gYYZkXmKEYmZkf3N9gHiIjoh4e45uf2uDaoBpf2p+bItyeXSUcHlrj2t8bIhvfHWIdXpfiTJ8LIkugDmFSIJLhEiDToRLg0qETIBChkJ/P4k0fjuLZH54i3p6cItid06PO3g0kjV5N5I5ejuPO3s6jjl9Nos4fTqMO307jTZ9KIolfSSIJH0lhiV+JYYkfiSGI34jhiJ+IoYifiKFIn4ihSJ+IoUifiKFIn4ihSJ+IoUhfiGEIX4jhCR/JYUmfyaFKIArhi2ALYYtgSyGLYEthi9/LoY7fkGHPXxCiUV8SYpMfE+NUnxTjlR+VY1VfVWNWH1cjF5+XY1efl6MXXxdjFx8WItVfFOLU3xUi1J8UYlQfEmKRnpEiUB7PYo7fD6IPXw8hzl9NIcufCqHKXwphyh8KIgoeyiIKH0qiCt+K4gqfSqHKn0qhyh8J4gpfCqHLn00hkGBRoFIhUh8RYVCejeDKXwggSB+In8jgix/Nn89fz58PII5ejSCMHssgip+KIEngySAJIMngCiEKn8ohSR+I4MjfiODJH4khCJ+IYMifSKEIn0hgyB+IYMkfiWDJ34ogit+LYItfy+AM302ejx8UWtofG5SaoFwRn+Cf057gn9cioGOZYqCi2ONhI1hjIOKYIiDhmGHg4Zgf4N5YHSEbGVmhFxsUoRFdTeEM3cyhzJyNIg5bj+MR2hFjURiR41JXUuNV1tai1lkXYlhb1SESXVIgUt+TX9Jf0t8TINJfEqESXpJh0h5RohFeESGRXdGiUx0V4tgcG6NeG+AjohwjI6McYyNinGIjYVygoyCcoOLhXaHh4h5iYWMfIyCin6Jg4h8hoSFe4OHhHiBin91eoxzcmyOaXJnkGdxZ5Bnb2eRZ25nkWduaJNobmiTaG1ok2ltapNta2+Sc2x4kXhvg4uPdpR8kX6PcY+BjW6LgopwioKLcIuCiHWFgYF5gIF/f4J9h4aDdYGLf3J9jnpweZF2bnaTd2x4lXdsdZV0bXSUc21zlHJtcZRzbXOUc21zlXJtc5V0aXeUfGl/k4dtjJCOcY6LjniQgpZ9k3mOgIx3jIGKd4mBiXmJf41/kHuQhpF2kYmRc4+MjXKMjYtyiI6GdIWLg3aEhoR4hnqIfItvin+Kay//L/8v/y//MP8w/zL/Mv8y/zL/Mf8x/zL/Mv8z/zP/M/8z/zP/M/8z/zP/M/8z/zP/M/8z/zP/NP80/zT/NP81/zX/Nf81/zX/M/8z/zP/NP80/zT/NP80/zT/NP80/zP/M/80/zT/NP8z/zH/Mf8y/zH/MP8w/zD/MP8w/zD/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8t/y3/Lf8t/yz/LP8s/yz/LP8s/yv/K/8r/yv/K/8s/yz/LP8r/yv/LP8s/yv/K/8s/yz/LP8s/yz/LP8s/yz/LP8s/yz/LP8t/y3/Lf8t/y3/Lf8u/y7/Lv8u/y7/Lv8v/y//Lv8u/y3/Lf8r/yv/LP8s/yz/LP8s/yr/K/8r/yv/Kv8p/yn/Kv8q/yn/Kf8o/yj/Kf8p/yr/Kv8r/yr/Lf8u/y//L/8v/y//Mf8x/zH/L/9H/0H/Mf8x/zL/OP8//0j/UP9b/2P/af9q/2X/W/9R/1r/bf9n/2L/Yf9n/3H/VP8k/yP/Kf8s/zL/SP9s/4T/g/+D/4H/ef9p/0n/Lv8p/zL/NP87/0T/Sv9S/1j/Wv9d/2H/ZP9m/2j/df+C/4f/hv9//3H/af9n/2b/aP9s/23/a/9p/2n/a/9s/2//cf92/1//LP8p/yv/Lv80/0b/SP9F/0f/Rv8+/zb/Nf9J/0b/Nf8z/1b/ZP9d/0j/PP81/zX/Nv84/zn/O/87/zr/Ov85/zf/Of86/zv/Pf8t/yX/Jf8j/yT/Jf8l/yT/JP8j/yP/Iv8i/yL/Iv8i/yL/IP8g/yD/IP8h/yH/If8h/yD/IP8g/yD/I/8k/yb/Jv8l/yb/KP8q/yv/Kv8q/yr/LP8u/zT/Of87/zz/Q/9I/07/T/9S/1L/Uv9T/1P/VP9V/1f/XP9d/13/Xv9i/2L/YP9e/1n/Vv9Y/1n/WP9Y/1f/V/9V/03/Sf9D/z3/Of83/zj/N/8z/zD/LP8r/yn/Kf8p/yj/KP8o/yr/K/8r/yr/Kv8q/yr/Kv8o/yr/LP8v/zX/Qf9G/0b/Rf9D/z3/L/8j/x//IP8h/yX/Lf82/zz/P/87/zf/Mf8u/yv/Kf8m/yX/I/8j/yL/I/8k/yb/I/8i/yT/Kf8p/yX/Jf8j/yL/I/8j/yP/Iv8j/yX/J/8p/yr/LP8w/zL/Mv8v/zH/Pf9c/3X/fv96/3n/fP9+/4D/gP+I/4r/iv+L/4z/iv+J/4f/hP+B/4L/hP+D/3z/d/9w/2n/Y/9c/1D/Rv9B/zr/N/82/zj/Ov8//z//Qf9E/0b/Sf9O/0v/Tv9I/0r/Xv9l/1P/Vf9a/0j/Rv9K/0r/Sv9K/0r/R/9G/0X/RP9E/0j/T/9Y/2L/b/96/4L/h/+L/4z/iv+J/4b/hf+C/4L/hf+H/4j/iP+L/4z/jP+J/4j/iP+H/4f/hf+E/4H/ff92/3L/bf9p/2f/Zv9m/2b/Zv9n/2f/Z/9o/2j/aP9o/2j/av9s/3D/cv90/3f/fP+I/5L/lP+P/43/jf+M/4n/iP+J/4n/if+H/4P/gP+A/3//g/+G/4L/gf9+/3z/ef93/3X/dv93/3j/d/91/3T/dP9z/3P/dP90/3L/cv9y/3L/cv9z/3T/d/98/4D/h/+N/4//jv+P/5H/k/+P/43/jf+L/4n/if+J/4v/jv+Q/5D/kf+R/5H/kf+O/4z/iv+H/4X/hP+E/4X/h/+J/4n/iv+K/4j/MH8wezF/MXsyfzJ7M38zezN/M3oyfzJ6Mn8yeTJ/MnkzfzN5NH8zeTJ/M3k0fzR5NH40ejR+NHk0fzR5NH80eTV/NXk1fzV5NX41eTN+M3k0fjR5NH40eTR+NHo1fjV6NX81ezR/NHszfjN7Mn4yezN+MnsyfjJ7MH4wezB+MHswfi59Ln4ufS5+Ln0ufi59LX4tfSx+Ln0ufi59LX4tfSx9LH0sfSx9K30rfSt9K30rfSx9K30sfSt9K30rfSx9Kn0sfSx9LH0sfCx8LXwtfC18LXwtfC18LnwufC18LXwtfC19LXwtfS58Ln4ufC5+Lnwufi58Ln8ufS5+LX0tfi19LX0ufS59LX0tfix9K34sfix9LH4rfSp+Knwqfip8KX4peyp+KXopfit6K34tei5+LnkwfjB5MX4yeDF9MXgwfzB3MX8xdzl/QnQ9gDVzN4E+cEWDTmtUhl1lZoZqYmqDYmNVgktnSIRhaWuFZWljhmRoboJxaj58IXMofyp3NoVRcnmHgmt9g35sc39XcTl8JngofCt8LH8xezWBPHdBhEhxUIVUaFqGX2NkhGxocn9+gIl1gpF6dnySc31oh2SCYoFnf22HcXttkGt7aY5qfWuIb31viHB6XokreSmJK34qhyqAN4ZGgkmCRYJDgT6AM4QsfzGGM34xiSp+MYlEfEOMOHo0kDN4MpE0eTeTOno6lDp7O5M7fTuPN304jTp+O408fjaMKHwoiCd8JoclfSaGJ30nhiV9JIYifSKGI30jhSJ9IoUhfSGFIX0hhSF+IYUgfiCFIH4ghB9+H4QhfyCEIn8jhCSAJYQogCqEKoEqhCyBLIQsfy6GM342hzd9O4k8fUKKR31MjU99Uo5RflGOUX1TjlZ9Vo1aflqOXH5bkGB+YY9jfmGOXn1cjl19XoxdfFmKXHxeiVd7U4lOe0mJRHs8ijd7NYc2ezSHMHsuiC57LYgseyqJKXooiCl8KYgqfCqIK3wriCt9K4gsfCuILHwthzF9N4ZAgUSBRYREfkGEN30rgiF/In8igCN9KIEufDSAO30+fTp/NHwvgSp+KYEmgSWBI4MigCKDIYAigyR/IYQlfyaEKX4pgyl+JoIkfiODIn0kgyV9JYMlfiaDJn4qgyt+K4Isfi6CL38tfi59O3VLf1hlY4J0WXiGd1hzhXxgf4R7ZYSDh2eKgIplioKKYoeDhGGBg3lifIOCZYWDg2V8gnhjcoJpZGKCXGZWhU9sQog6bD6KOmg9i0BkQ41FXkeNSFlMjU5VVYxRT1aKWlVKh0hdVoZTXl+GaWZcg01ySYBKgEp8S4ZJeUeIRXlDiER3SIlRdFiLZHBvjXlvgI6IcImOi3GIjYhyhYyCcoKMg3SEiYd4iIaKe4uEjX2Ngol+iIOJe4mEh3mGiYR3gYt7dHaNcXJtj2hxZ5BmcGWRZXBlkmduZ5NnbmiTZ25ok2htaZNtbW2TcGtxk3RsdpB/cY6FknqRd46Ai3GLgopziYKIcoiCinWHgYV5goGAfX9+gICEeoaHgnSBjX9yfY97b3mReG15k3lseZV1bHSVc21zlHJtcpRybXKUcm1ylHFtcZVzbXOVdWl2lHtpgpKKbY+PkXKQh5B5lHySfo52jIGKd4qBiHeIgYl6jX+QgJF5kYeRdZGKj3SOjI5zjI6Kc4eNhnaGh4R5iHyJfYpyin+LbYiAh2sw/zD/Mf8x/zL/Mv8z/zP/M/8z/zL/Mv8y/zL/Mv8y/zP/M/80/zP/Mv8z/zT/NP80/zT/NP80/zT/NP80/zT/Nf81/zX/Nf81/zX/NP80/zT/NP80/zT/NP80/zX/Nf81/zX/NP80/zP/M/8z/zL/M/8z/zP/M/8y/zD/MP8w/zD/MP8u/y7/Lv8u/y7/Lv8t/y3/Lf8t/y3/Lf8s/yz/LP8s/yz/LP8r/yv/K/8r/yv/K/8r/yz/LP8r/yv/K/8q/yz/LP8s/yz/LP8t/y3/Lf8t/y3/Lf8s/yz/Lf8t/y3/Lf8t/y3/Lv8u/y7/Lv8u/y7/Lf8t/y7/Lv8t/y3/Lv8u/y7/Lv8t/y3/LP8r/yz/LP8s/yv/Kv8q/yr/Kv8p/yn/K/8r/yv/Lf8t/y//MP8x/zL/Mv8z/zP/NP80/zT/NP80/zT/NP8+/0r/Q/85/0L/TP9U/13/Zv9r/2z/av9g/1X/Rf84/0j/af9p/2T/Yv9p/3T/Yf8q/yP/K/86/1r/fP99/3j/d/9j/zf/Jf8n/yr/Kf8s/yz/MP81/zn/QP9F/03/U/9b/2b/cv94/4T/kv+F/3n/eP9z/2X/YP9g/2H/af9w/2//Zv9n/2v/bf9u/2//cv9d/yz/KP8q/y3/Mf8y/zn/Rv9B/0D/PP82/yr/Kv8p/yj/J/8o/yz/L/8w/zL/M/81/zn/OP86/zr/Of86/zv/O/85/zf/N/85/zz/O/8t/yj/Kv8r/yz/KP8p/yn/Kv8p/yj/J/8l/yP/JP8k/yL/Iv8i/yL/If8h/yD/IP8g/yD/H/8f/yD/H/8i/yP/JP8l/yb/Kf8p/yn/Kv8s/yz/LP8v/zP/Nv84/zn/PP9B/0X/Sv9P/1L/Uv9Q/1D/VP9W/1j/W/9c/1z/X/9e/2D/Yf9i/2D/X/9f/1//XP9b/1v/W/9a/1f/Sf9O/0j/PP83/zT/Mv8y/zD/L/8u/y3/LP8r/yn/Kf8p/yr/Kv8r/yv/K/8r/yv/Lf8s/y3/MP87/0D/RP9F/0T/P/81/yb/IP8h/yL/JP8p/y7/M/85/zv/Of81/zD/K/8n/yb/JP8j/yL/Iv8i/yL/I/8j/yT/Jf8o/yr/Kv8q/yT/Jf8j/yP/I/8k/yb/KP8n/yr/K/8r/yv/K/8q/yv/M/9B/1D/V/9C/z3/Of88/zr/Wv9s/3L/fv+G/4r/iv+J/4n/iP+D/3z/df9z/3v/gP+E/4P/fv94/3D/a/9n/1//Vf9O/0T/Qv9A/0D/Q/9G/0v/S/9N/0z/TP9R/07/SP8//0v/S/9M/0//WP9n/2z/Yv9J/0n/S/9J/0j/Rv9E/0P/Rf9J/1D/XP9l/3D/ef+A/4X/h/+J/4j/h/+E/4L/gv+E/4X/iP+J/4r/iv+L/4v/if+J/4n/if+H/4b/g/+A/3r/df9x/23/Z/9m/2b/Zf9m/2b/Z/9n/2j/Zv9n/2n/af9p/2z/bv9x/3L/df92/4P/j/+Q/47/i/+K/4n/iP+H/4T/hf+G/4T/hP+B/3//f/+C/4b/hf+C/4H/gP9+/3v/ef94/3n/ef93/3T/dP9z/3P/cv9y/3H/cf9x/3D/cf9x/3P/c/91/3j/fv+F/4z/j/+R/5D/kv+U/5L/jf+L/4v/iv+I/4j/if+O/4//kP+Q/5H/kf+P/4z/i/+K/4f/hv+H/4j/h/+J/4r/i/+K/4j/if+E/zCAMHsxgDJ7MoAyejOAM3oyfzJ5Mn8yeTN/M3kzfzN5M38zeTR/M3kzfzR6NH80ejR+NHg0fjR4NX81dzV/NXc1fzV4NX81eDV/NXk1fzV5NX81eDR/NHg0fzR6NH80ejV/NXs2fjZ8NH40fDR+NHw0fjJ8Mn4yfDF+MHswfjB7MH0wfS99Ln0ufS59Ln0ufS1+LX0tfi19LX4tfCx+LHwsfCx9LHwsfSt9K30rfSt9K30rfSx9LX0rfSt9K30rfSx9LH0rfSx9LHwsfC18LXwsfCx8LHwsfCx8LHwtfC18LXwtfC18LX4ufC59LnwufS18LX0tfC19LX0tfS19LX0tfS1+LX0tfi19LX4sfSt+K34rfit+KnwqfSp9K30rfCp+Knssfix5L34veDF+MngzfjN5NH41eTZ+Nnk1fjZ5NX42eDd+N3c4fzh1RIBMckSCSG9ShFloYIVmY22GbWFpgVtkUIA+ajCCNW1WhXBsaYZjZ2OEamVxf0hrJH4pcjiDWnF+hHtweIBzclx6LnUmeiZ7KX0ogCh+K4AsgDB/M4A5ez+DRnJLh1htaYZ3cXl+g4KQdYyQf3N6lHV5ZIpegFyDXYBjg2x9cIpoe2eMZ35piGx8b4Zye1qILXoniCp7LYc1fzuGOYFShEiCPYI6gTmDMoArhSV/J4ckfyaHJnspiy16Lo0yeTeQQHg9kjl6OJQ5ezqUOX05kjh9No82fjiPPH48jDd8LYkrei2GL3wshix8LIUufC6GLnwshil8JYcjfCSHI30jhiJ9IoYifiCFIH4ghR9/H4Qefx6EHn4egyJ+I4MjfiSEJoAnhCiAKYMpgCmDLH8shC9/M4Y3fjOIMX0zijl9Po5BfUiNTX5QjVF+T41RflOOVX5Wjlh+WpBdfV2QW31bkWF9ZJFjfmKPYn1fjl58X4thfGKLXHxSiFR8UohHfDuHN3o1iDN8M4YyezCHLXsuiC16K4greiuJLHssiSt7K4gseyyILnsviDB9MIczfjuFQIFDgkOEQX87hDF/JIIhgiF/JYInfSiDLXwygjZ9OoA5gDOALYApgSiAJoMlgCSDIn8igiR/JYIjgCSBJX8ofyl/KX4sfy17KH8lfiR+JIAkfiaCJ38ngCh/KYAqfyqCKX8ogit9L304fkV3VIFVcT2DNXMqgyd9L4BCfFh+a3Z9fohuin+LaYmBiGSEhH1jdYRrZ2iEcWt4hH9qgYOCZX6CeGFzgmxjZYRhZFmIUmZLiUNlQotGYUaNRlhJjVBTUYxTT1eKVE5Mh0lUUIVOU0+FUk9ZiGVRVoldZF2FTXlLfkqESntHhUV4RIhFd0qKU3Ndi2ZwcY15b4GOg2+Gjodxho2FcYSMg3ODiYV3h4aKeYuCi32Kg4l9iYSJfImEiXmJh4d3hoqCdX6MeHNzjW9ya49ncGeQZW9kkWZvZpNnb2eSZ29ok2dvaJNpbmuSbW1wk3JsdJN2bXiNiHOTgo58jHWKgYh0iYKIdIeChHSFgoN5g4GEfIGAfn5/foOChniDioFzgI6AcX+RfG94knhsepR4bHeUdGxzlHNsc5RybHKUcW1xlXJtcZVxbXGVc210lXNreZSAaoaRjG6Qj5JzkYeSe5V8kYCMd4uBiniIgYd4ioCMe459j4OOeY+HkXaRiY90jY2McoiMiHOHiYh3iYCJfIt0i3+KbYqBiW2GgYRuMv8y/zL/Mv8y/zL/M/8z/zL/Mv8y/zL/M/8z/zP/M/8z/zP/NP8z/zP/NP80/zT/NP80/zT/NP81/zX/Nf81/zX/Nf81/zX/Nf81/zX/Nf82/zb/Nf81/zX/Nf81/zX/Nf81/zb/Nv81/zX/Nf81/zT/NP8y/zL/Mf8x/zH/Mf8w/zD/L/8u/y7/Lv8u/y7/Lf8t/y3/Lf8t/y3/LP8s/yz/LP8s/yz/LP8r/yv/K/8r/yv/LP8t/yv/K/8r/yv/LP8s/yz/Lf8s/yz/Lf8t/yz/LP8s/yz/LP8s/y3/Lf8t/y3/Lf8t/y7/Lv8u/y7/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/yz/K/8r/yv/Kv8q/yz/LP8r/yv/LP8t/y//MP8z/zP/Nv83/zb/Nv84/zj/Of85/zj/OP84/zr/O/87/zv/O/8+/0r/Vf9S/1T/XP9j/2r/cv9t/2P/V/9K/zj/Lv8s/z//Zv9t/2X/Yv9l/2z/Zv87/yT/Nf9R/3f/fP92/3H/Xv82/yb/J/8p/yn/J/8o/yn/Kv8u/zP/OP8+/0f/V/9s/3n/df98/4b/jP+D/3r/dv9o/17/XP9b/17/Y/9o/2f/Z/9l/2f/bf9w/3L/Wv8r/yf/Kv8t/zX/PP9D/2P/W/9C/zf/Of8z/yz/LP8o/yX/KP8o/yn/Kv8s/y7/Nf88/zv/Nf81/zf/OP84/zf/OP83/zb/Nf83/zf/Ov8y/yv/K/8t/yz/K/8r/yz/Lf8u/y//LP8q/yn/KP8m/yb/JP8i/yH/IP8f/x//IP8g/x7/Hv8e/x7/Iv8j/yP/JP8m/yf/KP8n/yj/KP8o/yn/Lf8x/zH/MP8v/zD/Nf86/z7/Qf9H/07/Uv9U/1D/Uv9T/1P/Vf9V/1f/WP9Y/1v/XP9d/2H/X/9g/1//X/9b/1v/Wf9Z/1v/Vv9T/07/R/9A/zb/N/80/zL/Mf8w/y3/Lf8t/yv/K/8s/yz/LP8s/y3/Lf8u/zH/M/8z/zP/O/8+/0H/Qf8//zn/L/8k/yH/Iv8o/yv/LP8v/zH/Of88/0X/RP8+/zP/K/8n/yb/JP8m/yb/I/8k/yP/Jv8p/yn/KP8q/y7/Lv8t/yz/Kf8l/yT/Jf8n/yr/KP8o/yj/KP8o/yj/K/8y/zb/NP88/zH/Kv8n/yf/Kv81/0P/Wv9u/37/if+K/4v/iv+H/4P/fP9x/2r/Zf9p/3H/eP9//4L/gv99/3j/c/9v/2v/Zf9Z/1L/TP9K/0n/T/9P/1H/Vf9Z/1z/XP9W/1H/V/9S/0v/Tv9U/1f/Wv9V/0n/UP9Y/0v/RP9F/0X/Rf9E/0b/Tv9U/13/Z/9y/3j/f/+C/4X/hf+E/4P/g/+F/4X/hv+J/4r/i/+L/4n/iP+I/4n/if+J/4f/h/+G/4H/ff94/3P/b/9r/2b/Zv9l/2T/Zv9m/2f/Z/9n/2j/af9p/2r/bP9u/3D/cv91/3b/ff+O/5P/jv+L/4j/h/+H/4b/hv+G/4b/hf+E/4T/gP9//4D/hf+F/4P/gP9//3//fv98/3n/eP96/3X/d/90/3L/c/9z/3L/cv9x/3H/cf9x/3H/cf9y/3P/dP97/4H/iP+N/5H/kP+Q/5P/k/+N/4v/i/+K/4j/h/+J/43/kP+R/5D/kf+R/5H/j/+L/4v/if+I/4j/iv+K/4r/i/+M/4v/if+I/4b/gv8zgDN6M4AzejOAM3kzgDN5MX8zeDR/NHgzfzN5M38zeTJ/Mnk0fzR5NH81eTV/NXk0fjR4M34zdzR/NXk1fzV5NX81eTV/NXk1fzV5Nn82eTd/N3k1fzV5NX81ejV/NXo1fzV6Nn42ezZ+Nnw1fjV8NH40fDN+MnwyfjJ9MX4xfTF9MX0vfS59Ln0ufS19LX0tfi19LH4sfSx+LH4tfi1+LX4tfix+LH4sfSx+LH0sfit9K30rfSt9K30rfit9K34sfSx9LX0tfSx8LHwtfC18LXwtfC18LXwtfC18LXwtfC18LXwtfC1+LnwufS58Ln0tfC1+LXwtfi59Ln4tfS1+Ln0ufi59Ln4tfS1+LH0rfix+LH4sfix8LX0tfS19LnwxfjJ7Mn4yeTV+NXo5fjt6On46ejt+O3o7fjx6O347ejx+PHg9fj13PX9AdkOARnRPglZvWoRca2aFbmZ2hG5jYX9TaEZ+NW4ufyxyM4RNcnCFaW9mhWNqZYNta11/L3EqgURxaoN7b3WCcG1lfUFwJnoleSd7KX8nfSaBKX0pgip9L4A0gTh6QYZadHKGeXZvfnOCgnWIkH9zepl2eW6SYX9dhFuBXn9lf2aGZn5mi2N/ZolqfmyIa3taiC16JYgmeyyHMX83hkqAZ4VbgE6EOIAvgi9/LIMrfiuFKH4ohSp8K4creyqKLHsujTF6M48yejKSNHs1lDd9N5I2fTiSNX01kDl+No01fjiJMn0qhSl8K4QsfCyFK3wrhSx8LIUrfCyHK3wphyh8J4cnfCaHJH4ghR5+HoUefR6EHn0ehB5+HoMgfiKDIn4jhCSAJoQngCeDJ4Angyd/J4QofyiGKn4ohil9LIgvfTKIOHw+ikF9S4xRflGNUn5UjlN+Uo5TflOQU35UklR+UpJVfViTWn5ckVl9W5BefV2OXX1kjWN8YIpafVKIUX1RhU19SYU4fTiEN3wyhTF7MYYvejCILXotiS16LYktei2ILXsviC97M4g0fTWHNH44hD2BPoM+gjyDNoIrgyOAI4QkfiaEKXwvgzF9OYBNfmB5bIFwcmuCX3JSgkF3M4MrfCqCJoAigSKAIoAmfC1/NnQ0gDZwOIA4bziAM3IwgC13LH8qeyuAK3sqgCl7KYApfCmAJnwlfyp/K4AnfyV/JYAngCeBJ38ogzJ9Q39cfHB3f3yLb4t/jGeLgYdjhIN8ZHCDY2hchGBwaIRyb3mEgGqEgoJkfYJ6YnSEcGBrh2hfYohiWmOKYVNgjF9LYotfR16JXUZbhWJGbYdoQFmHW0teh11KWYdXTFCJQFc4iE9lVoVlclqDR35GfEaGR3dMiVV0YItpcXOMenB/jYBxg42EcoSMgnODiYR1hIaGeomDinyKgot+iYGHfYeDiHuIhYh4iIeHdoOLf3N9jXdyco9ucGqQZ3FmkWVvZJFmbmaTZm5nkmhtaJNpbWmTam1tkm9rcpNzbHSSeW+DiZB2kHyMfoh0h4KGc4eBhnOGgYZ0hoGFeYSBg31/gH9/gH6EgoR4gYqBcYCPfm99kXxtepJ5bHqUdmx2lHNscZRybHKUcmxylHJtcZVwbXCVcW1xlXJtc5V1anuUhGqJkY5vkIuPdZCClHyReY2AjHaMgYt5iIGHeYiAjn2QfY+Fj3eQi5F0kI2OdIyLinOIiId2iYKJe4t4jH6McIuAim2HgoZwg4GBczP/M/8z/zP/M/8z/zP/M/8z/zT/NP80/zP/M/8z/zP/Mv8y/zT/NP80/zX/Nf81/zT/NP80/zT/Nf82/zX/Nf81/zX/Nf81/zX/Nf82/zb/N/83/zb/Nf81/zX/Nf81/zX/Nf82/zb/Nv82/zX/Nf80/zT/M/8y/zL/Mv8x/zH/Mf8x/y//Lv8u/y7/Lf8t/y3/Lf8t/y3/LP8s/y3/Lf8t/y3/LP8s/yz/LP8s/yz/K/8r/yv/K/8r/yv/K/8r/yz/LP8t/y3/LP8s/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8u/y7/Lv8u/y3/Lf8t/y3/Lv8u/y3/Lf8u/y7/Lv8u/y3/Lf8s/yv/LP8s/yz/LP8t/y7/Lv8v/zL/NP83/zX/OP87/z7/P/89/z7/Pv8+/0D/QP9A/0H/Qf9B/0L/Qv9D/0T/Rv9K/0z/U/9W/1n/Wv9q/3b/bv9f/0//RP81/y//LP8t/zn/Wv90/2n/Zf9k/2r/bP9a/y7/Mv9Z/3f/dv9w/2n/T/8q/yf/Kf8n/yj/Jv8p/yr/Kf8r/y//Nf9E/2D/d/9z/2r/bv9+/4P/ev90/2//cf9m/17/XP9c/2D/Yv9m/2b/Y/9n/23/bP9t/1z/Lv8m/yb/K/8r/zD/Tf9n/1n/Uv9R/zn/Kv8q/yv/K/8s/yz/Lf8s/yz/Lf8u/y3/Lf8t/y//L/8x/zT/Nf84/zf/Nf81/zb/OP83/zX/QP9Q/yv/Kv8t/yz/LP8r/yv/K/8q/yv/K/8r/yz/Kv8o/yf/Jv8k/yL/H/8e/x7/Hv8e/x7/Hv8e/x7/Hf8d/x7/H/8i/yL/Iv8j/yP/JP8k/yX/Jf8n/yf/KP8o/yr/L/85/zj/PP9G/0z/Uv9T/1T/UP9U/1j/Vf9U/1H/T/9R/0//Uf9T/1X/Vv9X/17/Yf9i/1//Yv9m/2P/Xf9V/1T/Uv9R/03/Ov81/zv/Of80/zD/MP8u/y7/Lv8u/y3/Lf8v/zD/Mv81/zb/OP80/zT/OP85/zv/Nv8w/yf/I/8j/yX/Jf8r/zb/Rv9b/3P/gP+E/4X/hv+D/3r/bf9g/1T/Qv8u/yX/JP8s/zn/Qf9G/0f/Rv9F/0H/Q/9C/zz/NP80/zT/Mv8y/zL/Mf8w/zD/MP8v/y3/Kv8n/yT/JP8k/yT/JP8m/yj/NP9I/1//df+E/4v/jP+M/4v/iv+D/3v/cf9h/1f/Wf9g/2r/c/95/4L/gv+D/4D/fP93/3H/av9n/2j/ZP9k/2T/Yf9g/2H/Zv9r/2z/bP9j/1v/V/9Y/1f/YP9l/2b/Yf9h/1v/TP9V/2v/XP9K/0X/Rv9L/0//WP9i/2n/c/96/3z/gP+C/4T/hP+E/4X/hv+G/4j/if+J/4n/if+J/4f/h/+I/4f/hv+E/4T/gf99/3v/d/9y/27/av9m/2X/Zf9k/2b/Zv9m/2b/Zv9m/2n/af9q/23/b/9y/3P/df98/4j/k/+R/4v/iP+H/4b/hf+F/4X/hf+E/4P/hP+D/4D/gP+B/4X/hP+B/4H/gP9//37/fP96/3n/eP92/3b/c/9x/3L/cv9y/3L/cv9x/3D/cP9x/3H/cv9z/3b/ff+G/4v/j/+Q/5D/kP+V/5D/jf+L/4z/iv+H/4b/iv+Q/5D/j/+Q/5H/kf+Q/47/iv+H/4f/h/+K/4v/iv+L/4z/if+J/4f/hv+E/4L/Mn8yeTJ/MnkyfzJ5M38zeTR/NHc0fzZ3NX81dzR/NHczfzN4NH80eDR/NHc0fzR5NX81eDV/NXg1fzV5NH80eTZ/Nno2fzZ6Nn82ejZ/Nno1fzV4Nn82eTZ/Nno2fzZ6Nn82ezZ/Nns3fjZ8Nn01fDR+NHw0fjR8Mn8xfTF/MX0xfTF9MH0vfS5+Ln0tfi19LX4tfix+LH4sfix9LX4tfS1+LX0sfix9K34rfCx+LHwrfSx8LH0sfC19LHsrfSx7LX0tfS19LX0sfCx8K3wsfC58LnwtfC18LXwtfC18LXwtfC19LnwufS58Ln4tfC1+LX0tfy19LX8ufS5/Ln0ufy9+L38ufy19LX0sfCp9K38sfix9LX4tfC9+MHsxfjJ7NX43ezh+OXs8fT58P31BfEJ9QXxDfUR8Q31EekN9RHhEfkR4RX5Fd0V+R3ZIgEtzUYJZbl+EXmpchGNncIRrZlqATGo/fzNxL38udC2AMHVBhGlycIZsbmSFZmttg3NtWYMtbkeDbG53hHVpbYFZaDV7JnIoeyl9J3spgil8KoIsfi1/MYI7fFOHcXd4hmx4an1yg3xzfJB0dm+XbXlxk21/YIVdglt9X4FhgmOAZohngGmJan5siW18X4kueiWJKn0siS5+MYhQgGWFXYBXhFV+VoM6fSuDJ30ohSh/KIYofimEKn0thy59L4kteyyKLHotkC57MJI0ezSRNXwzkDF9NI40gDONM4NLhniCUn0hfy9/L3wugy16LYUteiyFK3wrhip8K4YrfSqHKH0nhyZ+JYcifh+HIH4ghiF+H4Yffh6EHn4dgx1+HoIefh6CH30fgyB/IYMhfiOEJH4khCN+IoQmfiaFJn4ohyx+M4g3fj2KRX9KjE9/U49XflOOU31QkFJ9T5FRfU6SUX1PkVB9UpJUflKTWn5gk2V9ZpFnfGiNZHxkilp8Toc+flGGTn9ZhEB+MIE7fD2DN3syhzJ7MIgweTCIMHoxiDB6MIgxezaHOHs4hjZ8MoY0fjWGMn4qhSZ+I4UlfiaHKH80hEp/Xnpwf4JwiYGLaouBjGeNg45njoSLZ4SEemprg1RwMYMpdTqCRXVNgElxQX8/bkWARmpGgEVqQYE7bjqAOHA6gDpzOoA8cTyAOnA4gDZzM4EseCaBIXwggCKBIoAigyV/J4E3fU59ZH13c4h9jGqLf4tii4GLYoaAfWFugWNkVYVTblmFY3BrhHRse4KAZYaChWKDgoBceoR6WXmFeFR4hXdMbYVsQG6DbTp1gnk2dYJwOGuHbD1xiW9Fc4hyQ2mHa0BqiGtIbotvVV2KTmZUh091R4BDgE15VYZac2KJaXJyinhye4t+c4CLgHGCioV0homHeYeEiX2KgIp+iIKHfYiDhnuGhYd6h4eEdoOKgnN/jH1yeY11cXCQbnFqkWdwZ5JmcGaSZm5lkmduZ5JmbWeTaWtqk2trbZNwanKUdmt2jn9xj4SReo52ioCIcYeAhnKGgId0h4GGdoOAg3uFgIJ+gH+AfoR9h4ODd4GKgXGAkIBvfpF8bnqTeWx4lHZtdpRzbXGUcW1xlHFtcZRybHKUcWxxlHBscJVxa3KVeGuAk4drjZKPb5GKkHWUgZJ+jneMgIt2i4GIeYiBiHmLgZF/kHuQhpJ0koyQco6NinSGioh1iIGKeIt2inyMb4yBi26HgYZxhIGEdYN/g3Yy/zL/Mv8y/zP/M/8z/zP/NP80/zT/Nv81/zX/NP80/zT/NP80/zT/NP80/zT/NP81/zX/Nf81/zX/Nf80/zT/Nf81/zX/Nf82/zb/Nv82/zX/Nf82/zb/Nv82/zb/Nv82/zb/Nv82/zb/Nv82/zX/NP8z/zT/NP8z/zL/Mv8y/zH/Mf8w/y//Lv8u/y3/Lf8t/y3/LP8s/yz/LP8t/y3/Lf8t/yz/LP8r/yv/LP8s/yv/LP8s/yz/Lf8s/yv/LP8t/y3/Lf8t/y3/LP8s/y3/Lv8u/y3/Lf8t/y3/Lf8t/y3/Lf8u/y7/Lv8u/y3/Lf8t/y3/Lf8t/y7/Lv8u/y7/L/8v/y7/Lv8v/y7/LP8t/y7/Lv8v/y//Mf8x/zP/Nv84/zn/PP8+/z//Qf9C/0T/Rf9G/0f/R/9H/0f/R/9H/0j/SP9J/0n/Sf9L/0r/Tv9V/13/ZP9n/2f/Yf9k/2f/W/9M/z//Mv8v/y7/Lf8w/zT/VP9w/2v/af9k/2j/cv91/0r/PP9h/3r/d/9w/2P/Pf8l/yf/Jv8n/yj/Kf8q/yv/Lf8w/0H/YP94/3b/a/9s/3j/fv94/3P/bf9s/2//dv9k/13/XP9b/2H/Y/9l/2b/Zv9p/2v/bP9d/y//Jv8q/yz/Lf8z/1P/Z/9b/1n/W/9Y/07/Of8q/yf/Jv8m/yf/Kf8o/y3/MP8w/y//Lv8r/yv/Lf8w/zH/Mv8z/zH/Mf82/zn/Of9J/2X/gP+H/zb/Jv8u/zD/MP8v/zH/Mf8u/y7/Lf8s/yv/K/8o/yf/Jv8l/yT/JP8l/yX/Iv8h/yL/Hv8f/x7/Hf8e/x7/Hv8e/x7/Hv8g/yH/IP8h/yH/IP8h/yP/Iv8i/yf/Kf8t/y//N/8//0T/Rv9J/07/Uf9M/07/UP9S/1D/Tf9K/0z/Tv9R/1L/Uv9T/1f/Xf9l/2b/Zv9o/2f/ZP9a/1X/Vv9L/0n/Wv9O/zb/N/89/zr/Nv8y/zH/Mf8x/zH/Mf8x/zL/N/84/zj/Nv80/zL/M/8w/yj/Jf8l/yf/LP9D/2H/eP+C/4n/jv+O/4v/if+L/4//kP+O/4//jv+N/4X/d/9P/zD/Ov9C/03/Qv8+/zz/QP9M/0r/Sf9E/z//Of82/zf/Ov87/zz/PP85/zn/Of84/y3/JP8g/x//If8k/yT/JP8q/z//U/9p/33/if+O/4r/iv+M/4z/iv+B/3T/ZP9T/0v/UP9a/2X/b/92/3z/hP+G/4b/hf+D/4D/gP97/3r/d/91/3H/c/94/3r/ef94/3T/df9m/2H/ZP9r/2r/cP9x/2//bv9n/1//VP9X/2f/Yv9m/1T/TP9U/1z/Zf9q/3P/dv96/33/f/+A/4L/hv+H/4j/iP+J/4r/iP+H/4f/h/+F/4b/hv+F/4T/gf+B/37/fP94/3T/b/9t/2n/Zv9l/2X/Zf9m/2X/Z/9n/2b/Z/9p/2r/bP9u/3H/cf90/3f/hP+S/5H/kP+M/4j/h/+G/4f/iP+H/4b/hP+E/4X/gf+A/4L/hv+I/4H/gf+A/4H/gP9+/3z/ev96/3n/dv90/3P/cf9x/3H/cf9x/3H/cf9v/2//cP9w/3H/cv95/4D/if+O/4//j/+S/5X/kv+O/43/i/+M/4n/iP+I/4z/kf+Q/4//kf+R/5D/jf+K/4j/iP+J/4r/i/+L/4v/i/+K/4b/hP+D/4P/g/+D/zN/M3gzfzN4NH80dzR/NHc0fzR3NH81dzR/NHc1fzV3NX81eDR/NHg0fzR3NX81eTV/NXg1fzV4NX81eTV/NXk0fzR5NH81eTZ/Nnk2fzZ5NH81eDV/Nnk3fzd6Nn82ejV/Nno2fzZ6Nn42ejZ9Nno1fjR8NH40fDN9M3wyfTJ8MX0xfTB9L30ufi59LX4tfS1+LX4tfi1+LX4tfS1+LX0tfi19LH4sfSx+LHwsfix8LH0sfCx9LHwsfSx7LH0sey19LX0tfS19LXwtfCx8LHwtfC18LHwsfC18LXwtfC18LXwtfS18LX0tfC1+LXwtfi19LX8tfS1/Ln0ufy59Ln8vfi9/L38vfTB+MXwwfi58Ln4ufDB+MXszfjV7NX45ezp+O3s/fkF7Q31EfER9RXxHfUl8SX1KfEp9THpLfUt4TH5MeEx+S3dMfk51T4BTclmCYG5nhG1qcIRtZWSEXGVVgEtoP382bzJ/L3QvgC91L4M7dF+FcHBohmVrZIVqanSFa2pAhVVqd4Z5ZHODaWNGfShtJ3oneil7KYAofCmBKn8tgDODRnppiHt2coZrdm5/fIB6dHGNbXFrlWR1YZJ2fGuIXH9dfVyBYHxjgGSCY4Bjhmh+aohqfF2JMHoniSp7K4ktfTOIWH5oh1p+WYVZfFaFUntKhz56LIkmfCaHJ30nhid/K4YyfjOGL3wuiC57LIssey2OLnwujS99Mo40fz6LRoNQg2GHeHKKiJRjd4Ifbit7MX0zejKCM3o0hDN8MoUxfC+FLXwrhih8KIYlfSOFIn0jhSN+I4YjfiKGIH4fhCB+H4Mefh6CHX4cgh19HYMefx6DH34fgyB+IIMhfiGDIH4hhCN+JIYmfimHLX4ziDp/QIlEf0WKRn9Ii0h+R45KfUyPTn5PkE5+TpFNfk2RUH5PklF+VZRcfWCTZnxlkGl8ao5nfGSLW3xSiU19SoZafmV8WH9Gdj9+PHk6fTd/M3wyhDB7MYUxezKHM3s2hzZ7OIY3fDaGM34zhjJ9K4QnfSeFKX1BgWl/gXaJgI5skYGSaZGCkGmOgpBnkYSRZYyEjGaNhI9nkoOGaWyDQm4/gkZ0TH9FdUR+TXJJfVRtWYBVaE+CTWNJg0JkPYI9Zz6AQWhBgT5nPoI/aTyCMnMogiR8I4AlgCWAJoEnfy6BQn1Yf219gXWNfo1rjICLZ4uCi2OJg4NheYRlYk6GQmpIhlJyX4RpcXCCeGqAgoZjiIKIXYWDhVqAgn5VeYJ2T3WCdEl1hHFCdIR3PHeGaz5mhmNHXYNaTWCHXk5iiGZSYolbV2GIXFBaiT1NQYhRY2SJXXFeglt9X3llhm11col2c3qLenF8i39xgomFdoaGh3uJgop/iYCIfoeBhXyFg4R5hIaCd4KJgXN/i39yfY16cHaPc3FukGxxaZFlcGWSZXBlkmZuZpJmbmaSZm1nlGlrapRua2+Uc2pzknRte4uOdJR+lHyQdYyBinOIgYh0iYCJdoiBh3iFgIR9hYCAfoB/gn6HfYeCgneCjYFwgZB/b36RfG55k3hseZR1bXOUcm1wlHFtcZRxbXCUcGxwlG9sb5RwbHCVcGt1lXtrgpKJa4+OkHKPiJF4lH2Rf413jYGMeIiBhnmHgYh7jICRgZB6kIeRdZGLj3SLi4h2iYSJeYp7i3uMcYx9jG2JgYhuhYGEdIKAgnmEfoZ8M/8z/zP/M/80/zT/NP80/zT/NP81/zT/NP80/zX/Nf81/zX/NP80/zT/NP81/zX/Nf81/zX/Nf81/zX/Nf81/zT/NP80/zX/Nv82/zb/Nv80/zX/Nf82/zf/N/82/zb/Nf82/zb/Nv82/zb/Nv82/zX/NP80/zT/M/8z/zL/Mv8x/zH/L/8v/y7/Lv8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8s/yz/LP8s/yz/LP8s/yz/LP8s/yz/LP8s/yz/Lf8t/y3/Lf8t/y3/LP8s/y3/Lf8s/yz/Lf8t/y3/Lf8u/y7/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8u/y7/Lv8u/y7/Lv8w/zP/M/81/zT/MP8w/zD/Mv8z/zP/N/84/zz/Pv8//0P/Rf9G/0X/SP9K/03/Tv9O/07/T/9Q/1D/T/9Q/1D/UP9P/1H/Uv9S/1X/Wv9h/2j/bv9v/3P/cP9i/1L/Q/8+/zf/Nf80/zP/L/8v/zH/Q/9q/3D/Zv9l/2X/bP95/17/Tv90/3z/dv9v/1D/K/8m/yj/Kv8q/yj/KP8q/y3/Mv9K/23/ef9v/2z/cv+B/3j/bv9s/2f/Yv9k/2//cP9i/2D/Xv9e/2H/Y/9h/2L/Zf9p/2j/XP8w/yf/K/8s/zD/Nv9f/2X/W/9d/13/W/9Q/0//TP9A/y7/KP8n/yb/J/8o/y7/Mv8v/y3/LP8s/yr/K/8s/yz/Lf83/0L/Tv9Z/2n/eP+E/4z/lv+Y/1v/Hv8t/zT/Nf82/zb/M/8y/zH/L/8t/yv/Kv8p/yj/Jv8j/yL/Iv8i/yH/IP8e/x3/Hv8d/xz/HP8c/xz/Hf8d/x7/Hv8e/x7/H/8f/yD/IP8g/yH/I/8k/yT/Jv8o/y3/Mv82/zn/Pv9B/0L/RP9F/0X/Sf9O/0v/T/9Q/1D/T/9Q/03/T/9T/1b/XP9s/1//Yf9v/2z/av9j/1v/Uf9M/1n/Zf9f/1X/T/9J/0H/Of84/zj/Nf8y/zL/Mf8y/zX/Nv83/zf/Of84/zb/Nv8y/yz/KP85/2L/gv+H/4z/kP+T/5f/l/+U/5P/lf+W/5L/j/+L/4r/jf+S/47/e/9S/zz/Rv9J/0r/Sv9L/07/U/9W/1j/WP9c/2H/Yf9e/1X/Vf9R/0//Tv9N/0f/Qf80/yb/I/8j/yX/Jv8o/yj/Lv9B/1f/bf+B/4//kP+M/4v/i/+L/4j/gf91/2T/Sf85/z3/Sv9X/2D/a/92/33/hP+H/4n/if+I/4b/gv99/37/fv90/2r/Yf9k/2H/Xv9g/2j/Xf9h/1n/Vf9X/2H/Zv9h/1f/Wv9h/4X/f/9B/0P/V/9f/1v/YP9k/2n/b/9z/3b/eP95/3z/f/+D/4X/iP+I/4r/if+H/4b/hP+D/4P/hP+C/4H/f/9//3//fv98/3n/df9y/23/a/9o/2X/Zf9l/2X/Zv9m/2X/Zf9m/2f/af9q/27/b/9z/3P/dP98/5D/lP+U/5H/jf+J/4j/iP+J/4n/iP+G/4X/hP+D/4D/gP+C/4f/h/+B/4H/gf+B/3//fv98/3n/ef93/3X/c/9y/3D/cP9w/3H/cf9w/3D/b/9v/3D/cP9x/3b/fP+E/4v/j/+P/4//k/+U/5D/jf+M/4v/if+H/4f/if+M/5D/j/+P/5D/j/+N/4z/iP+J/4r/iv+L/4r/if+J/4j/h/+F/4T/hP+E/4X/if8zfzN3NH80dzR/NHY0fzR2NYA1dzSANHc0gDR3NIA0dzV/NXc0fzR3NH80dzR/NHc1fzV3NH80dzR/NHk1fzV5NX81eDV/NXg2fzZ5Nn82eTZ/Nno3fzd6Nn82ejZ/Nno2fzZ6Nn82eTd/Nno2fjR6NX41ezR+NHszfjN8M34zfDF9MX0wfTB9Ln0ufS19LX0tfi19LH4sfS1+LX0tfix9LX4tfS1+LX0sfix9LHwseyx8LHssfCx7LHwseyx8LHssfCx8LXwtfC58Ln0sfCx9LHwteyx8LHstfC19LXwtfS58Ln0ufC59LnwufS18LX0tfC1/LX0tfy5+Ln8vfi9/Ln8ufjCAMXw0fzV6N343ejZ+Nnk3fjd5OX45eT5+QHxBfUJ8Rn1HfEt9TXxNfU97T31Re1F8U3tVfVV7VH1Ue1R9VHlTfVN4U35TdlV/VnNcgmNwaYVxa3GEcWRvgmVjW4FQZUOAPG44gDVzNH8ydzF/MHg1hFB1cYZpcGWGZmxmhXJrdYVdanGIgGd5g3NjWX4waiZ6Jncpeyp/KX0pgCx/Ln81hFJ5cYd2dG2FbXV1gX6BcXhljGd4Z5JpeWmTaX50i2h/X4JegVx+X4JgfmCAY4RkgGeIaH1aiDB7JogsfS2JMX06iWV9ZYdee2CHXnpbiE94TY1OeFGNRHgtiyl8KIcnfyWFJ34vhS99K4YpfSuIKn0qiit+L4k4gUeKV4NihG6Ge3aGiYpmiIuWWJuIk1k2fyRzL3szfjR6NII0ejSEMHowhC17LYMuey2ELHsphSZ7JIUhfSGGH34ehR1+HYMdfh2BHH4cgh1+HYEdfh2CHX4dgh1+HYIdfh6CHn4ggyB+IYQifiKFIn4jhSV+KYctfy6IMX42iDp/PopAf0KNQ31Fjk19U5BSflGRTn9NkUl/SJFNf1GTVX5bk2V+apFvfHCQbH5tjmp9YI1Tfk6IS35ggGN/VXNQgFByToBJdj+AOHw3fjSDM3wzhzN8NIY0fDeHOH06hjx9PIg8fDmFNH45glp+f3mLf4pxjYGQb5KBl3CWgJNwlYGabJqDl2qSg4xpioKKaoyDkWqFhF5tPoFJdEl9SnZIe0x2TXpSblR/Wmleg19lYoZjYmSHXWBahl5fXYZaYFiGVGZFhzBzJYQjfSOBJYMlgCaEJoAthEF+U4JpfH14jH2ObY1+jGiKgIplhIB8YnCCYmNFhi9tMYY+ekqEWHplgWxyd4GBa4eCi2SNgoxgiYOHXYaDhVmCg4BWeIVqWmGGWlxZhV5aXIRXWVeBV1lcg15UXoVfWWqFZV9Yf2lIg4eILH2KTEBaimFfXodadFl/ZoRveHKLc3R2inpyfIh/coKFhXqHgIl9iX+HgYSAhYCFg4N7goSDeYGHfnZ+in5xfo59cHqPeHB0j3Fxa49rcWeQZXBkkmVwZZJlb2SRZW5lkmduaJRpbGyUbmxwlHNrc5JzboKIk3eTeZN/kHCNgYtwh4GHcoeBiHWGgIV6hICDfICAgH2Bf4N+iX6GhIF3gY2Ab4CQgW9+kXxtepJ4bXaTdW1xlHFtcJRwbXCUb21vlG9tb5NvbW+VbmxvlXBqd5V9aYWSjW2PjZBzj4WWepN8kH+Md4yAi3iJgIh5iH+LfI9+j4KPeY+IkXSOiox1iIiIeIl9inqKdIp+iW+Jf4dvh4KGboWBhHWEfoR9hnuNfzT/NP80/zT/NP80/zT/NP81/zX/NP80/zT/NP80/zT/Nf81/zX/Nf80/zT/NP80/zT/NP80/zT/NP80/zX/Nf81/zX/Nf81/zb/Nv82/zb/Nv82/zf/N/83/zf/Nv82/zb/Nv82/zb/N/82/zP/NP81/zX/NP80/zP/M/8z/zP/Mf8x/zD/MP8v/y7/Lf8t/y3/Lf8s/yz/Lf8t/y3/LP8t/y3/Lf8t/yz/LP8s/yz/Lf8t/yz/LP8s/yz/LP8s/y3/Lf8t/y3/Lv8u/yz/LP8s/yz/LP8s/y7/Lv8t/y3/Lv8u/y7/Lv8u/y7/Lf8t/y3/Lf8t/y3/Lf8t/y//L/8x/zP/NP80/zb/OP87/zz/PP88/zz/PP87/zv/Pf9A/0T/RP9I/0r/TP9O/0//Uf9S/1P/Vf9X/1j/Wf9Y/1n/WP9Y/1j/WP9Y/1j/Wv9b/2D/Zv9r/3D/c/9x/2//Zf9a/1H/UP9L/0H/OP80/zP/M/8y/zD/OP9e/3H/Z/9k/2j/bv92/3X/eP+D/4D/eP9h/zP/KP8q/yj/Kv8q/yv/LP8u/zz/Wv94/3P/bf9s/3P/fv92/2r/af9p/2n/af9q/3D/bf9h/13/XP9e/2P/Yf9i/2b/aP9m/1n/MP8r/y7/M/80/z//Zv9k/17/Xf9e/1r/Tf9K/1D/VP9T/0P/LP8n/yb/JP8k/yb/Kv8u/yr/Lf8z/zH/N/9B/0v/V/9o/3D/fP+C/4v/jf+H/5T/mv+d/3j/Hf8o/y//Mv80/zT/M/8x/zD/L/8s/y3/Lf8r/yv/Kf8l/yP/If8f/x7/Hv8d/x3/Hf8c/xz/HP8c/xz/HP8c/xz/HP8c/x3/Hv8f/x7/H/8g/yD/Iv8h/yP/Jv8o/yr/LP8s/y3/Mv83/zn/PP9A/0L/R/9N/1D/Uf9J/0L/SP9L/07/U/9Z/1//X/9l/2r/Z/9s/27/af9c/1T/Vv9N/1L/ZP9Y/1P/T/9Q/1D/Tf9I/0H/OP8w/y//Mf8z/zb/Nv82/zb/Nv82/zz/OP89/1n/ev+K/4v/i/+M/5H/kf+T/5P/kf+Q/5X/lf+X/5L/jf+I/4j/jf+Q/4n/bP9G/0b/Sf9J/0z/Tf9P/1H/U/9W/1n/XP9e/1//X/9c/1z/W/9c/1v/WP9R/0L/LP8k/yL/I/8j/yT/JP8m/yn/N/9N/2P/eP+G/4v/i/+L/4n/iP+C/3n/bv9Y/z3/LP8p/y//QP9M/1n/Zf90/37/hP+L/47/jf+M/4v/iv+H/4L/gP95/3b/dP9k/2X/Zv9l/1r/Wv9e/2r/av9n/1//TP9I/07/a/+F/4j/jv90/1P/UP9M/1H/Wf9n/27/c/91/3X/d/98/4D/gv+E/4b/iP+I/4b/hf+E/4X/hP+A/4H/gP9+/3z/fP99/33/e/94/3T/cf9r/2n/Zf9l/2T/ZP9k/2T/ZP9m/2b/Zv9n/2n/bP9u/3D/cf90/3X/h/+V/5T/kf+O/4v/if+H/4f/hv+G/4X/hf+E/4T/gv9//4D/gv+H/4X/gf+B/4D/gP9//37/ev95/3f/dP9z/3H/cf9w/2//b/9v/2//b/9v/2//b/9u/27/cv94/4H/iv+Q/5D/kP+R/5b/k/+O/43/jf+M/4j/h/+H/4v/jv+O/43/jf+O/4z/iv+H/4j/if+K/4r/iv+J/4n/h/+F/4T/hP+E/4X/hf+H/47/NH80dTR/NHU0fzR2NH80djWANXc0gDR3NIA0dzSANHc0fzR3M380dzR/NHc0fzR3NH80dzV/NXc0fzR3NX81dzV/NXg1fzV4Nn82eTZ/Nnk2fzZ6N383ejd/N3o3fzd6N383ejd/N3g4f0F5Q347eTZ+Nns0fjR7NH40fDN+MnwzfTF9MH0wfTB9L30ufS59Ln4ufSx+LH0tfi18LX4sfC1+LXwtfi18LX4tfC18LX0tfC19LXwtfSx8LHwtfC18LXwtey58LnstfC17LXwtey18LX0tfC19LnwufS58Ln0ufC59LXwtfS18LYAtfC2ALnwugS59LoEtfi1/L34vfzGAM341gTV6OIE7dz2BQXZBf0J1Qn9AdT1+PXhAfkN7Rn1Ie0t9TntQfVJ8VH1Ve1h9WXtbfFt7W31ce119XHtcfVp7W31belx+XHZef19zYoBob26Dc2x2hHRmcYJnY12BVGJMgFFoVYBQbkJ/NXIyfzF3MYEvdj6EZXRuhGhwZoZoa3GGeWp+hoFnf4F5Y2l9PmUleCd0KnkofSl9KX4qgTB4QoZkdnmIb3Nsh2t2cYOAgXWBa4xofmeSaX5pk2d+Zo5sf2OHX4Bdf16AYn1igGSBZ4Bmhmd+VoczfTGHMX0xiTR9R4lme2OJXXpfiV94WYtGdkaPTnRTkVR1UpFDeSuMJnwkiCN9I4InfzZ+PYE2fTmBP3tFgk98WIVgemqIeHWBiYVqioqNYY+Mk1SWi5tOmYVVWx18Knksey6AMXowhC96LoQuey6DLXsshCt7K4UqeyeFJHsihR99HoMcfhyDHH4cgRx+HIEcfhyAHH0cgRx9HIEcfRyCG30cgh1+HoIdfh2DHn4fgyJ+IoMlfieFKn8rhit+K4csfS+JM303jTp8QI5KfEuPUX1RkU5+SpFPfkyRTn5Qj1N9V49efl6PXn1hkGN9YZBhfFqOVn1ZilN9VYNjf154UYBPcU6ATnNOgExzSH9FeT5+N38yfC6BK3wvgi98MIUyfDOGNH01hE9+c36HgYp3jIKKdYqBj3ORgZB0j4OAdnCCc3eAgY51koKMcIeCh26KgpBri4RybEiBQXNIf0l3SnxMd056UXZTfFNyU35WbleAWWpXgldmXINeZl6DXGZYhFVrRYYsdiGCIX8ggCKCJH8lgyR/J4M0fEqDYnt3fYR9jXKKfopsiYCGZn6BdWJphFJmM4UoczWFNno+gkR4T4Bec2+AfGuCgYlljYKOZIyCjGCKg4VegoOAXXqEdF5uhWVjWoRXZlaDWGVef2RfaoBkXmWAZF9SfExZW3x7PYeMiSyOl5AxjZB9QW+MZlRbiFZpYYFsfG97boR3en2GgXuEg4Z/h4GHgIaBhn+FgYR+g4SBeoKFgHd/iXt0fIx7cHuOe3B5j3hwdI9vcWuPaHFlkGRwZJJjcGOSZG9kkmVuZZRlbmeVaGxslW9qcZRyaXSReW6NhJZ3lHiRgI9xioKJcYmCiXKHgYV1hICDeoR/g3yBgH99gH+Cfoh7hISCdIKNgG+AkH9ufJF5bHaSdm11k3NtcZRwbXGUcG1wlG9tb5RubW6Tbm1ulWxsb5V0anuVhGmLkJBukYyPdZODlnqSeY5/jHaLgIl5iH+Geod+jH6OfY2DjXiNiIx1i4qHeIaDiHyIeIl/inGJf4hwiICGcYaAhnWEf4V8hnuFgYh4kII0/zT/NP80/zT/NP80/zT/Nf81/zT/NP80/zT/NP80/zT/NP8z/zT/NP80/zT/NP80/zT/NP80/zT/NP81/zX/Nf81/zX/Nf82/zb/Nv82/zb/Nv83/zf/N/83/zf/N/83/zf/N/83/zj/RP9X/07/Of82/zX/NP80/zT/M/8y/zP/Mf8w/zD/MP8w/y7/Lv8u/y7/Lf8s/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8u/y7/Lf8t/y3/Lf8t/y3/Lv8u/y3/Lf8t/y3/Lf8t/y3/Lf8u/y7/Lv8u/y7/Lv8t/y3/Lf8t/y3/Lf8u/y7/Lv8u/y3/Lf8v/y//Mv8z/zX/N/85/zv/P/9E/0T/Rf9G/0X/Qv9B/0P/Rf9J/0v/Tv9R/1P/VP9W/1j/W/9d/17/X/9g/2D/YP9g/1//YP9g/2D/YP9g/2L/ZP9n/2v/cP9z/3b/dP9y/2v/YP9X/03/SP9E/0j/Tf9L/0H/NP8x/zD/Mf9H/2v/a/9k/2P/aP9w/33/hf+A/3r/cP9W/zD/KP8q/yj/K/8t/zH/N/9K/2n/df9t/2v/aP9v/3r/b/9q/2j/aP9p/2n/Zf9j/2X/aP9h/2D/X/9e/2L/ZP9l/2X/Zv9V/zP/Mf8x/zH/Mv9Q/2f/Yf9f/2P/YP9X/0X/Rv9L/1D/Uf9S/1D/P/8p/yP/I/8j/yX/Mf9E/07/RP9D/03/U/9a/2L/af95/3//hP+I/4n/kP+N/5H/l/+g/5b/O/8f/y//Lv8w/zD/L/8v/y7/L/8u/y3/K/8r/yr/J/8k/yL/If8e/xz/HP8c/xz/HP8c/xz/HP8c/xz/HP8c/xz/HP8b/xz/Hf8e/x3/Hf8d/x7/IP8h/yP/Jf8m/yb/Kv8s/yz/Lf8v/zP/N/8//0T/Rf9L/03/Tv9L/0n/Sv9N/0//Uf9T/1f/Wv9e/17/Yf9g/2L/Xv9Z/1X/U/9V/2P/Xf9R/1D/Tv9O/07/TP9I/0X/RP9D/z7/OP8z/zD/Lv8s/yv/L/8v/0T/af+D/4T/hP+I/4r/jP+N/47/iP93/1X/Pf9B/1n/eP+P/43/hv+F/4r/jP+M/3X/UP9E/0j/Sf9J/0n/TP9N/07/T/9S/1P/Vf9S/1L/VP9X/1n/WP9W/1L/UP9D/y7/If8h/yD/Iv8k/yX/JP8m/zL/Rf9d/3L/gv+K/4r/if+G/4P/ff9z/2b/Uv8v/yb/N/87/z//Qf9N/2H/bv95/3//hf+J/43/jP+M/4v/hv+C/4H/ef9z/2v/Y/9Z/1P/Uf9Q/0v/T/9W/1j/Xv9f/17/X/92/4n/jf+O/5H/lf+Z/5z/m/+f/5//l/99/1f/Vf9b/1T/Vf9b/2D/Y/9w/37/gf+D/4T/g/+D/4D/f/9+/3z/e/96/3r/e/98/3n/d/9z/27/av9n/2T/ZP9k/2P/Y/9k/2T/Zf9l/2X/Z/9p/23/cP9z/3T/df9+/5L/l/+U/5L/jv+M/4n/iv+K/4r/hv+D/4P/hP+D/4H/f/+B/4P/if+D/4H/gf+B/4D/f/98/3n/eP92/3T/cv9x/3H/cP9v/2//b/9v/27/bv9u/27/bv9w/3X/fP+F/4z/kf+S/5D/lP+V/5D/jv+M/4v/if+I/4b/h/+M/43/jP+M/4v/i/+J/4j/h/+I/4j/if+K/4n/iP+I/4f/hv+G/4b/hv+G/4X/iP+Q/zR+NHQ0fjR0M380djV/NXY0fzR3NH80dzR/NHc0fzR3NH80djR/NHY1fzV4NX81eDR/NHczfzN3NH80djV/NXY2fzZ3NX81dzZ/Nnk3fzd5Nn82ejd/N3o3fzd6Nn82ejZ/Nno2fzZ6N386eUd/Tnk8fjV6NX41ezR+NHw0fjN8M34xfC9+L3wwfTB7Ln0ufC59LX0tfS17Ln4ufS1+LnwufS59LH0sfS19LX0ufC59LXwtfS18LX0tfC18LnwufC18LXwtfC58LnwufC58LnwufC59LnwufS58Ln0tfC19LXstfS17LX4tfC1+LXwtfy18LYAufi5+Ln4ufi9+L34xgTR9NoI5ezuCPndCg0hzSoFNcU1/THNJfkd2R31Kekx9TnxQfVN+V31ZfFt9Xn1ffGJ8YnxjfGR9ZHtkfWR6Y35je2R+ZHllfWV5Zn9mdmqBbnJxgnVtdoN3Z3KDbGJjgVpjUX9KakOBQm9CgEZzSYBJdUSAOnYxgjB0UINvcmaFY29ihWZscoV+aoSEfmR5gGthV35DaTV8M3E2fTpyQoFKb1mFb3BxhmpzZ4dldm6FdYNtgWuNaX5qkmp+aJJlfWWQY35timR/YYJggV99Yn9kf2R+ZIVlfVOHMHwsiCp9LIgyfFuIaXtkiGF5Z4pod1eOSXRLk010T5RPdE+UT3ZMkjl4JoskfiWDKH8weUGCVm9YhEtpSIZSbliIYXFniXJse4mBZoeKiWCHjIxUkIyUS5qLnkyEgiVjKHsuezN6MoIwei+EL3ouhCt6KYQqeyqEKnwohSZ8I4MgfR+DHX4dgxx+HIIcfhyBHH4cfxx+HH8cfhx/HH4cgRt+G4Edfh2BHX4dghx+HoIefiGDIn4ihCR+JoYnfSqHLXsviDJ7NIs6eUGMRHxHjFB8VI5ZfVmLWn5bil1+Xollfm2Jdn91h3N/dIdwfmuIZn5giF99WolQfVeEZn5gdlN/UG5PgE9uTYBLckl/RnVEfkJ5QnxDfD17On40ezKAMXsrgjJ8XIB+foJ8g4GDeYWBh3iKgol0gINtdUuCKn0ogSmCPYBjgIOAjnaHgYRwh4KMbo2Ddm9Qg0FxSX9KdUt+S3ZLfU11T31PdU58TnROf0txS35QcFN/U25Pf05uTYFLcUODLnYhgSF+In8igiR+JYMlfiiDMntIg118cnuDfolyh36GbIOAgGR7gm9fYoVNYy2DKXArgS93NoE/d02AYXRsgHVvfIKCaYWCiGOMgopjiYOIYoWDf2J5g3Nja4NmZ1mDVWpRg1BsUoJda1+CXWRcgGJbZ31vTXuAjTqSi5U4m5CgRp+Ook+ljKRanJF/cFeOTINOhVOIUYFKiEd/QIg7fUGNTHtWi2x8fouCeoOIgXl/iH52eo15cnmOem97jnpveY92cXOPbXFoj2VxZJBkb2SSZG9kkmRvZJJlbmWTZW1nlWprbZVxaHOUdGp1j4ZwloCVepRykYGNb4yDi2+LgYtvi4GHdoKAgnqDf4J+gX+AfYF/hoCJfIKHgHWAj4JugJKAbn2ReGx3knVtc5NwbW+UcG1wlHBucJRubm6Ubm5ulG1tbpRva3CVdWl+k4drjZCRb5GJkHeVgZR9j3qOf4x3iYCJeIaAhnmIf4x/jnuKhot2jIuLdomFh3mHeod9iHSIf4hwh3+GcYWAhXKGgId4h36FgoV3hIeKdpGENP80/zT/NP8z/zT/Nf81/zT/NP80/zT/NP80/zT/NP80/zT/NP80/zX/Nf81/zX/NP80/zT/NP80/zT/Nf81/zX/Nf81/zX/Nv82/zf/N/82/zb/N/83/zf/N/82/zb/Nv82/zb/Nv82/zb/Nf83/zr/M/81/zX/NP80/zT/M/8z/zH/MP8w/zD/MP8u/y7/Lv8u/y3/Lf8u/y7/Lf8u/y7/Lf8u/y7/Lf8u/y//L/8t/y3/Lf8t/y3/Lf8u/y7/Lf8t/y3/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y7/Lv8u/y7/L/8v/zP/Nf83/zr/PP9A/0T/Sf9N/0//Uv9S/1D/Tf9K/0z/Tv9R/1P/Vf9Y/1r/X/9h/2L/Zf9l/2f/Zv9m/2j/aP9p/2n/aP9o/2n/af9p/2n/bv9x/3T/df92/3X/cv9s/2P/Wv9U/03/Rv9C/0D/Pv89/0T/Tf9O/0X/P/8+/1z/bP9k/2P/Y/9p/3P/f/+B/33/ef9y/2b/XP9V/1b/W/9g/2T/bP9y/27/af9n/2T/bP94/2//af9q/2n/aP9m/2L/ZP9i/23/bP9m/2X/Y/9k/2b/ZP9k/2P/Uv8w/yn/Kv8q/zz/Z/9p/2T/Zv9l/2f/T/9M/0//Tf9O/07/Tf9O/07/S/84/yj/KP8u/zb/Ov9L/1z/Wv9M/1H/Wf9d/2T/bf93/37/hf+I/4n/i/+O/5L/lv+b/5v/aP8e/yj/L/8v/y7/L/8t/yv/Kf8o/yj/Kf8p/yj/J/8k/yH/H/8e/x7/Hf8c/xz/HP8c/xz/HP8c/xz/HP8c/xz/G/8b/x3/Hf8d/x3/HP8e/x7/If8i/yL/I/8l/yX/Kf8s/y//Mf8x/zL/Rv9X/2T/bP9x/3L/dv94/3r/dv9y/3T/dP92/3T/cv90/3P/c/90/3L/bf9h/1X/WP9l/2H/VP9P/07/Tv9O/0z/Sf9G/0T/Qv9D/0L/RP9G/0n/Qf8w/y//Qf9v/4L/ev97/37/g/+E/4X/ff9h/zf/Jf8o/yn/Jf8y/1f/ff+M/4b/g/+F/4r/if9z/0n/RP9J/0r/S/9L/0v/Tf9O/07/Tf9N/0n/Rv9L/0z/Tv9O/07/T/9L/0n/Qv8t/yH/If8i/yL/JP8l/yX/KP8z/0n/X/90/4L/h/+H/4T/gP9+/3f/bv9e/0b/KP8r/zP/L/8q/zP/Tf9f/2n/cf94/3z/gf+D/4b/iP+J/4j/h/+B/33/eP9w/2n/Zf9i/1v/Vf9b/1z/Xv9c/13/Yf9n/3H/f/+K/4//lP+Z/6D/m/+S/4X/af9T/0j/Vv9h/2H/af9u/1z/Tf9K/0j/R/9H/0T/Qv9K/2b/fP+C/3//fP96/3n/ev97/3r/ef94/3X/cv9t/2j/ZP9k/2T/ZP9k/2T/ZP9k/2X/Zf9l/2f/av9t/3H/c/91/3f/jf+X/5f/kv+O/4z/jP+L/4z/jP+M/4j/gv+C/4P/gv+B/4D/gf+G/4j/gf+B/4H/gv+A/3z/ev94/3f/df9z/3D/b/9w/2//b/9v/27/bf9u/27/bf9u/2//cP92/3//iP+P/5H/j/+Q/5T/k/+R/47/jP+J/4n/iP+H/4r/jf+N/4v/iv+K/4j/h/+I/4j/h/+I/4j/iP+H/4b/hf+G/4b/h/+H/4X/hf+F/47/kf80gDR2NIA0djR/NHY0fzR2NH80djR/NHY0fzR3NH80dzV/NXg1fzV4NX81eDR/NHg1fzR3NX81dzR/NHg1fzV4NH81eTZ/Nnk2fzZ5Nn83eTd/N3o2fzZ6Nn82ejZ/Nno1fzV6Nn82ejV/NXo2fzN6NH41ezV+NXw0fjN7M34zezN+MnwyfjJ8MX0xfjB9Ln4vfS59LX0tfC19Ln0ufS58Ln0ufS59Ln0ufC58Lnwuey58LnwvfC98LnwufS58Ln0ufC58LnwufC58LnwvfC98L3wvfS58Ln0tfC19LXwtfS19LX0tfS1+Lnwufi18LX8tfC2ALX4tgS1+LYAwfjCAM4A2fDiBO3o/g0N3RoRLc06DUnFWglhxV35Tc099UHdRfFR7V3xafFt9Xn5ifWN+Zn1lfmh9aX5qfWt8a31re2t+a3pqfmt5bH9seG2AbnZygXNyc4JzbXWDdGVwg2tjYoFdZlR/Tm5LgERxQ39Adj6APHg6gD14Q4FFd0WDT3ZnhGhwZIRkbWaEb2t5hXxmfIZ3X3mGc2Jwh3BpcIdyaXKIb2lwiG5taIdlcmaFYnhrg3uDcH9njWZ9ZpJmfWWSY31jj2J+bYt2fmqFZoBlf2F/ZH9jfmSFYnxRhyx7KogqeyyISXtsh2d5ZohodmeLZnVLkEtyT5ZOc06WT3JOl0x0TJNLd0iOOHwyhzWAOX05gj1uU4RaZ1SHT2dTiVprX4lpaXGJfGSEiYdeiYuLVpCMkU+VjppHm4mZTUN/HWwqeyx8LHsqhSp7KoUnfCeFJnwmhCZ8JoUmfCWFI30ghR9+HoQefh6DHH4cght+G4EcfhuBHH4cgRx+HIEcfhyBG34bfxx+HIEdfh2BHn4ggiB/IYMifiGEJn0nhyp8L4g5e06IYXxoh2p9aoZpfmqGcH55hXl/doV1f3ODdH9zhHGAb4RvgHCDb39uhHB+coVyfnSDc35xgm1+YHtVf1F0T4BPcU6ATHJJf0d1RX5DeUJ8QnpFe0p5UXpgeWB6UHpbfHt5gH57d3yBfHmAgYR4foNteziDHYAmgCiCJX8nhS9+ToN3fop6hoCDcYaCiG+Cg2hyQ4NEdkl/SnlLfUt4SnxLd058TXdNfEx3Rn1Gdkp9S3NMfUxxS39KcUmCR3Q+gi56IYAgfyJ+I4EkfSSDJX4ogzN7S4NgfHd9hn6Jc4V/gm1+gXtmdIJsYlyFR2gugyZ0MYEpeyiBOntQgFt1ZYJscXGDd2p7g35og4OFaIWDhWeEg4NlgIN7ZHODbWRpg2pja4NoY2GEWmJehGNeZ4NrVHCCeESChIs6j4qQP5CQglhCkS53MIs7h02GXZFgg26RcX50j2Z6VoxYeWOJaHlphG15bYFoeF6CUnlWg2d4eYd7d3iLeXN4jnpxeo15b3iPdXFwj2txZo9kcWKQYm9kkmRvZJJkb2SSZG5lk2VtZ5Nra26TcWtzlHNse4+SdJd+lX2Qco6Ai3GLgoxvjIGOb4+Bh3aCgIN8gX+Bf4B/gH2Bf4iAh3uBiYJygpCDbYGSfm18kXlsdpJ0bXKTcW1wlG9tb5Rvbm+UbW5slGxubJRtbW2Ub2pzlXlogpOKa46PkHKPiJB4k3+SfZB5jH+LeYmAiXmIgIl6jH+OgIp7ioaJeImFiHmIfYd9h3WHfohyiICIc4eAh3WHgId3h3+If4V4hIiEdIaJkHWQgzT/NP8z/zP/NP80/zT/NP80/zT/NP80/zX/Nf80/zT/Nf81/zX/Nf80/zT/NP80/zX/NP81/zX/NP80/zX/Nf80/zX/Nv82/zb/Nv82/zf/N/83/zb/Nv82/zb/Nv82/zX/Nf82/zb/Nf81/zX/Nf81/zP/Nf81/zT/M/8z/zP/M/8z/zL/Mv8x/zH/Mf8x/zD/L/8u/y7/Lf8u/y7/L/8w/zD/L/8v/y//L/8v/y//Lv8u/y//L/8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y//L/8v/y//Lv8u/y3/Lf8t/y3/Lf8t/y3/Lf8u/y7/Lv8u/y3/Lf8t/y3/Lf8t/y//MP8v/zL/OP87/0D/RP9I/0z/Uf9W/1n/W/9b/1r/Vf9T/1T/Vf9a/1z/Xv9i/2X/Z/9q/2r/bP9t/23/bv9u/27/bv9u/23/bv9w/3D/cv9z/3X/dv92/3b/dP9z/2//af9i/13/Vf9Q/03/SP9F/0L/QP89/zn/OP81/zb/O/9D/1L/Zv9l/2P/Zf9p/3P/ef91/3j/dv90/3T/df94/3b/c/9v/2z/Zv9i/2L/Zf9i/2n/ff9w/2n/av9o/2r/aP9p/2n/av9v/3v/bv9p/2j/Y/9j/2X/Yv9e/07/LP8q/yv/L/9Y/2z/aP9m/2r/bv9h/0X/TP9Q/1D/T/9Q/07/TP9L/0n/R/9G/0L/P/88/z3/O/89/0X/Of88/0v/Vv9e/2b/bv9y/3z/hP+I/4r/jv+P/5P/lv+b/57/if8s/yH/Jv8o/yf/J/8m/yb/Jv8l/yX/JP8k/yP/Iv8h/yD/H/8e/x7/Hv8e/xz/Hf8d/xz/G/8c/xz/HP8c/xz/HP8b/xv/HP8c/x3/Hf8d/x7/IP8g/yH/I/8i/yf/P/9a/2b/Z/9k/2P/ZP9l/2f/cv94/3j/df90/3b/dP9z/3L/b/9t/2v/a/9s/2z/bv9w/3D/cv92/3v/ff90/1z/UP9M/07/Tv9M/0j/Rv9F/0P/Qv9D/0T/SP9T/2H/bf9y/3r/gv9+/3v/ff99/33/fv95/13/LP8k/yX/Jv8k/yT/L/9O/3T/iv+G/4P/hP+H/4D/Wv85/0T/SP9M/03/Tf9M/03/Tv9N/0z/S/9G/0j/S/9M/03/Tf9L/0r/Sf9H/z7/Lv8j/x//If8i/yL/Iv8l/yj/OP9Q/2b/ev+H/4f/gv9+/37/e/90/2n/WP8+/yv/LP8w/yz/Lv9F/1H/Wv9e/2f/a/9x/3X/ev98/33/fv+C/4H/gP9//3z/ef91/3T/c/9w/27/Z/9l/2b/aP9r/3H/eP+D/4r/jP+N/4v/jf9c/x//Mv9E/0z/XP9i/2H/Xf9u/3P/bf+G/5//o/+p/6b/nf+T/4j/gP+C/4H/b/9n/23/dv93/3j/ev95/3f/eP9z/2//av9l/2T/Yv9i/2T/ZP9k/2T/ZP9l/2b/Z/9p/23/b/9v/3L/df9+/5f/mf+T/4//jf+M/4v/iv+M/47/j/+H/4P/gf+A/4H/gf+B/4H/iP+H/4H/gv+C/4L/gP99/3v/ef92/3T/cv9x/3D/b/9v/2//b/9s/2z/bP9s/23/bf9v/3P/ev+D/43/kf+R/4//kP+R/5D/jP+M/4v/if+J/4f/iP+M/47/iv+K/4n/if+I/4j/h/+J/4f/h/+I/4f/hv+G/4f/h/+I/4b/g/+C/4P/if+Q/5D/NX81dTR/NHU0fzR2M38zdjN/M3U0fzR1NH80dTR/NHY0fzR3NH81dzV/NXg0fzR4NH80eDR/NHg0fzR4NX81eDV/NXk3fzd5NX81eTV/Nnk2fzZ5Nn82eTZ/Nnk2fzZ6Nn82fDZ/Nnw2fzZ8NX81fDV+NXs1fjR8Mn4yfDR+NHwzfjN+Mn4xfTF9MX4wfTB+MH0vfC99LnwufS99Ln0ufC58LnwvfS98L3wvfC98L3svfC97L3wvey98L3svfC97Lnwuey58LnsufC58L3wvfC98L3wufC58LnwufC98LXwtfC18LnwufS18LX8ufC6ALX4tgS1+LYEtfS2AL30wgDF/NH82gTp+QIREe0iFTHdRhVhyXIVecWGBYHFafVh0WXxaeVx8YH1gfGR+aH1pgGp+bH9tf258b39ve29/b3dvgG92cYBxdHKBcnRzgXRxd4N3b3aCdWl0g3FlbYJmZmGAXGpXgFFwTYBKdUh/RHZBfz94O385eTaAMngxgDN2PIJXdGqEY3FmhGVvb4Vya2eFaGdnh2ZoaohramqIaW1miGdsaYhmb2aHZXNkhmB6ZoR4hXOBb5BtfmmSaXxmkWV+Z5BofmiPfX5yimh/ZoFkfmF/Z31hhFx7TocseiqIKXo8iGd6a4hod2mKbHZtjVN0QpRLc0+YUHFRmVFxT5dOcUyTSXRHkkN4QotAfEKDPoE/dTmCO2w1gjRpQoVRaFqJYmhni2xjdYuAW4ONh1KJjY1OkY2VSJeNmEWaiHNQHn0gdSR7J4EmfCeFJX0lhSR8JIUifSKFIX0hhR9+H4Qffh+FHn4egx5+HoMefh2CHH4cgRx+HIAbfhuAG34bgBx+HIAdfh2AHH4egBx+HYEffSCDIH0ihDd9W4ZsfmmHY39hhmCAYYZjf2mIcn96hnd+dYV1fneFdn50hHN/coRwfm6Fbn5shmx/bIRrf2uCbIBvg3B/dIN6f4CBd39aekx/T3ZOf0xyS35HdUV9Q3hDfUN6Q3tKeVR4YHprenR7gHuEeX1/eXl7gXt6eIB1eG+CSnwpgSaBJn8lhSZ8JocufU6CdH6IeoOAgXOFgYVweoRPczeEQnpGfkp8THxMek17THlMfEx3S31Id0V7SXhLe0t2TXxLc0p/SHNGf0R3PoAufSN/IIAggCGCIX8hgyV9LIU8fFSDa3x+fIl+h3SBgX9rfYJ5ZXKFZ2RThjhuIoMneDGAOHw9f0x5UYFadFyDYHFmhWttboVxbHKFd2x5hXxofoN/Yn6CfmJ8g3djeIV3YnWFcV9xhXFhb4VqYG6Fc1R6hIFLh4aMSIuKiVCIjkFpJ4k3hkWCUZNbfV2YUXtVmWJ2fZaac7OIvHy7f7qAuXixgKJ1jnx+eHB0jXiZdo13d310enx7eoV6dHqMeXF2j3Nwbo9rcWePY3BikGJvZJFkbWSRY25jkmRtZZNnbWmTbGtulHFqc5RzbYSNmXOXe5J/j3ONgYtwioGLb46BknGPgYR4gYCBfoJ/gX9/gIF+gX+IgYV6gYuDcYGQgG1/k31tepJ4bHaTdG1ylHBtb5RvbW+Ubm5tlGxubJRsbWyVbmxslW9pdJV8aYaTjGyRj5B0j4WRepB+j32Ne4x/i3qJgIl5iX+Ke45+joGLeouDiXmIf4d7h3aIfodyh3+HcYeAhnWGgYZ2iYGIeoh9hIOAdIKMhnONiZF1kIM1/zX/NP80/zT/NP8z/zP/M/8z/zT/NP80/zT/NP80/zT/NP80/zX/Nf81/zT/NP80/zT/NP80/zT/NP81/zX/Nf81/zb/Nv81/zX/Nf82/zb/Nv82/zb/Nv82/zb/Nv82/zb/Nv82/zb/Nv81/zX/Nf81/zT/Nf80/zT/NP80/zP/M/8y/zH/Mf8x/zD/MP8w/y//L/8u/y7/L/8v/y//Lv8u/y//L/8v/y//MP8v/y//L/8v/y//L/8v/y//L/8u/y7/Lv8u/y7/Lv8v/y//L/8v/y//Lv8u/y7/Lv8u/y3/Lf8u/y7/Lf8t/y7/Lv8t/y3/Lf8t/y7/Lv8w/zD/Mf80/zb/Ov8+/0H/SP9M/1D/Vv9c/2D/Y/9k/2H/Xv9c/13/X/9h/2L/Zv9o/2n/bP9u/3D/cP9x/2//b/9v/2//b/9x/3H/cv9z/3X/d/94/3j/dv90/3P/b/9r/2b/Yf9c/1b/U/9Q/03/Sv9G/0T/QP89/zr/N/80/zH/Mf8x/0f/av9l/2H/Y/9p/2z/WP9L/1L/Vf9U/1T/Tv9K/0v/V/9o/2b/Yf9f/1z/Wv9k/3j/cP9q/2n/ZP9n/2r/av9n/2T/Zf94/3j/a/9o/2b/Y/9o/2f/W/9K/yz/J/8u/1D/bv9p/2j/bP9v/2r/Rf9F/0z/UP9T/1T/Uv9R/0//Tf9J/0X/Q/8+/zz/QP9F/z7/O/85/z3/Of8//1T/Vv9b/2D/Z/9t/3b/fv+E/4j/iv+N/5D/kv+V/5f/mP9Y/xr/Jv8m/yT/JP8k/yT/Jf8l/yL/Iv8h/yH/IP8g/x//H/8e/x7/Hv8e/x7/Hf8c/xz/HP8c/xz/HP8c/xz/HP8c/x3/Hf8c/x7/G/8a/yD/Hf80/1r/a/9q/2X/YP9g/2L/Y/9j/2z/dv95/3X/dv91/3j/eP94/3j/df9z/3H/cP9u/27/bP9s/2r/av9q/2v/bP9u/3P/ev+C/3n/XP9P/07/TP9L/0f/Rf9D/0L/Qv9F/0r/Uv9h/27/dP9//4D/ff95/3f/d/9z/3D/YP85/yz/LP8o/yb/J/8o/y//T/9z/4f/gv+A/4T/hP92/0n/N/9C/0b/Sv9M/0z/Tf9M/0r/Sv9J/0P/Rf9J/0r/Sf9J/0n/SP9J/0f/Rf8//y3/JP8j/yP/If8i/yP/Jf8s/0D/WP9t/4D/iP+H/4L/gP9//3r/cv9k/1D/Nf8i/yL/Jv8y/0L/Tf9Q/1b/Wf9c/2H/Zf9p/2v/bf9x/3T/eP96/3z/fP98/3v/e/98/3v/d/90/3T/dP9y/3D/dP94/37/gf+I/4z/i/+I/4L/N/8x/zz/Rf9T/1//Vv9R/03/bv+g/7b/vv+6/7b/t/+j/6v/tP+Z/47/k/+a/53/lv+N/4D/Zv9Y/3D/e/95/3b/cv9t/2f/Y/9j/2L/Y/9j/2P/Y/9j/2P/ZP9l/2j/av9t/2//cf9z/3X/iv+b/5j/k/+O/4z/jP+L/4v/j/+Q/47/g/+C/4L/gv+B/4H/gv+D/4r/hf+B/4L/gv+A/3//ff96/3f/df90/3L/cP9v/2//b/9u/23/bP9s/2z/bP9t/23/cP91/33/h/+O/5H/j/+O/5H/kP+O/43/jP+L/4n/if+J/4r/j/+O/4r/iv+J/4j/h/+G/4n/h/+H/4f/hv+F/4b/iP+J/4f/hf+B/4L/hv+K/4//kf+Q/zV/NXU0fzR1NH80djR/NHY0fzR1M38zdTN/M3U0fzR2NH80dzV/NXc0fzR4NH80eDR/NHg0fzR4NH80eDR/NHg2fzZ3Nn82dzV/NXk1fzZ5N383eTZ/Nnk2fzZ5Nn82ejZ/Nns2fzZ7Nn82ezV/NXs1fjN7NH40fDR+NHw0fjR8NH40fTN+MnwxfTF8MH0wfDB9MHwwfS98L30vfS99LnwvfC97L30vfC98L3svfC97L3wvey98L3svfC97L3wvey98L3svfC97L3wvey58L3svfC98L3wufC98L3wufC98L3wufi58Ln8ufC5/LXwtgC1+LYEtfi2BLX0tgC19L4AxfzN/NYE4fjuDQHtFhEp3T4VUcluFYXFlg2pwaX9lcmF8XXhffGJ7ZH1mfGp/bHtqgG12boFudHCCbm9ugm5rboNuaXGDcmd0gndoeYJ6aXiDd2h2gnRmcoNuZWmCZGlggFxuV4BUc1KAT3ZMf0h3Rn9CdkB+PHg5fjd4M38xeTKAOnheg2l1YYRgcmKDa3BYgTByNIA7dDqBNnUyhC93N4dOcWiIZG5ch1pxV4VTeF2EeIJygWmNZ35ikWR8aJJqfWiUaX5sknJ9fYxtfmaEY31if2p8b4RcekeHJ3koiEB4aIhreGmKanVwjHB1XZE/dEiVTnJTmVRzVZpTclGZUHFOlElzRZNBdj+QPXs8ij5/RYBCgj12OIFAbkGCUmhkhlFkWYhhYmaJa151i31Xgo2GUImNi0uOj5JDloyXQ5GEPVgcfCZ5KHsogSV8JoYlfCSFI30jhSJ9IoUhfiGEIH4ghR9+H4Mefh6DHX4dgh1+HYMdfh2BHX4dgR1+HYEdfh2BHX4dgR5+HoEffh+CIn5FhGx/b4VlgF6FXIBghmR/ZIdmfmqHeH56h3d+dod3fXiHeX17hnp9eYV4fXaFdXxyhnF8cIVxfW2Ea35rhGt/aYRpf2qCbH9ygXuAhIF6f1t9UH9Md0p+RnRFfUN3RH1DeUR7SXlUeWF7bnl0e359enx2gXN8c4F0e3GAcnpafzd9L34wfyx9KIMneyeFMnxRgnV9hHmAgH5zgoGDcXCDPXYzgkF9SIBLfkp+TH1NfUx8Sn5JekF/QnpHfUl5SX1JeEp+SXVIf0l2SIBGej6ALH0igCOBJX4jgiR+JYMnfS+EQ3xbgXF8g3mJfoVxg4GAa32CeWVwhWFmTYYybyCDIXclgDl5S4BQc1SCVm5VhlhrXIdebGOHZW1nhWttbIVzanaDeGV5g3tie4V7Y32EfmZ6hHpjeIR4YnWEdmF5hXxaf4aDU4eIiVCFi4RYf4wzcDOGPItEflSZW3ZMn0VxWJ6UcbSNvXy9gKuElnqog6R6rIG5d7KBkXSGfY9ynneVbo15hWx3fF92bnd4h3dzdpBvcWuQZ3Flj2NwYpBib2KRY21jkWNuY5JjbWWTZ21qk21rb5RxaXOUd26OiJl3mHiSf41xjoKMcIqCi3CPgY9yioGEeYKAg36Df4J/goCCfIV/iYCDeIGLgnCDkIBtf5N7bXiSd2x1k3NtcpRwbW+Ub21vlG9ubZRrbmuUbG1slWxsbpVxaXaUf2mJkY9ukouOdY+EkXuQfI5+jXqMf4t6h4CHeYp/jHuQfox/i3yMf4t8h3mJfol0iYCIcoaAhXOFgIV3iICJe4l+hoGDeIKKhXOJi45zkYaRd4+ANf81/zT/NP80/zT/NP80/zT/NP8z/zP/M/8z/zT/NP80/zT/Nf81/zT/NP80/zT/NP80/zT/NP80/zT/NP80/zb/Nv82/zb/Nf81/zX/Nv83/zf/Nv82/zb/Nv82/zb/Nv82/zb/Nv82/zb/Nf81/zX/M/80/zT/NP80/zT/NP80/zT/M/8y/zL/Mv8x/zD/MP8w/zD/L/8v/y//L/8v/y//L/8v/y//L/8v/y//L/8v/y//L/8v/y//L/8v/y//L/8v/y//L/8v/y//Lv8v/y//L/8v/y7/L/8v/y//L/8v/y7/Lv8u/y7/Lv8t/y3/Lf8t/y3/Lf8t/y3/L/8w/zH/M/81/zf/Ov89/0L/Rv9N/1P/W/9h/2X/av9t/2r/Zv9j/2L/ZP9l/2j/a/9r/2r/bf9u/27/cP9u/27/bv9v/3D/cf9z/3b/eP97/3v/eP93/3T/c/9x/23/Z/9k/2D/XP9Y/1b/U/9Q/03/Sv9H/0T/Qv8+/zr/N/80/zL/Mf8z/07/av9g/13/YP9n/2f/Nf8n/yr/K/8r/yz/Lv85/1L/Zf9f/1f/Vv9Q/03/Vv94/3P/aP9n/2f/Y/9l/2v/Zf9q/2v/bv+C/3T/af9m/2b/bf92/2D/Q/8m/0L/ZP9q/2j/af9s/3D/cf9O/0L/S/9Q/1X/Vv9W/1T/Uv9P/0z/R/9F/0P/P/89/zn/Ov9A/0r/Sv8//zn/Pv9F/1v/WP9Q/1j/YP9i/2r/df97/4H/hP+J/4r/jv+S/5L/lf+G/y3/IP8o/yn/J/8n/yf/Jf8l/yX/Iv8i/yH/If8g/yD/H/8f/x7/Hv8d/x3/Hf8d/x3/Hf8d/x3/Hf8d/x3/Hf8d/x//IP8f/x3/L/9d/27/a/9f/17/YP9j/2X/Z/9q/3H/ev93/3X/dv93/3j/ef97/33/ff99/33/ef93/3b/dP9y/3H/b/9u/23/a/9q/2b/aP9n/2v/c/95/4H/cf9V/0z/Sv9G/0X/Q/9D/0P/RP9K/1T/Yv9s/3L/fP96/3L/cP9w/3H/bv9u/23/Yf9F/zH/L/8v/yv/K/81/1X/d/+F/37/fv+B/4D/af8y/yP/Nf9F/0r/S/9O/03/TP9H/z//Pf9D/0n/S/9K/0r/Sv9J/0j/Sf9I/0b/PP8q/yL/I/8j/yL/Jf8l/yb/MP9H/1//d/+I/4n/hf+D/4D/ff93/2//YP9I/y3/I/8l/yz/Qv9Q/1T/V/9X/1f/Wf9a/1r/Xf9c/2D/ZP9m/2v/cf90/3b/eP95/3n/e/99/33/ff99/3z/eP96/33/fv+A/4P/hf+F/4H/gv95/zf/N/87/0H/Tf9S/0r/RP9v/6b/t/++/7b/iP98/6D/tP+6/7j/tv+R/37/iv+X/5b/kv+Y/5D/gv91/3b/df90/2//a/9n/2X/Y/9i/2H/Yf9i/2L/Yv9i/2P/Zf9n/2r/bf9v/3P/dP98/5P/mf+X/5D/jf+M/4z/i/+M/4//j/+J/4P/gv+D/4P/gv+A/4D/hf+J/4X/gv+C/4L/gf+A/33/ev92/3T/cv9y/3H/cP9u/27/a/9r/2v/a/9s/2z/bP9u/3D/d/+B/4r/j/+Q/43/jv+O/4//jv+N/4z/i/+G/4b/iv+P/5D/jP+L/4z/i/+J/4r/if+H/4b/hv+F/4X/hf+I/4f/h/+D/4H/gv+J/43/kP+S/5D/j/80fzR1NX81dTR/M3U1fzV1NX81dTR/NHU0fzR1NH80djR/NHczfzN3M38zdzV/M3g0fzR4NH80eDV/NXc1fzV3Nn82eDV/NXg1fzV4NX82eDV/Nng2fzZ4NX81eTZ/Nnk2fzZ6N383ejd/N3k2fzZ5NH80ejR/NHs0fjR7M34zejR9NHszfTR7M34zezF+MXsxfTF7MX0xezB9MHwvey96L3wvey98L3svfC96MHwwfDB8MHwvfC98LnwvezB8MHsvfC97L3wvezB8MHwufC98L3wvezB8MH0wfDB+L3wufi59LX0ufS5+Ln0ufi19LX8tfi1/Ln4ufy5+Ln4vfjF+M340fzZ/N385gDx8QYJFeUyFUnRahmBuZoVrbm6Bbm9qfWd2Znxne2l+aXppgGp3aYNrcWyEbmlwhG9kb4RvYHKGc193hnhee4V8XHmFeF14hXdgdoNzY26DaWhngWVuX4FcdFqBWHVTgVF4T4FLeEl/RnhCfz94On84eTZ/Mnsyfy94P4Jjd2OEXnNhg2Zwan9HdCZ9KHkqfSl8K4EvfDuHVHNliFtvV4VSc02ETnhUhHSAd4FmjGd+aJNpfGmUaXxmlGh8bJJwfYGOfn1thWt8aoBoenWCendwiGd2aYpoeGiKbHZwim50cI1odUOPR3VNlFFzVZlXc1WaUnNSmU5ySZdGc0WUQXY+kD14O4w4fDWFOYBGf0mCP3U6gzluQoRJalCGUGZWh15hZoltW3WLflOBjIRMh46KR4yPj0CSi5NEd4ElYiJ8KHsoeyiEJnwlhSV9JIQhfSCEIX0fhB9+H4Mefh6DHn4egx1+HYMefh2CHH4dgh1+HYMcfh6DHX0dgh19H4MifyKCQn5qhG5/YoRef2CGY39lhmZ/aoZwfXeGe313hnR9doV4fXeGe3x8hn59fYZ+fH6GfXt6h3h6dYZ2eHeHdHpyh3F7b4VqfGeFZn9lhGZ/ZoRtf3ODen98g2l/UHxKf0d2Rn1DdUV7Q3hHekx5VXpienJ8eHp5f3V+cIBtfG6AcHtvfm99cHtvf218YX9HfDJ/LXssgTd8Vn55foJ3f4F+cICDfnBkhjB2I4MkgCqAO4JGf0iCSoBIgT+ANYAzfzx/Q35JfEt/THpLgEt3Sn9Id0h/RXk4gSV+IoAigSJ/IoMkfiSDJn0zg017ZH97fYl1in+Fb4SCgmt9g3ZlbYVdaEOEKXQigSp8OoFMelWCV3RahF1uXIhcaVuJWmhZiFRqVYdaamSFaG1shHFndIZ0ZHWGd2V4hn5mgYWAZH+FfmF9hH1ifoSAX4KFglmCh35YfoiCX3KKR3Q5h0CKQ31Lmkl1Q6BNb4mfqXO2i719toF7g1mBg4CRgal+snmqf411jn6DcYt2lmyTdqFmo3ycY4iBdXJxenKJb3Nrj2ZyYpJicGGRYXBhkWJwYpFjbmOSZG1mk2hra5Rva3GUcWpyk35wloiZeZR4j4CNb4mBinCLgI1wkoGQcomCg3mBgIF9gn+AfYGAgn2DfomDg3eBjIJwgpGAbX6Uem13lHRsc5RxbG+Ub2tvlG9tbpRtbWyUa21rlGxrbJVqam2VcGh4k4Npi4+Pbo6KjnaOg418jHuMfox5jH+Keod/hniJf497j3+OfY19jXqKgIl0iICIcoeAh3OGgIZ2hoCGeIeAhYCDeoCEg3GGjI1ykYmTdZKBkXyPfzX/Nf81/zX/NP8z/zT/Nf81/zX/NP80/zT/NP80/zT/NP80/zP/M/8z/zP/NP80/zT/NP80/zT/Nf81/zT/NP80/zT/Nf81/zX/Nf81/zb/Nv81/zX/Nf81/zX/Nv82/zb/Nv83/zf/N/83/zb/Nv80/zT/NP80/zT/NP80/zT/NP80/zL/Mv8y/zL/Mf8x/zH/Mf8x/zH/MP8w/y//L/8v/y//L/8v/y//L/8w/zD/MP8w/y//L/8u/y//MP8w/y//L/8v/y//MP8w/y7/L/8v/y//MP8w/zD/MP8v/y7/Lv8t/y7/Lv8u/y7/Lf8t/y3/Lf8u/y7/L/8v/zD/Mf8z/zX/N/84/zn/PP9B/0X/S/9R/1j/Xv9k/2r/cP9w/23/av9n/2b/aP9o/2n/av9s/2v/bv9v/3H/cP9x/3P/d/95/3z/ff9//37/e/95/3r/ef93/3L/bf9q/2b/Y/9f/1z/W/9Y/1T/Uv9Q/03/Sf9G/0L/P/87/zn/Nv8y/zP/MP80/1v/Z/9g/1//Yv9o/1f/KP8l/yn/Kf8s/zD/PP9W/2b/Wv9V/1H/T/9Q/1X/cv94/2j/Zf9l/2X/Yv9l/2v/aP9p/23/ev+D/3P/a/9q/2n/b/98/4H/ev94/2//bP9v/3D/cP9x/1z/Qf9I/07/UP9T/1X/VP9S/0//TP9H/0P/QP8+/zz/Ov85/zX/M/8y/zj/Q/9H/z7/Mf81/z3/Q/9G/1H/W/9e/2X/bv91/3v/f/+C/4b/iP+K/4z/kf+U/2v/HP8l/yb/Jv8i/yL/I/8i/yD/H/8f/x7/H/8f/x7/Hv8e/x7/Hf8d/x3/Hf8d/x//H/8e/x//If8e/yD/H/8d/yP/Tv9u/2z/YP9f/2X/ZP9k/2n/cv93/3r/fP93/3T/c/91/3j/ev97/3v/fP99/33/fP98/3j/dP91/3j/dv90/3T/dP9y/3D/a/9p/2f/Zf9m/2j/bf9z/3r/eP9g/0v/SP9E/0P/RP9E/0j/Tf9Y/2b/cv94/3f/cv9x/27/bf9v/27/bv9x/3L/b/9t/2v/YP9U/0L/P/9c/3r/gf98/37/gP95/1v/KP8i/yL/I/8h/yr/OP9B/0H/N/8v/zn/QP9C/0b/R/9J/0v/TP9K/0n/SP9E/zb/Jf8i/yL/Iv8i/yT/JP8o/zr/Uf9p/3v/iP+K/4X/hP+C/3//eP9t/1r/P/8m/yX/Mf9E/1L/Vv9Z/1v/Xv9f/1//Wv9Z/1f/VP9T/1n/Xf9l/2v/bf9v/2//bf9w/3P/eP98/33/f/9//33/f/+B/4H/gv+C/4H/fP+C/4P/bf9W/0P/Rv9F/0n/Rf9A/2H/k/+o/7L/t/+4/6r/jv98/4b/lv+V/5v/lf+a/5T/kv+S/43/k/+b/6b/lf+D/3L/b/9u/2j/Zv9k/2L/Yv9i/2L/Yf9h/2P/ZP9k/2b/Z/9s/27/cf9y/3P/hP+Z/5n/lP+Q/4z/if+K/4r/jP+R/47/if+D/4L/gv+B/3//f/+A/4T/h/+C/4L/gv+C/4D/fv96/3f/df9z/3H/b/9v/2//bv9t/2z/a/9r/2v/bP9t/2v/bv9y/3n/hP+M/5D/j/+N/47/jP+M/4z/i/+M/4n/h/+H/4r/kP+O/47/jf+M/4r/if+I/4j/hv+G/4b/hv+G/4b/hP+D/4H/gf+F/4v/kP+W/5X/kv+P/47/Nn81dDV/NXQ0fzN1NH81dTV/NXU1fzV1NX81dTR/NHY0fzR3M38zdzR/NHczfzN4M38zeDR/NHg1fzV3NH80dzV/NXc1fzV3Nn82eDZ/Nng2fzZ4NX81eDR/NHk1fzV5Nn82ejd/NXo2fzZ5Nn82eTV/NHk1fzV6NH40ejR+NHkzfTN7M30zezJ+MXsxfjF7MX0xezF9MXswfTB8MHswei98L3svfC97L3wvejB8MHwwfDB8L3wvfDB8MHswfDB7Lnwuey98L3swfDB8L3wvfC98L3svfC99MHwwfi98Ln4ufS19Ln0ufi59Ln4tfS1/LX4tfy5+Ln8wfjCAMH4xgDN+NX82fzh/OYA8fkGCRXxJhVF2VYZbcWKHaW5wg3Rvcn9ucmp+Z3hnf2Z3aIJpc2uEbGpvhXFldoR5YXmEfGN9hX9lgYWCYoGEgV9/hH5ee4R6X3eCcWVtgmpsZoBicl+AXHZbgFh4VYBSeE+ATHhKf0d4Q38/eDx/OXk3fzN7Mn8xeTOCTHdpg150XYFhcWN+YXMweiR5KH0pfCuBMHs+h1hyZIhXblOFUXJShFR2WIRpgHJ/Zo1hfWKSY3thlGF9aZRsfXKVcH1xk4B9dYxqfGaFZnpohHF6e4d6eXmJdXZvjG50cIxyc26QTnVEkkp2TpZPdVKXUnRSmU90S5hKdEWWQXU+kjx2OpE3eDWOM3ozijF8L4cyf0CAQ4A6fDOCN3g8gz9xRIhUaFyJYV9ji25ZdYt8UX+NhEeFjohAho6LPJOJkkdYgRtoH34ieiR9IYMffSGEIH4ggh99H4Iefh+DH34egx5+HoMdfh2DHX4dgx1+H4MifiOEJH0mhSN9IIUefS2EWX9vg2uAZYNkgGiFaH9phm5+coZ1fXOHdnx3h3V8c4d0e3WHdnx5h3p7eYd6e3uIeXtyimp7aYlpfGiJcXt1iXF5cIlyenaId3pyhm99bIRofmaEaX9sgXB/c4J3f3KCU39JfEZ9RnlCe0V5SXpQe116a3tyfHd7dn9vfm6AbXxugHB7bX5wfXJ7cYBvfGqAZXxpfW98b3prfm94f3+AcnyBfnB9hHdxU4YkeCGEI4EkgSODIoAlgyOAK4QqfyiEL346gz9+RYBHf0l+SYBKekWBRnhGgT96MYElfiOAJIEifyKDJH4lgy1+P4NWfW1+gH6KdImAhG+DgoBpf4N5Y2yFWGg6hCZ0KoE7fEqBVXpbglp1WoRdbF+IX2hdiVpnV4hVaVOHVm1bhWBrZYRpaGuGbGhqhmtpb4Z3aHqFfGZ8hXxkfYWAYoGFgl+ChoJff4Z+X4OIgmRtilZzT4dMh0eASZVCdkGcbHGamqVxq5CreaiKmn2QhZp8nYGheqB5oX6YcJB/k2iZfJpkmHyOYpB8mF6Yfohif3xzdWt5aYhkc2KQYnBikWFwYpFicGKRY25jkmVtZ5Nna2qUbmtxlHNrc5CKcZyFmXqWd5CBjXGKgYpyioCNc5GBjXWIgoN7hICDf4F/f31/gX99gnuFhIF1go6Bb4GRgG19lHptd5RzbHGUb2xulG5rbZRsbWyUa21rlGptapRqbWuVa2xulXNne5OGaYyPj3CNio54joCMfYt7in6Ke4uAh3qHgIZ4in+PeI5+jniNfox2i4CJcYiAh3OGgIV1hYGFeYV/hX+DfYKGgXaFi4pxj4mVdJWGlHmRgY99jX82/zX/Nf81/zX/Nf82/zb/Nf81/zX/Nf81/zX/NP80/zT/NP81/zX/NP80/zP/M/8z/zP/NP80/zX/Nf81/zT/Nf81/zX/Nf82/zb/Nv82/zb/Nv81/zX/Nf81/zX/Nf82/zb/Nv83/zb/Nv82/zb/Nv81/zX/Nf80/zT/NP80/zP/M/8z/zP/M/8z/zH/Mf8x/zH/Mf8x/zD/MP8w/zD/MP8v/y//L/8v/y//MP8w/zD/MP8v/y//MP8w/zD/MP8v/y//L/8v/zD/MP8v/y//L/8v/y//L/8w/zD/L/8u/y7/Lf8u/y7/Lv8u/y3/Lf8t/y3/Lv8u/zD/MP8w/zH/M/81/zb/OP86/z3/P/9D/0j/Tv9U/1r/YP9n/27/cv91/3P/bv9q/2n/Z/9o/2j/af9u/3H/dv98/4H/g/+D/4X/hf+H/4f/h/+D/4H/fv97/3r/d/9x/27/a/9m/2L/X/9c/1v/WP9V/1L/T/9M/0r/R/9D/z//PP85/zf/M/8y/zD/MP9A/2P/YP9Y/13/Yv9l/0D/Jf8o/yj/Kv8v/0H/W/9i/1b/Uv9R/1T/Vv9W/2T/c/9n/2D/Y/9j/2P/aP9t/23/b/9r/2f/cf9z/2j/Xv9f/2P/af9t/3L/eP97/3j/dP90/23/Xf9H/0n/S/9N/07/T/9P/0//S/9L/0r/Rf9B/z7/O/85/zb/Nf8z/zP/Mv8x/y//Mv88/z3/NP8z/zf/Qf9H/1L/Wf9Z/2H/Zf9t/3X/ef9//4L/hv+F/4j/jf+R/5D/Tf8Y/x7/H/8f/x//H/8g/x//Hv8e/x7/H/8f/yD/H/8f/x7/Hf8e/xz/Hv8i/yX/KP8r/y3/Jf8g/zf/Yf9t/2j/ZP9n/2n/bf9t/3L/eP91/27/cP9y/3L/cf9w/2//c/92/3b/d/95/3r/cP9o/2P/Zf9o/23/bv9v/3D/bv9t/2v/a/9y/3j/d/9v/2n/aP9q/2z/bf9y/3T/c/9k/03/SP9E/0P/R/9L/1X/Y/9v/3T/dv90/27/bf9t/2//bv9r/27/dP9y/3D/bP9q/2j/af9t/3L/e/+D/4D/e/9+/3z/c/9L/yT/If8k/yT/Iv8k/yT/JP8n/yr/K/8p/y7/Ov9B/0X/SP9J/0v/Tf9M/0X/PP8w/yb/JP8k/yP/I/8m/yf/MP9E/1n/cf+F/4v/iP+E/4L/gf9//3f/aP9U/zT/Jf8w/0L/TP9S/1n/Wv9b/17/YP9g/1//XP9X/1X/U/9U/1n/Xv9h/2b/aP9p/2v/bv9w/3X/cf91/3r/fP99/4D/gf+C/4L/gv9//4D/hP+A/27/W/9a/1r/VP9R/0j/RP9x/5z/pv+l/6P/nv+V/5f/mP+K/4v/mf+X/5b/k/+W/5r/nf+Y/5X/mv+c/5P/kP+J/4L/av9l/2T/Yf9i/2L/Yf9i/2L/Yv9j/2P/Zf9n/2j/a/9w/3D/c/92/4v/mv+Y/5X/kP+N/4r/iv+K/43/kP+M/4b/hP+D/4P/gP9//3//fv+A/4P/gf+C/4H/gf9//33/ev92/3P/cf9u/27/bf9s/2z/bP9r/2v/av9q/2v/av9s/27/dP9+/4j/jP+O/47/jf+N/4r/iv+J/4v/i/+I/4b/h/+M/5H/jf+N/43/jP+K/4j/h/+G/4b/hf+E/4T/hf+F/4L/gv+C/4j/j/+T/5X/lP+U/5H/j/+N/zV+NXQ2fjZ0NX81dTZ/NnU2fzR1NX81dTV/NXU0fzR2NH80eDV/NXg0fzR5M38zeTN/M3kzfzR5NX81dzR/NHc1fzV4NX81eDV/NXg1fzV4Nn82eTZ/Nnk2fzZ5Nn82eTZ/Nno2fzZ6Nn82ejZ/Nno2fzZ6NX81ejV+NHs0fjR8M34zezN+M3szfjN7Mn4yezF9MXswfTB7MXwxezF8MXsvfC97L3wvey98MHsvfC97MHwwey98L3swfDB7MHwwey98L3wvfC98L30vfC99L3wvfS98L30vfC99L34vfS5+Ln0tfS59Ln4ufS5/LX0tgC1+LX8ufi5/L34vfzF+Mn8zfjV/N345fzp/PX8/gUN+R4RMelOFWHRfhmZxbIRxcHeBdXByf290a4FpdWeEaG9phG9mdIZ7ZIGFhmiHg4dth4WIcImFiG2HhIVmgYR9ZHqDd2Zygm9ubIFoc2SBYnZeflt5W39ZeVWAU3hPgEx4SoBHeUOAP3k7fzh6Nn8yejGALnkvgTR4U4NkdFqDV3NbgGN0U3wmeCV9KHwrgTJ6Q4ddcmGKWG9SiFFxVodZdViGYHtygmmHY35qjWp+bpFsf2uUbX9rlGx+bJZjfWeRaXtljWB7XYdjemmGbnpxiHV4eot6dW6OXnZPkE12TpJNd02UTndOlU12TJdLeEqVSXVFk0J2P5E9eTmPNnk1izJ7Mokvey6ILn0uhS9/NoJBgD99N4E+dEeFTmpXiWFhVYpdWmSLbFd0jXtNf42CRYKOhj+LjZFDlYiPUkGBGXAbfh58Hn0fgR5+HoMdfh6CIH4ggSF/IYMhfiGDIH4ggx9+HoIffiGDJX4ohS99NIYtfkGGZX9thmiAZYRogGqDa39uhHZ8d4dwe2mJa3puiXJ6cIpve26Ib3pxiHR7dIh1e3aJa31jjGF+YY5hf2eMan5ti25+cYpufWyIaXxmh2p7dYd7fHOGbH1shWp/aoJsgG6CcH9xgm1/V35GfkN7Q3tIfE54WHxlenB8dH14fHGBbn9vgXB+cYBufGp8bX5yenKAb3tsgGp8anxofWt5dH59dYKAf3J8gX1wfYRycUOGI3okgySBIoEjhCN/IoQlfyWDJ38sgy5+KoIqfjSCPX9CgUeASH5Hgkh8RYI8fi+CJYAkgCSBJH8kgyZ+KYUyfUeEXnx1fIZ+i3OJgIVtgYKBZ4CEdGNnhVNqMYQmdTaBRH1LgU98VoJbd1yEX3Beh11sX4hcaFmIVmtUh1RsWIZca2CFY21hhmNuZYdpbmuHcGtwh21ndYZ3ZXyGgGOBhYFhgoWCYIKFg2KDhn9kcIlkcGeGY35ahFaNUX1PlnV0nZWmdaWPo3mdiZl8loWTgY6Cj4CNeI6Akm6UgZlklYKUXpuDnV2hgaBckYCRW45/kGR8fmZ6YnZjjmFwYJJhcGKRYXBhkWNuY5JlbWeTaWxslHFqcZR1a3mNj3KZf5Z9knWNgY1yioGJc4qAjXKQgYp0hoGFfIN/gX9+gH9+f39/foF8g4Z/coKQg2yCkn9te5R4bXWUcWxulG1sbZRsbGyUa2xqlGtta5NqbWiVa2xrlm1qb5V3aICTiWuNj410ioWNeYt9iX6Ie4l/i32If4V9hX+HeI5/knWMf4x1jX+Lc4mAiHOGgYV1hYGFeIR/hHyFfYOCgnaDiodyjYmUdJaHlXiUhZN8kIKQfY2AOf85/zn/Of84/zj/Nv82/zf/Nv81/zX/Nf81/zP/M/80/zT/Nf81/zT/NP8z/zP/M/8z/zP/M/80/zT/NP80/zX/Nf81/zX/Nf81/zX/Nf82/zb/Nv82/zb/Nv82/zb/Nv82/zb/Nv82/zb/N/82/zb/Nv82/zb/NP80/zT/NP8z/zP/M/8z/zP/M/8y/zL/Mf8x/zL/Mv8x/zH/Mf8x/zD/MP8v/y//L/8w/y//L/8v/y//L/8v/zD/MP8w/zD/MP8w/y//L/8v/y//L/8v/y//L/8v/y//L/8v/y//Lv8u/y3/Lv8u/y7/Lv8t/y3/Lf8t/y7/Lv8v/y//MP8x/zP/Nf83/zn/Ov89/z//Q/9H/0z/UP9X/1z/Y/9p/2//cv91/3T/cP9t/2n/Zv9o/2z/dP94/3z/gf+E/4X/hf+F/4b/iP+G/4T/gf9//3v/dv9z/3D/bv9s/2j/ZP9i/17/W/9a/1f/VP9R/07/S/9J/0j/Q/8//zv/OP82/zL/Mv8w/y//Mf9D/2L/W/9Y/1r/YP9d/zL/Jf8r/y7/MP9A/1r/Xf9W/1P/Vf9X/1j/Wf9g/3P/bf9k/2j/cP9x/3H/bv9u/3H/bf9u/2v/X/9d/2L/af9k/2b/Z/9r/2z/bv9n/2H/Vf9R/1P/U/9U/1H/Uf9P/0//Tf9L/0n/SP9H/0X/Qv8//z7/O/83/zb/Mv8x/zD/MP8v/y//LP8t/zf/Rv9F/z//Q/9I/07/af9k/1X/X/9n/2z/cf94/33/fv+D/4b/i/+R/5X/if84/xj/HP8d/x7/IP8g/x//IP8i/yL/Iv8i/yL/Iv8i/yL/H/8g/yH/I/8i/yf/L/84/0j/Wv9o/2j/aP9r/23/bf9x/3f/dv9s/2n/Z/9p/2z/bP9t/23/b/9w/3H/cf90/3L/Xf9b/1v/W/9f/2D/Zf9r/2//cP9u/2//cf9t/2r/ZP9p/3T/d/9x/2//a/9r/23/bP9u/27/cv9l/0n/RP9C/0n/Uf9b/2j/cf93/3X/bv9u/3D/cP9w/23/Zv9p/3L/cv9w/27/a/9s/2r/af9x/3v/hP+A/3r/fP97/2v/O/8k/yb/Jf8k/yX/Jf8l/yP/Jf8n/yz/Mf8y/yv/JP8o/zb/Qf9E/0f/Rv9C/zf/K/8j/yT/Jf8k/yT/Jv8q/zb/Tf9j/3r/if+H/4T/g/+B/4H/fP9y/2X/TP8u/yb/N/9F/0v/T/9T/1n/Wf9c/17/Xf9d/1v/V/9V/1X/Vf9Y/1z/Xv9h/2L/ZP9k/2P/Y/9p/2v/av9v/3L/eP98/4D/gf+B/4H/gf+C/4P/fP9y/27/a/9n/2X/YP9c/1z/fP+e/6T/ov+c/5n/k/+P/4n/iv+H/3r/f/+S/5P/l/+Y/5X/lf+Z/53/ov+f/57/k/+G/33/a/9j/2L/Yv9i/2H/Yv9h/2H/Y/9j/2X/Z/9p/2z/cf9y/3T/e/+S/5r/lv+S/43/jf+K/4n/iv+N/5H/i/+F/4T/gv+B/3//fv9//4L/iP+G/4D/gP+C/4H/f/97/3j/df9w/27/bf9s/2z/bP9q/2r/a/9r/2r/a/9q/2r/bf9x/3j/gv+L/4//jP+L/4z/i/+J/4f/iP+H/4f/hf+G/4b/kP+S/43/i/+K/4v/if+I/4b/hf+E/4T/hf+F/4P/gv+B/4X/i/+R/5b/lf+U/5T/kv+Q/4//jP85fzh2OX85djl/OXY4fzd2N383dTZ/NnU1fzV1NX80djR/NHc0fzR3NH80eDN/M3gzfzN3M38zdzR/NHc0fzR3NH80eDR/NHg2fzZ4Nn82eDV/NXk2fzZ5Nn82eTZ/Nnk2fzZ6Nn82ejZ/Nno2fzZ6Nn81ezZ/Nns0fjR7NH40fDR+M3szfjN7Mn4yezJ+MnsxfTF7MX0xezF8MXsxfDF7MXwxey98L3svfC97L3wvey18LXsvfC97MHwwezB8MHsxfDF9MHwwfTB9MHwvfS98MH0wfC99L3wvfS99L30ufS59LX8ufS6ALn0ufy19LYAtfi1/Ln4ufy5+L38wfjF/M341fzd+OX87fj6AQH9CgUaCSn1PhFR1WYVfcWWFaW1whHRsd4Jzb3CBbHFnhGdubYV3aHqEfWmAgoNtg4GDdYOBhXqEgYJ5goJ+cnqCdmt1gXNpcIBsbml/ZnVjfmF3Xn5beVl/VnlSgE94TYBKeEiARnlDgD55OoA4eTaAM3kzgDB7L4EveTWCWXZgg1d0WIJcdGF+Q3cmfCl6LIAweUGHXHNdildwVohWcVmHWXJZh193c4VxgWmBaohrgG2McX9sj2p/apJsfW6Wanxql2R7WJNZe1mNUnw9ijp8PoxCfEaNUnlTkFd4WZFZdlmTVnVTk091T5RLdkqVR3hGlER6QpJAez+QPHs7jTl7N4o0fDCIL3wuhy19LYctfy2GL4E4gUaBS3lGhEZwQ4dTZ3KJY15ZimBZaYxpVnONek99jn9Jg42HRIyNkEaUh4tUMoAYchx9IYAgfiGDIX4igyN+I4EjfyODIn8kgyR/JYMkfySDIn8igyh+JYU1fkiGTX9SiFp/ZIhqgG+Hb390hXh9d4dpe2OJZXpkimR5Z4lneWeLa3puiXB6bolve2qLUnxRjVh+V49bf1yOX4BjjGZ/aIpsgHCJc4B1h3R/boZqfmSFa315hXl+c4Vwf2yCbIBtgmyAb4NygHB/VX5EfEN7SnxReF18bXp1fHh9cnxugW9+cIFwfW6AaXxifGh+cXlzgnB5bYFte21/bXxsfHV+fXWEgIBxfIF7cHmFaHM3hiV+J4InhCV/JYYnfiiGJn8nhSp+LoQvfjSCMX8qgiR/JYItfzqCRH9DgkCAM4IqgCSBJH4kgiR+J4QnfSyGOXxQg2d9fHqHf4ZyhIGDbIGCf2N5hG5kX4VBbCmEKHg8gUV9SoFOfFKBVnhZg1t0XYZdcFyHXGxbiFtrWodaa1uIXW5fhmBvYYRgb2CGX29ih2VtZYZka2iGbGtwhnhoe4Z9ZX+Gf2SAhoBkgYd8ZneHc2xzh3Bxa4VnfWaCZYh/fJmMnnydiZZ+joWIf4WChYJ+gXOBVn1vgIt1jYCVapiCmWKUhJRfl4OdYJ2Dml6YgolceYB5aWR+YYFjdWOPYXBikWFwYZFibmOSZW1nk2psbZRwanKUdWt9j5RymYGWfZNzjYGKcImBim+KgI5uk4GKdISBg3yCf4F/f4B+foB/gn6IfIWGgnSCj4FugJF/bXuUd210lHBsbpRtbGuUa2xrlGtsapRrbWuTaG1plWpsa5NtaXOVemiEko1skI6MdIyFi3qJfod+hnyGf4V+hH+CfoV/iXiQf5BzjH+McYp/inGJgIhyhoGFdIWBhniFf4WAhHqEiIV1ioqQdJSKlXaUh5N6koWSe5CBjn2Mfzv/Ov86/zr/Ov86/zr/OP83/zf/Nv82/zX/Nf81/zT/NP80/zT/NP80/zT/M/8z/zP/M/8z/zP/NP80/zT/NP80/zT/NP80/zX/Nf81/zX/Nf81/zb/Nv82/zb/Nv82/zb/Nv82/zb/Nv82/zb/Nv82/zX/Nf81/zT/NP80/zT/NP80/zP/M/8y/zH/Mv8y/zH/Mf8x/zH/Mf8x/zD/MP8x/zH/L/8v/y//L/8v/y//Lf8t/y//L/8w/zD/MP8w/y7/Lv8v/y//L/8v/y//L/8w/zD/L/8v/y//L/8v/y7/Lv8t/y7/Lv8u/y7/Lf8t/y3/Lf8u/y7/Lv8v/zD/Mf8z/zX/N/85/zv/Pv9A/0L/RP9I/0z/Uv9W/1z/Yf9n/23/cv92/3b/c/9w/2z/av9u/3X/ef97/37/gP+A/4D/f/+A/3//f/98/3r/ef91/3L/b/9s/2r/Z/9l/2L/YP9e/1v/Wv9X/1L/T/9N/0r/SP9G/0P/Pv86/zj/Nv8z/zP/MP8u/y7/Mf9J/2L/XP9Z/1v/YP9U/yj/KP8r/zD/Qv9b/13/V/9V/1X/V/9X/1j/XP9v/3b/bP9u/3H/df95/3H/b/9x/3L/a/9p/2v/Zf9d/1z/Wv9M/z3/Pf9A/0j/Tv9U/1j/Wf9b/1v/Wf9W/1P/Uf9P/03/Sf9E/0P/Qv9B/z7/Pv89/zz/Ov84/zX/Mv8w/y7/Lv8u/y//L/8x/zX/Of9D/0z/Sf9C/zL/Rv9e/2f/Xf9e/2T/av9z/3n/f/+C/4T/hv+M/5D/lf+K/zL/F/8h/yD/Iv8k/yP/JP8k/yT/JP8k/yT/JP8l/yX/Jf8k/yX/Nf9T/2z/Yv9O/0r/V/9i/2z/cf94/3v/b/9i/2H/Yf9j/2H/Yf9j/2P/Yv9n/2v/bP9u/2H/Qf9F/0z/Uv9Y/1n/Xf9i/2P/ZP9n/23/cf91/3X/d/9z/23/af9p/3T/fv95/3H/bv9r/23/bf9t/3D/cv9j/0j/Rf9K/1X/Yf9y/3b/eP9y/2//cP9w/3D/bv9i/1//Z/9x/3X/cP9t/2v/av9o/2z/cv98/4P/fv99/33/ev9l/zH/Jv8m/yf/Jf8l/yb/KP8o/yn/Kf8m/yX/Kf8y/zT/LP8m/yX/Jf8u/zv/Pv8x/yb/JP8l/yX/KP8n/yj/Lf8//1b/b/+B/4j/hv+E/4P/gP+A/3n/bv9a/zj/KP8w/z//R/9K/07/Uf9U/1n/XP9d/1v/Xf9d/1v/W/9b/1v/Xf9e/17/X/9g/1//Xv9d/17/Yv9j/2L/Y/9n/2r/b/92/3n/ff99/33/gP+A/3v/df90/3T/cv9z/3H/b/9w/4T/lP+a/5b/kP+S/5r/mv+U/3//dv97/4P/if+L/4//lv+Z/5v/mv+Y/5b/lv+X/5j/lf+D/3z/b/9g/2H/Yv9h/2L/Yf9h/2L/Y/9l/2f/av9t/3H/c/90/4H/mP+Z/5X/kv+N/4r/iv+L/43/kf+T/4r/hP+D/4L/gf+A/3//f/+D/4j/hf+B/4H/gf+A/33/ev91/3P/cP9t/23/a/9r/2v/a/9q/2v/a/9p/2r/af9s/27/c/98/4f/jf+N/4v/jP+K/4j/hv+F/4X/hf+E/4T/h/+L/5H/kP+M/4z/if+J/4j/h/+H/4X/hv+G/4X/hf+E/4T/iP+P/5T/lf+U/5T/lP+T/5P/kP+O/4z/PH87czp/OnQ6gDp1OoA6dTl+OHQ4fjh1N343dTZ+NnY0fzR1NH80dTR/NHYzfzN3M380dzR/NHczfzN4M38zeDR/NHk1fzV5Nn82eTV/NXk1fzV4NX81eDV/NXk2fzZ5Nn82eTV/NXk2fjZ6Nn42ejV+NXs0fjR7NH40ezR+NHszfjN6M34zejJ9MnsyfTJ7MX0xezF9MXswfDB8MH0wfDB7MHsvey97L3wvey58LnsufC57L3wvey98L3svfC97MHwwfC98L3wwfS98L30vfC99L3wvfS58Ln0ufS59Ln0tfS18Ln0ufy5+Ln8tfi1/LX4tgC1+LYAtfi5/MH4xfzJ+NH83fjl/On09fz9/QYFFgEeAS4JOflKGV3RdhWJtaoVwaXWGd2t2g3RsbYRsaW+Ddmd4gntne4B+cn5/fHp6f3x8e397eXqAeHd2gHF0b4BscmuAaXVlfmN6Yn5felx+WXlXgFR4UoBPeU2ASnlFgEV5QYA9eTmAN3o3gDN6Mn8xei1/LnovgDl5XYJheFmDWXVffmF1Nn0meCuAMHhDh1t1XopZcVmJWXFaiFtyW4Zfd2uEd4Bxg26FbYFwh3mAe414f3SRd3xvl2h7ZZdmel6TV3pUkEd8PI0+fUKNSH1NjlJ6Vo9aeFyRW3Vakld0VZNTdFCUTHVIk0R5QZFAej6QPHw8jjt8Oow4fjeJNn00hzN+MYYxgC+FMIAxhDWAO4M/gDuAO4JKek2FRnJBh0JlXYhnWl+KYFhkimtZcox5Un+NgE6DjIZJjIyRTJeHiFwvgR13In4mgiN+JIQkfiWCJn8jgiOAIYIkfiSDJX4jhCp+RoJof3WEcYBkhUx/QYhKf2CLdH98inl+Z4lffGKJXntfiWF5Y4ljeWOLYXhhi2V5aYtre1SNP31DkEp9SJBPf1SQV4BakGGAYY5gf2SMaYFuinSDeYZ6gneGdIJxhWyBb4R5f3uGcn5tg22AbYNtgGuDbYBtgWmAUH1Jekx8V3dmfHZ7eHx1fXF8cX9yfXF/cHxtflx9Xnpmf3B3dINxeW2Da3lrgGl7a3tzf310g4F/cXuCfXN4hGFzLIQnfSiBJ4UofyiGJ34ohyp9KYgnfSaGJ38ohS1/MIMwfyeDKH8ogyl+KoUvgC+FKn8phid+JocofCWGJnwwhkZ9XIJzfoN3iH+IcIOBgWyAgoBneYRqaFWDMXIngjV7RYFLfkqBTHxQgFJ4VIFYeFqEXHVchlxwXIdbb1yIXW1diFxsXYZgbWCDX3Bgg11uXoZebVuGWW9chmBwZYZsbm+FdGp3h3loeod9aX6HeGxyiHNtdIh1bXeFdXN0gnZ8hYCMg5F9k4SgfKyErH2igJWCgX56gXt4g4CHcoyAj2iSgpVfmoWeYKGGnWKVhJRimIGZYZKBgmF4gGRzYnpgjGByYZJhb2KRYW9jk2VuaJRra26Ucmt0k3RthYuXc5d8k36QcoyAjG+KgoxxjoGRcZKBiXaDgYN+g3+CgICAgH+BgIR9iH2FhYB1gI+Ab3+Te2x3lXZsdZVxbG6VbWxslWtrapVqbWqVa21rk2tta5VqbWuVb2p3lX9qiJKNbY2Li3eLg4p9iH2Ff4R7g4CDfoN+hX2IfYx4j36OcYx/jG+KgIpziYGIc4aBhXWGf4Z8hX6FgoN3hYmNdJKKlXWViJR4lIeUeZKGknuSgY5+jH49/zz/O/87/zv/O/86/zr/Of84/zj/OP83/zf/Nv82/zX/NP80/zT/NP80/zP/M/8z/zT/NP80/zP/M/8z/zP/NP80/zX/Nf82/zb/Nf81/zX/Nf81/zX/Nf81/zb/Nv82/zb/Nf81/zb/Nv82/zb/Nf81/zT/NP80/zT/M/8z/zP/M/8z/zP/Mv8y/zL/Mv8x/zH/Mf8x/zD/MP8w/zD/MP8w/y//L/8v/y//Lv8u/y7/Lv8v/y//L/8v/y//L/8w/zD/L/8v/y//L/8v/y//L/8v/y//Lv8u/y7/Lv8u/y3/Lf8u/y7/Lv8u/y3/Lf8t/y3/Lf8t/y3/Lv8w/zH/Mv80/zf/Of86/z3/P/9B/0T/Rf9J/0z/T/9T/1n/Xv9k/2v/cv92/3f/d/9y/3D/cv9z/3b/d/96/3v/ev97/3v/ev96/3r/ef93/3X/cv9v/2z/av9o/2X/Yv9h/17/W/9Z/1X/Uv9P/03/S/9I/0X/Qv8//zv/Of83/zb/NP8x/zH/Lv8u/y//Mv9N/2H/W/9Z/1v/Yv9P/yf/K/8v/z3/WP9g/1z/XP9c/17/Xv9g/2H/Z/93/3X/b/9x/3f/gv+C/3f/dv94/3L/a/9o/2X/Vf9K/0//Qf86/z3/QP9D/0v/Uf9V/1j/Wf9Z/1n/V/9W/1L/UP9N/0r/Rf9D/0D/Pv89/zv/Ov86/zr/Ov84/zb/Nf8z/zL/M/8z/zT/PP89/zv/O/89/zz/Pv9T/13/Wv9j/2n/av9j/2T/ZP9t/3P/ef9+/4D/g/+I/4//l/+X/4P/K/8c/yj/J/8m/yX/Jv8m/yT/I/8l/yT/If8o/0//bv94/2n/YP9j/17/S/88/0H/VP9u/3T/ZP9Z/1v/Xf9e/2L/Yv9i/2b/Zf9f/2D/aP9k/0//Pf8//0n/Q/9H/0j/Tv9V/1b/Vf9X/1r/YP9o/2//dP95/3z/e/94/3X/cf9s/3T/fP90/2z/bP9s/2v/av9o/2j/aP9Y/0v/Uv9b/23/d/92/3H/cP9x/3L/cf9w/2X/V/9b/2b/b/9z/3D/bP9r/2v/av9t/3T/ff+D/3//fP98/3f/Wf8p/yf/KP8o/yn/Kf8q/yn/Kf8o/yf/J/8n/yj/Kv8t/zT/Lv8o/yj/Kf8q/yr/Kv8q/yn/Kf8q/yn/Kf8p/zP/S/9h/3T/hf+I/4b/gf+B/4L/gf94/2b/TP8t/yz/PP9H/0r/S/9M/07/Uf9S/1b/WP9Z/1r/Wv9c/1z/XP9c/17/Xv9c/1r/Xv9d/1r/Xf9f/1//XP9Z/1r/XP9e/2L/af9v/3P/dP93/3n/d/9x/27/cP91/3X/df91/3b/d/+C/4b/jf+g/7P/tv+u/6P/jf+A/3v/hP+M/4v/i/+L/5T/mv+Z/5r/nv+g/53/lv+U/5r/k/+H/3z/cv9h/2L/Yf9h/2D/YP9g/2L/Zv9o/2v/bv9y/3T/dv+I/5n/lf+R/47/jP+M/4r/jP+O/5H/kP+H/4L/gv+C/4L/gP9+/4H/hP+I/4X/gP+A/4D/f/97/3f/dP9x/3D/bf9t/2z/a/9q/2r/av9r/2v/a/9r/2v/bf9y/3f/gP+J/43/jf+L/4v/iP+H/4X/hP+D/4P/g/+G/4j/jP+P/47/jP+M/4r/iv+J/4j/hv+F/4b/hv+F/4X/hf+K/5D/lP+V/5X/lP+U/5T/kv+S/5L/jv+M/z1/PXM+fz10PH88dTx/O3U7fjt2OX45djh+OHY3fjd2Nn81djR/NHY0fzR3NH80eDN/M3k0fzR5M38zeDR/NHg1fzV5NX81eTZ/Nnk1fzV5NX81eDZ/Nng2fzZ5Nn82eTZ/Nnk1fzV5Nn42eTZ+Nnk1fjV6NH40ejN+M3ozfjN6M34zejN+MnoxfjF7MX4xezF+MXoxfTF6MX0xey98L3svfS97Ln0uey58LnstfC17LXwuey98L3swfDB7L3wvezB8MHwvfC98L30vfC99LnwufS5+Ln0ufi59Ln0ufS59Ln0ufi99L34ufS5/L30vfy5+LYAufi6ALn4ufzB+MX8yfjSANn44gDp9PX8/f0GBQ39FgEeASn5OglB5VoRbb1+FZmtqhm5rdIR3Z3WGcmNxg3JhdIJ2ZXiAeW94f3h3eX95fXh/eHx3gHV7dIBvem6AbHppgGh6Zn9ie19/XXtafld6U4BQeU6ATHlJgEZ5Q4A/ej6AOno5gDd6NIAyejJ/L3oufy16LYAuej2BXnleg1l2WYFgdmF/O3gogC15PYdYdGWKYHBfiV5uX4hjcWmFaXdnhXN9fYR1gnSDfIWKgIWNeX13lXd6dZdueGqXX3hRk0p4UJBFejqNPXxAjUN8R4xOe1GOVnhWkFd1VpFVc1WTUnJQlE1zSZNGdkSRQXpAjz58PI06fDqLOn46iDp/N4Y1fzSGNIA1hTeAOYQ9gDyDPIA7gz1/NoMsgjN/TIZecmaKZ19pim5VbolkVGKLaldxjHdXe4yAVISMhlKNjJRbl4aFZyaAIXkpfieBKX4ngyZ/JYMkfyOCIn41gXF/eYFygGuAZYFfg12AWIZOfz+MPn5Rj1J+Vo5ZfVmNWXxci157YopiemWLZXpljGV5Zo5XekSOPXw8j0J9SJJFfUiURn5NklF+T5BRf1SPX4Joi2+Fc4dzh3SEdoZ5hXmFd4R1g3CEc4F9hHh/b4RsgGuEa4BqhGh+aYNmflt/UnxUfmF7cH52fXR/cH5yf3OAc31yf218Xn5We1l6Yn9ud3KEbnlqhGp5aoBpe217dH9+dYGBf3J9gn5xdYRUdCeEKH0pgSiCKH8phSp+KYYofSiHJ30ohyl9J4cpfSyFMn8xgyl/J4MofyqEK34qhCt+LIYsfTCHLXwthi98O4ZTfWl9fH+Icod/hG2CgYFpg4N9ZnOFY2pDhCtzL4I+fUmBS3xLgU15UIBQeFGBUnhVg1d2WIRZdFqHWnBciF1vX4debl2GXW5dhl1yXIVcc12GXnJahldxWIZZcFuGW3FghWlwcIdwbnGIdXBxiGdzaIZtdG+Gc3R2hXh3d4J6eIF/i3ydf66As4CrfZ6BjnmFg4R6goN/d4KBg2+CgoJlioWXYJyFnF+bhZ9ioYWcZJaDkmKYgo1ggoF+bGZ9YIJfdWCRYHBhkmBvYZNkbmiUbWtwlHJrdJN3bYqLmHaVfJJ+j3KMgIxvjIKNb42Bkm+OgYN3gIGBf4J/gn+BgIB+gYCEfYh9hYV/dH+RgG59lHtsd5VzbHGVbmxtlWxsa5Vra2uVa21rlWtta5NsbWyVa21tlHFqeJSCaYmRjW+Liot3i4OHfYV9hX+FfYOAg36Dfod6i32NdY5+j3GMf4tviYCIcYiBh3WGgYZ5hn+FgIV5hIaHc5CIlHWWiJV2lIeUeJSHk3mRhpF7kYGOfot+QP9A/z//Pf89/z3/PP88/zv/O/85/zn/OP84/zf/N/83/zf/Nf81/zX/Nf80/zT/M/8z/zT/NP8z/zP/NP80/zX/Nf81/zX/Nv82/zX/Nf81/zX/Nv82/zb/Nv82/zb/Nv82/zX/Nf82/zb/Nv82/zX/Nf80/zT/M/8z/zP/M/8z/zP/M/8y/zH/Mf8x/zH/Mf8x/zH/Mf8w/zD/L/8v/y//L/8u/y7/Lv8u/y3/Lf8t/y7/L/8v/y//L/8t/y3/MP8w/y//L/8v/y//L/8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/L/8v/y7/Lv8v/y//Lv8t/y7/Lv8u/y7/Lv8w/zL/NP82/zj/Ov89/z//Qf9D/0X/Sf9M/03/Tv9S/1b/W/9g/2f/bP9w/3b/eP94/3T/cv90/3b/dv92/3f/d/91/3X/dv92/3X/dP9z/27/bf9r/2f/Zv9l/2D/X/9d/1j/Vf9R/07/TP9K/0f/RP9C/z//Pf87/zr/OP82/zT/Mf8v/y7/Lf8t/y3/Mv9R/2D/W/9a/17/Yv9S/yr/LP85/1X/ZP9j/2T/ZP9l/2z/cP9w/2n/cv9+/3r/ff+H/5D/iv98/3b/fP91/27/Zv9g/1X/S/89/zr/Of88/z//Qf9G/0j/Tf9S/1P/VP9T/1T/U/9S/1D/Tf9K/0f/Rf9C/0D/Pv89/zv/Ov87/zr/N/81/zT/NP80/zX/Nv87/z7/Pf88/zv/O/8z/y//K/8q/zz/Wf9m/2f/av9y/3T/aP9j/2T/a/90/3r/fv+C/4r/j/+U/5j/h/8s/yL/Kf8p/yf/J/8n/yP/H/9A/3L/dv9u/2r/av9r/2n/av9m/1r/Qf84/0n/Tf9F/0//Vf9W/1n/XP9h/2P/ZP9l/2f/Xv9D/zT/Rf8//0H/Uf9L/0X/SP9I/0n/TP9O/1P/Xf9m/2z/cv90/3T/c/90/3X/eP95/3j/dv94/33/ff91/23/av9s/2j/Zv9m/2P/Yf9X/1r/af91/3f/c/9w/3L/c/90/3D/aP9W/1T/WP9h/2z/cv9u/2r/a/9p/2r/bv91/37/f/98/3//ff9y/0v/JP8n/yn/Kf8p/yj/Kf8o/yj/Kv8q/yr/Kf8q/yf/Kf8w/zP/Lf8n/yf/KP8q/yr/Kv8q/y3/MP8z/zP/Of9H/1z/c/+F/4f/hf+C/4L/gf9//3z/cv9g/0H/K/8z/0L/Sv9L/0v/Tf9Q/1D/UP9Q/1L/VP9W/1n/Wf9Z/1r/XP9f/1//X/9d/1z/XP9b/1n/X/9e/1v/VP9V/1n/X/9g/1r/Yv9q/2r/bf9v/2T/Wv9g/2f/bv9z/3f/ef98/4D/hf+R/6D/qP+p/53/lf+O/4f/h/+H/4T/gf+B/4H/gv+H/43/lf+c/5v/mf+e/5//nf+V/5f/kf+K/37/b/9f/2D/X/9f/2D/X/9j/2b/a/9t/3D/cP91/3b/i/+Y/5X/kv+P/4z/jP+L/4v/jv+T/43/hf+C/4H/gv+C/4H/gP+B/4T/iP+F/3//f/+B/37/ef91/3L/cP9s/2z/bP9r/2v/a/9r/2v/a/9r/2z/bP9s/2//cv95/4L/if+N/4v/i/+L/4f/hf+F/4X/hP+E/4b/iv+P/4//j/+N/4z/iv+J/4j/iP+H/4b/hv+G/4X/hP+I/47/k/+W/5b/lf+U/5P/k/+S/5D/kP+P/47/i/9Bf0ByQX9Dc0J+QHQ/fj50PH48dTt+OnU6fjp3OH44dzd+N3c2fjZ3Nn82djV/NXg0fzR5NX81eTR/NHc0fzR3NH80eDR/NHg1fzV4Nn82eDZ/Nnc1fzV3Nn82eDV/NXg1fzV4Nn82eTZ/Nnk1fTV5NX40ejR+NHozfjN6M34zejJ+MnoyfjJ6Mn4yejB+MXoxfjF6MX4wei99L3ovfC96L3wvfC58LnwufC57LXwtey18LnstfC17Lnwuey58LnsufC57Lnwuey59LnsufS19LX4tfi5+Ln4ufi5+Ln4ufi59Ln4ufS5+Ln0ufy99L38ufi5+Ln4ufi5+Ln4ufjB+Mn40fzV+OH86fjt+Pn5AgEJ/RIFGf0l/TIBNfFGBVXdYhF1xZIZobGyGcWd1hnhidIRyXnSDdF91gXVpdYBzc3N/c3pyf3R+cn9yfm9+bH5qfmh9Zn5kfGJ/X3tbf1l7Vn9Te1B/THlKgEh5RoBDeUJ/P3s+fzp7OH83ejZ/NHoxfi97LX4seyx/LHstgUF5X4Ndd1mDWnZegGJ2PX8pdzeGUXVmimZyaYlrb26HcXN1hnR8cIV0f3yEf4KCgYqIint/kHB3bZZ1dnOVbHVqlF91WJNIdjeQOHk5jjp7PI09e0GNRXtLjVB3UY5QdVCRUXNQkk9zTpRPc0uURnVCkkB5P48+ez2MO307iTl/OIg4fjWFNH8zhDJ/M4U3gD2EPoA+hDx/PIQ4fjGGLnwuhy6AK4MwhUp5Y4poZmiMcVdxi29WZ4tmWm2Mc1x4jH1cg4yKWY2Jk1+WhIFrKH8hfCd/K4EofieCIn4zgXN/dX9vgWt/a4FtgW2BbINvf2+GW31DjDh9PI5PfkSOSn1VjVh8WotbfFyLXntei1t7TI05ezSPNXw4kDZ9RY9NfkmSQn5JlEp+SpNMf1SPXIJji2eHaYhtiXCGcopxhXCJcIV1h3iEeoV6g3qDfYV9gXWFboBohWp/Z4VjfmGFYX5ig1x8YH5wfHp+eH1xfXF/cX5ygHN8bH9ielB9UHpXeGB/anZwhGt3aoRseWqAanxxfXl/gXZ/gXxxfoKAcHGDQ3cmhCd/J4Eogyd/J4YofimHKn0phyl8KogqfCmIKHwqiC1+MYQ1fzCBJ38ogih+KYIpfSqFLH0yhTN7NIU+e1KCZn16eYd/iW6FgYFtgYOCan2FeWZvhV1sOoQrdzmBRX1Jgk19T4JPe0+BUHlPgU93UIJSd1KDVnhXhFlzWoZbcV6HXnBfhmBwXYZZc1iEWHRXhV1yW4VUcFOFVXFZhWVyZIVfcWSGZXBoiGtxXYhWdV6GZnhthXR4eoR7dH+Ch3CMgpRznYKhdaCDnnWXg5Nzi4SLc4uEhm+GgopqioOKY4eGh16JhpBem4WaYpiFnWWehJhnloKSZo2Bg2l5gGR3YXpgiWFzYY9hcGSQZ25pkWxrb5RzaneSem6SiZh4knqRgI5yjIGLcYmCiXCMgZJwi4GEeIOBgn+Bf4F/gICAfoGAhHyKfIWGf3V/kHxteZN3bHSVcWxwlW9rbZVra2qVa21rlWptapVqbmqVamxqlWtqbpVzaX2ThWqLkY1xiouLeYqCh3yFfoR+hH6FfYN+hn2Ldo9+jnOOf4xuioCJb4qCinKHgYZ0hoKGe4V9g4SFeIuIknWUiJV4lYiVeZSIknmRiZB5kIaSe5GCj36Mf0L/Qf9B/0D/P/9A/z//Pv8+/zv/O/86/zr/Ov84/zj/N/83/zb/Nv82/zb/Nf81/zT/NP81/zX/NP80/zT/NP80/zT/NP80/zX/Nf82/zb/Nv82/zb/Nv82/zb/Nf81/zX/Nf82/zb/Nv82/zb/Nv80/zT/NP80/zP/M/8z/zP/Mv8y/zL/Mv8y/zL/MP8x/zH/Mf8x/zD/L/8v/y//L/8v/y//Lv8u/y7/Lv8t/y3/Lf8t/y3/Lf8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lf8t/y3/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/L/8v/y7/Lv8u/y7/Lv8u/y//Mf8y/zP/NP82/zj/O/89/0D/Q/9F/0X/R/9K/0z/UP9T/1b/Wv9d/2P/Z/9s/3H/df91/3H/cf9x/3D/cP9y/3L/cP9w/3H/cP9t/23/bP9q/2j/Zf9j/2H/Xv9a/1j/Vv9U/1H/Tf9L/0j/Rv9F/0L/Qf8+/zz/Ov83/zb/NP8y/zD/Lv8s/yv/K/8r/y3/M/9P/2D/Vv9V/1n/YP9X/yz/Mv9K/2H/a/9s/23/cf92/3j/dv9x/3H/c/+A/4H/bf90/2z/bv92/2n/Zf9o/17/WP9X/0L/OP86/zr/Of85/zr/Pf9B/0j/Tv9Q/03/S/9M/07/T/9P/07/TP9I/0P/P/88/zv/Ov84/zf/N/84/zj/Nf80/zP/Mv81/zr/P/9A/z7/PP88/zf/Mf8v/y//MP8v/y7/K/81/1P/av9q/2r/df9y/2j/Zf9q/3L/e/+A/4P/if+L/5D/kv92/xv/JP8o/yf/KP8m/2r/d/9t/2j/av9w/3L/dP90/3j/cv9a/0f/PP83/0f/Sf9F/1P/V/9Z/1r/Wv9Y/0X/Nv81/zf/Ov84/zH/Ov9E/0L/QP9C/0T/SP9J/1H/Xf9k/2f/Zv9n/2j/Z/9p/27/bv9w/3L/dv94/3f/dv95/3r/df9v/2r/aP9l/2H/X/9g/2H/X/9k/3P/d/92/3P/cf9y/3L/cP9p/1n/Tv9P/1X/YP9p/2z/af9q/2z/av9q/3H/fP+B/3//fP+A/3//bf88/yX/J/8o/yn/Kf8p/yr/K/8q/yv/Kv8q/yv/K/8q/yv/K/8v/zT/N/8x/yb/J/8o/yn/Kf8s/zH/OP88/0n/XP9y/4P/jP+J/4X/hP+C/4H/gP93/2r/Vv80/yz/Ov9E/0n/Tf9P/0//UP9S/1H/T/9O/0//UP9S/1X/Wf9a/13/Xv9f/2H/YP9d/1n/V/9V/1X/XP9f/13/Wf9T/0//Tv9h/2f/Z/9m/2f/Zv9a/1n/Yf9n/3L/dv98/37/g/+J/47/kf+X/5v/m/+X/5D/i/+S/5T/lP+R/5j/oP+i/57/mv+S/4v/iv+R/5f/mP+W/5r/m/+Z/5L/h/+I/4f/dP9m/2X/ZP9k/2X/Z/9p/2z/bf9w/3P/d/9+/5X/mf+T/5H/jv+M/4v/iv+K/47/kf+K/4P/g/+D/4H/gf9//3//gf+E/4n/hP9//3//fv98/3b/c/9x/23/bP9s/23/bP9r/2n/av9q/2r/av9q/2r/bP9v/3X/f/+F/4v/jP+M/4v/if+H/4X/hP+E/4X/hv+J/4//kP+P/47/jP+N/4z/iv+K/4j/hv+F/4b/hP+E/4n/kP+U/5X/lf+V/5X/lP+U/5L/kP+Q/5L/kf+P/4z/Rn9Gb0V/RHFEfkN0QX4/dD9+P3Q8fjp1OX45djh+OHc3fjd3N343dzd/N3Y1fzV4M38zdzN/M3c0fzR3NH80dzN/M3g0fzR4NX81eDV/NXg2fzZ3Nn82dzZ/Nng1fzV4NX81dzV/NXk2fzZ5NX01eTV+NXo0fjR6M34zejN+M3oyfjJ6Mn4xejF+MXowfjF6MX4xezF+MHowfTB6L3wvei98L3sufC57Lnwuey18LXssfCx7LHwsey18LXsufC57L3wvfS18LX0tfS17LX0tfS5+Ln4ufi5+Ln4ufi5+Ln4tfS1+Ln0ufi59Ln8ufS5/Ln4ufi5+Ln4ufi9/L34xfzF+MoAzfjWANn47gDt+Pn8+f0B/Q39FgEd/SYBOgFF+VINXeVmFXnJjhmhrboZuZm+Fb2FthG1eboJuZG+Bb3Btf216bX9rfmt/an5ofmd+ZX5ifWF+Xnxbf1l6VH9SelF/TnpLf0l7SIBFekOAQXo+fz57O384ezZ/NnozfzF6L34ueyx9LHsrfit7LIAueTyCXHlYglN3VIJcd1+BQXgpgz15VIlmeWyKb3lzhnt9eoR2gG+BbINngGmGbntbimJ4cY2GcoyQeG9nlFtvT5ZTclOUQnU6kTp5O445ezmNN3s3jDt7Q4xKeU2OS3ZIkUZzSpJLc02UTHNLlEV1QpI8eTqOOns4izh9OIk4fTeINn00hzN+MoYzfzeEPoBChEKAQIQ+fzyENXwxhjF7MYcxfDCGMH8vhiyGJ31Ail1yZotsY22LcFpti2pbbYt2XnmLfl+Di4hgjIqMZpGFT3IcgCN9KIAmgVGAen9xgWt/aoJwgHWBd4F7f3+EfX5ghlZ+R4w7fjOPO31CkDt9P45JfFWNWnxPjTV8KY82ezuQOXs9kEB8PZA7fDuQPn1CkUR9R5JJf1GPWoNji2iGaYhmiGGIYohjiGCKX4llimmIa4hvh3GGc4d0hHOIcoJxh3GAaoVkf2CFX35ehWB+X4NjfGiBd314gXR/dIB1gHJ/cYBvfWR/UntNfk56VHlff2Z4aIRqeW2Ea3lpgWt8cn58foR3f4B9cYCCf3BthEB2MoQufiqBK4QrfyuFK34qhip/KocqfiuILH0tiC19LIgtfi2FMH84gzx/L4ImfiiCKX0sgy59LoM5fEGDU3xnfHl9iXGNf4lshYKEbIKDgWp+g3VoZIRIcC2DK3k6gUN/R4JLfE6CT3lQglJ4U4JSeU+CTnlOg096UoNTeFiEW3Zdhl90X4dfcV6HWnRWhVR2UYNadGCDY25fhVptV4VUbFWFX2tnhmlqaYdlaluHX25ohW5wdYR6cH6Egm6Hg4psjYOPbJGDlmyUhJBtjYSPbZmFpG6khaJvnoacbJqHmmmaiJ1hmoiQXIyHjl2UhZRjmIObZ5aDh2h+g4tohoJ9b2yBaH1re2mFaXdrim10botycXONdXB3i4Jzl4SYepN4kYCOcYyBjHCMgo1wkIGTcImBg3iCgYN/gX+Bf4CAgH6BgIR+h3yCh35zfpF7bHeVdWxylW9sbJVsa2yVa2tqlWlta5VpbWmVaWxplWprapVtanCVd2h/k4drjI+Lc4qHi3uJf4Z9hX6EfoR/hH2Je4t9kHSSfpBwjYCMbo2BjG+Jgolzh4GFd4V/hoCEeoaGjHeTiJV2lYiUeZSIk3qRiJB5kImPeZCGlHuSgo5+i39I/0j/Rv9F/0P/Q/9C/0L/Qf8//z7/Pv88/zz/Ov85/zj/OP83/zf/N/82/zX/Nf80/zP/M/8z/zT/NP80/zT/M/8z/zT/NP82/zb/Nf81/zb/Nv82/zb/Nv82/zX/Nf81/zX/Nf81/zX/Nf81/zX/Nf81/zT/NP8z/zP/M/8z/zL/Mv8y/zH/Mf8x/zH/Mf8x/zH/Mf8w/zD/MP8v/y//L/8v/y7/Lv8u/y7/Lf8t/yz/LP8s/yz/Lf8t/y7/Lv8u/y7/Lf8t/y3/Lf8t/y3/Lv8u/y7/Lv8u/y7/Lv8u/y3/Lf8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/L/8v/zD/Mf8y/zP/Nf83/zj/Ov87/z3/P/9C/0X/R/9I/0v/T/9S/1b/WP9Z/13/Yv9l/2f/af9r/2v/a/9p/2n/av9q/2n/af9p/2j/aP9m/2X/ZP9i/1//Xv9b/1f/Vf9T/1D/Tv9M/0r/SP9G/0P/Qf8//z3/PP84/zj/Nv80/zL/MP8s/yv/K/8r/yv/K/8s/yz/Mv9N/1//Vv9R/1f/W/9X/yz/MP89/1D/Xv9o/2//df96/3T/bf9o/1//V/9R/0r/Wv9y/4X/jv+G/4D/c/9m/2X/YP9J/z3/Of87/zn/Of83/zf/OP8+/0P/Sf9I/0X/Rf9G/0j/Sf9I/0f/Q/9A/zz/Ov84/zX/Nf80/zX/Nv81/zP/M/81/zf/Pf9D/0T/Qv9C/z3/Of80/zL/Mv8y/zD/Mf8w/y7/Lv8v/yz/K/9E/2P/av9t/3D/cf9t/3D/c/92/37/gP+F/4j/if93/yD/JP8i/0L/e/9x/2j/av9v/3b/ef98/4L/d/9c/1b/Vv9J/zn/Mv81/zf/OP83/zb/O/84/yz/MP81/zb/N/85/zr/Pv8+/z7/Rf9I/0z/Uf9U/1r/W/9h/2n/av9m/2H/Xv9j/2b/X/9a/1z/X/9h/2L/Zv9v/3H/bf9s/27/cf9q/2T/YP9f/17/Xv9d/2H/bP92/3T/cf9x/3L/cf9v/2//YP9M/0v/T/9V/13/Y/9l/2v/bf9q/2r/bv91/33/hv+C/4L/hP+B/3L/Uv9J/0X/PP8w/yz/LP8r/yr/K/8r/yr/K/8u/y7/LP8r/y3/Lf8u/zL/Ov85/zL/Kf8t/zj/Pv83/z3/Tf9i/3T/g/+M/43/if+F/4T/g/+C/4D/df9l/0r/L/8n/zD/Pv9G/0r/S/9O/1H/UP9Q/0//T/9O/03/Tv9O/0//Uv9Y/13/Xf9e/1//Xv9b/1f/VP9T/1f/X/9m/2j/ZP9j/2L/Zf9q/2v/bP9u/2r/Y/9p/3D/dv98/3//gv+H/4v/iv+K/4v/i/+N/4//j/+P/5P/mv+i/6P/oP+a/5j/mf+a/5f/lf+W/5b/jv+K/47/kf+S/5P/k/+V/43/h/+E/4L/dv9w/27/bf9v/2//cf9y/3P/d/94/3n/hf+X/5b/kv+Q/43/jP+M/43/kP+Q/5P/if+D/4L/g/+B/4H/f/9//4H/hP+I/4P/fv9+/3v/d/91/3L/cP9t/2z/bP9q/2n/af9o/2n/af9p/2n/av9q/23/cP94/4H/iP+N/4v/if+K/4j/hf+F/4T/hf+H/4v/kP+T/5L/kP+P/43/jv+M/4r/if+I/4f/hf+E/4T/if+Q/5T/lf+V/5T/k/+S/5L/kP+Q/4//kP+S/5D/jf+J/01/TW9Jf0hxR35GckR+QnNDfkFzQH4/dj1+PHc7fjt2OH45dzh+Nnc1fzV5Nn82eTZ/Nnk1fzV5NH80eTR/NHk0fzR4NH80eDV/NXg1fzV4NX81eDV/NXg1gDV5NoA2eTR+NHk0fjR5NH40ejR+NXo1fjR6NH4zejN+M3ozfjN6Mn4yeTJ+MnkyfjJ5Mn4yeTJ9MXkvfS96L30vei98L3kufC56Lnwuei58LnksfCx5LHwseyx8LHstfC18LHwufC18LX0tfC59Ln0ufC19LXwtfS18LX0tfS19LX4tfS1+LX4tfy5+Ln8tfi1/Ln4ufy5+Ln4ufi5+Ln0ufi59Ln4wfjCAMn4zgDZ+NoA4fjuAPH8+gEB/QoBFf0iASH9NgE+BUn5WgVh4WoNccGCEYmtkhWVmZIVkZGKCY2hlgGdwZn9lemV/Zn1lf2N+Yn9hfV5/W31af1h7VX9SeVB/T3pMf0p7SH9Ie0V/QXtBfz57O387ezh+Nnw0fzJ8MX8ueyt+K3srfit7K34reyx+LXssgDx6W4FZeFKAVXhbfWJ3RXwmezF/OXxFhVd+YIZrgXOCb4Rof2GFXHxYh1V9SYVIfGCGfHiJjIVxgZJ7bnWWdW9qlE50PJE5eTyMOnw4izd9Noo1fTiJPXpAjEF6QI9CdkOPQ3dDkUN2RJBBdz+PPHk5izZ6NIgzfDCHL3wvhTF9NIU2fzuFP4FCg0WBRYNDgEKCPX82hDN8MoUzezOGMXwxhTJ9MYUwfzODMoEwgiiEM3dSiGdsbYltXmqKdFh9iXdddIl2YnqIgmuAhWp0N4AgezSAdX91gWqAaoJuf3aAd4F+f3+DdX9bhlR+VYZWfU6LPn00jTJ9M481fTaPNXw0jzN8Mo83eziQOHs6jzp7OZI5e0ORSn1OkVB/VJFcg1+OYIVei2WJaohoiWWHYIpjiGeKaIllimOLX4ldjFmKUI1QhWCKb4RtiGqBbIZxfmuGYn1dhVx9XYNefVyDXnxvgnZ9cYFvf3CBcX9yfnF/bHtSf0x5THxPelN6WH5cd2WBbHhsg2d4aYJte3Z6gH6GcoWBhWyIgoZreYNsbWOCW3JTgkR7NIEtfyuBK4QrfyuFK38rhyt+LIcrfiuHK34rhyx+LoU0gDuEPYAwgTN/M4A6fj5/RHxafG59f3OMfpBtjYCJa4iCiG2Gg4Rre4F1aWqBXWtbgldvTIFFcUGCRHZGgUh5ToJPek6DT3tOg0x9SoJEfUCCSX1MgVR9WoJafFmEWHhch1x5W4VXeFmDXnVmhGxtb4RvZnCEcl9zhXNddIVxXXOGcl1xhnNfd4V7ZYKFg2iGhItnjYOMZouEimWIhIhnioWMapGFk22XhppwmYaZbZSGk2uWhphnmIaWZJOGkWCQho9fjoaOYY6EkmiUhI9phoOFaoqDhG19g3dzdYJzeXSAdnx3fXeAeHt3g3p5fIOKeZV9lH6ScI+Bi3CLgYtwi4GOb5CBkXGIgoJ4goCCfoJ/gH9+fn59gX+Efoh7f4l+cnySeW53lXRrcZVwa26VbGtslWpsapVqbWmVaW1plWhsaJVra2uVbGpxlXlpg5OKbY2MiXaIg4p8h36FfoV+hX6Hfol+jHmRf5VykoGQb5CCj3CNgotxioGIdIZ/hHyDe4WDiXeOh5R1lYeUeJSIk3qSiZF6kIqPeI+JjXiQhpJ6kIKOfot/Tv9O/0z/S/9J/0j/Rf9E/0X/Q/9D/0H/P/89/zz/PP86/zn/Of82/zX/Nf82/zb/Nv82/zX/Nf8z/zP/M/8z/zT/NP80/zT/Nf81/zX/Nf81/zX/Nf81/zX/Nf80/zT/NP80/zT/NP80/zT/NP81/zX/M/8z/zP/M/8z/zP/M/8y/zL/Mv8y/zL/Mv8y/zL/Mv8x/y//L/8v/y//L/8v/y7/Lv8u/y7/Lv8u/yz/LP8s/yz/LP8s/y3/Lf8s/y7/Lf8t/yz/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lv8u/y3/Lf8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/zD/MP8y/zP/NP83/zf/Of86/zz/Pv8//0H/Q/9H/0r/Tf9R/1P/Vf9V/1b/WP9c/1z/Xv9d/13/Xv9f/2H/Y/9i/2H/YP9g/1//YP9e/13/Wv9X/1b/VP9S/0//T/9L/0n/R/9G/0P/Qf8//z7/PP87/zn/OP81/zL/Mf8u/yz/K/8r/yv/K/8r/yv/Lf8s/y3/Mf9H/1//V/9R/1r/ZP9f/zD/KP8w/zr/Tf9Y/1v/Y/9l/2T/Xv9Y/1n/Wv9S/0r/Tv9s/3r/dP9w/2//b/9y/2L/Uf9B/zz/Nf80/zT/Mv8x/y//Mf80/zX/Nf80/zb/N/84/zv/PP8+/zz/Ov87/zn/Nv80/zP/M/8y/zH/Nf84/z//Qv9F/0b/Rv9F/0L/Pv85/zP/Mf8x/zL/Mv8y/zL/Nf81/zX/Nf81/zT/Nf8w/y//Pf9a/2n/bv9u/3n/ff97/3X/Zf9S/1T/OP8n/y//bP90/2n/aP9s/2//d/9+/3z/Z/9X/1f/Wv9b/1j/Uv9B/zP/NP82/zj/PP8z/y//Mf82/zb/Nv86/z7/P/9C/0r/Tf9P/1T/V/9X/1v/X/9f/2L/Zv9n/2b/Zf9k/2X/Zf9o/2X/Yf9b/1n/Uv9F/0D/Uf9m/2r/av9r/3D/af9g/1v/W/9c/1z/XP9l/3n/ev9w/3D/cf9z/3H/cP9i/0r/SP9L/07/UP9V/1z/Zf9v/2z/af9r/3D/e/+G/4j/if+K/4n/if+F/3//ef9w/2T/W/9J/zb/LP8r/yv/K/8q/yv/K/8s/yv/K/8r/yv/Kv8s/y//Nf8+/zf/M/81/z3/Qv9R/2n/ev+I/47/j/+N/4n/iP+I/4b/g/99/3T/av9c/13/Yf9m/2b/Zf9X/0r/Rv9H/0z/TP9K/0v/R/9B/y7/Kv8+/0L/Rv9W/1j/WP9Z/1z/YP9f/13/Xv9l/23/cv9z/3P/dP92/3n/ef94/3j/d/92/3j/ev99/4L/g/+G/4j/jf+M/4z/i/+L/4n/if+I/4n/jP+N/5P/lf+W/5b/kv+R/5L/k/+T/5P/kP+N/43/jf+N/43/i/+S/5b/lf+U/5P/lP+R/4z/hv97/3f/ef96/3r/ev98/3z/f/+B/4v/k/+T/5D/jv+K/4r/iv+K/4z/kP+R/4X/gv+C/4L/gv+A/37/fv+A/4L/iP9//37/e/95/3f/cv9x/3D/bv9s/2v/af9p/2n/af9p/2n/aP9o/2r/a/9s/3H/e/+F/4v/jP+J/4n/if+G/4X/hv+H/4v/jP+R/5P/k/+S/5D/kP+P/43/i/+K/4j/hv+E/4P/hv+O/5T/lf+V/5T/k/+S/5H/kP+P/4//j/+N/5D/k/+R/47/i/9Pf05uTn9Nb0t+SnBIfkZyRX5EckN+QnVAfj93Pn49djt+O3g5fjd4N382eTd/N3k1fzV5NX81eTV/NXk0fzR5NH80eDR/NHg0fzR4NH80eDR/NHg0fzR4NH80eDR/NHgzfjN4M34zeDN+NHk1fjR5NH4zejN+M3ozfjN6M34zejJ+MnoyfjJ6Mn4yezF+MXsxfTF5MH0vei99L3oufC55LnwueS18LXktfC15LHwseSx8LHssfCx7LHwsfCx8LHwtfC19LHwtfS19LXwtfS18LX0tfC19LX0tfS1+LX0tfi1+LX4tfi1+LX4tfi1+LX4ufi5+Ln4ufi59LX4ufS1+MH4wgDF+NIA0fjV/N344fzl/OoA7fz2AP39BgEZ/R4BLf0x/T39Qe1GBUXpTglZ1V4NYcViDWHBYgVpyW4BdeF1/XH5df1x/XH9cflp/WH1Vf1J8Un9Qe09/THpKf0p7R39Fe0N/QXtBfz97O385ezd/Nns0fjN7Mn4weyx+LHssfix7Kn4qeyx+LHssfix7LH8tejeAVXhbglN4VYJdeWV/T3wmfCyANIBAgk2BU4FVglmBWIBUglKBVoJZg1h/VYNSfl1+bIRteGuMZnJokmlvYpNYckuROHYtjC56LYgrfiqGKH4ohSd+J4QnfieFJ3wqhi18MYc0fDiHPHxBiEN8RIdEfUWGR35Hg0N+QIJBgEWCRoFHgkeBR4JGgUWCQX87hDR9MIUwfDCGMHsxhTV6NYY3fDaGNn02hzV+NYU2gDOEM4QufzCISXdii2dqc4x7YXyMf2B4iFhrIIUkeSuBa312gWx9boFxgG+AcoJ5f3ODY35XhVx+XIZbfV6HXH1VikF9NYw1fDaPNXwzjzB9LY8vfTSPRH1Jj0Z+Ro5Yf2SNVIBRjVaCWoxahFmKXoVeimKIZIdlimSJYIpgiWCJZIpji2SMY4tcjVeJVI9NiD+POoNDjVWCYopngGeHa35nhV98WoVZfFuDXX1dg259foN3f3CCcIBygXGAcX5zf1h7Rn9FeUt8TnpReld+XXdlg2p4bIJtenJ8eH2AcYd/jWmPgY9jj4KOYY2CiWOIg39kc4NraF6DTHQ0gy1+LIEshCyBLYYsfyyGLX8rhit+K4crfiuFLYAxhTaAOoI7fzuAQn5Mf1p9cnaBf45skIKOaoyEimuHgodqhoOBaXyFc2VohWBoXYVibGaEY2tihGJqWYRHbE+CTW9Hgj5yOYI9dz+BOXkjfy99M34ugEd/WH1aglx5X4RjdmSFY3Jmg2tscoR2ZXeFeVx5hHlWeYV6VHyFflR9hnxUfYaAVoOGhVuGhYZkioSMaI+Ej2qOhYxtjYWObpCFkHCPhY9wkYWRcZKFkm6RhpFtkYaQaY+GjmWPho9hjYaNYIyGjGOPhZBmkYWRaJCEjGmLhIppi4SKZ4SDgGh/hH9sgISAcYCCgHaDgIR2jH+ScpCBjm2MgopsiYKJbImCjG2Pgo5vhIKCeYKAgX+Bf4GAfn5+fn9/gn+Ie3+KfnJ6knhudpVya3CVcGtulWxra5VpbGmVaG1mlWhtaZVpbGmVaWtrlW1pc5V9aIeTi22Mi4l3iYKIfYZ+hX6Gf4l8i32PfZJ2lH+ScZGBkHCPgo5xjYKLc4qBiHaHf4V9h3uIhJJ3loaVd5OHknmSiJF5kYmPeY+KjneOiY13kIaReo+Cjn6Lf1D/T/9O/07/Tf9L/0r/SP9H/0X/RP9C/0D/Pv8+/z3/PP87/zn/OP83/zb/N/83/zX/Nf81/zX/Nf81/zT/NP80/zT/NP80/zT/NP80/zT/NP80/zT/NP80/zT/NP80/zP/M/8z/zP/M/80/zX/NP80/zP/M/8z/zP/M/8z/zP/Mv8y/zL/Mv8y/zL/Mf8x/zH/Mf8w/y//L/8v/y7/Lv8u/y7/Lf8t/y3/Lf8s/yz/LP8s/yz/LP8s/yz/LP8s/yz/LP8s/yz/LP8s/yz/LP8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y7/Lv8u/y7/Lv8t/y7/Lv8v/y//MP8z/zP/NP81/zf/OP85/zr/O/89/0D/RP9F/0n/Sv9M/07/Tf9P/0//UP9R/1L/Uv9S/1X/V/9Z/1r/Wf9Y/1n/WP9Y/1f/Vv9U/1H/T/9O/03/TP9K/0n/SP9G/0T/Qv9A/z7/O/85/zf/N/81/zP/Mf8v/y7/LP8s/yz/LP8r/yv/LP8s/yz/LP8s/yz/L/9D/1//V/9T/1j/Y/9o/z7/Kv8t/zP/QP9M/1D/TP9M/0z/Tf9O/1L/Vv9Z/1b/VP9n/2v/a/9o/2P/Yv9i/17/W/9K/yv/KP8n/yb/Jf8j/yP/If8h/yL/Iv8j/yT/Jv8p/zD/Of9F/07/Uf9S/1D/T/9P/07/Tf9K/0n/Sf9I/0f/R/9G/0P/Qf88/zf/Mf8w/zD/MP8w/zH/Nf82/zf/Nv82/zb/NP80/zX/Nf81/zT/Mf8w/zX/Sf9e/2//d/95/3n/Zf8w/yr/af96/23/bv9t/27/cv94/3f/XP9Y/1r/W/9c/13/Yf9f/1//R/82/zX/Nf8z/zH/Lf8u/zD/NP9G/0r/Sf9M/2X/bP9T/1P/U/9S/1P/V/9d/13/Yf9j/2L/X/9c/1z/XP9d/1//Xv9a/1n/Uf9O/0P/Ov83/z3/T/9g/2f/YP9p/2r/YP9c/1z/XP9b/2H/eP9+/3X/cv9w/3P/cf9x/2z/TP9C/0X/Sf9N/1H/V/9e/2T/av9u/3X/ef9//4b/i/+P/5L/kv+T/5P/jv+N/4z/iP+A/3b/a/9b/0T/MP8t/y7/Lf8t/y3/Lf8s/yz/K/8r/yv/K/8s/y//NP87/zv/Pf9A/07/Yv92/4j/kP+S/5D/jP+K/4j/iP+H/4L/e/9w/2X/X/9E/0b/Y/9p/2X/Yf9e/1P/Y/9t/2f/X/9W/0z/Pf9A/zv/Of88/0D/S/9Z/1//Yf9j/2X/Zv9o/27/cv92/3n/ev98/3z/fP98/33/fv9//3//ff9+/4D/gv+G/4b/hv+J/47/k/+T/5X/lv+W/5f/l/+X/5f/l/+X/5f/lf+V/5X/k/+R/4//jP+L/4z/jP+M/43/jv+O/4z/jP+J/4f/hf+E/4P/hP+F/4T/g/+E/4T/hP+C/4L/hP+E/4P/h/+O/4//jf+L/4r/iv+J/4n/if+M/5D/jP+C/4H/gP+A/4D/gP9+/37/f/+C/4f/fv98/3r/d/91/3L/cP9w/27/bP9r/2n/af9o/2b/Zv9m/2j/aP9p/2r/b/92/3//iP+M/43/if+J/4f/hf+G/4X/iv+M/5H/k/+U/5L/kP+Q/4//jv+M/4v/iv+K/4j/h/+I/43/lP+W/5T/k/+R/5H/kf+R/4//j/+O/47/jf+Q/5L/kP+O/4v/VH9TbVJ/UG1Of05vTX1LcEl9R3FGfUR0Q31CdD59PXU9fTt2OX06dzh+Nnc3fjd5NH42eTZ+Nnk1fjV5NH40eTR+NHk0fjR5NH40dzR+NHc0fzR4NH80eDR+NHg0fjN4M34zdzN+M3c0fjV4NH40eDJ+MnkyfjJ5M34zejF+MXozfjN5Mn4yeTJ+MnkxfjF5MH4wezB+L3svfi97Ln0uey19LXssfSx7LH0seyx9LHssfSx8LH0sfCx8K3srfCt7K3wrfCt8K3wsfix9LX4tfS1+LX0tfi19LX4tfS1+LX0tfi19LX4tfS1+LXwtfi18LX4tfS5+Ln0ufS5+Ln0ufi5+Ln4wfjF+M34zfjV+NX43fjd/OH46fz1/QH9Ef0R/Rn5IgEl+S4BNgE1+TYBNfk6ATnxPgE98UH9TfFR/U31UflR9VH5TfFN+Un1Sfk98TX9NfEt/SXxJf0d7R39GekR+QHw/fjx8PIA6fTeANX00fzJ8MX8uey1+LHssfSx8LX0tfCx9LHwsfSx8LH0sfCx+LXwufzV8VIFheVaBWHpffmZ8YXwwgCt9L4U2gEGETINKgkaCR39IhEd9SIRNe1aEVXlTg1h/aX1vhXB2Y41acFySZHFhkVd2Q4wneSWIJXwjhSF9IYQifiKDI34jgyR/J4Mpfi+DOn1LhVV+VIZSgFCDT4FPgk+CToJKgkqBSYJJgkeBRIJEf0OCQX49hDd9M4QwfDCGMHswhTF7NIU0fDaGN3w3hjd7O4Y4fDmGNX82hjWAM4M1gjaBMIUufDCKN3k/ikV7Qoc1fSyEan14gG5+boJyf3GBcIF6gHqEXX9YhVp+XIdffWGGYXxgiGF8T4pAezeNNHs0jzN7MI8vfC2PLXwyjzZ9PpBBgEKOSoROjVGEV4xYhVWMVIZVi1qIXYpfiV+KWopai1yKW4tdil2LWYpUjFGJTY5HhkGPPIM2kDaAPY5PgFyJXn9Wh2B+bIVifF2FXXxdg1x9bIKDf36CdX9xgnGAcoBzgHB/X39EekJ9RnlIfEx5T3pWfl94Y4FneXJ+fHuBdIV+iWmOf5FjkoCTYpOBlGOTg5BijoOMYYaDgWJ0hGdrVoQ9di+DL4EugS6GLoAuhi5+LocrfyuHLH8rhy1+LocwfjeFPHxAgUV9Un1qf4ByjYCQaJCDjmeMg4toioOKaYmDg2l8hHBlZIRjalCDPWxeg2dsYoNlZ2WFaGVohGhjaINsYm+GbGVig09pRINLcFGAUXZZfmF2ZoFncmuDbm1yhXNoeIN7Y3+EgF5/hH9XfoV/Un6Ffk9/hn9QgIV+U3yFfVl+hYNfhIWHbJCDlHaYgpp7noOgeqCDoHqhhaJ6o4WheKOEonighZ1znYWZcJeGlGuPh4xljIeMZIyHjGKNh4tjh4eGZIKHgmSDhoNlg4aDZoOGgmWDhoVihYSHYoiEiGKGhIVmhYOJaI2DjGiLg4toioSJaIiEiGiIhIxrjoSJboKCf3d+gX5+foB+gX5/fn19gICAhnl+jHtyeZR2bnSVcWtvlW5rbJVsa2uVaWxolWduZpVlbmWVZ2xnlWlrapVwZ3eVgGmIkYxwjIqIeImBh36Ff4R/h3+LfY57k32Wc5SAknGQgZBxj4GNc4uBiXWKgYp5in2KgYt6kYSWd5aGlHmSh5N5kYmQeZCJj3iPio52jYqLdpCHk3qQg45+i4BV/1T/U/9T/1D/T/9P/03/S/9J/0b/Rv9D/0L/QP8+/z3/O/86/zj/Of83/zf/N/82/zX/Nv82/zX/Nf80/zT/NP80/zT/NP80/zT/NP80/zP/M/80/zT/NP80/zP/Mv8z/zP/M/8z/zP/M/8z/zL/Mv8y/zL/Mv8x/zH/Mf8x/zH/Mf8y/zL/Mv8y/zH/Mf8w/zD/L/8v/y//L/8v/y7/Lf8t/yz/LP8s/yz/LP8s/yz/LP8r/yv/K/8r/yv/K/8q/yr/Kv8q/yv/K/8r/yv/LP8s/yv/K/8s/yz/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lv8u/y7/Lv8u/y7/L/8v/zD/Mf8x/zH/Nf81/zf/N/86/zz/PP8+/0H/Q/9E/0b/Rv9I/0r/Sv9M/03/TP9O/07/Tv9O/1D/Uf9Q/1H/UP9Q/0//Tv9M/0z/Sv9K/0j/Rv9G/0X/RP9D/0L/QP8//zz/Ov86/zj/Nv80/zL/MP8v/y7/Lf8t/yz/K/8t/y3/Lf8t/yz/LP8s/yz/LP8s/y7/Lv8//2H/YP9X/1j/X/9n/0//KP8q/y7/Nv9C/03/Sv9H/0n/Rf9E/0j/S/9N/1T/V/9e/23/cf9m/1//YP9k/2X/Xv9U/zn/If8k/yL/If8g/yL/Iv8i/yT/J/8s/zH/P/9Q/1v/Wf9Y/1n/Vv9S/1X/Uf9O/0r/R/9G/0b/RP9B/0D/P/88/zn/NP8w/zD/MP8w/zH/Mv80/zT/Nv82/zj/PP8+/zz/Of81/zX/N/83/zX/NP80/zH/MP8v/y3/Lv8r/zH/Zf92/23/a/9v/3H/cP93/3v/Y/9Z/1v/Xv9e/2T/Zv9m/1D/Pv84/zv/OP80/zT/Mv8y/zH/MP8x/zP/NP83/zr/Qv9L/1D/WP9b/1n/Wv9Z/1n/Xf9d/13/Xf9a/1r/W/9c/1z/Wf9U/1D/Tf9J/z3/OP82/zX/Nv89/0v/U/9U/1H/Wf9o/2X/W/9d/13/Yf93/4P/ff92/3T/df90/3P/cf9S/z//Qv9G/0f/S/9P/1b/X/9o/2//df+B/4j/jv+Q/5H/lP+W/5f/lf+V/5P/kv+O/4z/jP+H/33/c/9i/03/Nf8t/y3/Lf8u/y7/Lv8u/yz/LP8s/yv/K/8t/yz/Mv83/0v/XP9k/3T/iP+S/5H/jv+Q/43/jP+L/4v/iP+C/3n/bP9j/2L/Y/9a/17/Zf9j/2P/Zf9m/2n/af9n/2f/av9v/2//cP9w/2//a/9k/2f/bf9y/3P/df91/3n/ev+A/4L/gv+E/4T/gv+A/4H/gP+A/37/fP97/3r/eP95/3v/fP99/4X/j/+c/6P/pv+q/6v/q/+r/6v/rP+t/67/sP+t/6r/qv+p/6P/n/+a/5b/kP+L/4v/i/+L/4n/h/+E/4T/gf+A/4D/gP+A/4D/gP9//4H/gv+D/4f/iv+J/4b/hP+F/4n/i/+M/4v/i/+J/4n/if+J/4n/i/+N/4j/g/+A/37/fv98/37/fP98/33/gP+D/33/e/95/3b/dP9x/2//bf9s/2z/a/9p/2j/Zv9m/2X/Zv9n/2f/af9q/3H/ev+E/4z/jf+L/4r/iv+F/4T/hP+H/4z/kf+V/5X/kv+R/5D/kP+O/4z/iv+J/4n/iv+J/4v/kf+U/5X/k/+T/5T/kf+Q/5D/kP+P/4//jv+N/4v/kP+S/4//jf+K/1h/V21Vf1NtUn9Sb1F9T3BNfUtwSH1JckV9Q3NAfT50PX07djt9OXc5fjd3N343eTZ+NXk1fjV5NH40eTR+NHkzfjN5M34zeTN+M3czfjN3M38zeDJ/MngzfjN5M34zeTR+NHkyfjJ5Mn4yeDF+MXgxfjF3MX4xdzB+MHgxfjF4MH4xejJ+MHoxfjF7MH4wezF+MXsvfi97Ln4uey59LXstfS17LH0seyt9K3srfSt7K30rfCp9Knwqfip8Kn4qfCl9KXwqfSp8K34rfSp+Kn0rfit9Kn4rfSt+K30sfix9LH4sfS1+LX0sfix9LX4tfS1+LX0ufi59LX0ufS99L30vfS9+MH0xfjN+M34zfjN+NX42fjd+OX45fzt+PX8/fkF+Q39FfkV/Rn9IgEl/SYBLfkt/TH5Nf05+Tn9Nfk2ATX5LgEt+Sn5Ifkd/Rn5EfUR/QnxDf0N8Qn9Ae0F/QHo+fjx6O345ejZ+N3s0fjF7MH4vfC5+LX0tfi19LH0rfC19LXwtfS18LH0sfC19LHwrfit7LX8tejR+UHtlg1l8V4JYfGB+Z309eyOELH4vhjaAQ4RLg0qCRoREfEOEQnpFg0Z6SINRfleCZYByfWqIaXVokGJzXZFYdVyOU3gyiSh7JIUhfCGDIH4hgyJ+JYMpfi+EPX5ThF6AXoRggWCFXH9bhVuAVIRRgEuDRoBCg0GBQYM/gD6DN343hDh9OIUyfDGGMHowhTF7MoUzezOFNHw3hjh8O4ZAe0GHPXw4hzh9N4c1fzWFNIA0hDOAMoUwgS2DLIEtgjaCbIB3gmx9aoBvf26AboF3gHqDaH9chFx+W4VdfWCHYXxXijp7KIwufDeOO3s5jzV7Mo8wezCPM3s2jzR7M481fzqQP4FHjlCEVY1YhleNVIdWjVmHWYxeiV6KXYtcilqKW4pdil6KXopailSKUopRh0eMO4Q3jjWAMpA0fzqNRn5Nh1F9U4NWemSDZnpdhF58W4ZmfYCEg396gnd/doJ0gHOCdIB2gWt+S4E9fEJ9RXxKfFF6VX5ceGt/eXl+e4h6j3CQfZJqlX2Waph9mWmXgJVpkoKRZY+CjWKMgotgg4N5Y22DXW1DgzJ8LoEsgy+AL4UwfjCGLn8uhS5/K4Urfi2GLn4uhzR+Q4Nhf3d7gX+Oc5SAkmuOg41qjIONaoyDjGiFg4BodYRnZmCEX2hhhGFpYoRhaWODZGlkhWdnZ4VlZWWGaGVuhnJjcoZ2ZHmGfmKBhYFjfYV8Y3yCfmR+gn9jgYOBYoaDhmCGhIhdh4SDXICFgVl+hXxZe4Z4WneIdF5yiHNodIZ0eXSBfoSQf6aFrH6vhbGAtIO0gLSDtn+3f7p/u327gLp8tIGzd7KDrnOphqVwnYWVcI+FjW+OhYtriIWGaYKFgWuAhX5teoZ6b3mGe3B7hnttfIZ9a3+EgWmIhIpniISFZIWDh2GJg4pji4OKY4qEiWOKhIpjiYSKY4yEiGeDhIBxgIKAeH6Bfnp9gH15foCBfoJ5fot6cXiUdWxylXFrbpVta2uVamtplWlsaJVmbGaVZmxmlWdsZ5Vpa2qVc2l8lYZrjZCNcYyHjHmJfYZ9hHyEfoZ8jH2TeJV9lXKSgJB1kIGPdYyBinOJgYh1iICJe4l8jYKReZaGlXiSh5J5koeReZGJkHiQio93j4uMdo2Li3aOhpF6j4GMfop+Wf9Y/1f/V/9V/1T/U/9Q/07/Tf9J/0j/Rf9D/0H/P/8+/zz/PP86/zj/N/83/zf/Nv81/zX/Nf80/zT/NP80/zP/M/8z/zP/Mv8y/zL/Mv8y/zL/Mf8x/zL/Mv8y/zL/M/8z/zL/Mv8y/zL/Mf8x/zH/Mf8x/zH/MP8w/zH/Mf8w/zH/Mv8w/zD/MP8w/zD/MP8w/y//L/8u/y7/Lv8t/y3/Lf8s/yz/K/8r/yr/Kv8q/yr/Kv8q/yr/Kv8q/yr/Kf8p/yr/Kv8q/yr/Kf8p/yv/K/8r/yr/K/8r/yz/LP8s/yz/Lf8t/yz/LP8t/y3/Lv8u/y7/Lv8t/y7/L/8v/zD/MP8x/zH/Mv8y/zL/Mv8z/zb/Nv84/zr/Ov88/z3/P/8//0H/Q/9E/0X/R/9H/0n/Sf9J/0r/Sv9K/0z/TP9J/0f/Rv9G/0T/Q/9E/0H/QP9B/0D/QP8+/z3/Pv88/zz/Of84/zb/NP81/zL/MP8v/y//Lv8u/y3/Lf8s/yz/Lf8t/y3/Lf8s/yz/Lf8s/yv/LP8s/y3/L/87/1r/Yf9a/1X/Wf9l/2T/M/8m/yz/L/85/0P/S/9I/0X/Rf9D/0H/Qf9B/0j/UP9a/2v/df93/3D/Xv9Q/1X/YP9i/0r/KP8g/yH/If8h/yH/I/8l/yv/Nv9O/2D/Yv9l/2T/Yv9f/1n/T/9I/0H/OP81/zD/MP8y/zf/N/81/zb/Of84/zT/Mv8x/zH/Mf8y/zP/M/81/zb/N/86/z7/Pf86/zj/OP83/zX/Nf80/zT/Nf8z/zP/LP8t/0L/bf91/23/av9t/3H/cf92/3n/Z/9h/1z/YP9e/2H/WP86/yn/Kf8t/zD/N/86/zn/Nf8y/zD/Mv84/zf/Nf81/zr/P/9I/0//Uv9Y/1v/V/9P/0//Vv9a/2H/Yf9e/1z/Wv9b/17/Xf9e/1r/WP9W/1f/Tv9C/zz/Nv81/zX/PP9G/0//Vf9T/1L/Xv9n/17/Wv9c/23/gv+B/3j/dv91/3P/dP9z/3H/dv90/1P/Qf9H/0z/Tf9Q/1//c/99/4T/jv+S/5T/lP+W/5f/mf+Y/5P/kf+O/4v/jP+P/4z/jP+I/37/c/9m/1f/Pv8x/zT/Of87/zv/PP84/zb/Mv8t/yr/K/8w/zL/Mv9D/1//ef+L/5P/k/+S/4//jv+M/4v/iv+K/4X/fP9v/2L/X/9i/2H/Yf9i/2L/ZP9l/2X/Zf9n/2f/av9r/3D/cv90/3j/ff9//4H/gP+E/4P/g/+F/4X/hP+F/4X/iP+I/4j/h/+H/4P/gf+A/3r/eP93/3T/dP9w/3H/b/9u/27/cf91/4//q/+x/7L/t/+5/7n/uf+7/7z/vv+9/73/vP+7/7r/uf+3/7D/rP+h/5b/lP+V/5D/iP+F/4T/g/+C/37/fP95/3f/dv91/3b/dv92/3f/ef97/37/hf+I/4T/gf+B/4T/iP+J/4r/iv+J/4r/iv+J/4r/i/+H/4T/gv+A/4D/gP+A/33/ff9+/4H/gf98/3n/dv9z/3L/bv9t/2z/a/9r/2r/af9o/2b/Zv9o/2j/aP9o/2n/bf90/33/h/+M/43/i/+K/4j/g/+D/4X/iP+P/5T/lP+S/5H/kP+O/43/i/+K/4j/iP+I/4v/jf+P/5L/lP+S/5H/kP+Q/5D/kP+P/4//jv+O/4v/jP+L/47/kf+P/43/i/9bgFttWoBYbVh/WG5UfVFvT31OcUx9SXJHfURzQn1AdT99PXY8fTt3OH44eTh+N3k1fjV5NX41eTN+MnkzfjN5M38zeTN/M3kyfjJ4Mn4yeDJ+MngxfjF5Mn8yezB/MHswfjF5MX4xeTF+MXkxfjF5MX4xei9+L3owfjB7MH4wezF+MXsxfjB7L34vejB+L3otfi97Ln4uey1+LXoufS16LX0teit9K3orfSp6KX0peil9KXwqfSp8KX0ofCh9KHwofih8KX4ofCl9KnwrfSt8K34rfCt+K3wrfix8LH4sfCx9LH0sfix9LX4tfS1+LX0ufi59LX4tfS59Ln0wfTB9MH0wfjB9MH4wfTB9MX0yfTR+NHs1fjd7OH44fTp+PHs8fT19Pn1BfUJ+RH1EfkV+RX5Gf0d+R39Hfkd/Rn5Ff0d9RH1Df0N8Q35BfUF+QX0/fj18PX49ezp+PHo9fjt6OX44fDZ+NHwzfjN7Mn4vey99L3sufS57LX0tfC19LXwtfS18LH0sfC19LX0tfS19LX0tfC19LXwtfjN9SH9nfWCCV3tVgFx8Z31fgSl6JoUmfS+GNYFAhEiER35GhER8QYNAfECDQnxJg1R9X4NugXJ6b4pgc1CPVHJdjl52V4w7eR+HIXohhCJ9IoQkfieELn5EhV1/Y4Rjf2SFY39chU5+RIc3fyyGKH8jhSF/I4UnfyiFK38uhDF9NYQ6fDyGOXs0hzN7M4Y0ezeGNns3hjl7O4Y9ej2HQHo6iTh6OYk3fDWHNn41hTR/NIQ1fTOCMH43gWJ/fX54gm17Z4JrfnF/c391gHeCYIBag1x/X4RhfWKGU3wtiCZ6KIotey+MM3s2jTR7N483ejSPMXs4jzt7OJA5fDmRPoBGj0+CVI9VhleOV4hUjVCIUI5SiVeMXolfil+LX4lcilyJXopciVuLWotailyLXIhYi0uFP4w8gTiOOX5Eik58VIRVelZ+VnlbgGR6YYRXfF+Fdn6Ag31/eYN2f3SDcIByhHKAaoNqfneCeHxYgkV6SYBNe1Z/Y3l3foJ6inmSepRzlXqVcpZ7l3GZfZRwkH+NbomAhGyBgYdojYGNYYuDh2F8g3FjY4NTcEWCR3xMgFB8UIBQe02ASHpDgEB/OH4xgTJ+MYU0fEWCZH18eI2AlG6TgY9qjIKLbIuCi2uIg4ZngYN4ZmuEYGhfhGNqYoNjaWGDYWpihWNpZoVnaGiFamdvhXNnc4V1ZXuFf2KBhINihYSGYoeEiGKJhIlhiISIYoaEhmOIg4ZjhYOEZYOEgWaAhn5leYZ2ZHOHcGlvhmh2ZoVphG2AcI5teW6SmHWtjLJ4s4e4fLyCvH29gL1/voG+f76BvX68frt/u3u7gLt4toOwdqeEnnaehZZ2i4eAdIGEgG+BhYBve4V5dHiFdnlzhHJ+b4VyfXCFcHtyhHJ5doV3dH+EhG6AhHtofoSFZIuCi2WKhIlkioSKZIqFi2WKhYZlhISDa4GEgG+Ag4ByfoN+dYCBg3+BeXuLeHF3lXNtcJVsa2yWbGtslmpsaZZpbGmWaGxmlWlsaZVoa2iVaWpslXVpgJSJbIyOi3SMhIp7hn2Ef4R6hn2KepJ9lXeSfZByj4COc42Ai3OLgol1h4GIeIp/jHuQfJKCknmThpF5kIeQeo+GjnqPh454joqNdoyMi3aLi4t2j4eQeY6Di32Jf1v/W/9b/1v/Wf9Z/1b/VP9S/07/Tf9K/0f/Rf9C/0D/QP8+/z3/PP85/zn/OP83/zX/Nf81/zX/M/8z/zP/M/8z/zP/M/8z/zL/Mv8y/zL/Mv8y/zH/Mf8y/zL/MP8w/zD/Mf8x/zH/Mf8x/zH/Mf8x/zH/MP8w/zD/MP8w/zD/MP8w/zD/MP8x/zD/MP8v/y//Lv8u/y3/LP8s/yz/K/8r/yv/K/8r/yv/Kf8p/yn/Kf8p/yr/Kv8p/yj/KP8o/yj/KP8p/yj/J/8p/yr/Kv8q/yr/Kv8r/yv/K/8r/yv/LP8s/yz/LP8t/y3/Lf8t/y7/Lv8t/y3/Lv8u/zD/MP8x/zH/MP8w/zD/MP8x/zL/NP80/zT/Nv84/zj/Of86/z3/Pv89/z7/P/9B/0L/Qv9D/0T/Rf9F/0T/RP9E/0P/Q/9C/0D/Pv8+/z3/Pf89/zz/PP87/zv/O/86/zr/Ov83/zf/Nf8y/zL/Mv8y/zH/L/8v/y//Lv8t/y3/Lf8t/y7/Lv8t/y3/Lv8t/y7/Lv8u/y3/LP8s/y3/Lf8z/1P/aP9a/1f/Wf9e/2n/Uf8j/yX/Kv8s/zP/Pv9G/0j/RP9D/0L/QP88/0H/Sf9S/2b/cP9w/2v/YP9b/17/Xf9d/1T/K/8f/yH/If8i/yX/Kv82/1H/ZP9i/2P/Zf9a/0b/MP8s/yn/Jf8k/yL/I/8j/yT/JP8m/yj/Kv8v/zn/O/84/zT/NP80/zT/N/87/z3/Pf8//0L/Qv9F/0D/O/86/zj/Nv83/zb/Nv83/zX/MP9L/3X/ff90/2v/af9t/3H/dv96/3X/Yf9b/1//Wv9f/2f/S/8o/yj/K/8u/y3/Mf8w/zP/OP86/zf/PP9G/0X/Pv87/z7/Pv9H/03/Vv9Y/1T/U/9T/1P/UP9R/1P/Uf9V/1r/Xv9e/13/Wv9a/1n/Wf9Z/1j/Xv9k/2D/T/9D/0L/Pv8//0b/Uv9V/1X/Vf9W/1j/Yf9g/1v/af+A/4D/fP93/3X/c/91/3P/av9g/2L/a/91/3j/WP9G/0v/WP9v/33/hv+P/5H/kv+R/5H/kv+S/5L/jf+H/4D/fv96/3r/gf+J/4//jP+K/4P/eP9z/2n/ZP9f/2L/Zv9m/2b/Yv9d/1b/Uf9K/0H/OP80/zb/Tf9s/4T/kf+S/5L/j/+L/4r/if+J/4f/gf98/3L/ZP9i/2D/Yv9j/2L/Yv9g/2H/Yv9k/2f/bP9w/3T/d/97/3z/f/+B/4X/h/+I/4n/iv+K/4r/iv+I/4j/hv+F/4L/gf9+/3//ff99/33/fP94/3P/bv9q/2b/Zv9f/2j/bf9w/2v/b/+f/6//tP+4/7v/vv++/77/vf++/77/vf++/73/vP+7/7v/u/+6/7X/rP+m/53/if96/3r/ff9//3//fv96/3j/dv90/3L/b/9t/2v/aP9o/2r/av9s/2r/b/95/4H/ff92/3v/gv+L/4r/if+K/4r/iv+L/4r/hv+F/4T/g/+B/4H/gf9+/37/gP+E/4L/ev93/3X/cP9u/2v/av9p/2n/av9p/2n/af9o/2b/aP9o/2j/aP9q/3D/d/+B/4n/jP+K/4z/iv+G/4T/hP+I/4z/lP+X/5P/kf+P/43/jP+K/4n/iP+I/4n/jf+P/5L/k/+S/5L/kv+S/5P/l/+Y/5P/jv+O/4z/jP+L/4v/i/+P/5D/jv+L/4n/W4BbblyAXG5bgFluV35Wb1N9UXBOfUxxSn1IckZ9RHNAfT52PX08dzp+OXk3fjZ5NX41eTR+MnkyfjJ5M34zeTJ/MnkyfzJ5MX4xeDB+MngyfjJ4Mn4yeTJ/MnkxfzF5MX4xeTB+MHkwfjB5MH4weTF+MXowfjB6MH4wezB+MHsvfi97MH4vey5+Lnwufi58LX4tfC1+LHwsfix7K30qeyt9K3sqfSp7KX0pfCh9KHwpfSl8KX0pfCh9KHwpfSl8KH4ofCh+KXwofSl8KX0pfCp+Knsqfip7Kn4reyt+K3srfSx8LH0sfC1+LXwtfi18LX4tfS1+LX0tfS19L30xfS59LnwwfTB8MX0xfTJ9Mn0zfjN9M34zfTZ+Nn03fjd7OX05fDx9Pnw+fkB9QH5BfkF+QX9BfkF/QX5Afj9+P349fT59Pn88fDt+O306fjp9On46fDl+OXs5fjh6Nn42ejV+NXw1fjJ8Mn4xezF+MXswfTB8MH0wfC19LXwtfS18Ln0ufC59LnwufS18LX0tfC19LXwtfC18LXwufS9+OH1XgmN+XIJYf1mBY39ke0CDIXolhSl9K4YxgjuDRoRJgEKDQH5Agj58PYRAekWEVX1qf3OCcnhti2t0aY5odWmNZXhEiiF5IocieyOFJ38uhT9/XoZpf2WGZH1ih0x7M4cqfCuJKX0lhyN9IYcjfyKGIn8jhiZ/KIUrfi+FN305hzZ8NoY2fDaEN3s5hD17QIRCe0OGRnpIh0d6Qok/ejuJOHw3hzZ+NoU1fTSEM35Jgn6AeX5ygm18aYJsfnGCc4B5gHWCZH9bhF5/XYRhfmGHRH0kiCl8K4orey2NLnowjjR6N486ej2POXs+j0p8RpA8fTmQPX5FkEyBUJBUhFiPVYdSj1KIUo5OiE2OT4hOjVCIU41WiVuLWopYi1qKWotbilaMVIlajGGJXYxOh0iMRoNDjUOBRIhMfVKDVXpVe1Z5Vn1femCCYXxyhX9+fIN4f3eDdn90g3aAdIJkgF1/YH9ngmx9c4NzfVaBT3tefXN8g3iOe5F0kXqPdo55jHiNeYx3iH2FdH1/cXNvgHR0doF5b4GBjGWOgotghoKAX32CemZ4gXlse4B9aXyAemh3gnJpa4JmbVyBVnNLgEZ7S35be3GAh3aUgJJvj4GMbYiCiW6HgoZthYN8a3iDa2dhhGFnZIRiZmGDY2Vjg2VmaIRpZ2uEbmVxhXVjeYV9Yn2Ef2OChIVih4SKZIqEimSJhIpmiISHZIiDhmKFg4NhfoR6Z3aEdm53hnZzdoV1dnOFbXtohWKCXIJfkGR9YZhjdGecbW6CnKFwq5GzeLiGu329g71/vYG+fr2Atn6+f799vn+9fr19vX69fbyAtHyqiKB/hYtzgHSKeYB5hnl5eoV7d3qGeHp1hHJ/cIRrhWeCZodmgmmIaoNohmSEZYRthG59d4V7dXeFd218hIJrh4OLaYiDiGeKg4tliYOGZYeEhGaDhIRqgoSBbICEgHGAg4R7gn17iHd0dJBybnCUbGxslWtsa5VqbGqUaWxplGdsaJVobGiVaWtplWtqcZV8aYSUim2NjYp1jYKKfIV8hH+De4h9j3mVf5Z0lH+Sco+AjnOMgIpziYGIdYuAi3mPf5F+k3yUhZN5koeTeZOFmHyhfqGAm36Sf46Gi3iLi4t0jIuMdI+HkXmPgYx9ioFe/17/XP9c/1v/Wf9X/1b/VP9S/0//TP9K/0j/Rf9F/0P/Qf89/zz/Ov85/zf/Nv82/zX/NP8y/zL/Mv8z/zP/Mf8x/zH/Mf8x/zH/Mf8x/zH/Mf8x/zH/Mf8x/zD/MP8v/y//MP8w/zD/MP8w/zD/Mf8x/zD/L/8v/y//L/8v/y7/L/8u/y7/Lf8t/y7/Lv8s/yz/LP8s/y3/Lf8q/yr/K/8r/yr/Kv8p/yn/KP8o/yj/KP8o/yj/J/8n/yj/KP8n/yf/J/8o/yn/Kf8p/yn/Kf8p/yn/Kv8q/yr/Kv8q/yr/K/8r/yv/Kv8q/yz/Lf8t/y3/Lf8t/y7/Lv8t/y3/L/8v/zD/MP8x/zH/Mv8y/zT/NP81/zX/Nv82/zf/N/85/zr/O/88/z7/Pv8+/0D/P/8//z//P/8//z7/Pv8+/zz/O/86/zn/Of85/zj/OP84/zj/N/83/zj/OP82/zb/Nf81/zP/Mv8y/zH/Mf8x/zD/MP8w/zD/L/8t/y7/Lv8t/yz/Lf8t/y3/LP8t/y3/Lf8t/y3/Lf8t/y7/L/8w/z//X/9j/1j/Vv9Z/2L/Yf8u/yP/J/8n/yv/Lv83/0P/R/9G/0L/Qv8+/zv/PP9E/1j/dv99/3P/av9n/2L/bv90/13/L/8g/yH/JP8n/zH/SP9o/23/bf9s/13/N/8q/y3/Kf8n/yX/I/8i/yH/I/8l/yP/JP8m/yr/Lf80/zb/Nv82/zb/Nv83/zn/Pf9A/0T/Rv9I/0j/R/9D/0D/PP85/zj/Nf80/zT/Mf86/3P/gv91/2//bv9x/3P/dP95/3n/Yv9e/2D/Xf9h/2f/Sf8l/yX/Kv8v/zn/Ov83/zj/Pv8+/z//Qf8+/z3/Rv9E/z//Pf9A/0b/Tf9O/0z/Tf9M/0v/Tv9R/03/TP9O/0//T/9R/1L/U/9W/1f/V/9b/1z/Vv9U/1X/V/9V/07/S/9L/0f/Rf9F/0j/Tv9V/1X/Vv9W/1z/ZP9q/33/fP92/3X/c/91/3X/df91/2H/Xf9i/2L/Zf9r/3P/b/9f/2n/e/+J/43/kP+N/4v/iP+G/4b/h/+E/4D/eP9r/2j/bf90/3L/eP+F/4v/jP+K/4f/hP+E/4b/iv+O/43/jP+L/4f/gf97/3T/bP9m/1z/XP9f/23/e/+L/5L/kf+N/4r/h/+H/4X/hf+E/33/dP9m/13/Xv9f/2L/ZP9j/2b/Z/9r/2z/cf91/3f/e/9//4H/hP+F/4f/iv+M/4z/i/+L/4r/i/+K/4b/hP+A/4H/hf+B/3f/bv9q/2r/a/9s/2r/ZP9b/1f/VP9R/1L/Vf9T/1f/YP+C/5//of+q/7b/s/+1/7v/uP+4/7z/vv+8/73/vf+//73/vf+9/73/vP+5/6b/ff9p/23/cf90/3X/dv92/3f/dv91/3L/b/9u/2v/af9k/2n/cP9v/3D/a/9m/2z/dP9z/2r/Zf9r/3D/df92/4H/iP+I/4v/i/+H/4b/hv+F/4X/hf+F/4P/gv+C/4D/g/+C/33/d/91/3L/cf9s/2z/a/9r/2r/af9p/2n/Z/9o/2n/af9p/2n/a/9x/3v/hv+L/4z/i/+L/4r/hf+B/4T/if+T/5b/lP+T/5H/j/+N/4v/iv+K/4n/jf+P/5H/kv+T/5P/kv+R/5H/k/+c/6P/pP+c/5D/jP+K/4z/i/+M/43/jv+Q/47/jP+K/12BXW5cgVxvW4BZblh+V29UflJwUH5OcUx+SXJHfkRzQn0/dzx9O3g6fTl6OH43ejZ+NHkzfjN5Mn4yeTF+MXkxfzF5MH8weTF+MXkxfjF5MH4wejB+MHowfzB6MH8wei9+L3kvfC95Ln0ueS59LnkvfS96Ln0uei59LnsufS57Ln4ufC5+Lnwtfi18LX4tfCx8LHssfCx6LX0teyt8K3sqfSp7KX0oeyh9KHwpfSh8Jn0nfCh9KHwmfSZ8J30nfCZ+Jnsnfih7KH0oeyh9KHspfSl7KX0peyh9KXsqfSp7Knwqeyt9K3wrfit8LH4sfCx9LHwtfS18LH0ufC19LXwwfTB9MH0wfTF9MX0yfTJ9Mn0yezJ9MnszfjR7NX42ezd+N3w4fjt8PH09fD19PXw9fj18PH48fTx+PH08fjt9On46ezp+Ons5fzl9OH84fTd+N3w2fjh8OH44fDZ+NXw1fjV8M34zfDJ+MXwwfjB8MHwwfDB8MHwwfS98L30vfC58LnstfC17LHwsfC58LXwtfS18Ln0ufC59LX4tfi1+MYBGf2SCXoBVgVZ/XX5oflZ4JYQmeSeGJn4ohCuDM4M/hEmAR4RBfj+EP3s8hDp8Q4NegHF+aoZqd2KLYXdwi3N7cYtNeSOJH3kjhid9M4VOgG2FcH9xh256UIkteS2KLHwpiCR8IoYifSGGIX4ihiN/IoYigCSEKX4shDB9NIU1fTaFNn03hTh8OoU9fECFRHtIhkp7SIdHekGJPnk9iTh6N4g1fDGGMXwwhl5/gIF4gXR9cYF0fnWBeoF8gX6DZ4BZg19/XYVifmeFVX0miCx8KYotezSMPXpHjkV6SI9Me0+PSXpHjkR+RY5Jf0WORoBFj0SCRZBLgkyRSYNGkkOERZFKhkuRSYZJkEuGTo9ShlSPUYhRjVKJVY1ZilmMXIlcjFWJUoxUiVGLT4hQjE+GS4xIg0aLRYFMh1N8Vn9XelV7WXlkgHN9e4J3fnKDc352hHZ+doR3f3KDX39bgV9/X4Bhf2eBa35xgHR+dHqCfYxxjHyNcIx6iHSEeYN2gnuDcoV+gXB5gGV0Y4BoeW+BbHZtgXtuhYGLZo2Ci2GLgothjoKTZJaBlWWWgpNkj4ONYIiDg2J8gndmb4FsbHGBeHGEgY5vk4KPbIuCiW2GgoRuhIKEboGDe2pvhGBrWoNfaWCDXmlig2dkaoNuY3GEc2R2hHxkfYOAZIaDiGSJg4ljioOMY46Ei2SLhIlkiISHZoeEg2h+hHdoeoR9ZXyEe2RzhmZtWoRad1iDVHxQgE2CV35QjUd6UZdecmqabG6JlaNuqI+tdLWIuXq7g7J+jIWYf5yHrH6+g759v3++fb5/vX69fbx+vX63h6KGco1ZjmOIaY9shHCJcIRxgHSEdIB0hHR/coRxgXCDboZrgGeKaoFvi26Bb4pwg3CKbYRxhHaGbX1ciFt2YIZlcm2DenCIgIpri4GIaIWDhWWFhIVmhYSFaIWFgmmChYJpgoOEc4OAfoF4eXWJcnNvkGxva5VqbmyUaG1ok2ltaZRpbWiVaG1olWhrapVvaXWVfWiHlIxui4uKd4t/iH6EeoJ+h3qQfZR2lX+Sc5CAkHOPgI5zjX+Lc4uAjXaOf5B6k3+UgZR7koWReZCIkHmShpl9o3uihJd6joOMhot5ioqLdI2MjXSPho95jYGMfoqBXv9e/13/Xf9b/1n/Wf9X/1b/U/9R/0//TP9K/0j/RP9C/z//PP87/zr/Of84/zf/Nv80/zP/M/8y/zL/Mv8y/zH/Mf8w/zD/L/8v/y//L/8u/y7/L/8w/zD/MP8v/y//Lv8u/y7/Lv8v/y//L/8v/y//L/8t/y3/Lf8t/y3/Lf8v/y7/Lf8t/yz/LP8s/yz/LP8s/yz/LP8s/yz/Kv8q/yr/Kv8o/yj/KP8o/yj/J/8m/yf/KP8o/yf/Jv8n/yf/Jv8m/yb/J/8o/yj/KP8o/yj/KP8o/yn/Kv8q/yn/Kf8q/yr/K/8r/yv/K/8s/yz/LP8s/yz/Lf8s/yz/Lv8t/y7/Lv8w/zD/Mf8x/zL/Mv8y/zL/Mv8y/zP/NP81/zb/N/83/zn/Ov87/zz/PP89/z3/Pf88/zz/O/87/zn/N/83/zf/N/83/zf/N/83/zf/Nv82/zX/NP80/zT/Nv81/zP/M/8z/zP/Mv8x/zH/Mf8w/zD/MP8w/zD/MP8v/y//L/8v/y7/Lv8v/y//Lv8u/y3/Lf8u/y7/Lv8t/y3/LP8u/zP/UP9n/1n/Uv9Y/2L/Zf9G/yP/Jf8k/yP/JP8o/y7/O/9F/0n/Rv9A/z//Pv8+/0j/Y/9w/27/Y/9l/2v/aP9r/2b/OP8h/yT/KP8x/1D/b/9w/2//a/9H/y7/LP8p/yb/I/8i/yD/If8h/yL/I/8i/yH/I/8o/yv/Lf8x/zT/Nv83/zn/Ov88/z7/P/9B/0X/Sf9K/0n/Qf89/z7/Pv86/zX/MP8v/1v/ef94/3P/cf90/3j/fP97/37/cP9W/1z/Xv9g/2j/Xv8s/yn/LP8s/zD/Ov9D/0T/Rf9P/1H/U/9Y/1P/Tf9R/0//Q/9J/07/Tf9H/0b/R/9F/0T/Q/9D/0T/Sf9J/0j/R/9N/07/VP9V/1T/Vf9W/1j/Wv9e/1//Wf9U/1P/Uf9P/0//Uf9P/0z/SP9E/0j/Uf9W/1f/WP9b/2b/df96/3T/cv9z/3P/dP91/3f/cv9f/1v/XP9g/2D/Yf9n/2//fP+B/4v/jf+M/4z/iv+H/4T/gf+B/4P/hP+A/3f/ZP9i/2T/bP9q/2L/cf9//4n/jP+O/4z/kP+S/5b/mf+a/5n/l/+U/4//jv+L/4f/g/9//33/f/+F/4r/j/+R/43/iv+I/4X/hP+E/4P/gf97/23/Xv9b/17/Xv9e/2X/af9u/3L/d/96/3z/f/+D/4f/iv+M/4z/jP+M/4z/jP+K/4n/iP+F/4L/gf9//3v/ef90/3H/df95/3z/dv92/2z/ZP9b/1T/Xv9h/0b/RP9s/5L/mv+Z/6f/sv+3/7j/uP+5/77/pv93/5n/jP+R/7v/vv++/7//vv++/77/vf+y/43/Xf9S/1f/Xv9j/2f/a/9s/2//cf90/3P/c/9y/3H/cf9y/2//bP9v/3L/b/9t/2v/a/9s/2//b/9v/2H/T/9S/1b/YP90/4b/iP+L/4j/hf+F/4T/hf+F/4X/hP+C/4L/gv+D/4T/g/+A/33/eP90/3D/bf9s/2v/af9o/2j/aP9p/2n/af9o/2j/aP9r/3D/d/+A/4n/jP+L/4z/i/+I/4T/g/+L/5L/lv+T/5L/kP+Q/5D/jv+M/4v/jP+M/4//k/+U/5X/kv+R/5H/kP+Q/5L/mf+g/5//l/+N/4z/i/+L/4v/jf+N/4//j/+N/4z/iv9egV5sXYFdbluAWm5ZfldvVH5Tb1F+T3FOfkpySH5Fc0N9QHY8fTt3On05dzd+Nng2fjR5NH4zeTF+MHkxfjF5MH8weTB/MHkvfi96Ln4uei5+LnoufjB6L34vei9+L3oufi55LnwueS59LnkufS55Ln0uei19LXotfS18LH0sfC1+LX4rfit+LH4tfix+LH4rfit9K34qeyp9KnspfCl7KX0peyh9J3snfSl8J30nfCh9J3wnfSd8Jn0mfCZ9JnwmfiZ7J34neyd9J3snfSd7KH0oeih9KHoofSl6KX0peih7KnsqfSp8LH0sfCt9K3wsfSx8LH0sfC19LXwtfS58MX0xezF9MXsyfTJ7MX0xezN9M3szfTN7M34zezV+NXs1fjZ6N345ejh9Onw6fTp8On46fDh+On06fjp8OH44fDh+N3s3fjd7Nn02ezZ9Nns2fjZ8NX40fDR+NHw0fjN8M34zfDN+MnwyfjJ8Mn4yfDF+MXwxfjF8MH0wfTB9L30vfC98L3wufC98L30ufC19Ln0ufC19LXwufS1+LX4tfi1+L382gVuBYoJSgFGAV39hfGKAOXgihCN6I4UifiKDJ4IsgTaDQoBIhEeAQ4RCf0KDP35QgmeCYn9Yhlp+XYdnfmuIbntahyh6IoYlfC2FRn9mhG1+aoVmfECIK3osiid8JogjfSGGH34ghSF+JIQlfyOEI4AihCR+KIQrfS2EL30zhTN9NoU6fDyFPXw9hT57QYZGe0mHS3pDiT95P4lBejyIMnw1hmB9d4NygGyAc4F0gHiBeoF8f3yBdX9bg1p/XYRdf2SFZ346hit9K4ksfC2LLnw2jD18QY5He0+PVH5YjWZ/YopXgEmIQ4FEjE2CTI5JgkeQRYFCk0CCQZNCgkKUQ4RHk0mFR5JIhUqRToVTkFaGV49Xh1mOWolajV2JYY1dilmLVYpTi1KJUoxTiU6MTYZIi0SCRYlNfVWBWHpae1t5ZoBzfHaCcX1zg3d8eIR2fHWEdn9xg2B/W4Fef11/YH9kf2d+c3t/f4hzkX6Qbo9+jW+JfoZxhH6DcoN/hG+DgX9wdIBidGOAY3hpf2l7Xn9qdXt/h2yMgY5ijoGQYZKBlWSZgZpkmoKaZZeDlmWSg5FmjYKMZomCh2WGgYpnjIGQaY+Di2uKg4hsh4KHa4WChWt/g3dsaIRacFSDWHNeg2JzaIJrb2+Cc2l7g4FnhIKGZomCimSOgo5kjIOLZIyDi2SKhIdlh4SDZYKFfmV9hXpneoR6bXWEZ3Vcg2FucoRtX26HZ1lliF5jX4Vxd3N+SYpadZmTrHOxirR1uYW7e7uBvXu+gLx9u4S1fayFuHmwhLN7vIK+fr5/vn6/f76BuoSnjXWQSIxFmk+DUp9YflyYYH9kkmuCb4lwg3CEcINyg3KEcYJzgnaFdn9yinKAeIt0g2yKZ4RnimmGbohyh3KDaYhSgkGHTX1Xgm95g3+HdIuAiG6FgYNrhIOEaoSDhGqDg4NngoOCZ4SEg26Gg4J5fn96gnd6copuc2yPbHBpkWhvaJNobmiUaG1olWhtaJVpa22VcWl6lYRpi5KLcIqIjHiLe4h+hHmFfo54lH2VdZN/knORgJFzjoKNcoyBi3OMgI53kH+VfJd+lYKRepGHj3qQh5B6k4KbfqB9nISWgI5/ioiKeYqMjHSMjI10jYaPeY2BjH6KgV7/Xf9d/13/W/9a/1n/V/9V/1T/Uf9O/0z/Sf9H/0X/RP9C/z3/PP86/zn/N/82/zb/NP8z/zP/Mv8x/zH/Mf8w/zD/Lv8u/y//L/8u/y7/Lv8u/y7/MP8v/y//Lv8u/yz/LP8u/y7/Lv8u/y7/Lv8u/y7/Lf8t/y3/Lf8s/yz/LP8s/yv/K/8r/yz/K/8r/yr/Kv8q/yn/Kf8p/yn/Kf8o/yj/J/8m/yf/KP8n/yf/KP8n/yb/Jv8m/yb/Jv8m/yb/Jv8n/yf/J/8n/yf/J/8n/yf/J/8o/yj/KP8o/yj/Kf8q/yr/Kv8r/yv/K/8r/yz/LP8s/yz/Lf8t/y7/L/8x/zH/Mf8x/zL/Mv8x/zH/M/8z/zP/M/8z/zP/Nf81/zX/Nv83/zf/OP84/zn/Of85/zn/Of84/zj/OP83/zf/N/82/zb/Nv82/zb/Nv82/zb/Nv80/zT/NP80/zT/M/8z/zP/M/8y/zL/Mv8y/zL/Mf8x/zH/Mf8w/zD/MP8v/y//L/8v/y//MP8w/y//Lv8u/y7/Lf8t/y7/Lf8s/yz/K/8t/y3/Pf9i/1z/VP9V/1r/X/9X/y3/H/8h/yL/If8j/yL/KP8y/0L/Sv9K/0j/Q/9C/0H/WP9f/0//TP9P/1f/X/9o/2v/Q/8e/yP/Kf85/1n/aP9p/2L/Qf8s/yr/Jv8k/yL/IP8f/x//If8k/yT/I/8h/yH/I/8k/yf/K/8t/zD/M/82/zn/PP89/z3/Pv9B/0T/SP9J/0f/Q/9B/z//OP9M/3D/dv9t/23/bP9w/3b/dv95/3r/c/9f/1n/Xf9c/17/Zf9J/yn/Lf8s/zH/Mf8w/zX/Of9A/0j/T/9X/2H/a/9o/1f/Sv9H/0r/Tv9O/0r/Rf9B/0D/Pv8+/z//P/9C/0T/Rv9I/0n/TP9N/0//U/9W/1j/Wf9Y/1r/W/9d/17/XP9Y/1j/V/9X/1T/T/9O/0r/Rf9E/0f/Uf9X/1n/Wv9l/3L/dv9z/3b/ev95/3j/df93/3L/X/9Y/1n/XP9f/2T/a/94/4P/jv+Q/5H/j/+M/4n/hv+D/4P/gv+E/4L/fv9x/2L/Yf9j/2b/Z/9d/2j/e/+H/47/jv+N/5D/kv+T/5j/mf+a/5r/mP+W/5X/kv+Q/4//i/+M/43/jf+N/5D/j/+M/4n/if+H/4f/hv+E/37/dv9o/17/V/9V/2H/av9n/2j/b/92/33/hP+J/4v/jf+O/4z/jf+M/4v/if+G/4T/hP+B/3//ff99/3n/dP9v/27/av9d/1P/Sf9l/27/bv9w/3X/aP9V/1z/av9M/2//pv+0/7j/u/+9/7//v/++/7v/tP+z/7f/uv+7/73/vv++/7//v/+9/7v/sP+X/2T/Rv9L/1P/Uf9P/1H/Vf9a/17/Yv9n/2r/bf9w/3L/cf9y/3L/df95/3n/cv9z/3f/cf9w/3D/b/9x/3f/dv9z/2j/S/9F/1n/cP+E/4j/i/+D/4H/gf+C/4T/g/+E/4P/g/+D/4P/hP+F/4f/gv+A/3z/ef91/3D/bv9s/2v/aP9o/2j/aP9o/2j/aP9o/2n/bf9y/3v/hf+L/4r/if+M/4r/h/+E/4n/kv+V/5X/kv+R/5H/kf+P/43/jP+M/4z/jv+R/5b/lv+T/5H/kf+P/4//kv+Y/53/nP+Z/4//jP+L/4v/jP+M/47/jP+O/47/jP+M/4r/XoJebl6BXm5bgFpuWoBYblZ/U25Rf09wTX5KcUp9R3JFfUJ2QH0+eDt9OXk2fjZ4Nn40ejN+M3oxfjF5MX4xeS9+L3oufi16LX4tey1+LXsufi57Ln4uey1+LXsufi57LH4sey18LXsufS58LX0tfC19LH0sfSx9LX0sfSx9LH0rfit+K34rfit+K38rfit9Kn4qfCp+KXwqfip8KX4pfCl+KXwofid8J34mfCZ+JnwmfSZ7JX0leyV9JXslfSV7JX4leyR+JXsnfiZ7J34neyh9KHonfSZ6J34neyl+KXsofSh6Kn0qfCp9Kn0qfSp9K30sfCx9LHsufS58Ln0vfDB9MHwxfTF8Mn0xfDF9MXsyfDJ7M3wzezN8NHo0fjR6Nn42ejV+NXs3fjd7N343ezh+N303fjd9N303ezd9N3s2fjZ9Nn42fTZ+Nns3fjd7N303ezZ9Nns2fTZ8NH0zfDN9M3wzfTN8M38zfDJ/MnwyfTJ9Mn0yfTF+MX4xfjB+MH0wfzB9MH8vfS99Ln0ufS18LX0tfC19LH0sfSx9LH4sfiyAK38tgkeCZIFXglKBVYBbgGN7VoMseCGEInofgyF+IIMigSeCMIQ8g02FUoJPhUuBR4VLgGGDXYBRgUqAS39NhFl/boRjfi6EHnslhTF9UoJkgWCAVn8/gix9JoUifSKGIn4ihiF/IYQjfyWEJX8jhSN+IoQifSSFKH0phSx8LoQyfDSENHw5hDp8PIQ+fD+HQXtCh0F6Qog+eTuISHtfhXR+cYJsgGqBaYBwgHWAdIN2f3aEcX9ggll+XINdf16DZn5fhCl+K4cvfTCJM30yjDV9OI44fDiPP35Ijlh/aYtsgl+JVYNNiE2EUIpThVWNU4NNjkWCPZA9gjySPIA8kz+AQ5RGgkiVSoRMlE2GTZFRhlOQVohZj1mJWY5XiViNXIlbjFqJWYxYiliLVIlQjU6ISY5FhEOMRH9NhlN9V4Fbe2WAbnxug3B8coR1fXaFc311hHZ/boBnf1x8WH9df19/aH1zfoB1jX6SbpGAj2uLf4tsiX6Hb4d+hm+Ff4dvhYF/cm+BYXZhf2F5Yn9leWF+bHV7f4psjn+NZY+AkGWTgJVoloCZaZmAmmqYgJdqlIKSZY+DkGOQg5Fjj4KOY4+Cj2WPgo5ni4KKZoiDiGSHg4NlfoN2amyDYm5egl92Z4FvdXOAc3B5gH1qgoGHZouCjGWNgY1mjoKMZYqCiGWJgoRigYR/Yn2Ee2N3hXVidIVzZWuFcWpvhV9qWYRwY3OFbVdriGxJc4hqVlqGWHVbfVeKdXOqkLh3uoS8fb6Bvn68gbh/sYaqfrWHuny8gr58voG9fr6Bv3+7gLSIm4tyj1GYS4pUoFSAUZ9Nek6fTnpOnlN6VppcfWCTZIBpi2yCb4ZvgnCFcIFzhXl+g4iBfnaId4N3hnOGc4Zth2mHcIdyhnCIb4BhiEJ/S4Fwf4R9iX2Ifn96f4GAdoCCgXOCgoJug4OEbISEhGiEhIdqiIOFcoGCfnt7f3iAdXxzh292bI1qcmiRaG9ok2duZ5VnbWiVamptlnNofpWIaIuQjHGJhYp6iHuGfod4jX2VdJV/k3OQgZB0kIGQdI6BjHOMgYt1jICPepR/lX+TepGGj3eOh414kIaWep1+nYOYfZSDj4WMe4mKineMjo50i4yHdI+Hj3iNg4x8ioNb/1v/W/9b/1v/Wv9Z/1f/Vv9T/1H/T/9N/0r/SP9F/0T/Qv8//z3/O/85/zf/N/82/zT/M/8z/zH/Mf8x/zH/L/8v/y7/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8s/yz/Lf8t/y3/Lf8t/y3/LP8s/yz/LP8s/yz/K/8r/yv/K/8r/yr/Kv8q/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yf/Jv8m/yb/Jv8m/yb/Jv8l/yX/Jf8l/yX/Jf8l/yX/JP8l/yf/Jv8n/yf/KP8o/yf/Jv8n/yf/Kf8p/yj/KP8q/yr/Kv8q/yr/Kv8r/yz/LP8s/y7/Lv8u/y//MP8w/zH/Mf8y/zH/Mf8x/zL/Mv8z/zP/M/80/zT/NP81/zX/Nf81/zf/N/83/zf/OP83/zb/Nv82/zb/Nv83/zf/N/83/zb/Nv82/zf/N/83/zf/Nv81/zb/Nv80/zP/M/8z/zP/M/8z/zP/Mv8y/zL/Mv8y/zL/Mf8x/zD/MP8w/zD/MP8w/y//L/8u/y7/Lf8t/y3/Lf8s/yz/LP8s/yn/Kv8q/yr/MP9R/2b/Vf9Q/1b/XP9i/1v/Lf8d/x//If8g/yD/IP8m/yv/Of9I/1H/VP9N/0n/Uf9l/1z/Tv9O/1D/U/9l/3T/S/8h/yT/L/9O/2H/Wf9V/0v/O/8n/yL/Iv8i/yL/If8h/yP/Jf8l/yT/I/8j/yL/JP8n/yn/Kv8s/y//Mf80/zb/Nv84/zv/O/87/zz/O/83/0n/Y/9y/3P/bf9m/2f/av9v/3D/df97/3f/bf9h/1r/Wf9c/17/YP9k/0D/Lf8s/y//MP8y/zX/OP85/zf/M/82/0H/Uv9c/1X/S/9I/1D/Uv9V/1X/V/9a/1X/TP9A/z3/O/86/zr/Pf8//0T/R/9M/0z/Tf9N/0//Uv9W/1n/Wf9Z/1j/Wf9a/1r/WP9V/1X/Vf9T/0//TP9J/0T/Qf9C/0j/T/9W/1j/Yv9q/2r/av9s/3D/c/9x/3P/cv9r/2X/X/9Z/1r/YP9v/3v/h/+Q/5T/kv+P/4v/i/+J/4f/if+J/4n/if+G/4H/b/9h/2H/Yf9l/2v/af9x/4X/j/+Q/47/j/+Q/5L/kv+T/5b/lv+X/5X/lP+Q/4z/i/+L/43/j/+R/5H/kf+P/47/jf+M/4r/iP+I/4f/g/+A/3n/cv9u/2r/aP9u/3n/fv+B/4X/hf+J/4z/jv+O/47/jf+L/4r/iP+H/4T/gP99/3r/d/91/3b/cv9y/3L/b/9u/3D/cf9y/27/b/9x/23/a/9o/2b/Wf9T/1//Y/98/6n/t/+6/73/vf+7/7r/tv+v/6X/sP+4/7v/vf++/7//u/+2/6n/fv9V/03/Uv9S/1H/T/9M/03/Tv9P/0//T/9R/1b/W/9f/2P/Z/9r/3D/cf9x/3L/dP98/3z/d/9x/3P/eP9x/2r/YP9t/3b/eP93/27/XP9h/3n/hP+J/4T/ff99/3//f/+A/4D/gf+C/4T/hP+E/4X/iP+G/4X/g/+A/33/e/93/3T/cf9t/2z/aP9n/2f/Z/9n/2j/aP9p/23/df9+/4j/i/+L/4j/if+I/4f/if+R/5X/k/+R/5D/kP+Q/5D/jv+M/4z/i/+N/5H/lP+V/5H/kv+P/43/j/+S/5v/nv+a/5P/i/+L/4z/iv+K/4v/jP+K/4b/jv+O/43/jP+K/1qCWm5agVpuWoBZblmAV25Uf1NuUX9PcE1+SnFIfUVyRH1CdD99PXY7fTp3OX43eTZ+NHkzfjJ5Mn4weTB+MHkvfi96Ln4tei1+LXstfi17LX4tey1+LXstfi17LH4seyx+LHssfCx7LH0sfCx9LHwsfSx9LH0sfSt9Kn0qfSh9K34rfit+K34pfil/KH4ofSh+KHwofid8J34nfCh+KHwofih8J34mfCZ+JnwlfiV8JH0kfCR9JHwkfSR9JH0kfSR+JHwjfiR8Jn4meyZ+JnsmfSZ7Jn0meyd+J3sofih7KX0peil9KXwqfSp7K30reyx9LHosfSx7Ln0uey99MHswfTB7MX0xezJ9MnsyfTJ6MnwzeTN8M3kyfDN6NH40ejR+NHo2fjZ7Nn42ezZ+Nns3fjd6Nn42ejZ9Nns2fTd7N303ezd9Nns2fTZ8Nn02fDd+N3w2fjZ8NX41fDR+M3wzfTN7M30zezN8M3szfDN7Mn0yfDF9MXwxfjB8L34vfC99L30vfS99L30vfS59LX0tfS19LX0tfSx9LH0rfSt+LH0sgCt9KIEpgTWCX4Jig1OBUIFVf1yAZnxhgjJ4HoQgeB+FH30fhSJ/KIQqgjeEQ4RShFSET4JKhFuCaYNbglCBS4RRgVqEcH9rgzV8IIQsfkqEY4JdgVSCTYBHfyqBIn0ihCJ+IoQhfyKEJH8lhCV/JoQlfyOEJH4khSd9LIUrfCqEKnwuhC98L4QxfDKENns5hDh7NIQxe0+Dd3xwgW1/Z4JkgGaCaYBtg3B+cIN3gHCDbX9jhFx+WYNafV2DXn9ghFF+MYYvfi+IMn0yizV9OIw8fTuPOnw4jzx+PY5LfkWMPYE7i0WEUYxXhlaMWIdajFyFWo5RhEaQPoI7kjuAO5M7gD2UQoFGlUyCTpROhU2TUIVQklWHWpBaiFmPWYhbjVyIWY1ViFGNT4lPj0yJS49KiEiQRIVDj0GBQ4xLf1KGV3xgg2d8Z4NofGqEbX1vhm19cIRtf2SAY39ie1x+WnpkfnN4gX+OcpJ/kmySgI5ri3+LbImAiG2LgIxsjH+KbomBg3FzgWJ2YH9ieWh9cnl1fX1zjH6RbY+Aj2iOgI9nkICPaZGAkmuTgJRtk4CRcIyCiG+EgoRuh4KNapGBkmmRgZBokYKRZ42Ci2aKg4lliIOFZIGDe2Z5g3hoc4JyaniBf2uEgIZriYCLZ46Bj2eOgo9njYGLZoeCg2WBg4BjfIN8YXqEeV93hHNdcYVwXW+FbVtwhnBda4ZqXWuGblpwh3FUbYhpUmWIalhjhV5lY4Bff3Z1pY21d7qEvHy+gbx+uoO5frWFo3msi615uIi7fryBuYOxiZOLZZhKh0ygU4FSolF6UaJReVCfUHlPn095T55NeU2eUXpUnFp7XpRhfmePaYJwiXGBcoV0gnOHc391h3OAdod7gnyHdIJxiX2Cg4mIhImEf4hwgXmEgH+DgIaAfX15f3x9fHt9gH55f4F/doGCgnGDgoNthYOGaYiEhW+EhIJzgIN9d3uCd31yfnCEbnhqiml0aI5mcWeTZ25nlWtrb5R4Z4GUiGyKjIl2iH+Ie4h3iH+MdpN/k3SQgJBzkIGPdI+Bj3SOgY1zjYGNdpB/k3uWfZaCkXuQh494joiQe5eBnX+cepeCj4GIfYiJi3eKjIt1jI6Jc4SMgHSOiI54joSNfIuEXP9c/1z/XP9a/1n/WP9W/1X/VP9R/0//Tv9L/0n/Rv9D/0D/P/89/zv/Ov85/zf/Nv80/zP/Mv8y/zD/MP8w/y//L/8t/y3/Lf8t/y3/Lf8s/yz/LP8s/yz/LP8s/yz/LP8s/yz/LP8s/yz/LP8s/yz/LP8r/yv/Kv8q/yr/KP8p/yn/Kv8q/yn/KP8p/yn/Kf8p/yn/KP8o/yj/KP8o/yj/KP8m/yb/Jv8m/yX/Jf8k/yT/JP8k/yT/JP8k/yT/JP8k/yP/JP8m/yb/Jv8m/yb/Jv8m/yb/J/8n/yj/KP8p/yn/Kf8p/yr/Kv8q/yr/K/8r/yz/LP8t/y7/L/8w/zD/MP8x/zH/Mv8y/zL/Mv8y/zP/M/8z/zP/M/81/zb/Nf81/zb/Nv82/zb/Nv82/zb/Nv82/zb/Nv82/zb/Nv83/zf/N/82/zb/Nv82/zb/N/83/zb/Nv81/zX/NP8z/zP/M/8z/zP/M/8z/zP/M/8y/zL/Mf8x/zH/MP8v/y//L/8v/y//L/8v/y7/Lv8v/y3/Lf8t/y3/LP8s/yv/K/8s/yz/Kf8p/yf/Kf86/2T/YP9V/1P/Vv9f/2n/ZP80/xr/If8i/yP/I/8k/yX/K/8z/z7/Tf9T/1D/U/9n/27/Wv9O/07/U/9h/3T/WP8j/yj/Pv9h/2b/Wf9N/0L/Kv8i/yL/Iv8i/yH/Iv8k/yX/Jv8n/yX/Jv8l/yX/KP8w/y//Kv8p/yn/Kv8q/yv/K/8r/yz/Lv8s/07/cv9x/2v/aP9n/2v/b/9v/2//cP92/2n/WP9l/2H/XP9a/1r/Wf9V/1j/NP8u/y7/M/82/zb/Nv83/zn/O/83/zj/QP8//0L/O/8x/zn/Rf9P/1L/UP9S/1X/U/9R/0r/RP89/zn/Of85/zv/Pf9C/0b/TP9O/1D/Uv9U/1T/Vf9X/1n/Wv9b/1z/XP9Z/1L/TP9L/0n/Sf9H/0j/Rf9E/0P/Qf9B/0b/S/9U/13/ZP9k/2X/aP9r/2z/a/9t/2r/X/9g/2j/ZP9g/2j/d/+J/5D/kv+S/5H/jv+K/4r/if+K/4z/jP+L/4z/iv+G/3X/Yv9f/2T/a/92/3v/h/+Q/5H/kP+N/43/jv+O/47/kf+R/5D/jv+N/4v/iP+E/37/fv+D/4v/kf+S/5H/kP+O/47/jf+L/4r/i/+K/4j/hf+C/4D/f/9+/33/gP+E/4f/if+L/4z/jv+O/47/jf+N/4f/gf9+/3j/df9x/23/bf9y/3P/cP9w/3H/b/9u/23/bP9r/2z/b/9u/27/bv9j/1n/YP9l/2T/YP9a/1X/YP+e/7T/uf+7/7r/uP+4/7j/tP+u/7D/qf+y/7r/uP+s/3//Uf9M/03/Uv9S/1L/UP9P/1H/UP9Q/07/Tf9N/07/TP9O/1H/Vf9Z/17/Y/9o/2z/bv9y/3H/cP9y/3b/eP9//4b/h/+F/3r/iv+R/5L/j/+J/3//ef9//4X/g/96/3j/e/97/3v/fP99/33/f/+A/4L/g/+F/4b/h/+G/4X/hP+A/33/e/96/3f/c/9v/23/av9o/2f/Z/9n/2j/a/9w/3r/g/+I/4r/iP+I/4j/h/+J/4//lP+T/5D/kP+Q/4//j/+P/47/jf+N/47/kv+V/5X/kv+Q/47/j/+O/5P/m/+c/5r/kf+N/4v/i/+L/4v/i/+M/4b/f/99/4z/jf+N/4z/iv9ZgllvWYJZb1mAWG5XgFVuU39SblB/TnBMf0txSX9Gc0Z+RHY/fj12PX46dzh+N3g2fjR5M34zeTJ+MHkwfjB5L30uei19LXotfix6LH4seix+LHssfix7LX4tfCx+LHwtfS18K30rfCx9LHwrfSt8Kn0qfCp9Kn0qfSp+KH0ofip+Kn4pfil+KX4pfil+KX4pfil+KH4ofih+KHwofih7J34meyR+JnslfiV7JX4leyV9JXwlfSV8JH0kfSR9JH0kfSR8In0jfCV9JXwlfSV8Jn4meyd+J3wmfSZ8KH0oeyl+KXspfil7Kn0qfCp9K3wsfSx7LH0tey19L3svfTB7MH4wezB+MHsxfjJ7M34zezJ+M3o0fjR6NH40ejV+Nno2fjZ6Nn42ejZ+Nno1fjV6NX43ejZ+Nno2fTZ6Nn02ejd9Nns2fTZ7Nn02ezd9N3s2fTZ8Nn02fDV9NXw1fTR8M30zfDN9M3ozfTN7M30zezJ9MnwyfTJ8MX0xfDB9MHwvfS9+Ln0ufS99LnwufS58LX0tfS19LX0tfS19K30rfix+K4ArfSiDJ38ngyeBQoRrgWKDVIJSgVeAX39ofGOCOHgdhSF6I4ckfSSGJH4ohimBKoY2hEaDUYVUg1iEbIRpglmFUIBUg1iBaIRzgEGFKX4ziEaAT4hKgjyEL4AlgyF/IYQgfyCEIX4hgyJ/JYQmgCeFJoAkhSh+JoQofiuDL30shCh9J4QmeyiEJnokhCR5IYUqekyDcn5ugm2AaIFogWyAbYBug21/cINyf1uDS39ohWZ+YIVcf1qEWX5RhVl+TIYqfi6JMX02ijl8OYw3fTiPOH06kDd9NY83fTiPNn0zkDKAOI5EgkuNTYVLjkuHTY9NhUiQRYRCkT6AOpI4gDiUOoA+lEF/RZRMgU6UUYRUk1eFWJJWhlaQWIZakFyIXY9ciFiPUIhNj0qHTJBKh0aSRYdHkESFRZBFhESPQYJGjU1/V4hgfWGFYnxlhGh9aYVpfWuFZn5agV1+Z3dofWpycH99b46AkGyRgJBuj4GJcImAiXCJgIxvjICKbIiCim2LgoVtd4JkdF9+ZnlwfHp7f3yNc5F/k26SgI1rjYCMaIyAi2iNgI5sjoCLcImAhXCCgH91f4F9d4SBinWSgZRwkoGPb42CjGyMgoxojYKNZoyCi2OKg4hjhIGBY4OAgmKEgIhjioCMZ42AjmiPgI5pj4GNaoqBhGl7gnZob4JnaGGCXGlfhGNlaIRrXWyEcFpxhHJYb4ZvWW6GbFlsh25YbYhsWVWHQF9Nh1hhX4ZbZUiCQHZZeYyHsHe2h7l7toSve7WHt3uriK94sYmteraItoGqi4CFTpdPhFGgT3pRolF3U6BSdlKfU3dRn1B5Tp9OeUyfT3lPn055Tp5TeVWbWHxclmJ+ZpFpf22Mb31xjHR7fIuFfY6Jln6Vh5KAh4mSg5iImoWQhoiHhIN/h3+Bg4GBg3Z9doN5fHqAen96e3p/e3p+gYB3gYKCcIOChmyHhIVwhISDcoKEgHR/hH55eoJ1fnF+b4ZsemuManRpkGhvapNsbHOVfGuFkohtiouGdYZ+iX2Kd4x/j3WTgJJ0kICQc5CAj3OPgY9zjoGNc41/j3iSgJWBlX2Sh496j4iPeJODmXyefJyCln2OgYqGiniKiotyi46LcYqOhHN9jHxzjIeLd42Fi3yJg1n/Wf9Z/1n/Wf9Y/1f/Vf9T/1L/UP9O/0z/S/9J/0b/Rv9E/0H/P/88/zz/OP83/zb/NP8z/zP/Mv8w/zD/MP8u/y3/Lf8t/y3/LP8r/yv/K/8r/yr/Kv8q/yr/K/8r/yz/LP8r/yv/Kv8q/yn/Kf8p/yn/Kf8p/yn/Kf8o/yj/Kf8p/yn/Kf8o/yj/Kf8o/yj/KP8n/yf/J/8n/yb/Jv8m/yb/Jv8l/yX/Jf8l/yX/Jf8l/yX/Jf8k/yT/JP8k/yT/JP8j/yT/Jf8l/yX/Jf8m/yb/J/8n/yf/J/8o/yj/Kf8p/yn/Kf8q/yr/Kv8r/yz/LP8u/y7/Lf8v/y//MP8w/zD/MP8w/zH/Mv8y/zL/M/8z/zT/Nf80/zT/Nf82/zb/Nv82/zb/Nv82/zX/Nf82/zb/Nv82/zb/Nv82/zb/Nv81/zb/Nv82/zb/N/83/zb/Nv82/zb/Nf81/zX/NP8z/zP/M/8z/zP/M/8z/zP/Mv8y/zL/Mv8x/zH/MP8w/y//L/8u/y7/Lv8u/y7/Lv8t/y3/Lf8t/yz/LP8r/yv/LP8r/yv/K/8o/yX/I/8p/0j/bf9h/1n/V/9X/1//Z/9n/0P/H/8h/yT/Jf8m/yX/Jf8k/yf/L/87/0r/UP9c/3T/Zf9X/1X/V/9f/3L/av8y/yz/LP8o/yn/Jf8j/yD/If8h/yD/IP8h/yH/I/8k/yf/Kf8u/y//LP8s/yj/Jv8r/yn/KP8n/yX/JP8i/yL/JP8l/1f/dP9t/2//bP9s/27/b/9r/23/cv9y/0b/Pv9o/2z/Zf9c/1j/Wv9Q/1j/V/8w/yv/Mf81/zn/Ov88/zz/O/8+/zv/Nf81/zT/Nv8z/y7/M/85/0T/Sf9I/0j/Rv9G/0X/RP9C/0H/Pv86/zj/OP86/zz/P/9E/0f/TP9P/1P/WP9Z/1b/Vv9Y/1r/W/9c/1j/Vv9Q/0r/S/9L/0j/R/9G/0b/Rv9H/0f/R/9G/0P/Sf9Q/1j/Xf9g/2T/Z/9p/2r/av9j/1j/W/9j/2n/bv93/4n/kP+R/4//jf+M/4v/if+J/4v/jP+N/4v/h/+I/4v/hf95/2T/X/9m/3T/f/+H/5L/kv+R/47/i/+L/4r/if+J/4b/iP+K/4r/if+E/4D/ff98/3//hv+N/5T/lP+Q/43/jP+L/4v/i/+M/4z/iv+L/4n/if+I/4f/iP+I/4j/if+N/47/jv+O/4//j/+N/4z/h/+C/33/df9o/1j/TP9J/0//Uv9U/1z/YP9i/2P/Zv9t/3D/b/9v/27/bv9q/2X/Tv89/1L/X/9e/1b/Pv8z/07/cP+l/7T/tv+v/4v/mP+w/5f/pv+y/7D/sf+g/5j/b/9N/0//VP9d/1f/U/9U/1j/V/9V/1L/Uf9R/1D/T/9P/0//T/9P/1D/Uf9V/1j/W/9g/2j/cf99/4j/j/+T/5r/nf+h/6L/nv+Z/5n/l/+V/47/iv+F/4H/gf+B/3//d/91/3n/ev96/3r/ev97/3z/fv9//4D/gf+F/4X/g/+C/4P/gv+B/37/fv99/3j/dv90/3D/bv9r/2n/aP9p/2z/dP+A/4f/iv+I/4X/hf+G/4n/j/+U/5X/kv+Q/5D/kP+P/4//j/+O/43/jf+P/5P/lf+U/5H/j/+O/5D/lf+e/5//mv+R/43/jf+J/4r/jP+N/4z/iP+C/3f/ff+L/47/jP+K/4j/V4JXb1iCWG9XgFduVYBUblR/U25Qf05wTX9LcUh/RXNFfkF2P349djx+O3c5fjh4NX4zeTJ+MnkyfjB5L34veS19LHotfS16LX4seit+Knorfit7K34reyt+K3srfit7Kn0qeyp9KnspfSl8KX0pfCl9Kn0pfSl/KX0pfil9KX4ofih+KH4ofid+J34nfih+KH4ofid+J34nfiZ8Jn4meyV+JXslfiV7JH4keyR+JHskfSR8JX0lfCR9JHwkfSR8JH0kfCV9JXwlfSV8JX0lfCZ+Jnsnfid8KH0ofCh9KHsofih7KX4peyl9KnsrfSt7LH0seix9LXotfS96L30vei99L3owfTB6MX0yejJ9Mno0fjR6NH41ejV+NXo2fjZ6Nn42ejZ+Nno2fjZ6Nn42ejZ+NXo1fjV6NX41ejV+NXo1fTZ6NX02ejZ9NXs1fTZ7Nn02ezZ9Nns2fTZ7NH0zezN9M3szfTN5M30zejJ9MnoyfTF7L30xezF9MXwvfS98MH0wfi59Ln4ufS59Ln0ufSx9LH0sfSx9K30rfSx9LH4rfSyAKn0sgyx9KIQlfyWFKoFLg22CYoJYgVaAV39dgGR9aYJLeiOHI3kkiCR7JIgkfSKHIYAghCaCMoI/hEaDa4R3hGOBWIVXgFWGZX92hVB8I4cneyeHJX0jhyJ+IYYgfyGEIX8hhCB+IYMjfyOEJYAuhTmAQIU8fjqFL34ohCt9K4QpfSaEJXsjhCJ6I4QhfD2Dc39wgmuBbIJvgG6CbX9wg2+Ac4NrgDqFK39ghWt9aYRkfVyFW3xVh0t7W4hBfCmJL3w0jDl8Oo46ez2PQH1AkT19OJA2fTWQNHwykC18MY80fzmPQIBEj0SCQZA9gz+RQYJCkkGBQpI/gDySOoA5lDiAO5Q9f0KVRYFKlUyDUZRWhFaTVIVUklaFWJFZhlqRVodUkE+HSpFLhkyTS4RIkkiFSJBIhUqPS4dKj0iGRI9Eg0mOTYFWil6AY4ZlfmWEZn5ohGV9V4JYfWR7bX50c4B/j26RgZBvjoGMcIqBiXGJgIpwi4CObY6AiWmHgodpioKGaX2CaG9ffmp3dnyBeIx9knKQgI5tioCJaYeAhWiDgoNpf4GCboWAinGMf4d0hH+BdnyAgnWIgJB0lIGRc42BinGJgolviIKLa4uBi2WKgYxiioGJYYqAimGOgI5hjoCNY46Aj2SPgI9nj4CObIyBiW+GgYFweoJtcVuCTnJcgmFzXIFdcl6BXmpaglplWIJZZGCDZWRqg21ibYRtYGWFV2FHhD1nR4RKaUuCTmxCgT92TX1eg5V3r4uyepSMUnqHjqR3fY6adbOMt3uqiYWCdpNcgk2dTnxSolh2UZ9UdVmdYXZdnVR3VZ5WdlagVHZRoFB2Up5SdlCdTnVPnlBxUp1dcW6WfnONjJx6ooijf6KEoIObhZ+Eo4afhpqImoaYiJKGjIiJh4qFiIaHfoODfoB4fnaDeHt4g3p+en97f3t/eoB8fn6Af3eBg4VuhIOBcoGDgXaAgoF0foN/dH2De3Z3g3V8dIByg297bItsdWuRbm15k4FqiJGLcIiKhniFfYd+inWRf5RzlICQc5CAkHGOgI5zjYGNc4yBjHaOgJF6lX+VgJF8kIWOeZCGknuaf55/nXyVgY+Di32KiIp2i4yNdI2NjHSGjn1zco54cIaLjXSLhol5hoRX/1f/V/9X/1X/Vf9U/1T/Uv9R/1D/Tv9M/0r/SP9F/0T/Qf8//z3/PP87/zn/OP82/zX/Mv8y/zL/MP8v/y//Lf8s/yz/Lf8t/yv/Kv8r/yr/Kv8q/yr/Kv8q/yr/Kv8q/yr/Kv8q/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yj/J/8n/yf/J/8n/yf/KP8o/yj/KP8o/yb/Jv8m/yb/Jf8l/yX/Jf8k/yT/JP8k/yT/JP8k/yT/JP8k/yT/JP8k/yT/Jf8l/yX/Jf8l/yX/Jv8m/yf/J/8o/yj/KP8o/yj/KP8p/yn/Kf8q/yv/K/8s/yz/LP8t/y3/L/8v/y//Mf8x/zD/MP8x/zL/Mv8y/zT/NP80/zX/Nf81/zb/Nv82/zb/Nv82/zb/Nv82/zb/Nf81/zX/Nf81/zX/Nf81/zX/Nv81/zb/Nv81/zX/Nv82/zb/Nv82/zb/Nv80/zP/M/8z/zP/M/8z/zP/Mv8y/zL/Mf8w/zD/Mf8x/y//L/8v/y//Lv8u/y7/Lv8t/y3/LP8s/yz/LP8r/yv/K/8r/yv/K/8r/yz/LP8p/yb/I/8o/y//Tf9t/2D/Vv9V/1j/Xv9m/2z/W/8m/yL/JP8l/yP/Iv8g/x//Hf8h/yn/M/9I/2z/cf9i/1f/Vv9a/2j/cP8y/yb/I/8k/yP/If8h/yD/If8h/yH/IP8h/yT/Iv8o/y7/M/83/zj/Mv8v/yv/K/8t/yr/J/8l/yP/Iv8j/y3/aP9u/2v/av9q/23/cP9s/2z/dP9h/y7/Nf9f/2v/af9n/2P/YP9i/0r/W/9R/yv/K/88/z7/O/86/z3/P/9E/z7/N/81/zX/Of84/zP/MP8y/zX/OP88/0D/Pf86/zf/Ov8+/z7/Pv8//z7/Pf86/zn/N/86/zz/P/9E/0n/Tf9P/1P/U/9R/1H/U/9V/1b/V/9U/1L/Tv9K/0v/S/9L/0v/Sf9H/0r/Tf9N/0z/Sf9G/0H/Q/9J/0//V/9c/2H/Y/9m/2b/Y/9Z/1r/Zf9w/3r/h/+O/5D/jv+N/4v/iP+I/4j/iv+N/47/jP+J/4j/h/+J/4T/ff9o/1//bP95/4X/j/+R/4//i/+I/4b/hP+B/37/fP94/3n/fv+E/4f/h/+H/4X/gf+D/4n/jv+R/43/i/+I/4f/h/+I/4r/i/+L/4v/i/+L/4v/jP+N/4//j/+P/4//kP+Q/4//kP+N/4v/if+H/4X/fv93/2//ZP9b/23/bf9b/1L/V/9W/1n/YP9c/1j/WP9Z/17/ZP9m/2b/Y/9c/1X/Rv81/zH/R/9R/0//Uv9a/13/ev+i/6r/jv9f/5T/if9z/5//sv+1/6j/dv9W/0n/Sf9M/0//T/9P/1P/Vv9W/1L/T/9U/1X/VP9V/1T/Uv9R/1H/Uv9R/07/Tf9h/37/lv+l/6v/sP+v/6r/p/+h/53/nP+e/57/nf+c/5z/nP+Y/5P/kv+Q/43/h/+A/3n/d/94/3j/ev96/3v/e/97/3v/fP99/3//gv+D/4D/gP+A/4D/gP9//37/fv98/3r/ef93/3T/cv9v/23/bv9x/3r/g/+I/4n/iP+G/4b/if+N/5T/lf+U/5D/kP+Q/47/jv+N/43/jP+N/5D/kv+U/5T/kf+N/43/kv+Y/5z/nv+Z/5H/i/+J/4j/if+L/43/jf+J/4D/dv9v/3j/iP+M/4r/iP+E/1aCVnBWglZwVIFUb1R/Um9Rf09uTn9McEp/SHFHf0V0Q31BdkF9PnY8fjp3OH43eDV+NHgzfjN5Mn4weC9+L3gtfSx5K30reSt9K3kqfSp5Kn4qeyp+Knsqfip7Kn4qeyl+KXwpfil7KX4pfSl+KX0ofih/KH4ofyh+KH4ofih+J38nfyd/J38nfid/J34nfyd+J34nfid9Jn4mfCZ+JXwlfyV8JH8kfSR+I3wjfiN7In4ieyR+I3skfSR9JH0kfSR9JHwlfSV8JX0lfSZ9J30nfSd9J30nfSh9KHoofSh6KH0peil9KXkqfip5K34reSx9LXktfS55LX0ueDB9MHgwfTB4Mn0yeDJ9MnozfTR6M34zejV+NXo1fjZ6Nn42ejZ+Nnk2fjZ5Nn42ejZ+Nno1fjV6NX41ejV+NXo2fjZ6Nn42ejZ+Nno2fTZ5Nn02eTZ9Nno2fTZ7Nn02ejR9NHozfTN7MnwyezF9MXsxfTF7MX0xejB9MHwwfS98MH0ufC99L30ufS19Ln0ufi19LH4rfSt+K30rfit9K30pfSl/KX0qgCx9LYMtfSuFKX0lhyR/J4ctgU2Gb4FiglV/VIJXf12CZH5shF96NIcheCSII3kihyF9HoMegCCCIYAlgyqDRYJwg26FYIBZhlmAYIZyfVWHI3slhyJ8IoYifSGGIH4ghCB+IIMgfiKDJH4ohC1/L4UyfzeFNn4xhix+LYYufS+ELHwpgyV7JIQieyKEWH92g22AZ4JngGyDbH9thXV/a4VPfjOFQ35hg2h+aoVqfmiGZHteiEx6XItbeTWMLns6jkB8P49AfECQQn5Ckj5+OJAzfjWROn9AkkJ+PJI0fjOSN345kTl/N5A2fzWRNoA3kTqAOpE8gD6SPIA8kjp/OpM3fziUO38+lUOBSZVPgVGVUYRRlU+ETpVPhFGVVIRVklOFUZJMhEySS4RLkkyETJJLhUuQTYdOjk6ITo5MiEePRIZBj0KERo9Pg1SKXH9hhmN/ZYRjflyBW35pfHZ+gnOJf4txjoGMcoqBh3SFgYZzhoCIcIqAiW6GgIhpiIGIaIiDhGd+gmpuYoBweXt8h3iPfY9yi4CIa4SBgmeAgnxjd4RxZ2+Dc3B5gXxzgH+Dc4Z+h3OEfod0iYCNc42AjHGLgYhvh4GIbYeCiGqKgYplioGKZIqAi2KNgI1ij4CQYZKAkmOQf5Blj3+PaIyAiG2IgIVxgoCAcniCc3Nzg3N2coNxdGmBZ3VqgWh0aYNpcmODV29QgVFwV39bbVqBVmxUglVsVYBPb0OAQ25UglNxVoFZel1+Z4RleXSOpHedj4B0mY+JcoWPo3Kvja96po18gFeYSn1IoUl2TaRMdEyiUnRVoVF0T6BQdVCgUnRVoFd0V6BVdFGfUnVUoE9vVJ9ma4iZpnKyirl6vIG6f7iCsISpg6WGnYadhZuJm4WeiaCFoIihh5+HnIiZhZmHlXqQhod3e4J2fXt+en96fnp+e357gHt/en55f3x6foGBdIKDfXl9hH58foJ/dn+Cf3V9g31yfIJ8dnmCd3xygHGEcHpwinVxfY+EboqQiXSFiYN5h3qKfY50lYCUdZKAj3SPgI90jYCNdI2BjXSNgI54kH+SfJN8kIKPfI6DkXmWgZp9m3yYgpOBjX+JiIp5iI6Kc4yOjXKMj4Zye49ycW6Pd2+Fi4l0ioaIeYWFVf9V/1T/VP9T/1P/U/9Q/1D/Tv9M/0v/Sf9H/0X/RP9C/0H/QP89/zz/O/83/zX/N/80/zP/M/8x/y//L/8v/y3/LP8r/yv/K/8r/yr/Kv8q/yr/Kv8q/yr/Kv8q/yr/Kf8p/yn/Kf8p/yn/Kf8p/yj/KP8o/yj/KP8o/yj/KP8n/yf/J/8n/yf/J/8n/yf/J/8n/yb/Jv8l/yX/Jf8l/yX/Jf8k/yT/JP8j/yP/I/8i/yL/I/8j/yT/JP8k/yT/JP8k/yX/Jf8l/yX/Jv8n/yf/J/8n/yf/KP8o/yj/KP8o/yn/Kf8q/yr/K/8r/yv/LP8t/y7/Lv8u/y7/MP8w/zD/MP8y/zL/Mv8y/zP/NP80/zT/NP81/zb/Nv82/zb/Nv82/zb/Nv82/zb/Nv82/zX/Nf81/zX/Nf81/zb/Nv82/zb/Nv82/zb/Nv82/zb/Nv82/zb/Nv80/zT/NP80/zP/M/8y/zL/Mf8x/zH/Mf8x/zH/MP8w/y//L/8v/y7/L/8v/y7/Lf8u/y7/LP8s/yv/K/8r/yv/K/8r/yr/Kf8o/yn/K/8r/yv/Kv8o/yb/KP8r/y7/L/9Q/27/ZP9Y/1T/V/9a/17/Zv9m/0P/Iv8f/yL/IP8e/x7/H/8g/yD/Hf8h/0f/d/9t/17/Vv9a/2X/cf86/yH/I/8j/yL/If8g/yD/IP8g/yD/I/8m/y3/Mv8x/zH/Mf8s/yv/LP8t/zH/Mv8u/yr/J/8k/yP/PP9z/2r/av9n/2n/a/9w/3T/X/88/zv/Wv9l/2f/av9m/2f/Z/9h/03/Vv9f/0b/Mv85/0X/P/9E/0P/Rf9D/zz/O/83/zX/Nv8+/0b/Rf9B/zn/Nf81/zX/Nv80/zP/M/8y/zX/Of85/zv/O/88/zz/O/86/zn/Of88/0H/Rf9K/1D/Uv9U/1L/Tf9M/03/T/9Q/1H/Uf9N/0z/S/9L/0v/TP9M/07/Tv9P/0//T/9P/03/R/9E/0H/QP9C/0f/S/9S/1n/Yf9l/2P/W/9e/2//fP+I/4v/iv+M/4r/h/+F/4X/hv+E/4X/hP+C/4D/hv+G/4b/h/+D/3z/av9j/3H/fv+M/4//jf+K/4b/g/+B/37/ef9w/2f/Z/9t/3P/dv97/37/gv+F/4X/if+J/4z/i/+L/4v/iP+J/4f/iP+H/4f/if+J/4r/jP+N/43/jf+N/4//kP+Q/47/jv+N/43/i/+H/4X/gv+A/37/dv9y/3D/cP9w/3H/c/90/3H/b/9j/13/Yf9T/0X/Rf9Q/1f/VP9O/0j/Sf9O/1D/Tf9L/1H/Uf9Q/1T/U/9m/2H/YP+R/5T/fP+N/6X/qP+p/6z/qv+f/23/TP9I/0j/Tf9O/03/Tf9O/1D/UP9T/1T/VP9T/1L/U/9U/1L/Uf9R/1D/Vf9u/5D/qv+3/7v/vf+//7z/uv+1/63/qP+e/57/n/+e/57/oP+k/6P/n/+d/5//of+g/5n/j/98/3X/e/97/3r/ev97/3v/ef95/3r/ef99/4H/gP97/3v/fP99/3//fv9+/33/ff99/33/e/96/3f/dP9y/3L/eP+A/4f/iv+I/4P/hP+J/4z/kf+V/5P/kP+P/4//j/+N/4z/jP+M/4v/jP+Q/5L/k/+Q/4//kP+U/5j/mv+Y/5T/jf+L/4n/if+J/4r/jP+N/4r/hP94/27/bf94/4b/h/+I/4j/hf9UglRwUoJScFOBUXBQf09wT39Obkx/SXBIf0ZxRH9DdEF+P3Y+fjx2O346dzh+Nng2fjV4M34yeTF+MHkwfi95LX0seSx9K3krfSt6Kn0peip+Knsqfip7KX4peyl+KXsofih7KH4ofih+KH4ofih+KH4ofyh+KH8ofih/KH4ofyd+J34nfid+J34nfiZ+Jn4lfiV+JX4lfSV+JX0kfiR8JH4kfCR+JX0kfiN8I34jeyN+I3ojfiN6I30jfSR9JH0kfSR8JX0lfCR9JX0lfSZ9J34nfSd9J30nfSh8KX0pfCl9KXopfSp5Kn4reSt+LHksfS15Ln0teS59L3gwfTF4MH0xeDJ9MngzfTN3NH01dzV+NXg0fjV4NX41eTV+NXk3fjd5Nn42eTZ+Nno2fjZ6NX42ejZ+Nno1fjV6Nn42ejZ+Nno2fjZ6NX01ejV9NXo1fTV6NX01ezR9NHs0fTR7M30zezJ8MnsxfTF7MX0xezF9MHowfS98Ln0ufC19LXwvfS5/LX0sfy19LX8sfSt/K30rfip9Kn4qfSp9KX0ofyh9Kn8qfSuCLXwshSl8J4crfCyHLn8whi+BSIVrf2OFVn9Tg1R/WINdf1+DZntRhC92H4UheB+FHnwehB9+HoIfgiGBI4JVg3qBZ4ZdgVuGXoBqhWB9JYcifCOGIH0ihSF+IIQhfiGDIH4jgyh+KoQsfSqFK30rhSl+LIQsfi2ENH42hDF8LIMofCWEMn1shG6AZoFmf2qBaX1qhHB+XYU8fkiFZ35mhWF+YYVifWOGY3tjiFd8UotWfEmNNns1jz18O5E9e0OSP30/kj1+OZI3fjWQM34ykDp/QpFEgEKSPIA1kTR+M48yfjOPMH4zkDF/MpE1fziROYA7kT2APpE9gTuSOoE8k0CBRJVKgk2VUIFTlVaCVZVSg1CVT4JOlk6CTZRMg0uUS4NLlUyDTJVNhE6SToVQkFGGUJBPh0+QTYdIkEaFQ5BBhECRQINDj0iBUopagGGGYX9ggWZ+eHqDf4pxi4GJc4mBhnSEgYR1goGBdYSBgnN8gHlxe4CEboeBhWiEg4Ble4JqamWAc3OCfo51j3+Mb4eAg2mCgYBlfoN2Y2yGYGxfhmRya4VvdXOCd3Z8gIF1gn6FdIeAinOJgIlvioGKbYmBiWuHgoZmhoGIZImBiWOKgItijICNZIqBjGWMgYxnjICKa4yAjW2MgIdvhICBcX1/fHN6gHd0dINxd3GDcXZwhHF0cYRuclyEOXE0gzhzOX88dkR5SXROe01zS3xLc0t+TXVJfkp3Rn9NdlKBUnhQgWyAbHtqiop1mJCJcYySoHGnkKhyqY+oeZCTVX9GnEd6SKRKdUqmSXRMpEx0T6JLdEuhUHVPoU11TaFPdlCgUHRRoE9uWJ93bJmWrXS4hrt8vYG+fr6Avn6+gLyAtIKthaSGn4agiZ2FnYqdhZ+JpIeghpyIoIKmiKV2noeXboSFdnJ6gXx7e4B6fnqAeoB6f3mAeH95e3yBfnqAgXeBd395hX1+fYJ8gH15fYJ9dn2DfXV8g3x1eYJ4fXR8coV6doKKiXOJjIZ1hIWGeoh5kH2Wc5aAk3SQgI91j4COdYyAjHWMgYx2jH+OfJF+lICSfJCFkHyVgJh/m3yZgZaBj4CLhop7iYuJdoqOi3ONjotzho59c3WQb25uknpuh4yIdYiGh3qFhVL/Uv9R/1H/UP9P/0//Tv9N/03/S/9I/0b/Rf9D/0L/Qf8//z3/PP87/zn/N/82/zb/Nf8z/zL/Mf8w/y//Lv8t/yz/LP8s/yv/K/8q/yn/Kv8q/yr/Kv8p/yn/Kf8p/yj/KP8o/yj/KP8o/yj/KP8o/yj/KP8o/yj/KP8o/yj/J/8n/yf/J/8n/yf/Jv8m/yX/Jf8l/yX/Jv8m/yX/Jf8k/yT/JP8k/yP/I/8j/yP/I/8j/yP/I/8j/yP/JP8k/yT/JP8l/yX/JP8l/yX/Jv8n/yf/Jv8m/yf/KP8p/yn/Kf8p/yr/Kv8r/yv/K/8s/yz/Lf8u/y7/Lv8v/zD/Mf8w/zH/Mv8y/zP/M/80/zX/Nf81/zX/Nf81/zX/Nf81/zf/N/82/zb/Nv82/zb/Nv81/zb/Nv82/zX/Nf82/zb/Nv82/zb/Nv81/zX/Nf81/zX/Nf81/zX/Nf81/zT/NP8z/zP/Mv8y/zH/Mf8x/zH/MP8w/zD/L/8u/y3/Lf8t/y7/Lv8t/yz/K/8r/yr/Kf8p/yn/Kf8p/yf/J/8q/yn/Kf8p/yr/K/8t/yz/Kf8p/yz/LP8t/zD/Mf8z/0X/Z/9q/13/VP9S/1P/Wf9e/2T/Yv9G/yT/H/8e/x//Hv8h/yH/If8i/yf/Zv94/2L/W/9d/2D/bv9K/xv/H/8i/yL/If8g/yD/IP8h/yb/KP8q/yv/K/8q/yr/Kv8t/y3/Lv8x/zL/MP8s/yz/L/9j/3D/av9l/2T/aP9r/27/X/9N/2D/av9o/2T/Yf9h/2P/Yv9b/1//W/9K/z//NP83/zj/Of85/zv/PP86/zn/N/81/zb/Nf8x/zD/OP9B/0L/Qv89/zb/M/8x/zD/L/8v/zD/Mf8y/zL/M/83/zr/O/89/z7/Pv89/z//RP9I/0v/Tf9Q/1L/VP9T/1P/Uf9Q/07/Tf9L/0v/S/9L/0v/TP9M/07/UP9Q/1H/VP9T/1D/T/9M/0n/Rv9D/0L/QP8+/z//QP9H/1H/Vf9b/2L/bf98/4b/iv+K/4n/h/+E/4P/gv+C/4L/gf99/3b/cf91/4H/h/+F/4T/gP97/2r/af92/4X/j/+N/4r/g/+C/4D/fv99/3j/bf9h/13/YP9l/2n/bf9x/3b/ff+B/4T/hP+G/4n/if+H/4f/iP+H/4b/hv+G/4b/hv+G/4f/if+K/4v/if+I/4b/hv+H/4j/iP+H/4n/iP+E/37/fP97/3r/d/92/3T/cP9x/3H/cP9x/27/Tf8p/zX/Nv84/zj/PP9D/0T/Sv9Q/1P/T/9L/0j/S/9N/1b/Wv9a/1b/Xv9f/2z/hP+S/5j/mf+e/6j/qv+n/6T/d/9E/0j/Sf9J/0v/Sv9J/0z/TP9N/0r/Sv9M/0v/Sv9M/03/TP9N/03/VP9z/5z/r/+4/7z/vP++/77/vv++/77/vP+5/7P/rf+k/6D/n/+d/5r/mf+Y/5v/nf+e/6X/pf+h/5v/i/98/3r/ff97/3r/ff98/3r/ev94/3j/e/99/4H/dv9z/3X/d/96/3v/fP99/33/fP98/3z/fP97/3n/d/90/3r/gv+J/4n/hv+E/4b/iP+Q/5b/k/+Q/5H/j/+P/47/jP+M/4v/i/+N/5D/kf+R/5D/kP+T/5f/m/+a/5b/kP+M/4r/iP+H/4n/jP+N/43/if+C/3n/cf9v/27/e/+H/4j/iP+H/4X/UYJRcFCBUHBPgE9vTYBNb01/S25If0ZyRX9Dc0J/QXVBfz93O387dzl+OHc2fjZ3NX40dzN+Mncwfi94L34vei1+LHotfit6LH4seip+Knoqfip6KX4peyl+KX0ofih9KH4ofih+KH8ofih+KH4ofih+KH8ofih/J34nfyd+J38ofih+J34nfiZ+Jn4mfiZ+JX8lfyV/JX8lfyV+JH8kfCR+JH0kfiR9I34jfCN+I3wjfiN8I34jfCN9I3wkfSR8JH4kfCV+JXwlfiV9JH4lfSd9J30nfSd9J3wofSl8KXspfSp6Kn0qeSt9K3ksfSx5LX0seS19LncvfjB5MX4xeTJ/M3gyfzJ4M380eDV/NXg1fzV4NX81eDV/NXg0fzR4NX81eTd/N3k2fzZ6Nn82ejZ+Nnk2fjZ5NX41eTV+NXk1fjV6NX41fDV+NXs1fjV7NX41ezR+NHszfjN7M34zezN9M3wxfTF8MX4xezB+MHsvfS97L30vey59LnwufS18LH0sfSx9K34sfSx+K30rfip9Kn0qfSp9KX0pfil9KX4ofCmAKXwtgi98MIUufCuIKnwriC98M4g0gDeHN4BCh2OAboZegFOFUX9ThFWAXYNjfWqDW3kxhB54HoQgeiCDH3wggyR/JIQzgmyGcoJihl6BW4Zhf22GMH0dhh98IIYifCGFIn4ihSR/KIQqfyyEKn0shCt9K4Qrfi6EL34wgzF+MoMvfCyELn1ggm9+Z4Nof2eDaX1qhXB9aIdkfmqGa35ohmV9YIZgfWGGY3xiiF16VolIeziMMnowkDV6N5A2eziQPnxAkTx8OJA0fjOPNn40jzF+MI83f0GPRoFEkEKBOpA0fjOQMH4ukDB9MZEzfjSRNX40kTZ/N5A5gDyQPoFBkUGBQpJFgkaTSIJLk06CT5VPgVGVU4FSllCATpZMgUqWSYFJlUuCS5VNg02VT4NQklOEU5BVhlOPUIdOkEyGSZBGhkSQRIRAkUGEQZA+g0GPRYFLi1SAYYVygIR7iYGJdImCiHOGgYR5gYGAeICBgHV/gXpzboBrdXZ/gHCIgYhohIKAZnmBamtqf3dxhX+McYt/h2yCgYBnf4J9ZHqEdmVrhmRuX4ledF+IZXdohW14c4J5doCBhXWGgIZxiICIb4eBh2uEgYRqh4GFZ4WBhWWFgYVkhYGFZYeChmaDgn9ofIN9bH6EfnGCgYJxhH+GcoZ/gXJ+gH1yeoB5dXeBdnV1gXVxdIF1cHaCa25Sgy9wLoE6dzx7PntDd0d7S3lHeEd8SHZPfVB2UX5YdliAVnNcgGBwYYJlcmmAZH1teouKl3CTkZxvp5Cpc6aPoHptlkF7Rp9KeEmlTHVLpUp0SaVKdEmjSnVKokp1SqJKdEqiSXRLoUpvU6FsapaZrnG3h7x7vYG+fr6Avn6+gL5+voC+fr6AuYC1hK6GpYmjhqGJnYaaipmGmYmYh5iEnYejdqOFn2qVg4RpeoJ+dX2Ae357f3t/e4B5f3p/eH14gHp8fn9zg3B8dIp1eXeJd358gHuAfHl+gH53foJ9eH2Ce3p5f3Z/e3qDhol1iYmFd4KCh3uMepF+lXWUf5F2kICOdo+Bj3aLgYp1ioCLeIx/kHySfpGAkX2TgJZ+mXyZhJV+kYCNh4p7iYqIdomOinOLjo1zjI+IdX+OdXJvkW9sbpR7a4WNiHOIhYd4hoNP/0//Tv9O/03/Tf9M/0z/TP9K/0f/Rv9E/0L/QP9A/0D/Pf87/zr/Ov83/zb/Nv80/zP/Mv8y/zD/L/8v/y//Lf8s/yv/K/8s/yz/Kv8q/yr/Kv8p/yn/Kf8p/yj/KP8o/yj/KP8o/yj/KP8o/yj/KP8o/yj/KP8n/yf/J/8n/yj/KP8n/yf/Jv8m/yb/Jv8l/yX/Jf8l/yX/Jf8k/yT/JP8k/yT/JP8j/yP/I/8j/yP/I/8j/yP/I/8j/yT/JP8k/yT/Jf8l/yX/Jf8l/yf/J/8n/yf/J/8n/yj/Kf8p/yn/Kv8q/yv/K/8s/yz/LP8s/y3/Lv8u/zD/MP8x/zH/M/8y/zL/Mv8z/zT/Nf81/zX/Nf81/zX/Nf81/zX/Nf81/zX/Nv82/zb/Nv82/zb/Nv82/zb/Nv81/zX/Nf81/zX/Nf81/zX/Nf81/zX/Nf81/zX/NP80/zP/M/8z/zP/M/8z/zH/Mf8x/zH/MP8w/y//Lv8u/y7/Lv8u/y3/Lf8s/yz/LP8r/yv/K/8q/yr/Kf8p/yn/Kf8p/yn/KP8o/yn/Kf8p/y3/L/8y/zH/L/8t/y7/Mf80/zf/Ov89/z7/Pv9V/2r/Zf9Y/1P/Uv9W/1j/X/9p/2j/Tv8l/x7/IP8f/yD/Jf8o/yj/O/9x/3L/Xf9f/2H/a/9i/yD/Hf8e/yL/If8h/yH/JP8o/yr/LP8s/y7/Lf8t/y3/Lv8v/zD/Mf8x/zD/LP9V/3L/Zv9j/2T/aP9r/3D/bv9q/2j/Z/9l/2b/ZP9h/2H/Yv9j/2T/Zv9Z/zX/Mf8z/zP/M/80/zX/Of9B/0f/Q/85/zT/NP81/zH/Mf8w/zT/Pv9F/0b/Qf86/zX/Mf8v/y7/MP8x/zP/Nf82/zb/N/83/zn/PP8+/0L/Qv9D/0X/Rv9K/0r/TP9M/0z/Tv9P/1H/U/9P/03/TP9J/0n/Sv9K/0z/Tf9Q/1L/VP9U/1X/U/9P/03/Sv9I/0b/RP9D/0H/Qf9B/0D/Pv8//0L/T/9b/3D/g/+K/4r/iP+F/4L/f/9//3//gP9+/3r/cf9o/2z/dP+C/4f/h/+G/4H/ef9t/2z/eP+F/4n/if+E/4H/f/98/3v/fP92/2v/Yv9f/1z/W/9f/2D/Zv9t/3X/fv+I/4f/hP+G/4b/h/+H/4T/hP+F/4T/hf+F/4T/hP+F/4X/g/+A/3v/dv9x/3D/cf9v/3X/fP9+/4L/hf+C/3//fv98/3v/fP97/3v/e/95/3j/ef97/3f/Z/9K/0D/Qf9G/1D/W/9e/1j/S/9N/1j/XP9d/17/XP9a/2H/ZP9l/2b/a/9r/2P/e/+U/4v/m/+n/6f/pf+Z/2P/Q/9I/0r/Sf9K/0v/Sv9J/0j/SP9J/0n/Sv9K/0j/SP9J/0n/T/9m/43/qv+3/7r/vv++/73/vv++/77/vv++/77/vv++/7r/tv+r/6f/o/+h/5v/mf+Z/5r/lv+X/5//ov+i/5z/jv+A/3v/e/98/3v/e/97/3r/eP94/3n/e/99/27/bP9u/3H/dP90/3j/ef97/3z/ff98/3z/fP97/3r/ef97/4P/iv+I/4T/g/+K/47/lf+V/5P/kP+P/47/jv+O/4r/if+K/4v/jP+Q/5H/kv+T/5f/l/+Y/5b/kf+M/4r/if+H/4r/if+K/4v/jf+K/4T/ff91/2//b/9u/33/hv+J/4n/h/+G/0yCTHBMgUtwS4BLcEmASXBKf0dxRH9CcUN/QXNAfz51Pn87dTp/OHU3fjd3NX41dzR+MncxfjB3MH4wdy9+Lngufi55LH4reSx+LHoqfip6Kn4qeil+KXspfil8KH4ofCh+KH0ofih+KH4ofSh+KH0pfil/KH4ofyd+J38nfid/J34nfyd+J38mfiZ/J34mfyZ/JoAmfyV/JX8lfyV/JXwkfiR9JH4kfSN+I3wjfiN8I34jfCN+I3wkfSR8JH0kfCR+JHwlfiV8JX4mfSd+J30ofSh9J30nfSh9KXsqfSp6Kn0qeip9K3krfSx5LH0teS1+LXkvfi93MH4wdzF+Mnc0fzN4M38zeDN/NHg0fzV4NX81eDV/NXg2fzZ4NX81eDV/NXk1fzV5NX81eTV/NXk2fjZ5Nn42eTV+NXk1fjV5NX41eTV+NXo1fjV7NX40ezR+NHszfjN7M34zezN+M3syfTJ8MX0xfDF9MHsvfS97L30uey59LXstfSx8LX0tfCp9Kn0rfSt+Kn0qfil9KH4ofSh/J30nfyd9J34ofSh+KH4ofyl+LYExfDSENHwyiC98MogzfDaIOnw8iEJ8RYhBfT6ISX1kiG18XIZTflGFUX9Vg1p+ZoJte2GCOXofgxx6IoUleyeHLH4siUiAdIlqgmOHYIFghnB9RoYeex6GIXsghSJ8IYUlfyaEK38thC9+MoQwfi6ELn4whDB+MIMyfjKCMX1Mg3J+aIJif2ODZX5qhHB9cIZpfWeHZH5khmR9ZIdkfWOHZXxmiGR7aolie0WMMXsyjzV6NZAzejSQOHw6j0R/WJBdfzmPM38zjjN+Mo4xfjCPM386j0WCS5BGgjuQNX8zji5+LI4vfTGPM341kDZ+N5A4fzeQOYA7kD6BQpFDgUSSRoJGk0mCR5NKgkqVS4FMlU6BT5ZSgFKWUoBOlkuASZZIgEiWSoFKlU2DT5NThFSRVYZSkE2HS5FJhUeRRIVDkUKEQJJAhECRQYNAkECEP49GhFOLaYR6goSCh3uFgYJ4f4F+eX2Bf3h/gXx4dYBqd2OAaXd2f4NyioGIbIaCgmp5gW9wbX95dIV+iHKGf4Jtf4F+anyCfGR6hHVnZoVlcWaHZXZkh153XoZhemmCdHqAgYh3h4CFcoWAhXCGgYZphIGEaYSBhGmEgYVmg4GFZYOBgmWAgnppdoNtbmKEYXZlg2V5c4F7d3yAfXWBgIJ1gIB/dXyAfXN/gX9ygIGBbYGBgmiAgn5nfoR5a3CDaHJkgGV5aH5pe2mAZHZXgFtzYIFhdGCDYHRigWNwZoJnbWqEa21vhGh0Yn9sg4tzlo6fcKePqXKkkY96U5lDe0aiS3dLpUl0SqVJdEilRnRHo0d1R6JIdUqiR3VHokhxSaJda4Sdo3KyjLl7vIG9fb6Avn6+gL5+voC+fr6Avn6+gL59vYC4gLOFrYaliZ+Gm4qahpiJloeVhpGHk3+XhZlxmYSUZ4WEem15gXp7en97gHqAeYB4f3h9eX95e35/cIRqeWyMbHRxj3J5dIh2fXmAfIB+eHyCenN8gnx1fIB6e318g4GIeIeFhHmEf4p8j3aWfpR0kH+Pd42AjXWOgY11ioGJdop/i3mOfpJ5kn+Ue5iBmnqZgpiAk4KMhot8ioqJdoiMiXOMjItzi46Lc4ePgXN8kHRxbpJva26RfG2Ii4l2iYSIe4eCS/9L/0v/Sf9K/0r/SP9I/0f/SP9G/0T/Qv9B/z//Pf88/zr/Ov84/zf/N/82/zb/M/8y/zH/MP8w/zD/MP8u/y3/Lf8s/yv/LP8s/yr/Kv8q/yr/Kf8p/yn/Kf8o/yj/KP8o/yj/KP8o/yj/KP8o/yn/Kf8o/yj/J/8n/yf/J/8n/yf/J/8n/yb/Jv8n/yb/Jv8m/yb/Jf8l/yX/Jf8l/yT/JP8j/yP/I/8j/yP/I/8j/yP/I/8j/yT/JP8k/yT/JP8k/yX/Jf8l/yb/J/8n/yj/KP8p/yn/Kf8p/yr/Kv8q/yr/K/8r/yz/LP8s/y3/Lf8t/y//MP8w/zH/Mf8y/zT/M/8z/zP/M/80/zT/Nf81/zX/Nf81/zb/Nv81/zX/Nf81/zX/Nf81/zX/Nf81/zb/Nv82/zb/Nf81/zX/Nf81/zX/Nf81/zX/Nf81/zT/NP80/zP/M/8z/zP/M/8z/zL/Mv8x/zH/Mf8w/y//L/8v/y7/Lf8t/y3/LP8s/yv/Kv8q/yn/Kf8q/yr/Kf8o/yj/KP8n/yf/J/8n/yf/J/8o/yj/Kf8t/zH/Nv83/zX/Mv80/zr/PP8+/0L/Rv9K/0L/Q/9A/z//Vv9r/2L/V/9R/1D/U/9b/1//Z/9u/17/NP8c/yT/K/8s/y3/Lv9P/3j/av9f/1//YP9s/zT/H/8d/yD/Iv8k/yb/Jv8p/y3/Mf8y/zP/Mv8y/zT/NP80/zT/Mf9J/3P/bf9m/2b/Zv9p/27/cP9o/2X/ZP9k/2T/ZP9k/2X/Zf9n/2T/ZP9Z/0P/N/81/zP/NP80/zP/N/87/z//Q/9M/07/N/8y/zP/M/8y/zL/Mf8y/zj/Q/9I/0b/Pf84/zP/MP8u/y7/L/8w/zH/Nf82/zb/Nv85/zv/PP9A/0L/RP9G/0b/R/9G/0f/SP9I/0n/Tf9Q/1D/Uf9O/0z/S/9J/0j/SP9I/0j/Sv9O/1D/U/9U/1D/Tf9L/0n/R/9E/0P/Qf8//0D/QP9D/0T/Q/9B/0H/SP9Z/2r/dP98/4D/gP9+/33/fP9+/3z/d/9u/2L/Yv9r/3f/hP+K/4n/iP+E/3v/b/9t/3n/hP+H/4P/f/99/3r/fP98/3n/df9s/2j/av9o/2X/YP9e/17/af92/4X/i/+K/4j/hP+E/4T/hP+E/4T/hP+E/4T/hP+G/4X/g/+A/33/d/9v/2X/V/9O/1H/WP9t/3b/ef97/33/f/+A/3//fv9//4H/g/+G/4f/hv+I/4j/h/9//33/d/9x/3P/c/9x/27/av9k/1f/X/9h/2D/X/9f/2D/Zf9l/2f/aP9s/2//Z/9j/2f/e/+V/57/pf+l/6P/h/9K/0X/S/9K/0n/SP9G/0j/R/9H/0f/R/9H/0f/R/9J/0j/Rv9M/27/mv+v/7j/vP+//77/vv++/77/vv++/77/vv++/77/vv+9/7v/tP+s/6b/of+d/5n/lf+R/5D/jf+J/4X/hP+L/4//hf97/3n/ev95/3n/ev96/3n/ef96/3v/gP9x/2r/Z/9n/27/cf9w/3P/dv94/3r/fP96/3v/e/99/3v/fv+F/4j/h/+D/4X/jf+S/5X/kv+Q/4//jf+N/43/jP+K/4r/i/+M/5D/lP+X/5j/mv+Z/5f/kv+M/4r/if+J/4j/if+L/4v/i/+L/4r/hv9//3n/dP9u/27/b/99/4f/if+J/4n/iP9JgUlwSYFJcEiASHFHgEVxRIBEcEOAQnJCf0BxP38+dDx+O3Q5fjh1OH42eDZ+NXc0fjN4MH4weDB9L3YvfS13Ln0teC19LHgsfit7Kn4peyl+KXsqfip8KX4pfCh+KH0ofih9KH4ofSd+J30pfil9KX4pfSl+KX4pfil+KX4pfih+KH8nfid/J34ngCZ+JoAlfiV/JX4lfyV/JX8lfyV8JH8kfSR/JH0kfiR+JH4kfiR+JHwlfiV8JX4leyR+JHslfiV8Jn4mfCV+Jn0nfih9KX4pfSp+Kn0pfil7Kn4seyt+K3ssfix7Ln4uei5+Lnovfi95L34wdzF+MXgyfjJ4M34zdzR+NHc0fzR2Nn80djV/Nnc2fzZ3Nn82dzZ/Nnk2fzZ5Nn82eTZ/Nng2fzZ4NH80eTV/NXk1fjR6NX41ejZ+NHs0fjR7NH40ezN+M3s0fjJ8Mn4yfDJ+MnwyfjJ8MX4xezB+MHsvfi98Ln4ufC5+LX0sfix9K34rfSp+KX0pfil9KX4pfSd9J34mfSZ+J34nfih+KH4nfiZ/JX4lfyZ/J34pfyuAMX42hTp9OYg3ejaJPno/iUJ6SIlMeE2LSnlJjUN6P408fFCLYn5liFp+UoVSf1WCWIBcgF9/aYFuelKEMXYpiCl5KYopfSmKU4Jzh2KCWodggGqHW3sghyJ6JIYkeyaGKnwqhip9LoQwfzKCNH81gzR+NYM3fTeDNX49g2l+a4NogGiEa39rhWx8cYdnfWSGZX1niGh+aIhje2SJZXppiWh7XolHfkCKQn4zjjN8MpAyfDKPN3xGj0R9QI03fzOOMn8xjzJ+MY4xfDGOMX00jzZ+NpE6f0CRQ4E8kDuANo8ufi6NL34vjTF+Mo4zfjSQNX82jzl/O5E8gT2RQYFDkUSBRZJGgUaTR4FFlEeBSJRJgUyWToFOlk2ATZZLgEmWSIBIlUeAR5VJgUyUToNQk1KET5NMhEqTSYRHk0WCRJNDg0CTQINAk0KDRJJEhESQRIZFkEmGU45ghGuGdIJ4gHqCe3p7gXx2doFxd2iBXnlggGp6d3+EdouAim+KgoZufYFvcG6Ae3ODfoNxg39/bXyAe2h7gXtmfIJ7bHODa3Zqhmp4aIZldWKFY3hug354jYGQdIqBhnGDf4JtgX+BaoKAg2mDgINpgoCEZ4WAg2d/gX9meoF0bGaEXnFNhUN8RIRWgW2Bc313gnp4fIJ+eH2DfnV/gYFygoGEb4eBi26MgY1pjoKOZIqDiGJ/hXRscIRwdW2EbXhjg1h1XINfdF+DX3Jgg2FyYoJkcmaDZ25lhmNra4ZncWSBaYB1eI+LnXOgkKRzoJSCekeZP3tHokl3S6VJdUamRnVGpUZ0RqRGdEakSHVFo0dyRqBGbFqgiGyok7d5vIO+fr6Avn6+gL5+voC+fr6Avn6+gL5+voC+fr1/uYKyhayHp4ykhaCMnYWYiJSGj4eNhomBhYSCc4aAiWmBgHpreX95eXiAeIB4f3iAen96fnp/e3p/gXGCZ3plj2hwaJNtc2+Mb3h1h3t9fIB9gH15e4J7eHuBent+fYR/iHqHgIN6inySfJZ1lX+Rdo6AjXeNgI11jICMdoyAi3aLfo54kYCVd5iBmXqagZeBk36Nhot8iouJeImOiHWJjYpzi42LcYuOh3KBjn1yeZJybW6VbWpuj4BthoeLd4x+i32LeEf/R/9H/0f/Rf9F/0X/RP9D/0P/Qf9A/0D/P/89/zz/Ov85/zj/N/83/zX/Nf80/zT/M/8w/zD/MP8v/y//Lf8t/y3/Lf8s/yz/K/8q/yn/Kf8p/yr/Kv8p/yn/KP8o/yj/KP8o/yj/KP8o/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/KP8o/yf/J/8n/yf/Jv8m/yX/Jf8l/yX/Jf8l/yX/Jf8k/yT/JP8k/yT/JP8k/yT/JP8k/yX/Jf8l/yX/JP8k/yX/Jf8m/yb/Jf8m/yf/KP8p/yn/Kv8q/yn/Kf8q/yz/K/8s/yz/Lf8u/y7/Lv8u/y//L/8w/zH/Mf8x/zL/Mv8z/zP/NP80/zT/NP81/zb/Nv82/zb/Nv82/zb/Nv82/zb/Nv82/zb/Nv82/zT/NP80/zT/Nf81/zX/NP8z/zP/NP81/zT/NP80/zT/M/8z/zP/NP8y/zL/Mv8y/zL/Mv8x/zD/MP8v/y//Lv8u/y3/Lf8t/yz/K/8r/yr/Kf8p/yn/Kf8o/yj/J/8n/yb/Jv8m/yb/J/8n/yb/Jv8l/yX/Jv8n/yj/Kv8v/zf/PP89/zv/OP88/0L/SP9K/0z/TP9K/0n/Rf9E/z//Pf9H/1j/av9l/1v/WP9Y/1j/Wf9b/2L/aP9m/1L/Kv8i/yj/Kf8o/1r/dP9k/13/Yv9s/0z/Hf8m/yT/Jv8q/yr/K/8t/zD/M/83/zj/Ov87/zn/OP83/2b/av9n/2n/a/9q/2//cP9o/2P/Zv9n/2f/Z/9o/2b/Z/9p/2z/V/9B/z//Qv83/zP/Nf8z/zP/M/83/0P/S/9F/zf/M/8x/y//L/8v/zD/Mf8y/zT/Nv85/zn/N/85/zn/Of81/zH/Lv8u/y//Lv8v/zD/Mv81/zf/OP85/zv/PP8+/0H/Qv9D/0X/Rf9F/0X/Rf9E/0f/R/9I/0j/Sf9J/0j/SP9G/0b/R/9H/0f/Sv9P/1H/Uv9P/0z/Sv9I/0b/Rf9E/0P/QP9A/0D/QP9D/0X/Rf9F/0X/R/9I/1D/W/9k/23/dP95/3v/d/9x/2b/Yv9e/1//a/95/4b/i/+J/4v/hf97/2//b/97/4D/gP9//3z/e/97/3v/e/99/33/ef9w/2//bP9q/2n/Zv9m/3H/gf+Q/5D/if+F/4L/gf+A/4D/gf+C/4P/g/+D/4X/hP+C/3//ff96/3T/Z/9a/1T/S/9I/1D/Y/90/3b/dv95/3v/ff9+/3//gf+C/4T/h/+L/43/jv+O/47/i/+J/4H/d/9w/2//bv9q/1v/X/9g/2H/YP9g/2P/Yf9j/2X/Zv9n/2P/Xv9l/2b/aP9u/3H/hv+a/53/n/+d/3//Rv9A/0b/R/9I/0f/SP9F/0X/Rf9F/0X/Rv9F/0X/RP9G/0//dP+e/7L/uv+9/77/vv++/77/vv++/77/vv++/77/vv++/77/vf+5/7L/rP+n/6P/n/+d/5j/k/+K/4X/hP+F/4b/i/+L/4T/e/95/3n/ef95/3n/ef95/3n/d/95/33/cv9n/2X/Z/9n/2r/bv9u/3P/dv95/3r/fP97/3v/e/96/3//hf+I/4f/hf+N/5T/lf+T/5D/jv+M/43/jf+M/4z/jP+L/4v/jv+T/5b/mP+X/5X/kf+N/4r/iv+K/4n/if+I/4n/iv+M/4z/if+G/3//fP94/3D/bf9s/3P/gv+K/47/jv+O/47/RYFFcUWBRXFEgERxQoBBcUCAQHJBgEBzPn88dDt/OnQ6fjh0N342dDd+NHU1fjR0Mn4ydjF+MHYwfS92Ln0udy5+LXgsfix4LH4seSt+Knkqfip6Kn4qeyp+Knwpfil9KX4pfSl+KX0pfil9Kn4qfSp+Kn0qfip9KX4pfSl+KX0ofih+J34nfih+KH4mfiZ+Jn4mfiV+JX4mfyZ+JX8lfiV/JX0kfyR9JX4lfCV+JXwlfiV8JX4lfCV+JX0lfiV9Jn4mfSd+J30nfid9KH4pfSl+KX0qfip9Kn4qeyp+LHssfix7K34sey5+L3oufi96L34xeTF+MXcxfjF4MX4yeDN/M3g0fzR4M380eDR/NHg1fzV4NX81eDV/NXc1fzV5Nn82eTV/NXk1fzV4NH8zeDR/NXk1fzV5NX4zejN+NHo0fjR6M34zejN+M3szfjN7Mn4zfDN+M3wxfjF8MX4xfDF+MXwvfi98Ln4ufC5+Lnwtfix9K34rfSp+Kn0pfih9KX4ofSh+J30nfSd+Jn0lfid+JX4mfiZ+Jn4mfyV+JX8lfiV9Jn4qfzF/OYI/fUKFQno9iT15RopLeUuKTHdKi0p3SIxFeEKMP3k/jEF8O4pJfmCHan9khVl/WYNZgFeCWX9dgWB9a4NnekGFJnomhyZ8KIdigHaHZIFiiGSAaog6ex+IIXooiCt8KocsfS2GLX0xgzR9NYM2fDiDOHw/g2p+a4NnfmmEaX5nhmx+dIZre2SIZntniWh7aIppemmLbHpsjF97SI46fEKNRXw+jzN8MY81fDOPMHwxjzZ+QY5bflKLNX8yjDB9L44ufS6OMHwxjzN9NJA4fjyROn45kjaANpE2fzSQMn4tjyx+LY8tfi2OL34wkDR/N5E5fziSO4A9kT2BP5JBgEGTQoBCk0OAQ5REf0OUQ4BDlkOBQ5ZDgEOWRIBFlkSARZVGgEaVR4BHlkqBS5ROglGUTIJJlEeCRpRFgEWUQ4FBlECBP5RAg0OTRIVHkUeFRpFGhUmPR4VNjlaDX4tng2+Ec4Jxf2eCU31YgF9+YoBufXt/iHeKgIlyiYKEcHyBcXFwgHtzfn5/cHx/e2x5gHhoeYF5Zn2CfXB/g3R6b4Zuem6Ga3hphWx5doOFeJKBkHWHgINvf4B+aoCAgWqAf4Fsgn+DbIN/gmyCf4FsgIB+a3mAc2xog2FwW4RXd1GDUXpagmh7c4N1eXeDeHZ6g311f4GAcoKBhHKHgYpwjYGPa46CjmaNg4llgYV3bHCEbHRqhGJ0XYRgc2GEYnRig2JzYYNjc2SCZnNng2RvXoVZb2SFZnJlgm18cn16hpF3mo6edZqUeHlAm0J5RqNFdkSmSHRHpkd0RaVDdESkRnREpUR0Q6RFb0qiZGqSm6xyuIi6fb2Cvn6+gL5+voC+fr6Avn6+gL5+voC+fr6AvX68gLaCsoashaeOooSdjpuCloaPhIeChISCfIGCg3GFgIlnh4B9anuAe3V6gXp+eX94gHh/d352f3d6fYFzgGR7ZI1ncWWTZnBrj2x0b4pze3eDeH97fnuBe3t7f3p9gXyHgIh7hn+Ie494lH2Uc5J/j3WPgI12jYCNdYuAi3aLgIt3jX6QeZSAlnuXgZSBk3+Nhol8iYqIeIiLhnSHjYZxio6McYyOi3GGjYBxf4x7cnmLdXF0indzfoOIeI55j32RcZGAj25C/0L/Qv9C/0L/Qv9B/0H/QP9A/0D/P/88/zv/Ov86/zn/N/82/zX/Nf81/zT/M/8y/zL/Mv8x/zD/L/8u/y7/Lv8t/yr/Kv8r/yv/K/8q/yr/Kv8q/yr/Kv8q/yn/Kf8p/yn/Kf8p/yn/Kf8q/yr/Kv8q/yr/Kv8p/yn/Kf8p/yn/Kf8o/yj/KP8o/yb/Jv8m/yb/Jf8l/yb/Jv8l/yX/Jf8l/yT/JP8l/yX/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8m/yb/J/8n/yf/J/8p/yn/Kf8p/yr/Kv8q/yr/Kv8s/yz/LP8s/yz/L/8v/y7/L/8v/zH/Mf8x/zH/Mf8x/zH/M/80/zT/NP8z/zT/Nf81/zX/Nf81/zX/Nf81/zX/Nf82/zb/Nf81/zX/Nf80/zT/NP81/zX/Nf80/zP/M/80/zT/NP8z/zP/M/8z/zL/Mv8y/zL/M/8z/zL/Mf8x/zH/Mf8w/y//Lv8u/y3/Lv8t/yz/LP8r/yr/Kv8p/yj/KP8o/yj/KP8n/yb/Jv8l/yX/Jf8k/yX/Jf8l/yX/Jf8l/yb/J/8o/yv/L/86/0L/R/9I/0P/Pf9G/07/T/9Q/07/Sv9K/0X/Qv8//z3/PP86/zb/Of9N/2j/af9d/1j/Vv9U/1X/Wf9d/2P/af9W/zL/If8k/yz/YP92/2P/Y/9i/2f/Mf8i/yr/LP8w/zP/Mv8x/zP/N/84/zz/OP89/2n/cf9q/2j/av9o/2n/b/9s/2b/Z/9q/2r/Z/9q/27/bv9b/0L/Of86/z//RP9J/zv/M/80/zT/Mv8w/zH/Nv8//1D/Sf8z/zD/L/8v/y//L/8y/zf/Nv83/zb/Of88/zz/Of84/zX/M/8v/yv/K/8s/yz/Lf8t/y//Mf81/zn/Ov87/z3/Pf8+/0D/QP9A/0D/Pv8//0H/QP8//z//Pf8+/z7/QP8//0H/Qf9D/0T/RP9E/0T/Rf9I/0r/Sv9J/0j/Rv9E/0X/Rf9D/0H/QP8//0D/Q/9E/0X/Rv9H/0b/SP9H/0f/Sv9P/1j/YP9m/2P/Vv9J/0//Xv9l/27/fP+J/4r/i/+K/4X/fP9w/3H/ev99/37/ff95/3n/ev96/3r/fP9//4D/d/90/3H/b/9u/2z/bv95/4j/kv+N/4b/gf9//37/fv9//4D/gf+D/4T/g/+C/4H/f/+A/37/e/94/3L/af9l/2H/W/9X/1f/Xf9p/3P/df93/3f/ev99/3//gf+E/4X/iP+M/47/jv+O/43/if+C/3j/cP9n/2P/YP9g/2H/Yv9j/2P/Y/9j/2T/Zv9m/2b/Yf9d/13/aP9o/2j/a/9y/3X/gP+V/57/m/91/zz/Qv9F/0b/Sf9H/0b/R/9E/0P/RP9F/0P/Q/9C/0X/V/+D/6X/tP+7/73/vf++/77/vv++/77/vv++/77/vv++/77/vv++/7r/tv+y/67/qf+i/5n/lv+R/43/iP+E/4L/fv99/3v/fv+F/37/e/97/3r/ev97/3r/eP93/3b/d/99/3f/Z/9l/2b/Z/9l/2r/bP9v/3D/c/91/3n/e/97/33/fP+B/4f/h/+F/4r/kv+U/5T/kv+P/4//jf+N/43/i/+L/4v/i/+P/5L/lP+W/5b/kf+M/4n/if+J/4n/iP+G/4f/h/+K/4z/i/+J/4P/gf+B/3//f/+A/4P/h/+J/4z/kP+Q/5H/k/+R/0CAQHJBgEFyQIBAcT+AP3I9gD5zPoA8czp/OnQ5fzl0OH43czR+NHQzfjR1M34zdTJ/MncxfzF3MH4vdy5+Lngrfyt5LH8reSx/K3orfyl6KX4peip+Knsqfip8Kn4qfCt+K3wqfip8Kn4qfSt+K30rfit8K34rfCp+Kn0qfip+Kn4qfih+J34ofih+J34mfiZ+Jn0mfiZ9Jn4mfSZ+Jn0mfiZ9JX4lfSV+JnwmfiZ8JX8leyV/JXslfiV9Jn4mfSZ+Jn0mfiZ9J34nfid+KX4qfSp9Kn0qfSp+Knsrfit7LH4tfC1+LXoufi97L38vezB/MHkxfzF5Mn8weDJ/MngyfzR5NH80eTV/NXo2fzZ6NoA2ejaANno1gDV5NYA1eDV/NXk1fzV5NX81eDV/NXg0fzV4NX80eDN/M3kzfzN5M34zeTN+M3kzfjN6Mn4yejJ+MXsyfjJ7MX4xezF+MHswfTB6Ln0uey19LXstfS17LH4reyp+Knwpfil9KX4ofSh9KH0nfSZ9Jn4lfSV+JX4mfiV+JH4kfiR+JH8kfiV/JH0mfiZ+Kn4ufjiARX1MhlB5SYtEeEeMUnhUjFZ2Uo1Nd0mORHdBjj54PIw8eTmKOXwyiS5/OIdWgWWFYoBXhFWAU4VWgFiDXH9ehGd6Z4RLeCuFH3wniGOAcohhgWWJaHxdiid5KoosezKKN3s9iEN6S4dMekmHQHlJhWp9c4Ntf2qDbX5phWl9cIZufWaHaHppiml6a4pueGeNWnlMjzt6OZE6ej2QP3tAjzt7NpE0fDKQMnwwjzB9NI42fTeOO4A3jDF/L4wxfTGOL3wwjjN9N5A6fzmRN386kkCAQZM9gDqSNX4zki99K5ErfCyPLXwtjy18LZAvfTKSNn82kjmAO5M7gDyTP389kzuAO5M6gDuTPYA+lDx/O5Q7fj2VPn4+lj9+P5ZAfkGWQ35DlkJ/QZZEf0aVRoFHlUeBRpVEgUOVQoFClUCBP5VAgT+VQIJClUODQ5VEhESTRYRFk0WDRpJFg0eSSoNRkFWDUY1KgUWIR39XhmZ+c4B+gIh2iIGIcYeDg3F5gm1ycIB3cnt/fW97gHpseYF5aHmCemd8gIBzhIJ+f3eGcX5xhW96b4Vye32Di3qTgYx2hYCAcnp/e216fn5tf3+BbYN/hXCDf4Jvfn98b32AfW99gHxudYFxa22BaW1kgWFvYIBjcmKCaXNzhHZ0d4N3eHuDfHR/goNzhIKGc4iCi2+Ogo5sjoSKa4KFeWxwhGVwYoRic2OFZHFjhWN0Y4RjdWODY3Rmg2RyY4Njcl2CXnNpgmpzaoNteXKAc4V0eoyOm3iYlHJ5PptBeUWiRHVFpkNzQ6ZFdESmRHVEpEV0RKRCckSlS2ptoplsro+2eLqEvX2+gb5+voC+fr6Avn6+gL5+voC+fr6Avn6+gL5+uoO4gbWEroSri6CBlYyRgJCFjoCMgIqAhXqDgX5yeoB5bX6Afm57gXp3eoJ6fXmAeIF4gHd9dn91enyBen1ofGWKaHNnk2RxZY9qcm6LbnhxhnR9doF5f3x9fX98gIF9iH+GfIZ9jn2SeJF/k3WQgY52j4CNdoyAjHeLgIt3jICMeI9+k3+WgJSCkXyMh4h4i4mLeIyJjXiNhIt3h4WIdYqJi3OJiYV0hIeGeYaBh3iJeYt6jXSPf5BtkYGQaZGClGeTgpNrQP9A/0D/QP8//z//P/8//zz/PP87/zr/Of85/zj/OP83/zb/Nv82/zX/M/8z/zP/Mv8y/zH/Mf8w/y//Lv8u/yz/K/8r/yv/K/8r/yr/Kf8p/yn/Kv8q/yr/Kv8q/yr/K/8r/yr/Kv8q/yr/K/8r/yv/K/8r/yv/Kv8q/yr/Kv8p/yn/Kv8o/yj/KP8n/yb/Jv8m/yb/Jv8m/yb/Jv8m/yb/Jv8m/yb/Jv8m/yb/Jv8l/yX/Jf8l/yb/Jv8n/yf/J/8n/yf/J/8n/yj/Kf8q/yn/Kf8r/yv/K/8r/yz/LP8s/y3/Lf8u/y7/L/8v/zD/MP8w/zH/Mf8x/zH/Mv8y/zL/M/80/zT/Nf81/zb/Nv82/zb/Nv82/zX/Nf81/zX/Nf81/zX/Nf81/zX/Nf81/zP/NP81/zT/M/8z/zP/M/8z/zP/M/8z/zP/M/8y/zL/Mf8y/zL/Mv8x/zH/Mf8w/zD/L/8u/y3/Lf8s/y3/LP8r/yv/Kv8p/yn/KP8o/yj/KP8n/yb/Jv8m/yX/JP8k/yb/Jv8k/yT/Jf8m/yT/I/8k/yT/Jv8p/y3/OP9F/0//VP9S/03/S/9T/1j/Vv9T/0//S/9H/0P/P/87/zr/N/8z/zL/L/8u/yz/Pf9Y/2f/Yf9Z/1T/U/9W/1j/W/9g/2f/Yv9C/yb/JP9e/2//Yf9l/2X/Vv86/zj/Nf89/0D/Sf9M/1H/WP9j/3L/cv9s/23/bP9q/2v/cP9w/2r/af9r/2z/b/9q/1P/Rf9G/0f/SP9D/0H/Qv9B/z7/OP80/zT/Mv8w/y//L/8z/zb/N/82/zP/Lv8t/y7/Mf8x/zH/NP85/z3/O/83/zv/Qv9E/0D/Pf83/zH/L/8r/yz/LP8t/y3/Lf8t/y//Mf80/zb/N/84/zr/O/89/zr/OP84/zn/PP88/zz/O/87/zv/Ov86/zr/Pf89/z3/Pv8//0H/Qv9D/0P/RP9E/0X/RP9D/0H/QP9A/0D/Qf9B/z//P/9A/0D/Qf9B/0L/Qv9C/0L/RP9D/0T/RP9D/0T/Rf9G/0T/Rf9F/1P/aP91/4P/h/+G/4f/hf+A/3T/bf9x/3j/eP96/3r/ev95/3n/ef96/3v/fP+J/4z/eP91/3L/cf9x/3f/f/+M/5L/i/+F/4D/e/96/3n/e/9+/3//gv+E/4P/gv9+/3n/d/94/3r/ef96/3f/eP9w/27/bP9t/23/bP9o/23/dP93/3f/eP97/33/gv+F/4b/hv+H/4j/i/+K/4f/f/91/27/av9m/2L/Zv9l/2T/ZP9j/2P/Y/9j/2P/ZP9i/2D/X/9m/2z/b/9s/2r/cP94/3n/gf+O/5P/b/9D/0L/R/9E/0X/RP9B/0P/RP9E/0T/Rf9E/0L/Q/9X/4X/pv+z/7f/vP++/77/vv++/77/vv++/77/vv++/77/vv++/77/vf+9/7n/uP+y/6v/oP+Z/5X/lv+V/5T/kf+O/4r/hf9+/3b/df95/3n/ef96/3r/ef94/3f/d/91/3b/ef96/2f/Zf9l/2T/Zf9m/2n/a/9s/27/cv92/3n/ff99/3z/hP+I/4b/iP+Q/5P/kv+R/5H/j/+P/43/jP+M/4v/i/+M/4z/kf+S/5H/j/+M/4j/iP+K/43/kf+W/5b/kv+O/4v/iv+L/4r/iP+M/4//kP+S/5L/kv+R/5D/kv+R/5P/kf+R/5L/kv8/gD9xP4A/cT6APnE9gD1yPn47czt+O3M5fzd0OH84dDd+NnQ3fjZ1NH4zdTN+MnYxfzF3MH8wdy5+LXcufi54K30reSt9K3kqfit5K30reSp+Kngqfip5Kn4qeip+Knorfit6Kn4qeip+Knosfix6LH4seyx+LHssfix7K34qeyp+LHsrfih7Kn4qeyh+KHsmfiZ9J34nfSd+J30nfid9J34nfSd+J30nfid8KH4ofCd/J30mfyV9Jn4nfid+J34ofih+KX4pfil+KX4pfip+Kn4qfSt+LH0sfix8Ln4ufC5+Ln0ufi58L34wey9/MHswfzB6MX8wejB/MnkyfzJ5Mn8zeTR/NHk1fzV6NX81ejaANno2gDZ6NYA1ejaANnk1fzV5Nn82eTV/NXg0fzR4NH80eDR/NHgzfzN5M38zeTN+M3oyfjF6Mn4yejJ+MnoxfjF7MH4xezB+MHswfi97Ln0uei19LXssfSx7K30reyt+Knspfil8KH4ofSh+J30nfSd9Jn0mfSZ+JX0kfiR+JH4mfiR+I34jfiN/I34jfyR9I34kfiZ9K342f0F9TINWeVqKVnhRjFN4WIxZdViNVHNOj0tzSI9EdD+OPHY4jTN4MYowey6JL3wsiSx+RIhhgGiGXoBWhVR/VINUgFiDX31jhGh8Y4ZFfCyHXn1piF19Y4toelCLK3g3ijx4RYhUel2IZHxqhm9+c4Vqf2qEbH5thW1+cIZwfGyHbHxth218Z4hQezyLQnpNj1F5T5NIeEmTTHhJkUF6OpE1ezSRM3wykC58LY0wfTWMNX41jDR+MIwvfSyMK30yjjV9M48zfjiROX85kjh/OZNAgESTQ4BCkjx+NZIxfS2RLXwtjyx8LJAufC+SL3wxkjN9NJI0fjaTOH44lDl/OJQ3fzeTN347kzp+OpQ5fjiUOX04lTl+OpY6fjmWO349ljx+PZZAf0GWQn9ElUGAQpVCgEKVQH8/lUB/QJU+fz6VP38/lT+AP5VAgUCVQYJBlEGCQZRBgUKTQoJCk0OBQ5RDgUKTQoBCkEWAVIppgHaBgYGAeIGCgnKCg3tyb4Jpcm+AdnF2f3dueIB4a3iBeWd6gnVmdYF2c4eBkoGAg3mBdoZ0fXKFeH6Cg4x+kIGKeoOAf3V7f3hzeH54c3x/f3OCf4R0hX+Dcn9/eHJwgXBxdIF3cHWBd2x2gXVqc4RyanOCdWp0gnFqbIRra3SDd294g3hwe4J/cYWChnGFgoZxh4KIcYiChXB9hHVsc4RwbGuEZm9jhWVxZoVmdGaEZHVjg2N0YoNjdWCDW3VdgWNzZ4Frc3GBbndvf3KCdXl7i4l3iJFweUaaQ3hDokV0RaVFc0KnQXNCp0NzRKVFckalQ25KpGppl5yscrWIu3q8gr59v4G+fr6Avn6+gL5+voC+fr6Avn6+gL5+voC+fr6AvX+7gbmBs4WogKOGon+gg6B/oYCcgJZ6k4SMcn+Edm11gXdueIF5dHqCenp5gHd+d4B3fnZ/eHp6gX19aHtliWVxY5JmcGSRZ3Foj2t1bohyenaDeX59gnt+fYCFfYZ/hnyJfZB9lHiTf5J1kIGOdo+AjXaMgIx2i4CLdouAjXuSfpGCjnyMiIp4iIqId4uHkHmWfZt9mnaXgZV0kYCPeI5+kHeRfpNwlYCWapSBk2STgpJikoSSY5GEkWWShZFqkoWPbjz/PP88/zz/PP88/zv/O/88/zn/OP84/zj/N/81/zX/Nv81/zb/Nf8z/zL/Mv8x/zH/Mf8w/zD/Lv8t/y3/Lf8r/yv/K/8r/yr/Kv8q/yr/Kv8q/yr/Kv8q/yr/Kv8q/yv/K/8q/yr/Kv8r/yz/LP8s/yz/LP8s/yz/LP8s/yz/K/8q/yr/Kf8o/yj/KP8o/yf/J/8n/yf/J/8n/yf/J/8n/yf/J/8n/yf/J/8o/yj/J/8n/yf/J/8n/yf/J/8n/yj/KP8p/yn/Kf8p/yn/Kv8r/yv/K/8s/yz/LP8u/y7/Lv8v/y7/Lv8v/zD/MP8w/zD/MP8x/zD/MP8y/zL/Mv8y/zP/NP80/zX/Nf81/zX/Nv82/zb/Nv81/zX/Nv82/zX/Nf82/zb/Nf81/zT/NP80/zT/NP80/zP/M/8z/zP/M/8z/zL/Mf8y/zL/Mf8x/zH/Mf8w/zD/MP8w/zD/L/8u/y3/Lf8s/yz/K/8r/yr/Kv8q/yn/KP8o/yf/J/8n/yf/J/8m/yX/Jf8l/yT/JP8k/yT/JP8k/yP/I/8j/yP/I/8k/yT/Jf8p/zD/Ov9G/1H/Wf9Y/1H/Uf9Y/1n/WP9Y/1P/T/9M/0j/RP8//zv/N/81/zL/L/8u/y3/L/8q/zH/SP9l/2n/Wf9T/1P/Vv9Y/1n/XP9k/2n/Yv9W/2r/cf9j/2T/Yv9K/zj/S/9f/2X/Z/9n/27/dP9s/2j/av9s/23/cP9w/2v/bf9s/13/Pf8t/zX/Sf9b/13/VP9P/03/Rf9H/0f/Pf83/zT/Mv8z/zD/L/8s/zD/Ov89/zb/Mv8x/y7/Lf8t/zD/M/82/zb/OP86/zr/OP85/z7/Qf9F/0L/QP85/zP/L/8t/y3/LP8s/y3/Lv8w/zL/Mv8y/zT/Nf81/zX/Nv83/zf/N/84/zn/OP85/zr/Of84/zj/OP84/zj/OP84/zn/O/87/z3/P/9A/0H/Qv9C/0L/Qv8//z7/P/8//z7/Pv8+/z7/Pv8+/z//QP9A/0H/Qf9B/z//P/8//0D/Qf9B/0L/QP9C/0H/Sv9b/2v/ef97/3v/fP99/3n/cv9r/2n/cP90/3T/dv93/3f/d/95/3j/cv9n/2z/gP+T/4//ev94/3b/c/95/4L/jP+O/4j/g/9//3z/ef95/3n/fP9//4P/hf+G/4T/f/94/2//af9t/23/b/9w/3P/dv92/3X/df93/3b/df90/3D/bf9y/3f/ev97/3//hP+F/4X/hv+G/4f/h/+E/3//ef90/3D/bv9p/2r/Z/9m/2b/Zf9j/2P/Y/9j/2H/Xf9a/13/Y/9n/23/df91/3X/b/9t/3D/hv+I/3D/TP9E/0T/RP9F/0T/Qf9D/0P/Q/9E/0T/Rf9G/1b/gP+j/7L/uP+7/73/vv++/77/vv++/77/vv++/77/vv++/77/vv++/77/vv++/77/vP+7/7j/tv+1/7H/qv+m/6P/m/+U/47/g/96/3X/d/94/3n/ev96/3n/d/93/3f/d/93/3r/ff9o/2X/ZP9j/2T/Zf9n/2j/af9t/3H/dP96/3z/e/99/4T/hf+G/4n/k/+U/5P/kv+P/47/jv+N/4z/jP+L/4v/i/+N/5D/j/+N/4r/iv+I/4j/i/+Q/5j/nf+c/5n/mP+W/5X/lv+W/5b/l/+X/5f/lf+U/5P/k/+T/5P/kv+S/5L/kf+Q/4z/PH88cjt/O3I7fjtzOn46czl+OXI4fjhyN342dDd+N3Q2fjZ0NX41dDJ+MXYxfjF2MH4wdy5+Lnctfix3K34rdyp9KnkqfSp5Kn4qeCp+Kngqfip3Kn4qdyp+Kngrfit4Kn4qeSt+K3otfi15LH4seS1+LXotfi16LX4teSx+LHssfit6Kn4qeip+Knopfil7KH4ofCh+J3wnfid9KH4ofSh/KH4ofyh+KH8ofSh/KH0ofih9J34nfih+KH4ofih/KX4pfil+KX4pfil9Kn4rfyx+LH8rfix/LX4tfS1+LX0ufS57L30veS9+L3owfzB6MH8xejF/MXowfzJ4Mn8yeDJ+M3g0fjR4NH80ejV/NXo1gDZ6NoA2ejWBNXo1gTV6NX81ejV/NXo1fzV5NH80eTR/NHk0fzR5M34zeTN+M3kxfjF6MX4xezB+MHswfjB7MH4wfDB+L3wvfi98L34ufC1+LXwsfi18LH4rfCt+Knwqfip7KX4pfCh+KH0nfid9J34mfSZ+JX0kfiN+JH4kfiN+I4AifiOAIn4ifyJ+In8jfiN+I34kfiZ/LYA2f0ODTXxTiFR6UIxOelWOWnZbj1t0WZFUcU2SSXJHkUJyP448djeMM3cyiy95K4ksfSyKLH4riDOBVYZpgF+FWoBXhVd/V4RZf1mFWn5ihmp8cYZ1fHSIcHtviG56bIdpemeGZX1ihWyAcoJqf2iDZ35qhG5+cYZyfm6Fanxchj58IoUpezOIR3hdjF94WpFSeE2SQnk4kkV7RZE7ezWRMnsykTB7L48ufC+NN31Ii0x9PIszfzGML34vjS59Lo4zfTePOH45kTt/OJE2fjeTPH5ClEaAQ5VBfzyTN34xki99LZEsfCyRLXwvkjF8M5EyfTSTNHwzkzV8NZM1fDWUNn02lDZ+NpU2fjiVN3w3lDd8N5Q5fTmWOH04ljd9N5Y4fTiWO309lj59P5VAfkCVP34/lD9+PpU/fj6VPX48lT1+PZU9gD2UPoA/lECAQZRBgEGUQIBAlD6APpQ+f0CUQH8/k0KASY9Xf2OHcoB6gHeDdnp6hHl2cYRqdV6DYnVsgnFwc4B1bnWBdmp3gXdnd4JxZGOCV3BugI2AmIGChH2DeYB4hHt9hIOMfIt/hnqCfn91fX56dHp9e3R8foB1hH6FdYh9h3SDf3xxc4Fic1+CZHdng2h0bIJub3CDc211g3hoeIJ2Z3SCc2Z0hHRndIR1anqCfm2DgoRthYGFbYWBh3CHg4dug4N7bXeEeGx1hHNub4RpcmeEZnZlhGR0Y4RidWKCX3NegVp0XoBmdW2AdHd3gXZ+dX5whWx4aYp2doaQcHhRmEd3RqFGdUalRHNDqEJzQ6dEc0WlRXFBpUprZKKSa6qUtHW5hb19vYC9f76Avn6+gL5+voC+fr6Avn6+gL5+voC+fr6Avn6+gL5+voC+fb6Bvn6+gL5+u4CwgKuBpoSdfo6GhHeBiHpvdYR3bHmDenF5g3l1eYF3eneAd312gXd5eoF9e2yAY4djdWSRZG9kkmZxaI5qdW2LcndzhXt8eoJ8fX6BhX2GgYZ9i3qTf5Z2koCRdY+AjnWNgI11jICLdYuAi3iNf49+kXuOho14i4qKdYqKi3eOgZR7l3acfppumoKaa5iEmmyZg5lpl4GYZ5eClmaVgpRlk4STYpSElWKVhZJlk4WNaY2Gh206/zr/Ov86/zv/O/86/zr/Of85/zf/N/82/zb/Nv82/zX/Nf80/zT/M/8x/zH/Mf8w/y//Lv8u/y3/LP8r/yv/LP8s/yr/Kv8q/yr/Kv8q/yr/Kv8q/yr/Kv8q/yv/K/8q/yr/K/8r/y3/Lf8t/y3/Lv8u/y7/Lv8u/y7/LP8s/yv/K/8r/yv/K/8r/yn/Kf8p/yj/KP8o/yj/KP8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/KP8o/yj/KP8p/yn/Kf8p/yn/Kf8q/yv/LP8s/yz/LP8t/y3/Lf8t/y3/Lf8v/y//L/8v/zD/MP8w/zH/Mf8x/zD/Mv8y/zL/Mv8z/zT/NP80/zT/Nf81/zX/Nv82/zb/Nf81/zX/Nf81/zX/Nf81/zX/Nf81/zT/NP80/zT/NP8z/zP/M/8z/zH/Mf8x/zH/MP8w/zD/MP8w/y//L/8v/y//Lv8u/y7/Lv8t/yz/K/8r/yv/Kv8q/yr/Kf8p/yj/KP8n/yf/J/8m/yb/Jf8l/yT/JP8j/yP/I/8j/yL/Iv8h/yH/Iv8i/yL/Iv8h/yP/JP8p/zP/Pv9H/0z/Sf9G/0n/T/9Z/1z/Xv9d/1j/Uf9O/0z/R/9D/z//Ov83/zT/L/8r/yr/Kf8r/yj/Kv8r/zz/Wf9l/1//Vf9a/1X/Vv9X/1r/Yf9l/2b/av9q/2r/Z/9l/2b/Yv9g/2r/c/9w/2n/aP9r/27/dP93/2//XP84/yf/Lf82/y//Sf9m/2f/YP9d/1f/T/83/zb/Sv9D/zj/Nf8x/y//L/8v/y7/Lv8y/zr/Of80/zL/Mf8u/zD/Mf8x/zH/Nf82/zf/O/84/zX/N/89/0L/Rf9F/0P/Pf84/zL/Lv8r/yz/LP8t/y//MP8y/zT/Nf80/zP/NP80/zT/NP80/zX/Nf81/zT/Nf82/zb/N/83/zn/Of84/zj/N/83/zf/N/84/zj/O/88/z3/Pf8//z//Pv89/z3/Pf88/zz/Pf89/z3/Pf8+/z//Qf9B/0H/Qf8//z//Pv8//z7/Pv8//0H/Sf9U/1//bf93/3b/dP92/3X/cP9l/1j/T/9V/2H/Zv9r/2//cf90/3X/ef93/27/W/87/zL/bf+W/4v/f/99/3v/fv+E/4z/i/+G/4L/f/99/3r/ev98/3//gv+G/4f/iP+H/4b/gv94/2n/Wf9Z/13/YP9k/2b/Z/9s/3L/dv93/3f/dv92/3X/df90/3f/ev98/3//gv+D/4P/hP+F/4X/hv+D/37/ev95/3r/df9y/2//bf9n/2T/ZP9j/2L/X/9f/17/Xf9h/2r/c/95/3f/dv91/3D/bf9r/2//gf9+/1n/RP9H/0b/Rf9C/0L/Qv9D/0T/Rf9F/0H/Tv9z/5v/rP+2/7n/vP+9/77/vv++/77/vv++/77/vv++/77/vv++/77/vv++/77/vv++/73/vv++/77/vv+9/7X/rP+g/5D/eP9u/3D/c/91/3f/d/95/3n/ef95/3f/d/93/3b/d/96/33/a/9j/2P/Yv9k/2T/Zv9o/2r/bf9x/3T/ev98/3z/fv+E/4X/h/+P/5P/k/+S/5H/j/+O/43/jf+M/4v/i/+L/47/kf+Q/43/i/+K/4v/jv+S/5P/lf+W/5r/mv+b/5n/mv+a/5r/mf+Z/5j/l/+W/5X/lf+T/5P/kv+R/5H/jv+K/4X/gP97/zl/OXU6fzp1On45dDp+OnQ4fjh0OH44dDZ+NnQ2fjZ0NH40dDR+NHQyfjB0MX4xdC9+LnUufi11LX4sdSt+K3UqfSp2Kn0qdil+KXcpfip3Kn4qdyt+K3crfix3LH4rdyt+K3csfix3LX4teC5+Lngufi55Ln4ueS5+Lngtfix6K34seit+Knorfit7KX4pfCp+Knwpfil8KX4pfSl+KH0pfyd8KH8ofCh/KHwofyh+Kn4qfSl+KX0pfil+KH4ofih+KH4pfip+K34rfSt+K38sfix/LX4tfy5+Ln0tfi19Ln4ufC9+L3owfjB6MH8wejB/MHoxfzF6MH8xejJ/MnoygDJ5M4AzeTN/M3o0fzV6NYA1ejaANno2fzZ5NX81eTV/NXo0fzR6NX81eTN/M3kzfzR5NH80eTJ+MnkyfjJ5MX4xejF+MXswfi57L34vezB+MHwvfi98LX4tfC5+Lnwufi18LH4rfCt+Knwqfil8KX4peyh+KHwnfid9Jn4mfSZ+JX0lfiR9I34ifiN+I34ifiJ/In4ifyF+IX8hfiF/IX4hfiJ+In4jfyd/MH85gkN7RYdBej+MQnpNjld3Wo9fdF+RXnFXklVxUJJLcUeRQ3I/jjl2MIsoeSeIKHwnhyZ8JoYmfyeHI4AqhkOAW4Zff1mFV39ThlJ/VYZXflmGXHxghmJ7Y4ZjemSHY3xjhmx+d4NxgGmDZ4BshHB9dIV5fWiFP30hhSN9KIIoezmDTnlliWl4ZI5jd2OSW3dMkjR4MpFBezmQNHsyjzB7L48vey6NLHwtiy98MYwvfjCLMX8xjC9+MY01fTSOMX0yjzV9N5E5fjiTOH44kz19RZRHf0aVRH9AlDt+NZMwfSyRK3wrkS58LpIvezGRM3w0kzR7NJMzezOTM3szlDN8M5Q0fDSVNHw1lTZ8NpY3fDeWNnw2lTd8N5U1fTWVNX01lTd8N5U4fDiUOn07lD5+PpQ9fjyVPH48lTx+PJU8fj2VPX48lD9+QJRAf0CUQX9BlEB/QJQ+fjyTPX49k0F+RZFTgF+KaYFzgXaCcnxyhXF7bIVkfFWEQn8+hEaCUIRYf1yDYnhngm1yc4J0anSCaGZZgVZzTH5mgo5+kIaGgYCCf4SCfYeDjHqKgYZ3goB/dX5+fnV9fX91gX6EdId+iHSJfIdyiX2Ib3+BcW1fg1F1U4NVflqEXXtghGZ3aoRycHSEdGt1hHVnd4R2ZXaEeWZ5g3pnfYOBZ4GEgmmEhIRshIOEbIODg2p+hHxqfIR6a3WEdW1whGtwaIRmdWSEYXZfgl12W4Fcd2WAaXhwgHN9dX9zhHN5bohqdGmLZ3Jyjnx4Y5ZHd0acRnZGo0R0QqVDc0OnRHNDp0RxQqZSan6ioG6tkLZ6uoS9fr2Avn+/gL5+voC+fr6Avn6+gL5+voC+fr6Avn6+gL5+voC+fr2AvX++gb5+voC+f72BtYWlhI6Lc4RjiGSDZYdpe26Fc3N4g3lxeoN6c3mCeHl3gXZ7d4F3eHmBfntufmOGYnZijmRyZpBlc2eMandsiW95dYZ7fHyCfX1/gYJ9hX6IfY93lX+UdJOAkHWPgI51jYCNdYyAi3eJgIl6jX6OgY16i4eKeIuGjnmSf5V6l3iZf5lxmoCccJuCmm+agZlumoKab5iDmHGWg5ZylIWSc5KFj3KMh4hyhYmAdHmKdXhti2R6Of85/zr/Ov85/zn/Of85/zj/OP84/zj/Nv81/zX/Nf8z/zL/Mv8y/zL/MP8w/zD/Lv8u/y7/Lf8t/yz/K/8r/yn/Kf8r/yv/Kv8q/yn/Kv8r/yv/K/8r/yv/LP8s/yv/LP8s/yz/LP8t/y3/Lf8u/y7/Lv8u/y7/Lv8u/y7/LP8t/y3/LP8r/yz/LP8r/yr/K/8r/yr/Kv8q/yn/Kf8p/yr/KP8q/yr/Kf8p/yn/Kf8q/yr/Kf8p/yr/Kv8p/yn/Kf8p/yr/K/8r/yv/K/8r/yz/LP8t/y3/Lv8u/y3/Lf8u/y7/L/8v/zD/MP8w/zD/MP8w/zH/Mf8x/zL/M/8z/zL/Mv8y/zL/M/8z/zP/NP81/zX/NP80/zT/NP81/zX/Nf81/zT/NP80/zT/M/8z/zP/NP80/zT/Mv8y/zL/Mv8x/zH/Mf8x/zD/Lv8v/y//Lv8u/y7/Lv8t/y3/Lf8t/yv/K/8r/yv/Kv8q/yn/Kf8p/yj/KP8n/yf/Jv8m/yb/Jf8l/yT/JP8j/yP/Iv8i/yH/If8h/yH/If8h/yH/If8h/yH/Iv8i/yP/J/8t/zj/Qv9H/0T/Pv9C/0j/UP9X/13/YP9f/17/XP9a/1T/Tv9L/0X/P/8u/yf/Jv8m/yX/KP8o/yj/J/8m/yT/JP8o/0D/Xf9i/1T/T/9U/1f/V/9a/17/X/9h/2P/Zf9k/2z/df9z/3D/a/9v/3L/dv94/2X/O/8l/yb/KP8m/yf/Pf9d/2n/af9l/2P/X/9V/0n/LP8r/zj/Nv8z/zH/MP8v/y7/Lf8q/yv/LP8u/y//MP8w/zD/MP8y/zb/N/8y/zL/M/82/zr/Ov84/zn/Pv9C/0T/Rf9F/0H/PP82/zH/LP8r/yv/Lv8u/y7/MP8x/zP/M/8z/zP/M/8y/zL/Mv8y/zT/NP80/zT/NP80/zX/Nv80/zb/Nv82/zX/Nf81/zX/Nf82/zf/N/86/zv/PP89/z3/Of86/zr/O/87/zv/PP89/zz/P/9A/z//QP8//z//Q/9A/z7/Pf89/z//R/9S/1r/Z/9y/3T/cf90/3L/a/9j/1X/Pv8w/zL/Of8//0T/Sf9R/1r/YP9m/23/bv9o/1//Zf9o/3L/gv+R/4v/hP+C/4L/iv+O/4r/hv+E/4L/gP+A/3//gf+E/4f/iP+I/4r/iP+I/4r/hf96/23/Vv9N/0//UP9U/1f/Xf9k/2v/cP9x/3P/dP90/3b/d/94/3n/ev98/33/ff9+/4D/gP+C/4T/hP+E/4L/f/99/3z/ef90/3T/bv9q/2f/Y/9g/17/Xv9c/2H/av9w/3D/cP9x/3H/cf9t/2n/aP9m/2n/cv9v/1D/TP9K/0r/Rf9C/0L/Qv9C/0H/Qv9F/1X/hf+j/7D/t/+7/73/vf++/7//vv++/77/vv++/77/vv++/77/vv++/77/vv++/73/vP+8/7z/vv+9/7z/uf+p/4j/aP9Z/1//ZP9l/2j/aP9r/3H/eP95/3n/ef95/3f/dv92/3b/ef9+/3P/Zv9j/2P/Z/9p/2n/av9s/27/cf92/3z/ff9+/4D/gv+F/4n/jv+S/5H/kv+P/47/jf+N/43/jP+L/4n/if+N/47/i/+K/4r/jv+R/5T/mP+Z/5v/m/+b/5n/mf+Y/5j/lv+X/5f/l/+X/5b/lf+T/4//if+D/37/ev90/2z/ZP9Z/1H/UP84fjh0OX45dDl9OXQ3fTd0OH44dDh+N3Q1fjV0NX41dDN+MnMyfjJzMn4wdS9+LnUufi51Ln4tdS1+LHQrfit0K30rdit9K3Yqfip3Kn4rdyt+K3crfit3K34sdy1+LXctfi13Ln4udy5+LnYufi53Ln4udy5+Lncufi53LX4tdy5+Lnktfit5LH4seyx+K3wrfit8K34qfCl+KX0qfip9Kn4qfCl+KXwqfip8Kn4qfCt+KX0qfip9Kn0rfip9KH4qfSt+K30sfit+K38rfit/LH4sfy1+LX8ufi59LX4tfS5+Ln0vfi97MH4wezB/MHsvfzF6MX8xejF/MnoyfzJ6Mn8yejN/M3oyfzJ6M38zejN/M3k0fzV5NH80eTV/NXk1fzV5M38zeTR/NHozfzN6NH81ejN/MnoyfjJ6Mn4yejB+MHsxfjF7L34uey9+Lnsvfi57Ln4uey5+LXssfSx7LH0reyt9KnsqfSl6KX0oeyh+KHwofiZ8Jn4mfCV+JX0mfiV/JH4jfyN+In8ifiJ/IX4hfiF+IX4hfiF+IX4hfiF+IH0hfiJ9I38mfCt/NH9BfEaGRnhEi0d2SZBPdVWQWnNfkWJyY5FhcV+UXHFXlFNzTZE+di6LKXspiCV9JIckfiSHJn4ohyp8KIcofiiIJH4qiEeAXYhdgFWIWYBdiGB7YYdje2OIaHxohW1+c4RwgGyDa4BtgnF/c4V3fWuJTno0hyx5K4cmdieGKndDh155aYpieVeOUnhZkFN4So4teSiPN3o2jTB7MI8wey+OLXstjip8LI0wfC+NMX0xjDF+Mo4xfjOOOH45kDd+NZE3fDqSPH0+lDx9O5Q7fkCUQ35FlkV+QpU/fjuVNX0wkyx7K5IseyyRLXsukTB7MZIxezKSM3szlDJ6MpQwejCUMnsyljN7M5Y0ezSVNHs0lTR8NJQ0fDSUNXw1lTR8MpUzezSUNnw3lDl9O5Q8fTuUOX03kzh9OJM4fjiVOn47lTx8PpQ9fD2UP30/lEJ9QpRCfkGUP348kz5+Q5FQgFuLZoJxg3WEc39zhW58Z4RfflKFQIUygy+IL4IwijOBNok5gkCIRoNPhFeEX3lihGBvW4JedVaAXYB0fo2DjoGGgYSDhHuHgot4iYCFdYWAhHWEgIR1hH+Ed4Z9h3aIfYh0iX+Icoh/iG2KgIZoeYFsblaDSntIg0qDTIJSgluCZ3tug25zb4NwbnKDdGp3g3ljeIJ4YHuEfWB+hH5kfoN/Zn+EgGeBhINpgoSDbICEfmp7hHhrdoRybm6DanBkg2ByXoJbdV2BZXdogGp6bX9wgHF7b4VueGyJaXVnjGR1ZI1mdWuUV3dUmlB3SaBDdUKjQXVCpkJzQqZBb0WmWGqHn6RvsI62erqDvH68gb5+voC+fr6Avn6+gL5+voC+fr6Avn6+gL5+voC9f7yBu3+6grp/vYK9fruBt4WtiIWNXI9Qi1eUXYVgjmSFZ4Nohml5aoZyc3eDeHF4gnh2doF2eXd/eHZ8f4B1eYBxfHB+coJzeXOBc3lzf3R7dH13fH19f39+fn9/gYCCf4Z8in+NdpF/knaRf452jYCNdYyAjHWLgIp3ioCLeo9+jYCKe4uEjXmQgpN8l3eYfphwmoCZcpqBmXSYgZV3lIGSd5GCkXeQg5B6joSMfIiEgH53h3CCZ4hghViJToVHikSHSItOhDj/OP84/zj/OP84/zf/N/84/zj/N/81/zX/Nf81/zX/M/8y/zL/Mv8y/zD/L/8u/y7/Lv8u/y3/Lf8s/yv/K/8r/yv/K/8r/yr/Kv8q/yv/K/8r/yv/K/8r/yz/Lf8t/y3/Lf8u/y7/Lv8u/y7/Lv8v/y//L/8v/y//L/8u/y7/Lv8u/y3/Lv8s/yz/LP8s/yz/K/8r/yv/Kv8q/yv/K/8r/yv/Kv8q/yv/K/8q/yr/K/8s/yr/Kv8q/yv/K/8r/yr/K/8r/yz/K/8r/yv/K/8s/yz/Lf8t/y7/Lv8t/y3/Lv8u/y//L/8w/zD/MP8w/zD/MP8x/zH/Mf8y/zL/Mv8y/zL/M/8z/zL/Mv8z/zP/M/8z/zP/M/80/zT/M/8z/zP/M/81/zX/NP80/zP/M/8z/zP/MP8w/zD/Mv8y/zL/MP8w/zD/MP8u/y7/L/8u/y7/Lv8u/y3/Lf8t/yz/K/8r/yv/Kv8q/yn/Kf8o/yf/Kf8m/yf/Jv8m/yX/Jf8l/yT/JP8j/yP/Iv8i/yH/If8g/yD/IP8g/yD/IP8g/yH/If8g/yD/If8j/yb/K/80/z//SP9K/0r/S/9O/1D/U/9a/1//Zf9l/2b/Zv9i/17/WP9N/zT/Kf8r/yj/Jv8k/yX/J/8m/yb/K/8t/y7/Lv8r/yb/Jf8q/zr/S/9X/2f/bP9q/2v/bf9u/2v/df9y/23/bf9v/3P/df93/2z/U/9J/zX/Mv88/z3/Mf8y/0z/Y/9k/1r/U/9M/03/Tf9H/zD/Jf82/zX/L/8w/zD/Lv8t/y3/Lf8v/zL/MP8x/zL/Mf8y/zP/Nv85/z3/O/85/zj/OP87/zz/Pf89/z7/QP8//0D/Qv9A/z//Pf85/zL/Lv8s/yz/LP8t/y7/MP8x/zH/Mv8z/zP/Mv8y/zH/MP8x/zH/M/8z/zT/NP80/zT/M/8z/zP/M/80/zT/NP8y/zP/M/81/zb/OP86/zv/Of84/zn/OP84/zj/OP83/zn/Ov87/zv/O/88/z3/QP9B/0L/Qf8//z3/QP9O/1n/Y/9v/3D/cf9z/2//aP9c/07/PP8u/y3/LP8t/y//MP8w/zD/NP83/zr/Q/9J/07/UP9X/1n/Uv9a/2n/f/+L/4b/hf+F/4f/iP+G/4X/g/+D/4L/gv+D/4P/hv+H/4r/iv+K/4n/iP+H/4n/iv+H/37/b/9b/0j/RP9F/0j/Uf9j/2n/a/9r/23/cP9y/3j/ef93/3f/ef97/3v/e/98/33/ff9+/37/gf+C/4P/gv9//33/e/95/3X/cv9u/2r/Zf9b/1D/VP9c/2X/Zv9n/27/b/9u/27/bP9p/2f/ZP9k/2L/YP9Y/1L/UP9G/0T/Qv9C/0H/Qf9B/0L/RP9Y/4j/pf+x/7f/uf+8/77/vf++/77/vv++/77/vv++/77/vv++/77/vv++/7z/uv+4/7f/u/+7/73/uf+x/5X/XP9F/1D/Wf9c/17/Yv9m/2f/af9o/2z/dP94/3n/ef96/3r/fP9//4L/hf+C/3//gf+C/4L/gv+A/37/fv9+/37/gf+B/4D/gf+C/4L/hv+M/47/kf+Q/4//jf+N/43/jP+M/4v/iv+K/43/j/+N/4z/jP+Q/5L/lv+X/5f/mP+Y/5n/mf+X/5X/k/+Q/4z/iv+I/4b/hP9//3n/c/9n/1//Vv9O/0X/Rf9G/0r/TP9Q/1P/OH44dDd+N3Q3fTdzN303czd+NnQ1fjV0NX41dDV+NXQzfjJ0Mn4ydDJ+MHUwfi91L34vdC5+LXQtfix0LH4sdCx9LHUrfSt1K34rdSp+LHUsfix1LH4sdSx+LHUufi51LX4tdi9+L3Yufi53Ln4ueDB+MHgvfi94L34veC5+Lngufi54Ln4ueC1+LXoufi57LH4seyx+LHsrfit7K34qeyt+K3wrfit8Kn4qfCp+Knwsfix8K34rfSt+K3wsfix9Kn4qfix+LH4sfix/K34tfyx+LH8tfi1/Ln4ufS1+LX0ufi59L34vezB+MHswfzB7MH8wejB/MXoxfzF6MX8yejJ/MnoyfzJ6Mn8yejN/NHozfzN5M38zeTN/M3kzfzN5M38zeTN/M3kzfzN6M38zejN/Mnowfy56MH4xejF+MXowfjB7MH4vey5+Lnsufi57Ln4uey1+LXssfix7K30reyt9KnsqfSl7KX0oeiZ9Jnsnfid8Jn4mfCV+JXwkfiR9JH4jfSN+In0ifiF9IX4hfSB+IH4hfiF+IH4gfiF+IX4efiB9IH4hfSJ/JX4rfzOAPXxFhkl4TIxPdlGPUXRUkFt0YJBmc2uQanJmkGRyY5BbdEiPMXgsiy97LIkofCmJKXspiSd7KYkqeiyJLHstii97LoowfDGKMX4yijh+QYpRf1iKYH9jiWZ/coNygG+Cb39ygnR9dYR0fGWHUXlQiU94O4k7d0iJT3dKiE93W4pgeFiLVXpSjUt5S49PeUaNMXkkjTN6NYwwezCNL3stjS57LYwxfDaOOHw1jzV9M48yfjSPNH42jzl/P5A+fz2RO3w7kzx8QJRAfEKUQX4+lTx+P5ZCfkCWQH49lzt9NJUvey2SLXstkS17L5ExezGSMnsykjJ7MpQyejKUMnoylDJ7MpQyezKUNHs0lDN7MpQxezGTMnsykzN7M5QyezGUMnsxkzF7NZM2fDeTN3w1kjZ9N5M3fTeTN303kzh9OJM4fTiSOX05kjp9OpI8fT2SP31Akz19QJFIfVeMYYFuhXGEcYFyhm+AZ4Zcg1CFPogwgy6LLYEsiy2ALYsvfy+NMIAxjjGAMo00gjiLPINCh0iESYNLglCGWIFqhn6DfIR5hnx/foV/eYCDf3V/g4BzgIGCdIaAhnWHf4l3iX+Kdot/iXOHf4ZtiYCLZ4yBiWaBgnNvXIFIfEKBQ4FKgVuBY4BmfWaAaHhtgHJweYB5ZHeBd2J5gnpieoN6YXqEemJ7hHxjfoR+ZX6EgWiBhH9pf4N7a3qDd211g3Nvb4NscWWCX3NhgWh8ZH5fgWR7bYRvdm+HbnZsi2h1ZoxidWGNYXRfkFt2TpdOdkidRnZDokJ1QqVCdEKmPnBEpllriZ+mcbCNt3q5g7t9vYG9fr6Avn6+gL5+voC+fr6Avn6+gL5+voC+fryAu3+5g7Z/tYa3frqEu3+5g62Hgo9GiUWYT4NWm1yAXpRggmSMZIVngmmGaXtvg3d0e4J7dHyBf3GBf4Vuh3+Ha4qAimqLgYtrioCKaImAh2mGgIRphIGGaYaBhW6EgYNzg4CHdIyAjnORgJB2j4COdoyAjHWMgIx1ioCJeYuAjXuPfo2AjXuPgZF7lHqVfpd0ln+Vc5aAl3WXgZZ3lIKOeomDhXt9g3h+dYVxg26EY4hWhkyLRoZCjEGGQIlDh0iHTYpNhFCLVII3/zf/N/83/zf/N/82/zj/N/82/zX/Nf81/zX/Nf81/zP/Mv8y/zL/Mv8w/zD/L/8v/y//Lv8t/y3/Lf8s/yz/LP8s/yv/K/8q/yn/Kv8s/yv/K/8s/yz/Lf8t/y7/Lv8u/y7/Lf8t/y7/Lv8v/y//MP8w/y//L/8v/y//Lv8u/y3/Lf8t/y3/Lv8u/y7/Lv8t/y3/Lf8t/yz/K/8r/yv/LP8s/yr/Kv8r/yv/K/8r/yz/LP8r/yv/K/8r/yz/LP8s/yz/LP8s/yz/LP8r/y3/Lf8s/y3/Lf8u/y7/Lf8t/y7/Lv8v/y//MP8w/zD/MP8w/zD/MP8x/zH/Mf8w/zH/Mv8y/zL/Mv8y/zL/M/8z/zP/M/8z/zP/M/8z/zP/M/8y/zL/M/8z/zP/M/8z/zP/M/8z/zL/Mf8w/zD/Mf8x/y//L/8u/y7/Lv8u/y7/Lv8t/y3/Lf8t/yv/K/8r/yv/Kf8p/yn/Kf8o/yf/J/8m/yf/Jv8m/yX/Jf8k/yT/JP8j/yP/Iv8i/yH/If8g/yD/IP8g/yH/If8g/yD/If8h/x7/IP8g/yH/I/8o/y7/Nv8+/0X/Sf9L/1D/U/9U/1f/X/9k/2r/bv9s/2n/Zf9i/1b/Pv8u/y3/LP8q/yr/Kv8t/y3/KP8q/yr/LP8s/yz/Kv8q/y3/Lv8w/zH/Mf8w/y7/Lv8o/yj/ZP9y/2z/bP9r/2j/af9t/2D/Sf9M/07/UP9E/0P/Tv9S/1H/Wf9e/1r/Wf9d/1v/Vf9V/1T/Uv88/yf/L/82/zj/M/8w/y7/Lf8t/zH/N/89/zz/Ov82/zP/M/8z/zX/O/9A/0H/Qf9D/0H/P/9A/0L/Qv9B/zz/Ov88/z7/Pf89/zz/Ov81/zH/Lv8t/y3/Lf8v/zH/Mf8x/zH/Mv8y/zL/Mv8y/zL/Mv8y/zL/Mv8z/zP/Mf8x/zH/Mf8x/zH/M/8z/zL/Mf8v/y//Mf8x/zL/NP80/zP/M/80/zX/Nf81/zX/Nv82/zf/N/85/zn/Ov86/zz/Pf8+/z//Pv9G/1D/Xf9r/3L/bv9v/2z/Zv9c/07/Pf8w/y7/LP8s/yz/LP8t/y//L/8v/y//MP8w/zH/MP8x/zP/Nf85/zv/Pv9B/0v/YP9m/2D/ZP9o/2v/cP9x/3P/dv96/33/g/+F/4X/h/+J/4n/i/+J/4n/hv+E/4f/iv+M/4z/hP92/2P/R/8//0j/V/9j/2b/ZP9l/2v/cP96/3n/dv93/3n/ev97/3n/eP94/3j/ev97/3z/ff9+/33/fP+A/3//fP96/3b/c/9y/2//b/9w/2z/a/9u/2v/a/9v/2//b/9s/2r/aP9m/2L/Yf9i/2D/XP9L/0z/T/9H/0P/Qv9C/0L/Qv9B/0L/Vv+E/6P/rv+2/7n/vP+9/77/vv++/77/vv++/77/vv++/77/vv++/77/vP+6/7j/s/+v/7X/u/+7/7f/p/9w/0j/TP9R/1n/XP9e/2L/ZP9n/2r/av9q/23/c/97/3//gf+E/4f/i/+N/43/j/+P/4//j/+O/47/jf+L/4j/h/+H/4f/h/+G/4b/hf+E/4j/jP+O/5D/jv+O/47/jP+M/4z/jP+K/4n/i/+N/4//jf+N/4//kf+T/5T/k/+V/5P/k/+U/5P/jv+M/4b/f/91/2z/ZP9g/1r/T/9F/0D/PP89/z7/Qf9A/0P/SP9M/07/T/9S/zd+N3Q3fjd0N303czd9N3M2fTZyNX01czR+NHQzfjN0M34ydTJ+MnUyfjB1MX4wdTB+MHUvfi51Ln4udi1+LHYtfi11LX4tdS1+LXQufi50Ln4ucy5/LnQufy51Ln8udS5/LnUxfzF3MX8xdzB/MHcwfjB2MH4wdjB+MHcwfjB3LX4teC5+Lngtfi55MH4ueS5+Lnotfi16Ln4uey1+LXstfi17LH4seyx+LHwsfix8LH4sfC1+LXwsfix9LH4sfSx/LH0sfyx+LX0tfix9Ln4ufS5+Ln0ufi19Ln4ufS5+MH4wfjB+MHwwfjB8MH8wezB/LnsxfzF7MX8xejB/MHkygDJ5MoAyeTGAMXsxgDF7M380ezV/NHszfzN6Mn8yejJ/MnoyfzJ6Mn8yejF/MXsxfjF6MX4xejB9LnswfTB7LX4tey1+LXstfi18LX4teix+LHsrfix7K34reyp+KnsqfSp7KX8pfCh+KHsofih7Jn4lfCZ+JXwlfiV8JH4kfCN+I34hfiB+IX4hfSB+IH0gfiB9IH4gfSB+IH0ffh99IH4gfiB+In0kfyp/MH84g0B8RYhIekuMUHdTjVZ3Wo9id2aPa3Rvj25zaZBlc16QT3Qwjip6KYwpfCmKKnwqiC18MYoseiyKLHssii17LYoqfCWLI3wkiid9LIkwfDCKMXs2iS59WoV2gGqEan9rg29+bIRoelyHVXhKiUl2SotJd0WLS3hSi095WIldemGMYHlhjWF6Wo9Yel+PXnlakEt6L44pezSNQX1AiTV9LoktfDCKOnxBjEN9QpA8fTaRNH40kDZ/OY87gD+QQ39EkUV+SJNEfUKUQX1ClkN9PJY3fTiWOX05ljl8OpY4fDiWNHowlC16LZMsei6RMHowkTF6MZMxejGTMnoylDF6MZQyejKVMnoylDJ7MpMxezCTMHswkjB7MJIyezKTMXsxky97L5MwezGTMHswkzF7MZMyezKRNHs0kTR7NJE2ezaRNns2kTh8OZE4fDmRO3w9kT1/PZFAfkqPVoBkim6CbIVuhWqEZYVbhU2EO4ozgS+NLH8rjix/LI4tfi2NLn4ujS9+L44wfjCOL38vjTB/MI0ygTKNMYEyjTODNotAhEWJRYdJh02HU4JVhlt8YYVjemiDb3t0gnl5eoKAeIaAhXSIgIlxhoCEbIWBhWiHgYpljYKNaIeCeW9lgUl6R4BWf2R9ZX9he2N5aXxzc3l9eWp2fnZoeX55Z3p/eWN3gnRgcYR2YHeEemF8g31mfYN9Z36Df2d9g31oe4J5aXaCc21ygW5yboBve299boBte2yFbXhuh2p1Z4xndWWMYnRhjWF1Yo9ddk+US3dTmlB3RKBCdkSkQ3NCp0NxRKdSbnehm3GukrZ6uoS8fb2BvH69gb1/vYC+f76Avn2+gL59voG/f7+AvH+7gbuBtYOrg62EtIC4hLeCroaahW+LX4NjkWR/ZJBkf2ePaoBqiGuBbYFuhG55coR5cX2DgWyFg4dpiYONZo+DkGWPgpBikIKQYZGDkWGOg4xfi4SGX4eEhmKFg4VnhoOEbYWDiXCNg41xi4KMco2BjXSLgYt1jYCMdot/iniMf41+jX2Of4x8kH2RfZF2k3+QdZCAj3aNgYx2iYSFeICFdn5rh2GEVYdNh0WEPos5hDiOOoQ7jDyEPopAhkCFRIhGgkmKTH9MjUx6N/83/zf/N/83/zf/N/83/zb/Nv81/zX/NP80/zP/M/8z/zL/Mv8y/zL/MP8x/zD/MP8w/y//Lv8u/y7/Lv8u/y3/Lf8t/y3/Lf8t/y7/Lv8u/y7/LP8s/y7/Lv8u/y7/Lv8v/zH/Mf8x/zH/MP8w/zD/MP8w/zD/MP8w/zD/MP8v/y7/Lv8u/y3/Lv8w/y7/Lv8u/y7/Lv8u/y7/Lf8t/y3/Lf8s/yz/LP8s/yz/LP8s/yz/Lf8t/yz/LP8s/yz/LP8s/y3/Lf8t/y3/Lf8t/y7/Lv8u/y7/Lf8u/y7/Lv8w/zD/MP8w/zD/MP8w/zD/MP8u/y//L/8w/zD/L/8v/zH/Mf8x/zH/Mf8x/zH/Mf8y/zP/M/8x/zP/M/8y/zL/Mv8y/zL/Mv8y/zL/Mf8x/zH/Mf8x/zH/Mf8v/zD/MP8u/y7/Lv8u/y3/Lf8t/y3/LP8s/yv/LP8r/yr/Kv8p/yr/Kv8p/yn/KP8o/yj/KP8n/yf/Jf8l/yT/JP8k/yP/I/8j/yH/If8h/yH/IP8g/yD/IP8g/yD/IP8g/x//H/8g/yD/If8k/yf/LP80/z3/Q/9G/0f/SP9L/1H/Vf9a/2H/Zv9o/2z/a/9p/2X/Wv9C/y3/KP8q/yv/K/8q/yr/KP8o/yv/K/8r/yv/LP8s/yz/J/8j/yL/Jf8l/yn/LP8y/zv/Wv91/2z/af9r/2r/a/9l/1v/Tf9M/0X/R/9F/zn/Nf9K/1D/Uf9X/2D/X/9b/1//X/9a/1r/W/9f/1b/U/86/yv/L/9E/03/Of8v/y//M/9A/0T/Rf9F/0D/Of85/zr/OP84/zz/Pv8//0L/RP9I/0n/RP8//z//Ov86/zf/Nf81/zX/Nf84/zn/Of84/zP/Lv8t/yz/Lv8w/zD/Mf8x/zH/Mf8y/zL/Mf8x/zL/Mv8w/zD/MP8w/zD/MP8w/zD/MP8w/zD/MP8x/zH/L/8v/y//Mf8w/zD/Mf8x/zH/Mf8y/zP/M/80/zT/NP81/zb/Nv84/zf/Of84/zn/Of86/0H/Tv9Z/2j/bf9t/2r/Zf9c/07/Pv81/zL/MP8u/yv/LP8s/y3/Lf8u/y7/L/8v/zD/MP8v/y//MP8w/zL/Mv8x/zL/Mv8w/y//MP80/zT/Nv84/zz/QP9H/0j/Tv9W/1z/ZP9p/2//df95/33/gP+C/4H/gv+D/4P/hP+H/4v/jP+H/3z/aP9T/1j/X/9k/2L/ZP9v/3f/eP93/3b/dv95/3n/d/92/3D/bv9u/2//dP93/3r/e/99/33/f/9+/37/fv99/3z/ev95/3b/dP9y/3H/cf9w/27/bv9t/2z/av9m/2T/Yv9h/2H/YP9h/2D/Vv9N/03/UP9I/0P/Q/9D/0P/Qv9E/0v/b/+X/6z/tv+5/7z/vf+8/7z/vP+8/73/vf+9/73/vP+8/7v/u/+4/7f/sf+t/6b/pv+r/6//rv+k/5f/gP94/3r/d/93/3b/dv93/3f/d/92/3n/ef99/33/gP+D/4X/iP+L/4//kP+R/5L/kf+S/5L/kf+R/47/jP+J/4f/hv+F/4T/hP+E/4T/hP+I/4z/jP+M/4z/jP+M/4v/i/+M/4v/if+K/4z/jP+N/43/jv+S/5H/jv+O/4z/hv+F/3//ff94/27/Z/9a/0//Rf8+/zv/Ov83/zj/N/85/zz/Pf8//0D/Qf9E/0b/R/9K/0r/Sv83fjd0N343dDd9N3M2fTZzNn02cjV9NXM0fjR0M34zdDN+MnUyfjJ1M34xdTB+L3UwfjB1L34udS5+LnQtfi10LX4tdC5+LnQtfi1zLX4tcy1+LXMtfy90Ln8udC9/L3UwfzB0MH8wdjB/MHYwfzB2MH4wdjF+MXYxfjF3MH4wdzB+MHgwfjB4MH4weS9+L3kwfjB6L34vei9+L3sufi57LX4tey1+LXstfi18LH4sfCx+LHwsfix8LX4tfS1+LX0ufy59Ln8ufi59Ln8vfS1/Ln0ufi19LX4ufS5+L30vfjB+MH4vfi98L34vfC9+L3svfy97L38vezB/MHovfy95MIAwezCAMHsxgDF7MoAyezJ/MXsxfzJ7MX8yejJ/MnoyfzJ7MX8xezF/MHswfzB8MH4wezB+MHswfjB8MH4wfC9+L3wufi58LX4tfC1+LXssfit7K34reyp+Knspfil7KX0peyl/KHwnfid8J34nfCd+JnwlfiR8JH4jfCJ+InwhfiF+In4ifiF+IX4gfiB+IH4gfR9+H30ffh99IH4gfSB+IH0hfiN/KX8vgDZ/PoRFfEaJRnpGi0l3To1VeFmOYHdljWh1ao9pdGmQZ3RXkDd2Lo0teSyKLXwpiip8KogpfCmKKHooiih7KIoqeyuKK3wpiyh8J4onfCWIJn4qiCh+SYZwgGqDaoBmgmd/ZYNjfVCGQXtLhk15SYdEdkKIQHdAiEZ4TolYeWKLZHpcjlp6Yo9feVeQUXhSkFx5WY9PekSPOnszjjZ7PYsyfC6KL30wjTh9P49FfUaRQn07kj5+QJE6fziQOIA5kDqAO5E/f0iTS31Gkz99OpU3fDWVNns1ljR7NJY2ezeXO3s7lzh6NZUyei+ULXotky96L5MwejCTMXoxkzF6MZMyejKTMnoyky96L5Mvey+SMHswkTB7MJAvey+QL3svkTB7MJEvey+RLnsvkTB7MJExezGRMXsxkTJ7MpEyezKQMXsykDN7NJA2fDaQN3w3kDd8N5A1fjmPQ39Qi16AaIhqhGiFZoVdiFCDP4w2gTSNMn4xjy5+LI4sfiyOLH4sjS5+L40ufi6OLn4uji9/L40wfzCNMYAxjTCAMo0ygDKMMIEwizCDL4kwhC+IL4QwiDCEMok2gzyHQ4JJhk+DVYRcgmKBaoNufHKDdnV4hHttfYR+aoGEg2iIhI1oioOAbXGCZXRhf2J0Zn1ubnZ+d2t4fXZqdX11bnV9dG9yf21raIJnameEamlthHNpd4R5Z3qEfGd+g39mfoN9Zn6Dfmd8g3lod4N1a3aBc3J0gHJ4cH1wfW97bYJpeWaGZHVkimF0X4tfdF+MYXRbkUt1SZdKdkyfSXZFo0NzRKVAb0GjR2xtnZVuqZGyeLmGun+6g7yBvIO6gbqCuYK4gbWEs3+xhbB/roerfqiHpn6jhqF+n4WgfKSDo3yghZl7lIaLeIqFiniIgoh3hoKFdoWChHSDg4JvgYSAb4GEgmmChIVmhYSHZYmDi2SOg49jkYKSY5KCkmKSg5FgjoOMXYmEh1yHhINfgoOCYIODg2ODg4ZniYOJbYuCi3CMgYxzjIGMdYyAi3WKf4l4in+Meop/jHuLf413i4KFd4CEe3t2hnF/aYdhg1qITYhDiD2LPIc9jD2FPY48gzqOOYE4jTmBPIo/gz+IP4ZDhUSIRIJEikSBRI1EgDf/N/83/zf/N/83/zb/Nv82/zb/Nv81/zX/NP8z/zP/M/8y/zL/Mv8z/zH/MP8v/zD/MP8w/y//L/8v/y7/Lv8t/y3/Lv8u/y3/Lf8t/y3/Lf8t/y3/L/8w/zD/L/8v/zD/MP8w/zD/MP8w/zD/MP8w/zD/Mf8x/zD/MP8w/zD/MP8w/zD/MP8w/zD/L/8v/zD/MP8v/y//L/8v/y7/Lv8t/y3/Lf8t/y3/Lf8s/yz/LP8s/yz/LP8s/yz/Lf8t/y7/Lv8u/y7/Lv8u/y//Lv8u/y7/Lv8u/y7/Lv8v/y//L/8v/y//L/8v/y//L/8v/y//L/8w/zD/MP8w/y//L/8w/zD/MP8w/zH/Mf8y/zL/Mv8x/zD/Mv8x/zH/Mv8y/zH/Mf8x/zH/Mf8w/zD/MP8w/zD/MP8w/y//L/8v/y//Lv8u/y7/Lv8t/y3/Lf8t/yv/K/8r/yr/Kv8p/yn/Kf8p/yn/Kf8o/yf/J/8n/yf/Jv8m/yT/JP8j/yP/Iv8i/yH/If8i/yL/If8h/yD/IP8g/yD/H/8f/x//H/8g/yD/IP8g/yH/Jv8p/y//Nv8+/0T/R/9H/0j/R/9L/1D/WP9d/2D/ZP9k/2X/Zf9i/0n/Lf8r/yv/Kf8r/yf/Kf8p/yn/Kf8o/yj/KP8o/yj/Kv8q/yr/Kf8p/yf/Jv8m/yf/Pv9o/2b/Z/9m/2f/ZP9j/07/QP9E/03/Tf9M/z7/PP9K/07/Sf9X/1//Y/9f/1//YP9k/2D/VP9U/1r/Xf9h/0//R/9C/zv/NP84/zj/N/85/zH/Mf80/zz/Q/9D/0L/Qv8//zr/Of85/zf/N/84/zv/Rv9M/03/Rf89/zf/NP80/zP/Nf81/zb/N/86/zz/Pv88/zj/M/8w/y3/L/8v/zD/MP8w/zD/Mf8x/zL/Mv8y/zL/MP8v/y//L/8v/y//L/8v/y//L/8v/y//Lv8u/y//L/8u/y//MP8w/zH/Mf8x/zH/Mf8x/zD/Mf8x/zH/Mf8y/zP/M/80/zT/NP80/zT/OP9E/1H/Xv9n/2f/ZP9f/1X/Q/81/zT/NP8x/zD/L/8t/yz/LP8s/yz/Lf8t/yz/LP8u/y7/Lv8u/y//MP8x/zH/MP8y/zL/Mv8x/zH/Mf8w/zD/Lv8t/y7/Lv8s/y7/Lv8v/zP/N/88/0D/R/9N/1P/Wf9e/2T/aP9s/3D/c/94/4D/hf+I/4f/gP9z/2f/aP9x/3n/fP97/3j/d/93/3b/cf9s/2f/ZP9c/1T/Vv9g/2f/bf9y/3f/eP96/33/fv99/37/ff9//3z/ff97/3n/eP92/3X/dP9z/3L/cf9v/23/av9m/2L/Yf9f/1//X/9g/13/UP9I/0r/Sf9I/0T/Qf9D/0P/R/9R/2r/j/+j/63/sP+x/7H/sf+x/63/rP+q/6n/p/+k/6T/of+f/57/nP+b/5r/nP+d/5z/mv+a/5n/mP+V/5L/kf+R/4//j/+O/43/jP+K/4j/hv+E/4P/hf+E/4P/hf+F/4f/if+L/43/jv+R/5L/kv+S/5L/kf+P/43/iv+I/4f/g/+C/4L/gv+C/4L/hf+I/4j/if+K/4z/jP+M/4z/if+I/4n/hv+H/4f/hf+C/4L/ff95/3D/av9j/1r/T/9H/0L/O/85/zv/O/87/zz/Pf89/zz/PP86/zn/Ov89/z//Qf9A/0P/RP9E/0P/Q/9B/0H/OH44czd+N3M2fTZ0N303dDZ9NnQ2fTZ0NX01dDN9M3QzfjJ1Mn4ydTJ+MnUxfjB1MX4xdDB+L3Qvfi9zL34vcy1+LXMtfi1zLX4tcy5+LnMufy50Ln8udS5/LnUvfy92L38vdjB/MHYwfzB2MH8wdjF/MXYxfzF2MH4wdjB+MHYwfjB2MH4wdi9+L3gvfi94L38veS9/L3kvfi95Ln4uei1+LXstfi17LX4teyx+LHstfi17LX4teyx+K3stfi18Ln4ufS5+Ln0ufS5+Ln0vfi99L38vfS9+Ln0ufi59Ln4ufi59Ln4ufS5+Lnsufi56Ln4uey5+Lnsvfy96L38vejCAMHowgDB6MYAxezKAMnsyfzJ6MX8xejJ/MXsxfjF7MH4wejB+MHsvfi97MH4wezB+L3wvfi98Ln4uey1+LXsufi57Ln4ufC19LXwtfSx8K34reyp+Knsqfip7Kn4pfSl+KXwofid8J34nfSh+Jn0lfiR7JH4jeyR+I3wjfiJ8In4ifiF+IX4hfiF+IH4gfiB+IH0ffh99H34ffB9+H34gfiB/I34lgil/L4Q2fz+GRnxIiUh7SItIeEuNT3lUjll5W45eeF+PYnZgj1d3OY0neSqKKXwniSh8KIkofCiJKHwpiih8KIoofCiKKXwriit8K4oqfCiKKXssiiR8Q4dsfmCFYoBigmR/Y4NlfVCEO3xChTx8OoRLekeFPnc9h0V5RIhTemSJYXpdjF15YY5ieV+QY3hekmF5YpFgeWKQVHpIkER7SJBWfEqMPn5CjEd9OYwsfTCONX07kD99QpFHfkKSOn03kjZ+NpEzgDORNoBBkUp9TZJHfUKUOns1lTN7M5U1ezWVNns3lzl7Ppc/fEGWPnw6ljV6MZQuei6TL3ovkjB6MJExejGRMnozkTV6NZIxejCSL3svkS97L5AwezCPLnsujy97L5Avey+QL3wvkS98L5EwfDCQMHwwkDB8MJAwfDCQMHwwkDB8MJAwfDCQMXwxkDJ8Mo8yfDKPM304jkN+UYtegGOIYoJgiFiBSoo7gDSNNH4zjjB9L44vfS+OLX0sjix+LI0sfiyNLH4sjS1+LY0vfi+OMH4xjjF/MY4xfzGOMYAxjDKAMYwwgTCMMIEvjC6ALYstgC2KLYAtii6ALoktgC2JLoExijOEO4c/hkSESIdMgVKHV3xehmR0aYdwcHWHd3F3hHJxbIJtb3OBeG13gHdqeYB2bXN+cHJqfmFzXYFYc02CSHFRg1p0XYNkcm2Dcm5yg3dqfYN+Z36DfmV+g35kfYN+ZH2DfGh7g3ltd4B2cnWBdHZ1f3N8cH5sgGh6ZoVhd1+IYHRgiV9zX41bdE6STHRKnEVvRaFIcFCfVm9el2pvdpCNdqCGpH+mgKaEpn2khaN9oIagfJ+Gnnqchpt5m4aZeZeGlnqYhph5mIWYeJiEmHaXhZd1loWWdJWFk3SShZJzkISPcZCEj2+OhIxsioSIaIaFg2eEhYJmgYaDZYaGhmSHhIlkjYOOY5CCkmOTgpNlkoKSZpGCkGaOgopih4KDYYKCgmGCgoJhgYOEZIaEhmeIg4hriYOJboqCinSHgoF3foV8e3qEdn1yhG6BaYdhg1yIVYdMiEaLPok7jzqGOZA6hDiPOYI7jzyDPI49gz2NPIM8iTuEOok8gz6JPoZChkKHQYVCiEODQIpAgkCKP4M3/zf/N/83/zf/N/83/zf/Nv82/zb/Nv81/zX/M/8z/zP/Mv8y/zL/Mv8y/zH/MP8w/zD/MP8v/y//L/8v/y//Lf8t/y3/Lf8t/y3/Lv8u/y7/Lv8u/y7/L/8v/y//L/8v/y//MP8w/zD/MP8w/zD/Mf8x/zH/Mf8w/zD/MP8w/zD/MP8w/zD/MP8w/zD/MP8w/zD/L/8v/y//L/8u/y7/Lf8t/y3/Lf8t/y3/LP8s/y3/Lf8t/y3/Lf8t/y3/Lf8u/y7/Lv8u/y7/Lv8u/y//L/8v/y//L/8v/y//Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y//L/8v/y//MP8w/zD/MP8x/zH/Mf8x/zL/Mv8x/zH/Mf8x/zH/Mf8w/zD/MP8w/y//L/8w/zD/MP8v/y//L/8u/y7/Lf8t/y7/Lv8t/y3/LP8s/yz/Kv8r/yr/LP8r/yr/Kv8p/yn/Kf8p/yf/J/8n/yf/Jv8l/yT/JP8j/yP/I/8j/yL/Iv8i/yL/If8h/yD/IP8g/yD/IP8g/x//H/8f/x//H/8f/yD/If8j/yX/Kf8v/zT/PP9C/0f/SP9J/0n/Sf9Q/1X/Vv9X/1r/Wf9a/1f/Rv8t/yf/J/8n/yf/KP8o/yj/KP8o/yj/KP8o/yj/KP8r/yv/LP8s/yz/Kf8m/yb/Pf9t/2T/W/9b/2H/Zv9o/1P/Pv9A/zv/N/82/0D/Rv89/zX/Nf82/1D/Y/9j/2P/ZP9k/2T/Yf9f/2D/ZP9l/2L/Y/9Y/0z/RP9H/0r/Qf87/0D/Qf86/zH/Lv8w/zL/OP9B/0T/Rf8//zb/M/80/zD/Mf8y/zr/Qv9F/0b/Qv87/zf/NP80/zX/Nf83/zn/O/89/z//Qf9B/z7/Ov81/zH/L/8w/zD/Mf8x/zH/Mf8y/zP/NP80/zT/Mv8w/y//L/8v/y//L/8u/y7/Lv8v/y//L/8v/y//L/8v/y//L/8v/y//L/8w/y//L/8v/y//MP8w/y//L/8v/y//L/8v/y//L/8x/zb/Qf9N/1r/Yf9d/1r/Uv9F/zn/Mf8y/zH/L/8v/y//L/8u/y7/LP8s/yz/LP8s/yz/Lf8t/y//L/8w/zH/Mf8x/zH/Mf8x/zH/Mv8x/zH/Mv8w/y//Lv8u/y3/LP8t/y3/Lf8t/y3/Lv8v/y7/Lv8v/zD/MP8z/zb/Ov8+/0T/Sf9N/1P/Vv9b/17/Xv9e/2H/Zv9q/2v/bP9s/2r/Z/9k/13/Vf9R/03/Tf9P/0n/Rf9R/17/Zv9q/23/cP91/3v/f/+A/3//fP98/3z/fP99/33/e/95/3n/dv92/3T/dP9x/23/av9o/2X/Y/9h/2H/YP9g/2D/VP9M/07/Uf9Y/1//a/9z/3z/gv+N/5T/m/+e/57/n/+f/5z/m/+d/53/nP+b/5n/mf+Z/5j/mf+Y/5f/l/+W/5b/lv+V/5X/lP+T/5P/kf+Q/4//j/+O/47/jP+L/4r/iv+J/4f/hv+D/4P/gv+C/4L/g/+D/4T/h/+J/43/jv+Q/5L/kv+S/5L/kf+Q/43/iv+I/4X/g/+C/4L/gv+C/4L/hP+E/4b/h/+H/4f/hP+C/33/d/9t/2b/ZP9h/1n/Uf9L/0j/Qf88/zv/O/87/zv/O/86/zv/PP88/zv/PP88/z3/Pf88/zz/Ov87/zz/Pf8//z//Qv9C/0L/Qv9A/0D/P/9A/zd+N3I2fjZyN304czd9N3M2fTZ0NX01dDR9NHQyfTJ0MX4xdTJ+MnUzfjN1MX4wdS9+L3Qvfi90L34vdC9+L3Qtfi1zLn4ucy5+LnMvfi9zLn8udC9/L3Qvfy91Ln8udjB/MHYwfzB2MH8wdjF/MXYxfzF3MX8xdzF+MXcxfjF3MX4xeDF+MXgxfjF5MX4xeTB/MHkvfy95L38veS5/Lnoufi57LX4tey1+LXstfi17LX4tey1+LXstfi17LX4tfC5+Ln0ufi59L30vfi99L34vfS9/L30vfi59Ln4ufS5+Ln0ufS5+Ln0ufi59Ln4ufC5+Lnwufi58L38vey9/L3svgDB7L4AvezCAMHswgDB7Mn8yezF/MXsxfzF8MH4wfDB+MHswfjB8L34vfDB+MHwvfS58Ln0ufC5+LXsufi57LX4tfCx+LHwrfyt8K38rfCt+K30qfip9KX4oeyp+KH0nfid8J34nfCZ+JnwlfiR8I34jeyN+InsjfiJ7In4heyF+IX4hfiB+IH4gfiB+IH4ffh99H34ffR5+Hnwefh9+IX4igSV+KIMpfy2FM387iEF8RIlGe0iKSnhMjE94Uo1TeFWOVXhTj014P440eSmLJ3sniid7J4kpfCmKKHwoiih8KIopfCmKKXwpiit8K4otfSuKK3wpiSp+MIZsgGyDYIFfgmGAZIJmf1aEOHpBh0R4PIgyeDOHOXlAh0R5QoZLekWHSXpfimJ6YYxme2aNYntjjV97Y41kfGSNZ3plj2d6dZBLekCQPns/jz19Po1AfUGMOXswji97Lo83e0WQRXtEkkB7OJMyezGTLnwtki99MpE5fUCSQn1ClD97O5U2ezWVNHszlTN8NpY4fDqWPHw/lkJ8QpY/ezqVNnsylDB6MZExejCQMHoxkDJ6M5A0ejSONXoyjjJ7MI0wey+NL3sujC57Lowuey+OLnsuji58Lo0ufC6NLXwtji58Lo4vfC+NL3wvjS98L44vfC+OLnwuji58Lo4ufC6OLnwuji99M40+fUmMV39bilaAU4lMf0GKN34wjC99L40vfC6OLn0ujS19LY0sfiyNLH4sjSx+LY0ufi6NLn4vjjF+MI4wfzCOMH8wjjF/MY4xfzGOMX8wjTCAL40ugC2LLoAtiiyALYotgC2KLoAuijCBLokugS+IL4EwiC+CMIYwgy+HMYY1hjaHOIQ8hz6FQYdDgkWGSIFNhVB/VIRWflaEWIBVglOBToJFgkOCQ4JGgUuDRoA/gkSAUoFbgmF7ZoJsd2+CdnJ9g4BqgYN/Z3yDfGR9g3xkfIN9ZnyCe2l5gnhud4F3cnOAcXdvf216anxnfWV6YoRjd2GIY3VijFxzX45rdnGMe3eDhop6j4CSfph8m3+beZuCnHmdhJ14nYWdepyGm3mbhZt5m4WbepmFmXqYhZd6lYSVepWDlXuUg5R7koWQeJCFkHmQhY53jYWOdo2EjXSNhItyi4SLcImEiGyGhIVpgoSBaYGEgGSBhIJjgoaFYYeEh2OLhIxljoSQZpGCkmiSgpFojoGMZ4qBhmaEgYNkgYGCZIKBgWSCg4NlhIOFZoKCg2iChX9sd4ZsdV+JVYJKiEWHQIg/ikGIP4tChkCOOoQ8jzyDO5A8gjuPPIA8jTyAPI08gTyLPYM8ijyDPYo6hDmJPIQ8hz2FPYY/hkKGQ4dDhUKHQINCh0SEN/83/zb/Nv83/zj/N/83/zb/Nv81/zX/NP80/zP/M/8y/zL/Mv8y/zP/Mf8w/zD/L/8v/zD/MP8v/y//L/8v/y7/Lv8u/y7/Lv8u/y//L/8v/y//L/8v/y//L/8u/y7/MP8w/zD/MP8w/zD/Mf8x/zH/Mf8x/zH/Mf8x/zH/Mf8x/zH/Mf8x/zH/Mf8x/zH/MP8w/y//L/8v/y//Lv8u/y7/Lv8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lv8u/y7/Lv8v/y//L/8v/y//L/8v/y//Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8v/y//L/8v/y//MP8v/y//MP8w/zD/MP8x/zH/Mf8x/zH/Mf8w/zD/MP8w/zD/MP8v/y//MP8w/y//Lv8u/y7/Lv8t/yz/LP8s/yz/K/8r/yv/K/8r/yv/K/8q/yr/Kv8o/yj/Kv8n/yf/J/8n/yf/Jv8l/yX/JP8j/yL/Iv8i/yL/Iv8i/yL/If8h/yH/IP8g/yD/IP8g/x//H/8f/x//Hv8e/x//IP8i/yP/Jv8p/yz/MP80/zz/Qf9E/0b/R/9K/0z/Tv9Q/1L/Uv9T/0//R/83/y3/J/8n/yf/KP8n/yn/Kf8o/yj/KP8o/yn/Kf8p/yn/K/8r/yr/LP8r/yj/LP9l/2v/aP9o/2b/Y/9n/1f/N/9B/0j/R/84/y3/L/83/zr/Pf8+/0T/P/9Q/2X/Zf9n/2r/Zf9j/2T/ZP9i/1//Yf9l/2L/Zv9k/0f/Qv9C/0T/Rf9F/0X/Rf8+/zP/L/8u/zL/N/85/0H/Rf8+/zP/L/8u/y3/Lv8v/zL/Of8+/0H/P/85/zf/Nv82/zT/Nf81/zf/OP87/z7/QP9A/0D/Pv86/zb/Mf8x/zH/MP8w/zH/Mv8z/zT/NP80/zT/Mv8y/zL/Mf8w/y//Lv8u/y7/Lv8t/y3/Lv8u/y7/Lv8t/y3/Lf8t/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8x/zz/Rv9T/1b/Uv9O/0n/QP82/y3/LP8s/yz/Lf8u/y7/Lf8t/yz/LP8s/yz/LP8t/y7/Lv8u/y//Mf8w/y//L/8v/y//MP8w/zH/Mf8x/zD/MP8v/y7/Lf8u/y7/Lf8t/y7/L/8v/y7/MP8v/y//L/8w/zD/MP8v/y//L/8v/y7/L/8w/y7/Lv8v/zH/MP80/zb/OP89/z7/P/9C/0H/Qf8+/zv/O/87/z7/Qv9C/z7/P/9F/07/U/9a/2L/Zf9u/3X/ff9//3//fv99/33/fP99/37/fP97/3n/eP95/3n/dv90/3H/b/9u/2v/av9n/2n/bP9y/3b/eP98/4L/i/+P/5L/lv+a/5n/mv+c/53/nP+c/5v/m/+b/5v/m/+b/5v/mv+Z/5n/mv+a/5j/l/+U/5T/lP+U/5T/lP+Q/4z/if+J/4j/iv+N/4//j/+P/4//jf+O/47/jP+K/4j/h/+E/4L/gf+A/4D/gP+A/37/gv+E/4j/iv+L/4z/kP+R/5H/kP+Q/47/i/+H/4X/hP+B/4L/gf+B/4H/g/+E/4T/gf+B/4D/ev9y/2n/Xv9U/0r/Q/8//0D/QP8//0L/Qf89/zz/PP87/zz/PP88/zz/O/89/zz/PP88/zv/O/87/zz/O/88/zz/Pf89/0D/Q/9E/0T/Rf9F/0b/Rv82fjZzN343czZ+OHM2fjZzN303czV9NXM1fTRzM30zczJ+MnQyfjJ0Mn4xdTB+L3Qufi5zL34vcy9/L3Qvfy90L34wcy9+L3Mvfi9yLn4ucy5+LnIvfi9zL38vdC9/L3Qvfi92MH4wdjB+MHcxfjF3MX8xdzF/MXcxfzF3MX8xdzF/MXgxfzF4MX8xeTF/MXkvfi96Ln4vei9+L3svfi57Ln4uey1+LXssfix8LX4tfC1+LXotfi16LX0tei19LXwtfi19LX4ufTB/MH4vfy9+L30vfi99L34ufS59Ln0ufS5/Ln0ufi59Ln4ufi1+LX4tfi19LX4tfC5+Lnwufi58L34vfC9+L3wvfi98L34vfC9/L3svfzB7MH8wfTB9MHwwfjB8MH4wfC9+L3wvfi98L30ufC59Lnwufi17LH4seyx+LHwrfit8K34rfSt+K30qfip+KX4ofil+KX0ofih9J38nfSZ/Jn0mgCV9JYAlfSR+I3wjfiJ8In4hfCJ+InwhfiF+IX4hfiB+IH4ffh9+H34gfSB9IHwefh5+H34ffyF9JIImfSuFLn4yhzd+P4lCe0iKSXpJi0p5TIxOeE+OUHhRj1F3TY9IeTqMLHoniyZ7JoomeyeKKHwpiih8KIooeyiJKnwqiSl8KYoqfCmKKXwqiSx9LYddgGyDZYFngWSBYn9mgFaCLH08hkZ5UopRdEqNPXQzizN2N4c7dzWGNXs6h1J7Zolxe26LbXxli159YYxifmOMX31djmF8Zo9belKQT3pLkEt6So5IekqNSXxIjUJ7OI4wfC+OMXoykDV6QJJHe0STOnwxki18LZEtfS2QLX4xkDZ9PJI7fTuTN3s1lTV7NZU0ejSUNXs2lDh7PZY9ez6VP3xAlT18OZU3ezOSMnsxkDB7MZAxezKPNHo0jjV7NY00ezSMNHs0izR7MYswey6LLnsuiy17LYsufC6LLn0tjC18LYwtfC2MLXwtjC59LowvfS+MLn0ujC1+LYwufi6MLX0tjC19LYwsfTCMOX1CjE19VYpQfkyJRn8/ijV+LYssfSyNLH0sjSx9LI0sfSyNLH0sjSt9K40sfi2NLn4ujS5+L40vfi+NMH4wjTB+MI0wfjCNMX4xjTF+MY4wfi+OL34vjS5+Lo0ugS6LLoEuiy+CL4kvgi+JMIMwiTCDMIgwgzCIMIMwiDCDMIgugy6ILoMuii6DLoougi6JLoMvijCCL4kwgTCKMYExjDGBMYwzgDaKN4A6iTuAO4Y9gT2GQYJHhUuDUIRXg19+aINydXmDfm6Bg4BofYN8ZH2DfmR9hHxme4R7aXuCemp2gnZsdIFzb3GAb3JugG95dH16fIJ9iHuNfpB6lYCXeZeAmXiZgZt4m4GbeJuCm3ibhJp5m4ObeJqFmniahZh7moWXfZiFl36XhZiAmISWgJCEi4CPg5KCkoOSg5GEiYOFhIODgYKFgY2Bkn2Uf5R5lICVdpSBk3WSgZBzjoKMcIiDhmyDg4FpgISAZX+GfWF/hoFghoWIY4qFjGeOgo9nj4GPaI6AjmqLf4pqhn+EaYOAg2eCgYNmgoOBY4GDgWOChYFjfoR7ZnSEbWtph2F2XIhQgUKIQIlAhj+LQoRAjT6FPIw8hTyNPYM9jTuDO447gzuOO4M7jDyDO4s8gzqLPIM9ij+EP4g/hECIQoVFh0aFRodHhUeFSIVHhTf/N/83/zf/Nv84/zb/Nv83/zf/Nv81/zX/NP8z/zP/Mv8y/zL/Mv8y/zH/MP8v/y//L/8v/y//L/8v/y//L/8t/y//L/8v/y//L/8u/y7/Lv8u/y//L/8v/y//L/8v/y//L/8w/zD/MP8w/zH/Mf8x/zH/Mf8x/zH/Mf8x/zH/Mf8x/zH/Mf8x/zH/Mf8w/y//L/8v/y7/L/8u/y7/Lv8u/y7/Lf8t/yz/LP8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y7/MP8w/y//L/8v/y//L/8v/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lf8t/y3/Lf8t/y3/Lv8u/y7/Lv8v/y//L/8v/y//L/8v/y//L/8v/y//MP8w/zD/MP8w/zD/MP8w/zD/L/8v/y//L/8v/y7/Lv8u/y7/Lf8s/yz/LP8s/yv/K/8r/yv/K/8r/yr/Kv8o/yf/Kf8p/yj/KP8n/yf/Jv8m/yX/Jf8l/yT/JP8j/yP/Iv8i/yH/Iv8i/yH/If8h/yH/IP8g/x//H/8f/x//IP8g/x//H/8h/yL/I/8m/yj/LP8w/zP/Of9B/0b/Sf9J/0n/Sv9M/07/T/9Q/1D/Tv9J/0T/NP8o/yf/Jv8m/yb/J/8o/yj/KP8o/yf/Kf8p/yn/Kv8o/yj/KP8o/yn/Lf9b/27/ZP9n/2X/YP9o/1v/Lf8y/z7/R/9U/1n/WP9R/0b/OP86/zz/Of84/z//Xv9s/3T/cv9s/2j/av9l/17/YP9h/2H/Zv9m/1z/U/9S/0//TP9O/0//Tv9M/0z/SP8//zP/L/8y/zP/N/89/0P/Rv8//zT/L/8t/y3/Lf8s/y3/L/80/zf/N/83/zb/Nf81/zX/NP82/zf/Of88/z3/Pv9A/0H/P/88/zn/Nv8y/zH/MP8x/zH/Mv8z/zT/Nf81/zX/Nf83/zf/Nf8y/zL/L/8v/y//Lv8t/y7/Lv8u/y3/Lf8t/y3/Lf8t/y3/Lv8u/y7/Lv8u/y7/Lf8t/y7/Lv8t/y3/Lf8t/y3/Lv83/0H/Sv9S/0//Sv9G/z//Nf8t/yr/Kv8q/yr/Kv8q/yv/K/8r/yv/K/8r/yz/Lf8u/y7/Lv8v/y//L/8w/zD/MP8w/zD/MP8x/zH/Mf8x/zD/MP8w/zD/L/8v/y//L/8u/y7/L/8v/y//L/8w/zD/MP8w/zD/MP8w/zD/MP8w/y7/Lv8t/y3/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8v/y//L/8v/y//Mf8z/zP/Nv82/zf/N/84/zv/PP8//0X/Tv9Z/2P/bv93/33/gf+A/37/f/+A/3//fv99/3z/ev95/3v/e/96/3n/d/91/3b/d/9//4b/iv+P/5P/lv+Y/5f/l/+Z/5n/mv+b/5v/m/+b/5n/mP+Y/5j/lv+U/5L/jv+L/4n/if+I/4j/if+K/4v/hP+A/4b/i/+O/43/if9//3L/cv96/4L/kv+Z/53/m/+b/5v/m/+a/5b/k/+Q/4//i/+I/4T/gv+A/4D/f/+A/37/f/+C/4X/h/+I/4n/iv+K/4r/i/+L/4n/iP+I/4X/g/+D/4L/g/+C/4H/gf+B/4L/gv+B/3//fP94/3P/b/9o/2D/Uf9C/z3/PP8+/zz/O/87/zz/PP88/zz/O/87/zv/O/87/zv/O/89/z7/P/8//0D/Qv9C/0L/Q/9F/0f/R/9H/0j/SP9I/0f/OH44dDd+N3Q3fjd0Nn42dDZ9NnU1fTV1NH00dTN9MnUyfjJ2Mn4ydjJ+MXUxfjB0MH4wdC9+L3QvfzB0MH8wdC9/L3Mvfy9zL34vci5+LnMvfi91L34vdS5/LnYufy53L34vdy9+L3cwfjB3MH4xdzF/MXgxfzF4MX8xeDF/MXgwfi94Ln4veDF+MXkwfjB5L34veS9+Lnktfi15Ln4seS1+LXssfix7LH4sfC1+LXwtfi18LH4sfCx/LHwsfyx9Ln4ufS5+Ln0vfi9+L34vfi99L34vfS9+Ln0ufS59Ln0ufi59Ln4ufS1+LX0ufi59Ln4tfC1+Lnsufi57Ln4uey5+Lnwufi58L34vfC9+Lnwvfy99MH8wfTB/MH0wfTB8MH4wfDB+MHwwfTB8L30vfC99LnwufS58Ln4tfC1+LXwsfix8K34rfCx+LH0rfip9Kn4pfid+J34nfid9KH4ofSd/Jn0mfyV9JX4lfSR+JH0jfiJ8In4hfCJ+IXwhfiF8IH4gfiJ+In4gfiB+H34ffh9+H34gfiB9IH4gfSB+I4IlfSiEKX0shzF+NYg8fkOKSX1Kikl8SItJekqMS3lOjk15TJBMeUWPP3kujSd5JosleyaKJ3soiih8KIonfCeKKXsoiSl8KIkofCiHKHspiCp9KIZRf22DY4Jlf2SCYYBjgV2DLoAvhjd/PYdGe1CKV3ZYjVl0TY43dDKKOXc6hj97PIZcfHSHcnxyiHB+Y4pZfmGLXn5bjWB9Zo5oe2WOXXpXkFN6UZBRelKQUXpQjk57TI5KeUOOOXozjjN6L5AxeziSPXpDk0F8OJIxfC2RKnsqkCt9KpAsfS6RMX0zkjV8NJM0ezWUNno3lTh7OJY3ezmVPHs+lUB8QZU+fD2VOns3kzV7MpEwey+QMXsyjzF6M4w0ezWLNXs2izh7OYo2fDSJM3wxiTB8MIkufC2JLn0uiS59LIksfCyKLHwsiit8K4osfSyKLX0tii19LYotfSyKLH0sii1+LYotfi2KLH0sizV9QItGfVGKTn5JiUV+QIg3fS6KKH0oiyl9KYspfSmLKn0qiyp9KossfSyLLX4tiy5+Lostfi2LLn4uiy9+L4wvfi+MMH4wjTB+MI0xfjGOMX4wjjB+MI0vfi+NL38vjS9/L40vgS+ML4EvjDCCMIowgjCJMIMwiDCDMIgwgzCIMIMviC6DLogugy2ILoAuii2ALYougS6KLoAvjC9+L48vfi+PMH8wjzB/MY4yfzKOMoAzjjSBNI41gjWNNoI7iUmDV4Njg216eIN/b4SDgWmAg39nf4R9Z4CEfmh6g3lpeIN6aHuEe2h7gntrfIGAbIeBi26OgpJvk4OVcZWClXaWgpd2mYOZeJqDmniZhJp5mIWUe5GHjX2KiIaAgYd8h3WHb4xsh2iRZodmk2uEbZJwgnGQc4B7jIJ/hIuCf3SMaH1ui3p8i4aYep9+nn6gep5+oHegf513moCZdZSCkXKMgolwhYSAbnyFemt7hntqfYZ/aYCFgWWFhYZliIOJaYiCiG2JgYlviYCJb4aAhm2DgIJrg4CDaYKCgmaAgYBjgIOAY4GDgWWAg39kfYV3ZXOHaG1dik18QIo/hjyGO4o6hTqMO4U7jTyDPI07gzuOOoM7jjuCO44+gkCMQIJBi0GCQopDg0SKRoNGikaESIlHhEeJR4VGh0aFRoc2/zb/N/83/zn/Of82/zb/Nv82/zX/Nf80/zT/M/8y/zL/Mv8y/zL/Mv8x/zH/MP8w/y//L/8v/y//MP8x/zD/L/8v/y//L/8v/y//Lv8u/y//L/8v/y//L/8v/y7/Lv8u/y7/L/8v/zD/MP8w/zD/Mf8x/zH/Mf8x/zH/Mf8x/zD/L/8u/y//MP8w/y//L/8u/y3/Lv8u/y3/Lf8t/yz/Lf8t/yz/LP8s/y3/Lf8t/y3/Lf8s/yz/LP8s/yz/LP8u/y7/Lv8u/y//L/8v/y//Lv8u/y//L/8v/y7/Lv8u/y7/Lv8t/y3/Lf8t/y3/Lf8u/y3/Lf8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y//L/8w/zD/MP8w/zD/MP8w/zD/MP8w/zD/MP8v/y//L/8u/y7/Lv8u/y3/Lf8t/yz/LP8r/yv/K/8r/yv/Kv8p/yf/J/8n/yf/J/8m/yb/Jv8m/yb/Jf8l/yT/JP8k/yP/Iv8i/yH/Iv8h/yH/If8g/yD/If8h/yD/IP8f/x//IP8f/x//H/8g/yH/I/8l/yj/K/8r/y7/M/83/z7/Rf9K/0r/SP9F/0T/Rv9H/0n/S/9K/0f/Q/87/yv/Jv8m/yb/J/8n/yj/Kf8p/yf/J/8p/yj/J/8o/yj/KP8p/yv/Jf9P/2n/Yv9k/2X/YP9l/2H/MP8s/zP/OP89/0f/Tv9V/1n/WP9Q/zT/L/85/0H/Rf9I/2z/dP90/3T/b/9g/1j/YP9b/1r/X/9j/2j/Z/9g/1n/Vv9U/1T/Uf9Q/1D/Uf9Q/0z/R/9B/zr/Nf8z/zH/Mv83/z3/QP86/zL/LP8q/yr/Kv8p/yr/Kv8t/zD/Mf8y/zP/Nf83/zj/OP84/zf/N/85/zz/Pv8//z//Pv89/zr/N/81/zL/Mf8x/zL/Mf8z/zP/NP82/zf/OP83/zb/Nf80/zL/MP8w/zD/L/8u/y7/Lf8s/yz/LP8s/yz/K/8r/yv/K/8s/yz/LP8s/y3/LP8s/yz/K/8r/yz/LP8t/y3/Mf88/0X/Tv9N/0j/Rf9A/zn/NP8q/yj/Kf8p/yn/Kf8q/yr/Kf8p/yv/K/8r/yz/K/8r/y3/Lf8u/y7/L/8v/y//L/8w/zD/MP8w/zH/Mf8x/zH/Mf8x/zD/L/8v/y//L/8v/y//L/8v/y//MP8w/zD/MP8w/zD/MP8w/zD/MP8w/y//Lv8u/y7/Lv8t/y3/Lv8u/y//L/8v/zD/MP8w/y//L/8w/zD/MP8x/zH/Mv8y/zP/NP80/zP/M/8z/zP/Ov9H/1b/Yv9s/3b/ff+B/4H/ff9//4H/f/9+/37/e/92/3P/dv96/37/f/9//4L/h/+K/43/j/+P/5D/lP+U/5P/lf+W/5b/l/+X/5X/kv+Q/4v/hf9//3f/cP9p/2P/W/9V/1D/Tf9I/0j/Tf9R/2D/Xf9f/2T/bv9z/3H/bP9n/3P/hf+W/5//o/+i/6H/of+h/6H/n/+d/5v/kf+M/4f/hP99/3n/dP9y/3P/c/94/3v/fv+A/4L/g/+G/4f/hf+F/4b/hv+G/4b/g/+D/4P/gv+A/4D/gf+A/4D/fv9+/37/fv9//4L/g/+C/3//ef9x/2r/Xf9M/0D/Pf89/z3/PP87/zv/Ov88/zz/PP87/zz/Pv8+/0H/Q/9D/0T/RP9F/0b/R/9H/0f/R/9H/0b/Rv9F/0X/Rf9F/zd+N3M3fjdzNn42dDZ+NnQ1fTV1NX01dTR9NHUzfTJ1Mn0ydTJ/MnUxfjB1MH4wdDB/MHQwfzB0L38vdDB/L3Qvfy9zL38vcy9+L3Itfi90L34vdS99L3Yvfi93Ln4udy5+Lncufi93MH4wdzB+MHcxfzF4MX8xeTF/MXowfzB6MH4vei9+L3oufi55Ln4ueS5+Lnoufi16LX8tei1/LXotfy17LH8seyx/LHwsfyx8K38sfCx/LHwsfyx8LH8sfS1+LXwufi5+L30vfi99L34wfjB/L34vfy9+L30ufi59Ln4ufSx+Lnwufi59Ln4ufS1+LXwtfi18Ln4ufC5+Lnwufi59Ln4ufS5+Ln0sfi19Ln4ufS9+L30vfi98L34vfDB+MHwwfjB8L34vey9+L3svfS59Ln0ufi5+LX4tfi1+LH4sfit+K34rfit9Kn4ofSh+KH0nfid9J34nfSV+JXsmfiZ7JX4leyR+JHskfiN7I34ifCJ+IXwhfiF8IX4hfCB+IHsgfiB7IH4gex9+H3wffh97H34ffSB/IIAlfieDKn0rhSx9MIc0fTmJQH5Gikl9SYtIe0WMQnlCjkZ5R45HekaQRXk/kDV5KY0meSaKJnoniSd6KIkofCiJKHwniSd8KIooeymKKnsqiCp8KoVUfm2DYIJifmWCYX5ggWODMX8qhjV/Noc2fT2GRHpJiFB3V4tYdVSMPnU9jD12Pok8ekuGbHxwhnN9dIdVe1aLYH1jjWF9YpBlfGWOZXtnjmN4XY9ZeFiQV3hTkFB5UJBReVGOTXpMjkZ4Po44eTGQL3sxkjN7OJI8fDyTM3wskit8KpEpfCmPKXwqjyx8L5AxejORNXo4kzl6OpQ5ezqUN3s3lDd7OJQ6fD6UQHxBk0F7QJE9ezqQNns0kDJ7MI0xezKMM3wzijR8NYg2fTeHNX0ziDV9NIYyfTKHMX0xhzB9LocufS2HLXwtiCx8LIgrfSuJK30riSt9K4ksfSyJK34riCx+LIgrfiuIKn4qiCl+KYgufjiJPn5Gikt+R4hEfkGIOn41iC59J4gnfSiJJ30niSZ9KIkofSiJKX0piSl9KYkofSmJK34riS1+LYkufi+JLn4uii9+MI0wfjGNMH4wjjB+MY4yfjKOMX4xjjF+MY4vfi+OL38vjC9/L4wvgC+ML4AvijCBMIovgy+JMYIxiC+DL4gugy6JLYMtiS6BLokugS6JLoAuiy5/L4svfi+MMX4vjTB/MI4vfzGPMX8xjjJ/M440fzSPNIA0jzKBMo40gjmMQ4NThWCEa3tzhHlwf4R/aIGEg2qAhH9pfYR8aXeEcWpvhXRseIV9bH+Dg2eDg4VnhoSIaomFiW2OhI5vjoWNc42GjXOOho93jIeGfH6Id4Jvh2iMYIZYklOFTpZMhEaYQ4FEm0SARJtFfk2YXXtYk1J6T5FUelqSX3lnkG55gYiUfJ5+oH+feZ+Annifgp54m4OWeZGEjHmGhIB3fId0eW+HaXlkh2R2ZYdpdW2Hc293hnxqfoaAaoGEhGyEg4RthIGEcYOAgnGCgYJvgYKAb3+Bf2t9gX5qf4J+Zn6CfWN+g35kf4OAZISDgGJ+hHplcohncFqKRoA+iTyJO4U7jjyEPI4+gjyPPoE+jz+BQY9CgEOORYBGjUeAR4tGgEaKRoFGikaBRopGg0aJRYNFiUWCQ4hDgkSINv82/zf/N/83/zf/Nv82/zX/Nf81/zX/NP80/zP/Mv8y/zL/MP8w/zD/MP8w/zD/MP8w/zD/MP8v/y//L/8u/y//L/8v/y//L/8v/y3/L/8v/y//MP8w/zD/MP8u/y7/Lv8u/y7/Lv8v/y//L/8w/zD/Mf8v/y//L/8v/zD/MP8v/y//L/8v/y7/Lv8u/y7/Lv8t/y3/Lf8s/yz/LP8r/yv/K/8r/yv/K/8r/yv/K/8r/yz/LP8s/yz/LP8s/yz/Lf8t/y7/Lv8v/y//L/8v/zD/MP8v/y//L/8v/y7/Lv8u/y7/Lv8t/y7/Lv8u/y7/Lf8t/y3/Lf8u/y7/Lv8u/y7/Lv8u/y7/LP8s/y3/Lv8u/y7/L/8v/y//L/8v/y//MP8w/zD/MP8v/y//L/8v/y//Lv8u/y7/Lv8t/y3/Lf8s/yz/K/8r/yr/Kv8p/yj/KP8o/yf/J/8n/yf/Jv8l/yb/Jf8l/yX/JP8k/yP/I/8j/yL/Iv8h/yH/If8h/yH/IP8g/yD/IP8g/yD/H/8f/x//Hv8f/x//IP8i/yT/J/8s/y3/L/8z/zn/PP9A/0b/Sf9J/0f/Qv8//z//Qv9F/0b/Rf9B/z3/L/8o/yb/Jv8m/yb/Jv8n/yf/J/8n/yf/J/8o/yn/Kf8q/yv/Lv9f/2v/Yf9h/2L/X/9k/2T/Nf8m/zL/Of87/z7/Pv9C/0r/T/9Q/1D/Sf8+/zv/PP9B/0P/VP9t/3H/cv9u/2X/W/9Z/2P/Yf9l/2v/bf9r/2j/Zf9e/13/W/9Z/1b/Uv9Q/1P/Uv9P/03/Sv9F/z3/M/8w/y//Mv80/zn/Of8z/yz/K/8q/yn/Kf8p/yn/K/8u/zD/Mf80/zj/Of86/zv/PP85/zf/N/83/zn/Pf9A/0L/Qv9B/z3/Ov86/zb/Nf8y/zD/MP8x/zP/M/80/zX/Nv81/zX/Nf81/zX/NP8z/zL/Mf8x/zD/L/8v/y//L/8v/y3/Lf8s/yv/K/8r/yz/LP8s/yz/LP8s/yv/K/8q/yr/Kf8p/yz/Mv86/0D/SP9I/0P/QP88/zb/L/8o/yf/J/8n/yf/J/8n/yf/KP8p/yn/Kf8p/yj/Kf8q/yr/K/8r/yz/Lf8t/y7/Lv8u/y//Mf8w/zD/MP8w/zH/Mf8x/zH/Mf8x/zD/L/8v/y//L/8v/y//L/8v/y//MP8w/y//L/8w/zD/L/8v/y7/Lv8t/y3/Lf8t/y3/Lf8t/y3/Lf8u/zH/Mf8y/zP/Mf8x/zH/Mf8x/zH/Mv8z/zX/Nf81/zX/Mv8y/zL/NP83/0P/Uf9e/2n/cP96/4H/gP+A/4D/f/99/3z/ev92/3D/b/9x/3X/ef99/3//gP9//4D/gf+B/4L/gv+B/4D/ff99/33/fv97/3L/af9c/1T/TP9J/0n/S/9M/0//Tv9M/0r/SP9I/0n/S/9R/1H/T/9L/0n/S/9U/1//b/+G/5L/kv+T/5P/kv+S/4//jP+I/4H/e/9z/23/Zf9g/1z/Wf9W/1b/WP9b/2L/Zf9p/3D/c/92/3v/fv+A/4H/gf+B/4H/f/9//3//gP+A/3//fv9+/3z/e/97/3z/ff99/3z/fP9+/37/gP+D/4H/fP93/2//ZP9X/0b/Pf89/z3/QP9B/0H/P/9A/0D/Qf9D/0b/R/9G/0b/R/9H/0f/R/9G/0b/Rv9G/0b/Rv9F/0X/Rf9G/0P/Q/82fjZ1Nn42dTZ+NnU1fjV1NH00dTV9NXU0fTR1M30ydTJ9MXUwfzB1MH4wdS9+L3Qvfy90MH8wdDB+MHQxfjB0L34vcy9+L3Mvfi90Ln4tdS1+LXYufS52Ln4udy5+Lngufi54Ln4ueC5+Lnkvfi95L38veC9/L3kvfy96L38vei5+Lnstfi17LX4tei1+LXotfi16LH4seix/K3orfyt6K38reyt/K3sqfyp8LH8sfCt/K3wsfyx8LH8sfCx/LH0tfi18Ln4ufi59Ln4vfS9+L34vfy9+L38vfi9+Ln4ufi5+Ln0tfix8LX4ufS5+Ln0tfi18LX4tfC5+Lnwufi58Ln4ufS5+Ln0tfi19LX4vfS5+Ln0ufi99L34vfC9+L3wvfi98L34vfC9+L3wufi58L30ufS59Ln4tfix+LH4sfix+LH4rfit+KX4pfSl+KH0nfid9J34nfSd+J30mfiZ7JX4leyV+JHskfiN7I34jeyN+InwifiF8IX4gfCF+IXwffh97IH4gex9+H3sffh98H34efh9+IH8ifySCJX4phSx9LocyfTeJO31AiUN+SItIfUeMRntBjT55Po5CeUOORXpDjkJ5Oo4seSeMJXoliiZ6JokneieJKHsoiSh7KYkneymIKHsqhyl8M4Vlfmx/XoFgfF+CXX1ggmqBP4Aihy9/NIg6fjyIQHxCiEB6Q4hId0qJSnU/izh1O4xBdUCMPHhaiXF7cYhze2+IbXtpil17ZYtne2iMbHtwjHB6aY1keGGPXnhekFx4V5BTeVCQUXlQj096To9LekePQ3s6kDN5MJIweTWSNHo3kzN6LpIreyqRKXspjyh7KI8qeyyQLXowkTR6NZI3ejiTOXs6lDh7NpQ3ezeUN3w6kz18QZNCe0KRPns8kDt7Oo83ezWNMnsxjDF8MYoyfDKJNH01iDZ9N4c3fTmGN301hTV9M4U0fTSFMn0yhTF8M4YzfTOGMH0vhy59LIcsfSyHLX0thy1+LYgrfiuIKn4qiCt+KYgpfimIKn4tiTZ+PIhEfkqHQX4/hzp+NYcxfiqHJ34miCd9J4gnfSWIJX0niCd9JoglfSaIJ30niCh8KogqfCqIKn4riSt+K4oufi+LLn4uizB+MIwxfjGMMX4xjjJ+Mo4xfjGOMX4wji9/L4wufy6MLoAujC+AL4ovgC+KMIEwiS6BLoowgTCKLYEtiS2BLYktgS2JLYAtiS2ALYstfzCLNIA0ijWANYwzfzKOMn8wjzF/MpA0fzWQNn83jzaANo8zgTONM4IzizSDN4o/g06FWoRle2+EdnJ8hIBsgYSAaX6Ee2h6hHhpdYVubGuFbGxvhXVoeIV7ZXyEfGV6hXpneYV4aHSGc2xxh25xbYdsdWeIXn5WiU6GSoZKjEmDSZBLgU2STH9Okk6BSpNHgkeTSIFKlEyBS5JIgEaQR31LkU57Wo1tfHuJfYF8hXuFfYR5hnqCdohxg2qIYoVbiVWGTYlHi0SHQoxFhkeKT4ZVhVmGXn1fhmR0ZYZpcGyGcXB0hXlveIR5cX2Cf3J/gX9yfoF9cHyBe3B7gXtweoJ6bnuCe2p8gn1nfIN8ZHuDfGR9gn9jgIN/YnyGdGZrh2JyVYlJg0CFQY1BgUKOQ39Dj0SARY9FgEaPRoBGjkeAR41HgEeLRoBHikiBSIpHgUeKRoFGiUaBRolGgUaKR4FHijb/Nv82/zb/Nv82/zX/Nf80/zT/Nf81/zX/NP8y/zL/Mv8x/zD/MP8w/zD/L/8v/y//L/8w/zD/MP8w/zH/MP8v/y//L/8v/y//L/8u/y3/Lf8t/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y//L/8v/y//L/8v/y//L/8v/y7/Lv8u/y3/Lf8t/y3/Lf8t/yz/LP8s/yz/K/8r/yv/Kv8q/yr/Kv8q/yv/K/8s/yz/K/8r/yz/LP8s/yz/LP8s/y3/Lf8u/y7/L/8v/y//L/8v/y//L/8v/y//L/8u/y7/Lv8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lv8u/y7/Lv8u/y7/Lv8u/y3/Lf8t/y7/Lv8u/y7/L/8v/y//L/8v/y//L/8v/y//L/8v/y//L/8v/y7/Lv8u/y3/LP8s/yz/LP8s/yv/K/8p/yn/Kf8o/yf/J/8n/yf/J/8n/yb/Jv8l/yX/JP8k/yT/I/8j/yL/I/8i/yL/If8h/yD/IP8g/yD/IP8g/yD/H/8f/x//H/8f/x//IP8h/yP/Jf8o/yv/L/8z/zj/PP9C/0X/R/9J/0j/Rv9D/0H/Pv8+/0H/Qv9E/0L/P/83/yn/J/8l/yX/Jv8m/yf/J/8o/yj/KP8o/yr/Kv8r/yf/Ov9r/2n/Xv9f/1//Xf9i/2//R/8g/y3/Mv8z/zj/Ov9E/0f/S/9G/0X/SP9H/z3/Pv9R/2T/W/9E/0//av9s/23/Z/9q/2n/Zf9n/2v/bf9w/3H/bv9p/2X/Zv9g/1z/Wv9X/1T/Uf9P/03/TP9M/0v/R/9G/z7/N/8x/zH/NP8z/zb/M/8u/y3/K/8p/yn/KP8o/yn/Kv8r/y3/Mf8z/zP/N/85/zr/N/82/zb/Nv83/zf/Ov89/z7/Pv8+/zz/PP87/zn/N/81/zL/Mf8x/zH/Mv8z/zT/M/81/zX/N/85/zr/N/82/zf/Nf8z/zP/M/8z/zP/M/8w/y//Lv8u/y7/Lv8t/y3/LP8s/yv/K/8q/yr/Kv8q/yr/Kf8o/yv/Mf85/0D/Rv9D/z7/Ov81/zP/Lv8o/yf/J/8n/yf/Jf8l/yX/Jf8l/yb/Jf8l/yX/Jv8n/yn/Kf8p/yr/Kf8q/yz/LP8t/y7/Lv8w/zH/Mf8x/zH/Mv8y/zL/Mv8y/zH/MP8v/y7/Lv8u/y7/L/8v/y//L/8u/y7/L/8v/y7/Lv8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y7/Mf81/zb/OP84/zT/M/8y/zD/Mv8z/zX/Nv83/zf/OP84/zP/M/8z/zP/Mv80/zb/P/9K/1n/Y/9t/3X/eP9+/4H/gP99/3v/ef92/3L/bf9q/2v/b/9y/3b/e/98/3z/ev94/3f/df9z/3H/bv9p/2n/ZP9h/1z/WP9S/1D/Tv9L/0v/S/9L/0r/Sf9G/0P/Q/9E/0b/Rf9D/0P/Qv9A/0H/RP9P/1r/W/9Z/1n/Wf9Z/1n/Vv9R/07/Rv9B/z3/Of84/zf/N/85/z//Rf9K/1L/Vv9c/1//X/9f/2H/Y/9l/2n/bf9w/3H/dv96/33/f/9//37/fP97/3r/ev96/3r/e/97/3v/fP98/3z/e/97/3z/fv9//4D/f/95/3P/a/9h/1f/S/9D/0T/Rf9F/0X/RP9E/0X/Rf9F/0X/Rf9F/0b/Rv9F/0b/Rv9G/0b/Rv9G/0b/Rf9F/0f/Rv9H/0X/Nn42djV+NHY1fjV1Nn42dTR9NHYzfTN2M34zdTJ+MnUxfjB2Mn4ydjF+MXYwfjB1MH4vdC9+L3Mvfi9zL34vczB+MHQwfi50Ln4udC5+LnYufi54LX4udy9+L3kufi56LX4tei1+LXkvfi56Ln4uei59LnsufS57Ln4uey1+LXstfi18LH4sfC1+LXstfi17LX8teyx/LHsrfip6Kn4qeip+Knsqfip7KX8peip/K3osfyx7LH8sey1+LX0tfi19K30sfS19LX0ufS5+L30vfjB9MH8ufS5/Ln0ufy59Ln8ufi59Ln4ufy1+LXwsfi18LX4tfC1+LXwtfi19LX4tfS1+LX0ufi59Ln4ufS5+Ln0ufi59Ln4ufS5+Lnwufi58L34vfC9+Lnwufy59L38vfS9/Ln4tfy1+LX4tfi1+LX4rfit+K34rfSl+KXwpfih8J34nfCZ+JnwmfiZ7Jn4meyR/JHslfyV7JH8jfCR/JHwjfyJ8IX8hfCB/IHwffx98IH8gfB9/H3wefx58Hn8efR9/H38gfiOBJH4ohSt+LYgxfziJPH9Ei0d/SotMfkyNSnxHj0J6P49Be0KPQ3tFj0Z6Qo09ejKNJnoojCd6JosmeiaJJ3sniSd7J4koeieJKXophyl8R4Jvf2d+YIJbe16CYX5igGqBVX4hhS57Oos8ej2LPXo7ikV8R4lYek+ITHdKikh1Qoo9dkWLT3ZXjFd2WItkeWqJaHxniGl8aYhhfGKJaX1xiXJ8b4pqeWONaHloj2R2X5JddlqRVndUkVF4TJFJekuRSXpGkkR7QZI6ejaSMXo0kjZ6N5M1ei+RLHsskSt7K5EpeymRKXspkSp7LJAtejCQMXs1kTl7OJI4ejiTNXo1kzV8NpI5fDqRO3w8kT58PZE9ez2OO3s5jDd7NYw0fDOKMH0wiTJ+MogyfTKHNX02hjh/OYQ5fzeDOX45gzV+NIM0fTKEMX0whTF9MYYwfTCGL30vhi99LoYrfiuELX4qhip+KogqfiqIKX4piCh+KYgtfjWIO35AiEN/Poc7gDeGM4AvhyyAKYclfySIJn4miSV9JYklfSSIJX0liSV9JYklfiaJJ34niSd+J4kofimJKn0qiix9LYotfS2LLn0vjTB9MYwyfTOMMn4yjTJ+Mo0wfjCNMH4wjS5+MIwvfi+ML4Auiy2ALYougC6JLYAtiSyALIksgCyJLIEsiSqBKoktgC2IL4AxijSANok4gDWLM4A0jTSAMo4ygDOPNIA1jziAOY02gDaNNoE2jTWBMo0xgjGKM4I0iD2DSYRWhWB6aYVycXaEfWuAhIFmfoV6Z3mFdmpyhWxtaoZma2uEb2p0hHhmfIN7Y32De2Z6hHpmd4R1Z3OEcWpthGluZYRfcluFWHZUhVF7TYRMgUqER4VFhEKHQIQ/iz2DQIs+gz6NPIM8jjuDO409gT2MP4Q/jD+FP4w/hj6OPIc8jjmHOo46hjqPOIU5kDqFOpE5gjqRPIFCj0iDTYtThViCW4Zed2CFXnBdhV9tXodicmWGaHZshHB5dYF4eX1/fnV8fnlxeYF5cHiBeG96gnpue4J5anuDe2d8g3tmfIN8Zn6Ef2V/hXxjeYV0aWyHZHhahk2FRoNGjUSARpFGgUWPRYBDjUN/Q45DgEOMRYFFi0WBRYpEgEWKRYBGikeARopIgEiKR39Gikh/Roo0/zT/M/8z/zP/M/8y/zL/M/8z/zP/Mv8z/zP/Mf8x/zL/Mf8x/zH/MP8w/y//L/8v/y7/Lv8u/y7/Lv8u/y7/L/8v/y7/Lv8u/y7/Lv8u/y3/Lv8t/y3/Lv8u/y3/Lf8s/yz/LP8s/yz/Lf8t/y3/L/8t/y3/Lf8t/y3/LP8s/yz/LP8s/yz/Lf8t/y3/Lf8r/yv/LP8s/yv/Kv8p/yn/Kf8p/yr/Kv8q/yn/Kv8r/yz/LP8s/yz/LP8s/yz/LP8r/yz/Lf8t/y7/Lv8v/y//L/8v/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/Lf8t/yz/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y7/Lv8u/y7/Lv8u/y//L/8u/y7/Lv8u/y//L/8u/y7/Lv8u/y3/Lf8t/y3/Lf8t/yv/Kv8r/yv/Kf8p/yn/KP8n/yf/Jv8m/yb/Jv8m/yb/Jf8l/yX/Jf8k/yP/JP8k/yL/Iv8h/yH/IP8g/x//H/8g/yD/H/8f/x7/Hv8e/x7/H/8g/yD/Iv8l/yr/LP8u/zL/Of9B/0b/S/9Q/0//TP9K/0f/RP9C/0H/Qv9F/0b/Sf9G/zz/LP8o/yf/Jv8m/yb/Jv8o/yj/J/8p/yX/KP8n/yn/Vv9s/2P/X/9c/2L/aP9n/2z/U/8e/zL/Sv9M/0z/Tv9T/1X/Sv9H/0r/Tv9L/0n/Qf88/0T/QP9C/0f/Uf9e/2H/Zf9n/2j/av9p/1//Z/9q/27/cP9s/2L/Zf9q/2f/Yv9h/2P/Xv9X/1T/UP9M/0j/R/9G/0X/RP9C/z3/OP8z/zT/Nv83/zX/L/8r/yv/K/8r/yr/Kv8q/yr/Kf8p/yv/K/8w/zL/Nv85/zn/Of81/zX/M/80/zT/Nf83/zr/Pf8+/z7/Pv89/zv/Of83/zX/M/8y/zH/Mf8x/zP/M/8z/zP/M/81/zj/OP84/zj/N/82/zT/Mv8x/y//MP8w/zD/MP8w/zD/MP8v/y7/Lf8s/yz/Kv8q/yn/Kf8p/yn/KP8p/yn/Lf82/zv/QP8+/zr/Nv80/zH/Lv8q/yb/JP8m/yb/JP8k/yX/JP8l/yX/Jf8l/yX/Jv8n/yf/J/8n/yf/J/8p/yn/K/8r/yz/LP8u/y7/L/8w/zL/Mv8y/zL/Mv8y/zH/Mf8x/zH/L/8v/y//L/8u/y7/Lf8t/y3/Lf8t/y3/LP8s/y3/Lf8s/yv/LP8s/yz/Lf8v/zH/Mf8z/zT/NP8x/zL/M/80/zP/NP80/zX/Nv84/zb/Nv82/zb/Nv80/zH/Mf8z/zT/NP88/0b/Uv9b/2X/b/92/3v/ff+A/33/ef93/3T/cv9r/2T/Z/9q/2z/cf91/3n/e/97/3z/fP97/3n/eP93/3T/cv9v/2v/Z/9j/2D/XP9X/1b/VP9R/07/Sv9G/0H/PP86/zj/OP84/zj/N/82/zf/N/86/zr/Ov86/zn/O/87/zv/PP89/z7/Pv88/zn/O/87/zn/Of87/z//Rf9K/0//U/9b/17/YP9f/2D/X/9c/1r/Wf9b/2D/Zf9q/3H/dv96/3v/e/95/3n/eP94/3r/ev98/3v/ef97/3v/fP98/3z/fP99/37/f/99/3n/dP9t/2P/W/9O/0X/Rv9G/0X/RP9D/0T/Q/9C/0L/Qv9D/0P/Q/9D/0T/Rf9G/0f/R/9J/0n/SP9I/0b/R/9G/zV+NHUyfjJ1NH4zdTJ+MnUzfTJ1Mn0ydTF+MXUxfjF1MH4wdjB+MHYvfi92L34vdS9+L3Qvfi9zLn4ucy5+LnMufi50L34vdC5+LnQtfi12LX4tdyt+K3gsfi16LX4seit+LXssfix6LH4seSx+LHktfSt6Kn0qeip+K3orfit6LH4sfCt+K3wsfix8LH4sfCt/K3srfyt7K34reip+Knopfil7KX4peyl/KXspfyp7K38rfCt/K3wrfit9K34rfSx9LH0sfSx9Ln0ufi19LX4tfS1/Ln0ufy59Ln8ufS5/Ln4ufi5+Ln0tfi18LX4tfC1+LXwtfi18LX4tfS1+LX0tfi19LX4sfS1+LX0tfi19LX4tfS5+Ln0ufi5+L34vfi1+LXwufi58Ln4wfS1+LX0tfS19LX0tfS1+LX0sfix9K34qfSp+Kn0qfip8KH4neyd+J3wmfiZ8Jn4meyZ+JnsmfyZ8JX8kfCN/I30jfyN9In8ifCJ/InwgfyB8H38ffB9/H3wefx98Hn8efB9/H30ffyF/In4lgih+KYYtfi+JNH87i0GASIxNgVCNUH9Mjkl8Ro9FekKPQHtCj0J7RI9KfEeNOHsqjCp6J4kkeiSKJnooiSd7J4knfCaJJ3wkhjd+ZoFtgWN7XYJfemODaHtog2yAWoEmhCt/Q4lLfEqMTnxNjE97VIpTe0uJSXlOiEd4QIk5dk6KYXFWjlpyV45Sdl2LZHxpiWx9a4hrfHGIbnxsiG58cIpve2KMX3llj2d5Z5Fld2KRYndfkFd3U5BQd0yRSHpDkkJ6QZNDfEKTP3s6kjN6MJEyejWSNHoukSx7LJEreyuRK3srkSx7LJEreyqPKnsrjy16L48zeTWQN3o4kjZ6NZIyezGQMXszkDZ8OJA4fDuQPHs9jj57Pow+ez6MO3w5ijV7NYkzfDGIMnwziDN8MYYwfjKHNH40hjJ+NYQ3fjeENX00hDJ9MoUwfTCGMX0xhjJ9M4U0fTOFMX4vhC1+LYYqfiqHKn4phyl+KYcpfiiHKH4ohzF+OIc7fz2GOoA2hTaANIUwgC6FK4ApgyV+JYUlfiWHJX4lhyV+JYcmfiaHJn4miCZ+JogmfiaIJ34niCh9KIgpfSqIKn0qiix9LIwtfS6LMH0xizB+MIwwfjCMMX4xizF+MYsxfi+MMH4wiy9/L4ovgC+KLoAtiSyALIksgCuJKoAqiSuAKokrgCuJK4AtiC6AMIoxgDGLMYAxjDGAMo0zgDOOM4AyjzKAM480gDWONYA1jjaBNo03gTaNNoI2izSCNIo1gzWGOYVBhk6EWYJihWt6cYV4cH6Ff2p9hXhpdYVyam6GaW1lhmZxZ4VqcG2FcW52hHlme4N7Y3uEemN6hHpjeIV4ZHaFdGVwhmxoaYZnaGaFY2lhhV1tWIVTck2FSXtGhESAQYQ+hDqEOog2hDeKN4Q3jDaEN4w3hDiMOYU5jjyEPI49hD2OPIQ8jz2DPJA6gzmROIA4kTl/PJBAgUaMSoRQhlWGWnxdhmByYIZgbV2HW21ViFN0VIdafV2FZIFognB9doF7eXuBenR6gXhweYJ5bnmCe2x7g3tqfIN9aXyDfWh7g3tmfIR9Zn2FfGd4h3Rta4dieFuFT4VFg0SMRYBEj0OAQ49Cf0GNQX9BjEN/Q4tDf0SKRX9GikZ/SIpIf0qKSn9Jikh/RopGf0SKM/8z/zL/Mv8y/zL/Mv8y/zL/Mv8x/zH/Mf8w/zD/Mf8w/zD/MP8w/y//L/8u/y7/Lv8u/y7/Lv8t/y3/Lf8t/y7/Lv8u/y7/Lf8t/yz/LP8s/yz/K/8r/yr/LP8s/yv/LP8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8s/yz/LP8r/yv/Kv8q/yv/K/8r/yv/Kv8q/yr/Kv8q/yr/Kv8q/yn/Kf8p/yn/Kf8p/yn/Kv8r/yv/LP8s/yv/K/8r/yv/LP8s/yz/LP8u/y7/Lf8t/yz/Lf8u/y7/Lv8u/y7/Lv8u/y7/Lv8u/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lv8u/y3/Lf8t/y3/Lv8u/y7/Lv8u/y7/Lf8t/y7/Lv8u/y7/Lf8t/y3/Lf8t/y3/Lf8t/yz/LP8s/yv/Kv8q/yr/Kv8o/yf/J/8n/yb/Jv8m/yb/Jv8m/yb/Jv8l/yT/JP8k/yT/I/8i/yL/IP8g/yD/IP8g/x//H/8f/x7/H/8e/x7/H/8f/yD/Iv8j/yb/Kf8p/yz/Lv8y/zj/Pv9E/0f/Sv9L/0v/Sf9G/0X/Qv9D/0L/Q/9C/0b/Qv8w/yj/K/8n/yb/J/8m/yf/J/8n/yj/Kv8l/0D/cP9t/2L/Yv9g/2b/Zv9o/2//TP8j/yr/MP9F/1H/Sv9H/0b/QP9C/0z/Uf9G/0v/Sv8//zz/Rv9U/1v/ZP9X/1b/Y/9p/27/b/9u/2z/b/9w/2v/bP9w/2X/V/9f/2r/av9o/2n/Y/9h/1//WP9S/1L/Tf9J/0T/Qf8+/z7/Pf88/zn/M/8v/zD/Mf8x/yz/K/8r/yv/K/8r/yv/LP8s/yv/LP8r/yz/LP8v/y7/M/81/zb/Nf81/zP/Mf8v/zD/Nf83/zf/OP85/zv/PP8+/0D/QP8//z3/Ov83/zb/M/8z/zT/M/8w/zD/MP8x/zH/Mf8x/zT/NP80/zX/M/8z/zL/Mv8y/zL/Mv8z/zT/M/8y/zD/Lf8t/yz/Kv8q/yn/Kf8p/yj/Jv8m/yf/Kv8z/zj/Ov88/zj/Nv81/zT/M/8w/yz/Kv8o/yb/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jv8m/yb/Jv8m/yb/J/8n/yj/Kf8q/yr/LP8s/y3/L/8v/zD/MP8w/zD/MP8x/zH/Mf8x/zH/MP8w/zD/L/8v/y//L/8u/y3/LP8s/yv/K/8r/yv/Kv8q/yv/K/8r/yz/Lf8u/y7/Lv8u/y7/L/8w/zH/Mv8y/zH/Mv8z/zP/M/81/zX/Nv82/zb/Nf81/zX/M/8z/zT/NP8z/zf/P/9L/1T/Xf9l/23/dP95/37/fP92/3L/cP9u/2z/Z/9i/2X/Z/9q/2//df94/3v/e/96/3r/ev96/3n/ef93/3T/cv9u/2z/a/9r/2n/aP9k/2D/W/9Y/1X/UP9N/0j/Rv9B/zv/OP83/zf/Nv82/zb/N/83/zf/Ov86/zv/O/87/zv/Ov86/zj/OP83/zf/N/85/zz/Qv9H/0z/Uf9X/1v/Xf9f/1//Xf9b/1f/Uf9N/03/VP9Z/2D/Z/9w/3T/d/96/3r/d/93/3j/ef95/3r/ev95/3v/fP98/3z/e/96/3n/e/99/33/eP9y/2n/Yv9Z/07/Rf9E/0P/Q/9D/0H/Qv9B/0H/Q/9D/0T/Rf9G/0b/Sv9L/0r/Sv9K/0n/R/9G/0X/RP8xfTF0M30ydDJ9MnYyfTJ1MX0xdDF9MXQxfi90Ln4vdC9+LnYufi52Ln4udi5+LnUufi1zLX4tcy1+LXItfi1yLH4ucyx+LHUrfit2Kn4sdit+K3crfix5K34reit+Knsqfip8Kn4qfCt+K3wqfip8K34rfSt+K30qfyp9LH8sfSp/KX0qfyp9Kn8qfSt/K30qfyp8Kn8qfCh/Knwqfyp8Kn8qfSp/K30qfil9Kn4qfSp+Kn0rfit9LH4sfix+LH4sfix+K34rfi1+LX8tfi1/LX4tfi5+Ln4ufi5+Ln4ufi1+LX4ufi5+LX4tfS1+LX0tfi19LX4tfS1+LXstfi17LX4tfCx+LHwtfi19LX4tfS1+LX0ufi59Ln4ufS5+Ln0ufi1+Ln4ufi1+LH0tfi19LX4tfS1+LXwtfi19LH4sfit+K34rfit+KX4pfSh+KHwnfid9Jn4mfCZ+JnwmfiZ8Jn8mfCV/JHwkfyR7I38jfCN+InwifiJ8IH4gfB9+H3wffR98Hn0ffB9+H3sffh9+IH4jgSR9J4UqfSyILX4uijJ/Now7gECNQoBGjUl/So5JfUeQR3xEkEF7QZBBe0CQP344jS19KossfCiKJ3sliSd6J4kmeyiIJ3snhzx+cIFrgmR5ZINld2eDanlsg2h+PYEeiCt/L4ozfD+KWnpMjEN5RoxHejyKUHpSiE55S4hJd0eIRnZMilF0X41mcWCPWHdfjGd8bYlvfm+Hbnxwh3F8b4hwem+JZnhfi2V3ao1oeWeOaXdmj2Z3YZBddViSUndOk0d4QpM9eTuUOns7lDp7N5I0ejGRMXowki15LJEreyuRKnsqkSl7KpAseyuQLXstjyx7Ko8sey6PL3owjzF6M5A0ezWPNHoyjzB6MI8zezePNXs4jzl9Oo06fTyNPn1BjEB+P4s8fDqIOHs2hzl9N4g1fTOHMX0vhi99LocvfS+HMX0yhTJ9NIY0fTSFNH0zhTN9M4U1fjWENH4zhDF+L4Uufi2FLH4ship+KYYofiqHKX4nhyV+J4Ynfi2GMn80hjmAOYQ4gDWENoI3gjKBMIItgSuEJ4ElhyWAJYclfySHJH8kiCR+JIclfiWHJX4lhyZ+JIclfSWHJ30oiCp9KoksfSyKLn0uiy59LosufS6JLn0uiy19LYstfS+LMH4wjDB/MIsufi6KMH4uiS5/LYksfyyJK38riSt/K4krfiuJKn4qiSt/K4osfyyKLH8sii1/LYotgS2LMIExjTF/MY0xfzKNM4AzjjSANI40gTSPM4EzjzOCM4sygjKJM4MyiDGEMog2hTqHQoVOh1eHYn1qh3FxeIV7ZnqFdWZyhW1nbYVrb2aGYnJih2Vva4Vxa3SDdmZ6hXhmeYV6Y3mFeGJ4hnZkdId0Zm+GbGRth21hbYdsY2qHaWVnh2doYoZeb1qGVndRhkx/RYY/hTmEOIk2hTaLNYQ2jTeEN403gzeNOIM5jTqEOo45hDmQOII4kTaBNpI1gDaSOYA+kkKBRo1NglOCWIRceF6GXnBeh11uWYhVck6ISXpIhkqDU4VbhGODa4FxgHd5eoB7cXiCdWx2gnZrd4N4bneDd255gnpse4J9aX2Demd7hHtne4V6aHaGcG5ph2B4WIVQgkaDRIpDgEKOQH9Aj0F/Qo9Df0SMRH9Ei0d/SIlIf0qJTH5LiUp+SIlHfkWJQ35BiTH/Mf8x/zD/Mf8x/zH/Mf8w/zD/L/8u/y//L/8t/y7/Lv8t/y3/Lf8t/y3/Lf8t/yz/K/8r/yv/LP8s/yz/LP8t/yz/K/8r/yv/K/8q/yv/Kf8q/yv/K/8q/yr/Kv8p/yn/Kf8q/yr/Kv8q/yr/Kv8r/yv/Kv8q/yn/Kf8r/yv/Kf8p/yr/Kv8p/yn/Kf8p/yn/Kf8p/yn/KP8p/yj/KP8n/yf/KP8q/yr/Kf8q/yr/Kv8q/yv/K/8s/yz/LP8s/yv/K/8r/yv/LP8s/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y7/Lv8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/Lf8t/y3/LP8s/y3/Lf8s/yz/LP8s/y3/Lf8s/yz/LP8s/y7/LP8t/y7/Lf8s/y3/Lf8t/y3/Lf8t/yz/LP8s/yz/K/8r/yv/K/8p/yn/KP8o/yf/J/8n/yf/Jv8m/yb/Jv8m/yb/Jv8l/yX/Jf8k/yT/I/8i/yL/Iv8g/yD/H/8f/x//H/8e/x7/H/8f/x//H/8h/yT/Jf8p/yr/LP8t/y7/Mf82/zv/P/9D/0X/R/9K/0r/Sf9I/0X/Qv9C/0H/QP85/y7/Kv8r/yv/KP8n/yj/Kf8o/yj/KP8q/z7/a/9t/2b/Y/9m/2v/bf9v/2f/Nf8m/y7/Mf8w/z3/WP9Y/0v/Tv9L/0r/TP9N/1L/U/9O/0T/Rv9G/1D/Uf9o/2n/Zf9h/2b/bP90/2//bP9r/27/bv9r/27/bP9g/2L/ZP9m/2b/Zf9m/2f/aP9m/1//Wv9W/1L/Sv9C/z3/O/86/zj/Nv82/zr/O/84/zP/L/8t/yz/Kv8o/yj/Kf8q/yr/LP8t/y7/L/8u/y7/Lv8u/y7/L/8x/zL/NP82/zT/Mv8y/zL/M/81/zb/OP85/zn/Of88/z//P/8+/z3/Pv88/zr/O/85/zf/Nf8z/zL/Mv8x/y//MP8x/zP/Mv8z/zP/NP80/zP/M/8z/zT/NP8z/zL/Mf8v/y7/Lf8s/yz/K/8q/yn/Kf8p/yj/J/8m/yb/Kf8s/zH/Nf86/zr/Of85/zf/Nv82/zH/L/8s/yf/JP8l/yT/JP8k/yT/I/8j/yT/JP8k/yT/JP8k/yb/Jv8n/yj/Kv8q/yz/LP8t/y3/Lv8u/y7/Lv8u/y7/Lf8t/y3/L/8u/y7/Lv8u/y7/L/8v/y//Lv8t/y3/Lf8s/yz/K/8r/yv/K/8q/yr/K/8r/yz/LP8s/yz/Lf8t/y7/Lv8v/y//L/8v/zD/Mf8x/zL/Mv8y/zL/Mv8x/zH/Mf8x/zL/Mv8x/zD/L/8w/zL/M/81/z7/Sv9W/17/Z/9v/3T/ef95/3b/cv9w/23/bP9o/2P/Yf9l/2r/bP9w/3T/d/94/3n/ef94/3b/c/9x/2//bf9q/2n/af9q/2r/a/9q/23/bf9r/2n/Zf9g/1r/U/9L/0T/PP84/zf/Nv82/zb/Nv82/zf/N/83/zf/N/83/zb/Nv82/zb/Nf81/zX/N/82/zj/Pv9E/0n/Tv9U/1r/XP9c/17/Xv9d/1X/Uf9K/0b/Qv9H/0//WP9h/2n/b/90/3j/eP94/3b/dP90/3X/dv92/3X/df95/3v/e/96/3j/ef95/3r/eP92/3H/af9i/1n/UP9F/0P/Qf9C/0L/Q/9E/0T/Rf9H/0j/Sf9K/0n/S/9L/0r/Sv9I/0b/Q/9B/0L/MH0wdzB9MHcwfTB2L30vdTB9L3YvfS92L34vdjB+LnYtfi12LX4tdit+LHUsfix2LH4qdCx+LHQsfixzLH4scyx+K3Qqfip2KX4pdyp+KXcofil3KX4peSl+KXopfip7KX4pfCp+KXwqfip9Kn4qfSt+K34qfip+KX8pfSl/KX0ofyh9J38ofSh/KH0ofyd9KH8ofSl/KX0pfyh8KH8ofCh/KH0ofyh9KX4pfSp+Kn0qfip9Kn4qfSp+Kn4rfit+K34rfit+K34sfix/LH4sfyx+LH4sfix+LH4sfi1+LX4tfi1+LX4tfi5+Ln0tfi19LH4sfS1+LX0tfi18LX4tfCx+LHwrfit8K34rfSp+Kn0rfit9K34rfSt+K30rfit9K34rfit+LX4tfi2ALX4tgCx+LH0rfip8LH4seyt+LH0sfix+Kn4qfip+Knwofih8J38nfCd/J3snfyV7J38neyZ/JnomfyZ6JX8leyR/I3wkfiN8In4ifCB+IHwffh98H38ffB5/Hnwefh57Hn4gfiJ+JYMofSmGLH0riS59MYs0fjeOPn9CjkV/Ro5IfkmPS31KkEl8SJBEe0SQQ3s/kDB7KowpeiqKKHwmiSh8KokmeymIKHwqhil/ZH9wg2d5ZYRleGqEantvgVeBKoAohjB8L4w0ekSOVntcjUx7S4tIekmMTHlLi0J5SYlSeUuIRXg/iUl2WYtfcVmOWHBbkGB2ao1wfHOKa31qiGp7ZYpseW6LbHZni192YYxld2eNY3lfjmF4Zo9oeGWRX3Vdk1l1VZROdUeVQng9ljp6OJQ3ejmSPXpEkD96NY8xeS2PK3opkCh6KJAoeyiPK3ssjy17LY8vey+PLnsujy16LY4uei+OL3szjjN7NI41ezWOMnsxjjF7M442ezeNN3s5jTt8PIw8fTyLP3w/ij97P4k+fD6JPHw5iDh8Nog2fDWJM3wziDN8M4c0fTSGNH00hTV+NIUyfjOFMH4whjB+MIYwfi6GLX4uhi5+LYYsfiuGKn4phil+KYYofieGJn4nhih/LIYygDeEOoA6hDuCO4I5gjiCNIIxgS6CKoMkgSOEI38jhiN/I4cifiKHIn4ihyN+I4ckfiWHJH0mhyh9KYgqfSyILH0siCx9LYkufS6JLn0uiS19LYssfSyLLH0tiy1+LYsufi6KL34uii9+L4kufi6JLn4uiS1+LYksfiyJLH8siSt/K4ksfiyJLH4siSx/LIksfyyJLX8tii1/LYsufy6ML38vjDCAMY0wgDCNMIEwjTCBMI0vgi+MMYIxiy+BLoovgy+KL4MvijGDNYo7g0aHT4RcgGOFa3VyhXloe4V3ZXSFcGhthmltaIdlcWGHYXRnhmpxb4Vya3WFd2Z3g3RhcYVxYG6Ga2Rph2hpZohka2SIZGpoiGpmaYhqZGyIamVniWRqX4lZclGISH4+hzmGOIU3iTaDNos1gzWLNoI2jDeCN4w1gzWONIM0jzSBNJA1gDWSNYA1kTWANpE5gD+NRYFMh1GDV39ZhFt3XoVfcF2HWnBTiU13SYdDgECFSYVQg1iFYIJngW6CdHh5gnlud4J1a3KDcmxzg3RwcoNycXKDdXB5gntreYN5aHmEemh8hXhqdoZwbWqFZHVchVODSoJBikGAQ4xEf0aNRX9IjEp/SotKf0qJSX9JiUt/SolJf0aJRn9DiUF/P4kv/y//L/8v/y7/Lv8u/y7/L/8v/y7/Lv8v/y7/L/8t/y3/Lf8s/yz/K/8s/yz/LP8s/yr/LP8s/yv/K/8p/yn/KP8q/yn/Kf8o/yj/Kf8o/yf/KP8o/yj/J/8o/yn/Kf8q/yr/Kv8p/yn/Kf8p/yn/Kv8q/yn/Kf8p/yn/Kf8p/yj/KP8n/yj/KP8o/yj/Jv8n/yf/KP8o/yf/Jv8n/yf/J/8n/yf/KP8p/yn/Kv8q/yr/Kv8q/yr/Kv8q/yr/Kv8r/yv/K/8r/yz/LP8s/yz/LP8s/yz/LP8s/yz/Lf8t/y3/Lf8t/y3/Lf8t/yz/LP8s/yz/Lf8t/y3/Lf8t/y3/LP8s/yv/K/8r/yv/Kv8q/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/LP8s/yv/LP8s/yv/Kv8s/yz/K/8r/yv/K/8q/yr/Kv8q/yj/KP8n/yf/J/8n/yb/Jv8n/yf/Jv8m/yb/Jv8m/yb/JP8j/yT/I/8i/yL/IP8g/x//H/8e/x7/Hv8e/x3/Hv8e/yD/Iv8m/yn/Kv8s/y7/Mf80/zj/Pv9D/0X/Rv9J/0r/S/9L/0r/Sv9J/0b/Rv9G/zn/K/8r/yr/Kv8p/yf/Jv8m/yf/KP8o/yP/VP9v/2r/af9q/27/cP9v/0//LP80/zP/Lv8t/zT/Q/9K/07/T/9R/03/U/9T/1P/T/9M/0v/RP9C/0f/R/9b/17/Vf9L/1z/Yv9p/3H/b/9t/23/av9n/23/b/9t/2n/Zv9k/2L/Yf9g/2D/X/9j/2b/Yv9e/1r/Wf9W/1D/S/9E/z//PP88/z3/PP88/0L/Pf81/zP/L/8p/yj/KP8o/yj/KP8p/yv/LP8v/y//Lv8v/y7/Lf8t/y3/Lf8t/y//Mv80/zb/Nv8z/zL/Mf8x/zP/Nf82/zj/Of87/zv/Pf8//z//QP9A/0D/QP8//z//Pf88/zv/Ov85/zn/OP84/zj/OP83/zX/Nf80/zH/MP8u/y7/Lv8u/yz/Lv8t/y7/Lv8t/yz/K/8q/yn/Kf8p/yj/J/8n/yb/J/8o/y3/Mf80/zf/Ov87/zn/N/82/zP/MP8s/yj/JP8j/yP/I/8j/yL/Iv8i/yL/I/8j/yP/JP8l/yf/Jv8n/yj/Kv8s/yz/LP8t/y7/Lv8u/y7/Lf8t/yz/LP8s/y3/Lf8t/y3/Lf8v/y//L/8v/y7/Lv8u/y7/Lf8t/yz/LP8s/yz/Lf8t/yz/LP8s/yz/LP8s/yz/LP8t/y3/Lf8t/y7/Lv8v/y//L/8w/zD/MP8w/zD/L/8v/y7/Lv8w/zD/Lv8u/y7/Lv8u/y7/L/8x/zL/OP9E/07/WP9g/2j/cP91/3r/ef93/2//bP9q/2f/Zf9i/2D/Yf9n/27/cf9z/3P/df9x/2//bf9p/2X/ZP9i/2D/W/9c/17/YP9j/2b/aP9p/2j/ZP9f/1n/UP9H/z7/Of84/zj/Nv82/zX/Nf82/zb/N/83/zX/Nf80/zT/NP80/zX/Nf80/zT/Nf82/zj/Pv9D/0r/Tv9U/1r/XP9d/1//Xf9b/1f/UP9K/0X/RP9E/0r/Uf9a/2L/aP9w/3P/d/94/3b/dP9y/3D/cf9x/3H/cv9y/3X/ev97/3r/ef95/3r/e/96/3f/c/9v/2f/X/9Y/03/Rv9F/0P/R/9I/0n/Sv9K/0r/Sv9J/0n/Sf9J/0n/Rv9E/0H/Pf88/y59LncufS53LX0teC59LngufS13LX0sdy1+Lnctfi13LH8sdyl/KXcqfip2Kn4qdit+KHYofih2KH4odSh+KHUnfyd0J38ndSd/J3Ynfyd3J38neCd/KHgofyh6J38neyd/J30ofyh+KH8ofyl/KX8qfip+KH4ofCh+KH0pfil9KH4ofSh+KH0nfiZ8Jn4mfCZ/Jn0mfyZ9JoAmfCaAJnwngCd9JoAnfSl/KX0qfyp9Kn8qfSt/K30pfil+KX4pfil+KX4rfit+K34rfit+K34rfix/LH4qfyt+K34sfi1+LH4sfix+LH4rfip9K34rfSp+LHwsfit8LH4sfSx+LH0qfip9Kn4qfSt+K3wrfit9Kn4qfit+K34rfit+K34rfip+Kn4qfip+Kn4qfit+Kn4rfix9K34rfSt+K3wrfit8Kn4qfSp+Knwqfip9KX4pfCl/KXsofyd7Jn4neyh+KHonfyd5JX8leCZ/JnklfyV6JH4keiF+IXsgfiB9IH4gfR9/Hnwdfx18HX4efR5+IIAkfiiEK34siC98MYszfjeNO39Bjkd/TI5Nf06QTH5KkUt8So9MfEuPSnxKj0N7Lo0meymNJ3sliyd7J4kneyiJKHonhyZ9TYJxgWh6Y4Npd2+FcHtpgz+CIn8zhzB9MIwvfDGONH09jkd/Uoxaf16MWHxWi1h7WYpVek2ISXhCiTZ3PItIc2KOY3Baj1lvaI9xdG2OcnhyinF7bYluem2JaXlpiWp2a4pndmSLYXZfjmJ3YJBfd16RXXhcklV5U5RVeVOVUXhNl0l3Q5hAeECVQ3g/kzh5OpE5ejWQNnoxkCh5Jo8neyeOKHsojih7KY4peyqQLnsvkDB7MI8ueyyPK3wrjit8LIwsfS2NMH0zjTF9MI0xfC+MMHwyjjV8N444fTiNOn07jT19P40/fT+NQH1Ai0F9QYtCfD6KQHxAikB9P4k+fT6JPX07iDt9OIc1fjSGMn4vhi1+LIUtfi2FLX4shy1+LocsfiyGK34qhip+KYYpfimGKH4nhiZ+JoYmfyWHJn8rhy+AMoU0gTaEOIM4gjSCNH4xgi6ALIEngiKAI4QjfyOGI34jhyN+I4ckfiSIJHwkiCV9JocnfSiIK3wriCx9LIgtfS2JLn0uiSx+LIorfiuKLH0siy19LYsufS6JLn0uiS59LokvfS+JL3wvii58LoosfiyJLH4siS1+LYgtfi2ILX4tiC5+LogtfS2ILX0tiC1/LYktfy2KLn8uii9/L4owfzCLMH8wizGAMYsvgC+LLoAuii+AL4ougC6KLYAtii6CLoougi6KMIIxizeCP4lJg1OCXIVld22Fc2h3hndkdoZwZmqHaGtoh2RxX4dec16GZnFshW5scIRwZnCEbmVshGdpYoZhbV6IW3NXiVR2U4lTdViJW3JgiWVuYYlfcVqLV3ZNikV+PYY5hziFNoo2gzaMNYI1jDaANow3gDeMNYA1jjaANo81gDWRNn82kTZ+NpE2fjaQOX48jkF/R4lNglOCV4VafFyGX3ZdiFxxWYlTdE6HSHtGhUWDSINNhlSCXYZlgmt+cIJ1dHeCeG14g3Zrc4NwcG2CbnRvgnB5cYJzdHiDe216g3lpeYR5aXuEemp3hXRscYVqdGOEW35Vgk2HSYFIikl/SItJfkqLSX5Hikl/R4lIgEeKRoBDikCAPYo7gDmKLv8u/y7/Lv8t/y3/Lf8t/y3/LP8s/y3/Lf8s/yz/LP8s/yv/Kv8q/yn/Kf8o/yj/KP8n/yf/J/8o/yj/KP8o/yf/J/8n/yf/J/8n/yf/J/8o/yj/J/8o/yf/J/8n/yf/J/8n/yj/KP8o/yj/Kf8p/yr/Kv8p/yn/KP8o/yj/KP8p/yj/KP8o/yb/Jv8m/yb/Jv8m/yb/Jv8m/yb/Jv8m/yf/J/8m/yf/KP8o/yn/Kf8p/yn/Kv8q/yj/KP8p/yn/Kf8p/yv/K/8r/yv/K/8r/yv/LP8r/yr/Kv8r/yz/Lf8s/yz/K/8s/yr/Kv8r/yz/LP8r/yr/Kv8s/yz/LP8s/yr/Kv8q/yr/K/8r/yv/K/8q/yr/Kv8r/yv/K/8q/yr/Kv8q/yr/Kv8q/yr/K/8q/yr/LP8r/yv/K/8r/yv/K/8q/yr/Kv8q/yr/Kv8p/yn/Kf8p/yj/J/8n/yf/KP8o/yf/J/8l/yX/Jv8m/yX/Jf8k/yT/Iv8i/yD/IP8g/yD/H/8e/x3/Hf8d/x7/H/8i/yX/Kf8s/y//Mf80/zf/O/89/0L/SP9O/1L/Uf9P/03/TP9L/0v/Tf9M/0j/N/8q/yb/Jv8o/yf/Jv8n/yb/Jv8o/yT/Tv90/2n/Zf9q/2r/bP9l/zL/I/8x/zL/MP8u/zP/MP82/0X/Sf9P/1f/Wf9W/1b/Vv9X/1b/Tf9E/zv/MP84/0b/Xv9S/1X/W/9h/2v/av9y/3X/cf9t/3D/cv9u/2r/af9n/2f/ZP9i/2D/Xf9e/17/Wf9V/1T/Tv9N/1D/Uv9O/0z/Tf9G/z//P/9B/zz/N/82/zP/Nf81/zH/K/8n/yf/J/8o/yj/KP8o/yn/Kv8t/y7/L/8v/y7/Lf8s/yz/K/8r/yr/K/8s/y3/Lv8w/zD/L/8w/zD/M/81/zf/N/84/zr/Ov87/zz/Pv9A/0D/QP9A/0H/Qf9C/0L/Qv9B/0H/Qf8//z3/O/84/zf/Nf8z/zH/L/8v/y7/Lf8t/yz/LP8s/yv/K/8r/yr/Kv8p/yn/Kf8n/yf/Jv8m/yb/Jf8k/yb/KP8r/y7/MP8y/zX/NP80/zL/L/8t/yn/Jf8j/yP/I/8j/yP/I/8j/yT/JP8l/yX/Jf8m/yf/KP8r/yv/LP8s/yz/LP8t/y3/LP8s/yv/K/8s/yz/Lf8t/y7/Lv8u/y7/Lv8u/y//L/8v/y//Lv8t/yz/LP8s/yz/Lf8t/y3/Lf8t/y3/Lv8u/y7/Lv8u/y7/Lf8t/y3/Lf8u/y//L/8v/zD/MP8w/zD/Mf8x/zH/L/8w/zD/MP8w/y//Lv8t/y3/Lv8u/y//L/8w/zH/Mv8y/zv/Rf9Q/1v/Yf9p/27/dv95/3X/cP9t/2r/af9l/1//Wv9d/2L/aP9r/27/cf9y/3D/bP9m/2L/Xv9Z/1X/Uf9O/0z/T/9P/1P/WP9Z/1f/Vf9Q/0r/Qv85/zf/OP82/zb/Nv82/zb/N/83/zj/OP83/zf/N/83/zj/OP85/zn/Of85/zr/Ov86/zv/Qf9G/0v/Uf9W/1n/W/9c/13/Xv9a/1X/Uf9L/0f/Rv9I/03/Uv9Y/2H/aP9s/3D/df93/3n/ef93/3L/bf9t/2//b/9u/2//cv92/3v/ev96/3r/e/98/3z/ef94/3T/b/9s/2P/XP9S/0v/Sf9J/0n/Sf9I/0j/R/9F/0X/RP9D/z//Pf87/zf/Nv8ufS54Ln0ueCx9K3gtfSx4LH0sdy19LXcsfix3LH4sdyt9KncqfSp3Kn4odid+J3YofiZ3Jn4mdyZ+Jncnfid3J38ndiZ/Jncnfyd5J38neid/J3smfyZ7JX8leyd/J3wnfyd9KH8ofih/KH8pfyl/KH4ofyl+KX4ofih+KH4nfid+J30nfid9JX4lfCV+JXwlfyV9JX8lfSV/JX0lfyV9Jn4mfSZ+Jn0mfyZ9J38nfSh/J30nfyd9J34ofil+KX4pfil+Kn4pfip+K34rfit+Kn4rfyt+K38rfit/K34sfyt+K34rfit+Kn4qfSp+Kn0pfil+K34rfit+Kn0rfit9Kn4qfSp+Kn0qfip8Kn4qfSp+Kn8pfil/KX4pfip+Kn4qfip+Kn4qfip+Kn4qfip+Kn4qfSp+Kn0rfit+K34rfip+Kn0qfip8Kn4qfCl+KXspfyl6KX8oeih+KHoofyh5KH8oeCd/JXclfyV4JX8leSR+JHoifiJ7IX4hfCB+IHwffx58Hn8efB5+H30gfiSAJn4phS1+MIkzfjeLO38+jECAQ41IgE2OUIBRkE9+TpFOfEyPTH5Nj0t9P44teymLKHsoiid7KoooeyeKJnwlhyZ9VH92f2p5ZYJmeGqCZHpngEOBI34uiDJ8MYwwfC6MLX4vjTmASI1PgVKMWIFZjFl/XotkfFqLVHlNikd3PooxdTyLSHFajlpuVJBXbl6RaHJqj212cYtxeXOJd3l2iXF5aYlhdmGKZnZkjV92Wo9ZdV6RX3dWk1B5TpJJe0iUSntOlU17TZZNeUmXRHdCl0B3PJQ4eTWTNHo3kjd6NJEteSiPJXsmjid7KI4peymOKXspkCx7L5Auey6PLXsujy58Lo4rfCmMKH0ojCd9KYwpfSqMLXwtiy58MIsxfDSMNXs2jTZ7OI05ezmNO3s8jT18Po4/fD+OQX09jD59P4xAfkCLQn5Ci0F9PYo6fTqJOH42hzZ+NIcyfjGHMH4vhy9+LYcsfiuHKn4qhit+KoYpfimGKH4ohid+JoYlfiWGJH8jhyR/JIckfyWGKYAshS6AMYMygjOANIIvfi6BK4AmgCOCIn8khSN+I4YkfiOHJX8liCZ+JogmfSeHJ30oiCp8KogqfSqIK30riSt9K4ksfCyJLHwsiS19LYktfS2JLn0tiS59LokufS6JLn0uiS9+L4gufi2ILH4siSx+K4ktfi2ILX4tiC1+LYgtfi2ILX8uiC1/LYgtfy2ILX8tiS1/Logvfy+IL38wiTB/MIkxgDGJMIAwiTGAMYowgDCKL4AuijCAMIovgS+KMIEwijKBM4owgTGLNIE5ikGCSoZWhF16ZoVrbnKFeGd3hnFlcIdqZmWHY25dh1p2WoZeeGOEZ3NshG1tb4RuaGyFZ2pihltvVodTdlCHSX9Hh0eDSIhKhU2ITYVLh0aHQ4U9iTiCOIs6gTmOOIA4jzd/N484fziPOH84jzh/OJE4fziSOn88kjx9PJI7fjuRO347kDx+O48/f0OMSIFNh1KEWIFahVp3XIZecFuGV3BSiEp4SYZHgEmETIRRg1WDWoNhgWeEbXlxhHRyeIN5bHiDdmxygm1vb4JudnCCcXpygnN3doJ7cHuDe2p7g3xofYSAZ4CFe2d4hXNsb4VodmGEVn9OgkmFSIFHh0d/RIlEf0OJRIBBij+AO4o6gDeKNYAyiiz/LP8s/yz/Lf8t/yz/Kv8r/yv/K/8r/yr/Kv8q/yr/Kv8q/yj/KP8q/yn/Kf8p/yb/Jf8l/yX/Jv8m/yb/Jv8m/yb/Jf8l/yb/Jv8m/yb/J/8n/yb/Jv8l/yX/J/8n/yf/J/8m/yb/KP8o/yn/Kf8o/yj/KP8o/yj/J/8o/yj/J/8n/yb/Jv8l/yX/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8m/yb/Jv8m/yb/Jv8n/yf/J/8m/yb/Jv8n/yj/Kf8p/yn/Kf8q/yn/Kf8p/yv/K/8q/yr/Kv8q/yr/Kv8q/yv/Kv8q/yr/K/8r/yr/Kv8q/yn/Kf8q/yr/Kv8q/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yj/KP8p/yn/Kf8q/yn/Kf8p/yn/Kf8p/yn/Kf8q/yr/Kf8p/yr/Kv8q/yr/Kv8q/yr/Kv8q/yr/Kf8p/yn/Kf8p/yj/KP8o/yj/KP8o/yj/KP8o/yj/KP8m/yX/JP8k/yL/Iv8h/yH/IP8g/x//Hv8e/x7/Hv8f/yD/JP8o/yr/Lf8w/zP/N/8//0P/RP9F/0j/Sf9K/0z/Tf9P/03/Tf9M/0r/Qv8y/yf/J/8n/yf/KP8q/yn/Jf8l/yT/U/90/2v/Yf9m/2j/af9p/03/Jv8u/zH/MP8u/y7/Lf8r/y//Pv9N/1f/UP9V/1b/Wf9f/1//Xf9b/1T/SP8+/zf/Q/9R/17/Xv9V/1f/Y/9f/1v/aP90/3P/dP93/3n/ev9x/2b/Zv9r/2n/YP9b/1r/W/9c/1r/Uv9L/0n/SP9K/0r/Sv9L/0r/Sv9G/0T/Qf88/zj/N/81/zb/Nf80/y3/KP8l/yb/J/8o/yn/Kf8p/yn/K/8t/yz/LP8t/y7/Lv8u/y7/Kv8n/yf/Jv8k/yX/KP8q/yv/Lf8v/zL/Nf81/zb/OP85/zj/OP87/zz/PP88/z3/Pf89/zv/Ov86/zv/Pv8+/z7/PP85/zr/Ov86/zr/OP83/zP/Mv8x/zD/MP8u/yz/K/8q/yr/Kv8r/yn/Kf8o/yj/Jv8m/yX/Jf8j/yP/JP8k/yP/I/8l/yb/Kv8s/y7/Mf8x/y//Lv8t/yr/Jf8l/yT/I/8j/yT/JP8l/yX/Jv8m/yb/J/8n/yj/Kv8q/yr/Kv8r/yv/K/8r/yz/LP8s/yz/Lf8t/y7/Lv8u/y3/Lv8u/y7/Lv8u/y7/L/8v/y7/Lf8s/yz/LP8r/yz/LP8s/yz/Lf8t/y3/Lf8t/y7/Lf8t/y3/Lf8t/y3/Lf8u/y//L/8v/y//MP8w/zD/MP8w/zD/Mf8x/zH/MP8w/y//Mf8x/zH/Mf8y/zL/Mv8y/zL/M/8y/zP/Nv8+/0f/Uf9Z/2H/av9w/3X/eP9y/27/aP9j/17/W/9W/1n/Xv9g/2X/a/9t/27/bv9u/2j/Y/9c/1b/U/9O/0j/RP9B/0D/Q/9D/0L/QP89/z3/Ov87/zz/O/86/zr/Ov86/zv/O/87/zv/O/87/zv/O/88/z3/Pf89/z3/Pf89/z3/Pv89/z3/Qv9E/0n/UP9T/1f/WP9a/1z/Wf9X/1T/Tv9K/0v/Sv9K/07/U/9X/1z/ZP9n/2v/cf90/3j/ef94/3b/cv9v/23/cf9y/3L/cv90/3n/fP97/3v/fP+A/4H/g/+B/37/ff93/3H/bP9h/1X/TP9J/0j/Rf9C/0P/Qv8//z3/O/85/zf/Nv8z/zP/K30reCx9LHgsfSx3LH0rdyp9KncqfSp1KX4pdyl+KXcofih3KH4mdyZ+JncmfiZ3Jn4leCV+JXglfiV4JX4leCV/JXYlfyV3JX8leiV/JXslfyV8JX8lfiV/JX0mfyZ+J38nfiZ/Jn4mfid/KH4ofyh/KH8ofyh/KH0ofyd9J38mfiZ+JX4lfiV+I30lfiV9JX8lfiV/JX4lfiV9JX4lfCV+JXwmfiZ8Jn4mfSV+Jn0mfiZ+Jn4mfid+KX4pfih+J34nfyp+KH8pfil/KH4pfyl+KX4pfil+KX4pfip8Kn4qfCp+K30rfip+KX4pfil+KX4pfil+KX4ofih+KH4ofil+KX8pfil9KH4ofil+KX4pfih+KH4ofil+KX4pfil9KX4pfSh+KH0ofih9KX4pfSl9KX0pfSl9KX4pfSl+KXwpfyl7Kn8qeyl/KXspfyl7KX4peSl/KHkogCh5KYApeCiAKHgngCd4KH8odyZ/JHkkfiV6JH4jeiJ/IXshfyF7HH8efB5/HXwefh9/IH4lgid+KoYvfjKJN386i0CARYxHf0aNR39Fj0aASZBLf06RTn9NkUp9RJE3fCyNKnsojCh6KIspeyqKK3okiCN9QYJ7f214X4FedWWAZHpqf19/JX0rhzF7MIwzfDiML3wrjCt+LYs4gUSNTIJPjlKCU45VgFqNW31ei115UYpKeEKJPXdIiFJ0V4pZclGNUnBaj1JxVI9idXKOc3l0i3h5fYh8eHeIdXdziW91aIxgdVyPWXdWkVV5VJBQe0iRSH1Jk0h9R5RHfEWVRnxKlUd6RJVBeT6VOXk3lTZ5NZM0ejOTLngokCd6J48neiiPKHoojyd8KY4qfCuOK3srjyt8LY8vfS+OLn0sjCp9J4slfSKLJHwniih8K4oufDCLNHw2jTd7N402ezaNN3s5jD17PI48ejyOPXo8jzp7OY83ezaPN305jzh9OI83fTeOOn07jDx8PIo7fjeKNn4ziTJ+MIgvfS6ILH0qhip9KoYqfSqGKX0phih9KIYnfiaGJn4mhiN/JIYkfySGJH8khyN/JIQnfyqDLYAugTGBMH0vgi58LIEpfiaAJIEkfySGJX4lhiV+JYgmfiaIJ30niCh9KIgpfSmJKn0qiSt9K4ksfSyJLX0tiS19LYkufC6IL30viC99LIgtfS2ILX0uiC59LogvfS+ILn0tiCx+LIkrfiuJKn4qiCt+K4grfyuILH8tiC1+LYctfiyHLX8thy1/LYcufy6HLn8uhy9/L4gwfzCIMH8wiDF/MYgxfzKJMn8yiTF+MYkzgDOJM4AziTSANIk1gDWKNIAzijSANIo2gDeKPIJEhkyDVH5fhWV1bIZ0anaFc2Nth2hkY4dfblmHVXlUhVh8XoVjeGeEa3NthG1ubYRqamWFXW1Yh1J2ToZIfkWFP4Y8hDqLPIE+jD6AP48+fz6PPX4+jz5+P48/fj+PPH48kD1+PpE/fT+SP30/k0B+QJM/fj+SP34/kT5+Po8+fz2OPH8+jEKBSIlMglCEVINWd1iFWXBahldwVYhQdkyGS35IhUmCToRSglWEWYBfhGR9aIRud3KDdnJ5gXpxeYJ2cHKCcXVxgnF5coJze3OCdnh5gX5xgIKAaoGEgmeDhIVnhIWCZX6FeWhyh2lxX4VRfkeERoVDgj+JPYA9iTuAOYk2gDSJNIAzizOAMIsr/yv/K/8s/yz/K/8q/yr/Kv8q/yr/Kv8p/yn/KP8o/yj/KP8o/yb/Jv8m/yb/Jv8m/yX/JP8k/yT/JP8l/yX/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8l/yb/Jv8n/yf/Jv8m/yX/Jv8o/yj/J/8n/yj/KP8o/yj/J/8n/yb/Jv8l/yX/JP8l/yX/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8l/yb/Jv8m/yb/Jf8l/yb/Jv8m/yb/J/8n/yf/J/8n/yf/Kf8o/yj/KP8n/yj/KP8p/yn/Kf8p/yn/Kf8p/yj/KP8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yj/KP8o/yj/KP8o/yf/J/8n/yf/KP8o/yj/KP8o/yj/Kf8p/yn/Kf8p/yn/KP8o/yj/KP8o/yj/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8q/yr/Kf8p/yn/Kf8p/yn/Kf8o/yj/KP8p/yn/KP8o/yf/J/8n/yf/J/8l/yX/Jf8k/yP/I/8j/yH/If8f/x//Hv8d/x7/H/8g/yX/Kf8s/y//NP86/z3/Qv9H/0n/Sf9I/0b/Rf9H/0r/Tv9P/07/Tv9H/z7/M/8p/yn/Kf8p/yr/Kf8o/yj/Lf9x/3f/af9g/2T/af9q/2L/Nf8l/y7/Mf8x/zL/Mv8t/yr/Kv8s/zX/Qv9M/07/Tv9T/1f/W/9d/1z/Wv9O/0b/PP84/0j/Vv9Z/1v/W/9T/2D/ZP9Z/1v/Yv9t/3D/dP9z/3f/d/93/3X/bv9q/2H/Wv9U/1H/UP9Q/0z/Rv9H/0j/Sf9G/0T/RP9F/0n/Sv9I/0P/Qv8//zv/Of84/zj/Nf8x/yv/KP8o/yj/Kf8p/yn/Kv8p/yf/Kf8q/yv/K/8s/y7/Lv8u/yz/Lf8s/yj/Jf8k/yT/J/8q/y7/Mv82/zj/OP83/zb/Nv84/zr/O/89/zz/PP88/zv/Ov85/zb/Nv80/zb/Nv82/zX/N/83/zv/Of84/zn/N/81/zL/Mf8v/y//Lv8t/yz/LP8s/yz/LP8q/yr/Kf8p/yj/J/8n/yf/Jv8k/yT/JP8k/yT/I/8k/yX/KP8q/y7/MP8x/y//L/8w/y3/Kf8o/yb/Jf8l/yX/Jf8l/yb/Jv8n/yf/KP8o/yn/Kf8p/yr/K/8r/yz/LP8t/y3/Lf8t/y7/Lv8t/y3/Lf8t/y3/Lf8t/y7/Lv8u/y7/Lv8u/y3/LP8s/yv/K/8q/yr/K/8r/yv/K/8s/y3/Lf8t/y7/Lv8u/y7/Lv8u/y7/Lv8u/y7/L/8v/zD/MP8x/zH/Mv8y/zH/Mv8z/zP/M/8z/zP/NP80/zT/Nf81/zf/N/83/zj/N/83/zf/N/84/zv/QP9J/1H/Wf9k/2j/cP90/3T/bf9o/2H/W/9a/1P/Uv9W/13/YP9k/2v/bf9t/2z/af9k/17/WP9V/0//TP9I/0P/P/9A/0D/QP9B/0H/Qf9A/0D/QP9B/0H/Qf9A/0D/P/9A/0H/Qf9B/0H/QP9A/z//P/89/z3/Pv8+/zz/O/87/zz/P/9C/0f/Tf9T/1X/Vv9Y/1n/Wf9W/1L/Tf9M/0r/TP9O/1L/VP9Y/1z/Yf9m/2v/cf9z/3b/d/96/3n/d/90/3L/cf9x/3T/dv94/3j/ff9//4H/gf+B/4P/hf+G/4X/g/9//3f/b/9j/1b/R/9D/0D/PP87/zr/Of82/zT/M/8z/zL/L/8u/yp9KngpfSl4Kn0qeCp9KngpfSl5KH0oeCl+KXgofih4J34ndyd+JncmfiZ3Jn4mdyV+JHgjfiN4JH4keSR+JHkkfyR3JX8leCV/JXolfyV7JX8lfCV/JX4lfyV9JX8lfiZ/Jn4mfyZ+Jn4lfyZ+Jn8ofyZ/J38ofyh/J38mfyZ/J34nfiZ+Jn4lfiV9JX4lfSV/JX4lfyV+JX4lfSV+JXwlfiV8JX4lfCV+JX0kfiR9JX4mfSd+J30nfid9J34nfSd+J38ofih/KH4ofyh+KH8ofih/Kn4ofyh/KH8ofih/KHwofih9KH4pfil+KX4pfih+KH4ofih+KH4ofih+KH4nfid9J34nfCd+J30ofih9KH4ofih+KH4ofih+KH4ofSh+KH0ofih9KH4ofSl+KX0ofyh9KH8ofSh+KH0pfil8Kn8qeyp/Knspfyl4KX8peCl/KXcqfyl3KIApeCmAKXcogCh3J4Andyh/KHYnfyV4Jn4meiV+JHojfyN7In8ieyF/IHwgfx58Hn4ffyJ+JYIofiyHL340ijt/P4xBgEWNSIFJjkeBRo9FgEaQTIBOj0+ATo9Nfk6OR3w3jSd7J4wpeiqLKnspiCh+KIRdgHt8bYBjdWV/aXZwfmh9QH0hhC58Mokwey+MLnwsjCp8KYwrfi2LN4FBjUaCSo5SglKOVH9YjV5+Y4xeek+KRXlBiD14TYdfdWaIZnNqjW5wd49xcF+PWXNTjmB1ZYxkeGuLcnh4inl3dYttd2qMZHZbj1Z3U5JQeU+TSntEk0V8RpNIfUaTRHxElER8SJRIekeURntGlUZ5Q5Y+eTqVOHk1lDJ3K5EpeCmQKXkrkCp5K5AseiyQKHookCd7KY8rfCyPLX0uji19LIwufSyMKn0pjCd7JoomeyiKK3suizV8OYw4fDWMNHw3jDl8OY08fDyOPXs8jjp7Oo85ezePNXs1jzV7NJA1ezWQNXs1jzZ7NY4zezaMNnw2jDJ8MYowfC+JL30viS59LYgsfS+HLn0uhyx9K4crfSyHKn4qhip+KoYnfyWGJH8khiR/I4YkfySGJH8lhCmALIIugTJ/MYIxejKCMXwugSt/KIAlgyN/JYUnfieIJn4miCZ9J4gofSiIKH0oiSl9KokrfSuJK30riSx9LIksfSyJLnwuiC59LogtfS2ILX0tiC59LogufS6ILH0tiC59LogsfSuJK30riSp+KogqfiqIK38riCx/LIgtfi2HL34uhy5/Locufy6HL38vhy5/Locvfy+IMH8wiDJ/MogzfzKIMn8xhzJ/NIczfjOINIA1iDWANYk2gDaJN4A3iDiAOIg4gDiIOIA4iDeAN4k5gD6IRYJNhVWEXXtlhW1uc4VyYm2GaWFihl1qW4VXeFOFVn5chF98Y4RndGuDaWxqhGlqZYZjbVuGWHRUhE99TIJHhUWBRIpCgEONQ35Ej0N9Qo9DfkOPQn5Cj0F9QZBBfUGRQn1CkkJ9QpNAfkCUP349kzx+O5E7fjuPO385jjl/Oow7f0CJRYFLhVCDUnpXhFlzWoVacFiHU3RQhk97TIVPgVGEU4RYhFmBXIRhgGOEaH1sg3F5c4F2eHmCe3N7gnhydYJzdXWBdXl1gXd7eoF8doGAg2+EgYJpgoODZYWDhWODhIFjeoZxaGaIWXVIiEGBPIM5iDiBN4k1gDWJMoAxiTGALoksgCyJKv8q/yn/Kf8o/yj/Kv8q/yn/Kf8o/yj/Kf8p/yj/KP8n/yf/Jv8m/yb/Jv8l/yX/JP8k/yP/I/8j/yT/JP8k/yT/JP8l/yX/Jf8l/yX/Jf8m/yb/Jf8l/yX/Jf8l/yX/Jv8m/yb/Jv8m/yX/J/8n/yj/Jv8n/yf/J/8n/yb/Jv8n/yf/Jv8m/yX/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8l/yT/JP8l/yb/J/8n/yf/J/8n/yf/J/8n/yj/KP8o/yj/KP8o/yj/KP8o/yf/J/8n/yf/J/8n/yf/J/8n/yj/KP8o/yj/J/8n/yf/J/8n/yf/J/8n/yb/Jv8m/yb/Jv8m/yf/J/8n/yf/KP8o/yj/KP8o/yj/J/8n/yj/KP8o/yj/J/8n/yj/KP8o/yj/KP8o/yn/Kf8q/yr/Kv8q/yn/Kf8p/yn/Kf8p/yn/KP8o/yn/Kf8p/yj/KP8n/yf/KP8o/yf/Jf8m/yb/Jv8l/yT/I/8i/yL/If8g/yD/Hv8e/x//JP8m/yj/LP8u/zP/N/87/zz/P/9B/0T/Qf9A/0H/Rf9L/0z/Tf9N/0z/SP9D/zT/KP8o/yf/Kf8p/yr/Jf9V/3f/b/9s/2j/bv9y/3D/V/8m/yv/L/8z/y//Lv8u/yz/K/8q/yr/K/84/0D/S/9P/1L/Uv9V/1b/Vv9Z/17/Uf9D/0P/T/9e/2f/a/9q/2f/bf9q/1b/Wf9h/17/Wv9X/1f/Y/9v/3L/dP9w/2z/bv9p/1//Wf9W/1L/Tv9I/0P/QP9D/0X/R/9G/0X/Rv9H/0X/Rv9I/0n/Sf9G/0T/P/87/zn/NP8u/yr/Kv8t/yr/Kv8u/zH/Mf8u/yv/KP8n/yn/K/8s/yz/LP8s/y3/K/8s/yv/LP8p/yn/KP8p/y3/Mf82/zT/M/80/zX/Nv84/zj/O/86/zn/OP84/zf/Nv80/zL/Mv8y/zP/M/8z/zP/M/8y/zL/Mv8y/zL/Mf8w/y//L/8t/y3/Lf8t/y3/Lv8u/y7/Lv8s/y3/Lf8q/yr/Kv8q/yj/Jv8l/yX/Jf8k/yT/JP8k/yX/KP8q/y7/Mf8w/zD/Mv8x/zD/Lv8r/yj/Jv8l/yb/Jv8m/yb/Jv8n/yj/KP8o/yj/Kf8q/yv/K/8r/yv/LP8s/yz/LP8u/y7/Lv8u/y7/Lv8t/y3/L/8v/y7/Lv8s/y3/Lf8t/yv/K/8r/yv/Kv8q/yr/Kv8r/yv/LP8s/y3/Lf8v/y7/Lv8u/y//L/8v/y//L/8v/zD/MP8x/zH/Mv8z/zT/M/8y/zP/M/8z/zP/NP80/zX/Nf82/zb/Nv83/zf/OP85/zn/Of84/zj/OP85/zn/OP87/0H/Sf9R/1v/Yv9u/3L/c/9v/2z/Zf9g/1v/W/9Z/1j/Wf9f/2P/Z/9p/2v/av9q/2j/Zf9e/1v/WP9T/1D/Sv9H/0X/RP9F/0b/Rf9D/0P/Q/9C/0L/Qf9B/0H/Qf9C/0L/Qv9C/0H/QP8//z3/PP87/zr/Ov85/zn/Of85/zr/Pv9F/0j/Tv9S/1X/V/9b/1r/Wf9W/1P/Uf9R/1L/VP9W/1j/W/9d/2D/Yv9i/2j/bf9w/3P/d/94/3z/fP96/3j/df9z/3b/eP98/3z/fv+C/4X/hP+C/4D/gv+C/3//fv95/3L/af9b/0r/Pv84/zf/Nf80/zL/Mv8w/y//Lv8t/yv/LP8qfSp6KX0peih9KHopfSl6KX0peSh9KHgpfih4J34neCd+JngmfiZ4JX4ldyR+JHckfiR4JH4keCR/JHklfyV5JH8keiR/JHklfiV5JX4leyV+JXslfiV8Jn4mfiZ+Jn4lfiV9J34nfyd+J38nfid/J38mfyd/J38mfyaAJn8mgCd/J34mfyV+JX8lfSZ/JX0lfiV9JX4lfSR+JH0kfiR9JH8kfSV/JX0lfiV9JX0lfSV+JnwmfiZ8J34mfSd+J34ofih/J34nfyd+JYAnfiiAJ30mfyZ9Jn8mfiZ/Jn4mfyd+J38mfih/J34nfyd+J38nfid+Jn4mfiZ+JX4lfiV+JX4lfSV+Jn0mfiZ9Jn4mfSV+JX0mfiZ9J34nfSd+J30nfid/J34nfyd+J38nfid/J38ofSh/KHwofyh8KX8ofCh/KHsqfyp6KYApeiiAKHkpgCl4KYAoeCiAKXcpgCl1KYEneCiBKHgogCh3KIAodyd/J3gnfyZ5JH8jeCN/I3ohfiB7Hn4efB9+IH8kfiWEKn4siC1+MYs0fzaMN4A6jTyBPY47gT6OQIFCkEmBSpBMgEqQSn9GkD58Mo4qeyeNKHspiyh+JYZTgHl8b4Jjd2GDZ3hzgm98XX8kgSd8L4gvey6MLXstjSt7K44qfCqOKn0sjC+AQoxLgU2OUoJTjlOAUY5QflWNW31ai0x5RIpOd2KJa3dviW9zZYtyb2qPX29bkGhxZZBhc2GQTXVXjmd3bIxveG2La3ZqjGd3Y5BeeF2SWHhOk0d5QpQ/eUCTQXxDk0V8RpNEe0SURXxIlEl8SZVIekaVRHlClUB5PZU3eC+TLHcskC93L5EweDOSNnk4kjJ5LpEqeSeQKHoojyl7KY4reyyOK30sji19LY4uey6MK3sriy16LYswfDCLMHswijF7MYsyezONNns2jTd6No01ejSPNHoxjzF6MY8wejGOMnoyjjJ5Mo4xeTCMMHouiy96L4ovey+JL3sviS57LogtfC2ILnwuiC98L4gxfTGGL30uhix+KoUpfimGKn4phyh+J4cmfiaHI38lhyR+JIYlfymELYIxgDODMn0zgjN7M4IwfC+BLH8pgCaCJX4lhCV9JocnfSeHJ30oiSh9KIkqfSqJK30riSx9LIksfSyJLH0tiC59LogufS6ILn0viC59LogvfS+JL30viS58LoktfCuJKn0qiit9K4oqfimJKX4riSt+K4crfiuHK4Ashi6AL4YvfzCGMX8xhjGAMYYygDKGMoAyhjKAMoYygDOGM4AzhjOAM4c0gDSHNIA1hzWANoc2fzaINn82iDZ/Nog4fziIN383iTl/OYk4fziKOH83ijd/N4o/gUaHT4Rae2OEaWpxhXVec4duXGqGZWZghV51W4dZfFiGXHtghmV1Z4Zob2uGbG9phWRuYIVcc1eFVX1QgkuFSIBIikd/RoxFf0WPQ31DkEJ9QZA/fj+QQH5Ak0J9QpVBfUGUQXxAlT99PZI8fTuQOn45jjh/N404fziMOX88ikCARIZKg09/VIRXd1mFW3JbhVlyVoZUeVaGVn5YhFmEW4Ncg12DX4Jkg2SAZ4NogGyEcIFygnR8eIJ8eHyBe3R4gXV2doF4eHqAfXd/gIJyhIGFaoGCgGZ/hH9lfoR8YnmGcmVpiVptSYg7fTWGNYYzgzGIL4AuiS2ALIcrfyuIK38riCn/Kf8p/yn/KP8o/yn/Kf8p/yn/KP8o/yn/KP8n/yf/J/8m/yb/Jv8l/yX/JP8k/yT/JP8k/yT/JP8k/yX/Jf8k/yT/JP8k/yX/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jv8m/yX/Jf8n/yf/J/8n/yf/J/8n/yb/J/8n/yb/Jv8m/yb/J/8n/yb/Jf8l/yX/Jv8l/yX/Jf8l/yX/JP8k/yT/JP8k/yT/Jf8l/yX/Jf8l/yX/Jf8m/yb/Jv8n/yb/J/8n/yj/KP8n/yf/J/8l/yX/Jf8l/yX/Jv8m/yb/Jv8m/yb/Jv8m/yb/J/8n/yf/J/8n/yX/Jf8m/yb/Jf8k/yT/JP8k/yX/Jf8l/yX/Jf8l/yX/Jv8m/yX/Jf8m/yb/Jv8m/yf/J/8m/yb/Jv8m/yb/Jv8n/yf/J/8n/yj/KP8m/yf/KP8o/yr/Kv8p/yn/KP8o/yn/Kf8p/yn/Kf8p/yn/Kf8p/yf/KP8o/yj/KP8o/yj/J/8n/yf/Jv8j/yT/I/8j/yH/IP8g/x//H/8g/yL/Jf8o/yv/Lf8w/zL/M/8z/zT/N/86/zv/Pv9C/0T/Rv9J/0v/S/9K/0b/Qv82/yr/J/8p/yn/Jv9H/3z/b/9g/1//Zv9x/3H/Zf83/yD/LP8w/y7/Lf8t/y3/K/8r/yr/Kv8q/y3/Pf9H/0T/R/9R/1T/V/9S/0//Uf9Z/1n/Uv9K/1P/Yv9q/3H/Xv9v/3b/Yv9l/2//aP9h/2D/Yv9S/1D/XP9k/2j/av9o/2T/X/9g/2L/Xv9Z/1H/R/9C/0D/P/9A/0L/Q/9D/0T/RP9F/0b/Rv9G/0b/Rf9E/0L/QP89/zf/L/8t/y//Mf8z/zT/Mv81/zT/Mv8w/yv/Kf8o/yj/KP8o/yr/Kv8q/yz/L/8x/zL/Mv8w/zD/Lv8u/y3/Lf8v/y//Lv8u/y//MP8y/zL/NP8x/zH/Mf8x/zD/Mf8x/zD/Mf8y/zL/Mv8y/zH/MP8w/y//L/8v/y//L/8v/y//Lv8u/y7/Lf8u/y7/L/8v/zH/Mf8v/y7/Lv8s/yz/LP8q/yn/KP8n/yb/Jv8k/yX/JP8k/yT/J/8r/y3/Mv81/zX/Nf80/zH/MP8t/yv/KP8m/yX/Jf8m/yf/J/8n/yf/KP8o/yr/Kv8r/yv/LP8s/yz/LP8t/y7/Lv8u/y7/Lv8u/y//MP8w/zH/Mf8w/zD/MP8w/y//Lf8r/yv/K/8r/yv/Kv8q/yv/LP8s/yz/LP8r/yz/Lv8v/y//MP8x/zH/Mf8x/zL/Mv8y/zL/Mv8y/zL/Mv8y/zL/Mv8y/zP/NP8z/zT/Nf82/zb/Nv81/zX/Nf81/zf/OP83/zf/Of85/zj/OP84/zf/Nv82/zb/PP9D/07/WP9h/2n/cf90/3b/dP9x/2r/Z/9i/2D/Xf9b/1r/Xf9k/2f/a/9q/2j/aP9m/2P/Xv9Z/1b/VP9Q/0v/SP9H/0b/Rf9E/0P/Qv9B/0H/Qf9C/0L/Qv9C/0L/Qv9B/0D/P/89/zz/O/86/zn/N/83/zj/OP85/zz/Qf9F/0r/T/9R/1X/V/9a/1v/W/9b/1n/W/9b/1r/W/9c/1//Yf9j/2P/Zf9m/2b/aP9r/27/cf90/3j/e/98/3r/d/94/3j/e/9//4D/gv+D/4T/gv9//3z/e/97/3n/df9x/2f/Xv9N/z3/Mv8w/zD/Lv8t/yz/LP8r/yv/K/8r/yv/KH0oeih9KHoofSh6KX0peil9KXkofSd4J34neCd+J3gnfiZ4Jn4leCV+JXgkfiR4JH4keSR+JHkjfyN6JX8leiV/JXokfyV5Jn4leiV+JXsmfiZ7JX4lfCR+JH4lfiV+JX4lfSZ+Jn8nfid/J34nfyd/JX8ofyh/J38nfyZ/Jn8nfyeAJ38ngCZ/Jn4lfyV+JX4lfSV+JX0kfiR9JX4lfSR/JH0kfyR9JH4kfSV9JX0mfiZ9Jn4mfSZ+Jn0nfiZ+J34nfyZ+Jn8nfid/JX4lfyV9JX8lfSV/Jn4mfyZ+Jn8mfiZ/Jn4mfyZ+Jn4mfiZ+JX4mfiV+JX4lfiV+JH4kfiR+JH0kfiR9JH4kfSR+JH0kfiR9JH4kfSV+JX0lfiV9Jn4mfiZ+JX4mfiZ+Jn4mfiZ/Jnwnfyd9J38nfCd/J3wnfyh6KX8peSmAKXkpgCl5KoAqeCqAKXgogCh3KYApdSiBJ3YngSd2KIAodieAJnYmfyZ2KH8ndyR/JXgjfyJ6In4ieiB+IHsgfyB+IH4jgyd+KYgufi+LMX4yjDJ/M403gDqOPYBAjkKAQ45GgEiOSoBNjUx/R41BfDSNKXsoiyp8J4U2f3V+doNrdWuCanZwgHF6aoA4gBx/JYUtey6KLXstjC17LY0rfCuMKX0pjCp+MIxGgEOMQoJJi1GDU4xRglCNT4BTjVJ+TY1YelmLW3lgimt4XYpLdG6Mb3B2jm5vaZBncGSRXm9ZkVlxVpBSc1mOYXVijWV2YI1ceV2PW3pbklx6U5NLeUaUQXk/kz57P5NAe0OTRntGk0V8RJNDfEWURXpDlEJ6QZRAejyUN3gyki53MJE0dziSN3gyky15MZIyeTGRLXkskCp6KY8peyiOKXsojil8LI8vfDKPNXw1jzR8NI4yfC6MLnssjC57Lowtey2ML3svjS97Lo0vei+NL3ovjy96L48veTCPMHkxjjN5M40zejOMMnoxijF6MYouei6KL3sviTB7MIgwezCILnwuiC18LYcwfDCHMH0whjB9L4YufS2FLH0ship+KYcofieHJn4khyV+JYckfiSHJH8khiiAK4MugjKANII1fzWDMn4xgjF/LoErgCmAJ4MlfiWFJ30nhyh9KIkofSmJK30riSt9K4ktfS2JLX0tiS59LogufS6ILn0uiC59LogwfTCIMX0xiDF9MYgyfjCJMH4viSx+LIgtfi2ILX4tiCx+LIgtfi2HLH4shyx+LIYufi6GL38vhjF/MYYxgDGGMYAxhjGAMYcygDKHMYAxhzGAMYcwgDGHMoAyhzOANIc0gDSHNX81iDR/NIg0fzSINX82iDZ/Nok4fziJOH84ijh/OIo4fjiKNn81ijmBQodMglZ+X4NqbnOFeF98hHpcd4VyXmuGZ2djhmBxWodYe12GYXxkhmd2aIVocGqFaG5khWBzXIRZfVaDUYRMgUmLR39GjUV9RJBDfUCSP30/lEJ9RJZDfESXRXxDl0J8QZZAfT+TO307kTt+Oo84fzmNOn86jDp/PIo/gEOGSIFOg1ODV3tahVx1XoRecl+GX3Vfhl97XoZegF+FYoJkhGaCZoRmgWaEY4NigWWHaH9rhm+BcoJ2gXp6fIF8d3qBend7gH14gYCDeIJ/gnKBgX5re4J5anaEdGdzhm5laYdealGKQXcyhy6BLoQthyuBLIgsgC2GK38rhyp/Koco/yj/KP8o/yj/KP8p/yn/Kf8p/yj/J/8n/yf/Jv8m/yf/J/8m/yX/Jf8l/yT/JP8k/yT/JP8k/yP/I/8l/yX/Jf8l/yX/Jv8m/yX/Jf8l/yb/Jv8m/yb/J/8n/yX/Jf8l/yX/Jv8m/yf/J/8n/yf/Jv8n/yj/KP8n/yf/Jv8m/yb/Jv8n/yf/Jv8m/yX/Jf8l/yX/Jf8l/yT/JP8l/yX/JP8k/yT/JP8k/yT/Jf8l/yb/Jv8m/yb/Jv8m/yf/Jv8n/yf/Jv8m/yb/Jv8l/yX/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8m/yT/JP8k/yT/JP8j/yP/I/8j/yP/I/8j/yP/I/8j/yP/I/8j/yP/JP8k/yP/I/8k/yT/JP8k/yX/Jf8l/yX/Jv8m/yb/Jv8m/yf/Jv8n/yf/KP8p/yn/Kf8p/yn/Kf8p/yn/Kf8o/yj/KP8o/yj/KP8n/yn/Kf8o/yj/J/8m/yb/Jv8n/yb/J/8l/yT/I/8j/yL/Iv8g/yD/IP8i/yL/J/8p/yz/Lv8w/zH/M/81/zj/PP9C/0P/RP9E/0b/Sv9M/0//TP9H/0H/Mv8o/yj/LP8s/2z/fP9r/2v/cf9y/27/bP9B/xr/I/8q/y3/Lf8t/y3/Lf8t/yv/K/8q/yn/Kf8t/y//Of9G/0z/Uf9Q/1D/UP9Q/0v/TP9Q/1f/Xv9g/1v/Yv9e/1f/X/9l/3D/cv9v/2n/af9l/2P/Xf9b/1j/Xf9g/2H/Yf9d/1z/Wv9V/1j/WP9T/0//TP9F/z//PP89/z7/P/9D/0P/Qv9B/0H/Rf9G/0L/QP8//0H/Qv9B/zn/MP8u/zH/Nf81/zD/Lf8v/zL/Mf8x/y//Lv8s/yn/Kf8p/yv/K/8v/y3/MP8z/zX/OP84/zP/MP8u/yz/LP8s/y3/Lf8u/y7/Lv8t/y7/Lf8t/y7/Lv8t/zD/L/8w/zH/M/8z/zP/M/8z/zP/Mv8y/zD/MP8w/zD/Mf8x/zH/Mf8u/y7/L/8w/zD/MP8w/zD/MP8v/y7/LP8r/yv/Kv8p/yj/J/8n/yb/Jf8l/yT/JP8k/yT/Jf8p/yz/MP8y/zT/NP8y/zL/Mf8v/y3/LP8o/yf/Jf8l/yX/KP8o/yj/Kf8r/yv/K/8r/y3/Lf8t/y3/Lf8t/y7/Lv8u/y7/Lv8u/zD/MP8w/zD/MP8w/zD/MP8x/zD/Mf8x/y//Lf8t/y3/Lv8u/y3/Lf8s/yz/Lf8t/y3/Lf8u/y//MP8w/zD/MP8w/zD/Mf8x/zH/Mf8w/zD/Mf8x/zD/Mf8y/zL/Mv8z/zT/NP80/zT/Nf81/zT/NP80/zT/Nv82/zf/N/83/zf/N/83/zf/N/80/zT/NP84/0D/TP9X/2H/av91/3z/fv99/3r/dv9w/2n/Zf9f/1n/V/9b/13/Y/9m/2b/af9q/2n/Zv9i/1z/Wv9W/1H/TP9J/0f/R/9G/0X/Qv9C/0T/Rv9H/0b/R/9H/0X/Q/9C/0D/QP8//z3/PP87/zn/Ov86/zr/O/89/0H/RP9I/07/U/9X/1r/XP9f/1//YP9g/2H/Yf9g/2D/Yf9j/2X/Z/9n/2f/Zv9j/2D/YP9i/2T/av9v/3P/eP99/3z/fP96/3r/e/9+/4D/gf+A/4D/ff94/3b/dP9y/3H/bf9o/1//Vv9G/zb/Lf8t/y3/K/8r/yv/LP8s/yz/K/8r/yd+J3sofih7KH4oeSh+KHkpfil4KH4neCZ+JngmfiZ4Jn4neSZ+JXklfiV5JH4keSR+JHkjfiN5JH8keiV/JXomfiZ6Jn4mfCZ/JnwmfyZ8J34nfSZ9Jn0mfiZ9Jn4mfSZ+Jn0mfiZ/J34nfyV+JX8lfyZ/KH8ofyd/J4EofyiBJ34nfyd+J38nfyZ+Jn8mfiR+Jn0mfiZ9JX8lfSV/JX0lfyV9JX8lfSV+JX4lfiV+Jn4mfSd+J30mfiZ/Jn4mfyV+JX8mfiZ/JX0lfyZ9Jn8kfiSAJX4lfiV+JX8kfiR/JX4lfyV+JX4lfiSAJH4kgCR+I34jfiN+I34jfiJ+In4ifiJ/In4ifyF+In8ifiJ/In4ifiJ+In0jfiN9I34jfSR+JHwjfiN8JH4lfCV+JXwlfyV8JX8mfCZ/JnwmfyZ7J38oeih/KHkngCd3KYApeCl/KXgpfyl3KYApdSmAKXUogCh2KYApdimAKXUngCd1JoAodiiAJnYmfid4JX4leSR+InkifiB7IH8hfiN+I4InfimHKn0rii59MIwzfzmNPH9AjUKARoxKgE2MToBOjE+AT4lKfkaKQXwxjCh9KYgqf1uCf4N3eGyDbXV2gHN5b39QfyB+IIMjfCyHLHssiix8LIwsfCyNLH0sjCp8KowrfjGLNYA6ikCCSItPhFKMT4NOjUuDSI5Lf0uOVX5hjGR7WItReFqMZXVpjGdyYY1jcWuQaHBbklhvZJNhbl+TX29fkVxxX5Bfc1yPWnZZkFN3UZFPelKSUnlOk0h6QpRAeT6TPHo7kzt9PZM8fTyTPX0/kz19PZI9ez2TP3tEk0t6QZExeSqQKnkujzB5LpAveS+SM3kzkjJ6MJExei+QLHkqkC16MJAxfDGPMHwykDF8NJE4fDiRM3wvjyt8Ko8peimNLHorjSx7LI0seiyNLHktjS55Lo0uei6OL3kvjS94MI0yeDGMMnozizJ6M4s0ejSJM3oziDJ6MooxejGJMHwwhy98L4cufC6HMHwwhjF8MYQwfC+ELnwshSx8K4UrfSqGKH0nhyd+JoYmfiWGJH4lhyN+JIYjfyaGJ4ArhCuBL4IwgjGAMYIxgC+BL4AtgCuCKX8ngid+J4YofSiIKH0piSl9KokrfSuIK30siCx8LIgrfCuIK3wsiC58LogufC2IMHwwiDB9MIgvfS+IMH0xiDB9MIgxfTGIMH0wiC5+Loctfi2HLn4uhy1+LYYsfyyHLX8thy1/LYcsfy6HLn8uhy5/L4cwfzCHL38vhy+AL4gwgDCIMIAwiDGAMYgyfjKIMn4yiDN/M4g0fzSIM38ziTN/M4k0fzaJNn82ijZ/Noo3fzeKN342iTV+NIo0fzSMN4FAikyBV31jg2xodoR8XoGDf1l8hXZacoZpY2WHXHVVh1N9WIdcemGFZXVphWlxaoVpbmaFYnRfhVt9VoNShk2ASY1JfkiQR31Hk0Z7R5RIekqXSntKmEp7R5dFfESWQ3xDlEB8PpI9fjyPO347jz1+PY0/fj+LQX9FiEiBTYRSglZ9WoJedmCEYXJjhWNyYoVidWGFYntlhWSBZYVmgWaFZoJmg2OEYIJdh1uAXIxkfmqKbn5zgHWBeXh7gnt2eoF6eHuBfnZ+gIFzfoF5b3eCdW1yg29pboNsZWmFY2ZZiE1xPYgueyqFKoUqgiuGK4ErhyyBK4YpgSmGKP8o/yj/KP8o/yj/KP8o/yn/Kf8o/yf/J/8n/yb/Jv8m/yb/Jv8l/yX/Jf8k/yT/JP8k/yP/I/8k/yT/Jf8l/yb/Jv8m/yb/Jv8m/yb/Jv8n/yf/Jv8m/yb/Jv8m/yb/Jv8m/yb/Jv8m/yb/Jf8l/yX/Jv8n/yf/J/8n/yj/KP8n/yf/J/8n/yb/Jf8m/yb/Jv8l/yb/Jv8l/yX/Jf8l/yX/Jf8l/yX/Jf8l/yX/Jf8m/yb/J/8n/yb/Jv8m/yb/Jv8m/yb/Jv8l/yX/Jf8l/yP/I/8j/yX/Jf8l/yT/JP8k/yT/JP8k/yT/I/8j/yP/I/8i/yP/I/8i/yL/Iv8h/yH/If8i/yL/Iv8h/yH/If8h/yH/If8h/yL/Iv8h/yH/Iv8i/yL/Iv8j/yT/JP8k/yX/Jf8l/yX/Jf8m/yb/Jv8o/yf/J/8n/yf/J/8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yr/Kv8q/yr/J/8n/yf/J/8m/yT/JP8j/yH/If8h/yH/Iv8k/yf/Kf8q/yv/Lf8v/zH/Nv8+/0L/Rv9J/03/UP9S/1L/VP9S/0r/Rv8//y7/KP8p/zn/ev9y/2n/bv93/3f/cf9U/yH/IP8i/yb/LP8s/yv/K/8s/yv/K/8s/yz/Kv8q/yr/L/8w/zX/Pv9G/0n/TP9M/0n/Sv9M/03/TP9Y/2L/Y/9Z/0X/SP9T/1T/X/9m/2z/ZP9k/2H/X/9g/2L/af9r/2X/Xv9e/1//Xv9d/1r/Uv9Q/1H/U/9S/0z/Rf9C/0H/Pv88/zj/N/83/zj/OP85/zj/Of85/zn/Of87/0L/UP9J/zH/Kv8p/yz/Lf8w/zL/Mv80/zL/Mf8v/zD/L/8v/zD/Mv8z/zT/NP81/zL/Mv8y/zP/M/8w/y3/Kv8p/yr/Kv8p/yv/K/8r/y3/Lf8t/y3/Lv8v/y//L/8v/zD/L/8w/zH/MP8w/zD/Mv8z/zT/NP8z/zP/M/8z/zL/Mv8x/zH/MP8w/y7/Lv8v/y//MP8w/y//Lv8v/y3/Lf8s/yv/Kv8p/yj/Kf8o/yb/Jv8l/yX/JP8j/yT/JP8k/yf/KP8q/y3/Lv8v/zD/Mf8w/zD/L/8u/yz/Kf8n/yj/KP8p/yj/KP8p/yr/Kv8p/yv/LP8s/y7/Lv8u/y7/L/8v/y7/Lf8v/y//L/8v/y7/Lv8s/y3/L/8v/y//L/8u/y7/Lv8u/y3/Lv8u/y7/Lf8t/yz/LP8s/yz/LP8s/yz/Lf8u/y7/Lf8u/y//L/8v/y//L/8v/zD/MP8w/zD/MP8w/zH/Mf8w/zD/MP8w/zL/M/8y/zL/Mv8y/zL/M/8z/zP/M/8z/zT/Nf81/zT/NP80/zT/NP82/zn/QP9M/1n/Y/9w/3b/e/97/33/ff93/3H/aP9f/1b/UP9R/1f/XP9h/2X/aP9q/2r/bP9n/2T/Yf9c/1b/Uv9N/0z/S/9K/0r/Sv9L/0z/TP9N/03/TP9J/0f/Rv9E/0P/QP8//z3/PP88/zz/Pf89/z//P/9D/0f/SP9N/1L/Vv9Z/13/X/9f/2P/ZP9k/2X/Yv9k/2T/Zf9l/2b/Zv9m/2b/Y/9d/13/Wv9Y/1v/Yf9m/2z/cP9z/3n/ev97/3v/ef96/37/fv99/3j/dv9y/3D/bf9u/2z/av9l/17/VP9D/zH/K/8p/yr/Kf8q/yr/K/8q/yj/KP8nfid7J34oeyl+KXkofid5KX4peCh+J3gnfid4J34neCZ+JnklfiV5JX4leiV+JXolfiV7JH4keyR/JHolfyV6Jn0meyZ+JnwmfyZ9J38nfSd+J30nfSd9Jn4mfSZ+Jn0mfiZ9JX4lfyd+J38mfiZ/J38nfyd/J38nfyeAJ38ngCZ/Jn8mfyZ/J38nfyV/JX8mfyV/JX8lfyR/JH8lfyZ/JX8lfyZ/Jn8lfiV/JX4lfyV+Jn0mfiZ9JX4lfyd+J38mfiZ/JX4lfyV+JX8kfiR/JH4kgCJ+I34jfiN/JH4kfyR+JH8jfiN+In4ifiJ+In4ifiJ+IX4hfiF+IX4hfiB+IX4hfyF+IX8hfiF/IH4hfyB+IX4hfiF9IX4hfR5+H30jfiN8In4ifCF+InwjfiN8JH8kfCR/JXwlfyV7JX8leiZ/J3omfyZ5KIAodyiAKHgofyh3KX8pdimAKXUpgCl1KYApdimAKXYpgCl1KoAqdSqAKnYogCh3KIAodyaAJXgkfyR4In4ieiF/IX0hfySBKH4phip9K4krfS6LL381jD2AQYtFgkqJU4JViFSCVIhWgFGJSn5Fijt9KowpfyiIVIJ1fnGDbXZzgnl4dH9lfSp+IIQifCGHJXsqiCx7LIoqfCqLKnwrjCx9LowsfCuMK34rjCqAM4s9gUKNSIJLjkeCSI5IgkaORIBGjlB+X41Te0aMS3ZTjFF0VI5icmePZW9pkGpuZpBeb1+QXG5ikmpuZJFacFiQW3JckFxzWpBTdlCRVHlWklN6UZJMfEOTQno/kzt4OpM3eTWTNHk0kzV7NJI1ezaROHs4kjp7QZJFekCPOHosjil6K44seS6QM3kzkjR5NJIyeTKRMXk0kDV5NpA2ejWQNnw3jzZ8M5AxfDCRL3wvkSx8K5EqfCmRKHwojyh8KI8peyuOLXotji15LY4ueTCOL3kwjjF4MY0veS+ML3kvizB5MIsweTGKM3oziTF6MocyfDOGM3wzhjN8MYcxfDCHL3wshy18L4YufC6EL3wthC58LIUtfCyFK3srhCt8KoYpfCmGKHwmhiR9JIckfiSGJH4jhiR+JIUkgCeFKIErhCyBLIMvgTCCMoIygjGAL4ItgCuEKn4phyl9KYgqfSqIKn0qiCp9KogrfCyILnwuiDB8MIgvfDCIL3wthy58L4cvfS+HL30vhy59LogufS6IL30viC99L4gufi6HLn4uhy5+LoctfiyGLH8shyt/K4crfyuHLH8shy1/LYcufy6HLn8uhy9/L4cvfi+IL34viDB+MIgvfi+IL34viC9+L4gvfy+IMH8wiDF/MokyfzKJMX8xiTF/MYoxfzGKMn8zijN+M4k0fjSKM340izV+N4w4f0GKToFZe2WCbmh3gnpce4N8V3mFdVhvh2VjWIdQdFCHUX1UhVp+YoVmeWeFanRrhWpvZ4VkcmKEXX1YglKGUIBPjU1+T5FNfE6VT3tPmE57TpdMe0mXSHxGlkV8RJRAfECSP34+jz1+PI4+fj6MPn4+iUF/RYlJgE6DUYJVf1uCXXldg2FzY4VlbWaFZm9mhWd2ZoVme2eFZ31mhWZ/ZINigF+CW4ZVgFKMUX1Wjl58ZItofmuEcoB2fHqBfHd6gXt2fIB6dXqBeHF1gnFucoNsa2yDa2dphWZmX4hYaUqIOnMshil+K4MqhCmBKYQpgimEKIIohCf/J/8n/yj/Kf8p/yj/J/8p/yn/KP8n/yf/J/8n/yf/Jv8m/yX/Jf8l/yX/Jf8l/yT/I/8k/yT/JP8l/yX/Jf8m/yb/Jv8m/yb/Jv8m/yb/Jv8m/yf/J/8m/yb/Jv8m/yb/Jv8l/yX/J/8n/yb/Jv8n/yf/J/8n/yf/J/8n/yf/Jv8m/yb/Jv8m/yb/Jv8m/yb/Jf8l/yX/Jf8l/yX/Jv8l/yX/Jv8m/yX/Jf8l/yX/Jf8m/yb/Jv8l/yX/Jf8l/yb/Jv8l/yX/Jf8l/yT/JP8k/yT/I/8i/yL/Iv8j/yP/I/8j/yL/Iv8h/yH/If8h/yH/If8g/yD/IP8g/yD/H/8g/yD/IP8g/yD/If8h/yH/IP8h/yH/If8g/yD/H/8h/yT/JP8h/yH/If8i/yP/I/8k/yX/JP8k/yX/Jf8m/yb/Jv8n/yn/Kf8o/yj/KP8o/yj/KP8p/yn/Kf8p/yn/Kf8p/yn/Kv8q/yr/Kv8q/yr/Kv8q/yj/KP8o/yj/J/8l/yT/JP8j/yP/Iv8i/yP/Jv8o/yn/Kf8q/yv/Lv8u/zT/OP8+/0j/S/9S/1b/Vf9V/1L/S/9I/0T/Of8p/yj/LP9r/3P/av9x/3j/c/9p/zf/Hf8k/yL/I/8n/yr/K/8r/yr/Kv8p/yv/LP8u/y//LP8q/yz/K/81/0H/R/9H/0n/Sf9G/0D/P/87/z3/Rv9S/0r/P/9J/1L/Wf9r/2j/Zv9o/2j/Y/9l/2f/XP9Q/13/Z/9h/1j/VP9X/1j/Wv9a/1b/Uf9V/1P/Tf9N/0r/Q/9D/0D/Pf89/zr/N/81/zX/Nf8z/zT/Nv84/zj/PP8+/z7/Pv88/zD/Kf8p/yv/Lf8w/zH/NP80/zT/M/80/zb/OP84/zj/N/81/zT/M/8x/y//Lf8t/y3/LP8r/yr/Kf8o/yj/KP8o/yj/Kf8q/yz/Lv8u/y//MP8v/zD/Mf8x/y//L/8v/y//L/8v/y//MP8x/zH/Mf8z/zL/M/80/zT/NP81/zP/Mv8w/y//LP8r/y7/Lv8v/y3/Lf8t/y3/LP8r/yv/Kv8q/yv/K/8o/yf/J/8l/yT/Jv8k/yT/JP8k/yP/Jv8m/yj/Kv8r/y7/Mf8z/zP/Mv8y/zD/L/8v/yz/Kv8q/yv/K/8r/yv/LP8s/yz/Lv8w/zD/MP8w/y//MP8x/zH/MP8u/y//L/8v/y//Lv8u/y7/Lv8v/y//L/8v/y7/Lv8u/y7/L/8v/y3/LP8s/yz/Lf8t/y3/Lf8u/y7/Lf8t/y7/Lv8u/y7/L/8v/zH/Mf8x/zH/MP8w/y//L/8v/y//L/8v/y//L/8v/y//MP8w/zL/Mv8x/zH/Mv8y/zL/Mv8y/zP/M/8z/zT/NP81/zT/Nf83/zb/Ov9D/07/Wf9j/2r/c/95/3n/ef91/3L/av9f/1b/T/9T/1L/V/9c/2L/Z/9t/2v/bP9r/2n/Zf9i/1z/WP9X/1L/Uf9Q/1D/T/9Q/1D/Tv9O/0r/SP9H/0X/RP9E/0L/QP9A/z//P/89/z//P/9B/0H/Q/9F/0f/Tv9R/1X/W/9d/17/Yv9k/2f/af9o/2f/aP9n/2f/Z/9n/2b/Zf9k/2H/Xf9Y/1L/T/9O/0//Uv9Z/2H/Z/9s/3D/dP94/3v/ev95/3r/ev94/3j/d/9z/23/bf9s/2n/Z/9k/1z/U/9D/zT/Lf8q/yn/KP8o/yf/J/8o/yj/ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3Rlc3QvZGF0YS9iZWFyLTEyODB4NzIwLXplcm8tc3Rzei1lbnRyeS5tcDQgYi9zcmMvbWVkaWEvdGVzdC9kYXRhL2JlYXItMTI4MHg3MjAtemVyby1zdHN6LWVudHJ5Lm1wNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQzODY1OS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvdGVzdC9kYXRhL2JlYXItMTI4MHg3MjAtemVyby1zdHN6LWVudHJ5Lm1wNAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvYmVhci0zMjB4MjQwLTE2eDktYXNwZWN0LndlYm0gYi9zcmMvbWVkaWEvdGVzdC9kYXRhL2JlYXItMzIweDI0MC0xNng5LWFzcGVjdC53ZWJtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjllODA5Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvYmVhci0zMjB4MjQwLTE2eDktYXNwZWN0LndlYm0KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdGVzdC9kYXRhL2JlYXItMzIweDI0MC1hbHRyZWYud2VibSBiL3NyYy9tZWRpYS90ZXN0L2RhdGEvYmVhci0zMjB4MjQwLWFsdHJlZi53ZWJtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWRiMDdhLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvYmVhci0zMjB4MjQwLWFsdHJlZi53ZWJtCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3Rlc3QvZGF0YS9iZWFyLTMyMHgyNDAtYXVkaW8tb25seS53ZWJtIGIvc3JjL21lZGlhL3Rlc3QvZGF0YS9iZWFyLTMyMHgyNDAtYXVkaW8tb25seS53ZWJtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTk0NzU0Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvYmVhci0zMjB4MjQwLWF1ZGlvLW9ubHkud2VibQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvYmVhci0zMjB4MjQwLWN1ZXMtaW4tZnJvbnQud2VibSBiL3NyYy9tZWRpYS90ZXN0L2RhdGEvYmVhci0zMjB4MjQwLWN1ZXMtaW4tZnJvbnQud2VibQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE1ZjNiMi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvdGVzdC9kYXRhL2JlYXItMzIweDI0MC1jdWVzLWluLWZyb250LndlYm0KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdGVzdC9kYXRhL2JlYXItMzIweDI0MC1lbmNyeXB0ZWQud2VibSBiL3NyYy9tZWRpYS90ZXN0L2RhdGEvYmVhci0zMjB4MjQwLWVuY3J5cHRlZC53ZWJtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWE2YzYzLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvYmVhci0zMjB4MjQwLWVuY3J5cHRlZC53ZWJtCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3Rlc3QvZGF0YS9iZWFyLTMyMHgyNDAtbGl2ZS53ZWJtIGIvc3JjL21lZGlhL3Rlc3QvZGF0YS9iZWFyLTMyMHgyNDAtbGl2ZS53ZWJtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTk2YzliLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvYmVhci0zMjB4MjQwLWxpdmUud2VibQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvYmVhci0zMjB4MjQwLW1hbmlmZXN0LmpzIGIvc3JjL21lZGlhL3Rlc3QvZGF0YS9iZWFyLTMyMHgyNDAtbWFuaWZlc3QuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNjYwMmEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3Rlc3QvZGF0YS9iZWFyLTMyMHgyNDAtbWFuaWZlc3QuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotewotICBkdXJhdGlvbjogMi43NDQwMDAsCi0gIHR5cGU6ICd2aWRlby93ZWJtOyBjb2RlY3M9InZwOCwgdm9yYmlzIicsCi0gIGluaXQ6IHsgb2Zmc2V0OiAwLCBzaXplOiA0MzcwfSwKLSAgbWVkaWE6IFsKLSAgICB7IG9mZnNldDogNDM3MCwgc2l6ZTogNDA3NzgsIHRpbWVjb2RlOiAwLjAwMDAwMCB9LAotICAgIHsgb2Zmc2V0OiA0NTE0OCwgc2l6ZTogMjc1ODksIHRpbWVjb2RlOiAwLjM5NjAwMCB9LAotICAgIHsgb2Zmc2V0OiA3MjczNywgc2l6ZTogMjgxODMsIHRpbWVjb2RlOiAwLjc3OTAwMCB9LAotICAgIHsgb2Zmc2V0OiAxMDA5MjAsIHNpemU6IDMxNjAwLCB0aW1lY29kZTogMS4xOTcwMDAgfSwKLSAgICB7IG9mZnNldDogMTMyNTIwLCBzaXplOiAzMzkyMiwgdGltZWNvZGU6IDEuNTg5MDAwIH0sCi0gICAgeyBvZmZzZXQ6IDE2NjQ0Miwgc2l6ZTogMzA1ODcsIHRpbWVjb2RlOiAxLjk4NzAwMCB9LAotICAgIHsgb2Zmc2V0OiAxOTcwMjksIHNpemU6IDIyMDc5LCB0aW1lY29kZTogMi40MDAwMDAgfSwKLSAgXQotfQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3Rlc3QvZGF0YS9iZWFyLTMyMHgyNDAtbXVsdGl0cmFjay53ZWJtIGIvc3JjL21lZGlhL3Rlc3QvZGF0YS9iZWFyLTMyMHgyNDAtbXVsdGl0cmFjay53ZWJtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODdiMTkzLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvYmVhci0zMjB4MjQwLW11bHRpdHJhY2sud2VibQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvYmVhci0zMjB4MjQwLXZpZGVvLW9ubHkud2VibSBiL3NyYy9tZWRpYS90ZXN0L2RhdGEvYmVhci0zMjB4MjQwLXZpZGVvLW9ubHkud2VibQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY2MDFmNC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvdGVzdC9kYXRhL2JlYXItMzIweDI0MC12aWRlby1vbmx5LndlYm0KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdGVzdC9kYXRhL2JlYXItMzIweDI0MC53ZWJtIGIvc3JjL21lZGlhL3Rlc3QvZGF0YS9iZWFyLTMyMHgyNDAud2VibQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFiNDE1MC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvdGVzdC9kYXRhL2JlYXItMzIweDI0MC53ZWJtCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3Rlc3QvZGF0YS9iZWFyLTY0MHgzNjAtbWFuaWZlc3QuanMgYi9zcmMvbWVkaWEvdGVzdC9kYXRhL2JlYXItNjQweDM2MC1tYW5pZmVzdC5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc3ODdiMC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvdGVzdC9kYXRhL2JlYXItNjQweDM2MC1tYW5pZmVzdC5qcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi17Ci0gIGR1cmF0aW9uOiAyLjc0MDAwMCwKLSAgdHlwZTogJ3ZpZGVvL3dlYm07IGNvZGVjcz0idnA4LCB2b3JiaXMiJywKLSAgaW5pdDogeyBvZmZzZXQ6IDAsIHNpemU6IDQzNDB9LAotICBtZWRpYTogWwotICAgIHsgb2Zmc2V0OiA0MzQwLCBzaXplOiA1MDk1MCwgdGltZWNvZGU6IDAuMDAwMDAwfSwKLSAgICB7IG9mZnNldDogNTUyOTAsIHNpemU6IDE4Nzg1LCB0aW1lY29kZTogMC41MjcwMDB9LAotICAgIHsgb2Zmc2V0OiA3NDA3NSwgc2l6ZTogMTk4MTAsIHRpbWVjb2RlOiAxLjAxNDAwMH0sCi0gICAgeyBvZmZzZXQ6IDkzODg1LCBzaXplOiAyMTcwNiwgdGltZWNvZGU6IDEuNTIyMDAwfSwKLSAgICB7IG9mZnNldDogMTE1NTkxLCBzaXplOiAyMDI0OSwgdGltZWNvZGU6IDIuMDE2MDAwfSwKLSAgICB7IG9mZnNldDogMTM1ODQwLCBzaXplOiA5OTQ2LCB0aW1lY29kZTogMi41MTUwMDB9LAotICBdCi19CmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdGVzdC9kYXRhL2JlYXItNjQweDM2MC53ZWJtIGIvc3JjL21lZGlhL3Rlc3QvZGF0YS9iZWFyLTY0MHgzNjAud2VibQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJhZTM2Yy4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvdGVzdC9kYXRhL2JlYXItNjQweDM2MC53ZWJtCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3Rlc3QvZGF0YS9iZWFyLjEyODB4NzIwLm1wNCBiL3NyYy9tZWRpYS90ZXN0L2RhdGEvYmVhci4xMjgweDcyMC5tcDQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MjRhMGYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3Rlc3QvZGF0YS9iZWFyLjEyODB4NzIwLm1wNAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvYmVhci4xMjgweDcyMF9kYXNoLm1wNCBiL3NyYy9tZWRpYS90ZXN0L2RhdGEvYmVhci4xMjgweDcyMF9kYXNoLm1wNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA1ZTFhMC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvdGVzdC9kYXRhL2JlYXIuMTI4MHg3MjBfZGFzaC5tcDQKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdGVzdC9kYXRhL2JlYXIuNjQweDM2MF9kYXNoLm1wNCBiL3NyYy9tZWRpYS90ZXN0L2RhdGEvYmVhci42NDB4MzYwX2Rhc2gubXA0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWEwNDVhLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvYmVhci42NDB4MzYwX2Rhc2gubXA0CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3Rlc3QvZGF0YS9iZWFyLm9ndiBiL3NyYy9tZWRpYS90ZXN0L2RhdGEvYmVhci5vZ3YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZTExMzQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3Rlc3QvZGF0YS9iZWFyLm9ndgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvaWQzX3BuZ190ZXN0Lm1wMyBiL3NyYy9tZWRpYS90ZXN0L2RhdGEvaWQzX3BuZ190ZXN0Lm1wMwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlZmEyYy4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvdGVzdC9kYXRhL2lkM19wbmdfdGVzdC5tcDMKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdGVzdC9kYXRhL2lkM190ZXN0Lm1wMyBiL3NyYy9tZWRpYS90ZXN0L2RhdGEvaWQzX3Rlc3QubXAzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGY0M2I5Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvaWQzX3Rlc3QubXAzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3Rlc3QvZGF0YS9ub19hdWRpb192aWRlby53ZWJtIGIvc3JjL21lZGlhL3Rlc3QvZGF0YS9ub19hdWRpb192aWRlby53ZWJtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjRjMDkxLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvbm9fYXVkaW9fdmlkZW8ud2VibQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvbm9fc3RyZWFtcy53ZWJtIGIvc3JjL21lZGlhL3Rlc3QvZGF0YS9ub19zdHJlYW1zLndlYm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYmMzZTguLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3Rlc3QvZGF0YS9ub19zdHJlYW1zLndlYm0KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdGVzdC9kYXRhL25vbnplcm8tc3RhcnQtdGltZS53ZWJtIGIvc3JjL21lZGlhL3Rlc3QvZGF0YS9ub256ZXJvLXN0YXJ0LXRpbWUud2VibQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQyOWJjOC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvdGVzdC9kYXRhL25vbnplcm8tc3RhcnQtdGltZS53ZWJtCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3Rlc3QvZGF0YS9zZngubTRhIGIvc3JjL21lZGlhL3Rlc3QvZGF0YS9zZngubTRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGM0NjIxLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvc2Z4Lm00YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvc2Z4Lm1wMyBiL3NyYy9tZWRpYS90ZXN0L2RhdGEvc2Z4Lm1wMwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDllYjJmMy4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvdGVzdC9kYXRhL3NmeC5tcDMKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdGVzdC9kYXRhL3NmeC5vZ2cgYi9zcmMvbWVkaWEvdGVzdC9kYXRhL3NmeC5vZ2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NjljOGYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3Rlc3QvZGF0YS9zZngub2dnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3Rlc3QvZGF0YS9zZnhfZjMybGUud2F2IGIvc3JjL21lZGlhL3Rlc3QvZGF0YS9zZnhfZjMybGUud2F2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWVhNmExLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvc2Z4X2YzMmxlLndhdgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvc2Z4X3MxNmxlLndhdiBiL3NyYy9tZWRpYS90ZXN0L2RhdGEvc2Z4X3MxNmxlLndhdgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBiYzk1Zi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvdGVzdC9kYXRhL3NmeF9zMTZsZS53YXYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdGVzdC9kYXRhL3NmeF9zMjRsZS53YXYgYi9zcmMvbWVkaWEvdGVzdC9kYXRhL3NmeF9zMjRsZS53YXYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZDVkNDYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3Rlc3QvZGF0YS9zZnhfczI0bGUud2F2CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3Rlc3QvZGF0YS9zZnhfdTgud2F2IGIvc3JjL21lZGlhL3Rlc3QvZGF0YS9zZnhfdTgud2F2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGIzOTdjLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvc2Z4X3U4LndhdgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvc3BlZWNoXzE2Yl9tb25vXzQ0a0h6LnJhdyBiL3NyYy9tZWRpYS90ZXN0L2RhdGEvc3BlZWNoXzE2Yl9tb25vXzQ0a0h6LnJhdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlmNzcwNC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvdGVzdC9kYXRhL3NwZWVjaF8xNmJfbW9ub180NGtIei5yYXcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdGVzdC9kYXRhL3NwZWVjaF8xNmJfbW9ub180OGtIei5yYXcgYi9zcmMvbWVkaWEvdGVzdC9kYXRhL3NwZWVjaF8xNmJfbW9ub180OGtIei5yYXcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNDE3NDMuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3Rlc3QvZGF0YS9zcGVlY2hfMTZiX21vbm9fNDhrSHoucmF3CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3Rlc3QvZGF0YS9zcGVlY2hfMTZiX3N0ZXJlb180NGtIei5yYXcgYi9zcmMvbWVkaWEvdGVzdC9kYXRhL3NwZWVjaF8xNmJfc3RlcmVvXzQ0a0h6LnJhdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RiYjY0NC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvdGVzdC9kYXRhL3NwZWVjaF8xNmJfc3RlcmVvXzQ0a0h6LnJhdworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvc3BlZWNoXzE2Yl9zdGVyZW9fNDhrSHoucmF3IGIvc3JjL21lZGlhL3Rlc3QvZGF0YS9zcGVlY2hfMTZiX3N0ZXJlb180OGtIei5yYXcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOTQzMmUuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3Rlc3QvZGF0YS9zcGVlY2hfMTZiX3N0ZXJlb180OGtIei5yYXcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdGVzdC9kYXRhL3NwZWV4X2F1ZGlvX3ZvcmJpc192aWRlby5vZ3YgYi9zcmMvbWVkaWEvdGVzdC9kYXRhL3NwZWV4X2F1ZGlvX3ZvcmJpc192aWRlby5vZ3YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxM2VkZGQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3Rlc3QvZGF0YS9zcGVleF9hdWRpb192b3JiaXNfdmlkZW8ub2d2CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3Rlc3QvZGF0YS9zd2VlcDAyXzE2Yl9tb25vXzE2S0h6LnJhdyBiL3NyYy9tZWRpYS90ZXN0L2RhdGEvc3dlZXAwMl8xNmJfbW9ub18xNktIei5yYXcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZDRkYzQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3Rlc3QvZGF0YS9zd2VlcDAyXzE2Yl9tb25vXzE2S0h6LnJhdworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvdGVuX2J5dGVfZmlsZSBiL3NyYy9tZWRpYS90ZXN0L2RhdGEvdGVuX2J5dGVfZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ0NzEwMC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvdGVzdC9kYXRhL3Rlbl9ieXRlX2ZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0wMTIzNDU2Nzg5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3Rlc3QvZGF0YS92b3JiaXMtZXh0cmFkYXRhIGIvc3JjL21lZGlhL3Rlc3QvZGF0YS92b3JiaXMtZXh0cmFkYXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjk1MzA5Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvdm9yYmlzLWV4dHJhZGF0YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvdm9yYmlzLXBhY2tldC0wIGIvc3JjL21lZGlhL3Rlc3QvZGF0YS92b3JiaXMtcGFja2V0LTAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMzczOWMuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3Rlc3QvZGF0YS92b3JiaXMtcGFja2V0LTAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdGVzdC9kYXRhL3ZvcmJpcy1wYWNrZXQtMSBiL3NyYy9tZWRpYS90ZXN0L2RhdGEvdm9yYmlzLXBhY2tldC0xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzVjY2RiLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvdm9yYmlzLXBhY2tldC0xCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAot7MpSZO/KUmQfGksCTBqjijgYL1nP+Th2J7cp6n03opHVopGJk583bwEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdGVzdC9kYXRhL3ZvcmJpcy1wYWNrZXQtMiBiL3NyYy9tZWRpYS90ZXN0L2RhdGEvdm9yYmlzLXBhY2tldC0yCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDFjYjVkLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvdm9yYmlzLXBhY2tldC0yCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3Rlc3QvZGF0YS92b3JiaXMtcGFja2V0LTMgYi9zcmMvbWVkaWEvdGVzdC9kYXRhL3ZvcmJpcy1wYWNrZXQtMwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIyMmU3ZC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvdGVzdC9kYXRhL3ZvcmJpcy1wYWNrZXQtMworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvdm9yYmlzX2F1ZGlvX3dtdl92aWRlby5ta3YgYi9zcmMvbWVkaWEvdGVzdC9kYXRhL3ZvcmJpc19hdWRpb193bXZfdmlkZW8ubWt2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTIzMTlmLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvdm9yYmlzX2F1ZGlvX3dtdl92aWRlby5ta3YKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdGVzdC9kYXRhL3ZwOC1JLWZyYW1lLTE2MHgyNDAgYi9zcmMvbWVkaWEvdGVzdC9kYXRhL3ZwOC1JLWZyYW1lLTE2MHgyNDAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZTQzMzcuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3Rlc3QvZGF0YS92cDgtSS1mcmFtZS0xNjB4MjQwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3Rlc3QvZGF0YS92cDgtSS1mcmFtZS0zMjB4MTIwIGIvc3JjL21lZGlhL3Rlc3QvZGF0YS92cDgtSS1mcmFtZS0zMjB4MTIwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTRlMWUyLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvdnA4LUktZnJhbWUtMzIweDEyMAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvdnA4LUktZnJhbWUtMzIweDI0MCBiL3NyYy9tZWRpYS90ZXN0L2RhdGEvdnA4LUktZnJhbWUtMzIweDI0MApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI3YmZiOS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvdGVzdC9kYXRhL3ZwOC1JLWZyYW1lLTMyMHgyNDAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdGVzdC9kYXRhL3ZwOC1JLWZyYW1lLTMyMHg0ODAgYi9zcmMvbWVkaWEvdGVzdC9kYXRhL3ZwOC1JLWZyYW1lLTMyMHg0ODAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZDU5ZjAuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3Rlc3QvZGF0YS92cDgtSS1mcmFtZS0zMjB4NDgwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3Rlc3QvZGF0YS92cDgtSS1mcmFtZS02NDB4MjQwIGIvc3JjL21lZGlhL3Rlc3QvZGF0YS92cDgtSS1mcmFtZS02NDB4MjQwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzI5OWNjLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvdnA4LUktZnJhbWUtNjQweDI0MAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvdnA4LWNvcnJ1cHQtSS1mcmFtZSBiL3NyYy9tZWRpYS90ZXN0L2RhdGEvdnA4LWNvcnJ1cHQtSS1mcmFtZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNhZmE4NC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvdGVzdC9kYXRhL3ZwOC1jb3JydXB0LUktZnJhbWUKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdGVzdC9kYXRhL3dlYm1fY29udGVudF9lbmNvZGluZ3MgYi9zcmMvbWVkaWEvdGVzdC9kYXRhL3dlYm1fY29udGVudF9lbmNvZGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0OWZlZDIuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3Rlc3QvZGF0YS93ZWJtX2NvbnRlbnRfZW5jb2RpbmdzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3Rlc3QvZGF0YS93ZWJtX2VibWxfZWxlbWVudCBiL3NyYy9tZWRpYS90ZXN0L2RhdGEvd2VibV9lYm1sX2VsZW1lbnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMGViMWIuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3Rlc3QvZGF0YS93ZWJtX2VibWxfZWxlbWVudAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvd2VibV9pbmZvX2VsZW1lbnQgYi9zcmMvbWVkaWEvdGVzdC9kYXRhL3dlYm1faW5mb19lbGVtZW50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDk3ZDEzLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS90ZXN0L2RhdGEvd2VibV9pbmZvX2VsZW1lbnQKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdGVzdC9kYXRhL3dlYm1fdm9yYmlzX3RyYWNrX2VudHJ5IGIvc3JjL21lZGlhL3Rlc3QvZGF0YS93ZWJtX3ZvcmJpc190cmFja19lbnRyeQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg3MzUyMS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvdGVzdC9kYXRhL3dlYm1fdm9yYmlzX3RyYWNrX2VudHJ5CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3Rlc3QvZGF0YS93ZWJtX3ZwOF90cmFja19lbnRyeSBiL3NyYy9tZWRpYS90ZXN0L2RhdGEvd2VibV92cDhfdHJhY2tfZW50cnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NDRlOWQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3Rlc3QvZGF0YS93ZWJtX3ZwOF90cmFja19lbnRyeQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS90ZXN0L2ZmbXBlZ190ZXN0cy9mZm1wZWdfdGVzdHMuY2MgYi9zcmMvbWVkaWEvdGVzdC9mZm1wZWdfdGVzdHMvZmZtcGVnX3Rlc3RzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjJkNTMyLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS90ZXN0L2ZmbXBlZ190ZXN0cy9mZm1wZWdfdGVzdHMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0OTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gU29mdHdhcmUgcXVhbGlmaWNhdGlvbiB0ZXN0IGZvciBGRm1wZWcuICBUaGlzIHRlc3QgaXMgdXNlZCB0byBjZXJ0aWZ5IHRoYXQKLS8vIHNvZnR3YXJlIGRlY29kaW5nIHF1YWxpdHkgYW5kIHBlcmZvcm1hbmNlIG9mIEZGbXBlZyBtZWV0cyBhIG1pbWltdW0KLS8vIHN0YW5kYXJkLgotCi0jaW5jbHVkZSA8aW9tYW5pcD4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJiYXNlL2F0X2V4aXQuaCIKLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJiYXNlL2NvbW1hbmRfbGluZS5oIgotI2luY2x1ZGUgImJhc2UvZmlsZV9wYXRoLmgiCi0jaW5jbHVkZSAiYmFzZS9maWxlX3V0aWwuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL21kNS5oIgotI2luY2x1ZGUgImJhc2UvcGF0aF9zZXJ2aWNlLmgiCi0jaW5jbHVkZSAiYmFzZS9zdHJpbmdfdXRpbC5oIgotI2luY2x1ZGUgImJhc2UvdGltZS5oIgotI2luY2x1ZGUgImJhc2UvdXRmX3N0cmluZ19jb252ZXJzaW9ucy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGpiMi5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWEuaCIKLSNpbmNsdWRlICJtZWRpYS9mZm1wZWcvZmZtcGVnX2NvbW1vbi5oIgotI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvZmZtcGVnX2dsdWUuaCIKLSNpbmNsdWRlICJtZWRpYS9maWx0ZXJzL2ZmbXBlZ192aWRlb19kZWNvZGVyLmgiCi0jaW5jbHVkZSAibWVkaWEvZmlsdGVycy9pbl9tZW1vcnlfdXJsX3Byb3RvY29sLmgiCi0KLSNpZmRlZiBERUJVRwotI2RlZmluZSBTSE9XX1ZFUkJPU0UgMQotI2Vsc2UKLSNkZWZpbmUgU0hPV19WRVJCT1NFIDAKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChPU19XSU4pCi0KLS8vIEVuYWJsZSB0byBidWlsZCB3aXRoIGV4Y2VwdGlvbiBoYW5kbGVyCi0vLyNkZWZpbmUgRU5BQkxFX1dJTkRPV1NfRVhDRVBUSU9OUyAxCi0KLSNpZmRlZiBFTkFCTEVfV0lORE9XU19FWENFUFRJT05TCi0vLyB3YXJuaW5nOiBkaXNhYmxlIHdhcm5pbmcgYWJvdXQgZXhjZXB0aW9uIGhhbmRsZXIuCi0jcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0NTA5KQotI2VuZGlmCi0KLS8vIFRocmVhZCBwcmlvcml0aWVzIHRvIG1ha2UgYmVuY2htYXJrIG1vcmUgc3RhYmxlLgotCi12b2lkIEVudGVyVGltaW5nU2VjdGlvbigpIHsKLSAgU2V0VGhyZWFkUHJpb3JpdHkoR2V0Q3VycmVudFRocmVhZCgpLCBUSFJFQURfUFJJT1JJVFlfQUJPVkVfTk9STUFMKTsKLX0KLQotdm9pZCBMZWF2ZVRpbWluZ1NlY3Rpb24oKSB7Ci0gIFNldFRocmVhZFByaW9yaXR5KEdldEN1cnJlbnRUaHJlYWQoKSwgVEhSRUFEX1BSSU9SSVRZX05PUk1BTCk7Ci19Ci0jZWxzZQotdm9pZCBFbnRlclRpbWluZ1NlY3Rpb24oKSB7Ci0gIHB0aHJlYWRfYXR0cl90IHB0YTsKLSAgc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtOwotCi0gIHB0aHJlYWRfYXR0cl9pbml0KCZwdGEpOwotICBtZW1zZXQoJnBhcmFtLCAwLCBzaXplb2YocGFyYW0pKTsKLSAgcGFyYW0uc2NoZWRfcHJpb3JpdHkgPSA3ODsKLSAgcHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW0oJnB0YSwgJnBhcmFtKTsKLSAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJnB0YSk7Ci19Ci0KLXZvaWQgTGVhdmVUaW1pbmdTZWN0aW9uKCkgewotfQotI2VuZGlmCi0KLWludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyKiogYXJndikgewotICBiYXNlOjpBdEV4aXRNYW5hZ2VyIGV4aXRfbWFuYWdlcjsKLQotICBDb21tYW5kTGluZTo6SW5pdChhcmdjLCBhcmd2KTsKLSAgY29uc3QgQ29tbWFuZExpbmUqIGNtZF9saW5lID0gQ29tbWFuZExpbmU6OkZvckN1cnJlbnRQcm9jZXNzKCk7Ci0KLSAgY29uc3QgQ29tbWFuZExpbmU6OlN0cmluZ1ZlY3RvciYgZmlsZW5hbWVzID0gY21kX2xpbmUtPkdldEFyZ3MoKTsKLQotICBpZiAoZmlsZW5hbWVzLmVtcHR5KCkpIHsKLSAgICBzdGQ6OmNlcnIgPDwgIlVzYWdlOiAiIDw8IGFyZ3ZbMF0gPDwgIiBNRURJQUZJTEUiIDw8IHN0ZDo6ZW5kbDsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIC8vIEluaXRpYWxpemUgb3VyIG1lZGlhIGxpYnJhcnkgKHRyeSBsb2FkaW5nIERMTHMsIGV0Yy4pIGJlZm9yZSBjb250aW51aW5nLgotICBGaWxlUGF0aCBtZWRpYV9wYXRoOwotICBQYXRoU2VydmljZTo6R2V0KGJhc2U6OkRJUl9NT0RVTEUsICZtZWRpYV9wYXRoKTsKLSAgaWYgKCFtZWRpYTo6SW5pdGlhbGl6ZU1lZGlhTGlicmFyeShtZWRpYV9wYXRoKSkgewotICAgIHN0ZDo6Y2VyciA8PCAiVW5hYmxlIHRvIGluaXRpYWxpemUgdGhlIG1lZGlhIGxpYnJhcnkuIjsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIC8vIFJldHJpZXZlIGNvbW1hbmQgbGluZSBvcHRpb25zLgotICBGaWxlUGF0aCBpbl9wYXRoKGZpbGVuYW1lc1swXSk7Ci0gIEZpbGVQYXRoIG91dF9wYXRoOwotICBpZiAoZmlsZW5hbWVzLnNpemUoKSA+IDEpCi0gICAgb3V0X3BhdGggPSBGaWxlUGF0aChmaWxlbmFtZXNbMV0pOwotCi0gIC8vIERlZmF1bHQgZmxhZ3MgdGhhdCBtYXRjaCBDaHJvbWUgZGVmYXVsdHMuCi0gIGludCB2aWRlb190aHJlYWRzID0gMjsKLSAgaW50IG1heF9mcmFtZXMgPSAwOwotICBpbnQgbWF4X2xvb3BzID0gMDsKLSAgYm9vbCBmbHVzaCA9IGZhbHNlOwotCi0gIHVuc2lnbmVkIGludCBoYXNoX3ZhbHVlID0gNTM4MXU7ICAvLyBTZWVkIGZvciBESkIyLgotICBib29sIGhhc2hfZGpiMiA9IGZhbHNlOwotCi0gIGJhc2U6Ok1ENUNvbnRleHQgY3R4OyAgLy8gSW50ZXJtZWRpYXRlIE1ENSBkYXRhOiBkbyBub3QgdXNlCi0gIGJhc2U6Ok1ENUluaXQoJmN0eCk7Ci0gIGJvb2wgaGFzaF9tZDUgPSBmYWxzZTsKLQotICBzdGQ6Om9zdHJlYW0qIGxvZ19vdXQgPSAmc3RkOjpjb3V0OwotI2lmIGRlZmluZWQoRU5BQkxFX1dJTkRPV1NfRVhDRVBUSU9OUykKLSAgLy8gQ2F0Y2ggZXhjZXB0aW9ucyBzbyB0aGlzIHRvb2wgY2FuIGJlIHVzZWQgaW4gYXV0b21hdGVkIHRlc3RpbmcuCi0gIF9fdHJ5IHsKLSNlbmRpZgotCi0gIGZpbGVfdXRpbDo6TWVtb3J5TWFwcGVkRmlsZSBmaWxlX2RhdGE7Ci0gIGZpbGVfZGF0YS5Jbml0aWFsaXplKGluX3BhdGgpOwotICBtZWRpYTo6SW5NZW1vcnlVcmxQcm90b2NvbCBwcm90b2NvbCgKLSAgICAgIGZpbGVfZGF0YS5kYXRhKCksIGZpbGVfZGF0YS5sZW5ndGgoKSwgZmFsc2UpOwotCi0gIC8vIFJlZ2lzdGVyIEZGbXBlZyBhbmQgYXR0ZW1wdCB0byBvcGVuIGZpbGUuCi0gIG1lZGlhOjpGRm1wZWdHbHVlIGdsdWUoJnByb3RvY29sKTsKLSAgaWYgKCFnbHVlLk9wZW5Db250ZXh0KCkpIHsKLSAgICBzdGQ6OmNlcnIgPDwgIkVycm9yOiBDb3VsZCBub3Qgb3BlbiBpbnB1dCBmb3IgIgotICAgICAgICAgICAgICA8PCBpbl9wYXRoLnZhbHVlKCkgPDwgc3RkOjplbmRsOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgQVZGb3JtYXRDb250ZXh0KiBmb3JtYXRfY29udGV4dCA9IGdsdWUuZm9ybWF0X2NvbnRleHQoKTsKLQotICAvLyBPcGVuIG91dHB1dCBmaWxlLgotICBGSUxFICpvdXRwdXQgPSBOVUxMOwotICBpZiAoIW91dF9wYXRoLmVtcHR5KCkpIHsKLSAgICBvdXRwdXQgPSBmaWxlX3V0aWw6Ok9wZW5GaWxlKG91dF9wYXRoLCAid2IiKTsKLSAgICBpZiAoIW91dHB1dCkgewotICAgICAgc3RkOjpjZXJyIDw8ICJFcnJvcjogQ291bGQgbm90IG9wZW4gb3V0cHV0ICIKLSAgICAgICAgICAgICAgICA8PCBvdXRfcGF0aC52YWx1ZSgpIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgfQotCi0gIC8vIFBhcnNlIGEgbGl0dGxlIGJpdCBvZiB0aGUgc3RyZWFtIHRvIGZpbGwgb3V0IHRoZSBmb3JtYXQgY29udGV4dC4KLSAgaWYgKGF2Zm9ybWF0X2ZpbmRfc3RyZWFtX2luZm8oZm9ybWF0X2NvbnRleHQsIE5VTEwpIDwgMCkgewotICAgIHN0ZDo6Y2VyciA8PCAiRXJyb3I6IENvdWxkIG5vdCBmaW5kIHN0cmVhbSBpbmZvIGZvciAiCi0gICAgICAgICAgICAgIDw8IGluX3BhdGgudmFsdWUoKSA8PCBzdGQ6OmVuZGw7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICAvLyBGaW5kIG91ciB0YXJnZXQgc3RyZWFtKHMpCi0gIGludCB2aWRlb19zdHJlYW0gPSAtMTsKLSAgaW50IGF1ZGlvX3N0cmVhbSA9IC0xOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZvcm1hdF9jb250ZXh0LT5uYl9zdHJlYW1zOyArK2kpIHsKLSAgICBBVkNvZGVjQ29udGV4dCogY29kZWNfY29udGV4dCA9IGZvcm1hdF9jb250ZXh0LT5zdHJlYW1zW2ldLT5jb2RlYzsKLQotICAgIGlmIChjb2RlY19jb250ZXh0LT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJiB2aWRlb19zdHJlYW0gPCAwKSB7Ci0jaWYgU0hPV19WRVJCT1NFCi0gICAgICAqbG9nX291dCA8PCAiViAiOwotI2VuZGlmCi0gICAgICB2aWRlb19zdHJlYW0gPSBpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoY29kZWNfY29udGV4dC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYgYXVkaW9fc3RyZWFtIDwgMCkgewotI2lmIFNIT1dfVkVSQk9TRQotICAgICAgICAqbG9nX291dCA8PCAiQSAiOwotI2VuZGlmCi0gICAgICAgIGF1ZGlvX3N0cmVhbSA9IGk7Ci0gICAgICB9IGVsc2UgewotI2lmIFNIT1dfVkVSQk9TRQotICAgICAgKmxvZ19vdXQgPDwgIiAgIjsKLSNlbmRpZgotICAgICAgfQotICAgIH0KLQotI2lmIFNIT1dfVkVSQk9TRQotICAgIEFWQ29kZWMqIGNvZGVjID0gYXZjb2RlY19maW5kX2RlY29kZXIoY29kZWNfY29udGV4dC0+Y29kZWNfaWQpOwotICAgIGlmICghY29kZWMgfHwgKGNvZGVjX2NvbnRleHQtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1VOS05PV04pKSB7Ci0gICAgICAqbG9nX291dCA8PCAiU3RyZWFtICMiIDw8IGkgPDwgIjogVW5rbm93biIgPDwgc3RkOjplbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBQcmludCBvdXQgc3RyZWFtIGluZm9ybWF0aW9uCi0gICAgICAqbG9nX291dCA8PCAiU3RyZWFtICMiIDw8IGkgPDwgIjogIiA8PCBjb2RlYy0+bmFtZSA8PCAiICgiCi0gICAgICAgICAgICAgICA8PCBjb2RlYy0+bG9uZ19uYW1lIDw8ICIpIiA8PCBzdGQ6OmVuZGw7Ci0gICAgfQotI2VuZGlmCi0gIH0KLSAgaW50IHRhcmdldF9zdHJlYW0gPSB2aWRlb19zdHJlYW07Ci0gIEFWTWVkaWFUeXBlIHRhcmdldF9jb2RlYyA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgaWYgKHRhcmdldF9zdHJlYW0gPCAwKSB7Ci0gICAgdGFyZ2V0X3N0cmVhbSA9IGF1ZGlvX3N0cmVhbTsKLSAgICB0YXJnZXRfY29kZWMgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gIH0KLQotICAvLyBPbmx5IGNvbnRpbnVlIGlmIHdlIGZvdW5kIG91ciB0YXJnZXQgc3RyZWFtLgotICBpZiAodGFyZ2V0X3N0cmVhbSA8IDApIHsKLSAgICBzdGQ6OmNlcnIgPDwgIkVycm9yOiBDb3VsZCBub3QgZmluZCB0YXJnZXQgc3RyZWFtICIKLSAgICAgICAgICAgICAgPDwgdGFyZ2V0X3N0cmVhbSA8PCAiIGZvciAiIDw8IGluX3BhdGgudmFsdWUoKSA8PCBzdGQ6OmVuZGw7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICAvLyBQcmVwYXJlIEZGbXBlZyBzdHJ1Y3R1cmVzLgotICBBVlBhY2tldCBwYWNrZXQ7Ci0gIEFWQ29kZWNDb250ZXh0KiBjb2RlY19jb250ZXh0ID0gZm9ybWF0X2NvbnRleHQtPnN0cmVhbXNbdGFyZ2V0X3N0cmVhbV0tPmNvZGVjOwotICBBVkNvZGVjKiBjb2RlYyA9IGF2Y29kZWNfZmluZF9kZWNvZGVyKGNvZGVjX2NvbnRleHQtPmNvZGVjX2lkKTsKLQotICAvLyBPbmx5IGNvbnRpbnVlIGlmIHdlIGZvdW5kIG91ciBjb2RlYy4KLSAgaWYgKCFjb2RlYykgewotICAgIHN0ZDo6Y2VyciA8PCAiRXJyb3I6IENvdWxkIG5vdCBmaW5kIGNvZGVjIGZvciAiCi0gICAgICAgICAgICAgIDw8IGluX3BhdGgudmFsdWUoKSA8PCBzdGQ6OmVuZGw7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBjb2RlY19jb250ZXh0LT5lcnJvcl9jb25jZWFsbWVudCA9IEZGX0VDX0dVRVNTX01WUyB8IEZGX0VDX0RFQkxPQ0s7Ci0KLSAgLy8gSW5pdGlhbGl6ZSB0aHJlYWRlZCBkZWNvZGUuCi0gIGlmICh0YXJnZXRfY29kZWMgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmIHZpZGVvX3RocmVhZHMgPiAwKSB7Ci0gICAgY29kZWNfY29udGV4dC0+dGhyZWFkX2NvdW50ID0gdmlkZW9fdGhyZWFkczsKLSAgfQotCi0gIC8vIEluaXRpYWxpemUgb3VyIGNvZGVjLgotICBpZiAoYXZjb2RlY19vcGVuMihjb2RlY19jb250ZXh0LCBjb2RlYywgTlVMTCkgPCAwKSB7Ci0gICAgc3RkOjpjZXJyIDw8ICJFcnJvcjogQ291bGQgbm90IG9wZW4gY29kZWMgIgotICAgICAgICAgICAgICA8PCBjb2RlY19jb250ZXh0LT5jb2RlYy0+bmFtZSA8PCAiIGZvciAiCi0gICAgICAgICAgICAgIDw8IGluX3BhdGgudmFsdWUoKSA8PCBzdGQ6OmVuZGw7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICAvLyBCdWZmZXIgdXNlZCBmb3IgYXVkaW8gZGVjb2RpbmcuCi0gIHNjb3BlZF9wdHJfbWFsbG9jPEFWRnJhbWUsIG1lZGlhOjpTY29wZWRQdHJBVkZyZWU+IGF1ZGlvX2ZyYW1lKAotICAgICAgYXZjb2RlY19hbGxvY19mcmFtZSgpKTsKLSAgaWYgKCFhdWRpb19mcmFtZS5nZXQoKSkgewotICAgIHN0ZDo6Y2VyciA8PCAiRXJyb3I6IGF2Y29kZWNfYWxsb2NfZnJhbWUgZm9yICIKLSAgICAgICAgICAgICAgPDwgaW5fcGF0aC52YWx1ZSgpIDw8IHN0ZDo6ZW5kbDsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIC8vIEJ1ZmZlciB1c2VkIGZvciB2aWRlbyBkZWNvZGluZy4KLSAgc2NvcGVkX3B0cl9tYWxsb2M8QVZGcmFtZSwgbWVkaWE6OlNjb3BlZFB0ckFWRnJlZT4gdmlkZW9fZnJhbWUoCi0gICAgICBhdmNvZGVjX2FsbG9jX2ZyYW1lKCkpOwotICBpZiAoIXZpZGVvX2ZyYW1lLmdldCgpKSB7Ci0gICAgc3RkOjpjZXJyIDw8ICJFcnJvcjogYXZjb2RlY19hbGxvY19mcmFtZSBmb3IgIgotICAgICAgICAgICAgICA8PCBpbl9wYXRoLnZhbHVlKCkgPDwgc3RkOjplbmRsOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgLy8gU3RhdHMgY29sbGVjdG9yLgotICBFbnRlclRpbWluZ1NlY3Rpb24oKTsKLSAgc3RkOjp2ZWN0b3I8ZG91YmxlPiBkZWNvZGVfdGltZXM7Ci0gIGRlY29kZV90aW1lcy5yZXNlcnZlKDQwOTYpOwotICAvLyBQYXJzZSB0aHJvdWdoIHRoZSBlbnRpcmUgc3RyZWFtIHVudGlsIHdlIGhpdCBFT0YuCi0jaWYgU0hPV19WRVJCT1NFCi0gIGJhc2U6OlRpbWVUaWNrcyBzdGFydCA9IGJhc2U6OlRpbWVUaWNrczo6SGlnaFJlc05vdygpOwotI2VuZGlmCi0gIGludCBmcmFtZXMgPSAwOwotICBpbnQgcmVhZF9yZXN1bHQgPSAwOwotICBkbyB7Ci0gICAgcmVhZF9yZXN1bHQgPSBhdl9yZWFkX2ZyYW1lKGZvcm1hdF9jb250ZXh0LCAmcGFja2V0KTsKLQotICAgIGlmIChyZWFkX3Jlc3VsdCA8IDApIHsKLSAgICAgIGlmIChtYXhfbG9vcHMpIHsKLSAgICAgICAgLS1tYXhfbG9vcHM7Ci0gICAgICB9Ci0gICAgICBpZiAobWF4X2xvb3BzID4gMCkgewotICAgICAgICBhdl9zZWVrX2ZyYW1lKGZvcm1hdF9jb250ZXh0LCAtMSwgMCwgQVZTRUVLX0ZMQUdfQkFDS1dBUkQpOwotICAgICAgICByZWFkX3Jlc3VsdCA9IDA7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaWYgKGZsdXNoKSB7Ci0gICAgICAgIHBhY2tldC5zdHJlYW1faW5kZXggPSB0YXJnZXRfc3RyZWFtOwotICAgICAgICBwYWNrZXQuc2l6ZSA9IDA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBPbmx5IGRlY29kZSBwYWNrZXRzIGZyb20gb3VyIHRhcmdldCBzdHJlYW0uCi0gICAgaWYgKHBhY2tldC5zdHJlYW1faW5kZXggPT0gdGFyZ2V0X3N0cmVhbSkgewotICAgICAgaW50IHJlc3VsdCA9IC0xOwotICAgICAgaWYgKHRhcmdldF9jb2RlYyA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKLSAgICAgICAgaW50IHNpemVfb3V0ID0gMDsKLSAgICAgICAgaW50IGdvdF9hdWRpbyA9IDA7Ci0KLSAgICAgICAgYXZjb2RlY19nZXRfZnJhbWVfZGVmYXVsdHMoYXVkaW9fZnJhbWUuZ2V0KCkpOwotCi0gICAgICAgIGJhc2U6OlRpbWVUaWNrcyBkZWNvZGVfc3RhcnQgPSBiYXNlOjpUaW1lVGlja3M6OkhpZ2hSZXNOb3coKTsKLSAgICAgICAgcmVzdWx0ID0gYXZjb2RlY19kZWNvZGVfYXVkaW80KGNvZGVjX2NvbnRleHQsIGF1ZGlvX2ZyYW1lLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdvdF9hdWRpbywgJnBhY2tldCk7Ci0gICAgICAgIGJhc2U6OlRpbWVEZWx0YSBkZWx0YSA9IGJhc2U6OlRpbWVUaWNrczo6SGlnaFJlc05vdygpIC0gZGVjb2RlX3N0YXJ0OwotCi0gICAgICAgIGlmIChnb3RfYXVkaW8pIHsKLSAgICAgICAgICBzaXplX291dCA9IGF2X3NhbXBsZXNfZ2V0X2J1ZmZlcl9zaXplKAotICAgICAgICAgICAgICBOVUxMLCBjb2RlY19jb250ZXh0LT5jaGFubmVscywgYXVkaW9fZnJhbWUtPm5iX3NhbXBsZXMsCi0gICAgICAgICAgICAgIGNvZGVjX2NvbnRleHQtPnNhbXBsZV9mbXQsIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdvdF9hdWRpbyAmJiBzaXplX291dCkgewotICAgICAgICAgIGRlY29kZV90aW1lcy5wdXNoX2JhY2soZGVsdGEuSW5NaWxsaXNlY29uZHNGKCkpOwotICAgICAgICAgICsrZnJhbWVzOwotICAgICAgICAgIHJlYWRfcmVzdWx0ID0gMDsgIC8vIEZvcmNlIGNvbnRpbnVhdGlvbi4KLQotICAgICAgICAgIGlmIChvdXRwdXQpIHsKLSAgICAgICAgICAgIGlmIChmd3JpdGUoYXVkaW9fZnJhbWUtPmRhdGFbMF0sIDEsIHNpemVfb3V0LCBvdXRwdXQpICE9Ci0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihzaXplX291dCkpIHsKLSAgICAgICAgICAgICAgc3RkOjpjZXJyIDw8ICJFcnJvcjogQ291bGQgbm90IHdyaXRlICIKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IHNpemVfb3V0IDw8ICIgYnl0ZXMgZm9yICIgPDwgaW5fcGF0aC52YWx1ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIGNvbnN0IHVpbnQ4KiB1OF9zYW1wbGVzID0KLSAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KGF1ZGlvX2ZyYW1lLT5kYXRhWzBdKTsKLSAgICAgICAgICBpZiAoaGFzaF9kamIyKSB7Ci0gICAgICAgICAgICBoYXNoX3ZhbHVlID0gREpCMkhhc2godThfc2FtcGxlcywgc2l6ZV9vdXQsIGhhc2hfdmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoaGFzaF9tZDUpIHsKLSAgICAgICAgICAgIGJhc2U6Ok1ENVVwZGF0ZSgKLSAgICAgICAgICAgICAgICAmY3R4LAotICAgICAgICAgICAgICAgIGJhc2U6OlN0cmluZ1BpZWNlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHU4X3NhbXBsZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfb3V0KSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHRhcmdldF9jb2RlYyA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKLSAgICAgICAgaW50IGdvdF9waWN0dXJlID0gMDsKLQotICAgICAgICBhdmNvZGVjX2dldF9mcmFtZV9kZWZhdWx0cyh2aWRlb19mcmFtZS5nZXQoKSk7Ci0KLSAgICAgICAgYmFzZTo6VGltZVRpY2tzIGRlY29kZV9zdGFydCA9IGJhc2U6OlRpbWVUaWNrczo6SGlnaFJlc05vdygpOwotICAgICAgICByZXN1bHQgPSBhdmNvZGVjX2RlY29kZV92aWRlbzIoY29kZWNfY29udGV4dCwgdmlkZW9fZnJhbWUuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ290X3BpY3R1cmUsICZwYWNrZXQpOwotICAgICAgICBiYXNlOjpUaW1lRGVsdGEgZGVsdGEgPSBiYXNlOjpUaW1lVGlja3M6OkhpZ2hSZXNOb3coKSAtIGRlY29kZV9zdGFydDsKLQotICAgICAgICBpZiAoZ290X3BpY3R1cmUpIHsKLSAgICAgICAgICBkZWNvZGVfdGltZXMucHVzaF9iYWNrKGRlbHRhLkluTWlsbGlzZWNvbmRzRigpKTsKLSAgICAgICAgICArK2ZyYW1lczsKLSAgICAgICAgICByZWFkX3Jlc3VsdCA9IDA7ICAvLyBGb3JjZSBjb250aW51YXRpb24uCi0KLSAgICAgICAgICBmb3IgKGludCBwbGFuZSA9IDA7IHBsYW5lIDwgMzsgKytwbGFuZSkgewotICAgICAgICAgICAgY29uc3QgdWludDgqIHNvdXJjZSA9IHZpZGVvX2ZyYW1lLT5kYXRhW3BsYW5lXTsKLSAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzb3VyY2Vfc3RyaWRlID0gdmlkZW9fZnJhbWUtPmxpbmVzaXplW3BsYW5lXTsKLSAgICAgICAgICAgIHNpemVfdCBieXRlc19wZXJfbGluZSA9IGNvZGVjX2NvbnRleHQtPndpZHRoOwotICAgICAgICAgICAgc2l6ZV90IGNvcHlfbGluZXMgPSBjb2RlY19jb250ZXh0LT5oZWlnaHQ7Ci0gICAgICAgICAgICBpZiAocGxhbmUgIT0gMCkgewotICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGVjX2NvbnRleHQtPnBpeF9mbXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFBJWF9GTVRfWVVWNDIwUDoKLSAgICAgICAgICAgICAgICBjYXNlIFBJWF9GTVRfWVVWSjQyMFA6Ci0gICAgICAgICAgICAgICAgICBieXRlc19wZXJfbGluZSAvPSAyOwotICAgICAgICAgICAgICAgICAgY29weV9saW5lcyA9IChjb3B5X2xpbmVzICsgMSkgLyAyOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBQSVhfRk1UX1lVVjQyMlA6Ci0gICAgICAgICAgICAgICAgY2FzZSBQSVhfRk1UX1lVVko0MjJQOgotICAgICAgICAgICAgICAgICAgYnl0ZXNfcGVyX2xpbmUgLz0gMjsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUElYX0ZNVF9ZVVY0NDRQOgotICAgICAgICAgICAgICAgIGNhc2UgUElYX0ZNVF9ZVVZKNDQ0UDoKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICBzdGQ6OmNlcnIgPDwgIkVycm9yOiBVbmtub3duIHZpZGVvIGZvcm1hdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgY29kZWNfY29udGV4dC0+cGl4X2ZtdDsKLSAgICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob3V0cHV0KSB7Ci0gICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29weV9saW5lczsgKytpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZ3cml0ZShzb3VyY2UsIDEsIGJ5dGVzX3Blcl9saW5lLCBvdXRwdXQpICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc19wZXJfbGluZSkgewotICAgICAgICAgICAgICAgICAgc3RkOjpjZXJyIDw8ICJFcnJvcjogQ291bGQgbm90IHdyaXRlIGRhdGEgYWZ0ZXIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGNvcHlfbGluZXMgPDwgIiBsaW5lcyBmb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluX3BhdGgudmFsdWUoKSA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc291cmNlICs9IHNvdXJjZV9zdHJpZGU7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChoYXNoX2RqYjIpIHsKLSAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3B5X2xpbmVzOyArK2kpIHsKLSAgICAgICAgICAgICAgICBoYXNoX3ZhbHVlID0gREpCMkhhc2goc291cmNlLCBieXRlc19wZXJfbGluZSwgaGFzaF92YWx1ZSk7Ci0gICAgICAgICAgICAgICAgc291cmNlICs9IHNvdXJjZV9zdHJpZGU7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChoYXNoX21kNSkgewotICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvcHlfbGluZXM7ICsraSkgewotICAgICAgICAgICAgICAgIGJhc2U6Ok1ENVVwZGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgJmN0eCwKLSAgICAgICAgICAgICAgICAgICAgYmFzZTo6U3RyaW5nUGllY2UocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oc291cmNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfcGVyX2xpbmUpKTsKLSAgICAgICAgICAgICAgICBzb3VyY2UgKz0gc291cmNlX3N0cmlkZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgTk9UUkVBQ0hFRCgpOwotICAgICAgfQotCi0gICAgICAvLyBNYWtlIHN1cmUgb3VyIGRlY29kaW5nIHdlbnQgT0suCi0gICAgICBpZiAocmVzdWx0IDwgMCkgewotICAgICAgICBzdGQ6OmNlcnIgPDwgIkVycm9yOiBhdmNvZGVjX2RlY29kZSByZXR1cm5lZCAiCi0gICAgICAgICAgICAgICAgICA8PCByZXN1bHQgPDwgIiBmb3IgIiA8PCBpbl9wYXRoLnZhbHVlKCkgPDwgc3RkOjplbmRsOwotICAgICAgICByZXR1cm4gMTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gRnJlZSBvdXIgcGFja2V0LgotICAgIGF2X2ZyZWVfcGFja2V0KCZwYWNrZXQpOwotCi0gICAgaWYgKG1heF9mcmFtZXMgJiYgKGZyYW1lcyA+PSBtYXhfZnJhbWVzKSkKLSAgICAgIGJyZWFrOwotICB9IHdoaWxlIChyZWFkX3Jlc3VsdCA+PSAwKTsKLSNpZiBTSE9XX1ZFUkJPU0UKLSAgYmFzZTo6VGltZURlbHRhIHRvdGFsID0gYmFzZTo6VGltZVRpY2tzOjpIaWdoUmVzTm93KCkgLSBzdGFydDsKLSNlbmRpZgotICBMZWF2ZVRpbWluZ1NlY3Rpb24oKTsKLQotICAvLyBDbGVhbiB1cC4KLSAgaWYgKG91dHB1dCkKLSAgICBmaWxlX3V0aWw6OkNsb3NlRmlsZShvdXRwdXQpOwotCi0gIC8vIENhbGN1bGF0ZSB0aGUgc3VtIG9mIHRpbWVzLiAgTm90ZSB0aGF0IHNvbWUgb2YgdGhlc2UgbWF5IGJlIHplcm8uCi0gIGRvdWJsZSBzdW0gPSAwOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRlY29kZV90aW1lcy5zaXplKCk7ICsraSkgewotICAgIHN1bSArPSBkZWNvZGVfdGltZXNbaV07Ci0gIH0KLQotICBpZiAoc3VtID4gMCkgewotICAgIGlmICh0YXJnZXRfY29kZWMgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7Ci0gICAgICAvLyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2UgbWlsbGlzZWNvbmRzIHBlciBmcmFtZS4KLSAgICAgIC8vIEF1ZGlvIGRlY29kaW5nIGlzIHVzdWFsbHkgaW4gdGhlIG1pbGxpc2Vjb25kIG9yIHJhbmdlLCBhbmQKLSAgICAgIC8vIGJlc3QgZXhwcmVzc2VkIGluIHRpbWUgKG1zKSByYXRoZXIgdGhhbiBGUFMsIHdoaWNoIGNhbiBhcHByb2FjaAotICAgICAgLy8gaW5maW5pdHkuCi0gICAgICBkb3VibGUgbXMgPSBzdW0gLyBmcmFtZXM7Ci0gICAgICAvLyBQcmludCBvdXIgcmVzdWx0cy4KLSAgICAgIGxvZ19vdXQtPnNldGYoc3RkOjppb3M6OmZpeGVkKTsKLSAgICAgIGxvZ19vdXQtPnByZWNpc2lvbigyKTsKLSAgICAgICpsb2dfb3V0IDw8ICJUSU1FIFBFUiBGUkFNRSAoTVMpOiIgPDwgc3RkOjpzZXR3KDExKSA8PCBtcyA8PCBzdGQ6OmVuZGw7Ci0gICAgfSBlbHNlIGlmICh0YXJnZXRfY29kZWMgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7Ci0gICAgICAvLyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2UgZnJhbWVzIHBlciBzZWNvbmQuCi0gICAgICAvLyBWaWRlbyBkZWNvZGluZyBpcyBleHByZXNzZWQgaW4gRnJhbWVzIFBlciBTZWNvbmQgLSBhIHRlcm0gZWFzaWx5Ci0gICAgICAvLyB1bmRlcnN0b29kIGFuZCBzaG91bGQgZXhjZWVkIGEgdHlwaWNhbCB0YXJnZXQgb2YgMzAgZnBzLgotICAgICAgZG91YmxlIGZwcyA9IGZyYW1lcyAqIDEwMDAuMCAvIHN1bTsKLSAgICAgIC8vIFByaW50IG91ciByZXN1bHRzLgotICAgICAgbG9nX291dC0+c2V0ZihzdGQ6Omlvczo6Zml4ZWQpOwotICAgICAgbG9nX291dC0+cHJlY2lzaW9uKDIpOwotICAgICAgKmxvZ19vdXQgPDwgIkZQUzoiIDw8IHN0ZDo6c2V0dygxMSkgPDwgZnBzIDw8IHN0ZDo6ZW5kbDsKLSAgICB9Ci0gIH0KLQotI2lmIFNIT1dfVkVSQk9TRQotICAvLyBQcmludCBvdXIgcmVzdWx0cy4KLSAgbG9nX291dC0+c2V0ZihzdGQ6Omlvczo6Zml4ZWQpOwotICBsb2dfb3V0LT5wcmVjaXNpb24oMik7Ci0gICpsb2dfb3V0IDw8IHN0ZDo6ZW5kbDsKLSAgKmxvZ19vdXQgPDwgIiAgICAgRnJhbWVzOiIgPDwgc3RkOjpzZXR3KDExKSA8PCBmcmFtZXMKLSAgICAgICAgICAgPDwgc3RkOjplbmRsOwotICAqbG9nX291dCA8PCAiICAgICAgVG90YWw6IiA8PCBzdGQ6OnNldHcoMTEpIDw8IHRvdGFsLkluTWlsbGlzZWNvbmRzRigpCi0gICAgICAgICAgIDw8ICIgbXMiIDw8IHN0ZDo6ZW5kbDsKLSAgKmxvZ19vdXQgPDwgIiAgU3VtbWF0aW9uOiIgPDwgc3RkOjpzZXR3KDExKSA8PCBzdW0KLSAgICAgICAgICAgPDwgIiBtcyIgPDwgc3RkOjplbmRsOwotCi0gIGlmIChmcmFtZXMgPiAwKSB7Ci0gICAgLy8gQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIHRpbWUgcGVyIGZyYW1lLgotICAgIGRvdWJsZSBhdmVyYWdlID0gc3VtIC8gZnJhbWVzOwotCi0gICAgLy8gQ2FsY3VsYXRlIHRoZSBzdW0gb2YgdGhlIHNxdWFyZWQgZGlmZmVyZW5jZXMuCi0gICAgLy8gU3RhbmRhcmQgZGV2aWF0aW9uIHdpbGwgb25seSBiZSBhY2N1cmF0ZSBpZiBubyB0aHJlYWRzIGFyZSB1c2VkLgotICAgIC8vIFRPRE8oZmJhcmNoYXJkKTogUmV0aGluayBzdGFuZGFyZCBkZXZpYXRpb24gY2FsY3VsYXRpb24uCi0gICAgZG91YmxlIHNxdWFyZWRfc3VtID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lczsgKytpKSB7Ci0gICAgICBkb3VibGUgZGlmZmVyZW5jZSA9IGRlY29kZV90aW1lc1tpXSAtIGF2ZXJhZ2U7Ci0gICAgICBzcXVhcmVkX3N1bSArPSBkaWZmZXJlbmNlICogZGlmZmVyZW5jZTsKLSAgICB9Ci0KLSAgICAvLyBDYWxjdWxhdGUgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiAoaml0dGVyKS4KLSAgICBkb3VibGUgc3RkZGV2ID0gc3FydChzcXVhcmVkX3N1bSAvIGZyYW1lcyk7Ci0KLSAgICAqbG9nX291dCA8PCAiICAgIEF2ZXJhZ2U6IiA8PCBzdGQ6OnNldHcoMTEpIDw8IGF2ZXJhZ2UKLSAgICAgICAgICAgICA8PCAiIG1zIiA8PCBzdGQ6OmVuZGw7Ci0gICAgKmxvZ19vdXQgPDwgIiAgICAgU3RkRGV2OiIgPDwgc3RkOjpzZXR3KDExKSA8PCBzdGRkZXYKLSAgICAgICAgICAgICA8PCAiIG1zIiA8PCBzdGQ6OmVuZGw7Ci0gIH0KLSAgaWYgKGhhc2hfZGpiMikgewotICAgICpsb2dfb3V0IDw8ICIgIERKQjIgSGFzaDoiIDw8IHN0ZDo6c2V0dygxMSkgPDwgaGFzaF92YWx1ZQotICAgICAgICAgICAgIDw8ICIgICIgPDwgaW5fcGF0aC52YWx1ZSgpIDw8IHN0ZDo6ZW5kbDsKLSAgfQotICBpZiAoaGFzaF9tZDUpIHsKLSAgICBiYXNlOjpNRDVEaWdlc3QgZGlnZXN0OyAgLy8gVGhlIHJlc3VsdCBvZiB0aGUgY29tcHV0YXRpb24uCi0gICAgYmFzZTo6TUQ1RmluYWwoJmRpZ2VzdCwgJmN0eCk7Ci0gICAgKmxvZ19vdXQgPDwgIiAgIE1ENSBIYXNoOiAiIDw8IGJhc2U6Ok1ENURpZ2VzdFRvQmFzZTE2KGRpZ2VzdCkKLSAgICAgICAgICAgICA8PCAiICIgPDwgaW5fcGF0aC52YWx1ZSgpIDw8IHN0ZDo6ZW5kbDsKLSAgfQotI2VuZGlmICAvLyBTSE9XX1ZFUkJPU0UKLSNpZiBkZWZpbmVkKEVOQUJMRV9XSU5ET1dTX0VYQ0VQVElPTlMpCi0gIH0gX19leGNlcHQoRVhDRVBUSU9OX0VYRUNVVEVfSEFORExFUikgewotICAgICpsb2dfb3V0IDw8ICIgIEV4Y2VwdGlvbjoiIDw8IHN0ZDo6c2V0dygxMSkgPDwgR2V0RXhjZXB0aW9uQ29kZSgpCi0gICAgICAgICAgICAgPDwgIiAiIDw8IGluX3BhdGgudmFsdWUoKSA8PCBzdGQ6OmVuZGw7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSNlbmRpZgotICBDb21tYW5kTGluZTo6UmVzZXQoKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdmlkZW8vY2FwdHVyZS9mYWtlX3ZpZGVvX2NhcHR1cmVfZGV2aWNlLmNjIGIvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvZmFrZV92aWRlb19jYXB0dXJlX2RldmljZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEzNzE5Mi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvdmlkZW8vY2FwdHVyZS9mYWtlX3ZpZGVvX2NhcHR1cmVfZGV2aWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS92aWRlby9jYXB0dXJlL2Zha2VfdmlkZW9fY2FwdHVyZV9kZXZpY2UuaCIKLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJiYXNlL3N0cmluZ3ByaW50Zi5oIgotI2luY2x1ZGUgIm1lZGlhL2F1ZGlvL2Zha2VfYXVkaW9faW5wdXRfc3RyZWFtLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL2NvcmUvU2tCaXRtYXAuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvY29yZS9Ta0NhbnZhcy5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9jb3JlL1NrUGFpbnQuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotc3RhdGljIGNvbnN0IGludCBrRmFrZUNhcHR1cmVUaW1lb3V0TXMgPSA1MDsKLXN0YXRpYyBjb25zdCBpbnQga0Zha2VDYXB0dXJlQmVlcEN5Y2xlID0gMjA7ICAvLyBWaXN1YWwgYmVlcCBldmVyeSAxcy4KLWVudW0geyBrTnVtYmVyT2ZGYWtlRGV2aWNlcyA9IDIgfTsKLQotYm9vbCBGYWtlVmlkZW9DYXB0dXJlRGV2aWNlOjpmYWlsX25leHRfY3JlYXRlXyA9IGZhbHNlOwotCi12b2lkIEZha2VWaWRlb0NhcHR1cmVEZXZpY2U6OkdldERldmljZU5hbWVzKE5hbWVzKiBjb25zdCBkZXZpY2VfbmFtZXMpIHsKLSAgLy8gRW1wdHkgdGhlIG5hbWUgbGlzdC4KLSAgZGV2aWNlX25hbWVzLT5lcmFzZShkZXZpY2VfbmFtZXMtPmJlZ2luKCksIGRldmljZV9uYW1lcy0+ZW5kKCkpOwotCi0gIGZvciAoaW50IG4gPSAwOyBuIDwga051bWJlck9mRmFrZURldmljZXM7IG4rKykgewotICAgIE5hbWUgbmFtZTsKLSAgICBuYW1lLnVuaXF1ZV9pZCA9IFN0cmluZ1ByaW50ZigiL2Rldi92aWRlbyVkIiwgbik7Ci0gICAgbmFtZS5kZXZpY2VfbmFtZSA9IFN0cmluZ1ByaW50ZigiZmFrZV9kZXZpY2VfJWQiLCBuKTsKLSAgICBkZXZpY2VfbmFtZXMtPnB1c2hfYmFjayhuYW1lKTsKLSAgfQotfQotCi1WaWRlb0NhcHR1cmVEZXZpY2UqIEZha2VWaWRlb0NhcHR1cmVEZXZpY2U6OkNyZWF0ZShjb25zdCBOYW1lJiBkZXZpY2VfbmFtZSkgewotICBpZiAoZmFpbF9uZXh0X2NyZWF0ZV8pIHsKLSAgICBmYWlsX25leHRfY3JlYXRlXyA9IGZhbHNlOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGZvciAoaW50IG4gPSAwOyBuIDwga051bWJlck9mRmFrZURldmljZXM7ICsrbikgewotICAgIHN0ZDo6c3RyaW5nIHBvc3NpYmxlX2lkID0gU3RyaW5nUHJpbnRmKCIvZGV2L3ZpZGVvJWQiLCBuKTsKLSAgICBpZiAoZGV2aWNlX25hbWUudW5pcXVlX2lkLmNvbXBhcmUocG9zc2libGVfaWQpID09IDApIHsKLSAgICAgIHJldHVybiBuZXcgRmFrZVZpZGVvQ2FwdHVyZURldmljZShkZXZpY2VfbmFtZSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi12b2lkIEZha2VWaWRlb0NhcHR1cmVEZXZpY2U6OlNldEZhaWxOZXh0Q3JlYXRlKCkgewotICBmYWlsX25leHRfY3JlYXRlXyA9IHRydWU7Ci19Ci0KLUZha2VWaWRlb0NhcHR1cmVEZXZpY2U6OkZha2VWaWRlb0NhcHR1cmVEZXZpY2UoY29uc3QgTmFtZSYgZGV2aWNlX25hbWUpCi0gICAgOiBkZXZpY2VfbmFtZV8oZGV2aWNlX25hbWUpLAotICAgICAgb2JzZXJ2ZXJfKE5VTEwpLAotICAgICAgc3RhdGVfKGtJZGxlKSwKLSAgICAgIGNhcHR1cmVfdGhyZWFkXygiQ2FwdHVyZVRocmVhZCIpLAotICAgICAgZnJhbWVfc2l6ZV8oMCksCi0gICAgICBmcmFtZV9jb3VudF8oMCksCi0gICAgICBmcmFtZV93aWR0aF8oMCksCi0gICAgICBmcmFtZV9oZWlnaHRfKDApIHsKLX0KLQotRmFrZVZpZGVvQ2FwdHVyZURldmljZTo6fkZha2VWaWRlb0NhcHR1cmVEZXZpY2UoKSB7Ci0gIC8vIENoZWNrIGlmIHRoZSB0aHJlYWQgaXMgcnVubmluZy4KLSAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBkZXZpY2UgaGF2ZSBub3QgYmVlbiBEZUFsbG9jYXRlZCBwcm9wZXJseS4KLSAgRENIRUNLKCFjYXB0dXJlX3RocmVhZF8uSXNSdW5uaW5nKCkpOwotfQotCi12b2lkIEZha2VWaWRlb0NhcHR1cmVEZXZpY2U6OkFsbG9jYXRlKGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlciogb2JzZXJ2ZXIpIHsKLSAgaWYgKHN0YXRlXyAhPSBrSWRsZSkgewotICAgIHJldHVybjsgIC8vIFdyb25nIHN0YXRlLgotICB9Ci0KLSAgb2JzZXJ2ZXJfID0gb2JzZXJ2ZXI7Ci0gIFZpZGVvQ2FwdHVyZUNhcGFiaWxpdHkgY3VycmVudF9zZXR0aW5nczsKLSAgY3VycmVudF9zZXR0aW5ncy5jb2xvciA9IFZpZGVvQ2FwdHVyZUNhcGFiaWxpdHk6OmtJNDIwOwotICBjdXJyZW50X3NldHRpbmdzLmV4cGVjdGVkX2NhcHR1cmVfZGVsYXkgPSAwOwotICBjdXJyZW50X3NldHRpbmdzLmludGVybGFjZWQgPSBmYWxzZTsKLSAgaWYgKHdpZHRoID4gMzIwKSB7ICAvLyBWR0EKLSAgICBjdXJyZW50X3NldHRpbmdzLndpZHRoID0gNjQwOwotICAgIGN1cnJlbnRfc2V0dGluZ3MuaGVpZ2h0ID0gNDgwOwotICAgIGN1cnJlbnRfc2V0dGluZ3MuZnJhbWVfcmF0ZSA9IDMwOwotICB9IGVsc2UgeyAgLy8gUVZHQQotICAgIGN1cnJlbnRfc2V0dGluZ3Mud2lkdGggPSAzMjA7Ci0gICAgY3VycmVudF9zZXR0aW5ncy5oZWlnaHQgPSAyNDA7Ci0gICAgY3VycmVudF9zZXR0aW5ncy5mcmFtZV9yYXRlID0gMzA7Ci0gIH0KLQotICBzaXplX3QgZmFrZV9mcmFtZV9zaXplID0KLSAgICAgIGN1cnJlbnRfc2V0dGluZ3Mud2lkdGggKiBjdXJyZW50X3NldHRpbmdzLmhlaWdodCAqIDMgLyAyOwotICBmYWtlX2ZyYW1lXy5yZXNldChuZXcgdWludDhbZmFrZV9mcmFtZV9zaXplXSk7Ci0gIG1lbXNldChmYWtlX2ZyYW1lXy5nZXQoKSwgMCwgZmFrZV9mcmFtZV9zaXplKTsKLSAgZnJhbWVfc2l6ZV8gPSBmYWtlX2ZyYW1lX3NpemU7Ci0gIGZyYW1lX3dpZHRoXyA9IGN1cnJlbnRfc2V0dGluZ3Mud2lkdGg7Ci0gIGZyYW1lX2hlaWdodF8gPSBjdXJyZW50X3NldHRpbmdzLmhlaWdodDsKLQotICBzdGF0ZV8gPSBrQWxsb2NhdGVkOwotICBvYnNlcnZlcl8tPk9uRnJhbWVJbmZvKGN1cnJlbnRfc2V0dGluZ3MpOwotfQotCi12b2lkIEZha2VWaWRlb0NhcHR1cmVEZXZpY2U6OlN0YXJ0KCkgewotICBpZiAoc3RhdGVfICE9IGtBbGxvY2F0ZWQpIHsKLSAgICAgIHJldHVybjsgIC8vIFdyb25nIHN0YXRlLgotICB9Ci0gIHN0YXRlXyA9IGtDYXB0dXJpbmc7Ci0gIGNhcHR1cmVfdGhyZWFkXy5TdGFydCgpOwotICBjYXB0dXJlX3RocmVhZF8ubWVzc2FnZV9sb29wKCktPlBvc3RUYXNrKAotICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZCgmRmFrZVZpZGVvQ2FwdHVyZURldmljZTo6T25DYXB0dXJlVGFzaywKLSAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotfQotCi12b2lkIEZha2VWaWRlb0NhcHR1cmVEZXZpY2U6OlN0b3AoKSB7Ci0gIGlmIChzdGF0ZV8gIT0ga0NhcHR1cmluZykgewotICAgICAgcmV0dXJuOyAgLy8gV3Jvbmcgc3RhdGUuCi0gIH0KLSAgY2FwdHVyZV90aHJlYWRfLlN0b3AoKTsKLSAgc3RhdGVfID0ga0FsbG9jYXRlZDsKLX0KLQotdm9pZCBGYWtlVmlkZW9DYXB0dXJlRGV2aWNlOjpEZUFsbG9jYXRlKCkgewotICBpZiAoc3RhdGVfICE9IGtBbGxvY2F0ZWQgJiYgc3RhdGVfICE9IGtDYXB0dXJpbmcpIHsKLSAgICAgIHJldHVybjsgIC8vIFdyb25nIHN0YXRlLgotICB9Ci0gIGNhcHR1cmVfdGhyZWFkXy5TdG9wKCk7Ci0gIHN0YXRlXyA9IGtJZGxlOwotfQotCi1jb25zdCBWaWRlb0NhcHR1cmVEZXZpY2U6Ok5hbWUmIEZha2VWaWRlb0NhcHR1cmVEZXZpY2U6OmRldmljZV9uYW1lKCkgewotICByZXR1cm4gZGV2aWNlX25hbWVfOwotfQotCi12b2lkIEZha2VWaWRlb0NhcHR1cmVEZXZpY2U6Ok9uQ2FwdHVyZVRhc2soKSB7Ci0gIGlmIChzdGF0ZV8gIT0ga0NhcHR1cmluZykgewotICAgIHJldHVybjsKLSAgfQotCi0gIG1lbXNldChmYWtlX2ZyYW1lXy5nZXQoKSwgMCwgZnJhbWVfc2l6ZV8pOwotCi0gIFNrQml0bWFwIGJpdG1hcDsKLSAgYml0bWFwLnNldENvbmZpZyhTa0JpdG1hcDo6a0E4X0NvbmZpZywgZnJhbWVfd2lkdGhfLCBmcmFtZV9oZWlnaHRfLAotICAgICAgICAgICAgICAgICAgIGZyYW1lX3dpZHRoXyk7Ci0gIGJpdG1hcC5zZXRQaXhlbHMoZmFrZV9mcmFtZV8uZ2V0KCkpOwotCi0gIFNrQ2FudmFzIGNhbnZhcyhiaXRtYXApOwotCi0gIC8vIERyYXcgYSBzd2VlcGluZyBjaXJjbGUgdG8gc2hvdyBhbiBhbmltYXRpb24uCi0gIGludCByYWRpdXMgPSBzdGQ6Om1pbihmcmFtZV93aWR0aF8sIGZyYW1lX2hlaWdodF8pIC8gNDsKLSAgU2tSZWN0IHJlY3QgPSBTa1JlY3Q6Ok1ha2VYWVdIKAotICAgICAgZnJhbWVfd2lkdGhfIC8gMiAtIHJhZGl1cywgZnJhbWVfaGVpZ2h0XyAvIDIgLSByYWRpdXMsCi0gICAgICAyICogcmFkaXVzLCAyICogcmFkaXVzKTsKLQotICBTa1BhaW50IHBhaW50OwotICBwYWludC5zZXRTdHlsZShTa1BhaW50OjprRmlsbF9TdHlsZSk7Ci0KLSAgLy8gT25seSBZIHBsYW5lIGlzIGJlaW5nIGRyYXduIGFuZCB0aGlzIGdpdmVzIDUwJSBncmV5IG9uIHRoZSBZCi0gIC8vIHBsYW5lLiBUaGUgcmVzdWx0IGlzIGEgbGlnaHQgZ3JlZW4gY29sb3IgaW4gUkdCIHNwYWNlLgotICBwYWludC5zZXRBbHBoYSgxMjgpOwotCi0gIGludCBlbmRfYW5nbGUgPSAoZnJhbWVfY291bnRfICUga0Zha2VDYXB0dXJlQmVlcEN5Y2xlICogMzYwKSAvCi0gICAgICBrRmFrZUNhcHR1cmVCZWVwQ3ljbGU7Ci0gIGlmICghZW5kX2FuZ2xlKQotICAgIGVuZF9hbmdsZSA9IDM2MDsKLSAgY2FudmFzLmRyYXdBcmMocmVjdCwgMCwgZW5kX2FuZ2xlLCB0cnVlLCBwYWludCk7Ci0KLSAgLy8gRHJhdyBjdXJyZW50IHRpbWUuCi0gIGludCBlbGFwc2VkX21zID0ga0Zha2VDYXB0dXJlVGltZW91dE1zICogZnJhbWVfY291bnRfOwotICBpbnQgbWlsbGlzZWNvbmRzID0gZWxhcHNlZF9tcyAlIDEwMDA7Ci0gIGludCBzZWNvbmRzID0gKGVsYXBzZWRfbXMgLyAxMDAwKSAlIDYwOwotICBpbnQgbWludXRlcyA9IChlbGFwc2VkX21zIC8gMTAwMCAvIDYwKSAlIDYwOwotICBpbnQgaG91cnMgPSAoZWxhcHNlZF9tcyAvIDEwMDAgLyA2MCAvIDYwKSAlIDYwOwotCi0gIHN0ZDo6c3RyaW5nIHRpbWVfc3RyaW5nID0KLSAgICAgIGJhc2U6OlN0cmluZ1ByaW50ZigiJWQ6JTAyZDolMDJkOiUwM2QgJWQiLCBob3VycywgbWludXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzLCBtaWxsaXNlY29uZHMsIGZyYW1lX2NvdW50Xyk7Ci0gIGNhbnZhcy5zY2FsZSgzLCAzKTsKLSAgY2FudmFzLmRyYXdUZXh0KHRpbWVfc3RyaW5nLmRhdGEoKSwgdGltZV9zdHJpbmcubGVuZ3RoKCksIDMwLCAyMCwKLSAgICAgICAgICAgICAgICAgIHBhaW50KTsKLQotICBpZiAoZnJhbWVfY291bnRfICUga0Zha2VDYXB0dXJlQmVlcEN5Y2xlID09IDApIHsKLSAgICAvLyBHZW5lcmF0ZSBhIHN5bmNocm9uaXplZCBiZWVwIHNvdW5kIGlmIHRoZXJlIGlzIG9uZSBhdWRpbyBpbnB1dAotICAgIC8vIHN0cmVhbSBjcmVhdGVkLgotICAgIEZha2VBdWRpb0lucHV0U3RyZWFtOjpCZWVwT25jZSgpOwotIH0KLQotICBmcmFtZV9jb3VudF8rKzsKLQotICAvLyBHaXZlIHRoZSBjYXB0dXJlZCBmcmFtZSB0byB0aGUgb2JzZXJ2ZXIuCi0gIG9ic2VydmVyXy0+T25JbmNvbWluZ0NhcHR1cmVkRnJhbWUoZmFrZV9mcmFtZV8uZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfc2l6ZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZTo6Tm93KCkpOwotICAvLyBSZXNjaGVkdWxlIG5leHQgQ2FwdHVyZVRhc2suCi0gIGNhcHR1cmVfdGhyZWFkXy5tZXNzYWdlX2xvb3AoKS0+UG9zdERlbGF5ZWRUYXNrKAotICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgIGJhc2U6OkJpbmQoJkZha2VWaWRlb0NhcHR1cmVEZXZpY2U6Ok9uQ2FwdHVyZVRhc2ssCi0gICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyhrRmFrZUNhcHR1cmVUaW1lb3V0TXMpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdmlkZW8vY2FwdHVyZS9mYWtlX3ZpZGVvX2NhcHR1cmVfZGV2aWNlLmggYi9zcmMvbWVkaWEvdmlkZW8vY2FwdHVyZS9mYWtlX3ZpZGVvX2NhcHR1cmVfZGV2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNTA5ODIuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvZmFrZV92aWRlb19jYXB0dXJlX2RldmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gSW1wbGVtZW50YXRpb24gb2YgYSBmYWtlIFZpZGVvQ2FwdHVyZURldmljZSBjbGFzcy4gVXNlZCBmb3IgdGVzdGluZyBvdGhlcgotLy8gdmlkZW8gY2FwdHVyZSBjbGFzc2VzIHdoZW4gbm8gcmVhbCBoYXJkd2FyZSBpcyBhdmFpbGFibGUuCi0KLSNpZm5kZWYgTUVESUFfVklERU9fQ0FQVFVSRV9GQUtFX1ZJREVPX0NBUFRVUkVfREVWSUNFX0hfCi0jZGVmaW5lIE1FRElBX1ZJREVPX0NBUFRVUkVfRkFLRV9WSURFT19DQVBUVVJFX0RFVklDRV9IXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZC5oIgotI2luY2x1ZGUgIm1lZGlhL3ZpZGVvL2NhcHR1cmUvdmlkZW9fY2FwdHVyZV9kZXZpY2UuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgTUVESUFfRVhQT1JUIEZha2VWaWRlb0NhcHR1cmVEZXZpY2UgOiBwdWJsaWMgVmlkZW9DYXB0dXJlRGV2aWNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBWaWRlb0NhcHR1cmVEZXZpY2UqIENyZWF0ZShjb25zdCBOYW1lJiBkZXZpY2VfbmFtZSk7Ci0gIHZpcnR1YWwgfkZha2VWaWRlb0NhcHR1cmVEZXZpY2UoKTsKLSAgLy8gVXNlZCBmb3IgdGVzdGluZy4gVGhpcyB3aWxsIG1ha2Ugc3VyZSB0aGUgbmV4dCBjYWxsIHRvIENyZWF0ZSB3aWxsCi0gIC8vIHJldHVybiBOVUxMOwotICBzdGF0aWMgdm9pZCBTZXRGYWlsTmV4dENyZWF0ZSgpOwotCi0gIHN0YXRpYyB2b2lkIEdldERldmljZU5hbWVzKE5hbWVzKiBkZXZpY2VfbmFtZXMpOwotCi0gIC8vIFZpZGVvQ2FwdHVyZURldmljZSBpbXBsZW1lbnRhdGlvbi4KLSAgdmlydHVhbCB2b2lkIEFsbG9jYXRlKGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvQ2FwdHVyZURldmljZTo6RXZlbnRIYW5kbGVyKiBvYnNlcnZlcikgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTdGFydCgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU3RvcCgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgRGVBbGxvY2F0ZSgpIE9WRVJSSURFOwotICB2aXJ0dWFsIGNvbnN0IE5hbWUmIGRldmljZV9uYW1lKCkgT1ZFUlJJREU7Ci0KLSBwcml2YXRlOgotICAvLyBGbGFnIGluZGljYXRpbmcgdGhlIGludGVybmFsIHN0YXRlLgotICBlbnVtIEludGVybmFsU3RhdGUgewotICAgIGtJZGxlLAotICAgIGtBbGxvY2F0ZWQsCi0gICAga0NhcHR1cmluZywKLSAgICBrRXJyb3IKLSAgfTsKLSAgZXhwbGljaXQgRmFrZVZpZGVvQ2FwdHVyZURldmljZShjb25zdCBOYW1lJiBkZXZpY2VfbmFtZSk7Ci0KLSAgLy8gQ2FsbGVkIG9uIHRoZSBjYXB0dXJlX3RocmVhZF8uCi0gIHZvaWQgT25DYXB0dXJlVGFzaygpOwotCi0gIE5hbWUgZGV2aWNlX25hbWVfOwotICBWaWRlb0NhcHR1cmVEZXZpY2U6OkV2ZW50SGFuZGxlciogb2JzZXJ2ZXJfOwotICBJbnRlcm5hbFN0YXRlIHN0YXRlXzsKLSAgYmFzZTo6VGhyZWFkIGNhcHR1cmVfdGhyZWFkXzsKLSAgaW50IGZyYW1lX3NpemVfOwotICBzY29wZWRfYXJyYXk8dWludDg+IGZha2VfZnJhbWVfOwotICBpbnQgZnJhbWVfY291bnRfOwotICBpbnQgZnJhbWVfd2lkdGhfOwotICBpbnQgZnJhbWVfaGVpZ2h0XzsKLQotICBzdGF0aWMgYm9vbCBmYWlsX25leHRfY3JlYXRlXzsKLQotICBESVNBTExPV19JTVBMSUNJVF9DT05TVFJVQ1RPUlMoRmFrZVZpZGVvQ2FwdHVyZURldmljZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9WSURFT19DQVBUVVJFX0ZBS0VfVklERU9fQ0FQVFVSRV9ERVZJQ0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL2xpbnV4L3ZpZGVvX2NhcHR1cmVfZGV2aWNlX2xpbnV4LmNjIGIvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvbGludXgvdmlkZW9fY2FwdHVyZV9kZXZpY2VfbGludXguY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NjU0ZmQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvbGludXgvdmlkZW9fY2FwdHVyZV9kZXZpY2VfbGludXguY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NzkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL3ZpZGVvL2NhcHR1cmUvbGludXgvdmlkZW9fY2FwdHVyZV9kZXZpY2VfbGludXguaCIKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpZiBkZWZpbmVkKE9TX09QRU5CU0QpCi0jaW5jbHVkZSA8c3lzL3ZpZGVvaW8uaD4KLSNlbHNlCi0jaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2ZpbGVfdXRpbC5oIgotI2luY2x1ZGUgImJhc2Uvc3RyaW5ncHJpbnRmLmgiCi0KLS8vIFdvcmthcm91bmQgZm9yIHNvbWUgZGV2aWNlLiBUaGlzIHF1ZXJ5IG9mIGFsbCBjb250cm9scyBtYWdpY2FsbHkgYnJpbmdzCi0vLyBkZXZpY2UgYmFjayB0byBub3JtYWwgZnJvbSBiYWQgc3RhdGUuCi0vLyBTZWUgaHR0cDovL2NyYnVnLmNvbS85NDEzNC4KLXN0YXRpYyB2b2lkIFJlc2V0Q2FtZXJhQnlFbnVtZXJhdGluZ0lvY3Rsc0hBQ0soaW50IGZkKSB7Ci0gIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBxdWVyeV9jdHJsOwotICBtZW1zZXQoJnF1ZXJ5X2N0cmwsIDAsIHNpemVvZihxdWVyeV9jdHJsKSk7Ci0KLSAgZm9yIChxdWVyeV9jdHJsLmlkID0gVjRMMl9DSURfQkFTRTsKLSAgICAgICBxdWVyeV9jdHJsLmlkIDwgVjRMMl9DSURfTEFTVFAxOwotICAgICAgIHF1ZXJ5X2N0cmwuaWQrKykgewotICAgIGlvY3RsKGZkLCBWSURJT0NfUVVFUllDVFJMLCAmcXVlcnlfY3RybCk7Ci0gIH0KLX0KLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gTWF4IG51bWJlciBvZiB2aWRlbyBidWZmZXJzIFZpZGVvQ2FwdHVyZURldmljZUxpbnV4IGNhbiBhbGxvY2F0ZS4KLWVudW0geyBrTWF4VmlkZW9CdWZmZXJzID0gMiB9OwotLy8gVGltZW91dCBpbiBtaWNyb3NlY29uZHMgdjRsMl90aHJlYWRfIGJsb2NrcyB3YWl0aW5nIGZvciBhIGZyYW1lIGZyb20gdGhlIGh3LgotZW51bSB7IGtDYXB0dXJlVGltZW91dFVzID0gMjAwMDAwIH07Ci0vLyBUaW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSB2NGwyX3RocmVhZF8gcmVzY2hlZHVsZXMgT25DYXB0dXJlVGFzawotLy8gaWYgYW4gZXZlbnQgaXMgdHJpZ2dlcmVkIChzZWxlY3QpIGJ1dCBubyB2aWRlbyBmcmFtZSBpcyByZWFkLgotZW51bSB7IGtDYXB0dXJlU2VsZWN0V2FpdE1zID0gMTAgfTsKLS8vIE1KUEVHIGlzIHByZWZlcmVkIGlmIHRoZSB3aWR0aCBvciBoZWlnaHQgaXMgbGFyZ2VyIHRoYW4gdGhpcy4KLWVudW0geyBrTWpwZWdXaWR0aCA9IDY0MCB9OwotZW51bSB7IGtNanBlZ0hlaWdodCA9IDQ4MCB9OwotCi0vLyBWNEwyIGNvbG9yIGZvcm1hdHMgVmlkZW9DYXB0dXJlRGV2aWNlTGludXggc3VwcG9ydC4KLXN0YXRpYyBjb25zdCBpbnQzMiBrVjRsMlJhd0ZtdHNbXSA9IHsKLSAgVjRMMl9QSVhfRk1UX1lVVjQyMCwKLSAgVjRMMl9QSVhfRk1UX1lVWVYKLX07Ci0KLXN0YXRpYyBWaWRlb0NhcHR1cmVDYXBhYmlsaXR5OjpGb3JtYXQgVjRsMkNvbG9yVG9WaWRlb0NhcHR1cmVDb2xvckZvcm1hdCgKLSAgICBpbnQzMiB2NGwyX2ZvdXJjYykgewotICBWaWRlb0NhcHR1cmVDYXBhYmlsaXR5OjpGb3JtYXQgcmVzdWx0ID0gVmlkZW9DYXB0dXJlQ2FwYWJpbGl0eTo6a0NvbG9yVW5rbm93bjsKLSAgc3dpdGNoICh2NGwyX2ZvdXJjYykgewotICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyMDoKLSAgICAgIHJlc3VsdCA9IFZpZGVvQ2FwdHVyZUNhcGFiaWxpdHk6OmtJNDIwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBWNEwyX1BJWF9GTVRfWVVZVjoKLSAgICAgIHJlc3VsdCA9IFZpZGVvQ2FwdHVyZUNhcGFiaWxpdHk6OmtZVVkyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBWNEwyX1BJWF9GTVRfTUpQRUc6Ci0gICAgICByZXN1bHQgPSBWaWRlb0NhcHR1cmVDYXBhYmlsaXR5OjprTUpQRUc7Ci0gIH0KLSAgRENIRUNLX05FKHJlc3VsdCwgVmlkZW9DYXB0dXJlQ2FwYWJpbGl0eTo6a0NvbG9yVW5rbm93bik7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgVmlkZW9DYXB0dXJlRGV2aWNlOjpHZXREZXZpY2VOYW1lcyhOYW1lcyogZGV2aWNlX25hbWVzKSB7Ci0gIGludCBmZCA9IC0xOwotCi0gIC8vIEVtcHR5IHRoZSBuYW1lIGxpc3QuCi0gIGRldmljZV9uYW1lcy0+Y2xlYXIoKTsKLQotICBGaWxlUGF0aCBwYXRoKCIvZGV2LyIpOwotICBmaWxlX3V0aWw6OkZpbGVFbnVtZXJhdG9yIGVudW1lcmF0b3IoCi0gICAgICBwYXRoLCBmYWxzZSwgZmlsZV91dGlsOjpGaWxlRW51bWVyYXRvcjo6RklMRVMsICJ2aWRlbyoiKTsKLQotICB3aGlsZSAoIWVudW1lcmF0b3IuTmV4dCgpLmVtcHR5KCkpIHsKLSAgICBmaWxlX3V0aWw6OkZpbGVFbnVtZXJhdG9yOjpGaW5kSW5mbyBpbmZvOwotICAgIGVudW1lcmF0b3IuR2V0RmluZEluZm8oJmluZm8pOwotCi0gICAgTmFtZSBuYW1lOwotICAgIG5hbWUudW5pcXVlX2lkID0gcGF0aC52YWx1ZSgpICsgaW5mby5maWxlbmFtZTsKLSAgICBpZiAoKGZkID0gb3BlbihuYW1lLnVuaXF1ZV9pZC5jX3N0cigpICwgT19SRE9OTFkpKSA8IDApIHsKLSAgICAgIC8vIEZhaWxlZCB0byBvcGVuIHRoaXMgZGV2aWNlLgotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIC8vIFRlc3QgaWYgdGhpcyBpcyBhIFY0TDIgY2FwdHVyZSBkZXZpY2UuCi0gICAgdjRsMl9jYXBhYmlsaXR5IGNhcDsKLSAgICBpZiAoKGlvY3RsKGZkLCBWSURJT0NfUVVFUllDQVAsICZjYXApID09IDApICYmCi0gICAgICAgIChjYXAuY2FwYWJpbGl0aWVzICYgVjRMMl9DQVBfVklERU9fQ0FQVFVSRSkgJiYKLSAgICAgICAgIShjYXAuY2FwYWJpbGl0aWVzICYgVjRMMl9DQVBfVklERU9fT1VUUFVUKSkgewotICAgICAgLy8gVGhpcyBpcyBhIFY0TDIgdmlkZW8gY2FwdHVyZSBkZXZpY2UKLSAgICAgIG5hbWUuZGV2aWNlX25hbWUgPSBTdHJpbmdQcmludGYoIiVzIiwgY2FwLmNhcmQpOwotICAgICAgZGV2aWNlX25hbWVzLT5wdXNoX2JhY2sobmFtZSk7Ci0gICAgfQotICAgIGNsb3NlKGZkKTsKLSAgfQotfQotCi1WaWRlb0NhcHR1cmVEZXZpY2UqIFZpZGVvQ2FwdHVyZURldmljZTo6Q3JlYXRlKGNvbnN0IE5hbWUmIGRldmljZV9uYW1lKSB7Ci0gIFZpZGVvQ2FwdHVyZURldmljZUxpbnV4KiBzZWxmID0gbmV3IFZpZGVvQ2FwdHVyZURldmljZUxpbnV4KGRldmljZV9uYW1lKTsKLSAgaWYgKCFzZWxmKQotICAgIHJldHVybiBOVUxMOwotICAvLyBUZXN0IG9wZW5pbmcgdGhlIGRldmljZSBkcml2ZXIuIFRoaXMgaXMgdG8gbWFrZSBzdXJlIGl0IGlzIGF2YWlsYWJsZS4KLSAgLy8gV2Ugd2lsbCByZW9wZW4gaXQgYWdhaW4gaW4gb3VyIHdvcmtlciB0aHJlYWQgd2hlbiBzb21lb25lCi0gIC8vIGFsbG9jYXRlcyB0aGUgY2FtZXJhLgotICBpbnQgZmQgPSBvcGVuKGRldmljZV9uYW1lLnVuaXF1ZV9pZC5jX3N0cigpLCBPX1JET05MWSk7Ci0gIGlmIChmZCA8IDApIHsKLSAgICBEVkxPRygxKSA8PCAiQ2Fubm90IG9wZW4gZGV2aWNlIjsKLSAgICBkZWxldGUgc2VsZjsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBjbG9zZShmZCk7Ci0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLVZpZGVvQ2FwdHVyZURldmljZUxpbnV4OjpWaWRlb0NhcHR1cmVEZXZpY2VMaW51eChjb25zdCBOYW1lJiBkZXZpY2VfbmFtZSkKLSAgICA6IHN0YXRlXyhrSWRsZSksCi0gICAgICBvYnNlcnZlcl8oTlVMTCksCi0gICAgICBkZXZpY2VfbmFtZV8oZGV2aWNlX25hbWUpLAotICAgICAgZGV2aWNlX2ZkXygtMSksCi0gICAgICB2NGwyX3RocmVhZF8oIlY0TDJUaHJlYWQiKSwKLSAgICAgIGJ1ZmZlcl9wb29sXyhOVUxMKSwKLSAgICAgIGJ1ZmZlcl9wb29sX3NpemVfKDApIHsKLX0KLQotVmlkZW9DYXB0dXJlRGV2aWNlTGludXg6On5WaWRlb0NhcHR1cmVEZXZpY2VMaW51eCgpIHsKLSAgc3RhdGVfID0ga0lkbGU7Ci0gIC8vIENoZWNrIGlmIHRoZSB0aHJlYWQgaXMgcnVubmluZy4KLSAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBkZXZpY2UgaGF2ZSBub3QgYmVlbiBEZUFsbG9jYXRlZCBwcm9wZXJseS4KLSAgRENIRUNLKCF2NGwyX3RocmVhZF8uSXNSdW5uaW5nKCkpOwotCi0gIHY0bDJfdGhyZWFkXy5TdG9wKCk7Ci0gIGlmIChkZXZpY2VfZmRfID49IDApIHsKLSAgICBjbG9zZShkZXZpY2VfZmRfKTsKLSAgfQotfQotCi12b2lkIFZpZGVvQ2FwdHVyZURldmljZUxpbnV4OjpBbGxvY2F0ZShpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEhhbmRsZXIqIG9ic2VydmVyKSB7Ci0gIGlmICh2NGwyX3RocmVhZF8uSXNSdW5uaW5nKCkpIHsKLSAgICByZXR1cm47ICAvLyBXcm9uZyBzdGF0ZS4KLSAgfQotICB2NGwyX3RocmVhZF8uU3RhcnQoKTsKLSAgdjRsMl90aHJlYWRfLm1lc3NhZ2VfbG9vcCgpLT5Qb3N0VGFzaygKLSAgICAgIEZST01fSEVSRSwKLSAgICAgIGJhc2U6OkJpbmQoJlZpZGVvQ2FwdHVyZURldmljZUxpbnV4OjpPbkFsbG9jYXRlLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLAotICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmcmFtZV9yYXRlLCBvYnNlcnZlcikpOwotfQotCi12b2lkIFZpZGVvQ2FwdHVyZURldmljZUxpbnV4OjpTdGFydCgpIHsKLSAgaWYgKCF2NGwyX3RocmVhZF8uSXNSdW5uaW5nKCkpIHsKLSAgICByZXR1cm47ICAvLyBXcm9uZyBzdGF0ZS4KLSAgfQotICB2NGwyX3RocmVhZF8ubWVzc2FnZV9sb29wKCktPlBvc3RUYXNrKAotICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZCgmVmlkZW9DYXB0dXJlRGV2aWNlTGludXg6Ok9uU3RhcnQsIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLX0KLQotdm9pZCBWaWRlb0NhcHR1cmVEZXZpY2VMaW51eDo6U3RvcCgpIHsKLSAgaWYgKCF2NGwyX3RocmVhZF8uSXNSdW5uaW5nKCkpIHsKLSAgICByZXR1cm47ICAvLyBXcm9uZyBzdGF0ZS4KLSAgfQotICB2NGwyX3RocmVhZF8ubWVzc2FnZV9sb29wKCktPlBvc3RUYXNrKAotICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZCgmVmlkZW9DYXB0dXJlRGV2aWNlTGludXg6Ok9uU3RvcCwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotfQotCi12b2lkIFZpZGVvQ2FwdHVyZURldmljZUxpbnV4OjpEZUFsbG9jYXRlKCkgewotICBpZiAoIXY0bDJfdGhyZWFkXy5Jc1J1bm5pbmcoKSkgewotICAgIHJldHVybjsgIC8vIFdyb25nIHN0YXRlLgotICB9Ci0gIHY0bDJfdGhyZWFkXy5tZXNzYWdlX2xvb3AoKS0+UG9zdFRhc2soCi0gICAgICBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kKCZWaWRlb0NhcHR1cmVEZXZpY2VMaW51eDo6T25EZUFsbG9jYXRlLAotICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gIHY0bDJfdGhyZWFkXy5TdG9wKCk7Ci0KLSAgLy8gTWFrZSBzdXJlIG5vIGJ1ZmZlcnMgYXJlIHN0aWxsIGFsbG9jYXRlZC4KLSAgLy8gVGhpcyBjYW4gaGFwcGVuICh0aGVvcmV0aWNhbGx5KSBpZiBhbiBlcnJvciBvY2N1cnMgd2hlbiB0cnlpbmcgdG8gc3RvcAotICAvLyB0aGUgY2FtZXJhLgotICBEZUFsbG9jYXRlVmlkZW9CdWZmZXJzKCk7Ci19Ci0KLWNvbnN0IFZpZGVvQ2FwdHVyZURldmljZTo6TmFtZSYgVmlkZW9DYXB0dXJlRGV2aWNlTGludXg6OmRldmljZV9uYW1lKCkgewotICByZXR1cm4gZGV2aWNlX25hbWVfOwotfQotCi12b2lkIFZpZGVvQ2FwdHVyZURldmljZUxpbnV4OjpPbkFsbG9jYXRlKGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlciogb2JzZXJ2ZXIpIHsKLSAgRENIRUNLX0VRKHY0bDJfdGhyZWFkXy5tZXNzYWdlX2xvb3AoKSwgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7Ci0KLSAgb2JzZXJ2ZXJfID0gb2JzZXJ2ZXI7Ci0KLSAgLy8gTmVlZCB0byBvcGVuIGNhbWVyYSB3aXRoIE9fUkRXUiBhZnRlciBMaW51eCBrZXJuZWwgMy4zLgotICBpZiAoKGRldmljZV9mZF8gPSBvcGVuKGRldmljZV9uYW1lXy51bmlxdWVfaWQuY19zdHIoKSwgT19SRFdSKSkgPCAwKSB7Ci0gICAgU2V0RXJyb3JTdGF0ZSgiRmFpbGVkIHRvIG9wZW4gVjRMMiBkZXZpY2UgZHJpdmVyLiIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFRlc3QgaWYgdGhpcyBpcyBhIFY0TDIgY2FwdHVyZSBkZXZpY2UuCi0gIHY0bDJfY2FwYWJpbGl0eSBjYXA7Ci0gIGlmICghKChpb2N0bChkZXZpY2VfZmRfLCBWSURJT0NfUVVFUllDQVAsICZjYXApID09IDApICYmCi0gICAgICAoY2FwLmNhcGFiaWxpdGllcyAmIFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUpICYmCi0gICAgICAhKGNhcC5jYXBhYmlsaXRpZXMgJiBWNEwyX0NBUF9WSURFT19PVVRQVVQpKSkgewotICAgIC8vIFRoaXMgaXMgbm90IGEgVjRMMiB2aWRlbyBjYXB0dXJlIGRldmljZS4KLSAgICBjbG9zZShkZXZpY2VfZmRfKTsKLSAgICBkZXZpY2VfZmRfID0gLTE7Ci0gICAgU2V0RXJyb3JTdGF0ZSgiVGhpcyBpcyBub3QgYSBWNEwyIHZpZGVvIGNhcHR1cmUgZGV2aWNlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdjRsMl9mb3JtYXQgdmlkZW9fZm10OwotICBtZW1zZXQoJnZpZGVvX2ZtdCwgMCwgc2l6ZW9mKHZpZGVvX2ZtdCkpOwotICB2aWRlb19mbXQudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLSAgdmlkZW9fZm10LmZtdC5waXguc2l6ZWltYWdlID0gMDsKLSAgdmlkZW9fZm10LmZtdC5waXgud2lkdGggPSB3aWR0aDsKLSAgdmlkZW9fZm10LmZtdC5waXguaGVpZ2h0ID0gaGVpZ2h0OwotCi0gIC8vIFNvbWUgZGV2aWNlIGZhaWxlZCBpbiBmaXJzdCBWSURJT0NfVFJZX0ZNVCB3aXRoIEVCVVNZIG9yIEVJTy4KLSAgLy8gQnV0IHNlY29uZCBWSURJT0NfVFJZX0ZNVCBzdWNjZWVkcy4KLSAgLy8gU2VlIGh0dHA6Ly9jcmJ1Zy5jb20vOTQxMzQuCi0gIC8vIEZvciBsYXJnZSByZXNvbHV0aW9ucywgZmF2b3VyIG1qcGVnIG92ZXIgcmF3IGZvcm1hdHMuCi0gIGJvb2wgZm9ybWF0X21hdGNoID0gZmFsc2U7Ci0gIHN0ZDo6bGlzdDxpbnQ+IHY0bDJfZm9ybWF0czsKLQotICBpZiAod2lkdGggPiBrTWpwZWdXaWR0aCB8fCBoZWlnaHQgPiBrTWpwZWdIZWlnaHQpIHsKLSAgICB2NGwyX2Zvcm1hdHMucHVzaF9iYWNrKFY0TDJfUElYX0ZNVF9NSlBFRyk7Ci0gIH0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheXNpemUoa1Y0bDJSYXdGbXRzKTsgKytpKSB7Ci0gICAgdjRsMl9mb3JtYXRzLnB1c2hfYmFjayhrVjRsMlJhd0ZtdHNbaV0pOwotICB9Ci0KLSAgZm9yIChzdGQ6Omxpc3Q8aW50Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB2NGwyX2Zvcm1hdHMuYmVnaW4oKTsKLSAgICAgICBpdCAhPSB2NGwyX2Zvcm1hdHMuZW5kKCkgJiYgIWZvcm1hdF9tYXRjaDsgKytpdCkgewotICAgIHZpZGVvX2ZtdC5mbXQucGl4LnBpeGVsZm9ybWF0ID0gKml0OwotICAgIGZvciAoaW50IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgMiAmJiAhZm9ybWF0X21hdGNoOyArK2F0dGVtcHQpIHsKLSAgICAgIFJlc2V0Q2FtZXJhQnlFbnVtZXJhdGluZ0lvY3Rsc0hBQ0soZGV2aWNlX2ZkXyk7Ci0gICAgICBpZiAoaW9jdGwoZGV2aWNlX2ZkXywgVklESU9DX1RSWV9GTVQsICZ2aWRlb19mbXQpIDwgMCkgewotICAgICAgICBpZiAoZXJybm8gIT0gRUlPKQotICAgICAgICAgIGJyZWFrOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZm9ybWF0X21hdGNoID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoIWZvcm1hdF9tYXRjaCkgewotICAgIFNldEVycm9yU3RhdGUoIkZhaWxlZCB0byBmaW5kIHN1cHBvcnRlZCBjYW1lcmEgZm9ybWF0LiIpOwotICAgIHJldHVybjsKLSAgfQotICAvLyBTZXQgZm9ybWF0IGFuZCBmcmFtZSBzaXplIG5vdy4KLSAgaWYgKGlvY3RsKGRldmljZV9mZF8sIFZJRElPQ19TX0ZNVCwgJnZpZGVvX2ZtdCkgPCAwKSB7Ci0gICAgU2V0RXJyb3JTdGF0ZSgiRmFpbGVkIHRvIHNldCBjYW1lcmEgZm9ybWF0Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gU3RvcmUgb3VyIGN1cnJlbnQgd2lkdGggYW5kIGhlaWdodC4KLSAgVmlkZW9DYXB0dXJlQ2FwYWJpbGl0eSBjdXJyZW50X3NldHRpbmdzOwotICBjdXJyZW50X3NldHRpbmdzLmNvbG9yID0gVjRsMkNvbG9yVG9WaWRlb0NhcHR1cmVDb2xvckZvcm1hdCgKLSAgICAgIHZpZGVvX2ZtdC5mbXQucGl4LnBpeGVsZm9ybWF0KTsKLSAgY3VycmVudF9zZXR0aW5ncy53aWR0aCAgPSB2aWRlb19mbXQuZm10LnBpeC53aWR0aDsKLSAgY3VycmVudF9zZXR0aW5ncy5oZWlnaHQgPSB2aWRlb19mbXQuZm10LnBpeC5oZWlnaHQ7Ci0gIGN1cnJlbnRfc2V0dGluZ3MuZnJhbWVfcmF0ZSA9IGZyYW1lX3JhdGU7Ci0gIGN1cnJlbnRfc2V0dGluZ3MuZXhwZWN0ZWRfY2FwdHVyZV9kZWxheSA9IDA7Ci0gIGN1cnJlbnRfc2V0dGluZ3MuaW50ZXJsYWNlZCA9IGZhbHNlOwotCi0gIHN0YXRlXyA9IGtBbGxvY2F0ZWQ7Ci0gIC8vIFJlcG9ydCB0aGUgcmVzdWx0aW5nIGZyYW1lIHNpemUgdG8gdGhlIG9ic2VydmVyLgotICBvYnNlcnZlcl8tPk9uRnJhbWVJbmZvKGN1cnJlbnRfc2V0dGluZ3MpOwotfQotCi12b2lkIFZpZGVvQ2FwdHVyZURldmljZUxpbnV4OjpPbkRlQWxsb2NhdGUoKSB7Ci0gIERDSEVDS19FUSh2NGwyX3RocmVhZF8ubWVzc2FnZV9sb29wKCksIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotCi0gIC8vIElmIHdlIGFyZSBpbiBlcnJvciBzdGF0ZSBvciBjYXB0dXJpbmcKLSAgLy8gdHJ5IHRvIHN0b3AgdGhlIGNhbWVyYS4KLSAgaWYgKHN0YXRlXyA9PSBrQ2FwdHVyaW5nKSB7Ci0gICAgT25TdG9wKCk7Ci0gIH0KLSAgaWYgKHN0YXRlXyA9PSBrQWxsb2NhdGVkKSB7Ci0gICAgc3RhdGVfID0ga0lkbGU7Ci0gIH0KLQotICAvLyBXZSBuZWVkIHRvIGNsb3NlIGFuZCBvcGVuIHRoZSBkZXZpY2UgaWYgd2Ugd2FudCB0byBjaGFuZ2UgdGhlIHNldHRpbmdzCi0gIC8vIE90aGVyd2lzZSBWSURJT0NfU19GTVQgd2lsbCByZXR1cm4gZXJyb3IKLSAgLy8gU2FkIGJ1dCB0cnVlLgotICBjbG9zZShkZXZpY2VfZmRfKTsKLSAgZGV2aWNlX2ZkXyA9IC0xOwotfQotCi12b2lkIFZpZGVvQ2FwdHVyZURldmljZUxpbnV4OjpPblN0YXJ0KCkgewotICBEQ0hFQ0tfRVEodjRsMl90aHJlYWRfLm1lc3NhZ2VfbG9vcCgpLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLQotICBpZiAoc3RhdGVfICE9IGtBbGxvY2F0ZWQpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoIUFsbG9jYXRlVmlkZW9CdWZmZXJzKCkpIHsKLSAgICAvLyBFcnJvciwgV2UgY2FuIG5vdCByZWNvdmVyLgotICAgIFNldEVycm9yU3RhdGUoIkFsbG9jYXRlIGJ1ZmZlciBmYWlsZWQiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBTdGFydCBVVkMgY2FtZXJhLgotICB2NGwyX2J1Zl90eXBlIHR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0gIGlmIChpb2N0bChkZXZpY2VfZmRfLCBWSURJT0NfU1RSRUFNT04sICZ0eXBlKSA9PSAtMSkgewotICAgIFNldEVycm9yU3RhdGUoIlZJRElPQ19TVFJFQU1PTiBmYWlsZWQiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGF0ZV8gPSBrQ2FwdHVyaW5nOwotICAvLyBQb3N0IHRhc2sgdG8gc3RhcnQgZmV0Y2hpbmcgZnJhbWVzIGZyb20gdjRsMi4KLSAgdjRsMl90aHJlYWRfLm1lc3NhZ2VfbG9vcCgpLT5Qb3N0VGFzaygKLSAgICAgIEZST01fSEVSRSwKLSAgICAgIGJhc2U6OkJpbmQoJlZpZGVvQ2FwdHVyZURldmljZUxpbnV4OjpPbkNhcHR1cmVUYXNrLAotICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci19Ci0KLXZvaWQgVmlkZW9DYXB0dXJlRGV2aWNlTGludXg6Ok9uU3RvcCgpIHsKLSAgRENIRUNLX0VRKHY0bDJfdGhyZWFkXy5tZXNzYWdlX2xvb3AoKSwgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7Ci0KLSAgc3RhdGVfID0ga0FsbG9jYXRlZDsKLQotICB2NGwyX2J1Zl90eXBlIHR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0gIGlmIChpb2N0bChkZXZpY2VfZmRfLCBWSURJT0NfU1RSRUFNT0ZGLCAmdHlwZSkgPCAwKSB7Ci0gICAgU2V0RXJyb3JTdGF0ZSgiVklESU9DX1NUUkVBTU9GRiBmYWlsZWQiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy8gV2UgZG9uJ3QgZGFyZSB0byBkZWFsbG9jYXRlIHRoZSBidWZmZXJzIGlmIHdlIGNhbid0IHN0b3AKLSAgLy8gdGhlIGNhcHR1cmUgZGV2aWNlLgotICBEZUFsbG9jYXRlVmlkZW9CdWZmZXJzKCk7Ci19Ci0KLXZvaWQgVmlkZW9DYXB0dXJlRGV2aWNlTGludXg6Ok9uQ2FwdHVyZVRhc2soKSB7Ci0gIERDSEVDS19FUSh2NGwyX3RocmVhZF8ubWVzc2FnZV9sb29wKCksIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotCi0gIGlmIChzdGF0ZV8gIT0ga0NhcHR1cmluZykgewotICAgIHJldHVybjsKLSAgfQotCi0gIGZkX3NldCByX3NldDsKLSAgRkRfWkVSTygmcl9zZXQpOwotICBGRF9TRVQoZGV2aWNlX2ZkXywgJnJfc2V0KTsKLSAgdGltZXZhbCB0aW1lb3V0OwotCi0gIHRpbWVvdXQudHZfc2VjID0gMDsKLSAgdGltZW91dC50dl91c2VjID0ga0NhcHR1cmVUaW1lb3V0VXM7Ci0KLSAgLy8gRmlyc3QgYXJndW1lbnQgdG8gc2VsZWN0IGlzIHRoZSBoaWdoZXN0IG51bWJlcmVkIGZpbGUgZGVzY3JpcHRvciArMS4KLSAgLy8gUmVmZXIgdG8gaHR0cDovL2xpbnV4LmRpZS5uZXQvbWFuLzIvc2VsZWN0IGZvciBtb3JlIGluZm9ybWF0aW9uLgotICBpbnQgcmVzdWx0ID0gc2VsZWN0KGRldmljZV9mZF8gKyAxLCAmcl9zZXQsIE5VTEwsIE5VTEwsICZ0aW1lb3V0KTsKLSAgLy8gQ2hlY2sgaWYgc2VsZWN0IGhhdmUgZmFpbGVkLgotICBpZiAocmVzdWx0IDwgMCkgewotICAgIC8vIEVJTlRSIGlzIGEgc2lnbmFsLiBUaGlzIGlzIG5vdCByZWFsbHkgYW4gZXJyb3IuCi0gICAgaWYgKGVycm5vICE9IEVJTlRSKSB7Ci0gICAgICBTZXRFcnJvclN0YXRlKCJTZWxlY3QgZmFpbGVkIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHY0bDJfdGhyZWFkXy5tZXNzYWdlX2xvb3AoKS0+UG9zdERlbGF5ZWRUYXNrKAotICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgIGJhc2U6OkJpbmQoJlZpZGVvQ2FwdHVyZURldmljZUxpbnV4OjpPbkNhcHR1cmVUYXNrLAotICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAotICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoa0NhcHR1cmVTZWxlY3RXYWl0TXMpKTsKLSAgfQotCi0gIC8vIENoZWNrIGlmIHRoZSBkcml2ZXIgaGF2ZSBmaWxsZWQgYSBidWZmZXIuCi0gIGlmIChGRF9JU1NFVChkZXZpY2VfZmRfLCAmcl9zZXQpKSB7Ci0gICAgdjRsMl9idWZmZXIgYnVmZmVyOwotICAgIG1lbXNldCgmYnVmZmVyLCAwLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgYnVmZmVyLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0gICAgYnVmZmVyLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7Ci0gICAgLy8gRGVxdWV1ZSBhIGJ1ZmZlci4KLSAgICBpZiAoaW9jdGwoZGV2aWNlX2ZkXywgVklESU9DX0RRQlVGLCAmYnVmZmVyKSA9PSAwKSB7Ci0gICAgICBvYnNlcnZlcl8tPk9uSW5jb21pbmdDYXB0dXJlZEZyYW1lKAotICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4Kj4gKGJ1ZmZlcl9wb29sX1tidWZmZXIuaW5kZXhdLnN0YXJ0KSwKLSAgICAgICAgICBidWZmZXIuYnl0ZXN1c2VkLCBiYXNlOjpUaW1lOjpOb3coKSk7Ci0KLSAgICAgIC8vIEVucXVldWUgdGhlIGJ1ZmZlciBhZ2Fpbi4KLSAgICAgIGlmIChpb2N0bChkZXZpY2VfZmRfLCBWSURJT0NfUUJVRiwgJmJ1ZmZlcikgPT0gLTEpIHsKLSAgICAgICAgU2V0RXJyb3JTdGF0ZSgKLSAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiRmFpbGVkIHRvIGVucXVldWUgY2FwdHVyZSBidWZmZXIgZXJybm8gJWQiLCBlcnJubykpOwotICAgICAgfQotICAgIH0gIC8vIEVsc2Ugd2FpdCBmb3IgbmV4dCBldmVudC4KLSAgfQotCi0gIHY0bDJfdGhyZWFkXy5tZXNzYWdlX2xvb3AoKS0+UG9zdFRhc2soCi0gICAgICBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kKCZWaWRlb0NhcHR1cmVEZXZpY2VMaW51eDo6T25DYXB0dXJlVGFzaywKLSAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotfQotCi1ib29sIFZpZGVvQ2FwdHVyZURldmljZUxpbnV4OjpBbGxvY2F0ZVZpZGVvQnVmZmVycygpIHsKLSAgdjRsMl9yZXF1ZXN0YnVmZmVycyByX2J1ZmZlcjsKLSAgbWVtc2V0KCZyX2J1ZmZlciwgMCwgc2l6ZW9mKHJfYnVmZmVyKSk7Ci0KLSAgcl9idWZmZXIudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLSAgcl9idWZmZXIubWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKLSAgcl9idWZmZXIuY291bnQgPSBrTWF4VmlkZW9CdWZmZXJzOwotCi0gIGlmIChpb2N0bChkZXZpY2VfZmRfLCBWSURJT0NfUkVRQlVGUywgJnJfYnVmZmVyKSA8IDApIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAocl9idWZmZXIuY291bnQgPiBrTWF4VmlkZW9CdWZmZXJzKSB7Ci0gICAgcl9idWZmZXIuY291bnQgPSBrTWF4VmlkZW9CdWZmZXJzOwotICB9Ci0KLSAgYnVmZmVyX3Bvb2xfc2l6ZV8gPSByX2J1ZmZlci5jb3VudDsKLQotICAvLyBNYXAgdGhlIGJ1ZmZlcnMuCi0gIGJ1ZmZlcl9wb29sXyA9IG5ldyBCdWZmZXJbcl9idWZmZXIuY291bnRdOwotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHJfYnVmZmVyLmNvdW50OyBpKyspIHsKLSAgICB2NGwyX2J1ZmZlciBidWZmZXI7Ci0gICAgbWVtc2V0KCZidWZmZXIsIDAsIHNpemVvZihidWZmZXIpKTsKLSAgICBidWZmZXIudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLSAgICBidWZmZXIubWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKLSAgICBidWZmZXIuaW5kZXggPSBpOwotCi0gICAgaWYgKGlvY3RsKGRldmljZV9mZF8sIFZJRElPQ19RVUVSWUJVRiwgJmJ1ZmZlcikgPCAwKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYnVmZmVyX3Bvb2xfW2ldLnN0YXJ0ID0gbW1hcChOVUxMLCBidWZmZXIubGVuZ3RoLCBQUk9UX1JFQUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfU0hBUkVELCBkZXZpY2VfZmRfLCBidWZmZXIubS5vZmZzZXQpOwotICAgIGlmIChidWZmZXJfcG9vbF9baV0uc3RhcnQgPT0gTUFQX0ZBSUxFRCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBidWZmZXJfcG9vbF9baV0ubGVuZ3RoID0gYnVmZmVyLmxlbmd0aDsKLSAgICAvLyBFbnF1ZXVlIHRoZSBidWZmZXIgaW4gdGhlIGRyaXZlcnMgaW5jb21pbmcgcXVldWUuCi0gICAgaWYgKGlvY3RsKGRldmljZV9mZF8sIFZJRElPQ19RQlVGLCAmYnVmZmVyKSA8IDApIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgVmlkZW9DYXB0dXJlRGV2aWNlTGludXg6OkRlQWxsb2NhdGVWaWRlb0J1ZmZlcnMoKSB7Ci0gIGlmICghYnVmZmVyX3Bvb2xfKQotICAgIHJldHVybjsKLQotICAvLyBVbm1hcHMgYnVmZmVycy4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWZmZXJfcG9vbF9zaXplXzsgaSsrKSB7Ci0gICAgbXVubWFwKGJ1ZmZlcl9wb29sX1tpXS5zdGFydCwgYnVmZmVyX3Bvb2xfW2ldLmxlbmd0aCk7Ci0gIH0KLSAgdjRsMl9yZXF1ZXN0YnVmZmVycyByX2J1ZmZlcjsKLSAgbWVtc2V0KCZyX2J1ZmZlciwgMCwgc2l6ZW9mKHJfYnVmZmVyKSk7Ci0gIHJfYnVmZmVyLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0gIHJfYnVmZmVyLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7Ci0gIHJfYnVmZmVyLmNvdW50ID0gMDsKLQotICBpZiAoaW9jdGwoZGV2aWNlX2ZkXywgVklESU9DX1JFUUJVRlMsICZyX2J1ZmZlcikgPCAwKSB7Ci0gICAgU2V0RXJyb3JTdGF0ZSgiRmFpbGVkIHRvIHJlc2V0IGJ1Zi4iKTsKLSAgfQotCi0gIGRlbGV0ZSBbXSBidWZmZXJfcG9vbF87Ci0gIGJ1ZmZlcl9wb29sXyA9IE5VTEw7Ci0gIGJ1ZmZlcl9wb29sX3NpemVfID0gMDsKLX0KLQotdm9pZCBWaWRlb0NhcHR1cmVEZXZpY2VMaW51eDo6U2V0RXJyb3JTdGF0ZShjb25zdCBzdGQ6OnN0cmluZyYgcmVhc29uKSB7Ci0gIERWTE9HKDEpIDw8IHJlYXNvbjsKLSAgc3RhdGVfID0ga0Vycm9yOwotICBvYnNlcnZlcl8tPk9uRXJyb3IoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdmlkZW8vY2FwdHVyZS9saW51eC92aWRlb19jYXB0dXJlX2RldmljZV9saW51eC5oIGIvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvbGludXgvdmlkZW9fY2FwdHVyZV9kZXZpY2VfbGludXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFkMmExOS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvdmlkZW8vY2FwdHVyZS9saW51eC92aWRlb19jYXB0dXJlX2RldmljZV9saW51eC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gTGludXggc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgVmlkZW9DYXB0dXJlRGV2aWNlLgotLy8gVjRMMiBpcyB1c2VkIGZvciBjYXB0dXJpbmcuIFY0TDIgZG9lcyBub3QgcHJvdmlkZSBpdHMgb3duIHRocmVhZCBmb3IKLS8vIGNhcHR1cmluZyBzbyB0aGlzIGltcGxlbWVudGF0aW9uIHVzZXMgYSBDaHJvbWl1bSB0aHJlYWQgZm9yIGZldGNoaW5nIGZyYW1lcwotLy8gZnJvbSBWNEwyLgotCi0jaWZuZGVmIE1FRElBX1ZJREVPX0NBUFRVUkVfTElOVVhfVklERU9fQ0FQVFVSRV9ERVZJQ0VfTElOVVhfSF8KLSNkZWZpbmUgTUVESUFfVklERU9fQ0FQVFVSRV9MSU5VWF9WSURFT19DQVBUVVJFX0RFVklDRV9MSU5VWF9IXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkLmgiCi0jaW5jbHVkZSAibWVkaWEvdmlkZW8vY2FwdHVyZS92aWRlb19jYXB0dXJlX2RldmljZS5oIgotI2luY2x1ZGUgIm1lZGlhL3ZpZGVvL2NhcHR1cmUvdmlkZW9fY2FwdHVyZV90eXBlcy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBWaWRlb0NhcHR1cmVEZXZpY2VMaW51eCA6IHB1YmxpYyBWaWRlb0NhcHR1cmVEZXZpY2UgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgVmlkZW9DYXB0dXJlRGV2aWNlTGludXgoY29uc3QgTmFtZSYgZGV2aWNlX25hbWUpOwotICB2aXJ0dWFsIH5WaWRlb0NhcHR1cmVEZXZpY2VMaW51eCgpOwotCi0gIC8vIFZpZGVvQ2FwdHVyZURldmljZSBpbXBsZW1lbnRhdGlvbi4KLSAgdmlydHVhbCB2b2lkIEFsbG9jYXRlKGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlciogb2JzZXJ2ZXIpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU3RhcnQoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0b3AoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIERlQWxsb2NhdGUoKSBPVkVSUklERTsKLSAgdmlydHVhbCBjb25zdCBOYW1lJiBkZXZpY2VfbmFtZSgpIE9WRVJSSURFOwotCi0gcHJpdmF0ZToKLSAgZW51bSBJbnRlcm5hbFN0YXRlIHsKLSAgICBrSWRsZSwgIC8vIFRoZSBkZXZpY2UgZHJpdmVyIGlzIG9wZW5lZCBidXQgY2FtZXJhIGlzIG5vdCBpbiB1c2UuCi0gICAga0FsbG9jYXRlZCwgIC8vIFRoZSBjYW1lcmEgaGFzIGJlZW4gYWxsb2NhdGVkIGFuZCBjYW4gYmUgc3RhcnRlZC4KLSAgICBrQ2FwdHVyaW5nLCAgLy8gVmlkZW8gaXMgYmVpbmcgY2FwdHVyZWQuCi0gICAga0Vycm9yICAvLyBFcnJvciBhY2Nlc3NpbmcgSFcgZnVuY3Rpb25zLgotICAgICAgICAgICAgLy8gVXNlciBuZWVkcyB0byByZWNvdmVyIGJ5IGRlc3Ryb3lpbmcgdGhlIG9iamVjdC4KLSAgfTsKLQotICAvLyBCdWZmZXJzIHVzZWQgdG8gcmVjZWl2ZSB2aWRlbyBmcmFtZXMgZnJvbSB3aXRoIHY0bDIuCi0gIHN0cnVjdCBCdWZmZXIgewotICAgIEJ1ZmZlcigpIDogc3RhcnQoMCksIGxlbmd0aCgwKSB7fQotICAgIHZvaWQqIHN0YXJ0OwotICAgIHNpemVfdCBsZW5ndGg7Ci0gIH07Ci0KLSAgLy8gQ2FsbGVkIG9uIHRoZSB2NGwyX3RocmVhZF8uCi0gIHZvaWQgT25BbGxvY2F0ZShpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX3JhdGUsCi0gICAgICAgICAgICAgICAgICBFdmVudEhhbmRsZXIqIG9ic2VydmVyKTsKLSAgdm9pZCBPblN0YXJ0KCk7Ci0gIHZvaWQgT25TdG9wKCk7Ci0gIHZvaWQgT25EZUFsbG9jYXRlKCk7Ci0gIHZvaWQgT25DYXB0dXJlVGFzaygpOwotCi0gIGJvb2wgQWxsb2NhdGVWaWRlb0J1ZmZlcnMoKTsKLSAgdm9pZCBEZUFsbG9jYXRlVmlkZW9CdWZmZXJzKCk7Ci0gIHZvaWQgU2V0RXJyb3JTdGF0ZShjb25zdCBzdGQ6OnN0cmluZyYgcmVhc29uKTsKLQotICBJbnRlcm5hbFN0YXRlIHN0YXRlXzsKLSAgVmlkZW9DYXB0dXJlRGV2aWNlOjpFdmVudEhhbmRsZXIqIG9ic2VydmVyXzsKLSAgTmFtZSBkZXZpY2VfbmFtZV87Ci0gIGludCBkZXZpY2VfZmRfOyAgLy8gRmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgb3BlbmVkIGNhbWVyYSBkZXZpY2UuCi0gIGJhc2U6OlRocmVhZCB2NGwyX3RocmVhZF87ICAvLyBUaHJlYWQgdXNlZCBmb3IgcmVhZGluZyBkYXRhIGZyb20gdGhlIGRldmljZS4KLSAgQnVmZmVyKiBidWZmZXJfcG9vbF87Ci0gIGludCBidWZmZXJfcG9vbF9zaXplXzsgIC8vIE51bWJlciBvZiBhbGxvY2F0ZWQgYnVmZmVycy4KLQotICBESVNBTExPV19JTVBMSUNJVF9DT05TVFJVQ1RPUlMoVmlkZW9DYXB0dXJlRGV2aWNlTGludXgpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfVklERU9fQ0FQVFVSRV9MSU5VWF9WSURFT19DQVBUVVJFX0RFVklDRV9MSU5VWF9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvbWFjL3ZpZGVvX2NhcHR1cmVfZGV2aWNlX21hYy5oIGIvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvbWFjL3ZpZGVvX2NhcHR1cmVfZGV2aWNlX21hYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWQ3OGUwLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL21hYy92aWRlb19jYXB0dXJlX2RldmljZV9tYWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9TIFggaW1wbGVtZW50YXRpb24gb2YgVmlkZW9DYXB0dXJlRGV2aWNlLCB1c2luZyBRVEtpdCBhcyBuYXRpdmUgY2FwdHVyZSBBUEkuCi0KLSNpZm5kZWYgTUVESUFfVklERU9fQ0FQVFVSRV9NQUNfVklERU9fQ0FQVFVSRV9ERVZJQ0VfTUFDX0hfCi0jZGVmaW5lIE1FRElBX1ZJREVPX0NBUFRVUkVfTUFDX1ZJREVPX0NBUFRVUkVfREVWSUNFX01BQ19IXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgotI2luY2x1ZGUgIm1lZGlhL3ZpZGVvL2NhcHR1cmUvdmlkZW9fY2FwdHVyZV9kZXZpY2UuaCIKLSNpbmNsdWRlICJtZWRpYS92aWRlby9jYXB0dXJlL3ZpZGVvX2NhcHR1cmVfdHlwZXMuaCIKLQotQGNsYXNzIFZpZGVvQ2FwdHVyZURldmljZVFUS2l0OwotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBDYWxsZWQgYnkgVmlkZW9DYXB0dXJlTWFuYWdlciB0byBvcGVuLCBjbG9zZSBhbmQgc3RhcnQsIHN0b3AgdmlkZW8gY2FwdHVyZQotLy8gZGV2aWNlcy4KLWNsYXNzIFZpZGVvQ2FwdHVyZURldmljZU1hYyA6IHB1YmxpYyBWaWRlb0NhcHR1cmVEZXZpY2UgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgVmlkZW9DYXB0dXJlRGV2aWNlTWFjKGNvbnN0IE5hbWUmIGRldmljZV9uYW1lKTsKLSAgdmlydHVhbCB+VmlkZW9DYXB0dXJlRGV2aWNlTWFjKCk7Ci0KLSAgLy8gVmlkZW9DYXB0dXJlRGV2aWNlIGltcGxlbWVudGF0aW9uLgotICB2aXJ0dWFsIHZvaWQgQWxsb2NhdGUoaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9DYXB0dXJlRGV2aWNlOjpFdmVudEhhbmRsZXIqIG9ic2VydmVyKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0YXJ0KCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTdG9wKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBEZUFsbG9jYXRlKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgY29uc3QgTmFtZSYgZGV2aWNlX25hbWUoKSBPVkVSUklERTsKLQotICBib29sIEluaXQoKTsKLQotICAvLyBDYWxsZWQgdG8gZGVsaXZlciBjYXB0dXJlZCB2aWRlbyBmcmFtZXMuCi0gIHZvaWQgUmVjZWl2ZUZyYW1lKGNvbnN0IHVpbnQ4KiB2aWRlb19mcmFtZSwgaW50IHZpZGVvX2ZyYW1lX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgVmlkZW9DYXB0dXJlQ2FwYWJpbGl0eSYgZnJhbWVfaW5mbyk7Ci0KLSBwcml2YXRlOgotICB2b2lkIFNldEVycm9yU3RhdGUoY29uc3Qgc3RkOjpzdHJpbmcmIHJlYXNvbik7Ci0KLSAgLy8gRmxhZyBpbmRpY2F0aW5nIHRoZSBpbnRlcm5hbCBzdGF0ZS4KLSAgZW51bSBJbnRlcm5hbFN0YXRlIHsKLSAgICBrTm90SW5pdGlhbGl6ZWQsCi0gICAga0lkbGUsCi0gICAga0FsbG9jYXRlZCwKLSAgICBrQ2FwdHVyaW5nLAotICAgIGtFcnJvcgotICB9OwotCi0gIFZpZGVvQ2FwdHVyZURldmljZTo6TmFtZSBkZXZpY2VfbmFtZV87Ci0gIFZpZGVvQ2FwdHVyZURldmljZTo6RXZlbnRIYW5kbGVyKiBvYnNlcnZlcl87Ci0gIEludGVybmFsU3RhdGUgc3RhdGVfOwotCi0gIFZpZGVvQ2FwdHVyZURldmljZVFUS2l0KiBjYXB0dXJlX2RldmljZV87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFZpZGVvQ2FwdHVyZURldmljZU1hYyk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9WSURFT19DQVBUVVJFX01BQ19WSURFT19DQVBUVVJFX0RFVklDRV9NQUNfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL21hYy92aWRlb19jYXB0dXJlX2RldmljZV9tYWMubW0gYi9zcmMvbWVkaWEvdmlkZW8vY2FwdHVyZS9tYWMvdmlkZW9fY2FwdHVyZV9kZXZpY2VfbWFjLm1tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmIxNGE3OWI3Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL21hYy92aWRlb19jYXB0dXJlX2RldmljZV9tYWMubW0KKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL3ZpZGVvL2NhcHR1cmUvbWFjL3ZpZGVvX2NhcHR1cmVfZGV2aWNlX21hYy5oIgotCi0jaW1wb3J0IDxRVEtpdC9RVEtpdC5oPgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS90aW1lLmgiCi0jaW5jbHVkZSAibWVkaWEvdmlkZW8vY2FwdHVyZS9tYWMvdmlkZW9fY2FwdHVyZV9kZXZpY2VfcXRraXRfbWFjLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0IGludCBrTWluRnJhbWVSYXRlID0gMTsKLWNvbnN0IGludCBrTWF4RnJhbWVSYXRlID0gMzA7Ci0KLX0KLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotdm9pZCBWaWRlb0NhcHR1cmVEZXZpY2U6OkdldERldmljZU5hbWVzKE5hbWVzKiBkZXZpY2VfbmFtZXMpIHsKLSAgLy8gTG9vcCB0aHJvdWdoIGFsbCBhdmFpbGFibGUgZGV2aWNlcyBhbmQgYWRkIHRvIHxkZXZpY2VfbmFtZXN8LgotICBkZXZpY2VfbmFtZXMtPmNsZWFyKCk7Ci0KLSAgTlNEaWN0aW9uYXJ5KiBjYXB0dXJlX2RldmljZXMgPSBbVmlkZW9DYXB0dXJlRGV2aWNlUVRLaXQgZGV2aWNlTmFtZXNdOwotICBmb3IgKE5TU3RyaW5nKiBrZXkgaW4gY2FwdHVyZV9kZXZpY2VzKSB7Ci0gICAgTmFtZSBuYW1lOwotICAgIG5hbWUuZGV2aWNlX25hbWUgPSBbW2NhcHR1cmVfZGV2aWNlcyB2YWx1ZUZvcktleTprZXldIFVURjhTdHJpbmddOwotICAgIG5hbWUudW5pcXVlX2lkID0gW2tleSBVVEY4U3RyaW5nXTsKLSAgICBkZXZpY2VfbmFtZXMtPnB1c2hfYmFjayhuYW1lKTsKLSAgfQotfQotCi1WaWRlb0NhcHR1cmVEZXZpY2UqIFZpZGVvQ2FwdHVyZURldmljZTo6Q3JlYXRlKGNvbnN0IE5hbWUmIGRldmljZV9uYW1lKSB7Ci0gIFZpZGVvQ2FwdHVyZURldmljZU1hYyogY2FwdHVyZV9kZXZpY2UgPQotICAgICAgbmV3IFZpZGVvQ2FwdHVyZURldmljZU1hYyhkZXZpY2VfbmFtZSk7Ci0gIGlmICghY2FwdHVyZV9kZXZpY2UtPkluaXQoKSkgewotICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBpbml0aWFsaXplIFZpZGVvQ2FwdHVyZURldmljZS4iOwotICAgIGRlbGV0ZSBjYXB0dXJlX2RldmljZTsKLSAgICBjYXB0dXJlX2RldmljZSA9IE5VTEw7Ci0gIH0KLSAgcmV0dXJuIGNhcHR1cmVfZGV2aWNlOwotfQotCi1WaWRlb0NhcHR1cmVEZXZpY2VNYWM6OlZpZGVvQ2FwdHVyZURldmljZU1hYyhjb25zdCBOYW1lJiBkZXZpY2VfbmFtZSkKLSAgICA6IGRldmljZV9uYW1lXyhkZXZpY2VfbmFtZSksCi0gICAgICBvYnNlcnZlcl8oTlVMTCksCi0gICAgICBzdGF0ZV8oa05vdEluaXRpYWxpemVkKSwKLSAgICAgIGNhcHR1cmVfZGV2aWNlXyhuaWwpIHsKLX0KLQotVmlkZW9DYXB0dXJlRGV2aWNlTWFjOjp+VmlkZW9DYXB0dXJlRGV2aWNlTWFjKCkgewotICBbY2FwdHVyZV9kZXZpY2VfIHJlbGVhc2VdOwotfQotCi12b2lkIFZpZGVvQ2FwdHVyZURldmljZU1hYzo6QWxsb2NhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZnJhbWVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEhhbmRsZXIqIG9ic2VydmVyKSB7Ci0gIGlmIChzdGF0ZV8gIT0ga0lkbGUpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgb2JzZXJ2ZXJfID0gb2JzZXJ2ZXI7Ci0gIE5TU3RyaW5nKiBkZXZpY2VJZCA9Ci0gICAgICBbTlNTdHJpbmcgc3RyaW5nV2l0aFVURjhTdHJpbmc6ZGV2aWNlX25hbWVfLnVuaXF1ZV9pZC5jX3N0cigpXTsKLQotICBbY2FwdHVyZV9kZXZpY2VfIHNldEZyYW1lUmVjZWl2ZXI6dGhpc107Ci0KLSAgaWYgKCFbY2FwdHVyZV9kZXZpY2VfIHNldENhcHR1cmVEZXZpY2U6ZGV2aWNlSWRdKSB7Ci0gICAgU2V0RXJyb3JTdGF0ZSgiQ291bGQgbm90IG9wZW4gY2FwdHVyZSBkZXZpY2UuIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChmcmFtZV9yYXRlIDwga01pbkZyYW1lUmF0ZSkKLSAgICBmcmFtZV9yYXRlID0ga01pbkZyYW1lUmF0ZTsKLSAgZWxzZSBpZiAoZnJhbWVfcmF0ZSA+IGtNYXhGcmFtZVJhdGUpCi0gICAgZnJhbWVfcmF0ZSA9IGtNYXhGcmFtZVJhdGU7Ci0KLSAgaWYgKCFbY2FwdHVyZV9kZXZpY2VfIHNldENhcHR1cmVIZWlnaHQ6aGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOndpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVSYXRlOmZyYW1lX3JhdGVdKSB7Ci0gICAgU2V0RXJyb3JTdGF0ZSgiQ291bGQgbm90IGNvbmZpZ3VyZSBjYXB0dXJlIGRldmljZS4iKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGF0ZV8gPSBrQWxsb2NhdGVkOwotICBWaWRlb0NhcHR1cmVDYXBhYmlsaXR5IGN1cnJlbnRfc2V0dGluZ3M7Ci0gIGN1cnJlbnRfc2V0dGluZ3MuY29sb3IgPSBWaWRlb0NhcHR1cmVDYXBhYmlsaXR5OjprQVJHQjsKLSAgY3VycmVudF9zZXR0aW5ncy53aWR0aCA9IHdpZHRoOwotICBjdXJyZW50X3NldHRpbmdzLmhlaWdodCA9IGhlaWdodDsKLSAgY3VycmVudF9zZXR0aW5ncy5mcmFtZV9yYXRlID0gZnJhbWVfcmF0ZTsKLSAgY3VycmVudF9zZXR0aW5ncy5leHBlY3RlZF9jYXB0dXJlX2RlbGF5ID0gMDsKLSAgY3VycmVudF9zZXR0aW5ncy5pbnRlcmxhY2VkID0gZmFsc2U7Ci0KLSAgb2JzZXJ2ZXJfLT5PbkZyYW1lSW5mbyhjdXJyZW50X3NldHRpbmdzKTsKLX0KLQotdm9pZCBWaWRlb0NhcHR1cmVEZXZpY2VNYWM6OlN0YXJ0KCkgewotICBEQ0hFQ0tfRVEoc3RhdGVfLCBrQWxsb2NhdGVkKTsKLSAgaWYgKCFbY2FwdHVyZV9kZXZpY2VfIHN0YXJ0Q2FwdHVyZV0pIHsKLSAgICBTZXRFcnJvclN0YXRlKCJDb3VsZCBub3Qgc3RhcnQgY2FwdHVyZSBkZXZpY2UuIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHN0YXRlXyA9IGtDYXB0dXJpbmc7Ci19Ci0KLXZvaWQgVmlkZW9DYXB0dXJlRGV2aWNlTWFjOjpTdG9wKCkgewotICBEQ0hFQ0tfRVEoc3RhdGVfLCBrQ2FwdHVyaW5nKTsKLSAgW2NhcHR1cmVfZGV2aWNlXyBzdG9wQ2FwdHVyZV07Ci0gIHN0YXRlXyA9IGtBbGxvY2F0ZWQ7Ci19Ci0KLXZvaWQgVmlkZW9DYXB0dXJlRGV2aWNlTWFjOjpEZUFsbG9jYXRlKCkgewotICBpZiAoc3RhdGVfICE9IGtBbGxvY2F0ZWQgJiYgc3RhdGVfICE9IGtDYXB0dXJpbmcpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKHN0YXRlXyA9PSBrQ2FwdHVyaW5nKSB7Ci0gICAgW2NhcHR1cmVfZGV2aWNlXyBzdG9wQ2FwdHVyZV07Ci0gIH0KLSAgW2NhcHR1cmVfZGV2aWNlXyBzZXRDYXB0dXJlRGV2aWNlOm5pbF07Ci0gIFtjYXB0dXJlX2RldmljZV8gc2V0RnJhbWVSZWNlaXZlcjpuaWxdOwotCi0gIHN0YXRlXyA9IGtJZGxlOwotfQotCi1jb25zdCBWaWRlb0NhcHR1cmVEZXZpY2U6Ok5hbWUmIFZpZGVvQ2FwdHVyZURldmljZU1hYzo6ZGV2aWNlX25hbWUoKSB7Ci0gIHJldHVybiBkZXZpY2VfbmFtZV87Ci19Ci0KLWJvb2wgVmlkZW9DYXB0dXJlRGV2aWNlTWFjOjpJbml0KCkgewotICBEQ0hFQ0tfRVEoc3RhdGVfLCBrTm90SW5pdGlhbGl6ZWQpOwotCi0gIE5hbWVzIGRldmljZV9uYW1lczsKLSAgR2V0RGV2aWNlTmFtZXMoJmRldmljZV9uYW1lcyk7Ci0gIGZvciAoTmFtZXM6Oml0ZXJhdG9yIGl0ID0gZGV2aWNlX25hbWVzLmJlZ2luKCk7Ci0gICAgICAgaXQgIT0gZGV2aWNlX25hbWVzLmVuZCgpOwotICAgICAgICsraXQpIHsKLSAgICBpZiAoZGV2aWNlX25hbWVfLnVuaXF1ZV9pZCA9PSBpdC0+dW5pcXVlX2lkKSB7Ci0gICAgICBjYXB0dXJlX2RldmljZV8gPQotICAgICAgICAgIFtbVmlkZW9DYXB0dXJlRGV2aWNlUVRLaXQgYWxsb2NdIGluaXRXaXRoRnJhbWVSZWNlaXZlcjp0aGlzXTsKLSAgICAgIGlmICghY2FwdHVyZV9kZXZpY2VfKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHN0YXRlXyA9IGtJZGxlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBWaWRlb0NhcHR1cmVEZXZpY2VNYWM6OlJlY2VpdmVGcmFtZSgKLSAgICBjb25zdCB1aW50OCogdmlkZW9fZnJhbWUsCi0gICAgaW50IHZpZGVvX2ZyYW1lX2xlbmd0aCwKLSAgICBjb25zdCBWaWRlb0NhcHR1cmVDYXBhYmlsaXR5JiBmcmFtZV9pbmZvKSB7Ci0gIG9ic2VydmVyXy0+T25JbmNvbWluZ0NhcHR1cmVkRnJhbWUodmlkZW9fZnJhbWUsIHZpZGVvX2ZyYW1lX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lOjpOb3coKSk7Ci19Ci0KLXZvaWQgVmlkZW9DYXB0dXJlRGV2aWNlTWFjOjpTZXRFcnJvclN0YXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWFzb24pIHsKLSAgRExPRyhFUlJPUikgPDwgcmVhc29uOwotICBzdGF0ZV8gPSBrRXJyb3I7Ci0gIG9ic2VydmVyXy0+T25FcnJvcigpOwotfQotCi19IC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvbWFjL3ZpZGVvX2NhcHR1cmVfZGV2aWNlX3F0a2l0X21hYy5oIGIvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvbWFjL3ZpZGVvX2NhcHR1cmVfZGV2aWNlX3F0a2l0X21hYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzlhM2RiLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL21hYy92aWRlb19jYXB0dXJlX2RldmljZV9xdGtpdF9tYWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIFZpZGVvQ2FwdHVyZURldmljZVFUS2l0IGltcGxlbWVudHMgYWxsIFFUS2l0IHJlbGF0ZWQgY29kZSBmb3IKLS8vIGNvbW11bmljYXRpbmcgd2l0aCBhIFFUS2l0IGNhcHR1cmUgZGV2aWNlLgotCi0jaWZuZGVmIE1FRElBX1ZJREVPX0NBUFRVUkVfTUFDX1ZJREVPX0NBUFRVUkVfREVWSUNFX01BQ19RVEtJVF9IXwotI2RlZmluZSBNRURJQV9WSURFT19DQVBUVVJFX01BQ19WSURFT19DQVBUVVJFX0RFVklDRV9NQUNfUVRLSVRfSF8KLQotI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+Ci0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0gIGNsYXNzIFZpZGVvQ2FwdHVyZURldmljZU1hYzsKLX0KLQotQGNsYXNzIFFUQ2FwdHVyZURldmljZUlucHV0OwotQGNsYXNzIFFUQ2FwdHVyZVNlc3Npb247Ci0KLUBpbnRlcmZhY2UgVmlkZW9DYXB0dXJlRGV2aWNlUVRLaXQgOiBOU09iamVjdCB7Ci0gQHByaXZhdGUKLSAgLy8gU2V0dGluZ3MuCi0gIGludCBmcmFtZVJhdGVfOwotICBpbnQgZnJhbWVXaWR0aF87Ci0gIGludCBmcmFtZUhlaWdodF87Ci0KLSAgTlNMb2NrICpsb2NrXzsKLSAgbWVkaWE6OlZpZGVvQ2FwdHVyZURldmljZU1hYyAqZnJhbWVSZWNlaXZlcl87Ci0KLSAgLy8gUVRLaXQgdmFyaWFibGVzLgotICBRVENhcHR1cmVTZXNzaW9uICpjYXB0dXJlU2Vzc2lvbl87Ci0gIFFUQ2FwdHVyZURldmljZUlucHV0ICpjYXB0dXJlRGV2aWNlSW5wdXRfOwotCi0gIC8vIEJ1ZmZlciBmb3IgYWRqdXN0aW5nIGZyYW1lcyB3aGljaCBkbyBub3QgZml0IHJlY2VpdmVyCi0gIC8vIGFzc3VtcHRpb25zLiAgc2NvcGVkX2FycmF5PD4gbWlnaHQgbWFrZSBtb3JlIHNlbnNlLCBpZiB0aGUgc2l6ZQotICAvLyBjYW4gYmUgcHJvdmVuIGludmFyaWFudC4KLSAgc3RkOjp2ZWN0b3I8VUludDg+IGFkanVzdGVkRnJhbWVfOwotfQotCi0vLyBSZXR1cm5zIGEgZGljdGlvbmFyeSBvZiBjYXB0dXJlIGRldmljZXMgd2l0aCBmcmllbmRseSBuYW1lIGFuZCB1bmlxdWUgaWQuCi0rIChOU0RpY3Rpb25hcnkgKilkZXZpY2VOYW1lczsKLQotLy8gSW5pdGlhbGl6ZXMgdGhlIGluc3RhbmNlIGFuZCByZWdpc3RlcnMgdGhlIGZyYW1lIHJlY2VpdmVyLgotLSAoaWQpaW5pdFdpdGhGcmFtZVJlY2VpdmVyOihtZWRpYTo6VmlkZW9DYXB0dXJlRGV2aWNlTWFjICopZnJhbWVSZWNlaXZlcjsKLQotLy8gU2V0IHRoZSBmcmFtZSByZWNlaXZlci4KLS0gKHZvaWQpc2V0RnJhbWVSZWNlaXZlcjoobWVkaWE6OlZpZGVvQ2FwdHVyZURldmljZU1hYyAqKWZyYW1lUmVjZWl2ZXI7Ci0KLS8vIFNldHMgd2hpY2ggY2FwdHVyZSBkZXZpY2UgdG8gdXNlLiBSZXR1cm5zIFlFUyBvbiBzdWNlc3MsIE5PIG90aGVyd2lzZS4KLS0gKEJPT0wpc2V0Q2FwdHVyZURldmljZTooTlNTdHJpbmcgKilkZXZpY2VJZDsKLQotLy8gQ29uZmlndXJlcyB0aGUgY2FwdHVyZSBwcm9wZXJ0aWVzLgotLSAoQk9PTClzZXRDYXB0dXJlSGVpZ2h0OihpbnQpaGVpZ2h0IHdpZHRoOihpbnQpd2lkdGggZnJhbWVSYXRlOihpbnQpZnJhbWVSYXRlOwotCi0vLyBTdGFydCB2aWRlbyBjYXB0dXJpbmcuIFJldHVybnMgWUVTIG9uIHN1Y2VzcywgTk8gb3RoZXJ3aXNlLgotLSAoQk9PTClzdGFydENhcHR1cmU7Ci0KLS8vIFN0b3BzIHZpZGVvIGNhcHR1cmluZy4KLS0gKHZvaWQpc3RvcENhcHR1cmU7Ci0KLUBlbmQKLQotI2VuZGlmICAvLyBNRURJQV9WSURFT19DQVBUVVJFX01BQ19WSURFT19DQVBUVVJFX0RFVklDRV9NQUNfUVRLSVRfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL21hYy92aWRlb19jYXB0dXJlX2RldmljZV9xdGtpdF9tYWMubW0gYi9zcmMvbWVkaWEvdmlkZW8vY2FwdHVyZS9tYWMvdmlkZW9fY2FwdHVyZV9kZXZpY2VfcXRraXRfbWFjLm1tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzE4ZjVmLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL21hYy92aWRlb19jYXB0dXJlX2RldmljZV9xdGtpdF9tYWMubW0KKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2ltcG9ydCAibWVkaWEvdmlkZW8vY2FwdHVyZS9tYWMvdmlkZW9fY2FwdHVyZV9kZXZpY2VfcXRraXRfbWFjLmgiCi0KLSNpbXBvcnQgPFFUS2l0L1FUS2l0Lmg+Ci0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL21hYy9jcmFzaF9sb2dnaW5nLmgiCi0jaW5jbHVkZSAibWVkaWEvdmlkZW8vY2FwdHVyZS9tYWMvdmlkZW9fY2FwdHVyZV9kZXZpY2VfbWFjLmgiCi0jaW5jbHVkZSAibWVkaWEvdmlkZW8vY2FwdHVyZS92aWRlb19jYXB0dXJlX2RldmljZS5oIgotI2luY2x1ZGUgIm1lZGlhL3ZpZGVvL2NhcHR1cmUvdmlkZW9fY2FwdHVyZV90eXBlcy5oIgotCi1AaW1wbGVtZW50YXRpb24gVmlkZW9DYXB0dXJlRGV2aWNlUVRLaXQKLQotI3ByYWdtYSBtYXJrIENsYXNzIG1ldGhvZHMKLQotKyAodm9pZClnZXREZXZpY2VOYW1lczooTlNNdXRhYmxlRGljdGlvbmFyeSopZGV2aWNlTmFtZXMgewotICBOU0FycmF5KiBjYXB0dXJlRGV2aWNlcyA9Ci0gICAgICBbUVRDYXB0dXJlRGV2aWNlIGlucHV0RGV2aWNlc1dpdGhNZWRpYVR5cGU6UVRNZWRpYVR5cGVWaWRlb107Ci0KLSAgZm9yIChRVENhcHR1cmVEZXZpY2UqIGRldmljZSBpbiBjYXB0dXJlRGV2aWNlcykgewotICAgIFtkZXZpY2VOYW1lcyBzZXRPYmplY3Q6W2RldmljZSBsb2NhbGl6ZWREaXNwbGF5TmFtZV0KLSAgICAgICAgICAgICAgICAgICAgZm9yS2V5OltkZXZpY2UgdW5pcXVlSURdXTsKLSAgfQotfQotCi0rIChOU0RpY3Rpb25hcnkqKWRldmljZU5hbWVzIHsKLSAgTlNNdXRhYmxlRGljdGlvbmFyeSogZGV2aWNlTmFtZXMgPQotICAgICAgW1tbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOwotCi0gIC8vIFRPRE8oc2hlc3MpOiBQb3N0IHRvIHRoZSBtYWluIHRocmVhZCB0byBzZWUgaWYgdGhhdCBoZWxwcwotICAvLyBodHRwOi8vY3JidWcuY29tLzEzOTE2NAotICBbc2VsZiBwZXJmb3JtU2VsZWN0b3JPbk1haW5UaHJlYWQ6QHNlbGVjdG9yKGdldERldmljZU5hbWVzOikKLSAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoT2JqZWN0OmRldmljZU5hbWVzCi0gICAgICAgICAgICAgICAgICAgICAgd2FpdFVudGlsRG9uZTpZRVNdOwotICByZXR1cm4gZGV2aWNlTmFtZXM7Ci19Ci0KLSNwcmFnbWEgbWFyayBQdWJsaWMgbWV0aG9kcwotCi0tIChpZClpbml0V2l0aEZyYW1lUmVjZWl2ZXI6KG1lZGlhOjpWaWRlb0NhcHR1cmVEZXZpY2VNYWMgKilmcmFtZVJlY2VpdmVyIHsKLSAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgaWYgKHNlbGYpIHsKLSAgICBmcmFtZVJlY2VpdmVyXyA9IGZyYW1lUmVjZWl2ZXI7Ci0gICAgbG9ja18gPSBbW05TTG9jayBhbGxvY10gaW5pdF07Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIFtjYXB0dXJlU2Vzc2lvbl8gcmVsZWFzZV07Ci0gIFtjYXB0dXJlRGV2aWNlSW5wdXRfIHJlbGVhc2VdOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0KLS0gKHZvaWQpc2V0RnJhbWVSZWNlaXZlcjoobWVkaWE6OlZpZGVvQ2FwdHVyZURldmljZU1hYyAqKWZyYW1lUmVjZWl2ZXIgewotICBbbG9ja18gbG9ja107Ci0gIGZyYW1lUmVjZWl2ZXJfID0gZnJhbWVSZWNlaXZlcjsKLSAgW2xvY2tfIHVubG9ja107Ci19Ci0KLS0gKEJPT0wpc2V0Q2FwdHVyZURldmljZTooTlNTdHJpbmcgKilkZXZpY2VJZCB7Ci0gIGlmIChkZXZpY2VJZCkgewotICAgIC8vIFNldCB0aGUgY2FwdHVyZSBkZXZpY2UuCi0gICAgaWYgKGNhcHR1cmVEZXZpY2VJbnB1dF8pIHsKLSAgICAgIERMT0coRVJST1IpIDw8ICJWaWRlbyBjYXB0dXJlIGRldmljZSBhbHJlYWR5IHNldC4iOwotICAgICAgcmV0dXJuIE5POwotICAgIH0KLQotICAgIE5TQXJyYXkgKmNhcHR1cmVEZXZpY2VzID0KLSAgICAgICAgW1FUQ2FwdHVyZURldmljZSBpbnB1dERldmljZXNXaXRoTWVkaWFUeXBlOlFUTWVkaWFUeXBlVmlkZW9dOwotICAgIE5TQXJyYXkgKmNhcHR1cmVEZXZpY2VzTmFtZXMgPQotICAgICAgICBbY2FwdHVyZURldmljZXMgdmFsdWVGb3JLZXk6QCJ1bmlxdWVJRCJdOwotICAgIE5TVUludGVnZXIgaW5kZXggPSBbY2FwdHVyZURldmljZXNOYW1lcyBpbmRleE9mT2JqZWN0OmRldmljZUlkXTsKLSAgICBpZiAoaW5kZXggPT0gTlNOb3RGb3VuZCkgewotICAgICAgRExPRyhFUlJPUikgPDwgIlZpZGVvIGNhcHR1cmUgZGV2aWNlIG5vdCBmb3VuZC4iOwotICAgICAgcmV0dXJuIE5POwotICAgIH0KLSAgICBRVENhcHR1cmVEZXZpY2UgKmRldmljZSA9IFtjYXB0dXJlRGV2aWNlcyBvYmplY3RBdEluZGV4OmluZGV4XTsKLSAgICBOU0Vycm9yICplcnJvcjsKLSAgICBpZiAoIVtkZXZpY2Ugb3BlbjomZXJyb3JdKSB7Ci0gICAgICBETE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IG9wZW4gdmlkZW8gY2FwdHVyZSBkZXZpY2UuIgotICAgICAgICAgICAgICAgICAgPDwgW1tlcnJvciBsb2NhbGl6ZWREZXNjcmlwdGlvbl0gVVRGOFN0cmluZ107Ci0gICAgICByZXR1cm4gTk87Ci0gICAgfQotICAgIGNhcHR1cmVEZXZpY2VJbnB1dF8gPSBbW1FUQ2FwdHVyZURldmljZUlucHV0IGFsbG9jXSBpbml0V2l0aERldmljZTpkZXZpY2VdOwotICAgIGNhcHR1cmVTZXNzaW9uXyA9IFtbUVRDYXB0dXJlU2Vzc2lvbiBhbGxvY10gaW5pdF07Ci0KLSAgICBRVENhcHR1cmVEZWNvbXByZXNzZWRWaWRlb091dHB1dCAqY2FwdHVyZURlY29tcHJlc3NlZE91dHB1dCA9Ci0gICAgICAgIFtbW1FUQ2FwdHVyZURlY29tcHJlc3NlZFZpZGVvT3V0cHV0IGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07Ci0gICAgW2NhcHR1cmVEZWNvbXByZXNzZWRPdXRwdXQgc2V0RGVsZWdhdGU6c2VsZl07Ci0gICAgaWYgKCFbY2FwdHVyZVNlc3Npb25fIGFkZE91dHB1dDpjYXB0dXJlRGVjb21wcmVzc2VkT3V0cHV0IGVycm9yOiZlcnJvcl0pIHsKLSAgICAgIERMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgY29ubmVjdCB2aWRlbyBjYXB0dXJlIG91dHB1dC4iCi0gICAgICAgICAgICAgICAgICA8PCBbW2Vycm9yIGxvY2FsaXplZERlc2NyaXB0aW9uXSBVVEY4U3RyaW5nXTsKLSAgICAgIHJldHVybiBOTzsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIGtleSBjYW4gYmUgdXNlZCB0byBjaGVjayBpZiB2aWRlbyBjYXB0dXJlIGNvZGUgd2FzIHJlbGF0ZWQgdG8gYQotICAgIC8vIHBhcnRpY3VsYXIgY3Jhc2guCi0gICAgYmFzZTo6bWFjOjpTZXRDcmFzaEtleVZhbHVlKEAiVmlkZW9DYXB0dXJlRGV2aWNlUVRLaXQiLCBAIk9wZW5lZERldmljZSIpOwotCi0gICAgcmV0dXJuIFlFUzsKLSAgfSBlbHNlIHsKLSAgICAvLyBSZW1vdmUgdGhlIHByZXZpb3VzbHkgc2V0IGNhcHR1cmUgZGV2aWNlLgotICAgIGlmICghY2FwdHVyZURldmljZUlucHV0XykgewotICAgICAgRExPRyhFUlJPUikgPDwgIk5vIHZpZGVvIGNhcHR1cmUgZGV2aWNlIHNldC4iOwotICAgICAgcmV0dXJuIFlFUzsKLSAgICB9Ci0gICAgaWYgKFtbY2FwdHVyZVNlc3Npb25fIGlucHV0c10gY291bnRdID4gMCkgewotICAgICAgLy8gVGhlIGRldmljZSBpcyBzdGlsbCBydW5uaW5nLgotICAgICAgW3NlbGYgc3RvcENhcHR1cmVdOwotICAgIH0KLSAgICBpZiAoW1tjYXB0dXJlU2Vzc2lvbl8gb3V0cHV0c10gY291bnRdID4gMCkgewotICAgICAgLy8gT25seSBvbmUgb3V0cHV0IGlzIHNldCBmb3IgfGNhcHR1cmVTZXNzaW9uX3wuCi0gICAgICBpZCBvdXRwdXQgPSBbW2NhcHR1cmVTZXNzaW9uXyBvdXRwdXRzXSBvYmplY3RBdEluZGV4OjBdOwotICAgICAgW291dHB1dCBzZXREZWxlZ2F0ZTpuaWxdOwotCi0gICAgICAvLyBUT0RPKHNoZXNzKTogUVRLaXQgYWNoaWV2ZXMgdGhyZWFkIHNhZmV0eSBieSBwb3N0aW5nIG1lc3NhZ2VzCi0gICAgICAvLyB0byB0aGUgbWFpbiB0aHJlYWQuICBBcyBwYXJ0IG9mIC1hZGRPdXRwdXQ6LCBpdCBwb3N0cyBhCi0gICAgICAvLyBtZXNzYWdlIHRvIHRoZSBtYWluIHRocmVhZCB3aGljaCBpbiB0dXJuIHBvc3RzIGEgbm90aWZpY2F0aW9uCi0gICAgICAvLyB3aGljaCB3aWxsIHJ1biBpbiBhIGZ1dHVyZSBzcGluIGFmdGVyIHRoZSBvcmlnaW5hbCBtZXRob2QKLSAgICAgIC8vIHJldHVybnMuICAtcmVtb3ZlT3V0cHV0OiBjYW4gcG9zdCBhIG1haW4tdGhyZWFkIG1lc3NhZ2UgaW4KLSAgICAgIC8vIGJldHdlZW4gd2hpbGUgaG9sZGluZyBhIGxvY2sgd2hpY2ggdGhlIG5vdGlmaWNhdGlvbiBoYW5kbGVyCi0gICAgICAvLyB3aWxsIG5lZWQuICBQb3N0aW5nIGVpdGhlciAtYWRkT3V0cHV0OiBvciAtcmVtb3ZlT3V0cHV0OiB0bwotICAgICAgLy8gdGhlIG1haW4gdGhyZWFkIHNob3VsZCBmaXggaXQsIHJlbW92ZSBpcyBsaWtlbHkgc2FmZXIuCi0gICAgICAvLyBodHRwOi8vY3JidWcuY29tLzE1Mjc1NwotICAgICAgW2NhcHR1cmVTZXNzaW9uXyBwZXJmb3JtU2VsZWN0b3JPbk1haW5UaHJlYWQ6QHNlbGVjdG9yKHJlbW92ZU91dHB1dDopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aE9iamVjdDpvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0VW50aWxEb25lOllFU107Ci0gICAgfQotICAgIFtjYXB0dXJlU2Vzc2lvbl8gcmVsZWFzZV07Ci0gICAgY2FwdHVyZVNlc3Npb25fID0gbmlsOwotICAgIFtjYXB0dXJlRGV2aWNlSW5wdXRfIHJlbGVhc2VdOwotICAgIGNhcHR1cmVEZXZpY2VJbnB1dF8gPSBuaWw7Ci0gICAgcmV0dXJuIFlFUzsKLSAgfQotfQotCi0tIChCT09MKXNldENhcHR1cmVIZWlnaHQ6KGludCloZWlnaHQgd2lkdGg6KGludCl3aWR0aCBmcmFtZVJhdGU6KGludClmcmFtZVJhdGUgewotICBpZiAoIWNhcHR1cmVEZXZpY2VJbnB1dF8pIHsKLSAgICBETE9HKEVSUk9SKSA8PCAiTm8gdmlkZW8gY2FwdHVyZSBkZXZpY2Ugc2V0LiI7Ci0gICAgcmV0dXJuIE5POwotICB9Ci0gIGlmIChbW2NhcHR1cmVTZXNzaW9uXyBvdXRwdXRzXSBjb3VudF0gIT0gMSkgewotICAgIERMT0coRVJST1IpIDw8ICJWaWRlbyBjYXB0dXJlIGNhcGFiaWxpdGllcyBhbHJlYWR5IHNldC4iOwotICAgIHJldHVybiBOTzsKLSAgfQotICBpZiAoZnJhbWVSYXRlIDw9IDApIHsKLSAgICBETE9HKEVSUk9SKSA8PCAiV3JvbmcgZnJhbWUgcmF0ZS4iOwotICAgIHJldHVybiBOTzsKLSAgfQotCi0gIGZyYW1lV2lkdGhfID0gd2lkdGg7Ci0gIGZyYW1lSGVpZ2h0XyA9IGhlaWdodDsKLSAgZnJhbWVSYXRlXyA9IGZyYW1lUmF0ZTsKLQotICAvLyBTZXQgdXAgZGVzaXJlZCBvdXRwdXQgcHJvcGVydGllcy4KLSAgTlNEaWN0aW9uYXJ5ICpjYXB0dXJlRGljdGlvbmFyeSA9Ci0gICAgICBbTlNEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoT2JqZWN0c0FuZEtleXM6Ci0gICAgICAgICAgW05TTnVtYmVyIG51bWJlcldpdGhEb3VibGU6ZnJhbWVXaWR0aF9dLAotICAgICAgICAgIChpZClrQ1ZQaXhlbEJ1ZmZlcldpZHRoS2V5LAotICAgICAgICAgIFtOU051bWJlciBudW1iZXJXaXRoRG91YmxlOmZyYW1lSGVpZ2h0X10sCi0gICAgICAgICAgKGlkKWtDVlBpeGVsQnVmZmVySGVpZ2h0S2V5LAotICAgICAgICAgIFtOU051bWJlciBudW1iZXJXaXRoVW5zaWduZWRJbnQ6a0NWUGl4ZWxGb3JtYXRUeXBlXzMyQkdSQV0sCi0gICAgICAgICAgKGlkKWtDVlBpeGVsQnVmZmVyUGl4ZWxGb3JtYXRUeXBlS2V5LAotICAgICAgICAgIG5pbF07Ci0gIFtbW2NhcHR1cmVTZXNzaW9uXyBvdXRwdXRzXSBvYmplY3RBdEluZGV4OjBdCi0gICAgICBzZXRQaXhlbEJ1ZmZlckF0dHJpYnV0ZXM6Y2FwdHVyZURpY3Rpb25hcnldOwotCi0gIFtbW2NhcHR1cmVTZXNzaW9uXyBvdXRwdXRzXSBvYmplY3RBdEluZGV4OjBdCi0gICAgICBzZXRNaW5pbXVtVmlkZW9GcmFtZUludGVydmFsOihOU1RpbWVJbnRlcnZhbCkxLyhmbG9hdClmcmFtZVJhdGVdOwotICByZXR1cm4gWUVTOwotfQotCi0tIChCT09MKXN0YXJ0Q2FwdHVyZSB7Ci0gIGlmIChbW2NhcHR1cmVTZXNzaW9uXyBvdXRwdXRzXSBjb3VudF0gPT0gMCkgewotICAgIC8vIENhcHR1cmUgcHJvcGVydGllcyBub3Qgc2V0LgotICAgIERMT0coRVJST1IpIDw8ICJWaWRlbyBjYXB0dXJlIGRldmljZSBub3QgaW5pdGlhbGl6ZWQuIjsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgaWYgKFtbY2FwdHVyZVNlc3Npb25fIGlucHV0c10gY291bnRdID09IDApIHsKLSAgICBOU0Vycm9yICplcnJvcjsKLSAgICBpZiAoIVtjYXB0dXJlU2Vzc2lvbl8gYWRkSW5wdXQ6Y2FwdHVyZURldmljZUlucHV0XyBlcnJvcjomZXJyb3JdKSB7Ci0gICAgICBETE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGNvbm5lY3QgdmlkZW8gY2FwdHVyZSBkZXZpY2UuIgotICAgICAgICAgICAgICAgICAgPDwgW1tlcnJvciBsb2NhbGl6ZWREZXNjcmlwdGlvbl0gVVRGOFN0cmluZ107Ci0gICAgICByZXR1cm4gTk87Ci0gICAgfQotICAgIFtjYXB0dXJlU2Vzc2lvbl8gc3RhcnRSdW5uaW5nXTsKLSAgfQotICByZXR1cm4gWUVTOwotfQotCi0tICh2b2lkKXN0b3BDYXB0dXJlIHsKLSAgaWYgKFtbY2FwdHVyZVNlc3Npb25fIGlucHV0c10gY291bnRdID09IDEpIHsKLSAgICBbY2FwdHVyZVNlc3Npb25fIHJlbW92ZUlucHV0OmNhcHR1cmVEZXZpY2VJbnB1dF9dOwotICAgIFtjYXB0dXJlU2Vzc2lvbl8gc3RvcFJ1bm5pbmddOwotICB9Ci19Ci0KLS8vIHxjYXB0dXJlT3V0cHV0fCBpcyBjYWxsZWQgYnkgdGhlIGNhcHR1cmUgZGV2aWNlIHRvIGRlbGl2ZXIgYSBuZXcgZnJhbWUuCi0tICh2b2lkKWNhcHR1cmVPdXRwdXQ6KFFUQ2FwdHVyZU91dHB1dCAqKWNhcHR1cmVPdXRwdXQKLSAgZGlkT3V0cHV0VmlkZW9GcmFtZTooQ1ZJbWFnZUJ1ZmZlclJlZil2aWRlb0ZyYW1lCi0gICAgIHdpdGhTYW1wbGVCdWZmZXI6KFFUU2FtcGxlQnVmZmVyICopc2FtcGxlQnVmZmVyCi0gICAgICAgZnJvbUNvbm5lY3Rpb246KFFUQ2FwdHVyZUNvbm5lY3Rpb24gKiljb25uZWN0aW9uIHsKLSAgW2xvY2tfIGxvY2tdOwotICBpZighZnJhbWVSZWNlaXZlcl8pIHsKLSAgICBbbG9ja18gdW5sb2NrXTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBMb2NrIHRoZSBmcmFtZSBhbmQgY2FsY3VsYXRlIGZyYW1lIHNpemUuCi0gIGNvbnN0IGludCBrTG9ja0ZsYWdzID0gMDsKLSAgaWYgKENWUGl4ZWxCdWZmZXJMb2NrQmFzZUFkZHJlc3ModmlkZW9GcmFtZSwga0xvY2tGbGFncykKLSAgICAgID09IGtDVlJldHVyblN1Y2Nlc3MpIHsKLSAgICB2b2lkICpiYXNlQWRkcmVzcyA9IENWUGl4ZWxCdWZmZXJHZXRCYXNlQWRkcmVzcyh2aWRlb0ZyYW1lKTsKLSAgICBzaXplX3QgYnl0ZXNQZXJSb3cgPSBDVlBpeGVsQnVmZmVyR2V0Qnl0ZXNQZXJSb3codmlkZW9GcmFtZSk7Ci0gICAgaW50IGZyYW1lSGVpZ2h0ID0gQ1ZQaXhlbEJ1ZmZlckdldEhlaWdodCh2aWRlb0ZyYW1lKTsKLSAgICBpbnQgZnJhbWVTaXplID0gYnl0ZXNQZXJSb3cgKiBmcmFtZUhlaWdodDsKLQotICAgIC8vIFRPRE8oc2hlc3MpOiBieXRlc1BlclJvdyBtYXkgbm90IGNvcnJlc3BvbmQgdG8gZnJhbWVXaWR0aF8qNCwKLSAgICAvLyBidXQgVmlkZW9DYXB0dXJlQ29udHJvbGxlcjo6T25JbmNvbWluZ0NhcHR1cmVkRnJhbWUoKSByZXF1aXJlcwotICAgIC8vIGl0IHRvIGRvIHNvLiAgUGx1bWJpbmcgdGhpbmdzIHRocm91Z2ggaXMgaW50cnVzaXZlLCBmb3Igbm93Ci0gICAgLy8ganVzdCBkZWxpdmVyIGFuIGFkanVzdGVkIGJ1ZmZlci4KLSAgICBVSW50OCogYWRkcmVzc1RvUGFzcyA9IHN0YXRpY19jYXN0PFVJbnQ4Kj4oYmFzZUFkZHJlc3MpOwotICAgIHNpemVfdCBleHBlY3RlZEJ5dGVzUGVyUm93ID0gZnJhbWVXaWR0aF8gKiA0OwotICAgIGlmIChieXRlc1BlclJvdyA+IGV4cGVjdGVkQnl0ZXNQZXJSb3cpIHsKLSAgICAgIC8vIFRPRE8oc2hlc3MpOiBmcmFtZUhlaWdodCBhbmQgZnJhbWVIZWlnaHRfIGFyZSBub3QgdGhlIHNhbWUsCi0gICAgICAvLyB0cnkgdG8gZG8gd2hhdCB0aGUgc3Vycm91bmRpbmcgY29kZSBzZWVtcyB0byBhc3N1bWUuCi0gICAgICAvLyBJcm9uaWNhbGx5LCBjYXB0dXJlQ2FwYWJpbGl0eSBhbmQgZnJhbWVTaXplIGFyZSBpZ25vcmVkCi0gICAgICAvLyBhbnlob3cuCi0gICAgICBhZGp1c3RlZEZyYW1lXy5yZXNpemUoZXhwZWN0ZWRCeXRlc1BlclJvdyAqIGZyYW1lSGVpZ2h0KTsKLSAgICAgIC8vIHN0ZDo6dmVjdG9yIGlzIGNvbnRpZ3VvdXMgYWNjb3JkaW5nIHRvIHN0YW5kYXJkLgotICAgICAgVUludDgqIGFkanVzdGVkQWRkcmVzcyA9ICZhZGp1c3RlZEZyYW1lX1swXTsKLQotICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBmcmFtZUhlaWdodDsgKyt5KSB7Ci0gICAgICAgIG1lbWNweShhZGp1c3RlZEFkZHJlc3MgKyB5ICogZXhwZWN0ZWRCeXRlc1BlclJvdywKLSAgICAgICAgICAgICAgIGFkZHJlc3NUb1Bhc3MgKyB5ICogYnl0ZXNQZXJSb3csCi0gICAgICAgICAgICAgICBleHBlY3RlZEJ5dGVzUGVyUm93KTsKLSAgICAgIH0KLQotICAgICAgYWRkcmVzc1RvUGFzcyA9IGFkanVzdGVkQWRkcmVzczsKLSAgICAgIGZyYW1lU2l6ZSA9IGZyYW1lSGVpZ2h0ICogZXhwZWN0ZWRCeXRlc1BlclJvdzsKLSAgICB9Ci0gICAgbWVkaWE6OlZpZGVvQ2FwdHVyZUNhcGFiaWxpdHkgY2FwdHVyZUNhcGFiaWxpdHk7Ci0gICAgY2FwdHVyZUNhcGFiaWxpdHkud2lkdGggPSBmcmFtZVdpZHRoXzsKLSAgICBjYXB0dXJlQ2FwYWJpbGl0eS5oZWlnaHQgPSBmcmFtZUhlaWdodF87Ci0gICAgY2FwdHVyZUNhcGFiaWxpdHkuZnJhbWVfcmF0ZSA9IGZyYW1lUmF0ZV87Ci0gICAgY2FwdHVyZUNhcGFiaWxpdHkuY29sb3IgPSBtZWRpYTo6VmlkZW9DYXB0dXJlQ2FwYWJpbGl0eTo6a0FSR0I7Ci0gICAgY2FwdHVyZUNhcGFiaWxpdHkuZXhwZWN0ZWRfY2FwdHVyZV9kZWxheSA9IDA7Ci0gICAgY2FwdHVyZUNhcGFiaWxpdHkuaW50ZXJsYWNlZCA9IGZhbHNlOwotCi0gICAgLy8gRGVsaXZlciB0aGUgY2FwdHVyZWQgdmlkZW8gZnJhbWUuCi0gICAgZnJhbWVSZWNlaXZlcl8tPlJlY2VpdmVGcmFtZShhZGRyZXNzVG9QYXNzLCBmcmFtZVNpemUsIGNhcHR1cmVDYXBhYmlsaXR5KTsKLQotICAgIENWUGl4ZWxCdWZmZXJVbmxvY2tCYXNlQWRkcmVzcyh2aWRlb0ZyYW1lLCBrTG9ja0ZsYWdzKTsKLSAgfQotICBbbG9ja18gdW5sb2NrXTsKLX0KLQotQGVuZApkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvdmlkZW9fY2FwdHVyZS5oIGIvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvdmlkZW9fY2FwdHVyZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjM4NDNlLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL3ZpZGVvX2NhcHR1cmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotLy8KLS8vIFRoaXMgZmlsZSBjb250YWlucyBhYnN0cmFjdCBjbGFzc2VzIHVzZWQgZm9yIG1lZGlhIGZpbHRlciB0byBoYW5kbGUgdmlkZW8KLS8vIGNhcHR1cmUgZGV2aWNlcy4KLQotI2lmbmRlZiBNRURJQV9WSURFT19DQVBUVVJFX1ZJREVPX0NBUFRVUkVfSF8KLSNkZWZpbmUgTUVESUFfVklERU9fQ0FQVFVSRV9WSURFT19DQVBUVVJFX0hfCi0KLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGltZS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb19mcmFtZS5oIgotI2luY2x1ZGUgIm1lZGlhL3ZpZGVvL2NhcHR1cmUvdmlkZW9fY2FwdHVyZV90eXBlcy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBNRURJQV9FWFBPUlQgVmlkZW9DYXB0dXJlIHsKLSBwdWJsaWM6Ci0gIC8vIFRPRE8od2ppYSk6IGNvbnNpZGVyIG1lcmdpbmcgd2l0aCBtZWRpYTo6VmlkZW9GcmFtZSBpZiBwb3NzaWJsZS4KLSAgY2xhc3MgVmlkZW9GcmFtZUJ1ZmZlciA6IHB1YmxpYyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxWaWRlb0ZyYW1lQnVmZmVyPiB7Ci0gICBwdWJsaWM6Ci0gICAgVmlkZW9GcmFtZUJ1ZmZlcigpCi0gICAgICAgIDogd2lkdGgoMCksCi0gICAgICAgICAgaGVpZ2h0KDApLAotICAgICAgICAgIHN0cmlkZSgwKSwKLSAgICAgICAgICBidWZmZXJfc2l6ZSgwKSwKLSAgICAgICAgICBtZW1vcnlfcG9pbnRlcihOVUxMKSB7fQotCi0gICAgaW50IHdpZHRoOwotICAgIGludCBoZWlnaHQ7Ci0gICAgaW50IHN0cmlkZTsKLSAgICBzaXplX3QgYnVmZmVyX3NpemU7Ci0gICAgdWludDgqIG1lbW9yeV9wb2ludGVyOwotICAgIGJhc2U6OlRpbWUgdGltZXN0YW1wOwotCi0gICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxWaWRlb0ZyYW1lQnVmZmVyPjsKLSAgICB+VmlkZW9GcmFtZUJ1ZmZlcigpIHt9Ci0KLSAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oVmlkZW9GcmFtZUJ1ZmZlcik7Ci0gIH07Ci0KLSAgLy8gVE9ETyh3amlhKTogYWRkIGVycm9yIGNvZGVzLgotICAvLyBUT0RPKHdqaWEpOiBzdXBwb3J0IHdlYWsgcHRyLgotICAvLyBDYWxsYmFja3MgcHJvdmlkZWQgYnkgY2xpZW50IGZvciBub3RpZmljYXRpb24gb2YgZXZlbnRzLgotICBjbGFzcyBNRURJQV9FWFBPUlQgRXZlbnRIYW5kbGVyIHsKLSAgIHB1YmxpYzoKLSAgICAvLyBOb3RpZnkgY2xpZW50IHRoYXQgdmlkZW8gY2FwdHVyZSBoYXMgYmVlbiBzdGFydGVkLgotICAgIHZpcnR1YWwgdm9pZCBPblN0YXJ0ZWQoVmlkZW9DYXB0dXJlKiBjYXB0dXJlKSA9IDA7Ci0KLSAgICAvLyBOb3RpZnkgY2xpZW50IHRoYXQgdmlkZW8gY2FwdHVyZSBoYXMgYmVlbiBzdG9wcGVkLgotICAgIHZpcnR1YWwgdm9pZCBPblN0b3BwZWQoVmlkZW9DYXB0dXJlKiBjYXB0dXJlKSA9IDA7Ci0KLSAgICAvLyBOb3RpZnkgY2xpZW50IHRoYXQgdmlkZW8gY2FwdHVyZSBoYXMgYmVlbiBwYXVzZWQuCi0gICAgdmlydHVhbCB2b2lkIE9uUGF1c2VkKFZpZGVvQ2FwdHVyZSogY2FwdHVyZSkgPSAwOwotCi0gICAgLy8gTm90aWZ5IGNsaWVudCB0aGF0IHZpZGVvIGNhcHR1cmUgaGFzIGhpdCBzb21lIGVycm9yIHxlcnJvcl9jb2RlfC4KLSAgICB2aXJ0dWFsIHZvaWQgT25FcnJvcihWaWRlb0NhcHR1cmUqIGNhcHR1cmUsIGludCBlcnJvcl9jb2RlKSA9IDA7Ci0KLSAgICAvLyBOb3RpZnkgY2xpZW50IHRoYXQgdGhlIGNsaWVudCBoYXMgYmVlbiByZW1vdmVkIGFuZCBubyBtb3JlIGNhbGxzIHdpbGwgYmUKLSAgICAvLyByZWNlaXZlZC4KLSAgICB2aXJ0dWFsIHZvaWQgT25SZW1vdmVkKFZpZGVvQ2FwdHVyZSogY2FwdHVyZSkgPSAwOwotCi0gICAgLy8gTm90aWZ5IGNsaWVudCB0aGF0IGEgYnVmZmVyIGlzIGF2YWlsYWJsZS4KLSAgICB2aXJ0dWFsIHZvaWQgT25CdWZmZXJSZWFkeShWaWRlb0NhcHR1cmUqIGNhcHR1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lQnVmZmVyPiBidWZmZXIpID0gMDsKLQotICAgIC8vIE5vdGlmeSBjbGllbnQgYWJvdXQgZGV2aWNlIGluZm8uCi0gICAgdmlydHVhbCB2b2lkIE9uRGV2aWNlSW5mb1JlY2VpdmVkKAotICAgICAgICBWaWRlb0NhcHR1cmUqIGNhcHR1cmUsCi0gICAgICAgIGNvbnN0IFZpZGVvQ2FwdHVyZVBhcmFtcyYgZGV2aWNlX2luZm8pID0gMDsKLQotICAgcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkV2ZW50SGFuZGxlcigpIHt9Ci0gIH07Ci0KLSAgVmlkZW9DYXB0dXJlKCkge30KLQotICAvLyBSZXF1ZXN0IHZpZGVvIGNhcHR1cmUgdG8gc3RhcnQgY2FwdHVyaW5nIHdpdGggfGNhcGFiaWxpdHl8LgotICAvLyBBbHNvIHJlZ2lzdGVyIHxoYW5kbGVyfCB3aXRoIHZpZGVvIGNhcHR1cmUgZm9yIGV2ZW50IGhhbmRsaW5nLgotICAvLyB8aGFuZGxlcnwgbXVzdCByZW1haW4gdmFsaWQgdW50aWwgaXQgaGFzIHJlY2VpdmVkIHxPblJlbW92ZWQoKXwuCi0gIHZpcnR1YWwgdm9pZCBTdGFydENhcHR1cmUoRXZlbnRIYW5kbGVyKiBoYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZpZGVvQ2FwdHVyZUNhcGFiaWxpdHkmIGNhcGFiaWxpdHkpID0gMDsKLQotICAvLyBSZXF1ZXN0IHZpZGVvIGNhcHR1cmUgdG8gc3RvcCBjYXB0dXJpbmcgZm9yIGNsaWVudCB8aGFuZGxlcnwuCi0gIC8vIHxoYW5kbGVyfCBtdXN0IHJlbWFpbiB2YWxpZCB1bnRpbCBpdCBoYXMgcmVjZWl2ZWQgfE9uUmVtb3ZlZCgpfC4KLSAgdmlydHVhbCB2b2lkIFN0b3BDYXB0dXJlKEV2ZW50SGFuZGxlciogaGFuZGxlcikgPSAwOwotCi0gIC8vIEZlZWQgYnVmZmVyIHRvIHZpZGVvIGNhcHR1cmUgd2hlbiBkb25lIHdpdGggaXQuCi0gIHZpcnR1YWwgdm9pZCBGZWVkQnVmZmVyKHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZUJ1ZmZlcj4gYnVmZmVyKSA9IDA7Ci0KLSAgdmlydHVhbCBib29sIENhcHR1cmVTdGFydGVkKCkgPSAwOwotICB2aXJ0dWFsIGludCBDYXB0dXJlV2lkdGgoKSA9IDA7Ci0gIHZpcnR1YWwgaW50IENhcHR1cmVIZWlnaHQoKSA9IDA7Ci0gIHZpcnR1YWwgaW50IENhcHR1cmVGcmFtZVJhdGUoKSA9IDA7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgflZpZGVvQ2FwdHVyZSgpIHt9Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oVmlkZW9DYXB0dXJlKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX1ZJREVPX0NBUFRVUkVfVklERU9fQ0FQVFVSRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvdmlkZW9fY2FwdHVyZV9kZXZpY2UuaCBiL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL3ZpZGVvX2NhcHR1cmVfZGV2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZmQ4YmUuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvdmlkZW9fY2FwdHVyZV9kZXZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0vLwotLy8gVmlkZW9DYXB0dXJlRGV2aWNlIGlzIHRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciByZWFsaXppbmcgdmlkZW8gY2FwdHVyZQotLy8gZGV2aWNlIHN1cHBvcnQgaW4gQ2hyb21pdW0uIEl0IHByb3ZpZGVzIHRoZSBpbnRlcmZhY2UgZm9yIE9TIGRlcGVuZGVudAotLy8gaW1wbGVtZW50YXRpb25zLgotLy8gVGhlIGNsYXNzIGlzIGNyZWF0ZWQgYW5kIGZ1bmN0aW9ucyBhcmUgaW52b2tlZCBvbiBhIHRocmVhZCBvd25lZCBieQotLy8gVmlkZW9DYXB0dXJlTWFuYWdlci4gQ2FwdHVyaW5nIGlzIGRvbmUgb24gb3RoZXIgdGhyZWFkcyBkZXBlbmRlZCBvbiB0aGUgT1MKLS8vIHNwZWNpZmljIGltcGxlbWVudGF0aW9uLgotCi0jaWZuZGVmIE1FRElBX1ZJREVPX0NBUFRVUkVfVklERU9fQ0FQVFVSRV9ERVZJQ0VfSF8KLSNkZWZpbmUgTUVESUFfVklERU9fQ0FQVFVSRV9WSURFT19DQVBUVVJFX0RFVklDRV9IXwotCi0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJiYXNlL3RpbWUuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotI2luY2x1ZGUgIm1lZGlhL3ZpZGVvL2NhcHR1cmUvdmlkZW9fY2FwdHVyZV90eXBlcy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBNRURJQV9FWFBPUlQgVmlkZW9DYXB0dXJlRGV2aWNlIHsKLSBwdWJsaWM6Ci0KLSAgc3RydWN0IE5hbWUgewotICAgIC8vIEZyaWVuZGx5IG5hbWUgb2YgYSBkZXZpY2UKLSAgICBzdGQ6OnN0cmluZyBkZXZpY2VfbmFtZTsKLQotICAgIC8vIFVuaXF1ZSBuYW1lIG9mIGEgZGV2aWNlLiBFdmVuIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBkZXZpY2VzIHdpdGggdGhlIHNhbWUKLSAgICAvLyBmcmllbmRseSBuYW1lIGNvbm5lY3RlZCB0byB0aGUgY29tcHV0ZXIgdGhpcyB3aWxsIGJlIHVuaXF1ZS4KLSAgICBzdGQ6OnN0cmluZyB1bmlxdWVfaWQ7Ci0gIH07Ci0gIHR5cGVkZWYgc3RkOjpsaXN0PE5hbWU+IE5hbWVzOwotCi0gIGNsYXNzIE1FRElBX0VYUE9SVCBFdmVudEhhbmRsZXIgewotICAgcHVibGljOgotICAgIC8vIENhcHR1cmVkIGEgbmV3IHZpZGVvIGZyYW1lLgotICAgIHZpcnR1YWwgdm9pZCBPbkluY29taW5nQ2FwdHVyZWRGcmFtZShjb25zdCB1aW50OCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZSB0aW1lc3RhbXApID0gMDsKLSAgICAvLyBBbiBlcnJvciBoYXMgb2NjdXJyZWQgdGhhdCBjYW4gbm90IGJlIGhhbmRsZWQKLSAgICAvLyBhbmQgVmlkZW9DYXB0dXJlRGV2aWNlIG11c3QgYmUgRGVBbGxvY2F0ZWQuCi0gICAgdmlydHVhbCB2b2lkIE9uRXJyb3IoKSA9IDA7Ci0gICAgLy8gQ2FsbGVkIHdoZW4gVmlkZW9DYXB0dXJlRGV2aWNlOjpBbGxvY2F0ZSBoYXMgYmVlbiBjYWxsZWQKLSAgICAvLyB0byBpbmZvcm0gb2YgdGhlIHJlc3VsdGluZyBmcmFtZSBzaXplIGFuZCBjb2xvciBmb3JtYXQuCi0gICAgdmlydHVhbCB2b2lkIE9uRnJhbWVJbmZvKGNvbnN0IFZpZGVvQ2FwdHVyZUNhcGFiaWxpdHkmIGluZm8pID0gMDsKLQotICAgcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkV2ZW50SGFuZGxlcigpIHt9Ci0gIH07Ci0gIC8vIENyZWF0ZXMgYSBWaWRlb0NhcHR1cmVEZXZpY2Ugb2JqZWN0LgotICAvLyBSZXR1cm4gTlVMTCBpZiB0aGUgaGFyZHdhcmUgaXMgbm90IGF2YWlsYWJsZS4KLSAgc3RhdGljIFZpZGVvQ2FwdHVyZURldmljZSogQ3JlYXRlKGNvbnN0IE5hbWUmIGRldmljZV9uYW1lKTsKLSAgdmlydHVhbCB+VmlkZW9DYXB0dXJlRGV2aWNlKCkge30KLQotICAvLyBHZXRzIHRoZSBuYW1lcyBvZiBhbGwgdmlkZW8gY2FwdHVyZSBkZXZpY2VzIGNvbm5lY3RlZCB0byB0aGlzIGNvbXB1dGVyLgotICBzdGF0aWMgdm9pZCBHZXREZXZpY2VOYW1lcyhOYW1lcyogZGV2aWNlX25hbWVzKTsKLQotICAvLyBQcmVwYXJlIHRoZSBjYW1lcmEgZm9yIHVzZS4gQWZ0ZXIgdGhpcyBmdW5jdGlvbiBoYXMgYmVlbiBjYWxsZWQgbm8gb3RoZXIKLSAgLy8gYXBwbGljYXRpb25zIGNhbiB1c2UgdGhlIGNhbWVyYS4gT24gY29tcGxldGlvbiBFdmVudEhhbmRsZXI6Ok9uRnJhbWVJbmZvIGlzCi0gIC8vIGNhbGxlZCBpbmZvcm1pbmcgb2YgdGhlIHJlc3VsdGluZyByZXNvbHV0aW9uIGFuZCBmcmFtZSByYXRlLgotICAvLyBEZUFsbG9jYXRlIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgYWdhaW4gYW5kCi0gIC8vIGJlZm9yZSB0aGUgb2JqZWN0IGlzIGRlbGV0ZWQuCi0gIHZpcnR1YWwgdm9pZCBBbGxvY2F0ZShpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEhhbmRsZXIqIG9ic2VydmVyKSA9IDA7Ci0KLSAgLy8gU3RhcnQgY2FwdHVyaW5nIHZpZGVvIGZyYW1lcy4gQWxsb2NhdGUgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24uCi0gIHZpcnR1YWwgdm9pZCBTdGFydCgpID0gMDsKLQotICAvLyBTdG9wIGNhcHR1cmluZyB2aWRlbyBmcmFtZXMuCi0gIHZpcnR1YWwgdm9pZCBTdG9wKCkgPSAwOwotCi0gIC8vIERlQWxsb2NhdGVzIHRoZSBjYW1lcmEuIFRoaXMgbWVhbnMgb3RoZXIgYXBwbGljYXRpb25zIGNhbiB1c2UgaXQuCi0gIC8vIEFmdGVyIHRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gY2FsbGVkIHRoZSBDYXB0dXJlIGRldmljZSBpcyByZXNldCB0byB0aGUKLSAgLy8gc3RhdGUgaXQgd2FzIHdoZW4gY3JlYXRlZC4KLSAgdmlydHVhbCB2b2lkIERlQWxsb2NhdGUoKSA9IDA7Ci0KLSAgLy8gR2V0IHRoZSBuYW1lIG9mIHRoZSBjYXB0dXJlIGRldmljZS4KLSAgdmlydHVhbCBjb25zdCBOYW1lJiBkZXZpY2VfbmFtZSgpID0gMDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX1ZJREVPX0NBUFRVUkVfVklERU9fQ0FQVFVSRV9ERVZJQ0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL3ZpZGVvX2NhcHR1cmVfZGV2aWNlX2R1bW15LmNjIGIvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvdmlkZW9fY2FwdHVyZV9kZXZpY2VfZHVtbXkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMDM1NWQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvdmlkZW9fY2FwdHVyZV9kZXZpY2VfZHVtbXkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvdmlkZW8vY2FwdHVyZS92aWRlb19jYXB0dXJlX2RldmljZV9kdW1teS5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1WaWRlb0NhcHR1cmVEZXZpY2UqIFZpZGVvQ2FwdHVyZURldmljZTo6Q3JlYXRlKGNvbnN0IE5hbWUmIGRldmljZV9uYW1lKSB7Ci0gIHJldHVybiBOVUxMOwotfQotCi12b2lkIFZpZGVvQ2FwdHVyZURldmljZTo6R2V0RGV2aWNlTmFtZXMoTmFtZXMqIGRldmljZV9uYW1lcykge30KLQotVmlkZW9DYXB0dXJlRGV2aWNlRHVtbXk6OlZpZGVvQ2FwdHVyZURldmljZUR1bW15KCkge30KLQotVmlkZW9DYXB0dXJlRGV2aWNlRHVtbXk6On5WaWRlb0NhcHR1cmVEZXZpY2VEdW1teSgpIHt9Ci0KLXZvaWQgVmlkZW9DYXB0dXJlRGV2aWNlRHVtbXk6OkFsbG9jYXRlKAotICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZyYW1lX3JhdGUsCi0gICAgVmlkZW9DYXB0dXJlRGV2aWNlOjpFdmVudEhhbmRsZXIqIG9ic2VydmVyKSB7fQotCi12b2lkIFZpZGVvQ2FwdHVyZURldmljZUR1bW15OjpTdGFydCgpIHt9Ci0KLXZvaWQgVmlkZW9DYXB0dXJlRGV2aWNlRHVtbXk6OlN0b3AoKSB7fQotCi12b2lkIFZpZGVvQ2FwdHVyZURldmljZUR1bW15OjpEZUFsbG9jYXRlKCkge30KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdmlkZW8vY2FwdHVyZS92aWRlb19jYXB0dXJlX2RldmljZV9kdW1teS5oIGIvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvdmlkZW9fY2FwdHVyZV9kZXZpY2VfZHVtbXkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk1YTQ2Yi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvdmlkZW8vY2FwdHVyZS92aWRlb19jYXB0dXJlX2RldmljZV9kdW1teS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDExIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gQSBkdW1teSBpbXBsZW1lbnRhdGlvbiBvZiBWaWRlb0NhcHR1cmVEZXZpY2UgdG8gdXNlIGZvciBwbGF0Zm9ybXMgd2l0aG91dAotLy8gcmVhbCB2aWRlbyBjYXB0dXJlIHN1cHBvcnQuIFRoZSBjbGFzcyB3aWxsIGJlIHJlbW92ZWQgb25jZSB0aGUgb3RoZXIKLS8vIHBsYXRmb3JtcyBoYXZlIHJlYWwgdmlkZW8gY2FwdHVyZSBkZXZpY2Ugc3VwcG9ydC4KLS8vCi0vLyBUT0RPKG1mbG9kbWFuKSBSZW1vdmUgd2hlbiB2aWRlb19jYXB0dXJlX2RldmljZV9tYWMgYW5kCi0vLyB2aWRlb19jYXB0dXJlX2RldmljZV93aW4gYXJlIGF2YWlsYWJsZS4KLQotI2lmbmRlZiBNRURJQV9WSURFT19DQVBUVVJFX1ZJREVPX0NBUFRVUkVfREVWSUNFX0RVTU1ZX0hfCi0jZGVmaW5lIE1FRElBX1ZJREVPX0NBUFRVUkVfVklERU9fQ0FQVFVSRV9ERVZJQ0VfRFVNTVlfSF8KLQotI2luY2x1ZGUgImJhc2UvY29tcGlsZXJfc3BlY2lmaWMuaCIKLSNpbmNsdWRlICJtZWRpYS92aWRlby9jYXB0dXJlL3ZpZGVvX2NhcHR1cmVfZGV2aWNlLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIFZpZGVvQ2FwdHVyZURldmljZUR1bW15IDogcHVibGljIFZpZGVvQ2FwdHVyZURldmljZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgQWxsb2NhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZnJhbWVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvQ2FwdHVyZURldmljZTo6RXZlbnRIYW5kbGVyKiBvYnNlcnZlcikgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTdGFydCgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU3RvcCgpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgRGVBbGxvY2F0ZSgpIE9WRVJSSURFOwotCi0gcHJpdmF0ZToKLSAgVmlkZW9DYXB0dXJlRGV2aWNlRHVtbXkoKTsKLSAgdmlydHVhbCB+VmlkZW9DYXB0dXJlRGV2aWNlRHVtbXkoKTsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oVmlkZW9DYXB0dXJlRGV2aWNlRHVtbXkpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfVklERU9fQ0FQVFVSRV9WSURFT19DQVBUVVJFX0RFVklDRV9EVU1NWV9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvdmlkZW9fY2FwdHVyZV9kZXZpY2VfdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvdmlkZW8vY2FwdHVyZS92aWRlb19jYXB0dXJlX2RldmljZV91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM4YjA0Ni4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvdmlkZW8vY2FwdHVyZS92aWRlb19jYXB0dXJlX2RldmljZV91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wLmgiCi0jaW5jbHVkZSAiYmFzZS9zeW5jaHJvbml6YXRpb24vd2FpdGFibGVfZXZlbnQuaCIKLSNpbmNsdWRlICJiYXNlL3Rlc3QvdGVzdF90aW1lb3V0cy5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZC5oIgotI2luY2x1ZGUgIm1lZGlhL3ZpZGVvL2NhcHR1cmUvZmFrZV92aWRlb19jYXB0dXJlX2RldmljZS5oIgotI2luY2x1ZGUgIm1lZGlhL3ZpZGVvL2NhcHR1cmUvdmlkZW9fY2FwdHVyZV9kZXZpY2UuaCIKLSNpbmNsdWRlICJtZWRpYS92aWRlby9jYXB0dXJlL3ZpZGVvX2NhcHR1cmVfdHlwZXMuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotI2lmIGRlZmluZWQoT1NfV0lOKQotI2luY2x1ZGUgImJhc2Uvd2luL3Njb3BlZF9jb21faW5pdGlhbGl6ZXIuaCIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChPU19NQUNPU1gpCi0vLyBNYWMvUVRLaXQgd2lsbCBhbHdheXMgZ2l2ZSB5b3UgdGhlIHNpemUgeW91IGFzayBmb3IgYW5kIHRoaXMgY2FzZSB3aWxsIGZhaWwuCi0jZGVmaW5lIE1BWUJFX0FsbG9jYXRlQmFkU2l6ZSBESVNBQkxFRF9BbGxvY2F0ZUJhZFNpemUKLS8vIFdlIHdpbGwgYWx3YXlzIGdldCBBUkdCIGZyb20gdGhlIE1hYy9RVEtpdCBpbXBsZW1lbnRhdGlvbi4KLSNkZWZpbmUgTUFZQkVfQ2FwdHVyZU1qcGVnIERJU0FCTEVEX0NhcHR1cmVNanBlZwotI2VsaWYgZGVmaW5lZChPU19XSU4pCi0jZGVmaW5lIE1BWUJFX0FsbG9jYXRlQmFkU2l6ZSBBbGxvY2F0ZUJhZFNpemUKLS8vIFdpbmRvd3MgY3VycmVudGx5IHVzZXMgRGlyZWN0U2hvdyB0byBjb252ZXJ0IGZyb20gTUpQRUcgYW5kIGEgcmF3IGZvcm1hdCBpcwotLy8gYWx3YXlzIGRlbGl2ZXJlZC4KLSNkZWZpbmUgTUFZQkVfQ2FwdHVyZU1qcGVnIERJU0FCTEVEX0NhcHR1cmVNanBlZwotI2Vsc2UKLSNkZWZpbmUgTUFZQkVfQWxsb2NhdGVCYWRTaXplIEFsbG9jYXRlQmFkU2l6ZQotI2RlZmluZSBNQVlCRV9DYXB0dXJlTWpwZWcgQ2FwdHVyZU1qcGVnCi0jZW5kaWYKLQotdXNpbmcgOjp0ZXN0aW5nOjpfOwotdXNpbmcgOjp0ZXN0aW5nOjpBbnlOdW1iZXI7Ci11c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKLXVzaW5nIDo6dGVzdGluZzo6QXRMZWFzdDsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgTW9ja0ZyYW1lT2JzZXJ2ZXIgOiBwdWJsaWMgbWVkaWE6OlZpZGVvQ2FwdHVyZURldmljZTo6RXZlbnRIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EMChPbkVyciwgdm9pZCgpKTsKLSAgTU9DS19NRVRIT0Q0KE9uRnJhbWVJbmZvLCB2b2lkKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZyYW1lX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0NhcHR1cmVDYXBhYmlsaXR5OjpGb3JtYXQgZm9ybWF0KSk7Ci0KLSAgZXhwbGljaXQgTW9ja0ZyYW1lT2JzZXJ2ZXIoYmFzZTo6V2FpdGFibGVFdmVudCogd2FpdF9ldmVudCkKLSAgICAgOiB3YWl0X2V2ZW50Xyh3YWl0X2V2ZW50KSB7fQotCi0gIHZpcnR1YWwgdm9pZCBPbkVycm9yKCkgT1ZFUlJJREUgewotICAgIE9uRXJyKCk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgT25GcmFtZUluZm8oCi0gICAgICBjb25zdCBWaWRlb0NhcHR1cmVDYXBhYmlsaXR5JiBpbmZvKSBPVkVSUklERSB7Ci0gICAgT25GcmFtZUluZm8oaW5mby53aWR0aCwgaW5mby5oZWlnaHQsIGluZm8uZnJhbWVfcmF0ZSwgaW5mby5jb2xvcik7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgT25JbmNvbWluZ0NhcHR1cmVkRnJhbWUoY29uc3QgdWludDgqIGRhdGEsIGludCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lIHRpbWVzdGFtcCkgT1ZFUlJJREUgewotICAgIHdhaXRfZXZlbnRfLT5TaWduYWwoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgYmFzZTo6V2FpdGFibGVFdmVudCogd2FpdF9ldmVudF87Ci19OwotCi1jbGFzcyBWaWRlb0NhcHR1cmVEZXZpY2VUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgVmlkZW9DYXB0dXJlRGV2aWNlVGVzdCgpOiB3YWl0X2V2ZW50XyhmYWxzZSwgZmFsc2UpIHsgfQotCi0gIHZvaWQgUG9zdFF1aXRUYXNrKCkgewotICAgIGxvb3BfLT5Qb3N0VGFzayhGUk9NX0hFUkUsIE1lc3NhZ2VMb29wOjpRdWl0Q2xvc3VyZSgpKTsKLSAgICBsb29wXy0+UnVuKCk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIGZyYW1lX29ic2VydmVyXy5yZXNldChuZXcgTW9ja0ZyYW1lT2JzZXJ2ZXIoJndhaXRfZXZlbnRfKSk7Ci0gICAgbG9vcF8ucmVzZXQobmV3IE1lc3NhZ2VMb29wRm9yVUkoKSk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gIH0KLQotI2lmIGRlZmluZWQoT1NfV0lOKQotICBiYXNlOjp3aW46OlNjb3BlZENPTUluaXRpYWxpemVyIGluaXRpYWxpemVfY29tXzsKLSNlbmRpZgotICBiYXNlOjpXYWl0YWJsZUV2ZW50IHdhaXRfZXZlbnRfOwotICBzY29wZWRfcHRyPE1vY2tGcmFtZU9ic2VydmVyPiBmcmFtZV9vYnNlcnZlcl87Ci0gIFZpZGVvQ2FwdHVyZURldmljZTo6TmFtZXMgbmFtZXNfOwotICBzY29wZWRfcHRyPE1lc3NhZ2VMb29wPiBsb29wXzsKLX07Ci0KLVRFU1RfRihWaWRlb0NhcHR1cmVEZXZpY2VUZXN0LCBPcGVuSW52YWxpZERldmljZSkgewotICBWaWRlb0NhcHR1cmVEZXZpY2U6Ok5hbWUgZGV2aWNlX25hbWU7Ci0gIGRldmljZV9uYW1lLmRldmljZV9uYW1lID0gImppYmJlcmlzaCI7Ci0gIGRldmljZV9uYW1lLnVuaXF1ZV9pZCA9ICJqaWJiZXJpc2giOwotICBWaWRlb0NhcHR1cmVEZXZpY2UqIGRldmljZSA9IFZpZGVvQ2FwdHVyZURldmljZTo6Q3JlYXRlKGRldmljZV9uYW1lKTsKLSAgRVhQRUNUX1RSVUUoZGV2aWNlID09IE5VTEwpOwotfQotCi1URVNUX0YoVmlkZW9DYXB0dXJlRGV2aWNlVGVzdCwgQ2FwdHVyZVZHQSkgewotICBWaWRlb0NhcHR1cmVEZXZpY2U6OkdldERldmljZU5hbWVzKCZuYW1lc18pOwotICBpZiAoIW5hbWVzXy5zaXplKCkpIHsKLSAgICBEVkxPRygxKSA8PCAiTm8gY2FtZXJhIGF2YWlsYWJsZS4gRXhpdGluZyB0ZXN0LiI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc2NvcGVkX3B0cjxWaWRlb0NhcHR1cmVEZXZpY2U+IGRldmljZSgKLSAgICAgIFZpZGVvQ2FwdHVyZURldmljZTo6Q3JlYXRlKG5hbWVzXy5mcm9udCgpKSk7Ci0gIEFTU0VSVF9GQUxTRShkZXZpY2UuZ2V0KCkgPT0gTlVMTCk7Ci0KLSAgLy8gR2V0IGluZm8gYWJvdXQgdGhlIG5ldyByZXNvbHV0aW9uLgotICBFWFBFQ1RfQ0FMTCgqZnJhbWVfb2JzZXJ2ZXJfLCBPbkZyYW1lSW5mbyg2NDAsIDQ4MCwgMzAsIF8pKQotICAgICAgLlRpbWVzKDEpOwotCi0gIEVYUEVDVF9DQUxMKCpmcmFtZV9vYnNlcnZlcl8sIE9uRXJyKCkpCi0gICAgICAuVGltZXMoMCk7Ci0KLSAgZGV2aWNlLT5BbGxvY2F0ZSg2NDAsIDQ4MCwgMzAsIGZyYW1lX29ic2VydmVyXy5nZXQoKSk7Ci0gIGRldmljZS0+U3RhcnQoKTsKLSAgLy8gR2V0IGNhcHR1cmVkIHZpZGVvIGZyYW1lcy4KLSAgUG9zdFF1aXRUYXNrKCk7Ci0gIEVYUEVDVF9UUlVFKHdhaXRfZXZlbnRfLlRpbWVkV2FpdChUZXN0VGltZW91dHM6OmFjdGlvbl9tYXhfdGltZW91dCgpKSk7Ci0gIGRldmljZS0+U3RvcCgpOwotICBkZXZpY2UtPkRlQWxsb2NhdGUoKTsKLX0KLQotVEVTVF9GKFZpZGVvQ2FwdHVyZURldmljZVRlc3QsIENhcHR1cmU3MjBwKSB7Ci0gIFZpZGVvQ2FwdHVyZURldmljZTo6R2V0RGV2aWNlTmFtZXMoJm5hbWVzXyk7Ci0gIGlmICghbmFtZXNfLnNpemUoKSkgewotICAgIERWTE9HKDEpIDw8ICJObyBjYW1lcmEgYXZhaWxhYmxlLiBFeGl0aW5nIHRlc3QuIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzY29wZWRfcHRyPFZpZGVvQ2FwdHVyZURldmljZT4gZGV2aWNlKAotICAgICAgVmlkZW9DYXB0dXJlRGV2aWNlOjpDcmVhdGUobmFtZXNfLmZyb250KCkpKTsKLSAgQVNTRVJUX0ZBTFNFKGRldmljZS5nZXQoKSA9PSBOVUxMKTsKLQotICAvLyBHZXQgaW5mbyBhYm91dCB0aGUgbmV3IHJlc29sdXRpb24uCi0gIC8vIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIHJlc3VsdGluZyByZXNvbHV0aW9uIG9yIGZyYW1lIHJhdGUgYXMgaXQgbWlnaHQKLSAgLy8gYmUgZGlmZmVyZW50IGZyb20gb25lIG1hY2hpbmUgdG8gdGhlIG5leHQuCi0gIEVYUEVDVF9DQUxMKCpmcmFtZV9vYnNlcnZlcl8sIE9uRnJhbWVJbmZvKF8sIF8sIF8sIF8pKQotICAgICAgLlRpbWVzKDEpOwotCi0gIEVYUEVDVF9DQUxMKCpmcmFtZV9vYnNlcnZlcl8sIE9uRXJyKCkpCi0gICAgICAuVGltZXMoMCk7Ci0KLSAgZGV2aWNlLT5BbGxvY2F0ZSgxMjgwLCA3MjAsIDMwLCBmcmFtZV9vYnNlcnZlcl8uZ2V0KCkpOwotICBkZXZpY2UtPlN0YXJ0KCk7Ci0gIC8vIEdldCBjYXB0dXJlZCB2aWRlbyBmcmFtZXMuCi0gIFBvc3RRdWl0VGFzaygpOwotICBFWFBFQ1RfVFJVRSh3YWl0X2V2ZW50Xy5UaW1lZFdhaXQoVGVzdFRpbWVvdXRzOjphY3Rpb25fbWF4X3RpbWVvdXQoKSkpOwotICBkZXZpY2UtPlN0b3AoKTsKLSAgZGV2aWNlLT5EZUFsbG9jYXRlKCk7Ci19Ci0KLVRFU1RfRihWaWRlb0NhcHR1cmVEZXZpY2VUZXN0LCBNQVlCRV9BbGxvY2F0ZUJhZFNpemUpIHsKLSAgVmlkZW9DYXB0dXJlRGV2aWNlOjpHZXREZXZpY2VOYW1lcygmbmFtZXNfKTsKLSAgaWYgKCFuYW1lc18uc2l6ZSgpKSB7Ci0gICAgRFZMT0coMSkgPDwgIk5vIGNhbWVyYSBhdmFpbGFibGUuIEV4aXRpbmcgdGVzdC4iOwotICAgIHJldHVybjsKLSAgfQotICBzY29wZWRfcHRyPFZpZGVvQ2FwdHVyZURldmljZT4gZGV2aWNlKAotICAgICAgVmlkZW9DYXB0dXJlRGV2aWNlOjpDcmVhdGUobmFtZXNfLmZyb250KCkpKTsKLSAgQVNTRVJUX1RSVUUoZGV2aWNlLmdldCgpICE9IE5VTEwpOwotCi0gIEVYUEVDVF9DQUxMKCpmcmFtZV9vYnNlcnZlcl8sIE9uRXJyKCkpCi0gICAgICAuVGltZXMoMCk7Ci0KLSAgLy8gZ2V0IGluZm8gYWJvdXQgdGhlIG5ldyByZXNvbHV0aW9uCi0gIEVYUEVDVF9DQUxMKCpmcmFtZV9vYnNlcnZlcl8sIE9uRnJhbWVJbmZvKDY0MCwgNDgwICwgXywgXykpCi0gICAgICAuVGltZXMoQXRMZWFzdCgxKSk7Ci0KLSAgZGV2aWNlLT5BbGxvY2F0ZSg2MzcsIDQ3MiwgMzUsIGZyYW1lX29ic2VydmVyXy5nZXQoKSk7Ci0gIGRldmljZS0+RGVBbGxvY2F0ZSgpOwotfQotCi1URVNUX0YoVmlkZW9DYXB0dXJlRGV2aWNlVGVzdCwgUmVBbGxvY2F0ZUNhbWVyYSkgewotICBWaWRlb0NhcHR1cmVEZXZpY2U6OkdldERldmljZU5hbWVzKCZuYW1lc18pOwotICBpZiAoIW5hbWVzXy5zaXplKCkpIHsKLSAgICBEVkxPRygxKSA8PCAiTm8gY2FtZXJhIGF2YWlsYWJsZS4gRXhpdGluZyB0ZXN0LiI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHNjb3BlZF9wdHI8VmlkZW9DYXB0dXJlRGV2aWNlPiBkZXZpY2UoCi0gICAgICBWaWRlb0NhcHR1cmVEZXZpY2U6OkNyZWF0ZShuYW1lc18uZnJvbnQoKSkpOwotICBBU1NFUlRfVFJVRShkZXZpY2UuZ2V0KCkgIT0gTlVMTCk7Ci0gIEVYUEVDVF9DQUxMKCpmcmFtZV9vYnNlcnZlcl8sIE9uRXJyKCkpCi0gICAgICAuVGltZXMoMCk7Ci0gIC8vIGdldCBpbmZvIGFib3V0IHRoZSBuZXcgcmVzb2x1dGlvbgotICBFWFBFQ1RfQ0FMTCgqZnJhbWVfb2JzZXJ2ZXJfLCBPbkZyYW1lSW5mbyg2NDAsIDQ4MCwgXywgXykpOwotCi0gIEVYUEVDVF9DQUxMKCpmcmFtZV9vYnNlcnZlcl8sIE9uRnJhbWVJbmZvKDMyMCwgMjQwLCBfLCBfKSk7Ci0KLSAgZGV2aWNlLT5BbGxvY2F0ZSg2NDAsIDQ4MCwgMzAsIGZyYW1lX29ic2VydmVyXy5nZXQoKSk7Ci0gIGRldmljZS0+U3RhcnQoKTsKLSAgLy8gTm90aGluZyBzaGFsbCBoYXBwZW4uCi0gIGRldmljZS0+QWxsb2NhdGUoMTI4MCwgMTAyNCwgMzAsIGZyYW1lX29ic2VydmVyXy5nZXQoKSk7Ci0gIGRldmljZS0+RGVBbGxvY2F0ZSgpOwotICAvLyBBbGxvY2F0ZSBuZXcgc2l6ZSAzMjAsIDI0MAotICBkZXZpY2UtPkFsbG9jYXRlKDMyMCwgMjQwLCAzMCwgZnJhbWVfb2JzZXJ2ZXJfLmdldCgpKTsKLQotICBkZXZpY2UtPlN0YXJ0KCk7Ci0gIC8vIEdldCBjYXB0dXJlZCB2aWRlbyBmcmFtZXMuCi0gIFBvc3RRdWl0VGFzaygpOwotICBFWFBFQ1RfVFJVRSh3YWl0X2V2ZW50Xy5UaW1lZFdhaXQoVGVzdFRpbWVvdXRzOjphY3Rpb25fbWF4X3RpbWVvdXQoKSkpOwotICBkZXZpY2UtPlN0b3AoKTsKLSAgZGV2aWNlLT5EZUFsbG9jYXRlKCk7Ci19Ci0KLVRFU1RfRihWaWRlb0NhcHR1cmVEZXZpY2VUZXN0LCBEZUFsbG9jYXRlQ2FtZXJhV2hpbGVSdW5uaW5nKSB7Ci0gIFZpZGVvQ2FwdHVyZURldmljZTo6R2V0RGV2aWNlTmFtZXMoJm5hbWVzXyk7Ci0gIGlmICghbmFtZXNfLnNpemUoKSkgewotICAgIERWTE9HKDEpIDw8ICJObyBjYW1lcmEgYXZhaWxhYmxlLiBFeGl0aW5nIHRlc3QuIjsKLSAgICByZXR1cm47Ci0gIH0KLSAgc2NvcGVkX3B0cjxWaWRlb0NhcHR1cmVEZXZpY2U+IGRldmljZSgKLSAgICAgIFZpZGVvQ2FwdHVyZURldmljZTo6Q3JlYXRlKG5hbWVzXy5mcm9udCgpKSk7Ci0gIEFTU0VSVF9UUlVFKGRldmljZS5nZXQoKSAhPSBOVUxMKTsKLQotICBFWFBFQ1RfQ0FMTCgqZnJhbWVfb2JzZXJ2ZXJfLCBPbkVycigpKQotICAgICAgLlRpbWVzKDApOwotICAvLyBHZXQgaW5mbyBhYm91dCB0aGUgbmV3IHJlc29sdXRpb24uCi0gIEVYUEVDVF9DQUxMKCpmcmFtZV9vYnNlcnZlcl8sIE9uRnJhbWVJbmZvKDY0MCwgNDgwLCAzMCwgXykpOwotCi0gIGRldmljZS0+QWxsb2NhdGUoNjQwLCA0ODAsIDMwLCBmcmFtZV9vYnNlcnZlcl8uZ2V0KCkpOwotCi0gIGRldmljZS0+U3RhcnQoKTsKLSAgLy8gR2V0IGNhcHR1cmVkIHZpZGVvIGZyYW1lcy4KLSAgUG9zdFF1aXRUYXNrKCk7Ci0gIEVYUEVDVF9UUlVFKHdhaXRfZXZlbnRfLlRpbWVkV2FpdChUZXN0VGltZW91dHM6OmFjdGlvbl9tYXhfdGltZW91dCgpKSk7Ci0gIGRldmljZS0+RGVBbGxvY2F0ZSgpOwotfQotCi1URVNUX0YoVmlkZW9DYXB0dXJlRGV2aWNlVGVzdCwgVGVzdEZha2VDYXB0dXJlKSB7Ci0gIFZpZGVvQ2FwdHVyZURldmljZTo6TmFtZXMgbmFtZXM7Ci0KLSAgRmFrZVZpZGVvQ2FwdHVyZURldmljZTo6R2V0RGV2aWNlTmFtZXMoJm5hbWVzKTsKLQotICBBU1NFUlRfR1Qoc3RhdGljX2Nhc3Q8aW50PihuYW1lcy5zaXplKCkpLCAwKTsKLQotICBzY29wZWRfcHRyPFZpZGVvQ2FwdHVyZURldmljZT4gZGV2aWNlKAotICAgICAgRmFrZVZpZGVvQ2FwdHVyZURldmljZTo6Q3JlYXRlKG5hbWVzLmZyb250KCkpKTsKLSAgQVNTRVJUX1RSVUUoZGV2aWNlLmdldCgpICE9IE5VTEwpOwotCi0gIC8vIEdldCBpbmZvIGFib3V0IHRoZSBuZXcgcmVzb2x1dGlvbi4KLSAgRVhQRUNUX0NBTEwoKmZyYW1lX29ic2VydmVyXywgT25GcmFtZUluZm8oNjQwLCA0ODAsIDMwLCBfKSkKLSAgICAgIC5UaW1lcygxKTsKLQotICBFWFBFQ1RfQ0FMTCgqZnJhbWVfb2JzZXJ2ZXJfLCBPbkVycigpKQotICAgICAgLlRpbWVzKDApOwotCi0gIGRldmljZS0+QWxsb2NhdGUoNjQwLCA0ODAsIDMwLCBmcmFtZV9vYnNlcnZlcl8uZ2V0KCkpOwotCi0gIGRldmljZS0+U3RhcnQoKTsKLSAgRVhQRUNUX1RSVUUod2FpdF9ldmVudF8uVGltZWRXYWl0KFRlc3RUaW1lb3V0czo6YWN0aW9uX21heF90aW1lb3V0KCkpKTsKLSAgZGV2aWNlLT5TdG9wKCk7Ci0gIGRldmljZS0+RGVBbGxvY2F0ZSgpOwotfQotCi0vLyBTdGFydCB0aGUgY2FtZXJhIGluIDcyMHAgdG8gY2FwdHVyZSBNSlBFRyBpbnN0ZWFkIG9mIGEgcmF3IGZvcm1hdC4KLVRFU1RfRihWaWRlb0NhcHR1cmVEZXZpY2VUZXN0LCBNQVlCRV9DYXB0dXJlTWpwZWcpIHsKLSAgVmlkZW9DYXB0dXJlRGV2aWNlOjpHZXREZXZpY2VOYW1lcygmbmFtZXNfKTsKLSAgaWYgKCFuYW1lc18uc2l6ZSgpKSB7Ci0gICAgRFZMT0coMSkgPDwgIk5vIGNhbWVyYSBhdmFpbGFibGUuIEV4aXRpbmcgdGVzdC4iOwotICAgIHJldHVybjsKLSAgfQotICBzY29wZWRfcHRyPFZpZGVvQ2FwdHVyZURldmljZT4gZGV2aWNlKAotICAgICAgVmlkZW9DYXB0dXJlRGV2aWNlOjpDcmVhdGUobmFtZXNfLmZyb250KCkpKTsKLSAgQVNTRVJUX1RSVUUoZGV2aWNlLmdldCgpICE9IE5VTEwpOwotCi0gIEVYUEVDVF9DQUxMKCpmcmFtZV9vYnNlcnZlcl8sIE9uRXJyKCkpCi0gICAgICAuVGltZXMoMCk7Ci0gIC8vIFZlcmlmeSB3ZSBnZXQgTUpQRUcgZnJvbSB0aGUgZGV2aWNlLiBOb3QgYWxsIGRldmljZXMgY2FuIGNhcHR1cmUgMTI4MHg3MjAKLSAgLy8gQCAzMCBmcHMsIHNvIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIGV4YWN0IHJlc29sdXRpb24gd2UgZ2V0LgotICBFWFBFQ1RfQ0FMTCgqZnJhbWVfb2JzZXJ2ZXJfLAotICAgICAgICAgICAgICBPbkZyYW1lSW5mbyhfLCBfLCBfLCBWaWRlb0NhcHR1cmVDYXBhYmlsaXR5OjprTUpQRUcpKTsKLQotICBkZXZpY2UtPkFsbG9jYXRlKDEyODAsIDcyMCwgMzAsIGZyYW1lX29ic2VydmVyXy5nZXQoKSk7Ci0KLSAgZGV2aWNlLT5TdGFydCgpOwotICAvLyBHZXQgY2FwdHVyZWQgdmlkZW8gZnJhbWVzLgotICBQb3N0UXVpdFRhc2soKTsKLSAgRVhQRUNUX1RSVUUod2FpdF9ldmVudF8uVGltZWRXYWl0KFRlc3RUaW1lb3V0czo6YWN0aW9uX21heF90aW1lb3V0KCkpKTsKLSAgZGV2aWNlLT5EZUFsbG9jYXRlKCk7Ci19Ci0KLX07ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL3ZpZGVvX2NhcHR1cmVfcHJveHkuY2MgYi9zcmMvbWVkaWEvdmlkZW8vY2FwdHVyZS92aWRlb19jYXB0dXJlX3Byb3h5LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjNkNzdmLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL3ZpZGVvX2NhcHR1cmVfcHJveHkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDExIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL3ZpZGVvL2NhcHR1cmUvdmlkZW9fY2FwdHVyZV9wcm94eS5oIgotCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2NhdGlvbi5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wX3Byb3h5LmgiCi0KLW5hbWVzcGFjZSB7Ci0KLS8vIENhbGxlZCBvbiBWQyB0aHJlYWQ6IGV4dHJhY3RzIHRoZSBzdGF0ZSBvdXQgb2YgdGhlIFZpZGVvQ2FwdHVyZSwgYW5kCi0vLyBzZXJpYWxpemUgaXQgaW50byBhIFZpZGVvQ2FwdHVyZVN0YXRlLgotbWVkaWE6OlZpZGVvQ2FwdHVyZUhhbmRsZXJQcm94eTo6VmlkZW9DYXB0dXJlU3RhdGUgR2V0U3RhdGUoCi0gICAgbWVkaWE6OlZpZGVvQ2FwdHVyZSogY2FwdHVyZSkgewotICBtZWRpYTo6VmlkZW9DYXB0dXJlSGFuZGxlclByb3h5OjpWaWRlb0NhcHR1cmVTdGF0ZSBzdGF0ZTsKLSAgc3RhdGUuc3RhcnRlZCA9IGNhcHR1cmUtPkNhcHR1cmVTdGFydGVkKCk7Ci0gIHN0YXRlLndpZHRoID0gY2FwdHVyZS0+Q2FwdHVyZVdpZHRoKCk7Ci0gIHN0YXRlLmhlaWdodCA9IGNhcHR1cmUtPkNhcHR1cmVIZWlnaHQoKTsKLSAgc3RhdGUuZnJhbWVfcmF0ZSA9IGNhcHR1cmUtPkNhcHR1cmVGcmFtZVJhdGUoKTsKLSAgcmV0dXJuIHN0YXRlOwotfQotCi19ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLVZpZGVvQ2FwdHVyZUhhbmRsZXJQcm94eTo6VmlkZW9DYXB0dXJlSGFuZGxlclByb3h5KAotICAgIFZpZGVvQ2FwdHVyZTo6RXZlbnRIYW5kbGVyKiBwcm94aWVkLAotICAgIHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4gbWFpbl9tZXNzYWdlX2xvb3ApCi0gICAgOiBwcm94aWVkXyhwcm94aWVkKSwKLSAgICAgIG1haW5fbWVzc2FnZV9sb29wXyhtYWluX21lc3NhZ2VfbG9vcCkgewotfQotCi1WaWRlb0NhcHR1cmVIYW5kbGVyUHJveHk6On5WaWRlb0NhcHR1cmVIYW5kbGVyUHJveHkoKSB7Ci19Ci0KLXZvaWQgVmlkZW9DYXB0dXJlSGFuZGxlclByb3h5OjpPblN0YXJ0ZWQoVmlkZW9DYXB0dXJlKiBjYXB0dXJlKSB7Ci0gIG1haW5fbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soRlJPTV9IRVJFLCBiYXNlOjpCaW5kKAotICAgICAgICAmVmlkZW9DYXB0dXJlSGFuZGxlclByb3h5OjpPblN0YXJ0ZWRPbk1haW5UaHJlYWQsCi0gICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksCi0gICAgICAgIGNhcHR1cmUsCi0gICAgICAgIEdldFN0YXRlKGNhcHR1cmUpKSk7Ci19Ci0KLXZvaWQgVmlkZW9DYXB0dXJlSGFuZGxlclByb3h5OjpPblN0b3BwZWQoVmlkZW9DYXB0dXJlKiBjYXB0dXJlKSB7Ci0gIG1haW5fbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soRlJPTV9IRVJFLCBiYXNlOjpCaW5kKAotICAgICAgICAmVmlkZW9DYXB0dXJlSGFuZGxlclByb3h5OjpPblN0b3BwZWRPbk1haW5UaHJlYWQsCi0gICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksCi0gICAgICAgIGNhcHR1cmUsCi0gICAgICAgIEdldFN0YXRlKGNhcHR1cmUpKSk7Ci19Ci0KLXZvaWQgVmlkZW9DYXB0dXJlSGFuZGxlclByb3h5OjpPblBhdXNlZChWaWRlb0NhcHR1cmUqIGNhcHR1cmUpIHsKLSAgbWFpbl9tZXNzYWdlX2xvb3BfLT5Qb3N0VGFzayhGUk9NX0hFUkUsIGJhc2U6OkJpbmQoCi0gICAgICAmVmlkZW9DYXB0dXJlSGFuZGxlclByb3h5OjpPblBhdXNlZE9uTWFpblRocmVhZCwKLSAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksCi0gICAgICBjYXB0dXJlLAotICAgICAgR2V0U3RhdGUoY2FwdHVyZSkpKTsKLX0KLQotdm9pZCBWaWRlb0NhcHR1cmVIYW5kbGVyUHJveHk6Ok9uRXJyb3IoVmlkZW9DYXB0dXJlKiBjYXB0dXJlLCBpbnQgZXJyb3JfY29kZSkgewotICBtYWluX21lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKEZST01fSEVSRSwgYmFzZTo6QmluZCgKLSAgICAgICZWaWRlb0NhcHR1cmVIYW5kbGVyUHJveHk6Ok9uRXJyb3JPbk1haW5UaHJlYWQsCi0gICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLAotICAgICAgY2FwdHVyZSwKLSAgICAgIEdldFN0YXRlKGNhcHR1cmUpLAotICAgICAgZXJyb3JfY29kZSkpOwotfQotCi12b2lkIFZpZGVvQ2FwdHVyZUhhbmRsZXJQcm94eTo6T25SZW1vdmVkKFZpZGVvQ2FwdHVyZSogY2FwdHVyZSkgewotICBtYWluX21lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKEZST01fSEVSRSwgYmFzZTo6QmluZCgKLSAgICAgICZWaWRlb0NhcHR1cmVIYW5kbGVyUHJveHk6Ok9uUmVtb3ZlZE9uTWFpblRocmVhZCwKLSAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksCi0gICAgICBjYXB0dXJlLAotICAgICAgR2V0U3RhdGUoY2FwdHVyZSkpKTsKLX0KLQotdm9pZCBWaWRlb0NhcHR1cmVIYW5kbGVyUHJveHk6Ok9uQnVmZmVyUmVhZHkoCi0gICAgVmlkZW9DYXB0dXJlKiBjYXB0dXJlLAotICAgIHNjb3BlZF9yZWZwdHI8VmlkZW9DYXB0dXJlOjpWaWRlb0ZyYW1lQnVmZmVyPiBidWZmZXIpIHsKLSAgbWFpbl9tZXNzYWdlX2xvb3BfLT5Qb3N0VGFzayhGUk9NX0hFUkUsIGJhc2U6OkJpbmQoCi0gICAgICAmVmlkZW9DYXB0dXJlSGFuZGxlclByb3h5OjpPbkJ1ZmZlclJlYWR5T25NYWluVGhyZWFkLAotICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwKLSAgICAgIGNhcHR1cmUsCi0gICAgICBHZXRTdGF0ZShjYXB0dXJlKSwKLSAgICAgIGJ1ZmZlcikpOwotfQotCi12b2lkIFZpZGVvQ2FwdHVyZUhhbmRsZXJQcm94eTo6T25EZXZpY2VJbmZvUmVjZWl2ZWQoCi0gICAgVmlkZW9DYXB0dXJlKiBjYXB0dXJlLAotICAgIGNvbnN0IFZpZGVvQ2FwdHVyZVBhcmFtcyYgZGV2aWNlX2luZm8pIHsKLSAgbWFpbl9tZXNzYWdlX2xvb3BfLT5Qb3N0VGFzayhGUk9NX0hFUkUsIGJhc2U6OkJpbmQoCi0gICAgICAmVmlkZW9DYXB0dXJlSGFuZGxlclByb3h5OjpPbkRldmljZUluZm9SZWNlaXZlZE9uTWFpblRocmVhZCwKLSAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksCi0gICAgICBjYXB0dXJlLAotICAgICAgR2V0U3RhdGUoY2FwdHVyZSksCi0gICAgICBkZXZpY2VfaW5mbykpOwotfQotCi12b2lkIFZpZGVvQ2FwdHVyZUhhbmRsZXJQcm94eTo6T25TdGFydGVkT25NYWluVGhyZWFkKAotICAgIFZpZGVvQ2FwdHVyZSogY2FwdHVyZSwKLSAgICBjb25zdCBWaWRlb0NhcHR1cmVTdGF0ZSYgc3RhdGUpIHsKLSAgc3RhdGVfID0gc3RhdGU7Ci0gIHByb3hpZWRfLT5PblN0YXJ0ZWQoY2FwdHVyZSk7Ci19Ci0KLXZvaWQgVmlkZW9DYXB0dXJlSGFuZGxlclByb3h5OjpPblN0b3BwZWRPbk1haW5UaHJlYWQoCi0gICAgVmlkZW9DYXB0dXJlKiBjYXB0dXJlLAotICAgIGNvbnN0IFZpZGVvQ2FwdHVyZVN0YXRlJiBzdGF0ZSkgewotICBzdGF0ZV8gPSBzdGF0ZTsKLSAgcHJveGllZF8tPk9uU3RvcHBlZChjYXB0dXJlKTsKLX0KLQotdm9pZCBWaWRlb0NhcHR1cmVIYW5kbGVyUHJveHk6Ok9uUGF1c2VkT25NYWluVGhyZWFkKAotICAgIFZpZGVvQ2FwdHVyZSogY2FwdHVyZSwKLSAgICBjb25zdCBWaWRlb0NhcHR1cmVTdGF0ZSYgc3RhdGUpIHsKLSAgc3RhdGVfID0gc3RhdGU7Ci0gIHByb3hpZWRfLT5PblBhdXNlZChjYXB0dXJlKTsKLX0KLQotdm9pZCBWaWRlb0NhcHR1cmVIYW5kbGVyUHJveHk6Ok9uRXJyb3JPbk1haW5UaHJlYWQoCi0gICAgVmlkZW9DYXB0dXJlKiBjYXB0dXJlLAotICAgIGNvbnN0IFZpZGVvQ2FwdHVyZVN0YXRlJiBzdGF0ZSwKLSAgICBpbnQgZXJyb3JfY29kZSkgewotICBzdGF0ZV8gPSBzdGF0ZTsKLSAgcHJveGllZF8tPk9uRXJyb3IoY2FwdHVyZSwgZXJyb3JfY29kZSk7Ci19Ci0KLXZvaWQgVmlkZW9DYXB0dXJlSGFuZGxlclByb3h5OjpPblJlbW92ZWRPbk1haW5UaHJlYWQoCi0gICAgVmlkZW9DYXB0dXJlKiBjYXB0dXJlLAotICAgIGNvbnN0IFZpZGVvQ2FwdHVyZVN0YXRlJiBzdGF0ZSkgewotICBzdGF0ZV8gPSBzdGF0ZTsKLSAgcHJveGllZF8tPk9uUmVtb3ZlZChjYXB0dXJlKTsKLX0KLQotdm9pZCBWaWRlb0NhcHR1cmVIYW5kbGVyUHJveHk6Ok9uQnVmZmVyUmVhZHlPbk1haW5UaHJlYWQoCi0gICAgVmlkZW9DYXB0dXJlKiBjYXB0dXJlLAotICAgIGNvbnN0IFZpZGVvQ2FwdHVyZVN0YXRlJiBzdGF0ZSwKLSAgICBzY29wZWRfcmVmcHRyPFZpZGVvQ2FwdHVyZTo6VmlkZW9GcmFtZUJ1ZmZlcj4gYnVmZmVyKSB7Ci0gIHN0YXRlXyA9IHN0YXRlOwotICBwcm94aWVkXy0+T25CdWZmZXJSZWFkeShjYXB0dXJlLCBidWZmZXIpOwotfQotCi12b2lkIFZpZGVvQ2FwdHVyZUhhbmRsZXJQcm94eTo6T25EZXZpY2VJbmZvUmVjZWl2ZWRPbk1haW5UaHJlYWQoCi0gICAgVmlkZW9DYXB0dXJlKiBjYXB0dXJlLAotICAgIGNvbnN0IFZpZGVvQ2FwdHVyZVN0YXRlJiBzdGF0ZSwKLSAgICBjb25zdCBWaWRlb0NhcHR1cmVQYXJhbXMmIGRldmljZV9pbmZvKSB7Ci0gIHN0YXRlXyA9IHN0YXRlOwotICBwcm94aWVkXy0+T25EZXZpY2VJbmZvUmVjZWl2ZWQoY2FwdHVyZSwgZGV2aWNlX2luZm8pOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL3ZpZGVvX2NhcHR1cmVfcHJveHkuaCBiL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL3ZpZGVvX2NhcHR1cmVfcHJveHkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhjNDU5ZC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvdmlkZW8vY2FwdHVyZS92aWRlb19jYXB0dXJlX3Byb3h5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX1ZJREVPX0NBUFRVUkVfVklERU9fQ0FQVFVSRV9QUk9YWV9IXwotI2RlZmluZSBNRURJQV9WSURFT19DQVBUVVJFX1ZJREVPX0NBUFRVUkVfUFJPWFlfSF8KLQotI2luY2x1ZGUgImJhc2UvY29tcGlsZXJfc3BlY2lmaWMuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgIm1lZGlhL3ZpZGVvL2NhcHR1cmUvdmlkZW9fY2FwdHVyZS5oIgotCi1uYW1lc3BhY2UgYmFzZSB7Ci1jbGFzcyBNZXNzYWdlTG9vcFByb3h5OwotfQotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBUaGlzIGlzIGEgaGVscGVyIGNsYXNzIHRvIHByb3h5IGEgVmlkZW9DYXB0dXJlOjpFdmVudEhhbmRsZXIuIEluIHRoZSByZW5kZXJlcgotLy8gcHJvY2VzcywgdGhlIFZpZGVvQ2FwdHVyZUltcGwgY2FsbHMgaXRzIGhhbmRsZXIgb24gYSAiVmlkZW8gQ2FwdHVyZSIgdGhyZWFkLAotLy8gdGhpcyBjbGFzcyBhbGxvd3Mgc2VhbWxlc3MgcHJveHlpbmcgdG8gYW5vdGhlciB0aHJlYWQgKCJtYWluIHRocmVhZCIpLCB3aGljaAotLy8gd291bGQgYmUgdGhlIHRocmVhZCB3aGVyZSB0aGUgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBjcmVhdGVkLiBUaGUKLS8vICJwcm94aWVkIiBoYW5kbGVyIGlzIHRoZW4gY2FsbGVkIG9uIHRoYXQgdGhyZWFkLgotLy8gU2luY2UgdGhlIFZpZGVvQ2FwdHVyZSBpcyBsaXZpbmcgb24gdGhlICJWaWRlbyBDYXB0dXJlIiB0aHJlYWQsIHF1ZXJ5aW5nIGl0cwotLy8gc3RhdGUgZnJvbSB0aGUgIm1haW4gdGhyZWFkIiBpcyBmdW5kYW1lbnRhbGx5IHJhY3kuIEluc3RlYWQgdGhpcyBjbGFzcyBrZWVwcwotLy8gdHJhY2sgb2YgdGhlIHN0YXRlIGV2ZXJ5IHRpbWUgaXQgaXMgY2FsbGVkIGJ5IHRoZSBWaWRlb0NhcHR1cmUgKG9uIHRoZSBWQwotLy8gdGhyZWFkKSwgYW5kIGZvcndhcmRzIHRoYXQgaW5mb3JtYXRpb24gdG8gdGhlIG1haW4gdGhyZWFkLgotY2xhc3MgTUVESUFfRVhQT1JUIFZpZGVvQ2FwdHVyZUhhbmRsZXJQcm94eQotICAgIDogcHVibGljIFZpZGVvQ2FwdHVyZTo6RXZlbnRIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIHN0cnVjdCBWaWRlb0NhcHR1cmVTdGF0ZSB7Ci0gICAgVmlkZW9DYXB0dXJlU3RhdGUoKSA6IHN0YXJ0ZWQoZmFsc2UpLCB3aWR0aCgwKSwgaGVpZ2h0KDApLCBmcmFtZV9yYXRlKDApIHt9Ci0gICAgYm9vbCBzdGFydGVkOwotICAgIGludCB3aWR0aDsKLSAgICBpbnQgaGVpZ2h0OwotICAgIGludCBmcmFtZV9yYXRlOwotICB9OwotCi0gIC8vIENhbGxlZCBvbiBtYWluIHRocmVhZC4KLSAgVmlkZW9DYXB0dXJlSGFuZGxlclByb3h5KAotICAgICAgVmlkZW9DYXB0dXJlOjpFdmVudEhhbmRsZXIqIHByb3hpZWQsCi0gICAgICBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+IG1haW5fbWVzc2FnZV9sb29wKTsKLSAgdmlydHVhbCB+VmlkZW9DYXB0dXJlSGFuZGxlclByb3h5KCk7Ci0KLSAgLy8gUmV0cmlldmVzIHRoZSBzdGF0ZSBvZiB0aGUgVmlkZW9DYXB0dXJlLiBNdXN0IGJlIGNhbGxlZCBvbiBtYWluIHRocmVhZC4KLSAgY29uc3QgVmlkZW9DYXB0dXJlU3RhdGUmIHN0YXRlKCkgY29uc3QgeyByZXR1cm4gc3RhdGVfOyB9Ci0KLSAgLy8gVmlkZW9DYXB0dXJlOjpFdmVudEhhbmRsZXIgaW1wbGVtZW50YXRpb24sIGNhbGxlZCBvbiBWQyB0aHJlYWQuCi0gIHZpcnR1YWwgdm9pZCBPblN0YXJ0ZWQoVmlkZW9DYXB0dXJlKiBjYXB0dXJlKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIE9uU3RvcHBlZChWaWRlb0NhcHR1cmUqIGNhcHR1cmUpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgT25QYXVzZWQoVmlkZW9DYXB0dXJlKiBjYXB0dXJlKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIE9uRXJyb3IoVmlkZW9DYXB0dXJlKiBjYXB0dXJlLCBpbnQgZXJyb3JfY29kZSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBPblJlbW92ZWQoVmlkZW9DYXB0dXJlKiBjYXB0dXJlKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIE9uQnVmZmVyUmVhZHkoCi0gICAgICBWaWRlb0NhcHR1cmUqIGNhcHR1cmUsCi0gICAgICBzY29wZWRfcmVmcHRyPFZpZGVvQ2FwdHVyZTo6VmlkZW9GcmFtZUJ1ZmZlcj4gYnVmZmVyKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIE9uRGV2aWNlSW5mb1JlY2VpdmVkKAotICAgICAgVmlkZW9DYXB0dXJlKiBjYXB0dXJlLAotICAgICAgY29uc3QgVmlkZW9DYXB0dXJlUGFyYW1zJiBkZXZpY2VfaW5mbykgT1ZFUlJJREU7Ci0KLSBwcml2YXRlOgotICAvLyBDYWxsZWQgb24gbWFpbiB0aHJlYWQuCi0gIHZvaWQgT25TdGFydGVkT25NYWluVGhyZWFkKAotICAgICAgVmlkZW9DYXB0dXJlKiBjYXB0dXJlLAotICAgICAgY29uc3QgVmlkZW9DYXB0dXJlU3RhdGUmIHN0YXRlKTsKLSAgdm9pZCBPblN0b3BwZWRPbk1haW5UaHJlYWQoCi0gICAgICBWaWRlb0NhcHR1cmUqIGNhcHR1cmUsCi0gICAgICBjb25zdCBWaWRlb0NhcHR1cmVTdGF0ZSYgc3RhdGUpOwotICB2b2lkIE9uUGF1c2VkT25NYWluVGhyZWFkKAotICAgICAgVmlkZW9DYXB0dXJlKiBjYXB0dXJlLAotICAgICAgY29uc3QgVmlkZW9DYXB0dXJlU3RhdGUmIHN0YXRlKTsKLSAgdm9pZCBPbkVycm9yT25NYWluVGhyZWFkKAotICAgICAgVmlkZW9DYXB0dXJlKiBjYXB0dXJlLAotICAgICAgY29uc3QgVmlkZW9DYXB0dXJlU3RhdGUmIHN0YXRlLAotICAgICAgaW50IGVycm9yX2NvZGUpOwotICB2b2lkIE9uUmVtb3ZlZE9uTWFpblRocmVhZCgKLSAgICAgIFZpZGVvQ2FwdHVyZSogY2FwdHVyZSwKLSAgICAgIGNvbnN0IFZpZGVvQ2FwdHVyZVN0YXRlJiBzdGF0ZSk7Ci0gIHZvaWQgT25CdWZmZXJSZWFkeU9uTWFpblRocmVhZCgKLSAgICAgIFZpZGVvQ2FwdHVyZSogY2FwdHVyZSwKLSAgICAgIGNvbnN0IFZpZGVvQ2FwdHVyZVN0YXRlJiBzdGF0ZSwKLSAgICAgIHNjb3BlZF9yZWZwdHI8VmlkZW9DYXB0dXJlOjpWaWRlb0ZyYW1lQnVmZmVyPiBidWZmZXIpOwotICB2b2lkIE9uRGV2aWNlSW5mb1JlY2VpdmVkT25NYWluVGhyZWFkKAotICAgICAgVmlkZW9DYXB0dXJlKiBjYXB0dXJlLAotICAgICAgY29uc3QgVmlkZW9DYXB0dXJlU3RhdGUmIHN0YXRlLAotICAgICAgY29uc3QgVmlkZW9DYXB0dXJlUGFyYW1zJiBkZXZpY2VfaW5mbyk7Ci0KLSAgLy8gT25seSBhY2Nlc3NlZCBmcm9tIG1haW4gdGhyZWFkLgotICBWaWRlb0NhcHR1cmU6OkV2ZW50SGFuZGxlciogcHJveGllZF87Ci0gIFZpZGVvQ2FwdHVyZVN0YXRlIHN0YXRlXzsKLQotICBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+IG1haW5fbWVzc2FnZV9sb29wXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX1ZJREVPX0NBUFRVUkVfVklERU9fQ0FQVFVSRV9QUk9YWV9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvdmlkZW9fY2FwdHVyZV90eXBlcy5oIGIvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvdmlkZW9fY2FwdHVyZV90eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzJlMjU2Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL3ZpZGVvX2NhcHR1cmVfdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfVklERU9fQ0FQVFVSRV9WSURFT19DQVBUVVJFX1RZUEVTX0hfCi0jZGVmaW5lIE1FRElBX1ZJREVPX0NBUFRVUkVfVklERU9fQ0FQVFVSRV9UWVBFU19IXwotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb19mcmFtZS5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBUT0RPKHdqaWEpOiB0aGlzIHR5cGUgc2hvdWxkIGJlIGRlZmluZWQgaW4gYSBjb21tb24gcGxhY2UgYW5kCi0vLyBzaGFyZWQgd2l0aCBkZXZpY2UgbWFuYWdlci4KLXR5cGVkZWYgaW50IFZpZGVvQ2FwdHVyZVNlc3Npb25JZDsKLQotLy8gUGFyYW1ldGVycyBmb3Igc3RhcnRpbmcgdmlkZW8gY2FwdHVyZSBhbmQgZGV2aWNlIGluZm9ybWF0aW9uLgotc3RydWN0IFZpZGVvQ2FwdHVyZVBhcmFtcyB7Ci0gIGludCB3aWR0aDsKLSAgaW50IGhlaWdodDsKLSAgaW50IGZyYW1lX3Blcl9zZWNvbmQ7Ci0gIFZpZGVvQ2FwdHVyZVNlc3Npb25JZCBzZXNzaW9uX2lkOwotfTsKLQotLy8gQ2FwYWJpbGl0aWVzIGRlc2NyaWJlIHRoZSBmb3JtYXQgYSBjYW1lcmEgY2FwdHVyZSB2aWRlbyBpbi4KLXN0cnVjdCBWaWRlb0NhcHR1cmVDYXBhYmlsaXR5IHsKLSAgLy8gQ29sb3IgZm9ybWF0cyBmcm9tIGNhbWVyYS4KLSAgZW51bSBGb3JtYXQgewotICAgIGtDb2xvclVua25vd24sICAvLyBDb2xvciBmb3JtYXQgbm90IHNldC4KLSAgICBrSTQyMCwKLSAgICBrWVVZMiwKLSAgICBrVVlWWSwKLSAgICBrUkdCMjQsCi0gICAga0FSR0IsCi0gICAga01KUEVHLAotICAgIGtOVjIxLAotICAgIGtZVjEyLAotICB9OwotCi0gIGludCB3aWR0aDsgIC8vIERlc2lyZWQgd2lkdGguCi0gIGludCBoZWlnaHQ7ICAvLyBEZXNpcmVkIGhlaWdodC4KLSAgaW50IGZyYW1lX3JhdGU7ICAvLyBEZXNpcmVkIGZyYW1lIHJhdGUuCi0gIEZvcm1hdCBjb2xvcjsgIC8vIERlc2lyZWQgdmlkZW8gdHlwZS4KLSAgaW50IGV4cGVjdGVkX2NhcHR1cmVfZGVsYXk7ICAvLyBFeHBlY3RlZCBkZWxheSBpbiBtaWxsaXNlY29uZC4KLSAgYm9vbCBpbnRlcmxhY2VkOyAgLy8gTmVlZCBpbnRlcmxhY2UgZm9ybWF0LgotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfVklERU9fQ0FQVFVSRV9WSURFT19DQVBUVVJFX1RZUEVTX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdmlkZW8vY2FwdHVyZS93aW4vY2FwYWJpbGl0eV9saXN0X3dpbi5jYyBiL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL3dpbi9jYXBhYmlsaXR5X2xpc3Rfd2luLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2JkNjliLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL3dpbi9jYXBhYmlsaXR5X2xpc3Rfd2luLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS92aWRlby9jYXB0dXJlL3dpbi9jYXBhYmlsaXR5X2xpc3Rfd2luLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLW5hbWVzcGFjZSB7Ci0KLS8vIEhlbHAgc3RydWN0dXJlIHVzZWQgZm9yIGNvbXBhcmluZyB2aWRlbyBjYXB0dXJlIGNhcGFiaWxpdGllcy4KLXN0cnVjdCBSZXNvbHV0aW9uRGlmZiB7Ci0gIGNvbnN0IFZpZGVvQ2FwdHVyZUNhcGFiaWxpdHlXaW4qIGNhcGFiaWxpdHk7Ci0gIGludCBkaWZmX2hlaWdodDsKLSAgaW50IGRpZmZfd2lkdGg7Ci0gIGludCBkaWZmX2ZyYW1lX3JhdGU7Ci19OwotCi1ib29sIENvbXBhcmVIZWlnaHQoY29uc3QgUmVzb2x1dGlvbkRpZmYmIGl0ZW0xLCBjb25zdCBSZXNvbHV0aW9uRGlmZiYgaXRlbTIpIHsKLSAgcmV0dXJuIGFicyhpdGVtMS5kaWZmX2hlaWdodCkgPCBhYnMoaXRlbTIuZGlmZl9oZWlnaHQpOwotfQotCi1ib29sIENvbXBhcmVXaWR0aChjb25zdCBSZXNvbHV0aW9uRGlmZiYgaXRlbTEsIGNvbnN0IFJlc29sdXRpb25EaWZmJiBpdGVtMikgewotICByZXR1cm4gYWJzKGl0ZW0xLmRpZmZfd2lkdGgpIDwgYWJzKGl0ZW0yLmRpZmZfd2lkdGgpOwotfQotCi1ib29sIENvbXBhcmVGcmFtZVJhdGUoY29uc3QgUmVzb2x1dGlvbkRpZmYmIGl0ZW0xLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlc29sdXRpb25EaWZmJiBpdGVtMikgewotICByZXR1cm4gYWJzKGl0ZW0xLmRpZmZfZnJhbWVfcmF0ZSkgPCBhYnMoaXRlbTIuZGlmZl9mcmFtZV9yYXRlKTsKLX0KLQotYm9vbCBDb21wYXJlQ29sb3IoY29uc3QgUmVzb2x1dGlvbkRpZmYmIGl0ZW0xLCBjb25zdCBSZXNvbHV0aW9uRGlmZiYgaXRlbTIpIHsKLSAgcmV0dXJuIGl0ZW0xLmNhcGFiaWxpdHktPmNvbG9yIDwgaXRlbTIuY2FwYWJpbGl0eS0+Y29sb3I7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZS4KLQotQ2FwYWJpbGl0eUxpc3Q6OkNhcGFiaWxpdHlMaXN0KCkgewotICBEZXRhY2hGcm9tVGhyZWFkKCk7Ci19Ci0KLUNhcGFiaWxpdHlMaXN0Ojp+Q2FwYWJpbGl0eUxpc3QoKSB7fQotCi0vLyBBcHBlbmRzIGFuIGVudHJ5IHRvIHRoZSBsaXN0Lgotdm9pZCBDYXBhYmlsaXR5TGlzdDo6QWRkKGNvbnN0IFZpZGVvQ2FwdHVyZUNhcGFiaWxpdHlXaW4mIGNhcGFiaWxpdHkpIHsKLSAgRENIRUNLKENhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIGNhcGFiaWxpdGllc18ucHVzaF9iYWNrKGNhcGFiaWxpdHkpOwotfQotCi1jb25zdCBWaWRlb0NhcHR1cmVDYXBhYmlsaXR5V2luJiBDYXBhYmlsaXR5TGlzdDo6R2V0QmVzdE1hdGNoZWRDYXBhYmlsaXR5KAotICAgIGludCByZXF1ZXN0ZWRfd2lkdGgsCi0gICAgaW50IHJlcXVlc3RlZF9oZWlnaHQsCi0gICAgaW50IHJlcXVlc3RlZF9mcmFtZV9yYXRlKSBjb25zdCB7Ci0gIERDSEVDSyhDYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBEQ0hFQ0soIWNhcGFiaWxpdGllc18uZW1wdHkoKSk7Ci0KLSAgc3RkOjpsaXN0PFJlc29sdXRpb25EaWZmPiBkaWZmX2xpc3Q7Ci0KLSAgLy8gTG9vcCB0aHJvdWdoIHRoZSBjYW5kaWRhdGVzIHRvIGNyZWF0ZSBhIGxpc3Qgb2YgZGlmZmVyZW50aWFscyBiZXR3ZWVuIHRoZQotICAvLyByZXF1ZXN0ZWQgcmVzb2x1dGlvbiBhbmQgdGhlIGNhbWVyYSBjYXBhYmlsaXR5LgotICBmb3IgKENhcGFiaWxpdGllczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjYXBhYmlsaXRpZXNfLmJlZ2luKCk7Ci0gICAgICAgaXQgIT0gY2FwYWJpbGl0aWVzXy5lbmQoKTsgKytpdCkgewotICAgIFJlc29sdXRpb25EaWZmIGRpZmY7Ci0gICAgZGlmZi5jYXBhYmlsaXR5ID0gJigqaXQpOwotICAgIGRpZmYuZGlmZl93aWR0aCA9IGl0LT53aWR0aCAtIHJlcXVlc3RlZF93aWR0aDsKLSAgICBkaWZmLmRpZmZfaGVpZ2h0ID0gaXQtPmhlaWdodCAtIHJlcXVlc3RlZF9oZWlnaHQ7Ci0gICAgZGlmZi5kaWZmX2ZyYW1lX3JhdGUgPSBpdC0+ZnJhbWVfcmF0ZSAtIHJlcXVlc3RlZF9mcmFtZV9yYXRlOwotICAgIGRpZmZfbGlzdC5wdXNoX2JhY2soZGlmZik7Ci0gIH0KLQotICAvLyBTb3J0IHRoZSBiZXN0IGhlaWdodCBjYW5kaWRhdGVzLgotICBkaWZmX2xpc3Quc29ydCgmQ29tcGFyZUhlaWdodCk7Ci0gIGludCBiZXN0X2RpZmYgPSBkaWZmX2xpc3QuZnJvbnQoKS5kaWZmX2hlaWdodDsKLSAgZm9yIChzdGQ6Omxpc3Q8UmVzb2x1dGlvbkRpZmY+OjppdGVyYXRvciBpdCA9IGRpZmZfbGlzdC5iZWdpbigpOwotICAgICAgIGl0ICE9IGRpZmZfbGlzdC5lbmQoKTsgKytpdCkgewotICAgIGlmIChpdC0+ZGlmZl9oZWlnaHQgIT0gYmVzdF9kaWZmKSB7Ci0gICAgICAvLyBSZW1vdmUgYWxsIGNhbmRpZGF0ZXMgYnV0IHRoZSBiZXN0LgotICAgICAgZGlmZl9saXN0LmVyYXNlKGl0LCBkaWZmX2xpc3QuZW5kKCkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLy8gU29ydCB0aGUgYmVzdCB3aWR0aCBjYW5kaWRhdGVzLgotICBkaWZmX2xpc3Quc29ydCgmQ29tcGFyZVdpZHRoKTsKLSAgYmVzdF9kaWZmID0gZGlmZl9saXN0LmZyb250KCkuZGlmZl93aWR0aDsKLSAgZm9yIChzdGQ6Omxpc3Q8UmVzb2x1dGlvbkRpZmY+OjppdGVyYXRvciBpdCA9IGRpZmZfbGlzdC5iZWdpbigpOwotICAgICAgIGl0ICE9IGRpZmZfbGlzdC5lbmQoKTsgKytpdCkgewotICAgIGlmIChpdC0+ZGlmZl93aWR0aCAhPSBiZXN0X2RpZmYpIHsKLSAgICAgIC8vIFJlbW92ZSBhbGwgY2FuZGlkYXRlcyBidXQgdGhlIGJlc3QuCi0gICAgICBkaWZmX2xpc3QuZXJhc2UoaXQsIGRpZmZfbGlzdC5lbmQoKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICAvLyBTb3J0IHRoZSBiZXN0IGZyYW1lIHJhdGUgY2FuZGlkYXRlcy4KLSAgZGlmZl9saXN0LnNvcnQoJkNvbXBhcmVGcmFtZVJhdGUpOwotICBiZXN0X2RpZmYgPSBkaWZmX2xpc3QuZnJvbnQoKS5kaWZmX2ZyYW1lX3JhdGU7Ci0gIGZvciAoc3RkOjpsaXN0PFJlc29sdXRpb25EaWZmPjo6aXRlcmF0b3IgaXQgPSBkaWZmX2xpc3QuYmVnaW4oKTsKLSAgICAgICBpdCAhPSBkaWZmX2xpc3QuZW5kKCk7ICsraXQpIHsKLSAgICBpZiAoaXQtPmRpZmZfZnJhbWVfcmF0ZSAhPSBiZXN0X2RpZmYpIHsKLSAgICAgIGRpZmZfbGlzdC5lcmFzZShpdCwgZGlmZl9saXN0LmVuZCgpKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIC8vIERlY2lkZSB0aGUgYmVzdCBjb2xvciBmb3JtYXQuCi0gIGRpZmZfbGlzdC5zb3J0KCZDb21wYXJlQ29sb3IpOwotICByZXR1cm4gKmRpZmZfbGlzdC5mcm9udCgpLmNhcGFiaWxpdHk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvd2luL2NhcGFiaWxpdHlfbGlzdF93aW4uaCBiL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL3dpbi9jYXBhYmlsaXR5X2xpc3Rfd2luLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmOTY5NDIuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvd2luL2NhcGFiaWxpdHlfbGlzdF93aW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIFdpbmRvd3Mgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgVmlkZW9DYXB0dXJlRGV2aWNlLgotLy8gRGlyZWN0U2hvdyBpcyB1c2VkIGZvciBjYXB0dXJpbmcuIERpcmVjdFNob3cgcHJvdmlkZSBpdHMgb3duIHRocmVhZHMKLS8vIGZvciBjYXB0dXJpbmcuCi0KLSNpZm5kZWYgTUVESUFfVklERU9fQ0FQVFVSRV9XSU5fQ0FQQUJJTElUWV9MSVNUX1dJTl9IXwotI2RlZmluZSBNRURJQV9WSURFT19DQVBUVVJFX1dJTl9DQVBBQklMSVRZX0xJU1RfV0lOX0hfCi0KLSNpbmNsdWRlIDxsaXN0PgotCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvbm9uX3RocmVhZF9zYWZlLmgiCi0jaW5jbHVkZSAibWVkaWEvdmlkZW8vY2FwdHVyZS92aWRlb19jYXB0dXJlX3R5cGVzLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLXN0cnVjdCBWaWRlb0NhcHR1cmVDYXBhYmlsaXR5V2luIDogcHVibGljIFZpZGVvQ2FwdHVyZUNhcGFiaWxpdHkgewotICBleHBsaWNpdCBWaWRlb0NhcHR1cmVDYXBhYmlsaXR5V2luKGludCBpbmRleCkgOiBzdHJlYW1faW5kZXgoaW5kZXgpIHt9Ci0gIGludCBzdHJlYW1faW5kZXg7Ci19OwotCi1jbGFzcyBDYXBhYmlsaXR5TGlzdCA6IHB1YmxpYyBiYXNlOjpOb25UaHJlYWRTYWZlIHsKLSBwdWJsaWM6Ci0gIENhcGFiaWxpdHlMaXN0KCk7Ci0gIH5DYXBhYmlsaXR5TGlzdCgpOwotCi0gIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBjYXBhYmlsaXRpZXNfLmVtcHR5KCk7IH0KLQotICAvLyBBcHBlbmRzIGFuIGVudHJ5IHRvIHRoZSBsaXN0LgotICB2b2lkIEFkZChjb25zdCBWaWRlb0NhcHR1cmVDYXBhYmlsaXR5V2luJiBjYXBhYmlsaXR5KTsKLQotICAvLyBMb29wcyB0aHJvdWdoIHRoZSBsaXN0IG9mIGNhcGFiaWxpdGllcyBhbmQgcmV0dXJucyBhbiBpbmRleCBvZiB0aGUgYmVzdAotICAvLyBtYXRjaGluZyBjYXBhYmlsaXR5LiAgVGhlIGFsZ29yaXRobSBwcmlvcml0aXplcyBoZWlnaHQsIHdpZHRoLCBmcmFtZSByYXRlCi0gIC8vIGFuZCBjb2xvciBmb3JtYXQgaW4gdGhhdCBvcmRlci4KLSAgY29uc3QgVmlkZW9DYXB0dXJlQ2FwYWJpbGl0eVdpbiYgR2V0QmVzdE1hdGNoZWRDYXBhYmlsaXR5KAotICAgICAgaW50IHJlcXVlc3RlZF93aWR0aCwgaW50IHJlcXVlc3RlZF9oZWlnaHQsCi0gICAgICBpbnQgcmVxdWVzdGVkX2ZyYW1lX3JhdGUpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgdHlwZWRlZiBzdGQ6Omxpc3Q8VmlkZW9DYXB0dXJlQ2FwYWJpbGl0eVdpbj4gQ2FwYWJpbGl0aWVzOwotICBDYXBhYmlsaXRpZXMgY2FwYWJpbGl0aWVzXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQ2FwYWJpbGl0eUxpc3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfVklERU9fQ0FQVFVSRV9XSU5fQ0FQQUJJTElUWV9MSVNUX1dJTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvd2luL2ZpbHRlcl9iYXNlX3dpbi5jYyBiL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL3dpbi9maWx0ZXJfYmFzZV93aW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MzA5ZGYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvd2luL2ZpbHRlcl9iYXNlX3dpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvdmlkZW8vY2FwdHVyZS93aW4vZmlsdGVyX2Jhc2Vfd2luLmgiCi0KLSNwcmFnbWEgY29tbWVudChsaWIsICJzdHJtaWlkcy5saWIiKQotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBJbXBsZW1lbnQgSUVudW1QaW5zLgotY2xhc3MgUGluRW51bWVyYXRvcgotICAgIDogcHVibGljIElFbnVtUGlucywKLSAgICAgIHB1YmxpYyBiYXNlOjpSZWZDb3VudGVkPFBpbkVudW1lcmF0b3I+IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFBpbkVudW1lcmF0b3IoRmlsdGVyQmFzZSogZmlsdGVyKQotICAgICAgOiBmaWx0ZXJfKGZpbHRlciksCi0gICAgICBpbmRleF8oMCkgewotICB9Ci0KLSAgflBpbkVudW1lcmF0b3IoKSB7Ci0gIH0KLQotICAvLyBJVW5rbm93biBpbXBsZW1lbnRhdGlvbi4KLSAgU1RETUVUSE9EKFF1ZXJ5SW50ZXJmYWNlKShSRUZJSUQgaWlkLCB2b2lkKiogb2JqZWN0X3B0cikgewotICAgIGlmIChpaWQgPT0gSUlEX0lFbnVtUGlucyB8fCBpaWQgPT0gSUlEX0lVbmtub3duKSB7Ci0gICAgICBBZGRSZWYoKTsKLSAgICAgICpvYmplY3RfcHRyID0gc3RhdGljX2Nhc3Q8SUVudW1QaW5zKj4odGhpcyk7Ci0gICAgICByZXR1cm4gU19PSzsKLSAgICB9Ci0gICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7Ci0gIH0KLQotICBTVERNRVRIT0RfKFVMT05HLCBBZGRSZWYpKCkgewotICAgIGJhc2U6OlJlZkNvdW50ZWQ8UGluRW51bWVyYXRvcj46OkFkZFJlZigpOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgU1RETUVUSE9EXyhVTE9ORywgUmVsZWFzZSkoKSB7Ci0gICAgYmFzZTo6UmVmQ291bnRlZDxQaW5FbnVtZXJhdG9yPjo6UmVsZWFzZSgpOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgLy8gSW1wbGVtZW50IElFbnVtUGlucy4KLSAgU1RETUVUSE9EKE5leHQpKFVMT05HIGNvdW50LCBJUGluKiogcGlucywgVUxPTkcqIGZldGNoZWQpIHsKLSAgICBVTE9ORyBwaW5zX2ZldGNoZWQgPSAwOwotICAgIHdoaWxlIChwaW5zX2ZldGNoZWQgPCBjb3VudCAmJiBmaWx0ZXJfLT5Ob09mUGlucygpID4gaW5kZXhfKSB7Ci0gICAgICBJUGluKiBwaW4gPSBmaWx0ZXJfLT5HZXRQaW4oaW5kZXhfKyspOwotICAgICAgcGluLT5BZGRSZWYoKTsKLSAgICAgIHBpbnNbcGluc19mZXRjaGVkKytdID0gcGluOwotICAgIH0KLQotICAgIGlmIChmZXRjaGVkKQotICAgICAgKmZldGNoZWQgPSAgcGluc19mZXRjaGVkOwotCi0gICAgcmV0dXJuIHBpbnNfZmV0Y2hlZCA9PSBjb3VudCA/IFNfT0sgOiBTX0ZBTFNFOwotICB9Ci0KLSAgU1RETUVUSE9EKFNraXApKFVMT05HIGNvdW50KSB7Ci0gICAgaWYgKGZpbHRlcl8tPk5vT2ZQaW5zKCktIGluZGV4XyA+IGNvdW50KSB7Ci0gICAgICBpbmRleF8gKz0gY291bnQ7Ci0gICAgICByZXR1cm4gU19PSzsKLSAgICB9Ci0gICAgaW5kZXhfID0gMDsKLSAgICByZXR1cm4gU19GQUxTRTsKLSAgfQotCi0gIFNURE1FVEhPRChSZXNldCkoKSB7Ci0gICAgaW5kZXhfID0gMDsKLSAgICByZXR1cm4gU19PSzsKLSAgfQotCi0gIFNURE1FVEhPRChDbG9uZSkoSUVudW1QaW5zKiogY2xvbmUpIHsKLSAgICBQaW5FbnVtZXJhdG9yKiBwaW5fZW51bSA9IG5ldyBQaW5FbnVtZXJhdG9yKGZpbHRlcl8pOwotICAgIGlmICghcGluX2VudW0pCi0gICAgICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKLSAgICBwaW5fZW51bS0+QWRkUmVmKCk7Ci0gICAgcGluX2VudW0tPmluZGV4XyA9IGluZGV4XzsKLSAgICAqY2xvbmUgPSBwaW5fZW51bTsKLSAgICByZXR1cm4gU19PSzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc2NvcGVkX3JlZnB0cjxGaWx0ZXJCYXNlPiBmaWx0ZXJfOwotICBzaXplX3QgaW5kZXhfOwotfTsKLQotRmlsdGVyQmFzZTo6RmlsdGVyQmFzZSgpIDogc3RhdGVfKFN0YXRlX1N0b3BwZWQpIHsKLX0KLQotRmlsdGVyQmFzZTo6fkZpbHRlckJhc2UoKSB7Ci19Ci0KLVNURE1FVEhPRElNUCBGaWx0ZXJCYXNlOjpFbnVtUGlucyhJRW51bVBpbnMqKiBlbnVtX3BpbnMpIHsKLSAgKmVudW1fcGlucyA9IG5ldyBQaW5FbnVtZXJhdG9yKHRoaXMpOwotICAoKmVudW1fcGlucyktPkFkZFJlZigpOwotICByZXR1cm4gU19PSzsKLX0KLQotU1RETUVUSE9ESU1QIEZpbHRlckJhc2U6OkZpbmRQaW4oTFBDV1NUUiBpZCwgSVBpbioqIHBpbikgewotICByZXR1cm4gRV9OT1RJTVBMOwotfQotCi1TVERNRVRIT0RJTVAgRmlsdGVyQmFzZTo6UXVlcnlGaWx0ZXJJbmZvKEZJTFRFUl9JTkZPKiBpbmZvKSB7Ci0gIGluZm8tPnBHcmFwaCA9IG93bmluZ19ncmFwaF87Ci0gIGluZm8tPmFjaE5hbWVbMF0gPSBMJ1wwJzsKLSAgaWYgKGluZm8tPnBHcmFwaCkKLSAgICBpbmZvLT5wR3JhcGgtPkFkZFJlZigpOwotICByZXR1cm4gU19PSzsKLX0KLQotU1RETUVUSE9ESU1QIEZpbHRlckJhc2U6OkpvaW5GaWx0ZXJHcmFwaChJRmlsdGVyR3JhcGgqIGdyYXBoLCBMUENXU1RSIG5hbWUpIHsKLSAgb3duaW5nX2dyYXBoXyA9IGdyYXBoOwotICByZXR1cm4gU19PSzsKLX0KLQotU1RETUVUSE9ESU1QIEZpbHRlckJhc2U6OlF1ZXJ5VmVuZG9ySW5mbyhMUFdTVFIgKnBWZW5kb3JJbmZvKSB7Ci0gIHJldHVybiBTX09LOwotfQotCi0vLyBJbXBsZW1lbnQgSU1lZGlhRmlsdGVyLgotU1RETUVUSE9ESU1QIEZpbHRlckJhc2U6OlN0b3AoKSB7Ci0gIHN0YXRlXyA9IFN0YXRlX1N0b3BwZWQ7Ci0gIHJldHVybiBTX09LOwotfQotCi1TVERNRVRIT0RJTVAgRmlsdGVyQmFzZTo6UGF1c2UoKSB7Ci0gIHN0YXRlXyA9IFN0YXRlX1BhdXNlZDsKLSAgcmV0dXJuIFNfT0s7Ci19Ci0KLVNURE1FVEhPRElNUCBGaWx0ZXJCYXNlOjpSdW4oUkVGRVJFTkNFX1RJTUUgc3RhcnQpIHsKLSAgc3RhdGVfID0gU3RhdGVfUnVubmluZzsKLSAgcmV0dXJuIFNfT0s7Ci19Ci0KLVNURE1FVEhPRElNUCBGaWx0ZXJCYXNlOjpHZXRTdGF0ZShEV09SRCBtc2VjX3RpbWVvdXQsIEZJTFRFUl9TVEFURSogc3RhdGUpIHsKLSAgKnN0YXRlID0gc3RhdGVfOwotICByZXR1cm4gU19PSzsKLX0KLQotU1RETUVUSE9ESU1QIEZpbHRlckJhc2U6OlNldFN5bmNTb3VyY2UoSVJlZmVyZW5jZUNsb2NrKiBjbG9jaykgewotICByZXR1cm4gU19PSzsKLX0KLQotU1RETUVUSE9ESU1QIEZpbHRlckJhc2U6OkdldFN5bmNTb3VyY2UoSVJlZmVyZW5jZUNsb2NrKiogY2xvY2spIHsKLSAgcmV0dXJuIEVfTk9USU1QTDsKLX0KLQotLy8gSW1wbGVtZW50IGZyb20gSVBlcnNpc3RlbnQuCi1TVERNRVRIT0RJTVAgRmlsdGVyQmFzZTo6R2V0Q2xhc3NJRChDTFNJRCogY2xhc3NfaWQpIHsKLSAgTk9UUkVBQ0hFRCgpOwotICByZXR1cm4gRV9OT1RJTVBMOwotfQotCi0vLyBJbXBsZW1lbnQgSVVua25vd24uCi1TVERNRVRIT0RJTVAgRmlsdGVyQmFzZTo6UXVlcnlJbnRlcmZhY2UoUkVGSUlEIGlkLCB2b2lkKiogb2JqZWN0X3B0cikgewotICBpZiAoaWQgPT0gSUlEX0lNZWRpYUZpbHRlciB8fCBpZCA9PSBJSURfSVVua25vd24pIHsKLSAgICAqb2JqZWN0X3B0ciA9IHN0YXRpY19jYXN0PElNZWRpYUZpbHRlcio+KHRoaXMpOwotICB9IGVsc2UgaWYgKGlkID09IElJRF9JUGVyc2lzdCkgewotICAgICpvYmplY3RfcHRyID0gc3RhdGljX2Nhc3Q8SVBlcnNpc3QqPih0aGlzKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKLSAgfQotICBBZGRSZWYoKTsKLSAgcmV0dXJuIFNfT0s7Ci19Ci0KLVVMT05HIFNURE1FVEhPRENBTExUWVBFIEZpbHRlckJhc2U6OkFkZFJlZigpIHsKLSAgYmFzZTo6UmVmQ291bnRlZDxGaWx0ZXJCYXNlPjo6QWRkUmVmKCk7Ci0gIHJldHVybiAxOwotfQotCi1VTE9ORyBTVERNRVRIT0RDQUxMVFlQRSBGaWx0ZXJCYXNlOjpSZWxlYXNlKCkgewotICBiYXNlOjpSZWZDb3VudGVkPEZpbHRlckJhc2U+OjpSZWxlYXNlKCk7Ci0gIHJldHVybiAxOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL3dpbi9maWx0ZXJfYmFzZV93aW4uaCBiL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL3dpbi9maWx0ZXJfYmFzZV93aW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ1YWE3Ni4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvdmlkZW8vY2FwdHVyZS93aW4vZmlsdGVyX2Jhc2Vfd2luLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBJbXBsZW1lbnQgYSBzaW1wbGUgYmFzZSBjbGFzcyBmb3IgRGlyZWN0U2hvdyBmaWx0ZXJzLiBJdCBtYXkgb25seSBiZSB1c2VkIGluCi0vLyBhIHNpbmdsZSB0aHJlYWRlZCBhcGFydG1lbnQuCi0KLSNpZm5kZWYgTUVESUFfVklERU9fQ0FQVFVSRV9XSU5fRklMVEVSX0JBU0VfV0lOX0hfCi0jZGVmaW5lIE1FRElBX1ZJREVPX0NBUFRVUkVfV0lOX0ZJTFRFUl9CQVNFX1dJTl9IXwotCi0vLyBBdm9pZCBpbmNsdWRpbmcgc3Ryc2FmZS5oIHZpYSBkc2hvdyBhcyBpdCB3aWxsIGNhdXNlIGJ1aWxkIHdhcm5pbmdzLgotI2RlZmluZSBOT19EU0hPV19TVFJTQUZFCi0jaW5jbHVkZSA8ZHNob3cuaD4KLQotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS93aW4vc2NvcGVkX2NvbXB0ci5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBGaWx0ZXJCYXNlCi0gICAgOiBwdWJsaWMgSUJhc2VGaWx0ZXIsCi0gICAgICBwdWJsaWMgYmFzZTo6UmVmQ291bnRlZDxGaWx0ZXJCYXNlPiB7Ci0gcHVibGljOgotICBGaWx0ZXJCYXNlKCk7Ci0gIHZpcnR1YWwgfkZpbHRlckJhc2UoKTsKLQotICAvLyBOdW1iZXIgb2YgcGlucyBjb25uZWN0ZWQgdG8gdGhpcyBmaWx0ZXIuCi0gIHZpcnR1YWwgc2l6ZV90IE5vT2ZQaW5zKCkgPSAwOwotICAvLyBSZXR1cm5zIHRoZSBJUGluIGludGVyZmFjZSBwaW4gbm8gaW5kZXguCi0gIHZpcnR1YWwgSVBpbiogR2V0UGluKGludCBpbmRleCkgPSAwOwotCi0gIC8vIEluaGVyaXRlZCBmcm9tIElVbmtub3duLgotICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpKFJFRklJRCBpZCwgdm9pZCoqIG9iamVjdF9wdHIpOwotICBTVERNRVRIT0RfKFVMT05HLCBBZGRSZWYpKCk7Ci0gIFNURE1FVEhPRF8oVUxPTkcsIFJlbGVhc2UpKCk7Ci0KLSAgLy8gSW5oZXJpdGVkIGZyb20gSUJhc2VGaWx0ZXIuCi0gIFNURE1FVEhPRChFbnVtUGlucykoSUVudW1QaW5zKiogZW51bV9waW5zKTsKLQotICBTVERNRVRIT0QoRmluZFBpbikoTFBDV1NUUiBpZCwgSVBpbioqIHBpbik7Ci0KLSAgU1RETUVUSE9EKFF1ZXJ5RmlsdGVySW5mbykoRklMVEVSX0lORk8qIGluZm8pOwotCi0gIFNURE1FVEhPRChKb2luRmlsdGVyR3JhcGgpKElGaWx0ZXJHcmFwaCogZ3JhcGgsIExQQ1dTVFIgbmFtZSk7Ci0KLSAgU1RETUVUSE9EKFF1ZXJ5VmVuZG9ySW5mbykoTFBXU1RSKiB2ZW5kb3JfaW5mbyk7Ci0KLSAgLy8gSW5oZXJpdGVkIGZyb20gSU1lZGlhRmlsdGVyLgotICBTVERNRVRIT0QoU3RvcCkoKTsKLQotICBTVERNRVRIT0QoUGF1c2UpKCk7Ci0KLSAgU1RETUVUSE9EKFJ1bikoUkVGRVJFTkNFX1RJTUUgc3RhcnQpOwotCi0gIFNURE1FVEhPRChHZXRTdGF0ZSkoRFdPUkQgbXNlY190aW1lb3V0LCBGSUxURVJfU1RBVEUqIHN0YXRlKTsKLQotICBTVERNRVRIT0QoU2V0U3luY1NvdXJjZSkoSVJlZmVyZW5jZUNsb2NrKiBjbG9jayk7Ci0KLSAgU1RETUVUSE9EKEdldFN5bmNTb3VyY2UpKElSZWZlcmVuY2VDbG9jayoqIGNsb2NrKTsKLQotICAvLyBJbmhlcml0ZWQgZnJvbSBJUGVyc2lzdGVudC4KLSAgU1RETUVUSE9EKEdldENsYXNzSUQpKENMU0lEKiBjbGFzc19pZCkgPSAwOwotCi0gcHJpdmF0ZToKLSAgRklMVEVSX1NUQVRFIHN0YXRlXzsKLSAgYmFzZTo6d2luOjpTY29wZWRDb21QdHI8SUZpbHRlckdyYXBoPiBvd25pbmdfZ3JhcGhfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihGaWx0ZXJCYXNlKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX1ZJREVPX0NBUFRVUkVfV0lOX0ZJTFRFUl9CQVNFX1dJTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvd2luL3Bpbl9iYXNlX3dpbi5jYyBiL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL3dpbi9waW5fYmFzZV93aW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMmY3YjAuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvd2luL3Bpbl9iYXNlX3dpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvdmlkZW8vY2FwdHVyZS93aW4vcGluX2Jhc2Vfd2luLmgiCi0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gSW1wbGVtZW50IElFbnVtUGlucy4KLWNsYXNzIFR5cGVFbnVtZXJhdG9yCi0gICAgOiBwdWJsaWMgSUVudW1NZWRpYVR5cGVzLAotICAgICAgcHVibGljIGJhc2U6OlJlZkNvdW50ZWQ8VHlwZUVudW1lcmF0b3I+IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFR5cGVFbnVtZXJhdG9yKFBpbkJhc2UqIHBpbikKLSAgICAgIDogcGluXyhwaW4pLAotICAgICAgICBpbmRleF8oMCkgewotICB9Ci0KLSAgflR5cGVFbnVtZXJhdG9yKCkgewotICB9Ci0KLSAgLy8gSW1wbGVtZW50IGZyb20gSVVua25vd24uCi0gIFNURE1FVEhPRChRdWVyeUludGVyZmFjZSkoUkVGSUlEIGlpZCwgdm9pZCoqIG9iamVjdF9wdHIpIHsKLSAgICBpZiAoaWlkID09IElJRF9JRW51bU1lZGlhVHlwZXMgfHwgaWlkID09IElJRF9JVW5rbm93bikgewotICAgICAgQWRkUmVmKCk7Ci0gICAgICAqb2JqZWN0X3B0ciA9IHN0YXRpY19jYXN0PElFbnVtTWVkaWFUeXBlcyo+KHRoaXMpOwotICAgICAgcmV0dXJuIFNfT0s7Ci0gICAgfQotICAgIHJldHVybiBFX05PSU5URVJGQUNFOwotICB9Ci0KLSAgU1RETUVUSE9EXyhVTE9ORywgQWRkUmVmKSgpIHsKLSAgICBiYXNlOjpSZWZDb3VudGVkPFR5cGVFbnVtZXJhdG9yPjo6QWRkUmVmKCk7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBTVERNRVRIT0RfKFVMT05HLCBSZWxlYXNlKSgpIHsKLSAgICBiYXNlOjpSZWZDb3VudGVkPFR5cGVFbnVtZXJhdG9yPjo6UmVsZWFzZSgpOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgLy8gSW1wbGVtZW50IElFbnVtTWVkaWFUeXBlcy4KLSAgU1RETUVUSE9EKE5leHQpKFVMT05HIGNvdW50LCBBTV9NRURJQV9UWVBFKiogdHlwZXMsIFVMT05HKiBmZXRjaGVkKSB7Ci0gICAgVUxPTkcgdHlwZXNfZmV0Y2hlZCA9IDA7Ci0KLSAgICB3aGlsZSAodHlwZXNfZmV0Y2hlZCA8IGNvdW50KSB7Ci0gICAgICAvLyBBbGxvY2F0ZSBBTV9NRURJQV9UWVBFIHRoYXQgd2Ugd2lsbCBzdG9yZSB0aGUgbWVkaWEgdHlwZSBpbi4KLSAgICAgIEFNX01FRElBX1RZUEUqIHR5cGUgPSByZWludGVycHJldF9jYXN0PEFNX01FRElBX1RZUEUqPihDb1Rhc2tNZW1BbGxvYygKLSAgICAgICAgICBzaXplb2YoQU1fTUVESUFfVFlQRSkpKTsKLSAgICAgIGlmICghdHlwZSkgewotICAgICAgICBGcmVlQWxsb2NhdGVkTWVkaWFUeXBlcyh0eXBlc19mZXRjaGVkLCB0eXBlcyk7Ci0gICAgICAgIHJldHVybiBFX09VVE9GTUVNT1JZOwotICAgICAgfQotICAgICAgWmVyb01lbW9yeSh0eXBlLCBzaXplb2YoQU1fTUVESUFfVFlQRSkpOwotCi0gICAgICAvLyBBbGxvY2F0ZSBhIFZJREVPSU5GT0hFQURFUiBhbmQgY29ubmVjdCBpdCB0byB0aGUgQU1fTUVESUFfVFlQRS4KLSAgICAgIHR5cGUtPmNiRm9ybWF0ID0gc2l6ZW9mKFZJREVPSU5GT0hFQURFUik7Ci0gICAgICBCWVRFICpmb3JtYXQgPSByZWludGVycHJldF9jYXN0PEJZVEUqPihDb1Rhc2tNZW1BbGxvYygKLSAgICAgICAgICBzaXplb2YoVklERU9JTkZPSEVBREVSKSkpOwotICAgICAgaWYgKCFmb3JtYXQpIHsKLSAgICAgICAgQ29UYXNrTWVtRnJlZSh0eXBlKTsKLSAgICAgICAgRnJlZUFsbG9jYXRlZE1lZGlhVHlwZXModHlwZXNfZmV0Y2hlZCwgdHlwZXMpOwotICAgICAgICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKLSAgICAgIH0KLSAgICAgIHR5cGUtPnBiRm9ybWF0ID0gZm9ybWF0OwotICAgICAgLy8gR2V0IHRoZSBtZWRpYSB0eXBlIGZyb20gdGhlIHBpbi4KLSAgICAgIGlmIChwaW5fLT5HZXRWYWxpZE1lZGlhVHlwZShpbmRleF8rKywgdHlwZSkpIHsKLSAgICAgICAgdHlwZXNbdHlwZXNfZmV0Y2hlZCsrXSA9IHR5cGU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBDb1Rhc2tNZW1GcmVlKGZvcm1hdCk7Ci0gICAgICAgIENvVGFza01lbUZyZWUodHlwZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChmZXRjaGVkKQotICAgICAgKmZldGNoZWQgPSB0eXBlc19mZXRjaGVkOwotCi0gICAgcmV0dXJuIHR5cGVzX2ZldGNoZWQgPT0gY291bnQgPyBTX09LIDogU19GQUxTRTsKLSAgfQotCi0gIFNURE1FVEhPRChTa2lwKShVTE9ORyBjb3VudCkgewotICAgIGluZGV4XyArPSBjb3VudDsKLSAgICByZXR1cm4gU19PSzsKLSAgfQotCi0gIFNURE1FVEhPRChSZXNldCkoKSB7Ci0gICAgaW5kZXhfID0gMDsKLSAgICByZXR1cm4gU19PSzsKLSAgfQotCi0gIFNURE1FVEhPRChDbG9uZSkoSUVudW1NZWRpYVR5cGVzKiogY2xvbmUpIHsKLSAgICBUeXBlRW51bWVyYXRvciogdHlwZV9lbnVtID0gbmV3IFR5cGVFbnVtZXJhdG9yKHBpbl8pOwotICAgIGlmICghdHlwZV9lbnVtKQotICAgICAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7Ci0gICAgdHlwZV9lbnVtLT5BZGRSZWYoKTsKLSAgICB0eXBlX2VudW0tPmluZGV4XyA9IGluZGV4XzsKLSAgICAqY2xvbmUgPSB0eXBlX2VudW07Ci0gICAgcmV0dXJuIFNfT0s7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHZvaWQgRnJlZUFsbG9jYXRlZE1lZGlhVHlwZXMoVUxPTkcgYWxsb2NhdGVkLCBBTV9NRURJQV9UWVBFKiogdHlwZXMpIHsKLSAgICBmb3IgKFVMT05HIGkgPSAwOyBpIDwgYWxsb2NhdGVkOyArK2kpIHsKLSAgICAgIENvVGFza01lbUZyZWUodHlwZXNbaV0tPnBiRm9ybWF0KTsKLSAgICAgIENvVGFza01lbUZyZWUodHlwZXNbaV0pOwotICAgIH0KLSAgfQotCi0gIHNjb3BlZF9yZWZwdHI8UGluQmFzZT4gcGluXzsKLSAgaW50IGluZGV4XzsKLX07Ci0KLVBpbkJhc2U6OlBpbkJhc2UoSUJhc2VGaWx0ZXIqIG93bmVyKQotICAgIDogb3duZXJfKG93bmVyKSB7Ci0gIG1lbXNldCgmY3VycmVudF9tZWRpYV90eXBlXywgMCwgc2l6ZW9mKGN1cnJlbnRfbWVkaWFfdHlwZV8pKTsKLX0KLQotUGluQmFzZTo6flBpbkJhc2UoKSB7Ci19Ci0KLXZvaWQgUGluQmFzZTo6U2V0T3duZXIoSUJhc2VGaWx0ZXIqIG93bmVyKSB7Ci0gIG93bmVyXyA9IG93bmVyOwotfQotCi0vLyBDYWxsZWQgb24gYW4gb3V0cHV0IHBpbiB0byBhbmQgZXN0YWJsaXNoIGEKLS8vICAgY29ubmVjdGlvbi4KLVNURE1FVEhPRElNUCBQaW5CYXNlOjpDb25uZWN0KElQaW4qIHJlY2VpdmVfcGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQU1fTUVESUFfVFlQRSogbWVkaWFfdHlwZSkgewotICBpZiAoIXJlY2VpdmVfcGluIHx8ICFtZWRpYV90eXBlKQotICAgIHJldHVybiBFX1BPSU5URVI7Ci0KLSAgY3VycmVudF9tZWRpYV90eXBlXyA9ICptZWRpYV90eXBlOwotICByZWNlaXZlX3Bpbi0+QWRkUmVmKCk7Ci0gIGNvbm5lY3RlZF9waW5fLkF0dGFjaChyZWNlaXZlX3Bpbik7Ci0gIEhSRVNVTFQgaHIgPSByZWNlaXZlX3Bpbi0+UmVjZWl2ZUNvbm5lY3Rpb24odGhpcywgbWVkaWFfdHlwZSk7Ci0KLSAgcmV0dXJuIGhyOwotfQotCi0vLyBDYWxsZWQgZnJvbSBhbiBvdXRwdXQgcGluIG9uIGFuIGlucHV0IHBpbiB0byBhbmQgZXN0YWJsaXNoIGEKLS8vIGNvbm5lY3Rpb24uCi1TVERNRVRIT0RJTVAgUGluQmFzZTo6UmVjZWl2ZUNvbm5lY3Rpb24oSVBpbiogY29ubmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFNX01FRElBX1RZUEUqIG1lZGlhX3R5cGUpIHsKLSAgaWYgKCFJc01lZGlhVHlwZVZhbGlkKG1lZGlhX3R5cGUpKQotICAgIHJldHVybiBWRldfRV9UWVBFX05PVF9BQ0NFUFRFRDsKLQotICBjdXJyZW50X21lZGlhX3R5cGVfID0gKm1lZGlhX3R5cGU7Ci0gIGNvbm5lY3Rvci0+QWRkUmVmKCk7Ci0gIGNvbm5lY3RlZF9waW5fLkF0dGFjaChjb25uZWN0b3IpOwotICByZXR1cm4gU19PSzsKLX0KLQotU1RETUVUSE9ESU1QIFBpbkJhc2U6OkRpc2Nvbm5lY3QoKSB7Ci0gIGlmICghY29ubmVjdGVkX3Bpbl8pCi0gICAgcmV0dXJuIFNfRkFMU0U7Ci0KLSAgY29ubmVjdGVkX3Bpbl8uUmVsZWFzZSgpOwotICByZXR1cm4gU19PSzsKLX0KLQotU1RETUVUSE9ESU1QIFBpbkJhc2U6OkNvbm5lY3RlZFRvKElQaW4qKiBwaW4pIHsKLSAgKnBpbiA9IGNvbm5lY3RlZF9waW5fOwotICBpZiAoIWNvbm5lY3RlZF9waW5fKQotICAgIHJldHVybiBWRldfRV9OT1RfQ09OTkVDVEVEOwotCi0gIGNvbm5lY3RlZF9waW5fLmdldCgpLT5BZGRSZWYoKTsKLSAgcmV0dXJuIFNfT0s7Ci19Ci0KLVNURE1FVEhPRElNUCBQaW5CYXNlOjpDb25uZWN0aW9uTWVkaWFUeXBlKEFNX01FRElBX1RZUEUqIG1lZGlhX3R5cGUpIHsKLSAgaWYgKCFjb25uZWN0ZWRfcGluXykKLSAgICByZXR1cm4gVkZXX0VfTk9UX0NPTk5FQ1RFRDsKLSAgKm1lZGlhX3R5cGUgPSBjdXJyZW50X21lZGlhX3R5cGVfOwotICByZXR1cm4gU19PSzsKLX0KLQotU1RETUVUSE9ESU1QIFBpbkJhc2U6OlF1ZXJ5UGluSW5mbyhQSU5fSU5GTyogaW5mbykgewotICBpbmZvLT5kaXIgPSBQSU5ESVJfSU5QVVQ7Ci0gIGluZm8tPnBGaWx0ZXIgPSBvd25lcl87Ci0gIGlmIChvd25lcl8pCi0gICAgb3duZXJfLT5BZGRSZWYoKTsKLSAgaW5mby0+YWNoTmFtZVswXSA9IEwnXDAnOwotCi0gIHJldHVybiBTX09LOwotfQotCi1TVERNRVRIT0RJTVAgUGluQmFzZTo6UXVlcnlEaXJlY3Rpb24oUElOX0RJUkVDVElPTiogcGluX2RpcikgewotICAqcGluX2RpciA9IFBJTkRJUl9JTlBVVDsKLSAgcmV0dXJuIFNfT0s7Ci19Ci0KLVNURE1FVEhPRElNUCBQaW5CYXNlOjpRdWVyeUlkKExQV1NUUiogaWQpIHsKLSAgTk9UUkVBQ0hFRCgpOwotICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKLX0KLQotU1RETUVUSE9ESU1QIFBpbkJhc2U6OlF1ZXJ5QWNjZXB0KGNvbnN0IEFNX01FRElBX1RZUEUqIG1lZGlhX3R5cGUpIHsKLSAgcmV0dXJuIFNfRkFMU0U7Ci19Ci0KLVNURE1FVEhPRElNUCBQaW5CYXNlOjpFbnVtTWVkaWFUeXBlcyhJRW51bU1lZGlhVHlwZXMqKiB0eXBlcykgewotICAqdHlwZXMgPSBuZXcgVHlwZUVudW1lcmF0b3IodGhpcyk7Ci0gICgqdHlwZXMpLT5BZGRSZWYoKTsKLSAgcmV0dXJuIFNfT0s7Ci19Ci0KLVNURE1FVEhPRElNUCBQaW5CYXNlOjpRdWVyeUludGVybmFsQ29ubmVjdGlvbnMoSVBpbioqIHBpbnMsIFVMT05HKiBub19waW5zKSB7Ci0gIHJldHVybiBFX05PVElNUEw7Ci19Ci0KLVNURE1FVEhPRElNUCBQaW5CYXNlOjpFbmRPZlN0cmVhbSgpIHsKLSAgcmV0dXJuIFNfT0s7Ci19Ci0KLVNURE1FVEhPRElNUCBQaW5CYXNlOjpCZWdpbkZsdXNoKCkgewotICByZXR1cm4gU19PSzsKLX0KLQotU1RETUVUSE9ESU1QIFBpbkJhc2U6OkVuZEZsdXNoKCkgewotICByZXR1cm4gU19PSzsKLX0KLQotU1RETUVUSE9ESU1QIFBpbkJhc2U6Ok5ld1NlZ21lbnQoUkVGRVJFTkNFX1RJTUUgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZFUkVOQ0VfVElNRSBzdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJhdGUpIHsKLSAgTk9UUkVBQ0hFRCgpOwotICByZXR1cm4gRV9OT1RJTVBMOwotfQotCi0vLyBJbmhlcml0ZWQgZnJvbSBJTWVtSW5wdXRQaW4uCi1TVERNRVRIT0RJTVAgUGluQmFzZTo6R2V0QWxsb2NhdG9yKElNZW1BbGxvY2F0b3IqKiBhbGxvY2F0b3IpIHsKLSAgcmV0dXJuIFZGV19FX05PX0FMTE9DQVRPUjsKLX0KLQotU1RETUVUSE9ESU1QIFBpbkJhc2U6Ok5vdGlmeUFsbG9jYXRvcihJTWVtQWxsb2NhdG9yKiBhbGxvY2F0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgcmVhZF9vbmx5KSB7Ci0gIHJldHVybiBTX09LOwotfQotCi1TVERNRVRIT0RJTVAgUGluQmFzZTo6R2V0QWxsb2NhdG9yUmVxdWlyZW1lbnRzKAotICAgIEFMTE9DQVRPUl9QUk9QRVJUSUVTKiBwcm9wZXJ0aWVzKSB7Ci0gIHJldHVybiBFX05PVElNUEw7Ci19Ci0KLVNURE1FVEhPRElNUCBQaW5CYXNlOjpSZWNlaXZlTXVsdGlwbGUoSU1lZGlhU2FtcGxlKiogc2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBzYW1wbGVfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcqIHByb2Nlc3NlZCkgewotICBOT1RSRUFDSEVEKCk7Ci0gIHJldHVybiBWRldfRV9JTlZBTElETUVESUFUWVBFOwotfQotCi1TVERNRVRIT0RJTVAgUGluQmFzZTo6UmVjZWl2ZUNhbkJsb2NrKCkgewotICByZXR1cm4gU19GQUxTRTsKLX0KLQotLy8gSW5oZXJpdGVkIGZyb20gSVVua25vd24uCi1TVERNRVRIT0RJTVAgUGluQmFzZTo6UXVlcnlJbnRlcmZhY2UoUkVGSUlEIGlkLCB2b2lkKiogb2JqZWN0X3B0cikgewotICBpZiAoaWQgPT0gSUlEX0lQaW4gfHwgaWQgPT0gSUlEX0lVbmtub3duKSB7Ci0gICAgKm9iamVjdF9wdHIgPSBzdGF0aWNfY2FzdDxJUGluKj4odGhpcyk7Ci0gIH0gZWxzZSBpZiAoaWQgPT0gSUlEX0lNZW1JbnB1dFBpbikgewotICAgICpvYmplY3RfcHRyID0gc3RhdGljX2Nhc3Q8SU1lbUlucHV0UGluKj4odGhpcyk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7Ci0gIH0KLSAgQWRkUmVmKCk7Ci0gIHJldHVybiBTX09LOwotfQotCi1TVERNRVRIT0RJTVBfKFVMT05HKSBQaW5CYXNlOjpBZGRSZWYoKSB7Ci0gIGJhc2U6OlJlZkNvdW50ZWQ8UGluQmFzZT46OkFkZFJlZigpOwotICByZXR1cm4gMTsKLX0KLQotU1RETUVUSE9ESU1QXyhVTE9ORykgUGluQmFzZTo6UmVsZWFzZSgpIHsKLSAgYmFzZTo6UmVmQ291bnRlZDxQaW5CYXNlPjo6UmVsZWFzZSgpOwotICByZXR1cm4gMTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdmlkZW8vY2FwdHVyZS93aW4vcGluX2Jhc2Vfd2luLmggYi9zcmMvbWVkaWEvdmlkZW8vY2FwdHVyZS93aW4vcGluX2Jhc2Vfd2luLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZjQwM2YuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvd2luL3Bpbl9iYXNlX3dpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIEltcGxlbWVudCBhIHNpbXBsZSBiYXNlIGNsYXNzIGZvciBhIERpcmVjdFNob3cgaW5wdXQgcGluLiBJdCBtYXkgb25seSBiZQotLy8gdXNlZCBpbiBhIHNpbmdsZSB0aHJlYWRlZCBhcGFydG1lbnQuCi0KLSNpZm5kZWYgTUVESUFfVklERU9fQ0FQVFVSRV9XSU5fUElOX0JBU0VfV0lOX0hfCi0jZGVmaW5lIE1FRElBX1ZJREVPX0NBUFRVUkVfV0lOX1BJTl9CQVNFX1dJTl9IXwotCi0vLyBBdm9pZCBpbmNsdWRpbmcgc3Ryc2FmZS5oIHZpYSBkc2hvdyBhcyBpdCB3aWxsIGNhdXNlIGJ1aWxkIHdhcm5pbmdzLgotI2RlZmluZSBOT19EU0hPV19TVFJTQUZFCi0jaW5jbHVkZSA8ZHNob3cuaD4KLQotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS93aW4vc2NvcGVkX2NvbXB0ci5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBQaW5CYXNlCi0gICAgOiBwdWJsaWMgSVBpbiwKLSAgICAgIHB1YmxpYyBJTWVtSW5wdXRQaW4sCi0gICAgICBwdWJsaWMgYmFzZTo6UmVmQ291bnRlZDxQaW5CYXNlPiB7Ci0gcHVibGljOgotICBleHBsaWNpdCBQaW5CYXNlKElCYXNlRmlsdGVyKiBvd25lcik7Ci0gIHZpcnR1YWwgflBpbkJhc2UoKTsKLQotICAvLyBGdW5jdGlvbiB1c2VkIGZvciBjaGFuZ2luZyB0aGUgb3duZXIuCi0gIC8vIElmIHRoZSBvd25lciBpcyBkZWxldGVkIHRoZSBvd25lciBzaG91bGQgZmlyc3QgY2FsbCB0aGlzIGZ1bmN0aW9uCi0gIC8vIHdpdGggb3duZXIgPSBOVUxMLgotICB2b2lkIFNldE93bmVyKElCYXNlRmlsdGVyKiBvd25lcik7Ci0KLSAgLy8gQ2hlY2tzIGlmIGEgbWVkaWEgdHlwZSBpcyBhY2NlcHRhYmxlLiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoaXMgcGluIGlzCi0gIC8vIGNvbm5lY3RlZCB0byBhbiBvdXRwdXQgcGluLiBNdXN0IHJldHVybiB0cnVlIGlmIHRoZSBtZWRpYSB0eXBlIGlzCi0gIC8vIGFjY2VwdGFibGUsIGZhbHNlIG90aGVyd2lzZS4KLSAgdmlydHVhbCBib29sIElzTWVkaWFUeXBlVmFsaWQoY29uc3QgQU1fTUVESUFfVFlQRSogbWVkaWFfdHlwZSkgPSAwOwotCi0gIC8vIEVudW1lcmF0ZXMgdmFsaWQgbWVkaWEgdHlwZXMuCi0gIHZpcnR1YWwgYm9vbCBHZXRWYWxpZE1lZGlhVHlwZShpbnQgaW5kZXgsIEFNX01FRElBX1RZUEUqIG1lZGlhX3R5cGUpID0gMDsKLQotICAvLyBDYWxsZWQgd2hlbiBuZXcgbWVkaWEgaXMgcmVjZWl2ZWQuIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCBvbiB0aGUgc2FtZQotICAvLyB0aHJlYWQgYXMgd2hlcmUgdGhlIHBpbiBpcyBjcmVhdGVkLgotICBTVERNRVRIT0QoUmVjZWl2ZSkoSU1lZGlhU2FtcGxlKiBzYW1wbGUpID0gMDsKLQotICBTVERNRVRIT0QoQ29ubmVjdCkoSVBpbiogcmVjZWl2ZV9waW4sIGNvbnN0IEFNX01FRElBX1RZUEUqIG1lZGlhX3R5cGUpOwotCi0gIFNURE1FVEhPRChSZWNlaXZlQ29ubmVjdGlvbikoSVBpbiogY29ubmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFNX01FRElBX1RZUEUqIG1lZGlhX3R5cGUpOwotCi0gIFNURE1FVEhPRChEaXNjb25uZWN0KSgpOwotCi0gIFNURE1FVEhPRChDb25uZWN0ZWRUbykoSVBpbioqIHBpbik7Ci0KLSAgU1RETUVUSE9EKENvbm5lY3Rpb25NZWRpYVR5cGUpKEFNX01FRElBX1RZUEUqIG1lZGlhX3R5cGUpOwotCi0gIFNURE1FVEhPRChRdWVyeVBpbkluZm8pKFBJTl9JTkZPKiBpbmZvKTsKLQotICBTVERNRVRIT0QoUXVlcnlEaXJlY3Rpb24pKFBJTl9ESVJFQ1RJT04qIHBpbl9kaXIpOwotCi0gIFNURE1FVEhPRChRdWVyeUlkKShMUFdTVFIqIGlkKTsKLQotICBTVERNRVRIT0QoUXVlcnlBY2NlcHQpKGNvbnN0IEFNX01FRElBX1RZUEUqIG1lZGlhX3R5cGUpOwotCi0gIFNURE1FVEhPRChFbnVtTWVkaWFUeXBlcykoSUVudW1NZWRpYVR5cGVzKiogdHlwZXMpOwotCi0gIFNURE1FVEhPRChRdWVyeUludGVybmFsQ29ubmVjdGlvbnMpKElQaW4qKiBwaW5zLCBVTE9ORyogbm9fcGlucyk7Ci0KLSAgU1RETUVUSE9EKEVuZE9mU3RyZWFtKSgpOwotCi0gIFNURE1FVEhPRChCZWdpbkZsdXNoKSgpOwotCi0gIFNURE1FVEhPRChFbmRGbHVzaCkoKTsKLQotICBTVERNRVRIT0QoTmV3U2VnbWVudCkoUkVGRVJFTkNFX1RJTUUgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBSRUZFUkVOQ0VfVElNRSBzdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRSYXRlKTsKLQotICAvLyBJbmhlcml0ZWQgZnJvbSBJTWVtSW5wdXRQaW4uCi0gIFNURE1FVEhPRChHZXRBbGxvY2F0b3IpKElNZW1BbGxvY2F0b3IqKiBhbGxvY2F0b3IpOwotCi0gIFNURE1FVEhPRChOb3RpZnlBbGxvY2F0b3IpKElNZW1BbGxvY2F0b3IqIGFsbG9jYXRvciwgQk9PTCByZWFkX29ubHkpOwotCi0gIFNURE1FVEhPRChHZXRBbGxvY2F0b3JSZXF1aXJlbWVudHMpKEFMTE9DQVRPUl9QUk9QRVJUSUVTKiBwcm9wZXJ0aWVzKTsKLQotICBTVERNRVRIT0QoUmVjZWl2ZU11bHRpcGxlKShJTWVkaWFTYW1wbGUqKiBzYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHNhbXBsZV9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyogcHJvY2Vzc2VkKTsKLSAgU1RETUVUSE9EKFJlY2VpdmVDYW5CbG9jaykoKTsKLQotICAvLyBJbmhlcml0ZWQgZnJvbSBJVW5rbm93bi4KLSAgU1RETUVUSE9EKFF1ZXJ5SW50ZXJmYWNlKShSRUZJSUQgaWQsIHZvaWQqKiBvYmplY3RfcHRyKTsKLQotICBTVERNRVRIT0RfKFVMT05HLCBBZGRSZWYpKCk7Ci0KLSAgU1RETUVUSE9EXyhVTE9ORywgUmVsZWFzZSkoKTsKLQotIHByaXZhdGU6Ci0gIEFNX01FRElBX1RZUEUgY3VycmVudF9tZWRpYV90eXBlXzsKLSAgYmFzZTo6d2luOjpTY29wZWRDb21QdHI8SVBpbj4gY29ubmVjdGVkX3Bpbl87Ci0gIC8vIG93bmVyXyBpcyB0aGUgZmlsdGVyIG93bmluZyB0aGlzIHBpbi4gV2UgZG9uJ3QgcmVmZXJlbmNlIGNvdW50IGl0IHNpbmNlCi0gIC8vIHRoYXQgd291bGQgY3JlYXRlIGEgY2lyY3VsYXIgcmVmZXJlbmNlIGNvdW50LgotICBJQmFzZUZpbHRlciogb3duZXJfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfVklERU9fQ0FQVFVSRV9XSU5fUElOX0JBU0VfV0lOX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdmlkZW8vY2FwdHVyZS93aW4vc2lua19maWx0ZXJfb2JzZXJ2ZXJfd2luLmggYi9zcmMvbWVkaWEvdmlkZW8vY2FwdHVyZS93aW4vc2lua19maWx0ZXJfb2JzZXJ2ZXJfd2luLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNDUxYjQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvd2luL3NpbmtfZmlsdGVyX29ic2VydmVyX3dpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDExIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT2JzZXJ2ZXIgY2xhc3Mgb2YgU2lua2ZpbHRlci4gVGhlIGltcGxlbWVudG9yIG9mIHRoaXMgY2xhc3MgcmVjZWl2ZSB2aWRlbwotLy8gZnJhbWVzIGZyb20gdGhlIFNpbmtGaWx0ZXIgRGlyZWN0U2hvdyBmaWx0ZXIuCi0KLSNpZm5kZWYgTUVESUFfVklERU9fQ0FQVFVSRV9XSU5fU0lOS19GSUxURVJfT0JTRVJWRVJfV0lOX0hfCi0jZGVmaW5lIE1FRElBX1ZJREVPX0NBUFRVUkVfV0lOX1NJTktfRklMVEVSX09CU0VSVkVSX1dJTl9IXwotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBTaW5rRmlsdGVyT2JzZXJ2ZXIgewotIHB1YmxpYzoKLSAgLy8gU2lua0ZpbHRlciB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIGFsbCBmcmFtZXMgZGVsaXZlcmVkIHRvIGl0LgotICAvLyBidWZmZXIgaW4gb25seSB2YWxpZCBkdXJpbmcgdGhpcyBmdW5jdGlvbiBjYWxsLgotICB2aXJ0dWFsIHZvaWQgRnJhbWVSZWNlaXZlZChjb25zdCB1aW50OCogYnVmZmVyLCBpbnQgbGVuZ3RoKSA9IDA7Ci0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIH5TaW5rRmlsdGVyT2JzZXJ2ZXIoKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX1ZJREVPX0NBUFRVUkVfV0lOX1NJTktfRklMVEVSX09CU0VSVkVSX1dJTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvd2luL3NpbmtfZmlsdGVyX3dpbi5jYyBiL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL3dpbi9zaW5rX2ZpbHRlcl93aW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZmM0MTAuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvd2luL3NpbmtfZmlsdGVyX3dpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS92aWRlby9jYXB0dXJlL3dpbi9zaW5rX2ZpbHRlcl93aW4uaCIKLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgIm1lZGlhL3ZpZGVvL2NhcHR1cmUvd2luL3NpbmtfaW5wdXRfcGluX3dpbi5oIgotCi0vLyBEZWZpbmUgR1VJRCBmb3IgSTQyMC4gVGhpcyBpcyB0aGUgY29sb3IgZm9ybWF0IHdlIHdvdWxkIGxpa2UgdG8gc3VwcG9ydCBidXQKLS8vIGl0IGlzIG5vdCBkZWZpbmVkIGluIHRoZSBEaXJlY3RTaG93IFNESy4KLS8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9kZDc1NzUzMi5hc3B4Ci0vLyAzMDMyMzQ0OS0wMDAwLTAwMTAtODAwMC0wMEFBMDAzODlCNzEuCi1HVUlEIGtNZWRpYVN1YlR5cGVJNDIwID0gewotICAweDMwMzIzNDQ5LCAweDAwMDAsIDB4MDAxMCwgeyAweDgwLCAweDAwLCAweDAwLCAweEFBLCAweDAwLCAweDM4LCAweDlCLCAweDcxfQotfTsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotU2lua0ZpbHRlck9ic2VydmVyOjp+U2lua0ZpbHRlck9ic2VydmVyKCkge30KLQotU2lua0ZpbHRlcjo6U2lua0ZpbHRlcihTaW5rRmlsdGVyT2JzZXJ2ZXIqIG9ic2VydmVyKQotICAgIDogaW5wdXRfcGluXyhOVUxMKSB7Ci0gIGlucHV0X3Bpbl8gPSBuZXcgU2lua0lucHV0UGluKHRoaXMsIG9ic2VydmVyKTsKLX0KLQotU2lua0ZpbHRlcjo6flNpbmtGaWx0ZXIoKSB7Ci0gIGlucHV0X3Bpbl8tPlNldE93bmVyKE5VTEwpOwotfQotCi12b2lkIFNpbmtGaWx0ZXI6OlNldFJlcXVlc3RlZE1lZGlhQ2FwYWJpbGl0eSgKLSAgICBjb25zdCBWaWRlb0NhcHR1cmVDYXBhYmlsaXR5JiBjYXBhYmlsaXR5KSB7Ci0gIGlucHV0X3Bpbl8tPlNldFJlcXVlc3RlZE1lZGlhQ2FwYWJpbGl0eShjYXBhYmlsaXR5KTsKLX0KLQotY29uc3QgVmlkZW9DYXB0dXJlQ2FwYWJpbGl0eSYgU2lua0ZpbHRlcjo6UmVzdWx0aW5nQ2FwYWJpbGl0eSgpIHsKLSAgcmV0dXJuIGlucHV0X3Bpbl8tPlJlc3VsdGluZ0NhcGFiaWxpdHkoKTsKLX0KLQotc2l6ZV90IFNpbmtGaWx0ZXI6Ok5vT2ZQaW5zKCkgewotICByZXR1cm4gMTsKLX0KLQotSVBpbiogU2lua0ZpbHRlcjo6R2V0UGluKGludCBpbmRleCkgewotICByZXR1cm4gaW5kZXggPT0gMCA/IGlucHV0X3Bpbl8gOiBOVUxMOwotfQotCi1TVERNRVRIT0RJTVAgU2lua0ZpbHRlcjo6R2V0Q2xhc3NJRChDTFNJRCogY2xzaWQpIHsKLSAgKmNsc2lkID0gX191dWlkb2YoU2lua0ZpbHRlcik7Ci0gIHJldHVybiBTX09LOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL3dpbi9zaW5rX2ZpbHRlcl93aW4uaCBiL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL3dpbi9zaW5rX2ZpbHRlcl93aW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZiYjEyNC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvdmlkZW8vY2FwdHVyZS93aW4vc2lua19maWx0ZXJfd2luLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBJbXBsZW1lbnQgYSBEaXJlY3RTaG93IHNpbmsgZmlsdGVyIHVzZWQgZm9yIHJlY2VpdmluZyBjYXB0dXJlZCBmcmFtZXMgZnJvbQotLy8gYSBEaXJlY3RTaG93IENhcHR1cmUgZmlsdGVyLgotCi0jaWZuZGVmIE1FRElBX1ZJREVPX0NBUFRVUkVfV0lOX1NJTktfRklMVEVSX1dJTl9IXwotI2RlZmluZSBNRURJQV9WSURFT19DQVBUVVJFX1dJTl9TSU5LX0ZJTFRFUl9XSU5fSF8KLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAibWVkaWEvdmlkZW8vY2FwdHVyZS92aWRlb19jYXB0dXJlX2RldmljZS5oIgotI2luY2x1ZGUgIm1lZGlhL3ZpZGVvL2NhcHR1cmUvdmlkZW9fY2FwdHVyZV90eXBlcy5oIgotI2luY2x1ZGUgIm1lZGlhL3ZpZGVvL2NhcHR1cmUvd2luL2ZpbHRlcl9iYXNlX3dpbi5oIgotI2luY2x1ZGUgIm1lZGlhL3ZpZGVvL2NhcHR1cmUvd2luL3NpbmtfZmlsdGVyX29ic2VydmVyX3dpbi5oIgotCi0vLyBEZWZpbmUgR1VJRCBmb3IgSTQyMC4gVGhpcyBpcyB0aGUgY29sb3IgZm9ybWF0IHdlIHdvdWxkIGxpa2UgdG8gc3VwcG9ydCBidXQKLS8vIGl0IGlzIG5vdCBkZWZpbmVkIGluIHRoZSBEaXJlY3RTaG93IFNESy4KLS8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9kZDc1NzUzMi5hc3B4Ci0vLyAzMDMyMzQ0OS0wMDAwLTAwMTAtODAwMC0wMEFBMDAzODlCNzEuCi1leHRlcm4gR1VJRCBrTWVkaWFTdWJUeXBlSTQyMDsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgU2lua0lucHV0UGluOwotCi1jbGFzcyBfX2RlY2xzcGVjKHV1aWQoIjg4Y2RiYmRjLWE3M2ItNGFmYS1hY2JmLTE1ZDVlMmNlMTJjMyIpKQotICAgIFNpbmtGaWx0ZXIgOiBwdWJsaWMgRmlsdGVyQmFzZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBTaW5rRmlsdGVyKFNpbmtGaWx0ZXJPYnNlcnZlciogb2JzZXJ2ZXIpOwotICB2aXJ0dWFsIH5TaW5rRmlsdGVyKCk7Ci0KLSAgdm9pZCBTZXRSZXF1ZXN0ZWRNZWRpYUNhcGFiaWxpdHkoCi0gICAgICBjb25zdCBWaWRlb0NhcHR1cmVDYXBhYmlsaXR5JiBjYXBhYmlsaXR5KTsKLSAgLy8gUmV0dXJucyB0aGUgY2FwYWJpbGl0eSB0aGF0IGlzIG5lZ290aWF0ZWQgd2hlbiB0aGlzCi0gIC8vIGZpbHRlciBpcyBjb25uZWN0ZWQgdG8gYSBtZWRpYSBmaWx0ZXIuCi0gIGNvbnN0IFZpZGVvQ2FwdHVyZUNhcGFiaWxpdHkmIFJlc3VsdGluZ0NhcGFiaWxpdHkoKTsKLQotICAvLyBJbXBsZW1lbnQgRmlsdGVyQmFzZS4KLSAgdmlydHVhbCBzaXplX3QgTm9PZlBpbnMoKTsKLSAgdmlydHVhbCBJUGluKiBHZXRQaW4oaW50IGluZGV4KTsKLQotICBTVERNRVRIT0QoR2V0Q2xhc3NJRCkoQ0xTSUQqIGNsc2lkKTsKLQotIHByaXZhdGU6Ci0gIHNjb3BlZF9yZWZwdHI8U2lua0lucHV0UGluPiBpbnB1dF9waW5fOwotCi0gIERJU0FMTE9XX0lNUExJQ0lUX0NPTlNUUlVDVE9SUyhTaW5rRmlsdGVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX1ZJREVPX0NBUFRVUkVfV0lOX1NJTktfRklMVEVSX1dJTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvd2luL3NpbmtfaW5wdXRfcGluX3dpbi5jYyBiL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL3dpbi9zaW5rX2lucHV0X3Bpbl93aW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNTU1MzEuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvd2luL3NpbmtfaW5wdXRfcGluX3dpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvdmlkZW8vY2FwdHVyZS93aW4vc2lua19pbnB1dF9waW5fd2luLmgiCi0KLSNpbmNsdWRlIDxjc3RyaW5nPgotCi0vLyBBdm9pZCBpbmNsdWRpbmcgc3Ryc2FmZS5oIHZpYSBkc2hvdyBhcyBpdCB3aWxsIGNhdXNlIGJ1aWxkIHdhcm5pbmdzLgotI2RlZmluZSBOT19EU0hPV19TVFJTQUZFCi0jaW5jbHVkZSA8ZHNob3cuaD4KLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jb25zdCBSRUZFUkVOQ0VfVElNRSBrU2Vjb25kc1RvUmVmZXJlbmNlVGltZSA9IDEwMDAwMDAwOwotCi1TaW5rSW5wdXRQaW46OlNpbmtJbnB1dFBpbihJQmFzZUZpbHRlciogZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU2lua0ZpbHRlck9ic2VydmVyKiBvYnNlcnZlcikKLSAgICA6IG9ic2VydmVyXyhvYnNlcnZlciksCi0gICAgICBQaW5CYXNlKGZpbHRlcikgewotICBtZW1zZXQoJnJlcXVlc3RlZF9jYXBhYmlsaXR5XywgMCwgc2l6ZW9mKHJlcXVlc3RlZF9jYXBhYmlsaXR5XykpOwotICBtZW1zZXQoJnJlc3VsdGluZ19jYXBhYmlsaXR5XywgMCwgc2l6ZW9mKHJlc3VsdGluZ19jYXBhYmlsaXR5XykpOwotfQotCi1TaW5rSW5wdXRQaW46On5TaW5rSW5wdXRQaW4oKSB7fQotCi1ib29sIFNpbmtJbnB1dFBpbjo6R2V0VmFsaWRNZWRpYVR5cGUoaW50IGluZGV4LCBBTV9NRURJQV9UWVBFKiBtZWRpYV90eXBlKSB7Ci0gIGlmIChtZWRpYV90eXBlLT5jYkZvcm1hdCA8IHNpemVvZihWSURFT0lORk9IRUFERVIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBWSURFT0lORk9IRUFERVIqIHB2aSA9Ci0gICAgICByZWludGVycHJldF9jYXN0PFZJREVPSU5GT0hFQURFUio+KG1lZGlhX3R5cGUtPnBiRm9ybWF0KTsKLQotICBaZXJvTWVtb3J5KHB2aSwgc2l6ZW9mKFZJREVPSU5GT0hFQURFUikpOwotICBwdmktPmJtaUhlYWRlci5iaVNpemUgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7Ci0gIHB2aS0+Ym1pSGVhZGVyLmJpUGxhbmVzID0gMTsKLSAgcHZpLT5ibWlIZWFkZXIuYmlDbHJJbXBvcnRhbnQgPSAwOwotICBwdmktPmJtaUhlYWRlci5iaUNsclVzZWQgPSAwOwotICBpZiAocmVxdWVzdGVkX2NhcGFiaWxpdHlfLmZyYW1lX3JhdGUgPiAwKSB7Ci0gICAgcHZpLT5BdmdUaW1lUGVyRnJhbWUgPSBrU2Vjb25kc1RvUmVmZXJlbmNlVGltZSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfY2FwYWJpbGl0eV8uZnJhbWVfcmF0ZTsKLSAgfQotCi0gIG1lZGlhX3R5cGUtPm1ham9ydHlwZSA9IE1FRElBVFlQRV9WaWRlbzsKLSAgbWVkaWFfdHlwZS0+Zm9ybWF0dHlwZSA9IEZPUk1BVF9WaWRlb0luZm87Ci0gIG1lZGlhX3R5cGUtPmJUZW1wb3JhbENvbXByZXNzaW9uID0gRkFMU0U7Ci0KLSAgc3dpdGNoIChpbmRleCkgewotICAgIGNhc2UgMDogewotICAgICAgcHZpLT5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbiA9IE1BS0VGT1VSQ0MoJ0knLCAnNCcsICcyJywgJzAnKTsKLSAgICAgIHB2aS0+Ym1pSGVhZGVyLmJpQml0Q291bnQgPSAxMjsgIC8vIGJpdCBwZXIgcGl4ZWwKLSAgICAgIHB2aS0+Ym1pSGVhZGVyLmJpV2lkdGggPSByZXF1ZXN0ZWRfY2FwYWJpbGl0eV8ud2lkdGg7Ci0gICAgICBwdmktPmJtaUhlYWRlci5iaUhlaWdodCA9IHJlcXVlc3RlZF9jYXBhYmlsaXR5Xy5oZWlnaHQ7Ci0gICAgICBwdmktPmJtaUhlYWRlci5iaVNpemVJbWFnZSA9IDMgKiByZXF1ZXN0ZWRfY2FwYWJpbGl0eV8uaGVpZ2h0ICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX2NhcGFiaWxpdHlfLndpZHRoIC8gMjsKLSAgICAgIG1lZGlhX3R5cGUtPnN1YnR5cGUgPSBrTWVkaWFTdWJUeXBlSTQyMDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIDE6IHsKLSAgICAgIHB2aS0+Ym1pSGVhZGVyLmJpQ29tcHJlc3Npb24gPSBNQUtFRk9VUkNDKCdZJywgJ1UnLCAnWScsICcyJyk7Ci0gICAgICBwdmktPmJtaUhlYWRlci5iaUJpdENvdW50ID0gMTY7Ci0gICAgICBwdmktPmJtaUhlYWRlci5iaVdpZHRoID0gcmVxdWVzdGVkX2NhcGFiaWxpdHlfLndpZHRoOwotICAgICAgcHZpLT5ibWlIZWFkZXIuYmlIZWlnaHQgPSByZXF1ZXN0ZWRfY2FwYWJpbGl0eV8uaGVpZ2h0OwotICAgICAgcHZpLT5ibWlIZWFkZXIuYmlTaXplSW1hZ2UgPSAyICogcmVxdWVzdGVkX2NhcGFiaWxpdHlfLndpZHRoICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX2NhcGFiaWxpdHlfLmhlaWdodDsKLSAgICAgIG1lZGlhX3R5cGUtPnN1YnR5cGUgPSBNRURJQVNVQlRZUEVfWVVZMjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIDI6IHsKLSAgICAgIHB2aS0+Ym1pSGVhZGVyLmJpQ29tcHJlc3Npb24gPSBCSV9SR0I7Ci0gICAgICBwdmktPmJtaUhlYWRlci5iaUJpdENvdW50ID0gMjQ7Ci0gICAgICBwdmktPmJtaUhlYWRlci5iaVdpZHRoID0gcmVxdWVzdGVkX2NhcGFiaWxpdHlfLndpZHRoOwotICAgICAgcHZpLT5ibWlIZWFkZXIuYmlIZWlnaHQgPSByZXF1ZXN0ZWRfY2FwYWJpbGl0eV8uaGVpZ2h0OwotICAgICAgcHZpLT5ibWlIZWFkZXIuYmlTaXplSW1hZ2UgPSAzICogcmVxdWVzdGVkX2NhcGFiaWxpdHlfLmhlaWdodCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9jYXBhYmlsaXR5Xy53aWR0aDsKLSAgICAgIG1lZGlhX3R5cGUtPnN1YnR5cGUgPSBNRURJQVNVQlRZUEVfUkdCMjQ7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIG1lZGlhX3R5cGUtPmJGaXhlZFNpemVTYW1wbGVzID0gVFJVRTsKLSAgbWVkaWFfdHlwZS0+bFNhbXBsZVNpemUgPSBwdmktPmJtaUhlYWRlci5iaVNpemVJbWFnZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU2lua0lucHV0UGluOjpJc01lZGlhVHlwZVZhbGlkKGNvbnN0IEFNX01FRElBX1RZUEUqIG1lZGlhX3R5cGUpIHsKLSAgR1VJRCB0eXBlID0gbWVkaWFfdHlwZS0+bWFqb3J0eXBlOwotICBpZiAodHlwZSAhPSBNRURJQVRZUEVfVmlkZW8pCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIEdVSUQgZm9ybWF0X3R5cGUgPSBtZWRpYV90eXBlLT5mb3JtYXR0eXBlOwotICBpZiAoZm9ybWF0X3R5cGUgIT0gRk9STUFUX1ZpZGVvSW5mbykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gQ2hlY2sgZm9yIHRoZSBzdWIgdHlwZXMgd2Ugc3VwcG9ydC4KLSAgR1VJRCBzdWJfdHlwZSA9IG1lZGlhX3R5cGUtPnN1YnR5cGU7Ci0gIFZJREVPSU5GT0hFQURFUiogcHZpID0KLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8VklERU9JTkZPSEVBREVSKj4obWVkaWFfdHlwZS0+cGJGb3JtYXQpOwotICBpZiAocHZpID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8vIFN0b3JlIHRoZSBpbmNvbWluZyB3aWR0aCBhbmQgaGVpZ2h0LgotICByZXN1bHRpbmdfY2FwYWJpbGl0eV8ud2lkdGggPSBwdmktPmJtaUhlYWRlci5iaVdpZHRoOwotICByZXN1bHRpbmdfY2FwYWJpbGl0eV8uaGVpZ2h0ID0gYWJzKHB2aS0+Ym1pSGVhZGVyLmJpSGVpZ2h0KTsKLSAgaWYgKHB2aS0+QXZnVGltZVBlckZyYW1lID4gMCkgewotICAgIHJlc3VsdGluZ19jYXBhYmlsaXR5Xy5mcmFtZV9yYXRlID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihrU2Vjb25kc1RvUmVmZXJlbmNlVGltZSAvIHB2aS0+QXZnVGltZVBlckZyYW1lKTsKLSAgfSBlbHNlIHsKLSAgICByZXN1bHRpbmdfY2FwYWJpbGl0eV8uZnJhbWVfcmF0ZSA9IHJlcXVlc3RlZF9jYXBhYmlsaXR5Xy5mcmFtZV9yYXRlOwotICB9Ci0gIGlmIChzdWJfdHlwZSA9PSBrTWVkaWFTdWJUeXBlSTQyMCAmJgotICAgICAgcHZpLT5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbiA9PSBNQUtFRk9VUkNDKCdJJywgJzQnLCAnMicsICcwJykpIHsKLSAgICByZXN1bHRpbmdfY2FwYWJpbGl0eV8uY29sb3IgPSBWaWRlb0NhcHR1cmVDYXBhYmlsaXR5OjprSTQyMDsKLSAgICByZXR1cm4gdHJ1ZTsgIC8vIFRoaXMgZm9ybWF0IGlzIGFjY2VwdGFibGUuCi0gIH0KLSAgaWYgKHN1Yl90eXBlID09IE1FRElBU1VCVFlQRV9ZVVkyICYmCi0gICAgICBwdmktPmJtaUhlYWRlci5iaUNvbXByZXNzaW9uID09IE1BS0VGT1VSQ0MoJ1knLCAnVScsICdZJywgJzInKSkgewotICAgIHJlc3VsdGluZ19jYXBhYmlsaXR5Xy5jb2xvciA9IFZpZGVvQ2FwdHVyZUNhcGFiaWxpdHk6OmtZVVkyOwotICAgIHJldHVybiB0cnVlOyAgLy8gVGhpcyBmb3JtYXQgaXMgYWNjZXB0YWJsZS4KLSAgfQotICBpZiAoc3ViX3R5cGUgPT0gTUVESUFTVUJUWVBFX1JHQjI0ICYmCi0gICAgICBwdmktPmJtaUhlYWRlci5iaUNvbXByZXNzaW9uID09IEJJX1JHQikgewotICAgIHJlc3VsdGluZ19jYXBhYmlsaXR5Xy5jb2xvciA9IFZpZGVvQ2FwdHVyZUNhcGFiaWxpdHk6OmtSR0IyNDsKLSAgICByZXR1cm4gdHJ1ZTsgIC8vIFRoaXMgZm9ybWF0IGlzIGFjY2VwdGFibGUuCi0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1IUkVTVUxUIFNpbmtJbnB1dFBpbjo6UmVjZWl2ZShJTWVkaWFTYW1wbGUqIHNhbXBsZSkgewotICBjb25zdCBpbnQgbGVuZ3RoID0gc2FtcGxlLT5HZXRBY3R1YWxEYXRhTGVuZ3RoKCk7Ci0gIHVpbnQ4KiBidWZmZXIgPSBOVUxMOwotICBpZiAoRkFJTEVEKHNhbXBsZS0+R2V0UG9pbnRlcigmYnVmZmVyKSkpCi0gICAgcmV0dXJuIFNfRkFMU0U7Ci0KLSAgb2JzZXJ2ZXJfLT5GcmFtZVJlY2VpdmVkKGJ1ZmZlciwgbGVuZ3RoKTsKLSAgcmV0dXJuIFNfT0s7Ci19Ci0KLXZvaWQgU2lua0lucHV0UGluOjpTZXRSZXF1ZXN0ZWRNZWRpYUNhcGFiaWxpdHkoCi0gICAgY29uc3QgVmlkZW9DYXB0dXJlQ2FwYWJpbGl0eSYgY2FwYWJpbGl0eSkgewotICByZXF1ZXN0ZWRfY2FwYWJpbGl0eV8gPSBjYXBhYmlsaXR5OwotICByZXN1bHRpbmdfY2FwYWJpbGl0eV8ud2lkdGggPSAwOwotICByZXN1bHRpbmdfY2FwYWJpbGl0eV8uaGVpZ2h0ID0gMDsKLSAgcmVzdWx0aW5nX2NhcGFiaWxpdHlfLmZyYW1lX3JhdGUgPSAwOwotICByZXN1bHRpbmdfY2FwYWJpbGl0eV8uY29sb3IgPSBWaWRlb0NhcHR1cmVDYXBhYmlsaXR5OjprQ29sb3JVbmtub3duOwotICByZXN1bHRpbmdfY2FwYWJpbGl0eV8uZXhwZWN0ZWRfY2FwdHVyZV9kZWxheSA9IDA7Ci0gIHJlc3VsdGluZ19jYXBhYmlsaXR5Xy5pbnRlcmxhY2VkID0gZmFsc2U7Ci19Ci0KLWNvbnN0IFZpZGVvQ2FwdHVyZUNhcGFiaWxpdHkmIFNpbmtJbnB1dFBpbjo6UmVzdWx0aW5nQ2FwYWJpbGl0eSgpIHsKLSAgcmV0dXJuIHJlc3VsdGluZ19jYXBhYmlsaXR5XzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdmlkZW8vY2FwdHVyZS93aW4vc2lua19pbnB1dF9waW5fd2luLmggYi9zcmMvbWVkaWEvdmlkZW8vY2FwdHVyZS93aW4vc2lua19pbnB1dF9waW5fd2luLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MTY4YTMuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvd2luL3NpbmtfaW5wdXRfcGluX3dpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gSW1wbGVtZW50IGEgRGlyZWN0U2hvdyBpbnB1dCBwaW4gdXNlZCBmb3IgcmVjZWl2aW5nIGNhcHR1cmVkIGZyYW1lcyBmcm9tCi0vLyBhIERpcmVjdFNob3cgQ2FwdHVyZSBmaWx0ZXIuCi0KLSNpZm5kZWYgTUVESUFfVklERU9fQ0FQVFVSRV9XSU5fU0lOS19JTlBVVF9QSU5fV0lOX0hfCi0jZGVmaW5lIE1FRElBX1ZJREVPX0NBUFRVUkVfV0lOX1NJTktfSU5QVVRfUElOX1dJTl9IXwotCi0jaW5jbHVkZSAibWVkaWEvdmlkZW8vY2FwdHVyZS92aWRlb19jYXB0dXJlX2RldmljZS5oIgotI2luY2x1ZGUgIm1lZGlhL3ZpZGVvL2NhcHR1cmUvdmlkZW9fY2FwdHVyZV90eXBlcy5oIgotI2luY2x1ZGUgIm1lZGlhL3ZpZGVvL2NhcHR1cmUvd2luL3Bpbl9iYXNlX3dpbi5oIgotI2luY2x1ZGUgIm1lZGlhL3ZpZGVvL2NhcHR1cmUvd2luL3NpbmtfZmlsdGVyX3dpbi5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBDb25zdCB1c2VkIGZvciBjb252ZXJ0aW5nIFNlY29uZHMgdG8gUkVGRVJFTkNFX1RJTUUuCi1leHRlcm4gY29uc3QgUkVGRVJFTkNFX1RJTUUga1NlY29uZHNUb1JlZmVyZW5jZVRpbWU7Ci0KLS8vIElucHV0IHBpbiBvZiB0aGUgU2lua0ZpbHRlci4KLWNsYXNzIFNpbmtJbnB1dFBpbiA6IHB1YmxpYyBQaW5CYXNlIHsKLSBwdWJsaWM6Ci0gIFNpbmtJbnB1dFBpbihJQmFzZUZpbHRlciogZmlsdGVyLCBTaW5rRmlsdGVyT2JzZXJ2ZXIqIG9ic2VydmVyKTsKLSAgdmlydHVhbCB+U2lua0lucHV0UGluKCk7Ci0KLSAgdm9pZCBTZXRSZXF1ZXN0ZWRNZWRpYUNhcGFiaWxpdHkoY29uc3QgVmlkZW9DYXB0dXJlQ2FwYWJpbGl0eSYgY2FwYWJpbGl0eSk7Ci0gIC8vIFJldHVybnMgdGhlIGNhcGFiaWxpdHkgdGhhdCBpcyBuZWdvdGlhdGVkIHdoZW4gdGhpcwotICAvLyBwaW4gaXMgY29ubmVjdGVkIHRvIGEgbWVkaWEgZmlsdGVyLgotICBjb25zdCBWaWRlb0NhcHR1cmVDYXBhYmlsaXR5JiBSZXN1bHRpbmdDYXBhYmlsaXR5KCk7Ci0KLSAgLy8gSW1wbGVtZW50IFBpbkJhc2UuCi0gIHZpcnR1YWwgYm9vbCBJc01lZGlhVHlwZVZhbGlkKGNvbnN0IEFNX01FRElBX1RZUEUqIG1lZGlhX3R5cGUpOwotICB2aXJ0dWFsIGJvb2wgR2V0VmFsaWRNZWRpYVR5cGUoaW50IGluZGV4LCBBTV9NRURJQV9UWVBFKiBtZWRpYV90eXBlKTsKLQotICBTVERNRVRIT0QoUmVjZWl2ZSkoSU1lZGlhU2FtcGxlKiBtZWRpYV9zYW1wbGUpOwotCi0gcHJpdmF0ZToKLSAgVmlkZW9DYXB0dXJlQ2FwYWJpbGl0eSByZXF1ZXN0ZWRfY2FwYWJpbGl0eV87Ci0gIFZpZGVvQ2FwdHVyZUNhcGFiaWxpdHkgcmVzdWx0aW5nX2NhcGFiaWxpdHlfOwotICBTaW5rRmlsdGVyT2JzZXJ2ZXIqIG9ic2VydmVyXzsKLQotICBESVNBTExPV19JTVBMSUNJVF9DT05TVFJVQ1RPUlMoU2lua0lucHV0UGluKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX1ZJREVPX0NBUFRVUkVfV0lOX1NJTktfSU5QVVRfUElOX1dJTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvd2luL3ZpZGVvX2NhcHR1cmVfZGV2aWNlX21mX3dpbi5jYyBiL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL3dpbi92aWRlb19jYXB0dXJlX2RldmljZV9tZl93aW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YmZkYjIuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvd2luL3ZpZGVvX2NhcHR1cmVfZGV2aWNlX21mX3dpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDQyOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvdmlkZW8vY2FwdHVyZS93aW4vdmlkZW9fY2FwdHVyZV9kZXZpY2VfbWZfd2luLmgiCi0KLSNpbmNsdWRlIDxtZmFwaS5oPgotI2luY2x1ZGUgPG1mZXJyb3IuaD4KLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS9zeW5jaHJvbml6YXRpb24vd2FpdGFibGVfZXZlbnQuaCIKLSNpbmNsdWRlICJiYXNlL3N5c19zdHJpbmdfY29udmVyc2lvbnMuaCIKLSNpbmNsdWRlICJiYXNlL3dpbi9zY29wZWRfY29fbWVtLmgiCi0jaW5jbHVkZSAiYmFzZS93aW4vd2luZG93c192ZXJzaW9uLmgiCi0jaW5jbHVkZSAibWVkaWEvdmlkZW8vY2FwdHVyZS93aW4vY2FwYWJpbGl0eV9saXN0X3dpbi5oIgotCi11c2luZyBiYXNlOjp3aW46OlNjb3BlZENvTWVtOwotdXNpbmcgYmFzZTo6d2luOjpTY29wZWRDb21QdHI7Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci1uYW1lc3BhY2UgewotCi1jbGFzcyBNRkluaXRpYWxpemVyU2luZ2xldG9uIHsKLSBwdWJsaWM6Ci0gIE1GSW5pdGlhbGl6ZXJTaW5nbGV0b24oKSB7IE1GU3RhcnR1cChNRl9WRVJTSU9OLCBNRlNUQVJUVVBfTElURSk7IH0KLSAgfk1GSW5pdGlhbGl6ZXJTaW5nbGV0b24oKSB7IE1GU2h1dGRvd24oKTsgfQotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNRkluaXRpYWxpemVyU2luZ2xldG9uPiBnX21mX2luaXRpYWxpemUgPQotICAgIExBWllfSU5TVEFOQ0VfSU5JVElBTElaRVI7Ci0KLXZvaWQgRW5zdXJlTUZJbml0KCkgewotICBnX21mX2luaXRpYWxpemUuR2V0KCk7Ci19Ci0KLWJvb2wgUHJlcGFyZVZpZGVvQ2FwdHVyZUF0dHJpYnV0ZXMoSU1GQXR0cmlidXRlcyoqIGF0dHJpYnV0ZXMsIGludCBjb3VudCkgewotICBFbnN1cmVNRkluaXQoKTsKLQotICBpZiAoRkFJTEVEKE1GQ3JlYXRlQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBjb3VudCkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gU1VDQ0VFREVEKCgqYXR0cmlidXRlcyktPlNldEdVSUQoTUZfREVWU09VUkNFX0FUVFJJQlVURV9TT1VSQ0VfVFlQRSwKLSAgICAgIE1GX0RFVlNPVVJDRV9BVFRSSUJVVEVfU09VUkNFX1RZUEVfVklEQ0FQX0dVSUQpKTsKLX0KLQotYm9vbCBFbnVtZXJhdGVWaWRlb0RldmljZXMoSU1GQWN0aXZhdGUqKiogZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiogY291bnQpIHsKLSAgU2NvcGVkQ29tUHRyPElNRkF0dHJpYnV0ZXM+IGF0dHJpYnV0ZXM7Ci0gIGlmICghUHJlcGFyZVZpZGVvQ2FwdHVyZUF0dHJpYnV0ZXMoYXR0cmlidXRlcy5SZWNlaXZlKCksIDEpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gU1VDQ0VFREVEKE1GRW51bURldmljZVNvdXJjZXMoYXR0cmlidXRlcywgZGV2aWNlcywgY291bnQpKTsKLX0KLQotYm9vbCBDcmVhdGVWaWRlb0NhcHR1cmVEZXZpY2UoY29uc3QgY2hhciogc3ltX2xpbmssIElNRk1lZGlhU291cmNlKiogc291cmNlKSB7Ci0gIFNjb3BlZENvbVB0cjxJTUZBdHRyaWJ1dGVzPiBhdHRyaWJ1dGVzOwotICBpZiAoIVByZXBhcmVWaWRlb0NhcHR1cmVBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMuUmVjZWl2ZSgpLCAyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYXR0cmlidXRlcy0+U2V0U3RyaW5nKE1GX0RFVlNPVVJDRV9BVFRSSUJVVEVfU09VUkNFX1RZUEVfVklEQ0FQX1NZTUJPTElDX0xJTkssCi0gICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpTeXNVVEY4VG9XaWRlKHN5bV9saW5rKS5jX3N0cigpKTsKLQotICByZXR1cm4gU1VDQ0VFREVEKE1GQ3JlYXRlRGV2aWNlU291cmNlKGF0dHJpYnV0ZXMsIHNvdXJjZSkpOwotfQotCi1ib29sIEZvcm1hdEZyb21HdWlkKGNvbnN0IEdVSUQmIGd1aWQsIFZpZGVvQ2FwdHVyZUNhcGFiaWxpdHk6OkZvcm1hdCogZm9ybWF0KSB7Ci0gIHN0cnVjdCB7Ci0gICAgY29uc3QgR1VJRCYgZ3VpZDsKLSAgICBjb25zdCBWaWRlb0NhcHR1cmVDYXBhYmlsaXR5OjpGb3JtYXQgZm9ybWF0OwotICB9IHN0YXRpYyBjb25zdCBrRm9ybWF0TWFwW10gPSB7Ci0gICAgeyBNRlZpZGVvRm9ybWF0X0k0MjAsIFZpZGVvQ2FwdHVyZUNhcGFiaWxpdHk6OmtJNDIwIH0sCi0gICAgeyBNRlZpZGVvRm9ybWF0X1lVWTIsIFZpZGVvQ2FwdHVyZUNhcGFiaWxpdHk6OmtZVVkyIH0sCi0gICAgeyBNRlZpZGVvRm9ybWF0X1VZVlksIFZpZGVvQ2FwdHVyZUNhcGFiaWxpdHk6OmtVWVZZIH0sCi0gICAgeyBNRlZpZGVvRm9ybWF0X1JHQjI0LCBWaWRlb0NhcHR1cmVDYXBhYmlsaXR5OjprUkdCMjQgfSwKLSAgICB7IE1GVmlkZW9Gb3JtYXRfQVJHQjMyLCBWaWRlb0NhcHR1cmVDYXBhYmlsaXR5OjprQVJHQiB9LAotICAgIHsgTUZWaWRlb0Zvcm1hdF9NSlBHLCBWaWRlb0NhcHR1cmVDYXBhYmlsaXR5OjprTUpQRUcgfSwKLSAgICB7IE1GVmlkZW9Gb3JtYXRfWVYxMiwgVmlkZW9DYXB0dXJlQ2FwYWJpbGl0eTo6a1lWMTIgfSwKLSAgfTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5c2l6ZShrRm9ybWF0TWFwKTsgKytpKSB7Ci0gICAgaWYgKGtGb3JtYXRNYXBbaV0uZ3VpZCA9PSBndWlkKSB7Ci0gICAgICAqZm9ybWF0ID0ga0Zvcm1hdE1hcFtpXS5mb3JtYXQ7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgR2V0RnJhbWVTaXplKElNRk1lZGlhVHlwZSogdHlwZSwgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpIHsKLSAgVUlOVDMyIHdpZHRoMzIsIGhlaWdodDMyOwotICBpZiAoRkFJTEVEKE1GR2V0QXR0cmlidXRlU2l6ZSh0eXBlLCBNRl9NVF9GUkFNRV9TSVpFLCAmd2lkdGgzMiwgJmhlaWdodDMyKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICAqd2lkdGggPSB3aWR0aDMyOwotICAqaGVpZ2h0ID0gaGVpZ2h0MzI7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEdldEZyYW1lUmF0ZShJTUZNZWRpYVR5cGUqIHR5cGUsIGludCogZnJhbWVfcmF0ZSkgewotICBVSU5UMzIgbnVtZXJhdG9yLCBkZW5vbWluYXRvcjsKLSAgaWYgKEZBSUxFRChNRkdldEF0dHJpYnV0ZVJhdGlvKHR5cGUsIE1GX01UX0ZSQU1FX1JBVEUsICZudW1lcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVub21pbmF0b3IpKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpmcmFtZV9yYXRlID0gZGVub21pbmF0b3IgPyBudW1lcmF0b3IgLyBkZW5vbWluYXRvciA6IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRmlsbENhcGFiaWxpdGllc0Zyb21UeXBlKElNRk1lZGlhVHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvQ2FwdHVyZUNhcGFiaWxpdHkqIGNhcGFiaWxpdHkpIHsKLSAgR1VJRCB0eXBlX2d1aWQ7Ci0gIGlmIChGQUlMRUQodHlwZS0+R2V0R1VJRChNRl9NVF9TVUJUWVBFLCAmdHlwZV9ndWlkKSkgfHwKLSAgICAgICFGb3JtYXRGcm9tR3VpZCh0eXBlX2d1aWQsICZjYXBhYmlsaXR5LT5jb2xvcikgfHwKLSAgICAgICFHZXRGcmFtZVNpemUodHlwZSwgJmNhcGFiaWxpdHktPndpZHRoLCAmY2FwYWJpbGl0eS0+aGVpZ2h0KSB8fAotICAgICAgIUdldEZyYW1lUmF0ZSh0eXBlLCAmY2FwYWJpbGl0eS0+ZnJhbWVfcmF0ZSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBjYXBhYmlsaXR5LT5leHBlY3RlZF9jYXB0dXJlX2RlbGF5ID0gMDsgIC8vIEN1cnJlbnRseSBub3QgdXNlZC4KLSAgY2FwYWJpbGl0eS0+aW50ZXJsYWNlZCA9IGZhbHNlOyAgLy8gQ3VycmVudGx5IG5vdCB1c2VkLgotCi0gIHJldHVybiB0cnVlOwotfQotCi1IUkVTVUxUIEZpbGxDYXBhYmlsaXRpZXMoSU1GU291cmNlUmVhZGVyKiBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ2FwYWJpbGl0eUxpc3QqIGNhcGFiaWxpdGllcykgewotICBEV09SRCBzdHJlYW1faW5kZXggPSAwOwotICBTY29wZWRDb21QdHI8SU1GTWVkaWFUeXBlPiB0eXBlOwotICBIUkVTVUxUIGhyOwotICB3aGlsZSAoU1VDQ0VFREVEKGhyID0gc291cmNlLT5HZXROYXRpdmVNZWRpYVR5cGUoCi0gICAgICBNRl9TT1VSQ0VfUkVBREVSX0ZJUlNUX1ZJREVPX1NUUkVBTSwgc3RyZWFtX2luZGV4LCB0eXBlLlJlY2VpdmUoKSkpKSB7Ci0gICAgVmlkZW9DYXB0dXJlQ2FwYWJpbGl0eVdpbiBjYXBhYmlsaXR5KHN0cmVhbV9pbmRleCsrKTsKLSAgICBpZiAoRmlsbENhcGFiaWxpdGllc0Zyb21UeXBlKHR5cGUsICZjYXBhYmlsaXR5KSkKLSAgICAgIGNhcGFiaWxpdGllcy0+QWRkKGNhcGFiaWxpdHkpOwotICAgIHR5cGUuUmVsZWFzZSgpOwotICB9Ci0KLSAgaWYgKFNVQ0NFRURFRChocikgJiYgY2FwYWJpbGl0aWVzLT5lbXB0eSgpKQotICAgIGhyID0gSFJFU1VMVF9GUk9NX1dJTjMyKEVSUk9SX0VNUFRZKTsKLQotICByZXR1cm4gKGhyID09IE1GX0VfTk9fTU9SRV9UWVBFUykgPyBTX09LIDogaHI7Ci19Ci0KLWJvb2wgTG9hZE1lZGlhRm91bmRhdGlvbkRsbHMoKSB7Ci0gIHN0YXRpYyBjb25zdCB3Y2hhcl90KiBjb25zdCBrTWZETExzW10gPSB7Ci0gICAgTCIlV0lORElSJVxcc3lzdGVtMzJcXG1mLmRsbCIsCi0gICAgTCIlV0lORElSJVxcc3lzdGVtMzJcXG1mcGxhdC5kbGwiLAotICAgIEwiJVdJTkRJUiVcXHN5c3RlbTMyXFxtZnJlYWR3cml0ZS5kbGwiLAotICB9OwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlzaXplKGtNZkRMTHMpOyArK2kpIHsKLSAgICB3Y2hhcl90IHBhdGhbTUFYX1BBVEhdID0gezB9OwotICAgIEV4cGFuZEVudmlyb25tZW50U3RyaW5nc1coa01mRExMc1tpXSwgcGF0aCwgYXJyYXlzaXplKHBhdGgpKTsKLSAgICBpZiAoIUxvYWRMaWJyYXJ5RXhXKHBhdGgsIE5VTEwsIExPQURfV0lUSF9BTFRFUkVEX1NFQVJDSF9QQVRIKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotY2xhc3MgTUZSZWFkZXJDYWxsYmFjawotICAgIDogcHVibGljIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPE1GUmVhZGVyQ2FsbGJhY2s+LAotICAgICAgcHVibGljIElNRlNvdXJjZVJlYWRlckNhbGxiYWNrIHsKLSBwdWJsaWM6Ci0gIE1GUmVhZGVyQ2FsbGJhY2soVmlkZW9DYXB0dXJlRGV2aWNlTUZXaW4qIG9ic2VydmVyKQotICAgICAgOiBvYnNlcnZlcl8ob2JzZXJ2ZXIpLCB3YWl0X2V2ZW50XyhOVUxMKSB7Ci0gIH0KLQotICB2b2lkIFNldFNpZ25hbE9uRmx1c2goYmFzZTo6V2FpdGFibGVFdmVudCogZXZlbnQpIHsKLSAgICB3YWl0X2V2ZW50XyA9IGV2ZW50OwotICB9Ci0KLSAgU1RETUVUSE9EKFF1ZXJ5SW50ZXJmYWNlKShSRUZJSUQgcmlpZCwgdm9pZCoqIG9iamVjdCkgewotICAgIGlmIChyaWlkICE9IElJRF9JVW5rbm93biAmJiByaWlkICE9IElJRF9JTUZTb3VyY2VSZWFkZXJDYWxsYmFjaykKLSAgICAgIHJldHVybiBFX05PSU5URVJGQUNFOwotICAgICpvYmplY3QgPSBzdGF0aWNfY2FzdDxJTUZTb3VyY2VSZWFkZXJDYWxsYmFjayo+KHRoaXMpOwotICAgIEFkZFJlZigpOwotICAgIHJldHVybiBTX09LOwotICB9Ci0KLSAgU1RETUVUSE9EXyhVTE9ORywgQWRkUmVmKSgpIHsKLSAgICBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxNRlJlYWRlckNhbGxiYWNrPjo6QWRkUmVmKCk7Ci0gICAgcmV0dXJuIDFVOwotICB9Ci0KLSAgU1RETUVUSE9EXyhVTE9ORywgUmVsZWFzZSkoKSB7Ci0gICAgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8TUZSZWFkZXJDYWxsYmFjaz46OlJlbGVhc2UoKTsKLSAgICByZXR1cm4gMVU7Ci0gIH0KLQotICBTVERNRVRIT0QoT25SZWFkU2FtcGxlKShIUkVTVUxUIHN0YXR1cywgRFdPUkQgc3RyZWFtX2luZGV4LAotICAgICAgRFdPUkQgc3RyZWFtX2ZsYWdzLCBMT05HTE9ORyB0aW1lX3N0YW1wLCBJTUZTYW1wbGUqIHNhbXBsZSkgewotICAgIGJhc2U6OlRpbWUgc3RhbXAoYmFzZTo6VGltZTo6Tm93KCkpOwotICAgIGlmICghc2FtcGxlKSB7Ci0gICAgICBvYnNlcnZlcl8tPk9uSW5jb21pbmdDYXB0dXJlZEZyYW1lKE5VTEwsIDAsIHN0YW1wKTsKLSAgICAgIHJldHVybiBTX09LOwotICAgIH0KLQotICAgIERXT1JEIGNvdW50ID0gMDsKLSAgICBzYW1wbGUtPkdldEJ1ZmZlckNvdW50KCZjb3VudCk7Ci0KLSAgICBmb3IgKERXT1JEIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgU2NvcGVkQ29tUHRyPElNRk1lZGlhQnVmZmVyPiBidWZmZXI7Ci0gICAgICBzYW1wbGUtPkdldEJ1ZmZlckJ5SW5kZXgoaSwgYnVmZmVyLlJlY2VpdmUoKSk7Ci0gICAgICBpZiAoYnVmZmVyKSB7Ci0gICAgICAgIERXT1JEIGxlbmd0aCA9IDAsIG1heF9sZW5ndGggPSAwOwotICAgICAgICBCWVRFKiBkYXRhID0gTlVMTDsKLSAgICAgICAgYnVmZmVyLT5Mb2NrKCZkYXRhLCAmbWF4X2xlbmd0aCwgJmxlbmd0aCk7Ci0gICAgICAgIG9ic2VydmVyXy0+T25JbmNvbWluZ0NhcHR1cmVkRnJhbWUoZGF0YSwgbGVuZ3RoLCBzdGFtcCk7Ci0gICAgICAgIGJ1ZmZlci0+VW5sb2NrKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBTX09LOwotICB9Ci0KLSAgU1RETUVUSE9EKE9uRmx1c2gpKERXT1JEIHN0cmVhbV9pbmRleCkgewotICAgIGlmICh3YWl0X2V2ZW50XykgewotICAgICAgd2FpdF9ldmVudF8tPlNpZ25hbCgpOwotICAgICAgd2FpdF9ldmVudF8gPSBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gU19PSzsKLSAgfQotCi0gIFNURE1FVEhPRChPbkV2ZW50KShEV09SRCBzdHJlYW1faW5kZXgsIElNRk1lZGlhRXZlbnQqIGV2ZW50KSB7Ci0gICAgTk9USU1QTEVNRU5URUQoKTsKLSAgICByZXR1cm4gU19PSzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPE1GUmVhZGVyQ2FsbGJhY2s+OwotICB+TUZSZWFkZXJDYWxsYmFjaygpIHt9Ci0KLSAgVmlkZW9DYXB0dXJlRGV2aWNlTUZXaW4qIG9ic2VydmVyXzsKLSAgYmFzZTo6V2FpdGFibGVFdmVudCogd2FpdF9ldmVudF87Ci19OwotCi0vLyBzdGF0aWMKLWJvb2wgVmlkZW9DYXB0dXJlRGV2aWNlTUZXaW46OlBsYXRmb3JtU3VwcG9ydGVkKCkgewotICAvLyBFdmVuIHRob3VnaCB0aGUgRExMcyBtaWdodCBiZSBhdmFpbGFibGUgb24gVmlzdGEsIHdlIGdldCBjcmFzaGVzCi0gIC8vIHdoZW4gcnVubmluZyBvdXIgdGVzdHMgb24gdGhlIGJ1aWxkIGJvdHMuCi0gIGlmIChiYXNlOjp3aW46OkdldFZlcnNpb24oKSA8IGJhc2U6Ondpbjo6VkVSU0lPTl9XSU43KQotICAgIHJldHVybiBmYWxzZTsKLQotICBzdGF0aWMgYm9vbCBnX2RsbHNfYXZhaWxhYmxlID0gTG9hZE1lZGlhRm91bmRhdGlvbkRsbHMoKTsKLSAgcmV0dXJuIGdfZGxsc19hdmFpbGFibGU7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBWaWRlb0NhcHR1cmVEZXZpY2VNRldpbjo6R2V0RGV2aWNlTmFtZXMoTmFtZXMqIGRldmljZV9uYW1lcykgewotICBTY29wZWRDb01lbTxJTUZBY3RpdmF0ZSo+IGRldmljZXM7Ci0gIFVJTlQzMiBjb3VudDsKLSAgaWYgKCFFbnVtZXJhdGVWaWRlb0RldmljZXMoJmRldmljZXMsICZjb3VudCkpCi0gICAgcmV0dXJuOwotCi0gIEhSRVNVTFQgaHI7Ci0gIGZvciAoVUlOVDMyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgIFVJTlQzMiBuYW1lX3NpemUsIGlkX3NpemU7Ci0gICAgU2NvcGVkQ29NZW08d2NoYXJfdD4gbmFtZSwgaWQ7Ci0gICAgaWYgKFNVQ0NFRURFRChociA9IGRldmljZXNbaV0tPkdldEFsbG9jYXRlZFN0cmluZygKLSAgICAgICAgICAgIE1GX0RFVlNPVVJDRV9BVFRSSUJVVEVfRlJJRU5ETFlfTkFNRSwgJm5hbWUsICZuYW1lX3NpemUpKSAmJgotICAgICAgICBTVUNDRUVERUQoaHIgPSBkZXZpY2VzW2ldLT5HZXRBbGxvY2F0ZWRTdHJpbmcoCi0gICAgICAgICAgICBNRl9ERVZTT1VSQ0VfQVRUUklCVVRFX1NPVVJDRV9UWVBFX1ZJRENBUF9TWU1CT0xJQ19MSU5LLCAmaWQsCi0gICAgICAgICAgICAmaWRfc2l6ZSkpKSB7Ci0gICAgICBzdGQ6OndzdHJpbmcgbmFtZV93KG5hbWUsIG5hbWVfc2l6ZSksIGlkX3coaWQsIGlkX3NpemUpOwotICAgICAgTmFtZSBkZXZpY2U7Ci0gICAgICBkZXZpY2UuZGV2aWNlX25hbWUgPSBiYXNlOjpTeXNXaWRlVG9VVEY4KG5hbWVfdyk7Ci0gICAgICBkZXZpY2UudW5pcXVlX2lkID0gYmFzZTo6U3lzV2lkZVRvVVRGOChpZF93KTsKLSAgICAgIGRldmljZV9uYW1lcy0+cHVzaF9iYWNrKGRldmljZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIERMT0coV0FSTklORykgPDwgIkdldEFsbG9jYXRlZFN0cmluZyBmYWlsZWQ6ICIgPDwgc3RkOjpoZXggPDwgaHI7Ci0gICAgfQotICAgIGRldmljZXNbaV0tPlJlbGVhc2UoKTsKLSAgfQotfQotCi1WaWRlb0NhcHR1cmVEZXZpY2VNRldpbjo6VmlkZW9DYXB0dXJlRGV2aWNlTUZXaW4oY29uc3QgTmFtZSYgZGV2aWNlX25hbWUpCi0gICAgOiBuYW1lXyhkZXZpY2VfbmFtZSksIG9ic2VydmVyXyhOVUxMKSwgY2FwdHVyZV8oMCkgewotICBEZXRhY2hGcm9tVGhyZWFkKCk7Ci19Ci0KLVZpZGVvQ2FwdHVyZURldmljZU1GV2luOjp+VmlkZW9DYXB0dXJlRGV2aWNlTUZXaW4oKSB7Ci0gIERDSEVDSyhDYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotfQotCi1ib29sIFZpZGVvQ2FwdHVyZURldmljZU1GV2luOjpJbml0KCkgewotICBEQ0hFQ0soQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLSAgRENIRUNLKCFyZWFkZXJfKTsKLQotICBTY29wZWRDb21QdHI8SU1GTWVkaWFTb3VyY2U+IHNvdXJjZTsKLSAgaWYgKCFDcmVhdGVWaWRlb0NhcHR1cmVEZXZpY2UobmFtZV8udW5pcXVlX2lkLmNfc3RyKCksIHNvdXJjZS5SZWNlaXZlKCkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBTY29wZWRDb21QdHI8SU1GQXR0cmlidXRlcz4gYXR0cmlidXRlczsKLSAgTUZDcmVhdGVBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMuUmVjZWl2ZSgpLCAxKTsKLSAgRENIRUNLKGF0dHJpYnV0ZXMpOwotCi0gIGNhbGxiYWNrXyA9IG5ldyBNRlJlYWRlckNhbGxiYWNrKHRoaXMpOwotICBhdHRyaWJ1dGVzLT5TZXRVbmtub3duKE1GX1NPVVJDRV9SRUFERVJfQVNZTkNfQ0FMTEJBQ0ssIGNhbGxiYWNrXy5nZXQoKSk7Ci0KLSAgcmV0dXJuIFNVQ0NFRURFRChNRkNyZWF0ZVNvdXJjZVJlYWRlckZyb21NZWRpYVNvdXJjZShzb3VyY2UsIGF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyXy5SZWNlaXZlKCkpKTsKLX0KLQotdm9pZCBWaWRlb0NhcHR1cmVEZXZpY2VNRldpbjo6QWxsb2NhdGUoCi0gICAgaW50IHdpZHRoLAotICAgIGludCBoZWlnaHQsCi0gICAgaW50IGZyYW1lX3JhdGUsCi0gICAgVmlkZW9DYXB0dXJlRGV2aWNlOjpFdmVudEhhbmRsZXIqIG9ic2VydmVyKSB7Ci0gIERDSEVDSyhDYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotCi0gIGJhc2U6OkF1dG9Mb2NrIGxvY2sobG9ja18pOwotCi0gIGlmIChvYnNlcnZlcl8pIHsKLSAgICBEQ0hFQ0tfRVEob2JzZXJ2ZXIsIG9ic2VydmVyXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgb2JzZXJ2ZXJfID0gb2JzZXJ2ZXI7Ci0gIERDSEVDS19FUShjYXB0dXJlXywgZmFsc2UpOwotCi0gIENhcGFiaWxpdHlMaXN0IGNhcGFiaWxpdGllczsKLSAgSFJFU1VMVCBociA9IFNfT0s7Ci0gIGlmICghcmVhZGVyXyB8fCBGQUlMRUQoaHIgPSBGaWxsQ2FwYWJpbGl0aWVzKHJlYWRlcl8sICZjYXBhYmlsaXRpZXMpKSkgewotICAgIE9uRXJyb3IoaHIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGNvbnN0IFZpZGVvQ2FwdHVyZUNhcGFiaWxpdHlXaW4mIGZvdW5kX2NhcGFiaWxpdHkgPQotICAgICAgY2FwYWJpbGl0aWVzLkdldEJlc3RNYXRjaGVkQ2FwYWJpbGl0eSh3aWR0aCwgaGVpZ2h0LCBmcmFtZV9yYXRlKTsKLQotICBTY29wZWRDb21QdHI8SU1GTWVkaWFUeXBlPiB0eXBlOwotICBpZiAoRkFJTEVEKGhyID0gcmVhZGVyXy0+R2V0TmF0aXZlTWVkaWFUeXBlKAotICAgICAgICAgIE1GX1NPVVJDRV9SRUFERVJfRklSU1RfVklERU9fU1RSRUFNLCBmb3VuZF9jYXBhYmlsaXR5LnN0cmVhbV9pbmRleCwKLSAgICAgICAgICB0eXBlLlJlY2VpdmUoKSkpIHx8Ci0gICAgICBGQUlMRUQoaHIgPSByZWFkZXJfLT5TZXRDdXJyZW50TWVkaWFUeXBlKAotICAgICAgICAgIE1GX1NPVVJDRV9SRUFERVJfRklSU1RfVklERU9fU1RSRUFNLCBOVUxMLCB0eXBlKSkpIHsKLSAgICBPbkVycm9yKGhyKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBvYnNlcnZlcl8tPk9uRnJhbWVJbmZvKGZvdW5kX2NhcGFiaWxpdHkpOwotfQotCi12b2lkIFZpZGVvQ2FwdHVyZURldmljZU1GV2luOjpTdGFydCgpIHsKLSAgRENIRUNLKENhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0KLSAgYmFzZTo6QXV0b0xvY2sgbG9jayhsb2NrXyk7Ci0gIGlmICghY2FwdHVyZV8pIHsKLSAgICBjYXB0dXJlXyA9IHRydWU7Ci0gICAgSFJFU1VMVCBocjsKLSAgICBpZiAoRkFJTEVEKGhyID0gcmVhZGVyXy0+UmVhZFNhbXBsZShNRl9TT1VSQ0VfUkVBREVSX0ZJUlNUX1ZJREVPX1NUUkVBTSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkpIHsKLSAgICAgIE9uRXJyb3IoaHIpOwotICAgICAgY2FwdHVyZV8gPSBmYWxzZTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBWaWRlb0NhcHR1cmVEZXZpY2VNRldpbjo6U3RvcCgpIHsKLSAgRENIRUNLKENhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIGJhc2U6OldhaXRhYmxlRXZlbnQgZmx1c2hlZChmYWxzZSwgZmFsc2UpOwotICBib29sIHdhaXQgPSBmYWxzZTsKLSAgewotICAgIGJhc2U6OkF1dG9Mb2NrIGxvY2sobG9ja18pOwotICAgIGlmIChjYXB0dXJlXykgewotICAgICAgY2FwdHVyZV8gPSBmYWxzZTsKLSAgICAgIGNhbGxiYWNrXy0+U2V0U2lnbmFsT25GbHVzaCgmZmx1c2hlZCk7Ci0gICAgICBIUkVTVUxUIGhyID0gcmVhZGVyXy0+Rmx1c2goTUZfU09VUkNFX1JFQURFUl9BTExfU1RSRUFNUyk7Ci0gICAgICB3YWl0ID0gU1VDQ0VFREVEKGhyKTsKLSAgICAgIGlmICghd2FpdCkgewotICAgICAgICBjYWxsYmFja18tPlNldFNpZ25hbE9uRmx1c2goTlVMTCk7Ci0gICAgICAgIE9uRXJyb3IoaHIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmICh3YWl0KQotICAgIGZsdXNoZWQuV2FpdCgpOwotfQotCi12b2lkIFZpZGVvQ2FwdHVyZURldmljZU1GV2luOjpEZUFsbG9jYXRlKCkgewotICBEQ0hFQ0soQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLQotICBTdG9wKCk7Ci0KLSAgYmFzZTo6QXV0b0xvY2sgbG9jayhsb2NrXyk7Ci0gIG9ic2VydmVyXyA9IE5VTEw7Ci19Ci0KLWNvbnN0IFZpZGVvQ2FwdHVyZURldmljZTo6TmFtZSYgVmlkZW9DYXB0dXJlRGV2aWNlTUZXaW46OmRldmljZV9uYW1lKCkgewotICBEQ0hFQ0soQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLSAgcmV0dXJuIG5hbWVfOwotfQotCi12b2lkIFZpZGVvQ2FwdHVyZURldmljZU1GV2luOjpPbkluY29taW5nQ2FwdHVyZWRGcmFtZSgKLSAgICBjb25zdCB1aW50OCogZGF0YSwKLSAgICBpbnQgbGVuZ3RoLAotICAgIGNvbnN0IGJhc2U6OlRpbWUmIHRpbWVfc3RhbXApIHsKLSAgYmFzZTo6QXV0b0xvY2sgbG9jayhsb2NrXyk7Ci0gIGlmIChkYXRhICYmIG9ic2VydmVyXykKLSAgICBvYnNlcnZlcl8tPk9uSW5jb21pbmdDYXB0dXJlZEZyYW1lKGRhdGEsIGxlbmd0aCwgdGltZV9zdGFtcCk7Ci0KLSAgaWYgKGNhcHR1cmVfKSB7Ci0gICAgSFJFU1VMVCBociA9IHJlYWRlcl8tPlJlYWRTYW1wbGUoTUZfU09VUkNFX1JFQURFUl9GSVJTVF9WSURFT19TVFJFQU0sIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0gICAgaWYgKEZBSUxFRChocikpIHsKLSAgICAgIC8vIElmIHJ1bm5pbmcgdGhlICpWaWRlb0NhcCogdW5pdCB0ZXN0cyBvbiByZXBlYXQsIHRoaXMgY2FuIHNvbWV0aW1lcwotICAgICAgLy8gZmFpbCB3aXRoIEhSRVNVTFRfRlJPTV9XSU5IUkVTVUxUX0ZST01fV0lOMzIoRVJST1JfSU5WQUxJRF9GVU5DVElPTikuCi0gICAgICAvLyBJdCdzIG5vdCBjbGVhciB0byBtZSB3aHkgdGhpcyBpcywgYnV0IGl0IGlzIHBvc3NpYmxlIHRoYXQgaXQgaGFzCi0gICAgICAvLyBzb21ldGhpbmcgdG8gZG8gd2l0aCB0aGlzIGJ1ZzoKLSAgICAgIC8vIGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20va2IvOTc5NTY3Ci0gICAgICBPbkVycm9yKGhyKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBWaWRlb0NhcHR1cmVEZXZpY2VNRldpbjo6T25FcnJvcihIUkVTVUxUIGhyKSB7Ci0gIERMT0coRVJST1IpIDw8ICJWaWRlb0NhcHR1cmVEZXZpY2VNRldpbjogIiA8PCBzdGQ6OmhleCA8PCBocjsKLSAgaWYgKG9ic2VydmVyXykKLSAgICBvYnNlcnZlcl8tPk9uRXJyb3IoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdmlkZW8vY2FwdHVyZS93aW4vdmlkZW9fY2FwdHVyZV9kZXZpY2VfbWZfd2luLmggYi9zcmMvbWVkaWEvdmlkZW8vY2FwdHVyZS93aW4vdmlkZW9fY2FwdHVyZV9kZXZpY2VfbWZfd2luLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3M2IxZWQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvd2luL3ZpZGVvX2NhcHR1cmVfZGV2aWNlX21mX3dpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gV2luZG93cyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBWaWRlb0NhcHR1cmVEZXZpY2UuCi0vLyBEaXJlY3RTaG93IGlzIHVzZWQgZm9yIGNhcHR1cmluZy4gRGlyZWN0U2hvdyBwcm92aWRlIGl0cyBvd24gdGhyZWFkcwotLy8gZm9yIGNhcHR1cmluZy4KLQotI2lmbmRlZiBNRURJQV9WSURFT19DQVBUVVJFX1dJTl9WSURFT19DQVBUVVJFX0RFVklDRV9NRl9XSU5fSF8KLSNkZWZpbmUgTUVESUFfVklERU9fQ0FQVFVSRV9XSU5fVklERU9fQ0FQVFVSRV9ERVZJQ0VfTUZfV0lOX0hfCi0KLSNpbmNsdWRlIDxtZmlkbC5oPgotI2luY2x1ZGUgPG1mcmVhZHdyaXRlLmg+Ci0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi9sb2NrLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvbm9uX3RocmVhZF9zYWZlLmgiCi0jaW5jbHVkZSAiYmFzZS93aW4vc2NvcGVkX2NvbXB0ci5oIgotI2luY2x1ZGUgIm1lZGlhL3ZpZGVvL2NhcHR1cmUvdmlkZW9fY2FwdHVyZV9kZXZpY2UuaCIKLQotaW50ZXJmYWNlIElNRlNvdXJjZVJlYWRlcjsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgTUZSZWFkZXJDYWxsYmFjazsKLQotY2xhc3MgVmlkZW9DYXB0dXJlRGV2aWNlTUZXaW4KLSAgICA6IHB1YmxpYyBiYXNlOjpOb25UaHJlYWRTYWZlLAotICAgICAgcHVibGljIFZpZGVvQ2FwdHVyZURldmljZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBWaWRlb0NhcHR1cmVEZXZpY2VNRldpbihjb25zdCBOYW1lJiBkZXZpY2VfbmFtZSk7Ci0gIHZpcnR1YWwgflZpZGVvQ2FwdHVyZURldmljZU1GV2luKCk7Ci0KLSAgLy8gT3BlbnMgdGhlIGRldmljZSBkcml2ZXIgZm9yIHRoaXMgZGV2aWNlLgotICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdGhlIHN0YXRpYyBWaWRlb0NhcHR1cmVEZXZpY2U6OkNyZWF0ZSBmdW5jdGlvbi4KLSAgYm9vbCBJbml0KCk7Ci0KLSAgLy8gVmlkZW9DYXB0dXJlRGV2aWNlIGltcGxlbWVudGF0aW9uLgotICB2aXJ0dWFsIHZvaWQgQWxsb2NhdGUoaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9DYXB0dXJlRGV2aWNlOjpFdmVudEhhbmRsZXIqIG9ic2VydmVyKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0YXJ0KCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBTdG9wKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgdm9pZCBEZUFsbG9jYXRlKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgY29uc3QgTmFtZSYgZGV2aWNlX25hbWUoKSBPVkVSUklERTsKLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBjdXJyZW50IHBsYXRmb3JtIHN1cHBvcnRzIHRoZSBNZWRpYSBGb3VuZGF0aW9uIEFQSQotICAvLyBhbmQgdGhhdCB0aGUgRExMcyBhcmUgYXZhaWxhYmxlLiAgT24gVmlzdGEgdGhpcyBBUEkgaXMgYW4gb3B0aW9uYWwgZG93bmxvYWQKLSAgLy8gYnV0IHRoZSBBUEkgaXMgYWR2ZXJ0aXNlZCBhcyBhIHBhcnQgb2YgV2luZG93cyA3IGFuZCBvbndhcmRzLiAgSG93ZXZlciwKLSAgLy8gd2UndmUgc2VlbiB0aGF0IHRoZSByZXF1aXJlZCBETExzIGFyZSBub3QgYXZhaWxhYmxlIGluIHNvbWUgV2luNwotICAvLyBkaXN0cmlidXRpb25zIHN1Y2ggYXMgV2luZG93cyA3IE4gYW5kIFdpbmRvd3MgNyBLTi4KLSAgc3RhdGljIGJvb2wgUGxhdGZvcm1TdXBwb3J0ZWQoKTsKLQotICBzdGF0aWMgdm9pZCBHZXREZXZpY2VOYW1lcyhOYW1lcyogZGV2aWNlX25hbWVzKTsKLQotICAvLyBDYXB0dXJlZCBhIG5ldyB2aWRlbyBmcmFtZS4KLSAgdm9pZCBPbkluY29taW5nQ2FwdHVyZWRGcmFtZShjb25zdCB1aW50OCogZGF0YSwgaW50IGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpUaW1lJiB0aW1lX3N0YW1wKTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgT25FcnJvcihIUkVTVUxUIGhyKTsKLQotICBOYW1lIG5hbWVfOwotICBiYXNlOjp3aW46OlNjb3BlZENvbVB0cjxJTUZBY3RpdmF0ZT4gZGV2aWNlXzsKLSAgc2NvcGVkX3JlZnB0cjxNRlJlYWRlckNhbGxiYWNrPiBjYWxsYmFja187Ci0KLSAgYmFzZTo6TG9jayBsb2NrXzsgIC8vIFVzZWQgdG8gZ3VhcmQgdGhlIGJlbG93IHZhcmlhYmxlcy4KLSAgVmlkZW9DYXB0dXJlRGV2aWNlOjpFdmVudEhhbmRsZXIqIG9ic2VydmVyXzsKLSAgYmFzZTo6d2luOjpTY29wZWRDb21QdHI8SU1GU291cmNlUmVhZGVyPiByZWFkZXJfOwotICBib29sIGNhcHR1cmVfOwotCi0gIERJU0FMTE9XX0lNUExJQ0lUX0NPTlNUUlVDVE9SUyhWaWRlb0NhcHR1cmVEZXZpY2VNRldpbik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9WSURFT19DQVBUVVJFX1dJTl9WSURFT19DQVBUVVJFX0RFVklDRV9NRl9XSU5fSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL3dpbi92aWRlb19jYXB0dXJlX2RldmljZV93aW4uY2MgYi9zcmMvbWVkaWEvdmlkZW8vY2FwdHVyZS93aW4vdmlkZW9fY2FwdHVyZV9kZXZpY2Vfd2luLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzVjYTAwLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL3dpbi92aWRlb19jYXB0dXJlX2RldmljZV93aW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1OTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL3ZpZGVvL2NhcHR1cmUvd2luL3ZpZGVvX2NhcHR1cmVfZGV2aWNlX3dpbi5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGxpc3Q+Ci0KLSNpbmNsdWRlICJiYXNlL3N0cmluZ191dGlsLmgiCi0jaW5jbHVkZSAiYmFzZS9zeXNfc3RyaW5nX2NvbnZlcnNpb25zLmgiCi0jaW5jbHVkZSAiYmFzZS93aW4vc2NvcGVkX3ZhcmlhbnQuaCIKLSNpbmNsdWRlICJtZWRpYS92aWRlby9jYXB0dXJlL3dpbi92aWRlb19jYXB0dXJlX2RldmljZV9tZl93aW4uaCIKLQotdXNpbmcgYmFzZTo6d2luOjpTY29wZWRDb21QdHI7Ci11c2luZyBiYXNlOjp3aW46OlNjb3BlZFZhcmlhbnQ7Ci0KLW5hbWVzcGFjZSB7Ci0KLS8vIEZpbmRzIGFuZCBjcmVhdGVzIGEgRGlyZWN0U2hvdyBWaWRlbyBDYXB0dXJlIGZpbHRlciBtYXRjaGluZyB0aGUgZGV2aWNlX25hbWUuCi1IUkVTVUxUIEdldERldmljZUZpbHRlcihjb25zdCBtZWRpYTo6VmlkZW9DYXB0dXJlRGV2aWNlOjpOYW1lJiBkZXZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlRmlsdGVyKiogZmlsdGVyKSB7Ci0gIERDSEVDSyhmaWx0ZXIpOwotCi0gIFNjb3BlZENvbVB0cjxJQ3JlYXRlRGV2RW51bT4gZGV2X2VudW07Ci0gIEhSRVNVTFQgaHIgPSBkZXZfZW51bS5DcmVhdGVJbnN0YW5jZShDTFNJRF9TeXN0ZW1EZXZpY2VFbnVtLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xTQ1RYX0lOUFJPQyk7Ci0gIGlmIChGQUlMRUQoaHIpKQotICAgIHJldHVybiBocjsKLQotICBTY29wZWRDb21QdHI8SUVudW1Nb25pa2VyPiBlbnVtX21vbmlrZXI7Ci0gIGhyID0gZGV2X2VudW0tPkNyZWF0ZUNsYXNzRW51bWVyYXRvcihDTFNJRF9WaWRlb0lucHV0RGV2aWNlQ2F0ZWdvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtX21vbmlrZXIuUmVjZWl2ZSgpLCAwKTsKLSAgLy8gQ3JlYXRlQ2xhc3NFbnVtZXJhdG9yIHJldHVybnMgU19GQUxTRSBvbiBzb21lIFdpbmRvd3MgT1MKLSAgLy8gd2hlbiBubyBjYW1lcmEgZXhpc3QuIFRoZXJlZm9yZSB0aGUgRkFJTEVEIG1hY3JvIGNhbid0IGJlIHVzZWQuCi0gIGlmIChociAhPSBTX09LKQotICAgIHJldHVybiBOVUxMOwotCi0gIFNjb3BlZENvbVB0cjxJTW9uaWtlcj4gbW9uaWtlcjsKLSAgU2NvcGVkQ29tUHRyPElCYXNlRmlsdGVyPiBjYXB0dXJlX2ZpbHRlcjsKLSAgRFdPUkQgZmV0Y2hlZCA9IDA7Ci0gIHdoaWxlIChlbnVtX21vbmlrZXItPk5leHQoMSwgbW9uaWtlci5SZWNlaXZlKCksICZmZXRjaGVkKSA9PSBTX09LKSB7Ci0gICAgU2NvcGVkQ29tUHRyPElQcm9wZXJ0eUJhZz4gcHJvcF9iYWc7Ci0gICAgaHIgPSBtb25pa2VyLT5CaW5kVG9TdG9yYWdlKDAsIDAsIElJRF9JUHJvcGVydHlCYWcsIHByb3BfYmFnLlJlY2VpdmVWb2lkKCkpOwotICAgIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgICBtb25pa2VyLlJlbGVhc2UoKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8vIEZpbmQgdGhlIGRlc2NyaXB0aW9uIG9yIGZyaWVuZGx5IG5hbWUuCi0gICAgc3RhdGljIGNvbnN0IHdjaGFyX3QqIGtQcm9wZXJ0eU5hbWVzW10gPSB7Ci0gICAgICBMIkRldmljZVBhdGgiLCBMIkRlc2NyaXB0aW9uIiwgTCJGcmllbmRseU5hbWUiCi0gICAgfTsKLSAgICBTY29wZWRWYXJpYW50IG5hbWU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7Ci0gICAgICAgICBpIDwgYXJyYXlzaXplKGtQcm9wZXJ0eU5hbWVzKSAmJiBuYW1lLnR5cGUoKSAhPSBWVF9CU1RSOyArK2kpIHsKLSAgICAgIHByb3BfYmFnLT5SZWFkKGtQcm9wZXJ0eU5hbWVzW2ldLCBuYW1lLlJlY2VpdmUoKSwgMCk7Ci0gICAgfQotICAgIGlmIChuYW1lLnR5cGUoKSA9PSBWVF9CU1RSKSB7Ci0gICAgICBzdGQ6OnN0cmluZyBkZXZpY2VfcGF0aChiYXNlOjpTeXNXaWRlVG9VVEY4KFZfQlNUUigmbmFtZSkpKTsKLSAgICAgIGlmIChkZXZpY2VfcGF0aC5jb21wYXJlKGRldmljZV9uYW1lLnVuaXF1ZV9pZCkgPT0gMCkgewotICAgICAgICAvLyBXZSBoYXZlIGZvdW5kIHRoZSByZXF1ZXN0ZWQgZGV2aWNlCi0gICAgICAgIGhyID0gbW9uaWtlci0+QmluZFRvT2JqZWN0KDAsIDAsIElJRF9JQmFzZUZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZV9maWx0ZXIuUmVjZWl2ZVZvaWQoKSk7Ci0gICAgICAgIERWUExPR19JRigyLCBGQUlMRUQoaHIpKSA8PCAiRmFpbGVkIHRvIGJpbmQgY2FtZXJhIGZpbHRlci4iOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgbW9uaWtlci5SZWxlYXNlKCk7Ci0gIH0KLQotICAqZmlsdGVyID0gY2FwdHVyZV9maWx0ZXIuRGV0YWNoKCk7Ci0gIGlmICghKmZpbHRlciAmJiBTVUNDRUVERUQoaHIpKQotICAgIGhyID0gSFJFU1VMVF9GUk9NX1dJTjMyKEVSUk9SX05PVF9GT1VORCk7Ci0KLSAgcmV0dXJuIGhyOwotfQotCi0vLyBDaGVjayBpZiBhIFBpbiBtYXRjaGVzIGEgY2F0ZWdvcnkuCi1ib29sIFBpbk1hdGNoZXNDYXRlZ29yeShJUGluKiBwaW4sIFJFRkdVSUQgY2F0ZWdvcnkpIHsKLSAgRENIRUNLKHBpbik7Ci0gIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgU2NvcGVkQ29tUHRyPElLc1Byb3BlcnR5U2V0PiBrc19wcm9wZXJ0eTsKLSAgSFJFU1VMVCBociA9IGtzX3Byb3BlcnR5LlF1ZXJ5RnJvbShwaW4pOwotICBpZiAoU1VDQ0VFREVEKGhyKSkgewotICAgIEdVSUQgcGluX2NhdGVnb3J5OwotICAgIERXT1JEIHJldHVybl92YWx1ZTsKLSAgICBociA9IGtzX3Byb3BlcnR5LT5HZXQoQU1QUk9QU0VUSURfUGluLCBBTVBST1BFUlRZX1BJTl9DQVRFR09SWSwgTlVMTCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpbl9jYXRlZ29yeSwgc2l6ZW9mKHBpbl9jYXRlZ29yeSksICZyZXR1cm5fdmFsdWUpOwotICAgIGlmIChTVUNDRUVERUQoaHIpICYmIChyZXR1cm5fdmFsdWUgPT0gc2l6ZW9mKHBpbl9jYXRlZ29yeSkpKSB7Ci0gICAgICBmb3VuZCA9IChwaW5fY2F0ZWdvcnkgPT0gY2F0ZWdvcnkpOwotICAgIH0KLSAgfQotICByZXR1cm4gZm91bmQ7Ci19Ci0KLS8vIEZpbmRzIGEgSVBpbiBvbiBhIElCYXNlRmlsdGVyIGdpdmVuIHRoZSBkaXJlY3Rpb24gYW4gY2F0ZWdvcnkuCi1IUkVTVUxUIEdldFBpbihJQmFzZUZpbHRlciogZmlsdGVyLCBQSU5fRElSRUNUSU9OIHBpbl9kaXIsIFJFRkdVSUQgY2F0ZWdvcnksCi0gICAgICAgICAgICAgICBJUGluKiogcGluKSB7Ci0gIERDSEVDSyhwaW4pOwotICBTY29wZWRDb21QdHI8SUVudW1QaW5zPiBwaW5fZW11bTsKLSAgSFJFU1VMVCBociA9IGZpbHRlci0+RW51bVBpbnMocGluX2VtdW0uUmVjZWl2ZSgpKTsKLSAgaWYgKHBpbl9lbXVtID09IE5VTEwpCi0gICAgcmV0dXJuIGhyOwotCi0gIC8vIEdldCBmaXJzdCB1bmNvbm5lY3RlZCBwaW4uCi0gIGhyID0gcGluX2VtdW0tPlJlc2V0KCk7ICAvLyBzZXQgdG8gZmlyc3QgcGluCi0gIHdoaWxlICgoaHIgPSBwaW5fZW11bS0+TmV4dCgxLCBwaW4sIE5VTEwpKSA9PSBTX09LKSB7Ci0gICAgUElOX0RJUkVDVElPTiB0aGlzX3Bpbl9kaXIgPSBzdGF0aWNfY2FzdDxQSU5fRElSRUNUSU9OPigtMSk7Ci0gICAgaHIgPSAoKnBpbiktPlF1ZXJ5RGlyZWN0aW9uKCZ0aGlzX3Bpbl9kaXIpOwotICAgIGlmIChwaW5fZGlyID09IHRoaXNfcGluX2RpcikgewotICAgICAgaWYgKGNhdGVnb3J5ID09IEdVSURfTlVMTCB8fCBQaW5NYXRjaGVzQ2F0ZWdvcnkoKnBpbiwgY2F0ZWdvcnkpKQotICAgICAgICByZXR1cm4gU19PSzsKLSAgICB9Ci0gICAgKCpwaW4pLT5SZWxlYXNlKCk7Ci0gIH0KLQotICByZXR1cm4gRV9GQUlMOwotfQotCi0vLyBSZWxlYXNlIHRoZSBmb3JtYXQgYmxvY2sgZm9yIGEgbWVkaWEgdHlwZS4KLS8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9kZDM3NTQzMihWUy44NSkuYXNweAotdm9pZCBGcmVlTWVkaWFUeXBlKEFNX01FRElBX1RZUEUqIG10KSB7Ci0gIGlmIChtdC0+Y2JGb3JtYXQgIT0gMCkgewotICAgIENvVGFza01lbUZyZWUobXQtPnBiRm9ybWF0KTsKLSAgICBtdC0+Y2JGb3JtYXQgPSAwOwotICAgIG10LT5wYkZvcm1hdCA9IE5VTEw7Ci0gIH0KLSAgaWYgKG10LT5wVW5rICE9IE5VTEwpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgLy8gcFVuayBzaG91bGQgbm90IGJlIHVzZWQuCi0gICAgbXQtPnBVbmstPlJlbGVhc2UoKTsKLSAgICBtdC0+cFVuayA9IE5VTEw7Ci0gIH0KLX0KLQotLy8gRGVsZXRlIGEgbWVkaWEgdHlwZSBzdHJ1Y3R1cmUgdGhhdCB3YXMgYWxsb2NhdGVkIG9uIHRoZSBoZWFwLgotLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2RkMzc1NDMyKFZTLjg1KS5hc3B4Ci12b2lkIERlbGV0ZU1lZGlhVHlwZShBTV9NRURJQV9UWVBFKiBtdCkgewotICBpZiAobXQgIT0gTlVMTCkgewotICAgIEZyZWVNZWRpYVR5cGUobXQpOwotICAgIENvVGFza01lbUZyZWUobXQpOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBzdGF0aWMKLXZvaWQgVmlkZW9DYXB0dXJlRGV2aWNlOjpHZXREZXZpY2VOYW1lcyhOYW1lcyogZGV2aWNlX25hbWVzKSB7Ci0gIGlmIChWaWRlb0NhcHR1cmVEZXZpY2VNRldpbjo6UGxhdGZvcm1TdXBwb3J0ZWQoKSkgewotICAgIFZpZGVvQ2FwdHVyZURldmljZU1GV2luOjpHZXREZXZpY2VOYW1lcyhkZXZpY2VfbmFtZXMpOwotICB9IGVsc2UgewotICAgIFZpZGVvQ2FwdHVyZURldmljZVdpbjo6R2V0RGV2aWNlTmFtZXMoZGV2aWNlX25hbWVzKTsKLSAgfQotfQotCi0vLyBzdGF0aWMKLVZpZGVvQ2FwdHVyZURldmljZSogVmlkZW9DYXB0dXJlRGV2aWNlOjpDcmVhdGUoY29uc3QgTmFtZSYgZGV2aWNlX25hbWUpIHsKLSAgVmlkZW9DYXB0dXJlRGV2aWNlKiByZXQgPSBOVUxMOwotICBpZiAoVmlkZW9DYXB0dXJlRGV2aWNlTUZXaW46OlBsYXRmb3JtU3VwcG9ydGVkKCkpIHsKLSAgICBzY29wZWRfcHRyPFZpZGVvQ2FwdHVyZURldmljZU1GV2luPiBkZXZpY2UoCi0gICAgICAgIG5ldyBWaWRlb0NhcHR1cmVEZXZpY2VNRldpbihkZXZpY2VfbmFtZSkpOwotICAgIGlmIChkZXZpY2UtPkluaXQoKSkKLSAgICAgIHJldCA9IGRldmljZS5yZWxlYXNlKCk7Ci0gIH0gZWxzZSB7Ci0gICAgc2NvcGVkX3B0cjxWaWRlb0NhcHR1cmVEZXZpY2VXaW4+IGRldmljZSgKLSAgICAgICAgbmV3IFZpZGVvQ2FwdHVyZURldmljZVdpbihkZXZpY2VfbmFtZSkpOwotICAgIGlmIChkZXZpY2UtPkluaXQoKSkKLSAgICAgIHJldCA9IGRldmljZS5yZWxlYXNlKCk7Ci0gIH0KLQotICByZXR1cm4gcmV0OwotfQotCi0vLyBzdGF0aWMKLXZvaWQgVmlkZW9DYXB0dXJlRGV2aWNlV2luOjpHZXREZXZpY2VOYW1lcyhOYW1lcyogZGV2aWNlX25hbWVzKSB7Ci0gIERDSEVDSyhkZXZpY2VfbmFtZXMpOwotCi0gIFNjb3BlZENvbVB0cjxJQ3JlYXRlRGV2RW51bT4gZGV2X2VudW07Ci0gIEhSRVNVTFQgaHIgPSBkZXZfZW51bS5DcmVhdGVJbnN0YW5jZShDTFNJRF9TeXN0ZW1EZXZpY2VFbnVtLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xTQ1RYX0lOUFJPQyk7Ci0gIGlmIChGQUlMRUQoaHIpKQotICAgIHJldHVybjsKLQotICBTY29wZWRDb21QdHI8SUVudW1Nb25pa2VyPiBlbnVtX21vbmlrZXI7Ci0gIGhyID0gZGV2X2VudW0tPkNyZWF0ZUNsYXNzRW51bWVyYXRvcihDTFNJRF9WaWRlb0lucHV0RGV2aWNlQ2F0ZWdvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtX21vbmlrZXIuUmVjZWl2ZSgpLCAwKTsKLSAgLy8gQ3JlYXRlQ2xhc3NFbnVtZXJhdG9yIHJldHVybnMgU19GQUxTRSBvbiBzb21lIFdpbmRvd3MgT1MKLSAgLy8gd2hlbiBubyBjYW1lcmEgZXhpc3QuIFRoZXJlZm9yZSB0aGUgRkFJTEVEIG1hY3JvIGNhbid0IGJlIHVzZWQuCi0gIGlmIChociAhPSBTX09LKQotICAgIHJldHVybjsKLQotICBkZXZpY2VfbmFtZXMtPmNsZWFyKCk7Ci0KLSAgLy8gTmFtZSBvZiBhIGZha2UgRGlyZWN0U2hvdyBmaWx0ZXIgdGhhdCBleGlzdCBvbiBjb21wdXRlcnMgd2l0aAotICAvLyBHVGFsayBpbnN0YWxsZWQuCi0gIHN0YXRpYyBjb25zdCBjaGFyIGtHb29nbGVDYW1lcmFBZGFwdGVyW10gPSAiZ29vZ2xlIGNhbWVyYSBhZGFwdGVyIjsKLQotICAvLyBFbnVtZXJhdGUgYWxsIHZpZGVvIGNhcHR1cmUgZGV2aWNlcy4KLSAgU2NvcGVkQ29tUHRyPElNb25pa2VyPiBtb25pa2VyOwotICBpbnQgaW5kZXggPSAwOwotICB3aGlsZSAoZW51bV9tb25pa2VyLT5OZXh0KDEsIG1vbmlrZXIuUmVjZWl2ZSgpLCBOVUxMKSA9PSBTX09LKSB7Ci0gICAgTmFtZSBkZXZpY2U7Ci0gICAgU2NvcGVkQ29tUHRyPElQcm9wZXJ0eUJhZz4gcHJvcF9iYWc7Ci0gICAgaHIgPSBtb25pa2VyLT5CaW5kVG9TdG9yYWdlKDAsIDAsIElJRF9JUHJvcGVydHlCYWcsIHByb3BfYmFnLlJlY2VpdmVWb2lkKCkpOwotICAgIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgICBtb25pa2VyLlJlbGVhc2UoKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8vIEZpbmQgdGhlIGRlc2NyaXB0aW9uIG9yIGZyaWVuZGx5IG5hbWUuCi0gICAgU2NvcGVkVmFyaWFudCBuYW1lOwotICAgIGhyID0gcHJvcF9iYWctPlJlYWQoTCJEZXNjcmlwdGlvbiIsIG5hbWUuUmVjZWl2ZSgpLCAwKTsKLSAgICBpZiAoRkFJTEVEKGhyKSkKLSAgICAgIGhyID0gcHJvcF9iYWctPlJlYWQoTCJGcmllbmRseU5hbWUiLCBuYW1lLlJlY2VpdmUoKSwgMCk7Ci0KLSAgICBpZiAoU1VDQ0VFREVEKGhyKSAmJiBuYW1lLnR5cGUoKSA9PSBWVF9CU1RSKSB7Ci0gICAgICAvLyBJZ25vcmUgYWxsIFZGVyBkcml2ZXJzIGFuZCB0aGUgc3BlY2lhbCBHb29nbGUgQ2FtZXJhIEFkYXB0ZXIuCi0gICAgICAvLyBHb29nbGUgQ2FtZXJhIEFkYXB0ZXIgaXMgbm90IGEgcmVhbCBEaXJlY3RTaG93IGNhbWVyYSBkZXZpY2UuCi0gICAgICAvLyBWRlcgaXMgdmVyeSBvbGQgVmlkZW8gZm9yIFdpbmRvd3MgZHJpdmVycyB0aGF0IGNhbiBub3QgYmUgdXNlZC4KLSAgICAgIGNvbnN0IHdjaGFyX3QqIHN0cl9wdHIgPSBWX0JTVFIoJm5hbWUpOwotICAgICAgY29uc3QgaW50IG5hbWVfbGVuZ3RoID0gYXJyYXlzaXplKGtHb29nbGVDYW1lcmFBZGFwdGVyKSAtIDE7Ci0KLSAgICAgIGlmICgod2Nzc3RyKHN0cl9wdHIsIEwiKFZGVykiKSA9PSBOVUxMKSAmJgotICAgICAgICAgIGxzdHJsZW5XKHN0cl9wdHIpIDwgbmFtZV9sZW5ndGggfHwKLSAgICAgICAgICAoIShMb3dlckNhc2VFcXVhbHNBU0NJSShzdHJfcHRyLCBzdHJfcHRyICsgbmFtZV9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0dvb2dsZUNhbWVyYUFkYXB0ZXIpKSkpIHsKLSAgICAgICAgZGV2aWNlLmRldmljZV9uYW1lID0gYmFzZTo6U3lzV2lkZVRvVVRGOChzdHJfcHRyKTsKLSAgICAgICAgbmFtZS5SZXNldCgpOwotICAgICAgICBociA9IHByb3BfYmFnLT5SZWFkKEwiRGV2aWNlUGF0aCIsIG5hbWUuUmVjZWl2ZSgpLCAwKTsKLSAgICAgICAgaWYgKEZBSUxFRChocikpIHsKLSAgICAgICAgICBkZXZpY2UudW5pcXVlX2lkID0gZGV2aWNlLmRldmljZV9uYW1lOwotICAgICAgICB9IGVsc2UgaWYgKG5hbWUudHlwZSgpID09IFZUX0JTVFIpIHsKLSAgICAgICAgICBkZXZpY2UudW5pcXVlX2lkID0gYmFzZTo6U3lzV2lkZVRvVVRGOChWX0JTVFIoJm5hbWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGRldmljZV9uYW1lcy0+cHVzaF9iYWNrKGRldmljZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIG1vbmlrZXIuUmVsZWFzZSgpOwotICB9Ci19Ci0KLVZpZGVvQ2FwdHVyZURldmljZVdpbjo6VmlkZW9DYXB0dXJlRGV2aWNlV2luKGNvbnN0IE5hbWUmIGRldmljZV9uYW1lKQotICAgIDogZGV2aWNlX25hbWVfKGRldmljZV9uYW1lKSwKLSAgICAgIHN0YXRlXyhrSWRsZSksCi0gICAgICBvYnNlcnZlcl8oTlVMTCkgewotICBEZXRhY2hGcm9tVGhyZWFkKCk7Ci19Ci0KLVZpZGVvQ2FwdHVyZURldmljZVdpbjo6flZpZGVvQ2FwdHVyZURldmljZVdpbigpIHsKLSAgRENIRUNLKENhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIGlmIChtZWRpYV9jb250cm9sXykKLSAgICBtZWRpYV9jb250cm9sXy0+U3RvcCgpOwotCi0gIGlmIChncmFwaF9idWlsZGVyXykgewotICAgIGlmIChzaW5rX2ZpbHRlcl8pIHsKLSAgICAgIGdyYXBoX2J1aWxkZXJfLT5SZW1vdmVGaWx0ZXIoc2lua19maWx0ZXJfKTsKLSAgICAgIHNpbmtfZmlsdGVyXyA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKGNhcHR1cmVfZmlsdGVyXykKLSAgICAgIGdyYXBoX2J1aWxkZXJfLT5SZW1vdmVGaWx0ZXIoY2FwdHVyZV9maWx0ZXJfKTsKLQotICAgIGlmIChtanBnX2ZpbHRlcl8pCi0gICAgICBncmFwaF9idWlsZGVyXy0+UmVtb3ZlRmlsdGVyKG1qcGdfZmlsdGVyXyk7Ci0gIH0KLX0KLQotYm9vbCBWaWRlb0NhcHR1cmVEZXZpY2VXaW46OkluaXQoKSB7Ci0gIERDSEVDSyhDYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBIUkVTVUxUIGhyID0gR2V0RGV2aWNlRmlsdGVyKGRldmljZV9uYW1lXywgY2FwdHVyZV9maWx0ZXJfLlJlY2VpdmUoKSk7Ci0gIGlmICghY2FwdHVyZV9maWx0ZXJfKSB7Ci0gICAgRFZMT0coMikgPDwgIkZhaWxlZCB0byBjcmVhdGUgY2FwdHVyZSBmaWx0ZXIuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBociA9IEdldFBpbihjYXB0dXJlX2ZpbHRlcl8sIFBJTkRJUl9PVVRQVVQsIFBJTl9DQVRFR09SWV9DQVBUVVJFLAotICAgICAgICAgICAgICBvdXRwdXRfY2FwdHVyZV9waW5fLlJlY2VpdmUoKSk7Ci0gIGlmICghb3V0cHV0X2NhcHR1cmVfcGluXykgewotICAgIERWTE9HKDIpIDw8ICJGYWlsZWQgdG8gZ2V0IGNhcHR1cmUgb3V0cHV0IHBpbiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gQ3JlYXRlIHRoZSBzaW5rIGZpbHRlciB1c2VkIGZvciByZWNlaXZpbmcgQ2FwdHVyZWQgZnJhbWVzLgotICBzaW5rX2ZpbHRlcl8gPSBuZXcgU2lua0ZpbHRlcih0aGlzKTsKLSAgaWYgKHNpbmtfZmlsdGVyXyA9PSBOVUxMKSB7Ci0gICAgRFZMT0coMikgPDwgIkZhaWxlZCB0byBjcmVhdGUgc2VuZCBmaWx0ZXIiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlucHV0X3NpbmtfcGluXyA9IHNpbmtfZmlsdGVyXy0+R2V0UGluKDApOwotCi0gIGhyID0gZ3JhcGhfYnVpbGRlcl8uQ3JlYXRlSW5zdGFuY2UoQ0xTSURfRmlsdGVyR3JhcGgsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xTQ1RYX0lOUFJPQ19TRVJWRVIpOwotICBpZiAoRkFJTEVEKGhyKSkgewotICAgIERWTE9HKDIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIGdyYXBoIGJ1aWxkZXIuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBociA9IGdyYXBoX2J1aWxkZXJfLlF1ZXJ5SW50ZXJmYWNlKG1lZGlhX2NvbnRyb2xfLlJlY2VpdmUoKSk7Ci0gIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgRFZMT0coMikgPDwgIkZhaWxlZCB0byBjcmVhdGUgbWVkaWEgY29udHJvbCBidWlsZGVyLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaHIgPSBncmFwaF9idWlsZGVyXy0+QWRkRmlsdGVyKGNhcHR1cmVfZmlsdGVyXywgTlVMTCk7Ci0gIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgRFZMT0coMikgPDwgIkZhaWxlZCB0byBhZGQgdGhlIGNhcHR1cmUgZGV2aWNlIHRvIHRoZSBncmFwaC4iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGhyID0gZ3JhcGhfYnVpbGRlcl8tPkFkZEZpbHRlcihzaW5rX2ZpbHRlcl8sIE5VTEwpOwotICBpZiAoRkFJTEVEKGhyKSkgewotICAgIERWTE9HKDIpPDwgIkZhaWxlZCB0byBhZGQgdGhlIHNlbmQgZmlsdGVyIHRvIHRoZSBncmFwaC4iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiBDcmVhdGVDYXBhYmlsaXR5TWFwKCk7Ci19Ci0KLXZvaWQgVmlkZW9DYXB0dXJlRGV2aWNlV2luOjpBbGxvY2F0ZSgKLSAgICBpbnQgd2lkdGgsCi0gICAgaW50IGhlaWdodCwKLSAgICBpbnQgZnJhbWVfcmF0ZSwKLSAgICBWaWRlb0NhcHR1cmVEZXZpY2U6OkV2ZW50SGFuZGxlciogb2JzZXJ2ZXIpIHsKLSAgRENIRUNLKENhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIGlmIChzdGF0ZV8gIT0ga0lkbGUpCi0gICAgcmV0dXJuOwotCi0gIG9ic2VydmVyXyA9IG9ic2VydmVyOwotCi0gIC8vIEdldCB0aGUgY2FtZXJhIGNhcGFiaWxpdHkgdGhhdCBiZXN0IG1hdGNoIHRoZSByZXF1ZXN0ZWQgcmVzb2x1dGlvbi4KLSAgY29uc3QgVmlkZW9DYXB0dXJlQ2FwYWJpbGl0eVdpbiYgZm91bmRfY2FwYWJpbGl0eSA9Ci0gICAgICBjYXBhYmlsaXRpZXNfLkdldEJlc3RNYXRjaGVkQ2FwYWJpbGl0eSh3aWR0aCwgaGVpZ2h0LCBmcmFtZV9yYXRlKTsKLSAgVmlkZW9DYXB0dXJlQ2FwYWJpbGl0eSBjYXBhYmlsaXR5ID0gZm91bmRfY2FwYWJpbGl0eTsKLQotICAvLyBSZWR1Y2UgdGhlIGZyYW1lIHJhdGUgaWYgdGhlIHJlcXVlc3RlZCBmcmFtZSByYXRlIGlzIGxvd2VyCi0gIC8vIHRoYW4gdGhlIGNhcGFiaWxpdHkuCi0gIGlmIChjYXBhYmlsaXR5LmZyYW1lX3JhdGUgPiBmcmFtZV9yYXRlKQotICAgIGNhcGFiaWxpdHkuZnJhbWVfcmF0ZSA9IGZyYW1lX3JhdGU7Ci0KLSAgQU1fTUVESUFfVFlQRSogcG10ID0gTlVMTDsKLSAgVklERU9fU1RSRUFNX0NPTkZJR19DQVBTIGNhcHM7Ci0KLSAgU2NvcGVkQ29tUHRyPElBTVN0cmVhbUNvbmZpZz4gc3RyZWFtX2NvbmZpZzsKLSAgSFJFU1VMVCBociA9IG91dHB1dF9jYXB0dXJlX3Bpbl8uUXVlcnlJbnRlcmZhY2Uoc3RyZWFtX2NvbmZpZy5SZWNlaXZlKCkpOwotICBpZiAoRkFJTEVEKGhyKSkgewotICAgIFNldEVycm9yU3RhdGUoIkNhbid0IGdldCB0aGUgQ2FwdHVyZSBmb3JtYXQgc2V0dGluZ3MiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBHZXQgdGhlIHdpbmRvd3MgY2FwYWJpbGl0eSBmcm9tIHRoZSBjYXB0dXJlIGRldmljZS4KLSAgaHIgPSBzdHJlYW1fY29uZmlnLT5HZXRTdHJlYW1DYXBzKGZvdW5kX2NhcGFiaWxpdHkuc3RyZWFtX2luZGV4LCAmcG10LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxCWVRFKj4oJmNhcHMpKTsKLSAgaWYgKFNVQ0NFRURFRChocikpIHsKLSAgICBpZiAocG10LT5mb3JtYXR0eXBlID09IEZPUk1BVF9WaWRlb0luZm8pIHsKLSAgICAgIFZJREVPSU5GT0hFQURFUiogaCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VklERU9JTkZPSEVBREVSKj4ocG10LT5wYkZvcm1hdCk7Ci0gICAgICBpZiAoY2FwYWJpbGl0eS5mcmFtZV9yYXRlID4gMCkKLSAgICAgICAgaC0+QXZnVGltZVBlckZyYW1lID0ga1NlY29uZHNUb1JlZmVyZW5jZVRpbWUgLyBjYXBhYmlsaXR5LmZyYW1lX3JhdGU7Ci0gICAgfQotICAgIC8vIFNldCB0aGUgc2luayBmaWx0ZXIgdG8gcmVxdWVzdCB0aGlzIGNhcGFiaWxpdHkuCi0gICAgc2lua19maWx0ZXJfLT5TZXRSZXF1ZXN0ZWRNZWRpYUNhcGFiaWxpdHkoY2FwYWJpbGl0eSk7Ci0gICAgLy8gT3JkZXIgdGhlIGNhcHR1cmUgZGV2aWNlIHRvIHVzZSB0aGlzIGNhcGFiaWxpdHkuCi0gICAgaHIgPSBzdHJlYW1fY29uZmlnLT5TZXRGb3JtYXQocG10KTsKLSAgfQotCi0gIGlmIChGQUlMRUQoaHIpKQotICAgIFNldEVycm9yU3RhdGUoIkZhaWxlZCB0byBzZXQgY2FwdHVyZSBkZXZpY2Ugb3V0cHV0IGZvcm1hdCIpOwotCi0gIGlmIChjYXBhYmlsaXR5LmNvbG9yID09IFZpZGVvQ2FwdHVyZUNhcGFiaWxpdHk6OmtNSlBFRyAmJgotICAgICAgIW1qcGdfZmlsdGVyXy5nZXQoKSkgewotICAgIC8vIENyZWF0ZSBNSlBHIGZpbHRlciBpZiB3ZSBuZWVkIGl0LgotICAgIGhyID0gbWpwZ19maWx0ZXJfLkNyZWF0ZUluc3RhbmNlKENMU0lEX01qcGVnRGVjLCBOVUxMLCBDTFNDVFhfSU5QUk9DKTsKLQotICAgIGlmIChTVUNDRUVERUQoaHIpKSB7Ci0gICAgICBHZXRQaW4obWpwZ19maWx0ZXJfLCBQSU5ESVJfSU5QVVQsIEdVSURfTlVMTCwgaW5wdXRfbWpwZ19waW5fLlJlY2VpdmUoKSk7Ci0gICAgICBHZXRQaW4obWpwZ19maWx0ZXJfLCBQSU5ESVJfT1VUUFVULCBHVUlEX05VTEwsCi0gICAgICAgICAgICAgb3V0cHV0X21qcGdfcGluXy5SZWNlaXZlKCkpOwotICAgICAgaHIgPSBncmFwaF9idWlsZGVyXy0+QWRkRmlsdGVyKG1qcGdfZmlsdGVyXywgTlVMTCk7Ci0gICAgfQotCi0gICAgaWYgKEZBSUxFRChocikpIHsKLSAgICAgIG1qcGdfZmlsdGVyXy5SZWxlYXNlKCk7Ci0gICAgICBpbnB1dF9tanBnX3Bpbl8uUmVsZWFzZSgpOwotICAgICAgb3V0cHV0X21qcGdfcGluXy5SZWxlYXNlKCk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGNhcGFiaWxpdHkuY29sb3IgPT0gVmlkZW9DYXB0dXJlQ2FwYWJpbGl0eTo6a01KUEVHICYmCi0gICAgICBtanBnX2ZpbHRlcl8uZ2V0KCkpIHsKLSAgICAvLyBDb25uZWN0IHRoZSBjYW1lcmEgdG8gdGhlIE1KUEVHIGRlY29kZXIuCi0gICAgaHIgPSBncmFwaF9idWlsZGVyXy0+Q29ubmVjdERpcmVjdChvdXRwdXRfY2FwdHVyZV9waW5fLCBpbnB1dF9tanBnX3Bpbl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICAvLyBDb25uZWN0IHRoZSBNSlBFRyBmaWx0ZXIgdG8gdGhlIENhcHR1cmUgZmlsdGVyLgotICAgIGhyICs9IGdyYXBoX2J1aWxkZXJfLT5Db25uZWN0RGlyZWN0KG91dHB1dF9tanBnX3Bpbl8sIGlucHV0X3NpbmtfcGluXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgfSBlbHNlIHsKLSAgICBociA9IGdyYXBoX2J1aWxkZXJfLT5Db25uZWN0RGlyZWN0KG91dHB1dF9jYXB0dXJlX3Bpbl8sIGlucHV0X3NpbmtfcGluXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICB9Ci0KLSAgaWYgKEZBSUxFRChocikpIHsKLSAgICBTZXRFcnJvclN0YXRlKCJGYWlsZWQgdG8gY29ubmVjdCB0aGUgQ2FwdHVyZSBncmFwaC4iKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBociA9IG1lZGlhX2NvbnRyb2xfLT5QYXVzZSgpOwotICBpZiAoRkFJTEVEKGhyKSkgewotICAgIFNldEVycm9yU3RhdGUoIkZhaWxlZCB0byBQYXVzZSB0aGUgQ2FwdHVyZSBkZXZpY2UuICIKLSAgICAgICAgICAgICAgICAgICJJcyBpdCBhbHJlYWR5IG9jY3VwaWVkPyIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIEdldCB0aGUgY2FwYWJpbGl0eSBiYWNrIGZyb20gdGhlIHNpbmsgZmlsdGVyIGFmdGVyIHRoZSBmaWx0ZXIgaGF2ZSBiZWVuCi0gIC8vIGNvbm5lY3RlZC4KLSAgY29uc3QgVmlkZW9DYXB0dXJlQ2FwYWJpbGl0eSYgdXNlZF9jYXBhYmlsaXR5Ci0gICAgICA9IHNpbmtfZmlsdGVyXy0+UmVzdWx0aW5nQ2FwYWJpbGl0eSgpOwotICBvYnNlcnZlcl8tPk9uRnJhbWVJbmZvKHVzZWRfY2FwYWJpbGl0eSk7Ci0KLSAgc3RhdGVfID0ga0FsbG9jYXRlZDsKLX0KLQotdm9pZCBWaWRlb0NhcHR1cmVEZXZpY2VXaW46OlN0YXJ0KCkgewotICBEQ0hFQ0soQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLSAgaWYgKHN0YXRlXyAhPSBrQWxsb2NhdGVkKQotICAgIHJldHVybjsKLQotICBIUkVTVUxUIGhyID0gbWVkaWFfY29udHJvbF8tPlJ1bigpOwotICBpZiAoRkFJTEVEKGhyKSkgewotICAgIFNldEVycm9yU3RhdGUoIkZhaWxlZCB0byBzdGFydCB0aGUgQ2FwdHVyZSBkZXZpY2UuIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RhdGVfID0ga0NhcHR1cmluZzsKLX0KLQotdm9pZCBWaWRlb0NhcHR1cmVEZXZpY2VXaW46OlN0b3AoKSB7Ci0gIERDSEVDSyhDYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBpZiAoc3RhdGVfICE9IGtDYXB0dXJpbmcpCi0gICAgcmV0dXJuOwotCi0gIEhSRVNVTFQgaHIgPSBtZWRpYV9jb250cm9sXy0+U3RvcCgpOwotICBpZiAoRkFJTEVEKGhyKSkgewotICAgIFNldEVycm9yU3RhdGUoIkZhaWxlZCB0byBzdG9wIHRoZSBjYXB0dXJlIGdyYXBoLiIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0YXRlXyA9IGtBbGxvY2F0ZWQ7Ci19Ci0KLXZvaWQgVmlkZW9DYXB0dXJlRGV2aWNlV2luOjpEZUFsbG9jYXRlKCkgewotICBEQ0hFQ0soQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLSAgaWYgKHN0YXRlXyA9PSBrSWRsZSkKLSAgICByZXR1cm47Ci0KLSAgSFJFU1VMVCBociA9IG1lZGlhX2NvbnRyb2xfLT5TdG9wKCk7Ci0gIGdyYXBoX2J1aWxkZXJfLT5EaXNjb25uZWN0KG91dHB1dF9jYXB0dXJlX3Bpbl8pOwotICBncmFwaF9idWlsZGVyXy0+RGlzY29ubmVjdChpbnB1dF9zaW5rX3Bpbl8pOwotCi0gIC8vIElmIHRoZSBfbWpwZyBmaWx0ZXIgZXhpc3QgZGlzY29ubmVjdCBpdCBldmVuIGlmIGl0IGhhcyBub3QgYmVlbiB1c2VkLgotICBpZiAobWpwZ19maWx0ZXJfKSB7Ci0gICAgZ3JhcGhfYnVpbGRlcl8tPkRpc2Nvbm5lY3QoaW5wdXRfbWpwZ19waW5fKTsKLSAgICBncmFwaF9idWlsZGVyXy0+RGlzY29ubmVjdChvdXRwdXRfbWpwZ19waW5fKTsKLSAgfQotCi0gIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgU2V0RXJyb3JTdGF0ZSgiRmFpbGVkIHRvIFN0b3AgdGhlIENhcHR1cmUgZGV2aWNlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RhdGVfID0ga0lkbGU7Ci19Ci0KLWNvbnN0IFZpZGVvQ2FwdHVyZURldmljZTo6TmFtZSYgVmlkZW9DYXB0dXJlRGV2aWNlV2luOjpkZXZpY2VfbmFtZSgpIHsKLSAgRENIRUNLKENhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIHJldHVybiBkZXZpY2VfbmFtZV87Ci19Ci0KLS8vIEltcGxlbWVudHMgU2lua0ZpbHRlck9ic2VydmVyOjpTaW5rRmlsdGVyT2JzZXJ2ZXIuCi12b2lkIFZpZGVvQ2FwdHVyZURldmljZVdpbjo6RnJhbWVSZWNlaXZlZChjb25zdCB1aW50OCogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCkgewotICBvYnNlcnZlcl8tPk9uSW5jb21pbmdDYXB0dXJlZEZyYW1lKGJ1ZmZlciwgbGVuZ3RoLCBiYXNlOjpUaW1lOjpOb3coKSk7Ci19Ci0KLWJvb2wgVmlkZW9DYXB0dXJlRGV2aWNlV2luOjpDcmVhdGVDYXBhYmlsaXR5TWFwKCkgewotICBEQ0hFQ0soQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLSAgU2NvcGVkQ29tUHRyPElBTVN0cmVhbUNvbmZpZz4gc3RyZWFtX2NvbmZpZzsKLSAgSFJFU1VMVCBociA9IG91dHB1dF9jYXB0dXJlX3Bpbl8uUXVlcnlJbnRlcmZhY2Uoc3RyZWFtX2NvbmZpZy5SZWNlaXZlKCkpOwotICBpZiAoRkFJTEVEKGhyKSkgewotICAgIERWTE9HKDIpIDw8ICJGYWlsZWQgdG8gZ2V0IElBTVN0cmVhbUNvbmZpZyBpbnRlcmZhY2UgZnJvbSAiCi0gICAgICAgICAgICAgICAgImNhcHR1cmUgZGV2aWNlIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBHZXQgaW50ZXJmYWNlIHVzZWQgZm9yIGdldHRpbmcgdGhlIGZyYW1lIHJhdGUuCi0gIFNjb3BlZENvbVB0cjxJQU1WaWRlb0NvbnRyb2w+IHZpZGVvX2NvbnRyb2w7Ci0gIGhyID0gY2FwdHVyZV9maWx0ZXJfLlF1ZXJ5SW50ZXJmYWNlKHZpZGVvX2NvbnRyb2wuUmVjZWl2ZSgpKTsKLSAgRFZMT0dfSUYoMiwgRkFJTEVEKGhyKSkgPDwgIklBTVZpZGVvQ29udHJvbCBJbnRlcmZhY2UgTk9UIFNVUFBPUlRFRCI7Ci0KLSAgQU1fTUVESUFfVFlQRSogbWVkaWFfdHlwZSA9IE5VTEw7Ci0gIFZJREVPX1NUUkVBTV9DT05GSUdfQ0FQUyBjYXBzOwotICBpbnQgY291bnQsIHNpemU7Ci0KLSAgaHIgPSBzdHJlYW1fY29uZmlnLT5HZXROdW1iZXJPZkNhcGFiaWxpdGllcygmY291bnQsICZzaXplKTsKLSAgaWYgKEZBSUxFRChocikpIHsKLSAgICBEVkxPRygyKSA8PCAiRmFpbGVkIHRvIEdldE51bWJlck9mQ2FwYWJpbGl0aWVzIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICBociA9IHN0cmVhbV9jb25maWctPkdldFN0cmVhbUNhcHMoaSwgJm1lZGlhX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QllURSo+KCZjYXBzKSk7Ci0gICAgaWYgKEZBSUxFRChocikpIHsKLSAgICAgIERWTE9HKDIpIDw8ICJGYWlsZWQgdG8gR2V0U3RyZWFtQ2FwcyI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKG1lZGlhX3R5cGUtPm1ham9ydHlwZSA9PSBNRURJQVRZUEVfVmlkZW8gJiYKLSAgICAgICAgbWVkaWFfdHlwZS0+Zm9ybWF0dHlwZSA9PSBGT1JNQVRfVmlkZW9JbmZvKSB7Ci0gICAgICBWaWRlb0NhcHR1cmVDYXBhYmlsaXR5V2luIGNhcGFiaWxpdHkoaSk7Ci0gICAgICBSRUZFUkVOQ0VfVElNRSB0aW1lX3Blcl9mcmFtZSA9IDA7Ci0KLSAgICAgIFZJREVPSU5GT0hFQURFUiogaCA9Ci0gICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxWSURFT0lORk9IRUFERVIqPihtZWRpYV90eXBlLT5wYkZvcm1hdCk7Ci0gICAgICBjYXBhYmlsaXR5LndpZHRoID0gaC0+Ym1pSGVhZGVyLmJpV2lkdGg7Ci0gICAgICBjYXBhYmlsaXR5LmhlaWdodCA9IGgtPmJtaUhlYWRlci5iaUhlaWdodDsKLSAgICAgIHRpbWVfcGVyX2ZyYW1lID0gaC0+QXZnVGltZVBlckZyYW1lOwotCi0gICAgICAvLyBUcnkgdG8gZ2V0IHRoZSBtYXggZnJhbWUgcmF0ZSBmcm9tIElBTVZpZGVvQ29udHJvbC4KLSAgICAgIGlmICh2aWRlb19jb250cm9sLmdldCgpKSB7Ci0gICAgICAgIExPTkdMT05HKiBtYXhfZnBzX3B0cjsKLSAgICAgICAgTE9ORyBsaXN0X3NpemU7Ci0gICAgICAgIFNJWkUgc2l6ZTsKLSAgICAgICAgc2l6ZS5jeCA9IGNhcGFiaWxpdHkud2lkdGg7Ci0gICAgICAgIHNpemUuY3kgPSBjYXBhYmlsaXR5LmhlaWdodDsKLQotICAgICAgICAvLyBHZXRGcmFtZVJhdGVMaXN0IGRvZXNuJ3QgcmV0dXJuIG1heCBmcmFtZSByYXRlIGFsd2F5cwotICAgICAgICAvLyBlZzogTG9naXRlY2ggTm90ZWJvb2suIFRoaXMgbWF5IGJlIGR1ZSB0byBhIGJ1ZyBpbiB0aGF0IEFQSQotICAgICAgICAvLyBiZWNhdXNlIEdldEZyYW1lUmF0ZUxpc3QgYXJyYXkgaXMgcmV2ZXJzZWQgaW4gdGhlIGFib3ZlIGNhbWVyYS4gU28KLSAgICAgICAgLy8gYSB1dGlsIG1ldGhvZCB3cml0dGVuLiBDYW4ndCBhc3N1bWUgdGhlIGZpcnN0IHZhbHVlIHdpbGwgcmV0dXJuCi0gICAgICAgIC8vIHRoZSBtYXggZnBzLgotICAgICAgICBociA9IHZpZGVvX2NvbnRyb2wtPkdldEZyYW1lUmF0ZUxpc3Qob3V0cHV0X2NhcHR1cmVfcGluXywgaSwgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaXN0X3NpemUsICZtYXhfZnBzX3B0cik7Ci0KLSAgICAgICAgaWYgKFNVQ0NFRURFRChocikgJiYgbGlzdF9zaXplID4gMCkgewotICAgICAgICAgIGludCBtaW5fdGltZSA9ICAqc3RkOjptaW5fZWxlbWVudChtYXhfZnBzX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2Zwc19wdHIgKyBsaXN0X3NpemUpOwotICAgICAgICAgIGNhcGFiaWxpdHkuZnJhbWVfcmF0ZSA9IChtaW5fdGltZSA+IDApID8KLSAgICAgICAgICAgICAga1NlY29uZHNUb1JlZmVyZW5jZVRpbWUgLyBtaW5fdGltZSA6IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gR2V0IGZyYW1lIHJhdGUgZnJvbSBWSURFT0lORk9IRUFERVIuCi0gICAgICAgICAgY2FwYWJpbGl0eS5mcmFtZV9yYXRlID0gKHRpbWVfcGVyX2ZyYW1lID4gMCkgPwotICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGtTZWNvbmRzVG9SZWZlcmVuY2VUaW1lIC8gdGltZV9wZXJfZnJhbWUpIDogMDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gR2V0IGZyYW1lIHJhdGUgZnJvbSBWSURFT0lORk9IRUFERVIgc2luY2UgSUFNVmlkZW9Db250cm9sIGlzCi0gICAgICAgIC8vIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAgIGNhcGFiaWxpdHkuZnJhbWVfcmF0ZSA9ICh0aW1lX3Blcl9mcmFtZSA+IDApID8KLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oa1NlY29uZHNUb1JlZmVyZW5jZVRpbWUgLyB0aW1lX3Blcl9mcmFtZSkgOiAwOwotICAgICAgfQotCi0gICAgICAvLyBXZSBjYW4ndCBzd2l0Y2ggTUVESUFUWVBFIDp+KC4KLSAgICAgIGlmIChtZWRpYV90eXBlLT5zdWJ0eXBlID09IGtNZWRpYVN1YlR5cGVJNDIwKSB7Ci0gICAgICAgIGNhcGFiaWxpdHkuY29sb3IgPSBWaWRlb0NhcHR1cmVDYXBhYmlsaXR5OjprSTQyMDsKLSAgICAgIH0gZWxzZSBpZiAobWVkaWFfdHlwZS0+c3VidHlwZSA9PSBNRURJQVNVQlRZUEVfSVlVVikgewotICAgICAgICAvLyBUaGlzIGlzIGlkZW50aWNhbCB0byBrSTQyMC4KLSAgICAgICAgY2FwYWJpbGl0eS5jb2xvciA9IFZpZGVvQ2FwdHVyZUNhcGFiaWxpdHk6OmtJNDIwOwotICAgICAgfSBlbHNlIGlmIChtZWRpYV90eXBlLT5zdWJ0eXBlID09IE1FRElBU1VCVFlQRV9SR0IyNCkgewotICAgICAgICBjYXBhYmlsaXR5LmNvbG9yID0gVmlkZW9DYXB0dXJlQ2FwYWJpbGl0eTo6a1JHQjI0OwotICAgICAgfSBlbHNlIGlmIChtZWRpYV90eXBlLT5zdWJ0eXBlID09IE1FRElBU1VCVFlQRV9ZVVkyKSB7Ci0gICAgICAgIGNhcGFiaWxpdHkuY29sb3IgPSBWaWRlb0NhcHR1cmVDYXBhYmlsaXR5OjprWVVZMjsKLSAgICAgIH0gZWxzZSBpZiAobWVkaWFfdHlwZS0+c3VidHlwZSA9PSBNRURJQVNVQlRZUEVfTUpQRykgewotICAgICAgICBjYXBhYmlsaXR5LmNvbG9yID0gVmlkZW9DYXB0dXJlQ2FwYWJpbGl0eTo6a01KUEVHOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgV0NIQVIgZ3VpZF9zdHJbMTI4XTsKLSAgICAgICAgU3RyaW5nRnJvbUdVSUQyKG1lZGlhX3R5cGUtPnN1YnR5cGUsIGd1aWRfc3RyLCBhcnJheXNpemUoZ3VpZF9zdHIpKTsKLSAgICAgICAgRFZMT0coMikgPDwgIkRldmljZSBzdXBwb3J0IHVua25vd24gbWVkaWEgdHlwZSAiIDw8IGd1aWRfc3RyOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGNhcGFiaWxpdGllc18uQWRkKGNhcGFiaWxpdHkpOwotICAgIH0KLSAgICBEZWxldGVNZWRpYVR5cGUobWVkaWFfdHlwZSk7Ci0gICAgbWVkaWFfdHlwZSA9IE5VTEw7Ci0gIH0KLQotICByZXR1cm4gIWNhcGFiaWxpdGllc18uZW1wdHkoKTsKLX0KLQotdm9pZCBWaWRlb0NhcHR1cmVEZXZpY2VXaW46OlNldEVycm9yU3RhdGUoY29uc3QgY2hhciogcmVhc29uKSB7Ci0gIERDSEVDSyhDYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBEVkxPRygxKSA8PCByZWFzb247Ci0gIHN0YXRlXyA9IGtFcnJvcjsKLSAgb2JzZXJ2ZXJfLT5PbkVycm9yKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvd2luL3ZpZGVvX2NhcHR1cmVfZGV2aWNlX3dpbi5oIGIvc3JjL21lZGlhL3ZpZGVvL2NhcHR1cmUvd2luL3ZpZGVvX2NhcHR1cmVfZGV2aWNlX3dpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTFmMDA1Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS92aWRlby9jYXB0dXJlL3dpbi92aWRlb19jYXB0dXJlX2RldmljZV93aW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIFdpbmRvd3Mgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgVmlkZW9DYXB0dXJlRGV2aWNlLgotLy8gRGlyZWN0U2hvdyBpcyB1c2VkIGZvciBjYXB0dXJpbmcuIERpcmVjdFNob3cgcHJvdmlkZSBpdHMgb3duIHRocmVhZHMKLS8vIGZvciBjYXB0dXJpbmcuCi0KLSNpZm5kZWYgTUVESUFfVklERU9fQ0FQVFVSRV9XSU5fVklERU9fQ0FQVFVSRV9ERVZJQ0VfV0lOX0hfCi0jZGVmaW5lIE1FRElBX1ZJREVPX0NBUFRVUkVfV0lOX1ZJREVPX0NBUFRVUkVfREVWSUNFX1dJTl9IXwotCi0vLyBBdm9pZCBpbmNsdWRpbmcgc3Ryc2FmZS5oIHZpYSBkc2hvdyBhcyBpdCB3aWxsIGNhdXNlIGJ1aWxkIHdhcm5pbmdzLgotI2RlZmluZSBOT19EU0hPV19TVFJTQUZFCi0jaW5jbHVkZSA8ZHNob3cuaD4KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy9ub25fdGhyZWFkX3NhZmUuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWQuaCIKLSNpbmNsdWRlICJiYXNlL3dpbi9zY29wZWRfY29tcHRyLmgiCi0jaW5jbHVkZSAibWVkaWEvdmlkZW8vY2FwdHVyZS92aWRlb19jYXB0dXJlX2RldmljZS5oIgotI2luY2x1ZGUgIm1lZGlhL3ZpZGVvL2NhcHR1cmUvdmlkZW9fY2FwdHVyZV90eXBlcy5oIgotI2luY2x1ZGUgIm1lZGlhL3ZpZGVvL2NhcHR1cmUvd2luL2NhcGFiaWxpdHlfbGlzdF93aW4uaCIKLSNpbmNsdWRlICJtZWRpYS92aWRlby9jYXB0dXJlL3dpbi9zaW5rX2ZpbHRlcl93aW4uaCIKLSNpbmNsdWRlICJtZWRpYS92aWRlby9jYXB0dXJlL3dpbi9zaW5rX2lucHV0X3Bpbl93aW4uaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gQWxsIHRoZSBtZXRob2RzIGluIHRoZSBjbGFzcyBjYW4gb25seSBiZSBydW4gb24gYSBDT00gaW5pdGlhbGl6ZWQgdGhyZWFkLgotY2xhc3MgVmlkZW9DYXB0dXJlRGV2aWNlV2luCi0gICAgOiBwdWJsaWMgYmFzZTo6Tm9uVGhyZWFkU2FmZSwKLSAgICAgIHB1YmxpYyBWaWRlb0NhcHR1cmVEZXZpY2UsCi0gICAgICBwdWJsaWMgU2lua0ZpbHRlck9ic2VydmVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFZpZGVvQ2FwdHVyZURldmljZVdpbihjb25zdCBOYW1lJiBkZXZpY2VfbmFtZSk7Ci0gIHZpcnR1YWwgflZpZGVvQ2FwdHVyZURldmljZVdpbigpOwotICAvLyBPcGVucyB0aGUgZGV2aWNlIGRyaXZlciBmb3IgdGhpcyBkZXZpY2UuCi0gIC8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSB0aGUgc3RhdGljIFZpZGVvQ2FwdHVyZURldmljZTo6Q3JlYXRlIGZ1bmN0aW9uLgotICBib29sIEluaXQoKTsKLQotICAvLyBWaWRlb0NhcHR1cmVEZXZpY2UgaW1wbGVtZW50YXRpb24uCi0gIHZpcnR1YWwgdm9pZCBBbGxvY2F0ZShpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0NhcHR1cmVEZXZpY2U6OkV2ZW50SGFuZGxlciogb2JzZXJ2ZXIpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgU3RhcnQoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIFN0b3AoKSBPVkVSUklERTsKLSAgdmlydHVhbCB2b2lkIERlQWxsb2NhdGUoKSBPVkVSUklERTsKLSAgdmlydHVhbCBjb25zdCBOYW1lJiBkZXZpY2VfbmFtZSgpIE9WRVJSSURFOwotCi0gIHN0YXRpYyB2b2lkIEdldERldmljZU5hbWVzKE5hbWVzKiBkZXZpY2VfbmFtZXMpOwotCi0gcHJpdmF0ZToKLSAgZW51bSBJbnRlcm5hbFN0YXRlIHsKLSAgICBrSWRsZSwgIC8vIFRoZSBkZXZpY2UgZHJpdmVyIGlzIG9wZW5lZCBidXQgY2FtZXJhIGlzIG5vdCBpbiB1c2UuCi0gICAga0FsbG9jYXRlZCwgIC8vIFRoZSBjYW1lcmEgaGFzIGJlZW4gYWxsb2NhdGVkIGFuZCBjYW4gYmUgc3RhcnRlZC4KLSAgICBrQ2FwdHVyaW5nLCAgLy8gVmlkZW8gaXMgYmVpbmcgY2FwdHVyZWQuCi0gICAga0Vycm9yICAvLyBFcnJvciBhY2Nlc3NpbmcgSFcgZnVuY3Rpb25zLgotICAgICAgICAgICAgLy8gVXNlciBuZWVkcyB0byByZWNvdmVyIGJ5IGRlc3Ryb3lpbmcgdGhlIG9iamVjdC4KLSAgfTsKLQotICAvLyBJbXBsZW1lbnRzIFNpbmtGaWx0ZXJPYnNlcnZlci4KLSAgdmlydHVhbCB2b2lkIEZyYW1lUmVjZWl2ZWQoY29uc3QgdWludDgqIGJ1ZmZlciwgaW50IGxlbmd0aCk7Ci0KLSAgYm9vbCBDcmVhdGVDYXBhYmlsaXR5TWFwKCk7Ci0gIHZvaWQgU2V0RXJyb3JTdGF0ZShjb25zdCBjaGFyKiByZWFzb24pOwotCi0gIE5hbWUgZGV2aWNlX25hbWVfOwotICBJbnRlcm5hbFN0YXRlIHN0YXRlXzsKLSAgVmlkZW9DYXB0dXJlRGV2aWNlOjpFdmVudEhhbmRsZXIqIG9ic2VydmVyXzsKLQotICBiYXNlOjp3aW46OlNjb3BlZENvbVB0cjxJQmFzZUZpbHRlcj4gY2FwdHVyZV9maWx0ZXJfOwotICBiYXNlOjp3aW46OlNjb3BlZENvbVB0cjxJR3JhcGhCdWlsZGVyPiBncmFwaF9idWlsZGVyXzsKLSAgYmFzZTo6d2luOjpTY29wZWRDb21QdHI8SU1lZGlhQ29udHJvbD4gbWVkaWFfY29udHJvbF87Ci0gIGJhc2U6Ondpbjo6U2NvcGVkQ29tUHRyPElQaW4+IGlucHV0X3NpbmtfcGluXzsKLSAgYmFzZTo6d2luOjpTY29wZWRDb21QdHI8SVBpbj4gb3V0cHV0X2NhcHR1cmVfcGluXzsKLSAgLy8gVXNlZCB3aGVuIHVzaW5nIGEgTUpQRUcgZGVjb2Rlci4KLSAgYmFzZTo6d2luOjpTY29wZWRDb21QdHI8SUJhc2VGaWx0ZXI+IG1qcGdfZmlsdGVyXzsKLSAgYmFzZTo6d2luOjpTY29wZWRDb21QdHI8SVBpbj4gaW5wdXRfbWpwZ19waW5fOwotICBiYXNlOjp3aW46OlNjb3BlZENvbVB0cjxJUGluPiBvdXRwdXRfbWpwZ19waW5fOwotCi0gIHNjb3BlZF9yZWZwdHI8U2lua0ZpbHRlcj4gc2lua19maWx0ZXJfOwotCi0gIC8vIE1hcCBvZiBhbGwgY2FwYWJpbGl0aWVzIHRoaXMgZGV2aWNlIHN1cHBvcnQuCi0gIENhcGFiaWxpdHlMaXN0IGNhcGFiaWxpdGllc187Ci0KLSAgRElTQUxMT1dfSU1QTElDSVRfQ09OU1RSVUNUT1JTKFZpZGVvQ2FwdHVyZURldmljZVdpbik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9WSURFT19DQVBUVVJFX1dJTl9WSURFT19DQVBUVVJFX0RFVklDRV9XSU5fSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS92aWRlby9waWN0dXJlLmNjIGIvc3JjL21lZGlhL3ZpZGVvL3BpY3R1cmUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZTRhMjMuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3ZpZGVvL3BpY3R1cmUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvdmlkZW8vcGljdHVyZS5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1QaWN0dXJlQnVmZmVyOjpQaWN0dXJlQnVmZmVyKGludDMyIGlkLCBnZng6OlNpemUgc2l6ZSwgdWludDMyIHRleHR1cmVfaWQpCi0gICAgOiBpZF8oaWQpLAotICAgICAgc2l6ZV8oc2l6ZSksCi0gICAgICB0ZXh0dXJlX2lkXyh0ZXh0dXJlX2lkKSB7Ci19Ci0KLVBpY3R1cmU6OlBpY3R1cmUoaW50MzIgcGljdHVyZV9idWZmZXJfaWQsIGludDMyIGJpdHN0cmVhbV9idWZmZXJfaWQpCi0gICAgOiBwaWN0dXJlX2J1ZmZlcl9pZF8ocGljdHVyZV9idWZmZXJfaWQpLAotICAgICAgYml0c3RyZWFtX2J1ZmZlcl9pZF8oYml0c3RyZWFtX2J1ZmZlcl9pZCkgewotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS92aWRlby9waWN0dXJlLmggYi9zcmMvbWVkaWEvdmlkZW8vcGljdHVyZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDNiNzc1Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS92aWRlby9waWN0dXJlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX1ZJREVPX1BJQ1RVUkVfSF8KLSNkZWZpbmUgTUVESUFfVklERU9fUElDVFVSRV9IXwotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCIKLSNpbmNsdWRlICJ1aS9nZngvc2l6ZS5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBBIHBpY3R1cmUgYnVmZmVyIHRoYXQgaXMgY29tcG9zZWQgb2YgYSBHTEVTMiB0ZXh0dXJlLgotLy8gVGhpcyBpcyB0aGUgbWVkaWEtbmFtZXNwYWNlIGVxdWl2YWxlbnQgb2YgUFBfUGljdHVyZUJ1ZmZlcl9EZXYuCi1jbGFzcyBNRURJQV9FWFBPUlQgUGljdHVyZUJ1ZmZlciB7Ci0gcHVibGljOgotICBQaWN0dXJlQnVmZmVyKGludDMyIGlkLCBnZng6OlNpemUgc2l6ZSwgdWludDMyIHRleHR1cmVfaWQpOwotCi0gIC8vIFJldHVybnMgdGhlIGNsaWVudC1zcGVjaWZpZWQgaWQgb2YgdGhlIGJ1ZmZlci4KLSAgaW50MzIgaWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGlkXzsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4KLSAgZ2Z4OjpTaXplIHNpemUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHNpemVfOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgaWQgb2YgdGhlIHRleHR1cmUuCi0gIC8vIE5PVEU6IFRoZSB0ZXh0dXJlIGlkIGluIHRoZSByZW5kZXJlciBwcm9jZXNzIGNvcnJlc3BvbmRzIHRvIGEgZGlmZmVyZW50Ci0gIC8vIHRleHR1cmUgaWQgaW4gdGhlIEdQVSBwcm9jZXNzLgotICB1aW50MzIgdGV4dHVyZV9pZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gdGV4dHVyZV9pZF87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGludDMyIGlkXzsKLSAgZ2Z4OjpTaXplIHNpemVfOwotICB1aW50MzIgdGV4dHVyZV9pZF87Ci19OwotCi0vLyBBIGRlY29kZWQgcGljdHVyZSBmcmFtZS4KLS8vIFRoaXMgaXMgdGhlIG1lZGlhLW5hbWVzcGFjZSBlcXVpdmFsZW50IG9mIFBQX1BpY3R1cmVfRGV2LgotY2xhc3MgTUVESUFfRVhQT1JUIFBpY3R1cmUgewotIHB1YmxpYzoKLSAgUGljdHVyZShpbnQzMiBwaWN0dXJlX2J1ZmZlcl9pZCwgaW50MzIgYml0c3RyZWFtX2J1ZmZlcl9pZCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgaWQgb2YgdGhlIHBpY3R1cmUgYnVmZmVyIHdoZXJlIHRoaXMgcGljdHVyZSBpcyBjb250YWluZWQuCi0gIGludDMyIHBpY3R1cmVfYnVmZmVyX2lkKCkgY29uc3QgewotICAgIHJldHVybiBwaWN0dXJlX2J1ZmZlcl9pZF87Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBpZCBvZiB0aGUgYml0c3RyZWFtIGJ1ZmZlciBmcm9tIHdoaWNoIHRoaXMgZnJhbWUgd2FzIGRlY29kZWQuCi0gIGludDMyIGJpdHN0cmVhbV9idWZmZXJfaWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGJpdHN0cmVhbV9idWZmZXJfaWRfOwotICB9Ci0KLSAgdm9pZCBzZXRfYml0c3RyZWFtX2J1ZmZlcl9pZChpbnQzMiBiaXRzdHJlYW1fYnVmZmVyX2lkKSB7Ci0gICAgYml0c3RyZWFtX2J1ZmZlcl9pZF8gPSBiaXRzdHJlYW1fYnVmZmVyX2lkOwotICB9Ci0KLSBwcml2YXRlOgotICBpbnQzMiBwaWN0dXJlX2J1ZmZlcl9pZF87Ci0gIGludDMyIGJpdHN0cmVhbV9idWZmZXJfaWRfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfVklERU9fUElDVFVSRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3ZpZGVvL3ZpZGVvX2RlY29kZV9hY2NlbGVyYXRvci5jYyBiL3NyYy9tZWRpYS92aWRlby92aWRlb19kZWNvZGVfYWNjZWxlcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNjNkNjguLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3ZpZGVvL3ZpZGVvX2RlY29kZV9hY2NlbGVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS92aWRlby92aWRlb19kZWNvZGVfYWNjZWxlcmF0b3IuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotVmlkZW9EZWNvZGVBY2NlbGVyYXRvcjo6flZpZGVvRGVjb2RlQWNjZWxlcmF0b3IoKSB7fQotCi19CmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvdmlkZW8vdmlkZW9fZGVjb2RlX2FjY2VsZXJhdG9yLmggYi9zcmMvbWVkaWEvdmlkZW8vdmlkZW9fZGVjb2RlX2FjY2VsZXJhdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNTUzYTkuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3ZpZGVvL3ZpZGVvX2RlY29kZV9hY2NlbGVyYXRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfVklERU9fVklERU9fREVDT0RFX0FDQ0VMRVJBVE9SX0hfCi0jZGVmaW5lIE1FRElBX1ZJREVPX1ZJREVPX0RFQ09ERV9BQ0NFTEVSQVRPUl9IXwotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvd2Vha19wdHIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2JpdHN0cmVhbV9idWZmZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXJfY29uZmlnLmgiCi0jaW5jbHVkZSAibWVkaWEvdmlkZW8vcGljdHVyZS5oIgotI2luY2x1ZGUgInVpL2dmeC9zaXplLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIFZpZGVvIGRlY29kZXIgaW50ZXJmYWNlLgotLy8gVGhpcyBpbnRlcmZhY2UgaXMgZXh0ZW5kZWQgYnkgdGhlIHZhcmlvdXMgY29tcG9uZW50cyB0aGF0IHVsdGltYXRlbHkKLS8vIGltcGxlbWVudCB0aGUgYmFja2VuZCBvZiBQUEJfVmlkZW9EZWNvZGVfRGV2LgotY2xhc3MgTUVESUFfRVhQT1JUIFZpZGVvRGVjb2RlQWNjZWxlcmF0b3IKLSAgICA6IHB1YmxpYyBiYXNlOjpTdXBwb3J0c1dlYWtQdHI8VmlkZW9EZWNvZGVBY2NlbGVyYXRvcj4gewotIHB1YmxpYzoKLSAgdmlydHVhbCB+VmlkZW9EZWNvZGVBY2NlbGVyYXRvcigpOwotCi0gIC8vIEVudW1lcmF0aW9uIG9mIHBvdGVudGlhbCBlcnJvcnMgZ2VuZXJhdGVkIGJ5IHRoZSBBUEkuCi0gIC8vIE5vdGU6IEtlZXAgdGhlc2UgaW4gc3luYyB3aXRoIFBQX1ZpZGVvRGVjb2RlRXJyb3JfRGV2LgotICBlbnVtIEVycm9yIHsKLSAgICAvLyBBbiBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBkdXJpbmcgYW4gaW5jb21wYXRpYmxlIGRlY29kZXIgc3RhdGUuCi0gICAgSUxMRUdBTF9TVEFURSA9IDEsCi0gICAgLy8gSW52YWxpZCBhcmd1bWVudCB3YXMgcGFzc2VkIHRvIGFuIEFQSSBtZXRob2QuCi0gICAgSU5WQUxJRF9BUkdVTUVOVCwKLSAgICAvLyBFbmNvZGVkIGlucHV0IGlzIHVucmVhZGFibGUuCi0gICAgVU5SRUFEQUJMRV9JTlBVVCwKLSAgICAvLyBBIGZhaWx1cmUgb2NjdXJyZWQgYXQgdGhlIGJyb3dzZXIgbGF5ZXIgb3Igb25lIG9mIGl0cyBkZXBlbmRlbmNpZXMuCi0gICAgLy8gRXhhbXBsZXMgb2Ygc3VjaCBmYWlsdXJlcyBpbmNsdWRlIEdQVSBoYXJkd2FyZSBmYWlsdXJlcywgR1BVIGRyaXZlcgotICAgIC8vIGZhaWx1cmVzLCBHUFUgbGlicmFyeSBmYWlsdXJlcywgYnJvd3NlciBwcm9ncmFtbWluZyBlcnJvcnMsIGFuZCBzbyBvbi4KLSAgICBQTEFURk9STV9GQUlMVVJFLAotICB9OwotCi0gIC8vIEludGVyZmFjZSBmb3IgY29sbGFib3JhdGluZyB3aXRoIHBpY3R1cmUgaW50ZXJmYWNlIHRvIHByb3ZpZGUgbWVtb3J5IGZvcgotICAvLyBvdXRwdXQgcGljdHVyZSBhbmQgYmxpdHRpbmcgdGhlbS4KLSAgLy8gVGhpcyBpbnRlcmZhY2UgaXMgZXh0ZW5kZWQgYnkgdGhlIHZhcmlvdXMgbGF5ZXJzIHRoYXQgcmVsYXkgbWVzc2FnZXMgYmFjawotICAvLyB0byB0aGUgcGx1Z2luLCB0aHJvdWdoIHRoZSBQUFBfVmlkZW9EZWNvZGVfRGV2IGludGVyZmFjZSB0aGUgcGx1Z2luCi0gIC8vIGltcGxlbWVudHMuCi0gIGNsYXNzIE1FRElBX0VYUE9SVCBDbGllbnQgewotICAgcHVibGljOgotICAgIC8vIENhbGxiYWNrIHRvIG5vdGlmeSBjbGllbnQgdGhhdCBkZWNvZGVyIGhhcyBiZWVuIGluaXRpYWxpemVkLgotICAgIHZpcnR1YWwgdm9pZCBOb3RpZnlJbml0aWFsaXplRG9uZSgpID0gMDsKLQotICAgIC8vIENhbGxiYWNrIHRvIHRlbGwgY2xpZW50IGhvdyBtYW55IGFuZCB3aGF0IHNpemUgb2YgYnVmZmVycyB0byBwcm92aWRlLgotICAgIHZpcnR1YWwgdm9pZCBQcm92aWRlUGljdHVyZUJ1ZmZlcnModWludDMyIHJlcXVlc3RlZF9udW1fb2ZfYnVmZmVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgZGltZW5zaW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiB0ZXh0dXJlX3RhcmdldCkgPSAwOwotCi0gICAgLy8gQ2FsbGJhY2sgdG8gZGlzbWlzcyBwaWN0dXJlIGJ1ZmZlciB0aGF0IHdhcyBhc3NpZ25lZCBlYXJsaWVyLgotICAgIHZpcnR1YWwgdm9pZCBEaXNtaXNzUGljdHVyZUJ1ZmZlcihpbnQzMiBwaWN0dXJlX2J1ZmZlcl9pZCkgPSAwOwotCi0gICAgLy8gQ2FsbGJhY2sgdG8gZGVsaXZlciBkZWNvZGVkIHBpY3R1cmVzIHJlYWR5IHRvIGJlIGRpc3BsYXllZC4KLSAgICB2aXJ0dWFsIHZvaWQgUGljdHVyZVJlYWR5KGNvbnN0IFBpY3R1cmUmIHBpY3R1cmUpID0gMDsKLQotICAgIC8vIENhbGxiYWNrIHRvIG5vdGlmeSB0aGF0IGRlY29kZWQgaGFzIGRlY29kZWQgdGhlIGVuZCBvZiB0aGUgY3VycmVudAotICAgIC8vIGJpdHN0cmVhbSBidWZmZXIuCi0gICAgdmlydHVhbCB2b2lkIE5vdGlmeUVuZE9mQml0c3RyZWFtQnVmZmVyKGludDMyIGJpdHN0cmVhbV9idWZmZXJfaWQpID0gMDsKLQotICAgIC8vIEZsdXNoIGNvbXBsZXRpb24gY2FsbGJhY2suCi0gICAgdmlydHVhbCB2b2lkIE5vdGlmeUZsdXNoRG9uZSgpID0gMDsKLQotICAgIC8vIFJlc2V0IGNvbXBsZXRpb24gY2FsbGJhY2suCi0gICAgdmlydHVhbCB2b2lkIE5vdGlmeVJlc2V0RG9uZSgpID0gMDsKLQotICAgIC8vIENhbGxiYWNrIHRvIG5vdGlmeSBhYm91dCBkZWNvZGluZyBlcnJvcnMuCi0gICAgdmlydHVhbCB2b2lkIE5vdGlmeUVycm9yKEVycm9yIGVycm9yKSA9IDA7Ci0KLSAgIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5DbGllbnQoKSB7fQotICB9OwotCi0gIC8vIFZpZGVvIGRlY29kZXIgZnVuY3Rpb25zLgotCi0gIC8vIEluaXRpYWxpemVzIHRoZSB2aWRlbyBkZWNvZGVyIHdpdGggc3BlY2lmaWMgY29uZmlndXJhdGlvbi4KLSAgLy8gUGFyYW1ldGVyczoKLSAgLy8gIHxwcm9maWxlfCBpcyB0aGUgdmlkZW8gc3RyZWFtJ3MgZm9ybWF0IHByb2ZpbGUuCi0gIC8vCi0gIC8vIFJldHVybnMgdHJ1ZSB3aGVuIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGFjY2VwdGVkLiBPdGhlcndpc2UgZmFsc2UuCi0gIHZpcnR1YWwgYm9vbCBJbml0aWFsaXplKFZpZGVvQ29kZWNQcm9maWxlIHByb2ZpbGUpID0gMDsKLQotICAvLyBEZWNvZGVzIGdpdmVuIGJpdHN0cmVhbSBidWZmZXIuIE9uY2UgZGVjb2RlciBpcyBkb25lIHdpdGggcHJvY2Vzc2luZwotICAvLyB8Yml0c3RyZWFtX2J1ZmZlcnwgaXQgd2lsbCBjYWxsIE5vdGlmeUVuZE9mQml0c3RyZWFtQnVmZmVyKCkgd2l0aCB0aGUKLSAgLy8gYml0c3RyZWFtIGJ1ZmZlciBpZC4KLSAgLy8gUGFyYW1ldGVyczoKLSAgLy8gIHxiaXRzdHJlYW1fYnVmZmVyfCBpcyB0aGUgaW5wdXQgYml0c3RyZWFtIHRoYXQgaXMgc2VudCBmb3IgZGVjb2RpbmcuCi0gIHZpcnR1YWwgdm9pZCBEZWNvZGUoY29uc3QgQml0c3RyZWFtQnVmZmVyJiBiaXRzdHJlYW1fYnVmZmVyKSA9IDA7Ci0KLSAgLy8gQXNzaWducyBhIHNldCBvZiB0ZXh0dXJlLWJhY2tlZCBwaWN0dXJlIGJ1ZmZlcnMgdG8gdGhlIHZpZGVvIGRlY29kZXIuCi0gIC8vCi0gIC8vIE93bmVyc2hpcCBvZiBlYWNoIHBpY3R1cmUgYnVmZmVyIHJlbWFpbnMgd2l0aCB0aGUgY2xpZW50LCBidXQgdGhlIGNsaWVudAotICAvLyBpcyBub3QgYWxsb3dlZCB0byBkZWFsbG9jYXRlIHRoZSBidWZmZXIgYmVmb3JlIHRoZSBEaXNtaXNzUGljdHVyZUJ1ZmZlcgotICAvLyBjYWxsYmFjayBoYXMgYmVlbiBpbml0aWF0ZWQgZm9yIGEgZ2l2ZW4gYnVmZmVyLgotICAvLwotICAvLyBQYXJhbWV0ZXJzOgotICAvLyAgfGJ1ZmZlcnN8IGNvbnRhaW5zIHRoZSBhbGxvY2F0ZWQgcGljdHVyZSBidWZmZXJzIGZvciB0aGUgb3V0cHV0LgotICB2aXJ0dWFsIHZvaWQgQXNzaWduUGljdHVyZUJ1ZmZlcnMoCi0gICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaWN0dXJlQnVmZmVyPiYgYnVmZmVycykgPSAwOwotCi0gIC8vIFNlbmRzIHBpY3R1cmUgYnVmZmVycyB0byBiZSByZXVzZWQgYnkgdGhlIGRlY29kZXIuIFRoaXMgbmVlZHMgdG8gYmUgY2FsbGVkCi0gIC8vIGZvciBlYWNoIGJ1ZmZlciB0aGF0IGhhcyBiZWVuIHByb2Nlc3NlZCBzbyB0aGF0IGRlY29kZXIgbWF5IGtub3cgb250byB3aGljaAotICAvLyBwaWN0dXJlIGJ1ZmZlcnMgaXQgY2FuIHdyaXRlIHRoZSBvdXRwdXQgdG8uCi0gIC8vCi0gIC8vIFBhcmFtZXRlcnM6Ci0gIC8vICB8cGljdHVyZV9idWZmZXJfaWR8IGlkIG9mIHRoZSBwaWN0dXJlIGJ1ZmZlciB0aGF0IGlzIHRvIGJlIHJldXNlZC4KLSAgdmlydHVhbCB2b2lkIFJldXNlUGljdHVyZUJ1ZmZlcihpbnQzMiBwaWN0dXJlX2J1ZmZlcl9pZCkgPSAwOwotCi0gIC8vIEZsdXNoZXMgdGhlIGRlY29kZXI6IGFsbCBwZW5kaW5nIGlucHV0cyB3aWxsIGJlIGRlY29kZWQgYW5kIHBpY3R1cmVzIGhhbmRlZAotICAvLyBiYWNrIHRvIHRoZSBjbGllbnQsIGZvbGxvd2VkIGJ5IE5vdGlmeUZsdXNoRG9uZSgpIGJlaW5nIGNhbGxlZCBvbiB0aGUKLSAgLy8gY2xpZW50LiAgQ2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50ICJlbmQgb2Ygc3RyZWFtIiBub3RpZmljYXRpb24uCi0gIHZpcnR1YWwgdm9pZCBGbHVzaCgpID0gMDsKLQotICAvLyBSZXNldHMgdGhlIGRlY29kZXI6IGFsbCBwZW5kaW5nIGlucHV0cyBhcmUgZHJvcHBlZCBpbW1lZGlhdGVseSBhbmQgdGhlCi0gIC8vIGRlY29kZXIgcmV0dXJuZWQgdG8gYSBzdGF0ZSByZWFkeSBmb3IgZnVydGhlciBEZWNvZGUoKXMsIGZvbGxvd2VkIGJ5Ci0gIC8vIE5vdGlmeVJlc2V0RG9uZSgpIGJlaW5nIGNhbGxlZCBvbiB0aGUgY2xpZW50LiAgQ2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50Ci0gIC8vICJzZWVrIi4KLSAgdmlydHVhbCB2b2lkIFJlc2V0KCkgPSAwOwotCi0gIC8vIERlc3Ryb3lzIHRoZSBkZWNvZGVyOiBhbGwgcGVuZGluZyBpbnB1dHMgYXJlIGRyb3BwZWQgaW1tZWRpYXRlbHkgYW5kIHRoZQotICAvLyBjb21wb25lbnQgaXMgZnJlZWQuICBUaGlzIGNhbGwgbWF5IGFzeW5jaG9ybm91c2x5IGZyZWUgc3lzdGVtIHJlc291cmNlcywKLSAgLy8gYnV0IGl0cyBjbGllbnQtdmlzaWJsZSBlZmZlY3RzIGFyZSBzeW5jaHJvbm91cy4gIEFmdGVyIHRoaXMgbWV0aG9kIHJldHVybnMKLSAgLy8gbm8gbW9yZSBjYWxsYmFja3Mgd2lsbCBiZSBtYWRlIG9uIHRoZSBjbGllbnQuICBEZWxldGVzIHx0aGlzfAotICAvLyB1bmNvbmRpdGlvbmFsbHksIHNvIG1ha2Ugc3VyZSB0byBkcm9wIGFsbCBwb2ludGVycyB0byBpdCEKLSAgdmlydHVhbCB2b2lkIERlc3Ryb3koKSA9IDA7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9WSURFT19WSURFT19ERUNPREVfQUNDRUxFUkFUT1JfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS93ZWJtL2Nocm9tZW9zL2VibWxfd3JpdGVyLmNjIGIvc3JjL21lZGlhL3dlYm0vY2hyb21lb3MvZWJtbF93cml0ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNWYwN2QuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3dlYm0vY2hyb21lb3MvZWJtbF93cml0ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvd2VibS9jaHJvbWVvcy9lYm1sX3dyaXRlci5oIgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCIKLQotZXh0ZXJuICJDIiB7Ci0jaW5jbHVkZSAidGhpcmRfcGFydHkvbGlidnB4L3NvdXJjZS9saWJ2cHgvbGlibWt2L0VibWxXcml0ZXIuaCIKLQotRWJtbEdsb2JhbDo6RWJtbEdsb2JhbCgpIHsKLX0KLQotRWJtbEdsb2JhbDo6fkVibWxHbG9iYWwoKSB7Ci19Ci0KLS8vIFRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlIGFuZCB2aXNpYmxlIHRvIGxpYm1rdi4KLQotdm9pZCBNRURJQV9FWFBPUlQgRWJtbF9Xcml0ZShFYm1sR2xvYmFsKiBnbG9iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbGVuKSB7Ci0gIGdsb2ItPndyaXRlX2NiLlJ1bihidWZmZXIsIGxlbik7Ci19Ci0KLXZvaWQgTUVESUFfRVhQT1JUIEVibWxfU2VyaWFsaXplKEVibWxHbG9iYWwqIGdsb2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmZmVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxlbikgewotICBnbG9iLT5zZXJpYWxpemVfY2IuUnVuKGJ1ZmZlciwgYnVmZmVyX3NpemUsIGxlbik7Ci19Ci0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS93ZWJtL2Nocm9tZW9zL2VibWxfd3JpdGVyLmggYi9zcmMvbWVkaWEvd2VibS9jaHJvbWVvcy9lYm1sX3dyaXRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzE0ZWJmLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS93ZWJtL2Nocm9tZW9zL2VibWxfd3JpdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX1dFQk1fQ0hST01FT1NfRUJNTF9XUklURVJfSF8KLSNkZWZpbmUgTUVESUFfV0VCTV9DSFJPTUVPU19FQk1MX1dSSVRFUl9IXwotCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgotCi0vLyBUaGlzIHN0cnVjdCBzZXJ2ZXMgYXMgYSBicmlkZ2UgYmV0d2VlZW4gc3RhdGljIGxpYm1rdiBpbnRlcmZhY2UgYW5kIENocm9tZSdzCi0vLyBiYXNlOjpDYWxsYmFjay4gTXVzdCBiZSBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gU2VlIEVibWxXcml0ZXIuaC4KLXN0cnVjdCBFYm1sR2xvYmFsIHsKLSAgRWJtbEdsb2JhbCgpOwotICB+RWJtbEdsb2JhbCgpOwotCi0gIGJhc2U6OkNhbGxiYWNrPHZvaWQoY29uc3Qgdm9pZCogYnVmZmVyLCB1bnNpZ25lZCBsb25nIGxlbik+IHdyaXRlX2NiOwotICBiYXNlOjpDYWxsYmFjazx2b2lkKGNvbnN0IHZvaWQqIGJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplLCB1bnNpZ25lZCBsb25nIGxlbik+Ci0gICAgICBzZXJpYWxpemVfY2I7Ci19OwotCi0jZW5kaWYgIC8vIE1FRElBX1dFQk1fQ0hST01FT1NfRUJNTF9XUklURVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS93ZWJtL2Nocm9tZW9zL3dlYm1fZW5jb2Rlci5jYyBiL3NyYy9tZWRpYS93ZWJtL2Nocm9tZW9zL3dlYm1fZW5jb2Rlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJkZGFkMC4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvd2VibS9jaHJvbWVvcy93ZWJtX2VuY29kZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL3dlYm0vY2hyb21lb3Mvd2VibV9lbmNvZGVyLmgiCi0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2ZpbGVfdXRpbC5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9nZW5lcmljX29iai5oIgotI2luY2x1ZGUgImxpYnl1di9jb252ZXJ0LmgiCi0jaW5jbHVkZSAibGlieXV2L3ZpZGVvX2NvbW1vbi5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9jb3JlL1NrQml0bWFwLmgiCi0KLWV4dGVybiAiQyIgewotLy8gR2V0dGluZyB0aGUgcmlnaHQgZGVncmVlIG9mIEMgY29tcGF0aWJpbGl0eSBoYXMgYmVlbiBhIGNvbnN0YW50IHN0cnVnZ2xlLgotLy8gLSBTdHJvdXN0cnVwLCBDKysgUmVwb3J0LCAxMig3KSwgSnVseS9BdWd1c3QgMjAwMC4KLSNkZWZpbmUgcHJpdmF0ZSBwcml2Ci0jaW5jbHVkZSAidGhpcmRfcGFydHkvbGlidnB4L3NvdXJjZS9saWJ2cHgvbGlibWt2L0VibWxJRHMuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9saWJ2cHgvc291cmNlL2xpYnZweC9saWJta3YvRWJtbFdyaXRlci5oIgotI3VuZGVmIHByaXZhdGUKLX0KLQotLy8gTnVtYmVyIG9mIGVuY29kZXIgdGhyZWFkcyB0byB1c2UuCi1zdGF0aWMgY29uc3QgaW50IGtOdW1FbmNvZGVyVGhyZWFkcyA9IDI7Ci0KLS8vIE5lZWQgYSBmaXhlZCBzaXplIHNlcmlhbGl6ZXIgZm9yIHRoZSB0cmFjayBJRC4gbGlibWt2IHByb3ZpZGVzIGEgNjQgYml0Ci0vLyBvbmUsIGJ1dCBub3QgYSAzMiBiaXQgb25lLgotc3RhdGljIHZvaWQgRWJtbF9TZXJpYWxpemVVbnNpZ25lZDMyKEVibWxHbG9iYWwqIGVibWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjbGFzc19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZSkgewotICB1aW50OCBzaXplX3NlcmlhbGl6ZWQgPSA0IHwgMHg4MDsKLSAgRWJtbF9Xcml0ZUlEKGVibWwsIGNsYXNzX2lkKTsKLSAgRWJtbF9TZXJpYWxpemUoZWJtbCwgJnNpemVfc2VyaWFsaXplZCwgc2l6ZW9mKHNpemVfc2VyaWFsaXplZCksIDEpOwotICBFYm1sX1NlcmlhbGl6ZShlYm1sLCAmdmFsdWUsIHNpemVvZih2YWx1ZSksIDQpOwotfQotCi0vLyBXcmFwcGVyIGZ1bmN0b3IgZm9yIHZweF9jb2RlY19kZXN0cm95KCkuCi1jbGFzcyBWcHhDb2RlY0Rlc3Ryb3lIZWxwZXIgewotIHB1YmxpYzoKLSAgdm9pZCBvcGVyYXRvcigpKHZweF9jb2RlY19jdHhfdCogY29kZWMpIHsKLSAgICB2cHhfY29kZWNfZGVzdHJveShjb2RlYyk7Ci0gIH0KLX07Ci0KLS8vIFdyYXBwZXIgZnVuY3RvciBmb3IgdnB4X2ltZ19mcmVlKCkuCi1jbGFzcyBWcHhJbWdGcmVlSGVscGVyIHsKLSBwdWJsaWM6Ci0gIHZvaWQgb3BlcmF0b3IoKSh2cHhfaW1hZ2VfdCogaW1hZ2UpIHsKLSAgICB2cHhfaW1nX2ZyZWUoaW1hZ2UpOwotICB9Ci19OwotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1uYW1lc3BhY2UgY2hyb21lb3MgewotCi1XZWJtRW5jb2Rlcjo6V2VibUVuY29kZXIoY29uc3QgRmlsZVBhdGgmIG91dHB1dF9wYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVhbHRpbWUpCi0gICAgOiBiaXRyYXRlXyhiaXRyYXRlKSwKLSAgICAgIGRlYWRsaW5lXyhyZWFsdGltZSA/IFZQWF9ETF9SRUFMVElNRSA6IFZQWF9ETF9HT09EX1FVQUxJVFkpLAotICAgICAgb3V0cHV0X3BhdGhfKG91dHB1dF9wYXRoKSwKLSAgICAgIGhhc19lcnJvcnNfKGZhbHNlKSB7Ci0gIGVibWxfd3JpdGVyXy53cml0ZV9jYiA9IGJhc2U6OkJpbmQoCi0gICAgICAmV2VibUVuY29kZXI6OkVibWxXcml0ZSwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSk7Ci0gIGVibWxfd3JpdGVyXy5zZXJpYWxpemVfY2IgPSBiYXNlOjpCaW5kKAotICAgICAgJldlYm1FbmNvZGVyOjpFYm1sU2VyaWFsaXplLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKTsKLX0KLQotV2VibUVuY29kZXI6On5XZWJtRW5jb2RlcigpIHsKLX0KLQotYm9vbCBXZWJtRW5jb2Rlcjo6RW5jb2RlRnJvbVNwcml0ZShjb25zdCBTa0JpdG1hcCYgc3ByaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnBzX24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcHNfZCkgewotICBEQ0hFQ0soIXNwcml0ZS5pc051bGwoKSk7Ci0gIERDSEVDSyghc3ByaXRlLmVtcHR5KCkpOwotCi0gIGhhc19lcnJvcnNfID0gZmFsc2U7Ci0gIHdpZHRoXyA9IHNwcml0ZS53aWR0aCgpOwotICBoZWlnaHRfID0gc3ByaXRlLndpZHRoKCk7Ci0gIGZwc18ubnVtID0gZnBzX247Ci0gIGZwc18uZGVuID0gZnBzX2Q7Ci0KLSAgLy8gU3ByaXRlIGlzIHRpbGVkIHZlcnRpY2FsbHkuCi0gIGZyYW1lX2NvdW50XyA9IHNwcml0ZS5oZWlnaHQoKSAvIHdpZHRoXzsKLQotICB2cHhfaW1hZ2VfdCBpbWFnZTsKLSAgdnB4X2ltZ19hbGxvYygmaW1hZ2UsIFZQWF9JTUdfRk1UX0k0MjAsIHdpZHRoXywgaGVpZ2h0XywgMTYpOwotICAvLyBFbnN1cmUgdGhhdCBpbWFnZSBpcyBmcmVlZCBhZnRlciByZXR1cm4uCi0gIFNjb3BlZEdlbmVyaWNPYmo8dnB4X2ltYWdlX3QqLCBWcHhJbWdGcmVlSGVscGVyPiBpbWFnZV9wdHIoJmltYWdlKTsKLQotICBjb25zdCB2cHhfY29kZWNfaWZhY2VfdCogY29kZWNfaWZhY2UgPSB2cHhfY29kZWNfdnA4X2N4KCk7Ci0gIERDSEVDSyhjb2RlY19pZmFjZSk7Ci0gIHZweF9jb2RlY19lcnJfdCByZXQgPSB2cHhfY29kZWNfZW5jX2NvbmZpZ19kZWZhdWx0KGNvZGVjX2lmYWNlLCAmY29uZmlnXywgMCk7Ci0gIERDSEVDS19FUShWUFhfQ09ERUNfT0ssIHJldCk7Ci0KLSAgY29uZmlnXy5yY190YXJnZXRfYml0cmF0ZSA9IGJpdHJhdGVfOwotICBjb25maWdfLmdfdyA9IHdpZHRoXzsKLSAgY29uZmlnXy5nX2ggPSBoZWlnaHRfOwotICBjb25maWdfLmdfcGFzcyA9IFZQWF9SQ19PTkVfUEFTUzsKLSAgY29uZmlnXy5nX3Byb2ZpbGUgPSAwOyAgICAgICAgICAvLyBEZWZhdWx0IHByb2ZpbGUuCi0gIGNvbmZpZ18uZ190aHJlYWRzID0ga051bUVuY29kZXJUaHJlYWRzOwotICBjb25maWdfLnJjX21pbl9xdWFudGl6ZXIgPSAwOwotICBjb25maWdfLnJjX21heF9xdWFudGl6ZXIgPSA2MzsgIC8vIE1heGltdW0gcG9zc2libGUgcmFuZ2UuCi0gIGNvbmZpZ18uZ190aW1lYmFzZS5udW0gPSBmcHNfLmRlbjsKLSAgY29uZmlnXy5nX3RpbWViYXNlLmRlbiA9IGZwc18ubnVtOwotICBjb25maWdfLmtmX21vZGUgPSBWUFhfS0ZfQVVUTzsgIC8vIEF1dG8ga2V5IGZyYW1lcy4KLQotICB2cHhfY29kZWNfY3R4X3QgY29kZWM7Ci0gIHJldCA9IHZweF9jb2RlY19lbmNfaW5pdCgmY29kZWMsIGNvZGVjX2lmYWNlLCAmY29uZmlnXywgMCk7Ci0gIGlmIChyZXQgIT0gVlBYX0NPREVDX09LKQotICAgIHJldHVybiBmYWxzZTsKLSAgLy8gRW5zdXJlIHRoYXQgY29kZWMgY29udGV4dCBpcyBmcmVlZCBhZnRlciByZXR1cm4uCi0gIFNjb3BlZEdlbmVyaWNPYmo8dnB4X2NvZGVjX2N0eF90KiwgVnB4Q29kZWNEZXN0cm95SGVscGVyPiBjb2RlY19wdHIoJmNvZGVjKTsKLQotICBTa0F1dG9Mb2NrUGl4ZWxzIGxvY2tfc3ByaXRlKHNwcml0ZSk7Ci0KLSAgY29uc3QgdWludDgqIHNyYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihzcHJpdGUuZ2V0QWRkcjMyKDAsIDApKTsKLSAgc2l6ZV90IHNyY19mcmFtZV9zaXplID0gc3ByaXRlLmdldFNpemUoKTsKLSAgaW50IGNyb3BfeSA9IDA7Ci0KLSAgaWYgKCFXcml0ZVdlYm1IZWFkZXIoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChzaXplX3QgZnJhbWUgPSAwOyBmcmFtZSA8IGZyYW1lX2NvdW50XyAmJiAhaGFzX2Vycm9yc187ICsrZnJhbWUpIHsKLSAgICBpbnQgcmVzID0gbGlieXV2OjpDb252ZXJ0VG9JNDIwKAotICAgICAgICBzcmMsIHNyY19mcmFtZV9zaXplLAotICAgICAgICBpbWFnZS5wbGFuZXNbVlBYX1BMQU5FX1ldLCBpbWFnZS5zdHJpZGVbVlBYX1BMQU5FX1ldLAotICAgICAgICBpbWFnZS5wbGFuZXNbVlBYX1BMQU5FX1VdLCBpbWFnZS5zdHJpZGVbVlBYX1BMQU5FX1VdLAotICAgICAgICBpbWFnZS5wbGFuZXNbVlBYX1BMQU5FX1ZdLCBpbWFnZS5zdHJpZGVbVlBYX1BMQU5FX1ZdLAotICAgICAgICAwLCBjcm9wX3ksICAgICAgICAgICAgICAgIC8vIHNyYyBvcmlnaW4KLSAgICAgICAgd2lkdGhfLCBzcHJpdGUuaGVpZ2h0KCksICAvLyBzcmMgc2l6ZQotICAgICAgICB3aWR0aF8sIGhlaWdodF8sICAgICAgICAgIC8vIGRlc3Qgc2l6ZQotICAgICAgICBsaWJ5dXY6OmtSb3RhdGUwLAotICAgICAgICBsaWJ5dXY6OkZPVVJDQ19BUkdCKTsKLSAgICBpZiAocmVzKSB7Ci0gICAgICBoYXNfZXJyb3JzXyA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY3JvcF95ICs9IGhlaWdodF87Ci0KLSAgICByZXQgPSB2cHhfY29kZWNfZW5jb2RlKCZjb2RlYywgJmltYWdlLCBmcmFtZSwgMSwgMCwgZGVhZGxpbmVfKTsKLSAgICBpZiAocmV0ICE9IFZQWF9DT0RFQ19PSykgewotICAgICAgaGFzX2Vycm9yc18gPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgdnB4X2NvZGVjX2l0ZXJfdCBpdGVyID0gTlVMTDsKLSAgICBjb25zdCB2cHhfY29kZWNfY3hfcGt0X3QqIHBhY2tldDsKLSAgICB3aGlsZSAoIWhhc19lcnJvcnNfICYmIChwYWNrZXQgPSB2cHhfY29kZWNfZ2V0X2N4X2RhdGEoJmNvZGVjLCAmaXRlcikpKSB7Ci0gICAgICBpZiAocGFja2V0LT5raW5kID09IFZQWF9DT0RFQ19DWF9GUkFNRV9QS1QpCi0gICAgICAgIFdyaXRlV2VibUJsb2NrKHBhY2tldCk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIFdyaXRlV2VibUZvb3RlcigpOwotfQotCi1ib29sIFdlYm1FbmNvZGVyOjpXcml0ZVdlYm1IZWFkZXIoKSB7Ci0gIG91dHB1dF8gPSBmaWxlX3V0aWw6Ok9wZW5GaWxlKG91dHB1dF9wYXRoXywgIndiIik7Ci0gIGlmICghb3V0cHV0XykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gR2xvYmFsIGhlYWRlci4KLSAgU3RhcnRTdWJFbGVtZW50KEVCTUwpOwotICB7Ci0gICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZCgmZWJtbF93cml0ZXJfLCBFQk1MVmVyc2lvbiwgMSk7Ci0gICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZCgmZWJtbF93cml0ZXJfLCBFQk1MUmVhZFZlcnNpb24sIDEpOwotICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoJmVibWxfd3JpdGVyXywgRUJNTE1heElETGVuZ3RoLCA0KTsKLSAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKCZlYm1sX3dyaXRlcl8sIEVCTUxNYXhTaXplTGVuZ3RoLCA4KTsKLSAgICBFYm1sX1NlcmlhbGl6ZVN0cmluZygmZWJtbF93cml0ZXJfLCBEb2NUeXBlLCAid2VibSIpOwotICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoJmVibWxfd3JpdGVyXywgRG9jVHlwZVZlcnNpb24sIDIpOwotICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoJmVibWxfd3JpdGVyXywgRG9jVHlwZVJlYWRWZXJzaW9uLCAyKTsKLSAgfQotICBFbmRTdWJFbGVtZW50KCk7ICAvLyBFQk1MCi0KLSAgLy8gU2luZ2xlIHNlZ21lbnQgd2l0aCBhIHZpZGVvIHRyYWNrLgotICBTdGFydFN1YkVsZW1lbnQoU2VnbWVudCk7Ci0gIHsKLSAgICBTdGFydFN1YkVsZW1lbnQoSW5mbyk7Ci0gICAgewotICAgICAgLy8gQWxsIHRpbWVjb2RlcyBpbiB0aGUgc2VnbWVudCB3aWxsIGJlIGV4cHJlc3NlZCBpbiBtaWxsaXNlY29uZHMuCi0gICAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKCZlYm1sX3dyaXRlcl8sIFRpbWVjb2RlU2NhbGUsIDEwMDAwMDApOwotICAgICAgZG91YmxlIGR1cmF0aW9uID0gMTAwMC4gKiBmcmFtZV9jb3VudF8gKiBmcHNfLmRlbiAvIGZwc18ubnVtOwotICAgICAgRWJtbF9TZXJpYWxpemVGbG9hdCgmZWJtbF93cml0ZXJfLCBTZWdtZW50X0R1cmF0aW9uLCBkdXJhdGlvbik7Ci0gICAgfQotICAgIEVuZFN1YkVsZW1lbnQoKTsgIC8vIEluZm8KLQotICAgIFN0YXJ0U3ViRWxlbWVudChUcmFja3MpOwotICAgIHsKLSAgICAgIFN0YXJ0U3ViRWxlbWVudChUcmFja0VudHJ5KTsKLSAgICAgIHsKLSAgICAgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZCgmZWJtbF93cml0ZXJfLCBUcmFja051bWJlciwgMSk7Ci0gICAgICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQzMigmZWJtbF93cml0ZXJfLCBUcmFja1VJRCwgMSk7Ci0gICAgICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoJmVibWxfd3JpdGVyXywgVHJhY2tUeXBlLCAxKTsgIC8vIFZpZGVvCi0gICAgICAgIEVibWxfU2VyaWFsaXplU3RyaW5nKCZlYm1sX3dyaXRlcl8sIENvZGVjSUQsICJWX1ZQOCIpOwotCi0gICAgICAgIFN0YXJ0U3ViRWxlbWVudChWaWRlbyk7Ci0gICAgICAgIHsKLSAgICAgICAgICBFYm1sX1NlcmlhbGl6ZVVuc2lnbmVkKCZlYm1sX3dyaXRlcl8sIFBpeGVsV2lkdGgsIHdpZHRoXyk7Ci0gICAgICAgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZCgmZWJtbF93cml0ZXJfLCBQaXhlbEhlaWdodCwgaGVpZ2h0Xyk7Ci0gICAgICAgICAgRWJtbF9TZXJpYWxpemVVbnNpZ25lZCgmZWJtbF93cml0ZXJfLCBTdGVyZW9Nb2RlLCAwKTsgIC8vIE1vbm8KLSAgICAgICAgICBmbG9hdCBmcHMgPSBzdGF0aWNfY2FzdDxmbG9hdD4oZnBzXy5udW0pIC8gZnBzXy5kZW47Ci0gICAgICAgICAgRWJtbF9TZXJpYWxpemVGbG9hdCgmZWJtbF93cml0ZXJfLCBGcmFtZVJhdGUsIGZwcyk7Ci0gICAgICAgIH0KLSAgICAgICAgRW5kU3ViRWxlbWVudCgpOyAgLy8gVmlkZW8KLSAgICAgIH0KLSAgICAgIEVuZFN1YkVsZW1lbnQoKTsgIC8vIFRyYWNrRW50cnkKLSAgICB9Ci0gICAgRW5kU3ViRWxlbWVudCgpOyAgLy8gVHJhY2tzCi0KLSAgICBTdGFydFN1YkVsZW1lbnQoQ2x1c3Rlcik7IHsKLSAgICAgIEVibWxfU2VyaWFsaXplVW5zaWduZWQoJmVibWxfd3JpdGVyXywgVGltZWNvZGUsIDApOwotICAgIH0gIC8vIENsdXN0ZXIgbGVmdCBvcGVuLgotICB9ICAvLyBTZWdtZW50IGxlZnQgb3Blbi4KLQotICAvLyBObyBjaGVjayBmb3IgfGhhc19lcnJvcnNffCBoZXJlIGJlY2F1c2UgfGZhbHNlfCBpcyBvbmx5IHJldHVybmVkIHdoZW4KLSAgLy8gb3BlbmluZyBmaWxlIGZhaWxzLgotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBXZWJtRW5jb2Rlcjo6V3JpdGVXZWJtQmxvY2soY29uc3QgdnB4X2NvZGVjX2N4X3BrdF90KiBwYWNrZXQpIHsKLSAgYm9vbCBpc19rZXlmcmFtZSA9IHBhY2tldC0+ZGF0YS5mcmFtZS5mbGFncyAmIFZQWF9GUkFNRV9JU19LRVk7Ci0gIGludDY0X3QgcHRzX21zID0gMTAwMCAqIHBhY2tldC0+ZGF0YS5mcmFtZS5wdHMgKiBmcHNfLmRlbiAvIGZwc18ubnVtOwotCi0gIERWTE9HKDEpIDw8ICJWaWRlbyBwYWNrZXQgQCIgPDwgcHRzX21zIDw8ICIgbXMgIgotICAgICAgICAgICA8PCBwYWNrZXQtPmRhdGEuZnJhbWUuc3ogPDwgIiBieXRlcyAiCi0gICAgICAgICAgIDw8IChpc19rZXlmcmFtZSA/ICJLIiA6ICIiKTsKLQotICBFYm1sX1dyaXRlSUQoJmVibWxfd3JpdGVyXywgU2ltcGxlQmxvY2spOwotCi0gIHVpbnQzMiBibG9ja19sZW5ndGggPSAocGFja2V0LT5kYXRhLmZyYW1lLnN6ICsgNCkgfCAweDEwMDAwMDAwOwotICBFYm1sU2VyaWFsaXplSGVscGVyKCZibG9ja19sZW5ndGgsIDQpOwotCi0gIHVpbnQ4IHRyYWNrX251bWJlciA9IDEgfCAweDgwOwotICBFYm1sU2VyaWFsaXplSGVscGVyKCZ0cmFja19udW1iZXIsIDEpOwotCi0gIEVibWxTZXJpYWxpemVIZWxwZXIoJnB0c19tcywgMik7Ci0KLSAgdWludDggZmxhZ3MgPSAwOwotICBpZiAoaXNfa2V5ZnJhbWUpCi0gICAgZmxhZ3MgfD0gMHg4MDsKLSAgaWYgKHBhY2tldC0+ZGF0YS5mcmFtZS5mbGFncyAmIFZQWF9GUkFNRV9JU19JTlZJU0lCTEUpCi0gICAgZmxhZ3MgfD0gMHgwODsKLSAgRWJtbFNlcmlhbGl6ZUhlbHBlcigmZmxhZ3MsIDEpOwotCi0gIEVibWxXcml0ZShwYWNrZXQtPmRhdGEuZnJhbWUuYnVmLCBwYWNrZXQtPmRhdGEuZnJhbWUuc3opOwotfQotCi1ib29sIFdlYm1FbmNvZGVyOjpXcml0ZVdlYm1Gb290ZXIoKSB7Ci0gIEVuZFN1YkVsZW1lbnQoKTsgIC8vIENsdXN0ZXIKLSAgRW5kU3ViRWxlbWVudCgpOyAgLy8gU2VnbWVudAotICBEQ0hFQ0soZWJtbF9zdWJfZWxlbWVudHNfLmVtcHR5KCkpOwotICByZXR1cm4gZmlsZV91dGlsOjpDbG9zZUZpbGUob3V0cHV0XykgJiYgIWhhc19lcnJvcnNfOwotfQotCi12b2lkIFdlYm1FbmNvZGVyOjpTdGFydFN1YkVsZW1lbnQodW5zaWduZWQgbG9uZyBjbGFzc19pZCkgewotICBFYm1sX1dyaXRlSUQoJmVibWxfd3JpdGVyXywgY2xhc3NfaWQpOwotICBlYm1sX3N1Yl9lbGVtZW50c18ucHVzaChmdGVsbChvdXRwdXRfKSk7Ci0gIHN0YXRpYyBjb25zdCB1aW50NjRfdCBrVW5rbm93bkxlbiA9IDB4MDFGRkZGRkZGRkZGRkZGRkxMVTsKLSAgRWJtbFNlcmlhbGl6ZUhlbHBlcigma1Vua25vd25MZW4sIDgpOwotfQotCi12b2lkIFdlYm1FbmNvZGVyOjpFbmRTdWJFbGVtZW50KCkgewotICBEQ0hFQ0soIWVibWxfc3ViX2VsZW1lbnRzXy5lbXB0eSgpKTsKLQotICBsb25nIGludCBlbmRfcG9zID0gZnRlbGwob3V0cHV0Xyk7Ci0gIGxvbmcgaW50IHN0YXJ0X3BvcyA9IGVibWxfc3ViX2VsZW1lbnRzXy50b3AoKTsKLSAgZWJtbF9zdWJfZWxlbWVudHNfLnBvcCgpOwotCi0gIHVpbnQ2NF90IHNpemUgPSAoZW5kX3BvcyAtIHN0YXJ0X3BvcyAtIDgpIHwgMHgwMTAwMDAwMDAwMDAwMDAwVUxMOwotICAvLyBTZWVrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN1Yi1lbGVtZW50IGFuZCBwYXRjaCBpbiB0aGUgY2FsY3VsYXRlZCBzaXplLgotICBpZiAoZnNlZWsob3V0cHV0Xywgc3RhcnRfcG9zLCBTRUVLX1NFVCkpIHsKLSAgICBoYXNfZXJyb3JzXyA9IHRydWU7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRXJyb3Igd3JpdGluZyB0byAiIDw8IG91dHB1dF9wYXRoXy52YWx1ZSgpOwotICB9Ci0gIEVibWxTZXJpYWxpemVIZWxwZXIoJnNpemUsIDgpOwotCi0gIC8vIFJlc3RvcmUgd3JpdGUgcG9zaXRpb24uCi0gIGlmIChmc2VlayhvdXRwdXRfLCBlbmRfcG9zLCBTRUVLX1NFVCkpIHsKLSAgICBoYXNfZXJyb3JzXyA9IHRydWU7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRXJyb3Igd3JpdGluZyB0byAiIDw8IG91dHB1dF9wYXRoXy52YWx1ZSgpOwotICB9Ci19Ci0KLXZvaWQgV2VibUVuY29kZXI6OkVibWxXcml0ZShjb25zdCB2b2lkKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsZW4pIHsKLSAgaWYgKGZ3cml0ZShidWZmZXIsIDEsIGxlbiwgb3V0cHV0XykgIT0gbGVuKSB7Ci0gICAgaGFzX2Vycm9yc18gPSB0cnVlOwotICAgIExPRyhFUlJPUikgPDwgIkVycm9yIHdyaXRpbmcgdG8gIiA8PCBvdXRwdXRfcGF0aF8udmFsdWUoKTsKLSAgfQotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLXZvaWQgV2VibUVuY29kZXI6OkVibWxTZXJpYWxpemVIZWxwZXIoY29uc3QgVCogYnVmZmVyLCB1bnNpZ25lZCBsb25nIGxlbikgewotICBmb3IgKGludCBpID0gbGVuIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICB1aW50OCBjID0gKmJ1ZmZlciA+PiAoaSAqIENIQVJfQklUKTsKLSAgICBFYm1sV3JpdGUoJmMsIDEpOwotICB9Ci19Ci0KLXZvaWQgV2VibUVuY29kZXI6OkVibWxTZXJpYWxpemUoY29uc3Qgdm9pZCogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmZmVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbGVuKSB7Ci0gIHN3aXRjaCAoYnVmZmVyX3NpemUpIHsKLSAgICBjYXNlIDE6Ci0gICAgICByZXR1cm4gRWJtbFNlcmlhbGl6ZUhlbHBlcihzdGF0aWNfY2FzdDxjb25zdCBpbnQ4X3QqPihidWZmZXIpLCBsZW4pOwotICAgIGNhc2UgMjoKLSAgICAgIHJldHVybiBFYm1sU2VyaWFsaXplSGVscGVyKHN0YXRpY19jYXN0PGNvbnN0IGludDE2X3QqPihidWZmZXIpLCBsZW4pOwotICAgIGNhc2UgNDoKLSAgICAgIHJldHVybiBFYm1sU2VyaWFsaXplSGVscGVyKHN0YXRpY19jYXN0PGNvbnN0IGludDMyX3QqPihidWZmZXIpLCBsZW4pOwotICAgIGNhc2UgODoKLSAgICAgIHJldHVybiBFYm1sU2VyaWFsaXplSGVscGVyKHN0YXRpY19jYXN0PGNvbnN0IGludDY0X3QqPihidWZmZXIpLCBsZW4pOwotICAgIGRlZmF1bHQ6Ci0gICAgICBOT1RSRUFDSEVEKCkgPDwgIkludmFsaWQgRWJtbFNlcmlhbGl6ZSBsZW5ndGg6ICIgPDwgbGVuOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBjaHJvbWVvcwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS93ZWJtL2Nocm9tZW9zL3dlYm1fZW5jb2Rlci5oIGIvc3JjL21lZGlhL3dlYm0vY2hyb21lb3Mvd2VibV9lbmNvZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMWEwYjAuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3dlYm0vY2hyb21lb3Mvd2VibV9lbmNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9XRUJNX0NIUk9NRU9TX1dFQk1fRU5DT0RFUl9IXwotI2RlZmluZSBNRURJQV9XRUJNX0NIUk9NRU9TX1dFQk1fRU5DT0RFUl9IXwotCi0jaW5jbHVkZSA8c3RhY2s+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImJhc2UvZmlsZV9wYXRoLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCIKLSNpbmNsdWRlICJtZWRpYS93ZWJtL2Nocm9tZW9zL2VibWxfd3JpdGVyLmgiCi0KLWV4dGVybiAiQyIgewotI2RlZmluZSBWUFhfQ09ERUNfRElTQUJMRV9DT01QQVQgMQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xpYnZweC9saWJ2cHguaCIKLX0KLQotY2xhc3MgRmlsZVBhdGg7Ci1jbGFzcyBTa0JpdG1hcDsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotbmFtZXNwYWNlIGNocm9tZW9zIHsKLQotLy8gV2ViTSBlbmNvZGVyIHVzaW5nIGxpYnZweC4gQ3VycmVudGx5IG9ubHkgc3VwcG9ydHMgb25lLXBhc3MsIGNvbnN0YW50IGJpdHJhdGUKLS8vIGVuY29kaW5nIG9mIHNob3J0IGZpbGVzIGNvbnNpc3Rpbmcgb2YgYSBzaW5nbGUgdmlkZW8gdHJhY2suIFNlZWsgaW5mbyBhbmQKLS8vIGN1ZXMgYXJlIG5vdCBzdXBwb3J0ZWQsIHNvIGdlbmVyYXRlZCAud2VibSBmaWxlIGRvZXMgbm90IHN0cmljdGx5IGFkaGVyZSB0bwotLy8gV2ViTSBzdGFuZGFyZCAoaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvY29kZS9zcGVjcy9jb250YWluZXIvKS4KLWNsYXNzIE1FRElBX0VYUE9SVCBXZWJtRW5jb2RlciB7Ci0gcHVibGljOgotICAvLyBDcmVhdGUgbmV3IGluc3RhbmNlIGZvciB3cml0aW5nIHRvIHxvdXRwdXRfcGF0aHwuIElmIHxyZWFsdGltZXwgaXMgfHRydWV8LAotICAvLyB1c2VzIHJlYWx0aW1lIGRlYWRsaW5lLCBvdGhlcndpc2UgLSAiZ29vZCBxdWFsaXR5IiBkZWFkbGluZS4KLSAgV2VibUVuY29kZXIoY29uc3QgRmlsZVBhdGgmIG91dHB1dF9wYXRoLCBpbnQgYml0cmF0ZSwgYm9vbCByZWFsdGltZSk7Ci0gIH5XZWJtRW5jb2RlcigpOwotCi0gIC8vIEVuY29kZXMgdmlkZW8gZnJvbSBhIE54KE4qTSkgc3ByaXRlLCBoYXZpbmcgTSBmcmFtZXMgb2Ygc2l6ZSBOeE4gd2l0aCBGUFMKLSAgLy8gfGZwc19uL2Zwc19kfC4gTXVzdCBiZSBjYWxsZWQgb24gYSB0aHJlYWQgdGhhdCBhbGxvd3MgZGlzayBJTy4KLSAgLy8gUmV0dXJucyB8dHJ1ZXwgaWZmIGVuY29kaW5nIGFuZCB3cml0aW5nIHRvIGZpbGUgaXMgc3VjY2Vzc2Z1bC4KLSAgYm9vbCBFbmNvZGVGcm9tU3ByaXRlKGNvbnN0IFNrQml0bWFwJiBzcHJpdGUsIGludCBmcHNfbiwgaW50IGZwc19kKTsKLQotIHByaXZhdGU6Ci0gIC8vIFdyaXRlcyBnbG9iYWwgV2ViTSBoZWFkZXIgYW5kIHN0YXJ0cyBhIHNpbmdsZSB2aWRlbyB0cmFjay4gUmV0dXJucyB8ZmFsc2V8Ci0gIC8vIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBvcGVuaW5nIGZpbGUgZm9yIHdyaXRpbmcuCi0gIGJvb2wgV3JpdGVXZWJtSGVhZGVyKCk7Ci0KLSAgLy8gV3JpdGVzIFZQWCBwYWNrZXQgdG8gb3V0cHV0IGZpbGUuCi0gIHZvaWQgV3JpdGVXZWJtQmxvY2soY29uc3QgdnB4X2NvZGVjX2N4X3BrdF90KiBwYWNrZXQpOwotCi0gIC8vIEZpbmlzaGVzIHZpZGVvIHRyYWNrIGFuZCBjbG9zZXMgb3V0cHV0IGZpbGUuIFJldHVybnMgfGZhbHNlfCBpZiB0aGVyZSB3ZXJlCi0gIC8vIGFueSBlcnJvciBkdXJpbmcgZW5jb2Rpbmcvd3JpdGluZyBmaWxlLgotICBib29sIFdyaXRlV2VibUZvb3RlcigpOwotCi0gIC8vIFN0YXJ0cyBhIG5ldyBXZWJNIHN1Yi1lbGVtZW50IG9mIGdpdmVuIHR5cGUuIFRob3NlIGNhbiBiZSBuZXN0ZWQuCi0gIHZvaWQgU3RhcnRTdWJFbGVtZW50KHVuc2lnbmVkIGxvbmcgY2xhc3NfaWQpOwotCi0gIC8vIENsb3NlcyBjdXJyZW50IHRvcC1sZXZlbCBzdWItZWxlbWVudC4KLSAgdm9pZCBFbmRTdWJFbGVtZW50KCk7Ci0KLSAgLy8gbGlibWt2IGNhbGxiYWNrcy4KLSAgdm9pZCBFYm1sV3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCB1bnNpZ25lZCBsb25nIGxlbik7Ci0gIHZvaWQgRWJtbFNlcmlhbGl6ZShjb25zdCB2b2lkKiBidWZmZXIsIGludCBidWZmZXJfc2l6ZSwgdW5zaWduZWQgbG9uZyBsZW4pOwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICB2b2lkIEVibWxTZXJpYWxpemVIZWxwZXIoY29uc3QgVCogYnVmZmVyLCB1bnNpZ25lZCBsb25nIGxlbik7Ci0KLSAgLy8gVmlkZW8gZGltZW5zaW9ucyBhbmQgRlBTLgotICBzaXplX3Qgd2lkdGhfOwotICBzaXplX3QgaGVpZ2h0XzsKLSAgdnB4X3JhdGlvbmFsX3QgZnBzXzsKLQotICAvLyBOdW1iZXIgb2YgZnJhbWVzIGluIHZpZGVvLgotICBzaXplX3QgZnJhbWVfY291bnRfOwotCi0gIC8vIFZQWCBjb25maWcgaW4gdXNlLgotICB2cHhfY29kZWNfZW5jX2NmZ190IGNvbmZpZ187Ci0KLSAgLy8gVlBYIHBhcmFtZXRlcnMuCi0gIGludCBiaXRyYXRlXzsKLSAgdW5zaWduZWQgbG9uZyBkZWFkbGluZV87Ci0KLSAgLy8gRWJtbFdyaXRlciBjb250ZXh0LgotICBFYm1sR2xvYmFsIGVibWxfd3JpdGVyXzsKLQotICAvLyBTdGFjayB3aXRoIHN0YXJ0IG9mZnNldHMgb2YgY3VycmVudGx5IG9wZW4gc3ViLWVsZW1lbnRzLgotICBzdGQ6OnN0YWNrPGxvbmcgaW50PiBlYm1sX3N1Yl9lbGVtZW50c187Ci0KLSAgRmlsZVBhdGggb3V0cHV0X3BhdGhfOwotICBGSUxFKiBvdXRwdXRfOwotCi0gIC8vIFRydWUgaWYgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBlbmNvZGluZy93cml0aW5nIHRvIGZpbGUuCi0gIGJvb2wgaGFzX2Vycm9yc187Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFdlYm1FbmNvZGVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBjaHJvbWVvcwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9XRUJNX0NIUk9NRU9TX1dFQk1fRU5DT0RFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3dlYm0vY2x1c3Rlcl9idWlsZGVyLmNjIGIvc3JjL21lZGlhL3dlYm0vY2x1c3Rlcl9idWlsZGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzM3N2E2Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS93ZWJtL2NsdXN0ZXJfYnVpbGRlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvd2VibS9jbHVzdGVyX2J1aWxkZXIuaCIKLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGF0YV9idWZmZXIuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotc3RhdGljIGNvbnN0IHVpbnQ4IGtDbHVzdGVySGVhZGVyW10gPSB7Ci0gIDB4MUYsIDB4NDMsIDB4QjYsIDB4NzUsICAvLyBDTFVTVEVSIElECi0gIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyBjbHVzdGVyKHNpemUgPSAwKQotICAweEU3LCAgLy8gVGltZWNvZGUgSUQKLSAgMHg4OCwgIC8vIHRpbWVjb2RlKHNpemU9OCkKLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIHRpbWVjb2RlIHZhbHVlCi19OwotCi1zdGF0aWMgY29uc3QgdWludDgga1NpbXBsZUJsb2NrSGVhZGVyW10gPSB7Ci0gIDB4QTMsICAvLyBTaW1wbGVCbG9jayBJRAotICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gU2ltcGxlQmxvY2soc2l6ZSA9IDApCi19OwotCi1zdGF0aWMgY29uc3QgdWludDgga0Jsb2NrR3JvdXBIZWFkZXJbXSA9IHsKLSAgMHhBMCwgIC8vIEJsb2NrR3JvdXAgSUQKLSAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIEJsb2NrR3JvdXAoc2l6ZSA9IDApCi0gIDB4OUIsICAvLyBCbG9ja0R1cmF0aW9uIElECi0gIDB4ODgsICAvLyBCbG9ja0R1cmF0aW9uKHNpemUgPSA4KQotICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gZHVyYXRpb24KLSAgMHhBMSwgIC8vIEJsb2NrIElECi0gIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyBCbG9jayhzaXplID0gMCkKLX07Ci0KLWVudW0gewotICBrQ2x1c3RlclNpemVPZmZzZXQgPSA0LAotICBrQ2x1c3RlclRpbWVjb2RlT2Zmc2V0ID0gMTQsCi0KLSAga1NpbXBsZUJsb2NrU2l6ZU9mZnNldCA9IDEsCi0KLSAga0Jsb2NrR3JvdXBTaXplT2Zmc2V0ID0gMSwKLSAga0Jsb2NrR3JvdXBEdXJhdGlvbk9mZnNldCA9IDExLAotICBrQmxvY2tHcm91cEJsb2NrU2l6ZU9mZnNldCA9IDIwLAotCi0gIGtJbml0aWFsQnVmZmVyU2l6ZSA9IDMyNzY4LAotfTsKLQotQ2x1c3Rlcjo6Q2x1c3RlcihzY29wZWRfYXJyYXk8dWludDg+IGRhdGEsIGludCBzaXplKQotICAgIDogZGF0YV8oZGF0YS5QYXNzKCkpLCBzaXplXyhzaXplKSB7fQotQ2x1c3Rlcjo6fkNsdXN0ZXIoKSB7fQotCi1DbHVzdGVyQnVpbGRlcjo6Q2x1c3RlckJ1aWxkZXIoKSB7IFJlc2V0KCk7IH0KLUNsdXN0ZXJCdWlsZGVyOjp+Q2x1c3RlckJ1aWxkZXIoKSB7fQotCi12b2lkIENsdXN0ZXJCdWlsZGVyOjpTZXRDbHVzdGVyVGltZWNvZGUoaW50NjQgY2x1c3Rlcl90aW1lY29kZSkgewotICBEQ0hFQ0tfRVEoY2x1c3Rlcl90aW1lY29kZV8sIC0xKTsKLQotICBjbHVzdGVyX3RpbWVjb2RlXyA9IGNsdXN0ZXJfdGltZWNvZGU7Ci0KLSAgLy8gV3JpdGUgdGhlIHRpbWVjb2RlIGludG8gdGhlIGhlYWRlci4KLSAgdWludDgqIGJ1ZiA9IGJ1ZmZlcl8uZ2V0KCkgKyBrQ2x1c3RlclRpbWVjb2RlT2Zmc2V0OwotICBmb3IgKGludCBpID0gNzsgaSA+PSAwOyAtLWkpIHsKLSAgICBidWZbaV0gPSBjbHVzdGVyX3RpbWVjb2RlICYgMHhmZjsKLSAgICBjbHVzdGVyX3RpbWVjb2RlID4+PSA4OwotICB9Ci19Ci0KLXZvaWQgQ2x1c3RlckJ1aWxkZXI6OkFkZFNpbXBsZUJsb2NrKGludCB0cmFja19udW0sIGludDY0IHRpbWVjb2RlLCBpbnQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogZGF0YSwgaW50IHNpemUpIHsKLSAgaW50IGJsb2NrX3NpemUgPSBzaXplICsgNDsKLSAgaW50IGJ5dGVzX25lZWRlZCA9IHNpemVvZihrU2ltcGxlQmxvY2tIZWFkZXIpICsgYmxvY2tfc2l6ZTsKLSAgaWYgKGJ5dGVzX25lZWRlZCA+IChidWZmZXJfc2l6ZV8gLSBieXRlc191c2VkXykpCi0gICAgRXh0ZW5kQnVmZmVyKGJ5dGVzX25lZWRlZCk7Ci0KLSAgdWludDgqIGJ1ZiA9IGJ1ZmZlcl8uZ2V0KCkgKyBieXRlc191c2VkXzsKLSAgaW50IGJsb2NrX29mZnNldCA9IGJ5dGVzX3VzZWRfOwotICBtZW1jcHkoYnVmLCBrU2ltcGxlQmxvY2tIZWFkZXIsIHNpemVvZihrU2ltcGxlQmxvY2tIZWFkZXIpKTsKLSAgVXBkYXRlVUludDY0KGJsb2NrX29mZnNldCArIGtTaW1wbGVCbG9ja1NpemVPZmZzZXQsIGJsb2NrX3NpemUpOwotICBidWYgKz0gc2l6ZW9mKGtTaW1wbGVCbG9ja0hlYWRlcik7Ci0KLSAgV3JpdGVCbG9jayhidWYsIHRyYWNrX251bSwgdGltZWNvZGUsIGZsYWdzLCBkYXRhLCBzaXplKTsKLQotICBieXRlc191c2VkXyArPSBieXRlc19uZWVkZWQ7Ci19Ci0KLXZvaWQgQ2x1c3RlckJ1aWxkZXI6OkFkZEJsb2NrR3JvdXAoaW50IHRyYWNrX251bSwgaW50NjQgdGltZWNvZGUsIGludCBkdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLCBjb25zdCB1aW50OCogZGF0YSwgaW50IHNpemUpIHsKLSAgaW50IGJsb2NrX3NpemUgPSBzaXplICsgNDsKLSAgaW50IGJ5dGVzX25lZWRlZCA9IHNpemVvZihrQmxvY2tHcm91cEhlYWRlcikgKyBibG9ja19zaXplOwotICBpbnQgYmxvY2tfZ3JvdXBfc2l6ZSA9IGJ5dGVzX25lZWRlZCAtIDk7Ci0KLSAgaWYgKGJ5dGVzX25lZWRlZCA+IChidWZmZXJfc2l6ZV8gLSBieXRlc191c2VkXykpCi0gICAgRXh0ZW5kQnVmZmVyKGJ5dGVzX25lZWRlZCk7Ci0KLSAgdWludDgqIGJ1ZiA9IGJ1ZmZlcl8uZ2V0KCkgKyBieXRlc191c2VkXzsKLSAgaW50IGJsb2NrX2dyb3VwX29mZnNldCA9IGJ5dGVzX3VzZWRfOwotICBtZW1jcHkoYnVmLCBrQmxvY2tHcm91cEhlYWRlciwgc2l6ZW9mKGtCbG9ja0dyb3VwSGVhZGVyKSk7Ci0gIFVwZGF0ZVVJbnQ2NChibG9ja19ncm91cF9vZmZzZXQgKyBrQmxvY2tHcm91cFNpemVPZmZzZXQsIGJsb2NrX2dyb3VwX3NpemUpOwotICBVcGRhdGVVSW50NjQoYmxvY2tfZ3JvdXBfb2Zmc2V0ICsga0Jsb2NrR3JvdXBEdXJhdGlvbk9mZnNldCwgZHVyYXRpb24pOwotICBVcGRhdGVVSW50NjQoYmxvY2tfZ3JvdXBfb2Zmc2V0ICsga0Jsb2NrR3JvdXBCbG9ja1NpemVPZmZzZXQsIGJsb2NrX3NpemUpOwotICBidWYgKz0gc2l6ZW9mKGtCbG9ja0dyb3VwSGVhZGVyKTsKLQotICBXcml0ZUJsb2NrKGJ1ZiwgdHJhY2tfbnVtLCB0aW1lY29kZSwgZmxhZ3MsIGRhdGEsIHNpemUpOwotCi0gIGJ5dGVzX3VzZWRfICs9IGJ5dGVzX25lZWRlZDsKLX0KLQotdm9pZCBDbHVzdGVyQnVpbGRlcjo6V3JpdGVCbG9jayh1aW50OCogYnVmLCBpbnQgdHJhY2tfbnVtLCBpbnQ2NCB0aW1lY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLCBjb25zdCB1aW50OCogZGF0YSwgaW50IHNpemUpIHsKLSAgRENIRUNLX0dFKHRyYWNrX251bSwgMCk7Ci0gIERDSEVDS19MRSh0cmFja19udW0sIDEyNik7Ci0gIERDSEVDS19HRShmbGFncywgMCk7Ci0gIERDSEVDS19MRShmbGFncywgMHhmZik7Ci0gIERDSEVDSyhkYXRhKTsKLSAgRENIRUNLX0dUKHNpemUsIDApOwotICBEQ0hFQ0tfTkUoY2x1c3Rlcl90aW1lY29kZV8sIC0xKTsKLQotICBpbnQ2NCB0aW1lY29kZV9kZWx0YSA9IHRpbWVjb2RlIC0gY2x1c3Rlcl90aW1lY29kZV87Ci0gIERDSEVDS19HRSh0aW1lY29kZV9kZWx0YSwgLTMyNzY4KTsKLSAgRENIRUNLX0xFKHRpbWVjb2RlX2RlbHRhLCAzMjc2Nyk7Ci0KLSAgYnVmWzBdID0gMHg4MCB8ICh0cmFja19udW0gJiAweDdGKTsKLSAgYnVmWzFdID0gKHRpbWVjb2RlX2RlbHRhID4+IDgpICYgMHhmZjsKLSAgYnVmWzJdID0gdGltZWNvZGVfZGVsdGEgJiAweGZmOwotICBidWZbM10gPSBmbGFncyAmIDB4ZmY7Ci0gIG1lbWNweShidWYgKyA0LCBkYXRhLCBzaXplKTsKLX0KLQotc2NvcGVkX3B0cjxDbHVzdGVyPiBDbHVzdGVyQnVpbGRlcjo6RmluaXNoKCkgewotICBEQ0hFQ0tfTkUoY2x1c3Rlcl90aW1lY29kZV8sIC0xKTsKLQotICBVcGRhdGVVSW50NjQoa0NsdXN0ZXJTaXplT2Zmc2V0LCBieXRlc191c2VkXyAtIChrQ2x1c3RlclNpemVPZmZzZXQgKyA4KSk7Ci0KLSAgc2NvcGVkX3B0cjxDbHVzdGVyPiByZXQobmV3IENsdXN0ZXIoYnVmZmVyXy5QYXNzKCksIGJ5dGVzX3VzZWRfKSk7Ci0gIFJlc2V0KCk7Ci0gIHJldHVybiByZXQuUGFzcygpOwotfQotCi12b2lkIENsdXN0ZXJCdWlsZGVyOjpSZXNldCgpIHsKLSAgYnVmZmVyX3NpemVfID0ga0luaXRpYWxCdWZmZXJTaXplOwotICBidWZmZXJfLnJlc2V0KG5ldyB1aW50OFtidWZmZXJfc2l6ZV9dKTsKLSAgbWVtY3B5KGJ1ZmZlcl8uZ2V0KCksIGtDbHVzdGVySGVhZGVyLCBzaXplb2Yoa0NsdXN0ZXJIZWFkZXIpKTsKLSAgYnl0ZXNfdXNlZF8gPSBzaXplb2Yoa0NsdXN0ZXJIZWFkZXIpOwotICBjbHVzdGVyX3RpbWVjb2RlXyA9IC0xOwotfQotCi12b2lkIENsdXN0ZXJCdWlsZGVyOjpFeHRlbmRCdWZmZXIoaW50IGJ5dGVzX25lZWRlZCkgewotICBpbnQgbmV3X2J1ZmZlcl9zaXplID0gMiAqIGJ1ZmZlcl9zaXplXzsKLQotICB3aGlsZSAoKG5ld19idWZmZXJfc2l6ZSAtIGJ5dGVzX3VzZWRfKSA8IGJ5dGVzX25lZWRlZCkKLSAgICBuZXdfYnVmZmVyX3NpemUgKj0gMjsKLQotICBzY29wZWRfYXJyYXk8dWludDg+IG5ld19idWZmZXIobmV3IHVpbnQ4W25ld19idWZmZXJfc2l6ZV0pOwotCi0gIG1lbWNweShuZXdfYnVmZmVyLmdldCgpLCBidWZmZXJfLmdldCgpLCBieXRlc191c2VkXyk7Ci0gIGJ1ZmZlcl8ucmVzZXQobmV3X2J1ZmZlci5yZWxlYXNlKCkpOwotICBidWZmZXJfc2l6ZV8gPSBuZXdfYnVmZmVyX3NpemU7Ci19Ci0KLXZvaWQgQ2x1c3RlckJ1aWxkZXI6OlVwZGF0ZVVJbnQ2NChpbnQgb2Zmc2V0LCBpbnQ2NCB2YWx1ZSkgewotICBEQ0hFQ0tfTEUob2Zmc2V0ICsgNywgYnVmZmVyX3NpemVfKTsKLSAgdWludDgqIGJ1ZiA9IGJ1ZmZlcl8uZ2V0KCkgKyBvZmZzZXQ7Ci0KLSAgLy8gRmlsbCB0aGUgbGFzdCA3IGJ5dGVzIG9mIHNpemUgZmllbGQgaW4gYmlnLWVuZGlhbiBvcmRlci4KLSAgZm9yIChpbnQgaSA9IDc7IGkgPiAwOyBpLS0pIHsKLSAgICBidWZbaV0gPSB2YWx1ZSAmIDB4ZmY7Ci0gICAgdmFsdWUgPj49IDg7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvd2VibS9jbHVzdGVyX2J1aWxkZXIuaCBiL3NyYy9tZWRpYS93ZWJtL2NsdXN0ZXJfYnVpbGRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDQ3NTk5Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS93ZWJtL2NsdXN0ZXJfYnVpbGRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9XRUJNX0NMVVNURVJfQlVJTERFUl9IXwotI2RlZmluZSBNRURJQV9XRUJNX0NMVVNURVJfQlVJTERFUl9IXwotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYnVmZmVycy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBDbHVzdGVyIHsKLSBwdWJsaWM6Ci0gIENsdXN0ZXIoc2NvcGVkX2FycmF5PHVpbnQ4PiBkYXRhLCBpbnQgc2l6ZSk7Ci0gIH5DbHVzdGVyKCk7Ci0KLSAgY29uc3QgdWludDgqIGRhdGEoKSBjb25zdCB7IHJldHVybiBkYXRhXy5nZXQoKTsgfQotICBpbnQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVfOyB9Ci0KLSBwcml2YXRlOgotICBzY29wZWRfYXJyYXk8dWludDg+IGRhdGFfOwotICBpbnQgc2l6ZV87Ci0KLSAgRElTQUxMT1dfSU1QTElDSVRfQ09OU1RSVUNUT1JTKENsdXN0ZXIpOwotfTsKLQotY2xhc3MgQ2x1c3RlckJ1aWxkZXIgewotIHB1YmxpYzoKLSAgQ2x1c3RlckJ1aWxkZXIoKTsKLSAgfkNsdXN0ZXJCdWlsZGVyKCk7Ci0KLSAgdm9pZCBTZXRDbHVzdGVyVGltZWNvZGUoaW50NjQgY2x1c3Rlcl90aW1lY29kZSk7Ci0gIHZvaWQgQWRkU2ltcGxlQmxvY2soaW50IHRyYWNrX251bSwgaW50NjQgdGltZWNvZGUsIGludCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogZGF0YSwgaW50IHNpemUpOwotICB2b2lkIEFkZEJsb2NrR3JvdXAoaW50IHRyYWNrX251bSwgaW50NjQgdGltZWNvZGUsIGludCBkdXJhdGlvbiwgaW50IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIGRhdGEsIGludCBzaXplKTsKLQotICBzY29wZWRfcHRyPENsdXN0ZXI+IEZpbmlzaCgpOwotCi0gcHJpdmF0ZToKLSAgdm9pZCBSZXNldCgpOwotICB2b2lkIEV4dGVuZEJ1ZmZlcihpbnQgYnl0ZXNfbmVlZGVkKTsKLSAgdm9pZCBVcGRhdGVVSW50NjQoaW50IG9mZnNldCwgaW50NjQgdmFsdWUpOwotICB2b2lkIFdyaXRlQmxvY2sodWludDgqIGJ1ZiwgaW50IHRyYWNrX251bSwgaW50NjQgdGltZWNvZGUsIGludCBmbGFncywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBkYXRhLCBpbnQgc2l6ZSk7Ci0KLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiBidWZmZXJfOwotICBpbnQgYnVmZmVyX3NpemVfOwotICBpbnQgYnl0ZXNfdXNlZF87Ci0gIGludDY0IGNsdXN0ZXJfdGltZWNvZGVfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihDbHVzdGVyQnVpbGRlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9XRUJNX0NMVVNURVJfQlVJTERFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3dlYm0vd2VibV9hdWRpb19jbGllbnQuY2MgYi9zcmMvbWVkaWEvd2VibS93ZWJtX2F1ZGlvX2NsaWVudC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZmN2ZkNi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvd2VibS93ZWJtX2F1ZGlvX2NsaWVudC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS93ZWJtL3dlYm1fYXVkaW9fY2xpZW50LmgiCi0KLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9jaGFubmVsX2xheW91dC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2FtcGxlX2Zvcm1hdC5oIgotI2luY2x1ZGUgIm1lZGlhL3dlYm0vd2VibV9jb25zdGFudHMuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotV2ViTUF1ZGlvQ2xpZW50OjpXZWJNQXVkaW9DbGllbnQoY29uc3QgTG9nQ0ImIGxvZ19jYikKLSAgICA6IGxvZ19jYl8obG9nX2NiKSB7Ci0gIFJlc2V0KCk7Ci19Ci0KLVdlYk1BdWRpb0NsaWVudDo6fldlYk1BdWRpb0NsaWVudCgpIHsKLX0KLQotdm9pZCBXZWJNQXVkaW9DbGllbnQ6OlJlc2V0KCkgewotICBjaGFubmVsc18gPSAtMTsKLSAgc2FtcGxlc19wZXJfc2Vjb25kXyA9IC0xOwotICBvdXRwdXRfc2FtcGxlc19wZXJfc2Vjb25kXyA9IC0xOwotfQotCi1ib29sIFdlYk1BdWRpb0NsaWVudDo6SW5pdGlhbGl6ZUNvbmZpZygKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29kZWNfaWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4PiYgY29kZWNfcHJpdmF0ZSwKLSAgICBpbnQ2NCBzZWVrX3ByZXJvbGwsIGludDY0IGNvZGVjX2RlbGF5LCBib29sIGlzX2VuY3J5cHRlZCwKLSAgICBBdWRpb0RlY29kZXJDb25maWcqIGNvbmZpZykgewotICBEQ0hFQ0soY29uZmlnKTsKLQotICBBdWRpb0NvZGVjIGF1ZGlvX2NvZGVjID0ga1Vua25vd25BdWRpb0NvZGVjOwotICBpZiAoY29kZWNfaWQgPT0gIkFfVk9SQklTIikgewotICAgIGF1ZGlvX2NvZGVjID0ga0NvZGVjVm9yYmlzOwotICB9IGVsc2UgaWYgKGNvZGVjX2lkID09ICJBX09QVVMiKSB7Ci0gICAgYXVkaW9fY29kZWMgPSBrQ29kZWNPcHVzOwotICB9IGVsc2UgewotICAgIE1FRElBX0xPRyhsb2dfY2JfKSA8PCAiVW5zdXBwb3J0ZWQgYXVkaW8gY29kZWNfaWQgIiA8PCBjb2RlY19pZDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoc2FtcGxlc19wZXJfc2Vjb25kXyA8PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvLyBTZXQgY2hhbm5lbCBsYXlvdXQgZGVmYXVsdCBpZiBhIENoYW5uZWxzIGVsZW1lbnQgd2FzIG5vdCBwcmVzZW50LgotICBpZiAoY2hhbm5lbHNfID09IC0xKQotICAgIGNoYW5uZWxzXyA9IDE7Ci0KLSAgQ2hhbm5lbExheW91dCBjaGFubmVsX2xheW91dCA9ICBHdWVzc0NoYW5uZWxMYXlvdXQoY2hhbm5lbHNfKTsKLQotICBpZiAoY2hhbm5lbF9sYXlvdXQgPT0gQ0hBTk5FTF9MQVlPVVRfVU5TVVBQT1JURUQpIHsKLSAgICBNRURJQV9MT0cobG9nX2NiXykgPDwgIlVuc3VwcG9ydGVkIGNoYW5uZWwgY291bnQgIiA8PCBjaGFubmVsc187Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW50IHNhbXBsZXNfcGVyX3NlY29uZCA9IHNhbXBsZXNfcGVyX3NlY29uZF87Ci0gIGlmIChvdXRwdXRfc2FtcGxlc19wZXJfc2Vjb25kXyA+IDApCi0gICAgc2FtcGxlc19wZXJfc2Vjb25kID0gb3V0cHV0X3NhbXBsZXNfcGVyX3NlY29uZF87Ci0KLSAgY29uc3QgdWludDgqIGV4dHJhX2RhdGEgPSBOVUxMOwotICBzaXplX3QgZXh0cmFfZGF0YV9zaXplID0gMDsKLSAgaWYgKGNvZGVjX3ByaXZhdGUuc2l6ZSgpID4gMCkgewotICAgIGV4dHJhX2RhdGEgPSAmY29kZWNfcHJpdmF0ZVswXTsKLSAgICBleHRyYV9kYXRhX3NpemUgPSBjb2RlY19wcml2YXRlLnNpemUoKTsKLSAgfQotCi0gIC8vIENvbnZlcnQgfGNvZGVjX2RlbGF5fCBmcm9tIG5hbm9zZWNvbmRzIGludG8gZnJhbWVzLgotICBpbnQgY29kZWNfZGVsYXlfaW5fZnJhbWVzID0gMDsKLSAgaWYgKGNvZGVjX2RlbGF5ICE9IC0xKSB7Ci0gICAgY29kZWNfZGVsYXlfaW5fZnJhbWVzID0KLSAgICAgICAgMC41ICsKLSAgICAgICAgc2FtcGxlc19wZXJfc2Vjb25kICogKHN0YXRpY19jYXN0PGRvdWJsZT4oY29kZWNfZGVsYXkpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWU6OmtOYW5vc2Vjb25kc1BlclNlY29uZCk7Ci0gIH0KLQotICBjb25maWctPkluaXRpYWxpemUoCi0gICAgICBhdWRpb19jb2RlYywKLSAgICAgIChhdWRpb19jb2RlYyA9PSBrQ29kZWNPcHVzKSA/IGtTYW1wbGVGb3JtYXRTMTYgOiBrU2FtcGxlRm9ybWF0UGxhbmFyRjMyLAotICAgICAgY2hhbm5lbF9sYXlvdXQsCi0gICAgICBzYW1wbGVzX3Blcl9zZWNvbmQsCi0gICAgICBleHRyYV9kYXRhLAotICAgICAgZXh0cmFfZGF0YV9zaXplLAotICAgICAgaXNfZW5jcnlwdGVkLAotICAgICAgdHJ1ZSk7Ci0gIHJldHVybiBjb25maWctPklzVmFsaWRDb25maWcoKTsKLX0KLQotYm9vbCBXZWJNQXVkaW9DbGllbnQ6Ok9uVUludChpbnQgaWQsIGludDY0IHZhbCkgewotICBpZiAoaWQgPT0ga1dlYk1JZENoYW5uZWxzKSB7Ci0gICAgaWYgKGNoYW5uZWxzXyAhPSAtMSkgewotICAgICAgTUVESUFfTE9HKGxvZ19jYl8pIDw8ICJNdWx0aXBsZSB2YWx1ZXMgZm9yIGlkICIgPDwgc3RkOjpoZXggPDwgaWQKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHNwZWNpZmllZC4gKCIgPDwgY2hhbm5lbHNfIDw8ICIgYW5kICIgPDwgdmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgIikiOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNoYW5uZWxzXyA9IHZhbDsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBXZWJNQXVkaW9DbGllbnQ6Ok9uRmxvYXQoaW50IGlkLCBkb3VibGUgdmFsKSB7Ci0gIGRvdWJsZSogZHN0ID0gTlVMTDsKLQotICBzd2l0Y2ggKGlkKSB7Ci0gICAgY2FzZSBrV2ViTUlkU2FtcGxpbmdGcmVxdWVuY3k6Ci0gICAgICBkc3QgPSAmc2FtcGxlc19wZXJfc2Vjb25kXzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga1dlYk1JZE91dHB1dFNhbXBsaW5nRnJlcXVlbmN5OgotICAgICAgZHN0ID0gJm91dHB1dF9zYW1wbGVzX3Blcl9zZWNvbmRfOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgaWYgKHZhbCA8PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoKmRzdCAhPSAtMSkgewotICAgIE1FRElBX0xPRyhsb2dfY2JfKSA8PCAiTXVsdGlwbGUgdmFsdWVzIGZvciBpZCAiIDw8IHN0ZDo6aGV4IDw8IGlkCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICIgc3BlY2lmaWVkICgiIDw8ICpkc3QgPDwgIiBhbmQgIiA8PCB2YWwgPDwgIikiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpkc3QgPSB2YWw7Ci0gIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS93ZWJtL3dlYm1fYXVkaW9fY2xpZW50LmggYi9zcmMvbWVkaWEvd2VibS93ZWJtX2F1ZGlvX2NsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzJkN2M5Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS93ZWJtL3dlYm1fYXVkaW9fY2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfV0VCTV9XRUJNX0FVRElPX0NMSUVOVF9IXwotI2RlZmluZSBNRURJQV9XRUJNX1dFQk1fQVVESU9fQ0xJRU5UX0hfCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9sb2cuaCIKLSNpbmNsdWRlICJtZWRpYS93ZWJtL3dlYm1fcGFyc2VyLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci1jbGFzcyBBdWRpb0RlY29kZXJDb25maWc7Ci0KLS8vIEhlbHBlciBjbGFzcyB1c2VkIHRvIHBhcnNlIGFuIEF1ZGlvIGVsZW1lbnQgaW5zaWRlIGEgVHJhY2tFbnRyeSBlbGVtZW50LgotY2xhc3MgV2ViTUF1ZGlvQ2xpZW50IDogcHVibGljIFdlYk1QYXJzZXJDbGllbnQgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgV2ViTUF1ZGlvQ2xpZW50KGNvbnN0IExvZ0NCJiBsb2dfY2IpOwotICB2aXJ0dWFsIH5XZWJNQXVkaW9DbGllbnQoKTsKLQotICAvLyBSZXNldCB0aGlzIG9iamVjdCdzIHN0YXRlIHNvIGl0IGNhbiBwcm9jZXNzIGEgbmV3IGF1ZGlvIHRyYWNrIGVsZW1lbnQuCi0gIHZvaWQgUmVzZXQoKTsKLQotICAvLyBJbml0aWFsaXplIHxjb25maWd8IHdpdGggdGhlIGRhdGEgaW4gfGNvZGVjX2lkfCwgfGNvZGVjX3ByaXZhdGV8LAotICAvLyB8aXNfZW5jcnlwdGVkfCBhbmQgdGhlIGZpZWxkcyBwYXJzZWQgZnJvbSB0aGUgbGFzdCBhdWRpbyB0cmFjayBlbGVtZW50IHRoaXMKLSAgLy8gb2JqZWN0IHdhcyB1c2VkIHRvIHBhcnNlLgotICAvLyBSZXR1cm5zIHRydWUgaWYgfGNvbmZpZ3wgd2FzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZC4KLSAgLy8gUmV0dXJucyBmYWxzZSBpZiB0aGVyZSB3YXMgdW5leHBlY3RlZCB2YWx1ZXMgaW4gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMgb3IKLSAgLy8gYXVkaW8gdHJhY2sgZWxlbWVudCBmaWVsZHMuCi0gIGJvb2wgSW5pdGlhbGl6ZUNvbmZpZyhjb25zdCBzdGQ6OnN0cmluZyYgY29kZWNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OD4mIGNvZGVjX3ByaXZhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NCBzZWVrX3ByZXJvbGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NCBjb2RlY19kZWxheSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZW5jcnlwdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZWNvZGVyQ29uZmlnKiBjb25maWcpOwotCi0gcHJpdmF0ZToKLSAgLy8gV2ViTVBhcnNlckNsaWVudCBpbXBsZW1lbnRhdGlvbi4KLSAgdmlydHVhbCBib29sIE9uVUludChpbnQgaWQsIGludDY0IHZhbCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgYm9vbCBPbkZsb2F0KGludCBpZCwgZG91YmxlIHZhbCkgT1ZFUlJJREU7Ci0KLSAgTG9nQ0IgbG9nX2NiXzsKLSAgaW50IGNoYW5uZWxzXzsKLSAgZG91YmxlIHNhbXBsZXNfcGVyX3NlY29uZF87Ci0gIGRvdWJsZSBvdXRwdXRfc2FtcGxlc19wZXJfc2Vjb25kXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oV2ViTUF1ZGlvQ2xpZW50KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX1dFQk1fV0VCTV9BVURJT19DTElFTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS93ZWJtL3dlYm1fY2x1c3Rlcl9wYXJzZXIuY2MgYi9zcmMvbWVkaWEvd2VibS93ZWJtX2NsdXN0ZXJfcGFyc2VyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjFjYTI0Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS93ZWJtL3dlYm1fY2x1c3Rlcl9wYXJzZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MzEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL3dlYm0vd2VibV9jbHVzdGVyX3BhcnNlci5oIgotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9kYXRhX2J1ZmZlci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVjcnlwdF9jb25maWcuaCIKLSNpbmNsdWRlICJtZWRpYS93ZWJtL3dlYm1fY29uc3RhbnRzLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIEdlbmVyYXRlcyBhIDE2IGJ5dGUgQ1RSIGNvdW50ZXIgYmxvY2suIFRoZSBDVFIgY291bnRlciBibG9jayBmb3JtYXQgaXMgYQotLy8gQ1RSIElWIGFwcGVuZGVkIHdpdGggYSBDVFIgYmxvY2sgY291bnRlci4gfGl2fCBpcyBhbiA4IGJ5dGUgQ1RSIElWLgotLy8gfGl2X3NpemV8IGlzIHRoZSBzaXplIG9mIHxpdnwgaW4gYnR5ZXMuIFJldHVybnMgYSBzdHJpbmcgb2YKLS8vIGtEZWNyeXB0aW9uS2V5U2l6ZSBieXRlcy4KLXN0YXRpYyBzdGQ6OnN0cmluZyBHZW5lcmF0ZUNvdW50ZXJCbG9jayhjb25zdCB1aW50OCogaXYsIGludCBpdl9zaXplKSB7Ci0gIHN0ZDo6c3RyaW5nIGNvdW50ZXJfYmxvY2socmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oaXYpLCBpdl9zaXplKTsKLSAgY291bnRlcl9ibG9jay5hcHBlbmQoRGVjcnlwdENvbmZpZzo6a0RlY3J5cHRpb25LZXlTaXplIC0gaXZfc2l6ZSwgMCk7Ci0gIHJldHVybiBjb3VudGVyX2Jsb2NrOwotfQotCi1uYW1lc3BhY2UgewotCi11aW50MzIgUmVhZEludGVnZXIoY29uc3QgdWludDgqIGJ1ZiwgaW50IHNpemUpIHsKLSAgLy8gUmVhZCBpbiB0aGUgYmlnLWVuZGlhbiBpbnRlZ2VyLgotICB1aW50MzIgdmFsdWUgPSAwOwotICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkKLSAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8IGJ1ZltpXTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi1ib29sIEV4dHJhY3RTdWJzYW1wbGVzKGNvbnN0IHVpbnQ4KiBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZV9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1fcGFydGl0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3Vic2FtcGxlRW50cnk+KiBzdWJzYW1wbGVfZW50cmllcykgewotICBzdWJzYW1wbGVfZW50cmllcy0+Y2xlYXIoKTsKLSAgdWludDMyIGNsZWFyX2J5dGVzID0gMDsKLSAgLy8gUGFydGl0aW9uIGlzIHRoZSB3YWxsIGJldHdlZW4gYWx0ZXJuYXRpbmcgc2VjdGlvbnMuIFBhcnRpdGlvbiBvZmZzZXRzIGFyZQotICAvLyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGFjdHVhbCBmcmFtZSBkYXRhLgotICAvLyBTaXplIG9mIGNsZWFyL2NpcGhlciBzZWN0aW9ucyBjYW4gYmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLSAgLy8gYWRqYWNlbnQgcGFydGl0aW9uIG9mZnNldHMuCi0gIC8vIEhlcmUgaXMgYW4gZXhhbXBsZSB3aXRoIDQgcGFydGl0aW9ucyAoNSBzZWN0aW9ucyk6Ci0gIC8vICAgImNsZWFyIHwxIGNpcGhlciB8MiBjbGVhciB8MyBjaXBoZXIgfDQgY2xlYXIiCi0gIC8vIFdpdGggdGhlIGZpcnN0IGFuZCB0aGUgbGFzdCBpbXBsaWNpdCBwYXJ0aXRpb24gaW5jbHVkZWQ6Ci0gIC8vICAgInwwIGNsZWFyIHwxIGNpcGhlciB8MiBjbGVhciB8MyBjaXBoZXIgfDQgY2xlYXIgfDUiCi0gIC8vICAgd2hlcmUgcGFydGl0aW9uX29mZnNldF8wID0gMCwgcGFydGl0aW9uX29mZnNldF81ID0gZnJhbWVfZGF0YV9zaXplCi0gIC8vIFRoZXJlIGFyZSB0aHJlZSBzdWJzYW1wbGVzIGluIHRoZSBhYm92ZSBleGFtcGxlOgotICAvLyAgIFN1YnNhbXBsZTAuY2xlYXJfYnl0ZXMgPSBwYXJ0aXRpb25fb2Zmc2V0XzEgLSBwYXJ0aXRpb25fb2Zmc2V0XzAKLSAgLy8gICBTdWJzYW1wbGUwLmN5cGhlcl9ieXRlcyA9IHBhcnRpdGlvbl9vZmZzZXRfMiAtIHBhcnRpdGlvbl9vZmZzZXRfMQotICAvLyAgIC4uLgotICAvLyAgIFN1YnNhbXBsZTIuY2xlYXJfYnl0ZXMgPSBwYXJ0aXRpb25fb2Zmc2V0XzUgLSBwYXJ0aXRpb25fb2Zmc2V0XzQKLSAgLy8gICBTdWJzYW1wbGUyLmN5cGhlcl9ieXRlcyA9IDAKLSAgdWludDMyIHBhcnRpdGlvbl9vZmZzZXQgPSAwOwotICBmb3IgKHNpemVfdCBpID0gMCwgb2Zmc2V0ID0gMDsgaSA8PSBudW1fcGFydGl0aW9uczsgKytpKSB7Ci0gICAgY29uc3QgdWludDMyIHByZXZfcGFydGl0aW9uX29mZnNldCA9IHBhcnRpdGlvbl9vZmZzZXQ7Ci0gICAgcGFydGl0aW9uX29mZnNldCA9Ci0gICAgICAgIChpID09IG51bV9wYXJ0aXRpb25zKQotICAgICAgICAgICAgPyBmcmFtZV9kYXRhX3NpemUKLSAgICAgICAgICAgIDogUmVhZEludGVnZXIoYnVmICsgb2Zmc2V0LCBrV2ViTUVuY3J5cHRlZEZyYW1lUGFydGl0aW9uT2Zmc2V0U2l6ZSk7Ci0gICAgb2Zmc2V0ICs9IGtXZWJNRW5jcnlwdGVkRnJhbWVQYXJ0aXRpb25PZmZzZXRTaXplOwotICAgIGlmIChwYXJ0aXRpb25fb2Zmc2V0IDwgcHJldl9wYXJ0aXRpb25fb2Zmc2V0KSB7Ci0gICAgICBEVkxPRygxKSA8PCAiUGFydGl0aW9uIHNob3VsZCBub3QgYmUgZGVjcmVhc2luZyAiIDw8IHByZXZfcGFydGl0aW9uX29mZnNldAotICAgICAgICAgICAgICAgPDwgIiAiIDw8IHBhcnRpdGlvbl9vZmZzZXQ7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdWludDMyIGN5cGhlcl9ieXRlcyA9IDA7Ci0gICAgYm9vbCBuZXdfc3Vic2FtcGxlX2VudHJ5ID0gZmFsc2U7Ci0gICAgLy8gQWx0ZXJuYXRpbmcgY2xlYXIgYW5kIGNpcGhlciBzZWN0aW9ucy4KLSAgICBpZiAoKGkgJSAyKSA9PSAwKSB7Ci0gICAgICBjbGVhcl9ieXRlcyA9IHBhcnRpdGlvbl9vZmZzZXQgLSBwcmV2X3BhcnRpdGlvbl9vZmZzZXQ7Ci0gICAgICAvLyBHZW5lcmF0ZSBhIG5ldyBzdWJzYW1wbGUgd2hlbiBmaW5pc2hpbmcgcmVhZGluZyBwYXJ0aXRpb24gb2Zmc2V0cy4KLSAgICAgIG5ld19zdWJzYW1wbGVfZW50cnkgPSBpID09IG51bV9wYXJ0aXRpb25zOwotICAgIH0gZWxzZSB7Ci0gICAgICBjeXBoZXJfYnl0ZXMgPSBwYXJ0aXRpb25fb2Zmc2V0IC0gcHJldl9wYXJ0aXRpb25fb2Zmc2V0OwotICAgICAgLy8gR2VuZXJhdGUgYSBuZXcgc3Vic2FtcGxlIGFmdGVyIHNlZWluZyBhIGNpcGhlciBzZWN0aW9uLgotICAgICAgbmV3X3N1YnNhbXBsZV9lbnRyeSA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKG5ld19zdWJzYW1wbGVfZW50cnkpIHsKLSAgICAgIGlmIChjbGVhcl9ieXRlcyA9PSAwICYmIGN5cGhlcl9ieXRlcyA9PSAwKSB7Ci0gICAgICAgIERWTE9HKDEpIDw8ICJOb3QgZXhwZWN0aW5nID4yIHBhcnRpdGlvbnMgd2l0aCB0aGUgc2FtZSBvZmZzZXRzLiI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIFN1YnNhbXBsZUVudHJ5IGVudHJ5OwotICAgICAgZW50cnkuY2xlYXJfYnl0ZXMgPSBjbGVhcl9ieXRlczsKLSAgICAgIGVudHJ5LmN5cGhlcl9ieXRlcyA9IGN5cGhlcl9ieXRlczsKLSAgICAgIHN1YnNhbXBsZV9lbnRyaWVzLT5wdXNoX2JhY2soZW50cnkpOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLVdlYk1DbHVzdGVyUGFyc2VyOjpXZWJNQ2x1c3RlclBhcnNlcigKLSAgICBpbnQ2NCB0aW1lY29kZV9zY2FsZSwgaW50IGF1ZGlvX3RyYWNrX251bSwgaW50IHZpZGVvX3RyYWNrX251bSwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXVkaW9fZW5jcnlwdGlvbl9rZXlfaWQsCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZpZGVvX2VuY3J5cHRpb25fa2V5X2lkLAotICAgIGNvbnN0IExvZ0NCJiBsb2dfY2IpCi0gICAgOiB0aW1lY29kZV9tdWx0aXBsaWVyXyh0aW1lY29kZV9zY2FsZSAvIDEwMDAuMCksCi0gICAgICBhdWRpb19lbmNyeXB0aW9uX2tleV9pZF8oYXVkaW9fZW5jcnlwdGlvbl9rZXlfaWQpLAotICAgICAgdmlkZW9fZW5jcnlwdGlvbl9rZXlfaWRfKHZpZGVvX2VuY3J5cHRpb25fa2V5X2lkKSwKLSAgICAgIHBhcnNlcl8oa1dlYk1JZENsdXN0ZXIsIHRoaXMpLAotICAgICAgbGFzdF9ibG9ja190aW1lY29kZV8oLTEpLAotICAgICAgYmxvY2tfZGF0YV9zaXplXygtMSksCi0gICAgICBibG9ja19kdXJhdGlvbl8oLTEpLAotICAgICAgY2x1c3Rlcl90aW1lY29kZV8oLTEpLAotICAgICAgY2x1c3Rlcl9zdGFydF90aW1lXyhrTm9UaW1lc3RhbXAoKSksCi0gICAgICBjbHVzdGVyX2VuZGVkXyhmYWxzZSksCi0gICAgICBhdWRpb18oYXVkaW9fdHJhY2tfbnVtKSwKLSAgICAgIHZpZGVvXyh2aWRlb190cmFja19udW0pLAotICAgICAgbG9nX2NiXyhsb2dfY2IpIHsKLX0KLQotV2ViTUNsdXN0ZXJQYXJzZXI6On5XZWJNQ2x1c3RlclBhcnNlcigpIHt9Ci0KLXZvaWQgV2ViTUNsdXN0ZXJQYXJzZXI6OlJlc2V0KCkgewotICBsYXN0X2Jsb2NrX3RpbWVjb2RlXyA9IC0xOwotICBjbHVzdGVyX3RpbWVjb2RlXyA9IC0xOwotICBjbHVzdGVyX3N0YXJ0X3RpbWVfID0ga05vVGltZXN0YW1wKCk7Ci0gIGNsdXN0ZXJfZW5kZWRfID0gZmFsc2U7Ci0gIHBhcnNlcl8uUmVzZXQoKTsKLSAgYXVkaW9fLlJlc2V0KCk7Ci0gIHZpZGVvXy5SZXNldCgpOwotfQotCi1pbnQgV2ViTUNsdXN0ZXJQYXJzZXI6OlBhcnNlKGNvbnN0IHVpbnQ4KiBidWYsIGludCBzaXplKSB7Ci0gIGF1ZGlvXy5SZXNldCgpOwotICB2aWRlb18uUmVzZXQoKTsKLQotICBpbnQgcmVzdWx0ID0gcGFyc2VyXy5QYXJzZShidWYsIHNpemUpOwotCi0gIGlmIChyZXN1bHQgPCAwKSB7Ci0gICAgY2x1c3Rlcl9lbmRlZF8gPSBmYWxzZTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgY2x1c3Rlcl9lbmRlZF8gPSBwYXJzZXJfLklzUGFyc2luZ0NvbXBsZXRlKCk7Ci0gIGlmIChjbHVzdGVyX2VuZGVkXykgewotICAgIC8vIElmIHRoZXJlIHdlcmUgbm8gYnVmZmVycyBpbiB0aGlzIGNsdXN0ZXIsIHNldCB0aGUgY2x1c3RlciBzdGFydCB0aW1lIHRvCi0gICAgLy8gYmUgdGhlIHxjbHVzdGVyX3RpbWVjb2RlX3wuCi0gICAgaWYgKGNsdXN0ZXJfc3RhcnRfdGltZV8gPT0ga05vVGltZXN0YW1wKCkpIHsKLSAgICAgIERDSEVDS19HVChjbHVzdGVyX3RpbWVjb2RlXywgLTEpOwotICAgICAgY2x1c3Rlcl9zdGFydF90aW1lXyA9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pY3Jvc2Vjb25kcygKLSAgICAgICAgICBjbHVzdGVyX3RpbWVjb2RlXyAqIHRpbWVjb2RlX211bHRpcGxpZXJfKTsKLSAgICB9Ci0KLSAgICAvLyBSZXNldCB0aGUgcGFyc2VyIGlmIHdlJ3JlIGRvbmUgcGFyc2luZyBzbyB0aGF0Ci0gICAgLy8gaXQgaXMgcmVhZHkgdG8gYWNjZXB0IGFub3RoZXIgY2x1c3RlciBvbiB0aGUgbmV4dAotICAgIC8vIGNhbGwuCi0gICAgcGFyc2VyXy5SZXNldCgpOwotCi0gICAgbGFzdF9ibG9ja190aW1lY29kZV8gPSAtMTsKLSAgICBjbHVzdGVyX3RpbWVjb2RlXyA9IC0xOwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotV2ViTVBhcnNlckNsaWVudCogV2ViTUNsdXN0ZXJQYXJzZXI6Ok9uTGlzdFN0YXJ0KGludCBpZCkgewotICBpZiAoaWQgPT0ga1dlYk1JZENsdXN0ZXIpIHsKLSAgICBjbHVzdGVyX3RpbWVjb2RlXyA9IC0xOwotICAgIGNsdXN0ZXJfc3RhcnRfdGltZV8gPSBrTm9UaW1lc3RhbXAoKTsKLSAgfSBlbHNlIGlmIChpZCA9PSBrV2ViTUlkQmxvY2tHcm91cCkgewotICAgIGJsb2NrX2RhdGFfLnJlc2V0KCk7Ci0gICAgYmxvY2tfZGF0YV9zaXplXyA9IC0xOwotICAgIGJsb2NrX2R1cmF0aW9uXyA9IC0xOwotICB9Ci0KLSAgcmV0dXJuIHRoaXM7Ci19Ci0KLWJvb2wgV2ViTUNsdXN0ZXJQYXJzZXI6Ok9uTGlzdEVuZChpbnQgaWQpIHsKLSAgaWYgKGlkICE9IGtXZWJNSWRCbG9ja0dyb3VwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8vIE1ha2Ugc3VyZSB0aGUgQmxvY2tHcm91cCBhY3R1YWxseSBoYWQgYSBCbG9jay4KLSAgaWYgKGJsb2NrX2RhdGFfc2l6ZV8gPT0gLTEpIHsKLSAgICBNRURJQV9MT0cobG9nX2NiXykgPDwgIkJsb2NrIG1pc3NpbmcgZnJvbSBCbG9ja0dyb3VwLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYm9vbCByZXN1bHQgPSBQYXJzZUJsb2NrKGJsb2NrX2RhdGFfLmdldCgpLCBibG9ja19kYXRhX3NpemVfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfZHVyYXRpb25fKTsKLSAgYmxvY2tfZGF0YV8ucmVzZXQoKTsKLSAgYmxvY2tfZGF0YV9zaXplXyA9IC0xOwotICBibG9ja19kdXJhdGlvbl8gPSAtMTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotYm9vbCBXZWJNQ2x1c3RlclBhcnNlcjo6T25VSW50KGludCBpZCwgaW50NjQgdmFsKSB7Ci0gIGlmIChpZCA9PSBrV2ViTUlkVGltZWNvZGUpIHsKLSAgICBpZiAoY2x1c3Rlcl90aW1lY29kZV8gIT0gLTEpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBjbHVzdGVyX3RpbWVjb2RlXyA9IHZhbDsKLSAgfSBlbHNlIGlmIChpZCA9PSBrV2ViTUlkQmxvY2tEdXJhdGlvbikgewotICAgIGlmIChibG9ja19kdXJhdGlvbl8gIT0gLTEpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgYmxvY2tfZHVyYXRpb25fID0gdmFsOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgV2ViTUNsdXN0ZXJQYXJzZXI6OlBhcnNlQmxvY2soY29uc3QgdWludDgqIGJ1ZiwgaW50IHNpemUsIGludCBkdXJhdGlvbikgewotICBpZiAoc2l6ZSA8IDQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8vIFJldHVybiBhbiBlcnJvciBpZiB0aGUgdHJhY2tOdW0gPiAxMjcuIFdlIGp1c3QgYXJlbid0Ci0gIC8vIGdvaW5nIHRvIHN1cHBvcnQgbGFyZ2UgdHJhY2sgbnVtYmVycyByaWdodCBub3cuCi0gIGlmICghKGJ1ZlswXSAmIDB4ODApKSB7Ci0gICAgTUVESUFfTE9HKGxvZ19jYl8pIDw8ICJUcmFja051bWJlciBvdmVyIDEyNyBub3Qgc3VwcG9ydGVkIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbnQgdHJhY2tfbnVtID0gYnVmWzBdICYgMHg3ZjsKLSAgaW50IHRpbWVjb2RlID0gYnVmWzFdIDw8IDggfCBidWZbMl07Ci0gIGludCBmbGFncyA9IGJ1ZlszXSAmIDB4ZmY7Ci0gIGludCBsYWNpbmcgPSAoZmxhZ3MgPj4gMSkgJiAweDM7Ci0KLSAgaWYgKGxhY2luZykgewotICAgIE1FRElBX0xPRyhsb2dfY2JfKSA8PCAiTGFjaW5nICIgPDwgbGFjaW5nIDw8ICIgaXMgbm90IHN1cHBvcnRlZCB5ZXQuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBTaWduIGV4dGVuZCBuZWdhdGl2ZSB0aW1lY29kZSBvZmZzZXRzLgotICBpZiAodGltZWNvZGUgJiAweDgwMDApCi0gICAgdGltZWNvZGUgfD0gKC0xIDw8IDE2KTsKLQotICBjb25zdCB1aW50OCogZnJhbWVfZGF0YSA9IGJ1ZiArIDQ7Ci0gIGludCBmcmFtZV9zaXplID0gc2l6ZSAtIChmcmFtZV9kYXRhIC0gYnVmKTsKLSAgcmV0dXJuIE9uQmxvY2sodHJhY2tfbnVtLCB0aW1lY29kZSwgZHVyYXRpb24sIGZsYWdzLCBmcmFtZV9kYXRhLCBmcmFtZV9zaXplKTsKLX0KLQotYm9vbCBXZWJNQ2x1c3RlclBhcnNlcjo6T25CaW5hcnkoaW50IGlkLCBjb25zdCB1aW50OCogZGF0YSwgaW50IHNpemUpIHsKLSAgaWYgKGlkID09IGtXZWJNSWRTaW1wbGVCbG9jaykKLSAgICByZXR1cm4gUGFyc2VCbG9jayhkYXRhLCBzaXplLCAtMSk7Ci0KLSAgaWYgKGlkICE9IGtXZWJNSWRCbG9jaykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYmxvY2tfZGF0YV8uZ2V0KCkpIHsKLSAgICBNRURJQV9MT0cobG9nX2NiXykgPDwgIk1vcmUgdGhhbiAxIEJsb2NrIGluIGEgQmxvY2tHcm91cCBpcyBub3Qgc3VwcG9ydGVkLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYmxvY2tfZGF0YV8ucmVzZXQobmV3IHVpbnQ4W3NpemVdKTsKLSAgbWVtY3B5KGJsb2NrX2RhdGFfLmdldCgpLCBkYXRhLCBzaXplKTsKLSAgYmxvY2tfZGF0YV9zaXplXyA9IHNpemU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFdlYk1DbHVzdGVyUGFyc2VyOjpPbkJsb2NrKGludCB0cmFja19udW0sIGludCB0aW1lY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBibG9ja19kdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogZGF0YSwgaW50IHNpemUpIHsKLSAgRENIRUNLX0dFKHNpemUsIDApOwotICBpZiAoY2x1c3Rlcl90aW1lY29kZV8gPT0gLTEpIHsKLSAgICBNRURJQV9MT0cobG9nX2NiXykgPDwgIkdvdCBhIGJsb2NrIGJlZm9yZSBjbHVzdGVyIHRpbWVjb2RlLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKHRpbWVjb2RlIDwgMCkgewotICAgIE1FRElBX0xPRyhsb2dfY2JfKSA8PCAiR290IGEgYmxvY2sgd2l0aCBuZWdhdGl2ZSB0aW1lY29kZSBvZmZzZXQgIgotICAgICAgICAgICAgICAgICAgICAgICA8PCB0aW1lY29kZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAobGFzdF9ibG9ja190aW1lY29kZV8gIT0gLTEgJiYgdGltZWNvZGUgPCBsYXN0X2Jsb2NrX3RpbWVjb2RlXykgewotICAgIE1FRElBX0xPRyhsb2dfY2JfKQotICAgICAgICA8PCAiR290IGEgYmxvY2sgd2l0aCBhIHRpbWVjb2RlIGJlZm9yZSB0aGUgcHJldmlvdXMgYmxvY2suIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBUcmFjayogdHJhY2sgPSBOVUxMOwotICBzdGQ6OnN0cmluZyBlbmNyeXB0aW9uX2tleV9pZDsKLSAgaWYgKHRyYWNrX251bSA9PSBhdWRpb18udHJhY2tfbnVtKCkpIHsKLSAgICB0cmFjayA9ICZhdWRpb187Ci0gICAgZW5jcnlwdGlvbl9rZXlfaWQgPSBhdWRpb19lbmNyeXB0aW9uX2tleV9pZF87Ci0gIH0gZWxzZSBpZiAodHJhY2tfbnVtID09IHZpZGVvXy50cmFja19udW0oKSkgewotICAgIHRyYWNrID0gJnZpZGVvXzsKLSAgICBlbmNyeXB0aW9uX2tleV9pZCA9IHZpZGVvX2VuY3J5cHRpb25fa2V5X2lkXzsKLSAgfSBlbHNlIHsKLSAgICBNRURJQV9MT0cobG9nX2NiXykgPDwgIlVuZXhwZWN0ZWQgdHJhY2sgbnVtYmVyICIgPDwgdHJhY2tfbnVtOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGxhc3RfYmxvY2tfdGltZWNvZGVfID0gdGltZWNvZGU7Ci0KLSAgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCA9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pY3Jvc2Vjb25kcygKLSAgICAgIChjbHVzdGVyX3RpbWVjb2RlXyArIHRpbWVjb2RlKSAqIHRpbWVjb2RlX211bHRpcGxpZXJfKTsKLQotICAvLyBUaGUgZmlyc3QgYml0IG9mIHRoZSBmbGFncyBpcyBzZXQgd2hlbiB0aGUgYmxvY2sgY29udGFpbnMgb25seSBrZXlmcmFtZXMuCi0gIC8vIGh0dHA6Ly93d3cubWF0cm9za2Eub3JnL3RlY2huaWNhbC9zcGVjcy9pbmRleC5odG1sCi0gIGJvb2wgaXNfa2V5ZnJhbWUgPSAoZmxhZ3MgJiAweDgwKSAhPSAwOwotCi0jaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICBzY29wZWRfcmVmcHRyPFN0cmVhbVBhcnNlckJ1ZmZlcj4gYnVmZmVyOwotICAvLyBDcmVhdGUgYnVmZmVyIGFuZCBjb3B5IGRhdGEgb3ZlciBmb3Igbm9uLWVuY3J5cHRlZCBkYXRhLiBFbmNyeXB0ZWQgZGF0YQotICAvLyB3aWxsIGJlIGhhbmRsZWQgaW4gdGhlIGZvbGxvd2luZyBpZiBibG9jay4KLSAgaWYgKGVuY3J5cHRpb25fa2V5X2lkLmVtcHR5KCkpCi0gICAgYnVmZmVyID0gU3RyZWFtUGFyc2VyQnVmZmVyOjpDb3B5RnJvbShkYXRhLCBzaXplLCBpc19rZXlmcmFtZSk7Ci0jZWxzZSAgLy8gZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQotICBzY29wZWRfcmVmcHRyPFN0cmVhbVBhcnNlckJ1ZmZlcj4gYnVmZmVyID0KLSAgICAgIFN0cmVhbVBhcnNlckJ1ZmZlcjo6Q29weUZyb20oZGF0YSwgc2l6ZSwgaXNfa2V5ZnJhbWUpOwotI2VuZGlmICAvLyBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0KLSAgLy8gRXZlcnkgZW5jcnlwdGVkIEJsb2NrIGhhcyBhIHNpZ25hbCBieXRlIGFuZCBJViBwcmVwZW5kZWQgdG8gaXQuIEN1cnJlbnQKLSAgLy8gZW5jcnlwdGVkIFdlYk0gcmVxdWVzdCBmb3IgY29tbWVudHMgc3BlY2lmaWNhdGlvbiBpcyBoZXJlCi0gIC8vIGh0dHA6Ly93d3cud2VibXByb2plY3Qub3JnL2RvY3Mvd2VibS1lbmNyeXB0aW9uLwotICBpZiAoIWVuY3J5cHRpb25fa2V5X2lkLmVtcHR5KCkpIHsKLSAgICBEQ0hFQ0tfRVEoa1dlYk1TaWduYWxCeXRlU2l6ZSwgMSk7Ci0gICAgaWYgKHNpemUgPCBrV2ViTVNpZ25hbEJ5dGVTaXplKSB7Ci0gICAgICBNRURJQV9MT0cobG9nX2NiXykKLSAgICAgICAgICA8PCAiR290IGEgYmxvY2sgZnJvbSBhbiBlbmNyeXB0ZWQgc3RyZWFtIHdpdGggbm8gZGF0YS4iOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBjb25zdCB1aW50OCBzaWduYWxfYnl0ZSA9IGRhdGFbMF07Ci0gICAgaW50IGRhdGFfb2Zmc2V0ID0gc2l6ZW9mKHNpZ25hbF9ieXRlKTsKLQotICAgIC8vIFNldHRpbmcgdGhlIERlY3J5cHRDb25maWcgb2JqZWN0IG9mIHRoZSBidWZmZXIgd2hpbGUgbGVhdmluZyB0aGUKLSAgICAvLyBpbml0aWFsaXphdGlvbiB2ZWN0b3IgZW1wdHkgd2lsbCB0ZWxsIHRoZSBkZWNyeXB0b3IgdGhhdCB0aGUgZnJhbWUgaXMKLSAgICAvLyB1bmVuY3J5cHRlZC4KLSAgICBzdGQ6OnN0cmluZyBjb3VudGVyX2Jsb2NrOwotICAgIHN0ZDo6dmVjdG9yPFN1YnNhbXBsZUVudHJ5PiBzdWJzYW1wbGVfZW50cmllczsKLQotICAgIGlmIChzaWduYWxfYnl0ZSAmIGtXZWJNRmxhZ0VuY3J5cHRlZEZyYW1lKSB7Ci0gICAgICBpZiAoc2l6ZSA8IGtXZWJNU2lnbmFsQnl0ZVNpemUgKyBrV2ViTUl2U2l6ZSkgewotICAgICAgICBNRURJQV9MT0cobG9nX2NiXykgPDwgIkdvdCBhbiBlbmNyeXB0ZWQgYmxvY2sgd2l0aCBub3QgZW5vdWdoIGRhdGEgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc2l6ZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgY291bnRlcl9ibG9jayA9IEdlbmVyYXRlQ291bnRlckJsb2NrKGRhdGEgKyBkYXRhX29mZnNldCwga1dlYk1JdlNpemUpOwotICAgICAgZGF0YV9vZmZzZXQgKz0ga1dlYk1JdlNpemU7Ci0KLSAgICAgIGlmIChzaWduYWxfYnl0ZSAmIGtXZWJNRmxhZ0VuY3J5cHRlZEZyYW1lUGFydGl0aW9uZWQpIHsKLSAgICAgICAgaWYgKHNpemUgPCBkYXRhX29mZnNldCArIGtXZWJNRW5jcnlwdGVkRnJhbWVOdW1QYXJ0aXRpb25zU2l6ZSkgewotICAgICAgICAgIERWTE9HKDEpIDw8ICJHb3QgYSBwYXJ0aXRpb25lZCBlbmNyeXB0ZWQgYmxvY2sgd2l0aCBub3QgZW5vdWdoIGRhdGEgIgotICAgICAgICAgICAgICAgICAgIDw8IHNpemU7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3Qgc2l6ZV90IG51bV9wYXJ0aXRpb25zID0gZGF0YVtkYXRhX29mZnNldF07Ci0gICAgICAgIGlmIChudW1fcGFydGl0aW9ucyA9PSAwKSB7Ci0gICAgICAgICAgRFZMT0coMSkgPDwgIkdvdCBhIHBhcnRpdGlvbmVkIGVuY3J5cHRlZCBibG9jayB3aXRoIDAgcGFydGl0aW9ucy4iOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBkYXRhX29mZnNldCArPSBrV2ViTUVuY3J5cHRlZEZyYW1lTnVtUGFydGl0aW9uc1NpemU7Ci0gICAgICAgIGNvbnN0IHVpbnQ4KiBwYXJ0aXRpb25fZGF0YV9zdGFydCA9IGRhdGEgKyBkYXRhX29mZnNldDsKLSAgICAgICAgZGF0YV9vZmZzZXQgKz0ga1dlYk1FbmNyeXB0ZWRGcmFtZVBhcnRpdGlvbk9mZnNldFNpemUgKiBudW1fcGFydGl0aW9uczsKLSAgICAgICAgaWYgKHNpemUgPD0gZGF0YV9vZmZzZXQpIHsKLSAgICAgICAgICBEVkxPRygxKSA8PCAiR290IGEgcGFydGl0aW9uZWQgZW5jcnlwdGVkIGJsb2NrIHdpdGggIgotICAgICAgICAgICAgICAgICAgIDw8IG51bV9wYXJ0aXRpb25zIDw8ICIgcGFydGl0aW9ucyBidXQgbm90IGVub3VnaCBkYXRhICIKLSAgICAgICAgICAgICAgICAgICA8PCBzaXplOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBzaXplX3QgZnJhbWVfZGF0YV9zaXplID0gc2l6ZSAtIGRhdGFfb2Zmc2V0OwotICAgICAgICBpZiAoIUV4dHJhY3RTdWJzYW1wbGVzKHBhcnRpdGlvbl9kYXRhX3N0YXJ0LCBmcmFtZV9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BhcnRpdGlvbnMsICZzdWJzYW1wbGVfZW50cmllcykpIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0gICAgLy8gRG9uJ3QgY29weSBwcmVwZW5kZWQgbWV0YSBkYXRhIGFzIGl0IGlzIG5vdCB1c2VkIGJ5IHRoZSBkZWNyeXB0b3IgYW5kCi0gICAgLy8gZGVjb2Rlci4KLSAgICBidWZmZXIgPSBTdHJlYW1QYXJzZXJCdWZmZXI6OkNvcHlGcm9tKGRhdGEgKyBkYXRhX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgLSBkYXRhX29mZnNldCwgaXNfa2V5ZnJhbWUpOwotI2VuZGlmICAvLyBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0KLSAgICAvLyBUT0RPKGZnYWxsaWdhbik6IFJldmlzaXQgaWYgRGVjcnlwdENvbmZpZyBuZWVkcyB0byBiZSBzZXQgb24gdW5lbmNyeXB0ZWQKLSAgICAvLyBmcmFtZXMgYWZ0ZXIgdGhlIENETSBBUEkgaXMgZmluYWxpemVkLgotICAgIC8vIFVuZW5jcnlwdGVkIGZyYW1lcyBvZiBwb3RlbnRpYWxseSBlbmNyeXB0ZWQgc3RyZWFtcyBjdXJyZW50bHkgc2V0Ci0gICAgLy8gRGVjcnlwdENvbmZpZy4KLSAgICBpZiAoYnVmZmVyKSB7Ci0gICAgICBidWZmZXItPlNldERlY3J5cHRDb25maWcoc2NvcGVkX3B0cjxEZWNyeXB0Q29uZmlnPigKLSAgICAgICAgICBuZXcgRGVjcnlwdENvbmZpZyhlbmNyeXB0aW9uX2tleV9pZCwgY291bnRlcl9ibG9jaywKLSAgI2lmICFkZWZpbmVkKF9fTEJfU0hFTExfXykgJiYgIWRlZmluZWQoQ09CQUxUKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LAotICAjZW5kaWYgIC8vICFkZWZpbmVkKF9fTEJfU0hFTExfXykgJiYgIWRlZmluZWQoQ09CQUxUKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNhbXBsZV9lbnRyaWVzKSkpOwotICAgIH0KLSAgfQotCi0gIGlmICghYnVmZmVyKSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBTdHJlYW1QYXJzZXJCdWZmZXIiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGJ1ZmZlci0+U2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7Ci0gIGlmIChjbHVzdGVyX3N0YXJ0X3RpbWVfID09IGtOb1RpbWVzdGFtcCgpKQotICAgIGNsdXN0ZXJfc3RhcnRfdGltZV8gPSB0aW1lc3RhbXA7Ci0KLSAgaWYgKGJsb2NrX2R1cmF0aW9uID49IDApIHsKLSAgICBidWZmZXItPlNldER1cmF0aW9uKGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pY3Jvc2Vjb25kcygKLSAgICAgICAgYmxvY2tfZHVyYXRpb24gKiB0aW1lY29kZV9tdWx0aXBsaWVyXykpOwotICB9Ci0KLSAgcmV0dXJuIHRyYWNrLT5BZGRCdWZmZXIoYnVmZmVyKTsKLX0KLQotV2ViTUNsdXN0ZXJQYXJzZXI6OlRyYWNrOjpUcmFjayhpbnQgdHJhY2tfbnVtKQotICAgIDogdHJhY2tfbnVtXyh0cmFja19udW0pIHsKLX0KLQotV2ViTUNsdXN0ZXJQYXJzZXI6OlRyYWNrOjp+VHJhY2soKSB7fQotCi1ib29sIFdlYk1DbHVzdGVyUGFyc2VyOjpUcmFjazo6QWRkQnVmZmVyKAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8U3RyZWFtUGFyc2VyQnVmZmVyPiYgYnVmZmVyKSB7Ci0gIERWTE9HKDIpIDw8ICJBZGRCdWZmZXIoKSA6ICIgPDwgdHJhY2tfbnVtXwotICAgICAgICAgICA8PCAiIHRzICIgPDwgYnVmZmVyLT5HZXRUaW1lc3RhbXAoKS5JblNlY29uZHNGKCkKLSAgICAgICAgICAgPDwgIiBkdXIgIiA8PCBidWZmZXItPkdldER1cmF0aW9uKCkuSW5TZWNvbmRzRigpCi0gICAgICAgICAgIDw8ICIga2YgIiA8PCBidWZmZXItPklzS2V5ZnJhbWUoKQotICAgICAgICAgICA8PCAiIHNpemUgIiA8PCBidWZmZXItPkdldERhdGFTaXplKCk7Ci0KLSAgYnVmZmVyc18ucHVzaF9iYWNrKGJ1ZmZlcik7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFdlYk1DbHVzdGVyUGFyc2VyOjpUcmFjazo6UmVzZXQoKSB7Ci0gIGJ1ZmZlcnNfLmNsZWFyKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3dlYm0vd2VibV9jbHVzdGVyX3BhcnNlci5oIGIvc3JjL21lZGlhL3dlYm0vd2VibV9jbHVzdGVyX3BhcnNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzFhMGNiLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS93ZWJtL3dlYm1fY2x1c3Rlcl9wYXJzZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX1dFQk1fV0VCTV9DTFVTVEVSX1BBUlNFUl9IXwotI2RlZmluZSBNRURJQV9XRUJNX1dFQk1fQ0xVU1RFUl9QQVJTRVJfSF8KLQotI2luY2x1ZGUgPGRlcXVlPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfbG9nLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zdHJlYW1fcGFyc2VyX2J1ZmZlci5oIgotI2luY2x1ZGUgIm1lZGlhL3dlYm0vd2VibV9wYXJzZXIuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgTUVESUFfRVhQT1JUIFdlYk1DbHVzdGVyUGFyc2VyIDogcHVibGljIFdlYk1QYXJzZXJDbGllbnQgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBzdGQ6OmRlcXVlPHNjb3BlZF9yZWZwdHI8U3RyZWFtUGFyc2VyQnVmZmVyPiA+IEJ1ZmZlclF1ZXVlOwotCi0gIFdlYk1DbHVzdGVyUGFyc2VyKGludDY0IHRpbWVjb2RlX3NjYWxlLAotICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9fdHJhY2tfbnVtLAotICAgICAgICAgICAgICAgICAgICBpbnQgdmlkZW9fdHJhY2tfbnVtLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXVkaW9fZW5jcnlwdGlvbl9rZXlfaWQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2aWRlb19lbmNyeXB0aW9uX2tleV9pZCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9nQ0ImIGxvZ19jYik7Ci0gIHZpcnR1YWwgfldlYk1DbHVzdGVyUGFyc2VyKCk7Ci0KLSAgLy8gUmVzZXRzIHRoZSBwYXJzZXIgc3RhdGUgc28gaXQgY2FuIGFjY2VwdCBhIG5ldyBjbHVzdGVyLgotICB2b2lkIFJlc2V0KCk7Ci0KLSAgLy8gUGFyc2VzIGEgV2ViTSBjbHVzdGVyIGVsZW1lbnQgaW4gfGJ1ZnwuCi0gIC8vCi0gIC8vIFJldHVybnMgLTEgaWYgdGhlIHBhcnNlIGZhaWxzLgotICAvLyBSZXR1cm5zIDAgaWYgbW9yZSBkYXRhIGlzIG5lZWRlZC4KLSAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBhcnNlZCBvbiBzdWNjZXNzLgotICBpbnQgUGFyc2UoY29uc3QgdWludDgqIGJ1ZiwgaW50IHNpemUpOwotCi0gIGJhc2U6OlRpbWVEZWx0YSBjbHVzdGVyX3N0YXJ0X3RpbWUoKSBjb25zdCB7IHJldHVybiBjbHVzdGVyX3N0YXJ0X3RpbWVfOyB9Ci0gIGNvbnN0IEJ1ZmZlclF1ZXVlJiBhdWRpb19idWZmZXJzKCkgY29uc3QgeyByZXR1cm4gYXVkaW9fLmJ1ZmZlcnMoKTsgfQotICBjb25zdCBCdWZmZXJRdWV1ZSYgdmlkZW9fYnVmZmVycygpIGNvbnN0IHsgcmV0dXJuIHZpZGVvXy5idWZmZXJzKCk7IH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGxhc3QgUGFyc2UoKSBjYWxsIHN0b3BwZWQgYXQgdGhlIGVuZCBvZiBhIGNsdXN0ZXIuCi0gIGJvb2wgY2x1c3Rlcl9lbmRlZCgpIGNvbnN0IHsgcmV0dXJuIGNsdXN0ZXJfZW5kZWRfOyB9Ci0KLSBwcml2YXRlOgotICAvLyBIZWxwZXIgY2xhc3MgdGhhdCBtYW5hZ2VzIHBlci10cmFjayBzdGF0ZS4KLSAgY2xhc3MgVHJhY2sgewotICAgcHVibGljOgotICAgIGV4cGxpY2l0IFRyYWNrKGludCB0cmFja19udW0pOwotICAgIH5UcmFjaygpOwotCi0gICAgaW50IHRyYWNrX251bSgpIGNvbnN0IHsgcmV0dXJuIHRyYWNrX251bV87IH0KLSAgICBjb25zdCBCdWZmZXJRdWV1ZSYgYnVmZmVycygpIGNvbnN0IHsgcmV0dXJuIGJ1ZmZlcnNfOyB9Ci0KLSAgICBib29sIEFkZEJ1ZmZlcihjb25zdCBzY29wZWRfcmVmcHRyPFN0cmVhbVBhcnNlckJ1ZmZlcj4mIGJ1ZmZlcik7Ci0KLSAgICAvLyBDbGVhcnMgYWxsIGJ1ZmZlciBzdGF0ZS4KLSAgICB2b2lkIFJlc2V0KCk7Ci0KLSAgIHByaXZhdGU6Ci0gICAgaW50IHRyYWNrX251bV87Ci0gICAgQnVmZmVyUXVldWUgYnVmZmVyc187Ci0gIH07Ci0KLSAgLy8gV2ViTVBhcnNlckNsaWVudCBtZXRob2RzLgotICB2aXJ0dWFsIFdlYk1QYXJzZXJDbGllbnQqIE9uTGlzdFN0YXJ0KGludCBpZCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgYm9vbCBPbkxpc3RFbmQoaW50IGlkKSBPVkVSUklERTsKLSAgdmlydHVhbCBib29sIE9uVUludChpbnQgaWQsIGludDY0IHZhbCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgYm9vbCBPbkJpbmFyeShpbnQgaWQsIGNvbnN0IHVpbnQ4KiBkYXRhLCBpbnQgc2l6ZSkgT1ZFUlJJREU7Ci0KLSAgYm9vbCBQYXJzZUJsb2NrKGNvbnN0IHVpbnQ4KiBidWYsIGludCBzaXplLCBpbnQgZHVyYXRpb24pOwotICBib29sIE9uQmxvY2soaW50IHRyYWNrX251bSwgaW50IHRpbWVjb2RlLCBpbnQgZHVyYXRpb24sIGludCBmbGFncywKLSAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBkYXRhLCBpbnQgc2l6ZSk7Ci0KLSAgZG91YmxlIHRpbWVjb2RlX211bHRpcGxpZXJfOyAgLy8gTXVsdGlwbGllciB1c2VkIHRvIGNvbnZlcnQgdGltZWNvZGVzIGludG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWljcm9zZWNvbmRzLgotICBzdGQ6OnN0cmluZyBhdWRpb19lbmNyeXB0aW9uX2tleV9pZF87Ci0gIHN0ZDo6c3RyaW5nIHZpZGVvX2VuY3J5cHRpb25fa2V5X2lkXzsKLQotICBXZWJNTGlzdFBhcnNlciBwYXJzZXJfOwotCi0gIGludDY0IGxhc3RfYmxvY2tfdGltZWNvZGVfOwotICBzY29wZWRfYXJyYXk8dWludDg+IGJsb2NrX2RhdGFfOwotICBpbnQgYmxvY2tfZGF0YV9zaXplXzsKLSAgaW50NjQgYmxvY2tfZHVyYXRpb25fOwotCi0gIGludDY0IGNsdXN0ZXJfdGltZWNvZGVfOwotICBiYXNlOjpUaW1lRGVsdGEgY2x1c3Rlcl9zdGFydF90aW1lXzsKLSAgYm9vbCBjbHVzdGVyX2VuZGVkXzsKLQotICBUcmFjayBhdWRpb187Ci0gIFRyYWNrIHZpZGVvXzsKLQotICBMb2dDQiBsb2dfY2JfOwotCi0gIERJU0FMTE9XX0lNUExJQ0lUX0NPTlNUUlVDVE9SUyhXZWJNQ2x1c3RlclBhcnNlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLQotI2VuZGlmICAvLyBNRURJQV9XRUJNX1dFQk1fQ0xVU1RFUl9QQVJTRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS93ZWJtL3dlYm1fY2x1c3Rlcl9wYXJzZXJfdW5pdHRlc3QuY2MgYi9zcmMvbWVkaWEvd2VibS93ZWJtX2NsdXN0ZXJfcGFyc2VyX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODllNjhmLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS93ZWJtL3dlYm1fY2x1c3Rlcl9wYXJzZXJfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgIm1lZGlhL3dlYm0vY2x1c3Rlcl9idWlsZGVyLmgiCi0jaW5jbHVkZSAibWVkaWEvd2VibS93ZWJtX2NsdXN0ZXJfcGFyc2VyLmgiCi0jaW5jbHVkZSAibWVkaWEvd2VibS93ZWJtX2NvbnN0YW50cy5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi11c2luZyA6OnRlc3Rpbmc6OkluU2VxdWVuY2U7Ci11c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKLXVzaW5nIDo6dGVzdGluZzo6XzsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotZW51bSB7Ci0gIGtUaW1lY29kZVNjYWxlID0gMTAwMDAwMCwgIC8vIFRpbWVjb2RlIHNjYWxlIGZvciBtaWxsaXNlY29uZCB0aW1lc3RhbXBzLgotICBrQXVkaW9UcmFja051bSA9IDEsCi0gIGtWaWRlb1RyYWNrTnVtID0gMiwKLX07Ci0KLXN0cnVjdCBCbG9ja0luZm8gewotICBpbnQgdHJhY2tfbnVtOwotICBpbnQgdGltZXN0YW1wOwotICBpbnQgZHVyYXRpb247Ci0gIGJvb2wgdXNlX3NpbXBsZV9ibG9jazsKLX07Ci0KLWNvbnN0IEJsb2NrSW5mbyBrRGVmYXVsdEJsb2NrSW5mb1tdID0gewotICB7IGtBdWRpb1RyYWNrTnVtLCAwLCAyMywgdHJ1ZSB9LAotICB7IGtBdWRpb1RyYWNrTnVtLCAyMywgMjMsIHRydWUgfSwKLSAgeyBrVmlkZW9UcmFja051bSwgMzMsIDM0LCB0cnVlIH0sCi0gIHsga0F1ZGlvVHJhY2tOdW0sIDQ2LCAyMywgdHJ1ZSB9LAotICB7IGtWaWRlb1RyYWNrTnVtLCA2NywgMzMsIGZhbHNlIH0sCi0gIHsga0F1ZGlvVHJhY2tOdW0sIDY5LCAyMywgZmFsc2UgfSwKLSAgeyBrVmlkZW9UcmFja051bSwgMTAwLCAzMywgZmFsc2UgfSwKLX07Ci0KLXN0YXRpYyBzY29wZWRfcHRyPENsdXN0ZXI+IENyZWF0ZUNsdXN0ZXIoaW50IHRpbWVjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCbG9ja0luZm8qIGJsb2NrX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja19jb3VudCkgewotICBDbHVzdGVyQnVpbGRlciBjYjsKLSAgY2IuU2V0Q2x1c3RlclRpbWVjb2RlKDApOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgYmxvY2tfY291bnQ7IGkrKykgewotICAgIHVpbnQ4IGRhdGFbXSA9IHsgMHgwMCB9OwotICAgIGlmIChibG9ja19pbmZvW2ldLnVzZV9zaW1wbGVfYmxvY2spIHsKLSAgICAgIGNiLkFkZFNpbXBsZUJsb2NrKGJsb2NrX2luZm9baV0udHJhY2tfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfaW5mb1tpXS50aW1lc3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAwLCBkYXRhLCBzaXplb2YoZGF0YSkpOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgQ0hFQ0tfR0UoYmxvY2tfaW5mb1tpXS5kdXJhdGlvbiwgMCk7Ci0gICAgY2IuQWRkQmxvY2tHcm91cChibG9ja19pbmZvW2ldLnRyYWNrX251bSwKLSAgICAgICAgICAgICAgICAgICAgIGJsb2NrX2luZm9baV0udGltZXN0YW1wLAotICAgICAgICAgICAgICAgICAgICAgYmxvY2tfaW5mb1tpXS5kdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgIDAsIGRhdGEsIHNpemVvZihkYXRhKSk7Ci0gIH0KLQotICByZXR1cm4gY2IuRmluaXNoKCk7Ci19Ci0KLXN0YXRpYyBib29sIFZlcmlmeUJ1ZmZlcnMoY29uc3QgV2ViTUNsdXN0ZXJQYXJzZXI6OkJ1ZmZlclF1ZXVlJiBhdWRpb19idWZmZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJNQ2x1c3RlclBhcnNlcjo6QnVmZmVyUXVldWUmIHZpZGVvX2J1ZmZlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJsb2NrSW5mbyogYmxvY2tfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrX2NvdW50KSB7Ci0gIHNpemVfdCBhdWRpb19vZmZzZXQgPSAwOwotICBzaXplX3QgdmlkZW9fb2Zmc2V0ID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBibG9ja19jb3VudDsgaSsrKSB7Ci0gICAgY29uc3QgV2ViTUNsdXN0ZXJQYXJzZXI6OkJ1ZmZlclF1ZXVlKiBidWZmZXJzID0gTlVMTDsKLSAgICBzaXplX3QqIG9mZnNldDsKLQotICAgIGlmIChibG9ja19pbmZvW2ldLnRyYWNrX251bSA9PSBrQXVkaW9UcmFja051bSkgewotICAgICAgYnVmZmVycyA9ICZhdWRpb19idWZmZXJzOwotICAgICAgb2Zmc2V0ID0gJmF1ZGlvX29mZnNldDsKLSAgICB9IGVsc2UgaWYgKGJsb2NrX2luZm9baV0udHJhY2tfbnVtID09IGtWaWRlb1RyYWNrTnVtKSB7Ci0gICAgICBidWZmZXJzID0gJnZpZGVvX2J1ZmZlcnM7Ci0gICAgICBvZmZzZXQgPSAmdmlkZW9fb2Zmc2V0OwotICAgIH0gZWxzZSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJVbmV4cGVjdGVkIHRyYWNrIG51bWJlciAiIDw8IGJsb2NrX2luZm9baV0udHJhY2tfbnVtOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICgqb2Zmc2V0ID49IGJ1ZmZlcnMtPnNpemUoKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHNjb3BlZF9yZWZwdHI8U3RyZWFtUGFyc2VyQnVmZmVyPiBidWZmZXIgPSAoKmJ1ZmZlcnMpWygqb2Zmc2V0KSsrXTsKLQotCi0gICAgRVhQRUNUX0VRKGJ1ZmZlci0+R2V0VGltZXN0YW1wKCkuSW5NaWxsaXNlY29uZHMoKSwgYmxvY2tfaW5mb1tpXS50aW1lc3RhbXApOwotCi0gICAgaWYgKCFibG9ja19pbmZvW2ldLnVzZV9zaW1wbGVfYmxvY2spCi0gICAgICBFWFBFQ1RfTkUoYnVmZmVyLT5HZXREdXJhdGlvbigpLCBrTm9UaW1lc3RhbXAoKSk7Ci0KLSAgICBpZiAoYnVmZmVyLT5HZXREdXJhdGlvbigpICE9IGtOb1RpbWVzdGFtcCgpKQotICAgICAgRVhQRUNUX0VRKGJ1ZmZlci0+R2V0RHVyYXRpb24oKS5Jbk1pbGxpc2Vjb25kcygpLCBibG9ja19pbmZvW2ldLmR1cmF0aW9uKTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCBWZXJpZnlCdWZmZXJzKGNvbnN0IHNjb3BlZF9wdHI8V2ViTUNsdXN0ZXJQYXJzZXI+JiBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJsb2NrSW5mbyogYmxvY2tfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrX2NvdW50KSB7Ci0gIHJldHVybiBWZXJpZnlCdWZmZXJzKHBhcnNlci0+YXVkaW9fYnVmZmVycygpLAotICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXItPnZpZGVvX2J1ZmZlcnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfY291bnQpOwotfQotCi1zdGF0aWMgdm9pZCBBcHBlbmRUb0VuZChjb25zdCBXZWJNQ2x1c3RlclBhcnNlcjo6QnVmZmVyUXVldWUmIHNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgIFdlYk1DbHVzdGVyUGFyc2VyOjpCdWZmZXJRdWV1ZSogZGVzdCkgewotICBmb3IgKFdlYk1DbHVzdGVyUGFyc2VyOjpCdWZmZXJRdWV1ZTo6Y29uc3RfaXRlcmF0b3IgaXRyID0gc3JjLmJlZ2luKCk7Ci0gICAgICAgaXRyICE9IHNyYy5lbmQoKTsgKytpdHIpIHsKLSAgICBkZXN0LT5wdXNoX2JhY2soKml0cik7Ci0gIH0KLX0KLQotY2xhc3MgV2ViTUNsdXN0ZXJQYXJzZXJUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgV2ViTUNsdXN0ZXJQYXJzZXJUZXN0KCkKLSAgICAgIDogcGFyc2VyXyhuZXcgV2ViTUNsdXN0ZXJQYXJzZXIoCi0gICAgICAgICAga1RpbWVjb2RlU2NhbGUsIGtBdWRpb1RyYWNrTnVtLCBrVmlkZW9UcmFja051bSwgIiIsICIiLCBMb2dDQigpKSkgewotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHNjb3BlZF9wdHI8V2ViTUNsdXN0ZXJQYXJzZXI+IHBhcnNlcl87Ci19OwotCi1URVNUX0YoV2ViTUNsdXN0ZXJQYXJzZXJUZXN0LCBUZXN0UmVzZXQpIHsKLSAgSW5TZXF1ZW5jZSBzOwotCi0gIGludCBibG9ja19jb3VudCA9IGFycmF5c2l6ZShrRGVmYXVsdEJsb2NrSW5mbyk7Ci0gIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gY2x1c3RlcihDcmVhdGVDbHVzdGVyKDAsIGtEZWZhdWx0QmxvY2tJbmZvLCBibG9ja19jb3VudCkpOwotCi0gIC8vIFNlbmQgc2xpZ2h0bHkgbGVzcyB0aGFuIHRoZSBmdWxsIGNsdXN0ZXIgc28gYWxsIGJ1dCB0aGUgbGFzdCBibG9jayBpcwotICAvLyBwYXJzZWQuCi0gIGludCByZXN1bHQgPSBwYXJzZXJfLT5QYXJzZShjbHVzdGVyLT5kYXRhKCksIGNsdXN0ZXItPnNpemUoKSAtIDEpOwotICBFWFBFQ1RfR1QocmVzdWx0LCAwKTsKLSAgRVhQRUNUX0xUKHJlc3VsdCwgY2x1c3Rlci0+c2l6ZSgpKTsKLQotICBBU1NFUlRfVFJVRShWZXJpZnlCdWZmZXJzKHBhcnNlcl8sIGtEZWZhdWx0QmxvY2tJbmZvLCBibG9ja19jb3VudCAtIDEpKTsKLSAgcGFyc2VyXy0+UmVzZXQoKTsKLQotICAvLyBOb3cgcGFyc2UgYSB3aG9sZSBjbHVzdGVyIHRvIHZlcmlmeSB0aGF0IGFsbCB0aGUgYmxvY2tzIHdpbGwgZ2V0IHBhcnNlZC4KLSAgcmVzdWx0ID0gcGFyc2VyXy0+UGFyc2UoY2x1c3Rlci0+ZGF0YSgpLCBjbHVzdGVyLT5zaXplKCkpOwotICBFWFBFQ1RfRVEocmVzdWx0LCBjbHVzdGVyLT5zaXplKCkpOwotICBBU1NFUlRfVFJVRShWZXJpZnlCdWZmZXJzKHBhcnNlcl8sIGtEZWZhdWx0QmxvY2tJbmZvLCBibG9ja19jb3VudCkpOwotfQotCi1URVNUX0YoV2ViTUNsdXN0ZXJQYXJzZXJUZXN0LCBQYXJzZUNsdXN0ZXJXaXRoU2luZ2xlQ2FsbCkgewotICBpbnQgYmxvY2tfY291bnQgPSBhcnJheXNpemUoa0RlZmF1bHRCbG9ja0luZm8pOwotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXIoQ3JlYXRlQ2x1c3RlcigwLCBrRGVmYXVsdEJsb2NrSW5mbywgYmxvY2tfY291bnQpKTsKLQotICBpbnQgcmVzdWx0ID0gcGFyc2VyXy0+UGFyc2UoY2x1c3Rlci0+ZGF0YSgpLCBjbHVzdGVyLT5zaXplKCkpOwotICBFWFBFQ1RfRVEoY2x1c3Rlci0+c2l6ZSgpLCByZXN1bHQpOwotICBBU1NFUlRfVFJVRShWZXJpZnlCdWZmZXJzKHBhcnNlcl8sIGtEZWZhdWx0QmxvY2tJbmZvLCBibG9ja19jb3VudCkpOwotfQotCi1URVNUX0YoV2ViTUNsdXN0ZXJQYXJzZXJUZXN0LCBQYXJzZUNsdXN0ZXJXaXRoTXVsdGlwbGVDYWxscykgewotICBpbnQgYmxvY2tfY291bnQgPSBhcnJheXNpemUoa0RlZmF1bHRCbG9ja0luZm8pOwotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXIoQ3JlYXRlQ2x1c3RlcigwLCBrRGVmYXVsdEJsb2NrSW5mbywgYmxvY2tfY291bnQpKTsKLQotICBXZWJNQ2x1c3RlclBhcnNlcjo6QnVmZmVyUXVldWUgYXVkaW9fYnVmZmVyczsKLSAgV2ViTUNsdXN0ZXJQYXJzZXI6OkJ1ZmZlclF1ZXVlIHZpZGVvX2J1ZmZlcnM7Ci0KLSAgY29uc3QgdWludDgqIGRhdGEgPSBjbHVzdGVyLT5kYXRhKCk7Ci0gIGludCBzaXplID0gY2x1c3Rlci0+c2l6ZSgpOwotICBpbnQgZGVmYXVsdF9wYXJzZV9zaXplID0gMzsKLSAgaW50IHBhcnNlX3NpemUgPSBzdGQ6Om1pbihkZWZhdWx0X3BhcnNlX3NpemUsIHNpemUpOwotCi0gIHdoaWxlIChzaXplID4gMCkgewotICAgIGludCByZXN1bHQgPSBwYXJzZXJfLT5QYXJzZShkYXRhLCBwYXJzZV9zaXplKTsKLSAgICBBU1NFUlRfR0UocmVzdWx0LCAwKTsKLSAgICBBU1NFUlRfTEUocmVzdWx0LCBwYXJzZV9zaXplKTsKLQotICAgIGlmIChyZXN1bHQgPT0gMCkgewotICAgICAgLy8gVGhlIHBhcnNlciBuZWVkcyBtb3JlIGRhdGEgc28gaW5jcmVhc2UgdGhlIHBhcnNlX3NpemUgYSBsaXR0bGUuCi0gICAgICBwYXJzZV9zaXplICs9IGRlZmF1bHRfcGFyc2Vfc2l6ZTsKLSAgICAgIHBhcnNlX3NpemUgPSBzdGQ6Om1pbihwYXJzZV9zaXplLCBzaXplKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIEFwcGVuZFRvRW5kKHBhcnNlcl8tPmF1ZGlvX2J1ZmZlcnMoKSwgJmF1ZGlvX2J1ZmZlcnMpOwotICAgIEFwcGVuZFRvRW5kKHBhcnNlcl8tPnZpZGVvX2J1ZmZlcnMoKSwgJnZpZGVvX2J1ZmZlcnMpOwotCi0gICAgcGFyc2Vfc2l6ZSA9IGRlZmF1bHRfcGFyc2Vfc2l6ZTsKLQotICAgIGRhdGEgKz0gcmVzdWx0OwotICAgIHNpemUgLT0gcmVzdWx0OwotICB9Ci0gIEFTU0VSVF9UUlVFKFZlcmlmeUJ1ZmZlcnMoYXVkaW9fYnVmZmVycywgdmlkZW9fYnVmZmVycywga0RlZmF1bHRCbG9ja0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfY291bnQpKTsKLX0KLQotLy8gVmVyaWZ5IHRoYXQgYm90aCBCbG9ja0dyb3VwcyB3aXRoIHRoZSBCbG9ja0R1cmF0aW9uIGJlZm9yZSB0aGUgQmxvY2sKLS8vIGFuZCBCbG9ja0dyb3VwcyB3aXRoIHRoZSBCbG9ja0R1cmF0aW9uIGFmdGVyIHRoZSBCbG9jayBhcmUgc3VwcG9ydGVkCi0vLyBjb3JyZWN0bHkuCi0vLyBOb3RlOiBSYXcgYnl0ZXMgYXJlIHVzZSBoZXJlIGJlY2F1c2UgQ2x1c3RlckJ1aWxkZXIgb25seSBnZW5lcmF0ZXMKLS8vIG9uZSBvZiB0aGVzZSBzY2VuYXJpb3MuCi1URVNUX0YoV2ViTUNsdXN0ZXJQYXJzZXJUZXN0LCBQYXJzZUJsb2NrR3JvdXApIHsKLSAgY29uc3QgQmxvY2tJbmZvIGtCbG9ja0luZm9bXSA9IHsKLSAgICB7IGtBdWRpb1RyYWNrTnVtLCAwLCAyMywgZmFsc2UgfSwKLSAgICB7IGtWaWRlb1RyYWNrTnVtLCAzMywgMzQsIGZhbHNlIH0sCi0gIH07Ci0gIGludCBibG9ja19jb3VudCA9IGFycmF5c2l6ZShrQmxvY2tJbmZvKTsKLQotICBjb25zdCB1aW50OCBrQ2x1c3RlckRhdGFbXSA9IHsKLSAgICAweDFGLCAweDQzLCAweEI2LCAweDc1LCAweDlCLCAgLy8gQ2x1c3RlcihzaXplPTI3KQotICAgIDB4RTcsIDB4ODEsIDB4MDAsICAvLyBUaW1lY29kZShzaXplPTEsIHZhbHVlPTApCi0gICAgLy8gQmxvY2tHcm91cCB3aXRoIEJsb2NrRHVyYXRpb24gYmVmb3JlIEJsb2NrLgotICAgIDB4QTAsIDB4OEEsICAvLyBCbG9ja0dyb3VwKHNpemU9MTApCi0gICAgMHg5QiwgMHg4MSwgMHgxNywgIC8vIEJsb2NrRHVyYXRpb24oc2l6ZT0xLCB2YWx1ZT0yMykKLSAgICAweEExLCAweDg1LCAweDgxLCAweDAwLCAweDAwLCAweDAwLCAweGFhLCAgLy8gQmxvY2soc2l6ZT01LCB0cmFjaz0xLCB0cz0wKQotICAgIC8vIEJsb2NrR3JvdXAgd2l0aCBCbG9ja0R1cmF0aW9uIGFmdGVyIEJsb2NrLgotICAgIDB4QTAsIDB4OEEsICAvLyBCbG9ja0dyb3VwKHNpemU9MTApCi0gICAgMHhBMSwgMHg4NSwgMHg4MiwgMHgwMCwgMHgyMSwgMHgwMCwgMHg1NSwgIC8vIEJsb2NrKHNpemU9NSwgdHJhY2s9MiwgdHM9MzMpCi0gICAgMHg5QiwgMHg4MSwgMHgyMiwgIC8vIEJsb2NrRHVyYXRpb24oc2l6ZT0xLCB2YWx1ZT0zNCkKLSAgfTsKLSAgY29uc3QgaW50IGtDbHVzdGVyU2l6ZSA9IHNpemVvZihrQ2x1c3RlckRhdGEpOwotCi0gIGludCByZXN1bHQgPSBwYXJzZXJfLT5QYXJzZShrQ2x1c3RlckRhdGEsIGtDbHVzdGVyU2l6ZSk7Ci0gIEVYUEVDVF9FUShyZXN1bHQsIGtDbHVzdGVyU2l6ZSk7Ci0gIEFTU0VSVF9UUlVFKFZlcmlmeUJ1ZmZlcnMocGFyc2VyXywga0Jsb2NrSW5mbywgYmxvY2tfY291bnQpKTsKLX0KLQotVEVTVF9GKFdlYk1DbHVzdGVyUGFyc2VyVGVzdCwgUGFyc2VTaW1wbGVCbG9ja0FuZEJsb2NrR3JvdXBNaXh0dXJlKSB7Ci0gIGNvbnN0IEJsb2NrSW5mbyBrQmxvY2tJbmZvW10gPSB7Ci0gICAgeyBrQXVkaW9UcmFja051bSwgMCwgMjMsIHRydWUgfSwKLSAgICB7IGtBdWRpb1RyYWNrTnVtLCAyMywgMjMsIGZhbHNlIH0sCi0gICAgeyBrVmlkZW9UcmFja051bSwgMzMsIDM0LCB0cnVlIH0sCi0gICAgeyBrQXVkaW9UcmFja051bSwgNDYsIDIzLCBmYWxzZSB9LAotICAgIHsga1ZpZGVvVHJhY2tOdW0sIDY3LCAzMywgZmFsc2UgfSwKLSAgfTsKLSAgaW50IGJsb2NrX2NvdW50ID0gYXJyYXlzaXplKGtCbG9ja0luZm8pOwotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXIoQ3JlYXRlQ2x1c3RlcigwLCBrQmxvY2tJbmZvLCBibG9ja19jb3VudCkpOwotCi0gIGludCByZXN1bHQgPSBwYXJzZXJfLT5QYXJzZShjbHVzdGVyLT5kYXRhKCksIGNsdXN0ZXItPnNpemUoKSk7Ci0gIEVYUEVDVF9FUShjbHVzdGVyLT5zaXplKCksIHJlc3VsdCk7Ci0gIEFTU0VSVF9UUlVFKFZlcmlmeUJ1ZmZlcnMocGFyc2VyXywga0Jsb2NrSW5mbywgYmxvY2tfY291bnQpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvd2VibS93ZWJtX2NvbG91cl9wYXJzZXIuY2MgYi9zcmMvbWVkaWEvd2VibS93ZWJtX2NvbG91cl9wYXJzZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMTJjNTIuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3dlYm0vd2VibV9jb2xvdXJfcGFyc2VyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTUwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL3dlYm0vd2VibV9jb2xvdXJfcGFyc2VyLmgiCi0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJtZWRpYS93ZWJtL3dlYm1fY29uc3RhbnRzLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIFRoZSBkZWZpbml0aW9ucyBiZWxvdyBhcmUgY29waWVkIGZyb20gdGhlIGN1cnJlbnQgbGlid2VibSB0b3Atb2YtdHJlZS4KLS8vIENocm9taXVtJ3MgdGhpcmRfcGFydHkvbGlid2VibSBkb2Vzbid0IGhhdmUgdGhlc2UgeWV0LiBXZSBjYW4gcHJvYmFibHkganVzdAotLy8gaW5jbHVkZSBsaWJ3ZWJtIGhlYWRlciBkaXJlY3RseSBpbiB0aGUgZnV0dXJlLgotLy8gLS0tLSBCZWdpbiBjb3B5L3Bhc3RlIGZyb20gbGlid2VibS93ZWJtX3BhcnNlci9pbmNsdWRlL3dlYm0vZG9tX3R5cGVzLmggLS0tLQotCi0vKioKLSBBIHBhcnNlZCBcV2ViTUlEe01hdHJpeENvZWZmaWNpZW50c30gZWxlbWVudC4KLQotIE1hdHJvc2thL1dlYk0gYWRvcHRlZCB0aGVzZSB2YWx1ZXMgZnJvbSBUYWJsZSA0IG9mIElTTy9JRUMgMjMwMDEtODoyMDEzL0RDT1IxLgotIFNlZSB0aGF0IGRvY3VtZW50IGZvciBmdXJ0aGVyIGRldGFpbHMuCi0gKi8KLWVudW0gTWF0cml4Q29lZmZpY2llbnRzIHsKLSAgLyoqCi0gICBUaGUgaWRlbnRpdHkgbWF0cml4LgotCi0gICBUeXBpY2FsbHkgdXNlZCBmb3IgR0JSIChvZnRlbiByZWZlcnJlZCB0byBhcyBSR0IpOyBob3dldmVyLCBtYXkgYWxzbyBiZSB1c2VkCi0gICBmb3IgWVpYIChvZnRlbiByZWZlcnJlZCB0byBhcyBYWVopLgotICAgKi8KLSAga01hdHJpeENvZWZmaWNpZW50c1JnYiA9IDAsCi0KLSAgLyoqCi0gICBSZWMuIElUVS1SIEJULjcwOS01LgotICAgKi8KLSAga01hdHJpeENvZWZmaWNpZW50c0J0NzA5ID0gMSwKLQotICAvKioKLSAgIEltYWdlIGNoYXJhY3RlcmlzdGljcyBhcmUgdW5rbm93biBvciBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgYXBwbGljYXRpb24uCi0gICAqLwotICBrTWF0cml4Q29lZmZpY2llbnRzVW5zcGVjaWZpZWQgPSAyLAotCi0gIC8qKgotICAgVW5pdGVkIFN0YXRlcyBGZWRlcmFsIENvbW11bmljYXRpb25zIENvbW1pc3Npb24gVGl0bGUgNDcgQ29kZSBvZiBGZWRlcmFsCi0gICBSZWd1bGF0aW9ucyAoMjAwMykgNzMuNjgyIChhKSAoMjApLgotICAgKi8KLSAga01hdHJpeENvZWZmaWNpZW50c0ZjYyA9IDQsCi0KLSAgLyoqCi0gICBSZWMuIElUVS1SIEJULjQ3MOKAkTYgU3lzdGVtIEIsIEcgKGhpc3RvcmljYWwpLgotICAgKi8KLSAga01hdHJpeENvZWZmaWNpZW50c0J0NDcwQmcgPSA1LAotCi0gIC8qKgotICAgU29jaWV0eSBvZiBNb3Rpb24gUGljdHVyZSBhbmQgVGVsZXZpc2lvbiBFbmdpbmVlcnMgMTcwTSAoMjAwNCkuCi0gICAqLwotICBrTWF0cml4Q29lZmZpY2llbnRzU21wdGUxNzBNID0gNiwKLQotICAvKioKLSAgIFNvY2lldHkgb2YgTW90aW9uIFBpY3R1cmUgYW5kIFRlbGV2aXNpb24gRW5naW5lZXJzIDI0ME0gKDE5OTkpLgotICAgKi8KLSAga01hdHJpeENvZWZmaWNpZW50c1NtcHRlMjQwTSA9IDcsCi0KLSAgLyoqCi0gICBZQ2dDby4KLSAgICovCi0gIGtNYXRyaXhDb2VmZmljaWVudHNZQ2dDbyA9IDgsCi0KLSAgLyoqCi0gICBSZWMuIElUVS1SIEJULjIwMjAgKG5vbi1jb25zdGFudCBsdW1pbmFuY2UpLgotICAgKi8KLSAga01hdHJpeENvZWZmaWNpZW50c0J0MjAyME5vbmNvbnN0YW50THVtaW5hbmNlID0gOSwKLQotICAvKioKLSAgIFJlYy4gSVRVLVIgQlQuMjAyMCAoY29uc3RhbnQgbHVtaW5hbmNlKS4KLSAgICovCi0gIGtNYXRyaXhDb2VmZmljaWVudHNCdDIwMjBDb25zdGFudEx1bWluYW5jZSA9IDEwLAotfTsKLQotLyoqCi0gQSBwYXJzZWQgXFdlYk1JRHtSYW5nZX0gZWxlbWVudC4KLSAqLwotZW51bSBSYW5nZSB7Ci0gIC8qKgotICAgVW5zcGVjaWZpZWQuCi0gICAqLwotICBrUmFuZ2VVbnNwZWNpZmllZCA9IDAsCi0KLSAgLyoqCi0gICBCcm9hZGNhc3QgcmFuZ2UuCi0gICAqLwotICBrUmFuZ2VCcm9hZGNhc3QgPSAxLAotCi0gIC8qKgotICAgRnVsbCByYW5nZSAobm8gY2xpcHBpbmcpLgotICAgKi8KLSAga1JhbmdlRnVsbCA9IDIsCi0KLSAgLyoqCi0gICBEZWZpbmVkIGJ5IE1hdHJpeENvZWZmaWNpZW50cy9UcmFuc2ZlckNoYXJhY3RlcmlzdGljcy4KLSAgICovCi0gIGtSYW5nZURlcml2ZWQgPSAzLAotfTsKLQotLyoqCi0gQSBwYXJzZWQgXFdlYk1JRHtUcmFuc2ZlckNoYXJhY3RlcmlzdGljc30gZWxlbWVudC4KLQotIE1hdHJvc2thL1dlYk0gYWRvcHRlZCB0aGVzZSB2YWx1ZXMgZnJvbSBUYWJsZSAzIG9mIElTTy9JRUMgMjMwMDEtODoyMDEzL0RDT1IxLgotIFNlZSB0aGF0IGRvY3VtZW50IGZvciBmdXJ0aGVyIGRldGFpbHMuCi0gKi8KLWVudW0gVHJhbnNmZXJDaGFyYWN0ZXJpc3RpY3MgewotICAvKioKLSAgIFJlYy4gSVRVLVIgQlQuNzA5LTYuCi0gICAqLwotICBrVHJhbnNmZXJDaGFyYWN0ZXJpc3RpY3NCdDcwOSA9IDEsCi0KLSAgLyoqCi0gICBJbWFnZSBjaGFyYWN0ZXJpc3RpY3MgYXJlIHVua25vd24gb3IgYXJlIGRldGVybWluZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgotICAgKi8KLSAga1RyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzVW5zcGVjaWZpZWQgPSAyLAotCi0gIC8qKgotICAgUmVjLiBJVFXigJFSIEJULjQ3MOKAkTYgU3lzdGVtIE0gKGhpc3RvcmljYWwpIHdpdGggYXNzdW1lZCBkaXNwbGF5IGdhbW1hIDIuMi4KLSAgICovCi0gIGtUcmFuc2ZlckNoYXJhY3RlcmlzdGljc0dhbW1hMjJjdXJ2ZSA9IDQsCi0KLSAgLyoqCi0gICBSZWMuIElUVeKAkVIgQlQuNDcwLTYgU3lzdGVtIEIsIEcgKGhpc3RvcmljYWwpIHdpdGggYXNzdW1lZCBkaXNwbGF5IGdhbW1hIDIuOC4KLSAgICovCi0gIGtUcmFuc2ZlckNoYXJhY3RlcmlzdGljc0dhbW1hMjhjdXJ2ZSA9IDUsCi0KLSAgLyoqCi0gICBTb2NpZXR5IG9mIE1vdGlvbiBQaWN0dXJlIGFuZCBUZWxldmlzaW9uIEVuZ2luZWVycyAxNzBNICgyMDA0KS4KLSAgICovCi0gIGtUcmFuc2ZlckNoYXJhY3RlcmlzdGljc1NtcHRlMTcwTSA9IDYsCi0KLSAgLyoqCi0gICBTb2NpZXR5IG9mIE1vdGlvbiBQaWN0dXJlIGFuZCBUZWxldmlzaW9uIEVuZ2luZWVycyAyNDBNICgxOTk5KS4KLSAgICovCi0gIGtUcmFuc2ZlckNoYXJhY3RlcmlzdGljc1NtcHRlMjQwTSA9IDcsCi0KLSAgLyoqCi0gICBMaW5lYXIgdHJhbnNmZXIgY2hhcmFjdGVyaXN0aWNzLgotICAgKi8KLSAga1RyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzTGluZWFyID0gOCwKLQotICAvKioKLSAgIExvZ2FyaXRobWljIHRyYW5zZmVyIGNoYXJhY3RlcmlzdGljICgxMDA6MSByYW5nZSkuCi0gICAqLwotICBrVHJhbnNmZXJDaGFyYWN0ZXJpc3RpY3NMb2cgPSA5LAotCi0gIC8qKgotICAgTG9nYXJpdGhtaWMgdHJhbnNmZXIgY2hhcmFjdGVyaXN0aWMgKDEwMCAqIFNxcnQoMTApIDogMSByYW5nZSkuCi0gICAqLwotICBrVHJhbnNmZXJDaGFyYWN0ZXJpc3RpY3NMb2dTcXJ0ID0gMTAsCi0KLSAgLyoqCi0gICBJRUMgNjE5NjYtMi00LgotICAgKi8KLSAga1RyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzSWVjNjE5NjYyNCA9IDExLAotCi0gIC8qKgotICAgUmVjLiBJVFXigJFSIEJULjEzNjEtMCBleHRlbmRlZCBjb2xvdXIgZ2FtdXQgc3lzdGVtIChoaXN0b3JpY2FsKS4KLSAgICovCi0gIGtUcmFuc2ZlckNoYXJhY3RlcmlzdGljc0J0MTM2MUV4dGVuZGVkQ29sb3VyR2FtdXQgPSAxMiwKLQotICAvKioKLSAgIElFQyA2MTk2Ni0yLTEgc1JHQiBvciBzWUNDLgotICAgKi8KLSAga1RyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzSWVjNjE5NjYyMSA9IDEzLAotCi0gIC8qKgotICAgUmVjLiBJVFUtUiBCVC4yMDIwLTIgKDEwLWJpdCBzeXN0ZW0pLgotICAgKi8KLSAga1RyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzMTBCaXRCdDIwMjAgPSAxNCwKLQotICAvKioKLSAgIFJlYy4gSVRVLVIgQlQuMjAyMC0yICgxMi1iaXQgc3lzdGVtKS4KLSAgICovCi0gIGtUcmFuc2ZlckNoYXJhY3RlcmlzdGljczEyQml0QnQyMDIwID0gMTUsCi0KLSAgLyoqCi0gICBTb2NpZXR5IG9mIE1vdGlvbiBQaWN0dXJlIGFuZCBUZWxldmlzaW9uIEVuZ2luZWVycyBTVCAyMDg0LgotICAgKi8KLSAga1RyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzU21wdGVTdDIwODQgPSAxNiwKLQotICAvKioKLSAgIFNvY2lldHkgb2YgTW90aW9uIFBpY3R1cmUgYW5kIFRlbGV2aXNpb24gRW5naW5lZXJzIFNUIDQyOC0xLgotICAgKi8KLSAga1RyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzU21wdGVTdDQyODEgPSAxNywKLQotICAvKioKLSAgIEFzc29jaWF0aW9uIG9mIFJhZGlvIEluZHVzdHJpZXMgYW5kIEJ1c2luZXNzZXMgKEFSSUIpIFNURC1CNjcuCi0gICAqLwotICBrVHJhbnNmZXJDaGFyYWN0ZXJpc3RpY3NBcmliU3RkQjY3SGxnID0gMTgsCi19OwotCi0vKioKLSBBIHBhcnNlZCBcV2ViTUlEe1ByaW1hcmllc30gZWxlbWVudC4KLQotIE1hdHJvc2thL1dlYk0gYWRvcHRlZCB0aGVzZSB2YWx1ZXMgZnJvbSBUYWJsZSAyIG9mIElTTy9JRUMgMjMwMDEtODoyMDEzL0RDT1IxLgotIFNlZSB0aGF0IGRvY3VtZW50IGZvciBmdXJ0aGVyIGRldGFpbHMuCi0gKi8KLWVudW0gUHJpbWFyaWVzIHsKLSAgLyoqCi0gICBSZWMuIElUVeKAkVIgQlQuNzA5LTYuCi0gICAqLwotICBrUHJpbWFyaWVzQnQ3MDkgPSAxLAotCi0gIC8qKgotICAgSW1hZ2UgY2hhcmFjdGVyaXN0aWNzIGFyZSB1bmtub3duIG9yIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KLSAgICovCi0gIGtQcmltYXJpZXNVbnNwZWNpZmllZCA9IDIsCi0KLSAgLyoqCi0gICBSZWMuIElUVeKAkVIgQlQuNDcw4oCRNiBTeXN0ZW0gTSAoaGlzdG9yaWNhbCkuCi0gICAqLwotICBrUHJpbWFyaWVzQnQ0NzBNID0gNCwKLQotICAvKioKLSAgIFJlYy4gSVRV4oCRUiBCVC40NzDigJE2IFN5c3RlbSBCLCBHIChoaXN0b3JpY2FsKS4KLSAgICovCi0gIGtQcmltYXJpZXNCdDQ3MEJnID0gNSwKLQotICAvKioKLSAgIFNvY2lldHkgb2YgTW90aW9uIFBpY3R1cmUgYW5kIFRlbGV2aXNpb24gRW5naW5lZXJzIDE3ME0gKDIwMDQpLgotICAgKi8KLSAga1ByaW1hcmllc1NtcHRlMTcwTSA9IDYsCi0KLSAgLyoqCi0gICBTb2NpZXR5IG9mIE1vdGlvbiBQaWN0dXJlIGFuZCBUZWxldmlzaW9uIEVuZ2luZWVycyAyNDBNICgxOTk5KS4KLSAgICovCi0gIGtQcmltYXJpZXNTbXB0ZTI0ME0gPSA3LAotCi0gIC8qKgotICAgR2VuZXJpYyBmaWxtLgotICAgKi8KLSAga1ByaW1hcmllc0ZpbG0gPSA4LAotCi0gIC8qKgotICAgUmVjLiBJVFUtUiBCVC4yMDIwLTIuCi0gICAqLwotICBrUHJpbWFyaWVzQnQyMDIwID0gOSwKLQotICAvKioKLSAgIFNvY2lldHkgb2YgTW90aW9uIFBpY3R1cmUgYW5kIFRlbGV2aXNpb24gRW5naW5lZXJzIFNUIDQyOC0xLgotICAgKi8KLSAga1ByaW1hcmllc1NtcHRlU3Q0MjgxID0gMTAsCi0KLSAgLyoqCi0gICBKRURFQyBQMjIgcGhvc3Bob3JzL0VCVSBUZWNoLiAzMjEzLUUgKDE5NzUpLgotICAgKi8KLSAga1ByaW1hcmllc0plZGVjUDIyUGhvc3Bob3JzID0gMjIsCi19OwotCi0vLyAtLS0tIEVuZCBjb3B5L3Bhc3RlIGZyb20gbGlid2VibS93ZWJtX3BhcnNlci9pbmNsdWRlL3dlYm0vZG9tX3R5cGVzLmggLS0tLQotCi0vLyBFbnN1cmUgdGhhdCBsaWJ3ZWJtIGVudW0gdmFsdWVzIG1hdGNoIGVudW1zIGluIGdmeDo6Q29sb3JTcGFjZS4KLSNkZWZpbmUgU1RBVElDX0FTU0VSVF9FTlVNKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgQ09NUElMRV9BU1NFUlQoc3RhdGljX2Nhc3Q8aW50PihhKSA9PSBzdGF0aWNfY2FzdDxpbnQ+KGdmeDo6Q29sb3JTcGFjZTo6YiksIFwKLSAgICAgICAgICAgICAgICAgbWlzbWF0Y2hpbmdfZW51bXMpCi0KLVNUQVRJQ19BU1NFUlRfRU5VTShrTWF0cml4Q29lZmZpY2llbnRzUmdiLCBrTWF0cml4SWRSZ2IpOwotU1RBVElDX0FTU0VSVF9FTlVNKGtNYXRyaXhDb2VmZmljaWVudHNCdDcwOSwga01hdHJpeElkQnQ3MDkpOwotCi1TVEFUSUNfQVNTRVJUX0VOVU0oa01hdHJpeENvZWZmaWNpZW50c1Vuc3BlY2lmaWVkLCBrTWF0cml4SWRVbnNwZWNpZmllZCk7Ci1TVEFUSUNfQVNTRVJUX0VOVU0oa01hdHJpeENvZWZmaWNpZW50c0ZjYywga01hdHJpeElkRmNjKTsKLVNUQVRJQ19BU1NFUlRfRU5VTShrTWF0cml4Q29lZmZpY2llbnRzQnQ0NzBCZywga01hdHJpeElkQnQ0NzBCZyk7Ci1TVEFUSUNfQVNTRVJUX0VOVU0oa01hdHJpeENvZWZmaWNpZW50c1NtcHRlMTcwTSwga01hdHJpeElkU21wdGUxNzBNKTsKLVNUQVRJQ19BU1NFUlRfRU5VTShrTWF0cml4Q29lZmZpY2llbnRzU21wdGUyNDBNLCBrTWF0cml4SWRTbXB0ZTI0ME0pOwotU1RBVElDX0FTU0VSVF9FTlVNKGtNYXRyaXhDb2VmZmljaWVudHNZQ2dDbywga01hdHJpeElkWUNnQ28pOwotU1RBVElDX0FTU0VSVF9FTlVNKGtNYXRyaXhDb2VmZmljaWVudHNCdDIwMjBOb25jb25zdGFudEx1bWluYW5jZSwKLSAgICAgICAgICAgICAgICAgICBrTWF0cml4SWRCdDIwMjBOb25jb25zdGFudEx1bWluYW5jZSk7Ci1TVEFUSUNfQVNTRVJUX0VOVU0oa01hdHJpeENvZWZmaWNpZW50c0J0MjAyMENvbnN0YW50THVtaW5hbmNlLAotICAgICAgICAgICAgICAgICAgIGtNYXRyaXhJZEJ0MjAyMENvbnN0YW50THVtaW5hbmNlKTsKLQotZ2Z4OjpDb2xvclNwYWNlOjpNYXRyaXhJRCBGcm9tV2ViTU1hdHJpeENvZWZmaWNpZW50cyhNYXRyaXhDb2VmZmljaWVudHMgYykgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8Z2Z4OjpDb2xvclNwYWNlOjpNYXRyaXhJRD4oYyk7Ci19Ci0KLVNUQVRJQ19BU1NFUlRfRU5VTShrUmFuZ2VVbnNwZWNpZmllZCwga1JhbmdlSWRVbnNwZWNpZmllZCk7Ci1TVEFUSUNfQVNTRVJUX0VOVU0oa1JhbmdlQnJvYWRjYXN0LCBrUmFuZ2VJZExpbWl0ZWQpOwotU1RBVElDX0FTU0VSVF9FTlVNKGtSYW5nZUZ1bGwsIGtSYW5nZUlkRnVsbCk7Ci1TVEFUSUNfQVNTRVJUX0VOVU0oa1JhbmdlRGVyaXZlZCwga1JhbmdlSWREZXJpdmVkKTsKLQotZ2Z4OjpDb2xvclNwYWNlOjpSYW5nZUlEIEZyb21XZWJNUmFuZ2UoUmFuZ2UgcmFuZ2UpIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGdmeDo6Q29sb3JTcGFjZTo6UmFuZ2VJRD4ocmFuZ2UpOwotfQotCi1TVEFUSUNfQVNTRVJUX0VOVU0oa1RyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzQnQ3MDksIGtUcmFuc2ZlcklkQnQ3MDkpOwotU1RBVElDX0FTU0VSVF9FTlVNKGtUcmFuc2ZlckNoYXJhY3RlcmlzdGljc1Vuc3BlY2lmaWVkLAotICAgICAgICAgICAgICAgICAgIGtUcmFuc2ZlcklkVW5zcGVjaWZpZWQpOwotU1RBVElDX0FTU0VSVF9FTlVNKGtUcmFuc2ZlckNoYXJhY3RlcmlzdGljc0dhbW1hMjJjdXJ2ZSwga1RyYW5zZmVySWRHYW1tYTIyKTsKLVNUQVRJQ19BU1NFUlRfRU5VTShrVHJhbnNmZXJDaGFyYWN0ZXJpc3RpY3NHYW1tYTI4Y3VydmUsIGtUcmFuc2ZlcklkR2FtbWEyOCk7Ci1TVEFUSUNfQVNTRVJUX0VOVU0oa1RyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzU21wdGUxNzBNLCBrVHJhbnNmZXJJZFNtcHRlMTcwTSk7Ci1TVEFUSUNfQVNTRVJUX0VOVU0oa1RyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzU21wdGUyNDBNLCBrVHJhbnNmZXJJZFNtcHRlMjQwTSk7Ci1TVEFUSUNfQVNTRVJUX0VOVU0oa1RyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzTGluZWFyLCBrVHJhbnNmZXJJZExpbmVhcik7Ci1TVEFUSUNfQVNTRVJUX0VOVU0oa1RyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzTG9nLCBrVHJhbnNmZXJJZExvZyk7Ci1TVEFUSUNfQVNTRVJUX0VOVU0oa1RyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzTG9nU3FydCwga1RyYW5zZmVySWRMb2dTcXJ0KTsKLVNUQVRJQ19BU1NFUlRfRU5VTShrVHJhbnNmZXJDaGFyYWN0ZXJpc3RpY3NJZWM2MTk2NjI0LAotICAgICAgICAgICAgICAgICAgIGtUcmFuc2ZlcklkSWVjNjE5NjYyNCk7Ci1TVEFUSUNfQVNTRVJUX0VOVU0oa1RyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzQnQxMzYxRXh0ZW5kZWRDb2xvdXJHYW11dCwKLSAgICAgICAgICAgICAgICAgICBrVHJhbnNmZXJJZEJ0MTM2MUVjZyk7Ci1TVEFUSUNfQVNTRVJUX0VOVU0oa1RyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzSWVjNjE5NjYyMSwKLSAgICAgICAgICAgICAgICAgICBrVHJhbnNmZXJJZEllYzYxOTY2MjEpOwotU1RBVElDX0FTU0VSVF9FTlVNKGtUcmFuc2ZlckNoYXJhY3RlcmlzdGljczEwQml0QnQyMDIwLAotICAgICAgICAgICAgICAgICAgIGtUcmFuc2ZlcklkMTBCaXRCdDIwMjApOwotU1RBVElDX0FTU0VSVF9FTlVNKGtUcmFuc2ZlckNoYXJhY3RlcmlzdGljczEyQml0QnQyMDIwLAotICAgICAgICAgICAgICAgICAgIGtUcmFuc2ZlcklkMTJCaXRCdDIwMjApOwotU1RBVElDX0FTU0VSVF9FTlVNKGtUcmFuc2ZlckNoYXJhY3RlcmlzdGljc1NtcHRlU3QyMDg0LAotICAgICAgICAgICAgICAgICAgIGtUcmFuc2ZlcklkU21wdGVTdDIwODQpOwotU1RBVElDX0FTU0VSVF9FTlVNKGtUcmFuc2ZlckNoYXJhY3RlcmlzdGljc1NtcHRlU3Q0MjgxLAotICAgICAgICAgICAgICAgICAgIGtUcmFuc2ZlcklkU21wdGVTdDQyODEpOwotU1RBVElDX0FTU0VSVF9FTlVNKGtUcmFuc2ZlckNoYXJhY3RlcmlzdGljc0FyaWJTdGRCNjdIbGcsCi0gICAgICAgICAgICAgICAgICAga1RyYW5zZmVySWRBcmliU3RkQjY3KTsKLQotZ2Z4OjpDb2xvclNwYWNlOjpUcmFuc2ZlcklEIEZyb21XZWJNVHJhbnNmZXJDaGFyYWN0ZXJpc3RpY3MoCi0gICAgVHJhbnNmZXJDaGFyYWN0ZXJpc3RpY3MgdGMpIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGdmeDo6Q29sb3JTcGFjZTo6VHJhbnNmZXJJRD4odGMpOwotfQotCi1TVEFUSUNfQVNTRVJUX0VOVU0oa1ByaW1hcmllc0J0NzA5LCBrUHJpbWFyeUlkQnQ3MDkpOwotU1RBVElDX0FTU0VSVF9FTlVNKGtQcmltYXJpZXNVbnNwZWNpZmllZCwga1ByaW1hcnlJZFVuc3BlY2lmaWVkKTsKLVNUQVRJQ19BU1NFUlRfRU5VTShrUHJpbWFyaWVzQnQ0NzBNLCBrUHJpbWFyeUlkQnQ0NzBNKTsKLVNUQVRJQ19BU1NFUlRfRU5VTShrUHJpbWFyaWVzQnQ0NzBCZywga1ByaW1hcnlJZEJ0NDcwQmcpOwotU1RBVElDX0FTU0VSVF9FTlVNKGtQcmltYXJpZXNTbXB0ZTE3ME0sIGtQcmltYXJ5SWRTbXB0ZTE3ME0pOwotU1RBVElDX0FTU0VSVF9FTlVNKGtQcmltYXJpZXNTbXB0ZTI0ME0sIGtQcmltYXJ5SWRTbXB0ZTI0ME0pOwotU1RBVElDX0FTU0VSVF9FTlVNKGtQcmltYXJpZXNGaWxtLCBrUHJpbWFyeUlkRmlsbSk7Ci1TVEFUSUNfQVNTRVJUX0VOVU0oa1ByaW1hcmllc0J0MjAyMCwga1ByaW1hcnlJZEJ0MjAyMCk7Ci1TVEFUSUNfQVNTRVJUX0VOVU0oa1ByaW1hcmllc1NtcHRlU3Q0MjgxLCBrUHJpbWFyeUlkU21wdGVTdDQyODEpOwotCi1nZng6OkNvbG9yU3BhY2U6OlByaW1hcnlJRCBGcm9tV2ViTVByaW1hcmllcyhQcmltYXJpZXMgcHJpbWFyaWVzKSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxnZng6OkNvbG9yU3BhY2U6OlByaW1hcnlJRD4ocHJpbWFyaWVzKTsKLX0KLQotV2ViTUNvbG9yTWV0YWRhdGE6OldlYk1Db2xvck1ldGFkYXRhKCkgewotICBCaXRzUGVyQ2hhbm5lbCA9IDA7Ci0gIENocm9tYVN1YnNhbXBsaW5nSG9yeiA9IDA7Ci0gIENocm9tYVN1YnNhbXBsaW5nVmVydCA9IDA7Ci0gIENiU3Vic2FtcGxpbmdIb3J6ID0gMDsKLSAgQ2JTdWJzYW1wbGluZ1ZlcnQgPSAwOwotICBDaHJvbWFTaXRpbmdIb3J6ID0gMDsKLSAgQ2hyb21hU2l0aW5nVmVydCA9IDA7Ci19Ci0KLWJvb2wgV2ViTUNvbG9yTWV0YWRhdGE6Om9wZXJhdG9yPT0oY29uc3QgV2ViTUNvbG9yTWV0YWRhdGEmIHJocykgY29uc3QgewotICByZXR1cm4gKEJpdHNQZXJDaGFubmVsID09IHJocy5CaXRzUGVyQ2hhbm5lbCAmJgotICAgICAgICAgIENocm9tYVN1YnNhbXBsaW5nSG9yeiA9PSByaHMuQ2hyb21hU3Vic2FtcGxpbmdIb3J6ICYmCi0gICAgICAgICAgQ2hyb21hU3Vic2FtcGxpbmdWZXJ0ID09IHJocy5DaHJvbWFTdWJzYW1wbGluZ1ZlcnQgJiYKLSAgICAgICAgICBDYlN1YnNhbXBsaW5nSG9yeiA9PSByaHMuQ2JTdWJzYW1wbGluZ0hvcnogJiYKLSAgICAgICAgICBDYlN1YnNhbXBsaW5nVmVydCA9PSByaHMuQ2JTdWJzYW1wbGluZ1ZlcnQgJiYKLSAgICAgICAgICBDaHJvbWFTaXRpbmdIb3J6ID09IHJocy5DaHJvbWFTaXRpbmdIb3J6ICYmCi0gICAgICAgICAgQ2hyb21hU2l0aW5nVmVydCA9PSByaHMuQ2hyb21hU2l0aW5nVmVydCAmJgotICAgICAgICAgIGNvbG9yX3NwYWNlID09IHJocy5jb2xvcl9zcGFjZSAmJiBoZHJfbWV0YWRhdGEgPT0gcmhzLmhkcl9tZXRhZGF0YSk7Ci19Ci0KLVdlYk1NYXN0ZXJpbmdNZXRhZGF0YVBhcnNlcjo6V2ViTU1hc3RlcmluZ01ldGFkYXRhUGFyc2VyKCkge30KLVdlYk1NYXN0ZXJpbmdNZXRhZGF0YVBhcnNlcjo6fldlYk1NYXN0ZXJpbmdNZXRhZGF0YVBhcnNlcigpIHt9Ci0KLWJvb2wgV2ViTU1hc3RlcmluZ01ldGFkYXRhUGFyc2VyOjpPbkZsb2F0KGludCBpZCwgZG91YmxlIHZhbCkgewotICBzd2l0Y2ggKGlkKSB7Ci0gICAgY2FzZSBrV2ViTUlkUHJpbWFyeVJDaHJvbWF0aWNpdHlYOgotICAgICAgbWFzdGVyaW5nX21ldGFkYXRhXy5wcmltYXJ5X3JfY2hyb21hdGljaXR5X3ggPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtXZWJNSWRQcmltYXJ5UkNocm9tYXRpY2l0eVk6Ci0gICAgICBtYXN0ZXJpbmdfbWV0YWRhdGFfLnByaW1hcnlfcl9jaHJvbWF0aWNpdHlfeSA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga1dlYk1JZFByaW1hcnlHQ2hyb21hdGljaXR5WDoKLSAgICAgIG1hc3RlcmluZ19tZXRhZGF0YV8ucHJpbWFyeV9nX2Nocm9tYXRpY2l0eV94ID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrV2ViTUlkUHJpbWFyeUdDaHJvbWF0aWNpdHlZOgotICAgICAgbWFzdGVyaW5nX21ldGFkYXRhXy5wcmltYXJ5X2dfY2hyb21hdGljaXR5X3kgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtXZWJNSWRQcmltYXJ5QkNocm9tYXRpY2l0eVg6Ci0gICAgICBtYXN0ZXJpbmdfbWV0YWRhdGFfLnByaW1hcnlfYl9jaHJvbWF0aWNpdHlfeCA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga1dlYk1JZFByaW1hcnlCQ2hyb21hdGljaXR5WToKLSAgICAgIG1hc3RlcmluZ19tZXRhZGF0YV8ucHJpbWFyeV9iX2Nocm9tYXRpY2l0eV95ID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrV2ViTUlkV2hpdGVQb2ludENocm9tYXRpY2l0eVg6Ci0gICAgICBtYXN0ZXJpbmdfbWV0YWRhdGFfLndoaXRlX3BvaW50X2Nocm9tYXRpY2l0eV94ID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrV2ViTUlkV2hpdGVQb2ludENocm9tYXRpY2l0eVk6Ci0gICAgICBtYXN0ZXJpbmdfbWV0YWRhdGFfLndoaXRlX3BvaW50X2Nocm9tYXRpY2l0eV95ID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrV2ViTUlkTHVtaW5hbmNlTWF4OgotICAgICAgbWFzdGVyaW5nX21ldGFkYXRhXy5sdW1pbmFuY2VfbWF4ID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrV2ViTUlkTHVtaW5hbmNlTWluOgotICAgICAgbWFzdGVyaW5nX21ldGFkYXRhXy5sdW1pbmFuY2VfbWluID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIERWTE9HKDEpIDw8ICJVbmV4cGVjdGVkIGlkIGluIE1hc3RlcmluZ01ldGFkYXRhOiAweCIgPDwgc3RkOjpoZXggPDwgaWQ7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLVdlYk1Db2xvdXJQYXJzZXI6OldlYk1Db2xvdXJQYXJzZXIoKSB7Ci0gIFJlc2V0KCk7Ci19Ci0KLVdlYk1Db2xvdXJQYXJzZXI6On5XZWJNQ29sb3VyUGFyc2VyKCkge30KLQotdm9pZCBXZWJNQ29sb3VyUGFyc2VyOjpSZXNldCgpIHsKLSAgbWF0cml4X2NvZWZmaWNpZW50c18gPSAtMTsKLSAgYml0c19wZXJfY2hhbm5lbF8gPSAtMTsKLSAgY2hyb21hX3N1YnNhbXBsaW5nX2hvcnpfID0gLTE7Ci0gIGNocm9tYV9zdWJzYW1wbGluZ192ZXJ0XyA9IC0xOwotICBjYl9zdWJzYW1wbGluZ19ob3J6XyA9IC0xOwotICBjYl9zdWJzYW1wbGluZ192ZXJ0XyA9IC0xOwotICBjaHJvbWFfc2l0aW5nX2hvcnpfID0gLTE7Ci0gIGNocm9tYV9zaXRpbmdfdmVydF8gPSAtMTsKLSAgcmFuZ2VfID0gLTE7Ci0gIHRyYW5zZmVyX2NoYXJhY3RlcmlzdGljc18gPSAtMTsKLSAgcHJpbWFyaWVzXyA9IC0xOwotICBtYXhfY2xsXyA9IC0xOwotICBtYXhfZmFsbF8gPSAtMTsKLSAgbWFzdGVyaW5nX21ldGFkYXRhX3BhcnNlZF8gPSBmYWxzZTsKLX0KLQotV2ViTVBhcnNlckNsaWVudCogV2ViTUNvbG91clBhcnNlcjo6T25MaXN0U3RhcnQoaW50IGlkKSB7Ci0gIGlmIChpZCA9PSBrV2ViTUlkTWFzdGVyaW5nTWV0YWRhdGEpIHsKLSAgICBtYXN0ZXJpbmdfbWV0YWRhdGFfcGFyc2VkXyA9IGZhbHNlOwotICAgIHJldHVybiAmbWFzdGVyaW5nX21ldGFkYXRhX3BhcnNlcl87Ci0gIH0KLQotICByZXR1cm4gdGhpczsKLX0KLQotYm9vbCBXZWJNQ29sb3VyUGFyc2VyOjpPbkxpc3RFbmQoaW50IGlkKSB7Ci0gIGlmIChpZCA9PSBrV2ViTUlkTWFzdGVyaW5nTWV0YWRhdGEpCi0gICAgbWFzdGVyaW5nX21ldGFkYXRhX3BhcnNlZF8gPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBXZWJNQ29sb3VyUGFyc2VyOjpPblVJbnQoaW50IGlkLCBpbnQ2NF90IHZhbCkgewotICBpbnQ2NF90KiBkc3QgPSBOVUxMOwotCi0gIHN3aXRjaCAoaWQpIHsKLSAgICBjYXNlIGtXZWJNSWRNYXRyaXhDb2VmZmljaWVudHM6Ci0gICAgICBkc3QgPSAmbWF0cml4X2NvZWZmaWNpZW50c187Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtXZWJNSWRCaXRzUGVyQ2hhbm5lbDoKLSAgICAgIGRzdCA9ICZiaXRzX3Blcl9jaGFubmVsXzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga1dlYk1JZENocm9tYVN1YnNhbXBsaW5nSG9yejoKLSAgICAgIGRzdCA9ICZjaHJvbWFfc3Vic2FtcGxpbmdfaG9yel87Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtXZWJNSWRDaHJvbWFTdWJzYW1wbGluZ1ZlcnQ6Ci0gICAgICBkc3QgPSAmY2hyb21hX3N1YnNhbXBsaW5nX3ZlcnRfOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrV2ViTUlkQ2JTdWJzYW1wbGluZ0hvcno6Ci0gICAgICBkc3QgPSAmY2Jfc3Vic2FtcGxpbmdfaG9yel87Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtXZWJNSWRDYlN1YnNhbXBsaW5nVmVydDoKLSAgICAgIGRzdCA9ICZjYl9zdWJzYW1wbGluZ192ZXJ0XzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga1dlYk1JZENocm9tYVNpdGluZ0hvcno6Ci0gICAgICBkc3QgPSAmY2hyb21hX3NpdGluZ19ob3J6XzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga1dlYk1JZENocm9tYVNpdGluZ1ZlcnQ6Ci0gICAgICBkc3QgPSAmY2hyb21hX3NpdGluZ192ZXJ0XzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga1dlYk1JZFJhbmdlOgotICAgICAgZHN0ID0gJnJhbmdlXzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga1dlYk1JZFRyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzOgotICAgICAgZHN0ID0gJnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljc187Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtXZWJNSWRQcmltYXJpZXM6Ci0gICAgICBkc3QgPSAmcHJpbWFyaWVzXzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga1dlYk1JZE1heENMTDoKLSAgICAgIGRzdCA9ICZtYXhfY2xsXzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga1dlYk1JZE1heEZBTEw6Ci0gICAgICBkc3QgPSAmbWF4X2ZhbGxfOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgRENIRUNLKGRzdCk7Ci0gIGlmICgqZHN0ICE9IC0xKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiTXVsdGlwbGUgdmFsdWVzIGZvciBpZCAiIDw8IHN0ZDo6aGV4IDw8IGlkIDw8ICIgc3BlY2lmaWVkICgiCi0gICAgICAgICAgICAgICA8PCAqZHN0IDw8ICIgYW5kICIgPDwgdmFsIDw8ICIpIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqZHN0ID0gdmFsOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotV2ViTUNvbG9yTWV0YWRhdGEgV2ViTUNvbG91clBhcnNlcjo6R2V0V2ViTUNvbG9yTWV0YWRhdGEoKSBjb25zdCB7Ci0gIFdlYk1Db2xvck1ldGFkYXRhIGNvbG9yX21ldGFkYXRhOwotCi0gIGlmIChiaXRzX3Blcl9jaGFubmVsXyAhPSAtMSkKLSAgICBjb2xvcl9tZXRhZGF0YS5CaXRzUGVyQ2hhbm5lbCA9IGJpdHNfcGVyX2NoYW5uZWxfOwotCi0gIGlmIChjaHJvbWFfc3Vic2FtcGxpbmdfaG9yel8gIT0gLTEpCi0gICAgY29sb3JfbWV0YWRhdGEuQ2hyb21hU3Vic2FtcGxpbmdIb3J6ID0gY2hyb21hX3N1YnNhbXBsaW5nX2hvcnpfOwotICBpZiAoY2hyb21hX3N1YnNhbXBsaW5nX3ZlcnRfICE9IC0xKQotICAgIGNvbG9yX21ldGFkYXRhLkNocm9tYVN1YnNhbXBsaW5nVmVydCA9IGNocm9tYV9zdWJzYW1wbGluZ192ZXJ0XzsKLSAgaWYgKGNiX3N1YnNhbXBsaW5nX2hvcnpfICE9IC0xKQotICAgIGNvbG9yX21ldGFkYXRhLkNiU3Vic2FtcGxpbmdIb3J6ID0gY2Jfc3Vic2FtcGxpbmdfaG9yel87Ci0gIGlmIChjYl9zdWJzYW1wbGluZ192ZXJ0XyAhPSAtMSkKLSAgICBjb2xvcl9tZXRhZGF0YS5DYlN1YnNhbXBsaW5nVmVydCA9IGNiX3N1YnNhbXBsaW5nX3ZlcnRfOwotICBpZiAoY2hyb21hX3NpdGluZ19ob3J6XyAhPSAtMSkKLSAgICBjb2xvcl9tZXRhZGF0YS5DaHJvbWFTaXRpbmdIb3J6ID0gY2hyb21hX3NpdGluZ19ob3J6XzsKLSAgaWYgKGNocm9tYV9zaXRpbmdfdmVydF8gIT0gLTEpCi0gICAgY29sb3JfbWV0YWRhdGEuQ2hyb21hU2l0aW5nVmVydCA9IGNocm9tYV9zaXRpbmdfdmVydF87Ci0KLSAgZ2Z4OjpDb2xvclNwYWNlOjpNYXRyaXhJRCBtYXRyaXhfaWQgPSBnZng6OkNvbG9yU3BhY2U6OmtNYXRyaXhJZFVuc3BlY2lmaWVkOwotICBpZiAobWF0cml4X2NvZWZmaWNpZW50c18gIT0gLTEpCi0gICAgbWF0cml4X2lkID0gRnJvbVdlYk1NYXRyaXhDb2VmZmljaWVudHMoCi0gICAgICAgIHN0YXRpY19jYXN0PE1hdHJpeENvZWZmaWNpZW50cz4obWF0cml4X2NvZWZmaWNpZW50c18pKTsKLQotICBnZng6OkNvbG9yU3BhY2U6OlJhbmdlSUQgcmFuZ2VfaWQgPSBnZng6OkNvbG9yU3BhY2U6OmtSYW5nZUlkVW5zcGVjaWZpZWQ7Ci0gIGlmIChyYW5nZV8gIT0gLTEpCi0gICAgcmFuZ2VfaWQgPSBGcm9tV2ViTVJhbmdlKHN0YXRpY19jYXN0PFJhbmdlPihyYW5nZV8pKTsKLQotICBnZng6OkNvbG9yU3BhY2U6OlRyYW5zZmVySUQgdHJhbnNmZXJfaWQgPQotICAgICAgZ2Z4OjpDb2xvclNwYWNlOjprVHJhbnNmZXJJZFVuc3BlY2lmaWVkOwotICBpZiAodHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzXyAhPSAtMSkKLSAgICB0cmFuc2Zlcl9pZCA9IEZyb21XZWJNVHJhbnNmZXJDaGFyYWN0ZXJpc3RpY3MoCi0gICAgICAgIHN0YXRpY19jYXN0PFRyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzPih0cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3NfKSk7Ci0KLSAgZ2Z4OjpDb2xvclNwYWNlOjpQcmltYXJ5SUQgcHJpbWFyeV9pZCA9Ci0gICAgICBnZng6OkNvbG9yU3BhY2U6OmtQcmltYXJ5SWRVbnNwZWNpZmllZDsKLSAgaWYgKHByaW1hcmllc18gIT0gLTEpCi0gICAgcHJpbWFyeV9pZCA9IEZyb21XZWJNUHJpbWFyaWVzKHN0YXRpY19jYXN0PFByaW1hcmllcz4ocHJpbWFyaWVzXykpOwotCi0gIGNvbG9yX21ldGFkYXRhLmNvbG9yX3NwYWNlID0KLSAgICAgIGdmeDo6Q29sb3JTcGFjZShwcmltYXJ5X2lkLCB0cmFuc2Zlcl9pZCwgbWF0cml4X2lkLCByYW5nZV9pZCk7Ci0KLSAgaWYgKG1heF9jbGxfICE9IC0xKQotICAgIGNvbG9yX21ldGFkYXRhLmhkcl9tZXRhZGF0YS5tYXhfY2xsID0gbWF4X2NsbF87Ci0KLSAgaWYgKG1heF9mYWxsXyAhPSAtMSkKLSAgICBjb2xvcl9tZXRhZGF0YS5oZHJfbWV0YWRhdGEubWF4X2ZhbGwgPSBtYXhfZmFsbF87Ci0KLSAgaWYgKG1hc3RlcmluZ19tZXRhZGF0YV9wYXJzZWRfKQotICAgIGNvbG9yX21ldGFkYXRhLmhkcl9tZXRhZGF0YS5tYXN0ZXJpbmdfbWV0YWRhdGEgPQotICAgICAgICBtYXN0ZXJpbmdfbWV0YWRhdGFfcGFyc2VyXy5HZXRNYXN0ZXJpbmdNZXRhZGF0YSgpOwotCi0gIHJldHVybiBjb2xvcl9tZXRhZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvd2VibS93ZWJtX2NvbG91cl9wYXJzZXIuaCBiL3NyYy9tZWRpYS93ZWJtL3dlYm1fY29sb3VyX3BhcnNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2Y5YTNkLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS93ZWJtL3dlYm1fY29sb3VyX3BhcnNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIE1FRElBX1dFQk1fV0VCTV9DT0xPVVJfUEFSU0VSX0hfCi0jZGVmaW5lIE1FRElBX1dFQk1fV0VCTV9DT0xPVVJfUEFSU0VSX0hfCi0KLSNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9jb2xvcl9zcGFjZS5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvaGRyX21ldGFkYXRhLmgiCi0jaW5jbHVkZSAibWVkaWEvd2VibS93ZWJtX3BhcnNlci5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBXZWJNIGNvbG9yIGluZm9ybWF0aW9uLCBjb250YWluaW5nIEhEUiBtZXRhZGF0YToKLS8vIGh0dHA6Ly93d3cud2VibXByb2plY3Qub3JnL2RvY3MvY29udGFpbmVyLyNDb2xvdXIKLXN0cnVjdCBNRURJQV9FWFBPUlQgV2ViTUNvbG9yTWV0YWRhdGEgewotICB1bnNpZ25lZCBpbnQgQml0c1BlckNoYW5uZWw7Ci0gIHVuc2lnbmVkIGludCBDaHJvbWFTdWJzYW1wbGluZ0hvcno7Ci0gIHVuc2lnbmVkIGludCBDaHJvbWFTdWJzYW1wbGluZ1ZlcnQ7Ci0gIHVuc2lnbmVkIGludCBDYlN1YnNhbXBsaW5nSG9yejsKLSAgdW5zaWduZWQgaW50IENiU3Vic2FtcGxpbmdWZXJ0OwotICB1bnNpZ25lZCBpbnQgQ2hyb21hU2l0aW5nSG9yejsKLSAgdW5zaWduZWQgaW50IENocm9tYVNpdGluZ1ZlcnQ7Ci0KLSAgZ2Z4OjpDb2xvclNwYWNlIGNvbG9yX3NwYWNlOwotCi0gIEhEUk1ldGFkYXRhIGhkcl9tZXRhZGF0YTsKLQotICBXZWJNQ29sb3JNZXRhZGF0YSgpOwotICBXZWJNQ29sb3JNZXRhZGF0YShjb25zdCBXZWJNQ29sb3JNZXRhZGF0YSYgcmhzKTsKLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFdlYk1Db2xvck1ldGFkYXRhJiByaHMpIGNvbnN0OwotfTsKLQotLy8gUGFyc2VyIGZvciBXZWJNIE1hc3RlcmluZ01ldGFkYXRhIHdpdGhpbiBDb2xvdXIgZWxlbWVudDoKLS8vIGh0dHA6Ly93d3cud2VibXByb2plY3Qub3JnL2RvY3MvY29udGFpbmVyLyNNYXN0ZXJpbmdNZXRhZGF0YQotY2xhc3MgV2ViTU1hc3RlcmluZ01ldGFkYXRhUGFyc2VyIDogcHVibGljIFdlYk1QYXJzZXJDbGllbnQgewotIHB1YmxpYzoKLSAgV2ViTU1hc3RlcmluZ01ldGFkYXRhUGFyc2VyKCk7Ci0gIH5XZWJNTWFzdGVyaW5nTWV0YWRhdGFQYXJzZXIoKSBPVkVSUklERTsKLQotICBNYXN0ZXJpbmdNZXRhZGF0YSBHZXRNYXN0ZXJpbmdNZXRhZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1hc3RlcmluZ19tZXRhZGF0YV87IH0KLQotIHByaXZhdGU6Ci0gIC8vIFdlYk1QYXJzZXJDbGllbnQgaW1wbGVtZW50YXRpb24uCi0gIGJvb2wgT25GbG9hdChpbnQgaWQsIGRvdWJsZSB2YWwpIE9WRVJSSURFOwotCi0gIE1hc3RlcmluZ01ldGFkYXRhIG1hc3RlcmluZ19tZXRhZGF0YV87Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihXZWJNTWFzdGVyaW5nTWV0YWRhdGFQYXJzZXIpOwotfTsKLQotLy8gUGFyc2VyIGZvciBXZWJNIENvbG91ciBlbGVtZW50OgotLy8gaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvZG9jcy9jb250YWluZXIvI2NvbG91cgotY2xhc3MgV2ViTUNvbG91clBhcnNlciA6IHB1YmxpYyBXZWJNUGFyc2VyQ2xpZW50IHsKLSBwdWJsaWM6Ci0gIFdlYk1Db2xvdXJQYXJzZXIoKTsKLSAgfldlYk1Db2xvdXJQYXJzZXIoKSBPVkVSUklERTsKLQotICB2b2lkIFJlc2V0KCk7Ci0KLSAgV2ViTUNvbG9yTWV0YWRhdGEgR2V0V2ViTUNvbG9yTWV0YWRhdGEoKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIC8vIFdlYk1QYXJzZXJDbGllbnQgaW1wbGVtZW50YXRpb24uCi0gIFdlYk1QYXJzZXJDbGllbnQqIE9uTGlzdFN0YXJ0KGludCBpZCkgT1ZFUlJJREU7Ci0gIGJvb2wgT25MaXN0RW5kKGludCBpZCkgT1ZFUlJJREU7Ci0gIGJvb2wgT25VSW50KGludCBpZCwgaW50NjRfdCB2YWwpIE9WRVJSSURFOwotCi0gIGludDY0X3QgbWF0cml4X2NvZWZmaWNpZW50c187Ci0gIGludDY0X3QgYml0c19wZXJfY2hhbm5lbF87Ci0gIGludDY0X3QgY2hyb21hX3N1YnNhbXBsaW5nX2hvcnpfOwotICBpbnQ2NF90IGNocm9tYV9zdWJzYW1wbGluZ192ZXJ0XzsKLSAgaW50NjRfdCBjYl9zdWJzYW1wbGluZ19ob3J6XzsKLSAgaW50NjRfdCBjYl9zdWJzYW1wbGluZ192ZXJ0XzsKLSAgaW50NjRfdCBjaHJvbWFfc2l0aW5nX2hvcnpfOwotICBpbnQ2NF90IGNocm9tYV9zaXRpbmdfdmVydF87Ci0gIGludDY0X3QgcmFuZ2VfOwotICBpbnQ2NF90IHRyYW5zZmVyX2NoYXJhY3RlcmlzdGljc187Ci0gIGludDY0X3QgcHJpbWFyaWVzXzsKLSAgaW50NjRfdCBtYXhfY2xsXzsKLSAgaW50NjRfdCBtYXhfZmFsbF87Ci0KLSAgV2ViTU1hc3RlcmluZ01ldGFkYXRhUGFyc2VyIG1hc3RlcmluZ19tZXRhZGF0YV9wYXJzZXJfOwotICBib29sIG1hc3RlcmluZ19tZXRhZGF0YV9wYXJzZWRfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihXZWJNQ29sb3VyUGFyc2VyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX1dFQk1fV0VCTV9DT0xPVVJfUEFSU0VSX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvd2VibS93ZWJtX2NvbnN0YW50cy5oIGIvc3JjL21lZGlhL3dlYm0vd2VibV9jb25zdGFudHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUxYmNlMi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvd2VibS93ZWJtX2NvbnN0YW50cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfV0VCTV9XRUJNX0NPTlNUQU5UU19IXwotI2RlZmluZSBNRURJQV9XRUJNX1dFQk1fQ09OU1RBTlRTX0hfCi0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8gV2ViTSBlbGVtZW50IElEcy4KLS8vIFRoaXMgaXMgYSBzdWJzZXQgb2YgdGhlIElEcyBpbiB0aGUgTWF0cm9za2Egc3BlYy4KLS8vIGh0dHA6Ly93d3cubWF0cm9za2Eub3JnL3RlY2huaWNhbC9zcGVjcy9pbmRleC5odG1sCi1jb25zdCBpbnQga1dlYk1JZEFFU1NldHRpbmdzQ2lwaGVyTW9kZSA9IDB4NDdFODsKLWNvbnN0IGludCBrV2ViTUlkQWxwaGFNb2RlID0gMHg1M0MwOwotY29uc3QgaW50IGtXZWJNSWRBc3BlY3RSYXRpb1R5cGUgPSAweDU0QjM7Ci1jb25zdCBpbnQga1dlYk1JZEF0dGFjaGVkRmlsZSA9IDB4NjFBNzsKLWNvbnN0IGludCBrV2ViTUlkQXR0YWNobWVudExpbmsgPSAweDc0NDY7Ci1jb25zdCBpbnQga1dlYk1JZEF0dGFjaG1lbnRzID0gMHgxOTQxQTQ2OTsKLWNvbnN0IGludCBrV2ViTUlkQXVkaW8gPSAweEUxOwotY29uc3QgaW50IGtXZWJNSWRCaXREZXB0aCA9IDB4NjI2NDsKLWNvbnN0IGludCBrV2ViTUlkQml0c1BlckNoYW5uZWwgPSAweDU1QjI7Ci1jb25zdCBpbnQga1dlYk1JZEJsb2NrID0gMHhBMTsKLWNvbnN0IGludCBrV2ViTUlkQmxvY2tBZGRJRCA9IDB4RUU7Ci1jb25zdCBpbnQga1dlYk1JZEJsb2NrQWRkaXRpb25zID0gMHg3NUExOwotY29uc3QgaW50IGtXZWJNSWRCbG9ja0FkZGl0aW9uYWwgPSAweEE1OwotY29uc3QgaW50IGtXZWJNSWRCbG9ja0R1cmF0aW9uID0gMHg5QjsKLWNvbnN0IGludCBrV2ViTUlkQmxvY2tHcm91cCA9IDB4QTA7Ci1jb25zdCBpbnQga1dlYk1JZEJsb2NrTW9yZSA9IDB4QTY7Ci1jb25zdCBpbnQga1dlYk1JZENiU3Vic2FtcGxpbmdIb3J6ID0gMHg1NUI1OwotY29uc3QgaW50IGtXZWJNSWRDYlN1YnNhbXBsaW5nVmVydCA9IDB4NTVCNjsKLWNvbnN0IGludCBrV2ViTUlkQ2hhbm5lbHMgPSAweDlGOwotY29uc3QgaW50IGtXZWJNSWRDaGFwQ291bnRyeSA9IDB4NDM3RTsKLWNvbnN0IGludCBrV2ViTUlkQ2hhcExhbmd1YWdlID0gMHg0MzdDOwotY29uc3QgaW50IGtXZWJNSWRDaGFwUHJvY2VzcyA9IDB4Njk0NDsKLWNvbnN0IGludCBrV2ViTUlkQ2hhcFByb2Nlc3NDb2RlY0lEID0gMHg2OTU1OwotY29uc3QgaW50IGtXZWJNSWRDaGFwUHJvY2Vzc0NvbW1hbmQgPSAweDY5MTE7Ci1jb25zdCBpbnQga1dlYk1JZENoYXBQcm9jZXNzRGF0YSA9IDB4NjkzMzsKLWNvbnN0IGludCBrV2ViTUlkQ2hhcFByb2Nlc3NQcml2YXRlID0gMHg0NTBEOwotY29uc3QgaW50IGtXZWJNSWRDaGFwUHJvY2Vzc1RpbWUgPSAweDY5MjI7Ci1jb25zdCBpbnQga1dlYk1JZENoYXBTdHJpbmcgPSAweDg1OwotY29uc3QgaW50IGtXZWJNSWRDaGFwdGVyQXRvbSA9IDB4QjY7Ci1jb25zdCBpbnQga1dlYk1JZENoYXB0ZXJEaXNwbGF5ID0gMHg4MDsKLWNvbnN0IGludCBrV2ViTUlkQ2hhcHRlckZsYWdFbmFibGVkID0gMHg0NTk4OwotY29uc3QgaW50IGtXZWJNSWRDaGFwdGVyRmxhZ0hpZGRlbiA9IDB4OTg7Ci1jb25zdCBpbnQga1dlYk1JZENoYXB0ZXJQaHlzaWNhbEVxdWl2ID0gMHg2M0MzOwotY29uc3QgaW50IGtXZWJNSWRDaGFwdGVycyA9IDB4MTA0M0E3NzA7Ci1jb25zdCBpbnQga1dlYk1JZENoYXB0ZXJTZWdtZW50RWRpdGlvblVJRCA9IDB4NkVCQzsKLWNvbnN0IGludCBrV2ViTUlkQ2hhcHRlclNlZ21lbnRVSUQgPSAweDZFNjc7Ci1jb25zdCBpbnQga1dlYk1JZENoYXB0ZXJUaW1lRW5kID0gMHg5MjsKLWNvbnN0IGludCBrV2ViTUlkQ2hhcHRlclRpbWVTdGFydCA9IDB4OTE7Ci1jb25zdCBpbnQga1dlYk1JZENoYXB0ZXJUcmFjayA9IDB4OEY7Ci1jb25zdCBpbnQga1dlYk1JZENoYXB0ZXJUcmFja051bWJlciA9IDB4ODk7Ci1jb25zdCBpbnQga1dlYk1JZENoYXB0ZXJUcmFuc2xhdGUgPSAweDY5MjQ7Ci1jb25zdCBpbnQga1dlYk1JZENoYXB0ZXJUcmFuc2xhdGVDb2RlYyA9IDB4NjlCRjsKLWNvbnN0IGludCBrV2ViTUlkQ2hhcHRlclRyYW5zbGF0ZUVkaXRpb25VSUQgPSAweDY5RkM7Ci1jb25zdCBpbnQga1dlYk1JZENoYXB0ZXJUcmFuc2xhdGVJRCA9IDB4NjlBNTsKLWNvbnN0IGludCBrV2ViTUlkQ2hhcHRlclVJRCA9IDB4NzNDNDsKLWNvbnN0IGludCBrV2ViTUlkQ2hyb21hU2l0aW5nSG9yeiA9IDB4NTVCNzsKLWNvbnN0IGludCBrV2ViTUlkQ2hyb21hU2l0aW5nVmVydCA9IDB4NTVCODsKLWNvbnN0IGludCBrV2ViTUlkQ2hyb21hU3Vic2FtcGxpbmdIb3J6ID0gMHg1NUIzOwotY29uc3QgaW50IGtXZWJNSWRDaHJvbWFTdWJzYW1wbGluZ1ZlcnQgPSAweDU1QjQ7Ci1jb25zdCBpbnQga1dlYk1JZENsdXN0ZXIgPSAweDFGNDNCNjc1OwotY29uc3QgaW50IGtXZWJNSWRDb2RlY0RlY29kZUFsbCA9IDB4QUE7Ci1jb25zdCBpbnQga1dlYk1JZENvZGVjRGVsYXkgPSAweDU2QUE7Ci1jb25zdCBpbnQga1dlYk1JZENvZGVjSUQgPSAweDg2OwotY29uc3QgaW50IGtXZWJNSWRDb2RlY05hbWUgPSAweDI1ODY4ODsKLWNvbnN0IGludCBrV2ViTUlkQ29kZWNQcml2YXRlID0gMHg2M0EyOwotY29uc3QgaW50IGtXZWJNSWRDb2RlY1N0YXRlID0gMHhBNDsKLWNvbnN0IGludCBrV2ViTUlkQ29sb3JTcGFjZSA9IDB4MkVCNTI0OwotY29uc3QgaW50IGtXZWJNSWRDb2xvdXIgPSAweDU1QjA7Ci1jb25zdCBpbnQga1dlYk1JZENvbnRlbnRDb21wQWxnbyA9IDB4NDI1NDsKLWNvbnN0IGludCBrV2ViTUlkQ29udGVudENvbXByZXNzaW9uID0gMHg1MDM0OwotY29uc3QgaW50IGtXZWJNSWRDb250ZW50Q29tcFNldHRpbmdzID0gMHg0MjU1OwotY29uc3QgaW50IGtXZWJNSWRDb250ZW50RW5jQUVTU2V0dGluZ3MgPSAweDQ3RTc7Ci1jb25zdCBpbnQga1dlYk1JZENvbnRlbnRFbmNBbGdvID0gMHg0N0UxOwotY29uc3QgaW50IGtXZWJNSWRDb250ZW50RW5jS2V5SUQgPSAweDQ3RTI7Ci1jb25zdCBpbnQga1dlYk1JZENvbnRlbnRFbmNvZGluZyA9IDB4NjI0MDsKLWNvbnN0IGludCBrV2ViTUlkQ29udGVudEVuY29kaW5nT3JkZXIgPSAweDUwMzE7Ci1jb25zdCBpbnQga1dlYk1JZENvbnRlbnRFbmNvZGluZ3MgPSAweDZEODA7Ci1jb25zdCBpbnQga1dlYk1JZENvbnRlbnRFbmNvZGluZ1Njb3BlID0gMHg1MDMyOwotY29uc3QgaW50IGtXZWJNSWRDb250ZW50RW5jb2RpbmdUeXBlID0gMHg1MDMzOwotY29uc3QgaW50IGtXZWJNSWRDb250ZW50RW5jcnlwdGlvbiA9IDB4NTAzNTsKLWNvbnN0IGludCBrV2ViTUlkQ29udGVudFNpZ0FsZ28gPSAweDQ3RTU7Ci1jb25zdCBpbnQga1dlYk1JZENvbnRlbnRTaWdIYXNoQWxnbyA9IDB4NDdFNjsKLWNvbnN0IGludCBrV2ViTUlkQ29udGVudFNpZ0tleUlEID0gMHg0N0U0OwotY29uc3QgaW50IGtXZWJNSWRDb250ZW50U2lnbmF0dXJlID0gMHg0N0UzOwotY29uc3QgaW50IGtXZWJNSWRDUkMzMiA9IDB4QkY7Ci1jb25zdCBpbnQga1dlYk1JZEN1ZUJsb2NrTnVtYmVyID0gMHg1Mzc4OwotY29uc3QgaW50IGtXZWJNSWRDdWVDbHVzdGVyUG9zaXRpb24gPSAweEYxOwotY29uc3QgaW50IGtXZWJNSWRDdWVDb2RlY1N0YXRlID0gMHhFQTsKLWNvbnN0IGludCBrV2ViTUlkQ3VlUG9pbnQgPSAweEJCOwotY29uc3QgaW50IGtXZWJNSWRDdWVSZWZlcmVuY2UgPSAweERCOwotY29uc3QgaW50IGtXZWJNSWRDdWVSZWZUaW1lID0gMHg5NjsKLWNvbnN0IGludCBrV2ViTUlkQ3VlcyA9IDB4MUM1M0JCNkI7Ci1jb25zdCBpbnQga1dlYk1JZEN1ZVRpbWUgPSAweEIzOwotY29uc3QgaW50IGtXZWJNSWRDdWVUcmFjayA9IDB4Rjc7Ci1jb25zdCBpbnQga1dlYk1JZEN1ZVRyYWNrUG9zaXRpb25zID0gMHhCNzsKLWNvbnN0IGludCBrV2ViTUlkRGF0ZVVUQyA9IDB4NDQ2MTsKLWNvbnN0IGludCBrV2ViTUlkRGVmYXVsdER1cmF0aW9uID0gMHgyM0UzODM7Ci1jb25zdCBpbnQga1dlYk1JZERpc2NhcmRQYWRkaW5nID0gMHg3NUEyOwotY29uc3QgaW50IGtXZWJNSWREaXNwbGF5SGVpZ2h0ID0gMHg1NEJBOwotY29uc3QgaW50IGtXZWJNSWREaXNwbGF5VW5pdCA9IDB4NTRCMjsKLWNvbnN0IGludCBrV2ViTUlkRGlzcGxheVdpZHRoID0gMHg1NEIwOwotY29uc3QgaW50IGtXZWJNSWREb2NUeXBlID0gMHg0MjgyOwotY29uc3QgaW50IGtXZWJNSWREb2NUeXBlUmVhZFZlcnNpb24gPSAweDQyODU7Ci1jb25zdCBpbnQga1dlYk1JZERvY1R5cGVWZXJzaW9uID0gMHg0Mjg3OwotY29uc3QgaW50IGtXZWJNSWREdXJhdGlvbiA9IDB4NDQ4OTsKLWNvbnN0IGludCBrV2ViTUlkRUJNTEhlYWRlciA9IDB4MUE0NURGQTM7Ci1jb25zdCBpbnQga1dlYk1JZEVCTUxNYXhJRExlbmd0aCA9IDB4NDJGMjsKLWNvbnN0IGludCBrV2ViTUlkRUJNTE1heFNpemVMZW5ndGggPSAweDQyRjM7Ci1jb25zdCBpbnQga1dlYk1JZEVCTUxSZWFkVmVyc2lvbiA9IDB4NDJGNzsKLWNvbnN0IGludCBrV2ViTUlkRUJNTFZlcnNpb24gPSAweDQyODY7Ci1jb25zdCBpbnQga1dlYk1JZEVkaXRpb25FbnRyeSA9IDB4NDVCOTsKLWNvbnN0IGludCBrV2ViTUlkRWRpdGlvbkZsYWdEZWZhdWx0ID0gMHg0NURCOwotY29uc3QgaW50IGtXZWJNSWRFZGl0aW9uRmxhZ0hpZGRlbiA9IDB4NDVCRDsKLWNvbnN0IGludCBrV2ViTUlkRWRpdGlvbkZsYWdPcmRlcmVkID0gMHg0NUREOwotY29uc3QgaW50IGtXZWJNSWRFZGl0aW9uVUlEID0gMHg0NUJDOwotY29uc3QgaW50IGtXZWJNSWRGaWxlRGF0YSA9IDB4NDY1QzsKLWNvbnN0IGludCBrV2ViTUlkRmlsZURlc2NyaXB0aW9uID0gMHg0NjdFOwotY29uc3QgaW50IGtXZWJNSWRGaWxlTWltZVR5cGUgPSAweDQ2NjA7Ci1jb25zdCBpbnQga1dlYk1JZEZpbGVOYW1lID0gMHg0NjZFOwotY29uc3QgaW50IGtXZWJNSWRGaWxlVUlEID0gMHg0NkFFOwotY29uc3QgaW50IGtXZWJNSWRGbGFnRGVmYXVsdCA9IDB4ODg7Ci1jb25zdCBpbnQga1dlYk1JZEZsYWdFbmFibGVkID0gMHhCOTsKLWNvbnN0IGludCBrV2ViTUlkRmxhZ0ZvcmNlZCA9IDB4NTVBQTsKLWNvbnN0IGludCBrV2ViTUlkRmxhZ0ludGVybGFjZWQgPSAweDlBOwotY29uc3QgaW50IGtXZWJNSWRGbGFnTGFjaW5nID0gMHg5QzsKLWNvbnN0IGludCBrV2ViTUlkRnJhbWVSYXRlID0gMHgyMzgzRTM7Ci1jb25zdCBpbnQga1dlYk1JZEluZm8gPSAweDE1NDlBOTY2OwotY29uc3QgaW50IGtXZWJNSWRKb2luQmxvY2tzID0gMHhFOTsKLWNvbnN0IGludCBrV2ViTUlkTGFjZU51bWJlciA9IDB4Q0M7Ci1jb25zdCBpbnQga1dlYk1JZExhbmd1YWdlID0gMHgyMkI1OUM7Ci1jb25zdCBpbnQga1dlYk1JZEx1bWluYW5jZU1heCA9IDB4NTVEOTsKLWNvbnN0IGludCBrV2ViTUlkTHVtaW5hbmNlTWluID0gMHg1NURBOwotY29uc3QgaW50IGtXZWJNSWRNYXN0ZXJpbmdNZXRhZGF0YSA9IDB4NTVEMDsKLWNvbnN0IGludCBrV2ViTUlkTWF0cml4Q29lZmZpY2llbnRzID0gMHg1NUIxOwotY29uc3QgaW50IGtXZWJNSWRNYXhCbG9ja0FkZGl0aW9uSWQgPSAweDU1RUU7Ci1jb25zdCBpbnQga1dlYk1JZE1heENhY2hlID0gMHg2REY4OwotY29uc3QgaW50IGtXZWJNSWRNYXhDTEwgPSAweDU1QkM7Ci1jb25zdCBpbnQga1dlYk1JZE1heEZBTEwgPSAweDU1QkQ7Ci1jb25zdCBpbnQga1dlYk1JZE1pbkNhY2hlID0gMHg2REU3OwotY29uc3QgaW50IGtXZWJNSWRNdXhpbmdBcHAgPSAweDREODA7Ci1jb25zdCBpbnQga1dlYk1JZE5hbWUgPSAweDUzNkU7Ci1jb25zdCBpbnQga1dlYk1JZE5leHRGaWxlbmFtZSA9IDB4M0U4M0JCOwotY29uc3QgaW50IGtXZWJNSWROZXh0VUlEID0gMHgzRUI5MjM7Ci1jb25zdCBpbnQga1dlYk1JZE91dHB1dFNhbXBsaW5nRnJlcXVlbmN5ID0gMHg3OEI1OwotY29uc3QgaW50IGtXZWJNSWRQaXhlbENyb3BCb3R0b20gPSAweDU0QUE7Ci1jb25zdCBpbnQga1dlYk1JZFBpeGVsQ3JvcExlZnQgPSAweDU0Q0M7Ci1jb25zdCBpbnQga1dlYk1JZFBpeGVsQ3JvcFJpZ2h0ID0gMHg1NEREOwotY29uc3QgaW50IGtXZWJNSWRQaXhlbENyb3BUb3AgPSAweDU0QkI7Ci1jb25zdCBpbnQga1dlYk1JZFBpeGVsSGVpZ2h0ID0gMHhCQTsKLWNvbnN0IGludCBrV2ViTUlkUGl4ZWxXaWR0aCA9IDB4QjA7Ci1jb25zdCBpbnQga1dlYk1JZFBvc2l0aW9uID0gMHhBNzsKLWNvbnN0IGludCBrV2ViTUlkUHJldkZpbGVuYW1lID0gMHgzQzgzQUI7Ci1jb25zdCBpbnQga1dlYk1JZFByZXZTaXplID0gMHhBQjsKLWNvbnN0IGludCBrV2ViTUlkUHJldlVJRCA9IDB4M0NCOTIzOwotY29uc3QgaW50IGtXZWJNSWRQcm9qZWN0aW9uID0gMHg3NjcwOwotY29uc3QgaW50IGtXZWJNSWRQcm9qZWN0aW9uUG9zZVBpdGNoID0gMHg3Njc0OwotY29uc3QgaW50IGtXZWJNSWRQcm9qZWN0aW9uUG9zZVJvbGwgPSAweDc2NzU7Ci1jb25zdCBpbnQga1dlYk1JZFByb2plY3Rpb25Qb3NlWWF3ID0gMHg3NjczOwotY29uc3QgaW50IGtXZWJNSWRQcm9qZWN0aW9uUHJpdmF0ZSA9IDB4NzY3MjsKLWNvbnN0IGludCBrV2ViTUlkUHJvamVjdGlvblR5cGUgPSAweDc2NzE7Ci1jb25zdCBpbnQga1dlYk1JZFByaW1hcmllcyA9IDB4NTVCQjsKLWNvbnN0IGludCBrV2ViTUlkUHJpbWFyeUJDaHJvbWF0aWNpdHlYID0gMHg1NUQ1OwotY29uc3QgaW50IGtXZWJNSWRQcmltYXJ5QkNocm9tYXRpY2l0eVkgPSAweDU1RDY7Ci1jb25zdCBpbnQga1dlYk1JZFByaW1hcnlHQ2hyb21hdGljaXR5WCA9IDB4NTVEMzsKLWNvbnN0IGludCBrV2ViTUlkUHJpbWFyeUdDaHJvbWF0aWNpdHlZID0gMHg1NUQ0OwotY29uc3QgaW50IGtXZWJNSWRQcmltYXJ5UkNocm9tYXRpY2l0eVggPSAweDU1RDE7Ci1jb25zdCBpbnQga1dlYk1JZFByaW1hcnlSQ2hyb21hdGljaXR5WSA9IDB4NTVEMjsKLWNvbnN0IGludCBrV2ViTUlkUmFuZ2UgPSAweDU1Qjk7Ci1jb25zdCBpbnQga1dlYk1JZFJlZmVyZW5jZUJsb2NrID0gMHhGQjsKLWNvbnN0IGludCBrV2ViTUlkUmVmZXJlbmNlUHJpb3JpdHkgPSAweEZBOwotY29uc3QgaW50IGtXZWJNSWRTYW1wbGluZ0ZyZXF1ZW5jeSA9IDB4QjU7Ci1jb25zdCBpbnQga1dlYk1JZFNlZWsgPSAweDREQkI7Ci1jb25zdCBpbnQga1dlYk1JZFNlZWtIZWFkID0gMHgxMTREOUI3NDsKLWNvbnN0IGludCBrV2ViTUlkU2Vla0lEID0gMHg1M0FCOwotY29uc3QgaW50IGtXZWJNSWRTZWVrUG9zaXRpb24gPSAweDUzQUM7Ci1jb25zdCBpbnQga1dlYk1JZFNlZWtQcmVSb2xsID0gMHg1NkJCOwotY29uc3QgaW50IGtXZWJNSWRTZWdtZW50ID0gMHgxODUzODA2NzsKLWNvbnN0IGludCBrV2ViTUlkU2VnbWVudEZhbWlseSA9IDB4NDQ0NDsKLWNvbnN0IGludCBrV2ViTUlkU2VnbWVudEZpbGVuYW1lID0gMHg3Mzg0OwotY29uc3QgaW50IGtXZWJNSWRTZWdtZW50VUlEID0gMHg3M0E0OwotY29uc3QgaW50IGtXZWJNSWRTaWxlbnRUcmFja051bWJlciA9IDB4NThENzsKLWNvbnN0IGludCBrV2ViTUlkU2lsZW50VHJhY2tzID0gMHg1ODU0OwotY29uc3QgaW50IGtXZWJNSWRTaW1wbGVCbG9jayA9IDB4QTM7Ci1jb25zdCBpbnQga1dlYk1JZFNpbXBsZVRhZyA9IDB4NjdDODsKLWNvbnN0IGludCBrV2ViTUlkU2xpY2VzID0gMHg4RTsKLWNvbnN0IGludCBrV2ViTUlkU3RlcmVvTW9kZSA9IDB4NTNCODsKLWNvbnN0IGludCBrV2ViTUlkVGFnID0gMHg3MzczOwotY29uc3QgaW50IGtXZWJNSWRUYWdBdHRhY2htZW50VUlEID0gMHg2M0M2OwotY29uc3QgaW50IGtXZWJNSWRUYWdCaW5hcnkgPSAweDQ0ODU7Ci1jb25zdCBpbnQga1dlYk1JZFRhZ0NoYXB0ZXJVSUQgPSAweDYzQzQ7Ci1jb25zdCBpbnQga1dlYk1JZFRhZ0RlZmF1bHQgPSAweDQ0ODQ7Ci1jb25zdCBpbnQga1dlYk1JZFRhZ0VkaXRpb25VSUQgPSAweDYzQzk7Ci1jb25zdCBpbnQga1dlYk1JZFRhZ0xhbmd1YWdlID0gMHg0NDdBOwotY29uc3QgaW50IGtXZWJNSWRUYWdOYW1lID0gMHg0NUEzOwotY29uc3QgaW50IGtXZWJNSWRUYWdzID0gMHgxMjU0QzM2NzsKLWNvbnN0IGludCBrV2ViTUlkVGFnU3RyaW5nID0gMHg0NDg3OwotY29uc3QgaW50IGtXZWJNSWRUYWdUcmFja1VJRCA9IDB4NjNDNTsKLWNvbnN0IGludCBrV2ViTUlkVGFyZ2V0cyA9IDB4NjNDMDsKLWNvbnN0IGludCBrV2ViTUlkVGFyZ2V0VHlwZSA9IDB4NjNDQTsKLWNvbnN0IGludCBrV2ViTUlkVGFyZ2V0VHlwZVZhbHVlID0gMHg2OENBOwotY29uc3QgaW50IGtXZWJNSWRUaW1lY29kZSA9IDB4RTc7Ci1jb25zdCBpbnQga1dlYk1JZFRpbWVjb2RlU2NhbGUgPSAweDJBRDdCMTsKLWNvbnN0IGludCBrV2ViTUlkVGltZVNsaWNlID0gMHhFODsKLWNvbnN0IGludCBrV2ViTUlkVGl0bGUgPSAweDdCQTk7Ci1jb25zdCBpbnQga1dlYk1JZFRyYWNrQ29tYmluZVBsYW5lcyA9IDB4RTM7Ci1jb25zdCBpbnQga1dlYk1JZFRyYWNrRW50cnkgPSAweEFFOwotY29uc3QgaW50IGtXZWJNSWRUcmFja0pvaW5VSUQgPSAweEVEOwotY29uc3QgaW50IGtXZWJNSWRUcmFja051bWJlciA9IDB4RDc7Ci1jb25zdCBpbnQga1dlYk1JZFRyYWNrT3BlcmF0aW9uID0gMHhFMjsKLWNvbnN0IGludCBrV2ViTUlkVHJhY2tPdmVybGF5ID0gMHg2RkFCOwotY29uc3QgaW50IGtXZWJNSWRUcmFja1BsYW5lID0gMHhFNDsKLWNvbnN0IGludCBrV2ViTUlkVHJhY2tQbGFuZVR5cGUgPSAweEU2OwotY29uc3QgaW50IGtXZWJNSWRUcmFja1BsYW5lVUlEID0gMHhFNTsKLWNvbnN0IGludCBrV2ViTUlkVHJhY2tzID0gMHgxNjU0QUU2QjsKLWNvbnN0IGludCBrV2ViTUlkVHJhY2tUaW1lY29kZVNjYWxlID0gMHgyMzMxNEY7Ci1jb25zdCBpbnQga1dlYk1JZFRyYWNrVHJhbnNsYXRlID0gMHg2NjI0OwotY29uc3QgaW50IGtXZWJNSWRUcmFja1RyYW5zbGF0ZUNvZGVjID0gMHg2NkJGOwotY29uc3QgaW50IGtXZWJNSWRUcmFja1RyYW5zbGF0ZUVkaXRpb25VSUQgPSAweDY2RkM7Ci1jb25zdCBpbnQga1dlYk1JZFRyYWNrVHJhbnNsYXRlVHJhY2tJRCA9IDB4NjZBNTsKLWNvbnN0IGludCBrV2ViTUlkVHJhY2tUeXBlID0gMHg4MzsKLWNvbnN0IGludCBrV2ViTUlkVHJhY2tVSUQgPSAweDczQzU7Ci1jb25zdCBpbnQga1dlYk1JZFRyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzID0gMHg1NUJBOwotY29uc3QgaW50IGtXZWJNSWRWaWRlbyA9IDB4RTA7Ci1jb25zdCBpbnQga1dlYk1JZFZvaWQgPSAweEVDOwotY29uc3QgaW50IGtXZWJNSWRXaGl0ZVBvaW50Q2hyb21hdGljaXR5WCA9IDB4NTVENzsKLWNvbnN0IGludCBrV2ViTUlkV2hpdGVQb2ludENocm9tYXRpY2l0eVkgPSAweDU1RDg7Ci1jb25zdCBpbnQga1dlYk1JZFdyaXRpbmdBcHAgPSAweDU3NDE7Ci0KLWNvbnN0IGludDY0IGtXZWJNUmVzZXJ2ZWRJZCA9IDB4MUZGRkZGRkY7Ci1jb25zdCBpbnQ2NCBrV2ViTVVua25vd25TaXplID0gR0dfTE9OR0xPTkcoMHgwMEZGRkZGRkZGRkZGRkZGKTsKLQotY29uc3QgdWludDgga1dlYk1GbGFnS2V5ZnJhbWUgPSAweDgwOwotCi0vLyBDdXJyZW50IGVuY3J5cHRlZCBXZWJNIHJlcXVlc3QgZm9yIGNvbW1lbnRzIHNwZWNpZmljYXRpb24gaXMgaGVyZQotLy8gaHR0cDovL3dpa2kud2VibXByb2plY3Qub3JnL2VuY3J5cHRpb24vd2VibS1lbmNyeXB0aW9uLXJmYwotY29uc3QgdWludDgga1dlYk1GbGFnRW5jcnlwdGVkRnJhbWUgPSAweDE7Ci1jb25zdCB1aW50OCBrV2ViTUZsYWdFbmNyeXB0ZWRGcmFtZVBhcnRpdGlvbmVkID0gMHgyOwotY29uc3QgaW50IGtXZWJNSXZTaXplID0gODsKLWNvbnN0IGludCBrV2ViTVNpZ25hbEJ5dGVTaXplID0gMTsKLWNvbnN0IGludCBrV2ViTUVuY3J5cHRlZEZyYW1lTnVtUGFydGl0aW9uc1NpemUgPSAxOwotY29uc3QgaW50IGtXZWJNRW5jcnlwdGVkRnJhbWVQYXJ0aXRpb25PZmZzZXRTaXplID0gNDsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfV0VCTV9XRUJNX0NPTlNUQU5UU19IXwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3dlYm0vd2VibV9jb250ZW50X2VuY29kaW5ncy5jYyBiL3NyYy9tZWRpYS93ZWJtL3dlYm1fY29udGVudF9lbmNvZGluZ3MuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODljMGYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3dlYm0vd2VibV9jb250ZW50X2VuY29kaW5ncy5jYworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJtZWRpYS93ZWJtL3dlYm1fY29udGVudF9lbmNvZGluZ3MuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotQ29udGVudEVuY29kaW5nOjpDb250ZW50RW5jb2RpbmcoKQotICAgIDogb3JkZXJfKGtPcmRlckludmFsaWQpLAotICAgICAgc2NvcGVfKGtTY29wZUludmFsaWQpLAotICAgICAgdHlwZV8oa1R5cGVJbnZhbGlkKSwKLSAgICAgIGVuY3J5cHRpb25fYWxnb18oa0VuY0FsZ29JbnZhbGlkKSwKLSAgICAgIGNpcGhlcl9tb2RlXyhrQ2lwaGVyTW9kZUludmFsaWQpIHsKLX0KLQotQ29udGVudEVuY29kaW5nOjp+Q29udGVudEVuY29kaW5nKCkge30KLQotdm9pZCBDb250ZW50RW5jb2Rpbmc6OlNldEVuY3J5cHRpb25LZXlJZChjb25zdCB1aW50OCogZW5jcnlwdGlvbl9rZXlfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKSB7Ci0gIERDSEVDSyhlbmNyeXB0aW9uX2tleV9pZCk7Ci0gIERDSEVDS19HVChzaXplLCAwKTsKLSAgZW5jcnlwdGlvbl9rZXlfaWRfLmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihlbmNyeXB0aW9uX2tleV9pZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3dlYm0vd2VibV9jb250ZW50X2VuY29kaW5ncy5oIGIvc3JjL21lZGlhL3dlYm0vd2VibV9jb250ZW50X2VuY29kaW5ncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODY2ZjI1Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS93ZWJtL3dlYm1fY29udGVudF9lbmNvZGluZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfV0VCTV9XRUJNX0NPTlRFTlRfRU5DT0RJTkdTX0hfCi0jZGVmaW5lIE1FRElBX1dFQk1fV0VCTV9DT05URU5UX0VOQ09ESU5HU19IXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWNsYXNzIE1FRElBX0VYUE9SVCBDb250ZW50RW5jb2RpbmcgewotIHB1YmxpYzoKLSAgLy8gVGhlIGZvbGxvd2luZyBlbnVtIGRlZmluaXRpb25zIGFyZSBiYXNlZCBvbiB0aGUgQ29udGVudEVuY29kaW5nIGVsZW1lbnQKLSAgLy8gc3BlY2lmaWVkIGluIHRoZSBNYXRyb3NrYSBzcGVjLgotCi0gIHN0YXRpYyBjb25zdCBpbnQga09yZGVySW52YWxpZCA9IC0xOwotCi0gIGVudW0gU2NvcGUgewotICAgIGtTY29wZUludmFsaWQgPSAwLAotICAgIGtTY29wZUFsbEZyYW1lQ29udGVudHMgPSAxLAotICAgIGtTY29wZVRyYWNrUHJpdmF0ZURhdGEgPSAyLAotICAgIGtTY29wZU5leHRDb250ZW50RW5jb2RpbmdEYXRhID0gNCwKLSAgICBrU2NvcGVNYXggPSA3LAotICB9OwotCi0gIGVudW0gVHlwZSB7Ci0gICAga1R5cGVJbnZhbGlkID0gLTEsCi0gICAga1R5cGVDb21wcmVzc2lvbiA9IDAsCi0gICAga1R5cGVFbmNyeXB0aW9uID0gMSwKLSAgfTsKLQotICBlbnVtIEVuY3J5cHRpb25BbGdvIHsKLSAgICBrRW5jQWxnb0ludmFsaWQgPSAtMSwKLSAgICBrRW5jQWxnb05vdEVuY3J5cHRlZCA9IDAsCi0gICAga0VuY0FsZ29EZXMgPSAxLAotICAgIGtFbmNBbGdvM2RlcyA9IDIsCi0gICAga0VuY0FsZ29Ud29maXNoID0gMywKLSAgICBrRW5jQWxnb0Jsb3dmaXNoID0gNCwKLSAgICBrRW5jQWxnb0FlcyA9IDUsCi0gIH07Ci0KLSAgZW51bSBDaXBoZXJNb2RlIHsKLSAgICBrQ2lwaGVyTW9kZUludmFsaWQgPSAwLAotICAgIGtDaXBoZXJNb2RlQ3RyID0gMSwKLSAgfTsKLQotICBDb250ZW50RW5jb2RpbmcoKTsKLSAgfkNvbnRlbnRFbmNvZGluZygpOwotCi0gIGludDY0IG9yZGVyKCkgY29uc3QgeyByZXR1cm4gb3JkZXJfOyB9Ci0gIHZvaWQgc2V0X29yZGVyKGludDY0IG9yZGVyKSB7IG9yZGVyXyA9IG9yZGVyOyB9Ci0KLSAgU2NvcGUgc2NvcGUoKSBjb25zdCB7IHJldHVybiBzY29wZV87IH0KLSAgdm9pZCBzZXRfc2NvcGUoU2NvcGUgc2NvcGUpIHsgc2NvcGVfID0gc2NvcGU7IH0KLQotICBUeXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlXzsgfQotICB2b2lkIHNldF90eXBlKFR5cGUgdHlwZSkgeyB0eXBlXyA9IHR5cGU7IH0KLQotICBFbmNyeXB0aW9uQWxnbyBlbmNyeXB0aW9uX2FsZ28oKSBjb25zdCB7IHJldHVybiBlbmNyeXB0aW9uX2FsZ29fOyB9Ci0gIHZvaWQgc2V0X2VuY3J5cHRpb25fYWxnbyhFbmNyeXB0aW9uQWxnbyBlbmNyeXB0aW9uX2FsZ28pIHsKLSAgICBlbmNyeXB0aW9uX2FsZ29fID0gZW5jcnlwdGlvbl9hbGdvOwotICB9Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGVuY3J5cHRpb25fa2V5X2lkKCkgY29uc3QgeyByZXR1cm4gZW5jcnlwdGlvbl9rZXlfaWRfOyB9Ci0gIHZvaWQgU2V0RW5jcnlwdGlvbktleUlkKGNvbnN0IHVpbnQ4KiBlbmNyeXB0aW9uX2tleV9pZCwgaW50IHNpemUpOwotCi0gIENpcGhlck1vZGUgY2lwaGVyX21vZGUoKSBjb25zdCB7IHJldHVybiBjaXBoZXJfbW9kZV87IH0KLSAgdm9pZCBzZXRfY2lwaGVyX21vZGUoQ2lwaGVyTW9kZSBtb2RlKSB7IGNpcGhlcl9tb2RlXyA9IG1vZGU7IH0KLQotIHByaXZhdGU6Ci0gIGludDY0IG9yZGVyXzsKLSAgU2NvcGUgc2NvcGVfOwotICBUeXBlIHR5cGVfOwotICBFbmNyeXB0aW9uQWxnbyBlbmNyeXB0aW9uX2FsZ29fOwotICBzdGQ6OnN0cmluZyBlbmNyeXB0aW9uX2tleV9pZF87Ci0gIENpcGhlck1vZGUgY2lwaGVyX21vZGVfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihDb250ZW50RW5jb2RpbmcpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfV0VCTV9XRUJNX0NPTlRFTlRfRU5DT0RJTkdTX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvd2VibS93ZWJtX2NvbnRlbnRfZW5jb2RpbmdzX2NsaWVudC5jYyBiL3NyYy9tZWRpYS93ZWJtL3dlYm1fY29udGVudF9lbmNvZGluZ3NfY2xpZW50LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2Y5NjRlLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS93ZWJtL3dlYm1fY29udGVudF9lbmNvZGluZ3NfY2xpZW50LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS93ZWJtL3dlYm1fY29udGVudF9lbmNvZGluZ3NfY2xpZW50LmgiCi0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL3N0bF91dGlsLmgiCi0jaW5jbHVkZSAibWVkaWEvd2VibS93ZWJtX2NvbnN0YW50cy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1XZWJNQ29udGVudEVuY29kaW5nc0NsaWVudDo6V2ViTUNvbnRlbnRFbmNvZGluZ3NDbGllbnQoY29uc3QgTG9nQ0ImIGxvZ19jYikKLSAgICA6IGxvZ19jYl8obG9nX2NiKSwKLSAgICAgIGNvbnRlbnRfZW5jcnlwdGlvbl9lbmNvdW50ZXJlZF8oZmFsc2UpLAotICAgICAgY29udGVudF9lbmNvZGluZ3NfcmVhZHlfKGZhbHNlKSB7Ci19Ci0KLVdlYk1Db250ZW50RW5jb2RpbmdzQ2xpZW50Ojp+V2ViTUNvbnRlbnRFbmNvZGluZ3NDbGllbnQoKSB7Ci0gIFNUTERlbGV0ZUVsZW1lbnRzKCZjb250ZW50X2VuY29kaW5nc18pOwotfQotCi1jb25zdCBDb250ZW50RW5jb2RpbmdzJiBXZWJNQ29udGVudEVuY29kaW5nc0NsaWVudDo6Y29udGVudF9lbmNvZGluZ3MoKSBjb25zdCB7Ci0gIERDSEVDSyhjb250ZW50X2VuY29kaW5nc19yZWFkeV8pOwotICByZXR1cm4gY29udGVudF9lbmNvZGluZ3NfOwotfQotCi1XZWJNUGFyc2VyQ2xpZW50KiBXZWJNQ29udGVudEVuY29kaW5nc0NsaWVudDo6T25MaXN0U3RhcnQoaW50IGlkKSB7Ci0gIGlmIChpZCA9PSBrV2ViTUlkQ29udGVudEVuY29kaW5ncykgewotICAgIERDSEVDSyghY3VyX2NvbnRlbnRfZW5jb2RpbmdfLmdldCgpKTsKLSAgICBEQ0hFQ0soIWNvbnRlbnRfZW5jcnlwdGlvbl9lbmNvdW50ZXJlZF8pOwotICAgIFNUTERlbGV0ZUVsZW1lbnRzKCZjb250ZW50X2VuY29kaW5nc18pOwotICAgIGNvbnRlbnRfZW5jb2RpbmdzX3JlYWR5XyA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgaWYgKGlkID09IGtXZWJNSWRDb250ZW50RW5jb2RpbmcpIHsKLSAgICBEQ0hFQ0soIWN1cl9jb250ZW50X2VuY29kaW5nXy5nZXQoKSk7Ci0gICAgRENIRUNLKCFjb250ZW50X2VuY3J5cHRpb25fZW5jb3VudGVyZWRfKTsKLSAgICBjdXJfY29udGVudF9lbmNvZGluZ18ucmVzZXQobmV3IENvbnRlbnRFbmNvZGluZygpKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotCi0gIGlmIChpZCA9PSBrV2ViTUlkQ29udGVudEVuY3J5cHRpb24pIHsKLSAgICBEQ0hFQ0soY3VyX2NvbnRlbnRfZW5jb2RpbmdfLmdldCgpKTsKLSAgICBpZiAoY29udGVudF9lbmNyeXB0aW9uX2VuY291bnRlcmVkXykgewotICAgICAgTUVESUFfTE9HKGxvZ19jYl8pIDw8ICJVbmV4cGVjdGVkIG11bHRpcGxlIENvbnRlbnRFbmNyeXB0aW9uLiI7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgY29udGVudF9lbmNyeXB0aW9uX2VuY291bnRlcmVkXyA9IHRydWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICBpZiAoaWQgPT0ga1dlYk1JZENvbnRlbnRFbmNBRVNTZXR0aW5ncykgewotICAgIERDSEVDSyhjdXJfY29udGVudF9lbmNvZGluZ18uZ2V0KCkpOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiBpZiBXZWJNTGlzdFBhcnNlciBpcyB3b3JraW5nIHByb3Blcmx5LgotICBEQ0hFQ0soZmFsc2UpOwotICByZXR1cm4gTlVMTDsKLX0KLQotLy8gTWFuZGF0b3J5IG9jY3VycmVuY2UgcmVzdHJpY3Rpb24gaXMgY2hlY2tlZCBpbiB0aGlzIGZ1bmN0aW9uLiBNdWx0aXBsZQotLy8gb2NjdXJyZW5jZSByZXN0cmljdGlvbiBpcyBjaGVja2VkIGluIE9uVUludCBhbmQgT25CaW5hcnkuCi1ib29sIFdlYk1Db250ZW50RW5jb2RpbmdzQ2xpZW50OjpPbkxpc3RFbmQoaW50IGlkKSB7Ci0gIGlmIChpZCA9PSBrV2ViTUlkQ29udGVudEVuY29kaW5ncykgewotICAgIC8vIENvbnRlbnRFbmNvZGluZyBlbGVtZW50IGlzIG1hbmRhdG9yeS4gQ2hlY2sgdGhpcyEKLSAgICBpZiAoY29udGVudF9lbmNvZGluZ3NfLmVtcHR5KCkpIHsKLSAgICAgIE1FRElBX0xPRyhsb2dfY2JfKSA8PCAiTWlzc2luZyBDb250ZW50RW5jb2RpbmcuIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgY29udGVudF9lbmNvZGluZ3NfcmVhZHlfID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGlmIChpZCA9PSBrV2ViTUlkQ29udGVudEVuY29kaW5nKSB7Ci0gICAgRENIRUNLKGN1cl9jb250ZW50X2VuY29kaW5nXy5nZXQoKSk7Ci0KLSAgICAvLwotICAgIC8vIFNwZWNpZnkgZGVmYXVsdCB2YWx1ZXMgdG8gbWlzc2luZyBtYW5kYXRvcnkgZWxlbWVudHMuCi0gICAgLy8KLQotICAgIGlmIChjdXJfY29udGVudF9lbmNvZGluZ18tPm9yZGVyKCkgPT0gQ29udGVudEVuY29kaW5nOjprT3JkZXJJbnZhbGlkKSB7Ci0gICAgICAvLyBEZWZhdWx0IHZhbHVlIG9mIGVuY29kaW5nIG9yZGVyIGlzIDAsIHdoaWNoIHNob3VsZCBvbmx5IGJlIHVzZWQgb24gdGhlCi0gICAgICAvLyBmaXJzdCBDb250ZW50RW5jb2RpbmcuCi0gICAgICBpZiAoIWNvbnRlbnRfZW5jb2RpbmdzXy5lbXB0eSgpKSB7Ci0gICAgICAgIE1FRElBX0xPRyhsb2dfY2JfKSA8PCAiTWlzc2luZyBDb250ZW50RW5jb2RpbmdPcmRlci4iOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBjdXJfY29udGVudF9lbmNvZGluZ18tPnNldF9vcmRlcigwKTsKLSAgICB9Ci0KLSAgICBpZiAoY3VyX2NvbnRlbnRfZW5jb2RpbmdfLT5zY29wZSgpID09IENvbnRlbnRFbmNvZGluZzo6a1Njb3BlSW52YWxpZCkKLSAgICAgIGN1cl9jb250ZW50X2VuY29kaW5nXy0+c2V0X3Njb3BlKENvbnRlbnRFbmNvZGluZzo6a1Njb3BlQWxsRnJhbWVDb250ZW50cyk7Ci0KLSAgICBpZiAoY3VyX2NvbnRlbnRfZW5jb2RpbmdfLT50eXBlKCkgPT0gQ29udGVudEVuY29kaW5nOjprVHlwZUludmFsaWQpCi0gICAgICBjdXJfY29udGVudF9lbmNvZGluZ18tPnNldF90eXBlKENvbnRlbnRFbmNvZGluZzo6a1R5cGVDb21wcmVzc2lvbik7Ci0KLSAgICAvLyBDaGVjayBmb3IgZWxlbWVudHMgdmFsaWQgaW4gc3BlYyBidXQgbm90IHN1cHBvcnRlZCBmb3Igbm93LgotICAgIGlmIChjdXJfY29udGVudF9lbmNvZGluZ18tPnR5cGUoKSA9PSBDb250ZW50RW5jb2Rpbmc6OmtUeXBlQ29tcHJlc3Npb24pIHsKLSAgICAgIE1FRElBX0xPRyhsb2dfY2JfKSA8PCAiQ29udGVudENvbXByZXNzaW9uIG5vdCBzdXBwb3J0ZWQuIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBFbmZvcmNlIG1hbmRhdG9yeSBlbGVtZW50cyB3aXRob3V0IGRlZmF1bHQgdmFsdWVzLgotICAgIERDSEVDSyhjdXJfY29udGVudF9lbmNvZGluZ18tPnR5cGUoKSA9PSBDb250ZW50RW5jb2Rpbmc6OmtUeXBlRW5jcnlwdGlvbik7Ci0gICAgaWYgKCFjb250ZW50X2VuY3J5cHRpb25fZW5jb3VudGVyZWRfKSB7Ci0gICAgICBNRURJQV9MT0cobG9nX2NiXykgPDwgIkNvbnRlbnRFbmNvZGluZ1R5cGUgaXMgZW5jcnlwdGlvbiBidXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBDb250ZW50RW5jcnlwdGlvbiBpcyBtaXNzaW5nLiI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY29udGVudF9lbmNvZGluZ3NfLnB1c2hfYmFjayhjdXJfY29udGVudF9lbmNvZGluZ18ucmVsZWFzZSgpKTsKLSAgICBjb250ZW50X2VuY3J5cHRpb25fZW5jb3VudGVyZWRfID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBpZiAoaWQgPT0ga1dlYk1JZENvbnRlbnRFbmNyeXB0aW9uKSB7Ci0gICAgRENIRUNLKGN1cl9jb250ZW50X2VuY29kaW5nXy5nZXQoKSk7Ci0gICAgLy8gU3BlY2lmeSBkZWZhdWx0IHZhbHVlIGZvciBlbGVtZW50cyB0aGF0IGFyZSBub3QgcHJlc2VudC4KLSAgICBpZiAoY3VyX2NvbnRlbnRfZW5jb2RpbmdfLT5lbmNyeXB0aW9uX2FsZ28oKSA9PQotICAgICAgICBDb250ZW50RW5jb2Rpbmc6OmtFbmNBbGdvSW52YWxpZCkgewotICAgICAgY3VyX2NvbnRlbnRfZW5jb2RpbmdfLT5zZXRfZW5jcnlwdGlvbl9hbGdvKAotICAgICAgICAgIENvbnRlbnRFbmNvZGluZzo6a0VuY0FsZ29Ob3RFbmNyeXB0ZWQpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGlmIChpZCA9PSBrV2ViTUlkQ29udGVudEVuY0FFU1NldHRpbmdzKSB7Ci0gICAgaWYgKGN1cl9jb250ZW50X2VuY29kaW5nXy0+Y2lwaGVyX21vZGUoKSA9PQotICAgICAgICBDb250ZW50RW5jb2Rpbmc6OmtDaXBoZXJNb2RlSW52YWxpZCkKLSAgICAgIGN1cl9jb250ZW50X2VuY29kaW5nXy0+c2V0X2NpcGhlcl9tb2RlKENvbnRlbnRFbmNvZGluZzo6a0NpcGhlck1vZGVDdHIpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiBpZiBXZWJNTGlzdFBhcnNlciBpcyB3b3JraW5nIHByb3Blcmx5LgotICBEQ0hFQ0soZmFsc2UpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIE11bHRpcGxlIG9jY3VycmVuY2UgcmVzdHJpY3Rpb24gYW5kIHJhbmdlIGFyZSBjaGVja2VkIGluIHRoaXMgZnVuY3Rpb24uCi0vLyBNYW5kYXRvcnkgb2NjdXJyZW5jZSByZXN0cmljdGlvbiBpcyBjaGVja2VkIGluIE9uTGlzdEVuZC4KLWJvb2wgV2ViTUNvbnRlbnRFbmNvZGluZ3NDbGllbnQ6Ok9uVUludChpbnQgaWQsIGludDY0IHZhbCkgewotICBEQ0hFQ0soY3VyX2NvbnRlbnRfZW5jb2RpbmdfLmdldCgpKTsKLQotICBpZiAoaWQgPT0ga1dlYk1JZENvbnRlbnRFbmNvZGluZ09yZGVyKSB7Ci0gICAgaWYgKGN1cl9jb250ZW50X2VuY29kaW5nXy0+b3JkZXIoKSAhPSBDb250ZW50RW5jb2Rpbmc6OmtPcmRlckludmFsaWQpIHsKLSAgICAgIE1FRElBX0xPRyhsb2dfY2JfKSA8PCAiVW5leHBlY3RlZCBtdWx0aXBsZSBDb250ZW50RW5jb2RpbmdPcmRlci4iOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICh2YWwgIT0gc3RhdGljX2Nhc3Q8aW50NjQ+KGNvbnRlbnRfZW5jb2RpbmdzXy5zaXplKCkpKSB7Ci0gICAgICAvLyBBY2NvcmRpbmcgdG8gdGhlIHNwZWMsIGVuY29kaW5nIG9yZGVyIHN0YXJ0cyB3aXRoIDAgYW5kIGNvdW50cyB1cHdhcmRzLgotICAgICAgTUVESUFfTE9HKGxvZ19jYl8pIDw8ICJVbmV4cGVjdGVkIENvbnRlbnRFbmNvZGluZ09yZGVyLiI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY3VyX2NvbnRlbnRfZW5jb2RpbmdfLT5zZXRfb3JkZXIodmFsKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGlmIChpZCA9PSBrV2ViTUlkQ29udGVudEVuY29kaW5nU2NvcGUpIHsKLSAgICBpZiAoY3VyX2NvbnRlbnRfZW5jb2RpbmdfLT5zY29wZSgpICE9IENvbnRlbnRFbmNvZGluZzo6a1Njb3BlSW52YWxpZCkgewotICAgICAgTUVESUFfTE9HKGxvZ19jYl8pIDw8ICJVbmV4cGVjdGVkIG11bHRpcGxlIENvbnRlbnRFbmNvZGluZ1Njb3BlLiI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKHZhbCA9PSBDb250ZW50RW5jb2Rpbmc6OmtTY29wZUludmFsaWQgfHwKLSAgICAgICAgdmFsID4gQ29udGVudEVuY29kaW5nOjprU2NvcGVNYXgpIHsKLSAgICAgIE1FRElBX0xPRyhsb2dfY2JfKSA8PCAiVW5leHBlY3RlZCBDb250ZW50RW5jb2RpbmdTY29wZS4iOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICh2YWwgJiBDb250ZW50RW5jb2Rpbmc6OmtTY29wZU5leHRDb250ZW50RW5jb2RpbmdEYXRhKSB7Ci0gICAgICBNRURJQV9MT0cobG9nX2NiXykgPDwgIkVuY29kZWQgbmV4dCBDb250ZW50RW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZC4iOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGN1cl9jb250ZW50X2VuY29kaW5nXy0+c2V0X3Njb3BlKHN0YXRpY19jYXN0PENvbnRlbnRFbmNvZGluZzo6U2NvcGU+KHZhbCkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgaWYgKGlkID09IGtXZWJNSWRDb250ZW50RW5jb2RpbmdUeXBlKSB7Ci0gICAgaWYgKGN1cl9jb250ZW50X2VuY29kaW5nXy0+dHlwZSgpICE9IENvbnRlbnRFbmNvZGluZzo6a1R5cGVJbnZhbGlkKSB7Ci0gICAgICBNRURJQV9MT0cobG9nX2NiXykgPDwgIlVuZXhwZWN0ZWQgbXVsdGlwbGUgQ29udGVudEVuY29kaW5nVHlwZS4iOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICh2YWwgPT0gQ29udGVudEVuY29kaW5nOjprVHlwZUNvbXByZXNzaW9uKSB7Ci0gICAgICBNRURJQV9MT0cobG9nX2NiXykgPDwgIkNvbnRlbnRDb21wcmVzc2lvbiBub3Qgc3VwcG9ydGVkLiI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKHZhbCAhPSBDb250ZW50RW5jb2Rpbmc6OmtUeXBlRW5jcnlwdGlvbikgewotICAgICAgTUVESUFfTE9HKGxvZ19jYl8pIDw8ICJVbmV4cGVjdGVkIENvbnRlbnRFbmNvZGluZ1R5cGUgIiA8PCB2YWwgPDwgIi4iOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGN1cl9jb250ZW50X2VuY29kaW5nXy0+c2V0X3R5cGUoc3RhdGljX2Nhc3Q8Q29udGVudEVuY29kaW5nOjpUeXBlPih2YWwpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGlmIChpZCA9PSBrV2ViTUlkQ29udGVudEVuY0FsZ28pIHsKLSAgICBpZiAoY3VyX2NvbnRlbnRfZW5jb2RpbmdfLT5lbmNyeXB0aW9uX2FsZ28oKSAhPQotICAgICAgICBDb250ZW50RW5jb2Rpbmc6OmtFbmNBbGdvSW52YWxpZCkgewotICAgICAgTUVESUFfTE9HKGxvZ19jYl8pIDw8ICJVbmV4cGVjdGVkIG11bHRpcGxlIENvbnRlbnRFbmNBbGdvLiI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKHZhbCA8IENvbnRlbnRFbmNvZGluZzo6a0VuY0FsZ29Ob3RFbmNyeXB0ZWQgfHwKLSAgICAgICAgdmFsID4gQ29udGVudEVuY29kaW5nOjprRW5jQWxnb0FlcykgewotICAgICAgTUVESUFfTE9HKGxvZ19jYl8pIDw8ICJVbmV4cGVjdGVkIENvbnRlbnRFbmNBbGdvICIgPDwgdmFsIDw8ICIuIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjdXJfY29udGVudF9lbmNvZGluZ18tPnNldF9lbmNyeXB0aW9uX2FsZ28oCi0gICAgICAgIHN0YXRpY19jYXN0PENvbnRlbnRFbmNvZGluZzo6RW5jcnlwdGlvbkFsZ28+KHZhbCkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgaWYgKGlkID09IGtXZWJNSWRBRVNTZXR0aW5nc0NpcGhlck1vZGUpIHsKLSAgICBpZiAoY3VyX2NvbnRlbnRfZW5jb2RpbmdfLT5jaXBoZXJfbW9kZSgpICE9Ci0gICAgICAgIENvbnRlbnRFbmNvZGluZzo6a0NpcGhlck1vZGVJbnZhbGlkKSB7Ci0gICAgICBNRURJQV9MT0cobG9nX2NiXykgPDwgIlVuZXhwZWN0ZWQgbXVsdGlwbGUgQUVTU2V0dGluZ3NDaXBoZXJNb2RlLiI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKHZhbCAhPSBDb250ZW50RW5jb2Rpbmc6OmtDaXBoZXJNb2RlQ3RyKSB7Ci0gICAgICBNRURJQV9MT0cobG9nX2NiXykgPDwgIlVuZXhwZWN0ZWQgQUVTU2V0dGluZ3NDaXBoZXJNb2RlICIgPDwgdmFsIDw8ICIuIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjdXJfY29udGVudF9lbmNvZGluZ18tPnNldF9jaXBoZXJfbW9kZSgKLSAgICAgICAgc3RhdGljX2Nhc3Q8Q29udGVudEVuY29kaW5nOjpDaXBoZXJNb2RlPih2YWwpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gaWYgV2ViTUxpc3RQYXJzZXIgaXMgd29ya2luZyBwcm9wZXJseS4KLSAgRENIRUNLKGZhbHNlKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBNdWx0aXBsZSBvY2N1cnJlbmNlIHJlc3RyaWN0aW9uIGlzIGNoZWNrZWQgaW4gdGhpcyBmdW5jdGlvbi4gIE1hbmRhdG9yeQotLy8gcmVzdHJpY3Rpb24gaXMgY2hlY2tlZCBpbiBPbkxpc3RFbmQuCi1ib29sIFdlYk1Db250ZW50RW5jb2RpbmdzQ2xpZW50OjpPbkJpbmFyeShpbnQgaWQsIGNvbnN0IHVpbnQ4KiBkYXRhLCBpbnQgc2l6ZSkgewotICBEQ0hFQ0soY3VyX2NvbnRlbnRfZW5jb2RpbmdfLmdldCgpKTsKLSAgRENIRUNLKGRhdGEpOwotICBEQ0hFQ0tfR1Qoc2l6ZSwgMCk7Ci0KLSAgaWYgKGlkID09IGtXZWJNSWRDb250ZW50RW5jS2V5SUQpIHsKLSAgICBpZiAoIWN1cl9jb250ZW50X2VuY29kaW5nXy0+ZW5jcnlwdGlvbl9rZXlfaWQoKS5lbXB0eSgpKSB7Ci0gICAgICBNRURJQV9MT0cobG9nX2NiXykgPDwgIlVuZXhwZWN0ZWQgbXVsdGlwbGUgQ29udGVudEVuY0tleUlEIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgY3VyX2NvbnRlbnRfZW5jb2RpbmdfLT5TZXRFbmNyeXB0aW9uS2V5SWQoZGF0YSwgc2l6ZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuIGlmIFdlYk1MaXN0UGFyc2VyIGlzIHdvcmtpbmcgcHJvcGVybHkuCi0gIERDSEVDSyhmYWxzZSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvd2VibS93ZWJtX2NvbnRlbnRfZW5jb2RpbmdzX2NsaWVudC5oIGIvc3JjL21lZGlhL3dlYm0vd2VibV9jb250ZW50X2VuY29kaW5nc19jbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ3N2ZjZi4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvd2VibS93ZWJtX2NvbnRlbnRfZW5jb2RpbmdzX2NsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9XRUJNX1dFQk1fQ09OVEVOVF9FTkNPRElOR1NfQ0xJRU5UX0hfCi0jZGVmaW5lIE1FRElBX1dFQk1fV0VCTV9DT05URU5UX0VOQ09ESU5HU19DTElFTlRfSF8KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKLSNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9sb2cuaCIKLSNpbmNsdWRlICJtZWRpYS93ZWJtL3dlYm1fY29udGVudF9lbmNvZGluZ3MuaCIKLSNpbmNsdWRlICJtZWRpYS93ZWJtL3dlYm1fcGFyc2VyLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLXR5cGVkZWYgc3RkOjp2ZWN0b3I8Q29udGVudEVuY29kaW5nKj4gQ29udGVudEVuY29kaW5nczsKLQotLy8gUGFyc2VyIGZvciBXZWJNIENvbnRlbnRFbmNvZGluZ3MgZWxlbWVudC4KLWNsYXNzIE1FRElBX0VYUE9SVCBXZWJNQ29udGVudEVuY29kaW5nc0NsaWVudCA6IHB1YmxpYyBXZWJNUGFyc2VyQ2xpZW50IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFdlYk1Db250ZW50RW5jb2RpbmdzQ2xpZW50KGNvbnN0IExvZ0NCJiBsb2dfY2IpOwotICB2aXJ0dWFsIH5XZWJNQ29udGVudEVuY29kaW5nc0NsaWVudCgpOwotCi0gIGNvbnN0IENvbnRlbnRFbmNvZGluZ3MmIGNvbnRlbnRfZW5jb2RpbmdzKCkgY29uc3Q7Ci0KLSAgLy8gV2ViTVBhcnNlckNsaWVudCBtZXRob2RzCi0gIHZpcnR1YWwgV2ViTVBhcnNlckNsaWVudCogT25MaXN0U3RhcnQoaW50IGlkKSBPVkVSUklERTsKLSAgdmlydHVhbCBib29sIE9uTGlzdEVuZChpbnQgaWQpIE9WRVJSSURFOwotICB2aXJ0dWFsIGJvb2wgT25VSW50KGludCBpZCwgaW50NjQgdmFsKSBPVkVSUklERTsKLSAgdmlydHVhbCBib29sIE9uQmluYXJ5KGludCBpZCwgY29uc3QgdWludDgqIGRhdGEsIGludCBzaXplKSBPVkVSUklERTsKLQotIHByaXZhdGU6Ci0gIExvZ0NCIGxvZ19jYl87Ci0gIHNjb3BlZF9wdHI8Q29udGVudEVuY29kaW5nPiBjdXJfY29udGVudF9lbmNvZGluZ187Ci0gIGJvb2wgY29udGVudF9lbmNyeXB0aW9uX2VuY291bnRlcmVkXzsKLSAgQ29udGVudEVuY29kaW5ncyBjb250ZW50X2VuY29kaW5nc187Ci0KLSAgLy8gfGNvbnRlbnRfZW5jb2RpbmdzX3wgaXMgcmVhZHkuIEZvciBkZWJ1Z2dpbmcgcHVycG9zZS4KLSAgYm9vbCBjb250ZW50X2VuY29kaW5nc19yZWFkeV87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFdlYk1Db250ZW50RW5jb2RpbmdzQ2xpZW50KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX1dFQk1fV0VCTV9DT05URU5UX0VOQ09ESU5HU19DTElFTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS93ZWJtL3dlYm1fY29udGVudF9lbmNvZGluZ3NfY2xpZW50X3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL3dlYm0vd2VibV9jb250ZW50X2VuY29kaW5nc19jbGllbnRfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiOWU2OTQuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3dlYm0vd2VibV9jb250ZW50X2VuY29kaW5nc19jbGllbnRfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgIm1lZGlhL3dlYm0vd2VibV9jb25zdGFudHMuaCIKLSNpbmNsdWRlICJtZWRpYS93ZWJtL3dlYm1fY29udGVudF9lbmNvZGluZ3NfY2xpZW50LmgiCi0jaW5jbHVkZSAibWVkaWEvd2VibS93ZWJtX3BhcnNlci5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBXZWJNQ29udGVudEVuY29kaW5nc0NsaWVudFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICBXZWJNQ29udGVudEVuY29kaW5nc0NsaWVudFRlc3QoKQotICAgICAgOiBjbGllbnRfKExvZ0NCKCkpLAotICAgICAgICBwYXJzZXJfKGtXZWJNSWRDb250ZW50RW5jb2RpbmdzLCAmY2xpZW50Xykge30KLQotICB2b2lkIFBhcnNlQW5kRXhwZWN0VG9GYWlsKGNvbnN0IHVpbnQ4KiBidWYsIGludCBzaXplKSB7Ci0gICAgaW50IHJlc3VsdCA9IHBhcnNlcl8uUGFyc2UoYnVmLCBzaXplKTsKLSAgICBFWFBFQ1RfRVEoLTEsIHJlc3VsdCk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgV2ViTUNvbnRlbnRFbmNvZGluZ3NDbGllbnQgY2xpZW50XzsKLSAgV2ViTUxpc3RQYXJzZXIgcGFyc2VyXzsKLX07Ci0KLVRFU1RfRihXZWJNQ29udGVudEVuY29kaW5nc0NsaWVudFRlc3QsIEVtcHR5Q29udGVudEVuY29kaW5ncykgewotICBjb25zdCB1aW50OCBrQ29udGVudEVuY29kaW5nc1tdID0gewotICAgIDB4NkQsIDB4ODAsIDB4ODAsICAvLyBDb250ZW50RW5jb2RpbmdzIChzaXplID0gMCkKLSAgfTsKLSAgaW50IHNpemUgPSBzaXplb2Yoa0NvbnRlbnRFbmNvZGluZ3MpOwotICBQYXJzZUFuZEV4cGVjdFRvRmFpbChrQ29udGVudEVuY29kaW5ncywgc2l6ZSk7Ci19Ci0KLVRFU1RfRihXZWJNQ29udGVudEVuY29kaW5nc0NsaWVudFRlc3QsIEVtcHR5Q29udGVudEVuY29kaW5nKSB7Ci0gIGNvbnN0IHVpbnQ4IGtDb250ZW50RW5jb2RpbmdzW10gPSB7Ci0gICAgMHg2RCwgMHg4MCwgMHg4MywgIC8vIENvbnRlbnRFbmNvZGluZ3MgKHNpemUgPSAzKQotICAgIDB4NjMsIDB4NDAsIDB4ODAsICAvLyAgIENvbnRlbnRFbmNvZGluZyAoc2l6ZSA9IDApCi0gIH07Ci0gIGludCBzaXplID0gc2l6ZW9mKGtDb250ZW50RW5jb2RpbmdzKTsKLSAgUGFyc2VBbmRFeHBlY3RUb0ZhaWwoa0NvbnRlbnRFbmNvZGluZ3MsIHNpemUpOwotfQotCi1URVNUX0YoV2ViTUNvbnRlbnRFbmNvZGluZ3NDbGllbnRUZXN0LCBTaW5nbGVDb250ZW50RW5jb2RpbmcpIHsKLSAgY29uc3QgdWludDgga0NvbnRlbnRFbmNvZGluZ3NbXSA9IHsKLSAgICAweDZELCAweDgwLCAweEExLCAgICAgICAgLy8gQ29udGVudEVuY29kaW5ncyAoc2l6ZSA9IDMzKQotICAgIDB4NjIsIDB4NDAsIDB4OWUsICAgICAgICAvLyAgIENvbnRlbnRFbmNvZGluZyAoc2l6ZSA9IDMwKQotICAgIDB4NTAsIDB4MzEsIDB4ODEsIDB4MDAsICAvLyAgICAgQ29udGVudEVuY29kaW5nT3JkZXIgKHNpemUgPSAxKQotICAgIDB4NTAsIDB4MzIsIDB4ODEsIDB4MDEsICAvLyAgICAgQ29udGVudEVuY29kaW5nU2NvcGUgKHNpemUgPSAxKQotICAgIDB4NTAsIDB4MzMsIDB4ODEsIDB4MDEsICAvLyAgICAgQ29udGVudEVuY29kaW5nVHlwZSAoc2l6ZSA9IDEpCi0gICAgMHg1MCwgMHgzNSwgMHg4RiwgICAgICAgIC8vICAgICBDb250ZW50RW5jcnlwdGlvbiAoc2l6ZSA9IDE1KQotICAgIDB4NDcsIDB4RTEsIDB4ODEsIDB4MDUsICAvLyAgICAgICBDb250ZW50RW5jQWxnbyAoc2l6ZSA9IDEpCi0gICAgMHg0NywgMHhFMiwgMHg4OCwgICAgICAgIC8vICAgICAgIENvbnRlbnRFbmNLZXlJRCAoc2l6ZSA9IDgpCi0gICAgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwKLSAgfTsKLSAgaW50IHNpemUgPSBzaXplb2Yoa0NvbnRlbnRFbmNvZGluZ3MpOwotCi0gIGludCByZXN1bHQgPSBwYXJzZXJfLlBhcnNlKGtDb250ZW50RW5jb2RpbmdzLCBzaXplKTsKLSAgQVNTRVJUX0VRKHNpemUsIHJlc3VsdCk7Ci0gIGNvbnN0IENvbnRlbnRFbmNvZGluZ3MmIGNvbnRlbnRfZW5jb2RpbmdzID0gY2xpZW50Xy5jb250ZW50X2VuY29kaW5ncygpOwotCi0gIEFTU0VSVF9FUSgxdSwgY29udGVudF9lbmNvZGluZ3Muc2l6ZSgpKTsKLSAgQVNTRVJUX1RSVUUoY29udGVudF9lbmNvZGluZ3NbMF0pOwotICBFWFBFQ1RfRVEoMCwgY29udGVudF9lbmNvZGluZ3NbMF0tPm9yZGVyKCkpOwotICBFWFBFQ1RfRVEoQ29udGVudEVuY29kaW5nOjprU2NvcGVBbGxGcmFtZUNvbnRlbnRzLAotICAgICAgICAgICAgY29udGVudF9lbmNvZGluZ3NbMF0tPnNjb3BlKCkpOwotICBFWFBFQ1RfRVEoQ29udGVudEVuY29kaW5nOjprVHlwZUVuY3J5cHRpb24sIGNvbnRlbnRfZW5jb2RpbmdzWzBdLT50eXBlKCkpOwotICBFWFBFQ1RfRVEoQ29udGVudEVuY29kaW5nOjprRW5jQWxnb0FlcywKLSAgICAgICAgICAgIGNvbnRlbnRfZW5jb2RpbmdzWzBdLT5lbmNyeXB0aW9uX2FsZ28oKSk7Ci0gIEVYUEVDVF9FUSg4dSwgY29udGVudF9lbmNvZGluZ3NbMF0tPmVuY3J5cHRpb25fa2V5X2lkKCkuc2l6ZSgpKTsKLX0KLQotVEVTVF9GKFdlYk1Db250ZW50RW5jb2RpbmdzQ2xpZW50VGVzdCwgTXVsdGlwbGVDb250ZW50RW5jb2RpbmcpIHsKLSAgY29uc3QgdWludDgga0NvbnRlbnRFbmNvZGluZ3NbXSA9IHsKLSAgICAweDZELCAweDgwLCAweEMyLCAgICAgICAgLy8gQ29udGVudEVuY29kaW5ncyAoc2l6ZSA9IDY2KQotICAgIDB4NjIsIDB4NDAsIDB4OWUsICAgICAgICAvLyAgIENvbnRlbnRFbmNvZGluZyAoc2l6ZSA9IDMwKQotICAgIDB4NTAsIDB4MzEsIDB4ODEsIDB4MDAsICAvLyAgICAgQ29udGVudEVuY29kaW5nT3JkZXIgKHNpemUgPSAxKQotICAgIDB4NTAsIDB4MzIsIDB4ODEsIDB4MDMsICAvLyAgICAgQ29udGVudEVuY29kaW5nU2NvcGUgKHNpemUgPSAxKQotICAgIDB4NTAsIDB4MzMsIDB4ODEsIDB4MDEsICAvLyAgICAgQ29udGVudEVuY29kaW5nVHlwZSAoc2l6ZSA9IDEpCi0gICAgMHg1MCwgMHgzNSwgMHg4RiwgICAgICAgIC8vICAgICBDb250ZW50RW5jcnlwdGlvbiAoc2l6ZSA9IDE1KQotICAgIDB4NDcsIDB4RTEsIDB4ODEsIDB4MDUsICAvLyAgICAgICBDb250ZW50RW5jQWxnbyAoc2l6ZSA9IDEpCi0gICAgMHg0NywgMHhFMiwgMHg4OCwgICAgICAgIC8vICAgICAgIENvbnRlbnRFbmNLZXlJRCAoc2l6ZSA9IDgpCi0gICAgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwKLSAgICAweDYyLCAweDQwLCAweDllLCAgICAgICAgLy8gICBDb250ZW50RW5jb2RpbmcgKHNpemUgPSAzMCkKLSAgICAweDUwLCAweDMxLCAweDgxLCAweDAxLCAgLy8gICAgIENvbnRlbnRFbmNvZGluZ09yZGVyIChzaXplID0gMSkKLSAgICAweDUwLCAweDMyLCAweDgxLCAweDAzLCAgLy8gICAgIENvbnRlbnRFbmNvZGluZ1Njb3BlIChzaXplID0gMSkKLSAgICAweDUwLCAweDMzLCAweDgxLCAweDAxLCAgLy8gICAgIENvbnRlbnRFbmNvZGluZ1R5cGUgKHNpemUgPSAxKQotICAgIDB4NTAsIDB4MzUsIDB4OEYsICAgICAgICAvLyAgICAgQ29udGVudEVuY3J5cHRpb24gKHNpemUgPSAxNSkKLSAgICAweDQ3LCAweEUxLCAweDgxLCAweDAxLCAgLy8gICAgICAgQ29udGVudEVuY0FsZ28gKHNpemUgPSAxKQotICAgIDB4NDcsIDB4RTIsIDB4ODgsICAgICAgICAvLyAgICAgICBDb250ZW50RW5jS2V5SUQgKHNpemUgPSA4KQotICAgIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsCi0gIH07Ci0gIGludCBzaXplID0gc2l6ZW9mKGtDb250ZW50RW5jb2RpbmdzKTsKLQotICBpbnQgcmVzdWx0ID0gcGFyc2VyXy5QYXJzZShrQ29udGVudEVuY29kaW5ncywgc2l6ZSk7Ci0gIEFTU0VSVF9FUShzaXplLCByZXN1bHQpOwotICBjb25zdCBDb250ZW50RW5jb2RpbmdzJiBjb250ZW50X2VuY29kaW5ncyA9IGNsaWVudF8uY29udGVudF9lbmNvZGluZ3MoKTsKLSAgQVNTRVJUX0VRKDJ1LCBjb250ZW50X2VuY29kaW5ncy5zaXplKCkpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7Ci0gICAgQVNTRVJUX1RSVUUoY29udGVudF9lbmNvZGluZ3NbaV0pOwotICAgIEVYUEVDVF9FUShpLCBjb250ZW50X2VuY29kaW5nc1tpXS0+b3JkZXIoKSk7Ci0gICAgRVhQRUNUX0VRKENvbnRlbnRFbmNvZGluZzo6a1Njb3BlQWxsRnJhbWVDb250ZW50cyB8Ci0gICAgICAgICAgICAgIENvbnRlbnRFbmNvZGluZzo6a1Njb3BlVHJhY2tQcml2YXRlRGF0YSwKLSAgICAgICAgICAgICAgY29udGVudF9lbmNvZGluZ3NbaV0tPnNjb3BlKCkpOwotICAgIEVYUEVDVF9FUShDb250ZW50RW5jb2Rpbmc6OmtUeXBlRW5jcnlwdGlvbiwgY29udGVudF9lbmNvZGluZ3NbaV0tPnR5cGUoKSk7Ci0gICAgRVhQRUNUX0VRKCFpID8gQ29udGVudEVuY29kaW5nOjprRW5jQWxnb0FlcyA6IENvbnRlbnRFbmNvZGluZzo6a0VuY0FsZ29EZXMsCi0gICAgICAgICAgICAgIGNvbnRlbnRfZW5jb2RpbmdzW2ldLT5lbmNyeXB0aW9uX2FsZ28oKSk7Ci0gICAgRVhQRUNUX0VRKDh1LCBjb250ZW50X2VuY29kaW5nc1tpXS0+ZW5jcnlwdGlvbl9rZXlfaWQoKS5zaXplKCkpOwotICB9Ci19Ci0KLVRFU1RfRihXZWJNQ29udGVudEVuY29kaW5nc0NsaWVudFRlc3QsIERlZmF1bHRWYWx1ZXMpIHsKLSAgY29uc3QgdWludDgga0NvbnRlbnRFbmNvZGluZ3NbXSA9IHsKLSAgICAweDZELCAweDgwLCAweDhBLCAgICAgICAgLy8gQ29udGVudEVuY29kaW5ncyAoc2l6ZSA9IDEwKQotICAgIDB4NjIsIDB4NDAsIDB4ODcsICAgICAgICAvLyAgIENvbnRlbnRFbmNvZGluZyAoc2l6ZSA9IDcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBDb250ZW50RW5jb2RpbmdPcmRlciBtaXNzaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBDb250ZW50RW5jb2RpbmdTY29wZSBtaXNzaW5nCi0gICAgMHg1MCwgMHgzMywgMHg4MSwgMHgwMSwgIC8vICAgICBDb250ZW50RW5jb2RpbmdUeXBlIChzaXplID0gMSkKLSAgICAweDUwLCAweDM1LCAweDgwLCAgICAgICAgLy8gICAgIENvbnRlbnRFbmNyeXB0aW9uIChzaXplID0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIENvbnRlbnRFbmNBbGdvIG1pc3NpbmcKLSAgfTsKLSAgaW50IHNpemUgPSBzaXplb2Yoa0NvbnRlbnRFbmNvZGluZ3MpOwotCi0gIGludCByZXN1bHQgPSBwYXJzZXJfLlBhcnNlKGtDb250ZW50RW5jb2RpbmdzLCBzaXplKTsKLSAgQVNTRVJUX0VRKHNpemUsIHJlc3VsdCk7Ci0gIGNvbnN0IENvbnRlbnRFbmNvZGluZ3MmIGNvbnRlbnRfZW5jb2RpbmdzID0gY2xpZW50Xy5jb250ZW50X2VuY29kaW5ncygpOwotCi0gIEFTU0VSVF9FUSgxdSwgY29udGVudF9lbmNvZGluZ3Muc2l6ZSgpKTsKLSAgQVNTRVJUX1RSVUUoY29udGVudF9lbmNvZGluZ3NbMF0pOwotICBFWFBFQ1RfRVEoMCwgY29udGVudF9lbmNvZGluZ3NbMF0tPm9yZGVyKCkpOwotICBFWFBFQ1RfRVEoQ29udGVudEVuY29kaW5nOjprU2NvcGVBbGxGcmFtZUNvbnRlbnRzLAotICAgICAgICAgICAgY29udGVudF9lbmNvZGluZ3NbMF0tPnNjb3BlKCkpOwotICBFWFBFQ1RfRVEoQ29udGVudEVuY29kaW5nOjprVHlwZUVuY3J5cHRpb24sIGNvbnRlbnRfZW5jb2RpbmdzWzBdLT50eXBlKCkpOwotICBFWFBFQ1RfRVEoQ29udGVudEVuY29kaW5nOjprRW5jQWxnb05vdEVuY3J5cHRlZCwKLSAgICAgICAgICAgIGNvbnRlbnRfZW5jb2RpbmdzWzBdLT5lbmNyeXB0aW9uX2FsZ28oKSk7Ci0gIEVYUEVDVF9UUlVFKGNvbnRlbnRfZW5jb2RpbmdzWzBdLT5lbmNyeXB0aW9uX2tleV9pZCgpLmVtcHR5KCkpOwotfQotCi1URVNUX0YoV2ViTUNvbnRlbnRFbmNvZGluZ3NDbGllbnRUZXN0LCBDb250ZW50RW5jb2RpbmdzQ2xpZW50UmV1c2UpIHsKLSAgY29uc3QgdWludDgga0NvbnRlbnRFbmNvZGluZ3NbXSA9IHsKLSAgICAweDZELCAweDgwLCAweEExLCAgICAgICAgLy8gQ29udGVudEVuY29kaW5ncyAoc2l6ZSA9IDMzKQotICAgIDB4NjIsIDB4NDAsIDB4OWUsICAgICAgICAvLyAgIENvbnRlbnRFbmNvZGluZyAoc2l6ZSA9IDMwKQotICAgIDB4NTAsIDB4MzEsIDB4ODEsIDB4MDAsICAvLyAgICAgQ29udGVudEVuY29kaW5nT3JkZXIgKHNpemUgPSAxKQotICAgIDB4NTAsIDB4MzIsIDB4ODEsIDB4MDEsICAvLyAgICAgQ29udGVudEVuY29kaW5nU2NvcGUgKHNpemUgPSAxKQotICAgIDB4NTAsIDB4MzMsIDB4ODEsIDB4MDEsICAvLyAgICAgQ29udGVudEVuY29kaW5nVHlwZSAoc2l6ZSA9IDEpCi0gICAgMHg1MCwgMHgzNSwgMHg4RiwgICAgICAgIC8vICAgICBDb250ZW50RW5jcnlwdGlvbiAoc2l6ZSA9IDE1KQotICAgIDB4NDcsIDB4RTEsIDB4ODEsIDB4MDUsICAvLyAgICAgICBDb250ZW50RW5jQWxnbyAoc2l6ZSA9IDEpCi0gICAgMHg0NywgMHhFMiwgMHg4OCwgICAgICAgIC8vICAgICAgIENvbnRlbnRFbmNLZXlJRCAoc2l6ZSA9IDgpCi0gICAgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwgMHhBQSwKLSAgfTsKLSAgaW50IHNpemUgPSBzaXplb2Yoa0NvbnRlbnRFbmNvZGluZ3MpOwotCi0gIC8vIFBhcnNlIGZvciB0aGUgZmlyc3QgdGltZS4KLSAgaW50IHJlc3VsdCA9IHBhcnNlcl8uUGFyc2Uoa0NvbnRlbnRFbmNvZGluZ3MsIHNpemUpOwotICBBU1NFUlRfRVEoc2l6ZSwgcmVzdWx0KTsKLQotICAvLyBQYXJzZSBhZ2Fpbi4KLSAgcGFyc2VyXy5SZXNldCgpOwotICByZXN1bHQgPSBwYXJzZXJfLlBhcnNlKGtDb250ZW50RW5jb2RpbmdzLCBzaXplKTsKLSAgQVNTRVJUX0VRKHNpemUsIHJlc3VsdCk7Ci0gIGNvbnN0IENvbnRlbnRFbmNvZGluZ3MmIGNvbnRlbnRfZW5jb2RpbmdzID0gY2xpZW50Xy5jb250ZW50X2VuY29kaW5ncygpOwotCi0gIEFTU0VSVF9FUSgxdSwgY29udGVudF9lbmNvZGluZ3Muc2l6ZSgpKTsKLSAgQVNTRVJUX1RSVUUoY29udGVudF9lbmNvZGluZ3NbMF0pOwotICBFWFBFQ1RfRVEoMCwgY29udGVudF9lbmNvZGluZ3NbMF0tPm9yZGVyKCkpOwotICBFWFBFQ1RfRVEoQ29udGVudEVuY29kaW5nOjprU2NvcGVBbGxGcmFtZUNvbnRlbnRzLAotICAgICAgICAgICAgY29udGVudF9lbmNvZGluZ3NbMF0tPnNjb3BlKCkpOwotICBFWFBFQ1RfRVEoQ29udGVudEVuY29kaW5nOjprVHlwZUVuY3J5cHRpb24sIGNvbnRlbnRfZW5jb2RpbmdzWzBdLT50eXBlKCkpOwotICBFWFBFQ1RfRVEoQ29udGVudEVuY29kaW5nOjprRW5jQWxnb0FlcywKLSAgICAgICAgICAgIGNvbnRlbnRfZW5jb2RpbmdzWzBdLT5lbmNyeXB0aW9uX2FsZ28oKSk7Ci0gIEVYUEVDVF9FUSg4dSwgY29udGVudF9lbmNvZGluZ3NbMF0tPmVuY3J5cHRpb25fa2V5X2lkKCkuc2l6ZSgpKTsKLX0KLQotVEVTVF9GKFdlYk1Db250ZW50RW5jb2RpbmdzQ2xpZW50VGVzdCwgSW52YWxpZENvbnRlbnRFbmNvZGluZ09yZGVyKSB7Ci0gIGNvbnN0IHVpbnQ4IGtDb250ZW50RW5jb2RpbmdzW10gPSB7Ci0gICAgMHg2RCwgMHg4MCwgMHg4RSwgICAgICAgIC8vIENvbnRlbnRFbmNvZGluZ3MgKHNpemUgPSAxNCkKLSAgICAweDYyLCAweDQwLCAweDhCLCAgICAgICAgLy8gICBDb250ZW50RW5jb2RpbmcgKHNpemUgPSAxMSkKLSAgICAweDUwLCAweDMxLCAweDgxLCAweEVFLCAgLy8gICAgIENvbnRlbnRFbmNvZGluZ09yZGVyIChzaXplID0gMSksIGludmFsaWQKLSAgICAweDUwLCAweDMzLCAweDgxLCAweDAxLCAgLy8gICAgIENvbnRlbnRFbmNvZGluZ1R5cGUgKHNpemUgPSAxKQotICAgIDB4NTAsIDB4MzUsIDB4ODAsICAgICAgICAvLyAgICAgQ29udGVudEVuY3J5cHRpb24gKHNpemUgPSAwKQotICB9OwotICBpbnQgc2l6ZSA9IHNpemVvZihrQ29udGVudEVuY29kaW5ncyk7Ci0gIFBhcnNlQW5kRXhwZWN0VG9GYWlsKGtDb250ZW50RW5jb2RpbmdzLCBzaXplKTsKLX0KLQotVEVTVF9GKFdlYk1Db250ZW50RW5jb2RpbmdzQ2xpZW50VGVzdCwgSW52YWxpZENvbnRlbnRFbmNvZGluZ1Njb3BlKSB7Ci0gIGNvbnN0IHVpbnQ4IGtDb250ZW50RW5jb2RpbmdzW10gPSB7Ci0gICAgMHg2RCwgMHg4MCwgMHg4RSwgICAgICAgIC8vIENvbnRlbnRFbmNvZGluZ3MgKHNpemUgPSAxNCkKLSAgICAweDYyLCAweDQwLCAweDhCLCAgICAgICAgLy8gICBDb250ZW50RW5jb2RpbmcgKHNpemUgPSAxMSkKLSAgICAweDUwLCAweDMyLCAweDgxLCAweEVFLCAgLy8gICAgIENvbnRlbnRFbmNvZGluZ1Njb3BlIChzaXplID0gMSksIGludmFsaWQKLSAgICAweDUwLCAweDMzLCAweDgxLCAweDAxLCAgLy8gICAgIENvbnRlbnRFbmNvZGluZ1R5cGUgKHNpemUgPSAxKQotICAgIDB4NTAsIDB4MzUsIDB4ODAsICAgICAgICAvLyAgICAgQ29udGVudEVuY3J5cHRpb24gKHNpemUgPSAwKQotICB9OwotICBpbnQgc2l6ZSA9IHNpemVvZihrQ29udGVudEVuY29kaW5ncyk7Ci0gIFBhcnNlQW5kRXhwZWN0VG9GYWlsKGtDb250ZW50RW5jb2RpbmdzLCBzaXplKTsKLX0KLQotVEVTVF9GKFdlYk1Db250ZW50RW5jb2RpbmdzQ2xpZW50VGVzdCwgSW52YWxpZENvbnRlbnRFbmNvZGluZ1R5cGUpIHsKLSAgY29uc3QgdWludDgga0NvbnRlbnRFbmNvZGluZ3NbXSA9IHsKLSAgICAweDZELCAweDgwLCAweDhFLCAgICAgICAgLy8gQ29udGVudEVuY29kaW5ncyAoc2l6ZSA9IDE0KQotICAgIDB4NjIsIDB4NDAsIDB4OEIsICAgICAgICAvLyAgIENvbnRlbnRFbmNvZGluZyAoc2l6ZSA9IDExKQotICAgIDB4NTAsIDB4MzMsIDB4ODEsIDB4MDAsICAvLyAgICAgQ29udGVudEVuY29kaW5nVHlwZSAoc2l6ZSA9IDEpLCBpbnZhbGlkCi0gICAgMHg1MCwgMHgzNSwgMHg4MCwgICAgICAgIC8vICAgICBDb250ZW50RW5jcnlwdGlvbiAoc2l6ZSA9IDApCi0gIH07Ci0gIGludCBzaXplID0gc2l6ZW9mKGtDb250ZW50RW5jb2RpbmdzKTsKLSAgUGFyc2VBbmRFeHBlY3RUb0ZhaWwoa0NvbnRlbnRFbmNvZGluZ3MsIHNpemUpOwotfQotCi0vLyBDb250ZW50RW5jb2RpbmdUeXBlIGlzIGVuY3J5cHRpb24gYnV0IG5vIENvbnRlbnRFbmNyeXB0aW9uIHByZXNlbnQuCi1URVNUX0YoV2ViTUNvbnRlbnRFbmNvZGluZ3NDbGllbnRUZXN0LCBNaXNzaW5nQ29udGVudEVuY3J5cHRpb24pIHsKLSAgY29uc3QgdWludDgga0NvbnRlbnRFbmNvZGluZ3NbXSA9IHsKLSAgICAweDZELCAweDgwLCAweDg3LCAgICAgICAgLy8gQ29udGVudEVuY29kaW5ncyAoc2l6ZSA9IDcpCi0gICAgMHg2MiwgMHg0MCwgMHg4NCwgICAgICAgIC8vICAgQ29udGVudEVuY29kaW5nIChzaXplID0gNCkKLSAgICAweDUwLCAweDMzLCAweDgxLCAweDAxLCAgLy8gICAgIENvbnRlbnRFbmNvZGluZ1R5cGUgKHNpemUgPSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgQ29udGVudEVuY3J5cHRpb24gbWlzc2luZwotICB9OwotICBpbnQgc2l6ZSA9IHNpemVvZihrQ29udGVudEVuY29kaW5ncyk7Ci0gIFBhcnNlQW5kRXhwZWN0VG9GYWlsKGtDb250ZW50RW5jb2RpbmdzLCBzaXplKTsKLX0KLQotVEVTVF9GKFdlYk1Db250ZW50RW5jb2RpbmdzQ2xpZW50VGVzdCwgSW52YWxpZENvbnRlbnRFbmNBbGdvKSB7Ci0gIGNvbnN0IHVpbnQ4IGtDb250ZW50RW5jb2RpbmdzW10gPSB7Ci0gICAgMHg2RCwgMHg4MCwgMHg5OSwgICAgICAgIC8vIENvbnRlbnRFbmNvZGluZ3MgKHNpemUgPSAyNSkKLSAgICAweDYyLCAweDQwLCAweDk2LCAgICAgICAgLy8gICBDb250ZW50RW5jb2RpbmcgKHNpemUgPSAyMikKLSAgICAweDUwLCAweDMzLCAweDgxLCAweDAxLCAgLy8gICAgIENvbnRlbnRFbmNvZGluZ1R5cGUgKHNpemUgPSAxKQotICAgIDB4NTAsIDB4MzUsIDB4OEYsICAgICAgICAvLyAgICAgQ29udGVudEVuY3J5cHRpb24gKHNpemUgPSAxNSkKLSAgICAweDQ3LCAweEUxLCAweDgxLCAweEVFLCAgLy8gICAgICAgQ29udGVudEVuY0FsZ28gKHNpemUgPSAxKSwgaW52YWxpZAotICAgIDB4NDcsIDB4RTIsIDB4ODgsICAgICAgICAvLyAgICAgICBDb250ZW50RW5jS2V5SUQgKHNpemUgPSA4KQotICAgIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsCi0gIH07Ci0gIGludCBzaXplID0gc2l6ZW9mKGtDb250ZW50RW5jb2RpbmdzKTsKLSAgUGFyc2VBbmRFeHBlY3RUb0ZhaWwoa0NvbnRlbnRFbmNvZGluZ3MsIHNpemUpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS93ZWJtL3dlYm1faW5mb19wYXJzZXIuY2MgYi9zcmMvbWVkaWEvd2VibS93ZWJtX2luZm9fcGFyc2VyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGYxNjkwLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS93ZWJtL3dlYm1faW5mb19wYXJzZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvd2VibS93ZWJtX2luZm9fcGFyc2VyLmgiCi0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJtZWRpYS93ZWJtL3dlYm1fY29uc3RhbnRzLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIERlZmF1bHQgdGltZWNvZGUgc2NhbGUgaWYgdGhlIFRpbWVjb2RlU2NhbGUgZWxlbWVudCBpcwotLy8gbm90IHNwZWNpZmllZCBpbiB0aGUgSU5GTyBlbGVtZW50Lgotc3RhdGljIGNvbnN0IGludCBrV2ViTURlZmF1bHRUaW1lY29kZVNjYWxlID0gMTAwMDAwMDsKLQotV2ViTUluZm9QYXJzZXI6OldlYk1JbmZvUGFyc2VyKCkKLSAgICA6IHRpbWVjb2RlX3NjYWxlXygtMSksCi0gICAgICBkdXJhdGlvbl8oLTEpIHsKLX0KLQotV2ViTUluZm9QYXJzZXI6On5XZWJNSW5mb1BhcnNlcigpIHt9Ci0KLWludCBXZWJNSW5mb1BhcnNlcjo6UGFyc2UoY29uc3QgdWludDgqIGJ1ZiwgaW50IHNpemUpIHsKLSAgdGltZWNvZGVfc2NhbGVfID0gLTE7Ci0gIGR1cmF0aW9uXyA9IC0xOwotCi0gIFdlYk1MaXN0UGFyc2VyIHBhcnNlcihrV2ViTUlkSW5mbywgdGhpcyk7Ci0gIGludCByZXN1bHQgPSBwYXJzZXIuUGFyc2UoYnVmLCBzaXplKTsKLQotICBpZiAocmVzdWx0IDw9IDApCi0gICAgcmV0dXJuIHJlc3VsdDsKLQotICAvLyBGb3Igbm93IHdlIGRvIGFsbCBvciBub3RoaW5nIHBhcnNpbmcuCi0gIHJldHVybiBwYXJzZXIuSXNQYXJzaW5nQ29tcGxldGUoKSA/IHJlc3VsdCA6IDA7Ci19Ci0KLVdlYk1QYXJzZXJDbGllbnQqIFdlYk1JbmZvUGFyc2VyOjpPbkxpc3RTdGFydChpbnQgaWQpIHsgcmV0dXJuIHRoaXM7IH0KLQotYm9vbCBXZWJNSW5mb1BhcnNlcjo6T25MaXN0RW5kKGludCBpZCkgewotICBpZiAoaWQgPT0ga1dlYk1JZEluZm8gJiYgdGltZWNvZGVfc2NhbGVfID09IC0xKSB7Ci0gICAgLy8gU2V0IHRpbWVjb2RlIHNjYWxlIHRvIGRlZmF1bHQgdmFsdWUgaWYgaXQgaXNuJ3QgcHJlc2VudCBpbgotICAgIC8vIHRoZSBJbmZvIGVsZW1lbnQuCi0gICAgdGltZWNvZGVfc2NhbGVfID0ga1dlYk1EZWZhdWx0VGltZWNvZGVTY2FsZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBXZWJNSW5mb1BhcnNlcjo6T25VSW50KGludCBpZCwgaW50NjQgdmFsKSB7Ci0gIGlmIChpZCAhPSBrV2ViTUlkVGltZWNvZGVTY2FsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAodGltZWNvZGVfc2NhbGVfICE9IC0xKSB7Ci0gICAgRFZMT0coMSkgPDwgIk11bHRpcGxlIHZhbHVlcyBmb3IgaWQgIiA8PCBzdGQ6OmhleCA8PCBpZCA8PCAiIHNwZWNpZmllZCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdGltZWNvZGVfc2NhbGVfID0gdmFsOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBXZWJNSW5mb1BhcnNlcjo6T25GbG9hdChpbnQgaWQsIGRvdWJsZSB2YWwpIHsKLSAgaWYgKGlkICE9IGtXZWJNSWREdXJhdGlvbikgewotICAgIERWTE9HKDEpIDw8ICJVbmV4cGVjdGVkIGZsb2F0IGZvciBpZCIgPDwgc3RkOjpoZXggPDwgaWQ7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGR1cmF0aW9uXyAhPSAtMSkgewotICAgIERWTE9HKDEpIDw8ICJNdWx0aXBsZSB2YWx1ZXMgZm9yIGR1cmF0aW9uLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZHVyYXRpb25fID0gdmFsOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBXZWJNSW5mb1BhcnNlcjo6T25CaW5hcnkoaW50IGlkLCBjb25zdCB1aW50OCogZGF0YSwgaW50IHNpemUpIHsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgV2ViTUluZm9QYXJzZXI6Ok9uU3RyaW5nKGludCBpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvd2VibS93ZWJtX2luZm9fcGFyc2VyLmggYi9zcmMvbWVkaWEvd2VibS93ZWJtX2luZm9fcGFyc2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNWRlNDMuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3dlYm0vd2VibV9pbmZvX3BhcnNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9XRUJNX1dFQk1fSU5GT19QQVJTRVJfSF8KLSNkZWZpbmUgTUVESUFfV0VCTV9XRUJNX0lORk9fUEFSU0VSX0hfCi0KLSNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCIKLSNpbmNsdWRlICJtZWRpYS93ZWJtL3dlYm1fcGFyc2VyLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIFBhcnNlciBmb3IgV2ViTSBJbmZvIGVsZW1lbnQuCi1jbGFzcyBNRURJQV9FWFBPUlQgV2ViTUluZm9QYXJzZXIgOiBwdWJsaWMgV2ViTVBhcnNlckNsaWVudCB7Ci0gcHVibGljOgotICBXZWJNSW5mb1BhcnNlcigpOwotICB2aXJ0dWFsIH5XZWJNSW5mb1BhcnNlcigpOwotCi0gIC8vIFBhcnNlcyBhIFdlYk0gSW5mbyBlbGVtZW50IGluIHxidWZ8LgotICAvLwotICAvLyBSZXR1cm5zIC0xIGlmIHRoZSBwYXJzZSBmYWlscy4KLSAgLy8gUmV0dXJucyAwIGlmIG1vcmUgZGF0YSBpcyBuZWVkZWQuCi0gIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBwYXJzZWQgb24gc3VjY2Vzcy4KLSAgaW50IFBhcnNlKGNvbnN0IHVpbnQ4KiBidWYsIGludCBzaXplKTsKLQotICBpbnQ2NCB0aW1lY29kZV9zY2FsZSgpIGNvbnN0IHsgcmV0dXJuIHRpbWVjb2RlX3NjYWxlXzsgfQotICBkb3VibGUgZHVyYXRpb24oKSBjb25zdCB7IHJldHVybiBkdXJhdGlvbl87IH0KLQotIHByaXZhdGU6Ci0gIC8vIFdlYk1QYXJzZXJDbGllbnQgbWV0aG9kcwotICB2aXJ0dWFsIFdlYk1QYXJzZXJDbGllbnQqIE9uTGlzdFN0YXJ0KGludCBpZCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgYm9vbCBPbkxpc3RFbmQoaW50IGlkKSBPVkVSUklERTsKLSAgdmlydHVhbCBib29sIE9uVUludChpbnQgaWQsIGludDY0IHZhbCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgYm9vbCBPbkZsb2F0KGludCBpZCwgZG91YmxlIHZhbCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgYm9vbCBPbkJpbmFyeShpbnQgaWQsIGNvbnN0IHVpbnQ4KiBkYXRhLCBpbnQgc2l6ZSkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgYm9vbCBPblN0cmluZyhpbnQgaWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIE9WRVJSSURFOwotCi0gIGludDY0IHRpbWVjb2RlX3NjYWxlXzsKLSAgZG91YmxlIGR1cmF0aW9uXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oV2ViTUluZm9QYXJzZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfV0VCTV9XRUJNX0lORk9fUEFSU0VSX0hfCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvd2VibS93ZWJtX3BhcnNlci5jYyBiL3NyYy9tZWRpYS93ZWJtL3dlYm1fcGFyc2VyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGM3NmM2Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS93ZWJtL3dlYm1fcGFyc2VyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTc2ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJtZWRpYS93ZWJtL3dlYm1fcGFyc2VyLmgiCi0KLS8vIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIHRvIHBhcnNlIFdlYk0gZmlsZSBlbGVtZW50cy4gSXQgd2FzIGNyZWF0ZWQKLS8vIGZyb20gaW5mb3JtYXRpb24gaW4gdGhlIE1hdHJvc2thIHNwZWMuCi0vLyBodHRwOi8vd3d3Lm1hdHJvc2thLm9yZy90ZWNobmljYWwvc3BlY3MvaW5kZXguaHRtbAotLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgZm9yIGVuY3J5cHRlZCBXZWJNLiBDdXJyZW50IFdlYk0KLS8vIGVuY3J5cHRlZCByZXF1ZXN0IGZvciBjb21tZW50cyBzcGVjaWZpY2F0aW9uIGlzIGhlcmUKLS8vIGh0dHA6Ly93aWtpLndlYm1wcm9qZWN0Lm9yZy9lbmNyeXB0aW9uL3dlYm0tZW5jcnlwdGlvbi1yZmMKLQotI2luY2x1ZGUgPGlvbWFuaXA+Ci0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJtZWRpYS93ZWJtL3dlYm1fY29uc3RhbnRzLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWVudW0gRWxlbWVudFR5cGUgewotICBVTktOT1dOLAotICBMSVNULCAgLy8gUmVmZXJyZWQgdG8gYXMgTWFzdGVyIEVsZW1lbnQgaW4gdGhlIE1hdHJvc2thIHNwZWMuCi0gIFVJTlQsCi0gIEZMT0FULAotICBCSU5BUlksCi0gIFNUUklORywKLSAgU0tJUCwKLX07Ci0KLXN0cnVjdCBFbGVtZW50SWRJbmZvIHsKLSAgRWxlbWVudFR5cGUgdHlwZV87Ci0gIGludCBpZF87Ci19OwotCi1zdHJ1Y3QgTGlzdEVsZW1lbnRJbmZvIHsKLSAgaW50IGlkXzsKLSAgaW50IGxldmVsXzsKLSAgY29uc3QgRWxlbWVudElkSW5mbyogaWRfaW5mb187Ci0gIGludCBpZF9pbmZvX2NvdW50XzsKLX07Ci0KLS8vIFRoZSBmb2xsb3dpbmcgYXJlIHRhYmxlcyBpbmRpY2F0aW5nIHdoYXQgSURzIGFyZSB2YWxpZCBzdWItZWxlbWVudHMKLS8vIG9mIHBhcnRpY3VsYXIgZWxlbWVudHMuIElmIGFuIGVsZW1lbnQgaXMgZW5jb3VudGVyZWQgdGhhdCBkb2Vzbid0Ci0vLyBhcHBlYXIgaW4gdGhlIGxpc3QsIGEgcGFyc2luZyBlcnJvciBpcyBzaWduYWxsZWQuIFNvbWUgZWxlbWVudHMgYXJlCi0vLyBtYXJrZWQgYXMgU0tJUCBiZWNhdXNlIHRoZXkgYXJlIHZhbGlkLCBidXQgd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGVtCi0vLyByaWdodCBub3cuCi1zdGF0aWMgY29uc3QgRWxlbWVudElkSW5mbyBrRUJNTEhlYWRlcklkc1tdID0gewotICB7VUlOVCwga1dlYk1JZEVCTUxWZXJzaW9ufSwKLSAge1VJTlQsIGtXZWJNSWRFQk1MUmVhZFZlcnNpb259LAotICB7VUlOVCwga1dlYk1JZEVCTUxNYXhJRExlbmd0aH0sCi0gIHtVSU5ULCBrV2ViTUlkRUJNTE1heFNpemVMZW5ndGh9LAotICB7U1RSSU5HLCBrV2ViTUlkRG9jVHlwZX0sCi0gIHtVSU5ULCBrV2ViTUlkRG9jVHlwZVZlcnNpb259LAotICB7VUlOVCwga1dlYk1JZERvY1R5cGVSZWFkVmVyc2lvbn0sCi19OwotCi1zdGF0aWMgY29uc3QgRWxlbWVudElkSW5mbyBrU2VnbWVudElkc1tdID0gewotICB7TElTVCwga1dlYk1JZFNlZWtIZWFkfSwKLSAge0xJU1QsIGtXZWJNSWRJbmZvfSwKLSAge0xJU1QsIGtXZWJNSWRDbHVzdGVyfSwKLSAge0xJU1QsIGtXZWJNSWRUcmFja3N9LAotICB7TElTVCwga1dlYk1JZEN1ZXN9LAotICB7TElTVCwga1dlYk1JZEF0dGFjaG1lbnRzfSwKLSAge0xJU1QsIGtXZWJNSWRDaGFwdGVyc30sCi0gIHtMSVNULCBrV2ViTUlkVGFnc30sCi19OwotCi1zdGF0aWMgY29uc3QgRWxlbWVudElkSW5mbyBrU2Vla0hlYWRJZHNbXSA9IHsKLSAge0xJU1QsIGtXZWJNSWRTZWVrfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBFbGVtZW50SWRJbmZvIGtTZWVrSWRzW10gPSB7Ci0gIHtCSU5BUlksIGtXZWJNSWRTZWVrSUR9LAotICB7VUlOVCwga1dlYk1JZFNlZWtQb3NpdGlvbn0sCi19OwotCi1zdGF0aWMgY29uc3QgRWxlbWVudElkSW5mbyBrSW5mb0lkc1tdID0gewotICB7QklOQVJZLCBrV2ViTUlkU2VnbWVudFVJRH0sCi0gIHtTVFJJTkcsIGtXZWJNSWRTZWdtZW50RmlsZW5hbWV9LAotICB7QklOQVJZLCBrV2ViTUlkUHJldlVJRH0sCi0gIHtTVFJJTkcsIGtXZWJNSWRQcmV2RmlsZW5hbWV9LAotICB7QklOQVJZLCBrV2ViTUlkTmV4dFVJRH0sCi0gIHtTVFJJTkcsIGtXZWJNSWROZXh0RmlsZW5hbWV9LAotICB7QklOQVJZLCBrV2ViTUlkU2VnbWVudEZhbWlseX0sCi0gIHtMSVNULCBrV2ViTUlkQ2hhcHRlclRyYW5zbGF0ZX0sCi0gIHtVSU5ULCBrV2ViTUlkVGltZWNvZGVTY2FsZX0sCi0gIHtGTE9BVCwga1dlYk1JZER1cmF0aW9ufSwKLSAge0JJTkFSWSwga1dlYk1JZERhdGVVVEN9LAotICB7U1RSSU5HLCBrV2ViTUlkVGl0bGV9LAotICB7U1RSSU5HLCBrV2ViTUlkTXV4aW5nQXBwfSwKLSAge1NUUklORywga1dlYk1JZFdyaXRpbmdBcHB9LAotfTsKLQotc3RhdGljIGNvbnN0IEVsZW1lbnRJZEluZm8ga0NoYXB0ZXJUcmFuc2xhdGVJZHNbXSA9IHsKLSAge1VJTlQsIGtXZWJNSWRDaGFwdGVyVHJhbnNsYXRlRWRpdGlvblVJRH0sCi0gIHtVSU5ULCBrV2ViTUlkQ2hhcHRlclRyYW5zbGF0ZUNvZGVjfSwKLSAge0JJTkFSWSwga1dlYk1JZENoYXB0ZXJUcmFuc2xhdGVJRH0sCi19OwotCi1zdGF0aWMgY29uc3QgRWxlbWVudElkSW5mbyBrQ2x1c3Rlcklkc1tdID0gewotICB7QklOQVJZLCBrV2ViTUlkU2ltcGxlQmxvY2t9LAotICB7VUlOVCwga1dlYk1JZFRpbWVjb2RlfSwKLSAge0xJU1QsIGtXZWJNSWRTaWxlbnRUcmFja3N9LAotICB7VUlOVCwga1dlYk1JZFBvc2l0aW9ufSwKLSAge1VJTlQsIGtXZWJNSWRQcmV2U2l6ZX0sCi0gIHtMSVNULCBrV2ViTUlkQmxvY2tHcm91cH0sCi19OwotCi1zdGF0aWMgY29uc3QgRWxlbWVudElkSW5mbyBrU2lsZW50VHJhY2tzSWRzW10gPSB7Ci0gIHtVSU5ULCBrV2ViTUlkU2lsZW50VHJhY2tOdW1iZXJ9LAotfTsKLQotc3RhdGljIGNvbnN0IEVsZW1lbnRJZEluZm8ga0Jsb2NrR3JvdXBJZHNbXSA9IHsKLSAge0JJTkFSWSwga1dlYk1JZEJsb2NrfSwKLSAge0xJU1QsIGtXZWJNSWRCbG9ja0FkZGl0aW9uc30sCi0gIHtVSU5ULCBrV2ViTUlkQmxvY2tEdXJhdGlvbn0sCi0gIHtVSU5ULCBrV2ViTUlkUmVmZXJlbmNlUHJpb3JpdHl9LAotICB7QklOQVJZLCBrV2ViTUlkUmVmZXJlbmNlQmxvY2t9LAotICB7QklOQVJZLCBrV2ViTUlkQ29kZWNTdGF0ZX0sCi0gIHtMSVNULCBrV2ViTUlkU2xpY2VzfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBFbGVtZW50SWRJbmZvIGtCbG9ja0FkZGl0aW9uc0lkc1tdID0gewotICB7TElTVCwga1dlYk1JZEJsb2NrTW9yZX0sCi19OwotCi1zdGF0aWMgY29uc3QgRWxlbWVudElkSW5mbyBrQmxvY2tNb3JlSWRzW10gPSB7Ci0gIHtVSU5ULCBrV2ViTUlkQmxvY2tBZGRJRH0sCi0gIHtCSU5BUlksIGtXZWJNSWRCbG9ja0FkZGl0aW9uYWx9LAotfTsKLQotc3RhdGljIGNvbnN0IEVsZW1lbnRJZEluZm8ga1NsaWNlc0lkc1tdID0gewotICB7TElTVCwga1dlYk1JZFRpbWVTbGljZX0sCi19OwotCi1zdGF0aWMgY29uc3QgRWxlbWVudElkSW5mbyBrVGltZVNsaWNlSWRzW10gPSB7Ci0gIHtVSU5ULCBrV2ViTUlkTGFjZU51bWJlcn0sCi19OwotCi1zdGF0aWMgY29uc3QgRWxlbWVudElkSW5mbyBrVHJhY2tzSWRzW10gPSB7Ci0gIHtMSVNULCBrV2ViTUlkVHJhY2tFbnRyeX0sCi19OwotCi1zdGF0aWMgY29uc3QgRWxlbWVudElkSW5mbyBrVHJhY2tFbnRyeUlkc1tdID0gewotICB7VUlOVCwga1dlYk1JZFRyYWNrTnVtYmVyfSwKLSAge1VJTlQsIGtXZWJNSWRUcmFja1VJRH0sCi0gIHtVSU5ULCBrV2ViTUlkVHJhY2tUeXBlfSwKLSAge1VJTlQsIGtXZWJNSWRGbGFnRW5hYmxlZH0sCi0gIHtVSU5ULCBrV2ViTUlkRmxhZ0RlZmF1bHR9LAotICB7VUlOVCwga1dlYk1JZEZsYWdGb3JjZWR9LAotICB7VUlOVCwga1dlYk1JZEZsYWdMYWNpbmd9LAotICB7VUlOVCwga1dlYk1JZE1pbkNhY2hlfSwKLSAge1VJTlQsIGtXZWJNSWRNYXhDYWNoZX0sCi0gIHtVSU5ULCBrV2ViTUlkRGVmYXVsdER1cmF0aW9ufSwKLSAge0ZMT0FULCBrV2ViTUlkVHJhY2tUaW1lY29kZVNjYWxlfSwKLSAge1VJTlQsIGtXZWJNSWRNYXhCbG9ja0FkZGl0aW9uSWR9LAotICB7U1RSSU5HLCBrV2ViTUlkTmFtZX0sCi0gIHtTVFJJTkcsIGtXZWJNSWRMYW5ndWFnZX0sCi0gIHtTVFJJTkcsIGtXZWJNSWRDb2RlY0lEfSwKLSAge0JJTkFSWSwga1dlYk1JZENvZGVjUHJpdmF0ZX0sCi0gIHtTVFJJTkcsIGtXZWJNSWRDb2RlY05hbWV9LAotICB7VUlOVCwga1dlYk1JZEF0dGFjaG1lbnRMaW5rfSwKLSAge1VJTlQsIGtXZWJNSWRDb2RlY0RlY29kZUFsbH0sCi0gIHtVSU5ULCBrV2ViTUlkVHJhY2tPdmVybGF5fSwKLSAge0xJU1QsIGtXZWJNSWRUcmFja1RyYW5zbGF0ZX0sCi0gIHtMSVNULCBrV2ViTUlkVmlkZW99LAotICB7TElTVCwga1dlYk1JZEF1ZGlvfSwKLSAge0xJU1QsIGtXZWJNSWRUcmFja09wZXJhdGlvbn0sCi0gIHtMSVNULCBrV2ViTUlkQ29udGVudEVuY29kaW5nc30sCi19OwotCi1zdGF0aWMgY29uc3QgRWxlbWVudElkSW5mbyBrVHJhY2tUcmFuc2xhdGVJZHNbXSA9IHsKLSAge1VJTlQsIGtXZWJNSWRUcmFja1RyYW5zbGF0ZUVkaXRpb25VSUR9LAotICB7VUlOVCwga1dlYk1JZFRyYWNrVHJhbnNsYXRlQ29kZWN9LAotICB7QklOQVJZLCBrV2ViTUlkVHJhY2tUcmFuc2xhdGVUcmFja0lEfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBFbGVtZW50SWRJbmZvIGtWaWRlb0lkc1tdID0gewotICAgIHtVSU5ULCBrV2ViTUlkRmxhZ0ludGVybGFjZWR9LCAge1VJTlQsIGtXZWJNSWRTdGVyZW9Nb2RlfSwKLSAgICB7TElTVCwga1dlYk1JZFByb2plY3Rpb259LCAgICAgIHtVSU5ULCBrV2ViTUlkUGl4ZWxXaWR0aH0sCi0gICAge1VJTlQsIGtXZWJNSWRQaXhlbEhlaWdodH0sICAgICB7VUlOVCwga1dlYk1JZFBpeGVsQ3JvcEJvdHRvbX0sCi0gICAge1VJTlQsIGtXZWJNSWRQaXhlbENyb3BUb3B9LCAgICB7VUlOVCwga1dlYk1JZFBpeGVsQ3JvcExlZnR9LAotICAgIHtVSU5ULCBrV2ViTUlkUGl4ZWxDcm9wUmlnaHR9LCAge1VJTlQsIGtXZWJNSWREaXNwbGF5V2lkdGh9LAotICAgIHtVSU5ULCBrV2ViTUlkRGlzcGxheUhlaWdodH0sICAge1VJTlQsIGtXZWJNSWREaXNwbGF5VW5pdH0sCi0gICAge1VJTlQsIGtXZWJNSWRBc3BlY3RSYXRpb1R5cGV9LCB7QklOQVJZLCBrV2ViTUlkQ29sb3JTcGFjZX0sCi0gICAge0xJU1QsIGtXZWJNSWRDb2xvdXJ9LAotfTsKLQotc3RhdGljIGNvbnN0IEVsZW1lbnRJZEluZm8ga0NvbG91cklkc1tdID0gewotICAgIHtVSU5ULCBrV2ViTUlkTWF0cml4Q29lZmZpY2llbnRzfSwKLSAgICB7VUlOVCwga1dlYk1JZEJpdHNQZXJDaGFubmVsfSwKLSAgICB7VUlOVCwga1dlYk1JZENocm9tYVN1YnNhbXBsaW5nSG9yen0sCi0gICAge1VJTlQsIGtXZWJNSWRDaHJvbWFTdWJzYW1wbGluZ1ZlcnR9LAotICAgIHtVSU5ULCBrV2ViTUlkQ2JTdWJzYW1wbGluZ0hvcnp9LAotICAgIHtVSU5ULCBrV2ViTUlkQ2JTdWJzYW1wbGluZ1ZlcnR9LAotICAgIHtVSU5ULCBrV2ViTUlkQ2hyb21hU2l0aW5nSG9yen0sCi0gICAge1VJTlQsIGtXZWJNSWRDaHJvbWFTaXRpbmdWZXJ0fSwKLSAgICB7VUlOVCwga1dlYk1JZFJhbmdlfSwKLSAgICB7VUlOVCwga1dlYk1JZFRyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzfSwKLSAgICB7VUlOVCwga1dlYk1JZFByaW1hcmllc30sCi0gICAge1VJTlQsIGtXZWJNSWRNYXhDTEx9LAotICAgIHtVSU5ULCBrV2ViTUlkTWF4RkFMTH0sCi0gICAge0xJU1QsIGtXZWJNSWRNYXN0ZXJpbmdNZXRhZGF0YX0sCi19OwotCi1zdGF0aWMgY29uc3QgRWxlbWVudElkSW5mbyBrTWFzdGVyaW5nTWV0YWRhdGFJZHNbXSA9IHsKLSAgICB7RkxPQVQsIGtXZWJNSWRQcmltYXJ5UkNocm9tYXRpY2l0eVh9LAotICAgIHtGTE9BVCwga1dlYk1JZFByaW1hcnlSQ2hyb21hdGljaXR5WX0sCi0gICAge0ZMT0FULCBrV2ViTUlkUHJpbWFyeUdDaHJvbWF0aWNpdHlYfSwKLSAgICB7RkxPQVQsIGtXZWJNSWRQcmltYXJ5R0Nocm9tYXRpY2l0eVl9LAotICAgIHtGTE9BVCwga1dlYk1JZFByaW1hcnlCQ2hyb21hdGljaXR5WH0sCi0gICAge0ZMT0FULCBrV2ViTUlkUHJpbWFyeUJDaHJvbWF0aWNpdHlZfSwKLSAgICB7RkxPQVQsIGtXZWJNSWRXaGl0ZVBvaW50Q2hyb21hdGljaXR5WH0sCi0gICAge0ZMT0FULCBrV2ViTUlkV2hpdGVQb2ludENocm9tYXRpY2l0eVl9LAotICAgIHtGTE9BVCwga1dlYk1JZEx1bWluYW5jZU1heH0sCi0gICAge0ZMT0FULCBrV2ViTUlkTHVtaW5hbmNlTWlufSwKLX07Ci0KLXN0YXRpYyBjb25zdCBFbGVtZW50SWRJbmZvIGtBdWRpb0lkc1tdID0gewotICB7RkxPQVQsIGtXZWJNSWRTYW1wbGluZ0ZyZXF1ZW5jeX0sCi0gIHtGTE9BVCwga1dlYk1JZE91dHB1dFNhbXBsaW5nRnJlcXVlbmN5fSwKLSAge1VJTlQsIGtXZWJNSWRDaGFubmVsc30sCi0gIHtVSU5ULCBrV2ViTUlkQml0RGVwdGh9LAotfTsKLQotc3RhdGljIGNvbnN0IEVsZW1lbnRJZEluZm8ga1RyYWNrT3BlcmF0aW9uSWRzW10gPSB7Ci0gIHtMSVNULCBrV2ViTUlkVHJhY2tDb21iaW5lUGxhbmVzfSwKLSAge0xJU1QsIGtXZWJNSWRKb2luQmxvY2tzfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBFbGVtZW50SWRJbmZvIGtUcmFja0NvbWJpbmVQbGFuZXNJZHNbXSA9IHsKLSAge0xJU1QsIGtXZWJNSWRUcmFja1BsYW5lfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBFbGVtZW50SWRJbmZvIGtUcmFja1BsYW5lSWRzW10gPSB7Ci0gIHtVSU5ULCBrV2ViTUlkVHJhY2tQbGFuZVVJRH0sCi0gIHtVSU5ULCBrV2ViTUlkVHJhY2tQbGFuZVR5cGV9LAotfTsKLQotc3RhdGljIGNvbnN0IEVsZW1lbnRJZEluZm8ga0pvaW5CbG9ja3NJZHNbXSA9IHsKLSAge1VJTlQsIGtXZWJNSWRUcmFja0pvaW5VSUR9LAotfTsKLQotc3RhdGljIGNvbnN0IEVsZW1lbnRJZEluZm8ga0NvbnRlbnRFbmNvZGluZ3NJZHNbXSA9IHsKLSAge0xJU1QsIGtXZWJNSWRDb250ZW50RW5jb2Rpbmd9LAotfTsKLQotc3RhdGljIGNvbnN0IEVsZW1lbnRJZEluZm8ga0NvbnRlbnRFbmNvZGluZ0lkc1tdID0gewotICB7VUlOVCwga1dlYk1JZENvbnRlbnRFbmNvZGluZ09yZGVyfSwKLSAge1VJTlQsIGtXZWJNSWRDb250ZW50RW5jb2RpbmdTY29wZX0sCi0gIHtVSU5ULCBrV2ViTUlkQ29udGVudEVuY29kaW5nVHlwZX0sCi0gIHtMSVNULCBrV2ViTUlkQ29udGVudENvbXByZXNzaW9ufSwKLSAge0xJU1QsIGtXZWJNSWRDb250ZW50RW5jcnlwdGlvbn0sCi19OwotCi1zdGF0aWMgY29uc3QgRWxlbWVudElkSW5mbyBrQ29udGVudENvbXByZXNzaW9uSWRzW10gPSB7Ci0gIHtVSU5ULCBrV2ViTUlkQ29udGVudENvbXBBbGdvfSwKLSAge0JJTkFSWSwga1dlYk1JZENvbnRlbnRDb21wU2V0dGluZ3N9LAotfTsKLQotc3RhdGljIGNvbnN0IEVsZW1lbnRJZEluZm8ga0NvbnRlbnRFbmNyeXB0aW9uSWRzW10gPSB7Ci0gIHtMSVNULCBrV2ViTUlkQ29udGVudEVuY0FFU1NldHRpbmdzfSwKLSAge1VJTlQsIGtXZWJNSWRDb250ZW50RW5jQWxnb30sCi0gIHtCSU5BUlksIGtXZWJNSWRDb250ZW50RW5jS2V5SUR9LAotICB7QklOQVJZLCBrV2ViTUlkQ29udGVudFNpZ25hdHVyZX0sCi0gIHtCSU5BUlksIGtXZWJNSWRDb250ZW50U2lnS2V5SUR9LAotICB7VUlOVCwga1dlYk1JZENvbnRlbnRTaWdBbGdvfSwKLSAge1VJTlQsIGtXZWJNSWRDb250ZW50U2lnSGFzaEFsZ299LAotfTsKLQotc3RhdGljIGNvbnN0IEVsZW1lbnRJZEluZm8ga0NvbnRlbnRFbmNBRVNTZXR0aW5nc0lkc1tdID0gewotICB7VUlOVCwga1dlYk1JZEFFU1NldHRpbmdzQ2lwaGVyTW9kZX0sCi19OwotCi1zdGF0aWMgY29uc3QgRWxlbWVudElkSW5mbyBrQ3Vlc0lkc1tdID0gewotICB7TElTVCwga1dlYk1JZEN1ZVBvaW50fSwKLX07Ci0KLXN0YXRpYyBjb25zdCBFbGVtZW50SWRJbmZvIGtDdWVQb2ludElkc1tdID0gewotICB7VUlOVCwga1dlYk1JZEN1ZVRpbWV9LAotICB7TElTVCwga1dlYk1JZEN1ZVRyYWNrUG9zaXRpb25zfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBFbGVtZW50SWRJbmZvIGtDdWVUcmFja1Bvc2l0aW9uc0lkc1tdID0gewotICB7VUlOVCwga1dlYk1JZEN1ZVRyYWNrfSwKLSAge1VJTlQsIGtXZWJNSWRDdWVDbHVzdGVyUG9zaXRpb259LAotICB7VUlOVCwga1dlYk1JZEN1ZUJsb2NrTnVtYmVyfSwKLSAge1VJTlQsIGtXZWJNSWRDdWVDb2RlY1N0YXRlfSwKLSAge0xJU1QsIGtXZWJNSWRDdWVSZWZlcmVuY2V9LAotfTsKLQotc3RhdGljIGNvbnN0IEVsZW1lbnRJZEluZm8ga0N1ZVJlZmVyZW5jZUlkc1tdID0gewotICB7VUlOVCwga1dlYk1JZEN1ZVJlZlRpbWV9LAotfTsKLQotc3RhdGljIGNvbnN0IEVsZW1lbnRJZEluZm8ga0F0dGFjaG1lbnRzSWRzW10gPSB7Ci0gIHtMSVNULCBrV2ViTUlkQXR0YWNoZWRGaWxlfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBFbGVtZW50SWRJbmZvIGtBdHRhY2hlZEZpbGVJZHNbXSA9IHsKLSAge1NUUklORywga1dlYk1JZEZpbGVEZXNjcmlwdGlvbn0sCi0gIHtTVFJJTkcsIGtXZWJNSWRGaWxlTmFtZX0sCi0gIHtTVFJJTkcsIGtXZWJNSWRGaWxlTWltZVR5cGV9LAotICB7QklOQVJZLCBrV2ViTUlkRmlsZURhdGF9LAotICB7VUlOVCwga1dlYk1JZEZpbGVVSUR9LAotfTsKLQotc3RhdGljIGNvbnN0IEVsZW1lbnRJZEluZm8ga0NoYXB0ZXJzSWRzW10gPSB7Ci0gIHtMSVNULCBrV2ViTUlkRWRpdGlvbkVudHJ5fSwKLX07Ci0KLXN0YXRpYyBjb25zdCBFbGVtZW50SWRJbmZvIGtFZGl0aW9uRW50cnlJZHNbXSA9IHsKLSAge1VJTlQsIGtXZWJNSWRFZGl0aW9uVUlEfSwKLSAge1VJTlQsIGtXZWJNSWRFZGl0aW9uRmxhZ0hpZGRlbn0sCi0gIHtVSU5ULCBrV2ViTUlkRWRpdGlvbkZsYWdEZWZhdWx0fSwKLSAge1VJTlQsIGtXZWJNSWRFZGl0aW9uRmxhZ09yZGVyZWR9LAotICB7TElTVCwga1dlYk1JZENoYXB0ZXJBdG9tfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBFbGVtZW50SWRJbmZvIGtDaGFwdGVyQXRvbUlkc1tdID0gewotICB7VUlOVCwga1dlYk1JZENoYXB0ZXJVSUR9LAotICB7VUlOVCwga1dlYk1JZENoYXB0ZXJUaW1lU3RhcnR9LAotICB7VUlOVCwga1dlYk1JZENoYXB0ZXJUaW1lRW5kfSwKLSAge1VJTlQsIGtXZWJNSWRDaGFwdGVyRmxhZ0hpZGRlbn0sCi0gIHtVSU5ULCBrV2ViTUlkQ2hhcHRlckZsYWdFbmFibGVkfSwKLSAge0JJTkFSWSwga1dlYk1JZENoYXB0ZXJTZWdtZW50VUlEfSwKLSAge1VJTlQsIGtXZWJNSWRDaGFwdGVyU2VnbWVudEVkaXRpb25VSUR9LAotICB7VUlOVCwga1dlYk1JZENoYXB0ZXJQaHlzaWNhbEVxdWl2fSwKLSAge0xJU1QsIGtXZWJNSWRDaGFwdGVyVHJhY2t9LAotICB7TElTVCwga1dlYk1JZENoYXB0ZXJEaXNwbGF5fSwKLSAge0xJU1QsIGtXZWJNSWRDaGFwUHJvY2Vzc30sCi19OwotCi1zdGF0aWMgY29uc3QgRWxlbWVudElkSW5mbyBrQ2hhcHRlclRyYWNrSWRzW10gPSB7Ci0gIHtVSU5ULCBrV2ViTUlkQ2hhcHRlclRyYWNrTnVtYmVyfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBFbGVtZW50SWRJbmZvIGtDaGFwdGVyRGlzcGxheUlkc1tdID0gewotICB7U1RSSU5HLCBrV2ViTUlkQ2hhcFN0cmluZ30sCi0gIHtTVFJJTkcsIGtXZWJNSWRDaGFwTGFuZ3VhZ2V9LAotICB7U1RSSU5HLCBrV2ViTUlkQ2hhcENvdW50cnl9LAotfTsKLQotc3RhdGljIGNvbnN0IEVsZW1lbnRJZEluZm8ga0NoYXBQcm9jZXNzSWRzW10gPSB7Ci0gIHtVSU5ULCBrV2ViTUlkQ2hhcFByb2Nlc3NDb2RlY0lEfSwKLSAge0JJTkFSWSwga1dlYk1JZENoYXBQcm9jZXNzUHJpdmF0ZX0sCi0gIHtMSVNULCBrV2ViTUlkQ2hhcFByb2Nlc3NDb21tYW5kfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBFbGVtZW50SWRJbmZvIGtDaGFwUHJvY2Vzc0NvbW1hbmRJZHNbXSA9IHsKLSAge1VJTlQsIGtXZWJNSWRDaGFwUHJvY2Vzc1RpbWV9LAotICB7QklOQVJZLCBrV2ViTUlkQ2hhcFByb2Nlc3NEYXRhfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBFbGVtZW50SWRJbmZvIGtUYWdzSWRzW10gPSB7Ci0gIHtMSVNULCBrV2ViTUlkVGFnfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBFbGVtZW50SWRJbmZvIGtUYWdJZHNbXSA9IHsKLSAge0xJU1QsIGtXZWJNSWRUYXJnZXRzfSwKLSAge0xJU1QsIGtXZWJNSWRTaW1wbGVUYWd9LAotfTsKLQotc3RhdGljIGNvbnN0IEVsZW1lbnRJZEluZm8ga1RhcmdldHNJZHNbXSA9IHsKLSAge1VJTlQsIGtXZWJNSWRUYXJnZXRUeXBlVmFsdWV9LAotICB7U1RSSU5HLCBrV2ViTUlkVGFyZ2V0VHlwZX0sCi0gIHtVSU5ULCBrV2ViTUlkVGFnVHJhY2tVSUR9LAotICB7VUlOVCwga1dlYk1JZFRhZ0VkaXRpb25VSUR9LAotICB7VUlOVCwga1dlYk1JZFRhZ0NoYXB0ZXJVSUR9LAotICB7VUlOVCwga1dlYk1JZFRhZ0F0dGFjaG1lbnRVSUR9LAotfTsKLQotc3RhdGljIGNvbnN0IEVsZW1lbnRJZEluZm8ga1NpbXBsZVRhZ0lkc1tdID0gewotICB7U1RSSU5HLCBrV2ViTUlkVGFnTmFtZX0sCi0gIHtTVFJJTkcsIGtXZWJNSWRUYWdMYW5ndWFnZX0sCi0gIHtVSU5ULCBrV2ViTUlkVGFnRGVmYXVsdH0sCi0gIHtTVFJJTkcsIGtXZWJNSWRUYWdTdHJpbmd9LAotICB7QklOQVJZLCBrV2ViTUlkVGFnQmluYXJ5fSwKLX07Ci0KLXN0YXRpYyBjb25zdCBFbGVtZW50SWRJbmZvIGtQcm9qZWN0aW9uSWRzW10gPSB7Ci0gIHtGTE9BVCwga1dlYk1JZFByb2plY3Rpb25Qb3NlUGl0Y2h9LAotICB7RkxPQVQsIGtXZWJNSWRQcm9qZWN0aW9uUG9zZVJvbGx9LAotICB7RkxPQVQsIGtXZWJNSWRQcm9qZWN0aW9uUG9zZVlhd30sCi0gIHtCSU5BUlksIGtXZWJNSWRQcm9qZWN0aW9uUHJpdmF0ZX0sCi0gIHtVSU5ULCBrV2ViTUlkUHJvamVjdGlvblR5cGV9LAotfTsKLQotI2RlZmluZSBMSVNUX0VMRU1FTlRfSU5GTyhpZCwgbGV2ZWwsIGlkX2luZm8pIFwKLSAgICB7IChpZCksIChsZXZlbCksIChpZF9pbmZvKSwgYXJyYXlzaXplKGlkX2luZm8pIH0KLQotc3RhdGljIGNvbnN0IExpc3RFbGVtZW50SW5mbyBrTGlzdEVsZW1lbnRJbmZvW10gPSB7Ci0gIExJU1RfRUxFTUVOVF9JTkZPKGtXZWJNSWRDbHVzdGVyLCAxLCBrQ2x1c3RlcklkcyksCi0gIExJU1RfRUxFTUVOVF9JTkZPKGtXZWJNSWRFQk1MSGVhZGVyLCAwLCBrRUJNTEhlYWRlcklkcyksCi0gIExJU1RfRUxFTUVOVF9JTkZPKGtXZWJNSWRTZWdtZW50LCAwLCBrU2VnbWVudElkcyksCi0gIExJU1RfRUxFTUVOVF9JTkZPKGtXZWJNSWRTZWVrSGVhZCwgMSwga1NlZWtIZWFkSWRzKSwKLSAgTElTVF9FTEVNRU5UX0lORk8oa1dlYk1JZFNlZWssIDIsIGtTZWVrSWRzKSwKLSAgTElTVF9FTEVNRU5UX0lORk8oa1dlYk1JZEluZm8sIDEsIGtJbmZvSWRzKSwKLSAgTElTVF9FTEVNRU5UX0lORk8oa1dlYk1JZENoYXB0ZXJUcmFuc2xhdGUsIDIsIGtDaGFwdGVyVHJhbnNsYXRlSWRzKSwKLSAgTElTVF9FTEVNRU5UX0lORk8oa1dlYk1JZFNpbGVudFRyYWNrcywgMiwga1NpbGVudFRyYWNrc0lkcyksCi0gIExJU1RfRUxFTUVOVF9JTkZPKGtXZWJNSWRCbG9ja0dyb3VwLCAyLCBrQmxvY2tHcm91cElkcyksCi0gIExJU1RfRUxFTUVOVF9JTkZPKGtXZWJNSWRCbG9ja0FkZGl0aW9ucywgMywga0Jsb2NrQWRkaXRpb25zSWRzKSwKLSAgTElTVF9FTEVNRU5UX0lORk8oa1dlYk1JZEJsb2NrTW9yZSwgNCwga0Jsb2NrTW9yZUlkcyksCi0gIExJU1RfRUxFTUVOVF9JTkZPKGtXZWJNSWRTbGljZXMsIDMsIGtTbGljZXNJZHMpLAotICBMSVNUX0VMRU1FTlRfSU5GTyhrV2ViTUlkVGltZVNsaWNlLCA0LCBrVGltZVNsaWNlSWRzKSwKLSAgTElTVF9FTEVNRU5UX0lORk8oa1dlYk1JZFRyYWNrcywgMSwga1RyYWNrc0lkcyksCi0gIExJU1RfRUxFTUVOVF9JTkZPKGtXZWJNSWRUcmFja0VudHJ5LCAyLCBrVHJhY2tFbnRyeUlkcyksCi0gIExJU1RfRUxFTUVOVF9JTkZPKGtXZWJNSWRUcmFja1RyYW5zbGF0ZSwgMywga1RyYWNrVHJhbnNsYXRlSWRzKSwKLSAgTElTVF9FTEVNRU5UX0lORk8oa1dlYk1JZFZpZGVvLCAzLCBrVmlkZW9JZHMpLAotICBMSVNUX0VMRU1FTlRfSU5GTyhrV2ViTUlkQXVkaW8sIDMsIGtBdWRpb0lkcyksCi0gIExJU1RfRUxFTUVOVF9JTkZPKGtXZWJNSWRUcmFja09wZXJhdGlvbiwgMywga1RyYWNrT3BlcmF0aW9uSWRzKSwKLSAgTElTVF9FTEVNRU5UX0lORk8oa1dlYk1JZFRyYWNrQ29tYmluZVBsYW5lcywgNCwga1RyYWNrQ29tYmluZVBsYW5lc0lkcyksCi0gIExJU1RfRUxFTUVOVF9JTkZPKGtXZWJNSWRUcmFja1BsYW5lLCA1LCBrVHJhY2tQbGFuZUlkcyksCi0gIExJU1RfRUxFTUVOVF9JTkZPKGtXZWJNSWRKb2luQmxvY2tzLCA0LCBrSm9pbkJsb2Nrc0lkcyksCi0gIExJU1RfRUxFTUVOVF9JTkZPKGtXZWJNSWRDb250ZW50RW5jb2RpbmdzLCAzLCBrQ29udGVudEVuY29kaW5nc0lkcyksCi0gIExJU1RfRUxFTUVOVF9JTkZPKGtXZWJNSWRDb250ZW50RW5jb2RpbmcsIDQsIGtDb250ZW50RW5jb2RpbmdJZHMpLAotICBMSVNUX0VMRU1FTlRfSU5GTyhrV2ViTUlkQ29udGVudENvbXByZXNzaW9uLCA1LCBrQ29udGVudENvbXByZXNzaW9uSWRzKSwKLSAgTElTVF9FTEVNRU5UX0lORk8oa1dlYk1JZENvbnRlbnRFbmNyeXB0aW9uLCA1LCBrQ29udGVudEVuY3J5cHRpb25JZHMpLAotICBMSVNUX0VMRU1FTlRfSU5GTyhrV2ViTUlkQ29udGVudEVuY0FFU1NldHRpbmdzLCA2LCBrQ29udGVudEVuY0FFU1NldHRpbmdzSWRzKSwKLSAgTElTVF9FTEVNRU5UX0lORk8oa1dlYk1JZEN1ZXMsIDEsIGtDdWVzSWRzKSwKLSAgTElTVF9FTEVNRU5UX0lORk8oa1dlYk1JZEN1ZVBvaW50LCAyLCBrQ3VlUG9pbnRJZHMpLAotICBMSVNUX0VMRU1FTlRfSU5GTyhrV2ViTUlkQ3VlVHJhY2tQb3NpdGlvbnMsIDMsIGtDdWVUcmFja1Bvc2l0aW9uc0lkcyksCi0gIExJU1RfRUxFTUVOVF9JTkZPKGtXZWJNSWRDdWVSZWZlcmVuY2UsIDQsIGtDdWVSZWZlcmVuY2VJZHMpLAotICBMSVNUX0VMRU1FTlRfSU5GTyhrV2ViTUlkQXR0YWNobWVudHMsIDEsIGtBdHRhY2htZW50c0lkcyksCi0gIExJU1RfRUxFTUVOVF9JTkZPKGtXZWJNSWRBdHRhY2hlZEZpbGUsIDIsIGtBdHRhY2hlZEZpbGVJZHMpLAotICBMSVNUX0VMRU1FTlRfSU5GTyhrV2ViTUlkQ2hhcHRlcnMsIDEsIGtDaGFwdGVyc0lkcyksCi0gIExJU1RfRUxFTUVOVF9JTkZPKGtXZWJNSWRFZGl0aW9uRW50cnksIDIsIGtFZGl0aW9uRW50cnlJZHMpLAotICBMSVNUX0VMRU1FTlRfSU5GTyhrV2ViTUlkQ2hhcHRlckF0b20sIDMsIGtDaGFwdGVyQXRvbUlkcyksCi0gIExJU1RfRUxFTUVOVF9JTkZPKGtXZWJNSWRDaGFwdGVyVHJhY2ssIDQsIGtDaGFwdGVyVHJhY2tJZHMpLAotICBMSVNUX0VMRU1FTlRfSU5GTyhrV2ViTUlkQ2hhcHRlckRpc3BsYXksIDQsIGtDaGFwdGVyRGlzcGxheUlkcyksCi0gIExJU1RfRUxFTUVOVF9JTkZPKGtXZWJNSWRDaGFwUHJvY2VzcywgNCwga0NoYXBQcm9jZXNzSWRzKSwKLSAgTElTVF9FTEVNRU5UX0lORk8oa1dlYk1JZENoYXBQcm9jZXNzQ29tbWFuZCwgNSwga0NoYXBQcm9jZXNzQ29tbWFuZElkcyksCi0gIExJU1RfRUxFTUVOVF9JTkZPKGtXZWJNSWRUYWdzLCAxLCBrVGFnc0lkcyksCi0gIExJU1RfRUxFTUVOVF9JTkZPKGtXZWJNSWRUYWcsIDIsIGtUYWdJZHMpLAotICBMSVNUX0VMRU1FTlRfSU5GTyhrV2ViTUlkVGFyZ2V0cywgMywga1RhcmdldHNJZHMpLAotICBMSVNUX0VMRU1FTlRfSU5GTyhrV2ViTUlkU2ltcGxlVGFnLCAzLCBrU2ltcGxlVGFnSWRzKSwKLSAgTElTVF9FTEVNRU5UX0lORk8oa1dlYk1JZFByb2plY3Rpb24sIDQsIGtQcm9qZWN0aW9uSWRzKSwKLSAgTElTVF9FTEVNRU5UX0lORk8oa1dlYk1JZENvbG91ciwgNCwga0NvbG91cklkcyksCi0gIExJU1RfRUxFTUVOVF9JTkZPKGtXZWJNSWRNYXN0ZXJpbmdNZXRhZGF0YSwgNSwga01hc3RlcmluZ01ldGFkYXRhSWRzKSwKLX07Ci0KLS8vIFBhcnNlcyBhbiBlbGVtZW50IGhlYWRlciBpZCBvciBzaXplIGZpZWxkLiBUaGVzZSBmaWVsZHMgYXJlIHZhcmlhYmxlIGxlbmd0aAotLy8gZW5jb2RlZC4gVGhlIGZpcnN0IGJ5dGUgaW5kaWNhdGVzIGhvdyBtYW55IGJ5dGVzIHRoZSBmaWVsZCBvY2N1cGllcy4KLS8vIHxidWZ8ICAtIFRoZSBidWZmZXIgdG8gcGFyc2UuCi0vLyB8c2l6ZXwgLSBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHxidWZ8Ci0vLyB8bWF4X2J5dGVzfCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGUgZmllbGQgY2FuIGJlLiBJRCBmaWVsZHMKLS8vICAgICAgICAgICAgICAgc2V0IHRoaXMgdG8gNCAmIGVsZW1lbnQgc2l6ZSBmaWVsZHMgc2V0IHRoaXMgdG8gOC4gSWYgdGhlCi0vLyAgICAgICAgICAgICAgIGZpcnN0IGJ5dGUgaW5kaWNhdGVzIGEgbGFyZ2VyIGZpZWxkIHNpemUgdGhhbiB0aGlzIGl0IGlzIGEKLS8vICAgICAgICAgICAgICAgcGFyc2VyIGVycm9yLgotLy8gfG1hc2tfZmlyc3RfYnl0ZXwgLSBGb3IgZWxlbWVudCBzaXplIGZpZWxkcyB0aGUgZmllbGQgbGVuZ3RoIGVuY29kaW5nIGJpdHMKLS8vICAgICAgICAgICAgICAgICAgICAgbmVlZCB0byBiZSBtYXNrZWQgb2ZmLiBUaGlzIHBhcmFtZXRlciBpcyB0cnVlIGZvcgotLy8gICAgICAgICAgICAgICAgICAgICBlbGVtZW50IHNpemUgZmllbGRzIGFuZCBpcyBmYWxzZSBmb3IgSUQgZmllbGQgdmFsdWVzLgotLy8KLS8vIFJldHVybnM6IFRoZSBudW1iZXIgb2YgYnl0ZXMgcGFyc2VkIG9uIHN1Y2Nlc3MuIC0xIG9uIGVycm9yLgotc3RhdGljIGludCBQYXJzZVdlYk1FbGVtZW50SGVhZGVyRmllbGQoY29uc3QgdWludDgqIGJ1ZiwgaW50IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2J5dGVzLCBib29sIG1hc2tfZmlyc3RfYnl0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0KiBudW0pIHsKLSAgRENIRUNLKGJ1Zik7Ci0gIERDSEVDSyhudW0pOwotCi0gIGlmIChzaXplIDwgMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKHNpemUgPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBpbnQgbWFzayA9IDB4ODA7Ci0gIHVpbnQ4IGNoID0gYnVmWzBdOwotICBpbnQgZXh0cmFfYnl0ZXMgPSAtMTsKLSAgYm9vbCBhbGxfb25lcyA9IGZhbHNlOwotICBmb3IgKGludCBpID0gMDsgaSA8IG1heF9ieXRlczsgKytpKSB7Ci0gICAgaWYgKChjaCAmIG1hc2spICE9IDApIHsKLSAgICAgIG1hc2sgPSB+bWFzayAmIDB4ZmY7Ci0gICAgICAqbnVtID0gbWFza19maXJzdF9ieXRlID8gY2ggJiBtYXNrIDogY2g7Ci0gICAgICBhbGxfb25lcyA9IChjaCAmIG1hc2spID09IG1hc2s7Ci0gICAgICBleHRyYV9ieXRlcyA9IGk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgbWFzayA9IDB4ODAgfCBtYXNrID4+IDE7Ci0gIH0KLQotICBpZiAoZXh0cmFfYnl0ZXMgPT0gLTEpCi0gICAgcmV0dXJuIC0xOwotCi0gIC8vIFJldHVybiAwIGlmIHdlIG5lZWQgbW9yZSBkYXRhLgotICBpZiAoKDEgKyBleHRyYV9ieXRlcykgPiBzaXplKQotICAgIHJldHVybiAwOwotCi0gIGludCBieXRlc191c2VkID0gMTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IGV4dHJhX2J5dGVzOyArK2kpIHsKLSAgICBjaCA9IGJ1ZltieXRlc191c2VkKytdOwotICAgIGFsbF9vbmVzICY9IChjaCA9PSAweGZmKTsKLSAgICAqbnVtID0gKCpudW0gPDwgOCkgfCBjaDsKLSAgfQotCi0gIGlmIChhbGxfb25lcykKLSAgICAqbnVtID0ga2ludDY0bWF4OwotCi0gIHJldHVybiBieXRlc191c2VkOwotfQotCi1pbnQgV2ViTVBhcnNlRWxlbWVudEhlYWRlcihjb25zdCB1aW50OCogYnVmLCBpbnQgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogaWQsIGludDY0KiBlbGVtZW50X3NpemUpIHsKLSAgRENIRUNLKGJ1Zik7Ci0gIERDSEVDS19HRShzaXplLCAwKTsKLSAgRENIRUNLKGlkKTsKLSAgRENIRUNLKGVsZW1lbnRfc2l6ZSk7Ci0KLSAgaWYgKHNpemUgPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBpbnQ2NCB0bXAgPSAwOwotICBpbnQgbnVtX2lkX2J5dGVzID0gUGFyc2VXZWJNRWxlbWVudEhlYWRlckZpZWxkKGJ1Ziwgc2l6ZSwgNCwgZmFsc2UsICZ0bXApOwotCi0gIGlmIChudW1faWRfYnl0ZXMgPD0gMCkKLSAgICByZXR1cm4gbnVtX2lkX2J5dGVzOwotCi0gIGlmICh0bXAgPT0ga2ludDY0bWF4KQotICAgIHRtcCA9IGtXZWJNUmVzZXJ2ZWRJZDsKLQotICAqaWQgPSBzdGF0aWNfY2FzdDxpbnQ+KHRtcCk7Ci0KLSAgaW50IG51bV9zaXplX2J5dGVzID0gUGFyc2VXZWJNRWxlbWVudEhlYWRlckZpZWxkKGJ1ZiArIG51bV9pZF9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgLSBudW1faWRfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCB0cnVlLCAmdG1wKTsKLQotICBpZiAobnVtX3NpemVfYnl0ZXMgPD0gMCkKLSAgICByZXR1cm4gbnVtX3NpemVfYnl0ZXM7Ci0KLSAgaWYgKHRtcCA9PSBraW50NjRtYXgpCi0gICAgdG1wID0ga1dlYk1Vbmtub3duU2l6ZTsKLQotICAqZWxlbWVudF9zaXplID0gdG1wOwotICBEVkxPRygzKSA8PCAiV2ViTVBhcnNlRWxlbWVudEhlYWRlcigpIDogaWQgIiA8PCBzdGQ6OmhleCA8PCAqaWQgPDwgc3RkOjpkZWMKLSAgICAgICAgICAgPDwgIiBzaXplICIgPDwgKmVsZW1lbnRfc2l6ZTsKLSAgcmV0dXJuIG51bV9pZF9ieXRlcyArIG51bV9zaXplX2J5dGVzOwotfQotCi0vLyBGaW5kcyBFbGVtZW50VHlwZSBmb3IgYSBzcGVjaWZpYyBJRC4KLXN0YXRpYyBFbGVtZW50VHlwZSBGaW5kSWRUeXBlKGludCBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVsZW1lbnRJZEluZm8qIGlkX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWRfaW5mb19jb3VudCkgewotCi0gIC8vIENoZWNrIGZvciBnbG9iYWwgZWxlbWVudCBJRHMgdGhhdCBjYW4gYmUgYW55d2hlcmUuCi0gIGlmIChpZCA9PSBrV2ViTUlkVm9pZCB8fCBpZCA9PSBrV2ViTUlkQ1JDMzIpCi0gICAgcmV0dXJuIFNLSVA7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZF9pbmZvX2NvdW50OyArK2kpIHsKLSAgICBpZiAoaWQgPT0gaWRfaW5mb1tpXS5pZF8pCi0gICAgICByZXR1cm4gaWRfaW5mb1tpXS50eXBlXzsKLSAgfQotCi0gIHJldHVybiBVTktOT1dOOwotfQotCi0vLyBGaW5kcyBMaXN0RWxlbWVudEluZm8gZm9yIGEgc3BlY2lmaWMgSUQuCi1zdGF0aWMgY29uc3QgTGlzdEVsZW1lbnRJbmZvKiBGaW5kTGlzdEluZm8oaW50IGlkKSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJyYXlzaXplKGtMaXN0RWxlbWVudEluZm8pOyArK2kpIHsKLSAgICBpZiAoaWQgPT0ga0xpc3RFbGVtZW50SW5mb1tpXS5pZF8pCi0gICAgICByZXR1cm4gJmtMaXN0RWxlbWVudEluZm9baV07Ci0gIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCBGaW5kTGlzdExldmVsKGludCBpZCkgewotICBjb25zdCBMaXN0RWxlbWVudEluZm8qIGxpc3RfaW5mbyA9IEZpbmRMaXN0SW5mbyhpZCk7Ci0gIGlmIChsaXN0X2luZm8pCi0gICAgcmV0dXJuIGxpc3RfaW5mby0+bGV2ZWxfOwotCi0gIHJldHVybiAtMTsKLX0KLQotc3RhdGljIGludCBQYXJzZVVJbnQoY29uc3QgdWludDgqIGJ1ZiwgaW50IHNpemUsIGludCBpZCwKLSAgICAgICAgICAgICAgICAgICAgIFdlYk1QYXJzZXJDbGllbnQqIGNsaWVudCkgewotICBpZiAoKHNpemUgPD0gMCkgfHwgKHNpemUgPiA4KSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgLy8gUmVhZCBpbiB0aGUgYmlnLWVuZGlhbiBpbnRlZ2VyLgotICBpbnQ2NCB2YWx1ZSA9IDA7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKQotICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgYnVmW2ldOwotCi0gIGlmICghY2xpZW50LT5PblVJbnQoaWQsIHZhbHVlKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLXN0YXRpYyBpbnQgUGFyc2VGbG9hdChjb25zdCB1aW50OCogYnVmLCBpbnQgc2l6ZSwgaW50IGlkLAotICAgICAgICAgICAgICAgICAgICAgIFdlYk1QYXJzZXJDbGllbnQqIGNsaWVudCkgewotCi0gIGlmICgoc2l6ZSAhPSA0KSAmJiAoc2l6ZSAhPSA4KSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgZG91YmxlIHZhbHVlID0gLTE7Ci0KLSAgLy8gUmVhZCB0aGUgYnl0ZXMgZnJvbSBiaWctZW5kaWFuIGZvcm0gaW50byBhIG5hdGl2ZSBlbmRpYW4gaW50ZWdlci4KLSAgaW50NjQgdG1wID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpCi0gICAgdG1wID0gKHRtcCA8PCA4KSB8IGJ1ZltpXTsKLQotICAvLyBVc2UgYSB1bmlvbiB0byBjb252ZXJ0IHRoZSBpbnRlZ2VyIGJpdCBwYXR0ZXJuIGludG8gYSBmbG9hdGluZyBwb2ludAotICAvLyBudW1iZXIuCi0gIGlmIChzaXplID09IDQpIHsKLSAgICB1bmlvbiB7Ci0gICAgICBpbnQzMiBzcmM7Ci0gICAgICBmbG9hdCBkc3Q7Ci0gICAgfSB0bXAyOwotICAgIHRtcDIuc3JjID0gc3RhdGljX2Nhc3Q8aW50MzI+KHRtcCk7Ci0gICAgdmFsdWUgPSB0bXAyLmRzdDsKLSAgfSBlbHNlIGlmIChzaXplID09IDgpIHsKLSAgICB1bmlvbiB7Ci0gICAgICBpbnQ2NCBzcmM7Ci0gICAgICBkb3VibGUgZHN0OwotICAgIH0gdG1wMjsKLSAgICB0bXAyLnNyYyA9IHRtcDsKLSAgICB2YWx1ZSA9IHRtcDIuZHN0OwotICB9IGVsc2UgewotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIGlmICghY2xpZW50LT5PbkZsb2F0KGlkLCB2YWx1ZSkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiBzaXplOwotfQotCi1zdGF0aWMgaW50IFBhcnNlQmluYXJ5KGNvbnN0IHVpbnQ4KiBidWYsIGludCBzaXplLCBpbnQgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgIFdlYk1QYXJzZXJDbGllbnQqIGNsaWVudCkgewotICByZXR1cm4gY2xpZW50LT5PbkJpbmFyeShpZCwgYnVmLCBzaXplKSA/IHNpemUgOiAtMTsKLX0KLQotc3RhdGljIGludCBQYXJzZVN0cmluZyhjb25zdCB1aW50OCogYnVmLCBpbnQgc2l6ZSwgaW50IGlkLAotICAgICAgICAgICAgICAgICAgICAgICBXZWJNUGFyc2VyQ2xpZW50KiBjbGllbnQpIHsKLSAgc3RkOjpzdHJpbmcgc3RyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGJ1ZiksIHNpemUpOwotICByZXR1cm4gY2xpZW50LT5PblN0cmluZyhpZCwgc3RyKSA/IHNpemUgOiAtMTsKLX0KLQotc3RhdGljIGludCBQYXJzZU5vbkxpc3RFbGVtZW50KEVsZW1lbnRUeXBlIHR5cGUsIGludCBpZCwgaW50NjQgZWxlbWVudF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBidWYsIGludCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYk1QYXJzZXJDbGllbnQqIGNsaWVudCkgewotICBEQ0hFQ0tfR0Uoc2l6ZSwgZWxlbWVudF9zaXplKTsKLQotICBpbnQgcmVzdWx0ID0gLTE7Ci0gIHN3aXRjaCh0eXBlKSB7Ci0gICAgY2FzZSBMSVNUOgotICAgICAgTk9USU1QTEVNRU5URUQoKTsKLSAgICAgIHJlc3VsdCA9IC0xOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVSU5UOgotICAgICAgcmVzdWx0ID0gUGFyc2VVSW50KGJ1ZiwgZWxlbWVudF9zaXplLCBpZCwgY2xpZW50KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRkxPQVQ6Ci0gICAgICByZXN1bHQgPSBQYXJzZUZsb2F0KGJ1ZiwgZWxlbWVudF9zaXplLCBpZCwgY2xpZW50KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQklOQVJZOgotICAgICAgcmVzdWx0ID0gUGFyc2VCaW5hcnkoYnVmLCBlbGVtZW50X3NpemUsIGlkLCBjbGllbnQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVFJJTkc6Ci0gICAgICByZXN1bHQgPSBQYXJzZVN0cmluZyhidWYsIGVsZW1lbnRfc2l6ZSwgaWQsIGNsaWVudCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNLSVA6Ci0gICAgICByZXN1bHQgPSBlbGVtZW50X3NpemU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgRFZMT0coMSkgPDwgIlVuaGFuZGxlZCBJRCB0eXBlICIgPDwgdHlwZTsKLSAgICAgIHJldHVybiAtMTsKLSAgfTsKLQotICBEQ0hFQ0tfTEUocmVzdWx0LCBzaXplKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotV2ViTVBhcnNlckNsaWVudDo6V2ViTVBhcnNlckNsaWVudCgpIHt9Ci1XZWJNUGFyc2VyQ2xpZW50Ojp+V2ViTVBhcnNlckNsaWVudCgpIHt9Ci0KLVdlYk1QYXJzZXJDbGllbnQqIFdlYk1QYXJzZXJDbGllbnQ6Ok9uTGlzdFN0YXJ0KGludCBpZCkgewotICBEVkxPRygxKSA8PCAiVW5leHBlY3RlZCBsaXN0IGVsZW1lbnQgc3RhcnQgd2l0aCBJRCAiIDw8IHN0ZDo6aGV4IDw8IGlkOwotICByZXR1cm4gTlVMTDsKLX0KLQotYm9vbCBXZWJNUGFyc2VyQ2xpZW50OjpPbkxpc3RFbmQoaW50IGlkKSB7Ci0gIERWTE9HKDEpIDw8ICJVbmV4cGVjdGVkIGxpc3QgZWxlbWVudCBlbmQgd2l0aCBJRCAiIDw8IHN0ZDo6aGV4IDw8IGlkOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgV2ViTVBhcnNlckNsaWVudDo6T25VSW50KGludCBpZCwgaW50NjQgdmFsKSB7Ci0gIERWTE9HKDEpIDw8ICJVbmV4cGVjdGVkIHVuc2lnbmVkIGludGVnZXIgZWxlbWVudCB3aXRoIElEICIgPDwgc3RkOjpoZXggPDwgaWQ7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBXZWJNUGFyc2VyQ2xpZW50OjpPbkZsb2F0KGludCBpZCwgZG91YmxlIHZhbCkgewotICBEVkxPRygxKSA8PCAiVW5leHBlY3RlZCBmbG9hdCBlbGVtZW50IHdpdGggSUQgIiA8PCBzdGQ6OmhleCA8PCBpZDsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIFdlYk1QYXJzZXJDbGllbnQ6Ok9uQmluYXJ5KGludCBpZCwgY29uc3QgdWludDgqIGRhdGEsIGludCBzaXplKSB7Ci0gIERWTE9HKDEpIDw8ICJVbmV4cGVjdGVkIGJpbmFyeSBlbGVtZW50IHdpdGggSUQgIiA8PCBzdGQ6OmhleCA8PCBpZDsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIFdlYk1QYXJzZXJDbGllbnQ6Ok9uU3RyaW5nKGludCBpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICBEVkxPRygxKSA8PCAiVW5leHBlY3RlZCBzdHJpbmcgZWxlbWVudCB3aXRoIElEICIgPDwgc3RkOjpoZXggPDwgaWQ7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotV2ViTUxpc3RQYXJzZXI6OldlYk1MaXN0UGFyc2VyKGludCBpZCwgV2ViTVBhcnNlckNsaWVudCogY2xpZW50KQotICAgIDogc3RhdGVfKE5FRURfTElTVF9IRUFERVIpLAotICAgICAgcm9vdF9pZF8oaWQpLAotICAgICAgcm9vdF9sZXZlbF8oRmluZExpc3RMZXZlbChpZCkpLAotICAgICAgcm9vdF9jbGllbnRfKGNsaWVudCkgewotICBEQ0hFQ0tfR0Uocm9vdF9sZXZlbF8sIDApOwotICBEQ0hFQ0soY2xpZW50KTsKLX0KLQotV2ViTUxpc3RQYXJzZXI6On5XZWJNTGlzdFBhcnNlcigpIHt9Ci0KLXZvaWQgV2ViTUxpc3RQYXJzZXI6OlJlc2V0KCkgewotICBDaGFuZ2VTdGF0ZShORUVEX0xJU1RfSEVBREVSKTsKLSAgbGlzdF9zdGF0ZV9zdGFja18uY2xlYXIoKTsKLX0KLQotaW50IFdlYk1MaXN0UGFyc2VyOjpQYXJzZShjb25zdCB1aW50OCogYnVmLCBpbnQgc2l6ZSkgewotICBEQ0hFQ0soYnVmKTsKLQotICBpZiAoc2l6ZSA8IDAgfHwgc3RhdGVfID09IFBBUlNFX0VSUk9SIHx8IHN0YXRlXyA9PSBET05FX1BBUlNJTkdfTElTVCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKHNpemUgPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBjb25zdCB1aW50OCogY3VyID0gYnVmOwotICBpbnQgY3VyX3NpemUgPSBzaXplOwotICBpbnQgYnl0ZXNfcGFyc2VkID0gMDsKLQotICB3aGlsZSAoY3VyX3NpemUgPiAwICYmIHN0YXRlXyAhPSBQQVJTRV9FUlJPUiAmJiBzdGF0ZV8gIT0gRE9ORV9QQVJTSU5HX0xJU1QpIHsKLSAgICBpbnQgZWxlbWVudF9pZCA9IDA7Ci0gICAgaW50NjQgZWxlbWVudF9zaXplID0gMDsKLSAgICBpbnQgcmVzdWx0ID0gV2ViTVBhcnNlRWxlbWVudEhlYWRlcihjdXIsIGN1cl9zaXplLCAmZWxlbWVudF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZWxlbWVudF9zaXplKTsKLQotICAgIGlmIChyZXN1bHQgPCAwKQotICAgICAgcmV0dXJuIHJlc3VsdDsKLQotICAgIGlmIChyZXN1bHQgPT0gMCkKLSAgICAgIHJldHVybiBieXRlc19wYXJzZWQ7Ci0KLSAgICBzd2l0Y2goc3RhdGVfKSB7Ci0gICAgICBjYXNlIE5FRURfTElTVF9IRUFERVI6IHsKLSAgICAgICAgaWYgKGVsZW1lbnRfaWQgIT0gcm9vdF9pZF8pIHsKLSAgICAgICAgICBDaGFuZ2VTdGF0ZShQQVJTRV9FUlJPUik7Ci0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gT25seSBhbGxvdyBTZWdtZW50ICYgQ2x1c3RlciB0byBoYXZlIGFuIHVua25vd24gc2l6ZS4KLSAgICAgICAgaWYgKGVsZW1lbnRfc2l6ZSA9PSBrV2ViTVVua25vd25TaXplICYmCi0gICAgICAgICAgICAoZWxlbWVudF9pZCAhPSBrV2ViTUlkU2VnbWVudCkgJiYKLSAgICAgICAgICAgIChlbGVtZW50X2lkICE9IGtXZWJNSWRDbHVzdGVyKSkgewotICAgICAgICAgIENoYW5nZVN0YXRlKFBBUlNFX0VSUk9SKTsKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBDaGFuZ2VTdGF0ZShJTlNJREVfTElTVCk7Ci0gICAgICAgIGlmICghT25MaXN0U3RhcnQocm9vdF9pZF8sIGVsZW1lbnRfc2l6ZSkpCi0gICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIElOU0lERV9MSVNUOiB7Ci0gICAgICAgIGludCBoZWFkZXJfc2l6ZSA9IHJlc3VsdDsKLSAgICAgICAgY29uc3QgdWludDgqIGVsZW1lbnRfZGF0YSA9IGN1ciArIGhlYWRlcl9zaXplOwotICAgICAgICBpbnQgZWxlbWVudF9kYXRhX3NpemUgPSBjdXJfc2l6ZSAtIGhlYWRlcl9zaXplOwotCi0gICAgICAgIGlmIChlbGVtZW50X3NpemUgPCBlbGVtZW50X2RhdGFfc2l6ZSkKLSAgICAgICAgICBlbGVtZW50X2RhdGFfc2l6ZSA9IGVsZW1lbnRfc2l6ZTsKLQotICAgICAgICByZXN1bHQgPSBQYXJzZUxpc3RFbGVtZW50KGhlYWRlcl9zaXplLCBlbGVtZW50X2lkLCBlbGVtZW50X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9kYXRhLCBlbGVtZW50X2RhdGFfc2l6ZSk7Ci0KLSAgICAgICAgRENIRUNLX0xFKHJlc3VsdCwgaGVhZGVyX3NpemUgKyBlbGVtZW50X2RhdGFfc2l6ZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPCAwKSB7Ci0gICAgICAgICAgQ2hhbmdlU3RhdGUoUEFSU0VfRVJST1IpOwotICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gMCkKLSAgICAgICAgICByZXR1cm4gYnl0ZXNfcGFyc2VkOwotCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBET05FX1BBUlNJTkdfTElTVDoKLSAgICAgIGNhc2UgUEFSU0VfRVJST1I6Ci0gICAgICAgIC8vIFNob3VsZG4ndCBiZSBhYmxlIHRvIGdldCBoZXJlLgotICAgICAgICBOT1RJTVBMRU1FTlRFRCgpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjdXIgKz0gcmVzdWx0OwotICAgIGN1cl9zaXplIC09IHJlc3VsdDsKLSAgICBieXRlc19wYXJzZWQgKz0gcmVzdWx0OwotICB9Ci0KLSAgcmV0dXJuIChzdGF0ZV8gPT0gUEFSU0VfRVJST1IpID8gLTEgOiBieXRlc19wYXJzZWQ7Ci19Ci0KLWJvb2wgV2ViTUxpc3RQYXJzZXI6OklzUGFyc2luZ0NvbXBsZXRlKCkgY29uc3QgewotICByZXR1cm4gc3RhdGVfID09IERPTkVfUEFSU0lOR19MSVNUOwotfQotCi12b2lkIFdlYk1MaXN0UGFyc2VyOjpDaGFuZ2VTdGF0ZShTdGF0ZSBuZXdfc3RhdGUpIHsKLSAgc3RhdGVfID0gbmV3X3N0YXRlOwotfQotCi1pbnQgV2ViTUxpc3RQYXJzZXI6OlBhcnNlTGlzdEVsZW1lbnQoaW50IGhlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCwgaW50NjQgZWxlbWVudF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBkYXRhLCBpbnQgc2l6ZSkgewotICBEQ0hFQ0tfR1QobGlzdF9zdGF0ZV9zdGFja18uc2l6ZSgpLCAwdSk7Ci0KLSAgTGlzdFN0YXRlJiBsaXN0X3N0YXRlID0gbGlzdF9zdGF0ZV9zdGFja18uYmFjaygpOwotICBEQ0hFQ0sobGlzdF9zdGF0ZS5lbGVtZW50X2luZm9fKTsKLQotICBjb25zdCBMaXN0RWxlbWVudEluZm8qIGVsZW1lbnRfaW5mbyA9IGxpc3Rfc3RhdGUuZWxlbWVudF9pbmZvXzsKLSAgRWxlbWVudFR5cGUgaWRfdHlwZSA9Ci0gICAgICBGaW5kSWRUeXBlKGlkLCBlbGVtZW50X2luZm8tPmlkX2luZm9fLCBlbGVtZW50X2luZm8tPmlkX2luZm9fY291bnRfKTsKLQotICAvLyBVbmV4cGVjdGVkIElELgotICBpZiAoaWRfdHlwZSA9PSBVTktOT1dOKSB7Ci0gICAgaWYgKGxpc3Rfc3RhdGUuc2l6ZV8gIT0ga1dlYk1Vbmtub3duU2l6ZSB8fAotICAgICAgICAhSXNTaWJsaW5nT3JBbmNlc3RvcihsaXN0X3N0YXRlLmlkXywgaWQpKSB7Ci0gICAgICBEVkxPRygxKSA8PCAiTm8gRWxlbWVudFR5cGUgaW5mbyBmb3IgSUQgMHgiIDw8IHN0ZDo6aGV4IDw8IGlkOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiBhIGxpc3Qgb2YgdW5rbm93biBzaXplLiBVcGRhdGUgdGhlIHNpemUgbm93IHRoYXQKLSAgICAvLyB3ZSBrbm93IGl0IGFuZCBkaXNwYXRjaCB0aGUgZW5kIG9mIGxpc3QgY2FsbHMuCi0gICAgbGlzdF9zdGF0ZS5zaXplXyA9IGxpc3Rfc3RhdGUuYnl0ZXNfcGFyc2VkXzsKLQotICAgIGlmICghT25MaXN0RW5kKCkpCi0gICAgICByZXR1cm4gLTE7Ci0KLSAgICAvLyBDaGVjayB0byBzZWUgaWYgYWxsIG9wZW4gbGlzdHMgaGF2ZSBlbmRlZC4KLSAgICBpZiAobGlzdF9zdGF0ZV9zdGFja18uc2l6ZSgpID09IDApCi0gICAgICByZXR1cm4gMDsKLQotICAgIGxpc3Rfc3RhdGUgPSBsaXN0X3N0YXRlX3N0YWNrXy5iYWNrKCk7Ci0gIH0KLQotICAvLyBNYWtlIHN1cmUgdGhlIHdob2xlIGVsZW1lbnQgY2FuIGZpdCBpbnNpZGUgdGhlIGN1cnJlbnQgbGlzdC4KLSAgaW50NjQgdG90YWxfZWxlbWVudF9zaXplID0gaGVhZGVyX3NpemUgKyBlbGVtZW50X3NpemU7Ci0gIGlmIChsaXN0X3N0YXRlLnNpemVfICE9IGtXZWJNVW5rbm93blNpemUgJiYKLSAgICAgIGxpc3Rfc3RhdGUuc2l6ZV8gPCBsaXN0X3N0YXRlLmJ5dGVzX3BhcnNlZF8gKyB0b3RhbF9lbGVtZW50X3NpemUpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBpZiAoaWRfdHlwZSA9PSBMSVNUKSB7Ci0gICAgbGlzdF9zdGF0ZS5ieXRlc19wYXJzZWRfICs9IGhlYWRlcl9zaXplOwotCi0gICAgaWYgKCFPbkxpc3RTdGFydChpZCwgZWxlbWVudF9zaXplKSkKLSAgICAgIHJldHVybiAtMTsKLSAgICByZXR1cm4gaGVhZGVyX3NpemU7Ci0gIH0KLQotICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSB0aGUgZW50aXJlIGVsZW1lbnQgYmVmb3JlIHRyeWluZyB0byBwYXJzZSBhIG5vbi1saXN0Ci0gIC8vIGVsZW1lbnQuCi0gIGlmIChzaXplIDwgZWxlbWVudF9zaXplKQotICAgIHJldHVybiAwOwotCi0gIGludCBieXRlc19wYXJzZWQgPSBQYXJzZU5vbkxpc3RFbGVtZW50KGlkX3R5cGUsIGlkLCBlbGVtZW50X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIHNpemUsIGxpc3Rfc3RhdGUuY2xpZW50Xyk7Ci0gIERDSEVDS19MRShieXRlc19wYXJzZWQsIHNpemUpOwotCi0gIC8vIFJldHVybiBpZiBhbiBlcnJvciBvY2N1cnJlZCBvciB3ZSBuZWVkIG1vcmUgZGF0YS4KLSAgLy8gTm90ZTogYnl0ZXNfcGFyc2VkIGlzIDAgZm9yIGEgc3VjY2Vzc2Z1bCBwYXJzZSBvZiBhIHNpemUgMCBlbGVtZW50LiBXZQotICAvLyBuZWVkIHRvIGNoZWNrIHRoZSBlbGVtZW50X3NpemUgdG8gZGlzYW1iaWd1YXRlIHRoZSAibmVlZCBtb3JlIGRhdGEiIGNhc2UKLSAgLy8gZnJvbSBhIHN1Y2Nlc3NmdWwgcGFyc2UuCi0gIGlmIChieXRlc19wYXJzZWQgPCAwIHx8IChieXRlc19wYXJzZWQgPT0gMCAmJiBlbGVtZW50X3NpemUgIT0gMCkpCi0gICAgcmV0dXJuIGJ5dGVzX3BhcnNlZDsKLQotICBpbnQgcmVzdWx0ID0gaGVhZGVyX3NpemUgKyBieXRlc19wYXJzZWQ7Ci0gIGxpc3Rfc3RhdGUuYnl0ZXNfcGFyc2VkXyArPSByZXN1bHQ7Ci0KLSAgLy8gU2VlIGlmIHdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGxpc3QuCi0gIGlmIChsaXN0X3N0YXRlLmJ5dGVzX3BhcnNlZF8gPT0gbGlzdF9zdGF0ZS5zaXplXykgewotICAgIGlmICghT25MaXN0RW5kKCkpCi0gICAgICByZXR1cm4gLTE7Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1ib29sIFdlYk1MaXN0UGFyc2VyOjpPbkxpc3RTdGFydChpbnQgaWQsIGludDY0IHNpemUpIHsKLSAgY29uc3QgTGlzdEVsZW1lbnRJbmZvKiBlbGVtZW50X2luZm8gPSBGaW5kTGlzdEluZm8oaWQpOwotICBpZiAoIWVsZW1lbnRfaW5mbykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW50IGN1cnJlbnRfbGV2ZWwgPSByb290X2xldmVsXyArIGxpc3Rfc3RhdGVfc3RhY2tfLnNpemUoKSAtIDE7Ci0gIGlmIChjdXJyZW50X2xldmVsICsgMSAhPSBlbGVtZW50X2luZm8tPmxldmVsXykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgV2ViTVBhcnNlckNsaWVudCogY3VycmVudF9saXN0X2NsaWVudCA9IE5VTEw7Ci0gIGlmICghbGlzdF9zdGF0ZV9zdGFja18uZW1wdHkoKSkgewotICAgIC8vIE1ha2Ugc3VyZSB0aGUgbmV3IGxpc3QgZG9lc24ndCBnbyBwYXN0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbGlzdC4KLSAgICBMaXN0U3RhdGUgY3VycmVudF9saXN0X3N0YXRlID0gbGlzdF9zdGF0ZV9zdGFja18uYmFjaygpOwotICAgIGlmIChjdXJyZW50X2xpc3Rfc3RhdGUuc2l6ZV8gIT0ga1dlYk1Vbmtub3duU2l6ZSAmJgotICAgICAgICBjdXJyZW50X2xpc3Rfc3RhdGUuc2l6ZV8gPCBjdXJyZW50X2xpc3Rfc3RhdGUuYnl0ZXNfcGFyc2VkXyArIHNpemUpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgY3VycmVudF9saXN0X2NsaWVudCA9IGN1cnJlbnRfbGlzdF9zdGF0ZS5jbGllbnRfOwotICB9IGVsc2UgewotICAgIGN1cnJlbnRfbGlzdF9jbGllbnQgPSByb290X2NsaWVudF87Ci0gIH0KLQotICBXZWJNUGFyc2VyQ2xpZW50KiBuZXdfbGlzdF9jbGllbnQgPSBjdXJyZW50X2xpc3RfY2xpZW50LT5Pbkxpc3RTdGFydChpZCk7Ci0gIGlmICghbmV3X2xpc3RfY2xpZW50KQotICAgIHJldHVybiBmYWxzZTsKLQotICBMaXN0U3RhdGUgbmV3X2xpc3Rfc3RhdGUgPSB7IGlkLCBzaXplLCAwLCBlbGVtZW50X2luZm8sIG5ld19saXN0X2NsaWVudCB9OwotICBsaXN0X3N0YXRlX3N0YWNrXy5wdXNoX2JhY2sobmV3X2xpc3Rfc3RhdGUpOwotCi0gIGlmIChzaXplID09IDApCi0gICAgcmV0dXJuIE9uTGlzdEVuZCgpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFdlYk1MaXN0UGFyc2VyOjpPbkxpc3RFbmQoKSB7Ci0gIGludCBsaXN0c19lbmRlZCA9IDA7Ci0gIGZvciAoOyAhbGlzdF9zdGF0ZV9zdGFja18uZW1wdHkoKTsgKytsaXN0c19lbmRlZCkgewotICAgIGNvbnN0IExpc3RTdGF0ZSYgbGlzdF9zdGF0ZSA9IGxpc3Rfc3RhdGVfc3RhY2tfLmJhY2soKTsKLQotICAgIGlmIChsaXN0X3N0YXRlLmJ5dGVzX3BhcnNlZF8gIT0gbGlzdF9zdGF0ZS5zaXplXykKLSAgICAgIGJyZWFrOwotCi0gICAgbGlzdF9zdGF0ZV9zdGFja18ucG9wX2JhY2soKTsKLQotICAgIGludDY0IGJ5dGVzX3BhcnNlZCA9IGxpc3Rfc3RhdGUuYnl0ZXNfcGFyc2VkXzsKLSAgICBXZWJNUGFyc2VyQ2xpZW50KiBjbGllbnQgPSBOVUxMOwotICAgIGlmICghbGlzdF9zdGF0ZV9zdGFja18uZW1wdHkoKSkgewotICAgICAgLy8gVXBkYXRlIHRoZSBieXRlc19wYXJzZWRfIGZvciB0aGUgcGFyZW50IGVsZW1lbnQuCi0gICAgICBsaXN0X3N0YXRlX3N0YWNrXy5iYWNrKCkuYnl0ZXNfcGFyc2VkXyArPSBieXRlc19wYXJzZWQ7Ci0gICAgICBjbGllbnQgPSBsaXN0X3N0YXRlX3N0YWNrXy5iYWNrKCkuY2xpZW50XzsKLSAgICB9IGVsc2UgewotICAgICAgY2xpZW50ID0gcm9vdF9jbGllbnRfOwotICAgIH0KLQotICAgIGlmICghY2xpZW50LT5Pbkxpc3RFbmQobGlzdF9zdGF0ZS5pZF8pKQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgRENIRUNLX0dFKGxpc3RzX2VuZGVkLCAxKTsKLQotICBpZiAobGlzdF9zdGF0ZV9zdGFja18uZW1wdHkoKSkKLSAgICBDaGFuZ2VTdGF0ZShET05FX1BBUlNJTkdfTElTVCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgV2ViTUxpc3RQYXJzZXI6OklzU2libGluZ09yQW5jZXN0b3IoaW50IGlkX2EsIGludCBpZF9iKSBjb25zdCB7Ci0gIERDSEVDSygoaWRfYSA9PSBrV2ViTUlkU2VnbWVudCkgfHwgKGlkX2EgPT0ga1dlYk1JZENsdXN0ZXIpKTsKLQotICBpZiAoaWRfYSA9PSBrV2ViTUlkQ2x1c3RlcikgewotICAgIC8vIGtXZWJNSWRDbHVzdGVyIHNpYmxpbmdzLgotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJyYXlzaXplKGtTZWdtZW50SWRzKTsgaSsrKSB7Ci0gICAgICBpZiAoa1NlZ21lbnRJZHNbaV0uaWRfID09IGlkX2IpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotCi0gIC8vIGtXZWJNSWRTZWdtZW50IHNpYmxpbmdzLgotICByZXR1cm4gKChpZF9iID09IGtXZWJNSWRTZWdtZW50KSB8fCAoaWRfYiA9PSBrV2ViTUlkRUJNTEhlYWRlcikpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS93ZWJtL3dlYm1fcGFyc2VyLmggYi9zcmMvbWVkaWEvd2VibS93ZWJtX3BhcnNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODYxMWE4Li4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS93ZWJtL3dlYm1fcGFyc2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9XRUJNX1dFQk1fUEFSU0VSX0hfCi0jZGVmaW5lIE1FRElBX1dFQk1fV0VCTV9QQVJTRVJfSF8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBJbnRlcmZhY2UgZm9yIHJlY2VpdmluZyBXZWJNIHBhcnNlciBldmVudHMuCi0vLwotLy8gRWFjaCBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYW4gZWxlbWVudCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgaXMgcGFyc2VkLgotLy8gVGhlIElEIG9mIHRoZSBlbGVtZW50IHRoYXQgd2FzIHBhcnNlZCBpcyBnaXZlbiBhbG9uZyB3aXRoIHRoZSB2YWx1ZQotLy8gc3RvcmVkIGluIHRoZSBlbGVtZW50LiBMaXN0IGVsZW1lbnRzIGdlbmVyYXRlIGNhbGxzIGF0IHRoZSBzdGFydCBhbmQKLS8vIGVuZCBvZiB0aGUgbGlzdC4gQW55IHBvaW50ZXJzIHBhc3NlZCB0byB0aGVzZSBtZXRob2RzIGFyZSBvbmx5IGd1YXJhbnRlZWQKLS8vIHRvIGJlIHZhbGlkIGZvciB0aGUgbGlmZSBvZiB0aGF0IGNhbGwuIEVhY2ggbWV0aG9kIChleGNlcHQgZm9yIE9uTGlzdFN0YXJ0KQotLy8gcmV0dXJucyBhIGJvb2wgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgcGFyc2VkIGRhdGEgaXMgdmFsaWQuIE9uTGlzdFN0YXJ0Ci0vLyByZXR1cm5zIGEgcG9pbnRlciB0byBhIFdlYk1QYXJzZXJDbGllbnQgb2JqZWN0LCB3aGljaCBzaG91bGQgYmUgdXNlZCB0bwotLy8gaGFuZGxlIGVsZW1lbnRzIHBhcnNlZCBvdXQgb2YgdGhlIGxpc3QgYmVpbmcgc3RhcnRlZC4gSWYgZmFsc2UgKG9yIE5VTEwgYnkKLS8vIE9uTGlzdFN0YXJ0KSBpcyByZXR1cm5lZCB0aGVuIHRoZSBwYXJzZSBpcyBpbW1lZGlhdGVseSB0ZXJtaW5hdGVkIGFuZCBhbgotLy8gZXJyb3IgaXMgcmVwb3J0ZWQgYnkgdGhlIHBhcnNlci4KLWNsYXNzIE1FRElBX0VYUE9SVCBXZWJNUGFyc2VyQ2xpZW50IHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfldlYk1QYXJzZXJDbGllbnQoKTsKLQotICB2aXJ0dWFsIFdlYk1QYXJzZXJDbGllbnQqIE9uTGlzdFN0YXJ0KGludCBpZCk7Ci0gIHZpcnR1YWwgYm9vbCBPbkxpc3RFbmQoaW50IGlkKTsKLSAgdmlydHVhbCBib29sIE9uVUludChpbnQgaWQsIGludDY0IHZhbCk7Ci0gIHZpcnR1YWwgYm9vbCBPbkZsb2F0KGludCBpZCwgZG91YmxlIHZhbCk7Ci0gIHZpcnR1YWwgYm9vbCBPbkJpbmFyeShpbnQgaWQsIGNvbnN0IHVpbnQ4KiBkYXRhLCBpbnQgc2l6ZSk7Ci0gIHZpcnR1YWwgYm9vbCBPblN0cmluZyhpbnQgaWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gcHJvdGVjdGVkOgotICBXZWJNUGFyc2VyQ2xpZW50KCk7Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFdlYk1QYXJzZXJDbGllbnQpOwotfTsKLQotc3RydWN0IExpc3RFbGVtZW50SW5mbzsKLQotLy8gUGFyc2VzIGEgV2ViTSBsaXN0IGVsZW1lbnQgYW5kIGFsbCBvZiBpdHMgY2hpbGRyZW4uIFRoaXMKLS8vIGNsYXNzIHN1cHBvcnRzIGluY3JlbWVudGFsIHBhcnNpbmcgb2YgdGhlIGxpc3Qgc28gUGFyc2UoKQotLy8gY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB3aXRoIHBpZWNlcyBvZiB0aGUgbGlzdC4KLS8vIElzUGFyc2luZ0NvbXBsZXRlKCkgd2lsbCByZXR1cm4gdHJ1ZSBvbmNlIHRoZSBlbnRpcmUgbGlzdCBoYXMKLS8vIGJlZW4gcGFyc2VkLgotY2xhc3MgTUVESUFfRVhQT1JUIFdlYk1MaXN0UGFyc2VyIHsKLSBwdWJsaWM6Ci0gIC8vIHxpZHwgLSBFbGVtZW50IElEIG9mIHRoZSBsaXN0IHdlIGludGVuZCB0byBwYXJzZS4KLSAgLy8gfGNsaWVudHwgLSBDYWxsZWQgYXMgZGlmZmVyZW50IGVsZW1lbnRzIGluIHRoZSBsaXN0IGFyZSBwYXJzZWQuCi0gIFdlYk1MaXN0UGFyc2VyKGludCBpZCwgV2ViTVBhcnNlckNsaWVudCogY2xpZW50KTsKLSAgfldlYk1MaXN0UGFyc2VyKCk7Ci0KLSAgLy8gUmVzZXRzIHRoZSBzdGF0ZSBvZiB0aGUgcGFyc2VyIHNvIGl0IGNhbiBzdGFydCBwYXJzaW5nIGEgbmV3IGxpc3QuCi0gIHZvaWQgUmVzZXQoKTsKLQotICAvLyBQYXJzZXMgbGlzdCBkYXRhIGNvbnRhaW5lZCBpbiB8YnVmfC4KLSAgLy8KLSAgLy8gUmV0dXJucyA8IDAgaWYgdGhlIHBhcnNlIGZhaWxzLgotICAvLyBSZXR1cm5zIDAgaWYgbW9yZSBkYXRhIGlzIG5lZWRlZC4KLSAgLy8gUmV0dXJuaW5nID4gMCBpbmRpY2F0ZXMgc3VjY2VzcyAmIHRoZSBudW1iZXIgb2YgYnl0ZXMgcGFyc2VkLgotICBpbnQgUGFyc2UoY29uc3QgdWludDgqIGJ1ZiwgaW50IHNpemUpOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW50aXJlIGxpc3QgaGFzIGJlZW4gcGFyc2VkLgotICBib29sIElzUGFyc2luZ0NvbXBsZXRlKCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBlbnVtIFN0YXRlIHsKLSAgICBORUVEX0xJU1RfSEVBREVSLAotICAgIElOU0lERV9MSVNULAotICAgIERPTkVfUEFSU0lOR19MSVNULAotICAgIFBBUlNFX0VSUk9SLAotICB9OwotCi0gIHN0cnVjdCBMaXN0U3RhdGUgewotICAgIGludCBpZF87Ci0gICAgaW50NjQgc2l6ZV87Ci0gICAgaW50NjQgYnl0ZXNfcGFyc2VkXzsKLSAgICBjb25zdCBMaXN0RWxlbWVudEluZm8qIGVsZW1lbnRfaW5mb187Ci0gICAgV2ViTVBhcnNlckNsaWVudCogY2xpZW50XzsKLSAgfTsKLQotICB2b2lkIENoYW5nZVN0YXRlKFN0YXRlIG5ld19zdGF0ZSk7Ci0KLSAgLy8gUGFyc2VzIGEgc2luZ2xlIGVsZW1lbnQgaW4gdGhlIGN1cnJlbnQgbGlzdC4KLSAgLy8KLSAgLy8gfGhlYWRlcl9zaXplfCAtIFRoZSBzaXplIG9mIHRoZSBlbGVtZW50IGhlYWRlcgotICAvLyB8aWR8IC0gVGhlIElEIG9mIHRoZSBlbGVtZW50IGJlaW5nIHBhcnNlZC4KLSAgLy8gfGVsZW1lbnRfc2l6ZXwgLSBUaGUgc2l6ZSBvZiB0aGUgZWxlbWVudCBib2R5LgotICAvLyB8ZGF0YXwgLSBQb2ludGVyIHRvIHRoZSBlbGVtZW50IGNvbnRlbnRzLgotICAvLyB8c2l6ZXwgLSBOdW1iZXIgb2YgYnl0ZXMgaW4gfGRhdGF8Ci0gIC8vIHxjbGllbnR8IC0gQ2xpZW50IHRvIHBhc3MgdGhlIHBhcnNlZCBkYXRhIHRvLgotICAvLwotICAvLyBSZXR1cm5zIDwgMCBpZiB0aGUgcGFyc2UgZmFpbHMuCi0gIC8vIFJldHVybnMgMCBpZiBtb3JlIGRhdGEgaXMgbmVlZGVkLgotICAvLyBSZXR1cm5pbmcgPiAwIGluZGljYXRlcyBzdWNjZXNzICYgdGhlIG51bWJlciBvZiBieXRlcyBwYXJzZWQuCi0gIGludCBQYXJzZUxpc3RFbGVtZW50KGludCBoZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkLCBpbnQ2NCBlbGVtZW50X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBkYXRhLCBpbnQgc2l6ZSk7Ci0KLSAgLy8gQ2FsbGVkIHdoZW4gc3RhcnRpbmcgdG8gcGFyc2UgYSBuZXcgbGlzdC4KLSAgLy8KLSAgLy8gfGlkfCAtIFRoZSBJRCBvZiB0aGUgbmV3IGxpc3QuCi0gIC8vIHxzaXplfCAtIFRoZSBzaXplIG9mIHRoZSBuZXcgbGlzdC4KLSAgLy8gfGNsaWVudHwgLSBUaGUgY2xpZW50IG9iamVjdCB0byBub3RpZnkgdGhhdCBhIG5ldyBsaXN0IGlzIGJlaW5nIHBhcnNlZC4KLSAgLy8KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgbGlzdCBjYW4gYmUgc3RhcnRlZCBpbiB0aGUgY3VycmVudCBjb250ZXh0LiBGYWxzZQotICAvLyBpZiBzdGFydGluZyB0aGlzIGxpc3QgY2F1c2VzIHNvbWUgc29ydCBvZiBwYXJzZSBlcnJvci4KLSAgYm9vbCBPbkxpc3RTdGFydChpbnQgaWQsIGludDY0IHNpemUpOwotCi0gIC8vIENhbGxlZCB3aGVuIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbGlzdCBoYXMgYmVlbiByZWFjaGVkLiBUaGlzIG1heSBhbHNvCi0gIC8vIHNpZ25hbCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGxpc3QncyBhbmNlc3RvcnMgaWYgdGhlIGN1cnJlbnQgbGlzdCBoYXBwZW5zCi0gIC8vIHRvIGJlIGF0IHRoZSBlbmQgb2YgaXRzIHBhcmVudC4KLSAgLy8KLSAgLy8gUmV0dXJucyB0cnVlIGlmIG5vIGVycm9ycyBvY2N1cnJlZCB3aGlsZSBlbmRpbmcgdGhpcyBsaXN0KHMpLgotICBib29sIE9uTGlzdEVuZCgpOwotCi0gIC8vIENoZWNrcyB0byBzZWUgaWYgfGlkX2J8IGlzIGEgc2libGluZyBvciBhbmNlc3RvciBvZiB8aWRfYXwuCi0gIGJvb2wgSXNTaWJsaW5nT3JBbmNlc3RvcihpbnQgaWRfYSwgaW50IGlkX2IpIGNvbnN0OwotCi0gIFN0YXRlIHN0YXRlXzsKLQotICAvLyBFbGVtZW50IElEIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCi0gIGNvbnN0IGludCByb290X2lkXzsKLQotICAvLyBFbGVtZW50IGxldmVsIGZvciB8cm9vdF9pZF98LiBVc2VkIHRvIHZlcmlmeSB0aGF0IGVsZW1lbnRzIGFwcGVhciBhdAotICAvLyB0aGUgY29ycmVjdCBsZXZlbC4KLSAgY29uc3QgaW50IHJvb3RfbGV2ZWxfOwotCi0gIC8vIFdlYk1QYXJzZXJDbGllbnQgdG8gaGFuZGxlIHRoZSByb290IGxpc3QuCi0gIFdlYk1QYXJzZXJDbGllbnQqIGNvbnN0IHJvb3RfY2xpZW50XzsKLQotICAvLyBTdGFjayBvZiBzdGF0ZSBmb3IgYWxsIHRoZSBsaXN0cyBjdXJyZW50bHkgYmVpbmcgcGFyc2VkLiBMaXN0cyBhcmUKLSAgLy8gYWRkZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGlzIHN0YWNrIGFzIHRoZXkgYXJlIHBhcnNlZC4KLSAgc3RkOjp2ZWN0b3I8TGlzdFN0YXRlPiBsaXN0X3N0YXRlX3N0YWNrXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oV2ViTUxpc3RQYXJzZXIpOwotfTsKLQotLy8gUGFyc2VzIGFuIGVsZW1lbnQgaGVhZGVyICYgcmV0dXJucyB0aGUgSUQgYW5kIGVsZW1lbnQgc2l6ZS4KLS8vCi0vLyBSZXR1cm5zIDwgMCBpZiB0aGUgcGFyc2UgZmFpbHMuCi0vLyBSZXR1cm5zIDAgaWYgbW9yZSBkYXRhIGlzIG5lZWRlZC4KLS8vIFJldHVybmluZyA+IDAgaW5kaWNhdGVzIHN1Y2Nlc3MgJiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBhcnNlZC4KLS8vIHwqaWR8IGNvbnRhaW5zIHRoZSBlbGVtZW50IElEIG9uIHN1Y2Nlc3MgYW5kIGlzIHVuZGVmaW5lZCBvdGhlcndpc2UuCi0vLyB8KmVsZW1lbnRfc2l6ZXwgY29udGFpbnMgdGhlIGVsZW1lbnQgc2l6ZSBvbiBzdWNjZXNzIGFuZCBpcyB1bmRlZmluZWQKLS8vICAgICAgICAgICAgICAgICBvdGhlcndpc2UuCi1pbnQgTUVESUFfRVhQT1JUIFdlYk1QYXJzZUVsZW1lbnRIZWFkZXIoY29uc3QgdWludDgqIGJ1ZiwgaW50IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBpZCwgaW50NjQqIGVsZW1lbnRfc2l6ZSk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX1dFQk1fV0VCTV9QQVJTRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS93ZWJtL3dlYm1fcGFyc2VyX3VuaXR0ZXN0LmNjIGIvc3JjL21lZGlhL3dlYm0vd2VibV9wYXJzZXJfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMTQwYTYuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3dlYm0vd2VibV9wYXJzZXJfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL3dlYm0vY2x1c3Rlcl9idWlsZGVyLmgiCi0jaW5jbHVkZSAibWVkaWEvd2VibS93ZWJtX2NvbnN0YW50cy5oIgotI2luY2x1ZGUgIm1lZGlhL3dlYm0vd2VibV9wYXJzZXIuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgOjp0ZXN0aW5nOjpJblNlcXVlbmNlOwotdXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47Ci11c2luZyA6OnRlc3Rpbmc6OlJldHVybk51bGw7Ci11c2luZyA6OnRlc3Rpbmc6OlN0cmljdE1vY2s7Ci11c2luZyA6OnRlc3Rpbmc6Ol87Ci0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWVudW0geyBrQmxvY2tDb3VudCA9IDUgfTsKLQotY2xhc3MgTW9ja1dlYk1QYXJzZXJDbGllbnQgOiBwdWJsaWMgV2ViTVBhcnNlckNsaWVudCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5Nb2NrV2ViTVBhcnNlckNsaWVudCgpIHt9Ci0KLSAgLy8gV2ViTVBhcnNlckNsaWVudCBtZXRob2RzLgotICBNT0NLX01FVEhPRDEoT25MaXN0U3RhcnQsIFdlYk1QYXJzZXJDbGllbnQqKGludCkpOwotICBNT0NLX01FVEhPRDEoT25MaXN0RW5kLCBib29sKGludCkpOwotICBNT0NLX01FVEhPRDIoT25VSW50LCBib29sKGludCwgaW50NjQpKTsKLSAgTU9DS19NRVRIT0QyKE9uRmxvYXQsIGJvb2woaW50LCBkb3VibGUpKTsKLSAgTU9DS19NRVRIT0QzKE9uQmluYXJ5LCBib29sKGludCwgY29uc3QgdWludDgqLCBpbnQpKTsKLSAgTU9DS19NRVRIT0QyKE9uU3RyaW5nLCBib29sKGludCwgY29uc3Qgc3RkOjpzdHJpbmcmKSk7Ci19OwotCi1jbGFzcyBXZWJNUGFyc2VyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIFN0cmljdE1vY2s8TW9ja1dlYk1QYXJzZXJDbGllbnQ+IGNsaWVudF87Ci19OwotCi1zdGF0aWMgc2NvcGVkX3B0cjxDbHVzdGVyPiBDcmVhdGVDbHVzdGVyKGludCBibG9ja19jb3VudCkgewotICBDbHVzdGVyQnVpbGRlciBjYjsKLSAgY2IuU2V0Q2x1c3RlclRpbWVjb2RlKDApOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgYmxvY2tfY291bnQ7IGkrKykgewotICAgIHVpbnQ4IGRhdGFbXSA9IHsgMHgwMCB9OwotICAgIGNiLkFkZFNpbXBsZUJsb2NrKDAsIGksIDAsIGRhdGEsIHNpemVvZihkYXRhKSk7Ci0gIH0KLQotICByZXR1cm4gY2IuRmluaXNoKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIENyZWF0ZUNsdXN0ZXJFeHBlY3RhdGlvbnMoaW50IGJsb2NrX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2NvbXBsZXRlX2NsdXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vY2tXZWJNUGFyc2VyQ2xpZW50KiBjbGllbnQpIHsKLQotICBJblNlcXVlbmNlIHM7Ci0gIEVYUEVDVF9DQUxMKCpjbGllbnQsIE9uTGlzdFN0YXJ0KGtXZWJNSWRDbHVzdGVyKSkuV2lsbE9uY2UoUmV0dXJuKGNsaWVudCkpOwotICBFWFBFQ1RfQ0FMTCgqY2xpZW50LCBPblVJbnQoa1dlYk1JZFRpbWVjb2RlLCAwKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4odHJ1ZSkpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgYmxvY2tfY291bnQ7IGkrKykgewotICAgIEVYUEVDVF9DQUxMKCpjbGllbnQsIE9uQmluYXJ5KGtXZWJNSWRTaW1wbGVCbG9jaywgXywgXykpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4odHJ1ZSkpOwotICB9Ci0KLSAgaWYgKGlzX2NvbXBsZXRlX2NsdXN0ZXIpCi0gICAgRVhQRUNUX0NBTEwoKmNsaWVudCwgT25MaXN0RW5kKGtXZWJNSWRDbHVzdGVyKSkuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKLX0KLQotVEVTVF9GKFdlYk1QYXJzZXJUZXN0LCBFbXB0eUNsdXN0ZXIpIHsKLSAgY29uc3QgdWludDgga0VtcHR5Q2x1c3RlcltdID0gewotICAgIDB4MUYsIDB4NDMsIDB4QjYsIDB4NzUsIDB4ODAgIC8vIENMVVNURVIgKHNpemUgPSAwKQotICB9OwotICBpbnQgc2l6ZSA9IHNpemVvZihrRW1wdHlDbHVzdGVyKTsKLQotICBJblNlcXVlbmNlIHM7Ci0gIEVYUEVDVF9DQUxMKGNsaWVudF8sIE9uTGlzdFN0YXJ0KGtXZWJNSWRDbHVzdGVyKSkuV2lsbE9uY2UoUmV0dXJuKCZjbGllbnRfKSk7Ci0gIEVYUEVDVF9DQUxMKGNsaWVudF8sIE9uTGlzdEVuZChrV2ViTUlkQ2x1c3RlcikpLldpbGxPbmNlKFJldHVybih0cnVlKSk7Ci0KLSAgV2ViTUxpc3RQYXJzZXIgcGFyc2VyKGtXZWJNSWRDbHVzdGVyLCAmY2xpZW50Xyk7Ci0gIGludCByZXN1bHQgPSBwYXJzZXIuUGFyc2Uoa0VtcHR5Q2x1c3Rlciwgc2l6ZSk7Ci0gIEVYUEVDVF9FUShzaXplLCByZXN1bHQpOwotICBFWFBFQ1RfVFJVRShwYXJzZXIuSXNQYXJzaW5nQ29tcGxldGUoKSk7Ci19Ci0KLVRFU1RfRihXZWJNUGFyc2VyVGVzdCwgRW1wdHlDbHVzdGVySW5TZWdtZW50KSB7Ci0gIGNvbnN0IHVpbnQ4IGtCdWZmZXJbXSA9IHsKLSAgICAweDE4LCAweDUzLCAweDgwLCAweDY3LCAweDg1LCAgLy8gU0VHTUVOVCAoc2l6ZSA9IDUpCi0gICAgMHgxRiwgMHg0MywgMHhCNiwgMHg3NSwgMHg4MCwgIC8vIENMVVNURVIgKHNpemUgPSAwKQotICB9OwotICBpbnQgc2l6ZSA9IHNpemVvZihrQnVmZmVyKTsKLQotICBJblNlcXVlbmNlIHM7Ci0gIEVYUEVDVF9DQUxMKGNsaWVudF8sIE9uTGlzdFN0YXJ0KGtXZWJNSWRTZWdtZW50KSkuV2lsbE9uY2UoUmV0dXJuKCZjbGllbnRfKSk7Ci0gIEVYUEVDVF9DQUxMKGNsaWVudF8sIE9uTGlzdFN0YXJ0KGtXZWJNSWRDbHVzdGVyKSkuV2lsbE9uY2UoUmV0dXJuKCZjbGllbnRfKSk7Ci0gIEVYUEVDVF9DQUxMKGNsaWVudF8sIE9uTGlzdEVuZChrV2ViTUlkQ2x1c3RlcikpLldpbGxPbmNlKFJldHVybih0cnVlKSk7Ci0gIEVYUEVDVF9DQUxMKGNsaWVudF8sIE9uTGlzdEVuZChrV2ViTUlkU2VnbWVudCkpLldpbGxPbmNlKFJldHVybih0cnVlKSk7Ci0KLSAgV2ViTUxpc3RQYXJzZXIgcGFyc2VyKGtXZWJNSWRTZWdtZW50LCAmY2xpZW50Xyk7Ci0gIGludCByZXN1bHQgPSBwYXJzZXIuUGFyc2Uoa0J1ZmZlciwgc2l6ZSk7Ci0gIEVYUEVDVF9FUShzaXplLCByZXN1bHQpOwotICBFWFBFQ1RfVFJVRShwYXJzZXIuSXNQYXJzaW5nQ29tcGxldGUoKSk7Ci19Ci0KLS8vIFRlc3QgdGhlIGNhc2Ugd2hlcmUgYSBub24tbGlzdCBjaGlsZCBlbGVtZW50IGhhcyBhIHNpemUKLS8vIHRoYXQgaXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHBhcmVudC4KLVRFU1RfRihXZWJNUGFyc2VyVGVzdCwgQ2hpbGROb25MaXN0TGFyZ2VyVGhhblBhcmVudCkgewotICBjb25zdCB1aW50OCBrQnVmZmVyW10gPSB7Ci0gICAgMHgxRiwgMHg0MywgMHhCNiwgMHg3NSwgMHg4MSwgIC8vIENMVVNURVIgKHNpemUgPSAxKQotICAgIDB4RTcsIDB4ODEsIDB4MDEsICAvLyBUaW1lY29kZSAoc2l6ZT0xLCB2YWx1ZT0xKQotICB9OwotICBpbnQgc2l6ZSA9IHNpemVvZihrQnVmZmVyKTsKLQotICBJblNlcXVlbmNlIHM7Ci0gIEVYUEVDVF9DQUxMKGNsaWVudF8sIE9uTGlzdFN0YXJ0KGtXZWJNSWRDbHVzdGVyKSkuV2lsbE9uY2UoUmV0dXJuKCZjbGllbnRfKSk7Ci0KLSAgV2ViTUxpc3RQYXJzZXIgcGFyc2VyKGtXZWJNSWRDbHVzdGVyLCAmY2xpZW50Xyk7Ci0gIGludCByZXN1bHQgPSBwYXJzZXIuUGFyc2Uoa0J1ZmZlciwgc2l6ZSk7Ci0gIEVYUEVDVF9FUSgtMSwgcmVzdWx0KTsKLSAgRVhQRUNUX0ZBTFNFKHBhcnNlci5Jc1BhcnNpbmdDb21wbGV0ZSgpKTsKLX0KLQotLy8gVGVzdCB0aGUgY2FzZSB3aGVyZSBhIGxpc3QgY2hpbGQgZWxlbWVudCBoYXMgYSBzaXplCi0vLyB0aGF0IGlzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBwYXJlbnQuCi1URVNUX0YoV2ViTVBhcnNlclRlc3QsIENoaWxkTGlzdExhcmdlclRoYW5QYXJlbnQpIHsKLSAgY29uc3QgdWludDgga0J1ZmZlcltdID0gewotICAgIDB4MTgsIDB4NTMsIDB4ODAsIDB4NjcsIDB4ODUsICAvLyBTRUdNRU5UIChzaXplID0gNSkKLSAgICAweDFGLCAweDQzLCAweEI2LCAweDc1LCAweDgxLCAweDExICAvLyBDTFVTVEVSIChzaXplID0gMSkKLSAgfTsKLSAgaW50IHNpemUgPSBzaXplb2Yoa0J1ZmZlcik7Ci0KLSAgSW5TZXF1ZW5jZSBzOwotICBFWFBFQ1RfQ0FMTChjbGllbnRfLCBPbkxpc3RTdGFydChrV2ViTUlkU2VnbWVudCkpLldpbGxPbmNlKFJldHVybigmY2xpZW50XykpOwotCi0gIFdlYk1MaXN0UGFyc2VyIHBhcnNlcihrV2ViTUlkU2VnbWVudCwgJmNsaWVudF8pOwotICBpbnQgcmVzdWx0ID0gcGFyc2VyLlBhcnNlKGtCdWZmZXIsIHNpemUpOwotICBFWFBFQ1RfRVEoLTEsIHJlc3VsdCk7Ci0gIEVYUEVDVF9GQUxTRShwYXJzZXIuSXNQYXJzaW5nQ29tcGxldGUoKSk7Ci19Ci0KLS8vIEV4cGVjdGluZyB0byBwYXJzZSBhIENsdXN0ZXIsIGJ1dCBnZXQgYSBTZWdtZW50LgotVEVTVF9GKFdlYk1QYXJzZXJUZXN0LCBMaXN0SWREb2VzTm90TWF0Y2gpIHsKLSAgY29uc3QgdWludDgga0J1ZmZlcltdID0gewotICAgIDB4MTgsIDB4NTMsIDB4ODAsIDB4NjcsIDB4ODAsICAvLyBTRUdNRU5UIChzaXplID0gMCkKLSAgfTsKLSAgaW50IHNpemUgPSBzaXplb2Yoa0J1ZmZlcik7Ci0KLSAgV2ViTUxpc3RQYXJzZXIgcGFyc2VyKGtXZWJNSWRDbHVzdGVyLCAmY2xpZW50Xyk7Ci0gIGludCByZXN1bHQgPSBwYXJzZXIuUGFyc2Uoa0J1ZmZlciwgc2l6ZSk7Ci0gIEVYUEVDVF9FUSgtMSwgcmVzdWx0KTsKLSAgRVhQRUNUX0ZBTFNFKHBhcnNlci5Jc1BhcnNpbmdDb21wbGV0ZSgpKTsKLX0KLQotVEVTVF9GKFdlYk1QYXJzZXJUZXN0LCBJbnZhbGlkRWxlbWVudEluTGlzdCkgewotICBjb25zdCB1aW50OCBrQnVmZmVyW10gPSB7Ci0gICAgMHgxOCwgMHg1MywgMHg4MCwgMHg2NywgMHg4MiwgIC8vIFNFR01FTlQgKHNpemUgPSAyKQotICAgIDB4QUUsIDB4ODAsICAvLyBUcmFja0VudHJ5IChzaXplID0gMCkKLSAgfTsKLSAgaW50IHNpemUgPSBzaXplb2Yoa0J1ZmZlcik7Ci0KLSAgSW5TZXF1ZW5jZSBzOwotICBFWFBFQ1RfQ0FMTChjbGllbnRfLCBPbkxpc3RTdGFydChrV2ViTUlkU2VnbWVudCkpLldpbGxPbmNlKFJldHVybigmY2xpZW50XykpOwotCi0gIFdlYk1MaXN0UGFyc2VyIHBhcnNlcihrV2ViTUlkU2VnbWVudCwgJmNsaWVudF8pOwotICBpbnQgcmVzdWx0ID0gcGFyc2VyLlBhcnNlKGtCdWZmZXIsIHNpemUpOwotICBFWFBFQ1RfRVEoLTEsIHJlc3VsdCk7Ci0gIEVYUEVDVF9GQUxTRShwYXJzZXIuSXNQYXJzaW5nQ29tcGxldGUoKSk7Ci19Ci0KLVRFU1RfRihXZWJNUGFyc2VyVGVzdCwgVm9pZEFuZENSQzMySW5MaXN0KSB7Ci0gIGNvbnN0IHVpbnQ4IGtCdWZmZXJbXSA9IHsKLSAgICAweDE4LCAweDUzLCAweDgwLCAweDY3LCAweDk5LCAgLy8gU0VHTUVOVCAoc2l6ZSA9IDI1KQotICAgIDB4RUMsIDB4ODMsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyBWb2lkIChzaXplID0gMykKLSAgICAweEJGLCAweDgzLCAweDAwLCAweDAwLCAweDAwLCAgLy8gQ1JDMzIgKHNpemUgPSAzKQotICAgIDB4MUYsIDB4NDMsIDB4QjYsIDB4NzUsIDB4OEEsICAvLyBDTFVTVEVSIChzaXplID0gMTApCi0gICAgMHhFQywgMHg4MywgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIFZvaWQgKHNpemUgPSAzKQotICAgIDB4QkYsIDB4ODMsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyBDUkMzMiAoc2l6ZSA9IDMpCi0gIH07Ci0gIGludCBzaXplID0gc2l6ZW9mKGtCdWZmZXIpOwotCi0gIEluU2VxdWVuY2UgczsKLSAgRVhQRUNUX0NBTEwoY2xpZW50XywgT25MaXN0U3RhcnQoa1dlYk1JZFNlZ21lbnQpKS5XaWxsT25jZShSZXR1cm4oJmNsaWVudF8pKTsKLSAgRVhQRUNUX0NBTEwoY2xpZW50XywgT25MaXN0U3RhcnQoa1dlYk1JZENsdXN0ZXIpKS5XaWxsT25jZShSZXR1cm4oJmNsaWVudF8pKTsKLSAgRVhQRUNUX0NBTEwoY2xpZW50XywgT25MaXN0RW5kKGtXZWJNSWRDbHVzdGVyKSkuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKLSAgRVhQRUNUX0NBTEwoY2xpZW50XywgT25MaXN0RW5kKGtXZWJNSWRTZWdtZW50KSkuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKLQotICBXZWJNTGlzdFBhcnNlciBwYXJzZXIoa1dlYk1JZFNlZ21lbnQsICZjbGllbnRfKTsKLSAgaW50IHJlc3VsdCA9IHBhcnNlci5QYXJzZShrQnVmZmVyLCBzaXplKTsKLSAgRVhQRUNUX0VRKHNpemUsIHJlc3VsdCk7Ci0gIEVYUEVDVF9UUlVFKHBhcnNlci5Jc1BhcnNpbmdDb21wbGV0ZSgpKTsKLX0KLQotCi1URVNUX0YoV2ViTVBhcnNlclRlc3QsIFBhcnNlTGlzdEVsZW1lbnRXaXRoU2luZ2xlQ2FsbCkgewotICBzY29wZWRfcHRyPENsdXN0ZXI+IGNsdXN0ZXIoQ3JlYXRlQ2x1c3RlcihrQmxvY2tDb3VudCkpOwotICBDcmVhdGVDbHVzdGVyRXhwZWN0YXRpb25zKGtCbG9ja0NvdW50LCB0cnVlLCAmY2xpZW50Xyk7Ci0KLSAgV2ViTUxpc3RQYXJzZXIgcGFyc2VyKGtXZWJNSWRDbHVzdGVyLCAmY2xpZW50Xyk7Ci0gIGludCByZXN1bHQgPSBwYXJzZXIuUGFyc2UoY2x1c3Rlci0+ZGF0YSgpLCBjbHVzdGVyLT5zaXplKCkpOwotICBFWFBFQ1RfRVEoY2x1c3Rlci0+c2l6ZSgpLCByZXN1bHQpOwotICBFWFBFQ1RfVFJVRShwYXJzZXIuSXNQYXJzaW5nQ29tcGxldGUoKSk7Ci19Ci0KLVRFU1RfRihXZWJNUGFyc2VyVGVzdCwgUGFyc2VMaXN0RWxlbWVudFdpdGhNdWx0aXBsZUNhbGxzKSB7Ci0gIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gY2x1c3RlcihDcmVhdGVDbHVzdGVyKGtCbG9ja0NvdW50KSk7Ci0gIENyZWF0ZUNsdXN0ZXJFeHBlY3RhdGlvbnMoa0Jsb2NrQ291bnQsIHRydWUsICZjbGllbnRfKTsKLQotICBjb25zdCB1aW50OCogZGF0YSA9IGNsdXN0ZXItPmRhdGEoKTsKLSAgaW50IHNpemUgPSBjbHVzdGVyLT5zaXplKCk7Ci0gIGludCBkZWZhdWx0X3BhcnNlX3NpemUgPSAzOwotICBXZWJNTGlzdFBhcnNlciBwYXJzZXIoa1dlYk1JZENsdXN0ZXIsICZjbGllbnRfKTsKLSAgaW50IHBhcnNlX3NpemUgPSBzdGQ6Om1pbihkZWZhdWx0X3BhcnNlX3NpemUsIHNpemUpOwotCi0gIHdoaWxlIChzaXplID4gMCkgewotICAgIGludCByZXN1bHQgPSBwYXJzZXIuUGFyc2UoZGF0YSwgcGFyc2Vfc2l6ZSk7Ci0gICAgQVNTRVJUX0dFKHJlc3VsdCwgMCk7Ci0gICAgQVNTRVJUX0xFKHJlc3VsdCwgcGFyc2Vfc2l6ZSk7Ci0KLSAgICBpZiAocmVzdWx0ID09IDApIHsKLSAgICAgIC8vIFRoZSBwYXJzZXIgbmVlZHMgbW9yZSBkYXRhIHNvIGluY3JlYXNlIHRoZSBwYXJzZV9zaXplIGEgbGl0dGxlLgotICAgICAgRVhQRUNUX0ZBTFNFKHBhcnNlci5Jc1BhcnNpbmdDb21wbGV0ZSgpKTsKLSAgICAgIHBhcnNlX3NpemUgKz0gZGVmYXVsdF9wYXJzZV9zaXplOwotICAgICAgcGFyc2Vfc2l6ZSA9IHN0ZDo6bWluKHBhcnNlX3NpemUsIHNpemUpOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgcGFyc2Vfc2l6ZSA9IGRlZmF1bHRfcGFyc2Vfc2l6ZTsKLQotICAgIGRhdGEgKz0gcmVzdWx0OwotICAgIHNpemUgLT0gcmVzdWx0OwotCi0gICAgRVhQRUNUX0VRKChzaXplID09IDApLCBwYXJzZXIuSXNQYXJzaW5nQ29tcGxldGUoKSk7Ci0gIH0KLSAgRVhQRUNUX1RSVUUocGFyc2VyLklzUGFyc2luZ0NvbXBsZXRlKCkpOwotfQotCi1URVNUX0YoV2ViTVBhcnNlclRlc3QsIFRlc3RSZXNldCkgewotICBJblNlcXVlbmNlIHM7Ci0gIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gY2x1c3RlcihDcmVhdGVDbHVzdGVyKGtCbG9ja0NvdW50KSk7Ci0KLSAgLy8gRmlyc3QgZXhwZWN0IGFsbCBidXQgdGhlIGxhc3QgYmxvY2suCi0gIENyZWF0ZUNsdXN0ZXJFeHBlY3RhdGlvbnMoa0Jsb2NrQ291bnQgLSAxLCBmYWxzZSwgJmNsaWVudF8pOwotCi0gIC8vIE5vdyBleHBlY3QgYWxsIGJsb2Nrcy4KLSAgQ3JlYXRlQ2x1c3RlckV4cGVjdGF0aW9ucyhrQmxvY2tDb3VudCwgdHJ1ZSwgJmNsaWVudF8pOwotCi0gIFdlYk1MaXN0UGFyc2VyIHBhcnNlcihrV2ViTUlkQ2x1c3RlciwgJmNsaWVudF8pOwotCi0gIC8vIFNlbmQgc2xpZ2h0bHkgbGVzcyB0aGFuIHRoZSBmdWxsIGNsdXN0ZXIgc28gYWxsIGJ1dCB0aGUgbGFzdCBibG9jayBpcwotICAvLyBwYXJzZWQuCi0gIGludCByZXN1bHQgPSBwYXJzZXIuUGFyc2UoY2x1c3Rlci0+ZGF0YSgpLCBjbHVzdGVyLT5zaXplKCkgLSAxKTsKLSAgRVhQRUNUX0dUKHJlc3VsdCwgMCk7Ci0gIEVYUEVDVF9MVChyZXN1bHQsIGNsdXN0ZXItPnNpemUoKSk7Ci0gIEVYUEVDVF9GQUxTRShwYXJzZXIuSXNQYXJzaW5nQ29tcGxldGUoKSk7Ci0KLSAgcGFyc2VyLlJlc2V0KCk7Ci0KLSAgLy8gTm93IHBhcnNlIGEgd2hvbGUgY2x1c3RlciB0byB2ZXJpZnkgdGhhdCBhbGwgdGhlIGJsb2NrcyB3aWxsIGdldCBwYXJzZWQuCi0gIHJlc3VsdCA9IHBhcnNlci5QYXJzZShjbHVzdGVyLT5kYXRhKCksIGNsdXN0ZXItPnNpemUoKSk7Ci0gIEVYUEVDVF9FUShyZXN1bHQsIGNsdXN0ZXItPnNpemUoKSk7Ci0gIEVYUEVDVF9UUlVFKHBhcnNlci5Jc1BhcnNpbmdDb21wbGV0ZSgpKTsKLX0KLQotLy8gVGVzdCB0aGUgY2FzZSB3aGVyZSBtdWx0aXBsZSBjbGllbnRzIGFyZSB1c2VkIGZvciBkaWZmZXJlbnQgbGlzdHMuCi1URVNUX0YoV2ViTVBhcnNlclRlc3QsIE11bHRpcGxlQ2xpZW50cykgewotICBjb25zdCB1aW50OCBrQnVmZmVyW10gPSB7Ci0gICAgMHgxOCwgMHg1MywgMHg4MCwgMHg2NywgMHg5NCwgIC8vIFNFR01FTlQgKHNpemUgPSAyMCkKLSAgICAweDE2LCAweDU0LCAweEFFLCAweDZCLCAweDg1LCAgLy8gICBUUkFDS1MgKHNpemUgPSA1KQotICAgIDB4QUUsIDB4ODMsICAgICAgICAgICAgICAgICAgICAvLyAgICAgVFJBQ0tFTlRSWSAoc2l6ZSA9IDMpCi0gICAgMHhENywgMHg4MSwgMHgwMSwgICAgICAgICAgICAgIC8vICAgICAgIFRSQUNLTlVNQkVSIChzaXplID0gMSkKLSAgICAweDFGLCAweDQzLCAweEI2LCAweDc1LCAweDg1LCAgLy8gICBDTFVTVEVSIChzaXplID0gNSkKLSAgICAweEVDLCAweDgzLCAweDAwLCAweDAwLCAweDAwLCAgLy8gICAgIFZvaWQgKHNpemUgPSAzKQotICB9OwotICBpbnQgc2l6ZSA9IHNpemVvZihrQnVmZmVyKTsKLQotICBTdHJpY3RNb2NrPE1vY2tXZWJNUGFyc2VyQ2xpZW50PiBjMV87Ci0gIFN0cmljdE1vY2s8TW9ja1dlYk1QYXJzZXJDbGllbnQ+IGMyXzsKLSAgU3RyaWN0TW9jazxNb2NrV2ViTVBhcnNlckNsaWVudD4gYzNfOwotCi0gIEluU2VxdWVuY2UgczsKLSAgRVhQRUNUX0NBTEwoY2xpZW50XywgT25MaXN0U3RhcnQoa1dlYk1JZFNlZ21lbnQpKS5XaWxsT25jZShSZXR1cm4oJmMxXykpOwotICBFWFBFQ1RfQ0FMTChjMV8sIE9uTGlzdFN0YXJ0KGtXZWJNSWRUcmFja3MpKS5XaWxsT25jZShSZXR1cm4oJmMyXykpOwotICBFWFBFQ1RfQ0FMTChjMl8sIE9uTGlzdFN0YXJ0KGtXZWJNSWRUcmFja0VudHJ5KSkuV2lsbE9uY2UoUmV0dXJuKCZjM18pKTsKLSAgRVhQRUNUX0NBTEwoYzNfLCBPblVJbnQoa1dlYk1JZFRyYWNrTnVtYmVyLCAxKSkuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKLSAgRVhQRUNUX0NBTEwoYzJfLCBPbkxpc3RFbmQoa1dlYk1JZFRyYWNrRW50cnkpKS5XaWxsT25jZShSZXR1cm4odHJ1ZSkpOwotICBFWFBFQ1RfQ0FMTChjMV8sIE9uTGlzdEVuZChrV2ViTUlkVHJhY2tzKSkuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKLSAgRVhQRUNUX0NBTEwoYzFfLCBPbkxpc3RTdGFydChrV2ViTUlkQ2x1c3RlcikpLldpbGxPbmNlKFJldHVybigmYzJfKSk7Ci0gIEVYUEVDVF9DQUxMKGMxXywgT25MaXN0RW5kKGtXZWJNSWRDbHVzdGVyKSkuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKLSAgRVhQRUNUX0NBTEwoY2xpZW50XywgT25MaXN0RW5kKGtXZWJNSWRTZWdtZW50KSkuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKLQotICBXZWJNTGlzdFBhcnNlciBwYXJzZXIoa1dlYk1JZFNlZ21lbnQsICZjbGllbnRfKTsKLSAgaW50IHJlc3VsdCA9IHBhcnNlci5QYXJzZShrQnVmZmVyLCBzaXplKTsKLSAgRVhQRUNUX0VRKHNpemUsIHJlc3VsdCk7Ci0gIEVYUEVDVF9UUlVFKHBhcnNlci5Jc1BhcnNpbmdDb21wbGV0ZSgpKTsKLX0KLQotLy8gVGVzdCB0aGUgY2FzZSB3aGVyZSBtdWx0aXBsZSBjbGllbnRzIGFyZSB1c2VkIGZvciBkaWZmZXJlbnQgbGlzdHMuCi1URVNUX0YoV2ViTVBhcnNlclRlc3QsIEludmFsaWRDbGllbnQpIHsKLSAgY29uc3QgdWludDgga0J1ZmZlcltdID0gewotICAgIDB4MTgsIDB4NTMsIDB4ODAsIDB4NjcsIDB4ODUsICAvLyBTRUdNRU5UIChzaXplID0gMjApCi0gICAgMHgxNiwgMHg1NCwgMHhBRSwgMHg2QiwgMHg4MCwgIC8vICAgVFJBQ0tTIChzaXplID0gNSkKLSAgfTsKLSAgaW50IHNpemUgPSBzaXplb2Yoa0J1ZmZlcik7Ci0KLSAgSW5TZXF1ZW5jZSBzOwotICBFWFBFQ1RfQ0FMTChjbGllbnRfLCBPbkxpc3RTdGFydChrV2ViTUlkU2VnbWVudCkpLldpbGxPbmNlKFJldHVybk51bGwoKSk7Ci0KLSAgV2ViTUxpc3RQYXJzZXIgcGFyc2VyKGtXZWJNSWRTZWdtZW50LCAmY2xpZW50Xyk7Ci0gIGludCByZXN1bHQgPSBwYXJzZXIuUGFyc2Uoa0J1ZmZlciwgc2l6ZSk7Ci0gIEVYUEVDVF9FUSgtMSwgcmVzdWx0KTsKLSAgRVhQRUNUX0ZBTFNFKHBhcnNlci5Jc1BhcnNpbmdDb21wbGV0ZSgpKTsKLX0KLQotVEVTVF9GKFdlYk1QYXJzZXJUZXN0LCBSZXNlcnZlZElkcykgewotICBjb25zdCB1aW50OCBrMUJ5dGVSZXNlcnZlZElkW10gPSB7IDB4RkYsIDB4ODEgfTsKLSAgY29uc3QgdWludDggazJCeXRlUmVzZXJ2ZWRJZFtdID0geyAweDdGLCAweEZGLCAweDgxIH07Ci0gIGNvbnN0IHVpbnQ4IGszQnl0ZVJlc2VydmVkSWRbXSA9IHsgMHgzRiwgMHhGRiwgMHhGRiwgMHg4MSB9OwotICBjb25zdCB1aW50OCBrNEJ5dGVSZXNlcnZlZElkW10gPSB7IDB4MUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODEgfTsKLSAgY29uc3QgdWludDgqIGtCdWZmZXJzW10gPSB7Ci0gICAgazFCeXRlUmVzZXJ2ZWRJZCwKLSAgICBrMkJ5dGVSZXNlcnZlZElkLAotICAgIGszQnl0ZVJlc2VydmVkSWQsCi0gICAgazRCeXRlUmVzZXJ2ZWRJZAotICB9OwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJyYXlzaXplKGtCdWZmZXJzKTsgaSsrKSB7Ci0gICAgaW50IGlkOwotICAgIGludDY0IGVsZW1lbnRfc2l6ZTsKLSAgICBpbnQgYnVmZmVyX3NpemUgPSAyICsgaTsKLSAgICBFWFBFQ1RfRVEoYnVmZmVyX3NpemUsIFdlYk1QYXJzZUVsZW1lbnRIZWFkZXIoa0J1ZmZlcnNbaV0sIGJ1ZmZlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWQsICZlbGVtZW50X3NpemUpKTsKLSAgICBFWFBFQ1RfRVEoaWQsIGtXZWJNUmVzZXJ2ZWRJZCk7Ci0gICAgRVhQRUNUX0VRKGVsZW1lbnRfc2l6ZSwgMSk7Ci0gIH0KLX0KLQotVEVTVF9GKFdlYk1QYXJzZXJUZXN0LCBSZXNlcnZlZFNpemVzKSB7Ci0gIGNvbnN0IHVpbnQ4IGsxQnl0ZVJlc2VydmVkU2l6ZVtdID0geyAweEEzLCAweEZGIH07Ci0gIGNvbnN0IHVpbnQ4IGsyQnl0ZVJlc2VydmVkU2l6ZVtdID0geyAweEEzLCAweDdGLCAweEZGIH07Ci0gIGNvbnN0IHVpbnQ4IGszQnl0ZVJlc2VydmVkU2l6ZVtdID0geyAweEEzLCAweDNGLCAweEZGLCAweEZGIH07Ci0gIGNvbnN0IHVpbnQ4IGs0Qnl0ZVJlc2VydmVkU2l6ZVtdID0geyAweEEzLCAweDFGLCAweEZGLCAweEZGLCAweEZGIH07Ci0gIGNvbnN0IHVpbnQ4IGs1Qnl0ZVJlc2VydmVkU2l6ZVtdID0geyAweEEzLCAweDBGLCAweEZGLCAweEZGLCAweEZGLCAweEZGIH07Ci0gIGNvbnN0IHVpbnQ4IGs2Qnl0ZVJlc2VydmVkU2l6ZVtdID0geyAweEEzLCAweDA3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRiB9OwotICBjb25zdCB1aW50OCBrN0J5dGVSZXNlcnZlZFNpemVbXSA9IHsgMHhBMywgMHgwMywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkYgfTsKLSAgY29uc3QgdWludDggazhCeXRlUmVzZXJ2ZWRTaXplW10gPSB7IDB4QTMsIDB4MDEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGLCAweEZGIH07Ci0gIGNvbnN0IHVpbnQ4KiBrQnVmZmVyc1tdID0gewotICAgIGsxQnl0ZVJlc2VydmVkU2l6ZSwKLSAgICBrMkJ5dGVSZXNlcnZlZFNpemUsCi0gICAgazNCeXRlUmVzZXJ2ZWRTaXplLAotICAgIGs0Qnl0ZVJlc2VydmVkU2l6ZSwKLSAgICBrNUJ5dGVSZXNlcnZlZFNpemUsCi0gICAgazZCeXRlUmVzZXJ2ZWRTaXplLAotICAgIGs3Qnl0ZVJlc2VydmVkU2l6ZSwKLSAgICBrOEJ5dGVSZXNlcnZlZFNpemUKLSAgfTsKLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFycmF5c2l6ZShrQnVmZmVycyk7IGkrKykgewotICAgIGludCBpZDsKLSAgICBpbnQ2NCBlbGVtZW50X3NpemU7Ci0gICAgaW50IGJ1ZmZlcl9zaXplID0gMiArIGk7Ci0gICAgRVhQRUNUX0VRKGJ1ZmZlcl9zaXplLCBXZWJNUGFyc2VFbGVtZW50SGVhZGVyKGtCdWZmZXJzW2ldLCBidWZmZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkLCAmZWxlbWVudF9zaXplKSk7Ci0gICAgRVhQRUNUX0VRKGlkLCAweEEzKTsKLSAgICBFWFBFQ1RfRVEoZWxlbWVudF9zaXplLCBrV2ViTVVua25vd25TaXplKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS93ZWJtL3dlYm1fc3RyZWFtX3BhcnNlci5jYyBiL3NyYy9tZWRpYS93ZWJtL3dlYm1fc3RyZWFtX3BhcnNlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQxNjMzYS4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvd2VibS93ZWJtX3N0cmVhbV9wYXJzZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL3dlYm0vd2VibV9zdHJlYW1fcGFyc2VyLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAibWVkaWEvd2VibS93ZWJtX2NsdXN0ZXJfcGFyc2VyLmgiCi0jaW5jbHVkZSAibWVkaWEvd2VibS93ZWJtX2NvbnN0YW50cy5oIgotI2luY2x1ZGUgIm1lZGlhL3dlYm0vd2VibV9jb250ZW50X2VuY29kaW5ncy5oIgotI2luY2x1ZGUgIm1lZGlhL3dlYm0vd2VibV9pbmZvX3BhcnNlci5oIgotI2luY2x1ZGUgIm1lZGlhL3dlYm0vd2VibV90cmFja3NfcGFyc2VyLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLS8vIFRPRE8oeGh3YW5nKTogRmlndXJlIG91dCB0aGUgaW5pdCBkYXRhIHR5cGUgYXBwcm9wcmlhdGVseSBvbmNlIGl0J3Mgc3BlYydlZC4KLXN0YXRpYyBjb25zdCBjaGFyIGtXZWJNSW5pdERhdGFUeXBlW10gPSAidmlkZW8vd2VibSI7Ci0KLVdlYk1TdHJlYW1QYXJzZXI6OldlYk1TdHJlYW1QYXJzZXIoKQotICAgIDogc3RhdGVfKGtXYWl0aW5nRm9ySW5pdCksCi0gICAgICB3YWl0aW5nX2Zvcl9idWZmZXJzXyhmYWxzZSkgewotfQotCi1XZWJNU3RyZWFtUGFyc2VyOjp+V2ViTVN0cmVhbVBhcnNlcigpIHt9Ci0KLXZvaWQgV2ViTVN0cmVhbVBhcnNlcjo6SW5pdChjb25zdCBJbml0Q0ImIGluaXRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmV3Q29uZmlnQ0ImIGNvbmZpZ19jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOZXdCdWZmZXJzQ0ImIGF1ZGlvX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5ld0J1ZmZlcnNDQiYgdmlkZW9fY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmVlZEtleUNCJiBuZWVkX2tleV9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOZXdNZWRpYVNlZ21lbnRDQiYgbmV3X3NlZ21lbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6Q2xvc3VyZSYgZW5kX29mX3NlZ21lbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9nQ0ImIGxvZ19jYikgewotICBEQ0hFQ0tfRVEoc3RhdGVfLCBrV2FpdGluZ0ZvckluaXQpOwotICBEQ0hFQ0soaW5pdF9jYl8uaXNfbnVsbCgpKTsKLSAgRENIRUNLKCFpbml0X2NiLmlzX251bGwoKSk7Ci0gIERDSEVDSyghY29uZmlnX2NiLmlzX251bGwoKSk7Ci0gIERDSEVDSyghYXVkaW9fY2IuaXNfbnVsbCgpIHx8ICF2aWRlb19jYi5pc19udWxsKCkpOwotICBEQ0hFQ0soIW5lZWRfa2V5X2NiLmlzX251bGwoKSk7Ci0gIERDSEVDSyghbmV3X3NlZ21lbnRfY2IuaXNfbnVsbCgpKTsKLSAgRENIRUNLKCFlbmRfb2Zfc2VnbWVudF9jYi5pc19udWxsKCkpOwotCi0gIENoYW5nZVN0YXRlKGtQYXJzaW5nSGVhZGVycyk7Ci0gIGluaXRfY2JfID0gaW5pdF9jYjsKLSAgY29uZmlnX2NiXyA9IGNvbmZpZ19jYjsKLSAgYXVkaW9fY2JfID0gYXVkaW9fY2I7Ci0gIHZpZGVvX2NiXyA9IHZpZGVvX2NiOwotICBuZWVkX2tleV9jYl8gPSBuZWVkX2tleV9jYjsKLSAgbmV3X3NlZ21lbnRfY2JfID0gbmV3X3NlZ21lbnRfY2I7Ci0gIGVuZF9vZl9zZWdtZW50X2NiXyA9IGVuZF9vZl9zZWdtZW50X2NiOwotICBsb2dfY2JfID0gbG9nX2NiOwotfQotCi12b2lkIFdlYk1TdHJlYW1QYXJzZXI6OkZsdXNoKCkgewotICBEQ0hFQ0tfTkUoc3RhdGVfLCBrV2FpdGluZ0ZvckluaXQpOwotCi0gIGJ5dGVfcXVldWVfLlJlc2V0KCk7Ci0KLSAgaWYgKHN0YXRlXyAhPSBrUGFyc2luZ0NsdXN0ZXJzKQotICAgIHJldHVybjsKLQotICBjbHVzdGVyX3BhcnNlcl8tPlJlc2V0KCk7Ci19Ci0KLWJvb2wgV2ViTVN0cmVhbVBhcnNlcjo6UGFyc2UoY29uc3QgdWludDgqIGJ1ZiwgaW50IHNpemUpIHsKLSAgRENIRUNLX05FKHN0YXRlXywga1dhaXRpbmdGb3JJbml0KTsKLQotICBpZiAoc3RhdGVfID09IGtFcnJvcikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYnl0ZV9xdWV1ZV8uUHVzaChidWYsIHNpemUpOwotCi0gIGludCByZXN1bHQgPSAwOwotICBpbnQgYnl0ZXNfcGFyc2VkID0gMDsKLSAgY29uc3QgdWludDgqIGN1ciA9IE5VTEw7Ci0gIGludCBjdXJfc2l6ZSA9IDA7Ci0KLSAgYnl0ZV9xdWV1ZV8uUGVlaygmY3VyLCAmY3VyX3NpemUpOwotICB3aGlsZSAoY3VyX3NpemUgPiAwKSB7Ci0gICAgU3RhdGUgb2xkU3RhdGUgPSBzdGF0ZV87Ci0gICAgc3dpdGNoIChzdGF0ZV8pIHsKLSAgICAgIGNhc2Uga1BhcnNpbmdIZWFkZXJzOgotICAgICAgICByZXN1bHQgPSBQYXJzZUluZm9BbmRUcmFja3MoY3VyLCBjdXJfc2l6ZSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIGtQYXJzaW5nQ2x1c3RlcnM6Ci0gICAgICAgIHJlc3VsdCA9IFBhcnNlQ2x1c3RlcihjdXIsIGN1cl9zaXplKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2Uga1dhaXRpbmdGb3JJbml0OgotICAgICAgY2FzZSBrRXJyb3I6Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAocmVzdWx0IDwgMCkgewotICAgICAgQ2hhbmdlU3RhdGUoa0Vycm9yKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdGVfID09IG9sZFN0YXRlICYmIHJlc3VsdCA9PSAwKQotICAgICAgYnJlYWs7Ci0KLSAgICBEQ0hFQ0tfR0UocmVzdWx0LCAwKTsKLSAgICBjdXIgKz0gcmVzdWx0OwotICAgIGN1cl9zaXplIC09IHJlc3VsdDsKLSAgICBieXRlc19wYXJzZWQgKz0gcmVzdWx0OwotICB9Ci0KLSAgYnl0ZV9xdWV1ZV8uUG9wKGJ5dGVzX3BhcnNlZCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFdlYk1TdHJlYW1QYXJzZXI6OkNoYW5nZVN0YXRlKFN0YXRlIG5ld19zdGF0ZSkgewotICBEVkxPRygxKSA8PCAiQ2hhbmdlU3RhdGUoKSA6ICIgPDwgc3RhdGVfIDw8ICIgLT4gIiA8PCBuZXdfc3RhdGU7Ci0gIHN0YXRlXyA9IG5ld19zdGF0ZTsKLX0KLQotaW50IFdlYk1TdHJlYW1QYXJzZXI6OlBhcnNlSW5mb0FuZFRyYWNrcyhjb25zdCB1aW50OCogZGF0YSwgaW50IHNpemUpIHsKLSAgRFZMT0coMikgPDwgIlBhcnNlSW5mb0FuZFRyYWNrcygpIjsKLSAgRENIRUNLKGRhdGEpOwotICBEQ0hFQ0tfR1Qoc2l6ZSwgMCk7Ci0KLSAgY29uc3QgdWludDgqIGN1ciA9IGRhdGE7Ci0gIGludCBjdXJfc2l6ZSA9IHNpemU7Ci0gIGludCBieXRlc19wYXJzZWQgPSAwOwotCi0gIGludCBpZDsKLSAgaW50NjQgZWxlbWVudF9zaXplOwotICBpbnQgcmVzdWx0ID0gV2ViTVBhcnNlRWxlbWVudEhlYWRlcihjdXIsIGN1cl9zaXplLCAmaWQsICZlbGVtZW50X3NpemUpOwotCi0gIGlmIChyZXN1bHQgPD0gMCkKLSAgICByZXR1cm4gcmVzdWx0OwotCi0gIHN3aXRjaCAoaWQpIHsKLSAgICBjYXNlIGtXZWJNSWRFQk1MSGVhZGVyOgotICAgIGNhc2Uga1dlYk1JZFNlZWtIZWFkOgotICAgIGNhc2Uga1dlYk1JZFZvaWQ6Ci0gICAgY2FzZSBrV2ViTUlkQ1JDMzI6Ci0gICAgY2FzZSBrV2ViTUlkQ3VlczoKLSAgICBjYXNlIGtXZWJNSWRUYWdzOgotICAgICAgaWYgKGN1cl9zaXplIDwgKHJlc3VsdCArIGVsZW1lbnRfc2l6ZSkpIHsKLSAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSB0aGUgd2hvbGUgZWxlbWVudCB5ZXQuIFNpZ25hbCB3ZSBuZWVkIG1vcmUgZGF0YS4KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgICAvLyBTa2lwIHRoZSBlbGVtZW50LgotICAgICAgcmV0dXJuIHJlc3VsdCArIGVsZW1lbnRfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga1dlYk1JZFNlZ21lbnQ6Ci0gICAgICAvLyBKdXN0IGNvbnN1bWUgdGhlIHNlZ21lbnQgaGVhZGVyLgotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga1dlYk1JZEluZm86Ci0gICAgICAvLyBXZSd2ZSBmb3VuZCB0aGUgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuCi0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OiB7Ci0gICAgICBNRURJQV9MT0cobG9nX2NiXykgPDwgIlVuZXhwZWN0ZWQgZWxlbWVudCBJRCAweCIgPDwgc3RkOjpoZXggPDwgaWQ7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICB9Ci0KLSAgV2ViTUluZm9QYXJzZXIgaW5mb19wYXJzZXI7Ci0gIHJlc3VsdCA9IGluZm9fcGFyc2VyLlBhcnNlKGN1ciwgY3VyX3NpemUpOwotCi0gIGlmIChyZXN1bHQgPD0gMCkKLSAgICByZXR1cm4gcmVzdWx0OwotCi0gIGN1ciArPSByZXN1bHQ7Ci0gIGN1cl9zaXplIC09IHJlc3VsdDsKLSAgYnl0ZXNfcGFyc2VkICs9IHJlc3VsdDsKLQotICBXZWJNVHJhY2tzUGFyc2VyIHRyYWNrc19wYXJzZXIobG9nX2NiXyk7Ci0gIHJlc3VsdCA9IHRyYWNrc19wYXJzZXIuUGFyc2UoY3VyLCBjdXJfc2l6ZSk7Ci0KLSAgaWYgKHJlc3VsdCA8PSAwKQotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgYnl0ZXNfcGFyc2VkICs9IHJlc3VsdDsKLQotICBiYXNlOjpUaW1lRGVsdGEgZHVyYXRpb24gPSBrSW5maW5pdGVEdXJhdGlvbigpOwotCi0gIGlmIChpbmZvX3BhcnNlci5kdXJhdGlvbigpID4gMCkgewotICAgIGRvdWJsZSBtdWx0ID0gaW5mb19wYXJzZXIudGltZWNvZGVfc2NhbGUoKSAvIDEwMDAuMDsKLSAgICBpbnQ2NCBkdXJhdGlvbl9pbl91cyA9IGluZm9fcGFyc2VyLmR1cmF0aW9uKCkgKiBtdWx0OwotICAgIGR1cmF0aW9uID0gYmFzZTo6VGltZURlbHRhOjpGcm9tTWljcm9zZWNvbmRzKGR1cmF0aW9uX2luX3VzKTsKLSAgfQotCi0gIGNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYgYXVkaW9fY29uZmlnID0gdHJhY2tzX3BhcnNlci5hdWRpb19kZWNvZGVyX2NvbmZpZygpOwotICBpZiAoYXVkaW9fY29uZmlnLmlzX2VuY3J5cHRlZCgpKQotICAgIEZpcmVOZWVkS2V5KHRyYWNrc19wYXJzZXIuYXVkaW9fZW5jcnlwdGlvbl9rZXlfaWQoKSk7Ci0KLSAgY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiB2aWRlb19jb25maWcgPSB0cmFja3NfcGFyc2VyLnZpZGVvX2RlY29kZXJfY29uZmlnKCk7Ci0gIGlmICh2aWRlb19jb25maWcuaXNfZW5jcnlwdGVkKCkpCi0gICAgRmlyZU5lZWRLZXkodHJhY2tzX3BhcnNlci52aWRlb19lbmNyeXB0aW9uX2tleV9pZCgpKTsKLQotICBpZiAoIWNvbmZpZ19jYl8uUnVuKGF1ZGlvX2NvbmZpZywgdmlkZW9fY29uZmlnKSkgewotICAgIERWTE9HKDEpIDw8ICJOZXcgY29uZmlnIGRhdGEgaXNuJ3QgYWxsb3dlZC4iOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIGNsdXN0ZXJfcGFyc2VyXy5yZXNldChuZXcgV2ViTUNsdXN0ZXJQYXJzZXIoCi0gICAgICBpbmZvX3BhcnNlci50aW1lY29kZV9zY2FsZSgpLAotICAgICAgdHJhY2tzX3BhcnNlci5hdWRpb190cmFja19udW0oKSwKLSAgICAgIHRyYWNrc19wYXJzZXIudmlkZW9fdHJhY2tfbnVtKCksCi0gICAgICB0cmFja3NfcGFyc2VyLmF1ZGlvX2VuY3J5cHRpb25fa2V5X2lkKCksCi0gICAgICB0cmFja3NfcGFyc2VyLnZpZGVvX2VuY3J5cHRpb25fa2V5X2lkKCksCi0gICAgICBsb2dfY2JfKSk7Ci0KLSAgQ2hhbmdlU3RhdGUoa1BhcnNpbmdDbHVzdGVycyk7Ci0KLSAgaWYgKCFpbml0X2NiXy5pc19udWxsKCkpIHsKLSAgICBpbml0X2NiXy5SdW4odHJ1ZSwgZHVyYXRpb24pOwotICAgIGluaXRfY2JfLlJlc2V0KCk7Ci0gIH0KLQotICByZXR1cm4gYnl0ZXNfcGFyc2VkOwotfQotCi1pbnQgV2ViTVN0cmVhbVBhcnNlcjo6UGFyc2VDbHVzdGVyKGNvbnN0IHVpbnQ4KiBkYXRhLCBpbnQgc2l6ZSkgewotICBpZiAoIWNsdXN0ZXJfcGFyc2VyXy5nZXQoKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaW50IGlkOwotICBpbnQ2NCBlbGVtZW50X3NpemU7Ci0gIGludCByZXN1bHQgPSBXZWJNUGFyc2VFbGVtZW50SGVhZGVyKGRhdGEsIHNpemUsICZpZCwgJmVsZW1lbnRfc2l6ZSk7Ci0KLSAgaWYgKHJlc3VsdCA8PSAwKQotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgaWYgKGlkID09IGtXZWJNSWRDbHVzdGVyKQotICAgIHdhaXRpbmdfZm9yX2J1ZmZlcnNfID0gdHJ1ZTsKLQotICBpZiAoaWQgPT0ga1dlYk1JZEN1ZXMpIHsKLSAgICBpZiAoc2l6ZSA8IChyZXN1bHQgKyBlbGVtZW50X3NpemUpKSB7Ci0gICAgICAvLyBXZSBkb24ndCBoYXZlIHRoZSB3aG9sZSBlbGVtZW50IHlldC4gU2lnbmFsIHdlIG5lZWQgbW9yZSBkYXRhLgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIC8vIFNraXAgdGhlIGVsZW1lbnQuCi0gICAgcmV0dXJuIHJlc3VsdCArIGVsZW1lbnRfc2l6ZTsKLSAgfQotCi0gIGlmIChpZCA9PSBrV2ViTUlkRUJNTEhlYWRlcikgewotICAgIENoYW5nZVN0YXRlKGtQYXJzaW5nSGVhZGVycyk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBpbnQgYnl0ZXNfcGFyc2VkID0gY2x1c3Rlcl9wYXJzZXJfLT5QYXJzZShkYXRhLCBzaXplKTsKLQotICBpZiAoYnl0ZXNfcGFyc2VkIDw9IDApCi0gICAgcmV0dXJuIGJ5dGVzX3BhcnNlZDsKLQotICBjb25zdCBCdWZmZXJRdWV1ZSYgYXVkaW9fYnVmZmVycyA9IGNsdXN0ZXJfcGFyc2VyXy0+YXVkaW9fYnVmZmVycygpOwotICBjb25zdCBCdWZmZXJRdWV1ZSYgdmlkZW9fYnVmZmVycyA9IGNsdXN0ZXJfcGFyc2VyXy0+dmlkZW9fYnVmZmVycygpOwotICBiYXNlOjpUaW1lRGVsdGEgY2x1c3Rlcl9zdGFydF90aW1lID0gY2x1c3Rlcl9wYXJzZXJfLT5jbHVzdGVyX3N0YXJ0X3RpbWUoKTsKLSAgYm9vbCBjbHVzdGVyX2VuZGVkID0gY2x1c3Rlcl9wYXJzZXJfLT5jbHVzdGVyX2VuZGVkKCk7Ci0KLSAgaWYgKHdhaXRpbmdfZm9yX2J1ZmZlcnNfICYmIGNsdXN0ZXJfc3RhcnRfdGltZSAhPSBrTm9UaW1lc3RhbXAoKSkgewotICAgIG5ld19zZWdtZW50X2NiXy5SdW4oY2x1c3Rlcl9zdGFydF90aW1lKTsKLSAgICB3YWl0aW5nX2Zvcl9idWZmZXJzXyA9IGZhbHNlOwotICB9Ci0KLSAgaWYgKCFhdWRpb19idWZmZXJzLmVtcHR5KCkgJiYgIWF1ZGlvX2NiXy5SdW4oYXVkaW9fYnVmZmVycykpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmICghdmlkZW9fYnVmZmVycy5lbXB0eSgpICYmICF2aWRlb19jYl8uUnVuKHZpZGVvX2J1ZmZlcnMpKQotICAgIHJldHVybiAtMTsKLQotICBpZiAoY2x1c3Rlcl9lbmRlZCkKLSAgICBlbmRfb2Zfc2VnbWVudF9jYl8uUnVuKCk7Ci0KLSAgcmV0dXJuIGJ5dGVzX3BhcnNlZDsKLX0KLQotdm9pZCBXZWJNU3RyZWFtUGFyc2VyOjpGaXJlTmVlZEtleShjb25zdCBzdGQ6OnN0cmluZyYga2V5X2lkKSB7Ci0gIGludCBrZXlfaWRfc2l6ZSA9IGtleV9pZC5zaXplKCk7Ci0gIERDSEVDS19HVChrZXlfaWRfc2l6ZSwgMCk7Ci0gIHNjb3BlZF9hcnJheTx1aW50OD4ga2V5X2lkX2FycmF5KG5ldyB1aW50OFtrZXlfaWRfc2l6ZV0pOwotICBtZW1jcHkoa2V5X2lkX2FycmF5LmdldCgpLCBrZXlfaWQuZGF0YSgpLCBrZXlfaWRfc2l6ZSk7Ci0gIG5lZWRfa2V5X2NiXy5SdW4oa1dlYk1Jbml0RGF0YVR5cGUsIGtleV9pZF9hcnJheS5QYXNzKCksIGtleV9pZF9zaXplKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvd2VibS93ZWJtX3N0cmVhbV9wYXJzZXIuaCBiL3NyYy9tZWRpYS93ZWJtL3dlYm1fc3RyZWFtX3BhcnNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWU5YTkyLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS93ZWJtL3dlYm1fc3RyZWFtX3BhcnNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9XRUJNX1dFQk1fU1RSRUFNX1BBUlNFUl9IXwotI2RlZmluZSBNRURJQV9XRUJNX1dFQk1fU1RSRUFNX1BBUlNFUl9IXwotCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFja19mb3J3YXJkLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9idWZmZXJzLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9ieXRlX3F1ZXVlLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zdHJlYW1fcGFyc2VyLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb19kZWNvZGVyX2NvbmZpZy5oIgotI2luY2x1ZGUgIm1lZGlhL3dlYm0vd2VibV9jbHVzdGVyX3BhcnNlci5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBXZWJNU3RyZWFtUGFyc2VyIDogcHVibGljIFN0cmVhbVBhcnNlciB7Ci0gcHVibGljOgotICBXZWJNU3RyZWFtUGFyc2VyKCk7Ci0gIHZpcnR1YWwgfldlYk1TdHJlYW1QYXJzZXIoKTsKLQotICAvLyBTdHJlYW1QYXJzZXIgaW1wbGVtZW50YXRpb24uCi0gIHZpcnR1YWwgdm9pZCBJbml0KGNvbnN0IEluaXRDQiYgaW5pdF9jYiwgY29uc3QgTmV3Q29uZmlnQ0ImIGNvbmZpZ19jYiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgTmV3QnVmZmVyc0NCJiBhdWRpb19jYiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgTmV3QnVmZmVyc0NCJiB2aWRlb19jYiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgTmVlZEtleUNCJiBuZWVkX2tleV9jYiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgTmV3TWVkaWFTZWdtZW50Q0ImIG5ld19zZWdtZW50X2NiLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiBlbmRfb2Zfc2VnbWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9nQ0ImIGxvZ19jYikgT1ZFUlJJREU7Ci0KLSAgdmlydHVhbCB2b2lkIEZsdXNoKCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgYm9vbCBQYXJzZShjb25zdCB1aW50OCogYnVmLCBpbnQgc2l6ZSkgT1ZFUlJJREU7Ci0KLSBwcml2YXRlOgotICBlbnVtIFN0YXRlIHsKLSAgICBrV2FpdGluZ0ZvckluaXQsCi0gICAga1BhcnNpbmdIZWFkZXJzLAotICAgIGtQYXJzaW5nQ2x1c3RlcnMsCi0gICAga0Vycm9yCi0gIH07Ci0KLSAgdm9pZCBDaGFuZ2VTdGF0ZShTdGF0ZSBuZXdfc3RhdGUpOwotCi0gIC8vIFBhcnNlcyBXZWJNIEhlYWRlciwgSW5mbywgVHJhY2tzIGVsZW1lbnRzLiBJdCBhbHNvIHNraXBzIG90aGVyIGxldmVsIDEKLSAgLy8gZWxlbWVudHMgdGhhdCBhcmUgbm90IHVzZWQgcmlnaHQgbm93LiBPbmNlIHRoZSBJbmZvICYgVHJhY2tzIGVsZW1lbnRzIGhhdmUKLSAgLy8gYmVlbiBwYXJzZWQsIHRoaXMgbWV0aG9kIHdpbGwgdHJhbnNpdGlvbiB0aGUgcGFyc2VyIGZyb20gUEFSU0lOR19IRUFERVJTIHRvCi0gIC8vIFBBUlNJTkdfQ0xVU1RFUlMuCi0gIC8vCi0gIC8vIFJldHVybnMgPCAwIGlmIHRoZSBwYXJzZSBmYWlscy4KLSAgLy8gUmV0dXJucyAwIGlmIG1vcmUgZGF0YSBpcyBuZWVkZWQuCi0gIC8vIFJldHVybmluZyA+IDAgaW5kaWNhdGVzIHN1Y2Nlc3MgJiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBhcnNlZC4KLSAgaW50IFBhcnNlSW5mb0FuZFRyYWNrcyhjb25zdCB1aW50OCogZGF0YSwgaW50IHNpemUpOwotCi0gIC8vIEluY3JlbWVudGFsbHkgcGFyc2VzIFdlYk0gY2x1c3RlciBlbGVtZW50cy4gVGhpcyBtZXRob2QgYWxzbyBza2lwcwotICAvLyBDVUVTIGVsZW1lbnRzIGlmIHRoZXkgYXJlIGVuY291bnRlcmVkIHNpbmNlIHdlIGN1cnJlbnRseSBkb24ndCB1c2UgdGhlCi0gIC8vIGRhdGEgaW4gdGhlc2UgZWxlbWVudHMuCi0gIC8vCi0gIC8vIFJldHVybnMgPCAwIGlmIHRoZSBwYXJzZSBmYWlscy4KLSAgLy8gUmV0dXJucyAwIGlmIG1vcmUgZGF0YSBpcyBuZWVkZWQuCi0gIC8vIFJldHVybmluZyA+IDAgaW5kaWNhdGVzIHN1Y2Nlc3MgJiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBhcnNlZC4KLSAgaW50IFBhcnNlQ2x1c3Rlcihjb25zdCB1aW50OCogZGF0YSwgaW50IHNpemUpOwotCi0gIC8vIEZpcmUgbmVlZGtleSBldmVudCB0aHJvdWdoIHRoZSB8bmVlZF9rZXlfY2JffC4KLSAgdm9pZCBGaXJlTmVlZEtleShjb25zdCBzdGQ6OnN0cmluZyYga2V5X2lkKTsKLQotICBTdGF0ZSBzdGF0ZV87Ci0gIEluaXRDQiBpbml0X2NiXzsKLSAgTmV3Q29uZmlnQ0IgY29uZmlnX2NiXzsKLSAgTmV3QnVmZmVyc0NCIGF1ZGlvX2NiXzsKLSAgTmV3QnVmZmVyc0NCIHZpZGVvX2NiXzsKLSAgTmVlZEtleUNCIG5lZWRfa2V5X2NiXzsKLSAgTmV3TWVkaWFTZWdtZW50Q0IgbmV3X3NlZ21lbnRfY2JfOwotICBiYXNlOjpDbG9zdXJlIGVuZF9vZl9zZWdtZW50X2NiXzsKLSAgTG9nQ0IgbG9nX2NiXzsKLQotICAvLyBUcnVlIGlmIGEgbmV3IGNsdXN0ZXIgaWQgaGFzIGJlZW4gc2VlbiwgYnV0IG5vIGF1ZGlvIG9yIHZpZGVvIGJ1ZmZlcnMgaGF2ZQotICAvLyBiZWVuIHBhcnNlZCB5ZXQuCi0gIGJvb2wgd2FpdGluZ19mb3JfYnVmZmVyc187Ci0KLSAgc2NvcGVkX3B0cjxXZWJNQ2x1c3RlclBhcnNlcj4gY2x1c3Rlcl9wYXJzZXJfOwotICBCeXRlUXVldWUgYnl0ZV9xdWV1ZV87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFdlYk1TdHJlYW1QYXJzZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfV0VCTV9XRUJNX1NUUkVBTV9QQVJTRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS93ZWJtL3dlYm1fdHJhY2tzX3BhcnNlci5jYyBiL3NyYy9tZWRpYS93ZWJtL3dlYm1fdHJhY2tzX3BhcnNlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRiODYxMy4uMDAwMDAwMAotLS0gYS9zcmMvbWVkaWEvd2VibS93ZWJtX3RyYWNrc19wYXJzZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgIm1lZGlhL3dlYm0vd2VibV90cmFja3NfcGFyc2VyLmgiCi0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL3N0cmluZ191dGlsLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9idWZmZXJzLmgiCi0jaW5jbHVkZSAibWVkaWEvd2VibS93ZWJtX2NvbnN0YW50cy5oIgotI2luY2x1ZGUgIm1lZGlhL3dlYm0vd2VibV9jb250ZW50X2VuY29kaW5ncy5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBWYWx1ZXMgZm9yIFRyYWNrVHlwZSBlbGVtZW50Lgotc3RhdGljIGNvbnN0IGludCBrV2ViTVRyYWNrVHlwZVZpZGVvID0gMTsKLXN0YXRpYyBjb25zdCBpbnQga1dlYk1UcmFja1R5cGVBdWRpbyA9IDI7Ci0KLVdlYk1UcmFja3NQYXJzZXI6OldlYk1UcmFja3NQYXJzZXIoY29uc3QgTG9nQ0ImIGxvZ19jYikKLSAgICA6IHRyYWNrX3R5cGVfKC0xKSwKLSAgICAgIHRyYWNrX251bV8oLTEpLAotICAgICAgYXVkaW9fdHJhY2tfbnVtXygtMSksCi0gICAgICB2aWRlb190cmFja19udW1fKC0xKSwKLSAgICAgIGxvZ19jYl8obG9nX2NiKSwKLSAgICAgIGF1ZGlvX2NsaWVudF8obG9nX2NiKSwKLSAgICAgIHZpZGVvX2NsaWVudF8obG9nX2NiKSB7Ci19Ci0KLVdlYk1UcmFja3NQYXJzZXI6On5XZWJNVHJhY2tzUGFyc2VyKCkge30KLQotaW50IFdlYk1UcmFja3NQYXJzZXI6OlBhcnNlKGNvbnN0IHVpbnQ4KiBidWYsIGludCBzaXplKSB7Ci0gIHRyYWNrX3R5cGVfID0tMTsKLSAgdHJhY2tfbnVtXyA9IC0xOwotICBhdWRpb190cmFja19udW1fID0gLTE7Ci0gIEF1ZGlvRGVjb2RlckNvbmZpZyBpbnZhbGlkX2F1ZGlvX2RlY29kZXJfY29uZmlnOwotICBhdWRpb19kZWNvZGVyX2NvbmZpZ18uQ29weUZyb20oaW52YWxpZF9hdWRpb19kZWNvZGVyX2NvbmZpZyk7Ci0gIHZpZGVvX3RyYWNrX251bV8gPSAtMTsKLSAgVmlkZW9EZWNvZGVyQ29uZmlnIGludmFsaWRfdmlkZW9fZGVjb2Rlcl9jb25maWc7Ci0gIHZpZGVvX2RlY29kZXJfY29uZmlnXy5Db3B5RnJvbShpbnZhbGlkX3ZpZGVvX2RlY29kZXJfY29uZmlnKTsKLQotICBXZWJNTGlzdFBhcnNlciBwYXJzZXIoa1dlYk1JZFRyYWNrcywgdGhpcyk7Ci0gIGludCByZXN1bHQgPSBwYXJzZXIuUGFyc2UoYnVmLCBzaXplKTsKLQotICBpZiAocmVzdWx0IDw9IDApCi0gICAgcmV0dXJuIHJlc3VsdDsKLQotICAvLyBGb3Igbm93IHdlIGRvIGFsbCBvciBub3RoaW5nIHBhcnNpbmcuCi0gIHJldHVybiBwYXJzZXIuSXNQYXJzaW5nQ29tcGxldGUoKSA/IHJlc3VsdCA6IDA7Ci19Ci0KLVdlYk1QYXJzZXJDbGllbnQqIFdlYk1UcmFja3NQYXJzZXI6Ok9uTGlzdFN0YXJ0KGludCBpZCkgewotICBpZiAoaWQgPT0ga1dlYk1JZENvbnRlbnRFbmNvZGluZ3MpIHsKLSAgICBEQ0hFQ0soIXRyYWNrX2NvbnRlbnRfZW5jb2RpbmdzX2NsaWVudF8uZ2V0KCkpOwotICAgIHRyYWNrX2NvbnRlbnRfZW5jb2RpbmdzX2NsaWVudF8ucmVzZXQoCi0gICAgICAgIG5ldyBXZWJNQ29udGVudEVuY29kaW5nc0NsaWVudChsb2dfY2JfKSk7Ci0gICAgcmV0dXJuIHRyYWNrX2NvbnRlbnRfZW5jb2RpbmdzX2NsaWVudF8tPk9uTGlzdFN0YXJ0KGlkKTsKLSAgfQotCi0gIGlmIChpZCA9PSBrV2ViTUlkVHJhY2tFbnRyeSkgewotICAgIHRyYWNrX3R5cGVfID0gLTE7Ci0gICAgdHJhY2tfbnVtXyA9IC0xOwotICAgIGNvZGVjX2lkXyA9ICIiOwotICAgIGNvZGVjX3ByaXZhdGVfLmNsZWFyKCk7Ci0gICAgYXVkaW9fY2xpZW50Xy5SZXNldCgpOwotICAgIHZpZGVvX2NsaWVudF8uUmVzZXQoKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotCi0gIGlmIChpZCA9PSBrV2ViTUlkQXVkaW8pCi0gICAgcmV0dXJuICZhdWRpb19jbGllbnRfOwotCi0gIGlmIChpZCA9PSBrV2ViTUlkVmlkZW8pCi0gICAgcmV0dXJuICZ2aWRlb19jbGllbnRfOwotCi0gIHJldHVybiB0aGlzOwotfQotCi1ib29sIFdlYk1UcmFja3NQYXJzZXI6Ok9uTGlzdEVuZChpbnQgaWQpIHsKLSAgaWYgKGlkID09IGtXZWJNSWRDb250ZW50RW5jb2RpbmdzKSB7Ci0gICAgRENIRUNLKHRyYWNrX2NvbnRlbnRfZW5jb2RpbmdzX2NsaWVudF8uZ2V0KCkpOwotICAgIHJldHVybiB0cmFja19jb250ZW50X2VuY29kaW5nc19jbGllbnRfLT5Pbkxpc3RFbmQoaWQpOwotICB9Ci0KLSAgaWYgKGlkID09IGtXZWJNSWRUcmFja0VudHJ5KSB7Ci0gICAgaWYgKHRyYWNrX3R5cGVfID09IC0xIHx8IHRyYWNrX251bV8gPT0gLTEpIHsKLSAgICAgIE1FRElBX0xPRyhsb2dfY2JfKSA8PCAiTWlzc2luZyBUcmFja0VudHJ5IGRhdGEgZm9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIFRyYWNrVHlwZSAiIDw8IHRyYWNrX3R5cGVfCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBUcmFja051bSAiIDw8IHRyYWNrX251bV87Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKHRyYWNrX3R5cGVfICE9IGtXZWJNVHJhY2tUeXBlQXVkaW8gJiYKLSAgICAgICAgdHJhY2tfdHlwZV8gIT0ga1dlYk1UcmFja1R5cGVWaWRlbykgewotICAgICAgTUVESUFfTE9HKGxvZ19jYl8pIDw8ICJVbmV4cGVjdGVkIFRyYWNrVHlwZSAiIDw8IHRyYWNrX3R5cGVfOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHN0ZDo6c3RyaW5nIGVuY3J5cHRpb25fa2V5X2lkOwotICAgIGlmICh0cmFja19jb250ZW50X2VuY29kaW5nc19jbGllbnRfLmdldCgpKSB7Ci0gICAgICBEQ0hFQ0soIXRyYWNrX2NvbnRlbnRfZW5jb2RpbmdzX2NsaWVudF8tPmNvbnRlbnRfZW5jb2RpbmdzKCkuZW1wdHkoKSk7Ci0gICAgICAvLyBJZiB3ZSBoYXZlIG11bHRpcGxlIENvbnRlbnRFbmNvZGluZyBpbiBvbmUgdHJhY2suIEFsd2F5cyBjaG9vc2UgdGhlCi0gICAgICAvLyBrZXkgaWQgaW4gdGhlIGZpcnN0IENvbnRlbnRFbmNvZGluZyBhcyB0aGUga2V5IGlkIG9mIHRoZSB0cmFjay4KLSAgICAgIGVuY3J5cHRpb25fa2V5X2lkID0gdHJhY2tfY29udGVudF9lbmNvZGluZ3NfY2xpZW50Xy0+Ci0gICAgICAgICAgY29udGVudF9lbmNvZGluZ3MoKVswXS0+ZW5jcnlwdGlvbl9rZXlfaWQoKTsKLSAgICB9Ci0KLSAgICBpZiAodHJhY2tfdHlwZV8gPT0ga1dlYk1UcmFja1R5cGVBdWRpbykgewotICAgICAgaWYgKGF1ZGlvX3RyYWNrX251bV8gPT0gLTEpIHsKLSAgICAgICAgYXVkaW9fdHJhY2tfbnVtXyA9IHRyYWNrX251bV87Ci0gICAgICAgIGF1ZGlvX2VuY3J5cHRpb25fa2V5X2lkXyA9IGVuY3J5cHRpb25fa2V5X2lkOwotCi0gICAgICAgIERDSEVDSyghYXVkaW9fZGVjb2Rlcl9jb25maWdfLklzVmFsaWRDb25maWcoKSk7Ci0gICAgICAgIGlmICghYXVkaW9fY2xpZW50Xy5Jbml0aWFsaXplQ29uZmlnKAotICAgICAgICAgICAgICAgIGNvZGVjX2lkXywgY29kZWNfcHJpdmF0ZV8sIDAvKnNlZWtfcHJlcm9sbF8qLywgMC8qY29kZWNfZGVsYXlfKi8sCi0gICAgICAgICAgICAgICAgIWF1ZGlvX2VuY3J5cHRpb25fa2V5X2lkXy5lbXB0eSgpLCAmYXVkaW9fZGVjb2Rlcl9jb25maWdfKSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgTUVESUFfTE9HKGxvZ19jYl8pIDw8ICJJZ25vcmluZyBhdWRpbyB0cmFjayAiIDw8IHRyYWNrX251bV87Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0cmFja190eXBlXyA9PSBrV2ViTVRyYWNrVHlwZVZpZGVvKSB7Ci0gICAgICBpZiAodmlkZW9fdHJhY2tfbnVtXyA9PSAtMSkgewotICAgICAgICB2aWRlb190cmFja19udW1fID0gdHJhY2tfbnVtXzsKLSAgICAgICAgdmlkZW9fZW5jcnlwdGlvbl9rZXlfaWRfID0gZW5jcnlwdGlvbl9rZXlfaWQ7Ci0KLSAgICAgICAgRENIRUNLKCF2aWRlb19kZWNvZGVyX2NvbmZpZ18uSXNWYWxpZENvbmZpZygpKTsKLSAgICAgICAgaWYgKCF2aWRlb19jbGllbnRfLkluaXRpYWxpemVDb25maWcoCi0gICAgICAgICAgICAgICAgY29kZWNfaWRfLCBjb2RlY19wcml2YXRlXywgIXZpZGVvX2VuY3J5cHRpb25fa2V5X2lkXy5lbXB0eSgpLAotICAgICAgICAgICAgICAgICZ2aWRlb19kZWNvZGVyX2NvbmZpZ18pKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBNRURJQV9MT0cobG9nX2NiXykgPDwgIklnbm9yaW5nIHZpZGVvIHRyYWNrICIgPDwgdHJhY2tfbnVtXzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB0cmFja190eXBlXyA9IC0xOwotICAgIHRyYWNrX251bV8gPSAtMTsKLSAgICB0cmFja19jb250ZW50X2VuY29kaW5nc19jbGllbnRfLnJlc2V0KCk7Ci0gICAgY29kZWNfaWRfID0gIiI7Ci0gICAgY29kZWNfcHJpdmF0ZV8uY2xlYXIoKTsKLSAgICBhdWRpb19jbGllbnRfLlJlc2V0KCk7Ci0gICAgdmlkZW9fY2xpZW50Xy5SZXNldCgpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgV2ViTVRyYWNrc1BhcnNlcjo6T25VSW50KGludCBpZCwgaW50NjQgdmFsKSB7Ci0gIGludDY0KiBkc3QgPSBOVUxMOwotCi0gIHN3aXRjaCAoaWQpIHsKLSAgICBjYXNlIGtXZWJNSWRUcmFja051bWJlcjoKLSAgICAgIGRzdCA9ICZ0cmFja19udW1fOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrV2ViTUlkVHJhY2tUeXBlOgotICAgICAgZHN0ID0gJnRyYWNrX3R5cGVfOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgaWYgKCpkc3QgIT0gLTEpIHsKLSAgICBNRURJQV9MT0cobG9nX2NiXykgPDwgIk11bHRpcGxlIHZhbHVlcyBmb3IgaWQgIiA8PCBzdGQ6OmhleCA8PCBpZAotICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHNwZWNpZmllZCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKmRzdCA9IHZhbDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgV2ViTVRyYWNrc1BhcnNlcjo6T25GbG9hdChpbnQgaWQsIGRvdWJsZSB2YWwpIHsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgV2ViTVRyYWNrc1BhcnNlcjo6T25CaW5hcnkoaW50IGlkLCBjb25zdCB1aW50OCogZGF0YSwgaW50IHNpemUpIHsKLSAgaWYgKGlkID09IGtXZWJNSWRDb2RlY1ByaXZhdGUpIHsKLSAgICBpZiAoIWNvZGVjX3ByaXZhdGVfLmVtcHR5KCkpIHsKLSAgICAgIE1FRElBX0xPRyhsb2dfY2JfKSA8PCAiTXVsdGlwbGUgQ29kZWNQcml2YXRlIGZpZWxkcyBpbiBhIHRyYWNrLiI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY29kZWNfcHJpdmF0ZV8uYXNzaWduKGRhdGEsIGRhdGEgKyBzaXplKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBXZWJNVHJhY2tzUGFyc2VyOjpPblN0cmluZyhpbnQgaWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgaWYgKGlkID09IGtXZWJNSWRDb2RlY0lEKSB7Ci0gICAgaWYgKCFjb2RlY19pZF8uZW1wdHkoKSkgewotICAgICAgTUVESUFfTE9HKGxvZ19jYl8pIDw8ICJNdWx0aXBsZSBDb2RlY0lEIGZpZWxkcyBpbiBhIHRyYWNrIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjb2RlY19pZF8gPSBzdHI7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvd2VibS93ZWJtX3RyYWNrc19wYXJzZXIuaCBiL3NyYy9tZWRpYS93ZWJtL3dlYm1fdHJhY2tzX3BhcnNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWIwNDNiLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS93ZWJtL3dlYm1fdHJhY2tzX3BhcnNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBNRURJQV9XRUJNX1dFQk1fVFJBQ0tTX1BBUlNFUl9IXwotI2RlZmluZSBNRURJQV9XRUJNX1dFQk1fVFJBQ0tTX1BBUlNFUl9IXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9sb2cuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXJfY29uZmlnLmgiCi0jaW5jbHVkZSAibWVkaWEvd2VibS93ZWJtX2F1ZGlvX2NsaWVudC5oIgotI2luY2x1ZGUgIm1lZGlhL3dlYm0vd2VibV9jb250ZW50X2VuY29kaW5nc19jbGllbnQuaCIKLSNpbmNsdWRlICJtZWRpYS93ZWJtL3dlYm1fcGFyc2VyLmgiCi0jaW5jbHVkZSAibWVkaWEvd2VibS93ZWJtX3ZpZGVvX2NsaWVudC5oIgotCi1uYW1lc3BhY2UgbWVkaWEgewotCi0vLyBQYXJzZXIgZm9yIFdlYk0gVHJhY2tzIGVsZW1lbnQuCi1jbGFzcyBXZWJNVHJhY2tzUGFyc2VyIDogcHVibGljIFdlYk1QYXJzZXJDbGllbnQgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgV2ViTVRyYWNrc1BhcnNlcihjb25zdCBMb2dDQiYgbG9nX2NiKTsKLSAgdmlydHVhbCB+V2ViTVRyYWNrc1BhcnNlcigpOwotCi0gIC8vIFBhcnNlcyBhIFdlYk0gVHJhY2tzIGVsZW1lbnQgaW4gfGJ1ZnwuCi0gIC8vCi0gIC8vIFJldHVybnMgLTEgaWYgdGhlIHBhcnNlIGZhaWxzLgotICAvLyBSZXR1cm5zIDAgaWYgbW9yZSBkYXRhIGlzIG5lZWRlZC4KLSAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBhcnNlZCBvbiBzdWNjZXNzLgotICBpbnQgUGFyc2UoY29uc3QgdWludDgqIGJ1ZiwgaW50IHNpemUpOwotCi0gIGludDY0IGF1ZGlvX3RyYWNrX251bSgpIGNvbnN0IHsgcmV0dXJuIGF1ZGlvX3RyYWNrX251bV87IH0KLSAgaW50NjQgdmlkZW9fdHJhY2tfbnVtKCkgY29uc3QgeyByZXR1cm4gdmlkZW9fdHJhY2tfbnVtXzsgfQotICBjb25zdCBzdGQ6OnN0cmluZyYgYXVkaW9fZW5jcnlwdGlvbl9rZXlfaWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGF1ZGlvX2VuY3J5cHRpb25fa2V5X2lkXzsKLSAgfQotICBjb25zdCBBdWRpb0RlY29kZXJDb25maWcmIGF1ZGlvX2RlY29kZXJfY29uZmlnKCkgewotICAgIHJldHVybiBhdWRpb19kZWNvZGVyX2NvbmZpZ187Ci0gIH0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIHZpZGVvX2VuY3J5cHRpb25fa2V5X2lkKCkgY29uc3QgewotICAgIHJldHVybiB2aWRlb19lbmNyeXB0aW9uX2tleV9pZF87Ci0gIH0KLSAgY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiB2aWRlb19kZWNvZGVyX2NvbmZpZygpIHsKLSAgICByZXR1cm4gdmlkZW9fZGVjb2Rlcl9jb25maWdfOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBXZWJNUGFyc2VyQ2xpZW50IG1ldGhvZHMKLSAgdmlydHVhbCBXZWJNUGFyc2VyQ2xpZW50KiBPbkxpc3RTdGFydChpbnQgaWQpIE9WRVJSSURFOwotICB2aXJ0dWFsIGJvb2wgT25MaXN0RW5kKGludCBpZCkgT1ZFUlJJREU7Ci0gIHZpcnR1YWwgYm9vbCBPblVJbnQoaW50IGlkLCBpbnQ2NCB2YWwpIE9WRVJSSURFOwotICB2aXJ0dWFsIGJvb2wgT25GbG9hdChpbnQgaWQsIGRvdWJsZSB2YWwpIE9WRVJSSURFOwotICB2aXJ0dWFsIGJvb2wgT25CaW5hcnkoaW50IGlkLCBjb25zdCB1aW50OCogZGF0YSwgaW50IHNpemUpIE9WRVJSSURFOwotICB2aXJ0dWFsIGJvb2wgT25TdHJpbmcoaW50IGlkLCBjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSBPVkVSUklERTsKLQotICBpbnQ2NCB0cmFja190eXBlXzsKLSAgaW50NjQgdHJhY2tfbnVtXzsKLSAgc3RkOjpzdHJpbmcgY29kZWNfaWRfOwotICBzdGQ6OnZlY3Rvcjx1aW50OD4gY29kZWNfcHJpdmF0ZV87Ci0gIHNjb3BlZF9wdHI8V2ViTUNvbnRlbnRFbmNvZGluZ3NDbGllbnQ+IHRyYWNrX2NvbnRlbnRfZW5jb2RpbmdzX2NsaWVudF87Ci0KLSAgaW50NjQgYXVkaW9fdHJhY2tfbnVtXzsKLSAgaW50NjQgdmlkZW9fdHJhY2tfbnVtXzsKLSAgc3RkOjpzdHJpbmcgYXVkaW9fZW5jcnlwdGlvbl9rZXlfaWRfOwotICBzdGQ6OnN0cmluZyB2aWRlb19lbmNyeXB0aW9uX2tleV9pZF87Ci0gIExvZ0NCIGxvZ19jYl87Ci0KLSAgV2ViTUF1ZGlvQ2xpZW50IGF1ZGlvX2NsaWVudF87Ci0gIEF1ZGlvRGVjb2RlckNvbmZpZyBhdWRpb19kZWNvZGVyX2NvbmZpZ187Ci0KLSAgV2ViTVZpZGVvQ2xpZW50IHZpZGVvX2NsaWVudF87Ci0gIFZpZGVvRGVjb2RlckNvbmZpZyB2aWRlb19kZWNvZGVyX2NvbmZpZ187Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFdlYk1UcmFja3NQYXJzZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi0KLSNlbmRpZiAgLy8gTUVESUFfV0VCTV9XRUJNX1RSQUNLU19QQVJTRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS93ZWJtL3dlYm1fdmlkZW9fY2xpZW50LmNjIGIvc3JjL21lZGlhL3dlYm0vd2VibV92aWRlb19jbGllbnQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZDNiODcuLjAwMDAwMDAKLS0tIGEvc3JjL21lZGlhL3dlYm0vd2VibV92aWRlb19jbGllbnQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAibWVkaWEvd2VibS93ZWJtX3ZpZGVvX2NsaWVudC5oIgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb19kZWNvZGVyX2NvbmZpZy5oIgotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fdHlwZXMuaCIKLSNpbmNsdWRlICJtZWRpYS93ZWJtL3dlYm1fY29uc3RhbnRzLmgiCi0KLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLVdlYk1WaWRlb0NsaWVudDo6V2ViTVZpZGVvQ2xpZW50KGNvbnN0IExvZ0NCJiBsb2dfY2IpCi0gICAgOiBsb2dfY2JfKGxvZ19jYikgewotICBSZXNldCgpOwotfQotCi1XZWJNVmlkZW9DbGllbnQ6On5XZWJNVmlkZW9DbGllbnQoKSB7Ci19Ci0KLXZvaWQgV2ViTVZpZGVvQ2xpZW50OjpSZXNldCgpIHsKLSAgcGl4ZWxfd2lkdGhfID0gLTE7Ci0gIHBpeGVsX2hlaWdodF8gPSAtMTsKLSAgY3JvcF9ib3R0b21fID0gLTE7Ci0gIGNyb3BfdG9wXyA9IC0xOwotICBjcm9wX2xlZnRfID0gLTE7Ci0gIGNyb3BfcmlnaHRfID0gLTE7Ci0gIGRpc3BsYXlfd2lkdGhfID0gLTE7Ci0gIGRpc3BsYXlfaGVpZ2h0XyA9IC0xOwotICBkaXNwbGF5X3VuaXRfID0gLTE7Ci0gIGFscGhhX21vZGVfID0gLTE7Ci0gIGluc2lkZV9wcm9qZWN0aW9uX2xpc3RfID0gZmFsc2U7Ci0gIGNvbG91cl9wYXJzZWRfID0gZmFsc2U7Ci19Ci0KLWJvb2wgV2ViTVZpZGVvQ2xpZW50OjpJbml0aWFsaXplQ29uZmlnKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb2RlY19pZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDg+JiBjb2RlY19wcml2YXRlLAotICAgIGJvb2wgaXNfZW5jcnlwdGVkLCBWaWRlb0RlY29kZXJDb25maWcqIGNvbmZpZykgewotICBEQ0hFQ0soY29uZmlnKTsKLQotICBWaWRlb0NvZGVjIHZpZGVvX2NvZGVjID0ga1Vua25vd25WaWRlb0NvZGVjOwotICBWaWRlb0NvZGVjUHJvZmlsZSBwcm9maWxlID0gVklERU9fQ09ERUNfUFJPRklMRV9VTktOT1dOOwotICBpZiAoY29kZWNfaWQgPT0gIlZfVlA4IikgewotICAgIHZpZGVvX2NvZGVjID0ga0NvZGVjVlA4OwotICAgIHByb2ZpbGUgPSBWUDhQUk9GSUxFX01BSU47Ci0gIH0gZWxzZSBpZiAoY29kZWNfaWQgPT0gIlZfVlA5IikgewotICAgIHZpZGVvX2NvZGVjID0ga0NvZGVjVlA5OwotICAgIHByb2ZpbGUgPSBWUDlQUk9GSUxFX01BSU47Ci0gIH0gZWxzZSB7Ci0gICAgTUVESUFfTE9HKGxvZ19jYl8pIDw8ICJVbnN1cHBvcnRlZCB2aWRlbyBjb2RlY19pZCAiIDw8IGNvZGVjX2lkOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFdlIGRvbid0IHN1cHBvcnQgWVYxMkEuCi0gIERDSEVDS19ORShhbHBoYV9tb2RlXywgMSk7Ci0gIGlmIChhbHBoYV9tb2RlXyA9PSAxKQotICAgIHJldHVybiBmYWxzZTsKLQotICBWaWRlb0ZyYW1lOjpGb3JtYXQgZm9ybWF0ID0gVmlkZW9GcmFtZTo6WVYxMjsKLQotICBpZiAocGl4ZWxfd2lkdGhfIDw9IDAgfHwgcGl4ZWxfaGVpZ2h0XyA8PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvLyBTZXQgY3JvcCBhbmQgZGlzcGxheSB1bml0IGRlZmF1bHRzIGlmIHRoZXNlIGVsZW1lbnRzIGFyZSBub3QgcHJlc2VudC4KLSAgaWYgKGNyb3BfYm90dG9tXyA9PSAtMSkKLSAgICBjcm9wX2JvdHRvbV8gPSAwOwotCi0gIGlmIChjcm9wX3RvcF8gPT0gLTEpCi0gICAgY3JvcF90b3BfID0gMDsKLQotICBpZiAoY3JvcF9sZWZ0XyA9PSAtMSkKLSAgICBjcm9wX2xlZnRfID0gMDsKLQotICBpZiAoY3JvcF9yaWdodF8gPT0gLTEpCi0gICAgY3JvcF9yaWdodF8gPSAwOwotCi0gIGlmIChkaXNwbGF5X3VuaXRfID09IC0xKQotICAgIGRpc3BsYXlfdW5pdF8gPSAwOwotCi0gIGdmeDo6U2l6ZSBjb2RlZF9zaXplKHBpeGVsX3dpZHRoXywgcGl4ZWxfaGVpZ2h0Xyk7Ci0gIGdmeDo6UmVjdCB2aXNpYmxlX3JlY3QoY3JvcF90b3BfLCBjcm9wX2xlZnRfLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX3dpZHRoXyAtIChjcm9wX2xlZnRfICsgY3JvcF9yaWdodF8pLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX2hlaWdodF8gLSAoY3JvcF90b3BfICsgY3JvcF9ib3R0b21fKSk7Ci0gIGlmIChkaXNwbGF5X3VuaXRfID09IDApIHsKLSAgICBpZiAoZGlzcGxheV93aWR0aF8gPD0gMCkKLSAgICAgIGRpc3BsYXlfd2lkdGhfID0gdmlzaWJsZV9yZWN0LndpZHRoKCk7Ci0gICAgaWYgKGRpc3BsYXlfaGVpZ2h0XyA8PSAwKQotICAgICAgZGlzcGxheV9oZWlnaHRfID0gdmlzaWJsZV9yZWN0LmhlaWdodCgpOwotICB9IGVsc2UgaWYgKGRpc3BsYXlfdW5pdF8gPT0gMykgewotICAgIGlmIChkaXNwbGF5X3dpZHRoXyA8PSAwIHx8IGRpc3BsYXlfaGVpZ2h0XyA8PSAwKQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgewotICAgIE1FRElBX0xPRyhsb2dfY2JfKSA8PCAiVW5zdXBwb3J0ZWQgZGlzcGxheSB1bml0IHR5cGUgIiA8PCBkaXNwbGF5X3VuaXRfOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBnZng6OlNpemUgbmF0dXJhbF9zaXplID0gZ2Z4OjpTaXplKGRpc3BsYXlfd2lkdGhfLCBkaXNwbGF5X2hlaWdodF8pOwotICBjb25zdCB1aW50OCogZXh0cmFfZGF0YSA9IE5VTEw7Ci0gIHNpemVfdCBleHRyYV9kYXRhX3NpemUgPSAwOwotICBpZiAoY29kZWNfcHJpdmF0ZS5zaXplKCkgPiAwKSB7Ci0gICAgZXh0cmFfZGF0YSA9ICZjb2RlY19wcml2YXRlWzBdOwotICAgIGV4dHJhX2RhdGFfc2l6ZSA9IGNvZGVjX3ByaXZhdGUuc2l6ZSgpOwotICB9Ci0KLSAgY29uZmlnLT5Jbml0aWFsaXplKAotICAgICAgdmlkZW9fY29kZWMsIHByb2ZpbGUsIGZvcm1hdCwgQ09MT1JfU1BBQ0VfSERfUkVDNzA5LCBjb2RlZF9zaXplLAotICAgICAgdmlzaWJsZV9yZWN0LCBuYXR1cmFsX3NpemUsIGV4dHJhX2RhdGEsIGV4dHJhX2RhdGFfc2l6ZSwgaXNfZW5jcnlwdGVkLAotICAgICAgdHJ1ZSk7Ci0gIGlmIChjb2xvdXJfcGFyc2VkXykgewotICAgIFdlYk1Db2xvck1ldGFkYXRhIGNvbG9yX21ldGFkYXRhID0gY29sb3VyX3BhcnNlcl8uR2V0V2ViTUNvbG9yTWV0YWRhdGEoKTsKLSAgICBjb25maWctPnNldF93ZWJtX2NvbG9yX21ldGFkYXRhKGNvbG9yX21ldGFkYXRhKTsKLSAgfQotICByZXR1cm4gY29uZmlnLT5Jc1ZhbGlkQ29uZmlnKCk7Ci19Ci0KLWJvb2wgV2ViTVZpZGVvQ2xpZW50OjpPblVJbnQoaW50IGlkLCBpbnQ2NCB2YWwpIHsKLSAgaWYgKGluc2lkZV9wcm9qZWN0aW9uX2xpc3RfKSB7Ci0gICAgLy8gQWNjZXB0IGFuZCBpZ25vcmUgYWxsIGludGVnZXIgZmllbGRzIHVuZGVyIGtXZWJNSWRQcm9qZWN0aW9uIGxpc3QuIFRoaXMKLSAgICAvLyBjdXJyZW50bHkgaW5jbHVkZXMgdGhlIGtXZWJNSWRQcm9qZWN0aW9uVHlwZSBmaWVsZC4KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGludDY0KiBkc3QgPSBOVUxMOwotCi0gIHN3aXRjaCAoaWQpIHsKLSAgICBjYXNlIGtXZWJNSWRQaXhlbFdpZHRoOgotICAgICAgZHN0ID0gJnBpeGVsX3dpZHRoXzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga1dlYk1JZFBpeGVsSGVpZ2h0OgotICAgICAgZHN0ID0gJnBpeGVsX2hlaWdodF87Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtXZWJNSWRQaXhlbENyb3BUb3A6Ci0gICAgICBkc3QgPSAmY3JvcF90b3BfOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrV2ViTUlkUGl4ZWxDcm9wQm90dG9tOgotICAgICAgZHN0ID0gJmNyb3BfYm90dG9tXzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga1dlYk1JZFBpeGVsQ3JvcExlZnQ6Ci0gICAgICBkc3QgPSAmY3JvcF9sZWZ0XzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga1dlYk1JZFBpeGVsQ3JvcFJpZ2h0OgotICAgICAgZHN0ID0gJmNyb3BfcmlnaHRfOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrV2ViTUlkRGlzcGxheVdpZHRoOgotICAgICAgZHN0ID0gJmRpc3BsYXlfd2lkdGhfOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrV2ViTUlkRGlzcGxheUhlaWdodDoKLSAgICAgIGRzdCA9ICZkaXNwbGF5X2hlaWdodF87Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtXZWJNSWREaXNwbGF5VW5pdDoKLSAgICAgIGRzdCA9ICZkaXNwbGF5X3VuaXRfOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrV2ViTUlkQWxwaGFNb2RlOgotICAgICAgZHN0ID0gJmFscGhhX21vZGVfOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgaWYgKCpkc3QgIT0gLTEpIHsKLSAgICBNRURJQV9MT0cobG9nX2NiXykgPDwgIk11bHRpcGxlIHZhbHVlcyBmb3IgaWQgIiA8PCBzdGQ6OmhleCA8PCBpZAotICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHNwZWNpZmllZCAoIiA8PCAqZHN0IDw8ICIgYW5kICIgPDwgdmFsIDw8ICIpIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqZHN0ID0gdmFsOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBXZWJNVmlkZW9DbGllbnQ6Ok9uQmluYXJ5KGludCBpZCwgY29uc3QgdWludDgqIGRhdGEsIGludCBzaXplKSB7Ci0gIGlmIChpbnNpZGVfcHJvamVjdGlvbl9saXN0XykgewotICAgIC8vIEFjY2VwdCBhbmQgaWdub3JlIGFsbCBiaW5hcnkgZmllbGRzIHVuZGVyIGtXZWJNSWRQcm9qZWN0aW9uIGxpc3QuIFRoaXMKLSAgICAvLyBjdXJyZW50bHkgaW5jbHVkZXMgdGhlIGtXZWJNSWRQcm9qZWN0aW9uUHJpdmF0ZSBmaWVsZC4KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vIEFjY2VwdCBiaW5hcnkgZmllbGRzIHdlIGRvbid0IGNhcmUgYWJvdXQgZm9yIG5vdy4KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgV2ViTVZpZGVvQ2xpZW50OjpPbkZsb2F0KGludCBpZCwgZG91YmxlIHZhbCkgewotICBpZiAoaW5zaWRlX3Byb2plY3Rpb25fbGlzdF8pIHsKLSAgICAvLyBBY2NlcHQgYW5kIGlnbm9yZSBmbG9hdCBmaWVsZHMgdW5kZXIga1dlYk1JZFByb2plY3Rpb24gbGlzdC4gVGhpcwotICAgIC8vIGN1cnJlbnRseSBpbmNsdWRlcyB0aGUga1dlYk1JZFByb2plY3Rpb25Qb3NlUGl0Y2gsCi0gICAgLy8ga1dlYk1JZFByb2plY3Rpb25Qb3NlWWF3LCBrV2ViTUlkUHJvamVjdGlvblBvc2VSb2xsIGZpZWxkcy4KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAvLyBBY2NlcHQgZmxvYXQgZmllbGRzIHdlIGRvbid0IGNhcmUgYWJvdXQgZm9yIG5vdy4KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLVdlYk1QYXJzZXJDbGllbnQqIFdlYk1WaWRlb0NsaWVudDo6T25MaXN0U3RhcnQoaW50IGlkKSB7Ci0gIGlmIChpZCA9PSBrV2ViTUlkUHJvamVjdGlvbiAmJiAhaW5zaWRlX3Byb2plY3Rpb25fbGlzdF8pIHsKLSAgICBpbnNpZGVfcHJvamVjdGlvbl9saXN0XyA9IHRydWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0gZWxzZSBpZiAoaWQgPT0ga1dlYk1JZENvbG91cikgewotICAgIGNvbG91cl9wYXJzZWRfID0gZmFsc2U7Ci0gICAgcmV0dXJuICZjb2xvdXJfcGFyc2VyXzsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gV2ViTVBhcnNlckNsaWVudDo6T25MaXN0U3RhcnQoaWQpOwotICB9Ci19Ci0KLWJvb2wgV2ViTVZpZGVvQ2xpZW50OjpPbkxpc3RFbmQoaW50IGlkKSB7Ci0gIGlmIChpZCA9PSBrV2ViTUlkUHJvamVjdGlvbiAmJiBpbnNpZGVfcHJvamVjdGlvbl9saXN0XykgewotICAgIGluc2lkZV9wcm9qZWN0aW9uX2xpc3RfID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiAoaWQgPT0ga1dlYk1JZENvbG91cikgewotICAgIGNvbG91cl9wYXJzZWRfID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gV2ViTVBhcnNlckNsaWVudDo6T25MaXN0RW5kKGlkKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS93ZWJtL3dlYm1fdmlkZW9fY2xpZW50LmggYi9zcmMvbWVkaWEvd2VibS93ZWJtX3ZpZGVvX2NsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjYwZDFlLi4wMDAwMDAwCi0tLSBhL3NyYy9tZWRpYS93ZWJtL3dlYm1fdmlkZW9fY2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgTUVESUFfV0VCTV9XRUJNX1ZJREVPX0NMSUVOVF9IXwotI2RlZmluZSBNRURJQV9XRUJNX1dFQk1fVklERU9fQ0xJRU5UX0hfCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9tZWRpYV9sb2cuaCIKLSNpbmNsdWRlICJtZWRpYS93ZWJtL3dlYm1fY29sb3VyX3BhcnNlci5oIgotI2luY2x1ZGUgIm1lZGlhL3dlYm0vd2VibV9wYXJzZXIuaCIKLQotbmFtZXNwYWNlIG1lZGlhIHsKLWNsYXNzIFZpZGVvRGVjb2RlckNvbmZpZzsKLQotLy8gSGVscGVyIGNsYXNzIHVzZWQgdG8gcGFyc2UgYSBWaWRlbyBlbGVtZW50IGluc2lkZSBhIFRyYWNrRW50cnkgZWxlbWVudC4KLWNsYXNzIFdlYk1WaWRlb0NsaWVudCA6IHB1YmxpYyBXZWJNUGFyc2VyQ2xpZW50IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFdlYk1WaWRlb0NsaWVudChjb25zdCBMb2dDQiYgbG9nX2NiKTsKLSAgdmlydHVhbCB+V2ViTVZpZGVvQ2xpZW50KCk7Ci0KLSAgLy8gUmVzZXQgdGhpcyBvYmplY3QncyBzdGF0ZSBzbyBpdCBjYW4gcHJvY2VzcyBhIG5ldyB2aWRlbyB0cmFjayBlbGVtZW50LgotICB2b2lkIFJlc2V0KCk7Ci0KLSAgLy8gSW5pdGlhbGl6ZSB8Y29uZmlnfCB3aXRoIHRoZSBkYXRhIGluIHxjb2RlY19pZHwsIHxjb2RlY19wcml2YXRlfCwKLSAgLy8gfGlzX2VuY3J5cHRlZHwgYW5kIHRoZSBmaWVsZHMgcGFyc2VkIGZyb20gdGhlIGxhc3QgdmlkZW8gdHJhY2sgZWxlbWVudCB0aGlzCi0gIC8vIG9iamVjdCB3YXMgdXNlZCB0byBwYXJzZS4KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHxjb25maWd8IHdhcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQuCi0gIC8vIFJldHVybnMgZmFsc2UgaWYgdGhlcmUgd2FzIHVuZXhwZWN0ZWQgdmFsdWVzIGluIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzIG9yCi0gIC8vIHZpZGVvIHRyYWNrIGVsZW1lbnQgZmllbGRzLiBUaGUgY29udGVudHMgb2YgfGNvbmZpZ3wgYXJlIHVuZGVmaW5lZCBpbiB0aGlzCi0gIC8vIGNhc2UgYW5kIHNob3VsZCBub3QgYmUgcmVsaWVkIHVwb24uCi0gIGJvb2wgSW5pdGlhbGl6ZUNvbmZpZyhjb25zdCBzdGQ6OnN0cmluZyYgY29kZWNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OD4mIGNvZGVjX3ByaXZhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2VuY3J5cHRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvRGVjb2RlckNvbmZpZyogY29uZmlnKTsKLQotIHByaXZhdGU6Ci0gIC8vIFdlYk1QYXJzZXJDbGllbnQgaW1wbGVtZW50YXRpb24uCi0gIHZpcnR1YWwgYm9vbCBPblVJbnQoaW50IGlkLCBpbnQ2NCB2YWwpIE9WRVJSSURFOwotICB2aXJ0dWFsIGJvb2wgT25CaW5hcnkoaW50IGlkLCBjb25zdCB1aW50OCogZGF0YSwgaW50IHNpemUpIE9WRVJSSURFOwotICB2aXJ0dWFsIGJvb2wgT25GbG9hdChpbnQgaWQsIGRvdWJsZSB2YWwpIE9WRVJSSURFOwotICAvLyBFeGlzdCB0byBpZ25vcmUgdGhlIG5ldyBQcm9qZWN0aW9uIGxpc3QgZWxlbWVudC4gVGhpcyBlbGVtZW50IGhhcyBVSU5ULAotICAvLyBGTE9BVCBhbmQgQklOQVJZIGZpZWxkcyB3aGljaCBtdXN0IGFsc28gYmUgaWdub3JlZC4KLSAgV2ViTVBhcnNlckNsaWVudCogT25MaXN0U3RhcnQoaW50IGlkKSBPVkVSUklERTsKLSAgYm9vbCBPbkxpc3RFbmQoaW50IGlkKSBPVkVSUklERTsKLQotICBMb2dDQiBsb2dfY2JfOwotICBpbnQ2NCBwaXhlbF93aWR0aF87Ci0gIGludDY0IHBpeGVsX2hlaWdodF87Ci0gIGludDY0IGNyb3BfYm90dG9tXzsKLSAgaW50NjQgY3JvcF90b3BfOwotICBpbnQ2NCBjcm9wX2xlZnRfOwotICBpbnQ2NCBjcm9wX3JpZ2h0XzsKLSAgaW50NjQgZGlzcGxheV93aWR0aF87Ci0gIGludDY0IGRpc3BsYXlfaGVpZ2h0XzsKLSAgaW50NjQgZGlzcGxheV91bml0XzsKLSAgaW50NjQgYWxwaGFfbW9kZV87Ci0gIGJvb2wgaW5zaWRlX3Byb2plY3Rpb25fbGlzdF87Ci0KLSAgV2ViTUNvbG91clBhcnNlciBjb2xvdXJfcGFyc2VyXzsKLSAgYm9vbCBjb2xvdXJfcGFyc2VkXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oV2ViTVZpZGVvQ2xpZW50KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotCi0jZW5kaWYgIC8vIE1FRElBX1dFQk1fV0VCTV9WSURFT19DTElFTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9uZXQvdXJsX3JlcXVlc3QvdXJsX3JlcXVlc3Rfam9iX21hbmFnZXIuY2MgYi9zcmMvbmV0L3VybF9yZXF1ZXN0L3VybF9yZXF1ZXN0X2pvYl9tYW5hZ2VyLmNjCmluZGV4IGVkMGY1ZGIuLmI0OTdiMTMgMTAwNjQ0Ci0tLSBhL3NyYy9uZXQvdXJsX3JlcXVlc3QvdXJsX3JlcXVlc3Rfam9iX21hbmFnZXIuY2MKKysrIGIvc3JjL25ldC91cmxfcmVxdWVzdC91cmxfcmVxdWVzdF9qb2JfbWFuYWdlci5jYwpAQCAtNDAsOSArNDAsNiBAQAogICB7Imh0dHBzIiwgVVJMUmVxdWVzdEh0dHBKb2I6OkZhY3Rvcnl9LAogICB7ImRhdGEiLCBVUkxSZXF1ZXN0RGF0YUpvYjo6RmFjdG9yeX0sCiAgIHsgImh0dHAiLCBVUkxSZXF1ZXN0SHR0cEpvYjo6RmFjdG9yeSB9LAotI2lmIGRlZmluZWQoQ09CQUxUX0VOQUJMRV9GSUxFX1NDSEVNRSkKLSAgeyAiZmlsZSIsIFVSTFJlcXVlc3RGaWxlSm9iOjpGYWN0b3J5IH0sCi0jZW5kaWYKIH07CiAjZWxzZQogc3RhdGljIGNvbnN0IFNjaGVtZVRvRmFjdG9yeSBrQnVpbHRpbkZhY3Rvcmllc1tdID0gewpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9DSEFOR0VMT0cubWQgYi9zcmMvc3RhcmJvYXJkL0NIQU5HRUxPRy5tZAppbmRleCBhNzdlNGUxLi5mYTY5ZTY1IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL0NIQU5HRUxPRy5tZAorKysgYi9zcmMvc3RhcmJvYXJkL0NIQU5HRUxPRy5tZApAQCAtNiw2ICs2LDggQEAKIHRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIGNoYW5nZXMgbWFkZSB0byB0aGUgU3RhcmJvYXJkIGludGVyZmFjZSBzaW5jZSB0aGUKIHZlcnNpb24gcHJldmlvdXMgdG8gaXQuCiAKKyoqTk9URTogU3RhcmJvYXJkIHZlcnNpb25zIDMgYW5kIGJlbG93IGFyZSBubyBsb25nZXIgc3VwcG9ydGVkLioqCisKICMjIFZlcnNpb24gNwogCiAjIyMgYFNiRGVjb2RlVGFyZ2V0SW5mb1BsYW5lYCBjYW4gc3BlY2lmeSBjb2xvciBwbGFuZSBpbmZvcm1hdGlvbgpAQCAtNjEsMTAgKzYzLDEzIEBACiBBZGQgc3VwcG9ydCBmb3IgVVlWWSBkZWNvZGUgdGFyZ2V0cyAoZS5nLiBZVVYgNDIyKSB2aWEgdGhlCiBga1NiRGVjb2RlVGFyZ2V0Rm9ybWF0MVBsYW5lVVlWWWAgZW51bS4KIAotIyMjIEFkZCBDb2xvciBSZW1vdGUgS2V5cworIyMjIEFkZCBNb3JlIFJlbW90ZSBLZXlzCiAKLVRoaXMgYWRkcyBTYktleSBjb2RlcyBmb3IgdGhlIGNvbG9yZWQga2V5cyBmb3VuZCBvbiBtb3N0IGNvbnRlbXBvcmFyeSBUVgotcmVtb3Rlcy4KK1RoaXMgYWRkcyBTYktleSBjb2RlcyBmb3I6CisKKyAgKiBDb2xvciBrZXlzCisgICogQ2xvc2VkIENhcHRpb24ga2V5CisgICogQXBwbGljYXRpb24gbGF1bmNoIGtleQogCiAjIyMgYGtTYkV2ZW50VHlwZUxvd01lbW9yeWAKIApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9hY2Nlc3NpYmlsaXR5LmggYi9zcmMvc3RhcmJvYXJkL2FjY2Vzc2liaWxpdHkuaAppbmRleCAzZTYzYmYxLi5lNDAyZjM0IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2FjY2Vzc2liaWxpdHkuaAorKysgYi9zcmMvc3RhcmJvYXJkL2FjY2Vzc2liaWxpdHkuaApAQCAtMjYsOCArMjYsNiBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKLQogLy8gQSBncm91cCBvZiBzZXR0aW5ncyByZWxhdGVkIHRvIHRleHQtdG8tc3BlZWNoIGZ1bmN0aW9uYWxpdHksIGZvciBwbGF0Zm9ybXMKIC8vIHRoYXQgZXhwb3NlIHN5c3RlbSBzZXR0aW5ncyBmb3IgdGV4dC10by1zcGVlY2guCiB0eXBlZGVmIHN0cnVjdCBTYkFjY2Vzc2liaWxpdHlUZXh0VG9TcGVlY2hTZXR0aW5ncyB7CkBAIC02NSw4ICs2Myw2IEBACiBTQl9FWFBPUlQgYm9vbCBTYkFjY2Vzc2liaWxpdHlHZXREaXNwbGF5U2V0dGluZ3MoCiAgICAgU2JBY2Nlc3NpYmlsaXR5RGlzcGxheVNldHRpbmdzKiBvdXRfc2V0dGluZ3MpOwogCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKLQogI2lmZGVmIF9fY3BsdXNwbHVzCiB9ICAvLyBleHRlcm4gIkMiCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvYXRvbWljLmggYi9zcmMvc3RhcmJvYXJkL2F0b21pYy5oCmluZGV4IGU5NjA5YzcuLjgwYzM5MWYgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvYXRvbWljLmgKKysrIGIvc3JjL3N0YXJib2FyZC9hdG9taWMuaApAQCAtNDM2LDcgKzQzNiw3IEBACiBjbGFzcyBhdG9taWNfaW50ZWdyYWw7CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEltcGxpbWVudGF0aW9uLgorLy8gSW1wbGVtZW50YXRpb24uCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIC8vIFNpbWlsYXIgdG8gQysrMTEgc3RkOjphdG9taWM8VD4uCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2J1aWxkL2NvcHlfZGF0YS5weSBiL3NyYy9zdGFyYm9hcmQvYnVpbGQvY29weV9kYXRhLnB5CmluZGV4IGMxOWMwMjAuLmEyYmZkZGEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvYnVpbGQvY29weV9kYXRhLnB5CisrKyBiL3NyYy9zdGFyYm9hcmQvYnVpbGQvY29weV9kYXRhLnB5CkBAIC04NSw4ICs4NSwxNCBAQAogICAgICAgIyBwYXRocyAoZXNwZWNpYWxseSBvbiBidWlsZCBtYWNoaW5lcykgc3VjaCB0aGF0IHNodXRpbC5jb3B5IGZhaWxzLgogICAgICAgZmlsZW5hbWUgPSB3aW4zMmFwaS5HZXRTaG9ydFBhdGhOYW1lKGZpbGVuYW1lKQogICAgICAgb3V0cHV0X2Jhc2VkaXIgPSB3aW4zMmFwaS5HZXRTaG9ydFBhdGhOYW1lKG91dHB1dF9iYXNlZGlyKQotICAgIG91dHB1dF9maWxlbmFtZSA9IHBvc2l4cGF0aC5qb2luKG91dHB1dF9iYXNlZGlyLCByZWxhdGl2ZV9maWxlbmFtZSkKLSAgICBvdXRwdXRfZGlyID0gcG9zaXhwYXRoLmRpcm5hbWUob3V0cHV0X2ZpbGVuYW1lKQorCisgICAgIyBJbiBjZXJ0YWluIGNhc2VzLCBmaWxlcyB3b3VsZCBmYWlsIHRvIG9wZW4gb24gd2luZG93cyBpZiByZWxhdGl2ZSBwYXRocworICAgICMgd2VyZSBwcm92aWRlZC4gIFVzaW5nIGFic29sdXRlIHBhdGhzIGZpeGVzIHRoaXMuCisgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmFic3BhdGgoZmlsZW5hbWUpCisgICAgb3V0cHV0X2Jhc2VkaXIgPSBvcy5wYXRoLmFic3BhdGgob3V0cHV0X2Jhc2VkaXIpCisgICAgb3V0cHV0X2ZpbGVuYW1lID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihvdXRwdXRfYmFzZWRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlX2ZpbGVuYW1lKSkKKyAgICBvdXRwdXRfZGlyID0gb3MucGF0aC5kaXJuYW1lKG91dHB1dF9maWxlbmFtZSkKIAogICAgICMgSW4gY2FzZXMgd2hlcmUgYSBkaXJlY3RvcnkgaGFzIHR1cm5lZCBpbnRvIGEgZmlsZSBvciB2aWNlIHZlcnNhLCBkZWxldGUgaXQKICAgICAjIGJlZm9yZSBjb3B5aW5nIGl0IGJlbG93LgpAQCAtOTcsNiArMTAzLDcgQEAKIAogICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhvdXRwdXRfZGlyKToKICAgICAgIG9zLm1ha2VkaXJzKG91dHB1dF9kaXIpCisKICAgICBzaHV0aWwuY29weShmaWxlbmFtZSwgb3V0cHV0X2ZpbGVuYW1lKQogCiAKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvY29tbW9uL29wdGlvbmFsLmggYi9zcmMvc3RhcmJvYXJkL2NvbW1vbi9vcHRpb25hbC5oCmluZGV4IDhlOGZjMDAuLjRjODkyZjUgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvY29tbW9uL29wdGlvbmFsLmgKKysrIGIvc3JjL3N0YXJib2FyZC9jb21tb24vb3B0aW9uYWwuaApAQCAtMjE1LDYgKzIxNSw4IEBACiAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBlbmdhZ2VkXzsgfQogI2VuZGlmCiAKKyAgYm9vbCBoYXNfZW5nYWdlZCgpIGNvbnN0IHsgcmV0dXJuIGVuZ2FnZWRfOyB9CisKICAgLy8gRGVyZWZlcmVuY2VzIHRoZSBpbnRlcm5hbCBvYmplY3QuCiAgIGNvbnN0IFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmKHZhbHVlKCkpOyB9CiAKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIGIvc3JjL3N0YXJib2FyZC9jb25maWd1cmF0aW9uLmgKaW5kZXggZThhNGY5MC4uYjlhMWY1YyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9jb25maWd1cmF0aW9uLmgKKysrIGIvc3JjL3N0YXJib2FyZC9jb25maWd1cmF0aW9uLmgKQEAgLTMxLDExICszMSwxNCBAQAogI2Vycm9yICJZb3UgbXVzdCBkZWZpbmUgU1RBUkJPQVJEIGluIFN0YXJib2FyZCBidWlsZHMuIgogI2VuZGlmCiAKKyNkZWZpbmUgU0JfVFJVRSAxCisjZGVmaW5lIFNCX0ZBTFNFIDAKKwogLy8gLS0tIENvbW1vbiBEZWZpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8vIFRoZSBtaW5pbXVtIEFQSSB2ZXJzaW9uIGFsbG93ZWQgYnkgdGhpcyB2ZXJzaW9uIG9mIHRoZSBTdGFyYm9hcmQgaGVhZGVycywKIC8vIGluY2x1c2l2ZS4KLSNkZWZpbmUgU0JfTUlOSU1VTV9BUElfVkVSU0lPTiAxCisjZGVmaW5lIFNCX01JTklNVU1fQVBJX1ZFUlNJT04gNAogCiAvLyBUaGUgbWF4aW11bSBBUEkgdmVyc2lvbiBhbGxvd2VkIGJ5IHRoaXMgdmVyc2lvbiBvZiB0aGUgU3RhcmJvYXJkIGhlYWRlcnMsCiAvLyBpbmNsdXNpdmUuCkBAIC03MywxMSArNzYsMTQgQEAKICNkZWZpbmUgU0JfREVDT0RFX1RBUkdFVF9QTEFORVNfRk9SX0ZPUk1BVCBTQl9SRUxFQVNFX0NBTkRJREFURV9BUElfVkVSU0lPTgogI2RlZmluZSBTQl9QUkVMT0FEX0FQSV9WRVJTSU9OIFNCX1JFTEVBU0VfQ0FORElEQVRFX0FQSV9WRVJTSU9OCiAjZGVmaW5lIFNCX1BMQVRGT1JNX0VSUk9SX0NMRUFOVVBfQVBJX1ZFUlNJT04gU0JfUkVMRUFTRV9DQU5ESURBVEVfQVBJX1ZFUlNJT04KLSNkZWZpbmUgU0JfREVDT0RFX1RBUkdFVF9VWVZZX1NVUFBPUlRfQVBJX1ZFUlNJT04gU0JfUkVMRUFTRV9DQU5ESURBVEVfQVBJX1ZFUlNJT04KLSNkZWZpbmUgU0JfQ09MT1JfS0VZQ09ERVNfQVBJX1ZFUlNJT04gU0JfUkVMRUFTRV9DQU5ESURBVEVfQVBJX1ZFUlNJT04KKyNkZWZpbmUgU0JfREVDT0RFX1RBUkdFVF9VWVZZX1NVUFBPUlRfQVBJX1ZFUlNJT04gXAorICBTQl9SRUxFQVNFX0NBTkRJREFURV9BUElfVkVSU0lPTgorI2RlZmluZSBTQl9ORVdfS0VZQ09ERVNfQVBJX1ZFUlNJT04gU0JfUkVMRUFTRV9DQU5ESURBVEVfQVBJX1ZFUlNJT04KICNkZWZpbmUgU0JfTE9XX01FTU9SWV9FVkVOVF9BUElfVkVSU0lPTiBTQl9SRUxFQVNFX0NBTkRJREFURV9BUElfVkVSU0lPTgotI2RlZmluZSBTQl9QTEFZRVJfV1JJVEVfU0FNUExFX0VYVFJBX0NPTlNUX0FQSV9WRVJTSU9OIFNCX1JFTEVBU0VfQ0FORElEQVRFX0FQSV9WRVJTSU9OCi0jZGVmaW5lIFNCX0RSTV9LRVlfU1RBVFVTRVNfVVBEQVRFX1NVUFBPUlRfQVBJX1ZFUlNJT04gU0JfUkVMRUFTRV9DQU5ESURBVEVfQVBJX1ZFUlNJT04KKyNkZWZpbmUgU0JfUExBWUVSX1dSSVRFX1NBTVBMRV9FWFRSQV9DT05TVF9BUElfVkVSU0lPTiBcCisgIFNCX1JFTEVBU0VfQ0FORElEQVRFX0FQSV9WRVJTSU9OCisjZGVmaW5lIFNCX0RSTV9LRVlfU1RBVFVTRVNfVVBEQVRFX1NVUFBPUlRfQVBJX1ZFUlNJT04gXAorICBTQl9SRUxFQVNFX0NBTkRJREFURV9BUElfVkVSU0lPTgogI2RlZmluZSBTQl9TVE9SQUdFX05BTUVTX0FQSV9WRVJTSU9OIFNCX1JFTEVBU0VfQ0FORElEQVRFX0FQSV9WRVJTSU9OCiAKIC8vIC0tLSBDb21tb24gRGV0ZWN0ZWQgRmVhdHVyZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTA2LDExICsxMTIsNiBAQAogI2RlZmluZSBTQl9IQVNfUVVJUksoU0JfRkVBVFVSRSkgXAogICAoKGRlZmluZWQgU0JfSEFTX1FVSVJLXyMjU0JfRkVBVFVSRSkgJiYgU0JfSEFTX1FVSVJLXyMjU0JfRkVBVFVSRSkKIAotLy8gRGV0ZXJtaW5lcyBhdCBjb21waWxlLXRpbWUgaWYgdGhpcyBwbGF0Zm9ybSBpbXBsZW1lbnRzIGEgZ2l2ZW4gU3RhcmJvYXJkIEFQSQotLy8gdmVyc2lvbiBudW1iZXIgKG9yIGFib3ZlKS4KLS8vIFRoaXMgbWFjcm8gaXMgZGVwcmVjYXRlZCwgcGxlYXNlIGluc3RlYWQgdXNlIHRoZSBleHBhbmRlZCBmb3JtIGRpcmVjdGx5LgotI2RlZmluZSBTQl9WRVJTSU9OKFNCX0FQSSkgKFNCX0FQSV9WRVJTSU9OID49IFNCX0FQSSkKLQogLy8gQSBjb25zdGFudCBleHByZXNzaW9uIHRoYXQgZXZhbHVhdGVzIHRvIHRoZSBzaXplX3Qgc2l6ZSBvZiBhIHN0YXRpY2FsbHktc2l6ZWQKIC8vIGFycmF5LgogI2RlZmluZSBTQl9BUlJBWV9TSVpFKGFycmF5KSAoc2l6ZW9mKGFycmF5KSAvIHNpemVvZihhcnJheVswXSkpCkBAIC0yOTgsNyArMjk5LDYgQEAKICNkZWZpbmUgU0JfREVQUkVDQVRFRF9FWFRFUk5BTChGVU5DKSBTQl9ERVBSRUNBVEVEKEZVTkMpCiAjZW5kaWYKIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKIC8vIE1hY3JvIHRvIGFubm90YXRlIGEgZnVuY3Rpb24gYXMgbm9yZXR1cm4sIHdoaWNoIHNpZ25hbHMgdG8gdGhlIGNvbXBpbGVyCiAvLyB0aGF0IHRoZSBmdW5jdGlvbiBjYW5ub3QgcmV0dXJuLgogI2lmICFkZWZpbmVkKFNCX05PUkVUVVJOKQpAQCAtMzExLDcgKzMxMSw2IEBACiAjZGVmaW5lIFNCX05PUkVUVVJOCiAjZW5kaWYKICNlbmRpZiAgLy8gU0JfTk9SRVRVUk4KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogCiAvLyBTcGVjaWZpZXMgdGhlIGFsaWdubWVudCBmb3IgYSBjbGFzcywgc3RydWN0LCB1bmlvbiwgZW51bSwgY2xhc3Mvc3RydWN0IGZpZWxkLAogLy8gb3Igc3RhY2sgdmFyaWFibGUuCkBAIC00NjgsMzkgKzQ2NywxOCBAQAogI2Vycm9yICJZb3VyIHBsYXRmb3JtIG11c3QgZGVmaW5lIFNCX01BWF9USFJFQURfTkFNRV9MRU5HVEguIgogI2VuZGlmCiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSAyICYmICFkZWZpbmVkKFNCX0hBU19NSUNST1BIT05FKQorI2lmICFkZWZpbmVkKFNCX0hBU19NSUNST1BIT05FKQogI2Vycm9yICJZb3VyIHBsYXRmb3JtIG11c3QgZGVmaW5lIFNCX0hBU19NSUNST1BIT05FIGluIEFQSSB2ZXJzaW9ucyAyIG9yIGxhdGVyLiIKICNlbmRpZgogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gMyAmJiAhZGVmaW5lZChTQl9IQVNfVElNRV9USFJFQURfTk9XKQorI2lmICFkZWZpbmVkKFNCX0hBU19USU1FX1RIUkVBRF9OT1cpCiAjZXJyb3IgIllvdXIgcGxhdGZvcm0gbXVzdCBkZWZpbmUgU0JfSEFTX1RJTUVfVEhSRUFEX05PVyBpbiBBUEkgMyBvciBsYXRlci4iCiAjZW5kaWYKIAotI2lmIFNCX0FQSV9WRVJTSU9OIDwgNAotI2lmIFNCX0hBUyhQTEFZRVIpCi0jaWYgIVNCX0lTKFBMQVlFUl9DT01QT1NJVEVEKSAmJiAhU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKSAmJiBcCi0gICAgIVNCX0lTKFBMQVlFUl9QUk9EVUNJTkdfVEVYVFVSRSkKLSNlcnJvciAiWW91ciBwbGF5ZXIgbXVzdCBjaG9vc2UgYSBjb21wb3NpdGlvbiBtZXRob2QuIgotI2VuZGlmCi0jaWYgU0JfSVMoUExBWUVSX0NPTVBPU0lURUQpICYmIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKLSNlcnJvciAiWW91ciBwbGF5ZXIgY2FuJ3QgYmUgYm90aCBjb21wb3NpdGVkIGFuZCBwdW5jaGVkLW91dC4iCi0jZWxpZiBTQl9JUyhQTEFZRVJfQ09NUE9TSVRFRCkgJiYgU0JfSVMoUExBWUVSX1BST0RVQ0lOR19URVhUVVJFKQotI2Vycm9yICJZb3VyIHBsYXllciBjYW4ndCBiZSBib3RoIGNvbXBvc2l0ZWQgYW5kIHByb2R1Y2luZyBhIHRleHR1cmUuIgotI2VsaWYgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKSAmJiBTQl9JUyhQTEFZRVJfUFJPRFVDSU5HX1RFWFRVUkUpCi0jZXJyb3IgIllvdXIgcGxheWVyIGNhbid0IGJlIGJvdGggcHVuY2hlZC1vdXQgYW5kIHByb2R1Y2luZyBhIHRleHR1cmUuIgotI2VuZGlmCi0jZWxzZSAgLy8gU0JfSEFTKFBMQVlFUikKLSNpZiBTQl9JUyhQTEFZRVJfQ09NUE9TSVRFRCkgfHwgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKSB8fCBcCi0gICAgU0JfSVMoUExBWUVSX1BST0RVQ0lOR19URVhUVVJFKQotI2Vycm9yICJZb3VyIHBsYXllciBjYW4ndCBoYXZlIGEgY29tcG9zaXRpb24gbWV0aG9kIGlmIGl0IGRvZXNuJ3QgZXhpc3QuIgotI2VuZGlmCi0jZW5kaWYgIC8vIFNCX0hBUyhQTEFZRVIpCi0jZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OIDwgNAogI2lmIGRlZmluZWQoU0JfSVNfUExBWUVSX0NPTVBPU0lUSVRFRCkgfHwgZGVmaW5lZChTQl9JU19QTEFZRVJfUFVOQ0hFRF9PVVQpIHx8IFwKICAgICBkZWZpbmVkKFNCX0lTX1BMQVlFUl9QUk9EVUNJTkdfVEVYVFVSRSkKICNlcnJvciAiTmV3IHZlcnNpb25zIG9mIFN0YXJib2FyZCBzcGVjaWZ5IHBsYXllciBvdXRwdXQgbW9kZSBhdCBydW50aW1lLiIKICNlbmRpZgotI2VuZGlmICAvLyAvLyBTQl9BUElfVkVSU0lPTiA8IDQKIAogI2lmIChTQl9IQVMoTUFOWV9DT1JFUykgJiYgKFNCX0hBUygxX0NPUkUpIHx8IFNCX0hBUygyX0NPUkVTKSB8fCAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JfSEFTKDRfQ09SRVMpIHx8IFNCX0hBUyg2X0NPUkVTKSkpIHx8IFwKQEAgLTU0MSw4ICs1MTksNiBAQAogI2Vycm9yICJZb3VyIHBsYXRmb3JtIG11c3QgZGVmaW5lIFNCX01VU1RfRlJFUVVFTlRMWV9GTElQX0RJU1BMQVlfQlVGRkVSLiIKICNlbmRpZgogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAotCiAjaWYgIWRlZmluZWQoU0JfTUVESUFfTUFYX0FVRElPX0JJVFJBVEVfSU5fQklUU19QRVJfU0VDT05EKQogI2Vycm9yIFwKICAgICAiWW91ciBwbGF0Zm9ybSBtdXN0IGRlZmluZSBTQl9NRURJQV9NQVhfQVVESU9fQklUUkFURV9JTl9CSVRTX1BFUl9TRUNPTkQuIgpAQCAtNTUzLDEwICs1MjksNiBAQAogICAgICJZb3VyIHBsYXRmb3JtIG11c3QgZGVmaW5lIFNCX01FRElBX01BWF9WSURFT19CSVRSQVRFX0lOX0JJVFNfUEVSX1NFQ09ORC4iCiAjZW5kaWYgIC8vICFkZWZpbmVkKFNCX01FRElBX01BWF9WSURFT19CSVRSQVRFX0lOX0JJVFNfUEVSX1NFQ09ORCkKIAotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0Ci0KLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0Ci0KICNpZiBkZWZpbmVkKFNCX01FRElBX1NPVVJDRV9CVUZGRVJfU1RSRUFNX0FVRElPX01FTU9SWV9MSU1JVCkKICNlcnJvciAiU0JfTUVESUFfU09VUkNFX0JVRkZFUl9TVFJFQU1fQVVESU9fTUVNT1JZX0xJTUlUIGlzIGRlcHJlY2F0ZWQuIgogI2Vycm9yICJVc2UgZ3lwIHZhcmlhYmxlIHxjb2JhbHRfbWVkaWFfYnVmZmVyX25vbl92aWRlb19idWRnZXR8IGluc3RlYWQuIgpAQCAtNTc2LDggKzU0OCw2IEBACiAjZXJyb3IgIlNCX01FRElBX0dQVV9CVUZGRVJfQlVER0VUIGlzIGRlcHJlY2F0ZWQuIgogI2VuZGlmICAvLyBkZWZpbmVkKFNCX01FRElBX0dQVV9CVUZGRVJfQlVER0VUKQogCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKLQogI2lmIFNCX0FQSV9WRVJTSU9OID49IDUKICNpZiAhZGVmaW5lZChTQl9IQVNfU1BFRUNIX1JFQ09HTklaRVIpCiAjZXJyb3IgIllvdXIgcGxhdGZvcm0gbXVzdCBkZWZpbmUgU0JfSEFTX1NQRUVDSF9SRUNPR05JWkVSLiIKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvY3J5cHRvZ3JhcGh5LmggYi9zcmMvc3RhcmJvYXJkL2NyeXB0b2dyYXBoeS5oCmluZGV4IDhmNzAwYTkuLjJhZWZhN2UgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvY3J5cHRvZ3JhcGh5LmgKKysrIGIvc3JjL3N0YXJib2FyZC9jcnlwdG9ncmFwaHkuaApAQCAtNTAsOCArNTAsNiBAQAogI2luY2x1ZGUgInN0YXJib2FyZC9leHBvcnQuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvdHlwZXMuaCIKIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKLQogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgpAQCAtMjEyLDYgKzIxMCw0IEBACiB9ICAvLyBleHRlcm4gIkMiCiAjZW5kaWYKIAotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0Ci0KICNlbmRpZiAgLy8gU1RBUkJPQVJEX0NSWVBUT0dSQVBIWV9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9kZWNvZGVfdGFyZ2V0LmggYi9zcmMvc3RhcmJvYXJkL2RlY29kZV90YXJnZXQuaAppbmRleCBjNDM3Yzk2Li40MGE2ODBmIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2RlY29kZV90YXJnZXQuaAorKysgYi9zcmMvc3RhcmJvYXJkL2RlY29kZV90YXJnZXQuaApAQCAtOTYsMTUgKzk2LDggQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3R5cGVzLmgiCiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSAzCi0KICNpZiBTQl9IQVMoQkxJVFRFUikKICNpbmNsdWRlICJzdGFyYm9hcmQvYmxpdHRlci5oIgotI2VsaWYgU0JfSEFTKEdMRVMyKSAgLy8gU0JfSEFTKEJMSVRURVIpCi0jaWYgU0JfQVBJX1ZFUlNJT04gPCA0Ci0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IDQKICNlbmRpZiAgLy8gU0JfSEFTKEJMSVRURVIpCiAKICNpZmRlZiBfX2NwbHVzcGx1cwpAQCAtMTgwLDcgKzE3Myw2IEBACiAgIGtTYkRlY29kZVRhcmdldFBsYW5lViA9IDIsCiB9IFNiRGVjb2RlVGFyZ2V0UGxhbmU7CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAjaWYgU0JfSEFTKEdMRVMyKQogc3RydWN0IFNiRGVjb2RlVGFyZ2V0R3JhcGhpY3NDb250ZXh0UHJvdmlkZXI7CiAKQEAgLTIzNiwzNSArMjI4LDYgQEAKICNlbmRpZiAgLy8gU0JfSEFTKEJMSVRURVIpCiB9IFNiRGVjb2RlVGFyZ2V0R3JhcGhpY3NDb250ZXh0UHJvdmlkZXI7CiAKLSNlbHNlICAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAotLy8gQSBmdW5jdGlvbiB0aGF0IGNhbiBwcm9kdWNlIGFuIFNiRGVjb2RlVGFyZ2V0IG9mIHRoZSBnaXZlbiB8Zm9ybWF0fCwgfHdpZHRofCwKLS8vIGFuZCB8aGVpZ2h0fC4KLXR5cGVkZWYgU2JEZWNvZGVUYXJnZXQgKCpTYkRlY29kZVRhcmdldEFjcXVpcmVGdW5jdGlvbikoCi0gICAgdm9pZCogY29udGV4dCwKLSAgICBTYkRlY29kZVRhcmdldEZvcm1hdCBmb3JtYXQsCi0gICAgaW50IHdpZHRoLAotICAgIGludCBoZWlnaHQpOwotCi0vLyBBIGZ1bmN0aW9uIHRoYXQgY2FuIHJlY2xhaW0gYW4gU2JEZWNvZGVUYXJnZXQgYWxsb2NhdGVkIHdpdGggYW4KLS8vIFNiRGVjb2RlVGFyZ2V0QWNxdWlyZUZ1bmN0aW9uLgotdHlwZWRlZiB2b2lkICgqU2JEZWNvZGVUYXJnZXRSZWxlYXNlRnVuY3Rpb24pKHZvaWQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JEZWNvZGVUYXJnZXQgZGVjb2RlX3RhcmdldCk7Ci0KLS8vIEFuIG9iamVjdCB0aGF0IGNhbiBhY3F1aXJlIGFuZCByZWxlYXNlIFNiRGVjb2RlVGFyZ2V0IGluc3RhbmNlcy4KLXR5cGVkZWYgc3RydWN0IFNiRGVjb2RlVGFyZ2V0UHJvdmlkZXIgewotICAvLyBUaGUgZnVuY3Rpb24gdG8gYWNxdWlyZSBhIG5ldyBTYkRlY29kZVRhcmdldCBmcm9tIHRoZSBwcm92aWRlci4KLSAgU2JEZWNvZGVUYXJnZXRBY3F1aXJlRnVuY3Rpb24gYWNxdWlyZTsKLQotICAvLyBUaGUgZnVuY3Rpb24gdG8gcmVsZWFzZSBhbiBhY3F1aXJlZCBTYkRlY29kZVRhcmdldCBiYWNrIHRvIHRoZSBwcm92aWRlci4KLSAgU2JEZWNvZGVUYXJnZXRSZWxlYXNlRnVuY3Rpb24gcmVsZWFzZTsKLQotICAvLyB8Y29udGV4dHwgd2lsbCBiZSBwYXNzZWQgaW50byBldmVyeSBjYWxsIHRvIHxhY3F1aXJlfCBhbmQgfHJlbGVhc2V8LgotICB2b2lkKiBjb250ZXh0OwotfSBTYkRlY29kZVRhcmdldFByb3ZpZGVyOwotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0Ci0KLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0Ci0KIC8vIERlZmluZXMgYSByZWN0YW5ndWxhciBjb250ZW50IHJlZ2lvbiB3aXRoaW4gYSBTYkRlY29kZVRhcmdldEluZm9QbGFuZQogLy8gc3RydWN0dXJlLgogdHlwZWRlZiBzdHJ1Y3QgU2JEZWNvZGVUYXJnZXRJbmZvQ29udGVudFJlZ2lvbiB7CkBAIC0zNDIsOCArMzA1LDYgQEAKICAgU2JEZWNvZGVUYXJnZXRJbmZvUGxhbmUgcGxhbmVzWzNdOwogfSBTYkRlY29kZVRhcmdldEluZm87CiAKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAotCiAvLyAtLS0gQ29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gV2VsbC1kZWZpbmVkIHZhbHVlIGZvciBhbiBpbnZhbGlkIGRlY29kZSB0YXJnZXQgaGFuZGxlLgpAQCAtMzg0LDEwMSArMzQ1LDYgQEAKIH0KICNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfREVDT0RFX1RBUkdFVF9QTEFORVNfRk9SX0ZPUk1BVAogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPCA0Ci0KLSNpZiBTQl9IQVMoQkxJVFRFUikKLQotLy8gQ3JlYXRlcyBhIG5ldyBTYkJsaXR0ZXItY29tcGF0aWJsZSBTYkRlY29kZVRhcmdldCBmcm9tIG9uZSBvciBtb3JlIHxwbGFuZXN8Ci0vLyBjcmVhdGVkIGZyb20gfGRpc3BsYXl8LgotLy8KLS8vIHxmb3JtYXR8OiBUaGUgZm9ybWF0IG9mIHRoZSBkZWNvZGUgdGFyZ2V0IGJlaW5nIGNyZWF0ZWQuCi0vLyB8cGxhbmVzfDogQW4gYXJyYXkgb2YgU2JCbGl0dGVyU3VyZmFjZSBoYW5kbGVzIHRvIGJlIGJ1bmRsZWQgaW50byBhbgotLy8gU2JEZWNvZGVUYXJnZXQuIE11c3Qgbm90IGJlIE5VTEwuIElzIGV4cGVjdGVkIHRvIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mCi0vLyBlbnRyaWVzIGFzIHRoZSBudW1iZXIgb2YgcGxhbmVzIGZvciB8Zm9ybWF0fCwgaW4gdGhlIG9yZGVyIGFuZCBzaXplIGV4cGVjdGVkCi0vLyBieSB0aGF0IGZvcm1hdC4KLVNCX0VYUE9SVCBTYkRlY29kZVRhcmdldCBTYkRlY29kZVRhcmdldENyZWF0ZShTYkRlY29kZVRhcmdldEZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JCbGl0dGVyU3VyZmFjZSogcGxhbmVzKTsKLQotLy8gR2V0cyB0aGUgc3VyZmFjZSB0aGF0IHJlcHJlc2VudHMgdGhlIGdpdmVuIHBsYW5lLgotU0JfRVhQT1JUIFNiQmxpdHRlclN1cmZhY2UgU2JEZWNvZGVUYXJnZXRHZXRQbGFuZShTYkRlY29kZVRhcmdldCBkZWNvZGVfdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRlY29kZVRhcmdldFBsYW5lIHBsYW5lKTsKLQotI2VsaWYgU0JfSEFTKEdMRVMyKSAgLy8gU0JfSEFTKEJMSVRURVIpCi0KLS8vIENyZWF0ZXMgYSBuZXcgRUdML0dMRVMyLWNvbXBhdGlibGUgU2JEZWNvZGVUYXJnZXQgZnJvbSBvbmUgb3IgbW9yZSB8cGxhbmVzfAotLy8gb3duZWQgYnkgfGNvbnRleHR8LCBjcmVhdGVkIGZyb20gfGRpc3BsYXl8LiBNdXN0IGJlIGNhbGxlZCBmcm9tIGEgdGhyZWFkCi0vLyB3aGVyZSB8Y29udGV4dHwgaXMgY3VycmVudC4KLS8vCi0vLyB8ZGlzcGxheXw6IFRoZSBFR0xEaXNwbGF5IGJlaW5nIHRhcmdldGVkLgotLy8gfGNvbnRleHR8OiBUaGUgRUdMQ29udGV4dCB1c2VkIGZvciB0aGlzIG9wZXJhdGlvbiwgb3IgRUdMX05PX0NPTlRFWFQgaWYgYQotLy8gY29udGV4dCBpcyBub3QgcmVxdWlyZWQuCi0vLyB8Zm9ybWF0fDogVGhlIGZvcm1hdCBvZiB0aGUgZGVjb2RlIHRhcmdldCBiZWluZyBjcmVhdGVkLgotLy8gfHBsYW5lc3w6IEFuIGFycmF5IG9mIEdMRVMgVGV4dHVyZSBoYW5kbGVzIHRvIGJlIGJ1bmRsZWQgaW50byBhbgotLy8gU2JEZWNvZGVUYXJnZXQuIE11c3Qgbm90IGJlIE5VTEwuIElzIGV4cGVjdGVkIHRvIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mCi0vLyBlbnRyaWVzIGFzIHRoZSBudW1iZXIgb2YgcGxhbmVzIGZvciB8Zm9ybWF0fCwgaW4gdGhlIG9yZGVyIGFuZCBzaXplIGV4cGVjdGVkCi0vLyBieSB0aGF0IGZvcm1hdC4KLVNCX0VYUE9SVCBTYkRlY29kZVRhcmdldCBTYkRlY29kZVRhcmdldENyZWF0ZShFR0xEaXNwbGF5IGRpc3BsYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRGVjb2RlVGFyZ2V0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQqIHBsYW5lcyk7Ci0KLS8vIEdldHMgdGhlIHRleHR1cmUgdGhhdCByZXByZXNlbnRzIHRoZSBnaXZlbiBwbGFuZS4KLVNCX0VYUE9SVCBHTHVpbnQgU2JEZWNvZGVUYXJnZXRHZXRQbGFuZShTYkRlY29kZVRhcmdldCBkZWNvZGVfdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRGVjb2RlVGFyZ2V0UGxhbmUgcGxhbmUpOwotCi0jZWxzZSAgLy8gU0JfSEFTKEJMSVRURVIpCi0KLS8vIFN0dWIgZnVuY3Rpb24gZm9yIHdoZW4gZ3JhcGhpY3MgYXJlbid0IGVuYWJsZWQuICBBbHdheXMgY3JlYXRlcwotLy8ga1NiRGVjb2RlVGFyZ2V0SW52YWxpZC4KLS8vIFRPRE86IFdobyBpcyBjYWxsaW5nIHRoaXMgd2hlbiBncmFwaGljcyBhcmVuJ3QgZW5hYmxlZD8KLXN0YXRpYyBTQl9DX0lOTElORSBTYkRlY29kZVRhcmdldAotU2JEZWNvZGVUYXJnZXRDcmVhdGUoU2JEZWNvZGVUYXJnZXRGb3JtYXQgZm9ybWF0KSB7Ci0gIFNCX1VOUkVGRVJFTkNFRF9QQVJBTUVURVIoZm9ybWF0KTsKLSAgcmV0dXJuIGtTYkRlY29kZVRhcmdldEludmFsaWQ7Ci19Ci0KLSNlbmRpZiAgLy8gU0JfSEFTKEJMSVRURVIpCi0KLS8vIERlc3Ryb3lzIHRoZSBnaXZlbiBTYkRlY29kZVRhcmdldCBhbmQgYWxsIGl0cyBhc3NvY2lhdGVkIHN1cmZhY2VzLgotU0JfRVhQT1JUIHZvaWQgU2JEZWNvZGVUYXJnZXREZXN0cm95KFNiRGVjb2RlVGFyZ2V0IGRlY29kZV90YXJnZXQpOwotCi0vLyBHZXRzIHRoZSBmb3JtYXQgdGhhdCB8ZGVjb2RlX3RhcmdldHwgd2FzIGNyZWF0ZWQgd2l0aC4KLVNCX0VYUE9SVCBTYkRlY29kZVRhcmdldEZvcm1hdAotU2JEZWNvZGVUYXJnZXRHZXRGb3JtYXQoU2JEZWNvZGVUYXJnZXQgZGVjb2RlX3RhcmdldCk7Ci0KLS8vIEdldHMgd2hldGhlciB8ZGVjb2RlX3RhcmdldHwgaXMgb3BhcXVlIG9yIG5vdC4gIFRoZSB1bmRlcmx5aW5nIHNvdXJjZSBvZgotLy8gdGhpcyB2YWx1ZSBpcyBleHBlY3RlZCB0byBiZSBwcm9wZXJseSBtYWludGFpbmVkIGJ5IHRoZSBTdGFyYm9hcmQKLS8vIGltcGxlbWVudGF0aW9uLiAgU28sIGZvciBleGFtcGxlLCBpZiBhbiBvcGFxdWUgb25seSBpbWFnZSB0eXBlIHdlcmUgZGVjb2RlZAotLy8gaW50byBhbiBTYkRlY29kZVRhcmdldCwgdGhlbiB0aGUgaW1wbGVtZW50YXRpb24gd291bGQgY29uZmlndXJlIHRoaW5ncyBpbgotLy8gc3VjaCBhIHdheSB0aGF0IHRoaXMgZnVuY3Rpb24gd291bGQgcmV0dXJuIHRydWUuICBCeSBvcGFxdWUsIGl0IGlzIG1lYW50Ci0vLyB0aGF0IGFsbCBhbHBoYSB2YWx1ZXMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgMjU1LCBpZiB8ZGVjb2RlX3RhcmdldHwgaXMgb2YgYQotLy8gZm9ybWF0IHRoYXQgaGFzIGFscGhhIHZhbHVlcy4gIElmIHxkZWNvZGVfdGFyZ2V0fCBpcyBvZiBhIGZvcm1hdCB0aGF0IGRvZXMKLS8vIG5vdCBoYXZlIGFscGhhIHZhbHVlcywgdGhlbiB0aGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gfHRydWV8LgotU0JfRVhQT1JUIGJvb2wgU2JEZWNvZGVUYXJnZXRJc09wYXF1ZShTYkRlY29kZVRhcmdldCBkZWNvZGVfdGFyZ2V0KTsKLQotLy8gSW5saW5lIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGFjcXVpcmUgYW4gU2JEZWNvZGVUYXJnZXQgb2YgdHlwZSB8Zm9ybWF0fCwKLS8vIHx3aWR0aHwsIGFuZCB8aGVpZ2h0fCBmcm9tIHxwcm92aWRlcnwuCi1zdGF0aWMgU0JfQ19JTkxJTkUgU2JEZWNvZGVUYXJnZXQKLVNiRGVjb2RlVGFyZ2V0QWNxdWlyZUZyb21Qcm92aWRlcihTYkRlY29kZVRhcmdldFByb3ZpZGVyKiBwcm92aWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRlY29kZVRhcmdldEZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQpIHsKLSAgcmV0dXJuIHByb3ZpZGVyLT5hY3F1aXJlKHByb3ZpZGVyLT5jb250ZXh0LCBmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwotfQotCi0vLyBJbmxpbmUgY29udmVuaWVuY2UgZnVuY3Rpb24gdG8gcmVsZWFzZSB8ZGVjb2RlX3RhcmdldHwgYmFjayB0byB8cHJvdmlkZXJ8Lgotc3RhdGljIFNCX0NfSU5MSU5FIHZvaWQgU2JEZWNvZGVUYXJnZXRSZWxlYXNlVG9Qcm92aWRlcigKLSAgICBTYkRlY29kZVRhcmdldFByb3ZpZGVyKiBwcm92aWRlciwKLSAgICBTYkRlY29kZVRhcmdldCBkZWNvZGVfdGFyZ2V0KSB7Ci0gIHByb3ZpZGVyLT5yZWxlYXNlKHByb3ZpZGVyLT5jb250ZXh0LCBkZWNvZGVfdGFyZ2V0KTsKLX0KLQotI2Vsc2UgIC8vIFNCX0FQSV9WRVJTSU9OIDwgNAotCi0vLyBTQkNIQU5HRUxPRzogUmVuYW1lIFNiRGVjb2RlVGFyZ2V0RGVzdHJveSgpIHRvIFNiRGVjb2RlVGFyZ2V0UmVsZWFzZSgpIHRvCi0vLyAgICAgICAgICAgICAgbW9yZSBhY2N1cmF0ZWx5IHJlZmxlY3QgaXRzIHBvdGVudGlhbCBzZW1hbnRpY3MgYXMgYSByZWZlcmVuY2UKLS8vICAgICAgICAgICAgICBjb3VudCBkZWNyZW1lbnRlci4KLQogLy8gUmV0dXJucyBvd25lcnNoaXAgb2YgfGRlY29kZV90YXJnZXR8IHRvIHRoZSBTdGFyYm9hcmQgaW1wbGVtZW50YXRpb24uCiAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgbGlrZWx5IHJlc3VsdCBpbiB0aGUgZGVzdHJ1Y3Rpb24gb2YgdGhlIFNiRGVjb2RlVGFyZ2V0IGFuZAogLy8gYWxsIGl0cyBhc3NvY2lhdGVkIHN1cmZhY2VzLCB0aG91Z2ggaW4gc29tZSBjYXNlcywgcGxhdGZvcm1zIG1heSBzaW1wbHkKQEAgLTQ4NiwxMCArMzUyLDYgQEAKIC8vIG11c3QgYmUgY2FsbGVkIG9uIGEgdGhyZWFkIHdpdGggdGhlIGNvbnRleHQKIFNCX0VYUE9SVCB2b2lkIFNiRGVjb2RlVGFyZ2V0UmVsZWFzZShTYkRlY29kZVRhcmdldCBkZWNvZGVfdGFyZ2V0KTsKIAotLy8gU0JDSEFOR0VMT0c6IFJlbW92ZSBhbGwgU2JEZWNvZGVUYXJnZXQgImdldCIgZnVuY3Rpb25zIGFuZCByZXBsYWNlIHRoZW0gd2l0aAotLy8gICAgICAgICAgICAgIGEgU2JEZWNvZGVUYXJnZXRHZXRJbmZvKCkgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFsbCBpbmZvcm1hdGlvbgotLy8gICAgICAgICAgICAgIGFib3V0IGEgZGVjb2RlIHRhcmdldCBhdCBvbmNlLgotCiAvLyBXcml0ZXMgYWxsIGluZm9ybWF0aW9uIGFib3V0IHxkZWNvZGVfdGFyZ2V0fCBpbnRvIHxvdXRfaW5mb3wuICBSZXR1cm5zIGZhbHNlCiAvLyBpZiB0aGUgcHJvdmlkZWQgfG91dF9pbmZvfCBzdHJ1Y3R1cmUgaXMgbm90IHplcm8gaW5pdGlhbGl6ZWQuCiBTQl9FWFBPUlQgYm9vbCBTYkRlY29kZVRhcmdldEdldEluZm8oU2JEZWNvZGVUYXJnZXQgZGVjb2RlX3RhcmdldCwKQEAgLTUyNSwxMiArMzg3LDggQEAKIAogI2VuZGlmICAvLyBTQl9IQVMoR0xFUzIpCiAKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCA0Ci0KICNpZmRlZiBfX2NwbHVzcGx1cwogfSAgLy8gZXh0ZXJuICJDIgogI2VuZGlmCiAKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gMwotCiAjZW5kaWYgIC8vIFNUQVJCT0FSRF9ERUNPREVfVEFSR0VUX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2RybS5oIGIvc3JjL3N0YXJib2FyZC9kcm0uaAppbmRleCBjYWUwNzZkLi44MTQ5Y2Q4IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2RybS5oCisrKyBiL3NyYy9zdGFyYm9hcmQvZHJtLmgKQEAgLTg4LDE3ICs4OCwxNSBAQAogLy8gZnJvbSBhIFNiRHJtU3lzdGVtLiB8ZHJtX3N5c3RlbXwgd2lsbCBiZSB0aGUgRFJNIHN5c3RlbSB0aGF0CiAvLyBTYkRybUdlbmVyYXRlU2Vzc2lvblVwZGF0ZVJlcXVlc3QoKSB3YXMgY2FsbGVkIG9uLiB8Y29udGV4dHwgd2lsbCBiZSB0aGUgc2FtZQogLy8gY29udGV4dCB0aGF0IHdhcyBwYXNzZWQgaW50byB0aGUgY2FsbCB0byBTYkRybUNyZWF0ZVN5c3RlbSgpLgotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKLS8vIHx0aWNrZXR8IHdpbGwgYmUgdGhlIHNhbWUgdGlja2V0IHRoYXQgd2FzIHBhc3NlZAotLy8gdG8gU2JEcm1HZW5lcmF0ZVNlc3Npb25VcGRhdGVSZXF1ZXN0KCkgb3IgfGtTYkRybVRpY2tldEludmFsaWR8IGlmCi0vLyB0aGUgdXBkYXRlIHJlcXVlc3Qgd2FzIGdlbmVyYXRlZCBieSB0aGUgRFJNIHN5c3RlbS4KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAorLy8KKy8vIHx0aWNrZXR8IHdpbGwgYmUgdGhlIHNhbWUgdGlja2V0IHRoYXQgd2FzIHBhc3NlZCB0bworLy8gU2JEcm1HZW5lcmF0ZVNlc3Npb25VcGRhdGVSZXF1ZXN0KCkgb3IgfGtTYkRybVRpY2tldEludmFsaWR8IGlmIHRoZSB1cGRhdGUKKy8vIHJlcXVlc3Qgd2FzIGdlbmVyYXRlZCBieSB0aGUgRFJNIHN5c3RlbS4KKy8vCiAvLyB8c2Vzc2lvbl9pZHwgY2FuIGJlIE5VTEwgaWYgdGhlcmUgd2FzIGFuIGVycm9yIGdlbmVyYXRpbmcgdGhlIHJlcXVlc3QuCiB0eXBlZGVmIHZvaWQgKCpTYkRybVNlc3Npb25VcGRhdGVSZXF1ZXN0RnVuYykoU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0LAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlja2V0LAotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc2Vzc2lvbl9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbl9pZF9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGNvbnRlbnQsCkBAIC0xMDksMTUgKzEwNywxMyBAQAogLy8gZW5jcnlwdGVkIHNhbXBsZXMgYXJlIGFjdGl2ZWx5IHJlYWR5IHRvIGJlIGRlY29kZWQuIHxkcm1fc3lzdGVtfCB3aWxsIGJlIHRoZQogLy8gRFJNIHN5c3RlbSB0aGF0IFNiRHJtVXBkYXRlU2Vzc2lvbigpIHdhcyBjYWxsZWQgb24uIHxjb250ZXh0fCB3aWxsIGJlIHRoZQogLy8gc2FtZSBjb250ZXh0IHBhc3NlZCBpbnRvIHRoYXQgY2FsbCB0byBTYkRybUNyZWF0ZVN5c3RlbSgpLgotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKKy8vCiAvLyB8dGlja2V0fCB3aWxsIGJlIHRoZSBzYW1lIHRpY2tldCB0aGF0IHdhcyBwYXNzZWQgdG8gU2JEcm1VcGRhdGVTZXNzaW9uKCkuCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKKy8vCiAvLyB8c3VjY2VlZGVkfCBpcyB3aGV0aGVyIHRoZSBzZXNzaW9uIHdhcyBzdWNjZXNzZnVsbHkgdXBkYXRlZCBvciBub3QuCiB0eXBlZGVmIHZvaWQgKCpTYkRybVNlc3Npb25VcGRhdGVkRnVuYykoU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0LAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlja2V0LAotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc2Vzc2lvbl9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbl9pZF9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VlZGVkKTsKQEAgLTE0MSwxMCArMTM3LDggQEAKIC8vIEFuIGludmFsaWQgU2JEcm1TeXN0ZW0uCiAjZGVmaW5lIGtTYkRybVN5c3RlbUludmFsaWQgKChTYkRybVN5c3RlbSlOVUxMKQogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogLy8gQSB0aWNrZXQgZm9yIGNhbGxiYWNrIGludm9jYXRpb25zIGluaXRpYXRlZCBieSB0aGUgRFJNIHN5c3RlbS4KICNkZWZpbmUga1NiRHJtVGlja2V0SW52YWxpZCBrU2JJbnZhbGlkSW50Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKIAogLy8gLS0tIEZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTE1MywxMiArMTQ3LDEwIEBACiAgIHJldHVybiBkcm0gIT0ga1NiRHJtU3lzdGVtSW52YWxpZDsKIH0KIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKIC8vIEluZGljYXRlcyB3aGV0aGVyIHx0aWNrZXR8IGlzIGEgdmFsaWQgdGlja2V0Lgogc3RhdGljIFNCX0NfRk9SQ0VfSU5MSU5FIGJvb2wgU2JEcm1UaWNrZXRJc1ZhbGlkKGludCB0aWNrZXQpIHsKICAgcmV0dXJuIHRpY2tldCAhPSBrU2JEcm1UaWNrZXRJbnZhbGlkOwogfQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiAKIC8vIENyZWF0ZXMgYSBuZXcgRFJNIHN5c3RlbSB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gY29uc3RydWN0aW5nIGFuIFNiUGxheWVyCiAvLyBvciBhbiBTYkRlY29kZXIuCkBAIC0yMTcsMjMgKzIwOSwyMSBAQAogLy8gfGRybV9zeXN0ZW18OiBUaGUgRFJNIHN5c3RlbSB0aGF0IGRlZmluZXMgdGhlIGtleSBzeXN0ZW0gdXNlZCBmb3IgdGhlCiAvLyBzZXNzaW9uIHVwZGF0ZSByZXF1ZXN0IHBheWxvYWQgYXMgd2VsbCBhcyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcwogLy8gY2FsbGVkIGFzIGEgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBiZWluZyBjYWxsZWQuCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAotLy8gfHRpY2tldHw6IFRoZSBvcGFxdWUgSUQgdGhhdCBhbGxvd3MgdG8gZGlzdGluZ3Vpc2ggY2FsbGJhY2tzIGZyb20KLS8vIG11bHRpcGxlIGNvbmN1cnJlbnQgY2FsbHMgdG8gU2JEcm1HZW5lcmF0ZVNlc3Npb25VcGRhdGVSZXF1ZXN0KCksCi0vLyB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byB8dXBkYXRlX3JlcXVlc3RfY2FsbGJhY2t8IGFzLWlzLiBJdCBpcwotLy8gdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gZXN0YWJsaXNoIHRpY2tldCB1bmlxdWVuZXNzLCBpc3N1aW5nCi0vLyBtdWx0aXBsZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgdGlja2V0IG1heSByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW9yLgotLy8gVmFsdWUgfGtTYkRybVRpY2tldEludmFsaWR8IG11c3Qgbm90IGJlIHVzZWQuCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKKy8vCisvLyB8dGlja2V0fDogVGhlIG9wYXF1ZSBJRCB0aGF0IGFsbG93cyB0byBkaXN0aW5ndWlzaCBjYWxsYmFja3MgZnJvbSBtdWx0aXBsZQorLy8gY29uY3VycmVudCBjYWxscyB0byBTYkRybUdlbmVyYXRlU2Vzc2lvblVwZGF0ZVJlcXVlc3QoKSwgd2hpY2ggd2lsbCBiZSBwYXNzZWQKKy8vIHRvIHx1cGRhdGVfcmVxdWVzdF9jYWxsYmFja3wgYXMtaXMuIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIHRvCisvLyBlc3RhYmxpc2ggdGlja2V0IHVuaXF1ZW5lc3MsIGlzc3VpbmcgbXVsdGlwbGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIHRpY2tldAorLy8gbWF5IHJlc3VsdCBpbiB1bmRlZmluZWQgYmVoYXZpb3IuIFRoZSB2YWx1ZSB8a1NiRHJtVGlja2V0SW52YWxpZHwgbXVzdCBub3QgYmUKKy8vIHVzZWQuCisvLwogLy8gfHR5cGV8OiBUaGUgY2FzZS1zZW5zaXRpdmUgdHlwZSBvZiB0aGUgc2Vzc2lvbiB1cGRhdGUgcmVxdWVzdCBwYXlsb2FkLgogLy8gfGluaXRpYWxpemF0aW9uX2RhdGF8OiBUaGUgZGF0YSBmb3Igd2hpY2ggdGhlIHNlc3Npb24gdXBkYXRlIHJlcXVlc3QgcGF5bG9hZAogLy8gaXMgY3JlYXRlZC4KIC8vIHxpbml0aWFsaXphdGlvbl9kYXRhX3NpemV8OiBUaGUgc2l6ZSBvZiB0aGUgc2Vzc2lvbiB1cGRhdGUgcmVxdWVzdCBwYXlsb2FkLgogU0JfRVhQT1JUIHZvaWQgU2JEcm1HZW5lcmF0ZVNlc3Npb25VcGRhdGVSZXF1ZXN0KAogICAgIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0sCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICAgIGludCB0aWNrZXQsCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKICAgICBjb25zdCBjaGFyKiB0eXBlLAogICAgIGNvbnN0IHZvaWQqIGluaXRpYWxpemF0aW9uX2RhdGEsCiAgICAgaW50IGluaXRpYWxpemF0aW9uX2RhdGFfc2l6ZSk7CkBAIC0yNDIsMTMgKzIzMiwxMiBAQAogLy8gc2VydmVyIHJlc3BvbnNlLiBDYWxscyB8c2Vzc2lvbl91cGRhdGVkX2NhbGxiYWNrfCB3aXRoIHxjb250ZXh0fCBhbmQgd2hldGhlcgogLy8gdGhlIHVwZGF0ZSBzdWNjZWVkZWQuIHxjb250ZXh0fCBtYXkgYmUgdXNlZCB0byByb3V0ZSBjYWxsYmFja3MgYmFjayB0bwogLy8gYW4gb2JqZWN0IGluc3RhbmNlLgotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKKy8vCiAvLyB8dGlja2V0fCBpcyB0aGUgb3BhcXVlIElEIHRoYXQgYWxsb3dzIHRvIGRpc3Rpbmd1aXNoIGNhbGxiYWNrcyBmcm9tCiAvLyBtdWx0aXBsZSBjb25jdXJyZW50IGNhbGxzIHRvIFNiRHJtVXBkYXRlU2Vzc2lvbigpLCB3aGljaCB3aWxsIGJlIHBhc3NlZAogLy8gdG8gfHNlc3Npb25fdXBkYXRlZF9jYWxsYmFja3wgYXMtaXMuIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyCiAvLyB0byBlc3RhYmxpc2ggdGlja2V0IHVuaXF1ZW5lc3MsIGlzc3VpbmcgbXVsdGlwbGUgY2FsbHMgd2l0aCB0aGUgc2FtZSB0aWNrZXQKIC8vIG1heSByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW9yLgotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiAvLwogLy8gT25jZSB0aGUgc2Vzc2lvbiBpcyBzdWNjZXNzZnVsbHkgdXBkYXRlZCwgYW4gU2JQbGF5ZXIgb3IgU2JEZWNvZGVyIGFzc29jaWF0ZWQKIC8vIHdpdGggdGhhdCBEUk0ga2V5IHN5c3RlbSB3aWxsIGJlIGFibGUgdG8gZGVjcnlwdCBlbmNyeXB0ZWQgc2FtcGxlcy4KQEAgLTI1Niw5ICsyNDUsNyBAQAogLy8gfGRybV9zeXN0ZW18J3MgfHNlc3Npb25fdXBkYXRlZF9jYWxsYmFja3wgbWF5IGNhbGxlZCBlaXRoZXIgZnJvbSB0aGUKIC8vIGN1cnJlbnQgdGhyZWFkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMgb3IgZnJvbSBhbm90aGVyIHRocmVhZC4KIFNCX0VYUE9SVCB2b2lkIFNiRHJtVXBkYXRlU2Vzc2lvbihTYkRybVN5c3RlbSBkcm1fc3lzdGVtLAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlja2V0LAotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCoga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBrZXlfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBzZXNzaW9uX2lkLApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ldmVudC5oIGIvc3JjL3N0YXJib2FyZC9ldmVudC5oCmluZGV4IDk3ODhlY2QuLjdiZmNhMmMgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvZXZlbnQuaAorKysgYi9zcmMvc3RhcmJvYXJkL2V2ZW50LmgKQEAgLTE5OSwxMiArMTk5LDEwIEBACiAgIC8vIGRpcmVjdGx5LiBUaGUgZGF0YSB0eXBlIGlzIGFuIGludGVybmFsbHktZGVmaW5lZCBzdHJ1Y3R1cmUuCiAgIGtTYkV2ZW50VHlwZVNjaGVkdWxlZCwKIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgLy8gVGhlIHBsYXRmb3JtJ3MgYWNjZXNzaWJpbGl0eSBzZXR0aW5ncyBoYXZlIGNoYW5nZWQuIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQKICAgLy8gcXVlcnkgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZ3MgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIEFQSXMgdG8gZ2V0IHRoZQogICAvLyBuZXcgc2V0dGluZ3MuCiAgIGtTYkV2ZW50VHlwZUFjY2Vzc2libGl0eVNldHRpbmdzQ2hhbmdlZCwKLSNlbmRpZgogCiAjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfTE9XX01FTU9SWV9FVkVOVF9BUElfVkVSU0lPTgogICAvLyBBbiBvcHRpb25hbCBldmVudCB0aGF0IHBsYXRmb3JtcyBtYXkgc2VuZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBhcHBsaWNhdGlvbgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9leGFtcGxlcy93aW5kb3cvbWFpbi5jYyBiL3NyYy9zdGFyYm9hcmQvZXhhbXBsZXMvd2luZG93L21haW4uY2MKaW5kZXggYzk0NDU2NC4uYjUwOGU3ZCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9leGFtcGxlcy93aW5kb3cvbWFpbi5jYworKysgYi9zcmMvc3RhcmJvYXJkL2V4YW1wbGVzL3dpbmRvdy9tYWluLmNjCkBAIC00NywxMSArNDcsOSBAQAogICAgICAgZ193aW5kb3cgPSBTYldpbmRvd0NyZWF0ZShOVUxMKTsKICAgICAgIFNCX0NIRUNLKFNiV2luZG93SXNWYWxpZChnX3dpbmRvdykpOwogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICAgICAgU0JfTE9HKElORk8pIDw8ICIgICAgRjEgLSBQYXVzZSI7CiAgICAgICBTQl9MT0coSU5GTykgPDwgIiAgICBGMiAtIFVucGF1c2UiOwogICAgICAgU0JfTE9HKElORk8pIDw8ICIgICAgRjMgLSBTdXNwZW5kIjsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogICAgICAgU0JfTE9HKElORk8pIDw8ICIgICAgRjUgLSBTdG9wIjsKICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTkxLDcgKzg5LDYgQEAKICAgICAgIH0KIAogICAgICAgc3dpdGNoIChkYXRhLT5rZXkpIHsKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAgICAgICAgIGNhc2Uga1NiS2V5RjE6CiAgICAgICAgICAgU2JTeXN0ZW1SZXF1ZXN0UGF1c2UoKTsKICAgICAgICAgICBicmVhazsKQEAgLTEwMSw3ICs5OCw2IEBACiAgICAgICAgIGNhc2Uga1NiS2V5RjM6CiAgICAgICAgICAgU2JTeXN0ZW1SZXF1ZXN0U3VzcGVuZCgpOwogICAgICAgICAgIGJyZWFrOwotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiAgICAgICAgIGNhc2Uga1NiS2V5RjU6CiAgICAgICAgICAgU2JTeXN0ZW1SZXF1ZXN0U3RvcCgwKTsKICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvaW1hZ2UuaCBiL3NyYy9zdGFyYm9hcmQvaW1hZ2UuaAppbmRleCA3MjEwNjdjLi45ZjkwNTRhIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2ltYWdlLmgKKysrIGIvc3JjL3N0YXJib2FyZC9pbWFnZS5oCkBAIC01Miw4ICs1Miw2IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL2V4cG9ydC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC90eXBlcy5oIgogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gMwotCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCkBAIC04OCwxMSArODYsNyBAQAogLy8ga1NiRGVjb2RlVGFyZ2V0SW52YWxpZCB3aWxsIGJlIHJldHVybmVkLCB3aXRoIGFueSBpbnRlcm1lZGlhdGUgYWxsb2NhdGlvbnMKIC8vIGJlaW5nIGNsZWFuZWQgdXAgaW4gdGhlIGltcGxlbWVudGF0aW9uLgogU0JfRVhQT1JUIFNiRGVjb2RlVGFyZ2V0IFNiSW1hZ2VEZWNvZGUoCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICAgIFNiRGVjb2RlVGFyZ2V0R3JhcGhpY3NDb250ZXh0UHJvdmlkZXIqIGNvbnRleHRfcHJvdmlkZXIsCi0jZWxzZQotICAgIFNiRGVjb2RlVGFyZ2V0UHJvdmlkZXIqIHByb3ZpZGVyLAotI2VuZGlmCiAgICAgdm9pZCogZGF0YSwKICAgICBpbnQgZGF0YV9zaXplLAogICAgIGNvbnN0IGNoYXIqIG1pbWVfdHlwZSwKQEAgLTEwMiw2ICs5Niw0IEBACiB9ICAvLyBleHRlcm4gIkMiCiAjZW5kaWYKIAotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSAzCi0KICNlbmRpZiAgLy8gU1RBUkJPQVJEX0lNQUdFX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2lucHV0LmggYi9zcmMvc3RhcmJvYXJkL2lucHV0LmgKaW5kZXggMzUxMDIzMC4uYzNhN2RiZiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9pbnB1dC5oCisrKyBiL3NyYy9zdGFyYm9hcmQvaW5wdXQuaApAQCAtMTI4LDE3ICsxMjgsMTAgQEAKIH0gU2JJbnB1dEV2ZW50VHlwZTsKIAogLy8gQSAyLWRpbWVuc2lvbmFsIHZlY3RvciB1c2VkIHRvIHJlcHJlc2VudCBwb2ludHMgYW5kIG1vdGlvbiB2ZWN0b3JzLgotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKIHR5cGVkZWYgc3RydWN0IFNiSW5wdXRWZWN0b3IgewogICBmbG9hdCB4OwogICBmbG9hdCB5OwogfSBTYklucHV0VmVjdG9yOwotI2Vsc2UKLXR5cGVkZWYgc3RydWN0IFNiSW5wdXRWZWN0b3IgewotICBpbnQgeDsKLSAgaW50IHk7Ci19IFNiSW5wdXRWZWN0b3I7Ci0jZW5kaWYKIAogLy8gRXZlbnQgZGF0YSBmb3IgfGtTYkV2ZW50VHlwZUlucHV0fCBldmVudHMuCiB0eXBlZGVmIHN0cnVjdCBTYklucHV0RGF0YSB7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2tleS5oIGIvc3JjL3N0YXJib2FyZC9rZXkuaAppbmRleCA5YzVhNmMxLi40NjJkY2FmIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2tleS5oCisrKyBiL3NyYy9zdGFyYm9hcmQva2V5LmgKQEAgLTIwNCwxNyArMjA0LDIyIEBACiAgIC8vIEJleW9uZCB0aGlzIHBvaW50IGFyZSBub24tV2luZG93cyBrZXkgY29kZXMgdGhhdCBhcmUgcHJvdmlkZWQgYXMKICAgLy8gZXh0ZW5zaW9ucywgYXMgdGhleSBvdGhlcndpc2UgaGF2ZSBubyBhbmFsb2dzLgogCi0gIC8vIFNvbWUgbWVkaWEga2V5cyB0aGF0IGFyZSB1c2VkIGFyb3VuZCB0aGUgaW5kdXN0cnkuCisgIC8vIE90aGVyIHN1cHBvcnRlZCBDRUEgMjAxNCBrZXlzLgogICBrU2JLZXlNZWRpYVJld2luZCA9IDB4RTMsCiAgIGtTYktleU1lZGlhRmFzdEZvcndhcmQgPSAweEU0LAogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfQ09MT1JfS0VZQ09ERVNfQVBJX1ZFUlNJT04KLSAgLy8gVGhlIGNvbG9yZWQga2V5cyBmb3VuZCBvbiBtb3N0IGNvbnRlbXBvcmFyeSBUViByZW1vdGVzLgorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX05FV19LRVlDT0RFU19BUElfVkVSU0lPTgogICBrU2JLZXlSZWQgPSAweDE5MywKICAga1NiS2V5R3JlZW4gPSAweDE5NCwKICAga1NiS2V5WWVsbG93ID0gMHgxOTUsCiAgIGtTYktleUJsdWUgPSAweDE5NiwKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFU1JJT04gPj0gU0JfQ09MT1JfS0VZQ09ERVNfQVBJX1ZFUlNJT04KKworICBrU2JLZXlTdWJ0aXRsZSA9IDB4MUNDLAorICBrU2JLZXlDbG9zZWRDYXB0aW9uID0ga1NiS2V5U3VidGl0bGUsCisKKyAgLy8gQSBidXR0b24gdGhhdCB3aWxsIGRpcmVjdGx5IGxhdW5jaCB0aGUgY3VycmVudCBhcHBsaWNhdGlvbi4KKyAga1NiS2V5TGF1bmNoVGhpc0FwcGxpY2F0aW9uID0gMHgzMDAwLAorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9ORVdfS0VZQ09ERVNfQVBJX1ZFUlNJT04KIAogICAvLyBNb3VzZSBidXR0b25zLCBzdGFydGluZyB3aXRoIHRoZSBsZWZ0IG1vdXNlIGJ1dHRvbi4KICAga1NiS2V5TW91c2UxID0gMHg3MDAwLApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvQlVJTEQuZ24gYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9CVUlMRC5nbgppbmRleCA2NjU3OWQ4Li43NWJlNDBkIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9CVUlMRC5nbgorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9CVUlMRC5nbgpAQCAtMzQxLDcgKzM0MSw2IEBACiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9saW51eC9tZW1vcnlfZ2V0X3N0YWNrX2JvdW5kcy5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9saW51eC9wYWdlX2ludGVybmFsLmNjIiwKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL2xpbnV4L3NvY2tldF9nZXRfaW50ZXJmYWNlX2FkZHJlc3MuY2MiLAotICAgICIvL3N0YXJib2FyZC9zaGFyZWQvbGludXgvc29ja2V0X2dldF9sb2NhbF9pbnRlcmZhY2VfYWRkcmVzcy5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9saW51eC9zeXN0ZW1fZ2V0X3JhbmRvbV9kYXRhLmNjIiwKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL2xpbnV4L3N5c3RlbV9nZXRfc3RhY2suY2MiLAogICAgICIvL3N0YXJib2FyZC9zaGFyZWQvbGludXgvc3lzdGVtX2dldF90b3RhbF9jcHVfbWVtb3J5LmNjIiwKQEAgLTUxMiw3ICs1MTEsNiBAQAogICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfb3V0cHV0X21vZGVfc3VwcG9ydGVkLmNjIiwKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3NlZWsuY2MiLAogICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfc2V0X2JvdW5kcy5jYyIsCi0gICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9zZXRfcGF1c2UuY2MiLAogICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfc2V0X3BsYXliYWNrX3JhdGUuY2MiLAogICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfc2V0X3ZvbHVtZS5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl93b3JrZXIuY2MiLApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKaW5kZXggNjY4OGIxOC4uNDBmZTlhYiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaAorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCkBAIC0yNjcsNjkgKzI2Nyw2IEBACiAvLyBzdXBwb3J0ZWQgY29tcG9zaXRpb24gbWV0aG9kcyBiZWxvdy4KICNkZWZpbmUgU0JfSEFTX1BMQVlFUiAxCiAKLSNpZiBTQl9BUElfVkVSU0lPTiA8IDQKLS8vIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgcGxhdGZvcm0ncyBwbGF5ZXIgd2lsbCBwcm9kdWNlIGFuIE9wZW5HTCB0ZXh0dXJlIHRoYXQKLS8vIHRoZSBjbGllbnQgbXVzdCBkcmF3IGV2ZXJ5IGZyYW1lIHdpdGggaXRzIGdyYXBoaWNzIHJlbmRlcmluZy4gSXQgbWF5IGJlIHRoYXQKLS8vIHdlIGdldCBhIHRleHR1cmUgaGFuZGxlLCBidXQgY2Fubm90IHBlcmZvcm0gb3BlcmF0aW9ucyBsaWtlIEdsUmVhZFBpeGVscyBvbgotLy8gaXQgaWYgaXQgaXMgRFJNLXByb3RlY3RlZC4KLSNkZWZpbmUgU0JfSVNfUExBWUVSX1BST0RVQ0lOR19URVhUVVJFIDAKLQotLy8gU3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBwbGF0Zm9ybSdzIHBsYXllciBpcyBjb21wb3NpdGVkIHdpdGggYSBmb3JtYWwKLS8vIGNvbXBvc2l0b3IsIHdoZXJlIHRoZSBjbGllbnQgbXVzdCBzcGVjaWZ5IGhvdyB2aWRlbyBpcyB0byBiZSBjb21wb3NpdGVkIGludG8KLS8vIHRoZSBncmFwaGljYWxzIHNjZW5lLgotI2RlZmluZSBTQl9JU19QTEFZRVJfQ09NUE9TSVRFRCAwCi0KLS8vIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgcGxhdGZvcm0ncyBwbGF5ZXIgdXNlcyBhICJwdW5jaC1vdXQiIG1vZGVsLCB3aGVyZQotLy8gdmlkZW8gaXMgcmVuZGVyZWQgdG8gdGhlIGZhciBiYWNrZ3JvdW5kLCBhbmQgdGhlIGdyYXBoaWNzIHBsYW5lIGlzCi0vLyBhdXRvbWF0aWNhbGx5IGNvbXBvc2l0ZWQgb24gdG9wIG9mIHRoZSB2aWRlbyBieSB0aGUgcGxhdGZvcm0uIFRoZSBjbGllbnQgbXVzdAotLy8gcHVuY2ggYW4gYWxwaGEgaG9sZSBvdXQgb2YgdGhlIGdyYXBoaWNzIHBsYW5lIGZvciB2aWRlbyB0byBzaG93IHRocm91Z2guICBJbgotLy8gdGhpcyBjYXNlLCBjaGFuZ2luZyB0aGUgdmlkZW8gYm91bmRzIG11c3QgYmUgdGlnaHRseSBzeW5jaHJvbml6ZWQgYmV0d2VlbiB0aGUKLS8vIHBsYXllciBhbmQgdGhlIGdyYXBoaWNzIHBsYW5lLgotI2RlZmluZSBTQl9JU19QTEFZRVJfUFVOQ0hFRF9PVVQgMQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IDQKLQotI2lmIFNCX0FQSV9WRVJTSU9OIDwgNAotCi0vLyBTcGVjaWZpZXMgdGhlIG1heGltdW0gYW1vdW50IG9mIG1lbW9yeSB1c2VkIGJ5IGF1ZGlvIGJ1ZmZlcnMgb2YgbWVkaWEgc291cmNlCi0vLyBiZWZvcmUgdHJpZ2dlcmluZyBhIGdhcmJhZ2UgY29sbGVjdGlvbi4gIEEgbGFyZ2UgdmFsdWUgd2lsbCBjYXVzZSBtb3JlIG1lbW9yeQotLy8gYmVpbmcgdXNlZCBieSBhdWRpbyBidWZmZXJzIGJ1dCB3aWxsIGFsc28gbWFrZSBKYXZhU2NyaXB0IGFwcCBsZXNzIGxpa2VseSB0bwotLy8gcmUtZG93bmxvYWQgYXVkaW8gZGF0YS4gIE5vdGUgdGhhdCB0aGUgSmF2YVNjcmlwdCBhcHAgbWF5IGV4cGVyaWVuY2UKLS8vIHNpZ25pZmljYW50IGRpZmZpY3VsdHkgaWYgdGhpcyB2YWx1ZSBpcyB0b28gbG93LgotI2RlZmluZSBTQl9NRURJQV9TT1VSQ0VfQlVGRkVSX1NUUkVBTV9BVURJT19NRU1PUllfTElNSVQgKDNVICogMTAyNFUgKiAxMDI0VSkKLQotLy8gU3BlY2lmaWVzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkgdXNlZCBieSB2aWRlbyBidWZmZXJzIG9mIG1lZGlhIHNvdXJjZQotLy8gYmVmb3JlIHRyaWdnZXJpbmcgYSBnYXJiYWdlIGNvbGxlY3Rpb24uICBBIGxhcmdlIHZhbHVlIHdpbGwgY2F1c2UgbW9yZSBtZW1vcnkKLS8vIGJlaW5nIHVzZWQgYnkgdmlkZW8gYnVmZmVycyBidXQgd2lsbCBhbHNvIG1ha2UgSmF2YVNjcmlwdCBhcHAgbGVzcyBsaWtlbHkgdG8KLS8vIHJlLWRvd25sb2FkIHZpZGVvIGRhdGEuICBOb3RlIHRoYXQgdGhlIEphdmFTY3JpcHQgYXBwIG1heSBleHBlcmllbmNlCi0vLyBzaWduaWZpY2FudCBkaWZmaWN1bHR5IGlmIHRoaXMgdmFsdWUgaXMgdG9vIGxvdy4KLSNkZWZpbmUgU0JfTUVESUFfU09VUkNFX0JVRkZFUl9TVFJFQU1fVklERU9fTUVNT1JZX0xJTUlUICgxNlUgKiAxMDI0VSAqIDEwMjRVKQotCi0vLyBTcGVjaWZpZXMgaG93IG11Y2ggbWVtb3J5IHRvIHJlc2VydmUgdXAtZnJvbnQgZm9yIHRoZSBtYWluIG1lZGlhIGJ1ZmZlcgotLy8gKHVzdWFsbHkgcmVzaWRlcyBpbnNpZGUgdGhlIENQVSBtZW1vcnkpIHVzZWQgYnkgbWVkaWEgc291cmNlIGFuZCBkZW11eGVycy4KLS8vIFRoZSBtYWluIG1lZGlhIGJ1ZmZlciBjYW4gd29yayBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gd2F5czoKLS8vIDEuIElmIEdQVSBidWZmZXIgaXMgdXNlZCAoaS5lLiBTQl9NRURJQV9HUFVfQlVGRkVSX0JVREdFVCBpcyBub24temVybyksIHRoZQotLy8gICAgbWFpbiBidWZmZXIgd2lsbCBiZSB1c2VkIGFzIGEgY2FjaGUgc28gYSBtZWRpYSBidWZmZXIgd2lsbCBiZSBjb3BpZWQgZnJvbQotLy8gICAgR1BVIG1lbW9yeSB0byBtYWluIG1lbW9yeSBiZWZvcmUgc2VuZGluZyB0byB0aGUgZGVjb2RlciBmb3IgZnVydGhlcgotLy8gICAgcHJvY2Vzc2luZy4gIEluIHRoaXMgY2FzZSB0aGlzIG1hY3JvIHNob3VsZCBiZSBzZXQgdG8gYSB2YWx1ZSB0aGF0IGlzCi0vLyAgICBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbGwgbWVkaWEgYnVmZmVycyBiZWluZyBkZWNvZGVkLgotLy8gMi4gSWYgR1BVIGJ1ZmZlciBpcyBub3QgdXNlZCAoaS5lLiBTQl9NRURJQV9HUFVfQlVGRkVSX0JVREdFVCBpcyB6ZXJvKSBhbGwKLS8vICAgIG1lZGlhIGJ1ZmZlcnMgd2lsbCByZXNpZGUgaW4gdGhlIG1haW4gbWVtb3J5IGJ1ZmZlci4gIEluIHRoaXMgY2FzZSB0aGUKLS8vICAgIG1hY3JvIHNob3VsZCBiZSBzZXQgdG8gYSB2YWx1ZSB0aGF0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3VtIG9mIHRoZSBhYm92ZQotLy8gICAgc291cmNlIGJ1ZmZlciBzdHJlYW0gbWVtb3J5IGxpbWl0cyB3aXRoIGV4dHJhIHJvb20gdG8gdGFrZSBhY2NvdW50IG9mCi0vLyAgICBmcmFnbWVudGF0aW9ucyBhbmQgbWVtb3J5IHVzZWQgYnkgZGVtdXhlcnMuCi0jZGVmaW5lIFNCX01FRElBX01BSU5fQlVGRkVSX0JVREdFVCAoMjRVICogMTAyNFUgKiAxMDI0VSkKLQotLy8gU3BlY2lmaWVzIGhvdyBtdWNoIEdQVSBtZW1vcnkgdG8gcmVzZXJ2ZSB1cC1mcm9udCBmb3IgbWVkaWEgc291cmNlIGJ1ZmZlcnMuCi0vLyBUaGlzIHNob3VsZCBvbmx5IGJlIHNldCB0byBub24temVybyBvbiBzeXN0ZW0gd2l0aCBsaW1pdGVkIENQVSBtZW1vcnkgYW5kCi0vLyBleGNlc3MgR1BVIG1lbW9yeSBzbyB0aGUgYXBwIGNhbiBzdG9yZSBtZWRpYSBidWZmZXIgaW4gR1BVIG1lbW9yeS4KLS8vIFNCX01FRElBX01BSU5fQlVGRkVSX0JVREdFVCBoYXMgdG8gYmUgc2V0IHRvIGEgbm9uLXplcm8gdmFsdWUgdG8gYXZvaWQKLS8vIG1lZGlhIGJ1ZmZlcnMgYmVpbmcgZGVjb2RlZCB3aGVuIGJlaW5nIHN0b3JlZCBpbiBHUFUuCi0jZGVmaW5lIFNCX01FRElBX0dQVV9CVUZGRVJfQlVER0VUIDBVCi0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCA0Ci0KLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0Ci0KIC8vIFRoZSBtYXhpbXVtIGF1ZGlvIGJpdHJhdGUgdGhlIHBsYXRmb3JtIGNhbiBkZWNvZGUuICBUaGUgZm9sbG93aW5nIHZhbHVlCiAvLyBlcXVhbHMgdG8gNU0gYnl0ZXMgcGVyIHNlY29uZHMgd2hpY2ggaXMgbW9yZSB0aGFuIGVub3VnaCBmb3IgY29tcHJlc3NlZAogLy8gYXVkaW8uCkBAIC0zNDAsOCArMjc3LDYgQEAKIC8vIHZpZGVvLgogI2RlZmluZSBTQl9NRURJQV9NQVhfVklERU9fQklUUkFURV9JTl9CSVRTX1BFUl9TRUNPTkQgKDIwMCAqIDEwMjQgKiAxMDI0KQogCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKLQogLy8gU3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBoYXMgd2VibS92cDkgc3VwcG9ydC4gIFRoaXMgc2hvdWxkIGJlIHNldCB0bwogLy8gbm9uLXplcm8gb24gcGxhdGZvcm1zIHdpdGggd2VibS92cDkgc3VwcG9ydC4KICNkZWZpbmUgU0JfSEFTX01FRElBX1dFQk1fVlA5X1NVUFBPUlQgMApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cGkgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaQppbmRleCAzMTE2MThjLi4yYjM3ZDE3IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaQorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaQpAQCAtOTYsNyArOTYsNiBAQAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvbGludXgvbWVtb3J5X2dldF9zdGFja19ib3VuZHMuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvbGludXgvcGFnZV9pbnRlcm5hbC5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9saW51eC9zb2NrZXRfZ2V0X2ludGVyZmFjZV9hZGRyZXNzLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2xpbnV4L3NvY2tldF9nZXRfbG9jYWxfaW50ZXJmYWNlX2FkZHJlc3MuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvbGludXgvc3lzdGVtX2dldF9yYW5kb21fZGF0YS5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9saW51eC9zeXN0ZW1fZ2V0X3N0YWNrLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2xpbnV4L3N5c3RlbV9nZXRfdG90YWxfY3B1X21lbW9yeS5jYycsCkBAIC0yNjcsNyArMjY2LDYgQEAKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX291dHB1dF9tb2RlX3N1cHBvcnRlZC5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9zZWVrLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3NldF9ib3VuZHMuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfc2V0X3BhdXNlLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3NldF9wbGF5YmFja19yYXRlLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3NldF92b2x1bWUuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfd29ya2VyLmNjJywKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL21vY2svY29uZmlndXJhdGlvbl9wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL21vY2svY29uZmlndXJhdGlvbl9wdWJsaWMuaAppbmRleCAwZmRiZWE3Li44NzUzMzE5IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9tb2NrL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvbW9jay9jb25maWd1cmF0aW9uX3B1YmxpYy5oCkBAIC0zNTIsMjcgKzM1Miw2IEBACiAvLyBzdXBwb3J0ZWQgY29tcG9zaXRpb24gbWV0aG9kcyBiZWxvdy4KICNkZWZpbmUgU0JfSEFTX1BMQVlFUiAxCiAKLSNpZiBTQl9BUElfVkVSU0lPTiA8IDQKLS8vIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgcGxhdGZvcm0ncyBwbGF5ZXIgd2lsbCBwcm9kdWNlIGFuIE9wZW5HTCB0ZXh0dXJlIHRoYXQKLS8vIHRoZSBjbGllbnQgbXVzdCBkcmF3IGV2ZXJ5IGZyYW1lIHdpdGggaXRzIGdyYXBoaWNzIHJlbmRlcmluZy4gSXQgbWF5IGJlIHRoYXQKLS8vIHdlIGdldCBhIHRleHR1cmUgaGFuZGxlLCBidXQgY2Fubm90IHBlcmZvcm0gb3BlcmF0aW9ucyBsaWtlIEdsUmVhZFBpeGVscyBvbgotLy8gaXQgaWYgaXQgaXMgRFJNLXByb3RlY3RlZC4KLSNkZWZpbmUgU0JfSVNfUExBWUVSX1BST0RVQ0lOR19URVhUVVJFIDAKLQotLy8gU3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBwbGF0Zm9ybSdzIHBsYXllciBpcyBjb21wb3NpdGVkIHdpdGggYSBmb3JtYWwKLS8vIGNvbXBvc2l0b3IsIHdoZXJlIHRoZSBjbGllbnQgbXVzdCBzcGVjaWZ5IGhvdyB2aWRlbyBpcyB0byBiZSBjb21wb3NpdGVkIGludG8KLS8vIHRoZSBncmFwaGljYWxzIHNjZW5lLgotI2RlZmluZSBTQl9JU19QTEFZRVJfQ09NUE9TSVRFRCAwCi0KLS8vIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgcGxhdGZvcm0ncyBwbGF5ZXIgdXNlcyBhICJwdW5jaC1vdXQiIG1vZGVsLCB3aGVyZQotLy8gdmlkZW8gaXMgcmVuZGVyZWQgdG8gdGhlIGZhciBiYWNrZ3JvdW5kLCBhbmQgdGhlIGdyYXBoaWNzIHBsYW5lIGlzCi0vLyBhdXRvbWF0aWNhbGx5IGNvbXBvc2l0ZWQgb24gdG9wIG9mIHRoZSB2aWRlbyBieSB0aGUgcGxhdGZvcm0uIFRoZSBjbGllbnQgbXVzdAotLy8gcHVuY2ggYW4gYWxwaGEgaG9sZSBvdXQgb2YgdGhlIGdyYXBoaWNzIHBsYW5lIGZvciB2aWRlbyB0byBzaG93IHRocm91Z2guICBJbgotLy8gdGhpcyBjYXNlLCBjaGFuZ2luZyB0aGUgdmlkZW8gYm91bmRzIG11c3QgYmUgdGlnaHRseSBzeW5jaHJvbml6ZWQgYmV0d2VlbiB0aGUKLS8vIHBsYXllciBhbmQgdGhlIGdyYXBoaWNzIHBsYW5lLgotI2RlZmluZSBTQl9JU19QTEFZRVJfUFVOQ0hFRF9PVVQgMQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IDQKLQogLy8gQWZ0ZXIgYSBzZWVrIGlzIHRyaWdnZXJyZWQsIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGFwcGVuZCB2aWRlbyBmcmFtZXMKIC8vIGZyb20gdGhlIGxhc3Qga2V5IGZyYW1lIGJlZm9yZSB0aGUgc2VlayB0aW1lIGFuZCBhcHBlbmQgYXVkaW8gZnJhbWVzIGZyb20gdGhlCiAvLyBzZWVrIHRpbWUgYmVjYXVzZSB1c3VhbGx5IGFsbCBhdWRpbyBmcmFtZXMgYXJlIGtleSBmcmFtZXMuICBPbiBwbGF0Zm9ybXMgdGhhdApAQCAtMzg2LDggKzM2NSw2IEBACiAvLyBub3QgYXZhaWxhYmxlIHNob3VsZCBkZWZpbmUgdGhlIGZvbGxvd2luZyBxdWlyay4KICN1bmRlZiBTQl9IQVNfUVVJUktfTk9fRkZTCiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0Ci0KIC8vIFRoZSBtYXhpbXVtIGF1ZGlvIGJpdHJhdGUgdGhlIHBsYXRmb3JtIGNhbiBkZWNvZGUuICBUaGUgZm9sbG93aW5nIHZhbHVlCiAvLyBlcXVhbHMgdG8gNU0gYnl0ZXMgcGVyIHNlY29uZHMgd2hpY2ggaXMgbW9yZSB0aGFuIGVub3VnaCBmb3IgY29tcHJlc3NlZAogLy8gYXVkaW8uCkBAIC0zOTgsOCArMzc1LDYgQEAKIC8vIHZpZGVvLgogI2RlZmluZSBTQl9NRURJQV9NQVhfVklERU9fQklUUkFURV9JTl9CSVRTX1BFUl9TRUNPTkQgKDIwMCAqIDEwMjQgKiAxMDI0KQogCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKLQogLy8gU3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBoYXMgd2VibS92cDkgc3VwcG9ydC4gIFRoaXMgc2hvdWxkIGJlIHNldCB0bwogLy8gbm9uLXplcm8gb24gcGxhdGZvcm1zIHdpdGggd2VibS92cDkgc3VwcG9ydC4KICNkZWZpbmUgU0JfSEFTX01FRElBX1dFQk1fVlA5X1NVUFBPUlQgMApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvbW9jay9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvbW9jay9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCmluZGV4IDNiMjMzYTYuLmRkNTYyMWEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL21vY2svc3RhcmJvYXJkX3BsYXRmb3JtLmd5cAorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9tb2NrL3N0YXJib2FyZF9wbGF0Zm9ybS5neXAKQEAgLTEwNCw3ICsxMDQsNiBAQAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3BsYXllcl9vdXRwdXRfbW9kZV9zdXBwb3J0ZWQuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3BsYXllcl9zZWVrLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfc2V0X2JvdW5kcy5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX3NldF9wYXVzZS5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX3NldF9wbGF5YmFja19yYXRlLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfc2V0X3ZvbHVtZS5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX3dyaXRlX2VuZF9vZl9zdHJlYW0uY2MnLApAQCAtMTE5LDcgKzExOCw2IEBACiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc29ja2V0X2dldF9pbnRlcmZhY2VfYWRkcmVzcy5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc29ja2V0X2dldF9sYXN0X2Vycm9yLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zb2NrZXRfZ2V0X2xvY2FsX2FkZHJlc3MuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3NvY2tldF9nZXRfbG9jYWxfaW50ZXJmYWNlX2FkZHJlc3MuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3NvY2tldF9pc19jb25uZWN0ZWQuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3NvY2tldF9pc19jb25uZWN0ZWRfYW5kX2lkbGUuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3NvY2tldF9qb2luX211bHRpY2FzdF9ncm91cC5jYycsCkBAIC0xNDcsNyArMTQ1LDYgQEAKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zcGVlY2hfcmVjb2duaXplcl9zdGFydC5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3BlZWNoX3JlY29nbml6ZXJfc3RvcC5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3BlZWNoX3N5bnRoZXNpc19jYW5jZWwuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3NwZWVjaF9zeW50aGVzaXNfc2V0X2xhbmd1YWdlLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zcGVlY2hfc3ludGhlc2lzX3NwZWFrLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zdG9yYWdlX2Nsb3NlX3JlY29yZC5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3RvcmFnZV9kZWxldGVfcmVjb3JkLmNjJywKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbWVkaWEuaCBiL3NyYy9zdGFyYm9hcmQvbWVkaWEuaAppbmRleCA0NzY3YzRkLi5hMDFiMTA5IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL21lZGlhLmgKKysrIGIvc3JjL3N0YXJib2FyZC9tZWRpYS5oCkBAIC0xMzEsNyArMTMxLDYgQEAKICAga1NiTWVkaWFBdWRpb0ZyYW1lU3RvcmFnZVR5cGVQbGFuYXIsCiB9IFNiTWVkaWFBdWRpb0ZyYW1lU3RvcmFnZVR5cGU7CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAvLyBTTVBURSAyMDg2IG1hc3RlcmluZyBkYXRhCiAvLyAgIGh0dHA6Ly9pZWVleHBsb3JlLmllZWUub3JnL2RvY3VtZW50LzcyOTE3MDcvCiAvLyBUaGlzIHN0YW5kYXJkIHNwZWNpZmllcyB0aGUgbWV0YWRhdGEgaXRlbXMgdG8gc3BlY2lmeSB0aGUgY29sb3IKQEAgLTM3OSw3ICszNzgsNiBAQAogICAvLyBjb21wbGV0ZWQgYXMgKDAsIDAsIDAsIDEpLgogICBmbG9hdCBjdXN0b21fcHJpbWFyeV9tYXRyaXhbMTJdOwogfSBTYk1lZGlhQ29sb3JNZXRhZGF0YTsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogCiAvLyBUaGUgc2V0IG9mIGluZm9ybWF0aW9uIHJlcXVpcmVkIGJ5IHRoZSBkZWNvZGVyIG9yIHBsYXllciBmb3IgZWFjaCB2aWRlbwogLy8gc2FtcGxlLgpAQCAtMzk4LDcgKzM5Niw2IEBACiAgIC8vIGtleSBmcmFtZXMsIGJ1dCBtYXkgY2hhbmdlIG9uIGFueSBrZXkgZnJhbWUuCiAgIGludCBmcmFtZV9oZWlnaHQ7CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAgIC8vIEhEUiBtZXRhZGF0YSBjb21tb24gZm9yIEhEUjEwIGFuZCBXZWJNL1ZQOS1iYXNlZCBIRFIgZm9ybWF0cyBhcwogICAvLyB3ZWxsIGFzIHRoZSBDb2xvciBTcGFjZSwgYW5kIENvbG9yIGVsZW1lbnRzOiBNYXRyaXhDb2VmZmljaWVudHMsCiAgIC8vIEJpdHNQZXJDaGFubmVsLCBDaHJvbWFTdWJzYW1wbGluZ0hvcnosIENocm9tYVN1YnNhbXBsaW5nVmVydCwKQEAgLTQwOCw3ICs0MDUsNiBAQAogICAvLyBUaGlzIHdpbGwgb25seSBiZSBzcGVjaWZpZWQgb24gZnJhbWVzIHdoZXJlIHRoZSBIRFIgbWV0YWRhdGEgYW5kCiAgIC8vIGNvbG9yIC8gY29sb3Igc3BhY2UgbWlnaHQgaGF2ZSBjaGFuZ2VkIChlLmcuIGtleWZyYW1lcykuCiAgIFNiTWVkaWFDb2xvck1ldGFkYXRhKiBjb2xvcl9tZXRhZGF0YTsKLSNlbmRpZgogfSBTYk1lZGlhVmlkZW9TYW1wbGVJbmZvOwogCiAvLyBBIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBhdWRpbyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgb2YgYSBzaW5nbGUgYXVkaW8KQEAgLTQ5NCwzOCArNDkwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYk1lZGlhQXVkaW9Db2RlYyBhdWRpb19jb2RlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBrZXlfc3lzdGVtKTsKIAotI2lmIFNCX0FQSV9WRVJTSU9OIDwgNAotCi0vLyBJbmRpY2F0ZXMgd2hldGhlciBhIGdpdmVuIGNvbWJpbmF0aW9uIG9mCi0vLyAofGZyYW1lX3dpZHRofCB4IHxmcmFtZV9oZWlnaHR8KSBmcmFtZXMgYXQgfGJpdHJhdGV8IGFuZCB8ZnBzfCBpcyBzdXBwb3J0ZWQKLS8vIG9uIHRoaXMgcGxhdGZvcm0gd2l0aCB8dmlkZW9fY29kZWN8LiBJZiB8dmlkZW9fY29kZWN8IGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIKLS8vIGFueSBjb25kaXRpb24sIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB8ZmFsc2V8LgotLy8KLS8vIFNldHRpbmcgYW55IG9mIHRoZSBwYXJhbWV0ZXJzIHRvIHwwfCBpbmRpY2F0ZXMgdGhhdCB0aGV5IHNob3VsZG4ndCBiZQotLy8gY29uc2lkZXJlZC4KLS8vCi0vLyB8dmlkZW9fY29kZWN8OiBUaGUgdmlkZW8gY29kZWMgdXNlZCBpbiB0aGUgbWVkaWEgY29udGVudC4KLS8vIHxmcmFtZV93aWR0aHw6IFRoZSBmcmFtZSB3aWR0aCBvZiB0aGUgbWVkaWEgY29udGVudC4KLS8vIHxmcmFtZV9oZWlnaHR8OiBUaGUgZnJhbWUgaGVpZ2h0IG9mIHRoZSBtZWRpYSBjb250ZW50LgotLy8gfGJpdHJhdGV8OiBUaGUgYml0cmF0ZSBvZiB0aGUgbWVkaWEgY29udGVudC4KLS8vIHxmcHN8OiBUaGUgbnVtYmVyIG9mIGZyYW1lcyBwZXIgc2Vjb25kIGluIHRoZSBtZWRpYSBjb250ZW50LgotU0JfRVhQT1JUIGJvb2wgU2JNZWRpYUlzVmlkZW9TdXBwb3J0ZWQoU2JNZWRpYVZpZGVvQ29kZWMgdmlkZW9fY29kZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBiaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZwcyk7Ci0KLS8vIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgcGxhdGZvcm0gc3VwcG9ydHMgfGF1ZGlvX2NvZGVjfCBhdCB8Yml0cmF0ZXwuCi0vLyBJZiB8YXVkaW9fY29kZWN8IGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIgYW55IGNvbmRpdGlvbiwgdGhpcyBmdW5jdGlvbgotLy8gcmV0dXJucyB8ZmFsc2V8LgotLy8KLS8vIHxhdWRpb19jb2RlY3w6IFRoZSBtZWRpYSdzIGF1ZGlvIGNvZGVjICh8U2JNZWRpYUF1ZGlvQ29kZWN8KS4KLS8vIHxiaXRyYXRlfDogVGhlIG1lZGlhJ3MgYml0cmF0ZS4KLVNCX0VYUE9SVCBib29sIFNiTWVkaWFJc0F1ZGlvU3VwcG9ydGVkKFNiTWVkaWFWaWRlb0NvZGVjIGF1ZGlvX2NvZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBiaXRyYXRlKTsKLQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IDQKLQogLy8gUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB3aGV0aGVyIHRoZSBwbGF5YmFjayBvZiB0aGUgc3BlY2lmaWMgbWVkaWEKIC8vIGRlc2NyaWJlZCBieSB8bWltZXwgYW5kIGVuY3J5cHRlZCB1c2luZyB8a2V5X3N5c3RlbXwgY2FuIGJlIHBsYXllZC4KIC8vCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL21pY3JvcGhvbmUuaCBiL3NyYy9zdGFyYm9hcmQvbWljcm9waG9uZS5oCmluZGV4IGFlNmEwMmYuLjRjNWFjM2QgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbWljcm9waG9uZS5oCisrKyBiL3NyYy9zdGFyYm9hcmQvbWljcm9waG9uZS5oCkBAIC00Myw3ICs0Myw3IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL2V4cG9ydC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC90eXBlcy5oIgogCi0jaWYgU0JfSEFTKE1JQ1JPUEhPTkUpICYmIFNCX0FQSV9WRVJTSU9OID49IDIKKyNpZiBTQl9IQVMoTUlDUk9QSE9ORSkKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKQEAgLTE5NCw2ICsxOTQsNiBAQAogfSAgLy8gZXh0ZXJuICJDIgogI2VuZGlmCiAKLSNlbmRpZiAgLy8gU0JfSEFTKE1JQ1JPUEhPTkUpICYmIFNCX0FQSV9WRVJTSU9OID49IDIKKyNlbmRpZiAgLy8gU0JfSEFTKE1JQ1JPUEhPTkUpCiAKICNlbmRpZiAgLy8gU1RBUkJPQVJEX01JQ1JPUEhPTkVfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9CVUlMRC5nbiBiL3NyYy9zdGFyYm9hcmQvbnBsYi9CVUlMRC5nbgppbmRleCAyOWQwYjM1Li5hZDNhMmJkIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL25wbGIvQlVJTEQuZ24KKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL0JVSUxELmduCkBAIC0xNjQsNyArMTY0LDYgQEAKICAgICAic29ja2V0X2dldF9pbnRlcmZhY2VfYWRkcmVzc190ZXN0LmNjIiwKICAgICAic29ja2V0X2dldF9sYXN0X2Vycm9yX3Rlc3QuY2MiLAogICAgICJzb2NrZXRfZ2V0X2xvY2FsX2FkZHJlc3NfdGVzdC5jYyIsCi0gICAgInNvY2tldF9nZXRfbG9jYWxfaW50ZXJmYWNlX2FkZHJlc3NfdGVzdC5jYyIsCiAgICAgInNvY2tldF9oZWxwZXJzLmNjIiwKICAgICAic29ja2V0X2lzX2Nvbm5lY3RlZF9hbmRfaWRsZV90ZXN0LmNjIiwKICAgICAic29ja2V0X2lzX2Nvbm5lY3RlZF90ZXN0LmNjIiwKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9hY2Nlc3NpYmlsaXR5X2dldF9zZXR0aW5nX3Rlc3QuY2MgYi9zcmMvc3RhcmJvYXJkL25wbGIvYWNjZXNzaWJpbGl0eV9nZXRfc2V0dGluZ190ZXN0LmNjCmluZGV4IGNhMDY2MmYuLmQ4NWZkYjEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbnBsYi9hY2Nlc3NpYmlsaXR5X2dldF9zZXR0aW5nX3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL2FjY2Vzc2liaWxpdHlfZ2V0X3NldHRpbmdfdGVzdC5jYwpAQCAtMTksOCArMTksNiBAQAogbmFtZXNwYWNlIG5wbGIgewogbmFtZXNwYWNlIHsKIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKLQogVEVTVChTYkFjY2Vzc2liaWxpdHlHZXRTZXR0aW5nVGVzdCwgQ2FuQ2FsbEdldFRleHRUb1NwZWVjaFNldHRpbmdzKSB7CiAgIFNiQWNjZXNzaWJpbGl0eVRleHRUb1NwZWVjaFNldHRpbmdzIHNldHRpbmdzID0gezB9OwogICBFWFBFQ1RfVFJVRShTYkFjY2Vzc2liaWxpdHlHZXRUZXh0VG9TcGVlY2hTZXR0aW5ncygmc2V0dGluZ3MpKTsKQEAgLTQ5LDggKzQ3LDYgQEAKICAgRVhQRUNUX0ZBTFNFKFNiQWNjZXNzaWJpbGl0eUdldERpc3BsYXlTZXR0aW5ncyhOVUxMKSk7CiB9CiAKLSNlbmRpZgotCiB9ICAvLyBuYW1lc3BhY2UKIH0gIC8vIG5hbWVzcGFjZSBucGxiCiB9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL25wbGIvY3J5cHRvZ3JhcGh5X2NyZWF0ZV90cmFuc2Zvcm1lcl90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL2NyeXB0b2dyYXBoeV9jcmVhdGVfdHJhbnNmb3JtZXJfdGVzdC5jYwppbmRleCAyNDFkNmNmLi4xZjYwNjgwIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL25wbGIvY3J5cHRvZ3JhcGh5X2NyZWF0ZV90cmFuc2Zvcm1lcl90ZXN0LmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9jcnlwdG9ncmFwaHlfY3JlYXRlX3RyYW5zZm9ybWVyX3Rlc3QuY2MKQEAgLTE2LDggKzE2LDYgQEAKIAogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAotCiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKIG5hbWVzcGFjZSBucGxiIHsKIG5hbWVzcGFjZSB7CkBAIC00OCw1ICs0NiwzIEBACiB9ICAvLyBuYW1lc3BhY2UKIH0gIC8vIG5hbWVzcGFjZSBucGxiCiB9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCi0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL2NyeXB0b2dyYXBoeV90cmFuc2Zvcm1fZ2NtX3Rlc3QuY2MgYi9zcmMvc3RhcmJvYXJkL25wbGIvY3J5cHRvZ3JhcGh5X3RyYW5zZm9ybV9nY21fdGVzdC5jYwppbmRleCA2ZjQyZGFhLi4wMDg4Y2UwIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL25wbGIvY3J5cHRvZ3JhcGh5X3RyYW5zZm9ybV9nY21fdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvY3J5cHRvZ3JhcGh5X3RyYW5zZm9ybV9nY21fdGVzdC5jYwpAQCAtNzAsOCArNzAsNiBAQAogI2luY2x1ZGUgInRlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAotCiB1c2luZyA6OnRlc3Rpbmc6Ok5vdE51bGw7CiAKIG5hbWVzcGFjZSBzdGFyYm9hcmQgewpAQCAtNDQ1LDUgKzQ0MywzIEBACiB9ICAvLyBuYW1lc3BhY2UKIH0gIC8vIG5hbWVzcGFjZSBucGxiCiB9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCi0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL2NyeXB0b2dyYXBoeV90cmFuc2Zvcm1fdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9jcnlwdG9ncmFwaHlfdHJhbnNmb3JtX3Rlc3QuY2MKaW5kZXggMWI1NzcwZi4uZmQyNjdmOSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL2NyeXB0b2dyYXBoeV90cmFuc2Zvcm1fdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvY3J5cHRvZ3JhcGh5X3RyYW5zZm9ybV90ZXN0LmNjCkBAIC0xOSw4ICsxOSw2IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL25wbGIvY3J5cHRvZ3JhcGh5X2hlbHBlcnMuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKLQogbmFtZXNwYWNlIHN0YXJib2FyZCB7CiBuYW1lc3BhY2UgbnBsYiB7CiBuYW1lc3BhY2UgewpAQCAtMjI1LDUgKzIyMywzIEBACiB9ICAvLyBuYW1lc3BhY2UKIH0gIC8vIG5hbWVzcGFjZSBucGxiCiB9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCi0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL2RlY29kZV90YXJnZXRfY3JlYXRlX3Rlc3QuY2MgYi9zcmMvc3RhcmJvYXJkL25wbGIvZGVjb2RlX3RhcmdldF9jcmVhdGVfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZlZGIzYS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL25wbGIvZGVjb2RlX3RhcmdldF9jcmVhdGVfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3dpbmRvdy5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi0vLyBUaGlzIG11c3QgY29tZSBhZnRlciBndGVzdCwgYmVjYXVzZSBpdCBpbmNsdWRlcyBHTCwgd2hpY2ggY2FuIGluY2x1ZGUgWDExLAotLy8gd2hpY2ggd2lsbCBkZWZpbmUgTm9uZSB0byBiZSAwTCwgd2hpY2ggY29uZmxpY3RzIHdpdGggZ3Rlc3QuCi0jaW5jbHVkZSAic3RhcmJvYXJkL2RlY29kZV90YXJnZXQuaCIgIC8vIE5PTElOVChidWlsZC9pbmNsdWRlX29yZGVyKQotCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gMyAmJiBTQl9BUElfVkVSU0lPTiA8IDQgJiYgU0JfSEFTKEdSQVBISUNTKQotCi0jaWYgU0JfSEFTKEJMSVRURVIpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2JsaXR0ZXIuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbnBsYi9ibGl0dGVyX2hlbHBlcnMuaCIKLSNlbGlmIFNCX0hBUyhHTEVTMikgIC8vIFNCX0hBUyhCTElUVEVSKQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNlbmRpZgotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBucGxiIHsKLW5hbWVzcGFjZSB7Ci0KLSNpZiBTQl9IQVMoQkxJVFRFUikKLWNvbnN0IGludCBrV2lkdGggPSAxMjg7Ci1jb25zdCBpbnQga0hlaWdodCA9IDEyODsKLQotVEVTVChTYkRlY29kZVRhcmdldFRlc3QsIFN1bm55RGF5Q3JlYXRlKSB7Ci0gIENvbnRleHRUZXN0RW52aXJvbm1lbnQgZW52KGtXaWR0aCwga0hlaWdodCk7Ci0KLSAgQVNTRVJUX1RSVUUoU2JCbGl0dGVyU2V0UmVuZGVyVGFyZ2V0KGVudi5jb250ZXh0KCksIGVudi5yZW5kZXJfdGFyZ2V0KCkpKTsKLQotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKLSAgU2JEZWNvZGVUYXJnZXQgdGFyZ2V0ID0gU2JEZWNvZGVUYXJnZXRDcmVhdGUoCi0gICAgICBlbnYuZGV2aWNlKCksIGtTYkRlY29kZVRhcmdldEZvcm1hdDFQbGFuZVJHQkEsIGtXaWR0aCwga0hlaWdodCk7Ci0gIGlmIChTYkRlY29kZVRhcmdldElzVmFsaWQodGFyZ2V0KSkgewotICAgIFNiRGVjb2RlVGFyZ2V0SW5mbyBpbmZvOwotICAgIFNiTWVtb3J5U2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOwotICAgIFNiRGVjb2RlVGFyZ2V0R2V0SW5mbyh0YXJnZXQsICZpbmZvKTsKLQotICAgIEVYUEVDVF9FUShrV2lkdGgsIGluZm8ud2lkdGgpOwotICAgIEVYUEVDVF9FUShrSGVpZ2h0LCBpbmZvLmhlaWdodCk7Ci0gICAgRVhQRUNUX0VRKGtTYkRlY29kZVRhcmdldEZvcm1hdDFQbGFuZVJHQkEsIGluZm8uZm9ybWF0KTsKLSAgICBFWFBFQ1RfRVEoa1dpZHRoLCBpbmZvLnBsYW5lc1trU2JEZWNvZGVUYXJnZXRQbGFuZVJHQkFdLndpZHRoKTsKLSAgICBFWFBFQ1RfRVEoa0hlaWdodCwgaW5mby5wbGFuZXNba1NiRGVjb2RlVGFyZ2V0UGxhbmVSR0JBXS5oZWlnaHQpOwotICAgIEVYUEVDVF9UUlVFKAotICAgICAgICBTYkJsaXR0ZXJJc1N1cmZhY2VWYWxpZChpbmZvLnBsYW5lc1trU2JEZWNvZGVUYXJnZXRQbGFuZVJHQkFdLnN1cmZhY2UpKTsKLSAgfQotICBTYkRlY29kZVRhcmdldFJlbGVhc2UodGFyZ2V0KTsKLSNlbHNlICAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAotICBTYkJsaXR0ZXJTdXJmYWNlIHN1cmZhY2UgPQotICAgICAgQ3JlYXRlQXJiaXRyYXJ5UmVuZGVyVGFyZ2V0U3VyZmFjZShlbnYuZGV2aWNlKCksIGtXaWR0aCwga0hlaWdodCk7Ci0KLSAgU2JEZWNvZGVUYXJnZXQgdGFyZ2V0ID0KLSAgICAgIFNiRGVjb2RlVGFyZ2V0Q3JlYXRlKGtTYkRlY29kZVRhcmdldEZvcm1hdDFQbGFuZVJHQkEsICZzdXJmYWNlKTsKLSAgaWYgKFNiRGVjb2RlVGFyZ2V0SXNWYWxpZCh0YXJnZXQpKSB7Ci0gICAgU2JCbGl0dGVyU3VyZmFjZSBwbGFuZSA9Ci0gICAgICAgIFNiRGVjb2RlVGFyZ2V0R2V0UGxhbmUodGFyZ2V0LCBrU2JEZWNvZGVUYXJnZXRQbGFuZVJHQkEpOwotICAgIEVYUEVDVF9UUlVFKFNiQmxpdHRlcklzU3VyZmFjZVZhbGlkKHBsYW5lKSk7Ci0gIH0KLSAgU2JEZWNvZGVUYXJnZXREZXN0cm95KHRhcmdldCk7Ci0gIEVYUEVDVF9UUlVFKFNiQmxpdHRlckRlc3Ryb3lTdXJmYWNlKHN1cmZhY2UpKTsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAotfQotI2VsaWYgU0JfSEFTKEdMRVMyKSAgLy8gU0JfSEFTKEJMSVRURVIpCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi1FR0xpbnQgY29uc3Qga0F0dHJpYnV0ZUxpc3RbXSA9IHsKLSAgRUdMX1JFRF9TSVpFLCA4LAotICBFR0xfR1JFRU5fU0laRSwgOCwKLSAgRUdMX0JMVUVfU0laRSwgOCwKLSAgRUdMX0FMUEhBX1NJWkUsIDgsCi0gIEVHTF9TVEVOQ0lMX1NJWkUsIDAsCi0gIEVHTF9CVUZGRVJfU0laRSwgMzIsCi0gIEVHTF9TVVJGQUNFX1RZUEUsIEVHTF9XSU5ET1dfQklUIHwgRUdMX1BCVUZGRVJfQklULAotICBFR0xfQ09MT1JfQlVGRkVSX1RZUEUsIEVHTF9SR0JfQlVGRkVSLAotICBFR0xfQ09ORk9STUFOVCwgRUdMX09QRU5HTF9FUzJfQklULAotICBFR0xfUkVOREVSQUJMRV9UWVBFLCBFR0xfT1BFTkdMX0VTMl9CSVQsCi0gIEVHTF9OT05FLAotfTsKLS8vIGNsYW5nLWZvcm1hdCBvbgotCi1jbGFzcyBTYkRlY29kZVRhcmdldFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgU0JfT1ZFUlJJREUgewotICAgIFNiV2luZG93T3B0aW9ucyBvcHRpb25zOwotICAgIFNiV2luZG93U2V0RGVmYXVsdE9wdGlvbnMoJm9wdGlvbnMpOwotICAgIHdpbmRvd18gPSBTYldpbmRvd0NyZWF0ZSgmb3B0aW9ucyk7Ci0KLSAgICBkaXNwbGF5XyA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7Ci0gICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLSAgICBBU1NFUlRfTkUoRUdMX05PX0RJU1BMQVksIGRpc3BsYXlfKTsKLQotICAgIGVnbEluaXRpYWxpemUoZGlzcGxheV8sIE5VTEwsIE5VTEwpOwotICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0KLSAgICBFR0xpbnQgbnVtX2NvbmZpZ3MgPSAwOwotICAgIGVnbENob29zZUNvbmZpZyhkaXNwbGF5Xywga0F0dHJpYnV0ZUxpc3QsIE5VTEwsIDAsICZudW1fY29uZmlncyk7Ci0gICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLSAgICBBU1NFUlRfTkUoMCwgbnVtX2NvbmZpZ3MpOwotCi0gICAgLy8gQWxsb2NhdGUgc3BhY2UgdG8gcmVjZWl2ZSB0aGUgbWF0Y2hpbmcgY29uZmlncyBhbmQgcmV0cmlldmUgdGhlbS4KLSAgICBFR0xDb25maWcqIGNvbmZpZ3MgPSBuZXcgRUdMQ29uZmlnW251bV9jb25maWdzXTsKLSAgICBlZ2xDaG9vc2VDb25maWcoZGlzcGxheV8sIGtBdHRyaWJ1dGVMaXN0LCBjb25maWdzLCBudW1fY29uZmlncywKLSAgICAgICAgICAgICAgICAgICAgJm51bV9jb25maWdzKTsKLSAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotCi0gICAgRUdMTmF0aXZlV2luZG93VHlwZSBuYXRpdmVfd2luZG93ID0KLSAgICAgICAgKEVHTE5hdGl2ZVdpbmRvd1R5cGUpU2JXaW5kb3dHZXRQbGF0Zm9ybUhhbmRsZSh3aW5kb3dfKTsKLSAgICBFR0xDb25maWcgY29uZmlnOwotCi0gICAgLy8gRmluZCB0aGUgZmlyc3QgY29uZmlnIHRoYXQgc3VjY2Vzc2Z1bGx5IGFsbG93IGEgd2luZG93IHN1cmZhY2UgdG8gYmUKLSAgICAvLyBjcmVhdGVkLgotICAgIHN1cmZhY2VfID0gRUdMX05PX1NVUkZBQ0U7Ci0gICAgZm9yIChpbnQgY29uZmlnX251bWJlciA9IDA7IGNvbmZpZ19udW1iZXIgPCBudW1fY29uZmlnczsgKytjb25maWdfbnVtYmVyKSB7Ci0gICAgICBjb25maWcgPSBjb25maWdzW2NvbmZpZ19udW1iZXJdOwotICAgICAgc3VyZmFjZV8gPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGRpc3BsYXlfLCBjb25maWcsIG5hdGl2ZV93aW5kb3csIE5VTEwpOwotICAgICAgaWYgKEVHTF9TVUNDRVNTID09IGVnbEdldEVycm9yKCkpCi0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBBU1NFUlRfTkUoRUdMX05PX1NVUkZBQ0UsIHN1cmZhY2VfKTsKLQotICAgIGRlbGV0ZVtdIGNvbmZpZ3M7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIEdMRVMyIG9yIEdMRVgzIENvbnRleHQuCi0gICAgY29udGV4dF8gPSBFR0xfTk9fQ09OVEVYVDsKLSAgICBFR0xpbnQgY29udGV4dF9hdHRyaWJfbGlzdFtdID0gewotICAgICAgICBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiwgMywgRUdMX05PTkUsCi0gICAgfTsKLSNpZiBkZWZpbmVkKEdMRVMzX1NVUFBPUlRFRCkKLSAgICAvLyBBdHRlbXB0IHRvIGNyZWF0ZSBhbiBPcGVuR0wgRVMgMy4wIGNvbnRleHQuCi0gICAgY29udGV4dF8gPQotICAgICAgICBlZ2xDcmVhdGVDb250ZXh0KGRpc3BsYXlfLCBjb25maWcsIEVHTF9OT19DT05URVhULCBjb250ZXh0X2F0dHJpYl9saXN0KTsKLSNlbmRpZgotICAgIGlmIChjb250ZXh0XyA9PSBFR0xfTk9fQ09OVEVYVCkgewotICAgICAgLy8gQ3JlYXRlIGFuIE9wZW5HTCBFUyAyLjAgY29udGV4dC4KLSAgICAgIGNvbnRleHRfYXR0cmliX2xpc3RbMV0gPSAyOwotICAgICAgY29udGV4dF8gPSBlZ2xDcmVhdGVDb250ZXh0KGRpc3BsYXlfLCBjb25maWcsIEVHTF9OT19DT05URVhULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfYXR0cmliX2xpc3QpOwotICAgIH0KLSAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgIEFTU0VSVF9ORShFR0xfTk9fQ09OVEVYVCwgY29udGV4dF8pOwotCi0gICAgLy8gY29ubmVjdCB0aGUgY29udGV4dCB0byB0aGUgc3VyZmFjZQotICAgIGVnbE1ha2VDdXJyZW50KGRpc3BsYXlfLCBzdXJmYWNlXywgc3VyZmFjZV8sIGNvbnRleHRfKTsKLSAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIFNCX09WRVJSSURFIHsKLSAgICBlZ2xNYWtlQ3VycmVudChkaXNwbGF5XywgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19TVVJGQUNFLCBFR0xfTk9fQ09OVEVYVCk7Ci0gICAgRVhQRUNUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLSAgICBlZ2xEZXN0cm95Q29udGV4dChkaXNwbGF5XywgY29udGV4dF8pOwotICAgIEVYUEVDVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgZWdsRGVzdHJveVN1cmZhY2UoZGlzcGxheV8sIHN1cmZhY2VfKTsKLSAgICBFWFBFQ1RfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgIGVnbFRlcm1pbmF0ZShkaXNwbGF5Xyk7Ci0gICAgRVhQRUNUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLSAgICBTYldpbmRvd0Rlc3Ryb3kod2luZG93Xyk7Ci0gIH0KLQotICBFR0xDb250ZXh0IGNvbnRleHRfOwotICBFR0xEaXNwbGF5IGRpc3BsYXlfOwotICBFR0xTdXJmYWNlIHN1cmZhY2VfOwotICBTYldpbmRvdyB3aW5kb3dfOwotfTsKLQotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKLVRFU1RfRihTYkRlY29kZVRhcmdldFRlc3QsIFN1bm55RGF5Q3JlYXRlKSB7Ci0gIGNvbnN0IGludCBrVGV4dHVyZVdpZHRoID0gMjU2OwotICBjb25zdCBpbnQga1RleHR1cmVIZWlnaHQgPSAyNTY7Ci0KLSAgU2JEZWNvZGVUYXJnZXQgdGFyZ2V0ID0KLSAgICAgIFNiRGVjb2RlVGFyZ2V0Q3JlYXRlKGRpc3BsYXlfLCBjb250ZXh0Xywga1NiRGVjb2RlVGFyZ2V0Rm9ybWF0MVBsYW5lUkdCQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUZXh0dXJlV2lkdGgsIGtUZXh0dXJlSGVpZ2h0KTsKLSAgaWYgKFNiRGVjb2RlVGFyZ2V0SXNWYWxpZCh0YXJnZXQpKSB7Ci0gICAgU2JEZWNvZGVUYXJnZXRJbmZvIGluZm87Ci0gICAgU2JNZW1vcnlTZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7Ci0gICAgU2JEZWNvZGVUYXJnZXRHZXRJbmZvKHRhcmdldCwgJmluZm8pOwotICAgIEVYUEVDVF9FUShrU2JEZWNvZGVUYXJnZXRGb3JtYXQxUGxhbmVSR0JBLCBpbmZvLmZvcm1hdCk7Ci0KLSAgICBFWFBFQ1RfTkUoMCwgaW5mby5wbGFuZXNba1NiRGVjb2RlVGFyZ2V0UGxhbmVSR0JBXS50ZXh0dXJlKTsKLQotICAgIGdsQmluZFRleHR1cmUoaW5mby5wbGFuZXNba1NiRGVjb2RlVGFyZ2V0UGxhbmVSR0JBXS5nbF90ZXh0dXJlX3RhcmdldCwKLSAgICAgICAgICAgICAgICAgIGluZm8ucGxhbmVzW2tTYkRlY29kZVRhcmdldFBsYW5lUkdCQV0udGV4dHVyZSk7Ci0gICAgRVhQRUNUX1RSVUUoZ2xHZXRFcnJvcigpID09IEdMX05PX0VSUk9SKTsKLSAgICBnbEJpbmRUZXh0dXJlKGluZm8ucGxhbmVzW2tTYkRlY29kZVRhcmdldFBsYW5lUkdCQV0uZ2xfdGV4dHVyZV90YXJnZXQsIDApOwotICAgIEVYUEVDVF9UUlVFKGdsR2V0RXJyb3IoKSA9PSBHTF9OT19FUlJPUik7Ci0KLSAgICBTYkRlY29kZVRhcmdldFJlbGVhc2UodGFyZ2V0KTsKLSAgfQotfQotI2Vsc2UgICAvLyAjaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAotVEVTVF9GKFNiRGVjb2RlVGFyZ2V0VGVzdCwgU3VubnlEYXlDcmVhdGUpIHsKLSAgLy8gR2VuZXJhdGUgYSB0ZXh0dXJlIHRvIHB1dCBpbiB0aGUgU2JEZWNvZGVUYXJnZXQuCi0gIGNvbnN0IGludCBrVGV4dHVyZVdpZHRoID0gMjU2OwotICBjb25zdCBpbnQga1RleHR1cmVIZWlnaHQgPSAyNTY7Ci0KLSAgR0x1aW50IHRleHR1cmVfaGFuZGxlOwotICBnbEdlblRleHR1cmVzKDEsICZ0ZXh0dXJlX2hhbmRsZSk7Ci0gIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZV9oYW5kbGUpOwotICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCAvKmxldmVsKi8sIEdMX1JHQkEsIGtUZXh0dXJlV2lkdGgsCi0gICAgICAgICAgICAgICBrVGV4dHVyZUhlaWdodCwgMCAvKmJvcmRlciovLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLAotICAgICAgICAgICAgICAgTlVMTCAvKmRhdGEqLyk7Ci0gIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMCk7Ci0KLSAgU2JEZWNvZGVUYXJnZXQgdGFyZ2V0ID0KLSAgICAgIFNiRGVjb2RlVGFyZ2V0Q3JlYXRlKGRpc3BsYXlfLCBjb250ZXh0Xywga1NiRGVjb2RlVGFyZ2V0Rm9ybWF0MVBsYW5lUkdCQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0dXJlX2hhbmRsZSk7Ci0gIGlmIChTYkRlY29kZVRhcmdldElzVmFsaWQodGFyZ2V0KSkgewotICAgIEdMdWludCBwbGFuZSA9IFNiRGVjb2RlVGFyZ2V0R2V0UGxhbmUodGFyZ2V0LCBrU2JEZWNvZGVUYXJnZXRQbGFuZVJHQkEpOwotICAgIEVYUEVDVF9FUSh0ZXh0dXJlX2hhbmRsZSwgcGxhbmUpOwotICAgIFNiRGVjb2RlVGFyZ2V0RGVzdHJveSh0YXJnZXQpOwotICB9Ci0gIGdsRGVsZXRlVGV4dHVyZXMoMSwgJnRleHR1cmVfaGFuZGxlKTsKLX0KLSNlbmRpZiAgLy8gI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKLQotI2Vsc2UgIC8vIFNCX0hBUyhCTElUVEVSKQotCi1URVNUKFNiRGVjb2RlVGFyZ2V0VGVzdCwgU3VubnlEYXlDcmVhdGUpIHsKLSAgLy8gV2hlbiBncmFwaGljcyBhcmUgbm90IGVuYWJsZWQsIHdlIGV4cGVjdCB0byBhbHdheXMgY3JlYXRlIGEKLSAgLy8ga1NiRGVjb2RlVGFyZ2V0SW52YWxpZCwgYW5kIGdldCBOVUxMIGJhY2sgZm9yIHBsYW5lcy4KLSAgRVhQRUNUX0VRKFNiRGVjb2RlVGFyZ2V0Q3JlYXRlKGtTYkRlY29kZVRhcmdldEZvcm1hdDFQbGFuZVJHQkEpLAotICAgICAgICAgICAga1NiRGVjb2RlVGFyZ2V0SW52YWxpZCk7Ci0gIFNiRGVjb2RlVGFyZ2V0SW5mbyBpbmZvOwotICBTYk1lbW9yeVNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKLSAgRVhQRUNUX0ZBTFNFKFNiRGVjb2RlVGFyZ2V0R2V0SW5mbyhrU2JEZWNvZGVUYXJnZXRJbnZhbGlkLCAmaW5mbykpOwotfQotCi0jZW5kaWYgIC8vIFNCX0hBUyhCTElUVEVSKQotCi19ICAvLyBuYW1lc3BhY2UKLX0gIC8vIG5hbWVzcGFjZSBucGxiCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCi0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gMyAmJiBcCi0gICAgICAgIC8vIFNCX0FQSV9WRVJTSU9OIDwgNCAmJiBcCi0gICAgICAgIC8vIFNCX0hBUyhHUkFQSElDUykKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9kZWNvZGVfdGFyZ2V0X3Byb3ZpZGVyX3Rlc3QuY2MgYi9zcmMvc3RhcmJvYXJkL25wbGIvZGVjb2RlX3RhcmdldF9wcm92aWRlcl90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGE3MDU3Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvbnBsYi9kZWNvZGVfdGFyZ2V0X3Byb3ZpZGVyX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi0vLyBUaGlzIG11c3QgY29tZSBhZnRlciBndGVzdCwgYmVjYXVzZSBpdCBpbmNsdWRlcyBHTCwgd2hpY2ggY2FuIGluY2x1ZGUgWDExLAotLy8gd2hpY2ggd2lsbCBkZWZpbmUgTm9uZSB0byBiZSAwTCwgd2hpY2ggY29uZmxpY3RzIHdpdGggZ3Rlc3QuCi0jaW5jbHVkZSAic3RhcmJvYXJkL2RlY29kZV90YXJnZXQuaCIgIC8vIE5PTElOVChidWlsZC9pbmNsdWRlX29yZGVyKQotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBucGxiIHsKLQotI2lmIFNCX0hBUyhHUkFQSElDUykKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSAzICYmIFNCX0FQSV9WRVJTSU9OIDwgNAotCi1uYW1lc3BhY2UgewotCi1zdHJ1Y3QgUHJvdmlkZXJDb250ZXh0IHsKLSAgc3RhdGljIFNiRGVjb2RlVGFyZ2V0IEFjcXVpcmUodm9pZCogcmF3X2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRGVjb2RlVGFyZ2V0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KSB7Ci0gICAgUHJvdmlkZXJDb250ZXh0KiBjb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxQcm92aWRlckNvbnRleHQqPihyYXdfY29udGV4dCk7Ci0gICAgKytjb250ZXh0LT5jYWxsZWRfYWNxdWlyZTsKLSAgICByZXR1cm4ga1NiRGVjb2RlVGFyZ2V0SW52YWxpZDsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIFJlbGVhc2Uodm9pZCogcmF3X2NvbnRleHQsIFNiRGVjb2RlVGFyZ2V0IHRhcmdldCkgewotICAgIFByb3ZpZGVyQ29udGV4dCogY29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UHJvdmlkZXJDb250ZXh0Kj4ocmF3X2NvbnRleHQpOwotICAgICsrY29udGV4dC0+Y2FsbGVkX3JlbGVhc2U7Ci0gIH0KLQotICBpbnQgY2FsbGVkX2FjcXVpcmU7Ci0gIGludCBjYWxsZWRfcmVsZWFzZTsKLX07Ci0KLXZvaWQgQWNxdWlyZUZhbHNlKFNiRGVjb2RlVGFyZ2V0UHJvdmlkZXIqIHByb3ZpZGVyKSB7Ci0gIGlmIChwcm92aWRlcikgewotICAgIFNiRGVjb2RlVGFyZ2V0IHRhcmdldCA9IFNiRGVjb2RlVGFyZ2V0QWNxdWlyZUZyb21Qcm92aWRlcigKLSAgICAgICAgcHJvdmlkZXIsIGtTYkRlY29kZVRhcmdldEZvcm1hdDFQbGFuZVJHQkEsIDE2LCAxNik7Ci0gICAgYm9vbCB2YWxpZCA9IFNiRGVjb2RlVGFyZ2V0SXNWYWxpZCh0YXJnZXQpOwotICAgIEVYUEVDVF9GQUxTRSh2YWxpZCk7Ci0gICAgaWYgKHZhbGlkKSB7Ci0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAotICAgICAgU2JEZWNvZGVUYXJnZXRSZWxlYXNlKHRhcmdldCk7Ci0jZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKLSAgICAgIFNiRGVjb2RlVGFyZ2V0RGVzdHJveSh0YXJnZXQpOwotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgUmVsZWFzZUludmFsaWQoU2JEZWNvZGVUYXJnZXRQcm92aWRlciogcHJvdmlkZXIpIHsKLSAgaWYgKHByb3ZpZGVyKSB7Ci0gICAgU2JEZWNvZGVUYXJnZXRSZWxlYXNlVG9Qcm92aWRlcihwcm92aWRlciwga1NiRGVjb2RlVGFyZ2V0SW52YWxpZCk7Ci0gIH0KLX0KLQotVEVTVChTYkRlY29kZVRhcmdldFByb3ZpZGVyVGVzdCwgU3VubnlEYXlDYWxsc1Rocm91Z2hUb1Byb3ZpZGVyKSB7Ci0gIFByb3ZpZGVyQ29udGV4dCBjb250ZXh0ID0ge307Ci0gIFNiRGVjb2RlVGFyZ2V0UHJvdmlkZXIgcHJvdmlkZXIgPSB7JlByb3ZpZGVyQ29udGV4dDo6QWNxdWlyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUHJvdmlkZXJDb250ZXh0OjpSZWxlYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KCZjb250ZXh0KX07Ci0KLSAgRVhQRUNUX0VRKDAsIGNvbnRleHQuY2FsbGVkX2FjcXVpcmUpOwotICBFWFBFQ1RfRVEoMCwgY29udGV4dC5jYWxsZWRfcmVsZWFzZSk7Ci0KLSAgQWNxdWlyZUZhbHNlKCZwcm92aWRlcik7Ci0gIEVYUEVDVF9FUSgxLCBjb250ZXh0LmNhbGxlZF9hY3F1aXJlKTsKLSAgQWNxdWlyZUZhbHNlKCZwcm92aWRlcik7Ci0gIEVYUEVDVF9FUSgyLCBjb250ZXh0LmNhbGxlZF9hY3F1aXJlKTsKLQotICBSZWxlYXNlSW52YWxpZCgmcHJvdmlkZXIpOwotICBFWFBFQ1RfRVEoMSwgY29udGV4dC5jYWxsZWRfcmVsZWFzZSk7Ci0gIFJlbGVhc2VJbnZhbGlkKCZwcm92aWRlcik7Ci0gIEVYUEVDVF9FUSgyLCBjb250ZXh0LmNhbGxlZF9yZWxlYXNlKTsKLX0KLQotVEVTVChTYkRlY29kZVRhcmdldFByb3ZpZGVyVGVzdCwgU3VubnlEYXlNdWx0aXBsZVByb3ZpZGVycykgewotICBQcm92aWRlckNvbnRleHQgY29udGV4dCA9IHt9OwotICBTYkRlY29kZVRhcmdldFByb3ZpZGVyIHByb3ZpZGVyID0geyZQcm92aWRlckNvbnRleHQ6OkFjcXVpcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlByb3ZpZGVyQ29udGV4dDo6UmVsZWFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqPigmY29udGV4dCl9OwotCi0gIFByb3ZpZGVyQ29udGV4dCBjb250ZXh0MiA9IHt9OwotICBTYkRlY29kZVRhcmdldFByb3ZpZGVyIHByb3ZpZGVyMiA9IHsmUHJvdmlkZXJDb250ZXh0OjpBY3F1aXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUHJvdmlkZXJDb250ZXh0OjpSZWxlYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqPigmY29udGV4dDIpfTsKLQotICBBY3F1aXJlRmFsc2UoJnByb3ZpZGVyMik7Ci0gIEVYUEVDVF9FUSgxLCBjb250ZXh0Mi5jYWxsZWRfYWNxdWlyZSk7Ci0gIEVYUEVDVF9FUSgwLCBjb250ZXh0LmNhbGxlZF9hY3F1aXJlKTsKLSAgQWNxdWlyZUZhbHNlKCZwcm92aWRlcjIpOwotICBFWFBFQ1RfRVEoMiwgY29udGV4dDIuY2FsbGVkX2FjcXVpcmUpOwotICBFWFBFQ1RfRVEoMCwgY29udGV4dC5jYWxsZWRfYWNxdWlyZSk7Ci0KLSAgUmVsZWFzZUludmFsaWQoJnByb3ZpZGVyMik7Ci0gIEVYUEVDVF9FUSgxLCBjb250ZXh0Mi5jYWxsZWRfcmVsZWFzZSk7Ci0gIEVYUEVDVF9FUSgwLCBjb250ZXh0LmNhbGxlZF9yZWxlYXNlKTsKLSAgUmVsZWFzZUludmFsaWQoJnByb3ZpZGVyMik7Ci0gIEVYUEVDVF9FUSgyLCBjb250ZXh0Mi5jYWxsZWRfcmVsZWFzZSk7Ci0gIEVYUEVDVF9FUSgwLCBjb250ZXh0LmNhbGxlZF9yZWxlYXNlKTsKLX0KLQotVEVTVChTYkRlY29kZVRhcmdldFByb3ZpZGVyVGVzdCwgUmFpbnlEYXlBY3F1aXJlTm9Qcm92aWRlcikgewotICBBY3F1aXJlRmFsc2UoTlVMTCk7Ci19Ci0KLVRFU1QoU2JEZWNvZGVUYXJnZXRQcm92aWRlclRlc3QsIFJhaW55RGF5UmVsZWFzZU5vUHJvdmlkZXIpIHsKLSAgUmVsZWFzZUludmFsaWQoTlVMTCk7Ci19Ci0KLVRFU1QoU2JEZWNvZGVUYXJnZXRQcm92aWRlclRlc3QsIFJhaW55RGF5TXVsdGlwbGVQcm92aWRlcnMpIHsKLSAgUHJvdmlkZXJDb250ZXh0IGNvbnRleHQgPSB7fTsKLSAgU2JEZWNvZGVUYXJnZXRQcm92aWRlciBwcm92aWRlciA9IHsmUHJvdmlkZXJDb250ZXh0OjpBY3F1aXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQcm92aWRlckNvbnRleHQ6OlJlbGVhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oJmNvbnRleHQpfTsKLQotICBQcm92aWRlckNvbnRleHQgY29udGV4dDIgPSB7fTsKLSAgU2JEZWNvZGVUYXJnZXRQcm92aWRlciBwcm92aWRlcjIgPSB7JlByb3ZpZGVyQ29udGV4dDo6QWNxdWlyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlByb3ZpZGVyQ29udGV4dDo6UmVsZWFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oJmNvbnRleHQyKX07Ci0KLSAgQWNxdWlyZUZhbHNlKCZwcm92aWRlcjIpOwotICBFWFBFQ1RfRVEoMSwgY29udGV4dDIuY2FsbGVkX2FjcXVpcmUpOwotICBBY3F1aXJlRmFsc2UoJnByb3ZpZGVyMik7Ci0gIEVYUEVDVF9FUSgyLCBjb250ZXh0Mi5jYWxsZWRfYWNxdWlyZSk7Ci0KLSAgUmVsZWFzZUludmFsaWQoJnByb3ZpZGVyMik7Ci0gIEVYUEVDVF9FUSgxLCBjb250ZXh0Mi5jYWxsZWRfcmVsZWFzZSk7Ci0gIFJlbGVhc2VJbnZhbGlkKCZwcm92aWRlcjIpOwotICBFWFBFQ1RfRVEoMiwgY29udGV4dDIuY2FsbGVkX3JlbGVhc2UpOwotCi0gIEFjcXVpcmVGYWxzZSgmcHJvdmlkZXIpOwotICBFWFBFQ1RfRVEoMiwgY29udGV4dDIuY2FsbGVkX2FjcXVpcmUpOwotICBBY3F1aXJlRmFsc2UoJnByb3ZpZGVyKTsKLSAgRVhQRUNUX0VRKDIsIGNvbnRleHQyLmNhbGxlZF9hY3F1aXJlKTsKLQotICBSZWxlYXNlSW52YWxpZCgmcHJvdmlkZXIpOwotICBFWFBFQ1RfRVEoMiwgY29udGV4dDIuY2FsbGVkX3JlbGVhc2UpOwotICBSZWxlYXNlSW52YWxpZCgmcHJvdmlkZXIpOwotICBFWFBFQ1RfRVEoMiwgY29udGV4dDIuY2FsbGVkX3JlbGVhc2UpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSAzICYmIFwKLSAgICAgICAgLy8gU0JfQVBJX1ZFUlNJT04gPCA0Ci0jZW5kaWYgIC8vIFNCX0hBUyhHUkFQSElDUykKLQotfSAgLy8gbmFtZXNwYWNlIG5wbGIKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9mbGF0X21hcF90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL2ZsYXRfbWFwX3Rlc3QuY2MKaW5kZXggYjU4MTdmNC4uZWE3ZjMyYSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL2ZsYXRfbWFwX3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL2ZsYXRfbWFwX3Rlc3QuY2MKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxzc3RyZWFtPgogI2luY2x1ZGUgPHN0cmluZz4KIAorI2luY2x1ZGUgInN0YXJib2FyZC9zeXN0ZW0uaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvdGhyZWFkLmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCiAKQEAgLTM0LDExICszNSwxMSBAQAogICByZXR1cm4gKHN0ZDo6cmFuZCgpICUgMikgPT0gMTsKIH0KIAotaW50IFJhbmRvbShpbnQgZmlyc3RfaW5jbHVkc2l2ZSwgaW50IGVuZF9leGNsdXNpdmUpIHsKLSAgc2l6ZV90IHJhbmdlID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihlbmRfZXhjbHVzaXZlIC0gZmlyc3RfaW5jbHVkc2l2ZSk7Ci0KLSAgc2l6ZV90IHIgPSByYW5kKCkgJSByYW5nZTsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4ocikgKyBmaXJzdF9pbmNsdWRzaXZlOworaW50IFJhbmRvbShpbnQgZmlyc3RfaW5jbHVzaXZlLCBpbnQgZW5kX2V4Y2x1c2l2ZSkgeworICBzaXplX3QgcmFuZ2UgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGVuZF9leGNsdXNpdmUgLSBmaXJzdF9pbmNsdXNpdmUpOworICBzaXplX3QgcmFuZCA9IDA7CisgIFNiU3lzdGVtR2V0UmFuZG9tRGF0YSgmcmFuZCwgc2l6ZW9mKHJhbmQpKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4ocmFuZCAlIHJhbmdlKSArIGZpcnN0X2luY2x1c2l2ZTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIE1hcEFfVHlwZSwgdHlwZW5hbWUgTWFwQl9UeXBlPgpAQCAtODksNyArOTAsNyBAQAogfQogCiBTYlRpbWVNb25vdG9uaWMgR2V0VGhyZWFkVGltZU1vbm90b25pY05vdygpIHsKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSAzICYmIFNCX0hBUyhUSU1FX1RIUkVBRF9OT1cpCisjaWYgU0JfSEFTKFRJTUVfVEhSRUFEX05PVykKICAgcmV0dXJuIFNiVGltZUdldE1vbm90b25pY1RocmVhZE5vdygpOwogI2Vsc2UKICAgcmV0dXJuIFNiVGltZUdldE1vbm90b25pY05vdygpOwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL2tleV90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL2tleV90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZmQyNDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL25wbGIva2V5X3Rlc3QuY2MKQEAgLTAsMCArMSw0MCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC9rZXkuaCIKKworI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2Ugc3RhcmJvYXJkIHsKK25hbWVzcGFjZSBucGxiIHsKK25hbWVzcGFjZSB7CisKK1RFU1QoU2JLZXlUZXN0LCBDYW5SZWZlcmVuY2UpIHsKKyAgRVhQRUNUX05FKGtTYktleVVua25vd24sIGtTYktleU1lZGlhUmV3aW5kKTsKKyAgRVhQRUNUX05FKGtTYktleVVua25vd24sIGtTYktleU1lZGlhRmFzdEZvcndhcmQpOworCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfTkVXX0tFWUNPREVTX0FQSV9WRVJTSU9OCisgIEVYUEVDVF9ORShrU2JLZXlVbmtub3duLCBrU2JLZXlSZWQpOworICBFWFBFQ1RfTkUoa1NiS2V5VW5rbm93biwga1NiS2V5R3JlZW4pOworICBFWFBFQ1RfTkUoa1NiS2V5VW5rbm93biwga1NiS2V5WWVsbG93KTsKKyAgRVhQRUNUX05FKGtTYktleVVua25vd24sIGtTYktleUJsdWUpOworICBFWFBFQ1RfTkUoa1NiS2V5VW5rbm93biwga1NiS2V5U3VidGl0bGUpOworICBFWFBFQ1RfTkUoa1NiS2V5VW5rbm93biwga1NiS2V5Q2xvc2VkQ2FwdGlvbik7CisgIEVYUEVDVF9ORShrU2JLZXlVbmtub3duLCBrU2JLZXlMYXVuY2hUaGlzQXBwbGljYXRpb24pOworI2VuZGlmICAvLyAgU0JfQVBJX1ZFUlNJT04gPj0gU0JfTkVXX0tFWUNPREVTX0FQSV9WRVJTSU9OCit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIG5wbGIKK30gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9taWNyb3Bob25lX2Nsb3NlX3Rlc3QuY2MgYi9zcmMvc3RhcmJvYXJkL25wbGIvbWljcm9waG9uZV9jbG9zZV90ZXN0LmNjCmluZGV4IGIxODUwOGEuLmEwNTljYmEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbnBsYi9taWNyb3Bob25lX2Nsb3NlX3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL21pY3JvcGhvbmVfY2xvc2VfdGVzdC5jYwpAQCAtMTgsOCArMTgsOSBAQAogCiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKIG5hbWVzcGFjZSBucGxiIHsKK25hbWVzcGFjZSB7CiAKLSNpZiBTQl9IQVMoTUlDUk9QSE9ORSkgJiYgU0JfQVBJX1ZFUlNJT04gPj0gMgorI2lmIFNCX0hBUyhNSUNST1BIT05FKQogCiBURVNUKFNiTWljcm9waG9uZUNsb3NlVGVzdCwgU3VubnlEYXlDbG9zZUFyZUNhbGxlZE11bHRpcGxlVGltZXMpIHsKICAgU2JNaWNyb3Bob25lSW5mbyBpbmZvX2FycmF5W2tNYXhOdW1iZXJPZk1pY3JvcGhvbmVdOwpAQCAtNzMsNyArNzQsOCBAQAogICBFWFBFQ1RfRkFMU0Uoc3VjY2Vzcyk7CiB9CiAKLSNlbmRpZiAgLy8gU0JfSEFTKE1JQ1JPUEhPTkUpICYmIFNCX0FQSV9WRVJTSU9OID49IDIKKyNlbmRpZiAgLy8gU0JfSEFTKE1JQ1JPUEhPTkUpCiAKK30gIC8vIG5hbWVzcGFjZQogfSAgLy8gbmFtZXNwYWNlIG5wbGIKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9taWNyb3Bob25lX2NyZWF0ZV90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL21pY3JvcGhvbmVfY3JlYXRlX3Rlc3QuY2MKaW5kZXggNGZiZDAxNS4uYzExZmQ1ZiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL21pY3JvcGhvbmVfY3JlYXRlX3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL21pY3JvcGhvbmVfY3JlYXRlX3Rlc3QuY2MKQEAgLTE4LDggKzE4LDkgQEAKIAogbmFtZXNwYWNlIHN0YXJib2FyZCB7CiBuYW1lc3BhY2UgbnBsYiB7CituYW1lc3BhY2UgewogCi0jaWYgU0JfSEFTKE1JQ1JPUEhPTkUpICYmIFNCX0FQSV9WRVJTSU9OID49IDIKKyNpZiBTQl9IQVMoTUlDUk9QSE9ORSkKIAogVEVTVChTYk1pY3JvcGhvbmVDcmVhdGVUZXN0LCBTdW5ueURheU9ubHlPbmVNaWNyb3Bob25lKSB7CiAgIFNiTWljcm9waG9uZUluZm8gaW5mb19hcnJheVtrTWF4TnVtYmVyT2ZNaWNyb3Bob25lXTsKQEAgLTE3Nyw3ICsxNzgsOCBAQAogICB9CiB9CiAKLSNlbmRpZiAgLy8gU0JfSEFTKE1JQ1JPUEhPTkUpICYmIFNCX0FQSV9WRVJTSU9OID49IDIKKyNlbmRpZiAgLy8gU0JfSEFTKE1JQ1JPUEhPTkUpCiAKK30gIC8vIG5hbWVzcGFjZQogfSAgLy8gbmFtZXNwYWNlIG5wbGIKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9taWNyb3Bob25lX2Rlc3Ryb3lfdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9taWNyb3Bob25lX2Rlc3Ryb3lfdGVzdC5jYwppbmRleCA4ZjdhNjllLi42N2RlMjI3IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL25wbGIvbWljcm9waG9uZV9kZXN0cm95X3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL21pY3JvcGhvbmVfZGVzdHJveV90ZXN0LmNjCkBAIC0xNywxNCArMTcsMTYgQEAKIAogbmFtZXNwYWNlIHN0YXJib2FyZCB7CiBuYW1lc3BhY2UgbnBsYiB7CituYW1lc3BhY2UgewogCi0jaWYgU0JfSEFTKE1JQ1JPUEhPTkUpICYmIFNCX0FQSV9WRVJTSU9OID49IDIKKyNpZiBTQl9IQVMoTUlDUk9QSE9ORSkKIAogVEVTVChTYk1pY3JvcGhvbmVEZXN0cm95VGVzdCwgRGVzdHJveUludmFsaWRNaWNyb3Bob25lKSB7CiAgIFNiTWljcm9waG9uZURlc3Ryb3koa1NiTWljcm9waG9uZUludmFsaWQpOwogfQogCi0jZW5kaWYgIC8vIFNCX0hBUyhNSUNST1BIT05FKSAmJiBTQl9BUElfVkVSU0lPTiA+PSAyCisjZW5kaWYgIC8vIFNCX0hBUyhNSUNST1BIT05FKQogCit9ICAvLyBuYW1lc3BhY2UKIH0gIC8vIG5hbWVzcGFjZSBucGxiCiB9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL25wbGIvbWljcm9waG9uZV9nZXRfYXZhaWxhYmxlX3Rlc3QuY2MgYi9zcmMvc3RhcmJvYXJkL25wbGIvbWljcm9waG9uZV9nZXRfYXZhaWxhYmxlX3Rlc3QuY2MKaW5kZXggNTMyNGJlMC4uZGMzMGQ0YSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL21pY3JvcGhvbmVfZ2V0X2F2YWlsYWJsZV90ZXN0LmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9taWNyb3Bob25lX2dldF9hdmFpbGFibGVfdGVzdC5jYwpAQCAtMTgsOCArMTgsOSBAQAogCiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKIG5hbWVzcGFjZSBucGxiIHsKK25hbWVzcGFjZSB7CiAKLSNpZiBTQl9IQVMoTUlDUk9QSE9ORSkgJiYgU0JfQVBJX1ZFUlNJT04gPj0gMgorI2lmIFNCX0hBUyhNSUNST1BIT05FKQogCiBURVNUKFNiTWljcm9waG9uZUdldEF2YWlsYWJsZVRlc3QsIFN1bm55RGF5KSB7CiAgIFNiTWljcm9waG9uZUluZm8gaW5mb19hcnJheVtrTWF4TnVtYmVyT2ZNaWNyb3Bob25lXTsKQEAgLTUzLDcgKzU0LDggQEAKICAgfQogfQogCi0jZW5kaWYgIC8vIFNCX0hBUyhNSUNST1BIT05FKSAmJiBTQl9BUElfVkVSU0lPTiA+PSAyCisjZW5kaWYgIC8vIFNCX0hBUyhNSUNST1BIT05FKQogCit9ICAvLyBuYW1lc3BhY2UKIH0gIC8vIG5hbWVzcGFjZSBucGxiCiB9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL25wbGIvbWljcm9waG9uZV9oZWxwZXJzLmggYi9zcmMvc3RhcmJvYXJkL25wbGIvbWljcm9waG9uZV9oZWxwZXJzLmgKaW5kZXggYjQxM2YwMi4uMjgwYTUzYSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL21pY3JvcGhvbmVfaGVscGVycy5oCisrKyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9taWNyb3Bob25lX2hlbHBlcnMuaApAQCAtMTcsNyArMTcsNyBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL21pY3JvcGhvbmUuaCIKIAotI2lmIFNCX0hBUyhNSUNST1BIT05FKSAmJiBTQl9BUElfVkVSU0lPTiA+PSAyCisjaWYgU0JfSEFTKE1JQ1JPUEhPTkUpCiAKIG5hbWVzcGFjZSBzdGFyYm9hcmQgewogbmFtZXNwYWNlIG5wbGIgewpAQCAtMjcsNiArMjcsNiBAQAogfSAgLy8gbmFtZXNwYWNlIG5wbGIKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKIAotI2VuZGlmICAvLyBTQl9IQVMoTUlDUk9QSE9ORSkgJiYgU0JfQVBJX1ZFUlNJT04gPj0gMgorI2VuZGlmICAvLyBTQl9IQVMoTUlDUk9QSE9ORSkKIAogI2VuZGlmICAvLyBTVEFSQk9BUkRfTlBMQl9NSUNST1BIT05FX0hFTFBFUlNfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9taWNyb3Bob25lX2lzX3NhbXBsZV9yYXRlX3N1cHBvcnRlZF90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL21pY3JvcGhvbmVfaXNfc2FtcGxlX3JhdGVfc3VwcG9ydGVkX3Rlc3QuY2MKaW5kZXggN2I4Njk5Mi4uZjhmYjFmYiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL21pY3JvcGhvbmVfaXNfc2FtcGxlX3JhdGVfc3VwcG9ydGVkX3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL21pY3JvcGhvbmVfaXNfc2FtcGxlX3JhdGVfc3VwcG9ydGVkX3Rlc3QuY2MKQEAgLTE4LDggKzE4LDkgQEAKIAogbmFtZXNwYWNlIHN0YXJib2FyZCB7CiBuYW1lc3BhY2UgbnBsYiB7CituYW1lc3BhY2UgewogCi0jaWYgU0JfSEFTKE1JQ1JPUEhPTkUpICYmIFNCX0FQSV9WRVJTSU9OID49IDIKKyNpZiBTQl9IQVMoTUlDUk9QSE9ORSkKIAogVEVTVChTYk1pY3JvcGhvbmVJc1NhbXBsZVJhdGVTdXBwb3J0ZWRUZXN0LCBTdW5ueURheSkgewogICBTYk1pY3JvcGhvbmVJbmZvIGluZm9fYXJyYXlba01heE51bWJlck9mTWljcm9waG9uZV07CkBAIC00OSw3ICs1MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga05vcm1hbGx5VXNlZFNhbXBsZVJhdGVJbkh6KSk7CiB9CiAKLSNlbmRpZiAgLy8gU0JfSEFTKE1JQ1JPUEhPTkUpICYmIFNCX0FQSV9WRVJTSU9OID49IDIKKyNlbmRpZiAgLy8gU0JfSEFTKE1JQ1JPUEhPTkUpCiAKK30gIC8vIG5hbWVzcGFjZQogfSAgLy8gbmFtZXNwYWNlIG5wbGIKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9taWNyb3Bob25lX29wZW5fdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9taWNyb3Bob25lX29wZW5fdGVzdC5jYwppbmRleCAyNzNmMDgxLi5iMTE5MTZlIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL25wbGIvbWljcm9waG9uZV9vcGVuX3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL21pY3JvcGhvbmVfb3Blbl90ZXN0LmNjCkBAIC0xOCw4ICsxOCw5IEBACiAKIG5hbWVzcGFjZSBzdGFyYm9hcmQgewogbmFtZXNwYWNlIG5wbGIgeworbmFtZXNwYWNlIHsKIAotI2lmIFNCX0hBUyhNSUNST1BIT05FKSAmJiBTQl9BUElfVkVSU0lPTiA+PSAyCisjaWYgU0JfSEFTKE1JQ1JPUEhPTkUpCiAKIFRFU1QoU2JNaWNyb3Bob25lT3BlblRlc3QsIFN1bm55RGF5KSB7CiAgIFNiTWljcm9waG9uZUluZm8gaW5mb19hcnJheVtrTWF4TnVtYmVyT2ZNaWNyb3Bob25lXTsKQEAgLTkyLDcgKzkzLDggQEAKICAgRVhQRUNUX0ZBTFNFKHN1Y2Nlc3MpOwogfQogCi0jZW5kaWYgIC8vIFNCX0hBUyhNSUNST1BIT05FKSAmJiBTQl9BUElfVkVSU0lPTiA+PSAyCisjZW5kaWYgIC8vIFNCX0hBUyhNSUNST1BIT05FKQogCit9ICAvLyBuYW1lc3BhY2UKIH0gIC8vIG5hbWVzcGFjZSBucGxiCiB9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL25wbGIvbWljcm9waG9uZV9yZWFkX3Rlc3QuY2MgYi9zcmMvc3RhcmJvYXJkL25wbGIvbWljcm9waG9uZV9yZWFkX3Rlc3QuY2MKaW5kZXggODA1ZjAzNS4uMjExYTVlZiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL21pY3JvcGhvbmVfcmVhZF90ZXN0LmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9taWNyb3Bob25lX3JlYWRfdGVzdC5jYwpAQCAtMTksOCArMTksOSBAQAogCiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKIG5hbWVzcGFjZSBucGxiIHsKK25hbWVzcGFjZSB7CiAKLSNpZiBTQl9IQVMoTUlDUk9QSE9ORSkgJiYgU0JfQVBJX1ZFUlNJT04gPj0gMgorI2lmIFNCX0hBUyhNSUNST1BIT05FKQogCiBURVNUKFNiTWljcm9waG9uZVJlYWRUZXN0LCBTdW5ueURheSkgewogICBTYk1pY3JvcGhvbmVJbmZvIGluZm9fYXJyYXlba01heE51bWJlck9mTWljcm9waG9uZV07CkBAIC0yMzUsNyArMjM2LDggQEAKICAgRVhQRUNUX0xUKHJlYWRfYnl0ZXMsIDApOwogfQogCi0jZW5kaWYgIC8vIFNCX0hBUyhNSUNST1BIT05FKSAmJiBTQl9BUElfVkVSU0lPTiA+PSAyCisjZW5kaWYgIC8vIFNCX0hBUyhNSUNST1BIT05FKQogCit9ICAvLyBuYW1lc3BhY2UKIH0gIC8vIG5hbWVzcGFjZSBucGxiCiB9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL25wbGIvbnBsYi5neXAgYi9zcmMvc3RhcmJvYXJkL25wbGIvbnBsYi5neXAKaW5kZXggMjc0YTY3Zi4uZWI5YjhjZCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL25wbGIuZ3lwCisrKyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9ucGxiLmd5cApAQCAtODgsOCArODgsNiBAQAogICAgICAgICAnY3J5cHRvZ3JhcGh5X2hlbHBlcnMuaCcsCiAgICAgICAgICdjcnlwdG9ncmFwaHlfdHJhbnNmb3JtX3Rlc3QuY2MnLAogICAgICAgICAnY3J5cHRvZ3JhcGh5X3RyYW5zZm9ybV9nY21fdGVzdC5jYycsCi0gICAgICAgICdkZWNvZGVfdGFyZ2V0X2NyZWF0ZV90ZXN0LmNjJywKLSAgICAgICAgJ2RlY29kZV90YXJnZXRfcHJvdmlkZXJfdGVzdC5jYycsCiAgICAgICAgICdkaXJlY3RvcnlfY2FuX29wZW5fdGVzdC5jYycsCiAgICAgICAgICdkaXJlY3RvcnlfY2xvc2VfdGVzdC5jYycsCiAgICAgICAgICdkaXJlY3RvcnlfY3JlYXRlX3Rlc3QuY2MnLApAQCAtMTE0LDYgKzExMiw3IEBACiAgICAgICAgICdmbGF0X21hcF90ZXN0LmNjJywKICAgICAgICAgJ2luY2x1ZGVfYWxsLmMnLAogICAgICAgICAnaW5jbHVkZV9hbGxfdG9vLmMnLAorICAgICAgICAna2V5X3Rlc3QuY2MnLAogICAgICAgICAnbG9nX2ZsdXNoX3Rlc3QuY2MnLAogICAgICAgICAnbG9nX2Zvcm1hdF90ZXN0LmNjJywKICAgICAgICAgJ2xvZ19pc190dHlfdGVzdC5jYycsCkBAIC0xNjEsNyArMTYwLDYgQEAKICAgICAgICAgJ3NvY2tldF9nZXRfaW50ZXJmYWNlX2FkZHJlc3NfdGVzdC5jYycsCiAgICAgICAgICdzb2NrZXRfZ2V0X2xhc3RfZXJyb3JfdGVzdC5jYycsCiAgICAgICAgICdzb2NrZXRfZ2V0X2xvY2FsX2FkZHJlc3NfdGVzdC5jYycsCi0gICAgICAgICdzb2NrZXRfZ2V0X2xvY2FsX2ludGVyZmFjZV9hZGRyZXNzX3Rlc3QuY2MnLAogICAgICAgICAnc29ja2V0X2hlbHBlcnMuY2MnLAogICAgICAgICAnc29ja2V0X2lzX2Nvbm5lY3RlZF9hbmRfaWRsZV90ZXN0LmNjJywKICAgICAgICAgJ3NvY2tldF9pc19jb25uZWN0ZWRfdGVzdC5jYycsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL25wbGIvb3B0aW9uYWxfdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9vcHRpb25hbF90ZXN0LmNjCmluZGV4IGM0NjdkMmEuLjk3NjdmOTYgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbnBsYi9vcHRpb25hbF90ZXN0LmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9vcHRpb25hbF90ZXN0LmNjCkBAIC04MDMsNyArODAzLDcgQEAKICAgRVhQRUNUX1RSVUUob3B0aW9uYWxfaW50X3NldC5maW5kKDApICE9IG9wdGlvbmFsX2ludF9zZXQuZW5kKCkpOwogICBFWFBFQ1RfVFJVRShvcHRpb25hbF9pbnRfc2V0LmZpbmQob3B0aW9uYWw8aW50PigpKSAhPSBvcHRpb25hbF9pbnRfc2V0LmVuZCgpKTsKIAotICBvcHRpb25hbF9pbnRfc2V0LmVyYXNlKDApOworICBvcHRpb25hbF9pbnRfc2V0LmVyYXNlKG1ha2Vfb3B0aW9uYWwoMCkpOwogCiAgIEVYUEVDVF9GQUxTRShvcHRpb25hbF9pbnRfc2V0LmZpbmQoMCkgIT0gb3B0aW9uYWxfaW50X3NldC5lbmQoKSk7CiAgIEVYUEVDVF9UUlVFKG9wdGlvbmFsX2ludF9zZXQuZmluZChvcHRpb25hbDxpbnQ+KCkpICE9IG9wdGlvbmFsX2ludF9zZXQuZW5kKCkpOwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL3BsYXllcl9jcmVhdGVfdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9wbGF5ZXJfY3JlYXRlX3Rlc3QuY2MKaW5kZXggOTUyM2Q4OS4uOTE3MmQ0NSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL3BsYXllcl9jcmVhdGVfdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvcGxheWVyX2NyZWF0ZV90ZXN0LmNjCkBAIC0xOCwxMiArMTgsMTIgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvd2luZG93LmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCiAKLSNpZiBTQl9IQVMoUExBWUVSKQotCiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKIG5hbWVzcGFjZSBucGxiIHsKK25hbWVzcGFjZSB7CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CisjaWYgU0JfSEFTKFBMQVlFUikKKwogI2lmIFNCX0hBUyhHTEVTMikKIHZvaWQgR2xlc0NvbnRleHRSdW5uZXIoCiAgICAgU2JEZWNvZGVUYXJnZXRHcmFwaGljc0NvbnRleHRQcm92aWRlciogZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlciwKQEAgLTM0LDE2ICszNCw2IEBACiAgIFNCX1VOUkVGRVJFTkNFRF9QQVJBTUVURVIodGFyZ2V0X2Z1bmN0aW9uX2NvbnRleHQpOwogfQogI2VuZGlmICAvLyBTQl9IQVMoR0xFUzIpCi0jZWxpZiBTQl9BUElfVkVSU0lPTiA+PSAzCi1TYkRlY29kZVRhcmdldCBTYkRlY29kZVRhcmdldEFjcXVpcmVTdHViKHZvaWQqIC8qY29udGV4dCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRlY29kZVRhcmdldEZvcm1hdCAvKmZvcm1hdCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyp3aWR0aCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLypoZWlnaHQqLykgewotICByZXR1cm4ga1NiRGVjb2RlVGFyZ2V0SW52YWxpZDsKLX0KLXZvaWQgU2JEZWNvZGVUYXJnZXRSZWxlYXNlU3R1Yih2b2lkKiAvKmNvbnRleHQqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRlY29kZVRhcmdldCAvKmRlY29kZV90YXJnZXQqLykge30KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gMwogCiBURVNUKFNiUGxheWVyVGVzdCwgU3VubnlEYXkpIHsKICAgU2JXaW5kb3dPcHRpb25zIHdpbmRvd19vcHRpb25zOwpAQCAtNzAsNyArNjAsNiBAQAogICBTYk1lZGlhVmlkZW9Db2RlYyBrVmlkZW9Db2RlYyA9IGtTYk1lZGlhVmlkZW9Db2RlY0gyNjQ7CiAgIFNiRHJtU3lzdGVtIGtEcm1TeXN0ZW0gPSBrU2JEcm1TeXN0ZW1JbnZhbGlkOwogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICBTYlBsYXllck91dHB1dE1vZGUgb3V0cHV0X21vZGVzW10gPSB7a1NiUGxheWVyT3V0cHV0TW9kZURlY29kZVRvVGV4dHVyZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTYlBsYXllck91dHB1dE1vZGVQdW5jaE91dH07CiAKQEAgLTc5LDkgKzY4LDcgQEAKICAgICBpZiAoIVNiUGxheWVyT3V0cHV0TW9kZVN1cHBvcnRlZChvdXRwdXRfbW9kZSwga1ZpZGVvQ29kZWMsIGtEcm1TeXN0ZW0pKSB7CiAgICAgICBjb250aW51ZTsKICAgICB9Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgICBTYkRlY29kZVRhcmdldEdyYXBoaWNzQ29udGV4dFByb3ZpZGVyCiAgICAgICAgIGRlY29kZV90YXJnZXRfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcjsKICNpZiBTQl9IQVMoQkxJVFRFUikKQEAgLTkzLDQ0ICs4MCwyNSBAQAogICAgICAgICAmR2xlc0NvbnRleHRSdW5uZXI7CiAgICAgZGVjb2RlX3RhcmdldF9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyLmdsZXNfY29udGV4dF9ydW5uZXJfY29udGV4dCA9IE5VTEw7CiAjZW5kaWYgIC8vIFNCX0hBUyhCTElUVEVSKQotI2VsaWYgU0JfQVBJX1ZFUlNJT04gPj0gMwotICAgIFNiRGVjb2RlVGFyZ2V0UHJvdmlkZXIgZGVjb2RlX3RhcmdldF9wcm92aWRlcjsKLSAgICBkZWNvZGVfdGFyZ2V0X3Byb3ZpZGVyLmFjcXVpcmUgPSAmU2JEZWNvZGVUYXJnZXRBY3F1aXJlU3R1YjsKLSAgICBkZWNvZGVfdGFyZ2V0X3Byb3ZpZGVyLnJlbGVhc2UgPSAmU2JEZWNvZGVUYXJnZXRSZWxlYXNlU3R1YjsKLSAgICBkZWNvZGVfdGFyZ2V0X3Byb3ZpZGVyLmNvbnRleHQgPSBOVUxMOwotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSAzCiAKLSAgICBTYlBsYXllciBwbGF5ZXIgPQotICAgICAgICBTYlBsYXllckNyZWF0ZSh3aW5kb3csIGtTYk1lZGlhVmlkZW9Db2RlY0gyNjQsIGtTYk1lZGlhQXVkaW9Db2RlY0FhYywKLSAgICAgICAgICAgICAgICAgICAgICAgU0JfUExBWUVSX05PX0RVUkFUSU9OLCBrU2JEcm1TeXN0ZW1JbnZhbGlkLAotICAgICAgICAgICAgICAgICAgICAgICAmYXVkaW9faGVhZGVyLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAotICAgICAgICAgICAgICAgICAgICAgICAsCi0gICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAmZGVjb2RlX3RhcmdldF9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyCi0jZWxpZiBTQl9BUElfVkVSU0lPTiA+PSAzCi0gICAgICAgICAgICAgICAgICAgICAgICwKLSAgICAgICAgICAgICAgICAgICAgICAgJmRlY29kZV90YXJnZXRfcHJvdmlkZXIKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICApOyAgLy8gTk9MSU5UCisgICAgU2JQbGF5ZXIgcGxheWVyID0gU2JQbGF5ZXJDcmVhdGUoCisgICAgICAgIHdpbmRvdywga1NiTWVkaWFWaWRlb0NvZGVjSDI2NCwga1NiTWVkaWFBdWRpb0NvZGVjQWFjLAorICAgICAgICBTQl9QTEFZRVJfTk9fRFVSQVRJT04sIGtTYkRybVN5c3RlbUludmFsaWQsICZhdWRpb19oZWFkZXIsIE5VTEwsIE5VTEwsCisgICAgICAgIE5VTEwsIE5VTEwsIG91dHB1dF9tb2RlLCAmZGVjb2RlX3RhcmdldF9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyKTsKICAgICBFWFBFQ1RfVFJVRShTYlBsYXllcklzVmFsaWQocGxheWVyKSk7CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAgICAgaWYgKG91dHB1dF9tb2RlID09IGtTYlBsYXllck91dHB1dE1vZGVEZWNvZGVUb1RleHR1cmUpIHsKICAgICAgIFNiRGVjb2RlVGFyZ2V0IGN1cnJlbnRfZnJhbWUgPSBTYlBsYXllckdldEN1cnJlbnRGcmFtZShwbGF5ZXIpOwogICAgIH0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogCiAgICAgU2JQbGF5ZXJEZXN0cm95KHBsYXllcik7Ci0KLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAgIH0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogCiAgIFNiV2luZG93RGVzdHJveSh3aW5kb3cpOwogfQogCisjZW5kaWYgIC8vIFNCX0hBUyhQTEFZRVIpCisKK30gIC8vIG5hbWVzcGFjZQogfSAgLy8gbmFtZXNwYWNlIG5wbGIKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKLQotI2VuZGlmICAvLyBTQl9IQVMoUExBWUVSKQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL3BsYXllcl9vdXRwdXRfbW9kZV9zdXBwb3J0ZWRfdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9wbGF5ZXJfb3V0cHV0X21vZGVfc3VwcG9ydGVkX3Rlc3QuY2MKaW5kZXggZmZmZmI4NC4uMjlmM2U1YiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL3BsYXllcl9vdXRwdXRfbW9kZV9zdXBwb3J0ZWRfdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvcGxheWVyX291dHB1dF9tb2RlX3N1cHBvcnRlZF90ZXN0LmNjCkBAIC0xNywxMCArMTcsMTEgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvd2luZG93LmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCiAKLSNpZiBTQl9IQVMoUExBWUVSKSAmJiBTQl9BUElfVkVSU0lPTiA+PSA0Ci0KIG5hbWVzcGFjZSBzdGFyYm9hcmQgewogbmFtZXNwYWNlIG5wbGIgeworbmFtZXNwYWNlIHsKKworI2lmIFNCX0hBUyhQTEFZRVIpCiAKIFRFU1QoU2JQbGF5ZXJPdXRwdXRNb2RlU3VwcG9ydGVkVGVzdCwgU3VubnlEYXkpIHsKICAgLy8gV2Ugc2hvdWxkIHN1cHBvcnQgZWl0aGVyIGRlY29kZS10by10ZXh0dXJlIG9yIHB1bmNoLW91dCBtb2RlLgpAQCAtNDEsOCArNDIsOCBAQAogICBFWFBFQ1RfRkFMU0UocmVzdWx0KTsKIH0KIAorI2VuZGlmICAvLyBTQl9IQVMoUExBWUVSKQorCit9ICAvLyBuYW1lc3BhY2UKIH0gIC8vIG5hbWVzcGFjZSBucGxiCiB9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCi0KLSNlbmRpZiAgLy8gU0JfSEFTKFBMQVlFUikgJiYgXAotICAgICAgICAgICBTQl9BUElfVkVSU0lPTiA+PSA0CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL25wbGIvc29ja2V0X2JpbmRfdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9zb2NrZXRfYmluZF90ZXN0LmNjCmluZGV4IDA0YjljNWUuLmY4MTNjMGEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbnBsYi9zb2NrZXRfYmluZF90ZXN0LmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9zb2NrZXRfYmluZF90ZXN0LmNjCkBAIC0xMTQsMTEgKzExNCw3IEBACiAKIFRFU1RfRihTYlNvY2tldEJpbmRUZXN0LCBTdW5ueURheUxvY2FsSW50ZXJmYWNlKSB7CiAgIFNiU29ja2V0QWRkcmVzcyBhZGRyZXNzID0gezB9OwotI2lmIFNCX0FQSV9WRVJTSU9OIDwgNAotICBFWFBFQ1RfVFJVRShTYlNvY2tldEdldExvY2FsSW50ZXJmYWNlQWRkcmVzcygmYWRkcmVzcykpOwotI2Vsc2UKICAgRVhQRUNUX1RSVUUoU2JTb2NrZXRHZXRJbnRlcmZhY2VBZGRyZXNzKE5VTEwsICZhZGRyZXNzLCBOVUxMKSk7Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgNAogICBTYlNvY2tldCBzZXJ2ZXJfc29ja2V0ID0gQ3JlYXRlU2VydmVyVGNwU29ja2V0KGFkZHJlc3MudHlwZSk7CiAgIEFTU0VSVF9UUlVFKFNiU29ja2V0SXNWYWxpZChzZXJ2ZXJfc29ja2V0KSk7CiAKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9zb2NrZXRfZ2V0X2ludGVyZmFjZV9hZGRyZXNzX3Rlc3QuY2MgYi9zcmMvc3RhcmJvYXJkL25wbGIvc29ja2V0X2dldF9pbnRlcmZhY2VfYWRkcmVzc190ZXN0LmNjCmluZGV4IGE5ZDNmNWEuLjk3ZWM4NmUgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbnBsYi9zb2NrZXRfZ2V0X2ludGVyZmFjZV9hZGRyZXNzX3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL3NvY2tldF9nZXRfaW50ZXJmYWNlX2FkZHJlc3NfdGVzdC5jYwpAQCAtMTYsMTcgKzE2LDEyIEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL3NvY2tldC5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgogCi1uYW1lc3BhY2UgewotCi1jb25zdCB1bnNpZ25lZCBjaGFyIGtJbnZhbGlkQnl0ZSA9IDB4RkU7Ci0KLX0gIC8vIG5hbWVzcGFjZQotCiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKIG5hbWVzcGFjZSBucGxiIHsKIG5hbWVzcGFjZSB7CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0Citjb25zdCB1bnNpZ25lZCBjaGFyIGtJbnZhbGlkQnl0ZSA9IDB4RkU7CisKIGNsYXNzIFNiU29ja2V0R2V0SW50ZXJmYWNlQWRkcmVzc1Rlc3QKICAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08U2JTb2NrZXRBZGRyZXNzVHlwZT4gewogIHB1YmxpYzoKQEAgLTE5MCw4ICsxODUsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoa1NiU29ja2V0QWRkcmVzc1R5cGVJcHY0KSk7CiAjZW5kaWYgIC8vIFNCX0hBUyhJUFY2KQogCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKLQogfSAgLy8gbmFtZXNwYWNlCiB9ICAvLyBuYW1lc3BhY2UgbnBsYgogfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL3NvY2tldF9nZXRfbG9jYWxfYWRkcmVzc190ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL3NvY2tldF9nZXRfbG9jYWxfYWRkcmVzc190ZXN0LmNjCmluZGV4IDIwMjE0NDYuLjc4MWVjNWEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbnBsYi9zb2NrZXRfZ2V0X2xvY2FsX2FkZHJlc3NfdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvc29ja2V0X2dldF9sb2NhbF9hZGRyZXNzX3Rlc3QuY2MKQEAgLTgwLDExICs4MCw4IEBACiAKIFRFU1RfRihTYlNvY2tldEdldExvY2FsQWRkcmVzc1Rlc3QsIFN1bm55RGF5Qm91bmRTcGVjaWZpZWQpIHsKICAgU2JTb2NrZXRBZGRyZXNzIGludGVyZmFjZV9hZGRyZXNzID0gezB9OwotI2lmIFNCX0FQSV9WRVJTSU9OIDwgNAotICBFWFBFQ1RfVFJVRShTYlNvY2tldEdldExvY2FsSW50ZXJmYWNlQWRkcmVzcygmaW50ZXJmYWNlX2FkZHJlc3MpKTsKLSNlbHNlCiAgIEVYUEVDVF9UUlVFKFNiU29ja2V0R2V0SW50ZXJmYWNlQWRkcmVzcyhOVUxMLCAmaW50ZXJmYWNlX2FkZHJlc3MsIE5VTEwpKTsKLSNlbmRpZgorCiAgIFNiU29ja2V0IHNlcnZlcl9zb2NrZXQgPSBDcmVhdGVTZXJ2ZXJUY3BTb2NrZXQoaW50ZXJmYWNlX2FkZHJlc3MudHlwZSk7CiAgIEFTU0VSVF9UUlVFKFNiU29ja2V0SXNWYWxpZChzZXJ2ZXJfc29ja2V0KSk7CiAKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9zb2NrZXRfZ2V0X2xvY2FsX2ludGVyZmFjZV9hZGRyZXNzX3Rlc3QuY2MgYi9zcmMvc3RhcmJvYXJkL25wbGIvc29ja2V0X2dldF9sb2NhbF9pbnRlcmZhY2VfYWRkcmVzc190ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjhlMGViLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvbnBsYi9zb2NrZXRfZ2V0X2xvY2FsX2ludGVyZmFjZV9hZGRyZXNzX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL25wbGIvc29ja2V0X2hlbHBlcnMuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc29ja2V0LmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIG5wbGIgewotbmFtZXNwYWNlIHsKLQotI2lmIFNCX0FQSV9WRVJTSU9OIDwgNAotCi1URVNUKFNiU29ja2V0R2V0TG9jYWxJbnRlcmZhY2VBZGRyZXNzVGVzdCwgU3VubnlEYXkpIHsKLSAgU2JTb2NrZXRBZGRyZXNzIGFkZHJlc3M7Ci0gIC8vIEluaXRpYWxpemUgdG8gc29tZXRoaW5nIGludmFsaWQuCi0gIFNiTWVtb3J5U2V0KCZhZGRyZXNzLCAweEZFLCBzaXplb2YoYWRkcmVzcykpOwotICBFWFBFQ1RfVFJVRShTYlNvY2tldEdldExvY2FsSW50ZXJmYWNlQWRkcmVzcygmYWRkcmVzcykpOwotICBFWFBFQ1RfRVEoMCwgYWRkcmVzcy5wb3J0KTsKLSAgRVhQRUNUX0ZBTFNFKElzVW5zcGVjaWZpZWQoJmFkZHJlc3MpKTsKLSAgRVhQRUNUX0ZBTFNFKElzTG9jYWxob3N0KCZhZGRyZXNzKSk7Ci19Ci0KLVRFU1QoU2JTb2NrZXRHZXRMb2NhbEludGVyZmFjZUFkZHJlc3NUZXN0LCBSYWlueURheU51bGwpIHsKLSAgRVhQRUNUX0ZBTFNFKFNiU29ja2V0R2V0TG9jYWxJbnRlcmZhY2VBZGRyZXNzKE5VTEwpKTsKLX0KLQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IDQKLQotfSAgLy8gbmFtZXNwYWNlCi19ICAvLyBuYW1lc3BhY2UgbnBsYgotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL3NwZWVjaF9zeW50aGVzaXNfYmFzaWNfdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9zcGVlY2hfc3ludGhlc2lzX2Jhc2ljX3Rlc3QuY2MKaW5kZXggN2RkNjM2Zi4uZjlkOWIyMyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL3NwZWVjaF9zeW50aGVzaXNfYmFzaWNfdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvc3BlZWNoX3N5bnRoZXNpc19iYXNpY190ZXN0LmNjCkBAIC0xNSwxMSArMTUsMTkgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvc3BlZWNoX3N5bnRoZXNpcy5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgogCi0jaWYgU0JfSEFTKFNQRUVDSF9TWU5USEVTSVMpICYmIFNCX0FQSV9WRVJTSU9OID49IDMKK25hbWVzcGFjZSBzdGFyYm9hcmQgeworbmFtZXNwYWNlIG5wbGIgeworbmFtZXNwYWNlIHsKKworI2lmIFNCX0hBUyhTUEVFQ0hfU1lOVEhFU0lTKQogCiBURVNUKFNiU3BlZWNoU3ludGhlc2lzQmFzaWNUZXN0LCBCYXNpYykgewogICBTYlNwZWVjaFN5bnRoZXNpc1NwZWFrKCJIZWxsbyIpOwogICBTYlNwZWVjaFN5bnRoZXNpc0NhbmNlbCgpOwogfQogCi0jZW5kaWYgIC8vIFNCX0hBUyhTUEVFQ0hfU1lOVEhFU0lTKSAmJiBTQl9BUElfVkVSU0lPTiA+PSAzCisjZW5kaWYgIC8vIFNCX0hBUyhTUEVFQ0hfU1lOVEhFU0lTKQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBucGxiCit9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL25wbGIvc3lzdGVtX2dldF9wYXRoX3Rlc3QuY2MgYi9zcmMvc3RhcmJvYXJkL25wbGIvc3lzdGVtX2dldF9wYXRoX3Rlc3QuY2MKaW5kZXggOWQyYmI1OS4uMjQzYTQ5NiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL3N5c3RlbV9nZXRfcGF0aF90ZXN0LmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9zeXN0ZW1fZ2V0X3BhdGhfdGVzdC5jYwpAQCAtODAsMTAgKzgwLDggQEAKICAgQmFzaWNUZXN0KGtTYlN5c3RlbVBhdGhUZW1wRGlyZWN0b3J5LCBmYWxzZSwgZmFsc2UsIF9fTElORV9fKTsKICAgQmFzaWNUZXN0KGtTYlN5c3RlbVBhdGhUZXN0T3V0cHV0RGlyZWN0b3J5LCBmYWxzZSwgZmFsc2UsIF9fTElORV9fKTsKICAgQmFzaWNUZXN0KGtTYlN5c3RlbVBhdGhDYWNoZURpcmVjdG9yeSwgZmFsc2UsIGZhbHNlLCBfX0xJTkVfXyk7Ci0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICBCYXNpY1Rlc3Qoa1NiU3lzdGVtUGF0aEZvbnREaXJlY3RvcnksIGZhbHNlLCBmYWxzZSwgX19MSU5FX18pOwogICBCYXNpY1Rlc3Qoa1NiU3lzdGVtUGF0aEZvbnRDb25maWd1cmF0aW9uRGlyZWN0b3J5LCBmYWxzZSwgZmFsc2UsIF9fTElORV9fKTsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogfQogCiBURVNUKFNiU3lzdGVtR2V0UGF0aFRlc3QsIENhbkNyZWF0ZUFuZFJlbW92ZURpcmVjdG9yeUluQ2FjaGUpIHsKQEAgLTExMyw2ICsxMTEsNyBAQAogICAgIEVYUEVDVF9GQUxTRShTYkZpbGVFeGlzdHMocGF0aCkpOwogICB9CiB9CisKIFRFU1QoU2JTeXN0ZW1HZXRQYXRoVGVzdCwgQ2FuV3JpdGVBbmRSZWFkQ2FjaGUpIHsKICAgY2hhciBwYXRoW2tQYXRoU2l6ZV07CiAgIFNiTWVtb3J5U2V0KHBhdGgsIDB4Q0QsIGtQYXRoU2l6ZSk7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL25wbGIvc3lzdGVtX2dldF9wcm9wZXJ0eV90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL3N5c3RlbV9nZXRfcHJvcGVydHlfdGVzdC5jYwppbmRleCBjZWJmMTQ4Li5mODY2NTY0IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL25wbGIvc3lzdGVtX2dldF9wcm9wZXJ0eV90ZXN0LmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9zeXN0ZW1fZ2V0X3Byb3BlcnR5X3Rlc3QuY2MKQEAgLTcwLDkgKzcwLDcgQEAKICAgQmFzaWNUZXN0KGtTYlN5c3RlbVByb3BlcnR5Q2hpcHNldE1vZGVsTnVtYmVyLCBmYWxzZSwgdHJ1ZSwgX19MSU5FX18pOwogICBCYXNpY1Rlc3Qoa1NiU3lzdGVtUHJvcGVydHlGaXJtd2FyZVZlcnNpb24sIGZhbHNlLCB0cnVlLCBfX0xJTkVfXyk7CiAgIEJhc2ljVGVzdChrU2JTeXN0ZW1Qcm9wZXJ0eU5ldHdvcmtPcGVyYXRvck5hbWUsIGZhbHNlLCB0cnVlLCBfX0xJTkVfXyk7Ci0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gMgogICBCYXNpY1Rlc3Qoa1NiU3lzdGVtUHJvcGVydHlTcGVlY2hBcGlLZXksIGZhbHNlLCB0cnVlLCBfX0xJTkVfXyk7Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDIKIAogICBpZiAoSXNDRURldmljZShTYlN5c3RlbUdldERldmljZVR5cGUoKSkpIHsKICAgICBCYXNpY1Rlc3Qoa1NiU3lzdGVtUHJvcGVydHlCcmFuZE5hbWUsIHRydWUsIHRydWUsIF9fTElORV9fKTsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvcGxheWVyLmggYi9zcmMvc3RhcmJvYXJkL3BsYXllci5oCmluZGV4IDAyMjZkOGIuLjIwYjk1YTUgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvcGxheWVyLmgKKysrIGIvc3JjL3N0YXJib2FyZC9wbGF5ZXIuaApAQCAtNzksNyArNzksNiBAQAogICBrU2JQbGF5ZXJTdGF0ZUVycm9yLAogfSBTYlBsYXllclN0YXRlOwogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogdHlwZWRlZiBlbnVtIFNiUGxheWVyT3V0cHV0TW9kZSB7CiAgIC8vIFJlcXVlc3RzIGZvciBTYlBsYXllciB0byBwcm9kdWNlIGFuIE9wZW5HTCB0ZXh0dXJlIHRoYXQgdGhlIGNsaWVudCBtdXN0CiAgIC8vIGRyYXcgZXZlcnkgZnJhbWUgd2l0aCBpdHMgZ3JhcGhpY3MgcmVuZGVyaW5nLiBJdCBtYXkgYmUgdGhhdCB3ZSBnZXQgYQpAQCAtMTAwLDcgKzk5LDYgQEAKICAgLy8gQW4gaW52YWxpZCBvdXRwdXQgbW9kZS4KICAga1NiUGxheWVyT3V0cHV0TW9kZUludmFsaWQsCiB9IFNiUGxheWVyT3V0cHV0TW9kZTsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogCiAvLyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBtZWRpYSBwbGF5YmFjayBzdGF0ZS4KIHR5cGVkZWYgc3RydWN0IFNiUGxheWVySW5mbyB7CkBAIC0xMzgsNyArMTM2LDYgQEAKICAgLy8gdGhlIHBsYXllci4KICAgaW50IGNvcnJ1cHRlZF92aWRlb19mcmFtZXM7CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAgIC8vIFRoZSByYXRlIG9mIHBsYXliYWNrLiAgVGhlIHZpZGVvIGlzIHBsYXllZCBiYWNrIGluIGEgc3BlZWQgdGhhdCBpcwogICAvLyBwcm9wb3J0aW9uYWwgdG8gdGhpcy4gIEJ5IGRlZmF1bHQgaXQgaXMgMS4wIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZQogICAvLyBwbGF5YmFjayBpcyBhdCBub3JtYWwgc3BlZWQuICBXaGVuIGl0IGlzIGdyZWF0ZXIgdGhhbiBvbmUsIHRoZSB2aWRlbyBpcwpAQCAtMTQ2LDcgKzE0Myw2IEBACiAgIC8vIGlzIHBsYXllZCBpbiBhIHNsb3dlciB0aGFuIG5vcm1hbCBzcGVlZC4gIE5lZ2F0aXZlIHNwZWVkcyBhcmUgbm90CiAgIC8vIHN1cHBvcnRlZC4KICAgZG91YmxlIHBsYXliYWNrX3JhdGU7Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKIH0gU2JQbGF5ZXJJbmZvOwogCiAvLyBBbiBvcGFxdWUgaGFuZGxlIHRvIGFuIGltcGxlbWVudGF0aW9uLXByaXZhdGUgc3RydWN0dXJlIHJlcHJlc2VudGluZyBhCkBAIC0xODYsMTMgKzE4Miw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc2FtcGxlX2J1ZmZlcik7CiAKLSNpZiBTQl9JUyhQTEFZRVJfQ09NUE9TSVRFRCkKLS8vIEEgaGFuZGxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29tcG9zZSBhIHBsYXllcidzIHZpZGVvIG91dHB1dCB3aXRoIG90aGVyCi0vLyBjb21wb3NpdGlvbiBsYXllcnMuCi0vLyBUT0RPOiBEZWZpbmUgYSBTYkNvbXBvc2l0b3IgaW50ZXJmYWNlIHdpdGggYSBjb21wb3NpdGlvbiBoYW5kbGUgdHlwZS4KLXR5cGVkZWYgdWludDMyX3QgU2JQbGF5ZXJDb21wb3NpdGlvbkhhbmRsZTsKLSNlbmRpZgotCiAvLyAtLS0gQ29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gVGhlIHZhbHVlIHRvIHBhc3MgaW50byBTYlBsYXllckNyZWF0ZSdzIHxkdXJhdGlvbl9wdHJ8IGFyZ3VtZW50IGZvciBjYXNlcwpAQCAtMjg5LDM1ICsyNzgsMjYgQEAKIC8vICAgcHJvdmlkZXIgbWF5IG5vdCBhbHdheXMgYmUgbmVlZGVkIGJ5IHRoZSBwbGF5ZXIsIGJ1dCBpZiBpdCBpcyBuZWVkZWQsIGFuZAogLy8gICB0aGUgcHJvdmlkZXIgaXMgbm90IGdpdmVuLCB0aGUgcGxheWVyIHdpbGwgZmFpbCBieSByZXR1cm5pbmcKIC8vICAga1NiUGxheWVySW52YWxpZC4KLVNCX0VYUE9SVCBTYlBsYXllciBTYlBsYXllckNyZWF0ZSgKLSAgICBTYldpbmRvdyB3aW5kb3csCi0gICAgU2JNZWRpYVZpZGVvQ29kZWMgdmlkZW9fY29kZWMsCi0gICAgU2JNZWRpYUF1ZGlvQ29kZWMgYXVkaW9fY29kZWMsCi0gICAgU2JNZWRpYVRpbWUgZHVyYXRpb25fcHRzLAotICAgIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0sCi0gICAgY29uc3QgU2JNZWRpYUF1ZGlvSGVhZGVyKiBhdWRpb19oZWFkZXIsCi0gICAgU2JQbGF5ZXJEZWFsbG9jYXRlU2FtcGxlRnVuYyBzYW1wbGVfZGVhbGxvY2F0ZV9mdW5jLAotICAgIFNiUGxheWVyRGVjb2RlclN0YXR1c0Z1bmMgZGVjb2Rlcl9zdGF0dXNfZnVuYywKLSAgICBTYlBsYXllclN0YXR1c0Z1bmMgcGxheWVyX3N0YXR1c19mdW5jLAotICAgIHZvaWQqIGNvbnRleHQKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0Ci0gICAgLAotICAgIFNiUGxheWVyT3V0cHV0TW9kZSBvdXRwdXRfbW9kZSwKLSAgICBTYkRlY29kZVRhcmdldEdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKiBjb250ZXh0X3Byb3ZpZGVyCi0jZWxpZiBTQl9BUElfVkVSU0lPTiA+PSAzCi0gICAgLAotICAgIFNiRGVjb2RlVGFyZ2V0UHJvdmlkZXIqIHByb3ZpZGVyCi0jZW5kaWYKLSAgICApOyAgLy8gTk9MSU5UCitTQl9FWFBPUlQgU2JQbGF5ZXIKK1NiUGxheWVyQ3JlYXRlKFNiV2luZG93IHdpbmRvdywKKyAgICAgICAgICAgICAgIFNiTWVkaWFWaWRlb0NvZGVjIHZpZGVvX2NvZGVjLAorICAgICAgICAgICAgICAgU2JNZWRpYUF1ZGlvQ29kZWMgYXVkaW9fY29kZWMsCisgICAgICAgICAgICAgICBTYk1lZGlhVGltZSBkdXJhdGlvbl9wdHMsCisgICAgICAgICAgICAgICBTYkRybVN5c3RlbSBkcm1fc3lzdGVtLAorICAgICAgICAgICAgICAgY29uc3QgU2JNZWRpYUF1ZGlvSGVhZGVyKiBhdWRpb19oZWFkZXIsCisgICAgICAgICAgICAgICBTYlBsYXllckRlYWxsb2NhdGVTYW1wbGVGdW5jIHNhbXBsZV9kZWFsbG9jYXRlX2Z1bmMsCisgICAgICAgICAgICAgICBTYlBsYXllckRlY29kZXJTdGF0dXNGdW5jIGRlY29kZXJfc3RhdHVzX2Z1bmMsCisgICAgICAgICAgICAgICBTYlBsYXllclN0YXR1c0Z1bmMgcGxheWVyX3N0YXR1c19mdW5jLAorICAgICAgICAgICAgICAgdm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgIFNiUGxheWVyT3V0cHV0TW9kZSBvdXRwdXRfbW9kZSwKKyAgICAgICAgICAgICAgIFNiRGVjb2RlVGFyZ2V0R3JhcGhpY3NDb250ZXh0UHJvdmlkZXIqIGNvbnRleHRfcHJvdmlkZXIpOwogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBwbGF5ZXIgb3V0cHV0IG1vZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBwbGF0Zm9ybS4KIC8vIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlLCBpdCBpcyBva2F5IHRvIGNhbGwgU2JQbGF5ZXJDcmVhdGUoKSB3aXRoCiAvLyB0aGUgZ2l2ZW4gfG91dHB1dF9tb2RlfC4KIFNCX0VYUE9SVCBib29sIFNiUGxheWVyT3V0cHV0TW9kZVN1cHBvcnRlZChTYlBsYXllck91dHB1dE1vZGUgb3V0cHV0X21vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JNZWRpYVZpZGVvQ29kZWMgY29kZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSk7Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgNAogCiAvLyBEZXN0cm95cyB8cGxheWVyfCwgZnJlZWluZyBhbGwgYXNzb2NpYXRlZCByZXNvdXJjZXMuIEVhY2ggY2FsbGJhY2sgbXVzdAogLy8gcmVjZWl2ZSBvbmUgbW9yZSBjYWxsYmFjayB0byBzYXkgdGhhdCB0aGUgcGxheWVyIHdhcyBkZXN0cm95ZWQuIENhbGxiYWNrcwpAQCAtMzYwLDggKzM0MCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JNZWRpYVRpbWUgc2Vla190b19wdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpY2tldCk7CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0Ci0KIC8vIFdyaXRlcyBhIHNpbmdsZSBzYW1wbGUgb2YgdGhlIGdpdmVuIG1lZGlhIHR5cGUgdG8gfHBsYXllcnwncyBpbnB1dCBzdHJlYW0uCiAvLyBJdHMgZGF0YSBtYXkgYmUgcGFzc2VkIGluIHZpYSBtb3JlIHRoYW4gb25lIGJ1ZmZlcnMuICBUaGUgbGlmZXRpbWUgb2YKIC8vIHxzYW1wbGVfYnVmZmVyc3wsIHxzYW1wbGVfYnVmZmVyX3NpemVzfCwgfHZpZGVvX3NhbXBsZV9pbmZvfCwgYW5kCkBAIC00MTEsNDEgKzM4OSw2IEBACiAgICAgY29uc3QgU2JNZWRpYVZpZGVvU2FtcGxlSW5mbyogdmlkZW9fc2FtcGxlX2luZm8sCiAgICAgY29uc3QgU2JEcm1TYW1wbGVJbmZvKiBzYW1wbGVfZHJtX2luZm8pOwogCi0jZWxzZSAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAotCi0vLyBXcml0ZXMgYSBzYW1wbGUgb2YgdGhlIGdpdmVuIG1lZGlhIHR5cGUgdG8gfHBsYXllcnwncyBpbnB1dCBzdHJlYW0uIFRoZQotLy8gbGlmZXRpbWUgb2YgfHZpZGVvX3NhbXBsZV9pbmZvfCBhbmQgfHNhbXBsZV9kcm1faW5mb3wgKGFzIHdlbGwgYXMgbWVtYmVyCi0vLyB8c3Vic2FtcGxlX21hcHBpbmd8IGNvbnRhaW5lZCBpbnNpZGUgaXQpIGFyZSBub3QgZ3VhcmFudGVlZCBwYXN0IHRoZSBjYWxsCi0vLyB0byBTYlBsYXllcldyaXRlU2FtcGxlLiBUaGF0IG1lYW5zIHRoYXQgYmVmb3JlIHJldHVybmluZywgdGhlIGltcGxlbWVudGF0aW9uCi0vLyBtdXN0IHN5bmNocm9ub3VzbHkgY29weSBhbnkgaW5mb3JtYXRpb24gaXQgd2FudHMgdG8gcmV0YWluIGZyb20gdGhvc2UKLS8vIHN0cnVjdHVyZXMuCi0vLwotLy8gfHBsYXllcnw6IFRoZSBwbGF5ZXIgdG8gd2hpY2ggdGhlIHNhbXBsZSBpcyB3cml0dGVuLgotLy8gfHNhbXBsZV90eXBlfDogVGhlIHR5cGUgb2Ygc2FtcGxlIGJlaW5nIHdyaXR0ZW4uIFNlZSB0aGUgfFNiTWVkaWFUeXBlfAotLy8gICBlbnVtIGluIG1lZGlhLmguCi0vLyB8c2FtcGxlX2J1ZmZlcnw6IEEgcG9pbnRlciB0byBhIGJ1ZmZlciB3aXRoIHRoZSBkYXRhIGZvciB0aGlzIHNhbXBsZS4gVGhlCi0vLyAgIGJ1ZmZlciBpcyBleHBlY3RlZCB0byBiZSBhIHBvcnRpb24gb2YgYSBieXRlc3RyZWFtIG9mIHRoZSBjb2RlYyB0eXBlIHRoYXQKLS8vICAgdGhlIHBsYXllciB3YXMgY3JlYXRlZCB3aXRoLiBUaGUgYnVmZmVyIHNob3VsZCBjb250YWluIGEgc2VxdWVuY2Ugb2Ygd2hvbGUKLS8vICAgTkFMIFVuaXRzIGZvciB2aWRlbywgb3IgYSBjb21wbGV0ZSBhdWRpbyBmcmFtZS4KLS8vIHxzYW1wbGVfYnVmZmVyX3NpemV8OiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBnaXZlbiBzYW1wbGUuCi0vLyB8c2FtcGxlX3B0c3w6IFRoZSB0aW1lc3RhbXAgb2YgdGhlIHNhbXBsZSBpbiA5MEtIeiB0aWNrcyAoUFRTKS4gTm90ZSB0aGF0Ci0vLyAgIHNhbXBsZXMgTUFZIGJlIHdyaXR0ZW4gInNsaWdodGx5IiBvdXQgb2Ygb3JkZXIuCi0vLyB8dmlkZW9fc2FtcGxlX2luZm98OiBJbmZvcm1hdGlvbiBhYm91dCBhIHZpZGVvIHNhbXBsZS4gVGhpcyB2YWx1ZSBpcwotLy8gICByZXF1aXJlZCBpZiB8c2FtcGxlX3R5cGV8IGlzIHxrU2JNZWRpYVR5cGVWaWRlb3wuIE90aGVyd2lzZSwgaXQgbXVzdCBiZQotLy8gICB8TlVMTHwuCi0vLyB8c2FtcGxlX2RybV9pbmZvfDogVGhlIERSTSBzeXN0ZW0gZm9yIHRoZSBtZWRpYSBzYW1wbGUuIFRoaXMgdmFsdWUgaXMKLS8vICAgcmVxdWlyZWQgZm9yIGVuY3J5cHRlZCBzYW1wbGVzLiBPdGhlcndpc2UsIGl0IG11c3QgYmUgfE5VTEx8LgotU0JfRVhQT1JUIHZvaWQgU2JQbGF5ZXJXcml0ZVNhbXBsZSgKLSAgICBTYlBsYXllciBwbGF5ZXIsCi0gICAgU2JNZWRpYVR5cGUgc2FtcGxlX3R5cGUsCi0gICAgY29uc3Qgdm9pZCogc2FtcGxlX2J1ZmZlciwKLSAgICBpbnQgc2FtcGxlX2J1ZmZlcl9zaXplLAotICAgIFNiTWVkaWFUaW1lIHNhbXBsZV9wdHMsCi0gICAgY29uc3QgU2JNZWRpYVZpZGVvU2FtcGxlSW5mbyogdmlkZW9fc2FtcGxlX2luZm8sCi0gICAgY29uc3QgU2JEcm1TYW1wbGVJbmZvKiBzYW1wbGVfZHJtX2luZm8pOwotCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKLQogLy8gV3JpdGVzIGEgbWFya2VyIHRvIHxwbGF5ZXJ8J3MgaW5wdXQgc3RyZWFtIG9mIHxzdHJlYW1fdHlwZXwgaW5kaWNhdGluZyB0aGF0CiAvLyB0aGVyZSBhcmUgbm8gbW9yZSBzYW1wbGVzIGZvciB0aGF0IG1lZGlhIHR5cGUgZm9yIHRoZSByZW1haW5kZXIgb2YgdGhpcwogLy8gbWVkaWEgc3RyZWFtLiBUaGlzIG1hcmtlciBpcyBpbnZhbGlkYXRlZCwgYWxvbmcgd2l0aCB0aGUgcmVzdCBvZiB0aGUgc3RyZWFtJ3MKQEAgLTQ1Niw3ICszOTksNiBAQAogU0JfRVhQT1JUIHZvaWQgU2JQbGF5ZXJXcml0ZUVuZE9mU3RyZWFtKFNiUGxheWVyIHBsYXllciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYk1lZGlhVHlwZSBzdHJlYW1fdHlwZSk7CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0IHx8IFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKIC8vIFNldHMgdGhlIHBsYXllciBib3VuZHMgdG8gdGhlIGdpdmVuIGdyYXBoaWNzIHBsYW5lIGNvb3JkaW5hdGVzLiBUaGUgY2hhbmdlcwogLy8gZG8gbm90IHRha2UgZWZmZWN0IHVudGlsIHRoZSBuZXh0IGdyYXBoaWNzIGZyYW1lIGJ1ZmZlciBzd2FwLiBUaGUgZGVmYXVsdAogLy8gYm91bmRzIGZvciBhIHBsYXllciBpcyB0aGUgZnVsbCBzY3JlZW4uICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgcmVsZXZhbnQgd2hlbgpAQCAtNDc4LDIzICs0MjAsMTEgQEAKIC8vIHx3aWR0aHw6IFRoZSB3aWR0aCBvZiB0aGUgcGxheWVyLCBpbiBwaXhlbHMuCiAvLyB8aGVpZ2h0fDogVGhlIGhlaWdodCBvZiB0aGUgcGxheWVyLCBpbiBwaXhlbHMuCiBTQl9FWFBPUlQgdm9pZCBTYlBsYXllclNldEJvdW5kcyhTYlBsYXllciBwbGF5ZXIsCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHpfaW5kZXgsCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KTsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNCB8fCBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCi0KLSNpZiBTQl9BUElfVkVSU0lPTiA8IDQKLQotLy8gUGF1c2VzIG9yIHVucGF1c2VzIHRoZSB8cGxheWVyfC4gSWYgdGhlIHxwbGF5ZXJ8J3Mgc3RhdGUgaXMKLS8vIHxrUGxheWVyU3RhdGVQcmVyb2xsaW5nfCwgdGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBpbml0aWFsIHBhdXNlIHN0YXRlIGZvcgotLy8gdGhlIGN1cnJlbnQgc2VlayB0YXJnZXQuCi1TQl9FWFBPUlQgdm9pZCBTYlBsYXllclNldFBhdXNlKFNiUGxheWVyIHBsYXllciwgYm9vbCBwYXVzZSk7Ci0KLSNlbHNlICAvLyBTQl9BUElfVkVSU0lPTiA8IDQKIAogLy8gU2V0IHRoZSBwbGF5YmFjayByYXRlIG9mIHRoZSB8cGxheWVyfC4gIHxyYXRlfCBpcyBkZWZhdWx0IHRvIDEuMCB3aGljaAogLy8gaW5kaWNhdGVzIHRoZSBwbGF5YmFjayBpcyBhdCBpdHMgb3JpZ2luYWwgc3BlZWQuICBBIHxyYXRlfCBncmVhdGVyIHRoYW4gb25lCkBAIC01MDgsOCArNDM4LDYgQEAKIC8vIHxwbGF5YmFja19yYXRlfCBpcyBuZWdhdGl2ZSBvciBpZiBpdCBpcyB0b28gaGlnaCB0byBzdXBwb3J0LgogU0JfRVhQT1JUIGJvb2wgU2JQbGF5ZXJTZXRQbGF5YmFja1JhdGUoU2JQbGF5ZXIgcGxheWVyLCBkb3VibGUgcGxheWJhY2tfcmF0ZSk7CiAKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCA0Ci0KIC8vIFNldHMgdGhlIHBsYXllcidzIHZvbHVtZS4KIC8vCiAvLyB8cGxheWVyfDogVGhlIHBsYXllciBpbiB3aGljaCB0aGUgdm9sdW1lIGlzIGJlaW5nIGFkanVzdGVkLgpAQCAtNTI2LDI5ICs0NTQsNiBAQAogLy8gfG91dF9wbGF5ZXJfaW5mb3w6IFRoZSBpbmZvcm1hdGlvbiByZXRyaWV2ZWQgZm9yIHRoZSBwbGF5ZXIuCiBTQl9FWFBPUlQgdm9pZCBTYlBsYXllckdldEluZm8oU2JQbGF5ZXIgcGxheWVyLCBTYlBsYXllckluZm8qIG91dF9wbGF5ZXJfaW5mbyk7CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA8IDQKLSNpZiBTQl9JUyhQTEFZRVJfQ09NUE9TSVRFRCkKLS8vIEdldHMgYSBoYW5kbGUgdGhhdCByZXByZXNlbnRzIHRoZSBwbGF5ZXIncyB2aWRlbyBvdXRwdXQsIGZvciB0aGUgcHVycG9zZSBvZgotLy8gY29tcG9zaW5nIHdpdGggfFNiQ29tcG9zaXRvcnwsIHdoaWNoIGlzIGN1cnJlbnRseSB1bmRlZmluZWQuCi0vLwotLy8gfHBsYXllcnw6IFRoZSBwbGF5ZXIgZm9yIHdoaWNoIHRoZSB2aWRlbyBvdXRwdXQgaGFuZGxlIGlzIHJldHJpZXZlZC4KLVNCX0VYUE9SVCBTYlBsYXllckNvbXBvc2l0aW9uSGFuZGxlCi1TYlBsYXllckdldENvbXBvc2l0aW9uSGFuZGxlKFNiUGxheWVyIHBsYXllcik7Ci0jZW5kaWYgIC8vIFNCX0lTKFBMQVlFUl9DT01QT1NJVEVEKQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IDQKLQotI2lmIFNCX0FQSV9WRVJTSU9OIDwgNAotI2lmIFNCX0lTKFBMQVlFUl9QUk9EVUNJTkdfVEVYVFVSRSkKLS8vIEdldHMgYW4gT3BlbkdMIHRleHR1cmUgSUQgdGhhdCBwb2ludHMgdG8gdGhlIHBsYXllcidzIHZpZGVvIG91dHB1dCBmcmFtZSBhdAotLy8gdGhlIHRpbWUgaXQgd2FzIGNhbGxlZC4gVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIG9uY2UsIGFuZCB0aGUgdGV4dHVyZSBJRAotLy8gd2lsbCBiZSBhcHByb3ByaWF0ZWx5IHJlbWFwcGVkIHRvIHRoZSBjdXJyZW50IHZpZGVvIGZyYW1lIHdoZW4gaXQgaXMgZHJhd24uCi0vLwotLy8gfHBsYXllcnw6IFRoZSBwbGF5ZXIgZm9yIHdoaWNoIHRoZSB0ZXh0dXJlIElEIGlzIHJldHJpZXZlZC4KLVNCX0VYUE9SVCB1aW50MzJfdCBTYlBsYXllckdldFRleHR1cmVJZChTYlBsYXllciBwbGF5ZXIpOwotI2VuZGlmICAvLyBTQl9JUyhQTEFZRVJfUFJPRFVDSU5HX1RFWFRVUkUpCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgNAotCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogLy8gR2l2ZW4gYSBwbGF5ZXIgY3JlYXRlZCB3aXRoIHRoZSBrU2JQbGF5ZXJPdXRwdXRNb2RlRGVjb2RlVG9UZXh0dXJlCiAvLyBvdXRwdXQgbW9kZSwgaXQgd2lsbCByZXR1cm4gYSBTYkRlY29kZVRhcmdldCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgZnJhbWUKIC8vIHRvIGJlIHJhc3Rlcml6ZWQuICBPbiBHTEVTIHN5c3RlbXMsIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb24gYQpAQCAtNTU3LDcgKzQ2Miw2IEBACiAvLyB8cGxheWVyfCBvYmplY3QgdGhhdCB3YXMgY3JlYXRlZCB3aXRoIGFuIG91dHB1dCBtb2RlIG90aGVyIHRoYW4KIC8vIGtTYlBsYXllck91dHB1dE1vZGVEZWNvZGVUb1RleHR1cmUsIGtTYkRlY29kZVRhcmdldEludmFsaWQgaXMgcmV0dXJuZWQuCiBTQl9FWFBPUlQgU2JEZWNvZGVUYXJnZXQgU2JQbGF5ZXJHZXRDdXJyZW50RnJhbWUoU2JQbGF5ZXIgcGxheWVyKTsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL2NvbmZpZ3VyYXRpb25fcHVibGljLmggYi9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCmluZGV4IDc2ZWEzMDguLjg0YmU4MmQgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKKysrIGIvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaApAQCAtMjYzLDY3ICsyNjMsNiBAQAogLy8gc3VwcG9ydGVkIGNvbXBvc2l0aW9uIG1ldGhvZHMgYmVsb3cuCiAjZGVmaW5lIFNCX0hBU19QTEFZRVIgMQogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPCA0Ci0vLyBTcGVjaWZpZXMgd2hldGhlciB0aGlzIHBsYXRmb3JtJ3MgcGxheWVyIHdpbGwgcHJvZHVjZSBhbiBPcGVuR0wgdGV4dHVyZSB0aGF0Ci0vLyB0aGUgY2xpZW50IG11c3QgZHJhdyBldmVyeSBmcmFtZSB3aXRoIGl0cyBncmFwaGljcyByZW5kZXJpbmcuIEl0IG1heSBiZSB0aGF0Ci0vLyB3ZSBnZXQgYSB0ZXh0dXJlIGhhbmRsZSwgYnV0IGNhbm5vdCBwZXJmb3JtIG9wZXJhdGlvbnMgbGlrZSBHbFJlYWRQaXhlbHMgb24KLS8vIGl0IGlmIGl0IGlzIERSTS1wcm90ZWN0ZWQuCi0jZGVmaW5lIFNCX0lTX1BMQVlFUl9QUk9EVUNJTkdfVEVYVFVSRSAwCi0KLS8vIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgcGxhdGZvcm0ncyBwbGF5ZXIgaXMgY29tcG9zaXRlZCB3aXRoIGEgZm9ybWFsCi0vLyBjb21wb3NpdG9yLCB3aGVyZSB0aGUgY2xpZW50IG11c3Qgc3BlY2lmeSBob3cgdmlkZW8gaXMgdG8gYmUgY29tcG9zaXRlZCBpbnRvCi0vLyB0aGUgZ3JhcGhpY2FscyBzY2VuZS4KLSNkZWZpbmUgU0JfSVNfUExBWUVSX0NPTVBPU0lURUQgMAotCi0vLyBTcGVjaWZpZXMgd2hldGhlciB0aGlzIHBsYXRmb3JtJ3MgcGxheWVyIHVzZXMgYSAicHVuY2gtb3V0IiBtb2RlbCwgd2hlcmUKLS8vIHZpZGVvIGlzIHJlbmRlcmVkIHRvIHRoZSBmYXIgYmFja2dyb3VuZCwgYW5kIHRoZSBncmFwaGljcyBwbGFuZSBpcwotLy8gYXV0b21hdGljYWxseSBjb21wb3NpdGVkIG9uIHRvcCBvZiB0aGUgdmlkZW8gYnkgdGhlIHBsYXRmb3JtLiBUaGUgY2xpZW50IG11c3QKLS8vIHB1bmNoIGFuIGFscGhhIGhvbGUgb3V0IG9mIHRoZSBncmFwaGljcyBwbGFuZSBmb3IgdmlkZW8gdG8gc2hvdyB0aHJvdWdoLiAgSW4KLS8vIHRoaXMgY2FzZSwgY2hhbmdpbmcgdGhlIHZpZGVvIGJvdW5kcyBtdXN0IGJlIHRpZ2h0bHkgc3luY2hyb25pemVkIGJldHdlZW4gdGhlCi0vLyBwbGF5ZXIgYW5kIHRoZSBncmFwaGljcyBwbGFuZS4KLSNkZWZpbmUgU0JfSVNfUExBWUVSX1BVTkNIRURfT1VUIDEKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCA0Ci0KLSNpZiBTQl9BUElfVkVSU0lPTiA8IDQKLQotLy8gU3BlY2lmaWVzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkgdXNlZCBieSBhdWRpbyBidWZmZXJzIG9mIG1lZGlhIHNvdXJjZQotLy8gYmVmb3JlIHRyaWdnZXJpbmcgYSBnYXJiYWdlIGNvbGxlY3Rpb24uICBBIGxhcmdlIHZhbHVlIHdpbGwgY2F1c2UgbW9yZSBtZW1vcnkKLS8vIGJlaW5nIHVzZWQgYnkgYXVkaW8gYnVmZmVycyBidXQgd2lsbCBhbHNvIG1ha2UgSmF2YVNjcmlwdCBhcHAgbGVzcyBsaWtlbHkgdG8KLS8vIHJlLWRvd25sb2FkIGF1ZGlvIGRhdGEuICBOb3RlIHRoYXQgdGhlIEphdmFTY3JpcHQgYXBwIG1heSBleHBlcmllbmNlCi0vLyBzaWduaWZpY2FudCBkaWZmaWN1bHR5IGlmIHRoaXMgdmFsdWUgaXMgdG9vIGxvdy4KLSNkZWZpbmUgU0JfTUVESUFfU09VUkNFX0JVRkZFUl9TVFJFQU1fQVVESU9fTUVNT1JZX0xJTUlUICgzVSAqIDEwMjRVICogMTAyNFUpCi0KLS8vIFNwZWNpZmllcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IHVzZWQgYnkgdmlkZW8gYnVmZmVycyBvZiBtZWRpYSBzb3VyY2UKLS8vIGJlZm9yZSB0cmlnZ2VyaW5nIGEgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgQSBsYXJnZSB2YWx1ZSB3aWxsIGNhdXNlIG1vcmUgbWVtb3J5Ci0vLyBiZWluZyB1c2VkIGJ5IHZpZGVvIGJ1ZmZlcnMgYnV0IHdpbGwgYWxzbyBtYWtlIEphdmFTY3JpcHQgYXBwIGxlc3MgbGlrZWx5IHRvCi0vLyByZS1kb3dubG9hZCB2aWRlbyBkYXRhLiAgTm90ZSB0aGF0IHRoZSBKYXZhU2NyaXB0IGFwcCBtYXkgZXhwZXJpZW5jZQotLy8gc2lnbmlmaWNhbnQgZGlmZmljdWx0eSBpZiB0aGlzIHZhbHVlIGlzIHRvbyBsb3cuCi0jZGVmaW5lIFNCX01FRElBX1NPVVJDRV9CVUZGRVJfU1RSRUFNX1ZJREVPX01FTU9SWV9MSU1JVCAoMTZVICogMTAyNFUgKiAxMDI0VSkKLQotLy8gU3BlY2lmaWVzIGhvdyBtdWNoIG1lbW9yeSB0byByZXNlcnZlIHVwLWZyb250IGZvciB0aGUgbWFpbiBtZWRpYSBidWZmZXIKLS8vICh1c3VhbGx5IHJlc2lkZXMgaW5zaWRlIHRoZSBDUFUgbWVtb3J5KSB1c2VkIGJ5IG1lZGlhIHNvdXJjZSBhbmQgZGVtdXhlcnMuCi0vLyBUaGUgbWFpbiBtZWRpYSBidWZmZXIgY2FuIHdvcmsgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgdHdvIHdheXM6Ci0vLyAxLiBJZiBHUFUgYnVmZmVyIGlzIHVzZWQgKGkuZS4gU0JfTUVESUFfR1BVX0JVRkZFUl9CVURHRVQgaXMgbm9uLXplcm8pLCB0aGUKLS8vICAgIG1haW4gYnVmZmVyIHdpbGwgYmUgdXNlZCBhcyBhIGNhY2hlIHNvIGEgbWVkaWEgYnVmZmVyIHdpbGwgYmUgY29waWVkIGZyb20KLS8vICAgIEdQVSBtZW1vcnkgdG8gbWFpbiBtZW1vcnkgYmVmb3JlIHNlbmRpbmcgdG8gdGhlIGRlY29kZXIgZm9yIGZ1cnRoZXIKLS8vICAgIHByb2Nlc3NpbmcuICBJbiB0aGlzIGNhc2UgdGhpcyBtYWNybyBzaG91bGQgYmUgc2V0IHRvIGEgdmFsdWUgdGhhdCBpcwotLy8gICAgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYWxsIG1lZGlhIGJ1ZmZlcnMgYmVpbmcgZGVjb2RlZC4KLS8vIDIuIElmIEdQVSBidWZmZXIgaXMgbm90IHVzZWQgKGkuZS4gU0JfTUVESUFfR1BVX0JVRkZFUl9CVURHRVQgaXMgemVybykgYWxsCi0vLyAgICBtZWRpYSBidWZmZXJzIHdpbGwgcmVzaWRlIGluIHRoZSBtYWluIG1lbW9yeSBidWZmZXIuICBJbiB0aGlzIGNhc2UgdGhlCi0vLyAgICBtYWNybyBzaG91bGQgYmUgc2V0IHRvIGEgdmFsdWUgdGhhdCBpcyBncmVhdGVyIHRoYW4gdGhlIHN1bSBvZiB0aGUgYWJvdmUKLS8vICAgIHNvdXJjZSBidWZmZXIgc3RyZWFtIG1lbW9yeSBsaW1pdHMgd2l0aCBleHRyYSByb29tIHRvIHRha2UgYWNjb3VudCBvZgotLy8gICAgZnJhZ21lbnRhdGlvbnMgYW5kIG1lbW9yeSB1c2VkIGJ5IGRlbXV4ZXJzLgotI2RlZmluZSBTQl9NRURJQV9NQUlOX0JVRkZFUl9CVURHRVQgKDI0VSAqIDEwMjRVICogMTAyNFUpCi0KLS8vIFNwZWNpZmllcyBob3cgbXVjaCBHUFUgbWVtb3J5IHRvIHJlc2VydmUgdXAtZnJvbnQgZm9yIG1lZGlhIHNvdXJjZSBidWZmZXJzLgotLy8gVGhpcyBzaG91bGQgb25seSBiZSBzZXQgdG8gbm9uLXplcm8gb24gc3lzdGVtIHdpdGggbGltaXRlZCBDUFUgbWVtb3J5IGFuZAotLy8gZXhjZXNzIEdQVSBtZW1vcnkgc28gdGhlIGFwcCBjYW4gc3RvcmUgbWVkaWEgYnVmZmVyIGluIEdQVSBtZW1vcnkuCi0vLyBTQl9NRURJQV9NQUlOX0JVRkZFUl9CVURHRVQgaGFzIHRvIGJlIHNldCB0byBhIG5vbi16ZXJvIHZhbHVlIHRvIGF2b2lkCi0vLyBtZWRpYSBidWZmZXJzIGJlaW5nIGRlY29kZWQgd2hlbiBiZWluZyBzdG9yZWQgaW4gR1BVLgotI2RlZmluZSBTQl9NRURJQV9HUFVfQlVGRkVSX0JVREdFVCAwVQotCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgNAotCiAvLyBUaGUgbWF4aW11bSBhdWRpbyBiaXRyYXRlIHRoZSBwbGF0Zm9ybSBjYW4gZGVjb2RlLiAgVGhlIGZvbGxvd2luZyB2YWx1ZQogLy8gZXF1YWxzIHRvIDVNIGJ5dGVzIHBlciBzZWNvbmRzIHdoaWNoIGlzIG1vcmUgdGhhbiBlbm91Z2ggZm9yIGNvbXByZXNzZWQKIC8vIGF1ZGlvLgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cGkgYi9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaQppbmRleCAwMzBmZWMxLi42YzgwZWExIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaQorKysgYi9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaQpAQCAtMTM1LDcgKzEzNSw2IEBACiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2xpbnV4L21lbW9yeV9nZXRfc3RhY2tfYm91bmRzLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvbGludXgvcGFnZV9pbnRlcm5hbC5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2xpbnV4L3NvY2tldF9nZXRfaW50ZXJmYWNlX2FkZHJlc3MuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9saW51eC9zb2NrZXRfZ2V0X2xvY2FsX2ludGVyZmFjZV9hZGRyZXNzLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvbGludXgvc3lzdGVtX2dldF9yYW5kb21fZGF0YS5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2xpbnV4L3N5c3RlbV9nZXRfc3RhY2suY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9saW51eC9zeXN0ZW1fZ2V0X3RvdGFsX2NwdV9tZW1vcnkuY2MnLApAQCAtMzA3LDcgKzMwNiw2IEBACiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2ludGVybmFsLmgnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9zZWVrLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfc2V0X2JvdW5kcy5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3NldF9wYXVzZS5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3NldF9wbGF5YmFja19yYXRlLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfc2V0X3ZvbHVtZS5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dvcmtlci5jYycsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9hbHNhL2Fsc2FfYXVkaW9fc2lua190eXBlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvYWxzYS9hbHNhX2F1ZGlvX3NpbmtfdHlwZS5jYwppbmRleCBlMGNiZDc5Li5kZWY0MTA1IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9hbHNhL2Fsc2FfYXVkaW9fc2lua190eXBlLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2Fsc2EvYWxzYV9hdWRpb19zaW5rX3R5cGUuY2MKQEAgLTkyLDEyICs5MiwxMCBAQAogCiAgIGJvb2wgSXNUeXBlKFR5cGUqIHR5cGUpIFNCX09WRVJSSURFIHsgcmV0dXJuIHR5cGVfID09IHR5cGU7IH0KIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgdm9pZCBTZXRQbGF5YmFja1JhdGUoZG91YmxlIHBsYXliYWNrX3JhdGUpIFNCX09WRVJSSURFIHsKICAgICBTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKICAgICBwbGF5YmFja19yYXRlXyA9IHBsYXliYWNrX3JhdGU7CiAgIH0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogCiAgIHZvaWQgU2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpIFNCX09WRVJSSURFIHsKICAgICBTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2ZmbXBlZy9mZm1wZWdfdmlkZW9fZGVjb2Rlci5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2ZmbXBlZy9mZm1wZWdfdmlkZW9fZGVjb2Rlci5jYwppbmRleCA1YzA4NzU3Li4wMjJmODQzIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9mZm1wZWcvZmZtcGVnX3ZpZGVvX2RlY29kZXIuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvZmZtcGVnL2ZmbXBlZ192aWRlb19kZWNvZGVyLmNjCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9mZm1wZWcvZmZtcGVnX3ZpZGVvX2RlY29kZXIuaCIKIAogI2luY2x1ZGUgInN0YXJib2FyZC9saW51eC9zaGFyZWQvZGVjb2RlX3RhcmdldF9pbnRlcm5hbC5oIgotCiAjaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC90aHJlYWQuaCIKIApAQCAtMzYwLDcgKzM1OSw2IEBACiBuYW1lc3BhY2UgcGxheWVyIHsKIG5hbWVzcGFjZSBmaWx0ZXIgewogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogLy8gc3RhdGljCiBib29sIFZpZGVvRGVjb2Rlcjo6T3V0cHV0TW9kZVN1cHBvcnRlZChTYlBsYXllck91dHB1dE1vZGUgb3V0cHV0X21vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYk1lZGlhVmlkZW9Db2RlYyBjb2RlYywKQEAgLTM4MSw3ICszNzksNiBAQAogCiAgIHJldHVybiBmYWxzZTsKIH0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogCiB9ICAvLyBuYW1lc3BhY2UgZmlsdGVyCiB9ICAvLyBuYW1lc3BhY2UgcGxheWVyCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9nY2MvYXRvbWljX2djY19wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2djYy9hdG9taWNfZ2NjX3B1YmxpYy5oCmluZGV4IDljN2FmYzYuLmNkZjlmYTggMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2djYy9hdG9taWNfZ2NjX3B1YmxpYy5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2djYy9hdG9taWNfZ2NjX3B1YmxpYy5oCkBAIC0xMiw5ICsxMiw2IEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotLy8gVGhlc2UgZGVmaW5pdGlvbnMgd2VyZSBtb3N0bHkgZXh0cmFjdGVkIGZyb20gQ2hyb21pdW0ncwotLy8gYmFzZS9hdG9taWNvcHNfaW50ZXJuYWxzX2djYy5oLgotCiAjaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfR0NDX0FUT01JQ19HQ0NfUFVCTElDX0hfCiAjZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfR0NDX0FUT01JQ19HQ0NfUFVCTElDX0hfCiAKQEAgLTI4LDk3ICsyNSw3OSBAQAogU2JBdG9taWNOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgU2JBdG9taWMzMiogcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JBdG9taWMzMiBvbGRfdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkF0b21pYzMyIG5ld192YWx1ZSkgewotICBTYkF0b21pYzMyIHByZXZfdmFsdWU7Ci0gIGRvIHsKLSAgICBpZiAoX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcChwdHIsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKSkKLSAgICAgIHJldHVybiBvbGRfdmFsdWU7Ci0gICAgcHJldl92YWx1ZSA9ICpwdHI7Ci0gIH0gd2hpbGUgKHByZXZfdmFsdWUgPT0gb2xkX3ZhbHVlKTsKLSAgcmV0dXJuIHByZXZfdmFsdWU7Ci19Ci0KLXN0YXRpYyBTQl9DX0ZPUkNFX0lOTElORSBTYkF0b21pYzMyCi1TYkF0b21pY05vQmFycmllcl9FeGNoYW5nZSh2b2xhdGlsZSBTYkF0b21pYzMyKiBwdHIsIFNiQXRvbWljMzIgbmV3X3ZhbHVlKSB7Ci0gIFNiQXRvbWljMzIgb2xkX3ZhbHVlOwotICBkbyB7Ci0gICAgb2xkX3ZhbHVlID0gKnB0cjsKLSAgfSB3aGlsZSAoIV9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAocHRyLCBvbGRfdmFsdWUsIG5ld192YWx1ZSkpOworICBfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX24ocHRyLCAmb2xkX3ZhbHVlLCBuZXdfdmFsdWUsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BVE9NSUNfUkVMQVhFRCwgX19BVE9NSUNfUkVMQVhFRCk7CiAgIHJldHVybiBvbGRfdmFsdWU7CiB9CiAKIHN0YXRpYyBTQl9DX0ZPUkNFX0lOTElORSBTYkF0b21pYzMyCitTYkF0b21pY05vQmFycmllcl9FeGNoYW5nZSh2b2xhdGlsZSBTYkF0b21pYzMyKiBwdHIsIFNiQXRvbWljMzIgbmV3X3ZhbHVlKSB7CisgIHJldHVybiBfX2F0b21pY19leGNoYW5nZV9uKHB0ciwgbmV3X3ZhbHVlLCBfX0FUT01JQ19SRUxBWEVEKTsKK30KKworc3RhdGljIFNCX0NfRk9SQ0VfSU5MSU5FIFNiQXRvbWljMzIKIFNiQXRvbWljTm9CYXJyaWVyX0luY3JlbWVudCh2b2xhdGlsZSBTYkF0b21pYzMyKiBwdHIsIFNiQXRvbWljMzIgaW5jcmVtZW50KSB7Ci0gIHJldHVybiBTYkF0b21pY0JhcnJpZXJfSW5jcmVtZW50KHB0ciwgaW5jcmVtZW50KTsKKyAgcmV0dXJuIGluY3JlbWVudCArIF9fYXRvbWljX2ZldGNoX2FkZChwdHIsIGluY3JlbWVudCwgX19BVE9NSUNfUkVMQVhFRCk7CiB9CiAKIHN0YXRpYyBTQl9DX0ZPUkNFX0lOTElORSBTYkF0b21pYzMyCiBTYkF0b21pY0JhcnJpZXJfSW5jcmVtZW50KHZvbGF0aWxlIFNiQXRvbWljMzIqIHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JBdG9taWMzMiBpbmNyZW1lbnQpIHsKLSAgZm9yICg7OykgewotICAgIC8vIEF0b21pYyBleGNoYW5nZSB0aGUgb2xkIHZhbHVlIHdpdGggYW4gaW5jcmVtZW50ZWQgb25lLgotICAgIFNiQXRvbWljMzIgb2xkX3ZhbHVlID0gKnB0cjsKLSAgICBTYkF0b21pYzMyIG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGluY3JlbWVudDsKLSAgICBpZiAoX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcChwdHIsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKSkgewotICAgICAgLy8gVGhlIGV4Y2hhbmdlIHRvb2sgcGxhY2UgYXMgZXhwZWN0ZWQuCi0gICAgICByZXR1cm4gbmV3X3ZhbHVlOwotICAgIH0KLSAgICAvLyBPdGhlcndpc2UsICpwdHIgY2hhbmdlZCBtaWQtbG9vcCBhbmQgd2UgbmVlZCB0byByZXRyeS4KLSAgfQorICByZXR1cm4gaW5jcmVtZW50ICsgX19hdG9taWNfZmV0Y2hfYWRkKHB0ciwgaW5jcmVtZW50LCBfX0FUT01JQ19TRVFfQ1NUKTsKIH0KIAogc3RhdGljIFNCX0NfRk9SQ0VfSU5MSU5FIFNiQXRvbWljMzIKIFNiQXRvbWljQWNxdWlyZV9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBTYkF0b21pYzMyKiBwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JBdG9taWMzMiBvbGRfdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JBdG9taWMzMiBuZXdfdmFsdWUpIHsKLSAgLy8gU2luY2UgTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwIHVzZXMgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCwgd2hpY2gKLSAgLy8gaXMgYSBmdWxsIG1lbW9yeSBiYXJyaWVyLCBub25lIGlzIG5lZWRlZCBoZXJlIG9yIGJlbG93IGluIFJlbGVhc2UuCi0gIHJldHVybiBTYkF0b21pY05vQmFycmllcl9Db21wYXJlQW5kU3dhcChwdHIsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKTsKKyAgX19hdG9taWNfY29tcGFyZV9leGNoYW5nZV9uKHB0ciwgJm9sZF92YWx1ZSwgbmV3X3ZhbHVlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQVRPTUlDX0FDUVVJUkUsIF9fQVRPTUlDX0FDUVVJUkUpOworICByZXR1cm4gb2xkX3ZhbHVlOwogfQogCiBzdGF0aWMgU0JfQ19GT1JDRV9JTkxJTkUgU2JBdG9taWMzMgogU2JBdG9taWNSZWxlYXNlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIFNiQXRvbWljMzIqIHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkF0b21pYzMyIG9sZF92YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkF0b21pYzMyIG5ld192YWx1ZSkgewotICByZXR1cm4gU2JBdG9taWNOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAocHRyLCBvbGRfdmFsdWUsIG5ld192YWx1ZSk7CisgIF9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2VfbihwdHIsICZvbGRfdmFsdWUsIG5ld192YWx1ZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0FUT01JQ19SRUxFQVNFLCBfX0FUT01JQ19SRUxBWEVEKTsKKyAgcmV0dXJuIG9sZF92YWx1ZTsKIH0KIAogc3RhdGljIFNCX0NfRk9SQ0VfSU5MSU5FIHZvaWQgU2JBdG9taWNNZW1vcnlCYXJyaWVyKCkgewotICBfX3N5bmNfc3luY2hyb25pemUoKTsKKyAgX19hdG9taWNfdGhyZWFkX2ZlbmNlKF9fQVRPTUlDX1NFUV9DU1QpOwogfQogCiBzdGF0aWMgU0JfQ19GT1JDRV9JTkxJTkUgdm9pZCBTYkF0b21pY05vQmFycmllcl9TdG9yZSh2b2xhdGlsZSBTYkF0b21pYzMyKiBwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkF0b21pYzMyIHZhbHVlKSB7Ci0gICpwdHIgPSB2YWx1ZTsKKyAgX19hdG9taWNfc3RvcmVfbihwdHIsIHZhbHVlLCBfX0FUT01JQ19SRUxBWEVEKTsKIH0KIAogc3RhdGljIFNCX0NfRk9SQ0VfSU5MSU5FIHZvaWQgU2JBdG9taWNBY3F1aXJlX1N0b3JlKHZvbGF0aWxlIFNiQXRvbWljMzIqIHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkF0b21pYzMyIHZhbHVlKSB7Ci0gICpwdHIgPSB2YWx1ZTsKKyAgX19hdG9taWNfc3RvcmVfbihwdHIsIHZhbHVlLCBfX0FUT01JQ19SRUxBWEVEKTsKICAgU2JBdG9taWNNZW1vcnlCYXJyaWVyKCk7CiB9CiAKIHN0YXRpYyBTQl9DX0ZPUkNFX0lOTElORSB2b2lkIFNiQXRvbWljUmVsZWFzZV9TdG9yZSh2b2xhdGlsZSBTYkF0b21pYzMyKiBwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JBdG9taWMzMiB2YWx1ZSkgewotICBTYkF0b21pY01lbW9yeUJhcnJpZXIoKTsKLSAgKnB0ciA9IHZhbHVlOworICBfX2F0b21pY19zdG9yZV9uKHB0ciwgdmFsdWUsIF9fQVRPTUlDX1JFTEVBU0UpOwogfQogCiBzdGF0aWMgU0JfQ19GT1JDRV9JTkxJTkUgU2JBdG9taWMzMgogU2JBdG9taWNOb0JhcnJpZXJfTG9hZCh2b2xhdGlsZSBjb25zdCBTYkF0b21pYzMyKiBwdHIpIHsKLSAgcmV0dXJuICpwdHI7CisgIHJldHVybiBfX2F0b21pY19sb2FkX24ocHRyLCBfX0FUT01JQ19SRUxBWEVEKTsKIH0KIAogc3RhdGljIFNCX0NfRk9SQ0VfSU5MSU5FIFNiQXRvbWljMzIKIFNiQXRvbWljQWNxdWlyZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IFNiQXRvbWljMzIqIHB0cikgewotICBTYkF0b21pYzMyIHZhbHVlID0gKnB0cjsKLSAgU2JBdG9taWNNZW1vcnlCYXJyaWVyKCk7Ci0gIHJldHVybiB2YWx1ZTsKKyAgcmV0dXJuIF9fYXRvbWljX2xvYWRfbihwdHIsIF9fQVRPTUlDX0FDUVVJUkUpOwogfQogCiBzdGF0aWMgU0JfQ19GT1JDRV9JTkxJTkUgU2JBdG9taWMzMgogU2JBdG9taWNSZWxlYXNlX0xvYWQodm9sYXRpbGUgY29uc3QgU2JBdG9taWMzMiogcHRyKSB7CiAgIFNiQXRvbWljTWVtb3J5QmFycmllcigpOwotICByZXR1cm4gKnB0cjsKKyAgcmV0dXJuIF9fYXRvbWljX2xvYWRfbihwdHIsIF9fQVRPTUlDX1JFTEFYRUQpOwogfQogCiAvLyA2NC1iaXQgYXRvbWljIG9wZXJhdGlvbnMgKG9ubHkgYXZhaWxhYmxlIG9uIDY0LWJpdCBwcm9jZXNzb3JzKS4KQEAgLTEyNyw5MSArMTA2LDc1IEBACiBTYkF0b21pY05vQmFycmllcl9Db21wYXJlQW5kU3dhcDY0KHZvbGF0aWxlIFNiQXRvbWljNjQqIHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JBdG9taWM2NCBvbGRfdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiQXRvbWljNjQgbmV3X3ZhbHVlKSB7Ci0gIFNiQXRvbWljNjQgcHJldl92YWx1ZTsKLSAgZG8gewotICAgIGlmIChfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpKQotICAgICAgcmV0dXJuIG9sZF92YWx1ZTsKLSAgICBwcmV2X3ZhbHVlID0gKnB0cjsKLSAgfSB3aGlsZSAocHJldl92YWx1ZSA9PSBvbGRfdmFsdWUpOwotICByZXR1cm4gcHJldl92YWx1ZTsKLX0KLQotc3RhdGljIFNCX0NfRk9SQ0VfSU5MSU5FIFNiQXRvbWljNjQKLVNiQXRvbWljTm9CYXJyaWVyX0V4Y2hhbmdlNjQodm9sYXRpbGUgU2JBdG9taWM2NCogcHRyLCBTYkF0b21pYzY0IG5ld192YWx1ZSkgewotICBTYkF0b21pYzY0IG9sZF92YWx1ZTsKLSAgZG8gewotICAgIG9sZF92YWx1ZSA9ICpwdHI7Ci0gIH0gd2hpbGUgKCFfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpKTsKKyAgX19hdG9taWNfY29tcGFyZV9leGNoYW5nZV9uKHB0ciwgJm9sZF92YWx1ZSwgbmV3X3ZhbHVlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQVRPTUlDX1JFTEFYRUQsIF9fQVRPTUlDX1JFTEFYRUQpOwogICByZXR1cm4gb2xkX3ZhbHVlOwogfQogCiBzdGF0aWMgU0JfQ19GT1JDRV9JTkxJTkUgU2JBdG9taWM2NAorU2JBdG9taWNOb0JhcnJpZXJfRXhjaGFuZ2U2NCh2b2xhdGlsZSBTYkF0b21pYzY0KiBwdHIsIFNiQXRvbWljNjQgbmV3X3ZhbHVlKSB7CisgIHJldHVybiBfX2F0b21pY19leGNoYW5nZV9uKHB0ciwgbmV3X3ZhbHVlLCBfX0FUT01JQ19SRUxBWEVEKTsKK30KKworc3RhdGljIFNCX0NfRk9SQ0VfSU5MSU5FIFNiQXRvbWljNjQKIFNiQXRvbWljTm9CYXJyaWVyX0luY3JlbWVudDY0KHZvbGF0aWxlIFNiQXRvbWljNjQqIHB0ciwgU2JBdG9taWM2NCBpbmNyZW1lbnQpIHsKLSAgcmV0dXJuIFNiQXRvbWljQmFycmllcl9JbmNyZW1lbnQ2NChwdHIsIGluY3JlbWVudCk7CisgIHJldHVybiBpbmNyZW1lbnQgKyBfX2F0b21pY19mZXRjaF9hZGQocHRyLCBpbmNyZW1lbnQsIF9fQVRPTUlDX1JFTEFYRUQpOwogfQogCiBzdGF0aWMgU0JfQ19GT1JDRV9JTkxJTkUgU2JBdG9taWM2NAogU2JBdG9taWNCYXJyaWVyX0luY3JlbWVudDY0KHZvbGF0aWxlIFNiQXRvbWljNjQqIHB0ciwgU2JBdG9taWM2NCBpbmNyZW1lbnQpIHsKLSAgZm9yICg7OykgewotICAgIC8vIEF0b21pYyBleGNoYW5nZSB0aGUgb2xkIHZhbHVlIHdpdGggYW4gaW5jcmVtZW50ZWQgb25lLgotICAgIFNiQXRvbWljNjQgb2xkX3ZhbHVlID0gKnB0cjsKLSAgICBTYkF0b21pYzY0IG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGluY3JlbWVudDsKLSAgICBpZiAoX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcChwdHIsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKSkgewotICAgICAgLy8gVGhlIGV4Y2hhbmdlIHRvb2sgcGxhY2UgYXMgZXhwZWN0ZWQuCi0gICAgICByZXR1cm4gbmV3X3ZhbHVlOwotICAgIH0KLSAgICAvLyBPdGhlcndpc2UsICpwdHIgY2hhbmdlZCBtaWQtbG9vcCBhbmQgd2UgbmVlZCB0byByZXRyeS4KLSAgfQorICByZXR1cm4gaW5jcmVtZW50ICsgX19hdG9taWNfZmV0Y2hfYWRkKHB0ciwgaW5jcmVtZW50LCBfX0FUT01JQ19TRVFfQ1NUKTsKIH0KIAogc3RhdGljIFNCX0NfRk9SQ0VfSU5MSU5FIFNiQXRvbWljNjQKIFNiQXRvbWljQWNxdWlyZV9Db21wYXJlQW5kU3dhcDY0KHZvbGF0aWxlIFNiQXRvbWljNjQqIHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiQXRvbWljNjQgb2xkX3ZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JBdG9taWM2NCBuZXdfdmFsdWUpIHsKLSAgcmV0dXJuIFNiQXRvbWljTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwNjQocHRyLCBvbGRfdmFsdWUsIG5ld192YWx1ZSk7CisgIF9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2VfbihwdHIsICZvbGRfdmFsdWUsIG5ld192YWx1ZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0FUT01JQ19BQ1FVSVJFLCBfX0FUT01JQ19BQ1FVSVJFKTsKKyAgcmV0dXJuIG9sZF92YWx1ZTsKIH0KIAogc3RhdGljIFNCX0NfRk9SQ0VfSU5MSU5FIFNiQXRvbWljNjQKIFNiQXRvbWljUmVsZWFzZV9Db21wYXJlQW5kU3dhcDY0KHZvbGF0aWxlIFNiQXRvbWljNjQqIHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiQXRvbWljNjQgb2xkX3ZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JBdG9taWM2NCBuZXdfdmFsdWUpIHsKLSAgcmV0dXJuIFNiQXRvbWljTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwNjQocHRyLCBvbGRfdmFsdWUsIG5ld192YWx1ZSk7CisgIF9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2VfbihwdHIsICZvbGRfdmFsdWUsIG5ld192YWx1ZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0FUT01JQ19SRUxFQVNFLCBfX0FUT01JQ19SRUxBWEVEKTsKKyAgcmV0dXJuIG9sZF92YWx1ZTsKIH0KIAogc3RhdGljIFNCX0NfRk9SQ0VfSU5MSU5FIHZvaWQKIFNiQXRvbWljTm9CYXJyaWVyX1N0b3JlNjQodm9sYXRpbGUgU2JBdG9taWM2NCogcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBTYkF0b21pYzY0IHZhbHVlKSB7Ci0gICpwdHIgPSB2YWx1ZTsKKyAgX19hdG9taWNfc3RvcmVfbihwdHIsIHZhbHVlLCBfX0FUT01JQ19SRUxBWEVEKTsKIH0KIAogc3RhdGljIFNCX0NfRk9SQ0VfSU5MSU5FIHZvaWQgU2JBdG9taWNBY3F1aXJlX1N0b3JlNjQodm9sYXRpbGUgU2JBdG9taWM2NCogcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JBdG9taWM2NCB2YWx1ZSkgewotICAqcHRyID0gdmFsdWU7CisgIF9fYXRvbWljX3N0b3JlX24ocHRyLCB2YWx1ZSwgX19BVE9NSUNfUkVMQVhFRCk7CiAgIFNiQXRvbWljTWVtb3J5QmFycmllcigpOwogfQogCiBzdGF0aWMgU0JfQ19GT1JDRV9JTkxJTkUgdm9pZCBTYkF0b21pY1JlbGVhc2VfU3RvcmU2NCh2b2xhdGlsZSBTYkF0b21pYzY0KiBwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkF0b21pYzY0IHZhbHVlKSB7Ci0gIFNiQXRvbWljTWVtb3J5QmFycmllcigpOwotICAqcHRyID0gdmFsdWU7CisgIF9fYXRvbWljX3N0b3JlX24ocHRyLCB2YWx1ZSwgX19BVE9NSUNfUkVMRUFTRSk7CiB9CiAKIHN0YXRpYyBTQl9DX0ZPUkNFX0lOTElORSBTYkF0b21pYzY0CiBTYkF0b21pY05vQmFycmllcl9Mb2FkNjQodm9sYXRpbGUgY29uc3QgU2JBdG9taWM2NCogcHRyKSB7Ci0gIHJldHVybiAqcHRyOworICByZXR1cm4gX19hdG9taWNfbG9hZF9uKHB0ciwgX19BVE9NSUNfUkVMQVhFRCk7CiB9CiAKIHN0YXRpYyBTQl9DX0ZPUkNFX0lOTElORSBTYkF0b21pYzY0CiBTYkF0b21pY0FjcXVpcmVfTG9hZDY0KHZvbGF0aWxlIGNvbnN0IFNiQXRvbWljNjQqIHB0cikgewotICBTYkF0b21pYzY0IHZhbHVlID0gKnB0cjsKLSAgU2JBdG9taWNNZW1vcnlCYXJyaWVyKCk7Ci0gIHJldHVybiB2YWx1ZTsKKyAgcmV0dXJuIF9fYXRvbWljX2xvYWRfbihwdHIsIF9fQVRPTUlDX0FDUVVJUkUpOwogfQogCiBzdGF0aWMgU0JfQ19GT1JDRV9JTkxJTkUgU2JBdG9taWM2NAogU2JBdG9taWNSZWxlYXNlX0xvYWQ2NCh2b2xhdGlsZSBjb25zdCBTYkF0b21pYzY0KiBwdHIpIHsKICAgU2JBdG9taWNNZW1vcnlCYXJyaWVyKCk7Ci0gIHJldHVybiAqcHRyOworICByZXR1cm4gX19hdG9taWNfbG9hZF9uKHB0ciwgX19BVE9NSUNfUkVMQVhFRCk7CiB9CiAjZW5kaWYgIC8vIFNCX0hBUyg2NF9CSVRfQVRPTUlDUykKIApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvZ2NjL2F0b21pY19nY2Nfc3luY19wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2djYy9hdG9taWNfZ2NjX3N5bmNfcHVibGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1ZDgwMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2djYy9hdG9taWNfZ2NjX3N5bmNfcHVibGljLmgKQEAgLTAsMCArMSwyMjcgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIEFuIFNiQXRvbWljKiBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aGUgb2xkZXIgIl9fc3luY18qIiBHQ0MgaW50cmluc2ljcy4KKy8vIFRoZXNlIG1heSBiZSB1c2VmdWwgaWYsIGZvciBleGFtcGxlLCB5b3UgYXJlIHVzaW5nIGEgR0NDIHZlcnNpb24gcHJpb3IgdG8KKy8vIDQuNywgb3IgeW91ciB0b29sY2hhaW4gaGFzIGEgYnJva2VuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBuZXdlcgorLy8gIl9fYXRvbWljXyoiIGludHJpbnNpY3MuCisvLworLy8gVGhlc2UgZGVmaW5pdGlvbnMgd2VyZSBtb3N0bHkgZXh0cmFjdGVkIGZyb20gQ2hyb21pdW0ncworLy8gYmFzZS9hdG9taWNvcHNfaW50ZXJuYWxzX2djYy5oLgorCisjaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfR0NDX0FUT01JQ19HQ0NfU1lOQ19QVUJMSUNfSF8KKyNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9HQ0NfQVRPTUlDX0dDQ19TWU5DX1BVQkxJQ19IXworCisjaW5jbHVkZSAic3RhcmJvYXJkL2F0b21pYy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0YXRpYyBTQl9DX0ZPUkNFX0lOTElORSBTYkF0b21pYzMyCitTYkF0b21pY05vQmFycmllcl9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBTYkF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkF0b21pYzMyIG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiQXRvbWljMzIgbmV3X3ZhbHVlKSB7CisgIFNiQXRvbWljMzIgcHJldl92YWx1ZTsKKyAgZG8geworICAgIGlmIChfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpKQorICAgICAgcmV0dXJuIG9sZF92YWx1ZTsKKyAgICBwcmV2X3ZhbHVlID0gKnB0cjsKKyAgfSB3aGlsZSAocHJldl92YWx1ZSA9PSBvbGRfdmFsdWUpOworICByZXR1cm4gcHJldl92YWx1ZTsKK30KKworc3RhdGljIFNCX0NfRk9SQ0VfSU5MSU5FIFNiQXRvbWljMzIKK1NiQXRvbWljTm9CYXJyaWVyX0V4Y2hhbmdlKHZvbGF0aWxlIFNiQXRvbWljMzIqIHB0ciwgU2JBdG9taWMzMiBuZXdfdmFsdWUpIHsKKyAgU2JBdG9taWMzMiBvbGRfdmFsdWU7CisgIGRvIHsKKyAgICBvbGRfdmFsdWUgPSAqcHRyOworICB9IHdoaWxlICghX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcChwdHIsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKSk7CisgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKK3N0YXRpYyBTQl9DX0ZPUkNFX0lOTElORSBTYkF0b21pYzMyCitTYkF0b21pY05vQmFycmllcl9JbmNyZW1lbnQodm9sYXRpbGUgU2JBdG9taWMzMiogcHRyLCBTYkF0b21pYzMyIGluY3JlbWVudCkgeworICByZXR1cm4gU2JBdG9taWNCYXJyaWVyX0luY3JlbWVudChwdHIsIGluY3JlbWVudCk7Cit9CisKK3N0YXRpYyBTQl9DX0ZPUkNFX0lOTElORSBTYkF0b21pYzMyCitTYkF0b21pY0JhcnJpZXJfSW5jcmVtZW50KHZvbGF0aWxlIFNiQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU2JBdG9taWMzMiBpbmNyZW1lbnQpIHsKKyAgZm9yICg7OykgeworICAgIC8vIEF0b21pYyBleGNoYW5nZSB0aGUgb2xkIHZhbHVlIHdpdGggYW4gaW5jcmVtZW50ZWQgb25lLgorICAgIFNiQXRvbWljMzIgb2xkX3ZhbHVlID0gKnB0cjsKKyAgICBTYkF0b21pYzMyIG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGluY3JlbWVudDsKKyAgICBpZiAoX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcChwdHIsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKSkgeworICAgICAgLy8gVGhlIGV4Y2hhbmdlIHRvb2sgcGxhY2UgYXMgZXhwZWN0ZWQuCisgICAgICByZXR1cm4gbmV3X3ZhbHVlOworICAgIH0KKyAgICAvLyBPdGhlcndpc2UsICpwdHIgY2hhbmdlZCBtaWQtbG9vcCBhbmQgd2UgbmVlZCB0byByZXRyeS4KKyAgfQorfQorCitzdGF0aWMgU0JfQ19GT1JDRV9JTkxJTkUgU2JBdG9taWMzMgorU2JBdG9taWNBY3F1aXJlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIFNiQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkF0b21pYzMyIG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkF0b21pYzMyIG5ld192YWx1ZSkgeworICAvLyBTaW5jZSBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAgdXNlcyBfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwLCB3aGljaAorICAvLyBpcyBhIGZ1bGwgbWVtb3J5IGJhcnJpZXIsIG5vbmUgaXMgbmVlZGVkIGhlcmUgb3IgYmVsb3cgaW4gUmVsZWFzZS4KKyAgcmV0dXJuIFNiQXRvbWljTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpOworfQorCitzdGF0aWMgU0JfQ19GT1JDRV9JTkxJTkUgU2JBdG9taWMzMgorU2JBdG9taWNSZWxlYXNlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIFNiQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkF0b21pYzMyIG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkF0b21pYzMyIG5ld192YWx1ZSkgeworICByZXR1cm4gU2JBdG9taWNOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAocHRyLCBvbGRfdmFsdWUsIG5ld192YWx1ZSk7Cit9CisKK3N0YXRpYyBTQl9DX0ZPUkNFX0lOTElORSB2b2lkIFNiQXRvbWljTWVtb3J5QmFycmllcigpIHsKKyAgX19zeW5jX3N5bmNocm9uaXplKCk7Cit9CisKK3N0YXRpYyBTQl9DX0ZPUkNFX0lOTElORSB2b2lkIFNiQXRvbWljTm9CYXJyaWVyX1N0b3JlKHZvbGF0aWxlIFNiQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiQXRvbWljMzIgdmFsdWUpIHsKKyAgKnB0ciA9IHZhbHVlOworfQorCitzdGF0aWMgU0JfQ19GT1JDRV9JTkxJTkUgdm9pZCBTYkF0b21pY0FjcXVpcmVfU3RvcmUodm9sYXRpbGUgU2JBdG9taWMzMiogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiQXRvbWljMzIgdmFsdWUpIHsKKyAgKnB0ciA9IHZhbHVlOworICBTYkF0b21pY01lbW9yeUJhcnJpZXIoKTsKK30KKworc3RhdGljIFNCX0NfRk9SQ0VfSU5MSU5FIHZvaWQgU2JBdG9taWNSZWxlYXNlX1N0b3JlKHZvbGF0aWxlIFNiQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkF0b21pYzMyIHZhbHVlKSB7CisgIFNiQXRvbWljTWVtb3J5QmFycmllcigpOworICAqcHRyID0gdmFsdWU7Cit9CisKK3N0YXRpYyBTQl9DX0ZPUkNFX0lOTElORSBTYkF0b21pYzMyCitTYkF0b21pY05vQmFycmllcl9Mb2FkKHZvbGF0aWxlIGNvbnN0IFNiQXRvbWljMzIqIHB0cikgeworICByZXR1cm4gKnB0cjsKK30KKworc3RhdGljIFNCX0NfRk9SQ0VfSU5MSU5FIFNiQXRvbWljMzIKK1NiQXRvbWljQWNxdWlyZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IFNiQXRvbWljMzIqIHB0cikgeworICBTYkF0b21pYzMyIHZhbHVlID0gKnB0cjsKKyAgU2JBdG9taWNNZW1vcnlCYXJyaWVyKCk7CisgIHJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIFNCX0NfRk9SQ0VfSU5MSU5FIFNiQXRvbWljMzIKK1NiQXRvbWljUmVsZWFzZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IFNiQXRvbWljMzIqIHB0cikgeworICBTYkF0b21pY01lbW9yeUJhcnJpZXIoKTsKKyAgcmV0dXJuICpwdHI7Cit9CisKKy8vIDY0LWJpdCBhdG9taWMgb3BlcmF0aW9ucyAob25seSBhdmFpbGFibGUgb24gNjQtYml0IHByb2Nlc3NvcnMpLgorI2lmIFNCX0hBUyg2NF9CSVRfQVRPTUlDUykKK3N0YXRpYyBTQl9DX0ZPUkNFX0lOTElORSBTYkF0b21pYzY0CitTYkF0b21pY05vQmFycmllcl9Db21wYXJlQW5kU3dhcDY0KHZvbGF0aWxlIFNiQXRvbWljNjQqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JBdG9taWM2NCBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiQXRvbWljNjQgbmV3X3ZhbHVlKSB7CisgIFNiQXRvbWljNjQgcHJldl92YWx1ZTsKKyAgZG8geworICAgIGlmIChfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpKQorICAgICAgcmV0dXJuIG9sZF92YWx1ZTsKKyAgICBwcmV2X3ZhbHVlID0gKnB0cjsKKyAgfSB3aGlsZSAocHJldl92YWx1ZSA9PSBvbGRfdmFsdWUpOworICByZXR1cm4gcHJldl92YWx1ZTsKK30KKworc3RhdGljIFNCX0NfRk9SQ0VfSU5MSU5FIFNiQXRvbWljNjQKK1NiQXRvbWljTm9CYXJyaWVyX0V4Y2hhbmdlNjQodm9sYXRpbGUgU2JBdG9taWM2NCogcHRyLCBTYkF0b21pYzY0IG5ld192YWx1ZSkgeworICBTYkF0b21pYzY0IG9sZF92YWx1ZTsKKyAgZG8geworICAgIG9sZF92YWx1ZSA9ICpwdHI7CisgIH0gd2hpbGUgKCFfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpKTsKKyAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKworc3RhdGljIFNCX0NfRk9SQ0VfSU5MSU5FIFNiQXRvbWljNjQKK1NiQXRvbWljTm9CYXJyaWVyX0luY3JlbWVudDY0KHZvbGF0aWxlIFNiQXRvbWljNjQqIHB0ciwgU2JBdG9taWM2NCBpbmNyZW1lbnQpIHsKKyAgcmV0dXJuIFNiQXRvbWljQmFycmllcl9JbmNyZW1lbnQ2NChwdHIsIGluY3JlbWVudCk7Cit9CisKK3N0YXRpYyBTQl9DX0ZPUkNFX0lOTElORSBTYkF0b21pYzY0CitTYkF0b21pY0JhcnJpZXJfSW5jcmVtZW50NjQodm9sYXRpbGUgU2JBdG9taWM2NCogcHRyLCBTYkF0b21pYzY0IGluY3JlbWVudCkgeworICBmb3IgKDs7KSB7CisgICAgLy8gQXRvbWljIGV4Y2hhbmdlIHRoZSBvbGQgdmFsdWUgd2l0aCBhbiBpbmNyZW1lbnRlZCBvbmUuCisgICAgU2JBdG9taWM2NCBvbGRfdmFsdWUgPSAqcHRyOworICAgIFNiQXRvbWljNjQgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICsgaW5jcmVtZW50OworICAgIGlmIChfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpKSB7CisgICAgICAvLyBUaGUgZXhjaGFuZ2UgdG9vayBwbGFjZSBhcyBleHBlY3RlZC4KKyAgICAgIHJldHVybiBuZXdfdmFsdWU7CisgICAgfQorICAgIC8vIE90aGVyd2lzZSwgKnB0ciBjaGFuZ2VkIG1pZC1sb29wIGFuZCB3ZSBuZWVkIHRvIHJldHJ5LgorICB9Cit9CisKK3N0YXRpYyBTQl9DX0ZPUkNFX0lOTElORSBTYkF0b21pYzY0CitTYkF0b21pY0FjcXVpcmVfQ29tcGFyZUFuZFN3YXA2NCh2b2xhdGlsZSBTYkF0b21pYzY0KiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkF0b21pYzY0IG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiQXRvbWljNjQgbmV3X3ZhbHVlKSB7CisgIHJldHVybiBTYkF0b21pY05vQmFycmllcl9Db21wYXJlQW5kU3dhcDY0KHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpOworfQorCitzdGF0aWMgU0JfQ19GT1JDRV9JTkxJTkUgU2JBdG9taWM2NAorU2JBdG9taWNSZWxlYXNlX0NvbXBhcmVBbmRTd2FwNjQodm9sYXRpbGUgU2JBdG9taWM2NCogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JBdG9taWM2NCBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkF0b21pYzY0IG5ld192YWx1ZSkgeworICByZXR1cm4gU2JBdG9taWNOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXA2NChwdHIsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKTsKK30KKworc3RhdGljIFNCX0NfRk9SQ0VfSU5MSU5FIHZvaWQKK1NiQXRvbWljTm9CYXJyaWVyX1N0b3JlNjQodm9sYXRpbGUgU2JBdG9taWM2NCogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTYkF0b21pYzY0IHZhbHVlKSB7CisgICpwdHIgPSB2YWx1ZTsKK30KKworc3RhdGljIFNCX0NfRk9SQ0VfSU5MSU5FIHZvaWQgU2JBdG9taWNBY3F1aXJlX1N0b3JlNjQodm9sYXRpbGUgU2JBdG9taWM2NCogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JBdG9taWM2NCB2YWx1ZSkgeworICAqcHRyID0gdmFsdWU7CisgIFNiQXRvbWljTWVtb3J5QmFycmllcigpOworfQorCitzdGF0aWMgU0JfQ19GT1JDRV9JTkxJTkUgdm9pZCBTYkF0b21pY1JlbGVhc2VfU3RvcmU2NCh2b2xhdGlsZSBTYkF0b21pYzY0KiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkF0b21pYzY0IHZhbHVlKSB7CisgIFNiQXRvbWljTWVtb3J5QmFycmllcigpOworICAqcHRyID0gdmFsdWU7Cit9CisKK3N0YXRpYyBTQl9DX0ZPUkNFX0lOTElORSBTYkF0b21pYzY0CitTYkF0b21pY05vQmFycmllcl9Mb2FkNjQodm9sYXRpbGUgY29uc3QgU2JBdG9taWM2NCogcHRyKSB7CisgIHJldHVybiAqcHRyOworfQorCitzdGF0aWMgU0JfQ19GT1JDRV9JTkxJTkUgU2JBdG9taWM2NAorU2JBdG9taWNBY3F1aXJlX0xvYWQ2NCh2b2xhdGlsZSBjb25zdCBTYkF0b21pYzY0KiBwdHIpIHsKKyAgU2JBdG9taWM2NCB2YWx1ZSA9ICpwdHI7CisgIFNiQXRvbWljTWVtb3J5QmFycmllcigpOworICByZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBTQl9DX0ZPUkNFX0lOTElORSBTYkF0b21pYzY0CitTYkF0b21pY1JlbGVhc2VfTG9hZDY0KHZvbGF0aWxlIGNvbnN0IFNiQXRvbWljNjQqIHB0cikgeworICBTYkF0b21pY01lbW9yeUJhcnJpZXIoKTsKKyAgcmV0dXJuICpwdHI7Cit9CisjZW5kaWYgIC8vIFNCX0hBUyg2NF9CSVRfQVRPTUlDUykKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvLyBTVEFSQk9BUkRfU0hBUkVEX0dDQ19BVE9NSUNfR0NDX1NZTkNfUFVCTElDX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9saW51eC9zb2NrZXRfZ2V0X2ludGVyZmFjZV9hZGRyZXNzLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvbGludXgvc29ja2V0X2dldF9pbnRlcmZhY2VfYWRkcmVzcy5jYwppbmRleCBiOWJkOWM0Li4zNmY1OWJkIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9saW51eC9zb2NrZXRfZ2V0X2ludGVyZmFjZV9hZGRyZXNzLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2xpbnV4L3NvY2tldF9nZXRfaW50ZXJmYWNlX2FkZHJlc3MuY2MKQEAgLTE0LDggKzE0LDYgQEAKIAogI2luY2x1ZGUgInN0YXJib2FyZC9zb2NrZXQuaCIKIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKLQogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgogI2luY2x1ZGUgPGlmYWRkcnMuaD4KICNpbmNsdWRlIDxsaW51eC9pZi5oPgpAQCAtMzcwLDUgKzM2OCwzIEBACiAKICAgcmV0dXJuIGZhbHNlOwogfQotCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2xpbnV4L3NvY2tldF9nZXRfbG9jYWxfaW50ZXJmYWNlX2FkZHJlc3MuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9saW51eC9zb2NrZXRfZ2V0X2xvY2FsX2ludGVyZmFjZV9hZGRyZXNzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWVmNzkyLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2xpbnV4L3NvY2tldF9nZXRfbG9jYWxfaW50ZXJmYWNlX2FkZHJlc3MuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NvY2tldC5oIgotCi0jaWYgU0JfQVBJX1ZFUlNJT04gPCA0Ci0KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSNpbmNsdWRlIDxpZmFkZHJzLmg+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9wb3NpeC9zb2NrZXRfaW50ZXJuYWwuaCIKLQotbmFtZXNwYWNlIHNicG9zaXggPSBzdGFyYm9hcmQ6OnNoYXJlZDo6cG9zaXg7Ci0KLWJvb2wgU2JTb2NrZXRHZXRMb2NhbEludGVyZmFjZUFkZHJlc3MoU2JTb2NrZXRBZGRyZXNzKiBvdXRfYWRkcmVzcykgewotICBpZiAoIW91dF9hZGRyZXNzKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gR2V0IGEgbGlzdCBvZiB0aGUgbG9jYWwgbmV0d29yayBpbnRlcmZhY2VzLgotICBzdHJ1Y3QgaWZhZGRycyogaWZhZGRyOwotICBpZiAoZ2V0aWZhZGRycygmaWZhZGRyKSA9PSAtMSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFNjYW4gdGhlIHJldHVybmVkIGludGVyZmFjZXMgZm9yIGEgbm9uLWxvb3BiYWNrIElQdjQgaW50ZXJmYWNlLgotICBmb3IgKHN0cnVjdCBpZmFkZHJzKiBpdCA9IGlmYWRkcjsgaXQgIT0gTlVMTDsgaXQgPSBpdC0+aWZhX25leHQpIHsKLSAgICBpZiAoaXQtPmlmYV9hZGRyID09IE5VTEwpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8vIEZpbHRlciBvdXQgYW55dGhpbmcgYnV0IElQdjQuCi0gICAgaWYgKGl0LT5pZmFfYWRkci0+c2FfZmFtaWx5ICE9IEFGX0lORVQpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8vIFdlIGtub3cgaXQgaXMgSVBWNCwgc28gbGV0J3MgY2FzdCBpdCBvdmVyLgotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiogaWZfYWRkciA9Ci0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IHNvY2thZGRyX2luKj4oaXQtPmlmYV9hZGRyKTsKLQotICAgIC8vIEZpbHRlciBvdXQgdGhlIGxvb3BiYWNrIGFkYXB0ZXIuCi0gICAgaWYgKGlmX2FkZHItPnNpbl9hZGRyLnNfYWRkciA9PSBodG9ubChJTkFERFJfTE9PUEJBQ0spKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICAvLyBDb3B5IHRoZSBhZGRyZXNzIHRvIHRoZSBkZXN0aW5hdGlvbi4KLSAgICBzYnBvc2l4OjpTb2NrQWRkciBzb2NrX2FkZHI7Ci0gICAgc29ja19hZGRyLkZyb21Tb2NrYWRkcihpdC0+aWZhX2FkZHIpOwotICAgIGlmICghc29ja19hZGRyLlRvU2JTb2NrZXRBZGRyZXNzKG91dF9hZGRyZXNzKSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgZnJlZWlmYWRkcnMoaWZhZGRyKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGZyZWVpZmFkZHJzKGlmYWRkcik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IDQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3NpZ25hbC9zdXNwZW5kX3NpZ25hbHMuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zaWduYWwvc3VzcGVuZF9zaWduYWxzLmNjCmluZGV4IDQ5MGIwZWQuLjY0ZmM5NDcgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3NpZ25hbC9zdXNwZW5kX3NpZ25hbHMuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc2lnbmFsL3N1c3BlbmRfc2lnbmFscy5jYwpAQCAtNjUsNiArNjUsMTEgQEAKICAgc3RhcmJvYXJkOjpBcHBsaWNhdGlvbjo6R2V0KCktPlVucGF1c2UoTlVMTCwgTlVMTCk7CiB9CiAKK3ZvaWQgTG93TWVtb3J5KGludCBzaWduYWxfaWQpIHsKKyAgTG9nU2lnbmFsQ2F1Z2h0KHNpZ25hbF9pZCk7CisgIHN0YXJib2FyZDo6QXBwbGljYXRpb246OkdldCgpLT5JbmplY3RMb3dNZW1vcnlFdmVudCgpOworfQorCiB2b2lkIElnbm9yZShpbnQgc2lnbmFsX2lkKSB7CiAgIExvZ1NpZ25hbENhdWdodChzaWduYWxfaWQpOwogICBTYkxvZ1Jhd0R1bXBTdGFjaygxKTsKQEAgLTkxLDYgKzk2LDggQEAKICNlbmRpZgogICBTZXRTaWduYWxIYW5kbGVyKFNJR1VTUjEsICZTdXNwZW5kKTsKICAgVW5ibG9ja1NpZ25hbChTSUdVU1IxKTsKKyAgU2V0U2lnbmFsSGFuZGxlcihTSUdVU1IyLCAmTG93TWVtb3J5KTsKKyAgVW5ibG9ja1NpZ25hbChTSUdVU1IyKTsKICAgU2V0U2lnbmFsSGFuZGxlcihTSUdDT05ULCAmUmVzdW1lKTsKIH0KIApAQCAtOTksNiArMTA2LDcgQEAKICAgU2V0U2lnbmFsSGFuZGxlcihTSUdQSVBFLCBTSUdfREZMKTsKICNlbmRpZgogICBTZXRTaWduYWxIYW5kbGVyKFNJR1VTUjEsIFNJR19ERkwpOworICBTZXRTaWduYWxIYW5kbGVyKFNJR1VTUjIsIFNJR19ERkwpOwogICBTZXRTaWduYWxIYW5kbGVyKFNJR0NPTlQsIFNJR19ERkwpOwogfQogCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zcGVlY2hkL3NwZWVjaF9zeW50aGVzaXNfc2V0X2xhbmd1YWdlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3BlZWNoZC9zcGVlY2hfc3ludGhlc2lzX3NldF9sYW5ndWFnZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUwODNmNy4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zcGVlY2hkL3NwZWVjaF9zeW50aGVzaXNfc2V0X2xhbmd1YWdlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zcGVlY2hfc3ludGhlc2lzLmgiCi0KLSNpZiBTQl9BUElfVkVSU0lPTiA8IDQKLS8vIERFUFJFQ0FURUQgSU4gQVBJIFZFUlNJT04gNAotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zcGVlY2hkL3NwZWVjaGRfaW50ZXJuYWwuaCIKLQotdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OnNwZWVjaGQ6OlNwZWVjaERpc3BhdGNoZXI7Ci0KLWJvb2wgU2JTcGVlY2hTeW50aGVzaXNTZXRMYW5ndWFnZShjb25zdCBjaGFyKiBsYW5nKSB7Ci0gIFNwZWVjaERpc3BhdGNoZXIqIHNwZWVjaF9kaXNwYXRjaGVyID0gU3BlZWNoRGlzcGF0Y2hlcjo6R2V0KCk7Ci0gIGlmICghc3BlZWNoX2Rpc3BhdGNoZXIpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHNwZWVjaF9kaXNwYXRjaGVyLT5TZXRMYW5ndWFnZShsYW5nKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXBwbGljYXRpb24uY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXBwbGljYXRpb24uY2MKaW5kZXggMTk0YWRjMS4uZDI4NzExMiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2FwcGxpY2F0aW9uLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hcHBsaWNhdGlvbi5jYwpAQCAtMTM1LDYgKzEzNSwxMiBAQAogICAgICAgICAgICAgICAgICAgIFNiTWVtb3J5RGVhbGxvY2F0ZSkpOwogfQogCit2b2lkIEFwcGxpY2F0aW9uOjpJbmplY3RMb3dNZW1vcnlFdmVudCgpIHsKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9MT1dfTUVNT1JZX0VWRU5UX0FQSV9WRVJTSU9OCisgIEluamVjdChuZXcgRXZlbnQoa1NiRXZlbnRUeXBlTG93TWVtb3J5LCBOVUxMLCBOVUxMKSk7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX0xPV19NRU1PUllfRVZFTlRfQVBJX1ZFUlNJT04KK30KKwogU2JFdmVudElkIEFwcGxpY2F0aW9uOjpTY2hlZHVsZShTYkV2ZW50Q2FsbGJhY2sgY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiVGltZU1vbm90b25pYyBkZWxheSkgewpAQCAtMTQ3LDcgKzE1Myw3IEBACiAgIENhbmNlbFRpbWVkRXZlbnQoaWQpOwogfQogCi0jaWYgU0JfSEFTKFBMQVlFUikgJiYgKFNCX0FQSV9WRVJTSU9OID49IDQgfHwgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKSkKKyNpZiBTQl9IQVMoUExBWUVSKQogdm9pZCBBcHBsaWNhdGlvbjo6SGFuZGxlRnJhbWUoU2JQbGF5ZXIgcGxheWVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiYgZnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwKQEAgLTE1Niw3ICsxNjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCkgewogICBBY2NlcHRGcmFtZShwbGF5ZXIsIGZyYW1lLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKIH0KLSNlbmRpZiAgLy8gU0JfSEFTKFBMQVlFUikgJiYgKFNCX0FQSV9WRVJTSU9OID49IDQgfHwgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKSkKKyNlbmRpZiAgLy8gU0JfSEFTKFBMQVlFUikKIAogdm9pZCBBcHBsaWNhdGlvbjo6U2V0U3RhcnRMaW5rKGNvbnN0IGNoYXIqIHN0YXJ0X2xpbmspIHsKICAgU0JfRENIRUNLKElzQ3VycmVudFRocmVhZCgpKTsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hcHBsaWNhdGlvbi5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2FwcGxpY2F0aW9uLmgKaW5kZXggMmQxNTY5ZC4uZDRlYzczMiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2FwcGxpY2F0aW9uLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2FwcGxpY2F0aW9uLmgKQEAgLTIwOSw2ICsyMDksOSBAQAogICAvLyBleHRlcm5hbCB0aHJlYWQuCiAgIHZvaWQgTGluayhjb25zdCBjaGFyKiBsaW5rX2RhdGEpOwogCisgIC8vIEluamVjdHMgYW4gZXZlbnQgb2YgdHlwZSBrU2JFdmVudFR5cGVMb3dNZW1vcnkgdG8gdGhlIGFwcGxpY2F0aW9uLgorICB2b2lkIEluamVjdExvd01lbW9yeUV2ZW50KCk7CisKICAgLy8gU2NoZWR1bGVzIGFuIGV2ZW50IGludG8gdGhlIGV2ZW50IHF1ZXVlLiAgTWF5IGJlIGNhbGxlZCBmcm9tIGFuIGV4dGVybmFsCiAgIC8vIHRocmVhZC4KICAgU2JFdmVudElkIFNjaGVkdWxlKFNiRXZlbnRDYWxsYmFjayBjYWxsYmFjaywKQEAgLTIxOSw3ICsyMjIsNyBAQAogICAvLyBleHRlcm5hbCB0aHJlYWQuCiAgIHZvaWQgQ2FuY2VsKFNiRXZlbnRJZCBpZCk7CiAKLSNpZiBTQl9IQVMoUExBWUVSKSAmJiAoU0JfQVBJX1ZFUlNJT04gPj0gNCB8fCBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpKQorI2lmIFNCX0hBUyhQTEFZRVIpCiAgIC8vIEhhbmRsZXMgcmVjZWl2aW5nIGEgbmV3IHZpZGVvIGZyYW1lIG9mIHxwbGF5ZXJ8IGZyb20gdGhlIG1lZGlhIHN5c3RlbS4gT25seQogICAvLyB1c2VkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIGNvbXBvc2l0ZSB2aWRlbyBmcmFtZXMgd2l0aCBwdW5jaC1vdXQKICAgLy8gdmlkZW8gbWFudWFsbHkgKHNob3VsZCBiZSByYXJlKS4gV2lsbCBiZSBjYWxsZWQgZnJvbSBhbiBleHRlcm5hbCB0aHJlYWQuCkBAIC0yMjksNyArMjMyLDcgQEAKICAgICAgICAgICAgICAgICAgICBpbnQgeSwKICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCk7Ci0jZW5kaWYgIC8vIFNCX0hBUyhQTEFZRVIpICYmIChTQl9BUElfVkVSU0lPTiA+PSA0IHx8IFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkpCisjZW5kaWYgIC8vIFNCX0hBUyhQTEFZRVIpCiAKICAgLy8gUmVnaXN0ZXJzIGEgfGNhbGxiYWNrfCBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gfFRlYXJkb3dufCBpcwogICAvLyBjYWxsZWQuCkBAIC0yNTcsNyArMjYwLDcgQEAKICAgLy8gcHJvY2Vzc2VkIHRoZSBSZXN1bWUgZXZlbnQuCiAgIHZpcnR1YWwgdm9pZCBPblJlc3VtZSgpIHt9CiAKLSNpZiBTQl9IQVMoUExBWUVSKSAmJiAoU0JfQVBJX1ZFUlNJT04gPj0gNCB8fCBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpKQorI2lmIFNCX0hBUyhQTEFZRVIpCiAgIC8vIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGFjY2VwdCB2aWRlbyBmcmFtZXMgZnJvbSB0aGUgbWVkaWEKICAgLy8gc3lzdGVtLiBXaWxsIGJlIGNhbGxlZCBmcm9tIGFuIGV4dGVybmFsIHRocmVhZC4KICAgdmlydHVhbCB2b2lkIEFjY2VwdEZyYW1lKFNiUGxheWVyIC8qIHBsYXllciAqLywKQEAgLTI2Niw3ICsyNjksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIHkgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogd2lkdGggKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogaGVpZ2h0ICovKSB7fQotI2VuZGlmICAvLyBTQl9IQVMoUExBWUVSKSAmJiAoU0JfQVBJX1ZFUlNJT04gPj0gNCB8fCBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpKQorI2VuZGlmICAvLyBTQl9IQVMoUExBWUVSKQogCiAgIC8vIEJsb2NrcyB1bnRpbCB0aGUgbmV4dCBldmVudCBpcyBhdmFpbGFibGUuIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhpcwogICAvLyBtZXRob2QgdG8gcHJvdmlkZSBldmVudHMgZm9yIHRoZSBwbGF0Zm9ybS4gR2l2ZXMgb3duZXJzaGlwIHRvIHRoZSBjYWxsZXIuCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXVkaW9fc2luay9hdWRpb19zaW5rX2ludGVybmFsLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXVkaW9fc2luay9hdWRpb19zaW5rX2ludGVybmFsLmgKaW5kZXggNGFhZWVmMS4uZGU2MzJlNCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3NpbmsvYXVkaW9fc2lua19pbnRlcm5hbC5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hdWRpb19zaW5rL2F1ZGlvX3NpbmtfaW50ZXJuYWwuaApAQCAtMzksOSArMzksNyBAQAogICB9OwogCiAgIHZpcnR1YWwgflNiQXVkaW9TaW5rUHJpdmF0ZSgpIHt9Ci0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICB2aXJ0dWFsIHZvaWQgU2V0UGxheWJhY2tSYXRlKGRvdWJsZSBwbGF5YmFja19yYXRlKSA9IDA7Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKIAogICB2aXJ0dWFsIHZvaWQgU2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpID0gMDsKIApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3Npbmsvc3R1Yl9hdWRpb19zaW5rX3R5cGUuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXVkaW9fc2luay9zdHViX2F1ZGlvX3NpbmtfdHlwZS5jYwppbmRleCBmNmNjZDA5Li4xM2I0ZDBkIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXVkaW9fc2luay9zdHViX2F1ZGlvX3NpbmtfdHlwZS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXVkaW9fc2luay9zdHViX2F1ZGlvX3NpbmtfdHlwZS5jYwpAQCAtMzcsMTIgKzM3LDEwIEBACiAgIH5TdHViQXVkaW9TaW5rKCkgU0JfT1ZFUlJJREU7CiAKICAgYm9vbCBJc1R5cGUoVHlwZSogdHlwZSkgU0JfT1ZFUlJJREUgeyByZXR1cm4gdHlwZV8gPT0gdHlwZTsgfQotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgdm9pZCBTZXRQbGF5YmFja1JhdGUoZG91YmxlIHBsYXliYWNrX3JhdGUpIFNCX09WRVJSSURFIHsKICAgICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKHBsYXliYWNrX3JhdGUpOwogICAgIFNCX05PVElNUExFTUVOVEVEKCk7CiAgIH0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogCiAgIHZvaWQgU2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpIFNCX09WRVJSSURFIHsKICAgICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKHZvbHVtZSk7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvY3J5cHRvZ3JhcGh5L2NyeXB0b2dyYXBoeV9jcmVhdGVfdHJhbnNmb3JtZXIuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvY3J5cHRvZ3JhcGh5L2NyeXB0b2dyYXBoeV9jcmVhdGVfdHJhbnNmb3JtZXIuY2MKaW5kZXggMTljMjg2ZC4uMmUwOWU3YiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2NyeXB0b2dyYXBoeS9jcnlwdG9ncmFwaHlfY3JlYXRlX3RyYW5zZm9ybWVyLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9jcnlwdG9ncmFwaHkvY3J5cHRvZ3JhcGh5X2NyZWF0ZV90cmFuc2Zvcm1lci5jYwpAQCAtMjAsMTAgKzIwLDYgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9jcnlwdG9ncmFwaHkvc29mdHdhcmVfYWVzLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3N0cmluZy5oIgogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPCA0Ci0jZXJyb3IgIlNiQ3J5cHRvZ3JhcGh5IHJlcXVpcmVzIFNCX0FQSV9WRVJTSU9OID49IDQuIgotI2VuZGlmCi0KIHVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OmNyeXB0b2dyYXBoeTo6QUVTX0tFWTsKIHVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OmNyeXB0b2dyYXBoeTo6QUVTX2djbTEyOF9pbml0OwogdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6Y3J5cHRvZ3JhcGh5OjpBbGdvcml0aG07CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvY3J5cHRvZ3JhcGh5L2NyeXB0b2dyYXBoeV9kZXN0cm95X3RyYW5zZm9ybWVyLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2NyeXB0b2dyYXBoeS9jcnlwdG9ncmFwaHlfZGVzdHJveV90cmFuc2Zvcm1lci5jYwppbmRleCBmZWRlM2MzLi41ZDExMDM2IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvY3J5cHRvZ3JhcGh5L2NyeXB0b2dyYXBoeV9kZXN0cm95X3RyYW5zZm9ybWVyLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9jcnlwdG9ncmFwaHkvY3J5cHRvZ3JhcGh5X2Rlc3Ryb3lfdHJhbnNmb3JtZXIuY2MKQEAgLTE2LDEwICsxNiw2IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL2NyeXB0b2dyYXBoeS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2NyeXB0b2dyYXBoeS9jcnlwdG9ncmFwaHlfaW50ZXJuYWwuaCIKIAotI2lmIFNCX0FQSV9WRVJTSU9OIDwgNAotI2Vycm9yICJTYkNyeXB0b2dyYXBoeSByZXF1aXJlcyBTQl9BUElfVkVSU0lPTiA+PSA0LiIKLSNlbmRpZgotCiB2b2lkIFNiQ3J5cHRvZ3JhcGh5RGVzdHJveVRyYW5zZm9ybWVyKFNiQ3J5cHRvZ3JhcGh5VHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIHsKICAgaWYgKCF0cmFuc2Zvcm1lcikgewogICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9jcnlwdG9ncmFwaHkvY3J5cHRvZ3JhcGh5X2dldF90YWcuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvY3J5cHRvZ3JhcGh5L2NyeXB0b2dyYXBoeV9nZXRfdGFnLmNjCmluZGV4IGVlMDk4OTIuLjhmMGNjNzQgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9jcnlwdG9ncmFwaHkvY3J5cHRvZ3JhcGh5X2dldF90YWcuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2NyeXB0b2dyYXBoeS9jcnlwdG9ncmFwaHlfZ2V0X3RhZy5jYwpAQCAtMTcsMTAgKzE3LDYgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9jcnlwdG9ncmFwaHkvY3J5cHRvZ3JhcGh5X2ludGVybmFsLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvY3J5cHRvZ3JhcGh5L3NvZnR3YXJlX2Flcy5oIgogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPCA0Ci0jZXJyb3IgIlNiQ3J5cHRvZ3JhcGh5IHJlcXVpcmVzIFNCX0FQSV9WRVJTSU9OID49IDQuIgotI2VuZGlmCi0KIHVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OmNyeXB0b2dyYXBoeTo6QUVTX2djbTEyOF90YWc7CiB1c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjpjcnlwdG9ncmFwaHk6OmtBbGdvcml0aG1BZXMxMjhHY207CiAKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9jcnlwdG9ncmFwaHkvY3J5cHRvZ3JhcGh5X3NldF9hdXRoZW50aWNhdGVkX2RhdGEuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvY3J5cHRvZ3JhcGh5L2NyeXB0b2dyYXBoeV9zZXRfYXV0aGVudGljYXRlZF9kYXRhLmNjCmluZGV4IDYxNzhiZDYuLjdkZmY1ZTUgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9jcnlwdG9ncmFwaHkvY3J5cHRvZ3JhcGh5X3NldF9hdXRoZW50aWNhdGVkX2RhdGEuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2NyeXB0b2dyYXBoeS9jcnlwdG9ncmFwaHlfc2V0X2F1dGhlbnRpY2F0ZWRfZGF0YS5jYwpAQCAtMTcsMTAgKzE3LDYgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9jcnlwdG9ncmFwaHkvY3J5cHRvZ3JhcGh5X2ludGVybmFsLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvY3J5cHRvZ3JhcGh5L3NvZnR3YXJlX2Flcy5oIgogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPCA0Ci0jZXJyb3IgIlNiQ3J5cHRvZ3JhcGh5IHJlcXVpcmVzIFNCX0FQSV9WRVJTSU9OID49IDQuIgotI2VuZGlmCi0KIHVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OmNyeXB0b2dyYXBoeTo6QUVTX2djbTEyOF9hYWQ7CiB1c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjpjcnlwdG9ncmFwaHk6OmtBbGdvcml0aG1BZXMxMjhHY207CiAKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9jcnlwdG9ncmFwaHkvY3J5cHRvZ3JhcGh5X3NldF9pbml0aWFsaXphdGlvbl92ZWN0b3IuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvY3J5cHRvZ3JhcGh5L2NyeXB0b2dyYXBoeV9zZXRfaW5pdGlhbGl6YXRpb25fdmVjdG9yLmNjCmluZGV4IGY4MWQyOTMuLjBiNWU0YTcgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9jcnlwdG9ncmFwaHkvY3J5cHRvZ3JhcGh5X3NldF9pbml0aWFsaXphdGlvbl92ZWN0b3IuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2NyeXB0b2dyYXBoeS9jcnlwdG9ncmFwaHlfc2V0X2luaXRpYWxpemF0aW9uX3ZlY3Rvci5jYwpAQCAtMjEsMTAgKzIxLDYgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9jcnlwdG9ncmFwaHkvY3J5cHRvZ3JhcGh5X2ludGVybmFsLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvY3J5cHRvZ3JhcGh5L3NvZnR3YXJlX2Flcy5oIgogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPCA0Ci0jZXJyb3IgIlNiQ3J5cHRvZ3JhcGh5IHJlcXVpcmVzIFNCX0FQSV9WRVJTSU9OID49IDQuIgotI2VuZGlmCi0KIHVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OmNyeXB0b2dyYXBoeTo6QUVTX2djbTEyOF9zZXRpdjsKIHVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OmNyeXB0b2dyYXBoeTo6a0FsZ29yaXRobUFlczEyOEdjbTsKIHVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OmNyeXB0b2dyYXBoeTo6a0FsZ29yaXRobUFlczEyOEN0cjsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9jcnlwdG9ncmFwaHkvY3J5cHRvZ3JhcGh5X3RyYW5zZm9ybS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9jcnlwdG9ncmFwaHkvY3J5cHRvZ3JhcGh5X3RyYW5zZm9ybS5jYwppbmRleCBmYzI5N2M0Li5iMjJmY2NmIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvY3J5cHRvZ3JhcGh5L2NyeXB0b2dyYXBoeV90cmFuc2Zvcm0uY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2NyeXB0b2dyYXBoeS9jcnlwdG9ncmFwaHlfdHJhbnNmb3JtLmNjCkBAIC0xNywxMCArMTcsNiBAQAogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2NyeXB0b2dyYXBoeS9jcnlwdG9ncmFwaHlfaW50ZXJuYWwuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9jcnlwdG9ncmFwaHkvc29mdHdhcmVfYWVzLmgiCiAKLSNpZiBTQl9BUElfVkVSU0lPTiA8IDQKLSNlcnJvciAiU2JDcnlwdG9ncmFwaHkgcmVxdWlyZXMgU0JfQVBJX1ZFUlNJT04gPj0gNC4iCi0jZW5kaWYKLQogdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6Y3J5cHRvZ3JhcGh5OjpBRVNfY2JjX2VuY3J5cHQ7CiB1c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjpjcnlwdG9ncmFwaHk6OkFFU19jdHIxMjhfZW5jcnlwdDsKIHVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OmNyeXB0b2dyYXBoeTo6QUVTX2RlY3J5cHQ7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvZHJtL2RybV9nZW5lcmF0ZV9zZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2RybS9kcm1fZ2VuZXJhdGVfc2Vzc2lvbl91cGRhdGVfcmVxdWVzdC5jYwppbmRleCBlZmVkYzdlLi5kYThmNmEyIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvZHJtL2RybV9nZW5lcmF0ZV9zZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0LmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9kcm0vZHJtX2dlbmVyYXRlX3Nlc3Npb25fdXBkYXRlX3JlcXVlc3QuY2MKQEAgLTE4LDkgKzE4LDcgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9kcm0vZHJtX3N5c3RlbV9pbnRlcm5hbC5oIgogCiB2b2lkIFNiRHJtR2VuZXJhdGVTZXNzaW9uVXBkYXRlUmVxdWVzdChTYkRybVN5c3RlbSBkcm1fc3lzdGVtLAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWNrZXQsCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBpbml0aWFsaXphdGlvbl9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluaXRpYWxpemF0aW9uX2RhdGFfc2l6ZSkgewpAQCAtMjksMTYgKzI3LDEyIEBACiAgICAgcmV0dXJuOwogICB9CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAgIGlmICh0aWNrZXQgPT0ga1NiRHJtVGlja2V0SW52YWxpZCkgewogICAgIFNCX0RMT0coRVJST1IpIDw8ICJUaWNrZXQgbXVzdCBiZSBzcGVjaWZpZWQuIjsKICAgICByZXR1cm47CiAgIH0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogCiAgIGRybV9zeXN0ZW0tPkdlbmVyYXRlU2Vzc2lvblVwZGF0ZVJlcXVlc3QoCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICAgICAgdGlja2V0LAotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiAgICAgICB0eXBlLCBpbml0aWFsaXphdGlvbl9kYXRhLCBpbml0aWFsaXphdGlvbl9kYXRhX3NpemUpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2RybS9kcm1fc3lzdGVtX2ludGVybmFsLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvZHJtL2RybV9zeXN0ZW1faW50ZXJuYWwuaAppbmRleCBhMzkyZmUxLi4wNWQwNmIxIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvZHJtL2RybV9zeXN0ZW1faW50ZXJuYWwuaAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvZHJtL2RybV9zeXN0ZW1faW50ZXJuYWwuaApAQCAtMjcsMTYgKzI3LDEyIEBACiAgIHZpcnR1YWwgflNiRHJtU3lzdGVtUHJpdmF0ZSgpIHt9CiAKICAgdmlydHVhbCB2b2lkIEdlbmVyYXRlU2Vzc2lvblVwZGF0ZVJlcXVlc3QoCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICAgICAgaW50IHRpY2tldCwKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogICAgICAgY29uc3QgY2hhciogdHlwZSwKICAgICAgIGNvbnN0IHZvaWQqIGluaXRpYWxpemF0aW9uX2RhdGEsCiAgICAgICBpbnQgaW5pdGlhbGl6YXRpb25fZGF0YV9zaXplKSA9IDA7CiAgIHZpcnR1YWwgdm9pZCBVcGRhdGVTZXNzaW9uKAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgICAgIGludCB0aWNrZXQsCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKICAgICAgIGNvbnN0IHZvaWQqIGtleSwKICAgICAgIGludCBrZXlfc2l6ZSwKICAgICAgIGNvbnN0IHZvaWQqIHNlc3Npb25faWQsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvZHJtL2RybV91cGRhdGVfc2Vzc2lvbi5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9kcm0vZHJtX3VwZGF0ZV9zZXNzaW9uLmNjCmluZGV4IDU3ODYyZDUuLmYwNTFiODIgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9kcm0vZHJtX3VwZGF0ZV9zZXNzaW9uLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9kcm0vZHJtX3VwZGF0ZV9zZXNzaW9uLmNjCkBAIC0xOCw5ICsxOCw3IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvZHJtL2RybV9zeXN0ZW1faW50ZXJuYWwuaCIKIAogdm9pZCBTYkRybVVwZGF0ZVNlc3Npb24oU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSwKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlja2V0LAotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga2V5X3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBzZXNzaW9uX2lkLApAQCAtMzEsOCArMjksNiBAQAogICB9CiAKICAgZHJtX3N5c3RlbS0+VXBkYXRlU2Vzc2lvbigKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAgICAgICB0aWNrZXQsCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKICAgICAgIGtleSwga2V5X3NpemUsIHNlc3Npb25faWQsIHNlc3Npb25faWRfc2l6ZSk7CiB9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbGlua19yZWNlaXZlci5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9saW5rX3JlY2VpdmVyLmNjCmluZGV4IGU5NGRiODcuLjQ1YjlkM2YgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9saW5rX3JlY2VpdmVyLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9saW5rX3JlY2VpdmVyLmNjCkBAIC0yNzYsMjAgKzI3Niw0NiBAQAogTGlua1JlY2VpdmVyOjpJbXBsOjp+SW1wbCgpIHsKICAgU0JfRENIRUNLKCFTYlRocmVhZElzRXF1YWwodGhyZWFkXywgU2JUaHJlYWRHZXRDdXJyZW50KCkpKTsKICAgcXVpdF8uc3RvcmUodHJ1ZSk7Ci0gIFNiU29ja2V0V2FpdGVyV2FrZVVwKHdhaXRlcl8pOworICBpZiAoU2JTb2NrZXRXYWl0ZXJJc1ZhbGlkKHdhaXRlcl8pKSB7CisgICAgU2JTb2NrZXRXYWl0ZXJXYWtlVXAod2FpdGVyXyk7CisgIH0KICAgZGVzdHJveV93YWl0ZXJfLlB1dCgpOwogICBTYlRocmVhZEpvaW4odGhyZWFkXywgTlVMTCk7CiB9CiAKIHZvaWQgTGlua1JlY2VpdmVyOjpJbXBsOjpSdW4oKSB7CiAgIHdhaXRlcl8gPSBTYlNvY2tldFdhaXRlckNyZWF0ZSgpOwotICBTQl9EQ0hFQ0soU2JTb2NrZXRXYWl0ZXJJc1ZhbGlkKHdhaXRlcl8pKTsKKyAgaWYgKCFTYlNvY2tldFdhaXRlcklzVmFsaWQod2FpdGVyXykpIHsKKyAgICBTQl9MT0coV0FSTklORykgPDwgIlVuYWJsZSB0byBjcmVhdGUgU2JTb2NrZXRXYWl0ZXIuIjsKKyAgICB3YWl0ZXJfaW5pdGlhbGl6ZWRfLlB1dCgpOworICAgIHJldHVybjsKKyAgfQorCiAgIGxpc3Rlbl9zb2NrZXRfID0KICAgICAgIENyZWF0ZUxpc3RlbmluZ1NvY2tldChrU2JTb2NrZXRBZGRyZXNzVHlwZUlwdjQsIHNwZWNpZmllZF9wb3J0Xyk7Ci0gIFNCX0RDSEVDSyhsaXN0ZW5fc29ja2V0Xyk7CisgIGlmICghbGlzdGVuX3NvY2tldF8gfHwgIWxpc3Rlbl9zb2NrZXRfLT5Jc1ZhbGlkKCkpIHsKKyAgICAgIGxpc3Rlbl9zb2NrZXRfID0gQ3JlYXRlTGlzdGVuaW5nU29ja2V0KGtTYlNvY2tldEFkZHJlc3NUeXBlSXB2NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZF9wb3J0Xyk7CisgIH0KKyAgaWYgKCFsaXN0ZW5fc29ja2V0XyB8fCAhbGlzdGVuX3NvY2tldF8tPklzVmFsaWQoKSkgeworICAgIFNCX0xPRyhXQVJOSU5HKSA8PCAiVW5hYmxlIHRvIHN0YXJ0IExpbmtSZWNlaXZlciBvbiBwb3J0ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgc3BlY2lmaWVkX3BvcnRfIDw8ICIuIjsKKyAgICBTYlNvY2tldFdhaXRlckRlc3Ryb3kod2FpdGVyXyk7CisgICAgd2FpdGVyXyA9IGtTYlNvY2tldFdhaXRlckludmFsaWQ7CisgICAgd2FpdGVyX2luaXRpYWxpemVkXy5QdXQoKTsKKyAgICByZXR1cm47CisgIH0KKwogICBhY3R1YWxfcG9ydF8gPSAwOwogICBib29sIHJlc3VsdCA9IEdldEJvdW5kUG9ydChsaXN0ZW5fc29ja2V0Xy5nZXQoKSwgJmFjdHVhbF9wb3J0Xyk7Ci0gIFNCX0RDSEVDSyhyZXN1bHQpOworICBpZiAoIXJlc3VsdCkgeworICAgIFNCX0xPRyhXQVJOSU5HKSA8PCAiVW5hYmxlIHRvIGdldCBMaW5rUmVjZWl2ZXIgYm91bmQgcG9ydC4iOworICAgIFNiU29ja2V0V2FpdGVyRGVzdHJveSh3YWl0ZXJfKTsKKyAgICB3YWl0ZXJfID0ga1NiU29ja2V0V2FpdGVySW52YWxpZDsKKyAgICB3YWl0ZXJfaW5pdGlhbGl6ZWRfLlB1dCgpOworICAgIHJldHVybjsKKyAgfQorCiAgIFNCX0xPRyhJTkZPKSA8PCAiTGlua1JlY2VpdmVyIHBvcnQ6ICIgPDwgYWN0dWFsX3BvcnRfOwogCiAgIGNoYXIgcG9ydF9zdHJpbmdbMzJdID0gezB9OwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21lZGlhL21lZGlhX2Nhbl9wbGF5X21pbWVfYW5kX2tleV9zeXN0ZW0uY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvbWVkaWFfY2FuX3BsYXlfbWltZV9hbmRfa2V5X3N5c3RlbS5jYwppbmRleCBiZGY2NzlkLi41ODU5ODMxIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvbWVkaWFfY2FuX3BsYXlfbWltZV9hbmRfa2V5X3N5c3RlbS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvbWVkaWFfY2FuX3BsYXlfbWltZV9hbmRfa2V5X3N5c3RlbS5jYwpAQCAtMTYsODQgKzE2LDExIEBACiAKICNpbmNsdWRlICJzdGFyYm9hcmQvY2hhcmFjdGVyLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21lZGlhL21pbWVfdHlwZS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zdHJpbmcuaCIKLQotI2lmIFNCX0FQSV9WRVJTSU9OIDwgNAotCi11c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjptZWRpYTo6TWltZVR5cGU7Ci0KLW5hbWVzcGFjZSB7Ci1ib29sIEhhc011bHRpQ2hhbm5lbE91dHB1dCgpIHsKLSAgaW50IGNvdW50ID0gU2JNZWRpYUdldEF1ZGlvT3V0cHV0Q291bnQoKTsKLSAgZm9yIChpbnQgb3V0cHV0X2luZGV4ID0gMDsgb3V0cHV0X2luZGV4IDwgY291bnQ7ICsrb3V0cHV0X2luZGV4KSB7Ci0gICAgU2JNZWRpYUF1ZGlvQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uOwotICAgIGlmICghU2JNZWRpYUdldEF1ZGlvQ29uZmlndXJhdGlvbihvdXRwdXRfaW5kZXgsICZjb25maWd1cmF0aW9uKSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgaWYgKGNvbmZpZ3VyYXRpb24ubnVtYmVyX29mX2NoYW5uZWxzID49IDYpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLX0gIC8vIG5hbWVzcGFjZQotCi1TYk1lZGlhU3VwcG9ydFR5cGUgU2JNZWRpYUNhblBsYXlNaW1lQW5kS2V5U3lzdGVtKGNvbnN0IGNoYXIqIG1pbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGtleV9zeXN0ZW0pIHsKLSAgaWYgKG1pbWUgPT0gTlVMTCkgewotICAgIFNCX0RMT0coV0FSTklORykgPDwgIm1pbWUgY2Fubm90IGJlIE5VTEwiOwotICAgIHJldHVybiBrU2JNZWRpYVN1cHBvcnRUeXBlTm90U3VwcG9ydGVkOwotICB9Ci0gIGlmIChrZXlfc3lzdGVtID09IE5VTEwpIHsKLSAgICBTQl9ETE9HKFdBUk5JTkcpIDw8ICJrZXlfc3lzdGVtIGNhbm5vdCBiZSBOVUxMIjsKLSAgICByZXR1cm4ga1NiTWVkaWFTdXBwb3J0VHlwZU5vdFN1cHBvcnRlZDsKLSAgfQotICBpZiAoU2JTdHJpbmdHZXRMZW5ndGgoa2V5X3N5c3RlbSkgIT0gMCkgewotICAgIGlmICghU2JNZWRpYUlzU3VwcG9ydGVkKGtTYk1lZGlhVmlkZW9Db2RlY05vbmUsIGtTYk1lZGlhQXVkaW9Db2RlY05vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3N5c3RlbSkpIHsKLSAgICAgIHJldHVybiBrU2JNZWRpYVN1cHBvcnRUeXBlTm90U3VwcG9ydGVkOwotICAgIH0KLSAgfQotICBNaW1lVHlwZSBtaW1lX3R5cGUobWltZSk7Ci0gIGlmICghbWltZV90eXBlLmlzX3ZhbGlkKCkpIHsKLSAgICBTQl9ETE9HKFdBUk5JTkcpIDw8IG1pbWUgPDwgIiBpcyBub3QgYSB2YWxpZCBtaW1lIHR5cGUiOwotICAgIHJldHVybiBrU2JNZWRpYVN1cHBvcnRUeXBlTm90U3VwcG9ydGVkOwotICB9Ci0KLSAgaWYgKG1pbWVfdHlwZS50eXBlKCkgPT0gImF1ZGlvIiAmJiBtaW1lX3R5cGUuc3VidHlwZSgpID09ICJtcDQiKSB7Ci0gICAgLy8gVE9ETzogQmFzZSB0aGlzIG9uIHRoZSAiY2hhbm5lbHMiIHBhcmFtLCBub3QgdGhlIGNvZGVjcyBwYXJhbS4KLSAgICBpZiAobWltZV90eXBlLkdldFBhcmFtU3RyaW5nVmFsdWUoImNvZGVjcyIsICIiKSA9PSAiYWFjNTEiKSB7Ci0gICAgICBpZiAoIUhhc011bHRpQ2hhbm5lbE91dHB1dCgpKSB7Ci0gICAgICAgIHJldHVybiBrU2JNZWRpYVN1cHBvcnRUeXBlTm90U3VwcG9ydGVkOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4ga1NiTWVkaWFTdXBwb3J0VHlwZVByb2JhYmx5OwotICB9Ci0gIGlmIChtaW1lX3R5cGUudHlwZSgpID09ICJ2aWRlbyIgJiYgbWltZV90eXBlLnN1YnR5cGUoKSA9PSAibXA0IikgewotICAgIHJldHVybiBrU2JNZWRpYVN1cHBvcnRUeXBlUHJvYmFibHk7Ci0gIH0KLSNpZiBTQl9IQVMoTUVESUFfV0VCTV9WUDlfU1VQUE9SVCkKLSAgaWYgKG1pbWVfdHlwZS50eXBlKCkgPT0gInZpZGVvIiAmJiBtaW1lX3R5cGUuc3VidHlwZSgpID09ICJ3ZWJtIikgewotICAgIGlmIChtaW1lX3R5cGUuR2V0Q29kZWNzKCkuZW1wdHkoKSkgewotICAgICAgcmV0dXJuIGtTYk1lZGlhU3VwcG9ydFR5cGVNYXliZTsKLSAgICB9Ci0gICAgaWYgKG1pbWVfdHlwZS5HZXRQYXJhbVN0cmluZ1ZhbHVlKDApID09ICJ2cDkiKSB7Ci0gICAgICByZXR1cm4ga1NiTWVkaWFTdXBwb3J0VHlwZVByb2JhYmx5OwotICAgIH0KLSAgICByZXR1cm4ga1NiTWVkaWFTdXBwb3J0VHlwZU5vdFN1cHBvcnRlZDsKLSAgfQotI2VuZGlmICAvLyBTQl9IQVMoTUVESUFfV0VCTV9WUDlfU1VQUE9SVCkKLSAgcmV0dXJuIGtTYk1lZGlhU3VwcG9ydFR5cGVOb3RTdXBwb3J0ZWQ7Ci19Ci0KLSNlbHNlICAvLyBTQl9BUElfVkVSU0lPTiA8IDQKLQogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21lZGlhL2NvZGVjX3V0aWwuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZWRpYS9tZWRpYV9zdXBwb3J0X2ludGVybmFsLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvbWVkaWFfdXRpbC5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21lZGlhL21pbWVfdHlwZS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zdHJpbmcuaCIKIAogdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6bWVkaWE6OkdldEF1ZGlvQ29kZWNGcm9tU3RyaW5nOwogdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6bWVkaWE6OkdldFRyYW5zZmVySWRGcm9tU3RyaW5nOwpAQCAtMzEzLDUgKzI0MCwzIEBACiAKICAgcmV0dXJuIENhblBsYXlNaW1lQW5kS2V5U3lzdGVtKG1pbWVfdHlwZSwga2V5X3N5c3RlbSk7CiB9Ci0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCA0CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvbWVkaWFfc3VwcG9ydF9pbnRlcm5hbC5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21lZGlhL21lZGlhX3N1cHBvcnRfaW50ZXJuYWwuaAppbmRleCBmZjQyZmQ2Li45NGQ3OGU4IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvbWVkaWFfc3VwcG9ydF9pbnRlcm5hbC5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZWRpYS9tZWRpYV9zdXBwb3J0X2ludGVybmFsLmgKQEAgLTE4LDEwICsxOCw2IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL21lZGlhLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9pbnRlcm5hbF9vbmx5LmgiCiAKLSNpZiBTQl9BUElfVkVSU0lPTiA8IDQKLSNlcnJvciAiSW5jb3JyZWN0IFNCX0FQSV9WRVJTSU9OIHRvIGluY2x1ZGUgbWVkaWFfc3VwcG9ydF9pbnRlcm5hbC5oIgotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IDQKLQogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21pY3JvcGhvbmUvbWljcm9waG9uZV9jbG9zZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9taWNyb3Bob25lL21pY3JvcGhvbmVfY2xvc2UuY2MKaW5kZXggOTUxOTE4OS4uYWMxY2JhNSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21pY3JvcGhvbmUvbWljcm9waG9uZV9jbG9zZS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWljcm9waG9uZS9taWNyb3Bob25lX2Nsb3NlLmNjCkBAIC0xNCwxMiArMTQsMTIgQEAKIAogI2luY2x1ZGUgInN0YXJib2FyZC9taWNyb3Bob25lLmgiCiAKLSNpZiBTQl9IQVMoTUlDUk9QSE9ORSkgJiYgU0JfQVBJX1ZFUlNJT04gPj0gMgotCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWljcm9waG9uZS9taWNyb3Bob25lX2ludGVybmFsLmgiCiAKKyNpZiAhU0JfSEFTKE1JQ1JPUEhPTkUpCisjZXJyb3IgIlNCX0hBU19NSUNST1BIT05FIG11c3QgYmUgc2V0IHRvIGJ1aWxkIHRoaXMgZmlsZS4iCisjZW5kaWYKKwogYm9vbCBTYk1pY3JvcGhvbmVDbG9zZShTYk1pY3JvcGhvbmUgbWljcm9waG9uZSkgewogICByZXR1cm4gU2JNaWNyb3Bob25lSXNWYWxpZChtaWNyb3Bob25lKSA/IG1pY3JvcGhvbmUtPkNsb3NlKCkgOiBmYWxzZTsKIH0KLQotI2VuZGlmICAvLyBTQl9IQVMoTUlDUk9QSE9ORSkgJiYgU0JfQVBJX1ZFUlNJT04gPj0gMgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21pY3JvcGhvbmUvbWljcm9waG9uZV9jcmVhdGUuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWljcm9waG9uZS9taWNyb3Bob25lX2NyZWF0ZS5jYwppbmRleCA5NjJhZjUwLi5jOGRhZjU0IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWljcm9waG9uZS9taWNyb3Bob25lX2NyZWF0ZS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWljcm9waG9uZS9taWNyb3Bob25lX2NyZWF0ZS5jYwpAQCAtMTQsMTUgKzE0LDE1IEBACiAKICNpbmNsdWRlICJzdGFyYm9hcmQvbWljcm9waG9uZS5oIgogCi0jaWYgU0JfSEFTKE1JQ1JPUEhPTkUpICYmIFNCX0FQSV9WRVJTSU9OID49IDIKLQogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21pY3JvcGhvbmUvbWljcm9waG9uZV9pbnRlcm5hbC5oIgogCisjaWYgIVNCX0hBUyhNSUNST1BIT05FKQorI2Vycm9yICJTQl9IQVNfTUlDUk9QSE9ORSBtdXN0IGJlIHNldCB0byBidWlsZCB0aGlzIGZpbGUuIgorI2VuZGlmCisKIFNiTWljcm9waG9uZSBTYk1pY3JvcGhvbmVDcmVhdGUoU2JNaWNyb3Bob25lSWQgaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVfcmF0ZV9pbl9oeiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlcl9zaXplKSB7CiAgIHJldHVybiBTYk1pY3JvcGhvbmVQcml2YXRlOjpDcmVhdGVNaWNyb3Bob25lKGlkLCBzYW1wbGVfcmF0ZV9pbl9oeiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX3NpemUpOwogfQotCi0jZW5kaWYgIC8vIFNCX0hBUyhNSUNST1BIT05FKSAmJiBTQl9BUElfVkVSU0lPTiA+PSAyCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWljcm9waG9uZS9taWNyb3Bob25lX2Rlc3Ryb3kuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWljcm9waG9uZS9taWNyb3Bob25lX2Rlc3Ryb3kuY2MKaW5kZXggNTllYzAyNS4uYTM5NzYwMCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21pY3JvcGhvbmUvbWljcm9waG9uZV9kZXN0cm95LmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9taWNyb3Bob25lL21pY3JvcGhvbmVfZGVzdHJveS5jYwpAQCAtMTQsMTIgKzE0LDEyIEBACiAKICNpbmNsdWRlICJzdGFyYm9hcmQvbWljcm9waG9uZS5oIgogCi0jaWYgU0JfSEFTKE1JQ1JPUEhPTkUpICYmIFNCX0FQSV9WRVJTSU9OID49IDIKLQogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21pY3JvcGhvbmUvbWljcm9waG9uZV9pbnRlcm5hbC5oIgogCisjaWYgIVNCX0hBUyhNSUNST1BIT05FKQorI2Vycm9yICJTQl9IQVNfTUlDUk9QSE9ORSBtdXN0IGJlIHNldCB0byBidWlsZCB0aGlzIGZpbGUuIgorI2VuZGlmCisKIHZvaWQgU2JNaWNyb3Bob25lRGVzdHJveShTYk1pY3JvcGhvbmUgbWljcm9waG9uZSkgewogICBTYk1pY3JvcGhvbmVQcml2YXRlOjpEZXN0cm95TWljcm9waG9uZShtaWNyb3Bob25lKTsKIH0KLQotI2VuZGlmICAvLyBTQl9IQVMoTUlDUk9QSE9ORSkgJiYgU0JfQVBJX1ZFUlNJT04gPj0gMgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21pY3JvcGhvbmUvbWljcm9waG9uZV9nZXRfYXZhaWxhYmxlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21pY3JvcGhvbmUvbWljcm9waG9uZV9nZXRfYXZhaWxhYmxlLmNjCmluZGV4IDU4ZmU0NzQuLmJhYWNkM2IgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9taWNyb3Bob25lL21pY3JvcGhvbmVfZ2V0X2F2YWlsYWJsZS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWljcm9waG9uZS9taWNyb3Bob25lX2dldF9hdmFpbGFibGUuY2MKQEAgLTE0LDE0ICsxNCwxNCBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL21pY3JvcGhvbmUuaCIKIAotI2lmIFNCX0hBUyhNSUNST1BIT05FKSAmJiBTQl9BUElfVkVSU0lPTiA+PSAyCi0KICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9taWNyb3Bob25lL21pY3JvcGhvbmVfaW50ZXJuYWwuaCIKIAorI2lmICFTQl9IQVMoTUlDUk9QSE9ORSkKKyNlcnJvciAiU0JfSEFTX01JQ1JPUEhPTkUgbXVzdCBiZSBzZXQgdG8gYnVpbGQgdGhpcyBmaWxlLiIKKyNlbmRpZgorCiBpbnQgU2JNaWNyb3Bob25lR2V0QXZhaWxhYmxlKFNiTWljcm9waG9uZUluZm8qIG91dF9pbmZvX2FycmF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5mb19hcnJheV9zaXplKSB7CiAgIHJldHVybiBTYk1pY3JvcGhvbmVQcml2YXRlOjpHZXRBdmFpbGFibGVNaWNyb3Bob25lcyhvdXRfaW5mb19hcnJheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fYXJyYXlfc2l6ZSk7CiB9Ci0KLSNlbmRpZiAgLy8gU0JfSEFTKE1JQ1JPUEhPTkUpICYmIFNCX0FQSV9WRVJTSU9OID49IDIKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9taWNyb3Bob25lL21pY3JvcGhvbmVfaW50ZXJuYWwuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9taWNyb3Bob25lL21pY3JvcGhvbmVfaW50ZXJuYWwuaAppbmRleCA0ODk1ZGE1Li5mZDA1NTU3IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWljcm9waG9uZS9taWNyb3Bob25lX2ludGVybmFsLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21pY3JvcGhvbmUvbWljcm9waG9uZV9pbnRlcm5hbC5oCkBAIC0xOCw3ICsxOCw5IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL21pY3JvcGhvbmUuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL2ludGVybmFsX29ubHkuaCIKIAotI2lmIFNCX0hBUyhNSUNST1BIT05FKSAmJiBTQl9BUElfVkVSU0lPTiA+PSAyCisjaWYgIVNCX0hBUyhNSUNST1BIT05FKQorI2Vycm9yICJTQl9IQVNfTUlDUk9QSE9ORSBtdXN0IGJlIHNldCB0byBpbmNsdWRlIHRoaXMgZmlsZS4iCisjZW5kaWYKIAogc3RydWN0IFNiTWljcm9waG9uZVByaXZhdGUgewogICB2aXJ0dWFsIH5TYk1pY3JvcGhvbmVQcml2YXRlKCkge30KQEAgLTM2LDYgKzM4LDQgQEAKICAgc3RhdGljIHZvaWQgRGVzdHJveU1pY3JvcGhvbmUoU2JNaWNyb3Bob25lIG1pY3JvcGhvbmUpOwogfTsKIAotI2VuZGlmICAvLyBTQl9IQVMoTUlDUk9QSE9ORSkgJiYgU0JfQVBJX1ZFUlNJT04gPj0gMgotCiAjZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfU1RBUkJPQVJEX01JQ1JPUEhPTkVfTUlDUk9QSE9ORV9JTlRFUk5BTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21pY3JvcGhvbmUvbWljcm9waG9uZV9pc19zYW1wbGVfcmF0ZV9zdXBwb3J0ZWQuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWljcm9waG9uZS9taWNyb3Bob25lX2lzX3NhbXBsZV9yYXRlX3N1cHBvcnRlZC5jYwppbmRleCAyMTU0YTBiLi5kNGNhOTYzIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWljcm9waG9uZS9taWNyb3Bob25lX2lzX3NhbXBsZV9yYXRlX3N1cHBvcnRlZC5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWljcm9waG9uZS9taWNyb3Bob25lX2lzX3NhbXBsZV9yYXRlX3N1cHBvcnRlZC5jYwpAQCAtMTQsMTQgKzE0LDE0IEBACiAKICNpbmNsdWRlICJzdGFyYm9hcmQvbWljcm9waG9uZS5oIgogCi0jaWYgU0JfSEFTKE1JQ1JPUEhPTkUpICYmIFNCX0FQSV9WRVJTSU9OID49IDIKLQogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21pY3JvcGhvbmUvbWljcm9waG9uZV9pbnRlcm5hbC5oIgogCisjaWYgIVNCX0hBUyhNSUNST1BIT05FKQorI2Vycm9yICJTQl9IQVNfTUlDUk9QSE9ORSBtdXN0IGJlIHNldCB0byBidWlsZCB0aGlzIGZpbGUuIgorI2VuZGlmCisKIGJvb2wgU2JNaWNyb3Bob25lSXNTYW1wbGVSYXRlU3VwcG9ydGVkKFNiTWljcm9waG9uZUlkIGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZV9yYXRlX2luX2h6KSB7CiAgIHJldHVybiBTYk1pY3JvcGhvbmVQcml2YXRlOjpJc01pY3JvcGhvbmVTYW1wbGVSYXRlU3VwcG9ydGVkKAogICAgICAgaWQsIHNhbXBsZV9yYXRlX2luX2h6KTsKIH0KLQotI2VuZGlmICAvLyBTQl9IQVMoTUlDUk9QSE9ORSkgJiYgU0JfQVBJX1ZFUlNJT04gPj0gMgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21pY3JvcGhvbmUvbWljcm9waG9uZV9vcGVuLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21pY3JvcGhvbmUvbWljcm9waG9uZV9vcGVuLmNjCmluZGV4IDQwNDJjNzYuLjBmMjFmN2YgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9taWNyb3Bob25lL21pY3JvcGhvbmVfb3Blbi5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWljcm9waG9uZS9taWNyb3Bob25lX29wZW4uY2MKQEAgLTE0LDEyICsxNCwxMiBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL21pY3JvcGhvbmUuaCIKIAotI2lmIFNCX0hBUyhNSUNST1BIT05FKSAmJiBTQl9BUElfVkVSU0lPTiA+PSAyCi0KICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9taWNyb3Bob25lL21pY3JvcGhvbmVfaW50ZXJuYWwuaCIKIAorI2lmICFTQl9IQVMoTUlDUk9QSE9ORSkKKyNlcnJvciAiU0JfSEFTX01JQ1JPUEhPTkUgbXVzdCBiZSBzZXQgdG8gYnVpbGQgdGhpcyBmaWxlLiIKKyNlbmRpZgorCiBib29sIFNiTWljcm9waG9uZU9wZW4oU2JNaWNyb3Bob25lIG1pY3JvcGhvbmUpIHsKICAgcmV0dXJuIFNiTWljcm9waG9uZUlzVmFsaWQobWljcm9waG9uZSkgPyBtaWNyb3Bob25lLT5PcGVuKCkgOiBmYWxzZTsKIH0KLQotI2VuZGlmICAvLyBTQl9IQVMoTUlDUk9QSE9ORSkgJiYgU0JfQVBJX1ZFUlNJT04gPj0gMgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21pY3JvcGhvbmUvbWljcm9waG9uZV9yZWFkLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21pY3JvcGhvbmUvbWljcm9waG9uZV9yZWFkLmNjCmluZGV4IDFmYmZjZTYuLjBlYWMzZGIgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9taWNyb3Bob25lL21pY3JvcGhvbmVfcmVhZC5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWljcm9waG9uZS9taWNyb3Bob25lX3JlYWQuY2MKQEAgLTE0LDEwICsxNCwxMiBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL21pY3JvcGhvbmUuaCIKIAotI2lmIFNCX0hBUyhNSUNST1BIT05FKSAmJiBTQl9BUElfVkVSU0lPTiA+PSAyCi0KICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9taWNyb3Bob25lL21pY3JvcGhvbmVfaW50ZXJuYWwuaCIKIAorI2lmICFTQl9IQVMoTUlDUk9QSE9ORSkKKyNlcnJvciAiU0JfSEFTX01JQ1JPUEhPTkUgbXVzdCBiZSBzZXQgdG8gYnVpbGQgdGhpcyBmaWxlLiIKKyNlbmRpZgorCiBpbnQgU2JNaWNyb3Bob25lUmVhZChTYk1pY3JvcGhvbmUgbWljcm9waG9uZSwKICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIG91dF9hdWRpb19kYXRhLAogICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvX2RhdGFfc2l6ZSkgewpAQCAtMjUsNSArMjcsMyBAQAogICAgICAgICAgICAgID8gbWljcm9waG9uZS0+UmVhZChvdXRfYXVkaW9fZGF0YSwgYXVkaW9fZGF0YV9zaXplKQogICAgICAgICAgICAgIDogLTE7CiB9Ci0KLSNlbmRpZiAgLy8gU0JfSEFTKE1JQ1JPUEhPTkUpICYmIFNCX0FQSV9WRVJTSU9OID49IDIKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX2ZyYW1lX3RyYWNrZXIuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX2ZyYW1lX3RyYWNrZXIuaAppbmRleCA5N2JhZTViLi5iNjcyNzdkIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19mcmFtZV90cmFja2VyLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fZnJhbWVfdHJhY2tlci5oCkBAIC0xNyw2ICsxNyw3IEBACiAKICNpbmNsdWRlIDxxdWV1ZT4KIAorI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vc2NvcGVkX3B0ci5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvbWVkaWEuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL2ludGVybmFsX29ubHkuaCIKQEAgLTM2LDIxICszNywxOCBAQAogY2xhc3MgQXVkaW9GcmFtZVRyYWNrZXIgewogIHB1YmxpYzoKICAgQXVkaW9GcmFtZVRyYWNrZXIoKSB7IFJlc2V0KCk7IH0KKyAgdmlydHVhbCB+QXVkaW9GcmFtZVRyYWNrZXIoKSB7fQogCiAgIC8vIFJlc2V0IHRoZSBjbGFzcyB0byBpdHMgaW5pdGlhbCBzdGF0ZS4gIEluIHRoaXMgc3RhdGUgdGhlcmUgaXMgbm8gZnJhbWVzCiAgIC8vIHRyYWNrZWQgYW5kIHRoZSBwbGF5YmFjayBmcmFtZXMgaXMgMC4KLSAgdm9pZCBSZXNldCgpIHsKLSAgICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0KKyAgdmlydHVhbCB2b2lkIFJlc2V0KCkgewogICAgIHdoaWxlICghZnJhbWVfcmVjb3Jkc18uZW1wdHkoKSkgewogICAgICAgZnJhbWVfcmVjb3Jkc18ucG9wKCk7CiAgICAgfQogICAgIGZyYW1lc19wbGF5ZWRfYWRqdXN0ZWRfdG9fcGxheWJhY2tfcmF0ZV8gPSAwOwogICB9CiAKLSAgdm9pZCBBZGRGcmFtZXMoaW50IG51bWJlcl9vZl9mcmFtZXMsIGRvdWJsZSBwbGF5YmFja19yYXRlKSB7Ci0gICAgU0JfRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotCisgIHZpcnR1YWwgdm9pZCBBZGRGcmFtZXMoaW50IG51bWJlcl9vZl9mcmFtZXMsIGRvdWJsZSBwbGF5YmFja19yYXRlKSB7CiAgICAgaWYgKG51bWJlcl9vZl9mcmFtZXMgPT0gMCkgewogICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTY1LDkgKzYzLDcgQEAKICAgICB9CiAgIH0KIAotICB2b2lkIFJlY29yZFBsYXllZEZyYW1lcyhpbnQgbnVtYmVyX29mX2ZyYW1lcykgewotICAgIFNCX0RDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLQorICB2aXJ0dWFsIHZvaWQgUmVjb3JkUGxheWVkRnJhbWVzKGludCBudW1iZXJfb2ZfZnJhbWVzKSB7CiAgICAgd2hpbGUgKG51bWJlcl9vZl9mcmFtZXMgPiAwICYmICFmcmFtZV9yZWNvcmRzXy5lbXB0eSgpKSB7CiAgICAgICBGcmFtZVJlY29yZCYgcmVjb3JkID0gZnJhbWVfcmVjb3Jkc18uZnJvbnQoKTsKICAgICAgIGlmIChyZWNvcmQubnVtYmVyX29mX2ZyYW1lcyA+IG51bWJlcl9vZl9mcmFtZXMpIHsKQEAgLTg2LDIzICs4Miw1MCBAQAogICAgICAgICA8PCBudW1iZXJfb2ZfZnJhbWVzIDw8ICIgIiA8PCBmcmFtZV9yZWNvcmRzXy5zaXplKCk7CiAgIH0KIAotICBTYk1lZGlhVGltZSBHZXRGcmFtZVBsYXllZEFkanVzdGVkVG9QbGF5YmFja1JhdGUoKSBjb25zdCB7Ci0gICAgU0JfRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotCisgIHZpcnR1YWwgU2JNZWRpYVRpbWUgR2V0RnJhbWVzUGxheWVkQWRqdXN0ZWRUb1BsYXliYWNrUmF0ZSgpIGNvbnN0IHsKICAgICByZXR1cm4gZnJhbWVzX3BsYXllZF9hZGp1c3RlZF90b19wbGF5YmFja19yYXRlXzsKICAgfQogCi0gcHJpdmF0ZToKKyBwcm90ZWN0ZWQ6CiAgIHN0cnVjdCBGcmFtZVJlY29yZCB7CiAgICAgaW50IG51bWJlcl9vZl9mcmFtZXM7CiAgICAgZG91YmxlIHBsYXliYWNrX3JhdGU7CiAgIH07CiAKLSAgVGhyZWFkQ2hlY2tlciB0aHJlYWRfY2hlY2tlcl87CiAgIHN0ZDo6cXVldWU8RnJhbWVSZWNvcmQ+IGZyYW1lX3JlY29yZHNfOwogICBpbnQgZnJhbWVzX3BsYXllZF9hZGp1c3RlZF90b19wbGF5YmFja19yYXRlXzsKIH07CiAKKy8vIEEgc3BlY2lhbGl6YXRpb24gb2YgfEF1ZGlvRnJhbWVUcmFja2VyfCB0aGF0IGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZQorLy8gdGhyZWFkIHRoYXQgaXQgd2FzIGNyZWF0ZWQgb24sIGFuZCB3aWxsIGFzc2VydCB0aGlzIGluIGRlYnVnIGJ1aWxkcy4KK2NsYXNzIFNpbmdsZVRocmVhZGVkQXVkaW9GcmFtZVRyYWNrZXIgOiBwdWJsaWMgQXVkaW9GcmFtZVRyYWNrZXIgeworIHB1YmxpYzoKKyAgLy8gUmVzZXQgdGhlIGNsYXNzIHRvIGl0cyBpbml0aWFsIHN0YXRlLiAgSW4gdGhpcyBzdGF0ZSB0aGVyZSBpcyBubyBmcmFtZXMKKyAgLy8gdHJhY2tlZCBhbmQgdGhlIHBsYXliYWNrIGZyYW1lcyBpcyAwLgorICB2b2lkIFJlc2V0KCkgU0JfT1ZFUlJJREUgeworICAgIFNCX0RDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKKyAgICBBdWRpb0ZyYW1lVHJhY2tlcjo6UmVzZXQoKTsKKyAgfQorCisgIHZvaWQgQWRkRnJhbWVzKGludCBudW1iZXJfb2ZfZnJhbWVzLCBkb3VibGUgcGxheWJhY2tfcmF0ZSkgU0JfT1ZFUlJJREUgeworICAgIFNCX0RDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKKyAgICBBdWRpb0ZyYW1lVHJhY2tlcjo6QWRkRnJhbWVzKG51bWJlcl9vZl9mcmFtZXMsIHBsYXliYWNrX3JhdGUpOworICB9CisKKyAgdm9pZCBSZWNvcmRQbGF5ZWRGcmFtZXMoaW50IG51bWJlcl9vZl9mcmFtZXMpIFNCX09WRVJSSURFIHsKKyAgICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CisgICAgQXVkaW9GcmFtZVRyYWNrZXI6OlJlY29yZFBsYXllZEZyYW1lcyhudW1iZXJfb2ZfZnJhbWVzKTsKKyAgfQorCisgIFNiTWVkaWFUaW1lIEdldEZyYW1lc1BsYXllZEFkanVzdGVkVG9QbGF5YmFja1JhdGUoKSBjb25zdCBTQl9PVkVSUklERSB7CisgICAgU0JfRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOworICAgIHJldHVybiBBdWRpb0ZyYW1lVHJhY2tlcjo6R2V0RnJhbWVzUGxheWVkQWRqdXN0ZWRUb1BsYXliYWNrUmF0ZSgpOworICB9CisKKyBwcml2YXRlOgorICBUaHJlYWRDaGVja2VyIHRocmVhZF9jaGVja2VyXzsKK307CisKIH0gIC8vIG5hbWVzcGFjZSBmaWx0ZXIKIH0gIC8vIG5hbWVzcGFjZSBwbGF5ZXIKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3JlbmRlcmVyX2ltcGxfaW50ZXJuYWwuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9pbXBsX2ludGVybmFsLmNjCmluZGV4IDllNjM5NjcuLjJhZDU0MTUgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3JlbmRlcmVyX2ltcGxfaW50ZXJuYWwuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfaW1wbF9pbnRlcm5hbC5jYwpAQCAtNjQsOCArNjQsMTAgQEAKIAogfSAgLy8gbmFtZXNwYWNlCiAKLUF1ZGlvUmVuZGVyZXJJbXBsOjpBdWRpb1JlbmRlcmVySW1wbChzY29wZWRfcHRyPEF1ZGlvRGVjb2Rlcj4gZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTYk1lZGlhQXVkaW9IZWFkZXImIGF1ZGlvX2hlYWRlcikKK0F1ZGlvUmVuZGVyZXJJbXBsOjpBdWRpb1JlbmRlcmVySW1wbCgKKyAgICBzY29wZWRfcHRyPEF1ZGlvRGVjb2Rlcj4gZGVjb2RlciwKKyAgICBjb25zdCBTYk1lZGlhQXVkaW9IZWFkZXImIGF1ZGlvX2hlYWRlciwKKyAgICBzY29wZWRfcHRyPEF1ZGlvRnJhbWVUcmFja2VyPiBhdWRpb19mcmFtZV90cmFja2VyKQogICAgIDogZW9zX3N0YXRlXyhrRU9TTm90UmVjZWl2ZWQpLAogICAgICAgY2hhbm5lbHNfKGF1ZGlvX2hlYWRlci5udW1iZXJfb2ZfY2hhbm5lbHMpLAogICAgICAgc2lua19zYW1wbGVfdHlwZV8oR2V0U2lua0F1ZGlvU2FtcGxlVHlwZSgpKSwKQEAgLTg0LDcgKzg2LDggQEAKICAgICAgIGF1ZGlvX3NpbmtfKGtTYkF1ZGlvU2lua0ludmFsaWQpLAogICAgICAgY2FuX2FjY2VwdF9tb3JlX2RhdGFfKHRydWUpLAogICAgICAgcHJvY2Vzc19hdWRpb19kYXRhX3NjaGVkdWxlZF8oZmFsc2UpLAotICAgICAgZGVjb2Rlcl9uZWVkc19mdWxsX3Jlc2V0XyhmYWxzZSkgeworICAgICAgZGVjb2Rlcl9uZWVkc19mdWxsX3Jlc2V0XyhmYWxzZSksCisgICAgICBhdWRpb19mcmFtZV90cmFja2VyXyhhdWRpb19mcmFtZV90cmFja2VyLlBhc3MoKSkgewogICBTQl9EQ0hFQ0soZGVjb2Rlcl8gIT0gTlVMTCk7CiAKICAgZnJhbWVfYnVmZmVyc19bMF0gPSAmZnJhbWVfYnVmZmVyX1swXTsKQEAgLTE2NSw3ICsxNjgsNiBAQAogICBwYXVzZWRfLnN0b3JlKHRydWUpOwogfQogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogdm9pZCBBdWRpb1JlbmRlcmVySW1wbDo6U2V0UGxheWJhY2tSYXRlKGRvdWJsZSBwbGF5YmFja19yYXRlKSB7CiAgIFNCX0RDSEVDSyhCZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwogCkBAIC0xNzcsNyArMTc5LDYgQEAKICAgICBhdWRpb19zaW5rXy0+U2V0UGxheWJhY2tSYXRlKHBsYXliYWNrX3JhdGVfID4gMC4wID8gMS4wIDogMC4wKTsKICAgfQogfQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiAKIHZvaWQgQXVkaW9SZW5kZXJlckltcGw6OlNldFZvbHVtZShkb3VibGUgdm9sdW1lKSB7CiAgIFNCX0RDSEVDSyhCZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwpAQCAtMjA5LDcgKzIxMCw3IEBACiAgIGZyYW1lc19jb25zdW1lZF9ieV9zaW5rXy5zdG9yZSgwKTsKICAgZnJhbWVzX2NvbnN1bWVkX2J5X3Npbmtfc2luY2VfbGFzdF9nZXRfY3VycmVudF90aW1lXy5zdG9yZSgwKTsKICAgcGVuZGluZ19kZWNvZGVyX291dHB1dHNfID0gMDsKLSAgYXVkaW9fZnJhbWVfdHJhY2tlcl8uUmVzZXQoKTsKKyAgYXVkaW9fZnJhbWVfdHJhY2tlcl8tPlJlc2V0KCk7CiAgIGZyYW1lc19jb25zdW1lZF9zZXRfYXRfLnN0b3JlKFNiVGltZUdldE1vbm90b25pY05vdygpKTsKICAgY2FuX2FjY2VwdF9tb3JlX2RhdGFfID0gdHJ1ZTsKICAgcHJvY2Vzc19hdWRpb19kYXRhX3NjaGVkdWxlZF8gPSBmYWxzZTsKQEAgLTI1MiwxMSArMjUzLDExIEBACiAgICAgcmV0dXJuIHNlZWtpbmdfdG9fcHRzXzsKICAgfQogCi0gIGF1ZGlvX2ZyYW1lX3RyYWNrZXJfLlJlY29yZFBsYXllZEZyYW1lcygKKyAgYXVkaW9fZnJhbWVfdHJhY2tlcl8tPlJlY29yZFBsYXllZEZyYW1lcygKICAgICAgIGZyYW1lc19jb25zdW1lZF9ieV9zaW5rX3NpbmNlX2xhc3RfZ2V0X2N1cnJlbnRfdGltZV8uZXhjaGFuZ2UoMCkpOwogCiAgIHJldHVybiBzZWVraW5nX3RvX3B0c18gKwotICAgICAgICAgYXVkaW9fZnJhbWVfdHJhY2tlcl8uR2V0RnJhbWVQbGF5ZWRBZGp1c3RlZFRvUGxheWJhY2tSYXRlKCkgKgorICAgICAgICAgYXVkaW9fZnJhbWVfdHJhY2tlcl8tPkdldEZyYW1lc1BsYXllZEFkanVzdGVkVG9QbGF5YmFja1JhdGUoKSAqCiAgICAgICAgICAgICAga1NiTWVkaWFUaW1lU2Vjb25kIC8gZGVjb2Rlcl8tPkdldFNhbXBsZXNQZXJTZWNvbmQoKTsKIH0KIApAQCAtMjkxLDExICsyOTIsOSBAQAogICAgICAgJkF1ZGlvUmVuZGVyZXJJbXBsOjpDb25zdW1lRnJhbWVzRnVuYywgdGhpcyk7CiAgIFNCX0RDSEVDSyhTYkF1ZGlvU2lua0lzVmFsaWQoYXVkaW9fc2lua18pKTsKIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgLy8gVE9ETzogUmVtb3ZlIFNldFBsYXliYWNrUmF0ZSgpIHN1cHBvcnQgZnJvbSBhdWRpbyBzaW5rIGFzIGl0IG9ubHkgbmVlZCB0bwogICAvLyBzdXBwb3J0IHBsYXkvcGF1c2UuCiAgIGF1ZGlvX3NpbmtfLT5TZXRQbGF5YmFja1JhdGUocGxheWJhY2tfcmF0ZV8gPiAwLjAgPyAxLjAgOiAwLjApOwotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiAgIGF1ZGlvX3NpbmtfLT5TZXRWb2x1bWUodm9sdW1lXyk7CiB9CiAKQEAgLTQ1OCw4ICs0NTcsOCBAQAogICBpZiAoZGVjb2RlZF9hdWRpby0+ZnJhbWVzKCkgPT0gMCAmJiBlb3Nfc3RhdGVfLmxvYWQoKSA9PSBrRU9TRGVjb2RlZCkgewogICAgIGVvc19zdGF0ZV8uc3RvcmUoa0VPU1NlbnRUb1NpbmspOwogICB9Ci0gIGF1ZGlvX2ZyYW1lX3RyYWNrZXJfLkFkZEZyYW1lcyhkZWNvZGVkX2F1ZGlvLT5mcmFtZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrX3JhdGVfdG9fZmlsbCk7CisgIGF1ZGlvX2ZyYW1lX3RyYWNrZXJfLT5BZGRGcmFtZXMoZGVjb2RlZF9hdWRpby0+ZnJhbWVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tfcmF0ZV90b19maWxsKTsKICAgLy8gVE9ETzogU3VwcG9ydCBrU2JNZWRpYUF1ZGlvRnJhbWVTdG9yYWdlVHlwZVBsYW5hci4KICAgZGVjb2RlZF9hdWRpby0+U3dpdGNoRm9ybWF0VG8oc2lua19zYW1wbGVfdHlwZV8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTYk1lZGlhQXVkaW9GcmFtZVN0b3JhZ2VUeXBlSW50ZXJsZWF2ZWQpOwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfaW1wbF9pbnRlcm5hbC5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfaW1wbF9pbnRlcm5hbC5oCmluZGV4IGE0NjkwMzcuLmYxYjc3MzAgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3JlbmRlcmVyX2ltcGxfaW50ZXJuYWwuaAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9pbXBsX2ludGVybmFsLmgKQEAgLTQ4LDggKzQ4LDEyIEBACiAgIC8vIGV4Y2VlZHMga1ByZXJvbGxUaW1lIG9yIGlmIEVPUyBpcyByZWFjaGVkLgogICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQcmVyb2xsVGltZSA9IGtTYlRpbWVTZWNvbmQgLyA0OwogCi0gIEF1ZGlvUmVuZGVyZXJJbXBsKHNjb3BlZF9wdHI8QXVkaW9EZWNvZGVyPiBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBTYk1lZGlhQXVkaW9IZWFkZXImIGF1ZGlvX2hlYWRlcik7CisgIEF1ZGlvUmVuZGVyZXJJbXBsKAorICAgICAgc2NvcGVkX3B0cjxBdWRpb0RlY29kZXI+IGRlY29kZXIsCisgICAgICBjb25zdCBTYk1lZGlhQXVkaW9IZWFkZXImIGF1ZGlvX2hlYWRlciwKKyAgICAgIHNjb3BlZF9wdHI8QXVkaW9GcmFtZVRyYWNrZXI+IGF1ZGlvX2ZyYW1lX3RyYWNrZXIgPQorICAgICAgICAgIHNjb3BlZF9wdHI8QXVkaW9GcmFtZVRyYWNrZXI+KG5ldyBTaW5nbGVUaHJlYWRlZEF1ZGlvRnJhbWVUcmFja2VyKCkpCisgICAgICAgICAgICAgIC5QYXNzKCkpOwogICB+QXVkaW9SZW5kZXJlckltcGwoKSBTQl9PVkVSUklERTsKIAogICB2b2lkIFdyaXRlU2FtcGxlKGNvbnN0IHNjb3BlZF9yZWZwdHI8SW5wdXRCdWZmZXI+JiBpbnB1dF9idWZmZXIpIFNCX09WRVJSSURFOwpAQCAtNTcsOSArNjEsNyBAQAogCiAgIHZvaWQgUGxheSgpIFNCX09WRVJSSURFOwogICB2b2lkIFBhdXNlKCkgU0JfT1ZFUlJJREU7Ci0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICB2b2lkIFNldFBsYXliYWNrUmF0ZShkb3VibGUgcGxheWJhY2tfcmF0ZSkgU0JfT1ZFUlJJREU7Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKICAgdm9pZCBTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgU0JfT1ZFUlJJREU7CiAgIHZvaWQgU2VlayhTYk1lZGlhVGltZSBzZWVrX3RvX3B0cykgU0JfT1ZFUlJJREU7CiAKQEAgLTcxLDYgKzczLDIxIEBACiAgIGJvb2wgSXNTZWVraW5nSW5Qcm9ncmVzcygpIGNvbnN0IFNCX09WRVJSSURFOwogICBTYk1lZGlhVGltZSBHZXRDdXJyZW50VGltZSgpIFNCX09WRVJSSURFOwogCisgcHJvdGVjdGVkOgorICBhdG9taWNfYm9vbCBwYXVzZWRfOworICBhdG9taWNfYm9vbCBzZWVraW5nXzsKKyAgU2JNZWRpYVRpbWUgc2Vla2luZ190b19wdHNfOworICBzY29wZWRfcHRyPEF1ZGlvRnJhbWVUcmFja2VyPiBhdWRpb19mcmFtZV90cmFja2VyXzsKKworICBhdG9taWNfaW50NjRfdCBmcmFtZXNfc2VudF90b19zaW5rXzsKKyAgYXRvbWljX2ludDY0X3QgZnJhbWVzX2NvbnN1bWVkX2J5X3NpbmtfOworICBhdG9taWNfaW50MzJfdCBmcmFtZXNfY29uc3VtZWRfYnlfc2lua19zaW5jZV9sYXN0X2dldF9jdXJyZW50X3RpbWVfOworCisgIHNjb3BlZF9wdHI8QXVkaW9EZWNvZGVyPiBkZWNvZGVyXzsKKworICBhdG9taWNfaW50NjRfdCBmcmFtZXNfY29uc3VtZWRfc2V0X2F0XzsKKyAgZG91YmxlIHBsYXliYWNrX3JhdGVfOworCiAgcHJpdmF0ZToKICAgZW51bSBFT1NTdGF0ZSB7CiAgICAga0VPU05vdFJlY2VpdmVkLApAQCAtMTE3LDI1ICsxMzQsMTQgQEAKIAogICBzY29wZWRfcHRyPEF1ZGlvUmVzYW1wbGVyPiByZXNhbXBsZXJfOwogICBBdWRpb1RpbWVTdHJldGNoZXIgdGltZV9zdHJldGNoZXJfOwotICBkb3VibGUgcGxheWJhY2tfcmF0ZV87CiAgIGRvdWJsZSB2b2x1bWVfOwogCi0gIGF0b21pY19ib29sIHBhdXNlZF87Ci0gIGF0b21pY19ib29sIHNlZWtpbmdfOwotICBTYk1lZGlhVGltZSBzZWVraW5nX3RvX3B0c187Ci0KICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZnJhbWVfYnVmZmVyXzsKICAgdWludDhfdCogZnJhbWVfYnVmZmVyc19bMV07Ci0gIGF0b21pY19pbnQ2NF90IGZyYW1lc19zZW50X3RvX3NpbmtfOwotICBhdG9taWNfaW50NjRfdCBmcmFtZXNfY29uc3VtZWRfYnlfc2lua187Ci0gIGF0b21pY19pbnQzMl90IGZyYW1lc19jb25zdW1lZF9ieV9zaW5rX3NpbmNlX2xhc3RfZ2V0X2N1cnJlbnRfdGltZV87CiAKICAgaW50MzJfdCBwZW5kaW5nX2RlY29kZXJfb3V0cHV0c187Ci0gIEF1ZGlvRnJhbWVUcmFja2VyIGF1ZGlvX2ZyYW1lX3RyYWNrZXJfOwotICBhdG9taWNfaW50NjRfdCBmcmFtZXNfY29uc3VtZWRfc2V0X2F0XzsKICAgQ2xvc3VyZSBsb2dfZnJhbWVzX2NvbnN1bWVkX2Nsb3N1cmVfOwogCi0gIHNjb3BlZF9wdHI8QXVkaW9EZWNvZGVyPiBkZWNvZGVyXzsKICAgU2JBdWRpb1NpbmsgYXVkaW9fc2lua187CiAKICAgYm9vbCBjYW5fYWNjZXB0X21vcmVfZGF0YV87CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9pbnRlcm5hbC5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfaW50ZXJuYWwuaAppbmRleCBhNmNhNjRiLi43ZjBhZTdmIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9pbnRlcm5hbC5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3JlbmRlcmVyX2ludGVybmFsLmgKQEAgLTM1LDkgKzM1LDcgQEAKICAgdmlydHVhbCB2b2lkIFdyaXRlRW5kT2ZTdHJlYW0oKSA9IDA7CiAgIHZpcnR1YWwgdm9pZCBQbGF5KCkgPSAwOwogICB2aXJ0dWFsIHZvaWQgUGF1c2UoKSA9IDA7Ci0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICB2aXJ0dWFsIHZvaWQgU2V0UGxheWJhY2tSYXRlKGRvdWJsZSBwbGF5YmFja19yYXRlKSA9IDA7Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKICAgdmlydHVhbCB2b2lkIFNldFZvbHVtZShkb3VibGUgdm9sdW1lKSA9IDA7CiAgIHZpcnR1YWwgdm9pZCBTZWVrKFNiTWVkaWFUaW1lIHNlZWtfdG9fcHRzKSA9IDA7CiAgIHZpcnR1YWwgYm9vbCBJc0VuZE9mU3RyZWFtV3JpdHRlbigpIGNvbnN0ID0gMDsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2ZpbHRlcl9iYXNlZF9wbGF5ZXJfd29ya2VyX2hhbmRsZXIuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9maWx0ZXJfYmFzZWRfcGxheWVyX3dvcmtlcl9oYW5kbGVyLmNjCmluZGV4IGMzNzNkOTAuLjY4ODJmNGEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2ZpbHRlcl9iYXNlZF9wbGF5ZXJfd29ya2VyX2hhbmRsZXIuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvZmlsdGVyX2Jhc2VkX3BsYXllcl93b3JrZXJfaGFuZGxlci5jYwpAQCAtNDIsMTYgKzQyLDkgQEAKICAgICBTYk1lZGlhVmlkZW9Db2RlYyB2aWRlb19jb2RlYywKICAgICBTYk1lZGlhQXVkaW9Db2RlYyBhdWRpb19jb2RlYywKICAgICBTYkRybVN5c3RlbSBkcm1fc3lzdGVtLAotICAgIGNvbnN0IFNiTWVkaWFBdWRpb0hlYWRlciYgYXVkaW9faGVhZGVyCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAotICAgICwKKyAgICBjb25zdCBTYk1lZGlhQXVkaW9IZWFkZXImIGF1ZGlvX2hlYWRlciwKICAgICBTYlBsYXllck91dHB1dE1vZGUgb3V0cHV0X21vZGUsCi0gICAgU2JEZWNvZGVUYXJnZXRHcmFwaGljc0NvbnRleHRQcm92aWRlciogcHJvdmlkZXIKLSNlbGlmIFNCX0FQSV9WRVJTSU9OID49IDMKLSAgICAsCi0gICAgU2JEZWNvZGVUYXJnZXRQcm92aWRlciogcHJvdmlkZXIKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAotICAgICkKKyAgICBTYkRlY29kZVRhcmdldEdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKiBwcm92aWRlcikKICAgICA6IHBsYXllcl93b3JrZXJfKE5VTEwpLAogICAgICAgam9iX3F1ZXVlXyhOVUxMKSwKICAgICAgIHBsYXllcl8oa1NiUGxheWVySW52YWxpZCksCkBAIC02MywxOSArNTYsMTAgQEAKICAgICAgIGRybV9zeXN0ZW1fKGRybV9zeXN0ZW0pLAogICAgICAgYXVkaW9faGVhZGVyXyhhdWRpb19oZWFkZXIpLAogICAgICAgcGF1c2VkXyhmYWxzZSksCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICAgICAgcGxheWJhY2tfcmF0ZV8oMS4wKSwKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAotICAgICAgdm9sdW1lXygxLjApCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAotICAgICAgLAorICAgICAgdm9sdW1lXygxLjApLAogICAgICAgb3V0cHV0X21vZGVfKG91dHB1dF9tb2RlKSwKLSAgICAgIGRlY29kZV90YXJnZXRfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8ocHJvdmlkZXIpCi0jZWxpZiBTQl9BUElfVkVSU0lPTiA+PSAzCi0gICAgICAsCi0gICAgICBkZWNvZGVfdGFyZ2V0X3Byb3ZpZGVyXyhwcm92aWRlcikKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAoteworICAgICAgZGVjb2RlX3RhcmdldF9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXyhwcm92aWRlcikgewogI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0FVRElPX1NQRUNJRklDX0NPTkZJR19BU19QT0lOVEVSCiAgIGlmIChhdWRpb19oZWFkZXJfLmF1ZGlvX3NwZWNpZmljX2NvbmZpZ19zaXplID4gMCkgewogICAgIGF1ZGlvX3NwZWNpZmljX2NvbmZpZ18ucmVzZXQoCkBAIC05MiwxMSArNzYsNyBAQAogfQogCiBib29sIEZpbHRlckJhc2VkUGxheWVyV29ya2VySGFuZGxlcjo6SXNQdW5jaG91dE1vZGUoKSBjb25zdCB7Ci0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICByZXR1cm4gKG91dHB1dF9tb2RlXyA9PSBrU2JQbGF5ZXJPdXRwdXRNb2RlUHVuY2hPdXQpOwotI2Vsc2UKLSAgcmV0dXJuIHRydWU7Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKIH0KIAogYm9vbCBGaWx0ZXJCYXNlZFBsYXllcldvcmtlckhhbmRsZXI6OkluaXQoCkBAIC0xMjcsMTYgKzEwNyw5IEBACiAKICAgQXVkaW9QYXJhbWV0ZXJzIGF1ZGlvX3BhcmFtZXRlcnMgPSB7YXVkaW9fY29kZWNfLCBhdWRpb19oZWFkZXJfLCBkcm1fc3lzdGVtXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iX3F1ZXVlX307Ci0gIFZpZGVvUGFyYW1ldGVycyB2aWRlb19wYXJhbWV0ZXJzID0gewotICAgIHZpZGVvX2NvZGVjXywKLSAgICBkcm1fc3lzdGVtXywKLSAgICBqb2JfcXVldWVfCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAotICAgICwKLSAgICBvdXRwdXRfbW9kZV8sCi0gICAgZGVjb2RlX3RhcmdldF9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXwotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0Ci0gIH07ICAgIC8vIE5PTElOVCh3aGl0ZXNwYWNlL3BhcmVucykKKyAgVmlkZW9QYXJhbWV0ZXJzIHZpZGVvX3BhcmFtZXRlcnMgPSB7dmlkZW9fY29kZWNfLCBkcm1fc3lzdGVtXywgam9iX3F1ZXVlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X21vZGVfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfdGFyZ2V0X2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJffTsKIAogICBzY29wZWRfcHRyPFBsYXllckNvbXBvbmVudHM+IG1lZGlhX2NvbXBvbmVudHMgPQogICAgICAgUGxheWVyQ29tcG9uZW50czo6Q3JlYXRlKGF1ZGlvX3BhcmFtZXRlcnMsIHZpZGVvX3BhcmFtZXRlcnMpOwpAQCAtMTQ4LDkgKzEyMSw3IEBACiAgIDo6c3RhcmJvYXJkOjpTY29wZWRMb2NrIGxvY2sodmlkZW9fcmVuZGVyZXJfZXhpc3RlbmNlX211dGV4Xyk7CiAgIG1lZGlhX2NvbXBvbmVudHMtPkdldFJlbmRlcmVycygmYXVkaW9fcmVuZGVyZXJfLCAmdmlkZW9fcmVuZGVyZXJfKTsKIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgYXVkaW9fcmVuZGVyZXJfLT5TZXRQbGF5YmFja1JhdGUocGxheWJhY2tfcmF0ZV8pOwotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiAgIGF1ZGlvX3JlbmRlcmVyXy0+U2V0Vm9sdW1lKHZvbHVtZV8pOwogCiAgIGpvYl9xdWV1ZV8tPlNjaGVkdWxlKHVwZGF0ZV9jbG9zdXJlXywga1VwZGF0ZUludGVydmFsKTsKQEAgLTI4MSw3ICsyNTIsNiBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKIGJvb2wgRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyOjpTZXRQbGF5YmFja1JhdGUoZG91YmxlIHBsYXliYWNrX3JhdGUpIHsKICAgU0JfRENIRUNLKGpvYl9xdWV1ZV8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CiAKQEAgLTI5NCw3ICsyNjQsNiBAQAogICBhdWRpb19yZW5kZXJlcl8tPlNldFBsYXliYWNrUmF0ZShwbGF5YmFja19yYXRlXyk7CiAgIHJldHVybiB0cnVlOwogfQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiAKIHZvaWQgRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyOjpTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgewogICBTQl9EQ0hFQ0soam9iX3F1ZXVlXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKQEAgLTM2Miw4ICszMzEsNiBAQAogdm9pZCBGaWx0ZXJCYXNlZFBsYXllcldvcmtlckhhbmRsZXI6OlN0b3AoKSB7CiAgIGpvYl9xdWV1ZV8tPlJlbW92ZSh1cGRhdGVfY2xvc3VyZV8pOwogCi0gIGF1ZGlvX3JlbmRlcmVyXy5yZXNldCgpOwotCiAgIHNjb3BlZF9wdHI8VmlkZW9SZW5kZXJlcj4gdmlkZW9fcmVuZGVyZXI7CiAgIHsKICAgICAvLyBTZXQgfHZpZGVvX3JlbmRlcmVyX3wgdG8gbnVsbCB3aXRoIHRoZSBsb2NrLCBidXQgd2UgYWN0dWFsbHkgZGVzdHJveQpAQCAtMzc1LDYgKzM0Miw4IEBACiAgIH0KICAgdmlkZW9fcmVuZGVyZXIucmVzZXQoKTsKIAorICBhdWRpb19yZW5kZXJlcl8ucmVzZXQoKTsKKwogICBpZiAoSXNQdW5jaG91dE1vZGUoKSkgewogICAgIC8vIENsZWFyIHRoZSB2aWRlbyBmcmFtZSBhcyB3ZSB0ZXJtaW5hdGUuCiAgICAgc2hhcmVkOjpzdGFyYm9hcmQ6OkFwcGxpY2F0aW9uOjpHZXQoKS0+SGFuZGxlRnJhbWUoCkBAIC0zODIsNyArMzUxLDYgQEAKICAgfQogfQogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogU2JEZWNvZGVUYXJnZXQgRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyOjpHZXRDdXJyZW50RGVjb2RlVGFyZ2V0KCkgewogICA6OnN0YXJib2FyZDo6U2NvcGVkTG9jayBsb2NrKHZpZGVvX3JlbmRlcmVyX2V4aXN0ZW5jZV9tdXRleF8pOwogCkBAIC0zOTIsNyArMzYwLDYgQEAKICAgICByZXR1cm4ga1NiRGVjb2RlVGFyZ2V0SW52YWxpZDsKICAgfQogfQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiAKIH0gIC8vIG5hbWVzcGFjZSBmaWx0ZXIKIH0gIC8vIG5hbWVzcGFjZSBwbGF5ZXIKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2ZpbHRlcl9iYXNlZF9wbGF5ZXJfd29ya2VyX2hhbmRsZXIuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2ZpbHRlcl9iYXNlZF9wbGF5ZXJfd29ya2VyX2hhbmRsZXIuaAppbmRleCAyMDY1NWNhLi5lZmNlZWFhIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9maWx0ZXJfYmFzZWRfcGxheWVyX3dvcmtlcl9oYW5kbGVyLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvZmlsdGVyX2Jhc2VkX3BsYXllcl93b3JrZXJfaGFuZGxlci5oCkBAIC0xNyw5ICsxNyw3IEBACiAKICNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3Njb3BlZF9wdHIuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgotI2lmIFNCX0FQSV9WRVJTSU9OID49IDMKICNpbmNsdWRlICJzdGFyYm9hcmQvZGVjb2RlX3RhcmdldC5oIgotI2VuZGlmCiAjaW5jbHVkZSAic3RhcmJvYXJkL21lZGlhLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3BsYXllci5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9jbG9zdXJlLmgiCkBAIC0zOCwxOSArMzYsMTMgQEAKIAogY2xhc3MgRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyIDogcHVibGljIFBsYXllcldvcmtlcjo6SGFuZGxlciB7CiAgcHVibGljOgotICBGaWx0ZXJCYXNlZFBsYXllcldvcmtlckhhbmRsZXIoU2JNZWRpYVZpZGVvQ29kZWMgdmlkZW9fY29kZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYk1lZGlhQXVkaW9Db2RlYyBhdWRpb19jb2RlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTYk1lZGlhQXVkaW9IZWFkZXImIGF1ZGlvX2hlYWRlcgotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiUGxheWVyT3V0cHV0TW9kZSBvdXRwdXRfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRGVjb2RlVGFyZ2V0R3JhcGhpY3NDb250ZXh0UHJvdmlkZXIqIHByb3ZpZGVyCi0jZWxpZiBTQl9BUElfVkVSU0lPTiA+PSAzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRlY29kZVRhcmdldFByb3ZpZGVyKiBwcm92aWRlcgotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7ICAvLyBOT0xJTlQod2hpdGVzcGFjZS9wYXJlbnMpCisgIEZpbHRlckJhc2VkUGxheWVyV29ya2VySGFuZGxlcigKKyAgICAgIFNiTWVkaWFWaWRlb0NvZGVjIHZpZGVvX2NvZGVjLAorICAgICAgU2JNZWRpYUF1ZGlvQ29kZWMgYXVkaW9fY29kZWMsCisgICAgICBTYkRybVN5c3RlbSBkcm1fc3lzdGVtLAorICAgICAgY29uc3QgU2JNZWRpYUF1ZGlvSGVhZGVyJiBhdWRpb19oZWFkZXIsCisgICAgICBTYlBsYXllck91dHB1dE1vZGUgb3V0cHV0X21vZGUsCisgICAgICBTYkRlY29kZVRhcmdldEdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKiBwcm92aWRlcik7CiAKICBwcml2YXRlOgogICBib29sIElzUHVuY2hvdXRNb2RlKCkgY29uc3Q7CkBAIC02NSwxOCArNTcsMTQgQEAKICAgICAgICAgICAgICAgICAgICBib29sKiB3cml0dGVuKSBTQl9PVkVSUklERTsKICAgYm9vbCBXcml0ZUVuZE9mU3RyZWFtKFNiTWVkaWFUeXBlIHNhbXBsZV90eXBlKSBTQl9PVkVSUklERTsKICAgYm9vbCBTZXRQYXVzZShib29sIHBhdXNlKSBTQl9PVkVSUklERTsKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAgIGJvb2wgU2V0UGxheWJhY2tSYXRlKGRvdWJsZSBwbGF5YmFja19yYXRlKSBTQl9PVkVSUklERTsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogICB2b2lkIFNldFZvbHVtZShkb3VibGUgdm9sdW1lKSBTQl9PVkVSUklERTsKICAgYm9vbCBTZXRCb3VuZHMoY29uc3QgUGxheWVyV29ya2VyOjpCb3VuZHMmIGJvdW5kcykgU0JfT1ZFUlJJREU7CiAgIHZvaWQgU3RvcCgpIFNCX09WRVJSSURFOwogCiAgIHZvaWQgVXBkYXRlKCk7CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAgIFNiRGVjb2RlVGFyZ2V0IEdldEN1cnJlbnREZWNvZGVUYXJnZXQoKSBTQl9PVkVSUklERTsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogCiAgIFBsYXllcldvcmtlciogcGxheWVyX3dvcmtlcl87CiAgIEpvYlF1ZXVlKiBqb2JfcXVldWVfOwpAQCAtOTksOSArODcsNyBAQAogICBzY29wZWRfcHRyPFZpZGVvUmVuZGVyZXI+IHZpZGVvX3JlbmRlcmVyXzsKIAogICBib29sIHBhdXNlZF87Ci0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICBkb3VibGUgcGxheWJhY2tfcmF0ZV87Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKICAgZG91YmxlIHZvbHVtZV87CiAgIFBsYXllcldvcmtlcjo6Qm91bmRzIGJvdW5kc187CiAgIENsb3N1cmUgdXBkYXRlX2Nsb3N1cmVfOwpAQCAtMTE2LDEzICsxMDIsOSBAQAogICAvLyBhY2Nlc3NlcyBhcmUgaGFwcGVuaW5nIGZyb20gdGhlIHNhbWUgdGhyZWFkLgogICA6OnN0YXJib2FyZDo6TXV0ZXggdmlkZW9fcmVuZGVyZXJfZXhpc3RlbmNlX211dGV4XzsKIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgU2JQbGF5ZXJPdXRwdXRNb2RlIG91dHB1dF9tb2RlXzsKICAgU2JEZWNvZGVUYXJnZXRHcmFwaGljc0NvbnRleHRQcm92aWRlcioKICAgICAgIGRlY29kZV90YXJnZXRfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl87Ci0jZWxpZiBTQl9BUElfVkVSU0lPTiA+PSAzCi0gIFNiRGVjb2RlVGFyZ2V0UHJvdmlkZXIqIGRlY29kZV90YXJnZXRfcHJvdmlkZXJfOwotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgZmlsdGVyCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9wbGF5ZXJfY29tcG9uZW50cy5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvcGxheWVyX2NvbXBvbmVudHMuaAppbmRleCBjZjJhNjBkLi43ZjU1YjcyIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9wbGF5ZXJfY29tcG9uZW50cy5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3BsYXllcl9jb21wb25lbnRzLmgKQEAgLTM4LDExICszOCw5IEBACiAgIFNiTWVkaWFWaWRlb0NvZGVjIHZpZGVvX2NvZGVjOwogICBTYkRybVN5c3RlbSBkcm1fc3lzdGVtOwogICBKb2JRdWV1ZSogam9iX3F1ZXVlOwotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgU2JQbGF5ZXJPdXRwdXRNb2RlIG91dHB1dF9tb2RlOwogICBTYkRlY29kZVRhcmdldEdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKgogICAgICAgZGVjb2RlX3RhcmdldF9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyOwotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiB9OwogCiAvLyBBbGwgdGhlIHBsYXRmb3JtIHNwZWNpZmljIGNvbXBvbmVudHMgdGhhdCBhCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9zdHViX3BsYXllcl9jb21wb25lbnRzX2ltcGwuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9zdHViX3BsYXllcl9jb21wb25lbnRzX2ltcGwuY2MKaW5kZXggZjRiYzZmNi4uN2U0ZTBiZCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvc3R1Yl9wbGF5ZXJfY29tcG9uZW50c19pbXBsLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3N0dWJfcGxheWVyX2NvbXBvbmVudHNfaW1wbC5jYwpAQCAtMTgwLDE0ICsxODAsMTIgQEAKICAgSG9zdCogaG9zdF87CiB9OwogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogLy8gc3RhdGljCiBib29sIFZpZGVvRGVjb2Rlcjo6T3V0cHV0TW9kZVN1cHBvcnRlZChTYlBsYXllck91dHB1dE1vZGUgb3V0cHV0X21vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYk1lZGlhVmlkZW9Db2RlYyBjb2RlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0pIHsKICAgcmV0dXJuIG91dHB1dF9tb2RlID09IGtTYlBsYXllck91dHB1dE1vZGVQdW5jaE91dDsKIH0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogCiAvLyBzdGF0aWMKIHNjb3BlZF9wdHI8UGxheWVyQ29tcG9uZW50cz4gUGxheWVyQ29tcG9uZW50czo6Q3JlYXRlKApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fZGVjb2Rlcl9pbnRlcm5hbC5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fZGVjb2Rlcl9pbnRlcm5hbC5oCmluZGV4IGE4Yzg5NTIuLjIxNWE1MGYgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX2RlY29kZXJfaW50ZXJuYWwuaAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19kZWNvZGVyX2ludGVybmFsLmgKQEAgLTQ5LDIwICs0OSwxNiBAQAogICAvLyBpcyBjYWxsZWQgYWdhaW4uCiAgIHZpcnR1YWwgdm9pZCBSZXNldCgpID0gMDsKIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDMKICAgLy8gTWF5IGJlIGNhbGxlZCBmcm9tIGFuIGFyYml0cmFyeSB0aHJlYWQgKGUuZy4gYSByZW5kZXJlciB0aHJlYWQpLgogICB2aXJ0dWFsIFNiRGVjb2RlVGFyZ2V0IEdldEN1cnJlbnREZWNvZGVUYXJnZXQoKSB7CiAgICAgcmV0dXJuIGtTYkRlY29kZVRhcmdldEludmFsaWQ7CiAgIH0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gMwogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICAvLyBJbmRpdmlkdWFsIGltcGxlbWVudGF0aW9ucyBtdXN0IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uIHRvIGluZGljYXRlIHdoaWNoCiAgIC8vIG91dHB1dCBtb2RlcyB0aGV5IHN1cHBvcnQuCiAgIHN0YXRpYyBib29sIE91dHB1dE1vZGVTdXBwb3J0ZWQoU2JQbGF5ZXJPdXRwdXRNb2RlIG91dHB1dF9tb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiTWVkaWFWaWRlb0NvZGVjIGNvZGVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0pOwotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSAzCiB9OwogCiAvLyBBbiBleHRlbmRlZCB8VmlkZW9EZWNvZGVyfCB0aGF0IGlzIGNhcGFibGUgb2YgcHJvdmlkaW5nIHxWaWRlb0ZyYW1lfHMgdG8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcmVyX2ltcGxfaW50ZXJuYWwuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJlcl9pbXBsX2ludGVybmFsLmNjCmluZGV4IDY4NTkyN2YuLmJhZGQxZjEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcmVyX2ltcGxfaW50ZXJuYWwuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyZXJfaW1wbF9pbnRlcm5hbC5jYwpAQCAtMTUxLDcgKzE1MSw2IEBACiAgIG5lZWRfbW9yZV9pbnB1dF8gPSAoc3RhdHVzID09IFZpZGVvRGVjb2Rlcjo6a05lZWRNb3JlSW5wdXQpOwogfQogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogU2JEZWNvZGVUYXJnZXQgVmlkZW9SZW5kZXJlckltcGw6OkdldEN1cnJlbnREZWNvZGVUYXJnZXQoKSB7CiAgIGlmIChkZWNvZGVyXykgewogICAgIHJldHVybiBkZWNvZGVyXy0+R2V0Q3VycmVudERlY29kZVRhcmdldCgpOwpAQCAtMTYwLDggKzE1OSw2IEBACiAgIH0KIH0KIAotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0Ci0KIDo6c3RhcmJvYXJkOjpzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+CiBWaWRlb1JlbmRlcmVySW1wbDo6R2V0TGFzdERpc3BsYXllZEZyYW1lKCkgewogICBTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcmVyX2ltcGxfaW50ZXJuYWwuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcmVyX2ltcGxfaW50ZXJuYWwuaAppbmRleCA3N2ExZDMxLi5jNjlhYThiIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJlcl9pbXBsX2ludGVybmFsLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyZXJfaW1wbF9pbnRlcm5hbC5oCkBAIC01OCw5ICs1OCw3IEBACiAgIGJvb2wgQ2FuQWNjZXB0TW9yZURhdGEoKSBjb25zdCBTQl9PVkVSUklERTsKICAgYm9vbCBJc1NlZWtpbmdJblByb2dyZXNzKCkgY29uc3QgU0JfT1ZFUlJJREU7CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAgIFNiRGVjb2RlVGFyZ2V0IEdldEN1cnJlbnREZWNvZGVUYXJnZXQoKSBTQl9PVkVSUklERTsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogCiAgIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gR2V0TGFzdERpc3BsYXllZEZyYW1lKCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcmVyX2ludGVybmFsLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJlcl9pbnRlcm5hbC5oCmluZGV4IGNmZmE2ZGUuLjg1OTA2YmYgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcmVyX2ludGVybmFsLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyZXJfaW50ZXJuYWwuaApAQCAtNDQsOSArNDQsNyBAQAogICB2aXJ0dWFsIGJvb2wgSXNFbmRPZlN0cmVhbVBsYXllZCgpIGNvbnN0ID0gMDsKICAgdmlydHVhbCBib29sIENhbkFjY2VwdE1vcmVEYXRhKCkgY29uc3QgPSAwOwogICB2aXJ0dWFsIGJvb2wgSXNTZWVraW5nSW5Qcm9ncmVzcygpIGNvbnN0ID0gMDsKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAgIHZpcnR1YWwgU2JEZWNvZGVUYXJnZXQgR2V0Q3VycmVudERlY29kZVRhcmdldCgpID0gMDsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGZpbHRlcgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfY3JlYXRlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfY3JlYXRlLmNjCmluZGV4IDI1ZGZlOWIuLjNhOTQ4ZGIgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2NyZWF0ZS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9jcmVhdGUuY2MKQEAgLTE4LDkgKzE4LDcgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvZGVjb2RlX3RhcmdldC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL21lZGlhX3Nlc3Npb24vcGxheWJhY2tfc3RhdGUuaCIKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvbWVkaWFfc3VwcG9ydF9pbnRlcm5hbC5oIgotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9maWx0ZXJfYmFzZWRfcGxheWVyX3dvcmtlcl9oYW5kbGVyLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9pbnRlcm5hbC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfd29ya2VyLmgiCkBAIC00MSwxOSArMzksMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIFNiUGxheWVyRGVhbGxvY2F0ZVNhbXBsZUZ1bmMgc2FtcGxlX2RlYWxsb2NhdGVfZnVuYywKICAgICAgICAgICAgICAgICAgICAgICAgIFNiUGxheWVyRGVjb2RlclN0YXR1c0Z1bmMgZGVjb2Rlcl9zdGF0dXNfZnVuYywKICAgICAgICAgICAgICAgICAgICAgICAgIFNiUGxheWVyU3RhdHVzRnVuYyBwbGF5ZXJfc3RhdHVzX2Z1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0Ci0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAotICAgICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgIFNiUGxheWVyT3V0cHV0TW9kZSBvdXRwdXRfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNiRGVjb2RlVGFyZ2V0R3JhcGhpY3NDb250ZXh0UHJvdmlkZXIqIHByb3ZpZGVyCi0jZWxpZiBTQl9BUElfVkVSU0lPTiA+PSAzCi0gICAgICAgICAgICAgICAgICAgICAgICAsCi0gICAgICAgICAgICAgICAgICAgICAgICBTYkRlY29kZVRhcmdldFByb3ZpZGVyKiBwcm92aWRlcgotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0Ci0gICAgICAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNiRGVjb2RlVGFyZ2V0R3JhcGhpY3NDb250ZXh0UHJvdmlkZXIqIHByb3ZpZGVyKSB7CiAgIFNCX1VOUkVGRVJFTkNFRF9QQVJBTUVURVIod2luZG93KTsKIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgY29uc3QgaW50NjRfdCBrRGVmYXVsdEJpdFJhdGUgPSAwOwogICBpZiAoIVNiTWVkaWFJc0F1ZGlvU3VwcG9ydGVkKGF1ZGlvX2NvZGVjLCBrRGVmYXVsdEJpdFJhdGUpKSB7CiAgICAgU0JfTE9HKEVSUk9SKSA8PCAiVW5zdXBwb3J0ZWQgYXVkaW8gY29kZWMgIiA8PCBhdWRpb19jb2RlYzsKQEAgLTY5LDQ1ICs1OSwyMiBAQAogICAgIFNCX0xPRyhFUlJPUikgPDwgIlVuc3VwcG9ydGVkIHZpZGVvIGNvZGVjICIgPDwgdmlkZW9fY29kZWM7CiAgICAgcmV0dXJuIGtTYlBsYXllckludmFsaWQ7CiAgIH0KLSNlbHNlICAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAotICBpZiAoYXVkaW9fY29kZWMgIT0ga1NiTWVkaWFBdWRpb0NvZGVjQWFjKSB7Ci0gICAgU0JfTE9HKEVSUk9SKSA8PCAiVW5zdXBwb3J0ZWQgYXVkaW8gY29kZWMgIiA8PCBhdWRpb19jb2RlYzsKLSAgICByZXR1cm4ga1NiUGxheWVySW52YWxpZDsKLSAgfQotCi0gIGlmICh2aWRlb19jb2RlYyAhPSBrU2JNZWRpYVZpZGVvQ29kZWNIMjY0KSB7Ci0gICAgU0JfTE9HKEVSUk9SKSA8PCAiVW5zdXBwb3J0ZWQgdmlkZW8gY29kZWMgIiA8PCB2aWRlb19jb2RlYzsKLSAgICByZXR1cm4ga1NiUGxheWVySW52YWxpZDsKLSAgfQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiAKICAgaWYgKCFhdWRpb19oZWFkZXIpIHsKICAgICBTQl9MT0coRVJST1IpIDw8ICJTYlBsYXllckNyZWF0ZSgpIHJlcXVpcmVzIGEgbm9uLU5VTEwgU2JNZWRpYUF1ZGlvSGVhZGVyIjsKICAgICByZXR1cm4ga1NiUGxheWVySW52YWxpZDsKICAgfQogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICBpZiAoIVNiUGxheWVyT3V0cHV0TW9kZVN1cHBvcnRlZChvdXRwdXRfbW9kZSwgdmlkZW9fY29kZWMsIGRybV9zeXN0ZW0pKSB7CiAgICAgU0JfTE9HKEVSUk9SKSA8PCAiVW5zdXBwb3J0ZWQgcGxheWVyIG91dHB1dCBtb2RlICIgPDwgb3V0cHV0X21vZGU7CiAgICAgcmV0dXJuIGtTYlBsYXllckludmFsaWQ7CiAgIH0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogCiAgIFVwZGF0ZUFjdGl2ZVNlc3Npb25QbGF0Zm9ybVBsYXliYWNrU3RhdGUoa1BsYXlpbmcpOwogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICBzdGFyYm9hcmQ6OnNjb3BlZF9wdHI8UGxheWVyV29ya2VyOjpIYW5kbGVyPiBoYW5kbGVyKAogICAgICAgbmV3IEZpbHRlckJhc2VkUGxheWVyV29ya2VySGFuZGxlcih2aWRlb19jb2RlYywgYXVkaW9fY29kZWMsIGRybV9zeXN0ZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphdWRpb19oZWFkZXIsIG91dHB1dF9tb2RlLCBwcm92aWRlcikpOwotI2VsaWYgU0JfQVBJX1ZFUlNJT04gPj0gMwotICBzdGFyYm9hcmQ6OnNjb3BlZF9wdHI8UGxheWVyV29ya2VyOjpIYW5kbGVyPiBoYW5kbGVyKAotICAgICAgbmV3IEZpbHRlckJhc2VkUGxheWVyV29ya2VySGFuZGxlcih2aWRlb19jb2RlYywgYXVkaW9fY29kZWMsIGRybV9zeXN0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphdWRpb19oZWFkZXIsIHByb3ZpZGVyKSk7Ci0jZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKLSAgc3RhcmJvYXJkOjpzY29wZWRfcHRyPFBsYXllcldvcmtlcjo6SGFuZGxlcj4gaGFuZGxlcigKLSAgICAgIG5ldyBGaWx0ZXJCYXNlZFBsYXllcldvcmtlckhhbmRsZXIodmlkZW9fY29kZWMsIGF1ZGlvX2NvZGVjLCBkcm1fc3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYXVkaW9faGVhZGVyKSk7Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKIAogICByZXR1cm4gbmV3IFNiUGxheWVyUHJpdmF0ZShkdXJhdGlvbl9wdHMsIHNhbXBsZV9kZWFsbG9jYXRlX2Z1bmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJfc3RhdHVzX2Z1bmMsIHBsYXllcl9zdGF0dXNfZnVuYywgY29udGV4dCwKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2dldF9jdXJyZW50X2ZyYW1lLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfZ2V0X2N1cnJlbnRfZnJhbWUuY2MKaW5kZXggNDdlYjMwZi4uYTQwYzRiNyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfZ2V0X2N1cnJlbnRfZnJhbWUuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfZ2V0X2N1cnJlbnRfZnJhbWUuY2MKQEAgLTE4LDggKzE4LDYgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9pbnRlcm5hbC5oIgogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAotCiBTYkRlY29kZVRhcmdldCBTYlBsYXllckdldEN1cnJlbnRGcmFtZShTYlBsYXllciBwbGF5ZXIpIHsKICAgaWYgKCFTYlBsYXllcklzVmFsaWQocGxheWVyKSkgewogICAgIFNCX0RMT0coV0FSTklORykgPDwgInBsYXllciBpcyBpbnZhbGlkLiI7CkBAIC0yOCw1ICsyNiwzIEBACiAKICAgcmV0dXJuIHBsYXllci0+R2V0Q3VycmVudERlY29kZVRhcmdldCgpOwogfQotCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2ludGVybmFsLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfaW50ZXJuYWwuY2MKaW5kZXggM2I0NmE1ZC4uN2UwMTdjYyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfaW50ZXJuYWwuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfaW50ZXJuYWwuY2MKQEAgLTQ0LDkgKzQ0LDcgQEAKICAgICAgIGZyYW1lX3dpZHRoXygwKSwKICAgICAgIGZyYW1lX2hlaWdodF8oMCksCiAgICAgICBpc19wYXVzZWRfKHRydWUpLAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgICAgIHBsYXliYWNrX3JhdGVfKDEuMCksCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKICAgICAgIHZvbHVtZV8oMS4wKSwKICAgICAgIHRvdGFsX3ZpZGVvX2ZyYW1lc18oMCksCiAgICAgICBkcm9wcGVkX3ZpZGVvX2ZyYW1lc18oMCksCkBAIC0xMTYsMjEgKzExNCwxNyBAQAogICBvdXRfcGxheWVyX2luZm8tPnRvdGFsX3ZpZGVvX2ZyYW1lcyA9IHRvdGFsX3ZpZGVvX2ZyYW1lc187CiAgIG91dF9wbGF5ZXJfaW5mby0+ZHJvcHBlZF92aWRlb19mcmFtZXMgPSBkcm9wcGVkX3ZpZGVvX2ZyYW1lc187CiAgIG91dF9wbGF5ZXJfaW5mby0+Y29ycnVwdGVkX3ZpZGVvX2ZyYW1lcyA9IDA7Ci0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICBvdXRfcGxheWVyX2luZm8tPnBsYXliYWNrX3JhdGUgPSBwbGF5YmFja19yYXRlXzsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogfQogCiB2b2lkIFNiUGxheWVyUHJpdmF0ZTo6U2V0UGF1c2UoYm9vbCBwYXVzZSkgewogICB3b3JrZXJfLT5TZXRQYXVzZShwYXVzZSk7CiB9CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiB2b2lkIFNiUGxheWVyUHJpdmF0ZTo6U2V0UGxheWJhY2tSYXRlKGRvdWJsZSBwbGF5YmFja19yYXRlKSB7CiAgIHBsYXliYWNrX3JhdGVfID0gcGxheWJhY2tfcmF0ZTsKICAgd29ya2VyXy0+U2V0UGxheWJhY2tSYXRlKHBsYXliYWNrX3JhdGUpOwogfQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiAKIHZvaWQgU2JQbGF5ZXJQcml2YXRlOjpTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgewogICB2b2x1bWVfID0gdm9sdW1lOwpAQCAtMTUxLDggKzE0NSw2IEBACiAgIGRyb3BwZWRfdmlkZW9fZnJhbWVzXyA9IGRyb3BwZWRfdmlkZW9fZnJhbWVzOwogfQogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogU2JEZWNvZGVUYXJnZXQgU2JQbGF5ZXJQcml2YXRlOjpHZXRDdXJyZW50RGVjb2RlVGFyZ2V0KCkgewogICByZXR1cm4gd29ya2VyXy0+R2V0Q3VycmVudERlY29kZVRhcmdldCgpOwogfQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9pbnRlcm5hbC5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfaW50ZXJuYWwuaAppbmRleCBmZGIzZDA5Li42N2NlM2JiIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9pbnRlcm5hbC5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2ludGVybmFsLmgKQEAgLTUwLDE0ICs1MCwxMCBAQAogCiAgIHZvaWQgR2V0SW5mbyhTYlBsYXllckluZm8qIG91dF9wbGF5ZXJfaW5mbyk7CiAgIHZvaWQgU2V0UGF1c2UoYm9vbCBwYXVzZSk7Ci0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICB2b2lkIFNldFBsYXliYWNrUmF0ZShkb3VibGUgcGxheWJhY2tfcmF0ZSk7Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKICAgdm9pZCBTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSk7CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAgIFNiRGVjb2RlVGFyZ2V0IEdldEN1cnJlbnREZWNvZGVUYXJnZXQoKTsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogCiAgcHJpdmF0ZToKICAgLy8gUGxheWVyV29ya2VyOjpIb3N0IG1ldGhvZHMuCkBAIC03NSw5ICs3MSw3IEBACiAgIGludCBmcmFtZV93aWR0aF87CiAgIGludCBmcmFtZV9oZWlnaHRfOwogICBib29sIGlzX3BhdXNlZF87Ci0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICBkb3VibGUgcGxheWJhY2tfcmF0ZV87Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKICAgZG91YmxlIHZvbHVtZV87CiAgIGludCB0b3RhbF92aWRlb19mcmFtZXNfOwogICBpbnQgZHJvcHBlZF92aWRlb19mcmFtZXNfOwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfb3V0cHV0X21vZGVfc3VwcG9ydGVkLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfb3V0cHV0X21vZGVfc3VwcG9ydGVkLmNjCmluZGV4IDRkMzRjY2UuLjI1ZGNmZTYgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX291dHB1dF9tb2RlX3N1cHBvcnRlZC5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9vdXRwdXRfbW9kZV9zdXBwb3J0ZWQuY2MKQEAgLTE4LDEzICsxOCw5IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fZGVjb2Rlcl9pbnRlcm5hbC5oIgogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAotCiBib29sIFNiUGxheWVyT3V0cHV0TW9kZVN1cHBvcnRlZChTYlBsYXllck91dHB1dE1vZGUgb3V0cHV0X21vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYk1lZGlhVmlkZW9Db2RlYyBjb2RlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0pIHsKICAgcmV0dXJuIHN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OnBsYXllcjo6ZmlsdGVyOjpWaWRlb0RlY29kZXI6OgogICAgICAgT3V0cHV0TW9kZVN1cHBvcnRlZChvdXRwdXRfbW9kZSwgY29kZWMsIGRybV9zeXN0ZW0pOwogfQotCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3NldF9ib3VuZHMuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9zZXRfYm91bmRzLmNjCmluZGV4IGM0YWMyODYuLmMyNzVjODIgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3NldF9ib3VuZHMuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfc2V0X2JvdW5kcy5jYwpAQCAtMTcsMTIgKzE3LDggQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9pbnRlcm5hbC5oIgogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNCB8fCBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCi0KIHZvaWQgU2JQbGF5ZXJTZXRCb3VuZHMoU2JQbGF5ZXIgcGxheWVyLAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qel9pbmRleCovLAotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgeSwKICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLApAQCAtMzMsNSArMjksMyBAQAogICB9CiAgIHBsYXllci0+U2V0Qm91bmRzKHgsIHksIHdpZHRoLCBoZWlnaHQpOwogfQotCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQgfHwgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfc2V0X3BhdXNlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfc2V0X3BhdXNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTVjZDk1Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3NldF9wYXVzZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvcGxheWVyLmgiCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9pbnRlcm5hbC5oIgotCi0jaWYgU0JfQVBJX1ZFUlNJT04gPCA0Ci0KLXZvaWQgU2JQbGF5ZXJTZXRQYXVzZShTYlBsYXllciBwbGF5ZXIsIGJvb2wgcGF1c2UpIHsKLSAgaWYgKCFTYlBsYXllcklzVmFsaWQocGxheWVyKSkgewotICAgIFNCX0RMT0coV0FSTklORykgPDwgInBsYXllciBpcyBpbnZhbGlkLiI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBsYXllci0+U2V0UGF1c2UocGF1c2UpOwotfQotCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgNApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfc2V0X3BsYXliYWNrX3JhdGUuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9zZXRfcGxheWJhY2tfcmF0ZS5jYwppbmRleCBhYWY5NmQxLi43YjYyODhhIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9zZXRfcGxheWJhY2tfcmF0ZS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9zZXRfcGxheWJhY2tfcmF0ZS5jYwpAQCAtMjMsOCArMjMsNiBAQAogdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6Om1lZGlhX3Nlc3Npb246OgogICAgIFVwZGF0ZUFjdGl2ZVNlc3Npb25QbGF0Zm9ybVBsYXliYWNrU3RhdGU7CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0Ci0KIGJvb2wgU2JQbGF5ZXJTZXRQbGF5YmFja1JhdGUoU2JQbGF5ZXIgcGxheWVyLCBkb3VibGUgcGxheWJhY2tfcmF0ZSkgewogICBpZiAoIVNiUGxheWVySXNWYWxpZChwbGF5ZXIpKSB7CiAgICAgU0JfRExPRyhXQVJOSU5HKSA8PCAicGxheWVyIGlzIGludmFsaWQuIjsKQEAgLTQwLDUgKzM4LDMgQEAKICAgVXBkYXRlQWN0aXZlU2Vzc2lvblBsYXRmb3JtUGxheWJhY2tTdGF0ZShwYXVzZWQgPyBrUGF1c2VkIDoga1BsYXlpbmcpOwogICByZXR1cm4gdHJ1ZTsKIH0KLQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl93b3JrZXIuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl93b3JrZXIuY2MKaW5kZXggMjRlODM0Yy4uN2Q5NDk0ZCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfd29ya2VyLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dvcmtlci5jYwpAQCAtMjQzLDE0ICsyNDMsMTIgQEAKICAgfQogfQogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNCB8fCBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCiB2b2lkIFBsYXllcldvcmtlcjo6RG9TZXRCb3VuZHMoQm91bmRzIGJvdW5kcykgewogICBTQl9EQ0hFQ0soam9iX3F1ZXVlXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKICAgaWYgKCFoYW5kbGVyXy0+U2V0Qm91bmRzKGJvdW5kcykpIHsKICAgICBVcGRhdGVQbGF5ZXJTdGF0ZShrU2JQbGF5ZXJTdGF0ZUVycm9yKTsKICAgfQogfQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0IHx8IFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKIAogdm9pZCBQbGF5ZXJXb3JrZXI6OkRvU2V0UGF1c2UoYm9vbCBwYXVzZSkgewogICBTQl9EQ0hFQ0soam9iX3F1ZXVlXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKQEAgLTI2MCw3ICsyNTgsNiBAQAogICB9CiB9CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiB2b2lkIFBsYXllcldvcmtlcjo6RG9TZXRQbGF5YmFja1JhdGUoZG91YmxlIHBsYXliYWNrX3JhdGUpIHsKICAgU0JfRENIRUNLKGpvYl9xdWV1ZV8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CiAKQEAgLTI2OCw3ICsyNjUsNiBAQAogICAgIFVwZGF0ZVBsYXllclN0YXRlKGtTYlBsYXllclN0YXRlRXJyb3IpOwogICB9CiB9Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKIAogdm9pZCBQbGF5ZXJXb3JrZXI6OkRvU2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpIHsKICAgU0JfRENIRUNLKGpvYl9xdWV1ZV8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl93b3JrZXIuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dvcmtlci5oCmluZGV4IDg0YmU4MzkuLjMwZGE4NzcgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dvcmtlci5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dvcmtlci5oCkBAIC04MCw5ICs4MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHdyaXR0ZW4pID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgV3JpdGVFbmRPZlN0cmVhbShTYk1lZGlhVHlwZSBzYW1wbGVfdHlwZSkgPSAwOwogICAgIHZpcnR1YWwgYm9vbCBTZXRQYXVzZShib29sIHBhdXNlKSA9IDA7Ci0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICAgIHZpcnR1YWwgYm9vbCBTZXRQbGF5YmFja1JhdGUoZG91YmxlIHBsYXliYWNrX3JhdGUpID0gMDsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogICAgIHZpcnR1YWwgdm9pZCBTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgPSAwOwogCiAgICAgdmlydHVhbCBib29sIFNldEJvdW5kcyhjb25zdCBCb3VuZHMmIGJvdW5kcykgPSAwOwpAQCAtOTIsOSArOTAsNyBAQAogICAgIC8vIGFmdGVyIGFuZCBpcyBubyBsb25nZXIgc2FmZSB0byBhY2Nlc3MuCiAgICAgdmlydHVhbCB2b2lkIFN0b3AoKSA9IDA7CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAgICAgdmlydHVhbCBTYkRlY29kZVRhcmdldCBHZXRDdXJyZW50RGVjb2RlVGFyZ2V0KCkgPSAwOwotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiAgIH07CiAKICAgUGxheWVyV29ya2VyKEhvc3QqIGhvc3QsCkBAIC0xMjAsMTcgKzExNiwxNCBAQAogICAgICAgICBCaW5kKCZQbGF5ZXJXb3JrZXI6OkRvV3JpdGVFbmRPZlN0cmVhbSwgdGhpcywgc2FtcGxlX3R5cGUpKTsKICAgfQogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNCB8fCBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCiAgIHZvaWQgU2V0Qm91bmRzKEJvdW5kcyBib3VuZHMpIHsKICAgICBqb2JfcXVldWVfLT5TY2hlZHVsZShCaW5kKCZQbGF5ZXJXb3JrZXI6OkRvU2V0Qm91bmRzLCB0aGlzLCBib3VuZHMpKTsKICAgfQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0IHx8IFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKIAogICB2b2lkIFNldFBhdXNlKGJvb2wgcGF1c2UpIHsKICAgICBqb2JfcXVldWVfLT5TY2hlZHVsZShCaW5kKCZQbGF5ZXJXb3JrZXI6OkRvU2V0UGF1c2UsIHRoaXMsIHBhdXNlKSk7CiAgIH0KIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgdm9pZCBTZXRQbGF5YmFja1JhdGUoZG91YmxlIHBsYXliYWNrX3JhdGUpIHsKICAgICAvLyBBcmJpdHJhcnkgdmFsdWVzIHRvIGdpdmUgdGhlIHBsYXliYWNrIHJhdGUgYSB2YWxpZCByYW5nZS4gIEEgcGFydGljdWxhcgogICAgIC8vIGltcGxlbWVudGF0aW9uIG1heSBoYXZlIHN0cmljdGVyIG9yIGxvb3NlciByZXF1aXJlbWVudCwgb3IgZXZlbiBvbmx5CkBAIC0xNDcsNyArMTQwLDYgQEAKICAgICBqb2JfcXVldWVfLT5TY2hlZHVsZSgKICAgICAgICAgQmluZCgmUGxheWVyV29ya2VyOjpEb1NldFBsYXliYWNrUmF0ZSwgdGhpcywgcGxheWJhY2tfcmF0ZSkpOwogICB9Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKIAogICB2b2lkIFNldFZvbHVtZShkb3VibGUgdm9sdW1lKSB7CiAgICAgam9iX3F1ZXVlXy0+U2NoZWR1bGUoQmluZCgmUGxheWVyV29ya2VyOjpEb1NldFZvbHVtZSwgdGhpcywgdm9sdW1lKSk7CkBAIC0xNTcsMTEgKzE0OSw5IEBACiAgICAgaG9zdF8tPlVwZGF0ZURyb3BwZWRWaWRlb0ZyYW1lcyhkcm9wcGVkX3ZpZGVvX2ZyYW1lcyk7CiAgIH0KIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgU2JEZWNvZGVUYXJnZXQgR2V0Q3VycmVudERlY29kZVRhcmdldCgpIHsKICAgICByZXR1cm4gaGFuZGxlcl8tPkdldEN1cnJlbnREZWNvZGVUYXJnZXQoKTsKICAgfQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiAKICBwcml2YXRlOgogICB2b2lkIFVwZGF0ZU1lZGlhVGltZShTYk1lZGlhVGltZSB0aW1lKTsKQEAgLTE3NiwxMyArMTY2LDkgQEAKICAgdm9pZCBEb1dyaXRlU2FtcGxlKGNvbnN0IHNjb3BlZF9yZWZwdHI8SW5wdXRCdWZmZXI+JiBpbnB1dF9idWZmZXIpOwogICB2b2lkIERvV3JpdGVQZW5kaW5nU2FtcGxlcygpOwogICB2b2lkIERvV3JpdGVFbmRPZlN0cmVhbShTYk1lZGlhVHlwZSBzYW1wbGVfdHlwZSk7Ci0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNCB8fCBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCiAgIHZvaWQgRG9TZXRCb3VuZHMoQm91bmRzIGJvdW5kcyk7Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQgfHwgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQogICB2b2lkIERvU2V0UGF1c2UoYm9vbCBwYXVzZSk7Ci0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICB2b2lkIERvU2V0UGxheWJhY2tSYXRlKGRvdWJsZSByYXRlKTsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogICB2b2lkIERvU2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpOwogICB2b2lkIERvU3RvcCgpOwogCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl93cml0ZV9zYW1wbGUuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl93cml0ZV9zYW1wbGUuY2MKaW5kZXggNWZkM2NhNS4uNzcwYjk4MSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfd3JpdGVfc2FtcGxlLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dyaXRlX3NhbXBsZS5jYwpAQCAtMTcsOCArMTcsNiBAQAogI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2ludGVybmFsLmgiCiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0Ci0KIHZvaWQgU2JQbGF5ZXJXcml0ZVNhbXBsZShTYlBsYXllciBwbGF5ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgU2JNZWRpYVR5cGUgc2FtcGxlX3R5cGUsCiAjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX1dSSVRFX1NBTVBMRV9FWFRSQV9DT05TVF9BUElfVkVSU0lPTgpAQCAtNTcsMjMgKzU1LDMgQEAKICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2Zfc2FtcGxlX2J1ZmZlcnMsIHNhbXBsZV9wdHMsIHZpZGVvX3NhbXBsZV9pbmZvLAogICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9kcm1faW5mbyk7CiB9Ci0KLSNlbHNlICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0Ci0KLXZvaWQgU2JQbGF5ZXJXcml0ZVNhbXBsZShTYlBsYXllciBwbGF5ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgU2JNZWRpYVR5cGUgc2FtcGxlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc2FtcGxlX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlX2J1ZmZlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIFNiTWVkaWFUaW1lIHNhbXBsZV9wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2JNZWRpYVZpZGVvU2FtcGxlSW5mbyogdmlkZW9fc2FtcGxlX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2JEcm1TYW1wbGVJbmZvKiBzYW1wbGVfZHJtX2luZm8pIHsKLSAgaWYgKCFTYlBsYXllcklzVmFsaWQocGxheWVyKSkgewotICAgIFNCX0RMT0coV0FSTklORykgPDwgInBsYXllciBpcyBpbnZhbGlkLiI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcGxheWVyLT5Xcml0ZVNhbXBsZShzYW1wbGVfdHlwZSwgc2FtcGxlX2J1ZmZlciwgc2FtcGxlX2J1ZmZlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9wdHMsIHZpZGVvX3NhbXBsZV9pbmZvLCBzYW1wbGVfZHJtX2luZm8pOwotfQotCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9zeXN0ZW1fcmVxdWVzdF9wYXVzZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9zeXN0ZW1fcmVxdWVzdF9wYXVzZS5jYwppbmRleCA5OGZlZWI0Li5hN2YzN2Q1IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvc3lzdGVtX3JlcXVlc3RfcGF1c2UuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3N5c3RlbV9yZXF1ZXN0X3BhdXNlLmNjCkBAIC0xNiwxMCArMTYsNiBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXBwbGljYXRpb24uaCIKIAotI2lmIFNCX0FQSV9WRVJTSU9OIDwgNAotI2Vycm9yICJTYlN5c3RlbVJlcXVlc3RQYXVzZSByZXF1aXJlcyBTQl9BUElfVkVSU0lPTiA+PSA0LiIKLSNlbmRpZgotCiB2b2lkIFNiU3lzdGVtUmVxdWVzdFBhdXNlKCkgewogICBzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjpBcHBsaWNhdGlvbjo6R2V0KCktPlBhdXNlKE5VTEwsIE5VTEwpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3N5c3RlbV9yZXF1ZXN0X3N1c3BlbmQuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvc3lzdGVtX3JlcXVlc3Rfc3VzcGVuZC5jYwppbmRleCA3NzllYTJkLi44YzRkYTc4IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvc3lzdGVtX3JlcXVlc3Rfc3VzcGVuZC5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvc3lzdGVtX3JlcXVlc3Rfc3VzcGVuZC5jYwpAQCAtMTYsMTAgKzE2LDYgQEAKIAogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2FwcGxpY2F0aW9uLmgiCiAKLSNpZiBTQl9BUElfVkVSU0lPTiA8IDQKLSNlcnJvciAiU2JTeXN0ZW1SZXF1ZXN0U3VzcGVuZCByZXF1aXJlcyBTQl9BUElfVkVSU0lPTiA+PSA0LiIKLSNlbmRpZgotCiB2b2lkIFNiU3lzdGVtUmVxdWVzdFN1c3BlbmQoKSB7CiAgIHN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OkFwcGxpY2F0aW9uOjpHZXQoKS0+U3VzcGVuZChOVUxMLCBOVUxMKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9zeXN0ZW1fcmVxdWVzdF91bnBhdXNlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3N5c3RlbV9yZXF1ZXN0X3VucGF1c2UuY2MKaW5kZXggYzliYWFiNS4uNzgxN2ViMiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3N5c3RlbV9yZXF1ZXN0X3VucGF1c2UuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3N5c3RlbV9yZXF1ZXN0X3VucGF1c2UuY2MKQEAgLTE2LDEwICsxNiw2IEBACiAKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hcHBsaWNhdGlvbi5oIgogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPCA0Ci0jZXJyb3IgIlNiU3lzdGVtUmVxdWVzdFVucGF1c2UgcmVxdWlyZXMgU0JfQVBJX1ZFUlNJT04gPj0gNC4iCi0jZW5kaWYKLQogdm9pZCBTYlN5c3RlbVJlcXVlc3RVbnBhdXNlKCkgewogICBzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjpBcHBsaWNhdGlvbjo6R2V0KCktPlVucGF1c2UoTlVMTCwgTlVMTCk7CiB9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2NyeXB0b2dyYXBoeV9jcmVhdGVfdHJhbnNmb3JtZXIuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2NyeXB0b2dyYXBoeV9jcmVhdGVfdHJhbnNmb3JtZXIuY2MKaW5kZXggNTAyYTAwNi4uNDY5ZjA2YiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9jcnlwdG9ncmFwaHlfY3JlYXRlX3RyYW5zZm9ybWVyLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvY3J5cHRvZ3JhcGh5X2NyZWF0ZV90cmFuc2Zvcm1lci5jYwpAQCAtMTUsMTAgKzE1LDYgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9jcnlwdG9ncmFwaHkuaCIKIAotI2lmIFNCX0FQSV9WRVJTSU9OIDwgNAotI2Vycm9yICJTYkNyeXB0b2dyYXBoeSByZXF1aXJlcyBTQl9BUElfVkVSU0lPTiA+PSA0LiIKLSNlbmRpZgotCiBTYkNyeXB0b2dyYXBoeVRyYW5zZm9ybWVyIFNiQ3J5cHRvZ3JhcGh5Q3JlYXRlVHJhbnNmb3JtZXIoCiAgICAgY29uc3QgY2hhciogYWxnb3JpdGhtLAogICAgIGludCBibG9ja19zaXplX2JpdHMsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2NyeXB0b2dyYXBoeV9kZXN0cm95X3RyYW5zZm9ybWVyLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9jcnlwdG9ncmFwaHlfZGVzdHJveV90cmFuc2Zvcm1lci5jYwppbmRleCAwNTQ3MTA2Li4yZDhiN2EwIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2NyeXB0b2dyYXBoeV9kZXN0cm95X3RyYW5zZm9ybWVyLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvY3J5cHRvZ3JhcGh5X2Rlc3Ryb3lfdHJhbnNmb3JtZXIuY2MKQEAgLTE1LDEwICsxNSw2IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvY3J5cHRvZ3JhcGh5LmgiCiAKLSNpZiBTQl9BUElfVkVSU0lPTiA8IDQKLSNlcnJvciAiU2JDcnlwdG9ncmFwaHkgcmVxdWlyZXMgU0JfQVBJX1ZFUlNJT04gPj0gNC4iCi0jZW5kaWYKLQogdm9pZCBTYkNyeXB0b2dyYXBoeURlc3Ryb3lUcmFuc2Zvcm1lcihTYkNyeXB0b2dyYXBoeVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKSB7CiAgIFNCX1VOUkVGRVJFTkNFRF9QQVJBTUVURVIodHJhbnNmb3JtZXIpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9jcnlwdG9ncmFwaHlfZ2V0X3RhZy5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvY3J5cHRvZ3JhcGh5X2dldF90YWcuY2MKaW5kZXggNWNhMWNiZi4uZjIwNDU4NiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9jcnlwdG9ncmFwaHlfZ2V0X3RhZy5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2NyeXB0b2dyYXBoeV9nZXRfdGFnLmNjCkBAIC0xNSwxMCArMTUsNiBAQAogI2luY2x1ZGUgInN0YXJib2FyZC9jb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL2NyeXB0b2dyYXBoeS5oIgogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPCA0Ci0jZXJyb3IgIlNiQ3J5cHRvZ3JhcGh5IHJlcXVpcmVzIFNCX0FQSV9WRVJTSU9OID49IDQuIgotI2VuZGlmCi0KIGJvb2wgU2JDcnlwdG9ncmFwaHlHZXRUYWcoCiAgICAgU2JDcnlwdG9ncmFwaHlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciwKICAgICB2b2lkKiBvdXRfdGFnLApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9jcnlwdG9ncmFwaHlfc2V0X2F1dGhlbnRpY2F0ZWRfZGF0YS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvY3J5cHRvZ3JhcGh5X3NldF9hdXRoZW50aWNhdGVkX2RhdGEuY2MKaW5kZXggOTM5NjhkZC4uOGJlNDZjOSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9jcnlwdG9ncmFwaHlfc2V0X2F1dGhlbnRpY2F0ZWRfZGF0YS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2NyeXB0b2dyYXBoeV9zZXRfYXV0aGVudGljYXRlZF9kYXRhLmNjCkBAIC0xNSwxMCArMTUsNiBAQAogI2luY2x1ZGUgInN0YXJib2FyZC9jb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL2NyeXB0b2dyYXBoeS5oIgogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPCA0Ci0jZXJyb3IgIlNiQ3J5cHRvZ3JhcGh5IHJlcXVpcmVzIFNCX0FQSV9WRVJTSU9OID49IDQuIgotI2VuZGlmCi0KIGJvb2wgU2JDcnlwdG9ncmFwaHlTZXRBdXRoZW50aWNhdGVkRGF0YSgKICAgICBTYkNyeXB0b2dyYXBoeVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyLAogICAgIGNvbnN0IHZvaWQqIGRhdGEsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2NyeXB0b2dyYXBoeV9zZXRfaW5pdGlhbGl6YXRpb25fdmVjdG9yLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9jcnlwdG9ncmFwaHlfc2V0X2luaXRpYWxpemF0aW9uX3ZlY3Rvci5jYwppbmRleCBhMDcwYzI2Li4wZWM2YTI3IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2NyeXB0b2dyYXBoeV9zZXRfaW5pdGlhbGl6YXRpb25fdmVjdG9yLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvY3J5cHRvZ3JhcGh5X3NldF9pbml0aWFsaXphdGlvbl92ZWN0b3IuY2MKQEAgLTE1LDEwICsxNSw2IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvY3J5cHRvZ3JhcGh5LmgiCiAKLSNpZiBTQl9BUElfVkVSU0lPTiA8IDQKLSNlcnJvciAiU2JDcnlwdG9ncmFwaHkgcmVxdWlyZXMgU0JfQVBJX1ZFUlNJT04gPj0gNC4iCi0jZW5kaWYKLQogdm9pZCBTYkNyeXB0b2dyYXBoeVNldEluaXRpYWxpemF0aW9uVmVjdG9yKAogICAgIFNiQ3J5cHRvZ3JhcGh5VHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIsCiAgICAgY29uc3Qgdm9pZCogaW5pdGlhbGl6YXRpb25fdmVjdG9yLApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9jcnlwdG9ncmFwaHlfdHJhbnNmb3JtLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9jcnlwdG9ncmFwaHlfdHJhbnNmb3JtLmNjCmluZGV4IDQ0ODhhMWYuLjc4NTA1MGEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvY3J5cHRvZ3JhcGh5X3RyYW5zZm9ybS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2NyeXB0b2dyYXBoeV90cmFuc2Zvcm0uY2MKQEAgLTE1LDEwICsxNSw2IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvY3J5cHRvZ3JhcGh5LmgiCiAKLSNpZiBTQl9BUElfVkVSU0lPTiA8IDQKLSNlcnJvciAiU2JDcnlwdG9ncmFwaHkgcmVxdWlyZXMgU0JfQVBJX1ZFUlNJT04gPj0gNC4iCi0jZW5kaWYKLQogaW50IFNiQ3J5cHRvZ3JhcGh5VHJhbnNmb3JtKFNiQ3J5cHRvZ3JhcGh5VHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogaW5fZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5fZGF0YV9zaXplLApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kZWNvZGVfdGFyZ2V0X2NyZWF0ZV9ibGl0dGVyLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kZWNvZGVfdGFyZ2V0X2NyZWF0ZV9ibGl0dGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDgwN2E3Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGVjb2RlX3RhcmdldF9jcmVhdGVfYmxpdHRlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvZGVjb2RlX3RhcmdldC5oIgotCi0jaWYgU0JfQVBJX1ZFUlNJT04gPCA0Ci0KLVNiRGVjb2RlVGFyZ2V0IFNiRGVjb2RlVGFyZ2V0Q3JlYXRlKFNiRGVjb2RlVGFyZ2V0Rm9ybWF0IC8qZm9ybWF0Ki8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkJsaXR0ZXJTdXJmYWNlKiAvKnBsYW5lcyovKSB7Ci0gIHJldHVybiBrU2JEZWNvZGVUYXJnZXRJbnZhbGlkOwotfQotCi0jZWxzZSAgLy8gU0JfQVBJX1ZFUlNJT04gPCA0Ci0KLVNiRGVjb2RlVGFyZ2V0IFNiRGVjb2RlVGFyZ2V0Q3JlYXRlKFNiQmxpdHRlckRldmljZSBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRlY29kZVRhcmdldEZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KSB7Ci0gIHJldHVybiBrU2JEZWNvZGVUYXJnZXRJbnZhbGlkOwotfQotCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgNApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kZWNvZGVfdGFyZ2V0X2NyZWF0ZV9lZ2wuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfY3JlYXRlX2VnbC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJmMTUxZi4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfY3JlYXRlX2VnbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvZGVjb2RlX3RhcmdldC5oIgotCi0jaWYgU0JfQVBJX1ZFUlNJT04gPCA0Ci1TYkRlY29kZVRhcmdldCBTYkRlY29kZVRhcmdldENyZWF0ZShFR0xEaXNwbGF5IC8qZGlzcGxheSovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMQ29udGV4dCAvKmNvbnRleHQqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRGVjb2RlVGFyZ2V0Rm9ybWF0IC8qZm9ybWF0Ki8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQqIC8qcGxhbmVzKi8pIHsKLSAgcmV0dXJuIGtTYkRlY29kZVRhcmdldEludmFsaWQ7Ci19Ci0jZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OIDwgNAotU2JEZWNvZGVUYXJnZXQgU2JEZWNvZGVUYXJnZXRDcmVhdGUodm9pZCogLypkaXNwbGF5Ki8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAvKmNvbnRleHQqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRGVjb2RlVGFyZ2V0Rm9ybWF0IC8qZm9ybWF0Ki8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyp3aWR0aCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qaGVpZ2h0Ki8pIHsKLSAgcmV0dXJuIGtTYkRlY29kZVRhcmdldEludmFsaWQ7Ci19Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgNApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kZWNvZGVfdGFyZ2V0X2dldF9mb3JtYXQuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfZ2V0X2Zvcm1hdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg1MzJmMy4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfZ2V0X2Zvcm1hdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvZGVjb2RlX3RhcmdldC5oIgotCi0jaWYgU0JfQVBJX1ZFUlNJT04gPCA0Ci0KLVNiRGVjb2RlVGFyZ2V0Rm9ybWF0IFNiRGVjb2RlVGFyZ2V0R2V0Rm9ybWF0KFNiRGVjb2RlVGFyZ2V0IC8qZGVjb2RlX3RhcmdldCovKSB7Ci0gIHJldHVybiBrU2JEZWNvZGVUYXJnZXRGb3JtYXRJbnZhbGlkOwotfQotCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgNApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kZWNvZGVfdGFyZ2V0X2dldF9pbmZvLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kZWNvZGVfdGFyZ2V0X2dldF9pbmZvLmNjCmluZGV4IGM4ZmU0NGMuLmZhMzRmYzAgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGVjb2RlX3RhcmdldF9nZXRfaW5mby5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfZ2V0X2luZm8uY2MKQEAgLTE0LDExICsxNCw3IEBACiAKICNpbmNsdWRlICJzdGFyYm9hcmQvZGVjb2RlX3RhcmdldC5oIgogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAotCiBib29sIFNiRGVjb2RlVGFyZ2V0R2V0SW5mbyhTYkRlY29kZVRhcmdldCAvKmRlY29kZV90YXJnZXQqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRGVjb2RlVGFyZ2V0SW5mbyogLypvdXRfaW5mbyovKSB7CiAgIHJldHVybiBmYWxzZTsKIH0KLQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfZ2V0X3BsYW5lX2JsaXR0ZXIuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfZ2V0X3BsYW5lX2JsaXR0ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYzA1MzguLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kZWNvZGVfdGFyZ2V0X2dldF9wbGFuZV9ibGl0dGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9kZWNvZGVfdGFyZ2V0LmgiCi0KLSNpZiBTQl9BUElfVkVSU0lPTiA8IDQKLQotI2lmIFNCX0hBUyhCTElUVEVSKQotU2JCbGl0dGVyU3VyZmFjZSBTYkRlY29kZVRhcmdldEdldFBsYW5lKFNiRGVjb2RlVGFyZ2V0IC8qZGVjb2RlX3RhcmdldCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRGVjb2RlVGFyZ2V0UGxhbmUgLypwbGFuZSovKSB7Ci0gIHJldHVybiBrU2JCbGl0dGVySW52YWxpZFN1cmZhY2U7Ci19Ci0jZW5kaWYgIC8vIFNCX0hBUyhCTElUVEVSKQotCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgNApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kZWNvZGVfdGFyZ2V0X2dldF9wbGFuZV9lZ2wuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfZ2V0X3BsYW5lX2VnbC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVjOTMwMC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfZ2V0X3BsYW5lX2VnbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvZGVjb2RlX3RhcmdldC5oIgotCi0jaWYgU0JfQVBJX1ZFUlNJT04gPCA0Ci0KLSNpZiBTQl9IQVMoR0xFUzIpCi1HTHVpbnQgU2JEZWNvZGVUYXJnZXRHZXRQbGFuZShTYkRlY29kZVRhcmdldCBkZWNvZGVfdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JEZWNvZGVUYXJnZXRQbGFuZSBwbGFuZSkgewotICByZXR1cm4gMDsKLX0KLSNlbmRpZiAgLy8gU0JfSEFTKEdMRVMyKQotCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgNApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kZWNvZGVfdGFyZ2V0X2dldF9zaXplLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kZWNvZGVfdGFyZ2V0X2dldF9zaXplLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWVlN2E1Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGVjb2RlX3RhcmdldF9nZXRfc2l6ZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvZGVjb2RlX3RhcmdldC5oIgotCi0jaWYgU0JfQVBJX1ZFUlNJT04gPCA0Ci0KLXZvaWQgU2JEZWNvZGVUYXJnZXRHZXRTaXplKFNiRGVjb2RlVGFyZ2V0IGRlY29kZV90YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG91dF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogb3V0X2hlaWdodCkgewotICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKGRlY29kZV90YXJnZXQpOwotICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKG91dF93aWR0aCk7Ci0gIFNCX1VOUkVGRVJFTkNFRF9QQVJBTUVURVIob3V0X2hlaWdodCk7Ci19Ci0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCA0CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfaXNfb3BhcXVlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kZWNvZGVfdGFyZ2V0X2lzX29wYXF1ZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYzMDFkOS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfaXNfb3BhcXVlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9jb25maWd1cmF0aW9uLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2RlY29kZV90YXJnZXQuaCIKLQotI2lmIFNCX0FQSV9WRVJTSU9OIDwgNAotCi0jaWYgIShTQl9BUElfVkVSU0lPTiA+PSAzICYmIFNCX0hBUyhHUkFQSElDUykpCi0jZXJyb3IgIlJlcXVpcmVzIFNCX0FQSV9WRVJTSU9OID49IDMgYW5kIFNCX0hBUyhHUkFQSElDUykuIgotI2VuZGlmCi0KLWJvb2wgU2JEZWNvZGVUYXJnZXRJc09wYXF1ZShTYkRlY29kZVRhcmdldCBkZWNvZGVfdGFyZ2V0KSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IDQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZHJtX2dlbmVyYXRlX3Nlc3Npb25fdXBkYXRlX3JlcXVlc3QuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RybV9nZW5lcmF0ZV9zZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0LmNjCmluZGV4IDc1MDZlMTEuLjc4OWUyZjQgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZHJtX2dlbmVyYXRlX3Nlc3Npb25fdXBkYXRlX3JlcXVlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kcm1fZ2VuZXJhdGVfc2Vzc2lvbl91cGRhdGVfcmVxdWVzdC5jYwpAQCAtMTUsOSArMTUsNyBAQAogI2luY2x1ZGUgInN0YXJib2FyZC9kcm0uaCIKIAogdm9pZCBTYkRybUdlbmVyYXRlU2Vzc2lvblVwZGF0ZVJlcXVlc3QoU2JEcm1TeXN0ZW0gLypkcm1fc3lzdGVtKi8sCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qdGlja2V0Ki8sCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qdHlwZSovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogLyppbml0aWFsaXphdGlvbl9kYXRhKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyppbml0aWFsaXphdGlvbl9kYXRhX3NpemUqLykgewpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kcm1fdXBkYXRlX3Nlc3Npb24uY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RybV91cGRhdGVfc2Vzc2lvbi5jYwppbmRleCA1YzdhOWQ2Li5lYTI0OTU0IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RybV91cGRhdGVfc2Vzc2lvbi5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RybV91cGRhdGVfc2Vzc2lvbi5jYwpAQCAtMTUsOSArMTUsNyBAQAogI2luY2x1ZGUgInN0YXJib2FyZC9kcm0uaCIKIAogdm9pZCBTYkRybVVwZGF0ZVNlc3Npb24oU2JEcm1TeXN0ZW0gLypkcm1fc3lzdGVtKi8sCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qdGlja2V0Ki8sCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIC8qa2V5Ki8sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyprZXlfc2l6ZSovLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogLypzZXNzaW9uX2lkKi8sCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2ltYWdlX2RlY29kZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvaW1hZ2VfZGVjb2RlLmNjCmluZGV4IGQwZDc3ODIuLmYxMzllZDUgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvaW1hZ2VfZGVjb2RlLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvaW1hZ2VfZGVjb2RlLmNjCkBAIC0xNSwxMSArMTUsMTAgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9pbWFnZS5oIgogCi0jaWYgIShTQl9BUElfVkVSU0lPTiA+PSAzICYmIFNCX0hBUyhHUkFQSElDUykpCi0jZXJyb3IgIlNiSW1hZ2VEZWNvZGUgcmVxdWlyZXMgU0JfQVBJX1ZFUlNJT04gPj0gMyBhbmQgU0JfSEFTKEdSQVBISUNTKS4iCisjaWYgIVNCX0hBUyhHUkFQSElDUykKKyNlcnJvciAiU2JJbWFnZURlY29kZSByZXF1aXJlcyBTQl9IQVMoR1JBUEhJQ1MpLiIKICNlbmRpZgogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogU2JEZWNvZGVUYXJnZXQgU2JJbWFnZURlY29kZShTYkRlY29kZVRhcmdldEdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKiBwcm92aWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRhdGFfc2l6ZSwKQEAgLTMyLDE3ICszMSwzIEBACiAgIFNCX1VOUkVGRVJFTkNFRF9QQVJBTUVURVIocHJvdmlkZXIpOwogICByZXR1cm4ga1NiRGVjb2RlVGFyZ2V0SW52YWxpZDsKIH0KLSNlbHNlICAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAotU2JEZWNvZGVUYXJnZXQgU2JJbWFnZURlY29kZShTYkRlY29kZVRhcmdldFByb3ZpZGVyKiBwcm92aWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWltZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRlY29kZVRhcmdldEZvcm1hdCBmb3JtYXQpIHsKLSAgU0JfVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihkYXRhKTsKLSAgU0JfVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihkYXRhX3NpemUpOwotICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKGZvcm1hdCk7Ci0gIFNCX1VOUkVGRVJFTkNFRF9QQVJBTUVURVIobWltZV90eXBlKTsKLSAgU0JfVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihwcm92aWRlcik7Ci0gIHJldHVybiBrU2JEZWNvZGVUYXJnZXRJbnZhbGlkOwotfQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2ltYWdlX2lzX2RlY29kZV9zdXBwb3J0ZWQuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2ltYWdlX2lzX2RlY29kZV9zdXBwb3J0ZWQuY2MKaW5kZXggYzQ0MjZmZC4uZmMwMzk1NiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9pbWFnZV9pc19kZWNvZGVfc3VwcG9ydGVkLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvaW1hZ2VfaXNfZGVjb2RlX3N1cHBvcnRlZC5jYwpAQCAtMTUsOCArMTUsOCBAQAogI2luY2x1ZGUgInN0YXJib2FyZC9jb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL2ltYWdlLmgiCiAKLSNpZiAhKFNCX0FQSV9WRVJTSU9OID49IDMgJiYgU0JfSEFTKEdSQVBISUNTKSkKLSNlcnJvciAiUmVxdWlyZXMgU0JfQVBJX1ZFUlNJT04gPj0gMyBhbmQgU0JfSEFTKEdSQVBISUNTKS4iCisjaWYgIVNCX0hBUyhHUkFQSElDUykKKyNlcnJvciAiUmVxdWlyZXMgU0JfSEFTKEdSQVBISUNTKS4iCiAjZW5kaWYKIAogYm9vbCBTYkltYWdlSXNEZWNvZGVTdXBwb3J0ZWQoY29uc3QgY2hhciogbWltZV90eXBlLApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9taWNyb3Bob25lX2Nsb3NlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9taWNyb3Bob25lX2Nsb3NlLmNjCmluZGV4IDkyNDYyMDIuLjc1ODllYzQgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvbWljcm9waG9uZV9jbG9zZS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL21pY3JvcGhvbmVfY2xvc2UuY2MKQEAgLTE0LDEwICsxNCwxMCBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL21pY3JvcGhvbmUuaCIKIAotI2lmIFNCX0hBUyhNSUNST1BIT05FKSAmJiBTQl9BUElfVkVSU0lPTiA+PSAyCisjaWYgIVNCX0hBUyhNSUNST1BIT05FKQorI2Vycm9yICJTQl9IQVNfTUlDUk9QSE9ORSBtdXN0IGJlIHNldCB0byBidWlsZCB0aGlzIGZpbGUuIgorI2VuZGlmCiAKIGJvb2wgU2JNaWNyb3Bob25lQ2xvc2UoU2JNaWNyb3Bob25lIG1pY3JvcGhvbmUpIHsKICAgcmV0dXJuIGZhbHNlOwogfQotCi0jZW5kaWYgIC8vIFNCX0hBUyhNSUNST1BIT05FKSAmJiBTQl9BUElfVkVSU0lPTiA+PSAyCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL21pY3JvcGhvbmVfY3JlYXRlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9taWNyb3Bob25lX2NyZWF0ZS5jYwppbmRleCBiZGM0MTY2Li44MzJkOTdhIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL21pY3JvcGhvbmVfY3JlYXRlLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvbWljcm9waG9uZV9jcmVhdGUuY2MKQEAgLTE0LDEyICsxNCwxMiBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL21pY3JvcGhvbmUuaCIKIAotI2lmIFNCX0hBUyhNSUNST1BIT05FKSAmJiBTQl9BUElfVkVSU0lPTiA+PSAyCisjaWYgIVNCX0hBUyhNSUNST1BIT05FKQorI2Vycm9yICJTQl9IQVNfTUlDUk9QSE9ORSBtdXN0IGJlIHNldCB0byBidWlsZCB0aGlzIGZpbGUuIgorI2VuZGlmCiAKIFNiTWljcm9waG9uZSBTYk1pY3JvcGhvbmVDcmVhdGUoU2JNaWNyb3Bob25lSWQgaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVfcmF0ZV9pbl9oeiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlcl9zaXplKSB7CiAgIHJldHVybiBrU2JNaWNyb3Bob25lSW52YWxpZDsKIH0KLQotI2VuZGlmICAvLyBTQl9IQVMoTUlDUk9QSE9ORSkgJiYgU0JfQVBJX1ZFUlNJT04gPj0gMgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9taWNyb3Bob25lX2Rlc3Ryb3kuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL21pY3JvcGhvbmVfZGVzdHJveS5jYwppbmRleCBiMGJiZGFiLi5mNzc1OWQ1IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL21pY3JvcGhvbmVfZGVzdHJveS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL21pY3JvcGhvbmVfZGVzdHJveS5jYwpAQCAtMTQsOCArMTQsOCBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL21pY3JvcGhvbmUuaCIKIAotI2lmIFNCX0hBUyhNSUNST1BIT05FKSAmJiBTQl9BUElfVkVSU0lPTiA+PSAyCisjaWYgIVNCX0hBUyhNSUNST1BIT05FKQorI2Vycm9yICJTQl9IQVNfTUlDUk9QSE9ORSBtdXN0IGJlIHNldCB0byBidWlsZCB0aGlzIGZpbGUuIgorI2VuZGlmCiAKIHZvaWQgU2JNaWNyb3Bob25lRGVzdHJveShTYk1pY3JvcGhvbmUgbWljcm9waG9uZSkge30KLQotI2VuZGlmICAvLyBTQl9IQVMoTUlDUk9QSE9ORSkgJiYgU0JfQVBJX1ZFUlNJT04gPj0gMgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9taWNyb3Bob25lX2dldF9hdmFpbGFibGUuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL21pY3JvcGhvbmVfZ2V0X2F2YWlsYWJsZS5jYwppbmRleCAyNjRiMmQwLi5iZGRiZjkxIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL21pY3JvcGhvbmVfZ2V0X2F2YWlsYWJsZS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL21pY3JvcGhvbmVfZ2V0X2F2YWlsYWJsZS5jYwpAQCAtMTQsMTEgKzE0LDExIEBACiAKICNpbmNsdWRlICJzdGFyYm9hcmQvbWljcm9waG9uZS5oIgogCi0jaWYgU0JfSEFTKE1JQ1JPUEhPTkUpICYmIFNCX0FQSV9WRVJTSU9OID49IDIKKyNpZiAhU0JfSEFTKE1JQ1JPUEhPTkUpCisjZXJyb3IgIlNCX0hBU19NSUNST1BIT05FIG11c3QgYmUgc2V0IHRvIGJ1aWxkIHRoaXMgZmlsZS4iCisjZW5kaWYKIAogaW50IFNiTWljcm9waG9uZUdldEF2YWlsYWJsZShTYk1pY3JvcGhvbmVJbmZvKiBvdXRfaW5mb19hcnJheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZm9fYXJyYXlfc2l6ZSkgewogICByZXR1cm4gMDsKIH0KLQotI2VuZGlmICAvLyBTQl9IQVMoTUlDUk9QSE9ORSkgJiYgU0JfQVBJX1ZFUlNJT04gPj0gMgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9taWNyb3Bob25lX2lzX3NhbXBsZV9yYXRlX3N1cHBvcnRlZC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvbWljcm9waG9uZV9pc19zYW1wbGVfcmF0ZV9zdXBwb3J0ZWQuY2MKaW5kZXggODJjZmJjMS4uYzA5ZjgzZCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9taWNyb3Bob25lX2lzX3NhbXBsZV9yYXRlX3N1cHBvcnRlZC5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL21pY3JvcGhvbmVfaXNfc2FtcGxlX3JhdGVfc3VwcG9ydGVkLmNjCkBAIC0xNCwxMSArMTQsMTEgQEAKIAogI2luY2x1ZGUgInN0YXJib2FyZC9taWNyb3Bob25lLmgiCiAKLSNpZiBTQl9IQVMoTUlDUk9QSE9ORSkgJiYgU0JfQVBJX1ZFUlNJT04gPj0gMgorI2lmICFTQl9IQVMoTUlDUk9QSE9ORSkKKyNlcnJvciAiU0JfSEFTX01JQ1JPUEhPTkUgbXVzdCBiZSBzZXQgdG8gYnVpbGQgdGhpcyBmaWxlLiIKKyNlbmRpZgogCiBib29sIFNiTWljcm9waG9uZUlzU2FtcGxlUmF0ZVN1cHBvcnRlZChTYk1pY3JvcGhvbmVJZCBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVfcmF0ZV9pbl9oeikgewogICByZXR1cm4gZmFsc2U7CiB9Ci0KLSNlbmRpZiAgLy8gU0JfSEFTKE1JQ1JPUEhPTkUpICYmIFNCX0FQSV9WRVJTSU9OID49IDIKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvbWljcm9waG9uZV9vcGVuLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9taWNyb3Bob25lX29wZW4uY2MKaW5kZXggMTlmZWRiZi4uNmYzNjk0OSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9taWNyb3Bob25lX29wZW4uY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9taWNyb3Bob25lX29wZW4uY2MKQEAgLTE0LDEwICsxNCwxMCBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL21pY3JvcGhvbmUuaCIKIAotI2lmIFNCX0hBUyhNSUNST1BIT05FKSAmJiBTQl9BUElfVkVSU0lPTiA+PSAyCisjaWYgIVNCX0hBUyhNSUNST1BIT05FKQorI2Vycm9yICJTQl9IQVNfTUlDUk9QSE9ORSBtdXN0IGJlIHNldCB0byBidWlsZCB0aGlzIGZpbGUuIgorI2VuZGlmCiAKIGJvb2wgU2JNaWNyb3Bob25lT3BlbihTYk1pY3JvcGhvbmUgbWljcm9waG9uZSkgewogICByZXR1cm4gZmFsc2U7CiB9Ci0KLSNlbmRpZiAgLy8gU0JfSEFTKE1JQ1JPUEhPTkUpICYmIFNCX0FQSV9WRVJTSU9OID49IDIKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvbWljcm9waG9uZV9yZWFkLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9taWNyb3Bob25lX3JlYWQuY2MKaW5kZXggZDc5OGQ1Ny4uM2ExNmI3MyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9taWNyb3Bob25lX3JlYWQuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9taWNyb3Bob25lX3JlYWQuY2MKQEAgLTE0LDEyICsxNCwxMiBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL21pY3JvcGhvbmUuaCIKIAotI2lmIFNCX0hBUyhNSUNST1BIT05FKSAmJiBTQl9BUElfVkVSU0lPTiA+PSAyCisjaWYgIVNCX0hBUyhNSUNST1BIT05FKQorI2Vycm9yICJTQl9IQVNfTUlDUk9QSE9ORSBtdXN0IGJlIHNldCB0byBidWlsZCB0aGlzIGZpbGUuIgorI2VuZGlmCiAKIGludCBTYk1pY3JvcGhvbmVSZWFkKFNiTWljcm9waG9uZSBtaWNyb3Bob25lLAogICAgICAgICAgICAgICAgICAgICAgdm9pZCogb3V0X2F1ZGlvX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9fZGF0YV9zaXplKSB7CiAgIHJldHVybiAtMTsKIH0KLQotI2VuZGlmICAvLyBTQl9IQVMoTUlDUk9QSE9ORSkgJiYgU0JfQVBJX1ZFUlNJT04gPj0gMgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfY3JlYXRlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfY3JlYXRlLmNjCmluZGV4IGE5MWUzMDQuLjM1YjA1ZmQgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX2NyZWF0ZS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3BsYXllcl9jcmVhdGUuY2MKQEAgLTI3LDE1ICsyNyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBTYlBsYXllckRlYWxsb2NhdGVTYW1wbGVGdW5jIC8qc2FtcGxlX2RlYWxsb2NhdGVfZnVuYyovLAogICAgICAgICAgICAgICAgICAgICAgICAgU2JQbGF5ZXJEZWNvZGVyU3RhdHVzRnVuYyAvKmRlY29kZXJfc3RhdHVzX2Z1bmMqLywKICAgICAgICAgICAgICAgICAgICAgICAgIFNiUGxheWVyU3RhdHVzRnVuYyAvKnBsYXllcl9zdGF0dXNfZnVuYyovLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogLypjb250ZXh0Ki8KLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0Ci0gICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAvKmNvbnRleHQqLywKICAgICAgICAgICAgICAgICAgICAgICAgIFNiUGxheWVyT3V0cHV0TW9kZSAvKm91dHB1dF9tb2RlKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICBTYkRlY29kZVRhcmdldEdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKiAvKnByb3ZpZGVyKi8KLSNlbGlmIFNCX0FQSV9WRVJTSU9OID49IDMKLSAgICAgICAgICAgICAgICAgICAgICAgICwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNiRGVjb2RlVGFyZ2V0UHJvdmlkZXIqIC8qcHJvdmlkZXIqLwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNiRGVjb2RlVGFyZ2V0R3JhcGhpY3NDb250ZXh0UHJvdmlkZXIqIC8qcHJvdmlkZXIqLykgewogICByZXR1cm4ga1NiUGxheWVySW52YWxpZDsKIH0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX2dldF9jdXJyZW50X2ZyYW1lLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfZ2V0X2N1cnJlbnRfZnJhbWUuY2MKaW5kZXggOTE3ZTBmMy4uOGY5NGQxZSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfZ2V0X2N1cnJlbnRfZnJhbWUuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfZ2V0X2N1cnJlbnRfZnJhbWUuY2MKQEAgLTE0LDEwICsxNCwxMCBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL3BsYXllci5oIgogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAorI2lmICFTQl9IQVMoUExBWUVSKQorI2Vycm9yICJUaGlzIGZpbGUgcmVxdWlyZXMgU0JfSEFTKFBMQVlFUikuIgorI2VuZGlmCiAKIFNiRGVjb2RlVGFyZ2V0IFNiUGxheWVyR2V0Q3VycmVudEZyYW1lKFNiUGxheWVyIC8qcGxheWVyKi8pIHsKICAgcmV0dXJuIGtTYkRlY29kZVRhcmdldEludmFsaWQ7CiB9Ci0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfb3V0cHV0X21vZGVfc3VwcG9ydGVkLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfb3V0cHV0X21vZGVfc3VwcG9ydGVkLmNjCmluZGV4IDQzN2Q1ZTYuLmY4MWE3YmMgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX291dHB1dF9tb2RlX3N1cHBvcnRlZC5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3BsYXllcl9vdXRwdXRfbW9kZV9zdXBwb3J0ZWQuY2MKQEAgLTE0LDEyICsxNCwxMiBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL3BsYXllci5oIgogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAorI2lmICFTQl9IQVMoUExBWUVSKQorI2Vycm9yICJUaGlzIGZpbGUgcmVxdWlyZXMgU0JfSEFTKFBMQVlFUikuIgorI2VuZGlmCiAKIGJvb2wgU2JQbGF5ZXJPdXRwdXRNb2RlU3VwcG9ydGVkKFNiUGxheWVyT3V0cHV0TW9kZSAvKm91dHB1dF9tb2RlKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYk1lZGlhVmlkZW9Db2RlYyAvKmNvZGVjKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRybVN5c3RlbSAvKmRybV9zeXN0ZW0qLykgewogICByZXR1cm4gZmFsc2U7CiB9Ci0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfc2V0X2JvdW5kcy5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX3NldF9ib3VuZHMuY2MKaW5kZXggNWZiZWU2Ny4uNTAwOGJkOCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfc2V0X2JvdW5kcy5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3BsYXllcl9zZXRfYm91bmRzLmNjCkBAIC0xNCwxNiArMTQsMTQgQEAKIAogI2luY2x1ZGUgInN0YXJib2FyZC9wbGF5ZXIuaCIKIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQgfHwgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQorI2lmICFTQl9IQVMoUExBWUVSKQorI2Vycm9yICJUaGlzIGZpbGUgcmVxdWlyZXMgU0JfSEFTKFBMQVlFUikuIgorI2VuZGlmCiAKIHZvaWQgU2JQbGF5ZXJTZXRCb3VuZHMoU2JQbGF5ZXIgLypwbGF5ZXIqLywKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKnpfaW5kZXgqLywKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyp4Ki8sCiAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKnkqLywKICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qd2lkdGgqLywKICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qaGVpZ2h0Ki8pIHsKIH0KLQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0IHx8IFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX3NldF9wYXVzZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX3NldF9wYXVzZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJmNGQ2MC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3BsYXllcl9zZXRfcGF1c2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3BsYXllci5oIgotCi0jaWYgU0JfQVBJX1ZFUlNJT04gPCA0Ci0KLXZvaWQgU2JQbGF5ZXJTZXRQYXVzZShTYlBsYXllciAvKnBsYXllciovLCBib29sIC8qcGF1c2UqLykge30KLQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IDQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX3NldF9wbGF5YmFja19yYXRlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfc2V0X3BsYXliYWNrX3JhdGUuY2MKaW5kZXggYzkxMDNhYS4uNjkzN2NiNiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfc2V0X3BsYXliYWNrX3JhdGUuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfc2V0X3BsYXliYWNrX3JhdGUuY2MKQEAgLTE0LDEwICsxNCwxMCBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL3BsYXllci5oIgogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAorI2lmICFTQl9IQVMoUExBWUVSKQorI2Vycm9yICJUaGlzIGZpbGUgcmVxdWlyZXMgU0JfSEFTKFBMQVlFUikuIgorI2VuZGlmCiAKIGJvb2wgU2JQbGF5ZXJTZXRQbGF5YmFja1JhdGUoU2JQbGF5ZXIgLypwbGF5ZXIqLywgZG91YmxlIC8qcGxheWJhY2tfcmF0ZSovKSB7CiAgIHJldHVybiBmYWxzZTsKIH0KLQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3BsYXllcl93cml0ZV9zYW1wbGUuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3BsYXllcl93cml0ZV9zYW1wbGUuY2MKaW5kZXggMDQ1MGVmZC4uZTA4YjRiNCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfd3JpdGVfc2FtcGxlLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX3dyaXRlX3NhbXBsZS5jYwpAQCAtMTQsNyArMTQsOSBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL3BsYXllci5oIgogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAorI2lmICFTQl9IQVMoUExBWUVSKQorI2Vycm9yICJUaGlzIGZpbGUgcmVxdWlyZXMgU0JfSEFTKFBMQVlFUikuIgorI2VuZGlmCiAKIHZvaWQgU2JQbGF5ZXJXcml0ZVNhbXBsZShTYlBsYXllciAvKnBsYXllciovLAogICAgICAgICAgICAgICAgICAgICAgICAgIFNiTWVkaWFUeXBlIC8qc2FtcGxlX3R5cGUqLywKQEAgLTMwLDE1ICszMiwzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2JNZWRpYVZpZGVvU2FtcGxlSW5mbyogLyp2aWRlb19zYW1wbGVfaW5mbyovLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNiRHJtU2FtcGxlSW5mbyogLypzYW1wbGVfZHJtX2luZm8qLykgewogfQotCi0jZWxzZSAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAotCi12b2lkIFNiUGxheWVyV3JpdGVTYW1wbGUoU2JQbGF5ZXIgLypwbGF5ZXIqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICBTYk1lZGlhVHlwZSAvKnNhbXBsZV90eXBlKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogLypzYW1wbGVfYnVmZmVyKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qc2FtcGxlX2J1ZmZlcl9zaXplKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgU2JNZWRpYVRpbWUgLypzYW1wbGVfcHRzKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2JNZWRpYVZpZGVvU2FtcGxlSW5mbyogLyp2aWRlb19zYW1wbGVfaW5mbyovLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNiRHJtU2FtcGxlSW5mbyogLypzYW1wbGVfZHJtX2luZm8qLykge30KLQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3NvY2tldF9nZXRfaW50ZXJmYWNlX2FkZHJlc3MuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3NvY2tldF9nZXRfaW50ZXJmYWNlX2FkZHJlc3MuY2MKaW5kZXggYzMxY2Q4NC4uOTM2ZTQzNCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zb2NrZXRfZ2V0X2ludGVyZmFjZV9hZGRyZXNzLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc29ja2V0X2dldF9pbnRlcmZhY2VfYWRkcmVzcy5jYwpAQCAtMTQsMTIgKzE0LDggQEAKIAogI2luY2x1ZGUgInN0YXJib2FyZC9zb2NrZXQuaCIKIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKLQogYm9vbCBTYlNvY2tldEdldEludGVyZmFjZUFkZHJlc3MoY29uc3QgU2JTb2NrZXRBZGRyZXNzKiBjb25zdCAvKmRlc3RpbmF0aW9uKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYlNvY2tldEFkZHJlc3MqIC8qb3V0X3NvdXJjZV9hZGRyZXNzKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYlNvY2tldEFkZHJlc3MqIC8qb3V0X25ldG1hc2sqLykgewogICByZXR1cm4gZmFsc2U7CiB9Ci0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zb2NrZXRfZ2V0X2xvY2FsX2ludGVyZmFjZV9hZGRyZXNzLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zb2NrZXRfZ2V0X2xvY2FsX2ludGVyZmFjZV9hZGRyZXNzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2U0YWI1Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc29ja2V0X2dldF9sb2NhbF9pbnRlcmZhY2VfYWRkcmVzcy5jYworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc29ja2V0LmgiCi0KLSNpZiBTQl9BUElfVkVSU0lPTiA8IDQKLQotYm9vbCBTYlNvY2tldEdldExvY2FsSW50ZXJmYWNlQWRkcmVzcyhTYlNvY2tldEFkZHJlc3MqIC8qb3V0X2FkZHJlc3MqLykgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCA0CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3NwZWVjaF9zeW50aGVzaXNfY2FuY2VsLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zcGVlY2hfc3ludGhlc2lzX2NhbmNlbC5jYwppbmRleCA1MDcxMzk0Li45NDEzYjMyIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3NwZWVjaF9zeW50aGVzaXNfY2FuY2VsLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3BlZWNoX3N5bnRoZXNpc19jYW5jZWwuY2MKQEAgLTE0LDcgKzE0LDcgQEAKIAogI2luY2x1ZGUgInN0YXJib2FyZC9zcGVlY2hfc3ludGhlc2lzLmgiCiAKLSNpZiAhU0JfSEFTKFNQRUVDSF9TWU5USEVTSVMpICYmIFNCX0FQSV9WRVJTSU9OID49IDMKKyNpZiAhU0JfSEFTKFNQRUVDSF9TWU5USEVTSVMpCiAjZXJyb3IgSWYgc3BlZWNoIHN5bnRoZXNpcyBub3QgZW5hYmxlZCBvbiB0aGlzIHBsYXRmb3JtLCBwbGVhc2UgZXhjbHVkZSBpdFwKICAgICAgICBmcm9tIHRoZSBidWlsZAogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3NwZWVjaF9zeW50aGVzaXNfc2V0X2xhbmd1YWdlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zcGVlY2hfc3ludGhlc2lzX3NldF9sYW5ndWFnZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNjMTA0Mi4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3NwZWVjaF9zeW50aGVzaXNfc2V0X2xhbmd1YWdlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmIFNCX0FQSV9WRVJTSU9OIDwgNAotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NwZWVjaF9zeW50aGVzaXMuaCIKLQotI2lmICFTQl9IQVMoU1BFRUNIX1NZTlRIRVNJUykgJiYgU0JfQVBJX1ZFUlNJT04gPj0gMwotI2Vycm9yIElmIHNwZWVjaCBzeW50aGVzaXMgbm90IGVuYWJsZWQgb24gdGhpcyBwbGF0Zm9ybSwgcGxlYXNlIGV4Y2x1ZGUgaXRcCi0gICAgICAgZnJvbSB0aGUgYnVpbGQKLSNlbmRpZgotCi1ib29sIFNiU3BlZWNoU3ludGhlc2lzU2V0TGFuZ3VhZ2UoY29uc3QgY2hhciogbGFuZykgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zcGVlY2hfc3ludGhlc2lzX3NwZWFrLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zcGVlY2hfc3ludGhlc2lzX3NwZWFrLmNjCmluZGV4IGEwNmM5Y2YuLjBjZDIxNjMgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3BlZWNoX3N5bnRoZXNpc19zcGVhay5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3NwZWVjaF9zeW50aGVzaXNfc3BlYWsuY2MKQEAgLTE0LDcgKzE0LDcgQEAKIAogI2luY2x1ZGUgInN0YXJib2FyZC9zcGVlY2hfc3ludGhlc2lzLmgiCiAKLSNpZiAhU0JfSEFTKFNQRUVDSF9TWU5USEVTSVMpICYmIFNCX0FQSV9WRVJTSU9OID49IDMKKyNpZiAhU0JfSEFTKFNQRUVDSF9TWU5USEVTSVMpCiAjZXJyb3IgSWYgc3BlZWNoIHN5bnRoZXNpcyBub3QgZW5hYmxlZCBvbiB0aGlzIHBsYXRmb3JtLCBwbGVhc2UgZXhjbHVkZSBpdFwKICAgICAgICBmcm9tIHRoZSBidWlsZAogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3N5c3RlbV9yZXF1ZXN0X3BhdXNlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zeXN0ZW1fcmVxdWVzdF9wYXVzZS5jYwppbmRleCA2MThjZmI4Li43YWI4MzU5IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3N5c3RlbV9yZXF1ZXN0X3BhdXNlLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3lzdGVtX3JlcXVlc3RfcGF1c2UuY2MKQEAgLTE0LDkgKzE0LDUgQEAKIAogI2luY2x1ZGUgInN0YXJib2FyZC9zeXN0ZW0uaCIKIAotI2lmIFNCX0FQSV9WRVJTSU9OIDwgNAotI2Vycm9yICJTYlN5c3RlbVJlcXVlc3RQYXVzZSByZXF1aXJlcyBTQl9BUElfVkVSU0lPTiA+PSA0LiIKLSNlbmRpZgotCiB2b2lkIFNiU3lzdGVtUmVxdWVzdFBhdXNlKCkgewogfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zeXN0ZW1fcmVxdWVzdF9zdXNwZW5kLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zeXN0ZW1fcmVxdWVzdF9zdXNwZW5kLmNjCmluZGV4IGY5ZTI4YjAuLmFlNjY4MGMgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3lzdGVtX3JlcXVlc3Rfc3VzcGVuZC5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3N5c3RlbV9yZXF1ZXN0X3N1c3BlbmQuY2MKQEAgLTE0LDkgKzE0LDUgQEAKIAogI2luY2x1ZGUgInN0YXJib2FyZC9zeXN0ZW0uaCIKIAotI2lmIFNCX0FQSV9WRVJTSU9OIDwgNAotI2Vycm9yICJTYlN5c3RlbVJlcXVlc3RTdXNwZW5kIHJlcXVpcmVzIFNCX0FQSV9WRVJTSU9OID49IDQuIgotI2VuZGlmCi0KIHZvaWQgU2JTeXN0ZW1SZXF1ZXN0U3VzcGVuZCgpIHsKIH0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3lzdGVtX3JlcXVlc3RfdW5wYXVzZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3lzdGVtX3JlcXVlc3RfdW5wYXVzZS5jYwppbmRleCBiMzgyMGRjLi5lZTZiNDJhIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3N5c3RlbV9yZXF1ZXN0X3VucGF1c2UuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zeXN0ZW1fcmVxdWVzdF91bnBhdXNlLmNjCkBAIC0xNCw5ICsxNCw1IEBACiAKICNpbmNsdWRlICJzdGFyYm9hcmQvc3lzdGVtLmgiCiAKLSNpZiBTQl9BUElfVkVSU0lPTiA8IDQKLSNlcnJvciAiU2JTeXN0ZW1SZXF1ZXN0VW5wYXVzZSByZXF1aXJlcyBTQl9BUElfVkVSU0lPTiA+PSA0LiIKLSNlbmRpZgotCiB2b2lkIFNiU3lzdGVtUmVxdWVzdFVucGF1c2UoKSB7CiB9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3AvYXBwbGljYXRpb25fdXdwX2tleV9ldmVudC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9hcHBsaWNhdGlvbl91d3Bfa2V5X2V2ZW50LmNjCmluZGV4IGFiYzNlZjMuLjczYjdkMjcgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9hcHBsaWNhdGlvbl91d3Bfa2V5X2V2ZW50LmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9hcHBsaWNhdGlvbl91d3Bfa2V5X2V2ZW50LmNjCkBAIC0yMDcsOCArMjA3LDggQEAKICAgICBjYXNlIFZpcnR1YWxLZXk6OkdhbWVwYWREUGFkRG93bjogcmV0dXJuIGtTYktleUdhbWVwYWREUGFkRG93bjsKICAgICBjYXNlIFZpcnR1YWxLZXk6OkdhbWVwYWREUGFkTGVmdDogcmV0dXJuIGtTYktleUdhbWVwYWREUGFkTGVmdDsKICAgICBjYXNlIFZpcnR1YWxLZXk6OkdhbWVwYWREUGFkUmlnaHQ6IHJldHVybiBrU2JLZXlHYW1lcGFkRFBhZFJpZ2h0OwotICAgIGNhc2UgVmlydHVhbEtleTo6R2FtZXBhZE1lbnU6IHJldHVybiBrU2JLZXlNZWRpYUxhdW5jaE1lZGlhU2VsZWN0OwotICAgIGNhc2UgVmlydHVhbEtleTo6R2FtZXBhZFZpZXc6IHJldHVybiBrU2JLZXlGMTsKKyAgICBjYXNlIFZpcnR1YWxLZXk6OkdhbWVwYWRNZW51OiByZXR1cm4ga1NiS2V5R2FtZXBhZDY7CisgICAgY2FzZSBWaXJ0dWFsS2V5OjpHYW1lcGFkVmlldzogcmV0dXJuIGtTYktleUdhbWVwYWQ1OwogICAgIGNhc2UgVmlydHVhbEtleTo6R2FtZXBhZExlZnRUaHVtYnN0aWNrQnV0dG9uOgogICAgICAgcmV0dXJuIGtTYktleUdhbWVwYWRMZWZ0U3RpY2s7CiAgICAgY2FzZSBWaXJ0dWFsS2V5OjpHYW1lcGFkUmlnaHRUaHVtYnN0aWNrQnV0dG9uOgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL3N5c3RlbV9nZXRfcHJvcGVydHkuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3Avc3lzdGVtX2dldF9wcm9wZXJ0eS5jYwppbmRleCAwYzQ4OTcxLi4xZjQ5MjRhIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3Avc3lzdGVtX2dldF9wcm9wZXJ0eS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3Avc3lzdGVtX2dldF9wcm9wZXJ0eS5jYwpAQCAtMTEwLDE1ICsxMTAsMjQgQEAKICAgICBjYXNlIGtTYlN5c3RlbVByb3BlcnR5TW9kZWxOYW1lOiB7DQogICAgICAgRWFzQ2xpZW50RGV2aWNlSW5mb3JtYXRpb25eIGN1cnJlbnRfZGV2aWNlX2luZm8gPQ0KICAgICAgICAgICByZWYgbmV3IEVhc0NsaWVudERldmljZUluZm9ybWF0aW9uKCk7DQotICAgICAgLy8gVE9ETzogVXNlIFN5c3RlbVNrdSBhbmQgbWFwIHRvIGZyaWVuZGx5IG5hbWVzIGluc3RlYWQuDQotICAgICAgc3RkOjpzdHJpbmcgcHJvZHVjdF9uYW1lID0NCi0gICAgICAgICAgcGxhdGZvcm1TdHJpbmdUb1N0cmluZyhjdXJyZW50X2RldmljZV9pbmZvLT5TeXN0ZW1Qcm9kdWN0TmFtZSk7DQotICAgICAgcHJvZHVjdF9uYW1lLmVyYXNlKA0KLSAgICAgICAgICBzdGQ6OnJlbW92ZShwcm9kdWN0X25hbWUuYmVnaW4oKSwgcHJvZHVjdF9uYW1lLmVuZCgpLCAnICcpLA0KLSAgICAgICAgICBwcm9kdWN0X25hbWUuZW5kKCkpOw0KKyAgICAgIHN0ZDo6c3RyaW5nIHNrdSA9DQorICAgICAgICBwbGF0Zm9ybVN0cmluZ1RvU3RyaW5nKGN1cnJlbnRfZGV2aWNlX2luZm8tPlN5c3RlbVNrdSk7DQorDQorICAgICAgc3RkOjpzdHJpbmcgZnJpZW5kbHlfbmFtZTsNCisNCisgICAgICAvLyBUT0RPOiBNb3ZlIHRoaXMgbG9naWMgaW50byB4YjEgc3BlY2lmaWMgZGlyZWN0b3J5Lg0KKyAgICAgIGlmIChza3UgPT0gIlhCT1hfT05FX0RVIikgew0KKyAgICAgICAgZnJpZW5kbHlfbmFtZSA9ICJYYm94T25lIjsNCisgICAgICB9IGVsc2UgaWYgKHNrdSA9PSAiWEJPWF9PTkVfRUQiKSB7DQorICAgICAgICBmcmllbmRseV9uYW1lID0gIlhib3hPbmUgUyI7DQorICAgICAgfSBlbHNlIGlmIChza3UgPT0gIlhCT1hfT05FX0NIIikgew0KKyAgICAgICAgZnJpZW5kbHlfbmFtZSA9ICJYYm94T25lIFgiOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBmcmllbmRseV9uYW1lID0gIlhib3hPbmUgIiArIHNrdTsNCisgICAgICB9DQogDQogICAgICAgcmV0dXJuIENvcHlTdHJpbmdBbmRUZXN0SWZTdWNjZXNzKG91dF92YWx1ZSwgdmFsdWVfbGVuZ3RoLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X25hbWUuY19zdHIoKSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyaWVuZGx5X25hbWUuY19zdHIoKSk7DQogICAgIH0NCiAgICAgY2FzZSBrU2JTeXN0ZW1Qcm9wZXJ0eUZyaWVuZGx5TmFtZTogew0KICAgICAgIEVhc0NsaWVudERldmljZUluZm9ybWF0aW9uXiBjdXJyZW50X2RldmljZV9pbmZvID0NCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kZWNyeXB0aW5nX2RlY29kZXIuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kZWNyeXB0aW5nX2RlY29kZXIuY2MKaW5kZXggMGIyNTA4NS4uY2E1OTBmOSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZGVjcnlwdGluZ19kZWNvZGVyLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RlY3J5cHRpbmdfZGVjb2Rlci5jYwpAQCAtMTE2LDcgKzExNiw3IEBACiAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxJbnB1dEJ1ZmZlcj4mIGlucHV0X2J1ZmZlciwKICAgICBpbnQgYnl0ZXNfdG9fc2tpcF9pbl9zYW1wbGUpIHsKICAgU0JfRENIRUNLKGlucHV0X2J1ZmZlcik7Ci0gIFNCX0RDSEVDSyhieXRlc190b19za2lwX2luX3NhbXBsZSA+IDApOworICBTQl9EQ0hFQ0soYnl0ZXNfdG9fc2tpcF9pbl9zYW1wbGUgPj0gMCk7CiAKICAgQ29tUHRyPElNRlNhbXBsZT4gaW5wdXRfc2FtcGxlOwogCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kcm1fc3lzdGVtX3BsYXlyZWFkeS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RybV9zeXN0ZW1fcGxheXJlYWR5LmNjCmluZGV4IDg4NTY5MzcuLjM4ZmI2MjggMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RybV9zeXN0ZW1fcGxheXJlYWR5LmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RybV9zeXN0ZW1fcGxheXJlYWR5LmNjCkBAIC0xMTgsNyArMTE4LDYgQEAKICAgfQogICBpdGVyLT5zZWNvbmQtPlVwZGF0ZUxpY2Vuc2Uoa2V5LCBrZXlfc2l6ZSk7CiAKLSAgU0JfRENIRUNLKGl0ZXItPnNlY29uZC0+dXNhYmxlKCkpOwogICBpZiAoaXRlci0+c2Vjb25kLT51c2FibGUoKSkgewogICAgIFNCX0xPR19JRihJTkZPLCBrRW5hYmxlUGxheXJlYWR5TG9nKQogICAgICAgICA8PCAiU3VjY2Vzc2Z1bGx5IGFkZCBrZXkgZm9yIGtleSBpZCAiCkBAIC0xODAsNiArMTc5LDE1IEBACiAgIFNjb3BlZExvY2sgbG9jayhtdXRleF8pOwogICBmb3IgKGF1dG8mIGl0ZW0gOiBzdWNjZXNzZnVsX3JlcXVlc3RzXykgewogICAgIGlmIChpdGVtLnNlY29uZC0+a2V5X2lkKCkgPT0ga2V5X2lkKSB7CisgICAgICBpZiAoYnVmZmVyLT5zYW1wbGVfdHlwZSgpID09IGtTYk1lZGlhVHlwZUF1ZGlvKSB7CisgICAgICAgIHJldHVybiBrU3VjY2VzczsKKyAgICAgIH0KKworICAgICAgaWYgKGl0ZW0uc2Vjb25kLT5Jc0hEQ1BSZXF1aXJlZCgpKSB7CisgICAgICAgIC8vIFRPRE86IEVuZm9yY2UgSERDUAorICAgICAgICAvLyBpZiAoIWlzX2hkY3BfZW5hYmxlZCgpKSB7IHJldHVybiBrRmFpbHVyZTsgfQorICAgICAgfQorCiAgICAgICByZXR1cm4ga1N1Y2Nlc3M7CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kcm1fc3lzdGVtX3BsYXlyZWFkeS5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZHJtX3N5c3RlbV9wbGF5cmVhZHkuaAppbmRleCA0OGQ2MDhlLi42NzM1MDBlIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kcm1fc3lzdGVtX3BsYXlyZWFkeS5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RybV9zeXN0ZW1fcGxheXJlYWR5LmgKQEAgLTQ3LDYgKzQ3LDcgQEAKICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGxpY2Vuc2VfY2hhbGxlbmdlKCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgTWljcm9zb2Z0OjpXUkw6OkNvbVB0cjxJTUZUcmFuc2Zvcm0+IGRlY3J5cHRvcigpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgVXBkYXRlTGljZW5zZShjb25zdCB2b2lkKiBsaWNlbnNlLCBpbnQgbGljZW5zZV9zaXplKSA9IDA7CisgICAgdmlydHVhbCBib29sIElzSERDUFJlcXVpcmVkKCkgPSAwOwogICB9OwogCiAgIFNiRHJtU3lzdGVtUGxheXJlYWR5KApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc2RrX2NvbmZpZ3VyYXRpb24ucHkgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zZGtfY29uZmlndXJhdGlvbi5weQppbmRleCA2YjIxZjM5Li5iZWQxMDNkIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zZGtfY29uZmlndXJhdGlvbi5weQorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zZGtfY29uZmlndXJhdGlvbi5weQpAQCAtNzAsNyArNzAsNyBAQAogCiAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYudnNfaG9zdF90b29sc19wYXRoKToKICAgICAgIGxvZ2dpbmcuY3JpdGljYWwoJ0V4cGVjdGVkIFZpc3VhbCBTdHVkaW8gcGF0aCBcIiVzXCIgbm90IGZvdW5kLicsCi0gICAgICAgICAgICAgICAgICAgICAgIHNlbGYudnNfY2xfcGF0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52c19ob3N0X3Rvb2xzX3BhdGgpCiAgICAgc2VsZi5fQ2hlY2tXaW5kb3dzU2RrVmVyc2lvbigpCiAKICAgZGVmIF9DaGVja1dpbmRvd3NTZGtWZXJzaW9uKHNlbGYpOgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3lzdGVtX2dldF9jb25uZWN0aW9uX3R5cGUuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zeXN0ZW1fZ2V0X2Nvbm5lY3Rpb25fdHlwZS5jYwppbmRleCAzOTllMmIyLi5iY2VkMDVkIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zeXN0ZW1fZ2V0X2Nvbm5lY3Rpb25fdHlwZS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zeXN0ZW1fZ2V0X2Nvbm5lY3Rpb25fdHlwZS5jYwpAQCAtMzIsNyArMzIsMTAgQEAKICAgICAgICAgIXNid2luMzI6OklzSWZUeXBlRXRoZXJuZXQoYWRhcHRlci0+SWZUeXBlKSkgewogICAgICAgY29udGludWU7CiAgICAgfQotICAgIGlmIChhZGFwdGVyLT5JZlR5cGUgPT0gSUZfVFlQRV9JRUVFODAyMTEpIHsKKyAgICAvLyBTb21lIGRldmljZXMgZG8gbm90IHJlcG9ydCBJZlR5cGUgY29ycmVjdGx5LgorICAgIC8vIFNvLCBhbiBleHRyYSBhdHRlbXB0IGF0IGRldGVybWluaW5nIGlmIGFuIGludGVyZmFjZSBpcyB3aXJlbGVzcyBpcyBtYWRlLgorICAgIGlmIChhZGFwdGVyLT5JZlR5cGUgPT0gSUZfVFlQRV9JRUVFODAyMTEgfHwKKyAgICAgICh3Y3NzdHIoYWRhcHRlci0+RGVzY3JpcHRpb24sIEwiV2lGaSIpICE9IG51bGxwdHIpKSB7CiAgICAgICByZXR1cm4ga1NiU3lzdGVtQ29ubmVjdGlvblR5cGVXaXJlbGVzczsKICAgICB9CiAgICAgcmV0dXJuIGtTYlN5c3RlbUNvbm5lY3Rpb25UeXBlV2lyZWQ7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93aW4zMl9hdWRpb19kZWNvZGVyLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvd2luMzJfYXVkaW9fZGVjb2Rlci5jYwppbmRleCAwMWZmN2FjLi44MTFlMTI1IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93aW4zMl9hdWRpb19kZWNvZGVyLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3dpbjMyX2F1ZGlvX2RlY29kZXIuY2MKQEAgLTkzLDcgKzkzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZSBzYW1wbGVfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2JNZWRpYUF1ZGlvSGVhZGVyJiBhdWRpb19oZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0pCi0gICAgICA6IGNvZGVjXyhjb2RlYyksCisgICAgICA6IHRocmVhZF9jaGVja2VyXyhUaHJlYWRDaGVja2VyOjprU2V0VGhyZWFkSWRPbkZpcnN0Q2hlY2spLAorICAgICAgICBjb2RlY18oY29kZWMpLAogICAgICAgICBhdWRpb19mcmFtZV9mbXRfKGF1ZGlvX2ZyYW1lX2ZtdCksCiAgICAgICAgIHNhbXBsZV90eXBlXyhzYW1wbGVfdHlwZSksCiAgICAgICAgIGF1ZGlvX2hlYWRlcl8oYXVkaW9faGVhZGVyKSwKQEAgLTI0MSw2ICsyNDIsMTYgQEAKICAgICB0aHJlYWRfY2hlY2tlcl8uRGV0YWNoKCk7CiAgIH0KIAorICAvLyBUaGUgb2JqZWN0IGlzIHNpbmdsZS10aHJlYWRlZCBhbmQgaXMgZHJpdmVuIGJ5IGEgZGVkaWNhdGVkIHRocmVhZC4KKyAgLy8gSG93ZXZlciB0aGUgdGhyZWFkIG1heSBnZXRzIGRlc3Ryb3llZCBhbmQgcmUtY3JlYXRlZCBvdmVyIHRoZSBsaWZlIHRpbWUgb2YKKyAgLy8gdGhpcyBvYmplY3QuICBXZSBlbmZvcmNlIHRoYXQgY2VydGFpbiBtZW1iZXIgZnVuY3Rpb25zIGNhbiBvbmx5IGNhbGxlZAorICAvLyBmcm9tIG9uZSB0aHJlYWQgd2hpbGUgc3RpbGwgYWxsb3dzIHRoaXMgb2JqZWN0IHRvIGJlIGRyaXZlbiBieSBkaWZmZXJlbnQKKyAgLy8gdGhyZWFkcyBieToKKyAgLy8gMS4gVGhlIHx0aHJlYWRfY2hlY2tlcl98IGlzIGluaXRpYWxseSBjcmVhdGVkIHdpdGhvdXQgYXR0YWNoaW5nIHRvIGFueQorICAvLyAgICB0aHJlYWQuCisgIC8vIDIuIFdoZW4gYSB0aHJlYWQgaXMgZGVzdHJveWVkLCBSZXNldCgpIHdpbGwgYmUgY2FsbGVkIHdoaWNoIGluIHR1cm4gY2FsbHMKKyAgLy8gICAgRGV0YWNoKCkgb24gdGhlIHx0aHJlYWRfY2hlY2tlcl98IHRvIGFsbG93IHRoZSBvYmplY3QgdG8gYXR0YWNoIHRvIGEKKyAgLy8gICAgbmV3IHRocmVhZC4KICAgOjpzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjpUaHJlYWRDaGVja2VyIHRocmVhZF9jaGVja2VyXzsKICAgY29uc3QgU2JNZWRpYUF1ZGlvQ29kZWMgY29kZWNfOwogICBjb25zdCBTYk1lZGlhQXVkaW9IZWFkZXIgYXVkaW9faGVhZGVyXzsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3dpbjMyX3ZpZGVvX2RlY29kZXIuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93aW4zMl92aWRlb19kZWNvZGVyLmNjCmluZGV4IGQ0NzVhNzkuLjkyMWJlM2UgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3dpbjMyX3ZpZGVvX2RlY29kZXIuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvd2luMzJfdmlkZW9fZGVjb2Rlci5jYwpAQCAtMjY4LDYgKzI2OCwxNiBAQAogICAgIHRocmVhZF9jaGVja2VyXy5EZXRhY2goKTsKICAgfQogCisgIC8vIFRoZSBvYmplY3QgaXMgc2luZ2xlLXRocmVhZGVkIGFuZCBpcyBkcml2ZW4gYnkgYSBkZWRpY2F0ZWQgdGhyZWFkLgorICAvLyBIb3dldmVyIHRoZSB0aHJlYWQgbWF5IGdldHMgZGVzdHJveWVkIGFuZCByZS1jcmVhdGVkIG92ZXIgdGhlIGxpZmUgdGltZSBvZgorICAvLyB0aGlzIG9iamVjdC4gIFdlIGVuZm9yY2UgdGhhdCBjZXJ0YWluIG1lbWJlciBmdW5jdGlvbnMgY2FuIG9ubHkgY2FsbGVkCisgIC8vIGZyb20gb25lIHRocmVhZCB3aGlsZSBzdGlsbCBhbGxvd3MgdGhpcyBvYmplY3QgdG8gYmUgZHJpdmVuIGJ5IGRpZmZlcmVudAorICAvLyB0aHJlYWRzIGJ5OgorICAvLyAxLiBUaGUgfHRocmVhZF9jaGVja2VyX3wgaXMgaW5pdGlhbGx5IGNyZWF0ZWQgd2l0aG91dCBhdHRhY2hpbmcgdG8gYW55CisgIC8vICAgIHRocmVhZC4KKyAgLy8gMi4gV2hlbiBhIHRocmVhZCBpcyBkZXN0cm95ZWQsIFJlc2V0KCkgd2lsbCBiZSBjYWxsZWQgd2hpY2ggaW4gdHVybiBjYWxscworICAvLyAgICBEZXRhY2goKSBvbiB0aGUgfHRocmVhZF9jaGVja2VyX3wgdG8gYWxsb3cgdGhlIG9iamVjdCB0byBhdHRhY2ggdG8gYQorICAvLyAgICBuZXcgdGhyZWFkLgogICA6OnN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OlRocmVhZENoZWNrZXIgdGhyZWFkX2NoZWNrZXJfOwogICBzdGQ6OnF1ZXVlPFZpZGVvRnJhbWVQdHI+IG91dHB1dF9xdWV1ZV87CiAgIGNvbnN0IFNiTWVkaWFWaWRlb0NvZGVjIGNvZGVjXzsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3gxMS93aW5kb3dfZ2V0X3BsYXRmb3JtX2hhbmRsZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3gxMS93aW5kb3dfZ2V0X3BsYXRmb3JtX2hhbmRsZS5jYwppbmRleCAyNjdjOWJkLi4zY2QwMjI5IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC94MTEvd2luZG93X2dldF9wbGF0Zm9ybV9oYW5kbGUuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQveDExL3dpbmRvd19nZXRfcGxhdGZvcm1faGFuZGxlLmNjCkBAIC0yMywxMCArMjMsNiBAQAogICB9CiAKICAgV2luZG93IGhhbmRsZSA9IE5vbmU7Ci0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNCB8fCBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCiAgIGhhbmRsZSA9IHdpbmRvdy0+Z2xfd2luZG93OwotI2Vsc2UKLSAgaGFuZGxlID0gd2luZG93LT53aW5kb3c7Ci0jZW5kaWYKICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGhhbmRsZSk7CiB9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC94MTEvd2luZG93X2ludGVybmFsLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQveDExL3dpbmRvd19pbnRlcm5hbC5jYwppbmRleCAxMDhkYTY1Li5hOGQ0MmU0IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC94MTEvd2luZG93X2ludGVybmFsLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3gxMS93aW5kb3dfaW50ZXJuYWwuY2MKQEAgLTE0LDYgKzE0LDggQEAKIAogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQveDExL3dpbmRvd19pbnRlcm5hbC5oIgogCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWGNvbXBvc2l0ZS5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hyZW5kZXIuaD4KICNpbmNsdWRlIDxYMTEvWGF0b20uaD4KICNpbmNsdWRlIDxYMTEvWEtCbGliLmg+CiAjaW5jbHVkZSA8WDExL1hsaWIuaD4KQEAgLTI2LDMyICsyOCwyMiBAQAogI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvcGxheWVyLmgiCiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0IHx8IFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKLSNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YY29tcG9zaXRlLmg+Ci0jaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWHJlbmRlci5oPgotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0IHx8Ci0gICAgICAgIC8vIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKLQogbmFtZXNwYWNlIHsKIAogY29uc3QgaW50IGtXaW5kb3dXaWR0aCA9IDE5MjA7CiBjb25zdCBpbnQga1dpbmRvd0hlaWdodCA9IDEwODA7CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0IHx8IFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKIGJvb2wgSGFzTmVlZGVkRXh0ZW5zaW9uc0ZvclB1bmNoZWRPdXRWaWRlbyhEaXNwbGF5KiBkaXNwbGF5KSB7CiAgIGludCBkdW1teTsKICAgcmV0dXJuIChYUmVuZGVyUXVlcnlFeHRlbnNpb24oZGlzcGxheSwgJmR1bW15LCAmZHVtbXkpICYmCiAgICAgICAgICAgWENvbXBvc2l0ZVF1ZXJ5RXh0ZW5zaW9uKGRpc3BsYXksICZkdW1teSwgJmR1bW15KSk7CiB9Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQgfHwKLSAgICAgICAgLy8gU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQorCiB9ICAvLyBuYW1lc3BhY2UKIAogU2JXaW5kb3dQcml2YXRlOjpTYldpbmRvd1ByaXZhdGUoRGlzcGxheSogZGlzcGxheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNiV2luZG93T3B0aW9ucyogb3B0aW9ucykKLSAgICA6IHdpbmRvdyhOb25lKQotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQgfHwgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQotICAgICAgLAorICAgIDogd2luZG93KE5vbmUpLAogICAgICAgd2luZG93X3BpY3R1cmUoTm9uZSksCiAgICAgICBjb21wb3NpdGlvbl9waXhtYXAoTm9uZSksCiAgICAgICBjb21wb3NpdGlvbl9waWN0dXJlKE5vbmUpLApAQCAtNjEsMTAgKzUzLDcgQEAKICAgICAgIHZpZGVvX3BpeG1hcF9nYyhOb25lKSwKICAgICAgIHZpZGVvX3BpY3R1cmUoTm9uZSksCiAgICAgICBnbF93aW5kb3coTm9uZSksCi0gICAgICBnbF9waWN0dXJlKE5vbmUpCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQgfHwKLSAgICAgIC8vIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKLSAgICAgICwKKyAgICAgIGdsX3BpY3R1cmUoTm9uZSksCiAgICAgICBkaXNwbGF5KGRpc3BsYXkpIHsKICAgLy8gUmVxdWVzdCBhIDMyLWJpdCBkZXB0aCB2aXN1YWwgZm9yIG91ciBXaW5kb3cuCiAgIFhWaXN1YWxJbmZvIHhfdmlzdWFsX2luZm8gPSB7MH07CkBAIC0xMDQsNyArOTMsNiBAQAogICBBdG9tIHdtX2RlbGV0ZSA9IFhJbnRlcm5BdG9tKGRpc3BsYXksICJXTV9ERUxFVEVfV0lORE9XIiwgVHJ1ZSk7CiAgIFhTZXRXTVByb3RvY29scyhkaXNwbGF5LCB3aW5kb3csICZ3bV9kZWxldGUsIDEpOwogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNCB8fCBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCiAgIFNCX0NIRUNLKEhhc05lZWRlZEV4dGVuc2lvbnNGb3JQdW5jaGVkT3V0VmlkZW8oZGlzcGxheSkpOwogICBnbF93aW5kb3cgPSBYQ3JlYXRlU2ltcGxlV2luZG93KGRpc3BsYXksIHdpbmRvdywgMCwgMCwgd2lkdGgsIGhlaWdodCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGl0ZVBpeGVsKGRpc3BsYXksIERlZmF1bHRTY3JlZW4oZGlzcGxheSkpLApAQCAtMTI4LDggKzExNiw2IEBACiAgICAgICBYUmVuZGVyRmluZFZpc3VhbEZvcm1hdChkaXNwbGF5LCB4X3Zpc3VhbF9pbmZvLnZpc3VhbCk7CiAgIHdpbmRvd19waWN0dXJlID0gWFJlbmRlckNyZWF0ZVBpY3R1cmUoZGlzcGxheSwgd2luZG93LCBwaWN0X2Zvcm1hdCwgMCwgTlVMTCk7CiAgIFNCX0NIRUNLKHdpbmRvd19waWN0dXJlICE9IE5vbmUpOwotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0IHx8Ci0gICAgICAgIC8vIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKIAogICBYU2VsZWN0SW5wdXQoZGlzcGxheSwgd2luZG93LAogICAgICAgICAgICAgICAgVmlzaWJpbGl0eUNoYW5nZU1hc2sgfCBFeHBvc3VyZU1hc2sgfCBGb2N1c0NoYW5nZU1hc2sgfApAQCAtMTM5LDcgKzEyNSw2IEBACiB9CiAKIFNiV2luZG93UHJpdmF0ZTo6flNiV2luZG93UHJpdmF0ZSgpIHsKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0IHx8IFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKICAgaWYgKGNvbXBvc2l0aW9uX3BpeG1hcCAhPSBOb25lKSB7CiAgICAgWEZyZWVQaXhtYXAoZGlzcGxheSwgY29tcG9zaXRpb25fcGl4bWFwKTsKICAgICBYUmVuZGVyRnJlZVBpY3R1cmUoZGlzcGxheSwgY29tcG9zaXRpb25fcGljdHVyZSk7CkBAIC0xNTIsMTIgKzEzNyw5IEBACiAgIFhSZW5kZXJGcmVlUGljdHVyZShkaXNwbGF5LCBnbF9waWN0dXJlKTsKICAgWERlc3Ryb3lXaW5kb3coZGlzcGxheSwgZ2xfd2luZG93KTsKICAgWFJlbmRlckZyZWVQaWN0dXJlKGRpc3BsYXksIHdpbmRvd19waWN0dXJlKTsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNCB8fCBcCi0gICAgICAgICAgIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKICAgWERlc3Ryb3lXaW5kb3coZGlzcGxheSwgd2luZG93KTsKIH0KIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQgfHwgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQogdm9pZCBTYldpbmRvd1ByaXZhdGU6OkNvbXBvc2l0ZSgKICAgICBpbnQgYm91bmRzX3gsCiAgICAgaW50IGJvdW5kc195LApAQCAtMjc4LDUgKzI2MCwzIEBACiAgICAgICAgICAgICAgICAgICAgd2luZG93X3BpY3R1cmUsIDAsIDAsIDAsIDAsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOwogICBYU3luY2hyb25pemUoZGlzcGxheSwgRmFsc2UpOwogfQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0IHx8IFwKLSAgICAgICAgICAgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQveDExL3dpbmRvd19pbnRlcm5hbC5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQveDExL3dpbmRvd19pbnRlcm5hbC5oCmluZGV4IDNjOTZhZjkuLjVkY2MxNTMgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3gxMS93aW5kb3dfaW50ZXJuYWwuaAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC94MTEvd2luZG93X2ludGVybmFsLmgKQEAgLTIyLDkgKzIyLDkgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fZnJhbWVfaW50ZXJuYWwuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvd2luZG93LmgiCiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0IHx8IFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKKyNpZiBTQl9UUlVFIHx8IFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKICNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YcmVuZGVyLmg+Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQgfHwKKyNlbmRpZiAgLy8gU0JfVFJVRSB8fAogICAgICAgICAvLyBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCiAKIHN0cnVjdCBTYldpbmRvd1ByaXZhdGUgewpAQCAtMzMsNyArMzMsNyBAQAogCiAgIFdpbmRvdyB3aW5kb3c7CiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0IHx8IFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKKyNpZiBTQl9UUlVFIHx8IFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKICAgdHlwZWRlZiA6OnN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OnBsYXllcjo6VmlkZW9GcmFtZSBWaWRlb0ZyYW1lOwogCiAgIC8vIENvbXBvc2l0ZXMgZ3JhcGhpY3MgYW5kIHRoZSBnaXZlbiB2aWRlbyBmcmFtZSB2aWRlbyBmb3IgdGhpcyB3aW5kb3cuIEluCkBAIC04MCw3ICs4MCw3IEBACiAKICAgLy8gQSBjYWNoZWQgWFJlbmRlciBQaWN0dXJlIHdyYXBwZXIgZm9yIHxnbF93aW5kb3d8LgogICBQaWN0dXJlIGdsX3BpY3R1cmU7Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQgfHwKKyNlbmRpZiAgLy8gU0JfVFJVRSB8fAogICAgICAgICAvLyBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCiAKICAgLy8gVGhlIGRpc3BsYXkgdGhhdCB0aGlzIHdpbmRvdyB3YXMgY3JlYXRlZCBmcm9tLgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zb2NrZXQuaCBiL3NyYy9zdGFyYm9hcmQvc29ja2V0LmgKaW5kZXggYmE1NjAwZC4uZTQ0ZGRjMCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zb2NrZXQuaAorKysgYi9zcmMvc3RhcmJvYXJkL3NvY2tldC5oCkBAIC0yMjcsNyArMjI3LDYgQEAKIFNCX0VYUE9SVCBib29sIFNiU29ja2V0R2V0TG9jYWxBZGRyZXNzKFNiU29ja2V0IHNvY2tldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiU29ja2V0QWRkcmVzcyogb3V0X2FkZHJlc3MpOwogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogLy8gR2V0cyB0aGUgc291cmNlIGFkZHJlc3MgYW5kIHRoZSBuZXRtYXNrIHRoYXQgd291bGQgYmUgdXNlZCB0byBjb25uZWN0IHRvIHRoZQogLy8gZGVzdGluYXRpb24uICBUaGUgbmV0bWFzayBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwsIGFuZCBvbmx5IHBvcHVsYXRlZCBpZiBhCiAvLyBub24tTlVMTCBwYXJhbWV0ZXIgaXMgcGFzc2VkIGluLiAgVG8gZGV0ZXJtaW5lIHdoaWNoIHNvdXJjZSBJUCB3aWxsIGJlIHVzZWQsCkBAIC0yNjcsMTcgKzI2Niw2IEBACiAgICAgU2JTb2NrZXRBZGRyZXNzKiBvdXRfc291cmNlX2FkZHJlc3MsCiAgICAgU2JTb2NrZXRBZGRyZXNzKiBvdXRfbmV0bWFzayk7CiAKLSNlbHNlCi0KLS8vIEdldHMgdGhlIGFkZHJlc3Mgb2YgdGhlIGxvY2FsIElQdjQgbmV0d29yayBpbnRlcmZhY2UuIFRoZSByZXR1cm4gdmFsdWUKLS8vIGluZGljYXRlcyB3aGV0aGVyIHRoZSBhZGRyZXNzIHdhcyByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LgotLy8KLS8vIHxvdXRfYWRkcmVzc3w6IFRoZSByZXRyaWV2ZWQgYWRkcmVzcy4gVGhlIGFkZHJlc3MgZG9lcyBub3QgaW5jbHVkZSBsb29wYmFjawotLy8gICAob3IgSVB2NikgYWRkcmVzc2VzLgotU0JfRVhQT1JUIGJvb2wgU2JTb2NrZXRHZXRMb2NhbEludGVyZmFjZUFkZHJlc3MoU2JTb2NrZXRBZGRyZXNzKiBvdXRfYWRkcmVzcyk7Ci0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAotCiAvLyBSZWFkcyB1cCB0byB8ZGF0YV9zaXplfCBieXRlcyBmcm9tIHxzb2NrZXR8IGludG8gfG91dF9kYXRhfCBhbmQgcGxhY2VzIHRoZQogLy8gc291cmNlIGFkZHJlc3Mgb2YgdGhlIHBhY2tldCBpbiB8b3V0X3NvdXJjZXwgaWYgb3V0X3NvdXJjZSBpcyBub3QgTlVMTC4KIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBvciBhIG5lZ2F0aXZlIG51bWJlciBpZiB0aGVyZSBpcyBhbiBlcnJvciwKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc3BlZWNoX3N5bnRoZXNpcy5oIGIvc3JjL3N0YXJib2FyZC9zcGVlY2hfc3ludGhlc2lzLmgKaW5kZXggYThhNDZkNi4uNWMwZDE3NyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zcGVlY2hfc3ludGhlc2lzLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zcGVlY2hfc3ludGhlc2lzLmgKQEAgLTI5LDIyICsyOSwxMiBAQAogI2luY2x1ZGUgInN0YXJib2FyZC9leHBvcnQuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvdHlwZXMuaCIKIAotI2lmIFNCX0hBUyhTUEVFQ0hfU1lOVEhFU0lTKSAmJiBTQl9BUElfVkVSU0lPTiA+PSAzCisjaWYgU0JfSEFTKFNQRUVDSF9TWU5USEVTSVMpCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAotI2lmIFNCX0FQSV9WRVJTSU9OIDwgNAotLy8gREVQUkVDQVRFRCBJTiBBUEkgVkVSU0lPTiA0Ci0vLyBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIGZ1bmN0aW9uIGluIHRoaXMgbW9kdWxlLAotLy8gb3Igc3Vic2VxdWVudCBjYWxscyBhcmUgYWxsb3dlZCB0byBmYWlsIHNpbGVudGx5LgotLy8KLS8vIHxsYW5nfCBzaG91bGQgYmUgYSBCQ1AgNDcgbGFuZ3VhZ2Ugc3RyaW5nLCBlZyAiZW4tVVMiLgotLy8gUmV0dXJuIHRydWUgaWYgbGFuZ3VhZ2UgaXMgc3VwcG9ydGVkLCBmYWxzZSBpZiBub3QuCi1TQl9FWFBPUlQgYm9vbCBTYlNwZWVjaFN5bnRoZXNpc1NldExhbmd1YWdlKGNvbnN0IGNoYXIqIGxhbmcpOwotI2VuZGlmCi0KIC8vIEVucXVldWVzIHx0ZXh0fCwgYSBVVEYtOCBzdHJpbmcsIHRvIGJlIHNwb2tlbi4KIC8vIFJldHVybnMgaW1tZWRpYXRlbHkuCiAvLwpAQCAtNjQsNiArNTQsNiBAQAogfSAgLy8gZXh0ZXJuICJDIgogI2VuZGlmCiAKLSNlbmRpZiAgLy8gU0JfSEFTKFNQRUVDSF9TWU5USEVTSVMpICYmIFNCX0FQSV9WRVJTSU9OID49IDMKKyNlbmRpZiAgLy8gU0JfSEFTKFNQRUVDSF9TWU5USEVTSVMpCiAKICNlbmRpZiAgLy8gU1RBUkJPQVJEX1NQRUVDSF9TWU5USEVTSVNfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc3R1Yi9CVUlMRC5nbiBiL3NyYy9zdGFyYm9hcmQvc3R1Yi9CVUlMRC5nbgppbmRleCAxOGFkODc2Li5kZWRjN2Y1IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3N0dWIvQlVJTEQuZ24KKysrIGIvc3JjL3N0YXJib2FyZC9zdHViL0JVSUxELmduCkBAIC0yNzYsNyArMjc2LDYgQEAKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX291dHB1dF9tb2RlX3N1cHBvcnRlZC5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdHViL3BsYXllcl9zZWVrLmNjIiwKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX3NldF9ib3VuZHMuY2MiLAotICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfc2V0X3BhdXNlLmNjIiwKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX3NldF9wbGF5YmFja19yYXRlLmNjIiwKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX3NldF92b2x1bWUuY2MiLAogICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfd3JpdGVfZW5kX29mX3N0cmVhbS5jYyIsCkBAIC0yOTEsNyArMjkwLDYgQEAKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc29ja2V0X2dldF9pbnRlcmZhY2VfYWRkcmVzcy5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdHViL3NvY2tldF9nZXRfbGFzdF9lcnJvci5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdHViL3NvY2tldF9nZXRfbG9jYWxfYWRkcmVzcy5jYyIsCi0gICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdHViL3NvY2tldF9nZXRfbG9jYWxfaW50ZXJmYWNlX2FkZHJlc3MuY2MiLAogICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zb2NrZXRfaXNfY29ubmVjdGVkLmNjIiwKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc29ja2V0X2lzX2Nvbm5lY3RlZF9hbmRfaWRsZS5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdHViL3NvY2tldF9qb2luX211bHRpY2FzdF9ncm91cC5jYyIsCkBAIC0zMTksNyArMzE3LDYgQEAKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3BlZWNoX3JlY29nbml6ZXJfc3RhcnQuY2MiLAogICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zcGVlY2hfcmVjb2duaXplcl9zdG9wLmNjIiwKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3BlZWNoX3N5bnRoZXNpc19jYW5jZWwuY2MiLAotICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zcGVlY2hfc3ludGhlc2lzX3NldF9sYW5ndWFnZS5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdHViL3NwZWVjaF9zeW50aGVzaXNfc3BlYWsuY2MiLAogICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zdG9yYWdlX2Nsb3NlX3JlY29yZC5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdHViL3N0b3JhZ2VfZGVsZXRlX3JlY29yZC5jYyIsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3N0dWIvY29uZmlndXJhdGlvbl9wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvc3R1Yi9jb25maWd1cmF0aW9uX3B1YmxpYy5oCmluZGV4IDU3ODY2MzguLjEzMzZhOGYgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc3R1Yi9jb25maWd1cmF0aW9uX3B1YmxpYy5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc3R1Yi9jb25maWd1cmF0aW9uX3B1YmxpYy5oCkBAIC0zNTYsMjcgKzM1Niw2IEBACiAvLyBzdXBwb3J0ZWQgY29tcG9zaXRpb24gbWV0aG9kcyBiZWxvdy4KICNkZWZpbmUgU0JfSEFTX1BMQVlFUiAxCiAKLSNpZiBTQl9BUElfVkVSU0lPTiA8IDQKLS8vIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgcGxhdGZvcm0ncyBwbGF5ZXIgd2lsbCBwcm9kdWNlIGFuIE9wZW5HTCB0ZXh0dXJlIHRoYXQKLS8vIHRoZSBjbGllbnQgbXVzdCBkcmF3IGV2ZXJ5IGZyYW1lIHdpdGggaXRzIGdyYXBoaWNzIHJlbmRlcmluZy4gSXQgbWF5IGJlIHRoYXQKLS8vIHdlIGdldCBhIHRleHR1cmUgaGFuZGxlLCBidXQgY2Fubm90IHBlcmZvcm0gb3BlcmF0aW9ucyBsaWtlIEdsUmVhZFBpeGVscyBvbgotLy8gaXQgaWYgaXQgaXMgRFJNLXByb3RlY3RlZC4KLSNkZWZpbmUgU0JfSVNfUExBWUVSX1BST0RVQ0lOR19URVhUVVJFIDAKLQotLy8gU3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBwbGF0Zm9ybSdzIHBsYXllciBpcyBjb21wb3NpdGVkIHdpdGggYSBmb3JtYWwKLS8vIGNvbXBvc2l0b3IsIHdoZXJlIHRoZSBjbGllbnQgbXVzdCBzcGVjaWZ5IGhvdyB2aWRlbyBpcyB0byBiZSBjb21wb3NpdGVkIGludG8KLS8vIHRoZSBncmFwaGljYWxzIHNjZW5lLgotI2RlZmluZSBTQl9JU19QTEFZRVJfQ09NUE9TSVRFRCAwCi0KLS8vIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgcGxhdGZvcm0ncyBwbGF5ZXIgdXNlcyBhICJwdW5jaC1vdXQiIG1vZGVsLCB3aGVyZQotLy8gdmlkZW8gaXMgcmVuZGVyZWQgdG8gdGhlIGZhciBiYWNrZ3JvdW5kLCBhbmQgdGhlIGdyYXBoaWNzIHBsYW5lIGlzCi0vLyBhdXRvbWF0aWNhbGx5IGNvbXBvc2l0ZWQgb24gdG9wIG9mIHRoZSB2aWRlbyBieSB0aGUgcGxhdGZvcm0uIFRoZSBjbGllbnQgbXVzdAotLy8gcHVuY2ggYW4gYWxwaGEgaG9sZSBvdXQgb2YgdGhlIGdyYXBoaWNzIHBsYW5lIGZvciB2aWRlbyB0byBzaG93IHRocm91Z2guICBJbgotLy8gdGhpcyBjYXNlLCBjaGFuZ2luZyB0aGUgdmlkZW8gYm91bmRzIG11c3QgYmUgdGlnaHRseSBzeW5jaHJvbml6ZWQgYmV0d2VlbiB0aGUKLS8vIHBsYXllciBhbmQgdGhlIGdyYXBoaWNzIHBsYW5lLgotI2RlZmluZSBTQl9JU19QTEFZRVJfUFVOQ0hFRF9PVVQgMQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IDQKLQogLy8gQWZ0ZXIgYSBzZWVrIGlzIHRyaWdnZXJyZWQsIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGFwcGVuZCB2aWRlbyBmcmFtZXMKIC8vIGZyb20gdGhlIGxhc3Qga2V5IGZyYW1lIGJlZm9yZSB0aGUgc2VlayB0aW1lIGFuZCBhcHBlbmQgYXVkaW8gZnJhbWVzIGZyb20gdGhlCiAvLyBzZWVrIHRpbWUgYmVjYXVzZSB1c3VhbGx5IGFsbCBhdWRpbyBmcmFtZXMgYXJlIGtleSBmcmFtZXMuICBPbiBwbGF0Zm9ybXMgdGhhdApAQCAtMzkwLDggKzM2OSw2IEBACiAvLyBub3QgYXZhaWxhYmxlIHNob3VsZCBkZWZpbmUgdGhlIGZvbGxvd2luZyBxdWlyay4KICN1bmRlZiBTQl9IQVNfUVVJUktfTk9fRkZTCiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0Ci0KIC8vIFRoZSBtYXhpbXVtIGF1ZGlvIGJpdHJhdGUgdGhlIHBsYXRmb3JtIGNhbiBkZWNvZGUuICBUaGUgZm9sbG93aW5nIHZhbHVlCiAvLyBlcXVhbHMgdG8gNU0gYnl0ZXMgcGVyIHNlY29uZHMgd2hpY2ggaXMgbW9yZSB0aGFuIGVub3VnaCBmb3IgY29tcHJlc3NlZAogLy8gYXVkaW8uCkBAIC00MDIsOCArMzc5LDYgQEAKIC8vIHZpZGVvLgogI2RlZmluZSBTQl9NRURJQV9NQVhfVklERU9fQklUUkFURV9JTl9CSVRTX1BFUl9TRUNPTkQgKDIwMCAqIDEwMjQgKiAxMDI0KQogCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKLQogLy8gU3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBoYXMgd2VibS92cDkgc3VwcG9ydC4gIFRoaXMgc2hvdWxkIGJlIHNldCB0bwogLy8gbm9uLXplcm8gb24gcGxhdGZvcm1zIHdpdGggd2VibS92cDkgc3VwcG9ydC4KICNkZWZpbmUgU0JfSEFTX01FRElBX1dFQk1fVlA5X1NVUFBPUlQgMApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zdHViL3N0YXJib2FyZF9wbGF0Zm9ybS5neXAgYi9zcmMvc3RhcmJvYXJkL3N0dWIvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cAppbmRleCBhOTVjYTg5Li43NTQ5MDlkIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3N0dWIvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cAorKysgYi9zcmMvc3RhcmJvYXJkL3N0dWIvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cApAQCAtMTM0LDcgKzEzNCw2IEBACiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX291dHB1dF9tb2RlX3N1cHBvcnRlZC5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX3NlZWsuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3BsYXllcl9zZXRfYm91bmRzLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfc2V0X3BhdXNlLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfc2V0X3BsYXliYWNrX3JhdGUuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3BsYXllcl9zZXRfdm9sdW1lLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfd3JpdGVfZW5kX29mX3N0cmVhbS5jYycsCkBAIC0xNDksNyArMTQ4LDYgQEAKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zb2NrZXRfZ2V0X2ludGVyZmFjZV9hZGRyZXNzLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zb2NrZXRfZ2V0X2xhc3RfZXJyb3IuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3NvY2tldF9nZXRfbG9jYWxfYWRkcmVzcy5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc29ja2V0X2dldF9sb2NhbF9pbnRlcmZhY2VfYWRkcmVzcy5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc29ja2V0X2lzX2Nvbm5lY3RlZC5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc29ja2V0X2lzX2Nvbm5lY3RlZF9hbmRfaWRsZS5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc29ja2V0X2pvaW5fbXVsdGljYXN0X2dyb3VwLmNjJywKQEAgLTE3Nyw3ICsxNzUsNiBAQAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3NwZWVjaF9yZWNvZ25pemVyX3N0YXJ0LmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zcGVlY2hfcmVjb2duaXplcl9zdG9wLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zcGVlY2hfc3ludGhlc2lzX2NhbmNlbC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3BlZWNoX3N5bnRoZXNpc19zZXRfbGFuZ3VhZ2UuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3NwZWVjaF9zeW50aGVzaXNfc3BlYWsuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3N0b3JhZ2VfY2xvc2VfcmVjb3JkLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zdG9yYWdlX2RlbGV0ZV9yZWNvcmQuY2MnLApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zeXN0ZW0uaCBiL3NyYy9zdGFyYm9hcmQvc3lzdGVtLmgKaW5kZXggZGQwOGY0NC4uY2ZhOWVlZCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zeXN0ZW0uaAorKysgYi9zcmMvc3RhcmJvYXJkL3N5c3RlbS5oCkBAIC00NSw3ICs0NSw2IEBACiAgIC8vIHNjcmVlbnNob3RzKSBjYW4gYmUgd3JpdHRlbiBpbnRvLgogICBrU2JTeXN0ZW1QYXRoRGVidWdPdXRwdXREaXJlY3RvcnksCiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0CiAgIC8vIFBhdGggdG8gYSBkaXJlY3Rvcnkgd2hlcmUgc3lzdGVtIGZvbnQgZmlsZXMgY2FuIGJlIGZvdW5kLiBTaG91bGQgb25seSBiZQogICAvLyBzcGVjaWZpZWQgb24gcGxhdGZvcm1zIHRoYXQgcHJvdmlkZSBmb250cyB1c2FibGUgYnkgU3RhcmJvYXJkIGFwcGxpY2F0aW9ucy4KICAga1NiU3lzdGVtUGF0aEZvbnREaXJlY3RvcnksCkBAIC01NSw3ICs1NCw2IEBACiAgIC8vIG5lY2Vzc2FyaWx5LiBTaG91bGQgb25seSBiZSBzcGVjaWZpZWQgb24gcGxhdGZvcm1zIHRoYXQgcHJvdmlkZSBmb250cwogICAvLyB1c2FibGUgYnkgU3RhcmJvYXJkIGFwcGxpY2F0aW9ucy4KICAga1NiU3lzdGVtUGF0aEZvbnRDb25maWd1cmF0aW9uRGlyZWN0b3J5LAotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA0CiAKICAgLy8gUGF0aCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgogICBrU2JTeXN0ZW1QYXRoU291cmNlRGlyZWN0b3J5LApAQCAtMTA5LDEzICsxMDcsMTIgQEAKICAgLy8gQSB1bml2ZXJzYWxseS11bmlxdWUgSUQgZm9yIHRoZSBjdXJyZW50IHVzZXIuCiAgIGtTYlN5c3RlbVByb3BlcnR5UGxhdGZvcm1VdWlkLAogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gMgogICAvLyBUaGUgR29vZ2xlIFNwZWVjaCBBUEkga2V5LiBUaGUgcGxhdGZvcm0gbWFudWZhY3R1cmVyIGlzIHJlc3BvbnNpYmxlCiAgIC8vIGZvciByZWdpc3RlcmluZyBhIEdvb2dsZSBTcGVlY2ggQVBJIGtleSBmb3IgdGhlaXIgcHJvZHVjdHMuIEluIHRoZSBBUEkKICAgLy8gQ29uc29sZSAoaHR0cDovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9jb25zb2xlKSwgeW91IGNhbiBlbmFibGUgdGhlCiAgIC8vIFNwZWVjaCBBUElzIGFuZCBnZW5lcmF0ZSBhIFNwZWVjaCBBUEkga2V5LgogICBrU2JTeXN0ZW1Qcm9wZXJ0eVNwZWVjaEFwaUtleSwKLSNlbmRpZiAgLy8gU0JfVkVSU0lPTigyKQorCiAjaWYgU0JfQVBJX1ZFUlNJT04gPj0gNQogICAvLyBBIGZpZWxkIHRoYXQsIGlmIGF2YWlsYWJsZSwgaXMgYXBwZW5kZWQgdG8gdGhlIHVzZXIgYWdlbnQKICAga1NiU3lzdGVtUHJvcGVydHlVc2VyQWdlbnRBdXhGaWVsZCwKQEAgLTE0NSwxMCArMTQyLDggQEAKICAgLy8gRGVza3RvcCBQQy4KICAga1NiU3lzdGVtRGV2aWNlVHlwZURlc2t0b3BQQywKIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKICAgLy8gQW4gQW5kcm9pZCBUViBEZXZpY2UuCiAgIGtTYlN5c3RlbURldmljZVR5cGVBbmRyb2lkVFYsCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKIAogICAvLyBVbmtub3duIGRldmljZS4KICAga1NiU3lzdGVtRGV2aWNlVHlwZVVua25vd24sCkBAIC0yODEsMTAgKzI3Niw3IEBACiAKIC8vIEJyZWFrcyB0aGUgY3VycmVudCBwcm9ncmFtIGludG8gdGhlIGRlYnVnZ2VyLCBpZiBhIGRlYnVnZ2VyIGlzIGF0dGFjaGVkLgogLy8gSWYgYSBkZWJ1Z2dlciBpcyBub3QgYXR0YWNoZWQsIHRoaXMgZnVuY3Rpb24gYWJvcnRzIHRoZSBwcm9ncmFtLgotI2lmIFNCX0FQSV9WRVJTSU9OID49IDQKLVNCX05PUkVUVVJOCi0jZW5kaWYKLVNCX0VYUE9SVCB2b2lkIFNiU3lzdGVtQnJlYWtJbnRvRGVidWdnZXIoKTsKK1NCX05PUkVUVVJOIFNCX0VYUE9SVCB2b2lkIFNiU3lzdGVtQnJlYWtJbnRvRGVidWdnZXIoKTsKIAogLy8gQXR0ZW1wdHMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGN1cnJlbnQgcHJvZ3JhbSBpcyBydW5uaW5nIGluc2lkZSBvcgogLy8gYXR0YWNoZWQgdG8gYSBkZWJ1Z2dlci4gVGhlIGZ1bmN0aW9uIHJldHVybnMgfGZhbHNlfCBpZiBuZWl0aGVyIG9mIHRob3NlCkBAIC00NTQsNyArNDQ2LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIG91dF9idWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmZmVyX3NpemUpOwogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogLy8gUmVxdWVzdHMgdGhhdCB0aGUgYXBwbGljYXRpb24gbW92ZSBpbnRvIHRoZSBQYXVzZWQgc3RhdGUgYXQgdGhlIG5leHQKIC8vIGNvbnZlbmllbnQgcG9pbnQuIFRoaXMgc2hvdWxkIHJvdWdobHkgY29ycmVzcG9uZCB0byAidW5mb2N1c2VkIGFwcGxpY2F0aW9uIgogLy8gaW4gYSB0cmFkaXRpb25hbCB3aW5kb3cgbWFuYWdlciwgd2hlcmUgdGhlIGFwcGxpY2F0aW9uIG1heSBiZSBwYXJ0aWFsbHkKQEAgLTQ4OSw3ICs0ODAsNiBAQAogLy8gcnVubmluZy4gVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQgYW4gZXh0ZXJuYWwgc3lzdGVtIGV2ZW50IHdpbGwgYnJpbmcgdGhlCiAvLyBhcHBsaWNhdGlvbiBvdXQgb2YgdGhlIFN1c3BlbmRlZCBzdGF0ZS4KIFNCX0VYUE9SVCB2b2lkIFNiU3lzdGVtUmVxdWVzdFN1c3BlbmQoKTsKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNAogCiAvLyBSZXF1ZXN0cyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBiZSB0ZXJtaW5hdGVkIGdyYWNlZnVsbHkgYXQgdGhlIG5leHQKIC8vIGNvbnZlbmllbnQgcG9pbnQuIEluIHRoZSBtZWFudGltZSwgc29tZSB3b3JrIG1heSBjb250aW51ZSB0byBiZSBkb25lLCBhbmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvdGltZS5oIGIvc3JjL3N0YXJib2FyZC90aW1lLmgKaW5kZXggYzlkMmEzZi4uY2RiYjE5NCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC90aW1lLmgKKysrIGIvc3JjL3N0YXJib2FyZC90aW1lLmgKQEAgLTkxLDcgKzkxLDcgQEAKIC8vIEdldHMgYSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgdGltZSByZXByZXNlbnRpbmcgcmlnaHQgbm93LgogU0JfRVhQT1JUIFNiVGltZU1vbm90b25pYyBTYlRpbWVHZXRNb25vdG9uaWNOb3coKTsKIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDMgJiYgU0JfSEFTKFRJTUVfVEhSRUFEX05PVykKKyNpZiBTQl9IQVMoVElNRV9USFJFQURfTk9XKQogLy8gR2V0cyBhIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyB0aW1lIHJlcHJlc2VudGluZyBob3cgbG9uZyB0aGUgY3VycmVudAogLy8gdGhyZWFkIGhhcyBiZWVuIGluIHRoZSBleGVjdXRpbmcgc3RhdGUgKGkuZS4gbm90IHByZS1lbXB0ZWQgbm9yIHdhaXRpbmcKIC8vIG9uIGFuIGV2ZW50KS4gVGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgdG90YWwgdGltZSBhbmQgaXMgaW50ZW5kZWQgdG8gYWxsb3cKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvdGl6ZW4vYXJtdjdsL3N0YXJib2FyZF9jb21tb24uZ3lwIGIvc3JjL3N0YXJib2FyZC90aXplbi9hcm12N2wvc3RhcmJvYXJkX2NvbW1vbi5neXAKaW5kZXggMTgzN2FmOS4uODZjMGFjZiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC90aXplbi9hcm12N2wvc3RhcmJvYXJkX2NvbW1vbi5neXAKKysrIGIvc3JjL3N0YXJib2FyZC90aXplbi9hcm12N2wvc3RhcmJvYXJkX2NvbW1vbi5neXAKQEAgLTc0LDcgKzc0LDYgQEAKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvbGludXgvbWVtb3J5X2dldF9zdGFja19ib3VuZHMuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9saW51eC9wYWdlX2ludGVybmFsLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvbGludXgvc29ja2V0X2dldF9pbnRlcmZhY2VfYWRkcmVzcy5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2xpbnV4L3NvY2tldF9nZXRfbG9jYWxfaW50ZXJmYWNlX2FkZHJlc3MuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9saW51eC9zeXN0ZW1fZ2V0X3JhbmRvbV9kYXRhLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvbGludXgvc3lzdGVtX2dldF9zdGFjay5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2xpbnV4L3N5c3RlbV9nZXRfdG90YWxfY3B1X21lbW9yeS5jYycsCkBAIC0yMTAsMTMgKzIwOSw2IEBACiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZWRpYS9tZWRpYV9nZXRfYXVkaW9fY29uZmlndXJhdGlvbl9zdGVyZW9fb25seS5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZWRpYS9tZWRpYV9nZXRfYXVkaW9fb3V0cHV0X2NvdW50X3N0ZXJlb19vbmx5LmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9tZWRpYV9pc19zdXBwb3J0ZWQuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL21pY3JvcGhvbmVfY2xvc2UuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL21pY3JvcGhvbmVfY3JlYXRlLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9taWNyb3Bob25lX2Rlc3Ryb3kuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL21pY3JvcGhvbmVfZ2V0X2F2YWlsYWJsZS5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvbWljcm9waG9uZV9pc19zYW1wbGVfcmF0ZV9zdXBwb3J0ZWQuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL21pY3JvcGhvbmVfb3Blbi5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvbWljcm9waG9uZV9yZWFkLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zeXN0ZW1fY2xlYXJfcGxhdGZvcm1fZXJyb3IuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3N5c3RlbV9nZXRfdG90YWxfZ3B1X21lbW9yeS5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3lzdGVtX2dldF91c2VkX2dwdV9tZW1vcnkuY2MnLApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC90aXplbi9hcm12N2wvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cCBiL3NyYy9zdGFyYm9hcmQvdGl6ZW4vYXJtdjdsL3N0YXJib2FyZF9wbGF0Zm9ybS5neXAKaW5kZXggMDFhYTU1Ni4uNTE1OTY2YSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC90aXplbi9hcm12N2wvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cAorKysgYi9zcmMvc3RhcmJvYXJkL3RpemVuL2FybXY3bC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCkBAIC03MSw3ICs3MSw2IEBACiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2ludGVybmFsLmgnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9zZWVrLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfc2V0X2JvdW5kcy5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3NldF9wYXVzZS5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3NldF9wbGF5YmFja19yYXRlLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfc2V0X3ZvbHVtZS5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dvcmtlci5jYycsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3RpemVuL3NoYXJlZC9mZm1wZWcvZmZtcGVnX3ZpZGVvX2RlY29kZXIuY2MgYi9zcmMvc3RhcmJvYXJkL3RpemVuL3NoYXJlZC9mZm1wZWcvZmZtcGVnX3ZpZGVvX2RlY29kZXIuY2MKaW5kZXggOWNjYzVjZS4uYzg5ODU5MiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC90aXplbi9zaGFyZWQvZmZtcGVnL2ZmbXBlZ192aWRlb19kZWNvZGVyLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvdGl6ZW4vc2hhcmVkL2ZmbXBlZy9mZm1wZWdfdmlkZW9fZGVjb2Rlci5jYwpAQCAtMjk3LDcgKzI5Nyw2IEBACiBuYW1lc3BhY2UgcGxheWVyIHsKIG5hbWVzcGFjZSBmaWx0ZXIgewogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNAogLy8gc3RhdGljCiBib29sIFZpZGVvRGVjb2Rlcjo6T3V0cHV0TW9kZVN1cHBvcnRlZChTYlBsYXllck91dHB1dE1vZGUgb3V0cHV0X21vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYk1lZGlhVmlkZW9Db2RlYyBjb2RlYywKQEAgLTMwNyw3ICszMDYsNiBAQAogCiAgIHJldHVybiBvdXRwdXRfbW9kZSA9PSBrU2JQbGF5ZXJPdXRwdXRNb2RlUHVuY2hPdXQ7CiB9Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKIAogfSAgLy8gbmFtZXNwYWNlIGZpbHRlcgogfSAgLy8gbmFtZXNwYWNlIHBsYXllcgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC90b29scy9leGFtcGxlL19faW5pdF9fLnB5IGIvc3JjL3N0YXJib2FyZC90b29scy9leGFtcGxlL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3Rvb2xzL2V4YW1wbGUvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvdG9vbHMvZXhhbXBsZS9hcHBfbGF1bmNoZXJfY2xpZW50LnB5IGIvc3JjL3N0YXJib2FyZC90b29scy9leGFtcGxlL2FwcF9sYXVuY2hlcl9jbGllbnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI0MDY5NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvdG9vbHMvZXhhbXBsZS9hcHBfbGF1bmNoZXJfY2xpZW50LnB5CkBAIC0wLDAgKzEsNzkgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisiIiJDbGllbnQgdG8gbGF1bmNoIGV4ZWN1dGFibGVzIHZpYSB0aGUgbmV3IGxhdW5jaGVyIGxvZ2ljLiIiIgorCitpbXBvcnQgaW1wb3J0bGliCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworaWYgImVudmlyb25tZW50IiBpbiBzeXMubW9kdWxlczoKKyAgZW52aXJvbm1lbnQgPSBzeXMubW9kdWxlc1siZW52aXJvbm1lbnQiXQorZWxzZToKKyAgZW52X3BhdGggPSBvcy5wYXRoLmFic3BhdGgoCisgICAgICBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgb3MucGFyZGlyKSkKKyAgaWYgZW52X3BhdGggbm90IGluIHN5cy5wYXRoOgorICAgIHN5cy5wYXRoLmFwcGVuZChlbnZfcGF0aCkKKyAgZW52aXJvbm1lbnQgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgiZW52aXJvbm1lbnQiKQorCitpbXBvcnQgYXJncGFyc2UKKworZnJvbSBzdGFyYm9hcmQudG9vbHMgaW1wb3J0IGFic3RyYWN0X2xhdW5jaGVyCisKK2FyZ19wYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigKKyAgICBkZXNjcmlwdGlvbj0iUnVucyBhcHBsaWNhdGlvbi90b29sIGV4ZWN1dGFibGVzLiIpCithcmdfcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAiLXAiLAorICAgICItLXBsYXRmb3JtIiwKKyAgICBoZWxwPSJEZXZpY2UgcGxhdGZvcm0sIGVnICdsaW51eC14NjR4MTEnLiIpCithcmdfcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAiLXQiLAorICAgICItLXRhcmdldF9uYW1lIiwKKyAgICBoZWxwPSJOYW1lIG9mIGV4ZWN1dGFibGUuIikKK2FyZ19wYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICItYyIsCisgICAgIi0tY29uZmlnIiwKKyAgICBjaG9pY2VzPVsiZGVidWciLCAiZGV2ZWwiLCAicWEiLCAiZ29sZCJdLAorICAgIGhlbHA9IkJ1aWxkIGNvbmZpZyAoZWcsICdxYScgb3IgJ2RldmVsJykiKQorYXJnX3BhcnNlci5hZGRfYXJndW1lbnQoCisgICAgIi1kIiwKKyAgICAiLS1kZXZpY2VfaWQiLAorICAgIGhlbHA9IkRldmtpdCBvciBJUCBhZGRyZXNzIGZvciB0aGUgdGFyZ2V0IGRldmljZS4iKQorYXJnX3BhcnNlci5hZGRfYXJndW1lbnQoCisgICAgIi0tdGFyZ2V0X3BhcmFtcyIsCisgICAgaGVscD0iQ29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBleGVjdXRhYmxlLiIKKyAgICAgICAgICIgQmVjYXVzZSBkaWZmZXJlbnQgZXhlY3V0YWJsZXMgY291bGQgaGF2ZSBkaWZmZXJpbmcgY29tbWFuZCIKKyAgICAgICAgICIgbGluZSBzeW50YXgsIGxpc3QgYWxsIGFyZ3VtZW50cyBleGFjdGx5IGFzIHlvdSB3b3VsZCB0byB0aGUiCisgICAgICAgICAiIGV4ZWN1dGFibGUgYmV0d2VlbiBhIHNldCBvZiBkb3VibGUgcXVvdGF0aW9uIG1hcmtzLiIpCisKKworZGVmIG1haW4oKToKKyAgYXJncyA9IGFyZ19wYXJzZXIucGFyc2VfYXJncygpCisgIGV4dHJhX2FyZ3MgPSB7fQorCisgIGlmIG5vdCBhcmdzLmRldmljZV9pZDoKKyAgICBhcmdzLmRldmljZV9pZCA9IE5vbmUKKworICBleHRyYV9hcmdzID0ge30KKyAgaWYgYXJncy50YXJnZXRfcGFyYW1zOgorICAgIGV4dHJhX2FyZ3NbInRhcmdldF9wYXJhbXMiXSA9IGFyZ3MudGFyZ2V0X3BhcmFtcy5zcGxpdCgiICIpCisKKyAgbGF1bmNoZXIgPSBhYnN0cmFjdF9sYXVuY2hlci5MYXVuY2hlckZhY3RvcnkoYXJncy5wbGF0Zm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy50YXJnZXRfbmFtZSwgYXJncy5jb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuZGV2aWNlX2lkLCBleHRyYV9hcmdzKQorICByZXR1cm4gbGF1bmNoZXIuUnVuKCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgc3lzLmV4aXQobWFpbigpKQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC91c2VyLmggYi9zcmMvc3RhcmJvYXJkL3VzZXIuaAppbmRleCA2ZTY2ZWQ0Li4wNTg4M2JjIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3VzZXIuaAorKysgYi9zcmMvc3RhcmJvYXJkL3VzZXIuaApAQCAtNTYsMjkgKzU2LDYgQEAKICAga1NiVXNlclByb3BlcnR5VXNlcklkLAogfSBTYlVzZXJQcm9wZXJ0eUlkOwogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPCA0Ci0jaWYgU0JfSEFTKFVTRVJfQVBQTElDQVRJT05fTElOS0lOR19TVVBQT1JUKQotLy8gSW5mb3JtYXRpb24gYWJvdXQgYW4gYXBwbGljYXRpb24tc3BlY2lmaWMgYXV0aG9yaXphdGlvbiB0b2tlbi4KLXR5cGVkZWYgc3RydWN0IFNiVXNlckFwcGxpY2F0aW9uVG9rZW5SZXN1bHRzIHsKLSAgLy8gVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IHx0b2tlbl9idWZmZXJ8LiBDYWxsCi0gIC8vIFNiVXNlck1heEF1dGhlbnRpY2F0aW9uVG9rZW5TaXplSW5CeXRlcygpIHRvIGdldCBhbiBhcHByb3ByaWF0ZSBzaXplLgotICAvLyB8dG9rZW5fYnVmZmVyX3NpemV8IG11c3QgYmUgc2V0IHRvIGEgdmFsdWUgZ3JlYXRlciB0aGFuIHplcm8uCi0gIHNpemVfdCB0b2tlbl9idWZmZXJfc2l6ZTsKLQotICAvLyBQb2ludGVyIHRvIGEgYnVmZmVyIGludG8gd2hpY2ggdGhlIHRva2VuIHdpbGwgYmUgY29waWVkLgotICAvLyB8dG9rZW5fYnVmZmVyfCBtdXN0IG5vdCBiZSBOVUxMLgotICBjaGFyKiB0b2tlbl9idWZmZXI7Ci0KLSAgLy8gSWYgdHJ1ZSwgfGV4cGlyeXwgd2lsbCBiZSBzZXQuIElmIGZhbHNlLCB0aGUgdG9rZW4gbmV2ZXIgZXhwaXJlcy4KLSAgYm9vbCBoYXNfZXhwaXJ5OwotCi0gIC8vIFRoZSBhYnNvbHV0ZSB0aW1lIHRoYXQgdGhpcyB0b2tlbiBleHBpcmVzLiBJdCBpcyB2YWxpZCB0byB1c2UgdGhlIHZhbHVlIG9mCi0gIC8vIHxleHBpcnl8IG9ubHkgaWYgfGhhc19leHBpcnl8IGlzIHRydWUuCi0gIFNiVGltZSBleHBpcnk7Ci19IFNiVXNlckFwcGxpY2F0aW9uVG9rZW5SZXN1bHRzOwotI2VuZGlmCi0jZW5kaWYKLQogLy8gV2VsbC1kZWZpbmVkIHZhbHVlIGZvciBhbiBpbnZhbGlkIHVzZXIuCiAjZGVmaW5lIGtTYlVzZXJJbnZhbGlkIChTYlVzZXIpIE5VTEwKIApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC93aW4vbGliL2d5cF9jb25maWd1cmF0aW9uLmd5cGkgYi9zcmMvc3RhcmJvYXJkL3dpbi9saWIvZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaQppbmRleCBlNDkxYzM3Li5mNTMwYWVkIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3dpbi9saWIvZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaQorKysgYi9zcmMvc3RhcmJvYXJkL3dpbi9saWIvZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaQpAQCAtMjMsNiArMjMsNyBAQAogICAgICdmaW5hbF9leGVjdXRhYmxlX3R5cGUnOiAnc2hhcmVkX2xpYnJhcnknLAogICAgICdkZWZhdWx0X3JlbmRlcmVyX29wdGlvbnNfZGVwZW5kZW5jeSc6ICc8KERFUFRIKS9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9saWIvbGliLmd5cDpleHRlcm5hbF9yYXN0ZXJpemVyJywKICAgICAnc2JfZW5hYmxlX2xpYic6IDEsCisgICAgJ2VuYWJsZV9tYXBfdG9fbWVzaCc6IDEsCiAgICAgJ2FuZ2xlX2J1aWxkX3dpbnJ0JzogMCwKICAgICAnd2lucnQnOiAwLAogICAgICdlbmFibGVfZDNkMTFfZmVhdHVyZV9sZXZlbF8xMSc6IDEsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3dpbi9saWIvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cCBiL3NyYy9zdGFyYm9hcmQvd2luL2xpYi9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCmluZGV4IDA0ZmQ3MTYuLjk4NmQ4YjYgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvd2luL2xpYi9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCisrKyBiL3NyYy9zdGFyYm9hcmQvd2luL2xpYi9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCkBAIC0zMiwxMCArMzIsMTAgQEAKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9zeXN0ZW1fcmVxdWVzdF9zdXNwZW5kLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9zeXN0ZW1fcmVxdWVzdF91bnBhdXNlLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9zeXN0ZW1fcmVxdWVzdF91bnBhdXNlLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGVjb2RlX3RhcmdldF9nZXRfaW5mby5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfcmVsZWFzZS5jYycsCiAgICAgICAnPEAodXdwX2luY29tcGF0aWJsZV93aW4zMiknLAotICAgICAgJzxAKHN0dWJfbWVkaWFfcGxheWVyKScKKyAgICAgICc8QCh3aW4zMl9tZWRpYV9wbGF5ZXJfZmlsZXMpJywKKyAgICAgICc8QCh3aW4zMl9zaGFyZWRfZHJtX2ZpbGVzKScsCisgICAgICAnPEAod2luMzJfc2hhcmVkX21lZGlhX3BsYXllcl9maWxlcyknLAogICAgIF0sCiAgIH0sCiB9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3dpbi9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvd2luL3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCmluZGV4IDViY2YwNzcuLjEzOGNhNDEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvd2luL3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCisrKyBiL3NyYy9zdGFyYm9hcmQvd2luL3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCkBAIC0zNDcsMjcgKzM0Nyw2IEBACiAvLyBzdXBwb3J0ZWQgY29tcG9zaXRpb24gbWV0aG9kcyBiZWxvdy4KICNkZWZpbmUgU0JfSEFTX1BMQVlFUiAxCiAKLSNpZiBTQl9BUElfVkVSU0lPTiA8IDQKLS8vIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgcGxhdGZvcm0ncyBwbGF5ZXIgd2lsbCBwcm9kdWNlIGFuIE9wZW5HTCB0ZXh0dXJlIHRoYXQKLS8vIHRoZSBjbGllbnQgbXVzdCBkcmF3IGV2ZXJ5IGZyYW1lIHdpdGggaXRzIGdyYXBoaWNzIHJlbmRlcmluZy4gSXQgbWF5IGJlIHRoYXQKLS8vIHdlIGdldCBhIHRleHR1cmUgaGFuZGxlLCBidXQgY2Fubm90IHBlcmZvcm0gb3BlcmF0aW9ucyBsaWtlIEdsUmVhZFBpeGVscyBvbgotLy8gaXQgaWYgaXQgaXMgRFJNLXByb3RlY3RlZC4KLSNkZWZpbmUgU0JfSVNfUExBWUVSX1BST0RVQ0lOR19URVhUVVJFIDAKLQotLy8gU3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBwbGF0Zm9ybSdzIHBsYXllciBpcyBjb21wb3NpdGVkIHdpdGggYSBmb3JtYWwKLS8vIGNvbXBvc2l0b3IsIHdoZXJlIHRoZSBjbGllbnQgbXVzdCBzcGVjaWZ5IGhvdyB2aWRlbyBpcyB0byBiZSBjb21wb3NpdGVkIGludG8KLS8vIHRoZSBncmFwaGljYWxzIHNjZW5lLgotI2RlZmluZSBTQl9JU19QTEFZRVJfQ09NUE9TSVRFRCAwCi0KLS8vIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgcGxhdGZvcm0ncyBwbGF5ZXIgdXNlcyBhICJwdW5jaC1vdXQiIG1vZGVsLCB3aGVyZQotLy8gdmlkZW8gaXMgcmVuZGVyZWQgdG8gdGhlIGZhciBiYWNrZ3JvdW5kLCBhbmQgdGhlIGdyYXBoaWNzIHBsYW5lIGlzCi0vLyBhdXRvbWF0aWNhbGx5IGNvbXBvc2l0ZWQgb24gdG9wIG9mIHRoZSB2aWRlbyBieSB0aGUgcGxhdGZvcm0uIFRoZSBjbGllbnQgbXVzdAotLy8gcHVuY2ggYW4gYWxwaGEgaG9sZSBvdXQgb2YgdGhlIGdyYXBoaWNzIHBsYW5lIGZvciB2aWRlbyB0byBzaG93IHRocm91Z2guICBJbgotLy8gdGhpcyBjYXNlLCBjaGFuZ2luZyB0aGUgdmlkZW8gYm91bmRzIG11c3QgYmUgdGlnaHRseSBzeW5jaHJvbml6ZWQgYmV0d2VlbiB0aGUKLS8vIHBsYXllciBhbmQgdGhlIGdyYXBoaWNzIHBsYW5lLgotI2RlZmluZSBTQl9JU19QTEFZRVJfUFVOQ0hFRF9PVVQgMQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IDQKLQogLy8gQWZ0ZXIgYSBzZWVrIGlzIHRyaWdnZXJyZWQsIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGFwcGVuZCB2aWRlbyBmcmFtZXMKIC8vIGZyb20gdGhlIGxhc3Qga2V5IGZyYW1lIGJlZm9yZSB0aGUgc2VlayB0aW1lIGFuZCBhcHBlbmQgYXVkaW8gZnJhbWVzIGZyb20gdGhlCiAvLyBzZWVrIHRpbWUgYmVjYXVzZSB1c3VhbGx5IGFsbCBhdWRpbyBmcmFtZXMgYXJlIGtleSBmcmFtZXMuICBPbiBwbGF0Zm9ybXMgdGhhdApAQCAtMzgxLDggKzM2MCw2IEBACiAvLyBub3QgYXZhaWxhYmxlIHNob3VsZCBkZWZpbmUgdGhlIGZvbGxvd2luZyBxdWlyay4KICN1bmRlZiBTQl9IQVNfUVVJUktfTk9fRkZTCiAKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA0Ci0KIC8vIFRoZSBtYXhpbXVtIGF1ZGlvIGJpdHJhdGUgdGhlIHBsYXRmb3JtIGNhbiBkZWNvZGUuICBUaGUgZm9sbG93aW5nIHZhbHVlCiAvLyBlcXVhbHMgdG8gNU0gYnl0ZXMgcGVyIHNlY29uZHMgd2hpY2ggaXMgbW9yZSB0aGFuIGVub3VnaCBmb3IgY29tcHJlc3NlZAogLy8gYXVkaW8uCkBAIC0zOTMsOCArMzcwLDYgQEAKIC8vIHZpZGVvLgogI2RlZmluZSBTQl9NRURJQV9NQVhfVklERU9fQklUUkFURV9JTl9CSVRTX1BFUl9TRUNPTkQgKDIwMCAqIDEwMjQgKiAxMDI0KQogCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDQKLQogLy8gU3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBoYXMgd2VibS92cDkgc3VwcG9ydC4gIFRoaXMgc2hvdWxkIGJlIHNldCB0bwogLy8gbm9uLXplcm8gb24gcGxhdGZvcm1zIHdpdGggd2VibS92cDkgc3VwcG9ydC4KICNkZWZpbmUgU0JfSEFTX01FRElBX1dFQk1fVlA5X1NVUFBPUlQgMApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC93aW4vc2hhcmVkL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpIGIvc3JjL3N0YXJib2FyZC93aW4vc2hhcmVkL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpCmluZGV4IDZhMjBiNDYuLjQyZGFjYzkgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvd2luL3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaQorKysgYi9zcmMvc3RhcmJvYXJkL3dpbi9zaGFyZWQvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cGkKQEAgLTI0NywxMyArMjQ3LDYgQEAKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9pbWFnZV9kZWNvZGUuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2ltYWdlX2lzX2RlY29kZV9zdXBwb3J0ZWQuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL21lZGlhX3NldF9vdXRwdXRfcHJvdGVjdGlvbi5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvbWljcm9waG9uZV9jbG9zZS5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvbWljcm9waG9uZV9jcmVhdGUuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL21pY3JvcGhvbmVfZGVzdHJveS5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvbWljcm9waG9uZV9nZXRfYXZhaWxhYmxlLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9taWNyb3Bob25lX2lzX3NhbXBsZV9yYXRlX3N1cHBvcnRlZC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvbWljcm9waG9uZV9vcGVuLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9taWNyb3Bob25lX3JlYWQuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3N5c3RlbV9nZXRfc3RhY2suY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3N5c3RlbV9nZXRfdG90YWxfZ3B1X21lbW9yeS5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3lzdGVtX2dldF91c2VkX2dwdV9tZW1vcnkuY2MnLApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC93aW4vd2luMzIvbGliL3N0YXJib2FyZF9wbGF0Zm9ybS5neXAgYi9zcmMvc3RhcmJvYXJkL3dpbi93aW4zMi9saWIvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cAppbmRleCA3MjE2MDE3Li41MjA2M2JiIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3dpbi93aW4zMi9saWIvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cAorKysgYi9zcmMvc3RhcmJvYXJkL3dpbi93aW4zMi9saWIvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cApAQCAtMTgsNiArMTgsOSBAQAogICAndmFyaWFibGVzJzogewogICAgICdzdGFyYm9hcmRfcGxhdGZvcm1fZGVwZW5kZW50X2ZpbGVzJzogWwogICAgICAgJzxAKGJhc2Vfd2luMzJfc3RhcmJvYXJkX3BsYXRmb3JtX2RlcGVuZGVudF9maWxlcyknLAorICAgICAgJzxAKHdpbjMyX21lZGlhX3BsYXllcl9maWxlcyknLAorICAgICAgJzxAKHdpbjMyX3NoYXJlZF9kcm1fZmlsZXMpJywKKyAgICAgICc8QCh3aW4zMl9zaGFyZWRfbWVkaWFfcGxheWVyX2ZpbGVzKScsCiAgICAgXQogICB9LAogfQo=